From b5bcbb92bf8ce5e956bbc077e9a6f64805d6e75f Mon Sep 17 00:00:00 2001 From: WBH <48749219+wbh1328551759@users.noreply.github.com> Date: Wed, 23 Jul 2025 19:35:54 +0800 Subject: [PATCH 01/45] update README and fix GitHub Actions --- .github/workflows/pr-check.yml | 2 +- README.md | 19 +++++++++++++++---- examples/with-vite/src/App.tsx | 2 +- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/.github/workflows/pr-check.yml b/.github/workflows/pr-check.yml index c5b987c..7d09b33 100644 --- a/.github/workflows/pr-check.yml +++ b/.github/workflows/pr-check.yml @@ -4,7 +4,7 @@ on: pull_request: branches: [main, develop] push: - branches: [main, develop] + branches: [develop] concurrency: group: ${{ github.workflow }}-${{ github.ref }} diff --git a/README.md b/README.md index 7900a7b..10b3b15 100644 --- a/README.md +++ b/README.md @@ -81,7 +81,7 @@ npm install @luno-kit/react @tanstack/react-query ```tsx import { LunoKitProvider, ConnectButton } from '@luno-kit/ui' import { createConfig, defineChain, kusama, polkadot, polkadotjs, subwallet, westend, paseo } from '@luno-kit/react' -import '@luno-kit/ui/dist/styles.css' +import '@luno-kit/ui/styles.css' const config = createConfig({ appName: 'My Luno App', @@ -162,8 +162,10 @@ For full documentation and examples, visit [our documentation site](#) (coming s The following examples are provided in the `examples` folder: * `with-vite` - Vite integration (✅ Ready to run) -* `with-next` - Next.js integration (coming soon) -* `with-cra` - Create React App integration (coming soon) +* `with-nextjs-app` - Next.js App Router integration (✅ Ready to run) +* `with-nextjs-pages` - Next.js Pages Router integration (✅ Ready to run) +* `with-cra` - Create React App integration (✅ Ready to run) +* `with-remix` - Remix integration (coming soon) ### Running examples @@ -176,8 +178,17 @@ cd LunoKit # Install dependencies pnpm install -# Start with-vite server +# Start with-vite example pnpm --filter with-vite dev + +# Start with-nextjs-app example +pnpm --filter with-nextjs-app dev + +# Start with-nextjs-pages example +pnpm --filter with-nextjs-pages dev + +# Start with-cra example +pnpm --filter with-cra start ``` ## API Reference diff --git a/examples/with-vite/src/App.tsx b/examples/with-vite/src/App.tsx index 46927f2..7216937 100644 --- a/examples/with-vite/src/App.tsx +++ b/examples/with-vite/src/App.tsx @@ -392,7 +392,7 @@ const App: React.FC = () => {

Basic Usage

{`import { LunoKitProvider, ConnectButton } from '@luno-kit/ui';
-import '@luno-kit/ui/dist/styles.css';
+import '@luno-kit/ui/styles.css';
 
 
   

From 51c7cfda037381bf03836f2a120f4537e96be1f7 Mon Sep 17 00:00:00 2001
From: WBH <48749219+wbh1328551759@users.noreply.github.com>
Date: Tue, 29 Jul 2025 20:25:46 +0800
Subject: [PATCH 02/45] Chore/UI work (#24)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

* fix(ui): resolve Radix UI Dialog TypeScript errors

- Add proper type interfaces for Dialog components
- Fix ModalContext missing closeConnectModal method
- Handle @tanstack/react-query v5 API changes
- Use React.createElement to bypass Radix UI type restrictions

* feat(ui): add new theme system with light/dark presets and CSS variables

* fix: resolve chain modal issues and optimize theme system

* feat: save current theme system state before refactoring

* fix: resolve UI build issues and restore theme system

- Fix base.css theme syntax to use @theme inline with var() instead of theme()
- Restore missing dark theme variables (spacing, typography, fonts, radii, blurs)
- Update theme context structure and remove defaultTheme.ts
- Update LunoKitProvider to use new theme system
- Fix PostCSS configuration for Tailwind CSS v4

* feat: remove toggleTheme and add auto system theme following

- Remove toggleTheme function from ThemeProvider
- Add useSystemTheme hook to detect system color scheme
- Add auto-following system theme when both light and dark are provided
- Add isAutoMode flag to indicate auto-following state
- Update example app to use setThemeMode instead of toggleTheme
- Maintain backward compatibility with existing theme system

* feat: optimize theme persistence logic - only persist when user has theme choice

* fix: remove defaultTheme from LunoKitProvider to match ThemeProvider interface

* feat(theme): remove localStorage persistence and fix dark theme logic

- Remove theme localStorage persistence
- Fix dark theme not applying with theme={{dark:{}}}
- Simplify theme initialization and switching logic

* refactor(ui): standardize design      │
│   tokens and remove style duplicates

* feat(ui): Modify the rounded property of some components.

* refactor(AccountDetailsModal): simplify view transitions
   to height-only animation

* refactor(ui):Optimize code structure, remove unused code

* feat(theme): enhance theme
  system with auto-mode and user
  preferences

  - Add autoMode support for
  system theme following
  - Implement localStorage
  persistence for user choices
  - Add setThemeChoice API for
  explicit user actions
  - Remove unused dependencies
  (postcss-import)
  - Clean up redundant size props
   and methods
  - Fix hook functionality and
  simplify API
  - Improve theme initialization
  priority logic

* refactor(ui): replace localStorage with
  config.storage in theme system

* refactor(theme): optimize theme system
  and eliminate flashing

  - Extract CSS variable injection logic to
   separate file (cssVariableInject.ts)
  - Optimize initial theme state
  calculation to prevent flashing
  - Simplify theme preference interface
  (isAuto, preferredTheme)
  - Fix system theme detection with proper
  initialization
  - Remove redundant state management and
  async loading

* refactor(theme): replace LunoStorage with localStorage for theme persistence

* feat(examples): Remove auto mode label

---------

Co-authored-by: “Gintma” 
---
 examples/with-vite/src/App.tsx                |  28 +-
 examples/with-vite/src/main.tsx               | 161 ++++++++-
 packages/ui/package.json                      |   2 +-
 packages/ui/postcss.config.mjs                |   2 +-
 .../AccountDetailsModal/MainView.tsx          |  18 +-
 .../AccountDetailsModal/SwitchAccountView.tsx |  22 +-
 .../AccountDetailsModal/SwitchChainView.tsx   |   2 +-
 .../components/AccountDetailsModal/index.tsx  |  96 ++++--
 .../ui/src/components/ChainIcon/index.tsx     |  57 ++--
 .../ui/src/components/ChainList/index.tsx     |  26 +-
 .../ui/src/components/ChainModal/index.tsx    |  29 +-
 .../ui/src/components/ChainSelector/index.tsx |  26 --
 .../ui/src/components/ConnectButton/index.tsx |  59 +---
 .../ui/src/components/ConnectModal/index.tsx  |  50 ++-
 packages/ui/src/components/Copy/index.tsx     |   2 +-
 packages/ui/src/components/Dialog/index.tsx   |  35 +-
 .../src/components/SpiralAnimation/index.tsx  |   2 +-
 packages/ui/src/hooks/cssVariableInject.ts    | 135 ++++++++
 packages/ui/src/providers/LunoKitProvider.tsx |  26 +-
 packages/ui/src/providers/ModalContext.tsx    |   1 +
 packages/ui/src/providers/ThemeContext.tsx    |  63 ----
 packages/ui/src/providers/index.ts            |   3 +-
 packages/ui/src/styles/base.css               | 321 ++++++++++++------
 packages/ui/src/theme/context.tsx             | 194 +++++++++++
 packages/ui/src/theme/index.ts                |   2 +
 packages/ui/src/theme/types.ts                | 104 ++++++
 packages/ui/src/utils/cs.ts                   |   8 +-
 pnpm-lock.yaml                                |   2 +-
 28 files changed, 1069 insertions(+), 407 deletions(-)
 delete mode 100644 packages/ui/src/components/ChainSelector/index.tsx
 create mode 100644 packages/ui/src/hooks/cssVariableInject.ts
 delete mode 100644 packages/ui/src/providers/ThemeContext.tsx
 create mode 100644 packages/ui/src/theme/context.tsx
 create mode 100644 packages/ui/src/theme/index.ts
 create mode 100644 packages/ui/src/theme/types.ts

diff --git a/examples/with-vite/src/App.tsx b/examples/with-vite/src/App.tsx
index 7216937..0d6c468 100644
--- a/examples/with-vite/src/App.tsx
+++ b/examples/with-vite/src/App.tsx
@@ -31,7 +31,7 @@ const App: React.FC = () => {
   const { sendTransactionAsync, data: sendTransactionData, isPending: isSendingTransaction, detailedStatus } = useSendTransaction();
   const { api, isApiReady, apiError } = useApi();
 
-  const { themeMode, toggleTheme } = useLunoTheme();
+  const { themeMode, setThemeChoice } = useLunoTheme();
 
   const [transferForm, setTransferForm] = useState({
     to: '',
@@ -137,12 +137,26 @@ const App: React.FC = () => {
                       Current Theme:
                       {themeMode.charAt(0).toUpperCase() + themeMode.slice(1)}
                     
- +
+ + + +
diff --git a/examples/with-vite/src/main.tsx b/examples/with-vite/src/main.tsx index 67c1551..c63e46d 100644 --- a/examples/with-vite/src/main.tsx +++ b/examples/with-vite/src/main.tsx @@ -22,8 +22,167 @@ const lunoConfig = createConfig({ autoConnect: true, }); + + createRoot(document.getElementById('root')!).render( - + diff --git a/packages/ui/package.json b/packages/ui/package.json index 09e40f8..3d39e35 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -78,4 +78,4 @@ "publishConfig": { "access": "public" } -} +} \ No newline at end of file diff --git a/packages/ui/postcss.config.mjs b/packages/ui/postcss.config.mjs index 7e0ba62..b776c62 100644 --- a/packages/ui/postcss.config.mjs +++ b/packages/ui/postcss.config.mjs @@ -2,4 +2,4 @@ export default { plugins: { "@tailwindcss/postcss": {}, } -} +} \ No newline at end of file diff --git a/packages/ui/src/components/AccountDetailsModal/MainView.tsx b/packages/ui/src/components/AccountDetailsModal/MainView.tsx index bf951a4..8706967 100644 --- a/packages/ui/src/components/AccountDetailsModal/MainView.tsx +++ b/packages/ui/src/components/AccountDetailsModal/MainView.tsx @@ -24,13 +24,13 @@ export const MainView: React.FC = ({ key: 'Chain Name', content: (
-
+
- {chain?.name || 'Polkadot'} + {chain?.name || 'Polkadot'}
@@ -45,7 +45,7 @@ export const MainView: React.FC = ({ content: ( <> - View on Explorer + View on Explorer ), onClick: () => window.open(getExplorerUrl(chain?.blockExplorers?.default?.url!, address, 'address')) @@ -55,7 +55,7 @@ export const MainView: React.FC = ({ content: ( <> - Switch Account + Switch Account ), onClick: () => onViewChange(AccountModalView.switchAccount) @@ -69,8 +69,8 @@ export const MainView: React.FC = ({ }; return ( -
-
+
+
{items.map(i => ( {i.content} @@ -80,7 +80,7 @@ export const MainView: React.FC = ({ - Disconnect + Disconnect
); @@ -92,8 +92,8 @@ const SelectItem = ({ children, onClick }: { children: React.ReactNode; onClick? type="button" onClick={() => onClick?.()} className={cs( - 'w-full p-[14px] rounded-sm border-none text-left flex items-center gap-[8px] font-[500]', - 'bg-[var(--color-connectorItemBackground)] hover:bg-[var(--color-connectorItemHover)] active:bg-[var(--color-connectorItemActive)]', + 'w-full p-3.5 rounded-accountActionItem border-none text-left flex items-center gap-2 font-medium', + 'bg-accountActionItemBackground hover:bg-accountActionItemBackgroundHover', 'transition-colors duration-200', onClick ? 'cursor-pointer' : 'cursor-auto' )} diff --git a/packages/ui/src/components/AccountDetailsModal/SwitchAccountView.tsx b/packages/ui/src/components/AccountDetailsModal/SwitchAccountView.tsx index c506b01..031c151 100644 --- a/packages/ui/src/components/AccountDetailsModal/SwitchAccountView.tsx +++ b/packages/ui/src/components/AccountDetailsModal/SwitchAccountView.tsx @@ -22,7 +22,7 @@ export const SwitchAccountView: ViewComponent = ({ onBack }) => { }, [onBack]) return ( -
+
{accounts.map((acc) => ( = React.memo(({ type="button" onClick={() => selectAccount(account)} className={cs( - 'px-[14px] py-[10px] w-full rounded-sm border-none', - 'bg-[var(--color-connectorItemBackground)]', - 'text-left flex items-center justify-between gap-[8px]', + 'px-3.5 py-2.5 w-full rounded-accountSelectItem border-none', + 'bg-accountSelectItemBackground', + 'text-left flex items-center justify-between gap-2', 'transition-colors duration-200', - isSelected ? 'cursor-auto' : 'cursor-pointer hover:bg-[var(--color-connectorItemHover)] active:bg-[var(--color-connectorItemActive)]' + isSelected ? 'cursor-auto' : 'cursor-pointer hover:bg-accountSelectItemBackgroundHover' )} aria-label={account.name || address} disabled={isSelected} > -
+
{connector?.icon && luno account}
- + {account.name || formatAddress(address)} - + {balance === undefined ? ( -
+
) : ( <> {balance?.formattedTransferable || '0.00'} {chain?.nativeCurrency?.symbol || 'DOT'} @@ -88,8 +88,8 @@ const AccountItem: React.FC = React.memo(({
{isSelected && ( -
-
+
+
)} diff --git a/packages/ui/src/components/AccountDetailsModal/SwitchChainView.tsx b/packages/ui/src/components/AccountDetailsModal/SwitchChainView.tsx index 866e12b..73b9714 100644 --- a/packages/ui/src/components/AccountDetailsModal/SwitchChainView.tsx +++ b/packages/ui/src/components/AccountDetailsModal/SwitchChainView.tsx @@ -11,7 +11,7 @@ interface SwitchChainViewProps { export const SwitchChainView: ViewComponent = ({ onBack }) => { return ( -
+
) diff --git a/packages/ui/src/components/AccountDetailsModal/index.tsx b/packages/ui/src/components/AccountDetailsModal/index.tsx index 13d1376..fedb024 100644 --- a/packages/ui/src/components/AccountDetailsModal/index.tsx +++ b/packages/ui/src/components/AccountDetailsModal/index.tsx @@ -1,4 +1,4 @@ -import React, { useCallback, useMemo, useState } from 'react'; +import React, { useCallback, useMemo, useState, useRef } from 'react'; import { useAccount, useActiveConnector, useBalance, useChain } from '@luno-kit/react'; import { Dialog, DialogClose, DialogTitle } from '../Dialog'; import { cs } from '../../utils'; @@ -24,23 +24,59 @@ export const AccountDetailsModal: React.FC = () => { const activeConnector = useActiveConnector() const [currentView, setCurrentView] = useState(AccountModalView.main); + const [isAnimating, setIsAnimating] = useState(false); + const containerRef = useRef(null); + const currentViewRef = useRef(null); const handleViewChange = useCallback((view: AccountModalView) => { + if (view === currentView || isAnimating) return; + + setIsAnimating(true); + + if (!containerRef.current) { + setCurrentView(view); + setIsAnimating(false); + return; + } + + const container = containerRef.current; + const currentHeight = container.offsetHeight; + setCurrentView(view); - }, []); + + // Wait for React to render new content, then animate height + requestAnimationFrame(() => { + if (!container || !currentViewRef.current) { + setIsAnimating(false); + return; + } + + const newHeight = currentViewRef.current.offsetHeight; + + container.animate([ + { height: currentHeight + 'px' }, + { height: newHeight + 'px' } + ], { + duration: 200, + easing: 'ease-out', + fill: 'forwards' + }).addEventListener('finish', () => { + setIsAnimating(false); + }); + }); + }, [currentView, isAnimating]); const handleModalClose = useCallback(() => { close(); setCurrentView(AccountModalView.main); + setIsAnimating(false); }, [close]); + const viewTitle = useMemo(() => { - const titleMap = { - [AccountModalView.switchAccount]: SwitchAccountView.title, - [AccountModalView.switchChain]: SwitchChainView.title, - [AccountModalView.main]: null - }; - return titleMap[currentView]; + if (currentView === AccountModalView.switchAccount) return 'Switch Account'; + if (currentView === AccountModalView.switchChain) return SwitchChainView.title; + return null; }, [currentView]); const viewComponents = useMemo(() => ({ @@ -58,6 +94,7 @@ export const AccountDetailsModal: React.FC = () => { ) }), [handleViewChange, handleModalClose]); + return ( { }} >
{currentView === AccountModalView.main ? ( -
+
{activeConnector?.icon && (
)} -
+
Account Details -
- +
+ {formatAddress(address)}
-
+
{balance === undefined ? ( -
+
) : ( <> {balance?.formattedTransferable || '0.00'} {chain?.nativeCurrency?.symbol || 'DOT'} @@ -102,37 +140,31 @@ export const AccountDetailsModal: React.FC = () => { ) : ( <> + className="text-lg leading-lg text-modalText font-semibold transition-opacity duration-300"> {viewTitle} )} - +
-
- {Object.entries(viewComponents).map(([view, component]) => ( -
- {component} -
- ))} +
+
+ {viewComponents[currentView]} +
diff --git a/packages/ui/src/components/ChainIcon/index.tsx b/packages/ui/src/components/ChainIcon/index.tsx index 78abe63..401bac3 100644 --- a/packages/ui/src/components/ChainIcon/index.tsx +++ b/packages/ui/src/components/ChainIcon/index.tsx @@ -1,33 +1,34 @@ -import React from 'react' -import { cs } from '../../utils' +import React from 'react'; +import { cs } from '../../utils'; -interface ChainIconProps { - className?: string - chainIconUrl?: string - chainName?: string - iconClassName?: string +export interface ChainIconProps { + chainIconUrl?: string; + chainName?: string; + className?: string; } -export const ChainIcon: React.FC = ({ className, chainIconUrl, chainName, iconClassName }) => { +export const ChainIcon: React.FC = ({ + chainIconUrl, + chainName, + className, +}) => { + if (chainIconUrl) { + return ( + {chainName + ); + } + return ( -
- {chainIconUrl - ? ({`${chainName}) - : - {chainName?.split('')[0]} - } +
+ {chainName ? chainName.charAt(0).toUpperCase() : 'C'}
- ) -} + ); +}; diff --git a/packages/ui/src/components/ChainList/index.tsx b/packages/ui/src/components/ChainList/index.tsx index 60f248a..d5213c1 100644 --- a/packages/ui/src/components/ChainList/index.tsx +++ b/packages/ui/src/components/ChainList/index.tsx @@ -59,16 +59,16 @@ export const ChainList: React.FC = ({ onChainSwitched }: ChainLi return ( <> -
+
{FILTER_TABS.map(tab => (
-
+
{filteredChains.map(chain => ( = ({ onChainSwitched }: ChainLi {filteredChains.length === 0 && (
- + No {activeFilter === ChainFilter.all ? 'chains' : activeFilter.toLowerCase()} available
@@ -117,17 +117,17 @@ const ChainItem: React.FC = React.memo(({ onClick={() => onSelect(chain)} disabled={isSelected || isLoading} className={cs( - 'flex items-center justify-between p-[8px] rounded-sm', - 'bg-[var(--color-connectorItemBackground)]', + 'flex items-center justify-between p-2 rounded-sm', + 'bg-networkSelectItemBackground', 'transition-colors duration-200', (isSelected || isLoading) ? 'cursor-default' - : 'cursor-pointer hover:bg-[var(--color-connectorItemHover)] active:bg-[var(--color-connectorItemActive)]', + : 'cursor-pointer hover:bg-networkSelectItemBackgroundHover', isLoading && 'opacity-80' )} > -
+
= React.memo(({ />
- + {chain.name}
@@ -146,9 +146,9 @@ const ChainItem: React.FC = React.memo(({ ? isLoading ? ( <> - Switching + Switching diff --git a/packages/ui/src/components/ChainModal/index.tsx b/packages/ui/src/components/ChainModal/index.tsx index d874e46..688aca2 100644 --- a/packages/ui/src/components/ChainModal/index.tsx +++ b/packages/ui/src/components/ChainModal/index.tsx @@ -1,17 +1,28 @@ import React from 'react'; -import { Dialog } from '../Dialog'; +import { Dialog, DialogTitle, DialogClose } from '../Dialog'; +import { ChainList } from '../ChainList'; +import { Close } from '../../assets/icons'; import { useChainModal } from '../../providers/ModalContext'; -import { ChainSelector } from '../ChainSelector' -export const ChainModal: React.FC = () => { +export interface ChainModalProps {} + +export const ChainModal: React.FC = () => { const { isOpen, close } = useChainModal(); + return ( - !open && close()} - > -
- + !open && close()}> +
+
+
{/* Placeholder to keep title centered */} + + Select Network + + + + +
+ +
); diff --git a/packages/ui/src/components/ChainSelector/index.tsx b/packages/ui/src/components/ChainSelector/index.tsx deleted file mode 100644 index 87f6493..0000000 --- a/packages/ui/src/components/ChainSelector/index.tsx +++ /dev/null @@ -1,26 +0,0 @@ -import { DialogClose, DialogTitle } from '../Dialog' -import { Close } from '../../assets/icons' -import React from 'react' -import { ChainList } from '../ChainList' - -interface ChainSelectorProps { - onClose: () => void -} - -export const ChainSelector: React.FC = ({ onClose }: ChainSelectorProps) => { - return ( - <> -
-
- - Select Networks - - - - -
- - - - ) -} diff --git a/packages/ui/src/components/ConnectButton/index.tsx b/packages/ui/src/components/ConnectButton/index.tsx index 041c4cb..d6aed55 100644 --- a/packages/ui/src/components/ConnectButton/index.tsx +++ b/packages/ui/src/components/ConnectButton/index.tsx @@ -3,37 +3,10 @@ import { useLunoWallet } from '../../hooks'; import { cs } from '../../utils'; import {ChainIcon} from '../ChainIcon' -const sizes: Record<'sm' | 'md' | 'lg', Record> = { - sm: { - button: 'px-2.5 text-sm leading-sm min-h-[36px]', - connected: 'text-sm leading-sm gap-[10px]', - icon: 'w-[20px] h-[20px]', - chain: 'py-[6px] px-6 gap-[4px]', - account: 'py-[4px] px-2.5 gap-[4px]', - balance: 'p-[6px] pl-[10px]', - }, - md: { - button: 'px-3.5 text-primary leading-primary min-h-[40px]', - connected: 'text-primary leading-primary gap-[12px]', - icon: 'w-[24px] h-[24px]', - chain: 'py-[8px] px-2.5 gap-[6px]', - account: 'py-[6px] px-2 gap-[6px]', - balance: 'p-[8px] pl-[12px]', - }, - lg: { - button: 'px-4.5 text-title leading-title min-h-[46px]' , - connected: 'text-title leading-title gap-[14px]', - icon: 'w-[28px] h-[28px]', - chain: 'py-[10px] px-3 gap-[8px]', - account: 'py-[8px] px-2.5 gap-[8px]', - balance: 'p-[10px] pl-[14px]', - }, -}; export const transitionClassName = 'transition-transform transition-[125] hover:scale-[1.03] transition-ease' export interface ConnectButtonProps { - size?: 'sm' | 'md' | 'lg'; className?: string; label?: string; accountStatus?: 'full' | 'address'; @@ -42,7 +15,6 @@ export interface ConnectButtonProps { } export const ConnectButton: React.FC = ({ - size = 'md', className, label = 'Connect Wallet', accountStatus = 'full', @@ -69,10 +41,11 @@ export const ConnectButton: React.FC = ({ type="button" onClick={() => openConnectModal?.()} className={cs( - 'cursor-pointer font-[600] inline-flex items-center justify-center border border-transparent rounded-sm focus:outline-none', - 'text-primaryFont bg-connectButtonBackground shadow-connectButton active:scale-[0.95]', + 'cursor-pointer font-semibold inline-flex items-center justify-center focus:outline-none', + 'text-connectButtonText bg-connectButtonBackground shadow-button active:scale-[0.95]', + 'rounded-connectButton', transitionClassName, - sizes[size].button, + 'px-3.5 text-base leading-base min-h-[40px]', className )} > @@ -81,24 +54,22 @@ export const ConnectButton: React.FC = ({ ); } - const sizeConfig = sizes[size]; - return ( -
+
{chainStatus !== 'none' && ( ); }); diff --git a/packages/ui/src/components/Copy/index.tsx b/packages/ui/src/components/Copy/index.tsx index d9126f2..779cb82 100644 --- a/packages/ui/src/components/Copy/index.tsx +++ b/packages/ui/src/components/Copy/index.tsx @@ -32,7 +32,7 @@ export const Copy: React.FC = ({ copyText }) => { disabled={isCopied} > {isCopied - ? + ? : } ) diff --git a/packages/ui/src/components/Dialog/index.tsx b/packages/ui/src/components/Dialog/index.tsx index 9b53363..c1573c3 100644 --- a/packages/ui/src/components/Dialog/index.tsx +++ b/packages/ui/src/components/Dialog/index.tsx @@ -13,6 +13,17 @@ interface DialogProps { overlayClassName?: string; } +interface DialogTitleProps { + children: ReactNode; + className?: string; +} + +interface DialogCloseProps { + children: ReactNode; + className?: string; + onClick?: () => void; +} + const DialogRoot: React.FC = ({ open, onOpenChange, @@ -23,17 +34,17 @@ const DialogRoot: React.FC = ({ return ( - + ) + })} = ({ ); }; +const DialogTitleWrapper: React.FC = ({ children, className }) => + React.createElement(DialogPrimitive.Title as any, { className }, children); + +const DialogCloseWrapper: React.FC = ({ children, className, onClick }) => + React.createElement(DialogPrimitive.Close as any, { className, onClick }, children); + export const Dialog = DialogRoot; -export const DialogClose = DialogPrimitive.Close; -export const DialogTitle = DialogPrimitive.Title; +export const DialogClose = DialogCloseWrapper; +export const DialogTitle = DialogTitleWrapper; -export type { DialogProps }; +export type { DialogProps, DialogTitleProps, DialogCloseProps }; diff --git a/packages/ui/src/components/SpiralAnimation/index.tsx b/packages/ui/src/components/SpiralAnimation/index.tsx index 81ec302..c22f5dc 100644 --- a/packages/ui/src/components/SpiralAnimation/index.tsx +++ b/packages/ui/src/components/SpiralAnimation/index.tsx @@ -80,7 +80,7 @@ export const SpiralAnimation: React.FC = ({ return (
); }; diff --git a/packages/ui/src/hooks/cssVariableInject.ts b/packages/ui/src/hooks/cssVariableInject.ts new file mode 100644 index 0000000..d6916a4 --- /dev/null +++ b/packages/ui/src/hooks/cssVariableInject.ts @@ -0,0 +1,135 @@ +import { useEffect } from 'react'; +import type { LunokitTheme, PartialLunokitTheme, ThemeMode } from '../theme/types'; + +// All theme variable names for cleanup +const ALL_THEME_VARS = [ + '--color-accentColor', '--color-walletSelectItemBackground', '--color-walletSelectItemBackgroundHover', '--color-walletSelectItemText', + '--color-connectButtonBackground', '--color-connectButtonInnerBackground', '--color-connectButtonText', + '--color-accountActionItemBackground', '--color-accountActionItemBackgroundHover', '--color-accountActionItemText', + '--color-accountSelectItemBackground', '--color-accountSelectItemBackgroundHover', '--color-accountSelectItemText', + '--color-currentNetworkButtonBackground', '--color-currentNetworkButtonText', + '--color-networkSelectItemBackground', '--color-networkSelectItemBackgroundHover', '--color-networkSelectItemText', + '--color-navigationButtonBackground', '--color-separatorLine', + '--color-modalBackground', '--color-modalBackdrop', '--color-modalBorder', '--color-modalText', '--color-modalTextSecondary', + '--color-modalControlButtonBackgroundHover', '--color-modalControlButtonText', + '--color-success', '--color-successForeground', '--color-warning', '--color-warningForeground', + '--color-error', '--color-errorForeground', '--color-info', '--color-infoForeground', '--color-skeleton', + '--font-body', '--font-heading', '--font-mono', + '--radius-walletSelectItem', '--radius-connectButton', '--radius-modalControlButton', '--radius-accountActionItem', + '--radius-accountSelectItem', '--radius-currentNetworkButton', '--radius-networkSelectItem', '--radius-modal', + '--shadow-button', '--shadow-modal', + '--blur-modalOverlay', +]; + +interface ThemeInfo { + type: 'default' | 'complete' | 'partial'; + completeTheme: LunokitTheme | null; + partialOverrides: PartialLunokitTheme | null; +} + +export const useCSSVariableInjection = (themeInfo: ThemeInfo, themeMode: ThemeMode) => { + useEffect(() => { + if (typeof window === 'undefined') return; + + const root = document.documentElement; + + if (themeInfo.type === 'complete' && themeInfo.completeTheme) { + // Complete custom theme: inject all variables and remove data-theme + Object.entries(themeInfo.completeTheme.colors).forEach(([key, value]) => { + if (value) { + root.style.setProperty(`--color-${key}`, value); + } + }); + + Object.entries(themeInfo.completeTheme.fonts).forEach(([key, value]) => { + if (value) { + root.style.setProperty(`--font-${key}`, value); + } + }); + + Object.entries(themeInfo.completeTheme.radii).forEach(([key, value]) => { + if (value) { + root.style.setProperty(`--radius-${key}`, value); + } + }); + + Object.entries(themeInfo.completeTheme.shadows).forEach(([key, value]) => { + if (value) { + root.style.setProperty(`--shadow-${key}`, value); + } + }); + + Object.entries(themeInfo.completeTheme.blurs).forEach(([key, value]) => { + if (value) { + root.style.setProperty(`--blur-${key}`, value); + } + }); + + // Remove data-theme attribute for complete custom themes + root.removeAttribute('data-theme'); + + } else if (themeInfo.type === 'partial' && themeInfo.partialOverrides) { + // Partial override: KEEP data-theme and inject only overridden variables + root.setAttribute('data-theme', themeMode); + + // Only clear and inject if there are actual overrides + const hasOverrides = Object.keys(themeInfo.partialOverrides).length > 0; + if (hasOverrides) { + // Clear all custom variables first + ALL_THEME_VARS.forEach(varName => { + root.style.removeProperty(varName); + }); + + // Inject only the overridden variables + if (themeInfo.partialOverrides.colors) { + Object.entries(themeInfo.partialOverrides.colors).forEach(([key, value]) => { + if (value) { + root.style.setProperty(`--color-${key}`, value); + } + }); + } + + if (themeInfo.partialOverrides.fonts) { + Object.entries(themeInfo.partialOverrides.fonts).forEach(([key, value]) => { + if (value) { + root.style.setProperty(`--font-${key}`, value); + } + }); + } + + if (themeInfo.partialOverrides.radii) { + Object.entries(themeInfo.partialOverrides.radii).forEach(([key, value]) => { + if (value) { + root.style.setProperty(`--radius-${key}`, value); + } + }); + } + + if (themeInfo.partialOverrides.shadows) { + Object.entries(themeInfo.partialOverrides.shadows).forEach(([key, value]) => { + if (value) { + root.style.setProperty(`--shadow-${key}`, value); + } + }); + } + + if (themeInfo.partialOverrides.blurs) { + Object.entries(themeInfo.partialOverrides.blurs).forEach(([key, value]) => { + if (value) { + root.style.setProperty(`--blur-${key}`, value); + } + }); + } + } + + } else { + // Default theme: just set data-theme and clear custom variables + root.setAttribute('data-theme', themeMode); + + // Clear any previously injected custom variables + ALL_THEME_VARS.forEach(varName => { + root.style.removeProperty(varName); + }); + } + }, [themeInfo, themeMode]); +}; \ No newline at end of file diff --git a/packages/ui/src/providers/LunoKitProvider.tsx b/packages/ui/src/providers/LunoKitProvider.tsx index be97178..0c14b89 100644 --- a/packages/ui/src/providers/LunoKitProvider.tsx +++ b/packages/ui/src/providers/LunoKitProvider.tsx @@ -1,18 +1,19 @@ import React, { ReactNode, useState } from 'react'; import { LunoProvider } from '@luno-kit/react'; import type { Config as LunoCoreConfig } from '@luno-kit/react' -import { QueryClient, QueryClientProvider, type QueryClientConfig } from '@tanstack/react-query'; -import { ModalProvider } from './ModalContext'; -import { ThemeProvider, ThemeMode } from './ThemeContext'; +// @ts-ignore - @tanstack/react-query v5 API changes +import { QueryClient, QueryClientProvider,QueryClientCongfig } from '@tanstack/react-query'; +import { ModalProvider} from './ModalContext'; +import { ThemeProvider } from '../theme/context'; +import type { LunokitTheme, LunokitThemeOverrides } from '../theme/types'; import { ConnectModal, AccountDetailsModal, ChainModal } from '../components' import { ModalSize } from '../components/Dialog' export interface LunoKitProviderProps { children: ReactNode; config: LunoCoreConfig & { modalSize?: ModalSize }; - queryClientConfig?: QueryClientConfig; - // theme?: ThemeMode | LunoTheme; - theme?: ThemeMode; + queryClientConfig?: QueryClientCongfig; + theme?: LunokitTheme | LunokitThemeOverrides; // Support both complete themes and partial overrides } export const LunoKitProvider: React.FC = ({ @@ -26,7 +27,7 @@ export const LunoKitProvider: React.FC = ({ return ( - +
{children} @@ -41,11 +42,12 @@ export const LunoKitProvider: React.FC = ({ const RenderModals: React.FC<{modalSize?: ModalSize}> = ({ modalSize }: { modalSize?: ModalSize }) => { + return ( - <> - - - - + <> + + + + ); } diff --git a/packages/ui/src/providers/ModalContext.tsx b/packages/ui/src/providers/ModalContext.tsx index 981ab6c..62185eb 100644 --- a/packages/ui/src/providers/ModalContext.tsx +++ b/packages/ui/src/providers/ModalContext.tsx @@ -11,6 +11,7 @@ function useModalVisibility() { interface ModalContextValue { isConnectModalOpen: boolean; openConnectModal?: () => void; + closeConnectModal: () => void; isAccountModalOpen: boolean; openAccountModal?: () => void; diff --git a/packages/ui/src/providers/ThemeContext.tsx b/packages/ui/src/providers/ThemeContext.tsx deleted file mode 100644 index 198faa2..0000000 --- a/packages/ui/src/providers/ThemeContext.tsx +++ /dev/null @@ -1,63 +0,0 @@ -import React, {createContext, useState, useContext, ReactNode, useMemo, useCallback, useEffect} from 'react'; - -const THEME_STORAGE_KEY = 'luno.themeMode'; - -export type ThemeMode = 'light' | 'dark'; - -interface ThemeContextValue { - themeMode: ThemeMode; - setThemeMode: (mode: ThemeMode) => void; - toggleTheme: () => void; -} - -const ThemeContext = createContext(undefined); - -interface ThemeProviderProps { - children: ReactNode; - initialThemeMode?: ThemeMode; -} - -export const ThemeProvider: React.FC = ({ children, initialThemeMode }) => { - const [themeMode, setThemeModeState] = useState(() => { - if (typeof window !== 'undefined') { - const storedMode = localStorage.getItem(THEME_STORAGE_KEY) as ThemeMode | null; - if (storedMode && ['light', 'dark'].includes(storedMode)) { - return storedMode; - } - } - - if (initialThemeMode) return initialThemeMode; - return 'light'; - }); - - useEffect(() => { - if (typeof window !== 'undefined') { - localStorage.setItem(THEME_STORAGE_KEY, themeMode); - document.documentElement.setAttribute('data-theme', themeMode); - } - }, [themeMode]); - - const setThemeMode = useCallback((mode: ThemeMode) => { - setThemeModeState(mode); - }, []); - - const toggleTheme = useCallback(() => { - setThemeModeState(prevMode => prevMode === 'light' ? 'dark' : 'light'); - },[]); - - const contextValue = useMemo(() => ({ - themeMode, - setThemeMode, - toggleTheme, - }), [themeMode, setThemeMode, toggleTheme]); - - return {children}; -}; - -export const useLunoTheme = (): ThemeContextValue => { - const context = useContext(ThemeContext); - if (!context) { - throw new Error('useLunoTheme must be used within a ThemeProvider (which is part of LunoKitProvider)'); - } - return context; -}; diff --git a/packages/ui/src/providers/index.ts b/packages/ui/src/providers/index.ts index 0dedab6..9f39e92 100644 --- a/packages/ui/src/providers/index.ts +++ b/packages/ui/src/providers/index.ts @@ -1,2 +1,3 @@ export * from './LunoKitProvider' -export { useLunoTheme } from './ThemeContext' +export { useLunoTheme } from '../theme/context' +export type { LunokitTheme, ThemeMode } from '../theme/types' diff --git a/packages/ui/src/styles/base.css b/packages/ui/src/styles/base.css index f95f9e5..1dabe96 100644 --- a/packages/ui/src/styles/base.css +++ b/packages/ui/src/styles/base.css @@ -1,126 +1,250 @@ @import 'tailwindcss' important; -@custom-variant light (&:where([data-theme=light], [data-theme=light] *)); -@custom-variant dark (&:where([data-theme=dark], [data-theme=dark] *)); - -.luno-kit * { - box-sizing: border-box; -} - - -[data-theme='light'] { - --color-primaryFont: #211F26; - --color-accentFont: #3385FF; - --color-secondaryFont: rgba(60, 66, 66, 0.6); - --color-modal-bg: white; - --color-connectorItemBackground: rgba(0,0,0,0.035); - --color-connectorItemHover: rgba(0,0,0,0.08); - --color-connectorItemActive: rgba(0,0,0,0.1); - --color-connectButtonBackground: #F1EFF3; - --shadow-connectButton: 0px 10px 20px 0px rgba(0,0,0,0.1); - --shadow-accountButton: 00px 10px 20px 0px rgba(0,0,0,0.1); - --color-deepBackground: #f6f6f6; - --color-chainButton: #FFFFFF; - - --color-modalFont: #25292E; - --color-modalLine: rgba(0, 0, 0, 0.06); - - --color-chainSelected: rgba(0,0,0,0.15); -} - -[data-theme='dark'] { - --color-primaryFont: #FFFFFF; - --color-accentFont: #8A6EAC; - --color-secondaryFont: rgba(255,255,255,0.5); - --color-modal-bg: #3A3B43; - --color-connectorItemBackground: rgba(255,255,255,0.035); - --color-connectorItemHover: rgba(255,255,255,0.09); - --color-connectorItemActive: rgba(255,255,255,0.1); - --color-connectButtonBackground: #4A4B51; - --shadow-connectButton: 0px 4px 12px rgba(0, 0, 0, 0.1); - --shadow-accountButton: 0px 5px 10px 0px rgba(0,0,0,0.1); - --color-deepBackground: #3A3B43; - --color-chainButton: #4A4B51; +@theme inline { + /* Color utilities */ + --color-accentColor: var(--color-accentColor); + --color-modalBackground: var(--color-modalBackground); + --color-modalText: var(--color-modalText); + --color-modalTextSecondary: var(--color-modalTextSecondary); + --color-modalBackdrop: var(--color-modalBackdrop); + --color-modalBorder: var(--color-modalBorder); + --color-modalControlButtonBackgroundHover: var(--color-modalControlButtonBackgroundHover); + --color-modalControlButtonText: var(--color-modalControlButtonText); + + --color-connectButtonBackground: var(--color-connectButtonBackground); + --color-connectButtonInnerBackground: var(--color-connectButtonInnerBackground); + --color-connectButtonText: var(--color-connectButtonText); + + --color-walletSelectItemBackground: var(--color-walletSelectItemBackground); + --color-walletSelectItemBackgroundHover: var(--color-walletSelectItemBackgroundHover); + --color-walletSelectItemText: var(--color-walletSelectItemText); + + --color-accountActionItemBackground: var(--color-accountActionItemBackground); + --color-accountActionItemBackgroundHover: var(--color-accountActionItemBackgroundHover); + --color-accountActionItemText: var(--color-accountActionItemText); + + --color-accountSelectItemBackground: var(--color-accountSelectItemBackground); + --color-accountSelectItemBackgroundHover: var(--color-accountSelectItemBackgroundHover); + --color-accountSelectItemText: var(--color-accountSelectItemText); + + --color-currentNetworkButtonBackground: var(--color-currentNetworkButtonBackground); + --color-currentNetworkButtonText: var(--color-currentNetworkButtonText); + + --color-networkSelectItemBackground: var(--color-networkSelectItemBackground); + --color-networkSelectItemBackgroundHover: var(--color-networkSelectItemBackgroundHover); + --color-networkSelectItemText: var(--color-networkSelectItemText); + + --color-navigationButtonBackground: var(--color-navigationButtonBackground); + --color-separatorLine: var(--color-separatorLine); + --color-skeleton: var(--color-skeleton); + + --color-success: var(--color-success); + --color-successForeground: var(--color-successForeground); + --color-warning: var(--color-warning); + --color-warningForeground: var(--color-warningForeground); + --color-error: var(--color-error); + --color-errorForeground: var(--color-errorForeground); + --color-info: var(--color-info); + --color-infoForeground: var(--color-infoForeground); + + /* Radius utilities */ + --radius-walletSelectItem: var(--radius-walletSelectItem); + --radius-connectButton: var(--radius-connectButton); + --radius-modalControlButton: var(--radius-modalControlButton); + --radius-accountActionItem: var(--radius-accountActionItem); + --radius-accountSelectItem: var(--radius-accountSelectItem); + --radius-currentNetworkButton: var(--radius-currentNetworkButton); + --radius-networkSelectItem: var(--radius-networkSelectItem); + --radius-modal: var(--radius-modal); + + /* Shadow utilities */ + --shadow-button: var(--shadow-button); + --shadow-modal: var(--shadow-modal); + + /* Blurs */ + --blur-modalOverlay: var(--blur-modalOverlay); + + /* Typography */ + --text-xs: 12px; + --leading-xs: 18px; + --text-sm: 14px; + --leading-sm: 18px; + --text-base: 16px; + --leading-base: 20px; + --text-lg: 18px; + --leading-lg: 24px; - --color-modalFont: #FFFFFF; - --color-modalLine: rgba(74,75,88,0.75); + /* Font Weights */ + --font-weight-medium: 500; + --font-weight-semibold: 600; + --font-weight-bold: 700; - --color-chainSelected: rgba(0,0,0,0.15); -} - -@theme inline { + /* Spacing */ --spacing-1: 4px; --spacing-1\.5: 6px; --spacing-2: 8px; --spacing-2\.5: 10px; --spacing-3: 12px; + --spacing-3\.5: 14px; --spacing-4: 16px; --spacing-5: 20px; --spacing-6: 24px; - --text-sm: 14px; - --leading-sm: 18px; - --text-primary: 16px; - --leading-primary: 20px; - --text-lg: 18px; - --leading-lg: 24px; - --text-title: 18px; - --leading-title: 24px; - --text-secondary: 14px; - --leading-secondary: 18px; - --text-accent: 12px; - --leading-accent: 18px; - - --shadow-primary: 0px 10px 20px 0px rgba(0,0,0,0.1); - --radius-primary: 8px; - --radius-sm: 6px; - - --color-primaryFont: var(--color-primaryFont); - --color-accentFont: var(--color-accentFont); - --color-secondaryFont: var(--color-secondaryFont); - --color-modal-bg: var(--color-modal-bg); - --color-connectorItemBackground: var(--color-connectorItemBackground); - --color-connectButtonBackground: var(--color-connectButtonBackground); - --shadow-connectButton: var(--shadow-connectButton); - --shadow-accountButton: var(--shadow-accountButton); - --color-deepBackground: var(--color-deepBackground); - --color-chainButton: var(--color-chainButton); - --color-modalBackdrop: rgba(0, 0, 0, 0.3); +} - --color-modalFont: var(--color-modalFont); - --color-modalLine: var(--color-modalLine); +@custom-variant light (&:where([data-theme=light], [data-theme=light] *)); +@custom-variant dark (&:where([data-theme=dark], [data-theme=dark] *)); - --color-chainSelected: var(--color-chainSelected); +.luno-kit * { + box-sizing: border-box; } +/* Default Light Theme Variables */ +:root { -.luno-kit .custom-scrollbar { - scrollbar-width: thin; - scrollbar-color: var(--color-modalLine) transparent; + + + /* Fonts */ + --font-body: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; + --font-heading: ui-rounded, "SF Pro Rounded", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; + --font-mono: Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; + + /* Radii */ + --radius-walletSelectItem: 6px; + --radius-connectButton: 6px; + --radius-modalControlButton: 6px; + --radius-accountActionItem: 6px; + --radius-accountSelectItem: 6px; + --radius-currentNetworkButton: 6px; + --radius-networkSelectItem: 6px; + --radius-modal: 6px; + + /* Shadows */ + --shadow-button: 0px 10px 20px 0px rgba(0,0,0,0.1); + --shadow-modal: 0px 20px 25px -5px rgba(0,0,0,0.1); + + /* Blurs */ + --blur-modalOverlay: blur(8px); } -.luno-kit .custom-scrollbar::-webkit-scrollbar { - width: 6px; +[data-theme="light"] { + /* Light Theme Colors */ + --color-accentColor: #3385FF; + --color-walletSelectItemBackground: rgba(0,0,0,0.035); + --color-walletSelectItemBackgroundHover: rgba(0,0,0,0.08); + --color-walletSelectItemText: #211F26; + --color-connectButtonBackground: #F1EFF3; + --color-connectButtonInnerBackground: rgba(0,0,0,0.06); + --color-connectButtonText: #211F26; + --color-accountActionItemBackground: rgba(0,0,0,0.035); + --color-accountActionItemBackgroundHover: rgba(0,0,0,0.08); + --color-accountActionItemText: #211F26; + --color-accountSelectItemBackground: rgba(0,0,0,0.035); + --color-accountSelectItemBackgroundHover: rgba(0,0,0,0.08); + --color-accountSelectItemText: #211F26; + --color-currentNetworkButtonBackground: #FFFFFF; + --color-currentNetworkButtonText: #211F26; + --color-networkSelectItemBackground: rgba(0,0,0,0.035); + --color-networkSelectItemBackgroundHover: rgba(0,0,0,0.08); + --color-networkSelectItemText: #211F26; + --color-navigationButtonBackground: rgba(0,0,0,0.15); + --color-separatorLine: rgba(0, 0, 0, 0.035); + --color-modalBackground: #ffffff; + --color-modalBackdrop: rgba(0, 0, 0, 0.3); + --color-modalBorder: transparent; + --color-modalText: #25292E; + --color-modalTextSecondary: rgba(60, 66, 66, 0.6); + --color-modalControlButtonBackgroundHover: rgba(0,0,0,0.08); + --color-modalControlButtonText: #6B7280; + --color-success: #10b981; + --color-successForeground: #ffffff; + --color-warning: #f59e0b; + --color-warningForeground: #ffffff; + --color-error: #ef4444; + --color-errorForeground: #ffffff; + --color-info: #3b82f6; + --color-infoForeground: #ffffff; + --color-skeleton: rgba(0,0,0,0.08); } -.luno-kit .custom-scrollbar::-webkit-scrollbar-track { - background: transparent; +/* Dark Theme Variables */ +[data-theme="dark"] { + + /* Dark Theme Colors */ + --color-accentColor: #8A6EAC; + --color-walletSelectItemBackground: rgba(255,255,255,0.035); + --color-walletSelectItemBackgroundHover: rgba(255,255,255,0.09); + --color-walletSelectItemText: #FFFFFF; + --color-connectButtonBackground: #4A4B51; + --color-connectButtonInnerBackground: #3A3B43; + --color-connectButtonText: #FFFFFF; + --color-accountActionItemBackground: rgba(255,255,255,0.035); + --color-accountActionItemBackgroundHover: rgba(255,255,255,0.09); + --color-accountActionItemText: #FFFFFF; + --color-accountSelectItemBackground: rgba(255,255,255,0.035); + --color-accountSelectItemBackgroundHover: rgba(255,255,255,0.09); + --color-accountSelectItemText: #FFFFFF; + --color-currentNetworkButtonBackground: #4A4B51; + --color-currentNetworkButtonText: #FFFFFF; + --color-networkSelectItemBackground: rgba(255,255,255,0.035); + --color-networkSelectItemBackgroundHover: rgba(255,255,255,0.09); + --color-networkSelectItemText: #FFFFFF; + --color-navigationButtonBackground: rgba(255,255,255,0.15); + --color-separatorLine: rgba(74,75,88,0.75); + --color-modalBackground: #3A3B43; + --color-modalBackdrop: rgba(0, 0, 0, 0.5); + --color-modalBorder: #374151; + --color-modalText: #FFFFFF; + --color-modalTextSecondary: rgba(255,255,255,0.5); + --color-modalControlButtonBackgroundHover: rgba(255,255,255,0.09); + --color-modalControlButtonText: #9CA3AF; + --color-success: #10b981; + --color-successForeground: #ffffff; + --color-warning: #f59e0b; + --color-warningForeground: #ffffff; + --color-error: #ef4444; + --color-errorForeground: #ffffff; + --color-info: #3b82f6; + --color-infoForeground: #ffffff; + --color-skeleton: rgba(255,255,255,0.09); + + /* Fonts */ + --font-body: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; + --font-heading: ui-rounded, "SF Pro Rounded", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; + --font-mono: Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; + + /* Radii */ + --radius-walletSelectItem: 6px; + --radius-connectButton: 6px; + --radius-modalControlButton: 6px; + --radius-accountActionItem: 6px; + --radius-accountSelectItem: 6px; + --radius-currentNetworkButton: 6px; + --radius-networkSelectItem: 6px; + --radius-modal: 6px; + + /* Shadows */ + --shadow-button: 0px 4px 12px rgba(0, 0, 0, 0.3); + --shadow-modal: 0px 20px 25px -5px rgba(0, 0, 0, 0.4); + + /* Blurs */ + --blur-modalOverlay: blur(8px); } -.luno-kit .custom-scrollbar::-webkit-scrollbar-thumb { - background-color: var(--color-modalLine); - border-radius: 3px; + +.luno-kit * { + scrollbar-width: none; /* Firefox */ + -ms-overflow-style: none; /* IE and Edge */ } -.luno-kit .custom-scrollbar::-webkit-scrollbar-thumb:hover { - background-color: var(--color-secondaryFont); +.luno-kit *::-webkit-scrollbar { + display: none; /* Chrome, Safari and Opera */ } .luno-kit .chain-icon-text { font-family: ui-rounded, "SF Pro Rounded", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; - font-size: calc(100% * 0.8); line-height: 1; position: absolute; @@ -144,7 +268,7 @@ height: 100%; width: 100%; border-radius: 50%; - background-color: var(--color-accentFont); + background-color: var(--color-accentColor); opacity: 0.75; animation: ping 1.2s cubic-bezier(0, 0, 0.2, 1) infinite; } @@ -155,17 +279,6 @@ border-radius: 50%; height: 100%; width: 100%; - background-color: var(--color-accentFont); -} - -.scrollbar-thin::-webkit-scrollbar { - width: 4px; -} -.scrollbar-thin::-webkit-scrollbar-track { - background: rgba(0, 0, 0, 0.1); -} -.scrollbar-thin::-webkit-scrollbar-thumb { - background: rgba(0, 0, 0, 0.3); - border-radius: 2px; + background-color: var(--color-accentColor); } diff --git a/packages/ui/src/theme/context.tsx b/packages/ui/src/theme/context.tsx new file mode 100644 index 0000000..9cc8817 --- /dev/null +++ b/packages/ui/src/theme/context.tsx @@ -0,0 +1,194 @@ +import React, { createContext, useState, useContext, ReactNode, useMemo, useCallback, useEffect } from 'react'; +import type { LunokitTheme, LunokitThemeOverrides, PartialLunokitTheme, ThemeMode } from './types'; +import { useCSSVariableInjection } from '../hooks/cssVariableInject'; + +// Theme preference storage +interface ThemePreference { + isAuto: boolean; + preferredTheme?: ThemeMode; +} + +const THEME_STORAGE_KEY = 'luno.lastThemePreference'; + +const saveThemePreference = (preference: ThemePreference) => { + try { + localStorage.setItem(THEME_STORAGE_KEY, JSON.stringify(preference)); + } catch (e) { + } +}; + +interface ThemeContextValue { + themeMode: ThemeMode; + setThemeChoice: (choice: 'light' | 'dark' | 'auto') => void; // User explicit choice + currentTheme: LunokitTheme | null; // null for default themes +} + +const ThemeContext = createContext(undefined); + +interface ThemeProviderProps { + children: ReactNode; + theme?: LunokitTheme | LunokitThemeOverrides; +} + +// Helper function to check if theme is complete or partial +const isCompleteTheme = (theme: LunokitTheme | LunokitThemeOverrides): theme is LunokitTheme => { + return 'colors' in theme && 'fonts' in theme && 'radii' in theme && 'shadows' in theme && 'blurs' in theme; +}; + +// Hook to detect system theme +const useSystemTheme = () => { + const [systemTheme, setSystemTheme] = useState<'light' | 'dark'>(() => { + if (typeof window === 'undefined') return 'light'; + return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'; + }); + + useEffect(() => { + if (typeof window === 'undefined') return; + + const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)'); + + const updateTheme = (e: MediaQueryListEvent | MediaQueryList) => { + setSystemTheme(e.matches ? 'dark' : 'light'); + }; + + updateTheme(mediaQuery); + mediaQuery.addEventListener('change', updateTheme); + + return () => mediaQuery.removeEventListener('change', updateTheme); + }, []); + + return systemTheme; +}; + +export const ThemeProvider: React.FC = ({ + children, + theme: themeOverrides, +}) => { + const systemTheme = useSystemTheme(); + + const [themeMode, setThemeMode] = useState(() => { + if (typeof window !== 'undefined') { + try { + const saved = localStorage.getItem(THEME_STORAGE_KEY); + if (saved) { + const preference = JSON.parse(saved); + if (preference?.isAuto) { + return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'; + } else if (preference?.preferredTheme) { + return preference.preferredTheme; + } + } + } catch (e) { + // Ignore parsing errors + } + } + + if (!themeOverrides || isCompleteTheme(themeOverrides)) { + return 'light'; + } + + const overrides = themeOverrides as LunokitThemeOverrides; + return overrides.defaultMode || 'light'; + }); + + const [isAutoMode, setIsAutoMode] = useState(() => { + if (typeof window !== 'undefined') { + try { + const saved = localStorage.getItem(THEME_STORAGE_KEY); + if (saved) { + const preference = JSON.parse(saved); + return preference?.isAuto ?? false; + } + } catch (e) { + // Ignore parsing errors + } + } + + if (!themeOverrides || isCompleteTheme(themeOverrides)) { + return false; + } + + const overrides = themeOverrides as LunokitThemeOverrides; + return overrides.autoMode ?? false; + }); + + // Only listen to system theme changes for auto mode + useEffect(() => { + if (isAutoMode) { + setThemeMode(systemTheme || 'light'); + } + }, [systemTheme, isAutoMode]); + + // Determine theme type and get relevant data + const themeInfo = useMemo(() => { + if (!themeOverrides) { + return { type: 'default' as const, completeTheme: null, partialOverrides: null }; + } + + // Handle complete custom theme + if (isCompleteTheme(themeOverrides)) { + return { type: 'complete' as const, completeTheme: themeOverrides, partialOverrides: null }; + } + + // Handle theme overrides format + const overrides = themeOverrides as LunokitThemeOverrides; + + // Apply complete theme override (highest priority) + if (overrides.theme) { + return { type: 'complete' as const, completeTheme: overrides.theme, partialOverrides: null }; + } + + // For partial overrides, get the current mode's overrides + let partialOverrides: PartialLunokitTheme | null = null; + if (themeMode === 'light' && overrides.light) { + partialOverrides = overrides.light; + } else if (themeMode === 'dark' && overrides.dark) { + partialOverrides = overrides.dark; + } + + return { type: 'partial' as const, completeTheme: null, partialOverrides }; + }, [themeMode, themeOverrides]); + + // Build current theme for context (only for complete themes) + const currentTheme = useMemo(() => { + return themeInfo.type === 'complete' ? themeInfo.completeTheme : null; + }, [themeInfo]); + + // Inject CSS variables to DOM + useCSSVariableInjection(themeInfo, themeMode); + + // User explicit choice handler (saves to storage) + const setThemeChoice = useCallback((choice: 'light' | 'dark' | 'auto') => { + const isAuto = choice === 'auto'; + setIsAutoMode(isAuto); + + if (isAuto) { + setThemeMode(systemTheme || 'light'); + } else { + setThemeMode(choice); + } + + const preference: ThemePreference = { + isAuto, + ...(isAuto ? {} : { preferredTheme: choice }) + }; + + saveThemePreference(preference); + }, [systemTheme]); + + const contextValue = useMemo(() => ({ + themeMode, + setThemeChoice, + currentTheme, + }), [themeMode, setThemeChoice, currentTheme]); + + return {children}; +}; + +export const useLunoTheme = (): ThemeContextValue => { + const context = useContext(ThemeContext); + if (!context) { + throw new Error('useLunoTheme must be used within a ThemeProvider (which is part of LunoKitProvider)'); + } + return context; +}; diff --git a/packages/ui/src/theme/index.ts b/packages/ui/src/theme/index.ts new file mode 100644 index 0000000..aba9aa0 --- /dev/null +++ b/packages/ui/src/theme/index.ts @@ -0,0 +1,2 @@ +export * from './types'; +export { ThemeProvider, useLunoTheme } from './context'; \ No newline at end of file diff --git a/packages/ui/src/theme/types.ts b/packages/ui/src/theme/types.ts new file mode 100644 index 0000000..03b7d3d --- /dev/null +++ b/packages/ui/src/theme/types.ts @@ -0,0 +1,104 @@ +// Theme type definitions +export interface LunokitTheme { + colors: { + // Primary colors + accentColor: string; + + // Button related + walletSelectItemBackground: string; + walletSelectItemBackgroundHover: string; + walletSelectItemText: string; + + connectButtonBackground: string; + connectButtonInnerBackground: string; + connectButtonText: string; + + accountActionItemBackground: string; + accountActionItemBackgroundHover: string; + accountActionItemText: string; + + accountSelectItemBackground: string; + accountSelectItemBackgroundHover: string; + accountSelectItemText: string; + + currentNetworkButtonBackground: string; + currentNetworkButtonText: string; + + networkSelectItemBackground: string; + networkSelectItemBackgroundHover: string; + networkSelectItemText: string; + + navigationButtonBackground: string; + + separatorLine: string; + + // Modal related + modalBackground: string; + modalBackdrop: string; + modalBorder: string; + modalText: string; + modalTextSecondary: string; + modalControlButtonBackgroundHover: string; + modalControlButtonText: string; + + // Status colors + success: string; + successForeground: string; + warning: string; + warningForeground: string; + error: string; + errorForeground: string; + info: string; + infoForeground: string; + + // Skeleton screen + skeleton: string; + }; + fonts: { + body: string; + heading: string; + mono: string; + }; + radii: { + walletSelectItem: string; + connectButton: string; + modalControlButton: string; + accountActionItem: string; + accountSelectItem: string; + currentNetworkButton: string; + networkSelectItem: string; + modal: string; + }; + shadows: { + button: string; + modal: string; + }; + blurs: { + modalOverlay: string; + }; +} + +// Partial theme for overriding specific properties +export type PartialLunokitTheme = { + colors?: Partial; + fonts?: Partial; + radii?: Partial; + shadows?: Partial; + blurs?: Partial; +}; + +// Simplified theme configuration supporting partial overrides +export interface LunokitThemeOverrides { + // Theme behavior control + autoMode?: boolean; // Whether to auto-follow system theme (default: false) + defaultMode?: ThemeMode; // Default theme mode when not auto (default: 'light') + + // Complete custom theme (overrides both light and dark) + theme?: LunokitTheme; + + // Partial overrides for specific modes + light?: PartialLunokitTheme; + dark?: PartialLunokitTheme; +} + +export type ThemeMode = 'light' | 'dark'; \ No newline at end of file diff --git a/packages/ui/src/utils/cs.ts b/packages/ui/src/utils/cs.ts index ea30ec9..85138ea 100644 --- a/packages/ui/src/utils/cs.ts +++ b/packages/ui/src/utils/cs.ts @@ -5,12 +5,10 @@ const customTwMerge = extendTailwindMerge({ extend: { classGroups: { 'font-size': [ + 'text-xs', 'text-sm', - 'text-primary', - 'text-lg', - 'text-title', - 'text-secondary', - 'text-accent' + 'text-base', + 'text-lg' ] } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4134453..cbbebb2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -11422,7 +11422,7 @@ snapshots: '@types/react-dom@18.2.19': dependencies: - '@types/react': 18.3.23 + '@types/react': 18.2.55 '@types/react-dom@18.3.7(@types/react@18.3.23)': dependencies: From 6a3f9f391bd2ea5674f70de09f08ca61f3e1ac59 Mon Sep 17 00:00:00 2001 From: WBH <48749219+wbh1328551759@users.noreply.github.com> Date: Wed, 30 Jul 2025 13:49:31 +0800 Subject: [PATCH 03/45] fix bug in walletconnect * fix(core): fix disconnect of walletconnectConnector * fix(ui): fix openConnectModal & refresh qrcode in ConnectModal --- packages/core/src/connectors/walletconnect.ts | 3 ++- packages/ui/src/components/ConnectModal/index.tsx | 2 ++ packages/ui/src/providers/ModalContext.tsx | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/packages/core/src/connectors/walletconnect.ts b/packages/core/src/connectors/walletconnect.ts index 402c7d5..ee51ef2 100644 --- a/packages/core/src/connectors/walletconnect.ts +++ b/packages/core/src/connectors/walletconnect.ts @@ -101,6 +101,7 @@ export class WalletConnectConnector extends BaseConnector { const session = await approval(); this.session = session; + this.provider.session = session; this.connectionUri = undefined; @@ -153,7 +154,7 @@ export class WalletConnectConnector extends BaseConnector { public async disconnect(): Promise { if (this.provider) { await Promise.race([ - this.provider.disconnect(), + await this.provider.disconnect(), new Promise((_, reject) => setTimeout(() => reject(new Error('Disconnect timeout')), 5000) ) diff --git a/packages/ui/src/components/ConnectModal/index.tsx b/packages/ui/src/components/ConnectModal/index.tsx index 196bf98..3b87c5a 100644 --- a/packages/ui/src/components/ConnectModal/index.tsx +++ b/packages/ui/src/components/ConnectModal/index.tsx @@ -38,6 +38,7 @@ export const ConnectModal: React.FC = ({ const handleConnect = async (connector: Connector) => { setSelectedConnector(connector) + setQrCode(undefined) if (connector.hasConnectionUri()) { onQrCode(connector) } @@ -49,6 +50,7 @@ export const ConnectModal: React.FC = ({ !open && close() resetConnect() setSelectedConnector(null) + setQrCode(undefined) } return ( diff --git a/packages/ui/src/providers/ModalContext.tsx b/packages/ui/src/providers/ModalContext.tsx index 62185eb..0dba4fe 100644 --- a/packages/ui/src/providers/ModalContext.tsx +++ b/packages/ui/src/providers/ModalContext.tsx @@ -52,7 +52,7 @@ export const ModalProvider: React.FC = ({ children }) => { isConnectModalOpen, isAccountModalOpen, isChainModalOpen, - openConnectModal: connectionStatus === ConnectionStatus.Disconnected || connectionStatus === ConnectionStatus.Disconnecting ? openConnectModal : undefined, + openConnectModal: connectionStatus !== ConnectionStatus.Connected ? openConnectModal : undefined, closeConnectModal, openAccountModal: connectionStatus === ConnectionStatus.Connected ? openAccountModal : undefined, closeAccountModal, From cf27120fac0d6333a032058c1d4cc4c742fb3e8f Mon Sep 17 00:00:00 2001 From: WBH <48749219+wbh1328551759@users.noreply.github.com> Date: Mon, 4 Aug 2025 14:49:13 +0800 Subject: [PATCH 04/45] Chore/UI work (#25) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(ui): resolve Radix UI Dialog TypeScript errors - Add proper type interfaces for Dialog components - Fix ModalContext missing closeConnectModal method - Handle @tanstack/react-query v5 API changes - Use React.createElement to bypass Radix UI type restrictions * feat(ui): add new theme system with light/dark presets and CSS variables * fix: resolve chain modal issues and optimize theme system * feat: save current theme system state before refactoring * fix: resolve UI build issues and restore theme system - Fix base.css theme syntax to use @theme inline with var() instead of theme() - Restore missing dark theme variables (spacing, typography, fonts, radii, blurs) - Update theme context structure and remove defaultTheme.ts - Update LunoKitProvider to use new theme system - Fix PostCSS configuration for Tailwind CSS v4 * feat: remove toggleTheme and add auto system theme following - Remove toggleTheme function from ThemeProvider - Add useSystemTheme hook to detect system color scheme - Add auto-following system theme when both light and dark are provided - Add isAutoMode flag to indicate auto-following state - Update example app to use setThemeMode instead of toggleTheme - Maintain backward compatibility with existing theme system * feat: optimize theme persistence logic - only persist when user has theme choice * fix: remove defaultTheme from LunoKitProvider to match ThemeProvider interface * feat(theme): remove localStorage persistence and fix dark theme logic - Remove theme localStorage persistence - Fix dark theme not applying with theme={{dark:{}}} - Simplify theme initialization and switching logic * refactor(ui): standardize design │ │ tokens and remove style duplicates * feat(ui): Modify the rounded property of some components. * refactor(AccountDetailsModal): simplify view transitions to height-only animation * refactor(ui):Optimize code structure, remove unused code * feat(theme): enhance theme system with auto-mode and user preferences - Add autoMode support for system theme following - Implement localStorage persistence for user choices - Add setThemeChoice API for explicit user actions - Remove unused dependencies (postcss-import) - Clean up redundant size props and methods - Fix hook functionality and simplify API - Improve theme initialization priority logic * refactor(ui): replace localStorage with config.storage in theme system * refactor(theme): optimize theme system and eliminate flashing - Extract CSS variable injection logic to separate file (cssVariableInject.ts) - Optimize initial theme state calculation to prevent flashing - Simplify theme preference interface (isAuto, preferredTheme) - Fix system theme detection with proper initialization - Remove redundant state management and async loading * refactor(theme): replace LunoStorage with localStorage for theme persistence * feat(examples): Remove auto mode label * feat: implement QR code skeleton loading state --------- Co-authored-by: “Gintma” --- .../ui/src/components/ConnectModal/index.tsx | 2 +- packages/ui/src/components/QRCode/index.tsx | 142 +++++++++++++++++- packages/ui/src/styles/animations.css | 5 + 3 files changed, 145 insertions(+), 4 deletions(-) diff --git a/packages/ui/src/components/ConnectModal/index.tsx b/packages/ui/src/components/ConnectModal/index.tsx index 3b87c5a..d6317df 100644 --- a/packages/ui/src/components/ConnectModal/index.tsx +++ b/packages/ui/src/components/ConnectModal/index.tsx @@ -109,7 +109,7 @@ export const ConnectModal: React.FC = ({
{selectedConnector ? - showQRCode ? : ( + showQRCode ? : ( <>
diff --git a/packages/ui/src/components/QRCode/index.tsx b/packages/ui/src/components/QRCode/index.tsx index 0ebb1c3..7125ca8 100644 --- a/packages/ui/src/components/QRCode/index.tsx +++ b/packages/ui/src/components/QRCode/index.tsx @@ -1,5 +1,4 @@ import { Cuer } from 'cuer' -import {Loading} from '../../assets/icons' export type ErrorCorrectionLevel = 'low' | 'medium' | 'quartile' | 'high'; @@ -8,17 +7,154 @@ interface Props { logoBackground?: string; logoUrl?: string | (() => Promise); logoSize?: number; - size?: number; + size: number; uri?: string; } export const QRCode = ({ logoBackground, uri, + size, }: Props) => { if (!uri) { + const QR_GRID_SIZE = 57; + const FINDER_SIZE_WITH_MARGIN = 8; + const ARENA_GRID_SIZE = Math.floor(QR_GRID_SIZE / 4); + + const cellSize = size / QR_GRID_SIZE; + const arenaSize = ARENA_GRID_SIZE * cellSize; + const arenaStart = Math.floor(QR_GRID_SIZE / 2 - ARENA_GRID_SIZE / 2); + const arenaEnd = arenaStart + ARENA_GRID_SIZE; + + const generateSkeletonDots = () => { + const dots = []; + for (let i = 0; i < QR_GRID_SIZE; i++) { + for (let j = 0; j < QR_GRID_SIZE; j++) { + if (i >= arenaStart && i <= arenaEnd && j >= arenaStart && j <= arenaEnd) continue; + + const isInFinder = + (i < FINDER_SIZE_WITH_MARGIN && j < FINDER_SIZE_WITH_MARGIN) || + (i < FINDER_SIZE_WITH_MARGIN && j >= QR_GRID_SIZE - FINDER_SIZE_WITH_MARGIN) || + (i >= QR_GRID_SIZE - FINDER_SIZE_WITH_MARGIN && j < FINDER_SIZE_WITH_MARGIN); + if (isInFinder) continue; + + const cx = j + 0.5; + const cy = i + 0.5; + + dots.push( + + ); + } + } + return dots; + }; + + const renderFinderPattern = ({ position }: { position: 'top-left' | 'top-right' | 'bottom-left' }) => { + const finderSize = 7 * cellSize; + const positionStyles = { + 'top-left': { top: 0, left: 0 }, + 'top-right': { top: 0, right: 0 }, + 'bottom-left': { bottom: 0, left: 0 }, + }; + + return ( +
+
+
+
+ ); + }; + + const renderArenaLogo = () => { + const logoStart = Math.ceil(QR_GRID_SIZE / 2 - ARENA_GRID_SIZE / 2) * cellSize; + + return ( +
+ QR Code Logo +
+ ); + }; + return ( - +
+ + {generateSkeletonDots()} + + +
+ + {renderFinderPattern({ position: 'top-left' })} + {renderFinderPattern({ position: 'top-right' })} + {renderFinderPattern({ position: 'bottom-left' })} + + {logoBackground && renderArenaLogo()} +
) } return ( diff --git a/packages/ui/src/styles/animations.css b/packages/ui/src/styles/animations.css index ef79a32..a896bed 100644 --- a/packages/ui/src/styles/animations.css +++ b/packages/ui/src/styles/animations.css @@ -49,3 +49,8 @@ opacity: 0; } } + +@keyframes shimmer { + 0% { background-position: 100% 0; } + 100% { background-position: -100% 0; } +} From d5c4b46f409635b0988d8efa5e5a17be8acb0888 Mon Sep 17 00:00:00 2001 From: WBH <48749219+wbh1328551759@users.noreply.github.com> Date: Tue, 5 Aug 2025 12:50:27 +0800 Subject: [PATCH 05/45] Chore/ci cd readme (#27) * chore: update README and fix GitHub Actions * chore: update working-directory for pnpm audit --------- Co-authored-by: Gintma --- .github/workflows/security-audit.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/security-audit.yml b/.github/workflows/security-audit.yml index e5e7261..77351b2 100644 --- a/.github/workflows/security-audit.yml +++ b/.github/workflows/security-audit.yml @@ -26,4 +26,5 @@ jobs: run: pnpm install --frozen-lockfile - name: Run pnpm audit + working-directory: packages run: pnpm audit --audit-level=moderate From 2b90656a44763d7d270921e1bd7c7a2fcf4a124c Mon Sep 17 00:00:00 2001 From: WBH <48749219+wbh1328551759@users.noreply.github.com> Date: Tue, 5 Aug 2025 12:53:20 +0800 Subject: [PATCH 06/45] Feat/mobile UI (#28) * feat(core): In novaConnector, add support for novaMobileConnector * feat(ui): Add "useWindowSize", optimize responsive design * feat(core): add links field with browserExtension & deepLink and add test code * feat(ui): enhance CSS styles with mobile responsiveness --------- Co-authored-by: Gintma --- packages/core/src/connectors/base.ts | 2 + packages/core/src/connectors/common.ts | 4 + packages/core/src/connectors/index.ts | 1 + packages/core/src/connectors/nova.ts | 26 ++- packages/core/src/connectors/novaMobile.ts | 3 + packages/core/src/connectors/polkadot-js.ts | 3 + packages/core/src/connectors/polkagate.ts | 3 + packages/core/src/connectors/subwallet.ts | 4 + packages/core/src/connectors/talisman.ts | 3 + packages/core/src/types/connector.ts | 6 + packages/core/src/utils/device.test.ts | 100 +++++++++ packages/core/src/utils/device.ts | 8 + packages/core/src/utils/index.ts | 2 + .../AccountDetailsModal/MainView.tsx | 15 +- .../AccountDetailsModal/SwitchAccountView.tsx | 2 +- .../AccountDetailsModal/SwitchChainView.tsx | 2 +- .../components/AccountDetailsModal/index.tsx | 69 ++---- .../ui/src/components/ChainModal/index.tsx | 4 +- .../ui/src/components/ConnectButton/index.tsx | 12 +- .../ConnectModal/ConnectOptions.tsx | 79 +++++++ .../components/ConnectModal/WalletView.tsx | 93 ++++++++ .../ui/src/components/ConnectModal/index.tsx | 199 +++++++----------- packages/ui/src/components/Dialog/index.tsx | 17 +- packages/ui/src/hooks/cssVariableInject.ts | 38 ++-- packages/ui/src/hooks/index.ts | 1 + packages/ui/src/hooks/useAnimatedViews.ts | 78 +++++++ packages/ui/src/hooks/useWindowSize.ts | 26 +++ packages/ui/src/styles/animations.css | 9 + packages/ui/src/styles/base.css | 33 +-- packages/ui/src/utils/debounce.ts | 14 ++ packages/ui/src/utils/index.ts | 1 + 31 files changed, 621 insertions(+), 236 deletions(-) create mode 100644 packages/core/src/utils/device.test.ts create mode 100644 packages/core/src/utils/device.ts create mode 100644 packages/ui/src/components/ConnectModal/ConnectOptions.tsx create mode 100644 packages/ui/src/components/ConnectModal/WalletView.tsx create mode 100644 packages/ui/src/hooks/useAnimatedViews.ts create mode 100644 packages/ui/src/hooks/useWindowSize.ts create mode 100644 packages/ui/src/utils/debounce.ts diff --git a/packages/core/src/connectors/base.ts b/packages/core/src/connectors/base.ts index 59e88c8..1cf780f 100644 --- a/packages/core/src/connectors/base.ts +++ b/packages/core/src/connectors/base.ts @@ -1,5 +1,6 @@ import type {Account, Chain, Signer} from '../types'; import { EventEmitter } from 'eventemitter3'; +import { ConnectorLinks } from '../types' /** * base connector abstract class @@ -24,6 +25,7 @@ export abstract class BaseConnector extends EventEmitter { */ abstract readonly icon?: string; + readonly links: ConnectorLinks = {}; /** * store the current connected accounts. * subclasses are responsible for maintaining this list when connecting and updating accounts. diff --git a/packages/core/src/connectors/common.ts b/packages/core/src/connectors/common.ts index 5101b7b..7500e78 100644 --- a/packages/core/src/connectors/common.ts +++ b/packages/core/src/connectors/common.ts @@ -3,17 +3,20 @@ import type { Account, Signer } from '../types'; import { mapInjectedAccounts } from '../utils' import { Injected, InjectedAccount } from 'dedot/types' import { stringToHex } from 'dedot/utils' +import { ConnectorLinks } from '../types' export interface CommonConnectorOptions { id: string; name: string; icon: string; + links: ConnectorLinks; } export class CommonConnector extends BaseConnector { readonly id: string; readonly name: string; readonly icon: string; + readonly links: ConnectorLinks; private unsubscribe: (() => void) | null = null; @@ -24,6 +27,7 @@ export class CommonConnector extends BaseConnector { this.id = options.id; this.name = options.name; this.icon = options.icon; + this.links = options.links; } public isInstalled(): boolean { diff --git a/packages/core/src/connectors/index.ts b/packages/core/src/connectors/index.ts index ec3f86b..65610fd 100644 --- a/packages/core/src/connectors/index.ts +++ b/packages/core/src/connectors/index.ts @@ -6,3 +6,4 @@ export { subwalletConnector } from './subwallet'; export { talismanConnector } from './talisman'; export { walletConnectConnector } from './walletconnect'; export { novaConnector } from './nova'; +export { novaMobileConnector } from './novaMobile' diff --git a/packages/core/src/connectors/nova.ts b/packages/core/src/connectors/nova.ts index bc8a0bd..13c98f9 100644 --- a/packages/core/src/connectors/nova.ts +++ b/packages/core/src/connectors/nova.ts @@ -1,18 +1,38 @@ import { novaSVG } from '../config/logos/generated' import { WalletConnectConnector } from './walletconnect' import type { Metadata } from '@walletconnect/universal-provider' +import { novaMobileConnector } from './novaMobile' +import { isMobileDevice } from '../utils' -interface WalletConnectConfig { +type WalletConnectConfig = { projectId: string; relayUrl?: string; metadata?: Metadata; } -export const novaConnector = (config: WalletConnectConfig) => { +type MobileOnlyConfig = { + mobileOnly: true; +} + +type NovaConnectorConfig = WalletConnectConfig | MobileOnlyConfig; + +export const novaConnector = (config: NovaConnectorConfig) => { + if ((config as MobileOnlyConfig).mobileOnly && !isMobileDevice()) { + throw new Error('Nova Wallet mobile connector cannot be used on desktop devices'); + } + + if ((config as MobileOnlyConfig).mobileOnly) { + throw new Error('Nova Wallet is not installed. Please install Nova Wallet to continue.'); + } + + if (isMobileDevice()) { + return novaMobileConnector(); + } + return new WalletConnectConnector({ id: 'nova', name: 'Nova Wallet', icon: novaSVG, - ...config + ...config as WalletConnectConfig, }); }; diff --git a/packages/core/src/connectors/novaMobile.ts b/packages/core/src/connectors/novaMobile.ts index bcf0c5c..45cf298 100644 --- a/packages/core/src/connectors/novaMobile.ts +++ b/packages/core/src/connectors/novaMobile.ts @@ -7,6 +7,9 @@ export class NovaMobileConnector extends CommonConnector { id: 'polkadot-js', name: 'Nova Wallet (Mobile)', icon: novaSVG, + links: { + deepLink: 'https://app.novawallet.io/open/dapp' + } }); } diff --git a/packages/core/src/connectors/polkadot-js.ts b/packages/core/src/connectors/polkadot-js.ts index 5c5f33e..3a29a79 100644 --- a/packages/core/src/connectors/polkadot-js.ts +++ b/packages/core/src/connectors/polkadot-js.ts @@ -6,5 +6,8 @@ export const polkadotjsConnector = () => { id: 'polkadot-js', name: 'Polkadot{.js}', icon: polkadotjsSVG, + links: { + browserExtension: 'https://polkadot.js.org/extension' + } }); } diff --git a/packages/core/src/connectors/polkagate.ts b/packages/core/src/connectors/polkagate.ts index 2ba0f73..d0c230d 100644 --- a/packages/core/src/connectors/polkagate.ts +++ b/packages/core/src/connectors/polkagate.ts @@ -6,5 +6,8 @@ export const polkagateConnector = () => { id: 'polkagate', name: 'Polkagate', icon: polkagateSVG, + links: { + browserExtension: 'https://chromewebstore.google.com/detail/polkagate-the-gateway-to/ginchbkmljhldofnbjabmeophlhdldgp' + } }); } diff --git a/packages/core/src/connectors/subwallet.ts b/packages/core/src/connectors/subwallet.ts index d3cbd3e..70977f1 100644 --- a/packages/core/src/connectors/subwallet.ts +++ b/packages/core/src/connectors/subwallet.ts @@ -6,5 +6,9 @@ export const subwalletConnector = () => { id: 'subwallet-js', name: 'SubWallet', icon: subwalletSVG, + links: { + browserExtension: 'https://chromewebstore.google.com/detail/subwallet-polkadot-wallet/onhogfjeacnfoofkfgppdlbmlmnplgbn', + deepLink: 'https://mobile.subwallet.app/browser', + } }) }; diff --git a/packages/core/src/connectors/talisman.ts b/packages/core/src/connectors/talisman.ts index 7e12677..96d1101 100644 --- a/packages/core/src/connectors/talisman.ts +++ b/packages/core/src/connectors/talisman.ts @@ -6,5 +6,8 @@ export const talismanConnector = () => { id: 'talisman', name: 'Talisman', icon: talismanSVG, + links: { + browserExtension: 'https://chromewebstore.google.com/detail/talisman-wallet/fijngjgcjhjmmpcmkeiomlglpeiijkld' + } }); } diff --git a/packages/core/src/types/connector.ts b/packages/core/src/types/connector.ts index b9aad83..7ad6c81 100644 --- a/packages/core/src/types/connector.ts +++ b/packages/core/src/types/connector.ts @@ -4,10 +4,16 @@ import type { Signer } from './signer'; import type { Chain } from './chain' import type { Metadata } from '@walletconnect/universal-provider' +export interface ConnectorLinks { + browserExtension?: string; + deepLink?: string; +} + export interface Connector extends EventEmitter { readonly id: string; readonly name: string; readonly icon: string; + readonly links: ConnectorLinks; isAvailable(): Promise; isInstalled: () => boolean; connect(appName: string, chains?: Chain[], targetChainId?: string): Promise>; diff --git a/packages/core/src/utils/device.test.ts b/packages/core/src/utils/device.test.ts new file mode 100644 index 0000000..2102e24 --- /dev/null +++ b/packages/core/src/utils/device.test.ts @@ -0,0 +1,100 @@ +import { describe, it, expect, beforeEach, afterEach } from 'vitest'; +import { isMobileDevice } from './device'; + +describe('isMobileDevice', () => { + let originalWindow: any; + let originalNavigator: any; + + beforeEach(() => { + originalWindow = globalThis.window; + originalNavigator = globalThis.navigator; + }); + + afterEach(() => { + Object.defineProperty(globalThis, 'window', { + value: originalWindow, + writable: true, + configurable: true, + }); + Object.defineProperty(globalThis, 'navigator', { + value: originalNavigator, + writable: true, + configurable: true, + }); + }); + + it('should return false when window is undefined', () => { + Object.defineProperty(globalThis, 'window', { + value: undefined, + writable: true, + configurable: true, + }); + expect(isMobileDevice()).toBe(false); + }); + + it('should return false when navigator is undefined', () => { + Object.defineProperty(globalThis, 'navigator', { + value: undefined, + writable: true, + configurable: true, + }); + expect(isMobileDevice()).toBe(false); + }); + + it('should return true for mobile user agents', () => { + const mockUserAgents = [ + 'Mozilla/5.0 (iPhone; CPU iPhone OS 14_0 like Mac OS X)', + 'Mozilla/5.0 (iPad; CPU OS 14_0 like Mac OS X)', + 'Mozilla/5.0 (Linux; Android 10; SM-G960U)', + 'Mozilla/5.0 (Linux; U; Android 4.0.3; ko-kr; LG-L160L Build/IML74K) AppleWebkit/534.30', + 'Mozilla/5.0 (BlackBerry; U; BlackBerry 9900; en) AppleWebKit/534.11', + 'Opera/9.80 (Android; Opera Mini/32.0.2254/85)', + ]; + + mockUserAgents.forEach(userAgent => { + Object.defineProperty(globalThis, 'window', { + value: { navigator: { userAgent } }, + writable: true, + configurable: true, + }); + + Object.defineProperty(globalThis, 'navigator', { + value: { + userAgent, + toString: () => userAgent + }, + writable: true, + configurable: true, + }); + + expect(isMobileDevice()).toBe(true); + }); + }); + + it('should return false for desktop user agents', () => { + const mockUserAgents = [ + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)', + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)', + 'Mozilla/5.0 (X11; Linux x86_64)', + ]; + + mockUserAgents.forEach(userAgent => { + Object.defineProperty(globalThis, 'window', { + value: { navigator: { userAgent } }, + writable: true, + configurable: true, + }); + + Object.defineProperty(globalThis, 'navigator', { + value: { + userAgent, + toString: () => userAgent + }, + writable: true, + configurable: true, + }); + + expect(isMobileDevice()).toBe(false); + }); + }); +}); diff --git a/packages/core/src/utils/device.ts b/packages/core/src/utils/device.ts new file mode 100644 index 0000000..2566601 --- /dev/null +++ b/packages/core/src/utils/device.ts @@ -0,0 +1,8 @@ +export const isMobileDevice = () => { + if (typeof window !== 'undefined' && window.navigator && window.navigator.userAgent) { + return /android|webos|iphone|ipad|ipod|blackberry|iemobile|opera mini/i.test( + window.navigator.userAgent.toLowerCase() + ); + } + return false +}; diff --git a/packages/core/src/utils/index.ts b/packages/core/src/utils/index.ts index 4fed8c6..c2c0925 100644 --- a/packages/core/src/utils/index.ts +++ b/packages/core/src/utils/index.ts @@ -3,3 +3,5 @@ export * from './format'; export * from './address'; export * from './chain'; + +export * from './device'; diff --git a/packages/ui/src/components/AccountDetailsModal/MainView.tsx b/packages/ui/src/components/AccountDetailsModal/MainView.tsx index 8706967..21815da 100644 --- a/packages/ui/src/components/AccountDetailsModal/MainView.tsx +++ b/packages/ui/src/components/AccountDetailsModal/MainView.tsx @@ -69,19 +69,22 @@ export const MainView: React.FC = ({ }; return ( -
-
+
+
{items.map(i => ( {i.content} ))}
+
- - - Disconnect - +
+ + + Disconnect + +
); }; diff --git a/packages/ui/src/components/AccountDetailsModal/SwitchAccountView.tsx b/packages/ui/src/components/AccountDetailsModal/SwitchAccountView.tsx index 031c151..db4381e 100644 --- a/packages/ui/src/components/AccountDetailsModal/SwitchAccountView.tsx +++ b/packages/ui/src/components/AccountDetailsModal/SwitchAccountView.tsx @@ -22,7 +22,7 @@ export const SwitchAccountView: ViewComponent = ({ onBack }) => { }, [onBack]) return ( -
+
{accounts.map((acc) => ( { return ( -
+
) diff --git a/packages/ui/src/components/AccountDetailsModal/index.tsx b/packages/ui/src/components/AccountDetailsModal/index.tsx index fedb024..209e345 100644 --- a/packages/ui/src/components/AccountDetailsModal/index.tsx +++ b/packages/ui/src/components/AccountDetailsModal/index.tsx @@ -9,6 +9,7 @@ import { SwitchAccountView } from './SwitchAccountView'; import { SwitchChainView } from './SwitchChainView'; import { Copy } from '../Copy' import { formatAddress } from '@luno-kit/react' +import { useAnimatedViews } from '../../hooks/useAnimatedViews' export enum AccountModalView { main = 'main', @@ -23,56 +24,19 @@ export const AccountDetailsModal: React.FC = () => { const { data: balance } = useBalance({ address }); const activeConnector = useActiveConnector() - const [currentView, setCurrentView] = useState(AccountModalView.main); - const [isAnimating, setIsAnimating] = useState(false); - const containerRef = useRef(null); - const currentViewRef = useRef(null); - - const handleViewChange = useCallback((view: AccountModalView) => { - if (view === currentView || isAnimating) return; - - setIsAnimating(true); - - if (!containerRef.current) { - setCurrentView(view); - setIsAnimating(false); - return; - } - - const container = containerRef.current; - const currentHeight = container.offsetHeight; - - setCurrentView(view); - - // Wait for React to render new content, then animate height - requestAnimationFrame(() => { - if (!container || !currentViewRef.current) { - setIsAnimating(false); - return; - } - - const newHeight = currentViewRef.current.offsetHeight; - - container.animate([ - { height: currentHeight + 'px' }, - { height: newHeight + 'px' } - ], { - duration: 200, - easing: 'ease-out', - fill: 'forwards' - }).addEventListener('finish', () => { - setIsAnimating(false); - }); - }); - }, [currentView, isAnimating]); + const { + currentView, + containerRef, + currentViewRef, + handleViewChange, + resetView + } = useAnimatedViews({ initialView: AccountModalView.main }); const handleModalClose = useCallback(() => { close(); - setCurrentView(AccountModalView.main); - setIsAnimating(false); + resetView(); }, [close]); - const viewTitle = useMemo(() => { if (currentView === AccountModalView.switchAccount) return 'Switch Account'; if (currentView === AccountModalView.switchChain) return SwitchChainView.title; @@ -98,19 +62,14 @@ export const AccountDetailsModal: React.FC = () => { return ( { - if (!open) { - close(); - setCurrentView(AccountModalView.main); - } - }} + onOpenChange={handleModalClose} >
-
+
{currentView === AccountModalView.main ? (
{activeConnector?.icon && ( @@ -158,7 +117,7 @@ export const AccountDetailsModal: React.FC = () => {
-
diff --git a/packages/ui/src/components/ChainModal/index.tsx b/packages/ui/src/components/ChainModal/index.tsx index 688aca2..b46a4e1 100644 --- a/packages/ui/src/components/ChainModal/index.tsx +++ b/packages/ui/src/components/ChainModal/index.tsx @@ -11,7 +11,7 @@ export const ChainModal: React.FC = () => { return ( !open && close()}> -
+
{/* Placeholder to keep title centered */} @@ -21,7 +21,7 @@ export const ChainModal: React.FC = () => {
- +
diff --git a/packages/ui/src/components/ConnectButton/index.tsx b/packages/ui/src/components/ConnectButton/index.tsx index d6aed55..fbed47d 100644 --- a/packages/ui/src/components/ConnectButton/index.tsx +++ b/packages/ui/src/components/ConnectButton/index.tsx @@ -1,7 +1,7 @@ import React from 'react'; -import { useLunoWallet } from '../../hooks'; +import { useLunoWallet, useWindowSize } from '../../hooks'; import { cs } from '../../utils'; -import {ChainIcon} from '../ChainIcon' +import { ChainIcon } from '../ChainIcon' export const transitionClassName = 'transition-transform transition-[125] hover:scale-[1.03] transition-ease' @@ -34,6 +34,9 @@ export const ConnectButton: React.FC = ({ currentChain, activeConnector, } = useLunoWallet(); + const { width: windowWidth } = useWindowSize() + + const isLargeWindow = windowWidth && windowWidth > 768 if (isDisconnected || !isConnected || !activeConnector) { return ( @@ -71,7 +74,7 @@ export const ConnectButton: React.FC = ({ {(chainStatus === 'full' || chainStatus === 'icon') ? : null} - {(chainStatus === 'full' || chainStatus === 'name') && ( + {(chainStatus === 'full' || chainStatus === 'name') && isLargeWindow && ( {currentChain?.name || 'Unknown Chain'} )} @@ -87,7 +90,7 @@ export const ConnectButton: React.FC = ({ aria-label="Open account modal" > - {showBalance && ( + {showBalance && isLargeWindow && (
{balance === undefined ? (
@@ -103,6 +106,7 @@ export const ConnectButton: React.FC = ({
{accountStatus === 'full' && ( diff --git a/packages/ui/src/components/ConnectModal/ConnectOptions.tsx b/packages/ui/src/components/ConnectModal/ConnectOptions.tsx new file mode 100644 index 0000000..cece5ef --- /dev/null +++ b/packages/ui/src/components/ConnectModal/ConnectOptions.tsx @@ -0,0 +1,79 @@ +import React from 'react' +import { useConnectors, isMobileDevice } from '@luno-kit/react' +import type { Connector } from '@luno-kit/react' +import { cs } from '../../utils' + +interface Props { + onConnect: (connector: Connector) => Promise +} + +export const ConnectOptions = React.memo(({ onConnect }: Props) => { + const connectors = useConnectors(); + + if (isMobileDevice()) { + const filteredConnectors = connectors.filter(i => i.links.deepLink) + + return ( +
+ {filteredConnectors.map(i => ( + onConnect(i)}/> + ))} +
+ ) + } + + const installedConnectors = connectors.filter(c => c.isInstalled()) + const moreConnectors = connectors.filter(c => !c.isInstalled()) + + return ( +
+
+
Installed
+
+ {installedConnectors.map(i => ( + onConnect(i)}/> + ))} +
+
+ + {moreConnectors.length > 0 && ( +
+
More
+
+ {moreConnectors.map(i => ( + onConnect(i)}/> + ))} +
+
+ )} +
+ ) +}) + +interface ConnectorItemProps { + connector: Connector; + onConnect: () => void; +} + +const ConnectorItem: React.FC = React.memo(({connector, onConnect}) => { + return ( + + ); +}); diff --git a/packages/ui/src/components/ConnectModal/WalletView.tsx b/packages/ui/src/components/ConnectModal/WalletView.tsx new file mode 100644 index 0000000..7d56df8 --- /dev/null +++ b/packages/ui/src/components/ConnectModal/WalletView.tsx @@ -0,0 +1,93 @@ +import React from 'react' +import { DialogClose } from '../Dialog' +import { Close, Loading } from '../../assets/icons' +import { QRCode } from '../QRCode' +import { cs } from '../../utils' +import { transitionClassName } from '../ConnectButton' +import { SpiralAnimation } from '../SpiralAnimation' +import type { Connector } from '@luno-kit/react' +import { useConnect } from '@luno-kit/react' + +interface Props { + selectedConnector: Connector | null + onConnect: (connector: Connector) => Promise + qrCode?: string + isWide: boolean +} + +export const WalletView = React.memo(({ selectedConnector, onConnect, qrCode, isWide }: Props) => { + const showQRCode = selectedConnector?.hasConnectionUri(); + const { isError: connectError, isPending: isConnecting } = useConnect() + + return ( +
+ {isWide && ( +
+
+
+ + + +
+
+ )} + + +
+ {selectedConnector ? + showQRCode ? : ( + <> +
+ +
+

+ Opening {selectedConnector.name}... +

+

+ Confirm connection in the extension +

+ {isConnecting && ( + + )} + {!selectedConnector.isInstalled() && ( +

window.open(selectedConnector.links.browserExtension)} + className={'cursor-pointer pt-[16px] text-base leading-base text-accentColor font-bold text-center'}> + don‘t have {selectedConnector.name}? +

+ )} + {!isConnecting && connectError && selectedConnector.isInstalled() && ( + + )} + + ) : ( + <> +
+ +
+ +

+ New to wallets? +

+

+ Your gateway to the decentralized world Connect a wallet to get started +

+ + )} +
+ +
+
+ ) +}) diff --git a/packages/ui/src/components/ConnectModal/index.tsx b/packages/ui/src/components/ConnectModal/index.tsx index d6317df..6d8bbf8 100644 --- a/packages/ui/src/components/ConnectModal/index.tsx +++ b/packages/ui/src/components/ConnectModal/index.tsx @@ -1,13 +1,19 @@ -import React, {useState} from 'react'; -import { useConnect, useConnectors } from '@luno-kit/react'; +import React, {useMemo, useState} from 'react'; +import { useConnect, isMobileDevice } from '@luno-kit/react'; import { Dialog, DialogClose, DialogTitle, ModalSize } from '../Dialog'; import { cs } from '../../utils'; import { useConnectModal } from '../../providers/ModalContext' import type { Connector } from '@luno-kit/react' -import { Close, Loading } from '../../assets/icons' -import { SpiralAnimation } from '../SpiralAnimation' -import { transitionClassName } from '../ConnectButton' -import { QRCode } from '../QRCode' +import { Back, Close } from '../../assets/icons' +import { useWindowSize } from '../../hooks' +import { WalletView } from './WalletView' +import { useAnimatedViews } from '../../hooks/useAnimatedViews' +import { ConnectOptions } from './ConnectOptions' + +export enum ConnectModalView { + connectOptions = 'Connect Wallet', + walletView = 'walletView', +} export interface ConnectModalProps { size?: ModalSize; @@ -17,18 +23,22 @@ export const ConnectModal: React.FC = ({ size = 'wide', }) => { const { isOpen, close } = useConnectModal(); - const connectors = useConnectors(); - const { connectAsync, isError: connectError, isPending: isConnecting, reset: resetConnect } = useConnect() + const { connectAsync, reset: resetConnect } = useConnect() const [selectedConnector, setSelectedConnector] = useState(null) const [qrCode, setQrCode] = useState() - const showQRCode = selectedConnector?.hasConnectionUri(); - - const isWide = size === 'wide'; + const { width: windowWidth } = useWindowSize() - const installedConnectors = connectors.filter(c => c.isInstalled()) + const isLargeWindow = windowWidth && windowWidth > 768; + const isWide = !!(size === 'wide' && isLargeWindow); - const moreConnectors = connectors.filter(c => !c.isInstalled()) + const { + containerRef, + currentViewRef, + resetView, + handleViewChange, + currentView, + } = useAnimatedViews({ initialView: ConnectModalView.connectOptions }) const onQrCode = async (connector: Connector) => { const uri = await connector.getConnectionUri() @@ -37,6 +47,12 @@ export const ConnectModal: React.FC = ({ } const handleConnect = async (connector: Connector) => { + if (isMobileDevice() && connector.links.deepLink) { + window.location.href = `${connector.links.deepLink}?url=${window.location.href}` + return + } + + handleViewChange(ConnectModalView.walletView) setSelectedConnector(connector) setQrCode(undefined) if (connector.hasConnectionUri()) { @@ -49,139 +65,68 @@ export const ConnectModal: React.FC = ({ const _onOpenChange = (open: boolean) => { !open && close() resetConnect() + resetView() setSelectedConnector(null) setQrCode(undefined) } + const viewComponents = useMemo(() => { + return { + [ConnectModalView.connectOptions]: , + [ConnectModalView.walletView]: , + } + }, [isWide, selectedConnector, qrCode, handleConnect]) + return ( -
+
-
- - Connect Wallet - + )}> +
+ {currentView === ConnectModalView.connectOptions ? ( + + Connect Wallet + + ) : ( + <> + + + {selectedConnector?.hasConnectionUri() && 'Scan by your phone'} + + + )} + {!isWide && ( - + )}
- -
-
-
Installed
-
- {installedConnectors.map(i => ( - handleConnect(i)}/> - ))} -
+
+
+ {viewComponents[currentView]}
- - {moreConnectors.length > 0 && ( -
-
More
-
- {moreConnectors.map(i => ( - handleConnect(i)}/> - ))} -
-
- )}
- {isWide && ( -
-
-
-
- - - -
-
- - -
- {selectedConnector ? - showQRCode ? : ( - <> -
- -
-

- Opening {selectedConnector.name}... -

-

- Confirm connection in the extension -

- {isConnecting && ( - - )} - { !isConnecting && connectError && ( - - )} - - ) : ( - <> -
- -
- -

- New to wallets? -

-

- Your gateway to the decentralized world Connect a wallet to get started -

- - )} -
- -
-
- )} + {isWide && }
); }; - -interface ConnectorItemProps { - connector: Connector; - onConnect: () => void; -} - -const ConnectorItem: React.FC = React.memo(({ connector, onConnect }) => { - return ( - - ); -}); diff --git a/packages/ui/src/components/Dialog/index.tsx b/packages/ui/src/components/Dialog/index.tsx index c1573c3..a911cac 100644 --- a/packages/ui/src/components/Dialog/index.tsx +++ b/packages/ui/src/components/Dialog/index.tsx @@ -43,10 +43,17 @@ const DialogRoot: React.FC = ({ })} @@ -57,10 +64,10 @@ const DialogRoot: React.FC = ({ ); }; -const DialogTitleWrapper: React.FC = ({ children, className }) => +const DialogTitleWrapper: React.FC = ({ children, className }) => React.createElement(DialogPrimitive.Title as any, { className }, children); -const DialogCloseWrapper: React.FC = ({ children, className, onClick }) => +const DialogCloseWrapper: React.FC = ({ children, className, onClick }) => React.createElement(DialogPrimitive.Close as any, { className, onClick }, children); export const Dialog = DialogRoot; diff --git a/packages/ui/src/hooks/cssVariableInject.ts b/packages/ui/src/hooks/cssVariableInject.ts index d6916a4..ec9e965 100644 --- a/packages/ui/src/hooks/cssVariableInject.ts +++ b/packages/ui/src/hooks/cssVariableInject.ts @@ -13,10 +13,10 @@ const ALL_THEME_VARS = [ '--color-modalBackground', '--color-modalBackdrop', '--color-modalBorder', '--color-modalText', '--color-modalTextSecondary', '--color-modalControlButtonBackgroundHover', '--color-modalControlButtonText', '--color-success', '--color-successForeground', '--color-warning', '--color-warningForeground', - '--color-error', '--color-errorForeground', '--color-info', '--color-infoForeground', '--color-skeleton', + '--color-error', '--color-errorForeground', '--color-info', '--color-infoForeground', '--color-skeleton', '--color-cutLine', '--font-body', '--font-heading', '--font-mono', '--radius-walletSelectItem', '--radius-connectButton', '--radius-modalControlButton', '--radius-accountActionItem', - '--radius-accountSelectItem', '--radius-currentNetworkButton', '--radius-networkSelectItem', '--radius-modal', + '--radius-accountSelectItem', '--radius-currentNetworkButton', '--radius-networkSelectItem', '--radius-modal', '--radius-modalMobile', '--shadow-button', '--shadow-modal', '--blur-modalOverlay', ]; @@ -30,9 +30,9 @@ interface ThemeInfo { export const useCSSVariableInjection = (themeInfo: ThemeInfo, themeMode: ThemeMode) => { useEffect(() => { if (typeof window === 'undefined') return; - + const root = document.documentElement; - + if (themeInfo.type === 'complete' && themeInfo.completeTheme) { // Complete custom theme: inject all variables and remove data-theme Object.entries(themeInfo.completeTheme.colors).forEach(([key, value]) => { @@ -40,38 +40,38 @@ export const useCSSVariableInjection = (themeInfo: ThemeInfo, themeMode: ThemeMo root.style.setProperty(`--color-${key}`, value); } }); - + Object.entries(themeInfo.completeTheme.fonts).forEach(([key, value]) => { if (value) { root.style.setProperty(`--font-${key}`, value); } }); - + Object.entries(themeInfo.completeTheme.radii).forEach(([key, value]) => { if (value) { root.style.setProperty(`--radius-${key}`, value); } }); - + Object.entries(themeInfo.completeTheme.shadows).forEach(([key, value]) => { if (value) { root.style.setProperty(`--shadow-${key}`, value); } }); - + Object.entries(themeInfo.completeTheme.blurs).forEach(([key, value]) => { if (value) { root.style.setProperty(`--blur-${key}`, value); } }); - + // Remove data-theme attribute for complete custom themes root.removeAttribute('data-theme'); - + } else if (themeInfo.type === 'partial' && themeInfo.partialOverrides) { // Partial override: KEEP data-theme and inject only overridden variables root.setAttribute('data-theme', themeMode); - + // Only clear and inject if there are actual overrides const hasOverrides = Object.keys(themeInfo.partialOverrides).length > 0; if (hasOverrides) { @@ -79,7 +79,7 @@ export const useCSSVariableInjection = (themeInfo: ThemeInfo, themeMode: ThemeMo ALL_THEME_VARS.forEach(varName => { root.style.removeProperty(varName); }); - + // Inject only the overridden variables if (themeInfo.partialOverrides.colors) { Object.entries(themeInfo.partialOverrides.colors).forEach(([key, value]) => { @@ -88,7 +88,7 @@ export const useCSSVariableInjection = (themeInfo: ThemeInfo, themeMode: ThemeMo } }); } - + if (themeInfo.partialOverrides.fonts) { Object.entries(themeInfo.partialOverrides.fonts).forEach(([key, value]) => { if (value) { @@ -96,7 +96,7 @@ export const useCSSVariableInjection = (themeInfo: ThemeInfo, themeMode: ThemeMo } }); } - + if (themeInfo.partialOverrides.radii) { Object.entries(themeInfo.partialOverrides.radii).forEach(([key, value]) => { if (value) { @@ -104,7 +104,7 @@ export const useCSSVariableInjection = (themeInfo: ThemeInfo, themeMode: ThemeMo } }); } - + if (themeInfo.partialOverrides.shadows) { Object.entries(themeInfo.partialOverrides.shadows).forEach(([key, value]) => { if (value) { @@ -112,7 +112,7 @@ export const useCSSVariableInjection = (themeInfo: ThemeInfo, themeMode: ThemeMo } }); } - + if (themeInfo.partialOverrides.blurs) { Object.entries(themeInfo.partialOverrides.blurs).forEach(([key, value]) => { if (value) { @@ -121,15 +121,15 @@ export const useCSSVariableInjection = (themeInfo: ThemeInfo, themeMode: ThemeMo }); } } - + } else { // Default theme: just set data-theme and clear custom variables root.setAttribute('data-theme', themeMode); - + // Clear any previously injected custom variables ALL_THEME_VARS.forEach(varName => { root.style.removeProperty(varName); }); } }, [themeInfo, themeMode]); -}; \ No newline at end of file +}; diff --git a/packages/ui/src/hooks/index.ts b/packages/ui/src/hooks/index.ts index 53b49ac..a78346a 100644 --- a/packages/ui/src/hooks/index.ts +++ b/packages/ui/src/hooks/index.ts @@ -1 +1,2 @@ export * from './useConnectButton' +export * from './useWindowSize' diff --git a/packages/ui/src/hooks/useAnimatedViews.ts b/packages/ui/src/hooks/useAnimatedViews.ts new file mode 100644 index 0000000..6762ff7 --- /dev/null +++ b/packages/ui/src/hooks/useAnimatedViews.ts @@ -0,0 +1,78 @@ +import React, { useCallback, useState, useRef } from 'react'; + +interface UseAnimatedViewsProps { + initialView: T; + animationDuration?: number; + animationEasing?: string; +} + +interface UseAnimatedViewsReturn { + currentView: T; + isAnimating: boolean; + containerRef: React.RefObject; + currentViewRef: React.RefObject; + handleViewChange: (view: T) => void; + resetView: () => void; +} + +export function useAnimatedViews({ + initialView, + animationDuration = 200, + animationEasing = 'ease-out' +}: UseAnimatedViewsProps): UseAnimatedViewsReturn { + const [currentView, setCurrentView] = useState(initialView); + const [isAnimating, setIsAnimating] = useState(false); + const containerRef = useRef(null); + const currentViewRef = useRef(null); + + const handleViewChange = useCallback((view: T) => { + if (view === currentView || isAnimating) return; + + setIsAnimating(true); + + if (!containerRef.current) { + setCurrentView(view); + setIsAnimating(false); + return; + } + + const container = containerRef.current; + const currentHeight = container.offsetHeight; + + setCurrentView(view); + + requestAnimationFrame(() => { + if (!container || !currentViewRef.current) { + setIsAnimating(false); + return; + } + + const newHeight = currentViewRef.current.offsetHeight; + + container.animate([ + { height: currentHeight + 'px' }, + { height: newHeight + 'px' } + ], { + duration: animationDuration, + easing: animationEasing, + fill: 'forwards' + }).addEventListener('finish', () => { + setIsAnimating(false); + }); + }); + }, [currentView, isAnimating, animationDuration, animationEasing]); + + const resetView = useCallback(() => { + setCurrentView(initialView); + setIsAnimating(false); + }, [initialView]); + + return { + currentView, + isAnimating, + containerRef, + currentViewRef, + handleViewChange, + resetView + }; +} diff --git a/packages/ui/src/hooks/useWindowSize.ts b/packages/ui/src/hooks/useWindowSize.ts new file mode 100644 index 0000000..325964f --- /dev/null +++ b/packages/ui/src/hooks/useWindowSize.ts @@ -0,0 +1,26 @@ +import { useEffect, useState } from 'react'; +import { debounce } from '../utils'; + +export const useWindowSize = () => { + const [windowSize, setWindowSize] = useState<{ + width: number | undefined; + height: number | undefined; + }>({ + height: undefined, + width: undefined, + }); + + useEffect(() => { + const handleResize = debounce(() => { + setWindowSize({ + height: window.innerHeight, + width: window.innerWidth, + }); + }, 500); + window.addEventListener('resize', handleResize); + handleResize(); + return () => window.removeEventListener('resize', handleResize); + }, []); + + return windowSize; +}; diff --git a/packages/ui/src/styles/animations.css b/packages/ui/src/styles/animations.css index a896bed..346c1cf 100644 --- a/packages/ui/src/styles/animations.css +++ b/packages/ui/src/styles/animations.css @@ -50,6 +50,15 @@ } } +@keyframes slide-up { + from { + transform: translateY(100%); + } + to { + transform: translateY(0); + } +} + @keyframes shimmer { 0% { background-position: 100% 0; } 100% { background-position: -100% 0; } diff --git a/packages/ui/src/styles/base.css b/packages/ui/src/styles/base.css index 1dabe96..11f91d7 100644 --- a/packages/ui/src/styles/base.css +++ b/packages/ui/src/styles/base.css @@ -10,34 +10,34 @@ --color-modalBorder: var(--color-modalBorder); --color-modalControlButtonBackgroundHover: var(--color-modalControlButtonBackgroundHover); --color-modalControlButtonText: var(--color-modalControlButtonText); - + --color-connectButtonBackground: var(--color-connectButtonBackground); --color-connectButtonInnerBackground: var(--color-connectButtonInnerBackground); --color-connectButtonText: var(--color-connectButtonText); - + --color-walletSelectItemBackground: var(--color-walletSelectItemBackground); --color-walletSelectItemBackgroundHover: var(--color-walletSelectItemBackgroundHover); --color-walletSelectItemText: var(--color-walletSelectItemText); - + --color-accountActionItemBackground: var(--color-accountActionItemBackground); --color-accountActionItemBackgroundHover: var(--color-accountActionItemBackgroundHover); --color-accountActionItemText: var(--color-accountActionItemText); - + --color-accountSelectItemBackground: var(--color-accountSelectItemBackground); --color-accountSelectItemBackgroundHover: var(--color-accountSelectItemBackgroundHover); --color-accountSelectItemText: var(--color-accountSelectItemText); - + --color-currentNetworkButtonBackground: var(--color-currentNetworkButtonBackground); --color-currentNetworkButtonText: var(--color-currentNetworkButtonText); - + --color-networkSelectItemBackground: var(--color-networkSelectItemBackground); --color-networkSelectItemBackgroundHover: var(--color-networkSelectItemBackgroundHover); --color-networkSelectItemText: var(--color-networkSelectItemText); - + --color-navigationButtonBackground: var(--color-navigationButtonBackground); --color-separatorLine: var(--color-separatorLine); --color-skeleton: var(--color-skeleton); - + --color-success: var(--color-success); --color-successForeground: var(--color-successForeground); --color-warning: var(--color-warning); @@ -46,7 +46,9 @@ --color-errorForeground: var(--color-errorForeground); --color-info: var(--color-info); --color-infoForeground: var(--color-infoForeground); - + + --color-cutLine: var(--color-cutLine); + /* Radius utilities */ --radius-walletSelectItem: var(--radius-walletSelectItem); --radius-connectButton: var(--radius-connectButton); @@ -56,14 +58,15 @@ --radius-currentNetworkButton: var(--radius-currentNetworkButton); --radius-networkSelectItem: var(--radius-networkSelectItem); --radius-modal: var(--radius-modal); - + --radius-modalMobile: var(--radius-modalMobile); + /* Shadow utilities */ --shadow-button: var(--shadow-button); --shadow-modal: var(--shadow-modal); - + /* Blurs */ --blur-modalOverlay: var(--blur-modalOverlay); - + /* Typography */ --text-xs: 12px; --leading-xs: 18px; @@ -104,7 +107,7 @@ /* Default Light Theme Variables */ :root { - + /* Fonts */ --font-body: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; @@ -120,6 +123,7 @@ --radius-currentNetworkButton: 6px; --radius-networkSelectItem: 6px; --radius-modal: 6px; + --radius-modalMobile: 24px; /* Shadows */ --shadow-button: 0px 10px 20px 0px rgba(0,0,0,0.1); @@ -167,6 +171,7 @@ --color-info: #3b82f6; --color-infoForeground: #ffffff; --color-skeleton: rgba(0,0,0,0.08); + --color-cutLine: #0000000d; } /* Dark Theme Variables */ @@ -209,6 +214,7 @@ --color-info: #3b82f6; --color-infoForeground: #ffffff; --color-skeleton: rgba(255,255,255,0.09); + --color-cutLine: #4a4b58bf; /* Fonts */ --font-body: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; @@ -224,6 +230,7 @@ --radius-currentNetworkButton: 6px; --radius-networkSelectItem: 6px; --radius-modal: 6px; + --radius-modalMobile: 24px; /* Shadows */ --shadow-button: 0px 4px 12px rgba(0, 0, 0, 0.3); diff --git a/packages/ui/src/utils/debounce.ts b/packages/ui/src/utils/debounce.ts new file mode 100644 index 0000000..8c748d8 --- /dev/null +++ b/packages/ui/src/utils/debounce.ts @@ -0,0 +1,14 @@ +export function debounce(fn: () => void, ms: number) { + let timer: NodeJS.Timeout | null; + + return () => { + if (timer) { + clearTimeout(timer as number); + } + + timer = setTimeout(() => { + timer = null; + fn(); + }, ms); + }; +} diff --git a/packages/ui/src/utils/index.ts b/packages/ui/src/utils/index.ts index ef6568c..1cfb03e 100644 --- a/packages/ui/src/utils/index.ts +++ b/packages/ui/src/utils/index.ts @@ -1 +1,2 @@ export * from './cs' +export * from './debounce' From 8fdd357c6ffdab00283680a85df44c79e28c2aa9 Mon Sep 17 00:00:00 2001 From: WBH <48749219+wbh1328551759@users.noreply.github.com> Date: Tue, 5 Aug 2025 17:07:15 +0800 Subject: [PATCH 07/45] fix(ui): fix view switching logic in ConnectModal component (#30) --- packages/ui/src/components/ConnectModal/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/ui/src/components/ConnectModal/index.tsx b/packages/ui/src/components/ConnectModal/index.tsx index 6d8bbf8..d0bc074 100644 --- a/packages/ui/src/components/ConnectModal/index.tsx +++ b/packages/ui/src/components/ConnectModal/index.tsx @@ -52,7 +52,7 @@ export const ConnectModal: React.FC = ({ return } - handleViewChange(ConnectModalView.walletView) + !isWide && handleViewChange(ConnectModalView.walletView) setSelectedConnector(connector) setQrCode(undefined) if (connector.hasConnectionUri()) { From a43a43c83bbbe105ffe03273f7f1fd7acea88f6d Mon Sep 17 00:00:00 2001 From: WBH <48749219+wbh1328551759@users.noreply.github.com> Date: Tue, 5 Aug 2025 17:13:45 +0800 Subject: [PATCH 08/45] Fix/connect modal (#32) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Develop (#29) * update README and fix GitHub Actions * Chore/UI work (#24) * fix(ui): resolve Radix UI Dialog TypeScript errors - Add proper type interfaces for Dialog components - Fix ModalContext missing closeConnectModal method - Handle @tanstack/react-query v5 API changes - Use React.createElement to bypass Radix UI type restrictions * feat(ui): add new theme system with light/dark presets and CSS variables * fix: resolve chain modal issues and optimize theme system * feat: save current theme system state before refactoring * fix: resolve UI build issues and restore theme system - Fix base.css theme syntax to use @theme inline with var() instead of theme() - Restore missing dark theme variables (spacing, typography, fonts, radii, blurs) - Update theme context structure and remove defaultTheme.ts - Update LunoKitProvider to use new theme system - Fix PostCSS configuration for Tailwind CSS v4 * feat: remove toggleTheme and add auto system theme following - Remove toggleTheme function from ThemeProvider - Add useSystemTheme hook to detect system color scheme - Add auto-following system theme when both light and dark are provided - Add isAutoMode flag to indicate auto-following state - Update example app to use setThemeMode instead of toggleTheme - Maintain backward compatibility with existing theme system * feat: optimize theme persistence logic - only persist when user has theme choice * fix: remove defaultTheme from LunoKitProvider to match ThemeProvider interface * feat(theme): remove localStorage persistence and fix dark theme logic - Remove theme localStorage persistence - Fix dark theme not applying with theme={{dark:{}}} - Simplify theme initialization and switching logic * refactor(ui): standardize design │ │ tokens and remove style duplicates * feat(ui): Modify the rounded property of some components. * refactor(AccountDetailsModal): simplify view transitions to height-only animation * refactor(ui):Optimize code structure, remove unused code * feat(theme): enhance theme system with auto-mode and user preferences - Add autoMode support for system theme following - Implement localStorage persistence for user choices - Add setThemeChoice API for explicit user actions - Remove unused dependencies (postcss-import) - Clean up redundant size props and methods - Fix hook functionality and simplify API - Improve theme initialization priority logic * refactor(ui): replace localStorage with config.storage in theme system * refactor(theme): optimize theme system and eliminate flashing - Extract CSS variable injection logic to separate file (cssVariableInject.ts) - Optimize initial theme state calculation to prevent flashing - Simplify theme preference interface (isAuto, preferredTheme) - Fix system theme detection with proper initialization - Remove redundant state management and async loading * refactor(theme): replace LunoStorage with localStorage for theme persistence * feat(examples): Remove auto mode label --------- Co-authored-by: “Gintma” * fix bug in walletconnect * fix(core): fix disconnect of walletconnectConnector * fix(ui): fix openConnectModal & refresh qrcode in ConnectModal * Chore/UI work (#25) * fix(ui): resolve Radix UI Dialog TypeScript errors - Add proper type interfaces for Dialog components - Fix ModalContext missing closeConnectModal method - Handle @tanstack/react-query v5 API changes - Use React.createElement to bypass Radix UI type restrictions * feat(ui): add new theme system with light/dark presets and CSS variables * fix: resolve chain modal issues and optimize theme system * feat: save current theme system state before refactoring * fix: resolve UI build issues and restore theme system - Fix base.css theme syntax to use @theme inline with var() instead of theme() - Restore missing dark theme variables (spacing, typography, fonts, radii, blurs) - Update theme context structure and remove defaultTheme.ts - Update LunoKitProvider to use new theme system - Fix PostCSS configuration for Tailwind CSS v4 * feat: remove toggleTheme and add auto system theme following - Remove toggleTheme function from ThemeProvider - Add useSystemTheme hook to detect system color scheme - Add auto-following system theme when both light and dark are provided - Add isAutoMode flag to indicate auto-following state - Update example app to use setThemeMode instead of toggleTheme - Maintain backward compatibility with existing theme system * feat: optimize theme persistence logic - only persist when user has theme choice * fix: remove defaultTheme from LunoKitProvider to match ThemeProvider interface * feat(theme): remove localStorage persistence and fix dark theme logic - Remove theme localStorage persistence - Fix dark theme not applying with theme={{dark:{}}} - Simplify theme initialization and switching logic * refactor(ui): standardize design │ │ tokens and remove style duplicates * feat(ui): Modify the rounded property of some components. * refactor(AccountDetailsModal): simplify view transitions to height-only animation * refactor(ui):Optimize code structure, remove unused code * feat(theme): enhance theme system with auto-mode and user preferences - Add autoMode support for system theme following - Implement localStorage persistence for user choices - Add setThemeChoice API for explicit user actions - Remove unused dependencies (postcss-import) - Clean up redundant size props and methods - Fix hook functionality and simplify API - Improve theme initialization priority logic * refactor(ui): replace localStorage with config.storage in theme system * refactor(theme): optimize theme system and eliminate flashing - Extract CSS variable injection logic to separate file (cssVariableInject.ts) - Optimize initial theme state calculation to prevent flashing - Simplify theme preference interface (isAuto, preferredTheme) - Fix system theme detection with proper initialization - Remove redundant state management and async loading * refactor(theme): replace LunoStorage with localStorage for theme persistence * feat(examples): Remove auto mode label * feat: implement QR code skeleton loading state --------- Co-authored-by: “Gintma” * Chore/ci cd readme (#27) * chore: update README and fix GitHub Actions * chore: update working-directory for pnpm audit --------- Co-authored-by: Gintma * Feat/mobile UI (#28) * feat(core): In novaConnector, add support for novaMobileConnector * feat(ui): Add "useWindowSize", optimize responsive design * feat(core): add links field with browserExtension & deepLink and add test code * feat(ui): enhance CSS styles with mobile responsiveness --------- Co-authored-by: Gintma --------- Co-authored-by: “Gintma” * fix(ui): fix view switching logic in ConnectModal component --------- Co-authored-by: “Gintma” From 947048f3fe4b443a961c57ba0ecf3dc7af541258 Mon Sep 17 00:00:00 2001 From: WBH <48749219+wbh1328551759@users.noreply.github.com> Date: Tue, 5 Aug 2025 20:09:43 +0800 Subject: [PATCH 09/45] fix(with-vite): fix undifined of Notification * fix(ui): fix view switching logic in ConnectModal component * fix(with-vite): fix undifined of Notification --- examples/with-vite/src/App.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/with-vite/src/App.tsx b/examples/with-vite/src/App.tsx index 0d6c468..889562b 100644 --- a/examples/with-vite/src/App.tsx +++ b/examples/with-vite/src/App.tsx @@ -39,7 +39,7 @@ const App: React.FC = () => { }); const showNotification = (title: string, message?: string) => { - if (Notification.permission === 'granted') { + if (Notification?.permission === 'granted') { new Notification(title, { body: message }); } else { alert(`${title}: ${message || ''}`); @@ -92,8 +92,8 @@ const App: React.FC = () => { }; useEffect(() => { - if (Notification.permission === 'default') { - Notification.requestPermission(); + if (Notification?.permission === 'default') { + Notification?.requestPermission(); } }, []); From 6ec04b01d4ea960fd87d6c92ea5964893656412a Mon Sep 17 00:00:00 2001 From: WBH <48749219+wbh1328551759@users.noreply.github.com> Date: Tue, 5 Aug 2025 20:22:19 +0800 Subject: [PATCH 10/45] fix(with-vite): Fix the reference of the Notification object to ensure that it is accessed through the window object when used. * fix(ui): fix view switching logic in ConnectModal component * fix(with-vite): fix undifined of Notification * fix(with-vite): Fix the reference of the Notification object to ensure that it is accessed through the window object when used. --- examples/with-vite/src/App.tsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/with-vite/src/App.tsx b/examples/with-vite/src/App.tsx index 889562b..bd8da7a 100644 --- a/examples/with-vite/src/App.tsx +++ b/examples/with-vite/src/App.tsx @@ -39,8 +39,8 @@ const App: React.FC = () => { }); const showNotification = (title: string, message?: string) => { - if (Notification?.permission === 'granted') { - new Notification(title, { body: message }); + if (window.Notification?.permission === 'granted') { + new window.Notification(title, { body: message }); } else { alert(`${title}: ${message || ''}`); } @@ -92,8 +92,8 @@ const App: React.FC = () => { }; useEffect(() => { - if (Notification?.permission === 'default') { - Notification?.requestPermission(); + if (window.Notification?.permission === 'default') { + window.Notification?.requestPermission(); } }, []); From 4d342601254be5b4d20a8fde237bef277428099d Mon Sep 17 00:00:00 2001 From: WBH <48749219+wbh1328551759@users.noreply.github.com> Date: Wed, 6 Aug 2025 12:35:56 +0800 Subject: [PATCH 11/45] fix(ui): fix connect in mobile * fix(ui): fix view switching logic in ConnectModal component * fix(with-vite): fix undifined of Notification * fix(with-vite): Fix the reference of the Notification object to ensure that it is accessed through the window object when used. * fix(ui): fix connect in mobile --- packages/ui/src/components/ConnectModal/index.tsx | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/packages/ui/src/components/ConnectModal/index.tsx b/packages/ui/src/components/ConnectModal/index.tsx index d0bc074..64a7421 100644 --- a/packages/ui/src/components/ConnectModal/index.tsx +++ b/packages/ui/src/components/ConnectModal/index.tsx @@ -48,8 +48,14 @@ export const ConnectModal: React.FC = ({ const handleConnect = async (connector: Connector) => { if (isMobileDevice() && connector.links.deepLink) { - window.location.href = `${connector.links.deepLink}?url=${window.location.href}` - return + try { + await connectAsync({ connectorId: connector.id }); + _onOpenChange(false); + return; + } catch (error) { + window.location.href = `${connector.links.deepLink}?url=${window.location.href}`; + return; + } } !isWide && handleViewChange(ConnectModalView.walletView) From 2f3ed41b3b5398903524674201a525d44ce90193 Mon Sep 17 00:00:00 2001 From: WBH <48749219+wbh1328551759@users.noreply.github.com> Date: Thu, 7 Aug 2025 14:31:06 +0800 Subject: [PATCH 12/45] Fix/create api (#39) * feat(react): migrate from DedotClient to LegacyClient * fix(ui): fix theme type definitions and improve prop interface * fix(ui): fix css style in ConnectButton * feat(core): add browser download link in novaConnector * feat(ui): fix ConnectModal responsive view switching and enhance WalletView QR code features --- packages/core/src/connectors/nova.ts | 3 ++ packages/core/src/connectors/walletconnect.ts | 4 ++ packages/core/src/types/connector.ts | 1 + packages/react/src/context/LunoContext.ts | 4 +- .../react/src/context/LunoProvider.test.tsx | 5 +- packages/react/src/context/LunoProvider.tsx | 2 +- packages/react/src/hooks/useApi.ts | 4 +- packages/react/src/hooks/useBalance.ts | 6 +-- .../react/src/hooks/useGenesisHash.test.ts | 9 ++-- packages/react/src/hooks/useGenesisHash.ts | 36 ++++++-------- packages/react/src/hooks/useRuntimeVersion.ts | 6 +-- packages/react/src/hooks/useSubscription.ts | 8 ++-- packages/react/src/test-utils/mocks.ts | 10 ++-- packages/react/src/types/state.ts | 6 +-- packages/react/src/utils/createApi.test.ts | 12 ++--- packages/react/src/utils/createApi.ts | 8 ++-- .../react/src/utils/dispatchError.test.ts | 4 +- packages/react/src/utils/dispatchError.ts | 4 +- .../ui/src/components/ConnectButton/index.tsx | 9 ++-- .../components/ConnectModal/WalletView.tsx | 27 +++++++++-- .../ui/src/components/ConnectModal/index.tsx | 8 +++- packages/ui/src/components/Copy/index.tsx | 8 +++- packages/ui/src/components/Dialog/index.tsx | 4 +- ...leInject.ts => useCSSVariableInjection.ts} | 0 packages/ui/src/providers/LunoKitProvider.tsx | 20 ++++---- packages/ui/src/styles/base.css | 9 ++-- packages/ui/src/theme/context.tsx | 48 ++++++++++--------- packages/ui/src/theme/types.ts | 14 +++--- 28 files changed, 160 insertions(+), 119 deletions(-) rename packages/ui/src/hooks/{cssVariableInject.ts => useCSSVariableInjection.ts} (100%) diff --git a/packages/core/src/connectors/nova.ts b/packages/core/src/connectors/nova.ts index 13c98f9..cc5096e 100644 --- a/packages/core/src/connectors/nova.ts +++ b/packages/core/src/connectors/nova.ts @@ -33,6 +33,9 @@ export const novaConnector = (config: NovaConnectorConfig) => { id: 'nova', name: 'Nova Wallet', icon: novaSVG, + links: { + browserExtension: 'https://novawallet.io', + }, ...config as WalletConnectConfig, }); }; diff --git a/packages/core/src/connectors/walletconnect.ts b/packages/core/src/connectors/walletconnect.ts index ee51ef2..db1871f 100644 --- a/packages/core/src/connectors/walletconnect.ts +++ b/packages/core/src/connectors/walletconnect.ts @@ -4,11 +4,13 @@ import { SessionTypes } from '@walletconnect/types' import type { Account, Chain, Signer, WalletConnectConnectorOptions } from '../types'; import { walletconnectSVG } from '../config/logos/generated'; import { SignerResult, SignerPayloadJSON } from 'dedot/types' +import {ConnectorLinks} from '../types' export class WalletConnectConnector extends BaseConnector { readonly id: string; readonly name: string; readonly icon: string; + readonly links: ConnectorLinks; private provider?: IUniversalProvider; private projectId: string; @@ -22,6 +24,8 @@ export class WalletConnectConnector extends BaseConnector { super(); this.id = options.id || 'walletconnect'; this.name = options.name || 'WalletConnect'; + this.links = options.links || {}; + this.icon = options.icon || walletconnectSVG; this.projectId = options.projectId; diff --git a/packages/core/src/types/connector.ts b/packages/core/src/types/connector.ts index 7ad6c81..ca0be17 100644 --- a/packages/core/src/types/connector.ts +++ b/packages/core/src/types/connector.ts @@ -41,4 +41,5 @@ export interface WalletConnectConnectorOptions { projectId: string; relayUrl?: string; metadata?: Metadata; + links?: ConnectorLinks; } diff --git a/packages/react/src/context/LunoContext.ts b/packages/react/src/context/LunoContext.ts index 84eee83..bb211e8 100644 --- a/packages/react/src/context/LunoContext.ts +++ b/packages/react/src/context/LunoContext.ts @@ -1,5 +1,5 @@ import React from 'react'; -import type { DedotClient } from 'dedot'; +import type { LegacyClient } from 'dedot'; import type { Chain, Config, Connector, Account } from '@luno-kit/core'; import type { ConnectionStatus } from '../types'; import type { HexString } from 'dedot/utils' @@ -13,7 +13,7 @@ export interface LunoContextState { setAccount: (accountOrAddress?: Account | HexString) => void; currentChainId?: string; currentChain?: Chain; - currentApi?: DedotClient; + currentApi?: LegacyClient; isApiReady: boolean; apiError: Error | null; diff --git a/packages/react/src/context/LunoProvider.test.tsx b/packages/react/src/context/LunoProvider.test.tsx index b07aa8c..fb0f687 100644 --- a/packages/react/src/context/LunoProvider.test.tsx +++ b/packages/react/src/context/LunoProvider.test.tsx @@ -35,6 +35,9 @@ const mockApi = { ss58Prefix: 42, }, }, + runtimeVersion: { + specName: 'Test Chain' + }, }; class DummyConnector extends BaseConnector { @@ -75,7 +78,7 @@ const mockStore: LunoState = { setAccount: vi.fn().mockResolvedValue(undefined), currentChainId: '0x123', config: undefined, - currentApi: null, + currentApi: undefined, connect: vi.fn().mockResolvedValue(undefined), status: ConnectionStatus.Disconnected, activeConnector: undefined, diff --git a/packages/react/src/context/LunoProvider.tsx b/packages/react/src/context/LunoProvider.tsx index fc60df4..72147ee 100644 --- a/packages/react/src/context/LunoProvider.tsx +++ b/packages/react/src/context/LunoProvider.tsx @@ -70,7 +70,7 @@ export const LunoProvider: React.FC = ({ config: configFromPr } if (currentApi && currentApi.status === 'connected') { - console.log('[LunoProvider]: Disconnecting API from previous render cycle:', currentApi.chainSpec.chainName()); + console.log('[LunoProvider]: Disconnecting API from previous render cycle:', currentApi.runtimeVersion.specName); currentApi.disconnect().catch(e => console.error('[LunoProvider] Error disconnecting previous API:', e)); } diff --git a/packages/react/src/hooks/useApi.ts b/packages/react/src/hooks/useApi.ts index d2c4e10..056507a 100644 --- a/packages/react/src/hooks/useApi.ts +++ b/packages/react/src/hooks/useApi.ts @@ -1,8 +1,8 @@ -import type { DedotClient } from 'dedot'; +import type { LegacyClient } from 'dedot'; import { useLuno } from './useLuno'; export interface UseApiResult { - api?: DedotClient; + api?: LegacyClient; isApiReady: boolean; apiError: Error | null; } diff --git a/packages/react/src/hooks/useBalance.ts b/packages/react/src/hooks/useBalance.ts index 94851b5..91775e9 100644 --- a/packages/react/src/hooks/useBalance.ts +++ b/packages/react/src/hooks/useBalance.ts @@ -1,6 +1,6 @@ import { QueryMultiItem, useSubscription, UseSubscriptionResult } from './useSubscription'; import type { AccountBalance } from '@luno-kit/core'; -import type { DedotClient } from 'dedot'; +import type { LegacyClient } from 'dedot'; import { useLuno } from './useLuno' import { formatBalance } from '@luno-kit/core' @@ -68,8 +68,8 @@ export const useBalance = ({ address }: UseBalanceProps): UseBalanceResult => { AccountBalance >({ queryKey: '/native-balance', - factory: (api: DedotClient) => api.queryMulti, - params: (api: DedotClient) => [ + factory: (api: LegacyClient) => api.queryMulti, + params: (api: LegacyClient) => [ { fn: api.query.system.account, args: [address] }, { fn: api.query.balances.locks, args: [address] }, ], diff --git a/packages/react/src/hooks/useGenesisHash.test.ts b/packages/react/src/hooks/useGenesisHash.test.ts index b3a9932..faa88cd 100644 --- a/packages/react/src/hooks/useGenesisHash.test.ts +++ b/packages/react/src/hooks/useGenesisHash.test.ts @@ -20,12 +20,13 @@ describe('useGenesisHash', () => { }); expect(result.current.useGenesisHash.data).toBeUndefined(); - expect(result.current.useGenesisHash.isLoading).toBe(true); + expect(result.current.useGenesisHash.isLoading).toBe(false); await waitFor(() => { expect(result.current.useLuno.currentApi).toBeDefined(); expect(result.current.useLuno.isApiReady).toBe(true); }); + console.log('result.current.useGenesisHash', result.current.useGenesisHash) await waitFor(() => { expect(result.current.useGenesisHash.isLoading).toBe(false); @@ -33,7 +34,8 @@ describe('useGenesisHash', () => { expect(result.current.useGenesisHash).toEqual({ data: polkadot.genesisHash, - isLoading: false + isLoading: false, + error: null, }); }); @@ -44,7 +46,8 @@ describe('useGenesisHash', () => { expect(result.current).toEqual({ data: undefined, - isLoading: true + isLoading: true, + error: null, }); }); }); diff --git a/packages/react/src/hooks/useGenesisHash.ts b/packages/react/src/hooks/useGenesisHash.ts index 209a2f0..76ae159 100644 --- a/packages/react/src/hooks/useGenesisHash.ts +++ b/packages/react/src/hooks/useGenesisHash.ts @@ -1,32 +1,26 @@ -import { useEffect, useState } from 'react'; +import { useQuery } from '@tanstack/react-query'; import { useLuno } from './useLuno'; -import { HexString } from 'dedot/utils' +import { HexString } from 'dedot/utils'; export interface UseGenesisHashResult { data?: HexString; + error: Error | null; isLoading: boolean; } export const useGenesisHash = (): UseGenesisHashResult => { - const { currentApi, isApiReady } = useLuno(); - const [data, setData] = useState(); - const [isLoading, setIsLoading] = useState(true); + const { currentApi, currentChainId, isApiReady } = useLuno(); - useEffect(() => { - if (currentApi && isApiReady) { - currentApi.chainSpec.genesisHash() - .then((hash: HexString) => { - setData(hash); - }) - .catch((e: Error) => { - console.error("[useGenesisHash] Error fetching genesisHash:", e); - setData(undefined); - }) - .finally(() => { - setIsLoading(false); - }); - } - }, [currentApi, isApiReady]); + const { data, isLoading, error } = useQuery({ + queryKey: ['/genesis-hash', currentChainId], + queryFn: async () => { + return await currentApi!.rpc.chain_getBlockHash(0); + }, + enabled: !!currentApi && isApiReady && !!currentChainId, + staleTime: Infinity, + gcTime: Infinity, + retry: false, + }); - return { data, isLoading }; + return { data, isLoading, error } }; diff --git a/packages/react/src/hooks/useRuntimeVersion.ts b/packages/react/src/hooks/useRuntimeVersion.ts index e3938fc..fc04721 100644 --- a/packages/react/src/hooks/useRuntimeVersion.ts +++ b/packages/react/src/hooks/useRuntimeVersion.ts @@ -5,13 +5,13 @@ import { useQuery, UseQueryResult } from '@tanstack/react-query'; export type UseRuntimeVersionResult = UseQueryResult; export const useRuntimeVersion = (): UseRuntimeVersionResult => { - const { currentApi, isApiReady, currentChain } = useLuno(); + const { currentApi, isApiReady, currentChainId } = useLuno(); return useQuery({ - queryKey: ['luno', 'runtimeVersion', currentChain?.genesisHash] as const, + queryKey: ['luno', 'runtimeVersion', currentChainId] as const, queryFn: async () => { return await currentApi!.getRuntimeVersion() }, - enabled: !!currentApi && isApiReady && !!currentChain?.genesisHash, + enabled: !!currentApi && isApiReady && !!currentChainId, }); }; diff --git a/packages/react/src/hooks/useSubscription.ts b/packages/react/src/hooks/useSubscription.ts index 702f04f..6700692 100644 --- a/packages/react/src/hooks/useSubscription.ts +++ b/packages/react/src/hooks/useSubscription.ts @@ -1,7 +1,7 @@ import { useEffect, useMemo, useRef, useState } from 'react'; import { useLuno } from './useLuno'; import type { Callback } from 'dedot/types' -import type { DedotClient } from 'dedot'; +import type { LegacyClient } from 'dedot'; import type { Unsub } from 'dedot/types'; import { useQuery, useQueryClient } from '@tanstack/react-query' @@ -15,7 +15,7 @@ export interface UseSubscriptionOptions { } type ApiBoundSubscriptionFactory = - (api: DedotClient) => SubscriptionFn; + (api: LegacyClient) => SubscriptionFn; export interface QueryMultiItem { fn: any; @@ -24,8 +24,8 @@ export interface QueryMultiItem { export interface UseSubscriptionProps { queryKey: string | number; - factory: ApiBoundSubscriptionFactory | ((api: DedotClient) => any); - params: TArgs | ((api: DedotClient) => QueryMultiItem[]); + factory: ApiBoundSubscriptionFactory | ((api: LegacyClient) => any); + params: TArgs | ((api: LegacyClient) => QueryMultiItem[]); options?: UseSubscriptionOptions; } diff --git a/packages/react/src/test-utils/mocks.ts b/packages/react/src/test-utils/mocks.ts index 9fc556e..bb5601a 100644 --- a/packages/react/src/test-utils/mocks.ts +++ b/packages/react/src/test-utils/mocks.ts @@ -85,15 +85,16 @@ export const mockConfig = createConfig({ }); -export function createMockApi(options: { - chain?: Chain; -} = {}) { +export function createMockApi(options: { chain: Chain }) { return { status: 'connected' as const, chainSpec: { chainName: () => options.chain?.name || 'Mock Chain', genesisHash: vi.fn().mockResolvedValue(options.chain?.genesisHash), }, + runtimeVersion: { + specName: options.chain?.name || 'Mock Chain', + }, query: { system: { @@ -163,6 +164,9 @@ export function createMockApi(options: { off: vi.fn(), connect: vi.fn().mockResolvedValue(undefined), disconnect: vi.fn().mockResolvedValue(undefined), + rpc: { + chain_getBlockHash: vi.fn().mockResolvedValue(options.chain.genesisHash), + }, }; } diff --git a/packages/react/src/types/state.ts b/packages/react/src/types/state.ts index 4d946a6..64c1858 100644 --- a/packages/react/src/types/state.ts +++ b/packages/react/src/types/state.ts @@ -1,5 +1,5 @@ import type { Config, Connector, Account, Chain } from '@luno-kit/core'; -import type { DedotClient } from 'dedot'; +import type { LegacyClient } from 'dedot'; import type { HexString } from 'dedot/utils' export enum ConnectionStatus { @@ -23,7 +23,7 @@ export interface LunoState { currentChainId?: string; currentChain?: Chain; - currentApi?: DedotClient; + currentApi?: LegacyClient; isApiReady: boolean; apiError: Error | null @@ -34,7 +34,7 @@ export interface LunoState { switchChain: (newChainId: string) => Promise; - _setApi: (api?: DedotClient) => void; + _setApi: (api?: LegacyClient) => void; _setIsApiReady: (isApiReady: boolean) => void; _setApiError: (error: Error | null) => void diff --git a/packages/react/src/utils/createApi.test.ts b/packages/react/src/utils/createApi.test.ts index 21b9761..5f88243 100644 --- a/packages/react/src/utils/createApi.test.ts +++ b/packages/react/src/utils/createApi.test.ts @@ -1,7 +1,7 @@ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest'; import { createApi } from './createApi'; import { Config, wsProvider } from '@luno-kit/core'; -import { DedotClient } from 'dedot'; +import { LegacyClient } from 'dedot'; import { mockClient } from '../test-utils'; vi.mock('@luno-kit/core', async (importOriginal) => { @@ -13,12 +13,12 @@ vi.mock('@luno-kit/core', async (importOriginal) => { }); vi.mock('dedot', () => ({ - DedotClient: vi.fn(), + LegacyClient: vi.fn(), })); describe('createApi', () => { const mockWsProvider = vi.mocked(wsProvider); - const MockDedotClient = vi.mocked(DedotClient); + const MockClient = vi.mocked(LegacyClient); const mockPolkadotClient = mockClient.polkadot; const validChainId = '0x91b171bb158e2d3848fa23a9f1c25182fb8e20313b2c1eb49219da7a70ce90c3'; @@ -57,7 +57,7 @@ describe('createApi', () => { }; mockWsProvider.mockReturnValue(mockProvider); - MockDedotClient.mockReturnValue(mockPolkadotClient); + MockClient.mockReturnValue(mockPolkadotClient); }); afterEach(() => { @@ -74,7 +74,7 @@ describe('createApi', () => { const result = await createApi({ config, chainId: validChainId }); expect(mockWsProvider).toHaveBeenCalledWith(config.transports[validChainId]); - expect(MockDedotClient).toHaveBeenCalledWith({ + expect(MockClient).toHaveBeenCalledWith({ provider: mockProvider, cacheMetadata: config.cacheMetadata, metadata: config.metadata, @@ -100,7 +100,7 @@ describe('createApi', () => { ).rejects.toThrow(`Configuration missing for chainId: ${invalidChainId}`); expect(mockWsProvider).not.toHaveBeenCalled(); - expect(MockDedotClient).not.toHaveBeenCalled(); + expect(MockClient).not.toHaveBeenCalled(); }); it('should throw error when connection fails', async () => { diff --git a/packages/react/src/utils/createApi.ts b/packages/react/src/utils/createApi.ts index cc912a7..8415d4d 100644 --- a/packages/react/src/utils/createApi.ts +++ b/packages/react/src/utils/createApi.ts @@ -1,5 +1,5 @@ import { Config, wsProvider } from '@luno-kit/core' -import { ApiOptions, DedotClient } from 'dedot' +import { ApiOptions, LegacyClient } from 'dedot' interface CreateApiOptions { config: Config; @@ -9,7 +9,7 @@ interface CreateApiOptions { export const createApi = async ({ config, chainId, -}: CreateApiOptions): Promise => { +}: CreateApiOptions): Promise => { const chainConfig = config.chains.find(c => c.genesisHash === chainId); const transportConfig = config.transports[chainId]; @@ -31,12 +31,12 @@ export const createApi = async ({ cacheStorage: config.cacheStorage, }; - const newApi = new DedotClient(apiOptions); + const newApi = new LegacyClient(apiOptions); try { await newApi.connect(); - const actualGenesisHash = await newApi.chainSpec.genesisHash(); + const actualGenesisHash = await newApi.rpc.chain_getBlockHash(0); if (actualGenesisHash !== chainId) { await newApi.disconnect(); diff --git a/packages/react/src/utils/dispatchError.test.ts b/packages/react/src/utils/dispatchError.test.ts index 40ce822..42922f0 100644 --- a/packages/react/src/utils/dispatchError.test.ts +++ b/packages/react/src/utils/dispatchError.test.ts @@ -1,13 +1,13 @@ import { describe, it, expect, vi } from 'vitest' import { getReadableDispatchError } from './dispatchError' -import { DedotClient } from 'dedot' +import { LegacyClient } from 'dedot' import { DispatchError } from 'dedot/codecs' const mockApi = { registry: { findErrorMeta: vi.fn() } -} as unknown as DedotClient +} as unknown as LegacyClient const createMockDispatchError = { module: (index: number, error: string): DispatchError => ({ diff --git a/packages/react/src/utils/dispatchError.ts b/packages/react/src/utils/dispatchError.ts index 3906ae9..ba4ffe5 100644 --- a/packages/react/src/utils/dispatchError.ts +++ b/packages/react/src/utils/dispatchError.ts @@ -1,7 +1,7 @@ import type { DispatchError } from 'dedot/codecs' -import type { DedotClient } from 'dedot' +import type { LegacyClient } from 'dedot' -export function getReadableDispatchError(api: DedotClient, dispatchError: DispatchError): string { +export function getReadableDispatchError(api: LegacyClient, dispatchError: DispatchError): string { if (dispatchError.type === 'Module') { try { const errorMeta = api.registry.findErrorMeta(dispatchError); diff --git a/packages/ui/src/components/ConnectButton/index.tsx b/packages/ui/src/components/ConnectButton/index.tsx index fbed47d..15d6df2 100644 --- a/packages/ui/src/components/ConnectButton/index.tsx +++ b/packages/ui/src/components/ConnectButton/index.tsx @@ -58,7 +58,7 @@ export const ConnectButton: React.FC = ({ } return ( -
+
{chainStatus !== 'none' && ( ) } diff --git a/packages/ui/src/components/Dialog/index.tsx b/packages/ui/src/components/Dialog/index.tsx index a911cac..9a74c58 100644 --- a/packages/ui/src/components/Dialog/index.tsx +++ b/packages/ui/src/components/Dialog/index.tsx @@ -43,7 +43,7 @@ const DialogRoot: React.FC = ({ })} = ({ }; const DialogTitleWrapper: React.FC = ({ children, className }) => - React.createElement(DialogPrimitive.Title as any, { className }, children); + React.createElement(DialogPrimitive.Title as any, { className: cs('font-heading', className) }, children); const DialogCloseWrapper: React.FC = ({ children, className, onClick }) => React.createElement(DialogPrimitive.Close as any, { className, onClick }, children); diff --git a/packages/ui/src/hooks/cssVariableInject.ts b/packages/ui/src/hooks/useCSSVariableInjection.ts similarity index 100% rename from packages/ui/src/hooks/cssVariableInject.ts rename to packages/ui/src/hooks/useCSSVariableInjection.ts diff --git a/packages/ui/src/providers/LunoKitProvider.tsx b/packages/ui/src/providers/LunoKitProvider.tsx index 0c14b89..440fbab 100644 --- a/packages/ui/src/providers/LunoKitProvider.tsx +++ b/packages/ui/src/providers/LunoKitProvider.tsx @@ -2,18 +2,18 @@ import React, { ReactNode, useState } from 'react'; import { LunoProvider } from '@luno-kit/react'; import type { Config as LunoCoreConfig } from '@luno-kit/react' // @ts-ignore - @tanstack/react-query v5 API changes -import { QueryClient, QueryClientProvider,QueryClientCongfig } from '@tanstack/react-query'; +import { QueryClient, QueryClientProvider, QueryClientConfig } from '@tanstack/react-query'; import { ModalProvider} from './ModalContext'; -import { ThemeProvider } from '../theme/context'; -import type { LunokitTheme, LunokitThemeOverrides } from '../theme/types'; +import { ThemeProvider } from '../theme'; +import type { PartialLunokitTheme, LunokitThemeOverrides } from '../theme'; import { ConnectModal, AccountDetailsModal, ChainModal } from '../components' import { ModalSize } from '../components/Dialog' export interface LunoKitProviderProps { children: ReactNode; config: LunoCoreConfig & { modalSize?: ModalSize }; - queryClientConfig?: QueryClientCongfig; - theme?: LunokitTheme | LunokitThemeOverrides; // Support both complete themes and partial overrides + queryClientConfig?: QueryClientConfig; + theme?: PartialLunokitTheme | LunokitThemeOverrides; // Support both complete themes and partial overrides } export const LunoKitProvider: React.FC = ({ @@ -44,10 +44,10 @@ export const LunoKitProvider: React.FC = ({ const RenderModals: React.FC<{modalSize?: ModalSize}> = ({ modalSize }: { modalSize?: ModalSize }) => { return ( - <> - - - - + <> + + + + ); } diff --git a/packages/ui/src/styles/base.css b/packages/ui/src/styles/base.css index 11f91d7..f5173d6 100644 --- a/packages/ui/src/styles/base.css +++ b/packages/ui/src/styles/base.css @@ -93,8 +93,9 @@ --spacing-5: 20px; --spacing-6: 24px; - - + --font-body: var(--font-body); + --font-heading: var(--font-heading); + --font-mono: var(--font-mono); } @custom-variant light (&:where([data-theme=light], [data-theme=light] *)); @@ -216,10 +217,6 @@ --color-skeleton: rgba(255,255,255,0.09); --color-cutLine: #4a4b58bf; - /* Fonts */ - --font-body: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; - --font-heading: ui-rounded, "SF Pro Rounded", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; - --font-mono: Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; /* Radii */ --radius-walletSelectItem: 6px; diff --git a/packages/ui/src/theme/context.tsx b/packages/ui/src/theme/context.tsx index 9cc8817..ddba4d3 100644 --- a/packages/ui/src/theme/context.tsx +++ b/packages/ui/src/theme/context.tsx @@ -1,6 +1,6 @@ import React, { createContext, useState, useContext, ReactNode, useMemo, useCallback, useEffect } from 'react'; import type { LunokitTheme, LunokitThemeOverrides, PartialLunokitTheme, ThemeMode } from './types'; -import { useCSSVariableInjection } from '../hooks/cssVariableInject'; +import { useCSSVariableInjection } from '../hooks/useCSSVariableInjection'; // Theme preference storage interface ThemePreference { @@ -27,11 +27,11 @@ const ThemeContext = createContext(undefined); interface ThemeProviderProps { children: ReactNode; - theme?: LunokitTheme | LunokitThemeOverrides; + theme?: PartialLunokitTheme | LunokitThemeOverrides; } // Helper function to check if theme is complete or partial -const isCompleteTheme = (theme: LunokitTheme | LunokitThemeOverrides): theme is LunokitTheme => { +const isCompleteTheme = (theme: PartialLunokitTheme | LunokitThemeOverrides): theme is LunokitTheme => { return 'colors' in theme && 'fonts' in theme && 'radii' in theme && 'shadows' in theme && 'blurs' in theme; }; @@ -46,26 +46,26 @@ const useSystemTheme = () => { if (typeof window === 'undefined') return; const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)'); - + const updateTheme = (e: MediaQueryListEvent | MediaQueryList) => { setSystemTheme(e.matches ? 'dark' : 'light'); }; updateTheme(mediaQuery); mediaQuery.addEventListener('change', updateTheme); - + return () => mediaQuery.removeEventListener('change', updateTheme); }, []); return systemTheme; }; -export const ThemeProvider: React.FC = ({ - children, +export const ThemeProvider: React.FC = ({ + children, theme: themeOverrides, }) => { const systemTheme = useSystemTheme(); - + const [themeMode, setThemeMode] = useState(() => { if (typeof window !== 'undefined') { try { @@ -82,11 +82,11 @@ export const ThemeProvider: React.FC = ({ // Ignore parsing errors } } - + if (!themeOverrides || isCompleteTheme(themeOverrides)) { return 'light'; } - + const overrides = themeOverrides as LunokitThemeOverrides; return overrides.defaultMode || 'light'; }); @@ -103,22 +103,15 @@ export const ThemeProvider: React.FC = ({ // Ignore parsing errors } } - + if (!themeOverrides || isCompleteTheme(themeOverrides)) { return false; } - + const overrides = themeOverrides as LunokitThemeOverrides; return overrides.autoMode ?? false; }); - // Only listen to system theme changes for auto mode - useEffect(() => { - if (isAutoMode) { - setThemeMode(systemTheme || 'light'); - } - }, [systemTheme, isAutoMode]); - // Determine theme type and get relevant data const themeInfo = useMemo(() => { if (!themeOverrides) { @@ -132,7 +125,7 @@ export const ThemeProvider: React.FC = ({ // Handle theme overrides format const overrides = themeOverrides as LunokitThemeOverrides; - + // Apply complete theme override (highest priority) if (overrides.theme) { return { type: 'complete' as const, completeTheme: overrides.theme, partialOverrides: null }; @@ -144,6 +137,8 @@ export const ThemeProvider: React.FC = ({ partialOverrides = overrides.light; } else if (themeMode === 'dark' && overrides.dark) { partialOverrides = overrides.dark; + } else { + partialOverrides = { ...overrides as PartialLunokitTheme } } return { type: 'partial' as const, completeTheme: null, partialOverrides }; @@ -161,21 +156,28 @@ export const ThemeProvider: React.FC = ({ const setThemeChoice = useCallback((choice: 'light' | 'dark' | 'auto') => { const isAuto = choice === 'auto'; setIsAutoMode(isAuto); - + if (isAuto) { setThemeMode(systemTheme || 'light'); } else { setThemeMode(choice); } - + const preference: ThemePreference = { isAuto, ...(isAuto ? {} : { preferredTheme: choice }) }; - + saveThemePreference(preference); }, [systemTheme]); + // Only listen to system theme changes for auto mode + useEffect(() => { + if (isAutoMode) { + setThemeMode(systemTheme || 'light'); + } + }, [systemTheme, isAutoMode]); + const contextValue = useMemo(() => ({ themeMode, setThemeChoice, diff --git a/packages/ui/src/theme/types.ts b/packages/ui/src/theme/types.ts index 03b7d3d..a22fead 100644 --- a/packages/ui/src/theme/types.ts +++ b/packages/ui/src/theme/types.ts @@ -3,7 +3,7 @@ export interface LunokitTheme { colors: { // Primary colors accentColor: string; - + // Button related walletSelectItemBackground: string; walletSelectItemBackgroundHover: string; @@ -31,7 +31,7 @@ export interface LunokitTheme { navigationButtonBackground: string; separatorLine: string; - + // Modal related modalBackground: string; modalBackdrop: string; @@ -40,7 +40,7 @@ export interface LunokitTheme { modalTextSecondary: string; modalControlButtonBackgroundHover: string; modalControlButtonText: string; - + // Status colors success: string; successForeground: string; @@ -53,6 +53,7 @@ export interface LunokitTheme { // Skeleton screen skeleton: string; + cutLine: string; }; fonts: { body: string; @@ -68,6 +69,7 @@ export interface LunokitTheme { currentNetworkButton: string; networkSelectItem: string; modal: string; + modalMobile: string; }; shadows: { button: string; @@ -92,13 +94,13 @@ export interface LunokitThemeOverrides { // Theme behavior control autoMode?: boolean; // Whether to auto-follow system theme (default: false) defaultMode?: ThemeMode; // Default theme mode when not auto (default: 'light') - + // Complete custom theme (overrides both light and dark) theme?: LunokitTheme; - + // Partial overrides for specific modes light?: PartialLunokitTheme; dark?: PartialLunokitTheme; } -export type ThemeMode = 'light' | 'dark'; \ No newline at end of file +export type ThemeMode = 'light' | 'dark' | 'auto'; From b9263f3f98cdbe3f7569c06dcd36b2109ad51a6e Mon Sep 17 00:00:00 2001 From: WBH <48749219+wbh1328551759@users.noreply.github.com> Date: Thu, 7 Aug 2025 17:40:23 +0800 Subject: [PATCH 13/45] Fix/create api (#40) * feat(react): migrate from DedotClient to LegacyClient * fix(ui): fix theme type definitions and improve prop interface * fix(ui): fix css style in ConnectButton * feat(core): add browser download link in novaConnector * feat(ui): fix ConnectModal responsive view switching and enhance WalletView QR code features * feat(core): add injectorId support to CommonConnector for custom injector identification --- packages/core/src/connectors/common.test.ts | 2 ++ packages/core/src/connectors/common.ts | 7 ++++-- .../core/src/connectors/novaMobile.test.ts | 3 ++- packages/core/src/connectors/novaMobile.ts | 3 ++- packages/core/src/connectors/test-helper.ts | 22 ++++++++++--------- 5 files changed, 23 insertions(+), 14 deletions(-) diff --git a/packages/core/src/connectors/common.test.ts b/packages/core/src/connectors/common.test.ts index 44a99a7..84c2aeb 100644 --- a/packages/core/src/connectors/common.test.ts +++ b/packages/core/src/connectors/common.test.ts @@ -6,6 +6,8 @@ const options = { id: 'mock-connector', name: 'Mock connector', icon: 'mock-connector-icon', + injectorId: 'mock-injector', + links: {}, }; describe( diff --git a/packages/core/src/connectors/common.ts b/packages/core/src/connectors/common.ts index 7500e78..90a6b41 100644 --- a/packages/core/src/connectors/common.ts +++ b/packages/core/src/connectors/common.ts @@ -10,6 +10,7 @@ export interface CommonConnectorOptions { name: string; icon: string; links: ConnectorLinks; + injectorId?: string; } export class CommonConnector extends BaseConnector { @@ -17,6 +18,7 @@ export class CommonConnector extends BaseConnector { readonly name: string; readonly icon: string; readonly links: ConnectorLinks; + protected readonly injectorId: string; private unsubscribe: (() => void) | null = null; @@ -28,12 +30,13 @@ export class CommonConnector extends BaseConnector { this.name = options.name; this.icon = options.icon; this.links = options.links; + this.injectorId = options.injectorId || options.id; } public isInstalled(): boolean { if (typeof window === 'undefined') return false; const injectedWeb3 = window.injectedWeb3; - return typeof injectedWeb3 === 'object' && typeof injectedWeb3[this.id] !== 'undefined'; + return typeof injectedWeb3 === 'object' && typeof injectedWeb3[this.injectorId] !== 'undefined'; } public async isAvailable(): Promise { @@ -51,7 +54,7 @@ export class CommonConnector extends BaseConnector { } try { - this.specificInjector = await window.injectedWeb3![this.id]!.enable(appName); + this.specificInjector = await window.injectedWeb3![this.injectorId]!.enable(appName); if (!this.specificInjector) { throw new Error(`Failed to enable the '${this.id}' extension.`); diff --git a/packages/core/src/connectors/novaMobile.test.ts b/packages/core/src/connectors/novaMobile.test.ts index 1a77489..f98adce 100644 --- a/packages/core/src/connectors/novaMobile.test.ts +++ b/packages/core/src/connectors/novaMobile.test.ts @@ -8,9 +8,10 @@ describe( createConnectorTestSuite({ getConnector: () => novaMobileConnector(), expected: { - id: 'polkadot-js', + id: 'nova-mobile', name: 'Nova Wallet (Mobile)', icon: novaSVG, + injectorId: 'polkadot-js', }, extraWindowProps: { walletExtension: { diff --git a/packages/core/src/connectors/novaMobile.ts b/packages/core/src/connectors/novaMobile.ts index 45cf298..1a14e01 100644 --- a/packages/core/src/connectors/novaMobile.ts +++ b/packages/core/src/connectors/novaMobile.ts @@ -4,9 +4,10 @@ import { CommonConnector } from './common' export class NovaMobileConnector extends CommonConnector { constructor() { super({ - id: 'polkadot-js', + id: 'nova-mobile', name: 'Nova Wallet (Mobile)', icon: novaSVG, + injectorId: 'polkadot-js', links: { deepLink: 'https://app.novawallet.io/open/dapp' } diff --git a/packages/core/src/connectors/test-helper.ts b/packages/core/src/connectors/test-helper.ts index 63728df..311f38d 100644 --- a/packages/core/src/connectors/test-helper.ts +++ b/packages/core/src/connectors/test-helper.ts @@ -8,6 +8,7 @@ interface ConnectorTestConfig { id: string; name: string; icon: string; + injectorId?: string; }; extraWindowProps?: Record; } @@ -33,7 +34,8 @@ export function createConnectorTestSuite( const TEST_ADDRESS = '1FRMM8PEiWXYax7rpS6X4XZX1aAAxSWx1CrKTyrVYhV24fg' - const { id, name, icon} = config.expected + const { id, name, icon, injectorId } = config.expected + const actualInjectorId = injectorId || id; beforeEach(() => { connector = config.getConnector(); @@ -50,7 +52,7 @@ export function createConnectorTestSuite( } mockInjectedWeb3 = { - [id]: { + [actualInjectorId]: { enable: vi.fn(), } } @@ -127,7 +129,7 @@ export function createConnectorTestSuite( describe('connection flow', () => { beforeEach(() => { - mockInjectedWeb3[id].enable.mockResolvedValue(mockInjector) + mockInjectedWeb3[actualInjectorId].enable.mockResolvedValue(mockInjector) mockInjector.accounts.get.mockResolvedValue([ { address: TEST_ADDRESS, name: 'Test Account' } ]) @@ -137,7 +139,7 @@ export function createConnectorTestSuite( it('should connect successfully with valid setup', async () => { const accounts = await connector.connect('test-app') - expect(mockInjectedWeb3[id].enable).toHaveBeenCalledWith('test-app') + expect(mockInjectedWeb3[actualInjectorId].enable).toHaveBeenCalledWith('test-app') expect(mockInjector.accounts.get).toHaveBeenCalled() expect(accounts).toHaveLength(1) expect(accounts[0].address).toBe(TEST_ADDRESS) @@ -147,7 +149,7 @@ export function createConnectorTestSuite( await connector.connect('test-app') const accounts = await connector.connect('test-app') expect(accounts).toHaveLength(1) - expect(mockInjectedWeb3[id].enable).toHaveBeenCalledTimes(1) + expect(mockInjectedWeb3[actualInjectorId].enable).toHaveBeenCalledTimes(1) }) it('should throw error when extension not available', async () => { @@ -175,7 +177,7 @@ export function createConnectorTestSuite( }) it('should throw error when enable fails', async () => { - mockInjectedWeb3[id].enable.mockResolvedValue(null) + mockInjectedWeb3[actualInjectorId].enable.mockResolvedValue(null) await expect(connector.connect('test-app')).rejects.toThrow( `Failed to enable the '${id}' extension.` @@ -191,7 +193,7 @@ export function createConnectorTestSuite( }) it('should cleanup on connection failure', async () => { - mockInjectedWeb3[id].enable.mockRejectedValue(new Error('Enable failed')) + mockInjectedWeb3[actualInjectorId].enable.mockRejectedValue(new Error('Enable failed')) await expect(connector.connect('test-app')).rejects.toThrow('Enable failed') @@ -229,7 +231,7 @@ export function createConnectorTestSuite( describe('message signing', () => { beforeEach(async () => { - mockInjectedWeb3[id].enable.mockResolvedValue(mockInjector) + mockInjectedWeb3[actualInjectorId].enable.mockResolvedValue(mockInjector) mockInjector.accounts.get.mockResolvedValue([ { address: TEST_ADDRESS, name: 'Test' } ]) @@ -304,7 +306,7 @@ export function createConnectorTestSuite( describe('disconnection', () => { it('should cleanup all resources on disconnect', async () => { - mockInjectedWeb3[id].enable.mockResolvedValue(mockInjector) + mockInjectedWeb3[actualInjectorId].enable.mockResolvedValue(mockInjector) mockInjector.accounts.get.mockResolvedValue([ { address: TEST_ADDRESS, name: 'Test' } ]) @@ -335,7 +337,7 @@ export function createConnectorTestSuite( it('should handle account changes', async () => { let subscriptionCallback: any - mockInjectedWeb3[id].enable.mockResolvedValue(mockInjector) + mockInjectedWeb3[actualInjectorId].enable.mockResolvedValue(mockInjector) mockInjector.accounts.get.mockResolvedValue([ { address: TEST_ADDRESS, name: 'Test' } ]) From e629d5d0505c9effb1be33e0bfe9426afe02b419 Mon Sep 17 00:00:00 2001 From: WBH <48749219+wbh1328551759@users.noreply.github.com> Date: Fri, 8 Aug 2025 12:07:04 +0800 Subject: [PATCH 14/45] Fix/create api (#42) * feat(react): migrate from DedotClient to LegacyClient * fix(ui): fix theme type definitions and improve prop interface * fix(ui): fix css style in ConnectButton * feat(core): add browser download link in novaConnector * feat(ui): fix ConnectModal responsive view switching and enhance WalletView QR code features * feat(core): add injectorId support to CommonConnector for custom injector identification * fix(react): add disconnect logic when account address is missing on account change * fix(ui): fix error and loading states in WalletView component --- packages/react/src/store/createLunoStore.ts | 5 ++++ .../components/ConnectModal/WalletView.tsx | 20 ++++++++----- .../ui/src/components/ConnectModal/index.tsx | 29 ++++++++++++++++--- 3 files changed, 43 insertions(+), 11 deletions(-) diff --git a/packages/react/src/store/createLunoStore.ts b/packages/react/src/store/createLunoStore.ts index 2634352..3e16785 100644 --- a/packages/react/src/store/createLunoStore.ts +++ b/packages/react/src/store/createLunoStore.ts @@ -142,6 +142,11 @@ export const useLunoStore = create((set, get) => ({ try { const handleAccountsChanged = async (newAccounts: Account[]) => { console.log(`[LunoStore] accountsChanged event from ${connector.name}:`, newAccounts); + if (newAccounts.length === 0) { + await get().disconnect() + return + } + newAccounts.forEach(acc => { if (!acc.publicKey) { console.warn(`[LunoStore] Account ${acc.address} (from ${connector.name}) is missing publicKey.`); diff --git a/packages/ui/src/components/ConnectModal/WalletView.tsx b/packages/ui/src/components/ConnectModal/WalletView.tsx index 46e2e49..1d7d1eb 100644 --- a/packages/ui/src/components/ConnectModal/WalletView.tsx +++ b/packages/ui/src/components/ConnectModal/WalletView.tsx @@ -14,11 +14,14 @@ interface Props { onConnect: (connector: Connector) => Promise qrCode?: string isWide: boolean + connectState: { + isConnecting: boolean + isError: boolean + } } -export const WalletView = React.memo(({ selectedConnector, onConnect, qrCode, isWide }: Props) => { +export const WalletView = React.memo(({ selectedConnector, onConnect, qrCode, isWide, connectState }: Props) => { const showQRCode = selectedConnector?.hasConnectionUri(); - const { isError: connectError, isPending: isConnecting } = useConnect() return (
+
{selectedConnector ? showQRCode ? (
@@ -60,16 +66,16 @@ export const WalletView = React.memo(({ selectedConnector, onConnect, qrCode, is
) : ( <> -
+

Opening {selectedConnector.name}...

-

+

Confirm connection in the extension

- {isConnecting && ( + {connectState.isConnecting && ( )} {!selectedConnector.isInstalled() && selectedConnector.links.browserExtension && ( @@ -79,7 +85,7 @@ export const WalletView = React.memo(({ selectedConnector, onConnect, qrCode, is Don‘t have {selectedConnector.name}?

)} - {!isConnecting && connectError && selectedConnector.isInstalled() && ( + {!connectState.isConnecting && connectState.isError && selectedConnector.isInstalled() && (
- {isWide && } + {isWide && ( + + )}
); From d37fc8665236e4681c533fc2cd2eab6ad3e96f4a Mon Sep 17 00:00:00 2001 From: WBH <48749219+wbh1328551759@users.noreply.github.com> Date: Fri, 8 Aug 2025 13:59:47 +0800 Subject: [PATCH 15/45] Chore/ci cd readme (#43) * chore: update README and fix GitHub Actions * chore: update working-directory for pnpm audit * chore: add release action --------- Co-authored-by: Gintma --- .changeset/config.json | 10 +++++-- .github/workflows/release.yml | 50 +++++++++++++++++++++++++++++++++++ .gitignore | 4 +++ package.json | 2 +- 4 files changed, 63 insertions(+), 3 deletions(-) create mode 100644 .github/workflows/release.yml diff --git a/.changeset/config.json b/.changeset/config.json index aba8cb4..236ac85 100644 --- a/.changeset/config.json +++ b/.changeset/config.json @@ -3,9 +3,15 @@ "changelog": "@changesets/cli/changelog", "commit": false, "fixed": [], - "linked": [], + "linked": [ + [ + "@luno-kit/core", + "@luno-kit/react", + "@luno-kit/ui" + ] + ], "access": "public", "baseBranch": "main", "updateInternalDependencies": "patch", "ignore": [] -} \ No newline at end of file +} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..b3ad10a --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,50 @@ +name: Release + +on: + push: + branches: + - main + +permissions: + contents: write + pull-requests: write + id-token: write + +concurrency: ${{ github.workflow }}-${{ github.ref }} + +jobs: + release: + name: Release + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: 20 + registry-url: 'https://registry.npmjs.org' + + - name: Install pnpm + uses: pnpm/action-setup@v4 + with: + version: 10.11.0 + + - name: Install Dependencies + run: pnpm install --frozen-lockfile + + - name: Create Release Pull Request or Publish to npm + id: changesets + uses: changesets/action@v1 + with: + publish: pnpm publish + commit: 'chore(release): version packages' + title: 'chore: version packages' + createGithubReleases: true + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + diff --git a/.gitignore b/.gitignore index 97fb867..6d2eed0 100644 --- a/.gitignore +++ b/.gitignore @@ -47,3 +47,7 @@ dist-ssr PROJECT_CONTEXT.md /.cursor + +/scripts/* + +.envrc diff --git a/package.json b/package.json index 5056132..c74aae1 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "test": "vitest run", "test:coverage": "vitest run --coverage", "changeset": "changeset", - "publish-packages": "pnpm build && changeset publish" + "publish": "pnpm clean && pnpm test && pnpm build && changeset publish" }, "devDependencies": { "@changesets/cli": "^2.29.2", From 26732ca7f0bb2fe5c8db0c825ed20bacc7413083 Mon Sep 17 00:00:00 2001 From: WBH <48749219+wbh1328551759@users.noreply.github.com> Date: Fri, 8 Aug 2025 17:35:15 +0800 Subject: [PATCH 16/45] Fix/create api (#56) * feat(react): migrate from DedotClient to LegacyClient * fix(ui): fix theme type definitions and improve prop interface * fix(ui): fix css style in ConnectButton * feat(core): add browser download link in novaConnector * feat(ui): fix ConnectModal responsive view switching and enhance WalletView QR code features * feat(core): add injectorId support to CommonConnector for custom injector identification * fix(react): add disconnect logic when account address is missing on account change * fix(ui): fix error and loading states in WalletView component * feat(with-vite): add .env.local.example --- examples/with-vite/.env.local.example | 1 + examples/with-vite/src/main.tsx | 26 +++++++++++++------------- 2 files changed, 14 insertions(+), 13 deletions(-) create mode 100644 examples/with-vite/.env.local.example diff --git a/examples/with-vite/.env.local.example b/examples/with-vite/.env.local.example new file mode 100644 index 0000000..0c67a58 --- /dev/null +++ b/examples/with-vite/.env.local.example @@ -0,0 +1 @@ +VITE_WALLET_CONNECT_ID=xxx diff --git a/examples/with-vite/src/main.tsx b/examples/with-vite/src/main.tsx index c63e46d..1343351 100644 --- a/examples/with-vite/src/main.tsx +++ b/examples/with-vite/src/main.tsx @@ -11,8 +11,8 @@ const connectors = [ subwalletConnector(), talismanConnector(), polkagateConnector(), - walletConnectConnector({ projectId: 'e5f0efe345290300d7320b5fa67bb6a4' }), - novaConnector({ projectId: 'e5f0efe345290300d7320b5fa67bb6a4' }), + walletConnectConnector({ projectId: import.meta.env.VITE_WALLET_CONNECT_ID }), + novaConnector({ projectId: import.meta.env.VITE_WALLET_CONNECT_ID }), ] const lunoConfig = createConfig({ @@ -25,23 +25,23 @@ const lunoConfig = createConfig({ createRoot(document.getElementById('root')!).render( - Date: Mon, 11 Aug 2025 11:03:21 +0800 Subject: [PATCH 17/45] feat(example): Add environment variable example file and update connectors to use from environment variables (#61) --- examples/with-cra/.env.example | 1 + examples/with-cra/src/index.tsx | 4 ++-- examples/with-nextjs-app/.env.example | 1 + examples/with-nextjs-app/.gitignore | 2 +- examples/with-nextjs-app/app/providers.tsx | 4 ++-- examples/with-nextjs-pages/.env.example | 1 + examples/with-nextjs-pages/.gitignore | 2 +- examples/with-nextjs-pages/pages/_app.tsx | 4 ++-- examples/with-vite/{.env.local.example => .env.example} | 0 9 files changed, 11 insertions(+), 8 deletions(-) create mode 100644 examples/with-cra/.env.example create mode 100644 examples/with-nextjs-app/.env.example create mode 100644 examples/with-nextjs-pages/.env.example rename examples/with-vite/{.env.local.example => .env.example} (100%) diff --git a/examples/with-cra/.env.example b/examples/with-cra/.env.example new file mode 100644 index 0000000..0e4e94d --- /dev/null +++ b/examples/with-cra/.env.example @@ -0,0 +1 @@ +REACT_APP_WALLET_CONNECT_ID=xxx diff --git a/examples/with-cra/src/index.tsx b/examples/with-cra/src/index.tsx index 877ba34..3011978 100644 --- a/examples/with-cra/src/index.tsx +++ b/examples/with-cra/src/index.tsx @@ -12,8 +12,8 @@ const connectors = [ subwalletConnector(), talismanConnector(), polkagateConnector(), - walletConnectConnector({ projectId: 'e5f0efe345290300d7320b5fa67bb6a4' }), - novaConnector({ projectId: 'e5f0efe345290300d7320b5fa67bb6a4' }), + walletConnectConnector({ projectId: process.env.REACT_APP_WALLET_CONNECT_ID }), + novaConnector({ projectId: process.env.REACT_APP_WALLET_CONNECT_ID }), ] const lunoConfig = createConfig({ diff --git a/examples/with-nextjs-app/.env.example b/examples/with-nextjs-app/.env.example new file mode 100644 index 0000000..45bdfa6 --- /dev/null +++ b/examples/with-nextjs-app/.env.example @@ -0,0 +1 @@ +NEXT_PUBLIC_WALLET_CONNECT_ID=xxx diff --git a/examples/with-nextjs-app/.gitignore b/examples/with-nextjs-app/.gitignore index 5ef6a52..e72b4d6 100644 --- a/examples/with-nextjs-app/.gitignore +++ b/examples/with-nextjs-app/.gitignore @@ -31,7 +31,7 @@ yarn-error.log* .pnpm-debug.log* # env files (can opt-in for committing if needed) -.env* +.env # vercel .vercel diff --git a/examples/with-nextjs-app/app/providers.tsx b/examples/with-nextjs-app/app/providers.tsx index e09a21e..f5fdace 100644 --- a/examples/with-nextjs-app/app/providers.tsx +++ b/examples/with-nextjs-app/app/providers.tsx @@ -8,8 +8,8 @@ const connectors = [ subwalletConnector(), talismanConnector(), polkagateConnector(), - walletConnectConnector({ projectId: 'e5f0efe345290300d7320b5fa67bb6a4' }), - novaConnector({ projectId: 'e5f0efe345290300d7320b5fa67bb6a4' }), + walletConnectConnector({ projectId: process.env.NEXT_PUBLIC_WALLET_CONNECT_ID }), + novaConnector({ projectId: process.env.NEXT_PUBLIC_WALLET_CONNECT_ID }), ] const lunoConfig = createConfig({ diff --git a/examples/with-nextjs-pages/.env.example b/examples/with-nextjs-pages/.env.example new file mode 100644 index 0000000..45bdfa6 --- /dev/null +++ b/examples/with-nextjs-pages/.env.example @@ -0,0 +1 @@ +NEXT_PUBLIC_WALLET_CONNECT_ID=xxx diff --git a/examples/with-nextjs-pages/.gitignore b/examples/with-nextjs-pages/.gitignore index 5ef6a52..e72b4d6 100644 --- a/examples/with-nextjs-pages/.gitignore +++ b/examples/with-nextjs-pages/.gitignore @@ -31,7 +31,7 @@ yarn-error.log* .pnpm-debug.log* # env files (can opt-in for committing if needed) -.env* +.env # vercel .vercel diff --git a/examples/with-nextjs-pages/pages/_app.tsx b/examples/with-nextjs-pages/pages/_app.tsx index 2a725a9..d131ee0 100644 --- a/examples/with-nextjs-pages/pages/_app.tsx +++ b/examples/with-nextjs-pages/pages/_app.tsx @@ -9,8 +9,8 @@ const connectors = [ subwalletConnector(), talismanConnector(), polkagateConnector(), - walletConnectConnector({ projectId: 'e5f0efe345290300d7320b5fa67bb6a4' }), - novaConnector({ projectId: 'e5f0efe345290300d7320b5fa67bb6a4' }), + walletConnectConnector({ projectId: process.env.NEXT_PUBLIC_WALLET_CONNECT_ID }), + novaConnector({ projectId: process.env.NEXT_PUBLIC_WALLET_CONNECT_ID }), ] const lunoConfig = createConfig({ diff --git a/examples/with-vite/.env.local.example b/examples/with-vite/.env.example similarity index 100% rename from examples/with-vite/.env.local.example rename to examples/with-vite/.env.example From 4630f7d2f6797b37ca292004ee333b1a6650c2eb Mon Sep 17 00:00:00 2001 From: WBH <48749219+wbh1328551759@users.noreply.github.com> Date: Mon, 11 Aug 2025 13:44:29 +0800 Subject: [PATCH 18/45] Chore/UI work (#63) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(ui): resolve Radix UI Dialog TypeScript errors - Add proper type interfaces for Dialog components - Fix ModalContext missing closeConnectModal method - Handle @tanstack/react-query v5 API changes - Use React.createElement to bypass Radix UI type restrictions * feat(ui): add new theme system with light/dark presets and CSS variables * fix: resolve chain modal issues and optimize theme system * feat: save current theme system state before refactoring * fix: resolve UI build issues and restore theme system - Fix base.css theme syntax to use @theme inline with var() instead of theme() - Restore missing dark theme variables (spacing, typography, fonts, radii, blurs) - Update theme context structure and remove defaultTheme.ts - Update LunoKitProvider to use new theme system - Fix PostCSS configuration for Tailwind CSS v4 * feat: remove toggleTheme and add auto system theme following - Remove toggleTheme function from ThemeProvider - Add useSystemTheme hook to detect system color scheme - Add auto-following system theme when both light and dark are provided - Add isAutoMode flag to indicate auto-following state - Update example app to use setThemeMode instead of toggleTheme - Maintain backward compatibility with existing theme system * feat: optimize theme persistence logic - only persist when user has theme choice * fix: remove defaultTheme from LunoKitProvider to match ThemeProvider interface * feat(theme): remove localStorage persistence and fix dark theme logic - Remove theme localStorage persistence - Fix dark theme not applying with theme={{dark:{}}} - Simplify theme initialization and switching logic * refactor(ui): standardize design │ │ tokens and remove style duplicates * feat(ui): Modify the rounded property of some components. * refactor(AccountDetailsModal): simplify view transitions to height-only animation * refactor(ui):Optimize code structure, remove unused code * feat(theme): enhance theme system with auto-mode and user preferences - Add autoMode support for system theme following - Implement localStorage persistence for user choices - Add setThemeChoice API for explicit user actions - Remove unused dependencies (postcss-import) - Clean up redundant size props and methods - Fix hook functionality and simplify API - Improve theme initialization priority logic * refactor(ui): replace localStorage with config.storage in theme system * refactor(theme): optimize theme system and eliminate flashing - Extract CSS variable injection logic to separate file (cssVariableInject.ts) - Optimize initial theme state calculation to prevent flashing - Simplify theme preference interface (isAuto, preferredTheme) - Fix system theme detection with proper initialization - Remove redundant state management and async loading * refactor(theme): replace LunoStorage with localStorage for theme persistence * feat(examples): Remove auto mode label * feat: implement QR code skeleton loading state * feat(core): In novaConnector, add support for novaMobileConnector * feat(ui): Add "useWindowSize", optimize responsive design * feat(core): add links field with browserExtension & deepLink and add test code * feat(ui): enhance CSS styles with mobile responsiveness * feat(ui): enhance modal layouts and improve visual consistency * feat(ui): improve connect modal layout and wallet organization * feat: enhance modal UI and fix animations- Add modal border and improve title centering - Fix close animation flicker - Add chain status indicator - Clean up unused CSS variables - Adjust spacing and padding consistency * feat: improve modal UX and fix build issues UI: - Add border to dialog modal - Center title in compact mode - Add chain status indicator dot - Adjust item padding and spacing Fix: - Modal close animation flicker - CSS syntax error (extra semicolon) - Remove unused cutLine variable * feat: replace Loading component with modern CSS animation - Replace SVG Loading with CSS mask animation - Remove unused Loading.tsx file and exports - Use Tailwind sizing classes - Improve performance and reduce bundle size * style: refine shadows and remove test styles - Remove test background color from AccountItem - Fix Dialog shadow class name - Adjust shadow values for better visual hierarchy - Update modal backdrop opacity for improved contrast * fix: remove useless code * fix(chore): fix test of walletconnect --------- Co-authored-by: “Gintma” --- examples/with-vite/src/main.tsx | 3 +- packages/core/src/connectors/test-helper.ts | 2 +- packages/core/src/connectors/walletconnect.ts | 2 +- packages/ui/src/assets/icons/Loading.tsx | 16 ------ packages/ui/src/assets/icons/index.ts | 1 - .../AccountDetailsModal/MainView.tsx | 22 +++---- .../AccountDetailsModal/SwitchAccountView.tsx | 2 +- .../components/AccountDetailsModal/index.tsx | 2 +- .../ui/src/components/ChainList/index.tsx | 11 +--- .../ConnectModal/ConnectOptions.tsx | 10 ++-- .../ConnectModal/DesktopOptions.tsx | 0 .../components/ConnectModal/MobileOptions.tsx | 0 .../components/ConnectModal/WalletView.tsx | 57 +++++++++++-------- .../ui/src/components/ConnectModal/index.tsx | 26 ++++++--- packages/ui/src/components/Dialog/index.tsx | 2 +- packages/ui/src/components/QRCode/index.tsx | 6 +- .../ui/src/hooks/useCSSVariableInjection.ts | 2 +- packages/ui/src/styles/base.css | 34 +++++++---- packages/ui/src/theme/types.ts | 3 +- 19 files changed, 105 insertions(+), 96 deletions(-) delete mode 100644 packages/ui/src/assets/icons/Loading.tsx create mode 100644 packages/ui/src/components/ConnectModal/DesktopOptions.tsx create mode 100644 packages/ui/src/components/ConnectModal/MobileOptions.tsx diff --git a/examples/with-vite/src/main.tsx b/examples/with-vite/src/main.tsx index 1343351..f8dcda3 100644 --- a/examples/with-vite/src/main.tsx +++ b/examples/with-vite/src/main.tsx @@ -25,8 +25,7 @@ const lunoConfig = createConfig({ createRoot(document.getElementById('root')!).render( - ( describe('installation and availability', () => { it('should always be installed', () => { - expect(connector.isInstalled()).toBe(true); + expect(connector.isInstalled()).toBe(false); }); it('should always be available', async () => { diff --git a/packages/core/src/connectors/walletconnect.ts b/packages/core/src/connectors/walletconnect.ts index db1871f..a141351 100644 --- a/packages/core/src/connectors/walletconnect.ts +++ b/packages/core/src/connectors/walletconnect.ts @@ -34,7 +34,7 @@ export class WalletConnectConnector extends BaseConnector { } public isInstalled(): boolean { - return true; + return false; } public async isAvailable(): Promise { diff --git a/packages/ui/src/assets/icons/Loading.tsx b/packages/ui/src/assets/icons/Loading.tsx deleted file mode 100644 index dcfac19..0000000 --- a/packages/ui/src/assets/icons/Loading.tsx +++ /dev/null @@ -1,16 +0,0 @@ -import * as React from "react"; -import type { SVGProps } from "react"; -const SvgLoading = (props: SVGProps) => ( - - - -); -export default SvgLoading; diff --git a/packages/ui/src/assets/icons/index.ts b/packages/ui/src/assets/icons/index.ts index be3e86f..77994b5 100644 --- a/packages/ui/src/assets/icons/index.ts +++ b/packages/ui/src/assets/icons/index.ts @@ -4,6 +4,5 @@ export { default as Close } from "./Close"; export { default as Copy } from "./Copy"; export { default as Disconnect } from "./Disconnect"; export { default as List } from "./List"; -export { default as Loading } from "./Loading"; export { default as Success } from "./Success"; export { default as Switch } from "./Switch"; diff --git a/packages/ui/src/components/AccountDetailsModal/MainView.tsx b/packages/ui/src/components/AccountDetailsModal/MainView.tsx index 21815da..70f15b7 100644 --- a/packages/ui/src/components/AccountDetailsModal/MainView.tsx +++ b/packages/ui/src/components/AccountDetailsModal/MainView.tsx @@ -25,17 +25,19 @@ export const MainView: React.FC = ({ content: (
- +
+ +
{chain?.name || 'Polkadot'}
-
- -
+ +
*/}
), onClick: () => onViewChange(AccountModalView.switchChain) @@ -77,7 +79,7 @@ export const MainView: React.FC = ({ ))}
-
+
@@ -95,7 +97,7 @@ const SelectItem = ({ children, onClick }: { children: React.ReactNode; onClick? type="button" onClick={() => onClick?.()} className={cs( - 'w-full p-3.5 rounded-accountActionItem border-none text-left flex items-center gap-2 font-medium', + 'w-full p-2.5 rounded-accountActionItem border-none text-left flex items-center gap-2 font-medium', 'bg-accountActionItemBackground hover:bg-accountActionItemBackgroundHover', 'transition-colors duration-200', onClick ? 'cursor-pointer' : 'cursor-auto' diff --git a/packages/ui/src/components/AccountDetailsModal/SwitchAccountView.tsx b/packages/ui/src/components/AccountDetailsModal/SwitchAccountView.tsx index db4381e..efb7fba 100644 --- a/packages/ui/src/components/AccountDetailsModal/SwitchAccountView.tsx +++ b/packages/ui/src/components/AccountDetailsModal/SwitchAccountView.tsx @@ -68,7 +68,7 @@ const AccountItem: React.FC = React.memo(({ disabled={isSelected} >
-
+
{connector?.icon && luno account}
diff --git a/packages/ui/src/components/AccountDetailsModal/index.tsx b/packages/ui/src/components/AccountDetailsModal/index.tsx index 209e345..bfee6cb 100644 --- a/packages/ui/src/components/AccountDetailsModal/index.tsx +++ b/packages/ui/src/components/AccountDetailsModal/index.tsx @@ -77,7 +77,7 @@ export const AccountDetailsModal: React.FC = () => {
)} -
+
Account Details
diff --git a/packages/ui/src/components/ChainList/index.tsx b/packages/ui/src/components/ChainList/index.tsx index d5213c1..99e2412 100644 --- a/packages/ui/src/components/ChainList/index.tsx +++ b/packages/ui/src/components/ChainList/index.tsx @@ -3,7 +3,6 @@ import { cs } from '../../utils' import { useApi, useChain, useChains, useSwitchChain } from '@luno-kit/react' import type { Chain } from '@luno-kit/react' import { ChainIcon } from '../ChainIcon' -import { Loading } from '../../assets/icons' enum ChainFilter { all = 'All', @@ -117,7 +116,7 @@ const ChainItem: React.FC = React.memo(({ onClick={() => onSelect(chain)} disabled={isSelected || isLoading} className={cs( - 'flex items-center justify-between p-2 rounded-sm', + 'flex items-center justify-between p-2.5 rounded-networkSelectItem', 'bg-networkSelectItemBackground', 'transition-colors duration-200', (isSelected || isLoading) @@ -129,7 +128,7 @@ const ChainItem: React.FC = React.memo(({ >
@@ -147,11 +146,7 @@ const ChainItem: React.FC = React.memo(({ ? ( <> Switching - +
) : ( diff --git a/packages/ui/src/components/ConnectModal/ConnectOptions.tsx b/packages/ui/src/components/ConnectModal/ConnectOptions.tsx index cece5ef..c88d257 100644 --- a/packages/ui/src/components/ConnectModal/ConnectOptions.tsx +++ b/packages/ui/src/components/ConnectModal/ConnectOptions.tsx @@ -27,8 +27,8 @@ export const ConnectOptions = React.memo(({ onConnect }: Props) => { return (
-
-
Installed
+
+
Installed
{installedConnectors.map(i => ( onConnect(i)}/> @@ -37,8 +37,8 @@ export const ConnectOptions = React.memo(({ onConnect }: Props) => {
{moreConnectors.length > 0 && ( -
-
More
+
+
More
{moreConnectors.map(i => ( onConnect(i)}/> @@ -65,7 +65,7 @@ const ConnectorItem: React.FC = React.memo(({connector, onCo 'text-left' )} > -
+
{connector.name} {isWide && (
@@ -40,55 +40,60 @@ export const WalletView = React.memo(({ selectedConnector, onConnect, qrCode, is
)} -
{selectedConnector ? showQRCode ? ( -
- -
- Scan the QR Code with {selectedConnector.id === 'nova' ? 'the Nova app' : 'your phone'} +
+ +
+ Scan the QR code with {selectedConnector.id === 'nova' ? 'the Nova' : 'your phone'}
- {selectedConnector.links?.browserExtension + +
+ {selectedConnector.links?.browserExtension ? (

window.open(selectedConnector.links.browserExtension)} - className={'cursor-pointer pt-[16px] text-base leading-base text-accentColor font-bold text-center'}> - Don‘t have {selectedConnector.name}? + className={'cursor-pointer text-sm text-accentColor font-medium text-center hover:text-modalText'}> + Don't have {selectedConnector.name}?

) : qrCode - ? + ? : null} + +
+ +
) : ( <> -
+
-

+

Opening {selectedConnector.name}...

-

+

Confirm connection in the extension

{connectState.isConnecting && ( - +
)} {!selectedConnector.isInstalled() && selectedConnector.links.browserExtension && (

window.open(selectedConnector.links.browserExtension)} - className={'cursor-pointer pt-[16px] text-base leading-base text-accentColor font-bold text-center'}> + className={'cursor-pointer pt-6 text-sm text-accentColor font-medium text-center hover:text-modalText'}> Don‘t have {selectedConnector.name}?

)} {!connectState.isConnecting && connectState.isError && selectedConnector.isInstalled() && (
diff --git a/packages/ui/src/components/ConnectModal/index.tsx b/packages/ui/src/components/ConnectModal/index.tsx index efc401d..6a2a18f 100644 --- a/packages/ui/src/components/ConnectModal/index.tsx +++ b/packages/ui/src/components/ConnectModal/index.tsx @@ -100,14 +100,17 @@ export const ConnectModal: React.FC = ({
{currentView === ConnectModalView.connectOptions ? ( - - Connect Wallet - + <> + {!isWide &&
} + + Connect Wallet + + ) : ( <>
+ {!isWide && currentView === ConnectModalView.connectOptions && ( + <> +

window.open('https://polkadot.com/get-started/wallets/')}> + New to wallets? +

+ + )} +
{isWide && ( diff --git a/packages/ui/src/components/Dialog/index.tsx b/packages/ui/src/components/Dialog/index.tsx index 9a74c58..fe6cf27 100644 --- a/packages/ui/src/components/Dialog/index.tsx +++ b/packages/ui/src/components/Dialog/index.tsx @@ -44,7 +44,7 @@ const DialogRoot: React.FC = ({ { const dots = []; for (let i = 0; i < QR_GRID_SIZE; i++) { for (let j = 0; j < QR_GRID_SIZE; j++) { - if (i >= arenaStart && i <= arenaEnd && j >= arenaStart && j <= arenaEnd) continue; + if (i >= arenaStart && i < arenaEnd && j >= arenaStart && j < arenaEnd) continue; const isInFinder = (i < FINDER_SIZE_WITH_MARGIN && j < FINDER_SIZE_WITH_MARGIN) || @@ -95,7 +95,7 @@ export const QRCode = ({ }; const renderArenaLogo = () => { - const logoStart = Math.ceil(QR_GRID_SIZE / 2 - ARENA_GRID_SIZE / 2) * cellSize; + const logoStart = arenaStart * cellSize; return (
Date: Mon, 11 Aug 2025 13:52:56 +0800 Subject: [PATCH 19/45] fix(chore): Update signMessage method to support optional chainId parameter (#64) --- packages/core/src/connectors/base.ts | 2 +- packages/core/src/connectors/walletconnect.ts | 6 +++++- packages/core/src/types/connector.ts | 2 +- packages/react/src/hooks/useSignMessage.ts | 5 +++-- 4 files changed, 10 insertions(+), 5 deletions(-) diff --git a/packages/core/src/connectors/base.ts b/packages/core/src/connectors/base.ts index 1cf780f..9000118 100644 --- a/packages/core/src/connectors/base.ts +++ b/packages/core/src/connectors/base.ts @@ -88,7 +88,7 @@ export abstract class BaseConnector extends EventEmitter { /** * sign a message with the specified account. */ - abstract signMessage(message: string, address: string): Promise; + abstract signMessage(message: string, address: string, chainId?: string): Promise; public hasConnectionUri(): boolean { return false diff --git a/packages/core/src/connectors/walletconnect.ts b/packages/core/src/connectors/walletconnect.ts index a141351..780f112 100644 --- a/packages/core/src/connectors/walletconnect.ts +++ b/packages/core/src/connectors/walletconnect.ts @@ -176,10 +176,14 @@ export class WalletConnectConnector extends BaseConnector { throw new Error("Provider not initialized or not connected"); } + const targetChainId = chainId + ? `polkadot:${chainId.replace('0x', '').slice(0, 32)}` + : this.convertChainIdToCaipId(this.connectedChains!)[0] + try { const result = await this.provider.client.request({ topic: this.session.topic, - chainId: this.convertChainIdToCaipId(this.connectedChains!)[0], + chainId: targetChainId, request: { method: 'polkadot_signMessage', params: { diff --git a/packages/core/src/types/connector.ts b/packages/core/src/types/connector.ts index ca0be17..336db66 100644 --- a/packages/core/src/types/connector.ts +++ b/packages/core/src/types/connector.ts @@ -20,7 +20,7 @@ export interface Connector extends EventEmitter { disconnect(): Promise; getAccounts(): Promise>; getSigner(): Promise; - signMessage(message: string, address: string): Promise; + signMessage(message: string, address: string, chainId?: string): Promise; hasConnectionUri(): boolean; getConnectionUri(): Promise; updateAccountsForChain(chainId: string): Promise; diff --git a/packages/react/src/hooks/useSignMessage.ts b/packages/react/src/hooks/useSignMessage.ts index ab9d1f8..0a44670 100644 --- a/packages/react/src/hooks/useSignMessage.ts +++ b/packages/react/src/hooks/useSignMessage.ts @@ -41,7 +41,7 @@ export interface UseSignMessageResult { export function useSignMessage( hookLevelConfig?: UseSignMessageOptions ): UseSignMessageResult { - const { activeConnector, account, accounts } = useLuno(); + const { activeConnector, account, accounts, currentChainId } = useLuno(); const mutationFn = async ( variables: SignMessageVariables @@ -63,7 +63,8 @@ export function useSignMessage( const signatureString = await activeConnector.signMessage( variables.message, - account.address + account.address, + currentChainId, ); if (!signatureString) { From 28c7f8eaaadd5c88d0ffcb9cdca66bcf7481da34 Mon Sep 17 00:00:00 2001 From: WBH <48749219+wbh1328551759@users.noreply.github.com> Date: Tue, 12 Aug 2025 17:44:11 +0800 Subject: [PATCH 20/45] Fix/UI bug (#66) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Develop (#62) * update README and fix GitHub Actions * Chore/UI work (#24) * fix(ui): resolve Radix UI Dialog TypeScript errors - Add proper type interfaces for Dialog components - Fix ModalContext missing closeConnectModal method - Handle @tanstack/react-query v5 API changes - Use React.createElement to bypass Radix UI type restrictions * feat(ui): add new theme system with light/dark presets and CSS variables * fix: resolve chain modal issues and optimize theme system * feat: save current theme system state before refactoring * fix: resolve UI build issues and restore theme system - Fix base.css theme syntax to use @theme inline with var() instead of theme() - Restore missing dark theme variables (spacing, typography, fonts, radii, blurs) - Update theme context structure and remove defaultTheme.ts - Update LunoKitProvider to use new theme system - Fix PostCSS configuration for Tailwind CSS v4 * feat: remove toggleTheme and add auto system theme following - Remove toggleTheme function from ThemeProvider - Add useSystemTheme hook to detect system color scheme - Add auto-following system theme when both light and dark are provided - Add isAutoMode flag to indicate auto-following state - Update example app to use setThemeMode instead of toggleTheme - Maintain backward compatibility with existing theme system * feat: optimize theme persistence logic - only persist when user has theme choice * fix: remove defaultTheme from LunoKitProvider to match ThemeProvider interface * feat(theme): remove localStorage persistence and fix dark theme logic - Remove theme localStorage persistence - Fix dark theme not applying with theme={{dark:{}}} - Simplify theme initialization and switching logic * refactor(ui): standardize design │ │ tokens and remove style duplicates * feat(ui): Modify the rounded property of some components. * refactor(AccountDetailsModal): simplify view transitions to height-only animation * refactor(ui):Optimize code structure, remove unused code * feat(theme): enhance theme system with auto-mode and user preferences - Add autoMode support for system theme following - Implement localStorage persistence for user choices - Add setThemeChoice API for explicit user actions - Remove unused dependencies (postcss-import) - Clean up redundant size props and methods - Fix hook functionality and simplify API - Improve theme initialization priority logic * refactor(ui): replace localStorage with config.storage in theme system * refactor(theme): optimize theme system and eliminate flashing - Extract CSS variable injection logic to separate file (cssVariableInject.ts) - Optimize initial theme state calculation to prevent flashing - Simplify theme preference interface (isAuto, preferredTheme) - Fix system theme detection with proper initialization - Remove redundant state management and async loading * refactor(theme): replace LunoStorage with localStorage for theme persistence * feat(examples): Remove auto mode label --------- Co-authored-by: “Gintma” * fix bug in walletconnect * fix(core): fix disconnect of walletconnectConnector * fix(ui): fix openConnectModal & refresh qrcode in ConnectModal * Chore/UI work (#25) * fix(ui): resolve Radix UI Dialog TypeScript errors - Add proper type interfaces for Dialog components - Fix ModalContext missing closeConnectModal method - Handle @tanstack/react-query v5 API changes - Use React.createElement to bypass Radix UI type restrictions * feat(ui): add new theme system with light/dark presets and CSS variables * fix: resolve chain modal issues and optimize theme system * feat: save current theme system state before refactoring * fix: resolve UI build issues and restore theme system - Fix base.css theme syntax to use @theme inline with var() instead of theme() - Restore missing dark theme variables (spacing, typography, fonts, radii, blurs) - Update theme context structure and remove defaultTheme.ts - Update LunoKitProvider to use new theme system - Fix PostCSS configuration for Tailwind CSS v4 * feat: remove toggleTheme and add auto system theme following - Remove toggleTheme function from ThemeProvider - Add useSystemTheme hook to detect system color scheme - Add auto-following system theme when both light and dark are provided - Add isAutoMode flag to indicate auto-following state - Update example app to use setThemeMode instead of toggleTheme - Maintain backward compatibility with existing theme system * feat: optimize theme persistence logic - only persist when user has theme choice * fix: remove defaultTheme from LunoKitProvider to match ThemeProvider interface * feat(theme): remove localStorage persistence and fix dark theme logic - Remove theme localStorage persistence - Fix dark theme not applying with theme={{dark:{}}} - Simplify theme initialization and switching logic * refactor(ui): standardize design │ │ tokens and remove style duplicates * feat(ui): Modify the rounded property of some components. * refactor(AccountDetailsModal): simplify view transitions to height-only animation * refactor(ui):Optimize code structure, remove unused code * feat(theme): enhance theme system with auto-mode and user preferences - Add autoMode support for system theme following - Implement localStorage persistence for user choices - Add setThemeChoice API for explicit user actions - Remove unused dependencies (postcss-import) - Clean up redundant size props and methods - Fix hook functionality and simplify API - Improve theme initialization priority logic * refactor(ui): replace localStorage with config.storage in theme system * refactor(theme): optimize theme system and eliminate flashing - Extract CSS variable injection logic to separate file (cssVariableInject.ts) - Optimize initial theme state calculation to prevent flashing - Simplify theme preference interface (isAuto, preferredTheme) - Fix system theme detection with proper initialization - Remove redundant state management and async loading * refactor(theme): replace LunoStorage with localStorage for theme persistence * feat(examples): Remove auto mode label * feat: implement QR code skeleton loading state --------- Co-authored-by: “Gintma” * Chore/ci cd readme (#27) * chore: update README and fix GitHub Actions * chore: update working-directory for pnpm audit --------- Co-authored-by: Gintma * Feat/mobile UI (#28) * feat(core): In novaConnector, add support for novaMobileConnector * feat(ui): Add "useWindowSize", optimize responsive design * feat(core): add links field with browserExtension & deepLink and add test code * feat(ui): enhance CSS styles with mobile responsiveness --------- Co-authored-by: Gintma * fix(ui): fix view switching logic in ConnectModal component (#30) * Fix/connect modal (#32) * Develop (#29) * update README and fix GitHub Actions * Chore/UI work (#24) * fix(ui): resolve Radix UI Dialog TypeScript errors - Add proper type interfaces for Dialog components - Fix ModalContext missing closeConnectModal method - Handle @tanstack/react-query v5 API changes - Use React.createElement to bypass Radix UI type restrictions * feat(ui): add new theme system with light/dark presets and CSS variables * fix: resolve chain modal issues and optimize theme system * feat: save current theme system state before refactoring * fix: resolve UI build issues and restore theme system - Fix base.css theme syntax to use @theme inline with var() instead of theme() - Restore missing dark theme variables (spacing, typography, fonts, radii, blurs) - Update theme context structure and remove defaultTheme.ts - Update LunoKitProvider to use new theme system - Fix PostCSS configuration for Tailwind CSS v4 * feat: remove toggleTheme and add auto system theme following - Remove toggleTheme function from ThemeProvider - Add useSystemTheme hook to detect system color scheme - Add auto-following system theme when both light and dark are provided - Add isAutoMode flag to indicate auto-following state - Update example app to use setThemeMode instead of toggleTheme - Maintain backward compatibility with existing theme system * feat: optimize theme persistence logic - only persist when user has theme choice * fix: remove defaultTheme from LunoKitProvider to match ThemeProvider interface * feat(theme): remove localStorage persistence and fix dark theme logic - Remove theme localStorage persistence - Fix dark theme not applying with theme={{dark:{}}} - Simplify theme initialization and switching logic * refactor(ui): standardize design │ │ tokens and remove style duplicates * feat(ui): Modify the rounded property of some components. * refactor(AccountDetailsModal): simplify view transitions to height-only animation * refactor(ui):Optimize code structure, remove unused code * feat(theme): enhance theme system with auto-mode and user preferences - Add autoMode support for system theme following - Implement localStorage persistence for user choices - Add setThemeChoice API for explicit user actions - Remove unused dependencies (postcss-import) - Clean up redundant size props and methods - Fix hook functionality and simplify API - Improve theme initialization priority logic * refactor(ui): replace localStorage with config.storage in theme system * refactor(theme): optimize theme system and eliminate flashing - Extract CSS variable injection logic to separate file (cssVariableInject.ts) - Optimize initial theme state calculation to prevent flashing - Simplify theme preference interface (isAuto, preferredTheme) - Fix system theme detection with proper initialization - Remove redundant state management and async loading * refactor(theme): replace LunoStorage with localStorage for theme persistence * feat(examples): Remove auto mode label --------- Co-authored-by: “Gintma” * fix bug in walletconnect * fix(core): fix disconnect of walletconnectConnector * fix(ui): fix openConnectModal & refresh qrcode in ConnectModal * Chore/UI work (#25) * fix(ui): resolve Radix UI Dialog TypeScript errors - Add proper type interfaces for Dialog components - Fix ModalContext missing closeConnectModal method - Handle @tanstack/react-query v5 API changes - Use React.createElement to bypass Radix UI type restrictions * feat(ui): add new theme system with light/dark presets and CSS variables * fix: resolve chain modal issues and optimize theme system * feat: save current theme system state before refactoring * fix: resolve UI build issues and restore theme system - Fix base.css theme syntax to use @theme inline with var() instead of theme() - Restore missing dark theme variables (spacing, typography, fonts, radii, blurs) - Update theme context structure and remove defaultTheme.ts - Update LunoKitProvider to use new theme system - Fix PostCSS configuration for Tailwind CSS v4 * feat: remove toggleTheme and add auto system theme following - Remove toggleTheme function from ThemeProvider - Add useSystemTheme hook to detect system color scheme - Add auto-following system theme when both light and dark are provided - Add isAutoMode flag to indicate auto-following state - Update example app to use setThemeMode instead of toggleTheme - Maintain backward compatibility with existing theme system * feat: optimize theme persistence logic - only persist when user has theme choice * fix: remove defaultTheme from LunoKitProvider to match ThemeProvider interface * feat(theme): remove localStorage persistence and fix dark theme logic - Remove theme localStorage persistence - Fix dark theme not applying with theme={{dark:{}}} - Simplify theme initialization and switching logic * refactor(ui): standardize design │ │ tokens and remove style duplicates * feat(ui): Modify the rounded property of some components. * refactor(AccountDetailsModal): simplify view transitions to height-only animation * refactor(ui):Optimize code structure, remove unused code * feat(theme): enhance theme system with auto-mode and user preferences - Add autoMode support for system theme following - Implement localStorage persistence for user choices - Add setThemeChoice API for explicit user actions - Remove unused dependencies (postcss-import) - Clean up redundant size props and methods - Fix hook functionality and simplify API - Improve theme initialization priority logic * refactor(ui): replace localStorage with config.storage in theme system * refactor(theme): optimize theme system and eliminate flashing - Extract CSS variable injection logic to separate file (cssVariableInject.ts) - Optimize initial theme state calculation to prevent flashing - Simplify theme preference interface (isAuto, preferredTheme) - Fix system theme detection with proper initialization - Remove redundant state management and async loading * refactor(theme): replace LunoStorage with localStorage for theme persistence * feat(examples): Remove auto mode label * feat: implement QR code skeleton loading state --------- Co-authored-by: “Gintma” * Chore/ci cd readme (#27) * chore: update README and fix GitHub Actions * chore: update working-directory for pnpm audit --------- Co-authored-by: Gintma * Feat/mobile UI (#28) * feat(core): In novaConnector, add support for novaMobileConnector * feat(ui): Add "useWindowSize", optimize responsive design * feat(core): add links field with browserExtension & deepLink and add test code * feat(ui): enhance CSS styles with mobile responsiveness --------- Co-authored-by: Gintma --------- Co-authored-by: “Gintma” * fix(ui): fix view switching logic in ConnectModal component --------- Co-authored-by: “Gintma” * fix(with-vite): fix undifined of Notification * fix(ui): fix view switching logic in ConnectModal component * fix(with-vite): fix undifined of Notification * fix(with-vite): Fix the reference of the Notification object to ensure that it is accessed through the window object when used. * fix(ui): fix view switching logic in ConnectModal component * fix(with-vite): fix undifined of Notification * fix(with-vite): Fix the reference of the Notification object to ensure that it is accessed through the window object when used. * fix(ui): fix connect in mobile * fix(ui): fix view switching logic in ConnectModal component * fix(with-vite): fix undifined of Notification * fix(with-vite): Fix the reference of the Notification object to ensure that it is accessed through the window object when used. * fix(ui): fix connect in mobile * Fix/create api (#39) * feat(react): migrate from DedotClient to LegacyClient * fix(ui): fix theme type definitions and improve prop interface * fix(ui): fix css style in ConnectButton * feat(core): add browser download link in novaConnector * feat(ui): fix ConnectModal responsive view switching and enhance WalletView QR code features * Fix/create api (#40) * feat(react): migrate from DedotClient to LegacyClient * fix(ui): fix theme type definitions and improve prop interface * fix(ui): fix css style in ConnectButton * feat(core): add browser download link in novaConnector * feat(ui): fix ConnectModal responsive view switching and enhance WalletView QR code features * feat(core): add injectorId support to CommonConnector for custom injector identification * Fix/create api (#42) * feat(react): migrate from DedotClient to LegacyClient * fix(ui): fix theme type definitions and improve prop interface * fix(ui): fix css style in ConnectButton * feat(core): add browser download link in novaConnector * feat(ui): fix ConnectModal responsive view switching and enhance WalletView QR code features * feat(core): add injectorId support to CommonConnector for custom injector identification * fix(react): add disconnect logic when account address is missing on account change * fix(ui): fix error and loading states in WalletView component * Chore/ci cd readme (#43) * chore: update README and fix GitHub Actions * chore: update working-directory for pnpm audit * chore: add release action --------- Co-authored-by: Gintma * Fix/create api (#56) * feat(react): migrate from DedotClient to LegacyClient * fix(ui): fix theme type definitions and improve prop interface * fix(ui): fix css style in ConnectButton * feat(core): add browser download link in novaConnector * feat(ui): fix ConnectModal responsive view switching and enhance WalletView QR code features * feat(core): add injectorId support to CommonConnector for custom injector identification * fix(react): add disconnect logic when account address is missing on account change * fix(ui): fix error and loading states in WalletView component * feat(with-vite): add .env.local.example * feat(example): Add environment variable example file and update connectors to use from environment variables (#61) --------- Co-authored-by: “Gintma” * fix(chore): Update signMessage method to support optional chainId parameter * Develop (#65) * update README and fix GitHub Actions * Chore/UI work (#24) * fix(ui): resolve Radix UI Dialog TypeScript errors - Add proper type interfaces for Dialog components - Fix ModalContext missing closeConnectModal method - Handle @tanstack/react-query v5 API changes - Use React.createElement to bypass Radix UI type restrictions * feat(ui): add new theme system with light/dark presets and CSS variables * fix: resolve chain modal issues and optimize theme system * feat: save current theme system state before refactoring * fix: resolve UI build issues and restore theme system - Fix base.css theme syntax to use @theme inline with var() instead of theme() - Restore missing dark theme variables (spacing, typography, fonts, radii, blurs) - Update theme context structure and remove defaultTheme.ts - Update LunoKitProvider to use new theme system - Fix PostCSS configuration for Tailwind CSS v4 * feat: remove toggleTheme and add auto system theme following - Remove toggleTheme function from ThemeProvider - Add useSystemTheme hook to detect system color scheme - Add auto-following system theme when both light and dark are provided - Add isAutoMode flag to indicate auto-following state - Update example app to use setThemeMode instead of toggleTheme - Maintain backward compatibility with existing theme system * feat: optimize theme persistence logic - only persist when user has theme choice * fix: remove defaultTheme from LunoKitProvider to match ThemeProvider interface * feat(theme): remove localStorage persistence and fix dark theme logic - Remove theme localStorage persistence - Fix dark theme not applying with theme={{dark:{}}} - Simplify theme initialization and switching logic * refactor(ui): standardize design │ │ tokens and remove style duplicates * feat(ui): Modify the rounded property of some components. * refactor(AccountDetailsModal): simplify view transitions to height-only animation * refactor(ui):Optimize code structure, remove unused code * feat(theme): enhance theme system with auto-mode and user preferences - Add autoMode support for system theme following - Implement localStorage persistence for user choices - Add setThemeChoice API for explicit user actions - Remove unused dependencies (postcss-import) - Clean up redundant size props and methods - Fix hook functionality and simplify API - Improve theme initialization priority logic * refactor(ui): replace localStorage with config.storage in theme system * refactor(theme): optimize theme system and eliminate flashing - Extract CSS variable injection logic to separate file (cssVariableInject.ts) - Optimize initial theme state calculation to prevent flashing - Simplify theme preference interface (isAuto, preferredTheme) - Fix system theme detection with proper initialization - Remove redundant state management and async loading * refactor(theme): replace LunoStorage with localStorage for theme persistence * feat(examples): Remove auto mode label --------- Co-authored-by: “Gintma” * fix bug in walletconnect * fix(core): fix disconnect of walletconnectConnector * fix(ui): fix openConnectModal & refresh qrcode in ConnectModal * Chore/UI work (#25) * fix(ui): resolve Radix UI Dialog TypeScript errors - Add proper type interfaces for Dialog components - Fix ModalContext missing closeConnectModal method - Handle @tanstack/react-query v5 API changes - Use React.createElement to bypass Radix UI type restrictions * feat(ui): add new theme system with light/dark presets and CSS variables * fix: resolve chain modal issues and optimize theme system * feat: save current theme system state before refactoring * fix: resolve UI build issues and restore theme system - Fix base.css theme syntax to use @theme inline with var() instead of theme() - Restore missing dark theme variables (spacing, typography, fonts, radii, blurs) - Update theme context structure and remove defaultTheme.ts - Update LunoKitProvider to use new theme system - Fix PostCSS configuration for Tailwind CSS v4 * feat: remove toggleTheme and add auto system theme following - Remove toggleTheme function from ThemeProvider - Add useSystemTheme hook to detect system color scheme - Add auto-following system theme when both light and dark are provided - Add isAutoMode flag to indicate auto-following state - Update example app to use setThemeMode instead of toggleTheme - Maintain backward compatibility with existing theme system * feat: optimize theme persistence logic - only persist when user has theme choice * fix: remove defaultTheme from LunoKitProvider to match ThemeProvider interface * feat(theme): remove localStorage persistence and fix dark theme logic - Remove theme localStorage persistence - Fix dark theme not applying with theme={{dark:{}}} - Simplify theme initialization and switching logic * refactor(ui): standardize design │ │ tokens and remove style duplicates * feat(ui): Modify the rounded property of some components. * refactor(AccountDetailsModal): simplify view transitions to height-only animation * refactor(ui):Optimize code structure, remove unused code * feat(theme): enhance theme system with auto-mode and user preferences - Add autoMode support for system theme following - Implement localStorage persistence for user choices - Add setThemeChoice API for explicit user actions - Remove unused dependencies (postcss-import) - Clean up redundant size props and methods - Fix hook functionality and simplify API - Improve theme initialization priority logic * refactor(ui): replace localStorage with config.storage in theme system * refactor(theme): optimize theme system and eliminate flashing - Extract CSS variable injection logic to separate file (cssVariableInject.ts) - Optimize initial theme state calculation to prevent flashing - Simplify theme preference interface (isAuto, preferredTheme) - Fix system theme detection with proper initialization - Remove redundant state management and async loading * refactor(theme): replace LunoStorage with localStorage for theme persistence * feat(examples): Remove auto mode label * feat: implement QR code skeleton loading state --------- Co-authored-by: “Gintma” * Chore/ci cd readme (#27) * chore: update README and fix GitHub Actions * chore: update working-directory for pnpm audit --------- Co-authored-by: Gintma * Feat/mobile UI (#28) * feat(core): In novaConnector, add support for novaMobileConnector * feat(ui): Add "useWindowSize", optimize responsive design * feat(core): add links field with browserExtension & deepLink and add test code * feat(ui): enhance CSS styles with mobile responsiveness --------- Co-authored-by: Gintma * fix(ui): fix view switching logic in ConnectModal component (#30) * Fix/connect modal (#32) * Develop (#29) * update README and fix GitHub Actions * Chore/UI work (#24) * fix(ui): resolve Radix UI Dialog TypeScript errors - Add proper type interfaces for Dialog components - Fix ModalContext missing closeConnectModal method - Handle @tanstack/react-query v5 API changes - Use React.createElement to bypass Radix UI type restrictions * feat(ui): add new theme system with light/dark presets and CSS variables * fix: resolve chain modal issues and optimize theme system * feat: save current theme system state before refactoring * fix: resolve UI build issues and restore theme system - Fix base.css theme syntax to use @theme inline with var() instead of theme() - Restore missing dark theme variables (spacing, typography, fonts, radii, blurs) - Update theme context structure and remove defaultTheme.ts - Update LunoKitProvider to use new theme system - Fix PostCSS configuration for Tailwind CSS v4 * feat: remove toggleTheme and add auto system theme following - Remove toggleTheme function from ThemeProvider - Add useSystemTheme hook to detect system color scheme - Add auto-following system theme when both light and dark are provided - Add isAutoMode flag to indicate auto-following state - Update example app to use setThemeMode instead of toggleTheme - Maintain backward compatibility with existing theme system * feat: optimize theme persistence logic - only persist when user has theme choice * fix: remove defaultTheme from LunoKitProvider to match ThemeProvider interface * feat(theme): remove localStorage persistence and fix dark theme logic - Remove theme localStorage persistence - Fix dark theme not applying with theme={{dark:{}}} - Simplify theme initialization and switching logic * refactor(ui): standardize design │ │ tokens and remove style duplicates * feat(ui): Modify the rounded property of some components. * refactor(AccountDetailsModal): simplify view transitions to height-only animation * refactor(ui):Optimize code structure, remove unused code * feat(theme): enhance theme system with auto-mode and user preferences - Add autoMode support for system theme following - Implement localStorage persistence for user choices - Add setThemeChoice API for explicit user actions - Remove unused dependencies (postcss-import) - Clean up redundant size props and methods - Fix hook functionality and simplify API - Improve theme initialization priority logic * refactor(ui): replace localStorage with config.storage in theme system * refactor(theme): optimize theme system and eliminate flashing - Extract CSS variable injection logic to separate file (cssVariableInject.ts) - Optimize initial theme state calculation to prevent flashing - Simplify theme preference interface (isAuto, preferredTheme) - Fix system theme detection with proper initialization - Remove redundant state management and async loading * refactor(theme): replace LunoStorage with localStorage for theme persistence * feat(examples): Remove auto mode label --------- Co-authored-by: “Gintma” * fix bug in walletconnect * fix(core): fix disconnect of walletconnectConnector * fix(ui): fix openConnectModal & refresh qrcode in ConnectModal * Chore/UI work (#25) * fix(ui): resolve Radix UI Dialog TypeScript errors - Add proper type interfaces for Dialog components - Fix ModalContext missing closeConnectModal method - Handle @tanstack/react-query v5 API changes - Use React.createElement to bypass Radix UI type restrictions * feat(ui): add new theme system with light/dark presets and CSS variables * fix: resolve chain modal issues and optimize theme system * feat: save current theme system state before refactoring * fix: resolve UI build issues and restore theme system - Fix base.css theme syntax to use @theme inline with var() instead of theme() - Restore missing dark theme variables (spacing, typography, fonts, radii, blurs) - Update theme context structure and remove defaultTheme.ts - Update LunoKitProvider to use new theme system - Fix PostCSS configuration for Tailwind CSS v4 * feat: remove toggleTheme and add auto system theme following - Remove toggleTheme function from ThemeProvider - Add useSystemTheme hook to detect system color scheme - Add auto-following system theme when both light and dark are provided - Add isAutoMode flag to indicate auto-following state - Update example app to use setThemeMode instead of toggleTheme - Maintain backward compatibility with existing theme system * feat: optimize theme persistence logic - only persist when user has theme choice * fix: remove defaultTheme from LunoKitProvider to match ThemeProvider interface * feat(theme): remove localStorage persistence and fix dark theme logic - Remove theme localStorage persistence - Fix dark theme not applying with theme={{dark:{}}} - Simplify theme initialization and switching logic * refactor(ui): standardize design │ │ tokens and remove style duplicates * feat(ui): Modify the rounded property of some components. * refactor(AccountDetailsModal): simplify view transitions to height-only animation * refactor(ui):Optimize code structure, remove unused code * feat(theme): enhance theme system with auto-mode and user preferences - Add autoMode support for system theme following - Implement localStorage persistence for user choices - Add setThemeChoice API for explicit user actions - Remove unused dependencies (postcss-import) - Clean up redundant size props and methods - Fix hook functionality and simplify API - Improve theme initialization priority logic * refactor(ui): replace localStorage with config.storage in theme system * refactor(theme): optimize theme system and eliminate flashing - Extract CSS variable injection logic to separate file (cssVariableInject.ts) - Optimize initial theme state calculation to prevent flashing - Simplify theme preference interface (isAuto, preferredTheme) - Fix system theme detection with proper initialization - Remove redundant state management and async loading * refactor(theme): replace LunoStorage with localStorage for theme persistence * feat(examples): Remove auto mode label * feat: implement QR code skeleton loading state --------- Co-authored-by: “Gintma” * Chore/ci cd readme (#27) * chore: update README and fix GitHub Actions * chore: update working-directory for pnpm audit --------- Co-authored-by: Gintma * Feat/mobile UI (#28) * feat(core): In novaConnector, add support for novaMobileConnector * feat(ui): Add "useWindowSize", optimize responsive design * feat(core): add links field with browserExtension & deepLink and add test code * feat(ui): enhance CSS styles with mobile responsiveness --------- Co-authored-by: Gintma --------- Co-authored-by: “Gintma” * fix(ui): fix view switching logic in ConnectModal component --------- Co-authored-by: “Gintma” * fix(with-vite): fix undifined of Notification * fix(ui): fix view switching logic in ConnectModal component * fix(with-vite): fix undifined of Notification * fix(with-vite): Fix the reference of the Notification object to ensure that it is accessed through the window object when used. * fix(ui): fix view switching logic in ConnectModal component * fix(with-vite): fix undifined of Notification * fix(with-vite): Fix the reference of the Notification object to ensure that it is accessed through the window object when used. * fix(ui): fix connect in mobile * fix(ui): fix view switching logic in ConnectModal component * fix(with-vite): fix undifined of Notification * fix(with-vite): Fix the reference of the Notification object to ensure that it is accessed through the window object when used. * fix(ui): fix connect in mobile * Fix/create api (#39) * feat(react): migrate from DedotClient to LegacyClient * fix(ui): fix theme type definitions and improve prop interface * fix(ui): fix css style in ConnectButton * feat(core): add browser download link in novaConnector * feat(ui): fix ConnectModal responsive view switching and enhance WalletView QR code features * Fix/create api (#40) * feat(react): migrate from DedotClient to LegacyClient * fix(ui): fix theme type definitions and improve prop interface * fix(ui): fix css style in ConnectButton * feat(core): add browser download link in novaConnector * feat(ui): fix ConnectModal responsive view switching and enhance WalletView QR code features * feat(core): add injectorId support to CommonConnector for custom injector identification * Fix/create api (#42) * feat(react): migrate from DedotClient to LegacyClient * fix(ui): fix theme type definitions and improve prop interface * fix(ui): fix css style in ConnectButton * feat(core): add browser download link in novaConnector * feat(ui): fix ConnectModal responsive view switching and enhance WalletView QR code features * feat(core): add injectorId support to CommonConnector for custom injector identification * fix(react): add disconnect logic when account address is missing on account change * fix(ui): fix error and loading states in WalletView component * Chore/ci cd readme (#43) * chore: update README and fix GitHub Actions * chore: update working-directory for pnpm audit * chore: add release action --------- Co-authored-by: Gintma * Fix/create api (#56) * feat(react): migrate from DedotClient to LegacyClient * fix(ui): fix theme type definitions and improve prop interface * fix(ui): fix css style in ConnectButton * feat(core): add browser download link in novaConnector * feat(ui): fix ConnectModal responsive view switching and enhance WalletView QR code features * feat(core): add injectorId support to CommonConnector for custom injector identification * fix(react): add disconnect logic when account address is missing on account change * fix(ui): fix error and loading states in WalletView component * feat(with-vite): add .env.local.example * feat(example): Add environment variable example file and update connectors to use from environment variables (#61) * Chore/UI work (#63) * fix(ui): resolve Radix UI Dialog TypeScript errors - Add proper type interfaces for Dialog components - Fix ModalContext missing closeConnectModal method - Handle @tanstack/react-query v5 API changes - Use React.createElement to bypass Radix UI type restrictions * feat(ui): add new theme system with light/dark presets and CSS variables * fix: resolve chain modal issues and optimize theme system * feat: save current theme system state before refactoring * fix: resolve UI build issues and restore theme system - Fix base.css theme syntax to use @theme inline with var() instead of theme() - Restore missing dark theme variables (spacing, typography, fonts, radii, blurs) - Update theme context structure and remove defaultTheme.ts - Update LunoKitProvider to use new theme system - Fix PostCSS configuration for Tailwind CSS v4 * feat: remove toggleTheme and add auto system theme following - Remove toggleTheme function from ThemeProvider - Add useSystemTheme hook to detect system color scheme - Add auto-following system theme when both light and dark are provided - Add isAutoMode flag to indicate auto-following state - Update example app to use setThemeMode instead of toggleTheme - Maintain backward compatibility with existing theme system * feat: optimize theme persistence logic - only persist when user has theme choice * fix: remove defaultTheme from LunoKitProvider to match ThemeProvider interface * feat(theme): remove localStorage persistence and fix dark theme logic - Remove theme localStorage persistence - Fix dark theme not applying with theme={{dark:{}}} - Simplify theme initialization and switching logic * refactor(ui): standardize design │ │ tokens and remove style duplicates * feat(ui): Modify the rounded property of some components. * refactor(AccountDetailsModal): simplify view transitions to height-only animation * refactor(ui):Optimize code structure, remove unused code * feat(theme): enhance theme system with auto-mode and user preferences - Add autoMode support for system theme following - Implement localStorage persistence for user choices - Add setThemeChoice API for explicit user actions - Remove unused dependencies (postcss-import) - Clean up redundant size props and methods - Fix hook functionality and simplify API - Improve theme initialization priority logic * refactor(ui): replace localStorage with config.storage in theme system * refactor(theme): optimize theme system and eliminate flashing - Extract CSS variable injection logic to separate file (cssVariableInject.ts) - Optimize initial theme state calculation to prevent flashing - Simplify theme preference interface (isAuto, preferredTheme) - Fix system theme detection with proper initialization - Remove redundant state management and async loading * refactor(theme): replace LunoStorage with localStorage for theme persistence * feat(examples): Remove auto mode label * feat: implement QR code skeleton loading state * feat(core): In novaConnector, add support for novaMobileConnector * feat(ui): Add "useWindowSize", optimize responsive design * feat(core): add links field with browserExtension & deepLink and add test code * feat(ui): enhance CSS styles with mobile responsiveness * feat(ui): enhance modal layouts and improve visual consistency * feat(ui): improve connect modal layout and wallet organization * feat: enhance modal UI and fix animations- Add modal border and improve title centering - Fix close animation flicker - Add chain status indicator - Clean up unused CSS variables - Adjust spacing and padding consistency * feat: improve modal UX and fix build issues UI: - Add border to dialog modal - Center title in compact mode - Add chain status indicator dot - Adjust item padding and spacing Fix: - Modal close animation flicker - CSS syntax error (extra semicolon) - Remove unused cutLine variable * feat: replace Loading component with modern CSS animation - Replace SVG Loading with CSS mask animation - Remove unused Loading.tsx file and exports - Use Tailwind sizing classes - Improve performance and reduce bundle size * style: refine shadows and remove test styles - Remove test background color from AccountItem - Fix Dialog shadow class name - Adjust shadow values for better visual hierarchy - Update modal backdrop opacity for improved contrast * fix: remove useless code * fix(chore): fix test of walletconnect --------- Co-authored-by: “Gintma” * fix(chore): Update signMessage method to support optional chainId parameter (#64) --------- Co-authored-by: “Gintma” * feat(ui): Simplify font definitions, keeping only the body field * feat(ui): export hooks of modals * fix(react): fix subscribe in useSubscription * feat(react): Add sleep utility function and add connect delay in useConnect * feat(core): update WalletConnectConnector, add session subscription and cleanup logic * chore: update build config * fix(core): fix test of novaMobileConnector --------- Co-authored-by: “Gintma” --- packages/core/package.json | 4 +- .../src/config/logos/generated/novaSVG.ts | 2 +- packages/core/src/config/logos/nova.svg | 26 ++++++- .../core/src/connectors/novaMobile.test.ts | 2 +- packages/core/src/connectors/novaMobile.ts | 2 +- packages/core/src/connectors/walletconnect.ts | 74 +++++++++++++++---- packages/react/package.json | 14 +++- packages/react/src/hooks/useConnect.ts | 2 + packages/react/src/hooks/useSubscription.ts | 20 ++--- .../react/src/hooks/useSwitchChain.test.ts | 1 + packages/react/src/utils/index.ts | 1 + packages/react/src/utils/sleep.test.ts | 39 ++++++++++ packages/react/src/utils/sleep.ts | 3 + packages/react/tsup.config.ts | 3 - packages/ui/package.json | 3 +- packages/ui/src/components/Dialog/index.tsx | 2 +- .../ui/src/hooks/useCSSVariableInjection.ts | 2 +- packages/ui/src/providers/index.ts | 1 + packages/ui/src/styles/base.css | 5 +- pnpm-lock.yaml | 6 +- 20 files changed, 168 insertions(+), 44 deletions(-) create mode 100644 packages/react/src/utils/sleep.test.ts create mode 100644 packages/react/src/utils/sleep.ts diff --git a/packages/core/package.json b/packages/core/package.json index 4f2bc0e..66b4692 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -8,7 +8,9 @@ "wallet", "web3", "blockchain", - "connector" + "connector", + "luno-lab", + "luno-kit" ], "homepage": "https://github.com/Luno-lab/LunoKit#readme", "main": "dist/index.js", diff --git a/packages/core/src/config/logos/generated/novaSVG.ts b/packages/core/src/config/logos/generated/novaSVG.ts index df5f2ac..59846f4 100644 --- a/packages/core/src/config/logos/generated/novaSVG.ts +++ b/packages/core/src/config/logos/generated/novaSVG.ts @@ -3,4 +3,4 @@ // Do not edit. Auto-generated via node scripts/convertLogos.mjs -export const novaSVG = 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2ZXJzaW9uPSIxLjEiIGlkPSJMYXllcl8xIiB4PSIwcHgiIHk9IjBweCIgd2lkdGg9IjY0cHgiIGhlaWdodD0iNjRweCIgdmlld0JveD0iMCAwIDY0IDY0IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCA2NCA2NCIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+PHNjcmlwdCB4bWxucz0iIi8+PHNjcmlwdCB4bWxucz0iIiBpZD0iYXJnZW50LXgtZXh0ZW5zaW9uIiBkYXRhLWV4dGVuc2lvbi1pZD0iZGxjb2JwamlpZ3Bpa29vYm9obWFiZWhobWhmb29kYmIiLz48U0NSSVBUIHhtbG5zPSIiIGlkPSJhbGxvdy1jb3B5X3NjcmlwdCIvPjxzY3JpcHQgeG1sbnM9IiIvPjxzY3JpcHQgeG1sbnM9IiIvPiAgPGltYWdlIGlkPSJpbWFnZTAiIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCIgeD0iMCIgeT0iMCIgeGxpbms6aHJlZj0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFFQUFBQUJBQ0FZQUFBQ3FhWEhlQUFBQUlHTklVazBBQUhvbUFBQ0FoQUFBK2dBQUFJRG8gQUFCMU1BQUE2bUFBQURxWUFBQVhjSnk2VVR3QUFBQUdZa3RIUkFEL0FQOEEvNkM5cDVNQUFBQUpjRWhaY3dBQUN4TUFBQXNUQVFDYSBuQmdBQUFBSGRFbE5SUWZwQnhFSEV3ak5ZZE1sQUFBUTNrbEVRVlI0MnNWYlRheGR5VkgrcXJ2dmZmNTVkbUsvRi85N2Z1enhlSmdaIEpFUXlqTmdnSWJHQkJkbG5SeFlJcExCRlNHd1FDOFNLSFFobHhZbzlXV1NMeENaQ0NoRW9HV05uN05pTy8rM25sL0g0K2RudjNkTmQgTExxcXEvcWNlOGNaa01pWjZYZjcvSGRWZmZWVmRmVXh2ZnV0eDR4Vkcva2RCcFAxOVJ3VHdBQkE3cnowbWVwMTlaZkJyZFZqSE9RZSBZbkJZZlIzYzlmV2Q3ajZ5OGJSeHRMRnpKd09QNUFHQXNGeHliaGRnZWc5a1JHTmRnTnd0NU4vTnZoRkl4a2RNY2crTnJ2RkRXQ0lCIHk3dVdEcFA2L21oTTQrdkM2dHRwY21aOFpPV0wyZjJ5R2FNOWc4bERCMko0VXdaSS9qTkJtN0tZM0VqNjUzVkhPMk90VnNKU0JCREkgNUZtaXRZbEYzSVBITHlCdnlaRmx5WjluMnlkVmtMeHZJckJUa0VlVWY5OVVDZTRxaDg0VkxvQ1YxdTZQczdNdUpuRDBGZ1hRRDM3cyBGcTdmN21JU1pmUUlzSHM4QXVBUWdoSHkzUGhHYnBUd0JSczVpZG45SlFEc25rd0FtSjEybU53SURCVU1BclU3Q2VSSWdrVmdnUFgvIFRtMHNkM3VKOUVnalBnYUkzSHRrSHp3bVFIdE9XdW5YM0Y5UHpkNXQrSjFTeHVqZzdnNkZuZ2lxU3ZXK1NXUlBtbmJhbTN2UDlPZTkgYXRIZXcxd0hyKy91ZEVqZUJVYmt1YXhQUzArTi9ub3VjQ1E0SVNpMmZYK3NJMFNtdnU5SG9Wd0I1eWJxNjgxVkhKSHFuU055N0RpQSBmb2syamdibTV5TWlHbXVQN1U1OVZzbTFLZkY1d3B3U1pLOFFwVDU5UC9sSTRKWGxvc2pFT0NCeEFlckhPL1kxRHpacUdEWVFObGcyIEgreERINE1yeFAwRllIeDBjUTFNd0k5dTdzRTVDbEJxWWtTTkpCak0vYWpJNDVnWlRPcVV5bERpRkkwRTVIbktMMVE3aVFoTE5zYnkgNDE3UXFaSk1JMDVCYlA1WkIxQjlNVVhDZDM3L0tFQ01QLzdIZmV3WEc3eTZCSGRVeUNNT29DYXFlNE9NM2Q1am1EUGFyc09yZDZTdyBSSXd2VG5qZ1hqWVdHazNiNmhtZXZEenBIVmtqbkQwZVFRU3NyeEcyZHpYcWlLZ054b28wRTlMaWd1WXN6dkxzbFdEWGdhakxVWVFiIEt3SzZlTG5Dc09POGlMcEJlVVc0ZXpUOGNQK1F3c0Rta1lqTm94R2cydC9lS1VDc2JOM0QyQjQrVmNLeW8reE1SQ1BVNktCTXpCUm8gT3ZBVjBzS0QxUGJjeFIyWDlEY3hPemdXNE94R3d0RkQ5Y2k1NHduWDdnOElMTWdpYmpuQk5COVlKdDc0NkVoNGNsZXdGNDRRQW9CQSBWQnVBSUxHeDlXV2Z5TzBURUJBUUdMWEJHZ2tqQnlZUVFndHpuclVKd0lXVENmTkVtQ2ZDaFpPekxoSlE4WkdoRDJkdHY4c2c5VDRYIEhrdWZPWGJQRng4Z2tDQmdaRlAxUS9OYmRoYWdabEYybG1XWHdqTHFkSlpBS0FvT0loU3hhQ1RDcFRPekJyaExweE9pRUJmUVU1bysgbER0T29Lbk5XWkNEM3NMOTJLZXBmSW9UTnRjMGplemxYalNYemFtN3R0d0RxS0hPS1NLSTBwaHJ2NEJ3NkFCdzhiUmw0UmRQSnh5ZSBFMTdzYzBkcWplWWNtZlVDT0s1b1l1ajRMSWZuRmdZbnVTbVNKUUpPNTZNM3NmTkhuOGl4Q3ljTWh3cDVCVEZYQlBRNU1qYVBSSnpiIGpPM1F1WTJFelNNUkw3WVlSSTdKSjJRNEprQnYyK21MTEI5UjFISUxnVlVPUm9xaEVXT25XQTFaN0poRWhkU0htNHVwRW5pa0JFREQgYkwyR2tFdkJteWNpTm81YUVycHhOT0RORXdtM0h3K1dYekJWTjFyQzBoTlFNK3ExSTJOU2x5QUJFM1V4RUdZRXhGRERRUXBBcE5vUyBBUkh5cXczYUoydUFOVGtXSUlTcXY4SVRsVEFKdjNaK2hyV1pDWFJnUm5qLzNNeElxcEZlalJoS2hsWXZHRTJWaFhoYkhZRUpWRWJIIDJqNjZaNlFVVEt0cXRtcDFnYUpEQjQrYmFKNFpLTTdxU29wRkxGRWNFdFlTNFlPM2pBQjErL0ROR2VhUmtCM3BVcFcvK1hFZi9URnggaGk0RkowUEJOSzAxdktjVW5VUmVhSmZFOEVRSkRNMWNtUW1GTElvdzZxQjFnUDVjWm1EalNNRGw4OU15eEh2blo5ZzRFdkQ0V1ViUCA5MDVBSjB4L0hDM3I3RE5IcnhxdktqdVNadWFrYmU3TTR0dysxTUgxMWFyS0FjUVY2b1g5SktRcVFsOVdtRkVLY1BGMHhCbEhnTHFkIDNZaDQ1MVRDbzE5a0JIK2FMZVBzUXMvS1hLOWo3ODc2WXVNdU9vb0N6UElLK2JIMWZmT1FMbHdUbzhKVzFDQzJPSzZLQWhFQ0FWKy8gUE1mQnRlbHM0K0FhNFJ2dnJ1RUgvNzJQd0FKOWpJWEZTTkNwOEZZRmNzS3o1Zjc5N1l3d2k4QXNFdW92a0xTRkpZM3NkMHlXMmsvUSA4NFFJSThuQXdGY09FVDcrWUk1VjIyKy9QOGZSZ3dHUVRESjRVdFFNRVk3OE9uS3pETEdSNXFSaDBnK3pBR2hMcmo5Ym9vQVluS0NyIEZCRkdFVU1TWWhUZ055L1A4ZDVicTh1UUg3NDF3MGZ2emwyUnBFYU5sZ0tESkUzdUJWUEk5cW15UkpDQ3RxK1JBWkkyRXhQU0xGV2MgTWp0Zlo0RGxXR0g3RGFPK3VrSlJGM0RvSWtkS0pRTnZuNG40OWpjUExZVy9kNE0vL2NOMTNIb3c0TWJEQVNGV0h3K1NScmRNckxtNCBpLzBLZVFzRDdUb3RrRTZpQVFQeDQ5LzU4Ny9xSmpuazRuZW8reXFRbmlleWZTS3JxL201WVNuVnh3NGZKSHpqd3ptKzg2MTFmUERPIE5QeU50MVBISTM3OTdUbWVmbDZ3OWF6ZzFjTFBBNmhqQXE4T2Y1eTY2LzNmYmxwVy8vN1pYejZwcVhJeGEzUHgrNFJTdUVNQ2N4V3cgTUtFd1VBcGprT3RqQk5iWEE4NmNpbmovMGd5LzhjRU03NzZWY09BTExMOXNlN25IK01tdEJYNXdaUjgvL09rK3JqOFlzTDJUc1RmVSBDRU1CV2h5VStZaUV2emFWWVVORG04L0lQWUNVeW9BMFR5SnNNTmkzNUVrRkJiVXdCamE0UjJJY1dDTWNXWTg0c1JseC9sekVoVGNTIDNqeVhjR0l6ZkdtaHgrN3cwZVU1UHJvOHgrNGU0OTVXeHJXN0MvejQxZ0pYN3l4dys4bUFyZWNGdS91TVFaT1NVR3Q5RTdkbzhjOXcgMnBEekYzLzloTlhxcFJnQ2lpS2dBS1hVR2RwOFRsZy9ISERzcXhFblRrU2NQaGx4K2xURTF6WWlqaDRoekdmL2U0Ry96UFpxbi9IMCBlY0hkcll3YkR4YjQ5TUdBbnowYWNHODdZK3Z6akJkN0JZdkNUVjZlRkd0TUwybVdlcUc1Q0ttRnVwOFp1UEIyd3UvOTdrRWNPeFp3IGREM2c0TUUyamZ5VmJBZm1oTE1iRVdjM0lqNitYTVBxL3NENGZKZXg5WG5HdmUyTXYvLytjL3p3K2g1Q3JQbEhuYldxOE53S1dGVUIgcGMwWDJtK1IvSjRZaUpFYkFlSlhKL2RyTngyZVh6c0k2cy9xR213RUNERG9iLy91Q1pmQzRFSVY5aXNhQU14bWhNT0hBNzc2bFlqTiB6WWhUSnlOT2ZpMWlZeVBpeURwaDl2L2tBbnZxQWs4eWJqd1ljUDNCZ0pzUEI5eDdtckgxUEdQbmxmQ0NINDdJclBTZ1BKRm1xUmVVIEM1QzFuNEVzaU1nRjJOOWo3TDdNZVBnb0kxOFZwYVNxbEkzakVXZlBSTHh4UHVIYzJZVE40d0ZyL3djUzlOdkxQY2I5cll4cmR3WjggY212QTFUc0Riajhlc1BWNXh1NCtJeGRKbGdsQ2hDNWdhZ1JnSjd5aWdJQTBTNHpTV1o4UkN0VmxLNnFaVk1uMW9ZV0FVSUFjVEVsNSBZR3h2Wnp4NWtuSGxhZzFQaHc0SG5Eb1JjZW5pRE8rL044UGJiNlF2cll5WGU0eXJOd2Y4K3lmNytJOXJDL3pzd1lEdG5ZSzlRZVlKIG9lSThvTDVUcTFtVDRwNFh2RTBLckRoSy8vRGR4OXhZWHhXUm5ZQzUzeStDa0p3clQrUnN4MG9oWkdZNVg1KzFkb0J3NldMQ04vL2cgRUM1ZFNMK1U4SjljWCtDZnZyZUxIMTFiNE5rdUl3Tm8zeDJCYTFodU5TaXJRSUdvNVFNR2VVT0N1Z0NSSFV1ekpJbU9XTDhVb0JBMSB5d2VxYmtBaU5PbURxTzdMZTgyL0pBc0w2amI3alAvODhRSVBIKzNnVC81b0hlKzhSZ2xYYmd6NG0rL3U0T2I5QVloMVRoSUJaSlpjIFJBb2xRU3ZPWWxXZEtVKytidkZLZ1BYMU44d1NZNWJRV29wQVNqSXpUSzVGOXh0bDBxUDl0czlJZ1JGSGJUNERIajNPK0pmdjcySnYgajFjSy8ycVA4Yy9mMjhYZGh4bnpWR2VTamRYYm9HdWFyaE9sZ0lCQVBzVkZ1MnA4WHZzUjFFcDdLWTFJVUMwMzluOGlnRElFam1iNSBySDFJWDF1eGNqb1ZBQW40OU1hQW16OGY4TjZsNVhPQ1QyOE4rTWxQRjVnRnFTTVFXcjIvVmNxa0dqWDlaSXVkQ293Rld0N25rTkRtIE54QUZjUE4zTXFKVEJZamdUUWx1UCtkZUdSMzV0TDdOekY3dE1hNWNXNnhVd0g5ZFdlRGxia0VNVm90a1NWcGE5UWtXMy8xYUJJUDYgb2tlYkRqbFVkRXFvK3lsRlMzNklEQWtxYVBGQ3cveWZuUDhUQkJsNmZpSmFWVUlvd1BVYkEvYjJlQklWWHUweHJueTZRSkFIMW1wVCBoVHNUQytSTnNOS212YVo5WC80bU9WNk5ac0lIdHgrcUMxZ1NSRXFDenVJbFU1c09xNlRORFJ3UmV1RnpKNXFidjBmZzRhTUJUN2NMIHpwenU2NEpQbmhiY2Y1aVJCUDRGdGFDaTYveHRzVVdlR1B6YWhKeXJnK1ltdUxHQlkzOVM2MWRscEJTZGxUVU5kakF2Vk5mYUtYTUggSFVWRTEyZ3NmTDlGTUhaM0dYZnZEeE1GM0w0NzRNVU9JMHF4TVlxQlc2Z0QyY29WeVlwVDIwZXpPRGRyUStxUTVOeFhGb0ZiSDBneCAxaVhpNG5LQm5PVjFSTWhLSUE0QjNyZGV2L1dzdjFnQVA3OHo0TGUrdnRZZHYzazdTOWl0c1Z5THI3ckdyS3RQSGxtVkY4Z0tSVzFRIEkraDNpaEFsQkNYQnlLMmlXeS9neHU1VVpOL0JuaFFSN29XKy80VVFRTTBpN3o4WXNGaHdtenZzTHhoMzdnM3QyYnJRMG56ZUxiZDUgdHlxNlI1WUpWdUY3QlRUSWh5a0tVb3dTVXgzOHN4QkdwaDdlSHZaVEQxK09pSEZKUFVYZzZkT0M1enVNNDhmcUhjK2ZNNTVzcWYreiByU2tLMDJ2WnJkWDEzTW8xblBBc1FrR0VWaTRJd1JEZy9UK29BZ0wzUE5BUTRDM2YrVHhqbFFQdzBuMnkxZFlJdk5ndDJON09PSDZzIDJuanJhY2JPaTRJWXF4UmNwQUJML1RLY3ByREJqQzFMNDcxQ2lNaGE2SDNlRUNCaE1NU2FCOEJCdXluQldiNUxjbHA2NWo5M1hZNEUgMXRHN0U4UEFlUFE0NDUyTE5SOTQ4RGhqc2FnMWgvcHhCYmxWWlMzVFdYNWI1RkdCUFB1YlAxQ1krbjRJdlFLTUJJTkFwMVQ0K1pSUyAvUXU2TENWRmhLWDJIbW1pclNVdWdVVE9OVFhXN2VIRDJnK0J3UEtOWU5EaUxJVG9XRyszMGJrdjdrMEpJOGF2S01DSS9Ra2hWRGxUIENEcUprQXpXVlZycnM2bkpSMDFCdk5UM3A1YUh4RE8zeE1hMTNMNzFOR01ZcWxTUHR6SWlhZnBMeGdIQjFpdjg0cXpHUGMzK21GemMgVnhjSXRKUUV2ZldKNUJzaGxwZEJrZTJSUG9INjZzbU1ubDNHQXg0SnFRRFBubVc4ZWxVSjd4ZWY1Y3JROGtGRFVYZ1g1d1p0M2JGUCBiWXV6ZUovNTlZS0dNQ1hCcWdDblpRTGFzbmNmVjkxbnJLOFIzbmU2cjB4YzNsTVNzUHV5WU9kRlFTbUUzUmVNRkFtNVZNdEh0WG9ZIEtVRmp2NlMwTExNNlQxeGVBVXVGRHFPNWdGZEFRZlc5T3FmblhnZjBPc0V0RDIrUUhTdENXZ0l3TEJpZmZWWnF6V0RCMWY4aEgxSVYgU1lqS0VpV1E1Z0RtQnJwRVJhS01WZGIzeHhSQjNiZkNqUThLbzdSdmM1YlplRG5oMWI3N0dGSHplSW5uN1ZzTUJvWU0vT3UvN1dMSSA5YTRvWmEwQXJwbWZJS0FVYWxhekNaRlpoYnRwNmlnRUN2dDdGRFJGQ0hDTUExd3JBUWhqK2g2UjRtb0ZtTWxabHRiWXdiOUJtNEU3IGR3Y01HWWloQ3F6Q2F4SlVpaG1sNXhGcUN4dnNJd0RJRWVDeUZOaHlDVlhHMHEvRjJ3ZlVTb3pMSEh4VklpU21idkZiUDMvMWZoMmwgSCt2QWh6ejk0cFRaZm9zdWxaT2xZUnJ2bW5zMkRoanh3R2hPMEdvQ29yTk9BUVJiRXdUWHdnaUNpRnhRRnlTZEdxYVdSN00yYTcrZCBxSDdiQlBVQ2o0UnZQQkFxRW9JZ3llZWhiWGFvOEJjdU1DSFJDejJxQ1dpRmFQb1BKdGl5c0JJWVFSWk9DVFZaQ2tGeFp4cGdyc3pkIExBOWhjbmV1UkNBeWd5TTE1YkI4bWxQMVRFNEI1Z1pjNnI0UGcyMTI2S0RQRGRvam9WdHVBSmN5dTZvd0tkZFIrK2xjb1FSREFnUUogMnVjbExYbzNFSmd6Y3p2ZWhJZDlhQkZabEQxU0FqdlVLSmxxUXNKTkNXcE5nejBtd3ZjMUFsVVVBS1I2d01XcC9sOCtMbGZDNU9NeiAwd0J6clJJM0ZEUWxtTzlydUEwQkNIRUtmM1dKd2hMdkMxVTBrRUhWd3FLaHR3bnZKa2k5U3pqT2tDMFJOTTJ4ZjJveTVqZFZncnFBIGloODBKMmVEYzNTS1lDbVZtN1VKSWFyRlJWSHN6b253SkM0WGxBQkJGZ0xGNUlVMEgzUXpRbWQ1TDd6Mm02S2FFZ2dKc0ZWVFhVZW4gc1MvSXJsYU8yaXF4L3N2dTBDdWhXVitRRUxpdUczQVVZVlVKRElSWUZSbWJkOG1udGlSaGtDWGZMMzVLckZXaTZYVFl3NXVhZTVqbCB2ZkRWQlp5RTdhTnBRWUkrcU9tRGpYU0Q0NEhBbUV4Y1dPb01IZFM1Wm56K21BcERnZ0xTU0ZGcUVsTkRvS1N2YkJPbEltZ3dyekJmIHNOQm9JYTlIdm1Vei93TWJqc0ZEV1VNVFVnQUFBQ1YwUlZoMFpHRjBaVHBqY21WaGRHVUFNakF5TlMwd055MHhOMVF3TnpveE9Ub3cgTkNzd01Eb3dNTVBUL3c0QUFBQWxkRVZZZEdSaGRHVTZiVzlrYVdaNUFESXdNalV0TURjdE1UZFVNRGM2TVRrNk1EWXJNREE2TURBbCBFVmFiQUFBQUtIUkZXSFJrWVhSbE9uUnBiV1Z6ZEdGdGNBQXlNREkxTFRBM0xURTNWREEzT2pFNU9qQTRLekF3T2pBd0lqc01HUUFBIEFBQkpSVTVFcmtKZ2dnPT0iLz4KICAgIDxzY3JpcHQgeG1sbnM9IiIvPjwvc3ZnPgo='; +export const novaSVG = 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHZpZXdCb3g9IjAgMCAzMiAzMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAwXzQ5NDFfMTEwODEpIj4KPG1hc2sgaWQ9Im1hc2swXzQ5NDFfMTEwODEiIHN0eWxlPSJtYXNrLXR5cGU6YWxwaGEiIG1hc2tVbml0cz0idXNlclNwYWNlT25Vc2UiIHg9IjAiIHk9IjAiIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiI+CjxwYXRoIGQ9Ik0wIDguMzJDMCAzLjcyNDk5IDMuNzI0OTkgMCA4LjMyIDBIMjMuNjhDMjguMjc1IDAgMzIgMy43MjQ5OSAzMiA4LjMyVjIzLjY4QzMyIDI4LjI3NSAyOC4yNzUgMzIgMjMuNjggMzJIOC4zMkMzLjcyNDk5IDMyIDAgMjguMjc1IDAgMjMuNjhWOC4zMloiIGZpbGw9IiNGRjAwMDAiLz4KPC9tYXNrPgo8ZyBtYXNrPSJ1cmwoI21hc2swXzQ5NDFfMTEwODEpIj4KPHJlY3Qgd2lkdGg9IjMyIiBoZWlnaHQ9IjMyIiBmaWxsPSJ1cmwoI3BhaW50MF9yYWRpYWxfNDk0MV8xMTA4MSkiLz4KPC9nPgo8cGF0aCBkPSJNMjcuMjAwMSAxNlYxNi4yOTU3QzI1LjM3MjIgMTYuNTg2OSAyMS40NDc3IDE3LjI2MzQgMTkuNTE2OCAxOC4wMDI2QzE4LjgyNjkgMTguMjY2OSAxOC4yODA0IDE4LjgwOSAxOC4wMTE2IDE5LjQ5NDRDMTcuMjcyNCAyMS40MTY0IDE2LjU4NjkgMjUuMzYzMyAxNi4yOTU3IDI3LjIwMDFIMTUuNzA0NEMxNS40MTMyIDI1LjM2MzMgMTQuNzI3NyAyMS40MTY0IDEzLjk4ODUgMTkuNDk0NEMxMy43MTk3IDE4LjgwOSAxMy4xNjg3IDE4LjI2MjUgMTIuNDgzMiAxOC4wMDI2QzEwLjU1MjQgMTcuMjYzNCA2LjYyNzg5IDE2LjU4NjkgNC44MDAwNSAxNi4yOTU3VjE1LjcwNDRDNi42Mjc4OSAxNS40MTMyIDEwLjU1MjQgMTQuNzM2NyAxMi40ODMyIDEzLjk5NzVDMTMuMTczMiAxMy43MzMyIDEzLjcxOTcgMTMuMTkxMSAxMy45ODg1IDEyLjUwNTdDMTQuNzI3NyAxMC41ODM3IDE1LjQxMzIgNi42MzY4NSAxNS43MDQ0IDQuODAwMDVIMTYuMjk1N0MxNi41ODY5IDYuNjM2ODUgMTcuMjcyNCAxMC41ODM3IDE4LjAxMTYgMTIuNTA1N0MxOC4yODA0IDEzLjE5MTEgMTguODMxNCAxMy43Mzc2IDE5LjUxNjggMTMuOTk3NUMyMS40NDc3IDE0LjczNjcgMjUuMzcyMiAxNS40MTMyIDI3LjIwMDEgMTUuNzA0NFYxNloiIGZpbGw9IndoaXRlIi8+CjwvZz4KPGRlZnM+CjxyYWRpYWxHcmFkaWVudCBpZD0icGFpbnQwX3JhZGlhbF80OTQxXzExMDgxIiBjeD0iMCIgY3k9IjAiIHI9IjEiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKDAuODA0OTM3IDMwLjIyOTEpIHNjYWxlKDM2LjgwMzUpIj4KPHN0b3Agb2Zmc2V0PSIwLjA1MzMxOTEiIHN0b3AtY29sb3I9IiNEN0QzRTkiLz4KPHN0b3Agb2Zmc2V0PSIwLjE5MzMiIHN0b3AtY29sb3I9IiNBMTlDREUiLz4KPHN0b3Agb2Zmc2V0PSIwLjM4MzQiIHN0b3AtY29sb3I9IiM2OTZCRDkiLz4KPHN0b3Agb2Zmc2V0PSIwLjU0IiBzdG9wLWNvbG9yPSIjM0E1QUU3Ii8+CjxzdG9wIG9mZnNldD0iMC43NzM1IiBzdG9wLWNvbG9yPSIjMjI1RkU3Ii8+CjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzA4ODNEMSIvPgo8L3JhZGlhbEdyYWRpZW50Pgo8Y2xpcFBhdGggaWQ9ImNsaXAwXzQ5NDFfMTEwODEiPgo8cmVjdCB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIGZpbGw9IndoaXRlIi8+CjwvY2xpcFBhdGg+CjwvZGVmcz4KPC9zdmc+Cg=='; diff --git a/packages/core/src/config/logos/nova.svg b/packages/core/src/config/logos/nova.svg index e2d1420..d57b3f4 100644 --- a/packages/core/src/config/logos/nova.svg +++ b/packages/core/src/config/logos/nova.svg @@ -1,2 +1,24 @@ - - + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/core/src/connectors/novaMobile.test.ts b/packages/core/src/connectors/novaMobile.test.ts index f98adce..1a2d0ad 100644 --- a/packages/core/src/connectors/novaMobile.test.ts +++ b/packages/core/src/connectors/novaMobile.test.ts @@ -9,7 +9,7 @@ describe( getConnector: () => novaMobileConnector(), expected: { id: 'nova-mobile', - name: 'Nova Wallet (Mobile)', + name: 'Nova Wallet', icon: novaSVG, injectorId: 'polkadot-js', }, diff --git a/packages/core/src/connectors/novaMobile.ts b/packages/core/src/connectors/novaMobile.ts index 1a14e01..408a616 100644 --- a/packages/core/src/connectors/novaMobile.ts +++ b/packages/core/src/connectors/novaMobile.ts @@ -5,7 +5,7 @@ export class NovaMobileConnector extends CommonConnector { constructor() { super({ id: 'nova-mobile', - name: 'Nova Wallet (Mobile)', + name: 'Nova Wallet', icon: novaSVG, injectorId: 'polkadot-js', links: { diff --git a/packages/core/src/connectors/walletconnect.ts b/packages/core/src/connectors/walletconnect.ts index 780f112..8e65e32 100644 --- a/packages/core/src/connectors/walletconnect.ts +++ b/packages/core/src/connectors/walletconnect.ts @@ -1,10 +1,10 @@ import { BaseConnector } from './base'; import type { IUniversalProvider, Metadata } from '@walletconnect/universal-provider'; -import { SessionTypes } from '@walletconnect/types' +import { SessionTypes, SignClientTypes } from '@walletconnect/types' import type { Account, Chain, Signer, WalletConnectConnectorOptions } from '../types'; import { walletconnectSVG } from '../config/logos/generated'; import { SignerResult, SignerPayloadJSON } from 'dedot/types' -import {ConnectorLinks} from '../types' +import { ConnectorLinks } from '../types' export class WalletConnectConnector extends BaseConnector { readonly id: string; @@ -20,6 +20,8 @@ export class WalletConnectConnector extends BaseConnector { private session?: SessionTypes.Struct; private connectedChains?: Chain[]; + private unsubscribe: (() => void) | null = null; + constructor(options: WalletConnectConnectorOptions) { super(); this.id = options.id || 'walletconnect'; @@ -76,6 +78,9 @@ export class WalletConnectConnector extends BaseConnector { this.session = this.provider.session; const accounts = this.getAccountsFromSession(chains, chainIdToUse); this.accounts = accounts; + + await this.startSubscription(); + this.emit('connect', [...this.accounts]); return [...this.accounts]; } @@ -111,6 +116,10 @@ export class WalletConnectConnector extends BaseConnector { const accounts = this.getAccountsFromSession(chains, chainIdToUse); this.accounts = accounts; + + // 启动订阅 + await this.startSubscription(); + this.emit('connect', [...this.accounts]); return [...this.accounts]; @@ -157,18 +166,17 @@ export class WalletConnectConnector extends BaseConnector { public async disconnect(): Promise { if (this.provider) { - await Promise.race([ - await this.provider.disconnect(), - new Promise((_, reject) => - setTimeout(() => reject(new Error('Disconnect timeout')), 5000) - ) - ]); - this.provider = undefined; - this.connectionUri = undefined; - this.accounts = []; - this.signer = undefined; - this.emit('disconnect'); + console.log('this.provider', this.provider) + console.log('this.sessionsession', this.session) + // await Promise.race([ + await this.provider.disconnect() + // new Promise((_, reject) => + // setTimeout(() => reject(new Error('Disconnect timeout')), 5000) + // ) + // ]); } + await this.cleanup() + this.emit('disconnect'); } public async signMessage(message: string, address: string, chainId?: string): Promise { @@ -254,6 +262,46 @@ export class WalletConnectConnector extends BaseConnector { } }; } + + private async startSubscription(): Promise { + await this.cleanupSubscription(); + + if (!this.provider?.client || !this.session) { + throw new Error(`Connector ${this.id}: Cannot subscribe, provider or session not available.`); + } + + try { + const sessionDeleteHandler = async () => { + console.log(`Connector ${this.id}: Session deleted, disconnecting...`); + await this.cleanup() + this.emit('disconnect'); + } + this.provider.client.on('session_delete', sessionDeleteHandler); + + this.unsubscribe = () => { + this.provider?.client?.off('session_delete', sessionDeleteHandler) + } + + } catch (error) { + this.unsubscribe = null; + } + } + + private async cleanupSubscription(): Promise { + if (this.unsubscribe) { + this.unsubscribe(); + this.unsubscribe = null; + console.log(`Connector ${this.id}: Unsubscribed from events.`); + } + } + + private async cleanup(): Promise { + await this.cleanupSubscription(); + this.accounts = []; + this.signer = undefined; + this.provider = undefined; + this.session = undefined; + } } export const walletConnectConnector = (options: WalletConnectConnectorOptions) => diff --git a/packages/react/package.json b/packages/react/package.json index ca1b1e0..ef8ebba 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -7,6 +7,14 @@ "module": "dist/index.js", "types": "dist/index.d.ts", "license": "MIT", + "keywords": [ + "polkadot", + "substrate", + "react", + "hooks", + "luno-lab", + "luno-kit" + ], "exports": { ".": { "types": "./dist/index.d.ts", @@ -30,7 +38,8 @@ "dependencies": { "@dedot/chaintypes": "catalog:", "@luno-kit/core": "workspace:*", - "dedot": "catalog:" + "dedot": "catalog:", + "zustand": "5.0.4" }, "devDependencies": { "@tanstack/react-query": "catalog:", @@ -48,8 +57,7 @@ "react-dom": "catalog:", "tsup": "catalog:", "typescript": "^5.3.3", - "vitest": "^3.2.4", - "zustand": "5.0.4" + "vitest": "^3.2.4" }, "peerDependencies": { "@dedot/chaintypes": "^0.123.0", diff --git a/packages/react/src/hooks/useConnect.ts b/packages/react/src/hooks/useConnect.ts index 8025478..d885fb5 100644 --- a/packages/react/src/hooks/useConnect.ts +++ b/packages/react/src/hooks/useConnect.ts @@ -2,6 +2,7 @@ import { useLuno } from './useLuno'; import type { Connector } from '@luno-kit/core'; import { ConnectionStatus } from '../types' import { useLunoMutation, type LunoMutationOptions } from './useLunoMutation'; +import { sleep } from '../utils' export interface ConnectVariables { connectorId: string; @@ -42,6 +43,7 @@ export const useConnect = (hookLevelConfig?: UseConnectOptions): UseConnectResul const connectFn = async (variables: ConnectVariables): Promise => { await connect(variables.connectorId, variables.targetChainId); + await sleep() }; const mutationResult = useLunoMutation< diff --git a/packages/react/src/hooks/useSubscription.ts b/packages/react/src/hooks/useSubscription.ts index 6700692..3e18bf9 100644 --- a/packages/react/src/hooks/useSubscription.ts +++ b/packages/react/src/hooks/useSubscription.ts @@ -48,7 +48,7 @@ export const useSubscription = TTransformed, defaultValue, } = options; - const isSubscribed = useRef(false) + const unsubscribeRef = useRef<(() => Promise) | null>(null); const resolvedParams = useMemo(() => { if (!params || !currentApi || !isApiReady) return undefined; @@ -62,12 +62,14 @@ export const useSubscription = { - if (!enabled || !factory || !currentApi || !resolvedParams || !isApiReady || isSubscribed.current) { - return; + if (unsubscribeRef.current) { + unsubscribeRef.current(); + unsubscribeRef.current = null; } - let unsubscribe: (() => Promise) | null = null; - isSubscribed.current = true + if (!enabled || !factory || !currentApi || !resolvedParams || !isApiReady) { + return; + } try { const factoryFn = factory(currentApi); @@ -86,7 +88,7 @@ export const useSubscription = { - unsubscribe = unsub; + unsubscribeRef.current = unsub; }) .catch((err: Error) => { setError(new Error(`[useSubscription]: ${err}`)); @@ -96,9 +98,9 @@ export const useSubscription = { - if (unsubscribe) { - unsubscribe(); - isSubscribed.current = false + if (unsubscribeRef.current) { + unsubscribeRef.current(); + unsubscribeRef.current = null; setError(undefined); } }; diff --git a/packages/react/src/hooks/useSwitchChain.test.ts b/packages/react/src/hooks/useSwitchChain.test.ts index a74b3e0..7d312fa 100644 --- a/packages/react/src/hooks/useSwitchChain.test.ts +++ b/packages/react/src/hooks/useSwitchChain.test.ts @@ -12,6 +12,7 @@ const connector = mockConfig.connectors[0] as MockConnector; vi.mock('../utils', () => ({ createApi: vi.fn().mockResolvedValue(null), + sleep: vi.fn().mockImplementation((ms = 1000) => Promise.resolve()), })); afterEach(async () => { diff --git a/packages/react/src/utils/index.ts b/packages/react/src/utils/index.ts index f4a5da4..6e7d1e9 100644 --- a/packages/react/src/utils/index.ts +++ b/packages/react/src/utils/index.ts @@ -1,2 +1,3 @@ export * from './createApi'; export * from './dispatchError'; +export * from './sleep' diff --git a/packages/react/src/utils/sleep.test.ts b/packages/react/src/utils/sleep.test.ts new file mode 100644 index 0000000..94c5c45 --- /dev/null +++ b/packages/react/src/utils/sleep.test.ts @@ -0,0 +1,39 @@ +import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest'; +import { sleep } from './sleep'; + +describe('sleep', () => { + beforeEach(() => { + vi.useFakeTimers(); + }); + + afterEach(() => { + vi.useRealTimers(); + }); + + it('should resolve after specified milliseconds', async () => { + const sleepPromise = sleep(1000); + + vi.advanceTimersByTime(1000); + + await sleepPromise; + await expect(sleepPromise).resolves.toBeUndefined(); + }); + + it('should use default 1000ms when no argument provided', async () => { + const sleepPromise = sleep(); + + vi.advanceTimersByTime(1000); + + await sleepPromise; + await expect(sleepPromise).resolves.toBeUndefined(); + }); + + it('should resolve immediately for 0ms', async () => { + const sleepPromise = sleep(0); + + vi.advanceTimersToNextTimer(); + + await sleepPromise; + await expect(sleepPromise).resolves.toBeUndefined(); + }); +}); diff --git a/packages/react/src/utils/sleep.ts b/packages/react/src/utils/sleep.ts new file mode 100644 index 0000000..e10385d --- /dev/null +++ b/packages/react/src/utils/sleep.ts @@ -0,0 +1,3 @@ +export const sleep = (ms = 1000): Promise => { + return new Promise(resolve => setTimeout(resolve, ms)); +}; diff --git a/packages/react/tsup.config.ts b/packages/react/tsup.config.ts index 064c7d4..8132f73 100644 --- a/packages/react/tsup.config.ts +++ b/packages/react/tsup.config.ts @@ -23,9 +23,6 @@ export default defineConfig((options) => ({ 'react', 'react-dom', '@tanstack/react-query', - 'zustand', - 'dedot', - '@dedot/chaintypes', ], tsconfig: './tsconfig.json', esbuildOptions() { diff --git a/packages/ui/package.json b/packages/ui/package.json index d228352..45c68a5 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -8,7 +8,8 @@ "react", "ui", "components", - "luno" + "luno-lab", + "luno-kit" ], "type": "module", "homepage": "https://github.com/Luno-lab/LunoKit", diff --git a/packages/ui/src/components/Dialog/index.tsx b/packages/ui/src/components/Dialog/index.tsx index fe6cf27..2a380e8 100644 --- a/packages/ui/src/components/Dialog/index.tsx +++ b/packages/ui/src/components/Dialog/index.tsx @@ -65,7 +65,7 @@ const DialogRoot: React.FC = ({ }; const DialogTitleWrapper: React.FC = ({ children, className }) => - React.createElement(DialogPrimitive.Title as any, { className: cs('font-heading', className) }, children); + React.createElement(DialogPrimitive.Title as any, { className }, children); const DialogCloseWrapper: React.FC = ({ children, className, onClick }) => React.createElement(DialogPrimitive.Close as any, { className, onClick }, children); diff --git a/packages/ui/src/hooks/useCSSVariableInjection.ts b/packages/ui/src/hooks/useCSSVariableInjection.ts index e71854a..32597dd 100644 --- a/packages/ui/src/hooks/useCSSVariableInjection.ts +++ b/packages/ui/src/hooks/useCSSVariableInjection.ts @@ -14,7 +14,7 @@ const ALL_THEME_VARS = [ '--color-modalControlButtonBackgroundHover', '--color-modalControlButtonText', '--color-success', '--color-successForeground', '--color-warning', '--color-warningForeground', '--color-error', '--color-errorForeground', '--color-info', '--color-infoForeground', '--color-skeleton', - '--font-body', '--font-heading', '--font-mono', + '--font-body', '--radius-walletSelectItem', '--radius-connectButton', '--radius-modalControlButton', '--radius-accountActionItem', '--radius-accountSelectItem', '--radius-currentNetworkButton', '--radius-networkSelectItem', '--radius-modal', '--radius-modalMobile', '--shadow-button', '--shadow-modal', diff --git a/packages/ui/src/providers/index.ts b/packages/ui/src/providers/index.ts index 9f39e92..6c4703f 100644 --- a/packages/ui/src/providers/index.ts +++ b/packages/ui/src/providers/index.ts @@ -1,3 +1,4 @@ export * from './LunoKitProvider' export { useLunoTheme } from '../theme/context' export type { LunokitTheme, ThemeMode } from '../theme/types' +export { useCloseAllModals, useChainModal, useConnectModal, useAccountModal } from './ModalContext' diff --git a/packages/ui/src/styles/base.css b/packages/ui/src/styles/base.css index 495188a..298f951 100644 --- a/packages/ui/src/styles/base.css +++ b/packages/ui/src/styles/base.css @@ -92,8 +92,6 @@ --spacing-6: 24px; --font-body: var(--font-body); - --font-heading: var(--font-heading); - --font-mono: var(--font-mono); } @custom-variant light (&:where([data-theme=light], [data-theme=light] *)); @@ -110,8 +108,6 @@ /* Fonts */ --font-body: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; - --font-heading: ui-rounded, "SF Pro Rounded", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; - --font-mono: Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; /* Radii */ --radius-walletSelectItem: 6px; @@ -251,6 +247,7 @@ .luno-kit * { scrollbar-width: none; /* Firefox */ -ms-overflow-style: none; /* IE and Edge */ + font-family: var(--font-body); } .luno-kit *::-webkit-scrollbar { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cbbebb2..06b4480 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -294,6 +294,9 @@ importers: dedot: specifier: 'catalog:' version: 0.14.1 + zustand: + specifier: 5.0.4 + version: 5.0.4(@types/react@18.2.55)(immer@9.0.21)(react@18.2.0) devDependencies: '@tanstack/react-query': specifier: 'catalog:' @@ -343,9 +346,6 @@ importers: vitest: specifier: ^3.2.4 version: 3.2.4(@types/node@18.19.113)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.0) - zustand: - specifier: 5.0.4 - version: 5.0.4(@types/react@18.2.55)(immer@9.0.21)(react@18.2.0) packages/ui: dependencies: From 1c324bb465063bbe2e04fb31700b59952e38447b Mon Sep 17 00:00:00 2001 From: WBH <48749219+wbh1328551759@users.noreply.github.com> Date: Wed, 13 Aug 2025 10:56:29 +0800 Subject: [PATCH 21/45] Chore/UI work (#70) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(ui): resolve Radix UI Dialog TypeScript errors - Add proper type interfaces for Dialog components - Fix ModalContext missing closeConnectModal method - Handle @tanstack/react-query v5 API changes - Use React.createElement to bypass Radix UI type restrictions * feat(ui): add new theme system with light/dark presets and CSS variables * fix: resolve chain modal issues and optimize theme system * feat: save current theme system state before refactoring * fix: resolve UI build issues and restore theme system - Fix base.css theme syntax to use @theme inline with var() instead of theme() - Restore missing dark theme variables (spacing, typography, fonts, radii, blurs) - Update theme context structure and remove defaultTheme.ts - Update LunoKitProvider to use new theme system - Fix PostCSS configuration for Tailwind CSS v4 * feat: remove toggleTheme and add auto system theme following - Remove toggleTheme function from ThemeProvider - Add useSystemTheme hook to detect system color scheme - Add auto-following system theme when both light and dark are provided - Add isAutoMode flag to indicate auto-following state - Update example app to use setThemeMode instead of toggleTheme - Maintain backward compatibility with existing theme system * feat: optimize theme persistence logic - only persist when user has theme choice * fix: remove defaultTheme from LunoKitProvider to match ThemeProvider interface * feat(theme): remove localStorage persistence and fix dark theme logic - Remove theme localStorage persistence - Fix dark theme not applying with theme={{dark:{}}} - Simplify theme initialization and switching logic * refactor(ui): standardize design │ │ tokens and remove style duplicates * feat(ui): Modify the rounded property of some components. * refactor(AccountDetailsModal): simplify view transitions to height-only animation * refactor(ui):Optimize code structure, remove unused code * feat(theme): enhance theme system with auto-mode and user preferences - Add autoMode support for system theme following - Implement localStorage persistence for user choices - Add setThemeChoice API for explicit user actions - Remove unused dependencies (postcss-import) - Clean up redundant size props and methods - Fix hook functionality and simplify API - Improve theme initialization priority logic * refactor(ui): replace localStorage with config.storage in theme system * refactor(theme): optimize theme system and eliminate flashing - Extract CSS variable injection logic to separate file (cssVariableInject.ts) - Optimize initial theme state calculation to prevent flashing - Simplify theme preference interface (isAuto, preferredTheme) - Fix system theme detection with proper initialization - Remove redundant state management and async loading * refactor(theme): replace LunoStorage with localStorage for theme persistence * feat(examples): Remove auto mode label * feat: implement QR code skeleton loading state * feat(core): In novaConnector, add support for novaMobileConnector * feat(ui): Add "useWindowSize", optimize responsive design * feat(core): add links field with browserExtension & deepLink and add test code * feat(ui): enhance CSS styles with mobile responsiveness * feat(ui): enhance modal layouts and improve visual consistency * feat(ui): improve connect modal layout and wallet organization * feat: enhance modal UI and fix animations- Add modal border and improve title centering - Fix close animation flicker - Add chain status indicator - Clean up unused CSS variables - Adjust spacing and padding consistency * feat: improve modal UX and fix build issues UI: - Add border to dialog modal - Center title in compact mode - Add chain status indicator dot - Adjust item padding and spacing Fix: - Modal close animation flicker - CSS syntax error (extra semicolon) - Remove unused cutLine variable * feat: replace Loading component with modern CSS animation - Replace SVG Loading with CSS mask animation - Remove unused Loading.tsx file and exports - Use Tailwind sizing classes - Improve performance and reduce bundle size * style: refine shadows and remove test styles - Remove test background color from AccountItem - Fix Dialog shadow class name - Adjust shadow values for better visual hierarchy - Update modal backdrop opacity for improved contrast * fix: remove useless code * fix(chore): fix test of walletconnect * refine(ui): refine ConnectModal text --------- Co-authored-by: “Gintma” --- examples/with-vite/src/main.tsx | 1 - packages/ui/src/components/AccountDetailsModal/index.tsx | 3 ++- packages/ui/src/components/ConnectModal/WalletView.tsx | 4 +--- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/examples/with-vite/src/main.tsx b/examples/with-vite/src/main.tsx index f8dcda3..93e3612 100644 --- a/examples/with-vite/src/main.tsx +++ b/examples/with-vite/src/main.tsx @@ -26,7 +26,6 @@ const lunoConfig = createConfig({ createRoot(document.getElementById('root')!).render( {
{activeConnector?.icon && (
- +
)}
diff --git a/packages/ui/src/components/ConnectModal/WalletView.tsx b/packages/ui/src/components/ConnectModal/WalletView.tsx index 1fdaf04..2fdf859 100644 --- a/packages/ui/src/components/ConnectModal/WalletView.tsx +++ b/packages/ui/src/components/ConnectModal/WalletView.tsx @@ -113,10 +113,8 @@ export const WalletView = React.memo(({ selectedConnector, onConnect, qrCode, is

- Connect your wallet to sign in and start using your assets. + Connect your wallet to start exploring and interacting with DApps.

- - )}
From d55baa024df6fd8c885b9dcdb789fe53474c3ee7 Mon Sep 17 00:00:00 2001 From: WBH <48749219+wbh1328551759@users.noreply.github.com> Date: Wed, 13 Aug 2025 14:56:55 +0800 Subject: [PATCH 22/45] feat(ui): update ui of ChainIcon (#71) --- packages/ui/src/components/ChainList/index.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/ui/src/components/ChainList/index.tsx b/packages/ui/src/components/ChainList/index.tsx index 99e2412..98464a9 100644 --- a/packages/ui/src/components/ChainList/index.tsx +++ b/packages/ui/src/components/ChainList/index.tsx @@ -128,7 +128,7 @@ const ChainItem: React.FC = React.memo(({ >
@@ -158,7 +158,7 @@ const ChainItem: React.FC = React.memo(({ : null }
-{/* +{/* {isSelected ? isLoading ? From 8503b74c35a16e48c2311c36655303fb42c84eb1 Mon Sep 17 00:00:00 2001 From: WBH <48749219+wbh1328551759@users.noreply.github.com> Date: Wed, 13 Aug 2025 17:07:28 +0800 Subject: [PATCH 23/45] Fix/css scope (#72) * feat(ui): update ui of ChainIcon * fix(ui): fix font type in theme --- packages/ui/src/theme/types.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/ui/src/theme/types.ts b/packages/ui/src/theme/types.ts index bd011e7..c0240c2 100644 --- a/packages/ui/src/theme/types.ts +++ b/packages/ui/src/theme/types.ts @@ -56,8 +56,6 @@ export interface LunokitTheme { }; fonts: { body: string; - heading: string; - mono: string; }; radii: { walletSelectItem: string; From fe2ef053c180e35a23f7e89f08a296b314772eff Mon Sep 17 00:00:00 2001 From: WBH <48749219+wbh1328551759@users.noreply.github.com> Date: Wed, 13 Aug 2025 17:29:53 +0800 Subject: [PATCH 24/45] fix(with-vite): remove useless code (#75) --- examples/with-vite/src/App.tsx | 118 --------------------------------- 1 file changed, 118 deletions(-) diff --git a/examples/with-vite/src/App.tsx b/examples/with-vite/src/App.tsx index bd8da7a..576ea46 100644 --- a/examples/with-vite/src/App.tsx +++ b/examples/with-vite/src/App.tsx @@ -394,124 +394,6 @@ const App: React.FC = () => {
- {/* Code Example Section */} -
-
-

Quick Start

-
-
-

Installation

-
{`pnpm add @luno-kit/ui @luno-kit/react @tanstack/react-query`}
-
-
-

Basic Usage

-
{`import { LunoKitProvider, ConnectButton } from '@luno-kit/ui';
-import '@luno-kit/ui/styles.css';
-
-
-  
-`}
-
-
-
-
- - {/* Hooks API Reference Section */} -
-
-

Available Hooks

-

- All React hooks provided by @luno-kit/react -

- -
- - {/* Connection */} -
-

🔌 Connection

-
-
- useStatus() - Get wallet connection status -
-
- useDisconnect() - Disconnect wallet -
-
-
- - {/* Account */} -
-

👤 Account

-
-
- useAccount() - Get current account -
-
- useAccounts() - Get all accounts -
-
- useBalance() - Get account balance -
-
-
- - {/* Chain */} -
-

🔗 Chain

-
-
- useChain() - Get current chain -
-
- useChains() - Get all chains -
-
- useSwitchChain() - Switch chains -
-
- useApi() - Get API instance -
-
-
- - {/* Transaction */} -
-

💸 Transaction

-
-
- useSignMessage() - Sign messages -
-
- useSendTransaction() - Send transactions -
-
-
- - {/* UI */} -
-

🎨 UI

-
-
- useLunoTheme() - Control theme -
-
-
- -
-
-
); From 52fb1ceb8f9abbb5cad2112dac7bb13dba512ba3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CGintma=E2=80=9D?= Date: Wed, 13 Aug 2025 21:59:22 +0800 Subject: [PATCH 25/45] docs:update README --- README.md | 15 ++++----------- SECURITY.md | 5 ----- 2 files changed, 4 insertions(+), 16 deletions(-) delete mode 100644 SECURITY.md diff --git a/README.md b/README.md index bdab3aa..f867159 100644 --- a/README.md +++ b/README.md @@ -1,19 +1,12 @@ -- # LunoKit ( In Development ) -> ⚠️ **Early Development** +# LunoKit
-[![npm version](https://img.shields.io/npm/v/@luno-kit/ui.svg?style=flat&colorA=000000&colorB=000000)](https://www.npmjs.com/package/@luno-kit/ui) -[![npm downloads](https://img.shields.io/npm/dm/@luno-kit/ui.svg?style=flat&colorA=000000&colorB=000000)](https://www.npmjs.com/package/@luno-kit/ui) +[![npm version](https://img.shields.io/npm/v/@luno-kit/ui.svg)](https://www.npmjs.com/package/@luno-kit/ui) +[![npm downloads](https://img.shields.io/npm/dm/@luno-kit/ui.svg)](https://www.npmjs.com/package/@luno-kit/ui) +[![CI](https://github.com/Luno-lab/LunoKit/actions/workflows/pr-check.yml/badge.svg)](https://github.com/Luno-lab/LunoKit/actions/workflows/pr-check.yml) [![codecov](https://codecov.io/gh/Luno-lab/LunoKit/branch/main/graph/badge.svg)](https://codecov.io/gh/Luno-lab/LunoKit) [![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/Luno-lab/LunoKit) -[![license](https://img.shields.io/badge/license-MIT-black?style=flat&colorA=000000&colorB=000000)](https://github.com/Luno-lab/LunoKit/blob/main/LICENSE) - -[![typescript](https://img.shields.io/badge/TypeScript-Ready-black?style=flat&colorA=000000&colorB=000000&logo=typescript)](https://www.typescriptlang.org/) -[![react](https://img.shields.io/badge/React-18+-black?style=flat&colorA=000000&colorB=000000&logo=react)](https://reactjs.org/) -[![polkadot](https://img.shields.io/badge/Polkadot-Ready-black?style=flat&colorA=000000&colorB=000000&logo=polkadot)](https://polkadot.network/) - -**The best way to connect Polkadot wallets 🚀**
diff --git a/SECURITY.md b/SECURITY.md deleted file mode 100644 index 79705d4..0000000 --- a/SECURITY.md +++ /dev/null @@ -1,5 +0,0 @@ -# Security - -Contact [lunolab1@gmail.com](mailto:lunolab1@gmail.com) - -Please do not create public GitHub issues for security vulnerabilities. From 321281af3e9bdbe883a0ff6fd544f5481797cbc3 Mon Sep 17 00:00:00 2001 From: WBH <48749219+wbh1328551759@users.noreply.github.com> Date: Tue, 19 Aug 2025 11:59:56 +0800 Subject: [PATCH 26/45] Chore/readme ci (#80) * chore: update README * chore: simplify README & add dependabot.yml --- .github/dependabot.yml | 17 +++ .github/workflows/security-audit.yml | 30 ---- README.md | 205 +-------------------------- 3 files changed, 22 insertions(+), 230 deletions(-) create mode 100644 .github/dependabot.yml delete mode 100644 .github/workflows/security-audit.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..06b7e24 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,17 @@ +version: 2 +updates: + - package-ecosystem: 'npm' + directory: '/' + schedule: + interval: 'weekly' + open-pull-requests-limit: 10 + target-branch: 'main' + ignore: + - dependency-name: '*' + paths: + - 'examples/**' + + - package-ecosystem: 'github-actions' + directory: '/' + schedule: + interval: 'monthly' \ No newline at end of file diff --git a/.github/workflows/security-audit.yml b/.github/workflows/security-audit.yml deleted file mode 100644 index 77351b2..0000000 --- a/.github/workflows/security-audit.yml +++ /dev/null @@ -1,30 +0,0 @@ -name: Security Audit - -on: - schedule: - - cron: '0 2 * * 1' - workflow_dispatch: - -jobs: - audit: - runs-on: ubuntu-latest - steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Install Node.js - uses: actions/setup-node@v4 - with: - node-version: 20 - - - name: Install pnpm - uses: pnpm/action-setup@v4 - with: - run_install: false - - - name: Install dependencies - run: pnpm install --frozen-lockfile - - - name: Run pnpm audit - working-directory: packages - run: pnpm audit --audit-level=moderate diff --git a/README.md b/README.md index f867159..0398692 100644 --- a/README.md +++ b/README.md @@ -18,87 +18,27 @@ Luno Kit is a React library that makes it easy to add Polkadot wallet connection * 🌐 **Multi-chain ready** - Polkadot, Kusama and parachain support * 🦄 **Built for React** - TypeScript-first with modern React patterns -## Features - -- 🔌 **Unified Wallet Interface** - Single API for all Polkadot ecosystem wallets -- 🎨 **Customizable Themes** - Complete design system with dark/light mode -- ⚡ **TypeScript First** - Full type safety and IntelliSense support -- 📱 **Responsive Design** - Mobile-first UI components -- 🔄 **Real-time Updates** - Automatic balance and account updates -- 🌐 **Multi-chain Support** - Polkadot, Kusama, parachains and custom chains -- ⚙️ **Custom Chain Support** - Easy integration with any Substrate-based chain - -## ⚡ Quick Demo - -**[🚀 Try it live](https://demo.lunolab.xyz/)** - Experience Luno Kit in action! - -*This is the online version of our `with-vite` example - connect your Polkadot wallet and explore all features.* +## Documentation -### 🎮 What you can try: -- 🔌 Connect Polkadot{.js} or SubWallet -- 🌐 Switch between Polkadot, Kusama, Westend, Paseo chains -- 💰 View account balances -- ✍️ Sign messages -- 💸 Send transactions +For full documentation, visit [docs.lunolab.xyz](https://docs.lunolab.xyz/). -## Installation & Usage +## 🚀 Quick Start -### UI Components Only ```bash -# pnpm pnpm add @luno-kit/ui @luno-kit/react @tanstack/react-query - -# yarn -yarn add @luno-kit/ui @luno-kit/react @tanstack/react-query - -# npm -npm install @luno-kit/ui @luno-kit/react @tanstack/react-query ``` -### With React Hooks -```bash -# pnpm -pnpm add @luno-kit/react @tanstack/react-query - -# yarn -yarn add @luno-kit/react @tanstack/react-query - -# npm -npm install @luno-kit/react @tanstack/react-query -``` - -## Quick start - -### Basic setup - ```tsx import { LunoKitProvider, ConnectButton } from '@luno-kit/ui' -import { createConfig, defineChain, kusama, polkadot, polkadotjs, subwallet, westend, paseo } from '@luno-kit/react' +import { createConfig, polkadot, polkadotjs, subwallet } from '@luno-kit/react' import '@luno-kit/ui/styles.css' const config = createConfig({ appName: 'My Luno App', - chains: [polkadot, kusama, westend, paseo], + chains: [polkadot], connectors: [polkadotjs(), subwallet()], - autoConnect: true, -}) - -/* -// Custom chain example: -const customChain = defineChain({ - genesisHash: '0x1234...', // Your chain's genesis hash - name: 'My Custom Chain', - nativeCurrency: { name: 'Custom Token', symbol: 'CUSTOM', decimals: 12 }, - rpcUrls: { webSocket: ['wss://my-chain-rpc.example.com'] }, - ss58Format: 42, - blockExplorers: { default: { name: 'Explorer', url: 'https://explorer.example.com' } }, - chainIconUrl: 'https://example.com/icon.png', - testnet: true }) -// Then use: chains: [customChain] -*/ - function App() { return ( @@ -107,138 +47,3 @@ function App() { ) } ``` - -### Using with React Hooks - -```tsx -import { LunoKitProvider } from '@luno-kit/ui' -import { useAccount, useBalance, useConnect, ConnectionStatus } from '@luno-kit/react' - -function WalletInfo() { - const { account } = useAccount() - const { data: balance } = useBalance({ address }); - const { connect, connectors, status } = useConnect() - - if (status !== ConnectionStatus.Connected) { - return ( - - ) - } - - return ( -
-
Account: {account?.name}
-
Address: {account?.address}
-
Transferable Balance: {balance?.formattedTransferable}
-
Total Balance: {balance?.formattedTotal}
-
- ) -} - -function App() { - return ( - - - - ) -} -``` - -## Documentation - -For full documentation and examples, visit [our documentation site](#) (coming soon). - -## Examples - -The following examples are provided in the `examples` folder: - -* `with-vite` - Vite integration (✅ Ready to run) -* `with-nextjs-app` - Next.js App Router integration (✅ Ready to run) -* `with-nextjs-pages` - Next.js Pages Router integration (✅ Ready to run) -* `with-cra` - Create React App integration (✅ Ready to run) -* `with-remix` - Remix integration (coming soon) - -### Running examples - -To run an example locally: - -```bash -git clone https://github.com/Luno-lab/LunoKit.git -cd LunoKit - -# Install dependencies -pnpm install - -# Build packages -pnpm build - -# Start with-vite example -pnpm --filter with-vite dev - -# Start with-nextjs-app example -pnpm --filter with-nextjs-app dev - -# Start with-nextjs-pages example -pnpm --filter with-nextjs-pages dev - -# Start with-cra example -pnpm --filter with-cra start -``` - -## API Reference - -### UI Components (`@luno-kit/ui`) - -* `` - Main wallet connection component -* `` - Context provider for the app - -### React Hooks (`@luno-kit/react`) - -> **Note:** To use these hooks directly, you need to install `@luno-kit/react` separately. - -#### Account Management -* `useAccount()` - Get current connected account information and formatted address -* `useAccounts()` - Get all available accounts from connected wallet -* `useActiveConnector()` - Get currently active wallet connector instance - -#### Connection Management -* `useConnect()` - Connect to wallets and manage connection state -* `useConnectors()` - Get available connectors -* `useDisconnect()` - Disconnect from wallet -* `useStatus()` - Get connection status - -#### Chain & Network -* `useChain()` - Get current chain information -* `useChains()` - Get all available chains -* `useSwitchChain()` - Switch between chains -* `useGenesisHash()` - Get chain genesis hash -* `useSs58Format()` - Get chain SS58 format - -#### Blockchain Data -* `useApi()` - Get Polkadot API instance -* `useBalance()` - Get account balance -* `useBlockNumber()` - Get current block number -* `useRuntimeVersion()` - Get runtime version -* `useSubscription()` - Subscribe to blockchain data - -#### Transactions & Signing -* `useSendTransaction()` - Send transactions and get full result -* `useSendTransactionHash()` - Send transactions and get transaction hash -* `useSignMessage()` - Sign messages -* `useSigner()` - Get signer instance - -#### Configuration & Utils -* `useConfig()` - Get Luno configuration - -## Package Structure - -- `@luno-kit/ui` - UI component library with built-in components -- `@luno-kit/react` - React Hooks and Provider (core functionality, includes dedot integration) -- `@luno-kit/core` - Core connectors and utilities - -## License - -Licensed under the [MIT License](LICENSE). - From d0f43fcb6ab985bae545f9db87b2f422134eeddc Mon Sep 17 00:00:00 2001 From: WBH <48749219+wbh1328551759@users.noreply.github.com> Date: Tue, 19 Aug 2025 12:06:59 +0800 Subject: [PATCH 27/45] Chore/readme ci (#82) * chore: update README * chore: simplify README & add dependabot.yml * chore: fix dependabot.yml --- .github/dependabot.yml | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 06b7e24..bc63aca 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -1,17 +1,6 @@ version: 2 updates: - - package-ecosystem: 'npm' - directory: '/' - schedule: - interval: 'weekly' - open-pull-requests-limit: 10 - target-branch: 'main' - ignore: - - dependency-name: '*' - paths: - - 'examples/**' - - package-ecosystem: 'github-actions' directory: '/' schedule: - interval: 'monthly' \ No newline at end of file + interval: 'monthly' From 523dc341de5a333d757e3a38bfa2cc4c5975a20a Mon Sep 17 00:00:00 2001 From: WBH <48749219+wbh1328551759@users.noreply.github.com> Date: Mon, 25 Aug 2025 18:21:21 +0800 Subject: [PATCH 28/45] Feat/chain search (#85) * feat(core): add multiple chain information and related icons, refactor module export patterns * feat(react): refactor module export patterns, update core import patterns * feat(ui): update react module import patterns * feat(ui): add chain search input in chainModal * fix(core): fix the token name in the chain object * feat(example): update import patterns for connectors and chains * fix: fix import in test file * fix(react): fix type in useSigner --- examples/with-cra/src/index.tsx | 4 +- examples/with-nextjs-app/app/providers.tsx | 4 +- examples/with-nextjs-pages/pages/_app.tsx | 4 +- examples/with-vite/src/main.tsx | 6 +- packages/core/package.json | 5 + packages/core/scripts/convertLogos.mjs | 75 ++++++++----- packages/core/src/chains/kusama.ts | 37 ++++++- packages/core/src/chains/paseo.ts | 25 ++++- packages/core/src/chains/polkadot.ts | 60 +++++++++- packages/core/src/chains/westend.ts | 17 ++- packages/core/src/config/createConfig.test.ts | 14 +-- .../config/logos/chains/assethub-kusama.svg | 17 +++ .../config/logos/chains/assethub-paseo.webp | Bin 0 -> 3724 bytes .../config/logos/chains/assethub-westend.webp | Bin 0 -> 5890 bytes .../core/src/config/logos/chains/assethub.svg | 22 ++++ .../src/config/logos/chains/bridgehub.svg | 26 +++++ .../src/config/logos/chains/collectives.svg | 7 ++ .../config/logos/chains/coretime-kusama.webp | Bin 0 -> 3206 bytes .../src/config/logos/chains/coretime.webp | Bin 0 -> 3658 bytes .../src/config/logos/{ => chains}/kusama.svg | 0 .../src/config/logos/{ => chains}/paseo.svg | 0 .../src/config/logos/chains/people-kusama.svg | 29 +++++ .../core/src/config/logos/chains/people.svg | 25 +++++ .../config/logos/{ => chains}/polkadot.svg | 0 .../src/config/logos/{ => chains}/westend.svg | 0 .../config/logos/generated/assethubChain.ts | 6 + .../logos/generated/assethubKusamaChain.ts | 6 + .../logos/generated/assethubPaseoChain.ts | 6 + .../logos/generated/assethubWestendChain.ts | 6 + .../config/logos/generated/bridgehubChain.ts | 6 + .../logos/generated/collectivesChain.ts | 6 + .../config/logos/generated/coretimeChain.ts | 6 + .../logos/generated/coretimeKusamaChain.ts | 6 + .../core/src/config/logos/generated/index.ts | 30 +++-- .../src/config/logos/generated/kusamaChain.ts | 6 + .../src/config/logos/generated/kusamaSVG.ts | 6 - .../src/config/logos/generated/novaSVG.ts | 6 - .../src/config/logos/generated/novaWallet.ts | 6 + .../src/config/logos/generated/paseoChain.ts | 6 + .../src/config/logos/generated/paseoSVG.ts | 6 - .../src/config/logos/generated/peopleChain.ts | 6 + .../logos/generated/peopleKusamaChain.ts | 6 + .../config/logos/generated/polkadotChain.ts | 6 + .../src/config/logos/generated/polkadotSVG.ts | 6 - .../config/logos/generated/polkadotjsSVG.ts | 6 - .../logos/generated/polkadotjsWallet.ts | 6 + .../config/logos/generated/polkagateSVG.ts | 6 - .../config/logos/generated/polkagateWallet.ts | 6 + .../config/logos/generated/subwalletSVG.ts | 6 - .../config/logos/generated/subwalletWallet.ts | 6 + .../src/config/logos/generated/talismanSVG.ts | 6 - .../config/logos/generated/talismanWallet.ts | 6 + .../logos/generated/walletconnectSVG.ts | 6 - .../logos/generated/walletconnectWallet.ts | 6 + .../config/logos/generated/westendChain.ts | 6 + .../src/config/logos/generated/westendSVG.ts | 6 - .../src/config/logos/{ => wallets}/nova.svg | 0 .../config/logos/{ => wallets}/polkadotjs.svg | 0 .../config/logos/{ => wallets}/polkagate.svg | 0 .../config/logos/{ => wallets}/subwallet.svg | 0 .../config/logos/{ => wallets}/talisman.svg | 0 .../logos/{ => wallets}/walletconnect.svg | 0 packages/core/src/connectors/common.ts | 2 +- packages/core/src/connectors/nova.test.ts | 4 +- packages/core/src/connectors/nova.ts | 4 +- .../core/src/connectors/novaMobile.test.ts | 4 +- packages/core/src/connectors/novaMobile.ts | 4 +- .../core/src/connectors/polkadot-js.test.ts | 4 +- packages/core/src/connectors/polkadot-js.ts | 4 +- .../core/src/connectors/polkagate.test.ts | 4 +- packages/core/src/connectors/polkagate.ts | 4 +- .../core/src/connectors/subwallet.test.ts | 4 +- packages/core/src/connectors/subwallet.ts | 4 +- packages/core/src/connectors/talisman.test.ts | 4 +- packages/core/src/connectors/talisman.ts | 4 +- .../core/src/connectors/walletconnect.test.ts | 4 +- packages/core/src/connectors/walletconnect.ts | 6 +- packages/core/src/index.ts | 8 -- packages/core/tsup.config.ts | 3 +- packages/react/package.json | 20 ++++ packages/react/src/chains/index.ts | 1 + packages/react/src/connectors/index.ts | 1 + packages/react/src/context/LunoContext.ts | 2 +- .../react/src/context/LunoProvider.test.tsx | 5 +- packages/react/src/context/LunoProvider.tsx | 2 +- packages/react/src/hooks/useAccount.test.ts | 1 - packages/react/src/hooks/useAccount.ts | 4 +- packages/react/src/hooks/useAccounts.ts | 4 +- .../react/src/hooks/useActiveConnector.ts | 2 +- packages/react/src/hooks/useBalance.ts | 4 +- packages/react/src/hooks/useChain.ts | 2 +- packages/react/src/hooks/useChains.ts | 2 +- packages/react/src/hooks/useConfig.ts | 2 +- packages/react/src/hooks/useConnect.ts | 2 +- packages/react/src/hooks/useConnectors.ts | 2 +- .../react/src/hooks/useGenesisHash.test.ts | 2 +- packages/react/src/hooks/useSigner.ts | 4 +- .../react/src/hooks/useSs58Format.test.ts | 2 +- .../react/src/hooks/useSwitchChain.test.ts | 2 +- packages/react/src/hooks/useSwitchChain.ts | 2 +- .../react/src/store/createLunoStore.test.ts | 4 +- packages/react/src/store/createLunoStore.ts | 5 +- packages/react/src/test-utils/mocks.ts | 5 +- packages/react/src/test-utils/render.tsx | 2 +- packages/react/src/types/index.ts | 6 +- packages/react/src/types/state.ts | 2 +- packages/react/src/utils/createApi.ts | 5 +- packages/react/src/utils/index.ts | 16 ++- packages/react/tsconfig.json | 5 +- packages/react/tsup.config.ts | 6 +- .../AccountDetailsModal/MainView.tsx | 3 +- .../AccountDetailsModal/SwitchAccountView.tsx | 4 +- .../components/AccountDetailsModal/index.tsx | 8 +- .../ui/src/components/ChainList/index.tsx | 104 +++++++++--------- .../ui/src/components/ChainModal/index.tsx | 2 +- .../ConnectModal/ConnectOptions.tsx | 5 +- .../components/ConnectModal/WalletView.tsx | 15 ++- .../ui/src/components/ConnectModal/index.tsx | 9 +- packages/ui/src/hooks/useConnectButton.ts | 6 +- packages/ui/src/providers/LunoKitProvider.tsx | 2 +- 120 files changed, 667 insertions(+), 273 deletions(-) create mode 100644 packages/core/src/config/logos/chains/assethub-kusama.svg create mode 100644 packages/core/src/config/logos/chains/assethub-paseo.webp create mode 100644 packages/core/src/config/logos/chains/assethub-westend.webp create mode 100644 packages/core/src/config/logos/chains/assethub.svg create mode 100644 packages/core/src/config/logos/chains/bridgehub.svg create mode 100644 packages/core/src/config/logos/chains/collectives.svg create mode 100644 packages/core/src/config/logos/chains/coretime-kusama.webp create mode 100644 packages/core/src/config/logos/chains/coretime.webp rename packages/core/src/config/logos/{ => chains}/kusama.svg (100%) rename packages/core/src/config/logos/{ => chains}/paseo.svg (100%) create mode 100644 packages/core/src/config/logos/chains/people-kusama.svg create mode 100644 packages/core/src/config/logos/chains/people.svg rename packages/core/src/config/logos/{ => chains}/polkadot.svg (100%) rename packages/core/src/config/logos/{ => chains}/westend.svg (100%) create mode 100644 packages/core/src/config/logos/generated/assethubChain.ts create mode 100644 packages/core/src/config/logos/generated/assethubKusamaChain.ts create mode 100644 packages/core/src/config/logos/generated/assethubPaseoChain.ts create mode 100644 packages/core/src/config/logos/generated/assethubWestendChain.ts create mode 100644 packages/core/src/config/logos/generated/bridgehubChain.ts create mode 100644 packages/core/src/config/logos/generated/collectivesChain.ts create mode 100644 packages/core/src/config/logos/generated/coretimeChain.ts create mode 100644 packages/core/src/config/logos/generated/coretimeKusamaChain.ts create mode 100644 packages/core/src/config/logos/generated/kusamaChain.ts delete mode 100644 packages/core/src/config/logos/generated/kusamaSVG.ts delete mode 100644 packages/core/src/config/logos/generated/novaSVG.ts create mode 100644 packages/core/src/config/logos/generated/novaWallet.ts create mode 100644 packages/core/src/config/logos/generated/paseoChain.ts delete mode 100644 packages/core/src/config/logos/generated/paseoSVG.ts create mode 100644 packages/core/src/config/logos/generated/peopleChain.ts create mode 100644 packages/core/src/config/logos/generated/peopleKusamaChain.ts create mode 100644 packages/core/src/config/logos/generated/polkadotChain.ts delete mode 100644 packages/core/src/config/logos/generated/polkadotSVG.ts delete mode 100644 packages/core/src/config/logos/generated/polkadotjsSVG.ts create mode 100644 packages/core/src/config/logos/generated/polkadotjsWallet.ts delete mode 100644 packages/core/src/config/logos/generated/polkagateSVG.ts create mode 100644 packages/core/src/config/logos/generated/polkagateWallet.ts delete mode 100644 packages/core/src/config/logos/generated/subwalletSVG.ts create mode 100644 packages/core/src/config/logos/generated/subwalletWallet.ts delete mode 100644 packages/core/src/config/logos/generated/talismanSVG.ts create mode 100644 packages/core/src/config/logos/generated/talismanWallet.ts delete mode 100644 packages/core/src/config/logos/generated/walletconnectSVG.ts create mode 100644 packages/core/src/config/logos/generated/walletconnectWallet.ts create mode 100644 packages/core/src/config/logos/generated/westendChain.ts delete mode 100644 packages/core/src/config/logos/generated/westendSVG.ts rename packages/core/src/config/logos/{ => wallets}/nova.svg (100%) rename packages/core/src/config/logos/{ => wallets}/polkadotjs.svg (100%) rename packages/core/src/config/logos/{ => wallets}/polkagate.svg (100%) rename packages/core/src/config/logos/{ => wallets}/subwallet.svg (100%) rename packages/core/src/config/logos/{ => wallets}/talisman.svg (100%) rename packages/core/src/config/logos/{ => wallets}/walletconnect.svg (100%) create mode 100644 packages/react/src/chains/index.ts create mode 100644 packages/react/src/connectors/index.ts diff --git a/examples/with-cra/src/index.tsx b/examples/with-cra/src/index.tsx index 3011978..cd4535a 100644 --- a/examples/with-cra/src/index.tsx +++ b/examples/with-cra/src/index.tsx @@ -3,7 +3,9 @@ import ReactDOM from 'react-dom/client'; import './index.css'; import App from './App'; import reportWebVitals from './reportWebVitals'; -import { createConfig, kusama, polkadot, westend, paseo, polkagateConnector, subwalletConnector, talismanConnector, polkadotjsConnector, walletConnectConnector, novaConnector } from '@luno-kit/react' +import { createConfig } from '@luno-kit/react' +import { polkagateConnector, polkadotjsConnector, subwalletConnector, talismanConnector, novaConnector, walletConnectConnector } from '@luno-kit/react/connectors' +import { polkadot, kusama, westend } from '@luno-kit/react/chains' import { LunoKitProvider } from '@luno-kit/ui' import '@luno-kit/ui/styles.css' diff --git a/examples/with-nextjs-app/app/providers.tsx b/examples/with-nextjs-app/app/providers.tsx index f5fdace..bc0dfa1 100644 --- a/examples/with-nextjs-app/app/providers.tsx +++ b/examples/with-nextjs-app/app/providers.tsx @@ -1,7 +1,9 @@ "use client"; import { LunoKitProvider } from '@luno-kit/ui' -import { createConfig, kusama, polkadot, westend, polkagateConnector, subwalletConnector, talismanConnector, polkadotjsConnector, walletConnectConnector, novaConnector } from '@luno-kit/react' +import { createConfig } from '@luno-kit/react' +import { polkagateConnector, polkadotjsConnector, subwalletConnector, talismanConnector, novaConnector, walletConnectConnector } from '@luno-kit/react/connectors' +import { polkadot, kusama, westend } from '@luno-kit/react/chains' const connectors = [ polkadotjsConnector(), diff --git a/examples/with-nextjs-pages/pages/_app.tsx b/examples/with-nextjs-pages/pages/_app.tsx index d131ee0..02fa005 100644 --- a/examples/with-nextjs-pages/pages/_app.tsx +++ b/examples/with-nextjs-pages/pages/_app.tsx @@ -1,7 +1,9 @@ import '@/styles/globals.css' import type { AppProps } from "next/app" import { LunoKitProvider } from '@luno-kit/ui' -import { createConfig, kusama, polkadot, westend, polkagateConnector, subwalletConnector, talismanConnector, polkadotjsConnector, walletConnectConnector, novaConnector } from '@luno-kit/react' +import { createConfig } from '@luno-kit/react' +import { polkagateConnector, polkadotjsConnector, subwalletConnector, talismanConnector, novaConnector, walletConnectConnector } from '@luno-kit/react/connectors' +import { polkadot, kusama, westend } from '@luno-kit/react/chains' import '@luno-kit/ui/styles.css' const connectors = [ diff --git a/examples/with-vite/src/main.tsx b/examples/with-vite/src/main.tsx index 93e3612..d8ac152 100644 --- a/examples/with-vite/src/main.tsx +++ b/examples/with-vite/src/main.tsx @@ -2,7 +2,9 @@ import { StrictMode } from 'react' import { createRoot } from 'react-dom/client' import './index.css' import App from './App.tsx' -import { createConfig, kusama, polkadot, westend, paseo, polkagateConnector, subwalletConnector, talismanConnector, polkadotjsConnector, walletConnectConnector, novaConnector } from '@luno-kit/react' +import { createConfig } from '@luno-kit/react' +import { kusama, polkadot, westend, paseo, polkadotAssetHub, polkadotCoretime, polkadotCollectives, polkadotPeople, kusamaAssetHub, kusamaCoretime, kusamaPeople, paseoAssetHub, paseoPassetHub, westendAssetHub } from '@luno-kit/react/chains' +import { polkagateConnector, subwalletConnector, talismanConnector, polkadotjsConnector, walletConnectConnector, novaConnector } from '@luno-kit/react/connectors' import { LunoKitProvider } from '@luno-kit/ui' import '@luno-kit/ui/styles.css' @@ -17,7 +19,7 @@ const connectors = [ const lunoConfig = createConfig({ appName: 'luno with-vite example', - chains: [polkadot, kusama, westend, paseo], + chains: [polkadot, kusama, westend, paseo, polkadotAssetHub, polkadotCoretime, polkadotCollectives, polkadotPeople, kusamaAssetHub, kusamaCoretime, kusamaPeople, paseoAssetHub, paseoPassetHub, westendAssetHub], connectors: connectors, autoConnect: true, }); diff --git a/packages/core/package.json b/packages/core/package.json index d14871a..8f576c6 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -37,6 +37,11 @@ "types": "./dist/utils/index.d.ts", "import": "./dist/utils/index.js", "require": "./dist/utils/index.cjs" + }, + "./types": { + "types": "./dist/types/index.d.ts", + "import": "./dist/types/index.js", + "require": "./dist/types/index.cjs" } }, "files": [ diff --git a/packages/core/scripts/convertLogos.mjs b/packages/core/scripts/convertLogos.mjs index 41f2671..9143e51 100644 --- a/packages/core/scripts/convertLogos.mjs +++ b/packages/core/scripts/convertLogos.mjs @@ -20,10 +20,11 @@ const HEADER = '// Copyright 2025 Luno contributors\n// SPDX-License-Identifier: */ function stringCamelCase(str) { return str - .replace(/(?:^\w|[A-Z]|\b\w)/g, (word, index) => { - return index === 0 ? word.toLowerCase() : word.toUpperCase(); + .split(/[-\s]+/) + .map((word, index) => { + return index === 0 ? word.toLowerCase() : word.charAt(0).toUpperCase() + word.slice(1).toLowerCase(); }) - .replace(/\s+/g, ''); + .join(''); } /** @@ -52,37 +53,58 @@ const allLogos = {}; /** @type {Record} */ const oversized = {}; +const LOGO_TYPES = ['chains', 'wallets']; + // Process SVG files -fs.readdirSync(logosDir) - .filter(file => file.endsWith('.svg') && !file.startsWith('.')) - .forEach((file) => { - const fullPath = path.join(logosDir, file); - const fileName = path.basename(file, '.svg'); +LOGO_TYPES.forEach(type => { + const typeDir = path.join(logosDir, type); + fs.readdirSync(typeDir) + .filter(file => (file.endsWith('.svg') || file.endsWith('.webp')) && !file.startsWith('.')) + .forEach((file) => { + const fullPath = path.join(typeDir, file); + const fileName = path.basename(file, path.extname(file)); // 获取不带扩展名的文件名 + const fileExt = path.extname(file).toLowerCase(); - // Read SVG file - const buffer = fs.readFileSync(fullPath); - const base64Data = `data:image/svg+xml;base64,${buffer.toString('base64')}`; + const suffix = type.slice(0, -1); + const resultSuffix = suffix.charAt(0).toUpperCase() + suffix.slice(1); - // Generate export name: polkadotSVG, kusamaSVG - const exportName = `${stringCamelCase(fileName)}SVG`; - const outputFileName = `${fileName}SVG`; + const exportName = `${stringCamelCase(fileName)}${resultSuffix}`; + const outputFileName = `${stringCamelCase(fileName)}${resultSuffix}`; - // Write individual TypeScript file - const outputPath = path.join(generatedDir, `${outputFileName}.ts`); - fs.writeFileSync(outputPath, makeContents(exportName, base64Data)); + if (fileExt === '.svg') { + const buffer = fs.readFileSync(fullPath); + const base64Data = `data:image/svg+xml;base64,${buffer.toString('base64')}`; - result[exportName] = outputFileName; - allLogos[exportName] = base64Data; + const outputPath = path.join(generatedDir, `${outputFileName}.ts`); + fs.writeFileSync(outputPath, makeContents(exportName, base64Data)); - // Check file size - if (buffer.length > MAX_SIZE) { - oversized[exportName] = buffer.length; - } + result[exportName] = outputFileName; + allLogos[exportName] = base64Data; - console.log(`✅ Generated: ${exportName} (${Math.round(buffer.length / 1024)}KB)`); - }); + if (buffer.length > MAX_SIZE) { + oversized[exportName] = buffer.length; + } + + console.log(`✅ Generated: ${exportName} (${Math.round(buffer.length / 1024)}KB)`); + } else if (fileExt === '.webp') { + const buffer = fs.readFileSync(fullPath); + const base64Data = `data:image/webp;base64,${buffer.toString('base64')}`; + + const outputPath = path.join(generatedDir, `${outputFileName}.ts`); + fs.writeFileSync(outputPath, makeContents(exportName, base64Data)); + + result[exportName] = outputFileName; + allLogos[exportName] = base64Data; + + if (buffer.length > MAX_SIZE) { + oversized[exportName] = buffer.length; + } + + console.log(`✅ Generated: ${exportName} (${Math.round(buffer.length / 1024)}KB)`); + } + }); +}); -// Generate index.ts if (Object.keys(result).length > 0) { const indexContent = `${HEADER}${ Object.keys(result) @@ -95,7 +117,6 @@ if (Object.keys(result).length > 0) { console.log(`✅ Generated index.ts with ${Object.keys(result).length} exports`); } -// Check for duplicates const allKeys = Object.keys(allLogos); const dupes = {}; diff --git a/packages/core/src/chains/kusama.ts b/packages/core/src/chains/kusama.ts index 0e357ce..16e1a76 100644 --- a/packages/core/src/chains/kusama.ts +++ b/packages/core/src/chains/kusama.ts @@ -1,5 +1,5 @@ import type { Chain } from '../types' -import { kusamaSVG } from '../config/logos/generated' +import { kusamaChain, assethubKusamaChain, peopleKusamaChain, coretimeKusamaChain } from '../config/logos/generated' export const kusama: Chain = { genesisHash: '0xb0a8d493285c2df73290dfb7e61f870f17b41801197a149ca93654499ea3dafe', @@ -8,6 +8,39 @@ export const kusama: Chain = { rpcUrls: { webSocket: ['wss://kusama-rpc.polkadot.io', 'wss://kusama.api.onfinality.io/public-ws'] }, ss58Format: 2, blockExplorers: { default: { name: 'Subscan', url: 'https://kusama.subscan.io' } }, - chainIconUrl: kusamaSVG, + chainIconUrl: kusamaChain, testnet: false, }; + +export const kusamaAssetHub: Chain = { + genesisHash: '0x48239ef607d7928874027a43a67689209727dfb3d3dc5e5b03a39bdc2eda771a', + name: 'AssetHub Kusama', + nativeCurrency: { name: 'AssetHub Kusama', symbol: 'KSM', decimals: 12 }, + rpcUrls: { webSocket: ['wss://kusama-asset-hub-rpc.polkadot.io', 'wss://asset-hub-kusama-rpc.n.dwellir.com'] }, + ss58Format: 2, + blockExplorers: { default: { name: 'Subscan', url: 'https://assethub-kusama.subscan.io' } }, + chainIconUrl: assethubKusamaChain, + testnet: false, +} + +export const kusamaPeople: Chain = { + genesisHash: '0xc1af4cb4eb3918e5db15086c0cc5ec17fb334f728b7c65dd44bfe1e174ff8b3f', + name: 'People Kusama', + nativeCurrency: { name: 'People Kusama', symbol: 'KSM', decimals: 12 }, + rpcUrls: { webSocket: ['wss://kusama-people-rpc.polkadot.io', 'wss://people-kusama-rpc.n.dwellir.com'] }, + ss58Format: 2, + blockExplorers: { default: { name: 'Subscan', url: 'https://people-kusama.subscan.io' } }, + chainIconUrl: peopleKusamaChain, + testnet: false, +} + +export const kusamaCoretime: Chain = { + genesisHash: '0x638cd2b9af4b3bb54b8c1f0d22711fc89924ca93300f0caf25a580432b29d050', + name: 'Coretime Kusama', + nativeCurrency: { name: 'Coretime Kusama', symbol: 'KSM', decimals: 12 }, + rpcUrls: { webSocket: ['wss://kusama-coretime-rpc.polkadot.io', 'wss://coretime-kusama-rpc.n.dwellir.com'] }, + ss58Format: 2, + blockExplorers: { default: { name: 'Subscan', url: 'https://coretime-kusama.subscan.io' } }, + chainIconUrl: coretimeKusamaChain, + testnet: false, +} diff --git a/packages/core/src/chains/paseo.ts b/packages/core/src/chains/paseo.ts index 7170f39..88c0b20 100644 --- a/packages/core/src/chains/paseo.ts +++ b/packages/core/src/chains/paseo.ts @@ -1,5 +1,5 @@ import type { Chain } from '../types' -import { paseoSVG } from '../config/logos/generated' +import { paseoChain, assethubPaseoChain } from '../config/logos/generated' export const paseo: Chain = { genesisHash: '0x77afd6190f1554ad45fd0d31aee62aacc33c6db0ea801129acb813f913e0764f', @@ -8,6 +8,27 @@ export const paseo: Chain = { rpcUrls: { webSocket: ['wss://rpc.ibp.network/paseo', 'wss://paseo.rpc.amforc.com'] }, ss58Format: 0, blockExplorers: { default: { name: 'Subscan', url: 'https://paseo.subscan.io/' } }, - chainIconUrl: paseoSVG, + chainIconUrl: paseoChain, + testnet: true +}; + +export const paseoAssetHub: Chain = { + genesisHash: '0xd6eec26135305a8ad257a20d003357284c8aa03d0bdb2b357ab0a22371e11ef2', + name: 'AssetHub Paseo', + nativeCurrency: { name: 'AssetHub Paseo', symbol: 'PAS', decimals: 10 }, + rpcUrls: { webSocket: ['wss://pas-rpc.stakeworld.io/assethub', 'wss://asset-hub-paseo-rpc.n.dwellir.com'] }, + ss58Format: 0, + blockExplorers: { default: { name: 'Subscan', url: 'https://assethub-paseo.subscan.io' } }, + chainIconUrl: assethubPaseoChain, + testnet: true +}; + +export const paseoPassetHub: Chain = { + genesisHash: '0xfd974cf9eaf028f5e44b9fdd1949ab039c6cf9cc54449b0b60d71b042e79aeb6', + name: 'PAassetHub', + nativeCurrency: { name: 'PassetHub', symbol: 'PAS', decimals: 10 }, + rpcUrls: { webSocket: ['wss://testnet-passet-hub.polkadot.io', 'wss://passet-hub-paseo.ibp.network'] }, + ss58Format: 42, + chainIconUrl: assethubPaseoChain, testnet: true }; diff --git a/packages/core/src/chains/polkadot.ts b/packages/core/src/chains/polkadot.ts index 155eb4f..daa35d5 100644 --- a/packages/core/src/chains/polkadot.ts +++ b/packages/core/src/chains/polkadot.ts @@ -1,5 +1,5 @@ import type { Chain } from '../types' -import { polkadotSVG } from '../config/logos/generated' +import { polkadotChain, assethubChain, peopleChain, coretimeChain, collectivesChain } from '../config/logos/generated' export const polkadot: Chain = { genesisHash: '0x91b171bb158e2d3848fa23a9f1c25182fb8e20313b2c1eb49219da7a70ce90c3', @@ -11,6 +11,62 @@ export const polkadot: Chain = { }, ss58Format: 0, blockExplorers: { default: { name: 'Subscan', url: 'https://polkadot.subscan.io' } }, - chainIconUrl: polkadotSVG, + chainIconUrl: polkadotChain, testnet: false, }; + +export const polkadotAssetHub: Chain = { + genesisHash: '0x68d56f15f85d3136970ec16946040bc1752654e906147f7e43e9d539d7c3de2f', + name: 'AssetHub', + nativeCurrency: { name: 'AssetHub Polkadot', symbol: 'DOT', decimals: 10 }, + rpcUrls: { + webSocket: ['wss://polkadot-asset-hub-rpc.polkadot.io', 'wss://asset-hub-polkadot-rpc.n.dwellir.com'], + http: ['https://polkadot-asset-hub-rpc.polkadot.io'], + }, + ss58Format: 0, + blockExplorers: { default: { name: 'Subscan', url: 'https://assethub-polkadot.subscan.io' } }, + chainIconUrl: assethubChain, + testnet: false, +} + +export const polkadotPeople: Chain = { + genesisHash: '0x67fa177a097bfa18f77ea95ab56e9bcdfeb0e5b8a40e46298bb93e16b6fc5008', + name: 'People', + nativeCurrency: { name: 'People Polkadot', symbol: 'DOT', decimals: 10 }, + rpcUrls: { + webSocket: ['wss://polkadot-people-rpc.polkadot.io', 'wss://people-polkadot-rpc.n.dwellir.com'], + http: ['https://polkadot-people-rpc.polkadot.io'], + }, + ss58Format: 0, + blockExplorers: { default: { name: 'Subscan', url: 'https://people-polkadot.subscan.io' } }, + chainIconUrl: peopleChain, + testnet: false, +} + +export const polkadotCoretime: Chain = { + genesisHash: '0xefb56e30d9b4a24099f88820987d0f45fb645992416535d87650d98e00f46fc4', + name: 'Coretime', + nativeCurrency: { name: 'Coretime Polkadot', symbol: 'DOT', decimals: 10 }, + rpcUrls: { + webSocket: ['wss://polkadot-coretime-rpc.polkadot.io', 'wss://coretime-polkadot-rpc.n.dwellir.com'], + http: ['https://polkadot-coretime-rpc.polkadot.io'], + }, + ss58Format: 0, + blockExplorers: { default: { name: 'Subscan', url: 'https://coretime-polkadot.subscan.io' } }, + chainIconUrl: coretimeChain, + testnet: false, +} + +export const polkadotCollectives: Chain = { + genesisHash: '0x46ee89aa2eedd13e988962630ec9fb7565964cf5023bb351f2b6b25c1b68b0b2', + name: 'Collectives', + nativeCurrency: { name: 'Collectives Polkadot', symbol: 'DOT', decimals: 10 }, + rpcUrls: { + webSocket: ['wss://collectives-polkadot-rpc.n.dwellir.com', 'wss://polkadot-collectives-rpc.polkadot.io'], + http: ['https://collectives-polkadot-rpc.n.dwellir.com'], + }, + ss58Format: 0, + blockExplorers: { default: { name: 'Subscan', url: 'https://collectives-polkadot.subscan.io' } }, + chainIconUrl: collectivesChain, + testnet: false, +} diff --git a/packages/core/src/chains/westend.ts b/packages/core/src/chains/westend.ts index ce7320a..d79f3d0 100644 --- a/packages/core/src/chains/westend.ts +++ b/packages/core/src/chains/westend.ts @@ -1,13 +1,24 @@ import type { Chain } from '../types' -import { westendSVG } from '../config/logos/generated' +import { westendChain, assethubWestendChain } from '../config/logos/generated' export const westend: Chain = { genesisHash: '0xe143f23803ac50e8f6f8e62695d1ce9e4e1d68aa36c1cd2cfd15340213f3423e', name: 'Westend', nativeCurrency: { name: 'Westend', symbol: 'WND', decimals: 12 }, - rpcUrls: { webSocket: ['wss://westend-rpc.polkadot.io'] }, + rpcUrls: { webSocket: ['wss://westend-rpc.polkadot.io', 'wss://westend-rpc.n.dwellir.com'] }, ss58Format: 42, blockExplorers: { default: { name: 'Subscan', url: 'https://westend.subscan.io' } }, - chainIconUrl: westendSVG, + chainIconUrl: westendChain, testnet: true, }; + +export const westendAssetHub: Chain = { + genesisHash: '0x67f9723393ef76214df0118c34bbbd3dbebc8ed46a10973a8c969d48fe7598c9', + name: 'AssetHub Westend', + nativeCurrency: { name: 'AssetHub Westend', symbol: 'WND', decimals: 12 }, + rpcUrls: { webSocket: ['wss://westend-asset-hub-rpc.polkadot.io', 'wss://asset-hub-westend-rpc.n.dwellir.com'] }, + ss58Format: 42, + blockExplorers: { default: { name: 'Subscan', url: 'https://assethub-westend.subscan.io' } }, + chainIconUrl: assethubWestendChain, + testnet: true, +} diff --git a/packages/core/src/config/createConfig.test.ts b/packages/core/src/config/createConfig.test.ts index 1a4df93..466a317 100644 --- a/packages/core/src/config/createConfig.test.ts +++ b/packages/core/src/config/createConfig.test.ts @@ -12,14 +12,12 @@ vi.mock('./createStorage', () => ({ })) })) -vi.mock('../config/logos/generated', () => ({ - polkadotjsSVG: 'mocked-polkadotjs-logo', - subwalletSVG: 'mocked-subwallet-logo', - polkadotSVG: 'mocked-polkadot-logo', - kusamaSVG: 'mocked-kusama-logo', - paseoSVG: 'mocked-paseo-logo', - westendSVG: 'mocked-westend-logo', -})) +vi.mock('../config/logos/generated', async importOriginal => { + const actual = await importOriginal() + return { + ...actual, + } +}); describe('createConfig', () => { const mockConnectors = [polkadotjsConnector(), subwalletConnector()] diff --git a/packages/core/src/config/logos/chains/assethub-kusama.svg b/packages/core/src/config/logos/chains/assethub-kusama.svg new file mode 100644 index 0000000..07295c2 --- /dev/null +++ b/packages/core/src/config/logos/chains/assethub-kusama.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/packages/core/src/config/logos/chains/assethub-paseo.webp b/packages/core/src/config/logos/chains/assethub-paseo.webp new file mode 100644 index 0000000000000000000000000000000000000000..a1cd260c5af8856ea42318c29fd981c1ecb4466d GIT binary patch literal 3724 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 literal 0 HcmV?d00001 diff --git a/packages/core/src/config/logos/chains/assethub-westend.webp b/packages/core/src/config/logos/chains/assethub-westend.webp new file mode 100644 index 0000000000000000000000000000000000000000..17498cd33c692f5afb49ebdcd05d86a67adfefcc GIT binary patch literal 5890 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�JF#C6VN~o(%2{szn95&Fiq)vRoDv&0h1CE z5TNEH_KHpoB-Kb%2gR1j1F5U6Z~q8^3mhMB*rjMwP1m9jgM@mi*tk1F@8?+^)NEyM zNvz-@d8c>4^Jhp`Uz$g?&x2s05qY>$94e^|Jdm3M3eDawH@mnzuDG2@LKq{lfhYbu zDwscFVjnrD)^~(^osVs+l&UTEUv=%lJK9%-wr2 zWCZvFwE@b6s39d3`?B=meTJqEyoDEm!f@?y1krT9_*-Z%4P4E1cHeCtw=J=EZOGf{ zJ(Sw}t(DU?Q^o$WvnYdoY2IKi1aEfoUpzG(67W(eVN(VnD$0nz+3=6`-e8o`r)J1i zTrmwCtKANI#5u}KRWCS=SOBW%d&FWWy?)uc194EYwR3lFStK+EH!l;&X4_6)7v*DS zB!@<3BSj3MYtg37b44>>QKYs`+gRp|&v3GU{#=C-Uqte8rEN}K-$&gk^0Kye{aI4& zBjA37<17XLjDH>~y?d9rkw4gDJ(oM0pRP5q^qi6vKa15Xug!V5Z4hMV9CM)wIb7~* zT69-Jl)M{D(1f7H3uCWng*u?K`9~?+IG`F@wt@-uF7#3+6~JDLAo<;{Xe~lI7|=o0?p)eKdjZSWBN?N~)!oXzbvBTMJrY}5`U2o zKsWjZdEp}sK}p3#k~&ifgd88CUbB&Q{Z$AOcg893fk-iuR=WXL|7^%p6OgsC>#~Y5 z7E4Kn!MOcu9$h6a2vV03%nR?FwRRm=LOi!=X3PtwJ0c zlI^mWku;_HdeP1{<5JcNN=iL$Js6Kic&Ar!wiBwb5RJp+)**$=*+t?p*=Qmh-=2HP zXKT>Ft{9Geu;Th(pEFc^l2hN^&TyfNe%IIf5n_ow!T>vpr!Ngw*Zan*uloM& zMTAwfx2or`%Fq}nx6668o(*=#GEU`=X&(zCx3dXpj7Tw=3(C%^j}l~#&If^ef&a4n z)u`k*_>CrWtez*P8cE+DeA^)VnUrwE*^z|`Ya*PVli-wdEFZMJZ{}3?8NselLP)We z;Ze8^5Bm72dB;z_=uHt3_6nC3a+h;j+{mwD1aR{f7e0G9ta07UWo>`WS&3uUjR(db zLpVK`M~2tsS#|&wOj5WM)ulAXEv?>9-bmWh;3^o@*4^NJ?|AY+^ndiL2|S2{f(&0E zmDivDsfNy-KEj6A3v3-M9H<`NL?OqkjaWg&Ad#w5If1>CZoz_gD`eIae1|l56)p7s z?-ExFS%)UNwB^Eoq#Ho3mxGseacsmSa<-4oRD7Hzq^C42+xlepgI~&Kjd!XyQs{kf zk|G;)Br>;Q4Xf>KK`>MKj9gflO2`6kdeGds&ujD>vb%ydOa3KwnzD{?^1~_bkWO;9 zJaV$GZ!Z_qqoe!G-X;l*o{SzAbhbsXh5IIMf#niWcrca}9%WI#hz_Pep-s9SZ`~VN z*Z|7un*3MuJk>i(uEqM^9v%{(|9lt)BbPe_2{*{0Oa&wKVTN*O$$8tZc?tyw;#sQ?n zEvWzcFaZ>WknnBwI<`!gE>J)Kw*! Y+C{U}SXVhbClXlUNpuhZ000000JNKNZvX%Q literal 0 HcmV?d00001 diff --git a/packages/core/src/config/logos/chains/assethub.svg b/packages/core/src/config/logos/chains/assethub.svg new file mode 100644 index 0000000..d31fb61 --- /dev/null +++ b/packages/core/src/config/logos/chains/assethub.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + diff --git a/packages/core/src/config/logos/chains/bridgehub.svg b/packages/core/src/config/logos/chains/bridgehub.svg new file mode 100644 index 0000000..717fce3 --- /dev/null +++ b/packages/core/src/config/logos/chains/bridgehub.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + diff --git a/packages/core/src/config/logos/chains/collectives.svg b/packages/core/src/config/logos/chains/collectives.svg new file mode 100644 index 0000000..d8a90c1 --- /dev/null +++ b/packages/core/src/config/logos/chains/collectives.svg @@ -0,0 +1,7 @@ + diff --git a/packages/core/src/config/logos/chains/coretime-kusama.webp b/packages/core/src/config/logos/chains/coretime-kusama.webp new file mode 100644 index 0000000000000000000000000000000000000000..1bf9802c9477869d24b8a1cab3bb9cf261a3cb03 GIT binary patch literal 3206 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 literal 0 HcmV?d00001 diff --git a/packages/core/src/config/logos/chains/coretime.webp b/packages/core/src/config/logos/chains/coretime.webp new file mode 100644 index 0000000000000000000000000000000000000000..296c05cced4e852daeba373ae6ccd3e778c7fab6 GIT binary patch literal 3658 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 literal 0 HcmV?d00001 diff --git a/packages/core/src/config/logos/kusama.svg b/packages/core/src/config/logos/chains/kusama.svg similarity index 100% rename from packages/core/src/config/logos/kusama.svg rename to packages/core/src/config/logos/chains/kusama.svg diff --git a/packages/core/src/config/logos/paseo.svg b/packages/core/src/config/logos/chains/paseo.svg similarity index 100% rename from packages/core/src/config/logos/paseo.svg rename to packages/core/src/config/logos/chains/paseo.svg diff --git a/packages/core/src/config/logos/chains/people-kusama.svg b/packages/core/src/config/logos/chains/people-kusama.svg new file mode 100644 index 0000000..61912fe --- /dev/null +++ b/packages/core/src/config/logos/chains/people-kusama.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/core/src/config/logos/chains/people.svg b/packages/core/src/config/logos/chains/people.svg new file mode 100644 index 0000000..c6b5b28 --- /dev/null +++ b/packages/core/src/config/logos/chains/people.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/core/src/config/logos/polkadot.svg b/packages/core/src/config/logos/chains/polkadot.svg similarity index 100% rename from packages/core/src/config/logos/polkadot.svg rename to packages/core/src/config/logos/chains/polkadot.svg diff --git a/packages/core/src/config/logos/westend.svg b/packages/core/src/config/logos/chains/westend.svg similarity index 100% rename from packages/core/src/config/logos/westend.svg rename to packages/core/src/config/logos/chains/westend.svg diff --git a/packages/core/src/config/logos/generated/assethubChain.ts b/packages/core/src/config/logos/generated/assethubChain.ts new file mode 100644 index 0000000..5657fb3 --- /dev/null +++ b/packages/core/src/config/logos/generated/assethubChain.ts @@ -0,0 +1,6 @@ +// Copyright 2025 Luno contributors +// SPDX-License-Identifier: MIT + +// Do not edit. Auto-generated via node scripts/convertLogos.mjs + +export const assethubChain = 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDI3LjIuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IgogICAgIHZpZXdCb3g9IjAgMCA2NDAgNjQwIiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCA2NDAgNjQwOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Cgkuc3Qwe2ZpbGw6IzMyMUQ0Nzt9Cgkuc3Qxe2ZpbGw6I0ZGRkZGRjt9Cgkuc3Qye2ZpbGw6I0U2MDA3QTt9Cjwvc3R5bGU+CiAgICA8Zz4KCTxwYXRoIGNsYXNzPSJzdDAiIGQ9Ik02MzcuMywzMTkuM2MwLDE3NS4yLTE0MiwzMTcuMy0zMTcuMywzMTcuM1MyLjcsNDk0LjYsMi43LDMxOS4zUzE0NC44LDIuMSwzMjAsMi4xUzYzNy4zLDE0NC4xLDYzNy4zLDMxOS4zeiIKICAgIC8+CiAgICAgICAgPHBhdGggY2xhc3M9InN0MSIgZD0iTTQ0NC4yLDM5Mi40aC02Ny42bC0xMi43LTMxaC04NS44bC0xMi43LDMxaC02Ny42bDgwLjktMTg0LjNoODQuNUw0NDQuMiwzOTIuNHogTTMyMS4xLDI1NmwtMjIuNCw1NWg0NC43CgkJTDMyMS4xLDI1NnoiLz4KICAgICAgICA8Y2lyY2xlIGNsYXNzPSJzdDIiIGN4PSIzMjEiIGN5PSIxMjIuMSIgcj0iNDYuOSIvPgogICAgICAgIDxjaXJjbGUgY2xhc3M9InN0MiIgY3g9IjMyMSIgY3k9IjUxNy4xIiByPSI0Ni45Ii8+CiAgICAgICAgPGNpcmNsZSBjbGFzcz0ic3QyIiBjeD0iMTQ3LjgiIGN5PSIyMTYiIHI9IjQ2LjkiLz4KICAgICAgICA8Y2lyY2xlIGNsYXNzPSJzdDIiIGN4PSI0OTQuMyIgY3k9IjIxNiIgcj0iNDYuOSIvPgogICAgICAgIDxjaXJjbGUgY2xhc3M9InN0MiIgY3g9IjE0Ny44IiBjeT0iNDI0LjgiIHI9IjQ2LjkiLz4KICAgICAgICA8Y2lyY2xlIGNsYXNzPSJzdDIiIGN4PSI0OTQuMyIgY3k9IjQyNC44IiByPSI0Ni45Ii8+CjwvZz4KPC9zdmc+Cg=='; diff --git a/packages/core/src/config/logos/generated/assethubKusamaChain.ts b/packages/core/src/config/logos/generated/assethubKusamaChain.ts new file mode 100644 index 0000000..7b203ed --- /dev/null +++ b/packages/core/src/config/logos/generated/assethubKusamaChain.ts @@ -0,0 +1,6 @@ +// Copyright 2025 Luno contributors +// SPDX-License-Identifier: MIT + +// Do not edit. Auto-generated via node scripts/convertLogos.mjs + +export const assethubKusamaChain = 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTYiIGhlaWdodD0iNTYiIHZpZXdCb3g9IjAgMCA1NiA1NiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICAgIDxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMF8zMDYwXzE1MjYpIj4KICAgICAgICA8cGF0aCBkPSJNNTUuNzYzOCAyNy45Mzg4QzU1Ljc2MzggNDMuMjY4OCA0My4zMzg4IDU1LjcwMjYgMjguMDAwMSA1NS43MDI2QzEyLjY2MTMgNTUuNzAyNiAwLjIzNjMyOCA0My4yNzc2IDAuMjM2MzI4IDI3LjkzODhDMC4yMzYzMjggMTIuNjAwMSAxMi42NzAxIDAuMTgzODM4IDI4LjAwMDEgMC4xODM4MzhDNDMuMzMwMSAwLjE4MzgzOCA1NS43NjM4IDEyLjYwODggNTUuNzYzOCAyNy45Mzg4WiIgZmlsbD0iYmxhY2siLz4KICAgICAgICA8cGF0aCBkPSJNMzguODY3NiAzNC4zMzVIMzIuOTUyNkwzMS44NDE0IDMxLjYyMjVIMjQuMzMzOUwyMy4yMjI2IDM0LjMzNUgxNy4zMDc2TDI0LjM4NjQgMTguMjA4N0gzMS43ODAxTDM4Ljg2NzYgMzQuMzM1Wk0yOC4wOTY0IDIyLjRMMjYuMTM2NCAyNy4yMTI1SDMwLjA0NzZMMjguMDk2NCAyMi40WiIgZmlsbD0id2hpdGUiLz4KICAgICAgICA8cGF0aCBkPSJNMjguMDg3NiAxNC43ODc2QzMwLjM1NDEgMTQuNzg3NiAzMi4xOTE0IDEyLjk1MDMgMzIuMTkxNCAxMC42ODM4QzMyLjE5MTQgOC40MTczOSAzMC4zNTQxIDYuNTgwMDggMjguMDg3NiA2LjU4MDA4QzI1LjgyMTIgNi41ODAwOCAyMy45ODM5IDguNDE3MzkgMjMuOTgzOSAxMC42ODM4QzIzLjk4MzkgMTIuOTUwMyAyNS44MjEyIDE0Ljc4NzYgMjguMDg3NiAxNC43ODc2WiIgZmlsbD0id2hpdGUiLz4KICAgICAgICA8cGF0aCBkPSJNMjguMDg3NiA0OS4zNTAxQzMwLjM1NDEgNDkuMzUwMSAzMi4xOTE0IDQ3LjUxMjggMzIuMTkxNCA0NS4yNDYzQzMyLjE5MTQgNDIuOTc5OSAzMC4zNTQxIDQxLjE0MjYgMjguMDg3NiA0MS4xNDI2QzI1LjgyMTIgNDEuMTQyNiAyMy45ODM5IDQyLjk3OTkgMjMuOTgzOSA0NS4yNDYzQzIzLjk4MzkgNDcuNTEyOCAyNS44MjEyIDQ5LjM1MDEgMjguMDg3NiA0OS4zNTAxWiIgZmlsbD0id2hpdGUiLz4KICAgICAgICA8cGF0aCBkPSJNMTIuOTMyNCAyMy4wMDM5QzE1LjE5ODggMjMuMDAzOSAxNy4wMzYxIDIxLjE2NjYgMTcuMDM2MSAxOC45MDAxQzE3LjAzNjEgMTYuNjMzNyAxNS4xOTg4IDE0Ljc5NjQgMTIuOTMyNCAxNC43OTY0QzEwLjY2NTkgMTQuNzk2NCA4LjgyODYxIDE2LjYzMzcgOC44Mjg2MSAxOC45MDAxQzguODI4NjEgMjEuMTY2NiAxMC42NjU5IDIzLjAwMzkgMTIuOTMyNCAyMy4wMDM5WiIgZmlsbD0id2hpdGUiLz4KICAgICAgICA8cGF0aCBkPSJNNDMuMjUxMiAyMy4wMDM5QzQ1LjUxNzYgMjMuMDAzOSA0Ny4zNTUgMjEuMTY2NiA0Ny4zNTUgMTguOTAwMUM0Ny4zNTUgMTYuNjMzNyA0NS41MTc2IDE0Ljc5NjQgNDMuMjUxMiAxNC43OTY0QzQwLjk4NDggMTQuNzk2NCAzOS4xNDc1IDE2LjYzMzcgMzkuMTQ3NSAxOC45MDAxQzM5LjE0NzUgMjEuMTY2NiA0MC45ODQ4IDIzLjAwMzkgNDMuMjUxMiAyMy4wMDM5WiIgZmlsbD0id2hpdGUiLz4KICAgICAgICA8cGF0aCBkPSJNMTIuOTMyNCA0MS4yNzM5QzE1LjE5ODggNDEuMjczOSAxNy4wMzYxIDM5LjQzNjYgMTcuMDM2MSAzNy4xNzAyQzE3LjAzNjEgMzQuOTAzNyAxNS4xOTg4IDMzLjA2NjQgMTIuOTMyNCAzMy4wNjY0QzEwLjY2NTkgMzMuMDY2NCA4LjgyODYxIDM0LjkwMzcgOC44Mjg2MSAzNy4xNzAyQzguODI4NjEgMzkuNDM2NiAxMC42NjU5IDQxLjI3MzkgMTIuOTMyNCA0MS4yNzM5WiIgZmlsbD0id2hpdGUiLz4KICAgICAgICA8cGF0aCBkPSJNNDMuMjUxMiA0MS4yNzM5QzQ1LjUxNzYgNDEuMjczOSA0Ny4zNTUgMzkuNDM2NiA0Ny4zNTUgMzcuMTcwMkM0Ny4zNTUgMzQuOTAzNyA0NS41MTc2IDMzLjA2NjQgNDMuMjUxMiAzMy4wNjY0QzQwLjk4NDggMzMuMDY2NCAzOS4xNDc1IDM0LjkwMzcgMzkuMTQ3NSAzNy4xNzAyQzM5LjE0NzUgMzkuNDM2NiA0MC45ODQ4IDQxLjI3MzkgNDMuMjUxMiA0MS4yNzM5WiIgZmlsbD0id2hpdGUiLz4KICAgIDwvZz4KICAgIDxkZWZzPgogICAgICAgIDxjbGlwUGF0aCBpZD0iY2xpcDBfMzA2MF8xNTI2Ij4KICAgICAgICAgICAgPHJlY3Qgd2lkdGg9IjU2IiBoZWlnaHQ9IjU2IiBmaWxsPSJ3aGl0ZSIvPgogICAgICAgIDwvY2xpcFBhdGg+CiAgICA8L2RlZnM+Cjwvc3ZnPgo='; diff --git a/packages/core/src/config/logos/generated/assethubPaseoChain.ts b/packages/core/src/config/logos/generated/assethubPaseoChain.ts new file mode 100644 index 0000000..c5c2c57 --- /dev/null +++ b/packages/core/src/config/logos/generated/assethubPaseoChain.ts @@ -0,0 +1,6 @@ +// Copyright 2025 Luno contributors +// SPDX-License-Identifier: MIT + +// Do not edit. Auto-generated via node scripts/convertLogos.mjs + +export const assethubPaseoChain = 'data:image/webp;base64,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'; diff --git a/packages/core/src/config/logos/generated/assethubWestendChain.ts b/packages/core/src/config/logos/generated/assethubWestendChain.ts new file mode 100644 index 0000000..c96e15e --- /dev/null +++ b/packages/core/src/config/logos/generated/assethubWestendChain.ts @@ -0,0 +1,6 @@ +// Copyright 2025 Luno contributors +// SPDX-License-Identifier: MIT + +// Do not edit. Auto-generated via node scripts/convertLogos.mjs + +export const assethubWestendChain = 'data:image/webp;base64,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'; diff --git a/packages/core/src/config/logos/generated/bridgehubChain.ts b/packages/core/src/config/logos/generated/bridgehubChain.ts new file mode 100644 index 0000000..0c2f961 --- /dev/null +++ b/packages/core/src/config/logos/generated/bridgehubChain.ts @@ -0,0 +1,6 @@ +// Copyright 2025 Luno contributors +// SPDX-License-Identifier: MIT + +// Do not edit. Auto-generated via node scripts/convertLogos.mjs + +export const bridgehubChain = 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDI2LjQuMSwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IgogICAgIHZpZXdCb3g9IjAgMCA2NDAgNjQwIiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCA2NDAgNjQwOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Cgkuc3Qwe2ZpbGw6IzMyMUQ0Nzt9Cgkuc3Qxe2ZpbGw6I0U0MEI3Qjt9Cgkuc3Qye2ZpbGw6I0ZGRkZGRjt9Cjwvc3R5bGU+CiAgICA8Zz4KCTxwYXRoIGNsYXNzPSJzdDAiIGQ9Ik02NDAsMzIwLjNjMCwxNzYuOS0xNDMuNCwzMjAuMy0zMjAuMywzMjAuM1MtMC41LDQ5Ny4xLTAuNSwzMjAuM1MxNDIuOSwwLDMxOS44LDBTNjQwLDE0My40LDY0MCwzMjAuM3oiLz4KICAgICAgICA8Y2lyY2xlIGNsYXNzPSJzdDEiIGN4PSIzMjAuOCIgY3k9IjEyMS4xIiByPSI0Ny40Ii8+CiAgICAgICAgPGNpcmNsZSBjbGFzcz0ic3QxIiBjeD0iMzIwLjgiIGN5PSI1MTkuOSIgcj0iNDcuNCIvPgogICAgICAgIDxjaXJjbGUgY2xhc3M9InN0MSIgY3g9IjE0NiIgY3k9IjIxNS45IiByPSI0Ny40Ii8+CiAgICAgICAgPGNpcmNsZSBjbGFzcz0ic3QxIiBjeD0iNDk1LjciIGN5PSIyMTUuOSIgcj0iNDcuNCIvPgogICAgICAgIDxjaXJjbGUgY2xhc3M9InN0MSIgY3g9IjE0NiIgY3k9IjQyNi43IiByPSI0Ny40Ii8+CiAgICAgICAgPGNpcmNsZSBjbGFzcz0ic3QxIiBjeD0iNDk1LjciIGN5PSI0MjYuNyIgcj0iNDcuNCIvPgogICAgICAgIDxwYXRoIGNsYXNzPSJzdDIiIGQ9Ik00MjUuMiwzMzUuN2MtNS03LjUtMTIuNS0xMy4zLTIyLjQtMTcuNmMtMy4yLTEuNC02LjctMi41LTEwLjQtMy41YzAuOC0wLjQsMS41LTAuOCwyLjMtMS4yCgkJYzguOC01LjEsMTUuMi0xMS40LDE5LjEtMTguOWMzLjktNy41LDUuOS0xNS44LDUuOS0yNC45YzAtMTAtMi4zLTE4LjYtNi45LTI1LjhjLTQuNi03LjMtMTEuMy0xMi44LTE5LjktMTYuNwoJCWMtOC43LTMuOS0xOS01LjgtMzEtNS44aC0xNDhsMTQuOCw5Ni40bC0xNC44LDEwMS43aDE1My41YzE0LjIsMCwyNi4xLTIuNCwzNi03LjNjOS44LTQuOCwxNy4yLTExLjYsMjIuMS0yMC4xCgkJYzQuOS04LjYsNy40LTE4LjQsNy40LTI5LjRDNDMyLjcsMzUyLjEsNDMwLjIsMzQzLjIsNDI1LjIsMzM1Ljd6IE0zNjYsMzExTDM2NiwzMTFDMzY2LDMxMSwzNjYsMzExLDM2NiwzMTFMMzY2LDMxMXogTTM0My45LDI2OC4xCgkJYzIuNCwxLjIsNC4zLDIuOSw1LjUsNWMxLjMsMi4xLDEuOSw0LjUsMS45LDcuM2MwLDIuOS0wLjcsNS41LTIuMSw3LjhjLTEuNCwyLjMtMy4zLDQuMS01LjcsNS40Yy0yLjQsMS4zLTUuMSwxLjktOC4yLDEuOWgtNDYuMwoJCWwtNC43LTI5LjFoNTEuMUMzMzguNiwyNjYuMywzNDEuNSwyNjYuOSwzNDMuOSwyNjguMXogTTM1OS40LDM2OS41Yy0zLjMsMy4xLTcuOCw0LjYtMTMuNiw0LjZoLTYxLjhsNS4yLTM0LjNoNTYKCQljNiwwLDEwLjcsMS42LDE0LDQuOGMzLjQsMy4yLDUsNy4xLDUsMTIuM0MzNjQuNCwzNjIuMiwzNjIuNywzNjYuNCwzNTkuNCwzNjkuNXoiLz4KPC9nPgo8L3N2Zz4K'; diff --git a/packages/core/src/config/logos/generated/collectivesChain.ts b/packages/core/src/config/logos/generated/collectivesChain.ts new file mode 100644 index 0000000..4de4ed2 --- /dev/null +++ b/packages/core/src/config/logos/generated/collectivesChain.ts @@ -0,0 +1,6 @@ +// Copyright 2025 Luno contributors +// SPDX-License-Identifier: MIT + +// Do not edit. Auto-generated via node scripts/convertLogos.mjs + +export const collectivesChain = 'data:image/svg+xml;base64,PHN2ZyBhcmlhLWhpZGRlbj0idHJ1ZSIgZm9jdXNhYmxlPSJmYWxzZSIgZGF0YS1wcmVmaXg9ImZhcyIgZGF0YS1pY29uPSJwZW9wbGUtZ3JvdXAiCiAgICAgY2xhc3M9InN2Zy1pbmxpbmUtLWZhIGZhLXBlb3BsZS1ncm91cCBmYS0xeCBzYy1iZGZDRFUgaGJod1JtIHNjLW5GcklWIGN5UWJFRyAgdWktLUNoYWluSW1nICBpc0lubGluZSB1aS0tSWNvbiBub3JtYWxDb2xvciIgcm9sZT0iaW1nIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2NDAgNTEyIgogICAgIGRhdGEtdGVzdGlkPSJwZW9wbGUtZ3JvdXAiIHRhYmluZGV4PSItMSI+CiAgICA8cGF0aCBmaWxsPSJjdXJyZW50Q29sb3IiCiAgICAgICAgICBkPSJNNzIgODhhNTYgNTYgMCAxIDEgMTEyIDBBNTYgNTYgMCAxIDEgNzIgODh6TTY0IDI0NS43QzU0IDI1Ni45IDQ4IDI3MS44IDQ4IDI4OHM2IDMxLjEgMTYgNDIuM1YyNDUuN3ptMTQ0LjQtNDkuM0MxNzguNyAyMjIuNyAxNjAgMjYxLjIgMTYwIDMwNGMwIDM0LjMgMTIgNjUuOCAzMiA5MC41VjQxNmMwIDE3LjctMTQuMyAzMi0zMiAzMkg5NmMtMTcuNyAwLTMyLTE0LjMtMzItMzJWMzg5LjJDMjYuMiAzNzEuMiAwIDMzMi43IDAgMjg4YzAtNjEuOSA1MC4xLTExMiAxMTItMTEyaDMyYzI0IDAgNDYuMiA3LjUgNjQuNCAyMC4zek00NDggNDE2VjM5NC41YzIwLTI0LjcgMzItNTYuMiAzMi05MC41YzAtNDIuOC0xOC43LTgxLjMtNDguNC0xMDcuN0M0NDkuOCAxODMuNSA0NzIgMTc2IDQ5NiAxNzZoMzJjNjEuOSAwIDExMiA1MC4xIDExMiAxMTJjMCA0NC43LTI2LjIgODMuMi02NCAxMDEuMlY0MTZjMCAxNy43LTE0LjMgMzItMzIgMzJINDgwYy0xNy43IDAtMzItMTQuMy0zMi0zMnptOC0zMjhhNTYgNTYgMCAxIDEgMTEyIDBBNTYgNTYgMCAxIDEgNDU2IDg4ek01NzYgMjQ1Ljd2ODQuN2MxMC0xMS4zIDE2LTI2LjEgMTYtNDIuM3MtNi0zMS4xLTE2LTQyLjN6TTMyMCAzMmE2NCA2NCAwIDEgMSAwIDEyOCA2NCA2NCAwIDEgMSAwLTEyOHpNMjQwIDMwNGMwIDE2LjIgNiAzMSAxNiA0Mi4zVjI2MS43Yy0xMCAxMS4zLTE2IDI2LjEtMTYgNDIuM3ptMTQ0LTQyLjN2ODQuN2MxMC0xMS4zIDE2LTI2LjEgMTYtNDIuM3MtNi0zMS4xLTE2LTQyLjN6TTQ0OCAzMDRjMCA0NC43LTI2LjIgODMuMi02NCAxMDEuMlY0NDhjMCAxNy43LTE0LjMgMzItMzIgMzJIMjg4Yy0xNy43IDAtMzItMTQuMy0zMi0zMlY0MDUuMmMtMzcuOC0xOC02NC01Ni41LTY0LTEwMS4yYzAtNjEuOSA1MC4xLTExMiAxMTItMTEyaDMyYzYxLjkgMCAxMTIgNTAuMSAxMTIgMTEyeiI+CiAgICA8L3BhdGg+Cjwvc3ZnPgo='; diff --git a/packages/core/src/config/logos/generated/coretimeChain.ts b/packages/core/src/config/logos/generated/coretimeChain.ts new file mode 100644 index 0000000..90a6970 --- /dev/null +++ b/packages/core/src/config/logos/generated/coretimeChain.ts @@ -0,0 +1,6 @@ +// Copyright 2025 Luno contributors +// SPDX-License-Identifier: MIT + +// Do not edit. Auto-generated via node scripts/convertLogos.mjs + +export const coretimeChain = 'data:image/webp;base64,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'; diff --git a/packages/core/src/config/logos/generated/coretimeKusamaChain.ts b/packages/core/src/config/logos/generated/coretimeKusamaChain.ts new file mode 100644 index 0000000..380e56c --- /dev/null +++ b/packages/core/src/config/logos/generated/coretimeKusamaChain.ts @@ -0,0 +1,6 @@ +// Copyright 2025 Luno contributors +// SPDX-License-Identifier: MIT + +// Do not edit. Auto-generated via node scripts/convertLogos.mjs + +export const coretimeKusamaChain = 'data:image/webp;base64,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'; diff --git a/packages/core/src/config/logos/generated/index.ts b/packages/core/src/config/logos/generated/index.ts index eed8a24..e67b415 100644 --- a/packages/core/src/config/logos/generated/index.ts +++ b/packages/core/src/config/logos/generated/index.ts @@ -3,13 +3,23 @@ // Do not edit. Auto-generated via node scripts/convertLogos.mjs -export { kusamaSVG } from './kusamaSVG.js'; -export { novaSVG } from './novaSVG.js'; -export { paseoSVG } from './paseoSVG.js'; -export { polkadotSVG } from './polkadotSVG.js'; -export { polkadotjsSVG } from './polkadotjsSVG.js'; -export { polkagateSVG } from './polkagateSVG.js'; -export { subwalletSVG } from './subwalletSVG.js'; -export { talismanSVG } from './talismanSVG.js'; -export { walletconnectSVG } from './walletconnectSVG.js'; -export { westendSVG } from './westendSVG.js'; +export { assethubChain } from './assethubChain.js'; +export { assethubKusamaChain } from './assethubKusamaChain.js'; +export { assethubPaseoChain } from './assethubPaseoChain.js'; +export { assethubWestendChain } from './assethubWestendChain.js'; +export { bridgehubChain } from './bridgehubChain.js'; +export { collectivesChain } from './collectivesChain.js'; +export { coretimeChain } from './coretimeChain.js'; +export { coretimeKusamaChain } from './coretimeKusamaChain.js'; +export { kusamaChain } from './kusamaChain.js'; +export { novaWallet } from './novaWallet.js'; +export { paseoChain } from './paseoChain.js'; +export { peopleChain } from './peopleChain.js'; +export { peopleKusamaChain } from './peopleKusamaChain.js'; +export { polkadotChain } from './polkadotChain.js'; +export { polkadotjsWallet } from './polkadotjsWallet.js'; +export { polkagateWallet } from './polkagateWallet.js'; +export { subwalletWallet } from './subwalletWallet.js'; +export { talismanWallet } from './talismanWallet.js'; +export { walletconnectWallet } from './walletconnectWallet.js'; +export { westendChain } from './westendChain.js'; diff --git a/packages/core/src/config/logos/generated/kusamaChain.ts b/packages/core/src/config/logos/generated/kusamaChain.ts new file mode 100644 index 0000000..ba96f77 --- /dev/null +++ b/packages/core/src/config/logos/generated/kusamaChain.ts @@ -0,0 +1,6 @@ +// Copyright 2025 Luno contributors +// SPDX-License-Identifier: MIT + +// Do not edit. Auto-generated via node scripts/convertLogos.mjs + +export const kusamaChain = 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0NDEgNDQxIj48ZGVmcz48c3R5bGU+LmNscy0xe3N0cm9rZTojMDAwO3N0cm9rZS1taXRlcmxpbWl0OjEwO30uY2xzLTJ7ZmlsbDojZmZmO308L3N0eWxlPjwvZGVmcz48dGl0bGU+a3VzYW1hLWtzbS1sb2dvPC90aXRsZT48ZyBpZD0iTGF5ZXJfMiIgZGF0YS1uYW1lPSJMYXllciAyIj48ZyBpZD0iTGF5ZXJfMS0yIiBkYXRhLW5hbWU9IkxheWVyIDEiPjxyZWN0IGNsYXNzPSJjbHMtMSIgeD0iMC41IiB5PSIwLjUiIHdpZHRoPSI0NDAiIGhlaWdodD0iNDQwIi8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNMzczLjYsMTI3LjRjLTUuMi00LjEtMTEuNC05LjctMjIuNy0xMS4xLTEwLjYtMS40LTIxLjQsNS43LTI4LjcsMTAuNHMtMjEuMSwxOC41LTI2LjgsMjIuNy0yMC4zLDguMS00My44LDIyLjItMTE1LjcsNzMuMy0xMTUuNyw3My4zbDI0LC4zLTEwNyw1NS4xSDYzLjZMNDguMiwzMTJzMTMuNiwzLjYsMjUtMy42djMuM3MxMjcuNC01MC4yLDE1Mi0zNy4ybC0xNSw0LjRjMS4zLDAsMjUuNSwxLjYsMjUuNSwxLjZhMzQuMzQsMzQuMzQsMCwwLDAsMTUuNCwyNC44YzE0LjYsOS42LDE0LjksMTQuOSwxNC45LDE0LjlzLTcuNiwzLjEtNy42LDdjMCwwLDExLjItMy40LDIxLjYtMy4xYTgyLjY0LDgyLjY0LDAsMCwxLDE5LjUsMy4xcy0uOC00LjItMTAuOS03LTIwLjEtMTMuOC0yNS0xOS44YTI4LDI4LDAsMCwxLTQuMS0yNy40YzMuNS05LjEsMTUuNy0xNC4xLDQwLjktMjcuMSwyOS43LTE1LjQsMzYuNS0yNi44LDQwLjctMzUuN3MxMC40LTI2LjYsMTMuOS0zNC45YzQuNC0xMC43LDkuOC0xNi40LDE0LjMtMTkuOHMyNC41LTEwLjksMjQuNS0xMC45UzM3OC41LDEzMS4zLDM3My42LDEyNy40WiIvPjwvZz48L2c+PC9zdmc+'; diff --git a/packages/core/src/config/logos/generated/kusamaSVG.ts b/packages/core/src/config/logos/generated/kusamaSVG.ts deleted file mode 100644 index 1949f56..0000000 --- a/packages/core/src/config/logos/generated/kusamaSVG.ts +++ /dev/null @@ -1,6 +0,0 @@ -// Copyright 2025 Luno contributors -// SPDX-License-Identifier: MIT - -// Do not edit. Auto-generated via node scripts/convertLogos.mjs - -export const kusamaSVG = 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0NDEgNDQxIj48ZGVmcz48c3R5bGU+LmNscy0xe3N0cm9rZTojMDAwO3N0cm9rZS1taXRlcmxpbWl0OjEwO30uY2xzLTJ7ZmlsbDojZmZmO308L3N0eWxlPjwvZGVmcz48dGl0bGU+a3VzYW1hLWtzbS1sb2dvPC90aXRsZT48ZyBpZD0iTGF5ZXJfMiIgZGF0YS1uYW1lPSJMYXllciAyIj48ZyBpZD0iTGF5ZXJfMS0yIiBkYXRhLW5hbWU9IkxheWVyIDEiPjxyZWN0IGNsYXNzPSJjbHMtMSIgeD0iMC41IiB5PSIwLjUiIHdpZHRoPSI0NDAiIGhlaWdodD0iNDQwIi8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNMzczLjYsMTI3LjRjLTUuMi00LjEtMTEuNC05LjctMjIuNy0xMS4xLTEwLjYtMS40LTIxLjQsNS43LTI4LjcsMTAuNHMtMjEuMSwxOC41LTI2LjgsMjIuNy0yMC4zLDguMS00My44LDIyLjItMTE1LjcsNzMuMy0xMTUuNyw3My4zbDI0LC4zLTEwNyw1NS4xSDYzLjZMNDguMiwzMTJzMTMuNiwzLjYsMjUtMy42djMuM3MxMjcuNC01MC4yLDE1Mi0zNy4ybC0xNSw0LjRjMS4zLDAsMjUuNSwxLjYsMjUuNSwxLjZhMzQuMzQsMzQuMzQsMCwwLDAsMTUuNCwyNC44YzE0LjYsOS42LDE0LjksMTQuOSwxNC45LDE0LjlzLTcuNiwzLjEtNy42LDdjMCwwLDExLjItMy40LDIxLjYtMy4xYTgyLjY0LDgyLjY0LDAsMCwxLDE5LjUsMy4xcy0uOC00LjItMTAuOS03LTIwLjEtMTMuOC0yNS0xOS44YTI4LDI4LDAsMCwxLTQuMS0yNy40YzMuNS05LjEsMTUuNy0xNC4xLDQwLjktMjcuMSwyOS43LTE1LjQsMzYuNS0yNi44LDQwLjctMzUuN3MxMC40LTI2LjYsMTMuOS0zNC45YzQuNC0xMC43LDkuOC0xNi40LDE0LjMtMTkuOHMyNC41LTEwLjksMjQuNS0xMC45UzM3OC41LDEzMS4zLDM3My42LDEyNy40WiIvPjwvZz48L2c+PC9zdmc+'; diff --git a/packages/core/src/config/logos/generated/novaSVG.ts b/packages/core/src/config/logos/generated/novaSVG.ts deleted file mode 100644 index 59846f4..0000000 --- a/packages/core/src/config/logos/generated/novaSVG.ts +++ /dev/null @@ -1,6 +0,0 @@ -// Copyright 2025 Luno contributors -// SPDX-License-Identifier: MIT - -// Do not edit. Auto-generated via node scripts/convertLogos.mjs - -export const novaSVG = 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHZpZXdCb3g9IjAgMCAzMiAzMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAwXzQ5NDFfMTEwODEpIj4KPG1hc2sgaWQ9Im1hc2swXzQ5NDFfMTEwODEiIHN0eWxlPSJtYXNrLXR5cGU6YWxwaGEiIG1hc2tVbml0cz0idXNlclNwYWNlT25Vc2UiIHg9IjAiIHk9IjAiIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiI+CjxwYXRoIGQ9Ik0wIDguMzJDMCAzLjcyNDk5IDMuNzI0OTkgMCA4LjMyIDBIMjMuNjhDMjguMjc1IDAgMzIgMy43MjQ5OSAzMiA4LjMyVjIzLjY4QzMyIDI4LjI3NSAyOC4yNzUgMzIgMjMuNjggMzJIOC4zMkMzLjcyNDk5IDMyIDAgMjguMjc1IDAgMjMuNjhWOC4zMloiIGZpbGw9IiNGRjAwMDAiLz4KPC9tYXNrPgo8ZyBtYXNrPSJ1cmwoI21hc2swXzQ5NDFfMTEwODEpIj4KPHJlY3Qgd2lkdGg9IjMyIiBoZWlnaHQ9IjMyIiBmaWxsPSJ1cmwoI3BhaW50MF9yYWRpYWxfNDk0MV8xMTA4MSkiLz4KPC9nPgo8cGF0aCBkPSJNMjcuMjAwMSAxNlYxNi4yOTU3QzI1LjM3MjIgMTYuNTg2OSAyMS40NDc3IDE3LjI2MzQgMTkuNTE2OCAxOC4wMDI2QzE4LjgyNjkgMTguMjY2OSAxOC4yODA0IDE4LjgwOSAxOC4wMTE2IDE5LjQ5NDRDMTcuMjcyNCAyMS40MTY0IDE2LjU4NjkgMjUuMzYzMyAxNi4yOTU3IDI3LjIwMDFIMTUuNzA0NEMxNS40MTMyIDI1LjM2MzMgMTQuNzI3NyAyMS40MTY0IDEzLjk4ODUgMTkuNDk0NEMxMy43MTk3IDE4LjgwOSAxMy4xNjg3IDE4LjI2MjUgMTIuNDgzMiAxOC4wMDI2QzEwLjU1MjQgMTcuMjYzNCA2LjYyNzg5IDE2LjU4NjkgNC44MDAwNSAxNi4yOTU3VjE1LjcwNDRDNi42Mjc4OSAxNS40MTMyIDEwLjU1MjQgMTQuNzM2NyAxMi40ODMyIDEzLjk5NzVDMTMuMTczMiAxMy43MzMyIDEzLjcxOTcgMTMuMTkxMSAxMy45ODg1IDEyLjUwNTdDMTQuNzI3NyAxMC41ODM3IDE1LjQxMzIgNi42MzY4NSAxNS43MDQ0IDQuODAwMDVIMTYuMjk1N0MxNi41ODY5IDYuNjM2ODUgMTcuMjcyNCAxMC41ODM3IDE4LjAxMTYgMTIuNTA1N0MxOC4yODA0IDEzLjE5MTEgMTguODMxNCAxMy43Mzc2IDE5LjUxNjggMTMuOTk3NUMyMS40NDc3IDE0LjczNjcgMjUuMzcyMiAxNS40MTMyIDI3LjIwMDEgMTUuNzA0NFYxNloiIGZpbGw9IndoaXRlIi8+CjwvZz4KPGRlZnM+CjxyYWRpYWxHcmFkaWVudCBpZD0icGFpbnQwX3JhZGlhbF80OTQxXzExMDgxIiBjeD0iMCIgY3k9IjAiIHI9IjEiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKDAuODA0OTM3IDMwLjIyOTEpIHNjYWxlKDM2LjgwMzUpIj4KPHN0b3Agb2Zmc2V0PSIwLjA1MzMxOTEiIHN0b3AtY29sb3I9IiNEN0QzRTkiLz4KPHN0b3Agb2Zmc2V0PSIwLjE5MzMiIHN0b3AtY29sb3I9IiNBMTlDREUiLz4KPHN0b3Agb2Zmc2V0PSIwLjM4MzQiIHN0b3AtY29sb3I9IiM2OTZCRDkiLz4KPHN0b3Agb2Zmc2V0PSIwLjU0IiBzdG9wLWNvbG9yPSIjM0E1QUU3Ii8+CjxzdG9wIG9mZnNldD0iMC43NzM1IiBzdG9wLWNvbG9yPSIjMjI1RkU3Ii8+CjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzA4ODNEMSIvPgo8L3JhZGlhbEdyYWRpZW50Pgo8Y2xpcFBhdGggaWQ9ImNsaXAwXzQ5NDFfMTEwODEiPgo8cmVjdCB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIGZpbGw9IndoaXRlIi8+CjwvY2xpcFBhdGg+CjwvZGVmcz4KPC9zdmc+Cg=='; diff --git a/packages/core/src/config/logos/generated/novaWallet.ts b/packages/core/src/config/logos/generated/novaWallet.ts new file mode 100644 index 0000000..599522d --- /dev/null +++ b/packages/core/src/config/logos/generated/novaWallet.ts @@ -0,0 +1,6 @@ +// Copyright 2025 Luno contributors +// SPDX-License-Identifier: MIT + +// Do not edit. Auto-generated via node scripts/convertLogos.mjs + +export const novaWallet = 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHZpZXdCb3g9IjAgMCAzMiAzMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAwXzQ5NDFfMTEwODEpIj4KPG1hc2sgaWQ9Im1hc2swXzQ5NDFfMTEwODEiIHN0eWxlPSJtYXNrLXR5cGU6YWxwaGEiIG1hc2tVbml0cz0idXNlclNwYWNlT25Vc2UiIHg9IjAiIHk9IjAiIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiI+CjxwYXRoIGQ9Ik0wIDguMzJDMCAzLjcyNDk5IDMuNzI0OTkgMCA4LjMyIDBIMjMuNjhDMjguMjc1IDAgMzIgMy43MjQ5OSAzMiA4LjMyVjIzLjY4QzMyIDI4LjI3NSAyOC4yNzUgMzIgMjMuNjggMzJIOC4zMkMzLjcyNDk5IDMyIDAgMjguMjc1IDAgMjMuNjhWOC4zMloiIGZpbGw9IiNGRjAwMDAiLz4KPC9tYXNrPgo8ZyBtYXNrPSJ1cmwoI21hc2swXzQ5NDFfMTEwODEpIj4KPHJlY3Qgd2lkdGg9IjMyIiBoZWlnaHQ9IjMyIiBmaWxsPSJ1cmwoI3BhaW50MF9yYWRpYWxfNDk0MV8xMTA4MSkiLz4KPC9nPgo8cGF0aCBkPSJNMjcuMjAwMSAxNlYxNi4yOTU3QzI1LjM3MjIgMTYuNTg2OSAyMS40NDc3IDE3LjI2MzQgMTkuNTE2OCAxOC4wMDI2QzE4LjgyNjkgMTguMjY2OSAxOC4yODA0IDE4LjgwOSAxOC4wMTE2IDE5LjQ5NDRDMTcuMjcyNCAyMS40MTY0IDE2LjU4NjkgMjUuMzYzMyAxNi4yOTU3IDI3LjIwMDFIMTUuNzA0NEMxNS40MTMyIDI1LjM2MzMgMTQuNzI3NyAyMS40MTY0IDEzLjk4ODUgMTkuNDk0NEMxMy43MTk3IDE4LjgwOSAxMy4xNjg3IDE4LjI2MjUgMTIuNDgzMiAxOC4wMDI2QzEwLjU1MjQgMTcuMjYzNCA2LjYyNzg5IDE2LjU4NjkgNC44MDAwNSAxNi4yOTU3VjE1LjcwNDRDNi42Mjc4OSAxNS40MTMyIDEwLjU1MjQgMTQuNzM2NyAxMi40ODMyIDEzLjk5NzVDMTMuMTczMiAxMy43MzMyIDEzLjcxOTcgMTMuMTkxMSAxMy45ODg1IDEyLjUwNTdDMTQuNzI3NyAxMC41ODM3IDE1LjQxMzIgNi42MzY4NSAxNS43MDQ0IDQuODAwMDVIMTYuMjk1N0MxNi41ODY5IDYuNjM2ODUgMTcuMjcyNCAxMC41ODM3IDE4LjAxMTYgMTIuNTA1N0MxOC4yODA0IDEzLjE5MTEgMTguODMxNCAxMy43Mzc2IDE5LjUxNjggMTMuOTk3NUMyMS40NDc3IDE0LjczNjcgMjUuMzcyMiAxNS40MTMyIDI3LjIwMDEgMTUuNzA0NFYxNloiIGZpbGw9IndoaXRlIi8+CjwvZz4KPGRlZnM+CjxyYWRpYWxHcmFkaWVudCBpZD0icGFpbnQwX3JhZGlhbF80OTQxXzExMDgxIiBjeD0iMCIgY3k9IjAiIHI9IjEiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKDAuODA0OTM3IDMwLjIyOTEpIHNjYWxlKDM2LjgwMzUpIj4KPHN0b3Agb2Zmc2V0PSIwLjA1MzMxOTEiIHN0b3AtY29sb3I9IiNEN0QzRTkiLz4KPHN0b3Agb2Zmc2V0PSIwLjE5MzMiIHN0b3AtY29sb3I9IiNBMTlDREUiLz4KPHN0b3Agb2Zmc2V0PSIwLjM4MzQiIHN0b3AtY29sb3I9IiM2OTZCRDkiLz4KPHN0b3Agb2Zmc2V0PSIwLjU0IiBzdG9wLWNvbG9yPSIjM0E1QUU3Ii8+CjxzdG9wIG9mZnNldD0iMC43NzM1IiBzdG9wLWNvbG9yPSIjMjI1RkU3Ii8+CjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzA4ODNEMSIvPgo8L3JhZGlhbEdyYWRpZW50Pgo8Y2xpcFBhdGggaWQ9ImNsaXAwXzQ5NDFfMTEwODEiPgo8cmVjdCB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIGZpbGw9IndoaXRlIi8+CjwvY2xpcFBhdGg+CjwvZGVmcz4KPC9zdmc+Cg=='; diff --git a/packages/core/src/config/logos/generated/paseoChain.ts b/packages/core/src/config/logos/generated/paseoChain.ts new file mode 100644 index 0000000..7742b50 --- /dev/null +++ b/packages/core/src/config/logos/generated/paseoChain.ts @@ -0,0 +1,6 @@ +// Copyright 2025 Luno contributors +// SPDX-License-Identifier: MIT + +// Do not edit. Auto-generated via node scripts/convertLogos.mjs + +export const paseoChain = 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+CjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iTGF5ZXJfMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeD0iMHB4IiB5PSIwcHgiIHdpZHRoPSI3MHB4IiBoZWlnaHQ9IjcwcHgiIHZpZXdCb3g9IjAgMCA3MCA3MCIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgNzAgNzAiIHhtbDpzcGFjZT0icHJlc2VydmUiPiAgPGltYWdlIGlkPSJpbWFnZTAiIHdpZHRoPSI3MCIgaGVpZ2h0PSI3MCIgeD0iMCIgeT0iMCIKICAgIHhsaW5rOmhyZWY9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRVlBQUFCR0NBTUFBQUJHOEJLMkFBQUFJR05JVWswQUFIb21BQUNBaEFBQStnQUFBSURvCkFBQjFNQUFBNm1BQUFEcVlBQUFYY0p5NlVUd0FBQUlyVUV4VVJRQUFBRE01UURZelB6YzVQemM0UHpnNFB6YzVQemM1UGpjM1BUbzYKT2pjM1BqZzRQemc0UGpnNVBqYzRQalk0UHdBQUFEWTVQRGM1UHpnNVB6ZzRQemMzUGdBQUFEYzRQemM1UHpnNFBqZzRQamc0UGpZNQpQalUxUURnNFBqYzRQamMzUFRNek16ZzRQemM1UGpjM056ZzRQamM0UHpNek16azVPVGc0UGpFeFBUVTFQRGM0UHpnNFB6TTZPaXNyClFEZzVQeVFrSkRjNVBqYzVQamc0UGpVNVBUYzVQemM0UHpjM056WTVQUzR1TGpnNFB6YzNQVGM0UGpnNFBEYzNRRGc0UGprNU9UYzQKUGpjNFB6WTJOamM1UFRjNVBnQUFBRGc0UGpjNFB6VTFRRGc0UFRnNFBqYzRQemczUHpjNVB6YzRQemc1UHpnNVB6WTRQalk1UFRjMwpRRGM0UGpjNFBqTXpRRGc1UVRFN096YzVQamM0UGpjM1B6YzNQelkyUGpjNVBqWTVQemc1UHpnN1B6bzVQenBGUlVGeVhFZVdiVTI1CmZVN0VnMUxiamxiem1qazVQejVjVUVtaGNsRFFpVVdLWjFUbmxFTi9ZVlR6bWtpaWNrT0FZVDlvVmp4UlNreTZmVUp6V3pnNVBrL0UKZzFQbmxFZVdiRHBGUkZieG1sYnlta3FzZUVxc2VrV0xaamc1UFQ5blZVeTVmRS9QaVVxc2R6OW5Wa0JtVkRsRlJWYnptRkRQaVZYegptbFBvbEZYeW1WYjBtbGZ6bWxMY2owN0ZoRGc0UDFiem1WWHhta3V0ZDFUcWxWUG5renhRU2oxY1VGRFFpRUJ4V2xMY2pqdEZSVmJ6Cm0xYm5sRDltVlVGelcwTitZRXV4ZVZYem1VaWhjbFgybWxmeW1reS9mMHFvZFU3RmcwZWRiMVh4bVV5NWZVU0xaams1UFVPQllVN0YKaGpoRlJVaWpjanhUU3YvLy83RUhOa0FBQUFCaWRGSk9Vd0FvVlhtZXY5VG1WQlp6dHU3dXRYRURUSy83cmtvQzBNOVNXOVphR0ttbwpUd1dXbEE3QXZnOGIwaFVpNDlzakROTUh2WkJPUSsvbkYxQUw1RmpJUURpZ0V2WDBFM0N3QWUzc01HQ0F6T0RZNlBqZ2lHdzgyZG9VCjB4cmQvb3BGUW5SVjh2M2czd0FBQUFGaVMwZEV1RTIvSnZZQUFBQUhkRWxOUlFmcEJSOE1PUU9qa2cwM0FBQUYwa2xFUVZSWXc1VlkKaTE4VVJSeGZVaEV5ekZSQU0wWHlsV1pwbUpXbTVoTVVyS0MwU0N0cmp1VWV3OTJ4NSszdEhlMkdkQ0Q0Q0lNN2lFUXplcjhzZS85Nwp6VzhldTNOMyt6aStIejR3N014KzkvZWUzNHlpZUtQbW9TVkxsOVV1UjJoNTdiS2xTK3BxbE1Xai91RVZqNkF5Tkt4OHRINHhIS3NlClc3Mkd2UmtxWTFxenRuRlZsU1JOZGMzd1JoOVMrOE9SYUF3VHhLS1JjTDg2UUpuV3JXK3FodVR4RFhSMVBKSEVaVWdtNG5ScXd4T0IKUkJzM3dVSjFNSVpkRVJ0VVliNWxvei9MNWdZZ0NXdllFMW9ZaUJvMis1QzBQZ21mU21uNE10Y2lyV2NNZUdSazlMU3RvNVpDYUFCdAphZlZpMmJvTjNvankxZGtjbFI4TkNTK3B1U3lmK2dpNHQrOXdaM21xbGt6bW1ENm05VEY4a25uTWdXcVpNRHVzNWNnL08zZTVzVHk5Cm0wd2w4QlZLb2lJUGNDS2NJT05ubnExazJiT1hUSXd3ZFF6a0E0T3A5Z2taN3QxVHp2SmNHM2tjb1F2eUtBQjV1aXhDUm0zbEliMlAKMkpMS1lzYkY2cEFuVDV3cU5rSkcrMHBabmllUDB0VEhUS0VCZjNrTTZ2MDBHZTJYV2VwZklENmlMTnkyb3dGNnFaU0grT3ZGbHlTYQpGdklCOExUcGExeW1KdnVDQVhwcFpIbUx3M0tBUEtkUkYwZFZJdzdybzJSd1FMQWNmQmtoWGZaUmZJeENpTlpYOWxmeWw0N1E3b09jCjVoRFJGVlRLRWxsVGlhaWNsMUJuaElpcHErUGpFOWNjLzBIOGFNU1doempOWVlRc01NeDFyL0lRRFkraEcrTmtjQlBqaVJ2Q1ROUTgKRmtLSEdjdVJJU2JNcDlnSGs3ZkVhS0pQWkt2RnhYbUYwaHhsZW40MmhmRTBXMWtvVWhUY0dhL1pYamVaUFk4Q3k3SGphQWFVbWFWcgppbFpHY3JxYTBTM0c5cmxETTJkUGd6Z3hoRTZjSkRTblF1QzhtNWdJVTlCZE05dlE1MlRCeHAydjhDQTVSV2phV1JvTVk5TXZKeVdhCkx6SWx6aUlwMGE0b0hhY1JTcGJtcEJ0dVM5YkdFYUUzSkZBU29UTWRTaWVYYmNxL1BzelpMTU9UVU5jbHJZZ2hPcFV1eGptTC9kTnAKM2hhSHVZSlhnaVJMMEM3bExEUDRiRkErM2VFOGQ3OWs1dFowZUpwbUVYZ1draHNNTllWMThjS01oenh6aE9pZTlSV0pNcWNjNTFrQQp0Q2hrdnk2UzhRSUVRTFZRaTVpWHZ3eUVHa0t2S3E4aEZLUFNCTmRnQjMxNXptTXdWNzJ1ZE5zeG9TMmkydGpsR0g0ajFLMzBNQnA0CityVzZDQjVXam5YWXB4SHFFVFE2cEdYU1dBUVBUVXlOU2RNamxBck5TWHJOZnpQUDF6cEZxbkt2WUhweHBkNUFDQUxCNEhFNmlOQzMKWVBMWWQ4SHk1S2xuY0FGTTNEeEFIWjRSOFI3OW5uL2pxajhIUkZlQnhBbDNlRHNMUHdpK05Oam5CenQ1Zmd3RmlhUGpuMFQ0dmNtUwpJVTBmbXpJTm5nK1NKbzUvRnNuUVphYzc5ZUtrVkZoU3BVWXVOenBaVG9yR0Frdk5UaWZkQWI4SWptbjZHZi9kM0pxeUMwWEhHVHZkCkFTbEptbDhEVEJPblVaTkVRNmM3N0NLYVpWUHpFczFzTE9HWEg0TnNYMlJGVkRuSDkyT3UxWDJwV0VMOGpLVHMwSmIxVTFNeEZqVlEKcDg0Um1wTW5XQUJhYlA3TzdSSWFHdHZSY0dwTXlqZGpMQnkxQ3lFSnZ1UEh4SFkzelBZL3luT1BMcm4xV3hhWFFvdFNPQnYwMU8vWQoyZTZVOHp6TkxQRzExSVA3RC80Z1c3V3FDNllGN0lhN1VCblVVWFMrcEJYUTNQSTdZeFh0MTZabGptVCt1b2JsVm9BMkppQk9wSlRoClR4Rnc4WnlWTFVvTVpqR3RHNnh2TmFYR1JIbkxhWk5HNFdlb1Vxb2hPRGhRaUJpZ2RmUXZoTjR1YWRyK1pzNExhRUdsMk1Nc3VaMm0KamJXUXBwZDVYQUVkNTRKWjJrSXF2ZDFsRFcwUS9rbGVaZ25VM1NzM3h2dERVbnM5NC9NK2IyZHBQZitYakk1VU5QdklMc2REQWJLdwpuSVIycWF6WlY1UTJJa1ZXbEdNL1NVaE9Zc0hTVm5rUWVrZkk0N1F2THVoRFJzUm1xVHdJS2NxRmk0amJoeDlMWFZuRWNSYUs3c1VMCmJzZTdYVHVKMURuVGowaVFtRkRrYW5zVlYrellEazRRWVIvcEwyTlMreU44cWdoYWI5dXFlS0IxQ3l6WHhXNklrNGxCZG5ENGIyelEKdVNRd1lUTjY5ejNQQTdRaWp2T1dUVlFKZHB4dGVGL3h4Y1lXS24vZW8wTXY1S21tbXdJdUZ3Z3UxYklRUzFkZWRhUlpkdGRlQ2lRaAphRnEvanRzVTZnd1ZxMURNV3Z5U0FEWFhWWFB4UXRHNDFpdjhWamRXeTBGUi84SEtCaEczQWcwckZuY3B4VkZUSjErUmZlaDNSZlkvCktlY2ZTdEhQWDVRQUFBQWxkRVZZZEdSaGRHVTZZM0psWVhSbEFESXdNalV0TURVdE16RlVNVEk2TlRjNk1ETXJNREE2TUREYlhTOEcKQUFBQUpYUkZXSFJrWVhSbE9tMXZaR2xtZVFBeU1ESTFMVEExTFRNeFZERXlPalUzT2pBekt6QXdPakF3cWdDWHVnQUFBQ2gwUlZoMApaR0YwWlRwMGFXMWxjM1JoYlhBQU1qQXlOUzB3TlMwek1WUXhNam8xTnpvd015c3dNRG93TVAwVnRtVUFBQUFBU1VWT1JLNUNZSUk9IiAvPgo8L3N2Zz4K'; diff --git a/packages/core/src/config/logos/generated/paseoSVG.ts b/packages/core/src/config/logos/generated/paseoSVG.ts deleted file mode 100644 index 43f52c2..0000000 --- a/packages/core/src/config/logos/generated/paseoSVG.ts +++ /dev/null @@ -1,6 +0,0 @@ -// Copyright 2025 Luno contributors -// SPDX-License-Identifier: MIT - -// Do not edit. Auto-generated via node scripts/convertLogos.mjs - -export const paseoSVG = 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+CjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iTGF5ZXJfMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeD0iMHB4IiB5PSIwcHgiIHdpZHRoPSI3MHB4IiBoZWlnaHQ9IjcwcHgiIHZpZXdCb3g9IjAgMCA3MCA3MCIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgNzAgNzAiIHhtbDpzcGFjZT0icHJlc2VydmUiPiAgPGltYWdlIGlkPSJpbWFnZTAiIHdpZHRoPSI3MCIgaGVpZ2h0PSI3MCIgeD0iMCIgeT0iMCIKICAgIHhsaW5rOmhyZWY9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRVlBQUFCR0NBTUFBQUJHOEJLMkFBQUFJR05JVWswQUFIb21BQUNBaEFBQStnQUFBSURvCkFBQjFNQUFBNm1BQUFEcVlBQUFYY0p5NlVUd0FBQUlyVUV4VVJRQUFBRE01UURZelB6YzVQemM0UHpnNFB6YzVQemM1UGpjM1BUbzYKT2pjM1BqZzRQemc0UGpnNVBqYzRQalk0UHdBQUFEWTVQRGM1UHpnNVB6ZzRQemMzUGdBQUFEYzRQemM1UHpnNFBqZzRQamc0UGpZNQpQalUxUURnNFBqYzRQamMzUFRNek16ZzRQemM1UGpjM056ZzRQamM0UHpNek16azVPVGc0UGpFeFBUVTFQRGM0UHpnNFB6TTZPaXNyClFEZzVQeVFrSkRjNVBqYzVQamc0UGpVNVBUYzVQemM0UHpjM056WTVQUzR1TGpnNFB6YzNQVGM0UGpnNFBEYzNRRGc0UGprNU9UYzQKUGpjNFB6WTJOamM1UFRjNVBnQUFBRGc0UGpjNFB6VTFRRGc0UFRnNFBqYzRQemczUHpjNVB6YzRQemc1UHpnNVB6WTRQalk1UFRjMwpRRGM0UGpjNFBqTXpRRGc1UVRFN096YzVQamM0UGpjM1B6YzNQelkyUGpjNVBqWTVQemc1UHpnN1B6bzVQenBGUlVGeVhFZVdiVTI1CmZVN0VnMUxiamxiem1qazVQejVjVUVtaGNsRFFpVVdLWjFUbmxFTi9ZVlR6bWtpaWNrT0FZVDlvVmp4UlNreTZmVUp6V3pnNVBrL0UKZzFQbmxFZVdiRHBGUkZieG1sYnlta3FzZUVxc2VrV0xaamc1UFQ5blZVeTVmRS9QaVVxc2R6OW5Wa0JtVkRsRlJWYnptRkRQaVZYegptbFBvbEZYeW1WYjBtbGZ6bWxMY2owN0ZoRGc0UDFiem1WWHhta3V0ZDFUcWxWUG5renhRU2oxY1VGRFFpRUJ4V2xMY2pqdEZSVmJ6Cm0xYm5sRDltVlVGelcwTitZRXV4ZVZYem1VaWhjbFgybWxmeW1reS9mMHFvZFU3RmcwZWRiMVh4bVV5NWZVU0xaams1UFVPQllVN0YKaGpoRlJVaWpjanhUU3YvLy83RUhOa0FBQUFCaWRGSk9Vd0FvVlhtZXY5VG1WQlp6dHU3dXRYRURUSy83cmtvQzBNOVNXOVphR0ttbwpUd1dXbEE3QXZnOGIwaFVpNDlzakROTUh2WkJPUSsvbkYxQUw1RmpJUURpZ0V2WDBFM0N3QWUzc01HQ0F6T0RZNlBqZ2lHdzgyZG9VCjB4cmQvb3BGUW5SVjh2M2czd0FBQUFGaVMwZEV1RTIvSnZZQUFBQUhkRWxOUlFmcEJSOE1PUU9qa2cwM0FBQUYwa2xFUVZSWXc1VlkKaTE4VVJSeGZVaEV5ekZSQU0wWHlsV1pwbUpXbTVoTVVyS0MwU0N0cmp1VWV3OTJ4NSszdEhlMkdkQ0Q0Q0lNN2lFUXplcjhzZS85Nwp6VzhldTNOMyt6aStIejR3N014KzkvZWUzNHlpZUtQbW9TVkxsOVV1UjJoNTdiS2xTK3BxbE1Xai91RVZqNkF5Tkt4OHRINHhIS3NlClc3Mkd2UmtxWTFxenRuRlZsU1JOZGMzd1JoOVMrOE9SYUF3VHhLS1JjTDg2UUpuV3JXK3FodVR4RFhSMVBKSEVaVWdtNG5ScXd4T0IKUkJzM3dVSjFNSVpkRVJ0VVliNWxvei9MNWdZZ0NXdllFMW9ZaUJvMis1QzBQZ21mU21uNE10Y2lyV2NNZUdSazlMU3RvNVpDYUFCdAphZlZpMmJvTjNvankxZGtjbFI4TkNTK3B1U3lmK2dpNHQrOXdaM21xbGt6bW1ENm05VEY4a25uTWdXcVpNRHVzNWNnL08zZTVzVHk5Cm0wd2w4QlZLb2lJUGNDS2NJT05ubnExazJiT1hUSXd3ZFF6a0E0T3A5Z2taN3QxVHp2SmNHM2tjb1F2eUtBQjV1aXhDUm0zbEliMlAKMkpMS1lzYkY2cEFuVDV3cU5rSkcrMHBabmllUDB0VEhUS0VCZjNrTTZ2MDBHZTJYV2VwZklENmlMTnkyb3dGNnFaU0grT3ZGbHlTYQpGdklCOExUcGExeW1KdnVDQVhwcFpIbUx3M0tBUEtkUkYwZFZJdzdybzJSd1FMQWNmQmtoWGZaUmZJeENpTlpYOWxmeWw0N1E3b09jCjVoRFJGVlRLRWxsVGlhaWNsMUJuaElpcHErUGpFOWNjLzBIOGFNU1doempOWVlRc01NeDFyL0lRRFkraEcrTmtjQlBqaVJ2Q1ROUTgKRmtLSEdjdVJJU2JNcDlnSGs3ZkVhS0pQWkt2RnhYbUYwaHhsZW40MmhmRTBXMWtvVWhUY0dhL1pYamVaUFk4Q3k3SGphQWFVbWFWcgppbFpHY3JxYTBTM0c5cmxETTJkUGd6Z3hoRTZjSkRTblF1QzhtNWdJVTlCZE05dlE1MlRCeHAydjhDQTVSV2phV1JvTVk5TXZKeVdhCkx6SWx6aUlwMGE0b0hhY1JTcGJtcEJ0dVM5YkdFYUUzSkZBU29UTWRTaWVYYmNxL1BzelpMTU9UVU5jbHJZZ2hPcFV1eGptTC9kTnAKM2hhSHVZSlhnaVJMMEM3bExEUDRiRkErM2VFOGQ3OWs1dFowZUpwbUVYZ1draHNNTllWMThjS01oenh6aE9pZTlSV0pNcWNjNTFrQQp0Q2hrdnk2UzhRSUVRTFZRaTVpWHZ3eUVHa0t2S3E4aEZLUFNCTmRnQjMxNXptTXdWNzJ1ZE5zeG9TMmkydGpsR0g0ajFLMzBNQnA0CityVzZDQjVXam5YWXB4SHFFVFE2cEdYU1dBUVBUVXlOU2RNamxBck5TWHJOZnpQUDF6cEZxbkt2WUhweHBkNUFDQUxCNEhFNmlOQzMKWVBMWWQ4SHk1S2xuY0FGTTNEeEFIWjRSOFI3OW5uL2pxajhIUkZlQnhBbDNlRHNMUHdpK05Oam5CenQ1Zmd3RmlhUGpuMFQ0dmNtUwpJVTBmbXpJTm5nK1NKbzUvRnNuUVphYzc5ZUtrVkZoU3BVWXVOenBaVG9yR0Frdk5UaWZkQWI4SWptbjZHZi9kM0pxeUMwWEhHVHZkCkFTbEptbDhEVEJPblVaTkVRNmM3N0NLYVpWUHpFczFzTE9HWEg0TnNYMlJGVkRuSDkyT3UxWDJwV0VMOGpLVHMwSmIxVTFNeEZqVlEKcDg0Um1wTW5XQUJhYlA3TzdSSWFHdHZSY0dwTXlqZGpMQnkxQ3lFSnZ1UEh4SFkzelBZL3luT1BMcm4xV3hhWFFvdFNPQnYwMU8vWQoyZTZVOHp6TkxQRzExSVA3RC80Z1c3V3FDNllGN0lhN1VCblVVWFMrcEJYUTNQSTdZeFh0MTZabGptVCt1b2JsVm9BMkppQk9wSlRoClR4Rnc4WnlWTFVvTVpqR3RHNnh2TmFYR1JIbkxhWk5HNFdlb1Vxb2hPRGhRaUJpZ2RmUXZoTjR1YWRyK1pzNExhRUdsMk1Nc3VaMm0KamJXUXBwZDVYQUVkNTRKWjJrSXF2ZDFsRFcwUS9rbGVaZ25VM1NzM3h2dERVbnM5NC9NK2IyZHBQZitYakk1VU5QdklMc2REQWJLdwpuSVIycWF6WlY1UTJJa1ZXbEdNL1NVaE9Zc0hTVm5rUWVrZkk0N1F2THVoRFJzUm1xVHdJS2NxRmk0amJoeDlMWFZuRWNSYUs3c1VMCmJzZTdYVHVKMURuVGowaVFtRkRrYW5zVlYrellEazRRWVIvcEwyTlMreU44cWdoYWI5dXFlS0IxQ3l6WHhXNklrNGxCZG5ENGIyelEKdVNRd1lUTjY5ejNQQTdRaWp2T1dUVlFKZHB4dGVGL3h4Y1lXS24vZW8wTXY1S21tbXdJdUZ3Z3UxYklRUzFkZWRhUlpkdGRlQ2lRaAphRnEvanRzVTZnd1ZxMURNV3Z5U0FEWFhWWFB4UXRHNDFpdjhWamRXeTBGUi84SEtCaEczQWcwckZuY3B4VkZUSjErUmZlaDNSZlkvCktlY2ZTdEhQWDVRQUFBQWxkRVZZZEdSaGRHVTZZM0psWVhSbEFESXdNalV0TURVdE16RlVNVEk2TlRjNk1ETXJNREE2TUREYlhTOEcKQUFBQUpYUkZXSFJrWVhSbE9tMXZaR2xtZVFBeU1ESTFMVEExTFRNeFZERXlPalUzT2pBekt6QXdPakF3cWdDWHVnQUFBQ2gwUlZoMApaR0YwWlRwMGFXMWxjM1JoYlhBQU1qQXlOUzB3TlMwek1WUXhNam8xTnpvd015c3dNRG93TVAwVnRtVUFBQUFBU1VWT1JLNUNZSUk9IiAvPgo8L3N2Zz4K'; diff --git a/packages/core/src/config/logos/generated/peopleChain.ts b/packages/core/src/config/logos/generated/peopleChain.ts new file mode 100644 index 0000000..22b116f --- /dev/null +++ b/packages/core/src/config/logos/generated/peopleChain.ts @@ -0,0 +1,6 @@ +// Copyright 2025 Luno contributors +// SPDX-License-Identifier: MIT + +// Do not edit. Auto-generated via node scripts/convertLogos.mjs + +export const peopleChain = 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTYiIGhlaWdodD0iNTYiIHZpZXdCb3g9IjAgMCA1NiA1NiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICAgIDxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMF81XzMpIj4KICAgICAgICA8cGF0aCBkPSJNMjggNTZDNDMuNDY0IDU2IDU2IDQzLjQ2NCA1NiAyOEM1NiAxMi41MzYgNDMuNDY0IDAgMjggMEMxMi41MzYgMCAwIDEyLjUzNiAwIDI4QzAgNDMuNDY0IDEyLjUzNiA1NiAyOCA1NloiIGZpbGw9IiMwMEIyRkYiLz4KICAgICAgICA8cGF0aCBkPSJNMjguNSAxNUMzMC45ODUzIDE1IDMzIDEyLjk4NTMgMzMgMTAuNUMzMyA4LjAxNDcyIDMwLjk4NTMgNiAyOC41IDZDMjYuMDE0NyA2IDI0IDguMDE0NzIgMjQgMTAuNUMyNCAxMi45ODUzIDI2LjAxNDcgMTUgMjguNSAxNVoiIGZpbGw9IiNFNjAwN0EiLz4KICAgICAgICA8cGF0aCBkPSJNNDMuNSAyM0M0NS45ODUzIDIzIDQ4IDIwLjk4NTMgNDggMTguNUM0OCAxNi4wMTQ3IDQ1Ljk4NTMgMTQgNDMuNSAxNEM0MS4wMTQ3IDE0IDM5IDE2LjAxNDcgMzkgMTguNUMzOSAyMC45ODUzIDQxLjAxNDcgMjMgNDMuNSAyM1oiIGZpbGw9IiNFNjAwN0EiLz4KICAgICAgICA8cGF0aCBkPSJNNDMuNSA0MkM0NS45ODUzIDQyIDQ4IDM5Ljk4NTMgNDggMzcuNUM0OCAzNS4wMTQ3IDQ1Ljk4NTMgMzMgNDMuNSAzM0M0MS4wMTQ3IDMzIDM5IDM1LjAxNDcgMzkgMzcuNUMzOSAzOS45ODUzIDQxLjAxNDcgNDIgNDMuNSA0MloiIGZpbGw9IiNFNjAwN0EiLz4KICAgICAgICA8cGF0aCBkPSJNMTIuNSAyM0MxNC45ODUzIDIzIDE3IDIwLjk4NTMgMTcgMTguNUMxNyAxNi4wMTQ3IDE0Ljk4NTMgMTQgMTIuNSAxNEMxMC4wMTQ3IDE0IDggMTYuMDE0NyA4IDE4LjVDOCAyMC45ODUzIDEwLjAxNDcgMjMgMTIuNSAyM1oiIGZpbGw9IiNFNjAwN0EiLz4KICAgICAgICA8cGF0aCBkPSJNMTIuNSA0MkMxNC45ODUzIDQyIDE3IDM5Ljk4NTMgMTcgMzcuNUMxNyAzNS4wMTQ3IDE0Ljk4NTMgMzMgMTIuNSAzM0MxMC4wMTQ3IDMzIDggMzUuMDE0NyA4IDM3LjVDOCAzOS45ODUzIDEwLjAxNDcgNDIgMTIuNSA0MloiIGZpbGw9IiNFNjAwN0EiLz4KICAgICAgICA8cGF0aCBkPSJNMjguNSA1MEMzMC45ODUzIDUwIDMzIDQ3Ljk4NTMgMzMgNDUuNUMzMyA0My4wMTQ3IDMwLjk4NTMgNDEgMjguNSA0MUMyNi4wMTQ3IDQxIDI0IDQzLjAxNDcgMjQgNDUuNUMyNCA0Ny45ODUzIDI2LjAxNDcgNTAgMjguNSA1MFoiIGZpbGw9IiNFNjAwN0EiLz4KICAgICAgICA8ZyBmaWx0ZXI9InVybCgjZmlsdGVyMF9iXzVfMykiPgogICAgICAgICAgICA8cGF0aCBkPSJNMzAuNzEyIDIwQzMyLjE4NCAyMCAzMy40NDggMjAuMjU2IDM0LjUwNCAyMC43NjhDMzUuNTc2IDIxLjI2NCAzNi4zOTIgMjEuOTY4IDM2Ljk1MiAyMi44OEMzNy41MjggMjMuNzkyIDM3LjgxNiAyNC44NTYgMzcuODE2IDI2LjA3MkMzNy44MTYgMjcuMjg4IDM3LjUyOCAyOC4zNTIgMzYuOTUyIDI5LjI2NEMzNi4zOTIgMzAuMTc2IDM1LjU3NiAzMC44ODggMzQuNTA0IDMxLjRDMzMuNDQ4IDMxLjg5NiAzMi4xODQgMzIuMTQ0IDMwLjcxMiAzMi4xNDRIMjIuODRWMjguNDcySDMwLjQ3MkMzMS4zMzYgMjguNDcyIDMyLjAxNiAyOC4yNjQgMzIuNTEyIDI3Ljg0OEMzMy4wMDggMjcuNDE2IDMzLjI1NiAyNi44MjQgMzMuMjU2IDI2LjA3MkMzMy4yNTYgMjUuMzIgMzMuMDA4IDI0LjczNiAzMi41MTIgMjQuMzJDMzIuMDE2IDIzLjg4OCAzMS4zMzYgMjMuNjcyIDMwLjQ3MiAyMy42NzJIMjMuMjQ4TDI1LjI4OCAyMS41NlYzOEgyMC43NTJWMjBIMzAuNzEyWiIgZmlsbD0id2hpdGUiLz4KICAgICAgICA8L2c+CiAgICA8L2c+CiAgICA8ZGVmcz4KICAgICAgICA8ZmlsdGVyIGlkPSJmaWx0ZXIwX2JfNV8zIiB4PSIxNi43NTIiIHk9IjE2IiB3aWR0aD0iMjUuMDY0IiBoZWlnaHQ9IjI2IiBmaWx0ZXJVbml0cz0idXNlclNwYWNlT25Vc2UiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgICAgICAgICAgIDxmZUZsb29kIGZsb29kLW9wYWNpdHk9IjAiIHJlc3VsdD0iQmFja2dyb3VuZEltYWdlRml4Ii8+CiAgICAgICAgICAgIDxmZUdhdXNzaWFuQmx1ciBpbj0iQmFja2dyb3VuZEltYWdlRml4IiBzdGREZXZpYXRpb249IjIiLz4KICAgICAgICAgICAgPGZlQ29tcG9zaXRlIGluMj0iU291cmNlQWxwaGEiIG9wZXJhdG9yPSJpbiIgcmVzdWx0PSJlZmZlY3QxX2JhY2tncm91bmRCbHVyXzVfMyIvPgogICAgICAgICAgICA8ZmVCbGVuZCBtb2RlPSJub3JtYWwiIGluPSJTb3VyY2VHcmFwaGljIiBpbjI9ImVmZmVjdDFfYmFja2dyb3VuZEJsdXJfNV8zIiByZXN1bHQ9InNoYXBlIi8+CiAgICAgICAgPC9maWx0ZXI+CiAgICAgICAgPGNsaXBQYXRoIGlkPSJjbGlwMF81XzMiPgogICAgICAgICAgICA8cmVjdCB3aWR0aD0iNTYiIGhlaWdodD0iNTYiIGZpbGw9IndoaXRlIi8+CiAgICAgICAgPC9jbGlwUGF0aD4KICAgIDwvZGVmcz4KPC9zdmc+Cg=='; diff --git a/packages/core/src/config/logos/generated/peopleKusamaChain.ts b/packages/core/src/config/logos/generated/peopleKusamaChain.ts new file mode 100644 index 0000000..57bbda8 --- /dev/null +++ b/packages/core/src/config/logos/generated/peopleKusamaChain.ts @@ -0,0 +1,6 @@ +// Copyright 2025 Luno contributors +// SPDX-License-Identifier: MIT + +// Do not edit. Auto-generated via node scripts/convertLogos.mjs + +export const peopleKusamaChain = 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTYiIGhlaWdodD0iNTYiIHZpZXdCb3g9IjAgMCA1NiA1NiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICAgIDxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMF81XzMpIj4KICAgICAgICA8cGF0aCBkPSJNMjggNTZDNDMuNDY0IDU2IDU2IDQzLjQ2NCA1NiAyOEM1NiAxMi41MzYgNDMuNDY0IDAgMjggMEMxMi41MzYgMCAwIDEyLjUzNiAwIDI4QzAgNDMuNDY0IDEyLjUzNiA1NiAyOCA1NloiIGZpbGw9IiMwMjAyMDIiLz4KICAgICAgICA8cGF0aCBkPSJNMjguNSAxNUMzMC45ODUzIDE1IDMzIDEyLjk4NTMgMzMgMTAuNUMzMyA4LjAxNDcyIDMwLjk4NTMgNiAyOC41IDZDMjYuMDE0NyA2IDI0IDguMDE0NzIgMjQgMTAuNUMyNCAxMi45ODUzIDI2LjAxNDcgMTUgMjguNSAxNVoiIGZpbGw9IndoaXRlIi8+CiAgICAgICAgPHBhdGggZD0iTTQzLjUgMjNDNDUuOTg1MyAyMyA0OCAyMC45ODUzIDQ4IDE4LjVDNDggMTYuMDE0NyA0NS45ODUzIDE0IDQzLjUgMTRDNDEuMDE0NyAxNCAzOSAxNi4wMTQ3IDM5IDE4LjVDMzkgMjAuOTg1MyA0MS4wMTQ3IDIzIDQzLjUgMjNaIiBmaWxsPSJ3aGl0ZSIvPgogICAgICAgIDxwYXRoIGQ9Ik00My41IDQyQzQ1Ljk4NTMgNDIgNDggMzkuOTg1MyA0OCAzNy41QzQ4IDM1LjAxNDcgNDUuOTg1MyAzMyA0My41IDMzQzQxLjAxNDcgMzMgMzkgMzUuMDE0NyAzOSAzNy41QzM5IDM5Ljk4NTMgNDEuMDE0NyA0MiA0My41IDQyWiIgZmlsbD0id2hpdGUiLz4KICAgICAgICA8cGF0aCBkPSJNMTIuNSAyM0MxNC45ODUzIDIzIDE3IDIwLjk4NTMgMTcgMTguNUMxNyAxNi4wMTQ3IDE0Ljk4NTMgMTQgMTIuNSAxNEMxMC4wMTQ3IDE0IDggMTYuMDE0NyA4IDE4LjVDOCAyMC45ODUzIDEwLjAxNDcgMjMgMTIuNSAyM1oiIGZpbGw9IndoaXRlIi8+CiAgICAgICAgPHBhdGggZD0iTTEyLjUgNDJDMTQuOTg1MyA0MiAxNyAzOS45ODUzIDE3IDM3LjVDMTcgMzUuMDE0NyAxNC45ODUzIDMzIDEyLjUgMzNDMTAuMDE0NyAzMyA4IDM1LjAxNDcgOCAzNy41QzggMzkuOTg1MyAxMC4wMTQ3IDQyIDEyLjUgNDJaIiBmaWxsPSJ3aGl0ZSIvPgogICAgICAgIDxwYXRoIGQ9Ik0yOC41IDUwQzMwLjk4NTMgNTAgMzMgNDcuOTg1MyAzMyA0NS41QzMzIDQzLjAxNDcgMzAuOTg1MyA0MSAyOC41IDQxQzI2LjAxNDcgNDEgMjQgNDMuMDE0NyAyNCA0NS41QzI0IDQ3Ljk4NTMgMjYuMDE0NyA1MCAyOC41IDUwWiIgZmlsbD0id2hpdGUiLz4KICAgICAgICA8ZyBmaWx0ZXI9InVybCgjZmlsdGVyMF9kXzVfMykiPgogICAgICAgICAgICA8cGF0aCBkPSJNMzEuNzEyIDIwQzMzLjE4NCAyMCAzNC40NDggMjAuMjU2IDM1LjUwNCAyMC43NjhDMzYuNTc2IDIxLjI2NCAzNy4zOTIgMjEuOTY4IDM3Ljk1MiAyMi44OEMzOC41MjggMjMuNzkyIDM4LjgxNiAyNC44NTYgMzguODE2IDI2LjA3MkMzOC44MTYgMjcuMjg4IDM4LjUyOCAyOC4zNTIgMzcuOTUyIDI5LjI2NEMzNy4zOTIgMzAuMTc2IDM2LjU3NiAzMC44ODggMzUuNTA0IDMxLjRDMzQuNDQ4IDMxLjg5NiAzMy4xODQgMzIuMTQ0IDMxLjcxMiAzMi4xNDRIMjMuODRWMjguNDcySDMxLjQ3MkMzMi4zMzYgMjguNDcyIDMzLjAxNiAyOC4yNjQgMzMuNTEyIDI3Ljg0OEMzNC4wMDggMjcuNDE2IDM0LjI1NiAyNi44MjQgMzQuMjU2IDI2LjA3MkMzNC4yNTYgMjUuMzIgMzQuMDA4IDI0LjczNiAzMy41MTIgMjQuMzJDMzMuMDE2IDIzLjg4OCAzMi4zMzYgMjMuNjcyIDMxLjQ3MiAyMy42NzJIMjQuMjQ4TDI2LjI4OCAyMS41NlYzOEgyMS43NTJWMjBIMzEuNzEyWiIgZmlsbD0id2hpdGUiLz4KICAgICAgICA8L2c+CiAgICA8L2c+CiAgICA8ZGVmcz4KICAgICAgICA8ZmlsdGVyIGlkPSJmaWx0ZXIwX2RfNV8zIiB4PSIxNy43NTIiIHk9IjIwIiB3aWR0aD0iMjUuMDY0IiBoZWlnaHQ9IjI2IiBmaWx0ZXJVbml0cz0idXNlclNwYWNlT25Vc2UiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgICAgICAgICAgIDxmZUZsb29kIGZsb29kLW9wYWNpdHk9IjAiIHJlc3VsdD0iQmFja2dyb3VuZEltYWdlRml4Ii8+CiAgICAgICAgICAgIDxmZUNvbG9yTWF0cml4IGluPSJTb3VyY2VBbHBoYSIgdHlwZT0ibWF0cml4IiB2YWx1ZXM9IjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDEyNyAwIiByZXN1bHQ9ImhhcmRBbHBoYSIvPgogICAgICAgICAgICA8ZmVPZmZzZXQgZHk9IjQiLz4KICAgICAgICAgICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMiIvPgogICAgICAgICAgICA8ZmVDb21wb3NpdGUgaW4yPSJoYXJkQWxwaGEiIG9wZXJhdG9yPSJvdXQiLz4KICAgICAgICAgICAgPGZlQ29sb3JNYXRyaXggdHlwZT0ibWF0cml4IiB2YWx1ZXM9IjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAuMjUgMCIvPgogICAgICAgICAgICA8ZmVCbGVuZCBtb2RlPSJub3JtYWwiIGluMj0iQmFja2dyb3VuZEltYWdlRml4IiByZXN1bHQ9ImVmZmVjdDFfZHJvcFNoYWRvd181XzMiLz4KICAgICAgICAgICAgPGZlQmxlbmQgbW9kZT0ibm9ybWFsIiBpbj0iU291cmNlR3JhcGhpYyIgaW4yPSJlZmZlY3QxX2Ryb3BTaGFkb3dfNV8zIiByZXN1bHQ9InNoYXBlIi8+CiAgICAgICAgPC9maWx0ZXI+CiAgICAgICAgPGNsaXBQYXRoIGlkPSJjbGlwMF81XzMiPgogICAgICAgICAgICA8cmVjdCB3aWR0aD0iNTYiIGhlaWdodD0iNTYiIGZpbGw9IndoaXRlIi8+CiAgICAgICAgPC9jbGlwUGF0aD4KICAgIDwvZGVmcz4KPC9zdmc+Cg=='; diff --git a/packages/core/src/config/logos/generated/polkadotChain.ts b/packages/core/src/config/logos/generated/polkadotChain.ts new file mode 100644 index 0000000..95a9a9d --- /dev/null +++ b/packages/core/src/config/logos/generated/polkadotChain.ts @@ -0,0 +1,6 @@ +// Copyright 2025 Luno contributors +// SPDX-License-Identifier: MIT + +// Do not edit. Auto-generated via node scripts/convertLogos.mjs + +export const polkadotChain = 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iODAwIiBoZWlnaHQ9IjgwMCIgdmlld0JveD0iMCAwIDgwMCA4MDAiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxyZWN0IHdpZHRoPSI4MDAiIGhlaWdodD0iODAwIiByeD0iNDAwIiBmaWxsPSIjRTYwMDdBIi8+CjxwYXRoIGQ9Ik00MDAuMDcyIDI0Ni4wMzhDNDUyLjY2NiAyNDYuMDM4IDQ5NS4zMDIgMjIxLjE4MSA0OTUuMzAyIDE5MC41MTlDNDk1LjMwMiAxNTkuODU3IDQ1Mi42NjYgMTM1IDQwMC4wNzIgMTM1QzM0Ny40NzggMTM1IDMwNC44NDMgMTU5Ljg1NyAzMDQuODQzIDE5MC41MTlDMzA0Ljg0MyAyMjEuMTgxIDM0Ny40NzggMjQ2LjAzOCA0MDAuMDcyIDI0Ni4wMzhaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNNDAwLjA3MiA2NjQuMzY0QzQ1Mi42NjYgNjY0LjM2NCA0OTUuMzAyIDYzOS41MDcgNDk1LjMwMiA2MDguODQ1QzQ5NS4zMDIgNTc4LjE4MyA0NTIuNjY2IDU1My4zMjYgNDAwLjA3MiA1NTMuMzI2QzM0Ny40NzggNTUzLjMyNiAzMDQuODQzIDU3OC4xODMgMzA0Ljg0MyA2MDguODQ1QzMwNC44NDMgNjM5LjUwNyAzNDcuNDc4IDY2NC4zNjQgNDAwLjA3MiA2NjQuMzY0WiIgZmlsbD0id2hpdGUiLz4KPHBhdGggZD0iTTI2Ny4zNjMgMzIyLjg5QzI5My42NiAyNzcuMjMzIDI5My40ODkgMjI3Ljc4NSAyNjYuOTgyIDIxMi40NDNDMjQwLjQ3NSAxOTcuMTAyIDE5Ny42NjggMjIxLjY3NyAxNzEuMzcxIDI2Ny4zMzNDMTQ1LjA3NCAzMTIuOTg5IDE0NS4yNDUgMzYyLjQzOCAxNzEuNzUzIDM3Ny43NzlDMTk4LjI2IDM5My4xMjEgMjQxLjA2NiAzNjguNTQ2IDI2Ny4zNjMgMzIyLjg5WiIgZmlsbD0id2hpdGUiLz4KPHBhdGggZD0iTTYyOC43MzEgNTMyLjAyN0M2NTUuMDI4IDQ4Ni4zNzEgNjU0Ljg3MiA0MzYuOTMxIDYyOC4zODIgNDIxLjZDNjAxLjg5MyA0MDYuMjY5IDU1OS4xMDEgNDMwLjg1MiA1MzIuODA0IDQ3Ni41MDhDNTA2LjUwNyA1MjIuMTY1IDUwNi42NjMgNTcxLjYwNSA1MzMuMTUzIDU4Ni45MzZDNTU5LjY0MyA2MDIuMjY3IDYwMi40MzQgNTc3LjY4NCA2MjguNzMxIDUzMi4wMjdaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNMjY2Ljk5NiA1ODYuOTIzQzI5My41MDMgNTcxLjU4MiAyOTMuNjc0IDUyMi4xMzMgMjY3LjM3NyA0NzYuNDc3QzI0MS4wOCA0MzAuODIxIDE5OC4yNzQgNDA2LjI0NiAxNzEuNzY2IDQyMS41ODdDMTQ1LjI1OSA0MzYuOTI5IDE0NS4wODggNDg2LjM3NyAxNzEuMzg1IDUzMi4wMzRDMTk3LjY4MiA1NzcuNjkgMjQwLjQ4OCA2MDIuMjY1IDI2Ni45OTYgNTg2LjkyM1oiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik02MjguNDA1IDM3Ny43OTJDNjU0Ljg5NCAzNjIuNDYxIDY1NS4wNTEgMzEzLjAyIDYyOC43NTQgMjY3LjM2NEM2MDIuNDU3IDIyMS43MDggNTU5LjY2NSAxOTcuMTI0IDUzMy4xNzUgMjEyLjQ1NUM1MDYuNjg2IDIyNy43ODcgNTA2LjUzIDI3Ny4yMjcgNTMyLjgyNyAzMjIuODgzQzU1OS4xMjQgMzY4LjUzOSA2MDEuOTE1IDM5My4xMjMgNjI4LjQwNSAzNzcuNzkyWiIgZmlsbD0id2hpdGUiLz4KPC9zdmc+Cg=='; diff --git a/packages/core/src/config/logos/generated/polkadotSVG.ts b/packages/core/src/config/logos/generated/polkadotSVG.ts deleted file mode 100644 index 888cd6b..0000000 --- a/packages/core/src/config/logos/generated/polkadotSVG.ts +++ /dev/null @@ -1,6 +0,0 @@ -// Copyright 2025 Luno contributors -// SPDX-License-Identifier: MIT - -// Do not edit. Auto-generated via node scripts/convertLogos.mjs - -export const polkadotSVG = 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iODAwIiBoZWlnaHQ9IjgwMCIgdmlld0JveD0iMCAwIDgwMCA4MDAiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxyZWN0IHdpZHRoPSI4MDAiIGhlaWdodD0iODAwIiByeD0iNDAwIiBmaWxsPSIjRTYwMDdBIi8+CjxwYXRoIGQ9Ik00MDAuMDcyIDI0Ni4wMzhDNDUyLjY2NiAyNDYuMDM4IDQ5NS4zMDIgMjIxLjE4MSA0OTUuMzAyIDE5MC41MTlDNDk1LjMwMiAxNTkuODU3IDQ1Mi42NjYgMTM1IDQwMC4wNzIgMTM1QzM0Ny40NzggMTM1IDMwNC44NDMgMTU5Ljg1NyAzMDQuODQzIDE5MC41MTlDMzA0Ljg0MyAyMjEuMTgxIDM0Ny40NzggMjQ2LjAzOCA0MDAuMDcyIDI0Ni4wMzhaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNNDAwLjA3MiA2NjQuMzY0QzQ1Mi42NjYgNjY0LjM2NCA0OTUuMzAyIDYzOS41MDcgNDk1LjMwMiA2MDguODQ1QzQ5NS4zMDIgNTc4LjE4MyA0NTIuNjY2IDU1My4zMjYgNDAwLjA3MiA1NTMuMzI2QzM0Ny40NzggNTUzLjMyNiAzMDQuODQzIDU3OC4xODMgMzA0Ljg0MyA2MDguODQ1QzMwNC44NDMgNjM5LjUwNyAzNDcuNDc4IDY2NC4zNjQgNDAwLjA3MiA2NjQuMzY0WiIgZmlsbD0id2hpdGUiLz4KPHBhdGggZD0iTTI2Ny4zNjMgMzIyLjg5QzI5My42NiAyNzcuMjMzIDI5My40ODkgMjI3Ljc4NSAyNjYuOTgyIDIxMi40NDNDMjQwLjQ3NSAxOTcuMTAyIDE5Ny42NjggMjIxLjY3NyAxNzEuMzcxIDI2Ny4zMzNDMTQ1LjA3NCAzMTIuOTg5IDE0NS4yNDUgMzYyLjQzOCAxNzEuNzUzIDM3Ny43NzlDMTk4LjI2IDM5My4xMjEgMjQxLjA2NiAzNjguNTQ2IDI2Ny4zNjMgMzIyLjg5WiIgZmlsbD0id2hpdGUiLz4KPHBhdGggZD0iTTYyOC43MzEgNTMyLjAyN0M2NTUuMDI4IDQ4Ni4zNzEgNjU0Ljg3MiA0MzYuOTMxIDYyOC4zODIgNDIxLjZDNjAxLjg5MyA0MDYuMjY5IDU1OS4xMDEgNDMwLjg1MiA1MzIuODA0IDQ3Ni41MDhDNTA2LjUwNyA1MjIuMTY1IDUwNi42NjMgNTcxLjYwNSA1MzMuMTUzIDU4Ni45MzZDNTU5LjY0MyA2MDIuMjY3IDYwMi40MzQgNTc3LjY4NCA2MjguNzMxIDUzMi4wMjdaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNMjY2Ljk5NiA1ODYuOTIzQzI5My41MDMgNTcxLjU4MiAyOTMuNjc0IDUyMi4xMzMgMjY3LjM3NyA0NzYuNDc3QzI0MS4wOCA0MzAuODIxIDE5OC4yNzQgNDA2LjI0NiAxNzEuNzY2IDQyMS41ODdDMTQ1LjI1OSA0MzYuOTI5IDE0NS4wODggNDg2LjM3NyAxNzEuMzg1IDUzMi4wMzRDMTk3LjY4MiA1NzcuNjkgMjQwLjQ4OCA2MDIuMjY1IDI2Ni45OTYgNTg2LjkyM1oiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik02MjguNDA1IDM3Ny43OTJDNjU0Ljg5NCAzNjIuNDYxIDY1NS4wNTEgMzEzLjAyIDYyOC43NTQgMjY3LjM2NEM2MDIuNDU3IDIyMS43MDggNTU5LjY2NSAxOTcuMTI0IDUzMy4xNzUgMjEyLjQ1NUM1MDYuNjg2IDIyNy43ODcgNTA2LjUzIDI3Ny4yMjcgNTMyLjgyNyAzMjIuODgzQzU1OS4xMjQgMzY4LjUzOSA2MDEuOTE1IDM5My4xMjMgNjI4LjQwNSAzNzcuNzkyWiIgZmlsbD0id2hpdGUiLz4KPC9zdmc+Cg=='; diff --git a/packages/core/src/config/logos/generated/polkadotjsSVG.ts b/packages/core/src/config/logos/generated/polkadotjsSVG.ts deleted file mode 100644 index a68f80a..0000000 --- a/packages/core/src/config/logos/generated/polkadotjsSVG.ts +++ /dev/null @@ -1,6 +0,0 @@ -// Copyright 2025 Luno contributors -// SPDX-License-Identifier: MIT - -// Do not edit. Auto-generated via node scripts/convertLogos.mjs - -export const polkadotjsSVG = 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2ZXJzaW9uPSIxLjEiIGlkPSJMYXllcl8xIiB4PSIwcHgiCiAgICAgeT0iMHB4IiB2aWV3Qm94PSIxNSAxNSAxNDAgMTQwIiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAxNzAgMTcwO3pvb206IDE7IiB4bWw6c3BhY2U9InByZXNlcnZlIj48c2NyaXB0IHhtbG5zPSIiLz4KICAgIDxzY3JpcHQgeG1sbnM9IiIgaWQ9ImFyZ2VudC14LWV4dGVuc2lvbiIgZGF0YS1leHRlbnNpb24taWQ9ImRsY29icGppaWdwaWtvb2JvaG1hYmVoaG1oZm9vZGJiIi8+CiAgICA8U0NSSVBUIHhtbG5zPSIiIGlkPSJhbGxvdy1jb3B5X3NjcmlwdCIvPgogICAgPHNjcmlwdCB4bWxucz0iIi8+CiAgICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgogIC5iZzB7ZmlsbDojRkY4QzAwfQogICAgICAgIC5zdDB7ZmlsbDojRkZGRkZGO30KPC9zdHlsZT4KICAgIDxnPjxjaXJjbGUgY2xhc3M9ImJnMCIgY3g9Ijg1IiBjeT0iODUiIHI9IjcwIi8+CiAgICAgICAgPGc+PHBhdGggY2xhc3M9InN0MCIgZD0iTTg1LDM0LjdjLTIwLjgsMC0zNy44LDE2LjktMzcuOCwzNy44YzAsNC4yLDAuNyw4LjMsMiwxMi4zYzAuOSwyLjcsMy45LDQuMiw2LjcsMy4zYzIuNy0wLjksNC4yLTMuOSwzLjMtNi43IGMtMS4xLTMuMS0xLjYtNi40LTEuNS05LjdDNTguMSw1Ny42LDY5LjUsNDYsODMuNiw0NS4zYzE1LjctMC44LDI4LjcsMTEuNywyOC43LDI3LjJjMCwxNC41LTExLjQsMjYuNC0yNS43LDI3LjIgYzAsMC01LjMsMC4zLTcuOSwwLjdjLTEuMywwLjItMi4zLDAuNC0zLDAuNWMtMC4zLDAuMS0wLjYtMC4yLTAuNS0wLjVsMC45LTQuNEw4MSw3My40YzAuNi0yLjgtMS4yLTUuNi00LTYuMiBjLTIuOC0wLjYtNS42LDEuMi02LjIsNGMwLDAtMTEuOCw1NS0xMS45LDU1LjZjLTAuNiwyLjgsMS4yLDUuNiw0LDYuMmMyLjgsMC42LDUuNi0xLjIsNi4yLTRjMC4xLTAuNiwxLjctNy45LDEuNy03LjkgYzEuMi01LjYsNS44LTkuNywxMS4yLTEwLjRjMS4yLTAuMiw1LjktMC41LDUuOS0wLjVjMTkuNS0xLjUsMzQuOS0xNy44LDM0LjktMzcuN0MxMjIuOCw1MS42LDEwNS44LDM0LjcsODUsMzQuN3ogTTg3LjcsMTIxLjcgYy0zLjQtMC43LTYuOCwxLjQtNy41LDQuOWMtMC43LDMuNCwxLjQsNi44LDQuOSw3LjVjMy40LDAuNyw2LjgtMS40LDcuNS00LjlDOTMuMywxMjUuNyw5MS4yLDEyMi40LDg3LjcsMTIxLjd6Ii8+PC9nPjwvZz4KICAgIDxzY3JpcHQgeG1sbnM9IiIvPjwvc3ZnPgo='; diff --git a/packages/core/src/config/logos/generated/polkadotjsWallet.ts b/packages/core/src/config/logos/generated/polkadotjsWallet.ts new file mode 100644 index 0000000..a892f7e --- /dev/null +++ b/packages/core/src/config/logos/generated/polkadotjsWallet.ts @@ -0,0 +1,6 @@ +// Copyright 2025 Luno contributors +// SPDX-License-Identifier: MIT + +// Do not edit. Auto-generated via node scripts/convertLogos.mjs + +export const polkadotjsWallet = 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2ZXJzaW9uPSIxLjEiIGlkPSJMYXllcl8xIiB4PSIwcHgiCiAgICAgeT0iMHB4IiB2aWV3Qm94PSIxNSAxNSAxNDAgMTQwIiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAxNzAgMTcwO3pvb206IDE7IiB4bWw6c3BhY2U9InByZXNlcnZlIj48c2NyaXB0IHhtbG5zPSIiLz4KICAgIDxzY3JpcHQgeG1sbnM9IiIgaWQ9ImFyZ2VudC14LWV4dGVuc2lvbiIgZGF0YS1leHRlbnNpb24taWQ9ImRsY29icGppaWdwaWtvb2JvaG1hYmVoaG1oZm9vZGJiIi8+CiAgICA8U0NSSVBUIHhtbG5zPSIiIGlkPSJhbGxvdy1jb3B5X3NjcmlwdCIvPgogICAgPHNjcmlwdCB4bWxucz0iIi8+CiAgICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgogIC5iZzB7ZmlsbDojRkY4QzAwfQogICAgICAgIC5zdDB7ZmlsbDojRkZGRkZGO30KPC9zdHlsZT4KICAgIDxnPjxjaXJjbGUgY2xhc3M9ImJnMCIgY3g9Ijg1IiBjeT0iODUiIHI9IjcwIi8+CiAgICAgICAgPGc+PHBhdGggY2xhc3M9InN0MCIgZD0iTTg1LDM0LjdjLTIwLjgsMC0zNy44LDE2LjktMzcuOCwzNy44YzAsNC4yLDAuNyw4LjMsMiwxMi4zYzAuOSwyLjcsMy45LDQuMiw2LjcsMy4zYzIuNy0wLjksNC4yLTMuOSwzLjMtNi43IGMtMS4xLTMuMS0xLjYtNi40LTEuNS05LjdDNTguMSw1Ny42LDY5LjUsNDYsODMuNiw0NS4zYzE1LjctMC44LDI4LjcsMTEuNywyOC43LDI3LjJjMCwxNC41LTExLjQsMjYuNC0yNS43LDI3LjIgYzAsMC01LjMsMC4zLTcuOSwwLjdjLTEuMywwLjItMi4zLDAuNC0zLDAuNWMtMC4zLDAuMS0wLjYtMC4yLTAuNS0wLjVsMC45LTQuNEw4MSw3My40YzAuNi0yLjgtMS4yLTUuNi00LTYuMiBjLTIuOC0wLjYtNS42LDEuMi02LjIsNGMwLDAtMTEuOCw1NS0xMS45LDU1LjZjLTAuNiwyLjgsMS4yLDUuNiw0LDYuMmMyLjgsMC42LDUuNi0xLjIsNi4yLTRjMC4xLTAuNiwxLjctNy45LDEuNy03LjkgYzEuMi01LjYsNS44LTkuNywxMS4yLTEwLjRjMS4yLTAuMiw1LjktMC41LDUuOS0wLjVjMTkuNS0xLjUsMzQuOS0xNy44LDM0LjktMzcuN0MxMjIuOCw1MS42LDEwNS44LDM0LjcsODUsMzQuN3ogTTg3LjcsMTIxLjcgYy0zLjQtMC43LTYuOCwxLjQtNy41LDQuOWMtMC43LDMuNCwxLjQsNi44LDQuOSw3LjVjMy40LDAuNyw2LjgtMS40LDcuNS00LjlDOTMuMywxMjUuNyw5MS4yLDEyMi40LDg3LjcsMTIxLjd6Ii8+PC9nPjwvZz4KICAgIDxzY3JpcHQgeG1sbnM9IiIvPjwvc3ZnPgo='; diff --git a/packages/core/src/config/logos/generated/polkagateSVG.ts b/packages/core/src/config/logos/generated/polkagateSVG.ts deleted file mode 100644 index a9fe54f..0000000 --- a/packages/core/src/config/logos/generated/polkagateSVG.ts +++ /dev/null @@ -1,6 +0,0 @@ -// Copyright 2025 Luno contributors -// SPDX-License-Identifier: MIT - -// Do not edit. Auto-generated via node scripts/convertLogos.mjs - -export const polkagateSVG = 'data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMSIgZGF0YS1uYW1lPSJMYXllciAxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMjggMTI4Ij4KICAgIDxkZWZzPgogICAgICAgIDxzdHlsZT4uY2xzLTF7ZmlsbDojZmZmO30uY2xzLTJ7ZmlsbDojZTMwYjdiO308L3N0eWxlPgogICAgPC9kZWZzPgogICAgPGNpcmNsZSBjbGFzcz0iY2xzLTEiIGN4PSI2NCIgY3k9IjY0IiByPSI2NCIvPgogICAgPHBhdGggY2xhc3M9ImNscy0yIgogICAgICAgICAgZD0iTTEwNi4zNCwyOC42N2EyNy40NCwyNy40NCwwLDAsMC04LjItNC43OCw0Niw0NiwwLDAsMC0xNS42MS0yLjgyLDc2LDc2LDAsMCwwLTIyLjQ4LDMuMSw1NSw1NSwwLDAsMC05LjgsMy41bC0uMTYuMDdBNjIuNSw2Mi41LDAsMCwxLDYzLjU2LDI2LjUsMzkuNTksMzkuNTksMCwwLDEsNzcsMjguOTNhMjMuNjcsMjMuNjcsMCwwLDEsNy4wNyw0LjEyLDE3LjA1LDE3LjA1LDAsMCwxLDYuMTcsMTMuNDNBMjYuNDMsMjYuNDMsMCwwLDEsODYuODMsNTksNTEuMDgsNTEuMDgsMCwwLDEsNzUuMDcsNzMuNDJhNzguODksNzguODksMCwwLDEtMjIuOTEsMTRBNzMuMTEsNzMuMTEsMCwwLDEsMjcuNjMsOTIuOWE0NC42Myw0NC42MywwLDAsMS0xMy4xNC0xLjI1LDI5LjQxLDI5LjQxLDAsMCwwLDguODIsNC40LDUwLjU5LDUwLjU5LDAsMCwwLDE3LjUxLDIuMSw4NC43NSw4NC43NSwwLDAsMCwyOC40Ny02LjRBOTEuNzIsOTEuNzIsMCwwLDAsOTUuODgsNzUuNTRhNTkuMjYsNTkuMjYsMCwwLDAsMTMuNjYtMTYuNzYsMzAuODEsMzAuODEsMCwwLDAsNC0xNC41MkExOS43OSwxOS43OSwwLDAsMCwxMDYuMzQsMjguNjdaIgogICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAwKSIvPgogICAgPHBhdGggZD0iTTY1LjU2LDgwLjU0YzEtLjY2LDItMS4zNCwzLTItMS42OS0uNC0zLjQ0LS44Ni01LTEuMzMtNC43Ni0xLjQ3LTMuMTctNy44Mi0yLTkuMzhhNjguNzIsNjguNzIsMCwwLDAsNy4xNC0xMy40YzEuNDktNC4xLjE5LTkuMjItLjQ5LTExLjM2LS4xMi0uMzMtLjI0LS42Ny0uMzQtMWwtMS44NC01LjU2YTE5LjU2LDE5LjU2LDAsMCwwLTIuNTMtNC42Nyw3LjU4LDcuNTgsMCwwLDAtNi0zLjE0LDE2LjIyLDE2LjIyLDAsMCwwLTMuNzQuMzNjLTIsLjMyLTQsLjY4LTYsMWExLDEsMCwwLDEtLjIxLDBjLjQ4LjYxLjksMS4xNCwxLjMsMS42Ny41OS44LDEuMTcsMS42MiwxLjc3LDIuNDJBOC42Myw4LjYzLDAsMCwxLDUyLjM0LDM5YTE3LjQ5LDE3LjQ5LDAsMCwxLS4yNCwzLjMyLDcwLjMxLDcwLjMxLDAsMCwwLTUuNDUsOC44OUwzMS43NCw4MC42MmExLjM0LDEuMzQsMCwwLDAtLjA3LjE4bC4wNi4wNiw1LTMsLjA2LjA3UTI4Ljc2LDkwLjgsMjAuNzEsMTAzLjY3bC4wNSwwTDIzLDEwMi40Yy0uNjMsMS41NC0xLjIyLDMtMS44NCw0LjU0QTkuNDksOS40OSwwLDAsMCwyNCwxMDUuNGE3LjgyLDcuODIsMCwwLDAsMi4xLTIuNDlsLjQyLjcxLjI5LS4zNWMzLjczLTQuNzMsNy41OS05LjM2LDExLjYzLTEzLjg0YTEwNy4yNSwxMDcuMjUsMCwwLDEsOS43Ny05Ljc3QTIzLjM2LDIzLjM2LDAsMCwxLDUzLDc2LjM1YTUuNCw1LjQsMCwwLDEsMi0uNTlsLTIuNTksMi43OSwwLDBjMS44OC0xLDIuMTUtLjMxLDQtMS4yN2wuMjEuMjJjMS42MiwxLjkyLDUuMjcsMi42LDcuNzcsMi44MkE3LjUzLDcuNTMsMCwwLDEsNjUuNTYsODAuNTRaIgogICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAwKSIvPgo8L3N2Zz4K'; diff --git a/packages/core/src/config/logos/generated/polkagateWallet.ts b/packages/core/src/config/logos/generated/polkagateWallet.ts new file mode 100644 index 0000000..fe21e65 --- /dev/null +++ b/packages/core/src/config/logos/generated/polkagateWallet.ts @@ -0,0 +1,6 @@ +// Copyright 2025 Luno contributors +// SPDX-License-Identifier: MIT + +// Do not edit. Auto-generated via node scripts/convertLogos.mjs + +export const polkagateWallet = 'data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMSIgZGF0YS1uYW1lPSJMYXllciAxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMjggMTI4Ij4KICAgIDxkZWZzPgogICAgICAgIDxzdHlsZT4uY2xzLTF7ZmlsbDojZmZmO30uY2xzLTJ7ZmlsbDojZTMwYjdiO308L3N0eWxlPgogICAgPC9kZWZzPgogICAgPGNpcmNsZSBjbGFzcz0iY2xzLTEiIGN4PSI2NCIgY3k9IjY0IiByPSI2NCIvPgogICAgPHBhdGggY2xhc3M9ImNscy0yIgogICAgICAgICAgZD0iTTEwNi4zNCwyOC42N2EyNy40NCwyNy40NCwwLDAsMC04LjItNC43OCw0Niw0NiwwLDAsMC0xNS42MS0yLjgyLDc2LDc2LDAsMCwwLTIyLjQ4LDMuMSw1NSw1NSwwLDAsMC05LjgsMy41bC0uMTYuMDdBNjIuNSw2Mi41LDAsMCwxLDYzLjU2LDI2LjUsMzkuNTksMzkuNTksMCwwLDEsNzcsMjguOTNhMjMuNjcsMjMuNjcsMCwwLDEsNy4wNyw0LjEyLDE3LjA1LDE3LjA1LDAsMCwxLDYuMTcsMTMuNDNBMjYuNDMsMjYuNDMsMCwwLDEsODYuODMsNTksNTEuMDgsNTEuMDgsMCwwLDEsNzUuMDcsNzMuNDJhNzguODksNzguODksMCwwLDEtMjIuOTEsMTRBNzMuMTEsNzMuMTEsMCwwLDEsMjcuNjMsOTIuOWE0NC42Myw0NC42MywwLDAsMS0xMy4xNC0xLjI1LDI5LjQxLDI5LjQxLDAsMCwwLDguODIsNC40LDUwLjU5LDUwLjU5LDAsMCwwLDE3LjUxLDIuMSw4NC43NSw4NC43NSwwLDAsMCwyOC40Ny02LjRBOTEuNzIsOTEuNzIsMCwwLDAsOTUuODgsNzUuNTRhNTkuMjYsNTkuMjYsMCwwLDAsMTMuNjYtMTYuNzYsMzAuODEsMzAuODEsMCwwLDAsNC0xNC41MkExOS43OSwxOS43OSwwLDAsMCwxMDYuMzQsMjguNjdaIgogICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAwKSIvPgogICAgPHBhdGggZD0iTTY1LjU2LDgwLjU0YzEtLjY2LDItMS4zNCwzLTItMS42OS0uNC0zLjQ0LS44Ni01LTEuMzMtNC43Ni0xLjQ3LTMuMTctNy44Mi0yLTkuMzhhNjguNzIsNjguNzIsMCwwLDAsNy4xNC0xMy40YzEuNDktNC4xLjE5LTkuMjItLjQ5LTExLjM2LS4xMi0uMzMtLjI0LS42Ny0uMzQtMWwtMS44NC01LjU2YTE5LjU2LDE5LjU2LDAsMCwwLTIuNTMtNC42Nyw3LjU4LDcuNTgsMCwwLDAtNi0zLjE0LDE2LjIyLDE2LjIyLDAsMCwwLTMuNzQuMzNjLTIsLjMyLTQsLjY4LTYsMWExLDEsMCwwLDEtLjIxLDBjLjQ4LjYxLjksMS4xNCwxLjMsMS42Ny41OS44LDEuMTcsMS42MiwxLjc3LDIuNDJBOC42Myw4LjYzLDAsMCwxLDUyLjM0LDM5YTE3LjQ5LDE3LjQ5LDAsMCwxLS4yNCwzLjMyLDcwLjMxLDcwLjMxLDAsMCwwLTUuNDUsOC44OUwzMS43NCw4MC42MmExLjM0LDEuMzQsMCwwLDAtLjA3LjE4bC4wNi4wNiw1LTMsLjA2LjA3UTI4Ljc2LDkwLjgsMjAuNzEsMTAzLjY3bC4wNSwwTDIzLDEwMi40Yy0uNjMsMS41NC0xLjIyLDMtMS44NCw0LjU0QTkuNDksOS40OSwwLDAsMCwyNCwxMDUuNGE3LjgyLDcuODIsMCwwLDAsMi4xLTIuNDlsLjQyLjcxLjI5LS4zNWMzLjczLTQuNzMsNy41OS05LjM2LDExLjYzLTEzLjg0YTEwNy4yNSwxMDcuMjUsMCwwLDEsOS43Ny05Ljc3QTIzLjM2LDIzLjM2LDAsMCwxLDUzLDc2LjM1YTUuNCw1LjQsMCwwLDEsMi0uNTlsLTIuNTksMi43OSwwLDBjMS44OC0xLDIuMTUtLjMxLDQtMS4yN2wuMjEuMjJjMS42MiwxLjkyLDUuMjcsMi42LDcuNzcsMi44MkE3LjUzLDcuNTMsMCwwLDEsNjUuNTYsODAuNTRaIgogICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAwKSIvPgo8L3N2Zz4K'; diff --git a/packages/core/src/config/logos/generated/subwalletSVG.ts b/packages/core/src/config/logos/generated/subwalletSVG.ts deleted file mode 100644 index 0fd71a9..0000000 --- a/packages/core/src/config/logos/generated/subwalletSVG.ts +++ /dev/null @@ -1,6 +0,0 @@ -// Copyright 2025 Luno contributors -// SPDX-License-Identifier: MIT - -// Do not edit. Auto-generated via node scripts/convertLogos.mjs - -export const subwalletSVG = 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNzA0IiBoZWlnaHQ9IjcwNCIgdmlld0JveD0iMCAwIDcwNCA3MDQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiAgICA8ZyBjbGlwLXBhdGg9InVybCgjY2xpcDBfMzYyXzgwMTcpIj4KICAgICAgICA8bWFzayBpZD0ibWFzazBfMzYyXzgwMTciIHN0eWxlPSJtYXNrLXR5cGU6YWxwaGEiIG1hc2tVbml0cz0idXNlclNwYWNlT25Vc2UiIHg9IjAiIHk9IjAiIHdpZHRoPSI3MDQiCiAgICAgICAgICAgICAgaGVpZ2h0PSI3MDQiPgogICAgICAgICAgICA8cmVjdCB3aWR0aD0iNzA0IiBoZWlnaHQ9IjcwNCIgcng9IjQ4IiBmaWxsPSJ1cmwoI3BhaW50MF9saW5lYXJfMzYyXzgwMTcpIi8+CiAgICAgICAgPC9tYXNrPgogICAgICAgIDxnIG1hc2s9InVybCgjbWFzazBfMzYyXzgwMTcpIj4KICAgICAgICAgICAgPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAxXzM2Ml84MDE3KSI+CiAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD0iMTg0Ny4wOSIgaGVpZ2h0PSIxMjYwLjc5IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtNTI5IDE3Ni45MzcpIHJvdGF0ZSgtMjMuMjgpIgogICAgICAgICAgICAgICAgICAgICAgZmlsbD0iIzBDMEMwQyIvPgogICAgICAgICAgICAgICAgPGcgb3BhY2l0eT0iMC41IiBmaWx0ZXI9InVybCgjZmlsdGVyMF9mXzM2Ml84MDE3KSI+CiAgICAgICAgICAgICAgICAgICAgPGVsbGlwc2UgY3g9IjI5MC40NjQiIGN5PSIyMjQuNzUxIiByeD0iMjkwLjQ2NCIgcnk9IjIyNC43NTEiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC41NzEyMzggMC44MjA3ODUgMC43MjIxOTEgLTAuNjkxNjk0IC03MS45NDk3IDY1MS4wMjEpIiBmaWxsPSIjNzMxMTQwIi8+CiAgICAgICAgICAgICAgICA8L2c+CiAgICAgICAgICAgICAgICA8ZyBvcGFjaXR5PSIwLjciIGZpbHRlcj0idXJsKCNmaWx0ZXIxX2ZfMzYyXzgwMTcpIj4KICAgICAgICAgICAgICAgICAgICA8ZWxsaXBzZSBjeD0iMzIxLjY2NSIgY3k9IjMwNi44MjEiIHJ4PSIzMjEuNjY1IiByeT0iMzA2LjgyMSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjgwMjIyOCAtMC41OTcwMTggLTAuNTEwNDgzIC0wLjg1OTg4OCAtMjQ2LjQ3MiAxMzQ2LjM5KSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPSIjMDA0QkZGIi8+CiAgICAgICAgICAgICAgICA8L2c+CiAgICAgICAgICAgICAgICA8ZyBvcGFjaXR5PSIwLjciIGZpbHRlcj0idXJsKCNmaWx0ZXIyX2ZfMzYyXzgwMTcpIj4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNOTk5LjU1NiAtMTkzLjU4MkM4NTUuMTkgLTE2NS4yNzkgNzgyLjM5MyAtMjg5LjM2NSA2NjYuMTMyIC0xOTYuNzNDMzk2Ljk4IDE3LjcyNTUgODA2LjAxNiA1NzAuMjU0IDExNTAuMzEgNjE0LjgyNEMxMzU3LjQ3IDY0MS42NDEgMTM4OC40NyA2ODcuNDQ0IDE1MTYuMTQgNTE4LjUyNUMxNjQwLjcxIDM1My43MjEgMTY3MC4yNCAyNTAuNDU5IDE2NzcuMzYgMjkuMzkwNUMxNjc5Ljk1IC01MC45ODcgMTY2MS42NyAtMTg5LjkyNSAxNjAwLjcyIC0yNjQuODM5QzE1MzEuMjEgLTM1MC4yNzkgMTQ0My40NyAtMzYxLjQ0MiAxMzQ3LjE4IC0zMzYuNzkyQzEyNDguMDUgLTMxMS40MTYgMTE3OC43MiAtMjI4LjcwOCA5OTkuNTU2IC0xOTMuNTgyWiIKICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPSIjMUU5Qjc2Ii8+CiAgICAgICAgICAgICAgICA8L2c+CiAgICAgICAgICAgIDwvZz4KICAgICAgICA8L2c+CiAgICAgICAgPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAyXzM2Ml84MDE3KSI+CiAgICAgICAgICAgIDxwYXRoIGQ9Ik01MTIgMzAxLjU5OVYyMzQuOTlMMjQ1LjI4NiAxMjhMMTkyIDE1NS4wNkwxOTIuMjgxIDM2Mi4zOEwzOTEuODI0IDQ0Mi43MjdMMjg1LjI1MSA0ODguMTA0VjQ1My4wMTNMMjM2LjMyNCA0MzMuMTUyTDE5Mi4yODEgNDUzLjk2N0wxOTIuMjgxIDU4MC45NEwyNDUuMzMzIDYwOEw1MTIgNDg3LjY4OFY0MDIuMzQ1TDI3MiAzMDYuMjgzVjI0OEw0NjIuNDE3IDMyNC4wOEw1MTIgMzAxLjU5OVoiCiAgICAgICAgICAgICAgICAgIGZpbGw9IndoaXRlIi8+CiAgICAgICAgPC9nPgogICAgPC9nPgogICAgPGRlZnM+CiAgICAgICAgPGZpbHRlciBpZD0iZmlsdGVyMF9mXzM2Ml84MDE3IiB4PSItMjc1LjgyNSIgeT0iMTQ5LjMyMiIgd2lkdGg9IjEwNjQuMjMiIGhlaWdodD0iMTE2OS4zIgogICAgICAgICAgICAgICAgZmlsdGVyVW5pdHM9InVzZXJTcGFjZU9uVXNlIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICAgICAgICAgICA8ZmVGbG9vZCBmbG9vZC1vcGFjaXR5PSIwIiByZXN1bHQ9IkJhY2tncm91bmRJbWFnZUZpeCIvPgogICAgICAgICAgICA8ZmVCbGVuZCBtb2RlPSJub3JtYWwiIGluPSJTb3VyY2VHcmFwaGljIiBpbjI9IkJhY2tncm91bmRJbWFnZUZpeCIgcmVzdWx0PSJzaGFwZSIvPgogICAgICAgICAgICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIxNTAiIHJlc3VsdD0iZWZmZWN0MV9mb3JlZ3JvdW5kQmx1cl8zNjJfODAxNyIvPgogICAgICAgIDwvZmlsdGVyPgogICAgICAgIDxmaWx0ZXIgaWQ9ImZpbHRlcjFfZl8zNjJfODAxNyIgeD0iLTc0Ni45NTciIHk9IjI2NC4xNjciIHdpZHRoPSIxMjAzLjgxIiBoZWlnaHQ9IjEyNTIuNjkiCiAgICAgICAgICAgICAgICBmaWx0ZXJVbml0cz0idXNlclNwYWNlT25Vc2UiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgICAgICAgICAgIDxmZUZsb29kIGZsb29kLW9wYWNpdHk9IjAiIHJlc3VsdD0iQmFja2dyb3VuZEltYWdlRml4Ii8+CiAgICAgICAgICAgIDxmZUJsZW5kIG1vZGU9Im5vcm1hbCIgaW49IlNvdXJjZUdyYXBoaWMiIGluMj0iQmFja2dyb3VuZEltYWdlRml4IiByZXN1bHQ9InNoYXBlIi8+CiAgICAgICAgICAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjE1MCIgcmVzdWx0PSJlZmZlY3QxX2ZvcmVncm91bmRCbHVyXzM2Ml84MDE3Ii8+CiAgICAgICAgPC9maWx0ZXI+CiAgICAgICAgPGZpbHRlciBpZD0iZmlsdGVyMl9mXzM2Ml84MDE3IiB4PSItMjEuMDExNyIgeT0iLTk0OC4yNzEiIHdpZHRoPSIyMjk4LjYxIiBoZWlnaHQ9IjIxODkuNjQiCiAgICAgICAgICAgICAgICBmaWx0ZXJVbml0cz0idXNlclNwYWNlT25Vc2UiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgICAgICAgICAgIDxmZUZsb29kIGZsb29kLW9wYWNpdHk9IjAiIHJlc3VsdD0iQmFja2dyb3VuZEltYWdlRml4Ii8+CiAgICAgICAgICAgIDxmZUJsZW5kIG1vZGU9Im5vcm1hbCIgaW49IlNvdXJjZUdyYXBoaWMiIGluMj0iQmFja2dyb3VuZEltYWdlRml4IiByZXN1bHQ9InNoYXBlIi8+CiAgICAgICAgICAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjMwMCIgcmVzdWx0PSJlZmZlY3QxX2ZvcmVncm91bmRCbHVyXzM2Ml84MDE3Ii8+CiAgICAgICAgPC9maWx0ZXI+CiAgICAgICAgPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDBfbGluZWFyXzM2Ml84MDE3IiB4MT0iMzUyIiB5MT0iMCIgeDI9IjM1MiIgeTI9IjcwNCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjMDA0QkZGIi8+CiAgICAgICAgICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzRDRUFBQyIvPgogICAgICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICAgICAgPGNsaXBQYXRoIGlkPSJjbGlwMF8zNjJfODAxNyI+CiAgICAgICAgICAgIDxyZWN0IHdpZHRoPSI3MDQiIGhlaWdodD0iNzA0IiByeD0iMTYiIGZpbGw9IndoaXRlIi8+CiAgICAgICAgPC9jbGlwUGF0aD4KICAgICAgICA8Y2xpcFBhdGggaWQ9ImNsaXAxXzM2Ml84MDE3Ij4KICAgICAgICAgICAgPHJlY3Qgd2lkdGg9IjE4NDcuMDkiIGhlaWdodD0iMTI2MC43OSIgZmlsbD0id2hpdGUiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC01MjkgMTc2LjkzNykgcm90YXRlKC0yMy4yOCkiLz4KICAgICAgICA8L2NsaXBQYXRoPgogICAgICAgIDxjbGlwUGF0aCBpZD0iY2xpcDJfMzYyXzgwMTciPgogICAgICAgICAgICA8cmVjdCB3aWR0aD0iMzIwIiBoZWlnaHQ9IjQ4MCIgZmlsbD0id2hpdGUiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE5MiAxMjgpIi8+CiAgICAgICAgPC9jbGlwUGF0aD4KICAgIDwvZGVmcz4KPC9zdmc+Cg=='; diff --git a/packages/core/src/config/logos/generated/subwalletWallet.ts b/packages/core/src/config/logos/generated/subwalletWallet.ts new file mode 100644 index 0000000..f30e045 --- /dev/null +++ b/packages/core/src/config/logos/generated/subwalletWallet.ts @@ -0,0 +1,6 @@ +// Copyright 2025 Luno contributors +// SPDX-License-Identifier: MIT + +// Do not edit. Auto-generated via node scripts/convertLogos.mjs + +export const subwalletWallet = 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNzA0IiBoZWlnaHQ9IjcwNCIgdmlld0JveD0iMCAwIDcwNCA3MDQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiAgICA8ZyBjbGlwLXBhdGg9InVybCgjY2xpcDBfMzYyXzgwMTcpIj4KICAgICAgICA8bWFzayBpZD0ibWFzazBfMzYyXzgwMTciIHN0eWxlPSJtYXNrLXR5cGU6YWxwaGEiIG1hc2tVbml0cz0idXNlclNwYWNlT25Vc2UiIHg9IjAiIHk9IjAiIHdpZHRoPSI3MDQiCiAgICAgICAgICAgICAgaGVpZ2h0PSI3MDQiPgogICAgICAgICAgICA8cmVjdCB3aWR0aD0iNzA0IiBoZWlnaHQ9IjcwNCIgcng9IjQ4IiBmaWxsPSJ1cmwoI3BhaW50MF9saW5lYXJfMzYyXzgwMTcpIi8+CiAgICAgICAgPC9tYXNrPgogICAgICAgIDxnIG1hc2s9InVybCgjbWFzazBfMzYyXzgwMTcpIj4KICAgICAgICAgICAgPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAxXzM2Ml84MDE3KSI+CiAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD0iMTg0Ny4wOSIgaGVpZ2h0PSIxMjYwLjc5IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtNTI5IDE3Ni45MzcpIHJvdGF0ZSgtMjMuMjgpIgogICAgICAgICAgICAgICAgICAgICAgZmlsbD0iIzBDMEMwQyIvPgogICAgICAgICAgICAgICAgPGcgb3BhY2l0eT0iMC41IiBmaWx0ZXI9InVybCgjZmlsdGVyMF9mXzM2Ml84MDE3KSI+CiAgICAgICAgICAgICAgICAgICAgPGVsbGlwc2UgY3g9IjI5MC40NjQiIGN5PSIyMjQuNzUxIiByeD0iMjkwLjQ2NCIgcnk9IjIyNC43NTEiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC41NzEyMzggMC44MjA3ODUgMC43MjIxOTEgLTAuNjkxNjk0IC03MS45NDk3IDY1MS4wMjEpIiBmaWxsPSIjNzMxMTQwIi8+CiAgICAgICAgICAgICAgICA8L2c+CiAgICAgICAgICAgICAgICA8ZyBvcGFjaXR5PSIwLjciIGZpbHRlcj0idXJsKCNmaWx0ZXIxX2ZfMzYyXzgwMTcpIj4KICAgICAgICAgICAgICAgICAgICA8ZWxsaXBzZSBjeD0iMzIxLjY2NSIgY3k9IjMwNi44MjEiIHJ4PSIzMjEuNjY1IiByeT0iMzA2LjgyMSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjgwMjIyOCAtMC41OTcwMTggLTAuNTEwNDgzIC0wLjg1OTg4OCAtMjQ2LjQ3MiAxMzQ2LjM5KSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPSIjMDA0QkZGIi8+CiAgICAgICAgICAgICAgICA8L2c+CiAgICAgICAgICAgICAgICA8ZyBvcGFjaXR5PSIwLjciIGZpbHRlcj0idXJsKCNmaWx0ZXIyX2ZfMzYyXzgwMTcpIj4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNOTk5LjU1NiAtMTkzLjU4MkM4NTUuMTkgLTE2NS4yNzkgNzgyLjM5MyAtMjg5LjM2NSA2NjYuMTMyIC0xOTYuNzNDMzk2Ljk4IDE3LjcyNTUgODA2LjAxNiA1NzAuMjU0IDExNTAuMzEgNjE0LjgyNEMxMzU3LjQ3IDY0MS42NDEgMTM4OC40NyA2ODcuNDQ0IDE1MTYuMTQgNTE4LjUyNUMxNjQwLjcxIDM1My43MjEgMTY3MC4yNCAyNTAuNDU5IDE2NzcuMzYgMjkuMzkwNUMxNjc5Ljk1IC01MC45ODcgMTY2MS42NyAtMTg5LjkyNSAxNjAwLjcyIC0yNjQuODM5QzE1MzEuMjEgLTM1MC4yNzkgMTQ0My40NyAtMzYxLjQ0MiAxMzQ3LjE4IC0zMzYuNzkyQzEyNDguMDUgLTMxMS40MTYgMTE3OC43MiAtMjI4LjcwOCA5OTkuNTU2IC0xOTMuNTgyWiIKICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPSIjMUU5Qjc2Ii8+CiAgICAgICAgICAgICAgICA8L2c+CiAgICAgICAgICAgIDwvZz4KICAgICAgICA8L2c+CiAgICAgICAgPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAyXzM2Ml84MDE3KSI+CiAgICAgICAgICAgIDxwYXRoIGQ9Ik01MTIgMzAxLjU5OVYyMzQuOTlMMjQ1LjI4NiAxMjhMMTkyIDE1NS4wNkwxOTIuMjgxIDM2Mi4zOEwzOTEuODI0IDQ0Mi43MjdMMjg1LjI1MSA0ODguMTA0VjQ1My4wMTNMMjM2LjMyNCA0MzMuMTUyTDE5Mi4yODEgNDUzLjk2N0wxOTIuMjgxIDU4MC45NEwyNDUuMzMzIDYwOEw1MTIgNDg3LjY4OFY0MDIuMzQ1TDI3MiAzMDYuMjgzVjI0OEw0NjIuNDE3IDMyNC4wOEw1MTIgMzAxLjU5OVoiCiAgICAgICAgICAgICAgICAgIGZpbGw9IndoaXRlIi8+CiAgICAgICAgPC9nPgogICAgPC9nPgogICAgPGRlZnM+CiAgICAgICAgPGZpbHRlciBpZD0iZmlsdGVyMF9mXzM2Ml84MDE3IiB4PSItMjc1LjgyNSIgeT0iMTQ5LjMyMiIgd2lkdGg9IjEwNjQuMjMiIGhlaWdodD0iMTE2OS4zIgogICAgICAgICAgICAgICAgZmlsdGVyVW5pdHM9InVzZXJTcGFjZU9uVXNlIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICAgICAgICAgICA8ZmVGbG9vZCBmbG9vZC1vcGFjaXR5PSIwIiByZXN1bHQ9IkJhY2tncm91bmRJbWFnZUZpeCIvPgogICAgICAgICAgICA8ZmVCbGVuZCBtb2RlPSJub3JtYWwiIGluPSJTb3VyY2VHcmFwaGljIiBpbjI9IkJhY2tncm91bmRJbWFnZUZpeCIgcmVzdWx0PSJzaGFwZSIvPgogICAgICAgICAgICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIxNTAiIHJlc3VsdD0iZWZmZWN0MV9mb3JlZ3JvdW5kQmx1cl8zNjJfODAxNyIvPgogICAgICAgIDwvZmlsdGVyPgogICAgICAgIDxmaWx0ZXIgaWQ9ImZpbHRlcjFfZl8zNjJfODAxNyIgeD0iLTc0Ni45NTciIHk9IjI2NC4xNjciIHdpZHRoPSIxMjAzLjgxIiBoZWlnaHQ9IjEyNTIuNjkiCiAgICAgICAgICAgICAgICBmaWx0ZXJVbml0cz0idXNlclNwYWNlT25Vc2UiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgICAgICAgICAgIDxmZUZsb29kIGZsb29kLW9wYWNpdHk9IjAiIHJlc3VsdD0iQmFja2dyb3VuZEltYWdlRml4Ii8+CiAgICAgICAgICAgIDxmZUJsZW5kIG1vZGU9Im5vcm1hbCIgaW49IlNvdXJjZUdyYXBoaWMiIGluMj0iQmFja2dyb3VuZEltYWdlRml4IiByZXN1bHQ9InNoYXBlIi8+CiAgICAgICAgICAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjE1MCIgcmVzdWx0PSJlZmZlY3QxX2ZvcmVncm91bmRCbHVyXzM2Ml84MDE3Ii8+CiAgICAgICAgPC9maWx0ZXI+CiAgICAgICAgPGZpbHRlciBpZD0iZmlsdGVyMl9mXzM2Ml84MDE3IiB4PSItMjEuMDExNyIgeT0iLTk0OC4yNzEiIHdpZHRoPSIyMjk4LjYxIiBoZWlnaHQ9IjIxODkuNjQiCiAgICAgICAgICAgICAgICBmaWx0ZXJVbml0cz0idXNlclNwYWNlT25Vc2UiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgICAgICAgICAgIDxmZUZsb29kIGZsb29kLW9wYWNpdHk9IjAiIHJlc3VsdD0iQmFja2dyb3VuZEltYWdlRml4Ii8+CiAgICAgICAgICAgIDxmZUJsZW5kIG1vZGU9Im5vcm1hbCIgaW49IlNvdXJjZUdyYXBoaWMiIGluMj0iQmFja2dyb3VuZEltYWdlRml4IiByZXN1bHQ9InNoYXBlIi8+CiAgICAgICAgICAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjMwMCIgcmVzdWx0PSJlZmZlY3QxX2ZvcmVncm91bmRCbHVyXzM2Ml84MDE3Ii8+CiAgICAgICAgPC9maWx0ZXI+CiAgICAgICAgPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDBfbGluZWFyXzM2Ml84MDE3IiB4MT0iMzUyIiB5MT0iMCIgeDI9IjM1MiIgeTI9IjcwNCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjMDA0QkZGIi8+CiAgICAgICAgICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzRDRUFBQyIvPgogICAgICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICAgICAgPGNsaXBQYXRoIGlkPSJjbGlwMF8zNjJfODAxNyI+CiAgICAgICAgICAgIDxyZWN0IHdpZHRoPSI3MDQiIGhlaWdodD0iNzA0IiByeD0iMTYiIGZpbGw9IndoaXRlIi8+CiAgICAgICAgPC9jbGlwUGF0aD4KICAgICAgICA8Y2xpcFBhdGggaWQ9ImNsaXAxXzM2Ml84MDE3Ij4KICAgICAgICAgICAgPHJlY3Qgd2lkdGg9IjE4NDcuMDkiIGhlaWdodD0iMTI2MC43OSIgZmlsbD0id2hpdGUiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC01MjkgMTc2LjkzNykgcm90YXRlKC0yMy4yOCkiLz4KICAgICAgICA8L2NsaXBQYXRoPgogICAgICAgIDxjbGlwUGF0aCBpZD0iY2xpcDJfMzYyXzgwMTciPgogICAgICAgICAgICA8cmVjdCB3aWR0aD0iMzIwIiBoZWlnaHQ9IjQ4MCIgZmlsbD0id2hpdGUiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE5MiAxMjgpIi8+CiAgICAgICAgPC9jbGlwUGF0aD4KICAgIDwvZGVmcz4KPC9zdmc+Cg=='; diff --git a/packages/core/src/config/logos/generated/talismanSVG.ts b/packages/core/src/config/logos/generated/talismanSVG.ts deleted file mode 100644 index ffe2b09..0000000 --- a/packages/core/src/config/logos/generated/talismanSVG.ts +++ /dev/null @@ -1,6 +0,0 @@ -// Copyright 2025 Luno contributors -// SPDX-License-Identifier: MIT - -// Do not edit. Auto-generated via node scripts/convertLogos.mjs - -export const talismanSVG = 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMjgiIGhlaWdodD0iMTI4IiB2aWV3Qm94PSIwIDAgMTI4IDEyOCI+CiAgICA8cGF0aCBmaWxsPSIjZGRmZTc2IiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0wIDcwLjI1YzAgMjEuMjU1IDAgMzEuODgzIDQuNDYzIDM5Ljg1MmEzNSAzNSAwIDAgMCAxMy40MzUgMTMuNDM1QzI1Ljg2NyAxMjggMzYuNDk1IDEyOCA1Ny43NSAxMjhoMTIuNWMyMS4yNTUgMCAzMS44ODMgMCAzOS44NTItNC40NjNhMzUgMzUgMCAwIDAgMTMuNDM1LTEzLjQzNUMxMjggMTAyLjEzMyAxMjggOTEuNTA1IDEyOCA3MC4yNXYtMTIuNWMwLTIxLjI1NSAwLTMxLjg4My00LjQ2My0zOS44NTJhMzUgMzUgMCAwIDAtMTMuNDM1LTEzLjQzNUMxMDIuMTMzIDAgOTEuNTA1IDAgNzAuMjUgMGgtMTIuNUMzNi40OTUgMCAyNS44NjcgMCAxNy44OTggNC40NjNBMzUgMzUgMCAwIDAgNC40NjMgMTcuODk4QzAgMjUuODY3IDAgMzYuNDk1IDAgNTcuNzVaIi8+CiAgICA8cGF0aCBmaWxsPSIjZWE1NzUwIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Im0zMy44NzkgMzUuMTE3LS41IDE5LjE2NWM4LjEwNyA0LjE2OCAxNS43NSA0LjA3NSAyNC43NCAyLjA2MyAzLjU2LTEuMzk3IDYuMDU2LTEuNzAyIDkuNTExIDAgOS4wNjcgMi44MTYgMTYuOTY5IDEuOTUgMjUuMTg1LTIuMjQzbC0uNDg1LTE5LjE4N2MwLTEwLjgwNS03LjAwNC0xNC45NjItMTQuNjMyLTEyLjczOS0uNzc5LjIzMi0xLjk0NCAxLjI3NC0xLjk0NCAyLjIwN2wtLjE4MSAxOC43MzNhMS43NyAxLjc3IDAgMSAxLTMuNTM4LS4wMTVWMjAuMDY3YTguODM4IDguODM4IDAgMCAwLTE3LjY3NSAwVjQzLjFhMS43NyAxLjc3IDAgMSAxLTMuNTM4LjAxNWwtLjE3Ni0xOC43NDNjMC0uOTIzLTEuMTA5LTEuOTYtMS44ODItMi4xOTItOC44LTIuNjEtMTQuODggMi41MzgtMTQuODggMTIuOTM2Wm0yLjQ3NSAyMy44NDNhNDguNDMgNDguNDMgMCAwIDEtNS4yMDktMi4yNTRjLTQuNzMtMi4yNjktMTIuMDk1LTEuNTYyLTE3LjA3MiA0LjExMS0yLjI3NCAyLjYtLjUxNSA2LjM2IDIuNzcgNy40NDggMS41ODMuNTI2IDMuMDE3IDEuNDEzIDQuMzUzIDIuNDA4bC40NjQuMzM2YzQuMTMyIDIuOTY1IDYuNzkzIDcuNDA2IDcuMDU2IDEyLjQ4NmwuMjUzIDQuODEyYTMxLjYxNiAzMS42MTYgMCAwIDAgMTkuNDI4IDI1Ljk1OSAzOC41OSAzOC41OSAwIDAgMCAyOS4zMjcgMCAzMS42MTYgMzEuNjE2IDAgMCAwIDE5LjQyOS0yNS45NTljLjA0Ni0uODI1LjA2MS0xLjY1LjA1MS0yLjQ2NWwuMTI0LTIuMzQ3Yy4yNjMtNS4wOCAyLjkyNC05LjUyIDcuMDU2LTEyLjQ4NmwuNDY0LS4zMzZjMS4zNC0uOTk1IDIuNzctMS44ODIgNC4zNTMtMi40MDggMy4yODUtMS4wODkgNS4wNS00Ljg0OSAyLjc3LTcuNDQ4LTQuOTc4LTUuNjczLTEyLjM0My02LjM3NS0xNy4wNzItNC4xMS0xLjcxOC44MjUtMy40MzUgMS42NS01LjIxIDIuMjUzbC0zLjYyIDEuMjM4LS4wMS4wNDFjLTYuNjU0IDEuODQyLTEyLjEyIDEuODQ3LTE4LjM5OC0uNzQyLTMuMTc3LTEuMzEtNi4zOC0xLjU1OC05LjQ4IDAtNS45NjcgMS44NTYtMTIuMDQ4IDIuNjQtMTguMjA2LjcwMWwtMy42MjYtMS4yMzhabTI2LjY2NSA0NC43MzJjMTMuMzkgMCAyNC4yNDEtMTUuNTk2IDI0LjI0MS0xNS41OTZTNzYuNDEgNzIuNDk5IDYzLjAyIDcyLjQ5OWMtMTMuMzg1IDAtMjQuMjM2IDE1LjU5Ny0yNC4yMzYgMTUuNTk3czEwLjg1MSAxNS41OTYgMjQuMjQgMTUuNTk2Wm0xMC44ODMtMTUuNTk2YzAgNi4wMS00Ljg3MiAxMC44ODItMTAuODgzIDEwLjg4Mi02LjAxIDAtMTAuODgyLTQuODcyLTEwLjg4Mi0xMC44ODJzNC44NzItMTAuODgzIDEwLjg4Mi0xMC44ODMgMTAuODgzIDQuODcyIDEwLjg4MyAxMC44ODNabS0xMC44ODMgNC45MzZhNC45MzYgNC45MzYgMCAxIDAgMC05Ljg3MiA0LjkzNiA0LjkzNiAwIDAgMCAwIDkuODcyWiIvPgo8L3N2Zz4K'; diff --git a/packages/core/src/config/logos/generated/talismanWallet.ts b/packages/core/src/config/logos/generated/talismanWallet.ts new file mode 100644 index 0000000..a2587e2 --- /dev/null +++ b/packages/core/src/config/logos/generated/talismanWallet.ts @@ -0,0 +1,6 @@ +// Copyright 2025 Luno contributors +// SPDX-License-Identifier: MIT + +// Do not edit. Auto-generated via node scripts/convertLogos.mjs + +export const talismanWallet = 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMjgiIGhlaWdodD0iMTI4IiB2aWV3Qm94PSIwIDAgMTI4IDEyOCI+CiAgICA8cGF0aCBmaWxsPSIjZGRmZTc2IiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0wIDcwLjI1YzAgMjEuMjU1IDAgMzEuODgzIDQuNDYzIDM5Ljg1MmEzNSAzNSAwIDAgMCAxMy40MzUgMTMuNDM1QzI1Ljg2NyAxMjggMzYuNDk1IDEyOCA1Ny43NSAxMjhoMTIuNWMyMS4yNTUgMCAzMS44ODMgMCAzOS44NTItNC40NjNhMzUgMzUgMCAwIDAgMTMuNDM1LTEzLjQzNUMxMjggMTAyLjEzMyAxMjggOTEuNTA1IDEyOCA3MC4yNXYtMTIuNWMwLTIxLjI1NSAwLTMxLjg4My00LjQ2My0zOS44NTJhMzUgMzUgMCAwIDAtMTMuNDM1LTEzLjQzNUMxMDIuMTMzIDAgOTEuNTA1IDAgNzAuMjUgMGgtMTIuNUMzNi40OTUgMCAyNS44NjcgMCAxNy44OTggNC40NjNBMzUgMzUgMCAwIDAgNC40NjMgMTcuODk4QzAgMjUuODY3IDAgMzYuNDk1IDAgNTcuNzVaIi8+CiAgICA8cGF0aCBmaWxsPSIjZWE1NzUwIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Im0zMy44NzkgMzUuMTE3LS41IDE5LjE2NWM4LjEwNyA0LjE2OCAxNS43NSA0LjA3NSAyNC43NCAyLjA2MyAzLjU2LTEuMzk3IDYuMDU2LTEuNzAyIDkuNTExIDAgOS4wNjcgMi44MTYgMTYuOTY5IDEuOTUgMjUuMTg1LTIuMjQzbC0uNDg1LTE5LjE4N2MwLTEwLjgwNS03LjAwNC0xNC45NjItMTQuNjMyLTEyLjczOS0uNzc5LjIzMi0xLjk0NCAxLjI3NC0xLjk0NCAyLjIwN2wtLjE4MSAxOC43MzNhMS43NyAxLjc3IDAgMSAxLTMuNTM4LS4wMTVWMjAuMDY3YTguODM4IDguODM4IDAgMCAwLTE3LjY3NSAwVjQzLjFhMS43NyAxLjc3IDAgMSAxLTMuNTM4LjAxNWwtLjE3Ni0xOC43NDNjMC0uOTIzLTEuMTA5LTEuOTYtMS44ODItMi4xOTItOC44LTIuNjEtMTQuODggMi41MzgtMTQuODggMTIuOTM2Wm0yLjQ3NSAyMy44NDNhNDguNDMgNDguNDMgMCAwIDEtNS4yMDktMi4yNTRjLTQuNzMtMi4yNjktMTIuMDk1LTEuNTYyLTE3LjA3MiA0LjExMS0yLjI3NCAyLjYtLjUxNSA2LjM2IDIuNzcgNy40NDggMS41ODMuNTI2IDMuMDE3IDEuNDEzIDQuMzUzIDIuNDA4bC40NjQuMzM2YzQuMTMyIDIuOTY1IDYuNzkzIDcuNDA2IDcuMDU2IDEyLjQ4NmwuMjUzIDQuODEyYTMxLjYxNiAzMS42MTYgMCAwIDAgMTkuNDI4IDI1Ljk1OSAzOC41OSAzOC41OSAwIDAgMCAyOS4zMjcgMCAzMS42MTYgMzEuNjE2IDAgMCAwIDE5LjQyOS0yNS45NTljLjA0Ni0uODI1LjA2MS0xLjY1LjA1MS0yLjQ2NWwuMTI0LTIuMzQ3Yy4yNjMtNS4wOCAyLjkyNC05LjUyIDcuMDU2LTEyLjQ4NmwuNDY0LS4zMzZjMS4zNC0uOTk1IDIuNzctMS44ODIgNC4zNTMtMi40MDggMy4yODUtMS4wODkgNS4wNS00Ljg0OSAyLjc3LTcuNDQ4LTQuOTc4LTUuNjczLTEyLjM0My02LjM3NS0xNy4wNzItNC4xMS0xLjcxOC44MjUtMy40MzUgMS42NS01LjIxIDIuMjUzbC0zLjYyIDEuMjM4LS4wMS4wNDFjLTYuNjU0IDEuODQyLTEyLjEyIDEuODQ3LTE4LjM5OC0uNzQyLTMuMTc3LTEuMzEtNi4zOC0xLjU1OC05LjQ4IDAtNS45NjcgMS44NTYtMTIuMDQ4IDIuNjQtMTguMjA2LjcwMWwtMy42MjYtMS4yMzhabTI2LjY2NSA0NC43MzJjMTMuMzkgMCAyNC4yNDEtMTUuNTk2IDI0LjI0MS0xNS41OTZTNzYuNDEgNzIuNDk5IDYzLjAyIDcyLjQ5OWMtMTMuMzg1IDAtMjQuMjM2IDE1LjU5Ny0yNC4yMzYgMTUuNTk3czEwLjg1MSAxNS41OTYgMjQuMjQgMTUuNTk2Wm0xMC44ODMtMTUuNTk2YzAgNi4wMS00Ljg3MiAxMC44ODItMTAuODgzIDEwLjg4Mi02LjAxIDAtMTAuODgyLTQuODcyLTEwLjg4Mi0xMC44ODJzNC44NzItMTAuODgzIDEwLjg4Mi0xMC44ODMgMTAuODgzIDQuODcyIDEwLjg4MyAxMC44ODNabS0xMC44ODMgNC45MzZhNC45MzYgNC45MzYgMCAxIDAgMC05Ljg3MiA0LjkzNiA0LjkzNiAwIDAgMCAwIDkuODcyWiIvPgo8L3N2Zz4K'; diff --git a/packages/core/src/config/logos/generated/walletconnectSVG.ts b/packages/core/src/config/logos/generated/walletconnectSVG.ts deleted file mode 100644 index 90d75f3..0000000 --- a/packages/core/src/config/logos/generated/walletconnectSVG.ts +++ /dev/null @@ -1,6 +0,0 @@ -// Copyright 2025 Luno contributors -// SPDX-License-Identifier: MIT - -// Do not edit. Auto-generated via node scripts/convertLogos.mjs - -export const walletconnectSVG = 'data:image/svg+xml;base64,PHN2ZyBmaWxsPSJub25lIiBoZWlnaHQ9IjQwMCIgdmlld0JveD0iMCAwIDQwMCA0MDAiIHdpZHRoPSI0MDAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgICB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8Y2xpcFBhdGggaWQ9ImEiPgogICAgICAgIDxwYXRoIGQ9Im0wIDBoNDAwdjQwMGgtNDAweiIvPgogICAgPC9jbGlwUGF0aD4KICAgIDxnIGNsaXAtcGF0aD0idXJsKCNhKSI+CiAgICAgICAgPGNpcmNsZSBjeD0iMjAwIiBjeT0iMjAwIiBmaWxsPSIjMzM5NmZmIiByPSIxOTkuNSIgc3Ryb2tlPSIjNjZiMWZmIi8+CiAgICAgICAgPHBhdGggZD0ibTEyMi41MTkgMTQ4Ljk2NWM0Mi43OTEtNDEuNzI5IDExMi4xNzEtNDEuNzI5IDE1NC45NjIgMGw1LjE1IDUuMDIyYzIuMTQgMi4wODYgMi4xNCA1LjQ2OSAwIDcuNTU1bC0xNy42MTcgMTcuMThjLTEuMDcgMS4wNDMtMi44MDQgMS4wNDMtMy44NzQgMGwtNy4wODctNi45MTFjLTI5Ljg1My0yOS4xMTEtNzguMjUzLTI5LjExMS0xMDguMTA2IDBsLTcuNTkgNy40MDFjLTEuMDcgMS4wNDMtMi44MDQgMS4wNDMtMy44NzQgMGwtMTcuNjE3LTE3LjE4Yy0yLjE0LTIuMDg2LTIuMTQtNS40NjkgMC03LjU1NXptMTkxLjM5NyAzNS41MjkgMTUuNjc5IDE1LjI5YzIuMTQgMi4wODYgMi4xNCA1LjQ2OSAwIDcuNTU1bC03MC43IDY4Ljk0NGMtMi4xMzkgMi4wODctNS42MDggMi4wODctNy43NDggMGwtNTAuMTc4LTQ4LjkzMWMtLjUzNS0uNTIyLTEuNDAyLS41MjItMS45MzcgMGwtNTAuMTc4IDQ4LjkzMWMtMi4xMzkgMi4wODctNS42MDggMi4wODctNy43NDggMGwtNzAuNzAxNS02OC45NDVjLTIuMTM5Ni0yLjA4Ni0yLjEzOTYtNS40NjkgMC03LjU1NWwxNS42Nzk1LTE1LjI5YzIuMTM5Ni0yLjA4NiA1LjYwODUtMi4wODYgNy43NDgxIDBsNTAuMTc4OSA0OC45MzJjLjUzNS41MjIgMS40MDIuNTIyIDEuOTM3IDBsNTAuMTc3LTQ4LjkzMmMyLjEzOS0yLjA4NyA1LjYwOC0yLjA4NyA3Ljc0OCAwbDUwLjE3OSA0OC45MzJjLjUzNS41MjIgMS40MDIuNTIyIDEuOTM3IDBsNTAuMTc5LTQ4LjkzMWMyLjEzOS0yLjA4NyA1LjYwOC0yLjA4NyA3Ljc0OCAweiIKICAgICAgICAgICAgICBmaWxsPSIjZmZmIi8+CiAgICA8L2c+Cjwvc3ZnPgo='; diff --git a/packages/core/src/config/logos/generated/walletconnectWallet.ts b/packages/core/src/config/logos/generated/walletconnectWallet.ts new file mode 100644 index 0000000..137eba7 --- /dev/null +++ b/packages/core/src/config/logos/generated/walletconnectWallet.ts @@ -0,0 +1,6 @@ +// Copyright 2025 Luno contributors +// SPDX-License-Identifier: MIT + +// Do not edit. Auto-generated via node scripts/convertLogos.mjs + +export const walletconnectWallet = 'data:image/svg+xml;base64,PHN2ZyBmaWxsPSJub25lIiBoZWlnaHQ9IjQwMCIgdmlld0JveD0iMCAwIDQwMCA0MDAiIHdpZHRoPSI0MDAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgICB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8Y2xpcFBhdGggaWQ9ImEiPgogICAgICAgIDxwYXRoIGQ9Im0wIDBoNDAwdjQwMGgtNDAweiIvPgogICAgPC9jbGlwUGF0aD4KICAgIDxnIGNsaXAtcGF0aD0idXJsKCNhKSI+CiAgICAgICAgPGNpcmNsZSBjeD0iMjAwIiBjeT0iMjAwIiBmaWxsPSIjMzM5NmZmIiByPSIxOTkuNSIgc3Ryb2tlPSIjNjZiMWZmIi8+CiAgICAgICAgPHBhdGggZD0ibTEyMi41MTkgMTQ4Ljk2NWM0Mi43OTEtNDEuNzI5IDExMi4xNzEtNDEuNzI5IDE1NC45NjIgMGw1LjE1IDUuMDIyYzIuMTQgMi4wODYgMi4xNCA1LjQ2OSAwIDcuNTU1bC0xNy42MTcgMTcuMThjLTEuMDcgMS4wNDMtMi44MDQgMS4wNDMtMy44NzQgMGwtNy4wODctNi45MTFjLTI5Ljg1My0yOS4xMTEtNzguMjUzLTI5LjExMS0xMDguMTA2IDBsLTcuNTkgNy40MDFjLTEuMDcgMS4wNDMtMi44MDQgMS4wNDMtMy44NzQgMGwtMTcuNjE3LTE3LjE4Yy0yLjE0LTIuMDg2LTIuMTQtNS40NjkgMC03LjU1NXptMTkxLjM5NyAzNS41MjkgMTUuNjc5IDE1LjI5YzIuMTQgMi4wODYgMi4xNCA1LjQ2OSAwIDcuNTU1bC03MC43IDY4Ljk0NGMtMi4xMzkgMi4wODctNS42MDggMi4wODctNy43NDggMGwtNTAuMTc4LTQ4LjkzMWMtLjUzNS0uNTIyLTEuNDAyLS41MjItMS45MzcgMGwtNTAuMTc4IDQ4LjkzMWMtMi4xMzkgMi4wODctNS42MDggMi4wODctNy43NDggMGwtNzAuNzAxNS02OC45NDVjLTIuMTM5Ni0yLjA4Ni0yLjEzOTYtNS40NjkgMC03LjU1NWwxNS42Nzk1LTE1LjI5YzIuMTM5Ni0yLjA4NiA1LjYwODUtMi4wODYgNy43NDgxIDBsNTAuMTc4OSA0OC45MzJjLjUzNS41MjIgMS40MDIuNTIyIDEuOTM3IDBsNTAuMTc3LTQ4LjkzMmMyLjEzOS0yLjA4NyA1LjYwOC0yLjA4NyA3Ljc0OCAwbDUwLjE3OSA0OC45MzJjLjUzNS41MjIgMS40MDIuNTIyIDEuOTM3IDBsNTAuMTc5LTQ4LjkzMWMyLjEzOS0yLjA4NyA1LjYwOC0yLjA4NyA3Ljc0OCAweiIKICAgICAgICAgICAgICBmaWxsPSIjZmZmIi8+CiAgICA8L2c+Cjwvc3ZnPgo='; diff --git a/packages/core/src/config/logos/generated/westendChain.ts b/packages/core/src/config/logos/generated/westendChain.ts new file mode 100644 index 0000000..6e618da --- /dev/null +++ b/packages/core/src/config/logos/generated/westendChain.ts @@ -0,0 +1,6 @@ +// Copyright 2025 Luno contributors +// SPDX-License-Identifier: MIT + +// Do not edit. Auto-generated via node scripts/convertLogos.mjs + +export const westendChain = 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTY3MiIgaGVpZ2h0PSIxNjcyIiB2aWV3Qm94PSIwIDAgMTY3MiAxNjcyIiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8Y2lyY2xlIGN4PSI4MzYuMjc0IiBjeT0iODM2LjIxOSIgcj0iODM1LjQzNiIgZmlsbD0iI0U2MDA3QSIvPgo8bWFzayBpZD0ibWFzazAiIG1hc2stdHlwZT0iYWxwaGEiIG1hc2tVbml0cz0idXNlclNwYWNlT25Vc2UiIHg9IjAiIHk9IjAiIHdpZHRoPSIxNjcyIiBoZWlnaHQ9IjE2NzIiPgo8Y2lyY2xlIGN4PSI4MzYuMjc0IiBjeT0iODM2LjIxOSIgcj0iODM1LjQzNiIgZmlsbD0iI0M0QzRDNCIvPgo8L21hc2s+CjxnIG1hc2s9InVybCgjbWFzazApIj4KPHJlY3QgeD0iLTI5OS45MTkiIHk9Ii02Ni4wNTE4IiB3aWR0aD0iMjg0MC40OCIgaGVpZ2h0PSIxODcxLjM4IiBmaWxsPSJ1cmwoI3BhaW50MF9saW5lYXIpIi8+CjxwYXRoIGQ9Ik0tMzAuNjA2MiAtMjcwNC43OEM0LjYxMjU1IC0yMjgzLjY2IDE3Ny4xNDEgLTE4NzkuMSA0NTUuNzcyIC0xNTYyLjI2Qzc0MS41MzUgLTEyMzcuMzUgMTEzNy40MSAtMTAxOC41MSAxNTYxLjgyIC05NDAuNjQ1QzE3NzAuOTEgLTkwMi4xNTggMTk4OS4zNiAtODk0Ljk5OCAyMTk5LjMzIC05MzEuMjQ3QzIzOTkuMDUgLTk2NS43MDYgMjYwMC41NiAtMTA1Mi45NyAyNzEzLjM1IC0xMjMwLjY0QzI3NjMuNzMgLTEzMDkuNCAyNzk0LjQ5IC0xNDAyLjk0IDI3OTMuMTUgLTE0OTYuOTJDMjc5MS44MSAtMTU5Ny4xNiAyNzQ5LjQ2IC0xNjg3LjU2IDI2ODcuNDkgLTE3NjQuNTRDMjYxOC44NCAtMTg1MC4wMSAyNTMxLjAxIC0xOTIyLjUxIDI0NDQuMDggLTE5ODkuMTlDMjM1OC4wNCAtMjA1NC45OCAyMjY1LjMxIC0yMTEzLjE2IDIxNjQuMTEgLTIxNTIuOTlDMTkzOS40MiAtMjI0MC43IDE3MTYuMDcgLTIxOTEuOTIgMTUwMC43NSAtMjEwMS4wN0MxMjcyLjQ5IC0yMDA0Ljg2IDEwNTEuODIgLTE4OTEuMTkgODMwLjY5NyAtMTc4MC42NUMzNzguMjAxIC0xNTU0LjY1IC04NC4xMDMzIC0xMzMxLjMzIC01ODYuNTMgLTEyNDQuNTFDLTcxMi42OTQgLTEyMjIuNTkgLTg0MS4wODcgLTEyMTAuMDUgLTk2OS4wMzUgLTEyMDguNzFDLTEwODMuNjEgLTEyMDcuMzcgLTEyMDcuOTkgLTEyMDguMjYgLTEzMTguOTkgLTEyMzkuNTlDLTEzNjguMDMgLTEyNTMuNDYgLTE0MTguNDEgLTEyNzYuNzQgLTE0NDYuOTQgLTEzMjEuMDRDLTE0ODMuOTQgLTEzNzguMzIgLTE0NzEuMDIgLTE0NDkuOTMgLTE0NTQuOTcgLTE1MTEuNjlDLTE0MjcuNzcgLTE2MTQuNjIgLTEzNzYuNSAtMTcxMC4zOSAtMTMxMC4wOCAtMTc5My4xOEMtMTE3Mi43NyAtMTk2NC41OCAtOTc3Ljk1MSAtMjA3OC4yNSAtNzY4Ljg2NiAtMjEzNy43N0MtNjQ5LjM4OSAtMjE3MS43OCAtNTI1LjQ1NCAtMjE4OS4yNCAtNDAxLjUxOSAtMjE5NS45NUMtMjgyLjA0MiAtMjIwMi4yMSAtMTU0Ljk4NyAtMjIwNi42OSAtMzYuNDAxOSAtMjE4N0M3OS41MDg1IC0yMTY4LjIgMTU5Ljc1NCAtMjA5NS43IDE5OS40MzEgLTE5ODUuNjFDMjM5LjU1NCAtMTg3NS4wNyAyMzIuNDIxIC0xNzU3LjgyIDIyOC40MDkgLTE2NDIuMzZDMjIyLjYxNCAtMTQ2OS4xNyAyMzYuODc5IC0xMjIxLjY5IDQzMS4yNTIgLTExNTAuOThDNTMyLjAwNSAtMTExNC4yOCA2NTIuMzc0IC0xMTUyLjc3IDc1MC44OTcgLTExODEuNDFDODUzLjQzNCAtMTIxMS40IDk1My4yOTUgLTEyNTAuNzggMTA0OC43IC0xMjk4LjY2QzExNDcuMjIgLTEzNDguMzQgMTI0MC44NCAtMTQwNi45NiAxMzI4LjIyIC0xNDc0LjU0QzE0MDMuMTIgLTE1MzEuODIgMTQ5MC4wNSAtMTU5Ni4yNyAxNTQwLjQzIC0xNjc3LjcyQzE1NzYuMDkgLTE3MzUuNDUgMTU5Ni42IC0xODE0LjY2IDE1MzMuMjkgLTE4NjAuMzFDMTUyOS43MyAtMTg2Mi45OSAxNTIzLjQ4IC0xODYyLjU0IDE1MTkuOTIgLTE4NjAuMzFDMTMzNi42OSAtMTc0Ny45OCAxMjM1LjA1IC0xNTQ2LjE0IDExOTYuNzEgLTEzMzkuMzlDMTE2MS4wNCAtMTE0Ni41MSAxMTYxLjkzIC05MDguODcxIDEyOTAuNzcgLTc0OC4yMUMxMzk0LjIgLTYxOS4zMjMgMTU5Ny4wNCAtNTg0Ljg2NCAxNzI0Ljk5IC03MDEuMjJDMTc4Ni4wNyAtNzU2LjcxMyAxODA1LjI0IC04NDIuMTkgMTc3Ny4xNSAtOTE5LjYxMUMxNzQzLjcxIC0xMDExLjM1IDE2NTguMTIgLTEwNzYuMjQgMTU2NC45NCAtMTA5OC42MkMxNDQyLjM1IC0xMTI4LjE2IDEzMTMuMDYgLTEwOTUuMDQgMTE5Ny4xNSAtMTA1NC43NkMxMDg5LjcxIC0xMDE3LjE3IDk4Ni43MyAtOTY3Ljk0NCA4ODguMjA3IC05MTEuMTA5QzY4Mi42ODkgLTc5Mi41MTUgNDk2LjM0IC02NDQuMzg1IDMwNi40MjYgLTUwMi41MTlDMTEyLjQ5OSAtMzU3Ljk2OSAtODYuNzc4MyAtMjE3Ljg5NCAtMzEwLjU3NCAtMTIzLjQ2N0MtNTYxLjU2NSAtMTYuOTU2MSAtODM0Ljg0NiAzNi43NDY4IC0xMTA3LjY4IDMzLjE2NjdDLTEyMzAuNzIgMzEuMzc2NSAtMTM3MS4xNSAyOS4xMzg5IC0xNDgzLjk0IC0yNS45MDY1Qy0xNjA1LjIgLTg1LjQyNzIgLTE2NDIuNjUgLTIxMS42MjkgLTE2MTEuODkgLTMzNi45MzZDLTE1ODIuNDcgLTQ1Ni44NzIgLTE1MDkuMzYgLTU1OC40NiAtMTQyNy4zMyAtNjQ3LjUxN0MtMTM0NS43NCAtNzM2LjEyNyAtMTI1Mi41NyAtODEzLjk5NiAtMTE1Mi43MSAtODgxLjEyNEMtOTUzLjQzMSAtMTAxNC40OSAtNzI5LjYzNSAtMTEwNi4yMyAtNTAwLjQ4OSAtMTE3My44MUMtNDQyLjk4IC0xMTkwLjgxIC0zODUuMDI1IC0xMjA2LjAzIC0zMjcuMDY5IC0xMjE5LjlDLTI2NC42NTYgLTEyMzUuMTIgLTE5NS41NTYgLTEyNTcuNDkgLTEzMC45MTMgLTEyNTMuNDZDMTQuODY2MiAtMTI0NC4wNyAzNy4xNTcgLTEwNjguNjQgNjIuMTIyMyAtOTU1LjQxM0MxNzMuNTc0IC00NTUuNTI5IDIxNi44MTggNjcuMTc4NSA0MjguNTc3IDUzOC44NjhDNDU0Ljg4IDU5Ny45NDIgNDgzLjg1OCA2NTUuNjcyIDUxNS45NTYgNzExLjYxM0M1MzcuODAxIDc1MC4xIDU2NC41NDkgNzkxLjcxOSA2MTEuODA1IDc5OS4zMjdDNzE1LjIzMyA4MTQuOTkxIDc3OC4wOTIgNjgzLjQxOSA4MDguODUzIDYwNi40NDVDODQ5LjQyMSA1MDQuNDA5IDg4My43NDkgMzY4LjM2MiA4NTMuNDM0IDI1OS4xNjZDODI2LjY4NSAxNjMuODQ0IDczNy41MjMgMTI4LjQ4OSA2NDYuMTMyIDEzNi45OTJDNTMyLjAwNSAxNDcuNzMzIDQyNC4xMTkgMjA0LjEyMSAzMjAuNjkyIDI0OS4zMjFDMTkxLjQwNyAzMDUuNzA4IDYzLjQ1OTUgMzY2LjEyNCAtNjMuMTUwNCA0MjguMzNDLTMxNC41ODcgNTUxLjg0NyAtNTYyLjQ1NyA2ODIuNTI0IC04MTQuMzM5IDgwNi4wNEMtMTMxNi43NyAxMDU0LjQyIC0xODQ2LjM5IDEyNzYuODQgLTI0MDkgMTMzNi4zNkMtMjU0NC4wOCAxMzUwLjY4IC0yNjc5LjYgMTM1NS4xNSAtMjgxNS4xMyAxMzQ4LjQ0Qy0yODEwLjY3IDEzNTIuOTEgLTI4MDYuMjEgMTM1Ny4zOSAtMjgwMS43NiAxMzYxLjg2Qy0yNzk4LjE5IDExODcuMzMgLTI2NjUuMzQgMTA0NS4wMiAtMjUwNy41MiA5ODcuMjg3Qy0yMzMyLjMyIDkyMy4yOTIgLTIxMzkuNzMgOTcxLjYyNCAtMTk4My4yNSAxMDYyLjQ3Qy0xODE0LjI5IDExNjAuOTMgLTE2ODQuMTEgMTMwOS4wNiAtMTU2My43NCAxNDYxLjIxQy0xNDQ2LjUgMTYwOS43OSAtMTMzMi44MSAxNzYwLjYxIC0xMjAyLjE5IDE4OTguNDVDLTcyMC4yNzMgMjQwNS40OSAtODguMTE1NyAyNzY3LjU0IDU5My4wODEgMjkyMi4zOEM3NTAuMDA2IDI5NTguMTggOTI4LjMyOSAyOTkxLjc1IDEwNjUuNjQgMjg4NC4zNEMxMTY1LjUgMjgwNi4wMiAxMjEwLjUzIDI2NzkuMzggMTIyNy4wMiAyNTU3LjJDMTI0Ni4xOSAyNDEwLjg2IDEyMzAuMTQgMjI1NS41NyAxMTg1LjEyIDIxMTUuMDVDMTEzNS4xOCAxOTU5LjMxIDEwMjcuNzQgMTg0OS42NyA4NjAuMTIxIDE4MzcuMTRDNjc5LjEyMiAxODIzLjcxIDQ5Mi43NzQgMTg5NS4zMSAzMjAuNjkyIDE5NDAuOTZDMTA2LjI1NyAxOTk3LjggLTEwNy43MzEgMjA1NC42MyAtMzIyLjE2NSAyMTExLjQ3Qy01MzMuOTI1IDIxNjcuNDEgLTc0NS4yMzkgMjIyMy44IC05NTYuOTk4IDIyNzkuNzRDLTEwNjEuMzIgMjMwNy40OCAtMTE2Ni4wOCAyMzM1LjIzIC0xMjcwLjQgMjM2Mi45OEMtMTM3NC4yOCAyMzkwLjcyIC0xNDc4LjU5IDI0MjUuMTggLTE1ODQuMjUgMjQ0NC40M0MtMTY4NS45IDI0NjIuNzcgLTE3NjcuOTIgMjQxNS4zNCAtMTc3MS45NCAyMzA3LjkzQy0xNzc1LjA2IDIyMzAuNTEgLTE3NDcuNDIgMjE1My45OCAtMTcxMy45OCAyMDg1LjUxQy0xNjMzLjI5IDE5MjAuMzcgLTE1NDIuMzUgMTc2MC42MSAtMTQ0Mi4wNCAxNjA2LjY2Qy0xMjM2LjA3IDEyODkuODEgLTk5MC44NzkgOTk4LjQ3NiAtNzEzLjU4NiA3NDIuMDQ0Qy02NDYuMjY5IDY3OS44MzkgLTU3Ny4xNjggNjE5LjQyMyAtNTA2LjI4NCA1NjEuMjQ1Qy01MTIuNTI2IDU2MS4yNDUgLTUxOC43NjcgNTYxLjI0NSAtNTI1LjAwOSA1NjEuMjQ1Qy0zMDguNzkxIDcyOS41MTQgLTI4Ni45NDYgMTAzMC4yNSAtMjQzLjI1NyAxMjgwLjQyQy0yMTUuMTcxIDE0NDEuNTIgLTE3OS45NTIgMTYwMS43NCAtMTM4LjkzOCAxNzYwLjE2Qy0xMTcuOTg1IDE4NDAuNzIgLTk1LjI0ODUgMTkyMC44MiAtNzAuNzI5MiAyMDAwLjQ4Qy01MC42Njc3IDIwNjYuMjcgLTMzLjI4MSAyMTM2LjUzIC0yLjA3NDQ2IDIxOTcuODRDMTguODc4NyAyMjM4LjU2IDUwLjk3NzEgMjI3OS43NCA5OS4xMjQzIDIyODYuNDVDMTQ1LjkzNCAyMjkzLjE2IDE4NC43MTkgMjI2NC41MiAyMTIuMzYgMjIyOS4xN0MyNTIuOTI4IDIxNzYuMzYgMjc4LjM0IDIxMTAuNTcgMzA2LjQyNiAyMDUwLjZDMzM5Ljg2MSAxOTc5LjQ1IDM3MS45NTkgMTkwNy40IDQwMi4yNzUgMTgzNC45QzUyMS4zMDYgMTU1MC43MiA2MTYuNzA5IDEyNTYuMjUgNjg3LjE0NiA5NTYuNDA4Qzc2Ni41IDYxNi43MzggODEzLjc1NiAyNjkuNDU5IDgyOC40NjggLTc5LjYwOTRDODI4LjkxNCAtOTMuMDM1MiA4MTAuMTkgLTk3LjUxMDMgODAzLjUwMyAtODYuMzIyM0M2NDYuMTMyIDE4NC40MyA1NzMuMDIgNTAxLjI3NyA1OTkuMzIyIDgxMy42NDhDNjIxLjE2NyAxMDc1LjQ1IDcyNS4wNCAxMzUzLjgxIDk5NC43NTUgMTQ0Mi40MkMxMTI5LjM5IDE0ODYuNzIgMTI3Ni41MSAxNDgwLjkxIDE0MTQuNzEgMTQ1Ny42M0MxNTU4LjcgMTQzMy40NyAxNzAwLjAyIDEzOTAuOTUgMTgzMi44OCAxMzMwLjU0QzIwOTUuNDYgMTIxMS4wNSAyMzIyLjM4IDEwMTIuMzUgMjQ0Mi4zIDc0NS42MjVDMjQ5OC45MiA2MTkuODcgMjUzMS40NiA0ODIuNDggMjUyOS42OCAzNDQuMTk2QzI1MjguMzQgMjI0LjcwNyAyNTA2Ljk0IDgwLjYwNDIgMjQxMi40MyAtMy4wODI3NkMyMzA0LjEgLTk5LjMwMDMgMjE2MC41NSAtNDIuNDY0OCAyMDU5LjM1IDM0LjUwOTNDMTk1Mi4zNSAxMTUuOTU4IDE4NjIuNzUgMjE5Ljc4NCAxNzkyLjc1IDMzNC4zNUMxNDU3Ljk1IDg4MS4yMjQgMTU4MS40NCAxNTg2LjA3IDE3NjQuMjIgMjE2My44M0MxOTQ2LjU2IDI3MzkuMzQgMjI0Ny40OCAzMjc2LjgyIDI2NDMuOCAzNzMxLjVDMjY5Mi40IDM3ODcuNDQgMjc0Mi43NyAzODQyLjA0IDI3OTQuNDkgMzg5NS4zQzI4MDYuOTcgMzkwNy44MyAyODIzLjkxIDM4ODkuNDggMjgxMy4yMSAzODc2LjVDMjI3OS4xMyAzMTk2LjcxIDE3MDkuODMgMjU0NC42NyAxMTA3LjEgMTkyNC44NUM1MDguMzc3IDEzMDkuNSAtMTIyLjg4OSA3MjQuNTkxIC03ODIuNjg2IDE3NS4wMzJDLTEwOTkuNjYgLTg5LjAwNzMgLTE0MzAuODkgLTMzNi4wNDEgLTE3NDMuNDEgLTYwNS4wMDJDLTE4OTEuNDEgLTczMi41NDcgLTIwMzQuMDcgLTg2Ni44MDQgLTIxNjMuMzYgLTEwMTMuNTlDLTIyMzAuMjMgLTEwODkuNjcgLTIyOTMuNTMgLTExNjkuMzMgLTIzNTEuNDkgLTEyNTIuNTdDLTIzNzcuMzUgLTEyOTAuMTYgLTI0MDIuNzYgLTEzMjguMiAtMjQyNi4zOCAtMTM2Ny4xNEMtMjQzOC40MiAtMTM4Ni44MyAtMjQ1MC4wMSAtMTQwNi41MiAtMjQ2MS4xNiAtMTQyNi4yMUMtMjQ3OC4xIC0xNDU1Ljc0IC0yNDc3LjY1IC0xNDY5LjE3IC0yNDYyLjk0IC0xNDk5LjE1Qy0yMzgxLjggLTE2NjIuMDUgLTIxNTUuNzggLTE2OTIuNDkgLTE5OTUuNzMgLTE3MDguNkMtMTc4My41MyAtMTcyOS42MyAtMTU2OS41NCAtMTcxOC40NCAtMTM1OS41NiAtMTY4MS4zQy05MzYuMDQ1IC0xNjA2LjU2IC01MzUuMjYyIC0xNDM0LjcxIC0xNTcuNjYyIC0xMjMyLjg4QzU3OC44MTUgLTgzOS45NTIgMTI0Ni42NCAtMzEwLjk3OSAyMDQyLjQxIC0zNi4xOTk1QzIyMzEuNDMgMjkuMTM4OSAyNDI1LjggNzguODE0IDI2MjQuMTkgMTA1LjIxOEMyNzIzLjE2IDExOC42NDQgMjgyMi41NyAxMjYuMjUxIDI5MjIuNDMgMTI3LjU5NEMyOTYzLjg5IDEyOC4wNDIgMjk4NC40IDEzNi45OTIgMzAwNC45MSA5OS40MDAxQzMwMjQuOTcgNjIuNzAzMSAzMDM2LjEyIDIxLjUzMSAzMDM5LjI0IC0yMC41MzYxQzMwNTIuNjEgLTE4Ny4wMTUgMjk1Mi4zIC0zNDQuOTkxIDI4MjguODEgLTQ0Ny45MjFDMjcwNi42NiAtNTQ5LjUwOSAyNTUzLjc1IC02MDcuMjQgMjM5OC4xNiAtNjMwLjUxMUMyMDE4LjMzIC02ODYuODk5IDE2NjMuMDIgLTUzMi41MDMgMTMzNC4wMiAtMzU3Ljk2OUMxMjQyLjE4IC0zMDkuMTg5IDExNTEuMjMgLTI1OS4wNjYgMTA1OS40IC0yMTAuNzM0Qzk3Mi45MSAtMTY1LjA4NiA4MzguMjc2IC02Ni42MzExIDc0MC4xOTggLTEyNy45NDJDNjY3LjA4NSAtMTczLjU4OSA2NTAuMTQ0IC0yNzcuNDE1IDY0MC4zMzcgLTM1Ni4xNzlDNjI2LjA3MSAtNDcyLjA4OCA2MTcuMTU1IC01ODguODkxIDYwOS41NzYgLTcwNS4yNDhDNTc5LjcwNyAtMTE2OC44OCA1OTMuNTI3IC0xNjM1LjIgNjUxLjAzNiAtMjA5Ni4xNUM2NjUuNzQ4IC0yMjE2LjA5IDY4NC4wMjYgLTIzMzYuMDIgNzA0Ljk3OSAtMjQ1NS4wN0M3MjEuOTIgLTI1NTEuMjggNzMzLjUxMSAtMjY1NS4xMSA3NzMuNjM0IC0yNzQ1LjUxQzgxNC4yMDIgLTI4MzUuOTEgODk0Ljg5NCAtMjg5NC41MyA5OTYuMDkzIC0yODU4LjI4QzEwOTMuMjggLTI4MjMuMzggMTE2Ni4zOSAtMjczNC4zMiAxMjM0LjYgLTI2NjAuNDhDMTcyMS40MiAtMjEzMS45NSAyMDUwLjg4IC0xNDUzLjk1IDI2MzQuNDQgLTEwMTguMDdDMjc4Ny4zNSAtOTAzLjk0OCAyOTYzLjg5IC03OTAuNzI1IDMxNTYuMDQgLTc2NS4yMTZDMzMxMi45NiAtNzQ0LjE4MiAzNDkzLjk2IC03OTcuODg1IDM1NzcuNzcgLTk0Mi40MzVDMzYyNS45MiAtMTAyNS42NyAzNjI3LjcgLTExMjMuNjggMzYxNy40NSAtMTIxNi43N0MzNjA2LjMxIC0xMzE4LjggMzU4NS44IC0xNDIwLjM5IDM1NjMuMDYgLTE1MjAuNjRDMzUxNy4xNCAtMTcyMi4wMiAzNDUzLjM5IC0xOTE4LjkzIDMzNzMuMTUgLTIxMDguNjhDMzI5Mi4wMSAtMjI5OS43NyAzMTkzLjkzIC0yNDgzLjI2IDMwODAuMjUgLTI2NTYuOUMzMDc3LjEzIC0yNjYxLjgyIDMwNzAuODkgLTI2NjQuOTUgMzA2NS4wOSAtMjY2My4xNkMyNjg5LjcyIC0yNTMwLjI1IDI1NTYuODcgLTIxMTkuNDIgMjM2OC43NCAtMTgwNy41QzIyNjMuMDggLTE2MzIuMDcgMjEyMS4zMSAtMTQ1NC44NSAxOTI5LjYyIC0xMzcwLjcyQzE3MjcuNjcgLTEyODEuNjYgMTUxMSAtMTM0My44NiAxMzYxLjY2IC0xNTAwLjVDMTE2OS45NiAtMTcwMS44OCAxMTI3LjYxIC0xOTg3Ljg1IDEwOTAuMTYgLTIyNTEuNDRDMTA4My40NyAtMjI0Ni41MiAxMDc3LjIzIC0yMjQxLjE1IDEwNzAuNTQgLTIyMzYuMjNDMTQwOC4wMiAtMjA4OC4xIDE1NDguNDUgLTE3MTYuNjUgMTY4Ny4xIC0xNDAxLjU5QzE3MjMuNjUgLTEzMTguMzYgMTc2MS4xIC0xMjM1LjU2IDE4MDMuMDEgLTExNTUuMDFDMTg1NS42MSAtMTA1My44NyAxOTE1LjggLTk1Ny4yMDMgMTk2OS4yOSAtODU2LjA2M0MyMDY4LjI2IC02NjguNTUxIDIxNDUuODMgLTQ1MC4xNTkgMjA4MS42NCAtMjM3LjU4NUMyMDIwLjU2IC0zNS43NTIgMTgzNi40NCA0My4wMTIyIDE2NjIuMTMgMTI2LjY5OUMxNTgzLjIyIDE2NC43MzkgMTUwNC4zMSAyMDYuMzU4IDE0NDAuMTIgMjY2Ljc3NEMxMzY5LjY4IDMzMy4wMDggMTMyMi40MiA0MTguOTMyIDEyODQuMDggNTA2LjY0N0MxMjA1LjE4IDY4Ny44OTQgMTE1MS42OCA5MDEuODEgOTc0LjI0OCAxMDE0LjE0Qzg3My45NDEgMTA3Ny42OSA3NjguMjg0IDEwNjkuNjMgNjYzLjA3MyAxMDIxLjc1QzU3My45MTEgOTgxLjQ3IDQ5MS40MzYgOTM0LjkyNyAzOTUuMTQyIDkxMi41NTFDNDIuOTUyMSA4MzEuNTQ5IC0zNzQuMzI1IDk5Ny41OCAtNTI0LjU2MyAxMzQwLjM4Qy02MTEuNDk2IDE1MzkuMDggLTU2Mi45MDMgMTc1OS4yNyAtNDcxLjA2NiAxOTQ3LjIzQy0zODcuMjU0IDIxMTguNjMgLTI2NC42NTYgMjI2OS44OSAtMTIwLjIxNCAyMzkzLjg1QzIwMC4zMjMgMjY2OC42MyA2MTQuNDggMjc5Ny41MiAxMDMxLjc2IDI4MTEuODRDMTI1NC4yMiAyODE5LjQ1IDE0ODEuNTggMjc5OC40MiAxNjk4LjY5IDI3NDkuMTlDMTg3MS42NiAyNzA5LjgxIDIwNDUuMDggMjY0Ni4yNiAyMTg2LjQgMjUzNS43MkMyMzI2LjM5IDI0MjYuNTIgMjQxOC4yMiAyMjcwLjc5IDI0MjguOTIgMjA5MS4zM0MyNDQyLjMgMTg3Mi45NCAyMzQ5LjEyIDE2NjEuNzEgMjI0OC4zNyAxNDczLjc1QzIxNDEuODIgMTI3NS4wNSAyMDE2LjU1IDEwNzUuNDUgMTk4NC40NSA4NDguMTA3QzE5NTUuMDMgNjQxLjM1MSAyMDIxLjAxIDQ0My4wOTkgMjExOC42NCAyNjMuMTk0QzIyMTMuNiA4Ny43NjQ2IDIzMzMuNTIgLTcyLjAwMTUgMjQzNC4yNyAtMjQzLjg1MUMyNTQ1LjI4IC00MzMuMTUzIDI2MTIuNiAtNjM2LjMyOSAyNjY4Ljc3IC04NDguMDA4QzI3NjkuMDggLTEyMjcuOTYgMjg4NS40MyAtMTcxMS43MyAzMjkxLjEyIC0xODc2LjQyQzM1MTkuODIgLTE5NjkuNSAzNzcwLjgxIC0xOTA3LjMgMzk5NC42MSAtMTgzMS4yMkM0MTkyLjEgLTE3NjQuMDkgNDM5MC45MyAtMTY5MS41OSA0NTc3LjcyIC0xNTk3LjYxQzQ3NTQuMjYgLTE1MDkgNDkyMS44OSAtMTM5NS43OCA1MDQ2LjI3IC0xMjQwLjA0QzUwNjIuNzYgLTEyMTkuNDUgNTA4OC4xOCAtMTE5OC44NyA1MDc3LjQ4IC0xMTczLjM2QzUwNjkuOSAtMTE1NS40NiA1MDU1LjYzIC0xMTM4LjQ1IDUwNDQuNDkgLTExMjIuNzlDNTAxNS4wNiAtMTA4MS42MSA0OTgxLjYzIC0xMDQzLjU4IDQ5NDQuNjIgLTEwMDguNjdDNDg3NS41MiAtOTQyLjg4MyA0Nzk1LjcyIC04ODkuNjI3IDQ3MTEuNDcgLTg0Ni42NjVDNDUzNi43MSAtNzU3LjE2IDQzNDEuODkgLTcwOS43MjMgNDE0Ny45NiAtNjg3LjM0N0MzOTI1LjA2IC02NjEuMzkgMzY5OS40OCAtNjYyLjczMyAzNDc2LjEzIC02ODYuODk5QzMwMTguNzMgLTczNi41NzQgMjU3NC43IC04ODIuOTE1IDIxNjAuNTUgLTEwODAuNzJDMTk1NS4wMyAtMTE3OC43MyAxNzU2LjIgLTEyOTAuNjEgMTU2My42MSAtMTQxMS44OUMxMzc3LjI2IC0xNTI5LjU5IDExOTYuMjYgLTE2NTUuMzQgMTAwNi4zNSAtMTc2Ny4yMkM4MjIuMjI3IC0xODc1LjUyIDYyOC4zIC0xOTcxLjI5IDQyMC45OTkgLTIwMjcuMjNDMjQ3LjU3OSAtMjA3NC4yMiAtMC43MzcwNjEgLTIxMDguMjMgLTk3LjQ3NzggLTE5MTIuMjJDLTEyOS4xMyAtMTg0OC4yMiAtMTI2LjQ1NSAtMTc3Mi4xNCAtODQuNTQ5MSAtMTcxMy41MkMtNDkuNzc2MSAtMTY2NC43NCA1LjUwNDE1IC0xNjM3LjQ0IDYwLjc4NDcgLTE2MTcuNzVDMTk2LjMxMSAtMTU2OS40MiAzODEuMzIyIC0xNTYwLjQ3IDQ1Ny4xMDkgLTE0MTcuNzFDNTM5LjU4NCAtMTI2Mi40MSA0NzAuNDgzIC0xMDcwLjQzIDU0NC45MzQgLTkxMi4wMDRDNTU5LjE5OSAtODgxLjU3MiA1NzMuMDIgLTg1Mi4wMzUgNjA3LjM0NyAtODQ1Ljc3QzY0My45MDMgLTgzOS4wNTcgNjgxLjc5NyAtODQzLjA4NSA3MTcuOTA3IC04NTAuNjkzQzc5Ni4zNyAtODY2LjgwNCA4ODIuNDExIC05MTMuNzk0IDk2My45OTQgLTg5OS40NzNDMTA3NC4xMSAtODgwLjIyOSAxMDY1LjY0IC03NTMuNTggMTA5My43MiAtNjcxLjY4M0MxMTE2LjAyIC02MDcuMjQgMTE3OS4zMiAtNTM2Ljk3OSAxMjUyLjg4IC01NjUuNjJDMTI2NC4wMiAtNTcwLjA5NSAxMjY2LjcgLTU4OC40NDQgMTI1Mi44OCAtNTkxLjU3NkM5MTcuNjMgLTY2Ny42NTYgNTY4LjExNSAtNjQ5LjMwNyAyMjYuNjI2IC02NDcuMDdDLTEzNC4wMzQgLTY0NC4zODQgLTQ5NC4yNDggLTY0MC44MDQgLTg1NC45MDcgLTYzNS44ODFDLTEyMTUuNTcgLTYzMC45NTkgLTE1NzUuNzggLTYyNS4xNDEgLTE5MzYuNDQgLTYxOC40MjhDLTIwNjYuNjIgLTYxNS43NDMgLTIyMDMuNDggLTYyMy4zNTEgLTIzMjguNzUgLTU4MC44MzZDLTIzNzYuMDEgLTU2NS4xNzMgLTI0MjIuMzcgLTU0MS45MDEgLTI0NTcuMTUgLTUwNS4yMDRDLTI0NzguNTQgLTQ4Mi44MjggLTI1MTkuNTYgLTQyNy4zMzUgLTI1MDguNDEgLTM5NC4yMTlDLTI1MDAuODQgLTM3MS44NDIgLTI0NjIuNSAtMzQ0Ljk5MSAtMjQ0NS41NSAtMzI4LjQzM0MtMjQxOC44MSAtMzAyLjQ3NiAtMjM5MS4xNyAtMjc3Ljg2MiAtMjM2Mi42MyAtMjUzLjY5NkMtMjMxMS44MSAtMjExLjE4MSAtMjI1Ny44NyAtMTcxLjM1MiAtMjIwMi4xNCAtMTM1LjEwMkMtMjA4NS4zNCAtNTguNTc1NyAtMTk2MC4wNyAzLjYzMDEzIC0xODMwLjc4IDU1LjU0MjdDLTE1NTUuNzIgMTY2LjA4MSAtMTI2NC4xNiAyMjguMjg3IC05NzIuNjAxIDI3My45MzRDLTI4Mi4wNDMgMzgyLjIzNSA0MjAuMTA3IDM5Mi41MjggMTExNi45MSAzNTQuOTM2QzE0NjkuOTkgMzM1LjY5MyAxODIyLjYyIDMwNC4zNjYgMjE3NC4zNyAyNjcuMjIxQzIzMTAuNzggMjUyLjkwMSAyNDQ3LjIgMjMzLjIxIDI1ODQuNTEgMjM4LjU4QzI3MDAuODcgMjQzLjA1NSAyODI1LjY5IDI2Mi43NDYgMjkyMi40MyAzMzEuNjY1QzI5NzAuMTQgMzY1LjY3NyAzMDA1LjggNDEwLjg3NyAzMDI5Ljg3IDQ2My42ODVDMzAzMC43NyA0NTguMzE0IDMwMzEuMjEgNDUyLjk0NCAzMDMyLjEgNDQ3LjU3M0MyODkxLjIzIDU2MC43OTcgMjcyMi4yNyA2MjYuNTgzIDI1NDguODUgNjcwLjg4OEMyMzY1LjE3IDcxNy44NzggMjE3Ni4xNSA3NDcuNDE1IDE5ODguMDIgNzcxLjU4MUMxNTk2LjE1IDgyMS43MDQgMTE5OS4zOCA4MzMuNzg3IDgwNS4yODYgODA4LjcyNUM2MDguNjg0IDc5Ni4xOTUgNDE0Ljc1NyA3NjkuMzQzIDIxOS40OTMgNzQzLjM4N0MxNTMuOTU5IDczNC44ODQgODEuNzM3OCA3MzUuMzMxIDMzLjE0NDUgNzg3LjY5MkMtMi45NjU4MiA4MjYuMTc5IC05LjIwNzI4IDg4MC4zMjkgLTQuNzQ5MjcgOTMwLjg5OUMxLjQ5MjE5IDk5OS4zNyAyMi44OTA5IDEwNjUuMTYgMzguOTQwMiAxMTMxLjM5QzU5LjAwMTUgMTIxNS41MiA3NS40OTYzIDEzMTcuNTYgLTI3LjkzMTQgMTM0OC40NEMtMTA1Ljk0OCAxMzcyLjE2IC0xOTcuNzg1IDEzNTcuMzkgLTI3Ny41ODQgMTM1NC43Qy0zODAuMTIxIDEzNTEuNTcgLTQ4Mi4yMTEgMTM0OC40NCAtNTg0Ljc0NyAxMzQ1LjMxQy0xMDQxLjI2IDEzMzAuOTkgLTE0OTguMjEgMTMxNy4xMSAtMTk1NC43MiAxMzAyLjc5Qy0xOTY3LjY1IDEzMDIuMzQgLTE5NzMuNDQgMTMyMS41OSAtMTk2MS40MSAxMzI3Ljg1Qy0xNTIyLjI4IDE1NTguNzggLTEwODMuMTYgMTc4OS4yNSAtNjQ0LjA0IDIwMjAuMTdDLTQ0Mi41MzQgMjEyNi4yNCAtMjQyLjgxMiAyMjQyLjE0IC0yOS43MTQ2IDIzMjMuNTlDMTY0LjIxMiAyMzk3LjQ0IDM3OS4wOTMgMjQzNi44MiA1ODAuNTk4IDIzNjkuMjRDNzY1LjE2MyAyMzA3LjQ4IDkxNC41MDkgMjE3Mi43OCAxMDQ2LjAyIDIwMzMuMTVDMTE4My43OCAxODg3LjI2IDEzMDcuNzEgMTcyNy45NCAxNDE2LjQ5IDE1NTguNzhDMTYzNS4zOCAxMjE3Ljc2IDE3OTEuODYgODM1LjEyOSAxODcxLjY2IDQzNy4yODFDMTk2My41IC0xOS4xOTM2IDE5NTcuMjYgLTQ4Ni44NTYgMTk2Ny4wNiAtOTUwLjQ5MUMxOTcxLjk3IC0xMTg0LjEgMTk4MS4zMyAtMTQxOC42IDIwMDkuODYgLTE2NTAuODdDMjAyNC41NyAtMTc3Mi4xNCAyMDQ0LjY0IC0xODkyLjk4IDIwNzIuMjggLTIwMTIuMDJDMjA5NS4wMSAtMjExMC4wMiAyMTI0Ljg4IC0yMjA4LjkzIDIxNzkuMjcgLTIyOTQuNEMyMjM0LjEgLTIzNzkuODggMjMxNC4zNSAtMjQ0NS4yMiAyNDE1LjEgLTI0NjUuMzZDMjUwOC43MiAtMjQ4NC4xNSAyNjAzLjY4IC0yNDU3Ljc1IDI2NjIuNTMgLTIzNzkuODhDMjc0Ni4zNCAtMjI2OC40NSAyNzQ5LjkxIC0yMTAwLjYzIDI4NjIuNyAtMjAxMC4yM0MzMDAwLjkgLTE4OTkuMjQgMzE5NC4zOCAtMjAwOS4zMyAzMzExLjYzIC0yMDk4Ljg0QzM0NDcuNiAtMjIwMi42NiAzNTgwIC0yMzU5Ljc0IDM3NTUuMjEgLTIzOTMuNzVDMzc5Ny41NiAtMjQwMS44MSAzODQzLjkyIC0yNDAyLjI2IDM4ODQuMDQgLTIzODUuN0MzOTQyLjQ1IC0yMzYxLjUzIDM5NjEuNjIgLTIzMDcuODMgMzk2Mi41MSAtMjI0OC4zMUMzOTYzLjg0IC0yMTMwLjYxIDM5NDkuMTMgLTIwMTAuNjcgMzkzNy45OSAtMTg5My40MkMzOTI3LjI5IC0xNzgzLjc4IDM5MjUuOTUgLTE2NTguMDMgMzg2OS4zMyAtMTU2MC40N0MzODEyLjcyIC0xNDYyLjQ2IDM3MDEuMjYgLTE0MjQuNDIgMzYwMS44NSAtMTM4NS40OEMzNDkwLjQgLTEzNDEuNjMgMzM3OC41IC0xMjk3Ljc3IDMyNjcuMDQgLTEyNTMuOTFDMzE2My4xNyAtMTIxMy4xOSAzMDU3LjUxIC0xMTYzLjUxIDI5NDYuMDYgLTExNDYuOTVDMjgyNC4zNiAtMTEyOC42MSAyNzA4Ljg5IC0xMTY3LjU0IDI2MDAuNTYgLTEyMjAuMzVDMjUwNC43MSAtMTI2Ny4zNCAyNDEyLjQzIC0xMzIxLjk0IDIzMjMuMjcgLTEzODAuMTFDMTk2Mi42MSAtMTYxNS45NiAxNjUzLjY2IC0xOTIwLjcyIDEzMDQuMTUgLTIxNzEuNzhDOTY4LjQ1MiAtMjQxMi41NSA1NzMuNDY1IC0yNjE2LjE3IDE1MS43MyAtMjYxOS43NUMtMjUuMjU2NiAtMjYyMS4xIC0yMzEuMjIgLTI1OTkuMTcgLTMzOS41NTIgLTI0NDAuNzRDLTQzMS4zODkgLTIzMDYuNDkgLTQzNi43MzkgLTIxMjkuNzIgLTQ0OS42NjcgLTE5NzMuMDhDLTQ2Ny45NDUgLTE3NTQuMjQgLTUzMS42OTYgLTE1NDcuOTMgLTU3Mi43MSAtMTMzMy4xMkMtNjA3LjQ4MyAtMTE0OC43NCAtNjEwLjE1OCAtOTY0LjgxMSAtNTQ2Ljg1MyAtNzg2LjI1Qy00MzYuMjkzIC00NzMuODc4IC0xNjcuMDI0IC0yMTguMzQyIDE1Mi42MjEgLTEzMS45N0MzMjkuMTYyIC04NC4wODQ3IDUwNi4xNDggLTEwNS4xMTggNjg0LjQ3MiAtMTMwLjYyN0M4NzQuMzg2IC0xNTcuOTI2IDEwOTEuOTQgLTE5Ni40MTMgMTI2OC45MyAtOTcuOTU3OEMxNDUyLjYgNC41MjUxNSAxNTIxLjcgMjIzLjM2NCAxNTA5LjIyIDQyMy40MDdDMTUwMS42NCA1NDIuNDQ5IDE0NjkuMSA2NTguMzU3IDE0MjkuODYgNzcwLjIzOEMxNDAwIDg1Ni4xNjMgMTMzMS4zNCA5NjUuMzU5IDEzODIuNjEgMTA1NS4zMUMxNDAyLjIyIDEwODkuMzIgMTQzMi4wOSAxMTE3LjA3IDE0NTguODQgMTE0NC44MkMxNDk2LjI5IDExODMuNzUgMTUzMy43NCAxMjIyLjI0IDE1NzIuOTcgMTI1OS4zOEMxNjQxLjYyIDEzMjMuODMgMTcxNS4xOCAxMzg0LjI0IDE3OTcuNjYgMTQzMC4zNEMxOTc2Ljg3IDE1MzAuMTMgMjE2Ny4yMyAxNTI2LjU1IDIzNTYuNyAxNDU4LjUzQzI0NTYuNTYgMTQyMi43MyAyNTUxLjk3IDEzNzYuMTkgMjY0OS4xNSAxMzM0LjEyQzI3NTIuNTggMTI4OS4zNyAyODU3LjM1IDEyNDguNjQgMjk2My44OSAxMjExLjk0QzMxNjkuNDEgMTE0MC43OSAzMzgwLjI4IDEwODQuODUgMzU5My4zOCAxMDQzLjY4QzQwMjQuMDMgOTYwLjg4MyA0NDY2LjcyIDkzOC45NTUgNDkwMy4xNiA5ODAuMTI3QzUxMTguNDkgMTAwMC4yNyA1MzMyLjAzIDEwMzYuMDcgNTU0Mi40NiAxMDg2LjY0QzU1NTkuNCAxMDkwLjY3IDU1NjYuNTMgMTA2NC43MSA1NTQ5LjU5IDEwNjAuNjhDNDcwNS42NyA4NTcuNTA1IDM4MDcuMzcgODk4LjIzIDI5ODQuODUgMTE3Ni4xNEMyODgxLjg3IDEyMTEuMDUgMjc4MC4yMiAxMjQ5LjU0IDI2NzkuOTEgMTI5MS42QzI1NzguNzEgMTMzNC4xMiAyNDgwLjE5IDEzODIuOSAyMzc4LjEgMTQyMS44M0MyMjc0LjIzIDE0NjEuMjEgMjE2My42NyAxNDkwLjc1IDIwNTEuNzcgMTQ4Mi43QzE5NDkuMjMgMTQ3NS4wOSAxODUyLjQ5IDE0MzUuMjYgMTc2Ni45IDEzNzkuNzdDMTY4MS4zIDEzMjQuNzIgMTYwNS45NiAxMjU1LjM1IDE1MzQuMTggMTE4My43NUMxNTAyLjk4IDExNTIuNDIgMTQ3MS43NyAxMTIwLjY1IDE0NDEuOSAxMDg3Ljk4QzE0MjMuNjIgMTA2Ny44NCAxNDA1LjM1IDEwNDcuMjYgMTM5Ni40MyAxMDIwLjg1QzEzODIuNjEgOTgwLjU3NCAxMzk1LjU0IDk0MC4yOTcgMTQwOS4zNiA5MDIuMjU4QzE0ODIuMDIgNzAyLjY2MiAxNTYwLjA0IDQ5Ni4zNTQgMTUzMS4wNiAyNzkuNzUyQzE1MDcuNDQgMTAzLjg3NSAxNDE0LjI2IC02Mi4xNTU4IDEyNDguODcgLTEzNy4zNEMxMDgyLjU4IC0yMTIuOTcxIDg5Mi4yMTkgLTE4Ni41NjcgNzE3LjkwNyAtMTYxLjk1NEM1MjYuNjU1IC0xMzUuMTAyIDMzOC4wNzggLTEwNi45MDggMTQ4LjYwOSAtMTYwLjYxMUMtMjEuMjQ0NCAtMjA4Ljk0NCAtMTc1Ljk0IC0zMDYuNTA0IC0yOTguMDkyIC00MzQuMDQ4Qy00MjAuMjQ0IC01NjEuNTkzIC01MTAuNzQzIC03MjAuNDYzIC01NTAuNDIgLTg5My4yMDhDLTU5OS4wMTMgLTExMDMuNTQgLTU1My4wOTUgLTEzMTMuODggLTUwMy4xNjQgLTE1MTkuMjlDLTQ3Ny4zMDcgLTE2MjQuOTEgLTQ1MS4wMDQgLTE3MzAuMDggLTQzNi43MzkgLTE4MzcuOTNDLTQyNC43MDIgLTE5MjUuNjQgLTQyMC42ODkgLTIwMTQuMjUgLTQxMS43NzMgLTIxMDEuOTdDLTM5Mi42MDQgLTIyODIuMzIgLTM0NC45MDIgLTI0NzkuMjMgLTE1Ni43NyAtMjU0OS45NEMtNTYuMDE3MyAtMjU4Ny41MyA1OC41NTU0IC0yNTkzLjggMTY1LjU1IC0yNTkyLjAxQzI3Mi45OSAtMjU4OS43NyAzNzkuOTg0IC0yNTc0LjExIDQ4NC4zMDMgLTI1NDguMTVDNjk0LjI4IC0yNDk1LjM0IDg5Mi4yMTkgLTI0MDEuODEgMTA3Ni43OCAtMjI4OS40OEMxNDQzLjY5IC0yMDY2LjYxIDE3NTMuNTIgLTE3NjQuNTQgMjA5NS40NiAtMTUwNy4yMUMyMjY0Ljg3IC0xMzc5LjY3IDI0NDQuOTcgLTEyNTYuMTUgMjY0MC4yNCAtMTE3MS41N0MyNzMzLjQxIC0xMTMxLjI5IDI4MzEuOTMgLTExMDUuNzggMjkzNC4wMiAtMTExNy44NkMzMDQxLjQ2IC0xMTMwLjg0IDMxNDIuNjYgLTExNzYuMDQgMzI0Mi41MyAtMTIxNS40MkMzMzUzLjk4IC0xMjU5LjI4IDM0NjUuODggLTEzMDMuMTQgMzU3Ny4zMyAtMTM0N0MzNjYzLjgxIC0xMzgxLjAxIDM3NTguMzMgLTE0MTAuOTkgMzgyOS42NiAtMTQ3Mi43NUMzOTA0LjU1IC0xNTM3LjE5IDM5MzEuMyAtMTYzMS42MiAzOTQ0LjY3IC0xNzI2LjA1QzM5NjAuNzIgLTE4MzguODMgMzk2OS42NCAtMTk1Mi45NCAzOTc3LjY2IC0yMDY2LjE3QzM5ODEuNjggLTIxMjIuMTEgMzk4Ni41OCAtMjE3OC4wNSAzOTg3LjQ3IC0yMjMzLjk5QzM5ODguMzYgLTIyNzcuODUgMzk4My45MSAtMjMyMi42IDM5NTguMDUgLTIzNTkuM0MzOTE3LjkzIC0yNDE2LjU4IDM4NDIuNTggLTI0MzAuOSAzNzc3LjA1IC0yNDI0LjE5QzM2MDguOTggLTI0MDcuMTggMzQ3NC4zNSAtMjI2OCAzMzUwLjQxIC0yMTY1LjUyQzMyMjYuNDggLTIwNjMuMDMgMjk4Ni42MyAtMTg5MS42MyAyODQ3LjA5IC0yMDYwLjhDMjc1NC44MSAtMjE3Mi42OCAyNzU1LjcgLTIzNDAuNSAyNjQyLjAyIC0yNDM4Ljk1QzI1MjEuNjUgLTI1NDIuNzggMjMzMy41MiAtMjQ5OS44MiAyMjI2LjUzIC0yMzk3LjMzQzIwODMuODcgLTIyNjAuODQgMjA0NC42NCAtMjA0NS4xMyAyMDExLjY1IC0xODU4Ljk2QzE5MzAuNTEgLTE0MDAuNyAxOTQxLjIxIC05MzMuOTMyIDE5MjguNzMgLTQ3MC4yOThDMTkxNi42OSAtMTguMjk4NiAxODc1LjY3IDQzMS40NjMgMTcyNC45OSA4NjAuMTlDMTU4Ny4yNCAxMjUzLjEyIDEzNzMuNjkgMTYxOS4xOSAxMDk5LjUyIDE5MzEuNTZDOTY2LjIyMyAyMDgyLjgzIDgxNy4zMjMgMjIzNy4yMiA2MzAuNTI5IDIzMjAuMDFDNDE3LjQzMiAyNDEzLjk5IDE4NS42MTEgMjM3Ny43NCAtMjUuMjU2NiAyMjk3LjE5Qy0yNDYuMzc4IDIyMTMuMDYgLTQ1My42NzkgMjA5MC44OCAtNjYyLjc2NCAxOTgwLjc5Qy04NzkuODczIDE4NjYuNjcgLTEwOTYuOTggMTc1Mi41NSAtMTMxNC4wOSAxNjM4LjQzQy0xNTI2LjMgMTUyNyAtMTczOC41IDE0MTUuNTcgLTE5NTAuNzEgMTMwNC4xM0MtMTk1Mi45NCAxMzEyLjY0IC0xOTU1LjE2IDEzMjAuNjkgLTE5NTcuMzkgMTMyOS4yQy0xNTQyLjM1IDEzNDIuMTcgLTExMjYuODUgMTM1NC43IC03MTEuODAzIDEzNjcuNjhDLTUxMy40MTggMTM3My45NSAtMzEyLjgwMyAxMzg5LjE2IC0xMTQuNDE4IDEzODUuNThDLTU3LjgwMDUgMTM4NC42OSA3LjczMzQgMTM3Ni42MyA0Ny44NTYyIDEzMzEuODhDOTIuNDM3MyAxMjgyLjY1IDgxLjI5MTcgMTIxMS41IDY4LjM2MzMgMTE1MS45OEM0My44NDQgMTAzNS42MiAtNjAuOTIxMSA3ODEuNDI3IDE0MC4xMzkgNzY1Ljc2M0MxODMuMzgyIDc2Mi4xODMgMjI3LjUxNyA3NzEuNTgxIDI2OS44NjkgNzc4LjI5NEMzMTguOTA4IDc4NS45MDIgMzY3Ljk0NyA3OTIuNjE1IDQxNi45ODYgNzk4Ljg4QzUxOC4xODUgODExLjg1OCA2MTkuODMgODIyLjE1MSA3MjEuOTIgODI5Ljc1OUMxMTE4LjY5IDg2MC4xOTEgMTUxOC4xMyA4NTIuNTgzIDE5MTMuMTIgODA2LjkzNUMyMTIzLjEgNzgyLjc2OSAyMzMzLjk3IDc1MS40NDIgMjUzOS40OCA2OTkuOTc3QzI3MjIuMjcgNjU0LjMzIDI5MDAuMTQgNTg1LjQxMSAzMDQ4LjE1IDQ2Ni4zN0MzMDUzLjA2IDQ2Mi4zNDIgMzA1Mi42MSA0NTUuMTgyIDMwNTAuMzggNDUwLjI1OUMyOTU1LjQyIDI0My4wNTUgMjcwNi4yMiAyMDcuMjUzIDI1MDMuMzcgMjExLjI4MUMyMzU5LjgyIDIxNC40MTQgMjIxNi43MiAyMzUuODk1IDIwNzQuNTEgMjUwLjY2M0MxOTAxLjA5IDI2OC41NjQgMTcyNy42NyAyODQuNjc1IDE1NTQuMjUgMjk4LjU0OEM4NjcuMjUzIDM1My41OTQgMTc0LjkxMiAzNzEuOTQyIC01MTEuNjM0IDMwNS43MDlDLTgyNy4yNjcgMjc1LjI3NyAtMTE0NC4yNCAyMzAuNTI1IC0xNDUxLjQgMTUxLjMxM0MtMTcyNS41NyA4MC42MDQyIC0xOTk1LjI5IC0yMS40MzE0IC0yMjI5LjM0IC0xODMuNDM1Qy0yMjg5LjUyIC0yMjUuMDU1IC0yMzQ2LjU5IC0yNzAuMjU1IC0yNDAwLjUzIC0zMTkuOTNDLTI0MjQuNiAtMzQyLjMwNiAtMjQ0OS4xMiAtMzY0LjY4MiAtMjQ3MC45NyAtMzg5LjI5NkMtMjQ4My44OSAtNDAzLjYxNyAtMjQ4NC43OSAtNDA2LjMwMiAtMjQ3OC41NCAtNDI0LjY1Qy0yNDcyLjc1IC00NDAuNzYxIC0yNDY0LjcyIC00NTUuOTc3IC0yNDU0LjQ3IC00NjkuODVDLTIzODQuOTIgLTU2Mi45MzUgLTIyNDQuMDUgLTU4MS43MzEgLTIxMzYuNjEgLTU4Ny4xMDFDLTE5NjUuODYgLTU5NS42MDQgLTE3OTMuNzggLTU5NC4yNjIgLTE2MjMuMDQgLTU5Ny4zOTVDLTE0NDguMjggLTYwMC41MjcgLTEyNzMuNTIgLTYwMy4yMTIgLTEwOTguNzcgLTYwNS44OTdDLTc0Ni41NzYgLTYxMC44MiAtMzk0LjM4NiAtNjE1LjI5NSAtNDIuMTk3MyAtNjE3Ljk4QzEzMi41NiAtNjE5LjMyMyAzMDYuODcxIC02MjAuNjY2IDQ4MS42MjkgLTYyMS41NjFDNjQ4LjM2MSAtNjIyLjQ1NiA4MTUuMDk0IC02MjIuOTAzIDk4MS4zODEgLTYwNy4yNEMxMDY5LjY1IC01OTguNzM3IDExNTcuMDMgLTU4NS4zMTEgMTI0My41MiAtNTY1LjYyQzEyNDMuNTIgLTU3NC4xMjMgMTI0My41MiAtNTgzLjA3MyAxMjQzLjUyIC01OTEuNTc2QzExNjEuOTMgLTU2MC4yNSAxMTE4LjI0IC02NjQuNTIzIDExMDUuMzIgLTcyNi43MjlDMTA5My43MiAtNzgxLjc3NCAxMDg1LjcgLTg0Mi42MzcgMTA0NC42OSAtODg0LjcwNUM5NzMuMzU2IC05NTguNTQ2IDg2Ni44MDggLTkyMS40MDEgNzgyLjU1IC04OTYuNzg4QzczMS4yODIgLTg4MS41NzIgNjY1Ljc0OCAtODU3Ljg1MyA2MTEuODA1IC04NzIuMTc0QzU2MC41MzcgLTg4Ni4wNDcgNTQzLjU5NiAtOTgzLjE2IDUzNi40NjMgLTEwMjguMzZDNTE4LjYzMSAtMTE0Mi45MyA1MzQuNjggLTEyNjIuNDEgNTAwLjc5OCAtMTM3NC4zQzQzNy45MzkgLTE1ODEuMDUgMjE3LjI2NCAtMTU4NC4xOCA0OC4zMDIgLTE2NTAuODdDLTU2LjkwODkgLTE2OTIuNDggLTEzNC4wMzQgLTE3ODkuMTUgLTc0LjI5NTcgLTE5MDQuNjFDNS41MDQzOSAtMjA1OC41NiAxOTcuMjAyIC0yMDUxLjQgMzQyLjA5IC0yMDE5LjE4QzYyNi45NjIgLTE5NTYuMDggODg1Ljk3OCAtMTgxMy4zMiAxMTMwLjczIC0xNjU4LjkyQzEzNzkuNDkgLTE1MDIuMjkgMTYyMS4xMiAtMTMzNS4zNiAxODc5LjI0IC0xMTkzLjk0QzIzOTUuOTMgLTkxMS41NTYgMjk2My40NSAtNzAyLjU2MiAzNTUyLjgxIC02NTIuODg3QzM4MjcuODcgLTYyOS42MTYgNDExMi4zIC02MzguMTE5IDQzODEuNTcgLTcwMS42NjdDNDYxNC4yOCAtNzU2LjcxMyA0ODQ4LjMzIC04NTkuMTk2IDUwMDkuNzEgLTEwNDEuMzRDNTA0Ny42MSAtMTA4NC4zIDUwODEuMDQgLTExMzEuMjkgNTEwOS4xMyAtMTE4MC45N0M1MTExLjM2IC0xMTg0Ljk5IDUxMTEuOCAtMTE5MC44MSA1MTA5LjEzIC0xMTk0LjM5QzQ5NjMuNzkgLTE0MDYuNTIgNDc0Ny4xMyAtMTU0OC4zOCA0NTE3LjU0IC0xNjU0LjQ1QzQ0MDAuMjkgLTE3MDkuMDQgNDI3OS40OCAtMTc1NS4xNCA0MTU4LjIyIC0xNzk5LjQ0QzQwMTEuOTkgLTE4NTMuMTUgMzg2NC40MyAtMTkwNy43NCAzNzEwLjYyIC0xOTM0LjE1QzM1NjYuNjMgLTE5NTguNzYgMzQxNy4yOCAtMTk1Ni45NyAzMjc5Ljk3IC0xOTAxLjkzQzMxNzIuNTMgLTE4NTguNTIgMzA3OC45MSAtMTc4Ni45MSAzMDAyLjIzIC0xNzAwLjU0QzI4MjIuMTMgLTE0OTcuODEgMjczOS4yMSAtMTIzNi45MSAyNjcxLjQ0IC05NzkuMTMyQzI2MzIuMjEgLTgzMS4wMDIgMjU5Ni4xIC02ODEuNTI5IDI1NDIuMTYgLTUzNy40MjZDMjQ5Mi42NyAtNDA0LjUxMiAyNDI0LjQ3IC0yODEuODkgMjM0OS4xMiAtMTYyLjQwMUMyMjEzLjE1IDUyLjg1NzcgMjA1MS43NyAyNjIuNzQ2IDE5NzkuOTkgNTExLjEyMkMxOTQ0Ljc3IDYzMi44NDggMTkzNi4zIDc1OS40OTggMTk1OC41OSA4ODQuMzU3QzE5ODQuMDEgMTAyNi42NyAyMDQ1LjUzIDExNjAuMDMgMjExMS45NSAxMjg3LjEzQzIyNTAuMTUgMTU1MS42MSAyNDQyLjMgMTgzOC4wMyAyMzkxLjAzIDIxNTIuMTlDMjM0Ny43OSAyNDE0Ljg5IDIxMjIuMjEgMjU3OC4yMyAxODg4LjE2IDI2NjQuNjFDMTYxOS43OCAyNzYzLjk2IDEzMTguODYgMjc5NC44NCAxMDM0Ljg4IDI3ODUuODlDNDcxLjgyMSAyNzY4LjQzIC0xMDcuMjg1IDI1MjUuODcgLTQwNC42NCAyMDIzLjMxQy00NzkuOTgyIDE4OTUuNzYgLTUzOS43MiAxNzUxLjY2IC01NDguMTkxIDE2MDEuNzRDLTU1Ny41NTMgMTQ0MC42MyAtNDk1LjEzOSAxMjkyLjk1IC0zODguMTQ1IDExNzQuOEMtMjE1LjYxNyA5ODUuNDk3IDUxLjQyMjYgODk0LjY1IDMwMy4zMDUgOTI1LjA4MkMzNjUuNzE4IDkzMi42ODkgNDI3LjY4NiA5NDcuOTA1IDQ4Ni41MzIgOTcxLjE3N0M1NTIuNTEyIDk5Ny4xMzMgNjEzLjU4OCAxMDM0LjI4IDY3OS41NjggMTA2MC42OEM3OTUuMDMyIDExMDYuNzggOTEyLjI4MSAxMDkyLjkgMTAxMS43IDEwMTcuMjdDMTIyNS42OCA4NTQuMzczIDEyNDAuNCA1NjguNDA1IDEzODguODUgMzYwLjc1NEMxNTM4LjY0IDE1MS4zMTMgMTgyMS4yOSAxMzMuODYgMTk5NS4xNSAtNDUuMTQ5OUMyMTc0LjM3IC0yMjkuOTc3IDIxNDQuNSAtNTE2Ljg0IDIwNTEuNzcgLTczNS42NzlDMTk5Mi40OCAtODc0Ljg1OSAxOTEwLjg5IC0xMDAyLjQgMTgzOS4xMiAtMTEzNC44N0MxNzgwLjcyIC0xMjQzLjE3IDE3MzEuMjMgLTEzNTUuOTUgMTY4MS43NSAtMTQ2OC43MkMxNTg5LjQ2IC0xNjc5LjA2IDE0OTYuNzQgLTE4OTkuNjkgMTMzOS4zNyAtMjA3MC42NEMxMjY1LjgxIC0yMTUwLjMgMTE3OC44NyAtMjIxNS4xOSAxMDc5LjQ2IC0yMjU4LjZDMTA2OC4zMSAtMjI2My41MyAxMDU4LjA2IC0yMjU1LjQ3IDEwNTkuODQgLTIyNDMuMzlDMTA5NC4xNyAtMjAwNC40MSAxMTMxLjE3IC0xNzUwLjIyIDEyNzguNzQgLTE1NTEuNTJDMTM5Ny43NyAtMTM5MC44NSAxNTgyLjc4IC0xMjc4LjA4IDE3ODcuNCAtMTMwNC4wM0MxOTg0LjAxIC0xMzI4LjY1IDIxNDQuOTQgLTE0NjcuMzggMjI2NC40MiAtMTYxNi44NUMyMzk1LjQ5IC0xNzgwLjY1IDI0NzkuMyAtMTk3Mi4xOSAyNTgyLjI4IC0yMTUzLjg4QzI2OTYuNDEgLTIzNTUuMjcgMjg0MC44NSAtMjU1Ni42NSAzMDY3LjMyIC0yNjM2Ljc2QzMwNjIuNDIgLTI2MzkgMzA1Ny4wNyAtMjY0MC43OSAzMDUyLjE2IC0yNjQzLjAzQzMyODcuMTEgLTIyODQuMTEgMzQ1NC43MyAtMTg4Mi42OCAzNTQzLjg5IC0xNDYyLjQ2QzM1ODUuOCAtMTI2NC4yIDM2NTYuMjQgLTk5Ni4xMzggMzQ1OS4xOSAtODU4LjMwMUMzMjc3LjMgLTczMS4yMDQgMzA0OS4wNCAtNzk1LjY0NyAyODcwLjcyIC04OTMuNjU1QzIyMjAuMjggLTEyNTAuMzMgMTg2MC45NiAtMTk0Ni4yMyAxNDAzLjU2IC0yNTAxLjE2QzEzNDUuNjEgLTI1NzEuODcgMTI4NS40MiAtMjY0MC43OSAxMjIzLjAxIC0yNzA3LjAyQzExNjEuNDkgLTI3NzIuMzYgMTA5Ni44NSAtMjg0My4wNyAxMDEyLjU5IC0yODc4LjQyQzk0My40ODcgLTI5MDcuMDYgODY1LjkxNiAtMjkwMC44IDgwOC44NTMgLTI4NDkuMzNDNzU1LjM1NSAtMjgwMC41NSA3MjkuNDk5IC0yNzI2LjcxIDcxMi41NTggLTI2NTcuNzlDNjU5Ljk1MiAtMjQ0Mi45OCA2MzIuNzU4IC0yMjE4LjMzIDYwOC42ODQgLTE5OTguNTlDNTgyLjgyNyAtMTc2Ni4zMyA1NjguMTE1IC0xNTMzLjE3IDU2NC41NDkgLTEyOTkuNTZDNTYwLjk4MiAtMTA2NS45NSA1NjguMTE1IC04MzIuMzQ0IDU4Ni4zOTQgLTU5OS4xODRDNTk0LjQxOCAtNDk3LjE0OSA1OTkuNzY4IC0zOTIuNDI4IDYxOS4zODQgLTI5MS43MzZDNjMyLjMxMiAtMjI1LjUwMiA2NTYuODMyIC0xNTEuMjEzIDcxNC4zNDEgLTExMC4wNDFDNzgzLjg4NyAtNjAuMzY1NyA4NjYuODA4IC04Ni43Njk4IDkzNy4yNDYgLTExOS44ODZDMTAzNS4zMiAtMTY2LjQyOSAxMTMwLjI4IC0yMTkuNjg0IDEyMjUuNjggLTI3MS4xNDlDMTQxNC43MSAtMzczLjE4NSAxNjA1LjUxIC00NzYuMTE1IDE4MTAuNTkgLTU0My42OTJDMjEzMy44IC02NTAuMjAyIDI1MzYuMzYgLTY1Ni45MTUgMjgxMC41NCAtNDI0LjY1QzI5NDYuMDYgLTMwOS42MzYgMzA3Mi4yMyAtOTcuNTEwNSAyOTgwLjgzIDgwLjYwNEMyOTY3LjAxIDEwNy45MDMgMjk0Ni41MSAxMDEuNjM4IDI5MTguNDIgMTAxLjE5QzI4OTQuMzUgMTAwLjc0MyAyODcwLjcyIDEwMC4yOTUgMjg0Ni42NSA5OS40MDAxQzI3OTQuNDkgOTcuMTYyNiAyNzQyLjMzIDkzLjEzNSAyNjkwLjYxIDg3Ljc2NDZDMjU4OC41MiA3Ny4wMjM5IDI0ODYuODggNTkuNTcwNiAyMzg3LjAyIDM2Ljc0NjhDMTU2MS4zOCAtMTQ5Ljg3MSA4NjguNTkxIC02NjguMTAzIDE0OS45NDcgLTEwODguMzNDLTIxOC43MzggLTEzMDQuMDMgLTYwMy40NzEgLTE1MDEuMzkgLTEwMTMuNjIgLTE2MjQuNDZDLTEyMTEuMTEgLTE2ODMuNTMgLTE0MTMuOTUgLTE3MjQuNzEgLTE2MTkuOTIgLTE3MzkuNDhDLTE4MTEuNjEgLTE3NTIuOSAtMjAxNS43OSAtMTc1MC4yMiAtMjIwMy4wMyAtMTcwMi4zM0MtMjI3NS4yNiAtMTY4My45OCAtMjM0Ny40OCAtMTY1NS43OSAtMjQwNi43NyAtMTYwOS42OUMtMjQzMi42MyAtMTU4OS41NSAtMjQ1NS44MSAtMTU2Ni4yOCAtMjQ3NC4wOSAtMTUzOC45OEMtMjQ4Ny40NiAtMTUxOC44NSAtMjUxMy43NiAtMTQ3Ni43OCAtMjUwOS43NSAtMTQ1MS4yN0MtMjUwNi4xOCAtMTQzMS4xMyAtMjQ4NC43OSAtMTQwNS42MiAtMjQ3NC41MyAtMTM4OC4xN0MtMjQ2Mi45NCAtMTM2OC40OCAtMjQ1MC45IC0xMzQ4Ljc5IC0yNDM4Ljg3IC0xMzI5LjU0Qy0yNDEyLjEyIC0xMjg3LjAzIC0yMzg0LjAzIC0xMjQ1LjQxIC0yMzU0LjYxIC0xMjA0LjY4Qy0yMzAwLjY3IC0xMTI5Ljk1IC0yMjQyLjcxIC0xMDU3LjkgLTIxODEuNjQgLTk4OC41M0MtMTkxOC4xNiAtNjkwLjQ3OSAtMTYwMi41MyAtNDQ1LjY4NCAtMTI5Mi4yNSAtMTk5Ljk5M0MtNjEyLjgzMyAzMzQuMzUgMzUuMzczNSA5MDMuNiA2NTEuOTI4IDE1MDYuODZDMTI2NS44MSAyMTA3Ljg5IDE4NDguOTMgMjc0MC42OSAyMzk2LjgyIDM0MDMuMDJDMjUzMS40NiAzNTY1LjQ3IDI2NjMuODYgMzczMC4xNiAyNzk0LjQ5IDM4OTYuMTlDMjgwMC43MyAzODg5LjkzIDI4MDYuOTcgMzg4My42NiAyODEzLjIxIDM4NzcuNEMyNDIxLjc5IDM0NzEuNDkgMjExMC42MiAyOTg5Ljk2IDE5MDAuNjQgMjQ2NS45MUMxNzk2LjMyIDIyMDUuNDUgMTcxNi41MiAxOTM0LjcgMTY2NC4zNiAxNjU4LjU3QzE2MDUuMDcgMTM0My45NiAxNTgyLjc4IDEwMTMuMjQgMTY2Ni41OSA3MDEuMzJDMTczNS4yNCA0NDUuNzgzIDE4NzguNzkgMTg5LjggMjEwMS43IDM4LjUzNzFDMjE2Ni4zNCAtNS4zMjAzMSAyMjQ2LjE0IC00MS4xMjIzIDIzMjUuMDUgLTIwLjA4ODlDMjM5MS40OCAtMi4xODc3NCAyNDM2LjA2IDU2LjQzOCAyNDYxLjkxIDExNi44NTRDMjUxNC45NiAyNDAuMzcgMjUxMi4yOSAzOTAuNzM4IDI0ODYuODggNTIwLjUyQzI0MzIuOTQgNzk3Ljk4NSAyMjU3LjI5IDEwMzYuMDcgMjAyNS45MSAxMTkzLjE1QzE4MDAuMzMgMTM0Ni4yIDE1MTUuMDEgMTQ0Mi44NyAxMjQyLjE4IDE0NDkuMTNDMTEwMy4wOSAxNDUyLjI2IDk1Ny4zMDcgMTQyNC45NyA4NDcuNjM4IDEzMzMuNjdDNzQ0LjY1NiAxMjQ4LjE5IDY4NS44MDkgMTEyMS45OSA2NTQuMTU3IDk5My41NTJDNTg1LjA1NiA3MTIuMDYgNjIwLjcyMSA0MDEuNDc5IDcyNS45MzIgMTMzLjg2Qzc1NC4wMTggNjIuNzAzMSA3ODcuODk5IC01Ljc2NzgyIDgyNi4yMzkgLTcyLjAwMTVDODE3Ljc2OSAtNzQuMjM5IDgwOS43NDQgLTc2LjQ3NjYgODAxLjI3NCAtNzguNzE0NEM3NzYuMzA5IDUxMy44MDcgNjU1Ljk0IDExMDEuNDEgNDQ1LjUxOCAxNjU1Ljg5QzM5MS4xMjkgMTc5OS41NCAzMzAuMDUzIDE5NDAuOTYgMjYzLjYyOCAyMDc5LjI1QzIzNy4zMjUgMjEzNC4yOSAyMTAuNTc3IDIyMTMuNSAxNTYuMTg4IDIyNDcuOTZDODUuNzUgMjI5Mi43MSAzNC4wMzYxIDIyMTkuMzIgOS45NjI0IDIxNjEuMTRDLTQ3LjU0NjkgMjAyMS41MiAtODQuMTAzMyAxODY4LjQ2IC0xMjEuNTUxIDE3MjIuNTdDLTE2MC4zMzcgMTU3MS43NSAtMTkyLjg4MSAxNDE5LjE1IC0yMTkuMTg0IDEyNjYuMDlDLTI2Mi44NzMgMTAxMy42OSAtMjg4LjI4NCA3MTIuNTA4IC01MDYuMjg0IDU0Mi44OTZDLTUxMi41MjYgNTM3Ljk3NCAtNTE5LjIxMyA1MzcuOTc0IC01MjUuMDA5IDU0Mi44OTZDLTgxMy40NDcgNzc5LjYzNiAtMTA3Mi4wMiAxMDUwLjg0IC0xMjk1LjM3IDEzNTAuMjNDLTE0MDguMTYgMTUwMS4wNCAtMTUxMS4xNCAxNjU5LjAyIC0xNjA0Ljc2IDE4MjIuODFDLTE2NTEuNTcgMTkwNC43MSAtMTY5NS43IDE5ODcuOTUgLTE3MzYuNzIgMjA3Mi41M0MtMTc2Ni41OSAyMTMzLjg0IC0xNzkwLjIyIDIxOTguNzMgLTE3OTYuOSAyMjY3LjIxQy0xODAyLjI1IDIzMjQuMDQgLTE3OTQuMjMgMjM4Ny4xNCAtMTc1My42NiAyNDMwLjFDLTE2OTkuNzIgMjQ4Ny4zOSAtMTYxOC4xMyAyNDgxLjU3IC0xNTQ4LjE0IDI0NjUuMDFDLTEzMzQuMTUgMjQxNC40NCAtMTEyMS45NSAyMzUyLjIzIC05MDkuMjk2IDIyOTUuODVDLTQ4My41NDggMjE4Mi42MiAtNTcuODAwNSAyMDY5Ljg1IDM2Ny45NDcgMTk1Ni42MkM1NDQuMDQyIDE5MTAuMDggNzUzLjEyNiAxODI1LjUgOTM2LjM1NCAxODc3LjQxQzExMjEuODEgMTkzMC4yMiAxMTc3LjA5IDIxMzUuNjMgMTE5OC45NCAyMzA1LjY5QzEyMTcuMjEgMjQ0OC45IDEyMTIuMzEgMjYwOC4yMiAxMTQ2Ljc4IDI3MzkuNzlDMTExNS41NyAyODAyLjQ0IDEwNjkuNjUgMjg1Ni41OSAxMDA4LjEzIDI4OTAuNjFDOTE2LjczOCAyOTQxLjE4IDgxMC4xOSAyOTM2LjcgNzEwLjMyOSAyOTE5LjdDMzU1LjQ2NSAyODU4LjM4IDcuMjg3NiAyNzI0LjU4IC0zMDcuODk5IDI1NTIuMjhDLTYyNC40MjQgMjM3OS41MyAtOTE0LjY0NiAyMTU4LjkgLTExNjUuMTkgMTg5OS4zNEMtMTI5Ni4yNiAxNzYzLjI5IC0xNDEwLjgzIDE2MTUuMTYgLTE1MjYuNzQgMTQ2Ni41OUMtMTY0Mi4yMSAxMzE4LjkgLTE3NjUuMjUgMTE3My40NiAtMTkyMy4wNyAxMDY5LjE4Qy0yMDY1LjI4IDk3NS4yMDQgLTIyMzguMjUgOTEyLjk5OCAtMjQxMC4zNCA5MzYuMjdDLTI1NTIuOTkgOTU1LjUxMyAtMjY4OS44NiAxMDM4Ljc1IC0yNzY3LjQzIDExNjAuOTNDLTI4MDYuMjEgMTIyMS4zNCAtMjgyNy4xNyAxMjkwLjI2IC0yODI4LjUgMTM2Mi4zMUMtMjgyOC41IDEzNjkuOTIgLTI4MjIuMjYgMTM3NS4yOSAtMjgxNS4xMyAxMzc1Ljc0Qy0xNzc5LjUyIDE0MjQuMDcgLTg2OS4xNzMgODQ4LjEwNyAyOC42ODY1IDQxNC45MDRDMTQxLjkyMiAzNjAuMzA2IDI1NS42MDMgMzA3LjQ5OSAzNzEuMDY4IDI1Ny44MjRDNDcxLjM3NSAyMTQuODYxIDU4NC42MTEgMTU0Ljg5MyA2OTcuNCAxNjMuODQ0Qzg1MS42NSAxNzYuMzc0IDg0Ni43NDYgMzQ0LjE5NiA4MjQuNDU2IDQ2MC41NTJDODEzLjc1NyA1MTYuNDkyIDc5Ni44MTYgNTcxLjUzOCA3NzMuNjM0IDYyMy40NTFDNzQ4LjY2OCA2NzkuODM5IDcxMS42NjYgNzU0LjEyNyA2NDYuNTc4IDc3MS41ODFDNTc2LjE0IDc5MC4zNzcgNTQxLjgxMyA3MDQuMDA1IDUxNS41MSA2NTQuNzc3QzQ4Ni41MzIgNjAwLjE3OSA0NTkuNzg0IDU0My43OTIgNDM1LjI2NCA0ODYuOTU2QzM4OC45IDM3OC4yMDggMzUxLjQ1MiAyNjYuMzI3IDMxOS4zNTQgMTUyLjY1NkMyNTUuMTU3IC03NS4xMzQgMjEzLjY5NyAtMzA4LjI5NCAxNzEuMzQ1IC01NDEuMDA2QzE0OS41MDEgLTY2MC4wNDggMTI3LjY1NiAtNzc5LjUzNyAxMDIuNjkxIC04OTguMTNDODIuNjI5NCAtOTkzLjkwMSA2OS4yNTQ5IC0xMTA0LjQ0IDE3LjA5NTIgLTExODkuNDdDLTM4LjYzMDkgLTEyODEuMjEgLTEzMS44MDUgLTEyODguMzcgLTIyOC45OTEgLTEyNjguNjhDLTMzMy4zMTEgLTEyNDcuNjUgLTQzNy4xODQgLTEyMTkuOSAtNTM4LjgyOSAtMTE4OS4wMkMtNzQ2LjEzIC0xMTI1LjkyIC05NDkuNDE5IC0xMDQxLjc5IC0xMTMyLjY1IC05MjQuNTM0Qy0xMzAxLjYxIC04MTYuNjgxIC0xNDcwLjU3IC02NzQuODE2IC0xNTcyLjIxIC00OTguOTM5Qy0xNjYyLjI3IC0zNDMuNjQ4IC0xNjk3LjkzIC0xMjAuMzM0IC0xNTE4LjcyIC0xMy4zNzZDLTE0MzMuNTcgMzcuNjQxOCAtMTMyOS42OSA0Ny45MzQ4IC0xMjMyLjk1IDU1LjU0MjdDLTExMDkuOTEgNjQuOTQwOSAtOTg1LjUzIDYyLjcwMzEgLTg2Mi45MzIgNDkuMjc3M0MtNjI5LjMyOCAyMy4zMjEgLTQwMS4wNzQgLTQyLjkxMjQgLTE5MC4yMDYgLTE0OC4wODFDMy43MjA5NSAtMjQ0Ljc0NiAxNzkuMzcgLTM3Mi4yOSAzNTIuMzQ0IC01MDIuMDcyQzUyNC40MjYgLTYzMS40MDYgNjk0LjI4IC03NjQuMzIxIDg3OS43MzYgLTg3My45NjRDOTc1LjU4NSAtOTMwLjggMTA3NS40NSAtOTgwLjkyMiAxMTgwLjIxIC0xMDE5LjQxQzEyOTQuMzQgLTEwNjEuNDggMTQyMS44NCAtMTA5OS4wNyAxNTQzLjk5IC0xMDc1LjM1QzE2NTQuMTEgLTEwNTMuODcgMTc2Ny43OSAtOTYzLjkxNiAxNzY0LjIyIC04NDEuMjk1QzE3NjEuNTUgLTc1NC4wMjggMTY5Mi44OSAtNjkyLjcxNyAxNjEzLjk4IC02NjkuNDQ2QzE1MjkuNzMgLTY0NC4zODQgMTQzMy40MyAtNjU2LjQ2OCAxMzY0LjMzIC03MTIuNDA4QzEyODQuNTMgLTc3Ni40MDQgMTI0MS4yOSAtODczLjUxNiAxMjIxLjIzIC05NzEuNTI0QzExNzguODcgLTExNzYuNDkgMTIxNC45OCAtMTQxMi43OCAxMzEzLjUxIC0xNTk2LjcyQzEzMzUuOCAtMTYzOC4zMyAxMzYxLjY2IC0xNjc4LjE2IDEzOTEuOTcgLTE3MTMuOTdDMTQyMi4yOSAtMTc1MC4yMiAxNDY4LjY1IC0xODA2LjE2IDE1MTMuNjggLTE4MjMuNjFDMTUzMC4xNyAtMTgyOS44NyAxNTMxLjA2IC0xODMxLjY2IDE1NDIuMjEgLTE4MTMuNzZDMTU0OC45IC0xODAzLjAyIDE1NDkuNzkgLTE3ODcuODEgMTU0OS4zNCAtMTc3NS4yOEMxNTQ4IC0xNzQ4Ljg3IDE1MzYuODYgLTE3MjIuOTIgMTUyNC4zOCAtMTcwMC41NEMxNDk2LjI5IC0xNjUwLjQyIDE0NTEuMjYgLTE2MTEuOTMgMTQwOC45MSAtMTU3NC4zNEMxMjM1LjQ5IC0xNDE5Ljk0IDEwMzAuNDIgLTEzMDEuMzUgODExLjA4MiAtMTIyNy41MUM3NjEuMTUxIC0xMjEwLjk1IDcxMC4zMjkgLTExOTYuMTggNjU4LjYxNSAtMTE4NC4xQzU5MS4yOTggLTExNjguNDMgNTE4LjE4NSAtMTE1MS40MyA0NTAuNDIyIC0xMTcyLjkxQzM0NS42NTcgLTEyMDYuMDMgMjg4LjE0NyAtMTMxNi4xMiAyNjYuNzQ5IC0xNDE3LjI2QzIyMS4yNzYgLTE2MzYuMSAzMTUuNzg3IC0xODgwIDE4My4zODIgLTIwODAuMDRDMTMwLjc3NyAtMjE2MC4xNSA1MS40MjI2IC0yMjAxLjc3IC00Mi4xOTczIC0yMjE1LjE5Qy0xNTkuNDQ1IC0yMjMxLjc1IC0yODIuNDg5IC0yMjI5LjUxIC00MDAuNjI4IC0yMjIyLjhDLTgxNy40NiAtMjIwMC40MiAtMTI3My4wOCAtMjAyOC41OCAtMTQ0Ni45NCAtMTYxNS4wNkMtMTQ4Mi42MSAtMTUzMC40OCAtMTUyMS4zOSAtMTQxNS45MiAtMTQ3OS45MyAtMTMyNi40MUMtMTQ0NC4yNyAtMTI0OS40NCAtMTM1OC4yMyAtMTIxNy4yMSAtMTI4MC4yMSAtMTIwMi44OUMtMTA0Ni42MSAtMTE1OS4wNCAtNzk1LjYxNSAtMTE3OS4xOCAtNTYyLjkwMiAtMTIyMC44Qy01My43ODgzIC0xMzEyLjA5IDQxNC4zMTEgLTE1NDEuNjcgODczLjA0OSAtMTc3MS4yNUMxMTA1LjMyIC0xODg3LjE2IDEzMzcuMTQgLTIwMTEuMTIgMTU4MC4xIC0yMTAzLjc2QzE2OTcuMzUgLTIxNDguNTEgMTgyMC44NCAtMjE4MS42MyAxOTQ3LjQ1IC0yMTc0LjQ3QzIwNzAuMDUgLTIxNjcuNzYgMjE4Ni44NSAtMjEyMi41NiAyMjkyLjA2IC0yMDYwLjhDMjM5MS45MiAtMjAwMi4xNyAyNDgzLjMxIC0xOTI4Ljc4IDI1NjguOTEgLTE4NTAuNDZDMjY1Ni43MyAtMTc3MC4zNSAyNzQwLjU0IC0xNjc1LjQ4IDI3NjIuMzkgLTE1NTQuMkMyODAzLjg1IC0xMzIwLjU5IDI2MjcuMzEgLTExMTQuMjggMjQyNy41OSAtMTAyNS4yM0MyMjE4LjA2IC05MzEuMjQ3IDE5NjkuMjkgLTkyMS44NDkgMTc0My43MSAtOTQyLjQzNUMxNTEzLjIzIC05NjMuMDIxIDEyODUuODcgLTEwMjYuMTIgMTA3Ny4yMyAtMTEyNi4zN0M2NzEuMDk3IC0xMzIxLjQ5IDM0Ny44ODYgLTE2NTguMDMgMTYyLjQyOSAtMjA2OS4zQzcxLjkyOTkgLTIyNjkuNzkgMTYuMjAzOSAtMjQ4NS4wNSAtMi4wNzQ0NiAtMjcwNC4zNEMtNS4xOTUwNyAtMjcyMS43OSAtMzEuOTQzOCAtMjcyMS43OSAtMzAuNjA2MiAtMjcwNC43OFoiIGZpbGw9IiNFNjAwN0EiLz4KPC9nPgo8cGF0aCBkPSJNNTc5LjY2MSAxMTUxSDc1MC44MjdMODA1LjM5OCA5NTMuMTE4QzgxMi45MjMgOTI1LjgzMyA4NTEuMjkgOTI1Ljg1IDg1OC43OTEgOTUzLjE0MUw5MTMuMTczIDExNTFIMTA4NC4wMUwxMjE1IDY0NUgxMDU0LjYxTDEwMTMuNjUgODQ1LjgxMUMxMDA3LjcgODc0Ljk3MiA5NjYuNjgxIDg3NS43NzggOTU5LjYxIDg0Ni44NzJMOTEwLjIzMyA2NDVINzUzLjc2N0w3MDUuNjY1IDg0OC4xMjZDNjk4Ljc5NyA4NzcuMTI4IDY1Ny42OSA4NzYuNTY2IDY1MS42MDMgODQ3LjM4N0w2MzcuMTU4IDc3OC4xMzhDNjIwLjk3MyA3MDAuNTQ3IDU1My4xMDIgNjQ1IDQ3NC40OCA2NDVINDQ5TDU3OS42NjEgMTE1MVoiIGZpbGw9IndoaXRlIi8+CjxkZWZzPgo8bGluZWFyR3JhZGllbnQgaWQ9InBhaW50MF9saW5lYXIiIHgxPSItMjMyLjQyOSIgeTE9IjgxNi4xNjkiIHgyPSIyNzEzLjY5IiB5Mj0iODEzLjU5MiIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgo8c3RvcCBzdG9wLWNvbG9yPSIjRjc5NDIwIiBzdG9wLW9wYWNpdHk9IjAuOTIiLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjQzRDNEM0IiBzdG9wLW9wYWNpdHk9IjAiLz4KPC9saW5lYXJHcmFkaWVudD4KPC9kZWZzPgo8L3N2Zz4K'; diff --git a/packages/core/src/config/logos/generated/westendSVG.ts b/packages/core/src/config/logos/generated/westendSVG.ts deleted file mode 100644 index 96a5691..0000000 --- a/packages/core/src/config/logos/generated/westendSVG.ts +++ /dev/null @@ -1,6 +0,0 @@ -// Copyright 2025 Luno contributors -// SPDX-License-Identifier: MIT - -// Do not edit. Auto-generated via node scripts/convertLogos.mjs - -export const westendSVG = 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTY3MiIgaGVpZ2h0PSIxNjcyIiB2aWV3Qm94PSIwIDAgMTY3MiAxNjcyIiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8Y2lyY2xlIGN4PSI4MzYuMjc0IiBjeT0iODM2LjIxOSIgcj0iODM1LjQzNiIgZmlsbD0iI0U2MDA3QSIvPgo8bWFzayBpZD0ibWFzazAiIG1hc2stdHlwZT0iYWxwaGEiIG1hc2tVbml0cz0idXNlclNwYWNlT25Vc2UiIHg9IjAiIHk9IjAiIHdpZHRoPSIxNjcyIiBoZWlnaHQ9IjE2NzIiPgo8Y2lyY2xlIGN4PSI4MzYuMjc0IiBjeT0iODM2LjIxOSIgcj0iODM1LjQzNiIgZmlsbD0iI0M0QzRDNCIvPgo8L21hc2s+CjxnIG1hc2s9InVybCgjbWFzazApIj4KPHJlY3QgeD0iLTI5OS45MTkiIHk9Ii02Ni4wNTE4IiB3aWR0aD0iMjg0MC40OCIgaGVpZ2h0PSIxODcxLjM4IiBmaWxsPSJ1cmwoI3BhaW50MF9saW5lYXIpIi8+CjxwYXRoIGQ9Ik0tMzAuNjA2MiAtMjcwNC43OEM0LjYxMjU1IC0yMjgzLjY2IDE3Ny4xNDEgLTE4NzkuMSA0NTUuNzcyIC0xNTYyLjI2Qzc0MS41MzUgLTEyMzcuMzUgMTEzNy40MSAtMTAxOC41MSAxNTYxLjgyIC05NDAuNjQ1QzE3NzAuOTEgLTkwMi4xNTggMTk4OS4zNiAtODk0Ljk5OCAyMTk5LjMzIC05MzEuMjQ3QzIzOTkuMDUgLTk2NS43MDYgMjYwMC41NiAtMTA1Mi45NyAyNzEzLjM1IC0xMjMwLjY0QzI3NjMuNzMgLTEzMDkuNCAyNzk0LjQ5IC0xNDAyLjk0IDI3OTMuMTUgLTE0OTYuOTJDMjc5MS44MSAtMTU5Ny4xNiAyNzQ5LjQ2IC0xNjg3LjU2IDI2ODcuNDkgLTE3NjQuNTRDMjYxOC44NCAtMTg1MC4wMSAyNTMxLjAxIC0xOTIyLjUxIDI0NDQuMDggLTE5ODkuMTlDMjM1OC4wNCAtMjA1NC45OCAyMjY1LjMxIC0yMTEzLjE2IDIxNjQuMTEgLTIxNTIuOTlDMTkzOS40MiAtMjI0MC43IDE3MTYuMDcgLTIxOTEuOTIgMTUwMC43NSAtMjEwMS4wN0MxMjcyLjQ5IC0yMDA0Ljg2IDEwNTEuODIgLTE4OTEuMTkgODMwLjY5NyAtMTc4MC42NUMzNzguMjAxIC0xNTU0LjY1IC04NC4xMDMzIC0xMzMxLjMzIC01ODYuNTMgLTEyNDQuNTFDLTcxMi42OTQgLTEyMjIuNTkgLTg0MS4wODcgLTEyMTAuMDUgLTk2OS4wMzUgLTEyMDguNzFDLTEwODMuNjEgLTEyMDcuMzcgLTEyMDcuOTkgLTEyMDguMjYgLTEzMTguOTkgLTEyMzkuNTlDLTEzNjguMDMgLTEyNTMuNDYgLTE0MTguNDEgLTEyNzYuNzQgLTE0NDYuOTQgLTEzMjEuMDRDLTE0ODMuOTQgLTEzNzguMzIgLTE0NzEuMDIgLTE0NDkuOTMgLTE0NTQuOTcgLTE1MTEuNjlDLTE0MjcuNzcgLTE2MTQuNjIgLTEzNzYuNSAtMTcxMC4zOSAtMTMxMC4wOCAtMTc5My4xOEMtMTE3Mi43NyAtMTk2NC41OCAtOTc3Ljk1MSAtMjA3OC4yNSAtNzY4Ljg2NiAtMjEzNy43N0MtNjQ5LjM4OSAtMjE3MS43OCAtNTI1LjQ1NCAtMjE4OS4yNCAtNDAxLjUxOSAtMjE5NS45NUMtMjgyLjA0MiAtMjIwMi4yMSAtMTU0Ljk4NyAtMjIwNi42OSAtMzYuNDAxOSAtMjE4N0M3OS41MDg1IC0yMTY4LjIgMTU5Ljc1NCAtMjA5NS43IDE5OS40MzEgLTE5ODUuNjFDMjM5LjU1NCAtMTg3NS4wNyAyMzIuNDIxIC0xNzU3LjgyIDIyOC40MDkgLTE2NDIuMzZDMjIyLjYxNCAtMTQ2OS4xNyAyMzYuODc5IC0xMjIxLjY5IDQzMS4yNTIgLTExNTAuOThDNTMyLjAwNSAtMTExNC4yOCA2NTIuMzc0IC0xMTUyLjc3IDc1MC44OTcgLTExODEuNDFDODUzLjQzNCAtMTIxMS40IDk1My4yOTUgLTEyNTAuNzggMTA0OC43IC0xMjk4LjY2QzExNDcuMjIgLTEzNDguMzQgMTI0MC44NCAtMTQwNi45NiAxMzI4LjIyIC0xNDc0LjU0QzE0MDMuMTIgLTE1MzEuODIgMTQ5MC4wNSAtMTU5Ni4yNyAxNTQwLjQzIC0xNjc3LjcyQzE1NzYuMDkgLTE3MzUuNDUgMTU5Ni42IC0xODE0LjY2IDE1MzMuMjkgLTE4NjAuMzFDMTUyOS43MyAtMTg2Mi45OSAxNTIzLjQ4IC0xODYyLjU0IDE1MTkuOTIgLTE4NjAuMzFDMTMzNi42OSAtMTc0Ny45OCAxMjM1LjA1IC0xNTQ2LjE0IDExOTYuNzEgLTEzMzkuMzlDMTE2MS4wNCAtMTE0Ni41MSAxMTYxLjkzIC05MDguODcxIDEyOTAuNzcgLTc0OC4yMUMxMzk0LjIgLTYxOS4zMjMgMTU5Ny4wNCAtNTg0Ljg2NCAxNzI0Ljk5IC03MDEuMjJDMTc4Ni4wNyAtNzU2LjcxMyAxODA1LjI0IC04NDIuMTkgMTc3Ny4xNSAtOTE5LjYxMUMxNzQzLjcxIC0xMDExLjM1IDE2NTguMTIgLTEwNzYuMjQgMTU2NC45NCAtMTA5OC42MkMxNDQyLjM1IC0xMTI4LjE2IDEzMTMuMDYgLTEwOTUuMDQgMTE5Ny4xNSAtMTA1NC43NkMxMDg5LjcxIC0xMDE3LjE3IDk4Ni43MyAtOTY3Ljk0NCA4ODguMjA3IC05MTEuMTA5QzY4Mi42ODkgLTc5Mi41MTUgNDk2LjM0IC02NDQuMzg1IDMwNi40MjYgLTUwMi41MTlDMTEyLjQ5OSAtMzU3Ljk2OSAtODYuNzc4MyAtMjE3Ljg5NCAtMzEwLjU3NCAtMTIzLjQ2N0MtNTYxLjU2NSAtMTYuOTU2MSAtODM0Ljg0NiAzNi43NDY4IC0xMTA3LjY4IDMzLjE2NjdDLTEyMzAuNzIgMzEuMzc2NSAtMTM3MS4xNSAyOS4xMzg5IC0xNDgzLjk0IC0yNS45MDY1Qy0xNjA1LjIgLTg1LjQyNzIgLTE2NDIuNjUgLTIxMS42MjkgLTE2MTEuODkgLTMzNi45MzZDLTE1ODIuNDcgLTQ1Ni44NzIgLTE1MDkuMzYgLTU1OC40NiAtMTQyNy4zMyAtNjQ3LjUxN0MtMTM0NS43NCAtNzM2LjEyNyAtMTI1Mi41NyAtODEzLjk5NiAtMTE1Mi43MSAtODgxLjEyNEMtOTUzLjQzMSAtMTAxNC40OSAtNzI5LjYzNSAtMTEwNi4yMyAtNTAwLjQ4OSAtMTE3My44MUMtNDQyLjk4IC0xMTkwLjgxIC0zODUuMDI1IC0xMjA2LjAzIC0zMjcuMDY5IC0xMjE5LjlDLTI2NC42NTYgLTEyMzUuMTIgLTE5NS41NTYgLTEyNTcuNDkgLTEzMC45MTMgLTEyNTMuNDZDMTQuODY2MiAtMTI0NC4wNyAzNy4xNTcgLTEwNjguNjQgNjIuMTIyMyAtOTU1LjQxM0MxNzMuNTc0IC00NTUuNTI5IDIxNi44MTggNjcuMTc4NSA0MjguNTc3IDUzOC44NjhDNDU0Ljg4IDU5Ny45NDIgNDgzLjg1OCA2NTUuNjcyIDUxNS45NTYgNzExLjYxM0M1MzcuODAxIDc1MC4xIDU2NC41NDkgNzkxLjcxOSA2MTEuODA1IDc5OS4zMjdDNzE1LjIzMyA4MTQuOTkxIDc3OC4wOTIgNjgzLjQxOSA4MDguODUzIDYwNi40NDVDODQ5LjQyMSA1MDQuNDA5IDg4My43NDkgMzY4LjM2MiA4NTMuNDM0IDI1OS4xNjZDODI2LjY4NSAxNjMuODQ0IDczNy41MjMgMTI4LjQ4OSA2NDYuMTMyIDEzNi45OTJDNTMyLjAwNSAxNDcuNzMzIDQyNC4xMTkgMjA0LjEyMSAzMjAuNjkyIDI0OS4zMjFDMTkxLjQwNyAzMDUuNzA4IDYzLjQ1OTUgMzY2LjEyNCAtNjMuMTUwNCA0MjguMzNDLTMxNC41ODcgNTUxLjg0NyAtNTYyLjQ1NyA2ODIuNTI0IC04MTQuMzM5IDgwNi4wNEMtMTMxNi43NyAxMDU0LjQyIC0xODQ2LjM5IDEyNzYuODQgLTI0MDkgMTMzNi4zNkMtMjU0NC4wOCAxMzUwLjY4IC0yNjc5LjYgMTM1NS4xNSAtMjgxNS4xMyAxMzQ4LjQ0Qy0yODEwLjY3IDEzNTIuOTEgLTI4MDYuMjEgMTM1Ny4zOSAtMjgwMS43NiAxMzYxLjg2Qy0yNzk4LjE5IDExODcuMzMgLTI2NjUuMzQgMTA0NS4wMiAtMjUwNy41MiA5ODcuMjg3Qy0yMzMyLjMyIDkyMy4yOTIgLTIxMzkuNzMgOTcxLjYyNCAtMTk4My4yNSAxMDYyLjQ3Qy0xODE0LjI5IDExNjAuOTMgLTE2ODQuMTEgMTMwOS4wNiAtMTU2My43NCAxNDYxLjIxQy0xNDQ2LjUgMTYwOS43OSAtMTMzMi44MSAxNzYwLjYxIC0xMjAyLjE5IDE4OTguNDVDLTcyMC4yNzMgMjQwNS40OSAtODguMTE1NyAyNzY3LjU0IDU5My4wODEgMjkyMi4zOEM3NTAuMDA2IDI5NTguMTggOTI4LjMyOSAyOTkxLjc1IDEwNjUuNjQgMjg4NC4zNEMxMTY1LjUgMjgwNi4wMiAxMjEwLjUzIDI2NzkuMzggMTIyNy4wMiAyNTU3LjJDMTI0Ni4xOSAyNDEwLjg2IDEyMzAuMTQgMjI1NS41NyAxMTg1LjEyIDIxMTUuMDVDMTEzNS4xOCAxOTU5LjMxIDEwMjcuNzQgMTg0OS42NyA4NjAuMTIxIDE4MzcuMTRDNjc5LjEyMiAxODIzLjcxIDQ5Mi43NzQgMTg5NS4zMSAzMjAuNjkyIDE5NDAuOTZDMTA2LjI1NyAxOTk3LjggLTEwNy43MzEgMjA1NC42MyAtMzIyLjE2NSAyMTExLjQ3Qy01MzMuOTI1IDIxNjcuNDEgLTc0NS4yMzkgMjIyMy44IC05NTYuOTk4IDIyNzkuNzRDLTEwNjEuMzIgMjMwNy40OCAtMTE2Ni4wOCAyMzM1LjIzIC0xMjcwLjQgMjM2Mi45OEMtMTM3NC4yOCAyMzkwLjcyIC0xNDc4LjU5IDI0MjUuMTggLTE1ODQuMjUgMjQ0NC40M0MtMTY4NS45IDI0NjIuNzcgLTE3NjcuOTIgMjQxNS4zNCAtMTc3MS45NCAyMzA3LjkzQy0xNzc1LjA2IDIyMzAuNTEgLTE3NDcuNDIgMjE1My45OCAtMTcxMy45OCAyMDg1LjUxQy0xNjMzLjI5IDE5MjAuMzcgLTE1NDIuMzUgMTc2MC42MSAtMTQ0Mi4wNCAxNjA2LjY2Qy0xMjM2LjA3IDEyODkuODEgLTk5MC44NzkgOTk4LjQ3NiAtNzEzLjU4NiA3NDIuMDQ0Qy02NDYuMjY5IDY3OS44MzkgLTU3Ny4xNjggNjE5LjQyMyAtNTA2LjI4NCA1NjEuMjQ1Qy01MTIuNTI2IDU2MS4yNDUgLTUxOC43NjcgNTYxLjI0NSAtNTI1LjAwOSA1NjEuMjQ1Qy0zMDguNzkxIDcyOS41MTQgLTI4Ni45NDYgMTAzMC4yNSAtMjQzLjI1NyAxMjgwLjQyQy0yMTUuMTcxIDE0NDEuNTIgLTE3OS45NTIgMTYwMS43NCAtMTM4LjkzOCAxNzYwLjE2Qy0xMTcuOTg1IDE4NDAuNzIgLTk1LjI0ODUgMTkyMC44MiAtNzAuNzI5MiAyMDAwLjQ4Qy01MC42Njc3IDIwNjYuMjcgLTMzLjI4MSAyMTM2LjUzIC0yLjA3NDQ2IDIxOTcuODRDMTguODc4NyAyMjM4LjU2IDUwLjk3NzEgMjI3OS43NCA5OS4xMjQzIDIyODYuNDVDMTQ1LjkzNCAyMjkzLjE2IDE4NC43MTkgMjI2NC41MiAyMTIuMzYgMjIyOS4xN0MyNTIuOTI4IDIxNzYuMzYgMjc4LjM0IDIxMTAuNTcgMzA2LjQyNiAyMDUwLjZDMzM5Ljg2MSAxOTc5LjQ1IDM3MS45NTkgMTkwNy40IDQwMi4yNzUgMTgzNC45QzUyMS4zMDYgMTU1MC43MiA2MTYuNzA5IDEyNTYuMjUgNjg3LjE0NiA5NTYuNDA4Qzc2Ni41IDYxNi43MzggODEzLjc1NiAyNjkuNDU5IDgyOC40NjggLTc5LjYwOTRDODI4LjkxNCAtOTMuMDM1MiA4MTAuMTkgLTk3LjUxMDMgODAzLjUwMyAtODYuMzIyM0M2NDYuMTMyIDE4NC40MyA1NzMuMDIgNTAxLjI3NyA1OTkuMzIyIDgxMy42NDhDNjIxLjE2NyAxMDc1LjQ1IDcyNS4wNCAxMzUzLjgxIDk5NC43NTUgMTQ0Mi40MkMxMTI5LjM5IDE0ODYuNzIgMTI3Ni41MSAxNDgwLjkxIDE0MTQuNzEgMTQ1Ny42M0MxNTU4LjcgMTQzMy40NyAxNzAwLjAyIDEzOTAuOTUgMTgzMi44OCAxMzMwLjU0QzIwOTUuNDYgMTIxMS4wNSAyMzIyLjM4IDEwMTIuMzUgMjQ0Mi4zIDc0NS42MjVDMjQ5OC45MiA2MTkuODcgMjUzMS40NiA0ODIuNDggMjUyOS42OCAzNDQuMTk2QzI1MjguMzQgMjI0LjcwNyAyNTA2Ljk0IDgwLjYwNDIgMjQxMi40MyAtMy4wODI3NkMyMzA0LjEgLTk5LjMwMDMgMjE2MC41NSAtNDIuNDY0OCAyMDU5LjM1IDM0LjUwOTNDMTk1Mi4zNSAxMTUuOTU4IDE4NjIuNzUgMjE5Ljc4NCAxNzkyLjc1IDMzNC4zNUMxNDU3Ljk1IDg4MS4yMjQgMTU4MS40NCAxNTg2LjA3IDE3NjQuMjIgMjE2My44M0MxOTQ2LjU2IDI3MzkuMzQgMjI0Ny40OCAzMjc2LjgyIDI2NDMuOCAzNzMxLjVDMjY5Mi40IDM3ODcuNDQgMjc0Mi43NyAzODQyLjA0IDI3OTQuNDkgMzg5NS4zQzI4MDYuOTcgMzkwNy44MyAyODIzLjkxIDM4ODkuNDggMjgxMy4yMSAzODc2LjVDMjI3OS4xMyAzMTk2LjcxIDE3MDkuODMgMjU0NC42NyAxMTA3LjEgMTkyNC44NUM1MDguMzc3IDEzMDkuNSAtMTIyLjg4OSA3MjQuNTkxIC03ODIuNjg2IDE3NS4wMzJDLTEwOTkuNjYgLTg5LjAwNzMgLTE0MzAuODkgLTMzNi4wNDEgLTE3NDMuNDEgLTYwNS4wMDJDLTE4OTEuNDEgLTczMi41NDcgLTIwMzQuMDcgLTg2Ni44MDQgLTIxNjMuMzYgLTEwMTMuNTlDLTIyMzAuMjMgLTEwODkuNjcgLTIyOTMuNTMgLTExNjkuMzMgLTIzNTEuNDkgLTEyNTIuNTdDLTIzNzcuMzUgLTEyOTAuMTYgLTI0MDIuNzYgLTEzMjguMiAtMjQyNi4zOCAtMTM2Ny4xNEMtMjQzOC40MiAtMTM4Ni44MyAtMjQ1MC4wMSAtMTQwNi41MiAtMjQ2MS4xNiAtMTQyNi4yMUMtMjQ3OC4xIC0xNDU1Ljc0IC0yNDc3LjY1IC0xNDY5LjE3IC0yNDYyLjk0IC0xNDk5LjE1Qy0yMzgxLjggLTE2NjIuMDUgLTIxNTUuNzggLTE2OTIuNDkgLTE5OTUuNzMgLTE3MDguNkMtMTc4My41MyAtMTcyOS42MyAtMTU2OS41NCAtMTcxOC40NCAtMTM1OS41NiAtMTY4MS4zQy05MzYuMDQ1IC0xNjA2LjU2IC01MzUuMjYyIC0xNDM0LjcxIC0xNTcuNjYyIC0xMjMyLjg4QzU3OC44MTUgLTgzOS45NTIgMTI0Ni42NCAtMzEwLjk3OSAyMDQyLjQxIC0zNi4xOTk1QzIyMzEuNDMgMjkuMTM4OSAyNDI1LjggNzguODE0IDI2MjQuMTkgMTA1LjIxOEMyNzIzLjE2IDExOC42NDQgMjgyMi41NyAxMjYuMjUxIDI5MjIuNDMgMTI3LjU5NEMyOTYzLjg5IDEyOC4wNDIgMjk4NC40IDEzNi45OTIgMzAwNC45MSA5OS40MDAxQzMwMjQuOTcgNjIuNzAzMSAzMDM2LjEyIDIxLjUzMSAzMDM5LjI0IC0yMC41MzYxQzMwNTIuNjEgLTE4Ny4wMTUgMjk1Mi4zIC0zNDQuOTkxIDI4MjguODEgLTQ0Ny45MjFDMjcwNi42NiAtNTQ5LjUwOSAyNTUzLjc1IC02MDcuMjQgMjM5OC4xNiAtNjMwLjUxMUMyMDE4LjMzIC02ODYuODk5IDE2NjMuMDIgLTUzMi41MDMgMTMzNC4wMiAtMzU3Ljk2OUMxMjQyLjE4IC0zMDkuMTg5IDExNTEuMjMgLTI1OS4wNjYgMTA1OS40IC0yMTAuNzM0Qzk3Mi45MSAtMTY1LjA4NiA4MzguMjc2IC02Ni42MzExIDc0MC4xOTggLTEyNy45NDJDNjY3LjA4NSAtMTczLjU4OSA2NTAuMTQ0IC0yNzcuNDE1IDY0MC4zMzcgLTM1Ni4xNzlDNjI2LjA3MSAtNDcyLjA4OCA2MTcuMTU1IC01ODguODkxIDYwOS41NzYgLTcwNS4yNDhDNTc5LjcwNyAtMTE2OC44OCA1OTMuNTI3IC0xNjM1LjIgNjUxLjAzNiAtMjA5Ni4xNUM2NjUuNzQ4IC0yMjE2LjA5IDY4NC4wMjYgLTIzMzYuMDIgNzA0Ljk3OSAtMjQ1NS4wN0M3MjEuOTIgLTI1NTEuMjggNzMzLjUxMSAtMjY1NS4xMSA3NzMuNjM0IC0yNzQ1LjUxQzgxNC4yMDIgLTI4MzUuOTEgODk0Ljg5NCAtMjg5NC41MyA5OTYuMDkzIC0yODU4LjI4QzEwOTMuMjggLTI4MjMuMzggMTE2Ni4zOSAtMjczNC4zMiAxMjM0LjYgLTI2NjAuNDhDMTcyMS40MiAtMjEzMS45NSAyMDUwLjg4IC0xNDUzLjk1IDI2MzQuNDQgLTEwMTguMDdDMjc4Ny4zNSAtOTAzLjk0OCAyOTYzLjg5IC03OTAuNzI1IDMxNTYuMDQgLTc2NS4yMTZDMzMxMi45NiAtNzQ0LjE4MiAzNDkzLjk2IC03OTcuODg1IDM1NzcuNzcgLTk0Mi40MzVDMzYyNS45MiAtMTAyNS42NyAzNjI3LjcgLTExMjMuNjggMzYxNy40NSAtMTIxNi43N0MzNjA2LjMxIC0xMzE4LjggMzU4NS44IC0xNDIwLjM5IDM1NjMuMDYgLTE1MjAuNjRDMzUxNy4xNCAtMTcyMi4wMiAzNDUzLjM5IC0xOTE4LjkzIDMzNzMuMTUgLTIxMDguNjhDMzI5Mi4wMSAtMjI5OS43NyAzMTkzLjkzIC0yNDgzLjI2IDMwODAuMjUgLTI2NTYuOUMzMDc3LjEzIC0yNjYxLjgyIDMwNzAuODkgLTI2NjQuOTUgMzA2NS4wOSAtMjY2My4xNkMyNjg5LjcyIC0yNTMwLjI1IDI1NTYuODcgLTIxMTkuNDIgMjM2OC43NCAtMTgwNy41QzIyNjMuMDggLTE2MzIuMDcgMjEyMS4zMSAtMTQ1NC44NSAxOTI5LjYyIC0xMzcwLjcyQzE3MjcuNjcgLTEyODEuNjYgMTUxMSAtMTM0My44NiAxMzYxLjY2IC0xNTAwLjVDMTE2OS45NiAtMTcwMS44OCAxMTI3LjYxIC0xOTg3Ljg1IDEwOTAuMTYgLTIyNTEuNDRDMTA4My40NyAtMjI0Ni41MiAxMDc3LjIzIC0yMjQxLjE1IDEwNzAuNTQgLTIyMzYuMjNDMTQwOC4wMiAtMjA4OC4xIDE1NDguNDUgLTE3MTYuNjUgMTY4Ny4xIC0xNDAxLjU5QzE3MjMuNjUgLTEzMTguMzYgMTc2MS4xIC0xMjM1LjU2IDE4MDMuMDEgLTExNTUuMDFDMTg1NS42MSAtMTA1My44NyAxOTE1LjggLTk1Ny4yMDMgMTk2OS4yOSAtODU2LjA2M0MyMDY4LjI2IC02NjguNTUxIDIxNDUuODMgLTQ1MC4xNTkgMjA4MS42NCAtMjM3LjU4NUMyMDIwLjU2IC0zNS43NTIgMTgzNi40NCA0My4wMTIyIDE2NjIuMTMgMTI2LjY5OUMxNTgzLjIyIDE2NC43MzkgMTUwNC4zMSAyMDYuMzU4IDE0NDAuMTIgMjY2Ljc3NEMxMzY5LjY4IDMzMy4wMDggMTMyMi40MiA0MTguOTMyIDEyODQuMDggNTA2LjY0N0MxMjA1LjE4IDY4Ny44OTQgMTE1MS42OCA5MDEuODEgOTc0LjI0OCAxMDE0LjE0Qzg3My45NDEgMTA3Ny42OSA3NjguMjg0IDEwNjkuNjMgNjYzLjA3MyAxMDIxLjc1QzU3My45MTEgOTgxLjQ3IDQ5MS40MzYgOTM0LjkyNyAzOTUuMTQyIDkxMi41NTFDNDIuOTUyMSA4MzEuNTQ5IC0zNzQuMzI1IDk5Ny41OCAtNTI0LjU2MyAxMzQwLjM4Qy02MTEuNDk2IDE1MzkuMDggLTU2Mi45MDMgMTc1OS4yNyAtNDcxLjA2NiAxOTQ3LjIzQy0zODcuMjU0IDIxMTguNjMgLTI2NC42NTYgMjI2OS44OSAtMTIwLjIxNCAyMzkzLjg1QzIwMC4zMjMgMjY2OC42MyA2MTQuNDggMjc5Ny41MiAxMDMxLjc2IDI4MTEuODRDMTI1NC4yMiAyODE5LjQ1IDE0ODEuNTggMjc5OC40MiAxNjk4LjY5IDI3NDkuMTlDMTg3MS42NiAyNzA5LjgxIDIwNDUuMDggMjY0Ni4yNiAyMTg2LjQgMjUzNS43MkMyMzI2LjM5IDI0MjYuNTIgMjQxOC4yMiAyMjcwLjc5IDI0MjguOTIgMjA5MS4zM0MyNDQyLjMgMTg3Mi45NCAyMzQ5LjEyIDE2NjEuNzEgMjI0OC4zNyAxNDczLjc1QzIxNDEuODIgMTI3NS4wNSAyMDE2LjU1IDEwNzUuNDUgMTk4NC40NSA4NDguMTA3QzE5NTUuMDMgNjQxLjM1MSAyMDIxLjAxIDQ0My4wOTkgMjExOC42NCAyNjMuMTk0QzIyMTMuNiA4Ny43NjQ2IDIzMzMuNTIgLTcyLjAwMTUgMjQzNC4yNyAtMjQzLjg1MUMyNTQ1LjI4IC00MzMuMTUzIDI2MTIuNiAtNjM2LjMyOSAyNjY4Ljc3IC04NDguMDA4QzI3NjkuMDggLTEyMjcuOTYgMjg4NS40MyAtMTcxMS43MyAzMjkxLjEyIC0xODc2LjQyQzM1MTkuODIgLTE5NjkuNSAzNzcwLjgxIC0xOTA3LjMgMzk5NC42MSAtMTgzMS4yMkM0MTkyLjEgLTE3NjQuMDkgNDM5MC45MyAtMTY5MS41OSA0NTc3LjcyIC0xNTk3LjYxQzQ3NTQuMjYgLTE1MDkgNDkyMS44OSAtMTM5NS43OCA1MDQ2LjI3IC0xMjQwLjA0QzUwNjIuNzYgLTEyMTkuNDUgNTA4OC4xOCAtMTE5OC44NyA1MDc3LjQ4IC0xMTczLjM2QzUwNjkuOSAtMTE1NS40NiA1MDU1LjYzIC0xMTM4LjQ1IDUwNDQuNDkgLTExMjIuNzlDNTAxNS4wNiAtMTA4MS42MSA0OTgxLjYzIC0xMDQzLjU4IDQ5NDQuNjIgLTEwMDguNjdDNDg3NS41MiAtOTQyLjg4MyA0Nzk1LjcyIC04ODkuNjI3IDQ3MTEuNDcgLTg0Ni42NjVDNDUzNi43MSAtNzU3LjE2IDQzNDEuODkgLTcwOS43MjMgNDE0Ny45NiAtNjg3LjM0N0MzOTI1LjA2IC02NjEuMzkgMzY5OS40OCAtNjYyLjczMyAzNDc2LjEzIC02ODYuODk5QzMwMTguNzMgLTczNi41NzQgMjU3NC43IC04ODIuOTE1IDIxNjAuNTUgLTEwODAuNzJDMTk1NS4wMyAtMTE3OC43MyAxNzU2LjIgLTEyOTAuNjEgMTU2My42MSAtMTQxMS44OUMxMzc3LjI2IC0xNTI5LjU5IDExOTYuMjYgLTE2NTUuMzQgMTAwNi4zNSAtMTc2Ny4yMkM4MjIuMjI3IC0xODc1LjUyIDYyOC4zIC0xOTcxLjI5IDQyMC45OTkgLTIwMjcuMjNDMjQ3LjU3OSAtMjA3NC4yMiAtMC43MzcwNjEgLTIxMDguMjMgLTk3LjQ3NzggLTE5MTIuMjJDLTEyOS4xMyAtMTg0OC4yMiAtMTI2LjQ1NSAtMTc3Mi4xNCAtODQuNTQ5MSAtMTcxMy41MkMtNDkuNzc2MSAtMTY2NC43NCA1LjUwNDE1IC0xNjM3LjQ0IDYwLjc4NDcgLTE2MTcuNzVDMTk2LjMxMSAtMTU2OS40MiAzODEuMzIyIC0xNTYwLjQ3IDQ1Ny4xMDkgLTE0MTcuNzFDNTM5LjU4NCAtMTI2Mi40MSA0NzAuNDgzIC0xMDcwLjQzIDU0NC45MzQgLTkxMi4wMDRDNTU5LjE5OSAtODgxLjU3MiA1NzMuMDIgLTg1Mi4wMzUgNjA3LjM0NyAtODQ1Ljc3QzY0My45MDMgLTgzOS4wNTcgNjgxLjc5NyAtODQzLjA4NSA3MTcuOTA3IC04NTAuNjkzQzc5Ni4zNyAtODY2LjgwNCA4ODIuNDExIC05MTMuNzk0IDk2My45OTQgLTg5OS40NzNDMTA3NC4xMSAtODgwLjIyOSAxMDY1LjY0IC03NTMuNTggMTA5My43MiAtNjcxLjY4M0MxMTE2LjAyIC02MDcuMjQgMTE3OS4zMiAtNTM2Ljk3OSAxMjUyLjg4IC01NjUuNjJDMTI2NC4wMiAtNTcwLjA5NSAxMjY2LjcgLTU4OC40NDQgMTI1Mi44OCAtNTkxLjU3NkM5MTcuNjMgLTY2Ny42NTYgNTY4LjExNSAtNjQ5LjMwNyAyMjYuNjI2IC02NDcuMDdDLTEzNC4wMzQgLTY0NC4zODQgLTQ5NC4yNDggLTY0MC44MDQgLTg1NC45MDcgLTYzNS44ODFDLTEyMTUuNTcgLTYzMC45NTkgLTE1NzUuNzggLTYyNS4xNDEgLTE5MzYuNDQgLTYxOC40MjhDLTIwNjYuNjIgLTYxNS43NDMgLTIyMDMuNDggLTYyMy4zNTEgLTIzMjguNzUgLTU4MC44MzZDLTIzNzYuMDEgLTU2NS4xNzMgLTI0MjIuMzcgLTU0MS45MDEgLTI0NTcuMTUgLTUwNS4yMDRDLTI0NzguNTQgLTQ4Mi44MjggLTI1MTkuNTYgLTQyNy4zMzUgLTI1MDguNDEgLTM5NC4yMTlDLTI1MDAuODQgLTM3MS44NDIgLTI0NjIuNSAtMzQ0Ljk5MSAtMjQ0NS41NSAtMzI4LjQzM0MtMjQxOC44MSAtMzAyLjQ3NiAtMjM5MS4xNyAtMjc3Ljg2MiAtMjM2Mi42MyAtMjUzLjY5NkMtMjMxMS44MSAtMjExLjE4MSAtMjI1Ny44NyAtMTcxLjM1MiAtMjIwMi4xNCAtMTM1LjEwMkMtMjA4NS4zNCAtNTguNTc1NyAtMTk2MC4wNyAzLjYzMDEzIC0xODMwLjc4IDU1LjU0MjdDLTE1NTUuNzIgMTY2LjA4MSAtMTI2NC4xNiAyMjguMjg3IC05NzIuNjAxIDI3My45MzRDLTI4Mi4wNDMgMzgyLjIzNSA0MjAuMTA3IDM5Mi41MjggMTExNi45MSAzNTQuOTM2QzE0NjkuOTkgMzM1LjY5MyAxODIyLjYyIDMwNC4zNjYgMjE3NC4zNyAyNjcuMjIxQzIzMTAuNzggMjUyLjkwMSAyNDQ3LjIgMjMzLjIxIDI1ODQuNTEgMjM4LjU4QzI3MDAuODcgMjQzLjA1NSAyODI1LjY5IDI2Mi43NDYgMjkyMi40MyAzMzEuNjY1QzI5NzAuMTQgMzY1LjY3NyAzMDA1LjggNDEwLjg3NyAzMDI5Ljg3IDQ2My42ODVDMzAzMC43NyA0NTguMzE0IDMwMzEuMjEgNDUyLjk0NCAzMDMyLjEgNDQ3LjU3M0MyODkxLjIzIDU2MC43OTcgMjcyMi4yNyA2MjYuNTgzIDI1NDguODUgNjcwLjg4OEMyMzY1LjE3IDcxNy44NzggMjE3Ni4xNSA3NDcuNDE1IDE5ODguMDIgNzcxLjU4MUMxNTk2LjE1IDgyMS43MDQgMTE5OS4zOCA4MzMuNzg3IDgwNS4yODYgODA4LjcyNUM2MDguNjg0IDc5Ni4xOTUgNDE0Ljc1NyA3NjkuMzQzIDIxOS40OTMgNzQzLjM4N0MxNTMuOTU5IDczNC44ODQgODEuNzM3OCA3MzUuMzMxIDMzLjE0NDUgNzg3LjY5MkMtMi45NjU4MiA4MjYuMTc5IC05LjIwNzI4IDg4MC4zMjkgLTQuNzQ5MjcgOTMwLjg5OUMxLjQ5MjE5IDk5OS4zNyAyMi44OTA5IDEwNjUuMTYgMzguOTQwMiAxMTMxLjM5QzU5LjAwMTUgMTIxNS41MiA3NS40OTYzIDEzMTcuNTYgLTI3LjkzMTQgMTM0OC40NEMtMTA1Ljk0OCAxMzcyLjE2IC0xOTcuNzg1IDEzNTcuMzkgLTI3Ny41ODQgMTM1NC43Qy0zODAuMTIxIDEzNTEuNTcgLTQ4Mi4yMTEgMTM0OC40NCAtNTg0Ljc0NyAxMzQ1LjMxQy0xMDQxLjI2IDEzMzAuOTkgLTE0OTguMjEgMTMxNy4xMSAtMTk1NC43MiAxMzAyLjc5Qy0xOTY3LjY1IDEzMDIuMzQgLTE5NzMuNDQgMTMyMS41OSAtMTk2MS40MSAxMzI3Ljg1Qy0xNTIyLjI4IDE1NTguNzggLTEwODMuMTYgMTc4OS4yNSAtNjQ0LjA0IDIwMjAuMTdDLTQ0Mi41MzQgMjEyNi4yNCAtMjQyLjgxMiAyMjQyLjE0IC0yOS43MTQ2IDIzMjMuNTlDMTY0LjIxMiAyMzk3LjQ0IDM3OS4wOTMgMjQzNi44MiA1ODAuNTk4IDIzNjkuMjRDNzY1LjE2MyAyMzA3LjQ4IDkxNC41MDkgMjE3Mi43OCAxMDQ2LjAyIDIwMzMuMTVDMTE4My43OCAxODg3LjI2IDEzMDcuNzEgMTcyNy45NCAxNDE2LjQ5IDE1NTguNzhDMTYzNS4zOCAxMjE3Ljc2IDE3OTEuODYgODM1LjEyOSAxODcxLjY2IDQzNy4yODFDMTk2My41IC0xOS4xOTM2IDE5NTcuMjYgLTQ4Ni44NTYgMTk2Ny4wNiAtOTUwLjQ5MUMxOTcxLjk3IC0xMTg0LjEgMTk4MS4zMyAtMTQxOC42IDIwMDkuODYgLTE2NTAuODdDMjAyNC41NyAtMTc3Mi4xNCAyMDQ0LjY0IC0xODkyLjk4IDIwNzIuMjggLTIwMTIuMDJDMjA5NS4wMSAtMjExMC4wMiAyMTI0Ljg4IC0yMjA4LjkzIDIxNzkuMjcgLTIyOTQuNEMyMjM0LjEgLTIzNzkuODggMjMxNC4zNSAtMjQ0NS4yMiAyNDE1LjEgLTI0NjUuMzZDMjUwOC43MiAtMjQ4NC4xNSAyNjAzLjY4IC0yNDU3Ljc1IDI2NjIuNTMgLTIzNzkuODhDMjc0Ni4zNCAtMjI2OC40NSAyNzQ5LjkxIC0yMTAwLjYzIDI4NjIuNyAtMjAxMC4yM0MzMDAwLjkgLTE4OTkuMjQgMzE5NC4zOCAtMjAwOS4zMyAzMzExLjYzIC0yMDk4Ljg0QzM0NDcuNiAtMjIwMi42NiAzNTgwIC0yMzU5Ljc0IDM3NTUuMjEgLTIzOTMuNzVDMzc5Ny41NiAtMjQwMS44MSAzODQzLjkyIC0yNDAyLjI2IDM4ODQuMDQgLTIzODUuN0MzOTQyLjQ1IC0yMzYxLjUzIDM5NjEuNjIgLTIzMDcuODMgMzk2Mi41MSAtMjI0OC4zMUMzOTYzLjg0IC0yMTMwLjYxIDM5NDkuMTMgLTIwMTAuNjcgMzkzNy45OSAtMTg5My40MkMzOTI3LjI5IC0xNzgzLjc4IDM5MjUuOTUgLTE2NTguMDMgMzg2OS4zMyAtMTU2MC40N0MzODEyLjcyIC0xNDYyLjQ2IDM3MDEuMjYgLTE0MjQuNDIgMzYwMS44NSAtMTM4NS40OEMzNDkwLjQgLTEzNDEuNjMgMzM3OC41IC0xMjk3Ljc3IDMyNjcuMDQgLTEyNTMuOTFDMzE2My4xNyAtMTIxMy4xOSAzMDU3LjUxIC0xMTYzLjUxIDI5NDYuMDYgLTExNDYuOTVDMjgyNC4zNiAtMTEyOC42MSAyNzA4Ljg5IC0xMTY3LjU0IDI2MDAuNTYgLTEyMjAuMzVDMjUwNC43MSAtMTI2Ny4zNCAyNDEyLjQzIC0xMzIxLjk0IDIzMjMuMjcgLTEzODAuMTFDMTk2Mi42MSAtMTYxNS45NiAxNjUzLjY2IC0xOTIwLjcyIDEzMDQuMTUgLTIxNzEuNzhDOTY4LjQ1MiAtMjQxMi41NSA1NzMuNDY1IC0yNjE2LjE3IDE1MS43MyAtMjYxOS43NUMtMjUuMjU2NiAtMjYyMS4xIC0yMzEuMjIgLTI1OTkuMTcgLTMzOS41NTIgLTI0NDAuNzRDLTQzMS4zODkgLTIzMDYuNDkgLTQzNi43MzkgLTIxMjkuNzIgLTQ0OS42NjcgLTE5NzMuMDhDLTQ2Ny45NDUgLTE3NTQuMjQgLTUzMS42OTYgLTE1NDcuOTMgLTU3Mi43MSAtMTMzMy4xMkMtNjA3LjQ4MyAtMTE0OC43NCAtNjEwLjE1OCAtOTY0LjgxMSAtNTQ2Ljg1MyAtNzg2LjI1Qy00MzYuMjkzIC00NzMuODc4IC0xNjcuMDI0IC0yMTguMzQyIDE1Mi42MjEgLTEzMS45N0MzMjkuMTYyIC04NC4wODQ3IDUwNi4xNDggLTEwNS4xMTggNjg0LjQ3MiAtMTMwLjYyN0M4NzQuMzg2IC0xNTcuOTI2IDEwOTEuOTQgLTE5Ni40MTMgMTI2OC45MyAtOTcuOTU3OEMxNDUyLjYgNC41MjUxNSAxNTIxLjcgMjIzLjM2NCAxNTA5LjIyIDQyMy40MDdDMTUwMS42NCA1NDIuNDQ5IDE0NjkuMSA2NTguMzU3IDE0MjkuODYgNzcwLjIzOEMxNDAwIDg1Ni4xNjMgMTMzMS4zNCA5NjUuMzU5IDEzODIuNjEgMTA1NS4zMUMxNDAyLjIyIDEwODkuMzIgMTQzMi4wOSAxMTE3LjA3IDE0NTguODQgMTE0NC44MkMxNDk2LjI5IDExODMuNzUgMTUzMy43NCAxMjIyLjI0IDE1NzIuOTcgMTI1OS4zOEMxNjQxLjYyIDEzMjMuODMgMTcxNS4xOCAxMzg0LjI0IDE3OTcuNjYgMTQzMC4zNEMxOTc2Ljg3IDE1MzAuMTMgMjE2Ny4yMyAxNTI2LjU1IDIzNTYuNyAxNDU4LjUzQzI0NTYuNTYgMTQyMi43MyAyNTUxLjk3IDEzNzYuMTkgMjY0OS4xNSAxMzM0LjEyQzI3NTIuNTggMTI4OS4zNyAyODU3LjM1IDEyNDguNjQgMjk2My44OSAxMjExLjk0QzMxNjkuNDEgMTE0MC43OSAzMzgwLjI4IDEwODQuODUgMzU5My4zOCAxMDQzLjY4QzQwMjQuMDMgOTYwLjg4MyA0NDY2LjcyIDkzOC45NTUgNDkwMy4xNiA5ODAuMTI3QzUxMTguNDkgMTAwMC4yNyA1MzMyLjAzIDEwMzYuMDcgNTU0Mi40NiAxMDg2LjY0QzU1NTkuNCAxMDkwLjY3IDU1NjYuNTMgMTA2NC43MSA1NTQ5LjU5IDEwNjAuNjhDNDcwNS42NyA4NTcuNTA1IDM4MDcuMzcgODk4LjIzIDI5ODQuODUgMTE3Ni4xNEMyODgxLjg3IDEyMTEuMDUgMjc4MC4yMiAxMjQ5LjU0IDI2NzkuOTEgMTI5MS42QzI1NzguNzEgMTMzNC4xMiAyNDgwLjE5IDEzODIuOSAyMzc4LjEgMTQyMS44M0MyMjc0LjIzIDE0NjEuMjEgMjE2My42NyAxNDkwLjc1IDIwNTEuNzcgMTQ4Mi43QzE5NDkuMjMgMTQ3NS4wOSAxODUyLjQ5IDE0MzUuMjYgMTc2Ni45IDEzNzkuNzdDMTY4MS4zIDEzMjQuNzIgMTYwNS45NiAxMjU1LjM1IDE1MzQuMTggMTE4My43NUMxNTAyLjk4IDExNTIuNDIgMTQ3MS43NyAxMTIwLjY1IDE0NDEuOSAxMDg3Ljk4QzE0MjMuNjIgMTA2Ny44NCAxNDA1LjM1IDEwNDcuMjYgMTM5Ni40MyAxMDIwLjg1QzEzODIuNjEgOTgwLjU3NCAxMzk1LjU0IDk0MC4yOTcgMTQwOS4zNiA5MDIuMjU4QzE0ODIuMDIgNzAyLjY2MiAxNTYwLjA0IDQ5Ni4zNTQgMTUzMS4wNiAyNzkuNzUyQzE1MDcuNDQgMTAzLjg3NSAxNDE0LjI2IC02Mi4xNTU4IDEyNDguODcgLTEzNy4zNEMxMDgyLjU4IC0yMTIuOTcxIDg5Mi4yMTkgLTE4Ni41NjcgNzE3LjkwNyAtMTYxLjk1NEM1MjYuNjU1IC0xMzUuMTAyIDMzOC4wNzggLTEwNi45MDggMTQ4LjYwOSAtMTYwLjYxMUMtMjEuMjQ0NCAtMjA4Ljk0NCAtMTc1Ljk0IC0zMDYuNTA0IC0yOTguMDkyIC00MzQuMDQ4Qy00MjAuMjQ0IC01NjEuNTkzIC01MTAuNzQzIC03MjAuNDYzIC01NTAuNDIgLTg5My4yMDhDLTU5OS4wMTMgLTExMDMuNTQgLTU1My4wOTUgLTEzMTMuODggLTUwMy4xNjQgLTE1MTkuMjlDLTQ3Ny4zMDcgLTE2MjQuOTEgLTQ1MS4wMDQgLTE3MzAuMDggLTQzNi43MzkgLTE4MzcuOTNDLTQyNC43MDIgLTE5MjUuNjQgLTQyMC42ODkgLTIwMTQuMjUgLTQxMS43NzMgLTIxMDEuOTdDLTM5Mi42MDQgLTIyODIuMzIgLTM0NC45MDIgLTI0NzkuMjMgLTE1Ni43NyAtMjU0OS45NEMtNTYuMDE3MyAtMjU4Ny41MyA1OC41NTU0IC0yNTkzLjggMTY1LjU1IC0yNTkyLjAxQzI3Mi45OSAtMjU4OS43NyAzNzkuOTg0IC0yNTc0LjExIDQ4NC4zMDMgLTI1NDguMTVDNjk0LjI4IC0yNDk1LjM0IDg5Mi4yMTkgLTI0MDEuODEgMTA3Ni43OCAtMjI4OS40OEMxNDQzLjY5IC0yMDY2LjYxIDE3NTMuNTIgLTE3NjQuNTQgMjA5NS40NiAtMTUwNy4yMUMyMjY0Ljg3IC0xMzc5LjY3IDI0NDQuOTcgLTEyNTYuMTUgMjY0MC4yNCAtMTE3MS41N0MyNzMzLjQxIC0xMTMxLjI5IDI4MzEuOTMgLTExMDUuNzggMjkzNC4wMiAtMTExNy44NkMzMDQxLjQ2IC0xMTMwLjg0IDMxNDIuNjYgLTExNzYuMDQgMzI0Mi41MyAtMTIxNS40MkMzMzUzLjk4IC0xMjU5LjI4IDM0NjUuODggLTEzMDMuMTQgMzU3Ny4zMyAtMTM0N0MzNjYzLjgxIC0xMzgxLjAxIDM3NTguMzMgLTE0MTAuOTkgMzgyOS42NiAtMTQ3Mi43NUMzOTA0LjU1IC0xNTM3LjE5IDM5MzEuMyAtMTYzMS42MiAzOTQ0LjY3IC0xNzI2LjA1QzM5NjAuNzIgLTE4MzguODMgMzk2OS42NCAtMTk1Mi45NCAzOTc3LjY2IC0yMDY2LjE3QzM5ODEuNjggLTIxMjIuMTEgMzk4Ni41OCAtMjE3OC4wNSAzOTg3LjQ3IC0yMjMzLjk5QzM5ODguMzYgLTIyNzcuODUgMzk4My45MSAtMjMyMi42IDM5NTguMDUgLTIzNTkuM0MzOTE3LjkzIC0yNDE2LjU4IDM4NDIuNTggLTI0MzAuOSAzNzc3LjA1IC0yNDI0LjE5QzM2MDguOTggLTI0MDcuMTggMzQ3NC4zNSAtMjI2OCAzMzUwLjQxIC0yMTY1LjUyQzMyMjYuNDggLTIwNjMuMDMgMjk4Ni42MyAtMTg5MS42MyAyODQ3LjA5IC0yMDYwLjhDMjc1NC44MSAtMjE3Mi42OCAyNzU1LjcgLTIzNDAuNSAyNjQyLjAyIC0yNDM4Ljk1QzI1MjEuNjUgLTI1NDIuNzggMjMzMy41MiAtMjQ5OS44MiAyMjI2LjUzIC0yMzk3LjMzQzIwODMuODcgLTIyNjAuODQgMjA0NC42NCAtMjA0NS4xMyAyMDExLjY1IC0xODU4Ljk2QzE5MzAuNTEgLTE0MDAuNyAxOTQxLjIxIC05MzMuOTMyIDE5MjguNzMgLTQ3MC4yOThDMTkxNi42OSAtMTguMjk4NiAxODc1LjY3IDQzMS40NjMgMTcyNC45OSA4NjAuMTlDMTU4Ny4yNCAxMjUzLjEyIDEzNzMuNjkgMTYxOS4xOSAxMDk5LjUyIDE5MzEuNTZDOTY2LjIyMyAyMDgyLjgzIDgxNy4zMjMgMjIzNy4yMiA2MzAuNTI5IDIzMjAuMDFDNDE3LjQzMiAyNDEzLjk5IDE4NS42MTEgMjM3Ny43NCAtMjUuMjU2NiAyMjk3LjE5Qy0yNDYuMzc4IDIyMTMuMDYgLTQ1My42NzkgMjA5MC44OCAtNjYyLjc2NCAxOTgwLjc5Qy04NzkuODczIDE4NjYuNjcgLTEwOTYuOTggMTc1Mi41NSAtMTMxNC4wOSAxNjM4LjQzQy0xNTI2LjMgMTUyNyAtMTczOC41IDE0MTUuNTcgLTE5NTAuNzEgMTMwNC4xM0MtMTk1Mi45NCAxMzEyLjY0IC0xOTU1LjE2IDEzMjAuNjkgLTE5NTcuMzkgMTMyOS4yQy0xNTQyLjM1IDEzNDIuMTcgLTExMjYuODUgMTM1NC43IC03MTEuODAzIDEzNjcuNjhDLTUxMy40MTggMTM3My45NSAtMzEyLjgwMyAxMzg5LjE2IC0xMTQuNDE4IDEzODUuNThDLTU3LjgwMDUgMTM4NC42OSA3LjczMzQgMTM3Ni42MyA0Ny44NTYyIDEzMzEuODhDOTIuNDM3MyAxMjgyLjY1IDgxLjI5MTcgMTIxMS41IDY4LjM2MzMgMTE1MS45OEM0My44NDQgMTAzNS42MiAtNjAuOTIxMSA3ODEuNDI3IDE0MC4xMzkgNzY1Ljc2M0MxODMuMzgyIDc2Mi4xODMgMjI3LjUxNyA3NzEuNTgxIDI2OS44NjkgNzc4LjI5NEMzMTguOTA4IDc4NS45MDIgMzY3Ljk0NyA3OTIuNjE1IDQxNi45ODYgNzk4Ljg4QzUxOC4xODUgODExLjg1OCA2MTkuODMgODIyLjE1MSA3MjEuOTIgODI5Ljc1OUMxMTE4LjY5IDg2MC4xOTEgMTUxOC4xMyA4NTIuNTgzIDE5MTMuMTIgODA2LjkzNUMyMTIzLjEgNzgyLjc2OSAyMzMzLjk3IDc1MS40NDIgMjUzOS40OCA2OTkuOTc3QzI3MjIuMjcgNjU0LjMzIDI5MDAuMTQgNTg1LjQxMSAzMDQ4LjE1IDQ2Ni4zN0MzMDUzLjA2IDQ2Mi4zNDIgMzA1Mi42MSA0NTUuMTgyIDMwNTAuMzggNDUwLjI1OUMyOTU1LjQyIDI0My4wNTUgMjcwNi4yMiAyMDcuMjUzIDI1MDMuMzcgMjExLjI4MUMyMzU5LjgyIDIxNC40MTQgMjIxNi43MiAyMzUuODk1IDIwNzQuNTEgMjUwLjY2M0MxOTAxLjA5IDI2OC41NjQgMTcyNy42NyAyODQuNjc1IDE1NTQuMjUgMjk4LjU0OEM4NjcuMjUzIDM1My41OTQgMTc0LjkxMiAzNzEuOTQyIC01MTEuNjM0IDMwNS43MDlDLTgyNy4yNjcgMjc1LjI3NyAtMTE0NC4yNCAyMzAuNTI1IC0xNDUxLjQgMTUxLjMxM0MtMTcyNS41NyA4MC42MDQyIC0xOTk1LjI5IC0yMS40MzE0IC0yMjI5LjM0IC0xODMuNDM1Qy0yMjg5LjUyIC0yMjUuMDU1IC0yMzQ2LjU5IC0yNzAuMjU1IC0yNDAwLjUzIC0zMTkuOTNDLTI0MjQuNiAtMzQyLjMwNiAtMjQ0OS4xMiAtMzY0LjY4MiAtMjQ3MC45NyAtMzg5LjI5NkMtMjQ4My44OSAtNDAzLjYxNyAtMjQ4NC43OSAtNDA2LjMwMiAtMjQ3OC41NCAtNDI0LjY1Qy0yNDcyLjc1IC00NDAuNzYxIC0yNDY0LjcyIC00NTUuOTc3IC0yNDU0LjQ3IC00NjkuODVDLTIzODQuOTIgLTU2Mi45MzUgLTIyNDQuMDUgLTU4MS43MzEgLTIxMzYuNjEgLTU4Ny4xMDFDLTE5NjUuODYgLTU5NS42MDQgLTE3OTMuNzggLTU5NC4yNjIgLTE2MjMuMDQgLTU5Ny4zOTVDLTE0NDguMjggLTYwMC41MjcgLTEyNzMuNTIgLTYwMy4yMTIgLTEwOTguNzcgLTYwNS44OTdDLTc0Ni41NzYgLTYxMC44MiAtMzk0LjM4NiAtNjE1LjI5NSAtNDIuMTk3MyAtNjE3Ljk4QzEzMi41NiAtNjE5LjMyMyAzMDYuODcxIC02MjAuNjY2IDQ4MS42MjkgLTYyMS41NjFDNjQ4LjM2MSAtNjIyLjQ1NiA4MTUuMDk0IC02MjIuOTAzIDk4MS4zODEgLTYwNy4yNEMxMDY5LjY1IC01OTguNzM3IDExNTcuMDMgLTU4NS4zMTEgMTI0My41MiAtNTY1LjYyQzEyNDMuNTIgLTU3NC4xMjMgMTI0My41MiAtNTgzLjA3MyAxMjQzLjUyIC01OTEuNTc2QzExNjEuOTMgLTU2MC4yNSAxMTE4LjI0IC02NjQuNTIzIDExMDUuMzIgLTcyNi43MjlDMTA5My43MiAtNzgxLjc3NCAxMDg1LjcgLTg0Mi42MzcgMTA0NC42OSAtODg0LjcwNUM5NzMuMzU2IC05NTguNTQ2IDg2Ni44MDggLTkyMS40MDEgNzgyLjU1IC04OTYuNzg4QzczMS4yODIgLTg4MS41NzIgNjY1Ljc0OCAtODU3Ljg1MyA2MTEuODA1IC04NzIuMTc0QzU2MC41MzcgLTg4Ni4wNDcgNTQzLjU5NiAtOTgzLjE2IDUzNi40NjMgLTEwMjguMzZDNTE4LjYzMSAtMTE0Mi45MyA1MzQuNjggLTEyNjIuNDEgNTAwLjc5OCAtMTM3NC4zQzQzNy45MzkgLTE1ODEuMDUgMjE3LjI2NCAtMTU4NC4xOCA0OC4zMDIgLTE2NTAuODdDLTU2LjkwODkgLTE2OTIuNDggLTEzNC4wMzQgLTE3ODkuMTUgLTc0LjI5NTcgLTE5MDQuNjFDNS41MDQzOSAtMjA1OC41NiAxOTcuMjAyIC0yMDUxLjQgMzQyLjA5IC0yMDE5LjE4QzYyNi45NjIgLTE5NTYuMDggODg1Ljk3OCAtMTgxMy4zMiAxMTMwLjczIC0xNjU4LjkyQzEzNzkuNDkgLTE1MDIuMjkgMTYyMS4xMiAtMTMzNS4zNiAxODc5LjI0IC0xMTkzLjk0QzIzOTUuOTMgLTkxMS41NTYgMjk2My40NSAtNzAyLjU2MiAzNTUyLjgxIC02NTIuODg3QzM4MjcuODcgLTYyOS42MTYgNDExMi4zIC02MzguMTE5IDQzODEuNTcgLTcwMS42NjdDNDYxNC4yOCAtNzU2LjcxMyA0ODQ4LjMzIC04NTkuMTk2IDUwMDkuNzEgLTEwNDEuMzRDNTA0Ny42MSAtMTA4NC4zIDUwODEuMDQgLTExMzEuMjkgNTEwOS4xMyAtMTE4MC45N0M1MTExLjM2IC0xMTg0Ljk5IDUxMTEuOCAtMTE5MC44MSA1MTA5LjEzIC0xMTk0LjM5QzQ5NjMuNzkgLTE0MDYuNTIgNDc0Ny4xMyAtMTU0OC4zOCA0NTE3LjU0IC0xNjU0LjQ1QzQ0MDAuMjkgLTE3MDkuMDQgNDI3OS40OCAtMTc1NS4xNCA0MTU4LjIyIC0xNzk5LjQ0QzQwMTEuOTkgLTE4NTMuMTUgMzg2NC40MyAtMTkwNy43NCAzNzEwLjYyIC0xOTM0LjE1QzM1NjYuNjMgLTE5NTguNzYgMzQxNy4yOCAtMTk1Ni45NyAzMjc5Ljk3IC0xOTAxLjkzQzMxNzIuNTMgLTE4NTguNTIgMzA3OC45MSAtMTc4Ni45MSAzMDAyLjIzIC0xNzAwLjU0QzI4MjIuMTMgLTE0OTcuODEgMjczOS4yMSAtMTIzNi45MSAyNjcxLjQ0IC05NzkuMTMyQzI2MzIuMjEgLTgzMS4wMDIgMjU5Ni4xIC02ODEuNTI5IDI1NDIuMTYgLTUzNy40MjZDMjQ5Mi42NyAtNDA0LjUxMiAyNDI0LjQ3IC0yODEuODkgMjM0OS4xMiAtMTYyLjQwMUMyMjEzLjE1IDUyLjg1NzcgMjA1MS43NyAyNjIuNzQ2IDE5NzkuOTkgNTExLjEyMkMxOTQ0Ljc3IDYzMi44NDggMTkzNi4zIDc1OS40OTggMTk1OC41OSA4ODQuMzU3QzE5ODQuMDEgMTAyNi42NyAyMDQ1LjUzIDExNjAuMDMgMjExMS45NSAxMjg3LjEzQzIyNTAuMTUgMTU1MS42MSAyNDQyLjMgMTgzOC4wMyAyMzkxLjAzIDIxNTIuMTlDMjM0Ny43OSAyNDE0Ljg5IDIxMjIuMjEgMjU3OC4yMyAxODg4LjE2IDI2NjQuNjFDMTYxOS43OCAyNzYzLjk2IDEzMTguODYgMjc5NC44NCAxMDM0Ljg4IDI3ODUuODlDNDcxLjgyMSAyNzY4LjQzIC0xMDcuMjg1IDI1MjUuODcgLTQwNC42NCAyMDIzLjMxQy00NzkuOTgyIDE4OTUuNzYgLTUzOS43MiAxNzUxLjY2IC01NDguMTkxIDE2MDEuNzRDLTU1Ny41NTMgMTQ0MC42MyAtNDk1LjEzOSAxMjkyLjk1IC0zODguMTQ1IDExNzQuOEMtMjE1LjYxNyA5ODUuNDk3IDUxLjQyMjYgODk0LjY1IDMwMy4zMDUgOTI1LjA4MkMzNjUuNzE4IDkzMi42ODkgNDI3LjY4NiA5NDcuOTA1IDQ4Ni41MzIgOTcxLjE3N0M1NTIuNTEyIDk5Ny4xMzMgNjEzLjU4OCAxMDM0LjI4IDY3OS41NjggMTA2MC42OEM3OTUuMDMyIDExMDYuNzggOTEyLjI4MSAxMDkyLjkgMTAxMS43IDEwMTcuMjdDMTIyNS42OCA4NTQuMzczIDEyNDAuNCA1NjguNDA1IDEzODguODUgMzYwLjc1NEMxNTM4LjY0IDE1MS4zMTMgMTgyMS4yOSAxMzMuODYgMTk5NS4xNSAtNDUuMTQ5OUMyMTc0LjM3IC0yMjkuOTc3IDIxNDQuNSAtNTE2Ljg0IDIwNTEuNzcgLTczNS42NzlDMTk5Mi40OCAtODc0Ljg1OSAxOTEwLjg5IC0xMDAyLjQgMTgzOS4xMiAtMTEzNC44N0MxNzgwLjcyIC0xMjQzLjE3IDE3MzEuMjMgLTEzNTUuOTUgMTY4MS43NSAtMTQ2OC43MkMxNTg5LjQ2IC0xNjc5LjA2IDE0OTYuNzQgLTE4OTkuNjkgMTMzOS4zNyAtMjA3MC42NEMxMjY1LjgxIC0yMTUwLjMgMTE3OC44NyAtMjIxNS4xOSAxMDc5LjQ2IC0yMjU4LjZDMTA2OC4zMSAtMjI2My41MyAxMDU4LjA2IC0yMjU1LjQ3IDEwNTkuODQgLTIyNDMuMzlDMTA5NC4xNyAtMjAwNC40MSAxMTMxLjE3IC0xNzUwLjIyIDEyNzguNzQgLTE1NTEuNTJDMTM5Ny43NyAtMTM5MC44NSAxNTgyLjc4IC0xMjc4LjA4IDE3ODcuNCAtMTMwNC4wM0MxOTg0LjAxIC0xMzI4LjY1IDIxNDQuOTQgLTE0NjcuMzggMjI2NC40MiAtMTYxNi44NUMyMzk1LjQ5IC0xNzgwLjY1IDI0NzkuMyAtMTk3Mi4xOSAyNTgyLjI4IC0yMTUzLjg4QzI2OTYuNDEgLTIzNTUuMjcgMjg0MC44NSAtMjU1Ni42NSAzMDY3LjMyIC0yNjM2Ljc2QzMwNjIuNDIgLTI2MzkgMzA1Ny4wNyAtMjY0MC43OSAzMDUyLjE2IC0yNjQzLjAzQzMyODcuMTEgLTIyODQuMTEgMzQ1NC43MyAtMTg4Mi42OCAzNTQzLjg5IC0xNDYyLjQ2QzM1ODUuOCAtMTI2NC4yIDM2NTYuMjQgLTk5Ni4xMzggMzQ1OS4xOSAtODU4LjMwMUMzMjc3LjMgLTczMS4yMDQgMzA0OS4wNCAtNzk1LjY0NyAyODcwLjcyIC04OTMuNjU1QzIyMjAuMjggLTEyNTAuMzMgMTg2MC45NiAtMTk0Ni4yMyAxNDAzLjU2IC0yNTAxLjE2QzEzNDUuNjEgLTI1NzEuODcgMTI4NS40MiAtMjY0MC43OSAxMjIzLjAxIC0yNzA3LjAyQzExNjEuNDkgLTI3NzIuMzYgMTA5Ni44NSAtMjg0My4wNyAxMDEyLjU5IC0yODc4LjQyQzk0My40ODcgLTI5MDcuMDYgODY1LjkxNiAtMjkwMC44IDgwOC44NTMgLTI4NDkuMzNDNzU1LjM1NSAtMjgwMC41NSA3MjkuNDk5IC0yNzI2LjcxIDcxMi41NTggLTI2NTcuNzlDNjU5Ljk1MiAtMjQ0Mi45OCA2MzIuNzU4IC0yMjE4LjMzIDYwOC42ODQgLTE5OTguNTlDNTgyLjgyNyAtMTc2Ni4zMyA1NjguMTE1IC0xNTMzLjE3IDU2NC41NDkgLTEyOTkuNTZDNTYwLjk4MiAtMTA2NS45NSA1NjguMTE1IC04MzIuMzQ0IDU4Ni4zOTQgLTU5OS4xODRDNTk0LjQxOCAtNDk3LjE0OSA1OTkuNzY4IC0zOTIuNDI4IDYxOS4zODQgLTI5MS43MzZDNjMyLjMxMiAtMjI1LjUwMiA2NTYuODMyIC0xNTEuMjEzIDcxNC4zNDEgLTExMC4wNDFDNzgzLjg4NyAtNjAuMzY1NyA4NjYuODA4IC04Ni43Njk4IDkzNy4yNDYgLTExOS44ODZDMTAzNS4zMiAtMTY2LjQyOSAxMTMwLjI4IC0yMTkuNjg0IDEyMjUuNjggLTI3MS4xNDlDMTQxNC43MSAtMzczLjE4NSAxNjA1LjUxIC00NzYuMTE1IDE4MTAuNTkgLTU0My42OTJDMjEzMy44IC02NTAuMjAyIDI1MzYuMzYgLTY1Ni45MTUgMjgxMC41NCAtNDI0LjY1QzI5NDYuMDYgLTMwOS42MzYgMzA3Mi4yMyAtOTcuNTEwNSAyOTgwLjgzIDgwLjYwNEMyOTY3LjAxIDEwNy45MDMgMjk0Ni41MSAxMDEuNjM4IDI5MTguNDIgMTAxLjE5QzI4OTQuMzUgMTAwLjc0MyAyODcwLjcyIDEwMC4yOTUgMjg0Ni42NSA5OS40MDAxQzI3OTQuNDkgOTcuMTYyNiAyNzQyLjMzIDkzLjEzNSAyNjkwLjYxIDg3Ljc2NDZDMjU4OC41MiA3Ny4wMjM5IDI0ODYuODggNTkuNTcwNiAyMzg3LjAyIDM2Ljc0NjhDMTU2MS4zOCAtMTQ5Ljg3MSA4NjguNTkxIC02NjguMTAzIDE0OS45NDcgLTEwODguMzNDLTIxOC43MzggLTEzMDQuMDMgLTYwMy40NzEgLTE1MDEuMzkgLTEwMTMuNjIgLTE2MjQuNDZDLTEyMTEuMTEgLTE2ODMuNTMgLTE0MTMuOTUgLTE3MjQuNzEgLTE2MTkuOTIgLTE3MzkuNDhDLTE4MTEuNjEgLTE3NTIuOSAtMjAxNS43OSAtMTc1MC4yMiAtMjIwMy4wMyAtMTcwMi4zM0MtMjI3NS4yNiAtMTY4My45OCAtMjM0Ny40OCAtMTY1NS43OSAtMjQwNi43NyAtMTYwOS42OUMtMjQzMi42MyAtMTU4OS41NSAtMjQ1NS44MSAtMTU2Ni4yOCAtMjQ3NC4wOSAtMTUzOC45OEMtMjQ4Ny40NiAtMTUxOC44NSAtMjUxMy43NiAtMTQ3Ni43OCAtMjUwOS43NSAtMTQ1MS4yN0MtMjUwNi4xOCAtMTQzMS4xMyAtMjQ4NC43OSAtMTQwNS42MiAtMjQ3NC41MyAtMTM4OC4xN0MtMjQ2Mi45NCAtMTM2OC40OCAtMjQ1MC45IC0xMzQ4Ljc5IC0yNDM4Ljg3IC0xMzI5LjU0Qy0yNDEyLjEyIC0xMjg3LjAzIC0yMzg0LjAzIC0xMjQ1LjQxIC0yMzU0LjYxIC0xMjA0LjY4Qy0yMzAwLjY3IC0xMTI5Ljk1IC0yMjQyLjcxIC0xMDU3LjkgLTIxODEuNjQgLTk4OC41M0MtMTkxOC4xNiAtNjkwLjQ3OSAtMTYwMi41MyAtNDQ1LjY4NCAtMTI5Mi4yNSAtMTk5Ljk5M0MtNjEyLjgzMyAzMzQuMzUgMzUuMzczNSA5MDMuNiA2NTEuOTI4IDE1MDYuODZDMTI2NS44MSAyMTA3Ljg5IDE4NDguOTMgMjc0MC42OSAyMzk2LjgyIDM0MDMuMDJDMjUzMS40NiAzNTY1LjQ3IDI2NjMuODYgMzczMC4xNiAyNzk0LjQ5IDM4OTYuMTlDMjgwMC43MyAzODg5LjkzIDI4MDYuOTcgMzg4My42NiAyODEzLjIxIDM4NzcuNEMyNDIxLjc5IDM0NzEuNDkgMjExMC42MiAyOTg5Ljk2IDE5MDAuNjQgMjQ2NS45MUMxNzk2LjMyIDIyMDUuNDUgMTcxNi41MiAxOTM0LjcgMTY2NC4zNiAxNjU4LjU3QzE2MDUuMDcgMTM0My45NiAxNTgyLjc4IDEwMTMuMjQgMTY2Ni41OSA3MDEuMzJDMTczNS4yNCA0NDUuNzgzIDE4NzguNzkgMTg5LjggMjEwMS43IDM4LjUzNzFDMjE2Ni4zNCAtNS4zMjAzMSAyMjQ2LjE0IC00MS4xMjIzIDIzMjUuMDUgLTIwLjA4ODlDMjM5MS40OCAtMi4xODc3NCAyNDM2LjA2IDU2LjQzOCAyNDYxLjkxIDExNi44NTRDMjUxNC45NiAyNDAuMzcgMjUxMi4yOSAzOTAuNzM4IDI0ODYuODggNTIwLjUyQzI0MzIuOTQgNzk3Ljk4NSAyMjU3LjI5IDEwMzYuMDcgMjAyNS45MSAxMTkzLjE1QzE4MDAuMzMgMTM0Ni4yIDE1MTUuMDEgMTQ0Mi44NyAxMjQyLjE4IDE0NDkuMTNDMTEwMy4wOSAxNDUyLjI2IDk1Ny4zMDcgMTQyNC45NyA4NDcuNjM4IDEzMzMuNjdDNzQ0LjY1NiAxMjQ4LjE5IDY4NS44MDkgMTEyMS45OSA2NTQuMTU3IDk5My41NTJDNTg1LjA1NiA3MTIuMDYgNjIwLjcyMSA0MDEuNDc5IDcyNS45MzIgMTMzLjg2Qzc1NC4wMTggNjIuNzAzMSA3ODcuODk5IC01Ljc2NzgyIDgyNi4yMzkgLTcyLjAwMTVDODE3Ljc2OSAtNzQuMjM5IDgwOS43NDQgLTc2LjQ3NjYgODAxLjI3NCAtNzguNzE0NEM3NzYuMzA5IDUxMy44MDcgNjU1Ljk0IDExMDEuNDEgNDQ1LjUxOCAxNjU1Ljg5QzM5MS4xMjkgMTc5OS41NCAzMzAuMDUzIDE5NDAuOTYgMjYzLjYyOCAyMDc5LjI1QzIzNy4zMjUgMjEzNC4yOSAyMTAuNTc3IDIyMTMuNSAxNTYuMTg4IDIyNDcuOTZDODUuNzUgMjI5Mi43MSAzNC4wMzYxIDIyMTkuMzIgOS45NjI0IDIxNjEuMTRDLTQ3LjU0NjkgMjAyMS41MiAtODQuMTAzMyAxODY4LjQ2IC0xMjEuNTUxIDE3MjIuNTdDLTE2MC4zMzcgMTU3MS43NSAtMTkyLjg4MSAxNDE5LjE1IC0yMTkuMTg0IDEyNjYuMDlDLTI2Mi44NzMgMTAxMy42OSAtMjg4LjI4NCA3MTIuNTA4IC01MDYuMjg0IDU0Mi44OTZDLTUxMi41MjYgNTM3Ljk3NCAtNTE5LjIxMyA1MzcuOTc0IC01MjUuMDA5IDU0Mi44OTZDLTgxMy40NDcgNzc5LjYzNiAtMTA3Mi4wMiAxMDUwLjg0IC0xMjk1LjM3IDEzNTAuMjNDLTE0MDguMTYgMTUwMS4wNCAtMTUxMS4xNCAxNjU5LjAyIC0xNjA0Ljc2IDE4MjIuODFDLTE2NTEuNTcgMTkwNC43MSAtMTY5NS43IDE5ODcuOTUgLTE3MzYuNzIgMjA3Mi41M0MtMTc2Ni41OSAyMTMzLjg0IC0xNzkwLjIyIDIxOTguNzMgLTE3OTYuOSAyMjY3LjIxQy0xODAyLjI1IDIzMjQuMDQgLTE3OTQuMjMgMjM4Ny4xNCAtMTc1My42NiAyNDMwLjFDLTE2OTkuNzIgMjQ4Ny4zOSAtMTYxOC4xMyAyNDgxLjU3IC0xNTQ4LjE0IDI0NjUuMDFDLTEzMzQuMTUgMjQxNC40NCAtMTEyMS45NSAyMzUyLjIzIC05MDkuMjk2IDIyOTUuODVDLTQ4My41NDggMjE4Mi42MiAtNTcuODAwNSAyMDY5Ljg1IDM2Ny45NDcgMTk1Ni42MkM1NDQuMDQyIDE5MTAuMDggNzUzLjEyNiAxODI1LjUgOTM2LjM1NCAxODc3LjQxQzExMjEuODEgMTkzMC4yMiAxMTc3LjA5IDIxMzUuNjMgMTE5OC45NCAyMzA1LjY5QzEyMTcuMjEgMjQ0OC45IDEyMTIuMzEgMjYwOC4yMiAxMTQ2Ljc4IDI3MzkuNzlDMTExNS41NyAyODAyLjQ0IDEwNjkuNjUgMjg1Ni41OSAxMDA4LjEzIDI4OTAuNjFDOTE2LjczOCAyOTQxLjE4IDgxMC4xOSAyOTM2LjcgNzEwLjMyOSAyOTE5LjdDMzU1LjQ2NSAyODU4LjM4IDcuMjg3NiAyNzI0LjU4IC0zMDcuODk5IDI1NTIuMjhDLTYyNC40MjQgMjM3OS41MyAtOTE0LjY0NiAyMTU4LjkgLTExNjUuMTkgMTg5OS4zNEMtMTI5Ni4yNiAxNzYzLjI5IC0xNDEwLjgzIDE2MTUuMTYgLTE1MjYuNzQgMTQ2Ni41OUMtMTY0Mi4yMSAxMzE4LjkgLTE3NjUuMjUgMTE3My40NiAtMTkyMy4wNyAxMDY5LjE4Qy0yMDY1LjI4IDk3NS4yMDQgLTIyMzguMjUgOTEyLjk5OCAtMjQxMC4zNCA5MzYuMjdDLTI1NTIuOTkgOTU1LjUxMyAtMjY4OS44NiAxMDM4Ljc1IC0yNzY3LjQzIDExNjAuOTNDLTI4MDYuMjEgMTIyMS4zNCAtMjgyNy4xNyAxMjkwLjI2IC0yODI4LjUgMTM2Mi4zMUMtMjgyOC41IDEzNjkuOTIgLTI4MjIuMjYgMTM3NS4yOSAtMjgxNS4xMyAxMzc1Ljc0Qy0xNzc5LjUyIDE0MjQuMDcgLTg2OS4xNzMgODQ4LjEwNyAyOC42ODY1IDQxNC45MDRDMTQxLjkyMiAzNjAuMzA2IDI1NS42MDMgMzA3LjQ5OSAzNzEuMDY4IDI1Ny44MjRDNDcxLjM3NSAyMTQuODYxIDU4NC42MTEgMTU0Ljg5MyA2OTcuNCAxNjMuODQ0Qzg1MS42NSAxNzYuMzc0IDg0Ni43NDYgMzQ0LjE5NiA4MjQuNDU2IDQ2MC41NTJDODEzLjc1NyA1MTYuNDkyIDc5Ni44MTYgNTcxLjUzOCA3NzMuNjM0IDYyMy40NTFDNzQ4LjY2OCA2NzkuODM5IDcxMS42NjYgNzU0LjEyNyA2NDYuNTc4IDc3MS41ODFDNTc2LjE0IDc5MC4zNzcgNTQxLjgxMyA3MDQuMDA1IDUxNS41MSA2NTQuNzc3QzQ4Ni41MzIgNjAwLjE3OSA0NTkuNzg0IDU0My43OTIgNDM1LjI2NCA0ODYuOTU2QzM4OC45IDM3OC4yMDggMzUxLjQ1MiAyNjYuMzI3IDMxOS4zNTQgMTUyLjY1NkMyNTUuMTU3IC03NS4xMzQgMjEzLjY5NyAtMzA4LjI5NCAxNzEuMzQ1IC01NDEuMDA2QzE0OS41MDEgLTY2MC4wNDggMTI3LjY1NiAtNzc5LjUzNyAxMDIuNjkxIC04OTguMTNDODIuNjI5NCAtOTkzLjkwMSA2OS4yNTQ5IC0xMTA0LjQ0IDE3LjA5NTIgLTExODkuNDdDLTM4LjYzMDkgLTEyODEuMjEgLTEzMS44MDUgLTEyODguMzcgLTIyOC45OTEgLTEyNjguNjhDLTMzMy4zMTEgLTEyNDcuNjUgLTQzNy4xODQgLTEyMTkuOSAtNTM4LjgyOSAtMTE4OS4wMkMtNzQ2LjEzIC0xMTI1LjkyIC05NDkuNDE5IC0xMDQxLjc5IC0xMTMyLjY1IC05MjQuNTM0Qy0xMzAxLjYxIC04MTYuNjgxIC0xNDcwLjU3IC02NzQuODE2IC0xNTcyLjIxIC00OTguOTM5Qy0xNjYyLjI3IC0zNDMuNjQ4IC0xNjk3LjkzIC0xMjAuMzM0IC0xNTE4LjcyIC0xMy4zNzZDLTE0MzMuNTcgMzcuNjQxOCAtMTMyOS42OSA0Ny45MzQ4IC0xMjMyLjk1IDU1LjU0MjdDLTExMDkuOTEgNjQuOTQwOSAtOTg1LjUzIDYyLjcwMzEgLTg2Mi45MzIgNDkuMjc3M0MtNjI5LjMyOCAyMy4zMjEgLTQwMS4wNzQgLTQyLjkxMjQgLTE5MC4yMDYgLTE0OC4wODFDMy43MjA5NSAtMjQ0Ljc0NiAxNzkuMzcgLTM3Mi4yOSAzNTIuMzQ0IC01MDIuMDcyQzUyNC40MjYgLTYzMS40MDYgNjk0LjI4IC03NjQuMzIxIDg3OS43MzYgLTg3My45NjRDOTc1LjU4NSAtOTMwLjggMTA3NS40NSAtOTgwLjkyMiAxMTgwLjIxIC0xMDE5LjQxQzEyOTQuMzQgLTEwNjEuNDggMTQyMS44NCAtMTA5OS4wNyAxNTQzLjk5IC0xMDc1LjM1QzE2NTQuMTEgLTEwNTMuODcgMTc2Ny43OSAtOTYzLjkxNiAxNzY0LjIyIC04NDEuMjk1QzE3NjEuNTUgLTc1NC4wMjggMTY5Mi44OSAtNjkyLjcxNyAxNjEzLjk4IC02NjkuNDQ2QzE1MjkuNzMgLTY0NC4zODQgMTQzMy40MyAtNjU2LjQ2OCAxMzY0LjMzIC03MTIuNDA4QzEyODQuNTMgLTc3Ni40MDQgMTI0MS4yOSAtODczLjUxNiAxMjIxLjIzIC05NzEuNTI0QzExNzguODcgLTExNzYuNDkgMTIxNC45OCAtMTQxMi43OCAxMzEzLjUxIC0xNTk2LjcyQzEzMzUuOCAtMTYzOC4zMyAxMzYxLjY2IC0xNjc4LjE2IDEzOTEuOTcgLTE3MTMuOTdDMTQyMi4yOSAtMTc1MC4yMiAxNDY4LjY1IC0xODA2LjE2IDE1MTMuNjggLTE4MjMuNjFDMTUzMC4xNyAtMTgyOS44NyAxNTMxLjA2IC0xODMxLjY2IDE1NDIuMjEgLTE4MTMuNzZDMTU0OC45IC0xODAzLjAyIDE1NDkuNzkgLTE3ODcuODEgMTU0OS4zNCAtMTc3NS4yOEMxNTQ4IC0xNzQ4Ljg3IDE1MzYuODYgLTE3MjIuOTIgMTUyNC4zOCAtMTcwMC41NEMxNDk2LjI5IC0xNjUwLjQyIDE0NTEuMjYgLTE2MTEuOTMgMTQwOC45MSAtMTU3NC4zNEMxMjM1LjQ5IC0xNDE5Ljk0IDEwMzAuNDIgLTEzMDEuMzUgODExLjA4MiAtMTIyNy41MUM3NjEuMTUxIC0xMjEwLjk1IDcxMC4zMjkgLTExOTYuMTggNjU4LjYxNSAtMTE4NC4xQzU5MS4yOTggLTExNjguNDMgNTE4LjE4NSAtMTE1MS40MyA0NTAuNDIyIC0xMTcyLjkxQzM0NS42NTcgLTEyMDYuMDMgMjg4LjE0NyAtMTMxNi4xMiAyNjYuNzQ5IC0xNDE3LjI2QzIyMS4yNzYgLTE2MzYuMSAzMTUuNzg3IC0xODgwIDE4My4zODIgLTIwODAuMDRDMTMwLjc3NyAtMjE2MC4xNSA1MS40MjI2IC0yMjAxLjc3IC00Mi4xOTczIC0yMjE1LjE5Qy0xNTkuNDQ1IC0yMjMxLjc1IC0yODIuNDg5IC0yMjI5LjUxIC00MDAuNjI4IC0yMjIyLjhDLTgxNy40NiAtMjIwMC40MiAtMTI3My4wOCAtMjAyOC41OCAtMTQ0Ni45NCAtMTYxNS4wNkMtMTQ4Mi42MSAtMTUzMC40OCAtMTUyMS4zOSAtMTQxNS45MiAtMTQ3OS45MyAtMTMyNi40MUMtMTQ0NC4yNyAtMTI0OS40NCAtMTM1OC4yMyAtMTIxNy4yMSAtMTI4MC4yMSAtMTIwMi44OUMtMTA0Ni42MSAtMTE1OS4wNCAtNzk1LjYxNSAtMTE3OS4xOCAtNTYyLjkwMiAtMTIyMC44Qy01My43ODgzIC0xMzEyLjA5IDQxNC4zMTEgLTE1NDEuNjcgODczLjA0OSAtMTc3MS4yNUMxMTA1LjMyIC0xODg3LjE2IDEzMzcuMTQgLTIwMTEuMTIgMTU4MC4xIC0yMTAzLjc2QzE2OTcuMzUgLTIxNDguNTEgMTgyMC44NCAtMjE4MS42MyAxOTQ3LjQ1IC0yMTc0LjQ3QzIwNzAuMDUgLTIxNjcuNzYgMjE4Ni44NSAtMjEyMi41NiAyMjkyLjA2IC0yMDYwLjhDMjM5MS45MiAtMjAwMi4xNyAyNDgzLjMxIC0xOTI4Ljc4IDI1NjguOTEgLTE4NTAuNDZDMjY1Ni43MyAtMTc3MC4zNSAyNzQwLjU0IC0xNjc1LjQ4IDI3NjIuMzkgLTE1NTQuMkMyODAzLjg1IC0xMzIwLjU5IDI2MjcuMzEgLTExMTQuMjggMjQyNy41OSAtMTAyNS4yM0MyMjE4LjA2IC05MzEuMjQ3IDE5NjkuMjkgLTkyMS44NDkgMTc0My43MSAtOTQyLjQzNUMxNTEzLjIzIC05NjMuMDIxIDEyODUuODcgLTEwMjYuMTIgMTA3Ny4yMyAtMTEyNi4zN0M2NzEuMDk3IC0xMzIxLjQ5IDM0Ny44ODYgLTE2NTguMDMgMTYyLjQyOSAtMjA2OS4zQzcxLjkyOTkgLTIyNjkuNzkgMTYuMjAzOSAtMjQ4NS4wNSAtMi4wNzQ0NiAtMjcwNC4zNEMtNS4xOTUwNyAtMjcyMS43OSAtMzEuOTQzOCAtMjcyMS43OSAtMzAuNjA2MiAtMjcwNC43OFoiIGZpbGw9IiNFNjAwN0EiLz4KPC9nPgo8cGF0aCBkPSJNNTc5LjY2MSAxMTUxSDc1MC44MjdMODA1LjM5OCA5NTMuMTE4QzgxMi45MjMgOTI1LjgzMyA4NTEuMjkgOTI1Ljg1IDg1OC43OTEgOTUzLjE0MUw5MTMuMTczIDExNTFIMTA4NC4wMUwxMjE1IDY0NUgxMDU0LjYxTDEwMTMuNjUgODQ1LjgxMUMxMDA3LjcgODc0Ljk3MiA5NjYuNjgxIDg3NS43NzggOTU5LjYxIDg0Ni44NzJMOTEwLjIzMyA2NDVINzUzLjc2N0w3MDUuNjY1IDg0OC4xMjZDNjk4Ljc5NyA4NzcuMTI4IDY1Ny42OSA4NzYuNTY2IDY1MS42MDMgODQ3LjM4N0w2MzcuMTU4IDc3OC4xMzhDNjIwLjk3MyA3MDAuNTQ3IDU1My4xMDIgNjQ1IDQ3NC40OCA2NDVINDQ5TDU3OS42NjEgMTE1MVoiIGZpbGw9IndoaXRlIi8+CjxkZWZzPgo8bGluZWFyR3JhZGllbnQgaWQ9InBhaW50MF9saW5lYXIiIHgxPSItMjMyLjQyOSIgeTE9IjgxNi4xNjkiIHgyPSIyNzEzLjY5IiB5Mj0iODEzLjU5MiIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgo8c3RvcCBzdG9wLWNvbG9yPSIjRjc5NDIwIiBzdG9wLW9wYWNpdHk9IjAuOTIiLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjQzRDNEM0IiBzdG9wLW9wYWNpdHk9IjAiLz4KPC9saW5lYXJHcmFkaWVudD4KPC9kZWZzPgo8L3N2Zz4K'; diff --git a/packages/core/src/config/logos/nova.svg b/packages/core/src/config/logos/wallets/nova.svg similarity index 100% rename from packages/core/src/config/logos/nova.svg rename to packages/core/src/config/logos/wallets/nova.svg diff --git a/packages/core/src/config/logos/polkadotjs.svg b/packages/core/src/config/logos/wallets/polkadotjs.svg similarity index 100% rename from packages/core/src/config/logos/polkadotjs.svg rename to packages/core/src/config/logos/wallets/polkadotjs.svg diff --git a/packages/core/src/config/logos/polkagate.svg b/packages/core/src/config/logos/wallets/polkagate.svg similarity index 100% rename from packages/core/src/config/logos/polkagate.svg rename to packages/core/src/config/logos/wallets/polkagate.svg diff --git a/packages/core/src/config/logos/subwallet.svg b/packages/core/src/config/logos/wallets/subwallet.svg similarity index 100% rename from packages/core/src/config/logos/subwallet.svg rename to packages/core/src/config/logos/wallets/subwallet.svg diff --git a/packages/core/src/config/logos/talisman.svg b/packages/core/src/config/logos/wallets/talisman.svg similarity index 100% rename from packages/core/src/config/logos/talisman.svg rename to packages/core/src/config/logos/wallets/talisman.svg diff --git a/packages/core/src/config/logos/walletconnect.svg b/packages/core/src/config/logos/wallets/walletconnect.svg similarity index 100% rename from packages/core/src/config/logos/walletconnect.svg rename to packages/core/src/config/logos/wallets/walletconnect.svg diff --git a/packages/core/src/connectors/common.ts b/packages/core/src/connectors/common.ts index 90a6b41..9dd7299 100644 --- a/packages/core/src/connectors/common.ts +++ b/packages/core/src/connectors/common.ts @@ -1,6 +1,6 @@ import { BaseConnector } from './base'; import type { Account, Signer } from '../types'; -import { mapInjectedAccounts } from '../utils' +import { mapInjectedAccounts } from '../utils/address' import { Injected, InjectedAccount } from 'dedot/types' import { stringToHex } from 'dedot/utils' import { ConnectorLinks } from '../types' diff --git a/packages/core/src/connectors/nova.test.ts b/packages/core/src/connectors/nova.test.ts index 0e33bb9..1e4c401 100644 --- a/packages/core/src/connectors/nova.test.ts +++ b/packages/core/src/connectors/nova.test.ts @@ -1,7 +1,7 @@ import { describe } from 'vitest'; import { novaConnector } from './nova'; import { createWalletConnectTestSuite } from './test-helper'; -import { novaSVG } from '../config/logos/generated'; +import { novaWallet } from '../config/logos/generated'; describe('NovaConnector', createWalletConnectTestSuite({ @@ -9,7 +9,7 @@ describe('NovaConnector', expected: { id: 'nova', name: 'Nova Wallet', - icon: novaSVG, + icon: novaWallet, }, }) ); diff --git a/packages/core/src/connectors/nova.ts b/packages/core/src/connectors/nova.ts index cc5096e..97c090f 100644 --- a/packages/core/src/connectors/nova.ts +++ b/packages/core/src/connectors/nova.ts @@ -1,4 +1,4 @@ -import { novaSVG } from '../config/logos/generated' +import { novaWallet } from '../config/logos/generated' import { WalletConnectConnector } from './walletconnect' import type { Metadata } from '@walletconnect/universal-provider' import { novaMobileConnector } from './novaMobile' @@ -32,7 +32,7 @@ export const novaConnector = (config: NovaConnectorConfig) => { return new WalletConnectConnector({ id: 'nova', name: 'Nova Wallet', - icon: novaSVG, + icon: novaWallet, links: { browserExtension: 'https://novawallet.io', }, diff --git a/packages/core/src/connectors/novaMobile.test.ts b/packages/core/src/connectors/novaMobile.test.ts index 1a2d0ad..c05d1bf 100644 --- a/packages/core/src/connectors/novaMobile.test.ts +++ b/packages/core/src/connectors/novaMobile.test.ts @@ -1,7 +1,7 @@ import { describe } from 'vitest'; import { novaMobileConnector } from './novaMobile'; import { createConnectorTestSuite } from './test-helper' -import { novaSVG } from '../config/logos/generated' +import { novaWallet } from '../config/logos/generated' describe( 'novaMobileConnector', @@ -10,7 +10,7 @@ describe( expected: { id: 'nova-mobile', name: 'Nova Wallet', - icon: novaSVG, + icon: novaWallet, injectorId: 'polkadot-js', }, extraWindowProps: { diff --git a/packages/core/src/connectors/novaMobile.ts b/packages/core/src/connectors/novaMobile.ts index 408a616..38f7c4a 100644 --- a/packages/core/src/connectors/novaMobile.ts +++ b/packages/core/src/connectors/novaMobile.ts @@ -1,4 +1,4 @@ -import { novaSVG } from '../config/logos/generated' +import { novaWallet } from '../config/logos/generated' import { CommonConnector } from './common' export class NovaMobileConnector extends CommonConnector { @@ -6,7 +6,7 @@ export class NovaMobileConnector extends CommonConnector { super({ id: 'nova-mobile', name: 'Nova Wallet', - icon: novaSVG, + icon: novaWallet, injectorId: 'polkadot-js', links: { deepLink: 'https://app.novawallet.io/open/dapp' diff --git a/packages/core/src/connectors/polkadot-js.test.ts b/packages/core/src/connectors/polkadot-js.test.ts index 825ec68..a3f3836 100644 --- a/packages/core/src/connectors/polkadot-js.test.ts +++ b/packages/core/src/connectors/polkadot-js.test.ts @@ -1,7 +1,7 @@ import { describe } from 'vitest'; import { polkadotjsConnector } from './polkadot-js'; import { createConnectorTestSuite } from './test-helper' -import { polkadotjsSVG } from '../config/logos/generated' +import { polkadotjsWallet } from '../config/logos/generated' describe( 'polkadotjsConnector', @@ -10,7 +10,7 @@ describe( expected: { id: 'polkadot-js', name: 'Polkadot{.js}', - icon: polkadotjsSVG, + icon: polkadotjsWallet, }, }) ) diff --git a/packages/core/src/connectors/polkadot-js.ts b/packages/core/src/connectors/polkadot-js.ts index 3a29a79..de5d03b 100644 --- a/packages/core/src/connectors/polkadot-js.ts +++ b/packages/core/src/connectors/polkadot-js.ts @@ -1,11 +1,11 @@ import { CommonConnector } from './common' -import { polkadotjsSVG } from '../config/logos/generated' +import { polkadotjsWallet } from '../config/logos/generated' export const polkadotjsConnector = () => { return new CommonConnector({ id: 'polkadot-js', name: 'Polkadot{.js}', - icon: polkadotjsSVG, + icon: polkadotjsWallet, links: { browserExtension: 'https://polkadot.js.org/extension' } diff --git a/packages/core/src/connectors/polkagate.test.ts b/packages/core/src/connectors/polkagate.test.ts index bb12c85..f8baf07 100644 --- a/packages/core/src/connectors/polkagate.test.ts +++ b/packages/core/src/connectors/polkagate.test.ts @@ -1,7 +1,7 @@ import { describe } from 'vitest'; import { polkagateConnector } from './polkagate'; import { createConnectorTestSuite } from './test-helper' -import { polkagateSVG } from '../config/logos/generated' +import { polkagateWallet } from '../config/logos/generated' describe( 'polkagateConnector', @@ -10,7 +10,7 @@ describe( expected: { id: 'polkagate', name: 'Polkagate', - icon: polkagateSVG, + icon: polkagateWallet, }, }) ) diff --git a/packages/core/src/connectors/polkagate.ts b/packages/core/src/connectors/polkagate.ts index d0c230d..1b8ef9b 100644 --- a/packages/core/src/connectors/polkagate.ts +++ b/packages/core/src/connectors/polkagate.ts @@ -1,11 +1,11 @@ -import { polkagateSVG } from '../config/logos/generated' +import { polkagateWallet } from '../config/logos/generated' import { CommonConnector } from './common' export const polkagateConnector = () => { return new CommonConnector({ id: 'polkagate', name: 'Polkagate', - icon: polkagateSVG, + icon: polkagateWallet, links: { browserExtension: 'https://chromewebstore.google.com/detail/polkagate-the-gateway-to/ginchbkmljhldofnbjabmeophlhdldgp' } diff --git a/packages/core/src/connectors/subwallet.test.ts b/packages/core/src/connectors/subwallet.test.ts index f27610b..539efee 100644 --- a/packages/core/src/connectors/subwallet.test.ts +++ b/packages/core/src/connectors/subwallet.test.ts @@ -1,7 +1,7 @@ import { describe } from 'vitest'; import { subwalletConnector } from './subwallet'; import { createConnectorTestSuite } from './test-helper' -import { subwalletSVG } from '../config/logos/generated' +import { subwalletWallet } from '../config/logos/generated' describe( 'subwalletConnector', @@ -10,7 +10,7 @@ describe( expected: { id: 'subwallet-js', name: 'SubWallet', - icon: subwalletSVG, + icon: subwalletWallet, }, }) ) diff --git a/packages/core/src/connectors/subwallet.ts b/packages/core/src/connectors/subwallet.ts index 70977f1..9f1d7f7 100644 --- a/packages/core/src/connectors/subwallet.ts +++ b/packages/core/src/connectors/subwallet.ts @@ -1,11 +1,11 @@ -import { subwalletSVG } from '../config/logos/generated' +import { subwalletWallet } from '../config/logos/generated' import { CommonConnector } from './common' export const subwalletConnector = () => { return new CommonConnector({ id: 'subwallet-js', name: 'SubWallet', - icon: subwalletSVG, + icon: subwalletWallet, links: { browserExtension: 'https://chromewebstore.google.com/detail/subwallet-polkadot-wallet/onhogfjeacnfoofkfgppdlbmlmnplgbn', deepLink: 'https://mobile.subwallet.app/browser', diff --git a/packages/core/src/connectors/talisman.test.ts b/packages/core/src/connectors/talisman.test.ts index c3566bb..13688fd 100644 --- a/packages/core/src/connectors/talisman.test.ts +++ b/packages/core/src/connectors/talisman.test.ts @@ -1,7 +1,7 @@ import { describe } from 'vitest'; import { talismanConnector } from './talisman'; import { createConnectorTestSuite } from './test-helper' -import { talismanSVG } from '../config/logos/generated' +import { talismanWallet } from '../config/logos/generated' describe( 'subwalletConnector', @@ -10,7 +10,7 @@ describe( expected: { id: 'talisman', name: 'Talisman', - icon: talismanSVG, + icon: talismanWallet, }, }) ) diff --git a/packages/core/src/connectors/talisman.ts b/packages/core/src/connectors/talisman.ts index 96d1101..777634b 100644 --- a/packages/core/src/connectors/talisman.ts +++ b/packages/core/src/connectors/talisman.ts @@ -1,11 +1,11 @@ -import { talismanSVG } from '../config/logos/generated' +import { talismanWallet } from '../config/logos/generated' import { CommonConnector } from './common' export const talismanConnector = () => { return new CommonConnector({ id: 'talisman', name: 'Talisman', - icon: talismanSVG, + icon: talismanWallet, links: { browserExtension: 'https://chromewebstore.google.com/detail/talisman-wallet/fijngjgcjhjmmpcmkeiomlglpeiijkld' } diff --git a/packages/core/src/connectors/walletconnect.test.ts b/packages/core/src/connectors/walletconnect.test.ts index a266ade..3621c8e 100644 --- a/packages/core/src/connectors/walletconnect.test.ts +++ b/packages/core/src/connectors/walletconnect.test.ts @@ -1,7 +1,7 @@ import { describe } from 'vitest'; import { walletConnectConnector } from './walletconnect'; import { createWalletConnectTestSuite } from './test-helper'; -import { walletconnectSVG } from '../config/logos/generated'; +import { walletconnectWallet } from '../config/logos/generated'; describe('WalletConnectConnector', createWalletConnectTestSuite({ @@ -9,7 +9,7 @@ describe('WalletConnectConnector', expected: { id: 'walletconnect', name: 'WalletConnect', - icon: walletconnectSVG, + icon: walletconnectWallet, }, }) ); diff --git a/packages/core/src/connectors/walletconnect.ts b/packages/core/src/connectors/walletconnect.ts index 8e65e32..1a83748 100644 --- a/packages/core/src/connectors/walletconnect.ts +++ b/packages/core/src/connectors/walletconnect.ts @@ -2,7 +2,7 @@ import { BaseConnector } from './base'; import type { IUniversalProvider, Metadata } from '@walletconnect/universal-provider'; import { SessionTypes, SignClientTypes } from '@walletconnect/types' import type { Account, Chain, Signer, WalletConnectConnectorOptions } from '../types'; -import { walletconnectSVG } from '../config/logos/generated'; +import { walletconnectWallet } from '../config/logos/generated'; import { SignerResult, SignerPayloadJSON } from 'dedot/types' import { ConnectorLinks } from '../types' @@ -28,7 +28,7 @@ export class WalletConnectConnector extends BaseConnector { this.name = options.name || 'WalletConnect'; this.links = options.links || {}; - this.icon = options.icon || walletconnectSVG; + this.icon = options.icon || walletconnectWallet; this.projectId = options.projectId; this.relayUrl = options.relayUrl || 'wss://relay.walletconnect.com'; @@ -166,8 +166,6 @@ export class WalletConnectConnector extends BaseConnector { public async disconnect(): Promise { if (this.provider) { - console.log('this.provider', this.provider) - console.log('this.sessionsession', this.session) // await Promise.race([ await this.provider.disconnect() // new Promise((_, reject) => diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 3cb0b36..043bb22 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -1,11 +1,3 @@ -export * from './types'; - -export * from './connectors'; - -export * from './chains'; - -export * from './utils'; - export * from './config' diff --git a/packages/core/tsup.config.ts b/packages/core/tsup.config.ts index 89cc674..9255899 100644 --- a/packages/core/tsup.config.ts +++ b/packages/core/tsup.config.ts @@ -5,7 +5,8 @@ export default defineConfig(options => ({ 'src/index.ts', 'src/chains/index.ts', 'src/connectors/index.ts', - 'src/utils/index.ts' + 'src/utils/index.ts', + 'src/types/index.ts' ], format: ['esm', 'cjs'], splitting: true, diff --git a/packages/react/package.json b/packages/react/package.json index 42aee23..5caa465 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -20,6 +20,26 @@ "types": "./dist/index.d.ts", "import": "./dist/index.js", "require": "./dist/index.cjs" + }, + "./chains": { + "types": "./dist/chains/index.d.ts", + "import": "./dist/chains/index.js", + "require": "./dist/chains/index.cjs" + }, + "./connectors": { + "types": "./dist/connectors/index.d.ts", + "import": "./dist/connectors/index.js", + "require": "./dist/connectors/index.cjs" + }, + "./utils": { + "types": "./dist/utils/index.d.ts", + "import": "./dist/utils/index.js", + "require": "./dist/utils/index.cjs" + }, + "./types": { + "types": "./dist/types/index.d.ts", + "import": "./dist/types/index.js", + "require": "./dist/types/index.cjs" } }, "files": [ diff --git a/packages/react/src/chains/index.ts b/packages/react/src/chains/index.ts new file mode 100644 index 0000000..ca8b0de --- /dev/null +++ b/packages/react/src/chains/index.ts @@ -0,0 +1 @@ +export * from '@luno-kit/core/chains' diff --git a/packages/react/src/connectors/index.ts b/packages/react/src/connectors/index.ts new file mode 100644 index 0000000..71fe1e6 --- /dev/null +++ b/packages/react/src/connectors/index.ts @@ -0,0 +1 @@ +export * from '@luno-kit/core/connectors' diff --git a/packages/react/src/context/LunoContext.ts b/packages/react/src/context/LunoContext.ts index 048305c..1c5d395 100644 --- a/packages/react/src/context/LunoContext.ts +++ b/packages/react/src/context/LunoContext.ts @@ -1,6 +1,6 @@ import React from 'react'; import type { LegacyClient } from 'dedot'; -import type { Chain, Config, Connector, Account } from '@luno-kit/core'; +import type { Chain, Config, Connector, Account } from '@luno-kit/core/types'; import type { ConnectionStatus } from '../types'; import type { HexString } from 'dedot/utils' diff --git a/packages/react/src/context/LunoProvider.test.tsx b/packages/react/src/context/LunoProvider.test.tsx index fb0f687..45157b3 100644 --- a/packages/react/src/context/LunoProvider.test.tsx +++ b/packages/react/src/context/LunoProvider.test.tsx @@ -2,8 +2,9 @@ import { render, waitFor } from '@testing-library/react'; import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; import React from 'react'; import { LunoProvider } from './LunoProvider'; -import type { Chain, Config } from '@luno-kit/core'; -import { BaseConnector, createConfig } from '@luno-kit/core'; +import type { Chain, Config } from '@luno-kit/core/types'; +import { BaseConnector } from '@luno-kit/core/connectors'; +import { createConfig } from '@luno-kit/core'; import type { LunoState } from '../types'; import { ConnectionStatus } from '../types' import { createApi } from '../utils'; diff --git a/packages/react/src/context/LunoProvider.tsx b/packages/react/src/context/LunoProvider.tsx index 72147ee..7a3864f 100644 --- a/packages/react/src/context/LunoProvider.tsx +++ b/packages/react/src/context/LunoProvider.tsx @@ -1,5 +1,5 @@ import React, { ReactNode, useCallback, useEffect, useMemo } from 'react'; -import type { Chain, Config, Transport } from '@luno-kit/core'; +import type { Chain, Config, Transport } from '../types'; import { useLunoStore } from '../store' import { PERSIST_KEY } from '../constants' import { LunoContext, LunoContextState } from './LunoContext' diff --git a/packages/react/src/hooks/useAccount.test.ts b/packages/react/src/hooks/useAccount.test.ts index 2c0bae1..1503283 100644 --- a/packages/react/src/hooks/useAccount.test.ts +++ b/packages/react/src/hooks/useAccount.test.ts @@ -5,7 +5,6 @@ import { act, waitFor } from '@testing-library/react'; import { useConnect } from './useConnect'; import { useAccount } from './useAccount'; import { ConnectionStatus } from '../types'; -import { useChain } from './useChain' const connector = mockConfig.connectors[0] as MockConnector; diff --git a/packages/react/src/hooks/useAccount.ts b/packages/react/src/hooks/useAccount.ts index fcfdc5b..39e4e58 100644 --- a/packages/react/src/hooks/useAccount.ts +++ b/packages/react/src/hooks/useAccount.ts @@ -1,6 +1,6 @@ -import type { Account } from '@luno-kit/core'; +import type { Account } from '../types'; import { useLuno } from './useLuno'; -import { convertAddress } from '@luno-kit/core' +import { convertAddress } from '@luno-kit/core/utils' import { useMemo } from 'react' export interface UseAccountResult { diff --git a/packages/react/src/hooks/useAccounts.ts b/packages/react/src/hooks/useAccounts.ts index 094d2cd..107de3b 100644 --- a/packages/react/src/hooks/useAccounts.ts +++ b/packages/react/src/hooks/useAccounts.ts @@ -1,7 +1,7 @@ -import type { Account } from '@luno-kit/core'; +import type { Account } from '../types'; import { useLuno } from './useLuno'; import { useMemo } from 'react' -import { convertAddress } from '@luno-kit/core' +import { convertAddress } from '@luno-kit/core/utils' import type { HexString } from 'dedot/utils' export interface UseAccountsResult { diff --git a/packages/react/src/hooks/useActiveConnector.ts b/packages/react/src/hooks/useActiveConnector.ts index eea95b2..ccd1060 100644 --- a/packages/react/src/hooks/useActiveConnector.ts +++ b/packages/react/src/hooks/useActiveConnector.ts @@ -1,4 +1,4 @@ -import type { Connector } from '@luno-kit/core'; +import type { Connector } from '../types'; import { useLuno } from './useLuno'; export const useActiveConnector = (): Connector | undefined => { diff --git a/packages/react/src/hooks/useBalance.ts b/packages/react/src/hooks/useBalance.ts index 91775e9..c94632d 100644 --- a/packages/react/src/hooks/useBalance.ts +++ b/packages/react/src/hooks/useBalance.ts @@ -1,8 +1,8 @@ import { QueryMultiItem, useSubscription, UseSubscriptionResult } from './useSubscription'; -import type { AccountBalance } from '@luno-kit/core'; +import type { AccountBalance } from '../types'; import type { LegacyClient } from 'dedot'; import { useLuno } from './useLuno' -import { formatBalance } from '@luno-kit/core' +import { formatBalance } from '@luno-kit/core/utils' interface AccountData { data: { diff --git a/packages/react/src/hooks/useChain.ts b/packages/react/src/hooks/useChain.ts index 7334d9f..d22096b 100644 --- a/packages/react/src/hooks/useChain.ts +++ b/packages/react/src/hooks/useChain.ts @@ -1,4 +1,4 @@ -import type { Chain } from '@luno-kit/core'; +import type { Chain } from '../types'; import {useLuno} from './useLuno' export interface UseChainResult { diff --git a/packages/react/src/hooks/useChains.ts b/packages/react/src/hooks/useChains.ts index 16faf62..6fca581 100644 --- a/packages/react/src/hooks/useChains.ts +++ b/packages/react/src/hooks/useChains.ts @@ -1,4 +1,4 @@ -import type { Chain } from '@luno-kit/core'; +import type { Chain } from '../types'; import { useLuno } from './useLuno'; export const useChains = (): Chain[] => { diff --git a/packages/react/src/hooks/useConfig.ts b/packages/react/src/hooks/useConfig.ts index f56715a..97bcfab 100644 --- a/packages/react/src/hooks/useConfig.ts +++ b/packages/react/src/hooks/useConfig.ts @@ -1,4 +1,4 @@ -import type { Config } from '@luno-kit/core'; +import type { Config } from '../types'; import { useLuno } from './useLuno'; export const useConfig = (): Config | undefined => { diff --git a/packages/react/src/hooks/useConnect.ts b/packages/react/src/hooks/useConnect.ts index d885fb5..8e88faa 100644 --- a/packages/react/src/hooks/useConnect.ts +++ b/packages/react/src/hooks/useConnect.ts @@ -1,5 +1,5 @@ import { useLuno } from './useLuno'; -import type { Connector } from '@luno-kit/core'; +import type { Connector } from '../types'; import { ConnectionStatus } from '../types' import { useLunoMutation, type LunoMutationOptions } from './useLunoMutation'; import { sleep } from '../utils' diff --git a/packages/react/src/hooks/useConnectors.ts b/packages/react/src/hooks/useConnectors.ts index 218c397..1c7e429 100644 --- a/packages/react/src/hooks/useConnectors.ts +++ b/packages/react/src/hooks/useConnectors.ts @@ -1,4 +1,4 @@ -import type { Connector } from '@luno-kit/core'; +import type { Connector } from '../types'; import { useLuno } from './useLuno'; export const useConnectors = (): Connector[] => { diff --git a/packages/react/src/hooks/useGenesisHash.test.ts b/packages/react/src/hooks/useGenesisHash.test.ts index faa88cd..c098d66 100644 --- a/packages/react/src/hooks/useGenesisHash.test.ts +++ b/packages/react/src/hooks/useGenesisHash.test.ts @@ -4,7 +4,7 @@ import { renderHook } from '../test-utils'; import { waitFor } from '@testing-library/react'; import { useGenesisHash } from './useGenesisHash'; import { useLuno } from './useLuno'; -import { polkadot } from '@luno-kit/core'; +import { polkadot } from '@luno-kit/core/chains'; vi.mock('../utils/createApi', () => ({ createApi: () => Promise.resolve(mockClient.polkadot) diff --git a/packages/react/src/hooks/useSigner.ts b/packages/react/src/hooks/useSigner.ts index d3a51b9..635745d 100644 --- a/packages/react/src/hooks/useSigner.ts +++ b/packages/react/src/hooks/useSigner.ts @@ -1,7 +1,7 @@ import { useState, useEffect } from 'react'; import { useLuno } from './useLuno'; import { useAccount } from './useAccount'; -import { Signer } from '@luno-kit/core' +import { Signer } from '../types' export interface UseSignerResult { data?: Signer; @@ -25,7 +25,7 @@ export const useSigner = (): UseSignerResult => { setIsLoading(true); activeConnector.getSigner() - .then(signer => setSigner(signer as Signer)) + .then(signer => setSigner(signer)) .catch(() => setSigner(undefined)) .finally(() => setIsLoading(false)); diff --git a/packages/react/src/hooks/useSs58Format.test.ts b/packages/react/src/hooks/useSs58Format.test.ts index c3807f0..b21e1c2 100644 --- a/packages/react/src/hooks/useSs58Format.test.ts +++ b/packages/react/src/hooks/useSs58Format.test.ts @@ -2,7 +2,7 @@ import { expect, describe, it, vi } from 'vitest'; import { mockConfig, mockClient } from '../test-utils'; import { renderHook } from '../test-utils'; import { useSs58Format } from './useSs58Format'; -import { polkadot } from '@luno-kit/core'; +import { polkadot } from '@luno-kit/core/chains'; import { waitFor } from '@testing-library/react'; import { useLuno } from './useLuno' diff --git a/packages/react/src/hooks/useSwitchChain.test.ts b/packages/react/src/hooks/useSwitchChain.test.ts index 7d312fa..470f7dc 100644 --- a/packages/react/src/hooks/useSwitchChain.test.ts +++ b/packages/react/src/hooks/useSwitchChain.test.ts @@ -5,7 +5,7 @@ import { act, waitFor } from '@testing-library/react'; import { useConnect } from './useConnect'; import { useSwitchChain } from './useSwitchChain'; import { useChain } from './useChain'; -import { polkadot, kusama } from '@luno-kit/core'; +import { polkadot, kusama } from '@luno-kit/core/chains'; import {ConnectionStatus} from '../types' const connector = mockConfig.connectors[0] as MockConnector; diff --git a/packages/react/src/hooks/useSwitchChain.ts b/packages/react/src/hooks/useSwitchChain.ts index ab5b870..5b40336 100644 --- a/packages/react/src/hooks/useSwitchChain.ts +++ b/packages/react/src/hooks/useSwitchChain.ts @@ -1,5 +1,5 @@ import { useLuno } from './useLuno'; -import type { Chain } from '@luno-kit/core'; +import type { Chain } from '../types'; import { useLunoMutation, type LunoMutationOptions } from './useLunoMutation'; export interface SwitchChainVariables { diff --git a/packages/react/src/store/createLunoStore.test.ts b/packages/react/src/store/createLunoStore.test.ts index 07b6526..0556fbd 100644 --- a/packages/react/src/store/createLunoStore.test.ts +++ b/packages/react/src/store/createLunoStore.test.ts @@ -3,13 +3,13 @@ import { useLunoStore } from './createLunoStore'; import { ConnectionStatus } from '../types'; import { PERSIST_KEY } from '../constants'; import { createApi } from '../utils'; -import { isSameAddress } from '@luno-kit/core'; +import { isSameAddress } from '@luno-kit/core/utils'; vi.mock('../utils', () => ({ createApi: vi.fn(), })); -vi.mock('@luno-kit/core', () => ({ +vi.mock('@luno-kit/core/utils', () => ({ isSameAddress: vi.fn(), })); diff --git a/packages/react/src/store/createLunoStore.ts b/packages/react/src/store/createLunoStore.ts index 3e16785..b6747e0 100644 --- a/packages/react/src/store/createLunoStore.ts +++ b/packages/react/src/store/createLunoStore.ts @@ -1,10 +1,9 @@ import { create } from 'zustand'; -import type { LunoState } from '../types'; +import type { LunoState, Account } from '../types'; import { ConnectionStatus } from '../types'; -import type { Account } from '@luno-kit/core'; import { PERSIST_KEY } from '../constants'; -import { isSameAddress } from '@luno-kit/core'; import { createApi } from '../utils' +import { isSameAddress } from '@luno-kit/core/utils' interface StoredAccountInfo { publicKey?: string; diff --git a/packages/react/src/test-utils/mocks.ts b/packages/react/src/test-utils/mocks.ts index bb5601a..3a717e0 100644 --- a/packages/react/src/test-utils/mocks.ts +++ b/packages/react/src/test-utils/mocks.ts @@ -1,6 +1,7 @@ -import { Chain, createConfig, kusama, polkadot } from '@luno-kit/core' +import { createConfig } from '@luno-kit/core' +import { kusama, polkadot } from '@luno-kit/core/chains' import { BaseConnector } from '@luno-kit/core/connectors'; -import type { Account, Signer } from '@luno-kit/core'; +import type { Account, Signer, Chain } from '@luno-kit/core/types'; import { vi } from 'vitest'; const DEFAULT_MOCK_ACCOUNTS: Account[] = [ diff --git a/packages/react/src/test-utils/render.tsx b/packages/react/src/test-utils/render.tsx index 77512e1..2138963 100644 --- a/packages/react/src/test-utils/render.tsx +++ b/packages/react/src/test-utils/render.tsx @@ -1,4 +1,4 @@ -import type { Config } from '@luno-kit/core'; +import type { Config } from '@luno-kit/core/types'; import { renderHook as baseRenderHook, RenderHookOptions } from '@testing-library/react'; import type { ReactNode } from 'react'; import { QueryClientProvider, QueryClient } from '@tanstack/react-query' diff --git a/packages/react/src/types/index.ts b/packages/react/src/types/index.ts index 3044ba8..0a6028f 100644 --- a/packages/react/src/types/index.ts +++ b/packages/react/src/types/index.ts @@ -1,2 +1,4 @@ -export * from './state' -export * from './transaction' +export * from '@luno-kit/core/types' + +export { ConnectionStatus, LunoState } from './state' +export { TxStatus } from './transaction' diff --git a/packages/react/src/types/state.ts b/packages/react/src/types/state.ts index 64c1858..9b75d57 100644 --- a/packages/react/src/types/state.ts +++ b/packages/react/src/types/state.ts @@ -1,4 +1,4 @@ -import type { Config, Connector, Account, Chain } from '@luno-kit/core'; +import type { Config, Connector, Account, Chain } from '.'; import type { LegacyClient } from 'dedot'; import type { HexString } from 'dedot/utils' diff --git a/packages/react/src/utils/createApi.ts b/packages/react/src/utils/createApi.ts index 8415d4d..21289a9 100644 --- a/packages/react/src/utils/createApi.ts +++ b/packages/react/src/utils/createApi.ts @@ -1,4 +1,5 @@ -import { Config, wsProvider } from '@luno-kit/core' +import { wsProvider } from '@luno-kit/core' +import type { Config } from '../types' import { ApiOptions, LegacyClient } from 'dedot' interface CreateApiOptions { @@ -47,7 +48,7 @@ export const createApi = async ({ } return newApi; - } catch (error: Error) { + } catch (error: any) { throw new Error(`Failed to connect to ${chainConfig.name}: ${error?.message || error}`); } }; diff --git a/packages/react/src/utils/index.ts b/packages/react/src/utils/index.ts index 6e7d1e9..7cf848f 100644 --- a/packages/react/src/utils/index.ts +++ b/packages/react/src/utils/index.ts @@ -1,3 +1,17 @@ +export { + formatAddress, + getExplorerUrl, + getPublicKey, + isMobileDevice, + isSameAddress, + isValidAddress, + formatBalance, + getChainToken, + defineChain, + convertAddress, + formatBalanceWithUnit +} from '@luno-kit/core/utils' + export * from './createApi'; export * from './dispatchError'; -export * from './sleep' +export * from './sleep'; diff --git a/packages/react/tsconfig.json b/packages/react/tsconfig.json index c184c72..53f8e3a 100644 --- a/packages/react/tsconfig.json +++ b/packages/react/tsconfig.json @@ -10,7 +10,10 @@ "lib": ["DOM", "DOM.Iterable", "ESNext"], "module": "ESNext", "moduleResolution": "bundler", - "composite": true + "composite": true, + "paths": { + "@luno-kit/core/*": ["../core/src/*"] + } }, "include": ["src/**/*"], "references": [ diff --git a/packages/react/tsup.config.ts b/packages/react/tsup.config.ts index 8132f73..6afad01 100644 --- a/packages/react/tsup.config.ts +++ b/packages/react/tsup.config.ts @@ -2,7 +2,11 @@ import { defineConfig } from 'tsup'; export default defineConfig((options) => ({ entry: [ - 'src/index.ts' + 'src/index.ts', + 'src/chains/index.ts', + 'src/connectors/index.ts', + 'src/utils/index.ts', + 'src/types/index.ts', ], banner: { js: "'use client'", diff --git a/packages/ui/src/components/AccountDetailsModal/MainView.tsx b/packages/ui/src/components/AccountDetailsModal/MainView.tsx index 70f15b7..51ffd47 100644 --- a/packages/ui/src/components/AccountDetailsModal/MainView.tsx +++ b/packages/ui/src/components/AccountDetailsModal/MainView.tsx @@ -3,7 +3,8 @@ import { cs } from '../../utils'; import { Arrow, Disconnect, List, Switch } from '../../assets/icons'; import { ChainIcon } from '../ChainIcon'; import { AccountModalView } from './index' -import { useAccount, useChain, useDisconnect, getExplorerUrl } from '@luno-kit/react' +import { useAccount, useChain, useDisconnect } from '@luno-kit/react' +import { getExplorerUrl } from '@luno-kit/react/utils' interface MainViewProps { onViewChange: (view: AccountModalView) => void; diff --git a/packages/ui/src/components/AccountDetailsModal/SwitchAccountView.tsx b/packages/ui/src/components/AccountDetailsModal/SwitchAccountView.tsx index efb7fba..775d4bb 100644 --- a/packages/ui/src/components/AccountDetailsModal/SwitchAccountView.tsx +++ b/packages/ui/src/components/AccountDetailsModal/SwitchAccountView.tsx @@ -1,8 +1,8 @@ import React, { useCallback } from 'react'; import { useAccount, useAccounts, useActiveConnector, useBalance, useChain } from '@luno-kit/react'; import { cs } from '../../utils'; -import { formatAddress } from '@luno-kit/react'; -import type { Account } from '@luno-kit/react'; +import { formatAddress } from '@luno-kit/react/utils'; +import type { Account } from '@luno-kit/react/types'; interface ViewComponent extends React.FC { title?: string; diff --git a/packages/ui/src/components/AccountDetailsModal/index.tsx b/packages/ui/src/components/AccountDetailsModal/index.tsx index 95f3a7e..dcbd465 100644 --- a/packages/ui/src/components/AccountDetailsModal/index.tsx +++ b/packages/ui/src/components/AccountDetailsModal/index.tsx @@ -1,14 +1,14 @@ -import React, { useCallback, useMemo, useState, useRef } from 'react'; +import React, { useCallback, useMemo } from 'react'; import { useAccount, useActiveConnector, useBalance, useChain } from '@luno-kit/react'; import { Dialog, DialogClose, DialogTitle } from '../Dialog'; import { cs } from '../../utils'; -import { useAccountModal } from '../../providers/ModalContext'; +import { useAccountModal } from '../../providers'; import { Close, Back } from '../../assets/icons'; import { MainView } from './MainView'; import { SwitchAccountView } from './SwitchAccountView'; import { SwitchChainView } from './SwitchChainView'; import { Copy } from '../Copy' -import { formatAddress } from '@luno-kit/react' +import { formatAddress } from '@luno-kit/react/utils' import { useAnimatedViews } from '../../hooks/useAnimatedViews' export enum AccountModalView { @@ -74,7 +74,7 @@ export const AccountDetailsModal: React.FC = () => {
{activeConnector?.icon && (
-
)} diff --git a/packages/ui/src/components/ChainList/index.tsx b/packages/ui/src/components/ChainList/index.tsx index 98464a9..7260d16 100644 --- a/packages/ui/src/components/ChainList/index.tsx +++ b/packages/ui/src/components/ChainList/index.tsx @@ -1,7 +1,7 @@ import React, { useMemo, useState } from 'react' import { cs } from '../../utils' import { useApi, useChain, useChains, useSwitchChain } from '@luno-kit/react' -import type { Chain } from '@luno-kit/react' +import type { Chain } from '@luno-kit/react/types' import { ChainIcon } from '../ChainIcon' enum ChainFilter { @@ -28,18 +28,27 @@ export const ChainList: React.FC = ({ onChainSwitched }: ChainLi const [activeFilter, setActiveFilter] = useState(ChainFilter.all); const [switchingChain, setSwitchingChain] = useState(null); + const [searchQuery, setSearchQuery] = useState(''); const filteredChains = useMemo(() => { - switch (activeFilter) { - case ChainFilter.mainnets: - return chains.filter(chain => !chain.testnet); - case ChainFilter.testnets: - return chains.filter(chain => chain.testnet); - case ChainFilter.all: - default: - return chains; - } - }, [chains, activeFilter]); + return chains + .filter(chain => + searchQuery.trim() + ? chain.name.toLowerCase().includes(searchQuery.toLowerCase()) + : true + ) + .filter(chain => { + switch (activeFilter) { + case ChainFilter.mainnets: + return !chain.testnet; + case ChainFilter.testnets: + return chain.testnet; + case ChainFilter.all: + default: + return true; + } + }); + }, [chains, activeFilter, searchQuery]); const handleChainSelect = async (chain: Chain) => { if (chain.genesisHash === currentChain?.genesisHash) return; @@ -75,18 +84,30 @@ export const ChainList: React.FC = ({ onChainSwitched }: ChainLi ))}
-
- {filteredChains.map(chain => ( - - ))} +
+ setSearchQuery(e.target.value)} + className="w-full px-3 py-2 text-sm border border-gray-300 rounded-md focus:ring-2 focus:ring-[rgb(51,133,255)] focus:outline-none focus:border-transparent" + />
+ {filteredChains.length > 0 && ( +
+ {filteredChains.map(chain => ( + + ))} +
+ )} + {filteredChains.length === 0 && (
@@ -106,26 +127,24 @@ interface ChainItemProps { } const ChainItem: React.FC = React.memo(({ - chain, - isSelected, - isLoading, - onSelect -}) => { + chain, + isSelected, + isLoading, + onSelect + }) => { return ( ); }); diff --git a/packages/ui/src/components/ChainModal/index.tsx b/packages/ui/src/components/ChainModal/index.tsx index b46a4e1..04555fd 100644 --- a/packages/ui/src/components/ChainModal/index.tsx +++ b/packages/ui/src/components/ChainModal/index.tsx @@ -2,7 +2,7 @@ import React from 'react'; import { Dialog, DialogTitle, DialogClose } from '../Dialog'; import { ChainList } from '../ChainList'; import { Close } from '../../assets/icons'; -import { useChainModal } from '../../providers/ModalContext'; +import { useChainModal } from '../../providers'; export interface ChainModalProps {} diff --git a/packages/ui/src/components/ConnectModal/ConnectOptions.tsx b/packages/ui/src/components/ConnectModal/ConnectOptions.tsx index c88d257..f7e59c7 100644 --- a/packages/ui/src/components/ConnectModal/ConnectOptions.tsx +++ b/packages/ui/src/components/ConnectModal/ConnectOptions.tsx @@ -1,6 +1,7 @@ import React from 'react' -import { useConnectors, isMobileDevice } from '@luno-kit/react' -import type { Connector } from '@luno-kit/react' +import { useConnectors } from '@luno-kit/react' +import { isMobileDevice } from '@luno-kit/react/utils' +import type { Connector } from '@luno-kit/react/types' import { cs } from '../../utils' interface Props { diff --git a/packages/ui/src/components/ConnectModal/WalletView.tsx b/packages/ui/src/components/ConnectModal/WalletView.tsx index 2fdf859..8ef0359 100644 --- a/packages/ui/src/components/ConnectModal/WalletView.tsx +++ b/packages/ui/src/components/ConnectModal/WalletView.tsx @@ -5,9 +5,8 @@ import { QRCode } from '../QRCode' import { cs } from '../../utils' import { transitionClassName } from '../ConnectButton' import { SpiralAnimation } from '../SpiralAnimation' -import type { Connector } from '@luno-kit/react' -import { useConnect } from '@luno-kit/react' -import {Copy} from '../Copy' +import type { Connector } from '@luno-kit/react/types' +import { Copy } from '../Copy' interface Props { selectedConnector: Connector | null @@ -64,10 +63,10 @@ export const WalletView = React.memo(({ selectedConnector, onConnect, qrCode, is : qrCode ? : null} - +
- - + +
) : ( <> @@ -106,12 +105,12 @@ export const WalletView = React.memo(({ selectedConnector, onConnect, qrCode, is
-

window.open('https://polkadot.com/get-started/wallets/')}> New to wallets?

- +

Connect your wallet to start exploring and interacting with DApps.

diff --git a/packages/ui/src/components/ConnectModal/index.tsx b/packages/ui/src/components/ConnectModal/index.tsx index 6a2a18f..86c57a6 100644 --- a/packages/ui/src/components/ConnectModal/index.tsx +++ b/packages/ui/src/components/ConnectModal/index.tsx @@ -1,9 +1,10 @@ import React, {useEffect, useMemo, useState} from 'react'; -import { useConnect, isMobileDevice } from '@luno-kit/react'; +import { useConnect } from '@luno-kit/react'; import { Dialog, DialogClose, DialogTitle, ModalSize } from '../Dialog'; import { cs } from '../../utils'; -import { useConnectModal } from '../../providers/ModalContext' -import type { Connector } from '@luno-kit/react' +import { useConnectModal } from '../../providers' +import type { Connector } from '@luno-kit/react/types' +import { isMobileDevice } from '@luno-kit/react/utils' import { Back, Close } from '../../assets/icons' import { useWindowSize } from '../../hooks' import { WalletView } from './WalletView' @@ -146,7 +147,7 @@ export const ConnectModal: React.FC = ({ {!isWide && currentView === ConnectModalView.connectOptions && ( <> -

window.open('https://polkadot.com/get-started/wallets/')}> New to wallets? diff --git a/packages/ui/src/hooks/useConnectButton.ts b/packages/ui/src/hooks/useConnectButton.ts index 8edbe78..b188664 100644 --- a/packages/ui/src/hooks/useConnectButton.ts +++ b/packages/ui/src/hooks/useConnectButton.ts @@ -6,14 +6,14 @@ import { ConnectionStatus, useChains, useActiveConnector, - formatAddress, } from '@luno-kit/react'; -import type { Account, Chain, AccountBalance, Connector } from '@luno-kit/react' +import type { Account, Chain, AccountBalance, Connector } from '@luno-kit/react/types' import { useConnectModal, useAccountModal, useChainModal, -} from '../providers/ModalContext'; +} from '../providers'; +import { formatAddress } from '@luno-kit/react/utils' export interface UseConnectButtonReturn { connectionStatus: ConnectionStatus; diff --git a/packages/ui/src/providers/LunoKitProvider.tsx b/packages/ui/src/providers/LunoKitProvider.tsx index 440fbab..6573494 100644 --- a/packages/ui/src/providers/LunoKitProvider.tsx +++ b/packages/ui/src/providers/LunoKitProvider.tsx @@ -1,6 +1,6 @@ import React, { ReactNode, useState } from 'react'; import { LunoProvider } from '@luno-kit/react'; -import type { Config as LunoCoreConfig } from '@luno-kit/react' +import type { Config as LunoCoreConfig } from '@luno-kit/react/types' // @ts-ignore - @tanstack/react-query v5 API changes import { QueryClient, QueryClientProvider, QueryClientConfig } from '@tanstack/react-query'; import { ModalProvider} from './ModalContext'; From 6c5736f9fcb08cd91e204077c93ec80b874af6ad Mon Sep 17 00:00:00 2001 From: WBH <48749219+wbh1328551759@users.noreply.github.com> Date: Sat, 30 Aug 2025 13:30:45 +0800 Subject: [PATCH 29/45] Feat/add connectors (#86) * feat(core): add connector of fealess * fix(ui): fix icon in ConnectButton * feat: add connector of mimir * fix(ui): fix scroll in ConnectOptions * feat: add connector of enkrypt * feat(ui): Optimize the UI of the AccountDetailsModal and add the displayPreference field to the ConnectButton * refactor(core): rename CommonConnector -> InjectConnector * fix(ui): fix ui * fix(core): fix name in connector * fix(react): add sleep in autoconnect * fix(core): update logo of connectors * fix: fix test code --- examples/with-vite/src/main.tsx | 5 +- examples/with-vite/vite.config.ts | 1 - packages/core/package.json | 1 + .../config/logos/generated/enkryptWallet.ts | 6 + .../config/logos/generated/fearlessWallet.ts | 6 + .../core/src/config/logos/generated/index.ts | 3 + .../src/config/logos/generated/mimirWallet.ts | 6 + .../core/src/config/logos/wallets/enkrypt.svg | 13 ++ .../src/config/logos/wallets/fearless.svg | 10 ++ .../core/src/config/logos/wallets/mimir.svg | 15 ++ packages/core/src/connectors/base.ts | 2 +- packages/core/src/connectors/enkrypt.test.ts | 16 ++ packages/core/src/connectors/enkrypt.ts | 13 ++ packages/core/src/connectors/fearless.test.ts | 16 ++ packages/core/src/connectors/fearless.ts | 13 ++ packages/core/src/connectors/index.ts | 5 +- .../{common.test.ts => inject.test.ts} | 6 +- .../src/connectors/{common.ts => inject.ts} | 11 +- packages/core/src/connectors/mimir.test.ts | 156 ++++++++++++++++++ packages/core/src/connectors/mimir.ts | 58 +++++++ packages/core/src/connectors/nova.test.ts | 2 +- packages/core/src/connectors/nova.ts | 2 +- .../core/src/connectors/novaMobile.test.ts | 2 +- packages/core/src/connectors/novaMobile.ts | 6 +- packages/core/src/connectors/polkadot-js.ts | 4 +- packages/core/src/connectors/polkagate.ts | 4 +- packages/core/src/connectors/subwallet.ts | 4 +- packages/core/src/connectors/talisman.ts | 4 +- packages/core/src/types/connector.ts | 2 +- .../react/src/context/LunoProvider.test.tsx | 23 ++- packages/react/src/context/LunoProvider.tsx | 4 +- .../AccountDetailsModal/MainView.tsx | 27 ++- .../components/AccountDetailsModal/index.tsx | 19 +-- .../ui/src/components/ConnectButton/index.tsx | 12 +- .../ConnectModal/ConnectOptions.tsx | 2 +- packages/ui/src/hooks/useConnectButton.ts | 10 +- packages/ui/src/styles/base.css | 2 +- packages/ui/src/theme/types.ts | 2 +- pnpm-lock.yaml | 20 +++ 39 files changed, 446 insertions(+), 67 deletions(-) create mode 100644 packages/core/src/config/logos/generated/enkryptWallet.ts create mode 100644 packages/core/src/config/logos/generated/fearlessWallet.ts create mode 100644 packages/core/src/config/logos/generated/mimirWallet.ts create mode 100644 packages/core/src/config/logos/wallets/enkrypt.svg create mode 100644 packages/core/src/config/logos/wallets/fearless.svg create mode 100644 packages/core/src/config/logos/wallets/mimir.svg create mode 100644 packages/core/src/connectors/enkrypt.test.ts create mode 100644 packages/core/src/connectors/enkrypt.ts create mode 100644 packages/core/src/connectors/fearless.test.ts create mode 100644 packages/core/src/connectors/fearless.ts rename packages/core/src/connectors/{common.test.ts => inject.test.ts} (72%) rename packages/core/src/connectors/{common.ts => inject.ts} (94%) create mode 100644 packages/core/src/connectors/mimir.test.ts create mode 100644 packages/core/src/connectors/mimir.ts diff --git a/examples/with-vite/src/main.tsx b/examples/with-vite/src/main.tsx index d8ac152..e1a6d22 100644 --- a/examples/with-vite/src/main.tsx +++ b/examples/with-vite/src/main.tsx @@ -4,7 +4,7 @@ import './index.css' import App from './App.tsx' import { createConfig } from '@luno-kit/react' import { kusama, polkadot, westend, paseo, polkadotAssetHub, polkadotCoretime, polkadotCollectives, polkadotPeople, kusamaAssetHub, kusamaCoretime, kusamaPeople, paseoAssetHub, paseoPassetHub, westendAssetHub } from '@luno-kit/react/chains' -import { polkagateConnector, subwalletConnector, talismanConnector, polkadotjsConnector, walletConnectConnector, novaConnector } from '@luno-kit/react/connectors' +import { polkagateConnector, subwalletConnector, talismanConnector, polkadotjsConnector, walletConnectConnector, novaConnector, fearlessConnector, mimirConnector, enkryptConnector } from '@luno-kit/react/connectors' import { LunoKitProvider } from '@luno-kit/ui' import '@luno-kit/ui/styles.css' @@ -13,6 +13,9 @@ const connectors = [ subwalletConnector(), talismanConnector(), polkagateConnector(), + fearlessConnector(), + mimirConnector(), + enkryptConnector(), walletConnectConnector({ projectId: import.meta.env.VITE_WALLET_CONNECT_ID }), novaConnector({ projectId: import.meta.env.VITE_WALLET_CONNECT_ID }), ] diff --git a/examples/with-vite/vite.config.ts b/examples/with-vite/vite.config.ts index 07d4c55..0466183 100644 --- a/examples/with-vite/vite.config.ts +++ b/examples/with-vite/vite.config.ts @@ -1,4 +1,3 @@ -// examples/with-vite/vite.config.ts import { defineConfig } from 'vite'; import react from '@vitejs/plugin-react'; diff --git a/packages/core/package.json b/packages/core/package.json index 8f576c6..3d7f23a 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -60,6 +60,7 @@ }, "dependencies": { "@dedot/chaintypes": "catalog:", + "@mimirdev/apps-inject": "3.2.0", "@walletconnect/universal-provider": "2.21.4", "dedot": "catalog:", "eventemitter3": "5.0.1" diff --git a/packages/core/src/config/logos/generated/enkryptWallet.ts b/packages/core/src/config/logos/generated/enkryptWallet.ts new file mode 100644 index 0000000..051a35d --- /dev/null +++ b/packages/core/src/config/logos/generated/enkryptWallet.ts @@ -0,0 +1,6 @@ +// Copyright 2025 Luno contributors +// SPDX-License-Identifier: MIT + +// Do not edit. Auto-generated via node scripts/convertLogos.mjs + +export const enkryptWallet = 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMTIwcHgiIGhlaWdodD0iMTIwcHgiIHZpZXdCb3g9IjAgMCAxMjAgMTIwIiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogICAgPHRpdGxlPuW9oueKtjwvdGl0bGU+CiAgICA8ZGVmcz4KICAgICAgICA8cmFkaWFsR3JhZGllbnQgY3g9IjExMi41JSIgY3k9Ii0xMy43NDk4ODU0JSIgZng9IjExMi41JSIgZnk9Ii0xMy43NDk4ODU0JSIgcj0iMTE0LjQzNSUiIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoMS4xMjUsIC0wLjEzNzUpLCBzY2FsZSgxLCAxKSwgcm90YXRlKDk2LjI3MTEpLCB0cmFuc2xhdGUoLTEuMTI1LCAwLjEzNzUpIiBpZD0icmFkaWFsR3JhZGllbnQtMSI+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiM3MDRCRkYiIG9mZnNldD0iMCUiPjwvc3RvcD4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iI0M1NDlGRiIgb2Zmc2V0PSIyMC45MzUyJSI+PC9zdG9wPgogICAgICAgIDwvcmFkaWFsR3JhZGllbnQ+CiAgICA8L2RlZnM+CiAgICA8ZyBpZD0i6aG16Z2iLTEiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxwYXRoIGQ9Ik0wLDIzLjA5MTcgQzAsMTAuMzM3NiAxMC4zMzg3LDAgMjMuMDkxNywwIEwxMjAsMCBMMTIwLDE3LjcxODIgQzEyMCwyNi44ODQ4IDExMi41NjksMzQuMzE1MiAxMDMuNDAzLDM0LjMxNTIgTDU3Ljg0MDcsMzQuMzE1MiBDNDUuMDg2NiwzNC4zMTUyIDM0Ljc0OSw0NC42NTM5IDM0Ljc0OSw1Ny40MDc5IEwzNC43NDksNjMuMjgzNCBDMzQuNzQ5LDc2LjAzNzUgNDUuMDg2Niw4Ni4zNzUxIDU3Ljg0MDcsODYuMzc1MSBMMTAzLjQwMyw4Ni4zNzUxIEMxMTIuNTY5LDg2LjM3NTEgMTIwLDkzLjgwNjUgMTIwLDEwMi45NzMgTDEyMCwxMjAuMDAxIEwyMy4wOTE3LDEyMC4wMDEgQzEwLjMzODcsMTIwLjAwMSAwLDEwOS42NjEgMCw5Ni45MDgyIEwwLDIzLjA5MTcgWiBNNTguODM3Nyw0My45NzIyIEwxMDUuNTY4LDQzLjk3MjIgQzExMy41MzksNDMuOTcyMiAxMjAsNTAuNDM0MyAxMjAsNTguNDA0NCBMMTIwLDYyLjI4NjEgQzEyMCw3MC4yNTczIDExMy41MzksNzYuNzE5MyAxMDUuNTY4LDc2LjcxOTMgTDU4LjgzNzcsNzYuNzE5MyBDNTAuODY2NSw3Ni43MTkzIDQ0LjQwNDUsNzAuMjU3MyA0NC40MDQ1LDYyLjI4NjEgTDQ0LjQwNDUsNTguNDA0NCBDNDQuNDA0NSw1MC40MzQzIDUwLjg2NjUsNDMuOTcyMiA1OC44Mzc3LDQzLjk3MjIgWiIgaWQ9IuW9oueKtiIgZmlsbD0idXJsKCNyYWRpYWxHcmFkaWVudC0xKSI+PC9wYXRoPgogICAgPC9nPgo8L3N2Zz4='; diff --git a/packages/core/src/config/logos/generated/fearlessWallet.ts b/packages/core/src/config/logos/generated/fearlessWallet.ts new file mode 100644 index 0000000..fc71d68 --- /dev/null +++ b/packages/core/src/config/logos/generated/fearlessWallet.ts @@ -0,0 +1,6 @@ +// Copyright 2025 Luno contributors +// SPDX-License-Identifier: MIT + +// Do not edit. Auto-generated via node scripts/convertLogos.mjs + +export const fearlessWallet = 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNjAwcHgiIGhlaWdodD0iNjAwcHgiIHZpZXdCb3g9IjAgMCA2MDAgNjAwIiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogICAgPHRpdGxlPue8lue7hDwvdGl0bGU+CiAgICA8ZyBpZD0i6aG16Z2iLTEiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxnIGlkPSLnvJbnu4QiPgogICAgICAgICAgICA8Y2lyY2xlIGlkPSLmpK3lnIblvaIiIGZpbGw9IiNFRTAwNzciIGN4PSIzMDAiIGN5PSIzMDAiIHI9IjMwMCI+PC9jaXJjbGU+CiAgICAgICAgICAgIDxwYXRoIGQ9Ik01NDQuMjI4NDcxLDIyNC4yMTE0NDIgTDM1MC45MjY2NjksMjQ5LjU5NTM0NiBDMzQ5LjgzMDk0MSwyNDkuNzM2Njc0IDM0OC44MDUwMDQsMjUwLjI0OTI5MyAzNDguMDA5MzgsMjUxLjAyNzEyIEwzMzIuMDkzNDA1LDI2Ni44MzAwMzMgQzMzMC4xMTEzMjQsMjY4Ljc5MjIyNCAzMjYuOTExMzc5LDI2OC43OTIyMjQgMzI0LjkyOTI5NywyNjYuODMwMDMzIEwzMjIuMTM3NjMzLDI2NC4wNTQ3NyBDMzIwLjEzODEwNCwyNjIuMDc1MTMxIDMyMC4xMzgxMDQsMjU4Ljg0MDI5IDMyMi4xMzc2MzMsMjU2Ljg2MDMwMiBMMzQxLjE0ODg2NiwyMzcuOTk5MTIyIEMzNDMuMTQ0OTA1LDIzNi4wMTk0ODMgMzQzLjE0NDkwNSwyMzIuNzg0NjQyIDM0MS4xNDg4NjYsMjMwLjgwNDY1NCBMMzAzLjU4Mzg4NCwxOTMuNDcxMzgxIEMzMDEuNjAzMTk5LDE5MS41MDk1NCAyOTguNDAyMjA3LDE5MS41MDk1NCAyOTYuNDIxMTcyLDE5My40NzEzODEgTDI1OC44NTc1ODcsMjMwLjgwNDY1NCBDMjU2Ljg1OTEwNCwyMzIuNzg0NjQyIDI1Ni44NTkxMDQsMjM2LjAxOTQ4MyAyNTguODU3NTg3LDIzNy45OTkxMjIgTDI3Ny44NTE3MjEsMjU2Ljg3ODA5OSBDMjc5Ljg1MDIwMywyNTguODU3NzM4IDI3OS44NTAyMDMsMjYyLjA5MjU3OSAyNzcuODUxNzIxLDI2NC4wNzI1NjcgTDI3NS4wNTcyNjUsMjY2Ljg0NzgzIEMyNzMuMDc2NTc5LDI2OC44MDk2NzIgMjY5Ljg3NTU4NywyNjguODA5NjcyIDI2Ny44OTQ1NTMsMjY2Ljg0NzgzIEwyNTEuOTc3ODgsMjUxLjA0NDU2OCBDMjUxLjE4MTkwNiwyNTAuMjY3MDkgMjUwLjE1NjMxOSwyNDkuNzU0NDcgMjQ5LjA1OTg5MywyNDkuNjEyNzkzIEw1NS43NTgwOTEsMjI0LjIxMTQ0MiBDNTAuOTQ3NzA0OCwyMjMuNTc0OTQyIDQ4LjA2NDk2MjYsMjI5LjQyNTkyMSA1MS41MTMzNjU3LDIzMi44Mzc2ODQgTDkzLjY3NTUxOTcsMjc0LjczMTQ4OSBDOTYuODk0MzA4NCwyNzcuOTMxMDg1IDk0LjYzMDYxNzgsMjgzLjQxMDc3MyA5MC4xMDMyMzY2LDI4My40MTA3NzMgQzg1LjU3NTUwNjMsMjgzLjQxMDc3MyA4My4zMTE4MTU3LDI4OC44OTA0NjEgODYuNTMwNjA0NCwyOTIuMDkwMDU3IEwxMjYuMDM5OTgsMzMxLjM1MDI3NiBDMTI2LjY5NDI3NiwzMzEuOTg2NDI2IDEyNy40OTAyNDksMzMyLjQ0NjAwNCAxMjguMzkxOTU3LDMzMi42NzU5NjcgTDI2Mi44NzIsMzY2LjM2Nzg2MyBDMjYzLjk2ODQyNiwzNjYuNjMzMDcyIDI2NC45MjM1MjQsMzY3LjI2OTIyMiAyNjUuNjMwODYyLDM2OC4xNTMxMzMgTDI4Ni40NDY5MDUsMzk0LjU3OTcyMyBDMjkwLjE2MDUxNywzOTkuNzA2MjY1IDI5Ni40MjExNzIsNDA1LjYyNzczNCAyOTYuNDIxMTcyLDQwNS42Mjc3MzQgQzI5OC40MDIyMDcsNDA3LjU4OTkyNSAzMDEuNjAzMTk5LDQwNy41ODk5MjUgMzAzLjU4Mzg4NCw0MDUuNjI3NzM0IEMzMDMuNTgzODg0LDQwNS42Mjc3MzQgMzA4Ljc2NTU2Miw0MDAuMzk1NDU3IDMxMy41NTg1LDM5NC41Nzk3MjMgTDMzNC4zNzU1OTEsMzY4LjE1MzEzMyBDMzM1LjA2MzAzOCwzNjcuMjY5MjIyIDMzNi4wMzY2MzEsMzY2LjY1MDUxOSAzMzcuMTMyMzU5LDM2Ni4zNjc4NjMgTDQ3MS42MzEyNDYsMzMyLjY3NTk2NyBDNDcyLjUxNDExLDMzMi40NDYwMDQgNDczLjMyNzE4MiwzMzIuMDA0MjIzIDQ3My45ODMyMjMsMzMxLjM1MDI3NiBMNTEzLjQ5MjI0OSwyOTIuMDkwMDU3IEM1MTYuNzA5NjQyLDI4OC44OTA0NjEgNTE0LjQ0ODM5NCwyODMuNDEwNzczIDUwOS45MTg5MTksMjgzLjQxMDc3MyBDNTA1LjM5MjkzNCwyODMuNDEwNzczIDUwMy4xMjgxOTYsMjc3LjkzMTA4NSA1MDYuMzQ5MDc5LDI3NC43MzE0ODkgTDU0OC41MTAxODYsMjMyLjgzNzY4NCBDNTUxLjkyMjk5NSwyMjkuNDI1OTIxIDU0OS4wNDA2MDIsMjIzLjU5MjczOSA1NDQuMjI4NDcxLDIyNC4yMTE0NDIgWiIgaWQ9Iui3r+W+hCIgZmlsbD0iI0ZGRkZGRiIgZmlsbC1ydWxlPSJub256ZXJvIj48L3BhdGg+CiAgICAgICAgPC9nPgogICAgPC9nPgo8L3N2Zz4='; diff --git a/packages/core/src/config/logos/generated/index.ts b/packages/core/src/config/logos/generated/index.ts index e67b415..777c565 100644 --- a/packages/core/src/config/logos/generated/index.ts +++ b/packages/core/src/config/logos/generated/index.ts @@ -11,7 +11,10 @@ export { bridgehubChain } from './bridgehubChain.js'; export { collectivesChain } from './collectivesChain.js'; export { coretimeChain } from './coretimeChain.js'; export { coretimeKusamaChain } from './coretimeKusamaChain.js'; +export { enkryptWallet } from './enkryptWallet.js'; +export { fearlessWallet } from './fearlessWallet.js'; export { kusamaChain } from './kusamaChain.js'; +export { mimirWallet } from './mimirWallet.js'; export { novaWallet } from './novaWallet.js'; export { paseoChain } from './paseoChain.js'; export { peopleChain } from './peopleChain.js'; diff --git a/packages/core/src/config/logos/generated/mimirWallet.ts b/packages/core/src/config/logos/generated/mimirWallet.ts new file mode 100644 index 0000000..998a20e --- /dev/null +++ b/packages/core/src/config/logos/generated/mimirWallet.ts @@ -0,0 +1,6 @@ +// Copyright 2025 Luno contributors +// SPDX-License-Identifier: MIT + +// Do not edit. Auto-generated via node scripts/convertLogos.mjs + +export const mimirWallet = 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiB2aWV3Qm94PSIwIDAgMjQgMjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgY2xhc3M9Ik1pbWlyIgogICAgIGFsdD0iTWltaXIiPgogICAgPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAwXzExMzMyXzQwNTI5KSI+CiAgICAgICAgPHBhdGggZD0iTTAgNi42MjA2OUMwIDIuOTY0MTggMi45NjQxOCAwIDYuNjIwNjkgMEgxNy4zNzkzQzIxLjAzNTggMCAyNCAyLjk2NDE4IDI0IDYuNjIwNjlWMTcuMzc5M0MyNCAyMS4wMzU4IDIxLjAzNTggMjQgMTcuMzc5MyAyNEg2LjYyMDY5QzIuOTY0MTggMjQgMCAyMS4wMzU4IDAgMTcuMzc5M1Y2LjYyMDY5WiIKICAgICAgICAgICAgICBmaWxsPSIjM0MxOUZEIj48L3BhdGg+CiAgICAgICAgPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiCiAgICAgICAgICAgICAgZD0iTTE4LjY4OTQgOS4yNTQyNUwxOC42ODkzIDE5LjE2ODNIMTUuNzM0OUwxNS43MzQ5IDE0LjM1ODVDMTQuNjc1MSAxNS4yMDE1IDEzLjQyNjggMTUuNjQwNyAxMiAxNS42NDA3QzEwLjU3MzIgMTUuNjQwNyA5LjMyNDkgMTUuMjAxNSA4LjI2NTA1IDE0LjM1ODVMOC4yNjUxNCAxOS4xNjgzSDUuMzEwN0w1LjMxMDcyIDkuMjU0MzJDNS43NDIyOCA5LjUxNjA0IDYuMjQ3NjggOS42NjY1MSA2Ljc4NzkyIDkuNjY2NTFDNy4zMjgxNiA5LjY2NjUxIDcuODMzNTUgOS41MTYwNCA4LjI2NTEyIDkuMjU0MzNMOC4yNjUwNiA5LjM1NDM4QzkuMTkxNzYgMTEuNjk1MiAxMC40MDg3IDEyLjcxNzEgMTIgMTIuNzE3MUMxMy41OTEzIDEyLjcxNzEgMTQuODA4MyAxMS42OTUyIDE1LjczNDkgOS4zNTQzOEwxNS43MzQ5IDkuMjU0MzNDMTYuMTY2NCA5LjUxNjA0IDE2LjY3MTggOS42NjY1MSAxNy4yMTIxIDkuNjY2NTFDMTcuNzUyNCA5LjY2NjUxIDE4LjI1NzggOS41MTYwMiAxOC42ODk0IDkuMjU0MjVaTTYuNzg3OTIgOC41NDIwOEM3Ljc1NzcxIDguNTQyMDggOC41NDM4NiA3Ljc0OTE2IDguNTQzODYgNi43NzEwNEM4LjU0Mzg2IDUuNzkyOTMgNy43NTc3MSA1IDYuNzg3OTIgNUM1LjgxODE0IDUgNS4wMzE5OCA1Ljc5MjkzIDUuMDMxOTggNi43NzEwNEM1LjAzMTk4IDcuNzQ5MTYgNS44MTgxNCA4LjU0MjA4IDYuNzg3OTIgOC41NDIwOFpNMTcuMjEyMSA4LjU0MjA4QzE4LjE4MTkgOC41NDIwOCAxOC45NjggNy43NDkxNiAxOC45NjggNi43NzEwNEMxOC45NjggNS43OTI5MyAxOC4xODE5IDUgMTcuMjEyMSA1QzE2LjI0MjMgNSAxNS40NTYxIDUuNzkyOTMgMTUuNDU2MSA2Ljc3MTA0QzE1LjQ1NjEgNy43NDkxNiAxNi4yNDIzIDguNTQyMDggMTcuMjEyMSA4LjU0MjA4WiIKICAgICAgICAgICAgICBmaWxsPSJ3aGl0ZSI+PC9wYXRoPgogICAgPC9nPgogICAgPGRlZnM+CiAgICAgICAgPGNsaXBQYXRoIGlkPSJjbGlwMF8xMTMzMl80MDUyOSI+CiAgICAgICAgICAgIDxyZWN0IHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0id2hpdGUiPjwvcmVjdD4KICAgICAgICA8L2NsaXBQYXRoPgogICAgPC9kZWZzPgo8L3N2Zz4K'; diff --git a/packages/core/src/config/logos/wallets/enkrypt.svg b/packages/core/src/config/logos/wallets/enkrypt.svg new file mode 100644 index 0000000..18feef5 --- /dev/null +++ b/packages/core/src/config/logos/wallets/enkrypt.svg @@ -0,0 +1,13 @@ + + + 形状 + + + + + + + + + + \ No newline at end of file diff --git a/packages/core/src/config/logos/wallets/fearless.svg b/packages/core/src/config/logos/wallets/fearless.svg new file mode 100644 index 0000000..21a3ea1 --- /dev/null +++ b/packages/core/src/config/logos/wallets/fearless.svg @@ -0,0 +1,10 @@ + + + 编组 + + + + + + + \ No newline at end of file diff --git a/packages/core/src/config/logos/wallets/mimir.svg b/packages/core/src/config/logos/wallets/mimir.svg new file mode 100644 index 0000000..aeb34dc --- /dev/null +++ b/packages/core/src/config/logos/wallets/mimir.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + diff --git a/packages/core/src/connectors/base.ts b/packages/core/src/connectors/base.ts index 9000118..9e9a9b5 100644 --- a/packages/core/src/connectors/base.ts +++ b/packages/core/src/connectors/base.ts @@ -57,7 +57,7 @@ export abstract class BaseConnector extends EventEmitter { * 5. (optional) trigger the 'connect' event. * @returns the initial available accounts list */ - abstract connect(appName: string, chains?: Chain[], targetChainId?: string): Promise>; + abstract connect(appName: string, chains?: Chain[], targetChainId?: string): Promise; /** * disconnect from the wallet. * subclasses must implement this method to perform specific cleanup logic diff --git a/packages/core/src/connectors/enkrypt.test.ts b/packages/core/src/connectors/enkrypt.test.ts new file mode 100644 index 0000000..9ecd7fe --- /dev/null +++ b/packages/core/src/connectors/enkrypt.test.ts @@ -0,0 +1,16 @@ +import { describe } from 'vitest'; +import { enkryptConnector } from './enkrypt'; +import { createConnectorTestSuite } from './test-helper' +import { enkryptWallet } from '../config/logos/generated' + +describe( + 'enkryptConnector', + createConnectorTestSuite({ + getConnector: () => enkryptConnector(), + expected: { + id: 'enkrypt', + name: 'Enkrypt', + icon: enkryptWallet, + }, + }) +) diff --git a/packages/core/src/connectors/enkrypt.ts b/packages/core/src/connectors/enkrypt.ts new file mode 100644 index 0000000..9e936a6 --- /dev/null +++ b/packages/core/src/connectors/enkrypt.ts @@ -0,0 +1,13 @@ +import { InjectConnector } from './inject' +import { enkryptWallet } from '../config/logos/generated' + +export const enkryptConnector = () => { + return new InjectConnector({ + id: 'enkrypt', + name: 'Enkrypt', + icon: enkryptWallet, + links: { + browserExtension: 'https://www.enkrypt.com' + } + }); +} diff --git a/packages/core/src/connectors/fearless.test.ts b/packages/core/src/connectors/fearless.test.ts new file mode 100644 index 0000000..3c2714b --- /dev/null +++ b/packages/core/src/connectors/fearless.test.ts @@ -0,0 +1,16 @@ +import { describe } from 'vitest'; +import { fearlessConnector } from './fearless'; +import { createConnectorTestSuite } from './test-helper' +import { fearlessWallet } from '../config/logos/generated' + +describe( + 'fearlessConnector', + createConnectorTestSuite({ + getConnector: () => fearlessConnector(), + expected: { + id: 'fearless-wallet', + name: 'Fearless', + icon: fearlessWallet, + }, + }) +) diff --git a/packages/core/src/connectors/fearless.ts b/packages/core/src/connectors/fearless.ts new file mode 100644 index 0000000..249832e --- /dev/null +++ b/packages/core/src/connectors/fearless.ts @@ -0,0 +1,13 @@ +import { InjectConnector } from './inject' +import { fearlessWallet } from '../config/logos/generated' + +export const fearlessConnector = () => { + return new InjectConnector({ + id: 'fearless-wallet', + name: 'Fearless', + icon: fearlessWallet, + links: { + browserExtension: 'https://fearlesswallet.io' + } + }); +} diff --git a/packages/core/src/connectors/index.ts b/packages/core/src/connectors/index.ts index 4264ab5..eefb36b 100644 --- a/packages/core/src/connectors/index.ts +++ b/packages/core/src/connectors/index.ts @@ -1,10 +1,13 @@ export { BaseConnector } from './base'; -export { CommonConnector } from './common' +export { InjectConnector } from './inject'; +export { enkryptConnector } from './enkrypt'; +export { fearlessConnector } from './fearless' export { polkadotjsConnector } from './polkadot-js'; export { polkagateConnector } from './polkagate'; export { subwalletConnector } from './subwallet'; export { talismanConnector } from './talisman'; export { walletConnectConnector } from './walletconnect'; +export { mimirConnector } from './mimir'; export { novaConnector } from './nova'; export { novaMobileConnector } from './novaMobile' diff --git a/packages/core/src/connectors/common.test.ts b/packages/core/src/connectors/inject.test.ts similarity index 72% rename from packages/core/src/connectors/common.test.ts rename to packages/core/src/connectors/inject.test.ts index 84c2aeb..321fbfe 100644 --- a/packages/core/src/connectors/common.test.ts +++ b/packages/core/src/connectors/inject.test.ts @@ -1,5 +1,5 @@ import { describe } from 'vitest' -import { CommonConnector } from './common' +import { InjectConnector } from './inject' import { createConnectorTestSuite } from './test-helper' const options = { @@ -11,9 +11,9 @@ const options = { }; describe( - 'CommonConnector', + 'InjectConnector', createConnectorTestSuite({ - getConnector: () => new CommonConnector(options), + getConnector: () => new InjectConnector(options), expected: options, }) ); diff --git a/packages/core/src/connectors/common.ts b/packages/core/src/connectors/inject.ts similarity index 94% rename from packages/core/src/connectors/common.ts rename to packages/core/src/connectors/inject.ts index 9dd7299..c7c31c1 100644 --- a/packages/core/src/connectors/common.ts +++ b/packages/core/src/connectors/inject.ts @@ -1,11 +1,11 @@ import { BaseConnector } from './base'; import type { Account, Signer } from '../types'; -import { mapInjectedAccounts } from '../utils/address' +import { mapInjectedAccounts } from '../utils' import { Injected, InjectedAccount } from 'dedot/types' import { stringToHex } from 'dedot/utils' import { ConnectorLinks } from '../types' -export interface CommonConnectorOptions { +export interface InjectConnectorOptions { id: string; name: string; icon: string; @@ -13,7 +13,7 @@ export interface CommonConnectorOptions { injectorId?: string; } -export class CommonConnector extends BaseConnector { +export class InjectConnector extends BaseConnector { readonly id: string; readonly name: string; readonly icon: string; @@ -24,7 +24,7 @@ export class CommonConnector extends BaseConnector { private specificInjector?: Injected = undefined - constructor(options: CommonConnectorOptions) { + constructor(options: InjectConnectorOptions) { super(); this.id = options.id; this.name = options.name; @@ -43,7 +43,7 @@ export class CommonConnector extends BaseConnector { return this.isInstalled(); } - public async connect(appName: string): Promise> { + public async connect(appName: string): Promise { console.log(`Connector ${this.id}: Attempting to connect...`); if (this.signer) { console.log(`Connector ${this.id}: Already connected.`); @@ -108,6 +108,7 @@ export class CommonConnector extends BaseConnector { const result = await signer.signRaw({ address, data: dataHex, type: 'bytes' }); return result.signature; } catch (error: any) { + console.log('error', error) throw new Error(`Connector ${this.id}: Failed to sign message: ${error.message}`); } } diff --git a/packages/core/src/connectors/mimir.test.ts b/packages/core/src/connectors/mimir.test.ts new file mode 100644 index 0000000..205d98e --- /dev/null +++ b/packages/core/src/connectors/mimir.test.ts @@ -0,0 +1,156 @@ +import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest'; +import { MimirConnector, mimirConnector } from './mimir'; +import { mimirWallet } from '../config/logos/generated'; + +vi.mock('@mimirdev/apps-inject', () => ({ + isMimirReady: vi.fn(), + inject: vi.fn(), + MIMIR_REGEXP: /^https:\/\/(app|dev)\.mimir\.global$/ +})); + +describe('MimirConnector', () => { + let connector: MimirConnector; + let originalWindow: any; + + beforeEach(() => { + originalWindow = globalThis.window; + connector = mimirConnector(); + vi.clearAllMocks(); + }); + + afterEach(() => { + Object.defineProperty(globalThis, 'window', { + value: originalWindow, + writable: true, + configurable: true + }); + vi.restoreAllMocks(); + }); + + describe('basic properties', () => { + it('should have correct connector metadata', () => { + expect(connector.id).toBe('mimir'); + expect(connector.name).toBe('Mimir'); + expect(connector.icon).toBe(mimirWallet); + }); + }); + + describe('installation detection', () => { + it('should return false when not in iframe', () => { + Object.defineProperty(globalThis, 'window', { + value: { + parent: window + }, + writable: true, + configurable: true + }); + + expect(connector.isInstalled()).toBe(false); + }); + + it('should return true after successful injection', async () => { + Object.defineProperty(globalThis, 'window', { + value: { + parent: {}, + injectedWeb3: { mimir: {} } + }, + writable: true, + configurable: true + }); + + const { isMimirReady } = await import('@mimirdev/apps-inject'); + (isMimirReady as any).mockResolvedValue('https://app.mimir.global'); + + await (connector as any).mimirInject(); + + expect(connector.isInstalled()).toBe(true); + }); + }); + + describe('inherited functionality', () => { + it('should inherit isAvailable method from InjectConnector', async () => { + vi.spyOn(connector, 'isInstalled').mockReturnValue(true); + + expect(await connector.isAvailable()).toBe(true); + + (connector.isInstalled as any).mockReturnValue(false); + + expect(await connector.isAvailable()).toBe(false); + }); + }); + + describe('connection behavior', () => { + it('should redirect to Mimir when not in Mimir environment', async () => { + Object.defineProperty(globalThis, 'window', { + value: { + parent: {}, + origin: 'https://example.com', + open: vi.fn() + }, + writable: true, + configurable: true + }); + + (connector as any).mimirReady = false; + const { MIMIR_REGEXP } = await import('@mimirdev/apps-inject'); + + vi.spyOn(MIMIR_REGEXP, 'test').mockReturnValue(false); + + const connectPromise = await connector.connect('test-app'); + + const expectedUrl = `https://app.mimir.global/explorer/${encodeURIComponent('https://example.com')}`; + + expect(window.open).toHaveBeenCalledWith(expectedUrl); + + expect(await connectPromise).toBeUndefined(); + }); + + it('should call super.connect when in Mimir environment', async () => { + Object.defineProperty(globalThis, 'window', { + value: { + parent: {}, + origin: 'https://app.mimir.global', + injectedWeb3: { + mimir: { + enable: vi.fn().mockResolvedValue({ + accounts: { get: vi.fn().mockResolvedValue([]), subscribe: vi.fn() }, + signer: {} + }) + } + } + }, + writable: true, + configurable: true + }); + + (connector as any).mimirReady = true; + + const superConnectSpy = vi.spyOn(Object.getPrototypeOf(MimirConnector.prototype), 'connect'); + superConnectSpy.mockResolvedValue([{ address: '123', meta: { name: 'Test' } }]); + + const accounts = await connector.connect('test-app'); + + expect(superConnectSpy).toHaveBeenCalledWith('test-app'); + + expect(accounts).toEqual([{ address: '123', meta: { name: 'Test' } }]); + }); + + it('should check MIMIR_REGEXP against window.origin', async () => { + Object.defineProperty(globalThis, 'window', { + value: { + parent: {}, + origin: 'https://not-mimir.example.com', + open: vi.fn() + }, + writable: true, + configurable: true + }); + + (connector as any).mimirReady = false; + + await connector.connect('test-app'); + + expect(window.open).toHaveBeenCalled(); + }); + }); +}); diff --git a/packages/core/src/connectors/mimir.ts b/packages/core/src/connectors/mimir.ts new file mode 100644 index 0000000..c04b067 --- /dev/null +++ b/packages/core/src/connectors/mimir.ts @@ -0,0 +1,58 @@ +import { InjectConnector, InjectConnectorOptions } from './inject'; +import { mimirWallet } from '../config/logos/generated' + +export class MimirConnector extends InjectConnector { + private mimirReady: boolean = false; + + constructor(options: InjectConnectorOptions) { + super({ ...options }); + + this.mimirInject() + } + + public isInstalled(): boolean { + return this.mimirReady + } + + private async mimirInject() { + try { + const inIframe = typeof window !== 'undefined' && window !== window.parent; + if (!inIframe) return + + const { isMimirReady, MIMIR_REGEXP, inject } = await import('@mimirdev/apps-inject'); + + const origin = await isMimirReady(); + + if (origin && MIMIR_REGEXP.test(origin)) { + inject(); + this.mimirReady = true + } + } catch (e: any) { + console.error('Failed to inject Mimir:', e); + } + } + + public async connect(appName: string) { + if (!this.mimirReady) { + const { MIMIR_REGEXP } = await import('@mimirdev/apps-inject'); + + if (!window.origin || !MIMIR_REGEXP.test(window.origin)) { + window.open(`https://app.mimir.global/explorer/${encodeURIComponent(window.origin)}`) + return + } + } + + return super.connect(appName); + } +} + +export function mimirConnector(): MimirConnector { + return new MimirConnector({ + id: 'mimir', + name: 'Mimir', + icon: mimirWallet, + links: { + browserExtension: 'https://mimir.global', + }, + }); +} diff --git a/packages/core/src/connectors/nova.test.ts b/packages/core/src/connectors/nova.test.ts index 1e4c401..19bb036 100644 --- a/packages/core/src/connectors/nova.test.ts +++ b/packages/core/src/connectors/nova.test.ts @@ -8,7 +8,7 @@ describe('NovaConnector', getConnector: novaConnector, expected: { id: 'nova', - name: 'Nova Wallet', + name: 'Nova', icon: novaWallet, }, }) diff --git a/packages/core/src/connectors/nova.ts b/packages/core/src/connectors/nova.ts index 97c090f..5d6da6f 100644 --- a/packages/core/src/connectors/nova.ts +++ b/packages/core/src/connectors/nova.ts @@ -31,7 +31,7 @@ export const novaConnector = (config: NovaConnectorConfig) => { return new WalletConnectConnector({ id: 'nova', - name: 'Nova Wallet', + name: 'Nova', icon: novaWallet, links: { browserExtension: 'https://novawallet.io', diff --git a/packages/core/src/connectors/novaMobile.test.ts b/packages/core/src/connectors/novaMobile.test.ts index c05d1bf..d884198 100644 --- a/packages/core/src/connectors/novaMobile.test.ts +++ b/packages/core/src/connectors/novaMobile.test.ts @@ -9,7 +9,7 @@ describe( getConnector: () => novaMobileConnector(), expected: { id: 'nova-mobile', - name: 'Nova Wallet', + name: 'Nova', icon: novaWallet, injectorId: 'polkadot-js', }, diff --git a/packages/core/src/connectors/novaMobile.ts b/packages/core/src/connectors/novaMobile.ts index 38f7c4a..857244d 100644 --- a/packages/core/src/connectors/novaMobile.ts +++ b/packages/core/src/connectors/novaMobile.ts @@ -1,11 +1,11 @@ import { novaWallet } from '../config/logos/generated' -import { CommonConnector } from './common' +import { InjectConnector } from './inject' -export class NovaMobileConnector extends CommonConnector { +export class NovaMobileConnector extends InjectConnector { constructor() { super({ id: 'nova-mobile', - name: 'Nova Wallet', + name: 'Nova', icon: novaWallet, injectorId: 'polkadot-js', links: { diff --git a/packages/core/src/connectors/polkadot-js.ts b/packages/core/src/connectors/polkadot-js.ts index de5d03b..7c112ca 100644 --- a/packages/core/src/connectors/polkadot-js.ts +++ b/packages/core/src/connectors/polkadot-js.ts @@ -1,8 +1,8 @@ -import { CommonConnector } from './common' +import { InjectConnector } from './inject' import { polkadotjsWallet } from '../config/logos/generated' export const polkadotjsConnector = () => { - return new CommonConnector({ + return new InjectConnector({ id: 'polkadot-js', name: 'Polkadot{.js}', icon: polkadotjsWallet, diff --git a/packages/core/src/connectors/polkagate.ts b/packages/core/src/connectors/polkagate.ts index 1b8ef9b..c7c9acb 100644 --- a/packages/core/src/connectors/polkagate.ts +++ b/packages/core/src/connectors/polkagate.ts @@ -1,8 +1,8 @@ import { polkagateWallet } from '../config/logos/generated' -import { CommonConnector } from './common' +import { InjectConnector } from './inject' export const polkagateConnector = () => { - return new CommonConnector({ + return new InjectConnector({ id: 'polkagate', name: 'Polkagate', icon: polkagateWallet, diff --git a/packages/core/src/connectors/subwallet.ts b/packages/core/src/connectors/subwallet.ts index 9f1d7f7..e25f95e 100644 --- a/packages/core/src/connectors/subwallet.ts +++ b/packages/core/src/connectors/subwallet.ts @@ -1,8 +1,8 @@ import { subwalletWallet } from '../config/logos/generated' -import { CommonConnector } from './common' +import { InjectConnector } from './inject' export const subwalletConnector = () => { - return new CommonConnector({ + return new InjectConnector({ id: 'subwallet-js', name: 'SubWallet', icon: subwalletWallet, diff --git a/packages/core/src/connectors/talisman.ts b/packages/core/src/connectors/talisman.ts index 777634b..89a6aa8 100644 --- a/packages/core/src/connectors/talisman.ts +++ b/packages/core/src/connectors/talisman.ts @@ -1,8 +1,8 @@ import { talismanWallet } from '../config/logos/generated' -import { CommonConnector } from './common' +import { InjectConnector } from './inject' export const talismanConnector = () => { - return new CommonConnector({ + return new InjectConnector({ id: 'talisman', name: 'Talisman', icon: talismanWallet, diff --git a/packages/core/src/types/connector.ts b/packages/core/src/types/connector.ts index 336db66..8db4ff4 100644 --- a/packages/core/src/types/connector.ts +++ b/packages/core/src/types/connector.ts @@ -16,7 +16,7 @@ export interface Connector extends EventEmitter { readonly links: ConnectorLinks; isAvailable(): Promise; isInstalled: () => boolean; - connect(appName: string, chains?: Chain[], targetChainId?: string): Promise>; + connect(appName: string, chains?: Chain[], targetChainId?: string): Promise; disconnect(): Promise; getAccounts(): Promise>; getSigner(): Promise; diff --git a/packages/react/src/context/LunoProvider.test.tsx b/packages/react/src/context/LunoProvider.test.tsx index 45157b3..edb257e 100644 --- a/packages/react/src/context/LunoProvider.test.tsx +++ b/packages/react/src/context/LunoProvider.test.tsx @@ -7,7 +7,7 @@ import { BaseConnector } from '@luno-kit/core/connectors'; import { createConfig } from '@luno-kit/core'; import type { LunoState } from '../types'; import { ConnectionStatus } from '../types' -import { createApi } from '../utils'; +import { createApi, sleep } from '../utils'; import { useIsInitialized } from '../hooks/useIsInitialized' import { useLunoStore } from '../store' @@ -15,9 +15,15 @@ vi.mock('../utils/createApi'); vi.mock('../hooks/useIsInitialized'); vi.mock('../store'); +vi.mock('../utils', () => ({ + createApi: vi.fn(), + sleep: vi.fn().mockResolvedValue(undefined) +})); + const mockCreateApi = vi.mocked(createApi); const mockUseIsInitialized = vi.mocked(useIsInitialized); const mockUseLunoStore = vi.mocked(useLunoStore); +const mockSleep = vi.mocked(sleep); const mockStorage = { getItem: vi.fn().mockResolvedValue(null), @@ -69,6 +75,7 @@ const mockChain: Chain = { webSocket: ['ws://test.com'], }, chainIconUrl: 'test-icon.svg', + testnet: false, }; const mockStore: LunoState = { @@ -114,6 +121,7 @@ describe('LunoProvider', () => { mockUseLunoStore.mockReturnValue(mockStore); mockConfig = createConfig({ + appName: 'Test App', chains: [mockChain], connectors: [mockConnector], transports: { @@ -259,11 +267,13 @@ describe('LunoProvider', () => { ); + expect(mockSleep).toHaveBeenCalledWith(500); + await waitFor(() => { expect(mockStorage.getItem).toHaveBeenCalledWith('lastConnectorId'); expect(mockStorage.getItem).toHaveBeenCalledWith('lastChainId'); expect(mockStore.connect).toHaveBeenCalledWith('test-connector', '0x123'); - }); + }, { timeout: 3000 }); }); it('should not attempt auto-connect when disabled', async () => { @@ -291,6 +301,7 @@ describe('LunoProvider', () => { it('should warn when storage is not available', async () => { const configWithoutStorage = { + appName: 'Test App', chains: [mockChain], connectors: [mockConnector], transports: { '0x123': 'ws://test.com' }, @@ -306,9 +317,11 @@ describe('LunoProvider', () => { ); - expect(consoleWarnSpy).toHaveBeenCalledWith( - '[LunoProvider]: AutoConnect Storage not available, cannot auto-connect.' - ); + await waitFor(() => { + expect(consoleWarnSpy).toHaveBeenCalledWith( + '[LunoProvider]: AutoConnect Storage not available, cannot auto-connect.' + ); + }); }); it('should handle auto-connect errors gracefully', async () => { diff --git a/packages/react/src/context/LunoProvider.tsx b/packages/react/src/context/LunoProvider.tsx index 7a3864f..58104b7 100644 --- a/packages/react/src/context/LunoProvider.tsx +++ b/packages/react/src/context/LunoProvider.tsx @@ -4,7 +4,7 @@ import { useLunoStore } from '../store' import { PERSIST_KEY } from '../constants' import { LunoContext, LunoContextState } from './LunoContext' import { useIsInitialized } from '../hooks/useIsInitialized' -import { createApi } from '../utils' +import { createApi, sleep } from '../utils' interface LunoProviderProps { config: Config; @@ -90,7 +90,7 @@ export const LunoProvider: React.FC = ({ config: configFromPr useEffect(() => { const performAutoConnect = async () => { - + await sleep(500) if (!configFromProps.autoConnect) { console.log('[LunoProvider]: AutoConnect disabled or config not set.'); return; diff --git a/packages/ui/src/components/AccountDetailsModal/MainView.tsx b/packages/ui/src/components/AccountDetailsModal/MainView.tsx index 51ffd47..752c2b6 100644 --- a/packages/ui/src/components/AccountDetailsModal/MainView.tsx +++ b/packages/ui/src/components/AccountDetailsModal/MainView.tsx @@ -3,7 +3,7 @@ import { cs } from '../../utils'; import { Arrow, Disconnect, List, Switch } from '../../assets/icons'; import { ChainIcon } from '../ChainIcon'; import { AccountModalView } from './index' -import { useAccount, useChain, useDisconnect } from '@luno-kit/react' +import {useAccount, useBalance, useChain, useDisconnect} from '@luno-kit/react' import { getExplorerUrl } from '@luno-kit/react/utils' interface MainViewProps { @@ -18,6 +18,7 @@ export const MainView: React.FC = ({ const { address } = useAccount(); const { chain } = useChain(); const { disconnectAsync } = useDisconnect(); + const { data: balance } = useBalance({ address }); const items = useMemo(() => { return [ @@ -28,17 +29,27 @@ export const MainView: React.FC = ({

+
+
+
+ {chain?.name || 'Polkadot'} + {balance ? ( + + {balance.formattedTransferable || '0.00'} {chain?.nativeCurrency?.symbol || 'DOT'} + + ) : ( + + )}
- {chain?.name || 'Polkadot'}
- {/*
-
*/} +
), onClick: () => onViewChange(AccountModalView.switchChain) @@ -47,7 +58,7 @@ export const MainView: React.FC = ({ key: 'View on Explorer', content: ( <> - + View on Explorer ), @@ -57,14 +68,14 @@ export const MainView: React.FC = ({ key: 'Switch Account', content: ( <> - + Switch Account ), onClick: () => onViewChange(AccountModalView.switchAccount) } ]; - }, [onViewChange, chain, address]) + }, [onViewChange, chain, address, balance]) const handleDisconnect = async () => { await disconnectAsync(); diff --git a/packages/ui/src/components/AccountDetailsModal/index.tsx b/packages/ui/src/components/AccountDetailsModal/index.tsx index dcbd465..0d5c372 100644 --- a/packages/ui/src/components/AccountDetailsModal/index.tsx +++ b/packages/ui/src/components/AccountDetailsModal/index.tsx @@ -1,5 +1,5 @@ import React, { useCallback, useMemo } from 'react'; -import { useAccount, useActiveConnector, useBalance, useChain } from '@luno-kit/react'; +import { useAccount, useActiveConnector } from '@luno-kit/react'; import { Dialog, DialogClose, DialogTitle } from '../Dialog'; import { cs } from '../../utils'; import { useAccountModal } from '../../providers'; @@ -19,9 +19,7 @@ export enum AccountModalView { export const AccountDetailsModal: React.FC = () => { const { isOpen, close } = useAccountModal(); - const { address } = useAccount(); - const { chain } = useChain(); - const { data: balance } = useBalance({ address }); + const { address, account } = useAccount(); const activeConnector = useActiveConnector() const { @@ -74,8 +72,7 @@ export const AccountDetailsModal: React.FC = () => {
{activeConnector?.icon && (
- +
)}
@@ -86,14 +83,8 @@ export const AccountDetailsModal: React.FC = () => {
-
- {balance === undefined ? ( -
- ) : ( - <> - {balance?.formattedTransferable || '0.00'} {chain?.nativeCurrency?.symbol || 'DOT'} - - )} +
+ {account?.name || activeConnector?.name}
diff --git a/packages/ui/src/components/ConnectButton/index.tsx b/packages/ui/src/components/ConnectButton/index.tsx index 15d6df2..8e9f4a9 100644 --- a/packages/ui/src/components/ConnectButton/index.tsx +++ b/packages/ui/src/components/ConnectButton/index.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import { useLunoWallet, useWindowSize } from '../../hooks'; +import { useConnectButton, useWindowSize } from '../../hooks'; import { cs } from '../../utils'; import { ChainIcon } from '../ChainIcon' @@ -12,6 +12,7 @@ export interface ConnectButtonProps { accountStatus?: 'full' | 'address'; chainStatus?: 'full' | 'icon' | 'name' | 'none'; showBalance?: boolean; + displayPreference?: 'address' | 'name' } export const ConnectButton: React.FC = ({ @@ -20,11 +21,12 @@ export const ConnectButton: React.FC = ({ accountStatus = 'full', chainStatus = 'full', showBalance = true, + displayPreference = 'address', }) => { const { isConnected, isDisconnected, - displayAddress, + displayAccount, balance, openConnectModal, openAccountModal, @@ -33,7 +35,7 @@ export const ConnectButton: React.FC = ({ chainName, currentChain, activeConnector, - } = useLunoWallet(); + } = useConnectButton({ displayPreference }); const { width: windowWidth } = useWindowSize() const isLargeWindow = windowWidth && windowWidth > 768 @@ -108,13 +110,13 @@ export const ConnectButton: React.FC = ({ showBalance && isLargeWindow ? 'bg-connectButtonInnerBackground py-1.5 px-2' : 'bg-connectButtonBackground py-2 px-2.5' )}> {accountStatus === 'full' && ( - + luno )} {displayAddress} + className={''}>{displayAccount}
diff --git a/packages/ui/src/components/ConnectModal/ConnectOptions.tsx b/packages/ui/src/components/ConnectModal/ConnectOptions.tsx index f7e59c7..ececcbd 100644 --- a/packages/ui/src/components/ConnectModal/ConnectOptions.tsx +++ b/packages/ui/src/components/ConnectModal/ConnectOptions.tsx @@ -27,7 +27,7 @@ export const ConnectOptions = React.memo(({ onConnect }: Props) => { const moreConnectors = connectors.filter(c => !c.isInstalled()) return ( -
+
Installed
diff --git a/packages/ui/src/hooks/useConnectButton.ts b/packages/ui/src/hooks/useConnectButton.ts index b188664..cfac334 100644 --- a/packages/ui/src/hooks/useConnectButton.ts +++ b/packages/ui/src/hooks/useConnectButton.ts @@ -15,6 +15,10 @@ import { } from '../providers'; import { formatAddress } from '@luno-kit/react/utils' +export interface UseConnectButtonProps { + displayPreference: 'address' | 'name' +} + export interface UseConnectButtonReturn { connectionStatus: ConnectionStatus; isConnected: boolean; @@ -23,7 +27,7 @@ export interface UseConnectButtonReturn { account?: Account; address?: string; - displayAddress: string; + displayAccount: string; currentChain?: Chain; configuredChains: Chain[]; @@ -44,7 +48,7 @@ export interface UseConnectButtonReturn { isChainModalOpen: boolean; } -export function useLunoWallet(): UseConnectButtonReturn { +export function useConnectButton({ displayPreference }: UseConnectButtonProps): UseConnectButtonReturn { const connectionStatus = useStatus(); const { account, address } = useAccount(); const { chain: currentChain } = useChain(); @@ -72,7 +76,7 @@ export function useLunoWallet(): UseConnectButtonReturn { account, address, - displayAddress: formatAddress(address), + displayAccount: displayPreference === 'name' && account?.name ? account?.name : formatAddress(address), currentChain, configuredChains, diff --git a/packages/ui/src/styles/base.css b/packages/ui/src/styles/base.css index 298f951..f9a2eb2 100644 --- a/packages/ui/src/styles/base.css +++ b/packages/ui/src/styles/base.css @@ -67,7 +67,7 @@ /* Typography */ --text-xs: 12px; - --leading-xs: 18px; + --leading-xs: 16px; --text-sm: 14px; --leading-sm: 18px; --text-base: 16px; diff --git a/packages/ui/src/theme/types.ts b/packages/ui/src/theme/types.ts index f4f8507..54879cd 100644 --- a/packages/ui/src/theme/types.ts +++ b/packages/ui/src/theme/types.ts @@ -52,7 +52,7 @@ export interface LunokitTheme { infoForeground: string; // Skeleton screen - skeleton: string; + skeleton: string; }; fonts: { body: string; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 06b4480..3d196ef 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -251,6 +251,9 @@ importers: '@dedot/chaintypes': specifier: 'catalog:' version: 0.123.0(dedot@0.14.1) + '@mimirdev/apps-inject': + specifier: 3.2.0 + version: 3.2.0 '@walletconnect/universal-provider': specifier: 2.21.4 version: 2.21.4(typescript@5.8.3) @@ -1904,6 +1907,12 @@ packages: '@manypkg/get-packages@1.1.3': resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} + '@mimirdev/apps-inject@3.2.0': + resolution: {integrity: sha512-yKWFaZsUgxaPIU/xM8OFvWRsNld6x8iCeqbQbt/LyUsikLGlkrHOZl29MwMfSQiYAWrYNqwhFpCU07sS2DTOLQ==} + + '@mimirdev/apps-sdk@3.1.0': + resolution: {integrity: sha512-EevWZhaaP9gKcIJeEbokAugx5X0sd8jRae1CX1Uzg5KsVxODjeLLaAE1D90Lj6//JE1NPaEq3QKi9PliSMLVNg==} + '@msgpack/msgpack@3.1.2': resolution: {integrity: sha512-JEW4DEtBzfe8HvUYecLU9e6+XJnKDlUAIve8FvPzF3Kzs6Xo/KuZkZJsDH0wJXl/qEZbeeE7edxDNY3kMs39hQ==} engines: {node: '>= 18'} @@ -2469,11 +2478,13 @@ packages: '@stagewise-plugins/react@0.5.1': resolution: {integrity: sha512-8OeM/nF8qyn8zBQxTtupG49sXBm9sCxugTl6KTkjgQacg7mP7zN/F5iHKFHwE4HnyZMoC0UjWt/HeRyxnQsYiQ==} + deprecated: 'This package is deprecated and has been replaced by the stagewise CLI. Get started with the CLI here: https://stagewise.io/docs' peerDependencies: '@stagewise/toolbar': 0.5.1 '@stagewise/toolbar-react@0.5.1': resolution: {integrity: sha512-R25kkgU22ueO+jcb5Uc47NrxQVnKxmoepJzjs2bROUiVeU5wIb1MNiioKzN5IA2TucY75Sq8Q7TjHGYyHuFOpQ==} + deprecated: 'This package is deprecated and has been replaced by the stagewise CLI. Get started with the CLI here: https://stagewise.io/docs' peerDependencies: '@types/react': '>=18.0.0' react: '>=18.0.0' @@ -7513,6 +7524,7 @@ packages: source-map@0.8.0-beta.0: resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} engines: {node: '>= 8'} + deprecated: The work that was done in this beta branch won't be included in future versions sourcemap-codec@1.4.8: resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} @@ -10464,6 +10476,14 @@ snapshots: globby: 11.1.0 read-yaml-file: 1.1.0 + '@mimirdev/apps-inject@3.2.0': + dependencies: + '@mimirdev/apps-sdk': 3.1.0 + + '@mimirdev/apps-sdk@3.1.0': + dependencies: + eventemitter3: 5.0.1 + '@msgpack/msgpack@3.1.2': {} '@next/env@15.4.3': {} From 44b22434d63f5843aadbbc8ba022690b387f57ca Mon Sep 17 00:00:00 2001 From: WBH <48749219+wbh1328551759@users.noreply.github.com> Date: Thu, 4 Sep 2025 16:34:45 +0800 Subject: [PATCH 30/45] Feat/add connectors (#87) * feat(core): add connector of fealess * fix(ui): fix icon in ConnectButton * feat: add connector of mimir * fix(ui): fix scroll in ConnectOptions * feat: add connector of enkrypt * feat(ui): Optimize the UI of the AccountDetailsModal and add the displayPreference field to the ConnectButton * refactor(core): rename CommonConnector -> InjectConnector * fix(ui): fix ui * fix(core): fix name in connector * fix(react): add sleep in autoconnect * fix(core): update logo of connectors * fix: fix test code * fix(ui): fix ui of name width * fix(ui): remove filter of chains in ChainModal * feat: add test ConnectButton * feat(core): add connector of ledger * feat: Adjust the borderRadius of the connector icon and add the ledger connector to the example. * fix(ui): add whitespace-nowrap in display name * fix(ui): fix style * fix(ui): fix style of account name * feat(core): remove export ledgerConnector * fix(core): fix disconnect in walletconnect * feat(ui): add connectorGroup * fix(core): fix novaConnector --- examples/with-vite/src/App.tsx | 5 +- .../core/src/config/logos/generated/index.ts | 1 + .../config/logos/generated/ledgerWallet.ts | 6 ++ .../core/src/config/logos/wallets/ledger.svg | 8 +++ packages/core/src/connectors/ledger.test.ts | 15 +++++ packages/core/src/connectors/ledger.ts | 17 +++++ packages/core/src/connectors/nova.ts | 19 ++---- packages/core/src/connectors/walletconnect.ts | 18 +++--- .../AccountDetailsModal/SwitchAccountView.tsx | 24 ++++--- .../components/AccountDetailsModal/index.tsx | 14 +++-- .../ui/src/components/ChainList/index.tsx | 61 +++--------------- .../ui/src/components/ConnectButton/index.tsx | 23 +++---- .../ConnectModal/ConnectOptions.tsx | 63 ++++++++++++------- packages/ui/src/hooks/useConnectButton.ts | 8 +-- 14 files changed, 152 insertions(+), 130 deletions(-) create mode 100644 packages/core/src/config/logos/generated/ledgerWallet.ts create mode 100644 packages/core/src/config/logos/wallets/ledger.svg create mode 100644 packages/core/src/connectors/ledger.test.ts create mode 100644 packages/core/src/connectors/ledger.ts diff --git a/examples/with-vite/src/App.tsx b/examples/with-vite/src/App.tsx index 576ea46..5ce5ace 100644 --- a/examples/with-vite/src/App.tsx +++ b/examples/with-vite/src/App.tsx @@ -113,8 +113,11 @@ const App: React.FC = () => {

The modern Polkadot wallet connection library for React applications

+
+ +
- +
diff --git a/packages/core/src/config/logos/generated/index.ts b/packages/core/src/config/logos/generated/index.ts index 777c565..694ceca 100644 --- a/packages/core/src/config/logos/generated/index.ts +++ b/packages/core/src/config/logos/generated/index.ts @@ -14,6 +14,7 @@ export { coretimeKusamaChain } from './coretimeKusamaChain.js'; export { enkryptWallet } from './enkryptWallet.js'; export { fearlessWallet } from './fearlessWallet.js'; export { kusamaChain } from './kusamaChain.js'; +export { ledgerWallet } from './ledgerWallet.js'; export { mimirWallet } from './mimirWallet.js'; export { novaWallet } from './novaWallet.js'; export { paseoChain } from './paseoChain.js'; diff --git a/packages/core/src/config/logos/generated/ledgerWallet.ts b/packages/core/src/config/logos/generated/ledgerWallet.ts new file mode 100644 index 0000000..7900688 --- /dev/null +++ b/packages/core/src/config/logos/generated/ledgerWallet.ts @@ -0,0 +1,6 @@ +// Copyright 2025 Luno contributors +// SPDX-License-Identifier: MIT + +// Do not edit. Auto-generated via node scripts/convertLogos.mjs + +export const ledgerWallet = 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/Pg0KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjAvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvMjAwMS9SRUMtU1ZHLTIwMDEwOTA0L0RURC9zdmcxMC5kdGQiPg0KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiBpZD0iYm9keV8xIiB3aWR0aD0iNDAwIiBoZWlnaHQ9IjQwMCI+DQoNCjxnIHRyYW5zZm9ybT0ibWF0cml4KDEuMzMzMzMzNCAwIDAgMS4zMzMzMzM0IDAgMCkiPg0KCTxpbWFnZSAgeD0iMCIgeT0iMCIgeGxpbms6aHJlZj0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFaQUFBQUdRQ0FZQUFBQ0F2emJNQUFBQUFYTlNSMElBcnM0YzZRQUFBQVJuUVUxQkFBQ3hqd3Y4WVFVQUFBQUpjRWhaY3dBQURzTUFBQTdEQWNkdnFHUUFBQnJ5U1VSQlZIaGU3ZHpianlWVjJUL3dWK2M4QXdOb2pDTElTUmlHczVCNDUzK2hKc1lMTDd3anhrUkR2TkE3WTR6ZUdZMW9FQWhJUXRERVF6d1ROUVpKRkExZUdJTVJoNUVCUkdBNEtFWVlaZ2FHZW45UC9WajlybXFlNmRYdFZEZFZ1ejhyK1dTdi9hVjdoMXExMW5xcTl0NDkvL1AvV2djQS80VTBCSUNXTkFTQWxqUUVnSlkwQklDV05BU0FsalFFZ0pZMEJJQ1dOQVNBbGpRRWdKWTBCSUNXTkFTQWxqUUVnSlkwQklDV05BU0FsalFFZ0pZMEJJQ1dOQVNBbGpRRWdKWTBCSUNXTkFTQWxqUUVnSlkwQklDV05BU0FsalFFZ0pZMEJJQ1dOQVNBbGpRRWdKWTBCSUNXTkFTQWxqUUVnSlkwQklDV05BU0FsalFFZ0pZMEJJQ1dOQVNBbGpRRWdKWTBCSUNXTkFTQWxqUUVnSlkwQklDV05BU0FsalFFZ0pZMEJJQ1dOQVNBbGpRRWdKWTBCSUNXTkFTQWxqUUVnSlkwQklDV05BU0FsalFFZ0pZMEJJQ1dOQVNBbGpRRWdKWTBCSUNXTkFTQWxqUUVnSlkwQklDV05BU0FsalFFZ0pZMEJJQ1dOQVNBbGpRRWdKWTBCSUNXTkFTQWxqUUVnSlkwQklDV05BU0FsalFFZ0pZMEJJQ1dOQVNBbGpRRWdKWTBCSUNXTkFTQWxqUUVnSlkwQklDV05BU0FsalFFZ0pZMEJJQ1dOQVNBbGpRRWdKWTBCSUNXTkFTQWxqUUVnSlkwQklDV05BU0FsalFFZ0pZMEJJQ1dOQVNBbGpRRWdKWTBCSUNXTkFTQWxqUUVnSlkwQklDV05BU0FsalFFZ0pZMEJJQ1dOQVNBbGpRRWdKWTBCSUNXTkFTQWxqUUVnSlkwQklDV05HUkVXN1pzV2VwdjNicTFmOXk3ZCs5U3hzbnQzTG16ZjR3eDNMRmpSOS9mdFd0WC8vaW1ONzFwNmVmbUtvNmh6SWxRNWtya2kzQjg2KzNOYjM1elB5OWlyT28xdFczYnRzSFBzVzdTa0pIVW04UDI3ZHNIL2JJaGNuS3hRZFRGbzJSRi9iTnpWQXBHT2I3eWZCR09iU1BWNDFVS2I3M2VXRGRweURvb1YwVVhYbmhoZCs2NTUzYm5uWGRlMytmazN2bk9kM2FYWEhKSjcvenp6Kzh1dmZUU2ZneVhYN25QVlNrYzczM3ZlL3M1Y2M0NTUvVEgvTzUzdjd2YnQyOWZPaWI4bjVnVFYxNTVaVCtHVVh4Mzc5NjlkTmZLaGtoRFJoSWJYVndkeFdZWGI3MWNmdm5sM2E5KzlhdnV3UWNmN0I1NTVKSHUwS0ZEck9DaGh4N3Evdjczdi9mOWh4OSt1THYvL3Z1N2E2Kzl0dDhrRnVFdG5qaUdLSTUvL3ZPZnU4Y2VlNng3K3VtbisrTThjT0JBbnkwZkQ0Wml6R0tPeEh5b0MwZGNyTG5EM3hCcHlFaGlneWh2UzRSM3ZldGQvYVF2N2RWWFgyVUZMNy84Y3Y5NDdOaXhmcnorK2M5L2RwZGRkdGxnak9jczVzZisvZnU3NDhlUGQ2Kzg4a3AvckMrOTlGSjM0c1NKL25qcnNlRDFZc3hDak9XZVBYdjY4WXhDc2doM3B6T1Job3dvcm9iaTFqckVadkg0NDQvM0c4YlJvMGY3VFVKcnR4aXJHTE5ubm5tbXUrcXFxL3JONGkxdmVVczYzbk1UYjFmRkpoakZNbHIwdGRXM3VMaUl0UlZqR1lWaitlZEpyS3MwWkdSeFpSVGlQZHU0NVM0dHU2cmkvOFRWZUJtbmFIRUhFZ1VrRytNNWlnM3ZpaXV1NkkrdHZ1dUlJaElGc3g0TFhpL0dLUXBJS1JyMUhiOXZZbTJJTkdRa3NVR0VtTmp4UEFySXdZTUgrNDNDSGNqcVdtd1VzVW5FNCtIRGg3dXJyNzY2SDg5RmVZODdDbUswNVc5YmFlMVczdHFNY1l4dlhjVzg4QTIyRFpXR2pLUVVqaEFUT3dwSWZFZ2FiVFdiUkZrZzljK1c5OHVqbGMxbVVVV0w0NDBXeC96a2swLzIzN3FweDNYdTRsdFhwY1V4eGx0WjVlMnNiRXdXU1RtM01jL0xNWmRXN2o1WDA4cFlMdEs4bUlrMFpDU25Xa0NpeGMvRjFXa3NzUG90bmVVTGJwRmJ1VHFQYnltVnQ3QVdZYk9JdDFuaWM3RTRyMlV6amJiYXVUSDN0dnc0WXh6SzUxM2xuSyttbGZGVVFEWmNHaktTVXkwZ2NVVWFpNnI4N0FzdnZOQS94aFZiS1NxTHJCeHZlWXdQMGErNTVwckJHTS9kZGRkZDEyK2E1YTZ5blBQWVJMTXhXU1F4aitQWXk5dTU1WTY3WENpdHRwV3hWRUEyWEJveWtqRUtTTFN5c01yenRTNnd1YmI2dUdPOG5uMzIyZjRPSks3Y0YrVzk3dVVmb20vR3RueWVyL1h6d1RLV0NzaUdTME5HY3FvRnBMeXQ4Znp6ejNkSGpoeFoybVRLRlZ3c3ZFVVdZeFRLMVdyY2djVFhYbU5jRitGcm1sRUk0MitEb3NXNWptTXQ1empPZHpZbWl5WmFPYzh2dnZoaS94am4ybHRZczVDR2pHU3NBaEp0K1lJcWkyL1JXOWxVb2ozMzNITkwvM1RGSW9nNWNkRkZGdzNtUWpubm0rSDhsdU91ajdYMEZaQlpTRU5HY3FvRkpPNDh2djN0YjNjLy9lbFB1eC8vK01mZGQ3LzczZTQ3My9sTzk2TWYvYWo3L3ZlLzMyZUxMSTQ3anZtSFAveGhmOHkzM1haYi84L0JMTXBmR3NmOGlIOFQ3YzQ3Nyt5Kzk3M3Y5Y2NaNS9mdXUrL3Vmdjd6bjZkanNraCs5ck9mOWVLWVl6Ny81Q2MvNmU2NjY2NytuNjlaUzZ2SHN4NWYxbDBhTXBKVExTQy8vT1V2bC82T3BMeGxFLzNJTnN1L05scS9WWFd5L2x5VmY1cStQSmJQZGtMOWM0dXMvb08vT0tmeDl6MjMzSExMbXU3QXl1OHJJQnN1RFJuSnFSYVFlKzY1WitsMXltdkY0MmJhWUZoYzlmcW8rN2ZmZnZ1cTFrZHAyV3V3SWRLUWtkUVRXZ0dCb1hwOTFIMEZaRGJTa0pIVUUxb0JnYUY2ZmRSOUJXUTIwcENSMUJOYUFZR2hlbjNVZlFWa050S1FrZFFUV2dHQm9YcDkxSDBGWkRiU2tKSFVFMW9CZ2FGNmZkUjlCV1EyMHBDUjFCTmFBWUdoZW4zVWZRVmtOdEtRa2RRVFdnR0JvWHA5MUgwRlpEYlNrSkhVRTFvQmdhRjZmZFI5QldRMjBwQ1IxQk5hQVlHaGVuM1VmUVZrTnRLUWtkUVRXZ0dCb1hwOTFIMEZaRGJTa0pIVUUxb0JnYUY2ZmRSOUJXUTIwcENSMUJOYUFZR2hlbjNVZlFWa050S1FrZFFUV2dHQm9YcDkxSDBGWkRiU2tKSFVFMW9CZ2FGNmZkUjlCV1EyMHBDUjFCTmFBWUdoZW4zVWZRVmtOdEtRa2RRVFdnR0JvWHA5MUgwRlpEYlNrSkhVRTFvQmdhRjZmZFI5QldRMjBwQ1IxQk5hQVlHaGVuM1VmUVZrTnRLUWtkUVRXZ0dCb1hwOTFIMEZaRGJTa0pIVUUxb0JnYUY2ZmRSOUJXUTIwcENSMUJOYUFZR2hlbjNVZlFWa050S1FrZFFUV2dHQm9YcDkxSDBGWkRiU2tKSFVFMW9CZ2FGNmZkUjlCV1EyMHBDUjFCTmFBWUdoZW4zVWZRVmtOdEtRa2RRVFdnR0JvWHA5MUgwRlpEYlNrSkhVRTFvQmdhRjZmZFI5QldRMjBwQ1IxQk5hQVlHaGVuM1VmUVZrTnRLUWtkUVRXZ0dCb1hwOTFIMEZaRGJTa0pIVUUxb0JnYUY2ZmRSOUJXUTIwcENSMUJOYUFZR2hlbjNVZlFWa050S1FrZFFUV2dHQm9YcDkxSDBGWkRiU2tKRnMzYnExMjdKbFM5K1B5WDN4eFJkM2p6NzZhTDg0VHB3NDhkcjBQM203OTk1Nys5L2Z0bTNiMG10R2Y3TVVrUmkvT041NC9HK090NHhWUE83WXNjTUdNMUZ4ZnJkdjM5N1A5VGhITjk5ODg2cldSMm54R25GKzR6RmV3d1hXaGtsRFJsUnZmaGRjY01GU0FUbDI3RmovdUpKZi9PSVhTNjhSQzZ4ZUdKR1YvbVlReDc5cjE2Nmw4U3pGWVNYWjY4VHZ4V3RsLzQyTnRYdjM3cVdpVWJJNFAzZmNjY2RycFdIbEZtc2tXcjAyeW12RjY1VFhaTjJrSVNNcUcxMzB6enZ2dk83UW9VUDlwRjlOKzgxdmZyUDBPdlVDMlN6RjQ0d3p6amlsalNER2F1Zk9uYjE0bmMxV2RPY2d6bEhjUGRUek8rNUFYbnJwcGRkV3djbmI4ZVBIdTZOSGp5NzlicnhPbk92b2w0eDFsWWFNSkRhdE1wSGpTdXVpaXk3cURodzQwRS82dUVWZmZzZXgzSzkvL2V2WDNaTEg4ejE3OWl3OVgzUng3T1g0b3dERVZXdHNFckhSdEN4L25ib1l1UXVaam5wK1J6OCtBNGtXYTJRbHBaWGZqWE5lTGhLYzN3MlJocXlEMkx6Mjc5L2ZQZjc0NDY5TiszYTcrKzY3K3dVVmk2SitENys4MzdzWlpNVmd0ZUl0cnlpNDVYbU1ZMWhlVEhoanhNVkEvYnljNXh0dnZMRTdjdVRJYTZ2ZzVPM1paNS90SCtOM050TkYxWVNrSVNPSnphdTh6eHZQeno3NzdPNXZmL3RiZi9WVTdrSldjdDk5OS9XYllQeHV1ZnFPZm4zRnRzanFUVDZLWnJtcWpPT1BEU01lVjFKK05zYXRGTjBZUjFlbjB4RG5JaDdqSE5XRi90WmJiKzBMUTNaWFhpc3RmaWZPY1JTZ2VKMzZ0VmhYYWNpSVlsTEhRb20zWGZidDI3ZW16MEIrOElNZkRLN1NTakVwbStObVVRcENrZjFNcHI0cXJlL2FOdE1kM0pTVk80NTZ3NCtMaHR0dXU2My9ra21yUlJFNWZQandZSTNFYThacmxPTEV1a3BEUmxJKzBJdEpYYTU2UC8zcFQzYzMzSEJEOTZsUGZhcjd6R2MrczZMcnI3KysvNTNZQ09NMXlvTGJUSXNqTm9keXZIRUg5K0VQZjdqNzNPYysxMzNoQzEvb1B2LzV6Ni9vWXgvN1dIZk9PZWYwdnh2alh6WXFkeURURWhjRmNXN0tlbm4vKzkvZmZmS1RuK3crOFlsUHJPampILzk0djA3SzJpaS9IOHBhWVYybElVelM2YWVmM3YzKzk3OS83ZnF6M2Y3eWw3LzBSYWZlVE1vZGpBMEdUbGthd2lRcElEQXBhUWlUcElEQXBLUWhUSklDQXBPU2hqQkpDZ2hNU2hyQ0pDa2dNQ2xwQ0pPa2dNQ2twQ0ZNa2dJQ2s1S0dNRWtLQ0V4S0dzSWtLU0F3S1drSWs2U0F3S1NrSVV5U0FnS1Rrb1l3U1FvSVRFb2F3aVFwSURBcGFRaVRwSURBcEtRaFRKSUNBcE9TaGpCSkNnaE1TaHJDSkNrZ01DbHBDSk9rZ01Da3BDRk1rZ0lDazVLR01Fa0tDRXhLR3NJa0tTQXdLV2tJazZTQXdLU2tJVXlTQWdLVGtvWXdTUW9JVEVvYXdpUXBJREFwYVFpVHBJREFwS1FoVEpJQ0FwT1NoakJKQ2doTVNockNKQ2tnTUNscENKT2tnTUNrcENGTWtnSUNrNUtHTUVrS0NFeEtHc0lrS1NBd0tXa0lrNlNBd0tTa0lVeVNBZ0tUa29Zd1NRb0lURW9hd2lRcElEQXBhUWlUcElEQXBLUWhUSklDQXBPU2hqQkpDZ2hNU2hyQ0pDa2dNQ2xwQ0pPa2dNQ2twQ0ZNa2dJQ2s1S0dNRWtLQ0V4S0dzSWtLU0F3S1drSWs2U0F3S1NrSVV5U0FnS1Rrb1l3U1FvSVRFb2F3aVFwSURBcGFRaVRwSURBcEtRaFRKSUNBcE9TaGpCSkNnaE1TaHJDSkNrZ01DbHBDSk9rZ01Da3BDRk1rZ0lDazVLR01Fa0tDRXhLR3NJa0tTQXdLV2tJazZTQXdLU2tJVXlTQWdLVGtvWXdTUW9JVEVvYXdpUXBJREFwYVFpVHBJREFwS1FoVEpJQ0FwT1NoakJKYXkwZ0R6endRUGUydDcydC85MG9HSFh4MkxadDIrQzEzeWhidG16cC8zKzJiOS9lUDYvN01IRnBDSk8wMWdMeThNTVBkK2VmZjM2M1k4ZU8xOTF4eFBNMzJ0YXRXMTlYUUtMSVJWNy92OEpFcFNGTTBsb0x5Si8rOUtmdXJMUE82bjgzN2poaWs5NjllM2YvUERidCtyWGZhRkZJU2o4S25pTENES1FoVE5KYUM4ampqei9lWFhEQkJZUFhLQnR6RkpMNmJ1Q05FUDh2NWM2akxoaVI3ZHk1YytrNVRGUWF3aVN0dFlEY2Q5OTkzZnZlOTc1dS8vNzkzU1dYWE5LZGQ5NTUzYjU5Ky9ySHlDNisrT0kzMUVVWFhkUS94ckZGd1lqanErOUVZT0xTRUNacHJRVWsybC8vK3RmdXFhZWU2ZzRmUHR3OSt1aWozYlBQUHR2Zm1jVG5JNDg5OXRnYkt2NC83cjc3N3FVUCtvdTRHOW0xYTljZ2d3bEtRNWlrdFJhUWwxOSt1VHQrL0hqZmYrV1ZWN29qUjQ1MEowNmM2SjlQcFIwNGNHQ3BXTVJiVjFFODRvUDA4bzB4bUxBMGhFbjZiKzVBb2gwOWV2UzEzdjh2S3FXOSt1cXJiNmo0ZjRrN2tYSjg5VmVMRlJCbUlBMFpVYnluWGIrdnZmeDVTL21RTlg0bnZwMVQ4cW44SGNONld2N0I4aGxubkxGVVFPSk9JdHVVNStiZ3dZTkx4MWlLUmpubml5N21kSHlab0R3dlh5d0lkWDR5WlIyVk83Zm94Kyt0WlgxeFN0S1FrY1dramcyLy91WlA5bk9yRVl1bHZFNzIzeGRKSEdOZFJLSi8vLzMzOXdWa0VWcThyUllGcFA0N2xWSkU2dU5lZERHbjQyMjh0UmJPR0tQeWJiVVl0eWdjbTJuY0ppQU5HY21lUFh2Nng3STUxSk03Sm56a0s0a0ZFVTQ3N2JTbHYxK0kzOXNzVjZnaENtK01XMnd3TVFaLy9PTWZsemJmdUF1WnMzaHI3Y0VISDF3NjMzR2NjYTdqdU9QNThyRllOTXYvd0xNVXo1anpVUmpLdUp4TS9GejVPNS95dTRXdlFXK0lOR1FrTWNsallrY2hpWDY1YzhqK01ub2w4UnJMRjBnc252cjVJb3BDV1RhQ09ONTQvcnZmL2E3L01EeDdPMmh1b2ozeHhCT3ZPK1o0M0N4dlVhNWxIYXdrNWtjbzYyVDVlbUZkcENFaktaTzRiQXIxcEY3TndvbmZxKzlhWW9IVTM5Z3ArU0lyRzJtTVhYd0dFbjlkdmlqdCtlZWY3dzRkT3JSMG5PV2lJQjdIMmxpbkx1WjNYU3hqWHNlRjFtcSt4dnlPZDd5akg2ZjZaK3Npd3JwTFEwWlNUK1NZMkdWeXgyUGNsVVIvSmZGN3NjRDI3dDI3OUJybHJhem9sOWRlWkhFSFVvcm9tV2VlMmYzaEQzL29qaDA3dHZTVjNEbUw5c2dqai9USEYrZTdiS1NyMlR3WFFSeDNPYmRGakVFcG5zdlh3M0xsNStJMTZvSmIxbHA1enJwSlEwWVNpMkg1NXlCUkRHTHkxejkzTW5IRkhZK3hHTXJtVW41MytjSmJaT1ZZenozMzNPN2VlKzhkZkMxM3ppM2V4dnJ0YjMvYmZ6MjVIR3U1b3Q0TTU3Y3VGREcveTl5T3ZLeWJsY1RQdmYzdGIrLzdjV0VWZHk5bG5aVFhabDJsSVNPS3ErYlNqMzlDNDdPZi9XejN6Vzkrczd2OTl0dTdXMis5ZFVVMzNIREQwa0lxZHg1bFlXeUdCVksrdGh5UDVZcnlneC84WVBlUmozeWsrK2hIUHpwNzExOS9mZmVoRDMyb1A2N1krT0p1cTJ5QW0wWE00emkvNWJpam1IN2dBeDlJMThOeU45MTBVM2ZqalRmMmM2T3NoMUo0VjN1UnhpbEpRMFpTYi9JeG9lT2ZGbzkvUXFOY2ZiYmFQZmZjcy9RNjViWGkwZUpnRWRUcm8rN0h4ZFZxMWtkcDJXdXdJZEtRa2RRVFdnR0JvWHA5MUgwRlpEYlNrSkhVRTFvQmdhRjZmZFI5QldRMjBwQ1IxQk5hQVlHaGVuM1VmUVZrTnRLUWtkUVRXZ0dCb1hwOTFIMEZaRGJTa0pIVUUxb0JnYUY2ZmRSOUJXUTIwcENSMUJOYUFZR2hlbjNVZlFWa050S1FrZFFUV2dHQm9YcDkxSDBGWkRiU2tKSFVFMW9CZ2FGNmZkUjlCV1EyMHBDUjFCTmFBWUdoZW4zVWZRVmtOdEtRa2RRVFdnR0JvWHA5MUgwRlpEYlNrSkhVRTFvQmdhRjZmZFI5QldRMjBwQ1IxQk5hQVlHaGVuM1VmUVZrTnRLUWtkUVRXZ0dCb1hwOTFIMEZaRGJTa0pIVUUxb0JnYUY2ZmRSOUJXUTIwcENSMUJOYUFZR2hlbjNVZlFWa050S1FrZFFUV2dHQm9YcDkxSDBGWkRiU2tKSFVFMW9CZ2FGNmZkUjlCV1EyMHBDUjFCTmFBWUdoZW4zVWZRVmtOdEtRa2RRVFdnR0JvWHA5MUgwRlpEYlNrSkhVRTFvQmdhRjZmZFI5QldRMjBwQ1IxQk5hQVlHaGVuM1VmUVZrTnRLUWtkUVRXZ0dCb1hwOTFIMEZaRGJTa0pIVUUxb0JnYUY2ZmRSOUJXUTIwcENSMUJOYUFZR2hlbjNVZlFWa050S1FrZFFUV2dHQm9YcDkxSDBGWkRiU2tKSFVFMW9CZ2FGNmZkUjlCV1EyMHBDUjFCTmFBWUdoZW4zVWZRVmtOdEtRa2RRVFdnR0JvWHA5MUgwRlpEYlNrSkhVRTFvQmdhRjZmZFI5QldRMjBwQ1IxQk5hQVlHaGVuM1VmUVZrTnRLUWtkUVRXZ0dCb1hwOTFIMEZaRGJTa0pIVUUxb0JnYUY2ZmRSOUJXUTIwcENSMUJOYUFZR2hlbjNVZlFWa050S1FrZFFUV2dHQm9YcDkxSDBGWkRiU2tKSFVFMW9CZ2FGNmZkUjlCV1EyMHBDUjFCTmFBWUdoZW4zVWZRVmtOdEtRa2RRVFdnR0JvWHA5MUgwRlpEYlNrSkhVRTFvQmdhRjZmZFI5QldRMjBwQ1IxQk5hQVlHaGVuM1VmUVZrTnRLUWtkUVQrcjhwSUFjUEh1eHV2dm5tN290Zi9HTC8rTld2ZnJYNzBwZSsxSDN0YTEvcnZ2emxML2ZQRjlsWHZ2S1Y3aHZmK0VaMzQ0MDM5bU1ReDN6bW1XY3V6RWF4YmR1MmJ1L2V2ZDFkZDkzVjNYVFRUZDNYdi83MS9qemZlZWVkM1MyMzNOSnZwSXNzNW5FYzV4MTMzTkhkZHR0dC9SaDg2MXZmNmg1NDRJSFhWc0RxV2hsUEJXVERwU0VqT2RVQ0V1MmxsMTdxVHB3NDBmZVBIeisrMUk4OFhtT1J4YkcrL1BMTDNTdXZ2TklkUFhxMGUrcXBwN3JycnJ1dTI3SmxTNjhlNnptSytYSGxsVmQyTDc3NFluOU82eGJIRzhlL3lLTEZlWTV6SEkvUklvL3p2WlpXajJjOXZxeTdOR1FrcDFwQS92T2YvL1NMcTdRalI0NHNMYnkxTHJLNXR2cjRuMy8rK2U3eXl5OS8zZGpPMlJWWFhORVhpMmh4Ym84ZE85YjNOMHVMaTZMbHh4elBZNjZ2dHBXeFZFQTJYQm95a2xNdElLWEZ4bEt1eE10anRIaU5SUmJIR3FJZkc4MFRUenpSWFgzMTFkM1dyVnU3M2J0M0Q4WjZqdUl1S3U1QTR0aEtLOGNlNXpqTysyWlFqamtySnF0cFpUd1ZrQTJYaG94a2pBSlNGbGJkTnN2ZFIyd3VwVVVoZWZMSko3dHJycmxtTU1aemQ4a2xseXpkZ1pRV3g3MVp6bkcwNVd1aEZKYlZ0aktXQ3NpR1MwTkdjcW9GcEh6T0VZc3Bpa2haVlBFWWVXd3lpeXhhRkk3UzRpMnMrQXdreGpJK2dLN0hlbzYyYjkvZXY0VlZ6bVc4YlJOWDRNc3ZHQmExeFhHR2NwZFp0OVdzajlMS2VDb2dHeTROR2NtcEZwRDZaMktEaVN2VnRTeXNSV2hsZzRualAzejRjSGZaWlpmMTQ3a0lINktIdUFOWjNrcnhMRmZpaTZwdThieWM2K1gvcmRYS1dDb2dHeTROR2NtcEZwQ3lxTXJQeG1OazhWaGZtUzl5SzhjZXh4MEY1S3FycmxvYXp6SzJjeFYzVWZ2MjdldlBaUkZ0czV6YmFIRitvMkNXb2xuYVdzYWdqS2NDc3VIU2tKSEVWWEpzZE9WcU9iNUI5TkJERC9XVFBncUR0bklybTBpNTgzcjY2YWY3RDUxakxCZmhMYXh3NmFXWDlzZFliNkJsUTQxajV1U2l4WVZGckxINmdtTEhqaDBMY1lFeEEybkl5R0pDeCtPRkYxN1lQZkxJSTBzYlkweCtUbTU1ZSs2NTUvb3I5dVhqTzFkeFlSRjNwZEhpZ2lJc3Z4TFgycTFjcE1XMzgzYnQycFdPTmVzaURSbEptY3d4d2VQMmV2LysvZDAvL3ZHUDdvVVhYbmh0Nm1zcnRkaFF5emVVb3VnKzg4d3ozWHZlODU2RnVjS01EZS9zczgvdWp5K090UlRPdUxxTzR5NTNJdVJpbkdLODZydlIrR0pDUEM3QzE3eG5JQTBaVVV6b2NnY1NCU1R1UUVvckd3YTVhUC82MTcrV2lraDhqZmZhYTYvdHgzSlIzdStPYjJIRm5WVWNZM3dMSzc1cEZvOVJNT012MURtNStNYmF2Ly85NzM0Y280aVU0dkhXdDc1MU1NYXNtelJrSktlZGRsci9HSnZkbmoxNytxdm1jdVZjK3B4Y2pGT01XN21hM0xsejU5TGpJbndHVW80bi9uMnZrc1Z4K1RCNDlVclJLTXBZbm5YV1dZT2NkWkdHakNnMndySXBsSTNCN2ZYcXhPWlF2b0FRNHhoditaVC9WZ3JNM0oxKyt1bXZ5MktlZUMrL3JaNERjWmRmUGdjcGQveXN1elJrSlBVbUVKTTlKblpzRG1YaWw2SkNyb3hkS1J3eGJsRlVvaUNYd2pKM1piT0w0eTNIVnY3Yjh2RmdLT1pBUE1hOHFDOHVvbDgvWjkya0lTT0p5UjJQTWRGTDBTZ2JSTDFSa0N0djhaUzNBaGR0ek1vbUY0OWxyb1N5UWJLeWVyektHTVkvangrWjliVWgwaEFBV3RJUUFGclNFQUJhMGhBQVd0SVFBRnJTRUFCYTBoQUFXdElRQUZyU0VBQmEwaEFBV3RJUUFGclNFQUJhMGhBQVd0SVFBRnJTRUFCYTBoQUFXdElRQUZyU0VBQmEwaEFBV3RJUUFGclNFQUJhMGhBQVd0SVFBRnJTRUFCYTBoQUFXdElRQUZyU0VBQmEwaEFBV3RJUUFGclNFQUJhMGhBQVd0SVFBRnJTRUFCYTBoQUFXdElRQUZyU0VBQmEwaEFBV3RJUUFGclNFQUJhMGhBQVd0SVFBRnJTRUFCYTBoQUFXdElRQUZyU0VBQmEwaEFBV3RJUUFGclNFQUJhMGhBQVd0SVFBRnJTRUFCYTBoQUFXdElRQUZyU0VBQmEwaEFBV3RJUUFGclNFQUJhMGhBQVd0SVFBRnJTRUFCYTBoQUFXdElRQUZyU0VBQmEwaEFBV3RJUUFGclNFQUJhMGhBQVd0SVFBRnJTRUFCYTBoQUFXdElRQUZyU0VBQmEwaEFBV3RJUUFGclNFQUJhMGhBQVd0SVFBRnJTRUFCYTBoQUFXdElRQUZyU0VBQmEwaEFBV3RJUUFGclNFQUJhMGhBQVd0SVFBRnJTRUFCYTBoQUFXdElRQUZyU0VBQmEwaEFBV3RJUUFGclNFQUJhMGhBQVd0SVFBRnJTRUFCYTBoQUFXdElRQUZyU0VBQmEwaEFBV3RJUUFGclNFQUJhMGhBQVd0SVFBRmJ3UDkzL0Fxb2FrMlU4Tm9pd0FBQUFBRWxGVGtTdVFtQ0MiIHByZXNlcnZlQXNwZWN0UmF0aW89Im5vbmUiIHdpZHRoPSIzMDAiIGhlaWdodD0iMzAwIi8+DQo8L2c+DQo8L3N2Zz4NCg=='; diff --git a/packages/core/src/config/logos/wallets/ledger.svg b/packages/core/src/config/logos/wallets/ledger.svg new file mode 100644 index 0000000..b46eb2c --- /dev/null +++ b/packages/core/src/config/logos/wallets/ledger.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/packages/core/src/connectors/ledger.test.ts b/packages/core/src/connectors/ledger.test.ts new file mode 100644 index 0000000..f8c9ea6 --- /dev/null +++ b/packages/core/src/connectors/ledger.test.ts @@ -0,0 +1,15 @@ +import { describe } from 'vitest'; +import { createWalletConnectTestSuite } from './test-helper'; +import { ledgerWallet } from '../config/logos/generated'; +import { ledgerConnector } from './ledger' + +describe('ledgerConnector', + createWalletConnectTestSuite({ + getConnector: ledgerConnector, + expected: { + id: 'ledger', + name: 'Ledger', + icon: ledgerWallet, + }, + }) +); diff --git a/packages/core/src/connectors/ledger.ts b/packages/core/src/connectors/ledger.ts new file mode 100644 index 0000000..88cbb39 --- /dev/null +++ b/packages/core/src/connectors/ledger.ts @@ -0,0 +1,17 @@ +import { WalletConnectConnector } from './walletconnect' +import { ledgerWallet } from '../config/logos/generated' +import { WalletConnectConnectorOptions } from '../types' + +type WalletConnectConfig = Pick + +export const ledgerConnector = (config: WalletConnectConfig) => { + return new WalletConnectConnector({ + id: 'ledger', + name: 'Ledger', + icon : ledgerWallet, + links: { + browserExtension: 'https://www.ledger.com/ledger-live' + }, + ...config, + }) +} diff --git a/packages/core/src/connectors/nova.ts b/packages/core/src/connectors/nova.ts index 5d6da6f..4c4e6a3 100644 --- a/packages/core/src/connectors/nova.ts +++ b/packages/core/src/connectors/nova.ts @@ -1,14 +1,10 @@ import { novaWallet } from '../config/logos/generated' import { WalletConnectConnector } from './walletconnect' -import type { Metadata } from '@walletconnect/universal-provider' import { novaMobileConnector } from './novaMobile' import { isMobileDevice } from '../utils' +import { WalletConnectConnectorOptions } from '../types' -type WalletConnectConfig = { - projectId: string; - relayUrl?: string; - metadata?: Metadata; -} +type WalletConnectConfig = Pick type MobileOnlyConfig = { mobileOnly: true; @@ -17,15 +13,12 @@ type MobileOnlyConfig = { type NovaConnectorConfig = WalletConnectConfig | MobileOnlyConfig; export const novaConnector = (config: NovaConnectorConfig) => { - if ((config as MobileOnlyConfig).mobileOnly && !isMobileDevice()) { - throw new Error('Nova Wallet mobile connector cannot be used on desktop devices'); - } - - if ((config as MobileOnlyConfig).mobileOnly) { - throw new Error('Nova Wallet is not installed. Please install Nova Wallet to continue.'); + if (isMobileDevice()) { + return novaMobileConnector(); } - if (isMobileDevice()) { + if (!isMobileDevice() && 'mobileOnly' in config && config.mobileOnly) { + console.error('Nova Wallet mobile connector is being used on a desktop device. This may not work as expected.'); return novaMobileConnector(); } diff --git a/packages/core/src/connectors/walletconnect.ts b/packages/core/src/connectors/walletconnect.ts index 1a83748..a7264bd 100644 --- a/packages/core/src/connectors/walletconnect.ts +++ b/packages/core/src/connectors/walletconnect.ts @@ -165,14 +165,18 @@ export class WalletConnectConnector extends BaseConnector { } public async disconnect(): Promise { - if (this.provider) { - // await Promise.race([ - await this.provider.disconnect() - // new Promise((_, reject) => - // setTimeout(() => reject(new Error('Disconnect timeout')), 5000) - // ) - // ]); + try { + if (this.provider) { + await Promise.race([ + await this.provider.disconnect(), + new Promise((_, reject) => + setTimeout(() => reject(new Error('Disconnect timeout')), 5000) + ) + ]); + } + } catch (e) { } + await this.cleanup() this.emit('disconnect'); } diff --git a/packages/ui/src/components/AccountDetailsModal/SwitchAccountView.tsx b/packages/ui/src/components/AccountDetailsModal/SwitchAccountView.tsx index 775d4bb..75b469c 100644 --- a/packages/ui/src/components/AccountDetailsModal/SwitchAccountView.tsx +++ b/packages/ui/src/components/AccountDetailsModal/SwitchAccountView.tsx @@ -67,28 +67,26 @@ const AccountItem: React.FC = React.memo(({ aria-label={account.name || address} disabled={isSelected} > -
+
{connector?.icon && luno account}
-
- +
+ {account.name || formatAddress(address)} - - {balance === undefined ? ( -
- ) : ( - <> - {balance?.formattedTransferable || '0.00'} {chain?.nativeCurrency?.symbol || 'DOT'} - - )} - + {balance ? ( + + {balance?.formattedTransferable || '0.00'} {chain?.nativeCurrency?.symbol || 'DOT'} + + ) : ( + + )}
{isSelected && ( -
+
)} diff --git a/packages/ui/src/components/AccountDetailsModal/index.tsx b/packages/ui/src/components/AccountDetailsModal/index.tsx index 0d5c372..0bd1f4d 100644 --- a/packages/ui/src/components/AccountDetailsModal/index.tsx +++ b/packages/ui/src/components/AccountDetailsModal/index.tsx @@ -56,7 +56,6 @@ export const AccountDetailsModal: React.FC = () => { ) }), [handleViewChange, handleModalClose]); - return ( { )}>
{currentView === AccountModalView.main ? ( -
+
{activeConnector?.icon && ( -
+
)} -
+
Account Details
@@ -83,7 +82,10 @@ export const AccountDetailsModal: React.FC = () => {
-
+
30 ? 'w-[90%]' : '' + )}> {account?.name || activeConnector?.name}
@@ -104,7 +106,7 @@ export const AccountDetailsModal: React.FC = () => { )} - +
diff --git a/packages/ui/src/components/ChainList/index.tsx b/packages/ui/src/components/ChainList/index.tsx index 7260d16..c705eaf 100644 --- a/packages/ui/src/components/ChainList/index.tsx +++ b/packages/ui/src/components/ChainList/index.tsx @@ -4,18 +4,6 @@ import { useApi, useChain, useChains, useSwitchChain } from '@luno-kit/react' import type { Chain } from '@luno-kit/react/types' import { ChainIcon } from '../ChainIcon' -enum ChainFilter { - all = 'All', - mainnets = 'Mainnets', - testnets = 'Testnets' -} - -const FILTER_TABS = [ - { key: ChainFilter.all, label: ChainFilter.all }, - { key: ChainFilter.mainnets, label: ChainFilter.mainnets }, - { key: ChainFilter.testnets, label: ChainFilter.testnets } -] as const; - interface ChainListProps { onChainSwitched?: (chain: Chain) => void; } @@ -26,7 +14,6 @@ export const ChainList: React.FC = ({ onChainSwitched }: ChainLi const { switchChainAsync } = useSwitchChain(); const { isApiReady, apiError } = useApi() - const [activeFilter, setActiveFilter] = useState(ChainFilter.all); const [switchingChain, setSwitchingChain] = useState(null); const [searchQuery, setSearchQuery] = useState(''); @@ -37,18 +24,7 @@ export const ChainList: React.FC = ({ onChainSwitched }: ChainLi ? chain.name.toLowerCase().includes(searchQuery.toLowerCase()) : true ) - .filter(chain => { - switch (activeFilter) { - case ChainFilter.mainnets: - return !chain.testnet; - case ChainFilter.testnets: - return chain.testnet; - case ChainFilter.all: - default: - return true; - } - }); - }, [chains, activeFilter, searchQuery]); + }, [chains, searchQuery]); const handleChainSelect = async (chain: Chain) => { if (chain.genesisHash === currentChain?.genesisHash) return; @@ -67,30 +43,13 @@ export const ChainList: React.FC = ({ onChainSwitched }: ChainLi return ( <> -
- {FILTER_TABS.map(tab => ( - - ))} -
- -
+
setSearchQuery(e.target.value)} - className="w-full px-3 py-2 text-sm border border-gray-300 rounded-md focus:ring-2 focus:ring-[rgb(51,133,255)] focus:outline-none focus:border-transparent" + className="w-full px-3 py-2 text-sm border border-gray-300 rounded-md focus:ring-2 focus:ring-accentColor focus:outline-none focus:border-transparent" />
@@ -111,7 +70,7 @@ export const ChainList: React.FC = ({ onChainSwitched }: ChainLi {filteredChains.length === 0 && (
- No {activeFilter === ChainFilter.all ? 'chains' : activeFilter.toLowerCase()} available + No chains available
)} @@ -127,11 +86,11 @@ interface ChainItemProps { } const ChainItem: React.FC = React.memo(({ - chain, - isSelected, - isLoading, - onSelect - }) => { + chain, + isSelected, + isLoading, + onSelect +}) => { return (
diff --git a/packages/ui/src/components/ConnectModal/ConnectOptions.tsx b/packages/ui/src/components/ConnectModal/ConnectOptions.tsx index ececcbd..3ad48ea 100644 --- a/packages/ui/src/components/ConnectModal/ConnectOptions.tsx +++ b/packages/ui/src/components/ConnectModal/ConnectOptions.tsx @@ -1,4 +1,4 @@ -import React from 'react' +import React, {useMemo} from 'react' import { useConnectors } from '@luno-kit/react' import { isMobileDevice } from '@luno-kit/react/utils' import type { Connector } from '@luno-kit/react/types' @@ -8,6 +8,10 @@ interface Props { onConnect: (connector: Connector) => Promise } +const popularConnectorIds = ['polkadot-js', 'subwallet-js', 'talisman', 'walletconnect', 'nova', 'nova-mobile'] + +const moreConnectorIds = ['polkagate', 'fearless-wallet', 'mimir', 'enkrypt'] + export const ConnectOptions = React.memo(({ onConnect }: Props) => { const connectors = useConnectors(); @@ -24,29 +28,46 @@ export const ConnectOptions = React.memo(({ onConnect }: Props) => { } const installedConnectors = connectors.filter(c => c.isInstalled()) - const moreConnectors = connectors.filter(c => !c.isInstalled()) + const popularConnectors = connectors.filter(c => popularConnectorIds.includes(c.id) && !c.isInstalled()) + const moreConnectors = connectors.filter(c => moreConnectorIds.includes(c.id) && !c.isInstalled()) + + const connectorGroup: { title: string; group: Connector[] }[] = useMemo(() => { + return [ + { + title: 'Installed', + group: installedConnectors, + }, + { + title: 'Popular', + group: popularConnectors, + }, + { + title: 'More', + group: moreConnectors, + } + ] + }, [installedConnectors, popularConnectors, moreConnectors]) return (
-
-
Installed
-
- {installedConnectors.map(i => ( - onConnect(i)}/> - ))} -
-
- - {moreConnectors.length > 0 && ( -
-
More
-
- {moreConnectors.map(i => ( - onConnect(i)}/> - ))} + {connectorGroup.map(g => { + if (g.group.length === 0) return null + return ( +
+
+ {g.title} +
+
+ {g.group.map(i => ( + onConnect(i)}/> + ))} +
-
- )} + ) + })}
) }) @@ -66,7 +87,7 @@ const ConnectorItem: React.FC = React.memo(({connector, onCo 'text-left' )} > -
+
{connector.name} Date: Fri, 5 Sep 2025 14:24:18 +0800 Subject: [PATCH 31/45] Feat/add connectors (#89) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat(core): add connector of fealess * fix(ui): fix icon in ConnectButton * feat: add connector of mimir * fix(ui): fix scroll in ConnectOptions * feat: add connector of enkrypt * feat(ui): Optimize the UI of the AccountDetailsModal and add the displayPreference field to the ConnectButton * refactor(core): rename CommonConnector -> InjectConnector * fix(ui): fix ui * fix(core): fix name in connector * fix(react): add sleep in autoconnect * fix(core): update logo of connectors * fix: fix test code * fix(ui): fix ui of name width * fix(ui): remove filter of chains in ChainModal * feat: add test ConnectButton * feat(core): add connector of ledger * feat: Adjust the borderRadius of the connector icon and add the ledger connector to the example. * fix(ui): add whitespace-nowrap in display name * fix(ui): fix style * fix(ui): fix style of account name * feat(core): remove export ledgerConnector * fix(core): fix disconnect in walletconnect * feat(ui): add connectorGroup * fix(core): fix novaConnector * feat: add hover effect to Copy component * fix(ui): fix height of ChainList --------- Co-authored-by: “Gintma” --- .../src/components/AccountDetailsModal/MainView.tsx | 2 +- .../AccountDetailsModal/SwitchAccountView.tsx | 4 ++-- .../AccountDetailsModal/SwitchChainView.tsx | 6 +----- .../ui/src/components/AccountDetailsModal/index.tsx | 12 ++++++------ packages/ui/src/components/ChainList/index.tsx | 9 +++++---- packages/ui/src/components/ChainModal/index.tsx | 2 +- .../ui/src/components/ConnectModal/WalletView.tsx | 2 +- packages/ui/src/components/Copy/index.tsx | 6 +++++- 8 files changed, 22 insertions(+), 21 deletions(-) diff --git a/packages/ui/src/components/AccountDetailsModal/MainView.tsx b/packages/ui/src/components/AccountDetailsModal/MainView.tsx index 752c2b6..c8c86b2 100644 --- a/packages/ui/src/components/AccountDetailsModal/MainView.tsx +++ b/packages/ui/src/components/AccountDetailsModal/MainView.tsx @@ -33,7 +33,7 @@ export const MainView: React.FC = ({ chainIconUrl={chain?.chainIconUrl} chainName={chain?.name} /> -
+ {/*
*/}
{chain?.name || 'Polkadot'} diff --git a/packages/ui/src/components/AccountDetailsModal/SwitchAccountView.tsx b/packages/ui/src/components/AccountDetailsModal/SwitchAccountView.tsx index 75b469c..42c53d5 100644 --- a/packages/ui/src/components/AccountDetailsModal/SwitchAccountView.tsx +++ b/packages/ui/src/components/AccountDetailsModal/SwitchAccountView.tsx @@ -86,8 +86,8 @@ const AccountItem: React.FC = React.memo(({
{isSelected && ( -
-
+
+
)} diff --git a/packages/ui/src/components/AccountDetailsModal/SwitchChainView.tsx b/packages/ui/src/components/AccountDetailsModal/SwitchChainView.tsx index f18e96f..9b6ec1c 100644 --- a/packages/ui/src/components/AccountDetailsModal/SwitchChainView.tsx +++ b/packages/ui/src/components/AccountDetailsModal/SwitchChainView.tsx @@ -10,11 +10,7 @@ interface SwitchChainViewProps { } export const SwitchChainView: ViewComponent = ({ onBack }) => { - return ( -
- -
- ) + return } SwitchChainView.title = 'Select Networks'; diff --git a/packages/ui/src/components/AccountDetailsModal/index.tsx b/packages/ui/src/components/AccountDetailsModal/index.tsx index 0bd1f4d..f7f49d4 100644 --- a/packages/ui/src/components/AccountDetailsModal/index.tsx +++ b/packages/ui/src/components/AccountDetailsModal/index.tsx @@ -62,21 +62,21 @@ export const AccountDetailsModal: React.FC = () => { onOpenChange={handleModalClose} >
{currentView === AccountModalView.main ? (
{activeConnector?.icon && ( -
+
)} -
+
Account Details -
+
{formatAddress(address)} @@ -113,7 +113,7 @@ export const AccountDetailsModal: React.FC = () => {
{viewComponents[currentView]} diff --git a/packages/ui/src/components/ChainList/index.tsx b/packages/ui/src/components/ChainList/index.tsx index c705eaf..841adf3 100644 --- a/packages/ui/src/components/ChainList/index.tsx +++ b/packages/ui/src/components/ChainList/index.tsx @@ -6,9 +6,10 @@ import { ChainIcon } from '../ChainIcon' interface ChainListProps { onChainSwitched?: (chain: Chain) => void; + className?: string } -export const ChainList: React.FC = ({ onChainSwitched }: ChainListProps) => { +export const ChainList: React.FC = ({ onChainSwitched, className = '' }: ChainListProps) => { const { chain: currentChain } = useChain(); const chains = useChains(); const { switchChainAsync } = useSwitchChain(); @@ -42,7 +43,7 @@ export const ChainList: React.FC = ({ onChainSwitched }: ChainLi }; return ( - <> +
= ({ onChainSwitched }: ChainLi
{filteredChains.length > 0 && ( -
+
{filteredChains.map(chain => ( = ({ onChainSwitched }: ChainLi
)} - +
) } diff --git a/packages/ui/src/components/ChainModal/index.tsx b/packages/ui/src/components/ChainModal/index.tsx index 04555fd..5cdd221 100644 --- a/packages/ui/src/components/ChainModal/index.tsx +++ b/packages/ui/src/components/ChainModal/index.tsx @@ -11,7 +11,7 @@ export const ChainModal: React.FC = () => { return ( !open && close()}> -
+
{/* Placeholder to keep title centered */} diff --git a/packages/ui/src/components/ConnectModal/WalletView.tsx b/packages/ui/src/components/ConnectModal/WalletView.tsx index 8ef0359..ebb976d 100644 --- a/packages/ui/src/components/ConnectModal/WalletView.tsx +++ b/packages/ui/src/components/ConnectModal/WalletView.tsx @@ -61,7 +61,7 @@ export const WalletView = React.memo(({ selectedConnector, onConnect, qrCode, is

) : qrCode - ? + ? : null}
diff --git a/packages/ui/src/components/Copy/index.tsx b/packages/ui/src/components/Copy/index.tsx index 62d8770..38a14ed 100644 --- a/packages/ui/src/components/Copy/index.tsx +++ b/packages/ui/src/components/Copy/index.tsx @@ -29,7 +29,11 @@ export const Copy: React.FC = ({ copyText, label, className = '' }) = return (
30 ? 'w-[90%]' : '' )}> {account?.name || activeConnector?.name} diff --git a/packages/ui/src/components/ChainList/index.tsx b/packages/ui/src/components/ChainList/index.tsx index 841adf3..a024b39 100644 --- a/packages/ui/src/components/ChainList/index.tsx +++ b/packages/ui/src/components/ChainList/index.tsx @@ -3,6 +3,7 @@ import { cs } from '../../utils' import { useApi, useChain, useChains, useSwitchChain } from '@luno-kit/react' import type { Chain } from '@luno-kit/react/types' import { ChainIcon } from '../ChainIcon' +import Search from '../../assets/icons/Search' interface ChainListProps { onChainSwitched?: (chain: Chain) => void; @@ -45,13 +46,16 @@ export const ChainList: React.FC = ({ onChainSwitched, className return (
- setSearchQuery(e.target.value)} - className="w-full px-3 py-2 text-sm border border-gray-300 rounded-md focus:ring-2 focus:ring-accentColor focus:outline-none focus:border-transparent" - /> +
+ + setSearchQuery(e.target.value)} + className="w-full pl-10 pr-3 py-2 text-sm border border-networkSelectItemBackgroundHover rounded-md focus:ring-2 focus:ring-accentColor focus:outline-none focus:border-transparent" + /> +
{filteredChains.length > 0 && ( @@ -63,6 +67,7 @@ export const ChainList: React.FC = ({ onChainSwitched, className isSelected={chain.genesisHash === currentChain?.genesisHash} onSelect={handleChainSelect} isLoading={(switchingChain === chain.genesisHash || !isApiReady) && !apiError} + isSwitching={switchingChain === chain.genesisHash} /> ))}
@@ -84,13 +89,15 @@ interface ChainItemProps { isSelected: boolean; isLoading: boolean; onSelect: (chain: Chain) => void; + isSwitching: boolean; } const ChainItem: React.FC = React.memo(({ chain, isSelected, isLoading, - onSelect + onSelect, + isSwitching }) => { return (
); } diff --git a/examples/with-cra/src/index.css b/examples/with-cra/src/index.css index ec2585e..921c551 100644 --- a/examples/with-cra/src/index.css +++ b/examples/with-cra/src/index.css @@ -1,13 +1,12 @@ body { margin: 0; - font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', - 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', - sans-serif; + font-family: + -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", + "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } code { - font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', - monospace; + font-family: source-code-pro, Menlo, Monaco, Consolas, "Courier New", monospace; } diff --git a/examples/with-cra/src/index.tsx b/examples/with-cra/src/index.tsx index cd4535a..c28e52e 100644 --- a/examples/with-cra/src/index.tsx +++ b/examples/with-cra/src/index.tsx @@ -1,13 +1,20 @@ import React from 'react'; import ReactDOM from 'react-dom/client'; import './index.css'; +import { createConfig } from '@luno-kit/react'; +import { kusama, polkadot, westend } from '@luno-kit/react/chains'; +import { + novaConnector, + polkadotjsConnector, + polkagateConnector, + subwalletConnector, + talismanConnector, + walletConnectConnector, +} from '@luno-kit/react/connectors'; +import { LunoKitProvider } from '@luno-kit/ui'; import App from './App'; import reportWebVitals from './reportWebVitals'; -import { createConfig } from '@luno-kit/react' -import { polkagateConnector, polkadotjsConnector, subwalletConnector, talismanConnector, novaConnector, walletConnectConnector } from '@luno-kit/react/connectors' -import { polkadot, kusama, westend } from '@luno-kit/react/chains' -import { LunoKitProvider } from '@luno-kit/ui' -import '@luno-kit/ui/styles.css' +import '@luno-kit/ui/styles.css'; const connectors = [ polkadotjsConnector(), @@ -16,7 +23,7 @@ const connectors = [ polkagateConnector(), walletConnectConnector({ projectId: process.env.REACT_APP_WALLET_CONNECT_ID }), novaConnector({ projectId: process.env.REACT_APP_WALLET_CONNECT_ID }), -] +]; const lunoConfig = createConfig({ appName: 'luno with-vite example', @@ -25,9 +32,7 @@ const lunoConfig = createConfig({ autoConnect: true, }); -const root = ReactDOM.createRoot( - document.getElementById('root') as HTMLElement -); +const root = ReactDOM.createRoot(document.getElementById('root') as HTMLElement); root.render( diff --git a/examples/with-cra/src/reportWebVitals.ts b/examples/with-cra/src/reportWebVitals.ts index 49a2a16..6071e23 100644 --- a/examples/with-cra/src/reportWebVitals.ts +++ b/examples/with-cra/src/reportWebVitals.ts @@ -1,4 +1,4 @@ -import { ReportHandler } from 'web-vitals'; +import type { ReportHandler } from 'web-vitals'; const reportWebVitals = (onPerfEntry?: ReportHandler) => { if (onPerfEntry && onPerfEntry instanceof Function) { diff --git a/examples/with-cra/tsconfig.json b/examples/with-cra/tsconfig.json index a273b0c..9d379a3 100644 --- a/examples/with-cra/tsconfig.json +++ b/examples/with-cra/tsconfig.json @@ -1,11 +1,7 @@ { "compilerOptions": { "target": "es5", - "lib": [ - "dom", - "dom.iterable", - "esnext" - ], + "lib": ["dom", "dom.iterable", "esnext"], "allowJs": true, "skipLibCheck": true, "esModuleInterop": true, @@ -20,7 +16,5 @@ "noEmit": true, "jsx": "react-jsx" }, - "include": [ - "src" - ] + "include": ["src"] } diff --git a/examples/with-nextjs-app/app/layout.tsx b/examples/with-nextjs-app/app/layout.tsx index b8ce7b9..4cdfa3e 100644 --- a/examples/with-nextjs-app/app/layout.tsx +++ b/examples/with-nextjs-app/app/layout.tsx @@ -1,11 +1,11 @@ -import type { Metadata } from "next"; -import "./globals.css"; -import '@luno-kit/ui/styles.css' -import Providers from '@/app/providers' +import type { Metadata } from 'next'; +import './globals.css'; +import '@luno-kit/ui/styles.css'; +import Providers from '@/app/providers'; export const metadata: Metadata = { - title: "LunoKit example", - description: "Generated by create next app", + title: 'LunoKit example', + description: 'Generated by create next app', }; export default function RootLayout({ diff --git a/examples/with-nextjs-app/app/page.tsx b/examples/with-nextjs-app/app/page.tsx index 83bcca1..2dcd3d7 100644 --- a/examples/with-nextjs-app/app/page.tsx +++ b/examples/with-nextjs-app/app/page.tsx @@ -1,9 +1,9 @@ -import { ConnectButton } from '@luno-kit/ui' +import { ConnectButton } from '@luno-kit/ui'; export default function Home() { return (
- +
); } diff --git a/examples/with-nextjs-app/app/providers.tsx b/examples/with-nextjs-app/app/providers.tsx index bc0dfa1..5b32c9c 100644 --- a/examples/with-nextjs-app/app/providers.tsx +++ b/examples/with-nextjs-app/app/providers.tsx @@ -1,9 +1,16 @@ -"use client"; +'use client'; -import { LunoKitProvider } from '@luno-kit/ui' -import { createConfig } from '@luno-kit/react' -import { polkagateConnector, polkadotjsConnector, subwalletConnector, talismanConnector, novaConnector, walletConnectConnector } from '@luno-kit/react/connectors' -import { polkadot, kusama, westend } from '@luno-kit/react/chains' +import { createConfig } from '@luno-kit/react'; +import { kusama, polkadot, westend } from '@luno-kit/react/chains'; +import { + novaConnector, + polkadotjsConnector, + polkagateConnector, + subwalletConnector, + talismanConnector, + walletConnectConnector, +} from '@luno-kit/react/connectors'; +import { LunoKitProvider } from '@luno-kit/ui'; const connectors = [ polkadotjsConnector(), @@ -12,19 +19,15 @@ const connectors = [ polkagateConnector(), walletConnectConnector({ projectId: process.env.NEXT_PUBLIC_WALLET_CONNECT_ID }), novaConnector({ projectId: process.env.NEXT_PUBLIC_WALLET_CONNECT_ID }), -] +]; const lunoConfig = createConfig({ appName: 'LunoKit Next.js App Router Example', chains: [polkadot, kusama, westend], connectors, autoConnect: true, -}) +}); export default function Providers({ children }: { children: React.ReactNode }) { - return ( - - {children} - - ) + return {children}; } diff --git a/examples/with-nextjs-app/next.config.ts b/examples/with-nextjs-app/next.config.ts index e9ffa30..5e891cf 100644 --- a/examples/with-nextjs-app/next.config.ts +++ b/examples/with-nextjs-app/next.config.ts @@ -1,4 +1,4 @@ -import type { NextConfig } from "next"; +import type { NextConfig } from 'next'; const nextConfig: NextConfig = { /* config options here */ diff --git a/examples/with-nextjs-app/postcss.config.mjs b/examples/with-nextjs-app/postcss.config.mjs index c7bcb4b..ba720fe 100644 --- a/examples/with-nextjs-app/postcss.config.mjs +++ b/examples/with-nextjs-app/postcss.config.mjs @@ -1,5 +1,5 @@ const config = { - plugins: ["@tailwindcss/postcss"], + plugins: ['@tailwindcss/postcss'], }; export default config; diff --git a/examples/with-nextjs-pages/next.config.ts b/examples/with-nextjs-pages/next.config.ts index 3915163..0748d34 100644 --- a/examples/with-nextjs-pages/next.config.ts +++ b/examples/with-nextjs-pages/next.config.ts @@ -1,4 +1,4 @@ -import type { NextConfig } from "next"; +import type { NextConfig } from 'next'; const nextConfig: NextConfig = { /* config options here */ diff --git a/examples/with-nextjs-pages/pages/_app.tsx b/examples/with-nextjs-pages/pages/_app.tsx index 02fa005..4570e4a 100644 --- a/examples/with-nextjs-pages/pages/_app.tsx +++ b/examples/with-nextjs-pages/pages/_app.tsx @@ -1,10 +1,17 @@ -import '@/styles/globals.css' -import type { AppProps } from "next/app" -import { LunoKitProvider } from '@luno-kit/ui' -import { createConfig } from '@luno-kit/react' -import { polkagateConnector, polkadotjsConnector, subwalletConnector, talismanConnector, novaConnector, walletConnectConnector } from '@luno-kit/react/connectors' -import { polkadot, kusama, westend } from '@luno-kit/react/chains' -import '@luno-kit/ui/styles.css' +import '@/styles/globals.css'; +import { createConfig } from '@luno-kit/react'; +import { kusama, polkadot, westend } from '@luno-kit/react/chains'; +import { + novaConnector, + polkadotjsConnector, + polkagateConnector, + subwalletConnector, + talismanConnector, + walletConnectConnector, +} from '@luno-kit/react/connectors'; +import { LunoKitProvider } from '@luno-kit/ui'; +import type { AppProps } from 'next/app'; +import '@luno-kit/ui/styles.css'; const connectors = [ polkadotjsConnector(), @@ -13,14 +20,14 @@ const connectors = [ polkagateConnector(), walletConnectConnector({ projectId: process.env.NEXT_PUBLIC_WALLET_CONNECT_ID }), novaConnector({ projectId: process.env.NEXT_PUBLIC_WALLET_CONNECT_ID }), -] +]; const lunoConfig = createConfig({ appName: 'LunoKit Next.js Pages Example', chains: [polkadot, kusama, westend], connectors, autoConnect: true, -}) +}); export default function App({ Component, pageProps }: AppProps) { return ( diff --git a/examples/with-nextjs-pages/pages/_document.tsx b/examples/with-nextjs-pages/pages/_document.tsx index 628a733..7c639f9 100644 --- a/examples/with-nextjs-pages/pages/_document.tsx +++ b/examples/with-nextjs-pages/pages/_document.tsx @@ -1,4 +1,4 @@ -import { Html, Head, Main, NextScript } from "next/document"; +import { Head, Html, Main, NextScript } from 'next/document'; export default function Document() { return ( diff --git a/examples/with-nextjs-pages/pages/api/hello.ts b/examples/with-nextjs-pages/pages/api/hello.ts index ea77e8f..eb4cc66 100644 --- a/examples/with-nextjs-pages/pages/api/hello.ts +++ b/examples/with-nextjs-pages/pages/api/hello.ts @@ -1,13 +1,10 @@ // Next.js API route support: https://nextjs.org/docs/api-routes/introduction -import type { NextApiRequest, NextApiResponse } from "next"; +import type { NextApiRequest, NextApiResponse } from 'next'; type Data = { name: string; }; -export default function handler( - req: NextApiRequest, - res: NextApiResponse, -) { - res.status(200).json({ name: "John Doe" }); +export default function handler(req: NextApiRequest, res: NextApiResponse) { + res.status(200).json({ name: 'John Doe' }); } diff --git a/examples/with-nextjs-pages/pages/index.tsx b/examples/with-nextjs-pages/pages/index.tsx index c198e35..2dcd3d7 100644 --- a/examples/with-nextjs-pages/pages/index.tsx +++ b/examples/with-nextjs-pages/pages/index.tsx @@ -1,4 +1,4 @@ -import { ConnectButton } from '@luno-kit/ui' +import { ConnectButton } from '@luno-kit/ui'; export default function Home() { return ( diff --git a/examples/with-nextjs-pages/postcss.config.mjs b/examples/with-nextjs-pages/postcss.config.mjs index c7bcb4b..ba720fe 100644 --- a/examples/with-nextjs-pages/postcss.config.mjs +++ b/examples/with-nextjs-pages/postcss.config.mjs @@ -1,5 +1,5 @@ const config = { - plugins: ["@tailwindcss/postcss"], + plugins: ['@tailwindcss/postcss'], }; export default config; diff --git a/examples/with-vite-papi/.env.example b/examples/with-vite-papi/.env.example new file mode 100644 index 0000000..0c67a58 --- /dev/null +++ b/examples/with-vite-papi/.env.example @@ -0,0 +1 @@ +VITE_WALLET_CONNECT_ID=xxx diff --git a/examples/with-vite-papi/.gitignore b/examples/with-vite-papi/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/examples/with-vite-papi/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/examples/with-vite-papi/.papi/descriptors/.gitignore b/examples/with-vite-papi/.papi/descriptors/.gitignore new file mode 100644 index 0000000..46d96ea --- /dev/null +++ b/examples/with-vite-papi/.papi/descriptors/.gitignore @@ -0,0 +1,3 @@ +* +!.gitignore +!package.json \ No newline at end of file diff --git a/examples/with-vite-papi/.papi/descriptors/dist/common-types.d.ts b/examples/with-vite-papi/.papi/descriptors/dist/common-types.d.ts new file mode 100644 index 0000000..30e094e --- /dev/null +++ b/examples/with-vite-papi/.papi/descriptors/dist/common-types.d.ts @@ -0,0 +1,21560 @@ +import { Enum, GetEnum, FixedSizeBinary, Binary, SS58String, FixedSizeArray, ResultPayload, TxCallData } from "polkadot-api"; +type AnonymousEnum = T & { + __anonymous: true; +}; +type MyTuple = [T, ...T[]]; +type SeparateUndefined = undefined extends T ? undefined | Exclude : T; +type Anonymize = SeparateUndefined ? number extends L ? Binary : FixedSizeBinary : T extends string | number | bigint | boolean | void | undefined | null | symbol | Uint8Array | Enum ? T : T extends AnonymousEnum ? Enum : T extends MyTuple ? { + [K in keyof T]: T[K]; +} : T extends [] ? [] : T extends FixedSizeArray ? number extends L ? Array : FixedSizeArray : { + [K in keyof T & string]: T[K]; +}>; +export type I5sesotjlssv2d = { + "nonce": number; + "consumers": number; + "providers": number; + "sufficients": number; + "data": Anonymize; +}; +export type I1q8tnt1cluu5j = { + "free": bigint; + "reserved": bigint; + "frozen": bigint; + "flags": bigint; +}; +export type Iffmde3ekjedi9 = { + "normal": Anonymize; + "operational": Anonymize; + "mandatory": Anonymize; +}; +export type I4q39t5hn830vp = { + "ref_time": bigint; + "proof_size": bigint; +}; +export type I4mddgoa69c0a2 = Array; +export type DigestItem = Enum<{ + "PreRuntime": Anonymize; + "Consensus": Anonymize; + "Seal": Anonymize; + "Other": Binary; + "RuntimeEnvironmentUpdated": undefined; +}>; +export declare const DigestItem: GetEnum; +export type I82jm9g7pufuel = [FixedSizeBinary<4>, Binary]; +export type Icv0uola4fi0sv = Array>; +export type I307t06l77a5mn = { + "phase": Phase; + "event": Anonymize; + "topics": Anonymize; +}; +export type Phase = Enum<{ + "ApplyExtrinsic": number; + "Finalization": undefined; + "Initialization": undefined; +}>; +export declare const Phase: GetEnum; +export type I81evgpvkt084o = AnonymousEnum<{ + "System": Anonymize; + "Scheduler": Anonymize; + "Preimage": PreimageEvent; + "Indices": Anonymize; + "Balances": Anonymize; + "TransactionPayment": TransactionPaymentEvent; + "Staking": StakingEvent; + "Offences": OffencesEvent; + "Session": SessionEvent; + "Grandpa": GrandpaEvent; + "Treasury": Anonymize; + "ConvictionVoting": ConvictionVotingEvent; + "Referenda": Anonymize; + "Whitelist": Anonymize; + "Parameters": Anonymize; + "Claims": CommonClaimsEvent; + "Vesting": VestingEvent; + "Utility": Anonymize; + "Proxy": Anonymize; + "Multisig": Anonymize; + "Bounties": BountiesEvent; + "ChildBounties": ChildBountiesEvent; + "ElectionProviderMultiPhase": ElectionProviderMultiPhaseEvent; + "VoterList": BagsListEvent; + "NominationPools": NominationPoolsEvent; + "FastUnstake": Anonymize; + "ParaInclusion": ParachainsInclusionEvent; + "Paras": ParachainsParasEvent; + "Hrmp": ParachainsHrmpEvent; + "ParasDisputes": ParachainsDisputesEvent; + "OnDemand": Anonymize; + "Registrar": CommonParasRegistrarEvent; + "Slots": CommonSlotsEvent; + "Auctions": CommonAuctionsEvent; + "Crowdloan": Anonymize; + "Coretime": PolkadotRuntimeParachainsCoretimeEvent; + "StateTrieMigration": Anonymize; + "XcmPallet": Anonymize; + "MessageQueue": Anonymize; + "AssetRate": AssetRateEvent; +}>; +export type I4ppj6e1tjsmi1 = AnonymousEnum<{ + /** + *An extrinsic completed successfully. + */ + "ExtrinsicSuccess": Anonymize; + /** + *An extrinsic failed. + */ + "ExtrinsicFailed": Anonymize; + /** + *`:code` was updated. + */ + "CodeUpdated": undefined; + /** + *A new account was created. + */ + "NewAccount": Anonymize; + /** + *An account was reaped. + */ + "KilledAccount": Anonymize; + /** + *On on-chain remark happened. + */ + "Remarked": Anonymize; + /** + *An upgrade was authorized. + */ + "UpgradeAuthorized": Anonymize; +}>; +export type Ia82mnkmeo2rhc = { + "dispatch_info": Anonymize; +}; +export type Ic9s8f85vjtncc = { + "weight": Anonymize; + "class": DispatchClass; + "pays_fee": Anonymize; +}; +export type DispatchClass = Enum<{ + "Normal": undefined; + "Operational": undefined; + "Mandatory": undefined; +}>; +export declare const DispatchClass: GetEnum; +export type Iehg04bj71rkd = AnonymousEnum<{ + "Yes": undefined; + "No": undefined; +}>; +export type I6ovmp09cui4ob = { + "dispatch_error": Anonymize; + "dispatch_info": Anonymize; +}; +export type Icb996amjvq1c5 = AnonymousEnum<{ + "Other": undefined; + "CannotLookup": undefined; + "BadOrigin": undefined; + "Module": Anonymize; + "ConsumerRemaining": undefined; + "NoProviders": undefined; + "TooManyConsumers": undefined; + "Token": TokenError; + "Arithmetic": ArithmeticError; + "Transactional": TransactionalError; + "Exhausted": undefined; + "Corruption": undefined; + "Unavailable": undefined; + "RootNotAllowed": undefined; +}>; +export type Ibbat3eoqff46l = AnonymousEnum<{ + "System": Anonymize; + "Scheduler": Anonymize; + "Preimage": Anonymize; + "Babe": Anonymize; + "Timestamp": undefined; + "Indices": Anonymize; + "Balances": Anonymize; + "TransactionPayment": undefined; + "Authorship": undefined; + "Staking": Anonymize; + "Offences": undefined; + "Historical": undefined; + "Session": Anonymize; + "Grandpa": Anonymize; + "AuthorityDiscovery": undefined; + "Treasury": Anonymize; + "ConvictionVoting": Anonymize; + "Referenda": Anonymize; + "Origins": undefined; + "Whitelist": Anonymize; + "Parameters": undefined; + "Claims": Anonymize; + "Vesting": Anonymize; + "Utility": Anonymize; + "Proxy": Anonymize; + "Multisig": Anonymize; + "Bounties": Anonymize; + "ChildBounties": Anonymize; + "ElectionProviderMultiPhase": Anonymize; + "VoterList": Anonymize; + "NominationPools": Anonymize; + "FastUnstake": Anonymize; + "ParachainsOrigin": undefined; + "Configuration": Anonymize; + "ParasShared": undefined; + "ParaInclusion": Anonymize; + "ParaInherent": Anonymize; + "ParaScheduler": undefined; + "Paras": Anonymize; + "Initializer": undefined; + "Dmp": undefined; + "Hrmp": Anonymize; + "ParaSessionInfo": undefined; + "ParasDisputes": Anonymize; + "ParasSlashing": Anonymize; + "OnDemand": Anonymize; + "CoretimeAssignmentProvider": Anonymize; + "Registrar": Anonymize; + "Slots": Anonymize; + "Auctions": Anonymize; + "Crowdloan": Anonymize; + "Coretime": Anonymize; + "StateTrieMigration": Anonymize; + "XcmPallet": Anonymize; + "MessageQueue": Anonymize; + "AssetRate": Anonymize; + "Beefy": Anonymize; + "Mmr": undefined; + "BeefyMmrLeaf": undefined; +}>; +export type I5o0s7c8q1cc9b = AnonymousEnum<{ + /** + *The name of specification does not match between the current runtime + *and the new runtime. + */ + "InvalidSpecName": undefined; + /** + *The specification version is not allowed to decrease between the current runtime + *and the new runtime. + */ + "SpecVersionNeedsToIncrease": undefined; + /** + *Failed to extract the runtime version from the new runtime. + * + *Either calling `Core_version` or decoding `RuntimeVersion` failed. + */ + "FailedToExtractRuntimeVersion": undefined; + /** + *Suicide called when the account has non-default composite data. + */ + "NonDefaultComposite": undefined; + /** + *There is a non-zero reference count preventing the account from being purged. + */ + "NonZeroRefCount": undefined; + /** + *The origin filter prevent the call to be dispatched. + */ + "CallFiltered": undefined; + /** + *A multi-block migration is ongoing and prevents the current code from being replaced. + */ + "MultiBlockMigrationsOngoing": undefined; + /** + *No upgrade authorized. + */ + "NothingAuthorized": undefined; + /** + *The submitted code is not authorized. + */ + "Unauthorized": undefined; +}>; +export type If7oa8fprnilo5 = AnonymousEnum<{ + /** + *Failed to schedule a call + */ + "FailedToSchedule": undefined; + /** + *Cannot find the scheduled call. + */ + "NotFound": undefined; + /** + *Given target block number is in the past. + */ + "TargetBlockNumberInPast": undefined; + /** + *Reschedule failed because it does not change scheduled time. + */ + "RescheduleNoChange": undefined; + /** + *Attempt to use a non-named function on a named task. + */ + "Named": undefined; +}>; +export type I1iknkudsdnbks = AnonymousEnum<{ + /** + *Preimage is too large to store on-chain. + */ + "TooBig": undefined; + /** + *Preimage has already been noted on-chain. + */ + "AlreadyNoted": undefined; + /** + *The user is not authorized to perform this action. + */ + "NotAuthorized": undefined; + /** + *The preimage cannot be removed since it has not yet been noted. + */ + "NotNoted": undefined; + /** + *A preimage may not be removed when there are outstanding requests. + */ + "Requested": undefined; + /** + *The preimage request cannot be removed since no outstanding requests exist. + */ + "NotRequested": undefined; + /** + *More than `MAX_HASH_UPGRADE_BULK_COUNT` hashes were requested to be upgraded at once. + */ + "TooMany": undefined; + /** + *Too few hashes were requested to be upgraded (i.e. zero). + */ + "TooFew": undefined; + /** + *No ticket with a cost was returned by [`Config::Consideration`] to store the preimage. + */ + "NoCost": undefined; +}>; +export type Ib6q602k6o213a = AnonymousEnum<{ + /** + *An equivocation proof provided as part of an equivocation report is invalid. + */ + "InvalidEquivocationProof": undefined; + /** + *A key ownership proof provided as part of an equivocation report is invalid. + */ + "InvalidKeyOwnershipProof": undefined; + /** + *A given equivocation report is valid but already previously reported. + */ + "DuplicateOffenceReport": undefined; + /** + *Submitted configuration is invalid. + */ + "InvalidConfiguration": undefined; +}>; +export type Icq1825fru3di2 = AnonymousEnum<{ + /** + *The index was not already assigned. + */ + "NotAssigned": undefined; + /** + *The index is assigned to another account. + */ + "NotOwner": undefined; + /** + *The index was not available. + */ + "InUse": undefined; + /** + *The source and destination accounts are identical. + */ + "NotTransfer": undefined; + /** + *The index is permanent and may not be freed/changed. + */ + "Permanent": undefined; +}>; +export type Idj13i7adlomht = AnonymousEnum<{ + /** + *Vesting balance too high to send value. + */ + "VestingBalance": undefined; + /** + *Account liquidity restrictions prevent withdrawal. + */ + "LiquidityRestrictions": undefined; + /** + *Balance too low to send value. + */ + "InsufficientBalance": undefined; + /** + *Value too low to create account due to existential deposit. + */ + "ExistentialDeposit": undefined; + /** + *Transfer/payment would kill account. + */ + "Expendability": undefined; + /** + *A vesting schedule already exists for this account. + */ + "ExistingVestingSchedule": undefined; + /** + *Beneficiary account must pre-exist. + */ + "DeadAccount": undefined; + /** + *Number of named reserves exceed `MaxReserves`. + */ + "TooManyReserves": undefined; + /** + *Number of holds exceed `VariantCountOf`. + */ + "TooManyHolds": undefined; + /** + *Number of freezes exceed `MaxFreezes`. + */ + "TooManyFreezes": undefined; + /** + *The issuance cannot be modified since it is already deactivated. + */ + "IssuanceDeactivated": undefined; + /** + *The delta cannot be zero. + */ + "DeltaZero": undefined; +}>; +export type I11137r14aka6n = AnonymousEnum<{ + /** + *Not a controller account. + */ + "NotController": undefined; + /** + *Not a stash account. + */ + "NotStash": undefined; + /** + *Stash is already bonded. + */ + "AlreadyBonded": undefined; + /** + *Controller is already paired. + */ + "AlreadyPaired": undefined; + /** + *Targets cannot be empty. + */ + "EmptyTargets": undefined; + /** + *Duplicate index. + */ + "DuplicateIndex": undefined; + /** + *Slash record index out of bounds. + */ + "InvalidSlashIndex": undefined; + /** + *Cannot have a validator or nominator role, with value less than the minimum defined by + *governance (see `MinValidatorBond` and `MinNominatorBond`). If unbonding is the + *intention, `chill` first to remove one's role as validator/nominator. + */ + "InsufficientBond": undefined; + /** + *Can not schedule more unlock chunks. + */ + "NoMoreChunks": undefined; + /** + *Can not rebond without unlocking chunks. + */ + "NoUnlockChunk": undefined; + /** + *Attempting to target a stash that still has funds. + */ + "FundedTarget": undefined; + /** + *Invalid era to reward. + */ + "InvalidEraToReward": undefined; + /** + *Invalid number of nominations. + */ + "InvalidNumberOfNominations": undefined; + /** + *Items are not sorted and unique. + */ + "NotSortedAndUnique": undefined; + /** + *Rewards for this era have already been claimed for this validator. + */ + "AlreadyClaimed": undefined; + /** + *No nominators exist on this page. + */ + "InvalidPage": undefined; + /** + *Incorrect previous history depth input provided. + */ + "IncorrectHistoryDepth": undefined; + /** + *Incorrect number of slashing spans provided. + */ + "IncorrectSlashingSpans": undefined; + /** + *Internal state has become somehow corrupted and the operation cannot continue. + */ + "BadState": undefined; + /** + *Too many nomination targets supplied. + */ + "TooManyTargets": undefined; + /** + *A nomination target was supplied that was blocked or otherwise not a validator. + */ + "BadTarget": undefined; + /** + *The user has enough bond and thus cannot be chilled forcefully by an external person. + */ + "CannotChillOther": undefined; + /** + *There are too many nominators in the system. Governance needs to adjust the staking + *settings to keep things safe for the runtime. + */ + "TooManyNominators": undefined; + /** + *There are too many validator candidates in the system. Governance needs to adjust the + *staking settings to keep things safe for the runtime. + */ + "TooManyValidators": undefined; + /** + *Commission is too low. Must be at least `MinCommission`. + */ + "CommissionTooLow": undefined; + /** + *Some bound is not met. + */ + "BoundNotMet": undefined; + /** + *Used when attempting to use deprecated controller account logic. + */ + "ControllerDeprecated": undefined; + /** + *Cannot reset a ledger. + */ + "CannotRestoreLedger": undefined; + /** + *Provided reward destination is not allowed. + */ + "RewardDestinationRestricted": undefined; + /** + *Not enough funds available to withdraw. + */ + "NotEnoughFunds": undefined; + /** + *Operation not allowed for virtual stakers. + */ + "VirtualStakerNotAllowed": undefined; +}>; +export type I1e07dgbaqd1sq = AnonymousEnum<{ + /** + *Invalid ownership proof. + */ + "InvalidProof": undefined; + /** + *No associated validator ID for account. + */ + "NoAssociatedValidatorId": undefined; + /** + *Registered duplicate key. + */ + "DuplicatedKey": undefined; + /** + *No keys are associated with this account. + */ + "NoKeys": undefined; + /** + *Key setting account is not live, so it's impossible to associate keys. + */ + "NoAccount": undefined; +}>; +export type I7q8i0pp1gkas6 = AnonymousEnum<{ + /** + *Attempt to signal GRANDPA pause when the authority set isn't live + *(either paused or already pending pause). + */ + "PauseFailed": undefined; + /** + *Attempt to signal GRANDPA resume when the authority set isn't paused + *(either live or already pending resume). + */ + "ResumeFailed": undefined; + /** + *Attempt to signal GRANDPA change with one already pending. + */ + "ChangePending": undefined; + /** + *Cannot signal forced change so soon after last. + */ + "TooSoon": undefined; + /** + *A key ownership proof provided as part of an equivocation report is invalid. + */ + "InvalidKeyOwnershipProof": undefined; + /** + *An equivocation proof provided as part of an equivocation report is invalid. + */ + "InvalidEquivocationProof": undefined; + /** + *A given equivocation report is valid but already previously reported. + */ + "DuplicateOffenceReport": undefined; +}>; +export type I36uss0m9fpcsf = AnonymousEnum<{ + /** + *No proposal, bounty or spend at that index. + */ + "InvalidIndex": undefined; + /** + *Too many approvals in the queue. + */ + "TooManyApprovals": undefined; + /** + *The spend origin is valid but the amount it is allowed to spend is lower than the + *amount to be spent. + */ + "InsufficientPermission": undefined; + /** + *Proposal has not been approved. + */ + "ProposalNotApproved": undefined; + /** + *The balance of the asset kind is not convertible to the balance of the native asset. + */ + "FailedToConvertBalance": undefined; + /** + *The spend has expired and cannot be claimed. + */ + "SpendExpired": undefined; + /** + *The spend is not yet eligible for payout. + */ + "EarlyPayout": undefined; + /** + *The payment has already been attempted. + */ + "AlreadyAttempted": undefined; + /** + *There was some issue with the mechanism of payment. + */ + "PayoutError": undefined; + /** + *The payout was not yet attempted/claimed. + */ + "NotAttempted": undefined; + /** + *The payment has neither failed nor succeeded yet. + */ + "Inconclusive": undefined; +}>; +export type Idfa8k8ikssbsf = AnonymousEnum<{ + /** + *Poll is not ongoing. + */ + "NotOngoing": undefined; + /** + *The given account did not vote on the poll. + */ + "NotVoter": undefined; + /** + *The actor has no permission to conduct the action. + */ + "NoPermission": undefined; + /** + *The actor has no permission to conduct the action right now but will do in the future. + */ + "NoPermissionYet": undefined; + /** + *The account is already delegating. + */ + "AlreadyDelegating": undefined; + /** + *The account currently has votes attached to it and the operation cannot succeed until + *these are removed through `remove_vote`. + */ + "AlreadyVoting": undefined; + /** + *Too high a balance was provided that the account cannot afford. + */ + "InsufficientFunds": undefined; + /** + *The account is not currently delegating. + */ + "NotDelegating": undefined; + /** + *Delegation to oneself makes no sense. + */ + "Nonsense": undefined; + /** + *Maximum number of votes reached. + */ + "MaxVotesReached": undefined; + /** + *The class must be supplied since it is not easily determinable from the state. + */ + "ClassNeeded": undefined; + /** + *The class ID supplied is invalid. + */ + "BadClass": undefined; +}>; +export type I84u4ul208g742 = AnonymousEnum<{ + /** + *Referendum is not ongoing. + */ + "NotOngoing": undefined; + /** + *Referendum's decision deposit is already paid. + */ + "HasDeposit": undefined; + /** + *The track identifier given was invalid. + */ + "BadTrack": undefined; + /** + *There are already a full complement of referenda in progress for this track. + */ + "Full": undefined; + /** + *The queue of the track is empty. + */ + "QueueEmpty": undefined; + /** + *The referendum index provided is invalid in this context. + */ + "BadReferendum": undefined; + /** + *There was nothing to do in the advancement. + */ + "NothingToDo": undefined; + /** + *No track exists for the proposal origin. + */ + "NoTrack": undefined; + /** + *Any deposit cannot be refunded until after the decision is over. + */ + "Unfinished": undefined; + /** + *The deposit refunder is not the depositor. + */ + "NoPermission": undefined; + /** + *The deposit cannot be refunded since none was made. + */ + "NoDeposit": undefined; + /** + *The referendum status is invalid for this operation. + */ + "BadStatus": undefined; + /** + *The preimage does not exist. + */ + "PreimageNotExist": undefined; + /** + *The preimage is stored with a different length than the one provided. + */ + "PreimageStoredWithDifferentLength": undefined; +}>; +export type I15nctscutpbeh = AnonymousEnum<{ + /** + *The preimage of the call hash could not be loaded. + */ + "UnavailablePreImage": undefined; + /** + *The call could not be decoded. + */ + "UndecodableCall": undefined; + /** + *The weight of the decoded call was higher than the witness. + */ + "InvalidCallWeightWitness": undefined; + /** + *The call was not whitelisted. + */ + "CallIsNotWhitelisted": undefined; + /** + *The call was already whitelisted; No-Op. + */ + "CallAlreadyWhitelisted": undefined; +}>; +export type Ijh2jbbqvb176 = AnonymousEnum<{ + /** + *Invalid Ethereum signature. + */ + "InvalidEthereumSignature": undefined; + /** + *Ethereum address has no claim. + */ + "SignerHasNoClaim": undefined; + /** + *Account ID sending transaction has no claim. + */ + "SenderHasNoClaim": undefined; + /** + *There's not enough in the pot to pay out some unvested amount. Generally implies a + *logic error. + */ + "PotUnderflow": undefined; + /** + *A needed statement was not included. + */ + "InvalidStatement": undefined; + /** + *The account already has a vested balance. + */ + "VestedBalanceExists": undefined; +}>; +export type Icof2acl69lq3c = AnonymousEnum<{ + /** + *The account given is not vesting. + */ + "NotVesting": undefined; + /** + *The account already has `MaxVestingSchedules` count of schedules and thus + *cannot add another one. Consider merging existing schedules in order to add another. + */ + "AtMaxVestingSchedules": undefined; + /** + *Amount being transferred is too low to create a vesting schedule. + */ + "AmountLow": undefined; + /** + *An index was out of bounds of the vesting schedules. + */ + "ScheduleIndexOutOfBounds": undefined; + /** + *Failed to create a new schedule because some parameter was invalid. + */ + "InvalidScheduleParams": undefined; +}>; +export type I8dt2g2hcrgh36 = AnonymousEnum<{ + /** + *Too many calls batched. + */ + "TooManyCalls": undefined; +}>; +export type Iuvt54ei4cehc = AnonymousEnum<{ + /** + *There are too many proxies registered or too many announcements pending. + */ + "TooMany": undefined; + /** + *Proxy registration not found. + */ + "NotFound": undefined; + /** + *Sender is not a proxy of the account to be proxied. + */ + "NotProxy": undefined; + /** + *A call which is incompatible with the proxy type's filter was attempted. + */ + "Unproxyable": undefined; + /** + *Account is already a proxy. + */ + "Duplicate": undefined; + /** + *Call may not be made by proxy because it may escalate its privileges. + */ + "NoPermission": undefined; + /** + *Announcement, if made at all, was made too recently. + */ + "Unannounced": undefined; + /** + *Cannot add self as proxy. + */ + "NoSelfProxy": undefined; +}>; +export type Ia76qmhhg4jvb9 = AnonymousEnum<{ + /** + *Threshold must be 2 or greater. + */ + "MinimumThreshold": undefined; + /** + *Call is already approved by this signatory. + */ + "AlreadyApproved": undefined; + /** + *Call doesn't need any (more) approvals. + */ + "NoApprovalsNeeded": undefined; + /** + *There are too few signatories in the list. + */ + "TooFewSignatories": undefined; + /** + *There are too many signatories in the list. + */ + "TooManySignatories": undefined; + /** + *The signatories were provided out of order; they should be ordered. + */ + "SignatoriesOutOfOrder": undefined; + /** + *The sender was contained in the other signatories; it shouldn't be. + */ + "SenderInSignatories": undefined; + /** + *Multisig operation not found when attempting to cancel. + */ + "NotFound": undefined; + /** + *Only the account that originally created the multisig is able to cancel it. + */ + "NotOwner": undefined; + /** + *No timepoint was given, yet the multisig operation is already underway. + */ + "NoTimepoint": undefined; + /** + *A different timepoint was given to the multisig operation that is underway. + */ + "WrongTimepoint": undefined; + /** + *A timepoint was given, yet no multisig operation is underway. + */ + "UnexpectedTimepoint": undefined; + /** + *The maximum weight information provided was too low. + */ + "MaxWeightTooLow": undefined; + /** + *The data to be stored is already stored. + */ + "AlreadyStored": undefined; +}>; +export type Ibfvjqqblobf53 = AnonymousEnum<{ + /** + *Proposer's balance is too low. + */ + "InsufficientProposersBalance": undefined; + /** + *No proposal or bounty at that index. + */ + "InvalidIndex": undefined; + /** + *The reason given is just too big. + */ + "ReasonTooBig": undefined; + /** + *The bounty status is unexpected. + */ + "UnexpectedStatus": undefined; + /** + *Require bounty curator. + */ + "RequireCurator": undefined; + /** + *Invalid bounty value. + */ + "InvalidValue": undefined; + /** + *Invalid bounty fee. + */ + "InvalidFee": undefined; + /** + *A bounty payout is pending. + *To cancel the bounty, you must unassign and slash the curator. + */ + "PendingPayout": undefined; + /** + *The bounties cannot be claimed/closed because it's still in the countdown period. + */ + "Premature": undefined; + /** + *The bounty cannot be closed because it has active child bounties. + */ + "HasActiveChildBounty": undefined; + /** + *Too many approvals are already queued. + */ + "TooManyQueued": undefined; +}>; +export type I4u5ou5u3tthff = AnonymousEnum<{ + /** + *The parent bounty is not in active state. + */ + "ParentBountyNotActive": undefined; + /** + *The bounty balance is not enough to add new child-bounty. + */ + "InsufficientBountyBalance": undefined; + /** + *Number of child bounties exceeds limit `MaxActiveChildBountyCount`. + */ + "TooManyChildBounties": undefined; +}>; +export type Idb84kfjd998sl = AnonymousEnum<{ + /** + *Submission was too early. + */ + "PreDispatchEarlySubmission": undefined; + /** + *Wrong number of winners presented. + */ + "PreDispatchWrongWinnerCount": undefined; + /** + *Submission was too weak, score-wise. + */ + "PreDispatchWeakSubmission": undefined; + /** + *The queue was full, and the solution was not better than any of the existing ones. + */ + "SignedQueueFull": undefined; + /** + *The origin failed to pay the deposit. + */ + "SignedCannotPayDeposit": undefined; + /** + *Witness data to dispatchable is invalid. + */ + "SignedInvalidWitness": undefined; + /** + *The signed submission consumes too much weight + */ + "SignedTooMuchWeight": undefined; + /** + *OCW submitted solution for wrong round + */ + "OcwCallWrongEra": undefined; + /** + *Snapshot metadata should exist but didn't. + */ + "MissingSnapshotMetadata": undefined; + /** + *`Self::insert_submission` returned an invalid index. + */ + "InvalidSubmissionIndex": undefined; + /** + *The call is not allowed at this point. + */ + "CallNotAllowed": undefined; + /** + *The fallback failed + */ + "FallbackFailed": undefined; + /** + *Some bound not met + */ + "BoundNotMet": undefined; + /** + *Submitted solution has too many winners + */ + "TooManyWinners": undefined; + /** + *Submission was prepared for a different round. + */ + "PreDispatchDifferentRound": undefined; +}>; +export type Ic35l5bgiij29p = AnonymousEnum<{ + /** + *A error in the list interface implementation. + */ + "List": BagsListListListError; +}>; +export type BagsListListListError = Enum<{ + "Duplicate": undefined; + "NotHeavier": undefined; + "NotInSameBag": undefined; + "NodeNotFound": undefined; +}>; +export declare const BagsListListListError: GetEnum; +export type Ic4cmf9id3qcei = AnonymousEnum<{ + /** + *A (bonded) pool id does not exist. + */ + "PoolNotFound": undefined; + /** + *An account is not a member. + */ + "PoolMemberNotFound": undefined; + /** + *A reward pool does not exist. In all cases this is a system logic error. + */ + "RewardPoolNotFound": undefined; + /** + *A sub pool does not exist. + */ + "SubPoolsNotFound": undefined; + /** + *An account is already delegating in another pool. An account may only belong to one + *pool at a time. + */ + "AccountBelongsToOtherPool": undefined; + /** + *The member is fully unbonded (and thus cannot access the bonded and reward pool + *anymore to, for example, collect rewards). + */ + "FullyUnbonding": undefined; + /** + *The member cannot unbond further chunks due to reaching the limit. + */ + "MaxUnbondingLimit": undefined; + /** + *None of the funds can be withdrawn yet because the bonding duration has not passed. + */ + "CannotWithdrawAny": undefined; + /** + *The amount does not meet the minimum bond to either join or create a pool. + * + *The depositor can never unbond to a value less than `Pallet::depositor_min_bond`. The + *caller does not have nominating permissions for the pool. Members can never unbond to a + *value below `MinJoinBond`. + */ + "MinimumBondNotMet": undefined; + /** + *The transaction could not be executed due to overflow risk for the pool. + */ + "OverflowRisk": undefined; + /** + *A pool must be in [`PoolState::Destroying`] in order for the depositor to unbond or for + *other members to be permissionlessly unbonded. + */ + "NotDestroying": undefined; + /** + *The caller does not have nominating permissions for the pool. + */ + "NotNominator": undefined; + /** + *Either a) the caller cannot make a valid kick or b) the pool is not destroying. + */ + "NotKickerOrDestroying": undefined; + /** + *The pool is not open to join + */ + "NotOpen": undefined; + /** + *The system is maxed out on pools. + */ + "MaxPools": undefined; + /** + *Too many members in the pool or system. + */ + "MaxPoolMembers": undefined; + /** + *The pools state cannot be changed. + */ + "CanNotChangeState": undefined; + /** + *The caller does not have adequate permissions. + */ + "DoesNotHavePermission": undefined; + /** + *Metadata exceeds [`Config::MaxMetadataLen`] + */ + "MetadataExceedsMaxLen": undefined; + /** + *Some error occurred that should never happen. This should be reported to the + *maintainers. + */ + "Defensive": Anonymize; + /** + *Partial unbonding now allowed permissionlessly. + */ + "PartialUnbondNotAllowedPermissionlessly": undefined; + /** + *The pool's max commission cannot be set higher than the existing value. + */ + "MaxCommissionRestricted": undefined; + /** + *The supplied commission exceeds the max allowed commission. + */ + "CommissionExceedsMaximum": undefined; + /** + *The supplied commission exceeds global maximum commission. + */ + "CommissionExceedsGlobalMaximum": undefined; + /** + *Not enough blocks have surpassed since the last commission update. + */ + "CommissionChangeThrottled": undefined; + /** + *The submitted changes to commission change rate are not allowed. + */ + "CommissionChangeRateNotAllowed": undefined; + /** + *There is no pending commission to claim. + */ + "NoPendingCommission": undefined; + /** + *No commission current has been set. + */ + "NoCommissionCurrentSet": undefined; + /** + *Pool id currently in use. + */ + "PoolIdInUse": undefined; + /** + *Pool id provided is not correct/usable. + */ + "InvalidPoolId": undefined; + /** + *Bonding extra is restricted to the exact pending reward amount. + */ + "BondExtraRestricted": undefined; + /** + *No imbalance in the ED deposit for the pool. + */ + "NothingToAdjust": undefined; + /** + *No slash pending that can be applied to the member. + */ + "NothingToSlash": undefined; + /** + *The pool or member delegation has already migrated to delegate stake. + */ + "AlreadyMigrated": undefined; + /** + *The pool or member delegation has not migrated yet to delegate stake. + */ + "NotMigrated": undefined; + /** + *This call is not allowed in the current state of the pallet. + */ + "NotSupported": undefined; +}>; +export type Ie2db4l6126rkt = AnonymousEnum<{ + "NotEnoughSpaceInUnbondPool": undefined; + "PoolNotFound": undefined; + "RewardPoolNotFound": undefined; + "SubPoolsNotFound": undefined; + "BondedStashKilledPrematurely": undefined; + "DelegationUnsupported": undefined; + "SlashNotApplied": undefined; +}>; +export type Iau9bur8dc3bec = AnonymousEnum<{ + /** + *The provided Controller account was not found. + * + *This means that the given account is not bonded. + */ + "NotController": undefined; + /** + *The bonded account has already been queued. + */ + "AlreadyQueued": undefined; + /** + *The bonded account has active unlocking chunks. + */ + "NotFullyBonded": undefined; + /** + *The provided un-staker is not in the `Queue`. + */ + "NotQueued": undefined; + /** + *The provided un-staker is already in Head, and cannot deregister. + */ + "AlreadyHead": undefined; + /** + *The call is not allowed at this point because the pallet is not active. + */ + "CallNotAllowed": undefined; +}>; +export type In1jctfv299lm = AnonymousEnum<{ + /** + *The new value for a configuration parameter is invalid. + */ + "InvalidNewValue": undefined; +}>; +export type Iat8btfaeiq1le = AnonymousEnum<{ + /** + *Validator index out of bounds. + */ + "ValidatorIndexOutOfBounds": undefined; + /** + *Candidate submitted but para not scheduled. + */ + "UnscheduledCandidate": undefined; + /** + *Head data exceeds the configured maximum. + */ + "HeadDataTooLarge": undefined; + /** + *Code upgrade prematurely. + */ + "PrematureCodeUpgrade": undefined; + /** + *Output code is too large + */ + "NewCodeTooLarge": undefined; + /** + *The candidate's relay-parent was not allowed. Either it was + *not recent enough or it didn't advance based on the last parachain block. + */ + "DisallowedRelayParent": undefined; + /** + *Failed to compute group index for the core: either it's out of bounds + *or the relay parent doesn't belong to the current session. + */ + "InvalidAssignment": undefined; + /** + *Invalid group index in core assignment. + */ + "InvalidGroupIndex": undefined; + /** + *Insufficient (non-majority) backing. + */ + "InsufficientBacking": undefined; + /** + *Invalid (bad signature, unknown validator, etc.) backing. + */ + "InvalidBacking": undefined; + /** + *Collator did not sign PoV. + */ + "NotCollatorSigned": undefined; + /** + *The validation data hash does not match expected. + */ + "ValidationDataHashMismatch": undefined; + /** + *The downward message queue is not processed correctly. + */ + "IncorrectDownwardMessageHandling": undefined; + /** + *At least one upward message sent does not pass the acceptance criteria. + */ + "InvalidUpwardMessages": undefined; + /** + *The candidate didn't follow the rules of HRMP watermark advancement. + */ + "HrmpWatermarkMishandling": undefined; + /** + *The HRMP messages sent by the candidate is not valid. + */ + "InvalidOutboundHrmp": undefined; + /** + *The validation code hash of the candidate is not valid. + */ + "InvalidValidationCodeHash": undefined; + /** + *The `para_head` hash in the candidate descriptor doesn't match the hash of the actual + *para head in the commitments. + */ + "ParaHeadMismatch": undefined; +}>; +export type Idfqgoii3heb2f = AnonymousEnum<{ + /** + *Inclusion inherent called more than once per block. + */ + "TooManyInclusionInherents": undefined; + /** + *The hash of the submitted parent header doesn't correspond to the saved block hash of + *the parent. + */ + "InvalidParentHeader": undefined; + /** + *The data given to the inherent will result in an overweight block. + */ + "InherentOverweight": undefined; + /** + *A candidate was filtered during inherent execution. This should have only been done + *during creation. + */ + "CandidatesFilteredDuringExecution": undefined; + /** + *Too many candidates supplied. + */ + "UnscheduledCandidate": undefined; +}>; +export type Ieo97unb4d08rl = AnonymousEnum<{ + /** + *Para is not registered in our system. + */ + "NotRegistered": undefined; + /** + *Para cannot be onboarded because it is already tracked by our system. + */ + "CannotOnboard": undefined; + /** + *Para cannot be offboarded at this time. + */ + "CannotOffboard": undefined; + /** + *Para cannot be upgraded to a lease holding parachain. + */ + "CannotUpgrade": undefined; + /** + *Para cannot be downgraded to an on-demand parachain. + */ + "CannotDowngrade": undefined; + /** + *The statement for PVF pre-checking is stale. + */ + "PvfCheckStatementStale": undefined; + /** + *The statement for PVF pre-checking is for a future session. + */ + "PvfCheckStatementFuture": undefined; + /** + *Claimed validator index is out of bounds. + */ + "PvfCheckValidatorIndexOutOfBounds": undefined; + /** + *The signature for the PVF pre-checking is invalid. + */ + "PvfCheckInvalidSignature": undefined; + /** + *The given validator already has cast a vote. + */ + "PvfCheckDoubleVote": undefined; + /** + *The given PVF does not exist at the moment of process a vote. + */ + "PvfCheckSubjectInvalid": undefined; + /** + *Parachain cannot currently schedule a code upgrade. + */ + "CannotUpgradeCode": undefined; + /** + *Invalid validation code size. + */ + "InvalidCode": undefined; +}>; +export type Ibns95nfmm92df = AnonymousEnum<{ + /** + *The sender tried to open a channel to themselves. + */ + "OpenHrmpChannelToSelf": undefined; + /** + *The recipient is not a valid para. + */ + "OpenHrmpChannelInvalidRecipient": undefined; + /** + *The requested capacity is zero. + */ + "OpenHrmpChannelZeroCapacity": undefined; + /** + *The requested capacity exceeds the global limit. + */ + "OpenHrmpChannelCapacityExceedsLimit": undefined; + /** + *The requested maximum message size is 0. + */ + "OpenHrmpChannelZeroMessageSize": undefined; + /** + *The open request requested the message size that exceeds the global limit. + */ + "OpenHrmpChannelMessageSizeExceedsLimit": undefined; + /** + *The channel already exists + */ + "OpenHrmpChannelAlreadyExists": undefined; + /** + *There is already a request to open the same channel. + */ + "OpenHrmpChannelAlreadyRequested": undefined; + /** + *The sender already has the maximum number of allowed outbound channels. + */ + "OpenHrmpChannelLimitExceeded": undefined; + /** + *The channel from the sender to the origin doesn't exist. + */ + "AcceptHrmpChannelDoesntExist": undefined; + /** + *The channel is already confirmed. + */ + "AcceptHrmpChannelAlreadyConfirmed": undefined; + /** + *The recipient already has the maximum number of allowed inbound channels. + */ + "AcceptHrmpChannelLimitExceeded": undefined; + /** + *The origin tries to close a channel where it is neither the sender nor the recipient. + */ + "CloseHrmpChannelUnauthorized": undefined; + /** + *The channel to be closed doesn't exist. + */ + "CloseHrmpChannelDoesntExist": undefined; + /** + *The channel close request is already requested. + */ + "CloseHrmpChannelAlreadyUnderway": undefined; + /** + *Canceling is requested by neither the sender nor recipient of the open channel request. + */ + "CancelHrmpOpenChannelUnauthorized": undefined; + /** + *The open request doesn't exist. + */ + "OpenHrmpChannelDoesntExist": undefined; + /** + *Cannot cancel an HRMP open channel request because it is already confirmed. + */ + "OpenHrmpChannelAlreadyConfirmed": undefined; + /** + *The provided witness data is wrong. + */ + "WrongWitness": undefined; + /** + *The channel between these two chains cannot be authorized. + */ + "ChannelCreationNotAuthorized": undefined; +}>; +export type Iakburbqot4g58 = AnonymousEnum<{ + /** + *Duplicate dispute statement sets provided. + */ + "DuplicateDisputeStatementSets": undefined; + /** + *Ancient dispute statement provided. + */ + "AncientDisputeStatement": undefined; + /** + *Validator index on statement is out of bounds for session. + */ + "ValidatorIndexOutOfBounds": undefined; + /** + *Invalid signature on statement. + */ + "InvalidSignature": undefined; + /** + *Validator vote submitted more than once to dispute. + */ + "DuplicateStatement": undefined; + /** + *A dispute where there are only votes on one side. + */ + "SingleSidedDispute": undefined; + /** + *A dispute vote from a malicious backer. + */ + "MaliciousBacker": undefined; + /** + *No backing votes were provides along dispute statements. + */ + "MissingBackingVotes": undefined; + /** + *Unconfirmed dispute statement sets provided. + */ + "UnconfirmedDispute": undefined; +}>; +export type I1v70p1j0r2q1j = AnonymousEnum<{ + /** + *The key ownership proof is invalid. + */ + "InvalidKeyOwnershipProof": undefined; + /** + *The session index is too old or invalid. + */ + "InvalidSessionIndex": undefined; + /** + *The candidate hash is invalid. + */ + "InvalidCandidateHash": undefined; + /** + *There is no pending slash for the given validator index and time + *slot. + */ + "InvalidValidatorIndex": undefined; + /** + *The validator index does not match the validator id. + */ + "ValidatorIndexIdMismatch": undefined; + /** + *The given slashing report is valid but already previously reported. + */ + "DuplicateSlashingReport": undefined; +}>; +export type I8htscm3ert491 = AnonymousEnum<{ + /** + *The order queue is full, `place_order` will not continue. + */ + "QueueFull": undefined; + /** + *The current spot price is higher than the max amount specified in the `place_order` + *call, making it invalid. + */ + "SpotPriceHigherThanMaxAmount": undefined; +}>; +export type Ie3b9qd0nd59gs = AnonymousEnum<{ + "AssignmentsEmpty": undefined; + /** + *Assignments together exceeded 57600. + */ + "OverScheduled": undefined; + /** + *Assignments together less than 57600 + */ + "UnderScheduled": undefined; + /** + *assign_core is only allowed to append new assignments at the end of already existing + *ones. + */ + "DisallowedInsert": undefined; + /** + *Tried to insert a schedule for the same core and block number as an existing schedule + */ + "DuplicateInsert": undefined; + /** + *Tried to add an unsorted set of assignments + */ + "AssignmentsNotSorted": undefined; +}>; +export type I97vkspnd0b8bh = AnonymousEnum<{ + /** + *The ID is not registered. + */ + "NotRegistered": undefined; + /** + *The ID is already registered. + */ + "AlreadyRegistered": undefined; + /** + *The caller is not the owner of this Id. + */ + "NotOwner": undefined; + /** + *Invalid para code size. + */ + "CodeTooLarge": undefined; + /** + *Invalid para head data size. + */ + "HeadDataTooLarge": undefined; + /** + *Para is not a Parachain. + */ + "NotParachain": undefined; + /** + *Para is not a Parathread (on-demand parachain). + */ + "NotParathread": undefined; + /** + *Cannot deregister para + */ + "CannotDeregister": undefined; + /** + *Cannot schedule downgrade of lease holding parachain to on-demand parachain + */ + "CannotDowngrade": undefined; + /** + *Cannot schedule upgrade of on-demand parachain to lease holding parachain + */ + "CannotUpgrade": undefined; + /** + *Para is locked from manipulation by the manager. Must use parachain or relay chain + *governance. + */ + "ParaLocked": undefined; + /** + *The ID given for registration has not been reserved. + */ + "NotReserved": undefined; + /** + *The validation code is invalid. + */ + "InvalidCode": undefined; + /** + *Cannot perform a parachain slot / lifecycle swap. Check that the state of both paras + *are correct for the swap to work. + */ + "CannotSwap": undefined; +}>; +export type Iers095sa65pbg = AnonymousEnum<{ + /** + *The parachain ID is not onboarding. + */ + "ParaNotOnboarding": undefined; + /** + *There was an error with the lease. + */ + "LeaseError": undefined; +}>; +export type I4kgo47o2v3701 = AnonymousEnum<{ + /** + *This auction is already in progress. + */ + "AuctionInProgress": undefined; + /** + *The lease period is in the past. + */ + "LeasePeriodInPast": undefined; + /** + *Para is not registered + */ + "ParaNotRegistered": undefined; + /** + *Not a current auction. + */ + "NotCurrentAuction": undefined; + /** + *Not an auction. + */ + "NotAuction": undefined; + /** + *Auction has already ended. + */ + "AuctionEnded": undefined; + /** + *The para is already leased out for part of this range. + */ + "AlreadyLeasedOut": undefined; +}>; +export type I9o6l1c4r4qc3s = AnonymousEnum<{ + /** + *The current lease period is more than the first lease period. + */ + "FirstPeriodInPast": undefined; + /** + *The first lease period needs to at least be less than 3 `max_value`. + */ + "FirstPeriodTooFarInFuture": undefined; + /** + *Last lease period must be greater than first lease period. + */ + "LastPeriodBeforeFirstPeriod": undefined; + /** + *The last lease period cannot be more than 3 periods after the first period. + */ + "LastPeriodTooFarInFuture": undefined; + /** + *The campaign ends before the current block number. The end must be in the future. + */ + "CannotEndInPast": undefined; + /** + *The end date for this crowdloan is not sensible. + */ + "EndTooFarInFuture": undefined; + /** + *There was an overflow. + */ + "Overflow": undefined; + /** + *The contribution was below the minimum, `MinContribution`. + */ + "ContributionTooSmall": undefined; + /** + *Invalid fund index. + */ + "InvalidParaId": undefined; + /** + *Contributions exceed maximum amount. + */ + "CapExceeded": undefined; + /** + *The contribution period has already ended. + */ + "ContributionPeriodOver": undefined; + /** + *The origin of this call is invalid. + */ + "InvalidOrigin": undefined; + /** + *This crowdloan does not correspond to a parachain. + */ + "NotParachain": undefined; + /** + *This parachain lease is still active and retirement cannot yet begin. + */ + "LeaseActive": undefined; + /** + *This parachain's bid or lease is still active and withdraw cannot yet begin. + */ + "BidOrLeaseActive": undefined; + /** + *The crowdloan has not yet ended. + */ + "FundNotEnded": undefined; + /** + *There are no contributions stored in this crowdloan. + */ + "NoContributions": undefined; + /** + *The crowdloan is not ready to dissolve. Potentially still has a slot or in retirement + *period. + */ + "NotReadyToDissolve": undefined; + /** + *Invalid signature. + */ + "InvalidSignature": undefined; + /** + *The provided memo is too large. + */ + "MemoTooLarge": undefined; + /** + *The fund is already in `NewRaise` + */ + "AlreadyInNewRaise": undefined; + /** + *No contributions allowed during the VRF delay + */ + "VrfDelayInProgress": undefined; + /** + *A lease period has not started yet, due to an offset in the starting block. + */ + "NoLeasePeriod": undefined; +}>; +export type Ifju0orssp9h7o = AnonymousEnum<{ + /** + *The paraid making the call is not the coretime brokerage system parachain. + */ + "NotBroker": undefined; + /** + *Requested revenue information `when` parameter was in the future from the current + *block height. + */ + "RequestedFutureRevenue": undefined; + /** + *Failed to transfer assets to the coretime chain + */ + "AssetTransferFailed": undefined; +}>; +export type I96objte63brjr = AnonymousEnum<{ + /** + *Max signed limits not respected. + */ + "MaxSignedLimits": undefined; + /** + *A key was longer than the configured maximum. + * + *This means that the migration halted at the current [`Progress`] and + *can be resumed with a larger [`crate::Config::MaxKeyLen`] value. + *Retrying with the same [`crate::Config::MaxKeyLen`] value will not work. + *The value should only be increased to avoid a storage migration for the currently + *stored [`crate::Progress::LastKey`]. + */ + "KeyTooLong": undefined; + /** + *submitter does not have enough funds. + */ + "NotEnoughFunds": undefined; + /** + *Bad witness data provided. + */ + "BadWitness": undefined; + /** + *Signed migration is not allowed because the maximum limit is not set yet. + */ + "SignedMigrationNotAllowed": undefined; + /** + *Bad child root provided. + */ + "BadChildRoot": undefined; +}>; +export type I87j95aq93d7dq = AnonymousEnum<{ + /** + *The desired destination was unreachable, generally because there is a no way of routing + *to it. + */ + "Unreachable": undefined; + /** + *There was some other issue (i.e. not to do with routing) in sending the message. + *Perhaps a lack of space for buffering the message. + */ + "SendFailure": undefined; + /** + *The message execution fails the filter. + */ + "Filtered": undefined; + /** + *The message's weight could not be determined. + */ + "UnweighableMessage": undefined; + /** + *The destination `Location` provided cannot be inverted. + */ + "DestinationNotInvertible": undefined; + /** + *The assets to be sent are empty. + */ + "Empty": undefined; + /** + *Could not re-anchor the assets to declare the fees for the destination chain. + */ + "CannotReanchor": undefined; + /** + *Too many assets have been attempted for transfer. + */ + "TooManyAssets": undefined; + /** + *Origin is invalid for sending. + */ + "InvalidOrigin": undefined; + /** + *The version of the `Versioned` value used is not able to be interpreted. + */ + "BadVersion": undefined; + /** + *The given location could not be used (e.g. because it cannot be expressed in the + *desired version of XCM). + */ + "BadLocation": undefined; + /** + *The referenced subscription could not be found. + */ + "NoSubscription": undefined; + /** + *The location is invalid since it already has a subscription from us. + */ + "AlreadySubscribed": undefined; + /** + *Could not check-out the assets for teleportation to the destination chain. + */ + "CannotCheckOutTeleport": undefined; + /** + *The owner does not own (all) of the asset that they wish to do the operation on. + */ + "LowBalance": undefined; + /** + *The asset owner has too many locks on the asset. + */ + "TooManyLocks": undefined; + /** + *The given account is not an identifiable sovereign account for any location. + */ + "AccountNotSovereign": undefined; + /** + *The operation required fees to be paid which the initiator could not meet. + */ + "FeesNotMet": undefined; + /** + *A remote lock with the corresponding data could not be found. + */ + "LockNotFound": undefined; + /** + *The unlock operation cannot succeed because there are still consumers of the lock. + */ + "InUse": undefined; + /** + *Invalid asset, reserve chain could not be determined for it. + */ + "InvalidAssetUnknownReserve": undefined; + /** + *Invalid asset, do not support remote asset reserves with different fees reserves. + */ + "InvalidAssetUnsupportedReserve": undefined; + /** + *Too many assets with different reserve locations have been attempted for transfer. + */ + "TooManyReserves": undefined; + /** + *Local XCM execution incomplete. + */ + "LocalExecutionIncomplete": undefined; +}>; +export type I5iupade5ag2dp = AnonymousEnum<{ + /** + *Page is not reapable because it has items remaining to be processed and is not old + *enough. + */ + "NotReapable": undefined; + /** + *Page to be reaped does not exist. + */ + "NoPage": undefined; + /** + *The referenced message could not be found. + */ + "NoMessage": undefined; + /** + *The message was already processed and cannot be processed again. + */ + "AlreadyProcessed": undefined; + /** + *The message is queued for future execution. + */ + "Queued": undefined; + /** + *There is temporarily not enough weight to continue servicing messages. + */ + "InsufficientWeight": undefined; + /** + *This message is temporarily unprocessable. + * + *Such errors are expected, but not guaranteed, to resolve themselves eventually through + *retrying. + */ + "TemporarilyUnprocessable": undefined; + /** + *The queue is paused and no message can be executed from it. + * + *This can change at any time and may resolve in the future by re-trying. + */ + "QueuePaused": undefined; + /** + *Another call is in progress and needs to finish before this call can happen. + */ + "RecursiveDisallowed": undefined; +}>; +export type I3qgd61cgli6cp = AnonymousEnum<{ + /** + *The given asset ID is unknown. + */ + "UnknownAssetKind": undefined; + /** + *The given asset ID already has an assigned conversion rate and cannot be re-created. + */ + "AlreadyExists": undefined; + /** + *Overflow ocurred when calculating the inverse rate. + */ + "Overflow": undefined; +}>; +export type TokenError = Enum<{ + "FundsUnavailable": undefined; + "OnlyProvider": undefined; + "BelowMinimum": undefined; + "CannotCreate": undefined; + "UnknownAsset": undefined; + "Frozen": undefined; + "Unsupported": undefined; + "CannotCreateHold": undefined; + "NotExpendable": undefined; + "Blocked": undefined; +}>; +export declare const TokenError: GetEnum; +export type ArithmeticError = Enum<{ + "Underflow": undefined; + "Overflow": undefined; + "DivisionByZero": undefined; +}>; +export declare const ArithmeticError: GetEnum; +export type TransactionalError = Enum<{ + "LimitReached": undefined; + "NoLayer": undefined; +}>; +export declare const TransactionalError: GetEnum; +export type Icbccs0ug47ilf = { + "account": SS58String; +}; +export type I855j4i3kr8ko1 = { + "sender": SS58String; + "hash": FixedSizeBinary<32>; +}; +export type Ibgl04rn6nbfm6 = { + "code_hash": FixedSizeBinary<32>; + "check_version": boolean; +}; +export type I9td3rb1rc78be = AnonymousEnum<{ + /** + *Scheduled some task. + */ + "Scheduled": Anonymize; + /** + *Canceled some task. + */ + "Canceled": Anonymize; + /** + *Dispatched some task. + */ + "Dispatched": Anonymize; + /** + *Set a retry configuration for some task. + */ + "RetrySet": Anonymize; + /** + *Cancel a retry configuration for some task. + */ + "RetryCancelled": Anonymize; + /** + *The call for the provided hash was not found so the task has been aborted. + */ + "CallUnavailable": Anonymize; + /** + *The given task was unable to be renewed since the agenda is full at that block. + */ + "PeriodicFailed": Anonymize; + /** + *The given task was unable to be retried since the agenda is full at that block or there + *was not enough weight to reschedule it. + */ + "RetryFailed": Anonymize; + /** + *The given task can never be executed since it is overweight. + */ + "PermanentlyOverweight": Anonymize; +}>; +export type I5n4sebgkfr760 = { + "when": number; + "index": number; +}; +export type I4pem65k15fchj = { + "task": Anonymize; + "id"?: Anonymize; + "result": Anonymize; +}; +export type I9jd27rnpm8ttv = FixedSizeArray<2, number>; +export type I4s6vifaf8k998 = (FixedSizeBinary<32>) | undefined; +export type Icjq7kd1j70ubn = ResultPayload>; +export type Ia3c82eadg79bj = { + "task": Anonymize; + "id"?: Anonymize; + "period": number; + "retries": number; +}; +export type Ienusoeb625ftq = { + "task": Anonymize; + "id"?: Anonymize; +}; +export type PreimageEvent = Enum<{ + /** + *A preimage has been noted. + */ + "Noted": Anonymize; + /** + *A preimage has been requested. + */ + "Requested": Anonymize; + /** + *A preimage has ben cleared. + */ + "Cleared": Anonymize; +}>; +export declare const PreimageEvent: GetEnum; +export type I1jm8m1rh9e20v = { + "hash": FixedSizeBinary<32>; +}; +export type IndicesEvent = Enum<{ + /** + *A account index was assigned. + */ + "IndexAssigned": Anonymize; + /** + *A account index has been freed up (unassigned). + */ + "IndexFreed": Anonymize; + /** + *A account index has been frozen to its current account ID. + */ + "IndexFrozen": Anonymize; +}>; +export declare const IndicesEvent: GetEnum; +export type Ia1u3jll6a06ae = { + "who": SS58String; + "index": number; +}; +export type I666bl2fqjkejo = { + "index": number; +}; +export type Iao8h4hv7atnq3 = AnonymousEnum<{ + /** + *An account was created with some free balance. + */ + "Endowed": Anonymize; + /** + *An account was removed whose balance was non-zero but below ExistentialDeposit, + *resulting in an outright loss. + */ + "DustLost": Anonymize; + /** + *Transfer succeeded. + */ + "Transfer": Anonymize; + /** + *A balance was set by root. + */ + "BalanceSet": Anonymize; + /** + *Some balance was reserved (moved from free to reserved). + */ + "Reserved": Anonymize; + /** + *Some balance was unreserved (moved from reserved to free). + */ + "Unreserved": Anonymize; + /** + *Some balance was moved from the reserve of the first account to the second account. + *Final argument indicates the destination balance type. + */ + "ReserveRepatriated": Anonymize; + /** + *Some amount was deposited (e.g. for transaction fees). + */ + "Deposit": Anonymize; + /** + *Some amount was withdrawn from the account (e.g. for transaction fees). + */ + "Withdraw": Anonymize; + /** + *Some amount was removed from the account (e.g. for misbehavior). + */ + "Slashed": Anonymize; + /** + *Some amount was minted into an account. + */ + "Minted": Anonymize; + /** + *Some amount was burned from an account. + */ + "Burned": Anonymize; + /** + *Some amount was suspended from an account (it can be restored later). + */ + "Suspended": Anonymize; + /** + *Some amount was restored into an account. + */ + "Restored": Anonymize; + /** + *An account was upgraded. + */ + "Upgraded": Anonymize; + /** + *Total issuance was increased by `amount`, creating a credit to be balanced. + */ + "Issued": Anonymize; + /** + *Total issuance was decreased by `amount`, creating a debt to be balanced. + */ + "Rescinded": Anonymize; + /** + *Some balance was locked. + */ + "Locked": Anonymize; + /** + *Some balance was unlocked. + */ + "Unlocked": Anonymize; + /** + *Some balance was frozen. + */ + "Frozen": Anonymize; + /** + *Some balance was thawed. + */ + "Thawed": Anonymize; + /** + *The `TotalIssuance` was forcefully changed. + */ + "TotalIssuanceForced": Anonymize; +}>; +export type Icv68aq8841478 = { + "account": SS58String; + "free_balance": bigint; +}; +export type Ic262ibdoec56a = { + "account": SS58String; + "amount": bigint; +}; +export type Iflcfm9b6nlmdd = { + "from": SS58String; + "to": SS58String; + "amount": bigint; +}; +export type Ijrsf4mnp3eka = { + "who": SS58String; + "free": bigint; +}; +export type Id5fm4p8lj5qgi = { + "who": SS58String; + "amount": bigint; +}; +export type I8tjvj9uq4b7hi = { + "from": SS58String; + "to": SS58String; + "amount": bigint; + "destination_status": BalanceStatus; +}; +export type BalanceStatus = Enum<{ + "Free": undefined; + "Reserved": undefined; +}>; +export declare const BalanceStatus: GetEnum; +export type I4cbvqmqadhrea = { + "who": SS58String; +}; +export type I3qt1hgg4djhgb = { + "amount": bigint; +}; +export type I4fooe9dun9o0t = { + "old": bigint; + "new": bigint; +}; +export type TransactionPaymentEvent = Enum<{ + /** + *A transaction fee `actual_fee`, of which `tip` was added to the minimum inclusion fee, + *has been paid by `who`. + */ + "TransactionFeePaid": Anonymize; +}>; +export declare const TransactionPaymentEvent: GetEnum; +export type Ier2cke86dqbr2 = { + "who": SS58String; + "actual_fee": bigint; + "tip": bigint; +}; +export type StakingEvent = Enum<{ + /** + *The era payout has been set; the first balance is the validator-payout; the second is + *the remainder from the maximum amount of reward. + */ + "EraPaid": Anonymize; + /** + *The nominator has been rewarded by this amount to this destination. + */ + "Rewarded": Anonymize; + /** + *A staker (validator or nominator) has been slashed by the given amount. + */ + "Slashed": Anonymize; + /** + *A slash for the given validator, for the given percentage of their stake, at the given + *era as been reported. + */ + "SlashReported": Anonymize; + /** + *An old slashing report from a prior era was discarded because it could + *not be processed. + */ + "OldSlashingReportDiscarded": Anonymize; + /** + *A new set of stakers was elected. + */ + "StakersElected": undefined; + /** + *An account has bonded this amount. \[stash, amount\] + * + *NOTE: This event is only emitted when funds are bonded via a dispatchable. Notably, + *it will not be emitted for staking rewards when they are added to stake. + */ + "Bonded": Anonymize; + /** + *An account has unbonded this amount. + */ + "Unbonded": Anonymize; + /** + *An account has called `withdraw_unbonded` and removed unbonding chunks worth `Balance` + *from the unlocking queue. + */ + "Withdrawn": Anonymize; + /** + *A nominator has been kicked from a validator. + */ + "Kicked": Anonymize; + /** + *The election failed. No new era is planned. + */ + "StakingElectionFailed": undefined; + /** + *An account has stopped participating as either a validator or nominator. + */ + "Chilled": Anonymize; + /** + *The stakers' rewards are getting paid. + */ + "PayoutStarted": Anonymize; + /** + *A validator has set their preferences. + */ + "ValidatorPrefsSet": Anonymize; + /** + *Voters size limit reached. + */ + "SnapshotVotersSizeExceeded": Anonymize; + /** + *Targets size limit reached. + */ + "SnapshotTargetsSizeExceeded": Anonymize; + /** + *A new force era mode was set. + */ + "ForceEra": Anonymize; + /** + *Report of a controller batch deprecation. + */ + "ControllerBatchDeprecated": Anonymize; +}>; +export declare const StakingEvent: GetEnum; +export type I1au3fq4n84nv3 = { + "era_index": number; + "validator_payout": bigint; + "remainder": bigint; +}; +export type Iejaj7m7qka9tr = { + "stash": SS58String; + "dest": StakingRewardDestination; + "amount": bigint; +}; +export type StakingRewardDestination = Enum<{ + "Staked": undefined; + "Stash": undefined; + "Controller": undefined; + "Account": SS58String; + "None": undefined; +}>; +export declare const StakingRewardDestination: GetEnum; +export type Idnak900lt5lm8 = { + "staker": SS58String; + "amount": bigint; +}; +export type I27n7lbd66730p = { + "validator": SS58String; + "fraction": number; + "slash_era": number; +}; +export type I2hq50pu2kdjpo = { + "session_index": number; +}; +export type Ifk8eme5o7mukf = { + "stash": SS58String; + "amount": bigint; +}; +export type Iau4cgm6ih61cf = { + "nominator": SS58String; + "stash": SS58String; +}; +export type Idl3umm12u5pa = { + "stash": SS58String; +}; +export type I6ir616rur362k = { + "era_index": number; + "validator_stash": SS58String; +}; +export type Ic19as7nbst738 = { + "stash": SS58String; + "prefs": Anonymize; +}; +export type I9o7ssi9vmhmgr = { + "commission": number; + "blocked": boolean; +}; +export type I54umskavgc9du = { + "size": number; +}; +export type I2ip7o9e2tc5sf = { + "mode": StakingForcing; +}; +export type StakingForcing = Enum<{ + "NotForcing": undefined; + "ForceNew": undefined; + "ForceNone": undefined; + "ForceAlways": undefined; +}>; +export declare const StakingForcing: GetEnum; +export type I5egvk6hadac5h = { + "failures": number; +}; +export type OffencesEvent = Enum<{ + /** + *There is an offence reported of the given `kind` happened at the `session_index` and + *(kind-specific) time slot. This event is not deposited for duplicate slashes. + *\[kind, timeslot\]. + */ + "Offence": Anonymize; +}>; +export declare const OffencesEvent: GetEnum; +export type Iempvdlhc5ih6g = { + "kind": FixedSizeBinary<16>; + "timeslot": Binary; +}; +export type SessionEvent = Enum<{ + /** + *New session has happened. Note that the argument is the session index, not the + *block number as the type might suggest. + */ + "NewSession": Anonymize; +}>; +export declare const SessionEvent: GetEnum; +export type GrandpaEvent = Enum<{ + /** + *New authority set has been applied. + */ + "NewAuthorities": Anonymize; + /** + *Current authority set has been paused. + */ + "Paused": undefined; + /** + *Current authority set has been resumed. + */ + "Resumed": undefined; +}>; +export declare const GrandpaEvent: GetEnum; +export type I5768ac424h061 = { + "authority_set": Anonymize; +}; +export type I3geksg000c171 = Array>; +export type I5spuldj7iqfb2 = [FixedSizeBinary<32>, bigint]; +export type Iceo3qo846468b = AnonymousEnum<{ + /** + *We have ended a spend period and will now allocate funds. + */ + "Spending": Anonymize; + /** + *Some funds have been allocated. + */ + "Awarded": Anonymize; + /** + *Some of our funds have been burnt. + */ + "Burnt": Anonymize; + /** + *Spending has finished; this is the amount that rolls over until next spend. + */ + "Rollover": Anonymize; + /** + *Some funds have been deposited. + */ + "Deposit": Anonymize; + /** + *A new spend proposal has been approved. + */ + "SpendApproved": Anonymize; + /** + *The inactive funds of the pallet have been updated. + */ + "UpdatedInactive": Anonymize; + /** + *A new asset spend proposal has been approved. + */ + "AssetSpendApproved": Anonymize; + /** + *An approved spend was voided. + */ + "AssetSpendVoided": Anonymize; + /** + *A payment happened. + */ + "Paid": Anonymize; + /** + *A payment failed and can be retried. + */ + "PaymentFailed": Anonymize; + /** + *A spend was processed and removed from the storage. It might have been successfully + *paid or it may have expired. + */ + "SpendProcessed": Anonymize; +}>; +export type I8iksqi3eani0a = { + "budget_remaining": bigint; +}; +export type I16enopmju1p0q = { + "proposal_index": number; + "award": bigint; + "account": SS58String; +}; +export type I43kq8qudg7pq9 = { + "burnt_funds": bigint; +}; +export type I76riseemre533 = { + "rollover_balance": bigint; +}; +export type Ie5v6njpckr05b = { + "value": bigint; +}; +export type I38bmcrmh852rk = { + "proposal_index": number; + "amount": bigint; + "beneficiary": SS58String; +}; +export type I4hcillge8de5f = { + "reactivated": bigint; + "deactivated": bigint; +}; +export type If52u7u3r3ve0n = { + "index": number; + "asset_kind": VersionedLocatableAsset; + "amount": bigint; + "beneficiary": DotXcmVersionedLocation; + "valid_from": number; + "expire_at": number; +}; +export type VersionedLocatableAsset = Enum<{ + "V3": Anonymize; + "V4": Anonymize; +}>; +export declare const VersionedLocatableAsset: GetEnum; +export type Ieiirnju6cff3l = { + "location": Anonymize; + "asset_id": XcmV3MultiassetAssetId; +}; +export type I4c0s5cioidn76 = { + "parents": number; + "interior": XcmV3Junctions; +}; +export type XcmV3Junctions = Enum<{ + "Here": undefined; + "X1": XcmV3Junction; + "X2": Anonymize; + "X3": Anonymize; + "X4": Anonymize; + "X5": Anonymize; + "X6": Anonymize; + "X7": Anonymize; + "X8": Anonymize; +}>; +export declare const XcmV3Junctions: GetEnum; +export type XcmV3Junction = Enum<{ + "Parachain": number; + "AccountId32": Anonymize; + "AccountIndex64": Anonymize; + "AccountKey20": Anonymize; + "PalletInstance": number; + "GeneralIndex": bigint; + "GeneralKey": Anonymize; + "OnlyChild": undefined; + "Plurality": Anonymize; + "GlobalConsensus": XcmV3JunctionNetworkId; +}>; +export declare const XcmV3Junction: GetEnum; +export type Ifq0i8kc6ds30i = { + "network"?: Anonymize; + "id": FixedSizeBinary<32>; +}; +export type Idcq3vns9tgp5p = (XcmV3JunctionNetworkId) | undefined; +export type XcmV3JunctionNetworkId = Enum<{ + "ByGenesis": FixedSizeBinary<32>; + "ByFork": Anonymize; + "Polkadot": undefined; + "Kusama": undefined; + "Westend": undefined; + "Rococo": undefined; + "Wococo": undefined; + "Ethereum": Anonymize; + "BitcoinCore": undefined; + "BitcoinCash": undefined; + "PolkadotBulletin": undefined; +}>; +export declare const XcmV3JunctionNetworkId: GetEnum; +export type I15vf5oinmcgps = { + "block_number": bigint; + "block_hash": FixedSizeBinary<32>; +}; +export type I623eo8t3jrbeo = { + "chain_id": bigint; +}; +export type I2a3org9qntfkr = { + "network"?: Anonymize; + "index": bigint; +}; +export type I9ed2klpttaegt = { + "network"?: Anonymize; + "key": FixedSizeBinary<20>; +}; +export type I15lht6t53odo4 = { + "length": number; + "data": FixedSizeBinary<32>; +}; +export type I518fbtnclg1oc = { + "id": XcmV3JunctionBodyId; + "part": XcmV2JunctionBodyPart; +}; +export type XcmV3JunctionBodyId = Enum<{ + "Unit": undefined; + "Moniker": FixedSizeBinary<4>; + "Index": number; + "Executive": undefined; + "Technical": undefined; + "Legislative": undefined; + "Judicial": undefined; + "Defense": undefined; + "Administration": undefined; + "Treasury": undefined; +}>; +export declare const XcmV3JunctionBodyId: GetEnum; +export type XcmV2JunctionBodyPart = Enum<{ + "Voice": undefined; + "Members": Anonymize; + "Fraction": Anonymize; + "AtLeastProportion": Anonymize; + "MoreThanProportion": Anonymize; +}>; +export declare const XcmV2JunctionBodyPart: GetEnum; +export type Iafscmv8tjf0ou = { + "count": number; +}; +export type Idif02efq16j92 = { + "nom": number; + "denom": number; +}; +export type Iam58b36i8f27i = FixedSizeArray<2, XcmV3Junction>; +export type Iegjh9cie771d8 = FixedSizeArray<3, XcmV3Junction>; +export type Iae5flu84s2oia = FixedSizeArray<4, XcmV3Junction>; +export type Iejq8c4n82a165 = FixedSizeArray<5, XcmV3Junction>; +export type I7rmt803vbpqrl = FixedSizeArray<6, XcmV3Junction>; +export type I7onfe2toh27f0 = FixedSizeArray<7, XcmV3Junction>; +export type I3vjadpg0k2omo = FixedSizeArray<8, XcmV3Junction>; +export type XcmV3MultiassetAssetId = Enum<{ + "Concrete": Anonymize; + "Abstract": FixedSizeBinary<32>; +}>; +export declare const XcmV3MultiassetAssetId: GetEnum; +export type Ieqft092b9kkr2 = { + "location": Anonymize; + "asset_id": Anonymize; +}; +export type DotXcmVersionedLocation = Enum<{ + "V2": Anonymize; + "V3": Anonymize; + "V4": Anonymize; +}>; +export declare const DotXcmVersionedLocation: GetEnum; +export type I4frqunb5hj2km = { + "parents": number; + "interior": XcmV2MultilocationJunctions; +}; +export type XcmV2MultilocationJunctions = Enum<{ + "Here": undefined; + "X1": XcmV2Junction; + "X2": Anonymize; + "X3": Anonymize; + "X4": Anonymize; + "X5": Anonymize; + "X6": Anonymize; + "X7": Anonymize; + "X8": Anonymize; +}>; +export declare const XcmV2MultilocationJunctions: GetEnum; +export type XcmV2Junction = Enum<{ + "Parachain": number; + "AccountId32": Anonymize; + "AccountIndex64": Anonymize; + "AccountKey20": Anonymize; + "PalletInstance": number; + "GeneralIndex": bigint; + "GeneralKey": Binary; + "OnlyChild": undefined; + "Plurality": Anonymize; +}>; +export declare const XcmV2Junction: GetEnum; +export type I6h60jropk90ne = { + "network": XcmV2NetworkId; + "id": FixedSizeBinary<32>; +}; +export type XcmV2NetworkId = Enum<{ + "Any": undefined; + "Named": Binary; + "Polkadot": undefined; + "Kusama": undefined; +}>; +export declare const XcmV2NetworkId: GetEnum; +export type I73mah5ooc6vk = { + "network": XcmV2NetworkId; + "index": bigint; +}; +export type I9kkjqh79doku3 = { + "network": XcmV2NetworkId; + "key": FixedSizeBinary<20>; +}; +export type Iaqhvfsgakjhdq = { + "id": XcmV2BodyId; + "part": XcmV2JunctionBodyPart; +}; +export type XcmV2BodyId = Enum<{ + "Unit": undefined; + "Named": Binary; + "Index": number; + "Executive": undefined; + "Technical": undefined; + "Legislative": undefined; + "Judicial": undefined; + "Defense": undefined; + "Administration": undefined; + "Treasury": undefined; +}>; +export declare const XcmV2BodyId: GetEnum; +export type I7tthuukjoks45 = FixedSizeArray<2, XcmV2Junction>; +export type Icpsqle8f7ccnh = FixedSizeArray<3, XcmV2Junction>; +export type Ifaduechfcq41r = FixedSizeArray<4, XcmV2Junction>; +export type Ifg30nsfqato4g = FixedSizeArray<5, XcmV2Junction>; +export type I8s2vh6qelslgu = FixedSizeArray<6, XcmV2Junction>; +export type I7r6q3396okion = FixedSizeArray<7, XcmV2Junction>; +export type I1d4fie0b78rtc = FixedSizeArray<8, XcmV2Junction>; +export type Iek7v4hrgnq6iv = { + "index": number; + "payment_id": bigint; +}; +export type ConvictionVotingEvent = Enum<{ + /** + *An account has delegated their vote to another account. \[who, target\] + */ + "Delegated": Anonymize; + /** + *An \[account\] has cancelled a previous delegation operation. + */ + "Undelegated": SS58String; +}>; +export declare const ConvictionVotingEvent: GetEnum; +export type I2na29tt2afp0j = FixedSizeArray<2, SS58String>; +export type Idfraa3b4eu018 = AnonymousEnum<{ + /** + *A referendum has been submitted. + */ + "Submitted": Anonymize; + /** + *The decision deposit has been placed. + */ + "DecisionDepositPlaced": Anonymize; + /** + *The decision deposit has been refunded. + */ + "DecisionDepositRefunded": Anonymize; + /** + *A deposit has been slashed. + */ + "DepositSlashed": Anonymize; + /** + *A referendum has moved into the deciding phase. + */ + "DecisionStarted": Anonymize; + "ConfirmStarted": Anonymize; + "ConfirmAborted": Anonymize; + /** + *A referendum has ended its confirmation phase and is ready for approval. + */ + "Confirmed": Anonymize; + /** + *A referendum has been approved and its proposal has been scheduled. + */ + "Approved": Anonymize; + /** + *A proposal has been rejected by referendum. + */ + "Rejected": Anonymize; + /** + *A referendum has been timed out without being decided. + */ + "TimedOut": Anonymize; + /** + *A referendum has been cancelled. + */ + "Cancelled": Anonymize; + /** + *A referendum has been killed. + */ + "Killed": Anonymize; + /** + *The submission deposit has been refunded. + */ + "SubmissionDepositRefunded": Anonymize; + /** + *Metadata for a referendum has been set. + */ + "MetadataSet": Anonymize; + /** + *Metadata for a referendum has been cleared. + */ + "MetadataCleared": Anonymize; +}>; +export type I229ijht536qdu = { + /** + *Index of the referendum. + */ + "index": number; + /** + *The track (and by extension proposal dispatch origin) of this referendum. + */ + "track": number; + /** + *The proposal for the referendum. + */ + "proposal": PreimagesBounded; +}; +export type PreimagesBounded = Enum<{ + "Legacy": Anonymize; + "Inline": Binary; + "Lookup": Anonymize; +}>; +export declare const PreimagesBounded: GetEnum; +export type Ieln2r0qa0hb4j = { + "hash": FixedSizeBinary<32>; + "len": number; +}; +export type I62nte77gksm0f = { + /** + *Index of the referendum. + */ + "index": number; + /** + *The account who placed the deposit. + */ + "who": SS58String; + /** + *The amount placed by the account. + */ + "amount": bigint; +}; +export type I9cg2delv92pvq = { + /** + *Index of the referendum. + */ + "index": number; + /** + *The track (and by extension proposal dispatch origin) of this referendum. + */ + "track": number; + /** + *The proposal for the referendum. + */ + "proposal": PreimagesBounded; + /** + *The current tally of votes in this referendum. + */ + "tally": Anonymize; +}; +export type Ifsk7cbmtit1jd = { + "ayes": bigint; + "nays": bigint; + "support": bigint; +}; +export type Ilhp45uime5tp = { + /** + *Index of the referendum. + */ + "index": number; + /** + *The final tally of votes in this referendum. + */ + "tally": Anonymize; +}; +export type I4f1hv034jf1dt = { + /** + *Index of the referendum. + */ + "index": number; + /** + *Preimage hash. + */ + "hash": FixedSizeBinary<32>; +}; +export type I49uspu4v8kcui = AnonymousEnum<{ + "CallWhitelisted": Anonymize; + "WhitelistedCallRemoved": Anonymize; + "WhitelistedCallDispatched": Anonymize; +}>; +export type I1adbcfi5uc62r = { + "call_hash": FixedSizeBinary<32>; +}; +export type Iabbkuinvp2njd = { + "call_hash": FixedSizeBinary<32>; + "result": Anonymize; +}; +export type I7mc367dhekj4 = ResultPayload, Anonymize>; +export type Ia1u1r3n74r13c = { + "actual_weight"?: Anonymize; + "pays_fee": Anonymize; +}; +export type Iasb8k6ash5mjn = (Anonymize) | undefined; +export type I8061u9efkhek9 = { + "post_info": Anonymize; + "error": Anonymize; +}; +export type In3t00aurfuda = AnonymousEnum<{ + /** + *A Parameter was set. + * + *Is also emitted when the value was not changed. + */ + "Updated": Anonymize; +}>; +export type I9f0v9ntn9g19p = { + /** + *The key that was updated. + */ + "key": Anonymize; + /** + *The old value before this call. + */ + "old_value"?: Anonymize; + /** + *The new value after this call. + */ + "new_value"?: Anonymize; +}; +export type I9h43amtitrqum = AnonymousEnum<{ + "Inflation": Anonymize; +}>; +export type I7rmm2emik7fsg = AnonymousEnum<{ + "MinInflation": undefined; + "MaxInflation": undefined; + "IdealStake": undefined; + "Falloff": undefined; + "UseAuctionSlots": undefined; +}>; +export type I6ul1np9r7bgmv = (Anonymize) | undefined; +export type I22o1tjs56dvi2 = AnonymousEnum<{ + "Inflation": Anonymize; +}>; +export type I69i3c3kkvltuj = AnonymousEnum<{ + "MinInflation": bigint; + "MaxInflation": bigint; + "IdealStake": bigint; + "Falloff": bigint; + "UseAuctionSlots": boolean; +}>; +export type CommonClaimsEvent = Enum<{ + /** + *Someone claimed some DOTs. + */ + "Claimed": Anonymize; +}>; +export declare const CommonClaimsEvent: GetEnum; +export type Ie3hcrrq6r18fs = { + "who": SS58String; + "ethereum_address": FixedSizeBinary<20>; + "amount": bigint; +}; +export type VestingEvent = Enum<{ + /** + *The amount vested has been updated. This could indicate a change in funds available. + *The balance given is the amount which is left unvested (and thus locked). + */ + "VestingUpdated": Anonymize; + /** + *An \[account\] has become fully vested. + */ + "VestingCompleted": Anonymize; +}>; +export declare const VestingEvent: GetEnum; +export type Ievr89968437gm = { + "account": SS58String; + "unvested": bigint; +}; +export type Ivn4fchlcfshh = AnonymousEnum<{ + /** + *Batch of dispatches did not complete fully. Index of first failing dispatch given, as + *well as the error. + */ + "BatchInterrupted": Anonymize; + /** + *Batch of dispatches completed fully with no error. + */ + "BatchCompleted": undefined; + /** + *Batch of dispatches completed but has errors. + */ + "BatchCompletedWithErrors": undefined; + /** + *A single item within a Batch of dispatches has completed with no error. + */ + "ItemCompleted": undefined; + /** + *A single item within a Batch of dispatches has completed with error. + */ + "ItemFailed": Anonymize; + /** + *A call was dispatched. + */ + "DispatchedAs": Anonymize; +}>; +export type I1a5gf4n0nqs72 = { + "index": number; + "error": Anonymize; +}; +export type I4t689jva3ns0s = { + "error": Anonymize; +}; +export type Ierrtqmdqhej88 = { + "result": Anonymize; +}; +export type I38492taogqhfn = AnonymousEnum<{ + /** + *A proxy was executed correctly, with the given. + */ + "ProxyExecuted": Anonymize; + /** + *A pure account has been created by new proxy with given + *disambiguation index and proxy type. + */ + "PureCreated": Anonymize; + /** + *An announcement was placed to make a call in the future. + */ + "Announced": Anonymize; + /** + *A proxy was added. + */ + "ProxyAdded": Anonymize; + /** + *A proxy was removed. + */ + "ProxyRemoved": Anonymize; +}>; +export type Ifqt0l2jtnansm = { + "pure": SS58String; + "who": SS58String; + "proxy_type": Anonymize; + "disambiguation_index": number; +}; +export type Ib9ifr8gu9ttks = AnonymousEnum<{ + "Any": undefined; + "NonTransfer": undefined; + "Governance": undefined; + "Staking": undefined; + "CancelProxy": undefined; + "Auction": undefined; + "NominationPools": undefined; +}>; +export type I2ur0oeqg495j8 = { + "real": SS58String; + "proxy": SS58String; + "call_hash": FixedSizeBinary<32>; +}; +export type Ib5do5c9nfeb64 = { + "delegator": SS58String; + "delegatee": SS58String; + "proxy_type": Anonymize; + "delay": number; +}; +export type Ie2ea4ticfr4gj = AnonymousEnum<{ + /** + *A new multisig operation has begun. + */ + "NewMultisig": Anonymize; + /** + *A multisig operation has been approved by someone. + */ + "MultisigApproval": Anonymize; + /** + *A multisig operation has been executed. + */ + "MultisigExecuted": Anonymize; + /** + *A multisig operation has been cancelled. + */ + "MultisigCancelled": Anonymize; +}>; +export type Iep27ialq4a7o7 = { + "approving": SS58String; + "multisig": SS58String; + "call_hash": FixedSizeBinary<32>; +}; +export type Iasu5jvoqr43mv = { + "approving": SS58String; + "timepoint": Anonymize; + "multisig": SS58String; + "call_hash": FixedSizeBinary<32>; +}; +export type Itvprrpb0nm3o = { + "height": number; + "index": number; +}; +export type Idpl8oj4a549ub = { + "approving": SS58String; + "timepoint": Anonymize; + "multisig": SS58String; + "call_hash": FixedSizeBinary<32>; + "result": Anonymize; +}; +export type I5qolde99acmd1 = { + "cancelling": SS58String; + "timepoint": Anonymize; + "multisig": SS58String; + "call_hash": FixedSizeBinary<32>; +}; +export type BountiesEvent = Enum<{ + /** + *New bounty proposal. + */ + "BountyProposed": Anonymize; + /** + *A bounty proposal was rejected; funds were slashed. + */ + "BountyRejected": Anonymize; + /** + *A bounty proposal is funded and became active. + */ + "BountyBecameActive": Anonymize; + /** + *A bounty is awarded to a beneficiary. + */ + "BountyAwarded": Anonymize; + /** + *A bounty is claimed by beneficiary. + */ + "BountyClaimed": Anonymize; + /** + *A bounty is cancelled. + */ + "BountyCanceled": Anonymize; + /** + *A bounty expiry is extended. + */ + "BountyExtended": Anonymize; + /** + *A bounty is approved. + */ + "BountyApproved": Anonymize; + /** + *A bounty curator is proposed. + */ + "CuratorProposed": Anonymize; + /** + *A bounty curator is unassigned. + */ + "CuratorUnassigned": Anonymize; + /** + *A bounty curator is accepted. + */ + "CuratorAccepted": Anonymize; +}>; +export declare const BountiesEvent: GetEnum; +export type Id9idaj83175f9 = { + "index": number; + "bond": bigint; +}; +export type Ie1semicfuv5uu = { + "index": number; + "beneficiary": SS58String; +}; +export type If25fjs9o37co1 = { + "index": number; + "payout": bigint; + "beneficiary": SS58String; +}; +export type I70sc1pdo8vtos = { + "bounty_id": number; + "curator": SS58String; +}; +export type Ia9p5bg6p18r0i = { + "bounty_id": number; +}; +export type ChildBountiesEvent = Enum<{ + /** + *A child-bounty is added. + */ + "Added": Anonymize; + /** + *A child-bounty is awarded to a beneficiary. + */ + "Awarded": Anonymize; + /** + *A child-bounty is claimed by beneficiary. + */ + "Claimed": Anonymize; + /** + *A child-bounty is cancelled. + */ + "Canceled": Anonymize; +}>; +export declare const ChildBountiesEvent: GetEnum; +export type I60p8l86a8cm59 = { + "index": number; + "child_index": number; +}; +export type I3m3sk2lgcabvp = { + "index": number; + "child_index": number; + "beneficiary": SS58String; +}; +export type I5pf572duh4oeg = { + "index": number; + "child_index": number; + "payout": bigint; + "beneficiary": SS58String; +}; +export type ElectionProviderMultiPhaseEvent = Enum<{ + /** + *A solution was stored with the given compute. + * + *The `origin` indicates the origin of the solution. If `origin` is `Some(AccountId)`, + *the stored solution was submitted in the signed phase by a miner with the `AccountId`. + *Otherwise, the solution was stored either during the unsigned phase or by + *`T::ForceOrigin`. The `bool` is `true` when a previous solution was ejected to make + *room for this one. + */ + "SolutionStored": Anonymize; + /** + *The election has been finalized, with the given computation and score. + */ + "ElectionFinalized": Anonymize; + /** + *An election failed. + * + *Not much can be said about which computes failed in the process. + */ + "ElectionFailed": undefined; + /** + *An account has been rewarded for their signed submission being finalized. + */ + "Rewarded": Anonymize; + /** + *An account has been slashed for submitting an invalid signed submission. + */ + "Slashed": Anonymize; + /** + *There was a phase transition in a given round. + */ + "PhaseTransitioned": Anonymize; +}>; +export declare const ElectionProviderMultiPhaseEvent: GetEnum; +export type I4mol6k10mv0io = { + "compute": ElectionProviderMultiPhaseElectionCompute; + "origin"?: Anonymize; + "prev_ejected": boolean; +}; +export type ElectionProviderMultiPhaseElectionCompute = Enum<{ + "OnChain": undefined; + "Signed": undefined; + "Unsigned": undefined; + "Fallback": undefined; + "Emergency": undefined; +}>; +export declare const ElectionProviderMultiPhaseElectionCompute: GetEnum; +export type Ihfphjolmsqq1 = (SS58String) | undefined; +export type Iec90vukseit9e = { + "compute": ElectionProviderMultiPhaseElectionCompute; + "score": Anonymize; +}; +export type I8s6n43okuj2b1 = { + "minimal_stake": bigint; + "sum_stake": bigint; + "sum_stake_squared": bigint; +}; +export type I7j4m7a3pkvsf4 = { + "account": SS58String; + "value": bigint; +}; +export type Ic2n50kpnu5mae = { + "from": ElectionProviderMultiPhasePhase; + "to": ElectionProviderMultiPhasePhase; + "round": number; +}; +export type ElectionProviderMultiPhasePhase = Enum<{ + "Off": undefined; + "Signed": undefined; + "Unsigned": Anonymize; + "Emergency": undefined; +}>; +export declare const ElectionProviderMultiPhasePhase: GetEnum; +export type I38fu9hj3b9un7 = [boolean, number]; +export type BagsListEvent = Enum<{ + /** + *Moved an account from one bag to another. + */ + "Rebagged": Anonymize; + /** + *Updated the score of some account to the given amount. + */ + "ScoreUpdated": Anonymize; +}>; +export declare const BagsListEvent: GetEnum; +export type I37454vatvmm1l = { + "who": SS58String; + "from": bigint; + "to": bigint; +}; +export type Iblau1qa7u7fet = { + "who": SS58String; + "new_score": bigint; +}; +export type NominationPoolsEvent = Enum<{ + /** + *A pool has been created. + */ + "Created": Anonymize; + /** + *A member has became bonded in a pool. + */ + "Bonded": Anonymize; + /** + *A payout has been made to a member. + */ + "PaidOut": Anonymize; + /** + *A member has unbonded from their pool. + * + *- `balance` is the corresponding balance of the number of points that has been + * requested to be unbonded (the argument of the `unbond` transaction) from the bonded + * pool. + *- `points` is the number of points that are issued as a result of `balance` being + *dissolved into the corresponding unbonding pool. + *- `era` is the era in which the balance will be unbonded. + *In the absence of slashing, these values will match. In the presence of slashing, the + *number of points that are issued in the unbonding pool will be less than the amount + *requested to be unbonded. + */ + "Unbonded": Anonymize; + /** + *A member has withdrawn from their pool. + * + *The given number of `points` have been dissolved in return of `balance`. + * + *Similar to `Unbonded` event, in the absence of slashing, the ratio of point to balance + *will be 1. + */ + "Withdrawn": Anonymize; + /** + *A pool has been destroyed. + */ + "Destroyed": Anonymize; + /** + *The state of a pool has changed + */ + "StateChanged": Anonymize; + /** + *A member has been removed from a pool. + * + *The removal can be voluntary (withdrawn all unbonded funds) or involuntary (kicked). + */ + "MemberRemoved": Anonymize; + /** + *The roles of a pool have been updated to the given new roles. Note that the depositor + *can never change. + */ + "RolesUpdated": Anonymize; + /** + *The active balance of pool `pool_id` has been slashed to `balance`. + */ + "PoolSlashed": Anonymize; + /** + *The unbond pool at `era` of pool `pool_id` has been slashed to `balance`. + */ + "UnbondingPoolSlashed": Anonymize; + /** + *A pool's commission setting has been changed. + */ + "PoolCommissionUpdated": Anonymize; + /** + *A pool's maximum commission setting has been changed. + */ + "PoolMaxCommissionUpdated": Anonymize; + /** + *A pool's commission `change_rate` has been changed. + */ + "PoolCommissionChangeRateUpdated": Anonymize; + /** + *Pool commission claim permission has been updated. + */ + "PoolCommissionClaimPermissionUpdated": Anonymize; + /** + *Pool commission has been claimed. + */ + "PoolCommissionClaimed": Anonymize; + /** + *Topped up deficit in frozen ED of the reward pool. + */ + "MinBalanceDeficitAdjusted": Anonymize; + /** + *Claimed excess frozen ED of af the reward pool. + */ + "MinBalanceExcessAdjusted": Anonymize; +}>; +export declare const NominationPoolsEvent: GetEnum; +export type I1ti389kf8t6oi = { + "depositor": SS58String; + "pool_id": number; +}; +export type If4nnre373amul = { + "member": SS58String; + "pool_id": number; + "bonded": bigint; + "joined": boolean; +}; +export type I55kbor0ocqk6h = { + "member": SS58String; + "pool_id": number; + "payout": bigint; +}; +export type Idsj9cg7j96kpc = { + "member": SS58String; + "pool_id": number; + "balance": bigint; + "points": bigint; + "era": number; +}; +export type Ido4u9drncfaml = { + "member": SS58String; + "pool_id": number; + "balance": bigint; + "points": bigint; +}; +export type I931cottvong90 = { + "pool_id": number; +}; +export type Ie8c7ctks8ur2p = { + "pool_id": number; + "new_state": NominationPoolsPoolState; +}; +export type NominationPoolsPoolState = Enum<{ + "Open": undefined; + "Blocked": undefined; + "Destroying": undefined; +}>; +export declare const NominationPoolsPoolState: GetEnum; +export type I7vqogd77mmdlm = { + "pool_id": number; + "member": SS58String; +}; +export type I6mik29s5073td = { + "root"?: Anonymize; + "bouncer"?: Anonymize; + "nominator"?: Anonymize; +}; +export type I2m0sqmb75cnpb = { + "pool_id": number; + "balance": bigint; +}; +export type I49agc5b62mehu = { + "pool_id": number; + "era": number; + "balance": bigint; +}; +export type Iatq9jda4hq6pg = { + "pool_id": number; + "current"?: Anonymize; +}; +export type Ie8iutm7u02lmj = (Anonymize) | undefined; +export type I7svnfko10tq2e = [number, SS58String]; +export type I8cbluptqo8kbp = { + "pool_id": number; + "max_commission": number; +}; +export type I81cc4plffa1dm = { + "pool_id": number; + "change_rate": Anonymize; +}; +export type Ibqul338t9c1ll = { + "max_increase": number; + "min_delay": number; +}; +export type I3ihan8icf0c5k = { + "pool_id": number; + "permission"?: Anonymize; +}; +export type I16m1kn78dee7v = (NominationPoolsCommissionClaimPermission) | undefined; +export type NominationPoolsCommissionClaimPermission = Enum<{ + "Permissionless": undefined; + "Account": SS58String; +}>; +export declare const NominationPoolsCommissionClaimPermission: GetEnum; +export type I2g87evcjlgmqi = { + "pool_id": number; + "commission": bigint; +}; +export type Ieg1oc56mamrl5 = { + "pool_id": number; + "amount": bigint; +}; +export type Ibku5mrlj7cn0g = AnonymousEnum<{ + /** + *A staker was unstaked. + */ + "Unstaked": Anonymize; + /** + *A staker was slashed for requesting fast-unstake whilst being exposed. + */ + "Slashed": Anonymize; + /** + *A batch was partially checked for the given eras, but the process did not finish. + */ + "BatchChecked": Anonymize; + /** + *A batch of a given size was terminated. + * + *This is always follows by a number of `Unstaked` or `Slashed` events, marking the end + *of the batch. A new batch will be created upon next block. + */ + "BatchFinished": Anonymize; + /** + *An internal error happened. Operations will be paused now. + */ + "InternalError": undefined; +}>; +export type I4nceha17l8sr8 = { + "stash": SS58String; + "result": Anonymize; +}; +export type Ic0he9tlf9ll0u = { + "eras": Anonymize; +}; +export type Icgljjb6j82uhn = Array; +export type ParachainsInclusionEvent = Enum<{ + /** + *A candidate was backed. `[candidate, head_data]` + */ + "CandidateBacked": Anonymize; + /** + *A candidate was included. `[candidate, head_data]` + */ + "CandidateIncluded": Anonymize; + /** + *A candidate timed out. `[candidate, head_data]` + */ + "CandidateTimedOut": Anonymize; + /** + *Some upward messages have been received and will be processed. + */ + "UpwardMessagesReceived": Anonymize; +}>; +export declare const ParachainsInclusionEvent: GetEnum; +export type Icdu1nb48l753j = [Anonymize, Binary, number, number]; +export type I9o5v7cmfi9c85 = { + "descriptor": Anonymize; + "commitments_hash": FixedSizeBinary<32>; +}; +export type Ic7r865c0luc3k = { + "para_id": number; + "relay_parent": FixedSizeBinary<32>; + "collator": FixedSizeBinary<32>; + "persisted_validation_data_hash": FixedSizeBinary<32>; + "pov_hash": FixedSizeBinary<32>; + "erasure_root": FixedSizeBinary<32>; + "signature": FixedSizeBinary<64>; + "para_head": FixedSizeBinary<32>; + "validation_code_hash": FixedSizeBinary<32>; +}; +export type I618m2uag0aopg = [Anonymize, Binary, number]; +export type Ic8i89mfkmn3n7 = { + "from": number; + "count": number; +}; +export type ParachainsParasEvent = Enum<{ + /** + *Current code has been updated for a Para. `para_id` + */ + "CurrentCodeUpdated": number; + /** + *Current head has been updated for a Para. `para_id` + */ + "CurrentHeadUpdated": number; + /** + *A code upgrade has been scheduled for a Para. `para_id` + */ + "CodeUpgradeScheduled": number; + /** + *A new head has been noted for a Para. `para_id` + */ + "NewHeadNoted": number; + /** + *A para has been queued to execute pending actions. `para_id` + */ + "ActionQueued": Anonymize; + /** + *The given para either initiated or subscribed to a PVF check for the given validation + *code. `code_hash` `para_id` + */ + "PvfCheckStarted": Anonymize; + /** + *The given validation code was accepted by the PVF pre-checking vote. + *`code_hash` `para_id` + */ + "PvfCheckAccepted": Anonymize; + /** + *The given validation code was rejected by the PVF pre-checking vote. + *`code_hash` `para_id` + */ + "PvfCheckRejected": Anonymize; +}>; +export declare const ParachainsParasEvent: GetEnum; +export type I4pact7n2e9a0i = [FixedSizeBinary<32>, number]; +export type ParachainsHrmpEvent = Enum<{ + /** + *Open HRMP channel requested. + */ + "OpenChannelRequested": Anonymize; + /** + *An HRMP channel request sent by the receiver was canceled by either party. + */ + "OpenChannelCanceled": Anonymize; + /** + *Open HRMP channel accepted. + */ + "OpenChannelAccepted": Anonymize; + /** + *HRMP channel closed. + */ + "ChannelClosed": Anonymize; + /** + *An HRMP channel was opened via Root origin. + */ + "HrmpChannelForceOpened": Anonymize; + /** + *An HRMP channel was opened with a system chain. + */ + "HrmpSystemChannelOpened": Anonymize; + /** + *An HRMP channel's deposits were updated. + */ + "OpenChannelDepositsUpdated": Anonymize; +}>; +export declare const ParachainsHrmpEvent: GetEnum; +export type Id2bej717ckub0 = { + "sender": number; + "recipient": number; + "proposed_max_capacity": number; + "proposed_max_message_size": number; +}; +export type I545vo2e86o5i4 = { + "by_parachain": number; + "channel_id": Anonymize; +}; +export type I50mrcbubp554e = { + "sender": number; + "recipient": number; +}; +export type ParachainsDisputesEvent = Enum<{ + /** + *A dispute has been initiated. \[candidate hash, dispute location\] + */ + "DisputeInitiated": Anonymize; + /** + *A dispute has concluded for or against a candidate. + *`\[para id, candidate hash, dispute result\]` + */ + "DisputeConcluded": Anonymize; + /** + *A dispute has concluded with supermajority against a candidate. + *Block authors should no longer build on top of this head and should + *instead revert the block at the given height. This should be the + *number of the child of the last known valid block in the chain. + */ + "Revert": number; +}>; +export declare const ParachainsDisputesEvent: GetEnum; +export type I3i09nus3ku37s = [FixedSizeBinary<32>, ParachainsDisputeLocation]; +export type ParachainsDisputeLocation = Enum<{ + "Local": undefined; + "Remote": undefined; +}>; +export declare const ParachainsDisputeLocation: GetEnum; +export type I2e447aa6a0imh = [FixedSizeBinary<32>, ParachainsDisputeResult]; +export type ParachainsDisputeResult = Enum<{ + "Valid": undefined; + "Invalid": undefined; +}>; +export declare const ParachainsDisputeResult: GetEnum; +export type Icuu6jjue8o6eb = AnonymousEnum<{ + /** + *An order was placed at some spot price amount by orderer ordered_by + */ + "OnDemandOrderPlaced": Anonymize; + /** + *The value of the spot price has likely changed + */ + "SpotPriceSet": Anonymize; +}>; +export type I82n7gg49bvucn = { + "para_id": number; + "spot_price": bigint; + "ordered_by": SS58String; +}; +export type I58qkru548f7dl = { + "spot_price": bigint; +}; +export type CommonParasRegistrarEvent = Enum<{ + "Registered": Anonymize; + "Deregistered": Anonymize; + "Reserved": Anonymize; + "Swapped": Anonymize; +}>; +export declare const CommonParasRegistrarEvent: GetEnum; +export type Ibs22tt76qp5bi = { + "para_id": number; + "manager": SS58String; +}; +export type I37r4bdai8o9mp = { + "para_id": number; +}; +export type Idn2ghub1o4i40 = { + "para_id": number; + "who": SS58String; +}; +export type I48u78djt89dod = { + "para_id": number; + "other_id": number; +}; +export type CommonSlotsEvent = Enum<{ + /** + *A new `[lease_period]` is beginning. + */ + "NewLeasePeriod": Anonymize; + /** + *A para has won the right to a continuous set of lease periods as a parachain. + *First balance is any extra amount reserved on top of the para's existing deposit. + *Second balance is the total amount reserved. + */ + "Leased": Anonymize; +}>; +export declare const CommonSlotsEvent: GetEnum; +export type Ib85m5kfbepu2t = { + "lease_period": number; +}; +export type Idaml5bdhsfcsl = { + "para_id": number; + "leaser": SS58String; + "period_begin": number; + "period_count": number; + "extra_reserved": bigint; + "total_amount": bigint; +}; +export type CommonAuctionsEvent = Enum<{ + /** + *An auction started. Provides its index and the block number where it will begin to + *close and the first lease period of the quadruplet that is auctioned. + */ + "AuctionStarted": Anonymize; + /** + *An auction ended. All funds become unreserved. + */ + "AuctionClosed": Anonymize; + /** + *Funds were reserved for a winning bid. First balance is the extra amount reserved. + *Second is the total. + */ + "Reserved": Anonymize; + /** + *Funds were unreserved since bidder is no longer active. `[bidder, amount]` + */ + "Unreserved": Anonymize; + /** + *Someone attempted to lease the same slot twice for a parachain. The amount is held in + *reserve but no parachain slot has been leased. + */ + "ReserveConfiscated": Anonymize; + /** + *A new bid has been accepted as the current winner. + */ + "BidAccepted": Anonymize; + /** + *The winning offset was chosen for an auction. This will map into the `Winning` storage + *map. + */ + "WinningOffset": Anonymize; +}>; +export declare const CommonAuctionsEvent: GetEnum; +export type Ieec0cu336gteb = { + "auction_index": number; + "lease_period": number; + "ending": number; +}; +export type I815d5k4ij85nv = { + "auction_index": number; +}; +export type Ifi98fgi9o46v7 = { + "bidder": SS58String; + "extra_reserved": bigint; + "total_amount": bigint; +}; +export type Ic0oj9tok33uap = { + "bidder": SS58String; + "amount": bigint; +}; +export type I3tdutpfjuk32j = { + "para_id": number; + "leaser": SS58String; + "amount": bigint; +}; +export type I1esdujrkdacpb = { + "bidder": SS58String; + "para_id": number; + "amount": bigint; + "first_slot": number; + "last_slot": number; +}; +export type I9g1d820jf9m2s = { + "auction_index": number; + "block_number": number; +}; +export type I14ffo4b61a2g3 = AnonymousEnum<{ + /** + *Create a new crowdloaning campaign. + */ + "Created": Anonymize; + /** + *Contributed to a crowd sale. + */ + "Contributed": Anonymize; + /** + *Withdrew full balance of a contributor. + */ + "Withdrew": Anonymize; + /** + *The loans in a fund have been partially dissolved, i.e. there are some left + *over child keys that still need to be killed. + */ + "PartiallyRefunded": Anonymize; + /** + *All loans in a fund have been refunded. + */ + "AllRefunded": Anonymize; + /** + *Fund is dissolved. + */ + "Dissolved": Anonymize; + /** + *The result of trying to submit a new bid to the Slots pallet. + */ + "HandleBidResult": Anonymize; + /** + *The configuration to a crowdloan has been edited. + */ + "Edited": Anonymize; + /** + *A memo has been updated. + */ + "MemoUpdated": Anonymize; + /** + *A parachain has been moved to `NewRaise` + */ + "AddedToNewRaise": Anonymize; +}>; +export type I8ve4g3egaln6a = { + "who": SS58String; + "fund_index": number; + "amount": bigint; +}; +export type Idbrt7si4i461v = { + "para_id": number; + "result": Anonymize; +}; +export type If4hvqaeoqq5us = { + "who": SS58String; + "para_id": number; + "memo": Binary; +}; +export type PolkadotRuntimeParachainsCoretimeEvent = Enum<{ + /** + *The broker chain has asked for revenue information for a specific block. + */ + "RevenueInfoRequested": Anonymize; + /** + *A core has received a new assignment from the broker chain. + */ + "CoreAssigned": Anonymize; +}>; +export declare const PolkadotRuntimeParachainsCoretimeEvent: GetEnum; +export type Ibtsa3docbr9el = { + "when": number; +}; +export type Iaiqv5prlisjkg = { + "core": number; +}; +export type I61dksvl51aujo = AnonymousEnum<{ + /** + *Given number of `(top, child)` keys were migrated respectively, with the given + *`compute`. + */ + "Migrated": Anonymize; + /** + *Some account got slashed by the given amount. + */ + "Slashed": Anonymize; + /** + *The auto migration task finished. + */ + "AutoMigrationFinished": undefined; + /** + *Migration got halted due to an error or miss-configuration. + */ + "Halted": Anonymize; +}>; +export type Iagqcb06kbevb1 = { + "top": number; + "child": number; + "compute": Anonymize; +}; +export type I85ah77hcf4cpl = AnonymousEnum<{ + "Signed": undefined; + "Auto": undefined; +}>; +export type Iec8defeh924b6 = { + "error": Anonymize; +}; +export type I5ce1ru810vv9d = AnonymousEnum<{ + /** + *Execution of an XCM message was attempted. + */ + "Attempted": Anonymize; + /** + *A XCM message was sent. + */ + "Sent": Anonymize; + /** + *Query response received which does not match a registered query. This may be because a + *matching query was never registered, it may be because it is a duplicate response, or + *because the query timed out. + */ + "UnexpectedResponse": Anonymize; + /** + *Query response has been received and is ready for taking with `take_response`. There is + *no registered notification call. + */ + "ResponseReady": Anonymize; + /** + *Query response has been received and query is removed. The registered notification has + *been dispatched and executed successfully. + */ + "Notified": Anonymize; + /** + *Query response has been received and query is removed. The registered notification + *could not be dispatched because the dispatch weight is greater than the maximum weight + *originally budgeted by this runtime for the query result. + */ + "NotifyOverweight": Anonymize; + /** + *Query response has been received and query is removed. There was a general error with + *dispatching the notification call. + */ + "NotifyDispatchError": Anonymize; + /** + *Query response has been received and query is removed. The dispatch was unable to be + *decoded into a `Call`; this might be due to dispatch function having a signature which + *is not `(origin, QueryId, Response)`. + */ + "NotifyDecodeFailed": Anonymize; + /** + *Expected query response has been received but the origin location of the response does + *not match that expected. The query remains registered for a later, valid, response to + *be received and acted upon. + */ + "InvalidResponder": Anonymize; + /** + *Expected query response has been received but the expected origin location placed in + *storage by this runtime previously cannot be decoded. The query remains registered. + * + *This is unexpected (since a location placed in storage in a previously executing + *runtime should be readable prior to query timeout) and dangerous since the possibly + *valid response will be dropped. Manual governance intervention is probably going to be + *needed. + */ + "InvalidResponderVersion": Anonymize; + /** + *Received query response has been read and removed. + */ + "ResponseTaken": Anonymize; + /** + *Some assets have been placed in an asset trap. + */ + "AssetsTrapped": Anonymize; + /** + *An XCM version change notification message has been attempted to be sent. + * + *The cost of sending it (borne by the chain) is included. + */ + "VersionChangeNotified": Anonymize; + /** + *The supported version of a location has been changed. This might be through an + *automatic notification or a manual intervention. + */ + "SupportedVersionChanged": Anonymize; + /** + *A given location which had a version change subscription was dropped owing to an error + *sending the notification to it. + */ + "NotifyTargetSendFail": Anonymize; + /** + *A given location which had a version change subscription was dropped owing to an error + *migrating the location to our new XCM format. + */ + "NotifyTargetMigrationFail": Anonymize; + /** + *Expected query response has been received but the expected querier location placed in + *storage by this runtime previously cannot be decoded. The query remains registered. + * + *This is unexpected (since a location placed in storage in a previously executing + *runtime should be readable prior to query timeout) and dangerous since the possibly + *valid response will be dropped. Manual governance intervention is probably going to be + *needed. + */ + "InvalidQuerierVersion": Anonymize; + /** + *Expected query response has been received but the querier location of the response does + *not match the expected. The query remains registered for a later, valid, response to + *be received and acted upon. + */ + "InvalidQuerier": Anonymize; + /** + *A remote has requested XCM version change notification from us and we have honored it. + *A version information message is sent to them and its cost is included. + */ + "VersionNotifyStarted": Anonymize; + /** + *We have requested that a remote chain send us XCM version change notifications. + */ + "VersionNotifyRequested": Anonymize; + /** + *We have requested that a remote chain stops sending us XCM version change + *notifications. + */ + "VersionNotifyUnrequested": Anonymize; + /** + *Fees were paid from a location for an operation (often for using `SendXcm`). + */ + "FeesPaid": Anonymize; + /** + *Some assets have been claimed from an asset trap + */ + "AssetsClaimed": Anonymize; + /** + *A XCM version migration finished. + */ + "VersionMigrationFinished": Anonymize; +}>; +export type I2aatv5i0cb96a = { + "outcome": XcmV4TraitsOutcome; +}; +export type XcmV4TraitsOutcome = Enum<{ + "Complete": Anonymize; + "Incomplete": Anonymize; + "Error": Anonymize; +}>; +export declare const XcmV4TraitsOutcome: GetEnum; +export type I30iff2d192eu7 = { + "used": Anonymize; +}; +export type I3q41clmllcihh = { + "used": Anonymize; + "error": XcmV3TraitsError; +}; +export type XcmV3TraitsError = Enum<{ + "Overflow": undefined; + "Unimplemented": undefined; + "UntrustedReserveLocation": undefined; + "UntrustedTeleportLocation": undefined; + "LocationFull": undefined; + "LocationNotInvertible": undefined; + "BadOrigin": undefined; + "InvalidLocation": undefined; + "AssetNotFound": undefined; + "FailedToTransactAsset": undefined; + "NotWithdrawable": undefined; + "LocationCannotHold": undefined; + "ExceedsMaxMessageSize": undefined; + "DestinationUnsupported": undefined; + "Transport": undefined; + "Unroutable": undefined; + "UnknownClaim": undefined; + "FailedToDecode": undefined; + "MaxWeightInvalid": undefined; + "NotHoldingFees": undefined; + "TooExpensive": undefined; + "Trap": bigint; + "ExpectationFalse": undefined; + "PalletNotFound": undefined; + "NameMismatch": undefined; + "VersionIncompatible": undefined; + "HoldingWouldOverflow": undefined; + "ExportError": undefined; + "ReanchorFailed": undefined; + "NoDeal": undefined; + "FeesNotMet": undefined; + "LockError": undefined; + "NoPermission": undefined; + "Unanchored": undefined; + "NotDepositable": undefined; + "UnhandledXcmVersion": undefined; + "WeightLimitReached": Anonymize; + "Barrier": undefined; + "WeightNotComputable": undefined; + "ExceedsStackLimit": undefined; +}>; +export declare const XcmV3TraitsError: GetEnum; +export type I1n56hooghntl2 = { + "error": XcmV3TraitsError; +}; +export type Ib9msr5sr8t3dn = { + "origin": Anonymize; + "destination": Anonymize; + "message": Anonymize; + "message_id": FixedSizeBinary<32>; +}; +export type Iegrepoo0c1jc5 = Array; +export type XcmV4Instruction = Enum<{ + "WithdrawAsset": Anonymize; + "ReserveAssetDeposited": Anonymize; + "ReceiveTeleportedAsset": Anonymize; + "QueryResponse": Anonymize; + "TransferAsset": Anonymize; + "TransferReserveAsset": Anonymize; + "Transact": Anonymize; + "HrmpNewChannelOpenRequest": Anonymize; + "HrmpChannelAccepted": Anonymize; + "HrmpChannelClosing": Anonymize; + "ClearOrigin": undefined; + "DescendOrigin": XcmV3Junctions; + "ReportError": Anonymize; + "DepositAsset": Anonymize; + "DepositReserveAsset": Anonymize; + "ExchangeAsset": Anonymize; + "InitiateReserveWithdraw": Anonymize; + "InitiateTeleport": Anonymize; + "ReportHolding": Anonymize; + "BuyExecution": Anonymize; + "RefundSurplus": undefined; + "SetErrorHandler": Anonymize; + "SetAppendix": Anonymize; + "ClearError": undefined; + "ClaimAsset": Anonymize; + "Trap": bigint; + "SubscribeVersion": Anonymize; + "UnsubscribeVersion": undefined; + "BurnAsset": Anonymize; + "ExpectAsset": Anonymize; + "ExpectOrigin"?: Anonymize; + "ExpectError"?: Anonymize; + "ExpectTransactStatus": XcmV3MaybeErrorCode; + "QueryPallet": Anonymize; + "ExpectPallet": Anonymize; + "ReportTransactStatus": Anonymize; + "ClearTransactStatus": undefined; + "UniversalOrigin": XcmV3Junction; + "ExportMessage": Anonymize; + "LockAsset": Anonymize; + "UnlockAsset": Anonymize; + "NoteUnlockable": Anonymize; + "RequestUnlock": Anonymize; + "SetFeesMode": Anonymize; + "SetTopic": FixedSizeBinary<32>; + "ClearTopic": undefined; + "AliasOrigin": Anonymize; + "UnpaidExecution": Anonymize; +}>; +export declare const XcmV4Instruction: GetEnum; +export type I50mli3hb64f9b = Array>; +export type Ia5l7mu5a6v49o = { + "id": Anonymize; + "fun": XcmV3MultiassetFungibility; +}; +export type XcmV3MultiassetFungibility = Enum<{ + "Fungible": bigint; + "NonFungible": XcmV3MultiassetAssetInstance; +}>; +export declare const XcmV3MultiassetFungibility: GetEnum; +export type XcmV3MultiassetAssetInstance = Enum<{ + "Undefined": undefined; + "Index": bigint; + "Array4": FixedSizeBinary<4>; + "Array8": FixedSizeBinary<8>; + "Array16": FixedSizeBinary<16>; + "Array32": FixedSizeBinary<32>; +}>; +export declare const XcmV3MultiassetAssetInstance: GetEnum; +export type I9o9uda3nddbna = { + "query_id": bigint; + "response": XcmV4Response; + "max_weight": Anonymize; + "querier"?: Anonymize; +}; +export type XcmV4Response = Enum<{ + "Null": undefined; + "Assets": Anonymize; + "ExecutionResult"?: Anonymize; + "Version": number; + "PalletsInfo": Anonymize; + "DispatchResult": XcmV3MaybeErrorCode; +}>; +export declare const XcmV4Response: GetEnum; +export type I7sltvf8v2nure = (Anonymize) | undefined; +export type Id8ide743umavp = [number, XcmV3TraitsError]; +export type I599u7h20b52at = Array>; +export type Ift5r9b1bvoh16 = { + "index": number; + "name": Binary; + "module_name": Binary; + "major": number; + "minor": number; + "patch": number; +}; +export type XcmV3MaybeErrorCode = Enum<{ + "Success": undefined; + "Error": Binary; + "TruncatedError": Binary; +}>; +export declare const XcmV3MaybeErrorCode: GetEnum; +export type Ia9cgf4r40b26h = (Anonymize) | undefined; +export type I7s0ar727m8n1j = { + "assets": Anonymize; + "beneficiary": Anonymize; +}; +export type I5bepfv83t9cg7 = { + "assets": Anonymize; + "dest": Anonymize; + "xcm": Anonymize; +}; +export type I92p6l5cs3fr50 = { + "origin_kind": XcmV2OriginKind; + "require_weight_at_most": Anonymize; + "call": Binary; +}; +export type XcmV2OriginKind = Enum<{ + "Native": undefined; + "SovereignAccount": undefined; + "Superuser": undefined; + "Xcm": undefined; +}>; +export declare const XcmV2OriginKind: GetEnum; +export type I5uhhrjqfuo4e5 = { + "sender": number; + "max_message_size": number; + "max_capacity": number; +}; +export type Ifij4jam0o7sub = { + "recipient": number; +}; +export type Ieeb4svd9i8fji = { + "initiator": number; + "sender": number; + "recipient": number; +}; +export type I4r3v6e91d1qbs = { + "destination": Anonymize; + "query_id": bigint; + "max_weight": Anonymize; +}; +export type Idbqvv6kvph2qq = { + "assets": XcmV4AssetAssetFilter; + "beneficiary": Anonymize; +}; +export type XcmV4AssetAssetFilter = Enum<{ + "Definite": Anonymize; + "Wild": XcmV4AssetWildAsset; +}>; +export declare const XcmV4AssetAssetFilter: GetEnum; +export type XcmV4AssetWildAsset = Enum<{ + "All": undefined; + "AllOf": Anonymize; + "AllCounted": number; + "AllOfCounted": Anonymize; +}>; +export declare const XcmV4AssetWildAsset: GetEnum; +export type I9k109i13ivgac = { + "id": Anonymize; + "fun": XcmV2MultiassetWildFungibility; +}; +export type XcmV2MultiassetWildFungibility = Enum<{ + "Fungible": undefined; + "NonFungible": undefined; +}>; +export declare const XcmV2MultiassetWildFungibility: GetEnum; +export type Iano6fp1hcf6vu = { + "id": Anonymize; + "fun": XcmV2MultiassetWildFungibility; + "count": number; +}; +export type I6epv2jfejmsps = { + "assets": XcmV4AssetAssetFilter; + "dest": Anonymize; + "xcm": Anonymize; +}; +export type Ifunmnuvdqirrm = { + "give": XcmV4AssetAssetFilter; + "want": Anonymize; + "maximal": boolean; +}; +export type Id1994sd13a1fk = { + "assets": XcmV4AssetAssetFilter; + "reserve": Anonymize; + "xcm": Anonymize; +}; +export type I53nvbjei7ovcg = { + "response_info": Anonymize; + "assets": XcmV4AssetAssetFilter; +}; +export type I60dnk6pb13k6r = { + "fees": Anonymize; + "weight_limit": XcmV3WeightLimit; +}; +export type XcmV3WeightLimit = Enum<{ + "Unlimited": undefined; + "Limited": Anonymize; +}>; +export declare const XcmV3WeightLimit: GetEnum; +export type I39e2979fh1sq0 = { + "assets": Anonymize; + "ticket": Anonymize; +}; +export type Ieprdqqu7ildvr = { + "query_id": bigint; + "max_response_weight": Anonymize; +}; +export type Iba5bdbapp16oo = { + "module_name": Binary; + "response_info": Anonymize; +}; +export type Id7mf37dkpgfjs = { + "index": number; + "name": Binary; + "module_name": Binary; + "crate_major": number; + "min_crate_minor": number; +}; +export type Idjv4c30koq53t = { + "network": XcmV3JunctionNetworkId; + "destination": XcmV3Junctions; + "xcm": Anonymize; +}; +export type Ic2kq28flu5j2f = { + "asset": Anonymize; + "unlocker": Anonymize; +}; +export type I63d4j1l5gkla3 = { + "asset": Anonymize; + "target": Anonymize; +}; +export type Ibs79g4hs4qcqq = { + "asset": Anonymize; + "owner": Anonymize; +}; +export type Ifv72gq013neli = { + "asset": Anonymize; + "locker": Anonymize; +}; +export type I4nae9rsql8fa7 = { + "jit_withdraw": boolean; +}; +export type I40d50jeai33oq = { + "weight_limit": XcmV3WeightLimit; + "check_origin"?: Anonymize; +}; +export type I3le5tr7ugg6l2 = { + "origin": Anonymize; + "query_id": bigint; +}; +export type I3iun9sig164po = { + "query_id": bigint; + "response": XcmV4Response; +}; +export type I2uqmls7kcdnii = { + "query_id": bigint; + "pallet_index": number; + "call_index": number; +}; +export type Idg69klialbkb8 = { + "query_id": bigint; + "pallet_index": number; + "call_index": number; + "actual_weight": Anonymize; + "max_budgeted_weight": Anonymize; +}; +export type I13jboebjcbglr = { + "origin": Anonymize; + "query_id": bigint; + "expected_location"?: Anonymize; +}; +export type I30pg328m00nr3 = { + "query_id": bigint; +}; +export type I381dkhrurdhrs = { + "hash": FixedSizeBinary<32>; + "origin": Anonymize; + "assets": DotXcmVersionedAssets; +}; +export type DotXcmVersionedAssets = Enum<{ + "V2": Anonymize; + "V3": Anonymize; + "V4": Anonymize; +}>; +export declare const DotXcmVersionedAssets: GetEnum; +export type I2sllmucln1iic = Array>; +export type Id8h647t880l31 = { + "id": XcmV2MultiassetAssetId; + "fun": XcmV2MultiassetFungibility; +}; +export type XcmV2MultiassetAssetId = Enum<{ + "Concrete": Anonymize; + "Abstract": Binary; +}>; +export declare const XcmV2MultiassetAssetId: GetEnum; +export type XcmV2MultiassetFungibility = Enum<{ + "Fungible": bigint; + "NonFungible": XcmV2MultiassetAssetInstance; +}>; +export declare const XcmV2MultiassetFungibility: GetEnum; +export type XcmV2MultiassetAssetInstance = Enum<{ + "Undefined": undefined; + "Index": bigint; + "Array4": FixedSizeBinary<4>; + "Array8": FixedSizeBinary<8>; + "Array16": FixedSizeBinary<16>; + "Array32": FixedSizeBinary<32>; + "Blob": Binary; +}>; +export declare const XcmV2MultiassetAssetInstance: GetEnum; +export type Iai6dhqiq3bach = Array>; +export type Idcm24504c8bkk = { + "id": XcmV3MultiassetAssetId; + "fun": XcmV3MultiassetFungibility; +}; +export type Ic8hi3qr11vngc = { + "destination": Anonymize; + "result": number; + "cost": Anonymize; + "message_id": FixedSizeBinary<32>; +}; +export type Iabk8ljl5g8c86 = { + "location": Anonymize; + "version": number; +}; +export type Ibjdlecumfu7q7 = { + "location": Anonymize; + "query_id": bigint; + "error": XcmV3TraitsError; +}; +export type Ia9ems1kg7laoc = { + "location": DotXcmVersionedLocation; + "query_id": bigint; +}; +export type I92fq0fa45vi3 = { + "origin": Anonymize; + "query_id": bigint; + "expected_querier": Anonymize; + "maybe_actual_querier"?: Anonymize; +}; +export type Id01dpp0dn2cj0 = { + "destination": Anonymize; + "cost": Anonymize; + "message_id": FixedSizeBinary<32>; +}; +export type I6nu8k62ck9o8o = { + "paying": Anonymize; + "fees": Anonymize; +}; +export type I6s1nbislhk619 = { + "version": number; +}; +export type I13vul90391uuv = AnonymousEnum<{ + /** + *Message discarded due to an error in the `MessageProcessor` (usually a format error). + */ + "ProcessingFailed": Anonymize; + /** + *Message is processed. + */ + "Processed": Anonymize; + /** + *Message placed in overweight queue. + */ + "OverweightEnqueued": Anonymize; + /** + *This page was reaped. + */ + "PageReaped": Anonymize; +}>; +export type I218fa3heih67o = { + /** + *The `blake2_256` hash of the message. + */ + "id": FixedSizeBinary<32>; + /** + *The queue of the message. + */ + "origin": ParachainsInclusionAggregateMessageOrigin; + /** + *The error that occurred. + * + *This error is pretty opaque. More fine-grained errors need to be emitted as events + *by the `MessageProcessor`. + */ + "error": Anonymize; +}; +export type ParachainsInclusionAggregateMessageOrigin = Enum<{ + "Ump": ParachainsInclusionUmpQueueId; +}>; +export declare const ParachainsInclusionAggregateMessageOrigin: GetEnum; +export type ParachainsInclusionUmpQueueId = Enum<{ + "Para": number; +}>; +export declare const ParachainsInclusionUmpQueueId: GetEnum; +export type I5hhsj7l9obr84 = AnonymousEnum<{ + "BadFormat": undefined; + "Corrupt": undefined; + "Unsupported": undefined; + "Overweight": Anonymize; + "Yield": undefined; + "StackLimitReached": undefined; +}>; +export type I1tf93k54ltg1v = { + /** + *The `blake2_256` hash of the message. + */ + "id": FixedSizeBinary<32>; + /** + *The queue of the message. + */ + "origin": ParachainsInclusionAggregateMessageOrigin; + /** + *How much weight was used to process the message. + */ + "weight_used": Anonymize; + /** + *Whether the message was processed. + * + *Note that this does not mean that the underlying `MessageProcessor` was internally + *successful. It *solely* means that the MQ pallet will treat this as a success + *condition and discard the message. Any internal error needs to be emitted as events + *by the `MessageProcessor`. + */ + "success": boolean; +}; +export type I6ove5at7hfiur = { + /** + *The `blake2_256` hash of the message. + */ + "id": FixedSizeBinary<32>; + /** + *The queue of the message. + */ + "origin": ParachainsInclusionAggregateMessageOrigin; + /** + *The page of the message. + */ + "page_index": number; + /** + *The index of the message within the page. + */ + "message_index": number; +}; +export type I9c0urppp07b8b = { + /** + *The queue of the page. + */ + "origin": ParachainsInclusionAggregateMessageOrigin; + /** + *The index of the page. + */ + "index": number; +}; +export type AssetRateEvent = Enum<{ + "AssetRateCreated": Anonymize; + "AssetRateRemoved": Anonymize; + "AssetRateUpdated": Anonymize; +}>; +export declare const AssetRateEvent: GetEnum; +export type I6nmp4rhqla35 = { + "asset_kind": VersionedLocatableAsset; + "rate": bigint; +}; +export type I8ndstn7sf4kek = { + "asset_kind": VersionedLocatableAsset; +}; +export type I1a3ecmnlnvr59 = { + "asset_kind": VersionedLocatableAsset; + "old": bigint; + "new": bigint; +}; +export type Ic5m5lp1oioo8r = Array>; +export type I95g6i7ilua7lq = Array>; +export type Ieniouoqkq4icf = { + "spec_version": number; + "spec_name": string; +}; +export type I9tv51sgspensk = Array>; +export type I6d8rsn8f949na = (Anonymize) | undefined; +export type I2pi981kdgomb3 = { + "maybe_id"?: Anonymize; + "priority": number; + "call": PreimagesBounded; + "maybe_periodic"?: Anonymize; + "origin": PolkadotRuntimeOriginCaller; +}; +export type Iep7au1720bm0e = (Anonymize) | undefined; +export type PolkadotRuntimeOriginCaller = Enum<{ + "system": DispatchRawOrigin; + "Origins": GovernanceOrigin; + "ParachainsOrigin": ParachainsOrigin; + "XcmPallet": XcmPalletOrigin; + "Void": undefined; +}>; +export declare const PolkadotRuntimeOriginCaller: GetEnum; +export type DispatchRawOrigin = Enum<{ + "Root": undefined; + "Signed": SS58String; + "None": undefined; +}>; +export declare const DispatchRawOrigin: GetEnum; +export type GovernanceOrigin = Enum<{ + "StakingAdmin": undefined; + "Treasurer": undefined; + "FellowshipAdmin": undefined; + "GeneralAdmin": undefined; + "AuctionAdmin": undefined; + "LeaseAdmin": undefined; + "ReferendumCanceller": undefined; + "ReferendumKiller": undefined; + "SmallTipper": undefined; + "BigTipper": undefined; + "SmallSpender": undefined; + "MediumSpender": undefined; + "BigSpender": undefined; + "WhitelistedCaller": undefined; + "WishForChange": undefined; +}>; +export declare const GovernanceOrigin: GetEnum; +export type ParachainsOrigin = Enum<{ + "Parachain": number; +}>; +export declare const ParachainsOrigin: GetEnum; +export type XcmPalletOrigin = Enum<{ + "Xcm": Anonymize; + "Response": Anonymize; +}>; +export declare const XcmPalletOrigin: GetEnum; +export type I56u24ncejr5kt = { + "total_retries": number; + "remaining": number; + "period": number; +}; +export type PreimageOldRequestStatus = Enum<{ + "Unrequested": Anonymize; + "Requested": Anonymize; +}>; +export declare const PreimageOldRequestStatus: GetEnum; +export type I5jej6bvdjrisr = { + "deposit": Anonymize; + "len": number; +}; +export type I95l2k9b1re95f = [SS58String, bigint]; +export type Is7sg1rr9u2nm = { + "deposit"?: Anonymize; + "count": number; + "len"?: Anonymize; +}; +export type I92hdo1clkbp4g = (Anonymize) | undefined; +export type I4arjljr6dpflb = (number) | undefined; +export type PreimageRequestStatus = Enum<{ + "Unrequested": Anonymize; + "Requested": Anonymize; +}>; +export declare const PreimageRequestStatus: GetEnum; +export type Idvcv8961o32th = { + "ticket": Anonymize; + "len": number; +}; +export type In82i9avte5re = { + "maybe_ticket"?: Anonymize; + "count": number; + "maybe_len"?: Anonymize; +}; +export type BabeDigestsNextConfigDescriptor = Enum<{ + "V1": Anonymize; +}>; +export declare const BabeDigestsNextConfigDescriptor: GetEnum; +export type I8jnd4d8ip6djo = { + "c": Anonymize; + "allowed_slots": BabeAllowedSlots; +}; +export type I200n1ov5tbcvr = FixedSizeArray<2, bigint>; +export type BabeAllowedSlots = Enum<{ + "PrimarySlots": undefined; + "PrimaryAndSecondaryPlainSlots": undefined; + "PrimaryAndSecondaryVRFSlots": undefined; +}>; +export declare const BabeAllowedSlots: GetEnum; +export type Idq7or56ds2f13 = (BabeDigestsPreDigest) | undefined; +export type BabeDigestsPreDigest = Enum<{ + "Primary": Anonymize; + "SecondaryPlain": Anonymize; + "SecondaryVRF": Anonymize; +}>; +export declare const BabeDigestsPreDigest: GetEnum; +export type Ien29ooge6hr9e = { + "authority_index": number; + "slot": bigint; + "vrf_signature": Anonymize; +}; +export type Ib066efvl8g6ok = { + "pre_output": FixedSizeBinary<32>; + "proof": FixedSizeBinary<64>; +}; +export type Ieiaevc5q41ard = { + "authority_index": number; + "slot": bigint; +}; +export type Ifip05kcrl65am = Array>; +export type I6cs1itejju2vv = [bigint, number]; +export type Iff9heri56m1mb = [SS58String, bigint, boolean]; +export type I8ds64oj6581v0 = Array>; +export type Ifd60g9ld04ljn = { + "id": FixedSizeBinary<8>; + "amount": bigint; + "reasons": BalancesTypesReasons; +}; +export type BalancesTypesReasons = Enum<{ + "Fee": undefined; + "Misc": undefined; + "All": undefined; +}>; +export declare const BalancesTypesReasons: GetEnum; +export type Ia7pdug7cdsg8g = Array>; +export type I1basc5up2fk73 = { + "id": FixedSizeBinary<8>; + "amount": bigint; +}; +export type I3oiqtmlj7klbr = Array>; +export type Ifde25j06ecor0 = { + "id": Anonymize; + "amount": bigint; +}; +export type I8qhoqaff9bl1a = AnonymousEnum<{ + "Preimage": PreimagePalletHoldReason; + "StateTrieMigration": Anonymize; +}>; +export type PreimagePalletHoldReason = Enum<{ + "Preimage": undefined; +}>; +export declare const PreimagePalletHoldReason: GetEnum; +export type I7lf1val3vmpq0 = AnonymousEnum<{ + "SlashForMigrate": undefined; +}>; +export type I2l1ctuihi2mfd = Array>; +export type I55k5ohoio0bvr = { + "id": WestendRuntimeRuntimeFreezeReason; + "amount": bigint; +}; +export type WestendRuntimeRuntimeFreezeReason = Enum<{ + "NominationPools": NominationPoolsPalletFreezeReason; +}>; +export declare const WestendRuntimeRuntimeFreezeReason: GetEnum; +export type NominationPoolsPalletFreezeReason = Enum<{ + "PoolMinBalance": undefined; +}>; +export declare const NominationPoolsPalletFreezeReason: GetEnum; +export type TransactionPaymentReleases = Enum<{ + "V1Ancient": undefined; + "V2": undefined; +}>; +export declare const TransactionPaymentReleases: GetEnum; +export type Ia2lhg7l2hilo3 = Array; +export type Ic12aht5vh2sen = { + "stash": SS58String; + "total": bigint; + "active": bigint; + "unlocking": Anonymize; + "legacy_claimed_rewards": Anonymize; +}; +export type I9nc4v1upo2c8e = Array>; +export type I3niuuk38q4krr = { + "value": bigint; + "era": number; +}; +export type Ic3m9d6tdl6gi2 = { + "targets": Anonymize; + "submitted_in": number; + "suppressed": boolean; +}; +export type Ib3j7gb0jgs38u = { + "index": number; + "start"?: Anonymize; +}; +export type I35p85j063s0il = (bigint) | undefined; +export type Ifekshcrgkl12g = { + "total": bigint; + "own": bigint; + "others": Anonymize; +}; +export type I252o97fo263q7 = Array>; +export type I91eao91fmce8 = { + "who": SS58String; + "value": bigint; +}; +export type I6flrronqs3l6n = { + "total": bigint; + "own": bigint; + "nominator_count": number; + "page_count": number; +}; +export type I97fulj5h3ik95 = { + "page_total": bigint; + "others": Anonymize; +}; +export type Ia8896dq44k9m4 = [number, SS58String, number]; +export type Iff9p3c7k6pfoi = { + "total": number; + "individual": Anonymize; +}; +export type I205qrookusi3d = Array>; +export type I6ouflveob4eli = [SS58String, number]; +export type Iafq6t4rgheait = Array>; +export type Ifedledo2fog34 = { + "validator": SS58String; + "own": bigint; + "others": Anonymize; + "reporters": Anonymize; + "payout": bigint; +}; +export type Iba9inugg1atvo = Array>; +export type I4ojmnsk1dchql = [number, bigint]; +export type Iinkhfdlka9ch = { + "span_index": number; + "last_start": number; + "last_nonzero_slash": number; + "prior": Anonymize; +}; +export type I2kj4j6mp68hf8 = { + "slashed": bigint; + "paid_out": bigint; +}; +export type I2bqvqrg0sbrdj = { + "offender": Anonymize; + "reporters": Anonymize; +}; +export type Idi27pva6ajg4 = [SS58String, Anonymize]; +export type I23nq3fsgtejt = [FixedSizeBinary<16>, Binary]; +export type Idt624nf41g34e = Array>; +export type I4v3ibe4dqslio = [SS58String, Anonymize]; +export type I9kr8cseidc66h = { + "grandpa": FixedSizeBinary<32>; + "babe": FixedSizeBinary<32>; + "para_validator": FixedSizeBinary<32>; + "para_assignment": FixedSizeBinary<32>; + "authority_discovery": FixedSizeBinary<32>; + "beefy": FixedSizeBinary<33>; +}; +export type GrandpaStoredState = Enum<{ + "Live": undefined; + "PendingPause": Anonymize; + "Paused": undefined; + "PendingResume": Anonymize; +}>; +export declare const GrandpaStoredState: GetEnum; +export type Ib95oqfalvjqfe = { + "scheduled_at": number; + "delay": number; +}; +export type I7pe2me3i3vtn9 = { + "scheduled_at": number; + "delay": number; + "next_authorities": Anonymize; + "forced"?: Anonymize; +}; +export type Iegmj7n48sc3am = { + "proposer": SS58String; + "value": bigint; + "beneficiary": SS58String; + "bond": bigint; +}; +export type I5v9a2mdqq4t8u = { + "asset_kind": VersionedLocatableAsset; + "amount": bigint; + "beneficiary": DotXcmVersionedLocation; + "valid_from": number; + "expire_at": number; + "status": TreasuryPaymentState; +}; +export type TreasuryPaymentState = Enum<{ + "Pending": undefined; + "Attempted": Anonymize; + "Failed": undefined; +}>; +export declare const TreasuryPaymentState: GetEnum; +export type I4ov6e94l79mbg = { + "id": bigint; +}; +export type ConvictionVotingVoteVoting = Enum<{ + "Casting": Anonymize; + "Delegating": Anonymize; +}>; +export declare const ConvictionVotingVoteVoting: GetEnum; +export type If52hjr5c5nrc5 = { + "votes": Anonymize; + "delegations": Anonymize; + "prior": Anonymize; +}; +export type I42jj1su7asrm9 = Array>; +export type I7mk5ivue8lr2m = [number, ConvictionVotingVoteAccountVote]; +export type ConvictionVotingVoteAccountVote = Enum<{ + "Standard": Anonymize; + "Split": Anonymize; + "SplitAbstain": Anonymize; +}>; +export declare const ConvictionVotingVoteAccountVote: GetEnum; +export type Ib024p97ls1cla = { + "vote": number; + "balance": bigint; +}; +export type I5pi71t9bosoiv = { + "aye": bigint; + "nay": bigint; +}; +export type I89irppcaqmf1i = { + "aye": bigint; + "nay": bigint; + "abstain": bigint; +}; +export type I538qha8r4j3ii = { + "votes": bigint; + "capital": bigint; +}; +export type I251o9sbu5566f = { + "balance": bigint; + "target": SS58String; + "conviction": VotingConviction; + "delegations": Anonymize; + "prior": Anonymize; +}; +export type VotingConviction = Enum<{ + "None": undefined; + "Locked1x": undefined; + "Locked2x": undefined; + "Locked3x": undefined; + "Locked4x": undefined; + "Locked5x": undefined; + "Locked6x": undefined; +}>; +export declare const VotingConviction: GetEnum; +export type If9jidduiuq7vv = Array>; +export type Idu11e295qqjep = AnonymousEnum<{ + "Ongoing": Anonymize; + "Approved": Anonymize; + "Rejected": Anonymize; + "Cancelled": Anonymize; + "TimedOut": Anonymize; + "Killed": number; +}>; +export type I2i3mpciskqofd = { + "track": number; + "origin": PolkadotRuntimeOriginCaller; + "proposal": PreimagesBounded; + "enactment": TraitsScheduleDispatchTime; + "submitted": number; + "submission_deposit": Anonymize; + "decision_deposit"?: Anonymize; + "deciding"?: Anonymize; + "tally": Anonymize; + "in_queue": boolean; + "alarm"?: Anonymize; +}; +export type TraitsScheduleDispatchTime = Enum<{ + "At": number; + "After": number; +}>; +export declare const TraitsScheduleDispatchTime: GetEnum; +export type Ibd24caul84kv2 = (Anonymize) | undefined; +export type Ibcbcndfmk0jd9 = (Anonymize) | undefined; +export type I4a0pk3ivg0trh = { + "since": number; + "confirming"?: Anonymize; +}; +export type I3aj03qk2o5mdm = (Anonymize) | undefined; +export type I3pjs7v78ujbii = [number, Anonymize]; +export type Ini94eljn5lj8 = [number, Anonymize, Anonymize]; +export type I2phecamkn3pej = [bigint, bigint, number]; +export type ClaimsStatementKind = Enum<{ + "Regular": undefined; + "Saft": undefined; +}>; +export declare const ClaimsStatementKind: GetEnum; +export type Ifble4juuml5ig = Array>; +export type I4aro1m78pdrtt = { + "locked": bigint; + "per_block": bigint; + "starting_block": number; +}; +export type Version = Enum<{ + "V0": undefined; + "V1": undefined; +}>; +export declare const Version: GetEnum; +export type I6piac7omi5lpd = [Anonymize, bigint]; +export type I62povnsc7ttie = Array>; +export type Iedi7gevl4j19n = { + "delegate": SS58String; + "proxy_type": Anonymize; + "delay": number; +}; +export type I9p9lq3rej5bhc = [Anonymize, bigint]; +export type Ie1hjkhaoshr67 = Array>; +export type I70eqajm9p2sc5 = { + "real": SS58String; + "call_hash": FixedSizeBinary<32>; + "height": number; +}; +export type Iag146hmjgqfgj = { + "when": Anonymize; + "deposit": bigint; + "depositor": SS58String; + "approvals": Anonymize; +}; +export type I8uo3fpd3bcc6f = [SS58String, FixedSizeBinary<32>]; +export type I8phqps8r3of7e = { + "proposer": SS58String; + "value": bigint; + "fee": bigint; + "curator_deposit": bigint; + "bond": bigint; + "status": BountiesBountyStatus; +}; +export type BountiesBountyStatus = Enum<{ + "Proposed": undefined; + "Approved": undefined; + "Funded": undefined; + "CuratorProposed": Anonymize; + "Active": Anonymize; + "PendingPayout": Anonymize; +}>; +export declare const BountiesBountyStatus: GetEnum; +export type I846573mdj1pfn = { + "curator": SS58String; +}; +export type I5s3sqq6r9nt63 = { + "curator": SS58String; + "update_due": number; +}; +export type I4aulgjqrdphrm = { + "curator": SS58String; + "beneficiary": SS58String; + "unlock_at": number; +}; +export type Ibofbvvaehln4e = { + "parent_bounty": number; + "value": bigint; + "fee": bigint; + "curator_deposit": bigint; + "status": ChildBountyStatus; +}; +export type ChildBountyStatus = Enum<{ + "Added": undefined; + "CuratorProposed": Anonymize; + "Active": Anonymize; + "PendingPayout": Anonymize; +}>; +export declare const ChildBountyStatus: GetEnum; +export type Ictkaqdbfabuek = { + "supports": Anonymize; + "score": Anonymize; + "compute": ElectionProviderMultiPhaseElectionCompute; +}; +export type I4bboqsv44evel = Array>; +export type Ib5vlbiqndekn9 = [SS58String, Anonymize]; +export type I7qb1luldf1jtf = { + "total": bigint; + "voters": Anonymize; +}; +export type Ia7o65280hur3p = { + "voters": Anonymize; + "targets": Anonymize; +}; +export type I9cpogojpnsq8h = Array>; +export type I6dvmrbp80vk5k = [SS58String, bigint, Anonymize]; +export type Iasd2iat48n080 = { + "voters": number; + "targets": number; +}; +export type Ic8d01sg6acf60 = Array>; +export type Ie663uperueqm5 = [Anonymize, number, number]; +export type Irl37q7erstrb = { + "who": SS58String; + "deposit": bigint; + "raw_solution": Anonymize; + "call_fee": bigint; +}; +export type I7je4n92ump862 = { + "solution": Anonymize; + "score": Anonymize; + "round": number; +}; +export type I1nvcsqg39g26j = { + "votes1": Anonymize; + "votes2": Anonymize; + "votes3": Anonymize; + "votes4": Anonymize; + "votes5": Anonymize; + "votes6": Anonymize; + "votes7": Anonymize; + "votes8": Anonymize; + "votes9": Anonymize; + "votes10": Anonymize; + "votes11": Anonymize; + "votes12": Anonymize; + "votes13": Anonymize; + "votes14": Anonymize; + "votes15": Anonymize; + "votes16": Anonymize; +}; +export type Iep4uo61810hfs = Array>; +export type I5g2vv0ckl2m8b = [number, number]; +export type Ickjq69hlul8c3 = Array>; +export type I4l2a0q04ni20o = [number, Anonymize, number]; +export type Icf645ln9bi1bj = Array>; +export type Iamqg950vpqsp8 = [number, Anonymize, number]; +export type Iffarf0mj066h7 = FixedSizeArray<2, Anonymize>; +export type I8nospv7k5s457 = Array>; +export type Ifr1o6ri1uf2of = [number, Anonymize, number]; +export type I33ipki9g5n04l = FixedSizeArray<3, Anonymize>; +export type Iig9pofg77rah = Array>; +export type I4gus921fjj8lq = [number, Anonymize, number]; +export type If6gr8nt3vreg9 = FixedSizeArray<4, Anonymize>; +export type Irttjt9tghoc0 = Array>; +export type I9h1lfefrjrss8 = [number, Anonymize, number]; +export type I8kcfo1iikpfd7 = FixedSizeArray<5, Anonymize>; +export type I3o5epjr2va0dl = Array>; +export type I85q51vkapcmho = [number, Anonymize, number]; +export type I829dlpp8f7vhg = FixedSizeArray<6, Anonymize>; +export type I1gfnebceebqb5 = Array>; +export type I9kgeuvub0nepg = [number, Anonymize, number]; +export type Ie65d4ts6gb5rk = FixedSizeArray<7, Anonymize>; +export type Ibo38fh2dhj4it = Array>; +export type Ipcskss5flcis = [number, Anonymize, number]; +export type I45nria0sqoino = FixedSizeArray<8, Anonymize>; +export type Id4gvspmdh8h9l = Array>; +export type Ifdgh79k56960e = [number, Anonymize, number]; +export type Ie8fi1901h656e = FixedSizeArray<9, Anonymize>; +export type I5be3ho5m1r68a = Array>; +export type I5n2npru4pt8nc = [number, Anonymize, number]; +export type I1ap4gedi13j9r = FixedSizeArray<10, Anonymize>; +export type I7s2sh7cpuv56r = Array>; +export type I2udmq2v26rio = [number, Anonymize, number]; +export type I5vtd36r5b6fss = FixedSizeArray<11, Anonymize>; +export type I5fq8855gfhmlo = Array>; +export type Id2nvrmi6cagga = [number, Anonymize, number]; +export type Iee99h3pht9j20 = FixedSizeArray<12, Anonymize>; +export type I4mvok713k4g7o = Array>; +export type I2ajtdvlncoqrd = [number, Anonymize, number]; +export type I3lmls9cse1mcr = FixedSizeArray<13, Anonymize>; +export type I90tu9lmjmhfhd = Array>; +export type Ifn0i2gsu8pkck = [number, Anonymize, number]; +export type Ia1o13i3p2r7gm = FixedSizeArray<14, Anonymize>; +export type I3cqaev9m4hn9m = Array>; +export type Icrp3ubf87cjna = [number, Anonymize, number]; +export type I8c5gqvfaedv6e = FixedSizeArray<15, Anonymize>; +export type Ic5t26f9cp3tvk = { + "id": SS58String; + "prev"?: Anonymize; + "next"?: Anonymize; + "bag_upper": bigint; + "score": bigint; +}; +export type I39k39h6vu4hbq = { + "head"?: Anonymize; + "tail"?: Anonymize; +}; +export type Idphjddn2h69vc = { + "pool_id": number; + "points": bigint; + "last_recorded_reward_counter": bigint; + "unbonding_eras": Anonymize; +}; +export type Idhh9vuu2bderg = { + "commission": Anonymize; + "member_counter": number; + "points": bigint; + "roles": Anonymize; + "state": NominationPoolsPoolState; +}; +export type I9gabbnrts4k5a = { + "current"?: Anonymize; + "max"?: Anonymize; + "change_rate"?: Anonymize; + "throttle_from"?: Anonymize; + "claim_permission"?: Anonymize; +}; +export type I7hapkpc6mcou7 = (Anonymize) | undefined; +export type Ia8iksu9hedf5n = { + "depositor": SS58String; + "root"?: Anonymize; + "nominator"?: Anonymize; + "bouncer"?: Anonymize; +}; +export type If6qa32dj75gu1 = { + "last_recorded_reward_counter": bigint; + "last_recorded_total_payouts": bigint; + "total_rewards_claimed": bigint; + "total_commission_pending": bigint; + "total_commission_claimed": bigint; +}; +export type I7oo2mprv1qd1s = { + "no_era": Anonymize; + "with_era": Anonymize; +}; +export type I4h0cfnkiqrna6 = { + "points": bigint; + "balance": bigint; +}; +export type I48jqs22bfh5as = Array>; +export type Ifp6metskahp08 = [number, Anonymize]; +export type NominationPoolsClaimPermission = Enum<{ + "Permissioned": undefined; + "PermissionlessCompound": undefined; + "PermissionlessWithdraw": undefined; + "PermissionlessAll": undefined; +}>; +export declare const NominationPoolsClaimPermission: GetEnum; +export type I2eh80qovrl7h2 = { + "stashes": Anonymize; + "checked": Anonymize; +}; +export type Idinvj2ldfa0k7 = { + "max_code_size": number; + "max_head_data_size": number; + "max_upward_queue_count": number; + "max_upward_queue_size": number; + "max_upward_message_size": number; + "max_upward_message_num_per_candidate": number; + "hrmp_max_message_num_per_candidate": number; + "validation_upgrade_cooldown": number; + "validation_upgrade_delay": number; + "async_backing_params": Anonymize; + "max_pov_size": number; + "max_downward_message_size": number; + "hrmp_max_parachain_outbound_channels": number; + "hrmp_sender_deposit": bigint; + "hrmp_recipient_deposit": bigint; + "hrmp_channel_max_capacity": number; + "hrmp_channel_max_total_size": number; + "hrmp_max_parachain_inbound_channels": number; + "hrmp_channel_max_message_size": number; + "executor_params": Anonymize; + "code_retention_period": number; + "max_validators"?: Anonymize; + "dispute_period": number; + "dispute_post_conclusion_acceptance_period": number; + "no_show_slots": number; + "n_delay_tranches": number; + "zeroth_delay_tranche_width": number; + "needed_approvals": number; + "relay_vrf_modulo_samples": number; + "pvf_voting_ttl": number; + "minimum_validation_upgrade_delay": number; + "minimum_backing_votes": number; + "node_features": { + bytes: Uint8Array; + bitsLen: number; + }; + "approval_voting_params": number; + "scheduler_params": Anonymize; +}; +export type Iavuvfkop6318c = { + "max_candidate_depth": number; + "allowed_ancestry_len": number; +}; +export type I80rnntpog8qp6 = Array; +export type PolkadotPrimitivesV6ExecutorParamsExecutorParam = Enum<{ + "MaxMemoryPages": number; + "StackLogicalMax": number; + "StackNativeMax": number; + "PrecheckingMaxMemory": bigint; + "PvfPrepTimeout": Anonymize; + "PvfExecTimeout": Anonymize; + "WasmExtBulkMemory": undefined; +}>; +export declare const PolkadotPrimitivesV6ExecutorParamsExecutorParam: GetEnum; +export type I57qv5chhd2bar = [PolkadotPrimitivesV6PvfPrepKind, bigint]; +export type PolkadotPrimitivesV6PvfPrepKind = Enum<{ + "Precheck": undefined; + "Prepare": undefined; +}>; +export declare const PolkadotPrimitivesV6PvfPrepKind: GetEnum; +export type Ib05v3rv2rd8ij = [PvfExecKind, bigint]; +export type PvfExecKind = Enum<{ + "Backing": undefined; + "Approval": undefined; +}>; +export declare const PvfExecKind: GetEnum; +export type I555j7pvb27qd5 = { + "group_rotation_frequency": number; + "paras_availability_period": number; + "max_validators_per_core"?: Anonymize; + "lookahead": number; + "num_cores": number; + "max_availability_timeouts": number; + "on_demand_queue_max_size": number; + "on_demand_target_queue_utilization": number; + "on_demand_fee_variability": number; + "on_demand_base_fee": bigint; + "ttl": number; +}; +export type I78k2970vpbt1t = Array>; +export type Ijlosb0ss738p = [number, Anonymize]; +export type I27il479s8gsv0 = { + "buffer": Anonymize; + "latest_number": number; +}; +export type I5v1libhfl216g = Array>; +export type I2ccsdtloqt0h4 = FixedSizeArray<2, FixedSizeBinary<32>>; +export type Id375uoldedict = Array>; +export type I39ni9afdvueqm = { + "core": number; + "hash": FixedSizeBinary<32>; + "descriptor": Anonymize; + "commitments": Anonymize; + "availability_votes": { + bytes: Uint8Array; + bitsLen: number; + }; + "backers": { + bytes: Uint8Array; + bitsLen: number; + }; + "relay_parent_number": number; + "backed_in_number": number; + "backing_group": number; +}; +export type Ic1d4u2opv3fst = { + "upward_messages": Anonymize; + "horizontal_messages": Anonymize; + "new_validation_code"?: Anonymize; + "head_data": Binary; + "processed_downward_messages": number; + "hrmp_watermark": number; +}; +export type Itom7fk49o0c9 = Array; +export type I6r5cbv8ttrb09 = Array>; +export type I958l48g4qg5rf = { + "recipient": number; + "data": Binary; +}; +export type Iabpgqcjikia83 = (Binary) | undefined; +export type Ilg2fqs6cjgs3 = { + "session": number; + "backing_validators_per_candidate": Anonymize; + "disputes": Anonymize; +}; +export type I2cbmipi4mgfht = Array>; +export type I8qsi9it67j51o = [Anonymize, Anonymize]; +export type I1jjanul21h2e0 = Array>; +export type Iiu2q9mv7qkl8 = [number, ValidityAttestation]; +export type ValidityAttestation = Enum<{ + "Implicit": FixedSizeBinary<64>; + "Explicit": FixedSizeBinary<64>; +}>; +export declare const ValidityAttestation: GetEnum; +export type Ibt1op6l47p1r2 = Array>; +export type I3ot7vri7o8sb8 = { + "candidate_hash": FixedSizeBinary<32>; + "session": number; + "statements": Anonymize; +}; +export type Ia05m2q0dqbf8r = Array>; +export type Imkbdgkq0f1or = [PolkadotPrimitivesV6DisputeStatement, number, FixedSizeBinary<64>]; +export type PolkadotPrimitivesV6DisputeStatement = Enum<{ + "Valid": PolkadotPrimitivesV6ValidDisputeStatementKind; + "Invalid": Anonymize; +}>; +export declare const PolkadotPrimitivesV6DisputeStatement: GetEnum; +export type PolkadotPrimitivesV6ValidDisputeStatementKind = Enum<{ + "Explicit": undefined; + "BackingSeconded": FixedSizeBinary<32>; + "BackingValid": FixedSizeBinary<32>; + "ApprovalChecking": undefined; + "ApprovalCheckingMultipleCandidates": Anonymize; +}>; +export declare const PolkadotPrimitivesV6ValidDisputeStatementKind: GetEnum; +export type InvalidDisputeStatementKind = Enum<{ + "Explicit": undefined; +}>; +export declare const InvalidDisputeStatementKind: GetEnum; +export type Iarlj3qd8u1v13 = Array>; +export type I2ng2krd94ceva = Array; +export type PolkadotRuntimeParachainsSchedulerPalletCoreOccupied = Enum<{ + "Free": undefined; + "Paras": Anonymize; +}>; +export declare const PolkadotRuntimeParachainsSchedulerPalletCoreOccupied: GetEnum; +export type Iuf24b6e93i3q = { + "assignment": PolkadotRuntimeParachainsSchedulerCommonAssignment; + "availability_timeouts": number; + "ttl": number; +}; +export type PolkadotRuntimeParachainsSchedulerCommonAssignment = Enum<{ + "Pool": Anonymize; + "Bulk": number; +}>; +export declare const PolkadotRuntimeParachainsSchedulerCommonAssignment: GetEnum; +export type I51g4s1s9hjmnm = { + "para_id": number; + "core_index": number; +}; +export type Ie18mk3nmrn3nr = Array>; +export type Ifadvqu5iig2q6 = [number, Anonymize]; +export type I9173djtr3q94d = Array>; +export type I4vk12npmr8ll0 = { + "votes_accept": { + bytes: Uint8Array; + bitsLen: number; + }; + "votes_reject": { + bytes: Uint8Array; + bitsLen: number; + }; + "age": number; + "created_at": number; + "causes": Anonymize; +}; +export type I1hsgfu91a4476 = Array>; +export type Iajttbp61thc1h = AnonymousEnum<{ + "Onboarding": number; + "Upgrade": Anonymize; +}>; +export type Irvl8rst55h8o = { + "id": number; + "included_at": number; + "upgrade_strategy": Anonymize; +}; +export type I3mepf00hb058t = AnonymousEnum<{ + "SetGoAheadSignal": undefined; + "ApplyAtExpectedBlock": undefined; +}>; +export type ParachainsParasParaLifecycle = Enum<{ + "Onboarding": undefined; + "Parathread": undefined; + "Parachain": undefined; + "UpgradingParathread": undefined; + "DowngradingParachain": undefined; + "OffboardingParathread": undefined; + "OffboardingParachain": undefined; +}>; +export declare const ParachainsParasParaLifecycle: GetEnum; +export type I79cs1p3m59mo7 = { + "upgrade_times": Anonymize; + "last_pruned"?: Anonymize; +}; +export type I2v6n2k262gqsq = Array>; +export type Ioham9r6hhu19 = { + "expected_at": number; + "activated_at": number; +}; +export type UpgradeGoAhead = Enum<{ + "Abort": undefined; + "GoAhead": undefined; +}>; +export declare const UpgradeGoAhead: GetEnum; +export type UpgradeRestriction = Enum<{ + "Present": undefined; +}>; +export declare const UpgradeRestriction: GetEnum; +export type I2duhnt686rv0q = { + "genesis_head": Binary; + "validation_code": Binary; + "para_kind": boolean; +}; +export type I7ulu3h1ibu60i = Array>; +export type Idtrfath8htv0g = { + "validators": Anonymize; + "queued": Anonymize; + "session_index": number; +}; +export type I6ljjd4b5fa4ov = Array>; +export type I60847k37jfcc6 = { + "sent_at": number; + "msg": Binary; +}; +export type Ibhmrlkcu01imb = { + "confirmed": boolean; + "_age": number; + "sender_deposit": bigint; + "max_message_size": number; + "max_capacity": number; + "max_total_size": number; +}; +export type Id43g4eveajpkl = Array>; +export type I7iua3ehrgl4va = { + "max_capacity": number; + "max_total_size": number; + "max_message_size": number; + "msg_count": number; + "total_size": number; + "mqc_head"?: Anonymize; + "sender_deposit": bigint; + "recipient_deposit": bigint; +}; +export type Iev3u09i2vqn93 = Array>; +export type I409qo0sfkbh16 = { + "sent_at": number; + "data": Binary; +}; +export type I9olhgo2o08h7b = Array>; +export type I8pg2rpr4ldgp9 = [number, Anonymize]; +export type I9m4rd2a7lc9md = { + "active_validator_indices": Anonymize; + "random_seed": FixedSizeBinary<32>; + "dispute_period": number; + "validators": Anonymize; + "discovery_keys": Anonymize; + "assignment_keys": Anonymize; + "validator_groups": Anonymize; + "n_cores": number; + "zeroth_delay_tranche_width": number; + "relay_vrf_modulo_samples": number; + "n_delay_tranches": number; + "no_show_slots": number; + "needed_approvals": number; +}; +export type I87u7jalc0lhah = { + "validators_for": { + bytes: Uint8Array; + bitsLen: number; + }; + "validators_against": { + bytes: Uint8Array; + bitsLen: number; + }; + "start": number; + "concluded_at"?: Anonymize; +}; +export type I4p5t2krb1gmvp = [number, FixedSizeBinary<32>]; +export type I5kqchhvguhfvt = { + "keys": Anonymize; + "kind": SlashingOffenceKind; +}; +export type Iqnbvitf7a7l3 = Array>; +export type SlashingOffenceKind = Enum<{ + "ForInvalid": undefined; + "AgainstValid": undefined; +}>; +export declare const SlashingOffenceKind: GetEnum; +export type I4akf1ifqeclef = { + "core_index": number; + "count": number; +}; +export type Ido5stnsbghtpd = { + "traffic": bigint; + "next_index": number; + "smallest_index": number; + "freed_indices": Anonymize; +}; +export type I3ndpvu09rj685 = Array>; +export type Imjh277lquvaf = { + "para_id": number; + "idx": number; +}; +export type Iafqnechp3omqg = Array; +export type I9dasmua8326io = { + "assignments": Anonymize; + "end_hint"?: Anonymize; + "next_schedule"?: Anonymize; +}; +export type Idt36labebpqsd = Array>; +export type I7adotjtnum30f = [BrokerCoretimeInterfaceCoreAssignment, number]; +export type BrokerCoretimeInterfaceCoreAssignment = Enum<{ + "Idle": undefined; + "Pool": undefined; + "Task": number; +}>; +export declare const BrokerCoretimeInterfaceCoreAssignment: GetEnum; +export type I3g90iebhds6kb = { + "queue"?: Anonymize; + "current_work"?: Anonymize; +}; +export type If4sm31aq7v0i8 = (Anonymize) | undefined; +export type Icjkaf41q9ga6t = { + "first": number; + "last": number; +}; +export type Idluqurlhlnsuv = (Anonymize) | undefined; +export type I4dhqg6u1p94d9 = { + "assignments": Anonymize; + "end_hint"?: Anonymize; + "pos": number; + "step": number; +}; +export type Id4rj19l8fe7gn = Array>; +export type Ic8ii95e1sb1nk = [BrokerCoretimeInterfaceCoreAssignment, Anonymize]; +export type Ifrejtuk4pctgo = { + "ratio": number; + "remaining": number; +}; +export type I3av628q6dt6mq = { + "manager": SS58String; + "deposit": bigint; + "locked"?: Anonymize; +}; +export type I8ie0dco0kcuq5 = (boolean) | undefined; +export type Ifmaahl40gom3g = Array>; +export type I70iuri2ilha1f = FixedSizeArray<36, Anonymize>; +export type I1qlf98109qt29 = (Anonymize) | undefined; +export type I7fcree6lak6uv = [SS58String, number, bigint]; +export type I6gun5k9fbb4s0 = { + "depositor": SS58String; + "verifier"?: Anonymize; + "deposit": bigint; + "raised": bigint; + "end": number; + "cap": bigint; + "last_contribution": CommonCrowdloanLastContribution; + "first_period": number; + "last_period": number; + "fund_index": number; +}; +export type I21lmi57mmu91l = (MultiSigner) | undefined; +export type MultiSigner = Enum<{ + "Ed25519": FixedSizeBinary<32>; + "Sr25519": FixedSizeBinary<32>; + "Ecdsa": FixedSizeBinary<33>; +}>; +export declare const MultiSigner: GetEnum; +export type CommonCrowdloanLastContribution = Enum<{ + "Never": undefined; + "PreEnding": number; + "Ending": number; +}>; +export declare const CommonCrowdloanLastContribution: GetEnum; +export type If354jrdedj0pj = { + "progress_top": Anonymize; + "progress_child": Anonymize; + "size": number; + "top_items": number; + "child_items": number; +}; +export type I1ufmh6d8psvik = AnonymousEnum<{ + "ToStart": undefined; + "LastKey": Binary; + "Complete": undefined; +}>; +export type Ib17t3992hb64n = (Anonymize) | undefined; +export type I215mkl885p4da = { + "size": number; + "item": number; +}; +export type XcmPalletQueryStatus = Enum<{ + "Pending": Anonymize; + "VersionNotifier": Anonymize; + "Ready": Anonymize; +}>; +export declare const XcmPalletQueryStatus: GetEnum; +export type I9cig2tff0h7a2 = { + "responder": DotXcmVersionedLocation; + "maybe_match_querier"?: Anonymize; + "maybe_notify"?: Anonymize; + "timeout": number; +}; +export type Ichrhugqpl0jbb = (DotXcmVersionedLocation) | undefined; +export type I1faufi0iffstp = (FixedSizeBinary<2>) | undefined; +export type I5c2ss6qk7lue3 = { + "origin": DotXcmVersionedLocation; + "is_active": boolean; +}; +export type I2rikk3g9dnfdf = { + "response": XcmVersionedResponse; + "at": number; +}; +export type XcmVersionedResponse = Enum<{ + "V2": XcmV2Response; + "V3": XcmV3Response; + "V4": XcmV4Response; +}>; +export declare const XcmVersionedResponse: GetEnum; +export type XcmV2Response = Enum<{ + "Null": undefined; + "Assets": Anonymize; + "ExecutionResult"?: Anonymize; + "Version": number; +}>; +export declare const XcmV2Response: GetEnum; +export type Ic6k45vtgiaa1s = (Anonymize) | undefined; +export type Ifg18rrvb5cqli = [number, XcmV2TraitsError]; +export type XcmV2TraitsError = Enum<{ + "Overflow": undefined; + "Unimplemented": undefined; + "UntrustedReserveLocation": undefined; + "UntrustedTeleportLocation": undefined; + "MultiLocationFull": undefined; + "MultiLocationNotInvertible": undefined; + "BadOrigin": undefined; + "InvalidLocation": undefined; + "AssetNotFound": undefined; + "FailedToTransactAsset": undefined; + "NotWithdrawable": undefined; + "LocationCannotHold": undefined; + "ExceedsMaxMessageSize": undefined; + "DestinationUnsupported": undefined; + "Transport": undefined; + "Unroutable": undefined; + "UnknownClaim": undefined; + "FailedToDecode": undefined; + "MaxWeightInvalid": undefined; + "NotHoldingFees": undefined; + "TooExpensive": undefined; + "Trap": bigint; + "UnhandledXcmVersion": undefined; + "WeightLimitReached": bigint; + "Barrier": undefined; + "WeightNotComputable": undefined; +}>; +export declare const XcmV2TraitsError: GetEnum; +export type XcmV3Response = Enum<{ + "Null": undefined; + "Assets": Anonymize; + "ExecutionResult"?: Anonymize; + "Version": number; + "PalletsInfo": Anonymize; + "DispatchResult": XcmV3MaybeErrorCode; +}>; +export declare const XcmV3Response: GetEnum; +export type Ic4qvh5df9s5gp = [number, DotXcmVersionedLocation]; +export type I7vlvrrl2pnbgk = [bigint, Anonymize, number]; +export type I50sjs3s5lud21 = Array>; +export type I6vu59hrif6rva = [DotXcmVersionedLocation, number]; +export type XcmPalletVersionMigrationStage = Enum<{ + "MigrateSupportedVersion": undefined; + "MigrateVersionNotifiers": undefined; + "NotifyCurrentTargets"?: Anonymize; + "MigrateAndNotifyOldTargets": undefined; +}>; +export declare const XcmPalletVersionMigrationStage: GetEnum; +export type I50qp0ij7h62g2 = { + "amount": bigint; + "owner": DotXcmVersionedLocation; + "locker": DotXcmVersionedLocation; + "consumers": Anonymize; +}; +export type I2ia97v5nng96b = Array>; +export type I2a3me3o6q76s8 = [undefined, bigint]; +export type Iteuj23is2ed5 = [number, SS58String, DotXcmVersionedAssetId]; +export type DotXcmVersionedAssetId = Enum<{ + "V3": XcmV3MultiassetAssetId; + "V4": Anonymize; +}>; +export declare const DotXcmVersionedAssetId: GetEnum; +export type I3rp19gb4dadaa = Array>; +export type I4arq5fbf241mq = [bigint, DotXcmVersionedLocation]; +export type I260m120dp9sbk = { + "begin": number; + "end": number; + "count": number; + "ready_neighbours"?: Anonymize; + "message_count": bigint; + "size": bigint; +}; +export type I8lhcj4rckefdi = (Anonymize) | undefined; +export type I9edqr8hi819se = { + "prev": ParachainsInclusionAggregateMessageOrigin; + "next": ParachainsInclusionAggregateMessageOrigin; +}; +export type I53esa2ms463bk = { + "remaining": number; + "remaining_size": number; + "first_index": number; + "first": number; + "last": number; + "heap": Binary; +}; +export type I1lfimt2mpej64 = [ParachainsInclusionAggregateMessageOrigin, number]; +export type I2fb54desdqd9n = Array>; +export type Idjett00s2gd = { + "id": bigint; + "len": number; + "keyset_commitment": FixedSizeBinary<32>; +}; +export type In7a38730s6qs = { + "base_block": Anonymize; + "max_block": Anonymize; + "per_class": Anonymize; +}; +export type I79te2qqsklnbd = { + "normal": Anonymize; + "operational": Anonymize; + "mandatory": Anonymize; +}; +export type Ia78ef0a3p5958 = { + "base_extrinsic": Anonymize; + "max_extrinsic"?: Anonymize; + "max_total"?: Anonymize; + "reserved"?: Anonymize; +}; +export type If15el53dd76v9 = { + "normal": number; + "operational": number; + "mandatory": number; +}; +export type I9s0ave7t0vnrk = { + "read": bigint; + "write": bigint; +}; +export type Ic6nglu2db2c36 = { + "spec_name": string; + "impl_name": string; + "authoring_version": number; + "spec_version": number; + "impl_version": number; + "apis": Anonymize; + "transaction_version": number; + "state_version": number; +}; +export type Ic9hg6pp5pkea5 = Array>; +export type I85u3mm1me217a = [FixedSizeBinary<8>, number]; +export type Ibafpkl9hhno69 = Array>; +export type Ida9vhl30l98p4 = [number, Anonymize]; +export type I6s1tg2sl5nvmp = { + "name": string; + "max_deciding": number; + "decision_deposit": bigint; + "prepare_period": number; + "decision_period": number; + "confirm_period": number; + "min_enactment_period": number; + "min_approval": ReferendaTypesCurve; + "min_support": ReferendaTypesCurve; +}; +export type ReferendaTypesCurve = Enum<{ + "LinearDecreasing": Anonymize; + "SteppedDecreasing": Anonymize; + "Reciprocal": Anonymize; +}>; +export declare const ReferendaTypesCurve: GetEnum; +export type Idcpso832hml3u = { + "length": number; + "floor": number; + "ceil": number; +}; +export type I5qiv0grkufa8l = { + "begin": number; + "end": number; + "step": number; + "period": number; +}; +export type I58l93su2gte4i = { + "factor": bigint; + "x_offset": bigint; + "y_offset": bigint; +}; +export type Iekve0i6djpd9f = AnonymousEnum<{ + /** + *Make some on-chain remark. + * + *Can be executed by every `origin`. + */ + "remark": Anonymize; + /** + *Set the number of pages in the WebAssembly environment's heap. + */ + "set_heap_pages": Anonymize; + /** + *Set the new runtime code. + */ + "set_code": Anonymize; + /** + *Set the new runtime code without doing any checks of the given `code`. + * + *Note that runtime upgrades will not run if this is called with a not-increasing spec + *version! + */ + "set_code_without_checks": Anonymize; + /** + *Set some items of storage. + */ + "set_storage": Anonymize; + /** + *Kill some items from storage. + */ + "kill_storage": Anonymize; + /** + *Kill all storage items with a key that starts with the given prefix. + * + ***NOTE:** We rely on the Root origin to provide us the number of subkeys under + *the prefix we are removing to accurately calculate the weight of this function. + */ + "kill_prefix": Anonymize; + /** + *Make some on-chain remark and emit event. + */ + "remark_with_event": Anonymize; + /** + *Authorize an upgrade to a given `code_hash` for the runtime. The runtime can be supplied + *later. + * + *This call requires Root origin. + */ + "authorize_upgrade": Anonymize; + /** + *Authorize an upgrade to a given `code_hash` for the runtime. The runtime can be supplied + *later. + * + *WARNING: This authorizes an upgrade that will take place without any safety checks, for + *example that the spec name remains the same and that the version number increases. Not + *recommended for normal use. Use `authorize_upgrade` instead. + * + *This call requires Root origin. + */ + "authorize_upgrade_without_checks": Anonymize; + /** + *Provide the preimage (runtime binary) `code` for an upgrade that has been authorized. + * + *If the authorization required a version check, this call will ensure the spec name + *remains unchanged and that the spec version has increased. + * + *Depending on the runtime's `OnSetCode` configuration, this function may directly apply + *the new `code` in the same block or attempt to schedule the upgrade. + * + *All origins are allowed. + */ + "apply_authorized_upgrade": Anonymize; +}>; +export type I8ofcg5rbj0g2c = { + "remark": Binary; +}; +export type I4adgbll7gku4i = { + "pages": bigint; +}; +export type I6pjjpfvhvcfru = { + "code": Binary; +}; +export type I9pj91mj79qekl = { + "items": Anonymize; +}; +export type I6pi5ou8r1hblk = Array>; +export type Idkbvh6dahk1v7 = FixedSizeArray<2, Binary>; +export type I39uah9nss64h9 = { + "keys": Anonymize; +}; +export type Ik64dknsq7k08 = { + "prefix": Binary; + "subkeys": number; +}; +export type Ib51vk42m1po4n = { + "code_hash": FixedSizeBinary<32>; +}; +export type Ieh64eapar6lrn = AnonymousEnum<{ + /** + *Anonymously schedule a task. + */ + "schedule": Anonymize; + /** + *Cancel an anonymously scheduled task. + */ + "cancel": Anonymize; + /** + *Schedule a named task. + */ + "schedule_named": Anonymize; + /** + *Cancel a named scheduled task. + */ + "cancel_named": Anonymize; + /** + *Anonymously schedule a task after a delay. + */ + "schedule_after": Anonymize; + /** + *Schedule a named task after a delay. + */ + "schedule_named_after": Anonymize; + /** + *Set a retry configuration for a task so that, in case its scheduled run fails, it will + *be retried after `period` blocks, for a total amount of `retries` retries or until it + *succeeds. + * + *Tasks which need to be scheduled for a retry are still subject to weight metering and + *agenda space, same as a regular task. If a periodic task fails, it will be scheduled + *normally while the task is retrying. + * + *Tasks scheduled as a result of a retry for a periodic task are unnamed, non-periodic + *clones of the original task. Their retry configuration will be derived from the + *original task's configuration, but will have a lower value for `remaining` than the + *original `total_retries`. + */ + "set_retry": Anonymize; + /** + *Set a retry configuration for a named task so that, in case its scheduled run fails, it + *will be retried after `period` blocks, for a total amount of `retries` retries or until + *it succeeds. + * + *Tasks which need to be scheduled for a retry are still subject to weight metering and + *agenda space, same as a regular task. If a periodic task fails, it will be scheduled + *normally while the task is retrying. + * + *Tasks scheduled as a result of a retry for a periodic task are unnamed, non-periodic + *clones of the original task. Their retry configuration will be derived from the + *original task's configuration, but will have a lower value for `remaining` than the + *original `total_retries`. + */ + "set_retry_named": Anonymize; + /** + *Removes the retry configuration of a task. + */ + "cancel_retry": Anonymize; + /** + *Cancel the retry configuration of a named task. + */ + "cancel_retry_named": Anonymize; +}>; +export type I4ip6ol0gghhtt = { + "when": number; + "maybe_periodic"?: Anonymize; + "priority": number; + "call": TxCallData; +}; +export type Ic1m22rlm0tu62 = { + "id": FixedSizeBinary<32>; + "when": number; + "maybe_periodic"?: Anonymize; + "priority": number; + "call": TxCallData; +}; +export type Ifs1i5fk9cqvr6 = { + "id": FixedSizeBinary<32>; +}; +export type Idhjnad4uvg4fu = { + "after": number; + "maybe_periodic"?: Anonymize; + "priority": number; + "call": TxCallData; +}; +export type I1e44oto040r12 = { + "id": FixedSizeBinary<32>; + "after": number; + "maybe_periodic"?: Anonymize; + "priority": number; + "call": TxCallData; +}; +export type Ieg3fd8p4pkt10 = { + "task": Anonymize; + "retries": number; + "period": number; +}; +export type I8kg5ll427kfqq = { + "id": FixedSizeBinary<32>; + "retries": number; + "period": number; +}; +export type I467333262q1l9 = { + "task": Anonymize; +}; +export type If81ks88t5mpk5 = AnonymousEnum<{ + /** + *Register a preimage on-chain. + * + *If the preimage was previously requested, no fees or deposits are taken for providing + *the preimage. Otherwise, a deposit is taken proportional to the size of the preimage. + */ + "note_preimage": Anonymize; + /** + *Clear an unrequested preimage from the runtime storage. + * + *If `len` is provided, then it will be a much cheaper operation. + * + *- `hash`: The hash of the preimage to be removed from the store. + *- `len`: The length of the preimage of `hash`. + */ + "unnote_preimage": Anonymize; + /** + *Request a preimage be uploaded to the chain without paying any fees or deposits. + * + *If the preimage requests has already been provided on-chain, we unreserve any deposit + *a user may have paid, and take the control of the preimage out of their hands. + */ + "request_preimage": Anonymize; + /** + *Clear a previously made request for a preimage. + * + *NOTE: THIS MUST NOT BE CALLED ON `hash` MORE TIMES THAN `request_preimage`. + */ + "unrequest_preimage": Anonymize; + /** + *Ensure that the a bulk of pre-images is upgraded. + * + *The caller pays no fee if at least 90% of pre-images were successfully updated. + */ + "ensure_updated": Anonymize; +}>; +export type I82nfqfkd48n10 = { + "bytes": Binary; +}; +export type I3o5j3bli1pd8e = { + "hashes": Anonymize; +}; +export type I1jeo0dpbkma5g = AnonymousEnum<{ + /** + *Report authority equivocation/misbehavior. This method will verify + *the equivocation proof and validate the given key ownership proof + *against the extracted offender. If both are valid, the offence will + *be reported. + */ + "report_equivocation": Anonymize; + /** + *Report authority equivocation/misbehavior. This method will verify + *the equivocation proof and validate the given key ownership proof + *against the extracted offender. If both are valid, the offence will + *be reported. + *This extrinsic must be called unsigned and it is expected that only + *block authors will call it (validated in `ValidateUnsigned`), as such + *if the block author is defined it will be defined as the equivocation + *reporter. + */ + "report_equivocation_unsigned": Anonymize; + /** + *Plan an epoch config change. The epoch config change is recorded and will be enacted on + *the next call to `enact_epoch_change`. The config will be activated one epoch after. + *Multiple calls to this method will replace any existing planned config change that had + *not been enacted yet. + */ + "plan_config_change": Anonymize; +}>; +export type I50ppnqasq4tjq = { + "equivocation_proof": Anonymize; + "key_owner_proof": Anonymize; +}; +export type I68ii5ik8avr9o = { + "offender": FixedSizeBinary<32>; + "slot": bigint; + "first_header": Anonymize; + "second_header": Anonymize; +}; +export type Ic952bubvq4k7d = { + "parent_hash": FixedSizeBinary<32>; + "number": number; + "state_root": FixedSizeBinary<32>; + "extrinsics_root": FixedSizeBinary<32>; + "digest": Anonymize; +}; +export type I3ia7aufsoj0l1 = { + "session": number; + "trie_nodes": Anonymize; + "validator_count": number; +}; +export type I9fin09kkg0jaj = { + "config": BabeDigestsNextConfigDescriptor; +}; +export type I7d75gqfg6jh9c = AnonymousEnum<{ + /** + *Set the current time. + * + *This call should be invoked exactly once per block. It will panic at the finalization + *phase, if this call hasn't been invoked by that time. + * + *The timestamp should be greater than the previous one by the amount specified by + *[`Config::MinimumPeriod`]. + * + *The dispatch origin for this call must be _None_. + * + *This dispatch class is _Mandatory_ to ensure it gets executed in the block. Be aware + *that changing the complexity of this call could result exhausting the resources in a + *block to execute any other calls. + * + *## Complexity + *- `O(1)` (Note that implementations of `OnTimestampSet` must also be `O(1)`) + *- 1 storage read and 1 storage mutation (codec `O(1)` because of `DidUpdate::take` in + * `on_finalize`) + *- 1 event handler `on_timestamp_set`. Must be `O(1)`. + */ + "set": Anonymize; +}>; +export type Idcr6u6361oad9 = { + "now": bigint; +}; +export type I66vlm8f4l1oll = AnonymousEnum<{ + /** + *Assign an previously unassigned index. + * + *Payment: `Deposit` is reserved from the sender account. + * + *The dispatch origin for this call must be _Signed_. + * + *- `index`: the index to be claimed. This must not be in use. + * + *Emits `IndexAssigned` if successful. + * + *## Complexity + *- `O(1)`. + */ + "claim": Anonymize; + /** + *Assign an index already owned by the sender to another account. The balance reservation + *is effectively transferred to the new account. + * + *The dispatch origin for this call must be _Signed_. + * + *- `index`: the index to be re-assigned. This must be owned by the sender. + *- `new`: the new owner of the index. This function is a no-op if it is equal to sender. + * + *Emits `IndexAssigned` if successful. + * + *## Complexity + *- `O(1)`. + */ + "transfer": Anonymize; + /** + *Free up an index owned by the sender. + * + *Payment: Any previous deposit placed for the index is unreserved in the sender account. + * + *The dispatch origin for this call must be _Signed_ and the sender must own the index. + * + *- `index`: the index to be freed. This must be owned by the sender. + * + *Emits `IndexFreed` if successful. + * + *## Complexity + *- `O(1)`. + */ + "free": Anonymize; + /** + *Force an index to an account. This doesn't require a deposit. If the index is already + *held, then any deposit is reimbursed to its current owner. + * + *The dispatch origin for this call must be _Root_. + * + *- `index`: the index to be (re-)assigned. + *- `new`: the new owner of the index. This function is a no-op if it is equal to sender. + *- `freeze`: if set to `true`, will freeze the index so it cannot be transferred. + * + *Emits `IndexAssigned` if successful. + * + *## Complexity + *- `O(1)`. + */ + "force_transfer": Anonymize; + /** + *Freeze an index so it will always point to the sender account. This consumes the + *deposit. + * + *The dispatch origin for this call must be _Signed_ and the signing account must have a + *non-frozen account `index`. + * + *- `index`: the index to be frozen in place. + * + *Emits `IndexFrozen` if successful. + * + *## Complexity + *- `O(1)`. + */ + "freeze": Anonymize; +}>; +export type I6o1er683vod1j = { + "new": MultiAddress; + "index": number; +}; +export type MultiAddress = Enum<{ + "Id": SS58String; + "Index": undefined; + "Raw": Binary; + "Address32": FixedSizeBinary<32>; + "Address20": FixedSizeBinary<20>; +}>; +export declare const MultiAddress: GetEnum; +export type I5bq561t4gpfva = { + "new": MultiAddress; + "index": number; + "freeze": boolean; +}; +export type I9svldsp29mh87 = AnonymousEnum<{ + /** + *Transfer some liquid free balance to another account. + * + *`transfer_allow_death` will set the `FreeBalance` of the sender and receiver. + *If the sender's account is below the existential deposit as a result + *of the transfer, the account will be reaped. + * + *The dispatch origin for this call must be `Signed` by the transactor. + */ + "transfer_allow_death": Anonymize; + /** + *Exactly as `transfer_allow_death`, except the origin must be root and the source account + *may be specified. + */ + "force_transfer": Anonymize; + /** + *Same as the [`transfer_allow_death`] call, but with a check that the transfer will not + *kill the origin account. + * + *99% of the time you want [`transfer_allow_death`] instead. + * + *[`transfer_allow_death`]: struct.Pallet.html#method.transfer + */ + "transfer_keep_alive": Anonymize; + /** + *Transfer the entire transferable balance from the caller account. + * + *NOTE: This function only attempts to transfer _transferable_ balances. This means that + *any locked, reserved, or existential deposits (when `keep_alive` is `true`), will not be + *transferred by this function. To ensure that this function results in a killed account, + *you might need to prepare the account by removing any reference counters, storage + *deposits, etc... + * + *The dispatch origin of this call must be Signed. + * + *- `dest`: The recipient of the transfer. + *- `keep_alive`: A boolean to determine if the `transfer_all` operation should send all + * of the funds the account has, causing the sender account to be killed (false), or + * transfer everything except at least the existential deposit, which will guarantee to + * keep the sender account alive (true). + */ + "transfer_all": Anonymize; + /** + *Unreserve some balance from a user by force. + * + *Can only be called by ROOT. + */ + "force_unreserve": Anonymize; + /** + *Upgrade a specified account. + * + *- `origin`: Must be `Signed`. + *- `who`: The account to be upgraded. + * + *This will waive the transaction fee if at least all but 10% of the accounts needed to + *be upgraded. (We let some not have to be upgraded just in order to allow for the + *possibility of churn). + */ + "upgrade_accounts": Anonymize; + /** + *Set the regular balance of a given account. + * + *The dispatch origin for this call is `root`. + */ + "force_set_balance": Anonymize; + /** + *Adjust the total issuance in a saturating way. + * + *Can only be called by root and always needs a positive `delta`. + * + *# Example + */ + "force_adjust_total_issuance": Anonymize; + /** + *Burn the specified liquid free balance from the origin account. + * + *If the origin's account ends up below the existential deposit as a result + *of the burn and `keep_alive` is false, the account will be reaped. + * + *Unlike sending funds to a _burn_ address, which merely makes the funds inaccessible, + *this `burn` operation will reduce total issuance by the amount _burned_. + */ + "burn": Anonymize; +}>; +export type I4ktuaksf5i1gk = { + "dest": MultiAddress; + "value": bigint; +}; +export type I9bqtpv2ii35mp = { + "source": MultiAddress; + "dest": MultiAddress; + "value": bigint; +}; +export type I9j7pagd6d4bda = { + "dest": MultiAddress; + "keep_alive": boolean; +}; +export type I2h9pmio37r7fb = { + "who": MultiAddress; + "amount": bigint; +}; +export type Ibmr18suc9ikh9 = { + "who": Anonymize; +}; +export type I9iq22t0burs89 = { + "who": MultiAddress; + "new_free": bigint; +}; +export type I5u8olqbbvfnvf = { + "direction": BalancesAdjustmentDirection; + "delta": bigint; +}; +export type BalancesAdjustmentDirection = Enum<{ + "Increase": undefined; + "Decrease": undefined; +}>; +export declare const BalancesAdjustmentDirection: GetEnum; +export type I5utcetro501ir = { + "value": bigint; + "keep_alive": boolean; +}; +export type I5jvuh9dlbdd20 = AnonymousEnum<{ + /** + *Take the origin account as a stash and lock up `value` of its balance. `controller` will + *be the account that controls it. + * + *`value` must be more than the `minimum_balance` specified by `T::Currency`. + * + *The dispatch origin for this call must be _Signed_ by the stash account. + * + *Emits `Bonded`. + *## Complexity + *- Independent of the arguments. Moderate complexity. + *- O(1). + *- Three extra DB entries. + * + *NOTE: Two of the storage writes (`Self::bonded`, `Self::payee`) are _never_ cleaned + *unless the `origin` falls below _existential deposit_ (or equal to 0) and gets removed + *as dust. + */ + "bond": Anonymize; + /** + *Add some extra amount that have appeared in the stash `free_balance` into the balance up + *for staking. + * + *The dispatch origin for this call must be _Signed_ by the stash, not the controller. + * + *Use this if there are additional funds in your stash account that you wish to bond. + *Unlike [`bond`](Self::bond) or [`unbond`](Self::unbond) this function does not impose + *any limitation on the amount that can be added. + * + *Emits `Bonded`. + * + *## Complexity + *- Independent of the arguments. Insignificant complexity. + *- O(1). + */ + "bond_extra": Anonymize; + /** + *Schedule a portion of the stash to be unlocked ready for transfer out after the bond + *period ends. If this leaves an amount actively bonded less than + *T::Currency::minimum_balance(), then it is increased to the full amount. + * + *The dispatch origin for this call must be _Signed_ by the controller, not the stash. + * + *Once the unlock period is done, you can call `withdraw_unbonded` to actually move + *the funds out of management ready for transfer. + * + *No more than a limited number of unlocking chunks (see `MaxUnlockingChunks`) + *can co-exists at the same time. If there are no unlocking chunks slots available + *[`Call::withdraw_unbonded`] is called to remove some of the chunks (if possible). + * + *If a user encounters the `InsufficientBond` error when calling this extrinsic, + *they should call `chill` first in order to free up their bonded funds. + * + *Emits `Unbonded`. + * + *See also [`Call::withdraw_unbonded`]. + */ + "unbond": Anonymize; + /** + *Remove any unlocked chunks from the `unlocking` queue from our management. + * + *This essentially frees up that balance to be used by the stash account to do whatever + *it wants. + * + *The dispatch origin for this call must be _Signed_ by the controller. + * + *Emits `Withdrawn`. + * + *See also [`Call::unbond`]. + * + *## Parameters + * + *- `num_slashing_spans` indicates the number of metadata slashing spans to clear when + *this call results in a complete removal of all the data related to the stash account. + *In this case, the `num_slashing_spans` must be larger or equal to the number of + *slashing spans associated with the stash account in the [`SlashingSpans`] storage type, + *otherwise the call will fail. The call weight is directly proportional to + *`num_slashing_spans`. + * + *## Complexity + *O(S) where S is the number of slashing spans to remove + *NOTE: Weight annotation is the kill scenario, we refund otherwise. + */ + "withdraw_unbonded": Anonymize; + /** + *Declare the desire to validate for the origin controller. + * + *Effects will be felt at the beginning of the next era. + * + *The dispatch origin for this call must be _Signed_ by the controller, not the stash. + */ + "validate": Anonymize; + /** + *Declare the desire to nominate `targets` for the origin controller. + * + *Effects will be felt at the beginning of the next era. + * + *The dispatch origin for this call must be _Signed_ by the controller, not the stash. + * + *## Complexity + *- The transaction's complexity is proportional to the size of `targets` (N) + *which is capped at CompactAssignments::LIMIT (T::MaxNominations). + *- Both the reads and writes follow a similar pattern. + */ + "nominate": Anonymize; + /** + *Declare no desire to either validate or nominate. + * + *Effects will be felt at the beginning of the next era. + * + *The dispatch origin for this call must be _Signed_ by the controller, not the stash. + * + *## Complexity + *- Independent of the arguments. Insignificant complexity. + *- Contains one read. + *- Writes are limited to the `origin` account key. + */ + "chill": undefined; + /** + *(Re-)set the payment target for a controller. + * + *Effects will be felt instantly (as soon as this function is completed successfully). + * + *The dispatch origin for this call must be _Signed_ by the controller, not the stash. + * + *## Complexity + *- O(1) + *- Independent of the arguments. Insignificant complexity. + *- Contains a limited number of reads. + *- Writes are limited to the `origin` account key. + *--------- + */ + "set_payee": Anonymize; + /** + *(Re-)sets the controller of a stash to the stash itself. This function previously + *accepted a `controller` argument to set the controller to an account other than the + *stash itself. This functionality has now been removed, now only setting the controller + *to the stash, if it is not already. + * + *Effects will be felt instantly (as soon as this function is completed successfully). + * + *The dispatch origin for this call must be _Signed_ by the stash, not the controller. + * + *## Complexity + *O(1) + *- Independent of the arguments. Insignificant complexity. + *- Contains a limited number of reads. + *- Writes are limited to the `origin` account key. + */ + "set_controller": undefined; + /** + *Sets the ideal number of validators. + * + *The dispatch origin must be Root. + * + *## Complexity + *O(1) + */ + "set_validator_count": Anonymize; + /** + *Increments the ideal number of validators up to maximum of + *`ElectionProviderBase::MaxWinners`. + * + *The dispatch origin must be Root. + * + *## Complexity + *Same as [`Self::set_validator_count`]. + */ + "increase_validator_count": Anonymize; + /** + *Scale up the ideal number of validators by a factor up to maximum of + *`ElectionProviderBase::MaxWinners`. + * + *The dispatch origin must be Root. + * + *## Complexity + *Same as [`Self::set_validator_count`]. + */ + "scale_validator_count": Anonymize; + /** + *Force there to be no new eras indefinitely. + * + *The dispatch origin must be Root. + * + *# Warning + * + *The election process starts multiple blocks before the end of the era. + *Thus the election process may be ongoing when this is called. In this case the + *election will continue until the next era is triggered. + * + *## Complexity + *- No arguments. + *- Weight: O(1) + */ + "force_no_eras": undefined; + /** + *Force there to be a new era at the end of the next session. After this, it will be + *reset to normal (non-forced) behaviour. + * + *The dispatch origin must be Root. + * + *# Warning + * + *The election process starts multiple blocks before the end of the era. + *If this is called just before a new era is triggered, the election process may not + *have enough blocks to get a result. + * + *## Complexity + *- No arguments. + *- Weight: O(1) + */ + "force_new_era": undefined; + /** + *Set the validators who cannot be slashed (if any). + * + *The dispatch origin must be Root. + */ + "set_invulnerables": Anonymize; + /** + *Force a current staker to become completely unstaked, immediately. + * + *The dispatch origin must be Root. + * + *## Parameters + * + *- `num_slashing_spans`: Refer to comments on [`Call::withdraw_unbonded`] for more + *details. + */ + "force_unstake": Anonymize; + /** + *Force there to be a new era at the end of sessions indefinitely. + * + *The dispatch origin must be Root. + * + *# Warning + * + *The election process starts multiple blocks before the end of the era. + *If this is called just before a new era is triggered, the election process may not + *have enough blocks to get a result. + */ + "force_new_era_always": undefined; + /** + *Cancel enactment of a deferred slash. + * + *Can be called by the `T::AdminOrigin`. + * + *Parameters: era and indices of the slashes for that era to kill. + */ + "cancel_deferred_slash": Anonymize; + /** + *Pay out next page of the stakers behind a validator for the given era. + * + *- `validator_stash` is the stash account of the validator. + *- `era` may be any era between `[current_era - history_depth; current_era]`. + * + *The origin of this call must be _Signed_. Any account can call this function, even if + *it is not one of the stakers. + * + *The reward payout could be paged in case there are too many nominators backing the + *`validator_stash`. This call will payout unpaid pages in an ascending order. To claim a + *specific page, use `payout_stakers_by_page`.` + * + *If all pages are claimed, it returns an error `InvalidPage`. + */ + "payout_stakers": Anonymize; + /** + *Rebond a portion of the stash scheduled to be unlocked. + * + *The dispatch origin must be signed by the controller. + * + *## Complexity + *- Time complexity: O(L), where L is unlocking chunks + *- Bounded by `MaxUnlockingChunks`. + */ + "rebond": Anonymize; + /** + *Remove all data structures concerning a staker/stash once it is at a state where it can + *be considered `dust` in the staking system. The requirements are: + * + *1. the `total_balance` of the stash is below existential deposit. + *2. or, the `ledger.total` of the stash is below existential deposit. + *3. or, existential deposit is zero and either `total_balance` or `ledger.total` is zero. + * + *The former can happen in cases like a slash; the latter when a fully unbonded account + *is still receiving staking rewards in `RewardDestination::Staked`. + * + *It can be called by anyone, as long as `stash` meets the above requirements. + * + *Refunds the transaction fees upon successful execution. + * + *## Parameters + * + *- `num_slashing_spans`: Refer to comments on [`Call::withdraw_unbonded`] for more + *details. + */ + "reap_stash": Anonymize; + /** + *Remove the given nominations from the calling validator. + * + *Effects will be felt at the beginning of the next era. + * + *The dispatch origin for this call must be _Signed_ by the controller, not the stash. + * + *- `who`: A list of nominator stash accounts who are nominating this validator which + * should no longer be nominating this validator. + * + *Note: Making this call only makes sense if you first set the validator preferences to + *block any further nominations. + */ + "kick": Anonymize; + /** + *Update the various staking configurations . + * + ** `min_nominator_bond`: The minimum active bond needed to be a nominator. + ** `min_validator_bond`: The minimum active bond needed to be a validator. + ** `max_nominator_count`: The max number of users who can be a nominator at once. When + * set to `None`, no limit is enforced. + ** `max_validator_count`: The max number of users who can be a validator at once. When + * set to `None`, no limit is enforced. + ** `chill_threshold`: The ratio of `max_nominator_count` or `max_validator_count` which + * should be filled in order for the `chill_other` transaction to work. + ** `min_commission`: The minimum amount of commission that each validators must maintain. + * This is checked only upon calling `validate`. Existing validators are not affected. + * + *RuntimeOrigin must be Root to call this function. + * + *NOTE: Existing nominators and validators will not be affected by this update. + *to kick people under the new limits, `chill_other` should be called. + */ + "set_staking_configs": Anonymize; + /** + *Declare a `controller` to stop participating as either a validator or nominator. + * + *Effects will be felt at the beginning of the next era. + * + *The dispatch origin for this call must be _Signed_, but can be called by anyone. + * + *If the caller is the same as the controller being targeted, then no further checks are + *enforced, and this function behaves just like `chill`. + * + *If the caller is different than the controller being targeted, the following conditions + *must be met: + * + ** `controller` must belong to a nominator who has become non-decodable, + * + *Or: + * + ** A `ChillThreshold` must be set and checked which defines how close to the max + * nominators or validators we must reach before users can start chilling one-another. + ** A `MaxNominatorCount` and `MaxValidatorCount` must be set which is used to determine + * how close we are to the threshold. + ** A `MinNominatorBond` and `MinValidatorBond` must be set and checked, which determines + * if this is a person that should be chilled because they have not met the threshold + * bond required. + * + *This can be helpful if bond requirements are updated, and we need to remove old users + *who do not satisfy these requirements. + */ + "chill_other": Anonymize; + /** + *Force a validator to have at least the minimum commission. This will not affect a + *validator who already has a commission greater than or equal to the minimum. Any account + *can call this. + */ + "force_apply_min_commission": Anonymize; + /** + *Sets the minimum amount of commission that each validators must maintain. + * + *This call has lower privilege requirements than `set_staking_config` and can be called + *by the `T::AdminOrigin`. Root can always call this. + */ + "set_min_commission": Anonymize; + /** + *Pay out a page of the stakers behind a validator for the given era and page. + * + *- `validator_stash` is the stash account of the validator. + *- `era` may be any era between `[current_era - history_depth; current_era]`. + *- `page` is the page index of nominators to pay out with value between 0 and + * `num_nominators / T::MaxExposurePageSize`. + * + *The origin of this call must be _Signed_. Any account can call this function, even if + *it is not one of the stakers. + * + *If a validator has more than [`Config::MaxExposurePageSize`] nominators backing + *them, then the list of nominators is paged, with each page being capped at + *[`Config::MaxExposurePageSize`.] If a validator has more than one page of nominators, + *the call needs to be made for each page separately in order for all the nominators + *backing a validator to receive the reward. The nominators are not sorted across pages + *and so it should not be assumed the highest staker would be on the topmost page and vice + *versa. If rewards are not claimed in [`Config::HistoryDepth`] eras, they are lost. + */ + "payout_stakers_by_page": Anonymize; + /** + *Migrates an account's `RewardDestination::Controller` to + *`RewardDestination::Account(controller)`. + * + *Effects will be felt instantly (as soon as this function is completed successfully). + * + *This will waive the transaction fee if the `payee` is successfully migrated. + */ + "update_payee": Anonymize; + /** + *Updates a batch of controller accounts to their corresponding stash account if they are + *not the same. Ignores any controller accounts that do not exist, and does not operate if + *the stash and controller are already the same. + * + *Effects will be felt instantly (as soon as this function is completed successfully). + * + *The dispatch origin must be `T::AdminOrigin`. + */ + "deprecate_controller_batch": Anonymize; + /** + *Restores the state of a ledger which is in an inconsistent state. + * + *The requirements to restore a ledger are the following: + ** The stash is bonded; or + ** The stash is not bonded but it has a staking lock left behind; or + ** If the stash has an associated ledger and its state is inconsistent; or + ** If the ledger is not corrupted *but* its staking lock is out of sync. + * + *The `maybe_*` input parameters will overwrite the corresponding data and metadata of the + *ledger associated with the stash. If the input parameters are not set, the ledger will + *be reset values from on-chain state. + */ + "restore_ledger": Anonymize; +}>; +export type I2eip8tc75dpje = { + "value": bigint; + "payee": StakingRewardDestination; +}; +export type I564va64vtidbq = { + "max_additional": bigint; +}; +export type I328av3j0bgmjb = { + "num_slashing_spans": number; +}; +export type I4tuqm9ato907i = { + "prefs": Anonymize; +}; +export type Iagi89qt4h1lqg = { + "targets": Anonymize; +}; +export type I28gn91b2ttnbk = Array; +export type I9dgmcnuamt5p8 = { + "payee": StakingRewardDestination; +}; +export type I3vh014cqgmrfd = { + "new": number; +}; +export type Ifhs60omlhvt3 = { + "additional": number; +}; +export type If34udpd5e57vi = { + "factor": number; +}; +export type I39t01nnod9109 = { + "invulnerables": Anonymize; +}; +export type Ie5vbnd9198quk = { + "stash": SS58String; + "num_slashing_spans": number; +}; +export type I3h6murn8bd4v5 = { + "era": number; + "slash_indices": Anonymize; +}; +export type I6k6jf8ncesuu3 = { + "validator_stash": SS58String; + "era": number; +}; +export type I3qhk481i120pk = { + "who": Anonymize; +}; +export type If1qr0kbbl298c = { + "min_nominator_bond": StakingPalletConfigOpBig; + "min_validator_bond": StakingPalletConfigOpBig; + "max_nominator_count": StakingPalletConfigOp; + "max_validator_count": StakingPalletConfigOp; + "chill_threshold": StakingPalletConfigOp; + "min_commission": StakingPalletConfigOp; + "max_staked_rewards": StakingPalletConfigOp; +}; +export type StakingPalletConfigOpBig = Enum<{ + "Noop": undefined; + "Set": bigint; + "Remove": undefined; +}>; +export declare const StakingPalletConfigOpBig: GetEnum; +export type StakingPalletConfigOp = Enum<{ + "Noop": undefined; + "Set": number; + "Remove": undefined; +}>; +export declare const StakingPalletConfigOp: GetEnum; +export type I5ont0141q9ss5 = { + "validator_stash": SS58String; +}; +export type Ie6j49utvii126 = { + "validator_stash": SS58String; + "era": number; + "page": number; +}; +export type I3v6ks33uluhnj = { + "controller": SS58String; +}; +export type I3kiiim1cds68i = { + "controllers": Anonymize; +}; +export type I4k60mkh2r6jjg = { + "stash": SS58String; + "maybe_controller"?: Anonymize; + "maybe_total"?: Anonymize; + "maybe_unlocking"?: Anonymize; +}; +export type I7m7tbddr7qika = (Anonymize) | undefined; +export type Iceajactc9a8pc = AnonymousEnum<{ + /** + *Sets the session key(s) of the function caller to `keys`. + *Allows an account to set its session key prior to becoming a validator. + *This doesn't take effect until the next session. + * + *The dispatch origin of this function must be signed. + * + *## Complexity + *- `O(1)`. Actual cost depends on the number of length of `T::Keys::key_ids()` which is + * fixed. + */ + "set_keys": Anonymize; + /** + *Removes any session key(s) of the function caller. + * + *This doesn't take effect until the next session. + * + *The dispatch origin of this function must be Signed and the account must be either be + *convertible to a validator ID using the chain's typical addressing system (this usually + *means being a controller account) or directly convertible into a validator ID (which + *usually means being a stash account). + * + *## Complexity + *- `O(1)` in number of key types. Actual cost depends on the number of length of + * `T::Keys::key_ids()` which is fixed. + */ + "purge_keys": undefined; +}>; +export type I5oi8saufice6j = { + "keys": Anonymize; + "proof": Binary; +}; +export type I5u9ggmn8umfqm = AnonymousEnum<{ + /** + *Report voter equivocation/misbehavior. This method will verify the + *equivocation proof and validate the given key ownership proof + *against the extracted offender. If both are valid, the offence + *will be reported. + */ + "report_equivocation": Anonymize; + /** + *Report voter equivocation/misbehavior. This method will verify the + *equivocation proof and validate the given key ownership proof + *against the extracted offender. If both are valid, the offence + *will be reported. + * + *This extrinsic must be called unsigned and it is expected that only + *block authors will call it (validated in `ValidateUnsigned`), as such + *if the block author is defined it will be defined as the equivocation + *reporter. + */ + "report_equivocation_unsigned": Anonymize; + /** + *Note that the current authority set of the GRANDPA finality gadget has stalled. + * + *This will trigger a forced authority set change at the beginning of the next session, to + *be enacted `delay` blocks after that. The `delay` should be high enough to safely assume + *that the block signalling the forced change will not be re-orged e.g. 1000 blocks. + *The block production rate (which may be slowed down because of finality lagging) should + *be taken into account when choosing the `delay`. The GRANDPA voters based on the new + *authority will start voting on top of `best_finalized_block_number` for new finalized + *blocks. `best_finalized_block_number` should be the highest of the latest finalized + *block of all validators of the new authority set. + * + *Only callable by root. + */ + "note_stalled": Anonymize; +}>; +export type I7ne83r38c2sqq = { + "equivocation_proof": Anonymize; + "key_owner_proof": Anonymize; +}; +export type I9puqgoda8ofk4 = { + "set_id": bigint; + "equivocation": GrandpaEquivocation; +}; +export type GrandpaEquivocation = Enum<{ + "Prevote": Anonymize; + "Precommit": Anonymize; +}>; +export declare const GrandpaEquivocation: GetEnum; +export type Iffg6i636v53qr = { + "round_number": bigint; + "identity": FixedSizeBinary<32>; + "first": Anonymize; + "second": Anonymize; +}; +export type Iam04b2ivtl2nh = [Anonymize, FixedSizeBinary<64>]; +export type I8e06chr1md241 = { + "target_hash": FixedSizeBinary<32>; + "target_number": number; +}; +export type I2hviml3snvhhn = { + "delay": number; + "best_finalized_block_number": number; +}; +export type I1s28h18nhih63 = AnonymousEnum<{ + /** + *Propose and approve a spend of treasury funds. + * + *## Dispatch Origin + * + *Must be [`Config::SpendOrigin`] with the `Success` value being at least `amount`. + * + *### Details + *NOTE: For record-keeping purposes, the proposer is deemed to be equivalent to the + *beneficiary. + * + *### Parameters + *- `amount`: The amount to be transferred from the treasury to the `beneficiary`. + *- `beneficiary`: The destination account for the transfer. + * + *## Events + * + *Emits [`Event::SpendApproved`] if successful. + */ + "spend_local": Anonymize; + /** + *Force a previously approved proposal to be removed from the approval queue. + * + *## Dispatch Origin + * + *Must be [`Config::RejectOrigin`]. + * + *## Details + * + *The original deposit will no longer be returned. + * + *### Parameters + *- `proposal_id`: The index of a proposal + * + *### Complexity + *- O(A) where `A` is the number of approvals + * + *### Errors + *- [`Error::ProposalNotApproved`]: The `proposal_id` supplied was not found in the + * approval queue, i.e., the proposal has not been approved. This could also mean the + * proposal does not exist altogether, thus there is no way it would have been approved + * in the first place. + */ + "remove_approval": Anonymize; + /** + *Propose and approve a spend of treasury funds. + * + *## Dispatch Origin + * + *Must be [`Config::SpendOrigin`] with the `Success` value being at least + *`amount` of `asset_kind` in the native asset. The amount of `asset_kind` is converted + *for assertion using the [`Config::BalanceConverter`]. + * + *## Details + * + *Create an approved spend for transferring a specific `amount` of `asset_kind` to a + *designated beneficiary. The spend must be claimed using the `payout` dispatchable within + *the [`Config::PayoutPeriod`]. + * + *### Parameters + *- `asset_kind`: An indicator of the specific asset class to be spent. + *- `amount`: The amount to be transferred from the treasury to the `beneficiary`. + *- `beneficiary`: The beneficiary of the spend. + *- `valid_from`: The block number from which the spend can be claimed. It can refer to + * the past if the resulting spend has not yet expired according to the + * [`Config::PayoutPeriod`]. If `None`, the spend can be claimed immediately after + * approval. + * + *## Events + * + *Emits [`Event::AssetSpendApproved`] if successful. + */ + "spend": Anonymize; + /** + *Claim a spend. + * + *## Dispatch Origin + * + *Must be signed + * + *## Details + * + *Spends must be claimed within some temporal bounds. A spend may be claimed within one + *[`Config::PayoutPeriod`] from the `valid_from` block. + *In case of a payout failure, the spend status must be updated with the `check_status` + *dispatchable before retrying with the current function. + * + *### Parameters + *- `index`: The spend index. + * + *## Events + * + *Emits [`Event::Paid`] if successful. + */ + "payout": Anonymize; + /** + *Check the status of the spend and remove it from the storage if processed. + * + *## Dispatch Origin + * + *Must be signed. + * + *## Details + * + *The status check is a prerequisite for retrying a failed payout. + *If a spend has either succeeded or expired, it is removed from the storage by this + *function. In such instances, transaction fees are refunded. + * + *### Parameters + *- `index`: The spend index. + * + *## Events + * + *Emits [`Event::PaymentFailed`] if the spend payout has failed. + *Emits [`Event::SpendProcessed`] if the spend payout has succeed. + */ + "check_status": Anonymize; + /** + *Void previously approved spend. + * + *## Dispatch Origin + * + *Must be [`Config::RejectOrigin`]. + * + *## Details + * + *A spend void is only possible if the payout has not been attempted yet. + * + *### Parameters + *- `index`: The spend index. + * + *## Events + * + *Emits [`Event::AssetSpendVoided`] if successful. + */ + "void_spend": Anonymize; +}>; +export type Icnrv1mfbd3in1 = { + "amount": bigint; + "beneficiary": MultiAddress; +}; +export type Icm9m0qeemu66d = { + "proposal_id": number; +}; +export type Ibv74ul0c0qf0f = { + "asset_kind": VersionedLocatableAsset; + "amount": bigint; + "beneficiary": DotXcmVersionedLocation; + "valid_from"?: Anonymize; +}; +export type Ie5kd08tutk56t = AnonymousEnum<{ + /** + *Vote in a poll. If `vote.is_aye()`, the vote is to enact the proposal; + *otherwise it is a vote to keep the status quo. + * + *The dispatch origin of this call must be _Signed_. + * + *- `poll_index`: The index of the poll to vote for. + *- `vote`: The vote configuration. + * + *Weight: `O(R)` where R is the number of polls the voter has voted on. + */ + "vote": Anonymize; + /** + *Delegate the voting power (with some given conviction) of the sending account for a + *particular class of polls. + * + *The balance delegated is locked for as long as it's delegated, and thereafter for the + *time appropriate for the conviction's lock period. + * + *The dispatch origin of this call must be _Signed_, and the signing account must either: + * - be delegating already; or + * - have no voting activity (if there is, then it will need to be removed through + * `remove_vote`). + * + *- `to`: The account whose voting the `target` account's voting power will follow. + *- `class`: The class of polls to delegate. To delegate multiple classes, multiple calls + * to this function are required. + *- `conviction`: The conviction that will be attached to the delegated votes. When the + * account is undelegated, the funds will be locked for the corresponding period. + *- `balance`: The amount of the account's balance to be used in delegating. This must not + * be more than the account's current balance. + * + *Emits `Delegated`. + * + *Weight: `O(R)` where R is the number of polls the voter delegating to has + * voted on. Weight is initially charged as if maximum votes, but is refunded later. + */ + "delegate": Anonymize; + /** + *Undelegate the voting power of the sending account for a particular class of polls. + * + *Tokens may be unlocked following once an amount of time consistent with the lock period + *of the conviction with which the delegation was issued has passed. + * + *The dispatch origin of this call must be _Signed_ and the signing account must be + *currently delegating. + * + *- `class`: The class of polls to remove the delegation from. + * + *Emits `Undelegated`. + * + *Weight: `O(R)` where R is the number of polls the voter delegating to has + * voted on. Weight is initially charged as if maximum votes, but is refunded later. + */ + "undelegate": Anonymize; + /** + *Remove the lock caused by prior voting/delegating which has expired within a particular + *class. + * + *The dispatch origin of this call must be _Signed_. + * + *- `class`: The class of polls to unlock. + *- `target`: The account to remove the lock on. + * + *Weight: `O(R)` with R number of vote of target. + */ + "unlock": Anonymize; + /** + *Remove a vote for a poll. + * + *If: + *- the poll was cancelled, or + *- the poll is ongoing, or + *- the poll has ended such that + * - the vote of the account was in opposition to the result; or + * - there was no conviction to the account's vote; or + * - the account made a split vote + *...then the vote is removed cleanly and a following call to `unlock` may result in more + *funds being available. + * + *If, however, the poll has ended and: + *- it finished corresponding to the vote of the account, and + *- the account made a standard vote with conviction, and + *- the lock period of the conviction is not over + *...then the lock will be aggregated into the overall account's lock, which may involve + **overlocking* (where the two locks are combined into a single lock that is the maximum + *of both the amount locked and the time is it locked for). + * + *The dispatch origin of this call must be _Signed_, and the signer must have a vote + *registered for poll `index`. + * + *- `index`: The index of poll of the vote to be removed. + *- `class`: Optional parameter, if given it indicates the class of the poll. For polls + * which have finished or are cancelled, this must be `Some`. + * + *Weight: `O(R + log R)` where R is the number of polls that `target` has voted on. + * Weight is calculated for the maximum number of vote. + */ + "remove_vote": Anonymize; + /** + *Remove a vote for a poll. + * + *If the `target` is equal to the signer, then this function is exactly equivalent to + *`remove_vote`. If not equal to the signer, then the vote must have expired, + *either because the poll was cancelled, because the voter lost the poll or + *because the conviction period is over. + * + *The dispatch origin of this call must be _Signed_. + * + *- `target`: The account of the vote to be removed; this account must have voted for poll + * `index`. + *- `index`: The index of poll of the vote to be removed. + *- `class`: The class of the poll. + * + *Weight: `O(R + log R)` where R is the number of polls that `target` has voted on. + * Weight is calculated for the maximum number of vote. + */ + "remove_other_vote": Anonymize; +}>; +export type Idnsr2pndm36h0 = { + "poll_index": number; + "vote": ConvictionVotingVoteAccountVote; +}; +export type Ia1pvdcbhuqf8m = { + "class": number; + "to": MultiAddress; + "conviction": VotingConviction; + "balance": bigint; +}; +export type I8steo882k7qns = { + "class": number; +}; +export type I4pa4q37gj6fua = { + "class": number; + "target": MultiAddress; +}; +export type I5f178ab6b89t3 = { + "class"?: Anonymize; + "index": number; +}; +export type I4nakhtbsk3c5s = { + "target": MultiAddress; + "class": number; + "index": number; +}; +export type I657vbelok0a1m = AnonymousEnum<{ + /** + *Propose a referendum on a privileged action. + * + *- `origin`: must be `SubmitOrigin` and the account must have `SubmissionDeposit` funds + * available. + *- `proposal_origin`: The origin from which the proposal should be executed. + *- `proposal`: The proposal. + *- `enactment_moment`: The moment that the proposal should be enacted. + * + *Emits `Submitted`. + */ + "submit": Anonymize; + /** + *Post the Decision Deposit for a referendum. + * + *- `origin`: must be `Signed` and the account must have funds available for the + * referendum's track's Decision Deposit. + *- `index`: The index of the submitted referendum whose Decision Deposit is yet to be + * posted. + * + *Emits `DecisionDepositPlaced`. + */ + "place_decision_deposit": Anonymize; + /** + *Refund the Decision Deposit for a closed referendum back to the depositor. + * + *- `origin`: must be `Signed` or `Root`. + *- `index`: The index of a closed referendum whose Decision Deposit has not yet been + * refunded. + * + *Emits `DecisionDepositRefunded`. + */ + "refund_decision_deposit": Anonymize; + /** + *Cancel an ongoing referendum. + * + *- `origin`: must be the `CancelOrigin`. + *- `index`: The index of the referendum to be cancelled. + * + *Emits `Cancelled`. + */ + "cancel": Anonymize; + /** + *Cancel an ongoing referendum and slash the deposits. + * + *- `origin`: must be the `KillOrigin`. + *- `index`: The index of the referendum to be cancelled. + * + *Emits `Killed` and `DepositSlashed`. + */ + "kill": Anonymize; + /** + *Advance a referendum onto its next logical state. Only used internally. + * + *- `origin`: must be `Root`. + *- `index`: the referendum to be advanced. + */ + "nudge_referendum": Anonymize; + /** + *Advance a track onto its next logical state. Only used internally. + * + *- `origin`: must be `Root`. + *- `track`: the track to be advanced. + * + *Action item for when there is now one fewer referendum in the deciding phase and the + *`DecidingCount` is not yet updated. This means that we should either: + *- begin deciding another referendum (and leave `DecidingCount` alone); or + *- decrement `DecidingCount`. + */ + "one_fewer_deciding": Anonymize; + /** + *Refund the Submission Deposit for a closed referendum back to the depositor. + * + *- `origin`: must be `Signed` or `Root`. + *- `index`: The index of a closed referendum whose Submission Deposit has not yet been + * refunded. + * + *Emits `SubmissionDepositRefunded`. + */ + "refund_submission_deposit": Anonymize; + /** + *Set or clear metadata of a referendum. + * + *Parameters: + *- `origin`: Must be `Signed` by a creator of a referendum or by anyone to clear a + * metadata of a finished referendum. + *- `index`: The index of a referendum to set or clear metadata for. + *- `maybe_hash`: The hash of an on-chain stored preimage. `None` to clear a metadata. + */ + "set_metadata": Anonymize; +}>; +export type Ici1c3ahlkpcj1 = { + "proposal_origin": PolkadotRuntimeOriginCaller; + "proposal": PreimagesBounded; + "enactment_moment": TraitsScheduleDispatchTime; +}; +export type Icbio0e1f0034b = { + "track": number; +}; +export type I8c0vkqjjipnuj = { + "index": number; + "maybe_hash"?: Anonymize; +}; +export type I970d74tbkf661 = AnonymousEnum<{ + "whitelist_call": Anonymize; + "remove_whitelisted_call": Anonymize; + "dispatch_whitelisted_call": Anonymize; + "dispatch_whitelisted_call_with_preimage": Anonymize; +}>; +export type Ibf6ucefn8fh49 = { + "call_hash": FixedSizeBinary<32>; + "call_encoded_len": number; + "call_weight_witness": Anonymize; +}; +export type I77087oirkh329 = { + "call": TxCallData; +}; +export type Ic5v5ffa0cr70p = AnonymousEnum<{ + /** + *Set the value of a parameter. + * + *The dispatch origin of this call must be `AdminOrigin` for the given `key`. Values be + *deleted by setting them to `None`. + */ + "set_parameter": Anonymize; +}>; +export type I9j2r9vmc9atsu = { + "key_value": Anonymize; +}; +export type I7slmng9jp7jrk = AnonymousEnum<{ + "Inflation": Anonymize; +}>; +export type I5t0545elr3mi1 = AnonymousEnum<{ + "MinInflation": Anonymize; + "MaxInflation": Anonymize; + "IdealStake": Anonymize; + "Falloff": Anonymize; + "UseAuctionSlots": Anonymize; +}>; +export type Ia023ofm66k1pj = FixedSizeArray<1, Anonymize>; +export type I4801gitve39vo = FixedSizeArray<1, Anonymize>; +export type Id0dj18ct09hlp = AnonymousEnum<{ + /** + *Make a claim to collect your DOTs. + * + *The dispatch origin for this call must be _None_. + * + *Unsigned Validation: + *A call to claim is deemed valid if the signature provided matches + *the expected signed message of: + * + *> Ethereum Signed Message: + *> (configured prefix string)(address) + * + *and `address` matches the `dest` account. + * + *Parameters: + *- `dest`: The destination account to payout the claim. + *- `ethereum_signature`: The signature of an ethereum signed message matching the format + * described above. + * + * + *The weight of this call is invariant over the input parameters. + *Weight includes logic to validate unsigned `claim` call. + * + *Total Complexity: O(1) + * + */ + "claim": Anonymize; + /** + *Mint a new claim to collect DOTs. + * + *The dispatch origin for this call must be _Root_. + * + *Parameters: + *- `who`: The Ethereum address allowed to collect this claim. + *- `value`: The number of DOTs that will be claimed. + *- `vesting_schedule`: An optional vesting schedule for these DOTs. + * + * + *The weight of this call is invariant over the input parameters. + *We assume worst case that both vesting and statement is being inserted. + * + *Total Complexity: O(1) + * + */ + "mint_claim": Anonymize; + /** + *Make a claim to collect your DOTs by signing a statement. + * + *The dispatch origin for this call must be _None_. + * + *Unsigned Validation: + *A call to `claim_attest` is deemed valid if the signature provided matches + *the expected signed message of: + * + *> Ethereum Signed Message: + *> (configured prefix string)(address)(statement) + * + *and `address` matches the `dest` account; the `statement` must match that which is + *expected according to your purchase arrangement. + * + *Parameters: + *- `dest`: The destination account to payout the claim. + *- `ethereum_signature`: The signature of an ethereum signed message matching the format + * described above. + *- `statement`: The identity of the statement which is being attested to in the + * signature. + * + * + *The weight of this call is invariant over the input parameters. + *Weight includes logic to validate unsigned `claim_attest` call. + * + *Total Complexity: O(1) + * + */ + "claim_attest": Anonymize; + /** + *Attest to a statement, needed to finalize the claims process. + * + *WARNING: Insecure unless your chain includes `PrevalidateAttests` as a + *`SignedExtension`. + * + *Unsigned Validation: + *A call to attest is deemed valid if the sender has a `Preclaim` registered + *and provides a `statement` which is expected for the account. + * + *Parameters: + *- `statement`: The identity of the statement which is being attested to in the + * signature. + * + * + *The weight of this call is invariant over the input parameters. + *Weight includes logic to do pre-validation on `attest` call. + * + *Total Complexity: O(1) + * + */ + "attest": Anonymize; + "move_claim": Anonymize; +}>; +export type I6uag8j5aql8q = { + "dest": SS58String; + "ethereum_signature": FixedSizeBinary<65>; +}; +export type Isq3k9rh2c0l4 = { + "who": FixedSizeBinary<20>; + "value": bigint; + "vesting_schedule"?: Anonymize; + "statement"?: Anonymize; +}; +export type I70kqehrkegc98 = (Anonymize) | undefined; +export type I6sveo21kq8jed = (ClaimsStatementKind) | undefined; +export type I1dqiovk0tpoah = { + "dest": SS58String; + "ethereum_signature": FixedSizeBinary<65>; + "statement": Binary; +}; +export type I1ntko0oih7v1a = { + "statement": Binary; +}; +export type I2tf5qmg09624f = { + "old": FixedSizeBinary<20>; + "new": FixedSizeBinary<20>; + "maybe_preclaim"?: Anonymize; +}; +export type Icgf8vmtkbnu4u = AnonymousEnum<{ + /** + *Unlock any vested funds of the sender account. + * + *The dispatch origin for this call must be _Signed_ and the sender must have funds still + *locked under this pallet. + * + *Emits either `VestingCompleted` or `VestingUpdated`. + * + *## Complexity + *- `O(1)`. + */ + "vest": undefined; + /** + *Unlock any vested funds of a `target` account. + * + *The dispatch origin for this call must be _Signed_. + * + *- `target`: The account whose vested funds should be unlocked. Must have funds still + *locked under this pallet. + * + *Emits either `VestingCompleted` or `VestingUpdated`. + * + *## Complexity + *- `O(1)`. + */ + "vest_other": Anonymize; + /** + *Create a vested transfer. + * + *The dispatch origin for this call must be _Signed_. + * + *- `target`: The account receiving the vested funds. + *- `schedule`: The vesting schedule attached to the transfer. + * + *Emits `VestingCreated`. + * + *NOTE: This will unlock all schedules through the current block. + * + *## Complexity + *- `O(1)`. + */ + "vested_transfer": Anonymize; + /** + *Force a vested transfer. + * + *The dispatch origin for this call must be _Root_. + * + *- `source`: The account whose funds should be transferred. + *- `target`: The account that should be transferred the vested funds. + *- `schedule`: The vesting schedule attached to the transfer. + * + *Emits `VestingCreated`. + * + *NOTE: This will unlock all schedules through the current block. + * + *## Complexity + *- `O(1)`. + */ + "force_vested_transfer": Anonymize; + /** + *Merge two vesting schedules together, creating a new vesting schedule that unlocks over + *the highest possible start and end blocks. If both schedules have already started the + *current block will be used as the schedule start; with the caveat that if one schedule + *is finished by the current block, the other will be treated as the new merged schedule, + *unmodified. + * + *NOTE: If `schedule1_index == schedule2_index` this is a no-op. + *NOTE: This will unlock all schedules through the current block prior to merging. + *NOTE: If both schedules have ended by the current block, no new schedule will be created + *and both will be removed. + * + *Merged schedule attributes: + *- `starting_block`: `MAX(schedule1.starting_block, scheduled2.starting_block, + * current_block)`. + *- `ending_block`: `MAX(schedule1.ending_block, schedule2.ending_block)`. + *- `locked`: `schedule1.locked_at(current_block) + schedule2.locked_at(current_block)`. + * + *The dispatch origin for this call must be _Signed_. + * + *- `schedule1_index`: index of the first schedule to merge. + *- `schedule2_index`: index of the second schedule to merge. + */ + "merge_schedules": Anonymize; + /** + *Force remove a vesting schedule + * + *The dispatch origin for this call must be _Root_. + * + *- `target`: An account that has a vesting schedule + *- `schedule_index`: The vesting schedule index that should be removed + */ + "force_remove_vesting_schedule": Anonymize; +}>; +export type Id9uqtigc0il3v = { + "target": MultiAddress; +}; +export type Iaa2o6cgjdpdn5 = { + "target": MultiAddress; + "schedule": Anonymize; +}; +export type Iam6hrl7ptd85l = { + "source": MultiAddress; + "target": MultiAddress; + "schedule": Anonymize; +}; +export type Ict9ivhr2c5hv0 = { + "schedule1_index": number; + "schedule2_index": number; +}; +export type I8t4vv03357lk9 = { + "target": MultiAddress; + "schedule_index": number; +}; +export type I9ot6q9gmurbqj = AnonymousEnum<{ + /** + *Send a batch of dispatch calls. + * + *May be called from any origin except `None`. + * + *- `calls`: The calls to be dispatched from the same origin. The number of call must not + * exceed the constant: `batched_calls_limit` (available in constant metadata). + * + *If origin is root then the calls are dispatched without checking origin filter. (This + *includes bypassing `frame_system::Config::BaseCallFilter`). + * + *## Complexity + *- O(C) where C is the number of calls to be batched. + * + *This will return `Ok` in all circumstances. To determine the success of the batch, an + *event is deposited. If a call failed and the batch was interrupted, then the + *`BatchInterrupted` event is deposited, along with the number of successful calls made + *and the error of the failed call. If all were successful, then the `BatchCompleted` + *event is deposited. + */ + "batch": Anonymize; + /** + *Send a call through an indexed pseudonym of the sender. + * + *Filter from origin are passed along. The call will be dispatched with an origin which + *use the same filter as the origin of this call. + * + *NOTE: If you need to ensure that any account-based filtering is not honored (i.e. + *because you expect `proxy` to have been used prior in the call stack and you do not want + *the call restrictions to apply to any sub-accounts), then use `as_multi_threshold_1` + *in the Multisig pallet instead. + * + *NOTE: Prior to version *12, this was called `as_limited_sub`. + * + *The dispatch origin for this call must be _Signed_. + */ + "as_derivative": Anonymize; + /** + *Send a batch of dispatch calls and atomically execute them. + *The whole transaction will rollback and fail if any of the calls failed. + * + *May be called from any origin except `None`. + * + *- `calls`: The calls to be dispatched from the same origin. The number of call must not + * exceed the constant: `batched_calls_limit` (available in constant metadata). + * + *If origin is root then the calls are dispatched without checking origin filter. (This + *includes bypassing `frame_system::Config::BaseCallFilter`). + * + *## Complexity + *- O(C) where C is the number of calls to be batched. + */ + "batch_all": Anonymize; + /** + *Dispatches a function call with a provided origin. + * + *The dispatch origin for this call must be _Root_. + * + *## Complexity + *- O(1). + */ + "dispatch_as": Anonymize; + /** + *Send a batch of dispatch calls. + *Unlike `batch`, it allows errors and won't interrupt. + * + *May be called from any origin except `None`. + * + *- `calls`: The calls to be dispatched from the same origin. The number of call must not + * exceed the constant: `batched_calls_limit` (available in constant metadata). + * + *If origin is root then the calls are dispatch without checking origin filter. (This + *includes bypassing `frame_system::Config::BaseCallFilter`). + * + *## Complexity + *- O(C) where C is the number of calls to be batched. + */ + "force_batch": Anonymize; + /** + *Dispatch a function call with a specified weight. + * + *This function does not check the weight of the call, and instead allows the + *Root origin to specify the weight of the call. + * + *The dispatch origin for this call must be _Root_. + */ + "with_weight": Anonymize; +}>; +export type I2d0r9q7g2cm99 = { + "calls": Anonymize; +}; +export type Iee7lqefolamj3 = Array; +export type I3fek2uacie2dd = { + "index": number; + "call": TxCallData; +}; +export type If87292opriu11 = { + "as_origin": PolkadotRuntimeOriginCaller; + "call": TxCallData; +}; +export type I5mundj2cf4hhs = { + "call": TxCallData; + "weight": Anonymize; +}; +export type Iu0ohu4lbha45 = AnonymousEnum<{ + /** + *Dispatch the given `call` from an account that the sender is authorised for through + *`add_proxy`. + * + *The dispatch origin for this call must be _Signed_. + * + *Parameters: + *- `real`: The account that the proxy will make a call on behalf of. + *- `force_proxy_type`: Specify the exact proxy type to be used and checked for this call. + *- `call`: The call to be made by the `real` account. + */ + "proxy": Anonymize; + /** + *Register a proxy account for the sender that is able to make calls on its behalf. + * + *The dispatch origin for this call must be _Signed_. + * + *Parameters: + *- `proxy`: The account that the `caller` would like to make a proxy. + *- `proxy_type`: The permissions allowed for this proxy account. + *- `delay`: The announcement period required of the initial proxy. Will generally be + *zero. + */ + "add_proxy": Anonymize; + /** + *Unregister a proxy account for the sender. + * + *The dispatch origin for this call must be _Signed_. + * + *Parameters: + *- `proxy`: The account that the `caller` would like to remove as a proxy. + *- `proxy_type`: The permissions currently enabled for the removed proxy account. + */ + "remove_proxy": Anonymize; + /** + *Unregister all proxy accounts for the sender. + * + *The dispatch origin for this call must be _Signed_. + * + *WARNING: This may be called on accounts created by `pure`, however if done, then + *the unreserved fees will be inaccessible. **All access to this account will be lost.** + */ + "remove_proxies": undefined; + /** + *Spawn a fresh new account that is guaranteed to be otherwise inaccessible, and + *initialize it with a proxy of `proxy_type` for `origin` sender. + * + *Requires a `Signed` origin. + * + *- `proxy_type`: The type of the proxy that the sender will be registered as over the + *new account. This will almost always be the most permissive `ProxyType` possible to + *allow for maximum flexibility. + *- `index`: A disambiguation index, in case this is called multiple times in the same + *transaction (e.g. with `utility::batch`). Unless you're using `batch` you probably just + *want to use `0`. + *- `delay`: The announcement period required of the initial proxy. Will generally be + *zero. + * + *Fails with `Duplicate` if this has already been called in this transaction, from the + *same sender, with the same parameters. + * + *Fails if there are insufficient funds to pay for deposit. + */ + "create_pure": Anonymize; + /** + *Removes a previously spawned pure proxy. + * + *WARNING: **All access to this account will be lost.** Any funds held in it will be + *inaccessible. + * + *Requires a `Signed` origin, and the sender account must have been created by a call to + *`pure` with corresponding parameters. + * + *- `spawner`: The account that originally called `pure` to create this account. + *- `index`: The disambiguation index originally passed to `pure`. Probably `0`. + *- `proxy_type`: The proxy type originally passed to `pure`. + *- `height`: The height of the chain when the call to `pure` was processed. + *- `ext_index`: The extrinsic index in which the call to `pure` was processed. + * + *Fails with `NoPermission` in case the caller is not a previously created pure + *account whose `pure` call has corresponding parameters. + */ + "kill_pure": Anonymize; + /** + *Publish the hash of a proxy-call that will be made in the future. + * + *This must be called some number of blocks before the corresponding `proxy` is attempted + *if the delay associated with the proxy relationship is greater than zero. + * + *No more than `MaxPending` announcements may be made at any one time. + * + *This will take a deposit of `AnnouncementDepositFactor` as well as + *`AnnouncementDepositBase` if there are no other pending announcements. + * + *The dispatch origin for this call must be _Signed_ and a proxy of `real`. + * + *Parameters: + *- `real`: The account that the proxy will make a call on behalf of. + *- `call_hash`: The hash of the call to be made by the `real` account. + */ + "announce": Anonymize; + /** + *Remove a given announcement. + * + *May be called by a proxy account to remove a call they previously announced and return + *the deposit. + * + *The dispatch origin for this call must be _Signed_. + * + *Parameters: + *- `real`: The account that the proxy will make a call on behalf of. + *- `call_hash`: The hash of the call to be made by the `real` account. + */ + "remove_announcement": Anonymize; + /** + *Remove the given announcement of a delegate. + * + *May be called by a target (proxied) account to remove a call that one of their delegates + *(`delegate`) has announced they want to execute. The deposit is returned. + * + *The dispatch origin for this call must be _Signed_. + * + *Parameters: + *- `delegate`: The account that previously announced the call. + *- `call_hash`: The hash of the call to be made. + */ + "reject_announcement": Anonymize; + /** + *Dispatch the given `call` from an account that the sender is authorized for through + *`add_proxy`. + * + *Removes any corresponding announcement(s). + * + *The dispatch origin for this call must be _Signed_. + * + *Parameters: + *- `real`: The account that the proxy will make a call on behalf of. + *- `force_proxy_type`: Specify the exact proxy type to be used and checked for this call. + *- `call`: The call to be made by the `real` account. + */ + "proxy_announced": Anonymize; +}>; +export type Ia5fuanmi4lveu = { + "real": MultiAddress; + "force_proxy_type"?: Anonymize; + "call": TxCallData; +}; +export type Ict2klpa3v9sc0 = (Anonymize) | undefined; +export type Ifhl1ihpl9i99m = { + "delegate": MultiAddress; + "proxy_type": Anonymize; + "delay": number; +}; +export type Iav2q7hjio8n98 = { + "proxy_type": Anonymize; + "delay": number; + "index": number; +}; +export type I1m2ifb0h8d0r8 = { + "spawner": MultiAddress; + "proxy_type": Anonymize; + "index": number; + "height": number; + "ext_index": number; +}; +export type I2eb501t8s6hsq = { + "real": MultiAddress; + "call_hash": FixedSizeBinary<32>; +}; +export type Ianmuoljk2sk1u = { + "delegate": MultiAddress; + "call_hash": FixedSizeBinary<32>; +}; +export type Iab8tq4jvqftue = { + "delegate": MultiAddress; + "real": MultiAddress; + "force_proxy_type"?: Anonymize; + "call": TxCallData; +}; +export type I80k2ri69bimod = AnonymousEnum<{ + /** + *Immediately dispatch a multi-signature call using a single approval from the caller. + * + *The dispatch origin for this call must be _Signed_. + * + *- `other_signatories`: The accounts (other than the sender) who are part of the + *multi-signature, but do not participate in the approval process. + *- `call`: The call to be executed. + * + *Result is equivalent to the dispatched result. + * + *## Complexity + *O(Z + C) where Z is the length of the call and C its execution weight. + */ + "as_multi_threshold_1": Anonymize; + /** + *Register approval for a dispatch to be made from a deterministic composite account if + *approved by a total of `threshold - 1` of `other_signatories`. + * + *If there are enough, then dispatch the call. + * + *Payment: `DepositBase` will be reserved if this is the first approval, plus + *`threshold` times `DepositFactor`. It is returned once this dispatch happens or + *is cancelled. + * + *The dispatch origin for this call must be _Signed_. + * + *- `threshold`: The total number of approvals for this dispatch before it is executed. + *- `other_signatories`: The accounts (other than the sender) who can approve this + *dispatch. May not be empty. + *- `maybe_timepoint`: If this is the first approval, then this must be `None`. If it is + *not the first approval, then it must be `Some`, with the timepoint (block number and + *transaction index) of the first approval transaction. + *- `call`: The call to be executed. + * + *NOTE: Unless this is the final approval, you will generally want to use + *`approve_as_multi` instead, since it only requires a hash of the call. + * + *Result is equivalent to the dispatched result if `threshold` is exactly `1`. Otherwise + *on success, result is `Ok` and the result from the interior call, if it was executed, + *may be found in the deposited `MultisigExecuted` event. + * + *## Complexity + *- `O(S + Z + Call)`. + *- Up to one balance-reserve or unreserve operation. + *- One passthrough operation, one insert, both `O(S)` where `S` is the number of + * signatories. `S` is capped by `MaxSignatories`, with weight being proportional. + *- One call encode & hash, both of complexity `O(Z)` where `Z` is tx-len. + *- One encode & hash, both of complexity `O(S)`. + *- Up to one binary search and insert (`O(logS + S)`). + *- I/O: 1 read `O(S)`, up to 1 mutate `O(S)`. Up to one remove. + *- One event. + *- The weight of the `call`. + *- Storage: inserts one item, value size bounded by `MaxSignatories`, with a deposit + * taken for its lifetime of `DepositBase + threshold * DepositFactor`. + */ + "as_multi": Anonymize; + /** + *Register approval for a dispatch to be made from a deterministic composite account if + *approved by a total of `threshold - 1` of `other_signatories`. + * + *Payment: `DepositBase` will be reserved if this is the first approval, plus + *`threshold` times `DepositFactor`. It is returned once this dispatch happens or + *is cancelled. + * + *The dispatch origin for this call must be _Signed_. + * + *- `threshold`: The total number of approvals for this dispatch before it is executed. + *- `other_signatories`: The accounts (other than the sender) who can approve this + *dispatch. May not be empty. + *- `maybe_timepoint`: If this is the first approval, then this must be `None`. If it is + *not the first approval, then it must be `Some`, with the timepoint (block number and + *transaction index) of the first approval transaction. + *- `call_hash`: The hash of the call to be executed. + * + *NOTE: If this is the final approval, you will want to use `as_multi` instead. + * + *## Complexity + *- `O(S)`. + *- Up to one balance-reserve or unreserve operation. + *- One passthrough operation, one insert, both `O(S)` where `S` is the number of + * signatories. `S` is capped by `MaxSignatories`, with weight being proportional. + *- One encode & hash, both of complexity `O(S)`. + *- Up to one binary search and insert (`O(logS + S)`). + *- I/O: 1 read `O(S)`, up to 1 mutate `O(S)`. Up to one remove. + *- One event. + *- Storage: inserts one item, value size bounded by `MaxSignatories`, with a deposit + * taken for its lifetime of `DepositBase + threshold * DepositFactor`. + */ + "approve_as_multi": Anonymize; + /** + *Cancel a pre-existing, on-going multisig transaction. Any deposit reserved previously + *for this operation will be unreserved on success. + * + *The dispatch origin for this call must be _Signed_. + * + *- `threshold`: The total number of approvals for this dispatch before it is executed. + *- `other_signatories`: The accounts (other than the sender) who can approve this + *dispatch. May not be empty. + *- `timepoint`: The timepoint (block number and transaction index) of the first approval + *transaction for this dispatch. + *- `call_hash`: The hash of the call to be executed. + * + *## Complexity + *- `O(S)`. + *- Up to one balance-reserve or unreserve operation. + *- One passthrough operation, one insert, both `O(S)` where `S` is the number of + * signatories. `S` is capped by `MaxSignatories`, with weight being proportional. + *- One encode & hash, both of complexity `O(S)`. + *- One event. + *- I/O: 1 read `O(S)`, one remove. + *- Storage: removes one item. + */ + "cancel_as_multi": Anonymize; +}>; +export type I9tdu4rgc5k1b = { + "other_signatories": Anonymize; + "call": TxCallData; +}; +export type I6q5208tn6ph2e = { + "threshold": number; + "other_signatories": Anonymize; + "maybe_timepoint"?: Anonymize; + "call": TxCallData; + "max_weight": Anonymize; +}; +export type I95jfd8j5cr5eh = (Anonymize) | undefined; +export type Ideaemvoneh309 = { + "threshold": number; + "other_signatories": Anonymize; + "maybe_timepoint"?: Anonymize; + "call_hash": FixedSizeBinary<32>; + "max_weight": Anonymize; +}; +export type I3d9o9d7epp66v = { + "threshold": number; + "other_signatories": Anonymize; + "timepoint": Anonymize; + "call_hash": FixedSizeBinary<32>; +}; +export type I91kpi5kjh9on2 = AnonymousEnum<{ + /** + *Propose a new bounty. + * + *The dispatch origin for this call must be _Signed_. + * + *Payment: `TipReportDepositBase` will be reserved from the origin account, as well as + *`DataDepositPerByte` for each byte in `reason`. It will be unreserved upon approval, + *or slashed when rejected. + * + *- `curator`: The curator account whom will manage this bounty. + *- `fee`: The curator fee. + *- `value`: The total payment amount of this bounty, curator fee included. + *- `description`: The description of this bounty. + */ + "propose_bounty": Anonymize; + /** + *Approve a bounty proposal. At a later time, the bounty will be funded and become active + *and the original deposit will be returned. + * + *May only be called from `T::SpendOrigin`. + * + *## Complexity + *- O(1). + */ + "approve_bounty": Anonymize; + /** + *Propose a curator to a funded bounty. + * + *May only be called from `T::SpendOrigin`. + * + *## Complexity + *- O(1). + */ + "propose_curator": Anonymize; + /** + *Unassign curator from a bounty. + * + *This function can only be called by the `RejectOrigin` a signed origin. + * + *If this function is called by the `RejectOrigin`, we assume that the curator is + *malicious or inactive. As a result, we will slash the curator when possible. + * + *If the origin is the curator, we take this as a sign they are unable to do their job and + *they willingly give up. We could slash them, but for now we allow them to recover their + *deposit and exit without issue. (We may want to change this if it is abused.) + * + *Finally, the origin can be anyone if and only if the curator is "inactive". This allows + *anyone in the community to call out that a curator is not doing their due diligence, and + *we should pick a new curator. In this case the curator should also be slashed. + * + *## Complexity + *- O(1). + */ + "unassign_curator": Anonymize; + /** + *Accept the curator role for a bounty. + *A deposit will be reserved from curator and refund upon successful payout. + * + *May only be called from the curator. + * + *## Complexity + *- O(1). + */ + "accept_curator": Anonymize; + /** + *Award bounty to a beneficiary account. The beneficiary will be able to claim the funds + *after a delay. + * + *The dispatch origin for this call must be the curator of this bounty. + * + *- `bounty_id`: Bounty ID to award. + *- `beneficiary`: The beneficiary account whom will receive the payout. + * + *## Complexity + *- O(1). + */ + "award_bounty": Anonymize; + /** + *Claim the payout from an awarded bounty after payout delay. + * + *The dispatch origin for this call must be the beneficiary of this bounty. + * + *- `bounty_id`: Bounty ID to claim. + * + *## Complexity + *- O(1). + */ + "claim_bounty": Anonymize; + /** + *Cancel a proposed or active bounty. All the funds will be sent to treasury and + *the curator deposit will be unreserved if possible. + * + *Only `T::RejectOrigin` is able to cancel a bounty. + * + *- `bounty_id`: Bounty ID to cancel. + * + *## Complexity + *- O(1). + */ + "close_bounty": Anonymize; + /** + *Extend the expiry time of an active bounty. + * + *The dispatch origin for this call must be the curator of this bounty. + * + *- `bounty_id`: Bounty ID to extend. + *- `remark`: additional information. + * + *## Complexity + *- O(1). + */ + "extend_bounty_expiry": Anonymize; +}>; +export type I2a839vbf5817q = { + "value": bigint; + "description": Binary; +}; +export type I42bqh279uf7oa = { + "bounty_id": number; + "curator": MultiAddress; + "fee": bigint; +}; +export type I4p6v96cffstms = { + "bounty_id": number; + "beneficiary": MultiAddress; +}; +export type I90n6nnkpdahrh = { + "bounty_id": number; + "remark": Binary; +}; +export type I1b6drdhvt5hl9 = AnonymousEnum<{ + /** + *Add a new child-bounty. + * + *The dispatch origin for this call must be the curator of parent + *bounty and the parent bounty must be in "active" state. + * + *Child-bounty gets added successfully & fund gets transferred from + *parent bounty to child-bounty account, if parent bounty has enough + *funds, else the call fails. + * + *Upper bound to maximum number of active child bounties that can be + *added are managed via runtime trait config + *[`Config::MaxActiveChildBountyCount`]. + * + *If the call is success, the status of child-bounty is updated to + *"Added". + * + *- `parent_bounty_id`: Index of parent bounty for which child-bounty is being added. + *- `value`: Value for executing the proposal. + *- `description`: Text description for the child-bounty. + */ + "add_child_bounty": Anonymize; + /** + *Propose curator for funded child-bounty. + * + *The dispatch origin for this call must be curator of parent bounty. + * + *Parent bounty must be in active state, for this child-bounty call to + *work. + * + *Child-bounty must be in "Added" state, for processing the call. And + *state of child-bounty is moved to "CuratorProposed" on successful + *call completion. + * + *- `parent_bounty_id`: Index of parent bounty. + *- `child_bounty_id`: Index of child bounty. + *- `curator`: Address of child-bounty curator. + *- `fee`: payment fee to child-bounty curator for execution. + */ + "propose_curator": Anonymize; + /** + *Accept the curator role for the child-bounty. + * + *The dispatch origin for this call must be the curator of this + *child-bounty. + * + *A deposit will be reserved from the curator and refund upon + *successful payout or cancellation. + * + *Fee for curator is deducted from curator fee of parent bounty. + * + *Parent bounty must be in active state, for this child-bounty call to + *work. + * + *Child-bounty must be in "CuratorProposed" state, for processing the + *call. And state of child-bounty is moved to "Active" on successful + *call completion. + * + *- `parent_bounty_id`: Index of parent bounty. + *- `child_bounty_id`: Index of child bounty. + */ + "accept_curator": Anonymize; + /** + *Unassign curator from a child-bounty. + * + *The dispatch origin for this call can be either `RejectOrigin`, or + *the curator of the parent bounty, or any signed origin. + * + *For the origin other than T::RejectOrigin and the child-bounty + *curator, parent bounty must be in active state, for this call to + *work. We allow child-bounty curator and T::RejectOrigin to execute + *this call irrespective of the parent bounty state. + * + *If this function is called by the `RejectOrigin` or the + *parent bounty curator, we assume that the child-bounty curator is + *malicious or inactive. As a result, child-bounty curator deposit is + *slashed. + * + *If the origin is the child-bounty curator, we take this as a sign + *that they are unable to do their job, and are willingly giving up. + *We could slash the deposit, but for now we allow them to unreserve + *their deposit and exit without issue. (We may want to change this if + *it is abused.) + * + *Finally, the origin can be anyone iff the child-bounty curator is + *"inactive". Expiry update due of parent bounty is used to estimate + *inactive state of child-bounty curator. + * + *This allows anyone in the community to call out that a child-bounty + *curator is not doing their due diligence, and we should pick a new + *one. In this case the child-bounty curator deposit is slashed. + * + *State of child-bounty is moved to Added state on successful call + *completion. + * + *- `parent_bounty_id`: Index of parent bounty. + *- `child_bounty_id`: Index of child bounty. + */ + "unassign_curator": Anonymize; + /** + *Award child-bounty to a beneficiary. + * + *The beneficiary will be able to claim the funds after a delay. + * + *The dispatch origin for this call must be the parent curator or + *curator of this child-bounty. + * + *Parent bounty must be in active state, for this child-bounty call to + *work. + * + *Child-bounty must be in active state, for processing the call. And + *state of child-bounty is moved to "PendingPayout" on successful call + *completion. + * + *- `parent_bounty_id`: Index of parent bounty. + *- `child_bounty_id`: Index of child bounty. + *- `beneficiary`: Beneficiary account. + */ + "award_child_bounty": Anonymize; + /** + *Claim the payout from an awarded child-bounty after payout delay. + * + *The dispatch origin for this call may be any signed origin. + * + *Call works independent of parent bounty state, No need for parent + *bounty to be in active state. + * + *The Beneficiary is paid out with agreed bounty value. Curator fee is + *paid & curator deposit is unreserved. + * + *Child-bounty must be in "PendingPayout" state, for processing the + *call. And instance of child-bounty is removed from the state on + *successful call completion. + * + *- `parent_bounty_id`: Index of parent bounty. + *- `child_bounty_id`: Index of child bounty. + */ + "claim_child_bounty": Anonymize; + /** + *Cancel a proposed or active child-bounty. Child-bounty account funds + *are transferred to parent bounty account. The child-bounty curator + *deposit may be unreserved if possible. + * + *The dispatch origin for this call must be either parent curator or + *`T::RejectOrigin`. + * + *If the state of child-bounty is `Active`, curator deposit is + *unreserved. + * + *If the state of child-bounty is `PendingPayout`, call fails & + *returns `PendingPayout` error. + * + *For the origin other than T::RejectOrigin, parent bounty must be in + *active state, for this child-bounty call to work. For origin + *T::RejectOrigin execution is forced. + * + *Instance of child-bounty is removed from the state on successful + *call completion. + * + *- `parent_bounty_id`: Index of parent bounty. + *- `child_bounty_id`: Index of child bounty. + */ + "close_child_bounty": Anonymize; +}>; +export type I8mk5kjgn02hi8 = { + "parent_bounty_id": number; + "value": bigint; + "description": Binary; +}; +export type Ieqvq91sbe02ko = { + "parent_bounty_id": number; + "child_bounty_id": number; + "curator": MultiAddress; + "fee": bigint; +}; +export type I2gr10p66od9ch = { + "parent_bounty_id": number; + "child_bounty_id": number; +}; +export type I9mcq66cm3gibo = { + "parent_bounty_id": number; + "child_bounty_id": number; + "beneficiary": MultiAddress; +}; +export type I15soeogelbbbh = AnonymousEnum<{ + /** + *Submit a solution for the unsigned phase. + * + *The dispatch origin fo this call must be __none__. + * + *This submission is checked on the fly. Moreover, this unsigned solution is only + *validated when submitted to the pool from the **local** node. Effectively, this means + *that only active validators can submit this transaction when authoring a block (similar + *to an inherent). + * + *To prevent any incorrect solution (and thus wasted time/weight), this transaction will + *panic if the solution submitted by the validator is invalid in any way, effectively + *putting their authoring reward at risk. + * + *No deposit or reward is associated with this submission. + */ + "submit_unsigned": Anonymize; + /** + *Set a new value for `MinimumUntrustedScore`. + * + *Dispatch origin must be aligned with `T::ForceOrigin`. + * + *This check can be turned off by setting the value to `None`. + */ + "set_minimum_untrusted_score": Anonymize; + /** + *Set a solution in the queue, to be handed out to the client of this pallet in the next + *call to `ElectionProvider::elect`. + * + *This can only be set by `T::ForceOrigin`, and only when the phase is `Emergency`. + * + *The solution is not checked for any feasibility and is assumed to be trustworthy, as any + *feasibility check itself can in principle cause the election process to fail (due to + *memory/weight constrains). + */ + "set_emergency_election_result": Anonymize; + /** + *Submit a solution for the signed phase. + * + *The dispatch origin fo this call must be __signed__. + * + *The solution is potentially queued, based on the claimed score and processed at the end + *of the signed phase. + * + *A deposit is reserved and recorded for the solution. Based on the outcome, the solution + *might be rewarded, slashed, or get all or a part of the deposit back. + */ + "submit": Anonymize; + /** + *Trigger the governance fallback. + * + *This can only be called when [`Phase::Emergency`] is enabled, as an alternative to + *calling [`Call::set_emergency_election_result`]. + */ + "governance_fallback": Anonymize; +}>; +export type I31k9f0jol8ko4 = { + "raw_solution": Anonymize; + "witness": Anonymize; +}; +export type I80q14um2s2ckg = { + "maybe_next_score"?: Anonymize; +}; +export type Iaebc5kcl654ln = (Anonymize) | undefined; +export type I5qs1t1erfi7u8 = { + "supports": Anonymize; +}; +export type I9et13knvdvgpb = { + "raw_solution": Anonymize; +}; +export type Ifsme8miqq9006 = { + "maybe_max_voters"?: Anonymize; + "maybe_max_targets"?: Anonymize; +}; +export type Ifvfo1l0vu2o7e = AnonymousEnum<{ + /** + *Declare that some `dislocated` account has, through rewards or penalties, sufficiently + *changed its score that it should properly fall into a different bag than its current + *one. + * + *Anyone can call this function about any potentially dislocated account. + * + *Will always update the stored score of `dislocated` to the correct score, based on + *`ScoreProvider`. + * + *If `dislocated` does not exists, it returns an error. + */ + "rebag": Anonymize; + /** + *Move the caller's Id directly in front of `lighter`. + * + *The dispatch origin for this call must be _Signed_ and can only be called by the Id of + *the account going in front of `lighter`. Fee is payed by the origin under all + *circumstances. + * + *Only works if: + * + *- both nodes are within the same bag, + *- and `origin` has a greater `Score` than `lighter`. + */ + "put_in_front_of": Anonymize; + /** + *Same as [`Pallet::put_in_front_of`], but it can be called by anyone. + * + *Fee is paid by the origin under all circumstances. + */ + "put_in_front_of_other": Anonymize; +}>; +export type Id9js0aucdivjk = { + "dislocated": MultiAddress; +}; +export type I1vj3e1a62je3o = { + "lighter": MultiAddress; +}; +export type I6c1t14l6giceg = { + "heavier": MultiAddress; + "lighter": MultiAddress; +}; +export type I57mljkkr28m9p = AnonymousEnum<{ + /** + *Stake funds with a pool. The amount to bond is transferred from the member to the + *pools account and immediately increases the pools bond. + * + *# Note + * + ** An account can only be a member of a single pool. + ** An account cannot join the same pool multiple times. + ** This call will *not* dust the member account, so the member must have at least + * `existential deposit + amount` in their account. + ** Only a pool with [`PoolState::Open`] can be joined + */ + "join": Anonymize; + /** + *Bond `extra` more funds from `origin` into the pool to which they already belong. + * + *Additional funds can come from either the free balance of the account, of from the + *accumulated rewards, see [`BondExtra`]. + * + *Bonding extra funds implies an automatic payout of all pending rewards as well. + *See `bond_extra_other` to bond pending rewards of `other` members. + */ + "bond_extra": Anonymize; + /** + *A bonded member can use this to claim their payout based on the rewards that the pool + *has accumulated since their last claimed payout (OR since joining if this is their first + *time claiming rewards). The payout will be transferred to the member's account. + * + *The member will earn rewards pro rata based on the members stake vs the sum of the + *members in the pools stake. Rewards do not "expire". + * + *See `claim_payout_other` to claim rewards on behalf of some `other` pool member. + */ + "claim_payout": undefined; + /** + *Unbond up to `unbonding_points` of the `member_account`'s funds from the pool. It + *implicitly collects the rewards one last time, since not doing so would mean some + *rewards would be forfeited. + * + *Under certain conditions, this call can be dispatched permissionlessly (i.e. by any + *account). + * + *# Conditions for a permissionless dispatch. + * + ** The pool is blocked and the caller is either the root or bouncer. This is refereed to + * as a kick. + ** The pool is destroying and the member is not the depositor. + ** The pool is destroying, the member is the depositor and no other members are in the + * pool. + * + *## Conditions for permissioned dispatch (i.e. the caller is also the + *`member_account`): + * + ** The caller is not the depositor. + ** The caller is the depositor, the pool is destroying and no other members are in the + * pool. + * + *# Note + * + *If there are too many unlocking chunks to unbond with the pool account, + *[`Call::pool_withdraw_unbonded`] can be called to try and minimize unlocking chunks. + *The [`StakingInterface::unbond`] will implicitly call [`Call::pool_withdraw_unbonded`] + *to try to free chunks if necessary (ie. if unbound was called and no unlocking chunks + *are available). However, it may not be possible to release the current unlocking chunks, + *in which case, the result of this call will likely be the `NoMoreChunks` error from the + *staking system. + */ + "unbond": Anonymize; + /** + *Call `withdraw_unbonded` for the pools account. This call can be made by any account. + * + *This is useful if there are too many unlocking chunks to call `unbond`, and some + *can be cleared by withdrawing. In the case there are too many unlocking chunks, the user + *would probably see an error like `NoMoreChunks` emitted from the staking system when + *they attempt to unbond. + */ + "pool_withdraw_unbonded": Anonymize; + /** + *Withdraw unbonded funds from `member_account`. If no bonded funds can be unbonded, an + *error is returned. + * + *Under certain conditions, this call can be dispatched permissionlessly (i.e. by any + *account). + * + *# Conditions for a permissionless dispatch + * + ** The pool is in destroy mode and the target is not the depositor. + ** The target is the depositor and they are the only member in the sub pools. + ** The pool is blocked and the caller is either the root or bouncer. + * + *# Conditions for permissioned dispatch + * + ** The caller is the target and they are not the depositor. + * + *# Note + * + *- If the target is the depositor, the pool will be destroyed. + *- If the pool has any pending slash, we also try to slash the member before letting them + *withdraw. This calculation adds some weight overhead and is only defensive. In reality, + *pool slashes must have been already applied via permissionless [`Call::apply_slash`]. + */ + "withdraw_unbonded": Anonymize; + /** + *Create a new delegation pool. + * + *# Arguments + * + ** `amount` - The amount of funds to delegate to the pool. This also acts of a sort of + * deposit since the pools creator cannot fully unbond funds until the pool is being + * destroyed. + ** `index` - A disambiguation index for creating the account. Likely only useful when + * creating multiple pools in the same extrinsic. + ** `root` - The account to set as [`PoolRoles::root`]. + ** `nominator` - The account to set as the [`PoolRoles::nominator`]. + ** `bouncer` - The account to set as the [`PoolRoles::bouncer`]. + * + *# Note + * + *In addition to `amount`, the caller will transfer the existential deposit; so the caller + *needs at have at least `amount + existential_deposit` transferable. + */ + "create": Anonymize; + /** + *Create a new delegation pool with a previously used pool id + * + *# Arguments + * + *same as `create` with the inclusion of + ** `pool_id` - `A valid PoolId. + */ + "create_with_pool_id": Anonymize; + /** + *Nominate on behalf of the pool. + * + *The dispatch origin of this call must be signed by the pool nominator or the pool + *root role. + * + *This directly forward the call to the staking pallet, on behalf of the pool bonded + *account. + * + *# Note + * + *In addition to a `root` or `nominator` role of `origin`, pool's depositor needs to have + *at least `depositor_min_bond` in the pool to start nominating. + */ + "nominate": Anonymize; + /** + *Set a new state for the pool. + * + *If a pool is already in the `Destroying` state, then under no condition can its state + *change again. + * + *The dispatch origin of this call must be either: + * + *1. signed by the bouncer, or the root role of the pool, + *2. if the pool conditions to be open are NOT met (as described by `ok_to_be_open`), and + * then the state of the pool can be permissionlessly changed to `Destroying`. + */ + "set_state": Anonymize; + /** + *Set a new metadata for the pool. + * + *The dispatch origin of this call must be signed by the bouncer, or the root role of the + *pool. + */ + "set_metadata": Anonymize; + /** + *Update configurations for the nomination pools. The origin for this call must be + *[`Config::AdminOrigin`]. + * + *# Arguments + * + ** `min_join_bond` - Set [`MinJoinBond`]. + ** `min_create_bond` - Set [`MinCreateBond`]. + ** `max_pools` - Set [`MaxPools`]. + ** `max_members` - Set [`MaxPoolMembers`]. + ** `max_members_per_pool` - Set [`MaxPoolMembersPerPool`]. + ** `global_max_commission` - Set [`GlobalMaxCommission`]. + */ + "set_configs": Anonymize; + /** + *Update the roles of the pool. + * + *The root is the only entity that can change any of the roles, including itself, + *excluding the depositor, who can never change. + * + *It emits an event, notifying UIs of the role change. This event is quite relevant to + *most pool members and they should be informed of changes to pool roles. + */ + "update_roles": Anonymize; + /** + *Chill on behalf of the pool. + * + *The dispatch origin of this call can be signed by the pool nominator or the pool + *root role, same as [`Pallet::nominate`]. + * + *Under certain conditions, this call can be dispatched permissionlessly (i.e. by any + *account). + * + *# Conditions for a permissionless dispatch: + ** When pool depositor has less than `MinNominatorBond` staked, otherwise pool members + * are unable to unbond. + * + *# Conditions for permissioned dispatch: + ** The caller has a nominator or root role of the pool. + *This directly forward the call to the staking pallet, on behalf of the pool bonded + *account. + */ + "chill": Anonymize; + /** + *`origin` bonds funds from `extra` for some pool member `member` into their respective + *pools. + * + *`origin` can bond extra funds from free balance or pending rewards when `origin == + *other`. + * + *In the case of `origin != other`, `origin` can only bond extra pending rewards of + *`other` members assuming set_claim_permission for the given member is + *`PermissionlessCompound` or `PermissionlessAll`. + */ + "bond_extra_other": Anonymize; + /** + *Allows a pool member to set a claim permission to allow or disallow permissionless + *bonding and withdrawing. + * + *# Arguments + * + ** `origin` - Member of a pool. + ** `permission` - The permission to be applied. + */ + "set_claim_permission": Anonymize; + /** + *`origin` can claim payouts on some pool member `other`'s behalf. + * + *Pool member `other` must have a `PermissionlessWithdraw` or `PermissionlessAll` claim + *permission for this call to be successful. + */ + "claim_payout_other": Anonymize; + /** + *Set the commission of a pool. + *Both a commission percentage and a commission payee must be provided in the `current` + *tuple. Where a `current` of `None` is provided, any current commission will be removed. + * + *- If a `None` is supplied to `new_commission`, existing commission will be removed. + */ + "set_commission": Anonymize; + /** + *Set the maximum commission of a pool. + * + *- Initial max can be set to any `Perbill`, and only smaller values thereafter. + *- Current commission will be lowered in the event it is higher than a new max + * commission. + */ + "set_commission_max": Anonymize; + /** + *Set the commission change rate for a pool. + * + *Initial change rate is not bounded, whereas subsequent updates can only be more + *restrictive than the current. + */ + "set_commission_change_rate": Anonymize; + /** + *Claim pending commission. + * + *The dispatch origin of this call must be signed by the `root` role of the pool. Pending + *commission is paid out and added to total claimed commission`. Total pending commission + *is reset to zero. the current. + */ + "claim_commission": Anonymize; + /** + *Top up the deficit or withdraw the excess ED from the pool. + * + *When a pool is created, the pool depositor transfers ED to the reward account of the + *pool. ED is subject to change and over time, the deposit in the reward account may be + *insufficient to cover the ED deficit of the pool or vice-versa where there is excess + *deposit to the pool. This call allows anyone to adjust the ED deposit of the + *pool by either topping up the deficit or claiming the excess. + */ + "adjust_pool_deposit": Anonymize; + /** + *Set or remove a pool's commission claim permission. + * + *Determines who can claim the pool's pending commission. Only the `Root` role of the pool + *is able to configure commission claim permissions. + */ + "set_commission_claim_permission": Anonymize; + /** + *Apply a pending slash on a member. + * + *Fails unless [`crate::pallet::Config::StakeAdapter`] is of strategy type: + *[`adapter::StakeStrategyType::Delegate`]. + * + *This call can be dispatched permissionlessly (i.e. by any account). If the member has + *slash to be applied, caller may be rewarded with the part of the slash. + */ + "apply_slash": Anonymize; + /** + *Migrates delegated funds from the pool account to the `member_account`. + * + *Fails unless [`crate::pallet::Config::StakeAdapter`] is of strategy type: + *[`adapter::StakeStrategyType::Delegate`]. + * + *This is a permission-less call and refunds any fee if claim is successful. + * + *If the pool has migrated to delegation based staking, the staked tokens of pool members + *can be moved and held in their own account. See [`adapter::DelegateStake`] + */ + "migrate_delegation": Anonymize; + /** + *Migrate pool from [`adapter::StakeStrategyType::Transfer`] to + *[`adapter::StakeStrategyType::Delegate`]. + * + *Fails unless [`crate::pallet::Config::StakeAdapter`] is of strategy type: + *[`adapter::StakeStrategyType::Delegate`]. + * + *This call can be dispatched permissionlessly, and refunds any fee if successful. + * + *If the pool has already migrated to delegation based staking, this call will fail. + */ + "migrate_pool_to_delegate_stake": Anonymize; +}>; +export type I2vu5vj7173ik9 = { + "extra": NominationPoolsBondExtra; +}; +export type NominationPoolsBondExtra = Enum<{ + "FreeBalance": bigint; + "Rewards": undefined; +}>; +export declare const NominationPoolsBondExtra: GetEnum; +export type I6galqkn58q3bl = { + "member_account": MultiAddress; + "unbonding_points": bigint; +}; +export type I36uoc8t9liv80 = { + "pool_id": number; + "num_slashing_spans": number; +}; +export type Ibunghsg9qa7f7 = { + "member_account": MultiAddress; + "num_slashing_spans": number; +}; +export type I8qnouj2c0igph = { + "amount": bigint; + "root": MultiAddress; + "nominator": MultiAddress; + "bouncer": MultiAddress; +}; +export type Ic30e2k517a3ns = { + "amount": bigint; + "root": MultiAddress; + "nominator": MultiAddress; + "bouncer": MultiAddress; + "pool_id": number; +}; +export type I47a2tsd2o2b1c = { + "pool_id": number; + "validators": Anonymize; +}; +export type Ifc9k1s0e9nv8e = { + "pool_id": number; + "state": NominationPoolsPoolState; +}; +export type I4ihj26hl75e5p = { + "pool_id": number; + "metadata": Binary; +}; +export type I2dl8ekhm2t22h = { + "min_join_bond": StakingPalletConfigOpBig; + "min_create_bond": StakingPalletConfigOpBig; + "max_pools": StakingPalletConfigOp; + "max_members": StakingPalletConfigOp; + "max_members_per_pool": StakingPalletConfigOp; + "global_max_commission": StakingPalletConfigOp; +}; +export type I13us5e5h5645o = { + "pool_id": number; + "new_root": NominationPoolsConfigOp; + "new_nominator": NominationPoolsConfigOp; + "new_bouncer": NominationPoolsConfigOp; +}; +export type NominationPoolsConfigOp = Enum<{ + "Noop": undefined; + "Set": SS58String; + "Remove": undefined; +}>; +export declare const NominationPoolsConfigOp: GetEnum; +export type I7sujb8gfvuo7n = { + "member": MultiAddress; + "extra": NominationPoolsBondExtra; +}; +export type I1ors0vru14it3 = { + "permission": NominationPoolsClaimPermission; +}; +export type I40s11r8nagn2g = { + "other": SS58String; +}; +export type I6bjj87fr5g9nl = { + "pool_id": number; + "new_commission"?: Anonymize; +}; +export type I7ibh0fckqou49 = { + "member_account": MultiAddress; +}; +export type I44snhj1gahvrd = AnonymousEnum<{ + /** + *Register oneself for fast-unstake. + * + *## Dispatch Origin + * + *The dispatch origin of this call must be *signed* by whoever is permitted to call + *unbond funds by the staking system. See [`Config::Staking`]. + * + *## Details + * + *The stash associated with the origin must have no ongoing unlocking chunks. If + *successful, this will fully unbond and chill the stash. Then, it will enqueue the stash + *to be checked in further blocks. + * + *If by the time this is called, the stash is actually eligible for fast-unstake, then + *they are guaranteed to remain eligible, because the call will chill them as well. + * + *If the check works, the entire staking data is removed, i.e. the stash is fully + *unstaked. + * + *If the check fails, the stash remains chilled and waiting for being unbonded as in with + *the normal staking system, but they lose part of their unbonding chunks due to consuming + *the chain's resources. + * + *## Events + * + *Some events from the staking and currency system might be emitted. + */ + "register_fast_unstake": undefined; + /** + *Deregister oneself from the fast-unstake. + * + *## Dispatch Origin + * + *The dispatch origin of this call must be *signed* by whoever is permitted to call + *unbond funds by the staking system. See [`Config::Staking`]. + * + *## Details + * + *This is useful if one is registered, they are still waiting, and they change their mind. + * + *Note that the associated stash is still fully unbonded and chilled as a consequence of + *calling [`Pallet::register_fast_unstake`]. Therefore, this should probably be followed + *by a call to `rebond` in the staking system. + * + *## Events + * + *Some events from the staking and currency system might be emitted. + */ + "deregister": undefined; + /** + *Control the operation of this pallet. + * + *## Dispatch Origin + * + *The dispatch origin of this call must be [`Config::ControlOrigin`]. + * + *## Details + * + *Can set the number of eras to check per block, and potentially other admin work. + * + *## Events + * + *No events are emitted from this dispatch. + */ + "control": Anonymize; +}>; +export type I9j0ul7nh7b8jv = { + "eras_to_check": number; +}; +export type Ia9ptue949ognv = AnonymousEnum<{ + /** + *Set the validation upgrade cooldown. + */ + "set_validation_upgrade_cooldown": Anonymize; + /** + *Set the validation upgrade delay. + */ + "set_validation_upgrade_delay": Anonymize; + /** + *Set the acceptance period for an included candidate. + */ + "set_code_retention_period": Anonymize; + /** + *Set the max validation code size for incoming upgrades. + */ + "set_max_code_size": Anonymize; + /** + *Set the max POV block size for incoming upgrades. + */ + "set_max_pov_size": Anonymize; + /** + *Set the max head data size for paras. + */ + "set_max_head_data_size": Anonymize; + /** + *Set the number of coretime execution cores. + * + *NOTE: that this configuration is managed by the coretime chain. Only manually change + *this, if you really know what you are doing! + */ + "set_coretime_cores": Anonymize; + /** + *Set the max number of times a claim may timeout on a core before it is abandoned + */ + "set_max_availability_timeouts": Anonymize; + /** + *Set the parachain validator-group rotation frequency + */ + "set_group_rotation_frequency": Anonymize; + /** + *Set the availability period for paras. + */ + "set_paras_availability_period": Anonymize; + /** + *Set the scheduling lookahead, in expected number of blocks at peak throughput. + */ + "set_scheduling_lookahead": Anonymize; + /** + *Set the maximum number of validators to assign to any core. + */ + "set_max_validators_per_core": Anonymize; + /** + *Set the maximum number of validators to use in parachain consensus. + */ + "set_max_validators": Anonymize; + /** + *Set the dispute period, in number of sessions to keep for disputes. + */ + "set_dispute_period": Anonymize; + /** + *Set the dispute post conclusion acceptance period. + */ + "set_dispute_post_conclusion_acceptance_period": Anonymize; + /** + *Set the no show slots, in number of number of consensus slots. + *Must be at least 1. + */ + "set_no_show_slots": Anonymize; + /** + *Set the total number of delay tranches. + */ + "set_n_delay_tranches": Anonymize; + /** + *Set the zeroth delay tranche width. + */ + "set_zeroth_delay_tranche_width": Anonymize; + /** + *Set the number of validators needed to approve a block. + */ + "set_needed_approvals": Anonymize; + /** + *Set the number of samples to do of the `RelayVRFModulo` approval assignment criterion. + */ + "set_relay_vrf_modulo_samples": Anonymize; + /** + *Sets the maximum items that can present in a upward dispatch queue at once. + */ + "set_max_upward_queue_count": Anonymize; + /** + *Sets the maximum total size of items that can present in a upward dispatch queue at + *once. + */ + "set_max_upward_queue_size": Anonymize; + /** + *Set the critical downward message size. + */ + "set_max_downward_message_size": Anonymize; + /** + *Sets the maximum size of an upward message that can be sent by a candidate. + */ + "set_max_upward_message_size": Anonymize; + /** + *Sets the maximum number of messages that a candidate can contain. + */ + "set_max_upward_message_num_per_candidate": Anonymize; + /** + *Sets the number of sessions after which an HRMP open channel request expires. + */ + "set_hrmp_open_request_ttl": Anonymize; + /** + *Sets the amount of funds that the sender should provide for opening an HRMP channel. + */ + "set_hrmp_sender_deposit": Anonymize; + /** + *Sets the amount of funds that the recipient should provide for accepting opening an HRMP + *channel. + */ + "set_hrmp_recipient_deposit": Anonymize; + /** + *Sets the maximum number of messages allowed in an HRMP channel at once. + */ + "set_hrmp_channel_max_capacity": Anonymize; + /** + *Sets the maximum total size of messages in bytes allowed in an HRMP channel at once. + */ + "set_hrmp_channel_max_total_size": Anonymize; + /** + *Sets the maximum number of inbound HRMP channels a parachain is allowed to accept. + */ + "set_hrmp_max_parachain_inbound_channels": Anonymize; + /** + *Sets the maximum size of a message that could ever be put into an HRMP channel. + */ + "set_hrmp_channel_max_message_size": Anonymize; + /** + *Sets the maximum number of outbound HRMP channels a parachain is allowed to open. + */ + "set_hrmp_max_parachain_outbound_channels": Anonymize; + /** + *Sets the maximum number of outbound HRMP messages can be sent by a candidate. + */ + "set_hrmp_max_message_num_per_candidate": Anonymize; + /** + *Set the number of session changes after which a PVF pre-checking voting is rejected. + */ + "set_pvf_voting_ttl": Anonymize; + /** + *Sets the minimum delay between announcing the upgrade block for a parachain until the + *upgrade taking place. + * + *See the field documentation for information and constraints for the new value. + */ + "set_minimum_validation_upgrade_delay": Anonymize; + /** + *Setting this to true will disable consistency checks for the configuration setters. + *Use with caution. + */ + "set_bypass_consistency_check": Anonymize; + /** + *Set the asynchronous backing parameters. + */ + "set_async_backing_params": Anonymize; + /** + *Set PVF executor parameters. + */ + "set_executor_params": Anonymize; + /** + *Set the on demand (parathreads) base fee. + */ + "set_on_demand_base_fee": Anonymize; + /** + *Set the on demand (parathreads) fee variability. + */ + "set_on_demand_fee_variability": Anonymize; + /** + *Set the on demand (parathreads) queue max size. + */ + "set_on_demand_queue_max_size": Anonymize; + /** + *Set the on demand (parathreads) fee variability. + */ + "set_on_demand_target_queue_utilization": Anonymize; + /** + *Set the on demand (parathreads) ttl in the claimqueue. + */ + "set_on_demand_ttl": Anonymize; + /** + *Set the minimum backing votes threshold. + */ + "set_minimum_backing_votes": Anonymize; + /** + *Set/Unset a node feature. + */ + "set_node_feature": Anonymize; + /** + *Set approval-voting-params. + */ + "set_approval_voting_params": Anonymize; + /** + *Set scheduler-params. + */ + "set_scheduler_params": Anonymize; +}>; +export type Id581arok0b1nj = { + "new"?: Anonymize; +}; +export type I9jsikd1ghmc7l = { + "new": bigint; +}; +export type I2f6mha3v4ooda = { + "new": boolean; +}; +export type Iasqjdhasi408s = { + "new": Anonymize; +}; +export type I6krn2lsleo87n = { + "new": Anonymize; +}; +export type Iaid4btmkr5thp = { + "index": number; + "value": boolean; +}; +export type I559fv6um7nmhd = { + "new": Anonymize; +}; +export type Id5l4f3jqtnb0u = AnonymousEnum<{ + /** + *Enter the paras inherent. This will process bitfields and backed candidates. + */ + "enter": Anonymize; +}>; +export type Ibbf0j7ol2abrv = { + "data": Anonymize; +}; +export type Idog9jailvp00o = { + "bitfields": Anonymize; + "backed_candidates": Anonymize; + "disputes": Anonymize; + "parent_header": Anonymize; +}; +export type Ib0ijj1h4o8bcq = Array>; +export type Idrh3it7jircvh = { + "payload": { + bytes: Uint8Array; + bitsLen: number; + }; + "validator_index": number; + "signature": FixedSizeBinary<64>; +}; +export type I6n6fsk5rls02k = Array>; +export type I3m2q6a6atc1c7 = { + "candidate": Anonymize; + "validity_votes": Anonymize; + "validator_indices": { + bytes: Uint8Array; + bitsLen: number; + }; +}; +export type I7t2ron16fup67 = { + "descriptor": Anonymize; + "commitments": Anonymize; +}; +export type Id0g95rku62vif = Array; +export type Ie2dden5k4kk7t = AnonymousEnum<{ + /** + *Set the storage for the parachain validation code immediately. + */ + "force_set_current_code": Anonymize; + /** + *Set the storage for the current parachain head data immediately. + */ + "force_set_current_head": Anonymize; + /** + *Schedule an upgrade as if it was scheduled in the given relay parent block. + */ + "force_schedule_code_upgrade": Anonymize; + /** + *Note a new block head for para within the context of the current block. + */ + "force_note_new_head": Anonymize; + /** + *Put a parachain directly into the next session's action queue. + *We can't queue it any sooner than this without going into the + *initializer... + */ + "force_queue_action": Anonymize; + /** + *Adds the validation code to the storage. + * + *The code will not be added if it is already present. Additionally, if PVF pre-checking + *is running for that code, it will be instantly accepted. + * + *Otherwise, the code will be added into the storage. Note that the code will be added + *into storage with reference count 0. This is to account the fact that there are no users + *for this code yet. The caller will have to make sure that this code eventually gets + *used by some parachain or removed from the storage to avoid storage leaks. For the + *latter prefer to use the `poke_unused_validation_code` dispatchable to raw storage + *manipulation. + * + *This function is mainly meant to be used for upgrading parachains that do not follow + *the go-ahead signal while the PVF pre-checking feature is enabled. + */ + "add_trusted_validation_code": Anonymize; + /** + *Remove the validation code from the storage iff the reference count is 0. + * + *This is better than removing the storage directly, because it will not remove the code + *that was suddenly got used by some parachain while this dispatchable was pending + *dispatching. + */ + "poke_unused_validation_code": Anonymize; + /** + *Includes a statement for a PVF pre-checking vote. Potentially, finalizes the vote and + *enacts the results if that was the last vote before achieving the supermajority. + */ + "include_pvf_check_statement": Anonymize; + /** + *Set the storage for the current parachain head data immediately. + */ + "force_set_most_recent_context": Anonymize; +}>; +export type I1k3urvkqqshbc = { + "para": number; + "new_code": Binary; +}; +export type I2ff0ffsh15vej = { + "para": number; + "new_head": Binary; +}; +export type I1orfg86bkg123 = { + "para": number; + "new_code": Binary; + "relay_parent_number": number; +}; +export type Iaus4cb3drhu9q = { + "para": number; +}; +export type Ivnsat10lv9d6 = { + "validation_code": Binary; +}; +export type Ibncli8qttt2c2 = { + "validation_code_hash": FixedSizeBinary<32>; +}; +export type I33rft6ag34efs = { + "stmt": Anonymize; + "signature": FixedSizeBinary<64>; +}; +export type I36e6rra3ikq65 = { + "accept": boolean; + "subject": FixedSizeBinary<32>; + "session_index": number; + "validator_index": number; +}; +export type I9tmok5kceg2bg = { + "para": number; + "context": number; +}; +export type Ieggtnkc96vvt7 = AnonymousEnum<{ + /** + *Issue a signal to the consensus engine to forcibly act as though all parachain + *blocks in all relay chain blocks up to and including the given number in the current + *chain are valid and should be finalized. + */ + "force_approve": Anonymize; +}>; +export type I85icj2qbjeqbe = { + "up_to": number; +}; +export type I45adic8nko129 = AnonymousEnum<{ + /** + *Initiate opening a channel from a parachain to a given recipient with given channel + *parameters. + * + *- `proposed_max_capacity` - specifies how many messages can be in the channel at once. + *- `proposed_max_message_size` - specifies the maximum size of the messages. + * + *These numbers are a subject to the relay-chain configuration limits. + * + *The channel can be opened only after the recipient confirms it and only on a session + *change. + */ + "hrmp_init_open_channel": Anonymize; + /** + *Accept a pending open channel request from the given sender. + * + *The channel will be opened only on the next session boundary. + */ + "hrmp_accept_open_channel": Anonymize; + /** + *Initiate unilateral closing of a channel. The origin must be either the sender or the + *recipient in the channel being closed. + * + *The closure can only happen on a session change. + */ + "hrmp_close_channel": Anonymize; + /** + *This extrinsic triggers the cleanup of all the HRMP storage items that a para may have. + *Normally this happens once per session, but this allows you to trigger the cleanup + *immediately for a specific parachain. + * + *Number of inbound and outbound channels for `para` must be provided as witness data. + * + *Origin must be the `ChannelManager`. + */ + "force_clean_hrmp": Anonymize; + /** + *Force process HRMP open channel requests. + * + *If there are pending HRMP open channel requests, you can use this function to process + *all of those requests immediately. + * + *Total number of opening channels must be provided as witness data. + * + *Origin must be the `ChannelManager`. + */ + "force_process_hrmp_open": Anonymize; + /** + *Force process HRMP close channel requests. + * + *If there are pending HRMP close channel requests, you can use this function to process + *all of those requests immediately. + * + *Total number of closing channels must be provided as witness data. + * + *Origin must be the `ChannelManager`. + */ + "force_process_hrmp_close": Anonymize; + /** + *This cancels a pending open channel request. It can be canceled by either of the sender + *or the recipient for that request. The origin must be either of those. + * + *The cancellation happens immediately. It is not possible to cancel the request if it is + *already accepted. + * + *Total number of open requests (i.e. `HrmpOpenChannelRequestsList`) must be provided as + *witness data. + */ + "hrmp_cancel_open_request": Anonymize; + /** + *Open a channel from a `sender` to a `recipient` `ParaId`. Although opened by governance, + *the `max_capacity` and `max_message_size` are still subject to the Relay Chain's + *configured limits. + * + *Expected use is when one (and only one) of the `ParaId`s involved in the channel is + *governed by the system, e.g. a system parachain. + * + *Origin must be the `ChannelManager`. + */ + "force_open_hrmp_channel": Anonymize; + /** + *Establish an HRMP channel between two system chains. If the channel does not already + *exist, the transaction fees will be refunded to the caller. The system does not take + *deposits for channels between system chains, and automatically sets the message number + *and size limits to the maximum allowed by the network's configuration. + * + *Arguments: + * + *- `sender`: A system chain, `ParaId`. + *- `recipient`: A system chain, `ParaId`. + * + *Any signed origin can call this function, but _both_ inputs MUST be system chains. If + *the channel does not exist yet, there is no fee. + */ + "establish_system_channel": Anonymize; + /** + *Update the deposits held for an HRMP channel to the latest `Configuration`. Channels + *with system chains do not require a deposit. + * + *Arguments: + * + *- `sender`: A chain, `ParaId`. + *- `recipient`: A chain, `ParaId`. + * + *Any signed origin can call this function. + */ + "poke_channel_deposits": Anonymize; + /** + *Establish a bidirectional HRMP channel between a parachain and a system chain. + * + *Arguments: + * + *- `target_system_chain`: A system chain, `ParaId`. + * + *The origin needs to be the parachain origin. + */ + "establish_channel_with_system": Anonymize; +}>; +export type Ibuhbp68e6tkct = { + "recipient": number; + "proposed_max_capacity": number; + "proposed_max_message_size": number; +}; +export type Idrevppfiubhve = { + "sender": number; +}; +export type I9s2h36kr71vk9 = { + "channel_id": Anonymize; +}; +export type I4lkbiubo9ogq9 = { + "para": number; + "num_inbound": number; + "num_outbound": number; +}; +export type Id1baei7m8gkhk = { + "channels": number; +}; +export type I96ftepqm4vs7m = { + "channel_id": Anonymize; + "open_requests": number; +}; +export type Ic3430470j4mbv = { + "sender": number; + "recipient": number; + "max_capacity": number; + "max_message_size": number; +}; +export type Ic3n7nqb6fffo0 = { + "target_system_chain": number; +}; +export type Ifkh1ep7g9h3rv = AnonymousEnum<{ + "force_unfreeze": undefined; +}>; +export type I3jj054kp2bjol = AnonymousEnum<{ + "report_dispute_lost_unsigned": Anonymize; +}>; +export type I437u7rqtshfms = { + "dispute_proof": Anonymize; + "key_owner_proof": Anonymize; +}; +export type I943rhn463avqr = { + "time_slot": Anonymize; + "kind": SlashingOffenceKind; + "validator_index": number; + "validator_id": FixedSizeBinary<32>; +}; +export type Iee37emj23tmbu = { + "session_index": number; + "candidate_hash": FixedSizeBinary<32>; +}; +export type I9s7urueli180g = AnonymousEnum<{ + /** + *Create a single on demand core order. + *Will use the spot price for the current block and will reap the account if needed. + * + *Parameters: + *- `origin`: The sender of the call, funds will be withdrawn from this account. + *- `max_amount`: The maximum balance to withdraw from the origin to place an order. + *- `para_id`: A `ParaId` the origin wants to provide blockspace for. + * + *Errors: + *- `InsufficientBalance`: from the Currency implementation + *- `QueueFull` + *- `SpotPriceHigherThanMaxAmount` + * + *Events: + *- `OnDemandOrderPlaced` + */ + "place_order_allow_death": Anonymize; + /** + *Same as the [`place_order_allow_death`](Self::place_order_allow_death) call , but with a + *check that placing the order will not reap the account. + * + *Parameters: + *- `origin`: The sender of the call, funds will be withdrawn from this account. + *- `max_amount`: The maximum balance to withdraw from the origin to place an order. + *- `para_id`: A `ParaId` the origin wants to provide blockspace for. + * + *Errors: + *- `InsufficientBalance`: from the Currency implementation + *- `QueueFull` + *- `SpotPriceHigherThanMaxAmount` + * + *Events: + *- `OnDemandOrderPlaced` + */ + "place_order_keep_alive": Anonymize; +}>; +export type Iaa7g3f5tlv3gf = { + "max_amount": bigint; + "para_id": number; +}; +export type Icclqj5sge2nc7 = AnonymousEnum<{ + /** + *Register head data and validation code for a reserved Para Id. + * + *## Arguments + *- `origin`: Must be called by a `Signed` origin. + *- `id`: The para ID. Must be owned/managed by the `origin` signing account. + *- `genesis_head`: The genesis head data of the parachain/thread. + *- `validation_code`: The initial validation code of the parachain/thread. + * + *## Deposits/Fees + *The account with the originating signature must reserve a deposit. + * + *The deposit is required to cover the costs associated with storing the genesis head + *data and the validation code. + *This accounts for the potential to store validation code of a size up to the + *`max_code_size`, as defined in the configuration pallet + * + *Anything already reserved previously for this para ID is accounted for. + * + *## Events + *The `Registered` event is emitted in case of success. + */ + "register": Anonymize; + /** + *Force the registration of a Para Id on the relay chain. + * + *This function must be called by a Root origin. + * + *The deposit taken can be specified for this registration. Any `ParaId` + *can be registered, including sub-1000 IDs which are System Parachains. + */ + "force_register": Anonymize; + /** + *Deregister a Para Id, freeing all data and returning any deposit. + * + *The caller must be Root, the `para` owner, or the `para` itself. The para must be an + *on-demand parachain. + */ + "deregister": Anonymize; + /** + *Swap a lease holding parachain with another parachain, either on-demand or lease + *holding. + * + *The origin must be Root, the `para` owner, or the `para` itself. + * + *The swap will happen only if there is already an opposite swap pending. If there is not, + *the swap will be stored in the pending swaps map, ready for a later confirmatory swap. + * + *The `ParaId`s remain mapped to the same head data and code so external code can rely on + *`ParaId` to be a long-term identifier of a notional "parachain". However, their + *scheduling info (i.e. whether they're an on-demand parachain or lease holding + *parachain), auction information and the auction deposit are switched. + */ + "swap": Anonymize; + /** + *Remove a manager lock from a para. This will allow the manager of a + *previously locked para to deregister or swap a para without using governance. + * + *Can only be called by the Root origin or the parachain. + */ + "remove_lock": Anonymize; + /** + *Reserve a Para Id on the relay chain. + * + *This function will reserve a new Para Id to be owned/managed by the origin account. + *The origin account is able to register head data and validation code using `register` to + *create an on-demand parachain. Using the Slots pallet, an on-demand parachain can then + *be upgraded to a lease holding parachain. + * + *## Arguments + *- `origin`: Must be called by a `Signed` origin. Becomes the manager/owner of the new + * para ID. + * + *## Deposits/Fees + *The origin must reserve a deposit of `ParaDeposit` for the registration. + * + *## Events + *The `Reserved` event is emitted in case of success, which provides the ID reserved for + *use. + */ + "reserve": undefined; + /** + *Add a manager lock from a para. This will prevent the manager of a + *para to deregister or swap a para. + * + *Can be called by Root, the parachain, or the parachain manager if the parachain is + *unlocked. + */ + "add_lock": Anonymize; + /** + *Schedule a parachain upgrade. + * + *This will kick off a check of `new_code` by all validators. After the majority of the + *validators have reported on the validity of the code, the code will either be enacted + *or the upgrade will be rejected. If the code will be enacted, the current code of the + *parachain will be overwritten directly. This means that any PoV will be checked by this + *new code. The parachain itself will not be informed explicitly that the validation code + *has changed. + * + *Can be called by Root, the parachain, or the parachain manager if the parachain is + *unlocked. + */ + "schedule_code_upgrade": Anonymize; + /** + *Set the parachain's current head. + * + *Can be called by Root, the parachain, or the parachain manager if the parachain is + *unlocked. + */ + "set_current_head": Anonymize; +}>; +export type I7mf0sij342109 = { + "id": number; + "genesis_head": Binary; + "validation_code": Binary; +}; +export type Ibvirp862qkkup = { + "who": SS58String; + "deposit": bigint; + "id": number; + "genesis_head": Binary; + "validation_code": Binary; +}; +export type Ic5b47dj4coa3r = { + "id": number; +}; +export type Idehabrqi23sc0 = { + "id": number; + "other": number; +}; +export type Iafhis924j14hg = AnonymousEnum<{ + /** + *Just a connect into the `lease_out` call, in case Root wants to force some lease to + *happen independently of any other on-chain mechanism to use it. + * + *The dispatch origin for this call must match `T::ForceOrigin`. + */ + "force_lease": Anonymize; + /** + *Clear all leases for a Para Id, refunding any deposits back to the original owners. + * + *The dispatch origin for this call must match `T::ForceOrigin`. + */ + "clear_all_leases": Anonymize; + /** + *Try to onboard a parachain that has a lease for the current lease period. + * + *This function can be useful if there was some state issue with a para that should + *have onboarded, but was unable to. As long as they have a lease period, we can + *let them onboard from here. + * + *Origin must be signed, but can be called by anyone. + */ + "trigger_onboard": Anonymize; +}>; +export type Idfpo6162k0hq = { + "para": number; + "leaser": SS58String; + "amount": bigint; + "period_begin": number; + "period_count": number; +}; +export type I4a8qeimc5p3qn = AnonymousEnum<{ + /** + *Create a new auction. + * + *This can only happen when there isn't already an auction in progress and may only be + *called by the root origin. Accepts the `duration` of this auction and the + *`lease_period_index` of the initial lease period of the four that are to be auctioned. + */ + "new_auction": Anonymize; + /** + *Make a new bid from an account (including a parachain account) for deploying a new + *parachain. + * + *Multiple simultaneous bids from the same bidder are allowed only as long as all active + *bids overlap each other (i.e. are mutually exclusive). Bids cannot be redacted. + * + *- `sub` is the sub-bidder ID, allowing for multiple competing bids to be made by (and + *funded by) the same account. + *- `auction_index` is the index of the auction to bid on. Should just be the present + *value of `AuctionCounter`. + *- `first_slot` is the first lease period index of the range to bid on. This is the + *absolute lease period index value, not an auction-specific offset. + *- `last_slot` is the last lease period index of the range to bid on. This is the + *absolute lease period index value, not an auction-specific offset. + *- `amount` is the amount to bid to be held as deposit for the parachain should the + *bid win. This amount is held throughout the range. + */ + "bid": Anonymize; + /** + *Cancel an in-progress auction. + * + *Can only be called by Root origin. + */ + "cancel_auction": undefined; +}>; +export type I19hvnphoaj44l = { + "duration": number; + "lease_period_index": number; +}; +export type I1ng31ej27mh4k = { + "para": number; + "auction_index": number; + "first_slot": number; + "last_slot": number; + "amount": bigint; +}; +export type Iaj4q75nu5v2i2 = AnonymousEnum<{ + /** + *Create a new crowdloaning campaign for a parachain slot with the given lease period + *range. + * + *This applies a lock to your parachain configuration, ensuring that it cannot be changed + *by the parachain manager. + */ + "create": Anonymize; + /** + *Contribute to a crowd sale. This will transfer some balance over to fund a parachain + *slot. It will be withdrawable when the crowdloan has ended and the funds are unused. + */ + "contribute": Anonymize; + /** + *Withdraw full balance of a specific contributor. + * + *Origin must be signed, but can come from anyone. + * + *The fund must be either in, or ready for, retirement. For a fund to be *in* retirement, + *then the retirement flag must be set. For a fund to be ready for retirement, then: + *- it must not already be in retirement; + *- the amount of raised funds must be bigger than the _free_ balance of the account; + *- and either: + * - the block number must be at least `end`; or + * - the current lease period must be greater than the fund's `last_period`. + * + *In this case, the fund's retirement flag is set and its `end` is reset to the current + *block number. + * + *- `who`: The account whose contribution should be withdrawn. + *- `index`: The parachain to whose crowdloan the contribution was made. + */ + "withdraw": Anonymize; + /** + *Automatically refund contributors of an ended crowdloan. + *Due to weight restrictions, this function may need to be called multiple + *times to fully refund all users. We will refund `RemoveKeysLimit` users at a time. + * + *Origin must be signed, but can come from anyone. + */ + "refund": Anonymize; + /** + *Remove a fund after the retirement period has ended and all funds have been returned. + */ + "dissolve": Anonymize; + /** + *Edit the configuration for an in-progress crowdloan. + * + *Can only be called by Root origin. + */ + "edit": Anonymize; + /** + *Add an optional memo to an existing crowdloan contribution. + * + *Origin must be Signed, and the user must have contributed to the crowdloan. + */ + "add_memo": Anonymize; + /** + *Poke the fund into `NewRaise` + * + *Origin must be Signed, and the fund has non-zero raise. + */ + "poke": Anonymize; + /** + *Contribute your entire balance to a crowd sale. This will transfer the entire balance of + *a user over to fund a parachain slot. It will be withdrawable when the crowdloan has + *ended and the funds are unused. + */ + "contribute_all": Anonymize; +}>; +export type I85qkvekflgteq = { + "index": number; + "cap": bigint; + "first_period": number; + "last_period": number; + "end": number; + "verifier"?: Anonymize; +}; +export type I1qt5nua7ua655 = { + "index": number; + "value": bigint; + "signature"?: Anonymize; +}; +export type I86cdjmsf3a81s = (MultiSignature) | undefined; +export type MultiSignature = Enum<{ + "Ed25519": FixedSizeBinary<64>; + "Sr25519": FixedSizeBinary<64>; + "Ecdsa": FixedSizeBinary<65>; +}>; +export declare const MultiSignature: GetEnum; +export type I7cl9esn1l72m7 = { + "index": number; + "memo": Binary; +}; +export type Id68sq6o2gm8qi = { + "index": number; + "signature"?: Anonymize; +}; +export type Idu7bbtd2jtnb9 = AnonymousEnum<{ + /** + *Request the configuration to be updated with the specified number of cores. Warning: + *Since this only schedules a configuration update, it takes two sessions to come into + *effect. + * + *- `origin`: Root or the Coretime Chain + *- `count`: total number of cores + */ + "request_core_count": Anonymize; + /** + *Request to claim the instantaneous coretime sales revenue starting from the block it was + *last claimed until and up to the block specified. The claimed amount value is sent back + *to the Coretime chain in a `notify_revenue` message. At the same time, the amount is + *teleported to the Coretime chain. + */ + "request_revenue_at": Anonymize; + /** + *Receive instructions from the `ExternalBrokerOrigin`, detailing how a specific core is + *to be used. + * + *Parameters: + *-`origin`: The `ExternalBrokerOrigin`, assumed to be the coretime chain. + *-`core`: The core that should be scheduled. + *-`begin`: The starting blockheight of the instruction. + *-`assignment`: How the blockspace should be utilised. + *-`end_hint`: An optional hint as to when this particular set of instructions will end. + */ + "assign_core": Anonymize; +}>; +export type I2gpmmfdqv3cdc = { + "core": number; + "begin": number; + "assignment": Anonymize; + "end_hint"?: Anonymize; +}; +export type I39l72gdmkk30t = AnonymousEnum<{ + /** + *Control the automatic migration. + * + *The dispatch origin of this call must be [`Config::ControlOrigin`]. + */ + "control_auto_migration": Anonymize; + /** + *Continue the migration for the given `limits`. + * + *The dispatch origin of this call can be any signed account. + * + *This transaction has NO MONETARY INCENTIVES. calling it will not reward anyone. Albeit, + *Upon successful execution, the transaction fee is returned. + * + *The (potentially over-estimated) of the byte length of all the data read must be + *provided for up-front fee-payment and weighing. In essence, the caller is guaranteeing + *that executing the current `MigrationTask` with the given `limits` will not exceed + *`real_size_upper` bytes of read data. + * + *The `witness_task` is merely a helper to prevent the caller from being slashed or + *generally trigger a migration that they do not intend. This parameter is just a message + *from caller, saying that they believed `witness_task` was the last state of the + *migration, and they only wish for their transaction to do anything, if this assumption + *holds. In case `witness_task` does not match, the transaction fails. + * + *Based on the documentation of [`MigrationTask::migrate_until_exhaustion`], the + *recommended way of doing this is to pass a `limit` that only bounds `count`, as the + *`size` limit can always be overwritten. + */ + "continue_migrate": Anonymize; + /** + *Migrate the list of top keys by iterating each of them one by one. + * + *This does not affect the global migration process tracker ([`MigrationProcess`]), and + *should only be used in case any keys are leftover due to a bug. + */ + "migrate_custom_top": Anonymize; + /** + *Migrate the list of child keys by iterating each of them one by one. + * + *All of the given child keys must be present under one `child_root`. + * + *This does not affect the global migration process tracker ([`MigrationProcess`]), and + *should only be used in case any keys are leftover due to a bug. + */ + "migrate_custom_child": Anonymize; + /** + *Set the maximum limit of the signed migration. + */ + "set_signed_max_limits": Anonymize; + /** + *Forcefully set the progress the running migration. + * + *This is only useful in one case: the next key to migrate is too big to be migrated with + *a signed account, in a parachain context, and we simply want to skip it. A reasonable + *example of this would be `:code:`, which is both very expensive to migrate, and commonly + *used, so probably it is already migrated. + * + *In case you mess things up, you can also, in principle, use this to reset the migration + *process. + */ + "force_set_progress": Anonymize; +}>; +export type I7psec5e6ghc64 = { + "maybe_config"?: Anonymize; +}; +export type I2psb0sladd863 = { + "limits": Anonymize; + "real_size_upper": number; + "witness_task": Anonymize; +}; +export type I585tk8khua0gk = { + "keys": Anonymize; + "witness_size": number; +}; +export type I3ut99di214ru2 = { + "root": Binary; + "child_keys": Anonymize; + "total_size": number; +}; +export type Iemkp87d26vsbh = { + "limits": Anonymize; +}; +export type I4ahfrt5dscf6q = { + "progress_top": Anonymize; + "progress_child": Anonymize; +}; +export type I9nbjvlrb9bp1g = AnonymousEnum<{ + "send": Anonymize; + /** + *Teleport some assets from the local chain to some destination chain. + * + ***This function is deprecated: Use `limited_teleport_assets` instead.** + * + *Fee payment on the destination side is made from the asset in the `assets` vector of + *index `fee_asset_item`. The weight limit for fees is not provided and thus is unlimited, + *with all fees taken as needed from the asset. + * + *- `origin`: Must be capable of withdrawing the `assets` and executing XCM. + *- `dest`: Destination context for the assets. Will typically be `[Parent, + * Parachain(..)]` to send from parachain to parachain, or `[Parachain(..)]` to send from + * relay to parachain. + *- `beneficiary`: A beneficiary location for the assets in the context of `dest`. Will + * generally be an `AccountId32` value. + *- `assets`: The assets to be withdrawn. This should include the assets used to pay the + * fee on the `dest` chain. + *- `fee_asset_item`: The index into `assets` of the item which should be used to pay + * fees. + */ + "teleport_assets": Anonymize; + /** + *Transfer some assets from the local chain to the destination chain through their local, + *destination or remote reserve. + * + *`assets` must have same reserve location and may not be teleportable to `dest`. + * - `assets` have local reserve: transfer assets to sovereign account of destination + * chain and forward a notification XCM to `dest` to mint and deposit reserve-based + * assets to `beneficiary`. + * - `assets` have destination reserve: burn local assets and forward a notification to + * `dest` chain to withdraw the reserve assets from this chain's sovereign account and + * deposit them to `beneficiary`. + * - `assets` have remote reserve: burn local assets, forward XCM to reserve chain to move + * reserves from this chain's SA to `dest` chain's SA, and forward another XCM to `dest` + * to mint and deposit reserve-based assets to `beneficiary`. + * + ***This function is deprecated: Use `limited_reserve_transfer_assets` instead.** + * + *Fee payment on the destination side is made from the asset in the `assets` vector of + *index `fee_asset_item`. The weight limit for fees is not provided and thus is unlimited, + *with all fees taken as needed from the asset. + * + *- `origin`: Must be capable of withdrawing the `assets` and executing XCM. + *- `dest`: Destination context for the assets. Will typically be `[Parent, + * Parachain(..)]` to send from parachain to parachain, or `[Parachain(..)]` to send from + * relay to parachain. + *- `beneficiary`: A beneficiary location for the assets in the context of `dest`. Will + * generally be an `AccountId32` value. + *- `assets`: The assets to be withdrawn. This should include the assets used to pay the + * fee on the `dest` (and possibly reserve) chains. + *- `fee_asset_item`: The index into `assets` of the item which should be used to pay + * fees. + */ + "reserve_transfer_assets": Anonymize; + /** + *Execute an XCM message from a local, signed, origin. + * + *An event is deposited indicating whether `msg` could be executed completely or only + *partially. + * + *No more than `max_weight` will be used in its attempted execution. If this is less than + *the maximum amount of weight that the message could take to be executed, then no + *execution attempt will be made. + */ + "execute": Anonymize; + /** + *Extoll that a particular destination can be communicated with through a particular + *version of XCM. + * + *- `origin`: Must be an origin specified by AdminOrigin. + *- `location`: The destination that is being described. + *- `xcm_version`: The latest version of XCM that `location` supports. + */ + "force_xcm_version": Anonymize; + /** + *Set a safe XCM version (the version that XCM should be encoded with if the most recent + *version a destination can accept is unknown). + * + *- `origin`: Must be an origin specified by AdminOrigin. + *- `maybe_xcm_version`: The default XCM encoding version, or `None` to disable. + */ + "force_default_xcm_version": Anonymize; + /** + *Ask a location to notify us regarding their XCM version and any changes to it. + * + *- `origin`: Must be an origin specified by AdminOrigin. + *- `location`: The location to which we should subscribe for XCM version notifications. + */ + "force_subscribe_version_notify": Anonymize; + /** + *Require that a particular destination should no longer notify us regarding any XCM + *version changes. + * + *- `origin`: Must be an origin specified by AdminOrigin. + *- `location`: The location to which we are currently subscribed for XCM version + * notifications which we no longer desire. + */ + "force_unsubscribe_version_notify": Anonymize; + /** + *Transfer some assets from the local chain to the destination chain through their local, + *destination or remote reserve. + * + *`assets` must have same reserve location and may not be teleportable to `dest`. + * - `assets` have local reserve: transfer assets to sovereign account of destination + * chain and forward a notification XCM to `dest` to mint and deposit reserve-based + * assets to `beneficiary`. + * - `assets` have destination reserve: burn local assets and forward a notification to + * `dest` chain to withdraw the reserve assets from this chain's sovereign account and + * deposit them to `beneficiary`. + * - `assets` have remote reserve: burn local assets, forward XCM to reserve chain to move + * reserves from this chain's SA to `dest` chain's SA, and forward another XCM to `dest` + * to mint and deposit reserve-based assets to `beneficiary`. + * + *Fee payment on the destination side is made from the asset in the `assets` vector of + *index `fee_asset_item`, up to enough to pay for `weight_limit` of weight. If more weight + *is needed than `weight_limit`, then the operation will fail and the sent assets may be + *at risk. + * + *- `origin`: Must be capable of withdrawing the `assets` and executing XCM. + *- `dest`: Destination context for the assets. Will typically be `[Parent, + * Parachain(..)]` to send from parachain to parachain, or `[Parachain(..)]` to send from + * relay to parachain. + *- `beneficiary`: A beneficiary location for the assets in the context of `dest`. Will + * generally be an `AccountId32` value. + *- `assets`: The assets to be withdrawn. This should include the assets used to pay the + * fee on the `dest` (and possibly reserve) chains. + *- `fee_asset_item`: The index into `assets` of the item which should be used to pay + * fees. + *- `weight_limit`: The remote-side weight limit, if any, for the XCM fee purchase. + */ + "limited_reserve_transfer_assets": Anonymize; + /** + *Teleport some assets from the local chain to some destination chain. + * + *Fee payment on the destination side is made from the asset in the `assets` vector of + *index `fee_asset_item`, up to enough to pay for `weight_limit` of weight. If more weight + *is needed than `weight_limit`, then the operation will fail and the sent assets may be + *at risk. + * + *- `origin`: Must be capable of withdrawing the `assets` and executing XCM. + *- `dest`: Destination context for the assets. Will typically be `[Parent, + * Parachain(..)]` to send from parachain to parachain, or `[Parachain(..)]` to send from + * relay to parachain. + *- `beneficiary`: A beneficiary location for the assets in the context of `dest`. Will + * generally be an `AccountId32` value. + *- `assets`: The assets to be withdrawn. This should include the assets used to pay the + * fee on the `dest` chain. + *- `fee_asset_item`: The index into `assets` of the item which should be used to pay + * fees. + *- `weight_limit`: The remote-side weight limit, if any, for the XCM fee purchase. + */ + "limited_teleport_assets": Anonymize; + /** + *Set or unset the global suspension state of the XCM executor. + * + *- `origin`: Must be an origin specified by AdminOrigin. + *- `suspended`: `true` to suspend, `false` to resume. + */ + "force_suspension": Anonymize; + /** + *Transfer some assets from the local chain to the destination chain through their local, + *destination or remote reserve, or through teleports. + * + *Fee payment on the destination side is made from the asset in the `assets` vector of + *index `fee_asset_item` (hence referred to as `fees`), up to enough to pay for + *`weight_limit` of weight. If more weight is needed than `weight_limit`, then the + *operation will fail and the sent assets may be at risk. + * + *`assets` (excluding `fees`) must have same reserve location or otherwise be teleportable + *to `dest`, no limitations imposed on `fees`. + * - for local reserve: transfer assets to sovereign account of destination chain and + * forward a notification XCM to `dest` to mint and deposit reserve-based assets to + * `beneficiary`. + * - for destination reserve: burn local assets and forward a notification to `dest` chain + * to withdraw the reserve assets from this chain's sovereign account and deposit them + * to `beneficiary`. + * - for remote reserve: burn local assets, forward XCM to reserve chain to move reserves + * from this chain's SA to `dest` chain's SA, and forward another XCM to `dest` to mint + * and deposit reserve-based assets to `beneficiary`. + * - for teleports: burn local assets and forward XCM to `dest` chain to mint/teleport + * assets and deposit them to `beneficiary`. + * + *- `origin`: Must be capable of withdrawing the `assets` and executing XCM. + *- `dest`: Destination context for the assets. Will typically be `X2(Parent, + * Parachain(..))` to send from parachain to parachain, or `X1(Parachain(..))` to send + * from relay to parachain. + *- `beneficiary`: A beneficiary location for the assets in the context of `dest`. Will + * generally be an `AccountId32` value. + *- `assets`: The assets to be withdrawn. This should include the assets used to pay the + * fee on the `dest` (and possibly reserve) chains. + *- `fee_asset_item`: The index into `assets` of the item which should be used to pay + * fees. + *- `weight_limit`: The remote-side weight limit, if any, for the XCM fee purchase. + */ + "transfer_assets": Anonymize; + /** + *Claims assets trapped on this pallet because of leftover assets during XCM execution. + * + *- `origin`: Anyone can call this extrinsic. + *- `assets`: The exact assets that were trapped. Use the version to specify what version + *was the latest when they were trapped. + *- `beneficiary`: The location/account where the claimed assets will be deposited. + */ + "claim_assets": Anonymize; + /** + *Transfer assets from the local chain to the destination chain using explicit transfer + *types for assets and fees. + * + *`assets` must have same reserve location or may be teleportable to `dest`. Caller must + *provide the `assets_transfer_type` to be used for `assets`: + * - `TransferType::LocalReserve`: transfer assets to sovereign account of destination + * chain and forward a notification XCM to `dest` to mint and deposit reserve-based + * assets to `beneficiary`. + * - `TransferType::DestinationReserve`: burn local assets and forward a notification to + * `dest` chain to withdraw the reserve assets from this chain's sovereign account and + * deposit them to `beneficiary`. + * - `TransferType::RemoteReserve(reserve)`: burn local assets, forward XCM to `reserve` + * chain to move reserves from this chain's SA to `dest` chain's SA, and forward another + * XCM to `dest` to mint and deposit reserve-based assets to `beneficiary`. Typically + * the remote `reserve` is Asset Hub. + * - `TransferType::Teleport`: burn local assets and forward XCM to `dest` chain to + * mint/teleport assets and deposit them to `beneficiary`. + * + *On the destination chain, as well as any intermediary hops, `BuyExecution` is used to + *buy execution using transferred `assets` identified by `remote_fees_id`. + *Make sure enough of the specified `remote_fees_id` asset is included in the given list + *of `assets`. `remote_fees_id` should be enough to pay for `weight_limit`. If more weight + *is needed than `weight_limit`, then the operation will fail and the sent assets may be + *at risk. + * + *`remote_fees_id` may use different transfer type than rest of `assets` and can be + *specified through `fees_transfer_type`. + * + *The caller needs to specify what should happen to the transferred assets once they reach + *the `dest` chain. This is done through the `custom_xcm_on_dest` parameter, which + *contains the instructions to execute on `dest` as a final step. + * This is usually as simple as: + * `Xcm(vec![DepositAsset { assets: Wild(AllCounted(assets.len())), beneficiary }])`, + * but could be something more exotic like sending the `assets` even further. + * + *- `origin`: Must be capable of withdrawing the `assets` and executing XCM. + *- `dest`: Destination context for the assets. Will typically be `[Parent, + * Parachain(..)]` to send from parachain to parachain, or `[Parachain(..)]` to send from + * relay to parachain, or `(parents: 2, (GlobalConsensus(..), ..))` to send from + * parachain across a bridge to another ecosystem destination. + *- `assets`: The assets to be withdrawn. This should include the assets used to pay the + * fee on the `dest` (and possibly reserve) chains. + *- `assets_transfer_type`: The XCM `TransferType` used to transfer the `assets`. + *- `remote_fees_id`: One of the included `assets` to be used to pay fees. + *- `fees_transfer_type`: The XCM `TransferType` used to transfer the `fees` assets. + *- `custom_xcm_on_dest`: The XCM to be executed on `dest` chain as the last step of the + * transfer, which also determines what happens to the assets on the destination chain. + *- `weight_limit`: The remote-side weight limit, if any, for the XCM fee purchase. + */ + "transfer_assets_using_type_and_then": Anonymize; +}>; +export type I9paqujeb1fpv6 = { + "dest": DotXcmVersionedLocation; + "message": DotXcmVersionedXcm; +}; +export type DotXcmVersionedXcm = Enum<{ + "V2": Anonymize; + "V3": Anonymize; + "V4": Anonymize; +}>; +export declare const DotXcmVersionedXcm: GetEnum; +export type Iemqgk0vect4v7 = Array; +export type XcmV2Instruction = Enum<{ + "WithdrawAsset": Anonymize; + "ReserveAssetDeposited": Anonymize; + "ReceiveTeleportedAsset": Anonymize; + "QueryResponse": Anonymize; + "TransferAsset": Anonymize; + "TransferReserveAsset": Anonymize; + "Transact": Anonymize; + "HrmpNewChannelOpenRequest": Anonymize; + "HrmpChannelAccepted": Anonymize; + "HrmpChannelClosing": Anonymize; + "ClearOrigin": undefined; + "DescendOrigin": XcmV2MultilocationJunctions; + "ReportError": Anonymize; + "DepositAsset": Anonymize; + "DepositReserveAsset": Anonymize; + "ExchangeAsset": Anonymize; + "InitiateReserveWithdraw": Anonymize; + "InitiateTeleport": Anonymize; + "QueryHolding": Anonymize; + "BuyExecution": Anonymize; + "RefundSurplus": undefined; + "SetErrorHandler": Anonymize; + "SetAppendix": Anonymize; + "ClearError": undefined; + "ClaimAsset": Anonymize; + "Trap": bigint; + "SubscribeVersion": Anonymize; + "UnsubscribeVersion": undefined; +}>; +export declare const XcmV2Instruction: GetEnum; +export type I1n70k431nr92 = { + "query_id": bigint; + "response": XcmV2Response; + "max_weight": bigint; +}; +export type I800n35601gllq = { + "assets": Anonymize; + "beneficiary": Anonymize; +}; +export type I4ahfnfo1h39ng = { + "assets": Anonymize; + "dest": Anonymize; + "xcm": Anonymize; +}; +export type Icoi0hvjidego7 = { + "origin_type": XcmV2OriginKind; + "require_weight_at_most": bigint; + "call": Binary; +}; +export type I9ts0mtbeaq84a = { + "query_id": bigint; + "dest": Anonymize; + "max_response_weight": bigint; +}; +export type Ias146869ruhho = { + "assets": XcmV2MultiAssetFilter; + "max_assets": number; + "beneficiary": Anonymize; +}; +export type XcmV2MultiAssetFilter = Enum<{ + "Definite": Anonymize; + "Wild": XcmV2MultiassetWildMultiAsset; +}>; +export declare const XcmV2MultiAssetFilter: GetEnum; +export type XcmV2MultiassetWildMultiAsset = Enum<{ + "All": undefined; + "AllOf": Anonymize; +}>; +export declare const XcmV2MultiassetWildMultiAsset: GetEnum; +export type I8ojnukqr6c3j6 = { + "id": XcmV2MultiassetAssetId; + "fun": XcmV2MultiassetWildFungibility; +}; +export type I1upba6ju0ujgo = { + "assets": XcmV2MultiAssetFilter; + "max_assets": number; + "dest": Anonymize; + "xcm": Anonymize; +}; +export type Id2jloidb259tk = { + "give": XcmV2MultiAssetFilter; + "receive": Anonymize; +}; +export type I4dks21gdu9pr2 = { + "assets": XcmV2MultiAssetFilter; + "reserve": Anonymize; + "xcm": Anonymize; +}; +export type I4mu8vn87cfdeb = { + "assets": XcmV2MultiAssetFilter; + "dest": Anonymize; + "xcm": Anonymize; +}; +export type Ib0pr3c4bd0b1s = { + "query_id": bigint; + "dest": Anonymize; + "assets": XcmV2MultiAssetFilter; + "max_response_weight": bigint; +}; +export type Id8o97c8tt042k = { + "fees": Anonymize; + "weight_limit": XcmV2WeightLimit; +}; +export type XcmV2WeightLimit = Enum<{ + "Unlimited": undefined; + "Limited": bigint; +}>; +export declare const XcmV2WeightLimit: GetEnum; +export type I2i62b6lp2e74f = { + "assets": Anonymize; + "ticket": Anonymize; +}; +export type Ido2s48ntevurj = { + "query_id": bigint; + "max_response_weight": bigint; +}; +export type Ianvng4e08j9ii = Array; +export type XcmV3Instruction = Enum<{ + "WithdrawAsset": Anonymize; + "ReserveAssetDeposited": Anonymize; + "ReceiveTeleportedAsset": Anonymize; + "QueryResponse": Anonymize; + "TransferAsset": Anonymize; + "TransferReserveAsset": Anonymize; + "Transact": Anonymize; + "HrmpNewChannelOpenRequest": Anonymize; + "HrmpChannelAccepted": Anonymize; + "HrmpChannelClosing": Anonymize; + "ClearOrigin": undefined; + "DescendOrigin": XcmV3Junctions; + "ReportError": Anonymize; + "DepositAsset": Anonymize; + "DepositReserveAsset": Anonymize; + "ExchangeAsset": Anonymize; + "InitiateReserveWithdraw": Anonymize; + "InitiateTeleport": Anonymize; + "ReportHolding": Anonymize; + "BuyExecution": Anonymize; + "RefundSurplus": undefined; + "SetErrorHandler": Anonymize; + "SetAppendix": Anonymize; + "ClearError": undefined; + "ClaimAsset": Anonymize; + "Trap": bigint; + "SubscribeVersion": Anonymize; + "UnsubscribeVersion": undefined; + "BurnAsset": Anonymize; + "ExpectAsset": Anonymize; + "ExpectOrigin"?: Anonymize; + "ExpectError"?: Anonymize; + "ExpectTransactStatus": XcmV3MaybeErrorCode; + "QueryPallet": Anonymize; + "ExpectPallet": Anonymize; + "ReportTransactStatus": Anonymize; + "ClearTransactStatus": undefined; + "UniversalOrigin": XcmV3Junction; + "ExportMessage": Anonymize; + "LockAsset": Anonymize; + "UnlockAsset": Anonymize; + "NoteUnlockable": Anonymize; + "RequestUnlock": Anonymize; + "SetFeesMode": Anonymize; + "SetTopic": FixedSizeBinary<32>; + "ClearTopic": undefined; + "AliasOrigin": Anonymize; + "UnpaidExecution": Anonymize; +}>; +export declare const XcmV3Instruction: GetEnum; +export type I6g12ltekg2vaj = { + "query_id": bigint; + "response": XcmV3Response; + "max_weight": Anonymize; + "querier"?: Anonymize; +}; +export type I8d6ni89sh0qmn = { + "assets": Anonymize; + "beneficiary": Anonymize; +}; +export type Ib2euffogp56pp = { + "assets": Anonymize; + "dest": Anonymize; + "xcm": Anonymize; +}; +export type Ia848euuv1lip6 = { + "assets": XcmV3MultiassetMultiAssetFilter; + "beneficiary": Anonymize; +}; +export type XcmV3MultiassetMultiAssetFilter = Enum<{ + "Definite": Anonymize; + "Wild": XcmV3MultiassetWildMultiAsset; +}>; +export declare const XcmV3MultiassetMultiAssetFilter: GetEnum; +export type XcmV3MultiassetWildMultiAsset = Enum<{ + "All": undefined; + "AllOf": Anonymize; + "AllCounted": number; + "AllOfCounted": Anonymize; +}>; +export declare const XcmV3MultiassetWildMultiAsset: GetEnum; +export type Iemi0m9547o42b = { + "id": XcmV3MultiassetAssetId; + "fun": XcmV2MultiassetWildFungibility; +}; +export type I2ii8gjc2m1ca3 = { + "id": XcmV3MultiassetAssetId; + "fun": XcmV2MultiassetWildFungibility; + "count": number; +}; +export type I3m8e0mi6lq6fj = { + "assets": XcmV3MultiassetMultiAssetFilter; + "dest": Anonymize; + "xcm": Anonymize; +}; +export type Ich3d4125568vq = { + "give": XcmV3MultiassetMultiAssetFilter; + "want": Anonymize; + "maximal": boolean; +}; +export type I3k3ia72gehj6b = { + "assets": XcmV3MultiassetMultiAssetFilter; + "reserve": Anonymize; + "xcm": Anonymize; +}; +export type I4qgd1h8m3umqc = { + "response_info": Anonymize; + "assets": XcmV3MultiassetMultiAssetFilter; +}; +export type I9ff02md5rmeur = { + "fees": Anonymize; + "weight_limit": XcmV3WeightLimit; +}; +export type I8pu3j74el68mi = { + "assets": Anonymize; + "ticket": Anonymize; +}; +export type I8up5nu6gcp077 = { + "network": XcmV3JunctionNetworkId; + "destination": XcmV3Junctions; + "xcm": Anonymize; +}; +export type I2ieo5vo1bi5a0 = { + "asset": Anonymize; + "unlocker": Anonymize; +}; +export type I3u52dm5pikv6l = { + "asset": Anonymize; + "target": Anonymize; +}; +export type Idu2tro9aukpp8 = { + "asset": Anonymize; + "owner": Anonymize; +}; +export type Iarqpt33435e7r = { + "asset": Anonymize; + "locker": Anonymize; +}; +export type Iakevv83i18n4r = { + "dest": DotXcmVersionedLocation; + "beneficiary": DotXcmVersionedLocation; + "assets": DotXcmVersionedAssets; + "fee_asset_item": number; +}; +export type If2ssl12kcglhg = { + "message": DotXcmVersionedXcm; + "max_weight": Anonymize; +}; +export type Ic76kfh5ebqkpl = { + "maybe_xcm_version"?: Anonymize; +}; +export type Icrujen33bbibf = { + "location": DotXcmVersionedLocation; +}; +export type I5gi8h3e5lkbeq = { + "dest": DotXcmVersionedLocation; + "beneficiary": DotXcmVersionedLocation; + "assets": DotXcmVersionedAssets; + "fee_asset_item": number; + "weight_limit": XcmV3WeightLimit; +}; +export type Ibgm4rnf22lal1 = { + "suspended": boolean; +}; +export type I8mmaab8je28oo = { + "assets": DotXcmVersionedAssets; + "beneficiary": DotXcmVersionedLocation; +}; +export type I6r0pr82pbiftt = { + "dest": DotXcmVersionedLocation; + "assets": DotXcmVersionedAssets; + "assets_transfer_type": Anonymize; + "remote_fees_id": DotXcmVersionedAssetId; + "fees_transfer_type": Anonymize; + "custom_xcm_on_dest": DotXcmVersionedXcm; + "weight_limit": XcmV3WeightLimit; +}; +export type Ifkg2rgjl54s88 = AnonymousEnum<{ + "Teleport": undefined; + "LocalReserve": undefined; + "DestinationReserve": undefined; + "RemoteReserve": DotXcmVersionedLocation; +}>; +export type I3lic4llm6egbr = AnonymousEnum<{ + /** + *Remove a page which has no more messages remaining to be processed or is stale. + */ + "reap_page": Anonymize; + /** + *Execute an overweight message. + * + *Temporary processing errors will be propagated whereas permanent errors are treated + *as success condition. + * + *- `origin`: Must be `Signed`. + *- `message_origin`: The origin from which the message to be executed arrived. + *- `page`: The page in the queue in which the message to be executed is sitting. + *- `index`: The index into the queue of the message to be executed. + *- `weight_limit`: The maximum amount of weight allowed to be consumed in the execution + * of the message. + * + *Benchmark complexity considerations: O(index + weight_limit). + */ + "execute_overweight": Anonymize; +}>; +export type Ibv4ep0hngvn9e = { + "message_origin": ParachainsInclusionAggregateMessageOrigin; + "page_index": number; +}; +export type Ieoqregtp7b00 = { + "message_origin": ParachainsInclusionAggregateMessageOrigin; + "page": number; + "index": number; + "weight_limit": Anonymize; +}; +export type I85dm8mgt48css = AnonymousEnum<{ + /** + *Initialize a conversion rate to native balance for the given asset. + * + *## Complexity + *- O(1) + */ + "create": Anonymize; + /** + *Update the conversion rate to native balance for the given asset. + * + *## Complexity + *- O(1) + */ + "update": Anonymize; + /** + *Remove an existing conversion rate to native balance for the given asset. + * + *## Complexity + *- O(1) + */ + "remove": Anonymize; +}>; +export type I918ie8roegt3d = AnonymousEnum<{ + /** + *Report voter equivocation/misbehavior. This method will verify the + *equivocation proof and validate the given key ownership proof + *against the extracted offender. If both are valid, the offence + *will be reported. + */ + "report_equivocation": Anonymize; + /** + *Report voter equivocation/misbehavior. This method will verify the + *equivocation proof and validate the given key ownership proof + *against the extracted offender. If both are valid, the offence + *will be reported. + * + *This extrinsic must be called unsigned and it is expected that only + *block authors will call it (validated in `ValidateUnsigned`), as such + *if the block author is defined it will be defined as the equivocation + *reporter. + */ + "report_equivocation_unsigned": Anonymize; + /** + *Reset BEEFY consensus by setting a new BEEFY genesis at `delay_in_blocks` blocks in the + *future. + * + *Note: `delay_in_blocks` has to be at least 1. + */ + "set_new_genesis": Anonymize; +}>; +export type I3pirohb0sp3ic = { + "equivocation_proof": Anonymize; + "key_owner_proof": Anonymize; +}; +export type Ifiofttj73fsk1 = { + "first": Anonymize; + "second": Anonymize; +}; +export type I3eao7ea0kppv8 = { + "commitment": Anonymize; + "id": FixedSizeBinary<33>; + "signature": FixedSizeBinary<65>; +}; +export type I7tlsksnl3jlio = { + "payload": Anonymize; + "block_number": number; + "validator_set_id": bigint; +}; +export type I6vldfoagmi4g5 = Array>; +export type I6cq0cjs0cjcep = [FixedSizeBinary<2>, Binary]; +export type Iemqna2uucuei9 = { + "delay_in_blocks": number; +}; +export type I3he5stuuhiokq = { + "inflation": bigint; + "next_mint": Anonymize; +}; +export type Iaqet9jc3ihboe = { + "header": Anonymize; + "extrinsics": Anonymize; +}; +export type I2v50gu3s1aqk6 = AnonymousEnum<{ + "AllExtrinsics": undefined; + "OnlyInherents": undefined; +}>; +export type I327rt3qgnu4r6 = ResultPayload, TransactionValidityError>; +export type TransactionValidityError = Enum<{ + "Invalid": TransactionValidityInvalidTransaction; + "Unknown": TransactionValidityUnknownTransaction; +}>; +export declare const TransactionValidityError: GetEnum; +export type TransactionValidityInvalidTransaction = Enum<{ + "Call": undefined; + "Payment": undefined; + "Future": undefined; + "Stale": undefined; + "BadProof": undefined; + "AncientBirthBlock": undefined; + "ExhaustsResources": undefined; + "Custom": number; + "BadMandatory": undefined; + "MandatoryValidation": undefined; + "BadSigner": undefined; +}>; +export declare const TransactionValidityInvalidTransaction: GetEnum; +export type TransactionValidityUnknownTransaction = Enum<{ + "CannotLookup": undefined; + "NoUnsignedValidator": undefined; + "Custom": number; +}>; +export declare const TransactionValidityUnknownTransaction: GetEnum; +export type If7uv525tdvv7a = Array>; +export type I76hdjk9qh40no = [FixedSizeBinary<8>, Binary]; +export type I2an1fs2eiebjp = { + "okay": boolean; + "fatal_error": boolean; + "errors": Anonymize; +}; +export type TransactionValidityTransactionSource = Enum<{ + "InBlock": undefined; + "Local": undefined; + "External": undefined; +}>; +export declare const TransactionValidityTransactionSource: GetEnum; +export type Iajbob6uln5jct = ResultPayload, TransactionValidityError>; +export type I6g5lcd9vf2cr0 = { + "priority": bigint; + "requires": Anonymize; + "provides": Anonymize; + "longevity": bigint; + "propagate": boolean; +}; +export type I5985kfq7sspta = [Anonymize, Anonymize]; +export type I94uslvmqboam8 = { + "session_start_block": number; + "group_rotation_frequency": number; + "now": number; +}; +export type I4jmodim0td97u = Array; +export type CoreState = Enum<{ + "Occupied": Anonymize; + "Scheduled": Anonymize; + "Free": undefined; +}>; +export declare const CoreState: GetEnum; +export type Ish8ehjre2op3 = { + "next_up_on_available"?: Anonymize; + "occupied_since": number; + "time_out_at": number; + "next_up_on_time_out"?: Anonymize; + "availability": { + bytes: Uint8Array; + bitsLen: number; + }; + "group_responsible": number; + "candidate_hash": FixedSizeBinary<32>; + "candidate_descriptor": Anonymize; +}; +export type I7o5sh7g5s2102 = (Anonymize) | undefined; +export type I4fn9prq249c92 = { + "para_id": number; + "collator"?: Anonymize; +}; +export type OccupiedCoreAssumption = Enum<{ + "Included": undefined; + "TimedOut": undefined; + "Free": undefined; +}>; +export declare const OccupiedCoreAssumption: GetEnum; +export type I9kavsa730sjfr = (Anonymize) | undefined; +export type Ifn6q3equiq9qi = { + "parent_head": Binary; + "relay_parent_number": number; + "relay_parent_storage_root": FixedSizeBinary<32>; + "max_pov_size": number; +}; +export type Ifn3gc8nc1jruq = (Anonymize) | undefined; +export type If66o9rr0jliun = [Anonymize, FixedSizeBinary<32>]; +export type Ic5plng3kq7oc8 = (Anonymize) | undefined; +export type Iajdik7eaq7pn0 = Array; +export type CandidateEvent = Enum<{ + "CandidateBacked": Anonymize; + "CandidateIncluded": Anonymize; + "CandidateTimedOut": Anonymize; +}>; +export declare const CandidateEvent: GetEnum; +export type I2pf0b05mc7sdr = Array>; +export type I9hvej6h53dqj0 = [number, Anonymize]; +export type I7n1him6iq79fv = (Anonymize) | undefined; +export type Ialuks4a6iupcs = (Anonymize) | undefined; +export type Idv6tqqnmb3i1j = Array>; +export type I50481grhh0k81 = [number, FixedSizeBinary<32>, Anonymize]; +export type Iekan13fn586c2 = (Anonymize) | undefined; +export type Idrp5a1qbbi2au = Array>; +export type I9conp6ego37vs = [number, FixedSizeBinary<32>, Anonymize]; +export type Iacuu7pfj40eo5 = (Anonymize) | undefined; +export type Ic2oon6vd55kpc = { + "constraints": Anonymize; + "pending_availability": Anonymize; +}; +export type I20qrdh8gc2a98 = { + "min_relay_parent_number": number; + "max_pov_size": number; + "max_code_size": number; + "ump_remaining": number; + "ump_remaining_bytes": number; + "max_ump_num_per_candidate": number; + "dmp_remaining_messages": Anonymize; + "hrmp_inbound": Anonymize; + "hrmp_channels_out": Anonymize; + "max_hrmp_num_per_candidate": number; + "required_parent": Binary; + "validation_code_hash": FixedSizeBinary<32>; + "upgrade_restriction"?: Anonymize; + "future_validation_code"?: Anonymize; +}; +export type I1ilbeu6195gbh = Array>; +export type If6i47cerum785 = [number, Anonymize]; +export type Ifq5eqaefrc6it = { + "bytes_remaining": number; + "messages_remaining": number; +}; +export type Ia3sb0vgvovhtg = (UpgradeRestriction) | undefined; +export type I7gtb9g2qv4r10 = (Anonymize) | undefined; +export type I77oh9dj91nu1 = Array>; +export type Idu4o4nmhcojol = { + "candidate_hash": FixedSizeBinary<32>; + "descriptor": Anonymize; + "commitments": Anonymize; + "relay_parent_number": number; + "max_pov_size": number; +}; +export type I3cs5lehnlql7v = Array>; +export type Ifogo2hpqpe6b4 = (Anonymize) | undefined; +export type I9gtbosgm5vndt = { + "validators": Anonymize; + "id": bigint; +}; +export type I7rj2bnb76oko1 = ResultPayload, MmrPrimitivesError>; +export type MmrPrimitivesError = Enum<{ + "InvalidNumericOp": undefined; + "Push": undefined; + "GetRoot": undefined; + "Commit": undefined; + "GenerateProof": undefined; + "Verify": undefined; + "LeafNotFound": undefined; + "PalletNotIncluded": undefined; + "InvalidLeafIndex": undefined; + "InvalidBestKnownBlock": undefined; +}>; +export declare const MmrPrimitivesError: GetEnum; +export type I4o356o7eq06ms = ResultPayload; +export type I46e127tr8ma2h = ResultPayload, MmrPrimitivesError>; +export type Ifbk46m3pjer4k = [Anonymize, Anonymize]; +export type I38ee9is0n4jn9 = { + "leaf_indices": Anonymize; + "leaf_count": bigint; + "items": Anonymize; +}; +export type Ie88mmnuvmuvp5 = ResultPayload; +export type Iems84l8lk2v0c = { + "slot_duration": bigint; + "epoch_length": bigint; + "c": Anonymize; + "authorities": Anonymize; + "randomness": FixedSizeBinary<32>; + "allowed_slots": BabeAllowedSlots; +}; +export type I1r5ke30ueqo0r = { + "epoch_index": bigint; + "start_slot": bigint; + "duration": bigint; + "authorities": Anonymize; + "randomness": FixedSizeBinary<32>; + "config": Anonymize; +}; +export type Icerf8h8pdu8ss = (Anonymize) | undefined; +export type I66iuq7l8se39 = Array>; +export type I9tmff36km6vjg = [Binary, FixedSizeBinary<4>]; +export type I6spmpef2c7svf = { + "weight": Anonymize; + "class": DispatchClass; + "partial_fee": bigint; +}; +export type Iei2mvq0mjvt81 = { + "inclusion_fee"?: Anonymize; + "tip": bigint; +}; +export type Id37fum600qfau = (Anonymize) | undefined; +export type I246faqtjrsnee = { + "base_fee": bigint; + "len_fee": bigint; + "adjusted_weight_fee": bigint; +}; +export type I3om0s7br1hkf1 = AnonymousEnum<{ + "System": Anonymize; + "Scheduler": Anonymize; + "Preimage": Anonymize; + "Babe": Anonymize; + "Timestamp": Anonymize; + "Indices": Anonymize; + "Balances": Anonymize; + "Staking": Anonymize; + "Session": Anonymize; + "Grandpa": Anonymize; + "Treasury": Anonymize; + "ConvictionVoting": Anonymize; + "Referenda": Anonymize; + "Whitelist": Anonymize; + "Parameters": Anonymize; + "Claims": Anonymize; + "Vesting": Anonymize; + "Utility": Anonymize; + "Proxy": Anonymize; + "Multisig": Anonymize; + "Bounties": Anonymize; + "ChildBounties": Anonymize; + "ElectionProviderMultiPhase": Anonymize; + "VoterList": Anonymize; + "NominationPools": Anonymize; + "FastUnstake": Anonymize; + "Configuration": Anonymize; + "ParasShared": undefined; + "ParaInclusion": undefined; + "ParaInherent": Anonymize; + "Paras": Anonymize; + "Initializer": Anonymize; + "Hrmp": Anonymize; + "ParasDisputes": Anonymize; + "ParasSlashing": Anonymize; + "OnDemand": Anonymize; + "Registrar": Anonymize; + "Slots": Anonymize; + "Auctions": Anonymize; + "Crowdloan": Anonymize; + "Coretime": Anonymize; + "StateTrieMigration": Anonymize; + "XcmPallet": Anonymize; + "MessageQueue": Anonymize; + "AssetRate": Anonymize; + "Beefy": Anonymize; +}>; +export type I1p1369d52j8jd = ResultPayload, Anonymize>; +export type I66cvqflm1qj24 = Array; +export type Iavct6f844hfju = AnonymousEnum<{ + "Unimplemented": undefined; + "VersionedConversionFailed": undefined; + "WeightNotComputable": undefined; + "UnhandledXcmVersion": undefined; + "AssetNotFound": undefined; + "Unroutable": undefined; +}>; +export type Ic0c3req3mlc1l = ResultPayload, Anonymize>; +export type I7ocn4njqde3v5 = ResultPayload>; +export type I5rlt6h8ph553n = ResultPayload>; +export type Iethufiek9l1gc = ResultPayload, Anonymize>; +export type I2crcbebj5fr6o = { + "execution_result": Anonymize; + "emitted_events": Anonymize; + "local_xcm"?: Anonymize; + "forwarded_xcms": Anonymize; +}; +export type I457n6ppr7f9nf = Array>; +export type I3i0ce56p044d2 = (DotXcmVersionedXcm) | undefined; +export type I47tkk5e5nm6g7 = Array>; +export type I60vv2hvlt348b = [DotXcmVersionedLocation, Anonymize]; +export type I7ao2ct6q454mu = Array; +export type I55ku9c5gk50hb = AnonymousEnum<{ + "Unimplemented": undefined; + "VersionedConversionFailed": undefined; +}>; +export type I79o4oopf2n4rp = ResultPayload, Anonymize>; +export type Ibrd3ha7olmukg = { + "execution_result": XcmV4TraitsOutcome; + "emitted_events": Anonymize; + "forwarded_xcms": Anonymize; +}; +export type Ieh6nis3hdbtgi = ResultPayload>; +export type Ibaohq34aedndv = AnonymousEnum<{ + "Unsupported": undefined; + "VersionedConversionFailed": undefined; +}>; +export type Ie9sr1iqcg3cgm = ResultPayload; +export type I1mqgk2tmnn9i2 = (string) | undefined; +export type I6lr8sctk0bi4e = Array; +export type I6oojue2nhp42f = Array>; +export type Id0nkgntglj4vc = { + "phase": Phase; + "event": Anonymize; + "topics": Anonymize; +}; +export type I4djp4s5jm2vmj = AnonymousEnum<{ + "System": Anonymize; + "Indices": Anonymize; + "Balances": Anonymize; + "TransactionPayment": TransactionPaymentEvent; + "Staking": StakingEvent; + "Offences": OffencesEvent; + "Session": SessionEvent; + "Grandpa": GrandpaEvent; + "Treasury": Anonymize; + "ConvictionVoting": ConvictionVotingEvent; + "Referenda": Anonymize; + "FellowshipCollective": Anonymize; + "FellowshipReferenda": Anonymize; + "Whitelist": Anonymize; + "Parameters": Anonymize; + "Claims": CommonClaimsEvent; + "Utility": Anonymize; + "Society": Anonymize; + "Recovery": RecoveryEvent; + "Vesting": VestingEvent; + "Scheduler": Anonymize; + "Proxy": Anonymize; + "Multisig": Anonymize; + "Preimage": PreimageEvent; + "Bounties": BountiesEvent; + "ChildBounties": ChildBountiesEvent; + "ElectionProviderMultiPhase": ElectionProviderMultiPhaseEvent; + "Nis": Anonymize; + "NisCounterpartBalances": Anonymize; + "VoterList": BagsListEvent; + "NominationPools": NominationPoolsEvent; + "FastUnstake": Anonymize; + "ParaInclusion": ParachainsInclusionEvent; + "Paras": ParachainsParasEvent; + "Hrmp": ParachainsHrmpEvent; + "ParasDisputes": ParachainsDisputesEvent; + "OnDemandAssignmentProvider": Anonymize; + "Registrar": CommonParasRegistrarEvent; + "Slots": CommonSlotsEvent; + "Auctions": CommonAuctionsEvent; + "Crowdloan": Anonymize; + "Coretime": PolkadotRuntimeParachainsCoretimeEvent; + "XcmPallet": Anonymize; + "MessageQueue": Anonymize; + "AssetRate": AssetRateEvent; +}>; +export type I7pnhsc9dv4sdl = AnonymousEnum<{ + /** + *An extrinsic completed successfully. + */ + "ExtrinsicSuccess": Anonymize; + /** + *An extrinsic failed. + */ + "ExtrinsicFailed": Anonymize; + /** + *`:code` was updated. + */ + "CodeUpdated": undefined; + /** + *A new account was created. + */ + "NewAccount": Anonymize; + /** + *An account was reaped. + */ + "KilledAccount": Anonymize; + /** + *On on-chain remark happened. + */ + "Remarked": Anonymize; + /** + *An upgrade was authorized. + */ + "UpgradeAuthorized": Anonymize; +}>; +export type I64gl0ge4ir4jn = { + "dispatch_error": Anonymize; + "dispatch_info": Anonymize; +}; +export type I3h7okodr0vdlp = AnonymousEnum<{ + "Other": undefined; + "CannotLookup": undefined; + "BadOrigin": undefined; + "Module": Anonymize; + "ConsumerRemaining": undefined; + "NoProviders": undefined; + "TooManyConsumers": undefined; + "Token": TokenError; + "Arithmetic": ArithmeticError; + "Transactional": TransactionalError; + "Exhausted": undefined; + "Corruption": undefined; + "Unavailable": undefined; + "RootNotAllowed": undefined; +}>; +export type Iclbp92g9eqbus = AnonymousEnum<{ + "System": Anonymize; + "Babe": Anonymize; + "Timestamp": undefined; + "Indices": Anonymize; + "Balances": Anonymize; + "TransactionPayment": undefined; + "Authorship": undefined; + "Staking": Anonymize; + "Offences": undefined; + "Historical": undefined; + "Session": Anonymize; + "Grandpa": Anonymize; + "AuthorityDiscovery": undefined; + "Treasury": Anonymize; + "ConvictionVoting": Anonymize; + "Referenda": Anonymize; + "FellowshipCollective": Anonymize; + "FellowshipReferenda": Anonymize; + "Origins": undefined; + "Whitelist": Anonymize; + "Parameters": undefined; + "Claims": Anonymize; + "Utility": Anonymize; + "Society": Anonymize; + "Recovery": Anonymize; + "Vesting": Anonymize; + "Scheduler": Anonymize; + "Proxy": Anonymize; + "Multisig": Anonymize; + "Preimage": Anonymize; + "Bounties": Anonymize; + "ChildBounties": Anonymize; + "ElectionProviderMultiPhase": Anonymize; + "Nis": Anonymize; + "NisCounterpartBalances": Anonymize; + "VoterList": Anonymize; + "NominationPools": Anonymize; + "FastUnstake": Anonymize; + "ParachainsOrigin": undefined; + "Configuration": Anonymize; + "ParasShared": undefined; + "ParaInclusion": Anonymize; + "ParaInherent": Anonymize; + "ParaScheduler": undefined; + "Paras": Anonymize; + "Initializer": undefined; + "Dmp": undefined; + "Hrmp": Anonymize; + "ParaSessionInfo": undefined; + "ParasDisputes": Anonymize; + "ParasSlashing": Anonymize; + "OnDemandAssignmentProvider": Anonymize; + "CoretimeAssignmentProvider": Anonymize; + "Registrar": Anonymize; + "Slots": Anonymize; + "Auctions": Anonymize; + "Crowdloan": Anonymize; + "Coretime": Anonymize; + "XcmPallet": Anonymize; + "MessageQueue": Anonymize; + "AssetRate": Anonymize; + "Beefy": Anonymize; + "Mmr": undefined; + "BeefyMmrLeaf": undefined; +}>; +export type Ib69hbq04ogo7t = AnonymousEnum<{ + /** + *Account is already a member. + */ + "AlreadyMember": undefined; + /** + *Account is not a member. + */ + "NotMember": undefined; + /** + *The given poll index is unknown or has closed. + */ + "NotPolling": undefined; + /** + *The given poll is still ongoing. + */ + "Ongoing": undefined; + /** + *There are no further records to be removed. + */ + "NoneRemaining": undefined; + /** + *Unexpected error in state. + */ + "Corruption": undefined; + /** + *The member's rank is too low to vote. + */ + "RankTooLow": undefined; + /** + *The information provided is incorrect. + */ + "InvalidWitness": undefined; + /** + *The origin is not sufficiently privileged to do the operation. + */ + "NoPermission": undefined; + /** + *The new member to exchange is the same as the old member + */ + "SameMember": undefined; + /** + *The max member count for the rank has been reached. + */ + "TooManyMembers": undefined; +}>; +export type I6n8dkudb3ed0r = AnonymousEnum<{ + /** + *User is not a member. + */ + "NotMember": undefined; + /** + *User is already a member. + */ + "AlreadyMember": undefined; + /** + *User is suspended. + */ + "Suspended": undefined; + /** + *User is not suspended. + */ + "NotSuspended": undefined; + /** + *Nothing to payout. + */ + "NoPayout": undefined; + /** + *Society already founded. + */ + "AlreadyFounded": undefined; + /** + *Not enough in pot to accept candidate. + */ + "InsufficientPot": undefined; + /** + *Member is already vouching or banned from vouching again. + */ + "AlreadyVouching": undefined; + /** + *Member is not vouching. + */ + "NotVouchingOnBidder": undefined; + /** + *Cannot remove the head of the chain. + */ + "Head": undefined; + /** + *Cannot remove the founder. + */ + "Founder": undefined; + /** + *User has already made a bid. + */ + "AlreadyBid": undefined; + /** + *User is already a candidate. + */ + "AlreadyCandidate": undefined; + /** + *User is not a candidate. + */ + "NotCandidate": undefined; + /** + *Too many members in the society. + */ + "MaxMembers": undefined; + /** + *The caller is not the founder. + */ + "NotFounder": undefined; + /** + *The caller is not the head. + */ + "NotHead": undefined; + /** + *The membership cannot be claimed as the candidate was not clearly approved. + */ + "NotApproved": undefined; + /** + *The candidate cannot be kicked as the candidate was not clearly rejected. + */ + "NotRejected": undefined; + /** + *The candidacy cannot be dropped as the candidate was clearly approved. + */ + "Approved": undefined; + /** + *The candidacy cannot be bestowed as the candidate was clearly rejected. + */ + "Rejected": undefined; + /** + *The candidacy cannot be concluded as the voting is still in progress. + */ + "InProgress": undefined; + /** + *The candidacy cannot be pruned until a full additional intake period has passed. + */ + "TooEarly": undefined; + /** + *The skeptic already voted. + */ + "Voted": undefined; + /** + *The skeptic need not vote on candidates from expired rounds. + */ + "Expired": undefined; + /** + *User is not a bidder. + */ + "NotBidder": undefined; + /** + *There is no defender currently. + */ + "NoDefender": undefined; + /** + *Group doesn't exist. + */ + "NotGroup": undefined; + /** + *The member is already elevated to this rank. + */ + "AlreadyElevated": undefined; + /** + *The skeptic has already been punished for this offence. + */ + "AlreadyPunished": undefined; + /** + *Funds are insufficient to pay off society debts. + */ + "InsufficientFunds": undefined; + /** + *The candidate/defender has no stale votes to remove. + */ + "NoVotes": undefined; +}>; +export type I29mqdjoga49c9 = AnonymousEnum<{ + /** + *User is not allowed to make a call on behalf of this account + */ + "NotAllowed": undefined; + /** + *Threshold must be greater than zero + */ + "ZeroThreshold": undefined; + /** + *Friends list must be greater than zero and threshold + */ + "NotEnoughFriends": undefined; + /** + *Friends list must be less than max friends + */ + "MaxFriends": undefined; + /** + *Friends list must be sorted and free of duplicates + */ + "NotSorted": undefined; + /** + *This account is not set up for recovery + */ + "NotRecoverable": undefined; + /** + *This account is already set up for recovery + */ + "AlreadyRecoverable": undefined; + /** + *A recovery process has already started for this account + */ + "AlreadyStarted": undefined; + /** + *A recovery process has not started for this rescuer + */ + "NotStarted": undefined; + /** + *This account is not a friend who can vouch + */ + "NotFriend": undefined; + /** + *The friend must wait until the delay period to vouch for this recovery + */ + "DelayPeriod": undefined; + /** + *This user has already vouched for this recovery + */ + "AlreadyVouched": undefined; + /** + *The threshold for recovering this account has not been met + */ + "Threshold": undefined; + /** + *There are still active recovery attempts that need to be closed + */ + "StillActive": undefined; + /** + *This account is already set up for recovery + */ + "AlreadyProxy": undefined; + /** + *Some internal state is broken. + */ + "BadState": undefined; +}>; +export type I3lqplv82e2f8f = AnonymousEnum<{ + /** + *The duration of the bid is less than one. + */ + "DurationTooSmall": undefined; + /** + *The duration is the bid is greater than the number of queues. + */ + "DurationTooBig": undefined; + /** + *The amount of the bid is less than the minimum allowed. + */ + "AmountTooSmall": undefined; + /** + *The queue for the bid's duration is full and the amount bid is too low to get in + *through replacing an existing bid. + */ + "BidTooLow": undefined; + /** + *Receipt index is unknown. + */ + "UnknownReceipt": undefined; + /** + *Not the owner of the receipt. + */ + "NotOwner": undefined; + /** + *Bond not yet at expiry date. + */ + "NotExpired": undefined; + /** + *The given bid for retraction is not found. + */ + "UnknownBid": undefined; + /** + *The portion supplied is beyond the value of the receipt. + */ + "PortionTooBig": undefined; + /** + *Not enough funds are held to pay out. + */ + "Unfunded": undefined; + /** + *There are enough funds for what is required. + */ + "AlreadyFunded": undefined; + /** + *The thaw throttle has been reached for this period. + */ + "Throttled": undefined; + /** + *The operation would result in a receipt worth an insignificant value. + */ + "MakesDust": undefined; + /** + *The receipt is already communal. + */ + "AlreadyCommunal": undefined; + /** + *The receipt is already private. + */ + "AlreadyPrivate": undefined; +}>; +export type Ifuucdgpuglunu = AnonymousEnum<{ + /** + *A member `who` has been added. + */ + "MemberAdded": Anonymize; + /** + *The member `who`se rank has been changed to the given `rank`. + */ + "RankChanged": Anonymize; + /** + *The member `who` of given `rank` has been removed from the collective. + */ + "MemberRemoved": Anonymize; + /** + *The member `who` has voted for the `poll` with the given `vote` leading to an updated + *`tally`. + */ + "Voted": Anonymize; + /** + *The member `who` had their `AccountId` changed to `new_who`. + */ + "MemberExchanged": Anonymize; +}>; +export type Im1pm2vf6llcn = { + "who": SS58String; + "rank": number; +}; +export type I21jsoeb0o6476 = { + "who": SS58String; + "poll": number; + "vote": Anonymize; + "tally": Anonymize; +}; +export type I3gg47bgkgq9tr = AnonymousEnum<{ + "Aye": number; + "Nay": number; +}>; +export type I6d634btv7misu = { + "bare_ayes": number; + "ayes": number; + "nays": number; +}; +export type Ier6ck0tpfo7 = { + "who": SS58String; + "new_who": SS58String; +}; +export type I28aoa43r171jt = AnonymousEnum<{ + /** + *A referendum has been submitted. + */ + "Submitted": Anonymize; + /** + *The decision deposit has been placed. + */ + "DecisionDepositPlaced": Anonymize; + /** + *The decision deposit has been refunded. + */ + "DecisionDepositRefunded": Anonymize; + /** + *A deposit has been slashed. + */ + "DepositSlashed": Anonymize; + /** + *A referendum has moved into the deciding phase. + */ + "DecisionStarted": Anonymize; + "ConfirmStarted": Anonymize; + "ConfirmAborted": Anonymize; + /** + *A referendum has ended its confirmation phase and is ready for approval. + */ + "Confirmed": Anonymize; + /** + *A referendum has been approved and its proposal has been scheduled. + */ + "Approved": Anonymize; + /** + *A proposal has been rejected by referendum. + */ + "Rejected": Anonymize; + /** + *A referendum has been timed out without being decided. + */ + "TimedOut": Anonymize; + /** + *A referendum has been cancelled. + */ + "Cancelled": Anonymize; + /** + *A referendum has been killed. + */ + "Killed": Anonymize; + /** + *The submission deposit has been refunded. + */ + "SubmissionDepositRefunded": Anonymize; + /** + *Metadata for a referendum has been set. + */ + "MetadataSet": Anonymize; + /** + *Metadata for a referendum has been cleared. + */ + "MetadataCleared": Anonymize; +}>; +export type Ic6ecdcp9ut7jd = { + /** + *Index of the referendum. + */ + "index": number; + /** + *The track (and by extension proposal dispatch origin) of this referendum. + */ + "track": number; + /** + *The proposal for the referendum. + */ + "proposal": PreimagesBounded; + /** + *The current tally of votes in this referendum. + */ + "tally": Anonymize; +}; +export type I27notaksll8qt = { + /** + *Index of the referendum. + */ + "index": number; + /** + *The final tally of votes in this referendum. + */ + "tally": Anonymize; +}; +export type Icfm8kf536krgv = AnonymousEnum<{ + "CallWhitelisted": Anonymize; + "WhitelistedCallRemoved": Anonymize; + "WhitelistedCallDispatched": Anonymize; +}>; +export type Ifehsusc6g747o = { + "call_hash": FixedSizeBinary<32>; + "result": Anonymize; +}; +export type Iftq10rlffn46u = ResultPayload, Anonymize>; +export type I4otaqja372817 = { + "post_info": Anonymize; + "error": Anonymize; +}; +export type Ib4h80g8852pr1 = AnonymousEnum<{ + /** + *Batch of dispatches did not complete fully. Index of first failing dispatch given, as + *well as the error. + */ + "BatchInterrupted": Anonymize; + /** + *Batch of dispatches completed fully with no error. + */ + "BatchCompleted": undefined; + /** + *Batch of dispatches completed but has errors. + */ + "BatchCompletedWithErrors": undefined; + /** + *A single item within a Batch of dispatches has completed with no error. + */ + "ItemCompleted": undefined; + /** + *A single item within a Batch of dispatches has completed with error. + */ + "ItemFailed": Anonymize; + /** + *A call was dispatched. + */ + "DispatchedAs": Anonymize; +}>; +export type I47k56fn84rojg = { + "index": number; + "error": Anonymize; +}; +export type Iase69ms3nbqke = { + "error": Anonymize; +}; +export type I461t9gdjcm4o5 = { + "result": Anonymize; +}; +export type Idog2s3a8to2s8 = ResultPayload>; +export type Ifhcq78pr9md4e = AnonymousEnum<{ + /** + *The society is founded by the given identity. + */ + "Founded": Anonymize; + /** + *A membership bid just happened. The given account is the candidate's ID and their offer + *is the second. + */ + "Bid": Anonymize; + /** + *A membership bid just happened by vouching. The given account is the candidate's ID and + *their offer is the second. The vouching party is the third. + */ + "Vouch": Anonymize; + /** + *A candidate was dropped (due to an excess of bids in the system). + */ + "AutoUnbid": Anonymize; + /** + *A candidate was dropped (by their request). + */ + "Unbid": Anonymize; + /** + *A candidate was dropped (by request of who vouched for them). + */ + "Unvouch": Anonymize; + /** + *A group of candidates have been inducted. The batch's primary is the first value, the + *batch in full is the second. + */ + "Inducted": Anonymize; + /** + *A suspended member has been judged. + */ + "SuspendedMemberJudgement": Anonymize; + /** + *A candidate has been suspended + */ + "CandidateSuspended": Anonymize; + /** + *A member has been suspended + */ + "MemberSuspended": Anonymize; + /** + *A member has been challenged + */ + "Challenged": Anonymize; + /** + *A vote has been placed + */ + "Vote": Anonymize; + /** + *A vote has been placed for a defending member + */ + "DefenderVote": Anonymize; + /** + *A new set of \[params\] has been set for the group. + */ + "NewParams": Anonymize; + /** + *Society is unfounded. + */ + "Unfounded": Anonymize; + /** + *Some funds were deposited into the society account. + */ + "Deposit": Anonymize; + /** + *A \[member\] got elevated to \[rank\]. + */ + "Elevated": Anonymize; +}>; +export type I8ircspqpe79k7 = { + "founder": SS58String; +}; +export type I1vlt8l6nvnen6 = { + "candidate_id": SS58String; + "offer": bigint; +}; +export type I72vf0j9juc1df = { + "candidate_id": SS58String; + "offer": bigint; + "vouching": SS58String; +}; +export type I4b66js88p45m8 = { + "candidate": SS58String; +}; +export type Ie0phfcvllr4od = { + "primary": SS58String; + "candidates": Anonymize; +}; +export type I476ep66p6ddg1 = { + "who": SS58String; + "judged": boolean; +}; +export type Ie3gphha4ejh40 = { + "member": SS58String; +}; +export type If0btdsid69rrm = { + "candidate": SS58String; + "voter": SS58String; + "vote": boolean; +}; +export type Ictusacdcqj61u = { + "voter": SS58String; + "vote": boolean; +}; +export type Ibsolu3c3q1lb4 = { + "params": Anonymize; +}; +export type I9hkvi4k3kh916 = { + "max_members": number; + "max_intake": number; + "max_strikes": number; + "candidate_deposit": bigint; +}; +export type Ib116djgo9u4uo = { + "member": SS58String; + "rank": number; +}; +export type RecoveryEvent = Enum<{ + /** + *A recovery process has been set up for an account. + */ + "RecoveryCreated": Anonymize; + /** + *A recovery process has been initiated for lost account by rescuer account. + */ + "RecoveryInitiated": Anonymize; + /** + *A recovery process for lost account by rescuer account has been vouched for by sender. + */ + "RecoveryVouched": Anonymize; + /** + *A recovery process for lost account by rescuer account has been closed. + */ + "RecoveryClosed": Anonymize; + /** + *Lost account has been successfully recovered by rescuer account. + */ + "AccountRecovered": Anonymize; + /** + *A recovery process has been removed for an account. + */ + "RecoveryRemoved": Anonymize; +}>; +export declare const RecoveryEvent: GetEnum; +export type I9vkkue6cq74et = { + "lost_account": SS58String; + "rescuer_account": SS58String; +}; +export type Ibu56t5h1q49i4 = { + "lost_account": SS58String; + "rescuer_account": SS58String; + "sender": SS58String; +}; +export type I1dmtl5t34b9g = { + "lost_account": SS58String; +}; +export type I1c0hsaopam5qt = AnonymousEnum<{ + /** + *Scheduled some task. + */ + "Scheduled": Anonymize; + /** + *Canceled some task. + */ + "Canceled": Anonymize; + /** + *Dispatched some task. + */ + "Dispatched": Anonymize; + /** + *Set a retry configuration for some task. + */ + "RetrySet": Anonymize; + /** + *Cancel a retry configuration for some task. + */ + "RetryCancelled": Anonymize; + /** + *The call for the provided hash was not found so the task has been aborted. + */ + "CallUnavailable": Anonymize; + /** + *The given task was unable to be renewed since the agenda is full at that block. + */ + "PeriodicFailed": Anonymize; + /** + *The given task was unable to be retried since the agenda is full at that block or there + *was not enough weight to reschedule it. + */ + "RetryFailed": Anonymize; + /** + *The given task can never be executed since it is overweight. + */ + "PermanentlyOverweight": Anonymize; +}>; +export type Idhmkdhk0gf66d = { + "task": Anonymize; + "id"?: Anonymize; + "result": Anonymize; +}; +export type I26jj4ru8eej02 = AnonymousEnum<{ + /** + *A proxy was executed correctly, with the given. + */ + "ProxyExecuted": Anonymize; + /** + *A pure account has been created by new proxy with given + *disambiguation index and proxy type. + */ + "PureCreated": Anonymize; + /** + *An announcement was placed to make a call in the future. + */ + "Announced": Anonymize; + /** + *A proxy was added. + */ + "ProxyAdded": Anonymize; + /** + *A proxy was removed. + */ + "ProxyRemoved": Anonymize; +}>; +export type Ia9qkoqqvill5r = { + "pure": SS58String; + "who": SS58String; + "proxy_type": Anonymize; + "disambiguation_index": number; +}; +export type I1ffle57clnprr = AnonymousEnum<{ + "Any": undefined; + "NonTransfer": undefined; + "Governance": undefined; + "Staking": undefined; + "CancelProxy": undefined; + "Auction": undefined; + "Society": undefined; + "NominationPools": undefined; + "Spokesperson": undefined; +}>; +export type Ica4ean4b9ksdn = { + "delegator": SS58String; + "delegatee": SS58String; + "proxy_type": Anonymize; + "delay": number; +}; +export type Ihko06lcnga6c = AnonymousEnum<{ + /** + *A new multisig operation has begun. + */ + "NewMultisig": Anonymize; + /** + *A multisig operation has been approved by someone. + */ + "MultisigApproval": Anonymize; + /** + *A multisig operation has been executed. + */ + "MultisigExecuted": Anonymize; + /** + *A multisig operation has been cancelled. + */ + "MultisigCancelled": Anonymize; +}>; +export type Icbi9ul88saklf = { + "approving": SS58String; + "timepoint": Anonymize; + "multisig": SS58String; + "call_hash": FixedSizeBinary<32>; + "result": Anonymize; +}; +export type I9dmlhfape78ke = AnonymousEnum<{ + /** + *A bid was successfully placed. + */ + "BidPlaced": Anonymize; + /** + *A bid was successfully removed (before being accepted). + */ + "BidRetracted": Anonymize; + /** + *A bid was dropped from a queue because of another, more substantial, bid was present. + */ + "BidDropped": Anonymize; + /** + *A bid was accepted. The balance may not be released until expiry. + */ + "Issued": Anonymize; + /** + *An receipt has been (at least partially) thawed. + */ + "Thawed": Anonymize; + /** + *An automatic funding of the deficit was made. + */ + "Funded": Anonymize; + /** + *A receipt was transferred. + */ + "Transferred": Anonymize; +}>; +export type Ie2vmgag6qiue4 = { + "who": SS58String; + "amount": bigint; + "duration": number; +}; +export type I1kpuet4lkcdpf = { + /** + *The identity of the receipt. + */ + "index": number; + /** + *The block number at which the receipt may be thawed. + */ + "expiry": number; + /** + *The owner of the receipt. + */ + "who": SS58String; + /** + *The proportion of the effective total issuance which the receipt represents. + */ + "proportion": bigint; + /** + *The amount of funds which were debited from the owner. + */ + "amount": bigint; +}; +export type I5tr1gp2t9i6oh = { + /** + *The identity of the receipt. + */ + "index": number; + /** + *The owner. + */ + "who": SS58String; + /** + *The proportion of the effective total issuance by which the owner was debited. + */ + "proportion": bigint; + /** + *The amount by which the owner was credited. + */ + "amount": bigint; + /** + *If `true` then the receipt is done. + */ + "dropped": boolean; +}; +export type I7ls1r4u61csif = { + "deficit": bigint; +}; +export type I3gjgtso69eopr = { + "from": SS58String; + "to": SS58String; + "index": number; +}; +export type I8r1bva5169aii = AnonymousEnum<{ + /** + *A staker was unstaked. + */ + "Unstaked": Anonymize; + /** + *A staker was slashed for requesting fast-unstake whilst being exposed. + */ + "Slashed": Anonymize; + /** + *A batch was partially checked for the given eras, but the process did not finish. + */ + "BatchChecked": Anonymize; + /** + *A batch of a given size was terminated. + * + *This is always follows by a number of `Unstaked` or `Slashed` events, marking the end + *of the batch. A new batch will be created upon next block. + */ + "BatchFinished": Anonymize; + /** + *An internal error happened. Operations will be paused now. + */ + "InternalError": undefined; +}>; +export type Idsn6b9o09ac22 = { + "stash": SS58String; + "result": Anonymize; +}; +export type I74uj7qvtvb25f = AnonymousEnum<{ + /** + *Create a new crowdloaning campaign. + */ + "Created": Anonymize; + /** + *Contributed to a crowd sale. + */ + "Contributed": Anonymize; + /** + *Withdrew full balance of a contributor. + */ + "Withdrew": Anonymize; + /** + *The loans in a fund have been partially dissolved, i.e. there are some left + *over child keys that still need to be killed. + */ + "PartiallyRefunded": Anonymize; + /** + *All loans in a fund have been refunded. + */ + "AllRefunded": Anonymize; + /** + *Fund is dissolved. + */ + "Dissolved": Anonymize; + /** + *The result of trying to submit a new bid to the Slots pallet. + */ + "HandleBidResult": Anonymize; + /** + *The configuration to a crowdloan has been edited. + */ + "Edited": Anonymize; + /** + *A memo has been updated. + */ + "MemoUpdated": Anonymize; + /** + *A parachain has been moved to `NewRaise` + */ + "AddedToNewRaise": Anonymize; +}>; +export type I5too1knnpqnk1 = { + "para_id": number; + "result": Anonymize; +}; +export type Ifosl32ihgoeq6 = Array>; +export type I31ossno23rsso = { + "id": Anonymize; + "amount": bigint; +}; +export type I5uctuo4q9kfsv = AnonymousEnum<{ + "Preimage": PreimagePalletHoldReason; + "Nis": Anonymize; +}>; +export type I8492esr84fcem = AnonymousEnum<{ + "NftReceipt": undefined; +}>; +export type I85t6l9pssiov4 = AnonymousEnum<{ + "Ongoing": Anonymize; + "Approved": Anonymize; + "Rejected": Anonymize; + "Cancelled": Anonymize; + "TimedOut": Anonymize; + "Killed": number; +}>; +export type Iavs9hbci87eth = { + "track": number; + "origin": Anonymize; + "proposal": PreimagesBounded; + "enactment": TraitsScheduleDispatchTime; + "submitted": number; + "submission_deposit": Anonymize; + "decision_deposit"?: Anonymize; + "deciding"?: Anonymize; + "tally": Anonymize; + "in_queue": boolean; + "alarm"?: Anonymize; +}; +export type I575vh6g119dum = AnonymousEnum<{ + "system": DispatchRawOrigin; + "Origins": Anonymize; + "ParachainsOrigin": ParachainsOrigin; + "XcmPallet": XcmPalletOrigin; + "Void": undefined; +}>; +export type I8frjhb9r4pt5a = AnonymousEnum<{ + "StakingAdmin": undefined; + "Treasurer": undefined; + "FellowshipAdmin": undefined; + "GeneralAdmin": undefined; + "AuctionAdmin": undefined; + "LeaseAdmin": undefined; + "ReferendumCanceller": undefined; + "ReferendumKiller": undefined; + "SmallTipper": undefined; + "BigTipper": undefined; + "SmallSpender": undefined; + "MediumSpender": undefined; + "BigSpender": undefined; + "WhitelistedCaller": undefined; + "FellowshipInitiates": undefined; + "Fellows": undefined; + "FellowshipExperts": undefined; + "FellowshipMasters": undefined; + "Fellowship1Dan": undefined; + "Fellowship2Dan": undefined; + "Fellowship3Dan": undefined; + "Fellowship4Dan": undefined; + "Fellowship5Dan": undefined; + "Fellowship6Dan": undefined; + "Fellowship7Dan": undefined; + "Fellowship8Dan": undefined; + "Fellowship9Dan": undefined; + "WishForChange": undefined; +}>; +export type Icousgkbefm7ke = AnonymousEnum<{ + "Ongoing": Anonymize; + "Approved": Anonymize; + "Rejected": Anonymize; + "Cancelled": Anonymize; + "TimedOut": Anonymize; + "Killed": number; +}>; +export type Ifukao8u7abrdr = { + "track": number; + "origin": Anonymize; + "proposal": PreimagesBounded; + "enactment": TraitsScheduleDispatchTime; + "submitted": number; + "submission_deposit": Anonymize; + "decision_deposit"?: Anonymize; + "deciding"?: Anonymize; + "tally": Anonymize; + "in_queue": boolean; + "alarm"?: Anonymize; +}; +export type Iam8qhv8b3jn4n = { + "rank": number; + "strikes": number; + "vouching"?: Anonymize; + "index": number; +}; +export type I8fmgqeahq5asi = (Anonymize) | undefined; +export type I4e8agnd8ntmu4 = AnonymousEnum<{ + "Vouching": undefined; + "Banned": undefined; +}>; +export type I1659sf24o6ga8 = { + "paid": bigint; + "payouts": Anonymize; +}; +export type Iehiasr6uoqbq = Array>; +export type If6fsasj8kq72c = { + "who": SS58String; + "kind": Anonymize; + "value": bigint; +}; +export type Iand3m1ru4ke2b = AnonymousEnum<{ + "Deposit": bigint; + "Vouch": Anonymize; +}>; +export type I8adv0j4q3uu5d = { + "round": number; + "kind": Anonymize; + "bid": bigint; + "tally": Anonymize; + "skeptic_struck": boolean; +}; +export type Ic4n54m09tc5na = { + "approvals": number; + "rejections": number; +}; +export type I7d29ossbog0d3 = { + "approve": boolean; + "weight": number; +}; +export type I7mgf69gvksvu2 = { + "who": SS58String; + "bid": bigint; + "round": number; +}; +export type I3sfg6klg56vmk = [SS58String, SS58String, Anonymize]; +export type Ibprd8oi8phm62 = { + "delay_period": number; + "deposit": bigint; + "friends": Anonymize; + "threshold": number; +}; +export type Idlqqo993i780l = { + "created": number; + "deposit": bigint; + "friends": Anonymize; +}; +export type Ic836nv7r3fq4i = Array>; +export type I6amhs2ie7hg6c = (Anonymize) | undefined; +export type I423jsfgdvl58f = { + "maybe_id"?: Anonymize; + "priority": number; + "call": PreimagesBounded; + "maybe_periodic"?: Anonymize; + "origin": Anonymize; +}; +export type I3khkuiss7sr1m = [Anonymize, bigint]; +export type I470fg2etb4rsu = Array>; +export type Iffeqohmvisp0 = { + "delegate": SS58String; + "proxy_type": Anonymize; + "delay": number; +}; +export type I84stt310eb6c3 = { + "who": SS58String; + "deposit": bigint; + "raw_solution": Anonymize; + "call_fee": bigint; +}; +export type I6s33laenmuupn = { + "solution": Anonymize; + "score": Anonymize; + "round": number; +}; +export type Ic8o63p0sveg3g = { + "votes1": Anonymize; + "votes2": Anonymize; + "votes3": Anonymize; + "votes4": Anonymize; + "votes5": Anonymize; + "votes6": Anonymize; + "votes7": Anonymize; + "votes8": Anonymize; + "votes9": Anonymize; + "votes10": Anonymize; + "votes11": Anonymize; + "votes12": Anonymize; + "votes13": Anonymize; + "votes14": Anonymize; + "votes15": Anonymize; + "votes16": Anonymize; + "votes17": Anonymize; + "votes18": Anonymize; + "votes19": Anonymize; + "votes20": Anonymize; + "votes21": Anonymize; + "votes22": Anonymize; + "votes23": Anonymize; + "votes24": Anonymize; +}; +export type Ic2otmj72fnr4f = Array>; +export type Iaujc1cdlbr21l = [number, Anonymize, number]; +export type Ifo5mgovn0mc4e = FixedSizeArray<16, Anonymize>; +export type Iakspodb433ll5 = Array>; +export type Id83t9vq36ke6a = [number, Anonymize, number]; +export type Ibud865gntq530 = FixedSizeArray<17, Anonymize>; +export type Iepp1vqqhfbch8 = Array>; +export type Ieveht3di3sfiu = [number, Anonymize, number]; +export type I776l0s5q9rvur = FixedSizeArray<18, Anonymize>; +export type I98jogsmh342m3 = Array>; +export type I9eq1v7erl4gvr = [number, Anonymize, number]; +export type I7ojjkc2iopt95 = FixedSizeArray<19, Anonymize>; +export type I2fk4dasd66na2 = Array>; +export type I5bs1mqum7i23c = [number, Anonymize, number]; +export type Idpqm03dj290nq = FixedSizeArray<20, Anonymize>; +export type Ie417vs28qcnsh = Array>; +export type Ibhc2kquefu249 = [number, Anonymize, number]; +export type I2rgpk02ffvb64 = FixedSizeArray<21, Anonymize>; +export type I5920hg8jo1it6 = Array>; +export type I9ha4eaj26vum3 = [number, Anonymize, number]; +export type I1tq0t8vavpkbg = FixedSizeArray<22, Anonymize>; +export type I7qdp96bmn8lfe = Array>; +export type I4gbt1pgsl06ua = [number, Anonymize, number]; +export type I9mfrictenmkj8 = FixedSizeArray<23, Anonymize>; +export type I2cqtnj49ogo81 = Array>; +export type I7btpfdeli5ea8 = { + "proportion_owed": bigint; + "index": number; + "thawed": bigint; + "last_period": number; + "receipts_on_hold": bigint; +}; +export type Ic79q40j9qptgh = { + "proportion": bigint; + "owner"?: Anonymize; + "expiry": number; +}; +export type I9bin2jc70qt6q = Array>; +export type I4vi3hlg2ca351 = AnonymousEnum<{ + /** + *Propose a referendum on a privileged action. + * + *- `origin`: must be `SubmitOrigin` and the account must have `SubmissionDeposit` funds + * available. + *- `proposal_origin`: The origin from which the proposal should be executed. + *- `proposal`: The proposal. + *- `enactment_moment`: The moment that the proposal should be enacted. + * + *Emits `Submitted`. + */ + "submit": Anonymize; + /** + *Post the Decision Deposit for a referendum. + * + *- `origin`: must be `Signed` and the account must have funds available for the + * referendum's track's Decision Deposit. + *- `index`: The index of the submitted referendum whose Decision Deposit is yet to be + * posted. + * + *Emits `DecisionDepositPlaced`. + */ + "place_decision_deposit": Anonymize; + /** + *Refund the Decision Deposit for a closed referendum back to the depositor. + * + *- `origin`: must be `Signed` or `Root`. + *- `index`: The index of a closed referendum whose Decision Deposit has not yet been + * refunded. + * + *Emits `DecisionDepositRefunded`. + */ + "refund_decision_deposit": Anonymize; + /** + *Cancel an ongoing referendum. + * + *- `origin`: must be the `CancelOrigin`. + *- `index`: The index of the referendum to be cancelled. + * + *Emits `Cancelled`. + */ + "cancel": Anonymize; + /** + *Cancel an ongoing referendum and slash the deposits. + * + *- `origin`: must be the `KillOrigin`. + *- `index`: The index of the referendum to be cancelled. + * + *Emits `Killed` and `DepositSlashed`. + */ + "kill": Anonymize; + /** + *Advance a referendum onto its next logical state. Only used internally. + * + *- `origin`: must be `Root`. + *- `index`: the referendum to be advanced. + */ + "nudge_referendum": Anonymize; + /** + *Advance a track onto its next logical state. Only used internally. + * + *- `origin`: must be `Root`. + *- `track`: the track to be advanced. + * + *Action item for when there is now one fewer referendum in the deciding phase and the + *`DecidingCount` is not yet updated. This means that we should either: + *- begin deciding another referendum (and leave `DecidingCount` alone); or + *- decrement `DecidingCount`. + */ + "one_fewer_deciding": Anonymize; + /** + *Refund the Submission Deposit for a closed referendum back to the depositor. + * + *- `origin`: must be `Signed` or `Root`. + *- `index`: The index of a closed referendum whose Submission Deposit has not yet been + * refunded. + * + *Emits `SubmissionDepositRefunded`. + */ + "refund_submission_deposit": Anonymize; + /** + *Set or clear metadata of a referendum. + * + *Parameters: + *- `origin`: Must be `Signed` by a creator of a referendum or by anyone to clear a + * metadata of a finished referendum. + *- `index`: The index of a referendum to set or clear metadata for. + *- `maybe_hash`: The hash of an on-chain stored preimage. `None` to clear a metadata. + */ + "set_metadata": Anonymize; +}>; +export type I4dvjo4haia091 = { + "proposal_origin": Anonymize; + "proposal": PreimagesBounded; + "enactment_moment": TraitsScheduleDispatchTime; +}; +export type I5bt1lc4doakmu = AnonymousEnum<{ + /** + *Introduce a new member. + * + *- `origin`: Must be the `AddOrigin`. + *- `who`: Account of non-member which will become a member. + * + *Weight: `O(1)` + */ + "add_member": Anonymize; + /** + *Increment the rank of an existing member by one. + * + *- `origin`: Must be the `PromoteOrigin`. + *- `who`: Account of existing member. + * + *Weight: `O(1)` + */ + "promote_member": Anonymize; + /** + *Decrement the rank of an existing member by one. If the member is already at rank zero, + *then they are removed entirely. + * + *- `origin`: Must be the `DemoteOrigin`. + *- `who`: Account of existing member of rank greater than zero. + * + *Weight: `O(1)`, less if the member's index is highest in its rank. + */ + "demote_member": Anonymize; + /** + *Remove the member entirely. + * + *- `origin`: Must be the `RemoveOrigin`. + *- `who`: Account of existing member of rank greater than zero. + *- `min_rank`: The rank of the member or greater. + * + *Weight: `O(min_rank)`. + */ + "remove_member": Anonymize; + /** + *Add an aye or nay vote for the sender to the given proposal. + * + *- `origin`: Must be `Signed` by a member account. + *- `poll`: Index of a poll which is ongoing. + *- `aye`: `true` if the vote is to approve the proposal, `false` otherwise. + * + *Transaction fees are be waived if the member is voting on any particular proposal + *for the first time and the call is successful. Subsequent vote changes will charge a + *fee. + * + *Weight: `O(1)`, less if there was no previous vote on the poll by the member. + */ + "vote": Anonymize; + /** + *Remove votes from the given poll. It must have ended. + * + *- `origin`: Must be `Signed` by any account. + *- `poll_index`: Index of a poll which is completed and for which votes continue to + * exist. + *- `max`: Maximum number of vote items from remove in this call. + * + *Transaction fees are waived if the operation is successful. + * + *Weight `O(max)` (less if there are fewer items to remove than `max`). + */ + "cleanup_poll": Anonymize; + /** + *Exchanges a member with a new account and the same existing rank. + * + *- `origin`: Must be the `ExchangeOrigin`. + *- `who`: Account of existing member of rank greater than zero to be exchanged. + *- `new_who`: New Account of existing member of rank greater than zero to exchanged to. + */ + "exchange_member": Anonymize; +}>; +export type I59bngqm85b22v = { + "who": MultiAddress; +}; +export type I3amdclkdfaipk = { + "who": MultiAddress; + "min_rank": number; +}; +export type I8bvk21lpmah75 = { + "poll": number; + "aye": boolean; +}; +export type I449n3riv6jbum = { + "poll_index": number; + "max": number; +}; +export type I9a7qiue67urvk = { + "who": MultiAddress; + "new_who": MultiAddress; +}; +export type Iet9pqfh3sbig8 = AnonymousEnum<{ + "whitelist_call": Anonymize; + "remove_whitelisted_call": Anonymize; + "dispatch_whitelisted_call": Anonymize; + "dispatch_whitelisted_call_with_preimage": Anonymize; +}>; +export type I2ifddbprs364f = { + "call": TxCallData; +}; +export type I4pauf7of6nn70 = AnonymousEnum<{ + /** + *Send a batch of dispatch calls. + * + *May be called from any origin except `None`. + * + *- `calls`: The calls to be dispatched from the same origin. The number of call must not + * exceed the constant: `batched_calls_limit` (available in constant metadata). + * + *If origin is root then the calls are dispatched without checking origin filter. (This + *includes bypassing `frame_system::Config::BaseCallFilter`). + * + *## Complexity + *- O(C) where C is the number of calls to be batched. + * + *This will return `Ok` in all circumstances. To determine the success of the batch, an + *event is deposited. If a call failed and the batch was interrupted, then the + *`BatchInterrupted` event is deposited, along with the number of successful calls made + *and the error of the failed call. If all were successful, then the `BatchCompleted` + *event is deposited. + */ + "batch": Anonymize; + /** + *Send a call through an indexed pseudonym of the sender. + * + *Filter from origin are passed along. The call will be dispatched with an origin which + *use the same filter as the origin of this call. + * + *NOTE: If you need to ensure that any account-based filtering is not honored (i.e. + *because you expect `proxy` to have been used prior in the call stack and you do not want + *the call restrictions to apply to any sub-accounts), then use `as_multi_threshold_1` + *in the Multisig pallet instead. + * + *NOTE: Prior to version *12, this was called `as_limited_sub`. + * + *The dispatch origin for this call must be _Signed_. + */ + "as_derivative": Anonymize; + /** + *Send a batch of dispatch calls and atomically execute them. + *The whole transaction will rollback and fail if any of the calls failed. + * + *May be called from any origin except `None`. + * + *- `calls`: The calls to be dispatched from the same origin. The number of call must not + * exceed the constant: `batched_calls_limit` (available in constant metadata). + * + *If origin is root then the calls are dispatched without checking origin filter. (This + *includes bypassing `frame_system::Config::BaseCallFilter`). + * + *## Complexity + *- O(C) where C is the number of calls to be batched. + */ + "batch_all": Anonymize; + /** + *Dispatches a function call with a provided origin. + * + *The dispatch origin for this call must be _Root_. + * + *## Complexity + *- O(1). + */ + "dispatch_as": Anonymize; + /** + *Send a batch of dispatch calls. + *Unlike `batch`, it allows errors and won't interrupt. + * + *May be called from any origin except `None`. + * + *- `calls`: The calls to be dispatched from the same origin. The number of call must not + * exceed the constant: `batched_calls_limit` (available in constant metadata). + * + *If origin is root then the calls are dispatch without checking origin filter. (This + *includes bypassing `frame_system::Config::BaseCallFilter`). + * + *## Complexity + *- O(C) where C is the number of calls to be batched. + */ + "force_batch": Anonymize; + /** + *Dispatch a function call with a specified weight. + * + *This function does not check the weight of the call, and instead allows the + *Root origin to specify the weight of the call. + * + *The dispatch origin for this call must be _Root_. + */ + "with_weight": Anonymize; +}>; +export type I2jef1c2cnp8oc = { + "calls": Anonymize; +}; +export type Ichf43loj4967n = Array; +export type I3v23e79tnlepm = { + "index": number; + "call": TxCallData; +}; +export type I8b032lvj28v38 = { + "as_origin": Anonymize; + "call": TxCallData; +}; +export type Ib36tv0e89obnf = { + "call": TxCallData; + "weight": Anonymize; +}; +export type Iaup05df56f0nc = AnonymousEnum<{ + /** + *A user outside of the society can make a bid for entry. + * + *Payment: The group's Candidate Deposit will be reserved for making a bid. It is returned + *when the bid becomes a member, or if the bid calls `unbid`. + * + *The dispatch origin for this call must be _Signed_. + * + *Parameters: + *- `value`: A one time payment the bid would like to receive when joining the society. + */ + "bid": Anonymize; + /** + *A bidder can remove their bid for entry into society. + *By doing so, they will have their candidate deposit returned or + *they will unvouch their voucher. + * + *Payment: The bid deposit is unreserved if the user made a bid. + * + *The dispatch origin for this call must be _Signed_ and a bidder. + */ + "unbid": undefined; + /** + *As a member, vouch for someone to join society by placing a bid on their behalf. + * + *There is no deposit required to vouch for a new bid, but a member can only vouch for + *one bid at a time. If the bid becomes a suspended candidate and ultimately rejected by + *the suspension judgement origin, the member will be banned from vouching again. + * + *As a vouching member, you can claim a tip if the candidate is accepted. This tip will + *be paid as a portion of the reward the member will receive for joining the society. + * + *The dispatch origin for this call must be _Signed_ and a member. + * + *Parameters: + *- `who`: The user who you would like to vouch for. + *- `value`: The total reward to be paid between you and the candidate if they become + *a member in the society. + *- `tip`: Your cut of the total `value` payout when the candidate is inducted into + *the society. Tips larger than `value` will be saturated upon payout. + */ + "vouch": Anonymize; + /** + *As a vouching member, unvouch a bid. This only works while vouched user is + *only a bidder (and not a candidate). + * + *The dispatch origin for this call must be _Signed_ and a vouching member. + * + *Parameters: + *- `pos`: Position in the `Bids` vector of the bid who should be unvouched. + */ + "unvouch": undefined; + /** + *As a member, vote on a candidate. + * + *The dispatch origin for this call must be _Signed_ and a member. + * + *Parameters: + *- `candidate`: The candidate that the member would like to bid on. + *- `approve`: A boolean which says if the candidate should be approved (`true`) or + * rejected (`false`). + */ + "vote": Anonymize; + /** + *As a member, vote on the defender. + * + *The dispatch origin for this call must be _Signed_ and a member. + * + *Parameters: + *- `approve`: A boolean which says if the candidate should be + *approved (`true`) or rejected (`false`). + */ + "defender_vote": Anonymize; + /** + *Transfer the first matured payout for the sender and remove it from the records. + * + *NOTE: This extrinsic needs to be called multiple times to claim multiple matured + *payouts. + * + *Payment: The member will receive a payment equal to their first matured + *payout to their free balance. + * + *The dispatch origin for this call must be _Signed_ and a member with + *payouts remaining. + */ + "payout": undefined; + /** + *Repay the payment previously given to the member with the signed origin, remove any + *pending payments, and elevate them from rank 0 to rank 1. + */ + "waive_repay": Anonymize; + /** + *Found the society. + * + *This is done as a discrete action in order to allow for the + *pallet to be included into a running chain and can only be done once. + * + *The dispatch origin for this call must be from the _FounderSetOrigin_. + * + *Parameters: + *- `founder` - The first member and head of the newly founded society. + *- `max_members` - The initial max number of members for the society. + *- `max_intake` - The maximum number of candidates per intake period. + *- `max_strikes`: The maximum number of strikes a member may get before they become + * suspended and may only be reinstated by the founder. + *- `candidate_deposit`: The deposit required to make a bid for membership of the group. + *- `rules` - The rules of this society concerning membership. + * + *Complexity: O(1) + */ + "found_society": Anonymize; + /** + *Dissolve the society and remove all members. + * + *The dispatch origin for this call must be Signed, and the signing account must be both + *the `Founder` and the `Head`. This implies that it may only be done when there is one + *member. + */ + "dissolve": undefined; + /** + *Allow suspension judgement origin to make judgement on a suspended member. + * + *If a suspended member is forgiven, we simply add them back as a member, not affecting + *any of the existing storage items for that member. + * + *If a suspended member is rejected, remove all associated storage items, including + *their payouts, and remove any vouched bids they currently have. + * + *The dispatch origin for this call must be Signed from the Founder. + * + *Parameters: + *- `who` - The suspended member to be judged. + *- `forgive` - A boolean representing whether the suspension judgement origin forgives + * (`true`) or rejects (`false`) a suspended member. + */ + "judge_suspended_member": Anonymize; + /** + *Change the maximum number of members in society and the maximum number of new candidates + *in a single intake period. + * + *The dispatch origin for this call must be Signed by the Founder. + * + *Parameters: + *- `max_members` - The maximum number of members for the society. This must be no less + * than the current number of members. + *- `max_intake` - The maximum number of candidates per intake period. + *- `max_strikes`: The maximum number of strikes a member may get before they become + * suspended and may only be reinstated by the founder. + *- `candidate_deposit`: The deposit required to make a bid for membership of the group. + */ + "set_parameters": Anonymize; + /** + *Punish the skeptic with a strike if they did not vote on a candidate. Callable by the + *candidate. + */ + "punish_skeptic": undefined; + /** + *Transform an approved candidate into a member. Callable only by the + *the candidate, and only after the period for voting has ended. + */ + "claim_membership": undefined; + /** + *Transform an approved candidate into a member. Callable only by the Signed origin of the + *Founder, only after the period for voting has ended and only when the candidate is not + *clearly rejected. + */ + "bestow_membership": Anonymize; + /** + *Remove the candidate's application from the society. Callable only by the Signed origin + *of the Founder, only after the period for voting has ended, and only when they do not + *have a clear approval. + * + *Any bid deposit is lost and voucher is banned. + */ + "kick_candidate": Anonymize; + /** + *Remove the candidate's application from the society. Callable only by the candidate. + * + *Any bid deposit is lost and voucher is banned. + */ + "resign_candidacy": undefined; + /** + *Remove a `candidate`'s failed application from the society. Callable by any + *signed origin but only at the end of the subsequent round and only for + *a candidate with more rejections than approvals. + * + *The bid deposit is lost and the voucher is banned. + */ + "drop_candidate": Anonymize; + /** + *Remove up to `max` stale votes for the given `candidate`. + * + *May be called by any Signed origin, but only after the candidate's candidacy is ended. + */ + "cleanup_candidacy": Anonymize; + /** + *Remove up to `max` stale votes for the defender in the given `challenge_round`. + * + *May be called by any Signed origin, but only after the challenge round is ended. + */ + "cleanup_challenge": Anonymize; +}>; +export type Ibvkbvbkttt0k5 = { + "who": MultiAddress; + "value": bigint; + "tip": bigint; +}; +export type I8i12uisk6j7l = { + "candidate": MultiAddress; + "approve": boolean; +}; +export type I26anifrfnljoi = { + "approve": boolean; +}; +export type I6a6f85pb71ums = { + "founder": MultiAddress; + "max_members": number; + "max_intake": number; + "max_strikes": number; + "candidate_deposit": bigint; + "rules": Binary; +}; +export type I96p6guspeq6t = { + "who": MultiAddress; + "forgive": boolean; +}; +export type Ieh40op1lafir9 = { + "candidate": SS58String; + "max": number; +}; +export type Icjp7f9u9fno72 = { + "challenge_round": number; + "max": number; +}; +export type I7q9tacka5j7qe = AnonymousEnum<{ + /** + *Send a call through a recovered account. + * + *The dispatch origin for this call must be _Signed_ and registered to + *be able to make calls on behalf of the recovered account. + * + *Parameters: + *- `account`: The recovered account you want to make a call on-behalf-of. + *- `call`: The call you want to make with the recovered account. + */ + "as_recovered": Anonymize; + /** + *Allow ROOT to bypass the recovery process and set an a rescuer account + *for a lost account directly. + * + *The dispatch origin for this call must be _ROOT_. + * + *Parameters: + *- `lost`: The "lost account" to be recovered. + *- `rescuer`: The "rescuer account" which can call as the lost account. + */ + "set_recovered": Anonymize; + /** + *Create a recovery configuration for your account. This makes your account recoverable. + * + *Payment: `ConfigDepositBase` + `FriendDepositFactor` * #_of_friends balance + *will be reserved for storing the recovery configuration. This deposit is returned + *in full when the user calls `remove_recovery`. + * + *The dispatch origin for this call must be _Signed_. + * + *Parameters: + *- `friends`: A list of friends you trust to vouch for recovery attempts. Should be + * ordered and contain no duplicate values. + *- `threshold`: The number of friends that must vouch for a recovery attempt before the + * account can be recovered. Should be less than or equal to the length of the list of + * friends. + *- `delay_period`: The number of blocks after a recovery attempt is initialized that + * needs to pass before the account can be recovered. + */ + "create_recovery": Anonymize; + /** + *Initiate the process for recovering a recoverable account. + * + *Payment: `RecoveryDeposit` balance will be reserved for initiating the + *recovery process. This deposit will always be repatriated to the account + *trying to be recovered. See `close_recovery`. + * + *The dispatch origin for this call must be _Signed_. + * + *Parameters: + *- `account`: The lost account that you want to recover. This account needs to be + * recoverable (i.e. have a recovery configuration). + */ + "initiate_recovery": Anonymize; + /** + *Allow a "friend" of a recoverable account to vouch for an active recovery + *process for that account. + * + *The dispatch origin for this call must be _Signed_ and must be a "friend" + *for the recoverable account. + * + *Parameters: + *- `lost`: The lost account that you want to recover. + *- `rescuer`: The account trying to rescue the lost account that you want to vouch for. + * + *The combination of these two parameters must point to an active recovery + *process. + */ + "vouch_recovery": Anonymize; + /** + *Allow a successful rescuer to claim their recovered account. + * + *The dispatch origin for this call must be _Signed_ and must be a "rescuer" + *who has successfully completed the account recovery process: collected + *`threshold` or more vouches, waited `delay_period` blocks since initiation. + * + *Parameters: + *- `account`: The lost account that you want to claim has been successfully recovered by + * you. + */ + "claim_recovery": Anonymize; + /** + *As the controller of a recoverable account, close an active recovery + *process for your account. + * + *Payment: By calling this function, the recoverable account will receive + *the recovery deposit `RecoveryDeposit` placed by the rescuer. + * + *The dispatch origin for this call must be _Signed_ and must be a + *recoverable account with an active recovery process for it. + * + *Parameters: + *- `rescuer`: The account trying to rescue this recoverable account. + */ + "close_recovery": Anonymize; + /** + *Remove the recovery process for your account. Recovered accounts are still accessible. + * + *NOTE: The user must make sure to call `close_recovery` on all active + *recovery attempts before calling this function else it will fail. + * + *Payment: By calling this function the recoverable account will unreserve + *their recovery configuration deposit. + *(`ConfigDepositBase` + `FriendDepositFactor` * #_of_friends) + * + *The dispatch origin for this call must be _Signed_ and must be a + *recoverable account (i.e. has a recovery configuration). + */ + "remove_recovery": undefined; + /** + *Cancel the ability to use `as_recovered` for `account`. + * + *The dispatch origin for this call must be _Signed_ and registered to + *be able to make calls on behalf of the recovered account. + * + *Parameters: + *- `account`: The recovered account you are able to call on-behalf-of. + */ + "cancel_recovered": Anonymize; +}>; +export type I1bk4tm1i2b3ng = { + "account": MultiAddress; + "call": TxCallData; +}; +export type I7pqmhr25d3dqq = { + "lost": MultiAddress; + "rescuer": MultiAddress; +}; +export type I6s6ihmfj6j5qq = { + "friends": Anonymize; + "threshold": number; + "delay_period": number; +}; +export type Ic6cqd9g0t65v0 = { + "account": MultiAddress; +}; +export type I7ka1pdlbuevh2 = { + "rescuer": MultiAddress; +}; +export type I33lu1rt2eoq1h = AnonymousEnum<{ + /** + *Anonymously schedule a task. + */ + "schedule": Anonymize; + /** + *Cancel an anonymously scheduled task. + */ + "cancel": Anonymize; + /** + *Schedule a named task. + */ + "schedule_named": Anonymize; + /** + *Cancel a named scheduled task. + */ + "cancel_named": Anonymize; + /** + *Anonymously schedule a task after a delay. + */ + "schedule_after": Anonymize; + /** + *Schedule a named task after a delay. + */ + "schedule_named_after": Anonymize; + /** + *Set a retry configuration for a task so that, in case its scheduled run fails, it will + *be retried after `period` blocks, for a total amount of `retries` retries or until it + *succeeds. + * + *Tasks which need to be scheduled for a retry are still subject to weight metering and + *agenda space, same as a regular task. If a periodic task fails, it will be scheduled + *normally while the task is retrying. + * + *Tasks scheduled as a result of a retry for a periodic task are unnamed, non-periodic + *clones of the original task. Their retry configuration will be derived from the + *original task's configuration, but will have a lower value for `remaining` than the + *original `total_retries`. + */ + "set_retry": Anonymize; + /** + *Set a retry configuration for a named task so that, in case its scheduled run fails, it + *will be retried after `period` blocks, for a total amount of `retries` retries or until + *it succeeds. + * + *Tasks which need to be scheduled for a retry are still subject to weight metering and + *agenda space, same as a regular task. If a periodic task fails, it will be scheduled + *normally while the task is retrying. + * + *Tasks scheduled as a result of a retry for a periodic task are unnamed, non-periodic + *clones of the original task. Their retry configuration will be derived from the + *original task's configuration, but will have a lower value for `remaining` than the + *original `total_retries`. + */ + "set_retry_named": Anonymize; + /** + *Removes the retry configuration of a task. + */ + "cancel_retry": Anonymize; + /** + *Cancel the retry configuration of a named task. + */ + "cancel_retry_named": Anonymize; +}>; +export type I86371i6qagoce = { + "when": number; + "maybe_periodic"?: Anonymize; + "priority": number; + "call": TxCallData; +}; +export type I5gm0fj8b8qu3g = { + "id": FixedSizeBinary<32>; + "when": number; + "maybe_periodic"?: Anonymize; + "priority": number; + "call": TxCallData; +}; +export type Ib5h8krvbu7gcm = { + "after": number; + "maybe_periodic"?: Anonymize; + "priority": number; + "call": TxCallData; +}; +export type Idunov91dgketn = { + "id": FixedSizeBinary<32>; + "after": number; + "maybe_periodic"?: Anonymize; + "priority": number; + "call": TxCallData; +}; +export type I6tj3mj7ea98bu = AnonymousEnum<{ + /** + *Dispatch the given `call` from an account that the sender is authorised for through + *`add_proxy`. + * + *The dispatch origin for this call must be _Signed_. + * + *Parameters: + *- `real`: The account that the proxy will make a call on behalf of. + *- `force_proxy_type`: Specify the exact proxy type to be used and checked for this call. + *- `call`: The call to be made by the `real` account. + */ + "proxy": Anonymize; + /** + *Register a proxy account for the sender that is able to make calls on its behalf. + * + *The dispatch origin for this call must be _Signed_. + * + *Parameters: + *- `proxy`: The account that the `caller` would like to make a proxy. + *- `proxy_type`: The permissions allowed for this proxy account. + *- `delay`: The announcement period required of the initial proxy. Will generally be + *zero. + */ + "add_proxy": Anonymize; + /** + *Unregister a proxy account for the sender. + * + *The dispatch origin for this call must be _Signed_. + * + *Parameters: + *- `proxy`: The account that the `caller` would like to remove as a proxy. + *- `proxy_type`: The permissions currently enabled for the removed proxy account. + */ + "remove_proxy": Anonymize; + /** + *Unregister all proxy accounts for the sender. + * + *The dispatch origin for this call must be _Signed_. + * + *WARNING: This may be called on accounts created by `pure`, however if done, then + *the unreserved fees will be inaccessible. **All access to this account will be lost.** + */ + "remove_proxies": undefined; + /** + *Spawn a fresh new account that is guaranteed to be otherwise inaccessible, and + *initialize it with a proxy of `proxy_type` for `origin` sender. + * + *Requires a `Signed` origin. + * + *- `proxy_type`: The type of the proxy that the sender will be registered as over the + *new account. This will almost always be the most permissive `ProxyType` possible to + *allow for maximum flexibility. + *- `index`: A disambiguation index, in case this is called multiple times in the same + *transaction (e.g. with `utility::batch`). Unless you're using `batch` you probably just + *want to use `0`. + *- `delay`: The announcement period required of the initial proxy. Will generally be + *zero. + * + *Fails with `Duplicate` if this has already been called in this transaction, from the + *same sender, with the same parameters. + * + *Fails if there are insufficient funds to pay for deposit. + */ + "create_pure": Anonymize; + /** + *Removes a previously spawned pure proxy. + * + *WARNING: **All access to this account will be lost.** Any funds held in it will be + *inaccessible. + * + *Requires a `Signed` origin, and the sender account must have been created by a call to + *`pure` with corresponding parameters. + * + *- `spawner`: The account that originally called `pure` to create this account. + *- `index`: The disambiguation index originally passed to `pure`. Probably `0`. + *- `proxy_type`: The proxy type originally passed to `pure`. + *- `height`: The height of the chain when the call to `pure` was processed. + *- `ext_index`: The extrinsic index in which the call to `pure` was processed. + * + *Fails with `NoPermission` in case the caller is not a previously created pure + *account whose `pure` call has corresponding parameters. + */ + "kill_pure": Anonymize; + /** + *Publish the hash of a proxy-call that will be made in the future. + * + *This must be called some number of blocks before the corresponding `proxy` is attempted + *if the delay associated with the proxy relationship is greater than zero. + * + *No more than `MaxPending` announcements may be made at any one time. + * + *This will take a deposit of `AnnouncementDepositFactor` as well as + *`AnnouncementDepositBase` if there are no other pending announcements. + * + *The dispatch origin for this call must be _Signed_ and a proxy of `real`. + * + *Parameters: + *- `real`: The account that the proxy will make a call on behalf of. + *- `call_hash`: The hash of the call to be made by the `real` account. + */ + "announce": Anonymize; + /** + *Remove a given announcement. + * + *May be called by a proxy account to remove a call they previously announced and return + *the deposit. + * + *The dispatch origin for this call must be _Signed_. + * + *Parameters: + *- `real`: The account that the proxy will make a call on behalf of. + *- `call_hash`: The hash of the call to be made by the `real` account. + */ + "remove_announcement": Anonymize; + /** + *Remove the given announcement of a delegate. + * + *May be called by a target (proxied) account to remove a call that one of their delegates + *(`delegate`) has announced they want to execute. The deposit is returned. + * + *The dispatch origin for this call must be _Signed_. + * + *Parameters: + *- `delegate`: The account that previously announced the call. + *- `call_hash`: The hash of the call to be made. + */ + "reject_announcement": Anonymize; + /** + *Dispatch the given `call` from an account that the sender is authorized for through + *`add_proxy`. + * + *Removes any corresponding announcement(s). + * + *The dispatch origin for this call must be _Signed_. + * + *Parameters: + *- `real`: The account that the proxy will make a call on behalf of. + *- `force_proxy_type`: Specify the exact proxy type to be used and checked for this call. + *- `call`: The call to be made by the `real` account. + */ + "proxy_announced": Anonymize; +}>; +export type I8pt1p4aiber0h = { + "real": MultiAddress; + "force_proxy_type"?: Anonymize; + "call": TxCallData; +}; +export type Ic9lodvalmfgme = (Anonymize) | undefined; +export type Ia3sdslbn23eti = { + "delegate": MultiAddress; + "proxy_type": Anonymize; + "delay": number; +}; +export type Ict27q3g3cg78f = { + "proxy_type": Anonymize; + "delay": number; + "index": number; +}; +export type Ieduhgeucg3h7j = { + "spawner": MultiAddress; + "proxy_type": Anonymize; + "index": number; + "height": number; + "ext_index": number; +}; +export type I9tfpm16e56og7 = { + "delegate": MultiAddress; + "real": MultiAddress; + "force_proxy_type"?: Anonymize; + "call": TxCallData; +}; +export type I5mjmvevktqtsu = AnonymousEnum<{ + /** + *Immediately dispatch a multi-signature call using a single approval from the caller. + * + *The dispatch origin for this call must be _Signed_. + * + *- `other_signatories`: The accounts (other than the sender) who are part of the + *multi-signature, but do not participate in the approval process. + *- `call`: The call to be executed. + * + *Result is equivalent to the dispatched result. + * + *## Complexity + *O(Z + C) where Z is the length of the call and C its execution weight. + */ + "as_multi_threshold_1": Anonymize; + /** + *Register approval for a dispatch to be made from a deterministic composite account if + *approved by a total of `threshold - 1` of `other_signatories`. + * + *If there are enough, then dispatch the call. + * + *Payment: `DepositBase` will be reserved if this is the first approval, plus + *`threshold` times `DepositFactor`. It is returned once this dispatch happens or + *is cancelled. + * + *The dispatch origin for this call must be _Signed_. + * + *- `threshold`: The total number of approvals for this dispatch before it is executed. + *- `other_signatories`: The accounts (other than the sender) who can approve this + *dispatch. May not be empty. + *- `maybe_timepoint`: If this is the first approval, then this must be `None`. If it is + *not the first approval, then it must be `Some`, with the timepoint (block number and + *transaction index) of the first approval transaction. + *- `call`: The call to be executed. + * + *NOTE: Unless this is the final approval, you will generally want to use + *`approve_as_multi` instead, since it only requires a hash of the call. + * + *Result is equivalent to the dispatched result if `threshold` is exactly `1`. Otherwise + *on success, result is `Ok` and the result from the interior call, if it was executed, + *may be found in the deposited `MultisigExecuted` event. + * + *## Complexity + *- `O(S + Z + Call)`. + *- Up to one balance-reserve or unreserve operation. + *- One passthrough operation, one insert, both `O(S)` where `S` is the number of + * signatories. `S` is capped by `MaxSignatories`, with weight being proportional. + *- One call encode & hash, both of complexity `O(Z)` where `Z` is tx-len. + *- One encode & hash, both of complexity `O(S)`. + *- Up to one binary search and insert (`O(logS + S)`). + *- I/O: 1 read `O(S)`, up to 1 mutate `O(S)`. Up to one remove. + *- One event. + *- The weight of the `call`. + *- Storage: inserts one item, value size bounded by `MaxSignatories`, with a deposit + * taken for its lifetime of `DepositBase + threshold * DepositFactor`. + */ + "as_multi": Anonymize; + /** + *Register approval for a dispatch to be made from a deterministic composite account if + *approved by a total of `threshold - 1` of `other_signatories`. + * + *Payment: `DepositBase` will be reserved if this is the first approval, plus + *`threshold` times `DepositFactor`. It is returned once this dispatch happens or + *is cancelled. + * + *The dispatch origin for this call must be _Signed_. + * + *- `threshold`: The total number of approvals for this dispatch before it is executed. + *- `other_signatories`: The accounts (other than the sender) who can approve this + *dispatch. May not be empty. + *- `maybe_timepoint`: If this is the first approval, then this must be `None`. If it is + *not the first approval, then it must be `Some`, with the timepoint (block number and + *transaction index) of the first approval transaction. + *- `call_hash`: The hash of the call to be executed. + * + *NOTE: If this is the final approval, you will want to use `as_multi` instead. + * + *## Complexity + *- `O(S)`. + *- Up to one balance-reserve or unreserve operation. + *- One passthrough operation, one insert, both `O(S)` where `S` is the number of + * signatories. `S` is capped by `MaxSignatories`, with weight being proportional. + *- One encode & hash, both of complexity `O(S)`. + *- Up to one binary search and insert (`O(logS + S)`). + *- I/O: 1 read `O(S)`, up to 1 mutate `O(S)`. Up to one remove. + *- One event. + *- Storage: inserts one item, value size bounded by `MaxSignatories`, with a deposit + * taken for its lifetime of `DepositBase + threshold * DepositFactor`. + */ + "approve_as_multi": Anonymize; + /** + *Cancel a pre-existing, on-going multisig transaction. Any deposit reserved previously + *for this operation will be unreserved on success. + * + *The dispatch origin for this call must be _Signed_. + * + *- `threshold`: The total number of approvals for this dispatch before it is executed. + *- `other_signatories`: The accounts (other than the sender) who can approve this + *dispatch. May not be empty. + *- `timepoint`: The timepoint (block number and transaction index) of the first approval + *transaction for this dispatch. + *- `call_hash`: The hash of the call to be executed. + * + *## Complexity + *- `O(S)`. + *- Up to one balance-reserve or unreserve operation. + *- One passthrough operation, one insert, both `O(S)` where `S` is the number of + * signatories. `S` is capped by `MaxSignatories`, with weight being proportional. + *- One encode & hash, both of complexity `O(S)`. + *- One event. + *- I/O: 1 read `O(S)`, one remove. + *- Storage: removes one item. + */ + "cancel_as_multi": Anonymize; +}>; +export type Ic11v0sqkv8lho = { + "other_signatories": Anonymize; + "call": TxCallData; +}; +export type I5s3p8q2sfvnav = { + "threshold": number; + "other_signatories": Anonymize; + "maybe_timepoint"?: Anonymize; + "call": TxCallData; + "max_weight": Anonymize; +}; +export type I5dqci5rl3kg3m = AnonymousEnum<{ + /** + *Submit a solution for the unsigned phase. + * + *The dispatch origin fo this call must be __none__. + * + *This submission is checked on the fly. Moreover, this unsigned solution is only + *validated when submitted to the pool from the **local** node. Effectively, this means + *that only active validators can submit this transaction when authoring a block (similar + *to an inherent). + * + *To prevent any incorrect solution (and thus wasted time/weight), this transaction will + *panic if the solution submitted by the validator is invalid in any way, effectively + *putting their authoring reward at risk. + * + *No deposit or reward is associated with this submission. + */ + "submit_unsigned": Anonymize; + /** + *Set a new value for `MinimumUntrustedScore`. + * + *Dispatch origin must be aligned with `T::ForceOrigin`. + * + *This check can be turned off by setting the value to `None`. + */ + "set_minimum_untrusted_score": Anonymize; + /** + *Set a solution in the queue, to be handed out to the client of this pallet in the next + *call to `ElectionProvider::elect`. + * + *This can only be set by `T::ForceOrigin`, and only when the phase is `Emergency`. + * + *The solution is not checked for any feasibility and is assumed to be trustworthy, as any + *feasibility check itself can in principle cause the election process to fail (due to + *memory/weight constrains). + */ + "set_emergency_election_result": Anonymize; + /** + *Submit a solution for the signed phase. + * + *The dispatch origin fo this call must be __signed__. + * + *The solution is potentially queued, based on the claimed score and processed at the end + *of the signed phase. + * + *A deposit is reserved and recorded for the solution. Based on the outcome, the solution + *might be rewarded, slashed, or get all or a part of the deposit back. + */ + "submit": Anonymize; + /** + *Trigger the governance fallback. + * + *This can only be called when [`Phase::Emergency`] is enabled, as an alternative to + *calling [`Call::set_emergency_election_result`]. + */ + "governance_fallback": Anonymize; +}>; +export type Ic50i89t5eabvg = { + "raw_solution": Anonymize; + "witness": Anonymize; +}; +export type I2ou0mtsgm3l71 = { + "raw_solution": Anonymize; +}; +export type Iaq5q67idam8ll = AnonymousEnum<{ + /** + *Place a bid. + * + *Origin must be Signed, and account must have at least `amount` in free balance. + * + *- `amount`: The amount of the bid; these funds will be reserved, and if/when + * consolidated, removed. Must be at least `MinBid`. + *- `duration`: The number of periods before which the newly consolidated bid may be + * thawed. Must be greater than 1 and no more than `QueueCount`. + * + *Complexities: + *- `Queues[duration].len()` (just take max). + */ + "place_bid": Anonymize; + /** + *Retract a previously placed bid. + * + *Origin must be Signed, and the account should have previously issued a still-active bid + *of `amount` for `duration`. + * + *- `amount`: The amount of the previous bid. + *- `duration`: The duration of the previous bid. + */ + "retract_bid": Anonymize; + /** + *Ensure we have sufficient funding for all potential payouts. + * + *- `origin`: Must be accepted by `FundOrigin`. + */ + "fund_deficit": undefined; + /** + *Reduce or remove an outstanding receipt, placing the according proportion of funds into + *the account of the owner. + * + *- `origin`: Must be Signed and the account must be the owner of the receipt `index` as + * well as any fungible counterpart. + *- `index`: The index of the receipt. + *- `portion`: If `Some`, then only the given portion of the receipt should be thawed. If + * `None`, then all of it should be. + */ + "thaw_private": Anonymize; + /** + *Reduce or remove an outstanding receipt, placing the according proportion of funds into + *the account of the owner. + * + *- `origin`: Must be Signed and the account must be the owner of the fungible counterpart + * for receipt `index`. + *- `index`: The index of the receipt. + */ + "thaw_communal": Anonymize; + /** + *Make a private receipt communal and create fungible counterparts for its owner. + */ + "communify": Anonymize; + /** + *Make a communal receipt private and burn fungible counterparts from its owner. + */ + "privatize": Anonymize; +}>; +export type Icckjru8f8flpj = { + "amount": bigint; + "duration": number; +}; +export type Iba38lgbjrs7je = { + "index": number; + "maybe_proportion"?: Anonymize; +}; +export type I7e8tdrv5aklbf = ResultPayload, TransactionValidityError>; +export type Ibipt6qfiegcf5 = AnonymousEnum<{ + "System": Anonymize; + "Babe": Anonymize; + "Timestamp": Anonymize; + "Indices": Anonymize; + "Balances": Anonymize; + "Staking": Anonymize; + "Session": Anonymize; + "Grandpa": Anonymize; + "Treasury": Anonymize; + "ConvictionVoting": Anonymize; + "Referenda": Anonymize; + "FellowshipCollective": Anonymize; + "FellowshipReferenda": Anonymize; + "Whitelist": Anonymize; + "Parameters": Anonymize; + "Claims": Anonymize; + "Utility": Anonymize; + "Society": Anonymize; + "Recovery": Anonymize; + "Vesting": Anonymize; + "Scheduler": Anonymize; + "Proxy": Anonymize; + "Multisig": Anonymize; + "Preimage": Anonymize; + "Bounties": Anonymize; + "ChildBounties": Anonymize; + "ElectionProviderMultiPhase": Anonymize; + "Nis": Anonymize; + "NisCounterpartBalances": Anonymize; + "VoterList": Anonymize; + "NominationPools": Anonymize; + "FastUnstake": Anonymize; + "Configuration": Anonymize; + "ParasShared": undefined; + "ParaInclusion": undefined; + "ParaInherent": Anonymize; + "Paras": Anonymize; + "Initializer": Anonymize; + "Hrmp": Anonymize; + "ParasDisputes": Anonymize; + "ParasSlashing": Anonymize; + "OnDemandAssignmentProvider": Anonymize; + "Registrar": Anonymize; + "Slots": Anonymize; + "Auctions": Anonymize; + "Crowdloan": Anonymize; + "Coretime": Anonymize; + "XcmPallet": Anonymize; + "MessageQueue": Anonymize; + "AssetRate": Anonymize; + "Beefy": Anonymize; +}>; +export type Ib5fks2228v743 = ResultPayload, Anonymize>; +export type I5p94u12jrvjga = { + "execution_result": Anonymize; + "emitted_events": Anonymize; + "local_xcm"?: Anonymize; + "forwarded_xcms": Anonymize; +}; +export type Ia37q31t7lss7q = Array>; +export type Ib748gt0noucrc = ResultPayload, Anonymize>; +export type I7p376hrf80m31 = { + "execution_result": XcmV4TraitsOutcome; + "emitted_events": Anonymize; + "forwarded_xcms": Anonymize; +}; +export type Ia5993kjv8a1tl = Array>; +export type Ial6g5hh3k26i0 = { + "phase": Phase; + "event": Anonymize; + "topics": Anonymize; +}; +export type I5geb27cbtkqio = AnonymousEnum<{ + "System": Anonymize; + "Scheduler": Anonymize; + "Preimage": PreimageEvent; + "Indices": Anonymize; + "Balances": Anonymize; + "TransactionPayment": TransactionPaymentEvent; + "Staking": StakingEvent; + "Offences": OffencesEvent; + "Session": SessionEvent; + "Grandpa": GrandpaEvent; + "Treasury": Anonymize; + "ConvictionVoting": ConvictionVotingEvent; + "Referenda": Anonymize; + "Whitelist": Anonymize; + "Parameters": Anonymize; + "Claims": CommonClaimsEvent; + "Vesting": VestingEvent; + "Utility": Anonymize; + "Proxy": Anonymize; + "Multisig": Anonymize; + "Bounties": BountiesEvent; + "ChildBounties": ChildBountiesEvent; + "ElectionProviderMultiPhase": ElectionProviderMultiPhaseEvent; + "VoterList": BagsListEvent; + "NominationPools": NominationPoolsEvent; + "FastUnstake": Anonymize; + "ParaInclusion": ParachainsInclusionEvent; + "Paras": ParachainsParasEvent; + "Hrmp": ParachainsHrmpEvent; + "ParasDisputes": ParachainsDisputesEvent; + "OnDemand": Anonymize; + "Registrar": CommonParasRegistrarEvent; + "Slots": CommonSlotsEvent; + "Auctions": CommonAuctionsEvent; + "Crowdloan": Anonymize; + "Coretime": PolkadotRuntimeParachainsCoretimeEvent; + "StateTrieMigration": Anonymize; + "XcmPallet": Anonymize; + "MessageQueue": Anonymize; + "AssetRate": AssetRateEvent; + "Sudo": Anonymize; +}>; +export type I6c4581l5psfo4 = AnonymousEnum<{ + /** + *An extrinsic completed successfully. + */ + "ExtrinsicSuccess": Anonymize; + /** + *An extrinsic failed. + */ + "ExtrinsicFailed": Anonymize; + /** + *`:code` was updated. + */ + "CodeUpdated": undefined; + /** + *A new account was created. + */ + "NewAccount": Anonymize; + /** + *An account was reaped. + */ + "KilledAccount": Anonymize; + /** + *On on-chain remark happened. + */ + "Remarked": Anonymize; + /** + *An upgrade was authorized. + */ + "UpgradeAuthorized": Anonymize; +}>; +export type I9d21uli0ks815 = { + "dispatch_error": Anonymize; + "dispatch_info": Anonymize; +}; +export type I50ikjune0gg0u = AnonymousEnum<{ + "Other": undefined; + "CannotLookup": undefined; + "BadOrigin": undefined; + "Module": Anonymize; + "ConsumerRemaining": undefined; + "NoProviders": undefined; + "TooManyConsumers": undefined; + "Token": TokenError; + "Arithmetic": ArithmeticError; + "Transactional": TransactionalError; + "Exhausted": undefined; + "Corruption": undefined; + "Unavailable": undefined; + "RootNotAllowed": undefined; +}>; +export type Igi47i1e5vr4d = AnonymousEnum<{ + "System": Anonymize; + "Scheduler": Anonymize; + "Preimage": Anonymize; + "Babe": Anonymize; + "Timestamp": undefined; + "Indices": Anonymize; + "Balances": Anonymize; + "TransactionPayment": undefined; + "Authorship": undefined; + "Staking": Anonymize; + "Offences": undefined; + "Historical": undefined; + "Session": Anonymize; + "Grandpa": Anonymize; + "AuthorityDiscovery": undefined; + "Treasury": Anonymize; + "ConvictionVoting": Anonymize; + "Referenda": Anonymize; + "Origins": undefined; + "Whitelist": Anonymize; + "Parameters": undefined; + "Claims": Anonymize; + "Vesting": Anonymize; + "Utility": Anonymize; + "Proxy": Anonymize; + "Multisig": Anonymize; + "Bounties": Anonymize; + "ChildBounties": Anonymize; + "ElectionProviderMultiPhase": Anonymize; + "VoterList": Anonymize; + "NominationPools": Anonymize; + "FastUnstake": Anonymize; + "ParachainsOrigin": undefined; + "Configuration": Anonymize; + "ParasShared": undefined; + "ParaInclusion": Anonymize; + "ParaInherent": Anonymize; + "ParaScheduler": undefined; + "Paras": Anonymize; + "Initializer": undefined; + "Dmp": undefined; + "Hrmp": Anonymize; + "ParaSessionInfo": undefined; + "ParasDisputes": Anonymize; + "ParasSlashing": Anonymize; + "OnDemand": Anonymize; + "CoretimeAssignmentProvider": Anonymize; + "Registrar": Anonymize; + "Slots": Anonymize; + "Auctions": Anonymize; + "Crowdloan": Anonymize; + "Coretime": Anonymize; + "StateTrieMigration": Anonymize; + "XcmPallet": Anonymize; + "MessageQueue": Anonymize; + "AssetRate": Anonymize; + "Beefy": Anonymize; + "Mmr": undefined; + "BeefyMmrLeaf": undefined; + "ParaSudoWrapper": Anonymize; + "Sudo": Anonymize; +}>; +export type Ieq0677kv2oqb2 = AnonymousEnum<{ + /** + *The specified parachain is not registered. + */ + "ParaDoesntExist": undefined; + /** + *The specified parachain is already registered. + */ + "ParaAlreadyExists": undefined; + /** + *A DMP message couldn't be sent because it exceeds the maximum size allowed for a + *downward message. + */ + "ExceedsMaxMessageSize": undefined; + /** + *Could not schedule para cleanup. + */ + "CouldntCleanup": undefined; + /** + *Not a parathread (on-demand parachain). + */ + "NotParathread": undefined; + /** + *Not a lease holding parachain. + */ + "NotParachain": undefined; + /** + *Cannot upgrade on-demand parachain to lease holding parachain. + */ + "CannotUpgrade": undefined; + /** + *Cannot downgrade lease holding parachain to on-demand. + */ + "CannotDowngrade": undefined; + /** + *There are more cores than supported by the runtime. + */ + "TooManyCores": undefined; +}>; +export type Iaug04qjhbli00 = AnonymousEnum<{ + /** + *Sender must be the Sudo account. + */ + "RequireSudo": undefined; +}>; +export type I5vmt6mc9nfpct = AnonymousEnum<{ + /** + *Scheduled some task. + */ + "Scheduled": Anonymize; + /** + *Canceled some task. + */ + "Canceled": Anonymize; + /** + *Dispatched some task. + */ + "Dispatched": Anonymize; + /** + *Set a retry configuration for some task. + */ + "RetrySet": Anonymize; + /** + *Cancel a retry configuration for some task. + */ + "RetryCancelled": Anonymize; + /** + *The call for the provided hash was not found so the task has been aborted. + */ + "CallUnavailable": Anonymize; + /** + *The given task was unable to be renewed since the agenda is full at that block. + */ + "PeriodicFailed": Anonymize; + /** + *The given task was unable to be retried since the agenda is full at that block or there + *was not enough weight to reschedule it. + */ + "RetryFailed": Anonymize; + /** + *The given task can never be executed since it is overweight. + */ + "PermanentlyOverweight": Anonymize; +}>; +export type Ifr47nm7thgrp4 = { + "task": Anonymize; + "id"?: Anonymize; + "result": Anonymize; +}; +export type I38dplpgbs8dgo = ResultPayload>; +export type Iemlqif91cv0rg = AnonymousEnum<{ + "CallWhitelisted": Anonymize; + "WhitelistedCallRemoved": Anonymize; + "WhitelistedCallDispatched": Anonymize; +}>; +export type Iag65bq4k2ea97 = { + "call_hash": FixedSizeBinary<32>; + "result": Anonymize; +}; +export type If2tjlchftm7hb = ResultPayload, Anonymize>; +export type I19pl43e4escm6 = { + "post_info": Anonymize; + "error": Anonymize; +}; +export type Icvq03u1i91f91 = AnonymousEnum<{ + /** + *Batch of dispatches did not complete fully. Index of first failing dispatch given, as + *well as the error. + */ + "BatchInterrupted": Anonymize; + /** + *Batch of dispatches completed fully with no error. + */ + "BatchCompleted": undefined; + /** + *Batch of dispatches completed but has errors. + */ + "BatchCompletedWithErrors": undefined; + /** + *A single item within a Batch of dispatches has completed with no error. + */ + "ItemCompleted": undefined; + /** + *A single item within a Batch of dispatches has completed with error. + */ + "ItemFailed": Anonymize; + /** + *A call was dispatched. + */ + "DispatchedAs": Anonymize; +}>; +export type I8h7evu8bnn18n = { + "index": number; + "error": Anonymize; +}; +export type Iev8df16vlcnrm = { + "error": Anonymize; +}; +export type I1hl4th07hmok3 = { + "result": Anonymize; +}; +export type I2h8ujvol3vhvr = AnonymousEnum<{ + /** + *A proxy was executed correctly, with the given. + */ + "ProxyExecuted": Anonymize; + /** + *A pure account has been created by new proxy with given + *disambiguation index and proxy type. + */ + "PureCreated": Anonymize; + /** + *An announcement was placed to make a call in the future. + */ + "Announced": Anonymize; + /** + *A proxy was added. + */ + "ProxyAdded": Anonymize; + /** + *A proxy was removed. + */ + "ProxyRemoved": Anonymize; +}>; +export type I3s5n7dasj1ii1 = AnonymousEnum<{ + /** + *A new multisig operation has begun. + */ + "NewMultisig": Anonymize; + /** + *A multisig operation has been approved by someone. + */ + "MultisigApproval": Anonymize; + /** + *A multisig operation has been executed. + */ + "MultisigExecuted": Anonymize; + /** + *A multisig operation has been cancelled. + */ + "MultisigCancelled": Anonymize; +}>; +export type I6aucqi8p470ta = { + "approving": SS58String; + "timepoint": Anonymize; + "multisig": SS58String; + "call_hash": FixedSizeBinary<32>; + "result": Anonymize; +}; +export type I7tbto6t6nm8c5 = AnonymousEnum<{ + /** + *A staker was unstaked. + */ + "Unstaked": Anonymize; + /** + *A staker was slashed for requesting fast-unstake whilst being exposed. + */ + "Slashed": Anonymize; + /** + *A batch was partially checked for the given eras, but the process did not finish. + */ + "BatchChecked": Anonymize; + /** + *A batch of a given size was terminated. + * + *This is always follows by a number of `Unstaked` or `Slashed` events, marking the end + *of the batch. A new batch will be created upon next block. + */ + "BatchFinished": Anonymize; + /** + *An internal error happened. Operations will be paused now. + */ + "InternalError": undefined; +}>; +export type I9tpbs57uqggl = { + "stash": SS58String; + "result": Anonymize; +}; +export type I9cu097t2c1601 = AnonymousEnum<{ + /** + *Create a new crowdloaning campaign. + */ + "Created": Anonymize; + /** + *Contributed to a crowd sale. + */ + "Contributed": Anonymize; + /** + *Withdrew full balance of a contributor. + */ + "Withdrew": Anonymize; + /** + *The loans in a fund have been partially dissolved, i.e. there are some left + *over child keys that still need to be killed. + */ + "PartiallyRefunded": Anonymize; + /** + *All loans in a fund have been refunded. + */ + "AllRefunded": Anonymize; + /** + *Fund is dissolved. + */ + "Dissolved": Anonymize; + /** + *The result of trying to submit a new bid to the Slots pallet. + */ + "HandleBidResult": Anonymize; + /** + *The configuration to a crowdloan has been edited. + */ + "Edited": Anonymize; + /** + *A memo has been updated. + */ + "MemoUpdated": Anonymize; + /** + *A parachain has been moved to `NewRaise` + */ + "AddedToNewRaise": Anonymize; +}>; +export type I648p81puvbjcl = { + "para_id": number; + "result": Anonymize; +}; +export type I79c3g5tjuahad = AnonymousEnum<{ + /** + *A sudo call just took place. + */ + "Sudid": Anonymize; + /** + *The sudo key has been updated. + */ + "KeyChanged": Anonymize; + /** + *The key was permanently removed. + */ + "KeyRemoved": undefined; + /** + *A [sudo_as](Pallet::sudo_as) call just took place. + */ + "SudoAsDone": Anonymize; +}>; +export type Idja5vsh7mfgto = { + /** + *The result of the call made by the sudo user. + */ + "sudo_result": Anonymize; +}; +export type I5rtkmhm2dng4u = { + /** + *The old sudo key (if one was previously set). + */ + "old"?: Anonymize; + /** + *The new sudo key (if one was set). + */ + "new": SS58String; +}; +export type I5aiiov8iuajn7 = AnonymousEnum<{ + /** + *Anonymously schedule a task. + */ + "schedule": Anonymize; + /** + *Cancel an anonymously scheduled task. + */ + "cancel": Anonymize; + /** + *Schedule a named task. + */ + "schedule_named": Anonymize; + /** + *Cancel a named scheduled task. + */ + "cancel_named": Anonymize; + /** + *Anonymously schedule a task after a delay. + */ + "schedule_after": Anonymize; + /** + *Schedule a named task after a delay. + */ + "schedule_named_after": Anonymize; + /** + *Set a retry configuration for a task so that, in case its scheduled run fails, it will + *be retried after `period` blocks, for a total amount of `retries` retries or until it + *succeeds. + * + *Tasks which need to be scheduled for a retry are still subject to weight metering and + *agenda space, same as a regular task. If a periodic task fails, it will be scheduled + *normally while the task is retrying. + * + *Tasks scheduled as a result of a retry for a periodic task are unnamed, non-periodic + *clones of the original task. Their retry configuration will be derived from the + *original task's configuration, but will have a lower value for `remaining` than the + *original `total_retries`. + */ + "set_retry": Anonymize; + /** + *Set a retry configuration for a named task so that, in case its scheduled run fails, it + *will be retried after `period` blocks, for a total amount of `retries` retries or until + *it succeeds. + * + *Tasks which need to be scheduled for a retry are still subject to weight metering and + *agenda space, same as a regular task. If a periodic task fails, it will be scheduled + *normally while the task is retrying. + * + *Tasks scheduled as a result of a retry for a periodic task are unnamed, non-periodic + *clones of the original task. Their retry configuration will be derived from the + *original task's configuration, but will have a lower value for `remaining` than the + *original `total_retries`. + */ + "set_retry_named": Anonymize; + /** + *Removes the retry configuration of a task. + */ + "cancel_retry": Anonymize; + /** + *Cancel the retry configuration of a named task. + */ + "cancel_retry_named": Anonymize; +}>; +export type I3p13kido05bum = { + "when": number; + "maybe_periodic"?: Anonymize; + "priority": number; + "call": TxCallData; +}; +export type Idi2o3quauop42 = { + "id": FixedSizeBinary<32>; + "when": number; + "maybe_periodic"?: Anonymize; + "priority": number; + "call": TxCallData; +}; +export type Ie0v9n6or5lh9r = { + "after": number; + "maybe_periodic"?: Anonymize; + "priority": number; + "call": TxCallData; +}; +export type I1eosriit8hpo3 = { + "id": FixedSizeBinary<32>; + "after": number; + "maybe_periodic"?: Anonymize; + "priority": number; + "call": TxCallData; +}; +export type Idq03kcq8thgsl = AnonymousEnum<{ + "whitelist_call": Anonymize; + "remove_whitelisted_call": Anonymize; + "dispatch_whitelisted_call": Anonymize; + "dispatch_whitelisted_call_with_preimage": Anonymize; +}>; +export type I3dq5m6mb8ta46 = { + "call": TxCallData; +}; +export type I59r34240djor4 = AnonymousEnum<{ + /** + *Send a batch of dispatch calls. + * + *May be called from any origin except `None`. + * + *- `calls`: The calls to be dispatched from the same origin. The number of call must not + * exceed the constant: `batched_calls_limit` (available in constant metadata). + * + *If origin is root then the calls are dispatched without checking origin filter. (This + *includes bypassing `frame_system::Config::BaseCallFilter`). + * + *## Complexity + *- O(C) where C is the number of calls to be batched. + * + *This will return `Ok` in all circumstances. To determine the success of the batch, an + *event is deposited. If a call failed and the batch was interrupted, then the + *`BatchInterrupted` event is deposited, along with the number of successful calls made + *and the error of the failed call. If all were successful, then the `BatchCompleted` + *event is deposited. + */ + "batch": Anonymize; + /** + *Send a call through an indexed pseudonym of the sender. + * + *Filter from origin are passed along. The call will be dispatched with an origin which + *use the same filter as the origin of this call. + * + *NOTE: If you need to ensure that any account-based filtering is not honored (i.e. + *because you expect `proxy` to have been used prior in the call stack and you do not want + *the call restrictions to apply to any sub-accounts), then use `as_multi_threshold_1` + *in the Multisig pallet instead. + * + *NOTE: Prior to version *12, this was called `as_limited_sub`. + * + *The dispatch origin for this call must be _Signed_. + */ + "as_derivative": Anonymize; + /** + *Send a batch of dispatch calls and atomically execute them. + *The whole transaction will rollback and fail if any of the calls failed. + * + *May be called from any origin except `None`. + * + *- `calls`: The calls to be dispatched from the same origin. The number of call must not + * exceed the constant: `batched_calls_limit` (available in constant metadata). + * + *If origin is root then the calls are dispatched without checking origin filter. (This + *includes bypassing `frame_system::Config::BaseCallFilter`). + * + *## Complexity + *- O(C) where C is the number of calls to be batched. + */ + "batch_all": Anonymize; + /** + *Dispatches a function call with a provided origin. + * + *The dispatch origin for this call must be _Root_. + * + *## Complexity + *- O(1). + */ + "dispatch_as": Anonymize; + /** + *Send a batch of dispatch calls. + *Unlike `batch`, it allows errors and won't interrupt. + * + *May be called from any origin except `None`. + * + *- `calls`: The calls to be dispatched from the same origin. The number of call must not + * exceed the constant: `batched_calls_limit` (available in constant metadata). + * + *If origin is root then the calls are dispatch without checking origin filter. (This + *includes bypassing `frame_system::Config::BaseCallFilter`). + * + *## Complexity + *- O(C) where C is the number of calls to be batched. + */ + "force_batch": Anonymize; + /** + *Dispatch a function call with a specified weight. + * + *This function does not check the weight of the call, and instead allows the + *Root origin to specify the weight of the call. + * + *The dispatch origin for this call must be _Root_. + */ + "with_weight": Anonymize; +}>; +export type I4qgdq1nsq1ldf = { + "calls": Anonymize; +}; +export type Iavi6i18msid24 = Array; +export type Id6nml1be4ntg1 = { + "index": number; + "call": TxCallData; +}; +export type Id4coi5m2c4fbi = { + "as_origin": PolkadotRuntimeOriginCaller; + "call": TxCallData; +}; +export type Ic81m9070nb7fh = { + "call": TxCallData; + "weight": Anonymize; +}; +export type I4qsi0udulp485 = AnonymousEnum<{ + /** + *Dispatch the given `call` from an account that the sender is authorised for through + *`add_proxy`. + * + *The dispatch origin for this call must be _Signed_. + * + *Parameters: + *- `real`: The account that the proxy will make a call on behalf of. + *- `force_proxy_type`: Specify the exact proxy type to be used and checked for this call. + *- `call`: The call to be made by the `real` account. + */ + "proxy": Anonymize; + /** + *Register a proxy account for the sender that is able to make calls on its behalf. + * + *The dispatch origin for this call must be _Signed_. + * + *Parameters: + *- `proxy`: The account that the `caller` would like to make a proxy. + *- `proxy_type`: The permissions allowed for this proxy account. + *- `delay`: The announcement period required of the initial proxy. Will generally be + *zero. + */ + "add_proxy": Anonymize; + /** + *Unregister a proxy account for the sender. + * + *The dispatch origin for this call must be _Signed_. + * + *Parameters: + *- `proxy`: The account that the `caller` would like to remove as a proxy. + *- `proxy_type`: The permissions currently enabled for the removed proxy account. + */ + "remove_proxy": Anonymize; + /** + *Unregister all proxy accounts for the sender. + * + *The dispatch origin for this call must be _Signed_. + * + *WARNING: This may be called on accounts created by `pure`, however if done, then + *the unreserved fees will be inaccessible. **All access to this account will be lost.** + */ + "remove_proxies": undefined; + /** + *Spawn a fresh new account that is guaranteed to be otherwise inaccessible, and + *initialize it with a proxy of `proxy_type` for `origin` sender. + * + *Requires a `Signed` origin. + * + *- `proxy_type`: The type of the proxy that the sender will be registered as over the + *new account. This will almost always be the most permissive `ProxyType` possible to + *allow for maximum flexibility. + *- `index`: A disambiguation index, in case this is called multiple times in the same + *transaction (e.g. with `utility::batch`). Unless you're using `batch` you probably just + *want to use `0`. + *- `delay`: The announcement period required of the initial proxy. Will generally be + *zero. + * + *Fails with `Duplicate` if this has already been called in this transaction, from the + *same sender, with the same parameters. + * + *Fails if there are insufficient funds to pay for deposit. + */ + "create_pure": Anonymize; + /** + *Removes a previously spawned pure proxy. + * + *WARNING: **All access to this account will be lost.** Any funds held in it will be + *inaccessible. + * + *Requires a `Signed` origin, and the sender account must have been created by a call to + *`pure` with corresponding parameters. + * + *- `spawner`: The account that originally called `pure` to create this account. + *- `index`: The disambiguation index originally passed to `pure`. Probably `0`. + *- `proxy_type`: The proxy type originally passed to `pure`. + *- `height`: The height of the chain when the call to `pure` was processed. + *- `ext_index`: The extrinsic index in which the call to `pure` was processed. + * + *Fails with `NoPermission` in case the caller is not a previously created pure + *account whose `pure` call has corresponding parameters. + */ + "kill_pure": Anonymize; + /** + *Publish the hash of a proxy-call that will be made in the future. + * + *This must be called some number of blocks before the corresponding `proxy` is attempted + *if the delay associated with the proxy relationship is greater than zero. + * + *No more than `MaxPending` announcements may be made at any one time. + * + *This will take a deposit of `AnnouncementDepositFactor` as well as + *`AnnouncementDepositBase` if there are no other pending announcements. + * + *The dispatch origin for this call must be _Signed_ and a proxy of `real`. + * + *Parameters: + *- `real`: The account that the proxy will make a call on behalf of. + *- `call_hash`: The hash of the call to be made by the `real` account. + */ + "announce": Anonymize; + /** + *Remove a given announcement. + * + *May be called by a proxy account to remove a call they previously announced and return + *the deposit. + * + *The dispatch origin for this call must be _Signed_. + * + *Parameters: + *- `real`: The account that the proxy will make a call on behalf of. + *- `call_hash`: The hash of the call to be made by the `real` account. + */ + "remove_announcement": Anonymize; + /** + *Remove the given announcement of a delegate. + * + *May be called by a target (proxied) account to remove a call that one of their delegates + *(`delegate`) has announced they want to execute. The deposit is returned. + * + *The dispatch origin for this call must be _Signed_. + * + *Parameters: + *- `delegate`: The account that previously announced the call. + *- `call_hash`: The hash of the call to be made. + */ + "reject_announcement": Anonymize; + /** + *Dispatch the given `call` from an account that the sender is authorized for through + *`add_proxy`. + * + *Removes any corresponding announcement(s). + * + *The dispatch origin for this call must be _Signed_. + * + *Parameters: + *- `real`: The account that the proxy will make a call on behalf of. + *- `force_proxy_type`: Specify the exact proxy type to be used and checked for this call. + *- `call`: The call to be made by the `real` account. + */ + "proxy_announced": Anonymize; +}>; +export type Idpsmkk8cmveiu = { + "real": MultiAddress; + "force_proxy_type"?: Anonymize; + "call": TxCallData; +}; +export type I8nstg9vo0fosk = { + "delegate": MultiAddress; + "real": MultiAddress; + "force_proxy_type"?: Anonymize; + "call": TxCallData; +}; +export type I3qhuqfo65bjtf = AnonymousEnum<{ + /** + *Immediately dispatch a multi-signature call using a single approval from the caller. + * + *The dispatch origin for this call must be _Signed_. + * + *- `other_signatories`: The accounts (other than the sender) who are part of the + *multi-signature, but do not participate in the approval process. + *- `call`: The call to be executed. + * + *Result is equivalent to the dispatched result. + * + *## Complexity + *O(Z + C) where Z is the length of the call and C its execution weight. + */ + "as_multi_threshold_1": Anonymize; + /** + *Register approval for a dispatch to be made from a deterministic composite account if + *approved by a total of `threshold - 1` of `other_signatories`. + * + *If there are enough, then dispatch the call. + * + *Payment: `DepositBase` will be reserved if this is the first approval, plus + *`threshold` times `DepositFactor`. It is returned once this dispatch happens or + *is cancelled. + * + *The dispatch origin for this call must be _Signed_. + * + *- `threshold`: The total number of approvals for this dispatch before it is executed. + *- `other_signatories`: The accounts (other than the sender) who can approve this + *dispatch. May not be empty. + *- `maybe_timepoint`: If this is the first approval, then this must be `None`. If it is + *not the first approval, then it must be `Some`, with the timepoint (block number and + *transaction index) of the first approval transaction. + *- `call`: The call to be executed. + * + *NOTE: Unless this is the final approval, you will generally want to use + *`approve_as_multi` instead, since it only requires a hash of the call. + * + *Result is equivalent to the dispatched result if `threshold` is exactly `1`. Otherwise + *on success, result is `Ok` and the result from the interior call, if it was executed, + *may be found in the deposited `MultisigExecuted` event. + * + *## Complexity + *- `O(S + Z + Call)`. + *- Up to one balance-reserve or unreserve operation. + *- One passthrough operation, one insert, both `O(S)` where `S` is the number of + * signatories. `S` is capped by `MaxSignatories`, with weight being proportional. + *- One call encode & hash, both of complexity `O(Z)` where `Z` is tx-len. + *- One encode & hash, both of complexity `O(S)`. + *- Up to one binary search and insert (`O(logS + S)`). + *- I/O: 1 read `O(S)`, up to 1 mutate `O(S)`. Up to one remove. + *- One event. + *- The weight of the `call`. + *- Storage: inserts one item, value size bounded by `MaxSignatories`, with a deposit + * taken for its lifetime of `DepositBase + threshold * DepositFactor`. + */ + "as_multi": Anonymize; + /** + *Register approval for a dispatch to be made from a deterministic composite account if + *approved by a total of `threshold - 1` of `other_signatories`. + * + *Payment: `DepositBase` will be reserved if this is the first approval, plus + *`threshold` times `DepositFactor`. It is returned once this dispatch happens or + *is cancelled. + * + *The dispatch origin for this call must be _Signed_. + * + *- `threshold`: The total number of approvals for this dispatch before it is executed. + *- `other_signatories`: The accounts (other than the sender) who can approve this + *dispatch. May not be empty. + *- `maybe_timepoint`: If this is the first approval, then this must be `None`. If it is + *not the first approval, then it must be `Some`, with the timepoint (block number and + *transaction index) of the first approval transaction. + *- `call_hash`: The hash of the call to be executed. + * + *NOTE: If this is the final approval, you will want to use `as_multi` instead. + * + *## Complexity + *- `O(S)`. + *- Up to one balance-reserve or unreserve operation. + *- One passthrough operation, one insert, both `O(S)` where `S` is the number of + * signatories. `S` is capped by `MaxSignatories`, with weight being proportional. + *- One encode & hash, both of complexity `O(S)`. + *- Up to one binary search and insert (`O(logS + S)`). + *- I/O: 1 read `O(S)`, up to 1 mutate `O(S)`. Up to one remove. + *- One event. + *- Storage: inserts one item, value size bounded by `MaxSignatories`, with a deposit + * taken for its lifetime of `DepositBase + threshold * DepositFactor`. + */ + "approve_as_multi": Anonymize; + /** + *Cancel a pre-existing, on-going multisig transaction. Any deposit reserved previously + *for this operation will be unreserved on success. + * + *The dispatch origin for this call must be _Signed_. + * + *- `threshold`: The total number of approvals for this dispatch before it is executed. + *- `other_signatories`: The accounts (other than the sender) who can approve this + *dispatch. May not be empty. + *- `timepoint`: The timepoint (block number and transaction index) of the first approval + *transaction for this dispatch. + *- `call_hash`: The hash of the call to be executed. + * + *## Complexity + *- `O(S)`. + *- Up to one balance-reserve or unreserve operation. + *- One passthrough operation, one insert, both `O(S)` where `S` is the number of + * signatories. `S` is capped by `MaxSignatories`, with weight being proportional. + *- One encode & hash, both of complexity `O(S)`. + *- One event. + *- I/O: 1 read `O(S)`, one remove. + *- Storage: removes one item. + */ + "cancel_as_multi": Anonymize; +}>; +export type Icg17asei4oejt = { + "other_signatories": Anonymize; + "call": TxCallData; +}; +export type I4sp01qlh6rkhp = { + "threshold": number; + "other_signatories": Anonymize; + "maybe_timepoint"?: Anonymize; + "call": TxCallData; + "max_weight": Anonymize; +}; +export type I8tnfu4hpnpsg = AnonymousEnum<{ + /** + *Schedule a para to be initialized at the start of the next session. + * + *This should only be used for TESTING and not on PRODUCTION chains. It automatically + *assigns Coretime to the chain and increases the number of cores. Thus, there is no + *running coretime chain required. + */ + "sudo_schedule_para_initialize": Anonymize; + /** + *Schedule a para to be cleaned up at the start of the next session. + */ + "sudo_schedule_para_cleanup": Anonymize; + /** + *Upgrade a parathread (on-demand parachain) to a lease holding parachain + */ + "sudo_schedule_parathread_upgrade": Anonymize; + /** + *Downgrade a lease holding parachain to an on-demand parachain + */ + "sudo_schedule_parachain_downgrade": Anonymize; + /** + *Send a downward XCM to the given para. + * + *The given parachain should exist and the payload should not exceed the preconfigured + *size `config.max_downward_message_size`. + */ + "sudo_queue_downward_xcm": Anonymize; + /** + *Forcefully establish a channel from the sender to the recipient. + * + *This is equivalent to sending an `Hrmp::hrmp_init_open_channel` extrinsic followed by + *`Hrmp::hrmp_accept_open_channel`. + */ + "sudo_establish_hrmp_channel": Anonymize; +}>; +export type I9geq5evbpu4im = { + "id": number; + "genesis": Anonymize; +}; +export type I7mlkc61s5tj4l = { + "id": number; + "xcm": DotXcmVersionedXcm; +}; +export type I9s1em4tt8ni1d = AnonymousEnum<{ + /** + *Authenticates the sudo key and dispatches a function call with `Root` origin. + */ + "sudo": Anonymize; + /** + *Authenticates the sudo key and dispatches a function call with `Root` origin. + *This function does not check the weight of the call, and instead allows the + *Sudo user to specify the weight of the call. + * + *The dispatch origin for this call must be _Signed_. + */ + "sudo_unchecked_weight": Anonymize; + /** + *Authenticates the current sudo key and sets the given AccountId (`new`) as the new sudo + *key. + */ + "set_key": Anonymize; + /** + *Authenticates the sudo key and dispatches a function call with `Signed` origin from + *a given account. + * + *The dispatch origin for this call must be _Signed_. + */ + "sudo_as": Anonymize; + /** + *Permanently removes the sudo key. + * + ***This cannot be un-done.** + */ + "remove_key": undefined; +}>; +export type I8k3rnvpeeh4hv = { + "new": MultiAddress; +}; +export type Id3ingc7s7iq1i = { + "who": MultiAddress; + "call": TxCallData; +}; +export type Ikgci99ap0ffp = ResultPayload, TransactionValidityError>; +export type Ibqu3kf8ifskue = AnonymousEnum<{ + "System": Anonymize; + "Scheduler": Anonymize; + "Preimage": Anonymize; + "Babe": Anonymize; + "Timestamp": Anonymize; + "Indices": Anonymize; + "Balances": Anonymize; + "Staking": Anonymize; + "Session": Anonymize; + "Grandpa": Anonymize; + "Treasury": Anonymize; + "ConvictionVoting": Anonymize; + "Referenda": Anonymize; + "Whitelist": Anonymize; + "Parameters": Anonymize; + "Claims": Anonymize; + "Vesting": Anonymize; + "Utility": Anonymize; + "Proxy": Anonymize; + "Multisig": Anonymize; + "Bounties": Anonymize; + "ChildBounties": Anonymize; + "ElectionProviderMultiPhase": Anonymize; + "VoterList": Anonymize; + "NominationPools": Anonymize; + "FastUnstake": Anonymize; + "Configuration": Anonymize; + "ParasShared": undefined; + "ParaInclusion": undefined; + "ParaInherent": Anonymize; + "Paras": Anonymize; + "Initializer": Anonymize; + "Hrmp": Anonymize; + "ParasDisputes": Anonymize; + "ParasSlashing": Anonymize; + "OnDemand": Anonymize; + "Registrar": Anonymize; + "Slots": Anonymize; + "Auctions": Anonymize; + "Crowdloan": Anonymize; + "Coretime": Anonymize; + "StateTrieMigration": Anonymize; + "XcmPallet": Anonymize; + "MessageQueue": Anonymize; + "AssetRate": Anonymize; + "Beefy": Anonymize; + "ParaSudoWrapper": Anonymize; + "Sudo": Anonymize; +}>; +export type I399nsqbaqlr2u = ResultPayload, Anonymize>; +export type Ieitu6hgbj97ka = { + "execution_result": Anonymize; + "emitted_events": Anonymize; + "local_xcm"?: Anonymize; + "forwarded_xcms": Anonymize; +}; +export type I51kiaatnj3hin = Array>; +export type Ib0m46eqe594fl = ResultPayload, Anonymize>; +export type I9mfrpc3781h8d = { + "execution_result": XcmV4TraitsOutcome; + "emitted_events": Anonymize; + "forwarded_xcms": Anonymize; +}; +export type I7l46q2pu39ff3 = Array>; +export type I2qolcj0rca7pb = { + "phase": Phase; + "event": Anonymize; + "topics": Anonymize; +}; +export type I5ndpakc7tptdv = AnonymousEnum<{ + "System": Anonymize; + "Indices": Anonymize; + "Balances": Anonymize; + "TransactionPayment": TransactionPaymentEvent; + "Staking": Anonymize; + "Offences": OffencesEvent; + "Historical": Anonymize; + "Parameters": Anonymize; + "Session": Anonymize; + "Grandpa": GrandpaEvent; + "Utility": Anonymize; + "Identity": Anonymize; + "Recovery": Anonymize; + "Vesting": Anonymize; + "Scheduler": Anonymize; + "Preimage": PreimageEvent; + "Sudo": Anonymize; + "Proxy": Anonymize; + "Multisig": Anonymize; + "ElectionProviderMultiPhase": ElectionProviderMultiPhaseEvent; + "VoterList": BagsListEvent; + "NominationPools": Anonymize; + "FastUnstake": Anonymize; + "ConvictionVoting": Anonymize; + "Referenda": Anonymize; + "Whitelist": Anonymize; + "Treasury": Anonymize; + "DelegatedStaking": Anonymize; + "ParaInclusion": Anonymize; + "Paras": Anonymize; + "Hrmp": ParachainsHrmpEvent; + "ParasDisputes": ParachainsDisputesEvent; + "OnDemandAssignmentProvider": Anonymize; + "Registrar": CommonParasRegistrarEvent; + "Slots": CommonSlotsEvent; + "Auctions": CommonAuctionsEvent; + "Crowdloan": Anonymize; + "AssignedSlots": PolkadotRuntimeCommonAssignedSlotsEvent; + "Coretime": PolkadotRuntimeParachainsCoretimeEvent; + "StakingAhClient": Anonymize; + "MultiBlockMigrations": Anonymize; + "XcmPallet": Anonymize; + "MessageQueue": Anonymize; + "AssetRate": Anonymize; + "RootTesting": RootTestingEvent; + "MetaTx": Anonymize; + "IdentityMigrator": PolkadotRuntimeCommonIdentityMigratorEvent; +}>; +export type I4q7rpic4ibjpj = AnonymousEnum<{ + /** + *An extrinsic completed successfully. + */ + "ExtrinsicSuccess": Anonymize; + /** + *An extrinsic failed. + */ + "ExtrinsicFailed": Anonymize; + /** + *`:code` was updated. + */ + "CodeUpdated": undefined; + /** + *A new account was created. + */ + "NewAccount": Anonymize; + /** + *An account was reaped. + */ + "KilledAccount": Anonymize; + /** + *On on-chain remark happened. + */ + "Remarked": Anonymize; + /** + *An upgrade was authorized. + */ + "UpgradeAuthorized": Anonymize; + /** + *An invalid authorized upgrade was rejected while trying to apply it. + */ + "RejectedInvalidAuthorizedUpgrade": Anonymize; +}>; +export type Iab150pc00u513 = { + "dispatch_error": Anonymize; + "dispatch_info": Anonymize; +}; +export type Icrp2r0j3sbgko = AnonymousEnum<{ + "Other": undefined; + "CannotLookup": undefined; + "BadOrigin": undefined; + "Module": Anonymize; + "ConsumerRemaining": undefined; + "NoProviders": undefined; + "TooManyConsumers": undefined; + "Token": TokenError; + "Arithmetic": ArithmeticError; + "Transactional": TransactionalError; + "Exhausted": undefined; + "Corruption": undefined; + "Unavailable": undefined; + "RootNotAllowed": undefined; + "Trie": Anonymize; +}>; +export type I1v7k93qqf04mq = AnonymousEnum<{ + "System": Anonymize; + "Babe": Anonymize; + "Timestamp": undefined; + "Indices": Anonymize; + "Balances": Anonymize; + "TransactionPayment": undefined; + "Authorship": undefined; + "Staking": Anonymize; + "Offences": undefined; + "Historical": undefined; + "Parameters": undefined; + "Session": Anonymize; + "Grandpa": Anonymize; + "AuthorityDiscovery": undefined; + "Utility": Anonymize; + "Identity": Anonymize; + "Recovery": Anonymize; + "Vesting": Anonymize; + "Scheduler": Anonymize; + "Preimage": Anonymize; + "Sudo": Anonymize; + "Proxy": Anonymize; + "Multisig": Anonymize; + "ElectionProviderMultiPhase": Anonymize; + "VoterList": Anonymize; + "NominationPools": Anonymize; + "FastUnstake": Anonymize; + "ConvictionVoting": Anonymize; + "Referenda": Anonymize; + "Origins": undefined; + "Whitelist": Anonymize; + "Treasury": Anonymize; + "DelegatedStaking": Anonymize; + "ParachainsOrigin": undefined; + "Configuration": Anonymize; + "ParasShared": undefined; + "ParaInclusion": Anonymize; + "ParaInherent": Anonymize; + "ParaScheduler": undefined; + "Paras": Anonymize; + "Initializer": undefined; + "Dmp": undefined; + "Hrmp": Anonymize; + "ParaSessionInfo": undefined; + "ParasDisputes": Anonymize; + "ParasSlashing": Anonymize; + "OnDemandAssignmentProvider": Anonymize; + "CoretimeAssignmentProvider": Anonymize; + "Registrar": Anonymize; + "Slots": Anonymize; + "ParasSudoWrapper": Anonymize; + "Auctions": Anonymize; + "Crowdloan": Anonymize; + "AssignedSlots": Anonymize; + "Coretime": Anonymize; + "StakingAhClient": Anonymize; + "MultiBlockMigrations": Anonymize; + "XcmPallet": Anonymize; + "MessageQueue": Anonymize; + "AssetRate": Anonymize; + "RootTesting": undefined; + "MetaTx": Anonymize; + "VerifySignature": undefined; + "Beefy": Anonymize; + "Mmr": undefined; + "BeefyMmrLeaf": undefined; + "IdentityMigrator": undefined; +}>; +export type Ileu8a8k5fbnr = AnonymousEnum<{ + /** + *Not a controller account. + */ + "NotController": undefined; + /** + *Not a stash account. + */ + "NotStash": undefined; + /** + *Stash is already bonded. + */ + "AlreadyBonded": undefined; + /** + *Controller is already paired. + */ + "AlreadyPaired": undefined; + /** + *Targets cannot be empty. + */ + "EmptyTargets": undefined; + /** + *Duplicate index. + */ + "DuplicateIndex": undefined; + /** + *Slash record index out of bounds. + */ + "InvalidSlashIndex": undefined; + /** + *Cannot have a validator or nominator role, with value less than the minimum defined by + *governance (see `MinValidatorBond` and `MinNominatorBond`). If unbonding is the + *intention, `chill` first to remove one's role as validator/nominator. + */ + "InsufficientBond": undefined; + /** + *Can not schedule more unlock chunks. + */ + "NoMoreChunks": undefined; + /** + *Can not rebond without unlocking chunks. + */ + "NoUnlockChunk": undefined; + /** + *Attempting to target a stash that still has funds. + */ + "FundedTarget": undefined; + /** + *Invalid era to reward. + */ + "InvalidEraToReward": undefined; + /** + *Invalid number of nominations. + */ + "InvalidNumberOfNominations": undefined; + /** + *Items are not sorted and unique. + */ + "NotSortedAndUnique": undefined; + /** + *Rewards for this era have already been claimed for this validator. + */ + "AlreadyClaimed": undefined; + /** + *No nominators exist on this page. + */ + "InvalidPage": undefined; + /** + *Incorrect previous history depth input provided. + */ + "IncorrectHistoryDepth": undefined; + /** + *Incorrect number of slashing spans provided. + */ + "IncorrectSlashingSpans": undefined; + /** + *Internal state has become somehow corrupted and the operation cannot continue. + */ + "BadState": undefined; + /** + *Too many nomination targets supplied. + */ + "TooManyTargets": undefined; + /** + *A nomination target was supplied that was blocked or otherwise not a validator. + */ + "BadTarget": undefined; + /** + *The user has enough bond and thus cannot be chilled forcefully by an external person. + */ + "CannotChillOther": undefined; + /** + *There are too many nominators in the system. Governance needs to adjust the staking + *settings to keep things safe for the runtime. + */ + "TooManyNominators": undefined; + /** + *There are too many validator candidates in the system. Governance needs to adjust the + *staking settings to keep things safe for the runtime. + */ + "TooManyValidators": undefined; + /** + *Commission is too low. Must be at least `MinCommission`. + */ + "CommissionTooLow": undefined; + /** + *Some bound is not met. + */ + "BoundNotMet": undefined; + /** + *Used when attempting to use deprecated controller account logic. + */ + "ControllerDeprecated": undefined; + /** + *Cannot reset a ledger. + */ + "CannotRestoreLedger": undefined; + /** + *Provided reward destination is not allowed. + */ + "RewardDestinationRestricted": undefined; + /** + *Not enough funds available to withdraw. + */ + "NotEnoughFunds": undefined; + /** + *Operation not allowed for virtual stakers. + */ + "VirtualStakerNotAllowed": undefined; + /** + *Stash could not be reaped as other pallet might depend on it. + */ + "CannotReapStash": undefined; + /** + *The stake of this account is already migrated to `Fungible` holds. + */ + "AlreadyMigrated": undefined; + /** + *Account is restricted from participation in staking. This may happen if the account is + *staking in another way already, such as via pool. + */ + "Restricted": undefined; +}>; +export type Ib8gja1crqq8kd = AnonymousEnum<{ + /** + *Too many subs-accounts. + */ + "TooManySubAccounts": undefined; + /** + *Account isn't found. + */ + "NotFound": undefined; + /** + *Account isn't named. + */ + "NotNamed": undefined; + /** + *Empty index. + */ + "EmptyIndex": undefined; + /** + *Fee is changed. + */ + "FeeChanged": undefined; + /** + *No identity found. + */ + "NoIdentity": undefined; + /** + *Sticky judgement. + */ + "StickyJudgement": undefined; + /** + *Judgement given. + */ + "JudgementGiven": undefined; + /** + *Invalid judgement. + */ + "InvalidJudgement": undefined; + /** + *The index is invalid. + */ + "InvalidIndex": undefined; + /** + *The target is invalid. + */ + "InvalidTarget": undefined; + /** + *Maximum amount of registrars reached. Cannot add any more. + */ + "TooManyRegistrars": undefined; + /** + *Account ID is already named. + */ + "AlreadyClaimed": undefined; + /** + *Sender is not a sub-account. + */ + "NotSub": undefined; + /** + *Sub-account isn't owned by sender. + */ + "NotOwned": undefined; + /** + *The provided judgement was for a different identity. + */ + "JudgementForDifferentIdentity": undefined; + /** + *Error that occurs when there is an issue paying for judgement. + */ + "JudgementPaymentFailed": undefined; + /** + *The provided suffix is too long. + */ + "InvalidSuffix": undefined; + /** + *The sender does not have permission to issue a username. + */ + "NotUsernameAuthority": undefined; + /** + *The authority cannot allocate any more usernames. + */ + "NoAllocation": undefined; + /** + *The signature on a username was not valid. + */ + "InvalidSignature": undefined; + /** + *Setting this username requires a signature, but none was provided. + */ + "RequiresSignature": undefined; + /** + *The username does not meet the requirements. + */ + "InvalidUsername": undefined; + /** + *The username is already taken. + */ + "UsernameTaken": undefined; + /** + *The requested username does not exist. + */ + "NoUsername": undefined; + /** + *The username cannot be forcefully removed because it can still be accepted. + */ + "NotExpired": undefined; + /** + *The username cannot be removed because it's still in the grace period. + */ + "TooEarly": undefined; + /** + *The username cannot be removed because it is not unbinding. + */ + "NotUnbinding": undefined; + /** + *The username cannot be unbound because it is already unbinding. + */ + "AlreadyUnbinding": undefined; + /** + *The action cannot be performed because of insufficient privileges (e.g. authority + *trying to unbind a username provided by the system). + */ + "InsufficientPrivileges": undefined; +}>; +export type I4cfhml1prt4lu = AnonymousEnum<{ + /** + *Preimage is too large to store on-chain. + */ + "TooBig": undefined; + /** + *Preimage has already been noted on-chain. + */ + "AlreadyNoted": undefined; + /** + *The user is not authorized to perform this action. + */ + "NotAuthorized": undefined; + /** + *The preimage cannot be removed since it has not yet been noted. + */ + "NotNoted": undefined; + /** + *A preimage may not be removed when there are outstanding requests. + */ + "Requested": undefined; + /** + *The preimage request cannot be removed since no outstanding requests exist. + */ + "NotRequested": undefined; + /** + *More than `MAX_HASH_UPGRADE_BULK_COUNT` hashes were requested to be upgraded at once. + */ + "TooMany": undefined; + /** + *Too few hashes were requested to be upgraded (i.e. zero). + */ + "TooFew": undefined; +}>; +export type I2e4fekrkcdej2 = AnonymousEnum<{ + /** + *A error in the list interface implementation. + */ + "List": Anonymize; + /** + *Could not update a node, because the pallet is locked. + */ + "Locked": undefined; +}>; +export type Ictkqqlhdjt761 = AnonymousEnum<{ + "Duplicate": undefined; + "NotHeavier": undefined; + "NotInSameBag": undefined; + "NodeNotFound": undefined; + "Locked": undefined; +}>; +export type Iuudu4kursojc = AnonymousEnum<{ + /** + *A (bonded) pool id does not exist. + */ + "PoolNotFound": undefined; + /** + *An account is not a member. + */ + "PoolMemberNotFound": undefined; + /** + *A reward pool does not exist. In all cases this is a system logic error. + */ + "RewardPoolNotFound": undefined; + /** + *A sub pool does not exist. + */ + "SubPoolsNotFound": undefined; + /** + *An account is already delegating in another pool. An account may only belong to one + *pool at a time. + */ + "AccountBelongsToOtherPool": undefined; + /** + *The member is fully unbonded (and thus cannot access the bonded and reward pool + *anymore to, for example, collect rewards). + */ + "FullyUnbonding": undefined; + /** + *The member cannot unbond further chunks due to reaching the limit. + */ + "MaxUnbondingLimit": undefined; + /** + *None of the funds can be withdrawn yet because the bonding duration has not passed. + */ + "CannotWithdrawAny": undefined; + /** + *The amount does not meet the minimum bond to either join or create a pool. + * + *The depositor can never unbond to a value less than `Pallet::depositor_min_bond`. The + *caller does not have nominating permissions for the pool. Members can never unbond to a + *value below `MinJoinBond`. + */ + "MinimumBondNotMet": undefined; + /** + *The transaction could not be executed due to overflow risk for the pool. + */ + "OverflowRisk": undefined; + /** + *A pool must be in [`PoolState::Destroying`] in order for the depositor to unbond or for + *other members to be permissionlessly unbonded. + */ + "NotDestroying": undefined; + /** + *The caller does not have nominating permissions for the pool. + */ + "NotNominator": undefined; + /** + *Either a) the caller cannot make a valid kick or b) the pool is not destroying. + */ + "NotKickerOrDestroying": undefined; + /** + *The pool is not open to join + */ + "NotOpen": undefined; + /** + *The system is maxed out on pools. + */ + "MaxPools": undefined; + /** + *Too many members in the pool or system. + */ + "MaxPoolMembers": undefined; + /** + *The pools state cannot be changed. + */ + "CanNotChangeState": undefined; + /** + *The caller does not have adequate permissions. + */ + "DoesNotHavePermission": undefined; + /** + *Metadata exceeds [`Config::MaxMetadataLen`] + */ + "MetadataExceedsMaxLen": undefined; + /** + *Some error occurred that should never happen. This should be reported to the + *maintainers. + */ + "Defensive": Anonymize; + /** + *Partial unbonding now allowed permissionlessly. + */ + "PartialUnbondNotAllowedPermissionlessly": undefined; + /** + *The pool's max commission cannot be set higher than the existing value. + */ + "MaxCommissionRestricted": undefined; + /** + *The supplied commission exceeds the max allowed commission. + */ + "CommissionExceedsMaximum": undefined; + /** + *The supplied commission exceeds global maximum commission. + */ + "CommissionExceedsGlobalMaximum": undefined; + /** + *Not enough blocks have surpassed since the last commission update. + */ + "CommissionChangeThrottled": undefined; + /** + *The submitted changes to commission change rate are not allowed. + */ + "CommissionChangeRateNotAllowed": undefined; + /** + *There is no pending commission to claim. + */ + "NoPendingCommission": undefined; + /** + *No commission current has been set. + */ + "NoCommissionCurrentSet": undefined; + /** + *Pool id currently in use. + */ + "PoolIdInUse": undefined; + /** + *Pool id provided is not correct/usable. + */ + "InvalidPoolId": undefined; + /** + *Bonding extra is restricted to the exact pending reward amount. + */ + "BondExtraRestricted": undefined; + /** + *No imbalance in the ED deposit for the pool. + */ + "NothingToAdjust": undefined; + /** + *No slash pending that can be applied to the member. + */ + "NothingToSlash": undefined; + /** + *The slash amount is too low to be applied. + */ + "SlashTooLow": undefined; + /** + *The pool or member delegation has already migrated to delegate stake. + */ + "AlreadyMigrated": undefined; + /** + *The pool or member delegation has not migrated yet to delegate stake. + */ + "NotMigrated": undefined; + /** + *This call is not allowed in the current state of the pallet. + */ + "NotSupported": undefined; + /** + *Account is restricted from participation in pools. This may happen if the account is + *staking in another way already. + */ + "Restricted": undefined; +}>; +export type Iaogv3iimefnis = AnonymousEnum<{ + /** + *The account cannot perform this operation. + */ + "NotAllowed": undefined; + /** + *An existing staker cannot perform this action. + */ + "AlreadyStaking": undefined; + /** + *Reward Destination cannot be same as `Agent` account. + */ + "InvalidRewardDestination": undefined; + /** + *Delegation conditions are not met. + * + *Possible issues are + *1) Cannot delegate to self, + *2) Cannot delegate to multiple delegates. + */ + "InvalidDelegation": undefined; + /** + *The account does not have enough funds to perform the operation. + */ + "NotEnoughFunds": undefined; + /** + *Not an existing `Agent` account. + */ + "NotAgent": undefined; + /** + *Not a Delegator account. + */ + "NotDelegator": undefined; + /** + *Some corruption in internal state. + */ + "BadState": undefined; + /** + *Unapplied pending slash restricts operation on `Agent`. + */ + "UnappliedSlash": undefined; + /** + *`Agent` has no pending slash to be applied. + */ + "NothingToSlash": undefined; + /** + *Failed to withdraw amount from Core Staking. + */ + "WithdrawFailed": undefined; + /** + *Operation not supported by this pallet. + */ + "NotSupported": undefined; +}>; +export type I4rrcn97hglfls = AnonymousEnum<{ + /** + *Validator index out of bounds. + */ + "ValidatorIndexOutOfBounds": undefined; + /** + *Candidate submitted but para not scheduled. + */ + "UnscheduledCandidate": undefined; + /** + *Head data exceeds the configured maximum. + */ + "HeadDataTooLarge": undefined; + /** + *Code upgrade prematurely. + */ + "PrematureCodeUpgrade": undefined; + /** + *Output code is too large + */ + "NewCodeTooLarge": undefined; + /** + *The candidate's relay-parent was not allowed. Either it was + *not recent enough or it didn't advance based on the last parachain block. + */ + "DisallowedRelayParent": undefined; + /** + *Failed to compute group index for the core: either it's out of bounds + *or the relay parent doesn't belong to the current session. + */ + "InvalidAssignment": undefined; + /** + *Invalid group index in core assignment. + */ + "InvalidGroupIndex": undefined; + /** + *Insufficient (non-majority) backing. + */ + "InsufficientBacking": undefined; + /** + *Invalid (bad signature, unknown validator, etc.) backing. + */ + "InvalidBacking": undefined; + /** + *The validation data hash does not match expected. + */ + "ValidationDataHashMismatch": undefined; + /** + *The downward message queue is not processed correctly. + */ + "IncorrectDownwardMessageHandling": undefined; + /** + *At least one upward message sent does not pass the acceptance criteria. + */ + "InvalidUpwardMessages": undefined; + /** + *The candidate didn't follow the rules of HRMP watermark advancement. + */ + "HrmpWatermarkMishandling": undefined; + /** + *The HRMP messages sent by the candidate is not valid. + */ + "InvalidOutboundHrmp": undefined; + /** + *The validation code hash of the candidate is not valid. + */ + "InvalidValidationCodeHash": undefined; + /** + *The `para_head` hash in the candidate descriptor doesn't match the hash of the actual + *para head in the commitments. + */ + "ParaHeadMismatch": undefined; +}>; +export type I2g8k20rpkqcs4 = AnonymousEnum<{ + /** + *Inclusion inherent called more than once per block. + */ + "TooManyInclusionInherents": undefined; + /** + *The hash of the submitted parent header doesn't correspond to the saved block hash of + *the parent. + */ + "InvalidParentHeader": undefined; + /** + *Inherent data was filtered during execution. This should have only been done + *during creation. + */ + "InherentDataFilteredDuringExecution": undefined; + /** + *Too many candidates supplied. + */ + "UnscheduledCandidate": undefined; +}>; +export type I5odm90qsq75h7 = AnonymousEnum<{ + /** + *Para is not registered in our system. + */ + "NotRegistered": undefined; + /** + *Para cannot be onboarded because it is already tracked by our system. + */ + "CannotOnboard": undefined; + /** + *Para cannot be offboarded at this time. + */ + "CannotOffboard": undefined; + /** + *Para cannot be upgraded to a lease holding parachain. + */ + "CannotUpgrade": undefined; + /** + *Para cannot be downgraded to an on-demand parachain. + */ + "CannotDowngrade": undefined; + /** + *The statement for PVF pre-checking is stale. + */ + "PvfCheckStatementStale": undefined; + /** + *The statement for PVF pre-checking is for a future session. + */ + "PvfCheckStatementFuture": undefined; + /** + *Claimed validator index is out of bounds. + */ + "PvfCheckValidatorIndexOutOfBounds": undefined; + /** + *The signature for the PVF pre-checking is invalid. + */ + "PvfCheckInvalidSignature": undefined; + /** + *The given validator already has cast a vote. + */ + "PvfCheckDoubleVote": undefined; + /** + *The given PVF does not exist at the moment of process a vote. + */ + "PvfCheckSubjectInvalid": undefined; + /** + *Parachain cannot currently schedule a code upgrade. + */ + "CannotUpgradeCode": undefined; + /** + *Invalid validation code size. + */ + "InvalidCode": undefined; + /** + *No upgrade authorized. + */ + "NothingAuthorized": undefined; + /** + *The submitted code is not authorized. + */ + "Unauthorized": undefined; + /** + *Invalid block number. + */ + "InvalidBlockNumber": undefined; +}>; +export type I48hdahgqa1mcd = AnonymousEnum<{ + /** + *The order queue is full, `place_order` will not continue. + */ + "QueueFull": undefined; + /** + *The current spot price is higher than the max amount specified in the `place_order` + *call, making it invalid. + */ + "SpotPriceHigherThanMaxAmount": undefined; + /** + *The account doesn't have enough credits to purchase on-demand coretime. + */ + "InsufficientCredits": undefined; +}>; +export type I2mjnb5vgujeqj = AnonymousEnum<{ + "AssignmentsEmpty": undefined; + /** + *assign_core is only allowed to append new assignments at the end of already existing + *ones or update the last entry. + */ + "DisallowedInsert": undefined; +}>; +export type I5lft3p1jlcar1 = AnonymousEnum<{ + /** + *The specified parachain is not registered. + */ + "ParaDoesntExist": undefined; + /** + *The specified parachain is already registered. + */ + "ParaAlreadyExists": undefined; + /** + *A DMP message couldn't be sent because it exceeds the maximum size allowed for a + *downward message. + */ + "ExceedsMaxMessageSize": undefined; + /** + *A DMP message couldn't be sent because the destination is unreachable. + */ + "Unroutable": undefined; + /** + *Could not schedule para cleanup. + */ + "CouldntCleanup": undefined; + /** + *Not a parathread (on-demand parachain). + */ + "NotParathread": undefined; + /** + *Not a lease holding parachain. + */ + "NotParachain": undefined; + /** + *Cannot upgrade on-demand parachain to lease holding parachain. + */ + "CannotUpgrade": undefined; + /** + *Cannot downgrade lease holding parachain to on-demand. + */ + "CannotDowngrade": undefined; + /** + *There are more cores than supported by the runtime. + */ + "TooManyCores": undefined; +}>; +export type I40te5bcfc046n = AnonymousEnum<{ + /** + *The specified parachain is not registered. + */ + "ParaDoesntExist": undefined; + /** + *Not a parathread (on-demand parachain). + */ + "NotParathread": undefined; + /** + *Cannot upgrade on-demand parachain to lease holding + *parachain. + */ + "CannotUpgrade": undefined; + /** + *Cannot downgrade lease holding parachain to + *on-demand. + */ + "CannotDowngrade": undefined; + /** + *Permanent or Temporary slot already assigned. + */ + "SlotAlreadyAssigned": undefined; + /** + *Permanent or Temporary slot has not been assigned. + */ + "SlotNotAssigned": undefined; + /** + *An ongoing lease already exists. + */ + "OngoingLeaseExists": undefined; + "MaxPermanentSlotsExceeded": undefined; + "MaxTemporarySlotsExceeded": undefined; +}>; +export type I45or3o7sshpv4 = AnonymousEnum<{ + /** + *Could not process incoming message because incoming messages are blocked. + */ + "Blocked": undefined; +}>; +export type Iaaqq5jevtahm8 = AnonymousEnum<{ + /** + *The operation cannot complete since some MBMs are ongoing. + */ + "Ongoing": undefined; +}>; +export type I4vcvo9od6afmt = AnonymousEnum<{ + /** + *The desired destination was unreachable, generally because there is a no way of routing + *to it. + */ + "Unreachable": undefined; + /** + *There was some other issue (i.e. not to do with routing) in sending the message. + *Perhaps a lack of space for buffering the message. + */ + "SendFailure": undefined; + /** + *The message execution fails the filter. + */ + "Filtered": undefined; + /** + *The message's weight could not be determined. + */ + "UnweighableMessage": undefined; + /** + *The destination `Location` provided cannot be inverted. + */ + "DestinationNotInvertible": undefined; + /** + *The assets to be sent are empty. + */ + "Empty": undefined; + /** + *Could not re-anchor the assets to declare the fees for the destination chain. + */ + "CannotReanchor": undefined; + /** + *Too many assets have been attempted for transfer. + */ + "TooManyAssets": undefined; + /** + *Origin is invalid for sending. + */ + "InvalidOrigin": undefined; + /** + *The version of the `Versioned` value used is not able to be interpreted. + */ + "BadVersion": undefined; + /** + *The given location could not be used (e.g. because it cannot be expressed in the + *desired version of XCM). + */ + "BadLocation": undefined; + /** + *The referenced subscription could not be found. + */ + "NoSubscription": undefined; + /** + *The location is invalid since it already has a subscription from us. + */ + "AlreadySubscribed": undefined; + /** + *Could not check-out the assets for teleportation to the destination chain. + */ + "CannotCheckOutTeleport": undefined; + /** + *The owner does not own (all) of the asset that they wish to do the operation on. + */ + "LowBalance": undefined; + /** + *The asset owner has too many locks on the asset. + */ + "TooManyLocks": undefined; + /** + *The given account is not an identifiable sovereign account for any location. + */ + "AccountNotSovereign": undefined; + /** + *The operation required fees to be paid which the initiator could not meet. + */ + "FeesNotMet": undefined; + /** + *A remote lock with the corresponding data could not be found. + */ + "LockNotFound": undefined; + /** + *The unlock operation cannot succeed because there are still consumers of the lock. + */ + "InUse": undefined; + /** + *Invalid asset, reserve chain could not be determined for it. + */ + "InvalidAssetUnknownReserve": undefined; + /** + *Invalid asset, do not support remote asset reserves with different fees reserves. + */ + "InvalidAssetUnsupportedReserve": undefined; + /** + *Too many assets with different reserve locations have been attempted for transfer. + */ + "TooManyReserves": undefined; + /** + *Local XCM execution incomplete. + */ + "LocalExecutionIncomplete": undefined; + /** + *Too many locations authorized to alias origin. + */ + "TooManyAuthorizedAliases": undefined; + /** + *Expiry block number is in the past. + */ + "ExpiresInPast": undefined; + /** + *The alias to remove authorization for was not found. + */ + "AliasNotFound": undefined; + /** + *Local XCM execution incomplete with the actual XCM error and the index of the + *instruction that caused the error. + */ + "LocalExecutionIncompleteWithError": Anonymize; +}>; +export type I5r8t4iaend96p = { + "index": number; + "error": Anonymize; +}; +export type Ieb33ohan6vr49 = AnonymousEnum<{ + "Overflow": undefined; + "Unimplemented": undefined; + "UntrustedReserveLocation": undefined; + "UntrustedTeleportLocation": undefined; + "LocationFull": undefined; + "LocationNotInvertible": undefined; + "BadOrigin": undefined; + "InvalidLocation": undefined; + "AssetNotFound": undefined; + "FailedToTransactAsset": undefined; + "NotWithdrawable": undefined; + "LocationCannotHold": undefined; + "ExceedsMaxMessageSize": undefined; + "DestinationUnsupported": undefined; + "Transport": undefined; + "Unroutable": undefined; + "UnknownClaim": undefined; + "FailedToDecode": undefined; + "MaxWeightInvalid": undefined; + "NotHoldingFees": undefined; + "TooExpensive": undefined; + "Trap": undefined; + "ExpectationFalse": undefined; + "PalletNotFound": undefined; + "NameMismatch": undefined; + "VersionIncompatible": undefined; + "HoldingWouldOverflow": undefined; + "ExportError": undefined; + "ReanchorFailed": undefined; + "NoDeal": undefined; + "FeesNotMet": undefined; + "LockError": undefined; + "NoPermission": undefined; + "Unanchored": undefined; + "NotDepositable": undefined; + "TooManyAssets": undefined; + "UnhandledXcmVersion": undefined; + "WeightLimitReached": undefined; + "Barrier": undefined; + "WeightNotComputable": undefined; + "ExceedsStackLimit": undefined; +}>; +export type I8436figeoo3ti = AnonymousEnum<{ + /** + *Invalid proof (e.g. signature). + */ + "BadProof": undefined; + /** + *The meta transaction is not yet valid (e.g. nonce too high). + */ + "Future": undefined; + /** + *The meta transaction is outdated (e.g. nonce too low). + */ + "Stale": undefined; + /** + *The meta transactions's birth block is ancient. + */ + "AncientBirthBlock": undefined; + /** + *The transaction extension did not authorize any origin. + */ + "UnknownOrigin": undefined; + /** + *The meta transaction is invalid. + */ + "Invalid": undefined; +}>; +export type Iflve6qd33ah68 = AnonymousEnum<{ + /** + *A key ownership proof provided as part of an equivocation report is invalid. + */ + "InvalidKeyOwnershipProof": undefined; + /** + *A double voting proof provided as part of an equivocation report is invalid. + */ + "InvalidDoubleVotingProof": undefined; + /** + *A fork voting proof provided as part of an equivocation report is invalid. + */ + "InvalidForkVotingProof": undefined; + /** + *A future block voting proof provided as part of an equivocation report is invalid. + */ + "InvalidFutureBlockVotingProof": undefined; + /** + *The session of the equivocation proof is invalid + */ + "InvalidEquivocationProofSession": undefined; + /** + *A given equivocation report is valid but already previously reported. + */ + "DuplicateOffenceReport": undefined; + /** + *Submitted configuration is invalid. + */ + "InvalidConfiguration": undefined; +}>; +export type Idh4cj79bvroj8 = AnonymousEnum<{ + "InvalidStateRoot": undefined; + "IncompleteDatabase": undefined; + "ValueAtIncompleteKey": undefined; + "DecoderError": undefined; + "InvalidHash": undefined; + "DuplicateKey": undefined; + "ExtraneousNode": undefined; + "ExtraneousValue": undefined; + "ExtraneousHashReference": undefined; + "InvalidChildReference": undefined; + "ValueMismatch": undefined; + "IncompleteProof": undefined; + "RootMismatch": undefined; + "DecodeError": undefined; +}>; +export type I9ol0kobt15obh = { + "code_hash": FixedSizeBinary<32>; + "error": Anonymize; +}; +export type I2pejk6do5vg4t = AnonymousEnum<{ + /** + *A account index was assigned. + */ + "IndexAssigned": Anonymize; + /** + *A account index has been freed up (unassigned). + */ + "IndexFreed": Anonymize; + /** + *A account index has been frozen to its current account ID. + */ + "IndexFrozen": Anonymize; + /** + *A deposit to reserve an index has been poked/reconsidered. + */ + "DepositPoked": Anonymize; +}>; +export type Ic9g5lvl9iddc5 = { + "who": SS58String; + "index": number; + "old_deposit": bigint; + "new_deposit": bigint; +}; +export type I8n4qjnlkvth8n = AnonymousEnum<{ + /** + *The era payout has been set; the first balance is the validator-payout; the second is + *the remainder from the maximum amount of reward. + */ + "EraPaid": Anonymize; + /** + *The nominator has been rewarded by this amount to this destination. + */ + "Rewarded": Anonymize; + /** + *A staker (validator or nominator) has been slashed by the given amount. + */ + "Slashed": Anonymize; + /** + *A slash for the given validator, for the given percentage of their stake, at the given + *era as been reported. + */ + "SlashReported": Anonymize; + /** + *An old slashing report from a prior era was discarded because it could + *not be processed. + */ + "OldSlashingReportDiscarded": Anonymize; + /** + *A new set of stakers was elected. + */ + "StakersElected": undefined; + /** + *An account has bonded this amount. \[stash, amount\] + * + *NOTE: This event is only emitted when funds are bonded via a dispatchable. Notably, + *it will not be emitted for staking rewards when they are added to stake. + */ + "Bonded": Anonymize; + /** + *An account has unbonded this amount. + */ + "Unbonded": Anonymize; + /** + *An account has called `withdraw_unbonded` and removed unbonding chunks worth `Balance` + *from the unlocking queue. + */ + "Withdrawn": Anonymize; + /** + *A nominator has been kicked from a validator. + */ + "Kicked": Anonymize; + /** + *The election failed. No new era is planned. + */ + "StakingElectionFailed": undefined; + /** + *An account has stopped participating as either a validator or nominator. + */ + "Chilled": Anonymize; + /** + *A Page of stakers rewards are getting paid. `next` is `None` if all pages are claimed. + */ + "PayoutStarted": Anonymize; + /** + *A validator has set their preferences. + */ + "ValidatorPrefsSet": Anonymize; + /** + *Voters size limit reached. + */ + "SnapshotVotersSizeExceeded": Anonymize; + /** + *Targets size limit reached. + */ + "SnapshotTargetsSizeExceeded": Anonymize; + /** + *A new force era mode was set. + */ + "ForceEra": Anonymize; + /** + *Report of a controller batch deprecation. + */ + "ControllerBatchDeprecated": Anonymize; + /** + *Staking balance migrated from locks to holds, with any balance that could not be held + *is force withdrawn. + */ + "CurrencyMigrated": Anonymize; +}>; +export type Ith132hqfb27q = { + "era_index": number; + "validator_stash": SS58String; + "page": number; + "next"?: Anonymize; +}; +export type I1td4upnup9gqv = { + "stash": SS58String; + "force_withdraw": bigint; +}; +export type I3fs99kjn361i1 = AnonymousEnum<{ + /** + *The merkle root of the validators of the said session were stored + */ + "RootStored": Anonymize; + /** + *The merkle roots of up to this session index were pruned + */ + "RootsPruned": Anonymize; +}>; +export type I6ue0ck5fc3u44 = AnonymousEnum<{ + /** + *New session has happened. Note that the argument is the session index, not the + *block number as the type might suggest. + */ + "NewSession": Anonymize; + /** + *The `NewSession` event in the current block also implies a new validator set to be + *queued. + */ + "NewQueued": undefined; + /** + *Validator has been disabled. + */ + "ValidatorDisabled": Anonymize; + /** + *Validator has been re-enabled. + */ + "ValidatorReenabled": Anonymize; +}>; +export type I9acqruh7322g2 = { + "validator": SS58String; +}; +export type I2m3ghucjkd8v0 = AnonymousEnum<{ + /** + *Batch of dispatches did not complete fully. Index of first failing dispatch given, as + *well as the error. + */ + "BatchInterrupted": Anonymize; + /** + *Batch of dispatches completed fully with no error. + */ + "BatchCompleted": undefined; + /** + *Batch of dispatches completed but has errors. + */ + "BatchCompletedWithErrors": undefined; + /** + *A single item within a Batch of dispatches has completed with no error. + */ + "ItemCompleted": undefined; + /** + *A single item within a Batch of dispatches has completed with error. + */ + "ItemFailed": Anonymize; + /** + *A call was dispatched. + */ + "DispatchedAs": Anonymize; + /** + *Main call was dispatched. + */ + "IfElseMainSuccess": undefined; + /** + *The fallback call was dispatched. + */ + "IfElseFallbackCalled": Anonymize; +}>; +export type I513i4g3u308ia = { + "index": number; + "error": Anonymize; +}; +export type I529op3ifr7ped = { + "error": Anonymize; +}; +export type I6ak1c6bp7djtf = { + "result": Anonymize; +}; +export type Ib8vqj3khtj6qe = ResultPayload>; +export type Ietea96bmm1cg2 = { + "main_error": Anonymize; +}; +export type I2au2or9cskfoi = AnonymousEnum<{ + /** + *A name was set or reset (which will remove all judgements). + */ + "IdentitySet": Anonymize; + /** + *A name was cleared, and the given balance returned. + */ + "IdentityCleared": Anonymize; + /** + *A name was removed and the given balance slashed. + */ + "IdentityKilled": Anonymize; + /** + *A judgement was asked from a registrar. + */ + "JudgementRequested": Anonymize; + /** + *A judgement request was retracted. + */ + "JudgementUnrequested": Anonymize; + /** + *A judgement was given by a registrar. + */ + "JudgementGiven": Anonymize; + /** + *A registrar was added. + */ + "RegistrarAdded": Anonymize; + /** + *A sub-identity was added to an identity and the deposit paid. + */ + "SubIdentityAdded": Anonymize; + /** + *An account's sub-identities were set (in bulk). + */ + "SubIdentitiesSet": Anonymize; + /** + *A given sub-account's associated name was changed by its super-identity. + */ + "SubIdentityRenamed": Anonymize; + /** + *A sub-identity was removed from an identity and the deposit freed. + */ + "SubIdentityRemoved": Anonymize; + /** + *A sub-identity was cleared, and the given deposit repatriated from the + *main identity account to the sub-identity account. + */ + "SubIdentityRevoked": Anonymize; + /** + *A username authority was added. + */ + "AuthorityAdded": Anonymize; + /** + *A username authority was removed. + */ + "AuthorityRemoved": Anonymize; + /** + *A username was set for `who`. + */ + "UsernameSet": Anonymize; + /** + *A username was queued, but `who` must accept it prior to `expiration`. + */ + "UsernameQueued": Anonymize; + /** + *A queued username passed its expiration without being claimed and was removed. + */ + "PreapprovalExpired": Anonymize; + /** + *A username was set as a primary and can be looked up from `who`. + */ + "PrimaryUsernameSet": Anonymize; + /** + *A dangling username (as in, a username corresponding to an account that has removed its + *identity) has been removed. + */ + "DanglingUsernameRemoved": Anonymize; + /** + *A username has been unbound. + */ + "UsernameUnbound": Anonymize; + /** + *A username has been removed. + */ + "UsernameRemoved": Anonymize; + /** + *A username has been killed. + */ + "UsernameKilled": Anonymize; +}>; +export type Iep1lmt6q3s6r3 = { + "who": SS58String; + "deposit": bigint; +}; +export type I1fac16213rie2 = { + "who": SS58String; + "registrar_index": number; +}; +export type Ifjt77oc391o43 = { + "target": SS58String; + "registrar_index": number; +}; +export type Itvt1jsipv0lc = { + "registrar_index": number; +}; +export type Ick3mveut33f44 = { + "sub": SS58String; + "main": SS58String; + "deposit": bigint; +}; +export type I719lqkkbtikbl = { + "main": SS58String; + "number_of_subs": number; + "new_deposit": bigint; +}; +export type Ie4intrc3n8jfu = { + "sub": SS58String; + "main": SS58String; +}; +export type I2rg5btjrsqec0 = { + "authority": SS58String; +}; +export type Ibdqerrooruuq9 = { + "who": SS58String; + "username": Binary; +}; +export type I8u2ba9jeiu6q0 = { + "who": SS58String; + "username": Binary; + "expiration": number; +}; +export type I7ieadb293k6b4 = { + "whose": SS58String; +}; +export type Ie5l999tf7t2te = { + "username": Binary; +}; +export type I1h17pkrpub934 = AnonymousEnum<{ + /** + *A recovery process has been set up for an account. + */ + "RecoveryCreated": Anonymize; + /** + *A recovery process has been initiated for lost account by rescuer account. + */ + "RecoveryInitiated": Anonymize; + /** + *A recovery process for lost account by rescuer account has been vouched for by sender. + */ + "RecoveryVouched": Anonymize; + /** + *A recovery process for lost account by rescuer account has been closed. + */ + "RecoveryClosed": Anonymize; + /** + *Lost account has been successfully recovered by rescuer account. + */ + "AccountRecovered": Anonymize; + /** + *A recovery process has been removed for an account. + */ + "RecoveryRemoved": Anonymize; + /** + *A deposit has been updated. + */ + "DepositPoked": Anonymize; +}>; +export type Ib81hb2akekpfs = { + "who": SS58String; + "kind": Anonymize; + "old_deposit": bigint; + "new_deposit": bigint; +}; +export type If13u27dud0q6a = AnonymousEnum<{ + "RecoveryConfig": undefined; + "ActiveRecoveryFor": SS58String; +}>; +export type I7uu9ebnucfti5 = AnonymousEnum<{ + /** + *A vesting schedule has been created. + */ + "VestingCreated": Anonymize; + /** + *The amount vested has been updated. This could indicate a change in funds available. + *The balance given is the amount which is left unvested (and thus locked). + */ + "VestingUpdated": Anonymize; + /** + *An \[account\] has become fully vested. + */ + "VestingCompleted": Anonymize; +}>; +export type Ih04jp733tqqa = { + "account": SS58String; + "schedule_index": number; +}; +export type I444u8rj2mqv17 = AnonymousEnum<{ + /** + *Scheduled some task. + */ + "Scheduled": Anonymize; + /** + *Canceled some task. + */ + "Canceled": Anonymize; + /** + *Dispatched some task. + */ + "Dispatched": Anonymize; + /** + *Set a retry configuration for some task. + */ + "RetrySet": Anonymize; + /** + *Cancel a retry configuration for some task. + */ + "RetryCancelled": Anonymize; + /** + *The call for the provided hash was not found so the task has been aborted. + */ + "CallUnavailable": Anonymize; + /** + *The given task was unable to be renewed since the agenda is full at that block. + */ + "PeriodicFailed": Anonymize; + /** + *The given task was unable to be retried since the agenda is full at that block or there + *was not enough weight to reschedule it. + */ + "RetryFailed": Anonymize; + /** + *The given task can never be executed since it is overweight. + */ + "PermanentlyOverweight": Anonymize; + /** + *Agenda is incomplete from `when`. + */ + "AgendaIncomplete": Anonymize; +}>; +export type I5jmupb1kai3jj = { + "task": Anonymize; + "id"?: Anonymize; + "result": Anonymize; +}; +export type I9r0mgi6ick4cs = AnonymousEnum<{ + /** + *A sudo call just took place. + */ + "Sudid": Anonymize; + /** + *The sudo key has been updated. + */ + "KeyChanged": Anonymize; + /** + *The key was permanently removed. + */ + "KeyRemoved": undefined; + /** + *A [sudo_as](Pallet::sudo_as) call just took place. + */ + "SudoAsDone": Anonymize; +}>; +export type Idl66os3793p2c = { + /** + *The result of the call made by the sudo user. + */ + "sudo_result": Anonymize; +}; +export type I6vqme2kguttup = AnonymousEnum<{ + /** + *A proxy was executed correctly, with the given. + */ + "ProxyExecuted": Anonymize; + /** + *A pure account has been created by new proxy with given + *disambiguation index and proxy type. + */ + "PureCreated": Anonymize; + /** + *A pure proxy was killed by its spawner. + */ + "PureKilled": Anonymize; + /** + *An announcement was placed to make a call in the future. + */ + "Announced": Anonymize; + /** + *A proxy was added. + */ + "ProxyAdded": Anonymize; + /** + *A proxy was removed. + */ + "ProxyRemoved": Anonymize; + /** + *A deposit stored for proxies or announcements was poked / updated. + */ + "DepositPoked": Anonymize; +}>; +export type Id55sh701bp4ra = { + "pure": SS58String; + "who": SS58String; + "proxy_type": Anonymize; + "disambiguation_index": number; +}; +export type I4usd2cn59lcla = AnonymousEnum<{ + "Any": undefined; + "NonTransfer": undefined; + "Governance": undefined; + "Staking": undefined; + "SudoBalances": undefined; + "IdentityJudgement": undefined; + "CancelProxy": undefined; + "Auction": undefined; + "NominationPools": undefined; + "ParaRegistration": undefined; +}>; +export type Ie5hfqfo83migv = { + "pure": SS58String; + "spawner": SS58String; + "proxy_type": Anonymize; + "disambiguation_index": number; +}; +export type I9gonkpdfg3e5v = { + "delegator": SS58String; + "delegatee": SS58String; + "proxy_type": Anonymize; + "delay": number; +}; +export type I1bhd210c3phjj = { + "who": SS58String; + "kind": Anonymize; + "old_deposit": bigint; + "new_deposit": bigint; +}; +export type I8pd2vd03fs1qj = AnonymousEnum<{ + "Proxies": undefined; + "Announcements": undefined; +}>; +export type I3kuqq8f8kn85j = AnonymousEnum<{ + /** + *A new multisig operation has begun. + */ + "NewMultisig": Anonymize; + /** + *A multisig operation has been approved by someone. + */ + "MultisigApproval": Anonymize; + /** + *A multisig operation has been executed. + */ + "MultisigExecuted": Anonymize; + /** + *A multisig operation has been cancelled. + */ + "MultisigCancelled": Anonymize; + /** + *The deposit for a multisig operation has been updated/poked. + */ + "DepositPoked": Anonymize; +}>; +export type I965kkmkm4dqqk = { + "approving": SS58String; + "timepoint": Anonymize; + "multisig": SS58String; + "call_hash": FixedSizeBinary<32>; + "result": Anonymize; +}; +export type I8gtde5abn1g9a = { + "who": SS58String; + "call_hash": FixedSizeBinary<32>; + "old_deposit": bigint; + "new_deposit": bigint; +}; +export type Id0dkgikq71n9h = AnonymousEnum<{ + /** + *A pool has been created. + */ + "Created": Anonymize; + /** + *A member has became bonded in a pool. + */ + "Bonded": Anonymize; + /** + *A payout has been made to a member. + */ + "PaidOut": Anonymize; + /** + *A member has unbonded from their pool. + * + *- `balance` is the corresponding balance of the number of points that has been + * requested to be unbonded (the argument of the `unbond` transaction) from the bonded + * pool. + *- `points` is the number of points that are issued as a result of `balance` being + *dissolved into the corresponding unbonding pool. + *- `era` is the era in which the balance will be unbonded. + *In the absence of slashing, these values will match. In the presence of slashing, the + *number of points that are issued in the unbonding pool will be less than the amount + *requested to be unbonded. + */ + "Unbonded": Anonymize; + /** + *A member has withdrawn from their pool. + * + *The given number of `points` have been dissolved in return of `balance`. + * + *Similar to `Unbonded` event, in the absence of slashing, the ratio of point to balance + *will be 1. + */ + "Withdrawn": Anonymize; + /** + *A pool has been destroyed. + */ + "Destroyed": Anonymize; + /** + *The state of a pool has changed + */ + "StateChanged": Anonymize; + /** + *A member has been removed from a pool. + * + *The removal can be voluntary (withdrawn all unbonded funds) or involuntary (kicked). + *Any funds that are still delegated (i.e. dangling delegation) are released and are + *represented by `released_balance`. + */ + "MemberRemoved": Anonymize; + /** + *The roles of a pool have been updated to the given new roles. Note that the depositor + *can never change. + */ + "RolesUpdated": Anonymize; + /** + *The active balance of pool `pool_id` has been slashed to `balance`. + */ + "PoolSlashed": Anonymize; + /** + *The unbond pool at `era` of pool `pool_id` has been slashed to `balance`. + */ + "UnbondingPoolSlashed": Anonymize; + /** + *A pool's commission setting has been changed. + */ + "PoolCommissionUpdated": Anonymize; + /** + *A pool's maximum commission setting has been changed. + */ + "PoolMaxCommissionUpdated": Anonymize; + /** + *A pool's commission `change_rate` has been changed. + */ + "PoolCommissionChangeRateUpdated": Anonymize; + /** + *Pool commission claim permission has been updated. + */ + "PoolCommissionClaimPermissionUpdated": Anonymize; + /** + *Pool commission has been claimed. + */ + "PoolCommissionClaimed": Anonymize; + /** + *Topped up deficit in frozen ED of the reward pool. + */ + "MinBalanceDeficitAdjusted": Anonymize; + /** + *Claimed excess frozen ED of af the reward pool. + */ + "MinBalanceExcessAdjusted": Anonymize; + /** + *A pool member's claim permission has been updated. + */ + "MemberClaimPermissionUpdated": Anonymize; + /** + *A pool's metadata was updated. + */ + "MetadataUpdated": Anonymize; + /** + *A pool's nominating account (or the pool's root account) has nominated a validator set + *on behalf of the pool. + */ + "PoolNominationMade": Anonymize; + /** + *The pool is chilled i.e. no longer nominating. + */ + "PoolNominatorChilled": Anonymize; + /** + *Global parameters regulating nomination pools have been updated. + */ + "GlobalParamsUpdated": Anonymize; +}>; +export type I6c6fpqmnqijqd = { + "pool_id": number; + "member": SS58String; + "released_balance": bigint; +}; +export type I93ajn7brqs8df = { + "member": SS58String; + "permission": NominationPoolsClaimPermission; +}; +export type Ib2q8vnsr19t9b = { + "pool_id": number; + "caller": SS58String; +}; +export type If6q1q7op2gvqf = { + "min_join_bond": bigint; + "min_create_bond": bigint; + "max_pools"?: Anonymize; + "max_members"?: Anonymize; + "max_members_per_pool"?: Anonymize; + "global_max_commission"?: Anonymize; +}; +export type I1oda81joco4aj = AnonymousEnum<{ + /** + *A staker was unstaked. + */ + "Unstaked": Anonymize; + /** + *A staker was slashed for requesting fast-unstake whilst being exposed. + */ + "Slashed": Anonymize; + /** + *A batch was partially checked for the given eras, but the process did not finish. + */ + "BatchChecked": Anonymize; + /** + *A batch of a given size was terminated. + * + *This is always follows by a number of `Unstaked` or `Slashed` events, marking the end + *of the batch. A new batch will be created upon next block. + */ + "BatchFinished": Anonymize; + /** + *An internal error happened. Operations will be paused now. + */ + "InternalError": undefined; +}>; +export type If1bar61j9m2mv = { + "stash": SS58String; + "result": Anonymize; +}; +export type I7tvgbf73o5td4 = AnonymousEnum<{ + /** + *An account has delegated their vote to another account. \[who, target\] + */ + "Delegated": Anonymize; + /** + *An \[account\] has cancelled a previous delegation operation. + */ + "Undelegated": SS58String; + /** + *An account has voted + */ + "Voted": Anonymize; + /** + *A vote has been removed + */ + "VoteRemoved": Anonymize; + /** + *The lockup period of a conviction vote expired, and the funds have been unlocked. + */ + "VoteUnlocked": Anonymize; +}>; +export type I9qfchhljqsjjl = { + "who": SS58String; + "vote": ConvictionVotingVoteAccountVote; +}; +export type I7kij8p9kchdjo = { + "who": SS58String; + "class": number; +}; +export type Id788i4dlrmqf5 = AnonymousEnum<{ + "CallWhitelisted": Anonymize; + "WhitelistedCallRemoved": Anonymize; + "WhitelistedCallDispatched": Anonymize; +}>; +export type I9q52ail4t02bm = { + "call_hash": FixedSizeBinary<32>; + "result": Anonymize; +}; +export type I52bohnq0qt2b0 = ResultPayload, Anonymize>; +export type I605qi7ffo5hj6 = { + "post_info": Anonymize; + "error": Anonymize; +}; +export type Ia1b9fjuj0ob0b = AnonymousEnum<{ + /** + *We have ended a spend period and will now allocate funds. + */ + "Spending": Anonymize; + /** + *Some funds have been allocated. + */ + "Awarded": Anonymize; + /** + *Some of our funds have been burnt. + */ + "Burnt": Anonymize; + /** + *Spending has finished; this is the amount that rolls over until next spend. + */ + "Rollover": Anonymize; + /** + *Some funds have been deposited. + */ + "Deposit": Anonymize; + /** + *A new spend proposal has been approved. + */ + "SpendApproved": Anonymize; + /** + *The inactive funds of the pallet have been updated. + */ + "UpdatedInactive": Anonymize; + /** + *A new asset spend proposal has been approved. + */ + "AssetSpendApproved": Anonymize; + /** + *An approved spend was voided. + */ + "AssetSpendVoided": Anonymize; + /** + *A payment happened. + */ + "Paid": Anonymize; + /** + *A payment failed and can be retried. + */ + "PaymentFailed": Anonymize; + /** + *A spend was processed and removed from the storage. It might have been successfully + *paid or it may have expired. + */ + "SpendProcessed": Anonymize; +}>; +export type I2cftk5tgrglaa = { + "index": number; + "asset_kind": Anonymize; + "amount": bigint; + "beneficiary": XcmVersionedLocation; + "valid_from": number; + "expire_at": number; +}; +export type I2q3ri6itcjj5u = AnonymousEnum<{ + "V3": Anonymize; + "V4": Anonymize; + "V5": Anonymize; +}>; +export type I4rqenbj90c4ms = { + "location": Anonymize; + "asset_id": Anonymize; +}; +export type If9iqq7i64mur8 = { + "parents": number; + "interior": XcmV5Junctions; +}; +export type XcmV5Junctions = Enum<{ + "Here": undefined; + "X1": XcmV5Junction; + "X2": Anonymize; + "X3": Anonymize; + "X4": Anonymize; + "X5": Anonymize; + "X6": Anonymize; + "X7": Anonymize; + "X8": Anonymize; +}>; +export declare const XcmV5Junctions: GetEnum; +export type XcmV5Junction = Enum<{ + "Parachain": number; + "AccountId32": Anonymize; + "AccountIndex64": Anonymize; + "AccountKey20": Anonymize; + "PalletInstance": number; + "GeneralIndex": bigint; + "GeneralKey": Anonymize; + "OnlyChild": undefined; + "Plurality": Anonymize; + "GlobalConsensus": XcmV5NetworkId; +}>; +export declare const XcmV5Junction: GetEnum; +export type I303u17k2gp1si = { + "network"?: Anonymize; + "id": FixedSizeBinary<32>; +}; +export type I97pd2rst02a7r = (XcmV5NetworkId) | undefined; +export type XcmV5NetworkId = Enum<{ + "ByGenesis": FixedSizeBinary<32>; + "ByFork": Anonymize; + "Polkadot": undefined; + "Kusama": undefined; + "Ethereum": Anonymize; + "BitcoinCore": undefined; + "BitcoinCash": undefined; + "PolkadotBulletin": undefined; +}>; +export declare const XcmV5NetworkId: GetEnum; +export type Iejvsa7fje7ib3 = { + "network"?: Anonymize; + "index": bigint; +}; +export type Icmn90ot6tcot8 = { + "network"?: Anonymize; + "key": FixedSizeBinary<20>; +}; +export type I279b0st0go8pj = FixedSizeArray<2, XcmV5Junction>; +export type I8t3509dftknlg = FixedSizeArray<3, XcmV5Junction>; +export type Iegifjnm8bgl6n = FixedSizeArray<4, XcmV5Junction>; +export type Ic40rerdemoe3f = FixedSizeArray<5, XcmV5Junction>; +export type Ieehae2qh5qhrv = FixedSizeArray<6, XcmV5Junction>; +export type I1pmgeuqv3eom3 = FixedSizeArray<7, XcmV5Junction>; +export type I32k80jnq35fij = FixedSizeArray<8, XcmV5Junction>; +export type XcmVersionedLocation = Enum<{ + "V3": Anonymize; + "V4": Anonymize; + "V5": Anonymize; +}>; +export declare const XcmVersionedLocation: GetEnum; +export type I1nq1se98idofq = AnonymousEnum<{ + /** + *Funds delegated by a delegator. + */ + "Delegated": Anonymize; + /** + *Funds released to a delegator. + */ + "Released": Anonymize; + /** + *Funds slashed from a delegator. + */ + "Slashed": Anonymize; + /** + *Unclaimed delegation funds migrated to delegator. + */ + "MigratedDelegation": Anonymize; +}>; +export type Id2aanom2jncf1 = { + "agent": SS58String; + "delegator": SS58String; + "amount": bigint; +}; +export type If7iaaqrjurpqf = AnonymousEnum<{ + /** + *A candidate was backed. `[candidate, head_data]` + */ + "CandidateBacked": Anonymize; + /** + *A candidate was included. `[candidate, head_data]` + */ + "CandidateIncluded": Anonymize; + /** + *A candidate timed out. `[candidate, head_data]` + */ + "CandidateTimedOut": Anonymize; + /** + *Some upward messages have been received and will be processed. + */ + "UpwardMessagesReceived": Anonymize; +}>; +export type I4s0gvfhejmdp2 = [Anonymize, Binary, number, number]; +export type Iceqied2dhrjit = { + "descriptor": Anonymize; + "commitments_hash": FixedSizeBinary<32>; +}; +export type Ibnq2mkuf1plno = { + "para_id": number; + "relay_parent": FixedSizeBinary<32>; + "version": number; + "core_index": number; + "session_index": number; + "reserved1": FixedSizeBinary<25>; + "persisted_validation_data_hash": FixedSizeBinary<32>; + "pov_hash": FixedSizeBinary<32>; + "erasure_root": FixedSizeBinary<32>; + "reserved2": FixedSizeBinary<64>; + "para_head": FixedSizeBinary<32>; + "validation_code_hash": FixedSizeBinary<32>; +}; +export type I9njsgm2qsgnil = [Anonymize, Binary, number]; +export type Ifbkifeb2totq0 = AnonymousEnum<{ + /** + *Current code has been updated for a Para. `para_id` + */ + "CurrentCodeUpdated": number; + /** + *Current head has been updated for a Para. `para_id` + */ + "CurrentHeadUpdated": number; + /** + *A code upgrade has been scheduled for a Para. `para_id` + */ + "CodeUpgradeScheduled": number; + /** + *A new head has been noted for a Para. `para_id` + */ + "NewHeadNoted": number; + /** + *A para has been queued to execute pending actions. `para_id` + */ + "ActionQueued": Anonymize; + /** + *The given para either initiated or subscribed to a PVF check for the given validation + *code. `code_hash` `para_id` + */ + "PvfCheckStarted": Anonymize; + /** + *The given validation code was accepted by the PVF pre-checking vote. + *`code_hash` `para_id` + */ + "PvfCheckAccepted": Anonymize; + /** + *The given validation code was rejected by the PVF pre-checking vote. + *`code_hash` `para_id` + */ + "PvfCheckRejected": Anonymize; + /** + *The upgrade cooldown was removed. + */ + "UpgradeCooldownRemoved": Anonymize; + /** + *A new code hash has been authorized for a Para. + */ + "CodeAuthorized": Anonymize; +}>; +export type I4iqn2mh49tci5 = { + /** + *Para + */ + "para_id": number; + /** + *Authorized code hash. + */ + "code_hash": FixedSizeBinary<32>; + /** + *Block at which authorization expires and will be removed. + */ + "expire_at": number; +}; +export type I8vt07l5vp6sb8 = AnonymousEnum<{ + /** + *An order was placed at some spot price amount by orderer ordered_by + */ + "OnDemandOrderPlaced": Anonymize; + /** + *The value of the spot price has likely changed + */ + "SpotPriceSet": Anonymize; + /** + *An account was given credits. + */ + "AccountCredited": Anonymize; +}>; +export type I687cmlomantj7 = AnonymousEnum<{ + /** + *Create a new crowdloaning campaign. + */ + "Created": Anonymize; + /** + *Contributed to a crowd sale. + */ + "Contributed": Anonymize; + /** + *Withdrew full balance of a contributor. + */ + "Withdrew": Anonymize; + /** + *The loans in a fund have been partially dissolved, i.e. there are some left + *over child keys that still need to be killed. + */ + "PartiallyRefunded": Anonymize; + /** + *All loans in a fund have been refunded. + */ + "AllRefunded": Anonymize; + /** + *Fund is dissolved. + */ + "Dissolved": Anonymize; + /** + *The result of trying to submit a new bid to the Slots pallet. + */ + "HandleBidResult": Anonymize; + /** + *The configuration to a crowdloan has been edited. + */ + "Edited": Anonymize; + /** + *A memo has been updated. + */ + "MemoUpdated": Anonymize; + /** + *A parachain has been moved to `NewRaise` + */ + "AddedToNewRaise": Anonymize; +}>; +export type I524tcsd6dpr31 = { + "para_id": number; + "result": Anonymize; +}; +export type PolkadotRuntimeCommonAssignedSlotsEvent = Enum<{ + /** + *A parachain was assigned a permanent parachain slot + */ + "PermanentSlotAssigned": number; + /** + *A parachain was assigned a temporary parachain slot + */ + "TemporarySlotAssigned": number; + /** + *The maximum number of permanent slots has been changed + */ + "MaxPermanentSlotsChanged": Anonymize; + /** + *The maximum number of temporary slots has been changed + */ + "MaxTemporarySlotsChanged": Anonymize; +}>; +export declare const PolkadotRuntimeCommonAssignedSlotsEvent: GetEnum; +export type I9d5h5irbki7mm = { + "slots": number; +}; +export type If5dgssg1nqq8m = AnonymousEnum<{ + /** + *A new validator set has been received. + */ + "ValidatorSetReceived": Anonymize; + /** + *We could not merge, and therefore dropped a buffered message. + * + *Note that this event is more resembling an error, but we use an event because in this + *pallet we need to mutate storage upon some failures. + */ + "CouldNotMergeAndDropped": undefined; + /** + *The validator set received is way too small, as per + *[`Config::MinimumValidatorSetSize`]. + */ + "SetTooSmallAndDropped": undefined; + /** + *Something occurred that should never happen under normal operation. Logged as an event + *for fail-safe observability. + */ + "Unexpected": Anonymize; +}>; +export type Ia9t7uh39caaer = { + "id": number; + "new_validator_set_count": number; + "prune_up_to"?: Anonymize; + "leftover": boolean; +}; +export type I8dnqf005919hm = AnonymousEnum<{ + "ReceivedValidatorSetWhilePassive": undefined; + "UnexpectedModeTransition": undefined; +}>; +export type I94co7vj7h6bo = AnonymousEnum<{ + /** + *A Runtime upgrade started. + * + *Its end is indicated by `UpgradeCompleted` or `UpgradeFailed`. + */ + "UpgradeStarted": Anonymize; + /** + *The current runtime upgrade completed. + * + *This implies that all of its migrations completed successfully as well. + */ + "UpgradeCompleted": undefined; + /** + *Runtime upgrade failed. + * + *This is very bad and will require governance intervention. + */ + "UpgradeFailed": undefined; + /** + *A migration was skipped since it was already executed in the past. + */ + "MigrationSkipped": Anonymize; + /** + *A migration progressed. + */ + "MigrationAdvanced": Anonymize; + /** + *A Migration completed. + */ + "MigrationCompleted": Anonymize; + /** + *A Migration failed. + * + *This implies that the whole upgrade failed and governance intervention is required. + */ + "MigrationFailed": Anonymize; + /** + *The set of historical migrations has been cleared. + */ + "HistoricCleared": Anonymize; +}>; +export type If1co0pilmi7oq = { + /** + *The number of migrations that this upgrade contains. + * + *This can be used to design a progress indicator in combination with counting the + *`MigrationCompleted` and `MigrationSkipped` events. + */ + "migrations": number; +}; +export type Iae74gjak1qibn = { + /** + *The index of the migration within the [`Config::Migrations`] list. + */ + "index": number; + /** + *The number of blocks that this migration took so far. + */ + "took": number; +}; +export type I3escdojpj0551 = { + /** + *Should be passed to `clear_historic` in a successive call. + */ + "next_cursor"?: Anonymize; +}; +export type If95hivmqmkiku = AnonymousEnum<{ + /** + *Execution of an XCM message was attempted. + */ + "Attempted": Anonymize; + /** + *An XCM message was sent. + */ + "Sent": Anonymize; + /** + *An XCM message failed to send. + */ + "SendFailed": Anonymize; + /** + *An XCM message failed to process. + */ + "ProcessXcmError": Anonymize; + /** + *Query response received which does not match a registered query. This may be because a + *matching query was never registered, it may be because it is a duplicate response, or + *because the query timed out. + */ + "UnexpectedResponse": Anonymize; + /** + *Query response has been received and is ready for taking with `take_response`. There is + *no registered notification call. + */ + "ResponseReady": Anonymize; + /** + *Query response has been received and query is removed. The registered notification has + *been dispatched and executed successfully. + */ + "Notified": Anonymize; + /** + *Query response has been received and query is removed. The registered notification + *could not be dispatched because the dispatch weight is greater than the maximum weight + *originally budgeted by this runtime for the query result. + */ + "NotifyOverweight": Anonymize; + /** + *Query response has been received and query is removed. There was a general error with + *dispatching the notification call. + */ + "NotifyDispatchError": Anonymize; + /** + *Query response has been received and query is removed. The dispatch was unable to be + *decoded into a `Call`; this might be due to dispatch function having a signature which + *is not `(origin, QueryId, Response)`. + */ + "NotifyDecodeFailed": Anonymize; + /** + *Expected query response has been received but the origin location of the response does + *not match that expected. The query remains registered for a later, valid, response to + *be received and acted upon. + */ + "InvalidResponder": Anonymize; + /** + *Expected query response has been received but the expected origin location placed in + *storage by this runtime previously cannot be decoded. The query remains registered. + * + *This is unexpected (since a location placed in storage in a previously executing + *runtime should be readable prior to query timeout) and dangerous since the possibly + *valid response will be dropped. Manual governance intervention is probably going to be + *needed. + */ + "InvalidResponderVersion": Anonymize; + /** + *Received query response has been read and removed. + */ + "ResponseTaken": Anonymize; + /** + *Some assets have been placed in an asset trap. + */ + "AssetsTrapped": Anonymize; + /** + *An XCM version change notification message has been attempted to be sent. + * + *The cost of sending it (borne by the chain) is included. + */ + "VersionChangeNotified": Anonymize; + /** + *The supported version of a location has been changed. This might be through an + *automatic notification or a manual intervention. + */ + "SupportedVersionChanged": Anonymize; + /** + *A given location which had a version change subscription was dropped owing to an error + *sending the notification to it. + */ + "NotifyTargetSendFail": Anonymize; + /** + *A given location which had a version change subscription was dropped owing to an error + *migrating the location to our new XCM format. + */ + "NotifyTargetMigrationFail": Anonymize; + /** + *Expected query response has been received but the expected querier location placed in + *storage by this runtime previously cannot be decoded. The query remains registered. + * + *This is unexpected (since a location placed in storage in a previously executing + *runtime should be readable prior to query timeout) and dangerous since the possibly + *valid response will be dropped. Manual governance intervention is probably going to be + *needed. + */ + "InvalidQuerierVersion": Anonymize; + /** + *Expected query response has been received but the querier location of the response does + *not match the expected. The query remains registered for a later, valid, response to + *be received and acted upon. + */ + "InvalidQuerier": Anonymize; + /** + *A remote has requested XCM version change notification from us and we have honored it. + *A version information message is sent to them and its cost is included. + */ + "VersionNotifyStarted": Anonymize; + /** + *We have requested that a remote chain send us XCM version change notifications. + */ + "VersionNotifyRequested": Anonymize; + /** + *We have requested that a remote chain stops sending us XCM version change + *notifications. + */ + "VersionNotifyUnrequested": Anonymize; + /** + *Fees were paid from a location for an operation (often for using `SendXcm`). + */ + "FeesPaid": Anonymize; + /** + *Some assets have been claimed from an asset trap + */ + "AssetsClaimed": Anonymize; + /** + *A XCM version migration finished. + */ + "VersionMigrationFinished": Anonymize; + /** + *An `aliaser` location was authorized by `target` to alias it, authorization valid until + *`expiry` block number. + */ + "AliasAuthorized": Anonymize; + /** + *`target` removed alias authorization for `aliaser`. + */ + "AliasAuthorizationRemoved": Anonymize; + /** + *`target` removed all alias authorizations. + */ + "AliasesAuthorizationsRemoved": Anonymize; +}>; +export type I61d51nv4cou88 = { + "outcome": Anonymize; +}; +export type Ieqhmksji3pmv5 = AnonymousEnum<{ + "Complete": Anonymize; + "Incomplete": Anonymize; + "Error": Anonymize; +}>; +export type I2eg8n0l1c94a1 = { + "used": Anonymize; + "error": Anonymize; +}; +export type Ieiju48dn66cuh = { + "index": number; + "error": Anonymize; +}; +export type Id56rgs0bdb7gl = AnonymousEnum<{ + "Overflow": undefined; + "Unimplemented": undefined; + "UntrustedReserveLocation": undefined; + "UntrustedTeleportLocation": undefined; + "LocationFull": undefined; + "LocationNotInvertible": undefined; + "BadOrigin": undefined; + "InvalidLocation": undefined; + "AssetNotFound": undefined; + "FailedToTransactAsset": undefined; + "NotWithdrawable": undefined; + "LocationCannotHold": undefined; + "ExceedsMaxMessageSize": undefined; + "DestinationUnsupported": undefined; + "Transport": undefined; + "Unroutable": undefined; + "UnknownClaim": undefined; + "FailedToDecode": undefined; + "MaxWeightInvalid": undefined; + "NotHoldingFees": undefined; + "TooExpensive": undefined; + "Trap": bigint; + "ExpectationFalse": undefined; + "PalletNotFound": undefined; + "NameMismatch": undefined; + "VersionIncompatible": undefined; + "HoldingWouldOverflow": undefined; + "ExportError": undefined; + "ReanchorFailed": undefined; + "NoDeal": undefined; + "FeesNotMet": undefined; + "LockError": undefined; + "NoPermission": undefined; + "Unanchored": undefined; + "NotDepositable": undefined; + "TooManyAssets": undefined; + "UnhandledXcmVersion": undefined; + "WeightLimitReached": Anonymize; + "Barrier": undefined; + "WeightNotComputable": undefined; + "ExceedsStackLimit": undefined; +}>; +export type If8u5kl4h8070m = { + "origin": Anonymize; + "destination": Anonymize; + "message": Anonymize; + "message_id": FixedSizeBinary<32>; +}; +export type Ict03eedr8de9s = Array; +export type XcmV5Instruction = Enum<{ + "WithdrawAsset": Anonymize; + "ReserveAssetDeposited": Anonymize; + "ReceiveTeleportedAsset": Anonymize; + "QueryResponse": Anonymize; + "TransferAsset": Anonymize; + "TransferReserveAsset": Anonymize; + "Transact": Anonymize; + "HrmpNewChannelOpenRequest": Anonymize; + "HrmpChannelAccepted": Anonymize; + "HrmpChannelClosing": Anonymize; + "ClearOrigin": undefined; + "DescendOrigin": XcmV5Junctions; + "ReportError": Anonymize; + "DepositAsset": Anonymize; + "DepositReserveAsset": Anonymize; + "ExchangeAsset": Anonymize; + "InitiateReserveWithdraw": Anonymize; + "InitiateTeleport": Anonymize; + "ReportHolding": Anonymize; + "BuyExecution": Anonymize; + "RefundSurplus": undefined; + "SetErrorHandler": Anonymize; + "SetAppendix": Anonymize; + "ClearError": undefined; + "ClaimAsset": Anonymize; + "Trap": bigint; + "SubscribeVersion": Anonymize; + "UnsubscribeVersion": undefined; + "BurnAsset": Anonymize; + "ExpectAsset": Anonymize; + "ExpectOrigin"?: Anonymize; + "ExpectError"?: Anonymize; + "ExpectTransactStatus": XcmV3MaybeErrorCode; + "QueryPallet": Anonymize; + "ExpectPallet": Anonymize; + "ReportTransactStatus": Anonymize; + "ClearTransactStatus": undefined; + "UniversalOrigin": XcmV5Junction; + "ExportMessage": Anonymize; + "LockAsset": Anonymize; + "UnlockAsset": Anonymize; + "NoteUnlockable": Anonymize; + "RequestUnlock": Anonymize; + "SetFeesMode": Anonymize; + "SetTopic": FixedSizeBinary<32>; + "ClearTopic": undefined; + "AliasOrigin": Anonymize; + "UnpaidExecution": Anonymize; + "PayFees": Anonymize; + "InitiateTransfer": Anonymize; + "ExecuteWithOrigin": Anonymize; + "SetHints": Anonymize; +}>; +export declare const XcmV5Instruction: GetEnum; +export type I4npjalvhmfuj = Array>; +export type Iffh1nc5e1mod6 = { + "id": Anonymize; + "fun": XcmV3MultiassetFungibility; +}; +export type I7lviboj0crq1q = { + "query_id": bigint; + "response": Anonymize; + "max_weight": Anonymize; + "querier"?: Anonymize; +}; +export type I7vucpgm2c6959 = AnonymousEnum<{ + "Null": undefined; + "Assets": Anonymize; + "ExecutionResult"?: Anonymize; + "Version": number; + "PalletsInfo": Anonymize; + "DispatchResult": XcmV3MaybeErrorCode; +}>; +export type I3l6ejee750fv1 = (Anonymize) | undefined; +export type Ia1dtsqe0g5uqn = [number, Anonymize]; +export type I4pai6qnfk426l = (Anonymize) | undefined; +export type Ia4uoqg6e605nj = { + "assets": Anonymize; + "beneficiary": Anonymize; +}; +export type I9u1fdlf66htce = { + "assets": Anonymize; + "dest": Anonymize; + "xcm": Anonymize; +}; +export type I1b8drcbbicg14 = { + "origin_kind": XcmV2OriginKind; + "fallback_max_weight"?: Anonymize; + "call": Binary; +}; +export type I6vsmh07hrp1rc = { + "destination": Anonymize; + "query_id": bigint; + "max_weight": Anonymize; +}; +export type I81oo73d6i5279 = { + "assets": XcmV5AssetFilter; + "beneficiary": Anonymize; +}; +export type XcmV5AssetFilter = Enum<{ + "Definite": Anonymize; + "Wild": XcmV5WildAsset; +}>; +export declare const XcmV5AssetFilter: GetEnum; +export type XcmV5WildAsset = Enum<{ + "All": undefined; + "AllOf": Anonymize; + "AllCounted": number; + "AllOfCounted": Anonymize; +}>; +export declare const XcmV5WildAsset: GetEnum; +export type I3ufm9dj6id8cd = { + "id": Anonymize; + "fun": XcmV2MultiassetWildFungibility; +}; +export type Ibobri3ld2tm8f = { + "id": Anonymize; + "fun": XcmV2MultiassetWildFungibility; + "count": number; +}; +export type I5patag90o6n2g = { + "assets": XcmV5AssetFilter; + "dest": Anonymize; + "xcm": Anonymize; +}; +export type I2ga96bjhsjqmo = { + "give": XcmV5AssetFilter; + "want": Anonymize; + "maximal": boolean; +}; +export type I73lqp53eureh4 = { + "assets": XcmV5AssetFilter; + "reserve": Anonymize; + "xcm": Anonymize; +}; +export type Ifti8mofggqket = { + "response_info": Anonymize; + "assets": XcmV5AssetFilter; +}; +export type I491l3ihqncggf = { + "fees": Anonymize; + "weight_limit": XcmV3WeightLimit; +}; +export type I2felkchmfl53m = { + "assets": Anonymize; + "ticket": Anonymize; +}; +export type Ie5blkq940nvkd = { + "module_name": Binary; + "response_info": Anonymize; +}; +export type I46338r4f4c3gj = { + "network": XcmV5NetworkId; + "destination": XcmV5Junctions; + "xcm": Anonymize; +}; +export type Idsbn0vvkhdj4i = { + "asset": Anonymize; + "unlocker": Anonymize; +}; +export type I70l2gii2hrbik = { + "asset": Anonymize; + "target": Anonymize; +}; +export type I4d5rrublaq1fn = { + "asset": Anonymize; + "owner": Anonymize; +}; +export type Imh2n1s2lr5v4 = { + "asset": Anonymize; + "locker": Anonymize; +}; +export type I6apoeqjvad59g = { + "weight_limit": XcmV3WeightLimit; + "check_origin"?: Anonymize; +}; +export type I9btmbcvj13kgi = { + "asset": Anonymize; +}; +export type I2e7qiqdb7vvnq = { + "destination": Anonymize; + "remote_fees"?: Anonymize; + "preserve_origin": boolean; + "assets": Anonymize; + "remote_xcm": Anonymize; +}; +export type Ibu57i57ap4ll = (Anonymize) | undefined; +export type Ifhmc9e7vpeeig = AnonymousEnum<{ + "Teleport": XcmV5AssetFilter; + "ReserveDeposit": XcmV5AssetFilter; + "ReserveWithdraw": XcmV5AssetFilter; +}>; +export type If6bfvop70u5hr = Array>; +export type Icvu0u7vrbur4e = { + "descendant_origin"?: Anonymize; + "xcm": Anonymize; +}; +export type I8tsbjvlpig5v = (XcmV5Junctions) | undefined; +export type I3po4d1m5647ct = { + "hints": Anonymize; +}; +export type I76e3pq7smrso1 = Array>; +export type I17rrlvqs2ftbt = AnonymousEnum<{ + "AssetClaimer": Anonymize; +}>; +export type I2adkav4nfpltp = { + "location": Anonymize; +}; +export type Ibmuil6p3vl83l = { + "origin": Anonymize; + "destination": Anonymize; + "error": Anonymize; + "message_id": FixedSizeBinary<32>; +}; +export type I4hgo1i4dhmd47 = AnonymousEnum<{ + "NotApplicable": undefined; + "Transport": undefined; + "Unroutable": undefined; + "DestinationUnsupported": undefined; + "ExceedsMaxMessageSize": undefined; + "MissingArgument": undefined; + "Fees": undefined; +}>; +export type I7lul91g50ae87 = { + "origin": Anonymize; + "error": Anonymize; + "message_id": FixedSizeBinary<32>; +}; +export type Icl7nl1rfeog3i = { + "origin": Anonymize; + "query_id": bigint; +}; +export type Iasr6pj6shs0fl = { + "query_id": bigint; + "response": Anonymize; +}; +export type I7r6b7145022pp = { + "origin": Anonymize; + "query_id": bigint; + "expected_location"?: Anonymize; +}; +export type Icmrn7bogp28cs = { + "hash": FixedSizeBinary<32>; + "origin": Anonymize; + "assets": XcmVersionedAssets; +}; +export type XcmVersionedAssets = Enum<{ + "V3": Anonymize; + "V4": Anonymize; + "V5": Anonymize; +}>; +export declare const XcmVersionedAssets: GetEnum; +export type I7m9b5plj4h5ot = { + "destination": Anonymize; + "result": number; + "cost": Anonymize; + "message_id": FixedSizeBinary<32>; +}; +export type I9kt8c221c83ln = { + "location": Anonymize; + "version": number; +}; +export type I9onhk772nfs4f = { + "location": Anonymize; + "query_id": bigint; + "error": Anonymize; +}; +export type I3l6bnksrmt56r = { + "location": XcmVersionedLocation; + "query_id": bigint; +}; +export type Idh09k0l2pmdcg = { + "origin": Anonymize; + "query_id": bigint; + "expected_querier": Anonymize; + "maybe_actual_querier"?: Anonymize; +}; +export type I7uoiphbm0tj4r = { + "destination": Anonymize; + "cost": Anonymize; + "message_id": FixedSizeBinary<32>; +}; +export type I512p1n7qt24l8 = { + "paying": Anonymize; + "fees": Anonymize; +}; +export type I3gghqnh2mj0is = { + "aliaser": Anonymize; + "target": Anonymize; + "expiry"?: Anonymize; +}; +export type I6iv852roh6t3h = { + "aliaser": Anonymize; + "target": Anonymize; +}; +export type I9oc2o6itbiopq = { + "target": Anonymize; +}; +export type I1dcjapt414ijf = AnonymousEnum<{ + "AssetRateCreated": Anonymize; + "AssetRateRemoved": Anonymize; + "AssetRateUpdated": Anonymize; +}>; +export type I9c4d50jrp7as1 = { + "asset_kind": Anonymize; + "rate": bigint; +}; +export type Ifplevr9hp8jo3 = { + "asset_kind": Anonymize; +}; +export type Idrugh2blv81ia = { + "asset_kind": Anonymize; + "old": bigint; + "new": bigint; +}; +export type RootTestingEvent = Enum<{ + /** + *Event dispatched when the trigger_defensive extrinsic is called. + */ + "DefensiveTestCall": undefined; +}>; +export declare const RootTestingEvent: GetEnum; +export type Id1mj65apaj4j4 = AnonymousEnum<{ + /** + *A meta transaction has been dispatched. + * + *Contains the dispatch result of the meta transaction along with post-dispatch + *information. + */ + "Dispatched": Anonymize; +}>; +export type Ibpfoajp33bp2j = { + "result": Anonymize; +}; +export type PolkadotRuntimeCommonIdentityMigratorEvent = Enum<{ + /** + *The identity and all sub accounts were reaped for `who`. + */ + "IdentityReaped": Anonymize; + /** + *The deposits held for `who` were updated. `identity` is the new deposit held for + *identity info, and `subs` is the new deposit held for the sub-accounts. + */ + "DepositUpdated": Anonymize; +}>; +export declare const PolkadotRuntimeCommonIdentityMigratorEvent: GetEnum; +export type I4i3u9uui7ktsd = { + "who": SS58String; + "identity": bigint; + "subs": bigint; +}; +export type I9b2c0tao13nvd = Array>; +export type Ia5rn38d6qcld = { + "id": Anonymize; + "amount": bigint; +}; +export type I82c9mmj85gqil = AnonymousEnum<{ + "Staking": Anonymize; + "Session": Anonymize; + "Preimage": PreimagePalletHoldReason; + "DelegatedStaking": Anonymize; + "XcmPallet": Anonymize; +}>; +export type Icbapambb5rug3 = AnonymousEnum<{ + "Staking": undefined; +}>; +export type I6bkr3dqv753nc = AnonymousEnum<{ + "Keys": undefined; +}>; +export type Ib6ve2drlnapui = AnonymousEnum<{ + "StakingDelegation": undefined; +}>; +export type Ideiof6273rsoe = AnonymousEnum<{ + "AuthorizeAlias": undefined; +}>; +export type I4ftk0glls7946 = { + "judgements": Anonymize; + "deposit": bigint; + "info": Anonymize; +}; +export type I5lbssihti472g = Array>; +export type I7uhmpkgp9kq6 = [number, Anonymize]; +export type IdentityJudgement = Enum<{ + "Unknown": undefined; + "FeePaid": bigint; + "Reasonable": undefined; + "KnownGood": undefined; + "OutOfDate": undefined; + "LowQuality": undefined; + "Erroneous": undefined; +}>; +export declare const IdentityJudgement: GetEnum; +export type I1o57snqt6f4v5 = { + "additional": Anonymize; + "display": Anonymize; + "legal": Anonymize; + "web": Anonymize; + "riot": Anonymize; + "email": Anonymize; + "pgp_fingerprint"?: Anonymize; + "image": Anonymize; + "twitter": Anonymize; +}; +export type I9rp1vd8cfo0na = Array>; +export type Ifqv6alck9pqqn = FixedSizeArray<2, Anonymize>; +export type IdentityData = Enum<{ + "None": undefined; + "Raw0": undefined; + "Raw1": number; + "Raw2": FixedSizeBinary<2>; + "Raw3": FixedSizeBinary<3>; + "Raw4": FixedSizeBinary<4>; + "Raw5": FixedSizeBinary<5>; + "Raw6": FixedSizeBinary<6>; + "Raw7": FixedSizeBinary<7>; + "Raw8": FixedSizeBinary<8>; + "Raw9": FixedSizeBinary<9>; + "Raw10": FixedSizeBinary<10>; + "Raw11": FixedSizeBinary<11>; + "Raw12": FixedSizeBinary<12>; + "Raw13": FixedSizeBinary<13>; + "Raw14": FixedSizeBinary<14>; + "Raw15": FixedSizeBinary<15>; + "Raw16": FixedSizeBinary<16>; + "Raw17": FixedSizeBinary<17>; + "Raw18": FixedSizeBinary<18>; + "Raw19": FixedSizeBinary<19>; + "Raw20": FixedSizeBinary<20>; + "Raw21": FixedSizeBinary<21>; + "Raw22": FixedSizeBinary<22>; + "Raw23": FixedSizeBinary<23>; + "Raw24": FixedSizeBinary<24>; + "Raw25": FixedSizeBinary<25>; + "Raw26": FixedSizeBinary<26>; + "Raw27": FixedSizeBinary<27>; + "Raw28": FixedSizeBinary<28>; + "Raw29": FixedSizeBinary<29>; + "Raw30": FixedSizeBinary<30>; + "Raw31": FixedSizeBinary<31>; + "Raw32": FixedSizeBinary<32>; + "BlakeTwo256": FixedSizeBinary<32>; + "Sha256": FixedSizeBinary<32>; + "Keccak256": FixedSizeBinary<32>; + "ShaThree256": FixedSizeBinary<32>; +}>; +export declare const IdentityData: GetEnum; +export type If7b8240vgt2q5 = (FixedSizeBinary<20>) | undefined; +export type I910puuahutflf = [SS58String, Anonymize]; +export type I4nfjdef0ibh44 = [bigint, Anonymize]; +export type I74af64m08r6as = Array>; +export type I48v3sekdprq30 = (Anonymize) | undefined; +export type Icj8lp9f0lq0bm = { + "account": SS58String; + "fee": bigint; + "fields": bigint; +}; +export type Ic8ann3kre6vdm = { + "account_id": SS58String; + "allocation": number; +}; +export type I1j72qfgdejqsv = { + "owner": SS58String; + "provider": Anonymize; +}; +export type Idib8jf3ve40bj = AnonymousEnum<{ + "Allocation": undefined; + "AuthorityDeposit": bigint; + "System": undefined; +}>; +export type I60biiepd74113 = [SS58String, number, Anonymize]; +export type I3c4cvcot9ouo7 = Array>; +export type Icqu5g31ugcpah = (Anonymize) | undefined; +export type Idi7ib6brboos3 = { + "maybe_id"?: Anonymize; + "priority": number; + "call": PreimagesBounded; + "maybe_periodic"?: Anonymize; + "origin": Anonymize; +}; +export type I16qqgglq4ega1 = AnonymousEnum<{ + "system": Anonymize; + "Origins": WestendRuntimeGovernanceOriginsPalletCustomOriginsOrigin; + "ParachainsOrigin": ParachainsOrigin; + "XcmPallet": Anonymize; +}>; +export type I9gqitj4t615g3 = AnonymousEnum<{ + "Root": undefined; + "Signed": SS58String; + "None": undefined; + "Authorized": undefined; +}>; +export type WestendRuntimeGovernanceOriginsPalletCustomOriginsOrigin = Enum<{ + "StakingAdmin": undefined; + "Treasurer": undefined; + "FellowshipAdmin": undefined; + "GeneralAdmin": undefined; + "AuctionAdmin": undefined; + "LeaseAdmin": undefined; + "ReferendumCanceller": undefined; + "ReferendumKiller": undefined; + "SmallTipper": undefined; + "BigTipper": undefined; + "SmallSpender": undefined; + "MediumSpender": undefined; + "BigSpender": undefined; + "WhitelistedCaller": undefined; + "FellowshipInitiates": undefined; + "Fellows": undefined; + "FellowshipExperts": undefined; + "FellowshipMasters": undefined; + "Fellowship1Dan": undefined; + "Fellowship2Dan": undefined; + "Fellowship3Dan": undefined; + "Fellowship4Dan": undefined; + "Fellowship5Dan": undefined; + "Fellowship6Dan": undefined; + "Fellowship7Dan": undefined; + "Fellowship8Dan": undefined; + "Fellowship9Dan": undefined; +}>; +export declare const WestendRuntimeGovernanceOriginsPalletCustomOriginsOrigin: GetEnum; +export type Icvilmd7qu30i4 = AnonymousEnum<{ + "Xcm": Anonymize; + "Response": Anonymize; +}>; +export type I7rqj1laarti4a = [Anonymize, bigint]; +export type I5dennur9ngn8b = Array>; +export type Ifgv29lnven1n7 = { + "delegate": SS58String; + "proxy_type": Anonymize; + "delay": number; +}; +export type If0jlcnakch6k = AnonymousEnum<{ + "Ongoing": Anonymize; + "Approved": Anonymize; + "Rejected": Anonymize; + "Cancelled": Anonymize; + "TimedOut": Anonymize; + "Killed": number; +}>; +export type I7sgjkr7514hq0 = { + "track": number; + "origin": Anonymize; + "proposal": PreimagesBounded; + "enactment": TraitsScheduleDispatchTime; + "submitted": number; + "submission_deposit": Anonymize; + "decision_deposit"?: Anonymize; + "deciding"?: Anonymize; + "tally": Anonymize; + "in_queue": boolean; + "alarm"?: Anonymize; +}; +export type I3s9vvjt0el98d = { + "asset_kind": Anonymize; + "amount": bigint; + "beneficiary": XcmVersionedLocation; + "valid_from": number; + "expire_at": number; + "status": TreasuryPaymentState; +}; +export type I542q009qbgt8k = { + "agent": SS58String; + "amount": bigint; +}; +export type I4e5ujckjq61g8 = { + "payee": SS58String; + "total_delegated": bigint; + "unclaimed_withdrawals": bigint; + "pending_slash": bigint; +}; +export type I2d4k4cqluhq5i = { + "buffer": Anonymize; + "latest_number": number; +}; +export type Iatpn2emmr5i52 = Array>; +export type I2l15hoj5fe0mk = { + "relay_parent": FixedSizeBinary<32>; + "state_root": FixedSizeBinary<32>; + "claim_queue": Anonymize; +}; +export type Ij277dgaqsjje = Array>; +export type I4p3ju2mesd9m1 = [number, Anonymize]; +export type I91e9aiuocql92 = Array>; +export type I1ibeo05ogqsc7 = { + "core": number; + "hash": FixedSizeBinary<32>; + "descriptor": Anonymize; + "commitments": Anonymize; + "availability_votes": { + bytes: Uint8Array; + bitsLen: number; + }; + "backers": { + bytes: Uint8Array; + bitsLen: number; + }; + "relay_parent_number": number; + "backed_in_number": number; + "backing_group": number; +}; +export type Ia1viqq9k85bv1 = { + "session": number; + "backing_validators_per_candidate": Anonymize; + "disputes": Anonymize; +}; +export type I54vphn2b5i7j0 = Array>; +export type I46eo7fu63lvs0 = [Anonymize, Anonymize]; +export type Idp9imcf15rli1 = Array>; +export type I1lbvimkpgjd5 = [number, Anonymize]; +export type I87vihqtpi4hb3 = Array; +export type I5ql12lunltfbi = { + "code_hash": FixedSizeBinary<32>; + "expire_at": number; +}; +export type Ids3ua6tfbgvj0 = { + "keys": Anonymize; + "kind": Anonymize; +}; +export type I9ng4p85mim3lc = AnonymousEnum<{ + "ForInvalidBacked": undefined; + "AgainstValid": undefined; + "ForInvalidApproved": undefined; +}>; +export type I6ucbdbrsslk4l = { + "manager": SS58String; + "period_begin": number; + "period_count": number; + "last_lease"?: Anonymize; + "lease_count": number; +}; +export type Idned7t7knml6b = [number, Anonymize]; +export type I9vjdmm7sufoc = { + "new_validator_set": Anonymize; + "id": number; + "prune_up_to"?: Anonymize; + "leftover": boolean; +}; +export type Ianpaq0u393le8 = AnonymousEnum<{ + "Passive": undefined; + "Buffered": undefined; + "Active": undefined; +}>; +export type Ic11i4hlj9lv1l = Array>; +export type Ic0ma6k4a9k6to = [number, Anonymize]; +export type I86kmkeb6sneu6 = Array>; +export type Ie411bbkajvb2s = [SS58String, Anonymize]; +export type Ioteoc7rlchll = { + "reporter"?: Anonymize; + "slash_fraction": number; +}; +export type Iepbsvlk3qceij = AnonymousEnum<{ + "Active": Anonymize; + "Stuck": undefined; +}>; +export type Iessq0bats6ofh = { + "index": number; + "inner_cursor"?: Anonymize; + "started_at": number; +}; +export type I5qfubnuvrnqn6 = AnonymousEnum<{ + "Pending": Anonymize; + "VersionNotifier": Anonymize; + "Ready": Anonymize; +}>; +export type I8n1p8t37t4406 = { + "responder": XcmVersionedLocation; + "maybe_match_querier"?: Anonymize; + "maybe_notify"?: Anonymize; + "timeout": number; +}; +export type I1k8uk4m0m3gr4 = (XcmVersionedLocation) | undefined; +export type Invrgr8s9n09r = { + "origin": XcmVersionedLocation; + "is_active": boolean; +}; +export type I2ssu86ioj11k3 = { + "response": Anonymize; + "at": number; +}; +export type I9um3bb0cui9cs = AnonymousEnum<{ + "V3": XcmV3Response; + "V4": XcmV4Response; + "V5": Anonymize; +}>; +export type I8t3u2dv73ahbd = [number, XcmVersionedLocation]; +export type Ie0rpl5bahldfk = Array>; +export type I609v0gelr96h6 = [XcmVersionedLocation, number]; +export type I7e5oaj2qi4kl1 = { + "amount": bigint; + "owner": XcmVersionedLocation; + "locker": XcmVersionedLocation; + "consumers": Anonymize; +}; +export type Ie849h3gncgvok = [number, SS58String, XcmVersionedAssetId]; +export type XcmVersionedAssetId = Enum<{ + "V3": XcmV3MultiassetAssetId; + "V4": Anonymize; + "V5": Anonymize; +}>; +export declare const XcmVersionedAssetId: GetEnum; +export type Iat62vud7hlod2 = Array>; +export type I55s5m6u4mntoo = [bigint, XcmVersionedLocation]; +export type Ici7ejds60vj52 = { + "aliasers": Anonymize; +}; +export type I41j3fc5ema929 = Array>; +export type Iegerpi2hl6723 = { + "location": XcmVersionedLocation; + "expiry"?: Anonymize; +}; +export type I4fo08joqmcqnm = { + "spec_name": string; + "impl_name": string; + "authoring_version": number; + "spec_version": number; + "impl_version": number; + "apis": Anonymize; + "transaction_version": number; + "system_version": number; +}; +export type I67ac6i6ihmvpt = AnonymousEnum<{ + /** + *Assign an previously unassigned index. + * + *Payment: `Deposit` is reserved from the sender account. + * + *The dispatch origin for this call must be _Signed_. + * + *- `index`: the index to be claimed. This must not be in use. + * + *Emits `IndexAssigned` if successful. + * + *## Complexity + *- `O(1)`. + */ + "claim": Anonymize; + /** + *Assign an index already owned by the sender to another account. The balance reservation + *is effectively transferred to the new account. + * + *The dispatch origin for this call must be _Signed_. + * + *- `index`: the index to be re-assigned. This must be owned by the sender. + *- `new`: the new owner of the index. This function is a no-op if it is equal to sender. + * + *Emits `IndexAssigned` if successful. + * + *## Complexity + *- `O(1)`. + */ + "transfer": Anonymize; + /** + *Free up an index owned by the sender. + * + *Payment: Any previous deposit placed for the index is unreserved in the sender account. + * + *The dispatch origin for this call must be _Signed_ and the sender must own the index. + * + *- `index`: the index to be freed. This must be owned by the sender. + * + *Emits `IndexFreed` if successful. + * + *## Complexity + *- `O(1)`. + */ + "free": Anonymize; + /** + *Force an index to an account. This doesn't require a deposit. If the index is already + *held, then any deposit is reimbursed to its current owner. + * + *The dispatch origin for this call must be _Root_. + * + *- `index`: the index to be (re-)assigned. + *- `new`: the new owner of the index. This function is a no-op if it is equal to sender. + *- `freeze`: if set to `true`, will freeze the index so it cannot be transferred. + * + *Emits `IndexAssigned` if successful. + * + *## Complexity + *- `O(1)`. + */ + "force_transfer": Anonymize; + /** + *Freeze an index so it will always point to the sender account. This consumes the + *deposit. + * + *The dispatch origin for this call must be _Signed_ and the signing account must have a + *non-frozen account `index`. + * + *- `index`: the index to be frozen in place. + * + *Emits `IndexFrozen` if successful. + * + *## Complexity + *- `O(1)`. + */ + "freeze": Anonymize; + /** + *Poke the deposit reserved for an index. + * + *The dispatch origin for this call must be _Signed_ and the signing account must have a + *non-frozen account `index`. + * + *The transaction fees is waived if the deposit is changed after poking/reconsideration. + * + *- `index`: the index whose deposit is to be poked/reconsidered. + * + *Emits `DepositPoked` if successful. + */ + "poke_deposit": Anonymize; +}>; +export type Icm294co91mkfj = AnonymousEnum<{ + /** + *Take the origin account as a stash and lock up `value` of its balance. `controller` will + *be the account that controls it. + * + *`value` must be more than the `minimum_balance` specified by `T::Currency`. + * + *The dispatch origin for this call must be _Signed_ by the stash account. + * + *Emits `Bonded`. + *## Complexity + *- Independent of the arguments. Moderate complexity. + *- O(1). + *- Three extra DB entries. + * + *NOTE: Two of the storage writes (`Self::bonded`, `Self::payee`) are _never_ cleaned + *unless the `origin` falls below _existential deposit_ (or equal to 0) and gets removed + *as dust. + */ + "bond": Anonymize; + /** + *Add some extra amount that have appeared in the stash `free_balance` into the balance up + *for staking. + * + *The dispatch origin for this call must be _Signed_ by the stash, not the controller. + * + *Use this if there are additional funds in your stash account that you wish to bond. + *Unlike [`bond`](Self::bond) or [`unbond`](Self::unbond) this function does not impose + *any limitation on the amount that can be added. + * + *Emits `Bonded`. + * + *## Complexity + *- Independent of the arguments. Insignificant complexity. + *- O(1). + */ + "bond_extra": Anonymize; + /** + *Schedule a portion of the stash to be unlocked ready for transfer out after the bond + *period ends. If this leaves an amount actively bonded less than + *[`asset::existential_deposit`], then it is increased to the full amount. + * + *The stash may be chilled if the ledger total amount falls to 0 after unbonding. + * + *The dispatch origin for this call must be _Signed_ by the controller, not the stash. + * + *Once the unlock period is done, you can call `withdraw_unbonded` to actually move + *the funds out of management ready for transfer. + * + *No more than a limited number of unlocking chunks (see `MaxUnlockingChunks`) + *can co-exists at the same time. If there are no unlocking chunks slots available + *[`Call::withdraw_unbonded`] is called to remove some of the chunks (if possible). + * + *If a user encounters the `InsufficientBond` error when calling this extrinsic, + *they should call `chill` first in order to free up their bonded funds. + * + *Emits `Unbonded`. + * + *See also [`Call::withdraw_unbonded`]. + */ + "unbond": Anonymize; + /** + *Remove any unlocked chunks from the `unlocking` queue from our management. + * + *This essentially frees up that balance to be used by the stash account to do whatever + *it wants. + * + *The dispatch origin for this call must be _Signed_ by the controller. + * + *Emits `Withdrawn`. + * + *See also [`Call::unbond`]. + * + *## Parameters + * + *- `num_slashing_spans` indicates the number of metadata slashing spans to clear when + *this call results in a complete removal of all the data related to the stash account. + *In this case, the `num_slashing_spans` must be larger or equal to the number of + *slashing spans associated with the stash account in the [`SlashingSpans`] storage type, + *otherwise the call will fail. The call weight is directly proportional to + *`num_slashing_spans`. + * + *## Complexity + *O(S) where S is the number of slashing spans to remove + *NOTE: Weight annotation is the kill scenario, we refund otherwise. + */ + "withdraw_unbonded": Anonymize; + /** + *Declare the desire to validate for the origin controller. + * + *Effects will be felt at the beginning of the next era. + * + *The dispatch origin for this call must be _Signed_ by the controller, not the stash. + */ + "validate": Anonymize; + /** + *Declare the desire to nominate `targets` for the origin controller. + * + *Effects will be felt at the beginning of the next era. + * + *The dispatch origin for this call must be _Signed_ by the controller, not the stash. + * + *## Complexity + *- The transaction's complexity is proportional to the size of `targets` (N) + *which is capped at CompactAssignments::LIMIT (T::MaxNominations). + *- Both the reads and writes follow a similar pattern. + */ + "nominate": Anonymize; + /** + *Declare no desire to either validate or nominate. + * + *Effects will be felt at the beginning of the next era. + * + *The dispatch origin for this call must be _Signed_ by the controller, not the stash. + * + *## Complexity + *- Independent of the arguments. Insignificant complexity. + *- Contains one read. + *- Writes are limited to the `origin` account key. + */ + "chill": undefined; + /** + *(Re-)set the payment target for a controller. + * + *Effects will be felt instantly (as soon as this function is completed successfully). + * + *The dispatch origin for this call must be _Signed_ by the controller, not the stash. + * + *## Complexity + *- O(1) + *- Independent of the arguments. Insignificant complexity. + *- Contains a limited number of reads. + *- Writes are limited to the `origin` account key. + *--------- + */ + "set_payee": Anonymize; + /** + *(Re-)sets the controller of a stash to the stash itself. This function previously + *accepted a `controller` argument to set the controller to an account other than the + *stash itself. This functionality has now been removed, now only setting the controller + *to the stash, if it is not already. + * + *Effects will be felt instantly (as soon as this function is completed successfully). + * + *The dispatch origin for this call must be _Signed_ by the stash, not the controller. + * + *## Complexity + *O(1) + *- Independent of the arguments. Insignificant complexity. + *- Contains a limited number of reads. + *- Writes are limited to the `origin` account key. + */ + "set_controller": undefined; + /** + *Sets the ideal number of validators. + * + *The dispatch origin must be Root. + * + *## Complexity + *O(1) + */ + "set_validator_count": Anonymize; + /** + *Increments the ideal number of validators up to maximum of + *`ElectionProviderBase::MaxWinners`. + * + *The dispatch origin must be Root. + * + *## Complexity + *Same as [`Self::set_validator_count`]. + */ + "increase_validator_count": Anonymize; + /** + *Scale up the ideal number of validators by a factor up to maximum of + *`ElectionProviderBase::MaxWinners`. + * + *The dispatch origin must be Root. + * + *## Complexity + *Same as [`Self::set_validator_count`]. + */ + "scale_validator_count": Anonymize; + /** + *Force there to be no new eras indefinitely. + * + *The dispatch origin must be Root. + * + *# Warning + * + *The election process starts multiple blocks before the end of the era. + *Thus the election process may be ongoing when this is called. In this case the + *election will continue until the next era is triggered. + * + *## Complexity + *- No arguments. + *- Weight: O(1) + */ + "force_no_eras": undefined; + /** + *Force there to be a new era at the end of the next session. After this, it will be + *reset to normal (non-forced) behaviour. + * + *The dispatch origin must be Root. + * + *# Warning + * + *The election process starts multiple blocks before the end of the era. + *If this is called just before a new era is triggered, the election process may not + *have enough blocks to get a result. + * + *## Complexity + *- No arguments. + *- Weight: O(1) + */ + "force_new_era": undefined; + /** + *Set the validators who cannot be slashed (if any). + * + *The dispatch origin must be Root. + */ + "set_invulnerables": Anonymize; + /** + *Force a current staker to become completely unstaked, immediately. + * + *The dispatch origin must be Root. + * + *## Parameters + * + *- `num_slashing_spans`: Refer to comments on [`Call::withdraw_unbonded`] for more + *details. + */ + "force_unstake": Anonymize; + /** + *Force there to be a new era at the end of sessions indefinitely. + * + *The dispatch origin must be Root. + * + *# Warning + * + *The election process starts multiple blocks before the end of the era. + *If this is called just before a new era is triggered, the election process may not + *have enough blocks to get a result. + */ + "force_new_era_always": undefined; + /** + *Cancel enactment of a deferred slash. + * + *Can be called by the `T::AdminOrigin`. + * + *Parameters: era and indices of the slashes for that era to kill. + *They **must** be sorted in ascending order, *and* unique. + */ + "cancel_deferred_slash": Anonymize; + /** + *Pay out next page of the stakers behind a validator for the given era. + * + *- `validator_stash` is the stash account of the validator. + *- `era` may be any era between `[current_era - history_depth; current_era]`. + * + *The origin of this call must be _Signed_. Any account can call this function, even if + *it is not one of the stakers. + * + *The reward payout could be paged in case there are too many nominators backing the + *`validator_stash`. This call will payout unpaid pages in an ascending order. To claim a + *specific page, use `payout_stakers_by_page`.` + * + *If all pages are claimed, it returns an error `InvalidPage`. + */ + "payout_stakers": Anonymize; + /** + *Rebond a portion of the stash scheduled to be unlocked. + * + *The dispatch origin must be signed by the controller. + * + *## Complexity + *- Time complexity: O(L), where L is unlocking chunks + *- Bounded by `MaxUnlockingChunks`. + */ + "rebond": Anonymize; + /** + *Remove all data structures concerning a staker/stash once it is at a state where it can + *be considered `dust` in the staking system. The requirements are: + * + *1. the `total_balance` of the stash is below existential deposit. + *2. or, the `ledger.total` of the stash is below existential deposit. + *3. or, existential deposit is zero and either `total_balance` or `ledger.total` is zero. + * + *The former can happen in cases like a slash; the latter when a fully unbonded account + *is still receiving staking rewards in `RewardDestination::Staked`. + * + *It can be called by anyone, as long as `stash` meets the above requirements. + * + *Refunds the transaction fees upon successful execution. + * + *## Parameters + * + *- `num_slashing_spans`: Refer to comments on [`Call::withdraw_unbonded`] for more + *details. + */ + "reap_stash": Anonymize; + /** + *Remove the given nominations from the calling validator. + * + *Effects will be felt at the beginning of the next era. + * + *The dispatch origin for this call must be _Signed_ by the controller, not the stash. + * + *- `who`: A list of nominator stash accounts who are nominating this validator which + * should no longer be nominating this validator. + * + *Note: Making this call only makes sense if you first set the validator preferences to + *block any further nominations. + */ + "kick": Anonymize; + /** + *Update the various staking configurations . + * + ** `min_nominator_bond`: The minimum active bond needed to be a nominator. + ** `min_validator_bond`: The minimum active bond needed to be a validator. + ** `max_nominator_count`: The max number of users who can be a nominator at once. When + * set to `None`, no limit is enforced. + ** `max_validator_count`: The max number of users who can be a validator at once. When + * set to `None`, no limit is enforced. + ** `chill_threshold`: The ratio of `max_nominator_count` or `max_validator_count` which + * should be filled in order for the `chill_other` transaction to work. + ** `min_commission`: The minimum amount of commission that each validators must maintain. + * This is checked only upon calling `validate`. Existing validators are not affected. + * + *RuntimeOrigin must be Root to call this function. + * + *NOTE: Existing nominators and validators will not be affected by this update. + *to kick people under the new limits, `chill_other` should be called. + */ + "set_staking_configs": Anonymize; + /** + *Declare a `controller` to stop participating as either a validator or nominator. + * + *Effects will be felt at the beginning of the next era. + * + *The dispatch origin for this call must be _Signed_, but can be called by anyone. + * + *If the caller is the same as the controller being targeted, then no further checks are + *enforced, and this function behaves just like `chill`. + * + *If the caller is different than the controller being targeted, the following conditions + *must be met: + * + ** `controller` must belong to a nominator who has become non-decodable, + * + *Or: + * + ** A `ChillThreshold` must be set and checked which defines how close to the max + * nominators or validators we must reach before users can start chilling one-another. + ** A `MaxNominatorCount` and `MaxValidatorCount` must be set which is used to determine + * how close we are to the threshold. + ** A `MinNominatorBond` and `MinValidatorBond` must be set and checked, which determines + * if this is a person that should be chilled because they have not met the threshold + * bond required. + * + *This can be helpful if bond requirements are updated, and we need to remove old users + *who do not satisfy these requirements. + */ + "chill_other": Anonymize; + /** + *Force a validator to have at least the minimum commission. This will not affect a + *validator who already has a commission greater than or equal to the minimum. Any account + *can call this. + */ + "force_apply_min_commission": Anonymize; + /** + *Sets the minimum amount of commission that each validators must maintain. + * + *This call has lower privilege requirements than `set_staking_config` and can be called + *by the `T::AdminOrigin`. Root can always call this. + */ + "set_min_commission": Anonymize; + /** + *Pay out a page of the stakers behind a validator for the given era and page. + * + *- `validator_stash` is the stash account of the validator. + *- `era` may be any era between `[current_era - history_depth; current_era]`. + *- `page` is the page index of nominators to pay out with value between 0 and + * `num_nominators / T::MaxExposurePageSize`. + * + *The origin of this call must be _Signed_. Any account can call this function, even if + *it is not one of the stakers. + * + *If a validator has more than [`Config::MaxExposurePageSize`] nominators backing + *them, then the list of nominators is paged, with each page being capped at + *[`Config::MaxExposurePageSize`.] If a validator has more than one page of nominators, + *the call needs to be made for each page separately in order for all the nominators + *backing a validator to receive the reward. The nominators are not sorted across pages + *and so it should not be assumed the highest staker would be on the topmost page and vice + *versa. If rewards are not claimed in [`Config::HistoryDepth`] eras, they are lost. + */ + "payout_stakers_by_page": Anonymize; + /** + *Migrates an account's `RewardDestination::Controller` to + *`RewardDestination::Account(controller)`. + * + *Effects will be felt instantly (as soon as this function is completed successfully). + * + *This will waive the transaction fee if the `payee` is successfully migrated. + */ + "update_payee": Anonymize; + /** + *Updates a batch of controller accounts to their corresponding stash account if they are + *not the same. Ignores any controller accounts that do not exist, and does not operate if + *the stash and controller are already the same. + * + *Effects will be felt instantly (as soon as this function is completed successfully). + * + *The dispatch origin must be `T::AdminOrigin`. + */ + "deprecate_controller_batch": Anonymize; + /** + *Restores the state of a ledger which is in an inconsistent state. + * + *The requirements to restore a ledger are the following: + ** The stash is bonded; or + ** The stash is not bonded but it has a staking lock left behind; or + ** If the stash has an associated ledger and its state is inconsistent; or + ** If the ledger is not corrupted *but* its staking lock is out of sync. + * + *The `maybe_*` input parameters will overwrite the corresponding data and metadata of the + *ledger associated with the stash. If the input parameters are not set, the ledger will + *be reset values from on-chain state. + */ + "restore_ledger": Anonymize; + /** + *Removes the legacy Staking locks if they exist. + * + *This removes the legacy lock on the stake with [`Config::OldCurrency`] and creates a + *hold on it if needed. If all stake cannot be held, the best effort is made to hold as + *much as possible. The remaining stake is forced withdrawn from the ledger. + * + *The fee is waived if the migration is successful. + */ + "migrate_currency": Anonymize; + /** + *This function allows governance to manually slash a validator and is a + ***fallback mechanism**. + * + *The dispatch origin must be `T::AdminOrigin`. + * + *## Parameters + *- `validator_stash` - The stash account of the validator to slash. + *- `era` - The era in which the validator was in the active set. + *- `slash_fraction` - The percentage of the stake to slash, expressed as a Perbill. + * + *## Behavior + * + *The slash will be applied using the standard slashing mechanics, respecting the + *configured `SlashDeferDuration`. + * + *This means: + *- If the validator was already slashed by a higher percentage for the same era, this + * slash will have no additional effect. + *- If the validator was previously slashed by a lower percentage, only the difference + * will be applied. + *- The slash will be deferred by `SlashDeferDuration` eras before being enacted. + */ + "manual_slash": Anonymize; +}>; +export type Ic5njrpnvi3f8g = { + "validator_stash": SS58String; + "era": number; + "slash_fraction": number; +}; +export type I8qsbn37sql1ok = AnonymousEnum<{ + /** + *Send a batch of dispatch calls. + * + *May be called from any origin except `None`. + * + *- `calls`: The calls to be dispatched from the same origin. The number of call must not + * exceed the constant: `batched_calls_limit` (available in constant metadata). + * + *If origin is root then the calls are dispatched without checking origin filter. (This + *includes bypassing `frame_system::Config::BaseCallFilter`). + * + *## Complexity + *- O(C) where C is the number of calls to be batched. + * + *This will return `Ok` in all circumstances. To determine the success of the batch, an + *event is deposited. If a call failed and the batch was interrupted, then the + *`BatchInterrupted` event is deposited, along with the number of successful calls made + *and the error of the failed call. If all were successful, then the `BatchCompleted` + *event is deposited. + */ + "batch": Anonymize; + /** + *Send a call through an indexed pseudonym of the sender. + * + *Filter from origin are passed along. The call will be dispatched with an origin which + *use the same filter as the origin of this call. + * + *NOTE: If you need to ensure that any account-based filtering is not honored (i.e. + *because you expect `proxy` to have been used prior in the call stack and you do not want + *the call restrictions to apply to any sub-accounts), then use `as_multi_threshold_1` + *in the Multisig pallet instead. + * + *NOTE: Prior to version *12, this was called `as_limited_sub`. + * + *The dispatch origin for this call must be _Signed_. + */ + "as_derivative": Anonymize; + /** + *Send a batch of dispatch calls and atomically execute them. + *The whole transaction will rollback and fail if any of the calls failed. + * + *May be called from any origin except `None`. + * + *- `calls`: The calls to be dispatched from the same origin. The number of call must not + * exceed the constant: `batched_calls_limit` (available in constant metadata). + * + *If origin is root then the calls are dispatched without checking origin filter. (This + *includes bypassing `frame_system::Config::BaseCallFilter`). + * + *## Complexity + *- O(C) where C is the number of calls to be batched. + */ + "batch_all": Anonymize; + /** + *Dispatches a function call with a provided origin. + * + *The dispatch origin for this call must be _Root_. + * + *## Complexity + *- O(1). + */ + "dispatch_as": Anonymize; + /** + *Send a batch of dispatch calls. + *Unlike `batch`, it allows errors and won't interrupt. + * + *May be called from any origin except `None`. + * + *- `calls`: The calls to be dispatched from the same origin. The number of call must not + * exceed the constant: `batched_calls_limit` (available in constant metadata). + * + *If origin is root then the calls are dispatch without checking origin filter. (This + *includes bypassing `frame_system::Config::BaseCallFilter`). + * + *## Complexity + *- O(C) where C is the number of calls to be batched. + */ + "force_batch": Anonymize; + /** + *Dispatch a function call with a specified weight. + * + *This function does not check the weight of the call, and instead allows the + *Root origin to specify the weight of the call. + * + *The dispatch origin for this call must be _Root_. + */ + "with_weight": Anonymize; + /** + *Dispatch a fallback call in the event the main call fails to execute. + *May be called from any origin except `None`. + * + *This function first attempts to dispatch the `main` call. + *If the `main` call fails, the `fallback` is attemted. + *if the fallback is successfully dispatched, the weights of both calls + *are accumulated and an event containing the main call error is deposited. + * + *In the event of a fallback failure the whole call fails + *with the weights returned. + * + *- `main`: The main call to be dispatched. This is the primary action to execute. + *- `fallback`: The fallback call to be dispatched in case the `main` call fails. + * + *## Dispatch Logic + *- If the origin is `root`, both the main and fallback calls are executed without + * applying any origin filters. + *- If the origin is not `root`, the origin filter is applied to both the `main` and + * `fallback` calls. + * + *## Use Case + *- Some use cases might involve submitting a `batch` type call in either main, fallback + * or both. + */ + "if_else": Anonymize; + /** + *Dispatches a function call with a provided origin. + * + *Almost the same as [`Pallet::dispatch_as`] but forwards any error of the inner call. + * + *The dispatch origin for this call must be _Root_. + */ + "dispatch_as_fallible": Anonymize; +}>; +export type I899s3bea07uhp = { + "calls": Anonymize; +}; +export type I2piathv886kr8 = Array; +export type Ien4lr4fudcv6n = { + "index": number; + "call": TxCallData; +}; +export type If4vg1nqgsug9f = { + "as_origin": Anonymize; + "call": TxCallData; +}; +export type I8jelntdlnkiac = { + "call": TxCallData; + "weight": Anonymize; +}; +export type I744ski63ogn94 = { + "main": TxCallData; + "fallback": TxCallData; +}; +export type Iceqdqk5ub0l9g = AnonymousEnum<{ + /** + *Add a registrar to the system. + * + *The dispatch origin for this call must be `T::RegistrarOrigin`. + * + *- `account`: the account of the registrar. + * + *Emits `RegistrarAdded` if successful. + */ + "add_registrar": Anonymize; + /** + *Set an account's identity information and reserve the appropriate deposit. + * + *If the account already has identity information, the deposit is taken as part payment + *for the new deposit. + * + *The dispatch origin for this call must be _Signed_. + * + *- `info`: The identity information. + * + *Emits `IdentitySet` if successful. + */ + "set_identity": Anonymize; + /** + *Set the sub-accounts of the sender. + * + *Payment: Any aggregate balance reserved by previous `set_subs` calls will be returned + *and an amount `SubAccountDeposit` will be reserved for each item in `subs`. + * + *The dispatch origin for this call must be _Signed_ and the sender must have a registered + *identity. + * + *- `subs`: The identity's (new) sub-accounts. + */ + "set_subs": Anonymize; + /** + *Clear an account's identity info and all sub-accounts and return all deposits. + * + *Payment: All reserved balances on the account are returned. + * + *The dispatch origin for this call must be _Signed_ and the sender must have a registered + *identity. + * + *Emits `IdentityCleared` if successful. + */ + "clear_identity": undefined; + /** + *Request a judgement from a registrar. + * + *Payment: At most `max_fee` will be reserved for payment to the registrar if judgement + *given. + * + *The dispatch origin for this call must be _Signed_ and the sender must have a + *registered identity. + * + *- `reg_index`: The index of the registrar whose judgement is requested. + *- `max_fee`: The maximum fee that may be paid. This should just be auto-populated as: + * + *```nocompile + *Registrars::::get().get(reg_index).unwrap().fee + *``` + * + *Emits `JudgementRequested` if successful. + */ + "request_judgement": Anonymize; + /** + *Cancel a previous request. + * + *Payment: A previously reserved deposit is returned on success. + * + *The dispatch origin for this call must be _Signed_ and the sender must have a + *registered identity. + * + *- `reg_index`: The index of the registrar whose judgement is no longer requested. + * + *Emits `JudgementUnrequested` if successful. + */ + "cancel_request": Anonymize; + /** + *Set the fee required for a judgement to be requested from a registrar. + * + *The dispatch origin for this call must be _Signed_ and the sender must be the account + *of the registrar whose index is `index`. + * + *- `index`: the index of the registrar whose fee is to be set. + *- `fee`: the new fee. + */ + "set_fee": Anonymize; + /** + *Change the account associated with a registrar. + * + *The dispatch origin for this call must be _Signed_ and the sender must be the account + *of the registrar whose index is `index`. + * + *- `index`: the index of the registrar whose fee is to be set. + *- `new`: the new account ID. + */ + "set_account_id": Anonymize; + /** + *Set the field information for a registrar. + * + *The dispatch origin for this call must be _Signed_ and the sender must be the account + *of the registrar whose index is `index`. + * + *- `index`: the index of the registrar whose fee is to be set. + *- `fields`: the fields that the registrar concerns themselves with. + */ + "set_fields": Anonymize; + /** + *Provide a judgement for an account's identity. + * + *The dispatch origin for this call must be _Signed_ and the sender must be the account + *of the registrar whose index is `reg_index`. + * + *- `reg_index`: the index of the registrar whose judgement is being made. + *- `target`: the account whose identity the judgement is upon. This must be an account + * with a registered identity. + *- `judgement`: the judgement of the registrar of index `reg_index` about `target`. + *- `identity`: The hash of the [`IdentityInformationProvider`] for that the judgement is + * provided. + * + *Note: Judgements do not apply to a username. + * + *Emits `JudgementGiven` if successful. + */ + "provide_judgement": Anonymize; + /** + *Remove an account's identity and sub-account information and slash the deposits. + * + *Payment: Reserved balances from `set_subs` and `set_identity` are slashed and handled by + *`Slash`. Verification request deposits are not returned; they should be cancelled + *manually using `cancel_request`. + * + *The dispatch origin for this call must match `T::ForceOrigin`. + * + *- `target`: the account whose identity the judgement is upon. This must be an account + * with a registered identity. + * + *Emits `IdentityKilled` if successful. + */ + "kill_identity": Anonymize; + /** + *Add the given account to the sender's subs. + * + *Payment: Balance reserved by a previous `set_subs` call for one sub will be repatriated + *to the sender. + * + *The dispatch origin for this call must be _Signed_ and the sender must have a registered + *sub identity of `sub`. + */ + "add_sub": Anonymize; + /** + *Alter the associated name of the given sub-account. + * + *The dispatch origin for this call must be _Signed_ and the sender must have a registered + *sub identity of `sub`. + */ + "rename_sub": Anonymize; + /** + *Remove the given account from the sender's subs. + * + *Payment: Balance reserved by a previous `set_subs` call for one sub will be repatriated + *to the sender. + * + *The dispatch origin for this call must be _Signed_ and the sender must have a registered + *sub identity of `sub`. + */ + "remove_sub": Anonymize; + /** + *Remove the sender as a sub-account. + * + *Payment: Balance reserved by a previous `set_subs` call for one sub will be repatriated + *to the sender (*not* the original depositor). + * + *The dispatch origin for this call must be _Signed_ and the sender must have a registered + *super-identity. + * + *NOTE: This should not normally be used, but is provided in the case that the non- + *controller of an account is maliciously registered as a sub-account. + */ + "quit_sub": undefined; + /** + *Add an `AccountId` with permission to grant usernames with a given `suffix` appended. + * + *The authority can grant up to `allocation` usernames. To top up the allocation or + *change the account used to grant usernames, this call can be used with the updated + *parameters to overwrite the existing configuration. + */ + "add_username_authority": Anonymize; + /** + *Remove `authority` from the username authorities. + */ + "remove_username_authority": Anonymize; + /** + *Set the username for `who`. Must be called by a username authority. + * + *If `use_allocation` is set, the authority must have a username allocation available to + *spend. Otherwise, the authority will need to put up a deposit for registering the + *username. + * + *Users can either pre-sign their usernames or + *accept them later. + * + *Usernames must: + * - Only contain lowercase ASCII characters or digits. + * - When combined with the suffix of the issuing authority be _less than_ the + * `MaxUsernameLength`. + */ + "set_username_for": Anonymize; + /** + *Accept a given username that an `authority` granted. The call must include the full + *username, as in `username.suffix`. + */ + "accept_username": Anonymize; + /** + *Remove an expired username approval. The username was approved by an authority but never + *accepted by the user and must now be beyond its expiration. The call must include the + *full username, as in `username.suffix`. + */ + "remove_expired_approval": Anonymize; + /** + *Set a given username as the primary. The username should include the suffix. + */ + "set_primary_username": Anonymize; + /** + *Start the process of removing a username by placing it in the unbinding usernames map. + *Once the grace period has passed, the username can be deleted by calling + *[remove_username](crate::Call::remove_username). + */ + "unbind_username": Anonymize; + /** + *Permanently delete a username which has been unbinding for longer than the grace period. + *Caller is refunded the fee if the username expired and the removal was successful. + */ + "remove_username": Anonymize; + /** + *Call with [ForceOrigin](crate::Config::ForceOrigin) privileges which deletes a username + *and slashes any deposit associated with it. + */ + "kill_username": Anonymize; +}>; +export type I2kds5jji7slh8 = { + "info": Anonymize; +}; +export type Ia9mkdf6l44shb = { + "subs": Anonymize; +}; +export type I2ugvgusn08dsq = Array>; +export type I9l2s4klu0831o = { + "reg_index": number; + "max_fee": bigint; +}; +export type I2ctrt5nqb8o7c = { + "reg_index": number; +}; +export type I711qahikocb1c = { + "index": number; + "fee": bigint; +}; +export type Id6gojh30v9ib2 = { + "index": number; + "fields": bigint; +}; +export type Ide1bahhh47lj9 = { + "reg_index": number; + "target": MultiAddress; + "judgement": Anonymize; + "identity": FixedSizeBinary<32>; +}; +export type Ic68lsi7chpv5k = { + "sub": MultiAddress; + "data": Anonymize; +}; +export type Iek0boln8pgnko = { + "sub": MultiAddress; +}; +export type I452bkd71b385t = { + "authority": MultiAddress; + "suffix": Binary; + "allocation": number; +}; +export type Ie83f0p0ke1f4u = { + "suffix": Binary; + "authority": MultiAddress; +}; +export type I93hi4ed10h5sc = { + "who": MultiAddress; + "username": Binary; + "signature"?: Anonymize; + "use_allocation": boolean; +}; +export type Ibk5qisar4o6r6 = AnonymousEnum<{ + /** + *Send a call through a recovered account. + * + *The dispatch origin for this call must be _Signed_ and registered to + *be able to make calls on behalf of the recovered account. + * + *Parameters: + *- `account`: The recovered account you want to make a call on-behalf-of. + *- `call`: The call you want to make with the recovered account. + */ + "as_recovered": Anonymize; + /** + *Allow ROOT to bypass the recovery process and set a rescuer account + *for a lost account directly. + * + *The dispatch origin for this call must be _ROOT_. + * + *Parameters: + *- `lost`: The "lost account" to be recovered. + *- `rescuer`: The "rescuer account" which can call as the lost account. + */ + "set_recovered": Anonymize; + /** + *Create a recovery configuration for your account. This makes your account recoverable. + * + *Payment: `ConfigDepositBase` + `FriendDepositFactor` * #_of_friends balance + *will be reserved for storing the recovery configuration. This deposit is returned + *in full when the user calls `remove_recovery`. + * + *The dispatch origin for this call must be _Signed_. + * + *Parameters: + *- `friends`: A list of friends you trust to vouch for recovery attempts. Should be + * ordered and contain no duplicate values. + *- `threshold`: The number of friends that must vouch for a recovery attempt before the + * account can be recovered. Should be less than or equal to the length of the list of + * friends. + *- `delay_period`: The number of blocks after a recovery attempt is initialized that + * needs to pass before the account can be recovered. + */ + "create_recovery": Anonymize; + /** + *Initiate the process for recovering a recoverable account. + * + *Payment: `RecoveryDeposit` balance will be reserved for initiating the + *recovery process. This deposit will always be repatriated to the account + *trying to be recovered. See `close_recovery`. + * + *The dispatch origin for this call must be _Signed_. + * + *Parameters: + *- `account`: The lost account that you want to recover. This account needs to be + * recoverable (i.e. have a recovery configuration). + */ + "initiate_recovery": Anonymize; + /** + *Allow a "friend" of a recoverable account to vouch for an active recovery + *process for that account. + * + *The dispatch origin for this call must be _Signed_ and must be a "friend" + *for the recoverable account. + * + *Parameters: + *- `lost`: The lost account that you want to recover. + *- `rescuer`: The account trying to rescue the lost account that you want to vouch for. + * + *The combination of these two parameters must point to an active recovery + *process. + */ + "vouch_recovery": Anonymize; + /** + *Allow a successful rescuer to claim their recovered account. + * + *The dispatch origin for this call must be _Signed_ and must be a "rescuer" + *who has successfully completed the account recovery process: collected + *`threshold` or more vouches, waited `delay_period` blocks since initiation. + * + *Parameters: + *- `account`: The lost account that you want to claim has been successfully recovered by + * you. + */ + "claim_recovery": Anonymize; + /** + *As the controller of a recoverable account, close an active recovery + *process for your account. + * + *Payment: By calling this function, the recoverable account will receive + *the recovery deposit `RecoveryDeposit` placed by the rescuer. + * + *The dispatch origin for this call must be _Signed_ and must be a + *recoverable account with an active recovery process for it. + * + *Parameters: + *- `rescuer`: The account trying to rescue this recoverable account. + */ + "close_recovery": Anonymize; + /** + *Remove the recovery process for your account. Recovered accounts are still accessible. + * + *NOTE: The user must make sure to call `close_recovery` on all active + *recovery attempts before calling this function else it will fail. + * + *Payment: By calling this function the recoverable account will unreserve + *their recovery configuration deposit. + *(`ConfigDepositBase` + `FriendDepositFactor` * #_of_friends) + * + *The dispatch origin for this call must be _Signed_ and must be a + *recoverable account (i.e. has a recovery configuration). + */ + "remove_recovery": undefined; + /** + *Cancel the ability to use `as_recovered` for `account`. + * + *The dispatch origin for this call must be _Signed_ and registered to + *be able to make calls on behalf of the recovered account. + * + *Parameters: + *- `account`: The recovered account you are able to call on-behalf-of. + */ + "cancel_recovered": Anonymize; + /** + *Poke deposits for recovery configurations and / or active recoveries. + * + *This can be used by accounts to possibly lower their locked amount. + * + *The dispatch origin for this call must be _Signed_. + * + *Parameters: + *- `maybe_account`: Optional recoverable account for which you have an active recovery + *and want to adjust the deposit for the active recovery. + * + *This function checks both recovery configuration deposit and active recovery deposits + *of the caller: + *- If the caller has created a recovery configuration, checks and adjusts its deposit + *- If the caller has initiated any active recoveries, and provides the account in + *`maybe_account`, checks and adjusts those deposits + * + *If any deposit is updated, the difference will be reserved/unreserved from the caller's + *account. + * + *The transaction is made free if any deposit is updated and paid otherwise. + * + *Emits `DepositPoked` if any deposit is updated. + *Multiple events may be emitted in case both types of deposits are updated. + */ + "poke_deposit": Anonymize; +}>; +export type I56lg8bnrufikk = { + "account": MultiAddress; + "call": TxCallData; +}; +export type I6i4uaqurusjdc = { + "maybe_account"?: Anonymize; +}; +export type Ia0jlc0rcbskuk = (MultiAddress) | undefined; +export type Iebqh6d4fbufno = AnonymousEnum<{ + /** + *Anonymously schedule a task. + */ + "schedule": Anonymize; + /** + *Cancel an anonymously scheduled task. + */ + "cancel": Anonymize; + /** + *Schedule a named task. + */ + "schedule_named": Anonymize; + /** + *Cancel a named scheduled task. + */ + "cancel_named": Anonymize; + /** + *Anonymously schedule a task after a delay. + */ + "schedule_after": Anonymize; + /** + *Schedule a named task after a delay. + */ + "schedule_named_after": Anonymize; + /** + *Set a retry configuration for a task so that, in case its scheduled run fails, it will + *be retried after `period` blocks, for a total amount of `retries` retries or until it + *succeeds. + * + *Tasks which need to be scheduled for a retry are still subject to weight metering and + *agenda space, same as a regular task. If a periodic task fails, it will be scheduled + *normally while the task is retrying. + * + *Tasks scheduled as a result of a retry for a periodic task are unnamed, non-periodic + *clones of the original task. Their retry configuration will be derived from the + *original task's configuration, but will have a lower value for `remaining` than the + *original `total_retries`. + */ + "set_retry": Anonymize; + /** + *Set a retry configuration for a named task so that, in case its scheduled run fails, it + *will be retried after `period` blocks, for a total amount of `retries` retries or until + *it succeeds. + * + *Tasks which need to be scheduled for a retry are still subject to weight metering and + *agenda space, same as a regular task. If a periodic task fails, it will be scheduled + *normally while the task is retrying. + * + *Tasks scheduled as a result of a retry for a periodic task are unnamed, non-periodic + *clones of the original task. Their retry configuration will be derived from the + *original task's configuration, but will have a lower value for `remaining` than the + *original `total_retries`. + */ + "set_retry_named": Anonymize; + /** + *Removes the retry configuration of a task. + */ + "cancel_retry": Anonymize; + /** + *Cancel the retry configuration of a named task. + */ + "cancel_retry_named": Anonymize; +}>; +export type I4b0ab4u33u43u = { + "when": number; + "maybe_periodic"?: Anonymize; + "priority": number; + "call": TxCallData; +}; +export type I1ac18p6pjahv9 = { + "id": FixedSizeBinary<32>; + "when": number; + "maybe_periodic"?: Anonymize; + "priority": number; + "call": TxCallData; +}; +export type I80ht5q6a46692 = { + "after": number; + "maybe_periodic"?: Anonymize; + "priority": number; + "call": TxCallData; +}; +export type I8lqgni993i7d9 = { + "id": FixedSizeBinary<32>; + "after": number; + "maybe_periodic"?: Anonymize; + "priority": number; + "call": TxCallData; +}; +export type If5toncvhh6qq3 = AnonymousEnum<{ + /** + *Authenticates the sudo key and dispatches a function call with `Root` origin. + */ + "sudo": Anonymize; + /** + *Authenticates the sudo key and dispatches a function call with `Root` origin. + *This function does not check the weight of the call, and instead allows the + *Sudo user to specify the weight of the call. + * + *The dispatch origin for this call must be _Signed_. + */ + "sudo_unchecked_weight": Anonymize; + /** + *Authenticates the current sudo key and sets the given AccountId (`new`) as the new sudo + *key. + */ + "set_key": Anonymize; + /** + *Authenticates the sudo key and dispatches a function call with `Signed` origin from + *a given account. + * + *The dispatch origin for this call must be _Signed_. + */ + "sudo_as": Anonymize; + /** + *Permanently removes the sudo key. + * + ***This cannot be un-done.** + */ + "remove_key": undefined; +}>; +export type If1sr4hm0el5a0 = { + "call": TxCallData; +}; +export type I5n05n33uogjb5 = { + "who": MultiAddress; + "call": TxCallData; +}; +export type I3v66ec718b74 = AnonymousEnum<{ + /** + *Dispatch the given `call` from an account that the sender is authorised for through + *`add_proxy`. + * + *The dispatch origin for this call must be _Signed_. + * + *Parameters: + *- `real`: The account that the proxy will make a call on behalf of. + *- `force_proxy_type`: Specify the exact proxy type to be used and checked for this call. + *- `call`: The call to be made by the `real` account. + */ + "proxy": Anonymize; + /** + *Register a proxy account for the sender that is able to make calls on its behalf. + * + *The dispatch origin for this call must be _Signed_. + * + *Parameters: + *- `proxy`: The account that the `caller` would like to make a proxy. + *- `proxy_type`: The permissions allowed for this proxy account. + *- `delay`: The announcement period required of the initial proxy. Will generally be + *zero. + */ + "add_proxy": Anonymize; + /** + *Unregister a proxy account for the sender. + * + *The dispatch origin for this call must be _Signed_. + * + *Parameters: + *- `proxy`: The account that the `caller` would like to remove as a proxy. + *- `proxy_type`: The permissions currently enabled for the removed proxy account. + */ + "remove_proxy": Anonymize; + /** + *Unregister all proxy accounts for the sender. + * + *The dispatch origin for this call must be _Signed_. + * + *WARNING: This may be called on accounts created by `create_pure`, however if done, then + *the unreserved fees will be inaccessible. **All access to this account will be lost.** + */ + "remove_proxies": undefined; + /** + *Spawn a fresh new account that is guaranteed to be otherwise inaccessible, and + *initialize it with a proxy of `proxy_type` for `origin` sender. + * + *Requires a `Signed` origin. + * + *- `proxy_type`: The type of the proxy that the sender will be registered as over the + *new account. This will almost always be the most permissive `ProxyType` possible to + *allow for maximum flexibility. + *- `index`: A disambiguation index, in case this is called multiple times in the same + *transaction (e.g. with `utility::batch`). Unless you're using `batch` you probably just + *want to use `0`. + *- `delay`: The announcement period required of the initial proxy. Will generally be + *zero. + * + *Fails with `Duplicate` if this has already been called in this transaction, from the + *same sender, with the same parameters. + * + *Fails if there are insufficient funds to pay for deposit. + */ + "create_pure": Anonymize; + /** + *Removes a previously spawned pure proxy. + * + *WARNING: **All access to this account will be lost.** Any funds held in it will be + *inaccessible. + * + *Requires a `Signed` origin, and the sender account must have been created by a call to + *`create_pure` with corresponding parameters. + * + *- `spawner`: The account that originally called `create_pure` to create this account. + *- `index`: The disambiguation index originally passed to `create_pure`. Probably `0`. + *- `proxy_type`: The proxy type originally passed to `create_pure`. + *- `height`: The height of the chain when the call to `create_pure` was processed. + *- `ext_index`: The extrinsic index in which the call to `create_pure` was processed. + * + *Fails with `NoPermission` in case the caller is not a previously created pure + *account whose `create_pure` call has corresponding parameters. + */ + "kill_pure": Anonymize; + /** + *Publish the hash of a proxy-call that will be made in the future. + * + *This must be called some number of blocks before the corresponding `proxy` is attempted + *if the delay associated with the proxy relationship is greater than zero. + * + *No more than `MaxPending` announcements may be made at any one time. + * + *This will take a deposit of `AnnouncementDepositFactor` as well as + *`AnnouncementDepositBase` if there are no other pending announcements. + * + *The dispatch origin for this call must be _Signed_ and a proxy of `real`. + * + *Parameters: + *- `real`: The account that the proxy will make a call on behalf of. + *- `call_hash`: The hash of the call to be made by the `real` account. + */ + "announce": Anonymize; + /** + *Remove a given announcement. + * + *May be called by a proxy account to remove a call they previously announced and return + *the deposit. + * + *The dispatch origin for this call must be _Signed_. + * + *Parameters: + *- `real`: The account that the proxy will make a call on behalf of. + *- `call_hash`: The hash of the call to be made by the `real` account. + */ + "remove_announcement": Anonymize; + /** + *Remove the given announcement of a delegate. + * + *May be called by a target (proxied) account to remove a call that one of their delegates + *(`delegate`) has announced they want to execute. The deposit is returned. + * + *The dispatch origin for this call must be _Signed_. + * + *Parameters: + *- `delegate`: The account that previously announced the call. + *- `call_hash`: The hash of the call to be made. + */ + "reject_announcement": Anonymize; + /** + *Dispatch the given `call` from an account that the sender is authorized for through + *`add_proxy`. + * + *Removes any corresponding announcement(s). + * + *The dispatch origin for this call must be _Signed_. + * + *Parameters: + *- `real`: The account that the proxy will make a call on behalf of. + *- `force_proxy_type`: Specify the exact proxy type to be used and checked for this call. + *- `call`: The call to be made by the `real` account. + */ + "proxy_announced": Anonymize; + /** + *Poke / Adjust deposits made for proxies and announcements based on current values. + *This can be used by accounts to possibly lower their locked amount. + * + *The dispatch origin for this call must be _Signed_. + * + *The transaction fee is waived if the deposit amount has changed. + * + *Emits `DepositPoked` if successful. + */ + "poke_deposit": undefined; +}>; +export type Ifbgj6kc27nn2q = { + "real": MultiAddress; + "force_proxy_type"?: Anonymize; + "call": TxCallData; +}; +export type If6gdn1v27431a = (Anonymize) | undefined; +export type Ie41rr3emcpt2k = { + "delegate": MultiAddress; + "proxy_type": Anonymize; + "delay": number; +}; +export type I9tuav8vvj7joi = { + "proxy_type": Anonymize; + "delay": number; + "index": number; +}; +export type Idp4no4hd72mhv = { + "spawner": MultiAddress; + "proxy_type": Anonymize; + "index": number; + "height": number; + "ext_index": number; +}; +export type I9ogfrmgl88pdb = { + "delegate": MultiAddress; + "real": MultiAddress; + "force_proxy_type"?: Anonymize; + "call": TxCallData; +}; +export type I9kltligh4o9qg = AnonymousEnum<{ + /** + *Immediately dispatch a multi-signature call using a single approval from the caller. + * + *The dispatch origin for this call must be _Signed_. + * + *- `other_signatories`: The accounts (other than the sender) who are part of the + *multi-signature, but do not participate in the approval process. + *- `call`: The call to be executed. + * + *Result is equivalent to the dispatched result. + * + *## Complexity + *O(Z + C) where Z is the length of the call and C its execution weight. + */ + "as_multi_threshold_1": Anonymize; + /** + *Register approval for a dispatch to be made from a deterministic composite account if + *approved by a total of `threshold - 1` of `other_signatories`. + * + *If there are enough, then dispatch the call. + * + *Payment: `DepositBase` will be reserved if this is the first approval, plus + *`threshold` times `DepositFactor`. It is returned once this dispatch happens or + *is cancelled. + * + *The dispatch origin for this call must be _Signed_. + * + *- `threshold`: The total number of approvals for this dispatch before it is executed. + *- `other_signatories`: The accounts (other than the sender) who can approve this + *dispatch. May not be empty. + *- `maybe_timepoint`: If this is the first approval, then this must be `None`. If it is + *not the first approval, then it must be `Some`, with the timepoint (block number and + *transaction index) of the first approval transaction. + *- `call`: The call to be executed. + * + *NOTE: Unless this is the final approval, you will generally want to use + *`approve_as_multi` instead, since it only requires a hash of the call. + * + *Result is equivalent to the dispatched result if `threshold` is exactly `1`. Otherwise + *on success, result is `Ok` and the result from the interior call, if it was executed, + *may be found in the deposited `MultisigExecuted` event. + * + *## Complexity + *- `O(S + Z + Call)`. + *- Up to one balance-reserve or unreserve operation. + *- One passthrough operation, one insert, both `O(S)` where `S` is the number of + * signatories. `S` is capped by `MaxSignatories`, with weight being proportional. + *- One call encode & hash, both of complexity `O(Z)` where `Z` is tx-len. + *- One encode & hash, both of complexity `O(S)`. + *- Up to one binary search and insert (`O(logS + S)`). + *- I/O: 1 read `O(S)`, up to 1 mutate `O(S)`. Up to one remove. + *- One event. + *- The weight of the `call`. + *- Storage: inserts one item, value size bounded by `MaxSignatories`, with a deposit + * taken for its lifetime of `DepositBase + threshold * DepositFactor`. + */ + "as_multi": Anonymize; + /** + *Register approval for a dispatch to be made from a deterministic composite account if + *approved by a total of `threshold - 1` of `other_signatories`. + * + *Payment: `DepositBase` will be reserved if this is the first approval, plus + *`threshold` times `DepositFactor`. It is returned once this dispatch happens or + *is cancelled. + * + *The dispatch origin for this call must be _Signed_. + * + *- `threshold`: The total number of approvals for this dispatch before it is executed. + *- `other_signatories`: The accounts (other than the sender) who can approve this + *dispatch. May not be empty. + *- `maybe_timepoint`: If this is the first approval, then this must be `None`. If it is + *not the first approval, then it must be `Some`, with the timepoint (block number and + *transaction index) of the first approval transaction. + *- `call_hash`: The hash of the call to be executed. + * + *NOTE: If this is the final approval, you will want to use `as_multi` instead. + * + *## Complexity + *- `O(S)`. + *- Up to one balance-reserve or unreserve operation. + *- One passthrough operation, one insert, both `O(S)` where `S` is the number of + * signatories. `S` is capped by `MaxSignatories`, with weight being proportional. + *- One encode & hash, both of complexity `O(S)`. + *- Up to one binary search and insert (`O(logS + S)`). + *- I/O: 1 read `O(S)`, up to 1 mutate `O(S)`. Up to one remove. + *- One event. + *- Storage: inserts one item, value size bounded by `MaxSignatories`, with a deposit + * taken for its lifetime of `DepositBase + threshold * DepositFactor`. + */ + "approve_as_multi": Anonymize; + /** + *Cancel a pre-existing, on-going multisig transaction. Any deposit reserved previously + *for this operation will be unreserved on success. + * + *The dispatch origin for this call must be _Signed_. + * + *- `threshold`: The total number of approvals for this dispatch before it is executed. + *- `other_signatories`: The accounts (other than the sender) who can approve this + *dispatch. May not be empty. + *- `timepoint`: The timepoint (block number and transaction index) of the first approval + *transaction for this dispatch. + *- `call_hash`: The hash of the call to be executed. + * + *## Complexity + *- `O(S)`. + *- Up to one balance-reserve or unreserve operation. + *- One passthrough operation, one insert, both `O(S)` where `S` is the number of + * signatories. `S` is capped by `MaxSignatories`, with weight being proportional. + *- One encode & hash, both of complexity `O(S)`. + *- One event. + *- I/O: 1 read `O(S)`, one remove. + *- Storage: removes one item. + */ + "cancel_as_multi": Anonymize; + /** + *Poke the deposit reserved for an existing multisig operation. + * + *The dispatch origin for this call must be _Signed_ and must be the original depositor of + *the multisig operation. + * + *The transaction fee is waived if the deposit amount has changed. + * + *- `threshold`: The total number of approvals needed for this multisig. + *- `other_signatories`: The accounts (other than the sender) who are part of the + * multisig. + *- `call_hash`: The hash of the call this deposit is reserved for. + * + *Emits `DepositPoked` if successful. + */ + "poke_deposit": Anonymize; +}>; +export type I23foj0lhdkppt = { + "other_signatories": Anonymize; + "call": TxCallData; +}; +export type Ic45kejcb5v86h = { + "threshold": number; + "other_signatories": Anonymize; + "maybe_timepoint"?: Anonymize; + "call": TxCallData; + "max_weight": Anonymize; +}; +export type I6lqh1vgb4mcja = { + "threshold": number; + "other_signatories": Anonymize; + "call_hash": FixedSizeBinary<32>; +}; +export type I8j8o3a9ron2ol = AnonymousEnum<{ + /** + *Submit a solution for the unsigned phase. + * + *The dispatch origin fo this call must be __none__. + * + *This submission is checked on the fly. Moreover, this unsigned solution is only + *validated when submitted to the pool from the **local** node. Effectively, this means + *that only active validators can submit this transaction when authoring a block (similar + *to an inherent). + * + *To prevent any incorrect solution (and thus wasted time/weight), this transaction will + *panic if the solution submitted by the validator is invalid in any way, effectively + *putting their authoring reward at risk. + * + *No deposit or reward is associated with this submission. + */ + "submit_unsigned": Anonymize; + /** + *Set a new value for `MinimumUntrustedScore`. + * + *Dispatch origin must be aligned with `T::ForceOrigin`. + * + *This check can be turned off by setting the value to `None`. + */ + "set_minimum_untrusted_score": Anonymize; + /** + *Set a solution in the queue, to be handed out to the client of this pallet in the next + *call to `ElectionProvider::elect`. + * + *This can only be set by `T::ForceOrigin`, and only when the phase is `Emergency`. + * + *The solution is not checked for any feasibility and is assumed to be trustworthy, as any + *feasibility check itself can in principle cause the election process to fail (due to + *memory/weight constrains). + */ + "set_emergency_election_result": Anonymize; + /** + *Submit a solution for the signed phase. + * + *The dispatch origin fo this call must be __signed__. + * + *The solution is potentially queued, based on the claimed score and processed at the end + *of the signed phase. + * + *A deposit is reserved and recorded for the solution. Based on the outcome, the solution + *might be rewarded, slashed, or get all or a part of the deposit back. + */ + "submit": Anonymize; + /** + *Trigger the governance fallback. + * + *This can only be called when [`Phase::Emergency`] is enabled, as an alternative to + *calling [`Call::set_emergency_election_result`]. + */ + "governance_fallback": undefined; +}>; +export type Ieovj1bltne19s = AnonymousEnum<{ + /** + *Propose a referendum on a privileged action. + * + *- `origin`: must be `SubmitOrigin` and the account must have `SubmissionDeposit` funds + * available. + *- `proposal_origin`: The origin from which the proposal should be executed. + *- `proposal`: The proposal. + *- `enactment_moment`: The moment that the proposal should be enacted. + * + *Emits `Submitted`. + */ + "submit": Anonymize; + /** + *Post the Decision Deposit for a referendum. + * + *- `origin`: must be `Signed` and the account must have funds available for the + * referendum's track's Decision Deposit. + *- `index`: The index of the submitted referendum whose Decision Deposit is yet to be + * posted. + * + *Emits `DecisionDepositPlaced`. + */ + "place_decision_deposit": Anonymize; + /** + *Refund the Decision Deposit for a closed referendum back to the depositor. + * + *- `origin`: must be `Signed` or `Root`. + *- `index`: The index of a closed referendum whose Decision Deposit has not yet been + * refunded. + * + *Emits `DecisionDepositRefunded`. + */ + "refund_decision_deposit": Anonymize; + /** + *Cancel an ongoing referendum. + * + *- `origin`: must be the `CancelOrigin`. + *- `index`: The index of the referendum to be cancelled. + * + *Emits `Cancelled`. + */ + "cancel": Anonymize; + /** + *Cancel an ongoing referendum and slash the deposits. + * + *- `origin`: must be the `KillOrigin`. + *- `index`: The index of the referendum to be cancelled. + * + *Emits `Killed` and `DepositSlashed`. + */ + "kill": Anonymize; + /** + *Advance a referendum onto its next logical state. Only used internally. + * + *- `origin`: must be `Root`. + *- `index`: the referendum to be advanced. + */ + "nudge_referendum": Anonymize; + /** + *Advance a track onto its next logical state. Only used internally. + * + *- `origin`: must be `Root`. + *- `track`: the track to be advanced. + * + *Action item for when there is now one fewer referendum in the deciding phase and the + *`DecidingCount` is not yet updated. This means that we should either: + *- begin deciding another referendum (and leave `DecidingCount` alone); or + *- decrement `DecidingCount`. + */ + "one_fewer_deciding": Anonymize; + /** + *Refund the Submission Deposit for a closed referendum back to the depositor. + * + *- `origin`: must be `Signed` or `Root`. + *- `index`: The index of a closed referendum whose Submission Deposit has not yet been + * refunded. + * + *Emits `SubmissionDepositRefunded`. + */ + "refund_submission_deposit": Anonymize; + /** + *Set or clear metadata of a referendum. + * + *Parameters: + *- `origin`: Must be `Signed` by a creator of a referendum or by anyone to clear a + * metadata of a finished referendum. + *- `index`: The index of a referendum to set or clear metadata for. + *- `maybe_hash`: The hash of an on-chain stored preimage. `None` to clear a metadata. + */ + "set_metadata": Anonymize; +}>; +export type Ibkc9utma98lms = { + "proposal_origin": Anonymize; + "proposal": PreimagesBounded; + "enactment_moment": TraitsScheduleDispatchTime; +}; +export type I2196kg5h82eoc = AnonymousEnum<{ + "whitelist_call": Anonymize; + "remove_whitelisted_call": Anonymize; + "dispatch_whitelisted_call": Anonymize; + "dispatch_whitelisted_call_with_preimage": Anonymize; +}>; +export type I6jnp85onk3m8j = AnonymousEnum<{ + /** + *Propose and approve a spend of treasury funds. + * + *## Dispatch Origin + * + *Must be [`Config::SpendOrigin`] with the `Success` value being at least `amount`. + * + *### Details + *NOTE: For record-keeping purposes, the proposer is deemed to be equivalent to the + *beneficiary. + * + *### Parameters + *- `amount`: The amount to be transferred from the treasury to the `beneficiary`. + *- `beneficiary`: The destination account for the transfer. + * + *## Events + * + *Emits [`Event::SpendApproved`] if successful. + */ + "spend_local": Anonymize; + /** + *Force a previously approved proposal to be removed from the approval queue. + * + *## Dispatch Origin + * + *Must be [`Config::RejectOrigin`]. + * + *## Details + * + *The original deposit will no longer be returned. + * + *### Parameters + *- `proposal_id`: The index of a proposal + * + *### Complexity + *- O(A) where `A` is the number of approvals + * + *### Errors + *- [`Error::ProposalNotApproved`]: The `proposal_id` supplied was not found in the + * approval queue, i.e., the proposal has not been approved. This could also mean the + * proposal does not exist altogether, thus there is no way it would have been approved + * in the first place. + */ + "remove_approval": Anonymize; + /** + *Propose and approve a spend of treasury funds. + * + *## Dispatch Origin + * + *Must be [`Config::SpendOrigin`] with the `Success` value being at least + *`amount` of `asset_kind` in the native asset. The amount of `asset_kind` is converted + *for assertion using the [`Config::BalanceConverter`]. + * + *## Details + * + *Create an approved spend for transferring a specific `amount` of `asset_kind` to a + *designated beneficiary. The spend must be claimed using the `payout` dispatchable within + *the [`Config::PayoutPeriod`]. + * + *### Parameters + *- `asset_kind`: An indicator of the specific asset class to be spent. + *- `amount`: The amount to be transferred from the treasury to the `beneficiary`. + *- `beneficiary`: The beneficiary of the spend. + *- `valid_from`: The block number from which the spend can be claimed. It can refer to + * the past if the resulting spend has not yet expired according to the + * [`Config::PayoutPeriod`]. If `None`, the spend can be claimed immediately after + * approval. + * + *## Events + * + *Emits [`Event::AssetSpendApproved`] if successful. + */ + "spend": Anonymize; + /** + *Claim a spend. + * + *## Dispatch Origin + * + *Must be signed + * + *## Details + * + *Spends must be claimed within some temporal bounds. A spend may be claimed within one + *[`Config::PayoutPeriod`] from the `valid_from` block. + *In case of a payout failure, the spend status must be updated with the `check_status` + *dispatchable before retrying with the current function. + * + *### Parameters + *- `index`: The spend index. + * + *## Events + * + *Emits [`Event::Paid`] if successful. + */ + "payout": Anonymize; + /** + *Check the status of the spend and remove it from the storage if processed. + * + *## Dispatch Origin + * + *Must be signed. + * + *## Details + * + *The status check is a prerequisite for retrying a failed payout. + *If a spend has either succeeded or expired, it is removed from the storage by this + *function. In such instances, transaction fees are refunded. + * + *### Parameters + *- `index`: The spend index. + * + *## Events + * + *Emits [`Event::PaymentFailed`] if the spend payout has failed. + *Emits [`Event::SpendProcessed`] if the spend payout has succeed. + */ + "check_status": Anonymize; + /** + *Void previously approved spend. + * + *## Dispatch Origin + * + *Must be [`Config::RejectOrigin`]. + * + *## Details + * + *A spend void is only possible if the payout has not been attempted yet. + * + *### Parameters + *- `index`: The spend index. + * + *## Events + * + *Emits [`Event::AssetSpendVoided`] if successful. + */ + "void_spend": Anonymize; +}>; +export type I3pnhorh539dti = { + "asset_kind": Anonymize; + "amount": bigint; + "beneficiary": XcmVersionedLocation; + "valid_from"?: Anonymize; +}; +export type I3ah0kpgrv4i88 = AnonymousEnum<{ + /** + *Set the validation upgrade cooldown. + */ + "set_validation_upgrade_cooldown": Anonymize; + /** + *Set the validation upgrade delay. + */ + "set_validation_upgrade_delay": Anonymize; + /** + *Set the acceptance period for an included candidate. + */ + "set_code_retention_period": Anonymize; + /** + *Set the max validation code size for incoming upgrades. + */ + "set_max_code_size": Anonymize; + /** + *Set the max POV block size for incoming upgrades. + */ + "set_max_pov_size": Anonymize; + /** + *Set the max head data size for paras. + */ + "set_max_head_data_size": Anonymize; + /** + *Set the number of coretime execution cores. + * + *NOTE: that this configuration is managed by the coretime chain. Only manually change + *this, if you really know what you are doing! + */ + "set_coretime_cores": Anonymize; + /** + *Set the parachain validator-group rotation frequency + */ + "set_group_rotation_frequency": Anonymize; + /** + *Set the availability period for paras. + */ + "set_paras_availability_period": Anonymize; + /** + *Set the scheduling lookahead, in expected number of blocks at peak throughput. + */ + "set_scheduling_lookahead": Anonymize; + /** + *Set the maximum number of validators to assign to any core. + */ + "set_max_validators_per_core": Anonymize; + /** + *Set the maximum number of validators to use in parachain consensus. + */ + "set_max_validators": Anonymize; + /** + *Set the dispute period, in number of sessions to keep for disputes. + */ + "set_dispute_period": Anonymize; + /** + *Set the dispute post conclusion acceptance period. + */ + "set_dispute_post_conclusion_acceptance_period": Anonymize; + /** + *Set the no show slots, in number of number of consensus slots. + *Must be at least 1. + */ + "set_no_show_slots": Anonymize; + /** + *Set the total number of delay tranches. + */ + "set_n_delay_tranches": Anonymize; + /** + *Set the zeroth delay tranche width. + */ + "set_zeroth_delay_tranche_width": Anonymize; + /** + *Set the number of validators needed to approve a block. + */ + "set_needed_approvals": Anonymize; + /** + *Set the number of samples to do of the `RelayVRFModulo` approval assignment criterion. + */ + "set_relay_vrf_modulo_samples": Anonymize; + /** + *Sets the maximum items that can present in a upward dispatch queue at once. + */ + "set_max_upward_queue_count": Anonymize; + /** + *Sets the maximum total size of items that can present in a upward dispatch queue at + *once. + */ + "set_max_upward_queue_size": Anonymize; + /** + *Set the critical downward message size. + */ + "set_max_downward_message_size": Anonymize; + /** + *Sets the maximum size of an upward message that can be sent by a candidate. + */ + "set_max_upward_message_size": Anonymize; + /** + *Sets the maximum number of messages that a candidate can contain. + */ + "set_max_upward_message_num_per_candidate": Anonymize; + /** + *Sets the number of sessions after which an HRMP open channel request expires. + */ + "set_hrmp_open_request_ttl": Anonymize; + /** + *Sets the amount of funds that the sender should provide for opening an HRMP channel. + */ + "set_hrmp_sender_deposit": Anonymize; + /** + *Sets the amount of funds that the recipient should provide for accepting opening an HRMP + *channel. + */ + "set_hrmp_recipient_deposit": Anonymize; + /** + *Sets the maximum number of messages allowed in an HRMP channel at once. + */ + "set_hrmp_channel_max_capacity": Anonymize; + /** + *Sets the maximum total size of messages in bytes allowed in an HRMP channel at once. + */ + "set_hrmp_channel_max_total_size": Anonymize; + /** + *Sets the maximum number of inbound HRMP channels a parachain is allowed to accept. + */ + "set_hrmp_max_parachain_inbound_channels": Anonymize; + /** + *Sets the maximum size of a message that could ever be put into an HRMP channel. + */ + "set_hrmp_channel_max_message_size": Anonymize; + /** + *Sets the maximum number of outbound HRMP channels a parachain is allowed to open. + */ + "set_hrmp_max_parachain_outbound_channels": Anonymize; + /** + *Sets the maximum number of outbound HRMP messages can be sent by a candidate. + */ + "set_hrmp_max_message_num_per_candidate": Anonymize; + /** + *Set the number of session changes after which a PVF pre-checking voting is rejected. + */ + "set_pvf_voting_ttl": Anonymize; + /** + *Sets the minimum delay between announcing the upgrade block for a parachain until the + *upgrade taking place. + * + *See the field documentation for information and constraints for the new value. + */ + "set_minimum_validation_upgrade_delay": Anonymize; + /** + *Setting this to true will disable consistency checks for the configuration setters. + *Use with caution. + */ + "set_bypass_consistency_check": Anonymize; + /** + *Set the asynchronous backing parameters. + */ + "set_async_backing_params": Anonymize; + /** + *Set PVF executor parameters. + */ + "set_executor_params": Anonymize; + /** + *Set the on demand (parathreads) base fee. + */ + "set_on_demand_base_fee": Anonymize; + /** + *Set the on demand (parathreads) fee variability. + */ + "set_on_demand_fee_variability": Anonymize; + /** + *Set the on demand (parathreads) queue max size. + */ + "set_on_demand_queue_max_size": Anonymize; + /** + *Set the on demand (parathreads) fee variability. + */ + "set_on_demand_target_queue_utilization": Anonymize; + /** + *Set the minimum backing votes threshold. + */ + "set_minimum_backing_votes": Anonymize; + /** + *Set/Unset a node feature. + */ + "set_node_feature": Anonymize; + /** + *Set approval-voting-params. + */ + "set_approval_voting_params": Anonymize; + /** + *Set scheduler-params. + */ + "set_scheduler_params": Anonymize; +}>; +export type I1nu19212e8egv = AnonymousEnum<{ + /** + *Enter the paras inherent. This will process bitfields and backed candidates. + */ + "enter": Anonymize; +}>; +export type I5m2irgeihn4i4 = { + "data": Anonymize; +}; +export type I622jkh704fgsa = { + "bitfields": Anonymize; + "backed_candidates": Anonymize; + "disputes": Anonymize; + "parent_header": Anonymize; +}; +export type I8vrvimkt7rkvr = Array>; +export type I1r92i04ndj503 = { + "candidate": Anonymize; + "validity_votes": Anonymize; + "validator_indices": { + bytes: Uint8Array; + bitsLen: number; + }; +}; +export type I35p841butcer2 = { + "descriptor": Anonymize; + "commitments": Anonymize; +}; +export type I8srk490mf5vj = AnonymousEnum<{ + /** + *Set the storage for the parachain validation code immediately. + */ + "force_set_current_code": Anonymize; + /** + *Set the storage for the current parachain head data immediately. + */ + "force_set_current_head": Anonymize; + /** + *Schedule an upgrade as if it was scheduled in the given relay parent block. + */ + "force_schedule_code_upgrade": Anonymize; + /** + *Note a new block head for para within the context of the current block. + */ + "force_note_new_head": Anonymize; + /** + *Put a parachain directly into the next session's action queue. + *We can't queue it any sooner than this without going into the + *initializer... + */ + "force_queue_action": Anonymize; + /** + *Adds the validation code to the storage. + * + *The code will not be added if it is already present. Additionally, if PVF pre-checking + *is running for that code, it will be instantly accepted. + * + *Otherwise, the code will be added into the storage. Note that the code will be added + *into storage with reference count 0. This is to account the fact that there are no users + *for this code yet. The caller will have to make sure that this code eventually gets + *used by some parachain or removed from the storage to avoid storage leaks. For the + *latter prefer to use the `poke_unused_validation_code` dispatchable to raw storage + *manipulation. + * + *This function is mainly meant to be used for upgrading parachains that do not follow + *the go-ahead signal while the PVF pre-checking feature is enabled. + */ + "add_trusted_validation_code": Anonymize; + /** + *Remove the validation code from the storage iff the reference count is 0. + * + *This is better than removing the storage directly, because it will not remove the code + *that was suddenly got used by some parachain while this dispatchable was pending + *dispatching. + */ + "poke_unused_validation_code": Anonymize; + /** + *Includes a statement for a PVF pre-checking vote. Potentially, finalizes the vote and + *enacts the results if that was the last vote before achieving the supermajority. + */ + "include_pvf_check_statement": Anonymize; + /** + *Set the storage for the current parachain head data immediately. + */ + "force_set_most_recent_context": Anonymize; + /** + *Remove an upgrade cooldown for a parachain. + * + *The cost for removing the cooldown earlier depends on the time left for the cooldown + *multiplied by [`Config::CooldownRemovalMultiplier`]. The paid tokens are burned. + */ + "remove_upgrade_cooldown": Anonymize; + /** + *Sets the storage for the authorized current code hash of the parachain. + *If not applied, it will be removed at the `System::block_number() + valid_period` block. + * + *This can be useful, when triggering `Paras::force_set_current_code(para, code)` + *from a different chain than the one where the `Paras` pallet is deployed. + * + *The main purpose is to avoid transferring the entire `code` Wasm blob between chains. + *Instead, we authorize `code_hash` with `root`, which can later be applied by + *`Paras::apply_authorized_force_set_current_code(para, code)` by anyone. + * + *Authorizations are stored in an **overwriting manner**. + */ + "authorize_force_set_current_code_hash": Anonymize; + /** + *Applies the already authorized current code for the parachain, + *triggering the same functionality as `force_set_current_code`. + */ + "apply_authorized_force_set_current_code": Anonymize; +}>; +export type I3i9vj5744rff1 = { + "para": number; + "new_code_hash": FixedSizeBinary<32>; + "valid_period": number; +}; +export type I7a6dbilbccifr = AnonymousEnum<{ + "report_dispute_lost_unsigned": Anonymize; +}>; +export type I2ecddbrt3sjqn = { + "dispute_proof": Anonymize; + "key_owner_proof": Anonymize; +}; +export type Ie2h65164u3jsg = { + "time_slot": Anonymize; + "kind": Anonymize; + "validator_index": number; + "validator_id": FixedSizeBinary<32>; +}; +export type I1qq9dc763kccf = AnonymousEnum<{ + /** + *Create a single on demand core order. + *Will use the spot price for the current block and will reap the account if needed. + * + *Parameters: + *- `origin`: The sender of the call, funds will be withdrawn from this account. + *- `max_amount`: The maximum balance to withdraw from the origin to place an order. + *- `para_id`: A `ParaId` the origin wants to provide blockspace for. + * + *Errors: + *- `InsufficientBalance`: from the Currency implementation + *- `QueueFull` + *- `SpotPriceHigherThanMaxAmount` + * + *Events: + *- `OnDemandOrderPlaced` + */ + "place_order_allow_death": Anonymize; + /** + *Same as the [`place_order_allow_death`](Self::place_order_allow_death) call , but with a + *check that placing the order will not reap the account. + * + *Parameters: + *- `origin`: The sender of the call, funds will be withdrawn from this account. + *- `max_amount`: The maximum balance to withdraw from the origin to place an order. + *- `para_id`: A `ParaId` the origin wants to provide blockspace for. + * + *Errors: + *- `InsufficientBalance`: from the Currency implementation + *- `QueueFull` + *- `SpotPriceHigherThanMaxAmount` + * + *Events: + *- `OnDemandOrderPlaced` + */ + "place_order_keep_alive": Anonymize; + /** + *Create a single on demand core order with credits. + *Will charge the owner's on-demand credit account the spot price for the current block. + * + *Parameters: + *- `origin`: The sender of the call, on-demand credits will be withdrawn from this + * account. + *- `max_amount`: The maximum number of credits to spend from the origin to place an + * order. + *- `para_id`: A `ParaId` the origin wants to provide blockspace for. + * + *Errors: + *- `InsufficientCredits` + *- `QueueFull` + *- `SpotPriceHigherThanMaxAmount` + * + *Events: + *- `OnDemandOrderPlaced` + */ + "place_order_with_credits": Anonymize; +}>; +export type I8f92tvrsnq2cu = AnonymousEnum<{ + /** + *Schedule a para to be initialized at the start of the next session. + * + *This should only be used for TESTING and not on PRODUCTION chains. It automatically + *assigns Coretime to the chain and increases the number of cores. Thus, there is no + *running coretime chain required. + */ + "sudo_schedule_para_initialize": Anonymize; + /** + *Schedule a para to be cleaned up at the start of the next session. + */ + "sudo_schedule_para_cleanup": Anonymize; + /** + *Upgrade a parathread (on-demand parachain) to a lease holding parachain + */ + "sudo_schedule_parathread_upgrade": Anonymize; + /** + *Downgrade a lease holding parachain to an on-demand parachain + */ + "sudo_schedule_parachain_downgrade": Anonymize; + /** + *Send a downward XCM to the given para. + * + *The given parachain should exist and the payload should not exceed the preconfigured + *size `config.max_downward_message_size`. + */ + "sudo_queue_downward_xcm": Anonymize; + /** + *Forcefully establish a channel from the sender to the recipient. + * + *This is equivalent to sending an `Hrmp::hrmp_init_open_channel` extrinsic followed by + *`Hrmp::hrmp_accept_open_channel`. + */ + "sudo_establish_hrmp_channel": Anonymize; +}>; +export type I49ncdugfqno1o = { + "id": number; + "xcm": XcmVersionedXcm; +}; +export type XcmVersionedXcm = Enum<{ + "V3": Anonymize; + "V4": Anonymize; + "V5": Anonymize; +}>; +export declare const XcmVersionedXcm: GetEnum; +export type Idlqs78vqqscm0 = AnonymousEnum<{ + /** + *Assign a permanent parachain slot and immediately create a lease for it. + */ + "assign_perm_parachain_slot": Anonymize; + /** + *Assign a temporary parachain slot. The function tries to create a lease for it + *immediately if `SlotLeasePeriodStart::Current` is specified, and if the number + *of currently active temporary slots is below `MaxTemporarySlotPerLeasePeriod`. + */ + "assign_temp_parachain_slot": Anonymize; + /** + *Unassign a permanent or temporary parachain slot + */ + "unassign_parachain_slot": Anonymize; + /** + *Sets the storage value [`MaxPermanentSlots`]. + */ + "set_max_permanent_slots": Anonymize; + /** + *Sets the storage value [`MaxTemporarySlots`]. + */ + "set_max_temporary_slots": Anonymize; +}>; +export type I6d2lhsacea7au = { + "id": number; + "lease_period_start": PolkadotRuntimeCommonAssignedSlotsSlotLeasePeriodStart; +}; +export type PolkadotRuntimeCommonAssignedSlotsSlotLeasePeriodStart = Enum<{ + "Current": undefined; + "Next": undefined; +}>; +export declare const PolkadotRuntimeCommonAssignedSlotsSlotLeasePeriodStart: GetEnum; +export type Ifr31g56am9igr = AnonymousEnum<{ + /** + *Request the configuration to be updated with the specified number of cores. Warning: + *Since this only schedules a configuration update, it takes two sessions to come into + *effect. + * + *- `origin`: Root or the Coretime Chain + *- `count`: total number of cores + */ + "request_core_count": Anonymize; + /** + *Request to claim the instantaneous coretime sales revenue starting from the block it was + *last claimed until and up to the block specified. The claimed amount value is sent back + *to the Coretime chain in a `notify_revenue` message. At the same time, the amount is + *teleported to the Coretime chain. + */ + "request_revenue_at": Anonymize; + "credit_account": Anonymize; + /** + *Receive instructions from the `ExternalBrokerOrigin`, detailing how a specific core is + *to be used. + * + *Parameters: + *-`origin`: The `ExternalBrokerOrigin`, assumed to be the coretime chain. + *-`core`: The core that should be scheduled. + *-`begin`: The starting blockheight of the instruction. + *-`assignment`: How the blockspace should be utilised. + *-`end_hint`: An optional hint as to when this particular set of instructions will end. + */ + "assign_core": Anonymize; +}>; +export type I4e2bfaqor5ntp = AnonymousEnum<{ + "validator_set": Anonymize; + /** + *Allows governance to force set the operating mode of the pallet. + */ + "set_mode": Anonymize; + /** + *manually do what this pallet was meant to do at the end of the migration. + */ + "force_on_migration_end": undefined; +}>; +export type I84bjfgtkoop2c = { + "report": Anonymize; +}; +export type I1epdupsg8a7gd = { + "mode": Anonymize; +}; +export type I4oqb168b2d4er = AnonymousEnum<{ + /** + *Allows root to set a cursor to forcefully start, stop or forward the migration process. + * + *Should normally not be needed and is only in place as emergency measure. Note that + *restarting the migration process in this manner will not call the + *[`MigrationStatusHandler::started`] hook or emit an `UpgradeStarted` event. + */ + "force_set_cursor": Anonymize; + /** + *Allows root to set an active cursor to forcefully start/forward the migration process. + * + *This is an edge-case version of [`Self::force_set_cursor`] that allows to set the + *`started_at` value to the next block number. Otherwise this would not be possible, since + *`force_set_cursor` takes an absolute block number. Setting `started_at` to `None` + *indicates that the current block number plus one should be used. + */ + "force_set_active_cursor": Anonymize; + /** + *Forces the onboarding of the migrations. + * + *This process happens automatically on a runtime upgrade. It is in place as an emergency + *measurement. The cursor needs to be `None` for this to succeed. + */ + "force_onboard_mbms": undefined; + /** + *Clears the `Historic` set. + * + *`map_cursor` must be set to the last value that was returned by the + *`HistoricCleared` event. The first time `None` can be used. `limit` must be chosen in a + *way that will result in a sensible weight. + */ + "clear_historic": Anonymize; +}>; +export type Ibou4u1engb441 = { + "cursor"?: Anonymize; +}; +export type Icmmmo81k3r2n7 = (Anonymize) | undefined; +export type Id6nbvqoqdj4o2 = { + "index": number; + "inner_cursor"?: Anonymize; + "started_at"?: Anonymize; +}; +export type I95iqep3b8snn9 = { + "selector": Anonymize; +}; +export type I2il0noe6jkb0o = AnonymousEnum<{ + "Specific": Anonymize; + "Wildcard": Anonymize; +}>; +export type Id9494tkgood2r = { + "limit"?: Anonymize; + "previous_cursor"?: Anonymize; +}; +export type I6k1inef986368 = AnonymousEnum<{ + "send": Anonymize; + /** + *Teleport some assets from the local chain to some destination chain. + * + ***This function is deprecated: Use `limited_teleport_assets` instead.** + * + *Fee payment on the destination side is made from the asset in the `assets` vector of + *index `fee_asset_item`. The weight limit for fees is not provided and thus is unlimited, + *with all fees taken as needed from the asset. + * + *- `origin`: Must be capable of withdrawing the `assets` and executing XCM. + *- `dest`: Destination context for the assets. Will typically be `[Parent, + * Parachain(..)]` to send from parachain to parachain, or `[Parachain(..)]` to send from + * relay to parachain. + *- `beneficiary`: A beneficiary location for the assets in the context of `dest`. Will + * generally be an `AccountId32` value. + *- `assets`: The assets to be withdrawn. This should include the assets used to pay the + * fee on the `dest` chain. + *- `fee_asset_item`: The index into `assets` of the item which should be used to pay + * fees. + */ + "teleport_assets": Anonymize; + /** + *Transfer some assets from the local chain to the destination chain through their local, + *destination or remote reserve. + * + *`assets` must have same reserve location and may not be teleportable to `dest`. + * - `assets` have local reserve: transfer assets to sovereign account of destination + * chain and forward a notification XCM to `dest` to mint and deposit reserve-based + * assets to `beneficiary`. + * - `assets` have destination reserve: burn local assets and forward a notification to + * `dest` chain to withdraw the reserve assets from this chain's sovereign account and + * deposit them to `beneficiary`. + * - `assets` have remote reserve: burn local assets, forward XCM to reserve chain to move + * reserves from this chain's SA to `dest` chain's SA, and forward another XCM to `dest` + * to mint and deposit reserve-based assets to `beneficiary`. + * + ***This function is deprecated: Use `limited_reserve_transfer_assets` instead.** + * + *Fee payment on the destination side is made from the asset in the `assets` vector of + *index `fee_asset_item`. The weight limit for fees is not provided and thus is unlimited, + *with all fees taken as needed from the asset. + * + *- `origin`: Must be capable of withdrawing the `assets` and executing XCM. + *- `dest`: Destination context for the assets. Will typically be `[Parent, + * Parachain(..)]` to send from parachain to parachain, or `[Parachain(..)]` to send from + * relay to parachain. + *- `beneficiary`: A beneficiary location for the assets in the context of `dest`. Will + * generally be an `AccountId32` value. + *- `assets`: The assets to be withdrawn. This should include the assets used to pay the + * fee on the `dest` (and possibly reserve) chains. + *- `fee_asset_item`: The index into `assets` of the item which should be used to pay + * fees. + */ + "reserve_transfer_assets": Anonymize; + /** + *Execute an XCM message from a local, signed, origin. + * + *An event is deposited indicating whether `msg` could be executed completely or only + *partially. + * + *No more than `max_weight` will be used in its attempted execution. If this is less than + *the maximum amount of weight that the message could take to be executed, then no + *execution attempt will be made. + */ + "execute": Anonymize; + /** + *Extoll that a particular destination can be communicated with through a particular + *version of XCM. + * + *- `origin`: Must be an origin specified by AdminOrigin. + *- `location`: The destination that is being described. + *- `xcm_version`: The latest version of XCM that `location` supports. + */ + "force_xcm_version": Anonymize; + /** + *Set a safe XCM version (the version that XCM should be encoded with if the most recent + *version a destination can accept is unknown). + * + *- `origin`: Must be an origin specified by AdminOrigin. + *- `maybe_xcm_version`: The default XCM encoding version, or `None` to disable. + */ + "force_default_xcm_version": Anonymize; + /** + *Ask a location to notify us regarding their XCM version and any changes to it. + * + *- `origin`: Must be an origin specified by AdminOrigin. + *- `location`: The location to which we should subscribe for XCM version notifications. + */ + "force_subscribe_version_notify": Anonymize; + /** + *Require that a particular destination should no longer notify us regarding any XCM + *version changes. + * + *- `origin`: Must be an origin specified by AdminOrigin. + *- `location`: The location to which we are currently subscribed for XCM version + * notifications which we no longer desire. + */ + "force_unsubscribe_version_notify": Anonymize; + /** + *Transfer some assets from the local chain to the destination chain through their local, + *destination or remote reserve. + * + *`assets` must have same reserve location and may not be teleportable to `dest`. + * - `assets` have local reserve: transfer assets to sovereign account of destination + * chain and forward a notification XCM to `dest` to mint and deposit reserve-based + * assets to `beneficiary`. + * - `assets` have destination reserve: burn local assets and forward a notification to + * `dest` chain to withdraw the reserve assets from this chain's sovereign account and + * deposit them to `beneficiary`. + * - `assets` have remote reserve: burn local assets, forward XCM to reserve chain to move + * reserves from this chain's SA to `dest` chain's SA, and forward another XCM to `dest` + * to mint and deposit reserve-based assets to `beneficiary`. + * + *Fee payment on the destination side is made from the asset in the `assets` vector of + *index `fee_asset_item`, up to enough to pay for `weight_limit` of weight. If more weight + *is needed than `weight_limit`, then the operation will fail and the sent assets may be + *at risk. + * + *- `origin`: Must be capable of withdrawing the `assets` and executing XCM. + *- `dest`: Destination context for the assets. Will typically be `[Parent, + * Parachain(..)]` to send from parachain to parachain, or `[Parachain(..)]` to send from + * relay to parachain. + *- `beneficiary`: A beneficiary location for the assets in the context of `dest`. Will + * generally be an `AccountId32` value. + *- `assets`: The assets to be withdrawn. This should include the assets used to pay the + * fee on the `dest` (and possibly reserve) chains. + *- `fee_asset_item`: The index into `assets` of the item which should be used to pay + * fees. + *- `weight_limit`: The remote-side weight limit, if any, for the XCM fee purchase. + */ + "limited_reserve_transfer_assets": Anonymize; + /** + *Teleport some assets from the local chain to some destination chain. + * + *Fee payment on the destination side is made from the asset in the `assets` vector of + *index `fee_asset_item`, up to enough to pay for `weight_limit` of weight. If more weight + *is needed than `weight_limit`, then the operation will fail and the sent assets may be + *at risk. + * + *- `origin`: Must be capable of withdrawing the `assets` and executing XCM. + *- `dest`: Destination context for the assets. Will typically be `[Parent, + * Parachain(..)]` to send from parachain to parachain, or `[Parachain(..)]` to send from + * relay to parachain. + *- `beneficiary`: A beneficiary location for the assets in the context of `dest`. Will + * generally be an `AccountId32` value. + *- `assets`: The assets to be withdrawn. This should include the assets used to pay the + * fee on the `dest` chain. + *- `fee_asset_item`: The index into `assets` of the item which should be used to pay + * fees. + *- `weight_limit`: The remote-side weight limit, if any, for the XCM fee purchase. + */ + "limited_teleport_assets": Anonymize; + /** + *Set or unset the global suspension state of the XCM executor. + * + *- `origin`: Must be an origin specified by AdminOrigin. + *- `suspended`: `true` to suspend, `false` to resume. + */ + "force_suspension": Anonymize; + /** + *Transfer some assets from the local chain to the destination chain through their local, + *destination or remote reserve, or through teleports. + * + *Fee payment on the destination side is made from the asset in the `assets` vector of + *index `fee_asset_item` (hence referred to as `fees`), up to enough to pay for + *`weight_limit` of weight. If more weight is needed than `weight_limit`, then the + *operation will fail and the sent assets may be at risk. + * + *`assets` (excluding `fees`) must have same reserve location or otherwise be teleportable + *to `dest`, no limitations imposed on `fees`. + * - for local reserve: transfer assets to sovereign account of destination chain and + * forward a notification XCM to `dest` to mint and deposit reserve-based assets to + * `beneficiary`. + * - for destination reserve: burn local assets and forward a notification to `dest` chain + * to withdraw the reserve assets from this chain's sovereign account and deposit them + * to `beneficiary`. + * - for remote reserve: burn local assets, forward XCM to reserve chain to move reserves + * from this chain's SA to `dest` chain's SA, and forward another XCM to `dest` to mint + * and deposit reserve-based assets to `beneficiary`. + * - for teleports: burn local assets and forward XCM to `dest` chain to mint/teleport + * assets and deposit them to `beneficiary`. + * + *- `origin`: Must be capable of withdrawing the `assets` and executing XCM. + *- `dest`: Destination context for the assets. Will typically be `X2(Parent, + * Parachain(..))` to send from parachain to parachain, or `X1(Parachain(..))` to send + * from relay to parachain. + *- `beneficiary`: A beneficiary location for the assets in the context of `dest`. Will + * generally be an `AccountId32` value. + *- `assets`: The assets to be withdrawn. This should include the assets used to pay the + * fee on the `dest` (and possibly reserve) chains. + *- `fee_asset_item`: The index into `assets` of the item which should be used to pay + * fees. + *- `weight_limit`: The remote-side weight limit, if any, for the XCM fee purchase. + */ + "transfer_assets": Anonymize; + /** + *Claims assets trapped on this pallet because of leftover assets during XCM execution. + * + *- `origin`: Anyone can call this extrinsic. + *- `assets`: The exact assets that were trapped. Use the version to specify what version + *was the latest when they were trapped. + *- `beneficiary`: The location/account where the claimed assets will be deposited. + */ + "claim_assets": Anonymize; + /** + *Transfer assets from the local chain to the destination chain using explicit transfer + *types for assets and fees. + * + *`assets` must have same reserve location or may be teleportable to `dest`. Caller must + *provide the `assets_transfer_type` to be used for `assets`: + * - `TransferType::LocalReserve`: transfer assets to sovereign account of destination + * chain and forward a notification XCM to `dest` to mint and deposit reserve-based + * assets to `beneficiary`. + * - `TransferType::DestinationReserve`: burn local assets and forward a notification to + * `dest` chain to withdraw the reserve assets from this chain's sovereign account and + * deposit them to `beneficiary`. + * - `TransferType::RemoteReserve(reserve)`: burn local assets, forward XCM to `reserve` + * chain to move reserves from this chain's SA to `dest` chain's SA, and forward another + * XCM to `dest` to mint and deposit reserve-based assets to `beneficiary`. Typically + * the remote `reserve` is Asset Hub. + * - `TransferType::Teleport`: burn local assets and forward XCM to `dest` chain to + * mint/teleport assets and deposit them to `beneficiary`. + * + *On the destination chain, as well as any intermediary hops, `BuyExecution` is used to + *buy execution using transferred `assets` identified by `remote_fees_id`. + *Make sure enough of the specified `remote_fees_id` asset is included in the given list + *of `assets`. `remote_fees_id` should be enough to pay for `weight_limit`. If more weight + *is needed than `weight_limit`, then the operation will fail and the sent assets may be + *at risk. + * + *`remote_fees_id` may use different transfer type than rest of `assets` and can be + *specified through `fees_transfer_type`. + * + *The caller needs to specify what should happen to the transferred assets once they reach + *the `dest` chain. This is done through the `custom_xcm_on_dest` parameter, which + *contains the instructions to execute on `dest` as a final step. + * This is usually as simple as: + * `Xcm(vec![DepositAsset { assets: Wild(AllCounted(assets.len())), beneficiary }])`, + * but could be something more exotic like sending the `assets` even further. + * + *- `origin`: Must be capable of withdrawing the `assets` and executing XCM. + *- `dest`: Destination context for the assets. Will typically be `[Parent, + * Parachain(..)]` to send from parachain to parachain, or `[Parachain(..)]` to send from + * relay to parachain, or `(parents: 2, (GlobalConsensus(..), ..))` to send from + * parachain across a bridge to another ecosystem destination. + *- `assets`: The assets to be withdrawn. This should include the assets used to pay the + * fee on the `dest` (and possibly reserve) chains. + *- `assets_transfer_type`: The XCM `TransferType` used to transfer the `assets`. + *- `remote_fees_id`: One of the included `assets` to be used to pay fees. + *- `fees_transfer_type`: The XCM `TransferType` used to transfer the `fees` assets. + *- `custom_xcm_on_dest`: The XCM to be executed on `dest` chain as the last step of the + * transfer, which also determines what happens to the assets on the destination chain. + *- `weight_limit`: The remote-side weight limit, if any, for the XCM fee purchase. + */ + "transfer_assets_using_type_and_then": Anonymize; + /** + *Authorize another `aliaser` location to alias into the local `origin` making this call. + *The `aliaser` is only authorized until the provided `expiry` block number. + *The call can also be used for a previously authorized alias in order to update its + *`expiry` block number. + * + *Usually useful to allow your local account to be aliased into from a remote location + *also under your control (like your account on another chain). + * + *WARNING: make sure the caller `origin` (you) trusts the `aliaser` location to act in + *their/your name. Once authorized using this call, the `aliaser` can freely impersonate + *`origin` in XCM programs executed on the local chain. + */ + "add_authorized_alias": Anonymize; + /** + *Remove a previously authorized `aliaser` from the list of locations that can alias into + *the local `origin` making this call. + */ + "remove_authorized_alias": Anonymize; + /** + *Remove all previously authorized `aliaser`s that can alias into the local `origin` + *making this call. + */ + "remove_all_authorized_aliases": undefined; +}>; +export type Ia5cotcvi888ln = { + "dest": XcmVersionedLocation; + "message": XcmVersionedXcm; +}; +export type I21jsa919m88fd = { + "dest": XcmVersionedLocation; + "beneficiary": XcmVersionedLocation; + "assets": XcmVersionedAssets; + "fee_asset_item": number; +}; +export type Iegif7m3upfe1k = { + "message": XcmVersionedXcm; + "max_weight": Anonymize; +}; +export type Icscpmubum33bq = { + "location": XcmVersionedLocation; +}; +export type I21d2olof7eb60 = { + "dest": XcmVersionedLocation; + "beneficiary": XcmVersionedLocation; + "assets": XcmVersionedAssets; + "fee_asset_item": number; + "weight_limit": XcmV3WeightLimit; +}; +export type Ie68np0vpihith = { + "assets": XcmVersionedAssets; + "beneficiary": XcmVersionedLocation; +}; +export type I9bnv6lu0crf1q = { + "dest": XcmVersionedLocation; + "assets": XcmVersionedAssets; + "assets_transfer_type": Anonymize; + "remote_fees_id": XcmVersionedAssetId; + "fees_transfer_type": Anonymize; + "custom_xcm_on_dest": XcmVersionedXcm; + "weight_limit": XcmV3WeightLimit; +}; +export type I4gnu4rrr0ftsf = AnonymousEnum<{ + "Teleport": undefined; + "LocalReserve": undefined; + "DestinationReserve": undefined; + "RemoteReserve": XcmVersionedLocation; +}>; +export type Iauhjqifrdklq7 = { + "aliaser": XcmVersionedLocation; + "expires"?: Anonymize; +}; +export type Ie1uso9m8rt5cf = { + "aliaser": XcmVersionedLocation; +}; +export type If582h5gr5gh6f = AnonymousEnum<{ + /** + *Initialize a conversion rate to native balance for the given asset. + * + *## Complexity + *- O(1) + */ + "create": Anonymize; + /** + *Update the conversion rate to native balance for the given asset. + * + *## Complexity + *- O(1) + */ + "update": Anonymize; + /** + *Remove an existing conversion rate to native balance for the given asset. + * + *## Complexity + *- O(1) + */ + "remove": Anonymize; +}>; +export type I9rkc7eqejp3rj = AnonymousEnum<{ + /** + *A dispatch that will fill the block weight up to the given ratio. + */ + "fill_block": Anonymize; + "trigger_defensive": undefined; +}>; +export type Ienjibnb78vnl0 = { + "ratio": number; +}; +export type Idifjg868aaa2d = AnonymousEnum<{ + /** + *Dispatch a given meta transaction. + * + *- `_origin`: Can be any kind of origin. + *- `meta_tx`: Meta Transaction with a target call to be dispatched. + */ + "dispatch": Anonymize; +}>; +export type I2jj01cl2iqks8 = { + "meta_tx": Anonymize; +}; +export type If5o72t5r3eu6c = { + "call": TxCallData; + "extension_version": number; + "extension": Anonymize; +}; +export type Id2qfro6pq4n39 = [Anonymize, undefined, undefined, undefined, undefined, undefined, ExtensionsCheckMortality, number, Anonymize]; +export type I9q0sdpojg74rm = AnonymousEnum<{ + "Signed": Anonymize; + "Disabled": undefined; +}>; +export type If3vk2hu0ms5lh = { + "signature": MultiSignature; + "account": SS58String; +}; +export type ExtensionsCheckMortality = Enum<{ + "Immortal": undefined; + "Mortal1": number; + "Mortal2": number; + "Mortal3": number; + "Mortal4": number; + "Mortal5": number; + "Mortal6": number; + "Mortal7": number; + "Mortal8": number; + "Mortal9": number; + "Mortal10": number; + "Mortal11": number; + "Mortal12": number; + "Mortal13": number; + "Mortal14": number; + "Mortal15": number; + "Mortal16": number; + "Mortal17": number; + "Mortal18": number; + "Mortal19": number; + "Mortal20": number; + "Mortal21": number; + "Mortal22": number; + "Mortal23": number; + "Mortal24": number; + "Mortal25": number; + "Mortal26": number; + "Mortal27": number; + "Mortal28": number; + "Mortal29": number; + "Mortal30": number; + "Mortal31": number; + "Mortal32": number; + "Mortal33": number; + "Mortal34": number; + "Mortal35": number; + "Mortal36": number; + "Mortal37": number; + "Mortal38": number; + "Mortal39": number; + "Mortal40": number; + "Mortal41": number; + "Mortal42": number; + "Mortal43": number; + "Mortal44": number; + "Mortal45": number; + "Mortal46": number; + "Mortal47": number; + "Mortal48": number; + "Mortal49": number; + "Mortal50": number; + "Mortal51": number; + "Mortal52": number; + "Mortal53": number; + "Mortal54": number; + "Mortal55": number; + "Mortal56": number; + "Mortal57": number; + "Mortal58": number; + "Mortal59": number; + "Mortal60": number; + "Mortal61": number; + "Mortal62": number; + "Mortal63": number; + "Mortal64": number; + "Mortal65": number; + "Mortal66": number; + "Mortal67": number; + "Mortal68": number; + "Mortal69": number; + "Mortal70": number; + "Mortal71": number; + "Mortal72": number; + "Mortal73": number; + "Mortal74": number; + "Mortal75": number; + "Mortal76": number; + "Mortal77": number; + "Mortal78": number; + "Mortal79": number; + "Mortal80": number; + "Mortal81": number; + "Mortal82": number; + "Mortal83": number; + "Mortal84": number; + "Mortal85": number; + "Mortal86": number; + "Mortal87": number; + "Mortal88": number; + "Mortal89": number; + "Mortal90": number; + "Mortal91": number; + "Mortal92": number; + "Mortal93": number; + "Mortal94": number; + "Mortal95": number; + "Mortal96": number; + "Mortal97": number; + "Mortal98": number; + "Mortal99": number; + "Mortal100": number; + "Mortal101": number; + "Mortal102": number; + "Mortal103": number; + "Mortal104": number; + "Mortal105": number; + "Mortal106": number; + "Mortal107": number; + "Mortal108": number; + "Mortal109": number; + "Mortal110": number; + "Mortal111": number; + "Mortal112": number; + "Mortal113": number; + "Mortal114": number; + "Mortal115": number; + "Mortal116": number; + "Mortal117": number; + "Mortal118": number; + "Mortal119": number; + "Mortal120": number; + "Mortal121": number; + "Mortal122": number; + "Mortal123": number; + "Mortal124": number; + "Mortal125": number; + "Mortal126": number; + "Mortal127": number; + "Mortal128": number; + "Mortal129": number; + "Mortal130": number; + "Mortal131": number; + "Mortal132": number; + "Mortal133": number; + "Mortal134": number; + "Mortal135": number; + "Mortal136": number; + "Mortal137": number; + "Mortal138": number; + "Mortal139": number; + "Mortal140": number; + "Mortal141": number; + "Mortal142": number; + "Mortal143": number; + "Mortal144": number; + "Mortal145": number; + "Mortal146": number; + "Mortal147": number; + "Mortal148": number; + "Mortal149": number; + "Mortal150": number; + "Mortal151": number; + "Mortal152": number; + "Mortal153": number; + "Mortal154": number; + "Mortal155": number; + "Mortal156": number; + "Mortal157": number; + "Mortal158": number; + "Mortal159": number; + "Mortal160": number; + "Mortal161": number; + "Mortal162": number; + "Mortal163": number; + "Mortal164": number; + "Mortal165": number; + "Mortal166": number; + "Mortal167": number; + "Mortal168": number; + "Mortal169": number; + "Mortal170": number; + "Mortal171": number; + "Mortal172": number; + "Mortal173": number; + "Mortal174": number; + "Mortal175": number; + "Mortal176": number; + "Mortal177": number; + "Mortal178": number; + "Mortal179": number; + "Mortal180": number; + "Mortal181": number; + "Mortal182": number; + "Mortal183": number; + "Mortal184": number; + "Mortal185": number; + "Mortal186": number; + "Mortal187": number; + "Mortal188": number; + "Mortal189": number; + "Mortal190": number; + "Mortal191": number; + "Mortal192": number; + "Mortal193": number; + "Mortal194": number; + "Mortal195": number; + "Mortal196": number; + "Mortal197": number; + "Mortal198": number; + "Mortal199": number; + "Mortal200": number; + "Mortal201": number; + "Mortal202": number; + "Mortal203": number; + "Mortal204": number; + "Mortal205": number; + "Mortal206": number; + "Mortal207": number; + "Mortal208": number; + "Mortal209": number; + "Mortal210": number; + "Mortal211": number; + "Mortal212": number; + "Mortal213": number; + "Mortal214": number; + "Mortal215": number; + "Mortal216": number; + "Mortal217": number; + "Mortal218": number; + "Mortal219": number; + "Mortal220": number; + "Mortal221": number; + "Mortal222": number; + "Mortal223": number; + "Mortal224": number; + "Mortal225": number; + "Mortal226": number; + "Mortal227": number; + "Mortal228": number; + "Mortal229": number; + "Mortal230": number; + "Mortal231": number; + "Mortal232": number; + "Mortal233": number; + "Mortal234": number; + "Mortal235": number; + "Mortal236": number; + "Mortal237": number; + "Mortal238": number; + "Mortal239": number; + "Mortal240": number; + "Mortal241": number; + "Mortal242": number; + "Mortal243": number; + "Mortal244": number; + "Mortal245": number; + "Mortal246": number; + "Mortal247": number; + "Mortal248": number; + "Mortal249": number; + "Mortal250": number; + "Mortal251": number; + "Mortal252": number; + "Mortal253": number; + "Mortal254": number; + "Mortal255": number; +}>; +export declare const ExtensionsCheckMortality: GetEnum; +export type I87rnrnks7g0hm = AnonymousEnum<{ + "Disabled": undefined; + "Enabled": undefined; +}>; +export type Idmcmrk34p8gic = AnonymousEnum<{ + /** + *Report voter equivocation/misbehavior. This method will verify the + *equivocation proof and validate the given key ownership proof + *against the extracted offender. If both are valid, the offence + *will be reported. + */ + "report_double_voting": Anonymize; + /** + *Report voter equivocation/misbehavior. This method will verify the + *equivocation proof and validate the given key ownership proof + *against the extracted offender. If both are valid, the offence + *will be reported. + * + *This extrinsic must be called unsigned and it is expected that only + *block authors will call it (validated in `ValidateUnsigned`), as such + *if the block author is defined it will be defined as the equivocation + *reporter. + */ + "report_double_voting_unsigned": Anonymize; + /** + *Reset BEEFY consensus by setting a new BEEFY genesis at `delay_in_blocks` blocks in the + *future. + * + *Note: `delay_in_blocks` has to be at least 1. + */ + "set_new_genesis": Anonymize; + /** + *Report fork voting equivocation. This method will verify the equivocation proof + *and validate the given key ownership proof against the extracted offender. + *If both are valid, the offence will be reported. + */ + "report_fork_voting": Anonymize; + /** + *Report fork voting equivocation. This method will verify the equivocation proof + *and validate the given key ownership proof against the extracted offender. + *If both are valid, the offence will be reported. + * + *This extrinsic must be called unsigned and it is expected that only + *block authors will call it (validated in `ValidateUnsigned`), as such + *if the block author is defined it will be defined as the equivocation + *reporter. + */ + "report_fork_voting_unsigned": Anonymize; + /** + *Report future block voting equivocation. This method will verify the equivocation proof + *and validate the given key ownership proof against the extracted offender. + *If both are valid, the offence will be reported. + */ + "report_future_block_voting": Anonymize; + /** + *Report future block voting equivocation. This method will verify the equivocation proof + *and validate the given key ownership proof against the extracted offender. + *If both are valid, the offence will be reported. + * + *This extrinsic must be called unsigned and it is expected that only + *block authors will call it (validated in `ValidateUnsigned`), as such + *if the block author is defined it will be defined as the equivocation + *reporter. + */ + "report_future_block_voting_unsigned": Anonymize; +}>; +export type Idrvp50hbkv2k2 = { + "equivocation_proof": Anonymize; + "key_owner_proof": Anonymize; +}; +export type Ie1uhej0oopvs5 = { + "vote": Anonymize; + "ancestry_proof": Anonymize; + "header": Anonymize; +}; +export type I499ogutcm86mj = { + "prev_peaks": Anonymize; + "prev_leaf_count": bigint; + "leaf_count": bigint; + "items": Anonymize; +}; +export type I7b7fp94l51vcq = Array>; +export type Idsa6q9es8ufjv = [bigint, FixedSizeBinary<32>]; +export type Ie11u326g2gsj3 = { + "equivocation_proof": Anonymize; + "key_owner_proof": Anonymize; +}; +export type I67t4bps9r5c4k = AnonymousEnum<{ + /** + *Reap the `IdentityInfo` of `who` from the Identity pallet of `T`, unreserving any + *deposits held and removing storage items associated with `who`. + */ + "reap_identity": Anonymize; + /** + *Update the deposit of `who`. Meant to be called by the system with an XCM `Transact` + *Instruction. + */ + "poke_deposit": Anonymize; +}>; +export type I4gil44d08grh = { + "prefix": FixedSizeBinary<16>; + "suffix": FixedSizeBinary<16>; +}; +export type I7u915mvkdsb08 = ResultPayload>; +export type Iam0ikmmkagrl5 = AnonymousEnum<{ + "NotImplemented": undefined; + "NotFound": Anonymize; + "Codec": undefined; +}>; +export type I34cq3ne0l8i73 = ResultPayload, Anonymize>; +export type I5nrjkj9qumobs = AnonymousEnum<{ + "Invalid": Anonymize; + "Unknown": TransactionValidityUnknownTransaction; +}>; +export type Ijr7mckqs242k = AnonymousEnum<{ + "Call": undefined; + "Payment": undefined; + "Future": undefined; + "Stale": undefined; + "BadProof": undefined; + "AncientBirthBlock": undefined; + "ExhaustsResources": undefined; + "Custom": number; + "BadMandatory": undefined; + "MandatoryValidation": undefined; + "BadSigner": undefined; + "IndeterminateImplicit": undefined; + "UnknownOrigin": undefined; +}>; +export type I9ask1o4tfvcvs = ResultPayload, Anonymize>; +export type I1v2gv5pb5e508 = Array>; +export type Ifoo6dq4385dqu = AnonymousEnum<{ + "Occupied": Anonymize; + "Scheduled": Anonymize; + "Free": undefined; +}>; +export type I24aelqm08mash = { + "next_up_on_available"?: Anonymize; + "occupied_since": number; + "time_out_at": number; + "next_up_on_time_out"?: Anonymize; + "availability": { + bytes: Uint8Array; + bitsLen: number; + }; + "group_responsible": number; + "candidate_hash": FixedSizeBinary<32>; + "candidate_descriptor": Anonymize; +}; +export type I92i81n5kpcgte = (Anonymize) | undefined; +export type Ifb5bd3f9a1lu8 = Array>; +export type I897qba6lnil66 = AnonymousEnum<{ + "CandidateBacked": Anonymize; + "CandidateIncluded": Anonymize; + "CandidateTimedOut": Anonymize; +}>; +export type I9aev4k6tfeeom = (Anonymize) | undefined; +export type I2eq6ah7t620fb = (Anonymize) | undefined; +export type Ia9lae907oki50 = { + "constraints": Anonymize; + "pending_availability": Anonymize; +}; +export type I3mtrfd5bfr7au = Array>; +export type I95qanb0nuj7cm = { + "candidate_hash": FixedSizeBinary<32>; + "descriptor": Anonymize; + "commitments": Anonymize; + "relay_parent_number": number; + "max_pov_size": number; +}; +export type Ieskfd0vl6pk5b = Array>; +export type I56054ohcnjknc = (Anonymize) | undefined; +export type I4persbbr073ol = { + "min_relay_parent_number": number; + "max_pov_size": number; + "max_code_size": number; + "max_head_data_size": number; + "ump_remaining": number; + "ump_remaining_bytes": number; + "max_ump_num_per_candidate": number; + "dmp_remaining_messages": Anonymize; + "hrmp_inbound": Anonymize; + "hrmp_channels_out": Anonymize; + "max_hrmp_num_per_candidate": number; + "required_parent": Binary; + "validation_code_hash": FixedSizeBinary<32>; + "upgrade_restriction"?: Anonymize; + "future_validation_code"?: Anonymize; +}; +export type I25plekc1moieu = { + "vote": Anonymize; + "ancestry_proof": Binary; + "header": Anonymize; +}; +export type I1ut1enje04g2m = AnonymousEnum<{ + "System": Anonymize; + "Babe": Anonymize; + "Timestamp": Anonymize; + "Indices": Anonymize; + "Balances": Anonymize; + "Staking": Anonymize; + "Parameters": Anonymize; + "Session": Anonymize; + "Grandpa": Anonymize; + "Utility": Anonymize; + "Identity": Anonymize; + "Recovery": Anonymize; + "Vesting": Anonymize; + "Scheduler": Anonymize; + "Preimage": Anonymize; + "Sudo": Anonymize; + "Proxy": Anonymize; + "Multisig": Anonymize; + "ElectionProviderMultiPhase": Anonymize; + "VoterList": Anonymize; + "NominationPools": Anonymize; + "FastUnstake": Anonymize; + "ConvictionVoting": Anonymize; + "Referenda": Anonymize; + "Whitelist": Anonymize; + "Treasury": Anonymize; + "Configuration": Anonymize; + "ParasShared": undefined; + "ParaInclusion": undefined; + "ParaInherent": Anonymize; + "Paras": Anonymize; + "Initializer": Anonymize; + "Hrmp": Anonymize; + "ParasDisputes": Anonymize; + "ParasSlashing": Anonymize; + "OnDemandAssignmentProvider": Anonymize; + "Registrar": Anonymize; + "Slots": Anonymize; + "ParasSudoWrapper": Anonymize; + "Auctions": Anonymize; + "Crowdloan": Anonymize; + "AssignedSlots": Anonymize; + "Coretime": Anonymize; + "StakingAhClient": Anonymize; + "MultiBlockMigrations": Anonymize; + "XcmPallet": Anonymize; + "MessageQueue": Anonymize; + "AssetRate": Anonymize; + "RootTesting": Anonymize; + "MetaTx": Anonymize; + "Beefy": Anonymize; + "IdentityMigrator": Anonymize; +}>; +export type Iftvbctbo05fu4 = ResultPayload, Anonymize>; +export type I4lvocd376nkvl = Array; +export type Iek7ha36da9mf5 = ResultPayload>; +export type Ie7s8tm59rggr4 = ResultPayload, Anonymize>; +export type If8b9c2q9tlavv = { + "execution_result": Anonymize; + "emitted_events": Anonymize; + "local_xcm"?: Anonymize; + "forwarded_xcms": Anonymize; +}; +export type Idncd8hsje2r4u = Array>; +export type Ieqgqma27vbupd = (XcmVersionedXcm) | undefined; +export type Ialhmrpub9sefe = Array>; +export type I56d9gmmhnf5oa = [XcmVersionedLocation, Anonymize]; +export type Ie1m9ii7jv2l7v = Array; +export type I6e426h0457po1 = ResultPayload, Anonymize>; +export type I870h1qaqk8cvh = { + "execution_result": Anonymize; + "emitted_events": Anonymize; + "forwarded_xcms": Anonymize; +}; +export type XcmVersionedAsset = Enum<{ + "V3": Anonymize; + "V4": Anonymize; + "V5": Anonymize; +}>; +export declare const XcmVersionedAsset: GetEnum; +export type Icujp6hmv35vbn = ResultPayload>; +export type I3886purtlrjg1 = AnonymousEnum<{ + "VersionedAssetConversionFailed": undefined; + "VersionedLocationConversionFailed": undefined; +}>; +export {}; diff --git a/examples/with-vite-papi/.papi/descriptors/dist/descriptors-FVMV6DXM.mjs b/examples/with-vite-papi/.papi/descriptors/dist/descriptors-FVMV6DXM.mjs new file mode 100644 index 0000000..8e538e5 --- /dev/null +++ b/examples/with-vite-papi/.papi/descriptors/dist/descriptors-FVMV6DXM.mjs @@ -0,0 +1,33 @@ +// .papi/descriptors/src/descriptors.ts +var [minified, commonTrees, tokens] = JSON.parse(`[{"dot":{"345":{"18":{"0":0,"1":1,"2":2,"3":3,"4":1,"5":4,"6":5,"7":1,"8":6,"9":7,"10":8,"11":1,"12":9,"13":10,"14":2,"15":2,"16":11,"17":12},"23":0,"27":1,"45":2,"48":3,"50":4,"57":5,"60":6,"62":7,"106":8,"109":9,"112":10,"118":11,"125":12,"127":13,"134":14,"137":15,"143":16,"144":17,"146":18,"147":19,"148":20,"150":21,"153":17,"156":22,"158":23,"160":24,"165":25,"178":26,"182":27,"204":28,"209":29,"210":17,"214":30,"219":31,"221":32,"224":33,"229":34,"251":35,"254":36,"258":37,"271":38,"277":39,"282":40,"284":41,"290":42,"293":43,"296":44,"298":45,"303":46,"308":47,"309":17,"313":48,"328":49,"332":50,"334":51,"337":52,"341":53,"344":54},"644":{"18":57,"23":{"357":35,"358":36,"359":37,"360":38,"361":39,"362":40,"363":41,"364":42,"365":43,"366":38},"27":58,"45":59,"48":60,"50":61,"57":62,"60":17,"62":17,"106":63,"109":17,"112":17,"118":64,"125":65,"127":17,"134":66,"137":67,"143":68,"144":17,"146":{"442":210,"443":210,"444":211,"445":212},"147":69,"148":70,"150":71,"153":{"457":237,"458":238,"459":237,"460":239,"461":237,"462":240},"156":{"463":246,"464":247,"465":247,"466":128,"467":248,"468":249,"469":250,"470":250,"471":251,"472":252},"158":{"473":257,"474":258,"475":259,"476":260},"160":72,"165":73,"178":74,"182":75,"204":76,"209":77,"210":17,"214":78,"219":17,"221":17,"224":79,"229":17,"251":80,"254":81,"258":17,"271":82,"277":17,"282":83,"284":84,"290":85,"293":17,"296":86,"298":87,"303":88,"308":89,"309":90,"313":91,"328":92,"332":93,"334":94,"337":95,"341":17,"344":17},"876":{"18":{"645":24,"646":25,"647":26,"648":27,"649":27,"650":28,"651":29},"23":{"652":44,"653":44,"654":45,"655":46,"656":47,"657":47,"658":47,"659":47,"660":47},"27":97,"45":17,"48":17,"50":98,"57":99,"60":100,"62":17,"106":101,"109":102,"112":17,"118":103,"125":104,"127":17,"134":105,"137":106,"143":107,"144":17,"146":{"738":213,"739":213,"740":214},"147":108,"148":109,"150":110,"153":{"745":241,"746":26,"747":26,"748":26,"749":242,"750":243},"156":{"751":243,"752":253,"753":254,"754":255,"755":255},"158":{"756":261,"757":262,"758":263,"759":264},"160":111,"165":112,"178":113,"182":114,"204":115,"209":{"676":150,"793":358,"794":359,"795":155,"796":26},"210":17,"214":17,"219":17,"221":116,"224":17,"229":17,"251":117,"254":17,"258":17,"271":118,"277":17,"282":119,"284":17,"290":120,"293":17,"296":121,"298":122,"303":123,"308":{"778":448,"831":472,"832":472,"833":448,"834":448,"835":448,"836":473,"837":448,"838":474,"839":448},"309":124,"313":125,"328":126,"332":127,"334":128,"337":17,"341":17,"344":17},"974":{"18":129,"23":130,"27":17,"45":131,"48":132,"50":133,"57":134,"60":135,"62":17,"106":136,"109":17,"112":17,"118":17,"125":137,"127":17,"134":138,"137":139,"143":140,"144":17,"146":17,"147":17,"148":141,"150":142,"153":143,"156":144,"158":145,"160":146,"165":147,"178":148,"182":149,"204":150,"209":133,"210":17,"214":17,"219":17,"221":17,"224":17,"229":17,"251":151,"254":17,"258":17,"271":17,"277":17,"282":17,"284":17,"290":152,"293":17,"296":153,"298":154,"303":155,"308":156,"309":157,"313":158,"328":17,"332":159,"334":17,"337":137,"341":17,"344":17},"1087":{"198":161,"976":162,"980":163,"988":{"984":556,"985":557,"986":558,"987":559},"996":164,"999":165,"1001":166,"1003":167,"1035":168,"1040":169,"1046":170,"1049":171,"1052":172,"1057":173,"1059":174,"1062":175,"1064":176,"1069":177,"1072":{"1067":622,"1068":623,"1070":624,"1071":625},"1077":178,"1080":{"1078":630,"1079":631},"1082":179,"1086":180}},"ksm":{"345":{"18":{"0":0,"1":1,"2":2,"3":3,"4":1,"5":4,"6":5,"7":1,"8":6,"9":7,"10":636,"11":1,"12":9,"13":10,"14":2,"15":2,"16":11,"17":12},"23":{"19":1,"20":707,"21":32,"22":33},"27":1,"45":2,"48":3,"50":4,"57":{"0":73,"51":55,"52":55,"53":74,"54":75,"55":638,"56":77},"60":6,"62":7,"106":8,"109":9,"112":10,"118":11,"125":12,"127":13,"134":14,"137":15,"143":{"138":1,"139":639,"140":199,"141":106,"142":4},"144":17,"146":18,"147":19,"148":20,"150":21,"153":17,"156":{"154":713,"155":245},"158":23,"160":24,"165":25,"178":{"168":1,"169":285,"170":286,"171":287,"172":1,"173":288,"174":1,"175":289,"176":724,"177":291},"182":27,"204":28,"209":29,"210":17,"214":30,"219":31,"221":32,"224":33,"229":34,"251":35,"254":36,"258":37,"271":38,"277":39,"282":40,"284":41,"293":43,"296":44,"298":45,"303":46,"308":47,"309":17,"328":49,"332":50,"334":51,"337":52,"341":53,"344":54,"1090":{"1088":106,"1089":314,"IdToIndex":641,"IndexToId":642,"Voting":643,"VotingCleanup":5},"1091":{"138":1,"139":652,"140":653,"141":106,"142":4},"1092":{"147":665,"205":97,"1088":1,"1089":666,"Pot":55,"Founder":97,"Rules":6,"Payouts":667,"MemberByIndex":668,"SuspendedMembers":666,"RoundCount":1,"Bids":669,"Candidates":670,"Skeptic":97,"Votes":671,"VoteClearCursor":672,"NextHead":673,"ChallengeRoundCount":1,"Defending":674,"DefenderVotes":675},"1095":55,"1096":{"QueueTotals":727,"Queues":728,"Summary":729,"Receipts":730},"1097":{"0":73,"51":55,"52":55,"53":74,"54":75,"55":638,"56":739},"1098":42},"644":{"18":57,"23":{"357":708,"358":36,"359":709,"360":38,"361":710,"362":711,"363":41,"364":42,"365":43,"366":38},"27":58,"45":59,"48":60,"50":61,"57":62,"60":17,"62":17,"106":63,"109":17,"112":17,"118":64,"125":65,"127":17,"134":66,"137":67,"143":96,"144":17,"146":{"442":210,"443":210,"444":211,"445":656},"147":69,"148":70,"150":71,"153":{"457":658,"458":659,"459":658,"460":660,"461":658,"462":661},"156":{"463":714,"464":715,"465":715,"466":128,"467":716,"468":717,"469":250,"470":250,"471":251,"472":718},"158":{"473":721,"474":722,"475":259,"476":260},"160":72,"165":73,"178":{"434":726,"490":725,"491":293,"492":294,"493":296},"182":75,"204":76,"209":77,"210":17,"214":78,"219":17,"221":17,"224":79,"229":17,"251":80,"254":81,"258":17,"271":82,"277":17,"282":83,"284":84,"293":17,"296":86,"298":87,"303":88,"308":89,"309":90,"328":92,"332":93,"334":94,"337":95,"341":17,"344":17,"1090":{"428":646,"add_member":644,"promote_member":644,"demote_member":644,"remove_member":645,"cleanup_poll":647,"exchange_member":648},"1091":96,"1092":{"425":128,"428":677,"606":124,"611":128,"unbid":128,"vouch":676,"unvouch":128,"defender_vote":678,"waive_repay":679,"found_society":680,"judge_suspended_member":681,"set_parameters":682,"punish_skeptic":128,"claim_membership":128,"bestow_membership":683,"kick_candidate":683,"resign_candidacy":128,"drop_candidate":683,"cleanup_candidacy":684,"cleanup_challenge":685},"1095":{"1099":699,"1100":700,"1101":701,"1102":702,"1103":700,"1104":702,"1105":703,"1106":128,"1107":702},"1096":{"place_bid":732,"retract_bid":732,"fund_deficit":128,"thaw_private":733,"thaw_communal":68,"communify":68,"privatize":68},"1097":62,"1098":85},"876":{"18":{"645":24,"646":637,"647":26,"648":27,"649":27,"650":28,"651":29},"23":{"652":44,"653":44,"654":712,"655":46,"656":47,"657":47,"658":47,"659":47,"660":47},"27":97,"45":17,"48":17,"50":98,"57":99,"60":100,"62":17,"106":101,"109":102,"112":17,"118":103,"125":104,"127":17,"134":105,"137":106,"143":107,"144":17,"146":{"738":213,"739":213,"740":657},"147":108,"148":109,"150":110,"153":{"745":662,"746":26,"747":26,"748":26,"749":663,"750":664},"156":{"751":664,"752":719,"753":254,"754":720,"755":720},"158":{"756":261,"757":262,"758":723,"759":264},"160":111,"165":112,"178":113,"182":114,"204":115,"209":{"676":150,"793":740,"794":359,"795":155,"796":26},"210":17,"214":17,"219":17,"221":116,"224":17,"229":17,"251":117,"254":17,"258":17,"271":118,"277":17,"282":119,"284":17,"293":17,"296":121,"298":122,"303":123,"308":{"778":448,"831":472,"832":472,"833":448,"834":448,"835":448,"836":741,"837":448,"838":474,"839":448},"309":124,"328":126,"332":127,"334":128,"337":17,"341":17,"344":17,"1090":{"782":649,"1108":650,"MemberAdded":92,"RankChanged":649,"MemberExchanged":651},"1091":{"722":204,"723":205,"724":205,"725":90,"726":654,"727":72,"728":72,"729":655,"730":72,"731":655,"732":655,"733":655,"734":655,"735":205,"736":208,"737":208},"1092":{"674":183,"Founded":686,"Bid":687,"Vouch":688,"AutoUnbid":689,"Unbid":689,"Unvouch":689,"Inducted":690,"SuspendedMemberJudgement":691,"CandidateSuspended":689,"MemberSuspended":692,"Challenged":692,"Vote":693,"DefenderVote":694,"NewParams":695,"Unfounded":686,"Elevated":696},"1095":{"1109":27,"1110":704,"1111":705,"1112":704,"1113":704,"1114":706},"1096":{"682":735,"686":736,"BidPlaced":734,"BidRetracted":734,"BidDropped":734,"Funded":737,"Transferred":738},"1097":99,"1098":120},"974":{"18":129,"23":130,"27":17,"45":131,"48":132,"50":133,"57":134,"60":135,"62":17,"106":136,"109":17,"112":17,"118":17,"125":137,"127":17,"134":138,"137":139,"143":140,"144":17,"146":17,"147":17,"148":141,"150":142,"153":143,"156":144,"158":145,"160":146,"165":147,"178":148,"182":149,"204":150,"209":133,"210":17,"214":17,"219":17,"221":17,"224":17,"229":17,"251":151,"254":17,"258":17,"271":17,"277":17,"282":17,"284":17,"293":17,"296":153,"298":154,"303":155,"308":156,"309":157,"328":17,"332":159,"334":17,"337":137,"341":17,"344":17,"1090":17,"1091":140,"1092":{"904":175,"GraceStrikes":1,"PeriodSpend":55,"VotingPeriod":1,"ClaimPeriod":1,"MaxLockDuration":1,"ChallengePeriod":1,"MaxPayouts":1,"MaxBids":1},"1095":160,"1096":{"904":175,"QueueCount":1,"MaxQueueLen":1,"FifoQueueLen":1,"BasePeriod":1,"MinBid":55,"MinReceipt":55,"IntakePeriod":1,"MaxIntakeWeight":34,"ThawThrottle":731},"1097":134,"1098":152},"1087":{"198":161,"976":162,"980":163,"988":{"984":742,"985":557,"986":558,"987":559},"996":164,"999":165,"1001":166,"1003":167,"1035":168,"1040":169,"1046":170,"1049":171,"1052":172,"1057":173,"1059":174,"1062":175,"1064":176,"1069":177,"1072":{"1067":622,"1068":623,"1070":743,"1071":744},"1077":178,"1080":{"1078":745,"1079":746},"1082":179,"1086":180}},"paseo":{"345":{"18":{"0":0,"1":1,"2":2,"3":3,"4":1,"5":4,"6":5,"7":1,"8":6,"9":7,"10":747,"11":1,"12":9,"13":10,"14":2,"15":2,"16":11,"17":12},"23":0,"27":1,"45":2,"48":3,"50":4,"57":5,"60":6,"62":7,"106":8,"109":9,"112":10,"118":11,"125":12,"127":13,"134":14,"137":15,"143":16,"144":17,"146":18,"147":19,"148":20,"150":21,"153":17,"156":22,"158":23,"160":24,"165":25,"178":26,"182":27,"204":28,"209":29,"210":17,"214":30,"219":31,"221":32,"224":33,"229":34,"251":35,"254":36,"258":37,"271":38,"277":39,"282":40,"284":41,"290":42,"293":43,"296":44,"298":45,"303":46,"308":47,"309":17,"313":48,"328":49,"332":50,"334":51,"337":52,"341":53,"344":54,"1119":17,"1121":56},"644":{"18":57,"23":{"357":749,"358":36,"359":750,"360":38,"361":751,"362":752,"363":41,"364":42,"365":43,"366":38},"27":58,"45":59,"48":60,"50":61,"57":62,"60":17,"62":17,"106":63,"109":17,"112":17,"118":64,"125":65,"127":17,"134":66,"137":67,"143":68,"144":17,"146":{"442":210,"443":210,"444":211,"445":754},"147":69,"148":70,"150":71,"153":{"457":756,"458":757,"459":756,"460":758,"461":756,"462":759},"156":{"463":763,"464":247,"465":247,"466":128,"467":248,"468":249,"469":250,"470":250,"471":251,"472":764},"158":{"473":765,"474":766,"475":259,"476":260},"160":72,"165":73,"178":74,"182":75,"204":76,"209":77,"210":17,"214":78,"219":17,"221":17,"224":79,"229":17,"251":80,"254":81,"258":17,"271":82,"277":17,"282":83,"284":84,"290":85,"293":17,"296":86,"298":87,"303":88,"308":89,"309":90,"313":91,"328":92,"332":93,"334":94,"337":95,"341":17,"344":17,"1119":{"1122":770,"1123":445,"1124":445,"1125":445,"1126":771,"1127":416},"1121":{"1128":754,"1129":759,"1130":772,"1131":773,"1132":128}},"876":{"18":{"645":24,"646":748,"647":26,"648":27,"649":27,"650":28,"651":29},"23":{"652":44,"653":44,"654":753,"655":46,"656":47,"657":47,"658":47,"659":47,"660":47},"27":97,"45":17,"48":17,"50":98,"57":99,"60":100,"62":17,"106":101,"109":102,"112":17,"118":103,"125":104,"127":17,"134":105,"137":106,"143":107,"144":17,"146":{"738":213,"739":213,"740":755},"147":108,"148":109,"150":110,"153":{"745":760,"746":26,"747":26,"748":26,"749":761,"750":762},"156":{"751":762,"752":253,"753":254,"754":255,"755":255},"158":{"756":261,"757":262,"758":767,"759":264},"160":111,"165":112,"178":113,"182":114,"204":115,"209":{"676":150,"793":768,"794":359,"795":155,"796":26},"210":17,"214":17,"219":17,"221":116,"224":17,"229":17,"251":117,"254":17,"258":17,"271":118,"277":17,"282":119,"284":17,"290":120,"293":17,"296":121,"298":122,"303":123,"308":{"778":448,"831":472,"832":472,"833":448,"834":448,"835":448,"836":769,"837":448,"838":474,"839":448},"309":124,"313":125,"328":126,"332":127,"334":128,"337":17,"341":17,"344":17,"1119":17,"1121":{"1133":774,"1134":775,"1135":26,"1136":774}},"974":{"18":129,"23":130,"27":17,"45":131,"48":132,"50":133,"57":134,"60":135,"62":17,"106":136,"109":17,"112":17,"118":17,"125":137,"127":17,"134":138,"137":139,"143":140,"144":17,"146":17,"147":17,"148":141,"150":142,"153":143,"156":144,"158":145,"160":146,"165":147,"178":148,"182":149,"204":150,"209":133,"210":17,"214":17,"219":17,"221":17,"224":17,"229":17,"251":151,"254":17,"258":17,"271":17,"277":17,"282":17,"284":17,"290":152,"293":17,"296":153,"298":154,"303":155,"308":156,"309":157,"313":158,"328":17,"332":159,"334":17,"337":137,"341":17,"344":17,"1119":17,"1121":17},"1087":{"198":161,"976":162,"980":163,"988":{"984":776,"985":557,"986":558,"987":559},"996":164,"999":165,"1001":166,"1003":167,"1035":168,"1040":169,"1046":170,"1049":171,"1052":172,"1057":173,"1059":174,"1062":175,"1064":176,"1069":177,"1072":{"1067":622,"1068":623,"1070":777,"1071":778},"1077":178,"1080":{"1078":779,"1079":780},"1082":179,"1086":180}},"wnd":{"345":{"18":{"0":0,"1":1,"2":2,"3":3,"4":1,"5":4,"6":5,"7":1,"8":6,"9":7,"10":781,"11":1,"12":9,"13":10,"14":2,"15":2,"16":11,"17":12,"ExtrinsicWeightReclaimed":34},"23":{"19":1,"20":838,"21":32,"22":33},"27":1,"45":2,"48":3,"50":4,"57":{"0":73,"51":55,"52":55,"53":74,"54":75,"55":786,"56":77},"60":6,"62":7,"106":{"63":1,"64":1,"65":98,"66":99,"67":55,"68":55,"69":55,"70":1,"71":100,"72":101,"73":102,"74":1,"75":1,"76":103,"77":1,"78":104,"79":1,"80":1,"81":1,"82":105,"83":106,"84":107,"85":108,"86":107,"87":109,"88":110,"89":111,"90":112,"91":113,"92":112,"93":114,"94":1,"95":1,"96":55,"97":115,"98":116,"99":117,"100":118,"101":119,"102":120,"103":1,"105":1},"109":9,"112":10,"118":{"73":98,"104":116,"113":1,"114":2,"115":162,"116":163,"117":164},"125":12,"127":13,"134":{"128":1,"129":173,"130":55,"131":121,"132":1,"133":873,"LastSpendPeriod":1},"137":15,"143":{"138":1,"139":870,"140":199,"141":106,"142":4},"144":17,"146":18,"147":19,"150":21,"153":17,"156":{"154":847,"155":245},"158":23,"178":26,"182":{"179":301,"180":1,"181":302,"NextNodeAutoRebagged":97,"Lock":374},"204":28,"209":29,"210":17,"214":30,"219":{"215":1,"216":121,"217":172,"218":879},"221":{"220":880},"224":{"222":374,"223":883},"229":{"225":377,"227":1,"228":885},"251":{"230":380,"231":172,"232":121,"233":381,"234":5,"235":106,"236":4,"237":382,"238":383,"239":116,"240":106,"241":116,"242":4,"243":384,"244":385,"245":116,"246":116,"247":386,"248":387,"249":388,"250":389,"AuthorizedCodeHash":886},"254":36,"258":37,"271":38,"277":39,"282":40,"284":{"97":889,"283":106},"293":43,"296":44,"298":45,"303":46,"308":47,"309":17,"328":{"314":55,"315":916,"316":388,"317":1,"318":917,"319":918,"320":919,"321":920,"322":497,"323":921,"324":922,"325":2,"326":2,"327":923,"AuthorizedAliases":924},"332":50,"334":{"333":954},"337":52,"341":53,"344":54,"1095":55,"1098":{"285":433,"286":434,"287":435,"288":436,"289":303,"Credits":356},"1121":56,"1137":{"IdentityOf":801,"UsernameOf":672,"SuperOf":802,"SubsOf":803,"Registrars":804,"AuthorityOf":805,"UsernameInfoOf":806,"PendingUsernames":807,"UnbindingUsernames":808},"1138":{"Delegators":876,"CounterForDelegators":1,"Agents":877,"CounterForAgents":1},"1139":17,"1140":{"PermanentSlots":893,"PermanentSlotCount":1,"TemporarySlots":894,"TemporarySlotCount":1,"ActiveTemporarySlotCount":1,"MaxTemporarySlots":1,"MaxPermanentSlots":1},"1141":{"ValidatorSet":900,"IncompleteValidatorSetReport":901,"ValidatorPoints":314,"Mode":902,"NextSessionChangesValidators":1,"ValidatorSetAppliedAt":1,"BufferedOffences":903},"1142":{"Cursor":908,"Historic":909},"1143":17,"1144":17,"1145":17,"1146":17},"644":{"18":57,"23":{"357":839,"358":36,"359":840,"360":38,"361":841,"362":842,"363":41,"364":42,"365":43,"366":38},"27":58,"45":59,"48":60,"50":{"376":68,"377":69,"378":68,"379":70,"380":68,"1147":68},"57":62,"60":17,"62":17,"106":{"389":122,"390":123,"391":124,"392":125,"393":126,"394":127,"395":128,"396":129,"397":128,"398":130,"399":131,"400":132,"401":128,"402":128,"403":133,"404":134,"405":128,"406":135,"407":136,"408":124,"409":134,"410":137,"411":138,"412":139,"413":140,"414":130,"415":141,"416":142,"417":143,"418":144,"migrate_currency":139,"manual_slash":787},"109":17,"112":17,"118":64,"125":65,"127":17,"134":{"422":176,"423":177,"424":874,"425":68,"426":68,"427":68},"137":67,"143":{"358":68,"434":871,"435":68,"436":68,"437":68,"438":68,"439":202,"440":68,"441":203},"144":17,"146":{"442":210,"443":210,"444":211,"445":844},"147":69,"150":71,"153":{"457":792,"458":793,"459":792,"460":794,"461":792,"462":795,"if_else":796,"dispatch_as_fallible":794},"156":{"463":848,"464":849,"465":849,"466":128,"467":850,"468":851,"469":250,"470":250,"471":251,"472":852,"1147":128},"158":{"473":857,"474":858,"475":259,"476":260,"1147":859},"178":{"434":295,"490":292,"491":293,"492":294,"493":128},"182":75,"204":76,"209":77,"210":17,"214":{"520":130,"521":130,"522":130,"523":130,"524":130,"525":130,"526":130,"528":130,"529":130,"530":130,"531":362,"532":362,"533":130,"534":130,"535":130,"536":130,"537":130,"538":130,"539":130,"540":130,"541":130,"542":130,"543":130,"544":130,"545":130,"546":363,"547":363,"548":130,"549":130,"550":130,"551":130,"552":130,"553":130,"554":130,"555":130,"556":364,"557":365,"558":366,"559":363,"560":130,"561":130,"562":130,"564":130,"565":367,"566":130,"567":368},"219":17,"221":17,"224":{"568":884},"229":17,"251":{"569":390,"570":391,"571":392,"572":391,"573":393,"574":394,"575":395,"576":396,"577":397,"remove_upgrade_cooldown":393,"authorize_force_set_current_code_hash":887,"apply_authorized_force_set_current_code":390},"254":81,"258":17,"271":82,"277":17,"282":83,"284":{"591":890},"293":17,"296":86,"298":87,"303":88,"308":89,"309":{"616":476,"617":477,"618":478,"credit_account":899},"328":{"625":925,"626":926,"627":926,"628":927,"629":928,"630":505,"631":929,"632":929,"633":930,"634":930,"635":508,"636":930,"637":931,"638":932,"add_authorized_alias":933,"remove_authorized_alias":934,"remove_all_authorized_aliases":128},"332":93,"334":{"500":955,"641":955,"642":956},"337":{"643":546,"report_double_voting":545,"report_double_voting_unsigned":545,"report_fork_voting":963,"report_fork_voting_unsigned":963,"report_future_block_voting":964,"report_future_block_voting_unsigned":964},"341":17,"344":17,"1095":{"1099":834,"1100":700,"1101":701,"1102":702,"1103":700,"1104":702,"1105":703,"1106":128,"1107":702,"1147":835},"1098":{"592":437,"593":437,"place_order_with_credits":437},"1121":{"1128":844,"1129":795,"1130":772,"1131":845,"1132":128},"1137":{"add_registrar":702,"set_identity":809,"set_subs":810,"clear_identity":128,"request_judgement":811,"cancel_request":812,"set_fee":813,"set_account_id":69,"set_fields":814,"provide_judgement":815,"kill_identity":231,"add_sub":816,"rename_sub":816,"remove_sub":817,"quit_sub":128,"add_username_authority":818,"remove_username_authority":819,"set_username_for":820,"accept_username":821,"remove_expired_approval":821,"set_primary_username":821,"unbind_username":821,"remove_username":821,"kill_username":821},"1138":17,"1139":{"1122":770,"1123":445,"1124":445,"1125":445,"1126":891,"1127":416},"1140":{"assign_perm_parachain_slot":445,"assign_temp_parachain_slot":895,"unassign_parachain_slot":445,"set_max_permanent_slots":896,"set_max_temporary_slots":896},"1141":{"1037":904,"set_mode":905,"force_on_migration_end":128},"1142":{"force_set_cursor":910,"force_set_active_cursor":911,"force_onboard_mbms":128,"clear_historic":912},"1143":{"fill_block":960,"trigger_defensive":128},"1144":{"dispatch":961},"1145":17,"1146":{"1147":965,"reap_identity":965}},"876":{"18":{"645":24,"646":783,"647":26,"648":27,"649":27,"650":28,"651":29,"RejectedInvalidAuthorizedUpgrade":784},"23":{"652":44,"653":44,"654":843,"655":46,"656":47,"657":47,"658":47,"659":47,"660":47,"AgendaIncomplete":479},"27":97,"45":17,"48":17,"50":{"664":71,"665":72,"666":71,"1148":785},"57":99,"60":100,"62":17,"106":{"66":150,"93":156,"676":147,"689":145,"690":146,"691":148,"692":149,"693":26,"694":150,"695":150,"696":151,"697":26,"698":152,"699":788,"700":154,"701":155,"702":155,"703":157,"CurrencyMigrated":789},"109":102,"112":{"RootStored":72,"RootsPruned":790},"118":{"705":149,"NewQueued":26,"ValidatorDisabled":791,"ValidatorReenabled":791},"125":104,"127":17,"134":{"674":183,"709":179,"710":180,"711":181,"712":182,"713":184,"714":185,"715":875,"716":72,"717":187,"718":187,"719":72},"137":{"720":196,"721":197,"1108":868,"VoteRemoved":868,"VoteUnlocked":869},"143":107,"144":17,"146":{"738":213,"739":213,"740":872},"147":108,"150":{"743":236,"744":27,"VestingCreated":837},"153":{"745":797,"746":26,"747":26,"748":26,"749":798,"750":799,"IfElseMainSuccess":26,"IfElseFallbackCalled":800},"156":{"751":799,"752":853,"753":254,"754":855,"755":855,"1148":856,"PureKilled":854},"158":{"756":261,"757":262,"758":860,"759":264,"1148":861},"178":113,"182":114,"204":{"66":338,"694":340,"695":341,"778":337,"779":339,"780":342,"781":343,"782":863,"783":345,"784":346,"785":347,"786":348,"787":349,"788":350,"789":351,"790":352,"791":353,"792":353,"MemberClaimPermissionUpdated":864,"MetadataUpdated":865,"PoolNominationMade":865,"PoolNominatorChilled":865,"GlobalParamsUpdated":866},"209":{"676":150,"793":867,"794":359,"795":155,"796":26},"210":17,"214":17,"219":17,"221":{"797":881,"798":881,"799":882,"800":373},"224":17,"229":17,"251":{"801":398,"802":398,"803":398,"804":398,"805":399,"806":400,"807":400,"808":400,"UpgradeCooldownRemoved":448,"CodeAuthorized":888},"254":17,"258":17,"271":118,"277":17,"282":119,"284":17,"293":17,"296":121,"298":122,"303":123,"308":{"778":448,"831":472,"832":472,"833":448,"834":448,"835":448,"836":892,"837":448,"838":474,"839":448},"309":124,"328":{"845":935,"846":936,"847":939,"848":940,"849":515,"850":516,"851":515,"852":515,"853":941,"854":939,"855":518,"856":942,"857":943,"858":944,"859":945,"860":946,"861":939,"862":947,"863":948,"864":948,"865":948,"866":949,"867":942,"868":527,"SendFailed":937,"ProcessXcmError":938,"AliasAuthorized":950,"AliasAuthorizationRemoved":951,"AliasesAuthorizationsRemoved":952},"332":127,"334":{"873":957,"874":958,"875":959},"337":17,"341":17,"344":17,"1095":{"1109":27,"1110":704,"1111":705,"1112":704,"1113":704,"1114":706,"1148":836},"1098":{"819":438,"820":439,"AccountCredited":90},"1121":{"1133":846,"1134":775,"1135":26,"1136":846},"1137":{"IdentitySet":92,"IdentityCleared":822,"IdentityKilled":822,"JudgementRequested":823,"JudgementUnrequested":823,"JudgementGiven":824,"RegistrarAdded":825,"SubIdentityAdded":826,"SubIdentitiesSet":827,"SubIdentityRenamed":828,"SubIdentityRemoved":826,"SubIdentityRevoked":826,"AuthorityAdded":829,"AuthorityRemoved":829,"UsernameSet":830,"UsernameQueued":831,"PreapprovalExpired":832,"PrimaryUsernameSet":830,"DanglingUsernameRemoved":830,"UsernameUnbound":833,"UsernameRemoved":833,"UsernameKilled":833},"1138":{"676":878,"720":878,"Released":878,"MigratedDelegation":878},"1139":17,"1140":{"PermanentSlotAssigned":398,"TemporarySlotAssigned":398,"MaxPermanentSlotsChanged":897,"MaxTemporarySlotsChanged":897},"1141":{"ValidatorSetReceived":906,"CouldNotMergeAndDropped":26,"SetTooSmallAndDropped":26,"Unexpected":907},"1142":{"UpgradeStarted":913,"UpgradeCompleted":26,"UpgradeFailed":26,"MigrationSkipped":72,"MigrationAdvanced":914,"MigrationCompleted":914,"MigrationFailed":914,"HistoricCleared":915},"1143":{"DefensiveTestCall":26},"1144":{"654":962},"1145":17,"1146":{"IdentityReaped":92,"DepositUpdated":966}},"974":{"18":{"877":13,"878":14,"879":1,"880":15,"881":782,"882":1},"23":130,"27":17,"45":131,"48":132,"50":133,"57":134,"60":135,"62":17,"106":{"895":1,"896":1,"897":1,"898":1,"899":1,"900":1,"MaxValidatorSet":1},"109":17,"112":17,"118":{"KeyDeposit":55},"125":137,"127":17,"134":{"902":1,"903":1,"904":175,"905":1,"906":1,"pot_account":97},"137":139,"143":140,"144":17,"146":17,"147":17,"150":142,"153":143,"156":144,"158":145,"178":{"938":1,"939":1,"940":55,"941":1,"942":34,"943":1,"944":55,"945":55,"946":55,"947":1,"948":1,"949":34,"950":1,"951":1,"MaxBackersPerWinner":1},"182":{"952":303,"MaxAutoRebagPerBlock":1},"204":150,"209":133,"210":17,"214":17,"219":17,"221":17,"224":17,"229":17,"251":151,"254":17,"258":17,"271":17,"277":17,"282":17,"284":17,"293":17,"296":153,"298":154,"303":155,"308":156,"309":{"967":1,"968":898},"328":{"UniversalLocation":898,"AdvertisedXcmVersion":1,"MaxLockers":1,"MaxRemoteLockConsumers":1},"332":159,"334":17,"337":137,"341":17,"344":17,"1095":160,"1098":152,"1121":17,"1137":{"BasicDeposit":55,"ByteDeposit":55,"UsernameDeposit":55,"SubAccountDeposit":55,"MaxSubAccounts":1,"MaxRegistrars":1,"PendingUsernameExpiration":1,"UsernameGracePeriod":1,"MaxSuffixLength":1,"MaxUsernameLength":1},"1138":{"95":1,"904":175},"1139":17,"1140":{"PermanentSlotLeasePeriodLength":1,"TemporarySlotLeasePeriodLength":1,"MaxTemporarySlotPerLeasePeriod":1},"1141":17,"1142":{"CursorMaxLen":1,"IdentifierMaxLen":1},"1143":17,"1144":17,"1145":17,"1146":17},"1087":{"198":161,"980":{"977":967,"978":551,"979":552},"988":{"984":969,"985":557,"986":558,"987":559},"996":{"989":560,"990":561,"991":562,"992":563,"993":564,"994":565,"995":566,"member_total_balance":560,"pool_balance":563,"pool_accounts":990},"999":165,"1001":{"1000":970},"1003":167,"1035":{"1004":572,"1005":573,"1006":971,"1007":575,"1008":576,"1009":577,"1010":578,"1011":579,"1012":972,"1013":973,"1014":582,"1015":583,"1016":584,"1017":974,"1018":586,"1019":587,"1020":572,"1021":588,"1022":589,"1023":590,"1024":591,"1025":592,"1026":593,"1027":578,"1028":975,"1029":595,"1030":555,"1031":596,"1032":578,"1033":597,"1034":976,"validation_code_bomb_limit":578,"backing_constraints":977,"scheduling_lookahead":578,"para_ids":555},"1040":{"1036":599,"1037":600,"1039":602,"submit_report_double_voting_unsigned_extrinsic":601,"submit_report_fork_voting_unsigned_extrinsic":978,"submit_report_future_block_voting_unsigned_extrinsic":979,"generate_ancestry_proof":980},"1046":170,"1049":171,"1052":172,"1057":173,"1059":174,"1062":175,"1064":176,"1069":177,"1072":{"1067":622,"1068":623,"1070":981,"1071":982},"1077":{"1073":983,"1074":984,"1075":985,"1076":986},"1080":{"1078":987,"1079":988},"1082":{"1081":989},"1086":180,"RuntimeViewFunction":{"execute_view_function":968},"TrustedQueryApi":{"is_trusted_reserve":991,"is_trusted_teleporter":991}}}},[{"19":1,"20":31,"21":32,"22":33},{"24":48,"25":49,"26":50},{"28":55,"29":56,"30":55,"31":55,"32":6,"33":57,"34":6,"35":56,"36":1,"37":58,"38":59,"39":60,"40":61,"41":1,"42":62,"43":62,"44":63},{"46":55,"47":2},{"49":67},{"0":73,"51":55,"52":55,"53":74,"54":75,"55":76,"56":77},{"58":55,"59":95},{"61":97},{"63":1,"64":1,"65":98,"66":99,"67":55,"68":55,"69":55,"70":1,"71":100,"72":101,"73":102,"74":1,"75":1,"76":103,"77":1,"78":104,"79":1,"80":1,"81":1,"82":105,"83":106,"84":107,"85":108,"86":107,"87":109,"88":110,"89":111,"90":112,"91":113,"92":112,"93":114,"94":1,"95":1,"96":55,"97":115,"98":116,"99":117,"100":118,"101":119,"102":120,"103":1,"104":121,"105":1},{"107":158,"108":159},{"110":161,"111":61},{"73":98,"104":121,"113":1,"114":2,"115":162,"116":163,"117":164},{"29":56,"119":166,"120":167,"121":1,"122":61,"123":55,"124":168},{"116":172,"126":172},{"128":1,"129":173,"130":55,"131":121,"132":1,"133":174},{"135":188,"136":189},{"138":1,"139":198,"140":199,"141":106,"142":4},{},{"145":209},{"147":215},{"148":218,"149":55,"150":219,"151":220,"152":221},{"59":230,"150":229},{"154":244,"155":245},{"157":256},{"159":1,"160":265,"161":5,"162":121},{"163":1,"164":106,"165":277,"166":5,"167":112},{"168":1,"169":285,"170":286,"171":287,"172":1,"173":288,"174":1,"175":289,"176":290,"177":291},{"179":301,"180":1,"181":302},{"183":55,"184":55,"185":55,"186":1,"187":1,"188":1,"189":1,"190":310,"191":1,"192":311,"193":1,"194":312,"195":1,"196":313,"197":1,"198":5,"199":1,"200":1,"201":314,"202":1,"203":315},{"205":355,"206":356,"207":1,"208":1},{"211":360,"212":361,"213":2},{"215":1,"216":121,"217":172,"218":369},{"220":370},{"222":374,"223":375},{"225":377,"226":378,"227":1,"228":379},{"230":380,"231":172,"232":121,"233":381,"234":5,"235":106,"236":4,"237":382,"238":383,"239":116,"240":106,"241":116,"242":4,"243":384,"244":385,"245":116,"246":116,"247":386,"248":387,"249":388,"250":389},{"252":374,"253":401},{"255":403,"256":4,"257":112},{"259":404,"260":405,"261":106,"262":106,"263":406,"264":405,"265":106,"266":407,"267":386,"268":386,"269":408,"270":409},{"272":172,"273":1,"274":422,"275":423,"276":424},{"222":427,"278":1,"279":425,"280":426,"281":428},{"97":431,"283":106},{"285":433,"286":434,"287":435,"288":436,"289":303},{"291":440,"292":441},{"251":442,"294":106,"295":1},{"297":451},{"299":1,"300":61,"301":455,"302":456},{"304":466,"305":121,"306":1,"307":1},{"310":481,"311":482,"312":483},{"314":55,"315":492,"316":388,"317":1,"318":493,"319":494,"320":495,"321":496,"322":497,"323":498,"324":499,"325":2,"326":2,"327":500},{"329":528,"330":529,"331":530},{"333":538},{"29":544,"35":544,"124":168,"335":55,"336":428},{"338":6,"339":55,"340":547},{"342":548,"343":548},{"156":99,"1093":697,"1094":698},{"1120":97},{"346":17,"347":18,"348":19,"349":19,"350":20,"351":21,"352":22,"353":17,"354":23,"355":23,"356":19},{"367":51,"368":52,"369":52,"370":52,"371":53},{"372":64,"373":64,"374":65},{"375":66},{"376":68,"377":69,"378":68,"379":70,"380":68},{"379":79,"381":78,"382":78,"383":80,"384":81,"385":82,"386":83,"387":84,"388":85},{"389":122,"390":123,"391":124,"392":125,"393":126,"394":127,"395":128,"396":129,"397":128,"398":130,"399":131,"400":132,"401":128,"402":128,"403":133,"404":134,"405":128,"406":135,"407":136,"408":124,"409":134,"410":137,"411":138,"412":139,"413":140,"414":130,"415":141,"416":142,"417":143,"418":144},{"419":165,"420":128},{"372":169,"373":169,"421":170},{"422":176,"423":177,"424":178,"425":68,"426":68,"427":68},{"428":190,"429":191,"430":192,"431":193,"432":194,"433":195},{"358":68,"434":201,"435":68,"436":68,"437":68,"438":68,"439":202,"440":68,"441":203},{"446":216},{"376":223,"447":224,"448":225,"449":226,"450":227},{"451":128,"452":231,"453":232,"454":233,"455":234,"456":235},{"477":267,"478":268,"479":269,"480":268,"481":268,"482":270,"483":268,"484":268,"485":271},{"479":279,"480":280,"481":280,"486":278,"487":281,"488":280,"489":280},{"434":295,"490":292,"491":293,"492":294,"493":296},{"494":304,"495":305,"496":306},{"390":317,"391":318,"392":320,"394":323,"395":328,"441":325,"497":316,"498":128,"499":319,"500":321,"501":322,"502":324,"503":326,"504":327,"505":329,"506":330,"507":331,"508":332,"509":333,"510":334,"511":328,"512":328,"513":335,"514":336,"515":336,"516":328},{"517":128,"518":128,"519":357},{"520":130,"521":130,"522":130,"523":130,"524":130,"525":130,"526":130,"527":130,"528":130,"529":130,"530":130,"531":362,"532":362,"533":130,"534":130,"535":130,"536":130,"537":130,"538":130,"539":130,"540":130,"541":130,"542":130,"543":130,"544":130,"545":130,"546":363,"547":363,"548":130,"549":130,"550":130,"551":130,"552":130,"553":130,"554":130,"555":130,"556":364,"557":365,"558":366,"559":363,"560":130,"561":130,"562":130,"563":130,"564":130,"565":367,"566":130,"567":368},{"568":376},{"569":390,"570":391,"571":392,"572":391,"573":393,"574":394,"575":395,"576":396,"577":397},{"578":402},{"579":410,"580":411,"581":412,"582":413,"583":414,"584":414,"585":415,"586":416,"587":417,"588":417,"589":418},{"590":128},{"591":432},{"592":437,"593":437},{"518":445,"594":443,"595":444,"596":446,"597":393,"598":128,"599":393,"600":390,"601":391},{"602":452,"603":393,"604":393},{"605":457,"606":458,"607":128},{"500":467,"608":468,"609":469,"610":68,"611":68,"612":467,"613":470,"614":68,"615":471},{"616":476,"617":477,"618":478},{"619":484,"620":485,"621":486,"622":487,"623":488,"624":489},{"625":501,"626":502,"627":502,"628":503,"629":504,"630":505,"631":506,"632":506,"633":507,"634":507,"635":508,"636":507,"637":509,"638":510},{"639":532,"640":533},{"500":539,"641":539,"642":540},{"372":545,"373":545,"643":546},{"358":68,"434":640,"435":68,"436":68,"437":68,"438":68,"439":202,"440":68,"441":203},{"661":54,"662":54,"663":54},{"664":71,"665":72,"666":71},{"281":90,"667":86,"668":87,"669":88,"670":89,"671":90,"672":90,"673":91,"674":90,"675":90,"676":90,"677":90,"678":90,"679":90,"680":90,"681":92,"682":93,"683":93,"684":90,"685":90,"686":90,"687":94},{"688":96},{"66":150,"93":156,"676":147,"689":145,"690":146,"691":148,"692":149,"693":26,"694":150,"695":150,"696":151,"697":26,"698":152,"699":153,"700":154,"701":155,"702":155,"703":157},{"704":160},{"705":149},{"706":171,"707":26,"708":26},{"674":183,"709":179,"710":180,"711":181,"712":182,"713":184,"714":185,"715":186,"716":72,"717":187,"718":187,"719":72},{"720":196,"721":197},{"722":204,"723":205,"724":205,"725":90,"726":206,"727":72,"728":72,"729":207,"730":72,"731":207,"732":207,"733":207,"734":207,"735":205,"736":208,"737":208},{"741":217},{"742":228},{"743":236,"744":27},{"760":72,"761":272,"762":72,"763":273,"764":274,"765":72,"766":72,"767":72,"768":275,"769":276,"770":275},{"653":282,"710":283,"742":284,"771":282},{"676":299,"690":299,"772":297,"773":298,"774":26,"775":300},{"776":307,"777":308},{"66":338,"694":340,"695":341,"778":337,"779":339,"780":342,"781":343,"782":344,"783":345,"784":346,"785":347,"786":348,"787":349,"788":350,"789":351,"790":352,"791":353,"792":353},{"797":371,"798":371,"799":372,"800":373},{"801":398,"802":398,"803":398,"804":398,"805":399,"806":400,"807":400,"808":400},{"809":419,"810":420,"811":421,"812":420,"813":419,"814":419,"815":421},{"816":429,"817":430,"818":398},{"819":438,"820":439},{"671":449,"821":447,"822":448,"823":450},{"824":453,"825":454},{"671":461,"672":462,"826":459,"827":460,"828":463,"829":464,"830":465},{"840":479,"841":480},{"676":90,"842":490,"843":26,"844":491},{"845":511,"846":512,"847":513,"848":514,"849":515,"850":516,"851":515,"852":515,"853":517,"854":513,"855":518,"856":519,"857":520,"858":521,"859":522,"860":523,"861":513,"862":524,"863":525,"864":525,"865":525,"866":526,"867":519,"868":527},{"869":534,"870":535,"871":536,"872":537},{"873":541,"874":542,"875":543},{"877":13,"878":14,"879":1,"880":15,"881":16,"882":1},{"883":34,"884":1},{"885":55,"886":55,"887":1,"888":1},{"889":55},{"674":55},{"890":55,"891":1,"892":1,"893":1},{"894":1},{"895":1,"896":1,"897":1,"898":1,"899":1,"900":1},{"887":1,"888":1,"901":55},{"902":1,"903":1,"904":175,"905":1,"906":1},{"907":1,"908":1},{"909":55,"910":1,"911":1,"912":1,"913":200},{"914":222},{"915":55,"916":1},{"917":1},{"918":55,"919":55,"920":1,"921":1,"922":55,"923":55},{"924":55,"925":55,"926":1},{"927":55,"928":1,"929":1,"930":1,"931":266,"932":266,"933":55,"934":55,"935":1},{"936":1,"937":55},{"938":1,"939":1,"940":55,"941":1,"942":34,"943":1,"944":55,"945":55,"946":55,"947":1,"948":1,"949":34,"950":1,"951":1},{"952":303},{"904":175,"953":1,"954":1},{"955":55},{"904":175,"956":55,"957":1},{"934":55,"958":55},{"959":1,"960":1},{"961":1,"962":1,"963":1,"964":1},{"904":175,"965":55,"966":1},{"967":1,"968":475},{"969":1},{"970":1,"971":1,"972":531,"973":531},{"1115":55,"1116":55,"1117":1,"1118":55},{"981":553,"982":554,"983":555},{"975":549},{"977":550,"978":551,"979":552},{"989":560,"990":561,"991":562,"992":563,"993":564,"994":565,"995":566},{"989":569,"997":567,"998":568},{"1000":570},{"1002":571},{"1004":572,"1005":573,"1006":574,"1007":575,"1008":576,"1009":577,"1010":578,"1011":579,"1012":580,"1013":581,"1014":582,"1015":583,"1016":584,"1017":585,"1018":586,"1019":587,"1020":572,"1021":588,"1022":589,"1023":590,"1024":591,"1025":592,"1026":593,"1027":578,"1028":594,"1029":595,"1030":555,"1031":596,"1032":578,"1033":597,"1034":598},{"1036":599,"1037":600,"1038":601,"1039":602},{"1041":603,"1042":604,"1043":605,"1044":606,"1045":607},{"1047":608,"1048":608},{"1038":610,"1039":611,"1050":609,"1051":612},{"1038":616,"1039":615,"1053":613,"1054":612,"1055":614,"1056":614},{"1058":572},{"1060":617,"1061":618},{"1063":619},{"1065":620,"1066":621,"1067":622,"1068":623},{"1073":626,"1074":627,"1075":628,"1076":629},{"1081":632},{"1083":633,"1084":634,"1085":635}],["Account","ExtrinsicCount","InherentsApplied","BlockWeight","AllExtrinsicsLen","BlockHash","ExtrinsicData","Number","ParentHash","Digest","Events","EventCount","EventTopics","LastRuntimeUpgrade","UpgradedToU32RefCount","UpgradedToTripleRefCount","ExecutionPhase","AuthorizedUpgrade","System","IncompleteSince","Agenda","Retries","Lookup","Scheduler","StatusFor","RequestStatusFor","PreimageFor","Preimage","EpochIndex","Authorities","GenesisSlot","CurrentSlot","Randomness","PendingEpochConfigChange","NextRandomness","NextAuthorities","SegmentIndex","UnderConstruction","Initialized","AuthorVrfRandomness","EpochStart","Lateness","EpochConfig","NextEpochConfig","SkippedEpochs","Babe","Now","DidUpdate","Timestamp","Accounts","Indices","TotalIssuance","InactiveIssuance","Locks","Reserves","Holds","Freezes","Balances","NextFeeMultiplier","StorageVersion","TransactionPayment","Author","Authorship","ValidatorCount","MinimumValidatorCount","Invulnerables","Bonded","MinNominatorBond","MinValidatorBond","MinimumActiveStake","MinCommission","Ledger","Payee","Validators","CounterForValidators","MaxValidatorsCount","Nominators","CounterForNominators","VirtualStakers","CounterForVirtualStakers","MaxNominatorsCount","CurrentEra","ActiveEra","ErasStartSessionIndex","ErasStakers","ErasStakersOverview","ErasStakersClipped","ErasStakersPaged","ClaimedRewards","ErasValidatorPrefs","ErasValidatorReward","ErasRewardPoints","ErasTotalStake","ForceEra","MaxStakedRewards","SlashRewardFraction","CanceledSlashPayout","UnappliedSlashes","BondedEras","ValidatorSlashInEra","NominatorSlashInEra","SlashingSpans","SpanSlash","CurrentPlannedSession","DisabledValidators","ChillThreshold","Staking","Reports","ConcurrentReportsIndex","Offences","HistoricalSessions","StoredRange","Historical","CurrentIndex","QueuedChanged","QueuedKeys","NextKeys","KeyOwner","Session","State","PendingChange","NextForced","Stalled","CurrentSetId","SetIdSession","Grandpa","Keys","AuthorityDiscovery","ProposalCount","Proposals","Deactivated","Approvals","SpendCount","Spends","Treasury","VotingFor","ClassLocksFor","ConvictionVoting","ReferendumCount","ReferendumInfoFor","TrackQueue","DecidingCount","MetadataOf","Referenda","Origins","WhitelistedCall","Whitelist","Parameters","Claims","Total","Vesting","Signing","Preclaims","Utility","Proxies","Announcements","Proxy","Multisigs","Multisig","BountyCount","Bounties","BountyDescriptions","BountyApprovals","ChildBountyCount","ParentChildBounties","ChildBounties","ChildBountyDescriptions","ChildrenCuratorFees","Round","CurrentPhase","QueuedSolution","Snapshot","DesiredTargets","SnapshotMetadata","SignedSubmissionNextIndex","SignedSubmissionIndices","SignedSubmissionsMap","MinimumUntrustedScore","ElectionProviderMultiPhase","ListNodes","CounterForListNodes","ListBags","VoterList","TotalValueLocked","MinJoinBond","MinCreateBond","MaxPools","MaxPoolMembers","MaxPoolMembersPerPool","GlobalMaxCommission","PoolMembers","CounterForPoolMembers","BondedPools","CounterForBondedPools","RewardPools","CounterForRewardPools","SubPoolsStorage","CounterForSubPoolsStorage","Metadata","CounterForMetadata","LastPoolId","ReversePoolIdLookup","CounterForReversePoolIdLookup","ClaimPermissions","NominationPools","Head","Queue","CounterForQueue","ErasToCheckPerBlock","FastUnstake","ParachainsOrigin","ActiveConfig","PendingConfigs","BypassConsistencyCheck","Configuration","CurrentSessionIndex","ActiveValidatorIndices","ActiveValidatorKeys","AllowedRelayParents","ParasShared","V1","ParaInclusion","Included","OnChainVotes","ParaInherent","ValidatorGroups","AvailabilityCores","SessionStartBlock","ClaimQueue","ParaScheduler","PvfActiveVoteMap","PvfActiveVoteList","Parachains","ParaLifecycles","Heads","MostRecentContext","CurrentCodeHash","PastCodeHash","PastCodeMeta","PastCodePruning","FutureCodeUpgrades","FutureCodeUpgradesAt","FutureCodeHash","UpgradeGoAheadSignal","UpgradeRestrictionSignal","UpgradeCooldowns","UpcomingUpgrades","ActionsQueue","UpcomingParasGenesis","CodeByHashRefs","CodeByHash","Paras","HasInitialized","BufferedSessionChanges","Initializer","DownwardMessageQueues","DownwardMessageQueueHeads","DeliveryFeeFactor","Dmp","HrmpOpenChannelRequests","HrmpOpenChannelRequestsList","HrmpOpenChannelRequestCount","HrmpAcceptedChannelRequestCount","HrmpCloseChannelRequests","HrmpCloseChannelRequestsList","HrmpWatermarks","HrmpChannels","HrmpIngressChannelsIndex","HrmpEgressChannelsIndex","HrmpChannelContents","HrmpChannelDigests","Hrmp","AssignmentKeysUnsafe","EarliestStoredSession","Sessions","AccountKeys","SessionExecutorParams","ParaSessionInfo","LastPrunedSession","Disputes","BackersOnDisputes","Frozen","ParasDisputes","ValidatorSetCounts","ParasSlashing","ParaIdAffinity","QueueStatus","FreeEntries","AffinityEntries","Revenue","OnDemand","CoreSchedules","CoreDescriptors","CoretimeAssignmentProvider","PendingSwap","NextFreeParaId","Registrar","Leases","Slots","AuctionCounter","AuctionInfo","ReservedAmounts","Winning","Auctions","Funds","NewRaise","EndingsCount","NextFundIndex","Crowdloan","Coretime","MigrationProcess","AutoLimits","SignedMigrationMaxLimits","StateTrieMigration","QueryCounter","Queries","AssetTraps","SafeXcmVersion","SupportedVersion","VersionNotifiers","VersionNotifyTargets","VersionDiscoveryQueue","CurrentMigration","RemoteLockedFungibles","LockedFungibles","XcmExecutionSuspended","ShouldRecordXcm","RecordedXcm","XcmPallet","BookStateFor","ServiceHead","Pages","MessageQueue","ConversionRateToNative","AssetRate","ValidatorSetId","GenesisBlock","Beefy","RootHash","NumberOfLeaves","Nodes","Mmr","BeefyAuthorities","BeefyNextAuthorities","BeefyMmrLeaf","storage","remark","set_heap_pages","set_code","set_code_without_checks","set_storage","kill_storage","kill_prefix","remark_with_event","authorize_upgrade","authorize_upgrade_without_checks","apply_authorized_upgrade","schedule","cancel","schedule_named","cancel_named","schedule_after","schedule_named_after","set_retry","set_retry_named","cancel_retry","cancel_retry_named","note_preimage","unnote_preimage","request_preimage","unrequest_preimage","ensure_updated","report_equivocation","report_equivocation_unsigned","plan_config_change","set","claim","transfer","free","force_transfer","freeze","transfer_allow_death","transfer_keep_alive","transfer_all","force_unreserve","upgrade_accounts","force_set_balance","force_adjust_total_issuance","burn","bond","bond_extra","unbond","withdraw_unbonded","validate","nominate","chill","set_payee","set_controller","set_validator_count","increase_validator_count","scale_validator_count","force_no_eras","force_new_era","set_invulnerables","force_unstake","force_new_era_always","cancel_deferred_slash","payout_stakers","rebond","reap_stash","kick","set_staking_configs","chill_other","force_apply_min_commission","set_min_commission","payout_stakers_by_page","update_payee","deprecate_controller_batch","restore_ledger","set_keys","purge_keys","note_stalled","spend_local","remove_approval","spend","payout","check_status","void_spend","vote","delegate","undelegate","unlock","remove_vote","remove_other_vote","submit","place_decision_deposit","refund_decision_deposit","kill","nudge_referendum","one_fewer_deciding","refund_submission_deposit","set_metadata","whitelist_call","remove_whitelisted_call","dispatch_whitelisted_call","dispatch_whitelisted_call_with_preimage","set_parameter","mint_claim","claim_attest","attest","move_claim","vest","vest_other","vested_transfer","force_vested_transfer","merge_schedules","force_remove_vesting_schedule","batch","as_derivative","batch_all","dispatch_as","force_batch","with_weight","proxy","add_proxy","remove_proxy","remove_proxies","create_pure","kill_pure","announce","remove_announcement","reject_announcement","proxy_announced","as_multi_threshold_1","as_multi","approve_as_multi","cancel_as_multi","propose_bounty","approve_bounty","propose_curator","unassign_curator","accept_curator","award_bounty","claim_bounty","close_bounty","extend_bounty_expiry","add_child_bounty","award_child_bounty","claim_child_bounty","close_child_bounty","submit_unsigned","set_minimum_untrusted_score","set_emergency_election_result","governance_fallback","rebag","put_in_front_of","put_in_front_of_other","join","claim_payout","pool_withdraw_unbonded","create","create_with_pool_id","set_state","set_configs","update_roles","bond_extra_other","set_claim_permission","claim_payout_other","set_commission","set_commission_max","set_commission_change_rate","claim_commission","adjust_pool_deposit","set_commission_claim_permission","apply_slash","migrate_delegation","migrate_pool_to_delegate_stake","register_fast_unstake","deregister","control","set_validation_upgrade_cooldown","set_validation_upgrade_delay","set_code_retention_period","set_max_code_size","set_max_pov_size","set_max_head_data_size","set_coretime_cores","set_max_availability_timeouts","set_group_rotation_frequency","set_paras_availability_period","set_scheduling_lookahead","set_max_validators_per_core","set_max_validators","set_dispute_period","set_dispute_post_conclusion_acceptance_period","set_no_show_slots","set_n_delay_tranches","set_zeroth_delay_tranche_width","set_needed_approvals","set_relay_vrf_modulo_samples","set_max_upward_queue_count","set_max_upward_queue_size","set_max_downward_message_size","set_max_upward_message_size","set_max_upward_message_num_per_candidate","set_hrmp_open_request_ttl","set_hrmp_sender_deposit","set_hrmp_recipient_deposit","set_hrmp_channel_max_capacity","set_hrmp_channel_max_total_size","set_hrmp_max_parachain_inbound_channels","set_hrmp_channel_max_message_size","set_hrmp_max_parachain_outbound_channels","set_hrmp_max_message_num_per_candidate","set_pvf_voting_ttl","set_minimum_validation_upgrade_delay","set_bypass_consistency_check","set_async_backing_params","set_executor_params","set_on_demand_base_fee","set_on_demand_fee_variability","set_on_demand_queue_max_size","set_on_demand_target_queue_utilization","set_on_demand_ttl","set_minimum_backing_votes","set_node_feature","set_approval_voting_params","set_scheduler_params","enter","force_set_current_code","force_set_current_head","force_schedule_code_upgrade","force_note_new_head","force_queue_action","add_trusted_validation_code","poke_unused_validation_code","include_pvf_check_statement","force_set_most_recent_context","force_approve","hrmp_init_open_channel","hrmp_accept_open_channel","hrmp_close_channel","force_clean_hrmp","force_process_hrmp_open","force_process_hrmp_close","hrmp_cancel_open_request","force_open_hrmp_channel","establish_system_channel","poke_channel_deposits","establish_channel_with_system","force_unfreeze","report_dispute_lost_unsigned","place_order_allow_death","place_order_keep_alive","register","force_register","swap","remove_lock","reserve","add_lock","schedule_code_upgrade","set_current_head","force_lease","clear_all_leases","trigger_onboard","new_auction","bid","cancel_auction","contribute","withdraw","refund","dissolve","edit","add_memo","poke","contribute_all","request_core_count","request_revenue_at","assign_core","control_auto_migration","continue_migrate","migrate_custom_top","migrate_custom_child","set_signed_max_limits","force_set_progress","send","teleport_assets","reserve_transfer_assets","execute","force_xcm_version","force_default_xcm_version","force_subscribe_version_notify","force_unsubscribe_version_notify","limited_reserve_transfer_assets","limited_teleport_assets","force_suspension","transfer_assets","claim_assets","transfer_assets_using_type_and_then","reap_page","execute_overweight","update","remove","set_new_genesis","tx","ExtrinsicSuccess","ExtrinsicFailed","CodeUpdated","NewAccount","KilledAccount","Remarked","UpgradeAuthorized","Scheduled","Canceled","Dispatched","RetrySet","RetryCancelled","CallUnavailable","PeriodicFailed","RetryFailed","PermanentlyOverweight","Noted","Requested","Cleared","IndexAssigned","IndexFreed","IndexFrozen","Endowed","DustLost","Transfer","BalanceSet","Reserved","Unreserved","ReserveRepatriated","Deposit","Withdraw","Slashed","Minted","Burned","Suspended","Restored","Upgraded","Issued","Rescinded","Locked","Unlocked","Thawed","TotalIssuanceForced","TransactionFeePaid","EraPaid","Rewarded","SlashReported","OldSlashingReportDiscarded","StakersElected","Unbonded","Withdrawn","Kicked","StakingElectionFailed","Chilled","PayoutStarted","ValidatorPrefsSet","SnapshotVotersSizeExceeded","SnapshotTargetsSizeExceeded","ControllerBatchDeprecated","Offence","NewSession","NewAuthorities","Paused","Resumed","Spending","Awarded","Burnt","Rollover","SpendApproved","UpdatedInactive","AssetSpendApproved","AssetSpendVoided","Paid","PaymentFailed","SpendProcessed","Delegated","Undelegated","Submitted","DecisionDepositPlaced","DecisionDepositRefunded","DepositSlashed","DecisionStarted","ConfirmStarted","ConfirmAborted","Confirmed","Approved","Rejected","TimedOut","Cancelled","Killed","SubmissionDepositRefunded","MetadataSet","MetadataCleared","CallWhitelisted","WhitelistedCallRemoved","WhitelistedCallDispatched","Updated","Claimed","VestingUpdated","VestingCompleted","BatchInterrupted","BatchCompleted","BatchCompletedWithErrors","ItemCompleted","ItemFailed","DispatchedAs","ProxyExecuted","PureCreated","Announced","ProxyAdded","ProxyRemoved","NewMultisig","MultisigApproval","MultisigExecuted","MultisigCancelled","BountyProposed","BountyRejected","BountyBecameActive","BountyAwarded","BountyClaimed","BountyCanceled","BountyExtended","BountyApproved","CuratorProposed","CuratorUnassigned","CuratorAccepted","Added","SolutionStored","ElectionFinalized","ElectionFailed","PhaseTransitioned","Rebagged","ScoreUpdated","Created","PaidOut","Destroyed","StateChanged","MemberRemoved","RolesUpdated","PoolSlashed","UnbondingPoolSlashed","PoolCommissionUpdated","PoolMaxCommissionUpdated","PoolCommissionChangeRateUpdated","PoolCommissionClaimPermissionUpdated","PoolCommissionClaimed","MinBalanceDeficitAdjusted","MinBalanceExcessAdjusted","Unstaked","BatchChecked","BatchFinished","InternalError","CandidateBacked","CandidateIncluded","CandidateTimedOut","UpwardMessagesReceived","CurrentCodeUpdated","CurrentHeadUpdated","CodeUpgradeScheduled","NewHeadNoted","ActionQueued","PvfCheckStarted","PvfCheckAccepted","PvfCheckRejected","OpenChannelRequested","OpenChannelCanceled","OpenChannelAccepted","ChannelClosed","HrmpChannelForceOpened","HrmpSystemChannelOpened","OpenChannelDepositsUpdated","DisputeInitiated","DisputeConcluded","Revert","OnDemandOrderPlaced","SpotPriceSet","Registered","Deregistered","Swapped","NewLeasePeriod","Leased","AuctionStarted","AuctionClosed","ReserveConfiscated","BidAccepted","WinningOffset","Contributed","Withdrew","PartiallyRefunded","AllRefunded","Dissolved","HandleBidResult","Edited","MemoUpdated","AddedToNewRaise","RevenueInfoRequested","CoreAssigned","Migrated","AutoMigrationFinished","Halted","Attempted","Sent","UnexpectedResponse","ResponseReady","Notified","NotifyOverweight","NotifyDispatchError","NotifyDecodeFailed","InvalidResponder","InvalidResponderVersion","ResponseTaken","AssetsTrapped","VersionChangeNotified","SupportedVersionChanged","NotifyTargetSendFail","NotifyTargetMigrationFail","InvalidQuerierVersion","InvalidQuerier","VersionNotifyStarted","VersionNotifyRequested","VersionNotifyUnrequested","FeesPaid","AssetsClaimed","VersionMigrationFinished","ProcessingFailed","Processed","OverweightEnqueued","PageReaped","AssetRateCreated","AssetRateRemoved","AssetRateUpdated","events","BlockWeights","BlockLength","BlockHashCount","DbWeight","Version","SS58Prefix","MaximumWeight","MaxScheduledPerBlock","EpochDuration","ExpectedBlockTime","MaxAuthorities","MaxNominators","MinimumPeriod","ExistentialDeposit","MaxLocks","MaxReserves","MaxFreezes","OperationalFeeMultiplier","HistoryDepth","SessionsPerEra","BondingDuration","SlashDeferDuration","MaxExposurePageSize","MaxUnlockingChunks","MaxSetIdSessionEntries","SpendPeriod","Burn","PalletId","MaxApprovals","PayoutPeriod","MaxVotes","VoteLockingPeriod","SubmissionDeposit","MaxQueued","UndecidingTimeout","AlarmInterval","Tracks","Prefix","MinVestedTransfer","MaxVestingSchedules","batched_calls_limit","ProxyDepositBase","ProxyDepositFactor","MaxProxies","MaxPending","AnnouncementDepositBase","AnnouncementDepositFactor","DepositBase","DepositFactor","MaxSignatories","BountyDepositBase","BountyDepositPayoutDelay","BountyUpdatePeriod","CuratorDepositMultiplier","CuratorDepositMax","CuratorDepositMin","BountyValueMinimum","DataDepositPerByte","MaximumReasonLength","MaxActiveChildBountyCount","ChildBountyValueMinimum","BetterSignedThreshold","OffchainRepeat","MinerTxPriority","SignedMaxSubmissions","SignedMaxWeight","SignedMaxRefunds","SignedRewardBase","SignedDepositByte","SignedDepositWeight","MaxWinners","MinerMaxLength","MinerMaxWeight","MinerMaxVotesPerVoter","MinerMaxWinners","BagThresholds","MaxPointsToBalance","MaxUnbonding","UnsignedPriority","TrafficDefaultValue","MaxHistoricalRevenue","ParaDeposit","LeasePeriod","LeaseOffset","EndingPeriod","SampleLength","SlotRangeCount","LeasePeriodsPerSlot","MinContribution","RemoveKeysLimit","BrokerId","BrokerPotLocation","MaxKeyLen","HeapSize","MaxStale","ServiceWeight","IdleMaxServiceWeight","constants","experimental_inflation_prediction_info","Inflation","version","execute_block","initialize_block","Core","metadata","metadata_at_version","metadata_versions","apply_extrinsic","finalize_block","inherent_extrinsics","check_inherents","BlockBuilder","pending_rewards","points_to_balance","balance_to_points","pool_pending_slash","member_pending_slash","pool_needs_delegate_migration","member_needs_delegate_migration","NominationPoolsApi","nominations_quota","eras_stakers_page_count","StakingApi","validate_transaction","TaggedTransactionQueue","offchain_worker","OffchainWorkerApi","validators","validator_groups","availability_cores","persisted_validation_data","assumed_validation_data","check_validation_outputs","session_index_for_child","validation_code","candidate_pending_availability","candidate_events","dmq_contents","inbound_hrmp_channels_contents","validation_code_by_hash","on_chain_votes","session_info","submit_pvf_check_statement","pvfs_require_precheck","validation_code_hash","disputes","session_executor_params","unapplied_slashes","key_ownership_proof","submit_report_dispute_lost","minimum_backing_votes","para_backing_state","async_backing_params","disabled_validators","node_features","approval_voting_params","claim_queue","candidates_pending_availability","ParachainHost","beefy_genesis","validator_set","submit_report_equivocation_unsigned_extrinsic","generate_key_ownership_proof","BeefyApi","mmr_root","mmr_leaf_count","generate_proof","verify_proof","verify_proof_stateless","MmrApi","authority_set_proof","next_authority_set_proof","BeefyMmrApi","grandpa_authorities","current_set_id","GrandpaApi","configuration","current_epoch_start","current_epoch","next_epoch","BabeApi","authorities","AuthorityDiscoveryApi","generate_session_keys","decode_session_keys","SessionKeys","account_nonce","AccountNonceApi","query_info","query_fee_details","query_weight_to_fee","query_length_to_fee","TransactionPaymentApi","query_call_info","query_call_fee_details","TransactionPaymentCallApi","query_acceptable_payment_assets","query_xcm_weight","query_weight_to_asset_fee","query_delivery_fees","XcmPaymentApi","dry_run_call","dry_run_xcm","DryRunApi","convert_location","LocationToAccountApi","build_state","get_preset","preset_names","GenesisBuilder","apis","MemberCount","Members","FellowshipCollective","FellowshipReferenda","Society","Recoverable","ActiveRecoveries","Recovery","Nis","NisCounterpartBalances","OnDemandAssignmentProvider","as_recovered","set_recovered","create_recovery","initiate_recovery","vouch_recovery","claim_recovery","close_recovery","remove_recovery","cancel_recovered","Voted","RecoveryCreated","RecoveryInitiated","RecoveryVouched","RecoveryClosed","AccountRecovered","RecoveryRemoved","ConfigDepositBase","FriendDepositFactor","MaxFriends","RecoveryDeposit","ParaSudoWrapper","Key","Sudo","sudo_schedule_para_initialize","sudo_schedule_para_cleanup","sudo_schedule_parathread_upgrade","sudo_schedule_parachain_downgrade","sudo_queue_downward_xcm","sudo_establish_hrmp_channel","sudo","sudo_unchecked_weight","set_key","sudo_as","remove_key","Sudid","KeyChanged","KeyRemoved","SudoAsDone","Identity","DelegatedStaking","ParasSudoWrapper","AssignedSlots","StakingAhClient","MultiBlockMigrations","RootTesting","MetaTx","VerifySignature","IdentityMigrator","poke_deposit","DepositPoked"]]`); +var replaceTokens = (obj) => Object.fromEntries( + Object.entries(obj).map(([key, value]) => { + const unwrappedValue = typeof value === "object" ? replaceTokens(value) : value; + const numericKey = Number(key); + if (Number.isNaN(numericKey)) { + return [key, unwrappedValue]; + } + return [tokens[numericKey], unwrappedValue]; + }) +); +var tokenizedCommonTrees = commonTrees.map(replaceTokens); +var unwrap = (obj, depth) => depth === 0 ? obj : Object.fromEntries( + Object.entries(obj).map(([key, value]) => [ + key, + unwrap( + typeof value === "object" ? value : tokenizedCommonTrees[value], + depth - 1 + ) + ]) +); +var getChainDescriptors = (key) => unwrap(replaceTokens(minified[key]), 2); +var Dot = getChainDescriptors("dot"); +var Ksm = getChainDescriptors("ksm"); +var Paseo = getChainDescriptors("paseo"); +var Wnd = getChainDescriptors("wnd"); +export { + Dot, + Ksm, + Paseo, + Wnd +}; diff --git a/examples/with-vite-papi/.papi/descriptors/dist/descriptors.d.ts b/examples/with-vite-papi/.papi/descriptors/dist/descriptors.d.ts new file mode 100644 index 0000000..c53ad6b --- /dev/null +++ b/examples/with-vite-papi/.papi/descriptors/dist/descriptors.d.ts @@ -0,0 +1,4 @@ +export declare const Dot: Record; +export declare const Ksm: Record; +export declare const Paseo: Record; +export declare const Wnd: Record; diff --git a/examples/with-vite-papi/.papi/descriptors/dist/dot.d.ts b/examples/with-vite-papi/.papi/descriptors/dist/dot.d.ts new file mode 100644 index 0000000..3e459e5 --- /dev/null +++ b/examples/with-vite-papi/.papi/descriptors/dist/dot.d.ts @@ -0,0 +1,10048 @@ +import { StorageDescriptor, PlainDescriptor, TxDescriptor, RuntimeDescriptor, Enum, QueryFromPalletsDef, TxFromPalletsDef, EventsFromPalletsDef, ErrorsFromPalletsDef, ConstFromPalletsDef, SS58String, FixedSizeBinary, Binary, FixedSizeArray } from "polkadot-api"; +import { I5sesotjlssv2d, Iffmde3ekjedi9, I4mddgoa69c0a2, Icv0uola4fi0sv, I95g6i7ilua7lq, Ieniouoqkq4icf, Phase, Ibgl04rn6nbfm6, I9tv51sgspensk, I56u24ncejr5kt, I9jd27rnpm8ttv, PreimageOldRequestStatus, PreimageRequestStatus, I4pact7n2e9a0i, I3geksg000c171, BabeDigestsNextConfigDescriptor, Ic5m5lp1oioo8r, Idq7or56ds2f13, I4s6vifaf8k998, I8jnd4d8ip6djo, Ifip05kcrl65am, Iff9heri56m1mb, I1q8tnt1cluu5j, I8ds64oj6581v0, Ia7pdug7cdsg8g, I3oiqtmlj7klbr, I2l1ctuihi2mfd, TransactionPaymentReleases, Ia2lhg7l2hilo3, Ic12aht5vh2sen, StakingRewardDestination, I9o7ssi9vmhmgr, Ic3m9d6tdl6gi2, Ib3j7gb0jgs38u, Ifekshcrgkl12g, I7svnfko10tq2e, I6flrronqs3l6n, I97fulj5h3ik95, Ia8896dq44k9m4, Icgljjb6j82uhn, Iff9p3c7k6pfoi, StakingForcing, Iafq6t4rgheait, I4ojmnsk1dchql, Iinkhfdlka9ch, I2kj4j6mp68hf8, I6ouflveob4eli, I2bqvqrg0sbrdj, I23nq3fsgtejt, Idt624nf41g34e, I9kr8cseidc66h, I82jm9g7pufuel, GrandpaStoredState, I7pe2me3i3vtn9, Iegmj7n48sc3am, I5v9a2mdqq4t8u, ConvictionVotingVoteVoting, If9jidduiuq7vv, Idu11e295qqjep, I22o1tjs56dvi2, I9h43amtitrqum, I2phecamkn3pej, ClaimsStatementKind, Ifble4juuml5ig, Version, I6piac7omi5lpd, I9p9lq3rej5bhc, Iag146hmjgqfgj, I8uo3fpd3bcc6f, I8phqps8r3of7e, Ibofbvvaehln4e, ElectionProviderMultiPhasePhase, Ictkaqdbfabuek, Ia7o65280hur3p, Iasd2iat48n080, Ic8d01sg6acf60, Irl37q7erstrb, I8s6n43okuj2b1, Ic5t26f9cp3tvk, I39k39h6vu4hbq, Idphjddn2h69vc, Idhh9vuu2bderg, If6qa32dj75gu1, I7oo2mprv1qd1s, NominationPoolsClaimPermission, I2eh80qovrl7h2, Idinvj2ldfa0k7, I78k2970vpbt1t, I27il479s8gsv0, Id375uoldedict, Ilg2fqs6cjgs3, Iarlj3qd8u1v13, I2ng2krd94ceva, Ie18mk3nmrn3nr, I4vk12npmr8ll0, ParachainsParasParaLifecycle, I79cs1p3m59mo7, UpgradeGoAhead, UpgradeRestriction, I2duhnt686rv0q, I7ulu3h1ibu60i, I6ljjd4b5fa4ov, Ibhmrlkcu01imb, I50mrcbubp554e, Id43g4eveajpkl, I7iua3ehrgl4va, Iev3u09i2vqn93, I9olhgo2o08h7b, I9m4rd2a7lc9md, I80rnntpog8qp6, I87u7jalc0lhah, I4p5t2krb1gmvp, I4arjljr6dpflb, I5kqchhvguhfvt, I4akf1ifqeclef, Ido5stnsbghtpd, I3ndpvu09rj685, Iafqnechp3omqg, I9dasmua8326io, I3g90iebhds6kb, I3av628q6dt6mq, Ifmaahl40gom3g, I70iuri2ilha1f, I6gun5k9fbb4s0, If354jrdedj0pj, Ib17t3992hb64n, I215mkl885p4da, XcmPalletQueryStatus, Ic4qvh5df9s5gp, I7vlvrrl2pnbgk, I50sjs3s5lud21, XcmPalletVersionMigrationStage, I50qp0ij7h62g2, Iteuj23is2ed5, I3rp19gb4dadaa, Iegrepoo0c1jc5, I260m120dp9sbk, ParachainsInclusionAggregateMessageOrigin, I53esa2ms463bk, I1lfimt2mpej64, VersionedLocatableAsset, I2fb54desdqd9n, Idjett00s2gd, In7a38730s6qs, If15el53dd76v9, I9s0ave7t0vnrk, Ic6nglu2db2c36, I4q39t5hn830vp, Ibafpkl9hhno69, I35p85j063s0il, XcmV3Junctions, Iasb8k6ash5mjn, I8ofcg5rbj0g2c, I4adgbll7gku4i, I6pjjpfvhvcfru, I9pj91mj79qekl, I39uah9nss64h9, Ik64dknsq7k08, Ib51vk42m1po4n, I4ip6ol0gghhtt, I5n4sebgkfr760, Ic1m22rlm0tu62, Ifs1i5fk9cqvr6, Idhjnad4uvg4fu, I1e44oto040r12, Ieg3fd8p4pkt10, I8kg5ll427kfqq, I467333262q1l9, I82nfqfkd48n10, I1jm8m1rh9e20v, I3o5j3bli1pd8e, I50ppnqasq4tjq, I9fin09kkg0jaj, Idcr6u6361oad9, I666bl2fqjkejo, I6o1er683vod1j, I5bq561t4gpfva, I4ktuaksf5i1gk, I9bqtpv2ii35mp, I9j7pagd6d4bda, I2h9pmio37r7fb, Ibmr18suc9ikh9, I9iq22t0burs89, I5u8olqbbvfnvf, I5utcetro501ir, I2eip8tc75dpje, I564va64vtidbq, Ie5v6njpckr05b, I328av3j0bgmjb, I4tuqm9ato907i, Iagi89qt4h1lqg, I9dgmcnuamt5p8, I3vh014cqgmrfd, Ifhs60omlhvt3, If34udpd5e57vi, I39t01nnod9109, Ie5vbnd9198quk, I3h6murn8bd4v5, I6k6jf8ncesuu3, I3qhk481i120pk, If1qr0kbbl298c, Idl3umm12u5pa, I5ont0141q9ss5, Ie6j49utvii126, I3v6ks33uluhnj, I3kiiim1cds68i, I4k60mkh2r6jjg, I5oi8saufice6j, I7ne83r38c2sqq, I2hviml3snvhhn, Icnrv1mfbd3in1, Icm9m0qeemu66d, Ibv74ul0c0qf0f, Idnsr2pndm36h0, Ia1pvdcbhuqf8m, I8steo882k7qns, I4pa4q37gj6fua, I5f178ab6b89t3, I4nakhtbsk3c5s, Ici1c3ahlkpcj1, Icbio0e1f0034b, I8c0vkqjjipnuj, I1adbcfi5uc62r, Ibf6ucefn8fh49, I77087oirkh329, I9j2r9vmc9atsu, I6uag8j5aql8q, Isq3k9rh2c0l4, I1dqiovk0tpoah, I1ntko0oih7v1a, I2tf5qmg09624f, Id9uqtigc0il3v, Iaa2o6cgjdpdn5, Iam6hrl7ptd85l, Ict9ivhr2c5hv0, I8t4vv03357lk9, I2d0r9q7g2cm99, I3fek2uacie2dd, If87292opriu11, I5mundj2cf4hhs, Ia5fuanmi4lveu, Ifhl1ihpl9i99m, Iav2q7hjio8n98, I1m2ifb0h8d0r8, I2eb501t8s6hsq, Ianmuoljk2sk1u, Iab8tq4jvqftue, I9tdu4rgc5k1b, I6q5208tn6ph2e, Ideaemvoneh309, I3d9o9d7epp66v, I2a839vbf5817q, Ia9p5bg6p18r0i, I42bqh279uf7oa, I4p6v96cffstms, I90n6nnkpdahrh, I8mk5kjgn02hi8, Ieqvq91sbe02ko, I2gr10p66od9ch, I9mcq66cm3gibo, I31k9f0jol8ko4, I80q14um2s2ckg, I5qs1t1erfi7u8, I9et13knvdvgpb, Ifsme8miqq9006, Id9js0aucdivjk, I1vj3e1a62je3o, I6c1t14l6giceg, Ieg1oc56mamrl5, I2vu5vj7173ik9, I6galqkn58q3bl, I36uoc8t9liv80, Ibunghsg9qa7f7, I8qnouj2c0igph, Ic30e2k517a3ns, I47a2tsd2o2b1c, Ifc9k1s0e9nv8e, I4ihj26hl75e5p, I2dl8ekhm2t22h, I13us5e5h5645o, I931cottvong90, I7sujb8gfvuo7n, I1ors0vru14it3, I40s11r8nagn2g, I6bjj87fr5g9nl, I8cbluptqo8kbp, I81cc4plffa1dm, I3ihan8icf0c5k, I7ibh0fckqou49, I9j0ul7nh7b8jv, Id581arok0b1nj, I9jsikd1ghmc7l, I2f6mha3v4ooda, Iasqjdhasi408s, I6krn2lsleo87n, Iaid4btmkr5thp, I559fv6um7nmhd, Ibbf0j7ol2abrv, I1k3urvkqqshbc, I2ff0ffsh15vej, I1orfg86bkg123, Iaus4cb3drhu9q, Ivnsat10lv9d6, Ibncli8qttt2c2, I33rft6ag34efs, I9tmok5kceg2bg, I85icj2qbjeqbe, Ibuhbp68e6tkct, Idrevppfiubhve, I9s2h36kr71vk9, I4lkbiubo9ogq9, Id1baei7m8gkhk, I96ftepqm4vs7m, Ic3430470j4mbv, Ic3n7nqb6fffo0, I437u7rqtshfms, Iaa7g3f5tlv3gf, I7mf0sij342109, Ibvirp862qkkup, Ic5b47dj4coa3r, Idehabrqi23sc0, Idfpo6162k0hq, I19hvnphoaj44l, I1ng31ej27mh4k, I85qkvekflgteq, I1qt5nua7ua655, Ia1u3jll6a06ae, I7cl9esn1l72m7, Id68sq6o2gm8qi, Iafscmv8tjf0ou, Ibtsa3docbr9el, I2gpmmfdqv3cdc, I7psec5e6ghc64, I2psb0sladd863, I585tk8khua0gk, I3ut99di214ru2, Iemkp87d26vsbh, I4ahfrt5dscf6q, I9paqujeb1fpv6, Iakevv83i18n4r, If2ssl12kcglhg, Iabk8ljl5g8c86, Ic76kfh5ebqkpl, Icrujen33bbibf, I5gi8h3e5lkbeq, Ibgm4rnf22lal1, I8mmaab8je28oo, I6r0pr82pbiftt, Ibv4ep0hngvn9e, Ieoqregtp7b00, I6nmp4rhqla35, I8ndstn7sf4kek, I3pirohb0sp3ic, Iemqna2uucuei9, Ia82mnkmeo2rhc, I6ovmp09cui4ob, Icbccs0ug47ilf, I855j4i3kr8ko1, I4pem65k15fchj, Ia3c82eadg79bj, Ienusoeb625ftq, Icv68aq8841478, Ic262ibdoec56a, Iflcfm9b6nlmdd, Ijrsf4mnp3eka, Id5fm4p8lj5qgi, I8tjvj9uq4b7hi, I4cbvqmqadhrea, I3qt1hgg4djhgb, I4fooe9dun9o0t, Ier2cke86dqbr2, I1au3fq4n84nv3, Iejaj7m7qka9tr, Idnak900lt5lm8, I27n7lbd66730p, I2hq50pu2kdjpo, Ifk8eme5o7mukf, Iau4cgm6ih61cf, I6ir616rur362k, Ic19as7nbst738, I54umskavgc9du, I2ip7o9e2tc5sf, I5egvk6hadac5h, Iempvdlhc5ih6g, I5768ac424h061, I8iksqi3eani0a, I16enopmju1p0q, I43kq8qudg7pq9, I76riseemre533, I38bmcrmh852rk, I4hcillge8de5f, If52u7u3r3ve0n, Iek7v4hrgnq6iv, I2na29tt2afp0j, I229ijht536qdu, I62nte77gksm0f, I9cg2delv92pvq, Ilhp45uime5tp, I4f1hv034jf1dt, Iabbkuinvp2njd, I9f0v9ntn9g19p, Ie3hcrrq6r18fs, Ievr89968437gm, I1a5gf4n0nqs72, I4t689jva3ns0s, Ierrtqmdqhej88, Ifqt0l2jtnansm, I2ur0oeqg495j8, Ib5do5c9nfeb64, Iep27ialq4a7o7, Iasu5jvoqr43mv, Idpl8oj4a549ub, I5qolde99acmd1, Id9idaj83175f9, Ie1semicfuv5uu, If25fjs9o37co1, I70sc1pdo8vtos, I60p8l86a8cm59, I3m3sk2lgcabvp, I5pf572duh4oeg, I4mol6k10mv0io, Iec90vukseit9e, I7j4m7a3pkvsf4, Ic2n50kpnu5mae, I37454vatvmm1l, Iblau1qa7u7fet, I1ti389kf8t6oi, If4nnre373amul, I55kbor0ocqk6h, Idsj9cg7j96kpc, Ido4u9drncfaml, Ie8c7ctks8ur2p, I7vqogd77mmdlm, I6mik29s5073td, I2m0sqmb75cnpb, I49agc5b62mehu, Iatq9jda4hq6pg, I2g87evcjlgmqi, I4nceha17l8sr8, Ic0he9tlf9ll0u, Icdu1nb48l753j, I618m2uag0aopg, Ic8i89mfkmn3n7, Id2bej717ckub0, I545vo2e86o5i4, I3i09nus3ku37s, I2e447aa6a0imh, I82n7gg49bvucn, I58qkru548f7dl, Ibs22tt76qp5bi, I37r4bdai8o9mp, Idn2ghub1o4i40, I48u78djt89dod, Ib85m5kfbepu2t, Idaml5bdhsfcsl, Ieec0cu336gteb, I815d5k4ij85nv, Ifi98fgi9o46v7, Ic0oj9tok33uap, I3tdutpfjuk32j, I1esdujrkdacpb, I9g1d820jf9m2s, I8ve4g3egaln6a, Idbrt7si4i461v, If4hvqaeoqq5us, Iaiqv5prlisjkg, Iagqcb06kbevb1, Iec8defeh924b6, I2aatv5i0cb96a, Ib9msr5sr8t3dn, I3le5tr7ugg6l2, I3iun9sig164po, I2uqmls7kcdnii, Idg69klialbkb8, I13jboebjcbglr, I30pg328m00nr3, I381dkhrurdhrs, Ic8hi3qr11vngc, Ibjdlecumfu7q7, Ia9ems1kg7laoc, I92fq0fa45vi3, Id01dpp0dn2cj0, I6nu8k62ck9o8o, I6s1nbislhk619, I218fa3heih67o, I1tf93k54ltg1v, I6ove5at7hfiur, I9c0urppp07b8b, I1a3ecmnlnvr59, BagsListListListError, Ie2db4l6126rkt, I3he5stuuhiokq, Iaqet9jc3ihboe, Ic952bubvq4k7d, I2v50gu3s1aqk6, Iabpgqcjikia83, I327rt3qgnu4r6, If7uv525tdvv7a, Itom7fk49o0c9, I2an1fs2eiebjp, TransactionValidityTransactionSource, Iajbob6uln5jct, I5985kfq7sspta, I4jmodim0td97u, OccupiedCoreAssumption, I9kavsa730sjfr, Ifn3gc8nc1jruq, Ic1d4u2opv3fst, Ic5plng3kq7oc8, Iajdik7eaq7pn0, I2pf0b05mc7sdr, I7n1him6iq79fv, Ialuks4a6iupcs, I36e6rra3ikq65, Idv6tqqnmb3i1j, Iekan13fn586c2, Idrp5a1qbbi2au, I943rhn463avqr, Iacuu7pfj40eo5, Iavuvfkop6318c, I3cs5lehnlql7v, Ifogo2hpqpe6b4, Ifiofttj73fsk1, I7rj2bnb76oko1, I4o356o7eq06ms, I46e127tr8ma2h, I38ee9is0n4jn9, Ie88mmnuvmuvp5, I9puqgoda8ofk4, Iems84l8lk2v0c, I1r5ke30ueqo0r, I68ii5ik8avr9o, Icerf8h8pdu8ss, I6spmpef2c7svf, Iei2mvq0mjvt81, I3om0s7br1hkf1, I1p1369d52j8jd, DotXcmVersionedXcm, Ic0c3req3mlc1l, DotXcmVersionedAssetId, I7ocn4njqde3v5, DotXcmVersionedLocation, I5rlt6h8ph553n, PolkadotRuntimeOriginCaller, Iethufiek9l1gc, I79o4oopf2n4rp, Ieh6nis3hdbtgi, Ie9sr1iqcg3cgm, I1mqgk2tmnn9i2, I6lr8sctk0bi4e, Icb996amjvq1c5 } from "./common-types"; +type AnonymousEnum = T & { + __anonymous: true; +}; +type MyTuple = [T, ...T[]]; +type SeparateUndefined = undefined extends T ? undefined | Exclude : T; +type Anonymize = SeparateUndefined ? number extends L ? Binary : FixedSizeBinary : T extends string | number | bigint | boolean | void | undefined | null | symbol | Uint8Array | Enum ? T : T extends AnonymousEnum ? Enum : T extends MyTuple ? { + [K in keyof T]: T[K]; +} : T extends [] ? [] : T extends FixedSizeArray ? number extends L ? Array : FixedSizeArray : { + [K in keyof T & string]: T[K]; +}>; +type IStorage = { + System: { + /** + * The full account information for a particular account ID. + */ + Account: StorageDescriptor<[Key: SS58String], Anonymize, false, never>; + /** + * Total extrinsics count for the current block. + */ + ExtrinsicCount: StorageDescriptor<[], number, true, never>; + /** + * Whether all inherents have been applied. + */ + InherentsApplied: StorageDescriptor<[], boolean, false, never>; + /** + * The current weight for the block. + */ + BlockWeight: StorageDescriptor<[], Anonymize, false, never>; + /** + * Total length (in bytes) for all extrinsics put together, for the current block. + */ + AllExtrinsicsLen: StorageDescriptor<[], number, true, never>; + /** + * Map of block numbers to block hashes. + */ + BlockHash: StorageDescriptor<[Key: number], FixedSizeBinary<32>, false, never>; + /** + * Extrinsics data for the current block (maps an extrinsic's index to its data). + */ + ExtrinsicData: StorageDescriptor<[Key: number], Binary, false, never>; + /** + * The current block number being processed. Set by `execute_block`. + */ + Number: StorageDescriptor<[], number, false, never>; + /** + * Hash of the previous block. + */ + ParentHash: StorageDescriptor<[], FixedSizeBinary<32>, false, never>; + /** + * Digest of the current block, also part of the block header. + */ + Digest: StorageDescriptor<[], Anonymize, false, never>; + /** + * Events deposited for the current block. + * + * NOTE: The item is unbound and should therefore never be read on chain. + * It could otherwise inflate the PoV size of a block. + * + * Events have a large in-memory size. Box the events to not go out-of-memory + * just in case someone still reads them from within the runtime. + */ + Events: StorageDescriptor<[], Anonymize, false, never>; + /** + * The number of events in the `Events` list. + */ + EventCount: StorageDescriptor<[], number, false, never>; + /** + * Mapping between a topic (represented by T::Hash) and a vector of indexes + * of events in the `>` list. + * + * All topic vectors have deterministic storage locations depending on the topic. This + * allows light-clients to leverage the changes trie storage tracking mechanism and + * in case of changes fetch the list of events of interest. + * + * The value has the type `(BlockNumberFor, EventIndex)` because if we used only just + * the `EventIndex` then in case if the topic has the same contents on the next block + * no notification will be triggered thus the event might be lost. + */ + EventTopics: StorageDescriptor<[Key: FixedSizeBinary<32>], Anonymize, false, never>; + /** + * Stores the `spec_version` and `spec_name` of when the last runtime upgrade happened. + */ + LastRuntimeUpgrade: StorageDescriptor<[], Anonymize, true, never>; + /** + * True if we have upgraded so that `type RefCount` is `u32`. False (default) if not. + */ + UpgradedToU32RefCount: StorageDescriptor<[], boolean, false, never>; + /** + * True if we have upgraded so that AccountInfo contains three types of `RefCount`. False + * (default) if not. + */ + UpgradedToTripleRefCount: StorageDescriptor<[], boolean, false, never>; + /** + * The execution phase of the block. + */ + ExecutionPhase: StorageDescriptor<[], Phase, true, never>; + /** + * `Some` if a code upgrade has been authorized. + */ + AuthorizedUpgrade: StorageDescriptor<[], Anonymize, true, never>; + }; + Scheduler: { + /** + + */ + IncompleteSince: StorageDescriptor<[], number, true, never>; + /** + * Items to be executed, indexed by the block number that they should be executed on. + */ + Agenda: StorageDescriptor<[Key: number], Anonymize, false, never>; + /** + * Retry configurations for items to be executed, indexed by task address. + */ + Retries: StorageDescriptor<[Key: Anonymize], Anonymize, true, never>; + /** + * Lookup from a name to the block number and index of the task. + * + * For v3 -> v4 the previously unbounded identities are Blake2-256 hashed to form the v4 + * identities. + */ + Lookup: StorageDescriptor<[Key: FixedSizeBinary<32>], Anonymize, true, never>; + }; + Preimage: { + /** + * The request status of a given hash. + */ + StatusFor: StorageDescriptor<[Key: FixedSizeBinary<32>], PreimageOldRequestStatus, true, never>; + /** + * The request status of a given hash. + */ + RequestStatusFor: StorageDescriptor<[Key: FixedSizeBinary<32>], PreimageRequestStatus, true, never>; + /** + + */ + PreimageFor: StorageDescriptor<[Key: Anonymize], Binary, true, never>; + }; + Babe: { + /** + * Current epoch index. + */ + EpochIndex: StorageDescriptor<[], bigint, false, never>; + /** + * Current epoch authorities. + */ + Authorities: StorageDescriptor<[], Anonymize, false, never>; + /** + * The slot at which the first epoch actually started. This is 0 + * until the first block of the chain. + */ + GenesisSlot: StorageDescriptor<[], bigint, false, never>; + /** + * Current slot number. + */ + CurrentSlot: StorageDescriptor<[], bigint, false, never>; + /** + * The epoch randomness for the *current* epoch. + * + * # Security + * + * This MUST NOT be used for gambling, as it can be influenced by a + * malicious validator in the short term. It MAY be used in many + * cryptographic protocols, however, so long as one remembers that this + * (like everything else on-chain) it is public. For example, it can be + * used where a number is needed that cannot have been chosen by an + * adversary, for purposes such as public-coin zero-knowledge proofs. + */ + Randomness: StorageDescriptor<[], FixedSizeBinary<32>, false, never>; + /** + * Pending epoch configuration change that will be applied when the next epoch is enacted. + */ + PendingEpochConfigChange: StorageDescriptor<[], BabeDigestsNextConfigDescriptor, true, never>; + /** + * Next epoch randomness. + */ + NextRandomness: StorageDescriptor<[], FixedSizeBinary<32>, false, never>; + /** + * Next epoch authorities. + */ + NextAuthorities: StorageDescriptor<[], Anonymize, false, never>; + /** + * Randomness under construction. + * + * We make a trade-off between storage accesses and list length. + * We store the under-construction randomness in segments of up to + * `UNDER_CONSTRUCTION_SEGMENT_LENGTH`. + * + * Once a segment reaches this length, we begin the next one. + * We reset all segments and return to `0` at the beginning of every + * epoch. + */ + SegmentIndex: StorageDescriptor<[], number, false, never>; + /** + * TWOX-NOTE: `SegmentIndex` is an increasing integer, so this is okay. + */ + UnderConstruction: StorageDescriptor<[Key: number], Anonymize, false, never>; + /** + * Temporary value (cleared at block finalization) which is `Some` + * if per-block initialization has already been called for current block. + */ + Initialized: StorageDescriptor<[], Anonymize, true, never>; + /** + * This field should always be populated during block processing unless + * secondary plain slots are enabled (which don't contain a VRF output). + * + * It is set in `on_finalize`, before it will contain the value from the last block. + */ + AuthorVrfRandomness: StorageDescriptor<[], Anonymize, false, never>; + /** + * The block numbers when the last and current epoch have started, respectively `N-1` and + * `N`. + * NOTE: We track this is in order to annotate the block number when a given pool of + * entropy was fixed (i.e. it was known to chain observers). Since epochs are defined in + * slots, which may be skipped, the block numbers may not line up with the slot numbers. + */ + EpochStart: StorageDescriptor<[], Anonymize, false, never>; + /** + * How late the current block is compared to its parent. + * + * This entry is populated as part of block execution and is cleaned up + * on block finalization. Querying this storage entry outside of block + * execution context should always yield zero. + */ + Lateness: StorageDescriptor<[], number, false, never>; + /** + * The configuration for the current epoch. Should never be `None` as it is initialized in + * genesis. + */ + EpochConfig: StorageDescriptor<[], Anonymize, true, never>; + /** + * The configuration for the next epoch, `None` if the config will not change + * (you can fallback to `EpochConfig` instead in that case). + */ + NextEpochConfig: StorageDescriptor<[], Anonymize, true, never>; + /** + * A list of the last 100 skipped epochs and the corresponding session index + * when the epoch was skipped. + * + * This is only used for validating equivocation proofs. An equivocation proof + * must contains a key-ownership proof for a given session, therefore we need a + * way to tie together sessions and epoch indices, i.e. we need to validate that + * a validator was the owner of a given key on a given session, and what the + * active epoch index was during that session. + */ + SkippedEpochs: StorageDescriptor<[], Anonymize, false, never>; + }; + Timestamp: { + /** + * The current time for the current block. + */ + Now: StorageDescriptor<[], bigint, false, never>; + /** + * Whether the timestamp has been updated in this block. + * + * This value is updated to `true` upon successful submission of a timestamp by a node. + * It is then checked at the end of each block execution in the `on_finalize` hook. + */ + DidUpdate: StorageDescriptor<[], boolean, false, never>; + }; + Indices: { + /** + * The lookup from index to account. + */ + Accounts: StorageDescriptor<[Key: number], Anonymize, true, never>; + }; + Balances: { + /** + * The total units issued in the system. + */ + TotalIssuance: StorageDescriptor<[], bigint, false, never>; + /** + * The total units of outstanding deactivated balance in the system. + */ + InactiveIssuance: StorageDescriptor<[], bigint, false, never>; + /** + * The Balances pallet example of storing the balance of an account. + * + * # Example + * + * ```nocompile + * impl pallet_balances::Config for Runtime { + * type AccountStore = StorageMapShim, frame_system::Provider, AccountId, Self::AccountData> + * } + * ``` + * + * You can also store the balance of an account in the `System` pallet. + * + * # Example + * + * ```nocompile + * impl pallet_balances::Config for Runtime { + * type AccountStore = System + * } + * ``` + * + * But this comes with tradeoffs, storing account balances in the system pallet stores + * `frame_system` data alongside the account data contrary to storing account balances in the + * `Balances` pallet, which uses a `StorageMap` to store balances data only. + * NOTE: This is only used in the case that this pallet is used to store balances. + */ + Account: StorageDescriptor<[Key: SS58String], Anonymize, false, never>; + /** + * Any liquidity locks on some account balances. + * NOTE: Should only be accessed when setting, changing and freeing a lock. + * + * Use of locks is deprecated in favour of freezes. See `https://github.com/paritytech/substrate/pull/12951/` + */ + Locks: StorageDescriptor<[Key: SS58String], Anonymize, false, never>; + /** + * Named reserves on some account balances. + * + * Use of reserves is deprecated in favour of holds. See `https://github.com/paritytech/substrate/pull/12951/` + */ + Reserves: StorageDescriptor<[Key: SS58String], Anonymize, false, never>; + /** + * Holds on account balances. + */ + Holds: StorageDescriptor<[Key: SS58String], Anonymize, false, never>; + /** + * Freeze locks on account balances. + */ + Freezes: StorageDescriptor<[Key: SS58String], Anonymize, false, never>; + }; + TransactionPayment: { + /** + + */ + NextFeeMultiplier: StorageDescriptor<[], bigint, false, never>; + /** + + */ + StorageVersion: StorageDescriptor<[], TransactionPaymentReleases, false, never>; + }; + Authorship: { + /** + * Author of current block. + */ + Author: StorageDescriptor<[], SS58String, true, never>; + }; + Staking: { + /** + * The ideal number of active validators. + */ + ValidatorCount: StorageDescriptor<[], number, false, never>; + /** + * Minimum number of staking participants before emergency conditions are imposed. + */ + MinimumValidatorCount: StorageDescriptor<[], number, false, never>; + /** + * Any validators that may never be slashed or forcibly kicked. It's a Vec since they're + * easy to initialize and the performance hit is minimal (we expect no more than four + * invulnerables) and restricted to testnets. + */ + Invulnerables: StorageDescriptor<[], Anonymize, false, never>; + /** + * Map from all locked "stash" accounts to the controller account. + * + * TWOX-NOTE: SAFE since `AccountId` is a secure hash. + */ + Bonded: StorageDescriptor<[Key: SS58String], SS58String, true, never>; + /** + * The minimum active bond to become and maintain the role of a nominator. + */ + MinNominatorBond: StorageDescriptor<[], bigint, false, never>; + /** + * The minimum active bond to become and maintain the role of a validator. + */ + MinValidatorBond: StorageDescriptor<[], bigint, false, never>; + /** + * The minimum active nominator stake of the last successful election. + */ + MinimumActiveStake: StorageDescriptor<[], bigint, false, never>; + /** + * The minimum amount of commission that validators can set. + * + * If set to `0`, no limit exists. + */ + MinCommission: StorageDescriptor<[], number, false, never>; + /** + * Map from all (unlocked) "controller" accounts to the info regarding the staking. + * + * Note: All the reads and mutations to this storage *MUST* be done through the methods exposed + * by [`StakingLedger`] to ensure data and lock consistency. + */ + Ledger: StorageDescriptor<[Key: SS58String], Anonymize, true, never>; + /** + * Where the reward payment should be made. Keyed by stash. + * + * TWOX-NOTE: SAFE since `AccountId` is a secure hash. + */ + Payee: StorageDescriptor<[Key: SS58String], StakingRewardDestination, true, never>; + /** + * The map from (wannabe) validator stash key to the preferences of that validator. + * + * TWOX-NOTE: SAFE since `AccountId` is a secure hash. + */ + Validators: StorageDescriptor<[Key: SS58String], Anonymize, false, never>; + /** + *Counter for the related counted storage map + */ + CounterForValidators: StorageDescriptor<[], number, false, never>; + /** + * The maximum validator count before we stop allowing new validators to join. + * + * When this value is not set, no limits are enforced. + */ + MaxValidatorsCount: StorageDescriptor<[], number, true, never>; + /** + * The map from nominator stash key to their nomination preferences, namely the validators that + * they wish to support. + * + * Note that the keys of this storage map might become non-decodable in case the + * account's [`NominationsQuota::MaxNominations`] configuration is decreased. + * In this rare case, these nominators + * are still existent in storage, their key is correct and retrievable (i.e. `contains_key` + * indicates that they exist), but their value cannot be decoded. Therefore, the non-decodable + * nominators will effectively not-exist, until they re-submit their preferences such that it + * is within the bounds of the newly set `Config::MaxNominations`. + * + * This implies that `::iter_keys().count()` and `::iter().count()` might return different + * values for this map. Moreover, the main `::count()` is aligned with the former, namely the + * number of keys that exist. + * + * Lastly, if any of the nominators become non-decodable, they can be chilled immediately via + * [`Call::chill_other`] dispatchable by anyone. + * + * TWOX-NOTE: SAFE since `AccountId` is a secure hash. + */ + Nominators: StorageDescriptor<[Key: SS58String], Anonymize, true, never>; + /** + *Counter for the related counted storage map + */ + CounterForNominators: StorageDescriptor<[], number, false, never>; + /** + * Stakers whose funds are managed by other pallets. + * + * This pallet does not apply any locks on them, therefore they are only virtually bonded. They + * are expected to be keyless accounts and hence should not be allowed to mutate their ledger + * directly via this pallet. Instead, these accounts are managed by other pallets and accessed + * via low level apis. We keep track of them to do minimal integrity checks. + */ + VirtualStakers: StorageDescriptor<[Key: SS58String], undefined, true, never>; + /** + *Counter for the related counted storage map + */ + CounterForVirtualStakers: StorageDescriptor<[], number, false, never>; + /** + * The maximum nominator count before we stop allowing new validators to join. + * + * When this value is not set, no limits are enforced. + */ + MaxNominatorsCount: StorageDescriptor<[], number, true, never>; + /** + * The current era index. + * + * This is the latest planned era, depending on how the Session pallet queues the validator + * set, it might be active or not. + */ + CurrentEra: StorageDescriptor<[], number, true, never>; + /** + * The active era information, it holds index and start. + * + * The active era is the era being currently rewarded. Validator set of this era must be + * equal to [`SessionInterface::validators`]. + */ + ActiveEra: StorageDescriptor<[], Anonymize, true, never>; + /** + * The session index at which the era start for the last [`Config::HistoryDepth`] eras. + * + * Note: This tracks the starting session (i.e. session index when era start being active) + * for the eras in `[CurrentEra - HISTORY_DEPTH, CurrentEra]`. + */ + ErasStartSessionIndex: StorageDescriptor<[Key: number], number, true, never>; + /** + * Exposure of validator at era. + * + * This is keyed first by the era index to allow bulk deletion and then the stash account. + * + * Is it removed after [`Config::HistoryDepth`] eras. + * If stakers hasn't been set or has been removed then empty exposure is returned. + * + * Note: Deprecated since v14. Use `EraInfo` instead to work with exposures. + */ + ErasStakers: StorageDescriptor, Anonymize, false, never>; + /** + * Summary of validator exposure at a given era. + * + * This contains the total stake in support of the validator and their own stake. In addition, + * it can also be used to get the number of nominators backing this validator and the number of + * exposure pages they are divided into. The page count is useful to determine the number of + * pages of rewards that needs to be claimed. + * + * This is keyed first by the era index to allow bulk deletion and then the stash account. + * Should only be accessed through `EraInfo`. + * + * Is it removed after [`Config::HistoryDepth`] eras. + * If stakers hasn't been set or has been removed then empty overview is returned. + */ + ErasStakersOverview: StorageDescriptor, Anonymize, true, never>; + /** + * Clipped Exposure of validator at era. + * + * Note: This is deprecated, should be used as read-only and will be removed in the future. + * New `Exposure`s are stored in a paged manner in `ErasStakersPaged` instead. + * + * This is similar to [`ErasStakers`] but number of nominators exposed is reduced to the + * `T::MaxExposurePageSize` biggest stakers. + * (Note: the field `total` and `own` of the exposure remains unchanged). + * This is used to limit the i/o cost for the nominator payout. + * + * This is keyed fist by the era index to allow bulk deletion and then the stash account. + * + * It is removed after [`Config::HistoryDepth`] eras. + * If stakers hasn't been set or has been removed then empty exposure is returned. + * + * Note: Deprecated since v14. Use `EraInfo` instead to work with exposures. + */ + ErasStakersClipped: StorageDescriptor, Anonymize, false, never>; + /** + * Paginated exposure of a validator at given era. + * + * This is keyed first by the era index to allow bulk deletion, then stash account and finally + * the page. Should only be accessed through `EraInfo`. + * + * This is cleared after [`Config::HistoryDepth`] eras. + */ + ErasStakersPaged: StorageDescriptor, Anonymize, true, never>; + /** + * History of claimed paged rewards by era and validator. + * + * This is keyed by era and validator stash which maps to the set of page indexes which have + * been claimed. + * + * It is removed after [`Config::HistoryDepth`] eras. + */ + ClaimedRewards: StorageDescriptor, Anonymize, false, never>; + /** + * Similar to `ErasStakers`, this holds the preferences of validators. + * + * This is keyed first by the era index to allow bulk deletion and then the stash account. + * + * Is it removed after [`Config::HistoryDepth`] eras. + */ + ErasValidatorPrefs: StorageDescriptor, Anonymize, false, never>; + /** + * The total validator era payout for the last [`Config::HistoryDepth`] eras. + * + * Eras that haven't finished yet or has been removed doesn't have reward. + */ + ErasValidatorReward: StorageDescriptor<[Key: number], bigint, true, never>; + /** + * Rewards for the last [`Config::HistoryDepth`] eras. + * If reward hasn't been set or has been removed then 0 reward is returned. + */ + ErasRewardPoints: StorageDescriptor<[Key: number], Anonymize, false, never>; + /** + * The total amount staked for the last [`Config::HistoryDepth`] eras. + * If total hasn't been set or has been removed then 0 stake is returned. + */ + ErasTotalStake: StorageDescriptor<[Key: number], bigint, false, never>; + /** + * Mode of era forcing. + */ + ForceEra: StorageDescriptor<[], StakingForcing, false, never>; + /** + * Maximum staked rewards, i.e. the percentage of the era inflation that + * is used for stake rewards. + * See [Era payout](./index.html#era-payout). + */ + MaxStakedRewards: StorageDescriptor<[], number, true, never>; + /** + * The percentage of the slash that is distributed to reporters. + * + * The rest of the slashed value is handled by the `Slash`. + */ + SlashRewardFraction: StorageDescriptor<[], number, false, never>; + /** + * The amount of currency given to reporters of a slash event which was + * canceled by extraordinary circumstances (e.g. governance). + */ + CanceledSlashPayout: StorageDescriptor<[], bigint, false, never>; + /** + * All unapplied slashes that are queued for later. + */ + UnappliedSlashes: StorageDescriptor<[Key: number], Anonymize, false, never>; + /** + * A mapping from still-bonded eras to the first session index of that era. + * + * Must contains information for eras for the range: + * `[active_era - bounding_duration; active_era]` + */ + BondedEras: StorageDescriptor<[], Anonymize, false, never>; + /** + * All slashing events on validators, mapped by era to the highest slash proportion + * and slash value of the era. + */ + ValidatorSlashInEra: StorageDescriptor, Anonymize, true, never>; + /** + * All slashing events on nominators, mapped by era to the highest slash value of the era. + */ + NominatorSlashInEra: StorageDescriptor, bigint, true, never>; + /** + * Slashing spans for stash accounts. + */ + SlashingSpans: StorageDescriptor<[Key: SS58String], Anonymize, true, never>; + /** + * Records information about the maximum slash of a stash within a slashing span, + * as well as how much reward has been paid out. + */ + SpanSlash: StorageDescriptor<[Key: Anonymize], Anonymize, false, never>; + /** + * The last planned session scheduled by the session pallet. + * + * This is basically in sync with the call to [`pallet_session::SessionManager::new_session`]. + */ + CurrentPlannedSession: StorageDescriptor<[], number, false, never>; + /** + * Indices of validators that have offended in the active era. The offenders are disabled for a + * whole era. For this reason they are kept here - only staking pallet knows about eras. The + * implementor of [`DisablingStrategy`] defines if a validator should be disabled which + * implicitly means that the implementor also controls the max number of disabled validators. + * + * The vec is always kept sorted so that we can find whether a given validator has previously + * offended using binary search. + */ + DisabledValidators: StorageDescriptor<[], Anonymize, false, never>; + /** + * The threshold for when users can start calling `chill_other` for other validators / + * nominators. The threshold is compared to the actual number of validators / nominators + * (`CountFor*`) in the system compared to the configured max (`Max*Count`). + */ + ChillThreshold: StorageDescriptor<[], number, true, never>; + }; + Offences: { + /** + * The primary structure that holds all offence records keyed by report identifiers. + */ + Reports: StorageDescriptor<[Key: FixedSizeBinary<32>], Anonymize, true, never>; + /** + * A vector of reports of the same kind that happened at the same time slot. + */ + ConcurrentReportsIndex: StorageDescriptor, Anonymize, false, never>; + }; + Historical: { + /** + * Mapping from historical session indices to session-data root hash and validator count. + */ + HistoricalSessions: StorageDescriptor<[Key: number], Anonymize, true, never>; + /** + * The range of historical sessions we store. [first, last) + */ + StoredRange: StorageDescriptor<[], Anonymize, true, never>; + }; + Session: { + /** + * The current set of validators. + */ + Validators: StorageDescriptor<[], Anonymize, false, never>; + /** + * Current index of the session. + */ + CurrentIndex: StorageDescriptor<[], number, false, never>; + /** + * True if the underlying economic identities or weighting behind the validators + * has changed in the queued validator set. + */ + QueuedChanged: StorageDescriptor<[], boolean, false, never>; + /** + * The queued keys for the next session. When the next session begins, these keys + * will be used to determine the validator's session keys. + */ + QueuedKeys: StorageDescriptor<[], Anonymize, false, never>; + /** + * Indices of disabled validators. + * + * The vec is always kept sorted so that we can find whether a given validator is + * disabled using binary search. It gets cleared when `on_session_ending` returns + * a new set of identities. + */ + DisabledValidators: StorageDescriptor<[], Anonymize, false, never>; + /** + * The next session keys for a validator. + */ + NextKeys: StorageDescriptor<[Key: SS58String], Anonymize, true, never>; + /** + * The owner of a key. The key is the `KeyTypeId` + the encoded key. + */ + KeyOwner: StorageDescriptor<[Key: Anonymize], SS58String, true, never>; + }; + Grandpa: { + /** + * State of the current authority set. + */ + State: StorageDescriptor<[], GrandpaStoredState, false, never>; + /** + * Pending change: (signaled at, scheduled change). + */ + PendingChange: StorageDescriptor<[], Anonymize, true, never>; + /** + * next block number where we can force a change. + */ + NextForced: StorageDescriptor<[], number, true, never>; + /** + * `true` if we are currently stalled. + */ + Stalled: StorageDescriptor<[], Anonymize, true, never>; + /** + * The number of changes (both in terms of keys and underlying economic responsibilities) + * in the "set" of Grandpa validators from genesis. + */ + CurrentSetId: StorageDescriptor<[], bigint, false, never>; + /** + * A mapping from grandpa set ID to the index of the *most recent* session for which its + * members were responsible. + * + * This is only used for validating equivocation proofs. An equivocation proof must + * contains a key-ownership proof for a given session, therefore we need a way to tie + * together sessions and GRANDPA set ids, i.e. we need to validate that a validator + * was the owner of a given key on a given session, and what the active set ID was + * during that session. + * + * TWOX-NOTE: `SetId` is not under user control. + */ + SetIdSession: StorageDescriptor<[Key: bigint], number, true, never>; + /** + * The current list of authorities. + */ + Authorities: StorageDescriptor<[], Anonymize, false, never>; + }; + AuthorityDiscovery: { + /** + * Keys of the current authority set. + */ + Keys: StorageDescriptor<[], Anonymize, false, never>; + /** + * Keys of the next authority set. + */ + NextKeys: StorageDescriptor<[], Anonymize, false, never>; + }; + Treasury: { + /** + * Number of proposals that have been made. + */ + ProposalCount: StorageDescriptor<[], number, false, never>; + /** + * Proposals that have been made. + */ + Proposals: StorageDescriptor<[Key: number], Anonymize, true, never>; + /** + * The amount which has been reported as inactive to Currency. + */ + Deactivated: StorageDescriptor<[], bigint, false, never>; + /** + * Proposal indices that have been approved but not yet awarded. + */ + Approvals: StorageDescriptor<[], Anonymize, false, never>; + /** + * The count of spends that have been made. + */ + SpendCount: StorageDescriptor<[], number, false, never>; + /** + * Spends that have been approved and being processed. + */ + Spends: StorageDescriptor<[Key: number], Anonymize, true, never>; + }; + ConvictionVoting: { + /** + * All voting for a particular voter in a particular voting class. We store the balance for the + * number of votes that we have recorded. + */ + VotingFor: StorageDescriptor, ConvictionVotingVoteVoting, false, never>; + /** + * The voting classes which have a non-zero lock requirement and the lock amounts which they + * require. The actual amount locked on behalf of this pallet should always be the maximum of + * this list. + */ + ClassLocksFor: StorageDescriptor<[Key: SS58String], Anonymize, false, never>; + }; + Referenda: { + /** + * The next free referendum index, aka the number of referenda started so far. + */ + ReferendumCount: StorageDescriptor<[], number, false, never>; + /** + * Information concerning any given referendum. + */ + ReferendumInfoFor: StorageDescriptor<[Key: number], Anonymize, true, never>; + /** + * The sorted list of referenda ready to be decided but not yet being decided, ordered by + * conviction-weighted approvals. + * + * This should be empty if `DecidingCount` is less than `TrackInfo::max_deciding`. + */ + TrackQueue: StorageDescriptor<[Key: number], Anonymize, false, never>; + /** + * The number of referenda being decided currently. + */ + DecidingCount: StorageDescriptor<[Key: number], number, false, never>; + /** + * The metadata is a general information concerning the referendum. + * The `Hash` refers to the preimage of the `Preimages` provider which can be a JSON + * dump or IPFS hash of a JSON file. + * + * Consider a garbage collection for a metadata of finished referendums to `unrequest` (remove) + * large preimages. + */ + MetadataOf: StorageDescriptor<[Key: number], FixedSizeBinary<32>, true, never>; + }; + Whitelist: { + /** + + */ + WhitelistedCall: StorageDescriptor<[Key: FixedSizeBinary<32>], undefined, true, never>; + }; + Parameters: { + /** + * Stored parameters. + */ + Parameters: StorageDescriptor<[Key: Anonymize], Anonymize, true, never>; + }; + Claims: { + /** + + */ + Claims: StorageDescriptor<[Key: FixedSizeBinary<20>], bigint, true, never>; + /** + + */ + Total: StorageDescriptor<[], bigint, false, never>; + /** + * Vesting schedule for a claim. + * First balance is the total amount that should be held for vesting. + * Second balance is how much should be unlocked per block. + * The block number is when the vesting should start. + */ + Vesting: StorageDescriptor<[Key: FixedSizeBinary<20>], Anonymize, true, never>; + /** + * The statement kind that must be signed, if any. + */ + Signing: StorageDescriptor<[Key: FixedSizeBinary<20>], ClaimsStatementKind, true, never>; + /** + * Pre-claimed Ethereum accounts, by the Account ID that they are claimed to. + */ + Preclaims: StorageDescriptor<[Key: SS58String], FixedSizeBinary<20>, true, never>; + }; + Vesting: { + /** + * Information regarding the vesting of a given account. + */ + Vesting: StorageDescriptor<[Key: SS58String], Anonymize, true, never>; + /** + * Storage version of the pallet. + * + * New networks start with latest version, as determined by the genesis build. + */ + StorageVersion: StorageDescriptor<[], Version, false, never>; + }; + Proxy: { + /** + * The set of account proxies. Maps the account which has delegated to the accounts + * which are being delegated to, together with the amount held on deposit. + */ + Proxies: StorageDescriptor<[Key: SS58String], Anonymize, false, never>; + /** + * The announcements made by the proxy (key). + */ + Announcements: StorageDescriptor<[Key: SS58String], Anonymize, false, never>; + }; + Multisig: { + /** + * The set of open multisig operations. + */ + Multisigs: StorageDescriptor, Anonymize, true, never>; + }; + Bounties: { + /** + * Number of bounty proposals that have been made. + */ + BountyCount: StorageDescriptor<[], number, false, never>; + /** + * Bounties that have been made. + */ + Bounties: StorageDescriptor<[Key: number], Anonymize, true, never>; + /** + * The description of each bounty. + */ + BountyDescriptions: StorageDescriptor<[Key: number], Binary, true, never>; + /** + * Bounty indices that have been approved but not yet funded. + */ + BountyApprovals: StorageDescriptor<[], Anonymize, false, never>; + }; + ChildBounties: { + /** + * Number of total child bounties. + */ + ChildBountyCount: StorageDescriptor<[], number, false, never>; + /** + * Number of child bounties per parent bounty. + * Map of parent bounty index to number of child bounties. + */ + ParentChildBounties: StorageDescriptor<[Key: number], number, false, never>; + /** + * Child bounties that have been added. + */ + ChildBounties: StorageDescriptor, Anonymize, true, never>; + /** + * The description of each child-bounty. + */ + ChildBountyDescriptions: StorageDescriptor<[Key: number], Binary, true, never>; + /** + * The cumulative child-bounty curator fee for each parent bounty. + */ + ChildrenCuratorFees: StorageDescriptor<[Key: number], bigint, false, never>; + }; + ElectionProviderMultiPhase: { + /** + * Internal counter for the number of rounds. + * + * This is useful for de-duplication of transactions submitted to the pool, and general + * diagnostics of the pallet. + * + * This is merely incremented once per every time that an upstream `elect` is called. + */ + Round: StorageDescriptor<[], number, false, never>; + /** + * Current phase. + */ + CurrentPhase: StorageDescriptor<[], ElectionProviderMultiPhasePhase, false, never>; + /** + * Current best solution, signed or unsigned, queued to be returned upon `elect`. + * + * Always sorted by score. + */ + QueuedSolution: StorageDescriptor<[], Anonymize, true, never>; + /** + * Snapshot data of the round. + * + * This is created at the beginning of the signed phase and cleared upon calling `elect`. + * Note: This storage type must only be mutated through [`SnapshotWrapper`]. + */ + Snapshot: StorageDescriptor<[], Anonymize, true, never>; + /** + * Desired number of targets to elect for this round. + * + * Only exists when [`Snapshot`] is present. + * Note: This storage type must only be mutated through [`SnapshotWrapper`]. + */ + DesiredTargets: StorageDescriptor<[], number, true, never>; + /** + * The metadata of the [`RoundSnapshot`] + * + * Only exists when [`Snapshot`] is present. + * Note: This storage type must only be mutated through [`SnapshotWrapper`]. + */ + SnapshotMetadata: StorageDescriptor<[], Anonymize, true, never>; + /** + * The next index to be assigned to an incoming signed submission. + * + * Every accepted submission is assigned a unique index; that index is bound to that particular + * submission for the duration of the election. On election finalization, the next index is + * reset to 0. + * + * We can't just use `SignedSubmissionIndices.len()`, because that's a bounded set; past its + * capacity, it will simply saturate. We can't just iterate over `SignedSubmissionsMap`, + * because iteration is slow. Instead, we store the value here. + */ + SignedSubmissionNextIndex: StorageDescriptor<[], number, false, never>; + /** + * A sorted, bounded vector of `(score, block_number, index)`, where each `index` points to a + * value in `SignedSubmissions`. + * + * We never need to process more than a single signed submission at a time. Signed submissions + * can be quite large, so we're willing to pay the cost of multiple database accesses to access + * them one at a time instead of reading and decoding all of them at once. + */ + SignedSubmissionIndices: StorageDescriptor<[], Anonymize, false, never>; + /** + * Unchecked, signed solutions. + * + * Together with `SubmissionIndices`, this stores a bounded set of `SignedSubmissions` while + * allowing us to keep only a single one in memory at a time. + * + * Twox note: the key of the map is an auto-incrementing index which users cannot inspect or + * affect; we shouldn't need a cryptographically secure hasher. + */ + SignedSubmissionsMap: StorageDescriptor<[Key: number], Anonymize, true, never>; + /** + * The minimum score that each 'untrusted' solution must attain in order to be considered + * feasible. + * + * Can be set via `set_minimum_untrusted_score`. + */ + MinimumUntrustedScore: StorageDescriptor<[], Anonymize, true, never>; + }; + VoterList: { + /** + * A single node, within some bag. + * + * Nodes store links forward and back within their respective bags. + */ + ListNodes: StorageDescriptor<[Key: SS58String], Anonymize, true, never>; + /** + *Counter for the related counted storage map + */ + CounterForListNodes: StorageDescriptor<[], number, false, never>; + /** + * A bag stored in storage. + * + * Stores a `Bag` struct, which stores head and tail pointers to itself. + */ + ListBags: StorageDescriptor<[Key: bigint], Anonymize, true, never>; + }; + NominationPools: { + /** + * The sum of funds across all pools. + * + * This might be lower but never higher than the sum of `total_balance` of all [`PoolMembers`] + * because calling `pool_withdraw_unbonded` might decrease the total stake of the pool's + * `bonded_account` without adjusting the pallet-internal `UnbondingPool`'s. + */ + TotalValueLocked: StorageDescriptor<[], bigint, false, never>; + /** + * Minimum amount to bond to join a pool. + */ + MinJoinBond: StorageDescriptor<[], bigint, false, never>; + /** + * Minimum bond required to create a pool. + * + * This is the amount that the depositor must put as their initial stake in the pool, as an + * indication of "skin in the game". + * + * This is the value that will always exist in the staking ledger of the pool bonded account + * while all other accounts leave. + */ + MinCreateBond: StorageDescriptor<[], bigint, false, never>; + /** + * Maximum number of nomination pools that can exist. If `None`, then an unbounded number of + * pools can exist. + */ + MaxPools: StorageDescriptor<[], number, true, never>; + /** + * Maximum number of members that can exist in the system. If `None`, then the count + * members are not bound on a system wide basis. + */ + MaxPoolMembers: StorageDescriptor<[], number, true, never>; + /** + * Maximum number of members that may belong to pool. If `None`, then the count of + * members is not bound on a per pool basis. + */ + MaxPoolMembersPerPool: StorageDescriptor<[], number, true, never>; + /** + * The maximum commission that can be charged by a pool. Used on commission payouts to bound + * pool commissions that are > `GlobalMaxCommission`, necessary if a future + * `GlobalMaxCommission` is lower than some current pool commissions. + */ + GlobalMaxCommission: StorageDescriptor<[], number, true, never>; + /** + * Active members. + * + * TWOX-NOTE: SAFE since `AccountId` is a secure hash. + */ + PoolMembers: StorageDescriptor<[Key: SS58String], Anonymize, true, never>; + /** + *Counter for the related counted storage map + */ + CounterForPoolMembers: StorageDescriptor<[], number, false, never>; + /** + * Storage for bonded pools. + */ + BondedPools: StorageDescriptor<[Key: number], Anonymize, true, never>; + /** + *Counter for the related counted storage map + */ + CounterForBondedPools: StorageDescriptor<[], number, false, never>; + /** + * Reward pools. This is where there rewards for each pool accumulate. When a members payout is + * claimed, the balance comes out of the reward pool. Keyed by the bonded pools account. + */ + RewardPools: StorageDescriptor<[Key: number], Anonymize, true, never>; + /** + *Counter for the related counted storage map + */ + CounterForRewardPools: StorageDescriptor<[], number, false, never>; + /** + * Groups of unbonding pools. Each group of unbonding pools belongs to a + * bonded pool, hence the name sub-pools. Keyed by the bonded pools account. + */ + SubPoolsStorage: StorageDescriptor<[Key: number], Anonymize, true, never>; + /** + *Counter for the related counted storage map + */ + CounterForSubPoolsStorage: StorageDescriptor<[], number, false, never>; + /** + * Metadata for the pool. + */ + Metadata: StorageDescriptor<[Key: number], Binary, false, never>; + /** + *Counter for the related counted storage map + */ + CounterForMetadata: StorageDescriptor<[], number, false, never>; + /** + * Ever increasing number of all pools created so far. + */ + LastPoolId: StorageDescriptor<[], number, false, never>; + /** + * A reverse lookup from the pool's account id to its id. + * + * This is only used for slashing and on automatic withdraw update. In all other instances, the + * pool id is used, and the accounts are deterministically derived from it. + */ + ReversePoolIdLookup: StorageDescriptor<[Key: SS58String], number, true, never>; + /** + *Counter for the related counted storage map + */ + CounterForReversePoolIdLookup: StorageDescriptor<[], number, false, never>; + /** + * Map from a pool member account to their opted claim permission. + */ + ClaimPermissions: StorageDescriptor<[Key: SS58String], NominationPoolsClaimPermission, false, never>; + }; + FastUnstake: { + /** + * The current "head of the queue" being unstaked. + * + * The head in itself can be a batch of up to [`Config::BatchSize`] stakers. + */ + Head: StorageDescriptor<[], Anonymize, true, never>; + /** + * The map of all accounts wishing to be unstaked. + * + * Keeps track of `AccountId` wishing to unstake and it's corresponding deposit. + */ + Queue: StorageDescriptor<[Key: SS58String], bigint, true, never>; + /** + *Counter for the related counted storage map + */ + CounterForQueue: StorageDescriptor<[], number, false, never>; + /** + * Number of eras to check per block. + * + * If set to 0, this pallet does absolutely nothing. Cannot be set to more than + * [`Config::MaxErasToCheckPerBlock`]. + * + * Based on the amount of weight available at [`Pallet::on_idle`], up to this many eras are + * checked. The checking is represented by updating [`UnstakeRequest::checked`], which is + * stored in [`Head`]. + */ + ErasToCheckPerBlock: StorageDescriptor<[], number, false, never>; + }; + Configuration: { + /** + * The active configuration for the current session. + */ + ActiveConfig: StorageDescriptor<[], Anonymize, false, never>; + /** + * Pending configuration changes. + * + * This is a list of configuration changes, each with a session index at which it should + * be applied. + * + * The list is sorted ascending by session index. Also, this list can only contain at most + * 2 items: for the next session and for the `scheduled_session`. + */ + PendingConfigs: StorageDescriptor<[], Anonymize, false, never>; + /** + * If this is set, then the configuration setters will bypass the consistency checks. This + * is meant to be used only as the last resort. + */ + BypassConsistencyCheck: StorageDescriptor<[], boolean, false, never>; + }; + ParasShared: { + /** + * The current session index. + */ + CurrentSessionIndex: StorageDescriptor<[], number, false, never>; + /** + * All the validators actively participating in parachain consensus. + * Indices are into the broader validator set. + */ + ActiveValidatorIndices: StorageDescriptor<[], Anonymize, false, never>; + /** + * The parachain attestation keys of the validators actively participating in parachain + * consensus. This should be the same length as `ActiveValidatorIndices`. + */ + ActiveValidatorKeys: StorageDescriptor<[], Anonymize, false, never>; + /** + * All allowed relay-parents. + */ + AllowedRelayParents: StorageDescriptor<[], Anonymize, false, never>; + }; + ParaInclusion: { + /** + * Candidates pending availability by `ParaId`. They form a chain starting from the latest + * included head of the para. + * Use a different prefix post-migration to v1, since the v0 `PendingAvailability` storage + * would otherwise have the exact same prefix which could cause undefined behaviour when doing + * the migration. + */ + V1: StorageDescriptor<[Key: number], Anonymize, true, never>; + }; + ParaInherent: { + /** + * Whether the paras inherent was included within this block. + * + * The `Option<()>` is effectively a `bool`, but it never hits storage in the `None` variant + * due to the guarantees of FRAME's storage APIs. + * + * If this is `None` at the end of the block, we panic and render the block invalid. + */ + Included: StorageDescriptor<[], undefined, true, never>; + /** + * Scraped on chain data for extracting resolved disputes as well as backing votes. + */ + OnChainVotes: StorageDescriptor<[], Anonymize, true, never>; + }; + ParaScheduler: { + /** + * All the validator groups. One for each core. Indices are into `ActiveValidators` - not the + * broader set of Polkadot validators, but instead just the subset used for parachains during + * this session. + * + * Bound: The number of cores is the sum of the numbers of parachains and parathread + * multiplexers. Reasonably, 100-1000. The dominant factor is the number of validators: safe + * upper bound at 10k. + */ + ValidatorGroups: StorageDescriptor<[], Anonymize, false, never>; + /** + * One entry for each availability core. The i'th parachain belongs to the i'th core, with the + * remaining cores all being on demand parachain multiplexers. + * + * Bounded by the maximum of either of these two values: + * * The number of parachains and parathread multiplexers + * * The number of validators divided by `configuration.max_validators_per_core`. + */ + AvailabilityCores: StorageDescriptor<[], Anonymize, false, never>; + /** + * The block number where the session start occurred. Used to track how many group rotations + * have occurred. + * + * Note that in the context of parachains modules the session change is signaled during + * the block and enacted at the end of the block (at the finalization stage, to be exact). + * Thus for all intents and purposes the effect of the session change is observed at the + * block following the session change, block number of which we save in this storage value. + */ + SessionStartBlock: StorageDescriptor<[], number, false, never>; + /** + * One entry for each availability core. The `VecDeque` represents the assignments to be + * scheduled on that core. The value contained here will not be valid after the end of + * a block. Runtime APIs should be used to determine scheduled cores for the upcoming block. + */ + ClaimQueue: StorageDescriptor<[], Anonymize, false, never>; + }; + Paras: { + /** + * All currently active PVF pre-checking votes. + * + * Invariant: + * - There are no PVF pre-checking votes that exists in list but not in the set and vice versa. + */ + PvfActiveVoteMap: StorageDescriptor<[Key: FixedSizeBinary<32>], Anonymize, true, never>; + /** + * The list of all currently active PVF votes. Auxiliary to `PvfActiveVoteMap`. + */ + PvfActiveVoteList: StorageDescriptor<[], Anonymize, false, never>; + /** + * All lease holding parachains. Ordered ascending by `ParaId`. On demand parachains are not + * included. + * + * Consider using the [`ParachainsCache`] type of modifying. + */ + Parachains: StorageDescriptor<[], Anonymize, false, never>; + /** + * The current lifecycle of a all known Para IDs. + */ + ParaLifecycles: StorageDescriptor<[Key: number], ParachainsParasParaLifecycle, true, never>; + /** + * The head-data of every registered para. + */ + Heads: StorageDescriptor<[Key: number], Binary, true, never>; + /** + * The context (relay-chain block number) of the most recent parachain head. + */ + MostRecentContext: StorageDescriptor<[Key: number], number, true, never>; + /** + * The validation code hash of every live para. + * + * Corresponding code can be retrieved with [`CodeByHash`]. + */ + CurrentCodeHash: StorageDescriptor<[Key: number], FixedSizeBinary<32>, true, never>; + /** + * Actual past code hash, indicated by the para id as well as the block number at which it + * became outdated. + * + * Corresponding code can be retrieved with [`CodeByHash`]. + */ + PastCodeHash: StorageDescriptor<[Key: Anonymize], FixedSizeBinary<32>, true, never>; + /** + * Past code of parachains. The parachains themselves may not be registered anymore, + * but we also keep their code on-chain for the same amount of time as outdated code + * to keep it available for approval checkers. + */ + PastCodeMeta: StorageDescriptor<[Key: number], Anonymize, false, never>; + /** + * Which paras have past code that needs pruning and the relay-chain block at which the code + * was replaced. Note that this is the actual height of the included block, not the expected + * height at which the code upgrade would be applied, although they may be equal. + * This is to ensure the entire acceptance period is covered, not an offset acceptance period + * starting from the time at which the parachain perceives a code upgrade as having occurred. + * Multiple entries for a single para are permitted. Ordered ascending by block number. + */ + PastCodePruning: StorageDescriptor<[], Anonymize, false, never>; + /** + * The block number at which the planned code change is expected for a parachain. + * + * The change will be applied after the first parablock for this ID included which executes + * in the context of a relay chain block with a number >= `expected_at`. + */ + FutureCodeUpgrades: StorageDescriptor<[Key: number], number, true, never>; + /** + * The list of upcoming future code upgrades. + * + * Each item is a pair of the parachain and the expected block at which the upgrade should be + * applied. The upgrade will be applied at the given relay chain block. In contrast to + * [`FutureCodeUpgrades`] this code upgrade will be applied regardless the parachain making any + * progress or not. + * + * Ordered ascending by block number. + */ + FutureCodeUpgradesAt: StorageDescriptor<[], Anonymize, false, never>; + /** + * The actual future code hash of a para. + * + * Corresponding code can be retrieved with [`CodeByHash`]. + */ + FutureCodeHash: StorageDescriptor<[Key: number], FixedSizeBinary<32>, true, never>; + /** + * This is used by the relay-chain to communicate to a parachain a go-ahead with in the upgrade + * procedure. + * + * This value is absent when there are no upgrades scheduled or during the time the relay chain + * performs the checks. It is set at the first relay-chain block when the corresponding + * parachain can switch its upgrade function. As soon as the parachain's block is included, the + * value gets reset to `None`. + * + * NOTE that this field is used by parachains via merkle storage proofs, therefore changing + * the format will require migration of parachains. + */ + UpgradeGoAheadSignal: StorageDescriptor<[Key: number], UpgradeGoAhead, true, never>; + /** + * This is used by the relay-chain to communicate that there are restrictions for performing + * an upgrade for this parachain. + * + * This may be a because the parachain waits for the upgrade cooldown to expire. Another + * potential use case is when we want to perform some maintenance (such as storage migration) + * we could restrict upgrades to make the process simpler. + * + * NOTE that this field is used by parachains via merkle storage proofs, therefore changing + * the format will require migration of parachains. + */ + UpgradeRestrictionSignal: StorageDescriptor<[Key: number], UpgradeRestriction, true, never>; + /** + * The list of parachains that are awaiting for their upgrade restriction to cooldown. + * + * Ordered ascending by block number. + */ + UpgradeCooldowns: StorageDescriptor<[], Anonymize, false, never>; + /** + * The list of upcoming code upgrades. + * + * Each item is a pair of which para performs a code upgrade and at which relay-chain block it + * is expected at. + * + * Ordered ascending by block number. + */ + UpcomingUpgrades: StorageDescriptor<[], Anonymize, false, never>; + /** + * The actions to perform during the start of a specific session index. + */ + ActionsQueue: StorageDescriptor<[Key: number], Anonymize, false, never>; + /** + * Upcoming paras instantiation arguments. + * + * NOTE that after PVF pre-checking is enabled the para genesis arg will have it's code set + * to empty. Instead, the code will be saved into the storage right away via `CodeByHash`. + */ + UpcomingParasGenesis: StorageDescriptor<[Key: number], Anonymize, true, never>; + /** + * The number of reference on the validation code in [`CodeByHash`] storage. + */ + CodeByHashRefs: StorageDescriptor<[Key: FixedSizeBinary<32>], number, false, never>; + /** + * Validation code stored by its hash. + * + * This storage is consistent with [`FutureCodeHash`], [`CurrentCodeHash`] and + * [`PastCodeHash`]. + */ + CodeByHash: StorageDescriptor<[Key: FixedSizeBinary<32>], Binary, true, never>; + }; + Initializer: { + /** + * Whether the parachains modules have been initialized within this block. + * + * Semantically a `bool`, but this guarantees it should never hit the trie, + * as this is cleared in `on_finalize` and Frame optimizes `None` values to be empty values. + * + * As a `bool`, `set(false)` and `remove()` both lead to the next `get()` being false, but one + * of them writes to the trie and one does not. This confusion makes `Option<()>` more suitable + * for the semantics of this variable. + */ + HasInitialized: StorageDescriptor<[], undefined, true, never>; + /** + * Buffered session changes along with the block number at which they should be applied. + * + * Typically this will be empty or one element long. Apart from that this item never hits + * the storage. + * + * However this is a `Vec` regardless to handle various edge cases that may occur at runtime + * upgrade boundaries or if governance intervenes. + */ + BufferedSessionChanges: StorageDescriptor<[], Anonymize, false, never>; + }; + Dmp: { + /** + * The downward messages addressed for a certain para. + */ + DownwardMessageQueues: StorageDescriptor<[Key: number], Anonymize, false, never>; + /** + * A mapping that stores the downward message queue MQC head for each para. + * + * Each link in this chain has a form: + * `(prev_head, B, H(M))`, where + * - `prev_head`: is the previous head hash or zero if none. + * - `B`: is the relay-chain block number in which a message was appended. + * - `H(M)`: is the hash of the message being appended. + */ + DownwardMessageQueueHeads: StorageDescriptor<[Key: number], FixedSizeBinary<32>, false, never>; + /** + * The factor to multiply the base delivery fee by. + */ + DeliveryFeeFactor: StorageDescriptor<[Key: number], bigint, false, never>; + }; + Hrmp: { + /** + * The set of pending HRMP open channel requests. + * + * The set is accompanied by a list for iteration. + * + * Invariant: + * - There are no channels that exists in list but not in the set and vice versa. + */ + HrmpOpenChannelRequests: StorageDescriptor<[Key: Anonymize], Anonymize, true, never>; + /** + + */ + HrmpOpenChannelRequestsList: StorageDescriptor<[], Anonymize, false, never>; + /** + * This mapping tracks how many open channel requests are initiated by a given sender para. + * Invariant: `HrmpOpenChannelRequests` should contain the same number of items that has + * `(X, _)` as the number of `HrmpOpenChannelRequestCount` for `X`. + */ + HrmpOpenChannelRequestCount: StorageDescriptor<[Key: number], number, false, never>; + /** + * This mapping tracks how many open channel requests were accepted by a given recipient para. + * Invariant: `HrmpOpenChannelRequests` should contain the same number of items `(_, X)` with + * `confirmed` set to true, as the number of `HrmpAcceptedChannelRequestCount` for `X`. + */ + HrmpAcceptedChannelRequestCount: StorageDescriptor<[Key: number], number, false, never>; + /** + * A set of pending HRMP close channel requests that are going to be closed during the session + * change. Used for checking if a given channel is registered for closure. + * + * The set is accompanied by a list for iteration. + * + * Invariant: + * - There are no channels that exists in list but not in the set and vice versa. + */ + HrmpCloseChannelRequests: StorageDescriptor<[Key: Anonymize], undefined, true, never>; + /** + + */ + HrmpCloseChannelRequestsList: StorageDescriptor<[], Anonymize, false, never>; + /** + * The HRMP watermark associated with each para. + * Invariant: + * - each para `P` used here as a key should satisfy `Paras::is_valid_para(P)` within a + * session. + */ + HrmpWatermarks: StorageDescriptor<[Key: number], number, true, never>; + /** + * HRMP channel data associated with each para. + * Invariant: + * - each participant in the channel should satisfy `Paras::is_valid_para(P)` within a session. + */ + HrmpChannels: StorageDescriptor<[Key: Anonymize], Anonymize, true, never>; + /** + * Ingress/egress indexes allow to find all the senders and receivers given the opposite side. + * I.e. + * + * (a) ingress index allows to find all the senders for a given recipient. + * (b) egress index allows to find all the recipients for a given sender. + * + * Invariants: + * - for each ingress index entry for `P` each item `I` in the index should present in + * `HrmpChannels` as `(I, P)`. + * - for each egress index entry for `P` each item `E` in the index should present in + * `HrmpChannels` as `(P, E)`. + * - there should be no other dangling channels in `HrmpChannels`. + * - the vectors are sorted. + */ + HrmpIngressChannelsIndex: StorageDescriptor<[Key: number], Anonymize, false, never>; + /** + + */ + HrmpEgressChannelsIndex: StorageDescriptor<[Key: number], Anonymize, false, never>; + /** + * Storage for the messages for each channel. + * Invariant: cannot be non-empty if the corresponding channel in `HrmpChannels` is `None`. + */ + HrmpChannelContents: StorageDescriptor<[Key: Anonymize], Anonymize, false, never>; + /** + * Maintains a mapping that can be used to answer the question: What paras sent a message at + * the given block number for a given receiver. Invariants: + * - The inner `Vec` is never empty. + * - The inner `Vec` cannot store two same `ParaId`. + * - The outer vector is sorted ascending by block number and cannot store two items with the + * same block number. + */ + HrmpChannelDigests: StorageDescriptor<[Key: number], Anonymize, false, never>; + }; + ParaSessionInfo: { + /** + * Assignment keys for the current session. + * Note that this API is private due to it being prone to 'off-by-one' at session boundaries. + * When in doubt, use `Sessions` API instead. + */ + AssignmentKeysUnsafe: StorageDescriptor<[], Anonymize, false, never>; + /** + * The earliest session for which previous session info is stored. + */ + EarliestStoredSession: StorageDescriptor<[], number, false, never>; + /** + * Session information in a rolling window. + * Should have an entry in range `EarliestStoredSession..=CurrentSessionIndex`. + * Does not have any entries before the session index in the first session change notification. + */ + Sessions: StorageDescriptor<[Key: number], Anonymize, true, never>; + /** + * The validator account keys of the validators actively participating in parachain consensus. + */ + AccountKeys: StorageDescriptor<[Key: number], Anonymize, true, never>; + /** + * Executor parameter set for a given session index + */ + SessionExecutorParams: StorageDescriptor<[Key: number], Anonymize, true, never>; + }; + ParasDisputes: { + /** + * The last pruned session, if any. All data stored by this module + * references sessions. + */ + LastPrunedSession: StorageDescriptor<[], number, true, never>; + /** + * All ongoing or concluded disputes for the last several sessions. + */ + Disputes: StorageDescriptor, Anonymize, true, never>; + /** + * Backing votes stored for each dispute. + * This storage is used for slashing. + */ + BackersOnDisputes: StorageDescriptor, Anonymize, true, never>; + /** + * All included blocks on the chain, as well as the block number in this chain that + * should be reverted back to if the candidate is disputed and determined to be invalid. + */ + Included: StorageDescriptor, number, true, never>; + /** + * Whether the chain is frozen. Starts as `None`. When this is `Some`, + * the chain will not accept any new parachain blocks for backing or inclusion, + * and its value indicates the last valid block number in the chain. + * It can only be set back to `None` by governance intervention. + */ + Frozen: StorageDescriptor<[], Anonymize, false, never>; + }; + ParasSlashing: { + /** + * Validators pending dispute slashes. + */ + UnappliedSlashes: StorageDescriptor, Anonymize, true, never>; + /** + * `ValidatorSetCount` per session. + */ + ValidatorSetCounts: StorageDescriptor<[Key: number], number, true, never>; + }; + OnDemand: { + /** + * Maps a `ParaId` to `CoreIndex` and keeps track of how many assignments the scheduler has in + * it's lookahead. Keeping track of this affinity prevents parallel execution of the same + * `ParaId` on two or more `CoreIndex`es. + */ + ParaIdAffinity: StorageDescriptor<[Key: number], Anonymize, true, never>; + /** + * Overall status of queue (both free + affinity entries) + */ + QueueStatus: StorageDescriptor<[], Anonymize, false, never>; + /** + * Priority queue for all orders which don't yet (or not any more) have any core affinity. + */ + FreeEntries: StorageDescriptor<[], Anonymize, false, never>; + /** + * Queue entries that are currently bound to a particular core due to core affinity. + */ + AffinityEntries: StorageDescriptor<[Key: number], Anonymize, false, never>; + /** + * Keeps track of accumulated revenue from on demand order sales. + */ + Revenue: StorageDescriptor<[], Anonymize, false, never>; + }; + CoretimeAssignmentProvider: { + /** + * Scheduled assignment sets. + * + * Assignments as of the given block number. They will go into state once the block number is + * reached (and replace whatever was in there before). + */ + CoreSchedules: StorageDescriptor<[Key: Anonymize], Anonymize, true, "0">; + /** + * Assignments which are currently active. + * + * They will be picked from `PendingAssignments` once we reach the scheduled block number in + * `PendingAssignments`. + */ + CoreDescriptors: StorageDescriptor<[Key: number], Anonymize, false, "0">; + }; + Registrar: { + /** + * Pending swap operations. + */ + PendingSwap: StorageDescriptor<[Key: number], number, true, never>; + /** + * Amount held on deposit for each para and the original depositor. + * + * The given account ID is responsible for registering the code and initial head data, but may + * only do so if it isn't yet registered. (After that, it's up to governance to do so.) + */ + Paras: StorageDescriptor<[Key: number], Anonymize, true, never>; + /** + * The next free `ParaId`. + */ + NextFreeParaId: StorageDescriptor<[], number, false, never>; + }; + Slots: { + /** + * Amounts held on deposit for each (possibly future) leased parachain. + * + * The actual amount locked on its behalf by any account at any time is the maximum of the + * second values of the items in this list whose first value is the account. + * + * The first item in the list is the amount locked for the current Lease Period. Following + * items are for the subsequent lease periods. + * + * The default value (an empty list) implies that the parachain no longer exists (or never + * existed) as far as this pallet is concerned. + * + * If a parachain doesn't exist *yet* but is scheduled to exist in the future, then it + * will be left-padded with one or more `None`s to denote the fact that nothing is held on + * deposit for the non-existent chain currently, but is held at some point in the future. + * + * It is illegal for a `None` value to trail in the list. + */ + Leases: StorageDescriptor<[Key: number], Anonymize, false, never>; + }; + Auctions: { + /** + * Number of auctions started so far. + */ + AuctionCounter: StorageDescriptor<[], number, false, never>; + /** + * Information relating to the current auction, if there is one. + * + * The first item in the tuple is the lease period index that the first of the four + * contiguous lease periods on auction is for. The second is the block number when the + * auction will "begin to end", i.e. the first block of the Ending Period of the auction. + */ + AuctionInfo: StorageDescriptor<[], Anonymize, true, never>; + /** + * Amounts currently reserved in the accounts of the bidders currently winning + * (sub-)ranges. + */ + ReservedAmounts: StorageDescriptor<[Key: Anonymize], bigint, true, never>; + /** + * The winning bids for each of the 10 ranges at each sample in the final Ending Period of + * the current auction. The map's key is the 0-based index into the Sample Size. The + * first sample of the ending period is 0; the last is `Sample Size - 1`. + */ + Winning: StorageDescriptor<[Key: number], Anonymize, true, never>; + }; + Crowdloan: { + /** + * Info on all of the funds. + */ + Funds: StorageDescriptor<[Key: number], Anonymize, true, never>; + /** + * The funds that have had additional contributions during the last block. This is used + * in order to determine which funds should submit new or updated bids. + */ + NewRaise: StorageDescriptor<[], Anonymize, false, never>; + /** + * The number of auctions that have entered into their ending period so far. + */ + EndingsCount: StorageDescriptor<[], number, false, never>; + /** + * Tracker for the next available fund index + */ + NextFundIndex: StorageDescriptor<[], number, false, never>; + }; + StateTrieMigration: { + /** + * Migration progress. + * + * This stores the snapshot of the last migrated keys. It can be set into motion and move + * forward by any of the means provided by this pallet. + */ + MigrationProcess: StorageDescriptor<[], Anonymize, false, never>; + /** + * The limits that are imposed on automatic migrations. + * + * If set to None, then no automatic migration happens. + */ + AutoLimits: StorageDescriptor<[], Anonymize, false, never>; + /** + * The maximum limits that the signed migration could use. + * + * If not set, no signed submission is allowed. + */ + SignedMigrationMaxLimits: StorageDescriptor<[], Anonymize, true, never>; + }; + XcmPallet: { + /** + * The latest available query index. + */ + QueryCounter: StorageDescriptor<[], bigint, false, never>; + /** + * The ongoing queries. + */ + Queries: StorageDescriptor<[Key: bigint], XcmPalletQueryStatus, true, never>; + /** + * The existing asset traps. + * + * Key is the blake2 256 hash of (origin, versioned `Assets`) pair. Value is the number of + * times this pair has been trapped (usually just 1 if it exists at all). + */ + AssetTraps: StorageDescriptor<[Key: FixedSizeBinary<32>], number, false, never>; + /** + * Default version to encode XCM when latest version of destination is unknown. If `None`, + * then the destinations whose XCM version is unknown are considered unreachable. + */ + SafeXcmVersion: StorageDescriptor<[], number, true, never>; + /** + * The Latest versions that we know various locations support. + */ + SupportedVersion: StorageDescriptor, number, true, never>; + /** + * All locations that we have requested version notifications from. + */ + VersionNotifiers: StorageDescriptor, bigint, true, never>; + /** + * The target locations that are subscribed to our version changes, as well as the most recent + * of our versions we informed them of. + */ + VersionNotifyTargets: StorageDescriptor, Anonymize, true, never>; + /** + * Destinations whose latest XCM version we would like to know. Duplicates not allowed, and + * the `u32` counter is the number of times that a send to the destination has been attempted, + * which is used as a prioritization. + */ + VersionDiscoveryQueue: StorageDescriptor<[], Anonymize, false, never>; + /** + * The current migration's stage, if any. + */ + CurrentMigration: StorageDescriptor<[], XcmPalletVersionMigrationStage, true, never>; + /** + * Fungible assets which we know are locked on a remote chain. + */ + RemoteLockedFungibles: StorageDescriptor, Anonymize, true, never>; + /** + * Fungible assets which we know are locked on this chain. + */ + LockedFungibles: StorageDescriptor<[Key: SS58String], Anonymize, true, never>; + /** + * Global suspension state of the XCM executor. + */ + XcmExecutionSuspended: StorageDescriptor<[], boolean, false, never>; + /** + * Whether or not incoming XCMs (both executed locally and received) should be recorded. + * Only one XCM program will be recorded at a time. + * This is meant to be used in runtime APIs, and it's advised it stays false + * for all other use cases, so as to not degrade regular performance. + * + * Only relevant if this pallet is being used as the [`xcm_executor::traits::RecordXcm`] + * implementation in the XCM executor configuration. + */ + ShouldRecordXcm: StorageDescriptor<[], boolean, false, never>; + /** + * If [`ShouldRecordXcm`] is set to true, then the last XCM program executed locally + * will be stored here. + * Runtime APIs can fetch the XCM that was executed by accessing this value. + * + * Only relevant if this pallet is being used as the [`xcm_executor::traits::RecordXcm`] + * implementation in the XCM executor configuration. + */ + RecordedXcm: StorageDescriptor<[], Anonymize, true, never>; + }; + MessageQueue: { + /** + * The index of the first and last (non-empty) pages. + */ + BookStateFor: StorageDescriptor<[Key: ParachainsInclusionAggregateMessageOrigin], Anonymize, false, never>; + /** + * The origin at which we should begin servicing. + */ + ServiceHead: StorageDescriptor<[], ParachainsInclusionAggregateMessageOrigin, true, never>; + /** + * The map of page indices to pages. + */ + Pages: StorageDescriptor, Anonymize, true, never>; + }; + AssetRate: { + /** + * Maps an asset to its fixed point representation in the native balance. + * + * E.g. `native_amount = asset_amount * ConversionRateToNative::::get(asset_kind)` + */ + ConversionRateToNative: StorageDescriptor<[Key: VersionedLocatableAsset], bigint, true, never>; + }; + Beefy: { + /** + * The current authorities set + */ + Authorities: StorageDescriptor<[], Anonymize, false, never>; + /** + * The current validator set id + */ + ValidatorSetId: StorageDescriptor<[], bigint, false, never>; + /** + * Authorities set scheduled to be used with the next session + */ + NextAuthorities: StorageDescriptor<[], Anonymize, false, never>; + /** + * A mapping from BEEFY set ID to the index of the *most recent* session for which its + * members were responsible. + * + * This is only used for validating equivocation proofs. An equivocation proof must + * contains a key-ownership proof for a given session, therefore we need a way to tie + * together sessions and BEEFY set ids, i.e. we need to validate that a validator + * was the owner of a given key on a given session, and what the active set ID was + * during that session. + * + * TWOX-NOTE: `ValidatorSetId` is not under user control. + */ + SetIdSession: StorageDescriptor<[Key: bigint], number, true, never>; + /** + * Block number where BEEFY consensus is enabled/started. + * By changing this (through privileged `set_new_genesis()`), BEEFY consensus is effectively + * restarted from the newly set block number. + */ + GenesisBlock: StorageDescriptor<[], Anonymize, false, never>; + }; + Mmr: { + /** + * Latest MMR Root hash. + */ + RootHash: StorageDescriptor<[], FixedSizeBinary<32>, false, never>; + /** + * Current size of the MMR (number of leaves). + */ + NumberOfLeaves: StorageDescriptor<[], bigint, false, never>; + /** + * Hashes of the nodes in the MMR. + * + * Note this collection only contains MMR peaks, the inner nodes (and leaves) + * are pruned and only stored in the Offchain DB. + */ + Nodes: StorageDescriptor<[Key: bigint], FixedSizeBinary<32>, true, never>; + }; + BeefyMmrLeaf: { + /** + * Details of current BEEFY authority set. + */ + BeefyAuthorities: StorageDescriptor<[], Anonymize, false, never>; + /** + * Details of next BEEFY authority set. + * + * This storage entry is used as cache for calls to `update_beefy_next_authority_set`. + */ + BeefyNextAuthorities: StorageDescriptor<[], Anonymize, false, never>; + }; +}; +type ICalls = { + System: { + /** + *Make some on-chain remark. + * + *Can be executed by every `origin`. + */ + remark: TxDescriptor>; + /** + *Set the number of pages in the WebAssembly environment's heap. + */ + set_heap_pages: TxDescriptor>; + /** + *Set the new runtime code. + */ + set_code: TxDescriptor>; + /** + *Set the new runtime code without doing any checks of the given `code`. + * + *Note that runtime upgrades will not run if this is called with a not-increasing spec + *version! + */ + set_code_without_checks: TxDescriptor>; + /** + *Set some items of storage. + */ + set_storage: TxDescriptor>; + /** + *Kill some items from storage. + */ + kill_storage: TxDescriptor>; + /** + *Kill all storage items with a key that starts with the given prefix. + * + ***NOTE:** We rely on the Root origin to provide us the number of subkeys under + *the prefix we are removing to accurately calculate the weight of this function. + */ + kill_prefix: TxDescriptor>; + /** + *Make some on-chain remark and emit event. + */ + remark_with_event: TxDescriptor>; + /** + *Authorize an upgrade to a given `code_hash` for the runtime. The runtime can be supplied + *later. + * + *This call requires Root origin. + */ + authorize_upgrade: TxDescriptor>; + /** + *Authorize an upgrade to a given `code_hash` for the runtime. The runtime can be supplied + *later. + * + *WARNING: This authorizes an upgrade that will take place without any safety checks, for + *example that the spec name remains the same and that the version number increases. Not + *recommended for normal use. Use `authorize_upgrade` instead. + * + *This call requires Root origin. + */ + authorize_upgrade_without_checks: TxDescriptor>; + /** + *Provide the preimage (runtime binary) `code` for an upgrade that has been authorized. + * + *If the authorization required a version check, this call will ensure the spec name + *remains unchanged and that the spec version has increased. + * + *Depending on the runtime's `OnSetCode` configuration, this function may directly apply + *the new `code` in the same block or attempt to schedule the upgrade. + * + *All origins are allowed. + */ + apply_authorized_upgrade: TxDescriptor>; + }; + Scheduler: { + /** + *Anonymously schedule a task. + */ + schedule: TxDescriptor>; + /** + *Cancel an anonymously scheduled task. + */ + cancel: TxDescriptor>; + /** + *Schedule a named task. + */ + schedule_named: TxDescriptor>; + /** + *Cancel a named scheduled task. + */ + cancel_named: TxDescriptor>; + /** + *Anonymously schedule a task after a delay. + */ + schedule_after: TxDescriptor>; + /** + *Schedule a named task after a delay. + */ + schedule_named_after: TxDescriptor>; + /** + *Set a retry configuration for a task so that, in case its scheduled run fails, it will + *be retried after `period` blocks, for a total amount of `retries` retries or until it + *succeeds. + * + *Tasks which need to be scheduled for a retry are still subject to weight metering and + *agenda space, same as a regular task. If a periodic task fails, it will be scheduled + *normally while the task is retrying. + * + *Tasks scheduled as a result of a retry for a periodic task are unnamed, non-periodic + *clones of the original task. Their retry configuration will be derived from the + *original task's configuration, but will have a lower value for `remaining` than the + *original `total_retries`. + */ + set_retry: TxDescriptor>; + /** + *Set a retry configuration for a named task so that, in case its scheduled run fails, it + *will be retried after `period` blocks, for a total amount of `retries` retries or until + *it succeeds. + * + *Tasks which need to be scheduled for a retry are still subject to weight metering and + *agenda space, same as a regular task. If a periodic task fails, it will be scheduled + *normally while the task is retrying. + * + *Tasks scheduled as a result of a retry for a periodic task are unnamed, non-periodic + *clones of the original task. Their retry configuration will be derived from the + *original task's configuration, but will have a lower value for `remaining` than the + *original `total_retries`. + */ + set_retry_named: TxDescriptor>; + /** + *Removes the retry configuration of a task. + */ + cancel_retry: TxDescriptor>; + /** + *Cancel the retry configuration of a named task. + */ + cancel_retry_named: TxDescriptor>; + }; + Preimage: { + /** + *Register a preimage on-chain. + * + *If the preimage was previously requested, no fees or deposits are taken for providing + *the preimage. Otherwise, a deposit is taken proportional to the size of the preimage. + */ + note_preimage: TxDescriptor>; + /** + *Clear an unrequested preimage from the runtime storage. + * + *If `len` is provided, then it will be a much cheaper operation. + * + *- `hash`: The hash of the preimage to be removed from the store. + *- `len`: The length of the preimage of `hash`. + */ + unnote_preimage: TxDescriptor>; + /** + *Request a preimage be uploaded to the chain without paying any fees or deposits. + * + *If the preimage requests has already been provided on-chain, we unreserve any deposit + *a user may have paid, and take the control of the preimage out of their hands. + */ + request_preimage: TxDescriptor>; + /** + *Clear a previously made request for a preimage. + * + *NOTE: THIS MUST NOT BE CALLED ON `hash` MORE TIMES THAN `request_preimage`. + */ + unrequest_preimage: TxDescriptor>; + /** + *Ensure that the a bulk of pre-images is upgraded. + * + *The caller pays no fee if at least 90% of pre-images were successfully updated. + */ + ensure_updated: TxDescriptor>; + }; + Babe: { + /** + *Report authority equivocation/misbehavior. This method will verify + *the equivocation proof and validate the given key ownership proof + *against the extracted offender. If both are valid, the offence will + *be reported. + */ + report_equivocation: TxDescriptor>; + /** + *Report authority equivocation/misbehavior. This method will verify + *the equivocation proof and validate the given key ownership proof + *against the extracted offender. If both are valid, the offence will + *be reported. + *This extrinsic must be called unsigned and it is expected that only + *block authors will call it (validated in `ValidateUnsigned`), as such + *if the block author is defined it will be defined as the equivocation + *reporter. + */ + report_equivocation_unsigned: TxDescriptor>; + /** + *Plan an epoch config change. The epoch config change is recorded and will be enacted on + *the next call to `enact_epoch_change`. The config will be activated one epoch after. + *Multiple calls to this method will replace any existing planned config change that had + *not been enacted yet. + */ + plan_config_change: TxDescriptor>; + }; + Timestamp: { + /** + *Set the current time. + * + *This call should be invoked exactly once per block. It will panic at the finalization + *phase, if this call hasn't been invoked by that time. + * + *The timestamp should be greater than the previous one by the amount specified by + *[`Config::MinimumPeriod`]. + * + *The dispatch origin for this call must be _None_. + * + *This dispatch class is _Mandatory_ to ensure it gets executed in the block. Be aware + *that changing the complexity of this call could result exhausting the resources in a + *block to execute any other calls. + * + *## Complexity + *- `O(1)` (Note that implementations of `OnTimestampSet` must also be `O(1)`) + *- 1 storage read and 1 storage mutation (codec `O(1)` because of `DidUpdate::take` in + * `on_finalize`) + *- 1 event handler `on_timestamp_set`. Must be `O(1)`. + */ + set: TxDescriptor>; + }; + Indices: { + /** + *Assign an previously unassigned index. + * + *Payment: `Deposit` is reserved from the sender account. + * + *The dispatch origin for this call must be _Signed_. + * + *- `index`: the index to be claimed. This must not be in use. + * + *Emits `IndexAssigned` if successful. + * + *## Complexity + *- `O(1)`. + */ + claim: TxDescriptor>; + /** + *Assign an index already owned by the sender to another account. The balance reservation + *is effectively transferred to the new account. + * + *The dispatch origin for this call must be _Signed_. + * + *- `index`: the index to be re-assigned. This must be owned by the sender. + *- `new`: the new owner of the index. This function is a no-op if it is equal to sender. + * + *Emits `IndexAssigned` if successful. + * + *## Complexity + *- `O(1)`. + */ + transfer: TxDescriptor>; + /** + *Free up an index owned by the sender. + * + *Payment: Any previous deposit placed for the index is unreserved in the sender account. + * + *The dispatch origin for this call must be _Signed_ and the sender must own the index. + * + *- `index`: the index to be freed. This must be owned by the sender. + * + *Emits `IndexFreed` if successful. + * + *## Complexity + *- `O(1)`. + */ + free: TxDescriptor>; + /** + *Force an index to an account. This doesn't require a deposit. If the index is already + *held, then any deposit is reimbursed to its current owner. + * + *The dispatch origin for this call must be _Root_. + * + *- `index`: the index to be (re-)assigned. + *- `new`: the new owner of the index. This function is a no-op if it is equal to sender. + *- `freeze`: if set to `true`, will freeze the index so it cannot be transferred. + * + *Emits `IndexAssigned` if successful. + * + *## Complexity + *- `O(1)`. + */ + force_transfer: TxDescriptor>; + /** + *Freeze an index so it will always point to the sender account. This consumes the + *deposit. + * + *The dispatch origin for this call must be _Signed_ and the signing account must have a + *non-frozen account `index`. + * + *- `index`: the index to be frozen in place. + * + *Emits `IndexFrozen` if successful. + * + *## Complexity + *- `O(1)`. + */ + freeze: TxDescriptor>; + }; + Balances: { + /** + *Transfer some liquid free balance to another account. + * + *`transfer_allow_death` will set the `FreeBalance` of the sender and receiver. + *If the sender's account is below the existential deposit as a result + *of the transfer, the account will be reaped. + * + *The dispatch origin for this call must be `Signed` by the transactor. + */ + transfer_allow_death: TxDescriptor>; + /** + *Exactly as `transfer_allow_death`, except the origin must be root and the source account + *may be specified. + */ + force_transfer: TxDescriptor>; + /** + *Same as the [`transfer_allow_death`] call, but with a check that the transfer will not + *kill the origin account. + * + *99% of the time you want [`transfer_allow_death`] instead. + * + *[`transfer_allow_death`]: struct.Pallet.html#method.transfer + */ + transfer_keep_alive: TxDescriptor>; + /** + *Transfer the entire transferable balance from the caller account. + * + *NOTE: This function only attempts to transfer _transferable_ balances. This means that + *any locked, reserved, or existential deposits (when `keep_alive` is `true`), will not be + *transferred by this function. To ensure that this function results in a killed account, + *you might need to prepare the account by removing any reference counters, storage + *deposits, etc... + * + *The dispatch origin of this call must be Signed. + * + *- `dest`: The recipient of the transfer. + *- `keep_alive`: A boolean to determine if the `transfer_all` operation should send all + * of the funds the account has, causing the sender account to be killed (false), or + * transfer everything except at least the existential deposit, which will guarantee to + * keep the sender account alive (true). + */ + transfer_all: TxDescriptor>; + /** + *Unreserve some balance from a user by force. + * + *Can only be called by ROOT. + */ + force_unreserve: TxDescriptor>; + /** + *Upgrade a specified account. + * + *- `origin`: Must be `Signed`. + *- `who`: The account to be upgraded. + * + *This will waive the transaction fee if at least all but 10% of the accounts needed to + *be upgraded. (We let some not have to be upgraded just in order to allow for the + *possibility of churn). + */ + upgrade_accounts: TxDescriptor>; + /** + *Set the regular balance of a given account. + * + *The dispatch origin for this call is `root`. + */ + force_set_balance: TxDescriptor>; + /** + *Adjust the total issuance in a saturating way. + * + *Can only be called by root and always needs a positive `delta`. + * + *# Example + */ + force_adjust_total_issuance: TxDescriptor>; + /** + *Burn the specified liquid free balance from the origin account. + * + *If the origin's account ends up below the existential deposit as a result + *of the burn and `keep_alive` is false, the account will be reaped. + * + *Unlike sending funds to a _burn_ address, which merely makes the funds inaccessible, + *this `burn` operation will reduce total issuance by the amount _burned_. + */ + burn: TxDescriptor>; + }; + Staking: { + /** + *Take the origin account as a stash and lock up `value` of its balance. `controller` will + *be the account that controls it. + * + *`value` must be more than the `minimum_balance` specified by `T::Currency`. + * + *The dispatch origin for this call must be _Signed_ by the stash account. + * + *Emits `Bonded`. + *## Complexity + *- Independent of the arguments. Moderate complexity. + *- O(1). + *- Three extra DB entries. + * + *NOTE: Two of the storage writes (`Self::bonded`, `Self::payee`) are _never_ cleaned + *unless the `origin` falls below _existential deposit_ (or equal to 0) and gets removed + *as dust. + */ + bond: TxDescriptor>; + /** + *Add some extra amount that have appeared in the stash `free_balance` into the balance up + *for staking. + * + *The dispatch origin for this call must be _Signed_ by the stash, not the controller. + * + *Use this if there are additional funds in your stash account that you wish to bond. + *Unlike [`bond`](Self::bond) or [`unbond`](Self::unbond) this function does not impose + *any limitation on the amount that can be added. + * + *Emits `Bonded`. + * + *## Complexity + *- Independent of the arguments. Insignificant complexity. + *- O(1). + */ + bond_extra: TxDescriptor>; + /** + *Schedule a portion of the stash to be unlocked ready for transfer out after the bond + *period ends. If this leaves an amount actively bonded less than + *T::Currency::minimum_balance(), then it is increased to the full amount. + * + *The dispatch origin for this call must be _Signed_ by the controller, not the stash. + * + *Once the unlock period is done, you can call `withdraw_unbonded` to actually move + *the funds out of management ready for transfer. + * + *No more than a limited number of unlocking chunks (see `MaxUnlockingChunks`) + *can co-exists at the same time. If there are no unlocking chunks slots available + *[`Call::withdraw_unbonded`] is called to remove some of the chunks (if possible). + * + *If a user encounters the `InsufficientBond` error when calling this extrinsic, + *they should call `chill` first in order to free up their bonded funds. + * + *Emits `Unbonded`. + * + *See also [`Call::withdraw_unbonded`]. + */ + unbond: TxDescriptor>; + /** + *Remove any unlocked chunks from the `unlocking` queue from our management. + * + *This essentially frees up that balance to be used by the stash account to do whatever + *it wants. + * + *The dispatch origin for this call must be _Signed_ by the controller. + * + *Emits `Withdrawn`. + * + *See also [`Call::unbond`]. + * + *## Parameters + * + *- `num_slashing_spans` indicates the number of metadata slashing spans to clear when + *this call results in a complete removal of all the data related to the stash account. + *In this case, the `num_slashing_spans` must be larger or equal to the number of + *slashing spans associated with the stash account in the [`SlashingSpans`] storage type, + *otherwise the call will fail. The call weight is directly proportional to + *`num_slashing_spans`. + * + *## Complexity + *O(S) where S is the number of slashing spans to remove + *NOTE: Weight annotation is the kill scenario, we refund otherwise. + */ + withdraw_unbonded: TxDescriptor>; + /** + *Declare the desire to validate for the origin controller. + * + *Effects will be felt at the beginning of the next era. + * + *The dispatch origin for this call must be _Signed_ by the controller, not the stash. + */ + validate: TxDescriptor>; + /** + *Declare the desire to nominate `targets` for the origin controller. + * + *Effects will be felt at the beginning of the next era. + * + *The dispatch origin for this call must be _Signed_ by the controller, not the stash. + * + *## Complexity + *- The transaction's complexity is proportional to the size of `targets` (N) + *which is capped at CompactAssignments::LIMIT (T::MaxNominations). + *- Both the reads and writes follow a similar pattern. + */ + nominate: TxDescriptor>; + /** + *Declare no desire to either validate or nominate. + * + *Effects will be felt at the beginning of the next era. + * + *The dispatch origin for this call must be _Signed_ by the controller, not the stash. + * + *## Complexity + *- Independent of the arguments. Insignificant complexity. + *- Contains one read. + *- Writes are limited to the `origin` account key. + */ + chill: TxDescriptor; + /** + *(Re-)set the payment target for a controller. + * + *Effects will be felt instantly (as soon as this function is completed successfully). + * + *The dispatch origin for this call must be _Signed_ by the controller, not the stash. + * + *## Complexity + *- O(1) + *- Independent of the arguments. Insignificant complexity. + *- Contains a limited number of reads. + *- Writes are limited to the `origin` account key. + *--------- + */ + set_payee: TxDescriptor>; + /** + *(Re-)sets the controller of a stash to the stash itself. This function previously + *accepted a `controller` argument to set the controller to an account other than the + *stash itself. This functionality has now been removed, now only setting the controller + *to the stash, if it is not already. + * + *Effects will be felt instantly (as soon as this function is completed successfully). + * + *The dispatch origin for this call must be _Signed_ by the stash, not the controller. + * + *## Complexity + *O(1) + *- Independent of the arguments. Insignificant complexity. + *- Contains a limited number of reads. + *- Writes are limited to the `origin` account key. + */ + set_controller: TxDescriptor; + /** + *Sets the ideal number of validators. + * + *The dispatch origin must be Root. + * + *## Complexity + *O(1) + */ + set_validator_count: TxDescriptor>; + /** + *Increments the ideal number of validators up to maximum of + *`ElectionProviderBase::MaxWinners`. + * + *The dispatch origin must be Root. + * + *## Complexity + *Same as [`Self::set_validator_count`]. + */ + increase_validator_count: TxDescriptor>; + /** + *Scale up the ideal number of validators by a factor up to maximum of + *`ElectionProviderBase::MaxWinners`. + * + *The dispatch origin must be Root. + * + *## Complexity + *Same as [`Self::set_validator_count`]. + */ + scale_validator_count: TxDescriptor>; + /** + *Force there to be no new eras indefinitely. + * + *The dispatch origin must be Root. + * + *# Warning + * + *The election process starts multiple blocks before the end of the era. + *Thus the election process may be ongoing when this is called. In this case the + *election will continue until the next era is triggered. + * + *## Complexity + *- No arguments. + *- Weight: O(1) + */ + force_no_eras: TxDescriptor; + /** + *Force there to be a new era at the end of the next session. After this, it will be + *reset to normal (non-forced) behaviour. + * + *The dispatch origin must be Root. + * + *# Warning + * + *The election process starts multiple blocks before the end of the era. + *If this is called just before a new era is triggered, the election process may not + *have enough blocks to get a result. + * + *## Complexity + *- No arguments. + *- Weight: O(1) + */ + force_new_era: TxDescriptor; + /** + *Set the validators who cannot be slashed (if any). + * + *The dispatch origin must be Root. + */ + set_invulnerables: TxDescriptor>; + /** + *Force a current staker to become completely unstaked, immediately. + * + *The dispatch origin must be Root. + * + *## Parameters + * + *- `num_slashing_spans`: Refer to comments on [`Call::withdraw_unbonded`] for more + *details. + */ + force_unstake: TxDescriptor>; + /** + *Force there to be a new era at the end of sessions indefinitely. + * + *The dispatch origin must be Root. + * + *# Warning + * + *The election process starts multiple blocks before the end of the era. + *If this is called just before a new era is triggered, the election process may not + *have enough blocks to get a result. + */ + force_new_era_always: TxDescriptor; + /** + *Cancel enactment of a deferred slash. + * + *Can be called by the `T::AdminOrigin`. + * + *Parameters: era and indices of the slashes for that era to kill. + */ + cancel_deferred_slash: TxDescriptor>; + /** + *Pay out next page of the stakers behind a validator for the given era. + * + *- `validator_stash` is the stash account of the validator. + *- `era` may be any era between `[current_era - history_depth; current_era]`. + * + *The origin of this call must be _Signed_. Any account can call this function, even if + *it is not one of the stakers. + * + *The reward payout could be paged in case there are too many nominators backing the + *`validator_stash`. This call will payout unpaid pages in an ascending order. To claim a + *specific page, use `payout_stakers_by_page`.` + * + *If all pages are claimed, it returns an error `InvalidPage`. + */ + payout_stakers: TxDescriptor>; + /** + *Rebond a portion of the stash scheduled to be unlocked. + * + *The dispatch origin must be signed by the controller. + * + *## Complexity + *- Time complexity: O(L), where L is unlocking chunks + *- Bounded by `MaxUnlockingChunks`. + */ + rebond: TxDescriptor>; + /** + *Remove all data structures concerning a staker/stash once it is at a state where it can + *be considered `dust` in the staking system. The requirements are: + * + *1. the `total_balance` of the stash is below existential deposit. + *2. or, the `ledger.total` of the stash is below existential deposit. + *3. or, existential deposit is zero and either `total_balance` or `ledger.total` is zero. + * + *The former can happen in cases like a slash; the latter when a fully unbonded account + *is still receiving staking rewards in `RewardDestination::Staked`. + * + *It can be called by anyone, as long as `stash` meets the above requirements. + * + *Refunds the transaction fees upon successful execution. + * + *## Parameters + * + *- `num_slashing_spans`: Refer to comments on [`Call::withdraw_unbonded`] for more + *details. + */ + reap_stash: TxDescriptor>; + /** + *Remove the given nominations from the calling validator. + * + *Effects will be felt at the beginning of the next era. + * + *The dispatch origin for this call must be _Signed_ by the controller, not the stash. + * + *- `who`: A list of nominator stash accounts who are nominating this validator which + * should no longer be nominating this validator. + * + *Note: Making this call only makes sense if you first set the validator preferences to + *block any further nominations. + */ + kick: TxDescriptor>; + /** + *Update the various staking configurations . + * + ** `min_nominator_bond`: The minimum active bond needed to be a nominator. + ** `min_validator_bond`: The minimum active bond needed to be a validator. + ** `max_nominator_count`: The max number of users who can be a nominator at once. When + * set to `None`, no limit is enforced. + ** `max_validator_count`: The max number of users who can be a validator at once. When + * set to `None`, no limit is enforced. + ** `chill_threshold`: The ratio of `max_nominator_count` or `max_validator_count` which + * should be filled in order for the `chill_other` transaction to work. + ** `min_commission`: The minimum amount of commission that each validators must maintain. + * This is checked only upon calling `validate`. Existing validators are not affected. + * + *RuntimeOrigin must be Root to call this function. + * + *NOTE: Existing nominators and validators will not be affected by this update. + *to kick people under the new limits, `chill_other` should be called. + */ + set_staking_configs: TxDescriptor>; + /** + *Declare a `controller` to stop participating as either a validator or nominator. + * + *Effects will be felt at the beginning of the next era. + * + *The dispatch origin for this call must be _Signed_, but can be called by anyone. + * + *If the caller is the same as the controller being targeted, then no further checks are + *enforced, and this function behaves just like `chill`. + * + *If the caller is different than the controller being targeted, the following conditions + *must be met: + * + ** `controller` must belong to a nominator who has become non-decodable, + * + *Or: + * + ** A `ChillThreshold` must be set and checked which defines how close to the max + * nominators or validators we must reach before users can start chilling one-another. + ** A `MaxNominatorCount` and `MaxValidatorCount` must be set which is used to determine + * how close we are to the threshold. + ** A `MinNominatorBond` and `MinValidatorBond` must be set and checked, which determines + * if this is a person that should be chilled because they have not met the threshold + * bond required. + * + *This can be helpful if bond requirements are updated, and we need to remove old users + *who do not satisfy these requirements. + */ + chill_other: TxDescriptor>; + /** + *Force a validator to have at least the minimum commission. This will not affect a + *validator who already has a commission greater than or equal to the minimum. Any account + *can call this. + */ + force_apply_min_commission: TxDescriptor>; + /** + *Sets the minimum amount of commission that each validators must maintain. + * + *This call has lower privilege requirements than `set_staking_config` and can be called + *by the `T::AdminOrigin`. Root can always call this. + */ + set_min_commission: TxDescriptor>; + /** + *Pay out a page of the stakers behind a validator for the given era and page. + * + *- `validator_stash` is the stash account of the validator. + *- `era` may be any era between `[current_era - history_depth; current_era]`. + *- `page` is the page index of nominators to pay out with value between 0 and + * `num_nominators / T::MaxExposurePageSize`. + * + *The origin of this call must be _Signed_. Any account can call this function, even if + *it is not one of the stakers. + * + *If a validator has more than [`Config::MaxExposurePageSize`] nominators backing + *them, then the list of nominators is paged, with each page being capped at + *[`Config::MaxExposurePageSize`.] If a validator has more than one page of nominators, + *the call needs to be made for each page separately in order for all the nominators + *backing a validator to receive the reward. The nominators are not sorted across pages + *and so it should not be assumed the highest staker would be on the topmost page and vice + *versa. If rewards are not claimed in [`Config::HistoryDepth`] eras, they are lost. + */ + payout_stakers_by_page: TxDescriptor>; + /** + *Migrates an account's `RewardDestination::Controller` to + *`RewardDestination::Account(controller)`. + * + *Effects will be felt instantly (as soon as this function is completed successfully). + * + *This will waive the transaction fee if the `payee` is successfully migrated. + */ + update_payee: TxDescriptor>; + /** + *Updates a batch of controller accounts to their corresponding stash account if they are + *not the same. Ignores any controller accounts that do not exist, and does not operate if + *the stash and controller are already the same. + * + *Effects will be felt instantly (as soon as this function is completed successfully). + * + *The dispatch origin must be `T::AdminOrigin`. + */ + deprecate_controller_batch: TxDescriptor>; + /** + *Restores the state of a ledger which is in an inconsistent state. + * + *The requirements to restore a ledger are the following: + ** The stash is bonded; or + ** The stash is not bonded but it has a staking lock left behind; or + ** If the stash has an associated ledger and its state is inconsistent; or + ** If the ledger is not corrupted *but* its staking lock is out of sync. + * + *The `maybe_*` input parameters will overwrite the corresponding data and metadata of the + *ledger associated with the stash. If the input parameters are not set, the ledger will + *be reset values from on-chain state. + */ + restore_ledger: TxDescriptor>; + }; + Session: { + /** + *Sets the session key(s) of the function caller to `keys`. + *Allows an account to set its session key prior to becoming a validator. + *This doesn't take effect until the next session. + * + *The dispatch origin of this function must be signed. + * + *## Complexity + *- `O(1)`. Actual cost depends on the number of length of `T::Keys::key_ids()` which is + * fixed. + */ + set_keys: TxDescriptor>; + /** + *Removes any session key(s) of the function caller. + * + *This doesn't take effect until the next session. + * + *The dispatch origin of this function must be Signed and the account must be either be + *convertible to a validator ID using the chain's typical addressing system (this usually + *means being a controller account) or directly convertible into a validator ID (which + *usually means being a stash account). + * + *## Complexity + *- `O(1)` in number of key types. Actual cost depends on the number of length of + * `T::Keys::key_ids()` which is fixed. + */ + purge_keys: TxDescriptor; + }; + Grandpa: { + /** + *Report voter equivocation/misbehavior. This method will verify the + *equivocation proof and validate the given key ownership proof + *against the extracted offender. If both are valid, the offence + *will be reported. + */ + report_equivocation: TxDescriptor>; + /** + *Report voter equivocation/misbehavior. This method will verify the + *equivocation proof and validate the given key ownership proof + *against the extracted offender. If both are valid, the offence + *will be reported. + * + *This extrinsic must be called unsigned and it is expected that only + *block authors will call it (validated in `ValidateUnsigned`), as such + *if the block author is defined it will be defined as the equivocation + *reporter. + */ + report_equivocation_unsigned: TxDescriptor>; + /** + *Note that the current authority set of the GRANDPA finality gadget has stalled. + * + *This will trigger a forced authority set change at the beginning of the next session, to + *be enacted `delay` blocks after that. The `delay` should be high enough to safely assume + *that the block signalling the forced change will not be re-orged e.g. 1000 blocks. + *The block production rate (which may be slowed down because of finality lagging) should + *be taken into account when choosing the `delay`. The GRANDPA voters based on the new + *authority will start voting on top of `best_finalized_block_number` for new finalized + *blocks. `best_finalized_block_number` should be the highest of the latest finalized + *block of all validators of the new authority set. + * + *Only callable by root. + */ + note_stalled: TxDescriptor>; + }; + Treasury: { + /** + *Propose and approve a spend of treasury funds. + * + *## Dispatch Origin + * + *Must be [`Config::SpendOrigin`] with the `Success` value being at least `amount`. + * + *### Details + *NOTE: For record-keeping purposes, the proposer is deemed to be equivalent to the + *beneficiary. + * + *### Parameters + *- `amount`: The amount to be transferred from the treasury to the `beneficiary`. + *- `beneficiary`: The destination account for the transfer. + * + *## Events + * + *Emits [`Event::SpendApproved`] if successful. + */ + spend_local: TxDescriptor>; + /** + *Force a previously approved proposal to be removed from the approval queue. + * + *## Dispatch Origin + * + *Must be [`Config::RejectOrigin`]. + * + *## Details + * + *The original deposit will no longer be returned. + * + *### Parameters + *- `proposal_id`: The index of a proposal + * + *### Complexity + *- O(A) where `A` is the number of approvals + * + *### Errors + *- [`Error::ProposalNotApproved`]: The `proposal_id` supplied was not found in the + * approval queue, i.e., the proposal has not been approved. This could also mean the + * proposal does not exist altogether, thus there is no way it would have been approved + * in the first place. + */ + remove_approval: TxDescriptor>; + /** + *Propose and approve a spend of treasury funds. + * + *## Dispatch Origin + * + *Must be [`Config::SpendOrigin`] with the `Success` value being at least + *`amount` of `asset_kind` in the native asset. The amount of `asset_kind` is converted + *for assertion using the [`Config::BalanceConverter`]. + * + *## Details + * + *Create an approved spend for transferring a specific `amount` of `asset_kind` to a + *designated beneficiary. The spend must be claimed using the `payout` dispatchable within + *the [`Config::PayoutPeriod`]. + * + *### Parameters + *- `asset_kind`: An indicator of the specific asset class to be spent. + *- `amount`: The amount to be transferred from the treasury to the `beneficiary`. + *- `beneficiary`: The beneficiary of the spend. + *- `valid_from`: The block number from which the spend can be claimed. It can refer to + * the past if the resulting spend has not yet expired according to the + * [`Config::PayoutPeriod`]. If `None`, the spend can be claimed immediately after + * approval. + * + *## Events + * + *Emits [`Event::AssetSpendApproved`] if successful. + */ + spend: TxDescriptor>; + /** + *Claim a spend. + * + *## Dispatch Origin + * + *Must be signed + * + *## Details + * + *Spends must be claimed within some temporal bounds. A spend may be claimed within one + *[`Config::PayoutPeriod`] from the `valid_from` block. + *In case of a payout failure, the spend status must be updated with the `check_status` + *dispatchable before retrying with the current function. + * + *### Parameters + *- `index`: The spend index. + * + *## Events + * + *Emits [`Event::Paid`] if successful. + */ + payout: TxDescriptor>; + /** + *Check the status of the spend and remove it from the storage if processed. + * + *## Dispatch Origin + * + *Must be signed. + * + *## Details + * + *The status check is a prerequisite for retrying a failed payout. + *If a spend has either succeeded or expired, it is removed from the storage by this + *function. In such instances, transaction fees are refunded. + * + *### Parameters + *- `index`: The spend index. + * + *## Events + * + *Emits [`Event::PaymentFailed`] if the spend payout has failed. + *Emits [`Event::SpendProcessed`] if the spend payout has succeed. + */ + check_status: TxDescriptor>; + /** + *Void previously approved spend. + * + *## Dispatch Origin + * + *Must be [`Config::RejectOrigin`]. + * + *## Details + * + *A spend void is only possible if the payout has not been attempted yet. + * + *### Parameters + *- `index`: The spend index. + * + *## Events + * + *Emits [`Event::AssetSpendVoided`] if successful. + */ + void_spend: TxDescriptor>; + }; + ConvictionVoting: { + /** + *Vote in a poll. If `vote.is_aye()`, the vote is to enact the proposal; + *otherwise it is a vote to keep the status quo. + * + *The dispatch origin of this call must be _Signed_. + * + *- `poll_index`: The index of the poll to vote for. + *- `vote`: The vote configuration. + * + *Weight: `O(R)` where R is the number of polls the voter has voted on. + */ + vote: TxDescriptor>; + /** + *Delegate the voting power (with some given conviction) of the sending account for a + *particular class of polls. + * + *The balance delegated is locked for as long as it's delegated, and thereafter for the + *time appropriate for the conviction's lock period. + * + *The dispatch origin of this call must be _Signed_, and the signing account must either: + * - be delegating already; or + * - have no voting activity (if there is, then it will need to be removed through + * `remove_vote`). + * + *- `to`: The account whose voting the `target` account's voting power will follow. + *- `class`: The class of polls to delegate. To delegate multiple classes, multiple calls + * to this function are required. + *- `conviction`: The conviction that will be attached to the delegated votes. When the + * account is undelegated, the funds will be locked for the corresponding period. + *- `balance`: The amount of the account's balance to be used in delegating. This must not + * be more than the account's current balance. + * + *Emits `Delegated`. + * + *Weight: `O(R)` where R is the number of polls the voter delegating to has + * voted on. Weight is initially charged as if maximum votes, but is refunded later. + */ + delegate: TxDescriptor>; + /** + *Undelegate the voting power of the sending account for a particular class of polls. + * + *Tokens may be unlocked following once an amount of time consistent with the lock period + *of the conviction with which the delegation was issued has passed. + * + *The dispatch origin of this call must be _Signed_ and the signing account must be + *currently delegating. + * + *- `class`: The class of polls to remove the delegation from. + * + *Emits `Undelegated`. + * + *Weight: `O(R)` where R is the number of polls the voter delegating to has + * voted on. Weight is initially charged as if maximum votes, but is refunded later. + */ + undelegate: TxDescriptor>; + /** + *Remove the lock caused by prior voting/delegating which has expired within a particular + *class. + * + *The dispatch origin of this call must be _Signed_. + * + *- `class`: The class of polls to unlock. + *- `target`: The account to remove the lock on. + * + *Weight: `O(R)` with R number of vote of target. + */ + unlock: TxDescriptor>; + /** + *Remove a vote for a poll. + * + *If: + *- the poll was cancelled, or + *- the poll is ongoing, or + *- the poll has ended such that + * - the vote of the account was in opposition to the result; or + * - there was no conviction to the account's vote; or + * - the account made a split vote + *...then the vote is removed cleanly and a following call to `unlock` may result in more + *funds being available. + * + *If, however, the poll has ended and: + *- it finished corresponding to the vote of the account, and + *- the account made a standard vote with conviction, and + *- the lock period of the conviction is not over + *...then the lock will be aggregated into the overall account's lock, which may involve + **overlocking* (where the two locks are combined into a single lock that is the maximum + *of both the amount locked and the time is it locked for). + * + *The dispatch origin of this call must be _Signed_, and the signer must have a vote + *registered for poll `index`. + * + *- `index`: The index of poll of the vote to be removed. + *- `class`: Optional parameter, if given it indicates the class of the poll. For polls + * which have finished or are cancelled, this must be `Some`. + * + *Weight: `O(R + log R)` where R is the number of polls that `target` has voted on. + * Weight is calculated for the maximum number of vote. + */ + remove_vote: TxDescriptor>; + /** + *Remove a vote for a poll. + * + *If the `target` is equal to the signer, then this function is exactly equivalent to + *`remove_vote`. If not equal to the signer, then the vote must have expired, + *either because the poll was cancelled, because the voter lost the poll or + *because the conviction period is over. + * + *The dispatch origin of this call must be _Signed_. + * + *- `target`: The account of the vote to be removed; this account must have voted for poll + * `index`. + *- `index`: The index of poll of the vote to be removed. + *- `class`: The class of the poll. + * + *Weight: `O(R + log R)` where R is the number of polls that `target` has voted on. + * Weight is calculated for the maximum number of vote. + */ + remove_other_vote: TxDescriptor>; + }; + Referenda: { + /** + *Propose a referendum on a privileged action. + * + *- `origin`: must be `SubmitOrigin` and the account must have `SubmissionDeposit` funds + * available. + *- `proposal_origin`: The origin from which the proposal should be executed. + *- `proposal`: The proposal. + *- `enactment_moment`: The moment that the proposal should be enacted. + * + *Emits `Submitted`. + */ + submit: TxDescriptor>; + /** + *Post the Decision Deposit for a referendum. + * + *- `origin`: must be `Signed` and the account must have funds available for the + * referendum's track's Decision Deposit. + *- `index`: The index of the submitted referendum whose Decision Deposit is yet to be + * posted. + * + *Emits `DecisionDepositPlaced`. + */ + place_decision_deposit: TxDescriptor>; + /** + *Refund the Decision Deposit for a closed referendum back to the depositor. + * + *- `origin`: must be `Signed` or `Root`. + *- `index`: The index of a closed referendum whose Decision Deposit has not yet been + * refunded. + * + *Emits `DecisionDepositRefunded`. + */ + refund_decision_deposit: TxDescriptor>; + /** + *Cancel an ongoing referendum. + * + *- `origin`: must be the `CancelOrigin`. + *- `index`: The index of the referendum to be cancelled. + * + *Emits `Cancelled`. + */ + cancel: TxDescriptor>; + /** + *Cancel an ongoing referendum and slash the deposits. + * + *- `origin`: must be the `KillOrigin`. + *- `index`: The index of the referendum to be cancelled. + * + *Emits `Killed` and `DepositSlashed`. + */ + kill: TxDescriptor>; + /** + *Advance a referendum onto its next logical state. Only used internally. + * + *- `origin`: must be `Root`. + *- `index`: the referendum to be advanced. + */ + nudge_referendum: TxDescriptor>; + /** + *Advance a track onto its next logical state. Only used internally. + * + *- `origin`: must be `Root`. + *- `track`: the track to be advanced. + * + *Action item for when there is now one fewer referendum in the deciding phase and the + *`DecidingCount` is not yet updated. This means that we should either: + *- begin deciding another referendum (and leave `DecidingCount` alone); or + *- decrement `DecidingCount`. + */ + one_fewer_deciding: TxDescriptor>; + /** + *Refund the Submission Deposit for a closed referendum back to the depositor. + * + *- `origin`: must be `Signed` or `Root`. + *- `index`: The index of a closed referendum whose Submission Deposit has not yet been + * refunded. + * + *Emits `SubmissionDepositRefunded`. + */ + refund_submission_deposit: TxDescriptor>; + /** + *Set or clear metadata of a referendum. + * + *Parameters: + *- `origin`: Must be `Signed` by a creator of a referendum or by anyone to clear a + * metadata of a finished referendum. + *- `index`: The index of a referendum to set or clear metadata for. + *- `maybe_hash`: The hash of an on-chain stored preimage. `None` to clear a metadata. + */ + set_metadata: TxDescriptor>; + }; + Whitelist: { + /** + + */ + whitelist_call: TxDescriptor>; + /** + + */ + remove_whitelisted_call: TxDescriptor>; + /** + + */ + dispatch_whitelisted_call: TxDescriptor>; + /** + + */ + dispatch_whitelisted_call_with_preimage: TxDescriptor>; + }; + Parameters: { + /** + *Set the value of a parameter. + * + *The dispatch origin of this call must be `AdminOrigin` for the given `key`. Values be + *deleted by setting them to `None`. + */ + set_parameter: TxDescriptor>; + }; + Claims: { + /** + *Make a claim to collect your DOTs. + * + *The dispatch origin for this call must be _None_. + * + *Unsigned Validation: + *A call to claim is deemed valid if the signature provided matches + *the expected signed message of: + * + *> Ethereum Signed Message: + *> (configured prefix string)(address) + * + *and `address` matches the `dest` account. + * + *Parameters: + *- `dest`: The destination account to payout the claim. + *- `ethereum_signature`: The signature of an ethereum signed message matching the format + * described above. + * + * + *The weight of this call is invariant over the input parameters. + *Weight includes logic to validate unsigned `claim` call. + * + *Total Complexity: O(1) + * + */ + claim: TxDescriptor>; + /** + *Mint a new claim to collect DOTs. + * + *The dispatch origin for this call must be _Root_. + * + *Parameters: + *- `who`: The Ethereum address allowed to collect this claim. + *- `value`: The number of DOTs that will be claimed. + *- `vesting_schedule`: An optional vesting schedule for these DOTs. + * + * + *The weight of this call is invariant over the input parameters. + *We assume worst case that both vesting and statement is being inserted. + * + *Total Complexity: O(1) + * + */ + mint_claim: TxDescriptor>; + /** + *Make a claim to collect your DOTs by signing a statement. + * + *The dispatch origin for this call must be _None_. + * + *Unsigned Validation: + *A call to `claim_attest` is deemed valid if the signature provided matches + *the expected signed message of: + * + *> Ethereum Signed Message: + *> (configured prefix string)(address)(statement) + * + *and `address` matches the `dest` account; the `statement` must match that which is + *expected according to your purchase arrangement. + * + *Parameters: + *- `dest`: The destination account to payout the claim. + *- `ethereum_signature`: The signature of an ethereum signed message matching the format + * described above. + *- `statement`: The identity of the statement which is being attested to in the + * signature. + * + * + *The weight of this call is invariant over the input parameters. + *Weight includes logic to validate unsigned `claim_attest` call. + * + *Total Complexity: O(1) + * + */ + claim_attest: TxDescriptor>; + /** + *Attest to a statement, needed to finalize the claims process. + * + *WARNING: Insecure unless your chain includes `PrevalidateAttests` as a + *`SignedExtension`. + * + *Unsigned Validation: + *A call to attest is deemed valid if the sender has a `Preclaim` registered + *and provides a `statement` which is expected for the account. + * + *Parameters: + *- `statement`: The identity of the statement which is being attested to in the + * signature. + * + * + *The weight of this call is invariant over the input parameters. + *Weight includes logic to do pre-validation on `attest` call. + * + *Total Complexity: O(1) + * + */ + attest: TxDescriptor>; + /** + + */ + move_claim: TxDescriptor>; + }; + Vesting: { + /** + *Unlock any vested funds of the sender account. + * + *The dispatch origin for this call must be _Signed_ and the sender must have funds still + *locked under this pallet. + * + *Emits either `VestingCompleted` or `VestingUpdated`. + * + *## Complexity + *- `O(1)`. + */ + vest: TxDescriptor; + /** + *Unlock any vested funds of a `target` account. + * + *The dispatch origin for this call must be _Signed_. + * + *- `target`: The account whose vested funds should be unlocked. Must have funds still + *locked under this pallet. + * + *Emits either `VestingCompleted` or `VestingUpdated`. + * + *## Complexity + *- `O(1)`. + */ + vest_other: TxDescriptor>; + /** + *Create a vested transfer. + * + *The dispatch origin for this call must be _Signed_. + * + *- `target`: The account receiving the vested funds. + *- `schedule`: The vesting schedule attached to the transfer. + * + *Emits `VestingCreated`. + * + *NOTE: This will unlock all schedules through the current block. + * + *## Complexity + *- `O(1)`. + */ + vested_transfer: TxDescriptor>; + /** + *Force a vested transfer. + * + *The dispatch origin for this call must be _Root_. + * + *- `source`: The account whose funds should be transferred. + *- `target`: The account that should be transferred the vested funds. + *- `schedule`: The vesting schedule attached to the transfer. + * + *Emits `VestingCreated`. + * + *NOTE: This will unlock all schedules through the current block. + * + *## Complexity + *- `O(1)`. + */ + force_vested_transfer: TxDescriptor>; + /** + *Merge two vesting schedules together, creating a new vesting schedule that unlocks over + *the highest possible start and end blocks. If both schedules have already started the + *current block will be used as the schedule start; with the caveat that if one schedule + *is finished by the current block, the other will be treated as the new merged schedule, + *unmodified. + * + *NOTE: If `schedule1_index == schedule2_index` this is a no-op. + *NOTE: This will unlock all schedules through the current block prior to merging. + *NOTE: If both schedules have ended by the current block, no new schedule will be created + *and both will be removed. + * + *Merged schedule attributes: + *- `starting_block`: `MAX(schedule1.starting_block, scheduled2.starting_block, + * current_block)`. + *- `ending_block`: `MAX(schedule1.ending_block, schedule2.ending_block)`. + *- `locked`: `schedule1.locked_at(current_block) + schedule2.locked_at(current_block)`. + * + *The dispatch origin for this call must be _Signed_. + * + *- `schedule1_index`: index of the first schedule to merge. + *- `schedule2_index`: index of the second schedule to merge. + */ + merge_schedules: TxDescriptor>; + /** + *Force remove a vesting schedule + * + *The dispatch origin for this call must be _Root_. + * + *- `target`: An account that has a vesting schedule + *- `schedule_index`: The vesting schedule index that should be removed + */ + force_remove_vesting_schedule: TxDescriptor>; + }; + Utility: { + /** + *Send a batch of dispatch calls. + * + *May be called from any origin except `None`. + * + *- `calls`: The calls to be dispatched from the same origin. The number of call must not + * exceed the constant: `batched_calls_limit` (available in constant metadata). + * + *If origin is root then the calls are dispatched without checking origin filter. (This + *includes bypassing `frame_system::Config::BaseCallFilter`). + * + *## Complexity + *- O(C) where C is the number of calls to be batched. + * + *This will return `Ok` in all circumstances. To determine the success of the batch, an + *event is deposited. If a call failed and the batch was interrupted, then the + *`BatchInterrupted` event is deposited, along with the number of successful calls made + *and the error of the failed call. If all were successful, then the `BatchCompleted` + *event is deposited. + */ + batch: TxDescriptor>; + /** + *Send a call through an indexed pseudonym of the sender. + * + *Filter from origin are passed along. The call will be dispatched with an origin which + *use the same filter as the origin of this call. + * + *NOTE: If you need to ensure that any account-based filtering is not honored (i.e. + *because you expect `proxy` to have been used prior in the call stack and you do not want + *the call restrictions to apply to any sub-accounts), then use `as_multi_threshold_1` + *in the Multisig pallet instead. + * + *NOTE: Prior to version *12, this was called `as_limited_sub`. + * + *The dispatch origin for this call must be _Signed_. + */ + as_derivative: TxDescriptor>; + /** + *Send a batch of dispatch calls and atomically execute them. + *The whole transaction will rollback and fail if any of the calls failed. + * + *May be called from any origin except `None`. + * + *- `calls`: The calls to be dispatched from the same origin. The number of call must not + * exceed the constant: `batched_calls_limit` (available in constant metadata). + * + *If origin is root then the calls are dispatched without checking origin filter. (This + *includes bypassing `frame_system::Config::BaseCallFilter`). + * + *## Complexity + *- O(C) where C is the number of calls to be batched. + */ + batch_all: TxDescriptor>; + /** + *Dispatches a function call with a provided origin. + * + *The dispatch origin for this call must be _Root_. + * + *## Complexity + *- O(1). + */ + dispatch_as: TxDescriptor>; + /** + *Send a batch of dispatch calls. + *Unlike `batch`, it allows errors and won't interrupt. + * + *May be called from any origin except `None`. + * + *- `calls`: The calls to be dispatched from the same origin. The number of call must not + * exceed the constant: `batched_calls_limit` (available in constant metadata). + * + *If origin is root then the calls are dispatch without checking origin filter. (This + *includes bypassing `frame_system::Config::BaseCallFilter`). + * + *## Complexity + *- O(C) where C is the number of calls to be batched. + */ + force_batch: TxDescriptor>; + /** + *Dispatch a function call with a specified weight. + * + *This function does not check the weight of the call, and instead allows the + *Root origin to specify the weight of the call. + * + *The dispatch origin for this call must be _Root_. + */ + with_weight: TxDescriptor>; + }; + Proxy: { + /** + *Dispatch the given `call` from an account that the sender is authorised for through + *`add_proxy`. + * + *The dispatch origin for this call must be _Signed_. + * + *Parameters: + *- `real`: The account that the proxy will make a call on behalf of. + *- `force_proxy_type`: Specify the exact proxy type to be used and checked for this call. + *- `call`: The call to be made by the `real` account. + */ + proxy: TxDescriptor>; + /** + *Register a proxy account for the sender that is able to make calls on its behalf. + * + *The dispatch origin for this call must be _Signed_. + * + *Parameters: + *- `proxy`: The account that the `caller` would like to make a proxy. + *- `proxy_type`: The permissions allowed for this proxy account. + *- `delay`: The announcement period required of the initial proxy. Will generally be + *zero. + */ + add_proxy: TxDescriptor>; + /** + *Unregister a proxy account for the sender. + * + *The dispatch origin for this call must be _Signed_. + * + *Parameters: + *- `proxy`: The account that the `caller` would like to remove as a proxy. + *- `proxy_type`: The permissions currently enabled for the removed proxy account. + */ + remove_proxy: TxDescriptor>; + /** + *Unregister all proxy accounts for the sender. + * + *The dispatch origin for this call must be _Signed_. + * + *WARNING: This may be called on accounts created by `pure`, however if done, then + *the unreserved fees will be inaccessible. **All access to this account will be lost.** + */ + remove_proxies: TxDescriptor; + /** + *Spawn a fresh new account that is guaranteed to be otherwise inaccessible, and + *initialize it with a proxy of `proxy_type` for `origin` sender. + * + *Requires a `Signed` origin. + * + *- `proxy_type`: The type of the proxy that the sender will be registered as over the + *new account. This will almost always be the most permissive `ProxyType` possible to + *allow for maximum flexibility. + *- `index`: A disambiguation index, in case this is called multiple times in the same + *transaction (e.g. with `utility::batch`). Unless you're using `batch` you probably just + *want to use `0`. + *- `delay`: The announcement period required of the initial proxy. Will generally be + *zero. + * + *Fails with `Duplicate` if this has already been called in this transaction, from the + *same sender, with the same parameters. + * + *Fails if there are insufficient funds to pay for deposit. + */ + create_pure: TxDescriptor>; + /** + *Removes a previously spawned pure proxy. + * + *WARNING: **All access to this account will be lost.** Any funds held in it will be + *inaccessible. + * + *Requires a `Signed` origin, and the sender account must have been created by a call to + *`pure` with corresponding parameters. + * + *- `spawner`: The account that originally called `pure` to create this account. + *- `index`: The disambiguation index originally passed to `pure`. Probably `0`. + *- `proxy_type`: The proxy type originally passed to `pure`. + *- `height`: The height of the chain when the call to `pure` was processed. + *- `ext_index`: The extrinsic index in which the call to `pure` was processed. + * + *Fails with `NoPermission` in case the caller is not a previously created pure + *account whose `pure` call has corresponding parameters. + */ + kill_pure: TxDescriptor>; + /** + *Publish the hash of a proxy-call that will be made in the future. + * + *This must be called some number of blocks before the corresponding `proxy` is attempted + *if the delay associated with the proxy relationship is greater than zero. + * + *No more than `MaxPending` announcements may be made at any one time. + * + *This will take a deposit of `AnnouncementDepositFactor` as well as + *`AnnouncementDepositBase` if there are no other pending announcements. + * + *The dispatch origin for this call must be _Signed_ and a proxy of `real`. + * + *Parameters: + *- `real`: The account that the proxy will make a call on behalf of. + *- `call_hash`: The hash of the call to be made by the `real` account. + */ + announce: TxDescriptor>; + /** + *Remove a given announcement. + * + *May be called by a proxy account to remove a call they previously announced and return + *the deposit. + * + *The dispatch origin for this call must be _Signed_. + * + *Parameters: + *- `real`: The account that the proxy will make a call on behalf of. + *- `call_hash`: The hash of the call to be made by the `real` account. + */ + remove_announcement: TxDescriptor>; + /** + *Remove the given announcement of a delegate. + * + *May be called by a target (proxied) account to remove a call that one of their delegates + *(`delegate`) has announced they want to execute. The deposit is returned. + * + *The dispatch origin for this call must be _Signed_. + * + *Parameters: + *- `delegate`: The account that previously announced the call. + *- `call_hash`: The hash of the call to be made. + */ + reject_announcement: TxDescriptor>; + /** + *Dispatch the given `call` from an account that the sender is authorized for through + *`add_proxy`. + * + *Removes any corresponding announcement(s). + * + *The dispatch origin for this call must be _Signed_. + * + *Parameters: + *- `real`: The account that the proxy will make a call on behalf of. + *- `force_proxy_type`: Specify the exact proxy type to be used and checked for this call. + *- `call`: The call to be made by the `real` account. + */ + proxy_announced: TxDescriptor>; + }; + Multisig: { + /** + *Immediately dispatch a multi-signature call using a single approval from the caller. + * + *The dispatch origin for this call must be _Signed_. + * + *- `other_signatories`: The accounts (other than the sender) who are part of the + *multi-signature, but do not participate in the approval process. + *- `call`: The call to be executed. + * + *Result is equivalent to the dispatched result. + * + *## Complexity + *O(Z + C) where Z is the length of the call and C its execution weight. + */ + as_multi_threshold_1: TxDescriptor>; + /** + *Register approval for a dispatch to be made from a deterministic composite account if + *approved by a total of `threshold - 1` of `other_signatories`. + * + *If there are enough, then dispatch the call. + * + *Payment: `DepositBase` will be reserved if this is the first approval, plus + *`threshold` times `DepositFactor`. It is returned once this dispatch happens or + *is cancelled. + * + *The dispatch origin for this call must be _Signed_. + * + *- `threshold`: The total number of approvals for this dispatch before it is executed. + *- `other_signatories`: The accounts (other than the sender) who can approve this + *dispatch. May not be empty. + *- `maybe_timepoint`: If this is the first approval, then this must be `None`. If it is + *not the first approval, then it must be `Some`, with the timepoint (block number and + *transaction index) of the first approval transaction. + *- `call`: The call to be executed. + * + *NOTE: Unless this is the final approval, you will generally want to use + *`approve_as_multi` instead, since it only requires a hash of the call. + * + *Result is equivalent to the dispatched result if `threshold` is exactly `1`. Otherwise + *on success, result is `Ok` and the result from the interior call, if it was executed, + *may be found in the deposited `MultisigExecuted` event. + * + *## Complexity + *- `O(S + Z + Call)`. + *- Up to one balance-reserve or unreserve operation. + *- One passthrough operation, one insert, both `O(S)` where `S` is the number of + * signatories. `S` is capped by `MaxSignatories`, with weight being proportional. + *- One call encode & hash, both of complexity `O(Z)` where `Z` is tx-len. + *- One encode & hash, both of complexity `O(S)`. + *- Up to one binary search and insert (`O(logS + S)`). + *- I/O: 1 read `O(S)`, up to 1 mutate `O(S)`. Up to one remove. + *- One event. + *- The weight of the `call`. + *- Storage: inserts one item, value size bounded by `MaxSignatories`, with a deposit + * taken for its lifetime of `DepositBase + threshold * DepositFactor`. + */ + as_multi: TxDescriptor>; + /** + *Register approval for a dispatch to be made from a deterministic composite account if + *approved by a total of `threshold - 1` of `other_signatories`. + * + *Payment: `DepositBase` will be reserved if this is the first approval, plus + *`threshold` times `DepositFactor`. It is returned once this dispatch happens or + *is cancelled. + * + *The dispatch origin for this call must be _Signed_. + * + *- `threshold`: The total number of approvals for this dispatch before it is executed. + *- `other_signatories`: The accounts (other than the sender) who can approve this + *dispatch. May not be empty. + *- `maybe_timepoint`: If this is the first approval, then this must be `None`. If it is + *not the first approval, then it must be `Some`, with the timepoint (block number and + *transaction index) of the first approval transaction. + *- `call_hash`: The hash of the call to be executed. + * + *NOTE: If this is the final approval, you will want to use `as_multi` instead. + * + *## Complexity + *- `O(S)`. + *- Up to one balance-reserve or unreserve operation. + *- One passthrough operation, one insert, both `O(S)` where `S` is the number of + * signatories. `S` is capped by `MaxSignatories`, with weight being proportional. + *- One encode & hash, both of complexity `O(S)`. + *- Up to one binary search and insert (`O(logS + S)`). + *- I/O: 1 read `O(S)`, up to 1 mutate `O(S)`. Up to one remove. + *- One event. + *- Storage: inserts one item, value size bounded by `MaxSignatories`, with a deposit + * taken for its lifetime of `DepositBase + threshold * DepositFactor`. + */ + approve_as_multi: TxDescriptor>; + /** + *Cancel a pre-existing, on-going multisig transaction. Any deposit reserved previously + *for this operation will be unreserved on success. + * + *The dispatch origin for this call must be _Signed_. + * + *- `threshold`: The total number of approvals for this dispatch before it is executed. + *- `other_signatories`: The accounts (other than the sender) who can approve this + *dispatch. May not be empty. + *- `timepoint`: The timepoint (block number and transaction index) of the first approval + *transaction for this dispatch. + *- `call_hash`: The hash of the call to be executed. + * + *## Complexity + *- `O(S)`. + *- Up to one balance-reserve or unreserve operation. + *- One passthrough operation, one insert, both `O(S)` where `S` is the number of + * signatories. `S` is capped by `MaxSignatories`, with weight being proportional. + *- One encode & hash, both of complexity `O(S)`. + *- One event. + *- I/O: 1 read `O(S)`, one remove. + *- Storage: removes one item. + */ + cancel_as_multi: TxDescriptor>; + }; + Bounties: { + /** + *Propose a new bounty. + * + *The dispatch origin for this call must be _Signed_. + * + *Payment: `TipReportDepositBase` will be reserved from the origin account, as well as + *`DataDepositPerByte` for each byte in `reason`. It will be unreserved upon approval, + *or slashed when rejected. + * + *- `curator`: The curator account whom will manage this bounty. + *- `fee`: The curator fee. + *- `value`: The total payment amount of this bounty, curator fee included. + *- `description`: The description of this bounty. + */ + propose_bounty: TxDescriptor>; + /** + *Approve a bounty proposal. At a later time, the bounty will be funded and become active + *and the original deposit will be returned. + * + *May only be called from `T::SpendOrigin`. + * + *## Complexity + *- O(1). + */ + approve_bounty: TxDescriptor>; + /** + *Propose a curator to a funded bounty. + * + *May only be called from `T::SpendOrigin`. + * + *## Complexity + *- O(1). + */ + propose_curator: TxDescriptor>; + /** + *Unassign curator from a bounty. + * + *This function can only be called by the `RejectOrigin` a signed origin. + * + *If this function is called by the `RejectOrigin`, we assume that the curator is + *malicious or inactive. As a result, we will slash the curator when possible. + * + *If the origin is the curator, we take this as a sign they are unable to do their job and + *they willingly give up. We could slash them, but for now we allow them to recover their + *deposit and exit without issue. (We may want to change this if it is abused.) + * + *Finally, the origin can be anyone if and only if the curator is "inactive". This allows + *anyone in the community to call out that a curator is not doing their due diligence, and + *we should pick a new curator. In this case the curator should also be slashed. + * + *## Complexity + *- O(1). + */ + unassign_curator: TxDescriptor>; + /** + *Accept the curator role for a bounty. + *A deposit will be reserved from curator and refund upon successful payout. + * + *May only be called from the curator. + * + *## Complexity + *- O(1). + */ + accept_curator: TxDescriptor>; + /** + *Award bounty to a beneficiary account. The beneficiary will be able to claim the funds + *after a delay. + * + *The dispatch origin for this call must be the curator of this bounty. + * + *- `bounty_id`: Bounty ID to award. + *- `beneficiary`: The beneficiary account whom will receive the payout. + * + *## Complexity + *- O(1). + */ + award_bounty: TxDescriptor>; + /** + *Claim the payout from an awarded bounty after payout delay. + * + *The dispatch origin for this call must be the beneficiary of this bounty. + * + *- `bounty_id`: Bounty ID to claim. + * + *## Complexity + *- O(1). + */ + claim_bounty: TxDescriptor>; + /** + *Cancel a proposed or active bounty. All the funds will be sent to treasury and + *the curator deposit will be unreserved if possible. + * + *Only `T::RejectOrigin` is able to cancel a bounty. + * + *- `bounty_id`: Bounty ID to cancel. + * + *## Complexity + *- O(1). + */ + close_bounty: TxDescriptor>; + /** + *Extend the expiry time of an active bounty. + * + *The dispatch origin for this call must be the curator of this bounty. + * + *- `bounty_id`: Bounty ID to extend. + *- `remark`: additional information. + * + *## Complexity + *- O(1). + */ + extend_bounty_expiry: TxDescriptor>; + }; + ChildBounties: { + /** + *Add a new child-bounty. + * + *The dispatch origin for this call must be the curator of parent + *bounty and the parent bounty must be in "active" state. + * + *Child-bounty gets added successfully & fund gets transferred from + *parent bounty to child-bounty account, if parent bounty has enough + *funds, else the call fails. + * + *Upper bound to maximum number of active child bounties that can be + *added are managed via runtime trait config + *[`Config::MaxActiveChildBountyCount`]. + * + *If the call is success, the status of child-bounty is updated to + *"Added". + * + *- `parent_bounty_id`: Index of parent bounty for which child-bounty is being added. + *- `value`: Value for executing the proposal. + *- `description`: Text description for the child-bounty. + */ + add_child_bounty: TxDescriptor>; + /** + *Propose curator for funded child-bounty. + * + *The dispatch origin for this call must be curator of parent bounty. + * + *Parent bounty must be in active state, for this child-bounty call to + *work. + * + *Child-bounty must be in "Added" state, for processing the call. And + *state of child-bounty is moved to "CuratorProposed" on successful + *call completion. + * + *- `parent_bounty_id`: Index of parent bounty. + *- `child_bounty_id`: Index of child bounty. + *- `curator`: Address of child-bounty curator. + *- `fee`: payment fee to child-bounty curator for execution. + */ + propose_curator: TxDescriptor>; + /** + *Accept the curator role for the child-bounty. + * + *The dispatch origin for this call must be the curator of this + *child-bounty. + * + *A deposit will be reserved from the curator and refund upon + *successful payout or cancellation. + * + *Fee for curator is deducted from curator fee of parent bounty. + * + *Parent bounty must be in active state, for this child-bounty call to + *work. + * + *Child-bounty must be in "CuratorProposed" state, for processing the + *call. And state of child-bounty is moved to "Active" on successful + *call completion. + * + *- `parent_bounty_id`: Index of parent bounty. + *- `child_bounty_id`: Index of child bounty. + */ + accept_curator: TxDescriptor>; + /** + *Unassign curator from a child-bounty. + * + *The dispatch origin for this call can be either `RejectOrigin`, or + *the curator of the parent bounty, or any signed origin. + * + *For the origin other than T::RejectOrigin and the child-bounty + *curator, parent bounty must be in active state, for this call to + *work. We allow child-bounty curator and T::RejectOrigin to execute + *this call irrespective of the parent bounty state. + * + *If this function is called by the `RejectOrigin` or the + *parent bounty curator, we assume that the child-bounty curator is + *malicious or inactive. As a result, child-bounty curator deposit is + *slashed. + * + *If the origin is the child-bounty curator, we take this as a sign + *that they are unable to do their job, and are willingly giving up. + *We could slash the deposit, but for now we allow them to unreserve + *their deposit and exit without issue. (We may want to change this if + *it is abused.) + * + *Finally, the origin can be anyone iff the child-bounty curator is + *"inactive". Expiry update due of parent bounty is used to estimate + *inactive state of child-bounty curator. + * + *This allows anyone in the community to call out that a child-bounty + *curator is not doing their due diligence, and we should pick a new + *one. In this case the child-bounty curator deposit is slashed. + * + *State of child-bounty is moved to Added state on successful call + *completion. + * + *- `parent_bounty_id`: Index of parent bounty. + *- `child_bounty_id`: Index of child bounty. + */ + unassign_curator: TxDescriptor>; + /** + *Award child-bounty to a beneficiary. + * + *The beneficiary will be able to claim the funds after a delay. + * + *The dispatch origin for this call must be the parent curator or + *curator of this child-bounty. + * + *Parent bounty must be in active state, for this child-bounty call to + *work. + * + *Child-bounty must be in active state, for processing the call. And + *state of child-bounty is moved to "PendingPayout" on successful call + *completion. + * + *- `parent_bounty_id`: Index of parent bounty. + *- `child_bounty_id`: Index of child bounty. + *- `beneficiary`: Beneficiary account. + */ + award_child_bounty: TxDescriptor>; + /** + *Claim the payout from an awarded child-bounty after payout delay. + * + *The dispatch origin for this call may be any signed origin. + * + *Call works independent of parent bounty state, No need for parent + *bounty to be in active state. + * + *The Beneficiary is paid out with agreed bounty value. Curator fee is + *paid & curator deposit is unreserved. + * + *Child-bounty must be in "PendingPayout" state, for processing the + *call. And instance of child-bounty is removed from the state on + *successful call completion. + * + *- `parent_bounty_id`: Index of parent bounty. + *- `child_bounty_id`: Index of child bounty. + */ + claim_child_bounty: TxDescriptor>; + /** + *Cancel a proposed or active child-bounty. Child-bounty account funds + *are transferred to parent bounty account. The child-bounty curator + *deposit may be unreserved if possible. + * + *The dispatch origin for this call must be either parent curator or + *`T::RejectOrigin`. + * + *If the state of child-bounty is `Active`, curator deposit is + *unreserved. + * + *If the state of child-bounty is `PendingPayout`, call fails & + *returns `PendingPayout` error. + * + *For the origin other than T::RejectOrigin, parent bounty must be in + *active state, for this child-bounty call to work. For origin + *T::RejectOrigin execution is forced. + * + *Instance of child-bounty is removed from the state on successful + *call completion. + * + *- `parent_bounty_id`: Index of parent bounty. + *- `child_bounty_id`: Index of child bounty. + */ + close_child_bounty: TxDescriptor>; + }; + ElectionProviderMultiPhase: { + /** + *Submit a solution for the unsigned phase. + * + *The dispatch origin fo this call must be __none__. + * + *This submission is checked on the fly. Moreover, this unsigned solution is only + *validated when submitted to the pool from the **local** node. Effectively, this means + *that only active validators can submit this transaction when authoring a block (similar + *to an inherent). + * + *To prevent any incorrect solution (and thus wasted time/weight), this transaction will + *panic if the solution submitted by the validator is invalid in any way, effectively + *putting their authoring reward at risk. + * + *No deposit or reward is associated with this submission. + */ + submit_unsigned: TxDescriptor>; + /** + *Set a new value for `MinimumUntrustedScore`. + * + *Dispatch origin must be aligned with `T::ForceOrigin`. + * + *This check can be turned off by setting the value to `None`. + */ + set_minimum_untrusted_score: TxDescriptor>; + /** + *Set a solution in the queue, to be handed out to the client of this pallet in the next + *call to `ElectionProvider::elect`. + * + *This can only be set by `T::ForceOrigin`, and only when the phase is `Emergency`. + * + *The solution is not checked for any feasibility and is assumed to be trustworthy, as any + *feasibility check itself can in principle cause the election process to fail (due to + *memory/weight constrains). + */ + set_emergency_election_result: TxDescriptor>; + /** + *Submit a solution for the signed phase. + * + *The dispatch origin fo this call must be __signed__. + * + *The solution is potentially queued, based on the claimed score and processed at the end + *of the signed phase. + * + *A deposit is reserved and recorded for the solution. Based on the outcome, the solution + *might be rewarded, slashed, or get all or a part of the deposit back. + */ + submit: TxDescriptor>; + /** + *Trigger the governance fallback. + * + *This can only be called when [`Phase::Emergency`] is enabled, as an alternative to + *calling [`Call::set_emergency_election_result`]. + */ + governance_fallback: TxDescriptor>; + }; + VoterList: { + /** + *Declare that some `dislocated` account has, through rewards or penalties, sufficiently + *changed its score that it should properly fall into a different bag than its current + *one. + * + *Anyone can call this function about any potentially dislocated account. + * + *Will always update the stored score of `dislocated` to the correct score, based on + *`ScoreProvider`. + * + *If `dislocated` does not exists, it returns an error. + */ + rebag: TxDescriptor>; + /** + *Move the caller's Id directly in front of `lighter`. + * + *The dispatch origin for this call must be _Signed_ and can only be called by the Id of + *the account going in front of `lighter`. Fee is payed by the origin under all + *circumstances. + * + *Only works if: + * + *- both nodes are within the same bag, + *- and `origin` has a greater `Score` than `lighter`. + */ + put_in_front_of: TxDescriptor>; + /** + *Same as [`Pallet::put_in_front_of`], but it can be called by anyone. + * + *Fee is paid by the origin under all circumstances. + */ + put_in_front_of_other: TxDescriptor>; + }; + NominationPools: { + /** + *Stake funds with a pool. The amount to bond is transferred from the member to the + *pools account and immediately increases the pools bond. + * + *# Note + * + ** An account can only be a member of a single pool. + ** An account cannot join the same pool multiple times. + ** This call will *not* dust the member account, so the member must have at least + * `existential deposit + amount` in their account. + ** Only a pool with [`PoolState::Open`] can be joined + */ + join: TxDescriptor>; + /** + *Bond `extra` more funds from `origin` into the pool to which they already belong. + * + *Additional funds can come from either the free balance of the account, of from the + *accumulated rewards, see [`BondExtra`]. + * + *Bonding extra funds implies an automatic payout of all pending rewards as well. + *See `bond_extra_other` to bond pending rewards of `other` members. + */ + bond_extra: TxDescriptor>; + /** + *A bonded member can use this to claim their payout based on the rewards that the pool + *has accumulated since their last claimed payout (OR since joining if this is their first + *time claiming rewards). The payout will be transferred to the member's account. + * + *The member will earn rewards pro rata based on the members stake vs the sum of the + *members in the pools stake. Rewards do not "expire". + * + *See `claim_payout_other` to claim rewards on behalf of some `other` pool member. + */ + claim_payout: TxDescriptor; + /** + *Unbond up to `unbonding_points` of the `member_account`'s funds from the pool. It + *implicitly collects the rewards one last time, since not doing so would mean some + *rewards would be forfeited. + * + *Under certain conditions, this call can be dispatched permissionlessly (i.e. by any + *account). + * + *# Conditions for a permissionless dispatch. + * + ** The pool is blocked and the caller is either the root or bouncer. This is refereed to + * as a kick. + ** The pool is destroying and the member is not the depositor. + ** The pool is destroying, the member is the depositor and no other members are in the + * pool. + * + *## Conditions for permissioned dispatch (i.e. the caller is also the + *`member_account`): + * + ** The caller is not the depositor. + ** The caller is the depositor, the pool is destroying and no other members are in the + * pool. + * + *# Note + * + *If there are too many unlocking chunks to unbond with the pool account, + *[`Call::pool_withdraw_unbonded`] can be called to try and minimize unlocking chunks. + *The [`StakingInterface::unbond`] will implicitly call [`Call::pool_withdraw_unbonded`] + *to try to free chunks if necessary (ie. if unbound was called and no unlocking chunks + *are available). However, it may not be possible to release the current unlocking chunks, + *in which case, the result of this call will likely be the `NoMoreChunks` error from the + *staking system. + */ + unbond: TxDescriptor>; + /** + *Call `withdraw_unbonded` for the pools account. This call can be made by any account. + * + *This is useful if there are too many unlocking chunks to call `unbond`, and some + *can be cleared by withdrawing. In the case there are too many unlocking chunks, the user + *would probably see an error like `NoMoreChunks` emitted from the staking system when + *they attempt to unbond. + */ + pool_withdraw_unbonded: TxDescriptor>; + /** + *Withdraw unbonded funds from `member_account`. If no bonded funds can be unbonded, an + *error is returned. + * + *Under certain conditions, this call can be dispatched permissionlessly (i.e. by any + *account). + * + *# Conditions for a permissionless dispatch + * + ** The pool is in destroy mode and the target is not the depositor. + ** The target is the depositor and they are the only member in the sub pools. + ** The pool is blocked and the caller is either the root or bouncer. + * + *# Conditions for permissioned dispatch + * + ** The caller is the target and they are not the depositor. + * + *# Note + * + *- If the target is the depositor, the pool will be destroyed. + *- If the pool has any pending slash, we also try to slash the member before letting them + *withdraw. This calculation adds some weight overhead and is only defensive. In reality, + *pool slashes must have been already applied via permissionless [`Call::apply_slash`]. + */ + withdraw_unbonded: TxDescriptor>; + /** + *Create a new delegation pool. + * + *# Arguments + * + ** `amount` - The amount of funds to delegate to the pool. This also acts of a sort of + * deposit since the pools creator cannot fully unbond funds until the pool is being + * destroyed. + ** `index` - A disambiguation index for creating the account. Likely only useful when + * creating multiple pools in the same extrinsic. + ** `root` - The account to set as [`PoolRoles::root`]. + ** `nominator` - The account to set as the [`PoolRoles::nominator`]. + ** `bouncer` - The account to set as the [`PoolRoles::bouncer`]. + * + *# Note + * + *In addition to `amount`, the caller will transfer the existential deposit; so the caller + *needs at have at least `amount + existential_deposit` transferable. + */ + create: TxDescriptor>; + /** + *Create a new delegation pool with a previously used pool id + * + *# Arguments + * + *same as `create` with the inclusion of + ** `pool_id` - `A valid PoolId. + */ + create_with_pool_id: TxDescriptor>; + /** + *Nominate on behalf of the pool. + * + *The dispatch origin of this call must be signed by the pool nominator or the pool + *root role. + * + *This directly forward the call to the staking pallet, on behalf of the pool bonded + *account. + * + *# Note + * + *In addition to a `root` or `nominator` role of `origin`, pool's depositor needs to have + *at least `depositor_min_bond` in the pool to start nominating. + */ + nominate: TxDescriptor>; + /** + *Set a new state for the pool. + * + *If a pool is already in the `Destroying` state, then under no condition can its state + *change again. + * + *The dispatch origin of this call must be either: + * + *1. signed by the bouncer, or the root role of the pool, + *2. if the pool conditions to be open are NOT met (as described by `ok_to_be_open`), and + * then the state of the pool can be permissionlessly changed to `Destroying`. + */ + set_state: TxDescriptor>; + /** + *Set a new metadata for the pool. + * + *The dispatch origin of this call must be signed by the bouncer, or the root role of the + *pool. + */ + set_metadata: TxDescriptor>; + /** + *Update configurations for the nomination pools. The origin for this call must be + *[`Config::AdminOrigin`]. + * + *# Arguments + * + ** `min_join_bond` - Set [`MinJoinBond`]. + ** `min_create_bond` - Set [`MinCreateBond`]. + ** `max_pools` - Set [`MaxPools`]. + ** `max_members` - Set [`MaxPoolMembers`]. + ** `max_members_per_pool` - Set [`MaxPoolMembersPerPool`]. + ** `global_max_commission` - Set [`GlobalMaxCommission`]. + */ + set_configs: TxDescriptor>; + /** + *Update the roles of the pool. + * + *The root is the only entity that can change any of the roles, including itself, + *excluding the depositor, who can never change. + * + *It emits an event, notifying UIs of the role change. This event is quite relevant to + *most pool members and they should be informed of changes to pool roles. + */ + update_roles: TxDescriptor>; + /** + *Chill on behalf of the pool. + * + *The dispatch origin of this call can be signed by the pool nominator or the pool + *root role, same as [`Pallet::nominate`]. + * + *Under certain conditions, this call can be dispatched permissionlessly (i.e. by any + *account). + * + *# Conditions for a permissionless dispatch: + ** When pool depositor has less than `MinNominatorBond` staked, otherwise pool members + * are unable to unbond. + * + *# Conditions for permissioned dispatch: + ** The caller has a nominator or root role of the pool. + *This directly forward the call to the staking pallet, on behalf of the pool bonded + *account. + */ + chill: TxDescriptor>; + /** + *`origin` bonds funds from `extra` for some pool member `member` into their respective + *pools. + * + *`origin` can bond extra funds from free balance or pending rewards when `origin == + *other`. + * + *In the case of `origin != other`, `origin` can only bond extra pending rewards of + *`other` members assuming set_claim_permission for the given member is + *`PermissionlessCompound` or `PermissionlessAll`. + */ + bond_extra_other: TxDescriptor>; + /** + *Allows a pool member to set a claim permission to allow or disallow permissionless + *bonding and withdrawing. + * + *# Arguments + * + ** `origin` - Member of a pool. + ** `permission` - The permission to be applied. + */ + set_claim_permission: TxDescriptor>; + /** + *`origin` can claim payouts on some pool member `other`'s behalf. + * + *Pool member `other` must have a `PermissionlessWithdraw` or `PermissionlessAll` claim + *permission for this call to be successful. + */ + claim_payout_other: TxDescriptor>; + /** + *Set the commission of a pool. + *Both a commission percentage and a commission payee must be provided in the `current` + *tuple. Where a `current` of `None` is provided, any current commission will be removed. + * + *- If a `None` is supplied to `new_commission`, existing commission will be removed. + */ + set_commission: TxDescriptor>; + /** + *Set the maximum commission of a pool. + * + *- Initial max can be set to any `Perbill`, and only smaller values thereafter. + *- Current commission will be lowered in the event it is higher than a new max + * commission. + */ + set_commission_max: TxDescriptor>; + /** + *Set the commission change rate for a pool. + * + *Initial change rate is not bounded, whereas subsequent updates can only be more + *restrictive than the current. + */ + set_commission_change_rate: TxDescriptor>; + /** + *Claim pending commission. + * + *The dispatch origin of this call must be signed by the `root` role of the pool. Pending + *commission is paid out and added to total claimed commission`. Total pending commission + *is reset to zero. the current. + */ + claim_commission: TxDescriptor>; + /** + *Top up the deficit or withdraw the excess ED from the pool. + * + *When a pool is created, the pool depositor transfers ED to the reward account of the + *pool. ED is subject to change and over time, the deposit in the reward account may be + *insufficient to cover the ED deficit of the pool or vice-versa where there is excess + *deposit to the pool. This call allows anyone to adjust the ED deposit of the + *pool by either topping up the deficit or claiming the excess. + */ + adjust_pool_deposit: TxDescriptor>; + /** + *Set or remove a pool's commission claim permission. + * + *Determines who can claim the pool's pending commission. Only the `Root` role of the pool + *is able to configure commission claim permissions. + */ + set_commission_claim_permission: TxDescriptor>; + /** + *Apply a pending slash on a member. + * + *Fails unless [`crate::pallet::Config::StakeAdapter`] is of strategy type: + *[`adapter::StakeStrategyType::Delegate`]. + * + *This call can be dispatched permissionlessly (i.e. by any account). If the member has + *slash to be applied, caller may be rewarded with the part of the slash. + */ + apply_slash: TxDescriptor>; + /** + *Migrates delegated funds from the pool account to the `member_account`. + * + *Fails unless [`crate::pallet::Config::StakeAdapter`] is of strategy type: + *[`adapter::StakeStrategyType::Delegate`]. + * + *This is a permission-less call and refunds any fee if claim is successful. + * + *If the pool has migrated to delegation based staking, the staked tokens of pool members + *can be moved and held in their own account. See [`adapter::DelegateStake`] + */ + migrate_delegation: TxDescriptor>; + /** + *Migrate pool from [`adapter::StakeStrategyType::Transfer`] to + *[`adapter::StakeStrategyType::Delegate`]. + * + *Fails unless [`crate::pallet::Config::StakeAdapter`] is of strategy type: + *[`adapter::StakeStrategyType::Delegate`]. + * + *This call can be dispatched permissionlessly, and refunds any fee if successful. + * + *If the pool has already migrated to delegation based staking, this call will fail. + */ + migrate_pool_to_delegate_stake: TxDescriptor>; + }; + FastUnstake: { + /** + *Register oneself for fast-unstake. + * + *## Dispatch Origin + * + *The dispatch origin of this call must be *signed* by whoever is permitted to call + *unbond funds by the staking system. See [`Config::Staking`]. + * + *## Details + * + *The stash associated with the origin must have no ongoing unlocking chunks. If + *successful, this will fully unbond and chill the stash. Then, it will enqueue the stash + *to be checked in further blocks. + * + *If by the time this is called, the stash is actually eligible for fast-unstake, then + *they are guaranteed to remain eligible, because the call will chill them as well. + * + *If the check works, the entire staking data is removed, i.e. the stash is fully + *unstaked. + * + *If the check fails, the stash remains chilled and waiting for being unbonded as in with + *the normal staking system, but they lose part of their unbonding chunks due to consuming + *the chain's resources. + * + *## Events + * + *Some events from the staking and currency system might be emitted. + */ + register_fast_unstake: TxDescriptor; + /** + *Deregister oneself from the fast-unstake. + * + *## Dispatch Origin + * + *The dispatch origin of this call must be *signed* by whoever is permitted to call + *unbond funds by the staking system. See [`Config::Staking`]. + * + *## Details + * + *This is useful if one is registered, they are still waiting, and they change their mind. + * + *Note that the associated stash is still fully unbonded and chilled as a consequence of + *calling [`Pallet::register_fast_unstake`]. Therefore, this should probably be followed + *by a call to `rebond` in the staking system. + * + *## Events + * + *Some events from the staking and currency system might be emitted. + */ + deregister: TxDescriptor; + /** + *Control the operation of this pallet. + * + *## Dispatch Origin + * + *The dispatch origin of this call must be [`Config::ControlOrigin`]. + * + *## Details + * + *Can set the number of eras to check per block, and potentially other admin work. + * + *## Events + * + *No events are emitted from this dispatch. + */ + control: TxDescriptor>; + }; + Configuration: { + /** + *Set the validation upgrade cooldown. + */ + set_validation_upgrade_cooldown: TxDescriptor>; + /** + *Set the validation upgrade delay. + */ + set_validation_upgrade_delay: TxDescriptor>; + /** + *Set the acceptance period for an included candidate. + */ + set_code_retention_period: TxDescriptor>; + /** + *Set the max validation code size for incoming upgrades. + */ + set_max_code_size: TxDescriptor>; + /** + *Set the max POV block size for incoming upgrades. + */ + set_max_pov_size: TxDescriptor>; + /** + *Set the max head data size for paras. + */ + set_max_head_data_size: TxDescriptor>; + /** + *Set the number of coretime execution cores. + * + *NOTE: that this configuration is managed by the coretime chain. Only manually change + *this, if you really know what you are doing! + */ + set_coretime_cores: TxDescriptor>; + /** + *Set the max number of times a claim may timeout on a core before it is abandoned + */ + set_max_availability_timeouts: TxDescriptor>; + /** + *Set the parachain validator-group rotation frequency + */ + set_group_rotation_frequency: TxDescriptor>; + /** + *Set the availability period for paras. + */ + set_paras_availability_period: TxDescriptor>; + /** + *Set the scheduling lookahead, in expected number of blocks at peak throughput. + */ + set_scheduling_lookahead: TxDescriptor>; + /** + *Set the maximum number of validators to assign to any core. + */ + set_max_validators_per_core: TxDescriptor>; + /** + *Set the maximum number of validators to use in parachain consensus. + */ + set_max_validators: TxDescriptor>; + /** + *Set the dispute period, in number of sessions to keep for disputes. + */ + set_dispute_period: TxDescriptor>; + /** + *Set the dispute post conclusion acceptance period. + */ + set_dispute_post_conclusion_acceptance_period: TxDescriptor>; + /** + *Set the no show slots, in number of number of consensus slots. + *Must be at least 1. + */ + set_no_show_slots: TxDescriptor>; + /** + *Set the total number of delay tranches. + */ + set_n_delay_tranches: TxDescriptor>; + /** + *Set the zeroth delay tranche width. + */ + set_zeroth_delay_tranche_width: TxDescriptor>; + /** + *Set the number of validators needed to approve a block. + */ + set_needed_approvals: TxDescriptor>; + /** + *Set the number of samples to do of the `RelayVRFModulo` approval assignment criterion. + */ + set_relay_vrf_modulo_samples: TxDescriptor>; + /** + *Sets the maximum items that can present in a upward dispatch queue at once. + */ + set_max_upward_queue_count: TxDescriptor>; + /** + *Sets the maximum total size of items that can present in a upward dispatch queue at + *once. + */ + set_max_upward_queue_size: TxDescriptor>; + /** + *Set the critical downward message size. + */ + set_max_downward_message_size: TxDescriptor>; + /** + *Sets the maximum size of an upward message that can be sent by a candidate. + */ + set_max_upward_message_size: TxDescriptor>; + /** + *Sets the maximum number of messages that a candidate can contain. + */ + set_max_upward_message_num_per_candidate: TxDescriptor>; + /** + *Sets the number of sessions after which an HRMP open channel request expires. + */ + set_hrmp_open_request_ttl: TxDescriptor>; + /** + *Sets the amount of funds that the sender should provide for opening an HRMP channel. + */ + set_hrmp_sender_deposit: TxDescriptor>; + /** + *Sets the amount of funds that the recipient should provide for accepting opening an HRMP + *channel. + */ + set_hrmp_recipient_deposit: TxDescriptor>; + /** + *Sets the maximum number of messages allowed in an HRMP channel at once. + */ + set_hrmp_channel_max_capacity: TxDescriptor>; + /** + *Sets the maximum total size of messages in bytes allowed in an HRMP channel at once. + */ + set_hrmp_channel_max_total_size: TxDescriptor>; + /** + *Sets the maximum number of inbound HRMP channels a parachain is allowed to accept. + */ + set_hrmp_max_parachain_inbound_channels: TxDescriptor>; + /** + *Sets the maximum size of a message that could ever be put into an HRMP channel. + */ + set_hrmp_channel_max_message_size: TxDescriptor>; + /** + *Sets the maximum number of outbound HRMP channels a parachain is allowed to open. + */ + set_hrmp_max_parachain_outbound_channels: TxDescriptor>; + /** + *Sets the maximum number of outbound HRMP messages can be sent by a candidate. + */ + set_hrmp_max_message_num_per_candidate: TxDescriptor>; + /** + *Set the number of session changes after which a PVF pre-checking voting is rejected. + */ + set_pvf_voting_ttl: TxDescriptor>; + /** + *Sets the minimum delay between announcing the upgrade block for a parachain until the + *upgrade taking place. + * + *See the field documentation for information and constraints for the new value. + */ + set_minimum_validation_upgrade_delay: TxDescriptor>; + /** + *Setting this to true will disable consistency checks for the configuration setters. + *Use with caution. + */ + set_bypass_consistency_check: TxDescriptor>; + /** + *Set the asynchronous backing parameters. + */ + set_async_backing_params: TxDescriptor>; + /** + *Set PVF executor parameters. + */ + set_executor_params: TxDescriptor>; + /** + *Set the on demand (parathreads) base fee. + */ + set_on_demand_base_fee: TxDescriptor>; + /** + *Set the on demand (parathreads) fee variability. + */ + set_on_demand_fee_variability: TxDescriptor>; + /** + *Set the on demand (parathreads) queue max size. + */ + set_on_demand_queue_max_size: TxDescriptor>; + /** + *Set the on demand (parathreads) fee variability. + */ + set_on_demand_target_queue_utilization: TxDescriptor>; + /** + *Set the on demand (parathreads) ttl in the claimqueue. + */ + set_on_demand_ttl: TxDescriptor>; + /** + *Set the minimum backing votes threshold. + */ + set_minimum_backing_votes: TxDescriptor>; + /** + *Set/Unset a node feature. + */ + set_node_feature: TxDescriptor>; + /** + *Set approval-voting-params. + */ + set_approval_voting_params: TxDescriptor>; + /** + *Set scheduler-params. + */ + set_scheduler_params: TxDescriptor>; + }; + ParaInherent: { + /** + *Enter the paras inherent. This will process bitfields and backed candidates. + */ + enter: TxDescriptor>; + }; + Paras: { + /** + *Set the storage for the parachain validation code immediately. + */ + force_set_current_code: TxDescriptor>; + /** + *Set the storage for the current parachain head data immediately. + */ + force_set_current_head: TxDescriptor>; + /** + *Schedule an upgrade as if it was scheduled in the given relay parent block. + */ + force_schedule_code_upgrade: TxDescriptor>; + /** + *Note a new block head for para within the context of the current block. + */ + force_note_new_head: TxDescriptor>; + /** + *Put a parachain directly into the next session's action queue. + *We can't queue it any sooner than this without going into the + *initializer... + */ + force_queue_action: TxDescriptor>; + /** + *Adds the validation code to the storage. + * + *The code will not be added if it is already present. Additionally, if PVF pre-checking + *is running for that code, it will be instantly accepted. + * + *Otherwise, the code will be added into the storage. Note that the code will be added + *into storage with reference count 0. This is to account the fact that there are no users + *for this code yet. The caller will have to make sure that this code eventually gets + *used by some parachain or removed from the storage to avoid storage leaks. For the + *latter prefer to use the `poke_unused_validation_code` dispatchable to raw storage + *manipulation. + * + *This function is mainly meant to be used for upgrading parachains that do not follow + *the go-ahead signal while the PVF pre-checking feature is enabled. + */ + add_trusted_validation_code: TxDescriptor>; + /** + *Remove the validation code from the storage iff the reference count is 0. + * + *This is better than removing the storage directly, because it will not remove the code + *that was suddenly got used by some parachain while this dispatchable was pending + *dispatching. + */ + poke_unused_validation_code: TxDescriptor>; + /** + *Includes a statement for a PVF pre-checking vote. Potentially, finalizes the vote and + *enacts the results if that was the last vote before achieving the supermajority. + */ + include_pvf_check_statement: TxDescriptor>; + /** + *Set the storage for the current parachain head data immediately. + */ + force_set_most_recent_context: TxDescriptor>; + }; + Initializer: { + /** + *Issue a signal to the consensus engine to forcibly act as though all parachain + *blocks in all relay chain blocks up to and including the given number in the current + *chain are valid and should be finalized. + */ + force_approve: TxDescriptor>; + }; + Hrmp: { + /** + *Initiate opening a channel from a parachain to a given recipient with given channel + *parameters. + * + *- `proposed_max_capacity` - specifies how many messages can be in the channel at once. + *- `proposed_max_message_size` - specifies the maximum size of the messages. + * + *These numbers are a subject to the relay-chain configuration limits. + * + *The channel can be opened only after the recipient confirms it and only on a session + *change. + */ + hrmp_init_open_channel: TxDescriptor>; + /** + *Accept a pending open channel request from the given sender. + * + *The channel will be opened only on the next session boundary. + */ + hrmp_accept_open_channel: TxDescriptor>; + /** + *Initiate unilateral closing of a channel. The origin must be either the sender or the + *recipient in the channel being closed. + * + *The closure can only happen on a session change. + */ + hrmp_close_channel: TxDescriptor>; + /** + *This extrinsic triggers the cleanup of all the HRMP storage items that a para may have. + *Normally this happens once per session, but this allows you to trigger the cleanup + *immediately for a specific parachain. + * + *Number of inbound and outbound channels for `para` must be provided as witness data. + * + *Origin must be the `ChannelManager`. + */ + force_clean_hrmp: TxDescriptor>; + /** + *Force process HRMP open channel requests. + * + *If there are pending HRMP open channel requests, you can use this function to process + *all of those requests immediately. + * + *Total number of opening channels must be provided as witness data. + * + *Origin must be the `ChannelManager`. + */ + force_process_hrmp_open: TxDescriptor>; + /** + *Force process HRMP close channel requests. + * + *If there are pending HRMP close channel requests, you can use this function to process + *all of those requests immediately. + * + *Total number of closing channels must be provided as witness data. + * + *Origin must be the `ChannelManager`. + */ + force_process_hrmp_close: TxDescriptor>; + /** + *This cancels a pending open channel request. It can be canceled by either of the sender + *or the recipient for that request. The origin must be either of those. + * + *The cancellation happens immediately. It is not possible to cancel the request if it is + *already accepted. + * + *Total number of open requests (i.e. `HrmpOpenChannelRequestsList`) must be provided as + *witness data. + */ + hrmp_cancel_open_request: TxDescriptor>; + /** + *Open a channel from a `sender` to a `recipient` `ParaId`. Although opened by governance, + *the `max_capacity` and `max_message_size` are still subject to the Relay Chain's + *configured limits. + * + *Expected use is when one (and only one) of the `ParaId`s involved in the channel is + *governed by the system, e.g. a system parachain. + * + *Origin must be the `ChannelManager`. + */ + force_open_hrmp_channel: TxDescriptor>; + /** + *Establish an HRMP channel between two system chains. If the channel does not already + *exist, the transaction fees will be refunded to the caller. The system does not take + *deposits for channels between system chains, and automatically sets the message number + *and size limits to the maximum allowed by the network's configuration. + * + *Arguments: + * + *- `sender`: A system chain, `ParaId`. + *- `recipient`: A system chain, `ParaId`. + * + *Any signed origin can call this function, but _both_ inputs MUST be system chains. If + *the channel does not exist yet, there is no fee. + */ + establish_system_channel: TxDescriptor>; + /** + *Update the deposits held for an HRMP channel to the latest `Configuration`. Channels + *with system chains do not require a deposit. + * + *Arguments: + * + *- `sender`: A chain, `ParaId`. + *- `recipient`: A chain, `ParaId`. + * + *Any signed origin can call this function. + */ + poke_channel_deposits: TxDescriptor>; + /** + *Establish a bidirectional HRMP channel between a parachain and a system chain. + * + *Arguments: + * + *- `target_system_chain`: A system chain, `ParaId`. + * + *The origin needs to be the parachain origin. + */ + establish_channel_with_system: TxDescriptor>; + }; + ParasDisputes: { + /** + + */ + force_unfreeze: TxDescriptor; + }; + ParasSlashing: { + /** + + */ + report_dispute_lost_unsigned: TxDescriptor>; + }; + OnDemand: { + /** + *Create a single on demand core order. + *Will use the spot price for the current block and will reap the account if needed. + * + *Parameters: + *- `origin`: The sender of the call, funds will be withdrawn from this account. + *- `max_amount`: The maximum balance to withdraw from the origin to place an order. + *- `para_id`: A `ParaId` the origin wants to provide blockspace for. + * + *Errors: + *- `InsufficientBalance`: from the Currency implementation + *- `QueueFull` + *- `SpotPriceHigherThanMaxAmount` + * + *Events: + *- `OnDemandOrderPlaced` + */ + place_order_allow_death: TxDescriptor>; + /** + *Same as the [`place_order_allow_death`](Self::place_order_allow_death) call , but with a + *check that placing the order will not reap the account. + * + *Parameters: + *- `origin`: The sender of the call, funds will be withdrawn from this account. + *- `max_amount`: The maximum balance to withdraw from the origin to place an order. + *- `para_id`: A `ParaId` the origin wants to provide blockspace for. + * + *Errors: + *- `InsufficientBalance`: from the Currency implementation + *- `QueueFull` + *- `SpotPriceHigherThanMaxAmount` + * + *Events: + *- `OnDemandOrderPlaced` + */ + place_order_keep_alive: TxDescriptor>; + }; + Registrar: { + /** + *Register head data and validation code for a reserved Para Id. + * + *## Arguments + *- `origin`: Must be called by a `Signed` origin. + *- `id`: The para ID. Must be owned/managed by the `origin` signing account. + *- `genesis_head`: The genesis head data of the parachain/thread. + *- `validation_code`: The initial validation code of the parachain/thread. + * + *## Deposits/Fees + *The account with the originating signature must reserve a deposit. + * + *The deposit is required to cover the costs associated with storing the genesis head + *data and the validation code. + *This accounts for the potential to store validation code of a size up to the + *`max_code_size`, as defined in the configuration pallet + * + *Anything already reserved previously for this para ID is accounted for. + * + *## Events + *The `Registered` event is emitted in case of success. + */ + register: TxDescriptor>; + /** + *Force the registration of a Para Id on the relay chain. + * + *This function must be called by a Root origin. + * + *The deposit taken can be specified for this registration. Any `ParaId` + *can be registered, including sub-1000 IDs which are System Parachains. + */ + force_register: TxDescriptor>; + /** + *Deregister a Para Id, freeing all data and returning any deposit. + * + *The caller must be Root, the `para` owner, or the `para` itself. The para must be an + *on-demand parachain. + */ + deregister: TxDescriptor>; + /** + *Swap a lease holding parachain with another parachain, either on-demand or lease + *holding. + * + *The origin must be Root, the `para` owner, or the `para` itself. + * + *The swap will happen only if there is already an opposite swap pending. If there is not, + *the swap will be stored in the pending swaps map, ready for a later confirmatory swap. + * + *The `ParaId`s remain mapped to the same head data and code so external code can rely on + *`ParaId` to be a long-term identifier of a notional "parachain". However, their + *scheduling info (i.e. whether they're an on-demand parachain or lease holding + *parachain), auction information and the auction deposit are switched. + */ + swap: TxDescriptor>; + /** + *Remove a manager lock from a para. This will allow the manager of a + *previously locked para to deregister or swap a para without using governance. + * + *Can only be called by the Root origin or the parachain. + */ + remove_lock: TxDescriptor>; + /** + *Reserve a Para Id on the relay chain. + * + *This function will reserve a new Para Id to be owned/managed by the origin account. + *The origin account is able to register head data and validation code using `register` to + *create an on-demand parachain. Using the Slots pallet, an on-demand parachain can then + *be upgraded to a lease holding parachain. + * + *## Arguments + *- `origin`: Must be called by a `Signed` origin. Becomes the manager/owner of the new + * para ID. + * + *## Deposits/Fees + *The origin must reserve a deposit of `ParaDeposit` for the registration. + * + *## Events + *The `Reserved` event is emitted in case of success, which provides the ID reserved for + *use. + */ + reserve: TxDescriptor; + /** + *Add a manager lock from a para. This will prevent the manager of a + *para to deregister or swap a para. + * + *Can be called by Root, the parachain, or the parachain manager if the parachain is + *unlocked. + */ + add_lock: TxDescriptor>; + /** + *Schedule a parachain upgrade. + * + *This will kick off a check of `new_code` by all validators. After the majority of the + *validators have reported on the validity of the code, the code will either be enacted + *or the upgrade will be rejected. If the code will be enacted, the current code of the + *parachain will be overwritten directly. This means that any PoV will be checked by this + *new code. The parachain itself will not be informed explicitly that the validation code + *has changed. + * + *Can be called by Root, the parachain, or the parachain manager if the parachain is + *unlocked. + */ + schedule_code_upgrade: TxDescriptor>; + /** + *Set the parachain's current head. + * + *Can be called by Root, the parachain, or the parachain manager if the parachain is + *unlocked. + */ + set_current_head: TxDescriptor>; + }; + Slots: { + /** + *Just a connect into the `lease_out` call, in case Root wants to force some lease to + *happen independently of any other on-chain mechanism to use it. + * + *The dispatch origin for this call must match `T::ForceOrigin`. + */ + force_lease: TxDescriptor>; + /** + *Clear all leases for a Para Id, refunding any deposits back to the original owners. + * + *The dispatch origin for this call must match `T::ForceOrigin`. + */ + clear_all_leases: TxDescriptor>; + /** + *Try to onboard a parachain that has a lease for the current lease period. + * + *This function can be useful if there was some state issue with a para that should + *have onboarded, but was unable to. As long as they have a lease period, we can + *let them onboard from here. + * + *Origin must be signed, but can be called by anyone. + */ + trigger_onboard: TxDescriptor>; + }; + Auctions: { + /** + *Create a new auction. + * + *This can only happen when there isn't already an auction in progress and may only be + *called by the root origin. Accepts the `duration` of this auction and the + *`lease_period_index` of the initial lease period of the four that are to be auctioned. + */ + new_auction: TxDescriptor>; + /** + *Make a new bid from an account (including a parachain account) for deploying a new + *parachain. + * + *Multiple simultaneous bids from the same bidder are allowed only as long as all active + *bids overlap each other (i.e. are mutually exclusive). Bids cannot be redacted. + * + *- `sub` is the sub-bidder ID, allowing for multiple competing bids to be made by (and + *funded by) the same account. + *- `auction_index` is the index of the auction to bid on. Should just be the present + *value of `AuctionCounter`. + *- `first_slot` is the first lease period index of the range to bid on. This is the + *absolute lease period index value, not an auction-specific offset. + *- `last_slot` is the last lease period index of the range to bid on. This is the + *absolute lease period index value, not an auction-specific offset. + *- `amount` is the amount to bid to be held as deposit for the parachain should the + *bid win. This amount is held throughout the range. + */ + bid: TxDescriptor>; + /** + *Cancel an in-progress auction. + * + *Can only be called by Root origin. + */ + cancel_auction: TxDescriptor; + }; + Crowdloan: { + /** + *Create a new crowdloaning campaign for a parachain slot with the given lease period + *range. + * + *This applies a lock to your parachain configuration, ensuring that it cannot be changed + *by the parachain manager. + */ + create: TxDescriptor>; + /** + *Contribute to a crowd sale. This will transfer some balance over to fund a parachain + *slot. It will be withdrawable when the crowdloan has ended and the funds are unused. + */ + contribute: TxDescriptor>; + /** + *Withdraw full balance of a specific contributor. + * + *Origin must be signed, but can come from anyone. + * + *The fund must be either in, or ready for, retirement. For a fund to be *in* retirement, + *then the retirement flag must be set. For a fund to be ready for retirement, then: + *- it must not already be in retirement; + *- the amount of raised funds must be bigger than the _free_ balance of the account; + *- and either: + * - the block number must be at least `end`; or + * - the current lease period must be greater than the fund's `last_period`. + * + *In this case, the fund's retirement flag is set and its `end` is reset to the current + *block number. + * + *- `who`: The account whose contribution should be withdrawn. + *- `index`: The parachain to whose crowdloan the contribution was made. + */ + withdraw: TxDescriptor>; + /** + *Automatically refund contributors of an ended crowdloan. + *Due to weight restrictions, this function may need to be called multiple + *times to fully refund all users. We will refund `RemoveKeysLimit` users at a time. + * + *Origin must be signed, but can come from anyone. + */ + refund: TxDescriptor>; + /** + *Remove a fund after the retirement period has ended and all funds have been returned. + */ + dissolve: TxDescriptor>; + /** + *Edit the configuration for an in-progress crowdloan. + * + *Can only be called by Root origin. + */ + edit: TxDescriptor>; + /** + *Add an optional memo to an existing crowdloan contribution. + * + *Origin must be Signed, and the user must have contributed to the crowdloan. + */ + add_memo: TxDescriptor>; + /** + *Poke the fund into `NewRaise` + * + *Origin must be Signed, and the fund has non-zero raise. + */ + poke: TxDescriptor>; + /** + *Contribute your entire balance to a crowd sale. This will transfer the entire balance of + *a user over to fund a parachain slot. It will be withdrawable when the crowdloan has + *ended and the funds are unused. + */ + contribute_all: TxDescriptor>; + }; + Coretime: { + /** + *Request the configuration to be updated with the specified number of cores. Warning: + *Since this only schedules a configuration update, it takes two sessions to come into + *effect. + * + *- `origin`: Root or the Coretime Chain + *- `count`: total number of cores + */ + request_core_count: TxDescriptor>; + /** + *Request to claim the instantaneous coretime sales revenue starting from the block it was + *last claimed until and up to the block specified. The claimed amount value is sent back + *to the Coretime chain in a `notify_revenue` message. At the same time, the amount is + *teleported to the Coretime chain. + */ + request_revenue_at: TxDescriptor>; + /** + *Receive instructions from the `ExternalBrokerOrigin`, detailing how a specific core is + *to be used. + * + *Parameters: + *-`origin`: The `ExternalBrokerOrigin`, assumed to be the coretime chain. + *-`core`: The core that should be scheduled. + *-`begin`: The starting blockheight of the instruction. + *-`assignment`: How the blockspace should be utilised. + *-`end_hint`: An optional hint as to when this particular set of instructions will end. + */ + assign_core: TxDescriptor>; + }; + StateTrieMigration: { + /** + *Control the automatic migration. + * + *The dispatch origin of this call must be [`Config::ControlOrigin`]. + */ + control_auto_migration: TxDescriptor>; + /** + *Continue the migration for the given `limits`. + * + *The dispatch origin of this call can be any signed account. + * + *This transaction has NO MONETARY INCENTIVES. calling it will not reward anyone. Albeit, + *Upon successful execution, the transaction fee is returned. + * + *The (potentially over-estimated) of the byte length of all the data read must be + *provided for up-front fee-payment and weighing. In essence, the caller is guaranteeing + *that executing the current `MigrationTask` with the given `limits` will not exceed + *`real_size_upper` bytes of read data. + * + *The `witness_task` is merely a helper to prevent the caller from being slashed or + *generally trigger a migration that they do not intend. This parameter is just a message + *from caller, saying that they believed `witness_task` was the last state of the + *migration, and they only wish for their transaction to do anything, if this assumption + *holds. In case `witness_task` does not match, the transaction fails. + * + *Based on the documentation of [`MigrationTask::migrate_until_exhaustion`], the + *recommended way of doing this is to pass a `limit` that only bounds `count`, as the + *`size` limit can always be overwritten. + */ + continue_migrate: TxDescriptor>; + /** + *Migrate the list of top keys by iterating each of them one by one. + * + *This does not affect the global migration process tracker ([`MigrationProcess`]), and + *should only be used in case any keys are leftover due to a bug. + */ + migrate_custom_top: TxDescriptor>; + /** + *Migrate the list of child keys by iterating each of them one by one. + * + *All of the given child keys must be present under one `child_root`. + * + *This does not affect the global migration process tracker ([`MigrationProcess`]), and + *should only be used in case any keys are leftover due to a bug. + */ + migrate_custom_child: TxDescriptor>; + /** + *Set the maximum limit of the signed migration. + */ + set_signed_max_limits: TxDescriptor>; + /** + *Forcefully set the progress the running migration. + * + *This is only useful in one case: the next key to migrate is too big to be migrated with + *a signed account, in a parachain context, and we simply want to skip it. A reasonable + *example of this would be `:code:`, which is both very expensive to migrate, and commonly + *used, so probably it is already migrated. + * + *In case you mess things up, you can also, in principle, use this to reset the migration + *process. + */ + force_set_progress: TxDescriptor>; + }; + XcmPallet: { + /** + + */ + send: TxDescriptor>; + /** + *Teleport some assets from the local chain to some destination chain. + * + ***This function is deprecated: Use `limited_teleport_assets` instead.** + * + *Fee payment on the destination side is made from the asset in the `assets` vector of + *index `fee_asset_item`. The weight limit for fees is not provided and thus is unlimited, + *with all fees taken as needed from the asset. + * + *- `origin`: Must be capable of withdrawing the `assets` and executing XCM. + *- `dest`: Destination context for the assets. Will typically be `[Parent, + * Parachain(..)]` to send from parachain to parachain, or `[Parachain(..)]` to send from + * relay to parachain. + *- `beneficiary`: A beneficiary location for the assets in the context of `dest`. Will + * generally be an `AccountId32` value. + *- `assets`: The assets to be withdrawn. This should include the assets used to pay the + * fee on the `dest` chain. + *- `fee_asset_item`: The index into `assets` of the item which should be used to pay + * fees. + */ + teleport_assets: TxDescriptor>; + /** + *Transfer some assets from the local chain to the destination chain through their local, + *destination or remote reserve. + * + *`assets` must have same reserve location and may not be teleportable to `dest`. + * - `assets` have local reserve: transfer assets to sovereign account of destination + * chain and forward a notification XCM to `dest` to mint and deposit reserve-based + * assets to `beneficiary`. + * - `assets` have destination reserve: burn local assets and forward a notification to + * `dest` chain to withdraw the reserve assets from this chain's sovereign account and + * deposit them to `beneficiary`. + * - `assets` have remote reserve: burn local assets, forward XCM to reserve chain to move + * reserves from this chain's SA to `dest` chain's SA, and forward another XCM to `dest` + * to mint and deposit reserve-based assets to `beneficiary`. + * + ***This function is deprecated: Use `limited_reserve_transfer_assets` instead.** + * + *Fee payment on the destination side is made from the asset in the `assets` vector of + *index `fee_asset_item`. The weight limit for fees is not provided and thus is unlimited, + *with all fees taken as needed from the asset. + * + *- `origin`: Must be capable of withdrawing the `assets` and executing XCM. + *- `dest`: Destination context for the assets. Will typically be `[Parent, + * Parachain(..)]` to send from parachain to parachain, or `[Parachain(..)]` to send from + * relay to parachain. + *- `beneficiary`: A beneficiary location for the assets in the context of `dest`. Will + * generally be an `AccountId32` value. + *- `assets`: The assets to be withdrawn. This should include the assets used to pay the + * fee on the `dest` (and possibly reserve) chains. + *- `fee_asset_item`: The index into `assets` of the item which should be used to pay + * fees. + */ + reserve_transfer_assets: TxDescriptor>; + /** + *Execute an XCM message from a local, signed, origin. + * + *An event is deposited indicating whether `msg` could be executed completely or only + *partially. + * + *No more than `max_weight` will be used in its attempted execution. If this is less than + *the maximum amount of weight that the message could take to be executed, then no + *execution attempt will be made. + */ + execute: TxDescriptor>; + /** + *Extoll that a particular destination can be communicated with through a particular + *version of XCM. + * + *- `origin`: Must be an origin specified by AdminOrigin. + *- `location`: The destination that is being described. + *- `xcm_version`: The latest version of XCM that `location` supports. + */ + force_xcm_version: TxDescriptor>; + /** + *Set a safe XCM version (the version that XCM should be encoded with if the most recent + *version a destination can accept is unknown). + * + *- `origin`: Must be an origin specified by AdminOrigin. + *- `maybe_xcm_version`: The default XCM encoding version, or `None` to disable. + */ + force_default_xcm_version: TxDescriptor>; + /** + *Ask a location to notify us regarding their XCM version and any changes to it. + * + *- `origin`: Must be an origin specified by AdminOrigin. + *- `location`: The location to which we should subscribe for XCM version notifications. + */ + force_subscribe_version_notify: TxDescriptor>; + /** + *Require that a particular destination should no longer notify us regarding any XCM + *version changes. + * + *- `origin`: Must be an origin specified by AdminOrigin. + *- `location`: The location to which we are currently subscribed for XCM version + * notifications which we no longer desire. + */ + force_unsubscribe_version_notify: TxDescriptor>; + /** + *Transfer some assets from the local chain to the destination chain through their local, + *destination or remote reserve. + * + *`assets` must have same reserve location and may not be teleportable to `dest`. + * - `assets` have local reserve: transfer assets to sovereign account of destination + * chain and forward a notification XCM to `dest` to mint and deposit reserve-based + * assets to `beneficiary`. + * - `assets` have destination reserve: burn local assets and forward a notification to + * `dest` chain to withdraw the reserve assets from this chain's sovereign account and + * deposit them to `beneficiary`. + * - `assets` have remote reserve: burn local assets, forward XCM to reserve chain to move + * reserves from this chain's SA to `dest` chain's SA, and forward another XCM to `dest` + * to mint and deposit reserve-based assets to `beneficiary`. + * + *Fee payment on the destination side is made from the asset in the `assets` vector of + *index `fee_asset_item`, up to enough to pay for `weight_limit` of weight. If more weight + *is needed than `weight_limit`, then the operation will fail and the sent assets may be + *at risk. + * + *- `origin`: Must be capable of withdrawing the `assets` and executing XCM. + *- `dest`: Destination context for the assets. Will typically be `[Parent, + * Parachain(..)]` to send from parachain to parachain, or `[Parachain(..)]` to send from + * relay to parachain. + *- `beneficiary`: A beneficiary location for the assets in the context of `dest`. Will + * generally be an `AccountId32` value. + *- `assets`: The assets to be withdrawn. This should include the assets used to pay the + * fee on the `dest` (and possibly reserve) chains. + *- `fee_asset_item`: The index into `assets` of the item which should be used to pay + * fees. + *- `weight_limit`: The remote-side weight limit, if any, for the XCM fee purchase. + */ + limited_reserve_transfer_assets: TxDescriptor>; + /** + *Teleport some assets from the local chain to some destination chain. + * + *Fee payment on the destination side is made from the asset in the `assets` vector of + *index `fee_asset_item`, up to enough to pay for `weight_limit` of weight. If more weight + *is needed than `weight_limit`, then the operation will fail and the sent assets may be + *at risk. + * + *- `origin`: Must be capable of withdrawing the `assets` and executing XCM. + *- `dest`: Destination context for the assets. Will typically be `[Parent, + * Parachain(..)]` to send from parachain to parachain, or `[Parachain(..)]` to send from + * relay to parachain. + *- `beneficiary`: A beneficiary location for the assets in the context of `dest`. Will + * generally be an `AccountId32` value. + *- `assets`: The assets to be withdrawn. This should include the assets used to pay the + * fee on the `dest` chain. + *- `fee_asset_item`: The index into `assets` of the item which should be used to pay + * fees. + *- `weight_limit`: The remote-side weight limit, if any, for the XCM fee purchase. + */ + limited_teleport_assets: TxDescriptor>; + /** + *Set or unset the global suspension state of the XCM executor. + * + *- `origin`: Must be an origin specified by AdminOrigin. + *- `suspended`: `true` to suspend, `false` to resume. + */ + force_suspension: TxDescriptor>; + /** + *Transfer some assets from the local chain to the destination chain through their local, + *destination or remote reserve, or through teleports. + * + *Fee payment on the destination side is made from the asset in the `assets` vector of + *index `fee_asset_item` (hence referred to as `fees`), up to enough to pay for + *`weight_limit` of weight. If more weight is needed than `weight_limit`, then the + *operation will fail and the sent assets may be at risk. + * + *`assets` (excluding `fees`) must have same reserve location or otherwise be teleportable + *to `dest`, no limitations imposed on `fees`. + * - for local reserve: transfer assets to sovereign account of destination chain and + * forward a notification XCM to `dest` to mint and deposit reserve-based assets to + * `beneficiary`. + * - for destination reserve: burn local assets and forward a notification to `dest` chain + * to withdraw the reserve assets from this chain's sovereign account and deposit them + * to `beneficiary`. + * - for remote reserve: burn local assets, forward XCM to reserve chain to move reserves + * from this chain's SA to `dest` chain's SA, and forward another XCM to `dest` to mint + * and deposit reserve-based assets to `beneficiary`. + * - for teleports: burn local assets and forward XCM to `dest` chain to mint/teleport + * assets and deposit them to `beneficiary`. + * + *- `origin`: Must be capable of withdrawing the `assets` and executing XCM. + *- `dest`: Destination context for the assets. Will typically be `X2(Parent, + * Parachain(..))` to send from parachain to parachain, or `X1(Parachain(..))` to send + * from relay to parachain. + *- `beneficiary`: A beneficiary location for the assets in the context of `dest`. Will + * generally be an `AccountId32` value. + *- `assets`: The assets to be withdrawn. This should include the assets used to pay the + * fee on the `dest` (and possibly reserve) chains. + *- `fee_asset_item`: The index into `assets` of the item which should be used to pay + * fees. + *- `weight_limit`: The remote-side weight limit, if any, for the XCM fee purchase. + */ + transfer_assets: TxDescriptor>; + /** + *Claims assets trapped on this pallet because of leftover assets during XCM execution. + * + *- `origin`: Anyone can call this extrinsic. + *- `assets`: The exact assets that were trapped. Use the version to specify what version + *was the latest when they were trapped. + *- `beneficiary`: The location/account where the claimed assets will be deposited. + */ + claim_assets: TxDescriptor>; + /** + *Transfer assets from the local chain to the destination chain using explicit transfer + *types for assets and fees. + * + *`assets` must have same reserve location or may be teleportable to `dest`. Caller must + *provide the `assets_transfer_type` to be used for `assets`: + * - `TransferType::LocalReserve`: transfer assets to sovereign account of destination + * chain and forward a notification XCM to `dest` to mint and deposit reserve-based + * assets to `beneficiary`. + * - `TransferType::DestinationReserve`: burn local assets and forward a notification to + * `dest` chain to withdraw the reserve assets from this chain's sovereign account and + * deposit them to `beneficiary`. + * - `TransferType::RemoteReserve(reserve)`: burn local assets, forward XCM to `reserve` + * chain to move reserves from this chain's SA to `dest` chain's SA, and forward another + * XCM to `dest` to mint and deposit reserve-based assets to `beneficiary`. Typically + * the remote `reserve` is Asset Hub. + * - `TransferType::Teleport`: burn local assets and forward XCM to `dest` chain to + * mint/teleport assets and deposit them to `beneficiary`. + * + *On the destination chain, as well as any intermediary hops, `BuyExecution` is used to + *buy execution using transferred `assets` identified by `remote_fees_id`. + *Make sure enough of the specified `remote_fees_id` asset is included in the given list + *of `assets`. `remote_fees_id` should be enough to pay for `weight_limit`. If more weight + *is needed than `weight_limit`, then the operation will fail and the sent assets may be + *at risk. + * + *`remote_fees_id` may use different transfer type than rest of `assets` and can be + *specified through `fees_transfer_type`. + * + *The caller needs to specify what should happen to the transferred assets once they reach + *the `dest` chain. This is done through the `custom_xcm_on_dest` parameter, which + *contains the instructions to execute on `dest` as a final step. + * This is usually as simple as: + * `Xcm(vec![DepositAsset { assets: Wild(AllCounted(assets.len())), beneficiary }])`, + * but could be something more exotic like sending the `assets` even further. + * + *- `origin`: Must be capable of withdrawing the `assets` and executing XCM. + *- `dest`: Destination context for the assets. Will typically be `[Parent, + * Parachain(..)]` to send from parachain to parachain, or `[Parachain(..)]` to send from + * relay to parachain, or `(parents: 2, (GlobalConsensus(..), ..))` to send from + * parachain across a bridge to another ecosystem destination. + *- `assets`: The assets to be withdrawn. This should include the assets used to pay the + * fee on the `dest` (and possibly reserve) chains. + *- `assets_transfer_type`: The XCM `TransferType` used to transfer the `assets`. + *- `remote_fees_id`: One of the included `assets` to be used to pay fees. + *- `fees_transfer_type`: The XCM `TransferType` used to transfer the `fees` assets. + *- `custom_xcm_on_dest`: The XCM to be executed on `dest` chain as the last step of the + * transfer, which also determines what happens to the assets on the destination chain. + *- `weight_limit`: The remote-side weight limit, if any, for the XCM fee purchase. + */ + transfer_assets_using_type_and_then: TxDescriptor>; + }; + MessageQueue: { + /** + *Remove a page which has no more messages remaining to be processed or is stale. + */ + reap_page: TxDescriptor>; + /** + *Execute an overweight message. + * + *Temporary processing errors will be propagated whereas permanent errors are treated + *as success condition. + * + *- `origin`: Must be `Signed`. + *- `message_origin`: The origin from which the message to be executed arrived. + *- `page`: The page in the queue in which the message to be executed is sitting. + *- `index`: The index into the queue of the message to be executed. + *- `weight_limit`: The maximum amount of weight allowed to be consumed in the execution + * of the message. + * + *Benchmark complexity considerations: O(index + weight_limit). + */ + execute_overweight: TxDescriptor>; + }; + AssetRate: { + /** + *Initialize a conversion rate to native balance for the given asset. + * + *## Complexity + *- O(1) + */ + create: TxDescriptor>; + /** + *Update the conversion rate to native balance for the given asset. + * + *## Complexity + *- O(1) + */ + update: TxDescriptor>; + /** + *Remove an existing conversion rate to native balance for the given asset. + * + *## Complexity + *- O(1) + */ + remove: TxDescriptor>; + }; + Beefy: { + /** + *Report voter equivocation/misbehavior. This method will verify the + *equivocation proof and validate the given key ownership proof + *against the extracted offender. If both are valid, the offence + *will be reported. + */ + report_equivocation: TxDescriptor>; + /** + *Report voter equivocation/misbehavior. This method will verify the + *equivocation proof and validate the given key ownership proof + *against the extracted offender. If both are valid, the offence + *will be reported. + * + *This extrinsic must be called unsigned and it is expected that only + *block authors will call it (validated in `ValidateUnsigned`), as such + *if the block author is defined it will be defined as the equivocation + *reporter. + */ + report_equivocation_unsigned: TxDescriptor>; + /** + *Reset BEEFY consensus by setting a new BEEFY genesis at `delay_in_blocks` blocks in the + *future. + * + *Note: `delay_in_blocks` has to be at least 1. + */ + set_new_genesis: TxDescriptor>; + }; +}; +type IEvent = { + System: { + /** + *An extrinsic completed successfully. + */ + ExtrinsicSuccess: PlainDescriptor>; + /** + *An extrinsic failed. + */ + ExtrinsicFailed: PlainDescriptor>; + /** + *`:code` was updated. + */ + CodeUpdated: PlainDescriptor; + /** + *A new account was created. + */ + NewAccount: PlainDescriptor>; + /** + *An account was reaped. + */ + KilledAccount: PlainDescriptor>; + /** + *On on-chain remark happened. + */ + Remarked: PlainDescriptor>; + /** + *An upgrade was authorized. + */ + UpgradeAuthorized: PlainDescriptor>; + }; + Scheduler: { + /** + *Scheduled some task. + */ + Scheduled: PlainDescriptor>; + /** + *Canceled some task. + */ + Canceled: PlainDescriptor>; + /** + *Dispatched some task. + */ + Dispatched: PlainDescriptor>; + /** + *Set a retry configuration for some task. + */ + RetrySet: PlainDescriptor>; + /** + *Cancel a retry configuration for some task. + */ + RetryCancelled: PlainDescriptor>; + /** + *The call for the provided hash was not found so the task has been aborted. + */ + CallUnavailable: PlainDescriptor>; + /** + *The given task was unable to be renewed since the agenda is full at that block. + */ + PeriodicFailed: PlainDescriptor>; + /** + *The given task was unable to be retried since the agenda is full at that block or there + *was not enough weight to reschedule it. + */ + RetryFailed: PlainDescriptor>; + /** + *The given task can never be executed since it is overweight. + */ + PermanentlyOverweight: PlainDescriptor>; + }; + Preimage: { + /** + *A preimage has been noted. + */ + Noted: PlainDescriptor>; + /** + *A preimage has been requested. + */ + Requested: PlainDescriptor>; + /** + *A preimage has ben cleared. + */ + Cleared: PlainDescriptor>; + }; + Indices: { + /** + *A account index was assigned. + */ + IndexAssigned: PlainDescriptor>; + /** + *A account index has been freed up (unassigned). + */ + IndexFreed: PlainDescriptor>; + /** + *A account index has been frozen to its current account ID. + */ + IndexFrozen: PlainDescriptor>; + }; + Balances: { + /** + *An account was created with some free balance. + */ + Endowed: PlainDescriptor>; + /** + *An account was removed whose balance was non-zero but below ExistentialDeposit, + *resulting in an outright loss. + */ + DustLost: PlainDescriptor>; + /** + *Transfer succeeded. + */ + Transfer: PlainDescriptor>; + /** + *A balance was set by root. + */ + BalanceSet: PlainDescriptor>; + /** + *Some balance was reserved (moved from free to reserved). + */ + Reserved: PlainDescriptor>; + /** + *Some balance was unreserved (moved from reserved to free). + */ + Unreserved: PlainDescriptor>; + /** + *Some balance was moved from the reserve of the first account to the second account. + *Final argument indicates the destination balance type. + */ + ReserveRepatriated: PlainDescriptor>; + /** + *Some amount was deposited (e.g. for transaction fees). + */ + Deposit: PlainDescriptor>; + /** + *Some amount was withdrawn from the account (e.g. for transaction fees). + */ + Withdraw: PlainDescriptor>; + /** + *Some amount was removed from the account (e.g. for misbehavior). + */ + Slashed: PlainDescriptor>; + /** + *Some amount was minted into an account. + */ + Minted: PlainDescriptor>; + /** + *Some amount was burned from an account. + */ + Burned: PlainDescriptor>; + /** + *Some amount was suspended from an account (it can be restored later). + */ + Suspended: PlainDescriptor>; + /** + *Some amount was restored into an account. + */ + Restored: PlainDescriptor>; + /** + *An account was upgraded. + */ + Upgraded: PlainDescriptor>; + /** + *Total issuance was increased by `amount`, creating a credit to be balanced. + */ + Issued: PlainDescriptor>; + /** + *Total issuance was decreased by `amount`, creating a debt to be balanced. + */ + Rescinded: PlainDescriptor>; + /** + *Some balance was locked. + */ + Locked: PlainDescriptor>; + /** + *Some balance was unlocked. + */ + Unlocked: PlainDescriptor>; + /** + *Some balance was frozen. + */ + Frozen: PlainDescriptor>; + /** + *Some balance was thawed. + */ + Thawed: PlainDescriptor>; + /** + *The `TotalIssuance` was forcefully changed. + */ + TotalIssuanceForced: PlainDescriptor>; + }; + TransactionPayment: { + /** + *A transaction fee `actual_fee`, of which `tip` was added to the minimum inclusion fee, + *has been paid by `who`. + */ + TransactionFeePaid: PlainDescriptor>; + }; + Staking: { + /** + *The era payout has been set; the first balance is the validator-payout; the second is + *the remainder from the maximum amount of reward. + */ + EraPaid: PlainDescriptor>; + /** + *The nominator has been rewarded by this amount to this destination. + */ + Rewarded: PlainDescriptor>; + /** + *A staker (validator or nominator) has been slashed by the given amount. + */ + Slashed: PlainDescriptor>; + /** + *A slash for the given validator, for the given percentage of their stake, at the given + *era as been reported. + */ + SlashReported: PlainDescriptor>; + /** + *An old slashing report from a prior era was discarded because it could + *not be processed. + */ + OldSlashingReportDiscarded: PlainDescriptor>; + /** + *A new set of stakers was elected. + */ + StakersElected: PlainDescriptor; + /** + *An account has bonded this amount. \[stash, amount\] + * + *NOTE: This event is only emitted when funds are bonded via a dispatchable. Notably, + *it will not be emitted for staking rewards when they are added to stake. + */ + Bonded: PlainDescriptor>; + /** + *An account has unbonded this amount. + */ + Unbonded: PlainDescriptor>; + /** + *An account has called `withdraw_unbonded` and removed unbonding chunks worth `Balance` + *from the unlocking queue. + */ + Withdrawn: PlainDescriptor>; + /** + *A nominator has been kicked from a validator. + */ + Kicked: PlainDescriptor>; + /** + *The election failed. No new era is planned. + */ + StakingElectionFailed: PlainDescriptor; + /** + *An account has stopped participating as either a validator or nominator. + */ + Chilled: PlainDescriptor>; + /** + *The stakers' rewards are getting paid. + */ + PayoutStarted: PlainDescriptor>; + /** + *A validator has set their preferences. + */ + ValidatorPrefsSet: PlainDescriptor>; + /** + *Voters size limit reached. + */ + SnapshotVotersSizeExceeded: PlainDescriptor>; + /** + *Targets size limit reached. + */ + SnapshotTargetsSizeExceeded: PlainDescriptor>; + /** + *A new force era mode was set. + */ + ForceEra: PlainDescriptor>; + /** + *Report of a controller batch deprecation. + */ + ControllerBatchDeprecated: PlainDescriptor>; + }; + Offences: { + /** + *There is an offence reported of the given `kind` happened at the `session_index` and + *(kind-specific) time slot. This event is not deposited for duplicate slashes. + *\[kind, timeslot\]. + */ + Offence: PlainDescriptor>; + }; + Session: { + /** + *New session has happened. Note that the argument is the session index, not the + *block number as the type might suggest. + */ + NewSession: PlainDescriptor>; + }; + Grandpa: { + /** + *New authority set has been applied. + */ + NewAuthorities: PlainDescriptor>; + /** + *Current authority set has been paused. + */ + Paused: PlainDescriptor; + /** + *Current authority set has been resumed. + */ + Resumed: PlainDescriptor; + }; + Treasury: { + /** + *We have ended a spend period and will now allocate funds. + */ + Spending: PlainDescriptor>; + /** + *Some funds have been allocated. + */ + Awarded: PlainDescriptor>; + /** + *Some of our funds have been burnt. + */ + Burnt: PlainDescriptor>; + /** + *Spending has finished; this is the amount that rolls over until next spend. + */ + Rollover: PlainDescriptor>; + /** + *Some funds have been deposited. + */ + Deposit: PlainDescriptor>; + /** + *A new spend proposal has been approved. + */ + SpendApproved: PlainDescriptor>; + /** + *The inactive funds of the pallet have been updated. + */ + UpdatedInactive: PlainDescriptor>; + /** + *A new asset spend proposal has been approved. + */ + AssetSpendApproved: PlainDescriptor>; + /** + *An approved spend was voided. + */ + AssetSpendVoided: PlainDescriptor>; + /** + *A payment happened. + */ + Paid: PlainDescriptor>; + /** + *A payment failed and can be retried. + */ + PaymentFailed: PlainDescriptor>; + /** + *A spend was processed and removed from the storage. It might have been successfully + *paid or it may have expired. + */ + SpendProcessed: PlainDescriptor>; + }; + ConvictionVoting: { + /** + *An account has delegated their vote to another account. \[who, target\] + */ + Delegated: PlainDescriptor>; + /** + *An \[account\] has cancelled a previous delegation operation. + */ + Undelegated: PlainDescriptor; + }; + Referenda: { + /** + *A referendum has been submitted. + */ + Submitted: PlainDescriptor>; + /** + *The decision deposit has been placed. + */ + DecisionDepositPlaced: PlainDescriptor>; + /** + *The decision deposit has been refunded. + */ + DecisionDepositRefunded: PlainDescriptor>; + /** + *A deposit has been slashed. + */ + DepositSlashed: PlainDescriptor>; + /** + *A referendum has moved into the deciding phase. + */ + DecisionStarted: PlainDescriptor>; + /** + + */ + ConfirmStarted: PlainDescriptor>; + /** + + */ + ConfirmAborted: PlainDescriptor>; + /** + *A referendum has ended its confirmation phase and is ready for approval. + */ + Confirmed: PlainDescriptor>; + /** + *A referendum has been approved and its proposal has been scheduled. + */ + Approved: PlainDescriptor>; + /** + *A proposal has been rejected by referendum. + */ + Rejected: PlainDescriptor>; + /** + *A referendum has been timed out without being decided. + */ + TimedOut: PlainDescriptor>; + /** + *A referendum has been cancelled. + */ + Cancelled: PlainDescriptor>; + /** + *A referendum has been killed. + */ + Killed: PlainDescriptor>; + /** + *The submission deposit has been refunded. + */ + SubmissionDepositRefunded: PlainDescriptor>; + /** + *Metadata for a referendum has been set. + */ + MetadataSet: PlainDescriptor>; + /** + *Metadata for a referendum has been cleared. + */ + MetadataCleared: PlainDescriptor>; + }; + Whitelist: { + /** + + */ + CallWhitelisted: PlainDescriptor>; + /** + + */ + WhitelistedCallRemoved: PlainDescriptor>; + /** + + */ + WhitelistedCallDispatched: PlainDescriptor>; + }; + Parameters: { + /** + *A Parameter was set. + * + *Is also emitted when the value was not changed. + */ + Updated: PlainDescriptor>; + }; + Claims: { + /** + *Someone claimed some DOTs. + */ + Claimed: PlainDescriptor>; + }; + Vesting: { + /** + *The amount vested has been updated. This could indicate a change in funds available. + *The balance given is the amount which is left unvested (and thus locked). + */ + VestingUpdated: PlainDescriptor>; + /** + *An \[account\] has become fully vested. + */ + VestingCompleted: PlainDescriptor>; + }; + Utility: { + /** + *Batch of dispatches did not complete fully. Index of first failing dispatch given, as + *well as the error. + */ + BatchInterrupted: PlainDescriptor>; + /** + *Batch of dispatches completed fully with no error. + */ + BatchCompleted: PlainDescriptor; + /** + *Batch of dispatches completed but has errors. + */ + BatchCompletedWithErrors: PlainDescriptor; + /** + *A single item within a Batch of dispatches has completed with no error. + */ + ItemCompleted: PlainDescriptor; + /** + *A single item within a Batch of dispatches has completed with error. + */ + ItemFailed: PlainDescriptor>; + /** + *A call was dispatched. + */ + DispatchedAs: PlainDescriptor>; + }; + Proxy: { + /** + *A proxy was executed correctly, with the given. + */ + ProxyExecuted: PlainDescriptor>; + /** + *A pure account has been created by new proxy with given + *disambiguation index and proxy type. + */ + PureCreated: PlainDescriptor>; + /** + *An announcement was placed to make a call in the future. + */ + Announced: PlainDescriptor>; + /** + *A proxy was added. + */ + ProxyAdded: PlainDescriptor>; + /** + *A proxy was removed. + */ + ProxyRemoved: PlainDescriptor>; + }; + Multisig: { + /** + *A new multisig operation has begun. + */ + NewMultisig: PlainDescriptor>; + /** + *A multisig operation has been approved by someone. + */ + MultisigApproval: PlainDescriptor>; + /** + *A multisig operation has been executed. + */ + MultisigExecuted: PlainDescriptor>; + /** + *A multisig operation has been cancelled. + */ + MultisigCancelled: PlainDescriptor>; + }; + Bounties: { + /** + *New bounty proposal. + */ + BountyProposed: PlainDescriptor>; + /** + *A bounty proposal was rejected; funds were slashed. + */ + BountyRejected: PlainDescriptor>; + /** + *A bounty proposal is funded and became active. + */ + BountyBecameActive: PlainDescriptor>; + /** + *A bounty is awarded to a beneficiary. + */ + BountyAwarded: PlainDescriptor>; + /** + *A bounty is claimed by beneficiary. + */ + BountyClaimed: PlainDescriptor>; + /** + *A bounty is cancelled. + */ + BountyCanceled: PlainDescriptor>; + /** + *A bounty expiry is extended. + */ + BountyExtended: PlainDescriptor>; + /** + *A bounty is approved. + */ + BountyApproved: PlainDescriptor>; + /** + *A bounty curator is proposed. + */ + CuratorProposed: PlainDescriptor>; + /** + *A bounty curator is unassigned. + */ + CuratorUnassigned: PlainDescriptor>; + /** + *A bounty curator is accepted. + */ + CuratorAccepted: PlainDescriptor>; + }; + ChildBounties: { + /** + *A child-bounty is added. + */ + Added: PlainDescriptor>; + /** + *A child-bounty is awarded to a beneficiary. + */ + Awarded: PlainDescriptor>; + /** + *A child-bounty is claimed by beneficiary. + */ + Claimed: PlainDescriptor>; + /** + *A child-bounty is cancelled. + */ + Canceled: PlainDescriptor>; + }; + ElectionProviderMultiPhase: { + /** + *A solution was stored with the given compute. + * + *The `origin` indicates the origin of the solution. If `origin` is `Some(AccountId)`, + *the stored solution was submitted in the signed phase by a miner with the `AccountId`. + *Otherwise, the solution was stored either during the unsigned phase or by + *`T::ForceOrigin`. The `bool` is `true` when a previous solution was ejected to make + *room for this one. + */ + SolutionStored: PlainDescriptor>; + /** + *The election has been finalized, with the given computation and score. + */ + ElectionFinalized: PlainDescriptor>; + /** + *An election failed. + * + *Not much can be said about which computes failed in the process. + */ + ElectionFailed: PlainDescriptor; + /** + *An account has been rewarded for their signed submission being finalized. + */ + Rewarded: PlainDescriptor>; + /** + *An account has been slashed for submitting an invalid signed submission. + */ + Slashed: PlainDescriptor>; + /** + *There was a phase transition in a given round. + */ + PhaseTransitioned: PlainDescriptor>; + }; + VoterList: { + /** + *Moved an account from one bag to another. + */ + Rebagged: PlainDescriptor>; + /** + *Updated the score of some account to the given amount. + */ + ScoreUpdated: PlainDescriptor>; + }; + NominationPools: { + /** + *A pool has been created. + */ + Created: PlainDescriptor>; + /** + *A member has became bonded in a pool. + */ + Bonded: PlainDescriptor>; + /** + *A payout has been made to a member. + */ + PaidOut: PlainDescriptor>; + /** + *A member has unbonded from their pool. + * + *- `balance` is the corresponding balance of the number of points that has been + * requested to be unbonded (the argument of the `unbond` transaction) from the bonded + * pool. + *- `points` is the number of points that are issued as a result of `balance` being + *dissolved into the corresponding unbonding pool. + *- `era` is the era in which the balance will be unbonded. + *In the absence of slashing, these values will match. In the presence of slashing, the + *number of points that are issued in the unbonding pool will be less than the amount + *requested to be unbonded. + */ + Unbonded: PlainDescriptor>; + /** + *A member has withdrawn from their pool. + * + *The given number of `points` have been dissolved in return of `balance`. + * + *Similar to `Unbonded` event, in the absence of slashing, the ratio of point to balance + *will be 1. + */ + Withdrawn: PlainDescriptor>; + /** + *A pool has been destroyed. + */ + Destroyed: PlainDescriptor>; + /** + *The state of a pool has changed + */ + StateChanged: PlainDescriptor>; + /** + *A member has been removed from a pool. + * + *The removal can be voluntary (withdrawn all unbonded funds) or involuntary (kicked). + */ + MemberRemoved: PlainDescriptor>; + /** + *The roles of a pool have been updated to the given new roles. Note that the depositor + *can never change. + */ + RolesUpdated: PlainDescriptor>; + /** + *The active balance of pool `pool_id` has been slashed to `balance`. + */ + PoolSlashed: PlainDescriptor>; + /** + *The unbond pool at `era` of pool `pool_id` has been slashed to `balance`. + */ + UnbondingPoolSlashed: PlainDescriptor>; + /** + *A pool's commission setting has been changed. + */ + PoolCommissionUpdated: PlainDescriptor>; + /** + *A pool's maximum commission setting has been changed. + */ + PoolMaxCommissionUpdated: PlainDescriptor>; + /** + *A pool's commission `change_rate` has been changed. + */ + PoolCommissionChangeRateUpdated: PlainDescriptor>; + /** + *Pool commission claim permission has been updated. + */ + PoolCommissionClaimPermissionUpdated: PlainDescriptor>; + /** + *Pool commission has been claimed. + */ + PoolCommissionClaimed: PlainDescriptor>; + /** + *Topped up deficit in frozen ED of the reward pool. + */ + MinBalanceDeficitAdjusted: PlainDescriptor>; + /** + *Claimed excess frozen ED of af the reward pool. + */ + MinBalanceExcessAdjusted: PlainDescriptor>; + }; + FastUnstake: { + /** + *A staker was unstaked. + */ + Unstaked: PlainDescriptor>; + /** + *A staker was slashed for requesting fast-unstake whilst being exposed. + */ + Slashed: PlainDescriptor>; + /** + *A batch was partially checked for the given eras, but the process did not finish. + */ + BatchChecked: PlainDescriptor>; + /** + *A batch of a given size was terminated. + * + *This is always follows by a number of `Unstaked` or `Slashed` events, marking the end + *of the batch. A new batch will be created upon next block. + */ + BatchFinished: PlainDescriptor>; + /** + *An internal error happened. Operations will be paused now. + */ + InternalError: PlainDescriptor; + }; + ParaInclusion: { + /** + *A candidate was backed. `[candidate, head_data]` + */ + CandidateBacked: PlainDescriptor>; + /** + *A candidate was included. `[candidate, head_data]` + */ + CandidateIncluded: PlainDescriptor>; + /** + *A candidate timed out. `[candidate, head_data]` + */ + CandidateTimedOut: PlainDescriptor>; + /** + *Some upward messages have been received and will be processed. + */ + UpwardMessagesReceived: PlainDescriptor>; + }; + Paras: { + /** + *Current code has been updated for a Para. `para_id` + */ + CurrentCodeUpdated: PlainDescriptor; + /** + *Current head has been updated for a Para. `para_id` + */ + CurrentHeadUpdated: PlainDescriptor; + /** + *A code upgrade has been scheduled for a Para. `para_id` + */ + CodeUpgradeScheduled: PlainDescriptor; + /** + *A new head has been noted for a Para. `para_id` + */ + NewHeadNoted: PlainDescriptor; + /** + *A para has been queued to execute pending actions. `para_id` + */ + ActionQueued: PlainDescriptor>; + /** + *The given para either initiated or subscribed to a PVF check for the given validation + *code. `code_hash` `para_id` + */ + PvfCheckStarted: PlainDescriptor>; + /** + *The given validation code was accepted by the PVF pre-checking vote. + *`code_hash` `para_id` + */ + PvfCheckAccepted: PlainDescriptor>; + /** + *The given validation code was rejected by the PVF pre-checking vote. + *`code_hash` `para_id` + */ + PvfCheckRejected: PlainDescriptor>; + }; + Hrmp: { + /** + *Open HRMP channel requested. + */ + OpenChannelRequested: PlainDescriptor>; + /** + *An HRMP channel request sent by the receiver was canceled by either party. + */ + OpenChannelCanceled: PlainDescriptor>; + /** + *Open HRMP channel accepted. + */ + OpenChannelAccepted: PlainDescriptor>; + /** + *HRMP channel closed. + */ + ChannelClosed: PlainDescriptor>; + /** + *An HRMP channel was opened via Root origin. + */ + HrmpChannelForceOpened: PlainDescriptor>; + /** + *An HRMP channel was opened with a system chain. + */ + HrmpSystemChannelOpened: PlainDescriptor>; + /** + *An HRMP channel's deposits were updated. + */ + OpenChannelDepositsUpdated: PlainDescriptor>; + }; + ParasDisputes: { + /** + *A dispute has been initiated. \[candidate hash, dispute location\] + */ + DisputeInitiated: PlainDescriptor>; + /** + *A dispute has concluded for or against a candidate. + *`\[para id, candidate hash, dispute result\]` + */ + DisputeConcluded: PlainDescriptor>; + /** + *A dispute has concluded with supermajority against a candidate. + *Block authors should no longer build on top of this head and should + *instead revert the block at the given height. This should be the + *number of the child of the last known valid block in the chain. + */ + Revert: PlainDescriptor; + }; + OnDemand: { + /** + *An order was placed at some spot price amount by orderer ordered_by + */ + OnDemandOrderPlaced: PlainDescriptor>; + /** + *The value of the spot price has likely changed + */ + SpotPriceSet: PlainDescriptor>; + }; + Registrar: { + /** + + */ + Registered: PlainDescriptor>; + /** + + */ + Deregistered: PlainDescriptor>; + /** + + */ + Reserved: PlainDescriptor>; + /** + + */ + Swapped: PlainDescriptor>; + }; + Slots: { + /** + *A new `[lease_period]` is beginning. + */ + NewLeasePeriod: PlainDescriptor>; + /** + *A para has won the right to a continuous set of lease periods as a parachain. + *First balance is any extra amount reserved on top of the para's existing deposit. + *Second balance is the total amount reserved. + */ + Leased: PlainDescriptor>; + }; + Auctions: { + /** + *An auction started. Provides its index and the block number where it will begin to + *close and the first lease period of the quadruplet that is auctioned. + */ + AuctionStarted: PlainDescriptor>; + /** + *An auction ended. All funds become unreserved. + */ + AuctionClosed: PlainDescriptor>; + /** + *Funds were reserved for a winning bid. First balance is the extra amount reserved. + *Second is the total. + */ + Reserved: PlainDescriptor>; + /** + *Funds were unreserved since bidder is no longer active. `[bidder, amount]` + */ + Unreserved: PlainDescriptor>; + /** + *Someone attempted to lease the same slot twice for a parachain. The amount is held in + *reserve but no parachain slot has been leased. + */ + ReserveConfiscated: PlainDescriptor>; + /** + *A new bid has been accepted as the current winner. + */ + BidAccepted: PlainDescriptor>; + /** + *The winning offset was chosen for an auction. This will map into the `Winning` storage + *map. + */ + WinningOffset: PlainDescriptor>; + }; + Crowdloan: { + /** + *Create a new crowdloaning campaign. + */ + Created: PlainDescriptor>; + /** + *Contributed to a crowd sale. + */ + Contributed: PlainDescriptor>; + /** + *Withdrew full balance of a contributor. + */ + Withdrew: PlainDescriptor>; + /** + *The loans in a fund have been partially dissolved, i.e. there are some left + *over child keys that still need to be killed. + */ + PartiallyRefunded: PlainDescriptor>; + /** + *All loans in a fund have been refunded. + */ + AllRefunded: PlainDescriptor>; + /** + *Fund is dissolved. + */ + Dissolved: PlainDescriptor>; + /** + *The result of trying to submit a new bid to the Slots pallet. + */ + HandleBidResult: PlainDescriptor>; + /** + *The configuration to a crowdloan has been edited. + */ + Edited: PlainDescriptor>; + /** + *A memo has been updated. + */ + MemoUpdated: PlainDescriptor>; + /** + *A parachain has been moved to `NewRaise` + */ + AddedToNewRaise: PlainDescriptor>; + }; + Coretime: { + /** + *The broker chain has asked for revenue information for a specific block. + */ + RevenueInfoRequested: PlainDescriptor>; + /** + *A core has received a new assignment from the broker chain. + */ + CoreAssigned: PlainDescriptor>; + }; + StateTrieMigration: { + /** + *Given number of `(top, child)` keys were migrated respectively, with the given + *`compute`. + */ + Migrated: PlainDescriptor>; + /** + *Some account got slashed by the given amount. + */ + Slashed: PlainDescriptor>; + /** + *The auto migration task finished. + */ + AutoMigrationFinished: PlainDescriptor; + /** + *Migration got halted due to an error or miss-configuration. + */ + Halted: PlainDescriptor>; + }; + XcmPallet: { + /** + *Execution of an XCM message was attempted. + */ + Attempted: PlainDescriptor>; + /** + *A XCM message was sent. + */ + Sent: PlainDescriptor>; + /** + *Query response received which does not match a registered query. This may be because a + *matching query was never registered, it may be because it is a duplicate response, or + *because the query timed out. + */ + UnexpectedResponse: PlainDescriptor>; + /** + *Query response has been received and is ready for taking with `take_response`. There is + *no registered notification call. + */ + ResponseReady: PlainDescriptor>; + /** + *Query response has been received and query is removed. The registered notification has + *been dispatched and executed successfully. + */ + Notified: PlainDescriptor>; + /** + *Query response has been received and query is removed. The registered notification + *could not be dispatched because the dispatch weight is greater than the maximum weight + *originally budgeted by this runtime for the query result. + */ + NotifyOverweight: PlainDescriptor>; + /** + *Query response has been received and query is removed. There was a general error with + *dispatching the notification call. + */ + NotifyDispatchError: PlainDescriptor>; + /** + *Query response has been received and query is removed. The dispatch was unable to be + *decoded into a `Call`; this might be due to dispatch function having a signature which + *is not `(origin, QueryId, Response)`. + */ + NotifyDecodeFailed: PlainDescriptor>; + /** + *Expected query response has been received but the origin location of the response does + *not match that expected. The query remains registered for a later, valid, response to + *be received and acted upon. + */ + InvalidResponder: PlainDescriptor>; + /** + *Expected query response has been received but the expected origin location placed in + *storage by this runtime previously cannot be decoded. The query remains registered. + * + *This is unexpected (since a location placed in storage in a previously executing + *runtime should be readable prior to query timeout) and dangerous since the possibly + *valid response will be dropped. Manual governance intervention is probably going to be + *needed. + */ + InvalidResponderVersion: PlainDescriptor>; + /** + *Received query response has been read and removed. + */ + ResponseTaken: PlainDescriptor>; + /** + *Some assets have been placed in an asset trap. + */ + AssetsTrapped: PlainDescriptor>; + /** + *An XCM version change notification message has been attempted to be sent. + * + *The cost of sending it (borne by the chain) is included. + */ + VersionChangeNotified: PlainDescriptor>; + /** + *The supported version of a location has been changed. This might be through an + *automatic notification or a manual intervention. + */ + SupportedVersionChanged: PlainDescriptor>; + /** + *A given location which had a version change subscription was dropped owing to an error + *sending the notification to it. + */ + NotifyTargetSendFail: PlainDescriptor>; + /** + *A given location which had a version change subscription was dropped owing to an error + *migrating the location to our new XCM format. + */ + NotifyTargetMigrationFail: PlainDescriptor>; + /** + *Expected query response has been received but the expected querier location placed in + *storage by this runtime previously cannot be decoded. The query remains registered. + * + *This is unexpected (since a location placed in storage in a previously executing + *runtime should be readable prior to query timeout) and dangerous since the possibly + *valid response will be dropped. Manual governance intervention is probably going to be + *needed. + */ + InvalidQuerierVersion: PlainDescriptor>; + /** + *Expected query response has been received but the querier location of the response does + *not match the expected. The query remains registered for a later, valid, response to + *be received and acted upon. + */ + InvalidQuerier: PlainDescriptor>; + /** + *A remote has requested XCM version change notification from us and we have honored it. + *A version information message is sent to them and its cost is included. + */ + VersionNotifyStarted: PlainDescriptor>; + /** + *We have requested that a remote chain send us XCM version change notifications. + */ + VersionNotifyRequested: PlainDescriptor>; + /** + *We have requested that a remote chain stops sending us XCM version change + *notifications. + */ + VersionNotifyUnrequested: PlainDescriptor>; + /** + *Fees were paid from a location for an operation (often for using `SendXcm`). + */ + FeesPaid: PlainDescriptor>; + /** + *Some assets have been claimed from an asset trap + */ + AssetsClaimed: PlainDescriptor>; + /** + *A XCM version migration finished. + */ + VersionMigrationFinished: PlainDescriptor>; + }; + MessageQueue: { + /** + *Message discarded due to an error in the `MessageProcessor` (usually a format error). + */ + ProcessingFailed: PlainDescriptor>; + /** + *Message is processed. + */ + Processed: PlainDescriptor>; + /** + *Message placed in overweight queue. + */ + OverweightEnqueued: PlainDescriptor>; + /** + *This page was reaped. + */ + PageReaped: PlainDescriptor>; + }; + AssetRate: { + /** + + */ + AssetRateCreated: PlainDescriptor>; + /** + + */ + AssetRateRemoved: PlainDescriptor>; + /** + + */ + AssetRateUpdated: PlainDescriptor>; + }; +}; +type IError = { + System: { + /** + *The name of specification does not match between the current runtime + *and the new runtime. + */ + InvalidSpecName: PlainDescriptor; + /** + *The specification version is not allowed to decrease between the current runtime + *and the new runtime. + */ + SpecVersionNeedsToIncrease: PlainDescriptor; + /** + *Failed to extract the runtime version from the new runtime. + * + *Either calling `Core_version` or decoding `RuntimeVersion` failed. + */ + FailedToExtractRuntimeVersion: PlainDescriptor; + /** + *Suicide called when the account has non-default composite data. + */ + NonDefaultComposite: PlainDescriptor; + /** + *There is a non-zero reference count preventing the account from being purged. + */ + NonZeroRefCount: PlainDescriptor; + /** + *The origin filter prevent the call to be dispatched. + */ + CallFiltered: PlainDescriptor; + /** + *A multi-block migration is ongoing and prevents the current code from being replaced. + */ + MultiBlockMigrationsOngoing: PlainDescriptor; + /** + *No upgrade authorized. + */ + NothingAuthorized: PlainDescriptor; + /** + *The submitted code is not authorized. + */ + Unauthorized: PlainDescriptor; + }; + Scheduler: { + /** + *Failed to schedule a call + */ + FailedToSchedule: PlainDescriptor; + /** + *Cannot find the scheduled call. + */ + NotFound: PlainDescriptor; + /** + *Given target block number is in the past. + */ + TargetBlockNumberInPast: PlainDescriptor; + /** + *Reschedule failed because it does not change scheduled time. + */ + RescheduleNoChange: PlainDescriptor; + /** + *Attempt to use a non-named function on a named task. + */ + Named: PlainDescriptor; + }; + Preimage: { + /** + *Preimage is too large to store on-chain. + */ + TooBig: PlainDescriptor; + /** + *Preimage has already been noted on-chain. + */ + AlreadyNoted: PlainDescriptor; + /** + *The user is not authorized to perform this action. + */ + NotAuthorized: PlainDescriptor; + /** + *The preimage cannot be removed since it has not yet been noted. + */ + NotNoted: PlainDescriptor; + /** + *A preimage may not be removed when there are outstanding requests. + */ + Requested: PlainDescriptor; + /** + *The preimage request cannot be removed since no outstanding requests exist. + */ + NotRequested: PlainDescriptor; + /** + *More than `MAX_HASH_UPGRADE_BULK_COUNT` hashes were requested to be upgraded at once. + */ + TooMany: PlainDescriptor; + /** + *Too few hashes were requested to be upgraded (i.e. zero). + */ + TooFew: PlainDescriptor; + /** + *No ticket with a cost was returned by [`Config::Consideration`] to store the preimage. + */ + NoCost: PlainDescriptor; + }; + Babe: { + /** + *An equivocation proof provided as part of an equivocation report is invalid. + */ + InvalidEquivocationProof: PlainDescriptor; + /** + *A key ownership proof provided as part of an equivocation report is invalid. + */ + InvalidKeyOwnershipProof: PlainDescriptor; + /** + *A given equivocation report is valid but already previously reported. + */ + DuplicateOffenceReport: PlainDescriptor; + /** + *Submitted configuration is invalid. + */ + InvalidConfiguration: PlainDescriptor; + }; + Indices: { + /** + *The index was not already assigned. + */ + NotAssigned: PlainDescriptor; + /** + *The index is assigned to another account. + */ + NotOwner: PlainDescriptor; + /** + *The index was not available. + */ + InUse: PlainDescriptor; + /** + *The source and destination accounts are identical. + */ + NotTransfer: PlainDescriptor; + /** + *The index is permanent and may not be freed/changed. + */ + Permanent: PlainDescriptor; + }; + Balances: { + /** + *Vesting balance too high to send value. + */ + VestingBalance: PlainDescriptor; + /** + *Account liquidity restrictions prevent withdrawal. + */ + LiquidityRestrictions: PlainDescriptor; + /** + *Balance too low to send value. + */ + InsufficientBalance: PlainDescriptor; + /** + *Value too low to create account due to existential deposit. + */ + ExistentialDeposit: PlainDescriptor; + /** + *Transfer/payment would kill account. + */ + Expendability: PlainDescriptor; + /** + *A vesting schedule already exists for this account. + */ + ExistingVestingSchedule: PlainDescriptor; + /** + *Beneficiary account must pre-exist. + */ + DeadAccount: PlainDescriptor; + /** + *Number of named reserves exceed `MaxReserves`. + */ + TooManyReserves: PlainDescriptor; + /** + *Number of holds exceed `VariantCountOf`. + */ + TooManyHolds: PlainDescriptor; + /** + *Number of freezes exceed `MaxFreezes`. + */ + TooManyFreezes: PlainDescriptor; + /** + *The issuance cannot be modified since it is already deactivated. + */ + IssuanceDeactivated: PlainDescriptor; + /** + *The delta cannot be zero. + */ + DeltaZero: PlainDescriptor; + }; + Staking: { + /** + *Not a controller account. + */ + NotController: PlainDescriptor; + /** + *Not a stash account. + */ + NotStash: PlainDescriptor; + /** + *Stash is already bonded. + */ + AlreadyBonded: PlainDescriptor; + /** + *Controller is already paired. + */ + AlreadyPaired: PlainDescriptor; + /** + *Targets cannot be empty. + */ + EmptyTargets: PlainDescriptor; + /** + *Duplicate index. + */ + DuplicateIndex: PlainDescriptor; + /** + *Slash record index out of bounds. + */ + InvalidSlashIndex: PlainDescriptor; + /** + *Cannot have a validator or nominator role, with value less than the minimum defined by + *governance (see `MinValidatorBond` and `MinNominatorBond`). If unbonding is the + *intention, `chill` first to remove one's role as validator/nominator. + */ + InsufficientBond: PlainDescriptor; + /** + *Can not schedule more unlock chunks. + */ + NoMoreChunks: PlainDescriptor; + /** + *Can not rebond without unlocking chunks. + */ + NoUnlockChunk: PlainDescriptor; + /** + *Attempting to target a stash that still has funds. + */ + FundedTarget: PlainDescriptor; + /** + *Invalid era to reward. + */ + InvalidEraToReward: PlainDescriptor; + /** + *Invalid number of nominations. + */ + InvalidNumberOfNominations: PlainDescriptor; + /** + *Items are not sorted and unique. + */ + NotSortedAndUnique: PlainDescriptor; + /** + *Rewards for this era have already been claimed for this validator. + */ + AlreadyClaimed: PlainDescriptor; + /** + *No nominators exist on this page. + */ + InvalidPage: PlainDescriptor; + /** + *Incorrect previous history depth input provided. + */ + IncorrectHistoryDepth: PlainDescriptor; + /** + *Incorrect number of slashing spans provided. + */ + IncorrectSlashingSpans: PlainDescriptor; + /** + *Internal state has become somehow corrupted and the operation cannot continue. + */ + BadState: PlainDescriptor; + /** + *Too many nomination targets supplied. + */ + TooManyTargets: PlainDescriptor; + /** + *A nomination target was supplied that was blocked or otherwise not a validator. + */ + BadTarget: PlainDescriptor; + /** + *The user has enough bond and thus cannot be chilled forcefully by an external person. + */ + CannotChillOther: PlainDescriptor; + /** + *There are too many nominators in the system. Governance needs to adjust the staking + *settings to keep things safe for the runtime. + */ + TooManyNominators: PlainDescriptor; + /** + *There are too many validator candidates in the system. Governance needs to adjust the + *staking settings to keep things safe for the runtime. + */ + TooManyValidators: PlainDescriptor; + /** + *Commission is too low. Must be at least `MinCommission`. + */ + CommissionTooLow: PlainDescriptor; + /** + *Some bound is not met. + */ + BoundNotMet: PlainDescriptor; + /** + *Used when attempting to use deprecated controller account logic. + */ + ControllerDeprecated: PlainDescriptor; + /** + *Cannot reset a ledger. + */ + CannotRestoreLedger: PlainDescriptor; + /** + *Provided reward destination is not allowed. + */ + RewardDestinationRestricted: PlainDescriptor; + /** + *Not enough funds available to withdraw. + */ + NotEnoughFunds: PlainDescriptor; + /** + *Operation not allowed for virtual stakers. + */ + VirtualStakerNotAllowed: PlainDescriptor; + }; + Session: { + /** + *Invalid ownership proof. + */ + InvalidProof: PlainDescriptor; + /** + *No associated validator ID for account. + */ + NoAssociatedValidatorId: PlainDescriptor; + /** + *Registered duplicate key. + */ + DuplicatedKey: PlainDescriptor; + /** + *No keys are associated with this account. + */ + NoKeys: PlainDescriptor; + /** + *Key setting account is not live, so it's impossible to associate keys. + */ + NoAccount: PlainDescriptor; + }; + Grandpa: { + /** + *Attempt to signal GRANDPA pause when the authority set isn't live + *(either paused or already pending pause). + */ + PauseFailed: PlainDescriptor; + /** + *Attempt to signal GRANDPA resume when the authority set isn't paused + *(either live or already pending resume). + */ + ResumeFailed: PlainDescriptor; + /** + *Attempt to signal GRANDPA change with one already pending. + */ + ChangePending: PlainDescriptor; + /** + *Cannot signal forced change so soon after last. + */ + TooSoon: PlainDescriptor; + /** + *A key ownership proof provided as part of an equivocation report is invalid. + */ + InvalidKeyOwnershipProof: PlainDescriptor; + /** + *An equivocation proof provided as part of an equivocation report is invalid. + */ + InvalidEquivocationProof: PlainDescriptor; + /** + *A given equivocation report is valid but already previously reported. + */ + DuplicateOffenceReport: PlainDescriptor; + }; + Treasury: { + /** + *No proposal, bounty or spend at that index. + */ + InvalidIndex: PlainDescriptor; + /** + *Too many approvals in the queue. + */ + TooManyApprovals: PlainDescriptor; + /** + *The spend origin is valid but the amount it is allowed to spend is lower than the + *amount to be spent. + */ + InsufficientPermission: PlainDescriptor; + /** + *Proposal has not been approved. + */ + ProposalNotApproved: PlainDescriptor; + /** + *The balance of the asset kind is not convertible to the balance of the native asset. + */ + FailedToConvertBalance: PlainDescriptor; + /** + *The spend has expired and cannot be claimed. + */ + SpendExpired: PlainDescriptor; + /** + *The spend is not yet eligible for payout. + */ + EarlyPayout: PlainDescriptor; + /** + *The payment has already been attempted. + */ + AlreadyAttempted: PlainDescriptor; + /** + *There was some issue with the mechanism of payment. + */ + PayoutError: PlainDescriptor; + /** + *The payout was not yet attempted/claimed. + */ + NotAttempted: PlainDescriptor; + /** + *The payment has neither failed nor succeeded yet. + */ + Inconclusive: PlainDescriptor; + }; + ConvictionVoting: { + /** + *Poll is not ongoing. + */ + NotOngoing: PlainDescriptor; + /** + *The given account did not vote on the poll. + */ + NotVoter: PlainDescriptor; + /** + *The actor has no permission to conduct the action. + */ + NoPermission: PlainDescriptor; + /** + *The actor has no permission to conduct the action right now but will do in the future. + */ + NoPermissionYet: PlainDescriptor; + /** + *The account is already delegating. + */ + AlreadyDelegating: PlainDescriptor; + /** + *The account currently has votes attached to it and the operation cannot succeed until + *these are removed through `remove_vote`. + */ + AlreadyVoting: PlainDescriptor; + /** + *Too high a balance was provided that the account cannot afford. + */ + InsufficientFunds: PlainDescriptor; + /** + *The account is not currently delegating. + */ + NotDelegating: PlainDescriptor; + /** + *Delegation to oneself makes no sense. + */ + Nonsense: PlainDescriptor; + /** + *Maximum number of votes reached. + */ + MaxVotesReached: PlainDescriptor; + /** + *The class must be supplied since it is not easily determinable from the state. + */ + ClassNeeded: PlainDescriptor; + /** + *The class ID supplied is invalid. + */ + BadClass: PlainDescriptor; + }; + Referenda: { + /** + *Referendum is not ongoing. + */ + NotOngoing: PlainDescriptor; + /** + *Referendum's decision deposit is already paid. + */ + HasDeposit: PlainDescriptor; + /** + *The track identifier given was invalid. + */ + BadTrack: PlainDescriptor; + /** + *There are already a full complement of referenda in progress for this track. + */ + Full: PlainDescriptor; + /** + *The queue of the track is empty. + */ + QueueEmpty: PlainDescriptor; + /** + *The referendum index provided is invalid in this context. + */ + BadReferendum: PlainDescriptor; + /** + *There was nothing to do in the advancement. + */ + NothingToDo: PlainDescriptor; + /** + *No track exists for the proposal origin. + */ + NoTrack: PlainDescriptor; + /** + *Any deposit cannot be refunded until after the decision is over. + */ + Unfinished: PlainDescriptor; + /** + *The deposit refunder is not the depositor. + */ + NoPermission: PlainDescriptor; + /** + *The deposit cannot be refunded since none was made. + */ + NoDeposit: PlainDescriptor; + /** + *The referendum status is invalid for this operation. + */ + BadStatus: PlainDescriptor; + /** + *The preimage does not exist. + */ + PreimageNotExist: PlainDescriptor; + /** + *The preimage is stored with a different length than the one provided. + */ + PreimageStoredWithDifferentLength: PlainDescriptor; + }; + Whitelist: { + /** + *The preimage of the call hash could not be loaded. + */ + UnavailablePreImage: PlainDescriptor; + /** + *The call could not be decoded. + */ + UndecodableCall: PlainDescriptor; + /** + *The weight of the decoded call was higher than the witness. + */ + InvalidCallWeightWitness: PlainDescriptor; + /** + *The call was not whitelisted. + */ + CallIsNotWhitelisted: PlainDescriptor; + /** + *The call was already whitelisted; No-Op. + */ + CallAlreadyWhitelisted: PlainDescriptor; + }; + Claims: { + /** + *Invalid Ethereum signature. + */ + InvalidEthereumSignature: PlainDescriptor; + /** + *Ethereum address has no claim. + */ + SignerHasNoClaim: PlainDescriptor; + /** + *Account ID sending transaction has no claim. + */ + SenderHasNoClaim: PlainDescriptor; + /** + *There's not enough in the pot to pay out some unvested amount. Generally implies a + *logic error. + */ + PotUnderflow: PlainDescriptor; + /** + *A needed statement was not included. + */ + InvalidStatement: PlainDescriptor; + /** + *The account already has a vested balance. + */ + VestedBalanceExists: PlainDescriptor; + }; + Vesting: { + /** + *The account given is not vesting. + */ + NotVesting: PlainDescriptor; + /** + *The account already has `MaxVestingSchedules` count of schedules and thus + *cannot add another one. Consider merging existing schedules in order to add another. + */ + AtMaxVestingSchedules: PlainDescriptor; + /** + *Amount being transferred is too low to create a vesting schedule. + */ + AmountLow: PlainDescriptor; + /** + *An index was out of bounds of the vesting schedules. + */ + ScheduleIndexOutOfBounds: PlainDescriptor; + /** + *Failed to create a new schedule because some parameter was invalid. + */ + InvalidScheduleParams: PlainDescriptor; + }; + Utility: { + /** + *Too many calls batched. + */ + TooManyCalls: PlainDescriptor; + }; + Proxy: { + /** + *There are too many proxies registered or too many announcements pending. + */ + TooMany: PlainDescriptor; + /** + *Proxy registration not found. + */ + NotFound: PlainDescriptor; + /** + *Sender is not a proxy of the account to be proxied. + */ + NotProxy: PlainDescriptor; + /** + *A call which is incompatible with the proxy type's filter was attempted. + */ + Unproxyable: PlainDescriptor; + /** + *Account is already a proxy. + */ + Duplicate: PlainDescriptor; + /** + *Call may not be made by proxy because it may escalate its privileges. + */ + NoPermission: PlainDescriptor; + /** + *Announcement, if made at all, was made too recently. + */ + Unannounced: PlainDescriptor; + /** + *Cannot add self as proxy. + */ + NoSelfProxy: PlainDescriptor; + }; + Multisig: { + /** + *Threshold must be 2 or greater. + */ + MinimumThreshold: PlainDescriptor; + /** + *Call is already approved by this signatory. + */ + AlreadyApproved: PlainDescriptor; + /** + *Call doesn't need any (more) approvals. + */ + NoApprovalsNeeded: PlainDescriptor; + /** + *There are too few signatories in the list. + */ + TooFewSignatories: PlainDescriptor; + /** + *There are too many signatories in the list. + */ + TooManySignatories: PlainDescriptor; + /** + *The signatories were provided out of order; they should be ordered. + */ + SignatoriesOutOfOrder: PlainDescriptor; + /** + *The sender was contained in the other signatories; it shouldn't be. + */ + SenderInSignatories: PlainDescriptor; + /** + *Multisig operation not found when attempting to cancel. + */ + NotFound: PlainDescriptor; + /** + *Only the account that originally created the multisig is able to cancel it. + */ + NotOwner: PlainDescriptor; + /** + *No timepoint was given, yet the multisig operation is already underway. + */ + NoTimepoint: PlainDescriptor; + /** + *A different timepoint was given to the multisig operation that is underway. + */ + WrongTimepoint: PlainDescriptor; + /** + *A timepoint was given, yet no multisig operation is underway. + */ + UnexpectedTimepoint: PlainDescriptor; + /** + *The maximum weight information provided was too low. + */ + MaxWeightTooLow: PlainDescriptor; + /** + *The data to be stored is already stored. + */ + AlreadyStored: PlainDescriptor; + }; + Bounties: { + /** + *Proposer's balance is too low. + */ + InsufficientProposersBalance: PlainDescriptor; + /** + *No proposal or bounty at that index. + */ + InvalidIndex: PlainDescriptor; + /** + *The reason given is just too big. + */ + ReasonTooBig: PlainDescriptor; + /** + *The bounty status is unexpected. + */ + UnexpectedStatus: PlainDescriptor; + /** + *Require bounty curator. + */ + RequireCurator: PlainDescriptor; + /** + *Invalid bounty value. + */ + InvalidValue: PlainDescriptor; + /** + *Invalid bounty fee. + */ + InvalidFee: PlainDescriptor; + /** + *A bounty payout is pending. + *To cancel the bounty, you must unassign and slash the curator. + */ + PendingPayout: PlainDescriptor; + /** + *The bounties cannot be claimed/closed because it's still in the countdown period. + */ + Premature: PlainDescriptor; + /** + *The bounty cannot be closed because it has active child bounties. + */ + HasActiveChildBounty: PlainDescriptor; + /** + *Too many approvals are already queued. + */ + TooManyQueued: PlainDescriptor; + }; + ChildBounties: { + /** + *The parent bounty is not in active state. + */ + ParentBountyNotActive: PlainDescriptor; + /** + *The bounty balance is not enough to add new child-bounty. + */ + InsufficientBountyBalance: PlainDescriptor; + /** + *Number of child bounties exceeds limit `MaxActiveChildBountyCount`. + */ + TooManyChildBounties: PlainDescriptor; + }; + ElectionProviderMultiPhase: { + /** + *Submission was too early. + */ + PreDispatchEarlySubmission: PlainDescriptor; + /** + *Wrong number of winners presented. + */ + PreDispatchWrongWinnerCount: PlainDescriptor; + /** + *Submission was too weak, score-wise. + */ + PreDispatchWeakSubmission: PlainDescriptor; + /** + *The queue was full, and the solution was not better than any of the existing ones. + */ + SignedQueueFull: PlainDescriptor; + /** + *The origin failed to pay the deposit. + */ + SignedCannotPayDeposit: PlainDescriptor; + /** + *Witness data to dispatchable is invalid. + */ + SignedInvalidWitness: PlainDescriptor; + /** + *The signed submission consumes too much weight + */ + SignedTooMuchWeight: PlainDescriptor; + /** + *OCW submitted solution for wrong round + */ + OcwCallWrongEra: PlainDescriptor; + /** + *Snapshot metadata should exist but didn't. + */ + MissingSnapshotMetadata: PlainDescriptor; + /** + *`Self::insert_submission` returned an invalid index. + */ + InvalidSubmissionIndex: PlainDescriptor; + /** + *The call is not allowed at this point. + */ + CallNotAllowed: PlainDescriptor; + /** + *The fallback failed + */ + FallbackFailed: PlainDescriptor; + /** + *Some bound not met + */ + BoundNotMet: PlainDescriptor; + /** + *Submitted solution has too many winners + */ + TooManyWinners: PlainDescriptor; + /** + *Submission was prepared for a different round. + */ + PreDispatchDifferentRound: PlainDescriptor; + }; + VoterList: { + /** + *A error in the list interface implementation. + */ + List: PlainDescriptor; + }; + NominationPools: { + /** + *A (bonded) pool id does not exist. + */ + PoolNotFound: PlainDescriptor; + /** + *An account is not a member. + */ + PoolMemberNotFound: PlainDescriptor; + /** + *A reward pool does not exist. In all cases this is a system logic error. + */ + RewardPoolNotFound: PlainDescriptor; + /** + *A sub pool does not exist. + */ + SubPoolsNotFound: PlainDescriptor; + /** + *An account is already delegating in another pool. An account may only belong to one + *pool at a time. + */ + AccountBelongsToOtherPool: PlainDescriptor; + /** + *The member is fully unbonded (and thus cannot access the bonded and reward pool + *anymore to, for example, collect rewards). + */ + FullyUnbonding: PlainDescriptor; + /** + *The member cannot unbond further chunks due to reaching the limit. + */ + MaxUnbondingLimit: PlainDescriptor; + /** + *None of the funds can be withdrawn yet because the bonding duration has not passed. + */ + CannotWithdrawAny: PlainDescriptor; + /** + *The amount does not meet the minimum bond to either join or create a pool. + * + *The depositor can never unbond to a value less than `Pallet::depositor_min_bond`. The + *caller does not have nominating permissions for the pool. Members can never unbond to a + *value below `MinJoinBond`. + */ + MinimumBondNotMet: PlainDescriptor; + /** + *The transaction could not be executed due to overflow risk for the pool. + */ + OverflowRisk: PlainDescriptor; + /** + *A pool must be in [`PoolState::Destroying`] in order for the depositor to unbond or for + *other members to be permissionlessly unbonded. + */ + NotDestroying: PlainDescriptor; + /** + *The caller does not have nominating permissions for the pool. + */ + NotNominator: PlainDescriptor; + /** + *Either a) the caller cannot make a valid kick or b) the pool is not destroying. + */ + NotKickerOrDestroying: PlainDescriptor; + /** + *The pool is not open to join + */ + NotOpen: PlainDescriptor; + /** + *The system is maxed out on pools. + */ + MaxPools: PlainDescriptor; + /** + *Too many members in the pool or system. + */ + MaxPoolMembers: PlainDescriptor; + /** + *The pools state cannot be changed. + */ + CanNotChangeState: PlainDescriptor; + /** + *The caller does not have adequate permissions. + */ + DoesNotHavePermission: PlainDescriptor; + /** + *Metadata exceeds [`Config::MaxMetadataLen`] + */ + MetadataExceedsMaxLen: PlainDescriptor; + /** + *Some error occurred that should never happen. This should be reported to the + *maintainers. + */ + Defensive: PlainDescriptor>; + /** + *Partial unbonding now allowed permissionlessly. + */ + PartialUnbondNotAllowedPermissionlessly: PlainDescriptor; + /** + *The pool's max commission cannot be set higher than the existing value. + */ + MaxCommissionRestricted: PlainDescriptor; + /** + *The supplied commission exceeds the max allowed commission. + */ + CommissionExceedsMaximum: PlainDescriptor; + /** + *The supplied commission exceeds global maximum commission. + */ + CommissionExceedsGlobalMaximum: PlainDescriptor; + /** + *Not enough blocks have surpassed since the last commission update. + */ + CommissionChangeThrottled: PlainDescriptor; + /** + *The submitted changes to commission change rate are not allowed. + */ + CommissionChangeRateNotAllowed: PlainDescriptor; + /** + *There is no pending commission to claim. + */ + NoPendingCommission: PlainDescriptor; + /** + *No commission current has been set. + */ + NoCommissionCurrentSet: PlainDescriptor; + /** + *Pool id currently in use. + */ + PoolIdInUse: PlainDescriptor; + /** + *Pool id provided is not correct/usable. + */ + InvalidPoolId: PlainDescriptor; + /** + *Bonding extra is restricted to the exact pending reward amount. + */ + BondExtraRestricted: PlainDescriptor; + /** + *No imbalance in the ED deposit for the pool. + */ + NothingToAdjust: PlainDescriptor; + /** + *No slash pending that can be applied to the member. + */ + NothingToSlash: PlainDescriptor; + /** + *The pool or member delegation has already migrated to delegate stake. + */ + AlreadyMigrated: PlainDescriptor; + /** + *The pool or member delegation has not migrated yet to delegate stake. + */ + NotMigrated: PlainDescriptor; + /** + *This call is not allowed in the current state of the pallet. + */ + NotSupported: PlainDescriptor; + }; + FastUnstake: { + /** + *The provided Controller account was not found. + * + *This means that the given account is not bonded. + */ + NotController: PlainDescriptor; + /** + *The bonded account has already been queued. + */ + AlreadyQueued: PlainDescriptor; + /** + *The bonded account has active unlocking chunks. + */ + NotFullyBonded: PlainDescriptor; + /** + *The provided un-staker is not in the `Queue`. + */ + NotQueued: PlainDescriptor; + /** + *The provided un-staker is already in Head, and cannot deregister. + */ + AlreadyHead: PlainDescriptor; + /** + *The call is not allowed at this point because the pallet is not active. + */ + CallNotAllowed: PlainDescriptor; + }; + Configuration: { + /** + *The new value for a configuration parameter is invalid. + */ + InvalidNewValue: PlainDescriptor; + }; + ParaInclusion: { + /** + *Validator index out of bounds. + */ + ValidatorIndexOutOfBounds: PlainDescriptor; + /** + *Candidate submitted but para not scheduled. + */ + UnscheduledCandidate: PlainDescriptor; + /** + *Head data exceeds the configured maximum. + */ + HeadDataTooLarge: PlainDescriptor; + /** + *Code upgrade prematurely. + */ + PrematureCodeUpgrade: PlainDescriptor; + /** + *Output code is too large + */ + NewCodeTooLarge: PlainDescriptor; + /** + *The candidate's relay-parent was not allowed. Either it was + *not recent enough or it didn't advance based on the last parachain block. + */ + DisallowedRelayParent: PlainDescriptor; + /** + *Failed to compute group index for the core: either it's out of bounds + *or the relay parent doesn't belong to the current session. + */ + InvalidAssignment: PlainDescriptor; + /** + *Invalid group index in core assignment. + */ + InvalidGroupIndex: PlainDescriptor; + /** + *Insufficient (non-majority) backing. + */ + InsufficientBacking: PlainDescriptor; + /** + *Invalid (bad signature, unknown validator, etc.) backing. + */ + InvalidBacking: PlainDescriptor; + /** + *Collator did not sign PoV. + */ + NotCollatorSigned: PlainDescriptor; + /** + *The validation data hash does not match expected. + */ + ValidationDataHashMismatch: PlainDescriptor; + /** + *The downward message queue is not processed correctly. + */ + IncorrectDownwardMessageHandling: PlainDescriptor; + /** + *At least one upward message sent does not pass the acceptance criteria. + */ + InvalidUpwardMessages: PlainDescriptor; + /** + *The candidate didn't follow the rules of HRMP watermark advancement. + */ + HrmpWatermarkMishandling: PlainDescriptor; + /** + *The HRMP messages sent by the candidate is not valid. + */ + InvalidOutboundHrmp: PlainDescriptor; + /** + *The validation code hash of the candidate is not valid. + */ + InvalidValidationCodeHash: PlainDescriptor; + /** + *The `para_head` hash in the candidate descriptor doesn't match the hash of the actual + *para head in the commitments. + */ + ParaHeadMismatch: PlainDescriptor; + }; + ParaInherent: { + /** + *Inclusion inherent called more than once per block. + */ + TooManyInclusionInherents: PlainDescriptor; + /** + *The hash of the submitted parent header doesn't correspond to the saved block hash of + *the parent. + */ + InvalidParentHeader: PlainDescriptor; + /** + *The data given to the inherent will result in an overweight block. + */ + InherentOverweight: PlainDescriptor; + /** + *A candidate was filtered during inherent execution. This should have only been done + *during creation. + */ + CandidatesFilteredDuringExecution: PlainDescriptor; + /** + *Too many candidates supplied. + */ + UnscheduledCandidate: PlainDescriptor; + }; + Paras: { + /** + *Para is not registered in our system. + */ + NotRegistered: PlainDescriptor; + /** + *Para cannot be onboarded because it is already tracked by our system. + */ + CannotOnboard: PlainDescriptor; + /** + *Para cannot be offboarded at this time. + */ + CannotOffboard: PlainDescriptor; + /** + *Para cannot be upgraded to a lease holding parachain. + */ + CannotUpgrade: PlainDescriptor; + /** + *Para cannot be downgraded to an on-demand parachain. + */ + CannotDowngrade: PlainDescriptor; + /** + *The statement for PVF pre-checking is stale. + */ + PvfCheckStatementStale: PlainDescriptor; + /** + *The statement for PVF pre-checking is for a future session. + */ + PvfCheckStatementFuture: PlainDescriptor; + /** + *Claimed validator index is out of bounds. + */ + PvfCheckValidatorIndexOutOfBounds: PlainDescriptor; + /** + *The signature for the PVF pre-checking is invalid. + */ + PvfCheckInvalidSignature: PlainDescriptor; + /** + *The given validator already has cast a vote. + */ + PvfCheckDoubleVote: PlainDescriptor; + /** + *The given PVF does not exist at the moment of process a vote. + */ + PvfCheckSubjectInvalid: PlainDescriptor; + /** + *Parachain cannot currently schedule a code upgrade. + */ + CannotUpgradeCode: PlainDescriptor; + /** + *Invalid validation code size. + */ + InvalidCode: PlainDescriptor; + }; + Hrmp: { + /** + *The sender tried to open a channel to themselves. + */ + OpenHrmpChannelToSelf: PlainDescriptor; + /** + *The recipient is not a valid para. + */ + OpenHrmpChannelInvalidRecipient: PlainDescriptor; + /** + *The requested capacity is zero. + */ + OpenHrmpChannelZeroCapacity: PlainDescriptor; + /** + *The requested capacity exceeds the global limit. + */ + OpenHrmpChannelCapacityExceedsLimit: PlainDescriptor; + /** + *The requested maximum message size is 0. + */ + OpenHrmpChannelZeroMessageSize: PlainDescriptor; + /** + *The open request requested the message size that exceeds the global limit. + */ + OpenHrmpChannelMessageSizeExceedsLimit: PlainDescriptor; + /** + *The channel already exists + */ + OpenHrmpChannelAlreadyExists: PlainDescriptor; + /** + *There is already a request to open the same channel. + */ + OpenHrmpChannelAlreadyRequested: PlainDescriptor; + /** + *The sender already has the maximum number of allowed outbound channels. + */ + OpenHrmpChannelLimitExceeded: PlainDescriptor; + /** + *The channel from the sender to the origin doesn't exist. + */ + AcceptHrmpChannelDoesntExist: PlainDescriptor; + /** + *The channel is already confirmed. + */ + AcceptHrmpChannelAlreadyConfirmed: PlainDescriptor; + /** + *The recipient already has the maximum number of allowed inbound channels. + */ + AcceptHrmpChannelLimitExceeded: PlainDescriptor; + /** + *The origin tries to close a channel where it is neither the sender nor the recipient. + */ + CloseHrmpChannelUnauthorized: PlainDescriptor; + /** + *The channel to be closed doesn't exist. + */ + CloseHrmpChannelDoesntExist: PlainDescriptor; + /** + *The channel close request is already requested. + */ + CloseHrmpChannelAlreadyUnderway: PlainDescriptor; + /** + *Canceling is requested by neither the sender nor recipient of the open channel request. + */ + CancelHrmpOpenChannelUnauthorized: PlainDescriptor; + /** + *The open request doesn't exist. + */ + OpenHrmpChannelDoesntExist: PlainDescriptor; + /** + *Cannot cancel an HRMP open channel request because it is already confirmed. + */ + OpenHrmpChannelAlreadyConfirmed: PlainDescriptor; + /** + *The provided witness data is wrong. + */ + WrongWitness: PlainDescriptor; + /** + *The channel between these two chains cannot be authorized. + */ + ChannelCreationNotAuthorized: PlainDescriptor; + }; + ParasDisputes: { + /** + *Duplicate dispute statement sets provided. + */ + DuplicateDisputeStatementSets: PlainDescriptor; + /** + *Ancient dispute statement provided. + */ + AncientDisputeStatement: PlainDescriptor; + /** + *Validator index on statement is out of bounds for session. + */ + ValidatorIndexOutOfBounds: PlainDescriptor; + /** + *Invalid signature on statement. + */ + InvalidSignature: PlainDescriptor; + /** + *Validator vote submitted more than once to dispute. + */ + DuplicateStatement: PlainDescriptor; + /** + *A dispute where there are only votes on one side. + */ + SingleSidedDispute: PlainDescriptor; + /** + *A dispute vote from a malicious backer. + */ + MaliciousBacker: PlainDescriptor; + /** + *No backing votes were provides along dispute statements. + */ + MissingBackingVotes: PlainDescriptor; + /** + *Unconfirmed dispute statement sets provided. + */ + UnconfirmedDispute: PlainDescriptor; + }; + ParasSlashing: { + /** + *The key ownership proof is invalid. + */ + InvalidKeyOwnershipProof: PlainDescriptor; + /** + *The session index is too old or invalid. + */ + InvalidSessionIndex: PlainDescriptor; + /** + *The candidate hash is invalid. + */ + InvalidCandidateHash: PlainDescriptor; + /** + *There is no pending slash for the given validator index and time + *slot. + */ + InvalidValidatorIndex: PlainDescriptor; + /** + *The validator index does not match the validator id. + */ + ValidatorIndexIdMismatch: PlainDescriptor; + /** + *The given slashing report is valid but already previously reported. + */ + DuplicateSlashingReport: PlainDescriptor; + }; + OnDemand: { + /** + *The order queue is full, `place_order` will not continue. + */ + QueueFull: PlainDescriptor; + /** + *The current spot price is higher than the max amount specified in the `place_order` + *call, making it invalid. + */ + SpotPriceHigherThanMaxAmount: PlainDescriptor; + }; + CoretimeAssignmentProvider: { + /** + + */ + AssignmentsEmpty: PlainDescriptor; + /** + *Assignments together exceeded 57600. + */ + OverScheduled: PlainDescriptor; + /** + *Assignments together less than 57600 + */ + UnderScheduled: PlainDescriptor; + /** + *assign_core is only allowed to append new assignments at the end of already existing + *ones. + */ + DisallowedInsert: PlainDescriptor; + /** + *Tried to insert a schedule for the same core and block number as an existing schedule + */ + DuplicateInsert: PlainDescriptor; + /** + *Tried to add an unsorted set of assignments + */ + AssignmentsNotSorted: PlainDescriptor; + }; + Registrar: { + /** + *The ID is not registered. + */ + NotRegistered: PlainDescriptor; + /** + *The ID is already registered. + */ + AlreadyRegistered: PlainDescriptor; + /** + *The caller is not the owner of this Id. + */ + NotOwner: PlainDescriptor; + /** + *Invalid para code size. + */ + CodeTooLarge: PlainDescriptor; + /** + *Invalid para head data size. + */ + HeadDataTooLarge: PlainDescriptor; + /** + *Para is not a Parachain. + */ + NotParachain: PlainDescriptor; + /** + *Para is not a Parathread (on-demand parachain). + */ + NotParathread: PlainDescriptor; + /** + *Cannot deregister para + */ + CannotDeregister: PlainDescriptor; + /** + *Cannot schedule downgrade of lease holding parachain to on-demand parachain + */ + CannotDowngrade: PlainDescriptor; + /** + *Cannot schedule upgrade of on-demand parachain to lease holding parachain + */ + CannotUpgrade: PlainDescriptor; + /** + *Para is locked from manipulation by the manager. Must use parachain or relay chain + *governance. + */ + ParaLocked: PlainDescriptor; + /** + *The ID given for registration has not been reserved. + */ + NotReserved: PlainDescriptor; + /** + *The validation code is invalid. + */ + InvalidCode: PlainDescriptor; + /** + *Cannot perform a parachain slot / lifecycle swap. Check that the state of both paras + *are correct for the swap to work. + */ + CannotSwap: PlainDescriptor; + }; + Slots: { + /** + *The parachain ID is not onboarding. + */ + ParaNotOnboarding: PlainDescriptor; + /** + *There was an error with the lease. + */ + LeaseError: PlainDescriptor; + }; + Auctions: { + /** + *This auction is already in progress. + */ + AuctionInProgress: PlainDescriptor; + /** + *The lease period is in the past. + */ + LeasePeriodInPast: PlainDescriptor; + /** + *Para is not registered + */ + ParaNotRegistered: PlainDescriptor; + /** + *Not a current auction. + */ + NotCurrentAuction: PlainDescriptor; + /** + *Not an auction. + */ + NotAuction: PlainDescriptor; + /** + *Auction has already ended. + */ + AuctionEnded: PlainDescriptor; + /** + *The para is already leased out for part of this range. + */ + AlreadyLeasedOut: PlainDescriptor; + }; + Crowdloan: { + /** + *The current lease period is more than the first lease period. + */ + FirstPeriodInPast: PlainDescriptor; + /** + *The first lease period needs to at least be less than 3 `max_value`. + */ + FirstPeriodTooFarInFuture: PlainDescriptor; + /** + *Last lease period must be greater than first lease period. + */ + LastPeriodBeforeFirstPeriod: PlainDescriptor; + /** + *The last lease period cannot be more than 3 periods after the first period. + */ + LastPeriodTooFarInFuture: PlainDescriptor; + /** + *The campaign ends before the current block number. The end must be in the future. + */ + CannotEndInPast: PlainDescriptor; + /** + *The end date for this crowdloan is not sensible. + */ + EndTooFarInFuture: PlainDescriptor; + /** + *There was an overflow. + */ + Overflow: PlainDescriptor; + /** + *The contribution was below the minimum, `MinContribution`. + */ + ContributionTooSmall: PlainDescriptor; + /** + *Invalid fund index. + */ + InvalidParaId: PlainDescriptor; + /** + *Contributions exceed maximum amount. + */ + CapExceeded: PlainDescriptor; + /** + *The contribution period has already ended. + */ + ContributionPeriodOver: PlainDescriptor; + /** + *The origin of this call is invalid. + */ + InvalidOrigin: PlainDescriptor; + /** + *This crowdloan does not correspond to a parachain. + */ + NotParachain: PlainDescriptor; + /** + *This parachain lease is still active and retirement cannot yet begin. + */ + LeaseActive: PlainDescriptor; + /** + *This parachain's bid or lease is still active and withdraw cannot yet begin. + */ + BidOrLeaseActive: PlainDescriptor; + /** + *The crowdloan has not yet ended. + */ + FundNotEnded: PlainDescriptor; + /** + *There are no contributions stored in this crowdloan. + */ + NoContributions: PlainDescriptor; + /** + *The crowdloan is not ready to dissolve. Potentially still has a slot or in retirement + *period. + */ + NotReadyToDissolve: PlainDescriptor; + /** + *Invalid signature. + */ + InvalidSignature: PlainDescriptor; + /** + *The provided memo is too large. + */ + MemoTooLarge: PlainDescriptor; + /** + *The fund is already in `NewRaise` + */ + AlreadyInNewRaise: PlainDescriptor; + /** + *No contributions allowed during the VRF delay + */ + VrfDelayInProgress: PlainDescriptor; + /** + *A lease period has not started yet, due to an offset in the starting block. + */ + NoLeasePeriod: PlainDescriptor; + }; + Coretime: { + /** + *The paraid making the call is not the coretime brokerage system parachain. + */ + NotBroker: PlainDescriptor; + /** + *Requested revenue information `when` parameter was in the future from the current + *block height. + */ + RequestedFutureRevenue: PlainDescriptor; + /** + *Failed to transfer assets to the coretime chain + */ + AssetTransferFailed: PlainDescriptor; + }; + StateTrieMigration: { + /** + *Max signed limits not respected. + */ + MaxSignedLimits: PlainDescriptor; + /** + *A key was longer than the configured maximum. + * + *This means that the migration halted at the current [`Progress`] and + *can be resumed with a larger [`crate::Config::MaxKeyLen`] value. + *Retrying with the same [`crate::Config::MaxKeyLen`] value will not work. + *The value should only be increased to avoid a storage migration for the currently + *stored [`crate::Progress::LastKey`]. + */ + KeyTooLong: PlainDescriptor; + /** + *submitter does not have enough funds. + */ + NotEnoughFunds: PlainDescriptor; + /** + *Bad witness data provided. + */ + BadWitness: PlainDescriptor; + /** + *Signed migration is not allowed because the maximum limit is not set yet. + */ + SignedMigrationNotAllowed: PlainDescriptor; + /** + *Bad child root provided. + */ + BadChildRoot: PlainDescriptor; + }; + XcmPallet: { + /** + *The desired destination was unreachable, generally because there is a no way of routing + *to it. + */ + Unreachable: PlainDescriptor; + /** + *There was some other issue (i.e. not to do with routing) in sending the message. + *Perhaps a lack of space for buffering the message. + */ + SendFailure: PlainDescriptor; + /** + *The message execution fails the filter. + */ + Filtered: PlainDescriptor; + /** + *The message's weight could not be determined. + */ + UnweighableMessage: PlainDescriptor; + /** + *The destination `Location` provided cannot be inverted. + */ + DestinationNotInvertible: PlainDescriptor; + /** + *The assets to be sent are empty. + */ + Empty: PlainDescriptor; + /** + *Could not re-anchor the assets to declare the fees for the destination chain. + */ + CannotReanchor: PlainDescriptor; + /** + *Too many assets have been attempted for transfer. + */ + TooManyAssets: PlainDescriptor; + /** + *Origin is invalid for sending. + */ + InvalidOrigin: PlainDescriptor; + /** + *The version of the `Versioned` value used is not able to be interpreted. + */ + BadVersion: PlainDescriptor; + /** + *The given location could not be used (e.g. because it cannot be expressed in the + *desired version of XCM). + */ + BadLocation: PlainDescriptor; + /** + *The referenced subscription could not be found. + */ + NoSubscription: PlainDescriptor; + /** + *The location is invalid since it already has a subscription from us. + */ + AlreadySubscribed: PlainDescriptor; + /** + *Could not check-out the assets for teleportation to the destination chain. + */ + CannotCheckOutTeleport: PlainDescriptor; + /** + *The owner does not own (all) of the asset that they wish to do the operation on. + */ + LowBalance: PlainDescriptor; + /** + *The asset owner has too many locks on the asset. + */ + TooManyLocks: PlainDescriptor; + /** + *The given account is not an identifiable sovereign account for any location. + */ + AccountNotSovereign: PlainDescriptor; + /** + *The operation required fees to be paid which the initiator could not meet. + */ + FeesNotMet: PlainDescriptor; + /** + *A remote lock with the corresponding data could not be found. + */ + LockNotFound: PlainDescriptor; + /** + *The unlock operation cannot succeed because there are still consumers of the lock. + */ + InUse: PlainDescriptor; + /** + *Invalid asset, reserve chain could not be determined for it. + */ + InvalidAssetUnknownReserve: PlainDescriptor; + /** + *Invalid asset, do not support remote asset reserves with different fees reserves. + */ + InvalidAssetUnsupportedReserve: PlainDescriptor; + /** + *Too many assets with different reserve locations have been attempted for transfer. + */ + TooManyReserves: PlainDescriptor; + /** + *Local XCM execution incomplete. + */ + LocalExecutionIncomplete: PlainDescriptor; + }; + MessageQueue: { + /** + *Page is not reapable because it has items remaining to be processed and is not old + *enough. + */ + NotReapable: PlainDescriptor; + /** + *Page to be reaped does not exist. + */ + NoPage: PlainDescriptor; + /** + *The referenced message could not be found. + */ + NoMessage: PlainDescriptor; + /** + *The message was already processed and cannot be processed again. + */ + AlreadyProcessed: PlainDescriptor; + /** + *The message is queued for future execution. + */ + Queued: PlainDescriptor; + /** + *There is temporarily not enough weight to continue servicing messages. + */ + InsufficientWeight: PlainDescriptor; + /** + *This message is temporarily unprocessable. + * + *Such errors are expected, but not guaranteed, to resolve themselves eventually through + *retrying. + */ + TemporarilyUnprocessable: PlainDescriptor; + /** + *The queue is paused and no message can be executed from it. + * + *This can change at any time and may resolve in the future by re-trying. + */ + QueuePaused: PlainDescriptor; + /** + *Another call is in progress and needs to finish before this call can happen. + */ + RecursiveDisallowed: PlainDescriptor; + }; + AssetRate: { + /** + *The given asset ID is unknown. + */ + UnknownAssetKind: PlainDescriptor; + /** + *The given asset ID already has an assigned conversion rate and cannot be re-created. + */ + AlreadyExists: PlainDescriptor; + /** + *Overflow ocurred when calculating the inverse rate. + */ + Overflow: PlainDescriptor; + }; + Beefy: { + /** + *A key ownership proof provided as part of an equivocation report is invalid. + */ + InvalidKeyOwnershipProof: PlainDescriptor; + /** + *An equivocation proof provided as part of an equivocation report is invalid. + */ + InvalidEquivocationProof: PlainDescriptor; + /** + *A given equivocation report is valid but already previously reported. + */ + DuplicateOffenceReport: PlainDescriptor; + /** + *Submitted configuration is invalid. + */ + InvalidConfiguration: PlainDescriptor; + }; +}; +type IConstants = { + System: { + /** + * Block & extrinsics weights: base values and limits. + */ + BlockWeights: PlainDescriptor>; + /** + * The maximum length of a block (in bytes). + */ + BlockLength: PlainDescriptor>; + /** + * Maximum number of block number to block hash mappings to keep (oldest pruned first). + */ + BlockHashCount: PlainDescriptor; + /** + * The weight of runtime database operations the runtime can invoke. + */ + DbWeight: PlainDescriptor>; + /** + * Get the chain's in-code version. + */ + Version: PlainDescriptor>; + /** + * The designated SS58 prefix of this chain. + * + * This replaces the "ss58Format" property declared in the chain spec. Reason is + * that the runtime should know about the prefix in order to make use of it as + * an identifier of the chain. + */ + SS58Prefix: PlainDescriptor; + }; + Scheduler: { + /** + * The maximum weight that may be scheduled per block for any dispatchables. + */ + MaximumWeight: PlainDescriptor>; + /** + * The maximum number of scheduled calls in the queue for a single block. + * + * NOTE: + * + Dependent pallets' benchmarks might require a higher limit for the setting. Set a + * higher limit under `runtime-benchmarks` feature. + */ + MaxScheduledPerBlock: PlainDescriptor; + }; + Babe: { + /** + * The amount of time, in slots, that each epoch should last. + * NOTE: Currently it is not possible to change the epoch duration after + * the chain has started. Attempting to do so will brick block production. + */ + EpochDuration: PlainDescriptor; + /** + * The expected average block time at which BABE should be creating + * blocks. Since BABE is probabilistic it is not trivial to figure out + * what the expected average block time should be based on the slot + * duration and the security parameter `c` (where `1 - c` represents + * the probability of a slot being empty). + */ + ExpectedBlockTime: PlainDescriptor; + /** + * Max number of authorities allowed + */ + MaxAuthorities: PlainDescriptor; + /** + * The maximum number of nominators for each validator. + */ + MaxNominators: PlainDescriptor; + }; + Timestamp: { + /** + * The minimum period between blocks. + * + * Be aware that this is different to the *expected* period that the block production + * apparatus provides. Your chosen consensus system will generally work with this to + * determine a sensible block time. For example, in the Aura pallet it will be double this + * period on default settings. + */ + MinimumPeriod: PlainDescriptor; + }; + Indices: { + /** + * The deposit needed for reserving an index. + */ + Deposit: PlainDescriptor; + }; + Balances: { + /** + * The minimum amount required to keep an account open. MUST BE GREATER THAN ZERO! + * + * If you *really* need it to be zero, you can enable the feature `insecure_zero_ed` for + * this pallet. However, you do so at your own risk: this will open up a major DoS vector. + * In case you have multiple sources of provider references, you may also get unexpected + * behaviour if you set this to zero. + * + * Bottom line: Do yourself a favour and make it at least one! + */ + ExistentialDeposit: PlainDescriptor; + /** + * The maximum number of locks that should exist on an account. + * Not strictly enforced, but used for weight estimation. + * + * Use of locks is deprecated in favour of freezes. See `https://github.com/paritytech/substrate/pull/12951/` + */ + MaxLocks: PlainDescriptor; + /** + * The maximum number of named reserves that can exist on an account. + * + * Use of reserves is deprecated in favour of holds. See `https://github.com/paritytech/substrate/pull/12951/` + */ + MaxReserves: PlainDescriptor; + /** + * The maximum number of individual freeze locks that can exist on an account at any time. + */ + MaxFreezes: PlainDescriptor; + }; + TransactionPayment: { + /** + * A fee multiplier for `Operational` extrinsics to compute "virtual tip" to boost their + * `priority` + * + * This value is multiplied by the `final_fee` to obtain a "virtual tip" that is later + * added to a tip component in regular `priority` calculations. + * It means that a `Normal` transaction can front-run a similarly-sized `Operational` + * extrinsic (with no tip), by including a tip value greater than the virtual tip. + * + * ```rust,ignore + * // For `Normal` + * let priority = priority_calc(tip); + * + * // For `Operational` + * let virtual_tip = (inclusion_fee + tip) * OperationalFeeMultiplier; + * let priority = priority_calc(tip + virtual_tip); + * ``` + * + * Note that since we use `final_fee` the multiplier applies also to the regular `tip` + * sent with the transaction. So, not only does the transaction get a priority bump based + * on the `inclusion_fee`, but we also amplify the impact of tips applied to `Operational` + * transactions. + */ + OperationalFeeMultiplier: PlainDescriptor; + }; + Staking: { + /** + * Number of eras to keep in history. + * + * Following information is kept for eras in `[current_era - + * HistoryDepth, current_era]`: `ErasStakers`, `ErasStakersClipped`, + * `ErasValidatorPrefs`, `ErasValidatorReward`, `ErasRewardPoints`, + * `ErasTotalStake`, `ErasStartSessionIndex`, `ClaimedRewards`, `ErasStakersPaged`, + * `ErasStakersOverview`. + * + * Must be more than the number of eras delayed by session. + * I.e. active era must always be in history. I.e. `active_era > + * current_era - history_depth` must be guaranteed. + * + * If migrating an existing pallet from storage value to config value, + * this should be set to same value or greater as in storage. + * + * Note: `HistoryDepth` is used as the upper bound for the `BoundedVec` + * item `StakingLedger.legacy_claimed_rewards`. Setting this value lower than + * the existing value can lead to inconsistencies in the + * `StakingLedger` and will need to be handled properly in a migration. + * The test `reducing_history_depth_abrupt` shows this effect. + */ + HistoryDepth: PlainDescriptor; + /** + * Number of sessions per era. + */ + SessionsPerEra: PlainDescriptor; + /** + * Number of eras that staked funds must remain bonded for. + */ + BondingDuration: PlainDescriptor; + /** + * Number of eras that slashes are deferred by, after computation. + * + * This should be less than the bonding duration. Set to 0 if slashes + * should be applied immediately, without opportunity for intervention. + */ + SlashDeferDuration: PlainDescriptor; + /** + * The maximum size of each `T::ExposurePage`. + * + * An `ExposurePage` is weakly bounded to a maximum of `MaxExposurePageSize` + * nominators. + * + * For older non-paged exposure, a reward payout was restricted to the top + * `MaxExposurePageSize` nominators. This is to limit the i/o cost for the + * nominator payout. + * + * Note: `MaxExposurePageSize` is used to bound `ClaimedRewards` and is unsafe to reduce + * without handling it in a migration. + */ + MaxExposurePageSize: PlainDescriptor; + /** + * The maximum number of `unlocking` chunks a [`StakingLedger`] can + * have. Effectively determines how many unique eras a staker may be + * unbonding in. + * + * Note: `MaxUnlockingChunks` is used as the upper bound for the + * `BoundedVec` item `StakingLedger.unlocking`. Setting this value + * lower than the existing value can lead to inconsistencies in the + * `StakingLedger` and will need to be handled properly in a runtime + * migration. The test `reducing_max_unlocking_chunks_abrupt` shows + * this effect. + */ + MaxUnlockingChunks: PlainDescriptor; + }; + Grandpa: { + /** + * Max Authorities in use + */ + MaxAuthorities: PlainDescriptor; + /** + * The maximum number of nominators for each validator. + */ + MaxNominators: PlainDescriptor; + /** + * The maximum number of entries to keep in the set id to session index mapping. + * + * Since the `SetIdSession` map is only used for validating equivocations this + * value should relate to the bonding duration of whatever staking system is + * being used (if any). If equivocation handling is not enabled then this value + * can be zero. + */ + MaxSetIdSessionEntries: PlainDescriptor; + }; + Treasury: { + /** + * Period between successive spends. + */ + SpendPeriod: PlainDescriptor; + /** + * Percentage of spare funds (if any) that are burnt per spend period. + */ + Burn: PlainDescriptor; + /** + * The treasury's pallet id, used for deriving its sovereign account ID. + */ + PalletId: PlainDescriptor>; + /** + * The maximum number of approvals that can wait in the spending queue. + * + * NOTE: This parameter is also used within the Bounties Pallet extension if enabled. + */ + MaxApprovals: PlainDescriptor; + /** + * The period during which an approved treasury spend has to be claimed. + */ + PayoutPeriod: PlainDescriptor; + }; + ConvictionVoting: { + /** + * The maximum number of concurrent votes an account may have. + * + * Also used to compute weight, an overly large value can lead to extrinsics with large + * weight estimation: see `delegate` for instance. + */ + MaxVotes: PlainDescriptor; + /** + * The minimum period of vote locking. + * + * It should be no shorter than enactment period to ensure that in the case of an approval, + * those successful voters are locked into the consequences that their votes entail. + */ + VoteLockingPeriod: PlainDescriptor; + }; + Referenda: { + /** + * The minimum amount to be used as a deposit for a public referendum proposal. + */ + SubmissionDeposit: PlainDescriptor; + /** + * Maximum size of the referendum queue for a single track. + */ + MaxQueued: PlainDescriptor; + /** + * The number of blocks after submission that a referendum must begin being decided by. + * Once this passes, then anyone may cancel the referendum. + */ + UndecidingTimeout: PlainDescriptor; + /** + * Quantization level for the referendum wakeup scheduler. A higher number will result in + * fewer storage reads/writes needed for smaller voters, but also result in delays to the + * automatic referendum status changes. Explicit servicing instructions are unaffected. + */ + AlarmInterval: PlainDescriptor; + /** + * Information concerning the different referendum tracks. + */ + Tracks: PlainDescriptor>; + }; + Claims: { + /** + + */ + Prefix: PlainDescriptor; + }; + Vesting: { + /** + * The minimum amount transferred to call `vested_transfer`. + */ + MinVestedTransfer: PlainDescriptor; + /** + + */ + MaxVestingSchedules: PlainDescriptor; + }; + Utility: { + /** + * The limit on the number of batched calls. + */ + batched_calls_limit: PlainDescriptor; + }; + Proxy: { + /** + * The base amount of currency needed to reserve for creating a proxy. + * + * This is held for an additional storage item whose value size is + * `sizeof(Balance)` bytes and whose key size is `sizeof(AccountId)` bytes. + */ + ProxyDepositBase: PlainDescriptor; + /** + * The amount of currency needed per proxy added. + * + * This is held for adding 32 bytes plus an instance of `ProxyType` more into a + * pre-existing storage value. Thus, when configuring `ProxyDepositFactor` one should take + * into account `32 + proxy_type.encode().len()` bytes of data. + */ + ProxyDepositFactor: PlainDescriptor; + /** + * The maximum amount of proxies allowed for a single account. + */ + MaxProxies: PlainDescriptor; + /** + * The maximum amount of time-delayed announcements that are allowed to be pending. + */ + MaxPending: PlainDescriptor; + /** + * The base amount of currency needed to reserve for creating an announcement. + * + * This is held when a new storage item holding a `Balance` is created (typically 16 + * bytes). + */ + AnnouncementDepositBase: PlainDescriptor; + /** + * The amount of currency needed per announcement made. + * + * This is held for adding an `AccountId`, `Hash` and `BlockNumber` (typically 68 bytes) + * into a pre-existing storage value. + */ + AnnouncementDepositFactor: PlainDescriptor; + }; + Multisig: { + /** + * The base amount of currency needed to reserve for creating a multisig execution or to + * store a dispatch call for later. + * + * This is held for an additional storage item whose value size is + * `4 + sizeof((BlockNumber, Balance, AccountId))` bytes and whose key size is + * `32 + sizeof(AccountId)` bytes. + */ + DepositBase: PlainDescriptor; + /** + * The amount of currency needed per unit threshold when creating a multisig execution. + * + * This is held for adding 32 bytes more into a pre-existing storage value. + */ + DepositFactor: PlainDescriptor; + /** + * The maximum amount of signatories allowed in the multisig. + */ + MaxSignatories: PlainDescriptor; + }; + Bounties: { + /** + * The amount held on deposit for placing a bounty proposal. + */ + BountyDepositBase: PlainDescriptor; + /** + * The delay period for which a bounty beneficiary need to wait before claim the payout. + */ + BountyDepositPayoutDelay: PlainDescriptor; + /** + * Bounty duration in blocks. + */ + BountyUpdatePeriod: PlainDescriptor; + /** + * The curator deposit is calculated as a percentage of the curator fee. + * + * This deposit has optional upper and lower bounds with `CuratorDepositMax` and + * `CuratorDepositMin`. + */ + CuratorDepositMultiplier: PlainDescriptor; + /** + * Maximum amount of funds that should be placed in a deposit for making a proposal. + */ + CuratorDepositMax: PlainDescriptor>; + /** + * Minimum amount of funds that should be placed in a deposit for making a proposal. + */ + CuratorDepositMin: PlainDescriptor>; + /** + * Minimum value for a bounty. + */ + BountyValueMinimum: PlainDescriptor; + /** + * The amount held on deposit per byte within the tip report reason or bounty description. + */ + DataDepositPerByte: PlainDescriptor; + /** + * Maximum acceptable reason length. + * + * Benchmarks depend on this value, be sure to update weights file when changing this value + */ + MaximumReasonLength: PlainDescriptor; + }; + ChildBounties: { + /** + * Maximum number of child bounties that can be added to a parent bounty. + */ + MaxActiveChildBountyCount: PlainDescriptor; + /** + * Minimum value for a child-bounty. + */ + ChildBountyValueMinimum: PlainDescriptor; + }; + ElectionProviderMultiPhase: { + /** + * The minimum amount of improvement to the solution score that defines a solution as + * "better" in the Signed phase. + */ + BetterSignedThreshold: PlainDescriptor; + /** + * The repeat threshold of the offchain worker. + * + * For example, if it is 5, that means that at least 5 blocks will elapse between attempts + * to submit the worker's solution. + */ + OffchainRepeat: PlainDescriptor; + /** + * The priority of the unsigned transaction submitted in the unsigned-phase + */ + MinerTxPriority: PlainDescriptor; + /** + * Maximum number of signed submissions that can be queued. + * + * It is best to avoid adjusting this during an election, as it impacts downstream data + * structures. In particular, `SignedSubmissionIndices` is bounded on this value. If you + * update this value during an election, you _must_ ensure that + * `SignedSubmissionIndices.len()` is less than or equal to the new value. Otherwise, + * attempts to submit new solutions may cause a runtime panic. + */ + SignedMaxSubmissions: PlainDescriptor; + /** + * Maximum weight of a signed solution. + * + * If [`Config::MinerConfig`] is being implemented to submit signed solutions (outside of + * this pallet), then [`MinerConfig::solution_weight`] is used to compare against + * this value. + */ + SignedMaxWeight: PlainDescriptor>; + /** + * The maximum amount of unchecked solutions to refund the call fee for. + */ + SignedMaxRefunds: PlainDescriptor; + /** + * Base reward for a signed solution + */ + SignedRewardBase: PlainDescriptor; + /** + * Per-byte deposit for a signed solution. + */ + SignedDepositByte: PlainDescriptor; + /** + * Per-weight deposit for a signed solution. + */ + SignedDepositWeight: PlainDescriptor; + /** + * The maximum number of winners that can be elected by this `ElectionProvider` + * implementation. + * + * Note: This must always be greater or equal to `T::DataProvider::desired_targets()`. + */ + MaxWinners: PlainDescriptor; + /** + + */ + MinerMaxLength: PlainDescriptor; + /** + + */ + MinerMaxWeight: PlainDescriptor>; + /** + + */ + MinerMaxVotesPerVoter: PlainDescriptor; + /** + + */ + MinerMaxWinners: PlainDescriptor; + }; + VoterList: { + /** + * The list of thresholds separating the various bags. + * + * Ids are separated into unsorted bags according to their score. This specifies the + * thresholds separating the bags. An id's bag is the largest bag for which the id's score + * is less than or equal to its upper threshold. + * + * When ids are iterated, higher bags are iterated completely before lower bags. This means + * that iteration is _semi-sorted_: ids of higher score tend to come before ids of lower + * score, but peer ids within a particular bag are sorted in insertion order. + * + * # Expressing the constant + * + * This constant must be sorted in strictly increasing order. Duplicate items are not + * permitted. + * + * There is an implied upper limit of `Score::MAX`; that value does not need to be + * specified within the bag. For any two threshold lists, if one ends with + * `Score::MAX`, the other one does not, and they are otherwise equal, the two + * lists will behave identically. + * + * # Calculation + * + * It is recommended to generate the set of thresholds in a geometric series, such that + * there exists some constant ratio such that `threshold[k + 1] == (threshold[k] * + * constant_ratio).max(threshold[k] + 1)` for all `k`. + * + * The helpers in the `/utils/frame/generate-bags` module can simplify this calculation. + * + * # Examples + * + * - If `BagThresholds::get().is_empty()`, then all ids are put into the same bag, and + * iteration is strictly in insertion order. + * - If `BagThresholds::get().len() == 64`, and the thresholds are determined according to + * the procedure given above, then the constant ratio is equal to 2. + * - If `BagThresholds::get().len() == 200`, and the thresholds are determined according to + * the procedure given above, then the constant ratio is approximately equal to 1.248. + * - If the threshold list begins `[1, 2, 3, ...]`, then an id with score 0 or 1 will fall + * into bag 0, an id with score 2 will fall into bag 1, etc. + * + * # Migration + * + * In the event that this list ever changes, a copy of the old bags list must be retained. + * With that `List::migrate` can be called, which will perform the appropriate migration. + */ + BagThresholds: PlainDescriptor>; + }; + NominationPools: { + /** + * The nomination pool's pallet id. + */ + PalletId: PlainDescriptor>; + /** + * The maximum pool points-to-balance ratio that an `open` pool can have. + * + * This is important in the event slashing takes place and the pool's points-to-balance + * ratio becomes disproportional. + * + * Moreover, this relates to the `RewardCounter` type as well, as the arithmetic operations + * are a function of number of points, and by setting this value to e.g. 10, you ensure + * that the total number of points in the system are at most 10 times the total_issuance of + * the chain, in the absolute worse case. + * + * For a value of 10, the threshold would be a pool points-to-balance ratio of 10:1. + * Such a scenario would also be the equivalent of the pool being 90% slashed. + */ + MaxPointsToBalance: PlainDescriptor; + /** + * The maximum number of simultaneous unbonding chunks that can exist per member. + */ + MaxUnbonding: PlainDescriptor; + }; + FastUnstake: { + /** + * Deposit to take for unstaking, to make sure we're able to slash the it in order to cover + * the costs of resources on unsuccessful unstake. + */ + Deposit: PlainDescriptor; + }; + Paras: { + /** + + */ + UnsignedPriority: PlainDescriptor; + }; + OnDemand: { + /** + * The default value for the spot traffic multiplier. + */ + TrafficDefaultValue: PlainDescriptor; + /** + * The maximum number of blocks some historical revenue + * information stored for. + */ + MaxHistoricalRevenue: PlainDescriptor; + /** + * Identifier for the internal revenue balance. + */ + PalletId: PlainDescriptor>; + }; + Registrar: { + /** + * The deposit to be paid to run a on-demand parachain. + * This should include the cost for storing the genesis head and validation code. + */ + ParaDeposit: PlainDescriptor; + /** + * The deposit to be paid per byte stored on chain. + */ + DataDepositPerByte: PlainDescriptor; + }; + Slots: { + /** + * The number of blocks over which a single period lasts. + */ + LeasePeriod: PlainDescriptor; + /** + * The number of blocks to offset each lease period by. + */ + LeaseOffset: PlainDescriptor; + }; + Auctions: { + /** + * The number of blocks over which an auction may be retroactively ended. + */ + EndingPeriod: PlainDescriptor; + /** + * The length of each sample to take during the ending period. + * + * `EndingPeriod` / `SampleLength` = Total # of Samples + */ + SampleLength: PlainDescriptor; + /** + + */ + SlotRangeCount: PlainDescriptor; + /** + + */ + LeasePeriodsPerSlot: PlainDescriptor; + }; + Crowdloan: { + /** + * `PalletId` for the crowdloan pallet. An appropriate value could be + * `PalletId(*b"py/cfund")` + */ + PalletId: PlainDescriptor>; + /** + * The minimum amount that may be contributed into a crowdloan. Should almost certainly be + * at least `ExistentialDeposit`. + */ + MinContribution: PlainDescriptor; + /** + * Max number of storage keys to remove per extrinsic call. + */ + RemoveKeysLimit: PlainDescriptor; + }; + Coretime: { + /** + * The ParaId of the coretime chain. + */ + BrokerId: PlainDescriptor; + /** + * The coretime chain pot location. + */ + BrokerPotLocation: PlainDescriptor; + }; + StateTrieMigration: { + /** + * Maximal number of bytes that a key can have. + * + * FRAME itself does not limit the key length. + * The concrete value must therefore depend on your storage usage. + * A [`frame_support::storage::StorageNMap`] for example can have an arbitrary number of + * keys which are then hashed and concatenated, resulting in arbitrarily long keys. + * + * Use the *state migration RPC* to retrieve the length of the longest key in your + * storage: + * + * The migration will halt with a `Halted` event if this value is too small. + * Since there is no real penalty from over-estimating, it is advised to use a large + * value. The default is 512 byte. + * + * Some key lengths for reference: + * - [`frame_support::storage::StorageValue`]: 32 byte + * - [`frame_support::storage::StorageMap`]: 64 byte + * - [`frame_support::storage::StorageDoubleMap`]: 96 byte + * + * For more info see + * + */ + MaxKeyLen: PlainDescriptor; + }; + MessageQueue: { + /** + * The size of the page; this implies the maximum message size which can be sent. + * + * A good value depends on the expected message sizes, their weights, the weight that is + * available for processing them and the maximal needed message size. The maximal message + * size is slightly lower than this as defined by [`MaxMessageLenOf`]. + */ + HeapSize: PlainDescriptor; + /** + * The maximum number of stale pages (i.e. of overweight messages) allowed before culling + * can happen. Once there are more stale pages than this, then historical pages may be + * dropped, even if they contain unprocessed overweight messages. + */ + MaxStale: PlainDescriptor; + /** + * The amount of weight (if any) which should be provided to the message queue for + * servicing enqueued items `on_initialize`. + * + * This may be legitimately `None` in the case that you will call + * `ServiceQueues::service_queues` manually or set [`Self::IdleMaxServiceWeight`] to have + * it run in `on_idle`. + */ + ServiceWeight: PlainDescriptor>; + /** + * The maximum amount of weight (if any) to be used from remaining weight `on_idle` which + * should be provided to the message queue for servicing enqueued items `on_idle`. + * Useful for parachains to process messages at the same block they are received. + * + * If `None`, it will not call `ServiceQueues::service_queues` in `on_idle`. + */ + IdleMaxServiceWeight: PlainDescriptor>; + }; + Beefy: { + /** + * The maximum number of authorities that can be added. + */ + MaxAuthorities: PlainDescriptor; + /** + * The maximum number of nominators for each validator. + */ + MaxNominators: PlainDescriptor; + /** + * The maximum number of entries to keep in the set id to session index mapping. + * + * Since the `SetIdSession` map is only used for validating equivocations this + * value should relate to the bonding duration of whatever staking system is + * being used (if any). If equivocation handling is not enabled then this value + * can be zero. + */ + MaxSetIdSessionEntries: PlainDescriptor; + }; +}; +type IRuntimeCalls = { + /** + + */ + Inflation: { + /** + * Return the current estimates of the inflation amount. + * + * This is marked as experimental in light of RFC#89. Nonetheless, its usage is highly + * recommended over trying to read-storage, or re-create the onchain logic. + */ + experimental_inflation_prediction_info: RuntimeDescriptor<[], Anonymize>; + }; + /** + * The `Core` runtime api that every Substrate runtime needs to implement. + */ + Core: { + /** + * Returns the version of the runtime. + */ + version: RuntimeDescriptor<[], Anonymize>; + /** + * Execute the given block. + */ + execute_block: RuntimeDescriptor<[block: Anonymize], undefined>; + /** + * Initialize a block with the given header and return the runtime executive mode. + */ + initialize_block: RuntimeDescriptor<[header: Anonymize], Anonymize>; + }; + /** + * The `Metadata` api trait that returns metadata for the runtime. + */ + Metadata: { + /** + * Returns the metadata of a runtime. + */ + metadata: RuntimeDescriptor<[], Binary>; + /** + * Returns the metadata at a given version. + * + * If the given `version` isn't supported, this will return `None`. + * Use [`Self::metadata_versions`] to find out about supported metadata version of the runtime. + */ + metadata_at_version: RuntimeDescriptor<[version: number], Anonymize>; + /** + * Returns the supported metadata versions. + * + * This can be used to call `metadata_at_version`. + */ + metadata_versions: RuntimeDescriptor<[], Anonymize>; + }; + /** + * The `BlockBuilder` api trait that provides the required functionality for building a block. + */ + BlockBuilder: { + /** + * Apply the given extrinsic. + * + * Returns an inclusion outcome which specifies if this extrinsic is included in + * this block or not. + */ + apply_extrinsic: RuntimeDescriptor<[extrinsic: Binary], Anonymize>; + /** + * Finish the current block. + */ + finalize_block: RuntimeDescriptor<[], Anonymize>; + /** + * Generate inherent extrinsics. The inherent data will vary from chain to chain. + */ + inherent_extrinsics: RuntimeDescriptor<[inherent: Anonymize], Anonymize>; + /** + * Check that the inherents are valid. The inherent data will vary from chain to chain. + */ + check_inherents: RuntimeDescriptor<[block: Anonymize, data: Anonymize], Anonymize>; + }; + /** + * Runtime api for accessing information about nomination pools. + */ + NominationPoolsApi: { + /** + * Returns the pending rewards for the member that the AccountId was given for. + */ + pending_rewards: RuntimeDescriptor<[who: SS58String], bigint>; + /** + * Returns the equivalent balance of `points` for a given pool. + */ + points_to_balance: RuntimeDescriptor<[pool_id: number, points: bigint], bigint>; + /** + * Returns the equivalent points of `new_funds` for a given pool. + */ + balance_to_points: RuntimeDescriptor<[pool_id: number, new_funds: bigint], bigint>; + /** + * Returns the pending slash for a given pool. + */ + pool_pending_slash: RuntimeDescriptor<[pool_id: number], bigint>; + /** + * Returns the pending slash for a given pool member. + */ + member_pending_slash: RuntimeDescriptor<[member: SS58String], bigint>; + /** + * Returns true if the pool with `pool_id` needs migration. + * + * This can happen when the `pallet-nomination-pools` has switched to using strategy + * [`DelegateStake`](pallet_nomination_pools::adapter::DelegateStake) but the pool + * still has funds that were staked using the older strategy + * [TransferStake](pallet_nomination_pools::adapter::TransferStake). Use + * [`migrate_pool_to_delegate_stake`](pallet_nomination_pools::Call::migrate_pool_to_delegate_stake) + * to migrate the pool. + */ + pool_needs_delegate_migration: RuntimeDescriptor<[pool_id: number], boolean>; + /** + * Returns true if the delegated funds of the pool `member` needs migration. + * + * Once a pool has successfully migrated to the strategy + * [`DelegateStake`](pallet_nomination_pools::adapter::DelegateStake), the funds of the + * member can be migrated from pool account to the member's account. Use + * [`migrate_delegation`](pallet_nomination_pools::Call::migrate_delegation) + * to migrate the funds of the pool member. + */ + member_needs_delegate_migration: RuntimeDescriptor<[member: SS58String], boolean>; + }; + /** + + */ + StakingApi: { + /** + * Returns the nominations quota for a nominator with a given balance. + */ + nominations_quota: RuntimeDescriptor<[balance: bigint], number>; + /** + * Returns the page count of exposures for a validator `account` in a given era. + */ + eras_stakers_page_count: RuntimeDescriptor<[era: number, account: SS58String], number>; + /** + * Returns true if validator `account` has pages to be claimed for the given era. + */ + pending_rewards: RuntimeDescriptor<[era: number, account: SS58String], boolean>; + }; + /** + * The `TaggedTransactionQueue` api trait for interfering with the transaction queue. + */ + TaggedTransactionQueue: { + /** + * Validate the transaction. + * + * This method is invoked by the transaction pool to learn details about given transaction. + * The implementation should make sure to verify the correctness of the transaction + * against current state. The given `block_hash` corresponds to the hash of the block + * that is used as current state. + * + * Note that this call may be performed by the pool multiple times and transactions + * might be verified in any possible order. + */ + validate_transaction: RuntimeDescriptor<[source: TransactionValidityTransactionSource, tx: Binary, block_hash: FixedSizeBinary<32>], Anonymize>; + }; + /** + * The offchain worker api. + */ + OffchainWorkerApi: { + /** + * Starts the off-chain task for given block header. + */ + offchain_worker: RuntimeDescriptor<[header: Anonymize], undefined>; + }; + /** + * The API for querying the state of parachains on-chain. + */ + ParachainHost: { + /** + * Get the current validators. + */ + validators: RuntimeDescriptor<[], Anonymize>; + /** + * Returns the validator groups and rotation info localized based on the hypothetical child + * of a block whose state this is invoked on. Note that `now` in the `GroupRotationInfo` + * should be the successor of the number of the block. + */ + validator_groups: RuntimeDescriptor<[], Anonymize>; + /** + * Yields information on all availability cores as relevant to the child block. + * Cores are either free or occupied. Free cores can have paras assigned to them. + */ + availability_cores: RuntimeDescriptor<[], Anonymize>; + /** + * Yields the persisted validation data for the given `ParaId` along with an assumption that + * should be used if the para currently occupies a core. + * + * Returns `None` if either the para is not registered or the assumption is `Freed` + * and the para already occupies a core. + */ + persisted_validation_data: RuntimeDescriptor<[para_id: number, assumption: OccupiedCoreAssumption], Anonymize>; + /** + * Returns the persisted validation data for the given `ParaId` along with the corresponding + * validation code hash. Instead of accepting assumption about the para, matches the validation + * data hash against an expected one and yields `None` if they're not equal. + */ + assumed_validation_data: RuntimeDescriptor<[para_id: number, expected_persisted_validation_data_hash: FixedSizeBinary<32>], Anonymize>; + /** + * Checks if the given validation outputs pass the acceptance criteria. + */ + check_validation_outputs: RuntimeDescriptor<[para_id: number, outputs: Anonymize], boolean>; + /** + * Returns the session index expected at a child of the block. + * + * This can be used to instantiate a `SigningContext`. + */ + session_index_for_child: RuntimeDescriptor<[], number>; + /** + * Fetch the validation code used by a para, making the given `OccupiedCoreAssumption`. + * + * Returns `None` if either the para is not registered or the assumption is `Freed` + * and the para already occupies a core. + */ + validation_code: RuntimeDescriptor<[para_id: number, assumption: OccupiedCoreAssumption], Anonymize>; + /** + * Get the receipt of a candidate pending availability. This returns `Some` for any paras + * assigned to occupied cores in `availability_cores` and `None` otherwise. + */ + candidate_pending_availability: RuntimeDescriptor<[para_id: number], Anonymize>; + /** + * Get a vector of events concerning candidates that occurred within a block. + */ + candidate_events: RuntimeDescriptor<[], Anonymize>; + /** + * Get all the pending inbound messages in the downward message queue for a para. + */ + dmq_contents: RuntimeDescriptor<[recipient: number], Anonymize>; + /** + * Get the contents of all channels addressed to the given recipient. Channels that have no + * messages in them are also included. + */ + inbound_hrmp_channels_contents: RuntimeDescriptor<[recipient: number], Anonymize>; + /** + * Get the validation code from its hash. + */ + validation_code_by_hash: RuntimeDescriptor<[hash: FixedSizeBinary<32>], Anonymize>; + /** + * Scrape dispute relevant from on-chain, backing votes and resolved disputes. + */ + on_chain_votes: RuntimeDescriptor<[], Anonymize>; + /** + * Get the session info for the given session, if stored. + * + * NOTE: This function is only available since parachain host version 2. + */ + session_info: RuntimeDescriptor<[index: number], Anonymize>; + /** + * Submits a PVF pre-checking statement into the transaction pool. + * + * NOTE: This function is only available since parachain host version 2. + */ + submit_pvf_check_statement: RuntimeDescriptor<[stmt: Anonymize, signature: FixedSizeBinary<64>], undefined>; + /** + * Returns code hashes of PVFs that require pre-checking by validators in the active set. + * + * NOTE: This function is only available since parachain host version 2. + */ + pvfs_require_precheck: RuntimeDescriptor<[], Anonymize>; + /** + * Fetch the hash of the validation code used by a para, making the given `OccupiedCoreAssumption`. + * + * NOTE: This function is only available since parachain host version 2. + */ + validation_code_hash: RuntimeDescriptor<[para_id: number, assumption: OccupiedCoreAssumption], Anonymize>; + /** + * Returns all onchain disputes. + */ + disputes: RuntimeDescriptor<[], Anonymize>; + /** + * Returns execution parameters for the session. + */ + session_executor_params: RuntimeDescriptor<[session_index: number], Anonymize>; + /** + * Returns a list of validators that lost a past session dispute and need to be slashed. + * NOTE: This function is only available since parachain host version 5. + */ + unapplied_slashes: RuntimeDescriptor<[], Anonymize>; + /** + * Returns a merkle proof of a validator session key. + * NOTE: This function is only available since parachain host version 5. + */ + key_ownership_proof: RuntimeDescriptor<[validator_id: FixedSizeBinary<32>], Anonymize>; + /** + * Submit an unsigned extrinsic to slash validators who lost a dispute about + * a candidate of a past session. + * NOTE: This function is only available since parachain host version 5. + */ + submit_report_dispute_lost: RuntimeDescriptor<[dispute_proof: Anonymize, key_ownership_proof: Binary], boolean>; + /** + * Get the minimum number of backing votes for a parachain candidate. + * This is a staging method! Do not use on production runtimes! + */ + minimum_backing_votes: RuntimeDescriptor<[], number>; + /** + * Returns the state of parachain backing for a given para. + */ + para_backing_state: RuntimeDescriptor<[_: number], Anonymize>; + /** + * Returns candidate's acceptance limitations for asynchronous backing for a relay parent. + */ + async_backing_params: RuntimeDescriptor<[], Anonymize>; + /** + * Returns a list of all disabled validators at the given block. + */ + disabled_validators: RuntimeDescriptor<[], Anonymize>; + /** + * Get node features. + * This is a staging method! Do not use on production runtimes! + */ + node_features: RuntimeDescriptor<[], { + bytes: Uint8Array; + bitsLen: number; + }>; + /** + * Approval voting configuration parameters + */ + approval_voting_params: RuntimeDescriptor<[], number>; + /** + * Claim queue + */ + claim_queue: RuntimeDescriptor<[], Anonymize>; + /** + * Elastic scaling support + */ + candidates_pending_availability: RuntimeDescriptor<[para_id: number], Anonymize>; + }; + /** + * API necessary for BEEFY voters. + */ + BeefyApi: { + /** + * Return the block number where BEEFY consensus is enabled/started + */ + beefy_genesis: RuntimeDescriptor<[], Anonymize>; + /** + * Return the current active BEEFY validator set + */ + validator_set: RuntimeDescriptor<[], Anonymize>; + /** + * Submits an unsigned extrinsic to report an equivocation. The caller + * must provide the equivocation proof and a key ownership proof + * (should be obtained using `generate_key_ownership_proof`). The + * extrinsic will be unsigned and should only be accepted for local + * authorship (not to be broadcast to the network). This method returns + * `None` when creation of the extrinsic fails, e.g. if equivocation + * reporting is disabled for the given runtime (i.e. this method is + * hardcoded to return `None`). Only useful in an offchain context. + */ + submit_report_equivocation_unsigned_extrinsic: RuntimeDescriptor<[equivocation_proof: Anonymize, key_owner_proof: Binary], boolean>; + /** + * Generates a proof of key ownership for the given authority in the + * given set. An example usage of this module is coupled with the + * session historical module to prove that a given authority key is + * tied to a given staking identity during a specific session. Proofs + * of key ownership are necessary for submitting equivocation reports. + * NOTE: even though the API takes a `set_id` as parameter the current + * implementations ignores this parameter and instead relies on this + * method being called at the correct block height, i.e. any point at + * which the given set id is live on-chain. Future implementations will + * instead use indexed data through an offchain worker, not requiring + * older states to be available. + */ + generate_key_ownership_proof: RuntimeDescriptor<[set_id: bigint, authority_id: FixedSizeBinary<33>], Anonymize>; + }; + /** + * API to interact with MMR pallet. + */ + MmrApi: { + /** + * Return the on-chain MMR root hash. + */ + mmr_root: RuntimeDescriptor<[], Anonymize>; + /** + * Return the number of MMR blocks in the chain. + */ + mmr_leaf_count: RuntimeDescriptor<[], Anonymize>; + /** + * Generate MMR proof for a series of block numbers. If `best_known_block_number = Some(n)`, + * use historical MMR state at given block height `n`. Else, use current MMR state. + */ + generate_proof: RuntimeDescriptor<[block_numbers: Anonymize, best_known_block_number: Anonymize], Anonymize>; + /** + * Verify MMR proof against on-chain MMR for a batch of leaves. + * + * Note this function will use on-chain MMR root hash and check if the proof matches the hash. + * Note, the leaves should be sorted such that corresponding leaves and leaf indices have the + * same position in both the `leaves` vector and the `leaf_indices` vector contained in the [LeafProof] + */ + verify_proof: RuntimeDescriptor<[leaves: Anonymize, proof: Anonymize], Anonymize>; + /** + * Verify MMR proof against given root hash for a batch of leaves. + * + * Note this function does not require any on-chain storage - the + * proof is verified against given MMR root hash. + * + * Note, the leaves should be sorted such that corresponding leaves and leaf indices have the + * same position in both the `leaves` vector and the `leaf_indices` vector contained in the [LeafProof] + */ + verify_proof_stateless: RuntimeDescriptor<[root: FixedSizeBinary<32>, leaves: Anonymize, proof: Anonymize], Anonymize>; + }; + /** + * API useful for BEEFY light clients. + */ + BeefyMmrApi: { + /** + * Return the currently active BEEFY authority set proof. + */ + authority_set_proof: RuntimeDescriptor<[], Anonymize>; + /** + * Return the next/queued BEEFY authority set proof. + */ + next_authority_set_proof: RuntimeDescriptor<[], Anonymize>; + }; + /** + * APIs for integrating the GRANDPA finality gadget into runtimes. + * This should be implemented on the runtime side. + * + * This is primarily used for negotiating authority-set changes for the + * gadget. GRANDPA uses a signaling model of changing authority sets: + * changes should be signaled with a delay of N blocks, and then automatically + * applied in the runtime after those N blocks have passed. + * + * The consensus protocol will coordinate the handoff externally. + */ + GrandpaApi: { + /** + * Get the current GRANDPA authorities and weights. This should not change except + * for when changes are scheduled and the corresponding delay has passed. + * + * When called at block B, it will return the set of authorities that should be + * used to finalize descendants of this block (B+1, B+2, ...). The block B itself + * is finalized by the authorities from block B-1. + */ + grandpa_authorities: RuntimeDescriptor<[], Anonymize>; + /** + * Submits an unsigned extrinsic to report an equivocation. The caller + * must provide the equivocation proof and a key ownership proof + * (should be obtained using `generate_key_ownership_proof`). The + * extrinsic will be unsigned and should only be accepted for local + * authorship (not to be broadcast to the network). This method returns + * `None` when creation of the extrinsic fails, e.g. if equivocation + * reporting is disabled for the given runtime (i.e. this method is + * hardcoded to return `None`). Only useful in an offchain context. + */ + submit_report_equivocation_unsigned_extrinsic: RuntimeDescriptor<[equivocation_proof: Anonymize, key_owner_proof: Binary], boolean>; + /** + * Generates a proof of key ownership for the given authority in the + * given set. An example usage of this module is coupled with the + * session historical module to prove that a given authority key is + * tied to a given staking identity during a specific session. Proofs + * of key ownership are necessary for submitting equivocation reports. + * NOTE: even though the API takes a `set_id` as parameter the current + * implementations ignore this parameter and instead rely on this + * method being called at the correct block height, i.e. any point at + * which the given set id is live on-chain. Future implementations will + * instead use indexed data through an offchain worker, not requiring + * older states to be available. + */ + generate_key_ownership_proof: RuntimeDescriptor<[set_id: bigint, authority_id: FixedSizeBinary<32>], Anonymize>; + /** + * Get current GRANDPA authority set id. + */ + current_set_id: RuntimeDescriptor<[], bigint>; + }; + /** + * API necessary for block authorship with BABE. + */ + BabeApi: { + /** + * Return the configuration for BABE. + */ + configuration: RuntimeDescriptor<[], Anonymize>; + /** + * Returns the slot that started the current epoch. + */ + current_epoch_start: RuntimeDescriptor<[], bigint>; + /** + * Returns information regarding the current epoch. + */ + current_epoch: RuntimeDescriptor<[], Anonymize>; + /** + * Returns information regarding the next epoch (which was already + * previously announced). + */ + next_epoch: RuntimeDescriptor<[], Anonymize>; + /** + * Generates a proof of key ownership for the given authority in the + * current epoch. An example usage of this module is coupled with the + * session historical module to prove that a given authority key is + * tied to a given staking identity during a specific session. Proofs + * of key ownership are necessary for submitting equivocation reports. + * NOTE: even though the API takes a `slot` as parameter the current + * implementations ignores this parameter and instead relies on this + * method being called at the correct block height, i.e. any point at + * which the epoch for the given slot is live on-chain. Future + * implementations will instead use indexed data through an offchain + * worker, not requiring older states to be available. + */ + generate_key_ownership_proof: RuntimeDescriptor<[slot: bigint, authority_id: FixedSizeBinary<32>], Anonymize>; + /** + * Submits an unsigned extrinsic to report an equivocation. The caller + * must provide the equivocation proof and a key ownership proof + * (should be obtained using `generate_key_ownership_proof`). The + * extrinsic will be unsigned and should only be accepted for local + * authorship (not to be broadcast to the network). This method returns + * `None` when creation of the extrinsic fails, e.g. if equivocation + * reporting is disabled for the given runtime (i.e. this method is + * hardcoded to return `None`). Only useful in an offchain context. + */ + submit_report_equivocation_unsigned_extrinsic: RuntimeDescriptor<[equivocation_proof: Anonymize, key_owner_proof: Binary], boolean>; + }; + /** + * The authority discovery api. + * + * This api is used by the `client/authority-discovery` module to retrieve identifiers + * of the current and next authority set. + */ + AuthorityDiscoveryApi: { + /** + * Retrieve authority identifiers of the current and next authority set. + */ + authorities: RuntimeDescriptor<[], Anonymize>; + }; + /** + * Session keys runtime api. + */ + SessionKeys: { + /** + * Generate a set of session keys with optionally using the given seed. + * The keys should be stored within the keystore exposed via runtime + * externalities. + * + * The seed needs to be a valid `utf8` string. + * + * Returns the concatenated SCALE encoded public keys. + */ + generate_session_keys: RuntimeDescriptor<[seed: Anonymize], Binary>; + /** + * Decode the given public session keys. + * + * Returns the list of public raw public keys + key type. + */ + decode_session_keys: RuntimeDescriptor<[encoded: Binary], Anonymize>; + }; + /** + * The API to query account nonce. + */ + AccountNonceApi: { + /** + * Get current account nonce of given `AccountId`. + */ + account_nonce: RuntimeDescriptor<[account: SS58String], number>; + }; + /** + + */ + TransactionPaymentApi: { + /** + + */ + query_info: RuntimeDescriptor<[uxt: Binary, len: number], Anonymize>; + /** + + */ + query_fee_details: RuntimeDescriptor<[uxt: Binary, len: number], Anonymize>; + /** + + */ + query_weight_to_fee: RuntimeDescriptor<[weight: Anonymize], bigint>; + /** + + */ + query_length_to_fee: RuntimeDescriptor<[length: number], bigint>; + }; + /** + + */ + TransactionPaymentCallApi: { + /** + * Query information of a dispatch class, weight, and fee of a given encoded `Call`. + */ + query_call_info: RuntimeDescriptor<[call: Anonymize, len: number], Anonymize>; + /** + * Query fee details of a given encoded `Call`. + */ + query_call_fee_details: RuntimeDescriptor<[call: Anonymize, len: number], Anonymize>; + /** + * Query the output of the current `WeightToFee` given some input. + */ + query_weight_to_fee: RuntimeDescriptor<[weight: Anonymize], bigint>; + /** + * Query the output of the current `LengthToFee` given some input. + */ + query_length_to_fee: RuntimeDescriptor<[length: number], bigint>; + }; + /** + * A trait of XCM payment API. + * + * API provides functionality for obtaining: + * + * * the weight required to execute an XCM message, + * * a list of acceptable `AssetId`s for message execution payment, + * * the cost of the weight in the specified acceptable `AssetId`. + * * the fees for an XCM message delivery. + * + * To determine the execution weight of the calls required for + * [`xcm::latest::Instruction::Transact`] instruction, `TransactionPaymentCallApi` can be used. + */ + XcmPaymentApi: { + /** + * Returns a list of acceptable payment assets. + * + * # Arguments + * + * * `xcm_version`: Version. + */ + query_acceptable_payment_assets: RuntimeDescriptor<[xcm_version: number], Anonymize>; + /** + * Returns a weight needed to execute a XCM. + * + * # Arguments + * + * * `message`: `VersionedXcm`. + */ + query_xcm_weight: RuntimeDescriptor<[message: DotXcmVersionedXcm], Anonymize>; + /** + * Converts a weight into a fee for the specified `AssetId`. + * + * # Arguments + * + * * `weight`: convertible `Weight`. + * * `asset`: `VersionedAssetId`. + */ + query_weight_to_asset_fee: RuntimeDescriptor<[weight: Anonymize, asset: DotXcmVersionedAssetId], Anonymize>; + /** + * Get delivery fees for sending a specific `message` to a `destination`. + * These always come in a specific asset, defined by the chain. + * + * # Arguments + * * `message`: The message that'll be sent, necessary because most delivery fees are based on the + * size of the message. + * * `destination`: The destination to send the message to. Different destinations may use + * different senders that charge different fees. + */ + query_delivery_fees: RuntimeDescriptor<[destination: DotXcmVersionedLocation, message: DotXcmVersionedXcm], Anonymize>; + }; + /** + * API for dry-running extrinsics and XCM programs to get the programs that need to be passed to the fees API. + * + * All calls return a vector of tuples (location, xcm) where each "xcm" is executed in "location". + * If there's local execution, the location will be "Here". + * This vector can be used to calculate both execution and delivery fees. + * + * Calls or XCMs might fail when executed, this doesn't mean the result of these calls will be an `Err`. + * In those cases, there might still be a valid result, with the execution error inside it. + * The only reasons why these calls might return an error are listed in the [`Error`] enum. + */ + DryRunApi: { + /** + * Dry run call. + */ + dry_run_call: RuntimeDescriptor<[origin: PolkadotRuntimeOriginCaller, call: Anonymize], Anonymize>; + /** + * Dry run XCM program + */ + dry_run_xcm: RuntimeDescriptor<[origin_location: DotXcmVersionedLocation, xcm: DotXcmVersionedXcm], Anonymize>; + }; + /** + * API for useful conversions between XCM `Location` and `AccountId`. + */ + LocationToAccountApi: { + /** + * Converts `Location` to `AccountId`. + */ + convert_location: RuntimeDescriptor<[location: DotXcmVersionedLocation], Anonymize>; + }; + /** + * API to interact with RuntimeGenesisConfig for the runtime + */ + GenesisBuilder: { + /** + * Build `RuntimeGenesisConfig` from a JSON blob not using any defaults and store it in the + * storage. + * + * In the case of a FRAME-based runtime, this function deserializes the full `RuntimeGenesisConfig` from the given JSON blob and + * puts it into the storage. If the provided JSON blob is incorrect or incomplete or the + * deserialization fails, an error is returned. + * + * Please note that provided JSON blob must contain all `RuntimeGenesisConfig` fields, no + * defaults will be used. + */ + build_state: RuntimeDescriptor<[json: Binary], Anonymize>; + /** + * Returns a JSON blob representation of the built-in `RuntimeGenesisConfig` identified by + * `id`. + * + * If `id` is `None` the function returns JSON blob representation of the default + * `RuntimeGenesisConfig` struct of the runtime. Implementation must provide default + * `RuntimeGenesisConfig`. + * + * Otherwise function returns a JSON representation of the built-in, named + * `RuntimeGenesisConfig` preset identified by `id`, or `None` if such preset does not + * exists. Returned `Vec` contains bytes of JSON blob (patch) which comprises a list of + * (potentially nested) key-value pairs that are intended for customizing the default + * runtime genesis config. The patch shall be merged (rfc7386) with the JSON representation + * of the default `RuntimeGenesisConfig` to create a comprehensive genesis config that can + * be used in `build_state` method. + */ + get_preset: RuntimeDescriptor<[id: Anonymize], Anonymize>; + /** + * Returns a list of identifiers for available builtin `RuntimeGenesisConfig` presets. + * + * The presets from the list can be queried with [`GenesisBuilder::get_preset`] method. If + * no named presets are provided by the runtime the list is empty. + */ + preset_names: RuntimeDescriptor<[], Anonymize>; + }; +}; +type IAsset = PlainDescriptor; +export type DotDispatchError = Anonymize; +type PalletsTypedef = { + __storage: IStorage; + __tx: ICalls; + __event: IEvent; + __error: IError; + __const: IConstants; +}; +type IDescriptors = { + descriptors: { + pallets: PalletsTypedef; + apis: IRuntimeCalls; + } & Promise; + metadataTypes: Promise; + asset: IAsset; + getMetadata: () => Promise; + genesis: string | undefined; +}; +declare const _allDescriptors: IDescriptors; +export default _allDescriptors; +export type DotQueries = QueryFromPalletsDef; +export type DotCalls = TxFromPalletsDef; +export type DotEvents = EventsFromPalletsDef; +export type DotErrors = ErrorsFromPalletsDef; +export type DotConstants = ConstFromPalletsDef; +export type DotCallData = Anonymize & { + value: { + type: string; + }; +}; +export type DotWhitelistEntry = PalletKey | ApiKey | `query.${NestedKey}` | `tx.${NestedKey}` | `event.${NestedKey}` | `error.${NestedKey}` | `const.${NestedKey}`; +type PalletKey = `*.${keyof (IStorage & ICalls & IEvent & IError & IConstants & IRuntimeCalls)}`; +type NestedKey>> = "*" | { + [P in keyof D & string]: `${P}.*` | { + [N in keyof D[P] & string]: `${P}.${N}`; + }[keyof D[P] & string]; +}[keyof D & string]; +type ApiKey>> = "api.*" | { + [P in keyof D & string]: `api.${P}.*` | { + [N in keyof D[P] & string]: `api.${P}.${N}`; + }[keyof D[P] & string]; +}[keyof D & string]; diff --git a/examples/with-vite-papi/.papi/descriptors/dist/dot_metadata-IBIC5C7M.mjs b/examples/with-vite-papi/.papi/descriptors/dist/dot_metadata-IBIC5C7M.mjs new file mode 100644 index 0000000..04379f6 --- /dev/null +++ b/examples/with-vite-papi/.papi/descriptors/dist/dot_metadata-IBIC5C7M.mjs @@ -0,0 +1,6 @@ +// .papi/descriptors/src/dot_metadata.ts +var binMeta = "bWV0YQ8hDwAMHHNwX2NvcmUYY3J5cHRvLEFjY291bnRJZDMyAAAEAAQBIFt1ODsgMzJdAAAEAAADIAAAAAgACAAABQMADAgwZnJhbWVfc3lzdGVtLEFjY291bnRJbmZvCBROb25jZQEQLEFjY291bnREYXRhARQAFAEUbm9uY2UQARROb25jZQABJGNvbnN1bWVycxABIFJlZkNvdW50AAEkcHJvdmlkZXJzEAEgUmVmQ291bnQAASxzdWZmaWNpZW50cxABIFJlZkNvdW50AAEQZGF0YRQBLEFjY291bnREYXRhAAAQAAAFBQAUDDxwYWxsZXRfYmFsYW5jZXMUdHlwZXMsQWNjb3VudERhdGEEHEJhbGFuY2UBGAAQARBmcmVlGAEcQmFsYW5jZQABIHJlc2VydmVkGAEcQmFsYW5jZQABGGZyb3plbhgBHEJhbGFuY2UAARRmbGFncxwBKEV4dHJhRmxhZ3MAABgAAAUHABwMPHBhbGxldF9iYWxhbmNlcxR0eXBlcyhFeHRyYUZsYWdzAAAEABgBEHUxMjgAACAAAAUAACQMNGZyYW1lX3N1cHBvcnQgZGlzcGF0Y2hAUGVyRGlzcGF0Y2hDbGFzcwQEVAEoAAwBGG5vcm1hbCgBBFQAASxvcGVyYXRpb25hbCgBBFQAASRtYW5kYXRvcnkoAQRUAAAoDChzcF93ZWlnaHRzJHdlaWdodF92MhhXZWlnaHQAAAgBIHJlZl90aW1lLAEMdTY0AAEocHJvb2Zfc2l6ZSwBDHU2NAAALAAABjAAMAAABQYANAg8cHJpbWl0aXZlX3R5cGVzEEgyNTYAAAQABAEgW3U4OyAzMl0AADgAAAIIADwQKHNwX3J1bnRpbWUcZ2VuZXJpYxhkaWdlc3QYRGlnZXN0AAAEARBsb2dzQAE8VmVjPERpZ2VzdEl0ZW0+AABAAAACRABEEChzcF9ydW50aW1lHGdlbmVyaWMYZGlnZXN0KERpZ2VzdEl0ZW0AARQoUHJlUnVudGltZQgASAFEQ29uc2Vuc3VzRW5naW5lSWQAADgBHFZlYzx1OD4ABgAkQ29uc2Vuc3VzCABIAURDb25zZW5zdXNFbmdpbmVJZAAAOAEcVmVjPHU4PgAEABBTZWFsCABIAURDb25zZW5zdXNFbmdpbmVJZAAAOAEcVmVjPHU4PgAFABRPdGhlcgQAOAEcVmVjPHU4PgAAAGRSdW50aW1lRW52aXJvbm1lbnRVcGRhdGVkAAgAAEgAAAMEAAAACABMAAACUABQCDBmcmFtZV9zeXN0ZW0sRXZlbnRSZWNvcmQIBEUBVARUATQADAEUcGhhc2XFBwEUUGhhc2UAARRldmVudFQBBEUAARh0b3BpY3OVAQEYVmVjPFQ+AABUCEBwb2xrYWRvdF9ydW50aW1lMFJ1bnRpbWVFdmVudAABoBhTeXN0ZW0EAFgBcGZyYW1lX3N5c3RlbTo6RXZlbnQ8UnVudGltZT4AAAAkU2NoZWR1bGVyBAB8AYBwYWxsZXRfc2NoZWR1bGVyOjpFdmVudDxSdW50aW1lPgABACBQcmVpbWFnZQQAkAF8cGFsbGV0X3ByZWltYWdlOjpFdmVudDxSdW50aW1lPgAKABxJbmRpY2VzBACUAXhwYWxsZXRfaW5kaWNlczo6RXZlbnQ8UnVudGltZT4ABAAgQmFsYW5jZXMEAJgBfHBhbGxldF9iYWxhbmNlczo6RXZlbnQ8UnVudGltZT4ABQBIVHJhbnNhY3Rpb25QYXltZW50BACgAahwYWxsZXRfdHJhbnNhY3Rpb25fcGF5bWVudDo6RXZlbnQ8UnVudGltZT4AIAAcU3Rha2luZwQApAF4cGFsbGV0X3N0YWtpbmc6OkV2ZW50PFJ1bnRpbWU+AAcAIE9mZmVuY2VzBAC8AVhwYWxsZXRfb2ZmZW5jZXM6OkV2ZW50AAgAHFNlc3Npb24EAMQBVHBhbGxldF9zZXNzaW9uOjpFdmVudAAJABxHcmFuZHBhBADIAVRwYWxsZXRfZ3JhbmRwYTo6RXZlbnQACwAgVHJlYXN1cnkEANgBfHBhbGxldF90cmVhc3VyeTo6RXZlbnQ8UnVudGltZT4AEwBAQ29udmljdGlvblZvdGluZwQAZQEBoHBhbGxldF9jb252aWN0aW9uX3ZvdGluZzo6RXZlbnQ8UnVudGltZT4AFAAkUmVmZXJlbmRhBABpAQGAcGFsbGV0X3JlZmVyZW5kYTo6RXZlbnQ8UnVudGltZT4AFQAkV2hpdGVsaXN0BAAFBwGAcGFsbGV0X3doaXRlbGlzdDo6RXZlbnQ8UnVudGltZT4AFwAoUGFyYW1ldGVycwQAGQcBhHBhbGxldF9wYXJhbWV0ZXJzOjpFdmVudDxSdW50aW1lPgAbABhDbGFpbXMEADEHAVhjbGFpbXM6OkV2ZW50PFJ1bnRpbWU+ABgAHFZlc3RpbmcEADUHAXhwYWxsZXRfdmVzdGluZzo6RXZlbnQ8UnVudGltZT4AGQAcVXRpbGl0eQQAOQcBVHBhbGxldF91dGlsaXR5OjpFdmVudAAaABRQcm94eQQAPQcBcHBhbGxldF9wcm94eTo6RXZlbnQ8UnVudGltZT4AHQAgTXVsdGlzaWcEAEEHAXxwYWxsZXRfbXVsdGlzaWc6OkV2ZW50PFJ1bnRpbWU+AB4AIEJvdW50aWVzBABFBwF8cGFsbGV0X2JvdW50aWVzOjpFdmVudDxSdW50aW1lPgAiADRDaGlsZEJvdW50aWVzBABJBwGUcGFsbGV0X2NoaWxkX2JvdW50aWVzOjpFdmVudDxSdW50aW1lPgAmAGhFbGVjdGlvblByb3ZpZGVyTXVsdGlQaGFzZQQATQcB0HBhbGxldF9lbGVjdGlvbl9wcm92aWRlcl9tdWx0aV9waGFzZTo6RXZlbnQ8UnVudGltZT4AJAAkVm90ZXJMaXN0BABdBwH0cGFsbGV0X2JhZ3NfbGlzdDo6RXZlbnQ8UnVudGltZSwgcGFsbGV0X2JhZ3NfbGlzdDo6SW5zdGFuY2UxPgAlADxOb21pbmF0aW9uUG9vbHMEAGEHAZxwYWxsZXRfbm9taW5hdGlvbl9wb29sczo6RXZlbnQ8UnVudGltZT4AJwAsRmFzdFVuc3Rha2UEAGUHAYxwYWxsZXRfZmFzdF91bnN0YWtlOjpFdmVudDxSdW50aW1lPgAoADRQYXJhSW5jbHVzaW9uBABpBwGQcGFyYWNoYWluc19pbmNsdXNpb246OkV2ZW50PFJ1bnRpbWU+ADUAFFBhcmFzBAB5BwFccGFyYWNoYWluc19wYXJhczo6RXZlbnQAOAAQSHJtcAQAfQcBfHBhcmFjaGFpbnNfaHJtcDo6RXZlbnQ8UnVudGltZT4APAA0UGFyYXNEaXNwdXRlcwQAgQcBjHBhcmFjaGFpbnNfZGlzcHV0ZXM6OkV2ZW50PFJ1bnRpbWU+AD4AIE9uRGVtYW5kBACNBwG0cGFyYWNoYWluc19hc3NpZ25lcl9vbl9kZW1hbmQ6OkV2ZW50PFJ1bnRpbWU+AEAAJFJlZ2lzdHJhcgQAkQcBfHBhcmFzX3JlZ2lzdHJhcjo6RXZlbnQ8UnVudGltZT4ARgAUU2xvdHMEAJUHAVRzbG90czo6RXZlbnQ8UnVudGltZT4ARwAgQXVjdGlvbnMEAJkHAWBhdWN0aW9uczo6RXZlbnQ8UnVudGltZT4ASAAkQ3Jvd2Rsb2FuBACdBwFkY3Jvd2Rsb2FuOjpFdmVudDxSdW50aW1lPgBJACBDb3JldGltZQQAoQcBYGNvcmV0aW1lOjpFdmVudDxSdW50aW1lPgBKAEhTdGF0ZVRyaWVNaWdyYXRpb24EAKUHAaxwYWxsZXRfc3RhdGVfdHJpZV9taWdyYXRpb246OkV2ZW50PFJ1bnRpbWU+AGIAJFhjbVBhbGxldAQAsQcBaHBhbGxldF94Y206OkV2ZW50PFJ1bnRpbWU+AGMAME1lc3NhZ2VRdWV1ZQQAuQcBkHBhbGxldF9tZXNzYWdlX3F1ZXVlOjpFdmVudDxSdW50aW1lPgBkACRBc3NldFJhdGUEAMEHAYRwYWxsZXRfYXNzZXRfcmF0ZTo6RXZlbnQ8UnVudGltZT4AZQAAWAwwZnJhbWVfc3lzdGVtGHBhbGxldBRFdmVudAQEVAABHEBFeHRyaW5zaWNTdWNjZXNzBAE0ZGlzcGF0Y2hfaW5mb1wBMERpc3BhdGNoSW5mbwAABJBBbiBleHRyaW5zaWMgY29tcGxldGVkIHN1Y2Nlc3NmdWxseS48RXh0cmluc2ljRmFpbGVkCAE4ZGlzcGF0Y2hfZXJyb3JoATREaXNwYXRjaEVycm9yAAE0ZGlzcGF0Y2hfaW5mb1wBMERpc3BhdGNoSW5mbwABBFBBbiBleHRyaW5zaWMgZmFpbGVkLixDb2RlVXBkYXRlZAACBFBgOmNvZGVgIHdhcyB1cGRhdGVkLihOZXdBY2NvdW50BAEcYWNjb3VudAABMFQ6OkFjY291bnRJZAADBGhBIG5ldyBhY2NvdW50IHdhcyBjcmVhdGVkLjRLaWxsZWRBY2NvdW50BAEcYWNjb3VudAABMFQ6OkFjY291bnRJZAAEBFhBbiBhY2NvdW50IHdhcyByZWFwZWQuIFJlbWFya2VkCAEYc2VuZGVyAAEwVDo6QWNjb3VudElkAAEQaGFzaDQBHFQ6Okhhc2gABQRwT24gb24tY2hhaW4gcmVtYXJrIGhhcHBlbmVkLkRVcGdyYWRlQXV0aG9yaXplZAgBJGNvZGVfaGFzaDQBHFQ6Okhhc2gAATRjaGVja192ZXJzaW9uIAEQYm9vbAAGBGhBbiB1cGdyYWRlIHdhcyBhdXRob3JpemVkLgRwRXZlbnQgZm9yIHRoZSBTeXN0ZW0gcGFsbGV0LlwMNGZyYW1lX3N1cHBvcnQgZGlzcGF0Y2gwRGlzcGF0Y2hJbmZvAAAMARh3ZWlnaHQoARhXZWlnaHQAARRjbGFzc2ABNERpc3BhdGNoQ2xhc3MAASBwYXlzX2ZlZWQBEFBheXMAAGAMNGZyYW1lX3N1cHBvcnQgZGlzcGF0Y2g0RGlzcGF0Y2hDbGFzcwABDBhOb3JtYWwAAAAsT3BlcmF0aW9uYWwAAQAkTWFuZGF0b3J5AAIAAGQMNGZyYW1lX3N1cHBvcnQgZGlzcGF0Y2gQUGF5cwABCAxZZXMAAAAITm8AAQAAaAgoc3BfcnVudGltZTREaXNwYXRjaEVycm9yAAE4FE90aGVyAAAAMENhbm5vdExvb2t1cAABACRCYWRPcmlnaW4AAgAYTW9kdWxlBABsASxNb2R1bGVFcnJvcgADAERDb25zdW1lclJlbWFpbmluZwAEACxOb1Byb3ZpZGVycwAFAEBUb29NYW55Q29uc3VtZXJzAAYAFFRva2VuBABwAShUb2tlbkVycm9yAAcAKEFyaXRobWV0aWMEAHQBPEFyaXRobWV0aWNFcnJvcgAIADRUcmFuc2FjdGlvbmFsBAB4AUhUcmFuc2FjdGlvbmFsRXJyb3IACQAkRXhoYXVzdGVkAAoAKENvcnJ1cHRpb24ACwAsVW5hdmFpbGFibGUADAA4Um9vdE5vdEFsbG93ZWQADQAAbAgoc3BfcnVudGltZSxNb2R1bGVFcnJvcgAACAEUaW5kZXgIAQh1OAABFGVycm9ySAGMW3U4OyBNQVhfTU9EVUxFX0VSUk9SX0VOQ09ERURfU0laRV0AAHAIKHNwX3J1bnRpbWUoVG9rZW5FcnJvcgABKEBGdW5kc1VuYXZhaWxhYmxlAAAAME9ubHlQcm92aWRlcgABADBCZWxvd01pbmltdW0AAgAwQ2Fubm90Q3JlYXRlAAMAMFVua25vd25Bc3NldAAEABhGcm96ZW4ABQAsVW5zdXBwb3J0ZWQABgBAQ2Fubm90Q3JlYXRlSG9sZAAHADROb3RFeHBlbmRhYmxlAAgAHEJsb2NrZWQACQAAdAg0c3BfYXJpdGhtZXRpYzxBcml0aG1ldGljRXJyb3IAAQwkVW5kZXJmbG93AAAAIE92ZXJmbG93AAEAOERpdmlzaW9uQnlaZXJvAAIAAHgIKHNwX3J1bnRpbWVIVHJhbnNhY3Rpb25hbEVycm9yAAEIMExpbWl0UmVhY2hlZAAAABxOb0xheWVyAAEAAHwMQHBhbGxldF9zY2hlZHVsZXIYcGFsbGV0FEV2ZW50BARUAAEkJFNjaGVkdWxlZAgBEHdoZW4QAURCbG9ja051bWJlckZvcjxUPgABFGluZGV4EAEMdTMyAAAEUFNjaGVkdWxlZCBzb21lIHRhc2suIENhbmNlbGVkCAEQd2hlbhABREJsb2NrTnVtYmVyRm9yPFQ+AAEUaW5kZXgQAQx1MzIAAQRMQ2FuY2VsZWQgc29tZSB0YXNrLihEaXNwYXRjaGVkDAEQdGFza4ABeFRhc2tBZGRyZXNzPEJsb2NrTnVtYmVyRm9yPFQ+PgABCGlkhAFAT3B0aW9uPFRhc2tOYW1lPgABGHJlc3VsdIgBOERpc3BhdGNoUmVzdWx0AAIEVERpc3BhdGNoZWQgc29tZSB0YXNrLiBSZXRyeVNldBABEHRhc2uAAXhUYXNrQWRkcmVzczxCbG9ja051bWJlckZvcjxUPj4AAQhpZIQBQE9wdGlvbjxUYXNrTmFtZT4AARhwZXJpb2QQAURCbG9ja051bWJlckZvcjxUPgABHHJldHJpZXMIAQh1OAADBKBTZXQgYSByZXRyeSBjb25maWd1cmF0aW9uIGZvciBzb21lIHRhc2suOFJldHJ5Q2FuY2VsbGVkCAEQdGFza4ABeFRhc2tBZGRyZXNzPEJsb2NrTnVtYmVyRm9yPFQ+PgABCGlkhAFAT3B0aW9uPFRhc2tOYW1lPgAEBKxDYW5jZWwgYSByZXRyeSBjb25maWd1cmF0aW9uIGZvciBzb21lIHRhc2suPENhbGxVbmF2YWlsYWJsZQgBEHRhc2uAAXhUYXNrQWRkcmVzczxCbG9ja051bWJlckZvcjxUPj4AAQhpZIQBQE9wdGlvbjxUYXNrTmFtZT4ABQQpAVRoZSBjYWxsIGZvciB0aGUgcHJvdmlkZWQgaGFzaCB3YXMgbm90IGZvdW5kIHNvIHRoZSB0YXNrIGhhcyBiZWVuIGFib3J0ZWQuOFBlcmlvZGljRmFpbGVkCAEQdGFza4ABeFRhc2tBZGRyZXNzPEJsb2NrTnVtYmVyRm9yPFQ+PgABCGlkhAFAT3B0aW9uPFRhc2tOYW1lPgAGBD0BVGhlIGdpdmVuIHRhc2sgd2FzIHVuYWJsZSB0byBiZSByZW5ld2VkIHNpbmNlIHRoZSBhZ2VuZGEgaXMgZnVsbCBhdCB0aGF0IGJsb2NrLixSZXRyeUZhaWxlZAgBEHRhc2uAAXhUYXNrQWRkcmVzczxCbG9ja051bWJlckZvcjxUPj4AAQhpZIQBQE9wdGlvbjxUYXNrTmFtZT4ABwhdAVRoZSBnaXZlbiB0YXNrIHdhcyB1bmFibGUgdG8gYmUgcmV0cmllZCBzaW5jZSB0aGUgYWdlbmRhIGlzIGZ1bGwgYXQgdGhhdCBibG9jayBvciB0aGVyZZx3YXMgbm90IGVub3VnaCB3ZWlnaHQgdG8gcmVzY2hlZHVsZSBpdC5UUGVybWFuZW50bHlPdmVyd2VpZ2h0CAEQdGFza4ABeFRhc2tBZGRyZXNzPEJsb2NrTnVtYmVyRm9yPFQ+PgABCGlkhAFAT3B0aW9uPFRhc2tOYW1lPgAIBPBUaGUgZ2l2ZW4gdGFzayBjYW4gbmV2ZXIgYmUgZXhlY3V0ZWQgc2luY2UgaXQgaXMgb3ZlcndlaWdodC4EMEV2ZW50cyB0eXBlLoAAAAQIEBAAhAQYT3B0aW9uBARUAQQBCBBOb25lAAAAEFNvbWUEAAQAAAEAAIgEGFJlc3VsdAgEVAGMBEUBaAEICE9rBACMAAAAAAxFcnIEAGgAAAEAAIwAAAQAAJAMPHBhbGxldF9wcmVpbWFnZRhwYWxsZXQURXZlbnQEBFQAAQwUTm90ZWQEARBoYXNoNAEcVDo6SGFzaAAABGhBIHByZWltYWdlIGhhcyBiZWVuIG5vdGVkLiRSZXF1ZXN0ZWQEARBoYXNoNAEcVDo6SGFzaAABBHhBIHByZWltYWdlIGhhcyBiZWVuIHJlcXVlc3RlZC4cQ2xlYXJlZAQBEGhhc2g0ARxUOjpIYXNoAAIEbEEgcHJlaW1hZ2UgaGFzIGJlbiBjbGVhcmVkLgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldJQMOHBhbGxldF9pbmRpY2VzGHBhbGxldBRFdmVudAQEVAABDDRJbmRleEFzc2lnbmVkCAEMd2hvAAEwVDo6QWNjb3VudElkAAEUaW5kZXgQATxUOjpBY2NvdW50SW5kZXgAAAR0QSBhY2NvdW50IGluZGV4IHdhcyBhc3NpZ25lZC4oSW5kZXhGcmVlZAQBFGluZGV4EAE8VDo6QWNjb3VudEluZGV4AAEEvEEgYWNjb3VudCBpbmRleCBoYXMgYmVlbiBmcmVlZCB1cCAodW5hc3NpZ25lZCkuLEluZGV4RnJvemVuCAEUaW5kZXgQATxUOjpBY2NvdW50SW5kZXgAAQx3aG8AATBUOjpBY2NvdW50SWQAAgToQSBhY2NvdW50IGluZGV4IGhhcyBiZWVuIGZyb3plbiB0byBpdHMgY3VycmVudCBhY2NvdW50IElELgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldJgMPHBhbGxldF9iYWxhbmNlcxhwYWxsZXQURXZlbnQIBFQABEkAAVgcRW5kb3dlZAgBHGFjY291bnQAATBUOjpBY2NvdW50SWQAATBmcmVlX2JhbGFuY2UYAShUOjpCYWxhbmNlAAAEuEFuIGFjY291bnQgd2FzIGNyZWF0ZWQgd2l0aCBzb21lIGZyZWUgYmFsYW5jZS4gRHVzdExvc3QIARxhY2NvdW50AAEwVDo6QWNjb3VudElkAAEYYW1vdW50GAEoVDo6QmFsYW5jZQABCD0BQW4gYWNjb3VudCB3YXMgcmVtb3ZlZCB3aG9zZSBiYWxhbmNlIHdhcyBub24temVybyBidXQgYmVsb3cgRXhpc3RlbnRpYWxEZXBvc2l0LHhyZXN1bHRpbmcgaW4gYW4gb3V0cmlnaHQgbG9zcy4gVHJhbnNmZXIMARBmcm9tAAEwVDo6QWNjb3VudElkAAEIdG8AATBUOjpBY2NvdW50SWQAARhhbW91bnQYAShUOjpCYWxhbmNlAAIETFRyYW5zZmVyIHN1Y2NlZWRlZC4oQmFsYW5jZVNldAgBDHdobwABMFQ6OkFjY291bnRJZAABEGZyZWUYAShUOjpCYWxhbmNlAAMEaEEgYmFsYW5jZSB3YXMgc2V0IGJ5IHJvb3QuIFJlc2VydmVkCAEMd2hvAAEwVDo6QWNjb3VudElkAAEYYW1vdW50GAEoVDo6QmFsYW5jZQAEBOBTb21lIGJhbGFuY2Ugd2FzIHJlc2VydmVkIChtb3ZlZCBmcm9tIGZyZWUgdG8gcmVzZXJ2ZWQpLihVbnJlc2VydmVkCAEMd2hvAAEwVDo6QWNjb3VudElkAAEYYW1vdW50GAEoVDo6QmFsYW5jZQAFBOhTb21lIGJhbGFuY2Ugd2FzIHVucmVzZXJ2ZWQgKG1vdmVkIGZyb20gcmVzZXJ2ZWQgdG8gZnJlZSkuSFJlc2VydmVSZXBhdHJpYXRlZBABEGZyb20AATBUOjpBY2NvdW50SWQAAQh0bwABMFQ6OkFjY291bnRJZAABGGFtb3VudBgBKFQ6OkJhbGFuY2UAAUhkZXN0aW5hdGlvbl9zdGF0dXOcARhTdGF0dXMABghNAVNvbWUgYmFsYW5jZSB3YXMgbW92ZWQgZnJvbSB0aGUgcmVzZXJ2ZSBvZiB0aGUgZmlyc3QgYWNjb3VudCB0byB0aGUgc2Vjb25kIGFjY291bnQu2EZpbmFsIGFyZ3VtZW50IGluZGljYXRlcyB0aGUgZGVzdGluYXRpb24gYmFsYW5jZSB0eXBlLhxEZXBvc2l0CAEMd2hvAAEwVDo6QWNjb3VudElkAAEYYW1vdW50GAEoVDo6QmFsYW5jZQAHBNhTb21lIGFtb3VudCB3YXMgZGVwb3NpdGVkIChlLmcuIGZvciB0cmFuc2FjdGlvbiBmZWVzKS4gV2l0aGRyYXcIAQx3aG8AATBUOjpBY2NvdW50SWQAARhhbW91bnQYAShUOjpCYWxhbmNlAAgEHQFTb21lIGFtb3VudCB3YXMgd2l0aGRyYXduIGZyb20gdGhlIGFjY291bnQgKGUuZy4gZm9yIHRyYW5zYWN0aW9uIGZlZXMpLhxTbGFzaGVkCAEMd2hvAAEwVDo6QWNjb3VudElkAAEYYW1vdW50GAEoVDo6QmFsYW5jZQAJBAEBU29tZSBhbW91bnQgd2FzIHJlbW92ZWQgZnJvbSB0aGUgYWNjb3VudCAoZS5nLiBmb3IgbWlzYmVoYXZpb3IpLhhNaW50ZWQIAQx3aG8AATBUOjpBY2NvdW50SWQAARhhbW91bnQYAShUOjpCYWxhbmNlAAoEnFNvbWUgYW1vdW50IHdhcyBtaW50ZWQgaW50byBhbiBhY2NvdW50LhhCdXJuZWQIAQx3aG8AATBUOjpBY2NvdW50SWQAARhhbW91bnQYAShUOjpCYWxhbmNlAAsEnFNvbWUgYW1vdW50IHdhcyBidXJuZWQgZnJvbSBhbiBhY2NvdW50LiRTdXNwZW5kZWQIAQx3aG8AATBUOjpBY2NvdW50SWQAARhhbW91bnQYAShUOjpCYWxhbmNlAAwEFQFTb21lIGFtb3VudCB3YXMgc3VzcGVuZGVkIGZyb20gYW4gYWNjb3VudCAoaXQgY2FuIGJlIHJlc3RvcmVkIGxhdGVyKS4gUmVzdG9yZWQIAQx3aG8AATBUOjpBY2NvdW50SWQAARhhbW91bnQYAShUOjpCYWxhbmNlAA0EpFNvbWUgYW1vdW50IHdhcyByZXN0b3JlZCBpbnRvIGFuIGFjY291bnQuIFVwZ3JhZGVkBAEMd2hvAAEwVDo6QWNjb3VudElkAA4EYEFuIGFjY291bnQgd2FzIHVwZ3JhZGVkLhhJc3N1ZWQEARhhbW91bnQYAShUOjpCYWxhbmNlAA8ELQFUb3RhbCBpc3N1YW5jZSB3YXMgaW5jcmVhc2VkIGJ5IGBhbW91bnRgLCBjcmVhdGluZyBhIGNyZWRpdCB0byBiZSBiYWxhbmNlZC4kUmVzY2luZGVkBAEYYW1vdW50GAEoVDo6QmFsYW5jZQAQBCUBVG90YWwgaXNzdWFuY2Ugd2FzIGRlY3JlYXNlZCBieSBgYW1vdW50YCwgY3JlYXRpbmcgYSBkZWJ0IHRvIGJlIGJhbGFuY2VkLhhMb2NrZWQIAQx3aG8AATBUOjpBY2NvdW50SWQAARhhbW91bnQYAShUOjpCYWxhbmNlABEEYFNvbWUgYmFsYW5jZSB3YXMgbG9ja2VkLiBVbmxvY2tlZAgBDHdobwABMFQ6OkFjY291bnRJZAABGGFtb3VudBgBKFQ6OkJhbGFuY2UAEgRoU29tZSBiYWxhbmNlIHdhcyB1bmxvY2tlZC4YRnJvemVuCAEMd2hvAAEwVDo6QWNjb3VudElkAAEYYW1vdW50GAEoVDo6QmFsYW5jZQATBGBTb21lIGJhbGFuY2Ugd2FzIGZyb3plbi4YVGhhd2VkCAEMd2hvAAEwVDo6QWNjb3VudElkAAEYYW1vdW50GAEoVDo6QmFsYW5jZQAUBGBTb21lIGJhbGFuY2Ugd2FzIHRoYXdlZC5MVG90YWxJc3N1YW5jZUZvcmNlZAgBDG9sZBgBKFQ6OkJhbGFuY2UAAQxuZXcYAShUOjpCYWxhbmNlABUErFRoZSBgVG90YWxJc3N1YW5jZWAgd2FzIGZvcmNlZnVsbHkgY2hhbmdlZC4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXScFDRmcmFtZV9zdXBwb3J0GHRyYWl0cxh0b2tlbnMQbWlzYzRCYWxhbmNlU3RhdHVzAAEIEEZyZWUAAAAgUmVzZXJ2ZWQAAQAAoAxocGFsbGV0X3RyYW5zYWN0aW9uX3BheW1lbnQYcGFsbGV0FEV2ZW50BARUAAEESFRyYW5zYWN0aW9uRmVlUGFpZAwBDHdobwABMFQ6OkFjY291bnRJZAABKGFjdHVhbF9mZWUYATBCYWxhbmNlT2Y8VD4AAQx0aXAYATBCYWxhbmNlT2Y8VD4AAAhZAUEgdHJhbnNhY3Rpb24gZmVlIGBhY3R1YWxfZmVlYCwgb2Ygd2hpY2ggYHRpcGAgd2FzIGFkZGVkIHRvIHRoZSBtaW5pbXVtIGluY2x1c2lvbiBmZWUsXGhhcyBiZWVuIHBhaWQgYnkgYHdob2AuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0pBA4cGFsbGV0X3N0YWtpbmcYcGFsbGV0GHBhbGxldBRFdmVudAQEVAABSBxFcmFQYWlkDAEkZXJhX2luZGV4EAEgRXJhSW5kZXgAAUB2YWxpZGF0b3JfcGF5b3V0GAEwQmFsYW5jZU9mPFQ+AAEkcmVtYWluZGVyGAEwQmFsYW5jZU9mPFQ+AAAIVQFUaGUgZXJhIHBheW91dCBoYXMgYmVlbiBzZXQ7IHRoZSBmaXJzdCBiYWxhbmNlIGlzIHRoZSB2YWxpZGF0b3ItcGF5b3V0OyB0aGUgc2Vjb25kIGlzwHRoZSByZW1haW5kZXIgZnJvbSB0aGUgbWF4aW11bSBhbW91bnQgb2YgcmV3YXJkLiBSZXdhcmRlZAwBFHN0YXNoAAEwVDo6QWNjb3VudElkAAEQZGVzdKgBfFJld2FyZERlc3RpbmF0aW9uPFQ6OkFjY291bnRJZD4AARhhbW91bnQYATBCYWxhbmNlT2Y8VD4AAQQNAVRoZSBub21pbmF0b3IgaGFzIGJlZW4gcmV3YXJkZWQgYnkgdGhpcyBhbW91bnQgdG8gdGhpcyBkZXN0aW5hdGlvbi4cU2xhc2hlZAgBGHN0YWtlcgABMFQ6OkFjY291bnRJZAABGGFtb3VudBgBMEJhbGFuY2VPZjxUPgACBB0BQSBzdGFrZXIgKHZhbGlkYXRvciBvciBub21pbmF0b3IpIGhhcyBiZWVuIHNsYXNoZWQgYnkgdGhlIGdpdmVuIGFtb3VudC40U2xhc2hSZXBvcnRlZAwBJHZhbGlkYXRvcgABMFQ6OkFjY291bnRJZAABIGZyYWN0aW9urAEcUGVyYmlsbAABJHNsYXNoX2VyYRABIEVyYUluZGV4AAMIWQFBIHNsYXNoIGZvciB0aGUgZ2l2ZW4gdmFsaWRhdG9yLCBmb3IgdGhlIGdpdmVuIHBlcmNlbnRhZ2Ugb2YgdGhlaXIgc3Rha2UsIGF0IHRoZSBnaXZlblRlcmEgYXMgYmVlbiByZXBvcnRlZC5oT2xkU2xhc2hpbmdSZXBvcnREaXNjYXJkZWQEATRzZXNzaW9uX2luZGV4EAEwU2Vzc2lvbkluZGV4AAQIGQFBbiBvbGQgc2xhc2hpbmcgcmVwb3J0IGZyb20gYSBwcmlvciBlcmEgd2FzIGRpc2NhcmRlZCBiZWNhdXNlIGl0IGNvdWxkRG5vdCBiZSBwcm9jZXNzZWQuOFN0YWtlcnNFbGVjdGVkAAUEhEEgbmV3IHNldCBvZiBzdGFrZXJzIHdhcyBlbGVjdGVkLhhCb25kZWQIARRzdGFzaAABMFQ6OkFjY291bnRJZAABGGFtb3VudBgBMEJhbGFuY2VPZjxUPgAGENBBbiBhY2NvdW50IGhhcyBib25kZWQgdGhpcyBhbW91bnQuIFxbc3Rhc2gsIGFtb3VudFxdAE0BTk9URTogVGhpcyBldmVudCBpcyBvbmx5IGVtaXR0ZWQgd2hlbiBmdW5kcyBhcmUgYm9uZGVkIHZpYSBhIGRpc3BhdGNoYWJsZS4gTm90YWJseSwhAWl0IHdpbGwgbm90IGJlIGVtaXR0ZWQgZm9yIHN0YWtpbmcgcmV3YXJkcyB3aGVuIHRoZXkgYXJlIGFkZGVkIHRvIHN0YWtlLiBVbmJvbmRlZAgBFHN0YXNoAAEwVDo6QWNjb3VudElkAAEYYW1vdW50GAEwQmFsYW5jZU9mPFQ+AAcEkEFuIGFjY291bnQgaGFzIHVuYm9uZGVkIHRoaXMgYW1vdW50LiRXaXRoZHJhd24IARRzdGFzaAABMFQ6OkFjY291bnRJZAABGGFtb3VudBgBMEJhbGFuY2VPZjxUPgAICFkBQW4gYWNjb3VudCBoYXMgY2FsbGVkIGB3aXRoZHJhd191bmJvbmRlZGAgYW5kIHJlbW92ZWQgdW5ib25kaW5nIGNodW5rcyB3b3J0aCBgQmFsYW5jZWBkZnJvbSB0aGUgdW5sb2NraW5nIHF1ZXVlLhhLaWNrZWQIASRub21pbmF0b3IAATBUOjpBY2NvdW50SWQAARRzdGFzaAABMFQ6OkFjY291bnRJZAAJBLRBIG5vbWluYXRvciBoYXMgYmVlbiBraWNrZWQgZnJvbSBhIHZhbGlkYXRvci5UU3Rha2luZ0VsZWN0aW9uRmFpbGVkAAoErFRoZSBlbGVjdGlvbiBmYWlsZWQuIE5vIG5ldyBlcmEgaXMgcGxhbm5lZC4cQ2hpbGxlZAQBFHN0YXNoAAEwVDo6QWNjb3VudElkAAsEIQFBbiBhY2NvdW50IGhhcyBzdG9wcGVkIHBhcnRpY2lwYXRpbmcgYXMgZWl0aGVyIGEgdmFsaWRhdG9yIG9yIG5vbWluYXRvci40UGF5b3V0U3RhcnRlZAgBJGVyYV9pbmRleBABIEVyYUluZGV4AAE8dmFsaWRhdG9yX3N0YXNoAAEwVDo6QWNjb3VudElkAAwEmFRoZSBzdGFrZXJzJyByZXdhcmRzIGFyZSBnZXR0aW5nIHBhaWQuRFZhbGlkYXRvclByZWZzU2V0CAEUc3Rhc2gAATBUOjpBY2NvdW50SWQAARRwcmVmc7ABOFZhbGlkYXRvclByZWZzAA0EmEEgdmFsaWRhdG9yIGhhcyBzZXQgdGhlaXIgcHJlZmVyZW5jZXMuaFNuYXBzaG90Vm90ZXJzU2l6ZUV4Y2VlZGVkBAEQc2l6ZRABDHUzMgAOBGhWb3RlcnMgc2l6ZSBsaW1pdCByZWFjaGVkLmxTbmFwc2hvdFRhcmdldHNTaXplRXhjZWVkZWQEARBzaXplEAEMdTMyAA8EbFRhcmdldHMgc2l6ZSBsaW1pdCByZWFjaGVkLiBGb3JjZUVyYQQBEG1vZGW4ARxGb3JjaW5nABAEdEEgbmV3IGZvcmNlIGVyYSBtb2RlIHdhcyBzZXQuZENvbnRyb2xsZXJCYXRjaERlcHJlY2F0ZWQEASBmYWlsdXJlcxABDHUzMgARBKRSZXBvcnQgb2YgYSBjb250cm9sbGVyIGJhdGNoIGRlcHJlY2F0aW9uLgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldKgIOHBhbGxldF9zdGFraW5nRFJld2FyZERlc3RpbmF0aW9uBCRBY2NvdW50SWQBAAEUGFN0YWtlZAAAABRTdGFzaAABAChDb250cm9sbGVyAAIAHEFjY291bnQEAAABJEFjY291bnRJZAADABBOb25lAAQAAKwMNHNwX2FyaXRobWV0aWMocGVyX3RoaW5ncxxQZXJiaWxsAAAEABABDHUzMgAAsAg4cGFsbGV0X3N0YWtpbmc4VmFsaWRhdG9yUHJlZnMAAAgBKGNvbW1pc3Npb260ARxQZXJiaWxsAAEcYmxvY2tlZCABEGJvb2wAALQAAAasALgIOHBhbGxldF9zdGFraW5nHEZvcmNpbmcAARAoTm90Rm9yY2luZwAAACBGb3JjZU5ldwABACRGb3JjZU5vbmUAAgAsRm9yY2VBbHdheXMAAwAAvAw8cGFsbGV0X29mZmVuY2VzGHBhbGxldBRFdmVudAABBBxPZmZlbmNlCAEQa2luZMABEEtpbmQAASB0aW1lc2xvdDgBOE9wYXF1ZVRpbWVTbG90AAAMUQFUaGVyZSBpcyBhbiBvZmZlbmNlIHJlcG9ydGVkIG9mIHRoZSBnaXZlbiBga2luZGAgaGFwcGVuZWQgYXQgdGhlIGBzZXNzaW9uX2luZGV4YCBhbmQ1AShraW5kLXNwZWNpZmljKSB0aW1lIHNsb3QuIFRoaXMgZXZlbnQgaXMgbm90IGRlcG9zaXRlZCBmb3IgZHVwbGljYXRlIHNsYXNoZXMuTFxba2luZCwgdGltZXNsb3RcXS4EMEV2ZW50cyB0eXBlLsAAAAMQAAAACADEDDhwYWxsZXRfc2Vzc2lvbhhwYWxsZXQURXZlbnQAAQQoTmV3U2Vzc2lvbgQBNHNlc3Npb25faW5kZXgQATBTZXNzaW9uSW5kZXgAAAg5AU5ldyBzZXNzaW9uIGhhcyBoYXBwZW5lZC4gTm90ZSB0aGF0IHRoZSBhcmd1bWVudCBpcyB0aGUgc2Vzc2lvbiBpbmRleCwgbm90IHRoZZxibG9jayBudW1iZXIgYXMgdGhlIHR5cGUgbWlnaHQgc3VnZ2VzdC4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXTIDDhwYWxsZXRfZ3JhbmRwYRhwYWxsZXQURXZlbnQAAQw4TmV3QXV0aG9yaXRpZXMEATRhdXRob3JpdHlfc2V0zAE0QXV0aG9yaXR5TGlzdAAABIxOZXcgYXV0aG9yaXR5IHNldCBoYXMgYmVlbiBhcHBsaWVkLhhQYXVzZWQAAQSYQ3VycmVudCBhdXRob3JpdHkgc2V0IGhhcyBiZWVuIHBhdXNlZC4cUmVzdW1lZAACBJxDdXJyZW50IGF1dGhvcml0eSBzZXQgaGFzIGJlZW4gcmVzdW1lZC4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXTMAAAC0ADQAAAECNQwANQMUHNwX2NvbnNlbnN1c19ncmFuZHBhDGFwcBhQdWJsaWMAAAQABAE8ZWQyNTUxOTo6UHVibGljAADYDDxwYWxsZXRfdHJlYXN1cnkYcGFsbGV0FEV2ZW50CARUAARJAAEwIFNwZW5kaW5nBAFAYnVkZ2V0X3JlbWFpbmluZxgBPEJhbGFuY2VPZjxULCBJPgAABORXZSBoYXZlIGVuZGVkIGEgc3BlbmQgcGVyaW9kIGFuZCB3aWxsIG5vdyBhbGxvY2F0ZSBmdW5kcy4cQXdhcmRlZAwBOHByb3Bvc2FsX2luZGV4EAE0UHJvcG9zYWxJbmRleAABFGF3YXJkGAE8QmFsYW5jZU9mPFQsIEk+AAEcYWNjb3VudAABMFQ6OkFjY291bnRJZAABBHxTb21lIGZ1bmRzIGhhdmUgYmVlbiBhbGxvY2F0ZWQuFEJ1cm50BAEsYnVybnRfZnVuZHMYATxCYWxhbmNlT2Y8VCwgST4AAgSIU29tZSBvZiBvdXIgZnVuZHMgaGF2ZSBiZWVuIGJ1cm50LiBSb2xsb3ZlcgQBQHJvbGxvdmVyX2JhbGFuY2UYATxCYWxhbmNlT2Y8VCwgST4AAwQtAVNwZW5kaW5nIGhhcyBmaW5pc2hlZDsgdGhpcyBpcyB0aGUgYW1vdW50IHRoYXQgcm9sbHMgb3ZlciB1bnRpbCBuZXh0IHNwZW5kLhxEZXBvc2l0BAEUdmFsdWUYATxCYWxhbmNlT2Y8VCwgST4ABAR8U29tZSBmdW5kcyBoYXZlIGJlZW4gZGVwb3NpdGVkLjRTcGVuZEFwcHJvdmVkDAE4cHJvcG9zYWxfaW5kZXgQATRQcm9wb3NhbEluZGV4AAEYYW1vdW50GAE8QmFsYW5jZU9mPFQsIEk+AAEsYmVuZWZpY2lhcnkAATBUOjpBY2NvdW50SWQABQScQSBuZXcgc3BlbmQgcHJvcG9zYWwgaGFzIGJlZW4gYXBwcm92ZWQuPFVwZGF0ZWRJbmFjdGl2ZQgBLHJlYWN0aXZhdGVkGAE8QmFsYW5jZU9mPFQsIEk+AAEsZGVhY3RpdmF0ZWQYATxCYWxhbmNlT2Y8VCwgST4ABgTMVGhlIGluYWN0aXZlIGZ1bmRzIG9mIHRoZSBwYWxsZXQgaGF2ZSBiZWVuIHVwZGF0ZWQuSEFzc2V0U3BlbmRBcHByb3ZlZBgBFGluZGV4EAEoU3BlbmRJbmRleAABKGFzc2V0X2tpbmTcATBUOjpBc3NldEtpbmQAARhhbW91bnQYAVBBc3NldEJhbGFuY2VPZjxULCBJPgABLGJlbmVmaWNpYXJ5RQEBOFQ6OkJlbmVmaWNpYXJ5AAEodmFsaWRfZnJvbRABREJsb2NrTnVtYmVyRm9yPFQ+AAEkZXhwaXJlX2F0EAFEQmxvY2tOdW1iZXJGb3I8VD4ABwS0QSBuZXcgYXNzZXQgc3BlbmQgcHJvcG9zYWwgaGFzIGJlZW4gYXBwcm92ZWQuQEFzc2V0U3BlbmRWb2lkZWQEARRpbmRleBABKFNwZW5kSW5kZXgACAR0QW4gYXBwcm92ZWQgc3BlbmQgd2FzIHZvaWRlZC4QUGFpZAgBFGluZGV4EAEoU3BlbmRJbmRleAABKHBheW1lbnRfaWQwAWQ8VDo6UGF5bWFzdGVyIGFzIFBheT46OklkAAkETEEgcGF5bWVudCBoYXBwZW5lZC40UGF5bWVudEZhaWxlZAgBFGluZGV4EAEoU3BlbmRJbmRleAABKHBheW1lbnRfaWQwAWQ8VDo6UGF5bWFzdGVyIGFzIFBheT46OklkAAoEkEEgcGF5bWVudCBmYWlsZWQgYW5kIGNhbiBiZSByZXRyaWVkLjhTcGVuZFByb2Nlc3NlZAQBFGluZGV4EAEoU3BlbmRJbmRleAALCE0BQSBzcGVuZCB3YXMgcHJvY2Vzc2VkIGFuZCByZW1vdmVkIGZyb20gdGhlIHN0b3JhZ2UuIEl0IG1pZ2h0IGhhdmUgYmVlbiBzdWNjZXNzZnVsbHlwcGFpZCBvciBpdCBtYXkgaGF2ZSBleHBpcmVkLgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldNwMXHBvbGthZG90X3J1bnRpbWVfY29tbW9uFGltcGxzXFZlcnNpb25lZExvY2F0YWJsZUFzc2V0AAEICFYzCAEgbG9jYXRpb27gAUR4Y206OnYzOjpMb2NhdGlvbgABIGFzc2V0X2lkCQEBQHhjbTo6djM6OkFzc2V0SWQAAwAIVjQIASBsb2NhdGlvbg0BAUR4Y206OnY0OjpMb2NhdGlvbgABIGFzc2V0X2lkQQEBQHhjbTo6djQ6OkFzc2V0SWQABAAA4BAsc3RhZ2luZ194Y20IdjM0bXVsdGlsb2NhdGlvbjRNdWx0aUxvY2F0aW9uAAAIARxwYXJlbnRzCAEIdTgAASBpbnRlcmlvcuQBJEp1bmN0aW9ucwAA5BAMeGNtCHYzJGp1bmN0aW9ucyRKdW5jdGlvbnMAASQQSGVyZQAAAAhYMQQA6AEgSnVuY3Rpb24AAQAIWDIIAOgBIEp1bmN0aW9uAADoASBKdW5jdGlvbgACAAhYMwwA6AEgSnVuY3Rpb24AAOgBIEp1bmN0aW9uAADoASBKdW5jdGlvbgADAAhYNBAA6AEgSnVuY3Rpb24AAOgBIEp1bmN0aW9uAADoASBKdW5jdGlvbgAA6AEgSnVuY3Rpb24ABAAIWDUUAOgBIEp1bmN0aW9uAADoASBKdW5jdGlvbgAA6AEgSnVuY3Rpb24AAOgBIEp1bmN0aW9uAADoASBKdW5jdGlvbgAFAAhYNhgA6AEgSnVuY3Rpb24AAOgBIEp1bmN0aW9uAADoASBKdW5jdGlvbgAA6AEgSnVuY3Rpb24AAOgBIEp1bmN0aW9uAADoASBKdW5jdGlvbgAGAAhYNxwA6AEgSnVuY3Rpb24AAOgBIEp1bmN0aW9uAADoASBKdW5jdGlvbgAA6AEgSnVuY3Rpb24AAOgBIEp1bmN0aW9uAADoASBKdW5jdGlvbgAA6AEgSnVuY3Rpb24ABwAIWDggAOgBIEp1bmN0aW9uAADoASBKdW5jdGlvbgAA6AEgSnVuY3Rpb24AAOgBIEp1bmN0aW9uAADoASBKdW5jdGlvbgAA6AEgSnVuY3Rpb24AAOgBIEp1bmN0aW9uAADoASBKdW5jdGlvbgAIAADoEAx4Y20IdjMganVuY3Rpb24gSnVuY3Rpb24AASgkUGFyYWNoYWluBADsAQx1MzIAAAAsQWNjb3VudElkMzIIARxuZXR3b3Jr8AFET3B0aW9uPE5ldHdvcmtJZD4AAQhpZAQBIFt1ODsgMzJdAAEAOEFjY291bnRJbmRleDY0CAEcbmV0d29ya/ABRE9wdGlvbjxOZXR3b3JrSWQ+AAEUaW5kZXgsAQx1NjQAAgAwQWNjb3VudEtleTIwCAEcbmV0d29ya/ABRE9wdGlvbjxOZXR3b3JrSWQ+AAEMa2V5+AEgW3U4OyAyMF0AAwA4UGFsbGV0SW5zdGFuY2UEAAgBCHU4AAQAMEdlbmVyYWxJbmRleAQA/AEQdTEyOAAFAChHZW5lcmFsS2V5CAEYbGVuZ3RoCAEIdTgAARBkYXRhBAEgW3U4OyAzMl0ABgAkT25seUNoaWxkAAcAJFBsdXJhbGl0eQgBCGlkAQEBGEJvZHlJZAABEHBhcnQFAQEgQm9keVBhcnQACAA8R2xvYmFsQ29uc2Vuc3VzBAD0ASROZXR3b3JrSWQACQAA7AAABhAA8AQYT3B0aW9uBARUAfQBCBBOb25lAAAAEFNvbWUEAPQAAAEAAPQQDHhjbQh2MyBqdW5jdGlvbiROZXR3b3JrSWQAASwkQnlHZW5lc2lzBAAEASBbdTg7IDMyXQAAABhCeUZvcmsIATBibG9ja19udW1iZXIwAQx1NjQAAShibG9ja19oYXNoBAEgW3U4OyAzMl0AAQAgUG9sa2Fkb3QAAgAYS3VzYW1hAAMAHFdlc3RlbmQABAAYUm9jb2NvAAUAGFdvY29jbwAGACBFdGhlcmV1bQQBIGNoYWluX2lkLAEMdTY0AAcALEJpdGNvaW5Db3JlAAgALEJpdGNvaW5DYXNoAAkAQFBvbGthZG90QnVsbGV0aW4ACgAA+AAAAxQAAAAIAPwAAAYYAAEBEAx4Y20IdjMganVuY3Rpb24YQm9keUlkAAEoEFVuaXQAAAAcTW9uaWtlcgQASAEcW3U4OyA0XQABABRJbmRleAQA7AEMdTMyAAIAJEV4ZWN1dGl2ZQADACRUZWNobmljYWwABAAsTGVnaXNsYXRpdmUABQAgSnVkaWNpYWwABgAcRGVmZW5zZQAHADhBZG1pbmlzdHJhdGlvbgAIACBUcmVhc3VyeQAJAAAFARAMeGNtCHYzIGp1bmN0aW9uIEJvZHlQYXJ0AAEUFFZvaWNlAAAAHE1lbWJlcnMEARRjb3VudOwBDHUzMgABACBGcmFjdGlvbggBDG5vbewBDHUzMgABFGRlbm9t7AEMdTMyAAIAREF0TGVhc3RQcm9wb3J0aW9uCAEMbm9t7AEMdTMyAAEUZGVub23sAQx1MzIAAwBITW9yZVRoYW5Qcm9wb3J0aW9uCAEMbm9t7AEMdTMyAAEUZGVub23sAQx1MzIABAAACQEQDHhjbQh2MyhtdWx0aWFzc2V0HEFzc2V0SWQAAQggQ29uY3JldGUEAOABNE11bHRpTG9jYXRpb24AAAAgQWJzdHJhY3QEAAQBIFt1ODsgMzJdAAEAAA0BECxzdGFnaW5nX3hjbQh2NCBsb2NhdGlvbiBMb2NhdGlvbgAACAEccGFyZW50cwgBCHU4AAEgaW50ZXJpb3IRAQEkSnVuY3Rpb25zAAARARAsc3RhZ2luZ194Y20IdjQkanVuY3Rpb25zJEp1bmN0aW9ucwABJBBIZXJlAAAACFgxBAAVAQFIQXJjPFtKdW5jdGlvbjsgMV0+AAEACFgyBAAlAQFIQXJjPFtKdW5jdGlvbjsgMl0+AAIACFgzBAApAQFIQXJjPFtKdW5jdGlvbjsgM10+AAMACFg0BAAtAQFIQXJjPFtKdW5jdGlvbjsgNF0+AAQACFg1BAAxAQFIQXJjPFtKdW5jdGlvbjsgNV0+AAUACFg2BAA1AQFIQXJjPFtKdW5jdGlvbjsgNl0+AAYACFg3BAA5AQFIQXJjPFtKdW5jdGlvbjsgN10+AAcACFg4BAA9AQFIQXJjPFtKdW5jdGlvbjsgOF0+AAgAABUBAAADAQAAABkBABkBECxzdGFnaW5nX3hjbQh2NCBqdW5jdGlvbiBKdW5jdGlvbgABKCRQYXJhY2hhaW4EAOwBDHUzMgAAACxBY2NvdW50SWQzMggBHG5ldHdvcmsdAQFET3B0aW9uPE5ldHdvcmtJZD4AAQhpZAQBIFt1ODsgMzJdAAEAOEFjY291bnRJbmRleDY0CAEcbmV0d29yax0BAURPcHRpb248TmV0d29ya0lkPgABFGluZGV4LAEMdTY0AAIAMEFjY291bnRLZXkyMAgBHG5ldHdvcmsdAQFET3B0aW9uPE5ldHdvcmtJZD4AAQxrZXn4ASBbdTg7IDIwXQADADhQYWxsZXRJbnN0YW5jZQQACAEIdTgABAAwR2VuZXJhbEluZGV4BAD8ARB1MTI4AAUAKEdlbmVyYWxLZXkIARhsZW5ndGgIAQh1OAABEGRhdGEEASBbdTg7IDMyXQAGACRPbmx5Q2hpbGQABwAkUGx1cmFsaXR5CAEIaWQBAQEYQm9keUlkAAEQcGFydAUBASBCb2R5UGFydAAIADxHbG9iYWxDb25zZW5zdXMEACEBASROZXR3b3JrSWQACQAAHQEEGE9wdGlvbgQEVAEhAQEIEE5vbmUAAAAQU29tZQQAIQEAAAEAACEBECxzdGFnaW5nX3hjbQh2NCBqdW5jdGlvbiROZXR3b3JrSWQAASwkQnlHZW5lc2lzBAAEASBbdTg7IDMyXQAAABhCeUZvcmsIATBibG9ja19udW1iZXIwAQx1NjQAAShibG9ja19oYXNoBAEgW3U4OyAzMl0AAQAgUG9sa2Fkb3QAAgAYS3VzYW1hAAMAHFdlc3RlbmQABAAYUm9jb2NvAAUAGFdvY29jbwAGACBFdGhlcmV1bQQBIGNoYWluX2lkLAEMdTY0AAcALEJpdGNvaW5Db3JlAAgALEJpdGNvaW5DYXNoAAkAQFBvbGthZG90QnVsbGV0aW4ACgAAJQEAAAMCAAAAGQEAKQEAAAMDAAAAGQEALQEAAAMEAAAAGQEAMQEAAAMFAAAAGQEANQEAAAMGAAAAGQEAOQEAAAMHAAAAGQEAPQEAAAMIAAAAGQEAQQEQLHN0YWdpbmdfeGNtCHY0FGFzc2V0HEFzc2V0SWQAAAQADQEBIExvY2F0aW9uAABFAQgMeGNtRFZlcnNpb25lZExvY2F0aW9uAAEMCFYyBABJAQFEdjI6Ok11bHRpTG9jYXRpb24AAQAIVjMEAOABRHYzOjpNdWx0aUxvY2F0aW9uAAMACFY0BAANAQEwdjQ6OkxvY2F0aW9uAAQAAEkBEAx4Y20IdjI0bXVsdGlsb2NhdGlvbjRNdWx0aUxvY2F0aW9uAAAIARxwYXJlbnRzCAEIdTgAASBpbnRlcmlvck0BASRKdW5jdGlvbnMAAE0BEAx4Y20IdjI0bXVsdGlsb2NhdGlvbiRKdW5jdGlvbnMAASQQSGVyZQAAAAhYMQQAUQEBIEp1bmN0aW9uAAEACFgyCABRAQEgSnVuY3Rpb24AAFEBASBKdW5jdGlvbgACAAhYMwwAUQEBIEp1bmN0aW9uAABRAQEgSnVuY3Rpb24AAFEBASBKdW5jdGlvbgADAAhYNBAAUQEBIEp1bmN0aW9uAABRAQEgSnVuY3Rpb24AAFEBASBKdW5jdGlvbgAAUQEBIEp1bmN0aW9uAAQACFg1FABRAQEgSnVuY3Rpb24AAFEBASBKdW5jdGlvbgAAUQEBIEp1bmN0aW9uAABRAQEgSnVuY3Rpb24AAFEBASBKdW5jdGlvbgAFAAhYNhgAUQEBIEp1bmN0aW9uAABRAQEgSnVuY3Rpb24AAFEBASBKdW5jdGlvbgAAUQEBIEp1bmN0aW9uAABRAQEgSnVuY3Rpb24AAFEBASBKdW5jdGlvbgAGAAhYNxwAUQEBIEp1bmN0aW9uAABRAQEgSnVuY3Rpb24AAFEBASBKdW5jdGlvbgAAUQEBIEp1bmN0aW9uAABRAQEgSnVuY3Rpb24AAFEBASBKdW5jdGlvbgAAUQEBIEp1bmN0aW9uAAcACFg4IABRAQEgSnVuY3Rpb24AAFEBASBKdW5jdGlvbgAAUQEBIEp1bmN0aW9uAABRAQEgSnVuY3Rpb24AAFEBASBKdW5jdGlvbgAAUQEBIEp1bmN0aW9uAABRAQEgSnVuY3Rpb24AAFEBASBKdW5jdGlvbgAIAABRARAMeGNtCHYyIGp1bmN0aW9uIEp1bmN0aW9uAAEkJFBhcmFjaGFpbgQA7AEMdTMyAAAALEFjY291bnRJZDMyCAEcbmV0d29ya1UBASROZXR3b3JrSWQAAQhpZAQBIFt1ODsgMzJdAAEAOEFjY291bnRJbmRleDY0CAEcbmV0d29ya1UBASROZXR3b3JrSWQAARRpbmRleCwBDHU2NAACADBBY2NvdW50S2V5MjAIARxuZXR3b3JrVQEBJE5ldHdvcmtJZAABDGtlefgBIFt1ODsgMjBdAAMAOFBhbGxldEluc3RhbmNlBAAIAQh1OAAEADBHZW5lcmFsSW5kZXgEAPwBEHUxMjgABQAoR2VuZXJhbEtleQQAWQEBgFdlYWtCb3VuZGVkVmVjPHU4LCBDb25zdFUzMjwzMj4+AAYAJE9ubHlDaGlsZAAHACRQbHVyYWxpdHkIAQhpZF0BARhCb2R5SWQAARBwYXJ0YQEBIEJvZHlQYXJ0AAgAAFUBDAx4Y20IdjIkTmV0d29ya0lkAAEQDEFueQAAABROYW1lZAQAWQEBgFdlYWtCb3VuZGVkVmVjPHU4LCBDb25zdFUzMjwzMj4+AAEAIFBvbGthZG90AAIAGEt1c2FtYQADAABZAQxMYm91bmRlZF9jb2xsZWN0aW9uc0B3ZWFrX2JvdW5kZWRfdmVjOFdlYWtCb3VuZGVkVmVjCARUAQgEUwAABAA4ARhWZWM8VD4AAF0BDAx4Y20IdjIYQm9keUlkAAEoEFVuaXQAAAAUTmFtZWQEAFkBAYBXZWFrQm91bmRlZFZlYzx1OCwgQ29uc3RVMzI8MzI+PgABABRJbmRleAQA7AEMdTMyAAIAJEV4ZWN1dGl2ZQADACRUZWNobmljYWwABAAsTGVnaXNsYXRpdmUABQAgSnVkaWNpYWwABgAcRGVmZW5zZQAHADhBZG1pbmlzdHJhdGlvbgAIACBUcmVhc3VyeQAJAABhAQwMeGNtCHYyIEJvZHlQYXJ0AAEUFFZvaWNlAAAAHE1lbWJlcnMEARRjb3VudOwBDHUzMgABACBGcmFjdGlvbggBDG5vbewBDHUzMgABFGRlbm9t7AEMdTMyAAIAREF0TGVhc3RQcm9wb3J0aW9uCAEMbm9t7AEMdTMyAAEUZGVub23sAQx1MzIAAwBITW9yZVRoYW5Qcm9wb3J0aW9uCAEMbm9t7AEMdTMyAAEUZGVub23sAQx1MzIABAAAZQEMYHBhbGxldF9jb252aWN0aW9uX3ZvdGluZxhwYWxsZXQURXZlbnQIBFQABEkAAQgkRGVsZWdhdGVkCAAAATBUOjpBY2NvdW50SWQAAAABMFQ6OkFjY291bnRJZAAABB0BQW4gYWNjb3VudCBoYXMgZGVsZWdhdGVkIHRoZWlyIHZvdGUgdG8gYW5vdGhlciBhY2NvdW50LiBcW3dobywgdGFyZ2V0XF0sVW5kZWxlZ2F0ZWQEAAABMFQ6OkFjY291bnRJZAABBPRBbiBcW2FjY291bnRcXSBoYXMgY2FuY2VsbGVkIGEgcHJldmlvdXMgZGVsZWdhdGlvbiBvcGVyYXRpb24uBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0aQEMQHBhbGxldF9yZWZlcmVuZGEYcGFsbGV0FEV2ZW50CARUAARJAAFAJFN1Ym1pdHRlZAwBFGluZGV4EAE8UmVmZXJlbmR1bUluZGV4BGBJbmRleCBvZiB0aGUgcmVmZXJlbmR1bS4BFHRyYWNrbQEBPFRyYWNrSWRPZjxULCBJPgQlAVRoZSB0cmFjayAoYW5kIGJ5IGV4dGVuc2lvbiBwcm9wb3NhbCBkaXNwYXRjaCBvcmlnaW4pIG9mIHRoaXMgcmVmZXJlbmR1bS4BIHByb3Bvc2FscQEBTEJvdW5kZWRDYWxsT2Y8VCwgST4EgFRoZSBwcm9wb3NhbCBmb3IgdGhlIHJlZmVyZW5kdW0uAASAQSByZWZlcmVuZHVtIGhhcyBiZWVuIHN1Ym1pdHRlZC5URGVjaXNpb25EZXBvc2l0UGxhY2VkDAEUaW5kZXgQATxSZWZlcmVuZHVtSW5kZXgEYEluZGV4IG9mIHRoZSByZWZlcmVuZHVtLgEMd2hvAAEwVDo6QWNjb3VudElkBIxUaGUgYWNjb3VudCB3aG8gcGxhY2VkIHRoZSBkZXBvc2l0LgEYYW1vdW50GAE8QmFsYW5jZU9mPFQsIEk+BIRUaGUgYW1vdW50IHBsYWNlZCBieSB0aGUgYWNjb3VudC4BBJRUaGUgZGVjaXNpb24gZGVwb3NpdCBoYXMgYmVlbiBwbGFjZWQuXERlY2lzaW9uRGVwb3NpdFJlZnVuZGVkDAEUaW5kZXgQATxSZWZlcmVuZHVtSW5kZXgEYEluZGV4IG9mIHRoZSByZWZlcmVuZHVtLgEMd2hvAAEwVDo6QWNjb3VudElkBIxUaGUgYWNjb3VudCB3aG8gcGxhY2VkIHRoZSBkZXBvc2l0LgEYYW1vdW50GAE8QmFsYW5jZU9mPFQsIEk+BIRUaGUgYW1vdW50IHBsYWNlZCBieSB0aGUgYWNjb3VudC4CBJxUaGUgZGVjaXNpb24gZGVwb3NpdCBoYXMgYmVlbiByZWZ1bmRlZC44RGVwb3NpdFNsYXNoZWQIAQx3aG8AATBUOjpBY2NvdW50SWQEjFRoZSBhY2NvdW50IHdobyBwbGFjZWQgdGhlIGRlcG9zaXQuARhhbW91bnQYATxCYWxhbmNlT2Y8VCwgST4EhFRoZSBhbW91bnQgcGxhY2VkIGJ5IHRoZSBhY2NvdW50LgMEbEEgZGVwb3NpdCBoYXMgYmVlbiBzbGFzaGVkLjxEZWNpc2lvblN0YXJ0ZWQQARRpbmRleBABPFJlZmVyZW5kdW1JbmRleARgSW5kZXggb2YgdGhlIHJlZmVyZW5kdW0uARR0cmFja20BATxUcmFja0lkT2Y8VCwgST4EJQFUaGUgdHJhY2sgKGFuZCBieSBleHRlbnNpb24gcHJvcG9zYWwgZGlzcGF0Y2ggb3JpZ2luKSBvZiB0aGlzIHJlZmVyZW5kdW0uASBwcm9wb3NhbHEBAUxCb3VuZGVkQ2FsbE9mPFQsIEk+BIBUaGUgcHJvcG9zYWwgZm9yIHRoZSByZWZlcmVuZHVtLgEUdGFsbHkBBwEgVDo6VGFsbHkEuFRoZSBjdXJyZW50IHRhbGx5IG9mIHZvdGVzIGluIHRoaXMgcmVmZXJlbmR1bS4EBLxBIHJlZmVyZW5kdW0gaGFzIG1vdmVkIGludG8gdGhlIGRlY2lkaW5nIHBoYXNlLjhDb25maXJtU3RhcnRlZAQBFGluZGV4EAE8UmVmZXJlbmR1bUluZGV4BGBJbmRleCBvZiB0aGUgcmVmZXJlbmR1bS4FADhDb25maXJtQWJvcnRlZAQBFGluZGV4EAE8UmVmZXJlbmR1bUluZGV4BGBJbmRleCBvZiB0aGUgcmVmZXJlbmR1bS4GACRDb25maXJtZWQIARRpbmRleBABPFJlZmVyZW5kdW1JbmRleARgSW5kZXggb2YgdGhlIHJlZmVyZW5kdW0uARR0YWxseQEHASBUOjpUYWxseQSwVGhlIGZpbmFsIHRhbGx5IG9mIHZvdGVzIGluIHRoaXMgcmVmZXJlbmR1bS4HBCEBQSByZWZlcmVuZHVtIGhhcyBlbmRlZCBpdHMgY29uZmlybWF0aW9uIHBoYXNlIGFuZCBpcyByZWFkeSBmb3IgYXBwcm92YWwuIEFwcHJvdmVkBAEUaW5kZXgQATxSZWZlcmVuZHVtSW5kZXgEYEluZGV4IG9mIHRoZSByZWZlcmVuZHVtLggEDQFBIHJlZmVyZW5kdW0gaGFzIGJlZW4gYXBwcm92ZWQgYW5kIGl0cyBwcm9wb3NhbCBoYXMgYmVlbiBzY2hlZHVsZWQuIFJlamVjdGVkCAEUaW5kZXgQATxSZWZlcmVuZHVtSW5kZXgEYEluZGV4IG9mIHRoZSByZWZlcmVuZHVtLgEUdGFsbHkBBwEgVDo6VGFsbHkEsFRoZSBmaW5hbCB0YWxseSBvZiB2b3RlcyBpbiB0aGlzIHJlZmVyZW5kdW0uCQSsQSBwcm9wb3NhbCBoYXMgYmVlbiByZWplY3RlZCBieSByZWZlcmVuZHVtLiBUaW1lZE91dAgBFGluZGV4EAE8UmVmZXJlbmR1bUluZGV4BGBJbmRleCBvZiB0aGUgcmVmZXJlbmR1bS4BFHRhbGx5AQcBIFQ6OlRhbGx5BLBUaGUgZmluYWwgdGFsbHkgb2Ygdm90ZXMgaW4gdGhpcyByZWZlcmVuZHVtLgoE2EEgcmVmZXJlbmR1bSBoYXMgYmVlbiB0aW1lZCBvdXQgd2l0aG91dCBiZWluZyBkZWNpZGVkLiRDYW5jZWxsZWQIARRpbmRleBABPFJlZmVyZW5kdW1JbmRleARgSW5kZXggb2YgdGhlIHJlZmVyZW5kdW0uARR0YWxseQEHASBUOjpUYWxseQSwVGhlIGZpbmFsIHRhbGx5IG9mIHZvdGVzIGluIHRoaXMgcmVmZXJlbmR1bS4LBIBBIHJlZmVyZW5kdW0gaGFzIGJlZW4gY2FuY2VsbGVkLhhLaWxsZWQIARRpbmRleBABPFJlZmVyZW5kdW1JbmRleARgSW5kZXggb2YgdGhlIHJlZmVyZW5kdW0uARR0YWxseQEHASBUOjpUYWxseQSwVGhlIGZpbmFsIHRhbGx5IG9mIHZvdGVzIGluIHRoaXMgcmVmZXJlbmR1bS4MBHRBIHJlZmVyZW5kdW0gaGFzIGJlZW4ga2lsbGVkLmRTdWJtaXNzaW9uRGVwb3NpdFJlZnVuZGVkDAEUaW5kZXgQATxSZWZlcmVuZHVtSW5kZXgEYEluZGV4IG9mIHRoZSByZWZlcmVuZHVtLgEMd2hvAAEwVDo6QWNjb3VudElkBIxUaGUgYWNjb3VudCB3aG8gcGxhY2VkIHRoZSBkZXBvc2l0LgEYYW1vdW50GAE8QmFsYW5jZU9mPFQsIEk+BIRUaGUgYW1vdW50IHBsYWNlZCBieSB0aGUgYWNjb3VudC4NBKRUaGUgc3VibWlzc2lvbiBkZXBvc2l0IGhhcyBiZWVuIHJlZnVuZGVkLixNZXRhZGF0YVNldAgBFGluZGV4EAE8UmVmZXJlbmR1bUluZGV4BGBJbmRleCBvZiB0aGUgcmVmZXJlbmR1bS4BEGhhc2g0ARxUOjpIYXNoBDhQcmVpbWFnZSBoYXNoLg4EnE1ldGFkYXRhIGZvciBhIHJlZmVyZW5kdW0gaGFzIGJlZW4gc2V0LjxNZXRhZGF0YUNsZWFyZWQIARRpbmRleBABPFJlZmVyZW5kdW1JbmRleARgSW5kZXggb2YgdGhlIHJlZmVyZW5kdW0uARBoYXNoNAEcVDo6SGFzaAQ4UHJlaW1hZ2UgaGFzaC4PBKxNZXRhZGF0YSBmb3IgYSByZWZlcmVuZHVtIGhhcyBiZWVuIGNsZWFyZWQuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0bQEAAAUEAHEBEDRmcmFtZV9zdXBwb3J0GHRyYWl0cyRwcmVpbWFnZXMcQm91bmRlZAgEVAF1AQRIAfkGAQwYTGVnYWN5BAEQaGFzaDQBJEg6Ok91dHB1dAAAABhJbmxpbmUEAP0GATRCb3VuZGVkSW5saW5lAAEAGExvb2t1cAgBEGhhc2g0ASRIOjpPdXRwdXQAAQxsZW4QAQx1MzIAAgAAdQEIQHBvbGthZG90X3J1bnRpbWUsUnVudGltZUNhbGwAAbgYU3lzdGVtBAB5AQGtAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxTeXN0ZW0sIFJ1bnRpbWU+AAAAJFNjaGVkdWxlcgQAiQEBuQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8U2NoZWR1bGVyLCBSdW50aW1lPgABACBQcmVpbWFnZQQAkQEBtQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8UHJlaW1hZ2UsIFJ1bnRpbWU+AAoAEEJhYmUEAJkBAaUBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPEJhYmUsIFJ1bnRpbWU+AAIAJFRpbWVzdGFtcAQAvQEBuQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8VGltZXN0YW1wLCBSdW50aW1lPgADABxJbmRpY2VzBADBAQGxAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxJbmRpY2VzLCBSdW50aW1lPgAEACBCYWxhbmNlcwQAzQEBtQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8QmFsYW5jZXMsIFJ1bnRpbWU+AAUAHFN0YWtpbmcEANkBAbEBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPFN0YWtpbmcsIFJ1bnRpbWU+AAcAHFNlc3Npb24EABUCAbEBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPFNlc3Npb24sIFJ1bnRpbWU+AAkAHEdyYW5kcGEEADECAbEBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPEdyYW5kcGEsIFJ1bnRpbWU+AAsAIFRyZWFzdXJ5BABdAgG1AXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxUcmVhc3VyeSwgUnVudGltZT4AEwBAQ29udmljdGlvblZvdGluZwQAZQIB1QFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8Q29udmljdGlvblZvdGluZywgUnVudGltZT4AFAAkUmVmZXJlbmRhBAB5AgG5AXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxSZWZlcmVuZGEsIFJ1bnRpbWU+ABUAJFdoaXRlbGlzdAQAoQIBuQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8V2hpdGVsaXN0LCBSdW50aW1lPgAXAChQYXJhbWV0ZXJzBAClAgG9AXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxQYXJhbWV0ZXJzLCBSdW50aW1lPgAbABhDbGFpbXMEANECAa0Bc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPENsYWltcywgUnVudGltZT4AGAAcVmVzdGluZwQA8QIBsQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8VmVzdGluZywgUnVudGltZT4AGQAcVXRpbGl0eQQA+QIBsQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8VXRpbGl0eSwgUnVudGltZT4AGgAUUHJveHkEAAEDAakBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPFByb3h5LCBSdW50aW1lPgAdACBNdWx0aXNpZwQADQMBtQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8TXVsdGlzaWcsIFJ1bnRpbWU+AB4AIEJvdW50aWVzBAAZAwG1AXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxCb3VudGllcywgUnVudGltZT4AIgA0Q2hpbGRCb3VudGllcwQAHQMByQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8Q2hpbGRCb3VudGllcywgUnVudGltZT4AJgBoRWxlY3Rpb25Qcm92aWRlck11bHRpUGhhc2UEACEDAf0Bc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPEVsZWN0aW9uUHJvdmlkZXJNdWx0aVBoYXNlLCBSdW50aW1lPgAkACRWb3Rlckxpc3QEABUEAbkBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPFZvdGVyTGlzdCwgUnVudGltZT4AJQA8Tm9taW5hdGlvblBvb2xzBAAZBAHRAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxOb21pbmF0aW9uUG9vbHMsIFJ1bnRpbWU+ACcALEZhc3RVbnN0YWtlBABNBAHBAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxGYXN0VW5zdGFrZSwgUnVudGltZT4AKAA0Q29uZmlndXJhdGlvbgQAUQQByQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8Q29uZmlndXJhdGlvbiwgUnVudGltZT4AMwAsUGFyYXNTaGFyZWQEAHUEAcEBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPFBhcmFzU2hhcmVkLCBSdW50aW1lPgA0ADRQYXJhSW5jbHVzaW9uBAB5BAHJAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxQYXJhSW5jbHVzaW9uLCBSdW50aW1lPgA1ADBQYXJhSW5oZXJlbnQEAH0EAcUBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPFBhcmFJbmhlcmVudCwgUnVudGltZT4ANgAUUGFyYXMEAAkFAakBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPFBhcmFzLCBSdW50aW1lPgA4ACxJbml0aWFsaXplcgQAEQUBwQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8SW5pdGlhbGl6ZXIsIFJ1bnRpbWU+ADkAEEhybXAEABUFAaUBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPEhybXAsIFJ1bnRpbWU+ADwANFBhcmFzRGlzcHV0ZXMEAB0FAckBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPFBhcmFzRGlzcHV0ZXMsIFJ1bnRpbWU+AD4ANFBhcmFzU2xhc2hpbmcEACEFAckBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPFBhcmFzU2xhc2hpbmcsIFJ1bnRpbWU+AD8AIE9uRGVtYW5kBAAxBQG1AXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxPbkRlbWFuZCwgUnVudGltZT4AQAAkUmVnaXN0cmFyBAA1BQG5AXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxSZWdpc3RyYXIsIFJ1bnRpbWU+AEYAFFNsb3RzBAA5BQGpAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxTbG90cywgUnVudGltZT4ARwAgQXVjdGlvbnMEAD0FAbUBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPEF1Y3Rpb25zLCBSdW50aW1lPgBIACRDcm93ZGxvYW4EAEUFAbkBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPENyb3dkbG9hbiwgUnVudGltZT4ASQAgQ29yZXRpbWUEAFkFAbUBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPENvcmV0aW1lLCBSdW50aW1lPgBKAEhTdGF0ZVRyaWVNaWdyYXRpb24EAG0FAd0Bc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPFN0YXRlVHJpZU1pZ3JhdGlvbiwgUnVudGltZT4AYgAkWGNtUGFsbGV0BACFBQG5AXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxYY21QYWxsZXQsIFJ1bnRpbWU+AGMAME1lc3NhZ2VRdWV1ZQQAwQYBxQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8TWVzc2FnZVF1ZXVlLCBSdW50aW1lPgBkACRBc3NldFJhdGUEAM0GAbkBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPEFzc2V0UmF0ZSwgUnVudGltZT4AZQAUQmVlZnkEANUGAakBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPEJlZWZ5LCBSdW50aW1lPgDIAAB5AQwwZnJhbWVfc3lzdGVtGHBhbGxldBBDYWxsBARUAAEsGHJlbWFyawQBGHJlbWFyazgBHFZlYzx1OD4AAAxoTWFrZSBzb21lIG9uLWNoYWluIHJlbWFyay4AiENhbiBiZSBleGVjdXRlZCBieSBldmVyeSBgb3JpZ2luYC44c2V0X2hlYXBfcGFnZXMEARRwYWdlczABDHU2NAABBPhTZXQgdGhlIG51bWJlciBvZiBwYWdlcyBpbiB0aGUgV2ViQXNzZW1ibHkgZW52aXJvbm1lbnQncyBoZWFwLiBzZXRfY29kZQQBEGNvZGU4ARxWZWM8dTg+AAIEZFNldCB0aGUgbmV3IHJ1bnRpbWUgY29kZS5cc2V0X2NvZGVfd2l0aG91dF9jaGVja3MEARBjb2RlOAEcVmVjPHU4PgADEBkBU2V0IHRoZSBuZXcgcnVudGltZSBjb2RlIHdpdGhvdXQgZG9pbmcgYW55IGNoZWNrcyBvZiB0aGUgZ2l2ZW4gYGNvZGVgLgBRAU5vdGUgdGhhdCBydW50aW1lIHVwZ3JhZGVzIHdpbGwgbm90IHJ1biBpZiB0aGlzIGlzIGNhbGxlZCB3aXRoIGEgbm90LWluY3JlYXNpbmcgc3BlYyB2ZXJzaW9uISxzZXRfc3RvcmFnZQQBFGl0ZW1zfQEBNFZlYzxLZXlWYWx1ZT4ABARoU2V0IHNvbWUgaXRlbXMgb2Ygc3RvcmFnZS4wa2lsbF9zdG9yYWdlBAEQa2V5c4UBASBWZWM8S2V5PgAFBHRLaWxsIHNvbWUgaXRlbXMgZnJvbSBzdG9yYWdlLixraWxsX3ByZWZpeAgBGHByZWZpeDgBDEtleQABHHN1YmtleXMQAQx1MzIABhARAUtpbGwgYWxsIHN0b3JhZ2UgaXRlbXMgd2l0aCBhIGtleSB0aGF0IHN0YXJ0cyB3aXRoIHRoZSBnaXZlbiBwcmVmaXguADkBKipOT1RFOioqIFdlIHJlbHkgb24gdGhlIFJvb3Qgb3JpZ2luIHRvIHByb3ZpZGUgdXMgdGhlIG51bWJlciBvZiBzdWJrZXlzIHVuZGVyPQF0aGUgcHJlZml4IHdlIGFyZSByZW1vdmluZyB0byBhY2N1cmF0ZWx5IGNhbGN1bGF0ZSB0aGUgd2VpZ2h0IG9mIHRoaXMgZnVuY3Rpb24uRHJlbWFya193aXRoX2V2ZW50BAEYcmVtYXJrOAEcVmVjPHU4PgAHBKRNYWtlIHNvbWUgb24tY2hhaW4gcmVtYXJrIGFuZCBlbWl0IGV2ZW50LkRhdXRob3JpemVfdXBncmFkZQQBJGNvZGVfaGFzaDQBHFQ6Okhhc2gACRBhAUF1dGhvcml6ZSBhbiB1cGdyYWRlIHRvIGEgZ2l2ZW4gYGNvZGVfaGFzaGAgZm9yIHRoZSBydW50aW1lLiBUaGUgcnVudGltZSBjYW4gYmUgc3VwcGxpZWQYbGF0ZXIuAHxUaGlzIGNhbGwgcmVxdWlyZXMgUm9vdCBvcmlnaW4ugGF1dGhvcml6ZV91cGdyYWRlX3dpdGhvdXRfY2hlY2tzBAEkY29kZV9oYXNoNAEcVDo6SGFzaAAKIGEBQXV0aG9yaXplIGFuIHVwZ3JhZGUgdG8gYSBnaXZlbiBgY29kZV9oYXNoYCBmb3IgdGhlIHJ1bnRpbWUuIFRoZSBydW50aW1lIGNhbiBiZSBzdXBwbGllZBhsYXRlci4AXQFXQVJOSU5HOiBUaGlzIGF1dGhvcml6ZXMgYW4gdXBncmFkZSB0aGF0IHdpbGwgdGFrZSBwbGFjZSB3aXRob3V0IGFueSBzYWZldHkgY2hlY2tzLCBmb3JZAWV4YW1wbGUgdGhhdCB0aGUgc3BlYyBuYW1lIHJlbWFpbnMgdGhlIHNhbWUgYW5kIHRoYXQgdGhlIHZlcnNpb24gbnVtYmVyIGluY3JlYXNlcy4gTm908HJlY29tbWVuZGVkIGZvciBub3JtYWwgdXNlLiBVc2UgYGF1dGhvcml6ZV91cGdyYWRlYCBpbnN0ZWFkLgB8VGhpcyBjYWxsIHJlcXVpcmVzIFJvb3Qgb3JpZ2luLmBhcHBseV9hdXRob3JpemVkX3VwZ3JhZGUEARBjb2RlOAEcVmVjPHU4PgALJFUBUHJvdmlkZSB0aGUgcHJlaW1hZ2UgKHJ1bnRpbWUgYmluYXJ5KSBgY29kZWAgZm9yIGFuIHVwZ3JhZGUgdGhhdCBoYXMgYmVlbiBhdXRob3JpemVkLgBJAUlmIHRoZSBhdXRob3JpemF0aW9uIHJlcXVpcmVkIGEgdmVyc2lvbiBjaGVjaywgdGhpcyBjYWxsIHdpbGwgZW5zdXJlIHRoZSBzcGVjIG5hbWXocmVtYWlucyB1bmNoYW5nZWQgYW5kIHRoYXQgdGhlIHNwZWMgdmVyc2lvbiBoYXMgaW5jcmVhc2VkLgBZAURlcGVuZGluZyBvbiB0aGUgcnVudGltZSdzIGBPblNldENvZGVgIGNvbmZpZ3VyYXRpb24sIHRoaXMgZnVuY3Rpb24gbWF5IGRpcmVjdGx5IGFwcGx5EQF0aGUgbmV3IGBjb2RlYCBpbiB0aGUgc2FtZSBibG9jayBvciBhdHRlbXB0IHRvIHNjaGVkdWxlIHRoZSB1cGdyYWRlLgBgQWxsIG9yaWdpbnMgYXJlIGFsbG93ZWQuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLn0BAAACgQEAgQEAAAQIODgAhQEAAAI4AIkBDEBwYWxsZXRfc2NoZWR1bGVyGHBhbGxldBBDYWxsBARUAAEoIHNjaGVkdWxlEAEQd2hlbhABREJsb2NrTnVtYmVyRm9yPFQ+AAE4bWF5YmVfcGVyaW9kaWONAQGsT3B0aW9uPHNjaGVkdWxlOjpQZXJpb2Q8QmxvY2tOdW1iZXJGb3I8VD4+PgABIHByaW9yaXR5CAFIc2NoZWR1bGU6OlByaW9yaXR5AAEQY2FsbHUBAXxCb3g8PFQgYXMgQ29uZmlnPjo6UnVudGltZUNhbGw+AAAEcEFub255bW91c2x5IHNjaGVkdWxlIGEgdGFzay4YY2FuY2VsCAEQd2hlbhABREJsb2NrTnVtYmVyRm9yPFQ+AAEUaW5kZXgQAQx1MzIAAQSUQ2FuY2VsIGFuIGFub255bW91c2x5IHNjaGVkdWxlZCB0YXNrLjhzY2hlZHVsZV9uYW1lZBQBCGlkBAEgVGFza05hbWUAARB3aGVuEAFEQmxvY2tOdW1iZXJGb3I8VD4AAThtYXliZV9wZXJpb2RpY40BAaxPcHRpb248c2NoZWR1bGU6OlBlcmlvZDxCbG9ja051bWJlckZvcjxUPj4+AAEgcHJpb3JpdHkIAUhzY2hlZHVsZTo6UHJpb3JpdHkAARBjYWxsdQEBfEJveDw8VCBhcyBDb25maWc+OjpSdW50aW1lQ2FsbD4AAgRYU2NoZWR1bGUgYSBuYW1lZCB0YXNrLjBjYW5jZWxfbmFtZWQEAQhpZAQBIFRhc2tOYW1lAAMEeENhbmNlbCBhIG5hbWVkIHNjaGVkdWxlZCB0YXNrLjhzY2hlZHVsZV9hZnRlchABFGFmdGVyEAFEQmxvY2tOdW1iZXJGb3I8VD4AAThtYXliZV9wZXJpb2RpY40BAaxPcHRpb248c2NoZWR1bGU6OlBlcmlvZDxCbG9ja051bWJlckZvcjxUPj4+AAEgcHJpb3JpdHkIAUhzY2hlZHVsZTo6UHJpb3JpdHkAARBjYWxsdQEBfEJveDw8VCBhcyBDb25maWc+OjpSdW50aW1lQ2FsbD4ABASoQW5vbnltb3VzbHkgc2NoZWR1bGUgYSB0YXNrIGFmdGVyIGEgZGVsYXkuUHNjaGVkdWxlX25hbWVkX2FmdGVyFAEIaWQEASBUYXNrTmFtZQABFGFmdGVyEAFEQmxvY2tOdW1iZXJGb3I8VD4AAThtYXliZV9wZXJpb2RpY40BAaxPcHRpb248c2NoZWR1bGU6OlBlcmlvZDxCbG9ja051bWJlckZvcjxUPj4+AAEgcHJpb3JpdHkIAUhzY2hlZHVsZTo6UHJpb3JpdHkAARBjYWxsdQEBfEJveDw8VCBhcyBDb25maWc+OjpSdW50aW1lQ2FsbD4ABQSQU2NoZWR1bGUgYSBuYW1lZCB0YXNrIGFmdGVyIGEgZGVsYXkuJHNldF9yZXRyeQwBEHRhc2uAAXhUYXNrQWRkcmVzczxCbG9ja051bWJlckZvcjxUPj4AARxyZXRyaWVzCAEIdTgAARhwZXJpb2QQAURCbG9ja051bWJlckZvcjxUPgAGMFkBU2V0IGEgcmV0cnkgY29uZmlndXJhdGlvbiBmb3IgYSB0YXNrIHNvIHRoYXQsIGluIGNhc2UgaXRzIHNjaGVkdWxlZCBydW4gZmFpbHMsIGl0IHdpbGxVAWJlIHJldHJpZWQgYWZ0ZXIgYHBlcmlvZGAgYmxvY2tzLCBmb3IgYSB0b3RhbCBhbW91bnQgb2YgYHJldHJpZXNgIHJldHJpZXMgb3IgdW50aWwgaXQkc3VjY2VlZHMuAFUBVGFza3Mgd2hpY2ggbmVlZCB0byBiZSBzY2hlZHVsZWQgZm9yIGEgcmV0cnkgYXJlIHN0aWxsIHN1YmplY3QgdG8gd2VpZ2h0IG1ldGVyaW5nIGFuZFEBYWdlbmRhIHNwYWNlLCBzYW1lIGFzIGEgcmVndWxhciB0YXNrLiBJZiBhIHBlcmlvZGljIHRhc2sgZmFpbHMsIGl0IHdpbGwgYmUgc2NoZWR1bGVkkG5vcm1hbGx5IHdoaWxlIHRoZSB0YXNrIGlzIHJldHJ5aW5nLgBRAVRhc2tzIHNjaGVkdWxlZCBhcyBhIHJlc3VsdCBvZiBhIHJldHJ5IGZvciBhIHBlcmlvZGljIHRhc2sgYXJlIHVubmFtZWQsIG5vbi1wZXJpb2RpYz0BY2xvbmVzIG9mIHRoZSBvcmlnaW5hbCB0YXNrLiBUaGVpciByZXRyeSBjb25maWd1cmF0aW9uIHdpbGwgYmUgZGVyaXZlZCBmcm9tIHRoZU0Bb3JpZ2luYWwgdGFzaydzIGNvbmZpZ3VyYXRpb24sIGJ1dCB3aWxsIGhhdmUgYSBsb3dlciB2YWx1ZSBmb3IgYHJlbWFpbmluZ2AgdGhhbiB0aGVkb3JpZ2luYWwgYHRvdGFsX3JldHJpZXNgLjxzZXRfcmV0cnlfbmFtZWQMAQhpZAQBIFRhc2tOYW1lAAEccmV0cmllcwgBCHU4AAEYcGVyaW9kEAFEQmxvY2tOdW1iZXJGb3I8VD4ABzBdAVNldCBhIHJldHJ5IGNvbmZpZ3VyYXRpb24gZm9yIGEgbmFtZWQgdGFzayBzbyB0aGF0LCBpbiBjYXNlIGl0cyBzY2hlZHVsZWQgcnVuIGZhaWxzLCBpdF0Bd2lsbCBiZSByZXRyaWVkIGFmdGVyIGBwZXJpb2RgIGJsb2NrcywgZm9yIGEgdG90YWwgYW1vdW50IG9mIGByZXRyaWVzYCByZXRyaWVzIG9yIHVudGlsMGl0IHN1Y2NlZWRzLgBVAVRhc2tzIHdoaWNoIG5lZWQgdG8gYmUgc2NoZWR1bGVkIGZvciBhIHJldHJ5IGFyZSBzdGlsbCBzdWJqZWN0IHRvIHdlaWdodCBtZXRlcmluZyBhbmRRAWFnZW5kYSBzcGFjZSwgc2FtZSBhcyBhIHJlZ3VsYXIgdGFzay4gSWYgYSBwZXJpb2RpYyB0YXNrIGZhaWxzLCBpdCB3aWxsIGJlIHNjaGVkdWxlZJBub3JtYWxseSB3aGlsZSB0aGUgdGFzayBpcyByZXRyeWluZy4AUQFUYXNrcyBzY2hlZHVsZWQgYXMgYSByZXN1bHQgb2YgYSByZXRyeSBmb3IgYSBwZXJpb2RpYyB0YXNrIGFyZSB1bm5hbWVkLCBub24tcGVyaW9kaWM9AWNsb25lcyBvZiB0aGUgb3JpZ2luYWwgdGFzay4gVGhlaXIgcmV0cnkgY29uZmlndXJhdGlvbiB3aWxsIGJlIGRlcml2ZWQgZnJvbSB0aGVNAW9yaWdpbmFsIHRhc2sncyBjb25maWd1cmF0aW9uLCBidXQgd2lsbCBoYXZlIGEgbG93ZXIgdmFsdWUgZm9yIGByZW1haW5pbmdgIHRoYW4gdGhlZG9yaWdpbmFsIGB0b3RhbF9yZXRyaWVzYC4wY2FuY2VsX3JldHJ5BAEQdGFza4ABeFRhc2tBZGRyZXNzPEJsb2NrTnVtYmVyRm9yPFQ+PgAIBKhSZW1vdmVzIHRoZSByZXRyeSBjb25maWd1cmF0aW9uIG9mIGEgdGFzay5IY2FuY2VsX3JldHJ5X25hbWVkBAEIaWQEASBUYXNrTmFtZQAJBLxDYW5jZWwgdGhlIHJldHJ5IGNvbmZpZ3VyYXRpb24gb2YgYSBuYW1lZCB0YXNrLgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy6NAQQYT3B0aW9uBARUAYABCBBOb25lAAAAEFNvbWUEAIAAAAEAAJEBDDxwYWxsZXRfcHJlaW1hZ2UYcGFsbGV0EENhbGwEBFQAARQ0bm90ZV9wcmVpbWFnZQQBFGJ5dGVzOAEcVmVjPHU4PgAAEHRSZWdpc3RlciBhIHByZWltYWdlIG9uLWNoYWluLgBVAUlmIHRoZSBwcmVpbWFnZSB3YXMgcHJldmlvdXNseSByZXF1ZXN0ZWQsIG5vIGZlZXMgb3IgZGVwb3NpdHMgYXJlIHRha2VuIGZvciBwcm92aWRpbmdVAXRoZSBwcmVpbWFnZS4gT3RoZXJ3aXNlLCBhIGRlcG9zaXQgaXMgdGFrZW4gcHJvcG9ydGlvbmFsIHRvIHRoZSBzaXplIG9mIHRoZSBwcmVpbWFnZS48dW5ub3RlX3ByZWltYWdlBAEQaGFzaDQBHFQ6Okhhc2gAARjcQ2xlYXIgYW4gdW5yZXF1ZXN0ZWQgcHJlaW1hZ2UgZnJvbSB0aGUgcnVudGltZSBzdG9yYWdlLgD8SWYgYGxlbmAgaXMgcHJvdmlkZWQsIHRoZW4gaXQgd2lsbCBiZSBhIG11Y2ggY2hlYXBlciBvcGVyYXRpb24uAAEBLSBgaGFzaGA6IFRoZSBoYXNoIG9mIHRoZSBwcmVpbWFnZSB0byBiZSByZW1vdmVkIGZyb20gdGhlIHN0b3JlLrgtIGBsZW5gOiBUaGUgbGVuZ3RoIG9mIHRoZSBwcmVpbWFnZSBvZiBgaGFzaGAuQHJlcXVlc3RfcHJlaW1hZ2UEARBoYXNoNAEcVDo6SGFzaAACEEEBUmVxdWVzdCBhIHByZWltYWdlIGJlIHVwbG9hZGVkIHRvIHRoZSBjaGFpbiB3aXRob3V0IHBheWluZyBhbnkgZmVlcyBvciBkZXBvc2l0cy4AVQFJZiB0aGUgcHJlaW1hZ2UgcmVxdWVzdHMgaGFzIGFscmVhZHkgYmVlbiBwcm92aWRlZCBvbi1jaGFpbiwgd2UgdW5yZXNlcnZlIGFueSBkZXBvc2l0OQFhIHVzZXIgbWF5IGhhdmUgcGFpZCwgYW5kIHRha2UgdGhlIGNvbnRyb2wgb2YgdGhlIHByZWltYWdlIG91dCBvZiB0aGVpciBoYW5kcy5IdW5yZXF1ZXN0X3ByZWltYWdlBAEQaGFzaDQBHFQ6Okhhc2gAAwy8Q2xlYXIgYSBwcmV2aW91c2x5IG1hZGUgcmVxdWVzdCBmb3IgYSBwcmVpbWFnZS4ALQFOT1RFOiBUSElTIE1VU1QgTk9UIEJFIENBTExFRCBPTiBgaGFzaGAgTU9SRSBUSU1FUyBUSEFOIGByZXF1ZXN0X3ByZWltYWdlYC44ZW5zdXJlX3VwZGF0ZWQEARhoYXNoZXOVAQEwVmVjPFQ6Okhhc2g+AAQMxEVuc3VyZSB0aGF0IHRoZSBhIGJ1bGsgb2YgcHJlLWltYWdlcyBpcyB1cGdyYWRlZC4APQFUaGUgY2FsbGVyIHBheXMgbm8gZmVlIGlmIGF0IGxlYXN0IDkwJSBvZiBwcmUtaW1hZ2VzIHdlcmUgc3VjY2Vzc2Z1bGx5IHVwZGF0ZWQuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLpUBAAACNACZAQwscGFsbGV0X2JhYmUYcGFsbGV0EENhbGwEBFQAAQxMcmVwb3J0X2VxdWl2b2NhdGlvbggBSGVxdWl2b2NhdGlvbl9wcm9vZp0BAZBCb3g8RXF1aXZvY2F0aW9uUHJvb2Y8SGVhZGVyRm9yPFQ+Pj4AATxrZXlfb3duZXJfcHJvb2atAQFAVDo6S2V5T3duZXJQcm9vZgAAEAkBUmVwb3J0IGF1dGhvcml0eSBlcXVpdm9jYXRpb24vbWlzYmVoYXZpb3IuIFRoaXMgbWV0aG9kIHdpbGwgdmVyaWZ5BQF0aGUgZXF1aXZvY2F0aW9uIHByb29mIGFuZCB2YWxpZGF0ZSB0aGUgZ2l2ZW4ga2V5IG93bmVyc2hpcCBwcm9vZg0BYWdhaW5zdCB0aGUgZXh0cmFjdGVkIG9mZmVuZGVyLiBJZiBib3RoIGFyZSB2YWxpZCwgdGhlIG9mZmVuY2Ugd2lsbDBiZSByZXBvcnRlZC5wcmVwb3J0X2VxdWl2b2NhdGlvbl91bnNpZ25lZAgBSGVxdWl2b2NhdGlvbl9wcm9vZp0BAZBCb3g8RXF1aXZvY2F0aW9uUHJvb2Y8SGVhZGVyRm9yPFQ+Pj4AATxrZXlfb3duZXJfcHJvb2atAQFAVDo6S2V5T3duZXJQcm9vZgABIAkBUmVwb3J0IGF1dGhvcml0eSBlcXVpdm9jYXRpb24vbWlzYmVoYXZpb3IuIFRoaXMgbWV0aG9kIHdpbGwgdmVyaWZ5BQF0aGUgZXF1aXZvY2F0aW9uIHByb29mIGFuZCB2YWxpZGF0ZSB0aGUgZ2l2ZW4ga2V5IG93bmVyc2hpcCBwcm9vZg0BYWdhaW5zdCB0aGUgZXh0cmFjdGVkIG9mZmVuZGVyLiBJZiBib3RoIGFyZSB2YWxpZCwgdGhlIG9mZmVuY2Ugd2lsbDBiZSByZXBvcnRlZC4NAVRoaXMgZXh0cmluc2ljIG11c3QgYmUgY2FsbGVkIHVuc2lnbmVkIGFuZCBpdCBpcyBleHBlY3RlZCB0aGF0IG9ubHkVAWJsb2NrIGF1dGhvcnMgd2lsbCBjYWxsIGl0ICh2YWxpZGF0ZWQgaW4gYFZhbGlkYXRlVW5zaWduZWRgKSwgYXMgc3VjaBUBaWYgdGhlIGJsb2NrIGF1dGhvciBpcyBkZWZpbmVkIGl0IHdpbGwgYmUgZGVmaW5lZCBhcyB0aGUgZXF1aXZvY2F0aW9uJHJlcG9ydGVyLkhwbGFuX2NvbmZpZ19jaGFuZ2UEARhjb25maWexAQFQTmV4dENvbmZpZ0Rlc2NyaXB0b3IAAhBdAVBsYW4gYW4gZXBvY2ggY29uZmlnIGNoYW5nZS4gVGhlIGVwb2NoIGNvbmZpZyBjaGFuZ2UgaXMgcmVjb3JkZWQgYW5kIHdpbGwgYmUgZW5hY3RlZCBvblEBdGhlIG5leHQgY2FsbCB0byBgZW5hY3RfZXBvY2hfY2hhbmdlYC4gVGhlIGNvbmZpZyB3aWxsIGJlIGFjdGl2YXRlZCBvbmUgZXBvY2ggYWZ0ZXIuWQFNdWx0aXBsZSBjYWxscyB0byB0aGlzIG1ldGhvZCB3aWxsIHJlcGxhY2UgYW55IGV4aXN0aW5nIHBsYW5uZWQgY29uZmlnIGNoYW5nZSB0aGF0IGhhZFRub3QgYmVlbiBlbmFjdGVkIHlldC4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMunQEISHNwX2NvbnNlbnN1c19zbG90c0RFcXVpdm9jYXRpb25Qcm9vZggYSGVhZGVyAaEBCElkAaUBABABIG9mZmVuZGVypQEBCElkAAEQc2xvdKkBARBTbG90AAEwZmlyc3RfaGVhZGVyoQEBGEhlYWRlcgABNHNlY29uZF9oZWFkZXKhAQEYSGVhZGVyAAChARAoc3BfcnVudGltZRxnZW5lcmljGGhlYWRlchhIZWFkZXIIGE51bWJlcgEQEEhhc2gAABQBLHBhcmVudF9oYXNoNAEwSGFzaDo6T3V0cHV0AAEYbnVtYmVy7AEYTnVtYmVyAAEoc3RhdGVfcm9vdDQBMEhhc2g6Ok91dHB1dAABPGV4dHJpbnNpY3Nfcm9vdDQBMEhhc2g6Ok91dHB1dAABGGRpZ2VzdDwBGERpZ2VzdAAApQEMRHNwX2NvbnNlbnN1c19iYWJlDGFwcBhQdWJsaWMAAAQABAE8c3IyNTUxOTo6UHVibGljAACpAQhIc3BfY29uc2Vuc3VzX3Nsb3RzEFNsb3QAAAQAMAEMdTY0AACtAQgoc3Bfc2Vzc2lvbjxNZW1iZXJzaGlwUHJvb2YAAAwBHHNlc3Npb24QATBTZXNzaW9uSW5kZXgAASh0cmllX25vZGVzhQEBMFZlYzxWZWM8dTg+PgABPHZhbGlkYXRvcl9jb3VudBABOFZhbGlkYXRvckNvdW50AACxAQxEc3BfY29uc2Vuc3VzX2JhYmUcZGlnZXN0c1BOZXh0Q29uZmlnRGVzY3JpcHRvcgABBAhWMQgBBGO1AQEoKHU2NCwgdTY0KQABNGFsbG93ZWRfc2xvdHO5AQEwQWxsb3dlZFNsb3RzAAEAALUBAAAECDAwALkBCERzcF9jb25zZW5zdXNfYmFiZTBBbGxvd2VkU2xvdHMAAQwwUHJpbWFyeVNsb3RzAAAAdFByaW1hcnlBbmRTZWNvbmRhcnlQbGFpblNsb3RzAAEAbFByaW1hcnlBbmRTZWNvbmRhcnlWUkZTbG90cwACAAC9AQxAcGFsbGV0X3RpbWVzdGFtcBhwYWxsZXQQQ2FsbAQEVAABBAxzZXQEAQxub3csASRUOjpNb21lbnQAAExUU2V0IHRoZSBjdXJyZW50IHRpbWUuAFUBVGhpcyBjYWxsIHNob3VsZCBiZSBpbnZva2VkIGV4YWN0bHkgb25jZSBwZXIgYmxvY2suIEl0IHdpbGwgcGFuaWMgYXQgdGhlIGZpbmFsaXphdGlvbtRwaGFzZSwgaWYgdGhpcyBjYWxsIGhhc24ndCBiZWVuIGludm9rZWQgYnkgdGhhdCB0aW1lLgBBAVRoZSB0aW1lc3RhbXAgc2hvdWxkIGJlIGdyZWF0ZXIgdGhhbiB0aGUgcHJldmlvdXMgb25lIGJ5IHRoZSBhbW91bnQgc3BlY2lmaWVkIGJ5aFtgQ29uZmlnOjpNaW5pbXVtUGVyaW9kYF0uAMRUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfTm9uZV8uAFEBVGhpcyBkaXNwYXRjaCBjbGFzcyBpcyBfTWFuZGF0b3J5XyB0byBlbnN1cmUgaXQgZ2V0cyBleGVjdXRlZCBpbiB0aGUgYmxvY2suIEJlIGF3YXJlUQF0aGF0IGNoYW5naW5nIHRoZSBjb21wbGV4aXR5IG9mIHRoaXMgY2FsbCBjb3VsZCByZXN1bHQgZXhoYXVzdGluZyB0aGUgcmVzb3VyY2VzIGluIGGEYmxvY2sgdG8gZXhlY3V0ZSBhbnkgb3RoZXIgY2FsbHMuADQjIyBDb21wbGV4aXR5MQEtIGBPKDEpYCAoTm90ZSB0aGF0IGltcGxlbWVudGF0aW9ucyBvZiBgT25UaW1lc3RhbXBTZXRgIG11c3QgYWxzbyBiZSBgTygxKWApVQEtIDEgc3RvcmFnZSByZWFkIGFuZCAxIHN0b3JhZ2UgbXV0YXRpb24gKGNvZGVjIGBPKDEpYCBiZWNhdXNlIG9mIGBEaWRVcGRhdGU6OnRha2VgIGluQCAgYG9uX2ZpbmFsaXplYCnULSAxIGV2ZW50IGhhbmRsZXIgYG9uX3RpbWVzdGFtcF9zZXRgLiBNdXN0IGJlIGBPKDEpYC4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMuwQEMOHBhbGxldF9pbmRpY2VzGHBhbGxldBBDYWxsBARUAAEUFGNsYWltBAEUaW5kZXgQATxUOjpBY2NvdW50SW5kZXgAADCYQXNzaWduIGFuIHByZXZpb3VzbHkgdW5hc3NpZ25lZCBpbmRleC4A3FBheW1lbnQ6IGBEZXBvc2l0YCBpcyByZXNlcnZlZCBmcm9tIHRoZSBzZW5kZXIgYWNjb3VudC4AzFRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfLgDwLSBgaW5kZXhgOiB0aGUgaW5kZXggdG8gYmUgY2xhaW1lZC4gVGhpcyBtdXN0IG5vdCBiZSBpbiB1c2UuAJBFbWl0cyBgSW5kZXhBc3NpZ25lZGAgaWYgc3VjY2Vzc2Z1bC4ANCMjIENvbXBsZXhpdHkkLSBgTygxKWAuIHRyYW5zZmVyCAEMbmV3xQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEUaW5kZXgQATxUOjpBY2NvdW50SW5kZXgAATBdAUFzc2lnbiBhbiBpbmRleCBhbHJlYWR5IG93bmVkIGJ5IHRoZSBzZW5kZXIgdG8gYW5vdGhlciBhY2NvdW50LiBUaGUgYmFsYW5jZSByZXNlcnZhdGlvbrhpcyBlZmZlY3RpdmVseSB0cmFuc2ZlcnJlZCB0byB0aGUgbmV3IGFjY291bnQuAMxUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXy4AJQEtIGBpbmRleGA6IHRoZSBpbmRleCB0byBiZSByZS1hc3NpZ25lZC4gVGhpcyBtdXN0IGJlIG93bmVkIGJ5IHRoZSBzZW5kZXIuXQEtIGBuZXdgOiB0aGUgbmV3IG93bmVyIG9mIHRoZSBpbmRleC4gVGhpcyBmdW5jdGlvbiBpcyBhIG5vLW9wIGlmIGl0IGlzIGVxdWFsIHRvIHNlbmRlci4AkEVtaXRzIGBJbmRleEFzc2lnbmVkYCBpZiBzdWNjZXNzZnVsLgA0IyMgQ29tcGxleGl0eSQtIGBPKDEpYC4QZnJlZQQBFGluZGV4EAE8VDo6QWNjb3VudEluZGV4AAIwlEZyZWUgdXAgYW4gaW5kZXggb3duZWQgYnkgdGhlIHNlbmRlci4AXQFQYXltZW50OiBBbnkgcHJldmlvdXMgZGVwb3NpdCBwbGFjZWQgZm9yIHRoZSBpbmRleCBpcyB1bnJlc2VydmVkIGluIHRoZSBzZW5kZXIgYWNjb3VudC4AVQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXyBhbmQgdGhlIHNlbmRlciBtdXN0IG93biB0aGUgaW5kZXguAA0BLSBgaW5kZXhgOiB0aGUgaW5kZXggdG8gYmUgZnJlZWQuIFRoaXMgbXVzdCBiZSBvd25lZCBieSB0aGUgc2VuZGVyLgCERW1pdHMgYEluZGV4RnJlZWRgIGlmIHN1Y2Nlc3NmdWwuADQjIyBDb21wbGV4aXR5JC0gYE8oMSlgLjhmb3JjZV90cmFuc2ZlcgwBDG5ld8UBAVBBY2NvdW50SWRMb29rdXBPZjxUPgABFGluZGV4EAE8VDo6QWNjb3VudEluZGV4AAEYZnJlZXplIAEQYm9vbAADNFUBRm9yY2UgYW4gaW5kZXggdG8gYW4gYWNjb3VudC4gVGhpcyBkb2Vzbid0IHJlcXVpcmUgYSBkZXBvc2l0LiBJZiB0aGUgaW5kZXggaXMgYWxyZWFkeehoZWxkLCB0aGVuIGFueSBkZXBvc2l0IGlzIHJlaW1idXJzZWQgdG8gaXRzIGN1cnJlbnQgb3duZXIuAMRUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfUm9vdF8uAKQtIGBpbmRleGA6IHRoZSBpbmRleCB0byBiZSAocmUtKWFzc2lnbmVkLl0BLSBgbmV3YDogdGhlIG5ldyBvd25lciBvZiB0aGUgaW5kZXguIFRoaXMgZnVuY3Rpb24gaXMgYSBuby1vcCBpZiBpdCBpcyBlcXVhbCB0byBzZW5kZXIuQQEtIGBmcmVlemVgOiBpZiBzZXQgdG8gYHRydWVgLCB3aWxsIGZyZWV6ZSB0aGUgaW5kZXggc28gaXQgY2Fubm90IGJlIHRyYW5zZmVycmVkLgCQRW1pdHMgYEluZGV4QXNzaWduZWRgIGlmIHN1Y2Nlc3NmdWwuADQjIyBDb21wbGV4aXR5JC0gYE8oMSlgLhhmcmVlemUEARRpbmRleBABPFQ6OkFjY291bnRJbmRleAAEMEEBRnJlZXplIGFuIGluZGV4IHNvIGl0IHdpbGwgYWx3YXlzIHBvaW50IHRvIHRoZSBzZW5kZXIgYWNjb3VudC4gVGhpcyBjb25zdW1lcyB0aGUgZGVwb3NpdC4AWQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXyBhbmQgdGhlIHNpZ25pbmcgYWNjb3VudCBtdXN0IGhhdmUgYWxub24tZnJvemVuIGFjY291bnQgYGluZGV4YC4ArC0gYGluZGV4YDogdGhlIGluZGV4IHRvIGJlIGZyb3plbiBpbiBwbGFjZS4AiEVtaXRzIGBJbmRleEZyb3plbmAgaWYgc3VjY2Vzc2Z1bC4ANCMjIENvbXBsZXhpdHkkLSBgTygxKWAuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLsUBDChzcF9ydW50aW1lMG11bHRpYWRkcmVzczBNdWx0aUFkZHJlc3MIJEFjY291bnRJZAEAMEFjY291bnRJbmRleAGMARQISWQEAAABJEFjY291bnRJZAAAABRJbmRleAQAyQEBMEFjY291bnRJbmRleAABAAxSYXcEADgBHFZlYzx1OD4AAgAkQWRkcmVzczMyBAAEASBbdTg7IDMyXQADACRBZGRyZXNzMjAEAPgBIFt1ODsgMjBdAAQAAMkBAAAGjADNAQw8cGFsbGV0X2JhbGFuY2VzGHBhbGxldBBDYWxsCARUAARJAAEkUHRyYW5zZmVyX2FsbG93X2RlYXRoCAEQZGVzdMUBAVBBY2NvdW50SWRMb29rdXBPZjxUPgABFHZhbHVl/AEoVDo6QmFsYW5jZQAAHNRUcmFuc2ZlciBzb21lIGxpcXVpZCBmcmVlIGJhbGFuY2UgdG8gYW5vdGhlciBhY2NvdW50LgA1AWB0cmFuc2Zlcl9hbGxvd19kZWF0aGAgd2lsbCBzZXQgdGhlIGBGcmVlQmFsYW5jZWAgb2YgdGhlIHNlbmRlciBhbmQgcmVjZWl2ZXIuEQFJZiB0aGUgc2VuZGVyJ3MgYWNjb3VudCBpcyBiZWxvdyB0aGUgZXhpc3RlbnRpYWwgZGVwb3NpdCBhcyBhIHJlc3VsdLBvZiB0aGUgdHJhbnNmZXIsIHRoZSBhY2NvdW50IHdpbGwgYmUgcmVhcGVkLgAVAVRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIGBTaWduZWRgIGJ5IHRoZSB0cmFuc2FjdG9yLjhmb3JjZV90cmFuc2ZlcgwBGHNvdXJjZcUBAVBBY2NvdW50SWRMb29rdXBPZjxUPgABEGRlc3TFAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AARR2YWx1ZfwBKFQ6OkJhbGFuY2UAAghhAUV4YWN0bHkgYXMgYHRyYW5zZmVyX2FsbG93X2RlYXRoYCwgZXhjZXB0IHRoZSBvcmlnaW4gbXVzdCBiZSByb290IGFuZCB0aGUgc291cmNlIGFjY291bnREbWF5IGJlIHNwZWNpZmllZC5MdHJhbnNmZXJfa2VlcF9hbGl2ZQgBEGRlc3TFAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AARR2YWx1ZfwBKFQ6OkJhbGFuY2UAAxhZAVNhbWUgYXMgdGhlIFtgdHJhbnNmZXJfYWxsb3dfZGVhdGhgXSBjYWxsLCBidXQgd2l0aCBhIGNoZWNrIHRoYXQgdGhlIHRyYW5zZmVyIHdpbGwgbm90YGtpbGwgdGhlIG9yaWdpbiBhY2NvdW50LgDoOTklIG9mIHRoZSB0aW1lIHlvdSB3YW50IFtgdHJhbnNmZXJfYWxsb3dfZGVhdGhgXSBpbnN0ZWFkLgDwW2B0cmFuc2Zlcl9hbGxvd19kZWF0aGBdOiBzdHJ1Y3QuUGFsbGV0Lmh0bWwjbWV0aG9kLnRyYW5zZmVyMHRyYW5zZmVyX2FsbAgBEGRlc3TFAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AAShrZWVwX2FsaXZlIAEQYm9vbAAEPAUBVHJhbnNmZXIgdGhlIGVudGlyZSB0cmFuc2ZlcmFibGUgYmFsYW5jZSBmcm9tIHRoZSBjYWxsZXIgYWNjb3VudC4AWQFOT1RFOiBUaGlzIGZ1bmN0aW9uIG9ubHkgYXR0ZW1wdHMgdG8gdHJhbnNmZXIgX3RyYW5zZmVyYWJsZV8gYmFsYW5jZXMuIFRoaXMgbWVhbnMgdGhhdGEBYW55IGxvY2tlZCwgcmVzZXJ2ZWQsIG9yIGV4aXN0ZW50aWFsIGRlcG9zaXRzICh3aGVuIGBrZWVwX2FsaXZlYCBpcyBgdHJ1ZWApLCB3aWxsIG5vdCBiZV0BdHJhbnNmZXJyZWQgYnkgdGhpcyBmdW5jdGlvbi4gVG8gZW5zdXJlIHRoYXQgdGhpcyBmdW5jdGlvbiByZXN1bHRzIGluIGEga2lsbGVkIGFjY291bnQsRQF5b3UgbWlnaHQgbmVlZCB0byBwcmVwYXJlIHRoZSBhY2NvdW50IGJ5IHJlbW92aW5nIGFueSByZWZlcmVuY2UgY291bnRlcnMsIHN0b3JhZ2VAZGVwb3NpdHMsIGV0Yy4uLgDAVGhlIGRpc3BhdGNoIG9yaWdpbiBvZiB0aGlzIGNhbGwgbXVzdCBiZSBTaWduZWQuAKAtIGBkZXN0YDogVGhlIHJlY2lwaWVudCBvZiB0aGUgdHJhbnNmZXIuWQEtIGBrZWVwX2FsaXZlYDogQSBib29sZWFuIHRvIGRldGVybWluZSBpZiB0aGUgYHRyYW5zZmVyX2FsbGAgb3BlcmF0aW9uIHNob3VsZCBzZW5kIGFsbE0BICBvZiB0aGUgZnVuZHMgdGhlIGFjY291bnQgaGFzLCBjYXVzaW5nIHRoZSBzZW5kZXIgYWNjb3VudCB0byBiZSBraWxsZWQgKGZhbHNlKSwgb3JZASAgdHJhbnNmZXIgZXZlcnl0aGluZyBleGNlcHQgYXQgbGVhc3QgdGhlIGV4aXN0ZW50aWFsIGRlcG9zaXQsIHdoaWNoIHdpbGwgZ3VhcmFudGVlIHRvnCAga2VlcCB0aGUgc2VuZGVyIGFjY291bnQgYWxpdmUgKHRydWUpLjxmb3JjZV91bnJlc2VydmUIAQx3aG/FAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AARhhbW91bnQYAShUOjpCYWxhbmNlAAUMsFVucmVzZXJ2ZSBzb21lIGJhbGFuY2UgZnJvbSBhIHVzZXIgYnkgZm9yY2UuAGxDYW4gb25seSBiZSBjYWxsZWQgYnkgUk9PVC5AdXBncmFkZV9hY2NvdW50cwQBDHdob9EBAURWZWM8VDo6QWNjb3VudElkPgAGIHBVcGdyYWRlIGEgc3BlY2lmaWVkIGFjY291bnQuAHQtIGBvcmlnaW5gOiBNdXN0IGJlIGBTaWduZWRgLpAtIGB3aG9gOiBUaGUgYWNjb3VudCB0byBiZSB1cGdyYWRlZC4AVQFUaGlzIHdpbGwgd2FpdmUgdGhlIHRyYW5zYWN0aW9uIGZlZSBpZiBhdCBsZWFzdCBhbGwgYnV0IDEwJSBvZiB0aGUgYWNjb3VudHMgbmVlZGVkIHRvQQFiZSB1cGdyYWRlZC4gKFdlIGxldCBzb21lIG5vdCBoYXZlIHRvIGJlIHVwZ3JhZGVkIGp1c3QgaW4gb3JkZXIgdG8gYWxsb3cgZm9yIHRoZVhwb3NzaWJpbGl0eSBvZiBjaHVybikuRGZvcmNlX3NldF9iYWxhbmNlCAEMd2hvxQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEgbmV3X2ZyZWX8AShUOjpCYWxhbmNlAAgMrFNldCB0aGUgcmVndWxhciBiYWxhbmNlIG9mIGEgZ2l2ZW4gYWNjb3VudC4AsFRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBpcyBgcm9vdGAubGZvcmNlX2FkanVzdF90b3RhbF9pc3N1YW5jZQgBJGRpcmVjdGlvbtUBAUxBZGp1c3RtZW50RGlyZWN0aW9uAAEUZGVsdGH8AShUOjpCYWxhbmNlAAkUuEFkanVzdCB0aGUgdG90YWwgaXNzdWFuY2UgaW4gYSBzYXR1cmF0aW5nIHdheS4A/ENhbiBvbmx5IGJlIGNhbGxlZCBieSByb290IGFuZCBhbHdheXMgbmVlZHMgYSBwb3NpdGl2ZSBgZGVsdGFgLgAkIyBFeGFtcGxlEGJ1cm4IARR2YWx1ZfwBKFQ6OkJhbGFuY2UAAShrZWVwX2FsaXZlIAEQYm9vbAAKHPxCdXJuIHRoZSBzcGVjaWZpZWQgbGlxdWlkIGZyZWUgYmFsYW5jZSBmcm9tIHRoZSBvcmlnaW4gYWNjb3VudC4AJQFJZiB0aGUgb3JpZ2luJ3MgYWNjb3VudCBlbmRzIHVwIGJlbG93IHRoZSBleGlzdGVudGlhbCBkZXBvc2l0IGFzIGEgcmVzdWx0CQFvZiB0aGUgYnVybiBhbmQgYGtlZXBfYWxpdmVgIGlzIGZhbHNlLCB0aGUgYWNjb3VudCB3aWxsIGJlIHJlYXBlZC4AUQFVbmxpa2Ugc2VuZGluZyBmdW5kcyB0byBhIF9idXJuXyBhZGRyZXNzLCB3aGljaCBtZXJlbHkgbWFrZXMgdGhlIGZ1bmRzIGluYWNjZXNzaWJsZSwhAXRoaXMgYGJ1cm5gIG9wZXJhdGlvbiB3aWxsIHJlZHVjZSB0b3RhbCBpc3N1YW5jZSBieSB0aGUgYW1vdW50IF9idXJuZWRfLgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy7RAQAAAgAA1QEMPHBhbGxldF9iYWxhbmNlcxR0eXBlc0xBZGp1c3RtZW50RGlyZWN0aW9uAAEIIEluY3JlYXNlAAAAIERlY3JlYXNlAAEAANkBEDhwYWxsZXRfc3Rha2luZxhwYWxsZXQYcGFsbGV0EENhbGwEBFQAAXgQYm9uZAgBFHZhbHVl/AEwQmFsYW5jZU9mPFQ+AAEUcGF5ZWWoAXxSZXdhcmREZXN0aW5hdGlvbjxUOjpBY2NvdW50SWQ+AABAYQFUYWtlIHRoZSBvcmlnaW4gYWNjb3VudCBhcyBhIHN0YXNoIGFuZCBsb2NrIHVwIGB2YWx1ZWAgb2YgaXRzIGJhbGFuY2UuIGBjb250cm9sbGVyYCB3aWxsgGJlIHRoZSBhY2NvdW50IHRoYXQgY29udHJvbHMgaXQuAC0BYHZhbHVlYCBtdXN0IGJlIG1vcmUgdGhhbiB0aGUgYG1pbmltdW1fYmFsYW5jZWAgc3BlY2lmaWVkIGJ5IGBUOjpDdXJyZW5jeWAuACEBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8gYnkgdGhlIHN0YXNoIGFjY291bnQuADxFbWl0cyBgQm9uZGVkYC40IyMgQ29tcGxleGl0edAtIEluZGVwZW5kZW50IG9mIHRoZSBhcmd1bWVudHMuIE1vZGVyYXRlIGNvbXBsZXhpdHkuHC0gTygxKS5kLSBUaHJlZSBleHRyYSBEQiBlbnRyaWVzLgBNAU5PVEU6IFR3byBvZiB0aGUgc3RvcmFnZSB3cml0ZXMgKGBTZWxmOjpib25kZWRgLCBgU2VsZjo6cGF5ZWVgKSBhcmUgX25ldmVyXyBjbGVhbmVkWQF1bmxlc3MgdGhlIGBvcmlnaW5gIGZhbGxzIGJlbG93IF9leGlzdGVudGlhbCBkZXBvc2l0XyAob3IgZXF1YWwgdG8gMCkgYW5kIGdldHMgcmVtb3ZlZCBhcyBkdXN0Lihib25kX2V4dHJhBAE4bWF4X2FkZGl0aW9uYWz8ATBCYWxhbmNlT2Y8VD4AAThhAUFkZCBzb21lIGV4dHJhIGFtb3VudCB0aGF0IGhhdmUgYXBwZWFyZWQgaW4gdGhlIHN0YXNoIGBmcmVlX2JhbGFuY2VgIGludG8gdGhlIGJhbGFuY2UgdXAwZm9yIHN0YWtpbmcuAFEBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8gYnkgdGhlIHN0YXNoLCBub3QgdGhlIGNvbnRyb2xsZXIuAE0BVXNlIHRoaXMgaWYgdGhlcmUgYXJlIGFkZGl0aW9uYWwgZnVuZHMgaW4geW91ciBzdGFzaCBhY2NvdW50IHRoYXQgeW91IHdpc2ggdG8gYm9uZC5VAVVubGlrZSBbYGJvbmRgXShTZWxmOjpib25kKSBvciBbYHVuYm9uZGBdKFNlbGY6OnVuYm9uZCkgdGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBpbXBvc2W8YW55IGxpbWl0YXRpb24gb24gdGhlIGFtb3VudCB0aGF0IGNhbiBiZSBhZGRlZC4APEVtaXRzIGBCb25kZWRgLgA0IyMgQ29tcGxleGl0eeQtIEluZGVwZW5kZW50IG9mIHRoZSBhcmd1bWVudHMuIEluc2lnbmlmaWNhbnQgY29tcGxleGl0eS4cLSBPKDEpLhh1bmJvbmQEARR2YWx1ZfwBMEJhbGFuY2VPZjxUPgACTFEBU2NoZWR1bGUgYSBwb3J0aW9uIG9mIHRoZSBzdGFzaCB0byBiZSB1bmxvY2tlZCByZWFkeSBmb3IgdHJhbnNmZXIgb3V0IGFmdGVyIHRoZSBib25k/HBlcmlvZCBlbmRzLiBJZiB0aGlzIGxlYXZlcyBhbiBhbW91bnQgYWN0aXZlbHkgYm9uZGVkIGxlc3MgdGhhbiEBVDo6Q3VycmVuY3k6Om1pbmltdW1fYmFsYW5jZSgpLCB0aGVuIGl0IGlzIGluY3JlYXNlZCB0byB0aGUgZnVsbCBhbW91bnQuAFEBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8gYnkgdGhlIGNvbnRyb2xsZXIsIG5vdCB0aGUgc3Rhc2guAEUBT25jZSB0aGUgdW5sb2NrIHBlcmlvZCBpcyBkb25lLCB5b3UgY2FuIGNhbGwgYHdpdGhkcmF3X3VuYm9uZGVkYCB0byBhY3R1YWxseSBtb3ZlvHRoZSBmdW5kcyBvdXQgb2YgbWFuYWdlbWVudCByZWFkeSBmb3IgdHJhbnNmZXIuADEBTm8gbW9yZSB0aGFuIGEgbGltaXRlZCBudW1iZXIgb2YgdW5sb2NraW5nIGNodW5rcyAoc2VlIGBNYXhVbmxvY2tpbmdDaHVua3NgKUEBY2FuIGNvLWV4aXN0cyBhdCB0aGUgc2FtZSB0aW1lLiBJZiB0aGVyZSBhcmUgbm8gdW5sb2NraW5nIGNodW5rcyBzbG90cyBhdmFpbGFibGVFAVtgQ2FsbDo6d2l0aGRyYXdfdW5ib25kZWRgXSBpcyBjYWxsZWQgdG8gcmVtb3ZlIHNvbWUgb2YgdGhlIGNodW5rcyAoaWYgcG9zc2libGUpLgA5AUlmIGEgdXNlciBlbmNvdW50ZXJzIHRoZSBgSW5zdWZmaWNpZW50Qm9uZGAgZXJyb3Igd2hlbiBjYWxsaW5nIHRoaXMgZXh0cmluc2ljLBkBdGhleSBzaG91bGQgY2FsbCBgY2hpbGxgIGZpcnN0IGluIG9yZGVyIHRvIGZyZWUgdXAgdGhlaXIgYm9uZGVkIGZ1bmRzLgBERW1pdHMgYFVuYm9uZGVkYC4AlFNlZSBhbHNvIFtgQ2FsbDo6d2l0aGRyYXdfdW5ib25kZWRgXS5Ed2l0aGRyYXdfdW5ib25kZWQEAUhudW1fc2xhc2hpbmdfc3BhbnMQAQx1MzIAA1wpAVJlbW92ZSBhbnkgdW5sb2NrZWQgY2h1bmtzIGZyb20gdGhlIGB1bmxvY2tpbmdgIHF1ZXVlIGZyb20gb3VyIG1hbmFnZW1lbnQuAFUBVGhpcyBlc3NlbnRpYWxseSBmcmVlcyB1cCB0aGF0IGJhbGFuY2UgdG8gYmUgdXNlZCBieSB0aGUgc3Rhc2ggYWNjb3VudCB0byBkbyB3aGF0ZXZlciRpdCB3YW50cy4AFQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXyBieSB0aGUgY29udHJvbGxlci4ASEVtaXRzIGBXaXRoZHJhd25gLgBoU2VlIGFsc28gW2BDYWxsOjp1bmJvbmRgXS4ANCMjIFBhcmFtZXRlcnMAUQEtIGBudW1fc2xhc2hpbmdfc3BhbnNgIGluZGljYXRlcyB0aGUgbnVtYmVyIG9mIG1ldGFkYXRhIHNsYXNoaW5nIHNwYW5zIHRvIGNsZWFyIHdoZW5VAXRoaXMgY2FsbCByZXN1bHRzIGluIGEgY29tcGxldGUgcmVtb3ZhbCBvZiBhbGwgdGhlIGRhdGEgcmVsYXRlZCB0byB0aGUgc3Rhc2ggYWNjb3VudC49AUluIHRoaXMgY2FzZSwgdGhlIGBudW1fc2xhc2hpbmdfc3BhbnNgIG11c3QgYmUgbGFyZ2VyIG9yIGVxdWFsIHRvIHRoZSBudW1iZXIgb2ZdAXNsYXNoaW5nIHNwYW5zIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3Rhc2ggYWNjb3VudCBpbiB0aGUgW2BTbGFzaGluZ1NwYW5zYF0gc3RvcmFnZSB0eXBlLCUBb3RoZXJ3aXNlIHRoZSBjYWxsIHdpbGwgZmFpbC4gVGhlIGNhbGwgd2VpZ2h0IGlzIGRpcmVjdGx5IHByb3BvcnRpb25hbCB0b1RgbnVtX3NsYXNoaW5nX3NwYW5zYC4ANCMjIENvbXBsZXhpdHnYTyhTKSB3aGVyZSBTIGlzIHRoZSBudW1iZXIgb2Ygc2xhc2hpbmcgc3BhbnMgdG8gcmVtb3ZlCQFOT1RFOiBXZWlnaHQgYW5ub3RhdGlvbiBpcyB0aGUga2lsbCBzY2VuYXJpbywgd2UgcmVmdW5kIG90aGVyd2lzZS4gdmFsaWRhdGUEARRwcmVmc7ABOFZhbGlkYXRvclByZWZzAAQU5ERlY2xhcmUgdGhlIGRlc2lyZSB0byB2YWxpZGF0ZSBmb3IgdGhlIG9yaWdpbiBjb250cm9sbGVyLgDYRWZmZWN0cyB3aWxsIGJlIGZlbHQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbmV4dCBlcmEuAFEBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8gYnkgdGhlIGNvbnRyb2xsZXIsIG5vdCB0aGUgc3Rhc2guIG5vbWluYXRlBAEcdGFyZ2V0c90BAWRWZWM8QWNjb3VudElkTG9va3VwT2Y8VD4+AAUoDQFEZWNsYXJlIHRoZSBkZXNpcmUgdG8gbm9taW5hdGUgYHRhcmdldHNgIGZvciB0aGUgb3JpZ2luIGNvbnRyb2xsZXIuANhFZmZlY3RzIHdpbGwgYmUgZmVsdCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBuZXh0IGVyYS4AUQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXyBieSB0aGUgY29udHJvbGxlciwgbm90IHRoZSBzdGFzaC4ANCMjIENvbXBsZXhpdHktAS0gVGhlIHRyYW5zYWN0aW9uJ3MgY29tcGxleGl0eSBpcyBwcm9wb3J0aW9uYWwgdG8gdGhlIHNpemUgb2YgYHRhcmdldHNgIChOKQUBd2hpY2ggaXMgY2FwcGVkIGF0IENvbXBhY3RBc3NpZ25tZW50czo6TElNSVQgKFQ6Ok1heE5vbWluYXRpb25zKS7ULSBCb3RoIHRoZSByZWFkcyBhbmQgd3JpdGVzIGZvbGxvdyBhIHNpbWlsYXIgcGF0dGVybi4UY2hpbGwABijERGVjbGFyZSBubyBkZXNpcmUgdG8gZWl0aGVyIHZhbGlkYXRlIG9yIG5vbWluYXRlLgDYRWZmZWN0cyB3aWxsIGJlIGZlbHQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbmV4dCBlcmEuAFEBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8gYnkgdGhlIGNvbnRyb2xsZXIsIG5vdCB0aGUgc3Rhc2guADQjIyBDb21wbGV4aXR55C0gSW5kZXBlbmRlbnQgb2YgdGhlIGFyZ3VtZW50cy4gSW5zaWduaWZpY2FudCBjb21wbGV4aXR5LlAtIENvbnRhaW5zIG9uZSByZWFkLsQtIFdyaXRlcyBhcmUgbGltaXRlZCB0byB0aGUgYG9yaWdpbmAgYWNjb3VudCBrZXkuJHNldF9wYXllZQQBFHBheWVlqAF8UmV3YXJkRGVzdGluYXRpb248VDo6QWNjb3VudElkPgAHMLQoUmUtKXNldCB0aGUgcGF5bWVudCB0YXJnZXQgZm9yIGEgY29udHJvbGxlci4AUQFFZmZlY3RzIHdpbGwgYmUgZmVsdCBpbnN0YW50bHkgKGFzIHNvb24gYXMgdGhpcyBmdW5jdGlvbiBpcyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5KS4AUQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXyBieSB0aGUgY29udHJvbGxlciwgbm90IHRoZSBzdGFzaC4ANCMjIENvbXBsZXhpdHkYLSBPKDEp5C0gSW5kZXBlbmRlbnQgb2YgdGhlIGFyZ3VtZW50cy4gSW5zaWduaWZpY2FudCBjb21wbGV4aXR5LpQtIENvbnRhaW5zIGEgbGltaXRlZCBudW1iZXIgb2YgcmVhZHMuxC0gV3JpdGVzIGFyZSBsaW1pdGVkIHRvIHRoZSBgb3JpZ2luYCBhY2NvdW50IGtleS4kLS0tLS0tLS0tOHNldF9jb250cm9sbGVyAAg4RQEoUmUtKXNldHMgdGhlIGNvbnRyb2xsZXIgb2YgYSBzdGFzaCB0byB0aGUgc3Rhc2ggaXRzZWxmLiBUaGlzIGZ1bmN0aW9uIHByZXZpb3VzbHlNAWFjY2VwdGVkIGEgYGNvbnRyb2xsZXJgIGFyZ3VtZW50IHRvIHNldCB0aGUgY29udHJvbGxlciB0byBhbiBhY2NvdW50IG90aGVyIHRoYW4gdGhlWQFzdGFzaCBpdHNlbGYuIFRoaXMgZnVuY3Rpb25hbGl0eSBoYXMgbm93IGJlZW4gcmVtb3ZlZCwgbm93IG9ubHkgc2V0dGluZyB0aGUgY29udHJvbGxlcox0byB0aGUgc3Rhc2gsIGlmIGl0IGlzIG5vdCBhbHJlYWR5LgBRAUVmZmVjdHMgd2lsbCBiZSBmZWx0IGluc3RhbnRseSAoYXMgc29vbiBhcyB0aGlzIGZ1bmN0aW9uIGlzIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkpLgBRAVRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfIGJ5IHRoZSBzdGFzaCwgbm90IHRoZSBjb250cm9sbGVyLgA0IyMgQ29tcGxleGl0eRBPKDEp5C0gSW5kZXBlbmRlbnQgb2YgdGhlIGFyZ3VtZW50cy4gSW5zaWduaWZpY2FudCBjb21wbGV4aXR5LpQtIENvbnRhaW5zIGEgbGltaXRlZCBudW1iZXIgb2YgcmVhZHMuxC0gV3JpdGVzIGFyZSBsaW1pdGVkIHRvIHRoZSBgb3JpZ2luYCBhY2NvdW50IGtleS5Mc2V0X3ZhbGlkYXRvcl9jb3VudAQBDG5ld+wBDHUzMgAJGJBTZXRzIHRoZSBpZGVhbCBudW1iZXIgb2YgdmFsaWRhdG9ycy4AhFRoZSBkaXNwYXRjaCBvcmlnaW4gbXVzdCBiZSBSb290LgA0IyMgQ29tcGxleGl0eRBPKDEpYGluY3JlYXNlX3ZhbGlkYXRvcl9jb3VudAQBKGFkZGl0aW9uYWzsAQx1MzIAChzoSW5jcmVtZW50cyB0aGUgaWRlYWwgbnVtYmVyIG9mIHZhbGlkYXRvcnMgdXAgdG8gbWF4aW11bSBvZoxgRWxlY3Rpb25Qcm92aWRlckJhc2U6Ok1heFdpbm5lcnNgLgCEVGhlIGRpc3BhdGNoIG9yaWdpbiBtdXN0IGJlIFJvb3QuADQjIyBDb21wbGV4aXR5mFNhbWUgYXMgW2BTZWxmOjpzZXRfdmFsaWRhdG9yX2NvdW50YF0uVHNjYWxlX3ZhbGlkYXRvcl9jb3VudAQBGGZhY3RvcuEBARxQZXJjZW50AAscEQFTY2FsZSB1cCB0aGUgaWRlYWwgbnVtYmVyIG9mIHZhbGlkYXRvcnMgYnkgYSBmYWN0b3IgdXAgdG8gbWF4aW11bSBvZoxgRWxlY3Rpb25Qcm92aWRlckJhc2U6Ok1heFdpbm5lcnNgLgCEVGhlIGRpc3BhdGNoIG9yaWdpbiBtdXN0IGJlIFJvb3QuADQjIyBDb21wbGV4aXR5mFNhbWUgYXMgW2BTZWxmOjpzZXRfdmFsaWRhdG9yX2NvdW50YF0uNGZvcmNlX25vX2VyYXMADDSsRm9yY2UgdGhlcmUgdG8gYmUgbm8gbmV3IGVyYXMgaW5kZWZpbml0ZWx5LgCEVGhlIGRpc3BhdGNoIG9yaWdpbiBtdXN0IGJlIFJvb3QuACQjIFdhcm5pbmcAGQFUaGUgZWxlY3Rpb24gcHJvY2VzcyBzdGFydHMgbXVsdGlwbGUgYmxvY2tzIGJlZm9yZSB0aGUgZW5kIG9mIHRoZSBlcmEuOQFUaHVzIHRoZSBlbGVjdGlvbiBwcm9jZXNzIG1heSBiZSBvbmdvaW5nIHdoZW4gdGhpcyBpcyBjYWxsZWQuIEluIHRoaXMgY2FzZSB0aGXcZWxlY3Rpb24gd2lsbCBjb250aW51ZSB1bnRpbCB0aGUgbmV4dCBlcmEgaXMgdHJpZ2dlcmVkLgA0IyMgQ29tcGxleGl0eTwtIE5vIGFyZ3VtZW50cy44LSBXZWlnaHQ6IE8oMSk0Zm9yY2VfbmV3X2VyYQANOEkBRm9yY2UgdGhlcmUgdG8gYmUgYSBuZXcgZXJhIGF0IHRoZSBlbmQgb2YgdGhlIG5leHQgc2Vzc2lvbi4gQWZ0ZXIgdGhpcywgaXQgd2lsbCBiZZxyZXNldCB0byBub3JtYWwgKG5vbi1mb3JjZWQpIGJlaGF2aW91ci4AhFRoZSBkaXNwYXRjaCBvcmlnaW4gbXVzdCBiZSBSb290LgAkIyBXYXJuaW5nABkBVGhlIGVsZWN0aW9uIHByb2Nlc3Mgc3RhcnRzIG11bHRpcGxlIGJsb2NrcyBiZWZvcmUgdGhlIGVuZCBvZiB0aGUgZXJhLkkBSWYgdGhpcyBpcyBjYWxsZWQganVzdCBiZWZvcmUgYSBuZXcgZXJhIGlzIHRyaWdnZXJlZCwgdGhlIGVsZWN0aW9uIHByb2Nlc3MgbWF5IG5vdIxoYXZlIGVub3VnaCBibG9ja3MgdG8gZ2V0IGEgcmVzdWx0LgA0IyMgQ29tcGxleGl0eTwtIE5vIGFyZ3VtZW50cy44LSBXZWlnaHQ6IE8oMSlEc2V0X2ludnVsbmVyYWJsZXMEATRpbnZ1bG5lcmFibGVz0QEBRFZlYzxUOjpBY2NvdW50SWQ+AA4MyFNldCB0aGUgdmFsaWRhdG9ycyB3aG8gY2Fubm90IGJlIHNsYXNoZWQgKGlmIGFueSkuAIRUaGUgZGlzcGF0Y2ggb3JpZ2luIG11c3QgYmUgUm9vdC40Zm9yY2VfdW5zdGFrZQgBFHN0YXNoAAEwVDo6QWNjb3VudElkAAFIbnVtX3NsYXNoaW5nX3NwYW5zEAEMdTMyAA8gCQFGb3JjZSBhIGN1cnJlbnQgc3Rha2VyIHRvIGJlY29tZSBjb21wbGV0ZWx5IHVuc3Rha2VkLCBpbW1lZGlhdGVseS4AhFRoZSBkaXNwYXRjaCBvcmlnaW4gbXVzdCBiZSBSb290LgA0IyMgUGFyYW1ldGVycwBFAS0gYG51bV9zbGFzaGluZ19zcGFuc2A6IFJlZmVyIHRvIGNvbW1lbnRzIG9uIFtgQ2FsbDo6d2l0aGRyYXdfdW5ib25kZWRgXSBmb3IgbW9yZSBkZXRhaWxzLlBmb3JjZV9uZXdfZXJhX2Fsd2F5cwAQJAEBRm9yY2UgdGhlcmUgdG8gYmUgYSBuZXcgZXJhIGF0IHRoZSBlbmQgb2Ygc2Vzc2lvbnMgaW5kZWZpbml0ZWx5LgCEVGhlIGRpc3BhdGNoIG9yaWdpbiBtdXN0IGJlIFJvb3QuACQjIFdhcm5pbmcAGQFUaGUgZWxlY3Rpb24gcHJvY2VzcyBzdGFydHMgbXVsdGlwbGUgYmxvY2tzIGJlZm9yZSB0aGUgZW5kIG9mIHRoZSBlcmEuSQFJZiB0aGlzIGlzIGNhbGxlZCBqdXN0IGJlZm9yZSBhIG5ldyBlcmEgaXMgdHJpZ2dlcmVkLCB0aGUgZWxlY3Rpb24gcHJvY2VzcyBtYXkgbm90jGhhdmUgZW5vdWdoIGJsb2NrcyB0byBnZXQgYSByZXN1bHQuVGNhbmNlbF9kZWZlcnJlZF9zbGFzaAgBDGVyYRABIEVyYUluZGV4AAE0c2xhc2hfaW5kaWNlc+UBASBWZWM8dTMyPgARFJRDYW5jZWwgZW5hY3RtZW50IG9mIGEgZGVmZXJyZWQgc2xhc2guAJhDYW4gYmUgY2FsbGVkIGJ5IHRoZSBgVDo6QWRtaW5PcmlnaW5gLgABAVBhcmFtZXRlcnM6IGVyYSBhbmQgaW5kaWNlcyBvZiB0aGUgc2xhc2hlcyBmb3IgdGhhdCBlcmEgdG8ga2lsbC44cGF5b3V0X3N0YWtlcnMIATx2YWxpZGF0b3Jfc3Rhc2gAATBUOjpBY2NvdW50SWQAAQxlcmEQASBFcmFJbmRleAASNBkBUGF5IG91dCBuZXh0IHBhZ2Ugb2YgdGhlIHN0YWtlcnMgYmVoaW5kIGEgdmFsaWRhdG9yIGZvciB0aGUgZ2l2ZW4gZXJhLgDoLSBgdmFsaWRhdG9yX3N0YXNoYCBpcyB0aGUgc3Rhc2ggYWNjb3VudCBvZiB0aGUgdmFsaWRhdG9yLjEBLSBgZXJhYCBtYXkgYmUgYW55IGVyYSBiZXR3ZWVuIGBbY3VycmVudF9lcmEgLSBoaXN0b3J5X2RlcHRoOyBjdXJyZW50X2VyYV1gLgBVAVRoZSBvcmlnaW4gb2YgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uIEFueSBhY2NvdW50IGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24sIGV2ZW4gaWZ0aXQgaXMgbm90IG9uZSBvZiB0aGUgc3Rha2Vycy4ASQFUaGUgcmV3YXJkIHBheW91dCBjb3VsZCBiZSBwYWdlZCBpbiBjYXNlIHRoZXJlIGFyZSB0b28gbWFueSBub21pbmF0b3JzIGJhY2tpbmcgdGhlXQFgdmFsaWRhdG9yX3N0YXNoYC4gVGhpcyBjYWxsIHdpbGwgcGF5b3V0IHVucGFpZCBwYWdlcyBpbiBhbiBhc2NlbmRpbmcgb3JkZXIuIFRvIGNsYWltIGG0c3BlY2lmaWMgcGFnZSwgdXNlIGBwYXlvdXRfc3Rha2Vyc19ieV9wYWdlYC5gAPBJZiBhbGwgcGFnZXMgYXJlIGNsYWltZWQsIGl0IHJldHVybnMgYW4gZXJyb3IgYEludmFsaWRQYWdlYC4YcmVib25kBAEUdmFsdWX8ATBCYWxhbmNlT2Y8VD4AExzcUmVib25kIGEgcG9ydGlvbiBvZiB0aGUgc3Rhc2ggc2NoZWR1bGVkIHRvIGJlIHVubG9ja2VkLgDUVGhlIGRpc3BhdGNoIG9yaWdpbiBtdXN0IGJlIHNpZ25lZCBieSB0aGUgY29udHJvbGxlci4ANCMjIENvbXBsZXhpdHnQLSBUaW1lIGNvbXBsZXhpdHk6IE8oTCksIHdoZXJlIEwgaXMgdW5sb2NraW5nIGNodW5rc4gtIEJvdW5kZWQgYnkgYE1heFVubG9ja2luZ0NodW5rc2AuKHJlYXBfc3Rhc2gIARRzdGFzaAABMFQ6OkFjY291bnRJZAABSG51bV9zbGFzaGluZ19zcGFucxABDHUzMgAUSF0BUmVtb3ZlIGFsbCBkYXRhIHN0cnVjdHVyZXMgY29uY2VybmluZyBhIHN0YWtlci9zdGFzaCBvbmNlIGl0IGlzIGF0IGEgc3RhdGUgd2hlcmUgaXQgY2FuBQFiZSBjb25zaWRlcmVkIGBkdXN0YCBpbiB0aGUgc3Rha2luZyBzeXN0ZW0uIFRoZSByZXF1aXJlbWVudHMgYXJlOgAFATEuIHRoZSBgdG90YWxfYmFsYW5jZWAgb2YgdGhlIHN0YXNoIGlzIGJlbG93IGV4aXN0ZW50aWFsIGRlcG9zaXQuEQEyLiBvciwgdGhlIGBsZWRnZXIudG90YWxgIG9mIHRoZSBzdGFzaCBpcyBiZWxvdyBleGlzdGVudGlhbCBkZXBvc2l0LmEBMy4gb3IsIGV4aXN0ZW50aWFsIGRlcG9zaXQgaXMgemVybyBhbmQgZWl0aGVyIGB0b3RhbF9iYWxhbmNlYCBvciBgbGVkZ2VyLnRvdGFsYCBpcyB6ZXJvLgBVAVRoZSBmb3JtZXIgY2FuIGhhcHBlbiBpbiBjYXNlcyBsaWtlIGEgc2xhc2g7IHRoZSBsYXR0ZXIgd2hlbiBhIGZ1bGx5IHVuYm9uZGVkIGFjY291bnQJAWlzIHN0aWxsIHJlY2VpdmluZyBzdGFraW5nIHJld2FyZHMgaW4gYFJld2FyZERlc3RpbmF0aW9uOjpTdGFrZWRgLgAxAUl0IGNhbiBiZSBjYWxsZWQgYnkgYW55b25lLCBhcyBsb25nIGFzIGBzdGFzaGAgbWVldHMgdGhlIGFib3ZlIHJlcXVpcmVtZW50cy4A3FJlZnVuZHMgdGhlIHRyYW5zYWN0aW9uIGZlZXMgdXBvbiBzdWNjZXNzZnVsIGV4ZWN1dGlvbi4ANCMjIFBhcmFtZXRlcnMARQEtIGBudW1fc2xhc2hpbmdfc3BhbnNgOiBSZWZlciB0byBjb21tZW50cyBvbiBbYENhbGw6OndpdGhkcmF3X3VuYm9uZGVkYF0gZm9yIG1vcmUgZGV0YWlscy4Qa2ljawQBDHdob90BAWRWZWM8QWNjb3VudElkTG9va3VwT2Y8VD4+ABUs4FJlbW92ZSB0aGUgZ2l2ZW4gbm9taW5hdGlvbnMgZnJvbSB0aGUgY2FsbGluZyB2YWxpZGF0b3IuANhFZmZlY3RzIHdpbGwgYmUgZmVsdCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBuZXh0IGVyYS4AUQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXyBieSB0aGUgY29udHJvbGxlciwgbm90IHRoZSBzdGFzaC4ATQEtIGB3aG9gOiBBIGxpc3Qgb2Ygbm9taW5hdG9yIHN0YXNoIGFjY291bnRzIHdobyBhcmUgbm9taW5hdGluZyB0aGlzIHZhbGlkYXRvciB3aGljaMAgIHNob3VsZCBubyBsb25nZXIgYmUgbm9taW5hdGluZyB0aGlzIHZhbGlkYXRvci4AVQFOb3RlOiBNYWtpbmcgdGhpcyBjYWxsIG9ubHkgbWFrZXMgc2Vuc2UgaWYgeW91IGZpcnN0IHNldCB0aGUgdmFsaWRhdG9yIHByZWZlcmVuY2VzIHRveGJsb2NrIGFueSBmdXJ0aGVyIG5vbWluYXRpb25zLkxzZXRfc3Rha2luZ19jb25maWdzHAFIbWluX25vbWluYXRvcl9ib25k6QEBWENvbmZpZ09wPEJhbGFuY2VPZjxUPj4AAUhtaW5fdmFsaWRhdG9yX2JvbmTpAQFYQ29uZmlnT3A8QmFsYW5jZU9mPFQ+PgABTG1heF9ub21pbmF0b3JfY291bnTtAQE0Q29uZmlnT3A8dTMyPgABTG1heF92YWxpZGF0b3JfY291bnTtAQE0Q29uZmlnT3A8dTMyPgABPGNoaWxsX3RocmVzaG9sZPEBAURDb25maWdPcDxQZXJjZW50PgABOG1pbl9jb21taXNzaW9u9QEBRENvbmZpZ09wPFBlcmJpbGw+AAFIbWF4X3N0YWtlZF9yZXdhcmRz8QEBRENvbmZpZ09wPFBlcmNlbnQ+ABZErFVwZGF0ZSB0aGUgdmFyaW91cyBzdGFraW5nIGNvbmZpZ3VyYXRpb25zIC4AJQEqIGBtaW5fbm9taW5hdG9yX2JvbmRgOiBUaGUgbWluaW11bSBhY3RpdmUgYm9uZCBuZWVkZWQgdG8gYmUgYSBub21pbmF0b3IuJQEqIGBtaW5fdmFsaWRhdG9yX2JvbmRgOiBUaGUgbWluaW11bSBhY3RpdmUgYm9uZCBuZWVkZWQgdG8gYmUgYSB2YWxpZGF0b3IuVQEqIGBtYXhfbm9taW5hdG9yX2NvdW50YDogVGhlIG1heCBudW1iZXIgb2YgdXNlcnMgd2hvIGNhbiBiZSBhIG5vbWluYXRvciBhdCBvbmNlLiBXaGVumCAgc2V0IHRvIGBOb25lYCwgbm8gbGltaXQgaXMgZW5mb3JjZWQuVQEqIGBtYXhfdmFsaWRhdG9yX2NvdW50YDogVGhlIG1heCBudW1iZXIgb2YgdXNlcnMgd2hvIGNhbiBiZSBhIHZhbGlkYXRvciBhdCBvbmNlLiBXaGVumCAgc2V0IHRvIGBOb25lYCwgbm8gbGltaXQgaXMgZW5mb3JjZWQuWQEqIGBjaGlsbF90aHJlc2hvbGRgOiBUaGUgcmF0aW8gb2YgYG1heF9ub21pbmF0b3JfY291bnRgIG9yIGBtYXhfdmFsaWRhdG9yX2NvdW50YCB3aGljaBkBICBzaG91bGQgYmUgZmlsbGVkIGluIG9yZGVyIGZvciB0aGUgYGNoaWxsX290aGVyYCB0cmFuc2FjdGlvbiB0byB3b3JrLmEBKiBgbWluX2NvbW1pc3Npb25gOiBUaGUgbWluaW11bSBhbW91bnQgb2YgY29tbWlzc2lvbiB0aGF0IGVhY2ggdmFsaWRhdG9ycyBtdXN0IG1haW50YWluLlUBICBUaGlzIGlzIGNoZWNrZWQgb25seSB1cG9uIGNhbGxpbmcgYHZhbGlkYXRlYC4gRXhpc3RpbmcgdmFsaWRhdG9ycyBhcmUgbm90IGFmZmVjdGVkLgDEUnVudGltZU9yaWdpbiBtdXN0IGJlIFJvb3QgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uLgA1AU5PVEU6IEV4aXN0aW5nIG5vbWluYXRvcnMgYW5kIHZhbGlkYXRvcnMgd2lsbCBub3QgYmUgYWZmZWN0ZWQgYnkgdGhpcyB1cGRhdGUuEQF0byBraWNrIHBlb3BsZSB1bmRlciB0aGUgbmV3IGxpbWl0cywgYGNoaWxsX290aGVyYCBzaG91bGQgYmUgY2FsbGVkLixjaGlsbF9vdGhlcgQBFHN0YXNoAAEwVDo6QWNjb3VudElkABdoQQFEZWNsYXJlIGEgYGNvbnRyb2xsZXJgIHRvIHN0b3AgcGFydGljaXBhdGluZyBhcyBlaXRoZXIgYSB2YWxpZGF0b3Igb3Igbm9taW5hdG9yLgDYRWZmZWN0cyB3aWxsIGJlIGZlbHQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbmV4dCBlcmEuAEEBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8sIGJ1dCBjYW4gYmUgY2FsbGVkIGJ5IGFueW9uZS4AWQFJZiB0aGUgY2FsbGVyIGlzIHRoZSBzYW1lIGFzIHRoZSBjb250cm9sbGVyIGJlaW5nIHRhcmdldGVkLCB0aGVuIG5vIGZ1cnRoZXIgY2hlY2tzIGFyZdhlbmZvcmNlZCwgYW5kIHRoaXMgZnVuY3Rpb24gYmVoYXZlcyBqdXN0IGxpa2UgYGNoaWxsYC4AXQFJZiB0aGUgY2FsbGVyIGlzIGRpZmZlcmVudCB0aGFuIHRoZSBjb250cm9sbGVyIGJlaW5nIHRhcmdldGVkLCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMwbXVzdCBiZSBtZXQ6AB0BKiBgY29udHJvbGxlcmAgbXVzdCBiZWxvbmcgdG8gYSBub21pbmF0b3Igd2hvIGhhcyBiZWNvbWUgbm9uLWRlY29kYWJsZSwADE9yOgA9ASogQSBgQ2hpbGxUaHJlc2hvbGRgIG11c3QgYmUgc2V0IGFuZCBjaGVja2VkIHdoaWNoIGRlZmluZXMgaG93IGNsb3NlIHRvIHRoZSBtYXhVASAgbm9taW5hdG9ycyBvciB2YWxpZGF0b3JzIHdlIG11c3QgcmVhY2ggYmVmb3JlIHVzZXJzIGNhbiBzdGFydCBjaGlsbGluZyBvbmUtYW5vdGhlci5ZASogQSBgTWF4Tm9taW5hdG9yQ291bnRgIGFuZCBgTWF4VmFsaWRhdG9yQ291bnRgIG11c3QgYmUgc2V0IHdoaWNoIGlzIHVzZWQgdG8gZGV0ZXJtaW5lkCAgaG93IGNsb3NlIHdlIGFyZSB0byB0aGUgdGhyZXNob2xkLl0BKiBBIGBNaW5Ob21pbmF0b3JCb25kYCBhbmQgYE1pblZhbGlkYXRvckJvbmRgIG11c3QgYmUgc2V0IGFuZCBjaGVja2VkLCB3aGljaCBkZXRlcm1pbmVzUQEgIGlmIHRoaXMgaXMgYSBwZXJzb24gdGhhdCBzaG91bGQgYmUgY2hpbGxlZCBiZWNhdXNlIHRoZXkgaGF2ZSBub3QgbWV0IHRoZSB0aHJlc2hvbGRAICBib25kIHJlcXVpcmVkLgBVAVRoaXMgY2FuIGJlIGhlbHBmdWwgaWYgYm9uZCByZXF1aXJlbWVudHMgYXJlIHVwZGF0ZWQsIGFuZCB3ZSBuZWVkIHRvIHJlbW92ZSBvbGQgdXNlcnOYd2hvIGRvIG5vdCBzYXRpc2Z5IHRoZXNlIHJlcXVpcmVtZW50cy5oZm9yY2VfYXBwbHlfbWluX2NvbW1pc3Npb24EATx2YWxpZGF0b3Jfc3Rhc2gAATBUOjpBY2NvdW50SWQAGAxFAUZvcmNlIGEgdmFsaWRhdG9yIHRvIGhhdmUgYXQgbGVhc3QgdGhlIG1pbmltdW0gY29tbWlzc2lvbi4gVGhpcyB3aWxsIG5vdCBhZmZlY3QgYWEBdmFsaWRhdG9yIHdobyBhbHJlYWR5IGhhcyBhIGNvbW1pc3Npb24gZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBtaW5pbXVtLiBBbnkgYWNjb3VudDhjYW4gY2FsbCB0aGlzLkhzZXRfbWluX2NvbW1pc3Npb24EAQxuZXesARxQZXJiaWxsABkQJQFTZXRzIHRoZSBtaW5pbXVtIGFtb3VudCBvZiBjb21taXNzaW9uIHRoYXQgZWFjaCB2YWxpZGF0b3JzIG11c3QgbWFpbnRhaW4uAFkBVGhpcyBjYWxsIGhhcyBsb3dlciBwcml2aWxlZ2UgcmVxdWlyZW1lbnRzIHRoYW4gYHNldF9zdGFraW5nX2NvbmZpZ2AgYW5kIGNhbiBiZSBjYWxsZWTMYnkgdGhlIGBUOjpBZG1pbk9yaWdpbmAuIFJvb3QgY2FuIGFsd2F5cyBjYWxsIHRoaXMuWHBheW91dF9zdGFrZXJzX2J5X3BhZ2UMATx2YWxpZGF0b3Jfc3Rhc2gAATBUOjpBY2NvdW50SWQAAQxlcmEQASBFcmFJbmRleAABEHBhZ2UQARBQYWdlABpEMQFQYXkgb3V0IGEgcGFnZSBvZiB0aGUgc3Rha2VycyBiZWhpbmQgYSB2YWxpZGF0b3IgZm9yIHRoZSBnaXZlbiBlcmEgYW5kIHBhZ2UuAOgtIGB2YWxpZGF0b3Jfc3Rhc2hgIGlzIHRoZSBzdGFzaCBhY2NvdW50IG9mIHRoZSB2YWxpZGF0b3IuMQEtIGBlcmFgIG1heSBiZSBhbnkgZXJhIGJldHdlZW4gYFtjdXJyZW50X2VyYSAtIGhpc3RvcnlfZGVwdGg7IGN1cnJlbnRfZXJhXWAuMQEtIGBwYWdlYCBpcyB0aGUgcGFnZSBpbmRleCBvZiBub21pbmF0b3JzIHRvIHBheSBvdXQgd2l0aCB2YWx1ZSBiZXR3ZWVuIDAgYW5ksCAgYG51bV9ub21pbmF0b3JzIC8gVDo6TWF4RXhwb3N1cmVQYWdlU2l6ZWAuAFUBVGhlIG9yaWdpbiBvZiB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXy4gQW55IGFjY291bnQgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbiwgZXZlbiBpZnRpdCBpcyBub3Qgb25lIG9mIHRoZSBzdGFrZXJzLgA9AUlmIGEgdmFsaWRhdG9yIGhhcyBtb3JlIHRoYW4gW2BDb25maWc6Ok1heEV4cG9zdXJlUGFnZVNpemVgXSBub21pbmF0b3JzIGJhY2tpbmcpAXRoZW0sIHRoZW4gdGhlIGxpc3Qgb2Ygbm9taW5hdG9ycyBpcyBwYWdlZCwgd2l0aCBlYWNoIHBhZ2UgYmVpbmcgY2FwcGVkIGF0VQFbYENvbmZpZzo6TWF4RXhwb3N1cmVQYWdlU2l6ZWAuXSBJZiBhIHZhbGlkYXRvciBoYXMgbW9yZSB0aGFuIG9uZSBwYWdlIG9mIG5vbWluYXRvcnMsSQF0aGUgY2FsbCBuZWVkcyB0byBiZSBtYWRlIGZvciBlYWNoIHBhZ2Ugc2VwYXJhdGVseSBpbiBvcmRlciBmb3IgYWxsIHRoZSBub21pbmF0b3JzVQFiYWNraW5nIGEgdmFsaWRhdG9yIHRvIHJlY2VpdmUgdGhlIHJld2FyZC4gVGhlIG5vbWluYXRvcnMgYXJlIG5vdCBzb3J0ZWQgYWNyb3NzIHBhZ2VzYQFhbmQgc28gaXQgc2hvdWxkIG5vdCBiZSBhc3N1bWVkIHRoZSBoaWdoZXN0IHN0YWtlciB3b3VsZCBiZSBvbiB0aGUgdG9wbW9zdCBwYWdlIGFuZCB2aWNlSQF2ZXJzYS4gSWYgcmV3YXJkcyBhcmUgbm90IGNsYWltZWQgaW4gW2BDb25maWc6Okhpc3RvcnlEZXB0aGBdIGVyYXMsIHRoZXkgYXJlIGxvc3QuMHVwZGF0ZV9wYXllZQQBKGNvbnRyb2xsZXIAATBUOjpBY2NvdW50SWQAGxjgTWlncmF0ZXMgYW4gYWNjb3VudCdzIGBSZXdhcmREZXN0aW5hdGlvbjo6Q29udHJvbGxlcmAgdG+kYFJld2FyZERlc3RpbmF0aW9uOjpBY2NvdW50KGNvbnRyb2xsZXIpYC4AUQFFZmZlY3RzIHdpbGwgYmUgZmVsdCBpbnN0YW50bHkgKGFzIHNvb24gYXMgdGhpcyBmdW5jdGlvbiBpcyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5KS4AMQFUaGlzIHdpbGwgd2FpdmUgdGhlIHRyYW5zYWN0aW9uIGZlZSBpZiB0aGUgYHBheWVlYCBpcyBzdWNjZXNzZnVsbHkgbWlncmF0ZWQuaGRlcHJlY2F0ZV9jb250cm9sbGVyX2JhdGNoBAEsY29udHJvbGxlcnP5AQH0Qm91bmRlZFZlYzxUOjpBY2NvdW50SWQsIFQ6Ok1heENvbnRyb2xsZXJzSW5EZXByZWNhdGlvbkJhdGNoPgAcHF0BVXBkYXRlcyBhIGJhdGNoIG9mIGNvbnRyb2xsZXIgYWNjb3VudHMgdG8gdGhlaXIgY29ycmVzcG9uZGluZyBzdGFzaCBhY2NvdW50IGlmIHRoZXkgYXJlYQFub3QgdGhlIHNhbWUuIElnbm9yZXMgYW55IGNvbnRyb2xsZXIgYWNjb3VudHMgdGhhdCBkbyBub3QgZXhpc3QsIGFuZCBkb2VzIG5vdCBvcGVyYXRlIGlmuHRoZSBzdGFzaCBhbmQgY29udHJvbGxlciBhcmUgYWxyZWFkeSB0aGUgc2FtZS4AUQFFZmZlY3RzIHdpbGwgYmUgZmVsdCBpbnN0YW50bHkgKGFzIHNvb24gYXMgdGhpcyBmdW5jdGlvbiBpcyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5KS4AtFRoZSBkaXNwYXRjaCBvcmlnaW4gbXVzdCBiZSBgVDo6QWRtaW5PcmlnaW5gLjhyZXN0b3JlX2xlZGdlchABFHN0YXNoAAEwVDo6QWNjb3VudElkAAFAbWF5YmVfY29udHJvbGxlcv0BAVBPcHRpb248VDo6QWNjb3VudElkPgABLG1heWJlX3RvdGFsAQIBUE9wdGlvbjxCYWxhbmNlT2Y8VD4+AAE8bWF5YmVfdW5sb2NraW5nBQIBFQFPcHRpb248Qm91bmRlZFZlYzxVbmxvY2tDaHVuazxCYWxhbmNlT2Y8VD4+LCBUOjoKTWF4VW5sb2NraW5nQ2h1bmtzPj4AHSwFAVJlc3RvcmVzIHRoZSBzdGF0ZSBvZiBhIGxlZGdlciB3aGljaCBpcyBpbiBhbiBpbmNvbnNpc3RlbnQgc3RhdGUuANxUaGUgcmVxdWlyZW1lbnRzIHRvIHJlc3RvcmUgYSBsZWRnZXIgYXJlIHRoZSBmb2xsb3dpbmc6ZCogVGhlIHN0YXNoIGlzIGJvbmRlZDsgb3INASogVGhlIHN0YXNoIGlzIG5vdCBib25kZWQgYnV0IGl0IGhhcyBhIHN0YWtpbmcgbG9jayBsZWZ0IGJlaGluZDsgb3IlASogSWYgdGhlIHN0YXNoIGhhcyBhbiBhc3NvY2lhdGVkIGxlZGdlciBhbmQgaXRzIHN0YXRlIGlzIGluY29uc2lzdGVudDsgb3IdASogSWYgdGhlIGxlZGdlciBpcyBub3QgY29ycnVwdGVkICpidXQqIGl0cyBzdGFraW5nIGxvY2sgaXMgb3V0IG9mIHN5bmMuAGEBVGhlIGBtYXliZV8qYCBpbnB1dCBwYXJhbWV0ZXJzIHdpbGwgb3ZlcndyaXRlIHRoZSBjb3JyZXNwb25kaW5nIGRhdGEgYW5kIG1ldGFkYXRhIG9mIHRoZVkBbGVkZ2VyIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3Rhc2guIElmIHRoZSBpbnB1dCBwYXJhbWV0ZXJzIGFyZSBub3Qgc2V0LCB0aGUgbGVkZ2VyIHdpbGyQYmUgcmVzZXQgdmFsdWVzIGZyb20gb24tY2hhaW4gc3RhdGUuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLt0BAAACxQEA4QEMNHNwX2FyaXRobWV0aWMocGVyX3RoaW5ncxxQZXJjZW50AAAEAAgBCHU4AADlAQAAAhAA6QEQOHBhbGxldF9zdGFraW5nGHBhbGxldBhwYWxsZXQgQ29uZmlnT3AEBFQBGAEMEE5vb3AAAAAMU2V0BAAYAQRUAAEAGFJlbW92ZQACAADtARA4cGFsbGV0X3N0YWtpbmcYcGFsbGV0GHBhbGxldCBDb25maWdPcAQEVAEQAQwQTm9vcAAAAAxTZXQEABABBFQAAQAYUmVtb3ZlAAIAAPEBEDhwYWxsZXRfc3Rha2luZxhwYWxsZXQYcGFsbGV0IENvbmZpZ09wBARUAeEBAQwQTm9vcAAAAAxTZXQEAOEBAQRUAAEAGFJlbW92ZQACAAD1ARA4cGFsbGV0X3N0YWtpbmcYcGFsbGV0GHBhbGxldCBDb25maWdPcAQEVAGsAQwQTm9vcAAAAAxTZXQEAKwBBFQAAQAYUmVtb3ZlAAIAAPkBDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBAARTAAAEANEBARhWZWM8VD4AAP0BBBhPcHRpb24EBFQBAAEIEE5vbmUAAAAQU29tZQQAAAAAAQAAAQIEGE9wdGlvbgQEVAEYAQgQTm9uZQAAABBTb21lBAAYAAABAAAFAgQYT3B0aW9uBARUAQkCAQgQTm9uZQAAABBTb21lBAAJAgAAAQAACQIMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAENAgRTAAAEABECARhWZWM8VD4AAA0CCDhwYWxsZXRfc3Rha2luZyxVbmxvY2tDaHVuawQcQmFsYW5jZQEYAAgBFHZhbHVl/AEcQmFsYW5jZQABDGVyYewBIEVyYUluZGV4AAARAgAAAg0CABUCDDhwYWxsZXRfc2Vzc2lvbhhwYWxsZXQQQ2FsbAQEVAABCCBzZXRfa2V5cwgBEGtleXMZAgEcVDo6S2V5cwABFHByb29mOAEcVmVjPHU4PgAAJORTZXRzIHRoZSBzZXNzaW9uIGtleShzKSBvZiB0aGUgZnVuY3Rpb24gY2FsbGVyIHRvIGBrZXlzYC4dAUFsbG93cyBhbiBhY2NvdW50IHRvIHNldCBpdHMgc2Vzc2lvbiBrZXkgcHJpb3IgdG8gYmVjb21pbmcgYSB2YWxpZGF0b3IuwFRoaXMgZG9lc24ndCB0YWtlIGVmZmVjdCB1bnRpbCB0aGUgbmV4dCBzZXNzaW9uLgDQVGhlIGRpc3BhdGNoIG9yaWdpbiBvZiB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgc2lnbmVkLgA0IyMgQ29tcGxleGl0eVkBLSBgTygxKWAuIEFjdHVhbCBjb3N0IGRlcGVuZHMgb24gdGhlIG51bWJlciBvZiBsZW5ndGggb2YgYFQ6OktleXM6OmtleV9pZHMoKWAgd2hpY2ggaXMgICBmaXhlZC4ocHVyZ2Vfa2V5cwABMMhSZW1vdmVzIGFueSBzZXNzaW9uIGtleShzKSBvZiB0aGUgZnVuY3Rpb24gY2FsbGVyLgDAVGhpcyBkb2Vzbid0IHRha2UgZWZmZWN0IHVudGlsIHRoZSBuZXh0IHNlc3Npb24uAFUBVGhlIGRpc3BhdGNoIG9yaWdpbiBvZiB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgU2lnbmVkIGFuZCB0aGUgYWNjb3VudCBtdXN0IGJlIGVpdGhlciBiZV0BY29udmVydGlibGUgdG8gYSB2YWxpZGF0b3IgSUQgdXNpbmcgdGhlIGNoYWluJ3MgdHlwaWNhbCBhZGRyZXNzaW5nIHN5c3RlbSAodGhpcyB1c3VhbGx5UQFtZWFucyBiZWluZyBhIGNvbnRyb2xsZXIgYWNjb3VudCkgb3IgZGlyZWN0bHkgY29udmVydGlibGUgaW50byBhIHZhbGlkYXRvciBJRCAod2hpY2iUdXN1YWxseSBtZWFucyBiZWluZyBhIHN0YXNoIGFjY291bnQpLgA0IyMgQ29tcGxleGl0eT0BLSBgTygxKWAgaW4gbnVtYmVyIG9mIGtleSB0eXBlcy4gQWN0dWFsIGNvc3QgZGVwZW5kcyBvbiB0aGUgbnVtYmVyIG9mIGxlbmd0aCBvZpggIGBUOjpLZXlzOjprZXlfaWRzKClgIHdoaWNoIGlzIGZpeGVkLgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy4ZAghAcG9sa2Fkb3RfcnVudGltZSxTZXNzaW9uS2V5cwAAGAEcZ3JhbmRwYdQB0DxHcmFuZHBhIGFzICRjcmF0ZTo6Qm91bmRUb1J1bnRpbWVBcHBQdWJsaWM+OjpQdWJsaWMAARBiYWJlpQEBxDxCYWJlIGFzICRjcmF0ZTo6Qm91bmRUb1J1bnRpbWVBcHBQdWJsaWM+OjpQdWJsaWMAAThwYXJhX3ZhbGlkYXRvch0CAeA8SW5pdGlhbGl6ZXIgYXMgJGNyYXRlOjpCb3VuZFRvUnVudGltZUFwcFB1YmxpYz46OlB1YmxpYwABPHBhcmFfYXNzaWdubWVudCECAfA8UGFyYVNlc3Npb25JbmZvIGFzICRjcmF0ZTo6Qm91bmRUb1J1bnRpbWVBcHBQdWJsaWM+OjpQdWJsaWMAAUxhdXRob3JpdHlfZGlzY292ZXJ5JQIB/DxBdXRob3JpdHlEaXNjb3ZlcnkgYXMgJGNyYXRlOjpCb3VuZFRvUnVudGltZUFwcFB1YmxpYz46OlB1YmxpYwABFGJlZWZ5KQIByDxCZWVmeSBhcyAkY3JhdGU6OkJvdW5kVG9SdW50aW1lQXBwUHVibGljPjo6UHVibGljAAAdAhBMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2NzR2YWxpZGF0b3JfYXBwGFB1YmxpYwAABAAEATxzcjI1NTE5OjpQdWJsaWMAACECEExwb2xrYWRvdF9wcmltaXRpdmVzCHY3OGFzc2lnbm1lbnRfYXBwGFB1YmxpYwAABAAEATxzcjI1NTE5OjpQdWJsaWMAACUCDFhzcF9hdXRob3JpdHlfZGlzY292ZXJ5DGFwcBhQdWJsaWMAAAQABAE8c3IyNTUxOTo6UHVibGljAAApAgxIc3BfY29uc2Vuc3VzX2JlZWZ5MGVjZHNhX2NyeXB0bxhQdWJsaWMAAAQALQIBNGVjZHNhOjpQdWJsaWMAAC0CAAADIQAAAAgAMQIMOHBhbGxldF9ncmFuZHBhGHBhbGxldBBDYWxsBARUAAEMTHJlcG9ydF9lcXVpdm9jYXRpb24IAUhlcXVpdm9jYXRpb25fcHJvb2Y1AgHIQm94PEVxdWl2b2NhdGlvblByb29mPFQ6Okhhc2gsIEJsb2NrTnVtYmVyRm9yPFQ+Pj4AATxrZXlfb3duZXJfcHJvb2atAQFAVDo6S2V5T3duZXJQcm9vZgAAEAkBUmVwb3J0IHZvdGVyIGVxdWl2b2NhdGlvbi9taXNiZWhhdmlvci4gVGhpcyBtZXRob2Qgd2lsbCB2ZXJpZnkgdGhl9GVxdWl2b2NhdGlvbiBwcm9vZiBhbmQgdmFsaWRhdGUgdGhlIGdpdmVuIGtleSBvd25lcnNoaXAgcHJvb2b4YWdhaW5zdCB0aGUgZXh0cmFjdGVkIG9mZmVuZGVyLiBJZiBib3RoIGFyZSB2YWxpZCwgdGhlIG9mZmVuY2VEd2lsbCBiZSByZXBvcnRlZC5wcmVwb3J0X2VxdWl2b2NhdGlvbl91bnNpZ25lZAgBSGVxdWl2b2NhdGlvbl9wcm9vZjUCAchCb3g8RXF1aXZvY2F0aW9uUHJvb2Y8VDo6SGFzaCwgQmxvY2tOdW1iZXJGb3I8VD4+PgABPGtleV9vd25lcl9wcm9vZq0BAUBUOjpLZXlPd25lclByb29mAAEkCQFSZXBvcnQgdm90ZXIgZXF1aXZvY2F0aW9uL21pc2JlaGF2aW9yLiBUaGlzIG1ldGhvZCB3aWxsIHZlcmlmeSB0aGX0ZXF1aXZvY2F0aW9uIHByb29mIGFuZCB2YWxpZGF0ZSB0aGUgZ2l2ZW4ga2V5IG93bmVyc2hpcCBwcm9vZvhhZ2FpbnN0IHRoZSBleHRyYWN0ZWQgb2ZmZW5kZXIuIElmIGJvdGggYXJlIHZhbGlkLCB0aGUgb2ZmZW5jZUR3aWxsIGJlIHJlcG9ydGVkLgANAVRoaXMgZXh0cmluc2ljIG11c3QgYmUgY2FsbGVkIHVuc2lnbmVkIGFuZCBpdCBpcyBleHBlY3RlZCB0aGF0IG9ubHkVAWJsb2NrIGF1dGhvcnMgd2lsbCBjYWxsIGl0ICh2YWxpZGF0ZWQgaW4gYFZhbGlkYXRlVW5zaWduZWRgKSwgYXMgc3VjaBUBaWYgdGhlIGJsb2NrIGF1dGhvciBpcyBkZWZpbmVkIGl0IHdpbGwgYmUgZGVmaW5lZCBhcyB0aGUgZXF1aXZvY2F0aW9uJHJlcG9ydGVyLjBub3RlX3N0YWxsZWQIARRkZWxheRABREJsb2NrTnVtYmVyRm9yPFQ+AAFsYmVzdF9maW5hbGl6ZWRfYmxvY2tfbnVtYmVyEAFEQmxvY2tOdW1iZXJGb3I8VD4AAjA9AU5vdGUgdGhhdCB0aGUgY3VycmVudCBhdXRob3JpdHkgc2V0IG9mIHRoZSBHUkFORFBBIGZpbmFsaXR5IGdhZGdldCBoYXMgc3RhbGxlZC4AYQFUaGlzIHdpbGwgdHJpZ2dlciBhIGZvcmNlZCBhdXRob3JpdHkgc2V0IGNoYW5nZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBuZXh0IHNlc3Npb24sIHRvYQFiZSBlbmFjdGVkIGBkZWxheWAgYmxvY2tzIGFmdGVyIHRoYXQuIFRoZSBgZGVsYXlgIHNob3VsZCBiZSBoaWdoIGVub3VnaCB0byBzYWZlbHkgYXNzdW1lSQF0aGF0IHRoZSBibG9jayBzaWduYWxsaW5nIHRoZSBmb3JjZWQgY2hhbmdlIHdpbGwgbm90IGJlIHJlLW9yZ2VkIGUuZy4gMTAwMCBibG9ja3MuXQFUaGUgYmxvY2sgcHJvZHVjdGlvbiByYXRlICh3aGljaCBtYXkgYmUgc2xvd2VkIGRvd24gYmVjYXVzZSBvZiBmaW5hbGl0eSBsYWdnaW5nKSBzaG91bGRRAWJlIHRha2VuIGludG8gYWNjb3VudCB3aGVuIGNob29zaW5nIHRoZSBgZGVsYXlgLiBUaGUgR1JBTkRQQSB2b3RlcnMgYmFzZWQgb24gdGhlIG5ld1UBYXV0aG9yaXR5IHdpbGwgc3RhcnQgdm90aW5nIG9uIHRvcCBvZiBgYmVzdF9maW5hbGl6ZWRfYmxvY2tfbnVtYmVyYCBmb3IgbmV3IGZpbmFsaXplZE0BYmxvY2tzLiBgYmVzdF9maW5hbGl6ZWRfYmxvY2tfbnVtYmVyYCBzaG91bGQgYmUgdGhlIGhpZ2hlc3Qgb2YgdGhlIGxhdGVzdCBmaW5hbGl6ZWTEYmxvY2sgb2YgYWxsIHZhbGlkYXRvcnMgb2YgdGhlIG5ldyBhdXRob3JpdHkgc2V0LgBYT25seSBjYWxsYWJsZSBieSByb290LgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy41AghQc3BfY29uc2Vuc3VzX2dyYW5kcGFERXF1aXZvY2F0aW9uUHJvb2YIBEgBNAROARAACAEYc2V0X2lkMAEUU2V0SWQAATBlcXVpdm9jYXRpb245AgFIRXF1aXZvY2F0aW9uPEgsIE4+AAA5AghQc3BfY29uc2Vuc3VzX2dyYW5kcGEwRXF1aXZvY2F0aW9uCARIATQETgEQAQgcUHJldm90ZQQAPQIBiQFmaW5hbGl0eV9ncmFuZHBhOjpFcXVpdm9jYXRpb248QXV0aG9yaXR5SWQsIGZpbmFsaXR5X2dyYW5kcGE6OlByZXZvdGU8CkgsIE4+LCBBdXRob3JpdHlTaWduYXR1cmUsPgAAACRQcmVjb21taXQEAFECAZEBZmluYWxpdHlfZ3JhbmRwYTo6RXF1aXZvY2F0aW9uPEF1dGhvcml0eUlkLCBmaW5hbGl0eV9ncmFuZHBhOjpQcmVjb21taXQKPEgsIE4+LCBBdXRob3JpdHlTaWduYXR1cmUsPgABAAA9AghAZmluYWxpdHlfZ3JhbmRwYTBFcXVpdm9jYXRpb24MCElkAdQEVgFBAgRTAUUCABABMHJvdW5kX251bWJlcjABDHU2NAABIGlkZW50aXR51AEISWQAARRmaXJzdE0CARgoViwgUykAARhzZWNvbmRNAgEYKFYsIFMpAABBAghAZmluYWxpdHlfZ3JhbmRwYRxQcmV2b3RlCARIATQETgEQAAgBLHRhcmdldF9oYXNoNAEESAABNHRhcmdldF9udW1iZXIQAQROAABFAgxQc3BfY29uc2Vuc3VzX2dyYW5kcGEMYXBwJFNpZ25hdHVyZQAABABJAgFIZWQyNTUxOTo6U2lnbmF0dXJlAABJAgAAA0AAAAAIAE0CAAAECEECRQIAUQIIQGZpbmFsaXR5X2dyYW5kcGEwRXF1aXZvY2F0aW9uDAhJZAHUBFYBVQIEUwFFAgAQATByb3VuZF9udW1iZXIwAQx1NjQAASBpZGVudGl0edQBCElkAAEUZmlyc3RZAgEYKFYsIFMpAAEYc2Vjb25kWQIBGChWLCBTKQAAVQIIQGZpbmFsaXR5X2dyYW5kcGEkUHJlY29tbWl0CARIATQETgEQAAgBLHRhcmdldF9oYXNoNAEESAABNHRhcmdldF9udW1iZXIQAQROAABZAgAABAhVAkUCAF0CDDxwYWxsZXRfdHJlYXN1cnkYcGFsbGV0EENhbGwIBFQABEkAARgsc3BlbmRfbG9jYWwIARhhbW91bnT8ATxCYWxhbmNlT2Y8VCwgST4AASxiZW5lZmljaWFyecUBAVBBY2NvdW50SWRMb29rdXBPZjxUPgADRLhQcm9wb3NlIGFuZCBhcHByb3ZlIGEgc3BlbmQgb2YgdHJlYXN1cnkgZnVuZHMuAEgjIyBEaXNwYXRjaCBPcmlnaW4ARQFNdXN0IGJlIFtgQ29uZmlnOjpTcGVuZE9yaWdpbmBdIHdpdGggdGhlIGBTdWNjZXNzYCB2YWx1ZSBiZWluZyBhdCBsZWFzdCBgYW1vdW50YC4ALCMjIyBEZXRhaWxzRQFOT1RFOiBGb3IgcmVjb3JkLWtlZXBpbmcgcHVycG9zZXMsIHRoZSBwcm9wb3NlciBpcyBkZWVtZWQgdG8gYmUgZXF1aXZhbGVudCB0byB0aGUwYmVuZWZpY2lhcnkuADgjIyMgUGFyYW1ldGVyc0EBLSBgYW1vdW50YDogVGhlIGFtb3VudCB0byBiZSB0cmFuc2ZlcnJlZCBmcm9tIHRoZSB0cmVhc3VyeSB0byB0aGUgYGJlbmVmaWNpYXJ5YC7oLSBgYmVuZWZpY2lhcnlgOiBUaGUgZGVzdGluYXRpb24gYWNjb3VudCBmb3IgdGhlIHRyYW5zZmVyLgAkIyMgRXZlbnRzALRFbWl0cyBbYEV2ZW50OjpTcGVuZEFwcHJvdmVkYF0gaWYgc3VjY2Vzc2Z1bC48cmVtb3ZlX2FwcHJvdmFsBAEscHJvcG9zYWxfaWTsATRQcm9wb3NhbEluZGV4AARULQFGb3JjZSBhIHByZXZpb3VzbHkgYXBwcm92ZWQgcHJvcG9zYWwgdG8gYmUgcmVtb3ZlZCBmcm9tIHRoZSBhcHByb3ZhbCBxdWV1ZS4ASCMjIERpc3BhdGNoIE9yaWdpbgCETXVzdCBiZSBbYENvbmZpZzo6UmVqZWN0T3JpZ2luYF0uACgjIyBEZXRhaWxzAMBUaGUgb3JpZ2luYWwgZGVwb3NpdCB3aWxsIG5vIGxvbmdlciBiZSByZXR1cm5lZC4AOCMjIyBQYXJhbWV0ZXJzoC0gYHByb3Bvc2FsX2lkYDogVGhlIGluZGV4IG9mIGEgcHJvcG9zYWwAOCMjIyBDb21wbGV4aXR5rC0gTyhBKSB3aGVyZSBgQWAgaXMgdGhlIG51bWJlciBvZiBhcHByb3ZhbHMAKCMjIyBFcnJvcnNFAS0gW2BFcnJvcjo6UHJvcG9zYWxOb3RBcHByb3ZlZGBdOiBUaGUgYHByb3Bvc2FsX2lkYCBzdXBwbGllZCB3YXMgbm90IGZvdW5kIGluIHRoZVEBICBhcHByb3ZhbCBxdWV1ZSwgaS5lLiwgdGhlIHByb3Bvc2FsIGhhcyBub3QgYmVlbiBhcHByb3ZlZC4gVGhpcyBjb3VsZCBhbHNvIG1lYW4gdGhlWQEgIHByb3Bvc2FsIGRvZXMgbm90IGV4aXN0IGFsdG9nZXRoZXIsIHRodXMgdGhlcmUgaXMgbm8gd2F5IGl0IHdvdWxkIGhhdmUgYmVlbiBhcHByb3ZlZFQgIGluIHRoZSBmaXJzdCBwbGFjZS4Uc3BlbmQQAShhc3NldF9raW5k3AFEQm94PFQ6OkFzc2V0S2luZD4AARhhbW91bnT8AVBBc3NldEJhbGFuY2VPZjxULCBJPgABLGJlbmVmaWNpYXJ5RQEBeEJveDxCZW5lZmljaWFyeUxvb2t1cE9mPFQsIEk+PgABKHZhbGlkX2Zyb21hAgFkT3B0aW9uPEJsb2NrTnVtYmVyRm9yPFQ+PgAFaLhQcm9wb3NlIGFuZCBhcHByb3ZlIGEgc3BlbmQgb2YgdHJlYXN1cnkgZnVuZHMuAEgjIyBEaXNwYXRjaCBPcmlnaW4AHQFNdXN0IGJlIFtgQ29uZmlnOjpTcGVuZE9yaWdpbmBdIHdpdGggdGhlIGBTdWNjZXNzYCB2YWx1ZSBiZWluZyBhdCBsZWFzdFUBYGFtb3VudGAgb2YgYGFzc2V0X2tpbmRgIGluIHRoZSBuYXRpdmUgYXNzZXQuIFRoZSBhbW91bnQgb2YgYGFzc2V0X2tpbmRgIGlzIGNvbnZlcnRlZNRmb3IgYXNzZXJ0aW9uIHVzaW5nIHRoZSBbYENvbmZpZzo6QmFsYW5jZUNvbnZlcnRlcmBdLgAoIyMgRGV0YWlscwBJAUNyZWF0ZSBhbiBhcHByb3ZlZCBzcGVuZCBmb3IgdHJhbnNmZXJyaW5nIGEgc3BlY2lmaWMgYGFtb3VudGAgb2YgYGFzc2V0X2tpbmRgIHRvIGFhAWRlc2lnbmF0ZWQgYmVuZWZpY2lhcnkuIFRoZSBzcGVuZCBtdXN0IGJlIGNsYWltZWQgdXNpbmcgdGhlIGBwYXlvdXRgIGRpc3BhdGNoYWJsZSB3aXRoaW50dGhlIFtgQ29uZmlnOjpQYXlvdXRQZXJpb2RgXS4AOCMjIyBQYXJhbWV0ZXJzFQEtIGBhc3NldF9raW5kYDogQW4gaW5kaWNhdG9yIG9mIHRoZSBzcGVjaWZpYyBhc3NldCBjbGFzcyB0byBiZSBzcGVudC5BAS0gYGFtb3VudGA6IFRoZSBhbW91bnQgdG8gYmUgdHJhbnNmZXJyZWQgZnJvbSB0aGUgdHJlYXN1cnkgdG8gdGhlIGBiZW5lZmljaWFyeWAuuC0gYGJlbmVmaWNpYXJ5YDogVGhlIGJlbmVmaWNpYXJ5IG9mIHRoZSBzcGVuZC5VAS0gYHZhbGlkX2Zyb21gOiBUaGUgYmxvY2sgbnVtYmVyIGZyb20gd2hpY2ggdGhlIHNwZW5kIGNhbiBiZSBjbGFpbWVkLiBJdCBjYW4gcmVmZXIgdG8ZASAgdGhlIHBhc3QgaWYgdGhlIHJlc3VsdGluZyBzcGVuZCBoYXMgbm90IHlldCBleHBpcmVkIGFjY29yZGluZyB0byB0aGVFASAgW2BDb25maWc6OlBheW91dFBlcmlvZGBdLiBJZiBgTm9uZWAsIHRoZSBzcGVuZCBjYW4gYmUgY2xhaW1lZCBpbW1lZGlhdGVseSBhZnRlciwgIGFwcHJvdmFsLgAkIyMgRXZlbnRzAMhFbWl0cyBbYEV2ZW50OjpBc3NldFNwZW5kQXBwcm92ZWRgXSBpZiBzdWNjZXNzZnVsLhhwYXlvdXQEARRpbmRleBABKFNwZW5kSW5kZXgABkw4Q2xhaW0gYSBzcGVuZC4ASCMjIERpc3BhdGNoIE9yaWdpbgA4TXVzdCBiZSBzaWduZWQAKCMjIERldGFpbHMAVQFTcGVuZHMgbXVzdCBiZSBjbGFpbWVkIHdpdGhpbiBzb21lIHRlbXBvcmFsIGJvdW5kcy4gQSBzcGVuZCBtYXkgYmUgY2xhaW1lZCB3aXRoaW4gb25l1FtgQ29uZmlnOjpQYXlvdXRQZXJpb2RgXSBmcm9tIHRoZSBgdmFsaWRfZnJvbWAgYmxvY2suVQFJbiBjYXNlIG9mIGEgcGF5b3V0IGZhaWx1cmUsIHRoZSBzcGVuZCBzdGF0dXMgbXVzdCBiZSB1cGRhdGVkIHdpdGggdGhlIGBjaGVja19zdGF0dXNg3GRpc3BhdGNoYWJsZSBiZWZvcmUgcmV0cnlpbmcgd2l0aCB0aGUgY3VycmVudCBmdW5jdGlvbi4AOCMjIyBQYXJhbWV0ZXJzbC0gYGluZGV4YDogVGhlIHNwZW5kIGluZGV4LgAkIyMgRXZlbnRzAJBFbWl0cyBbYEV2ZW50OjpQYWlkYF0gaWYgc3VjY2Vzc2Z1bC4wY2hlY2tfc3RhdHVzBAEUaW5kZXgQAShTcGVuZEluZGV4AAdMKQFDaGVjayB0aGUgc3RhdHVzIG9mIHRoZSBzcGVuZCBhbmQgcmVtb3ZlIGl0IGZyb20gdGhlIHN0b3JhZ2UgaWYgcHJvY2Vzc2VkLgBIIyMgRGlzcGF0Y2ggT3JpZ2luADxNdXN0IGJlIHNpZ25lZC4AKCMjIERldGFpbHMAAQFUaGUgc3RhdHVzIGNoZWNrIGlzIGEgcHJlcmVxdWlzaXRlIGZvciByZXRyeWluZyBhIGZhaWxlZCBwYXlvdXQuSQFJZiBhIHNwZW5kIGhhcyBlaXRoZXIgc3VjY2VlZGVkIG9yIGV4cGlyZWQsIGl0IGlzIHJlbW92ZWQgZnJvbSB0aGUgc3RvcmFnZSBieSB0aGlz7GZ1bmN0aW9uLiBJbiBzdWNoIGluc3RhbmNlcywgdHJhbnNhY3Rpb24gZmVlcyBhcmUgcmVmdW5kZWQuADgjIyMgUGFyYW1ldGVyc2wtIGBpbmRleGA6IFRoZSBzcGVuZCBpbmRleC4AJCMjIEV2ZW50cwD4RW1pdHMgW2BFdmVudDo6UGF5bWVudEZhaWxlZGBdIGlmIHRoZSBzcGVuZCBwYXlvdXQgaGFzIGZhaWxlZC4BAUVtaXRzIFtgRXZlbnQ6OlNwZW5kUHJvY2Vzc2VkYF0gaWYgdGhlIHNwZW5kIHBheW91dCBoYXMgc3VjY2VlZC4odm9pZF9zcGVuZAQBFGluZGV4EAEoU3BlbmRJbmRleAAIQHxWb2lkIHByZXZpb3VzbHkgYXBwcm92ZWQgc3BlbmQuAEgjIyBEaXNwYXRjaCBPcmlnaW4AhE11c3QgYmUgW2BDb25maWc6OlJlamVjdE9yaWdpbmBdLgAoIyMgRGV0YWlscwAdAUEgc3BlbmQgdm9pZCBpcyBvbmx5IHBvc3NpYmxlIGlmIHRoZSBwYXlvdXQgaGFzIG5vdCBiZWVuIGF0dGVtcHRlZCB5ZXQuADgjIyMgUGFyYW1ldGVyc2wtIGBpbmRleGA6IFRoZSBzcGVuZCBpbmRleC4AJCMjIEV2ZW50cwDARW1pdHMgW2BFdmVudDo6QXNzZXRTcGVuZFZvaWRlZGBdIGlmIHN1Y2Nlc3NmdWwuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLmECBBhPcHRpb24EBFQBEAEIEE5vbmUAAAAQU29tZQQAEAAAAQAAZQIMYHBhbGxldF9jb252aWN0aW9uX3ZvdGluZxhwYWxsZXQQQ2FsbAgEVAAESQABGBB2b3RlCAEocG9sbF9pbmRleOwBRFBvbGxJbmRleE9mPFQsIEk+AAEQdm90ZWkCAXBBY2NvdW50Vm90ZTxCYWxhbmNlT2Y8VCwgST4+AAAkGQFWb3RlIGluIGEgcG9sbC4gSWYgYHZvdGUuaXNfYXllKClgLCB0aGUgdm90ZSBpcyB0byBlbmFjdCB0aGUgcHJvcG9zYWw7uG90aGVyd2lzZSBpdCBpcyBhIHZvdGUgdG8ga2VlcCB0aGUgc3RhdHVzIHF1by4AyFRoZSBkaXNwYXRjaCBvcmlnaW4gb2YgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uAMgtIGBwb2xsX2luZGV4YDogVGhlIGluZGV4IG9mIHRoZSBwb2xsIHRvIHZvdGUgZm9yLoQtIGB2b3RlYDogVGhlIHZvdGUgY29uZmlndXJhdGlvbi4AFQFXZWlnaHQ6IGBPKFIpYCB3aGVyZSBSIGlzIHRoZSBudW1iZXIgb2YgcG9sbHMgdGhlIHZvdGVyIGhhcyB2b3RlZCBvbi4gZGVsZWdhdGUQARRjbGFzc20BATRDbGFzc09mPFQsIEk+AAEIdG/FAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AAShjb252aWN0aW9ucQIBKENvbnZpY3Rpb24AARxiYWxhbmNlGAE8QmFsYW5jZU9mPFQsIEk+AAFcTQFEZWxlZ2F0ZSB0aGUgdm90aW5nIHBvd2VyICh3aXRoIHNvbWUgZ2l2ZW4gY29udmljdGlvbikgb2YgdGhlIHNlbmRpbmcgYWNjb3VudCBmb3IgYWhwYXJ0aWN1bGFyIGNsYXNzIG9mIHBvbGxzLgBVAVRoZSBiYWxhbmNlIGRlbGVnYXRlZCBpcyBsb2NrZWQgZm9yIGFzIGxvbmcgYXMgaXQncyBkZWxlZ2F0ZWQsIGFuZCB0aGVyZWFmdGVyIGZvciB0aGXIdGltZSBhcHByb3ByaWF0ZSBmb3IgdGhlIGNvbnZpY3Rpb24ncyBsb2NrIHBlcmlvZC4AXQFUaGUgZGlzcGF0Y2ggb3JpZ2luIG9mIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfLCBhbmQgdGhlIHNpZ25pbmcgYWNjb3VudCBtdXN0IGVpdGhlcjp0ICAtIGJlIGRlbGVnYXRpbmcgYWxyZWFkeTsgb3JFASAgLSBoYXZlIG5vIHZvdGluZyBhY3Rpdml0eSAoaWYgdGhlcmUgaXMsIHRoZW4gaXQgd2lsbCBuZWVkIHRvIGJlIHJlbW92ZWQgdGhyb3VnaEwgICAgYHJlbW92ZV92b3RlYCkuAEUBLSBgdG9gOiBUaGUgYWNjb3VudCB3aG9zZSB2b3RpbmcgdGhlIGB0YXJnZXRgIGFjY291bnQncyB2b3RpbmcgcG93ZXIgd2lsbCBmb2xsb3cuXQEtIGBjbGFzc2A6IFRoZSBjbGFzcyBvZiBwb2xscyB0byBkZWxlZ2F0ZS4gVG8gZGVsZWdhdGUgbXVsdGlwbGUgY2xhc3NlcywgbXVsdGlwbGUgY2FsbHOAICB0byB0aGlzIGZ1bmN0aW9uIGFyZSByZXF1aXJlZC5VAS0gYGNvbnZpY3Rpb25gOiBUaGUgY29udmljdGlvbiB0aGF0IHdpbGwgYmUgYXR0YWNoZWQgdG8gdGhlIGRlbGVnYXRlZCB2b3Rlcy4gV2hlbiB0aGVBASAgYWNjb3VudCBpcyB1bmRlbGVnYXRlZCwgdGhlIGZ1bmRzIHdpbGwgYmUgbG9ja2VkIGZvciB0aGUgY29ycmVzcG9uZGluZyBwZXJpb2QuYQEtIGBiYWxhbmNlYDogVGhlIGFtb3VudCBvZiB0aGUgYWNjb3VudCdzIGJhbGFuY2UgdG8gYmUgdXNlZCBpbiBkZWxlZ2F0aW5nLiBUaGlzIG11c3Qgbm90tCAgYmUgbW9yZSB0aGFuIHRoZSBhY2NvdW50J3MgY3VycmVudCBiYWxhbmNlLgBIRW1pdHMgYERlbGVnYXRlZGAuACUBV2VpZ2h0OiBgTyhSKWAgd2hlcmUgUiBpcyB0aGUgbnVtYmVyIG9mIHBvbGxzIHRoZSB2b3RlciBkZWxlZ2F0aW5nIHRvIGhhc00BICB2b3RlZCBvbi4gV2VpZ2h0IGlzIGluaXRpYWxseSBjaGFyZ2VkIGFzIGlmIG1heGltdW0gdm90ZXMsIGJ1dCBpcyByZWZ1bmRlZCBsYXRlci4odW5kZWxlZ2F0ZQQBFGNsYXNzbQEBNENsYXNzT2Y8VCwgST4AAjhNAVVuZGVsZWdhdGUgdGhlIHZvdGluZyBwb3dlciBvZiB0aGUgc2VuZGluZyBhY2NvdW50IGZvciBhIHBhcnRpY3VsYXIgY2xhc3Mgb2YgcG9sbHMuAF0BVG9rZW5zIG1heSBiZSB1bmxvY2tlZCBmb2xsb3dpbmcgb25jZSBhbiBhbW91bnQgb2YgdGltZSBjb25zaXN0ZW50IHdpdGggdGhlIGxvY2sgcGVyaW9kCQFvZiB0aGUgY29udmljdGlvbiB3aXRoIHdoaWNoIHRoZSBkZWxlZ2F0aW9uIHdhcyBpc3N1ZWQgaGFzIHBhc3NlZC4ARQFUaGUgZGlzcGF0Y2ggb3JpZ2luIG9mIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfIGFuZCB0aGUgc2lnbmluZyBhY2NvdW50IG11c3QgYmVUY3VycmVudGx5IGRlbGVnYXRpbmcuAPAtIGBjbGFzc2A6IFRoZSBjbGFzcyBvZiBwb2xscyB0byByZW1vdmUgdGhlIGRlbGVnYXRpb24gZnJvbS4AUEVtaXRzIGBVbmRlbGVnYXRlZGAuACUBV2VpZ2h0OiBgTyhSKWAgd2hlcmUgUiBpcyB0aGUgbnVtYmVyIG9mIHBvbGxzIHRoZSB2b3RlciBkZWxlZ2F0aW5nIHRvIGhhc00BICB2b3RlZCBvbi4gV2VpZ2h0IGlzIGluaXRpYWxseSBjaGFyZ2VkIGFzIGlmIG1heGltdW0gdm90ZXMsIGJ1dCBpcyByZWZ1bmRlZCBsYXRlci4YdW5sb2NrCAEUY2xhc3NtAQE0Q2xhc3NPZjxULCBJPgABGHRhcmdldMUBAVBBY2NvdW50SWRMb29rdXBPZjxUPgADJF0BUmVtb3ZlIHRoZSBsb2NrIGNhdXNlZCBieSBwcmlvciB2b3RpbmcvZGVsZWdhdGluZyB3aGljaCBoYXMgZXhwaXJlZCB3aXRoaW4gYSBwYXJ0aWN1bGFyGGNsYXNzLgDIVGhlIGRpc3BhdGNoIG9yaWdpbiBvZiB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXy4AoC0gYGNsYXNzYDogVGhlIGNsYXNzIG9mIHBvbGxzIHRvIHVubG9jay64LSBgdGFyZ2V0YDogVGhlIGFjY291bnQgdG8gcmVtb3ZlIHRoZSBsb2NrIG9uLgC8V2VpZ2h0OiBgTyhSKWAgd2l0aCBSIG51bWJlciBvZiB2b3RlIG9mIHRhcmdldC4scmVtb3ZlX3ZvdGUIARRjbGFzc3UCAVRPcHRpb248Q2xhc3NPZjxULCBJPj4AARRpbmRleBABRFBvbGxJbmRleE9mPFQsIEk+AAR0ZFJlbW92ZSBhIHZvdGUgZm9yIGEgcG9sbC4ADElmOnAtIHRoZSBwb2xsIHdhcyBjYW5jZWxsZWQsIG9yZC0gdGhlIHBvbGwgaXMgb25nb2luZywgb3J4LSB0aGUgcG9sbCBoYXMgZW5kZWQgc3VjaCB0aGF0/CAgLSB0aGUgdm90ZSBvZiB0aGUgYWNjb3VudCB3YXMgaW4gb3Bwb3NpdGlvbiB0byB0aGUgcmVzdWx0OyBvctQgIC0gdGhlcmUgd2FzIG5vIGNvbnZpY3Rpb24gdG8gdGhlIGFjY291bnQncyB2b3RlOyBvcoQgIC0gdGhlIGFjY291bnQgbWFkZSBhIHNwbGl0IHZvdGVdAS4uLnRoZW4gdGhlIHZvdGUgaXMgcmVtb3ZlZCBjbGVhbmx5IGFuZCBhIGZvbGxvd2luZyBjYWxsIHRvIGB1bmxvY2tgIG1heSByZXN1bHQgaW4gbW9yZVhmdW5kcyBiZWluZyBhdmFpbGFibGUuAJBJZiwgaG93ZXZlciwgdGhlIHBvbGwgaGFzIGVuZGVkIGFuZDrsLSBpdCBmaW5pc2hlZCBjb3JyZXNwb25kaW5nIHRvIHRoZSB2b3RlIG9mIHRoZSBhY2NvdW50LCBhbmTcLSB0aGUgYWNjb3VudCBtYWRlIGEgc3RhbmRhcmQgdm90ZSB3aXRoIGNvbnZpY3Rpb24sIGFuZLwtIHRoZSBsb2NrIHBlcmlvZCBvZiB0aGUgY29udmljdGlvbiBpcyBub3Qgb3ZlclkBLi4udGhlbiB0aGUgbG9jayB3aWxsIGJlIGFnZ3JlZ2F0ZWQgaW50byB0aGUgb3ZlcmFsbCBhY2NvdW50J3MgbG9jaywgd2hpY2ggbWF5IGludm9sdmVZASpvdmVybG9ja2luZyogKHdoZXJlIHRoZSB0d28gbG9ja3MgYXJlIGNvbWJpbmVkIGludG8gYSBzaW5nbGUgbG9jayB0aGF0IGlzIHRoZSBtYXhpbXVt5G9mIGJvdGggdGhlIGFtb3VudCBsb2NrZWQgYW5kIHRoZSB0aW1lIGlzIGl0IGxvY2tlZCBmb3IpLgBJAVRoZSBkaXNwYXRjaCBvcmlnaW4gb2YgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8sIGFuZCB0aGUgc2lnbmVyIG11c3QgaGF2ZSBhIHZvdGVwcmVnaXN0ZXJlZCBmb3IgcG9sbCBgaW5kZXhgLgDcLSBgaW5kZXhgOiBUaGUgaW5kZXggb2YgcG9sbCBvZiB0aGUgdm90ZSB0byBiZSByZW1vdmVkLlUBLSBgY2xhc3NgOiBPcHRpb25hbCBwYXJhbWV0ZXIsIGlmIGdpdmVuIGl0IGluZGljYXRlcyB0aGUgY2xhc3Mgb2YgdGhlIHBvbGwuIEZvciBwb2xsc/AgIHdoaWNoIGhhdmUgZmluaXNoZWQgb3IgYXJlIGNhbmNlbGxlZCwgdGhpcyBtdXN0IGJlIGBTb21lYC4ARQFXZWlnaHQ6IGBPKFIgKyBsb2cgUilgIHdoZXJlIFIgaXMgdGhlIG51bWJlciBvZiBwb2xscyB0aGF0IGB0YXJnZXRgIGhhcyB2b3RlZCBvbi7YICBXZWlnaHQgaXMgY2FsY3VsYXRlZCBmb3IgdGhlIG1heGltdW0gbnVtYmVyIG9mIHZvdGUuRHJlbW92ZV9vdGhlcl92b3RlDAEYdGFyZ2V0xQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEUY2xhc3NtAQE0Q2xhc3NPZjxULCBJPgABFGluZGV4EAFEUG9sbEluZGV4T2Y8VCwgST4ABUBkUmVtb3ZlIGEgdm90ZSBmb3IgYSBwb2xsLgBNAUlmIHRoZSBgdGFyZ2V0YCBpcyBlcXVhbCB0byB0aGUgc2lnbmVyLCB0aGVuIHRoaXMgZnVuY3Rpb24gaXMgZXhhY3RseSBlcXVpdmFsZW50IHRvLQFgcmVtb3ZlX3ZvdGVgLiBJZiBub3QgZXF1YWwgdG8gdGhlIHNpZ25lciwgdGhlbiB0aGUgdm90ZSBtdXN0IGhhdmUgZXhwaXJlZCwlAWVpdGhlciBiZWNhdXNlIHRoZSBwb2xsIHdhcyBjYW5jZWxsZWQsIGJlY2F1c2UgdGhlIHZvdGVyIGxvc3QgdGhlIHBvbGwgb3KYYmVjYXVzZSB0aGUgY29udmljdGlvbiBwZXJpb2QgaXMgb3Zlci4AyFRoZSBkaXNwYXRjaCBvcmlnaW4gb2YgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uAGEBLSBgdGFyZ2V0YDogVGhlIGFjY291bnQgb2YgdGhlIHZvdGUgdG8gYmUgcmVtb3ZlZDsgdGhpcyBhY2NvdW50IG11c3QgaGF2ZSB2b3RlZCBmb3IgcG9sbCggIGBpbmRleGAu3C0gYGluZGV4YDogVGhlIGluZGV4IG9mIHBvbGwgb2YgdGhlIHZvdGUgdG8gYmUgcmVtb3ZlZC6ELSBgY2xhc3NgOiBUaGUgY2xhc3Mgb2YgdGhlIHBvbGwuAEUBV2VpZ2h0OiBgTyhSICsgbG9nIFIpYCB3aGVyZSBSIGlzIHRoZSBudW1iZXIgb2YgcG9sbHMgdGhhdCBgdGFyZ2V0YCBoYXMgdm90ZWQgb24u2CAgV2VpZ2h0IGlzIGNhbGN1bGF0ZWQgZm9yIHRoZSBtYXhpbXVtIG51bWJlciBvZiB2b3RlLgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy5pAgxgcGFsbGV0X2NvbnZpY3Rpb25fdm90aW5nEHZvdGUsQWNjb3VudFZvdGUEHEJhbGFuY2UBGAEMIFN0YW5kYXJkCAEQdm90ZW0CARBWb3RlAAEcYmFsYW5jZRgBHEJhbGFuY2UAAAAUU3BsaXQIAQxheWUYARxCYWxhbmNlAAEMbmF5GAEcQmFsYW5jZQABADBTcGxpdEFic3RhaW4MAQxheWUYARxCYWxhbmNlAAEMbmF5GAEcQmFsYW5jZQABHGFic3RhaW4YARxCYWxhbmNlAAIAAG0CDGBwYWxsZXRfY29udmljdGlvbl92b3RpbmcQdm90ZRBWb3RlAAAEAAgAAABxAgxgcGFsbGV0X2NvbnZpY3Rpb25fdm90aW5nKGNvbnZpY3Rpb24oQ29udmljdGlvbgABHBBOb25lAAAAIExvY2tlZDF4AAEAIExvY2tlZDJ4AAIAIExvY2tlZDN4AAMAIExvY2tlZDR4AAQAIExvY2tlZDV4AAUAIExvY2tlZDZ4AAYAAHUCBBhPcHRpb24EBFQBbQEBCBBOb25lAAAAEFNvbWUEAG0BAAABAAB5AgxAcGFsbGV0X3JlZmVyZW5kYRhwYWxsZXQQQ2FsbAgEVAAESQABJBhzdWJtaXQMATxwcm9wb3NhbF9vcmlnaW59AgFcQm94PFBhbGxldHNPcmlnaW5PZjxUPj4AASBwcm9wb3NhbHEBAUxCb3VuZGVkQ2FsbE9mPFQsIEk+AAFAZW5hY3RtZW50X21vbWVudJkCAXxEaXNwYXRjaFRpbWU8QmxvY2tOdW1iZXJGb3I8VD4+AAAksFByb3Bvc2UgYSByZWZlcmVuZHVtIG9uIGEgcHJpdmlsZWdlZCBhY3Rpb24uAFkBLSBgb3JpZ2luYDogbXVzdCBiZSBgU3VibWl0T3JpZ2luYCBhbmQgdGhlIGFjY291bnQgbXVzdCBoYXZlIGBTdWJtaXNzaW9uRGVwb3NpdGAgZnVuZHMwICBhdmFpbGFibGUuLQEtIGBwcm9wb3NhbF9vcmlnaW5gOiBUaGUgb3JpZ2luIGZyb20gd2hpY2ggdGhlIHByb3Bvc2FsIHNob3VsZCBiZSBleGVjdXRlZC5sLSBgcHJvcG9zYWxgOiBUaGUgcHJvcG9zYWwuFQEtIGBlbmFjdG1lbnRfbW9tZW50YDogVGhlIG1vbWVudCB0aGF0IHRoZSBwcm9wb3NhbCBzaG91bGQgYmUgZW5hY3RlZC4ASEVtaXRzIGBTdWJtaXR0ZWRgLlhwbGFjZV9kZWNpc2lvbl9kZXBvc2l0BAEUaW5kZXgQATxSZWZlcmVuZHVtSW5kZXgAASCsUG9zdCB0aGUgRGVjaXNpb24gRGVwb3NpdCBmb3IgYSByZWZlcmVuZHVtLgA5AS0gYG9yaWdpbmA6IG11c3QgYmUgYFNpZ25lZGAgYW5kIHRoZSBhY2NvdW50IG11c3QgaGF2ZSBmdW5kcyBhdmFpbGFibGUgZm9yIHRoZaAgIHJlZmVyZW5kdW0ncyB0cmFjaydzIERlY2lzaW9uIERlcG9zaXQuUQEtIGBpbmRleGA6IFRoZSBpbmRleCBvZiB0aGUgc3VibWl0dGVkIHJlZmVyZW5kdW0gd2hvc2UgRGVjaXNpb24gRGVwb3NpdCBpcyB5ZXQgdG8gYmUkICBwb3N0ZWQuAHhFbWl0cyBgRGVjaXNpb25EZXBvc2l0UGxhY2VkYC5ccmVmdW5kX2RlY2lzaW9uX2RlcG9zaXQEARRpbmRleBABPFJlZmVyZW5kdW1JbmRleAACHCkBUmVmdW5kIHRoZSBEZWNpc2lvbiBEZXBvc2l0IGZvciBhIGNsb3NlZCByZWZlcmVuZHVtIGJhY2sgdG8gdGhlIGRlcG9zaXRvci4AnC0gYG9yaWdpbmA6IG11c3QgYmUgYFNpZ25lZGAgb3IgYFJvb3RgLk0BLSBgaW5kZXhgOiBUaGUgaW5kZXggb2YgYSBjbG9zZWQgcmVmZXJlbmR1bSB3aG9zZSBEZWNpc2lvbiBEZXBvc2l0IGhhcyBub3QgeWV0IGJlZW4sICByZWZ1bmRlZC4AgEVtaXRzIGBEZWNpc2lvbkRlcG9zaXRSZWZ1bmRlZGAuGGNhbmNlbAQBFGluZGV4EAE8UmVmZXJlbmR1bUluZGV4AAMYdENhbmNlbCBhbiBvbmdvaW5nIHJlZmVyZW5kdW0uAJwtIGBvcmlnaW5gOiBtdXN0IGJlIHRoZSBgQ2FuY2VsT3JpZ2luYC7cLSBgaW5kZXhgOiBUaGUgaW5kZXggb2YgdGhlIHJlZmVyZW5kdW0gdG8gYmUgY2FuY2VsbGVkLgBIRW1pdHMgYENhbmNlbGxlZGAuEGtpbGwEARRpbmRleBABPFJlZmVyZW5kdW1JbmRleAAEGNBDYW5jZWwgYW4gb25nb2luZyByZWZlcmVuZHVtIGFuZCBzbGFzaCB0aGUgZGVwb3NpdHMuAJQtIGBvcmlnaW5gOiBtdXN0IGJlIHRoZSBgS2lsbE9yaWdpbmAu3C0gYGluZGV4YDogVGhlIGluZGV4IG9mIHRoZSByZWZlcmVuZHVtIHRvIGJlIGNhbmNlbGxlZC4AkEVtaXRzIGBLaWxsZWRgIGFuZCBgRGVwb3NpdFNsYXNoZWRgLkBudWRnZV9yZWZlcmVuZHVtBAEUaW5kZXgQATxSZWZlcmVuZHVtSW5kZXgABRAdAUFkdmFuY2UgYSByZWZlcmVuZHVtIG9udG8gaXRzIG5leHQgbG9naWNhbCBzdGF0ZS4gT25seSB1c2VkIGludGVybmFsbHkuAGwtIGBvcmlnaW5gOiBtdXN0IGJlIGBSb290YC6kLSBgaW5kZXhgOiB0aGUgcmVmZXJlbmR1bSB0byBiZSBhZHZhbmNlZC5Ib25lX2Zld2VyX2RlY2lkaW5nBAEUdHJhY2ttAQE8VHJhY2tJZE9mPFQsIEk+AAYkCQFBZHZhbmNlIGEgdHJhY2sgb250byBpdHMgbmV4dCBsb2dpY2FsIHN0YXRlLiBPbmx5IHVzZWQgaW50ZXJuYWxseS4AbC0gYG9yaWdpbmA6IG11c3QgYmUgYFJvb3RgLpAtIGB0cmFja2A6IHRoZSB0cmFjayB0byBiZSBhZHZhbmNlZC4AUQFBY3Rpb24gaXRlbSBmb3Igd2hlbiB0aGVyZSBpcyBub3cgb25lIGZld2VyIHJlZmVyZW5kdW0gaW4gdGhlIGRlY2lkaW5nIHBoYXNlIGFuZCB0aGUVAWBEZWNpZGluZ0NvdW50YCBpcyBub3QgeWV0IHVwZGF0ZWQuIFRoaXMgbWVhbnMgdGhhdCB3ZSBzaG91bGQgZWl0aGVyOiUBLSBiZWdpbiBkZWNpZGluZyBhbm90aGVyIHJlZmVyZW5kdW0gKGFuZCBsZWF2ZSBgRGVjaWRpbmdDb3VudGAgYWxvbmUpOyBvcnAtIGRlY3JlbWVudCBgRGVjaWRpbmdDb3VudGAuZHJlZnVuZF9zdWJtaXNzaW9uX2RlcG9zaXQEARRpbmRleBABPFJlZmVyZW5kdW1JbmRleAAHHDEBUmVmdW5kIHRoZSBTdWJtaXNzaW9uIERlcG9zaXQgZm9yIGEgY2xvc2VkIHJlZmVyZW5kdW0gYmFjayB0byB0aGUgZGVwb3NpdG9yLgCcLSBgb3JpZ2luYDogbXVzdCBiZSBgU2lnbmVkYCBvciBgUm9vdGAuVQEtIGBpbmRleGA6IFRoZSBpbmRleCBvZiBhIGNsb3NlZCByZWZlcmVuZHVtIHdob3NlIFN1Ym1pc3Npb24gRGVwb3NpdCBoYXMgbm90IHlldCBiZWVuLCAgcmVmdW5kZWQuAIhFbWl0cyBgU3VibWlzc2lvbkRlcG9zaXRSZWZ1bmRlZGAuMHNldF9tZXRhZGF0YQgBFGluZGV4EAE8UmVmZXJlbmR1bUluZGV4AAEobWF5YmVfaGFzaJ0CATxPcHRpb248VDo6SGFzaD4ACByYU2V0IG9yIGNsZWFyIG1ldGFkYXRhIG9mIGEgcmVmZXJlbmR1bS4ALFBhcmFtZXRlcnM6RQEtIGBvcmlnaW5gOiBNdXN0IGJlIGBTaWduZWRgIGJ5IGEgY3JlYXRvciBvZiBhIHJlZmVyZW5kdW0gb3IgYnkgYW55b25lIHRvIGNsZWFyIGGQICBtZXRhZGF0YSBvZiBhIGZpbmlzaGVkIHJlZmVyZW5kdW0uDQEtIGBpbmRleGA6ICBUaGUgaW5kZXggb2YgYSByZWZlcmVuZHVtIHRvIHNldCBvciBjbGVhciBtZXRhZGF0YSBmb3IuUQEtIGBtYXliZV9oYXNoYDogVGhlIGhhc2ggb2YgYW4gb24tY2hhaW4gc3RvcmVkIHByZWltYWdlLiBgTm9uZWAgdG8gY2xlYXIgYSBtZXRhZGF0YS4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMufQIIQHBvbGthZG90X3J1bnRpbWUwT3JpZ2luQ2FsbGVyAAEUGHN5c3RlbQQAgQIBdGZyYW1lX3N5c3RlbTo6T3JpZ2luPFJ1bnRpbWU+AAAAHE9yaWdpbnMEAIUCAXRwYWxsZXRfY3VzdG9tX29yaWdpbnM6Ok9yaWdpbgAWAEBQYXJhY2hhaW5zT3JpZ2luBACJAgFkcGFyYWNoYWluc19vcmlnaW46Ok9yaWdpbgAyACRYY21QYWxsZXQEAJECAUhwYWxsZXRfeGNtOjpPcmlnaW4AYwAQVm9pZAQAlQIBQQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6Cl9fcHJpdmF0ZTo6Vm9pZAAEAACBAgw0ZnJhbWVfc3VwcG9ydCBkaXNwYXRjaCRSYXdPcmlnaW4EJEFjY291bnRJZAEAAQwQUm9vdAAAABhTaWduZWQEAAABJEFjY291bnRJZAABABBOb25lAAIAAIUCFEBwb2xrYWRvdF9ydW50aW1lKGdvdmVybmFuY2Ucb3JpZ2luc1RwYWxsZXRfY3VzdG9tX29yaWdpbnMYT3JpZ2luAAE8MFN0YWtpbmdBZG1pbgAAACRUcmVhc3VyZXIAAQA8RmVsbG93c2hpcEFkbWluAAIAMEdlbmVyYWxBZG1pbgADADBBdWN0aW9uQWRtaW4ABAAoTGVhc2VBZG1pbgAFAExSZWZlcmVuZHVtQ2FuY2VsbGVyAAYAQFJlZmVyZW5kdW1LaWxsZXIABwAsU21hbGxUaXBwZXIACAAkQmlnVGlwcGVyAAkAMFNtYWxsU3BlbmRlcgAKADRNZWRpdW1TcGVuZGVyAAsAKEJpZ1NwZW5kZXIADABEV2hpdGVsaXN0ZWRDYWxsZXIADQA0V2lzaEZvckNoYW5nZQAOAACJAhBscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zGG9yaWdpbhhwYWxsZXQYT3JpZ2luAAEEJFBhcmFjaGFpbgQAjQIBGFBhcmFJZAAAAACNAgx0cG9sa2Fkb3RfcGFyYWNoYWluX3ByaW1pdGl2ZXMocHJpbWl0aXZlcwhJZAAABAAQAQx1MzIAAJECDChwYWxsZXRfeGNtGHBhbGxldBhPcmlnaW4AAQgMWGNtBAANAQEgTG9jYXRpb24AAAAgUmVzcG9uc2UEAA0BASBMb2NhdGlvbgABAACVAggcc3BfY29yZRBWb2lkAAEAAJkCEDRmcmFtZV9zdXBwb3J0GHRyYWl0cyBzY2hlZHVsZTBEaXNwYXRjaFRpbWUELEJsb2NrTnVtYmVyARABCAhBdAQAEAEsQmxvY2tOdW1iZXIAAAAUQWZ0ZXIEABABLEJsb2NrTnVtYmVyAAEAAJ0CBBhPcHRpb24EBFQBNAEIEE5vbmUAAAAQU29tZQQANAAAAQAAoQIMQHBhbGxldF93aGl0ZWxpc3QYcGFsbGV0EENhbGwEBFQAARA4d2hpdGVsaXN0X2NhbGwEASRjYWxsX2hhc2g0ARxUOjpIYXNoAAAAXHJlbW92ZV93aGl0ZWxpc3RlZF9jYWxsBAEkY2FsbF9oYXNoNAEcVDo6SGFzaAABAGRkaXNwYXRjaF93aGl0ZWxpc3RlZF9jYWxsDAEkY2FsbF9oYXNoNAEcVDo6SGFzaAABQGNhbGxfZW5jb2RlZF9sZW4QAQx1MzIAAUxjYWxsX3dlaWdodF93aXRuZXNzKAEYV2VpZ2h0AAIAnGRpc3BhdGNoX3doaXRlbGlzdGVkX2NhbGxfd2l0aF9wcmVpbWFnZQQBEGNhbGx1AQF8Qm94PDxUIGFzIENvbmZpZz46OlJ1bnRpbWVDYWxsPgADAAQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy6lAgxEcGFsbGV0X3BhcmFtZXRlcnMYcGFsbGV0EENhbGwEBFQAAQQ0c2V0X3BhcmFtZXRlcgQBJGtleV92YWx1ZakCAVBUOjpSdW50aW1lUGFyYW1ldGVycwAAEHRTZXQgdGhlIHZhbHVlIG9mIGEgcGFyYW1ldGVyLgBVAVRoZSBkaXNwYXRjaCBvcmlnaW4gb2YgdGhpcyBjYWxsIG11c3QgYmUgYEFkbWluT3JpZ2luYCBmb3IgdGhlIGdpdmVuIGBrZXlgLiBWYWx1ZXMgYmWIZGVsZXRlZCBieSBzZXR0aW5nIHRoZW0gdG8gYE5vbmVgLgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy6pAghAcG9sa2Fkb3RfcnVudGltZURSdW50aW1lUGFyYW1ldGVycwABBCRJbmZsYXRpb24EAK0CAZRkeW5hbWljX3BhcmFtczo6aW5mbGF0aW9uOjpQYXJhbWV0ZXJzAAAAAK0CEEBwb2xrYWRvdF9ydW50aW1lOGR5bmFtaWNfcGFyYW1zJGluZmxhdGlvbihQYXJhbWV0ZXJzAAEUME1pbkluZmxhdGlvbggAsQIBME1pbkluZmxhdGlvbgAAtQIBTE9wdGlvbjxQZXJxdWludGlsbD4AAAAwTWF4SW5mbGF0aW9uCAC9AgEwTWF4SW5mbGF0aW9uAAC1AgFMT3B0aW9uPFBlcnF1aW50aWxsPgABAChJZGVhbFN0YWtlCADBAgEoSWRlYWxTdGFrZQAAtQIBTE9wdGlvbjxQZXJxdWludGlsbD4AAgAcRmFsbG9mZggAxQIBHEZhbGxvZmYAALUCAUxPcHRpb248UGVycXVpbnRpbGw+AAMAPFVzZUF1Y3Rpb25TbG90cwgAyQIBPFVzZUF1Y3Rpb25TbG90cwAAzQIBME9wdGlvbjxib29sPgAEAACxAhBAcG9sa2Fkb3RfcnVudGltZThkeW5hbWljX3BhcmFtcyRpbmZsYXRpb24wTWluSW5mbGF0aW9uAAAAALUCBBhPcHRpb24EBFQBuQIBCBBOb25lAAAAEFNvbWUEALkCAAABAAC5Agw0c3BfYXJpdGhtZXRpYyhwZXJfdGhpbmdzLFBlcnF1aW50aWxsAAAEADABDHU2NAAAvQIQQHBvbGthZG90X3J1bnRpbWU4ZHluYW1pY19wYXJhbXMkaW5mbGF0aW9uME1heEluZmxhdGlvbgAAAADBAhBAcG9sa2Fkb3RfcnVudGltZThkeW5hbWljX3BhcmFtcyRpbmZsYXRpb24oSWRlYWxTdGFrZQAAAADFAhBAcG9sa2Fkb3RfcnVudGltZThkeW5hbWljX3BhcmFtcyRpbmZsYXRpb24cRmFsbG9mZgAAAADJAhBAcG9sa2Fkb3RfcnVudGltZThkeW5hbWljX3BhcmFtcyRpbmZsYXRpb248VXNlQXVjdGlvblNsb3RzAAAAAM0CBBhPcHRpb24EBFQBIAEIEE5vbmUAAAAQU29tZQQAIAAAAQAA0QIQXHBvbGthZG90X3J1bnRpbWVfY29tbW9uGGNsYWltcxhwYWxsZXQQQ2FsbAQEVAABFBRjbGFpbQgBEGRlc3QAATBUOjpBY2NvdW50SWQAAUhldGhlcmV1bV9zaWduYXR1cmXVAgE4RWNkc2FTaWduYXR1cmUAAGCITWFrZSBhIGNsYWltIHRvIGNvbGxlY3QgeW91ciBET1RzLgDEVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX05vbmVfLgBQVW5zaWduZWQgVmFsaWRhdGlvbjoFAUEgY2FsbCB0byBjbGFpbSBpcyBkZWVtZWQgdmFsaWQgaWYgdGhlIHNpZ25hdHVyZSBwcm92aWRlZCBtYXRjaGVzfHRoZSBleHBlY3RlZCBzaWduZWQgbWVzc2FnZSBvZjoAaD4gRXRoZXJldW0gU2lnbmVkIE1lc3NhZ2U6lD4gKGNvbmZpZ3VyZWQgcHJlZml4IHN0cmluZykoYWRkcmVzcykApGFuZCBgYWRkcmVzc2AgbWF0Y2hlcyB0aGUgYGRlc3RgIGFjY291bnQuACxQYXJhbWV0ZXJzOtgtIGBkZXN0YDogVGhlIGRlc3RpbmF0aW9uIGFjY291bnQgdG8gcGF5b3V0IHRoZSBjbGFpbS5dAS0gYGV0aGVyZXVtX3NpZ25hdHVyZWA6IFRoZSBzaWduYXR1cmUgb2YgYW4gZXRoZXJldW0gc2lnbmVkIG1lc3NhZ2UgbWF0Y2hpbmcgdGhlIGZvcm1hdEggIGRlc2NyaWJlZCBhYm92ZS4AIDx3ZWlnaHQ+/FRoZSB3ZWlnaHQgb2YgdGhpcyBjYWxsIGlzIGludmFyaWFudCBvdmVyIHRoZSBpbnB1dCBwYXJhbWV0ZXJzLuBXZWlnaHQgaW5jbHVkZXMgbG9naWMgdG8gdmFsaWRhdGUgdW5zaWduZWQgYGNsYWltYCBjYWxsLgBYVG90YWwgQ29tcGxleGl0eTogTygxKSQ8L3dlaWdodD4obWludF9jbGFpbRABDHdob90CATxFdGhlcmV1bUFkZHJlc3MAARR2YWx1ZRgBMEJhbGFuY2VPZjxUPgABQHZlc3Rpbmdfc2NoZWR1bGXhAgHcT3B0aW9uPChCYWxhbmNlT2Y8VD4sIEJhbGFuY2VPZjxUPiwgQmxvY2tOdW1iZXJGb3I8VD4pPgABJHN0YXRlbWVudOkCAVRPcHRpb248U3RhdGVtZW50S2luZD4AATyETWludCBhIG5ldyBjbGFpbSB0byBjb2xsZWN0IERPVHMuAMRUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfUm9vdF8uACxQYXJhbWV0ZXJzOvAtIGB3aG9gOiBUaGUgRXRoZXJldW0gYWRkcmVzcyBhbGxvd2VkIHRvIGNvbGxlY3QgdGhpcyBjbGFpbS7MLSBgdmFsdWVgOiBUaGUgbnVtYmVyIG9mIERPVHMgdGhhdCB3aWxsIGJlIGNsYWltZWQuCQEtIGB2ZXN0aW5nX3NjaGVkdWxlYDogQW4gb3B0aW9uYWwgdmVzdGluZyBzY2hlZHVsZSBmb3IgdGhlc2UgRE9Ucy4AIDx3ZWlnaHQ+/FRoZSB3ZWlnaHQgb2YgdGhpcyBjYWxsIGlzIGludmFyaWFudCBvdmVyIHRoZSBpbnB1dCBwYXJhbWV0ZXJzLh0BV2UgYXNzdW1lIHdvcnN0IGNhc2UgdGhhdCBib3RoIHZlc3RpbmcgYW5kIHN0YXRlbWVudCBpcyBiZWluZyBpbnNlcnRlZC4AWFRvdGFsIENvbXBsZXhpdHk6IE8oMSkkPC93ZWlnaHQ+MGNsYWltX2F0dGVzdAwBEGRlc3QAATBUOjpBY2NvdW50SWQAAUhldGhlcmV1bV9zaWduYXR1cmXVAgE4RWNkc2FTaWduYXR1cmUAASRzdGF0ZW1lbnQ4ARxWZWM8dTg+AAJs5E1ha2UgYSBjbGFpbSB0byBjb2xsZWN0IHlvdXIgRE9UcyBieSBzaWduaW5nIGEgc3RhdGVtZW50LgDEVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX05vbmVfLgBQVW5zaWduZWQgVmFsaWRhdGlvbjopAUEgY2FsbCB0byBgY2xhaW1fYXR0ZXN0YCBpcyBkZWVtZWQgdmFsaWQgaWYgdGhlIHNpZ25hdHVyZSBwcm92aWRlZCBtYXRjaGVzfHRoZSBleHBlY3RlZCBzaWduZWQgbWVzc2FnZSBvZjoAaD4gRXRoZXJldW0gU2lnbmVkIE1lc3NhZ2U6wD4gKGNvbmZpZ3VyZWQgcHJlZml4IHN0cmluZykoYWRkcmVzcykoc3RhdGVtZW50KQBJAWFuZCBgYWRkcmVzc2AgbWF0Y2hlcyB0aGUgYGRlc3RgIGFjY291bnQ7IHRoZSBgc3RhdGVtZW50YCBtdXN0IG1hdGNoIHRoYXQgd2hpY2ggaXPAZXhwZWN0ZWQgYWNjb3JkaW5nIHRvIHlvdXIgcHVyY2hhc2UgYXJyYW5nZW1lbnQuACxQYXJhbWV0ZXJzOtgtIGBkZXN0YDogVGhlIGRlc3RpbmF0aW9uIGFjY291bnQgdG8gcGF5b3V0IHRoZSBjbGFpbS5dAS0gYGV0aGVyZXVtX3NpZ25hdHVyZWA6IFRoZSBzaWduYXR1cmUgb2YgYW4gZXRoZXJldW0gc2lnbmVkIG1lc3NhZ2UgbWF0Y2hpbmcgdGhlIGZvcm1hdEggIGRlc2NyaWJlZCBhYm92ZS45AS0gYHN0YXRlbWVudGA6IFRoZSBpZGVudGl0eSBvZiB0aGUgc3RhdGVtZW50IHdoaWNoIGlzIGJlaW5nIGF0dGVzdGVkIHRvIGluIHRoZTAgIHNpZ25hdHVyZS4AIDx3ZWlnaHQ+/FRoZSB3ZWlnaHQgb2YgdGhpcyBjYWxsIGlzIGludmFyaWFudCBvdmVyIHRoZSBpbnB1dCBwYXJhbWV0ZXJzLvxXZWlnaHQgaW5jbHVkZXMgbG9naWMgdG8gdmFsaWRhdGUgdW5zaWduZWQgYGNsYWltX2F0dGVzdGAgY2FsbC4AWFRvdGFsIENvbXBsZXhpdHk6IE8oMSkkPC93ZWlnaHQ+GGF0dGVzdAQBJHN0YXRlbWVudDgBHFZlYzx1OD4AA0z0QXR0ZXN0IHRvIGEgc3RhdGVtZW50LCBuZWVkZWQgdG8gZmluYWxpemUgdGhlIGNsYWltcyBwcm9jZXNzLgAZAVdBUk5JTkc6IEluc2VjdXJlIHVubGVzcyB5b3VyIGNoYWluIGluY2x1ZGVzIGBQcmV2YWxpZGF0ZUF0dGVzdHNgIGFzIGFIYFNpZ25lZEV4dGVuc2lvbmAuAFBVbnNpZ25lZCBWYWxpZGF0aW9uOikBQSBjYWxsIHRvIGF0dGVzdCBpcyBkZWVtZWQgdmFsaWQgaWYgdGhlIHNlbmRlciBoYXMgYSBgUHJlY2xhaW1gIHJlZ2lzdGVyZWT0YW5kIHByb3ZpZGVzIGEgYHN0YXRlbWVudGAgd2hpY2ggaXMgZXhwZWN0ZWQgZm9yIHRoZSBhY2NvdW50LgAsUGFyYW1ldGVyczo5AS0gYHN0YXRlbWVudGA6IFRoZSBpZGVudGl0eSBvZiB0aGUgc3RhdGVtZW50IHdoaWNoIGlzIGJlaW5nIGF0dGVzdGVkIHRvIGluIHRoZTAgIHNpZ25hdHVyZS4AIDx3ZWlnaHQ+/FRoZSB3ZWlnaHQgb2YgdGhpcyBjYWxsIGlzIGludmFyaWFudCBvdmVyIHRoZSBpbnB1dCBwYXJhbWV0ZXJzLvBXZWlnaHQgaW5jbHVkZXMgbG9naWMgdG8gZG8gcHJlLXZhbGlkYXRpb24gb24gYGF0dGVzdGAgY2FsbC4AWFRvdGFsIENvbXBsZXhpdHk6IE8oMSkkPC93ZWlnaHQ+KG1vdmVfY2xhaW0MAQxvbGTdAgE8RXRoZXJldW1BZGRyZXNzAAEMbmV33QIBPEV0aGVyZXVtQWRkcmVzcwABOG1heWJlX3ByZWNsYWlt/QEBUE9wdGlvbjxUOjpBY2NvdW50SWQ+AAQABA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLtUCDFxwb2xrYWRvdF9ydW50aW1lX2NvbW1vbhhjbGFpbXM4RWNkc2FTaWduYXR1cmUAAAQA2QIBIFt1ODsgNjVdAADZAgAAA0EAAAAIAN0CDFxwb2xrYWRvdF9ydW50aW1lX2NvbW1vbhhjbGFpbXM8RXRoZXJldW1BZGRyZXNzAAAEAPgBIFt1ODsgMjBdAADhAgQYT3B0aW9uBARUAeUCAQgQTm9uZQAAABBTb21lBADlAgAAAQAA5QIAAAQMGBgQAOkCBBhPcHRpb24EBFQB7QIBCBBOb25lAAAAEFNvbWUEAO0CAAABAADtAgxccG9sa2Fkb3RfcnVudGltZV9jb21tb24YY2xhaW1zNFN0YXRlbWVudEtpbmQAAQgcUmVndWxhcgAAABBTYWZ0AAEAAPECDDhwYWxsZXRfdmVzdGluZxhwYWxsZXQQQ2FsbAQEVAABGBB2ZXN0AAAkuFVubG9jayBhbnkgdmVzdGVkIGZ1bmRzIG9mIHRoZSBzZW5kZXIgYWNjb3VudC4AXQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXyBhbmQgdGhlIHNlbmRlciBtdXN0IGhhdmUgZnVuZHMgc3RpbGxkbG9ja2VkIHVuZGVyIHRoaXMgcGFsbGV0LgDQRW1pdHMgZWl0aGVyIGBWZXN0aW5nQ29tcGxldGVkYCBvciBgVmVzdGluZ1VwZGF0ZWRgLgA0IyMgQ29tcGxleGl0eSQtIGBPKDEpYC4odmVzdF9vdGhlcgQBGHRhcmdldMUBAVBBY2NvdW50SWRMb29rdXBPZjxUPgABLLhVbmxvY2sgYW55IHZlc3RlZCBmdW5kcyBvZiBhIGB0YXJnZXRgIGFjY291bnQuAMxUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXy4AUQEtIGB0YXJnZXRgOiBUaGUgYWNjb3VudCB3aG9zZSB2ZXN0ZWQgZnVuZHMgc2hvdWxkIGJlIHVubG9ja2VkLiBNdXN0IGhhdmUgZnVuZHMgc3RpbGxkbG9ja2VkIHVuZGVyIHRoaXMgcGFsbGV0LgDQRW1pdHMgZWl0aGVyIGBWZXN0aW5nQ29tcGxldGVkYCBvciBgVmVzdGluZ1VwZGF0ZWRgLgA0IyMgQ29tcGxleGl0eSQtIGBPKDEpYC48dmVzdGVkX3RyYW5zZmVyCAEYdGFyZ2V0xQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEgc2NoZWR1bGX1AgGwVmVzdGluZ0luZm88QmFsYW5jZU9mPFQ+LCBCbG9ja051bWJlckZvcjxUPj4AAjRkQ3JlYXRlIGEgdmVzdGVkIHRyYW5zZmVyLgDMVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uAMwtIGB0YXJnZXRgOiBUaGUgYWNjb3VudCByZWNlaXZpbmcgdGhlIHZlc3RlZCBmdW5kcy7wLSBgc2NoZWR1bGVgOiBUaGUgdmVzdGluZyBzY2hlZHVsZSBhdHRhY2hlZCB0byB0aGUgdHJhbnNmZXIuAFxFbWl0cyBgVmVzdGluZ0NyZWF0ZWRgLgD8Tk9URTogVGhpcyB3aWxsIHVubG9jayBhbGwgc2NoZWR1bGVzIHRocm91Z2ggdGhlIGN1cnJlbnQgYmxvY2suADQjIyBDb21wbGV4aXR5JC0gYE8oMSlgLlRmb3JjZV92ZXN0ZWRfdHJhbnNmZXIMARhzb3VyY2XFAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AARh0YXJnZXTFAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AASBzY2hlZHVsZfUCAbBWZXN0aW5nSW5mbzxCYWxhbmNlT2Y8VD4sIEJsb2NrTnVtYmVyRm9yPFQ+PgADOGBGb3JjZSBhIHZlc3RlZCB0cmFuc2Zlci4AxFRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9Sb290Xy4A6C0gYHNvdXJjZWA6IFRoZSBhY2NvdW50IHdob3NlIGZ1bmRzIHNob3VsZCBiZSB0cmFuc2ZlcnJlZC4RAS0gYHRhcmdldGA6IFRoZSBhY2NvdW50IHRoYXQgc2hvdWxkIGJlIHRyYW5zZmVycmVkIHRoZSB2ZXN0ZWQgZnVuZHMu8C0gYHNjaGVkdWxlYDogVGhlIHZlc3Rpbmcgc2NoZWR1bGUgYXR0YWNoZWQgdG8gdGhlIHRyYW5zZmVyLgBcRW1pdHMgYFZlc3RpbmdDcmVhdGVkYC4A/E5PVEU6IFRoaXMgd2lsbCB1bmxvY2sgYWxsIHNjaGVkdWxlcyB0aHJvdWdoIHRoZSBjdXJyZW50IGJsb2NrLgA0IyMgQ29tcGxleGl0eSQtIGBPKDEpYC48bWVyZ2Vfc2NoZWR1bGVzCAE8c2NoZWR1bGUxX2luZGV4EAEMdTMyAAE8c2NoZWR1bGUyX2luZGV4EAEMdTMyAARUXQFNZXJnZSB0d28gdmVzdGluZyBzY2hlZHVsZXMgdG9nZXRoZXIsIGNyZWF0aW5nIGEgbmV3IHZlc3Rpbmcgc2NoZWR1bGUgdGhhdCB1bmxvY2tzIG92ZXJVAXRoZSBoaWdoZXN0IHBvc3NpYmxlIHN0YXJ0IGFuZCBlbmQgYmxvY2tzLiBJZiBib3RoIHNjaGVkdWxlcyBoYXZlIGFscmVhZHkgc3RhcnRlZCB0aGVZAWN1cnJlbnQgYmxvY2sgd2lsbCBiZSB1c2VkIGFzIHRoZSBzY2hlZHVsZSBzdGFydDsgd2l0aCB0aGUgY2F2ZWF0IHRoYXQgaWYgb25lIHNjaGVkdWxlXQFpcyBmaW5pc2hlZCBieSB0aGUgY3VycmVudCBibG9jaywgdGhlIG90aGVyIHdpbGwgYmUgdHJlYXRlZCBhcyB0aGUgbmV3IG1lcmdlZCBzY2hlZHVsZSwsdW5tb2RpZmllZC4A+E5PVEU6IElmIGBzY2hlZHVsZTFfaW5kZXggPT0gc2NoZWR1bGUyX2luZGV4YCB0aGlzIGlzIGEgbm8tb3AuQQFOT1RFOiBUaGlzIHdpbGwgdW5sb2NrIGFsbCBzY2hlZHVsZXMgdGhyb3VnaCB0aGUgY3VycmVudCBibG9jayBwcmlvciB0byBtZXJnaW5nLmEBTk9URTogSWYgYm90aCBzY2hlZHVsZXMgaGF2ZSBlbmRlZCBieSB0aGUgY3VycmVudCBibG9jaywgbm8gbmV3IHNjaGVkdWxlIHdpbGwgYmUgY3JlYXRlZGRhbmQgYm90aCB3aWxsIGJlIHJlbW92ZWQuAGxNZXJnZWQgc2NoZWR1bGUgYXR0cmlidXRlczo1AS0gYHN0YXJ0aW5nX2Jsb2NrYDogYE1BWChzY2hlZHVsZTEuc3RhcnRpbmdfYmxvY2ssIHNjaGVkdWxlZDIuc3RhcnRpbmdfYmxvY2ssSCAgY3VycmVudF9ibG9jaylgLiEBLSBgZW5kaW5nX2Jsb2NrYDogYE1BWChzY2hlZHVsZTEuZW5kaW5nX2Jsb2NrLCBzY2hlZHVsZTIuZW5kaW5nX2Jsb2NrKWAuWQEtIGBsb2NrZWRgOiBgc2NoZWR1bGUxLmxvY2tlZF9hdChjdXJyZW50X2Jsb2NrKSArIHNjaGVkdWxlMi5sb2NrZWRfYXQoY3VycmVudF9ibG9jaylgLgDMVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uAOgtIGBzY2hlZHVsZTFfaW5kZXhgOiBpbmRleCBvZiB0aGUgZmlyc3Qgc2NoZWR1bGUgdG8gbWVyZ2Uu7C0gYHNjaGVkdWxlMl9pbmRleGA6IGluZGV4IG9mIHRoZSBzZWNvbmQgc2NoZWR1bGUgdG8gbWVyZ2UudGZvcmNlX3JlbW92ZV92ZXN0aW5nX3NjaGVkdWxlCAEYdGFyZ2V0xQEBjDxUOjpMb29rdXAgYXMgU3RhdGljTG9va3VwPjo6U291cmNlAAE4c2NoZWR1bGVfaW5kZXgQAQx1MzIABRh8Rm9yY2UgcmVtb3ZlIGEgdmVzdGluZyBzY2hlZHVsZQDEVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1Jvb3RfLgDILSBgdGFyZ2V0YDogQW4gYWNjb3VudCB0aGF0IGhhcyBhIHZlc3Rpbmcgc2NoZWR1bGUVAS0gYHNjaGVkdWxlX2luZGV4YDogVGhlIHZlc3Rpbmcgc2NoZWR1bGUgaW5kZXggdGhhdCBzaG91bGQgYmUgcmVtb3ZlZAQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy71Agw4cGFsbGV0X3Zlc3RpbmcwdmVzdGluZ19pbmZvLFZlc3RpbmdJbmZvCBxCYWxhbmNlARgsQmxvY2tOdW1iZXIBEAAMARhsb2NrZWQYARxCYWxhbmNlAAEkcGVyX2Jsb2NrGAEcQmFsYW5jZQABOHN0YXJ0aW5nX2Jsb2NrEAEsQmxvY2tOdW1iZXIAAPkCDDhwYWxsZXRfdXRpbGl0eRhwYWxsZXQQQ2FsbAQEVAABGBRiYXRjaAQBFGNhbGxz/QIBfFZlYzw8VCBhcyBDb25maWc+OjpSdW50aW1lQ2FsbD4AAEh8U2VuZCBhIGJhdGNoIG9mIGRpc3BhdGNoIGNhbGxzLgCwTWF5IGJlIGNhbGxlZCBmcm9tIGFueSBvcmlnaW4gZXhjZXB0IGBOb25lYC4AXQEtIGBjYWxsc2A6IFRoZSBjYWxscyB0byBiZSBkaXNwYXRjaGVkIGZyb20gdGhlIHNhbWUgb3JpZ2luLiBUaGUgbnVtYmVyIG9mIGNhbGwgbXVzdCBub3Q5ASAgZXhjZWVkIHRoZSBjb25zdGFudDogYGJhdGNoZWRfY2FsbHNfbGltaXRgIChhdmFpbGFibGUgaW4gY29uc3RhbnQgbWV0YWRhdGEpLgBVAUlmIG9yaWdpbiBpcyByb290IHRoZW4gdGhlIGNhbGxzIGFyZSBkaXNwYXRjaGVkIHdpdGhvdXQgY2hlY2tpbmcgb3JpZ2luIGZpbHRlci4gKFRoaXPsaW5jbHVkZXMgYnlwYXNzaW5nIGBmcmFtZV9zeXN0ZW06OkNvbmZpZzo6QmFzZUNhbGxGaWx0ZXJgKS4ANCMjIENvbXBsZXhpdHnQLSBPKEMpIHdoZXJlIEMgaXMgdGhlIG51bWJlciBvZiBjYWxscyB0byBiZSBiYXRjaGVkLgBVAVRoaXMgd2lsbCByZXR1cm4gYE9rYCBpbiBhbGwgY2lyY3Vtc3RhbmNlcy4gVG8gZGV0ZXJtaW5lIHRoZSBzdWNjZXNzIG9mIHRoZSBiYXRjaCwgYW4xAWV2ZW50IGlzIGRlcG9zaXRlZC4gSWYgYSBjYWxsIGZhaWxlZCBhbmQgdGhlIGJhdGNoIHdhcyBpbnRlcnJ1cHRlZCwgdGhlbiB0aGVVAWBCYXRjaEludGVycnVwdGVkYCBldmVudCBpcyBkZXBvc2l0ZWQsIGFsb25nIHdpdGggdGhlIG51bWJlciBvZiBzdWNjZXNzZnVsIGNhbGxzIG1hZGVNAWFuZCB0aGUgZXJyb3Igb2YgdGhlIGZhaWxlZCBjYWxsLiBJZiBhbGwgd2VyZSBzdWNjZXNzZnVsLCB0aGVuIHRoZSBgQmF0Y2hDb21wbGV0ZWRgTGV2ZW50IGlzIGRlcG9zaXRlZC40YXNfZGVyaXZhdGl2ZQgBFGluZGV4bQEBDHUxNgABEGNhbGx1AQF8Qm94PDxUIGFzIENvbmZpZz46OlJ1bnRpbWVDYWxsPgABNNxTZW5kIGEgY2FsbCB0aHJvdWdoIGFuIGluZGV4ZWQgcHNldWRvbnltIG9mIHRoZSBzZW5kZXIuAFUBRmlsdGVyIGZyb20gb3JpZ2luIGFyZSBwYXNzZWQgYWxvbmcuIFRoZSBjYWxsIHdpbGwgYmUgZGlzcGF0Y2hlZCB3aXRoIGFuIG9yaWdpbiB3aGljaLx1c2UgdGhlIHNhbWUgZmlsdGVyIGFzIHRoZSBvcmlnaW4gb2YgdGhpcyBjYWxsLgBFAU5PVEU6IElmIHlvdSBuZWVkIHRvIGVuc3VyZSB0aGF0IGFueSBhY2NvdW50LWJhc2VkIGZpbHRlcmluZyBpcyBub3QgaG9ub3JlZCAoaS5lLmEBYmVjYXVzZSB5b3UgZXhwZWN0IGBwcm94eWAgdG8gaGF2ZSBiZWVuIHVzZWQgcHJpb3IgaW4gdGhlIGNhbGwgc3RhY2sgYW5kIHlvdSBkbyBub3Qgd2FudFEBdGhlIGNhbGwgcmVzdHJpY3Rpb25zIHRvIGFwcGx5IHRvIGFueSBzdWItYWNjb3VudHMpLCB0aGVuIHVzZSBgYXNfbXVsdGlfdGhyZXNob2xkXzFgfGluIHRoZSBNdWx0aXNpZyBwYWxsZXQgaW5zdGVhZC4A9E5PVEU6IFByaW9yIHRvIHZlcnNpb24gKjEyLCB0aGlzIHdhcyBjYWxsZWQgYGFzX2xpbWl0ZWRfc3ViYC4AzFRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfLiRiYXRjaF9hbGwEARRjYWxsc/0CAXxWZWM8PFQgYXMgQ29uZmlnPjo6UnVudGltZUNhbGw+AAI07FNlbmQgYSBiYXRjaCBvZiBkaXNwYXRjaCBjYWxscyBhbmQgYXRvbWljYWxseSBleGVjdXRlIHRoZW0uIQFUaGUgd2hvbGUgdHJhbnNhY3Rpb24gd2lsbCByb2xsYmFjayBhbmQgZmFpbCBpZiBhbnkgb2YgdGhlIGNhbGxzIGZhaWxlZC4AsE1heSBiZSBjYWxsZWQgZnJvbSBhbnkgb3JpZ2luIGV4Y2VwdCBgTm9uZWAuAF0BLSBgY2FsbHNgOiBUaGUgY2FsbHMgdG8gYmUgZGlzcGF0Y2hlZCBmcm9tIHRoZSBzYW1lIG9yaWdpbi4gVGhlIG51bWJlciBvZiBjYWxsIG11c3Qgbm90OQEgIGV4Y2VlZCB0aGUgY29uc3RhbnQ6IGBiYXRjaGVkX2NhbGxzX2xpbWl0YCAoYXZhaWxhYmxlIGluIGNvbnN0YW50IG1ldGFkYXRhKS4AVQFJZiBvcmlnaW4gaXMgcm9vdCB0aGVuIHRoZSBjYWxscyBhcmUgZGlzcGF0Y2hlZCB3aXRob3V0IGNoZWNraW5nIG9yaWdpbiBmaWx0ZXIuIChUaGlz7GluY2x1ZGVzIGJ5cGFzc2luZyBgZnJhbWVfc3lzdGVtOjpDb25maWc6OkJhc2VDYWxsRmlsdGVyYCkuADQjIyBDb21wbGV4aXR50C0gTyhDKSB3aGVyZSBDIGlzIHRoZSBudW1iZXIgb2YgY2FsbHMgdG8gYmUgYmF0Y2hlZC4sZGlzcGF0Y2hfYXMIASRhc19vcmlnaW59AgFUQm94PFQ6OlBhbGxldHNPcmlnaW4+AAEQY2FsbHUBAXxCb3g8PFQgYXMgQ29uZmlnPjo6UnVudGltZUNhbGw+AAMYyERpc3BhdGNoZXMgYSBmdW5jdGlvbiBjYWxsIHdpdGggYSBwcm92aWRlZCBvcmlnaW4uAMRUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfUm9vdF8uADQjIyBDb21wbGV4aXR5HC0gTygxKS4sZm9yY2VfYmF0Y2gEARRjYWxsc/0CAXxWZWM8PFQgYXMgQ29uZmlnPjo6UnVudGltZUNhbGw+AAQ0fFNlbmQgYSBiYXRjaCBvZiBkaXNwYXRjaCBjYWxscy7UVW5saWtlIGBiYXRjaGAsIGl0IGFsbG93cyBlcnJvcnMgYW5kIHdvbid0IGludGVycnVwdC4AsE1heSBiZSBjYWxsZWQgZnJvbSBhbnkgb3JpZ2luIGV4Y2VwdCBgTm9uZWAuAF0BLSBgY2FsbHNgOiBUaGUgY2FsbHMgdG8gYmUgZGlzcGF0Y2hlZCBmcm9tIHRoZSBzYW1lIG9yaWdpbi4gVGhlIG51bWJlciBvZiBjYWxsIG11c3Qgbm90OQEgIGV4Y2VlZCB0aGUgY29uc3RhbnQ6IGBiYXRjaGVkX2NhbGxzX2xpbWl0YCAoYXZhaWxhYmxlIGluIGNvbnN0YW50IG1ldGFkYXRhKS4ATQFJZiBvcmlnaW4gaXMgcm9vdCB0aGVuIHRoZSBjYWxscyBhcmUgZGlzcGF0Y2ggd2l0aG91dCBjaGVja2luZyBvcmlnaW4gZmlsdGVyLiAoVGhpc+xpbmNsdWRlcyBieXBhc3NpbmcgYGZyYW1lX3N5c3RlbTo6Q29uZmlnOjpCYXNlQ2FsbEZpbHRlcmApLgA0IyMgQ29tcGxleGl0edAtIE8oQykgd2hlcmUgQyBpcyB0aGUgbnVtYmVyIG9mIGNhbGxzIHRvIGJlIGJhdGNoZWQuLHdpdGhfd2VpZ2h0CAEQY2FsbHUBAXxCb3g8PFQgYXMgQ29uZmlnPjo6UnVudGltZUNhbGw+AAEYd2VpZ2h0KAEYV2VpZ2h0AAUYxERpc3BhdGNoIGEgZnVuY3Rpb24gY2FsbCB3aXRoIGEgc3BlY2lmaWVkIHdlaWdodC4ALQFUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IGNoZWNrIHRoZSB3ZWlnaHQgb2YgdGhlIGNhbGwsIGFuZCBpbnN0ZWFkIGFsbG93cyB0aGW4Um9vdCBvcmlnaW4gdG8gc3BlY2lmeSB0aGUgd2VpZ2h0IG9mIHRoZSBjYWxsLgDEVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1Jvb3RfLgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy79AgAAAnUBAAEDDDBwYWxsZXRfcHJveHkYcGFsbGV0EENhbGwEBFQAASgUcHJveHkMARByZWFsxQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAFAZm9yY2VfcHJveHlfdHlwZQUDAVBPcHRpb248VDo6UHJveHlUeXBlPgABEGNhbGx1AQF8Qm94PDxUIGFzIENvbmZpZz46OlJ1bnRpbWVDYWxsPgAAJE0BRGlzcGF0Y2ggdGhlIGdpdmVuIGBjYWxsYCBmcm9tIGFuIGFjY291bnQgdGhhdCB0aGUgc2VuZGVyIGlzIGF1dGhvcmlzZWQgZm9yIHRocm91Z2gwYGFkZF9wcm94eWAuAMxUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXy4ALFBhcmFtZXRlcnM6DQEtIGByZWFsYDogVGhlIGFjY291bnQgdGhhdCB0aGUgcHJveHkgd2lsbCBtYWtlIGEgY2FsbCBvbiBiZWhhbGYgb2YuYQEtIGBmb3JjZV9wcm94eV90eXBlYDogU3BlY2lmeSB0aGUgZXhhY3QgcHJveHkgdHlwZSB0byBiZSB1c2VkIGFuZCBjaGVja2VkIGZvciB0aGlzIGNhbGwu0C0gYGNhbGxgOiBUaGUgY2FsbCB0byBiZSBtYWRlIGJ5IHRoZSBgcmVhbGAgYWNjb3VudC4kYWRkX3Byb3h5DAEgZGVsZWdhdGXFAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AAShwcm94eV90eXBlCQMBMFQ6OlByb3h5VHlwZQABFGRlbGF5EAFEQmxvY2tOdW1iZXJGb3I8VD4AASRFAVJlZ2lzdGVyIGEgcHJveHkgYWNjb3VudCBmb3IgdGhlIHNlbmRlciB0aGF0IGlzIGFibGUgdG8gbWFrZSBjYWxscyBvbiBpdHMgYmVoYWxmLgDMVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uACxQYXJhbWV0ZXJzOhEBLSBgcHJveHlgOiBUaGUgYWNjb3VudCB0aGF0IHRoZSBgY2FsbGVyYCB3b3VsZCBsaWtlIHRvIG1ha2UgYSBwcm94eS78LSBgcHJveHlfdHlwZWA6IFRoZSBwZXJtaXNzaW9ucyBhbGxvd2VkIGZvciB0aGlzIHByb3h5IGFjY291bnQuTQEtIGBkZWxheWA6IFRoZSBhbm5vdW5jZW1lbnQgcGVyaW9kIHJlcXVpcmVkIG9mIHRoZSBpbml0aWFsIHByb3h5LiBXaWxsIGdlbmVyYWxseSBiZRR6ZXJvLjByZW1vdmVfcHJveHkMASBkZWxlZ2F0ZcUBAVBBY2NvdW50SWRMb29rdXBPZjxUPgABKHByb3h5X3R5cGUJAwEwVDo6UHJveHlUeXBlAAEUZGVsYXkQAURCbG9ja051bWJlckZvcjxUPgACHKhVbnJlZ2lzdGVyIGEgcHJveHkgYWNjb3VudCBmb3IgdGhlIHNlbmRlci4AzFRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfLgAsUGFyYW1ldGVyczolAS0gYHByb3h5YDogVGhlIGFjY291bnQgdGhhdCB0aGUgYGNhbGxlcmAgd291bGQgbGlrZSB0byByZW1vdmUgYXMgYSBwcm94eS5BAS0gYHByb3h5X3R5cGVgOiBUaGUgcGVybWlzc2lvbnMgY3VycmVudGx5IGVuYWJsZWQgZm9yIHRoZSByZW1vdmVkIHByb3h5IGFjY291bnQuOHJlbW92ZV9wcm94aWVzAAMYtFVucmVnaXN0ZXIgYWxsIHByb3h5IGFjY291bnRzIGZvciB0aGUgc2VuZGVyLgDMVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uAEEBV0FSTklORzogVGhpcyBtYXkgYmUgY2FsbGVkIG9uIGFjY291bnRzIGNyZWF0ZWQgYnkgYHB1cmVgLCBob3dldmVyIGlmIGRvbmUsIHRoZW5ZAXRoZSB1bnJlc2VydmVkIGZlZXMgd2lsbCBiZSBpbmFjY2Vzc2libGUuICoqQWxsIGFjY2VzcyB0byB0aGlzIGFjY291bnQgd2lsbCBiZSBsb3N0LioqLGNyZWF0ZV9wdXJlDAEocHJveHlfdHlwZQkDATBUOjpQcm94eVR5cGUAARRkZWxheRABREJsb2NrTnVtYmVyRm9yPFQ+AAEUaW5kZXhtAQEMdTE2AARIOQFTcGF3biBhIGZyZXNoIG5ldyBhY2NvdW50IHRoYXQgaXMgZ3VhcmFudGVlZCB0byBiZSBvdGhlcndpc2UgaW5hY2Nlc3NpYmxlLCBhbmT8aW5pdGlhbGl6ZSBpdCB3aXRoIGEgcHJveHkgb2YgYHByb3h5X3R5cGVgIGZvciBgb3JpZ2luYCBzZW5kZXIuAGxSZXF1aXJlcyBhIGBTaWduZWRgIG9yaWdpbi4AUQEtIGBwcm94eV90eXBlYDogVGhlIHR5cGUgb2YgdGhlIHByb3h5IHRoYXQgdGhlIHNlbmRlciB3aWxsIGJlIHJlZ2lzdGVyZWQgYXMgb3ZlciB0aGVNAW5ldyBhY2NvdW50LiBUaGlzIHdpbGwgYWxtb3N0IGFsd2F5cyBiZSB0aGUgbW9zdCBwZXJtaXNzaXZlIGBQcm94eVR5cGVgIHBvc3NpYmxlIHRveGFsbG93IGZvciBtYXhpbXVtIGZsZXhpYmlsaXR5LlEBLSBgaW5kZXhgOiBBIGRpc2FtYmlndWF0aW9uIGluZGV4LCBpbiBjYXNlIHRoaXMgaXMgY2FsbGVkIG11bHRpcGxlIHRpbWVzIGluIHRoZSBzYW1lXQF0cmFuc2FjdGlvbiAoZS5nLiB3aXRoIGB1dGlsaXR5OjpiYXRjaGApLiBVbmxlc3MgeW91J3JlIHVzaW5nIGBiYXRjaGAgeW91IHByb2JhYmx5IGp1c3RAd2FudCB0byB1c2UgYDBgLk0BLSBgZGVsYXlgOiBUaGUgYW5ub3VuY2VtZW50IHBlcmlvZCByZXF1aXJlZCBvZiB0aGUgaW5pdGlhbCBwcm94eS4gV2lsbCBnZW5lcmFsbHkgYmUUemVyby4AUQFGYWlscyB3aXRoIGBEdXBsaWNhdGVgIGlmIHRoaXMgaGFzIGFscmVhZHkgYmVlbiBjYWxsZWQgaW4gdGhpcyB0cmFuc2FjdGlvbiwgZnJvbSB0aGWYc2FtZSBzZW5kZXIsIHdpdGggdGhlIHNhbWUgcGFyYW1ldGVycy4A5EZhaWxzIGlmIHRoZXJlIGFyZSBpbnN1ZmZpY2llbnQgZnVuZHMgdG8gcGF5IGZvciBkZXBvc2l0LiRraWxsX3B1cmUUARxzcGF3bmVyxQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEocHJveHlfdHlwZQkDATBUOjpQcm94eVR5cGUAARRpbmRleG0BAQx1MTYAARhoZWlnaHTsAURCbG9ja051bWJlckZvcjxUPgABJGV4dF9pbmRleOwBDHUzMgAFQKBSZW1vdmVzIGEgcHJldmlvdXNseSBzcGF3bmVkIHB1cmUgcHJveHkuAEkBV0FSTklORzogKipBbGwgYWNjZXNzIHRvIHRoaXMgYWNjb3VudCB3aWxsIGJlIGxvc3QuKiogQW55IGZ1bmRzIGhlbGQgaW4gaXQgd2lsbCBiZTRpbmFjY2Vzc2libGUuAFkBUmVxdWlyZXMgYSBgU2lnbmVkYCBvcmlnaW4sIGFuZCB0aGUgc2VuZGVyIGFjY291bnQgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCBieSBhIGNhbGwgdG+UYHB1cmVgIHdpdGggY29ycmVzcG9uZGluZyBwYXJhbWV0ZXJzLgA5AS0gYHNwYXduZXJgOiBUaGUgYWNjb3VudCB0aGF0IG9yaWdpbmFsbHkgY2FsbGVkIGBwdXJlYCB0byBjcmVhdGUgdGhpcyBhY2NvdW50LjkBLSBgaW5kZXhgOiBUaGUgZGlzYW1iaWd1YXRpb24gaW5kZXggb3JpZ2luYWxseSBwYXNzZWQgdG8gYHB1cmVgLiBQcm9iYWJseSBgMGAu7C0gYHByb3h5X3R5cGVgOiBUaGUgcHJveHkgdHlwZSBvcmlnaW5hbGx5IHBhc3NlZCB0byBgcHVyZWAuKQEtIGBoZWlnaHRgOiBUaGUgaGVpZ2h0IG9mIHRoZSBjaGFpbiB3aGVuIHRoZSBjYWxsIHRvIGBwdXJlYCB3YXMgcHJvY2Vzc2VkLjUBLSBgZXh0X2luZGV4YDogVGhlIGV4dHJpbnNpYyBpbmRleCBpbiB3aGljaCB0aGUgY2FsbCB0byBgcHVyZWAgd2FzIHByb2Nlc3NlZC4ANQFGYWlscyB3aXRoIGBOb1Blcm1pc3Npb25gIGluIGNhc2UgdGhlIGNhbGxlciBpcyBub3QgYSBwcmV2aW91c2x5IGNyZWF0ZWQgcHVyZdxhY2NvdW50IHdob3NlIGBwdXJlYCBjYWxsIGhhcyBjb3JyZXNwb25kaW5nIHBhcmFtZXRlcnMuIGFubm91bmNlCAEQcmVhbMUBAVBBY2NvdW50SWRMb29rdXBPZjxUPgABJGNhbGxfaGFzaDQBNENhbGxIYXNoT2Y8VD4ABjwFAVB1Ymxpc2ggdGhlIGhhc2ggb2YgYSBwcm94eS1jYWxsIHRoYXQgd2lsbCBiZSBtYWRlIGluIHRoZSBmdXR1cmUuAF0BVGhpcyBtdXN0IGJlIGNhbGxlZCBzb21lIG51bWJlciBvZiBibG9ja3MgYmVmb3JlIHRoZSBjb3JyZXNwb25kaW5nIGBwcm94eWAgaXMgYXR0ZW1wdGVkJQFpZiB0aGUgZGVsYXkgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm94eSByZWxhdGlvbnNoaXAgaXMgZ3JlYXRlciB0aGFuIHplcm8uABEBTm8gbW9yZSB0aGFuIGBNYXhQZW5kaW5nYCBhbm5vdW5jZW1lbnRzIG1heSBiZSBtYWRlIGF0IGFueSBvbmUgdGltZS4ACQFUaGlzIHdpbGwgdGFrZSBhIGRlcG9zaXQgb2YgYEFubm91bmNlbWVudERlcG9zaXRGYWN0b3JgIGFzIHdlbGwgYXMZAWBBbm5vdW5jZW1lbnREZXBvc2l0QmFzZWAgaWYgdGhlcmUgYXJlIG5vIG90aGVyIHBlbmRpbmcgYW5ub3VuY2VtZW50cy4AJQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXyBhbmQgYSBwcm94eSBvZiBgcmVhbGAuACxQYXJhbWV0ZXJzOg0BLSBgcmVhbGA6IFRoZSBhY2NvdW50IHRoYXQgdGhlIHByb3h5IHdpbGwgbWFrZSBhIGNhbGwgb24gYmVoYWxmIG9mLhUBLSBgY2FsbF9oYXNoYDogVGhlIGhhc2ggb2YgdGhlIGNhbGwgdG8gYmUgbWFkZSBieSB0aGUgYHJlYWxgIGFjY291bnQuTHJlbW92ZV9hbm5vdW5jZW1lbnQIARByZWFsxQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEkY2FsbF9oYXNoNAE0Q2FsbEhhc2hPZjxUPgAHKHBSZW1vdmUgYSBnaXZlbiBhbm5vdW5jZW1lbnQuAFkBTWF5IGJlIGNhbGxlZCBieSBhIHByb3h5IGFjY291bnQgdG8gcmVtb3ZlIGEgY2FsbCB0aGV5IHByZXZpb3VzbHkgYW5ub3VuY2VkIGFuZCByZXR1cm4wdGhlIGRlcG9zaXQuAMxUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXy4ALFBhcmFtZXRlcnM6DQEtIGByZWFsYDogVGhlIGFjY291bnQgdGhhdCB0aGUgcHJveHkgd2lsbCBtYWtlIGEgY2FsbCBvbiBiZWhhbGYgb2YuFQEtIGBjYWxsX2hhc2hgOiBUaGUgaGFzaCBvZiB0aGUgY2FsbCB0byBiZSBtYWRlIGJ5IHRoZSBgcmVhbGAgYWNjb3VudC5McmVqZWN0X2Fubm91bmNlbWVudAgBIGRlbGVnYXRlxQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEkY2FsbF9oYXNoNAE0Q2FsbEhhc2hPZjxUPgAIKLBSZW1vdmUgdGhlIGdpdmVuIGFubm91bmNlbWVudCBvZiBhIGRlbGVnYXRlLgBhAU1heSBiZSBjYWxsZWQgYnkgYSB0YXJnZXQgKHByb3hpZWQpIGFjY291bnQgdG8gcmVtb3ZlIGEgY2FsbCB0aGF0IG9uZSBvZiB0aGVpciBkZWxlZ2F0ZXMlAShgZGVsZWdhdGVgKSBoYXMgYW5ub3VuY2VkIHRoZXkgd2FudCB0byBleGVjdXRlLiBUaGUgZGVwb3NpdCBpcyByZXR1cm5lZC4AzFRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfLgAsUGFyYW1ldGVyczr0LSBgZGVsZWdhdGVgOiBUaGUgYWNjb3VudCB0aGF0IHByZXZpb3VzbHkgYW5ub3VuY2VkIHRoZSBjYWxsLrwtIGBjYWxsX2hhc2hgOiBUaGUgaGFzaCBvZiB0aGUgY2FsbCB0byBiZSBtYWRlLjxwcm94eV9hbm5vdW5jZWQQASBkZWxlZ2F0ZcUBAVBBY2NvdW50SWRMb29rdXBPZjxUPgABEHJlYWzFAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AAUBmb3JjZV9wcm94eV90eXBlBQMBUE9wdGlvbjxUOjpQcm94eVR5cGU+AAEQY2FsbHUBAXxCb3g8PFQgYXMgQ29uZmlnPjo6UnVudGltZUNhbGw+AAksTQFEaXNwYXRjaCB0aGUgZ2l2ZW4gYGNhbGxgIGZyb20gYW4gYWNjb3VudCB0aGF0IHRoZSBzZW5kZXIgaXMgYXV0aG9yaXplZCBmb3IgdGhyb3VnaDBgYWRkX3Byb3h5YC4AqFJlbW92ZXMgYW55IGNvcnJlc3BvbmRpbmcgYW5ub3VuY2VtZW50KHMpLgDMVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uACxQYXJhbWV0ZXJzOg0BLSBgcmVhbGA6IFRoZSBhY2NvdW50IHRoYXQgdGhlIHByb3h5IHdpbGwgbWFrZSBhIGNhbGwgb24gYmVoYWxmIG9mLmEBLSBgZm9yY2VfcHJveHlfdHlwZWA6IFNwZWNpZnkgdGhlIGV4YWN0IHByb3h5IHR5cGUgdG8gYmUgdXNlZCBhbmQgY2hlY2tlZCBmb3IgdGhpcyBjYWxsLtAtIGBjYWxsYDogVGhlIGNhbGwgdG8gYmUgbWFkZSBieSB0aGUgYHJlYWxgIGFjY291bnQuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLgUDBBhPcHRpb24EBFQBCQMBCBBOb25lAAAAEFNvbWUEAAkDAAABAAAJAwhAcG9sa2Fkb3RfcnVudGltZSRQcm94eVR5cGUAARwMQW55AAAALE5vblRyYW5zZmVyAAEAKEdvdmVybmFuY2UAAgAcU3Rha2luZwADACxDYW5jZWxQcm94eQAGABxBdWN0aW9uAAcAPE5vbWluYXRpb25Qb29scwAIAAANAww8cGFsbGV0X211bHRpc2lnGHBhbGxldBBDYWxsBARUAAEQUGFzX211bHRpX3RocmVzaG9sZF8xCAFEb3RoZXJfc2lnbmF0b3JpZXPRAQFEVmVjPFQ6OkFjY291bnRJZD4AARBjYWxsdQEBfEJveDw8VCBhcyBDb25maWc+OjpSdW50aW1lQ2FsbD4AADBRAUltbWVkaWF0ZWx5IGRpc3BhdGNoIGEgbXVsdGktc2lnbmF0dXJlIGNhbGwgdXNpbmcgYSBzaW5nbGUgYXBwcm92YWwgZnJvbSB0aGUgY2FsbGVyLgDMVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uAD0BLSBgb3RoZXJfc2lnbmF0b3JpZXNgOiBUaGUgYWNjb3VudHMgKG90aGVyIHRoYW4gdGhlIHNlbmRlcikgd2hvIGFyZSBwYXJ0IG9mIHRoZQEBbXVsdGktc2lnbmF0dXJlLCBidXQgZG8gbm90IHBhcnRpY2lwYXRlIGluIHRoZSBhcHByb3ZhbCBwcm9jZXNzLogtIGBjYWxsYDogVGhlIGNhbGwgdG8gYmUgZXhlY3V0ZWQuALhSZXN1bHQgaXMgZXF1aXZhbGVudCB0byB0aGUgZGlzcGF0Y2hlZCByZXN1bHQuADQjIyBDb21wbGV4aXR5GQFPKFogKyBDKSB3aGVyZSBaIGlzIHRoZSBsZW5ndGggb2YgdGhlIGNhbGwgYW5kIEMgaXRzIGV4ZWN1dGlvbiB3ZWlnaHQuIGFzX211bHRpFAEkdGhyZXNob2xkbQEBDHUxNgABRG90aGVyX3NpZ25hdG9yaWVz0QEBRFZlYzxUOjpBY2NvdW50SWQ+AAE8bWF5YmVfdGltZXBvaW50EQMBkE9wdGlvbjxUaW1lcG9pbnQ8QmxvY2tOdW1iZXJGb3I8VD4+PgABEGNhbGx1AQF8Qm94PDxUIGFzIENvbmZpZz46OlJ1bnRpbWVDYWxsPgABKG1heF93ZWlnaHQoARhXZWlnaHQAAZxVAVJlZ2lzdGVyIGFwcHJvdmFsIGZvciBhIGRpc3BhdGNoIHRvIGJlIG1hZGUgZnJvbSBhIGRldGVybWluaXN0aWMgY29tcG9zaXRlIGFjY291bnQgaWb4YXBwcm92ZWQgYnkgYSB0b3RhbCBvZiBgdGhyZXNob2xkIC0gMWAgb2YgYG90aGVyX3NpZ25hdG9yaWVzYC4AsElmIHRoZXJlIGFyZSBlbm91Z2gsIHRoZW4gZGlzcGF0Y2ggdGhlIGNhbGwuAC0BUGF5bWVudDogYERlcG9zaXRCYXNlYCB3aWxsIGJlIHJlc2VydmVkIGlmIHRoaXMgaXMgdGhlIGZpcnN0IGFwcHJvdmFsLCBwbHVzPQFgdGhyZXNob2xkYCB0aW1lcyBgRGVwb3NpdEZhY3RvcmAuIEl0IGlzIHJldHVybmVkIG9uY2UgdGhpcyBkaXNwYXRjaCBoYXBwZW5zIG9yNGlzIGNhbmNlbGxlZC4AzFRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfLgBVAS0gYHRocmVzaG9sZGA6IFRoZSB0b3RhbCBudW1iZXIgb2YgYXBwcm92YWxzIGZvciB0aGlzIGRpc3BhdGNoIGJlZm9yZSBpdCBpcyBleGVjdXRlZC5BAS0gYG90aGVyX3NpZ25hdG9yaWVzYDogVGhlIGFjY291bnRzIChvdGhlciB0aGFuIHRoZSBzZW5kZXIpIHdobyBjYW4gYXBwcm92ZSB0aGlzbGRpc3BhdGNoLiBNYXkgbm90IGJlIGVtcHR5LlkBLSBgbWF5YmVfdGltZXBvaW50YDogSWYgdGhpcyBpcyB0aGUgZmlyc3QgYXBwcm92YWwsIHRoZW4gdGhpcyBtdXN0IGJlIGBOb25lYC4gSWYgaXQgaXNRAW5vdCB0aGUgZmlyc3QgYXBwcm92YWwsIHRoZW4gaXQgbXVzdCBiZSBgU29tZWAsIHdpdGggdGhlIHRpbWVwb2ludCAoYmxvY2sgbnVtYmVyIGFuZNR0cmFuc2FjdGlvbiBpbmRleCkgb2YgdGhlIGZpcnN0IGFwcHJvdmFsIHRyYW5zYWN0aW9uLogtIGBjYWxsYDogVGhlIGNhbGwgdG8gYmUgZXhlY3V0ZWQuAB0BTk9URTogVW5sZXNzIHRoaXMgaXMgdGhlIGZpbmFsIGFwcHJvdmFsLCB5b3Ugd2lsbCBnZW5lcmFsbHkgd2FudCB0byB1c2UZAWBhcHByb3ZlX2FzX211bHRpYCBpbnN0ZWFkLCBzaW5jZSBpdCBvbmx5IHJlcXVpcmVzIGEgaGFzaCBvZiB0aGUgY2FsbC4AWQFSZXN1bHQgaXMgZXF1aXZhbGVudCB0byB0aGUgZGlzcGF0Y2hlZCByZXN1bHQgaWYgYHRocmVzaG9sZGAgaXMgZXhhY3RseSBgMWAuIE90aGVyd2lzZVUBb24gc3VjY2VzcywgcmVzdWx0IGlzIGBPa2AgYW5kIHRoZSByZXN1bHQgZnJvbSB0aGUgaW50ZXJpb3IgY2FsbCwgaWYgaXQgd2FzIGV4ZWN1dGVkLNxtYXkgYmUgZm91bmQgaW4gdGhlIGRlcG9zaXRlZCBgTXVsdGlzaWdFeGVjdXRlZGAgZXZlbnQuADQjIyBDb21wbGV4aXR5UC0gYE8oUyArIFogKyBDYWxsKWAuzC0gVXAgdG8gb25lIGJhbGFuY2UtcmVzZXJ2ZSBvciB1bnJlc2VydmUgb3BlcmF0aW9uLj0BLSBPbmUgcGFzc3Rocm91Z2ggb3BlcmF0aW9uLCBvbmUgaW5zZXJ0LCBib3RoIGBPKFMpYCB3aGVyZSBgU2AgaXMgdGhlIG51bWJlciBvZkUBICBzaWduYXRvcmllcy4gYFNgIGlzIGNhcHBlZCBieSBgTWF4U2lnbmF0b3JpZXNgLCB3aXRoIHdlaWdodCBiZWluZyBwcm9wb3J0aW9uYWwuIQEtIE9uZSBjYWxsIGVuY29kZSAmIGhhc2gsIGJvdGggb2YgY29tcGxleGl0eSBgTyhaKWAgd2hlcmUgYFpgIGlzIHR4LWxlbi68LSBPbmUgZW5jb2RlICYgaGFzaCwgYm90aCBvZiBjb21wbGV4aXR5IGBPKFMpYC7ULSBVcCB0byBvbmUgYmluYXJ5IHNlYXJjaCBhbmQgaW5zZXJ0IChgTyhsb2dTICsgUylgKS74LSBJL086IDEgcmVhZCBgTyhTKWAsIHVwIHRvIDEgbXV0YXRlIGBPKFMpYC4gVXAgdG8gb25lIHJlbW92ZS4wLSBPbmUgZXZlbnQubC0gVGhlIHdlaWdodCBvZiB0aGUgYGNhbGxgLk0BLSBTdG9yYWdlOiBpbnNlcnRzIG9uZSBpdGVtLCB2YWx1ZSBzaXplIGJvdW5kZWQgYnkgYE1heFNpZ25hdG9yaWVzYCwgd2l0aCBhIGRlcG9zaXQZASAgdGFrZW4gZm9yIGl0cyBsaWZldGltZSBvZiBgRGVwb3NpdEJhc2UgKyB0aHJlc2hvbGQgKiBEZXBvc2l0RmFjdG9yYC5AYXBwcm92ZV9hc19tdWx0aRQBJHRocmVzaG9sZG0BAQx1MTYAAURvdGhlcl9zaWduYXRvcmllc9EBAURWZWM8VDo6QWNjb3VudElkPgABPG1heWJlX3RpbWVwb2ludBEDAZBPcHRpb248VGltZXBvaW50PEJsb2NrTnVtYmVyRm9yPFQ+Pj4AASRjYWxsX2hhc2gEASBbdTg7IDMyXQABKG1heF93ZWlnaHQoARhXZWlnaHQAAnhVAVJlZ2lzdGVyIGFwcHJvdmFsIGZvciBhIGRpc3BhdGNoIHRvIGJlIG1hZGUgZnJvbSBhIGRldGVybWluaXN0aWMgY29tcG9zaXRlIGFjY291bnQgaWb4YXBwcm92ZWQgYnkgYSB0b3RhbCBvZiBgdGhyZXNob2xkIC0gMWAgb2YgYG90aGVyX3NpZ25hdG9yaWVzYC4ALQFQYXltZW50OiBgRGVwb3NpdEJhc2VgIHdpbGwgYmUgcmVzZXJ2ZWQgaWYgdGhpcyBpcyB0aGUgZmlyc3QgYXBwcm92YWwsIHBsdXM9AWB0aHJlc2hvbGRgIHRpbWVzIGBEZXBvc2l0RmFjdG9yYC4gSXQgaXMgcmV0dXJuZWQgb25jZSB0aGlzIGRpc3BhdGNoIGhhcHBlbnMgb3I0aXMgY2FuY2VsbGVkLgDMVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uAFUBLSBgdGhyZXNob2xkYDogVGhlIHRvdGFsIG51bWJlciBvZiBhcHByb3ZhbHMgZm9yIHRoaXMgZGlzcGF0Y2ggYmVmb3JlIGl0IGlzIGV4ZWN1dGVkLkEBLSBgb3RoZXJfc2lnbmF0b3JpZXNgOiBUaGUgYWNjb3VudHMgKG90aGVyIHRoYW4gdGhlIHNlbmRlcikgd2hvIGNhbiBhcHByb3ZlIHRoaXNsZGlzcGF0Y2guIE1heSBub3QgYmUgZW1wdHkuWQEtIGBtYXliZV90aW1lcG9pbnRgOiBJZiB0aGlzIGlzIHRoZSBmaXJzdCBhcHByb3ZhbCwgdGhlbiB0aGlzIG11c3QgYmUgYE5vbmVgLiBJZiBpdCBpc1EBbm90IHRoZSBmaXJzdCBhcHByb3ZhbCwgdGhlbiBpdCBtdXN0IGJlIGBTb21lYCwgd2l0aCB0aGUgdGltZXBvaW50IChibG9jayBudW1iZXIgYW5k1HRyYW5zYWN0aW9uIGluZGV4KSBvZiB0aGUgZmlyc3QgYXBwcm92YWwgdHJhbnNhY3Rpb24uzC0gYGNhbGxfaGFzaGA6IFRoZSBoYXNoIG9mIHRoZSBjYWxsIHRvIGJlIGV4ZWN1dGVkLgA1AU5PVEU6IElmIHRoaXMgaXMgdGhlIGZpbmFsIGFwcHJvdmFsLCB5b3Ugd2lsbCB3YW50IHRvIHVzZSBgYXNfbXVsdGlgIGluc3RlYWQuADQjIyBDb21wbGV4aXR5JC0gYE8oUylgLswtIFVwIHRvIG9uZSBiYWxhbmNlLXJlc2VydmUgb3IgdW5yZXNlcnZlIG9wZXJhdGlvbi49AS0gT25lIHBhc3N0aHJvdWdoIG9wZXJhdGlvbiwgb25lIGluc2VydCwgYm90aCBgTyhTKWAgd2hlcmUgYFNgIGlzIHRoZSBudW1iZXIgb2ZFASAgc2lnbmF0b3JpZXMuIGBTYCBpcyBjYXBwZWQgYnkgYE1heFNpZ25hdG9yaWVzYCwgd2l0aCB3ZWlnaHQgYmVpbmcgcHJvcG9ydGlvbmFsLrwtIE9uZSBlbmNvZGUgJiBoYXNoLCBib3RoIG9mIGNvbXBsZXhpdHkgYE8oUylgLtQtIFVwIHRvIG9uZSBiaW5hcnkgc2VhcmNoIGFuZCBpbnNlcnQgKGBPKGxvZ1MgKyBTKWApLvgtIEkvTzogMSByZWFkIGBPKFMpYCwgdXAgdG8gMSBtdXRhdGUgYE8oUylgLiBVcCB0byBvbmUgcmVtb3ZlLjAtIE9uZSBldmVudC5NAS0gU3RvcmFnZTogaW5zZXJ0cyBvbmUgaXRlbSwgdmFsdWUgc2l6ZSBib3VuZGVkIGJ5IGBNYXhTaWduYXRvcmllc2AsIHdpdGggYSBkZXBvc2l0GQEgIHRha2VuIGZvciBpdHMgbGlmZXRpbWUgb2YgYERlcG9zaXRCYXNlICsgdGhyZXNob2xkICogRGVwb3NpdEZhY3RvcmAuPGNhbmNlbF9hc19tdWx0aRABJHRocmVzaG9sZG0BAQx1MTYAAURvdGhlcl9zaWduYXRvcmllc9EBAURWZWM8VDo6QWNjb3VudElkPgABJHRpbWVwb2ludBUDAXBUaW1lcG9pbnQ8QmxvY2tOdW1iZXJGb3I8VD4+AAEkY2FsbF9oYXNoBAEgW3U4OyAzMl0AA1RVAUNhbmNlbCBhIHByZS1leGlzdGluZywgb24tZ29pbmcgbXVsdGlzaWcgdHJhbnNhY3Rpb24uIEFueSBkZXBvc2l0IHJlc2VydmVkIHByZXZpb3VzbHnEZm9yIHRoaXMgb3BlcmF0aW9uIHdpbGwgYmUgdW5yZXNlcnZlZCBvbiBzdWNjZXNzLgDMVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uAFUBLSBgdGhyZXNob2xkYDogVGhlIHRvdGFsIG51bWJlciBvZiBhcHByb3ZhbHMgZm9yIHRoaXMgZGlzcGF0Y2ggYmVmb3JlIGl0IGlzIGV4ZWN1dGVkLkEBLSBgb3RoZXJfc2lnbmF0b3JpZXNgOiBUaGUgYWNjb3VudHMgKG90aGVyIHRoYW4gdGhlIHNlbmRlcikgd2hvIGNhbiBhcHByb3ZlIHRoaXNsZGlzcGF0Y2guIE1heSBub3QgYmUgZW1wdHkuXQEtIGB0aW1lcG9pbnRgOiBUaGUgdGltZXBvaW50IChibG9jayBudW1iZXIgYW5kIHRyYW5zYWN0aW9uIGluZGV4KSBvZiB0aGUgZmlyc3QgYXBwcm92YWx4dHJhbnNhY3Rpb24gZm9yIHRoaXMgZGlzcGF0Y2guzC0gYGNhbGxfaGFzaGA6IFRoZSBoYXNoIG9mIHRoZSBjYWxsIHRvIGJlIGV4ZWN1dGVkLgA0IyMgQ29tcGxleGl0eSQtIGBPKFMpYC7MLSBVcCB0byBvbmUgYmFsYW5jZS1yZXNlcnZlIG9yIHVucmVzZXJ2ZSBvcGVyYXRpb24uPQEtIE9uZSBwYXNzdGhyb3VnaCBvcGVyYXRpb24sIG9uZSBpbnNlcnQsIGJvdGggYE8oUylgIHdoZXJlIGBTYCBpcyB0aGUgbnVtYmVyIG9mRQEgIHNpZ25hdG9yaWVzLiBgU2AgaXMgY2FwcGVkIGJ5IGBNYXhTaWduYXRvcmllc2AsIHdpdGggd2VpZ2h0IGJlaW5nIHByb3BvcnRpb25hbC68LSBPbmUgZW5jb2RlICYgaGFzaCwgYm90aCBvZiBjb21wbGV4aXR5IGBPKFMpYC4wLSBPbmUgZXZlbnQuhC0gSS9POiAxIHJlYWQgYE8oUylgLCBvbmUgcmVtb3ZlLnAtIFN0b3JhZ2U6IHJlbW92ZXMgb25lIGl0ZW0uBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLhEDBBhPcHRpb24EBFQBFQMBCBBOb25lAAAAEFNvbWUEABUDAAABAAAVAwg8cGFsbGV0X211bHRpc2lnJFRpbWVwb2ludAQsQmxvY2tOdW1iZXIBEAAIARhoZWlnaHQQASxCbG9ja051bWJlcgABFGluZGV4EAEMdTMyAAAZAww8cGFsbGV0X2JvdW50aWVzGHBhbGxldBBDYWxsCARUAARJAAEkOHByb3Bvc2VfYm91bnR5CAEUdmFsdWX8ATxCYWxhbmNlT2Y8VCwgST4AASxkZXNjcmlwdGlvbjgBHFZlYzx1OD4AADBUUHJvcG9zZSBhIG5ldyBib3VudHkuAMxUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXy4AUQFQYXltZW50OiBgVGlwUmVwb3J0RGVwb3NpdEJhc2VgIHdpbGwgYmUgcmVzZXJ2ZWQgZnJvbSB0aGUgb3JpZ2luIGFjY291bnQsIGFzIHdlbGwgYXNRAWBEYXRhRGVwb3NpdFBlckJ5dGVgIGZvciBlYWNoIGJ5dGUgaW4gYHJlYXNvbmAuIEl0IHdpbGwgYmUgdW5yZXNlcnZlZCB1cG9uIGFwcHJvdmFsLGRvciBzbGFzaGVkIHdoZW4gcmVqZWN0ZWQuAPgtIGBjdXJhdG9yYDogVGhlIGN1cmF0b3IgYWNjb3VudCB3aG9tIHdpbGwgbWFuYWdlIHRoaXMgYm91bnR5LmQtIGBmZWVgOiBUaGUgY3VyYXRvciBmZWUuJQEtIGB2YWx1ZWA6IFRoZSB0b3RhbCBwYXltZW50IGFtb3VudCBvZiB0aGlzIGJvdW50eSwgY3VyYXRvciBmZWUgaW5jbHVkZWQuwC0gYGRlc2NyaXB0aW9uYDogVGhlIGRlc2NyaXB0aW9uIG9mIHRoaXMgYm91bnR5LjhhcHByb3ZlX2JvdW50eQQBJGJvdW50eV9pZOwBLEJvdW50eUluZGV4AAEcXQFBcHByb3ZlIGEgYm91bnR5IHByb3Bvc2FsLiBBdCBhIGxhdGVyIHRpbWUsIHRoZSBib3VudHkgd2lsbCBiZSBmdW5kZWQgYW5kIGJlY29tZSBhY3RpdmWoYW5kIHRoZSBvcmlnaW5hbCBkZXBvc2l0IHdpbGwgYmUgcmV0dXJuZWQuAKRNYXkgb25seSBiZSBjYWxsZWQgZnJvbSBgVDo6U3BlbmRPcmlnaW5gLgA0IyMgQ29tcGxleGl0eRwtIE8oMSkuPHByb3Bvc2VfY3VyYXRvcgwBJGJvdW50eV9pZOwBLEJvdW50eUluZGV4AAEcY3VyYXRvcsUBAVBBY2NvdW50SWRMb29rdXBPZjxUPgABDGZlZfwBPEJhbGFuY2VPZjxULCBJPgACGJRQcm9wb3NlIGEgY3VyYXRvciB0byBhIGZ1bmRlZCBib3VudHkuAKRNYXkgb25seSBiZSBjYWxsZWQgZnJvbSBgVDo6U3BlbmRPcmlnaW5gLgA0IyMgQ29tcGxleGl0eRwtIE8oMSkuQHVuYXNzaWduX2N1cmF0b3IEASRib3VudHlfaWTsASxCb3VudHlJbmRleAADRHxVbmFzc2lnbiBjdXJhdG9yIGZyb20gYSBib3VudHkuAB0BVGhpcyBmdW5jdGlvbiBjYW4gb25seSBiZSBjYWxsZWQgYnkgdGhlIGBSZWplY3RPcmlnaW5gIGEgc2lnbmVkIG9yaWdpbi4APQFJZiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgYFJlamVjdE9yaWdpbmAsIHdlIGFzc3VtZSB0aGF0IHRoZSBjdXJhdG9yIGlzMQFtYWxpY2lvdXMgb3IgaW5hY3RpdmUuIEFzIGEgcmVzdWx0LCB3ZSB3aWxsIHNsYXNoIHRoZSBjdXJhdG9yIHdoZW4gcG9zc2libGUuAGEBSWYgdGhlIG9yaWdpbiBpcyB0aGUgY3VyYXRvciwgd2UgdGFrZSB0aGlzIGFzIGEgc2lnbiB0aGV5IGFyZSB1bmFibGUgdG8gZG8gdGhlaXIgam9iIGFuZF0BdGhleSB3aWxsaW5nbHkgZ2l2ZSB1cC4gV2UgY291bGQgc2xhc2ggdGhlbSwgYnV0IGZvciBub3cgd2UgYWxsb3cgdGhlbSB0byByZWNvdmVyIHRoZWlyNQFkZXBvc2l0IGFuZCBleGl0IHdpdGhvdXQgaXNzdWUuIChXZSBtYXkgd2FudCB0byBjaGFuZ2UgdGhpcyBpZiBpdCBpcyBhYnVzZWQuKQBdAUZpbmFsbHksIHRoZSBvcmlnaW4gY2FuIGJlIGFueW9uZSBpZiBhbmQgb25seSBpZiB0aGUgY3VyYXRvciBpcyAiaW5hY3RpdmUiLiBUaGlzIGFsbG93c2EBYW55b25lIGluIHRoZSBjb21tdW5pdHkgdG8gY2FsbCBvdXQgdGhhdCBhIGN1cmF0b3IgaXMgbm90IGRvaW5nIHRoZWlyIGR1ZSBkaWxpZ2VuY2UsIGFuZDkBd2Ugc2hvdWxkIHBpY2sgYSBuZXcgY3VyYXRvci4gSW4gdGhpcyBjYXNlIHRoZSBjdXJhdG9yIHNob3VsZCBhbHNvIGJlIHNsYXNoZWQuADQjIyBDb21wbGV4aXR5HC0gTygxKS44YWNjZXB0X2N1cmF0b3IEASRib3VudHlfaWTsASxCb3VudHlJbmRleAAEHJRBY2NlcHQgdGhlIGN1cmF0b3Igcm9sZSBmb3IgYSBib3VudHkuKQFBIGRlcG9zaXQgd2lsbCBiZSByZXNlcnZlZCBmcm9tIGN1cmF0b3IgYW5kIHJlZnVuZCB1cG9uIHN1Y2Nlc3NmdWwgcGF5b3V0LgCQTWF5IG9ubHkgYmUgY2FsbGVkIGZyb20gdGhlIGN1cmF0b3IuADQjIyBDb21wbGV4aXR5HC0gTygxKS4wYXdhcmRfYm91bnR5CAEkYm91bnR5X2lk7AEsQm91bnR5SW5kZXgAASxiZW5lZmljaWFyecUBAVBBY2NvdW50SWRMb29rdXBPZjxUPgAFKFkBQXdhcmQgYm91bnR5IHRvIGEgYmVuZWZpY2lhcnkgYWNjb3VudC4gVGhlIGJlbmVmaWNpYXJ5IHdpbGwgYmUgYWJsZSB0byBjbGFpbSB0aGUgZnVuZHM4YWZ0ZXIgYSBkZWxheS4AFQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSB0aGUgY3VyYXRvciBvZiB0aGlzIGJvdW50eS4AiC0gYGJvdW50eV9pZGA6IEJvdW50eSBJRCB0byBhd2FyZC4ZAS0gYGJlbmVmaWNpYXJ5YDogVGhlIGJlbmVmaWNpYXJ5IGFjY291bnQgd2hvbSB3aWxsIHJlY2VpdmUgdGhlIHBheW91dC4ANCMjIENvbXBsZXhpdHkcLSBPKDEpLjBjbGFpbV9ib3VudHkEASRib3VudHlfaWTsASxCb3VudHlJbmRleAAGIOxDbGFpbSB0aGUgcGF5b3V0IGZyb20gYW4gYXdhcmRlZCBib3VudHkgYWZ0ZXIgcGF5b3V0IGRlbGF5LgAlAVRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIHRoZSBiZW5lZmljaWFyeSBvZiB0aGlzIGJvdW50eS4AiC0gYGJvdW50eV9pZGA6IEJvdW50eSBJRCB0byBjbGFpbS4ANCMjIENvbXBsZXhpdHkcLSBPKDEpLjBjbG9zZV9ib3VudHkEASRib3VudHlfaWTsASxCb3VudHlJbmRleAAHJDkBQ2FuY2VsIGEgcHJvcG9zZWQgb3IgYWN0aXZlIGJvdW50eS4gQWxsIHRoZSBmdW5kcyB3aWxsIGJlIHNlbnQgdG8gdHJlYXN1cnkgYW5kzHRoZSBjdXJhdG9yIGRlcG9zaXQgd2lsbCBiZSB1bnJlc2VydmVkIGlmIHBvc3NpYmxlLgDIT25seSBgVDo6UmVqZWN0T3JpZ2luYCBpcyBhYmxlIHRvIGNhbmNlbCBhIGJvdW50eS4AjC0gYGJvdW50eV9pZGA6IEJvdW50eSBJRCB0byBjYW5jZWwuADQjIyBDb21wbGV4aXR5HC0gTygxKS5QZXh0ZW5kX2JvdW50eV9leHBpcnkIASRib3VudHlfaWTsASxCb3VudHlJbmRleAABGHJlbWFyazgBHFZlYzx1OD4ACCSsRXh0ZW5kIHRoZSBleHBpcnkgdGltZSBvZiBhbiBhY3RpdmUgYm91bnR5LgAVAVRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIHRoZSBjdXJhdG9yIG9mIHRoaXMgYm91bnR5LgCMLSBgYm91bnR5X2lkYDogQm91bnR5IElEIHRvIGV4dGVuZC6MLSBgcmVtYXJrYDogYWRkaXRpb25hbCBpbmZvcm1hdGlvbi4ANCMjIENvbXBsZXhpdHkcLSBPKDEpLgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy4dAwxUcGFsbGV0X2NoaWxkX2JvdW50aWVzGHBhbGxldBBDYWxsBARUAAEcQGFkZF9jaGlsZF9ib3VudHkMAUBwYXJlbnRfYm91bnR5X2lk7AEsQm91bnR5SW5kZXgAARR2YWx1ZfwBMEJhbGFuY2VPZjxUPgABLGRlc2NyaXB0aW9uOAEcVmVjPHU4PgAATFxBZGQgYSBuZXcgY2hpbGQtYm91bnR5LgD8VGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgdGhlIGN1cmF0b3Igb2YgcGFyZW503GJvdW50eSBhbmQgdGhlIHBhcmVudCBib3VudHkgbXVzdCBiZSBpbiAiYWN0aXZlIiBzdGF0ZS4ABQFDaGlsZC1ib3VudHkgZ2V0cyBhZGRlZCBzdWNjZXNzZnVsbHkgJiBmdW5kIGdldHMgdHJhbnNmZXJyZWQgZnJvbQkBcGFyZW50IGJvdW50eSB0byBjaGlsZC1ib3VudHkgYWNjb3VudCwgaWYgcGFyZW50IGJvdW50eSBoYXMgZW5vdWdobGZ1bmRzLCBlbHNlIHRoZSBjYWxsIGZhaWxzLgANAVVwcGVyIGJvdW5kIHRvIG1heGltdW0gbnVtYmVyIG9mIGFjdGl2ZSAgY2hpbGQgYm91bnRpZXMgdGhhdCBjYW4gYmWoYWRkZWQgYXJlIG1hbmFnZWQgdmlhIHJ1bnRpbWUgdHJhaXQgY29uZmlnmFtgQ29uZmlnOjpNYXhBY3RpdmVDaGlsZEJvdW50eUNvdW50YF0uAAEBSWYgdGhlIGNhbGwgaXMgc3VjY2VzcywgdGhlIHN0YXR1cyBvZiBjaGlsZC1ib3VudHkgaXMgdXBkYXRlZCB0byAiQWRkZWQiLgBNAS0gYHBhcmVudF9ib3VudHlfaWRgOiBJbmRleCBvZiBwYXJlbnQgYm91bnR5IGZvciB3aGljaCBjaGlsZC1ib3VudHkgaXMgYmVpbmcgYWRkZWQusC0gYHZhbHVlYDogVmFsdWUgZm9yIGV4ZWN1dGluZyB0aGUgcHJvcG9zYWwu3C0gYGRlc2NyaXB0aW9uYDogVGV4dCBkZXNjcmlwdGlvbiBmb3IgdGhlIGNoaWxkLWJvdW50eS48cHJvcG9zZV9jdXJhdG9yEAFAcGFyZW50X2JvdW50eV9pZOwBLEJvdW50eUluZGV4AAE8Y2hpbGRfYm91bnR5X2lk7AEsQm91bnR5SW5kZXgAARxjdXJhdG9yxQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEMZmVl/AEwQmFsYW5jZU9mPFQ+AAE8oFByb3Bvc2UgY3VyYXRvciBmb3IgZnVuZGVkIGNoaWxkLWJvdW50eS4ADQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBjdXJhdG9yIG9mIHBhcmVudCBib3VudHkuABEBUGFyZW50IGJvdW50eSBtdXN0IGJlIGluIGFjdGl2ZSBzdGF0ZSwgZm9yIHRoaXMgY2hpbGQtYm91bnR5IGNhbGwgdG8Ud29yay4ADQFDaGlsZC1ib3VudHkgbXVzdCBiZSBpbiAiQWRkZWQiIHN0YXRlLCBmb3IgcHJvY2Vzc2luZyB0aGUgY2FsbC4gQW5kBQFzdGF0ZSBvZiBjaGlsZC1ib3VudHkgaXMgbW92ZWQgdG8gIkN1cmF0b3JQcm9wb3NlZCIgb24gc3VjY2Vzc2Z1bEBjYWxsIGNvbXBsZXRpb24uALQtIGBwYXJlbnRfYm91bnR5X2lkYDogSW5kZXggb2YgcGFyZW50IGJvdW50eS6sLSBgY2hpbGRfYm91bnR5X2lkYDogSW5kZXggb2YgY2hpbGQgYm91bnR5LrQtIGBjdXJhdG9yYDogQWRkcmVzcyBvZiBjaGlsZC1ib3VudHkgY3VyYXRvci7sLSBgZmVlYDogcGF5bWVudCBmZWUgdG8gY2hpbGQtYm91bnR5IGN1cmF0b3IgZm9yIGV4ZWN1dGlvbi44YWNjZXB0X2N1cmF0b3IIAUBwYXJlbnRfYm91bnR5X2lk7AEsQm91bnR5SW5kZXgAATxjaGlsZF9ib3VudHlfaWTsASxCb3VudHlJbmRleAACTLRBY2NlcHQgdGhlIGN1cmF0b3Igcm9sZSBmb3IgdGhlIGNoaWxkLWJvdW50eS4A9FRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIHRoZSBjdXJhdG9yIG9mIHRoaXM0Y2hpbGQtYm91bnR5LgDsQSBkZXBvc2l0IHdpbGwgYmUgcmVzZXJ2ZWQgZnJvbSB0aGUgY3VyYXRvciBhbmQgcmVmdW5kIHVwb26Ic3VjY2Vzc2Z1bCBwYXlvdXQgb3IgY2FuY2VsbGF0aW9uLgD4RmVlIGZvciBjdXJhdG9yIGlzIGRlZHVjdGVkIGZyb20gY3VyYXRvciBmZWUgb2YgcGFyZW50IGJvdW50eS4AEQFQYXJlbnQgYm91bnR5IG11c3QgYmUgaW4gYWN0aXZlIHN0YXRlLCBmb3IgdGhpcyBjaGlsZC1ib3VudHkgY2FsbCB0bxR3b3JrLgANAUNoaWxkLWJvdW50eSBtdXN0IGJlIGluICJDdXJhdG9yUHJvcG9zZWQiIHN0YXRlLCBmb3IgcHJvY2Vzc2luZyB0aGUJAWNhbGwuIEFuZCBzdGF0ZSBvZiBjaGlsZC1ib3VudHkgaXMgbW92ZWQgdG8gIkFjdGl2ZSIgb24gc3VjY2Vzc2Z1bEBjYWxsIGNvbXBsZXRpb24uALQtIGBwYXJlbnRfYm91bnR5X2lkYDogSW5kZXggb2YgcGFyZW50IGJvdW50eS6sLSBgY2hpbGRfYm91bnR5X2lkYDogSW5kZXggb2YgY2hpbGQgYm91bnR5LkB1bmFzc2lnbl9jdXJhdG9yCAFAcGFyZW50X2JvdW50eV9pZOwBLEJvdW50eUluZGV4AAE8Y2hpbGRfYm91bnR5X2lk7AEsQm91bnR5SW5kZXgAA4iUVW5hc3NpZ24gY3VyYXRvciBmcm9tIGEgY2hpbGQtYm91bnR5LgAJAVRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBjYW4gYmUgZWl0aGVyIGBSZWplY3RPcmlnaW5gLCBvctx0aGUgY3VyYXRvciBvZiB0aGUgcGFyZW50IGJvdW50eSwgb3IgYW55IHNpZ25lZCBvcmlnaW4uAPhGb3IgdGhlIG9yaWdpbiBvdGhlciB0aGFuIFQ6OlJlamVjdE9yaWdpbiBhbmQgdGhlIGNoaWxkLWJvdW50eQEBY3VyYXRvciwgcGFyZW50IGJvdW50eSBtdXN0IGJlIGluIGFjdGl2ZSBzdGF0ZSwgZm9yIHRoaXMgY2FsbCB0bwkBd29yay4gV2UgYWxsb3cgY2hpbGQtYm91bnR5IGN1cmF0b3IgYW5kIFQ6OlJlamVjdE9yaWdpbiB0byBleGVjdXRlyHRoaXMgY2FsbCBpcnJlc3BlY3RpdmUgb2YgdGhlIHBhcmVudCBib3VudHkgc3RhdGUuANxJZiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgYFJlamVjdE9yaWdpbmAgb3IgdGhlBQFwYXJlbnQgYm91bnR5IGN1cmF0b3IsIHdlIGFzc3VtZSB0aGF0IHRoZSBjaGlsZC1ib3VudHkgY3VyYXRvciBpcw0BbWFsaWNpb3VzIG9yIGluYWN0aXZlLiBBcyBhIHJlc3VsdCwgY2hpbGQtYm91bnR5IGN1cmF0b3IgZGVwb3NpdCBpcyBzbGFzaGVkLgAFAUlmIHRoZSBvcmlnaW4gaXMgdGhlIGNoaWxkLWJvdW50eSBjdXJhdG9yLCB3ZSB0YWtlIHRoaXMgYXMgYSBzaWduCQF0aGF0IHRoZXkgYXJlIHVuYWJsZSB0byBkbyB0aGVpciBqb2IsIGFuZCBhcmUgd2lsbGluZ2x5IGdpdmluZyB1cC4JAVdlIGNvdWxkIHNsYXNoIHRoZSBkZXBvc2l0LCBidXQgZm9yIG5vdyB3ZSBhbGxvdyB0aGVtIHRvIHVucmVzZXJ2ZREBdGhlaXIgZGVwb3NpdCBhbmQgZXhpdCB3aXRob3V0IGlzc3VlLiAoV2UgbWF5IHdhbnQgdG8gY2hhbmdlIHRoaXMgaWY4aXQgaXMgYWJ1c2VkLikABQFGaW5hbGx5LCB0aGUgb3JpZ2luIGNhbiBiZSBhbnlvbmUgaWZmIHRoZSBjaGlsZC1ib3VudHkgY3VyYXRvciBpcwkBImluYWN0aXZlIi4gRXhwaXJ5IHVwZGF0ZSBkdWUgb2YgcGFyZW50IGJvdW50eSBpcyB1c2VkIHRvIGVzdGltYXRlnGluYWN0aXZlIHN0YXRlIG9mIGNoaWxkLWJvdW50eSBjdXJhdG9yLgANAVRoaXMgYWxsb3dzIGFueW9uZSBpbiB0aGUgY29tbXVuaXR5IHRvIGNhbGwgb3V0IHRoYXQgYSBjaGlsZC1ib3VudHkJAWN1cmF0b3IgaXMgbm90IGRvaW5nIHRoZWlyIGR1ZSBkaWxpZ2VuY2UsIGFuZCB3ZSBzaG91bGQgcGljayBhIG5ld/hvbmUuIEluIHRoaXMgY2FzZSB0aGUgY2hpbGQtYm91bnR5IGN1cmF0b3IgZGVwb3NpdCBpcyBzbGFzaGVkLgABAVN0YXRlIG9mIGNoaWxkLWJvdW50eSBpcyBtb3ZlZCB0byBBZGRlZCBzdGF0ZSBvbiBzdWNjZXNzZnVsIGNhbGwsY29tcGxldGlvbi4AtC0gYHBhcmVudF9ib3VudHlfaWRgOiBJbmRleCBvZiBwYXJlbnQgYm91bnR5LqwtIGBjaGlsZF9ib3VudHlfaWRgOiBJbmRleCBvZiBjaGlsZCBib3VudHkuSGF3YXJkX2NoaWxkX2JvdW50eQwBQHBhcmVudF9ib3VudHlfaWTsASxCb3VudHlJbmRleAABPGNoaWxkX2JvdW50eV9pZOwBLEJvdW50eUluZGV4AAEsYmVuZWZpY2lhcnnFAQFQQWNjb3VudElkTG9va3VwT2Y8VD4ABESQQXdhcmQgY2hpbGQtYm91bnR5IHRvIGEgYmVuZWZpY2lhcnkuAPhUaGUgYmVuZWZpY2lhcnkgd2lsbCBiZSBhYmxlIHRvIGNsYWltIHRoZSBmdW5kcyBhZnRlciBhIGRlbGF5LgD8VGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgdGhlIHBhcmVudCBjdXJhdG9yIG9ydGN1cmF0b3Igb2YgdGhpcyBjaGlsZC1ib3VudHkuABEBUGFyZW50IGJvdW50eSBtdXN0IGJlIGluIGFjdGl2ZSBzdGF0ZSwgZm9yIHRoaXMgY2hpbGQtYm91bnR5IGNhbGwgdG8Ud29yay4ACQFDaGlsZC1ib3VudHkgbXVzdCBiZSBpbiBhY3RpdmUgc3RhdGUsIGZvciBwcm9jZXNzaW5nIHRoZSBjYWxsLiBBbmQRAXN0YXRlIG9mIGNoaWxkLWJvdW50eSBpcyBtb3ZlZCB0byAiUGVuZGluZ1BheW91dCIgb24gc3VjY2Vzc2Z1bCBjYWxsLGNvbXBsZXRpb24uALQtIGBwYXJlbnRfYm91bnR5X2lkYDogSW5kZXggb2YgcGFyZW50IGJvdW50eS6sLSBgY2hpbGRfYm91bnR5X2lkYDogSW5kZXggb2YgY2hpbGQgYm91bnR5LpQtIGBiZW5lZmljaWFyeWA6IEJlbmVmaWNpYXJ5IGFjY291bnQuSGNsYWltX2NoaWxkX2JvdW50eQgBQHBhcmVudF9ib3VudHlfaWTsASxCb3VudHlJbmRleAABPGNoaWxkX2JvdW50eV9pZOwBLEJvdW50eUluZGV4AAVABQFDbGFpbSB0aGUgcGF5b3V0IGZyb20gYW4gYXdhcmRlZCBjaGlsZC1ib3VudHkgYWZ0ZXIgcGF5b3V0IGRlbGF5LgDsVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG1heSBiZSBhbnkgc2lnbmVkIG9yaWdpbi4ABQFDYWxsIHdvcmtzIGluZGVwZW5kZW50IG9mIHBhcmVudCBib3VudHkgc3RhdGUsIE5vIG5lZWQgZm9yIHBhcmVudHRib3VudHkgdG8gYmUgaW4gYWN0aXZlIHN0YXRlLgARAVRoZSBCZW5lZmljaWFyeSBpcyBwYWlkIG91dCB3aXRoIGFncmVlZCBib3VudHkgdmFsdWUuIEN1cmF0b3IgZmVlIGlzlHBhaWQgJiBjdXJhdG9yIGRlcG9zaXQgaXMgdW5yZXNlcnZlZC4ABQFDaGlsZC1ib3VudHkgbXVzdCBiZSBpbiAiUGVuZGluZ1BheW91dCIgc3RhdGUsIGZvciBwcm9jZXNzaW5nIHRoZfxjYWxsLiBBbmQgaW5zdGFuY2Ugb2YgY2hpbGQtYm91bnR5IGlzIHJlbW92ZWQgZnJvbSB0aGUgc3RhdGUgb25sc3VjY2Vzc2Z1bCBjYWxsIGNvbXBsZXRpb24uALQtIGBwYXJlbnRfYm91bnR5X2lkYDogSW5kZXggb2YgcGFyZW50IGJvdW50eS6sLSBgY2hpbGRfYm91bnR5X2lkYDogSW5kZXggb2YgY2hpbGQgYm91bnR5LkhjbG9zZV9jaGlsZF9ib3VudHkIAUBwYXJlbnRfYm91bnR5X2lk7AEsQm91bnR5SW5kZXgAATxjaGlsZF9ib3VudHlfaWTsASxCb3VudHlJbmRleAAGWBEBQ2FuY2VsIGEgcHJvcG9zZWQgb3IgYWN0aXZlIGNoaWxkLWJvdW50eS4gQ2hpbGQtYm91bnR5IGFjY291bnQgZnVuZHMJAWFyZSB0cmFuc2ZlcnJlZCB0byBwYXJlbnQgYm91bnR5IGFjY291bnQuIFRoZSBjaGlsZC1ib3VudHkgY3VyYXRvcphkZXBvc2l0IG1heSBiZSB1bnJlc2VydmVkIGlmIHBvc3NpYmxlLgAJAVRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIGVpdGhlciBwYXJlbnQgY3VyYXRvciBvckhgVDo6UmVqZWN0T3JpZ2luYC4A8ElmIHRoZSBzdGF0ZSBvZiBjaGlsZC1ib3VudHkgaXMgYEFjdGl2ZWAsIGN1cmF0b3IgZGVwb3NpdCBpcyx1bnJlc2VydmVkLgD0SWYgdGhlIHN0YXRlIG9mIGNoaWxkLWJvdW50eSBpcyBgUGVuZGluZ1BheW91dGAsIGNhbGwgZmFpbHMgJnhyZXR1cm5zIGBQZW5kaW5nUGF5b3V0YCBlcnJvci4ADQFGb3IgdGhlIG9yaWdpbiBvdGhlciB0aGFuIFQ6OlJlamVjdE9yaWdpbiwgcGFyZW50IGJvdW50eSBtdXN0IGJlIGlu8GFjdGl2ZSBzdGF0ZSwgZm9yIHRoaXMgY2hpbGQtYm91bnR5IGNhbGwgdG8gd29yay4gRm9yIG9yaWdpbpBUOjpSZWplY3RPcmlnaW4gZXhlY3V0aW9uIGlzIGZvcmNlZC4AAQFJbnN0YW5jZSBvZiBjaGlsZC1ib3VudHkgaXMgcmVtb3ZlZCBmcm9tIHRoZSBzdGF0ZSBvbiBzdWNjZXNzZnVsQGNhbGwgY29tcGxldGlvbi4AtC0gYHBhcmVudF9ib3VudHlfaWRgOiBJbmRleCBvZiBwYXJlbnQgYm91bnR5LqwtIGBjaGlsZF9ib3VudHlfaWRgOiBJbmRleCBvZiBjaGlsZCBib3VudHkuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLiEDDJBwYWxsZXRfZWxlY3Rpb25fcHJvdmlkZXJfbXVsdGlfcGhhc2UYcGFsbGV0EENhbGwEBFQAARQ8c3VibWl0X3Vuc2lnbmVkCAEwcmF3X3NvbHV0aW9uJQMBsEJveDxSYXdTb2x1dGlvbjxTb2x1dGlvbk9mPFQ6Ok1pbmVyQ29uZmlnPj4+AAEcd2l0bmVzc/kDAVhTb2x1dGlvbk9yU25hcHNob3RTaXplAAA4pFN1Ym1pdCBhIHNvbHV0aW9uIGZvciB0aGUgdW5zaWduZWQgcGhhc2UuAMhUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvIHRoaXMgY2FsbCBtdXN0IGJlIF9fbm9uZV9fLgA9AVRoaXMgc3VibWlzc2lvbiBpcyBjaGVja2VkIG9uIHRoZSBmbHkuIE1vcmVvdmVyLCB0aGlzIHVuc2lnbmVkIHNvbHV0aW9uIGlzIG9ubHlVAXZhbGlkYXRlZCB3aGVuIHN1Ym1pdHRlZCB0byB0aGUgcG9vbCBmcm9tIHRoZSAqKmxvY2FsKiogbm9kZS4gRWZmZWN0aXZlbHksIHRoaXMgbWVhbnNdAXRoYXQgb25seSBhY3RpdmUgdmFsaWRhdG9ycyBjYW4gc3VibWl0IHRoaXMgdHJhbnNhY3Rpb24gd2hlbiBhdXRob3JpbmcgYSBibG9jayAoc2ltaWxhckB0byBhbiBpbmhlcmVudCkuAFkBVG8gcHJldmVudCBhbnkgaW5jb3JyZWN0IHNvbHV0aW9uIChhbmQgdGh1cyB3YXN0ZWQgdGltZS93ZWlnaHQpLCB0aGlzIHRyYW5zYWN0aW9uIHdpbGxNAXBhbmljIGlmIHRoZSBzb2x1dGlvbiBzdWJtaXR0ZWQgYnkgdGhlIHZhbGlkYXRvciBpcyBpbnZhbGlkIGluIGFueSB3YXksIGVmZmVjdGl2ZWx5nHB1dHRpbmcgdGhlaXIgYXV0aG9yaW5nIHJld2FyZCBhdCByaXNrLgDgTm8gZGVwb3NpdCBvciByZXdhcmQgaXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc3VibWlzc2lvbi5sc2V0X21pbmltdW1fdW50cnVzdGVkX3Njb3JlBAFAbWF5YmVfbmV4dF9zY29yZf0DAVRPcHRpb248RWxlY3Rpb25TY29yZT4AARSwU2V0IGEgbmV3IHZhbHVlIGZvciBgTWluaW11bVVudHJ1c3RlZFNjb3JlYC4A2ERpc3BhdGNoIG9yaWdpbiBtdXN0IGJlIGFsaWduZWQgd2l0aCBgVDo6Rm9yY2VPcmlnaW5gLgDwVGhpcyBjaGVjayBjYW4gYmUgdHVybmVkIG9mZiBieSBzZXR0aW5nIHRoZSB2YWx1ZSB0byBgTm9uZWAudHNldF9lbWVyZ2VuY3lfZWxlY3Rpb25fcmVzdWx0BAEgc3VwcG9ydHMBBAFYU3VwcG9ydHM8VDo6QWNjb3VudElkPgACIFkBU2V0IGEgc29sdXRpb24gaW4gdGhlIHF1ZXVlLCB0byBiZSBoYW5kZWQgb3V0IHRvIHRoZSBjbGllbnQgb2YgdGhpcyBwYWxsZXQgaW4gdGhlIG5leHSIY2FsbCB0byBgRWxlY3Rpb25Qcm92aWRlcjo6ZWxlY3RgLgBFAVRoaXMgY2FuIG9ubHkgYmUgc2V0IGJ5IGBUOjpGb3JjZU9yaWdpbmAsIGFuZCBvbmx5IHdoZW4gdGhlIHBoYXNlIGlzIGBFbWVyZ2VuY3lgLgBhAVRoZSBzb2x1dGlvbiBpcyBub3QgY2hlY2tlZCBmb3IgYW55IGZlYXNpYmlsaXR5IGFuZCBpcyBhc3N1bWVkIHRvIGJlIHRydXN0d29ydGh5LCBhcyBhbnlRAWZlYXNpYmlsaXR5IGNoZWNrIGl0c2VsZiBjYW4gaW4gcHJpbmNpcGxlIGNhdXNlIHRoZSBlbGVjdGlvbiBwcm9jZXNzIHRvIGZhaWwgKGR1ZSB0b2htZW1vcnkvd2VpZ2h0IGNvbnN0cmFpbnMpLhhzdWJtaXQEATByYXdfc29sdXRpb24lAwGwQm94PFJhd1NvbHV0aW9uPFNvbHV0aW9uT2Y8VDo6TWluZXJDb25maWc+Pj4AAyScU3VibWl0IGEgc29sdXRpb24gZm9yIHRoZSBzaWduZWQgcGhhc2UuANBUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvIHRoaXMgY2FsbCBtdXN0IGJlIF9fc2lnbmVkX18uAF0BVGhlIHNvbHV0aW9uIGlzIHBvdGVudGlhbGx5IHF1ZXVlZCwgYmFzZWQgb24gdGhlIGNsYWltZWQgc2NvcmUgYW5kIHByb2Nlc3NlZCBhdCB0aGUgZW5kUG9mIHRoZSBzaWduZWQgcGhhc2UuAF0BQSBkZXBvc2l0IGlzIHJlc2VydmVkIGFuZCByZWNvcmRlZCBmb3IgdGhlIHNvbHV0aW9uLiBCYXNlZCBvbiB0aGUgb3V0Y29tZSwgdGhlIHNvbHV0aW9uFQFtaWdodCBiZSByZXdhcmRlZCwgc2xhc2hlZCwgb3IgZ2V0IGFsbCBvciBhIHBhcnQgb2YgdGhlIGRlcG9zaXQgYmFjay5MZ292ZXJuYW5jZV9mYWxsYmFjawgBQG1heWJlX21heF92b3RlcnNhAgEsT3B0aW9uPHUzMj4AAURtYXliZV9tYXhfdGFyZ2V0c2ECASxPcHRpb248dTMyPgAE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IHByb3Blcmx5IGZhbGwgaW50byBhIGRpZmZlcmVudCBiYWcgdGhhbiBpdHMgY3VycmVudBBvbmUuAB0BQW55b25lIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24gYWJvdXQgYW55IHBvdGVudGlhbGx5IGRpc2xvY2F0ZWQgYWNjb3VudC4ASQFXaWxsIGFsd2F5cyB1cGRhdGUgdGhlIHN0b3JlZCBzY29yZSBvZiBgZGlzbG9jYXRlZGAgdG8gdGhlIGNvcnJlY3Qgc2NvcmUsIGJhc2VkIG9uQGBTY29yZVByb3ZpZGVyYC4A1ElmIGBkaXNsb2NhdGVkYCBkb2VzIG5vdCBleGlzdHMsIGl0IHJldHVybnMgYW4gZXJyb3IuPHB1dF9pbl9mcm9udF9vZgQBHGxpZ2h0ZXLFAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AASjQTW92ZSB0aGUgY2FsbGVyJ3MgSWQgZGlyZWN0bHkgaW4gZnJvbnQgb2YgYGxpZ2h0ZXJgLgBZAVRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfIGFuZCBjYW4gb25seSBiZSBjYWxsZWQgYnkgdGhlIElkIG9mNQF0aGUgYWNjb3VudCBnb2luZyBpbiBmcm9udCBvZiBgbGlnaHRlcmAuIEZlZSBpcyBwYXllZCBieSB0aGUgb3JpZ2luIHVuZGVyIGFsbDhjaXJjdW1zdGFuY2VzLgA4T25seSB3b3JrcyBpZjoAlC0gYm90aCBub2RlcyBhcmUgd2l0aGluIHRoZSBzYW1lIGJhZyzQLSBhbmQgYG9yaWdpbmAgaGFzIGEgZ3JlYXRlciBgU2NvcmVgIHRoYW4gYGxpZ2h0ZXJgLlRwdXRfaW5fZnJvbnRfb2Zfb3RoZXIIARxoZWF2aWVyxQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEcbGlnaHRlcsUBAVBBY2NvdW50SWRMb29rdXBPZjxUPgACDBEBU2FtZSBhcyBbYFBhbGxldDo6cHV0X2luX2Zyb250X29mYF0sIGJ1dCBpdCBjYW4gYmUgY2FsbGVkIGJ5IGFueW9uZS4AyEZlZSBpcyBwYWlkIGJ5IHRoZSBvcmlnaW4gdW5kZXIgYWxsIGNpcmN1bXN0YW5jZXMuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLhkEDFxwYWxsZXRfbm9taW5hdGlvbl9wb29scxhwYWxsZXQQQ2FsbAQEVAABaBBqb2luCAEYYW1vdW50/AEwQmFsYW5jZU9mPFQ+AAEccG9vbF9pZBABGFBvb2xJZAAAKEUBU3Rha2UgZnVuZHMgd2l0aCBhIHBvb2wuIFRoZSBhbW91bnQgdG8gYm9uZCBpcyB0cmFuc2ZlcnJlZCBmcm9tIHRoZSBtZW1iZXIgdG8gdGhl3HBvb2xzIGFjY291bnQgYW5kIGltbWVkaWF0ZWx5IGluY3JlYXNlcyB0aGUgcG9vbHMgYm9uZC4AGCMgTm90ZQDMKiBBbiBhY2NvdW50IGNhbiBvbmx5IGJlIGEgbWVtYmVyIG9mIGEgc2luZ2xlIHBvb2wu2CogQW4gYWNjb3VudCBjYW5ub3Qgam9pbiB0aGUgc2FtZSBwb29sIG11bHRpcGxlIHRpbWVzLkEBKiBUaGlzIGNhbGwgd2lsbCAqbm90KiBkdXN0IHRoZSBtZW1iZXIgYWNjb3VudCwgc28gdGhlIG1lbWJlciBtdXN0IGhhdmUgYXQgbGVhc3TIICBgZXhpc3RlbnRpYWwgZGVwb3NpdCArIGFtb3VudGAgaW4gdGhlaXIgYWNjb3VudC7QKiBPbmx5IGEgcG9vbCB3aXRoIFtgUG9vbFN0YXRlOjpPcGVuYF0gY2FuIGJlIGpvaW5lZChib25kX2V4dHJhBAEUZXh0cmEdBAFcQm9uZEV4dHJhPEJhbGFuY2VPZjxUPj4AARxFAUJvbmQgYGV4dHJhYCBtb3JlIGZ1bmRzIGZyb20gYG9yaWdpbmAgaW50byB0aGUgcG9vbCB0byB3aGljaCB0aGV5IGFscmVhZHkgYmVsb25nLgBJAUFkZGl0aW9uYWwgZnVuZHMgY2FuIGNvbWUgZnJvbSBlaXRoZXIgdGhlIGZyZWUgYmFsYW5jZSBvZiB0aGUgYWNjb3VudCwgb2YgZnJvbSB0aGWcYWNjdW11bGF0ZWQgcmV3YXJkcywgc2VlIFtgQm9uZEV4dHJhYF0uAD0BQm9uZGluZyBleHRyYSBmdW5kcyBpbXBsaWVzIGFuIGF1dG9tYXRpYyBwYXlvdXQgb2YgYWxsIHBlbmRpbmcgcmV3YXJkcyBhcyB3ZWxsLgkBU2VlIGBib25kX2V4dHJhX290aGVyYCB0byBib25kIHBlbmRpbmcgcmV3YXJkcyBvZiBgb3RoZXJgIG1lbWJlcnMuMGNsYWltX3BheW91dAACIFUBQSBib25kZWQgbWVtYmVyIGNhbiB1c2UgdGhpcyB0byBjbGFpbSB0aGVpciBwYXlvdXQgYmFzZWQgb24gdGhlIHJld2FyZHMgdGhhdCB0aGUgcG9vbGEBaGFzIGFjY3VtdWxhdGVkIHNpbmNlIHRoZWlyIGxhc3QgY2xhaW1lZCBwYXlvdXQgKE9SIHNpbmNlIGpvaW5pbmcgaWYgdGhpcyBpcyB0aGVpciBmaXJzdD0BdGltZSBjbGFpbWluZyByZXdhcmRzKS4gVGhlIHBheW91dCB3aWxsIGJlIHRyYW5zZmVycmVkIHRvIHRoZSBtZW1iZXIncyBhY2NvdW50LgBJAVRoZSBtZW1iZXIgd2lsbCBlYXJuIHJld2FyZHMgcHJvIHJhdGEgYmFzZWQgb24gdGhlIG1lbWJlcnMgc3Rha2UgdnMgdGhlIHN1bSBvZiB0aGXQbWVtYmVycyBpbiB0aGUgcG9vbHMgc3Rha2UuIFJld2FyZHMgZG8gbm90ICJleHBpcmUiLgBBAVNlZSBgY2xhaW1fcGF5b3V0X290aGVyYCB0byBjbGFpbSByZXdhcmRzIG9uIGJlaGFsZiBvZiBzb21lIGBvdGhlcmAgcG9vbCBtZW1iZXIuGHVuYm9uZAgBOG1lbWJlcl9hY2NvdW50xQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAFAdW5ib25kaW5nX3BvaW50c/wBMEJhbGFuY2VPZjxUPgADfEUBVW5ib25kIHVwIHRvIGB1bmJvbmRpbmdfcG9pbnRzYCBvZiB0aGUgYG1lbWJlcl9hY2NvdW50YCdzIGZ1bmRzIGZyb20gdGhlIHBvb2wuIEl0RQFpbXBsaWNpdGx5IGNvbGxlY3RzIHRoZSByZXdhcmRzIG9uZSBsYXN0IHRpbWUsIHNpbmNlIG5vdCBkb2luZyBzbyB3b3VsZCBtZWFuIHNvbWVscmV3YXJkcyB3b3VsZCBiZSBmb3JmZWl0ZWQuAE0BVW5kZXIgY2VydGFpbiBjb25kaXRpb25zLCB0aGlzIGNhbGwgY2FuIGJlIGRpc3BhdGNoZWQgcGVybWlzc2lvbmxlc3NseSAoaS5lLiBieSBhbnkkYWNjb3VudCkuAKwjIENvbmRpdGlvbnMgZm9yIGEgcGVybWlzc2lvbmxlc3MgZGlzcGF0Y2guAF0BKiBUaGUgcG9vbCBpcyBibG9ja2VkIGFuZCB0aGUgY2FsbGVyIGlzIGVpdGhlciB0aGUgcm9vdCBvciBib3VuY2VyLiBUaGlzIGlzIHJlZmVyZWVkIHRvMCAgYXMgYSBraWNrLvQqIFRoZSBwb29sIGlzIGRlc3Ryb3lpbmcgYW5kIHRoZSBtZW1iZXIgaXMgbm90IHRoZSBkZXBvc2l0b3IuVQEqIFRoZSBwb29sIGlzIGRlc3Ryb3lpbmcsIHRoZSBtZW1iZXIgaXMgdGhlIGRlcG9zaXRvciBhbmQgbm8gb3RoZXIgbWVtYmVycyBhcmUgaW4gdGhlHCAgcG9vbC4AEQEjIyBDb25kaXRpb25zIGZvciBwZXJtaXNzaW9uZWQgZGlzcGF0Y2ggKGkuZS4gdGhlIGNhbGxlciBpcyBhbHNvIHRoZUhgbWVtYmVyX2FjY291bnRgKToAiCogVGhlIGNhbGxlciBpcyBub3QgdGhlIGRlcG9zaXRvci5VASogVGhlIGNhbGxlciBpcyB0aGUgZGVwb3NpdG9yLCB0aGUgcG9vbCBpcyBkZXN0cm95aW5nIGFuZCBubyBvdGhlciBtZW1iZXJzIGFyZSBpbiB0aGUcICBwb29sLgAYIyBOb3RlAB0BSWYgdGhlcmUgYXJlIHRvbyBtYW55IHVubG9ja2luZyBjaHVua3MgdG8gdW5ib25kIHdpdGggdGhlIHBvb2wgYWNjb3VudCxRAVtgQ2FsbDo6cG9vbF93aXRoZHJhd191bmJvbmRlZGBdIGNhbiBiZSBjYWxsZWQgdG8gdHJ5IGFuZCBtaW5pbWl6ZSB1bmxvY2tpbmcgY2h1bmtzLlkBVGhlIFtgU3Rha2luZ0ludGVyZmFjZTo6dW5ib25kYF0gd2lsbCBpbXBsaWNpdGx5IGNhbGwgW2BDYWxsOjpwb29sX3dpdGhkcmF3X3VuYm9uZGVkYF1VAXRvIHRyeSB0byBmcmVlIGNodW5rcyBpZiBuZWNlc3NhcnkgKGllLiBpZiB1bmJvdW5kIHdhcyBjYWxsZWQgYW5kIG5vIHVubG9ja2luZyBjaHVua3NhAWFyZSBhdmFpbGFibGUpLiBIb3dldmVyLCBpdCBtYXkgbm90IGJlIHBvc3NpYmxlIHRvIHJlbGVhc2UgdGhlIGN1cnJlbnQgdW5sb2NraW5nIGNodW5rcyxdAWluIHdoaWNoIGNhc2UsIHRoZSByZXN1bHQgb2YgdGhpcyBjYWxsIHdpbGwgbGlrZWx5IGJlIHRoZSBgTm9Nb3JlQ2h1bmtzYCBlcnJvciBmcm9tIHRoZTxzdGFraW5nIHN5c3RlbS5YcG9vbF93aXRoZHJhd191bmJvbmRlZAgBHHBvb2xfaWQQARhQb29sSWQAAUhudW1fc2xhc2hpbmdfc3BhbnMQAQx1MzIABBhVAUNhbGwgYHdpdGhkcmF3X3VuYm9uZGVkYCBmb3IgdGhlIHBvb2xzIGFjY291bnQuIFRoaXMgY2FsbCBjYW4gYmUgbWFkZSBieSBhbnkgYWNjb3VudC4AQQFUaGlzIGlzIHVzZWZ1bCBpZiB0aGVyZSBhcmUgdG9vIG1hbnkgdW5sb2NraW5nIGNodW5rcyB0byBjYWxsIGB1bmJvbmRgLCBhbmQgc29tZWEBY2FuIGJlIGNsZWFyZWQgYnkgd2l0aGRyYXdpbmcuIEluIHRoZSBjYXNlIHRoZXJlIGFyZSB0b28gbWFueSB1bmxvY2tpbmcgY2h1bmtzLCB0aGUgdXNlclEBd291bGQgcHJvYmFibHkgc2VlIGFuIGVycm9yIGxpa2UgYE5vTW9yZUNodW5rc2AgZW1pdHRlZCBmcm9tIHRoZSBzdGFraW5nIHN5c3RlbSB3aGVuXHRoZXkgYXR0ZW1wdCB0byB1bmJvbmQuRHdpdGhkcmF3X3VuYm9uZGVkCAE4bWVtYmVyX2FjY291bnTFAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AAUhudW1fc2xhc2hpbmdfc3BhbnMQAQx1MzIABVhVAVdpdGhkcmF3IHVuYm9uZGVkIGZ1bmRzIGZyb20gYG1lbWJlcl9hY2NvdW50YC4gSWYgbm8gYm9uZGVkIGZ1bmRzIGNhbiBiZSB1bmJvbmRlZCwgYW5IZXJyb3IgaXMgcmV0dXJuZWQuAE0BVW5kZXIgY2VydGFpbiBjb25kaXRpb25zLCB0aGlzIGNhbGwgY2FuIGJlIGRpc3BhdGNoZWQgcGVybWlzc2lvbmxlc3NseSAoaS5lLiBieSBhbnkkYWNjb3VudCkuAKgjIENvbmRpdGlvbnMgZm9yIGEgcGVybWlzc2lvbmxlc3MgZGlzcGF0Y2gACQEqIFRoZSBwb29sIGlzIGluIGRlc3Ryb3kgbW9kZSBhbmQgdGhlIHRhcmdldCBpcyBub3QgdGhlIGRlcG9zaXRvci4xASogVGhlIHRhcmdldCBpcyB0aGUgZGVwb3NpdG9yIGFuZCB0aGV5IGFyZSB0aGUgb25seSBtZW1iZXIgaW4gdGhlIHN1YiBwb29scy4NASogVGhlIHBvb2wgaXMgYmxvY2tlZCBhbmQgdGhlIGNhbGxlciBpcyBlaXRoZXIgdGhlIHJvb3Qgb3IgYm91bmNlci4AmCMgQ29uZGl0aW9ucyBmb3IgcGVybWlzc2lvbmVkIGRpc3BhdGNoAOgqIFRoZSBjYWxsZXIgaXMgdGhlIHRhcmdldCBhbmQgdGhleSBhcmUgbm90IHRoZSBkZXBvc2l0b3IuABgjIE5vdGUA9C0gSWYgdGhlIHRhcmdldCBpcyB0aGUgZGVwb3NpdG9yLCB0aGUgcG9vbCB3aWxsIGJlIGRlc3Ryb3llZC5hAS0gSWYgdGhlIHBvb2wgaGFzIGFueSBwZW5kaW5nIHNsYXNoLCB3ZSBhbHNvIHRyeSB0byBzbGFzaCB0aGUgbWVtYmVyIGJlZm9yZSBsZXR0aW5nIHRoZW1dAXdpdGhkcmF3LiBUaGlzIGNhbGN1bGF0aW9uIGFkZHMgc29tZSB3ZWlnaHQgb3ZlcmhlYWQgYW5kIGlzIG9ubHkgZGVmZW5zaXZlLiBJbiByZWFsaXR5LFUBcG9vbCBzbGFzaGVzIG11c3QgaGF2ZSBiZWVuIGFscmVhZHkgYXBwbGllZCB2aWEgcGVybWlzc2lvbmxlc3MgW2BDYWxsOjphcHBseV9zbGFzaGBdLhhjcmVhdGUQARhhbW91bnT8ATBCYWxhbmNlT2Y8VD4AARByb290xQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEkbm9taW5hdG9yxQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEcYm91bmNlcsUBAVBBY2NvdW50SWRMb29rdXBPZjxUPgAGRHRDcmVhdGUgYSBuZXcgZGVsZWdhdGlvbiBwb29sLgAsIyBBcmd1bWVudHMAVQEqIGBhbW91bnRgIC0gVGhlIGFtb3VudCBvZiBmdW5kcyB0byBkZWxlZ2F0ZSB0byB0aGUgcG9vbC4gVGhpcyBhbHNvIGFjdHMgb2YgYSBzb3J0IG9mTQEgIGRlcG9zaXQgc2luY2UgdGhlIHBvb2xzIGNyZWF0b3IgY2Fubm90IGZ1bGx5IHVuYm9uZCBmdW5kcyB1bnRpbCB0aGUgcG9vbCBpcyBiZWluZzAgIGRlc3Ryb3llZC5RASogYGluZGV4YCAtIEEgZGlzYW1iaWd1YXRpb24gaW5kZXggZm9yIGNyZWF0aW5nIHRoZSBhY2NvdW50LiBMaWtlbHkgb25seSB1c2VmdWwgd2hlbsAgIGNyZWF0aW5nIG11bHRpcGxlIHBvb2xzIGluIHRoZSBzYW1lIGV4dHJpbnNpYy7UKiBgcm9vdGAgLSBUaGUgYWNjb3VudCB0byBzZXQgYXMgW2BQb29sUm9sZXM6OnJvb3RgXS4NASogYG5vbWluYXRvcmAgLSBUaGUgYWNjb3VudCB0byBzZXQgYXMgdGhlIFtgUG9vbFJvbGVzOjpub21pbmF0b3JgXS78KiBgYm91bmNlcmAgLSBUaGUgYWNjb3VudCB0byBzZXQgYXMgdGhlIFtgUG9vbFJvbGVzOjpib3VuY2VyYF0uABgjIE5vdGUAYQFJbiBhZGRpdGlvbiB0byBgYW1vdW50YCwgdGhlIGNhbGxlciB3aWxsIHRyYW5zZmVyIHRoZSBleGlzdGVudGlhbCBkZXBvc2l0OyBzbyB0aGUgY2FsbGVyDQFuZWVkcyBhdCBoYXZlIGF0IGxlYXN0IGBhbW91bnQgKyBleGlzdGVudGlhbF9kZXBvc2l0YCB0cmFuc2ZlcmFibGUuTGNyZWF0ZV93aXRoX3Bvb2xfaWQUARhhbW91bnT8ATBCYWxhbmNlT2Y8VD4AARByb290xQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEkbm9taW5hdG9yxQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEcYm91bmNlcsUBAVBBY2NvdW50SWRMb29rdXBPZjxUPgABHHBvb2xfaWQQARhQb29sSWQABxjsQ3JlYXRlIGEgbmV3IGRlbGVnYXRpb24gcG9vbCB3aXRoIGEgcHJldmlvdXNseSB1c2VkIHBvb2wgaWQALCMgQXJndW1lbnRzAJhzYW1lIGFzIGBjcmVhdGVgIHdpdGggdGhlIGluY2x1c2lvbiBvZngqIGBwb29sX2lkYCAtIGBBIHZhbGlkIFBvb2xJZC4gbm9taW5hdGUIARxwb29sX2lkEAEYUG9vbElkAAEodmFsaWRhdG9yc9EBAURWZWM8VDo6QWNjb3VudElkPgAIMHxOb21pbmF0ZSBvbiBiZWhhbGYgb2YgdGhlIHBvb2wuAEUBVGhlIGRpc3BhdGNoIG9yaWdpbiBvZiB0aGlzIGNhbGwgbXVzdCBiZSBzaWduZWQgYnkgdGhlIHBvb2wgbm9taW5hdG9yIG9yIHRoZSBwb29sKHJvb3Qgcm9sZS4ASQFUaGlzIGRpcmVjdGx5IGZvcndhcmQgdGhlIGNhbGwgdG8gdGhlIHN0YWtpbmcgcGFsbGV0LCBvbiBiZWhhbGYgb2YgdGhlIHBvb2wgYm9uZGVkIGFjY291bnQuABgjIE5vdGUAXQFJbiBhZGRpdGlvbiB0byBhIGByb290YCBvciBgbm9taW5hdG9yYCByb2xlIG9mIGBvcmlnaW5gLCBwb29sJ3MgZGVwb3NpdG9yIG5lZWRzIHRvIGhhdmX4YXQgbGVhc3QgYGRlcG9zaXRvcl9taW5fYm9uZGAgaW4gdGhlIHBvb2wgdG8gc3RhcnQgbm9taW5hdGluZy4kc2V0X3N0YXRlCAEccG9vbF9pZBABGFBvb2xJZAABFHN0YXRlIQQBJFBvb2xTdGF0ZQAJKHRTZXQgYSBuZXcgc3RhdGUgZm9yIHRoZSBwb29sLgBVAUlmIGEgcG9vbCBpcyBhbHJlYWR5IGluIHRoZSBgRGVzdHJveWluZ2Agc3RhdGUsIHRoZW4gdW5kZXIgbm8gY29uZGl0aW9uIGNhbiBpdHMgc3RhdGU0Y2hhbmdlIGFnYWluLgDAVGhlIGRpc3BhdGNoIG9yaWdpbiBvZiB0aGlzIGNhbGwgbXVzdCBiZSBlaXRoZXI6ANwxLiBzaWduZWQgYnkgdGhlIGJvdW5jZXIsIG9yIHRoZSByb290IHJvbGUgb2YgdGhlIHBvb2wsXQEyLiBpZiB0aGUgcG9vbCBjb25kaXRpb25zIHRvIGJlIG9wZW4gYXJlIE5PVCBtZXQgKGFzIGRlc2NyaWJlZCBieSBgb2tfdG9fYmVfb3BlbmApLCBhbmQ5ASAgIHRoZW4gdGhlIHN0YXRlIG9mIHRoZSBwb29sIGNhbiBiZSBwZXJtaXNzaW9ubGVzc2x5IGNoYW5nZWQgdG8gYERlc3Ryb3lpbmdgLjBzZXRfbWV0YWRhdGEIARxwb29sX2lkEAEYUG9vbElkAAEgbWV0YWRhdGE4ARxWZWM8dTg+AAoQgFNldCBhIG5ldyBtZXRhZGF0YSBmb3IgdGhlIHBvb2wuAF0BVGhlIGRpc3BhdGNoIG9yaWdpbiBvZiB0aGlzIGNhbGwgbXVzdCBiZSBzaWduZWQgYnkgdGhlIGJvdW5jZXIsIG9yIHRoZSByb290IHJvbGUgb2YgdGhlFHBvb2wuLHNldF9jb25maWdzGAE0bWluX2pvaW5fYm9uZCUEAVhDb25maWdPcDxCYWxhbmNlT2Y8VD4+AAE8bWluX2NyZWF0ZV9ib25kJQQBWENvbmZpZ09wPEJhbGFuY2VPZjxUPj4AASRtYXhfcG9vbHMpBAE0Q29uZmlnT3A8dTMyPgABLG1heF9tZW1iZXJzKQQBNENvbmZpZ09wPHUzMj4AAVBtYXhfbWVtYmVyc19wZXJfcG9vbCkEATRDb25maWdPcDx1MzI+AAFUZ2xvYmFsX21heF9jb21taXNzaW9uLQQBRENvbmZpZ09wPFBlcmJpbGw+AAssQQFVcGRhdGUgY29uZmlndXJhdGlvbnMgZm9yIHRoZSBub21pbmF0aW9uIHBvb2xzLiBUaGUgb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZWBbYENvbmZpZzo6QWRtaW5PcmlnaW5gXS4ALCMgQXJndW1lbnRzAKAqIGBtaW5fam9pbl9ib25kYCAtIFNldCBbYE1pbkpvaW5Cb25kYF0usCogYG1pbl9jcmVhdGVfYm9uZGAgLSBTZXQgW2BNaW5DcmVhdGVCb25kYF0uhCogYG1heF9wb29sc2AgLSBTZXQgW2BNYXhQb29sc2BdLqQqIGBtYXhfbWVtYmVyc2AgLSBTZXQgW2BNYXhQb29sTWVtYmVyc2BdLuQqIGBtYXhfbWVtYmVyc19wZXJfcG9vbGAgLSBTZXQgW2BNYXhQb29sTWVtYmVyc1BlclBvb2xgXS7gKiBgZ2xvYmFsX21heF9jb21taXNzaW9uYCAtIFNldCBbYEdsb2JhbE1heENvbW1pc3Npb25gXS4wdXBkYXRlX3JvbGVzEAEccG9vbF9pZBABGFBvb2xJZAABIG5ld19yb290MQQBWENvbmZpZ09wPFQ6OkFjY291bnRJZD4AATRuZXdfbm9taW5hdG9yMQQBWENvbmZpZ09wPFQ6OkFjY291bnRJZD4AASxuZXdfYm91bmNlcjEEAVhDb25maWdPcDxUOjpBY2NvdW50SWQ+AAwcdFVwZGF0ZSB0aGUgcm9sZXMgb2YgdGhlIHBvb2wuAD0BVGhlIHJvb3QgaXMgdGhlIG9ubHkgZW50aXR5IHRoYXQgY2FuIGNoYW5nZSBhbnkgb2YgdGhlIHJvbGVzLCBpbmNsdWRpbmcgaXRzZWxmLLhleGNsdWRpbmcgdGhlIGRlcG9zaXRvciwgd2hvIGNhbiBuZXZlciBjaGFuZ2UuAFEBSXQgZW1pdHMgYW4gZXZlbnQsIG5vdGlmeWluZyBVSXMgb2YgdGhlIHJvbGUgY2hhbmdlLiBUaGlzIGV2ZW50IGlzIHF1aXRlIHJlbGV2YW50IHRvHQFtb3N0IHBvb2wgbWVtYmVycyBhbmQgdGhleSBzaG91bGQgYmUgaW5mb3JtZWQgb2YgY2hhbmdlcyB0byBwb29sIHJvbGVzLhRjaGlsbAQBHHBvb2xfaWQQARhQb29sSWQADUBwQ2hpbGwgb24gYmVoYWxmIG9mIHRoZSBwb29sLgBBAVRoZSBkaXNwYXRjaCBvcmlnaW4gb2YgdGhpcyBjYWxsIGNhbiBiZSBzaWduZWQgYnkgdGhlIHBvb2wgbm9taW5hdG9yIG9yIHRoZSBwb29soHJvb3Qgcm9sZSwgc2FtZSBhcyBbYFBhbGxldDo6bm9taW5hdGVgXS4ATQFVbmRlciBjZXJ0YWluIGNvbmRpdGlvbnMsIHRoaXMgY2FsbCBjYW4gYmUgZGlzcGF0Y2hlZCBwZXJtaXNzaW9ubGVzc2x5IChpLmUuIGJ5IGFueSRhY2NvdW50KS4ArCMgQ29uZGl0aW9ucyBmb3IgYSBwZXJtaXNzaW9ubGVzcyBkaXNwYXRjaDpZASogV2hlbiBwb29sIGRlcG9zaXRvciBoYXMgbGVzcyB0aGFuIGBNaW5Ob21pbmF0b3JCb25kYCBzdGFrZWQsIG90aGVyd2lzZSAgcG9vbCBtZW1iZXJzXCAgYXJlIHVuYWJsZSB0byB1bmJvbmQuAJwjIENvbmRpdGlvbnMgZm9yIHBlcm1pc3Npb25lZCBkaXNwYXRjaDrYKiBUaGUgY2FsbGVyIGhhcyBhIG5vbWluYXRvciBvciByb290IHJvbGUgb2YgdGhlIHBvb2wuSQFUaGlzIGRpcmVjdGx5IGZvcndhcmQgdGhlIGNhbGwgdG8gdGhlIHN0YWtpbmcgcGFsbGV0LCBvbiBiZWhhbGYgb2YgdGhlIHBvb2wgYm9uZGVkIGFjY291bnQuQGJvbmRfZXh0cmFfb3RoZXIIARhtZW1iZXLFAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AARRleHRyYR0EAVxCb25kRXh0cmE8QmFsYW5jZU9mPFQ+PgAOJFUBYG9yaWdpbmAgYm9uZHMgZnVuZHMgZnJvbSBgZXh0cmFgIGZvciBzb21lIHBvb2wgbWVtYmVyIGBtZW1iZXJgIGludG8gdGhlaXIgcmVzcGVjdGl2ZRhwb29scy4ASQFgb3JpZ2luYCBjYW4gYm9uZCBleHRyYSBmdW5kcyBmcm9tIGZyZWUgYmFsYW5jZSBvciBwZW5kaW5nIHJld2FyZHMgd2hlbiBgb3JpZ2luID09HG90aGVyYC4ARQFJbiB0aGUgY2FzZSBvZiBgb3JpZ2luICE9IG90aGVyYCwgYG9yaWdpbmAgY2FuIG9ubHkgYm9uZCBleHRyYSBwZW5kaW5nIHJld2FyZHMgb2YVAWBvdGhlcmAgbWVtYmVycyBhc3N1bWluZyBzZXRfY2xhaW1fcGVybWlzc2lvbiBmb3IgdGhlIGdpdmVuIG1lbWJlciBpc8BgUGVybWlzc2lvbmxlc3NDb21wb3VuZGAgb3IgYFBlcm1pc3Npb25sZXNzQWxsYC5Qc2V0X2NsYWltX3Blcm1pc3Npb24EAShwZXJtaXNzaW9uNQQBPENsYWltUGVybWlzc2lvbgAPHEkBQWxsb3dzIGEgcG9vbCBtZW1iZXIgdG8gc2V0IGEgY2xhaW0gcGVybWlzc2lvbiB0byBhbGxvdyBvciBkaXNhbGxvdyBwZXJtaXNzaW9ubGVzc2Bib25kaW5nIGFuZCB3aXRoZHJhd2luZy4ALCMgQXJndW1lbnRzAHgqIGBvcmlnaW5gIC0gTWVtYmVyIG9mIGEgcG9vbC64KiBgcGVybWlzc2lvbmAgLSBUaGUgcGVybWlzc2lvbiB0byBiZSBhcHBsaWVkLkhjbGFpbV9wYXlvdXRfb3RoZXIEARRvdGhlcgABMFQ6OkFjY291bnRJZAAQEAEBYG9yaWdpbmAgY2FuIGNsYWltIHBheW91dHMgb24gc29tZSBwb29sIG1lbWJlciBgb3RoZXJgJ3MgYmVoYWxmLgBVAVBvb2wgbWVtYmVyIGBvdGhlcmAgbXVzdCBoYXZlIGEgYFBlcm1pc3Npb25sZXNzV2l0aGRyYXdgIG9yIGBQZXJtaXNzaW9ubGVzc0FsbGAgY2xhaW2ocGVybWlzc2lvbiBmb3IgdGhpcyBjYWxsIHRvIGJlIHN1Y2Nlc3NmdWwuOHNldF9jb21taXNzaW9uCAEccG9vbF9pZBABGFBvb2xJZAABOG5ld19jb21taXNzaW9uOQQBfE9wdGlvbjwoUGVyYmlsbCwgVDo6QWNjb3VudElkKT4AERR0U2V0IHRoZSBjb21taXNzaW9uIG9mIGEgcG9vbC5VAUJvdGggYSBjb21taXNzaW9uIHBlcmNlbnRhZ2UgYW5kIGEgY29tbWlzc2lvbiBwYXllZSBtdXN0IGJlIHByb3ZpZGVkIGluIHRoZSBgY3VycmVudGBdAXR1cGxlLiBXaGVyZSBhIGBjdXJyZW50YCBvZiBgTm9uZWAgaXMgcHJvdmlkZWQsIGFueSBjdXJyZW50IGNvbW1pc3Npb24gd2lsbCBiZSByZW1vdmVkLgBNAS0gSWYgYSBgTm9uZWAgaXMgc3VwcGxpZWQgdG8gYG5ld19jb21taXNzaW9uYCwgZXhpc3RpbmcgY29tbWlzc2lvbiB3aWxsIGJlIHJlbW92ZWQuSHNldF9jb21taXNzaW9uX21heAgBHHBvb2xfaWQQARhQb29sSWQAAThtYXhfY29tbWlzc2lvbqwBHFBlcmJpbGwAEhSUU2V0IHRoZSBtYXhpbXVtIGNvbW1pc3Npb24gb2YgYSBwb29sLgA5AS0gSW5pdGlhbCBtYXggY2FuIGJlIHNldCB0byBhbnkgYFBlcmJpbGxgLCBhbmQgb25seSBzbWFsbGVyIHZhbHVlcyB0aGVyZWFmdGVyLjUBLSBDdXJyZW50IGNvbW1pc3Npb24gd2lsbCBiZSBsb3dlcmVkIGluIHRoZSBldmVudCBpdCBpcyBoaWdoZXIgdGhhbiBhIG5ldyBtYXg0ICBjb21taXNzaW9uLmhzZXRfY29tbWlzc2lvbl9jaGFuZ2VfcmF0ZQgBHHBvb2xfaWQQARhQb29sSWQAASxjaGFuZ2VfcmF0ZUEEAZxDb21taXNzaW9uQ2hhbmdlUmF0ZTxCbG9ja051bWJlckZvcjxUPj4AExCoU2V0IHRoZSBjb21taXNzaW9uIGNoYW5nZSByYXRlIGZvciBhIHBvb2wuAD0BSW5pdGlhbCBjaGFuZ2UgcmF0ZSBpcyBub3QgYm91bmRlZCwgd2hlcmVhcyBzdWJzZXF1ZW50IHVwZGF0ZXMgY2FuIG9ubHkgYmUgbW9yZXRyZXN0cmljdGl2ZSB0aGFuIHRoZSBjdXJyZW50LkBjbGFpbV9jb21taXNzaW9uBAEccG9vbF9pZBABGFBvb2xJZAAUFGRDbGFpbSBwZW5kaW5nIGNvbW1pc3Npb24uAF0BVGhlIGRpc3BhdGNoIG9yaWdpbiBvZiB0aGlzIGNhbGwgbXVzdCBiZSBzaWduZWQgYnkgdGhlIGByb290YCByb2xlIG9mIHRoZSBwb29sLiBQZW5kaW5nXQFjb21taXNzaW9uIGlzIHBhaWQgb3V0IGFuZCBhZGRlZCB0byB0b3RhbCBjbGFpbWVkIGNvbW1pc3Npb25gLiBUb3RhbCBwZW5kaW5nIGNvbW1pc3Npb254aXMgcmVzZXQgdG8gemVyby4gdGhlIGN1cnJlbnQuTGFkanVzdF9wb29sX2RlcG9zaXQEARxwb29sX2lkEAEYUG9vbElkABUc7FRvcCB1cCB0aGUgZGVmaWNpdCBvciB3aXRoZHJhdyB0aGUgZXhjZXNzIEVEIGZyb20gdGhlIHBvb2wuAFEBV2hlbiBhIHBvb2wgaXMgY3JlYXRlZCwgdGhlIHBvb2wgZGVwb3NpdG9yIHRyYW5zZmVycyBFRCB0byB0aGUgcmV3YXJkIGFjY291bnQgb2YgdGhlVQFwb29sLiBFRCBpcyBzdWJqZWN0IHRvIGNoYW5nZSBhbmQgb3ZlciB0aW1lLCB0aGUgZGVwb3NpdCBpbiB0aGUgcmV3YXJkIGFjY291bnQgbWF5IGJlUQFpbnN1ZmZpY2llbnQgdG8gY292ZXIgdGhlIEVEIGRlZmljaXQgb2YgdGhlIHBvb2wgb3IgdmljZS12ZXJzYSB3aGVyZSB0aGVyZSBpcyBleGNlc3MxAWRlcG9zaXQgdG8gdGhlIHBvb2wuIFRoaXMgY2FsbCBhbGxvd3MgYW55b25lIHRvIGFkanVzdCB0aGUgRUQgZGVwb3NpdCBvZiB0aGX0cG9vbCBieSBlaXRoZXIgdG9wcGluZyB1cCB0aGUgZGVmaWNpdCBvciBjbGFpbWluZyB0aGUgZXhjZXNzLnxzZXRfY29tbWlzc2lvbl9jbGFpbV9wZXJtaXNzaW9uCAEccG9vbF9pZBABGFBvb2xJZAABKHBlcm1pc3Npb25FBAG8T3B0aW9uPENvbW1pc3Npb25DbGFpbVBlcm1pc3Npb248VDo6QWNjb3VudElkPj4AFhDMU2V0IG9yIHJlbW92ZSBhIHBvb2wncyBjb21taXNzaW9uIGNsYWltIHBlcm1pc3Npb24uAGEBRGV0ZXJtaW5lcyB3aG8gY2FuIGNsYWltIHRoZSBwb29sJ3MgcGVuZGluZyBjb21taXNzaW9uLiBPbmx5IHRoZSBgUm9vdGAgcm9sZSBvZiB0aGUgcG9vbMhpcyBhYmxlIHRvIGNvbmZpZ3VyZSBjb21taXNzaW9uIGNsYWltIHBlcm1pc3Npb25zLixhcHBseV9zbGFzaAQBOG1lbWJlcl9hY2NvdW50xQEBUEFjY291bnRJZExvb2t1cE9mPFQ+ABcciEFwcGx5IGEgcGVuZGluZyBzbGFzaCBvbiBhIG1lbWJlci4AJQFGYWlscyB1bmxlc3MgW2BjcmF0ZTo6cGFsbGV0OjpDb25maWc6OlN0YWtlQWRhcHRlcmBdIGlzIG9mIHN0cmF0ZWd5IHR5cGU6pFtgYWRhcHRlcjo6U3Rha2VTdHJhdGVneVR5cGU6OkRlbGVnYXRlYF0uAFUBVGhpcyBjYWxsIGNhbiBiZSBkaXNwYXRjaGVkIHBlcm1pc3Npb25sZXNzbHkgKGkuZS4gYnkgYW55IGFjY291bnQpLiBJZiB0aGUgbWVtYmVyIGhhcx0Bc2xhc2ggdG8gYmUgYXBwbGllZCwgY2FsbGVyIG1heSBiZSByZXdhcmRlZCB3aXRoIHRoZSBwYXJ0IG9mIHRoZSBzbGFzaC5IbWlncmF0ZV9kZWxlZ2F0aW9uBAE4bWVtYmVyX2FjY291bnTFAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AGCQdAU1pZ3JhdGVzIGRlbGVnYXRlZCBmdW5kcyBmcm9tIHRoZSBwb29sIGFjY291bnQgdG8gdGhlIGBtZW1iZXJfYWNjb3VudGAuACUBRmFpbHMgdW5sZXNzIFtgY3JhdGU6OnBhbGxldDo6Q29uZmlnOjpTdGFrZUFkYXB0ZXJgXSBpcyBvZiBzdHJhdGVneSB0eXBlOqRbYGFkYXB0ZXI6OlN0YWtlU3RyYXRlZ3lUeXBlOjpEZWxlZ2F0ZWBdLgApAVRoaXMgaXMgYSBwZXJtaXNzaW9uLWxlc3MgY2FsbCBhbmQgcmVmdW5kcyBhbnkgZmVlIGlmIGNsYWltIGlzIHN1Y2Nlc3NmdWwuAF0BSWYgdGhlIHBvb2wgaGFzIG1pZ3JhdGVkIHRvIGRlbGVnYXRpb24gYmFzZWQgc3Rha2luZywgdGhlIHN0YWtlZCB0b2tlbnMgb2YgcG9vbCBtZW1iZXJzKQFjYW4gYmUgbW92ZWQgYW5kIGhlbGQgaW4gdGhlaXIgb3duIGFjY291bnQuIFNlZSBbYGFkYXB0ZXI6OkRlbGVnYXRlU3Rha2VgXXhtaWdyYXRlX3Bvb2xfdG9fZGVsZWdhdGVfc3Rha2UEARxwb29sX2lkEAEYUG9vbElkABkk9E1pZ3JhdGUgcG9vbCBmcm9tIFtgYWRhcHRlcjo6U3Rha2VTdHJhdGVneVR5cGU6OlRyYW5zZmVyYF0gdG+kW2BhZGFwdGVyOjpTdGFrZVN0cmF0ZWd5VHlwZTo6RGVsZWdhdGVgXS4AJQFGYWlscyB1bmxlc3MgW2BjcmF0ZTo6cGFsbGV0OjpDb25maWc6OlN0YWtlQWRhcHRlcmBdIGlzIG9mIHN0cmF0ZWd5IHR5cGU6pFtgYWRhcHRlcjo6U3Rha2VTdHJhdGVneVR5cGU6OkRlbGVnYXRlYF0uAEEBVGhpcyBjYWxsIGNhbiBiZSBkaXNwYXRjaGVkIHBlcm1pc3Npb25sZXNzbHksIGFuZCByZWZ1bmRzIGFueSBmZWUgaWYgc3VjY2Vzc2Z1bC4ASQFJZiB0aGUgcG9vbCBoYXMgYWxyZWFkeSBtaWdyYXRlZCB0byBkZWxlZ2F0aW9uIGJhc2VkIHN0YWtpbmcsIHRoaXMgY2FsbCB3aWxsIGZhaWwuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLh0ECFxwYWxsZXRfbm9taW5hdGlvbl9wb29scyRCb25kRXh0cmEEHEJhbGFuY2UBGAEILEZyZWVCYWxhbmNlBAAYARxCYWxhbmNlAAAAHFJld2FyZHMAAQAAIQQIXHBhbGxldF9ub21pbmF0aW9uX3Bvb2xzJFBvb2xTdGF0ZQABDBBPcGVuAAAAHEJsb2NrZWQAAQAoRGVzdHJveWluZwACAAAlBAhccGFsbGV0X25vbWluYXRpb25fcG9vbHMgQ29uZmlnT3AEBFQBGAEMEE5vb3AAAAAMU2V0BAAYAQRUAAEAGFJlbW92ZQACAAApBAhccGFsbGV0X25vbWluYXRpb25fcG9vbHMgQ29uZmlnT3AEBFQBEAEMEE5vb3AAAAAMU2V0BAAQAQRUAAEAGFJlbW92ZQACAAAtBAhccGFsbGV0X25vbWluYXRpb25fcG9vbHMgQ29uZmlnT3AEBFQBrAEMEE5vb3AAAAAMU2V0BACsAQRUAAEAGFJlbW92ZQACAAAxBAhccGFsbGV0X25vbWluYXRpb25fcG9vbHMgQ29uZmlnT3AEBFQBAAEMEE5vb3AAAAAMU2V0BAAAAQRUAAEAGFJlbW92ZQACAAA1BAhccGFsbGV0X25vbWluYXRpb25fcG9vbHM8Q2xhaW1QZXJtaXNzaW9uAAEQMFBlcm1pc3Npb25lZAAAAFhQZXJtaXNzaW9ubGVzc0NvbXBvdW5kAAEAWFBlcm1pc3Npb25sZXNzV2l0aGRyYXcAAgBEUGVybWlzc2lvbmxlc3NBbGwAAwAAOQQEGE9wdGlvbgQEVAE9BAEIEE5vbmUAAAAQU29tZQQAPQQAAAEAAD0EAAAECKwAAEEECFxwYWxsZXRfbm9taW5hdGlvbl9wb29sc1BDb21taXNzaW9uQ2hhbmdlUmF0ZQQsQmxvY2tOdW1iZXIBEAAIATBtYXhfaW5jcmVhc2WsARxQZXJiaWxsAAEkbWluX2RlbGF5EAEsQmxvY2tOdW1iZXIAAEUEBBhPcHRpb24EBFQBSQQBCBBOb25lAAAAEFNvbWUEAEkEAAABAABJBAhccGFsbGV0X25vbWluYXRpb25fcG9vbHNkQ29tbWlzc2lvbkNsYWltUGVybWlzc2lvbgQkQWNjb3VudElkAQABCDhQZXJtaXNzaW9ubGVzcwAAABxBY2NvdW50BAAAASRBY2NvdW50SWQAAQAATQQMTHBhbGxldF9mYXN0X3Vuc3Rha2UYcGFsbGV0EENhbGwEBFQAAQxUcmVnaXN0ZXJfZmFzdF91bnN0YWtlAABoiFJlZ2lzdGVyIG9uZXNlbGYgZm9yIGZhc3QtdW5zdGFrZS4ASCMjIERpc3BhdGNoIE9yaWdpbgBFAVRoZSBkaXNwYXRjaCBvcmlnaW4gb2YgdGhpcyBjYWxsIG11c3QgYmUgKnNpZ25lZCogYnkgd2hvZXZlciBpcyBwZXJtaXR0ZWQgdG8gY2FsbPB1bmJvbmQgZnVuZHMgYnkgdGhlIHN0YWtpbmcgc3lzdGVtLiBTZWUgW2BDb25maWc6OlN0YWtpbmdgXS4AKCMjIERldGFpbHMAOQFUaGUgc3Rhc2ggYXNzb2NpYXRlZCB3aXRoIHRoZSBvcmlnaW4gbXVzdCBoYXZlIG5vIG9uZ29pbmcgdW5sb2NraW5nIGNodW5rcy4gSWZdAXN1Y2Nlc3NmdWwsIHRoaXMgd2lsbCBmdWxseSB1bmJvbmQgYW5kIGNoaWxsIHRoZSBzdGFzaC4gVGhlbiwgaXQgd2lsbCBlbnF1ZXVlIHRoZSBzdGFzaIB0byBiZSBjaGVja2VkIGluIGZ1cnRoZXIgYmxvY2tzLgBRAUlmIGJ5IHRoZSB0aW1lIHRoaXMgaXMgY2FsbGVkLCB0aGUgc3Rhc2ggaXMgYWN0dWFsbHkgZWxpZ2libGUgZm9yIGZhc3QtdW5zdGFrZSwgdGhlbkUBdGhleSBhcmUgZ3VhcmFudGVlZCB0byByZW1haW4gZWxpZ2libGUsIGJlY2F1c2UgdGhlIGNhbGwgd2lsbCBjaGlsbCB0aGVtIGFzIHdlbGwuAD0BSWYgdGhlIGNoZWNrIHdvcmtzLCB0aGUgZW50aXJlIHN0YWtpbmcgZGF0YSBpcyByZW1vdmVkLCBpLmUuIHRoZSBzdGFzaCBpcyBmdWxseSR1bnN0YWtlZC4AXQFJZiB0aGUgY2hlY2sgZmFpbHMsIHRoZSBzdGFzaCByZW1haW5zIGNoaWxsZWQgYW5kIHdhaXRpbmcgZm9yIGJlaW5nIHVuYm9uZGVkIGFzIGluIHdpdGhhAXRoZSBub3JtYWwgc3Rha2luZyBzeXN0ZW0sIGJ1dCB0aGV5IGxvc2UgcGFydCBvZiB0aGVpciB1bmJvbmRpbmcgY2h1bmtzIGR1ZSB0byBjb25zdW1pbmdYdGhlIGNoYWluJ3MgcmVzb3VyY2VzLgAkIyMgRXZlbnRzAAkBU29tZSBldmVudHMgZnJvbSB0aGUgc3Rha2luZyBhbmQgY3VycmVuY3kgc3lzdGVtIG1pZ2h0IGJlIGVtaXR0ZWQuKGRlcmVnaXN0ZXIAAUikRGVyZWdpc3RlciBvbmVzZWxmIGZyb20gdGhlIGZhc3QtdW5zdGFrZS4ASCMjIERpc3BhdGNoIE9yaWdpbgBFAVRoZSBkaXNwYXRjaCBvcmlnaW4gb2YgdGhpcyBjYWxsIG11c3QgYmUgKnNpZ25lZCogYnkgd2hvZXZlciBpcyBwZXJtaXR0ZWQgdG8gY2FsbPB1bmJvbmQgZnVuZHMgYnkgdGhlIHN0YWtpbmcgc3lzdGVtLiBTZWUgW2BDb25maWc6OlN0YWtpbmdgXS4AKCMjIERldGFpbHMAYQFUaGlzIGlzIHVzZWZ1bCBpZiBvbmUgaXMgcmVnaXN0ZXJlZCwgdGhleSBhcmUgc3RpbGwgd2FpdGluZywgYW5kIHRoZXkgY2hhbmdlIHRoZWlyIG1pbmQuAFkBTm90ZSB0aGF0IHRoZSBhc3NvY2lhdGVkIHN0YXNoIGlzIHN0aWxsIGZ1bGx5IHVuYm9uZGVkIGFuZCBjaGlsbGVkIGFzIGEgY29uc2VxdWVuY2Ugb2ZZAWNhbGxpbmcgW2BQYWxsZXQ6OnJlZ2lzdGVyX2Zhc3RfdW5zdGFrZWBdLiBUaGVyZWZvcmUsIHRoaXMgc2hvdWxkIHByb2JhYmx5IGJlIGZvbGxvd2VksGJ5IGEgY2FsbCB0byBgcmVib25kYCBpbiB0aGUgc3Rha2luZyBzeXN0ZW0uACQjIyBFdmVudHMACQFTb21lIGV2ZW50cyBmcm9tIHRoZSBzdGFraW5nIGFuZCBjdXJyZW5jeSBzeXN0ZW0gbWlnaHQgYmUgZW1pdHRlZC4cY29udHJvbAQBNGVyYXNfdG9fY2hlY2sQASBFcmFJbmRleAACNJRDb250cm9sIHRoZSBvcGVyYXRpb24gb2YgdGhpcyBwYWxsZXQuAEgjIyBEaXNwYXRjaCBPcmlnaW4ADQFUaGUgZGlzcGF0Y2ggb3JpZ2luIG9mIHRoaXMgY2FsbCBtdXN0IGJlIFtgQ29uZmlnOjpDb250cm9sT3JpZ2luYF0uACgjIyBEZXRhaWxzAEEBQ2FuIHNldCB0aGUgbnVtYmVyIG9mIGVyYXMgdG8gY2hlY2sgcGVyIGJsb2NrLCBhbmQgcG90ZW50aWFsbHkgb3RoZXIgYWRtaW4gd29yay4AJCMjIEV2ZW50cwCkTm8gZXZlbnRzIGFyZSBlbWl0dGVkIGZyb20gdGhpcyBkaXNwYXRjaC4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMuUQQQbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWluczRjb25maWd1cmF0aW9uGHBhbGxldBBDYWxsBARUAAHAfHNldF92YWxpZGF0aW9uX3VwZ3JhZGVfY29vbGRvd24EAQxuZXcQAURCbG9ja051bWJlckZvcjxUPgAABJBTZXQgdGhlIHZhbGlkYXRpb24gdXBncmFkZSBjb29sZG93bi5wc2V0X3ZhbGlkYXRpb25fdXBncmFkZV9kZWxheQQBDG5ldxABREJsb2NrTnVtYmVyRm9yPFQ+AAEEhFNldCB0aGUgdmFsaWRhdGlvbiB1cGdyYWRlIGRlbGF5LmRzZXRfY29kZV9yZXRlbnRpb25fcGVyaW9kBAEMbmV3EAFEQmxvY2tOdW1iZXJGb3I8VD4AAgTQU2V0IHRoZSBhY2NlcHRhbmNlIHBlcmlvZCBmb3IgYW4gaW5jbHVkZWQgY2FuZGlkYXRlLkRzZXRfbWF4X2NvZGVfc2l6ZQQBDG5ldxABDHUzMgADBNxTZXQgdGhlIG1heCB2YWxpZGF0aW9uIGNvZGUgc2l6ZSBmb3IgaW5jb21pbmcgdXBncmFkZXMuQHNldF9tYXhfcG92X3NpemUEAQxuZXcQAQx1MzIABATEU2V0IHRoZSBtYXggUE9WIGJsb2NrIHNpemUgZm9yIGluY29taW5nIHVwZ3JhZGVzLlhzZXRfbWF4X2hlYWRfZGF0YV9zaXplBAEMbmV3EAEMdTMyAAUElFNldCB0aGUgbWF4IGhlYWQgZGF0YSBzaXplIGZvciBwYXJhcy5Ic2V0X2NvcmV0aW1lX2NvcmVzBAEMbmV3EAEMdTMyAAYQrFNldCB0aGUgbnVtYmVyIG9mIGNvcmV0aW1lIGV4ZWN1dGlvbiBjb3Jlcy4AUQFOT1RFOiB0aGF0IHRoaXMgY29uZmlndXJhdGlvbiBpcyBtYW5hZ2VkIGJ5IHRoZSBjb3JldGltZSBjaGFpbi4gT25seSBtYW51YWxseSBjaGFuZ2WwdGhpcywgaWYgeW91IHJlYWxseSBrbm93IHdoYXQgeW91IGFyZSBkb2luZyF0c2V0X21heF9hdmFpbGFiaWxpdHlfdGltZW91dHMEAQxuZXcQAQx1MzIABwRBAVNldCB0aGUgbWF4IG51bWJlciBvZiB0aW1lcyBhIGNsYWltIG1heSB0aW1lb3V0IG9uIGEgY29yZSBiZWZvcmUgaXQgaXMgYWJhbmRvbmVkcHNldF9ncm91cF9yb3RhdGlvbl9mcmVxdWVuY3kEAQxuZXcQAURCbG9ja051bWJlckZvcjxUPgAIBNBTZXQgdGhlIHBhcmFjaGFpbiB2YWxpZGF0b3ItZ3JvdXAgcm90YXRpb24gZnJlcXVlbmN5dHNldF9wYXJhc19hdmFpbGFiaWxpdHlfcGVyaW9kBAEMbmV3EAFEQmxvY2tOdW1iZXJGb3I8VD4ACQSYU2V0IHRoZSBhdmFpbGFiaWxpdHkgcGVyaW9kIGZvciBwYXJhcy5gc2V0X3NjaGVkdWxpbmdfbG9va2FoZWFkBAEMbmV3EAEMdTMyAAsEOQFTZXQgdGhlIHNjaGVkdWxpbmcgbG9va2FoZWFkLCBpbiBleHBlY3RlZCBudW1iZXIgb2YgYmxvY2tzIGF0IHBlYWsgdGhyb3VnaHB1dC5sc2V0X21heF92YWxpZGF0b3JzX3Blcl9jb3JlBAEMbmV3YQIBLE9wdGlvbjx1MzI+AAwE7FNldCB0aGUgbWF4aW11bSBudW1iZXIgb2YgdmFsaWRhdG9ycyB0byBhc3NpZ24gdG8gYW55IGNvcmUuSHNldF9tYXhfdmFsaWRhdG9ycwQBDG5ld2ECASxPcHRpb248dTMyPgANBA0BU2V0IHRoZSBtYXhpbXVtIG51bWJlciBvZiB2YWxpZGF0b3JzIHRvIHVzZSBpbiBwYXJhY2hhaW4gY29uc2Vuc3VzLkhzZXRfZGlzcHV0ZV9wZXJpb2QEAQxuZXcQATBTZXNzaW9uSW5kZXgADgQNAVNldCB0aGUgZGlzcHV0ZSBwZXJpb2QsIGluIG51bWJlciBvZiBzZXNzaW9ucyB0byBrZWVwIGZvciBkaXNwdXRlcy60c2V0X2Rpc3B1dGVfcG9zdF9jb25jbHVzaW9uX2FjY2VwdGFuY2VfcGVyaW9kBAEMbmV3EAFEQmxvY2tOdW1iZXJGb3I8VD4ADwTIU2V0IHRoZSBkaXNwdXRlIHBvc3QgY29uY2x1c2lvbiBhY2NlcHRhbmNlIHBlcmlvZC5Ec2V0X25vX3Nob3dfc2xvdHMEAQxuZXcQAQx1MzIAEgj4U2V0IHRoZSBubyBzaG93IHNsb3RzLCBpbiBudW1iZXIgb2YgbnVtYmVyIG9mIGNvbnNlbnN1cyBzbG90cy5MTXVzdCBiZSBhdCBsZWFzdCAxLlBzZXRfbl9kZWxheV90cmFuY2hlcwQBDG5ldxABDHUzMgATBJxTZXQgdGhlIHRvdGFsIG51bWJlciBvZiBkZWxheSB0cmFuY2hlcy54c2V0X3plcm90aF9kZWxheV90cmFuY2hlX3dpZHRoBAEMbmV3EAEMdTMyABQEjFNldCB0aGUgemVyb3RoIGRlbGF5IHRyYW5jaGUgd2lkdGguUHNldF9uZWVkZWRfYXBwcm92YWxzBAEMbmV3EAEMdTMyABUE3FNldCB0aGUgbnVtYmVyIG9mIHZhbGlkYXRvcnMgbmVlZGVkIHRvIGFwcHJvdmUgYSBibG9jay5wc2V0X3JlbGF5X3ZyZl9tb2R1bG9fc2FtcGxlcwQBDG5ldxABDHUzMgAWBFkBU2V0IHRoZSBudW1iZXIgb2Ygc2FtcGxlcyB0byBkbyBvZiB0aGUgYFJlbGF5VlJGTW9kdWxvYCBhcHByb3ZhbCBhc3NpZ25tZW50IGNyaXRlcmlvbi5oc2V0X21heF91cHdhcmRfcXVldWVfY291bnQEAQxuZXcQAQx1MzIAFwQtAVNldHMgdGhlIG1heGltdW0gaXRlbXMgdGhhdCBjYW4gcHJlc2VudCBpbiBhIHVwd2FyZCBkaXNwYXRjaCBxdWV1ZSBhdCBvbmNlLmRzZXRfbWF4X3Vwd2FyZF9xdWV1ZV9zaXplBAEMbmV3EAEMdTMyABgITQFTZXRzIHRoZSBtYXhpbXVtIHRvdGFsIHNpemUgb2YgaXRlbXMgdGhhdCBjYW4gcHJlc2VudCBpbiBhIHVwd2FyZCBkaXNwYXRjaCBxdWV1ZSBhdBRvbmNlLnRzZXRfbWF4X2Rvd253YXJkX21lc3NhZ2Vfc2l6ZQQBDG5ldxABDHUzMgAZBJxTZXQgdGhlIGNyaXRpY2FsIGRvd253YXJkIG1lc3NhZ2Ugc2l6ZS5sc2V0X21heF91cHdhcmRfbWVzc2FnZV9zaXplBAEMbmV3EAEMdTMyABsELQFTZXRzIHRoZSBtYXhpbXVtIHNpemUgb2YgYW4gdXB3YXJkIG1lc3NhZ2UgdGhhdCBjYW4gYmUgc2VudCBieSBhIGNhbmRpZGF0ZS6gc2V0X21heF91cHdhcmRfbWVzc2FnZV9udW1fcGVyX2NhbmRpZGF0ZQQBDG5ldxABDHUzMgAcBAUBU2V0cyB0aGUgbWF4aW11bSBudW1iZXIgb2YgbWVzc2FnZXMgdGhhdCBhIGNhbmRpZGF0ZSBjYW4gY29udGFpbi5kc2V0X2hybXBfb3Blbl9yZXF1ZXN0X3R0bAQBDG5ldxABDHUzMgAdBDUBU2V0cyB0aGUgbnVtYmVyIG9mIHNlc3Npb25zIGFmdGVyIHdoaWNoIGFuIEhSTVAgb3BlbiBjaGFubmVsIHJlcXVlc3QgZXhwaXJlcy5cc2V0X2hybXBfc2VuZGVyX2RlcG9zaXQEAQxuZXcYARxCYWxhbmNlAB4EUQFTZXRzIHRoZSBhbW91bnQgb2YgZnVuZHMgdGhhdCB0aGUgc2VuZGVyIHNob3VsZCBwcm92aWRlIGZvciBvcGVuaW5nIGFuIEhSTVAgY2hhbm5lbC5oc2V0X2hybXBfcmVjaXBpZW50X2RlcG9zaXQEAQxuZXcYARxCYWxhbmNlAB8IYQFTZXRzIHRoZSBhbW91bnQgb2YgZnVuZHMgdGhhdCB0aGUgcmVjaXBpZW50IHNob3VsZCBwcm92aWRlIGZvciBhY2NlcHRpbmcgb3BlbmluZyBhbiBIUk1QIGNoYW5uZWwudHNldF9ocm1wX2NoYW5uZWxfbWF4X2NhcGFjaXR5BAEMbmV3EAEMdTMyACAEHQFTZXRzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBtZXNzYWdlcyBhbGxvd2VkIGluIGFuIEhSTVAgY2hhbm5lbCBhdCBvbmNlLnxzZXRfaHJtcF9jaGFubmVsX21heF90b3RhbF9zaXplBAEMbmV3EAEMdTMyACEEUQFTZXRzIHRoZSBtYXhpbXVtIHRvdGFsIHNpemUgb2YgbWVzc2FnZXMgaW4gYnl0ZXMgYWxsb3dlZCBpbiBhbiBIUk1QIGNoYW5uZWwgYXQgb25jZS6cc2V0X2hybXBfbWF4X3BhcmFjaGFpbl9pbmJvdW5kX2NoYW5uZWxzBAEMbmV3EAEMdTMyACIESQFTZXRzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBpbmJvdW5kIEhSTVAgY2hhbm5lbHMgYSBwYXJhY2hhaW4gaXMgYWxsb3dlZCB0byBhY2NlcHQuhHNldF9ocm1wX2NoYW5uZWxfbWF4X21lc3NhZ2Vfc2l6ZQQBDG5ldxABDHUzMgAkBD0BU2V0cyB0aGUgbWF4aW11bSBzaXplIG9mIGEgbWVzc2FnZSB0aGF0IGNvdWxkIGV2ZXIgYmUgcHV0IGludG8gYW4gSFJNUCBjaGFubmVsLqBzZXRfaHJtcF9tYXhfcGFyYWNoYWluX291dGJvdW5kX2NoYW5uZWxzBAEMbmV3EAEMdTMyACUERQFTZXRzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBvdXRib3VuZCBIUk1QIGNoYW5uZWxzIGEgcGFyYWNoYWluIGlzIGFsbG93ZWQgdG8gb3Blbi6Yc2V0X2hybXBfbWF4X21lc3NhZ2VfbnVtX3Blcl9jYW5kaWRhdGUEAQxuZXcQAQx1MzIAJwQ1AVNldHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIG91dGJvdW5kIEhSTVAgbWVzc2FnZXMgY2FuIGJlIHNlbnQgYnkgYSBjYW5kaWRhdGUuSHNldF9wdmZfdm90aW5nX3R0bAQBDG5ldxABMFNlc3Npb25JbmRleAAqBFEBU2V0IHRoZSBudW1iZXIgb2Ygc2Vzc2lvbiBjaGFuZ2VzIGFmdGVyIHdoaWNoIGEgUFZGIHByZS1jaGVja2luZyB2b3RpbmcgaXMgcmVqZWN0ZWQukHNldF9taW5pbXVtX3ZhbGlkYXRpb25fdXBncmFkZV9kZWxheQQBDG5ldxABREJsb2NrTnVtYmVyRm9yPFQ+ACsQVQFTZXRzIHRoZSBtaW5pbXVtIGRlbGF5IGJldHdlZW4gYW5ub3VuY2luZyB0aGUgdXBncmFkZSBibG9jayBmb3IgYSBwYXJhY2hhaW4gdW50aWwgdGhlVHVwZ3JhZGUgdGFraW5nIHBsYWNlLgA5AVNlZSB0aGUgZmllbGQgZG9jdW1lbnRhdGlvbiBmb3IgaW5mb3JtYXRpb24gYW5kIGNvbnN0cmFpbnRzIGZvciB0aGUgbmV3IHZhbHVlLnBzZXRfYnlwYXNzX2NvbnNpc3RlbmN5X2NoZWNrBAEMbmV3IAEQYm9vbAAsCE0BU2V0dGluZyB0aGlzIHRvIHRydWUgd2lsbCBkaXNhYmxlIGNvbnNpc3RlbmN5IGNoZWNrcyBmb3IgdGhlIGNvbmZpZ3VyYXRpb24gc2V0dGVycy5EVXNlIHdpdGggY2F1dGlvbi5gc2V0X2FzeW5jX2JhY2tpbmdfcGFyYW1zBAEMbmV3VQQBSEFzeW5jQmFja2luZ1BhcmFtcwAtBKBTZXQgdGhlIGFzeW5jaHJvbm91cyBiYWNraW5nIHBhcmFtZXRlcnMuTHNldF9leGVjdXRvcl9wYXJhbXMEAQxuZXdZBAE4RXhlY3V0b3JQYXJhbXMALgRwU2V0IFBWRiBleGVjdXRvciBwYXJhbWV0ZXJzLlhzZXRfb25fZGVtYW5kX2Jhc2VfZmVlBAEMbmV3GAEcQmFsYW5jZQAvBKRTZXQgdGhlIG9uIGRlbWFuZCAocGFyYXRocmVhZHMpIGJhc2UgZmVlLnRzZXRfb25fZGVtYW5kX2ZlZV92YXJpYWJpbGl0eQQBDG5ld6wBHFBlcmJpbGwAMATAU2V0IHRoZSBvbiBkZW1hbmQgKHBhcmF0aHJlYWRzKSBmZWUgdmFyaWFiaWxpdHkucHNldF9vbl9kZW1hbmRfcXVldWVfbWF4X3NpemUEAQxuZXcQAQx1MzIAMQS8U2V0IHRoZSBvbiBkZW1hbmQgKHBhcmF0aHJlYWRzKSBxdWV1ZSBtYXggc2l6ZS6Yc2V0X29uX2RlbWFuZF90YXJnZXRfcXVldWVfdXRpbGl6YXRpb24EAQxuZXesARxQZXJiaWxsADIEwFNldCB0aGUgb24gZGVtYW5kIChwYXJhdGhyZWFkcykgZmVlIHZhcmlhYmlsaXR5LkRzZXRfb25fZGVtYW5kX3R0bAQBDG5ldxABREJsb2NrTnVtYmVyRm9yPFQ+ADME2FNldCB0aGUgb24gZGVtYW5kIChwYXJhdGhyZWFkcykgdHRsIGluIHRoZSBjbGFpbXF1ZXVlLmRzZXRfbWluaW11bV9iYWNraW5nX3ZvdGVzBAEMbmV3EAEMdTMyADQEoFNldCB0aGUgbWluaW11bSBiYWNraW5nIHZvdGVzIHRocmVzaG9sZC5Ac2V0X25vZGVfZmVhdHVyZQgBFGluZGV4CAEIdTgAARR2YWx1ZSABEGJvb2wANQRkU2V0L1Vuc2V0IGEgbm9kZSBmZWF0dXJlLmhzZXRfYXBwcm92YWxfdm90aW5nX3BhcmFtcwQBDG5ld20EAVBBcHByb3ZhbFZvdGluZ1BhcmFtcwA2BGxTZXQgYXBwcm92YWwtdm90aW5nLXBhcmFtcy5Qc2V0X3NjaGVkdWxlcl9wYXJhbXMEAQxuZXdxBAGIU2NoZWR1bGVyUGFyYW1zPEJsb2NrTnVtYmVyRm9yPFQ+PgA3BFRTZXQgc2NoZWR1bGVyLXBhcmFtcy4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMuVQQQTHBvbGthZG90X3ByaW1pdGl2ZXMIdjc0YXN5bmNfYmFja2luZ0hBc3luY0JhY2tpbmdQYXJhbXMAAAgBTG1heF9jYW5kaWRhdGVfZGVwdGgQAQx1MzIAAVBhbGxvd2VkX2FuY2VzdHJ5X2xlbhABDHUzMgAAWQQQTHBvbGthZG90X3ByaW1pdGl2ZXMIdjc8ZXhlY3V0b3JfcGFyYW1zOEV4ZWN1dG9yUGFyYW1zAAAEAF0EAUhWZWM8RXhlY3V0b3JQYXJhbT4AAF0EAAACYQQAYQQQTHBvbGthZG90X3ByaW1pdGl2ZXMIdjc8ZXhlY3V0b3JfcGFyYW1zNEV4ZWN1dG9yUGFyYW0AARw4TWF4TWVtb3J5UGFnZXMEABABDHUzMgABADxTdGFja0xvZ2ljYWxNYXgEABABDHUzMgACADhTdGFja05hdGl2ZU1heAQAEAEMdTMyAAMAUFByZWNoZWNraW5nTWF4TWVtb3J5BAAwAQx1NjQABAA4UHZmUHJlcFRpbWVvdXQIAGUEASxQdmZQcmVwS2luZAAAMAEMdTY0AAUAOFB2ZkV4ZWNUaW1lb3V0CABpBAEsUHZmRXhlY0tpbmQAADABDHU2NAAGAERXYXNtRXh0QnVsa01lbW9yeQAHAABlBAxMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2NyxQdmZQcmVwS2luZAABCCBQcmVjaGVjawAAABxQcmVwYXJlAAEAAGkEDExwb2xrYWRvdF9wcmltaXRpdmVzCHY3LFB2ZkV4ZWNLaW5kAAEIHEJhY2tpbmcAAAAgQXBwcm92YWwAAQAAbQQMTHBvbGthZG90X3ByaW1pdGl2ZXMIdjdQQXBwcm92YWxWb3RpbmdQYXJhbXMAAAQBbG1heF9hcHByb3ZhbF9jb2FsZXNjZV9jb3VudBABDHUzMgAAcQQMTHBvbGthZG90X3ByaW1pdGl2ZXMgdnN0YWdpbmc8U2NoZWR1bGVyUGFyYW1zBCxCbG9ja051bWJlcgEQACwBYGdyb3VwX3JvdGF0aW9uX2ZyZXF1ZW5jeRABLEJsb2NrTnVtYmVyAAFkcGFyYXNfYXZhaWxhYmlsaXR5X3BlcmlvZBABLEJsb2NrTnVtYmVyAAFcbWF4X3ZhbGlkYXRvcnNfcGVyX2NvcmVhAgEsT3B0aW9uPHUzMj4AASRsb29rYWhlYWQQAQx1MzIAASRudW1fY29yZXMQAQx1MzIAAWRtYXhfYXZhaWxhYmlsaXR5X3RpbWVvdXRzEAEMdTMyAAFgb25fZGVtYW5kX3F1ZXVlX21heF9zaXplEAEMdTMyAAGIb25fZGVtYW5kX3RhcmdldF9xdWV1ZV91dGlsaXphdGlvbqwBHFBlcmJpbGwAAWRvbl9kZW1hbmRfZmVlX3ZhcmlhYmlsaXR5rAEcUGVyYmlsbAABSG9uX2RlbWFuZF9iYXNlX2ZlZRgBHEJhbGFuY2UAAQx0dGwQASxCbG9ja051bWJlcgAAdQQQbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucxhzaGFyZWQYcGFsbGV0EENhbGwEBFQAAQAEDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMueQQQbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucyRpbmNsdXNpb24YcGFsbGV0EENhbGwEBFQAAQAEDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMufQQQbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWluczhwYXJhc19pbmhlcmVudBhwYWxsZXQQQ2FsbAQEVAABBBRlbnRlcgQBEGRhdGGBBAGQUGFyYWNoYWluc0luaGVyZW50RGF0YTxIZWFkZXJGb3I8VD4+AAAEMQFFbnRlciB0aGUgcGFyYXMgaW5oZXJlbnQuIFRoaXMgd2lsbCBwcm9jZXNzIGJpdGZpZWxkcyBhbmQgYmFja2VkIGNhbmRpZGF0ZXMuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLoEEDExwb2xrYWRvdF9wcmltaXRpdmVzCHY3MEluaGVyZW50RGF0YQQMSERSAaEBABABJGJpdGZpZWxkc4UEAZBVbmNoZWNrZWRTaWduZWRBdmFpbGFiaWxpdHlCaXRmaWVsZHMAAURiYWNrZWRfY2FuZGlkYXRlc6EEAXxWZWM8QmFja2VkQ2FuZGlkYXRlPEhEUjo6SGFzaD4+AAEgZGlzcHV0ZXPlBAFgTXVsdGlEaXNwdXRlU3RhdGVtZW50U2V0AAE0cGFyZW50X2hlYWRlcqEBAQxIRFIAAIUEAAACiQQAiQQQTHBvbGthZG90X3ByaW1pdGl2ZXMIdjcYc2lnbmVkPFVuY2hlY2tlZFNpZ25lZAgcUGF5bG9hZAGNBCxSZWFsUGF5bG9hZAGNBAAMARxwYXlsb2FkjQQBHFBheWxvYWQAATx2YWxpZGF0b3JfaW5kZXiZBAE4VmFsaWRhdG9ySW5kZXgAASRzaWduYXR1cmWdBAFIVmFsaWRhdG9yU2lnbmF0dXJlAACNBAxMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2N1BBdmFpbGFiaWxpdHlCaXRmaWVsZAAABACRBAF8Qml0VmVjPHU4LCBiaXR2ZWM6Om9yZGVyOjpMc2IwPgAAkQQAAAcIlQQAlQQMGGJpdHZlYxRvcmRlchBMc2IwAAAAAJkEDExwb2xrYWRvdF9wcmltaXRpdmVzCHY3OFZhbGlkYXRvckluZGV4AAAEABABDHUzMgAAnQQQTHBvbGthZG90X3ByaW1pdGl2ZXMIdjc0dmFsaWRhdG9yX2FwcCRTaWduYXR1cmUAAAQASQIBSHNyMjU1MTk6OlNpZ25hdHVyZQAAoQQAAAKlBAClBAxMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2NzxCYWNrZWRDYW5kaWRhdGUEBEgBNAAMASRjYW5kaWRhdGWpBAFwQ29tbWl0dGVkQ2FuZGlkYXRlUmVjZWlwdDxIPgABOHZhbGlkaXR5X3ZvdGVz3QQBYFZlYzxWYWxpZGl0eUF0dGVzdGF0aW9uPgABRHZhbGlkYXRvcl9pbmRpY2VzkQQBfEJpdFZlYzx1OCwgYml0dmVjOjpvcmRlcjo6THNiMD4AAKkEDExwb2xrYWRvdF9wcmltaXRpdmVzCHY3ZENvbW1pdHRlZENhbmRpZGF0ZVJlY2VpcHQEBEgBNAAIAShkZXNjcmlwdG9yrQQBWENhbmRpZGF0ZURlc2NyaXB0b3I8SD4AASxjb21taXRtZW50c70EAVBDYW5kaWRhdGVDb21taXRtZW50cwAArQQMTHBvbGthZG90X3ByaW1pdGl2ZXMIdjdMQ2FuZGlkYXRlRGVzY3JpcHRvcgQESAE0ACQBHHBhcmFfaWSNAgEISWQAATByZWxheV9wYXJlbnQ0AQRIAAEgY29sbGF0b3KxBAEoQ29sbGF0b3JJZAABeHBlcnNpc3RlZF92YWxpZGF0aW9uX2RhdGFfaGFzaDQBEEhhc2gAASBwb3ZfaGFzaDQBEEhhc2gAATBlcmFzdXJlX3Jvb3Q0ARBIYXNoAAEkc2lnbmF0dXJltQQBRENvbGxhdG9yU2lnbmF0dXJlAAEkcGFyYV9oZWFkNAEQSGFzaAABUHZhbGlkYXRpb25fY29kZV9oYXNouQQBSFZhbGlkYXRpb25Db2RlSGFzaAAAsQQQTHBvbGthZG90X3ByaW1pdGl2ZXMIdjcwY29sbGF0b3JfYXBwGFB1YmxpYwAABAAEATxzcjI1NTE5OjpQdWJsaWMAALUEEExwb2xrYWRvdF9wcmltaXRpdmVzCHY3MGNvbGxhdG9yX2FwcCRTaWduYXR1cmUAAAQASQIBSHNyMjU1MTk6OlNpZ25hdHVyZQAAuQQMdHBvbGthZG90X3BhcmFjaGFpbl9wcmltaXRpdmVzKHByaW1pdGl2ZXNIVmFsaWRhdGlvbkNvZGVIYXNoAAAEADQBEEhhc2gAAL0EDExwb2xrYWRvdF9wcmltaXRpdmVzCHY3UENhbmRpZGF0ZUNvbW1pdG1lbnRzBAROARAAGAE8dXB3YXJkX21lc3NhZ2VzwQQBOFVwd2FyZE1lc3NhZ2VzAAFMaG9yaXpvbnRhbF9tZXNzYWdlc8UEAUhIb3Jpem9udGFsTWVzc2FnZXMAAUxuZXdfdmFsaWRhdGlvbl9jb2Rl0QQBWE9wdGlvbjxWYWxpZGF0aW9uQ29kZT4AASRoZWFkX2RhdGHZBAEgSGVhZERhdGEAAWxwcm9jZXNzZWRfZG93bndhcmRfbWVzc2FnZXMQAQx1MzIAAThocm1wX3dhdGVybWFyaxABBE4AAMEEDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBOARTAAAEAIUBARhWZWM8VD4AAMUEDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQByQQEUwAABADNBAEYVmVjPFQ+AADJBAhgcG9sa2Fkb3RfY29yZV9wcmltaXRpdmVzTE91dGJvdW5kSHJtcE1lc3NhZ2UECElkAY0CAAgBJHJlY2lwaWVudI0CAQhJZAABEGRhdGE4AVBzcF9zdGQ6OnZlYzo6VmVjPHU4PgAAzQQAAALJBADRBAQYT3B0aW9uBARUAdUEAQgQTm9uZQAAABBTb21lBADVBAAAAQAA1QQMdHBvbGthZG90X3BhcmFjaGFpbl9wcmltaXRpdmVzKHByaW1pdGl2ZXM4VmFsaWRhdGlvbkNvZGUAAAQAOAEcVmVjPHU4PgAA2QQMdHBvbGthZG90X3BhcmFjaGFpbl9wcmltaXRpdmVzKHByaW1pdGl2ZXMgSGVhZERhdGEAAAQAOAEcVmVjPHU4PgAA3QQAAALhBADhBAxMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2N0xWYWxpZGl0eUF0dGVzdGF0aW9uAAEIIEltcGxpY2l0BACdBAFIVmFsaWRhdG9yU2lnbmF0dXJlAAEAIEV4cGxpY2l0BACdBAFIVmFsaWRhdG9yU2lnbmF0dXJlAAIAAOUEAAAC6QQA6QQMTHBvbGthZG90X3ByaW1pdGl2ZXMIdjdMRGlzcHV0ZVN0YXRlbWVudFNldAAADAE4Y2FuZGlkYXRlX2hhc2jtBAE0Q2FuZGlkYXRlSGFzaAABHHNlc3Npb24QATBTZXNzaW9uSW5kZXgAAShzdGF0ZW1lbnRz8QQB7FZlYzwoRGlzcHV0ZVN0YXRlbWVudCwgVmFsaWRhdG9ySW5kZXgsIFZhbGlkYXRvclNpZ25hdHVyZSk+AADtBAhgcG9sa2Fkb3RfY29yZV9wcmltaXRpdmVzNENhbmRpZGF0ZUhhc2gAAAQANAEQSGFzaAAA8QQAAAL1BAD1BAAABAz5BJkEnQQA+QQMTHBvbGthZG90X3ByaW1pdGl2ZXMIdjdARGlzcHV0ZVN0YXRlbWVudAABCBRWYWxpZAQA/QQBZFZhbGlkRGlzcHV0ZVN0YXRlbWVudEtpbmQAAAAcSW52YWxpZAQABQUBbEludmFsaWREaXNwdXRlU3RhdGVtZW50S2luZAABAAD9BAxMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2N2RWYWxpZERpc3B1dGVTdGF0ZW1lbnRLaW5kAAEUIEV4cGxpY2l0AAAAPEJhY2tpbmdTZWNvbmRlZAQANAEQSGFzaAABADBCYWNraW5nVmFsaWQEADQBEEhhc2gAAgBAQXBwcm92YWxDaGVja2luZwADAIhBcHByb3ZhbENoZWNraW5nTXVsdGlwbGVDYW5kaWRhdGVzBAABBQFIVmVjPENhbmRpZGF0ZUhhc2g+AAQAAAEFAAAC7QQABQUMTHBvbGthZG90X3ByaW1pdGl2ZXMIdjdsSW52YWxpZERpc3B1dGVTdGF0ZW1lbnRLaW5kAAEEIEV4cGxpY2l0AAAAAAkFEGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMUcGFyYXMYcGFsbGV0EENhbGwEBFQAASRYZm9yY2Vfc2V0X2N1cnJlbnRfY29kZQgBEHBhcmGNAgEYUGFyYUlkAAEgbmV3X2NvZGXVBAE4VmFsaWRhdGlvbkNvZGUAAAT4U2V0IHRoZSBzdG9yYWdlIGZvciB0aGUgcGFyYWNoYWluIHZhbGlkYXRpb24gY29kZSBpbW1lZGlhdGVseS5YZm9yY2Vfc2V0X2N1cnJlbnRfaGVhZAgBEHBhcmGNAgEYUGFyYUlkAAEgbmV3X2hlYWTZBAEgSGVhZERhdGEAAQQBAVNldCB0aGUgc3RvcmFnZSBmb3IgdGhlIGN1cnJlbnQgcGFyYWNoYWluIGhlYWQgZGF0YSBpbW1lZGlhdGVseS5sZm9yY2Vfc2NoZWR1bGVfY29kZV91cGdyYWRlDAEQcGFyYY0CARhQYXJhSWQAASBuZXdfY29kZdUEAThWYWxpZGF0aW9uQ29kZQABTHJlbGF5X3BhcmVudF9udW1iZXIQAURCbG9ja051bWJlckZvcjxUPgACBC0BU2NoZWR1bGUgYW4gdXBncmFkZSBhcyBpZiBpdCB3YXMgc2NoZWR1bGVkIGluIHRoZSBnaXZlbiByZWxheSBwYXJlbnQgYmxvY2suTGZvcmNlX25vdGVfbmV3X2hlYWQIARBwYXJhjQIBGFBhcmFJZAABIG5ld19oZWFk2QQBIEhlYWREYXRhAAMEHQFOb3RlIGEgbmV3IGJsb2NrIGhlYWQgZm9yIHBhcmEgd2l0aGluIHRoZSBjb250ZXh0IG9mIHRoZSBjdXJyZW50IGJsb2NrLkhmb3JjZV9xdWV1ZV9hY3Rpb24EARBwYXJhjQIBGFBhcmFJZAAEDPhQdXQgYSBwYXJhY2hhaW4gZGlyZWN0bHkgaW50byB0aGUgbmV4dCBzZXNzaW9uJ3MgYWN0aW9uIHF1ZXVlLvRXZSBjYW4ndCBxdWV1ZSBpdCBhbnkgc29vbmVyIHRoYW4gdGhpcyB3aXRob3V0IGdvaW5nIGludG8gdGhlOGluaXRpYWxpemVyLi4ubGFkZF90cnVzdGVkX3ZhbGlkYXRpb25fY29kZQQBPHZhbGlkYXRpb25fY29kZdUEAThWYWxpZGF0aW9uQ29kZQAFOKBBZGRzIHRoZSB2YWxpZGF0aW9uIGNvZGUgdG8gdGhlIHN0b3JhZ2UuAFkBVGhlIGNvZGUgd2lsbCBub3QgYmUgYWRkZWQgaWYgaXQgaXMgYWxyZWFkeSBwcmVzZW50LiBBZGRpdGlvbmFsbHksIGlmIFBWRiBwcmUtY2hlY2tpbmfgaXMgcnVubmluZyBmb3IgdGhhdCBjb2RlLCBpdCB3aWxsIGJlIGluc3RhbnRseSBhY2NlcHRlZC4AUQFPdGhlcndpc2UsIHRoZSBjb2RlIHdpbGwgYmUgYWRkZWQgaW50byB0aGUgc3RvcmFnZS4gTm90ZSB0aGF0IHRoZSBjb2RlIHdpbGwgYmUgYWRkZWRhAWludG8gc3RvcmFnZSB3aXRoIHJlZmVyZW5jZSBjb3VudCAwLiBUaGlzIGlzIHRvIGFjY291bnQgdGhlIGZhY3QgdGhhdCB0aGVyZSBhcmUgbm8gdXNlcnNNAWZvciB0aGlzIGNvZGUgeWV0LiBUaGUgY2FsbGVyIHdpbGwgaGF2ZSB0byBtYWtlIHN1cmUgdGhhdCB0aGlzIGNvZGUgZXZlbnR1YWxseSBnZXRzSQF1c2VkIGJ5IHNvbWUgcGFyYWNoYWluIG9yIHJlbW92ZWQgZnJvbSB0aGUgc3RvcmFnZSB0byBhdm9pZCBzdG9yYWdlIGxlYWtzLiBGb3IgdGhlSQFsYXR0ZXIgcHJlZmVyIHRvIHVzZSB0aGUgYHBva2VfdW51c2VkX3ZhbGlkYXRpb25fY29kZWAgZGlzcGF0Y2hhYmxlIHRvIHJhdyBzdG9yYWdlNG1hbmlwdWxhdGlvbi4AUQFUaGlzIGZ1bmN0aW9uIGlzIG1haW5seSBtZWFudCB0byBiZSB1c2VkIGZvciB1cGdyYWRpbmcgcGFyYWNoYWlucyB0aGF0IGRvIG5vdCBmb2xsb3cJAXRoZSBnby1haGVhZCBzaWduYWwgd2hpbGUgdGhlIFBWRiBwcmUtY2hlY2tpbmcgZmVhdHVyZSBpcyBlbmFibGVkLmxwb2tlX3VudXNlZF92YWxpZGF0aW9uX2NvZGUEAVB2YWxpZGF0aW9uX2NvZGVfaGFzaLkEAUhWYWxpZGF0aW9uQ29kZUhhc2gABhQlAVJlbW92ZSB0aGUgdmFsaWRhdGlvbiBjb2RlIGZyb20gdGhlIHN0b3JhZ2UgaWZmIHRoZSByZWZlcmVuY2UgY291bnQgaXMgMC4AWQFUaGlzIGlzIGJldHRlciB0aGFuIHJlbW92aW5nIHRoZSBzdG9yYWdlIGRpcmVjdGx5LCBiZWNhdXNlIGl0IHdpbGwgbm90IHJlbW92ZSB0aGUgY29kZUEBdGhhdCB3YXMgc3VkZGVubHkgZ290IHVzZWQgYnkgc29tZSBwYXJhY2hhaW4gd2hpbGUgdGhpcyBkaXNwYXRjaGFibGUgd2FzIHBlbmRpbmcwZGlzcGF0Y2hpbmcubGluY2x1ZGVfcHZmX2NoZWNrX3N0YXRlbWVudAgBEHN0bXQNBQFEUHZmQ2hlY2tTdGF0ZW1lbnQAASRzaWduYXR1cmWdBAFIVmFsaWRhdG9yU2lnbmF0dXJlAAcIVQFJbmNsdWRlcyBhIHN0YXRlbWVudCBmb3IgYSBQVkYgcHJlLWNoZWNraW5nIHZvdGUuIFBvdGVudGlhbGx5LCBmaW5hbGl6ZXMgdGhlIHZvdGUgYW5kQQFlbmFjdHMgdGhlIHJlc3VsdHMgaWYgdGhhdCB3YXMgdGhlIGxhc3Qgdm90ZSBiZWZvcmUgYWNoaWV2aW5nIHRoZSBzdXBlcm1ham9yaXR5LnRmb3JjZV9zZXRfbW9zdF9yZWNlbnRfY29udGV4dAgBEHBhcmGNAgEYUGFyYUlkAAEcY29udGV4dBABREJsb2NrTnVtYmVyRm9yPFQ+AAgEAQFTZXQgdGhlIHN0b3JhZ2UgZm9yIHRoZSBjdXJyZW50IHBhcmFjaGFpbiBoZWFkIGRhdGEgaW1tZWRpYXRlbHkuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLg0FDExwb2xrYWRvdF9wcmltaXRpdmVzCHY3RFB2ZkNoZWNrU3RhdGVtZW50AAAQARhhY2NlcHQgARBib29sAAEcc3ViamVjdLkEAUhWYWxpZGF0aW9uQ29kZUhhc2gAATRzZXNzaW9uX2luZGV4EAEwU2Vzc2lvbkluZGV4AAE8dmFsaWRhdG9yX2luZGV4mQQBOFZhbGlkYXRvckluZGV4AAARBRBscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zLGluaXRpYWxpemVyGHBhbGxldBBDYWxsBARUAAEENGZvcmNlX2FwcHJvdmUEARR1cF90bxABLEJsb2NrTnVtYmVyAAAMOQFJc3N1ZSBhIHNpZ25hbCB0byB0aGUgY29uc2Vuc3VzIGVuZ2luZSB0byBmb3JjaWJseSBhY3QgYXMgdGhvdWdoIGFsbCBwYXJhY2hhaW5RAWJsb2NrcyBpbiBhbGwgcmVsYXkgY2hhaW4gYmxvY2tzIHVwIHRvIGFuZCBpbmNsdWRpbmcgdGhlIGdpdmVuIG51bWJlciBpbiB0aGUgY3VycmVudKBjaGFpbiBhcmUgdmFsaWQgYW5kIHNob3VsZCBiZSBmaW5hbGl6ZWQuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLhUFEGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMQaHJtcBhwYWxsZXQQQ2FsbAQEVAABLFhocm1wX2luaXRfb3Blbl9jaGFubmVsDAEkcmVjaXBpZW50jQIBGFBhcmFJZAABVHByb3Bvc2VkX21heF9jYXBhY2l0eRABDHUzMgABZHByb3Bvc2VkX21heF9tZXNzYWdlX3NpemUQAQx1MzIAAChNAUluaXRpYXRlIG9wZW5pbmcgYSBjaGFubmVsIGZyb20gYSBwYXJhY2hhaW4gdG8gYSBnaXZlbiByZWNpcGllbnQgd2l0aCBnaXZlbiBjaGFubmVsLHBhcmFtZXRlcnMuAFkBLSBgcHJvcG9zZWRfbWF4X2NhcGFjaXR5YCAtIHNwZWNpZmllcyBob3cgbWFueSBtZXNzYWdlcyBjYW4gYmUgaW4gdGhlIGNoYW5uZWwgYXQgb25jZS4tAS0gYHByb3Bvc2VkX21heF9tZXNzYWdlX3NpemVgIC0gc3BlY2lmaWVzIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIG1lc3NhZ2VzLgARAVRoZXNlIG51bWJlcnMgYXJlIGEgc3ViamVjdCB0byB0aGUgcmVsYXktY2hhaW4gY29uZmlndXJhdGlvbiBsaW1pdHMuAFEBVGhlIGNoYW5uZWwgY2FuIGJlIG9wZW5lZCBvbmx5IGFmdGVyIHRoZSByZWNpcGllbnQgY29uZmlybXMgaXQgYW5kIG9ubHkgb24gYSBzZXNzaW9uHGNoYW5nZS5gaHJtcF9hY2NlcHRfb3Blbl9jaGFubmVsBAEYc2VuZGVyjQIBGFBhcmFJZAABDPBBY2NlcHQgYSBwZW5kaW5nIG9wZW4gY2hhbm5lbCByZXF1ZXN0IGZyb20gdGhlIGdpdmVuIHNlbmRlci4A9FRoZSBjaGFubmVsIHdpbGwgYmUgb3BlbmVkIG9ubHkgb24gdGhlIG5leHQgc2Vzc2lvbiBib3VuZGFyeS5IaHJtcF9jbG9zZV9jaGFubmVsBAEoY2hhbm5lbF9pZBkFATRIcm1wQ2hhbm5lbElkAAIQVQFJbml0aWF0ZSB1bmlsYXRlcmFsIGNsb3Npbmcgb2YgYSBjaGFubmVsLiBUaGUgb3JpZ2luIG11c3QgYmUgZWl0aGVyIHRoZSBzZW5kZXIgb3IgdGhlmHJlY2lwaWVudCBpbiB0aGUgY2hhbm5lbCBiZWluZyBjbG9zZWQuAMBUaGUgY2xvc3VyZSBjYW4gb25seSBoYXBwZW4gb24gYSBzZXNzaW9uIGNoYW5nZS5AZm9yY2VfY2xlYW5faHJtcAwBEHBhcmGNAgEYUGFyYUlkAAEsbnVtX2luYm91bmQQAQx1MzIAATBudW1fb3V0Ym91bmQQAQx1MzIAAxxdAVRoaXMgZXh0cmluc2ljIHRyaWdnZXJzIHRoZSBjbGVhbnVwIG9mIGFsbCB0aGUgSFJNUCBzdG9yYWdlIGl0ZW1zIHRoYXQgYSBwYXJhIG1heSBoYXZlLkkBTm9ybWFsbHkgdGhpcyBoYXBwZW5zIG9uY2UgcGVyIHNlc3Npb24sIGJ1dCB0aGlzIGFsbG93cyB5b3UgdG8gdHJpZ2dlciB0aGUgY2xlYW51cJRpbW1lZGlhdGVseSBmb3IgYSBzcGVjaWZpYyBwYXJhY2hhaW4uAFEBTnVtYmVyIG9mIGluYm91bmQgYW5kIG91dGJvdW5kIGNoYW5uZWxzIGZvciBgcGFyYWAgbXVzdCBiZSBwcm92aWRlZCBhcyB3aXRuZXNzIGRhdGEuAJBPcmlnaW4gbXVzdCBiZSB0aGUgYENoYW5uZWxNYW5hZ2VyYC5cZm9yY2VfcHJvY2Vzc19ocm1wX29wZW4EASBjaGFubmVscxABDHUzMgAEIKRGb3JjZSBwcm9jZXNzIEhSTVAgb3BlbiBjaGFubmVsIHJlcXVlc3RzLgBVAUlmIHRoZXJlIGFyZSBwZW5kaW5nIEhSTVAgb3BlbiBjaGFubmVsIHJlcXVlc3RzLCB5b3UgY2FuIHVzZSB0aGlzIGZ1bmN0aW9uIHRvIHByb2Nlc3OIYWxsIG9mIHRob3NlIHJlcXVlc3RzIGltbWVkaWF0ZWx5LgAJAVRvdGFsIG51bWJlciBvZiBvcGVuaW5nIGNoYW5uZWxzIG11c3QgYmUgcHJvdmlkZWQgYXMgd2l0bmVzcyBkYXRhLgCQT3JpZ2luIG11c3QgYmUgdGhlIGBDaGFubmVsTWFuYWdlcmAuYGZvcmNlX3Byb2Nlc3NfaHJtcF9jbG9zZQQBIGNoYW5uZWxzEAEMdTMyAAUgqEZvcmNlIHByb2Nlc3MgSFJNUCBjbG9zZSBjaGFubmVsIHJlcXVlc3RzLgBZAUlmIHRoZXJlIGFyZSBwZW5kaW5nIEhSTVAgY2xvc2UgY2hhbm5lbCByZXF1ZXN0cywgeW91IGNhbiB1c2UgdGhpcyBmdW5jdGlvbiB0byBwcm9jZXNziGFsbCBvZiB0aG9zZSByZXF1ZXN0cyBpbW1lZGlhdGVseS4ACQFUb3RhbCBudW1iZXIgb2YgY2xvc2luZyBjaGFubmVscyBtdXN0IGJlIHByb3ZpZGVkIGFzIHdpdG5lc3MgZGF0YS4AkE9yaWdpbiBtdXN0IGJlIHRoZSBgQ2hhbm5lbE1hbmFnZXJgLmBocm1wX2NhbmNlbF9vcGVuX3JlcXVlc3QIAShjaGFubmVsX2lkGQUBNEhybXBDaGFubmVsSWQAATRvcGVuX3JlcXVlc3RzEAEMdTMyAAYgXQFUaGlzIGNhbmNlbHMgYSBwZW5kaW5nIG9wZW4gY2hhbm5lbCByZXF1ZXN0LiBJdCBjYW4gYmUgY2FuY2VsZWQgYnkgZWl0aGVyIG9mIHRoZSBzZW5kZXIZAW9yIHRoZSByZWNpcGllbnQgZm9yIHRoYXQgcmVxdWVzdC4gVGhlIG9yaWdpbiBtdXN0IGJlIGVpdGhlciBvZiB0aG9zZS4AXQFUaGUgY2FuY2VsbGF0aW9uIGhhcHBlbnMgaW1tZWRpYXRlbHkuIEl0IGlzIG5vdCBwb3NzaWJsZSB0byBjYW5jZWwgdGhlIHJlcXVlc3QgaWYgaXQgaXNEYWxyZWFkeSBhY2NlcHRlZC4AWQFUb3RhbCBudW1iZXIgb2Ygb3BlbiByZXF1ZXN0cyAoaS5lLiBgSHJtcE9wZW5DaGFubmVsUmVxdWVzdHNMaXN0YCkgbXVzdCBiZSBwcm92aWRlZCBhczR3aXRuZXNzIGRhdGEuXGZvcmNlX29wZW5faHJtcF9jaGFubmVsEAEYc2VuZGVyjQIBGFBhcmFJZAABJHJlY2lwaWVudI0CARhQYXJhSWQAATBtYXhfY2FwYWNpdHkQAQx1MzIAAUBtYXhfbWVzc2FnZV9zaXplEAEMdTMyAAcgYQFPcGVuIGEgY2hhbm5lbCBmcm9tIGEgYHNlbmRlcmAgdG8gYSBgcmVjaXBpZW50YCBgUGFyYUlkYC4gQWx0aG91Z2ggb3BlbmVkIGJ5IGdvdmVybmFuY2UsQQF0aGUgYG1heF9jYXBhY2l0eWAgYW5kIGBtYXhfbWVzc2FnZV9zaXplYCBhcmUgc3RpbGwgc3ViamVjdCB0byB0aGUgUmVsYXkgQ2hhaW4nc0hjb25maWd1cmVkIGxpbWl0cy4ATQFFeHBlY3RlZCB1c2UgaXMgd2hlbiBvbmUgKGFuZCBvbmx5IG9uZSkgb2YgdGhlIGBQYXJhSWRgcyBpbnZvbHZlZCBpbiB0aGUgY2hhbm5lbCBpc8Bnb3Zlcm5lZCBieSB0aGUgc3lzdGVtLCBlLmcuIGEgc3lzdGVtIHBhcmFjaGFpbi4AkE9yaWdpbiBtdXN0IGJlIHRoZSBgQ2hhbm5lbE1hbmFnZXJgLmBlc3RhYmxpc2hfc3lzdGVtX2NoYW5uZWwIARhzZW5kZXKNAgEYUGFyYUlkAAEkcmVjaXBpZW50jQIBGFBhcmFJZAAIMFEBRXN0YWJsaXNoIGFuIEhSTVAgY2hhbm5lbCBiZXR3ZWVuIHR3byBzeXN0ZW0gY2hhaW5zLiBJZiB0aGUgY2hhbm5lbCBkb2VzIG5vdCBhbHJlYWR5UQFleGlzdCwgdGhlIHRyYW5zYWN0aW9uIGZlZXMgd2lsbCBiZSByZWZ1bmRlZCB0byB0aGUgY2FsbGVyLiBUaGUgc3lzdGVtIGRvZXMgbm90IHRha2VZAWRlcG9zaXRzIGZvciBjaGFubmVscyBiZXR3ZWVuIHN5c3RlbSBjaGFpbnMsIGFuZCBhdXRvbWF0aWNhbGx5IHNldHMgdGhlIG1lc3NhZ2UgbnVtYmVyGQFhbmQgc2l6ZSBsaW1pdHMgdG8gdGhlIG1heGltdW0gYWxsb3dlZCBieSB0aGUgbmV0d29yaydzIGNvbmZpZ3VyYXRpb24uAChBcmd1bWVudHM6AJQtIGBzZW5kZXJgOiBBIHN5c3RlbSBjaGFpbiwgYFBhcmFJZGAuoC0gYHJlY2lwaWVudGA6IEEgc3lzdGVtIGNoYWluLCBgUGFyYUlkYC4AVQFBbnkgc2lnbmVkIG9yaWdpbiBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uLCBidXQgX2JvdGhfIGlucHV0cyBNVVNUIGJlIHN5c3RlbSBjaGFpbnMuIElmwHRoZSBjaGFubmVsIGRvZXMgbm90IGV4aXN0IHlldCwgdGhlcmUgaXMgbm8gZmVlLlRwb2tlX2NoYW5uZWxfZGVwb3NpdHMIARhzZW5kZXKNAgEYUGFyYUlkAAEkcmVjaXBpZW50jQIBGFBhcmFJZAAJJFEBVXBkYXRlIHRoZSBkZXBvc2l0cyBoZWxkIGZvciBhbiBIUk1QIGNoYW5uZWwgdG8gdGhlIGxhdGVzdCBgQ29uZmlndXJhdGlvbmAuIENoYW5uZWxzsHdpdGggc3lzdGVtIGNoYWlucyBkbyBub3QgcmVxdWlyZSBhIGRlcG9zaXQuAChBcmd1bWVudHM6AHgtIGBzZW5kZXJgOiBBIGNoYWluLCBgUGFyYUlkYC6ELSBgcmVjaXBpZW50YDogQSBjaGFpbiwgYFBhcmFJZGAuAKRBbnkgc2lnbmVkIG9yaWdpbiBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uLnRlc3RhYmxpc2hfY2hhbm5lbF93aXRoX3N5c3RlbQQBTHRhcmdldF9zeXN0ZW1fY2hhaW6NAgEYUGFyYUlkAAocOQFFc3RhYmxpc2ggYSBiaWRpcmVjdGlvbmFsIEhSTVAgY2hhbm5lbCBiZXR3ZWVuIGEgcGFyYWNoYWluIGFuZCBhIHN5c3RlbSBjaGFpbi4AKEFyZ3VtZW50czoAyC0gYHRhcmdldF9zeXN0ZW1fY2hhaW5gOiBBIHN5c3RlbSBjaGFpbiwgYFBhcmFJZGAuALBUaGUgb3JpZ2luIG5lZWRzIHRvIGJlIHRoZSBwYXJhY2hhaW4gb3JpZ2luLgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy4ZBQx0cG9sa2Fkb3RfcGFyYWNoYWluX3ByaW1pdGl2ZXMocHJpbWl0aXZlczRIcm1wQ2hhbm5lbElkAAAIARhzZW5kZXKNAgEISWQAASRyZWNpcGllbnSNAgEISWQAAB0FEGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMgZGlzcHV0ZXMYcGFsbGV0EENhbGwEBFQAAQQ4Zm9yY2VfdW5mcmVlemUAAAAEDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMuIQUUbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucyBkaXNwdXRlcyBzbGFzaGluZxhwYWxsZXQQQ2FsbAQEVAABBHByZXBvcnRfZGlzcHV0ZV9sb3N0X3Vuc2lnbmVkCAE0ZGlzcHV0ZV9wcm9vZiUFAURCb3g8RGlzcHV0ZVByb29mPgABPGtleV9vd25lcl9wcm9vZq0BAUBUOjpLZXlPd25lclByb29mAAAABA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLiUFEExwb2xrYWRvdF9wcmltaXRpdmVzCHY3IHNsYXNoaW5nMERpc3B1dGVQcm9vZgAAEAEkdGltZV9zbG90KQUBQERpc3B1dGVzVGltZVNsb3QAARBraW5kLQUBTFNsYXNoaW5nT2ZmZW5jZUtpbmQAATx2YWxpZGF0b3JfaW5kZXiZBAE4VmFsaWRhdG9ySW5kZXgAATB2YWxpZGF0b3JfaWQdAgEsVmFsaWRhdG9ySWQAACkFEExwb2xrYWRvdF9wcmltaXRpdmVzCHY3IHNsYXNoaW5nQERpc3B1dGVzVGltZVNsb3QAAAgBNHNlc3Npb25faW5kZXgQATBTZXNzaW9uSW5kZXgAAThjYW5kaWRhdGVfaGFzaO0EATRDYW5kaWRhdGVIYXNoAAAtBRBMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2NyBzbGFzaGluZ0xTbGFzaGluZ09mZmVuY2VLaW5kAAEIKEZvckludmFsaWQAAAAwQWdhaW5zdFZhbGlkAAEAADEFEGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnNIYXNzaWduZXJfb25fZGVtYW5kGHBhbGxldBBDYWxsBARUAAEIXHBsYWNlX29yZGVyX2FsbG93X2RlYXRoCAEobWF4X2Ftb3VudBgBMEJhbGFuY2VPZjxUPgABHHBhcmFfaWSNAgEYUGFyYUlkAAA8lENyZWF0ZSBhIHNpbmdsZSBvbiBkZW1hbmQgY29yZSBvcmRlci5JAVdpbGwgdXNlIHRoZSBzcG90IHByaWNlIGZvciB0aGUgY3VycmVudCBibG9jayBhbmQgd2lsbCByZWFwIHRoZSBhY2NvdW50IGlmIG5lZWRlZC4ALFBhcmFtZXRlcnM6OQEtIGBvcmlnaW5gOiBUaGUgc2VuZGVyIG9mIHRoZSBjYWxsLCBmdW5kcyB3aWxsIGJlIHdpdGhkcmF3biBmcm9tIHRoaXMgYWNjb3VudC5JAS0gYG1heF9hbW91bnRgOiBUaGUgbWF4aW11bSBiYWxhbmNlIHRvIHdpdGhkcmF3IGZyb20gdGhlIG9yaWdpbiB0byBwbGFjZSBhbiBvcmRlci4NAS0gYHBhcmFfaWRgOiBBIGBQYXJhSWRgIHRoZSBvcmlnaW4gd2FudHMgdG8gcHJvdmlkZSBibG9ja3NwYWNlIGZvci4AHEVycm9yczrkLSBgSW5zdWZmaWNpZW50QmFsYW5jZWA6IGZyb20gdGhlIEN1cnJlbmN5IGltcGxlbWVudGF0aW9uNC0gYFF1ZXVlRnVsbGCALSBgU3BvdFByaWNlSGlnaGVyVGhhbk1heEFtb3VudGAAHEV2ZW50czpcLSBgT25EZW1hbmRPcmRlclBsYWNlZGBYcGxhY2Vfb3JkZXJfa2VlcF9hbGl2ZQgBKG1heF9hbW91bnQYATBCYWxhbmNlT2Y8VD4AARxwYXJhX2lkjQIBGFBhcmFJZAABPGEBU2FtZSBhcyB0aGUgW2BwbGFjZV9vcmRlcl9hbGxvd19kZWF0aGBdKFNlbGY6OnBsYWNlX29yZGVyX2FsbG93X2RlYXRoKSBjYWxsICwgYnV0IHdpdGggYdxjaGVjayB0aGF0IHBsYWNpbmcgdGhlIG9yZGVyIHdpbGwgbm90IHJlYXAgdGhlIGFjY291bnQuACxQYXJhbWV0ZXJzOjkBLSBgb3JpZ2luYDogVGhlIHNlbmRlciBvZiB0aGUgY2FsbCwgZnVuZHMgd2lsbCBiZSB3aXRoZHJhd24gZnJvbSB0aGlzIGFjY291bnQuSQEtIGBtYXhfYW1vdW50YDogVGhlIG1heGltdW0gYmFsYW5jZSB0byB3aXRoZHJhdyBmcm9tIHRoZSBvcmlnaW4gdG8gcGxhY2UgYW4gb3JkZXIuDQEtIGBwYXJhX2lkYDogQSBgUGFyYUlkYCB0aGUgb3JpZ2luIHdhbnRzIHRvIHByb3ZpZGUgYmxvY2tzcGFjZSBmb3IuABxFcnJvcnM65C0gYEluc3VmZmljaWVudEJhbGFuY2VgOiBmcm9tIHRoZSBDdXJyZW5jeSBpbXBsZW1lbnRhdGlvbjQtIGBRdWV1ZUZ1bGxggC0gYFNwb3RQcmljZUhpZ2hlclRoYW5NYXhBbW91bnRgABxFdmVudHM6XC0gYE9uRGVtYW5kT3JkZXJQbGFjZWRgBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLjUFEFxwb2xrYWRvdF9ydW50aW1lX2NvbW1vbjxwYXJhc19yZWdpc3RyYXIYcGFsbGV0EENhbGwEBFQAASQgcmVnaXN0ZXIMAQhpZI0CARhQYXJhSWQAATBnZW5lc2lzX2hlYWTZBAEgSGVhZERhdGEAATx2YWxpZGF0aW9uX2NvZGXVBAE4VmFsaWRhdGlvbkNvZGUAAFD4UmVnaXN0ZXIgaGVhZCBkYXRhIGFuZCB2YWxpZGF0aW9uIGNvZGUgZm9yIGEgcmVzZXJ2ZWQgUGFyYSBJZC4AMCMjIEFyZ3VtZW50c8AtIGBvcmlnaW5gOiBNdXN0IGJlIGNhbGxlZCBieSBhIGBTaWduZWRgIG9yaWdpbi4tAS0gYGlkYDogVGhlIHBhcmEgSUQuIE11c3QgYmUgb3duZWQvbWFuYWdlZCBieSB0aGUgYG9yaWdpbmAgc2lnbmluZyBhY2NvdW50LgEBLSBgZ2VuZXNpc19oZWFkYDogVGhlIGdlbmVzaXMgaGVhZCBkYXRhIG9mIHRoZSBwYXJhY2hhaW4vdGhyZWFkLiUBLSBgdmFsaWRhdGlvbl9jb2RlYDogVGhlIGluaXRpYWwgdmFsaWRhdGlvbiBjb2RlIG9mIHRoZSBwYXJhY2hhaW4vdGhyZWFkLgBAIyMgRGVwb3NpdHMvRmVlcwkBVGhlIGFjY291bnQgd2l0aCB0aGUgb3JpZ2luYXRpbmcgc2lnbmF0dXJlIG11c3QgcmVzZXJ2ZSBhIGRlcG9zaXQuAE0BVGhlIGRlcG9zaXQgaXMgcmVxdWlyZWQgdG8gY292ZXIgdGhlIGNvc3RzIGFzc29jaWF0ZWQgd2l0aCBzdG9yaW5nIHRoZSBnZW5lc2lzIGhlYWR0ZGF0YSBhbmQgdGhlIHZhbGlkYXRpb24gY29kZS4xAVRoaXMgYWNjb3VudHMgZm9yIHRoZSBwb3RlbnRpYWwgdG8gc3RvcmUgdmFsaWRhdGlvbiBjb2RlIG9mIGEgc2l6ZSB1cCB0byB0aGXcYG1heF9jb2RlX3NpemVgLCBhcyBkZWZpbmVkIGluIHRoZSBjb25maWd1cmF0aW9uIHBhbGxldAAdAUFueXRoaW5nIGFscmVhZHkgcmVzZXJ2ZWQgcHJldmlvdXNseSBmb3IgdGhpcyBwYXJhIElEIGlzIGFjY291bnRlZCBmb3IuACQjIyBFdmVudHPUVGhlIGBSZWdpc3RlcmVkYCBldmVudCBpcyBlbWl0dGVkIGluIGNhc2Ugb2Ygc3VjY2Vzcy44Zm9yY2VfcmVnaXN0ZXIUAQx3aG8AATBUOjpBY2NvdW50SWQAARxkZXBvc2l0GAEwQmFsYW5jZU9mPFQ+AAEIaWSNAgEYUGFyYUlkAAEwZ2VuZXNpc19oZWFk2QQBIEhlYWREYXRhAAE8dmFsaWRhdGlvbl9jb2Rl1QQBOFZhbGlkYXRpb25Db2RlAAEY3EZvcmNlIHRoZSByZWdpc3RyYXRpb24gb2YgYSBQYXJhIElkIG9uIHRoZSByZWxheSBjaGFpbi4AuFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgYnkgYSBSb290IG9yaWdpbi4AGQFUaGUgZGVwb3NpdCB0YWtlbiBjYW4gYmUgc3BlY2lmaWVkIGZvciB0aGlzIHJlZ2lzdHJhdGlvbi4gQW55IGBQYXJhSWRgGQFjYW4gYmUgcmVnaXN0ZXJlZCwgaW5jbHVkaW5nIHN1Yi0xMDAwIElEcyB3aGljaCBhcmUgU3lzdGVtIFBhcmFjaGFpbnMuKGRlcmVnaXN0ZXIEAQhpZI0CARhQYXJhSWQAAhAFAURlcmVnaXN0ZXIgYSBQYXJhIElkLCBmcmVlaW5nIGFsbCBkYXRhIGFuZCByZXR1cm5pbmcgYW55IGRlcG9zaXQuAFEBVGhlIGNhbGxlciBtdXN0IGJlIFJvb3QsIHRoZSBgcGFyYWAgb3duZXIsIG9yIHRoZSBgcGFyYWAgaXRzZWxmLiBUaGUgcGFyYSBtdXN0IGJlIGFuUG9uLWRlbWFuZCBwYXJhY2hhaW4uEHN3YXAIAQhpZI0CARhQYXJhSWQAARRvdGhlco0CARhQYXJhSWQAAzBBAVN3YXAgYSBsZWFzZSBob2xkaW5nIHBhcmFjaGFpbiB3aXRoIGFub3RoZXIgcGFyYWNoYWluLCBlaXRoZXIgb24tZGVtYW5kIG9yIGxlYXNlIGhvbGRpbmcuAAEBVGhlIG9yaWdpbiBtdXN0IGJlIFJvb3QsIHRoZSBgcGFyYWAgb3duZXIsIG9yIHRoZSBgcGFyYWAgaXRzZWxmLgBhAVRoZSBzd2FwIHdpbGwgaGFwcGVuIG9ubHkgaWYgdGhlcmUgaXMgYWxyZWFkeSBhbiBvcHBvc2l0ZSBzd2FwIHBlbmRpbmcuIElmIHRoZXJlIGlzIG5vdCxZAXRoZSBzd2FwIHdpbGwgYmUgc3RvcmVkIGluIHRoZSBwZW5kaW5nIHN3YXBzIG1hcCwgcmVhZHkgZm9yIGEgbGF0ZXIgY29uZmlybWF0b3J5IHN3YXAuAF0BVGhlIGBQYXJhSWRgcyByZW1haW4gbWFwcGVkIHRvIHRoZSBzYW1lIGhlYWQgZGF0YSBhbmQgY29kZSBzbyBleHRlcm5hbCBjb2RlIGNhbiByZWx5IG9uPQFgUGFyYUlkYCB0byBiZSBhIGxvbmctdGVybSBpZGVudGlmaWVyIG9mIGEgbm90aW9uYWwgInBhcmFjaGFpbiIuIEhvd2V2ZXIsIHRoZWlyNQFzY2hlZHVsaW5nIGluZm8gKGkuZS4gd2hldGhlciB0aGV5J3JlIGFuIG9uLWRlbWFuZCBwYXJhY2hhaW4gb3IgbGVhc2UgaG9sZGluZxUBcGFyYWNoYWluKSwgYXVjdGlvbiBpbmZvcm1hdGlvbiBhbmQgdGhlIGF1Y3Rpb24gZGVwb3NpdCBhcmUgc3dpdGNoZWQuLHJlbW92ZV9sb2NrBAEQcGFyYY0CARhQYXJhSWQABBANAVJlbW92ZSBhIG1hbmFnZXIgbG9jayBmcm9tIGEgcGFyYS4gVGhpcyB3aWxsIGFsbG93IHRoZSBtYW5hZ2VyIG9mIGE1AXByZXZpb3VzbHkgbG9ja2VkIHBhcmEgdG8gZGVyZWdpc3RlciBvciBzd2FwIGEgcGFyYSB3aXRob3V0IHVzaW5nIGdvdmVybmFuY2UuANxDYW4gb25seSBiZSBjYWxsZWQgYnkgdGhlIFJvb3Qgb3JpZ2luIG9yIHRoZSBwYXJhY2hhaW4uHHJlc2VydmUABUSUUmVzZXJ2ZSBhIFBhcmEgSWQgb24gdGhlIHJlbGF5IGNoYWluLgBNAVRoaXMgZnVuY3Rpb24gd2lsbCByZXNlcnZlIGEgbmV3IFBhcmEgSWQgdG8gYmUgb3duZWQvbWFuYWdlZCBieSB0aGUgb3JpZ2luIGFjY291bnQuYQFUaGUgb3JpZ2luIGFjY291bnQgaXMgYWJsZSB0byByZWdpc3RlciBoZWFkIGRhdGEgYW5kIHZhbGlkYXRpb24gY29kZSB1c2luZyBgcmVnaXN0ZXJgIHRvWQFjcmVhdGUgYW4gb24tZGVtYW5kIHBhcmFjaGFpbi4gVXNpbmcgdGhlIFNsb3RzIHBhbGxldCwgYW4gb24tZGVtYW5kIHBhcmFjaGFpbiBjYW4gdGhlbqRiZSB1cGdyYWRlZCB0byBhIGxlYXNlIGhvbGRpbmcgcGFyYWNoYWluLgAwIyMgQXJndW1lbnRzVQEtIGBvcmlnaW5gOiBNdXN0IGJlIGNhbGxlZCBieSBhIGBTaWduZWRgIG9yaWdpbi4gQmVjb21lcyB0aGUgbWFuYWdlci9vd25lciBvZiB0aGUgbmV3KCAgcGFyYSBJRC4AQCMjIERlcG9zaXRzL0ZlZXMhAVRoZSBvcmlnaW4gbXVzdCByZXNlcnZlIGEgZGVwb3NpdCBvZiBgUGFyYURlcG9zaXRgIGZvciB0aGUgcmVnaXN0cmF0aW9uLgAkIyMgRXZlbnRzWQFUaGUgYFJlc2VydmVkYCBldmVudCBpcyBlbWl0dGVkIGluIGNhc2Ugb2Ygc3VjY2Vzcywgd2hpY2ggcHJvdmlkZXMgdGhlIElEIHJlc2VydmVkIGZvchB1c2UuIGFkZF9sb2NrBAEQcGFyYY0CARhQYXJhSWQABhQJAUFkZCBhIG1hbmFnZXIgbG9jayBmcm9tIGEgcGFyYS4gVGhpcyB3aWxsIHByZXZlbnQgdGhlIG1hbmFnZXIgb2YgYYhwYXJhIHRvIGRlcmVnaXN0ZXIgb3Igc3dhcCBhIHBhcmEuAEkBQ2FuIGJlIGNhbGxlZCBieSBSb290LCB0aGUgcGFyYWNoYWluLCBvciB0aGUgcGFyYWNoYWluIG1hbmFnZXIgaWYgdGhlIHBhcmFjaGFpbiBpcyR1bmxvY2tlZC5Uc2NoZWR1bGVfY29kZV91cGdyYWRlCAEQcGFyYY0CARhQYXJhSWQAASBuZXdfY29kZdUEAThWYWxpZGF0aW9uQ29kZQAHLHRTY2hlZHVsZSBhIHBhcmFjaGFpbiB1cGdyYWRlLgBVAVRoaXMgd2lsbCBraWNrIG9mZiBhIGNoZWNrIG9mIGBuZXdfY29kZWAgYnkgYWxsIHZhbGlkYXRvcnMuIEFmdGVyIHRoZSBtYWpvcml0eSBvZiB0aGVVAXZhbGlkYXRvcnMgaGF2ZSByZXBvcnRlZCBvbiB0aGUgdmFsaWRpdHkgb2YgdGhlIGNvZGUsIHRoZSBjb2RlIHdpbGwgZWl0aGVyIGJlIGVuYWN0ZWRVAW9yIHRoZSB1cGdyYWRlIHdpbGwgYmUgcmVqZWN0ZWQuIElmIHRoZSBjb2RlIHdpbGwgYmUgZW5hY3RlZCwgdGhlIGN1cnJlbnQgY29kZSBvZiB0aGVdAXBhcmFjaGFpbiB3aWxsIGJlIG92ZXJ3cml0dGVuIGRpcmVjdGx5LiBUaGlzIG1lYW5zIHRoYXQgYW55IFBvViB3aWxsIGJlIGNoZWNrZWQgYnkgdGhpc10BbmV3IGNvZGUuIFRoZSBwYXJhY2hhaW4gaXRzZWxmIHdpbGwgbm90IGJlIGluZm9ybWVkIGV4cGxpY2l0bHkgdGhhdCB0aGUgdmFsaWRhdGlvbiBjb2RlMGhhcyBjaGFuZ2VkLgBJAUNhbiBiZSBjYWxsZWQgYnkgUm9vdCwgdGhlIHBhcmFjaGFpbiwgb3IgdGhlIHBhcmFjaGFpbiBtYW5hZ2VyIGlmIHRoZSBwYXJhY2hhaW4gaXMkdW5sb2NrZWQuQHNldF9jdXJyZW50X2hlYWQIARBwYXJhjQIBGFBhcmFJZAABIG5ld19oZWFk2QQBIEhlYWREYXRhAAgQhFNldCB0aGUgcGFyYWNoYWluJ3MgY3VycmVudCBoZWFkLgBJAUNhbiBiZSBjYWxsZWQgYnkgUm9vdCwgdGhlIHBhcmFjaGFpbiwgb3IgdGhlIHBhcmFjaGFpbiBtYW5hZ2VyIGlmIHRoZSBwYXJhY2hhaW4gaXMkdW5sb2NrZWQuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLjkFEFxwb2xrYWRvdF9ydW50aW1lX2NvbW1vbhRzbG90cxhwYWxsZXQQQ2FsbAQEVAABDCxmb3JjZV9sZWFzZRQBEHBhcmGNAgEYUGFyYUlkAAEYbGVhc2VyAAEwVDo6QWNjb3VudElkAAEYYW1vdW50GAEwQmFsYW5jZU9mPFQ+AAEwcGVyaW9kX2JlZ2luEAFATGVhc2VQZXJpb2RPZjxUPgABMHBlcmlvZF9jb3VudBABQExlYXNlUGVyaW9kT2Y8VD4AABBNAUp1c3QgYSBjb25uZWN0IGludG8gdGhlIGBsZWFzZV9vdXRgIGNhbGwsIGluIGNhc2UgUm9vdCB3YW50cyB0byBmb3JjZSBzb21lIGxlYXNlIHRv/GhhcHBlbiBpbmRlcGVuZGVudGx5IG9mIGFueSBvdGhlciBvbi1jaGFpbiBtZWNoYW5pc20gdG8gdXNlIGl0LgD4VGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgbWF0Y2ggYFQ6OkZvcmNlT3JpZ2luYC5AY2xlYXJfYWxsX2xlYXNlcwQBEHBhcmGNAgEYUGFyYUlkAAEMTQFDbGVhciBhbGwgbGVhc2VzIGZvciBhIFBhcmEgSWQsIHJlZnVuZGluZyBhbnkgZGVwb3NpdHMgYmFjayB0byB0aGUgb3JpZ2luYWwgb3duZXJzLgD4VGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgbWF0Y2ggYFQ6OkZvcmNlT3JpZ2luYC48dHJpZ2dlcl9vbmJvYXJkBAEQcGFyYY0CARhQYXJhSWQAAhwlAVRyeSB0byBvbmJvYXJkIGEgcGFyYWNoYWluIHRoYXQgaGFzIGEgbGVhc2UgZm9yIHRoZSBjdXJyZW50IGxlYXNlIHBlcmlvZC4ARQFUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VmdWwgaWYgdGhlcmUgd2FzIHNvbWUgc3RhdGUgaXNzdWUgd2l0aCBhIHBhcmEgdGhhdCBzaG91bGQ5AWhhdmUgb25ib2FyZGVkLCBidXQgd2FzIHVuYWJsZSB0by4gQXMgbG9uZyBhcyB0aGV5IGhhdmUgYSBsZWFzZSBwZXJpb2QsIHdlIGNhbmxsZXQgdGhlbSBvbmJvYXJkIGZyb20gaGVyZS4AzE9yaWdpbiBtdXN0IGJlIHNpZ25lZCwgYnV0IGNhbiBiZSBjYWxsZWQgYnkgYW55b25lLgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy49BRBccG9sa2Fkb3RfcnVudGltZV9jb21tb24gYXVjdGlvbnMYcGFsbGV0EENhbGwEBFQAAQwsbmV3X2F1Y3Rpb24IASBkdXJhdGlvbuwBREJsb2NrTnVtYmVyRm9yPFQ+AAFIbGVhc2VfcGVyaW9kX2luZGV47AFATGVhc2VQZXJpb2RPZjxUPgAAFFRDcmVhdGUgYSBuZXcgYXVjdGlvbi4AUQFUaGlzIGNhbiBvbmx5IGhhcHBlbiB3aGVuIHRoZXJlIGlzbid0IGFscmVhZHkgYW4gYXVjdGlvbiBpbiBwcm9ncmVzcyBhbmQgbWF5IG9ubHkgYmUlAWNhbGxlZCBieSB0aGUgcm9vdCBvcmlnaW4uIEFjY2VwdHMgdGhlIGBkdXJhdGlvbmAgb2YgdGhpcyBhdWN0aW9uIGFuZCB0aGVZAWBsZWFzZV9wZXJpb2RfaW5kZXhgIG9mIHRoZSBpbml0aWFsIGxlYXNlIHBlcmlvZCBvZiB0aGUgZm91ciB0aGF0IGFyZSB0byBiZSBhdWN0aW9uZWQuDGJpZBQBEHBhcmFBBQEYUGFyYUlkAAE0YXVjdGlvbl9pbmRleOwBMEF1Y3Rpb25JbmRleAABKGZpcnN0X3Nsb3TsAUBMZWFzZVBlcmlvZE9mPFQ+AAEkbGFzdF9zbG907AFATGVhc2VQZXJpb2RPZjxUPgABGGFtb3VudPwBMEJhbGFuY2VPZjxUPgABQEkBTWFrZSBhIG5ldyBiaWQgZnJvbSBhbiBhY2NvdW50IChpbmNsdWRpbmcgYSBwYXJhY2hhaW4gYWNjb3VudCkgZm9yIGRlcGxveWluZyBhIG5ldyhwYXJhY2hhaW4uAFkBTXVsdGlwbGUgc2ltdWx0YW5lb3VzIGJpZHMgZnJvbSB0aGUgc2FtZSBiaWRkZXIgYXJlIGFsbG93ZWQgb25seSBhcyBsb25nIGFzIGFsbCBhY3RpdmU9AWJpZHMgb3ZlcmxhcCBlYWNoIG90aGVyIChpLmUuIGFyZSBtdXR1YWxseSBleGNsdXNpdmUpLiBCaWRzIGNhbm5vdCBiZSByZWRhY3RlZC4AVQEtIGBzdWJgIGlzIHRoZSBzdWItYmlkZGVyIElELCBhbGxvd2luZyBmb3IgbXVsdGlwbGUgY29tcGV0aW5nIGJpZHMgdG8gYmUgbWFkZSBieSAoYW5kcGZ1bmRlZCBieSkgdGhlIHNhbWUgYWNjb3VudC5NAS0gYGF1Y3Rpb25faW5kZXhgIGlzIHRoZSBpbmRleCBvZiB0aGUgYXVjdGlvbiB0byBiaWQgb24uIFNob3VsZCBqdXN0IGJlIHRoZSBwcmVzZW50aHZhbHVlIG9mIGBBdWN0aW9uQ291bnRlcmAuSQEtIGBmaXJzdF9zbG90YCBpcyB0aGUgZmlyc3QgbGVhc2UgcGVyaW9kIGluZGV4IG9mIHRoZSByYW5nZSB0byBiaWQgb24uIFRoaXMgaXMgdGhlCQFhYnNvbHV0ZSBsZWFzZSBwZXJpb2QgaW5kZXggdmFsdWUsIG5vdCBhbiBhdWN0aW9uLXNwZWNpZmljIG9mZnNldC5BAS0gYGxhc3Rfc2xvdGAgaXMgdGhlIGxhc3QgbGVhc2UgcGVyaW9kIGluZGV4IG9mIHRoZSByYW5nZSB0byBiaWQgb24uIFRoaXMgaXMgdGhlCQFhYnNvbHV0ZSBsZWFzZSBwZXJpb2QgaW5kZXggdmFsdWUsIG5vdCBhbiBhdWN0aW9uLXNwZWNpZmljIG9mZnNldC5JAS0gYGFtb3VudGAgaXMgdGhlIGFtb3VudCB0byBiaWQgdG8gYmUgaGVsZCBhcyBkZXBvc2l0IGZvciB0aGUgcGFyYWNoYWluIHNob3VsZCB0aGXIYmlkIHdpbi4gVGhpcyBhbW91bnQgaXMgaGVsZCB0aHJvdWdob3V0IHRoZSByYW5nZS44Y2FuY2VsX2F1Y3Rpb24AAgx4Q2FuY2VsIGFuIGluLXByb2dyZXNzIGF1Y3Rpb24uAIhDYW4gb25seSBiZSBjYWxsZWQgYnkgUm9vdCBvcmlnaW4uBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLkEFAAAGjQIARQUQXHBvbGthZG90X3J1bnRpbWVfY29tbW9uJGNyb3dkbG9hbhhwYWxsZXQQQ2FsbAQEVAABJBhjcmVhdGUYARRpbmRleEEFARhQYXJhSWQAAQxjYXD8ATBCYWxhbmNlT2Y8VD4AATBmaXJzdF9wZXJpb2TsAUBMZWFzZVBlcmlvZE9mPFQ+AAEsbGFzdF9wZXJpb2TsAUBMZWFzZVBlcmlvZE9mPFQ+AAEMZW5k7AFEQmxvY2tOdW1iZXJGb3I8VD4AASB2ZXJpZmllckkFAUxPcHRpb248TXVsdGlTaWduZXI+AAAUTQFDcmVhdGUgYSBuZXcgY3Jvd2Rsb2FuaW5nIGNhbXBhaWduIGZvciBhIHBhcmFjaGFpbiBzbG90IHdpdGggdGhlIGdpdmVuIGxlYXNlIHBlcmlvZBhyYW5nZS4AXQFUaGlzIGFwcGxpZXMgYSBsb2NrIHRvIHlvdXIgcGFyYWNoYWluIGNvbmZpZ3VyYXRpb24sIGVuc3VyaW5nIHRoYXQgaXQgY2Fubm90IGJlIGNoYW5nZWRkYnkgdGhlIHBhcmFjaGFpbiBtYW5hZ2VyLihjb250cmlidXRlDAEUaW5kZXhBBQEYUGFyYUlkAAEUdmFsdWX8ATBCYWxhbmNlT2Y8VD4AASRzaWduYXR1cmVRBQFYT3B0aW9uPE11bHRpU2lnbmF0dXJlPgABCFEBQ29udHJpYnV0ZSB0byBhIGNyb3dkIHNhbGUuIFRoaXMgd2lsbCB0cmFuc2ZlciBzb21lIGJhbGFuY2Ugb3ZlciB0byBmdW5kIGEgcGFyYWNoYWluUQFzbG90LiBJdCB3aWxsIGJlIHdpdGhkcmF3YWJsZSB3aGVuIHRoZSBjcm93ZGxvYW4gaGFzIGVuZGVkIGFuZCB0aGUgZnVuZHMgYXJlIHVudXNlZC4gd2l0aGRyYXcIAQx3aG8AATBUOjpBY2NvdW50SWQAARRpbmRleEEFARhQYXJhSWQAAkTAV2l0aGRyYXcgZnVsbCBiYWxhbmNlIG9mIGEgc3BlY2lmaWMgY29udHJpYnV0b3IuAMBPcmlnaW4gbXVzdCBiZSBzaWduZWQsIGJ1dCBjYW4gY29tZSBmcm9tIGFueW9uZS4AXQFUaGUgZnVuZCBtdXN0IGJlIGVpdGhlciBpbiwgb3IgcmVhZHkgZm9yLCByZXRpcmVtZW50LiBGb3IgYSBmdW5kIHRvIGJlICppbiogcmV0aXJlbWVudCxJAXRoZW4gdGhlIHJldGlyZW1lbnQgZmxhZyBtdXN0IGJlIHNldC4gRm9yIGEgZnVuZCB0byBiZSByZWFkeSBmb3IgcmV0aXJlbWVudCwgdGhlbjqcLSBpdCBtdXN0IG5vdCBhbHJlYWR5IGJlIGluIHJldGlyZW1lbnQ7TQEtIHRoZSBhbW91bnQgb2YgcmFpc2VkIGZ1bmRzIG11c3QgYmUgYmlnZ2VyIHRoYW4gdGhlIF9mcmVlXyBiYWxhbmNlIG9mIHRoZSBhY2NvdW50OzQtIGFuZCBlaXRoZXI6vCAgLSB0aGUgYmxvY2sgbnVtYmVyIG11c3QgYmUgYXQgbGVhc3QgYGVuZGA7IG9yLQEgIC0gdGhlIGN1cnJlbnQgbGVhc2UgcGVyaW9kIG11c3QgYmUgZ3JlYXRlciB0aGFuIHRoZSBmdW5kJ3MgYGxhc3RfcGVyaW9kYC4AVQFJbiB0aGlzIGNhc2UsIHRoZSBmdW5kJ3MgcmV0aXJlbWVudCBmbGFnIGlzIHNldCBhbmQgaXRzIGBlbmRgIGlzIHJlc2V0IHRvIHRoZSBjdXJyZW50NGJsb2NrIG51bWJlci4A8C0gYHdob2A6IFRoZSBhY2NvdW50IHdob3NlIGNvbnRyaWJ1dGlvbiBzaG91bGQgYmUgd2l0aGRyYXduLhkBLSBgaW5kZXhgOiBUaGUgcGFyYWNoYWluIHRvIHdob3NlIGNyb3dkbG9hbiB0aGUgY29udHJpYnV0aW9uIHdhcyBtYWRlLhhyZWZ1bmQEARRpbmRleEEFARhQYXJhSWQAAxTgQXV0b21hdGljYWxseSByZWZ1bmQgY29udHJpYnV0b3JzIG9mIGFuIGVuZGVkIGNyb3dkbG9hbi4hAUR1ZSB0byB3ZWlnaHQgcmVzdHJpY3Rpb25zLCB0aGlzIGZ1bmN0aW9uIG1heSBuZWVkIHRvIGJlIGNhbGxlZCBtdWx0aXBsZUkBdGltZXMgdG8gZnVsbHkgcmVmdW5kIGFsbCB1c2Vycy4gV2Ugd2lsbCByZWZ1bmQgYFJlbW92ZUtleXNMaW1pdGAgdXNlcnMgYXQgYSB0aW1lLgDAT3JpZ2luIG11c3QgYmUgc2lnbmVkLCBidXQgY2FuIGNvbWUgZnJvbSBhbnlvbmUuIGRpc3NvbHZlBAEUaW5kZXhBBQEYUGFyYUlkAAQEVQFSZW1vdmUgYSBmdW5kIGFmdGVyIHRoZSByZXRpcmVtZW50IHBlcmlvZCBoYXMgZW5kZWQgYW5kIGFsbCBmdW5kcyBoYXZlIGJlZW4gcmV0dXJuZWQuEGVkaXQYARRpbmRleEEFARhQYXJhSWQAAQxjYXD8ATBCYWxhbmNlT2Y8VD4AATBmaXJzdF9wZXJpb2TsAUBMZWFzZVBlcmlvZE9mPFQ+AAEsbGFzdF9wZXJpb2TsAUBMZWFzZVBlcmlvZE9mPFQ+AAEMZW5k7AFEQmxvY2tOdW1iZXJGb3I8VD4AASB2ZXJpZmllckkFAUxPcHRpb248TXVsdGlTaWduZXI+AAUM0EVkaXQgdGhlIGNvbmZpZ3VyYXRpb24gZm9yIGFuIGluLXByb2dyZXNzIGNyb3dkbG9hbi4AiENhbiBvbmx5IGJlIGNhbGxlZCBieSBSb290IG9yaWdpbi4gYWRkX21lbW8IARRpbmRleI0CARhQYXJhSWQAARBtZW1vOAEcVmVjPHU4PgAGDOxBZGQgYW4gb3B0aW9uYWwgbWVtbyB0byBhbiBleGlzdGluZyBjcm93ZGxvYW4gY29udHJpYnV0aW9uLgAtAU9yaWdpbiBtdXN0IGJlIFNpZ25lZCwgYW5kIHRoZSB1c2VyIG11c3QgaGF2ZSBjb250cmlidXRlZCB0byB0aGUgY3Jvd2Rsb2FuLhBwb2tlBAEUaW5kZXiNAgEYUGFyYUlkAAcMdFBva2UgdGhlIGZ1bmQgaW50byBgTmV3UmFpc2VgANxPcmlnaW4gbXVzdCBiZSBTaWduZWQsIGFuZCB0aGUgZnVuZCBoYXMgbm9uLXplcm8gcmFpc2UuOGNvbnRyaWJ1dGVfYWxsCAEUaW5kZXhBBQEYUGFyYUlkAAEkc2lnbmF0dXJlUQUBWE9wdGlvbjxNdWx0aVNpZ25hdHVyZT4ACAxhAUNvbnRyaWJ1dGUgeW91ciBlbnRpcmUgYmFsYW5jZSB0byBhIGNyb3dkIHNhbGUuIFRoaXMgd2lsbCB0cmFuc2ZlciB0aGUgZW50aXJlIGJhbGFuY2Ugb2ZRAWEgdXNlciBvdmVyIHRvIGZ1bmQgYSBwYXJhY2hhaW4gc2xvdC4gSXQgd2lsbCBiZSB3aXRoZHJhd2FibGUgd2hlbiB0aGUgY3Jvd2Rsb2FuIGhhc3xlbmRlZCBhbmQgdGhlIGZ1bmRzIGFyZSB1bnVzZWQuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLkkFBBhPcHRpb24EBFQBTQUBCBBOb25lAAAAEFNvbWUEAE0FAAABAABNBQgoc3BfcnVudGltZSxNdWx0aVNpZ25lcgABDBxFZDI1NTE5BAAEATxlZDI1NTE5OjpQdWJsaWMAAAAcU3IyNTUxOQQABAE8c3IyNTUxOTo6UHVibGljAAEAFEVjZHNhBAAtAgE0ZWNkc2E6OlB1YmxpYwACAABRBQQYT3B0aW9uBARUAVUFAQgQTm9uZQAAABBTb21lBABVBQAAAQAAVQUIKHNwX3J1bnRpbWU4TXVsdGlTaWduYXR1cmUAAQwcRWQyNTUxOQQASQIBSGVkMjU1MTk6OlNpZ25hdHVyZQAAABxTcjI1NTE5BABJAgFIc3IyNTUxOTo6U2lnbmF0dXJlAAEAFEVjZHNhBADZAgFAZWNkc2E6OlNpZ25hdHVyZQACAABZBRBscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zIGNvcmV0aW1lGHBhbGxldBBDYWxsBARUAAEMSHJlcXVlc3RfY29yZV9jb3VudAQBFGNvdW50bQEBDHUxNgABGFEBUmVxdWVzdCB0aGUgY29uZmlndXJhdGlvbiB0byBiZSB1cGRhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgY29yZXMuIFdhcm5pbmc6UQFTaW5jZSB0aGlzIG9ubHkgc2NoZWR1bGVzIGEgY29uZmlndXJhdGlvbiB1cGRhdGUsIGl0IHRha2VzIHR3byBzZXNzaW9ucyB0byBjb21lIGludG8cZWZmZWN0LgCYLSBgb3JpZ2luYDogUm9vdCBvciB0aGUgQ29yZXRpbWUgQ2hhaW6ALSBgY291bnRgOiB0b3RhbCBudW1iZXIgb2YgY29yZXNIcmVxdWVzdF9yZXZlbnVlX2F0BAEQd2hlbhABLEJsb2NrTnVtYmVyAAIQYQFSZXF1ZXN0IHRvIGNsYWltIHRoZSBpbnN0YW50YW5lb3VzIGNvcmV0aW1lIHNhbGVzIHJldmVudWUgc3RhcnRpbmcgZnJvbSB0aGUgYmxvY2sgaXQgd2FzXQFsYXN0IGNsYWltZWQgdW50aWwgYW5kIHVwIHRvIHRoZSBibG9jayBzcGVjaWZpZWQuIFRoZSBjbGFpbWVkIGFtb3VudCB2YWx1ZSBpcyBzZW50IGJhY2tRAXRvIHRoZSBDb3JldGltZSBjaGFpbiBpbiBhIGBub3RpZnlfcmV2ZW51ZWAgbWVzc2FnZS4gQXQgdGhlIHNhbWUgdGltZSwgdGhlIGFtb3VudCBpc4R0ZWxlcG9ydGVkIHRvIHRoZSBDb3JldGltZSBjaGFpbi4sYXNzaWduX2NvcmUQARBjb3JlbQEBPEJyb2tlckNvcmVJbmRleAABFGJlZ2luEAFEQmxvY2tOdW1iZXJGb3I8VD4AAShhc3NpZ25tZW50XQUBjFZlYzwoQ29yZUFzc2lnbm1lbnQsIFBhcnRzT2Y1NzYwMCk+AAEgZW5kX2hpbnRhAgFkT3B0aW9uPEJsb2NrTnVtYmVyRm9yPFQ+PgAEJFkBUmVjZWl2ZSBpbnN0cnVjdGlvbnMgZnJvbSB0aGUgYEV4dGVybmFsQnJva2VyT3JpZ2luYCwgZGV0YWlsaW5nIGhvdyBhIHNwZWNpZmljIGNvcmUgaXMsdG8gYmUgdXNlZC4ALFBhcmFtZXRlcnM6IQEtYG9yaWdpbmA6IFRoZSBgRXh0ZXJuYWxCcm9rZXJPcmlnaW5gLCBhc3N1bWVkIHRvIGJlIHRoZSBjb3JldGltZSBjaGFpbi6sLWBjb3JlYDogVGhlIGNvcmUgdGhhdCBzaG91bGQgYmUgc2NoZWR1bGVkLtgtYGJlZ2luYDogVGhlIHN0YXJ0aW5nIGJsb2NraGVpZ2h0IG9mIHRoZSBpbnN0cnVjdGlvbi7ULWBhc3NpZ25tZW50YDogSG93IHRoZSBibG9ja3NwYWNlIHNob3VsZCBiZSB1dGlsaXNlZC5ZAS1gZW5kX2hpbnRgOiBBbiBvcHRpb25hbCBoaW50IGFzIHRvIHdoZW4gdGhpcyBwYXJ0aWN1bGFyIHNldCBvZiBpbnN0cnVjdGlvbnMgd2lsbCBlbmQuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLl0FAAACYQUAYQUAAAQIZQVpBQBlBQw0cGFsbGV0X2Jyb2tlckhjb3JldGltZV9pbnRlcmZhY2U4Q29yZUFzc2lnbm1lbnQAAQwQSWRsZQAAABBQb29sAAEAEFRhc2sEABABGFRhc2tJZAACAABpBQxscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zRGFzc2lnbmVyX2NvcmV0aW1lMFBhcnRzT2Y1NzYwMAAABABtAQEMdTE2AABtBQxscGFsbGV0X3N0YXRlX3RyaWVfbWlncmF0aW9uGHBhbGxldBBDYWxsBARUAAEYWGNvbnRyb2xfYXV0b19taWdyYXRpb24EATBtYXliZV9jb25maWdxBQFcT3B0aW9uPE1pZ3JhdGlvbkxpbWl0cz4AAAyAQ29udHJvbCB0aGUgYXV0b21hdGljIG1pZ3JhdGlvbi4ADQFUaGUgZGlzcGF0Y2ggb3JpZ2luIG9mIHRoaXMgY2FsbCBtdXN0IGJlIFtgQ29uZmlnOjpDb250cm9sT3JpZ2luYF0uQGNvbnRpbnVlX21pZ3JhdGUMARhsaW1pdHN1BQE8TWlncmF0aW9uTGltaXRzAAE8cmVhbF9zaXplX3VwcGVyEAEMdTMyAAEwd2l0bmVzc190YXNreQUBQE1pZ3JhdGlvblRhc2s8VD4AAVS4Q29udGludWUgdGhlIG1pZ3JhdGlvbiBmb3IgdGhlIGdpdmVuIGBsaW1pdHNgLgDsVGhlIGRpc3BhdGNoIG9yaWdpbiBvZiB0aGlzIGNhbGwgY2FuIGJlIGFueSBzaWduZWQgYWNjb3VudC4AXQFUaGlzIHRyYW5zYWN0aW9uIGhhcyBOTyBNT05FVEFSWSBJTkNFTlRJVkVTLiBjYWxsaW5nIGl0IHdpbGwgbm90IHJld2FyZCBhbnlvbmUuIEFsYmVpdCzsVXBvbiBzdWNjZXNzZnVsIGV4ZWN1dGlvbiwgdGhlIHRyYW5zYWN0aW9uIGZlZSBpcyByZXR1cm5lZC4AQQFUaGUgKHBvdGVudGlhbGx5IG92ZXItZXN0aW1hdGVkKSBvZiB0aGUgYnl0ZSBsZW5ndGggb2YgYWxsIHRoZSBkYXRhIHJlYWQgbXVzdCBiZVkBcHJvdmlkZWQgZm9yIHVwLWZyb250IGZlZS1wYXltZW50IGFuZCB3ZWlnaGluZy4gSW4gZXNzZW5jZSwgdGhlIGNhbGxlciBpcyBndWFyYW50ZWVpbmdJAXRoYXQgZXhlY3V0aW5nIHRoZSBjdXJyZW50IGBNaWdyYXRpb25UYXNrYCB3aXRoIHRoZSBnaXZlbiBgbGltaXRzYCB3aWxsIG5vdCBleGNlZWSUYHJlYWxfc2l6ZV91cHBlcmAgYnl0ZXMgb2YgcmVhZCBkYXRhLgBFAVRoZSBgd2l0bmVzc190YXNrYCBpcyBtZXJlbHkgYSBoZWxwZXIgdG8gcHJldmVudCB0aGUgY2FsbGVyIGZyb20gYmVpbmcgc2xhc2hlZCBvcl0BZ2VuZXJhbGx5IHRyaWdnZXIgYSBtaWdyYXRpb24gdGhhdCB0aGV5IGRvIG5vdCBpbnRlbmQuIFRoaXMgcGFyYW1ldGVyIGlzIGp1c3QgYSBtZXNzYWdlPQFmcm9tIGNhbGxlciwgc2F5aW5nIHRoYXQgdGhleSBiZWxpZXZlZCBgd2l0bmVzc190YXNrYCB3YXMgdGhlIGxhc3Qgc3RhdGUgb2YgdGhlWQFtaWdyYXRpb24sIGFuZCB0aGV5IG9ubHkgd2lzaCBmb3IgdGhlaXIgdHJhbnNhY3Rpb24gdG8gZG8gYW55dGhpbmcsIGlmIHRoaXMgYXNzdW1wdGlvbhEBaG9sZHMuIEluIGNhc2UgYHdpdG5lc3NfdGFza2AgZG9lcyBub3QgbWF0Y2gsIHRoZSB0cmFuc2FjdGlvbiBmYWlscy4AOQFCYXNlZCBvbiB0aGUgZG9jdW1lbnRhdGlvbiBvZiBbYE1pZ3JhdGlvblRhc2s6Om1pZ3JhdGVfdW50aWxfZXhoYXVzdGlvbmBdLCB0aGVNAXJlY29tbWVuZGVkIHdheSBvZiBkb2luZyB0aGlzIGlzIHRvIHBhc3MgYSBgbGltaXRgIHRoYXQgb25seSBib3VuZHMgYGNvdW50YCwgYXMgdGhlnGBzaXplYCBsaW1pdCBjYW4gYWx3YXlzIGJlIG92ZXJ3cml0dGVuLkhtaWdyYXRlX2N1c3RvbV90b3AIARBrZXlzhQEBMFZlYzxWZWM8dTg+PgABMHdpdG5lc3Nfc2l6ZRABDHUzMgACEAkBTWlncmF0ZSB0aGUgbGlzdCBvZiB0b3Aga2V5cyBieSBpdGVyYXRpbmcgZWFjaCBvZiB0aGVtIG9uZSBieSBvbmUuAFUBVGhpcyBkb2VzIG5vdCBhZmZlY3QgdGhlIGdsb2JhbCBtaWdyYXRpb24gcHJvY2VzcyB0cmFja2VyIChbYE1pZ3JhdGlvblByb2Nlc3NgXSksIGFuZPxzaG91bGQgb25seSBiZSB1c2VkIGluIGNhc2UgYW55IGtleXMgYXJlIGxlZnRvdmVyIGR1ZSB0byBhIGJ1Zy5QbWlncmF0ZV9jdXN0b21fY2hpbGQMARByb290OAEcVmVjPHU4PgABKGNoaWxkX2tleXOFAQEwVmVjPFZlYzx1OD4+AAEodG90YWxfc2l6ZRABDHUzMgADGBEBTWlncmF0ZSB0aGUgbGlzdCBvZiBjaGlsZCBrZXlzIGJ5IGl0ZXJhdGluZyBlYWNoIG9mIHRoZW0gb25lIGJ5IG9uZS4ADQFBbGwgb2YgdGhlIGdpdmVuIGNoaWxkIGtleXMgbXVzdCBiZSBwcmVzZW50IHVuZGVyIG9uZSBgY2hpbGRfcm9vdGAuAFUBVGhpcyBkb2VzIG5vdCBhZmZlY3QgdGhlIGdsb2JhbCBtaWdyYXRpb24gcHJvY2VzcyB0cmFja2VyIChbYE1pZ3JhdGlvblByb2Nlc3NgXSksIGFuZPxzaG91bGQgb25seSBiZSB1c2VkIGluIGNhc2UgYW55IGtleXMgYXJlIGxlZnRvdmVyIGR1ZSB0byBhIGJ1Zy5Uc2V0X3NpZ25lZF9tYXhfbGltaXRzBAEYbGltaXRzdQUBPE1pZ3JhdGlvbkxpbWl0cwAEBLhTZXQgdGhlIG1heGltdW0gbGltaXQgb2YgdGhlIHNpZ25lZCBtaWdyYXRpb24uSGZvcmNlX3NldF9wcm9ncmVzcwgBMHByb2dyZXNzX3RvcH0FATRQcm9ncmVzc09mPFQ+AAE4cHJvZ3Jlc3NfY2hpbGR9BQE0UHJvZ3Jlc3NPZjxUPgAFJMhGb3JjZWZ1bGx5IHNldCB0aGUgcHJvZ3Jlc3MgdGhlIHJ1bm5pbmcgbWlncmF0aW9uLgBdAVRoaXMgaXMgb25seSB1c2VmdWwgaW4gb25lIGNhc2U6IHRoZSBuZXh0IGtleSB0byBtaWdyYXRlIGlzIHRvbyBiaWcgdG8gYmUgbWlncmF0ZWQgd2l0aFUBYSBzaWduZWQgYWNjb3VudCwgaW4gYSBwYXJhY2hhaW4gY29udGV4dCwgYW5kIHdlIHNpbXBseSB3YW50IHRvIHNraXAgaXQuIEEgcmVhc29uYWJsZWEBZXhhbXBsZSBvZiB0aGlzIHdvdWxkIGJlIGA6Y29kZTpgLCB3aGljaCBpcyBib3RoIHZlcnkgZXhwZW5zaXZlIHRvIG1pZ3JhdGUsIGFuZCBjb21tb25seaR1c2VkLCBzbyBwcm9iYWJseSBpdCBpcyBhbHJlYWR5IG1pZ3JhdGVkLgBdAUluIGNhc2UgeW91IG1lc3MgdGhpbmdzIHVwLCB5b3UgY2FuIGFsc28sIGluIHByaW5jaXBsZSwgdXNlIHRoaXMgdG8gcmVzZXQgdGhlIG1pZ3JhdGlvbiBwcm9jZXNzLgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy5xBQQYT3B0aW9uBARUAXUFAQgQTm9uZQAAABBTb21lBAB1BQAAAQAAdQUMbHBhbGxldF9zdGF0ZV90cmllX21pZ3JhdGlvbhhwYWxsZXQ8TWlncmF0aW9uTGltaXRzAAAIARBzaXplEAEMdTMyAAEQaXRlbRABDHUzMgAAeQUMbHBhbGxldF9zdGF0ZV90cmllX21pZ3JhdGlvbhhwYWxsZXQ0TWlncmF0aW9uVGFzawQEVAAAFAEwcHJvZ3Jlc3NfdG9wfQUBNFByb2dyZXNzT2Y8VD4AAThwcm9ncmVzc19jaGlsZH0FATRQcm9ncmVzc09mPFQ+AAEQc2l6ZRABDHUzMgABJHRvcF9pdGVtcxABDHUzMgABLGNoaWxkX2l0ZW1zEAEMdTMyAAB9BQxscGFsbGV0X3N0YXRlX3RyaWVfbWlncmF0aW9uGHBhbGxldCBQcm9ncmVzcwQkTWF4S2V5TGVuAAEMHFRvU3RhcnQAAAAcTGFzdEtleQQAgQUBZEJvdW5kZWRWZWM8dTgsIE1heEtleUxlbj4AAQAgQ29tcGxldGUAAgAAgQUMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAEIBFMAAAQAOAEYVmVjPFQ+AACFBQwocGFsbGV0X3hjbRhwYWxsZXQQQ2FsbAQEVAABOBBzZW5kCAEQZGVzdEUBAVhCb3g8VmVyc2lvbmVkTG9jYXRpb24+AAEcbWVzc2FnZYkFAVRCb3g8VmVyc2lvbmVkWGNtPCgpPj4AAAA8dGVsZXBvcnRfYXNzZXRzEAEQZGVzdEUBAVhCb3g8VmVyc2lvbmVkTG9jYXRpb24+AAEsYmVuZWZpY2lhcnlFAQFYQm94PFZlcnNpb25lZExvY2F0aW9uPgABGGFzc2V0c4kGAVBCb3g8VmVyc2lvbmVkQXNzZXRzPgABOGZlZV9hc3NldF9pdGVtEAEMdTMyAAFIEQFUZWxlcG9ydCBzb21lIGFzc2V0cyBmcm9tIHRoZSBsb2NhbCBjaGFpbiB0byBzb21lIGRlc3RpbmF0aW9uIGNoYWluLgAdASoqVGhpcyBmdW5jdGlvbiBpcyBkZXByZWNhdGVkOiBVc2UgYGxpbWl0ZWRfdGVsZXBvcnRfYXNzZXRzYCBpbnN0ZWFkLioqAFEBRmVlIHBheW1lbnQgb24gdGhlIGRlc3RpbmF0aW9uIHNpZGUgaXMgbWFkZSBmcm9tIHRoZSBhc3NldCBpbiB0aGUgYGFzc2V0c2AgdmVjdG9yIG9mYQFpbmRleCBgZmVlX2Fzc2V0X2l0ZW1gLiBUaGUgd2VpZ2h0IGxpbWl0IGZvciBmZWVzIGlzIG5vdCBwcm92aWRlZCBhbmQgdGh1cyBpcyB1bmxpbWl0ZWQstHdpdGggYWxsIGZlZXMgdGFrZW4gYXMgbmVlZGVkIGZyb20gdGhlIGFzc2V0LgApAS0gYG9yaWdpbmA6IE11c3QgYmUgY2FwYWJsZSBvZiB3aXRoZHJhd2luZyB0aGUgYGFzc2V0c2AgYW5kIGV4ZWN1dGluZyBYQ00uJQEtIGBkZXN0YDogRGVzdGluYXRpb24gY29udGV4dCBmb3IgdGhlIGFzc2V0cy4gV2lsbCB0eXBpY2FsbHkgYmUgYFtQYXJlbnQsYQEgIFBhcmFjaGFpbiguLildYCB0byBzZW5kIGZyb20gcGFyYWNoYWluIHRvIHBhcmFjaGFpbiwgb3IgYFtQYXJhY2hhaW4oLi4pXWAgdG8gc2VuZCBmcm9tVCAgcmVsYXkgdG8gcGFyYWNoYWluLlUBLSBgYmVuZWZpY2lhcnlgOiBBIGJlbmVmaWNpYXJ5IGxvY2F0aW9uIGZvciB0aGUgYXNzZXRzIGluIHRoZSBjb250ZXh0IG9mIGBkZXN0YC4gV2lsbJggIGdlbmVyYWxseSBiZSBhbiBgQWNjb3VudElkMzJgIHZhbHVlLlkBLSBgYXNzZXRzYDogVGhlIGFzc2V0cyB0byBiZSB3aXRoZHJhd24uIFRoaXMgc2hvdWxkIGluY2x1ZGUgdGhlIGFzc2V0cyB1c2VkIHRvIHBheSB0aGVoICBmZWUgb24gdGhlIGBkZXN0YCBjaGFpbi5NAS0gYGZlZV9hc3NldF9pdGVtYDogVGhlIGluZGV4IGludG8gYGFzc2V0c2Agb2YgdGhlIGl0ZW0gd2hpY2ggc2hvdWxkIGJlIHVzZWQgdG8gcGF5HCAgZmVlcy5ccmVzZXJ2ZV90cmFuc2Zlcl9hc3NldHMQARBkZXN0RQEBWEJveDxWZXJzaW9uZWRMb2NhdGlvbj4AASxiZW5lZmljaWFyeUUBAVhCb3g8VmVyc2lvbmVkTG9jYXRpb24+AAEYYXNzZXRziQYBUEJveDxWZXJzaW9uZWRBc3NldHM+AAE4ZmVlX2Fzc2V0X2l0ZW0QAQx1MzIAAnhdAVRyYW5zZmVyIHNvbWUgYXNzZXRzIGZyb20gdGhlIGxvY2FsIGNoYWluIHRvIHRoZSBkZXN0aW5hdGlvbiBjaGFpbiB0aHJvdWdoIHRoZWlyIGxvY2FsLHhkZXN0aW5hdGlvbiBvciByZW1vdGUgcmVzZXJ2ZS4APQFgYXNzZXRzYCBtdXN0IGhhdmUgc2FtZSByZXNlcnZlIGxvY2F0aW9uIGFuZCBtYXkgbm90IGJlIHRlbGVwb3J0YWJsZSB0byBgZGVzdGAuTQEgLSBgYXNzZXRzYCBoYXZlIGxvY2FsIHJlc2VydmU6IHRyYW5zZmVyIGFzc2V0cyB0byBzb3ZlcmVpZ24gYWNjb3VudCBvZiBkZXN0aW5hdGlvbk0BICAgY2hhaW4gYW5kIGZvcndhcmQgYSBub3RpZmljYXRpb24gWENNIHRvIGBkZXN0YCB0byBtaW50IGFuZCBkZXBvc2l0IHJlc2VydmUtYmFzZWRsICAgYXNzZXRzIHRvIGBiZW5lZmljaWFyeWAuVQEgLSBgYXNzZXRzYCBoYXZlIGRlc3RpbmF0aW9uIHJlc2VydmU6IGJ1cm4gbG9jYWwgYXNzZXRzIGFuZCBmb3J3YXJkIGEgbm90aWZpY2F0aW9uIHRvWQEgICBgZGVzdGAgY2hhaW4gdG8gd2l0aGRyYXcgdGhlIHJlc2VydmUgYXNzZXRzIGZyb20gdGhpcyBjaGFpbidzIHNvdmVyZWlnbiBhY2NvdW50IGFuZIQgICBkZXBvc2l0IHRoZW0gdG8gYGJlbmVmaWNpYXJ5YC5hASAtIGBhc3NldHNgIGhhdmUgcmVtb3RlIHJlc2VydmU6IGJ1cm4gbG9jYWwgYXNzZXRzLCBmb3J3YXJkIFhDTSB0byByZXNlcnZlIGNoYWluIHRvIG1vdmVhASAgIHJlc2VydmVzIGZyb20gdGhpcyBjaGFpbidzIFNBIHRvIGBkZXN0YCBjaGFpbidzIFNBLCBhbmQgZm9yd2FyZCBhbm90aGVyIFhDTSB0byBgZGVzdGD0ICAgdG8gbWludCBhbmQgZGVwb3NpdCByZXNlcnZlLWJhc2VkIGFzc2V0cyB0byBgYmVuZWZpY2lhcnlgLgA9ASoqVGhpcyBmdW5jdGlvbiBpcyBkZXByZWNhdGVkOiBVc2UgYGxpbWl0ZWRfcmVzZXJ2ZV90cmFuc2Zlcl9hc3NldHNgIGluc3RlYWQuKioAUQFGZWUgcGF5bWVudCBvbiB0aGUgZGVzdGluYXRpb24gc2lkZSBpcyBtYWRlIGZyb20gdGhlIGFzc2V0IGluIHRoZSBgYXNzZXRzYCB2ZWN0b3Igb2ZhAWluZGV4IGBmZWVfYXNzZXRfaXRlbWAuIFRoZSB3ZWlnaHQgbGltaXQgZm9yIGZlZXMgaXMgbm90IHByb3ZpZGVkIGFuZCB0aHVzIGlzIHVubGltaXRlZCy0d2l0aCBhbGwgZmVlcyB0YWtlbiBhcyBuZWVkZWQgZnJvbSB0aGUgYXNzZXQuACkBLSBgb3JpZ2luYDogTXVzdCBiZSBjYXBhYmxlIG9mIHdpdGhkcmF3aW5nIHRoZSBgYXNzZXRzYCBhbmQgZXhlY3V0aW5nIFhDTS4lAS0gYGRlc3RgOiBEZXN0aW5hdGlvbiBjb250ZXh0IGZvciB0aGUgYXNzZXRzLiBXaWxsIHR5cGljYWxseSBiZSBgW1BhcmVudCxhASAgUGFyYWNoYWluKC4uKV1gIHRvIHNlbmQgZnJvbSBwYXJhY2hhaW4gdG8gcGFyYWNoYWluLCBvciBgW1BhcmFjaGFpbiguLildYCB0byBzZW5kIGZyb21UICByZWxheSB0byBwYXJhY2hhaW4uVQEtIGBiZW5lZmljaWFyeWA6IEEgYmVuZWZpY2lhcnkgbG9jYXRpb24gZm9yIHRoZSBhc3NldHMgaW4gdGhlIGNvbnRleHQgb2YgYGRlc3RgLiBXaWxsmCAgZ2VuZXJhbGx5IGJlIGFuIGBBY2NvdW50SWQzMmAgdmFsdWUuWQEtIGBhc3NldHNgOiBUaGUgYXNzZXRzIHRvIGJlIHdpdGhkcmF3bi4gVGhpcyBzaG91bGQgaW5jbHVkZSB0aGUgYXNzZXRzIHVzZWQgdG8gcGF5IHRoZcggIGZlZSBvbiB0aGUgYGRlc3RgIChhbmQgcG9zc2libHkgcmVzZXJ2ZSkgY2hhaW5zLk0BLSBgZmVlX2Fzc2V0X2l0ZW1gOiBUaGUgaW5kZXggaW50byBgYXNzZXRzYCBvZiB0aGUgaXRlbSB3aGljaCBzaG91bGQgYmUgdXNlZCB0byBwYXkcICBmZWVzLhxleGVjdXRlCAEcbWVzc2FnZY0GAbRCb3g8VmVyc2lvbmVkWGNtPDxUIGFzIENvbmZpZz46OlJ1bnRpbWVDYWxsPj4AAShtYXhfd2VpZ2h0KAEYV2VpZ2h0AAMg0EV4ZWN1dGUgYW4gWENNIG1lc3NhZ2UgZnJvbSBhIGxvY2FsLCBzaWduZWQsIG9yaWdpbi4ATQFBbiBldmVudCBpcyBkZXBvc2l0ZWQgaW5kaWNhdGluZyB3aGV0aGVyIGBtc2dgIGNvdWxkIGJlIGV4ZWN1dGVkIGNvbXBsZXRlbHkgb3Igb25seShwYXJ0aWFsbHkuAF0BTm8gbW9yZSB0aGFuIGBtYXhfd2VpZ2h0YCB3aWxsIGJlIHVzZWQgaW4gaXRzIGF0dGVtcHRlZCBleGVjdXRpb24uIElmIHRoaXMgaXMgbGVzcyB0aGFuQQF0aGUgbWF4aW11bSBhbW91bnQgb2Ygd2VpZ2h0IHRoYXQgdGhlIG1lc3NhZ2UgY291bGQgdGFrZSB0byBiZSBleGVjdXRlZCwgdGhlbiBub3xleGVjdXRpb24gYXR0ZW1wdCB3aWxsIGJlIG1hZGUuRGZvcmNlX3hjbV92ZXJzaW9uCAEgbG9jYXRpb24NAQE0Qm94PExvY2F0aW9uPgABHHZlcnNpb24QAShYY21WZXJzaW9uAAQYSQFFeHRvbGwgdGhhdCBhIHBhcnRpY3VsYXIgZGVzdGluYXRpb24gY2FuIGJlIGNvbW11bmljYXRlZCB3aXRoIHRocm91Z2ggYSBwYXJ0aWN1bGFyPHZlcnNpb24gb2YgWENNLgDcLSBgb3JpZ2luYDogTXVzdCBiZSBhbiBvcmlnaW4gc3BlY2lmaWVkIGJ5IEFkbWluT3JpZ2luLtgtIGBsb2NhdGlvbmA6IFRoZSBkZXN0aW5hdGlvbiB0aGF0IGlzIGJlaW5nIGRlc2NyaWJlZC4RAS0gYHhjbV92ZXJzaW9uYDogVGhlIGxhdGVzdCB2ZXJzaW9uIG9mIFhDTSB0aGF0IGBsb2NhdGlvbmAgc3VwcG9ydHMuZGZvcmNlX2RlZmF1bHRfeGNtX3ZlcnNpb24EAURtYXliZV94Y21fdmVyc2lvbmECAUhPcHRpb248WGNtVmVyc2lvbj4ABRRZAVNldCBhIHNhZmUgWENNIHZlcnNpb24gKHRoZSB2ZXJzaW9uIHRoYXQgWENNIHNob3VsZCBiZSBlbmNvZGVkIHdpdGggaWYgdGhlIG1vc3QgcmVjZW50tHZlcnNpb24gYSBkZXN0aW5hdGlvbiBjYW4gYWNjZXB0IGlzIHVua25vd24pLgDcLSBgb3JpZ2luYDogTXVzdCBiZSBhbiBvcmlnaW4gc3BlY2lmaWVkIGJ5IEFkbWluT3JpZ2luLjkBLSBgbWF5YmVfeGNtX3ZlcnNpb25gOiBUaGUgZGVmYXVsdCBYQ00gZW5jb2RpbmcgdmVyc2lvbiwgb3IgYE5vbmVgIHRvIGRpc2FibGUueGZvcmNlX3N1YnNjcmliZV92ZXJzaW9uX25vdGlmeQQBIGxvY2F0aW9uRQEBWEJveDxWZXJzaW9uZWRMb2NhdGlvbj4ABhA5AUFzayBhIGxvY2F0aW9uIHRvIG5vdGlmeSB1cyByZWdhcmRpbmcgdGhlaXIgWENNIHZlcnNpb24gYW5kIGFueSBjaGFuZ2VzIHRvIGl0LgDcLSBgb3JpZ2luYDogTXVzdCBiZSBhbiBvcmlnaW4gc3BlY2lmaWVkIGJ5IEFkbWluT3JpZ2luLlkBLSBgbG9jYXRpb25gOiBUaGUgbG9jYXRpb24gdG8gd2hpY2ggd2Ugc2hvdWxkIHN1YnNjcmliZSBmb3IgWENNIHZlcnNpb24gbm90aWZpY2F0aW9ucy6AZm9yY2VfdW5zdWJzY3JpYmVfdmVyc2lvbl9ub3RpZnkEASBsb2NhdGlvbkUBAVhCb3g8VmVyc2lvbmVkTG9jYXRpb24+AAcYSQFSZXF1aXJlIHRoYXQgYSBwYXJ0aWN1bGFyIGRlc3RpbmF0aW9uIHNob3VsZCBubyBsb25nZXIgbm90aWZ5IHVzIHJlZ2FyZGluZyBhbnkgWENNQHZlcnNpb24gY2hhbmdlcy4A3C0gYG9yaWdpbmA6IE11c3QgYmUgYW4gb3JpZ2luIHNwZWNpZmllZCBieSBBZG1pbk9yaWdpbi49AS0gYGxvY2F0aW9uYDogVGhlIGxvY2F0aW9uIHRvIHdoaWNoIHdlIGFyZSBjdXJyZW50bHkgc3Vic2NyaWJlZCBmb3IgWENNIHZlcnNpb26oICBub3RpZmljYXRpb25zIHdoaWNoIHdlIG5vIGxvbmdlciBkZXNpcmUufGxpbWl0ZWRfcmVzZXJ2ZV90cmFuc2Zlcl9hc3NldHMUARBkZXN0RQEBWEJveDxWZXJzaW9uZWRMb2NhdGlvbj4AASxiZW5lZmljaWFyeUUBAVhCb3g8VmVyc2lvbmVkTG9jYXRpb24+AAEYYXNzZXRziQYBUEJveDxWZXJzaW9uZWRBc3NldHM+AAE4ZmVlX2Fzc2V0X2l0ZW0QAQx1MzIAATB3ZWlnaHRfbGltaXQ9BgEsV2VpZ2h0TGltaXQACHhdAVRyYW5zZmVyIHNvbWUgYXNzZXRzIGZyb20gdGhlIGxvY2FsIGNoYWluIHRvIHRoZSBkZXN0aW5hdGlvbiBjaGFpbiB0aHJvdWdoIHRoZWlyIGxvY2FsLHhkZXN0aW5hdGlvbiBvciByZW1vdGUgcmVzZXJ2ZS4APQFgYXNzZXRzYCBtdXN0IGhhdmUgc2FtZSByZXNlcnZlIGxvY2F0aW9uIGFuZCBtYXkgbm90IGJlIHRlbGVwb3J0YWJsZSB0byBgZGVzdGAuTQEgLSBgYXNzZXRzYCBoYXZlIGxvY2FsIHJlc2VydmU6IHRyYW5zZmVyIGFzc2V0cyB0byBzb3ZlcmVpZ24gYWNjb3VudCBvZiBkZXN0aW5hdGlvbk0BICAgY2hhaW4gYW5kIGZvcndhcmQgYSBub3RpZmljYXRpb24gWENNIHRvIGBkZXN0YCB0byBtaW50IGFuZCBkZXBvc2l0IHJlc2VydmUtYmFzZWRsICAgYXNzZXRzIHRvIGBiZW5lZmljaWFyeWAuVQEgLSBgYXNzZXRzYCBoYXZlIGRlc3RpbmF0aW9uIHJlc2VydmU6IGJ1cm4gbG9jYWwgYXNzZXRzIGFuZCBmb3J3YXJkIGEgbm90aWZpY2F0aW9uIHRvWQEgICBgZGVzdGAgY2hhaW4gdG8gd2l0aGRyYXcgdGhlIHJlc2VydmUgYXNzZXRzIGZyb20gdGhpcyBjaGFpbidzIHNvdmVyZWlnbiBhY2NvdW50IGFuZIQgICBkZXBvc2l0IHRoZW0gdG8gYGJlbmVmaWNpYXJ5YC5hASAtIGBhc3NldHNgIGhhdmUgcmVtb3RlIHJlc2VydmU6IGJ1cm4gbG9jYWwgYXNzZXRzLCBmb3J3YXJkIFhDTSB0byByZXNlcnZlIGNoYWluIHRvIG1vdmVhASAgIHJlc2VydmVzIGZyb20gdGhpcyBjaGFpbidzIFNBIHRvIGBkZXN0YCBjaGFpbidzIFNBLCBhbmQgZm9yd2FyZCBhbm90aGVyIFhDTSB0byBgZGVzdGD0ICAgdG8gbWludCBhbmQgZGVwb3NpdCByZXNlcnZlLWJhc2VkIGFzc2V0cyB0byBgYmVuZWZpY2lhcnlgLgBRAUZlZSBwYXltZW50IG9uIHRoZSBkZXN0aW5hdGlvbiBzaWRlIGlzIG1hZGUgZnJvbSB0aGUgYXNzZXQgaW4gdGhlIGBhc3NldHNgIHZlY3RvciBvZmEBaW5kZXggYGZlZV9hc3NldF9pdGVtYCwgdXAgdG8gZW5vdWdoIHRvIHBheSBmb3IgYHdlaWdodF9saW1pdGAgb2Ygd2VpZ2h0LiBJZiBtb3JlIHdlaWdodFkBaXMgbmVlZGVkIHRoYW4gYHdlaWdodF9saW1pdGAsIHRoZW4gdGhlIG9wZXJhdGlvbiB3aWxsIGZhaWwgYW5kIHRoZSBzZW50IGFzc2V0cyBtYXkgYmUgYXQgcmlzay4AKQEtIGBvcmlnaW5gOiBNdXN0IGJlIGNhcGFibGUgb2Ygd2l0aGRyYXdpbmcgdGhlIGBhc3NldHNgIGFuZCBleGVjdXRpbmcgWENNLiUBLSBgZGVzdGA6IERlc3RpbmF0aW9uIGNvbnRleHQgZm9yIHRoZSBhc3NldHMuIFdpbGwgdHlwaWNhbGx5IGJlIGBbUGFyZW50LGEBICBQYXJhY2hhaW4oLi4pXWAgdG8gc2VuZCBmcm9tIHBhcmFjaGFpbiB0byBwYXJhY2hhaW4sIG9yIGBbUGFyYWNoYWluKC4uKV1gIHRvIHNlbmQgZnJvbVQgIHJlbGF5IHRvIHBhcmFjaGFpbi5VAS0gYGJlbmVmaWNpYXJ5YDogQSBiZW5lZmljaWFyeSBsb2NhdGlvbiBmb3IgdGhlIGFzc2V0cyBpbiB0aGUgY29udGV4dCBvZiBgZGVzdGAuIFdpbGyYICBnZW5lcmFsbHkgYmUgYW4gYEFjY291bnRJZDMyYCB2YWx1ZS5ZAS0gYGFzc2V0c2A6IFRoZSBhc3NldHMgdG8gYmUgd2l0aGRyYXduLiBUaGlzIHNob3VsZCBpbmNsdWRlIHRoZSBhc3NldHMgdXNlZCB0byBwYXkgdGhlyCAgZmVlIG9uIHRoZSBgZGVzdGAgKGFuZCBwb3NzaWJseSByZXNlcnZlKSBjaGFpbnMuTQEtIGBmZWVfYXNzZXRfaXRlbWA6IFRoZSBpbmRleCBpbnRvIGBhc3NldHNgIG9mIHRoZSBpdGVtIHdoaWNoIHNob3VsZCBiZSB1c2VkIHRvIHBheRwgIGZlZXMuRQEtIGB3ZWlnaHRfbGltaXRgOiBUaGUgcmVtb3RlLXNpZGUgd2VpZ2h0IGxpbWl0LCBpZiBhbnksIGZvciB0aGUgWENNIGZlZSBwdXJjaGFzZS5cbGltaXRlZF90ZWxlcG9ydF9hc3NldHMUARBkZXN0RQEBWEJveDxWZXJzaW9uZWRMb2NhdGlvbj4AASxiZW5lZmljaWFyeUUBAVhCb3g8VmVyc2lvbmVkTG9jYXRpb24+AAEYYXNzZXRziQYBUEJveDxWZXJzaW9uZWRBc3NldHM+AAE4ZmVlX2Fzc2V0X2l0ZW0QAQx1MzIAATB3ZWlnaHRfbGltaXQ9BgEsV2VpZ2h0TGltaXQACUgRAVRlbGVwb3J0IHNvbWUgYXNzZXRzIGZyb20gdGhlIGxvY2FsIGNoYWluIHRvIHNvbWUgZGVzdGluYXRpb24gY2hhaW4uAFEBRmVlIHBheW1lbnQgb24gdGhlIGRlc3RpbmF0aW9uIHNpZGUgaXMgbWFkZSBmcm9tIHRoZSBhc3NldCBpbiB0aGUgYGFzc2V0c2AgdmVjdG9yIG9mYQFpbmRleCBgZmVlX2Fzc2V0X2l0ZW1gLCB1cCB0byBlbm91Z2ggdG8gcGF5IGZvciBgd2VpZ2h0X2xpbWl0YCBvZiB3ZWlnaHQuIElmIG1vcmUgd2VpZ2h0WQFpcyBuZWVkZWQgdGhhbiBgd2VpZ2h0X2xpbWl0YCwgdGhlbiB0aGUgb3BlcmF0aW9uIHdpbGwgZmFpbCBhbmQgdGhlIHNlbnQgYXNzZXRzIG1heSBiZSBhdCByaXNrLgApAS0gYG9yaWdpbmA6IE11c3QgYmUgY2FwYWJsZSBvZiB3aXRoZHJhd2luZyB0aGUgYGFzc2V0c2AgYW5kIGV4ZWN1dGluZyBYQ00uJQEtIGBkZXN0YDogRGVzdGluYXRpb24gY29udGV4dCBmb3IgdGhlIGFzc2V0cy4gV2lsbCB0eXBpY2FsbHkgYmUgYFtQYXJlbnQsYQEgIFBhcmFjaGFpbiguLildYCB0byBzZW5kIGZyb20gcGFyYWNoYWluIHRvIHBhcmFjaGFpbiwgb3IgYFtQYXJhY2hhaW4oLi4pXWAgdG8gc2VuZCBmcm9tVCAgcmVsYXkgdG8gcGFyYWNoYWluLlUBLSBgYmVuZWZpY2lhcnlgOiBBIGJlbmVmaWNpYXJ5IGxvY2F0aW9uIGZvciB0aGUgYXNzZXRzIGluIHRoZSBjb250ZXh0IG9mIGBkZXN0YC4gV2lsbJggIGdlbmVyYWxseSBiZSBhbiBgQWNjb3VudElkMzJgIHZhbHVlLlkBLSBgYXNzZXRzYDogVGhlIGFzc2V0cyB0byBiZSB3aXRoZHJhd24uIFRoaXMgc2hvdWxkIGluY2x1ZGUgdGhlIGFzc2V0cyB1c2VkIHRvIHBheSB0aGVoICBmZWUgb24gdGhlIGBkZXN0YCBjaGFpbi5NAS0gYGZlZV9hc3NldF9pdGVtYDogVGhlIGluZGV4IGludG8gYGFzc2V0c2Agb2YgdGhlIGl0ZW0gd2hpY2ggc2hvdWxkIGJlIHVzZWQgdG8gcGF5HCAgZmVlcy5FAS0gYHdlaWdodF9saW1pdGA6IFRoZSByZW1vdGUtc2lkZSB3ZWlnaHQgbGltaXQsIGlmIGFueSwgZm9yIHRoZSBYQ00gZmVlIHB1cmNoYXNlLkBmb3JjZV9zdXNwZW5zaW9uBAEkc3VzcGVuZGVkIAEQYm9vbAAKEPRTZXQgb3IgdW5zZXQgdGhlIGdsb2JhbCBzdXNwZW5zaW9uIHN0YXRlIG9mIHRoZSBYQ00gZXhlY3V0b3IuANwtIGBvcmlnaW5gOiBNdXN0IGJlIGFuIG9yaWdpbiBzcGVjaWZpZWQgYnkgQWRtaW5PcmlnaW4u0C0gYHN1c3BlbmRlZGA6IGB0cnVlYCB0byBzdXNwZW5kLCBgZmFsc2VgIHRvIHJlc3VtZS48dHJhbnNmZXJfYXNzZXRzFAEQZGVzdEUBAVhCb3g8VmVyc2lvbmVkTG9jYXRpb24+AAEsYmVuZWZpY2lhcnlFAQFYQm94PFZlcnNpb25lZExvY2F0aW9uPgABGGFzc2V0c4kGAVBCb3g8VmVyc2lvbmVkQXNzZXRzPgABOGZlZV9hc3NldF9pdGVtEAEMdTMyAAEwd2VpZ2h0X2xpbWl0PQYBLFdlaWdodExpbWl0AAuEXQFUcmFuc2ZlciBzb21lIGFzc2V0cyBmcm9tIHRoZSBsb2NhbCBjaGFpbiB0byB0aGUgZGVzdGluYXRpb24gY2hhaW4gdGhyb3VnaCB0aGVpciBsb2NhbCzQZGVzdGluYXRpb24gb3IgcmVtb3RlIHJlc2VydmUsIG9yIHRocm91Z2ggdGVsZXBvcnRzLgBRAUZlZSBwYXltZW50IG9uIHRoZSBkZXN0aW5hdGlvbiBzaWRlIGlzIG1hZGUgZnJvbSB0aGUgYXNzZXQgaW4gdGhlIGBhc3NldHNgIHZlY3RvciBvZjUBaW5kZXggYGZlZV9hc3NldF9pdGVtYCAoaGVuY2UgcmVmZXJyZWQgdG8gYXMgYGZlZXNgKSwgdXAgdG8gZW5vdWdoIHRvIHBheSBmb3JBAWB3ZWlnaHRfbGltaXRgIG9mIHdlaWdodC4gSWYgbW9yZSB3ZWlnaHQgaXMgbmVlZGVkIHRoYW4gYHdlaWdodF9saW1pdGAsIHRoZW4gdGhl3G9wZXJhdGlvbiB3aWxsIGZhaWwgYW5kIHRoZSBzZW50IGFzc2V0cyBtYXkgYmUgYXQgcmlzay4AYQFgYXNzZXRzYCAoZXhjbHVkaW5nIGBmZWVzYCkgbXVzdCBoYXZlIHNhbWUgcmVzZXJ2ZSBsb2NhdGlvbiBvciBvdGhlcndpc2UgYmUgdGVsZXBvcnRhYmxlsHRvIGBkZXN0YCwgbm8gbGltaXRhdGlvbnMgaW1wb3NlZCBvbiBgZmVlc2AuTQEgLSBmb3IgbG9jYWwgcmVzZXJ2ZTogdHJhbnNmZXIgYXNzZXRzIHRvIHNvdmVyZWlnbiBhY2NvdW50IG9mIGRlc3RpbmF0aW9uIGNoYWluIGFuZE0BICAgZm9yd2FyZCBhIG5vdGlmaWNhdGlvbiBYQ00gdG8gYGRlc3RgIHRvIG1pbnQgYW5kIGRlcG9zaXQgcmVzZXJ2ZS1iYXNlZCBhc3NldHMgdG9EICAgYGJlbmVmaWNpYXJ5YC5hASAtIGZvciBkZXN0aW5hdGlvbiByZXNlcnZlOiBidXJuIGxvY2FsIGFzc2V0cyBhbmQgZm9yd2FyZCBhIG5vdGlmaWNhdGlvbiB0byBgZGVzdGAgY2hhaW5ZASAgIHRvIHdpdGhkcmF3IHRoZSByZXNlcnZlIGFzc2V0cyBmcm9tIHRoaXMgY2hhaW4ncyBzb3ZlcmVpZ24gYWNjb3VudCBhbmQgZGVwb3NpdCB0aGVtUCAgIHRvIGBiZW5lZmljaWFyeWAuXQEgLSBmb3IgcmVtb3RlIHJlc2VydmU6IGJ1cm4gbG9jYWwgYXNzZXRzLCBmb3J3YXJkIFhDTSB0byByZXNlcnZlIGNoYWluIHRvIG1vdmUgcmVzZXJ2ZXNdASAgIGZyb20gdGhpcyBjaGFpbidzIFNBIHRvIGBkZXN0YCBjaGFpbidzIFNBLCBhbmQgZm9yd2FyZCBhbm90aGVyIFhDTSB0byBgZGVzdGAgdG8gbWludNQgICBhbmQgZGVwb3NpdCByZXNlcnZlLWJhc2VkIGFzc2V0cyB0byBgYmVuZWZpY2lhcnlgLlEBIC0gZm9yIHRlbGVwb3J0czogYnVybiBsb2NhbCBhc3NldHMgYW5kIGZvcndhcmQgWENNIHRvIGBkZXN0YCBjaGFpbiB0byBtaW50L3RlbGVwb3J0sCAgIGFzc2V0cyBhbmQgZGVwb3NpdCB0aGVtIHRvIGBiZW5lZmljaWFyeWAuACkBLSBgb3JpZ2luYDogTXVzdCBiZSBjYXBhYmxlIG9mIHdpdGhkcmF3aW5nIHRoZSBgYXNzZXRzYCBhbmQgZXhlY3V0aW5nIFhDTS4tAS0gYGRlc3RgOiBEZXN0aW5hdGlvbiBjb250ZXh0IGZvciB0aGUgYXNzZXRzLiBXaWxsIHR5cGljYWxseSBiZSBgWDIoUGFyZW50LFUBICBQYXJhY2hhaW4oLi4pKWAgdG8gc2VuZCBmcm9tIHBhcmFjaGFpbiB0byBwYXJhY2hhaW4sIG9yIGBYMShQYXJhY2hhaW4oLi4pKWAgdG8gc2VuZGggIGZyb20gcmVsYXkgdG8gcGFyYWNoYWluLlUBLSBgYmVuZWZpY2lhcnlgOiBBIGJlbmVmaWNpYXJ5IGxvY2F0aW9uIGZvciB0aGUgYXNzZXRzIGluIHRoZSBjb250ZXh0IG9mIGBkZXN0YC4gV2lsbJggIGdlbmVyYWxseSBiZSBhbiBgQWNjb3VudElkMzJgIHZhbHVlLlkBLSBgYXNzZXRzYDogVGhlIGFzc2V0cyB0byBiZSB3aXRoZHJhd24uIFRoaXMgc2hvdWxkIGluY2x1ZGUgdGhlIGFzc2V0cyB1c2VkIHRvIHBheSB0aGXIICBmZWUgb24gdGhlIGBkZXN0YCAoYW5kIHBvc3NpYmx5IHJlc2VydmUpIGNoYWlucy5NAS0gYGZlZV9hc3NldF9pdGVtYDogVGhlIGluZGV4IGludG8gYGFzc2V0c2Agb2YgdGhlIGl0ZW0gd2hpY2ggc2hvdWxkIGJlIHVzZWQgdG8gcGF5HCAgZmVlcy5FAS0gYHdlaWdodF9saW1pdGA6IFRoZSByZW1vdGUtc2lkZSB3ZWlnaHQgbGltaXQsIGlmIGFueSwgZm9yIHRoZSBYQ00gZmVlIHB1cmNoYXNlLjBjbGFpbV9hc3NldHMIARhhc3NldHOJBgFQQm94PFZlcnNpb25lZEFzc2V0cz4AASxiZW5lZmljaWFyeUUBAVhCb3g8VmVyc2lvbmVkTG9jYXRpb24+AAwYVQFDbGFpbXMgYXNzZXRzIHRyYXBwZWQgb24gdGhpcyBwYWxsZXQgYmVjYXVzZSBvZiBsZWZ0b3ZlciBhc3NldHMgZHVyaW5nIFhDTSBleGVjdXRpb24uAKwtIGBvcmlnaW5gOiBBbnlvbmUgY2FuIGNhbGwgdGhpcyBleHRyaW5zaWMuXQEtIGBhc3NldHNgOiBUaGUgZXhhY3QgYXNzZXRzIHRoYXQgd2VyZSB0cmFwcGVkLiBVc2UgdGhlIHZlcnNpb24gdG8gc3BlY2lmeSB3aGF0IHZlcnNpb26Yd2FzIHRoZSBsYXRlc3Qgd2hlbiB0aGV5IHdlcmUgdHJhcHBlZC5FAS0gYGJlbmVmaWNpYXJ5YDogVGhlIGxvY2F0aW9uL2FjY291bnQgd2hlcmUgdGhlIGNsYWltZWQgYXNzZXRzIHdpbGwgYmUgZGVwb3NpdGVkLox0cmFuc2Zlcl9hc3NldHNfdXNpbmdfdHlwZV9hbmRfdGhlbhwBEGRlc3RFAQFYQm94PFZlcnNpb25lZExvY2F0aW9uPgABGGFzc2V0c4kGAVBCb3g8VmVyc2lvbmVkQXNzZXRzPgABUGFzc2V0c190cmFuc2Zlcl90eXBluQYBREJveDxUcmFuc2ZlclR5cGU+AAE4cmVtb3RlX2ZlZXNfaWS9BgFUQm94PFZlcnNpb25lZEFzc2V0SWQ+AAFIZmVlc190cmFuc2Zlcl90eXBluQYBREJveDxUcmFuc2ZlclR5cGU+AAFIY3VzdG9tX3hjbV9vbl9kZXN0iQUBVEJveDxWZXJzaW9uZWRYY208KCk+PgABMHdlaWdodF9saW1pdD0GASxXZWlnaHRMaW1pdAANwFUBVHJhbnNmZXIgYXNzZXRzIGZyb20gdGhlIGxvY2FsIGNoYWluIHRvIHRoZSBkZXN0aW5hdGlvbiBjaGFpbiB1c2luZyBleHBsaWNpdCB0cmFuc2Zlcmh0eXBlcyBmb3IgYXNzZXRzIGFuZCBmZWVzLgBZAWBhc3NldHNgIG11c3QgaGF2ZSBzYW1lIHJlc2VydmUgbG9jYXRpb24gb3IgbWF5IGJlIHRlbGVwb3J0YWJsZSB0byBgZGVzdGAuIENhbGxlciBtdXN07HByb3ZpZGUgdGhlIGBhc3NldHNfdHJhbnNmZXJfdHlwZWAgdG8gYmUgdXNlZCBmb3IgYGFzc2V0c2A6UQEgLSBgVHJhbnNmZXJUeXBlOjpMb2NhbFJlc2VydmVgOiB0cmFuc2ZlciBhc3NldHMgdG8gc292ZXJlaWduIGFjY291bnQgb2YgZGVzdGluYXRpb25NASAgIGNoYWluIGFuZCBmb3J3YXJkIGEgbm90aWZpY2F0aW9uIFhDTSB0byBgZGVzdGAgdG8gbWludCBhbmQgZGVwb3NpdCByZXNlcnZlLWJhc2VkbCAgIGFzc2V0cyB0byBgYmVuZWZpY2lhcnlgLlkBIC0gYFRyYW5zZmVyVHlwZTo6RGVzdGluYXRpb25SZXNlcnZlYDogYnVybiBsb2NhbCBhc3NldHMgYW5kIGZvcndhcmQgYSBub3RpZmljYXRpb24gdG9ZASAgIGBkZXN0YCBjaGFpbiB0byB3aXRoZHJhdyB0aGUgcmVzZXJ2ZSBhc3NldHMgZnJvbSB0aGlzIGNoYWluJ3Mgc292ZXJlaWduIGFjY291bnQgYW5khCAgIGRlcG9zaXQgdGhlbSB0byBgYmVuZWZpY2lhcnlgLlkBIC0gYFRyYW5zZmVyVHlwZTo6UmVtb3RlUmVzZXJ2ZShyZXNlcnZlKWA6IGJ1cm4gbG9jYWwgYXNzZXRzLCBmb3J3YXJkIFhDTSB0byBgcmVzZXJ2ZWBhASAgIGNoYWluIHRvIG1vdmUgcmVzZXJ2ZXMgZnJvbSB0aGlzIGNoYWluJ3MgU0EgdG8gYGRlc3RgIGNoYWluJ3MgU0EsIGFuZCBmb3J3YXJkIGFub3RoZXJVASAgIFhDTSB0byBgZGVzdGAgdG8gbWludCBhbmQgZGVwb3NpdCByZXNlcnZlLWJhc2VkIGFzc2V0cyB0byBgYmVuZWZpY2lhcnlgLiBUeXBpY2FsbHmUICAgdGhlIHJlbW90ZSBgcmVzZXJ2ZWAgaXMgQXNzZXQgSHViLkUBIC0gYFRyYW5zZmVyVHlwZTo6VGVsZXBvcnRgOiBidXJuIGxvY2FsIGFzc2V0cyBhbmQgZm9yd2FyZCBYQ00gdG8gYGRlc3RgIGNoYWluIHRv6CAgIG1pbnQvdGVsZXBvcnQgYXNzZXRzIGFuZCBkZXBvc2l0IHRoZW0gdG8gYGJlbmVmaWNpYXJ5YC4AVQFPbiB0aGUgZGVzdGluYXRpb24gY2hhaW4sIGFzIHdlbGwgYXMgYW55IGludGVybWVkaWFyeSBob3BzLCBgQnV5RXhlY3V0aW9uYCBpcyB1c2VkIHRvIQFidXkgZXhlY3V0aW9uIHVzaW5nIHRyYW5zZmVycmVkIGBhc3NldHNgIGlkZW50aWZpZWQgYnkgYHJlbW90ZV9mZWVzX2lkYC5ZAU1ha2Ugc3VyZSBlbm91Z2ggb2YgdGhlIHNwZWNpZmllZCBgcmVtb3RlX2ZlZXNfaWRgIGFzc2V0IGlzIGluY2x1ZGVkIGluIHRoZSBnaXZlbiBsaXN0YQFvZiBgYXNzZXRzYC4gYHJlbW90ZV9mZWVzX2lkYCBzaG91bGQgYmUgZW5vdWdoIHRvIHBheSBmb3IgYHdlaWdodF9saW1pdGAuIElmIG1vcmUgd2VpZ2h0WQFpcyBuZWVkZWQgdGhhbiBgd2VpZ2h0X2xpbWl0YCwgdGhlbiB0aGUgb3BlcmF0aW9uIHdpbGwgZmFpbCBhbmQgdGhlIHNlbnQgYXNzZXRzIG1heSBiZSBhdCByaXNrLgBFAWByZW1vdGVfZmVlc19pZGAgbWF5IHVzZSBkaWZmZXJlbnQgdHJhbnNmZXIgdHlwZSB0aGFuIHJlc3Qgb2YgYGFzc2V0c2AgYW5kIGNhbiBiZZxzcGVjaWZpZWQgdGhyb3VnaCBgZmVlc190cmFuc2Zlcl90eXBlYC4AYQFUaGUgY2FsbGVyIG5lZWRzIHRvIHNwZWNpZnkgd2hhdCBzaG91bGQgaGFwcGVuIHRvIHRoZSB0cmFuc2ZlcnJlZCBhc3NldHMgb25jZSB0aGV5IHJlYWNoQQF0aGUgYGRlc3RgIGNoYWluLiBUaGlzIGlzIGRvbmUgdGhyb3VnaCB0aGUgYGN1c3RvbV94Y21fb25fZGVzdGAgcGFyYW1ldGVyLCB3aGljaPxjb250YWlucyB0aGUgaW5zdHJ1Y3Rpb25zIHRvIGV4ZWN1dGUgb24gYGRlc3RgIGFzIGEgZmluYWwgc3RlcC58ICBUaGlzIGlzIHVzdWFsbHkgYXMgc2ltcGxlIGFzOlEBICBgWGNtKHZlYyFbRGVwb3NpdEFzc2V0IHsgYXNzZXRzOiBXaWxkKEFsbENvdW50ZWQoYXNzZXRzLmxlbigpKSksIGJlbmVmaWNpYXJ5IH1dKWAsMQEgIGJ1dCBjb3VsZCBiZSBzb21ldGhpbmcgbW9yZSBleG90aWMgbGlrZSBzZW5kaW5nIHRoZSBgYXNzZXRzYCBldmVuIGZ1cnRoZXIuACkBLSBgb3JpZ2luYDogTXVzdCBiZSBjYXBhYmxlIG9mIHdpdGhkcmF3aW5nIHRoZSBgYXNzZXRzYCBhbmQgZXhlY3V0aW5nIFhDTS4lAS0gYGRlc3RgOiBEZXN0aW5hdGlvbiBjb250ZXh0IGZvciB0aGUgYXNzZXRzLiBXaWxsIHR5cGljYWxseSBiZSBgW1BhcmVudCxhASAgUGFyYWNoYWluKC4uKV1gIHRvIHNlbmQgZnJvbSBwYXJhY2hhaW4gdG8gcGFyYWNoYWluLCBvciBgW1BhcmFjaGFpbiguLildYCB0byBzZW5kIGZyb209ASAgcmVsYXkgdG8gcGFyYWNoYWluLCBvciBgKHBhcmVudHM6IDIsIChHbG9iYWxDb25zZW5zdXMoLi4pLCAuLikpYCB0byBzZW5kIGZyb230ICBwYXJhY2hhaW4gYWNyb3NzIGEgYnJpZGdlIHRvIGFub3RoZXIgZWNvc3lzdGVtIGRlc3RpbmF0aW9uLlkBLSBgYXNzZXRzYDogVGhlIGFzc2V0cyB0byBiZSB3aXRoZHJhd24uIFRoaXMgc2hvdWxkIGluY2x1ZGUgdGhlIGFzc2V0cyB1c2VkIHRvIHBheSB0aGXIICBmZWUgb24gdGhlIGBkZXN0YCAoYW5kIHBvc3NpYmx5IHJlc2VydmUpIGNoYWlucy49AS0gYGFzc2V0c190cmFuc2Zlcl90eXBlYDogVGhlIFhDTSBgVHJhbnNmZXJUeXBlYCB1c2VkIHRvIHRyYW5zZmVyIHRoZSBgYXNzZXRzYC4hAS0gYHJlbW90ZV9mZWVzX2lkYDogT25lIG9mIHRoZSBpbmNsdWRlZCBgYXNzZXRzYCB0byBiZSB1c2VkIHRvIHBheSBmZWVzLkkBLSBgZmVlc190cmFuc2Zlcl90eXBlYDogVGhlIFhDTSBgVHJhbnNmZXJUeXBlYCB1c2VkIHRvIHRyYW5zZmVyIHRoZSBgZmVlc2AgYXNzZXRzLlkBLSBgY3VzdG9tX3hjbV9vbl9kZXN0YDogVGhlIFhDTSB0byBiZSBleGVjdXRlZCBvbiBgZGVzdGAgY2hhaW4gYXMgdGhlIGxhc3Qgc3RlcCBvZiB0aGVZASAgdHJhbnNmZXIsIHdoaWNoIGFsc28gZGV0ZXJtaW5lcyB3aGF0IGhhcHBlbnMgdG8gdGhlIGFzc2V0cyBvbiB0aGUgZGVzdGluYXRpb24gY2hhaW4uRQEtIGB3ZWlnaHRfbGltaXRgOiBUaGUgcmVtb3RlLXNpZGUgd2VpZ2h0IGxpbWl0LCBpZiBhbnksIGZvciB0aGUgWENNIGZlZSBwdXJjaGFzZS4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMuiQUIDHhjbTBWZXJzaW9uZWRYY20ELFJ1bnRpbWVDYWxsAAEMCFYyBACNBQFQdjI6OlhjbTxSdW50aW1lQ2FsbD4AAgAIVjMEAN0FAVB2Mzo6WGNtPFJ1bnRpbWVDYWxsPgADAAhWNAQAQQYBUHY0OjpYY208UnVudGltZUNhbGw+AAQAAI0FDAx4Y20IdjIMWGNtBCxSdW50aW1lQ2FsbAAABACRBQF0VmVjPEluc3RydWN0aW9uPFJ1bnRpbWVDYWxsPj4AAJEFAAAClQUAlQUMDHhjbQh2MixJbnN0cnVjdGlvbgQsUnVudGltZUNhbGwAAXA0V2l0aGRyYXdBc3NldAQAmQUBLE11bHRpQXNzZXRzAAAAVFJlc2VydmVBc3NldERlcG9zaXRlZAQAmQUBLE11bHRpQXNzZXRzAAEAWFJlY2VpdmVUZWxlcG9ydGVkQXNzZXQEAJkFASxNdWx0aUFzc2V0cwACADRRdWVyeVJlc3BvbnNlDAEgcXVlcnlfaWQsARxRdWVyeUlkAAEgcmVzcG9uc2W1BQEgUmVzcG9uc2UAAShtYXhfd2VpZ2h0LAEMdTY0AAMANFRyYW5zZmVyQXNzZXQIARhhc3NldHOZBQEsTXVsdGlBc3NldHMAASxiZW5lZmljaWFyeUkBATRNdWx0aUxvY2F0aW9uAAQAUFRyYW5zZmVyUmVzZXJ2ZUFzc2V0DAEYYXNzZXRzmQUBLE11bHRpQXNzZXRzAAEQZGVzdEkBATRNdWx0aUxvY2F0aW9uAAEMeGNtjQUBHFhjbTwoKT4ABQAgVHJhbnNhY3QMASxvcmlnaW5fdHlwZcUFAShPcmlnaW5LaW5kAAFYcmVxdWlyZV93ZWlnaHRfYXRfbW9zdCwBDHU2NAABEGNhbGzJBQFoRG91YmxlRW5jb2RlZDxSdW50aW1lQ2FsbD4ABgBkSHJtcE5ld0NoYW5uZWxPcGVuUmVxdWVzdAwBGHNlbmRlcuwBDHUzMgABQG1heF9tZXNzYWdlX3NpemXsAQx1MzIAATBtYXhfY2FwYWNpdHnsAQx1MzIABwBMSHJtcENoYW5uZWxBY2NlcHRlZAQBJHJlY2lwaWVudOwBDHUzMgAIAEhIcm1wQ2hhbm5lbENsb3NpbmcMASRpbml0aWF0b3LsAQx1MzIAARhzZW5kZXLsAQx1MzIAASRyZWNpcGllbnTsAQx1MzIACQAsQ2xlYXJPcmlnaW4ACgA0RGVzY2VuZE9yaWdpbgQATQEBVEludGVyaW9yTXVsdGlMb2NhdGlvbgALACxSZXBvcnRFcnJvcgwBIHF1ZXJ5X2lkLAEcUXVlcnlJZAABEGRlc3RJAQE0TXVsdGlMb2NhdGlvbgABTG1heF9yZXNwb25zZV93ZWlnaHQsAQx1NjQADAAwRGVwb3NpdEFzc2V0DAEYYXNzZXRzzQUBQE11bHRpQXNzZXRGaWx0ZXIAAShtYXhfYXNzZXRz7AEMdTMyAAEsYmVuZWZpY2lhcnlJAQE0TXVsdGlMb2NhdGlvbgANAExEZXBvc2l0UmVzZXJ2ZUFzc2V0EAEYYXNzZXRzzQUBQE11bHRpQXNzZXRGaWx0ZXIAAShtYXhfYXNzZXRz7AEMdTMyAAEQZGVzdEkBATRNdWx0aUxvY2F0aW9uAAEMeGNtjQUBHFhjbTwoKT4ADgA0RXhjaGFuZ2VBc3NldAgBEGdpdmXNBQFATXVsdGlBc3NldEZpbHRlcgABHHJlY2VpdmWZBQEsTXVsdGlBc3NldHMADwBcSW5pdGlhdGVSZXNlcnZlV2l0aGRyYXcMARhhc3NldHPNBQFATXVsdGlBc3NldEZpbHRlcgABHHJlc2VydmVJAQE0TXVsdGlMb2NhdGlvbgABDHhjbY0FARxYY208KCk+ABAAQEluaXRpYXRlVGVsZXBvcnQMARhhc3NldHPNBQFATXVsdGlBc3NldEZpbHRlcgABEGRlc3RJAQE0TXVsdGlMb2NhdGlvbgABDHhjbY0FARxYY208KCk+ABEAMFF1ZXJ5SG9sZGluZxABIHF1ZXJ5X2lkLAEcUXVlcnlJZAABEGRlc3RJAQE0TXVsdGlMb2NhdGlvbgABGGFzc2V0c80FAUBNdWx0aUFzc2V0RmlsdGVyAAFMbWF4X3Jlc3BvbnNlX3dlaWdodCwBDHU2NAASADBCdXlFeGVjdXRpb24IARBmZWVzoQUBKE11bHRpQXNzZXQAATB3ZWlnaHRfbGltaXTZBQEsV2VpZ2h0TGltaXQAEwA0UmVmdW5kU3VycGx1cwAUADxTZXRFcnJvckhhbmRsZXIEAI0FAUBYY208UnVudGltZUNhbGw+ABUALFNldEFwcGVuZGl4BACNBQFAWGNtPFJ1bnRpbWVDYWxsPgAWAChDbGVhckVycm9yABcAKENsYWltQXNzZXQIARhhc3NldHOZBQEsTXVsdGlBc3NldHMAARh0aWNrZXRJAQE0TXVsdGlMb2NhdGlvbgAYABBUcmFwBAAsAQx1NjQAGQBAU3Vic2NyaWJlVmVyc2lvbggBIHF1ZXJ5X2lkLAEcUXVlcnlJZAABTG1heF9yZXNwb25zZV93ZWlnaHQsAQx1NjQAGgBIVW5zdWJzY3JpYmVWZXJzaW9uABsAAJkFEAx4Y20IdjIobXVsdGlhc3NldCxNdWx0aUFzc2V0cwAABACdBQE8VmVjPE11bHRpQXNzZXQ+AACdBQAAAqEFAKEFEAx4Y20IdjIobXVsdGlhc3NldChNdWx0aUFzc2V0AAAIAQhpZKUFARxBc3NldElkAAEMZnVuqQUBLEZ1bmdpYmlsaXR5AAClBRAMeGNtCHYyKG11bHRpYXNzZXQcQXNzZXRJZAABCCBDb25jcmV0ZQQASQEBNE11bHRpTG9jYXRpb24AAAAgQWJzdHJhY3QEADgBHFZlYzx1OD4AAQAAqQUQDHhjbQh2MihtdWx0aWFzc2V0LEZ1bmdpYmlsaXR5AAEIIEZ1bmdpYmxlBAD8ARB1MTI4AAAALE5vbkZ1bmdpYmxlBACtBQE0QXNzZXRJbnN0YW5jZQABAACtBRAMeGNtCHYyKG11bHRpYXNzZXQ0QXNzZXRJbnN0YW5jZQABHCRVbmRlZmluZWQAAAAUSW5kZXgEAPwBEHUxMjgAAQAYQXJyYXk0BABIARxbdTg7IDRdAAIAGEFycmF5OAQAsQUBHFt1ODsgOF0AAwAcQXJyYXkxNgQAwAEgW3U4OyAxNl0ABAAcQXJyYXkzMgQABAEgW3U4OyAzMl0ABQAQQmxvYgQAOAEcVmVjPHU4PgAGAACxBQAAAwgAAAAIALUFDAx4Y20IdjIgUmVzcG9uc2UAARAQTnVsbAAAABhBc3NldHMEAJkFASxNdWx0aUFzc2V0cwABADxFeGVjdXRpb25SZXN1bHQEALkFAVBPcHRpb248KHUzMiwgRXJyb3IpPgACABxWZXJzaW9uBAAQAThzdXBlcjo6VmVyc2lvbgADAAC5BQQYT3B0aW9uBARUAb0FAQgQTm9uZQAAABBTb21lBAC9BQAAAQAAvQUAAAQIEMEFAMEFEAx4Y20IdjIYdHJhaXRzFEVycm9yAAFoIE92ZXJmbG93AAAANFVuaW1wbGVtZW50ZWQAAQBgVW50cnVzdGVkUmVzZXJ2ZUxvY2F0aW9uAAIAZFVudHJ1c3RlZFRlbGVwb3J0TG9jYXRpb24AAwBETXVsdGlMb2NhdGlvbkZ1bGwABABoTXVsdGlMb2NhdGlvbk5vdEludmVydGlibGUABQAkQmFkT3JpZ2luAAYAPEludmFsaWRMb2NhdGlvbgAHADRBc3NldE5vdEZvdW5kAAgAVEZhaWxlZFRvVHJhbnNhY3RBc3NldAAJADxOb3RXaXRoZHJhd2FibGUACgBITG9jYXRpb25DYW5ub3RIb2xkAAsAVEV4Y2VlZHNNYXhNZXNzYWdlU2l6ZQAMAFhEZXN0aW5hdGlvblVuc3VwcG9ydGVkAA0AJFRyYW5zcG9ydAAOAChVbnJvdXRhYmxlAA8AMFVua25vd25DbGFpbQAQADhGYWlsZWRUb0RlY29kZQARAEBNYXhXZWlnaHRJbnZhbGlkABIAOE5vdEhvbGRpbmdGZWVzABMAMFRvb0V4cGVuc2l2ZQAUABBUcmFwBAAwAQx1NjQAFQBMVW5oYW5kbGVkWGNtVmVyc2lvbgAWAEhXZWlnaHRMaW1pdFJlYWNoZWQEADABGFdlaWdodAAXABxCYXJyaWVyABgATFdlaWdodE5vdENvbXB1dGFibGUAGQAAxQUMDHhjbQh2MihPcmlnaW5LaW5kAAEQGE5hdGl2ZQAAAEBTb3ZlcmVpZ25BY2NvdW50AAEAJFN1cGVydXNlcgACAAxYY20AAwAAyQUMDHhjbThkb3VibGVfZW5jb2RlZDREb3VibGVFbmNvZGVkBARUAAAEARxlbmNvZGVkOAEcVmVjPHU4PgAAzQUQDHhjbQh2MihtdWx0aWFzc2V0QE11bHRpQXNzZXRGaWx0ZXIAAQggRGVmaW5pdGUEAJkFASxNdWx0aUFzc2V0cwAAABBXaWxkBADRBQE4V2lsZE11bHRpQXNzZXQAAQAA0QUQDHhjbQh2MihtdWx0aWFzc2V0OFdpbGRNdWx0aUFzc2V0AAEIDEFsbAAAABRBbGxPZggBCGlkpQUBHEFzc2V0SWQAAQxmdW7VBQE8V2lsZEZ1bmdpYmlsaXR5AAEAANUFEAx4Y20IdjIobXVsdGlhc3NldDxXaWxkRnVuZ2liaWxpdHkAAQggRnVuZ2libGUAAAAsTm9uRnVuZ2libGUAAQAA2QUMDHhjbQh2MixXZWlnaHRMaW1pdAABCCRVbmxpbWl0ZWQAAAAcTGltaXRlZAQALAEMdTY0AAEAAN0FDAx4Y20IdjMMWGNtBBBDYWxsAAAEAOEFAVhWZWM8SW5zdHJ1Y3Rpb248Q2FsbD4+AADhBQAAAuUFAOUFDAx4Y20IdjMsSW5zdHJ1Y3Rpb24EEENhbGwAAcA0V2l0aGRyYXdBc3NldAQA6QUBLE11bHRpQXNzZXRzAAAAVFJlc2VydmVBc3NldERlcG9zaXRlZAQA6QUBLE11bHRpQXNzZXRzAAEAWFJlY2VpdmVUZWxlcG9ydGVkQXNzZXQEAOkFASxNdWx0aUFzc2V0cwACADRRdWVyeVJlc3BvbnNlEAEgcXVlcnlfaWQsARxRdWVyeUlkAAEgcmVzcG9uc2X9BQEgUmVzcG9uc2UAAShtYXhfd2VpZ2h0KAEYV2VpZ2h0AAEccXVlcmllciUGAVRPcHRpb248TXVsdGlMb2NhdGlvbj4AAwA0VHJhbnNmZXJBc3NldAgBGGFzc2V0c+kFASxNdWx0aUFzc2V0cwABLGJlbmVmaWNpYXJ54AE0TXVsdGlMb2NhdGlvbgAEAFBUcmFuc2ZlclJlc2VydmVBc3NldAwBGGFzc2V0c+kFASxNdWx0aUFzc2V0cwABEGRlc3TgATRNdWx0aUxvY2F0aW9uAAEMeGNt3QUBHFhjbTwoKT4ABQAgVHJhbnNhY3QMASxvcmlnaW5fa2luZCkGAShPcmlnaW5LaW5kAAFYcmVxdWlyZV93ZWlnaHRfYXRfbW9zdCgBGFdlaWdodAABEGNhbGzJBQFMRG91YmxlRW5jb2RlZDxDYWxsPgAGAGRIcm1wTmV3Q2hhbm5lbE9wZW5SZXF1ZXN0DAEYc2VuZGVy7AEMdTMyAAFAbWF4X21lc3NhZ2Vfc2l6ZewBDHUzMgABMG1heF9jYXBhY2l0eewBDHUzMgAHAExIcm1wQ2hhbm5lbEFjY2VwdGVkBAEkcmVjaXBpZW507AEMdTMyAAgASEhybXBDaGFubmVsQ2xvc2luZwwBJGluaXRpYXRvcuwBDHUzMgABGHNlbmRlcuwBDHUzMgABJHJlY2lwaWVudOwBDHUzMgAJACxDbGVhck9yaWdpbgAKADREZXNjZW5kT3JpZ2luBADkAVRJbnRlcmlvck11bHRpTG9jYXRpb24ACwAsUmVwb3J0RXJyb3IEAC0GAURRdWVyeVJlc3BvbnNlSW5mbwAMADBEZXBvc2l0QXNzZXQIARhhc3NldHMxBgFATXVsdGlBc3NldEZpbHRlcgABLGJlbmVmaWNpYXJ54AE0TXVsdGlMb2NhdGlvbgANAExEZXBvc2l0UmVzZXJ2ZUFzc2V0DAEYYXNzZXRzMQYBQE11bHRpQXNzZXRGaWx0ZXIAARBkZXN04AE0TXVsdGlMb2NhdGlvbgABDHhjbd0FARxYY208KCk+AA4ANEV4Y2hhbmdlQXNzZXQMARBnaXZlMQYBQE11bHRpQXNzZXRGaWx0ZXIAARB3YW506QUBLE11bHRpQXNzZXRzAAEcbWF4aW1hbCABEGJvb2wADwBcSW5pdGlhdGVSZXNlcnZlV2l0aGRyYXcMARhhc3NldHMxBgFATXVsdGlBc3NldEZpbHRlcgABHHJlc2VydmXgATRNdWx0aUxvY2F0aW9uAAEMeGNt3QUBHFhjbTwoKT4AEABASW5pdGlhdGVUZWxlcG9ydAwBGGFzc2V0czEGAUBNdWx0aUFzc2V0RmlsdGVyAAEQZGVzdOABNE11bHRpTG9jYXRpb24AAQx4Y23dBQEcWGNtPCgpPgARADRSZXBvcnRIb2xkaW5nCAE0cmVzcG9uc2VfaW5mby0GAURRdWVyeVJlc3BvbnNlSW5mbwABGGFzc2V0czEGAUBNdWx0aUFzc2V0RmlsdGVyABIAMEJ1eUV4ZWN1dGlvbggBEGZlZXPxBQEoTXVsdGlBc3NldAABMHdlaWdodF9saW1pdD0GASxXZWlnaHRMaW1pdAATADRSZWZ1bmRTdXJwbHVzABQAPFNldEVycm9ySGFuZGxlcgQA3QUBJFhjbTxDYWxsPgAVACxTZXRBcHBlbmRpeAQA3QUBJFhjbTxDYWxsPgAWAChDbGVhckVycm9yABcAKENsYWltQXNzZXQIARhhc3NldHPpBQEsTXVsdGlBc3NldHMAARh0aWNrZXTgATRNdWx0aUxvY2F0aW9uABgAEFRyYXAEACwBDHU2NAAZAEBTdWJzY3JpYmVWZXJzaW9uCAEgcXVlcnlfaWQsARxRdWVyeUlkAAFMbWF4X3Jlc3BvbnNlX3dlaWdodCgBGFdlaWdodAAaAEhVbnN1YnNjcmliZVZlcnNpb24AGwAkQnVybkFzc2V0BADpBQEsTXVsdGlBc3NldHMAHAAsRXhwZWN0QXNzZXQEAOkFASxNdWx0aUFzc2V0cwAdADBFeHBlY3RPcmlnaW4EACUGAVRPcHRpb248TXVsdGlMb2NhdGlvbj4AHgAsRXhwZWN0RXJyb3IEAAEGAVBPcHRpb248KHUzMiwgRXJyb3IpPgAfAFBFeHBlY3RUcmFuc2FjdFN0YXR1cwQAHQYBOE1heWJlRXJyb3JDb2RlACAALFF1ZXJ5UGFsbGV0CAEsbW9kdWxlX25hbWU4ARxWZWM8dTg+AAE0cmVzcG9uc2VfaW5mby0GAURRdWVyeVJlc3BvbnNlSW5mbwAhADBFeHBlY3RQYWxsZXQUARRpbmRleOwBDHUzMgABEG5hbWU4ARxWZWM8dTg+AAEsbW9kdWxlX25hbWU4ARxWZWM8dTg+AAEsY3JhdGVfbWFqb3LsAQx1MzIAATxtaW5fY3JhdGVfbWlub3LsAQx1MzIAIgBQUmVwb3J0VHJhbnNhY3RTdGF0dXMEAC0GAURRdWVyeVJlc3BvbnNlSW5mbwAjAExDbGVhclRyYW5zYWN0U3RhdHVzACQAPFVuaXZlcnNhbE9yaWdpbgQA6AEgSnVuY3Rpb24AJQA0RXhwb3J0TWVzc2FnZQwBHG5ldHdvcmv0ASROZXR3b3JrSWQAASxkZXN0aW5hdGlvbuQBVEludGVyaW9yTXVsdGlMb2NhdGlvbgABDHhjbd0FARxYY208KCk+ACYAJExvY2tBc3NldAgBFGFzc2V08QUBKE11bHRpQXNzZXQAASB1bmxvY2tlcuABNE11bHRpTG9jYXRpb24AJwAsVW5sb2NrQXNzZXQIARRhc3NldPEFAShNdWx0aUFzc2V0AAEYdGFyZ2V04AE0TXVsdGlMb2NhdGlvbgAoADhOb3RlVW5sb2NrYWJsZQgBFGFzc2V08QUBKE11bHRpQXNzZXQAARRvd25lcuABNE11bHRpTG9jYXRpb24AKQA0UmVxdWVzdFVubG9jawgBFGFzc2V08QUBKE11bHRpQXNzZXQAARhsb2NrZXLgATRNdWx0aUxvY2F0aW9uACoALFNldEZlZXNNb2RlBAEwaml0X3dpdGhkcmF3IAEQYm9vbAArACBTZXRUb3BpYwQABAEgW3U4OyAzMl0ALAAoQ2xlYXJUb3BpYwAtACxBbGlhc09yaWdpbgQA4AE0TXVsdGlMb2NhdGlvbgAuADxVbnBhaWRFeGVjdXRpb24IATB3ZWlnaHRfbGltaXQ9BgEsV2VpZ2h0TGltaXQAATBjaGVja19vcmlnaW4lBgFUT3B0aW9uPE11bHRpTG9jYXRpb24+AC8AAOkFEAx4Y20IdjMobXVsdGlhc3NldCxNdWx0aUFzc2V0cwAABADtBQE8VmVjPE11bHRpQXNzZXQ+AADtBQAAAvEFAPEFEAx4Y20IdjMobXVsdGlhc3NldChNdWx0aUFzc2V0AAAIAQhpZAkBARxBc3NldElkAAEMZnVu9QUBLEZ1bmdpYmlsaXR5AAD1BRAMeGNtCHYzKG11bHRpYXNzZXQsRnVuZ2liaWxpdHkAAQggRnVuZ2libGUEAPwBEHUxMjgAAAAsTm9uRnVuZ2libGUEAPkFATRBc3NldEluc3RhbmNlAAEAAPkFEAx4Y20IdjMobXVsdGlhc3NldDRBc3NldEluc3RhbmNlAAEYJFVuZGVmaW5lZAAAABRJbmRleAQA/AEQdTEyOAABABhBcnJheTQEAEgBHFt1ODsgNF0AAgAYQXJyYXk4BACxBQEcW3U4OyA4XQADABxBcnJheTE2BADAASBbdTg7IDE2XQAEABxBcnJheTMyBAAEASBbdTg7IDMyXQAFAAD9BQwMeGNtCHYzIFJlc3BvbnNlAAEYEE51bGwAAAAYQXNzZXRzBADpBQEsTXVsdGlBc3NldHMAAQA8RXhlY3V0aW9uUmVzdWx0BAABBgFQT3B0aW9uPCh1MzIsIEVycm9yKT4AAgAcVmVyc2lvbgQAEAE4c3VwZXI6OlZlcnNpb24AAwAsUGFsbGV0c0luZm8EAA0GAZhCb3VuZGVkVmVjPFBhbGxldEluZm8sIE1heFBhbGxldHNJbmZvPgAEADhEaXNwYXRjaFJlc3VsdAQAHQYBOE1heWJlRXJyb3JDb2RlAAUAAAEGBBhPcHRpb24EBFQBBQYBCBBOb25lAAAAEFNvbWUEAAUGAAABAAAFBgAABAgQCQYACQYQDHhjbQh2Mxh0cmFpdHMURXJyb3IAAaAgT3ZlcmZsb3cAAAA0VW5pbXBsZW1lbnRlZAABAGBVbnRydXN0ZWRSZXNlcnZlTG9jYXRpb24AAgBkVW50cnVzdGVkVGVsZXBvcnRMb2NhdGlvbgADADBMb2NhdGlvbkZ1bGwABABUTG9jYXRpb25Ob3RJbnZlcnRpYmxlAAUAJEJhZE9yaWdpbgAGADxJbnZhbGlkTG9jYXRpb24ABwA0QXNzZXROb3RGb3VuZAAIAFRGYWlsZWRUb1RyYW5zYWN0QXNzZXQACQA8Tm90V2l0aGRyYXdhYmxlAAoASExvY2F0aW9uQ2Fubm90SG9sZAALAFRFeGNlZWRzTWF4TWVzc2FnZVNpemUADABYRGVzdGluYXRpb25VbnN1cHBvcnRlZAANACRUcmFuc3BvcnQADgAoVW5yb3V0YWJsZQAPADBVbmtub3duQ2xhaW0AEAA4RmFpbGVkVG9EZWNvZGUAEQBATWF4V2VpZ2h0SW52YWxpZAASADhOb3RIb2xkaW5nRmVlcwATADBUb29FeHBlbnNpdmUAFAAQVHJhcAQAMAEMdTY0ABUAQEV4cGVjdGF0aW9uRmFsc2UAFgA4UGFsbGV0Tm90Rm91bmQAFwAwTmFtZU1pc21hdGNoABgATFZlcnNpb25JbmNvbXBhdGlibGUAGQBQSG9sZGluZ1dvdWxkT3ZlcmZsb3cAGgAsRXhwb3J0RXJyb3IAGwA4UmVhbmNob3JGYWlsZWQAHAAYTm9EZWFsAB0AKEZlZXNOb3RNZXQAHgAkTG9ja0Vycm9yAB8AME5vUGVybWlzc2lvbgAgAChVbmFuY2hvcmVkACEAOE5vdERlcG9zaXRhYmxlACIATFVuaGFuZGxlZFhjbVZlcnNpb24AIwBIV2VpZ2h0TGltaXRSZWFjaGVkBAAoARhXZWlnaHQAJAAcQmFycmllcgAlAExXZWlnaHROb3RDb21wdXRhYmxlACYAREV4Y2VlZHNTdGFja0xpbWl0ACcAAA0GDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBEQYEUwAABAAZBgEYVmVjPFQ+AAARBgwMeGNtCHYzKFBhbGxldEluZm8AABgBFGluZGV47AEMdTMyAAEQbmFtZRUGAYBCb3VuZGVkVmVjPHU4LCBNYXhQYWxsZXROYW1lTGVuPgABLG1vZHVsZV9uYW1lFQYBgEJvdW5kZWRWZWM8dTgsIE1heFBhbGxldE5hbWVMZW4+AAEUbWFqb3LsAQx1MzIAARRtaW5vcuwBDHUzMgABFHBhdGNo7AEMdTMyAAAVBgxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAQgEUwAABAA4ARhWZWM8VD4AABkGAAACEQYAHQYMDHhjbQh2MzhNYXliZUVycm9yQ29kZQABDBxTdWNjZXNzAAAAFEVycm9yBAAhBgGMQm91bmRlZFZlYzx1OCwgTWF4RGlzcGF0Y2hFcnJvckxlbj4AAQA4VHJ1bmNhdGVkRXJyb3IEACEGAYxCb3VuZGVkVmVjPHU4LCBNYXhEaXNwYXRjaEVycm9yTGVuPgACAAAhBgxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAQgEUwAABAA4ARhWZWM8VD4AACUGBBhPcHRpb24EBFQB4AEIEE5vbmUAAAAQU29tZQQA4AAAAQAAKQYMDHhjbQh2MyhPcmlnaW5LaW5kAAEQGE5hdGl2ZQAAAEBTb3ZlcmVpZ25BY2NvdW50AAEAJFN1cGVydXNlcgACAAxYY20AAwAALQYMDHhjbQh2M0RRdWVyeVJlc3BvbnNlSW5mbwAADAEsZGVzdGluYXRpb27gATRNdWx0aUxvY2F0aW9uAAEgcXVlcnlfaWQsARxRdWVyeUlkAAEobWF4X3dlaWdodCgBGFdlaWdodAAAMQYQDHhjbQh2MyhtdWx0aWFzc2V0QE11bHRpQXNzZXRGaWx0ZXIAAQggRGVmaW5pdGUEAOkFASxNdWx0aUFzc2V0cwAAABBXaWxkBAA1BgE4V2lsZE11bHRpQXNzZXQAAQAANQYQDHhjbQh2MyhtdWx0aWFzc2V0OFdpbGRNdWx0aUFzc2V0AAEQDEFsbAAAABRBbGxPZggBCGlkCQEBHEFzc2V0SWQAAQxmdW45BgE8V2lsZEZ1bmdpYmlsaXR5AAEAKEFsbENvdW50ZWQEAOwBDHUzMgACADBBbGxPZkNvdW50ZWQMAQhpZAkBARxBc3NldElkAAEMZnVuOQYBPFdpbGRGdW5naWJpbGl0eQABFGNvdW507AEMdTMyAAMAADkGEAx4Y20IdjMobXVsdGlhc3NldDxXaWxkRnVuZ2liaWxpdHkAAQggRnVuZ2libGUAAAAsTm9uRnVuZ2libGUAAQAAPQYMDHhjbQh2MyxXZWlnaHRMaW1pdAABCCRVbmxpbWl0ZWQAAAAcTGltaXRlZAQAKAEYV2VpZ2h0AAEAAEEGDCxzdGFnaW5nX3hjbQh2NAxYY20EEENhbGwAAAQARQYBWFZlYzxJbnN0cnVjdGlvbjxDYWxsPj4AAEUGAAACSQYASQYMLHN0YWdpbmdfeGNtCHY0LEluc3RydWN0aW9uBBBDYWxsAAHANFdpdGhkcmF3QXNzZXQEAE0GARhBc3NldHMAAABUUmVzZXJ2ZUFzc2V0RGVwb3NpdGVkBABNBgEYQXNzZXRzAAEAWFJlY2VpdmVUZWxlcG9ydGVkQXNzZXQEAE0GARhBc3NldHMAAgA0UXVlcnlSZXNwb25zZRABIHF1ZXJ5X2lkLAEcUXVlcnlJZAABIHJlc3BvbnNlYQYBIFJlc3BvbnNlAAEobWF4X3dlaWdodCgBGFdlaWdodAABHHF1ZXJpZXJ1BgFAT3B0aW9uPExvY2F0aW9uPgADADRUcmFuc2ZlckFzc2V0CAEYYXNzZXRzTQYBGEFzc2V0cwABLGJlbmVmaWNpYXJ5DQEBIExvY2F0aW9uAAQAUFRyYW5zZmVyUmVzZXJ2ZUFzc2V0DAEYYXNzZXRzTQYBGEFzc2V0cwABEGRlc3QNAQEgTG9jYXRpb24AAQx4Y21BBgEcWGNtPCgpPgAFACBUcmFuc2FjdAwBLG9yaWdpbl9raW5kKQYBKE9yaWdpbktpbmQAAVhyZXF1aXJlX3dlaWdodF9hdF9tb3N0KAEYV2VpZ2h0AAEQY2FsbMkFAUxEb3VibGVFbmNvZGVkPENhbGw+AAYAZEhybXBOZXdDaGFubmVsT3BlblJlcXVlc3QMARhzZW5kZXLsAQx1MzIAAUBtYXhfbWVzc2FnZV9zaXpl7AEMdTMyAAEwbWF4X2NhcGFjaXR57AEMdTMyAAcATEhybXBDaGFubmVsQWNjZXB0ZWQEASRyZWNpcGllbnTsAQx1MzIACABISHJtcENoYW5uZWxDbG9zaW5nDAEkaW5pdGlhdG9y7AEMdTMyAAEYc2VuZGVy7AEMdTMyAAEkcmVjaXBpZW507AEMdTMyAAkALENsZWFyT3JpZ2luAAoANERlc2NlbmRPcmlnaW4EABEBAUBJbnRlcmlvckxvY2F0aW9uAAsALFJlcG9ydEVycm9yBAB5BgFEUXVlcnlSZXNwb25zZUluZm8ADAAwRGVwb3NpdEFzc2V0CAEYYXNzZXRzfQYBLEFzc2V0RmlsdGVyAAEsYmVuZWZpY2lhcnkNAQEgTG9jYXRpb24ADQBMRGVwb3NpdFJlc2VydmVBc3NldAwBGGFzc2V0c30GASxBc3NldEZpbHRlcgABEGRlc3QNAQEgTG9jYXRpb24AAQx4Y21BBgEcWGNtPCgpPgAOADRFeGNoYW5nZUFzc2V0DAEQZ2l2ZX0GASxBc3NldEZpbHRlcgABEHdhbnRNBgEYQXNzZXRzAAEcbWF4aW1hbCABEGJvb2wADwBcSW5pdGlhdGVSZXNlcnZlV2l0aGRyYXcMARhhc3NldHN9BgEsQXNzZXRGaWx0ZXIAARxyZXNlcnZlDQEBIExvY2F0aW9uAAEMeGNtQQYBHFhjbTwoKT4AEABASW5pdGlhdGVUZWxlcG9ydAwBGGFzc2V0c30GASxBc3NldEZpbHRlcgABEGRlc3QNAQEgTG9jYXRpb24AAQx4Y21BBgEcWGNtPCgpPgARADRSZXBvcnRIb2xkaW5nCAE0cmVzcG9uc2VfaW5mb3kGAURRdWVyeVJlc3BvbnNlSW5mbwABGGFzc2V0c30GASxBc3NldEZpbHRlcgASADBCdXlFeGVjdXRpb24IARBmZWVzVQYBFEFzc2V0AAEwd2VpZ2h0X2xpbWl0PQYBLFdlaWdodExpbWl0ABMANFJlZnVuZFN1cnBsdXMAFAA8U2V0RXJyb3JIYW5kbGVyBABBBgEkWGNtPENhbGw+ABUALFNldEFwcGVuZGl4BABBBgEkWGNtPENhbGw+ABYAKENsZWFyRXJyb3IAFwAoQ2xhaW1Bc3NldAgBGGFzc2V0c00GARhBc3NldHMAARh0aWNrZXQNAQEgTG9jYXRpb24AGAAQVHJhcAQALAEMdTY0ABkAQFN1YnNjcmliZVZlcnNpb24IASBxdWVyeV9pZCwBHFF1ZXJ5SWQAAUxtYXhfcmVzcG9uc2Vfd2VpZ2h0KAEYV2VpZ2h0ABoASFVuc3Vic2NyaWJlVmVyc2lvbgAbACRCdXJuQXNzZXQEAE0GARhBc3NldHMAHAAsRXhwZWN0QXNzZXQEAE0GARhBc3NldHMAHQAwRXhwZWN0T3JpZ2luBAB1BgFAT3B0aW9uPExvY2F0aW9uPgAeACxFeHBlY3RFcnJvcgQAAQYBUE9wdGlvbjwodTMyLCBFcnJvcik+AB8AUEV4cGVjdFRyYW5zYWN0U3RhdHVzBAAdBgE4TWF5YmVFcnJvckNvZGUAIAAsUXVlcnlQYWxsZXQIASxtb2R1bGVfbmFtZTgBHFZlYzx1OD4AATRyZXNwb25zZV9pbmZveQYBRFF1ZXJ5UmVzcG9uc2VJbmZvACEAMEV4cGVjdFBhbGxldBQBFGluZGV47AEMdTMyAAEQbmFtZTgBHFZlYzx1OD4AASxtb2R1bGVfbmFtZTgBHFZlYzx1OD4AASxjcmF0ZV9tYWpvcuwBDHUzMgABPG1pbl9jcmF0ZV9taW5vcuwBDHUzMgAiAFBSZXBvcnRUcmFuc2FjdFN0YXR1cwQAeQYBRFF1ZXJ5UmVzcG9uc2VJbmZvACMATENsZWFyVHJhbnNhY3RTdGF0dXMAJAA8VW5pdmVyc2FsT3JpZ2luBAAZAQEgSnVuY3Rpb24AJQA0RXhwb3J0TWVzc2FnZQwBHG5ldHdvcmshAQEkTmV0d29ya0lkAAEsZGVzdGluYXRpb24RAQFASW50ZXJpb3JMb2NhdGlvbgABDHhjbUEGARxYY208KCk+ACYAJExvY2tBc3NldAgBFGFzc2V0VQYBFEFzc2V0AAEgdW5sb2NrZXINAQEgTG9jYXRpb24AJwAsVW5sb2NrQXNzZXQIARRhc3NldFUGARRBc3NldAABGHRhcmdldA0BASBMb2NhdGlvbgAoADhOb3RlVW5sb2NrYWJsZQgBFGFzc2V0VQYBFEFzc2V0AAEUb3duZXINAQEgTG9jYXRpb24AKQA0UmVxdWVzdFVubG9jawgBFGFzc2V0VQYBFEFzc2V0AAEYbG9ja2VyDQEBIExvY2F0aW9uACoALFNldEZlZXNNb2RlBAEwaml0X3dpdGhkcmF3IAEQYm9vbAArACBTZXRUb3BpYwQABAEgW3U4OyAzMl0ALAAoQ2xlYXJUb3BpYwAtACxBbGlhc09yaWdpbgQADQEBIExvY2F0aW9uAC4APFVucGFpZEV4ZWN1dGlvbggBMHdlaWdodF9saW1pdD0GASxXZWlnaHRMaW1pdAABMGNoZWNrX29yaWdpbnUGAUBPcHRpb248TG9jYXRpb24+AC8AAE0GECxzdGFnaW5nX3hjbQh2NBRhc3NldBhBc3NldHMAAAQAUQYBKFZlYzxBc3NldD4AAFEGAAACVQYAVQYQLHN0YWdpbmdfeGNtCHY0FGFzc2V0FEFzc2V0AAAIAQhpZEEBARxBc3NldElkAAEMZnVuWQYBLEZ1bmdpYmlsaXR5AABZBhAsc3RhZ2luZ194Y20IdjQUYXNzZXQsRnVuZ2liaWxpdHkAAQggRnVuZ2libGUEAPwBEHUxMjgAAAAsTm9uRnVuZ2libGUEAF0GATRBc3NldEluc3RhbmNlAAEAAF0GECxzdGFnaW5nX3hjbQh2NBRhc3NldDRBc3NldEluc3RhbmNlAAEYJFVuZGVmaW5lZAAAABRJbmRleAQA/AEQdTEyOAABABhBcnJheTQEAEgBHFt1ODsgNF0AAgAYQXJyYXk4BACxBQEcW3U4OyA4XQADABxBcnJheTE2BADAASBbdTg7IDE2XQAEABxBcnJheTMyBAAEASBbdTg7IDMyXQAFAABhBgwsc3RhZ2luZ194Y20IdjQgUmVzcG9uc2UAARgQTnVsbAAAABhBc3NldHMEAE0GARhBc3NldHMAAQA8RXhlY3V0aW9uUmVzdWx0BAABBgFQT3B0aW9uPCh1MzIsIEVycm9yKT4AAgAcVmVyc2lvbgQAEAE4c3VwZXI6OlZlcnNpb24AAwAsUGFsbGV0c0luZm8EAGUGAZhCb3VuZGVkVmVjPFBhbGxldEluZm8sIE1heFBhbGxldHNJbmZvPgAEADhEaXNwYXRjaFJlc3VsdAQAHQYBOE1heWJlRXJyb3JDb2RlAAUAAGUGDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBaQYEUwAABABxBgEYVmVjPFQ+AABpBgwsc3RhZ2luZ194Y20IdjQoUGFsbGV0SW5mbwAAGAEUaW5kZXjsAQx1MzIAARBuYW1lbQYBgEJvdW5kZWRWZWM8dTgsIE1heFBhbGxldE5hbWVMZW4+AAEsbW9kdWxlX25hbWVtBgGAQm91bmRlZFZlYzx1OCwgTWF4UGFsbGV0TmFtZUxlbj4AARRtYWpvcuwBDHUzMgABFG1pbm9y7AEMdTMyAAEUcGF0Y2jsAQx1MzIAAG0GDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBCARTAAAEADgBGFZlYzxUPgAAcQYAAAJpBgB1BgQYT3B0aW9uBARUAQ0BAQgQTm9uZQAAABBTb21lBAANAQAAAQAAeQYMLHN0YWdpbmdfeGNtCHY0RFF1ZXJ5UmVzcG9uc2VJbmZvAAAMASxkZXN0aW5hdGlvbg0BASBMb2NhdGlvbgABIHF1ZXJ5X2lkLAEcUXVlcnlJZAABKG1heF93ZWlnaHQoARhXZWlnaHQAAH0GECxzdGFnaW5nX3hjbQh2NBRhc3NldCxBc3NldEZpbHRlcgABCCBEZWZpbml0ZQQATQYBGEFzc2V0cwAAABBXaWxkBACBBgEkV2lsZEFzc2V0AAEAAIEGECxzdGFnaW5nX3hjbQh2NBRhc3NldCRXaWxkQXNzZXQAARAMQWxsAAAAFEFsbE9mCAEIaWRBAQEcQXNzZXRJZAABDGZ1boUGATxXaWxkRnVuZ2liaWxpdHkAAQAoQWxsQ291bnRlZAQA7AEMdTMyAAIAMEFsbE9mQ291bnRlZAwBCGlkQQEBHEFzc2V0SWQAAQxmdW6FBgE8V2lsZEZ1bmdpYmlsaXR5AAEUY291bnTsAQx1MzIAAwAAhQYQLHN0YWdpbmdfeGNtCHY0FGFzc2V0PFdpbGRGdW5naWJpbGl0eQABCCBGdW5naWJsZQAAACxOb25GdW5naWJsZQABAACJBggMeGNtPFZlcnNpb25lZEFzc2V0cwABDAhWMgQAmQUBPHYyOjpNdWx0aUFzc2V0cwABAAhWMwQA6QUBPHYzOjpNdWx0aUFzc2V0cwADAAhWNAQATQYBKHY0OjpBc3NldHMABAAAjQYIDHhjbTBWZXJzaW9uZWRYY20ELFJ1bnRpbWVDYWxsAAEMCFYyBACRBgFQdjI6OlhjbTxSdW50aW1lQ2FsbD4AAgAIVjMEAKEGAVB2Mzo6WGNtPFJ1bnRpbWVDYWxsPgADAAhWNAQArQYBUHY0OjpYY208UnVudGltZUNhbGw+AAQAAJEGDAx4Y20IdjIMWGNtBCxSdW50aW1lQ2FsbAAABACVBgF0VmVjPEluc3RydWN0aW9uPFJ1bnRpbWVDYWxsPj4AAJUGAAACmQYAmQYMDHhjbQh2MixJbnN0cnVjdGlvbgQsUnVudGltZUNhbGwAAXA0V2l0aGRyYXdBc3NldAQAmQUBLE11bHRpQXNzZXRzAAAAVFJlc2VydmVBc3NldERlcG9zaXRlZAQAmQUBLE11bHRpQXNzZXRzAAEAWFJlY2VpdmVUZWxlcG9ydGVkQXNzZXQEAJkFASxNdWx0aUFzc2V0cwACADRRdWVyeVJlc3BvbnNlDAEgcXVlcnlfaWQsARxRdWVyeUlkAAEgcmVzcG9uc2W1BQEgUmVzcG9uc2UAAShtYXhfd2VpZ2h0LAEMdTY0AAMANFRyYW5zZmVyQXNzZXQIARhhc3NldHOZBQEsTXVsdGlBc3NldHMAASxiZW5lZmljaWFyeUkBATRNdWx0aUxvY2F0aW9uAAQAUFRyYW5zZmVyUmVzZXJ2ZUFzc2V0DAEYYXNzZXRzmQUBLE11bHRpQXNzZXRzAAEQZGVzdEkBATRNdWx0aUxvY2F0aW9uAAEMeGNtjQUBHFhjbTwoKT4ABQAgVHJhbnNhY3QMASxvcmlnaW5fdHlwZcUFAShPcmlnaW5LaW5kAAFYcmVxdWlyZV93ZWlnaHRfYXRfbW9zdCwBDHU2NAABEGNhbGydBgFoRG91YmxlRW5jb2RlZDxSdW50aW1lQ2FsbD4ABgBkSHJtcE5ld0NoYW5uZWxPcGVuUmVxdWVzdAwBGHNlbmRlcuwBDHUzMgABQG1heF9tZXNzYWdlX3NpemXsAQx1MzIAATBtYXhfY2FwYWNpdHnsAQx1MzIABwBMSHJtcENoYW5uZWxBY2NlcHRlZAQBJHJlY2lwaWVudOwBDHUzMgAIAEhIcm1wQ2hhbm5lbENsb3NpbmcMASRpbml0aWF0b3LsAQx1MzIAARhzZW5kZXLsAQx1MzIAASRyZWNpcGllbnTsAQx1MzIACQAsQ2xlYXJPcmlnaW4ACgA0RGVzY2VuZE9yaWdpbgQATQEBVEludGVyaW9yTXVsdGlMb2NhdGlvbgALACxSZXBvcnRFcnJvcgwBIHF1ZXJ5X2lkLAEcUXVlcnlJZAABEGRlc3RJAQE0TXVsdGlMb2NhdGlvbgABTG1heF9yZXNwb25zZV93ZWlnaHQsAQx1NjQADAAwRGVwb3NpdEFzc2V0DAEYYXNzZXRzzQUBQE11bHRpQXNzZXRGaWx0ZXIAAShtYXhfYXNzZXRz7AEMdTMyAAEsYmVuZWZpY2lhcnlJAQE0TXVsdGlMb2NhdGlvbgANAExEZXBvc2l0UmVzZXJ2ZUFzc2V0EAEYYXNzZXRzzQUBQE11bHRpQXNzZXRGaWx0ZXIAAShtYXhfYXNzZXRz7AEMdTMyAAEQZGVzdEkBATRNdWx0aUxvY2F0aW9uAAEMeGNtjQUBHFhjbTwoKT4ADgA0RXhjaGFuZ2VBc3NldAgBEGdpdmXNBQFATXVsdGlBc3NldEZpbHRlcgABHHJlY2VpdmWZBQEsTXVsdGlBc3NldHMADwBcSW5pdGlhdGVSZXNlcnZlV2l0aGRyYXcMARhhc3NldHPNBQFATXVsdGlBc3NldEZpbHRlcgABHHJlc2VydmVJAQE0TXVsdGlMb2NhdGlvbgABDHhjbY0FARxYY208KCk+ABAAQEluaXRpYXRlVGVsZXBvcnQMARhhc3NldHPNBQFATXVsdGlBc3NldEZpbHRlcgABEGRlc3RJAQE0TXVsdGlMb2NhdGlvbgABDHhjbY0FARxYY208KCk+ABEAMFF1ZXJ5SG9sZGluZxABIHF1ZXJ5X2lkLAEcUXVlcnlJZAABEGRlc3RJAQE0TXVsdGlMb2NhdGlvbgABGGFzc2V0c80FAUBNdWx0aUFzc2V0RmlsdGVyAAFMbWF4X3Jlc3BvbnNlX3dlaWdodCwBDHU2NAASADBCdXlFeGVjdXRpb24IARBmZWVzoQUBKE11bHRpQXNzZXQAATB3ZWlnaHRfbGltaXTZBQEsV2VpZ2h0TGltaXQAEwA0UmVmdW5kU3VycGx1cwAUADxTZXRFcnJvckhhbmRsZXIEAJEGAUBYY208UnVudGltZUNhbGw+ABUALFNldEFwcGVuZGl4BACRBgFAWGNtPFJ1bnRpbWVDYWxsPgAWAChDbGVhckVycm9yABcAKENsYWltQXNzZXQIARhhc3NldHOZBQEsTXVsdGlBc3NldHMAARh0aWNrZXRJAQE0TXVsdGlMb2NhdGlvbgAYABBUcmFwBAAsAQx1NjQAGQBAU3Vic2NyaWJlVmVyc2lvbggBIHF1ZXJ5X2lkLAEcUXVlcnlJZAABTG1heF9yZXNwb25zZV93ZWlnaHQsAQx1NjQAGgBIVW5zdWJzY3JpYmVWZXJzaW9uABsAAJ0GDAx4Y204ZG91YmxlX2VuY29kZWQ0RG91YmxlRW5jb2RlZAQEVAAABAEcZW5jb2RlZDgBHFZlYzx1OD4AAKEGDAx4Y20IdjMMWGNtBBBDYWxsAAAEAKUGAVhWZWM8SW5zdHJ1Y3Rpb248Q2FsbD4+AAClBgAAAqkGAKkGDAx4Y20IdjMsSW5zdHJ1Y3Rpb24EEENhbGwAAcA0V2l0aGRyYXdBc3NldAQA6QUBLE11bHRpQXNzZXRzAAAAVFJlc2VydmVBc3NldERlcG9zaXRlZAQA6QUBLE11bHRpQXNzZXRzAAEAWFJlY2VpdmVUZWxlcG9ydGVkQXNzZXQEAOkFASxNdWx0aUFzc2V0cwACADRRdWVyeVJlc3BvbnNlEAEgcXVlcnlfaWQsARxRdWVyeUlkAAEgcmVzcG9uc2X9BQEgUmVzcG9uc2UAAShtYXhfd2VpZ2h0KAEYV2VpZ2h0AAEccXVlcmllciUGAVRPcHRpb248TXVsdGlMb2NhdGlvbj4AAwA0VHJhbnNmZXJBc3NldAgBGGFzc2V0c+kFASxNdWx0aUFzc2V0cwABLGJlbmVmaWNpYXJ54AE0TXVsdGlMb2NhdGlvbgAEAFBUcmFuc2ZlclJlc2VydmVBc3NldAwBGGFzc2V0c+kFASxNdWx0aUFzc2V0cwABEGRlc3TgATRNdWx0aUxvY2F0aW9uAAEMeGNt3QUBHFhjbTwoKT4ABQAgVHJhbnNhY3QMASxvcmlnaW5fa2luZCkGAShPcmlnaW5LaW5kAAFYcmVxdWlyZV93ZWlnaHRfYXRfbW9zdCgBGFdlaWdodAABEGNhbGydBgFMRG91YmxlRW5jb2RlZDxDYWxsPgAGAGRIcm1wTmV3Q2hhbm5lbE9wZW5SZXF1ZXN0DAEYc2VuZGVy7AEMdTMyAAFAbWF4X21lc3NhZ2Vfc2l6ZewBDHUzMgABMG1heF9jYXBhY2l0eewBDHUzMgAHAExIcm1wQ2hhbm5lbEFjY2VwdGVkBAEkcmVjaXBpZW507AEMdTMyAAgASEhybXBDaGFubmVsQ2xvc2luZwwBJGluaXRpYXRvcuwBDHUzMgABGHNlbmRlcuwBDHUzMgABJHJlY2lwaWVudOwBDHUzMgAJACxDbGVhck9yaWdpbgAKADREZXNjZW5kT3JpZ2luBADkAVRJbnRlcmlvck11bHRpTG9jYXRpb24ACwAsUmVwb3J0RXJyb3IEAC0GAURRdWVyeVJlc3BvbnNlSW5mbwAMADBEZXBvc2l0QXNzZXQIARhhc3NldHMxBgFATXVsdGlBc3NldEZpbHRlcgABLGJlbmVmaWNpYXJ54AE0TXVsdGlMb2NhdGlvbgANAExEZXBvc2l0UmVzZXJ2ZUFzc2V0DAEYYXNzZXRzMQYBQE11bHRpQXNzZXRGaWx0ZXIAARBkZXN04AE0TXVsdGlMb2NhdGlvbgABDHhjbd0FARxYY208KCk+AA4ANEV4Y2hhbmdlQXNzZXQMARBnaXZlMQYBQE11bHRpQXNzZXRGaWx0ZXIAARB3YW506QUBLE11bHRpQXNzZXRzAAEcbWF4aW1hbCABEGJvb2wADwBcSW5pdGlhdGVSZXNlcnZlV2l0aGRyYXcMARhhc3NldHMxBgFATXVsdGlBc3NldEZpbHRlcgABHHJlc2VydmXgATRNdWx0aUxvY2F0aW9uAAEMeGNt3QUBHFhjbTwoKT4AEABASW5pdGlhdGVUZWxlcG9ydAwBGGFzc2V0czEGAUBNdWx0aUFzc2V0RmlsdGVyAAEQZGVzdOABNE11bHRpTG9jYXRpb24AAQx4Y23dBQEcWGNtPCgpPgARADRSZXBvcnRIb2xkaW5nCAE0cmVzcG9uc2VfaW5mby0GAURRdWVyeVJlc3BvbnNlSW5mbwABGGFzc2V0czEGAUBNdWx0aUFzc2V0RmlsdGVyABIAMEJ1eUV4ZWN1dGlvbggBEGZlZXPxBQEoTXVsdGlBc3NldAABMHdlaWdodF9saW1pdD0GASxXZWlnaHRMaW1pdAATADRSZWZ1bmRTdXJwbHVzABQAPFNldEVycm9ySGFuZGxlcgQAoQYBJFhjbTxDYWxsPgAVACxTZXRBcHBlbmRpeAQAoQYBJFhjbTxDYWxsPgAWAChDbGVhckVycm9yABcAKENsYWltQXNzZXQIARhhc3NldHPpBQEsTXVsdGlBc3NldHMAARh0aWNrZXTgATRNdWx0aUxvY2F0aW9uABgAEFRyYXAEACwBDHU2NAAZAEBTdWJzY3JpYmVWZXJzaW9uCAEgcXVlcnlfaWQsARxRdWVyeUlkAAFMbWF4X3Jlc3BvbnNlX3dlaWdodCgBGFdlaWdodAAaAEhVbnN1YnNjcmliZVZlcnNpb24AGwAkQnVybkFzc2V0BADpBQEsTXVsdGlBc3NldHMAHAAsRXhwZWN0QXNzZXQEAOkFASxNdWx0aUFzc2V0cwAdADBFeHBlY3RPcmlnaW4EACUGAVRPcHRpb248TXVsdGlMb2NhdGlvbj4AHgAsRXhwZWN0RXJyb3IEAAEGAVBPcHRpb248KHUzMiwgRXJyb3IpPgAfAFBFeHBlY3RUcmFuc2FjdFN0YXR1cwQAHQYBOE1heWJlRXJyb3JDb2RlACAALFF1ZXJ5UGFsbGV0CAEsbW9kdWxlX25hbWU4ARxWZWM8dTg+AAE0cmVzcG9uc2VfaW5mby0GAURRdWVyeVJlc3BvbnNlSW5mbwAhADBFeHBlY3RQYWxsZXQUARRpbmRleOwBDHUzMgABEG5hbWU4ARxWZWM8dTg+AAEsbW9kdWxlX25hbWU4ARxWZWM8dTg+AAEsY3JhdGVfbWFqb3LsAQx1MzIAATxtaW5fY3JhdGVfbWlub3LsAQx1MzIAIgBQUmVwb3J0VHJhbnNhY3RTdGF0dXMEAC0GAURRdWVyeVJlc3BvbnNlSW5mbwAjAExDbGVhclRyYW5zYWN0U3RhdHVzACQAPFVuaXZlcnNhbE9yaWdpbgQA6AEgSnVuY3Rpb24AJQA0RXhwb3J0TWVzc2FnZQwBHG5ldHdvcmv0ASROZXR3b3JrSWQAASxkZXN0aW5hdGlvbuQBVEludGVyaW9yTXVsdGlMb2NhdGlvbgABDHhjbd0FARxYY208KCk+ACYAJExvY2tBc3NldAgBFGFzc2V08QUBKE11bHRpQXNzZXQAASB1bmxvY2tlcuABNE11bHRpTG9jYXRpb24AJwAsVW5sb2NrQXNzZXQIARRhc3NldPEFAShNdWx0aUFzc2V0AAEYdGFyZ2V04AE0TXVsdGlMb2NhdGlvbgAoADhOb3RlVW5sb2NrYWJsZQgBFGFzc2V08QUBKE11bHRpQXNzZXQAARRvd25lcuABNE11bHRpTG9jYXRpb24AKQA0UmVxdWVzdFVubG9jawgBFGFzc2V08QUBKE11bHRpQXNzZXQAARhsb2NrZXLgATRNdWx0aUxvY2F0aW9uACoALFNldEZlZXNNb2RlBAEwaml0X3dpdGhkcmF3IAEQYm9vbAArACBTZXRUb3BpYwQABAEgW3U4OyAzMl0ALAAoQ2xlYXJUb3BpYwAtACxBbGlhc09yaWdpbgQA4AE0TXVsdGlMb2NhdGlvbgAuADxVbnBhaWRFeGVjdXRpb24IATB3ZWlnaHRfbGltaXQ9BgEsV2VpZ2h0TGltaXQAATBjaGVja19vcmlnaW4lBgFUT3B0aW9uPE11bHRpTG9jYXRpb24+AC8AAK0GDCxzdGFnaW5nX3hjbQh2NAxYY20EEENhbGwAAAQAsQYBWFZlYzxJbnN0cnVjdGlvbjxDYWxsPj4AALEGAAACtQYAtQYMLHN0YWdpbmdfeGNtCHY0LEluc3RydWN0aW9uBBBDYWxsAAHANFdpdGhkcmF3QXNzZXQEAE0GARhBc3NldHMAAABUUmVzZXJ2ZUFzc2V0RGVwb3NpdGVkBABNBgEYQXNzZXRzAAEAWFJlY2VpdmVUZWxlcG9ydGVkQXNzZXQEAE0GARhBc3NldHMAAgA0UXVlcnlSZXNwb25zZRABIHF1ZXJ5X2lkLAEcUXVlcnlJZAABIHJlc3BvbnNlYQYBIFJlc3BvbnNlAAEobWF4X3dlaWdodCgBGFdlaWdodAABHHF1ZXJpZXJ1BgFAT3B0aW9uPExvY2F0aW9uPgADADRUcmFuc2ZlckFzc2V0CAEYYXNzZXRzTQYBGEFzc2V0cwABLGJlbmVmaWNpYXJ5DQEBIExvY2F0aW9uAAQAUFRyYW5zZmVyUmVzZXJ2ZUFzc2V0DAEYYXNzZXRzTQYBGEFzc2V0cwABEGRlc3QNAQEgTG9jYXRpb24AAQx4Y21BBgEcWGNtPCgpPgAFACBUcmFuc2FjdAwBLG9yaWdpbl9raW5kKQYBKE9yaWdpbktpbmQAAVhyZXF1aXJlX3dlaWdodF9hdF9tb3N0KAEYV2VpZ2h0AAEQY2FsbJ0GAUxEb3VibGVFbmNvZGVkPENhbGw+AAYAZEhybXBOZXdDaGFubmVsT3BlblJlcXVlc3QMARhzZW5kZXLsAQx1MzIAAUBtYXhfbWVzc2FnZV9zaXpl7AEMdTMyAAEwbWF4X2NhcGFjaXR57AEMdTMyAAcATEhybXBDaGFubmVsQWNjZXB0ZWQEASRyZWNpcGllbnTsAQx1MzIACABISHJtcENoYW5uZWxDbG9zaW5nDAEkaW5pdGlhdG9y7AEMdTMyAAEYc2VuZGVy7AEMdTMyAAEkcmVjaXBpZW507AEMdTMyAAkALENsZWFyT3JpZ2luAAoANERlc2NlbmRPcmlnaW4EABEBAUBJbnRlcmlvckxvY2F0aW9uAAsALFJlcG9ydEVycm9yBAB5BgFEUXVlcnlSZXNwb25zZUluZm8ADAAwRGVwb3NpdEFzc2V0CAEYYXNzZXRzfQYBLEFzc2V0RmlsdGVyAAEsYmVuZWZpY2lhcnkNAQEgTG9jYXRpb24ADQBMRGVwb3NpdFJlc2VydmVBc3NldAwBGGFzc2V0c30GASxBc3NldEZpbHRlcgABEGRlc3QNAQEgTG9jYXRpb24AAQx4Y21BBgEcWGNtPCgpPgAOADRFeGNoYW5nZUFzc2V0DAEQZ2l2ZX0GASxBc3NldEZpbHRlcgABEHdhbnRNBgEYQXNzZXRzAAEcbWF4aW1hbCABEGJvb2wADwBcSW5pdGlhdGVSZXNlcnZlV2l0aGRyYXcMARhhc3NldHN9BgEsQXNzZXRGaWx0ZXIAARxyZXNlcnZlDQEBIExvY2F0aW9uAAEMeGNtQQYBHFhjbTwoKT4AEABASW5pdGlhdGVUZWxlcG9ydAwBGGFzc2V0c30GASxBc3NldEZpbHRlcgABEGRlc3QNAQEgTG9jYXRpb24AAQx4Y21BBgEcWGNtPCgpPgARADRSZXBvcnRIb2xkaW5nCAE0cmVzcG9uc2VfaW5mb3kGAURRdWVyeVJlc3BvbnNlSW5mbwABGGFzc2V0c30GASxBc3NldEZpbHRlcgASADBCdXlFeGVjdXRpb24IARBmZWVzVQYBFEFzc2V0AAEwd2VpZ2h0X2xpbWl0PQYBLFdlaWdodExpbWl0ABMANFJlZnVuZFN1cnBsdXMAFAA8U2V0RXJyb3JIYW5kbGVyBACtBgEkWGNtPENhbGw+ABUALFNldEFwcGVuZGl4BACtBgEkWGNtPENhbGw+ABYAKENsZWFyRXJyb3IAFwAoQ2xhaW1Bc3NldAgBGGFzc2V0c00GARhBc3NldHMAARh0aWNrZXQNAQEgTG9jYXRpb24AGAAQVHJhcAQALAEMdTY0ABkAQFN1YnNjcmliZVZlcnNpb24IASBxdWVyeV9pZCwBHFF1ZXJ5SWQAAUxtYXhfcmVzcG9uc2Vfd2VpZ2h0KAEYV2VpZ2h0ABoASFVuc3Vic2NyaWJlVmVyc2lvbgAbACRCdXJuQXNzZXQEAE0GARhBc3NldHMAHAAsRXhwZWN0QXNzZXQEAE0GARhBc3NldHMAHQAwRXhwZWN0T3JpZ2luBAB1BgFAT3B0aW9uPExvY2F0aW9uPgAeACxFeHBlY3RFcnJvcgQAAQYBUE9wdGlvbjwodTMyLCBFcnJvcik+AB8AUEV4cGVjdFRyYW5zYWN0U3RhdHVzBAAdBgE4TWF5YmVFcnJvckNvZGUAIAAsUXVlcnlQYWxsZXQIASxtb2R1bGVfbmFtZTgBHFZlYzx1OD4AATRyZXNwb25zZV9pbmZveQYBRFF1ZXJ5UmVzcG9uc2VJbmZvACEAMEV4cGVjdFBhbGxldBQBFGluZGV47AEMdTMyAAEQbmFtZTgBHFZlYzx1OD4AASxtb2R1bGVfbmFtZTgBHFZlYzx1OD4AASxjcmF0ZV9tYWpvcuwBDHUzMgABPG1pbl9jcmF0ZV9taW5vcuwBDHUzMgAiAFBSZXBvcnRUcmFuc2FjdFN0YXR1cwQAeQYBRFF1ZXJ5UmVzcG9uc2VJbmZvACMATENsZWFyVHJhbnNhY3RTdGF0dXMAJAA8VW5pdmVyc2FsT3JpZ2luBAAZAQEgSnVuY3Rpb24AJQA0RXhwb3J0TWVzc2FnZQwBHG5ldHdvcmshAQEkTmV0d29ya0lkAAEsZGVzdGluYXRpb24RAQFASW50ZXJpb3JMb2NhdGlvbgABDHhjbUEGARxYY208KCk+ACYAJExvY2tBc3NldAgBFGFzc2V0VQYBFEFzc2V0AAEgdW5sb2NrZXINAQEgTG9jYXRpb24AJwAsVW5sb2NrQXNzZXQIARRhc3NldFUGARRBc3NldAABGHRhcmdldA0BASBMb2NhdGlvbgAoADhOb3RlVW5sb2NrYWJsZQgBFGFzc2V0VQYBFEFzc2V0AAEUb3duZXINAQEgTG9jYXRpb24AKQA0UmVxdWVzdFVubG9jawgBFGFzc2V0VQYBFEFzc2V0AAEYbG9ja2VyDQEBIExvY2F0aW9uACoALFNldEZlZXNNb2RlBAEwaml0X3dpdGhkcmF3IAEQYm9vbAArACBTZXRUb3BpYwQABAEgW3U4OyAzMl0ALAAoQ2xlYXJUb3BpYwAtACxBbGlhc09yaWdpbgQADQEBIExvY2F0aW9uAC4APFVucGFpZEV4ZWN1dGlvbggBMHdlaWdodF9saW1pdD0GASxXZWlnaHRMaW1pdAABMGNoZWNrX29yaWdpbnUGAUBPcHRpb248TG9jYXRpb24+AC8AALkGEFBzdGFnaW5nX3hjbV9leGVjdXRvchh0cmFpdHM4YXNzZXRfdHJhbnNmZXIwVHJhbnNmZXJUeXBlAAEQIFRlbGVwb3J0AAAAMExvY2FsUmVzZXJ2ZQABAEhEZXN0aW5hdGlvblJlc2VydmUAAgA0UmVtb3RlUmVzZXJ2ZQQARQEBRFZlcnNpb25lZExvY2F0aW9uAAMAAL0GCAx4Y21AVmVyc2lvbmVkQXNzZXRJZAABCAhWMwQACQEBLHYzOjpBc3NldElkAAMACFY0BABBAQEsdjQ6OkFzc2V0SWQABAAAwQYMUHBhbGxldF9tZXNzYWdlX3F1ZXVlGHBhbGxldBBDYWxsBARUAAEIJHJlYXBfcGFnZQgBOG1lc3NhZ2Vfb3JpZ2luxQYBSE1lc3NhZ2VPcmlnaW5PZjxUPgABKHBhZ2VfaW5kZXgQASRQYWdlSW5kZXgAAAQ9AVJlbW92ZSBhIHBhZ2Ugd2hpY2ggaGFzIG5vIG1vcmUgbWVzc2FnZXMgcmVtYWluaW5nIHRvIGJlIHByb2Nlc3NlZCBvciBpcyBzdGFsZS5IZXhlY3V0ZV9vdmVyd2VpZ2h0EAE4bWVzc2FnZV9vcmlnaW7FBgFITWVzc2FnZU9yaWdpbk9mPFQ+AAEQcGFnZRABJFBhZ2VJbmRleAABFGluZGV4EAEcVDo6U2l6ZQABMHdlaWdodF9saW1pdCgBGFdlaWdodAABNHhFeGVjdXRlIGFuIG92ZXJ3ZWlnaHQgbWVzc2FnZS4ATQFUZW1wb3JhcnkgcHJvY2Vzc2luZyBlcnJvcnMgd2lsbCBiZSBwcm9wYWdhdGVkIHdoZXJlYXMgcGVybWFuZW50IGVycm9ycyBhcmUgdHJlYXRlZFRhcyBzdWNjZXNzIGNvbmRpdGlvbi4AdC0gYG9yaWdpbmA6IE11c3QgYmUgYFNpZ25lZGAuNQEtIGBtZXNzYWdlX29yaWdpbmA6IFRoZSBvcmlnaW4gZnJvbSB3aGljaCB0aGUgbWVzc2FnZSB0byBiZSBleGVjdXRlZCBhcnJpdmVkLj0BLSBgcGFnZWA6IFRoZSBwYWdlIGluIHRoZSBxdWV1ZSBpbiB3aGljaCB0aGUgbWVzc2FnZSB0byBiZSBleGVjdXRlZCBpcyBzaXR0aW5nLgkBLSBgaW5kZXhgOiBUaGUgaW5kZXggaW50byB0aGUgcXVldWUgb2YgdGhlIG1lc3NhZ2UgdG8gYmUgZXhlY3V0ZWQuWQEtIGB3ZWlnaHRfbGltaXRgOiBUaGUgbWF4aW11bSBhbW91bnQgb2Ygd2VpZ2h0IGFsbG93ZWQgdG8gYmUgY29uc3VtZWQgaW4gdGhlIGV4ZWN1dGlvbkQgIG9mIHRoZSBtZXNzYWdlLgD0QmVuY2htYXJrIGNvbXBsZXhpdHkgY29uc2lkZXJhdGlvbnM6IE8oaW5kZXggKyB3ZWlnaHRfbGltaXQpLgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy7FBgxscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zJGluY2x1c2lvblhBZ2dyZWdhdGVNZXNzYWdlT3JpZ2luAAEEDFVtcAQAyQYBKFVtcFF1ZXVlSWQAAAAAyQYMbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucyRpbmNsdXNpb24oVW1wUXVldWVJZAABBBBQYXJhBACNAgEYUGFyYUlkAAAAAM0GDERwYWxsZXRfYXNzZXRfcmF0ZRhwYWxsZXQQQ2FsbAQEVAABDBhjcmVhdGUIAShhc3NldF9raW5k3AFEQm94PFQ6OkFzc2V0S2luZD4AARByYXRl0QYBJEZpeGVkVTEyOAAAEA0BSW5pdGlhbGl6ZSBhIGNvbnZlcnNpb24gcmF0ZSB0byBuYXRpdmUgYmFsYW5jZSBmb3IgdGhlIGdpdmVuIGFzc2V0LgA0IyMgQ29tcGxleGl0eRgtIE8oMSkYdXBkYXRlCAEoYXNzZXRfa2luZNwBREJveDxUOjpBc3NldEtpbmQ+AAEQcmF0ZdEGASRGaXhlZFUxMjgAARAFAVVwZGF0ZSB0aGUgY29udmVyc2lvbiByYXRlIHRvIG5hdGl2ZSBiYWxhbmNlIGZvciB0aGUgZ2l2ZW4gYXNzZXQuADQjIyBDb21wbGV4aXR5GC0gTygxKRhyZW1vdmUEAShhc3NldF9raW5k3AFEQm94PFQ6OkFzc2V0S2luZD4AAhAlAVJlbW92ZSBhbiBleGlzdGluZyBjb252ZXJzaW9uIHJhdGUgdG8gbmF0aXZlIGJhbGFuY2UgZm9yIHRoZSBnaXZlbiBhc3NldC4ANCMjIENvbXBsZXhpdHkYLSBPKDEpBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLtEGDDRzcF9hcml0aG1ldGljLGZpeGVkX3BvaW50JEZpeGVkVTEyOAAABAAYARB1MTI4AADVBgwwcGFsbGV0X2JlZWZ5GHBhbGxldBBDYWxsBARUAAEMTHJlcG9ydF9lcXVpdm9jYXRpb24IAUhlcXVpdm9jYXRpb25fcHJvb2bZBgGNAUJveDxEb3VibGVWb3RpbmdQcm9vZjxCbG9ja051bWJlckZvcjxUPiwgVDo6QmVlZnlJZCw8VDo6QmVlZnlJZAphcyBSdW50aW1lQXBwUHVibGljPjo6U2lnbmF0dXJlLD4sPgABPGtleV9vd25lcl9wcm9vZq0BAUBUOjpLZXlPd25lclByb29mAAAQCQFSZXBvcnQgdm90ZXIgZXF1aXZvY2F0aW9uL21pc2JlaGF2aW9yLiBUaGlzIG1ldGhvZCB3aWxsIHZlcmlmeSB0aGX0ZXF1aXZvY2F0aW9uIHByb29mIGFuZCB2YWxpZGF0ZSB0aGUgZ2l2ZW4ga2V5IG93bmVyc2hpcCBwcm9vZvhhZ2FpbnN0IHRoZSBleHRyYWN0ZWQgb2ZmZW5kZXIuIElmIGJvdGggYXJlIHZhbGlkLCB0aGUgb2ZmZW5jZUR3aWxsIGJlIHJlcG9ydGVkLnByZXBvcnRfZXF1aXZvY2F0aW9uX3Vuc2lnbmVkCAFIZXF1aXZvY2F0aW9uX3Byb29m2QYBjQFCb3g8RG91YmxlVm90aW5nUHJvb2Y8QmxvY2tOdW1iZXJGb3I8VD4sIFQ6OkJlZWZ5SWQsPFQ6OkJlZWZ5SWQKYXMgUnVudGltZUFwcFB1YmxpYz46OlNpZ25hdHVyZSw+LD4AATxrZXlfb3duZXJfcHJvb2atAQFAVDo6S2V5T3duZXJQcm9vZgABJAkBUmVwb3J0IHZvdGVyIGVxdWl2b2NhdGlvbi9taXNiZWhhdmlvci4gVGhpcyBtZXRob2Qgd2lsbCB2ZXJpZnkgdGhl9GVxdWl2b2NhdGlvbiBwcm9vZiBhbmQgdmFsaWRhdGUgdGhlIGdpdmVuIGtleSBvd25lcnNoaXAgcHJvb2b4YWdhaW5zdCB0aGUgZXh0cmFjdGVkIG9mZmVuZGVyLiBJZiBib3RoIGFyZSB2YWxpZCwgdGhlIG9mZmVuY2VEd2lsbCBiZSByZXBvcnRlZC4ADQFUaGlzIGV4dHJpbnNpYyBtdXN0IGJlIGNhbGxlZCB1bnNpZ25lZCBhbmQgaXQgaXMgZXhwZWN0ZWQgdGhhdCBvbmx5FQFibG9jayBhdXRob3JzIHdpbGwgY2FsbCBpdCAodmFsaWRhdGVkIGluIGBWYWxpZGF0ZVVuc2lnbmVkYCksIGFzIHN1Y2gVAWlmIHRoZSBibG9jayBhdXRob3IgaXMgZGVmaW5lZCBpdCB3aWxsIGJlIGRlZmluZWQgYXMgdGhlIGVxdWl2b2NhdGlvbiRyZXBvcnRlci48c2V0X25ld19nZW5lc2lzBAE8ZGVsYXlfaW5fYmxvY2tzEAFEQmxvY2tOdW1iZXJGb3I8VD4AAhBdAVJlc2V0IEJFRUZZIGNvbnNlbnN1cyBieSBzZXR0aW5nIGEgbmV3IEJFRUZZIGdlbmVzaXMgYXQgYGRlbGF5X2luX2Jsb2Nrc2AgYmxvY2tzIGluIHRoZRxmdXR1cmUuALROb3RlOiBgZGVsYXlfaW5fYmxvY2tzYCBoYXMgdG8gYmUgYXQgbGVhc3QgMS4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMu2QYISHNwX2NvbnNlbnN1c19iZWVmeUREb3VibGVWb3RpbmdQcm9vZgwYTnVtYmVyARAISWQBKQIkU2lnbmF0dXJlAd0GAAgBFGZpcnN04QYBiFZvdGVNZXNzYWdlPE51bWJlciwgSWQsIFNpZ25hdHVyZT4AARhzZWNvbmThBgGIVm90ZU1lc3NhZ2U8TnVtYmVyLCBJZCwgU2lnbmF0dXJlPgAA3QYMSHNwX2NvbnNlbnN1c19iZWVmeTBlY2RzYV9jcnlwdG8kU2lnbmF0dXJlAAAEANkCAUBlY2RzYTo6U2lnbmF0dXJlAADhBghIc3BfY29uc2Vuc3VzX2JlZWZ5LFZvdGVNZXNzYWdlDBhOdW1iZXIBEAhJZAEpAiRTaWduYXR1cmUB3QYADAEoY29tbWl0bWVudOUGAUhDb21taXRtZW50PE51bWJlcj4AAQhpZCkCAQhJZAABJHNpZ25hdHVyZd0GASRTaWduYXR1cmUAAOUGDEhzcF9jb25zZW5zdXNfYmVlZnkoY29tbWl0bWVudChDb21taXRtZW50BDBUQmxvY2tOdW1iZXIBEAAMARxwYXlsb2Fk6QYBHFBheWxvYWQAATBibG9ja19udW1iZXIQATBUQmxvY2tOdW1iZXIAAUB2YWxpZGF0b3Jfc2V0X2lkMAE4VmFsaWRhdG9yU2V0SWQAAOkGDEhzcF9jb25zZW5zdXNfYmVlZnkccGF5bG9hZBxQYXlsb2FkAAAEAO0GAXhWZWM8KEJlZWZ5UGF5bG9hZElkLCBWZWM8dTg+KT4AAO0GAAAC8QYA8QYAAAQI9QY4APUGAAADAgAAAAgA+QYMKHNwX3J1bnRpbWUYdHJhaXRzLEJsYWtlVHdvMjU2AAAAAP0GDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBCARTAAAEADgBGFZlYzxUPgAAAQcMYHBhbGxldF9jb252aWN0aW9uX3ZvdGluZxR0eXBlcxRUYWxseQgUVm90ZXMBGBRUb3RhbAAADAEQYXllcxgBFFZvdGVzAAEQbmF5cxgBFFZvdGVzAAEcc3VwcG9ydBgBFFZvdGVzAAAFBwxAcGFsbGV0X3doaXRlbGlzdBhwYWxsZXQURXZlbnQEBFQAAQw8Q2FsbFdoaXRlbGlzdGVkBAEkY2FsbF9oYXNoNAEcVDo6SGFzaAAAAFhXaGl0ZWxpc3RlZENhbGxSZW1vdmVkBAEkY2FsbF9oYXNoNAEcVDo6SGFzaAABAGRXaGl0ZWxpc3RlZENhbGxEaXNwYXRjaGVkCAEkY2FsbF9oYXNoNAEcVDo6SGFzaAABGHJlc3VsdAkHAWhEaXNwYXRjaFJlc3VsdFdpdGhQb3N0SW5mbwACAAR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldAkHBBhSZXN1bHQIBFQBDQcERQEVBwEICE9rBAANBwAAAAAMRXJyBAAVBwAAAQAADQcMNGZyYW1lX3N1cHBvcnQgZGlzcGF0Y2hAUG9zdERpc3BhdGNoSW5mbwAACAE0YWN0dWFsX3dlaWdodBEHAThPcHRpb248V2VpZ2h0PgABIHBheXNfZmVlZAEQUGF5cwAAEQcEGE9wdGlvbgQEVAEoAQgQTm9uZQAAABBTb21lBAAoAAABAAAVBwgoc3BfcnVudGltZWREaXNwYXRjaEVycm9yV2l0aFBvc3RJbmZvBBBJbmZvAQ0HAAgBJHBvc3RfaW5mbw0HARBJbmZvAAEUZXJyb3JoATREaXNwYXRjaEVycm9yAAAZBwxEcGFsbGV0X3BhcmFtZXRlcnMYcGFsbGV0FEV2ZW50BARUAAEEHFVwZGF0ZWQMAQxrZXkdBwHEPFQ6OlJ1bnRpbWVQYXJhbWV0ZXJzIGFzIEFnZ3JlZ2F0ZWRLZXlWYWx1ZT46OktleQRkVGhlIGtleSB0aGF0IHdhcyB1cGRhdGVkLgEkb2xkX3ZhbHVlJQcB7E9wdGlvbjw8VDo6UnVudGltZVBhcmFtZXRlcnMgYXMgQWdncmVnYXRlZEtleVZhbHVlPjo6VmFsdWU+BHxUaGUgb2xkIHZhbHVlIGJlZm9yZSB0aGlzIGNhbGwuASRuZXdfdmFsdWUlBwHsT3B0aW9uPDxUOjpSdW50aW1lUGFyYW1ldGVycyBhcyBBZ2dyZWdhdGVkS2V5VmFsdWU+OjpWYWx1ZT4EeFRoZSBuZXcgdmFsdWUgYWZ0ZXIgdGhpcyBjYWxsLgAMUEEgUGFyYW1ldGVyIHdhcyBzZXQuALxJcyBhbHNvIGVtaXR0ZWQgd2hlbiB0aGUgdmFsdWUgd2FzIG5vdCBjaGFuZ2VkLgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldB0HCEBwb2xrYWRvdF9ydW50aW1lUFJ1bnRpbWVQYXJhbWV0ZXJzS2V5AAEEJEluZmxhdGlvbgQAIQcBqQE8ZHluYW1pY19wYXJhbXM6OmluZmxhdGlvbjo6UGFyYW1ldGVycyBhcyBmcmFtZV9zdXBwb3J0Ojp0cmFpdHM6OgpkeW5hbWljX3BhcmFtczo6QWdncmVnYXRlZEtleVZhbHVlPjo6S2V5AAAAACEHEEBwb2xrYWRvdF9ydW50aW1lOGR5bmFtaWNfcGFyYW1zJGluZmxhdGlvbjRQYXJhbWV0ZXJzS2V5AAEUME1pbkluZmxhdGlvbgQAsQIBME1pbkluZmxhdGlvbgAAADBNYXhJbmZsYXRpb24EAL0CATBNYXhJbmZsYXRpb24AAQAoSWRlYWxTdGFrZQQAwQIBKElkZWFsU3Rha2UAAgAcRmFsbG9mZgQAxQIBHEZhbGxvZmYAAwA8VXNlQXVjdGlvblNsb3RzBADJAgE8VXNlQXVjdGlvblNsb3RzAAQAACUHBBhPcHRpb24EBFQBKQcBCBBOb25lAAAAEFNvbWUEACkHAAABAAApBwhAcG9sa2Fkb3RfcnVudGltZVhSdW50aW1lUGFyYW1ldGVyc1ZhbHVlAAEEJEluZmxhdGlvbgQALQcBsQE8ZHluYW1pY19wYXJhbXM6OmluZmxhdGlvbjo6UGFyYW1ldGVycyBhcyBmcmFtZV9zdXBwb3J0Ojp0cmFpdHM6OgpkeW5hbWljX3BhcmFtczo6QWdncmVnYXRlZEtleVZhbHVlPjo6VmFsdWUAAAAALQcQQHBvbGthZG90X3J1bnRpbWU4ZHluYW1pY19wYXJhbXMkaW5mbGF0aW9uPFBhcmFtZXRlcnNWYWx1ZQABFDBNaW5JbmZsYXRpb24EALkCASxQZXJxdWludGlsbAAAADBNYXhJbmZsYXRpb24EALkCASxQZXJxdWludGlsbAABAChJZGVhbFN0YWtlBAC5AgEsUGVycXVpbnRpbGwAAgAcRmFsbG9mZgQAuQIBLFBlcnF1aW50aWxsAAMAPFVzZUF1Y3Rpb25TbG90cwQAIAEQYm9vbAAEAAAxBxBccG9sa2Fkb3RfcnVudGltZV9jb21tb24YY2xhaW1zGHBhbGxldBRFdmVudAQEVAABBBxDbGFpbWVkDAEMd2hvAAEwVDo6QWNjb3VudElkAAFAZXRoZXJldW1fYWRkcmVzc90CATxFdGhlcmV1bUFkZHJlc3MAARhhbW91bnQYATBCYWxhbmNlT2Y8VD4AAARoU29tZW9uZSBjbGFpbWVkIHNvbWUgRE9Ucy4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXQ1Bww4cGFsbGV0X3Zlc3RpbmcYcGFsbGV0FEV2ZW50BARUAAEIOFZlc3RpbmdVcGRhdGVkCAEcYWNjb3VudAABMFQ6OkFjY291bnRJZAABIHVudmVzdGVkGAEwQmFsYW5jZU9mPFQ+AAAIUQFUaGUgYW1vdW50IHZlc3RlZCBoYXMgYmVlbiB1cGRhdGVkLiBUaGlzIGNvdWxkIGluZGljYXRlIGEgY2hhbmdlIGluIGZ1bmRzIGF2YWlsYWJsZS4lAVRoZSBiYWxhbmNlIGdpdmVuIGlzIHRoZSBhbW91bnQgd2hpY2ggaXMgbGVmdCB1bnZlc3RlZCAoYW5kIHRodXMgbG9ja2VkKS5AVmVzdGluZ0NvbXBsZXRlZAQBHGFjY291bnQAATBUOjpBY2NvdW50SWQAAQScQW4gXFthY2NvdW50XF0gaGFzIGJlY29tZSBmdWxseSB2ZXN0ZWQuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0OQcMOHBhbGxldF91dGlsaXR5GHBhbGxldBRFdmVudAABGEBCYXRjaEludGVycnVwdGVkCAEUaW5kZXgQAQx1MzIAARRlcnJvcmgBNERpc3BhdGNoRXJyb3IAAAhVAUJhdGNoIG9mIGRpc3BhdGNoZXMgZGlkIG5vdCBjb21wbGV0ZSBmdWxseS4gSW5kZXggb2YgZmlyc3QgZmFpbGluZyBkaXNwYXRjaCBnaXZlbiwgYXNId2VsbCBhcyB0aGUgZXJyb3IuOEJhdGNoQ29tcGxldGVkAAEEyEJhdGNoIG9mIGRpc3BhdGNoZXMgY29tcGxldGVkIGZ1bGx5IHdpdGggbm8gZXJyb3IuYEJhdGNoQ29tcGxldGVkV2l0aEVycm9ycwACBLRCYXRjaCBvZiBkaXNwYXRjaGVzIGNvbXBsZXRlZCBidXQgaGFzIGVycm9ycy40SXRlbUNvbXBsZXRlZAADBB0BQSBzaW5nbGUgaXRlbSB3aXRoaW4gYSBCYXRjaCBvZiBkaXNwYXRjaGVzIGhhcyBjb21wbGV0ZWQgd2l0aCBubyBlcnJvci4oSXRlbUZhaWxlZAQBFGVycm9yaAE0RGlzcGF0Y2hFcnJvcgAEBBEBQSBzaW5nbGUgaXRlbSB3aXRoaW4gYSBCYXRjaCBvZiBkaXNwYXRjaGVzIGhhcyBjb21wbGV0ZWQgd2l0aCBlcnJvci4wRGlzcGF0Y2hlZEFzBAEYcmVzdWx0iAE4RGlzcGF0Y2hSZXN1bHQABQRYQSBjYWxsIHdhcyBkaXNwYXRjaGVkLgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldD0HDDBwYWxsZXRfcHJveHkYcGFsbGV0FEV2ZW50BARUAAEUNFByb3h5RXhlY3V0ZWQEARhyZXN1bHSIAThEaXNwYXRjaFJlc3VsdAAABLxBIHByb3h5IHdhcyBleGVjdXRlZCBjb3JyZWN0bHksIHdpdGggdGhlIGdpdmVuLixQdXJlQ3JlYXRlZBABEHB1cmUAATBUOjpBY2NvdW50SWQAAQx3aG8AATBUOjpBY2NvdW50SWQAAShwcm94eV90eXBlCQMBMFQ6OlByb3h5VHlwZQABUGRpc2FtYmlndWF0aW9uX2luZGV4bQEBDHUxNgABCNxBIHB1cmUgYWNjb3VudCBoYXMgYmVlbiBjcmVhdGVkIGJ5IG5ldyBwcm94eSB3aXRoIGdpdmVukGRpc2FtYmlndWF0aW9uIGluZGV4IGFuZCBwcm94eSB0eXBlLiRBbm5vdW5jZWQMARByZWFsAAEwVDo6QWNjb3VudElkAAEUcHJveHkAATBUOjpBY2NvdW50SWQAASRjYWxsX2hhc2g0ATRDYWxsSGFzaE9mPFQ+AAIE4EFuIGFubm91bmNlbWVudCB3YXMgcGxhY2VkIHRvIG1ha2UgYSBjYWxsIGluIHRoZSBmdXR1cmUuKFByb3h5QWRkZWQQASRkZWxlZ2F0b3IAATBUOjpBY2NvdW50SWQAASRkZWxlZ2F0ZWUAATBUOjpBY2NvdW50SWQAAShwcm94eV90eXBlCQMBMFQ6OlByb3h5VHlwZQABFGRlbGF5EAFEQmxvY2tOdW1iZXJGb3I8VD4AAwRIQSBwcm94eSB3YXMgYWRkZWQuMFByb3h5UmVtb3ZlZBABJGRlbGVnYXRvcgABMFQ6OkFjY291bnRJZAABJGRlbGVnYXRlZQABMFQ6OkFjY291bnRJZAABKHByb3h5X3R5cGUJAwEwVDo6UHJveHlUeXBlAAEUZGVsYXkQAURCbG9ja051bWJlckZvcjxUPgAEBFBBIHByb3h5IHdhcyByZW1vdmVkLgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldEEHDDxwYWxsZXRfbXVsdGlzaWcYcGFsbGV0FEV2ZW50BARUAAEQLE5ld011bHRpc2lnDAEkYXBwcm92aW5nAAEwVDo6QWNjb3VudElkAAEgbXVsdGlzaWcAATBUOjpBY2NvdW50SWQAASRjYWxsX2hhc2gEASBDYWxsSGFzaAAABIxBIG5ldyBtdWx0aXNpZyBvcGVyYXRpb24gaGFzIGJlZ3VuLkBNdWx0aXNpZ0FwcHJvdmFsEAEkYXBwcm92aW5nAAEwVDo6QWNjb3VudElkAAEkdGltZXBvaW50FQMBcFRpbWVwb2ludDxCbG9ja051bWJlckZvcjxUPj4AASBtdWx0aXNpZwABMFQ6OkFjY291bnRJZAABJGNhbGxfaGFzaAQBIENhbGxIYXNoAAEEyEEgbXVsdGlzaWcgb3BlcmF0aW9uIGhhcyBiZWVuIGFwcHJvdmVkIGJ5IHNvbWVvbmUuQE11bHRpc2lnRXhlY3V0ZWQUASRhcHByb3ZpbmcAATBUOjpBY2NvdW50SWQAASR0aW1lcG9pbnQVAwFwVGltZXBvaW50PEJsb2NrTnVtYmVyRm9yPFQ+PgABIG11bHRpc2lnAAEwVDo6QWNjb3VudElkAAEkY2FsbF9oYXNoBAEgQ2FsbEhhc2gAARhyZXN1bHSIAThEaXNwYXRjaFJlc3VsdAACBJxBIG11bHRpc2lnIG9wZXJhdGlvbiBoYXMgYmVlbiBleGVjdXRlZC5ETXVsdGlzaWdDYW5jZWxsZWQQAShjYW5jZWxsaW5nAAEwVDo6QWNjb3VudElkAAEkdGltZXBvaW50FQMBcFRpbWVwb2ludDxCbG9ja051bWJlckZvcjxUPj4AASBtdWx0aXNpZwABMFQ6OkFjY291bnRJZAABJGNhbGxfaGFzaAQBIENhbGxIYXNoAAMEoEEgbXVsdGlzaWcgb3BlcmF0aW9uIGhhcyBiZWVuIGNhbmNlbGxlZC4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXRFBww8cGFsbGV0X2JvdW50aWVzGHBhbGxldBRFdmVudAgEVAAESQABLDhCb3VudHlQcm9wb3NlZAQBFGluZGV4EAEsQm91bnR5SW5kZXgAAARQTmV3IGJvdW50eSBwcm9wb3NhbC44Qm91bnR5UmVqZWN0ZWQIARRpbmRleBABLEJvdW50eUluZGV4AAEQYm9uZBgBPEJhbGFuY2VPZjxULCBJPgABBMxBIGJvdW50eSBwcm9wb3NhbCB3YXMgcmVqZWN0ZWQ7IGZ1bmRzIHdlcmUgc2xhc2hlZC5IQm91bnR5QmVjYW1lQWN0aXZlBAEUaW5kZXgQASxCb3VudHlJbmRleAACBLhBIGJvdW50eSBwcm9wb3NhbCBpcyBmdW5kZWQgYW5kIGJlY2FtZSBhY3RpdmUuNEJvdW50eUF3YXJkZWQIARRpbmRleBABLEJvdW50eUluZGV4AAEsYmVuZWZpY2lhcnkAATBUOjpBY2NvdW50SWQAAwSUQSBib3VudHkgaXMgYXdhcmRlZCB0byBhIGJlbmVmaWNpYXJ5LjRCb3VudHlDbGFpbWVkDAEUaW5kZXgQASxCb3VudHlJbmRleAABGHBheW91dBgBPEJhbGFuY2VPZjxULCBJPgABLGJlbmVmaWNpYXJ5AAEwVDo6QWNjb3VudElkAAQEjEEgYm91bnR5IGlzIGNsYWltZWQgYnkgYmVuZWZpY2lhcnkuOEJvdW50eUNhbmNlbGVkBAEUaW5kZXgQASxCb3VudHlJbmRleAAFBFhBIGJvdW50eSBpcyBjYW5jZWxsZWQuOEJvdW50eUV4dGVuZGVkBAEUaW5kZXgQASxCb3VudHlJbmRleAAGBHBBIGJvdW50eSBleHBpcnkgaXMgZXh0ZW5kZWQuOEJvdW50eUFwcHJvdmVkBAEUaW5kZXgQASxCb3VudHlJbmRleAAHBFRBIGJvdW50eSBpcyBhcHByb3ZlZC48Q3VyYXRvclByb3Bvc2VkCAEkYm91bnR5X2lkEAEsQm91bnR5SW5kZXgAARxjdXJhdG9yAAEwVDo6QWNjb3VudElkAAgEdEEgYm91bnR5IGN1cmF0b3IgaXMgcHJvcG9zZWQuREN1cmF0b3JVbmFzc2lnbmVkBAEkYm91bnR5X2lkEAEsQm91bnR5SW5kZXgACQR8QSBib3VudHkgY3VyYXRvciBpcyB1bmFzc2lnbmVkLjxDdXJhdG9yQWNjZXB0ZWQIASRib3VudHlfaWQQASxCb3VudHlJbmRleAABHGN1cmF0b3IAATBUOjpBY2NvdW50SWQACgR0QSBib3VudHkgY3VyYXRvciBpcyBhY2NlcHRlZC4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXRJBwxUcGFsbGV0X2NoaWxkX2JvdW50aWVzGHBhbGxldBRFdmVudAQEVAABEBRBZGRlZAgBFGluZGV4EAEsQm91bnR5SW5kZXgAASxjaGlsZF9pbmRleBABLEJvdW50eUluZGV4AAAEYEEgY2hpbGQtYm91bnR5IGlzIGFkZGVkLhxBd2FyZGVkDAEUaW5kZXgQASxCb3VudHlJbmRleAABLGNoaWxkX2luZGV4EAEsQm91bnR5SW5kZXgAASxiZW5lZmljaWFyeQABMFQ6OkFjY291bnRJZAABBKxBIGNoaWxkLWJvdW50eSBpcyBhd2FyZGVkIHRvIGEgYmVuZWZpY2lhcnkuHENsYWltZWQQARRpbmRleBABLEJvdW50eUluZGV4AAEsY2hpbGRfaW5kZXgQASxCb3VudHlJbmRleAABGHBheW91dBgBMEJhbGFuY2VPZjxUPgABLGJlbmVmaWNpYXJ5AAEwVDo6QWNjb3VudElkAAIEpEEgY2hpbGQtYm91bnR5IGlzIGNsYWltZWQgYnkgYmVuZWZpY2lhcnkuIENhbmNlbGVkCAEUaW5kZXgQASxCb3VudHlJbmRleAABLGNoaWxkX2luZGV4EAEsQm91bnR5SW5kZXgAAwRwQSBjaGlsZC1ib3VudHkgaXMgY2FuY2VsbGVkLgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldE0HDJBwYWxsZXRfZWxlY3Rpb25fcHJvdmlkZXJfbXVsdGlfcGhhc2UYcGFsbGV0FEV2ZW50BARUAAEYOFNvbHV0aW9uU3RvcmVkDAEcY29tcHV0ZVEHATxFbGVjdGlvbkNvbXB1dGUAARhvcmlnaW79AQFQT3B0aW9uPFQ6OkFjY291bnRJZD4AATBwcmV2X2VqZWN0ZWQgARBib29sAAActEEgc29sdXRpb24gd2FzIHN0b3JlZCB3aXRoIHRoZSBnaXZlbiBjb21wdXRlLgBRAVRoZSBgb3JpZ2luYCBpbmRpY2F0ZXMgdGhlIG9yaWdpbiBvZiB0aGUgc29sdXRpb24uIElmIGBvcmlnaW5gIGlzIGBTb21lKEFjY291bnRJZClgLFkBdGhlIHN0b3JlZCBzb2x1dGlvbiB3YXMgc3VibWl0dGVkIGluIHRoZSBzaWduZWQgcGhhc2UgYnkgYSBtaW5lciB3aXRoIHRoZSBgQWNjb3VudElkYC4lAU90aGVyd2lzZSwgdGhlIHNvbHV0aW9uIHdhcyBzdG9yZWQgZWl0aGVyIGR1cmluZyB0aGUgdW5zaWduZWQgcGhhc2Ugb3IgYnlNAWBUOjpGb3JjZU9yaWdpbmAuIFRoZSBgYm9vbGAgaXMgYHRydWVgIHdoZW4gYSBwcmV2aW91cyBzb2x1dGlvbiB3YXMgZWplY3RlZCB0byBtYWtlSHJvb20gZm9yIHRoaXMgb25lLkRFbGVjdGlvbkZpbmFsaXplZAgBHGNvbXB1dGVRBwE8RWxlY3Rpb25Db21wdXRlAAEUc2NvcmX1AwE0RWxlY3Rpb25TY29yZQABBBkBVGhlIGVsZWN0aW9uIGhhcyBiZWVuIGZpbmFsaXplZCwgd2l0aCB0aGUgZ2l2ZW4gY29tcHV0YXRpb24gYW5kIHNjb3JlLjhFbGVjdGlvbkZhaWxlZAACDExBbiBlbGVjdGlvbiBmYWlsZWQuAAEBTm90IG11Y2ggY2FuIGJlIHNhaWQgYWJvdXQgd2hpY2ggY29tcHV0ZXMgZmFpbGVkIGluIHRoZSBwcm9jZXNzLiBSZXdhcmRlZAgBHGFjY291bnQAAZg8VCBhcyBmcmFtZV9zeXN0ZW06OkNvbmZpZz46OkFjY291bnRJZAABFHZhbHVlGAEwQmFsYW5jZU9mPFQ+AAMEJQFBbiBhY2NvdW50IGhhcyBiZWVuIHJld2FyZGVkIGZvciB0aGVpciBzaWduZWQgc3VibWlzc2lvbiBiZWluZyBmaW5hbGl6ZWQuHFNsYXNoZWQIARxhY2NvdW50AAGYPFQgYXMgZnJhbWVfc3lzdGVtOjpDb25maWc+OjpBY2NvdW50SWQAARR2YWx1ZRgBMEJhbGFuY2VPZjxUPgAEBCEBQW4gYWNjb3VudCBoYXMgYmVlbiBzbGFzaGVkIGZvciBzdWJtaXR0aW5nIGFuIGludmFsaWQgc2lnbmVkIHN1Ym1pc3Npb24uRFBoYXNlVHJhbnNpdGlvbmVkDAEQZnJvbVUHAWBQaGFzZTxCbG9ja051bWJlckZvcjxUPj4AAQh0b1UHAWBQaGFzZTxCbG9ja051bWJlckZvcjxUPj4AARRyb3VuZBABDHUzMgAFBLhUaGVyZSB3YXMgYSBwaGFzZSB0cmFuc2l0aW9uIGluIGEgZ2l2ZW4gcm91bmQuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0UQcIkHBhbGxldF9lbGVjdGlvbl9wcm92aWRlcl9tdWx0aV9waGFzZTxFbGVjdGlvbkNvbXB1dGUAARQcT25DaGFpbgAAABhTaWduZWQAAQAgVW5zaWduZWQAAgAgRmFsbGJhY2sAAwAkRW1lcmdlbmN5AAQAAFUHCJBwYWxsZXRfZWxlY3Rpb25fcHJvdmlkZXJfbXVsdGlfcGhhc2UUUGhhc2UECEJuARABEAxPZmYAAAAYU2lnbmVkAAEAIFVuc2lnbmVkBABZBwEoKGJvb2wsIEJuKQACACRFbWVyZ2VuY3kAAwAAWQcAAAQIIBAAXQcMQHBhbGxldF9iYWdzX2xpc3QYcGFsbGV0FEV2ZW50CARUAARJAAEIIFJlYmFnZ2VkDAEMd2hvAAEwVDo6QWNjb3VudElkAAEQZnJvbTABIFQ6OlNjb3JlAAEIdG8wASBUOjpTY29yZQAABKRNb3ZlZCBhbiBhY2NvdW50IGZyb20gb25lIGJhZyB0byBhbm90aGVyLjBTY29yZVVwZGF0ZWQIAQx3aG8AATBUOjpBY2NvdW50SWQAASRuZXdfc2NvcmUwASBUOjpTY29yZQABBNhVcGRhdGVkIHRoZSBzY29yZSBvZiBzb21lIGFjY291bnQgdG8gdGhlIGdpdmVuIGFtb3VudC4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXRhBwxccGFsbGV0X25vbWluYXRpb25fcG9vbHMYcGFsbGV0FEV2ZW50BARUAAFIHENyZWF0ZWQIASRkZXBvc2l0b3IAATBUOjpBY2NvdW50SWQAARxwb29sX2lkEAEYUG9vbElkAAAEYEEgcG9vbCBoYXMgYmVlbiBjcmVhdGVkLhhCb25kZWQQARhtZW1iZXIAATBUOjpBY2NvdW50SWQAARxwb29sX2lkEAEYUG9vbElkAAEYYm9uZGVkGAEwQmFsYW5jZU9mPFQ+AAEYam9pbmVkIAEQYm9vbAABBJRBIG1lbWJlciBoYXMgYmVjYW1lIGJvbmRlZCBpbiBhIHBvb2wuHFBhaWRPdXQMARhtZW1iZXIAATBUOjpBY2NvdW50SWQAARxwb29sX2lkEAEYUG9vbElkAAEYcGF5b3V0GAEwQmFsYW5jZU9mPFQ+AAIEjEEgcGF5b3V0IGhhcyBiZWVuIG1hZGUgdG8gYSBtZW1iZXIuIFVuYm9uZGVkFAEYbWVtYmVyAAEwVDo6QWNjb3VudElkAAEccG9vbF9pZBABGFBvb2xJZAABHGJhbGFuY2UYATBCYWxhbmNlT2Y8VD4AARhwb2ludHMYATBCYWxhbmNlT2Y8VD4AAQxlcmEQASBFcmFJbmRleAADLJhBIG1lbWJlciBoYXMgdW5ib25kZWQgZnJvbSB0aGVpciBwb29sLgA5AS0gYGJhbGFuY2VgIGlzIHRoZSBjb3JyZXNwb25kaW5nIGJhbGFuY2Ugb2YgdGhlIG51bWJlciBvZiBwb2ludHMgdGhhdCBoYXMgYmVlblUBICByZXF1ZXN0ZWQgdG8gYmUgdW5ib25kZWQgKHRoZSBhcmd1bWVudCBvZiB0aGUgYHVuYm9uZGAgdHJhbnNhY3Rpb24pIGZyb20gdGhlIGJvbmRlZBwgIHBvb2wuRQEtIGBwb2ludHNgIGlzIHRoZSBudW1iZXIgb2YgcG9pbnRzIHRoYXQgYXJlIGlzc3VlZCBhcyBhIHJlc3VsdCBvZiBgYmFsYW5jZWAgYmVpbmfAZGlzc29sdmVkIGludG8gdGhlIGNvcnJlc3BvbmRpbmcgdW5ib25kaW5nIHBvb2wu5C0gYGVyYWAgaXMgdGhlIGVyYSBpbiB3aGljaCB0aGUgYmFsYW5jZSB3aWxsIGJlIHVuYm9uZGVkLlUBSW4gdGhlIGFic2VuY2Ugb2Ygc2xhc2hpbmcsIHRoZXNlIHZhbHVlcyB3aWxsIG1hdGNoLiBJbiB0aGUgcHJlc2VuY2Ugb2Ygc2xhc2hpbmcsIHRoZU0BbnVtYmVyIG9mIHBvaW50cyB0aGF0IGFyZSBpc3N1ZWQgaW4gdGhlIHVuYm9uZGluZyBwb29sIHdpbGwgYmUgbGVzcyB0aGFuIHRoZSBhbW91bnRkcmVxdWVzdGVkIHRvIGJlIHVuYm9uZGVkLiRXaXRoZHJhd24QARhtZW1iZXIAATBUOjpBY2NvdW50SWQAARxwb29sX2lkEAEYUG9vbElkAAEcYmFsYW5jZRgBMEJhbGFuY2VPZjxUPgABGHBvaW50cxgBMEJhbGFuY2VPZjxUPgAEGJxBIG1lbWJlciBoYXMgd2l0aGRyYXduIGZyb20gdGhlaXIgcG9vbC4AIQFUaGUgZ2l2ZW4gbnVtYmVyIG9mIGBwb2ludHNgIGhhdmUgYmVlbiBkaXNzb2x2ZWQgaW4gcmV0dXJuIG9mIGBiYWxhbmNlYC4AWQFTaW1pbGFyIHRvIGBVbmJvbmRlZGAgZXZlbnQsIGluIHRoZSBhYnNlbmNlIG9mIHNsYXNoaW5nLCB0aGUgcmF0aW8gb2YgcG9pbnQgdG8gYmFsYW5jZSh3aWxsIGJlIDEuJERlc3Ryb3llZAQBHHBvb2xfaWQQARhQb29sSWQABQRoQSBwb29sIGhhcyBiZWVuIGRlc3Ryb3llZC4wU3RhdGVDaGFuZ2VkCAEccG9vbF9pZBABGFBvb2xJZAABJG5ld19zdGF0ZSEEASRQb29sU3RhdGUABgR8VGhlIHN0YXRlIG9mIGEgcG9vbCBoYXMgY2hhbmdlZDRNZW1iZXJSZW1vdmVkCAEccG9vbF9pZBABGFBvb2xJZAABGG1lbWJlcgABMFQ6OkFjY291bnRJZAAHDJhBIG1lbWJlciBoYXMgYmVlbiByZW1vdmVkIGZyb20gYSBwb29sLgBRAVRoZSByZW1vdmFsIGNhbiBiZSB2b2x1bnRhcnkgKHdpdGhkcmF3biBhbGwgdW5ib25kZWQgZnVuZHMpIG9yIGludm9sdW50YXJ5IChraWNrZWQpLjBSb2xlc1VwZGF0ZWQMARByb290/QEBUE9wdGlvbjxUOjpBY2NvdW50SWQ+AAEcYm91bmNlcv0BAVBPcHRpb248VDo6QWNjb3VudElkPgABJG5vbWluYXRvcv0BAVBPcHRpb248VDo6QWNjb3VudElkPgAICFUBVGhlIHJvbGVzIG9mIGEgcG9vbCBoYXZlIGJlZW4gdXBkYXRlZCB0byB0aGUgZ2l2ZW4gbmV3IHJvbGVzLiBOb3RlIHRoYXQgdGhlIGRlcG9zaXRvckRjYW4gbmV2ZXIgY2hhbmdlLixQb29sU2xhc2hlZAgBHHBvb2xfaWQQARhQb29sSWQAARxiYWxhbmNlGAEwQmFsYW5jZU9mPFQ+AAkEDQFUaGUgYWN0aXZlIGJhbGFuY2Ugb2YgcG9vbCBgcG9vbF9pZGAgaGFzIGJlZW4gc2xhc2hlZCB0byBgYmFsYW5jZWAuUFVuYm9uZGluZ1Bvb2xTbGFzaGVkDAEccG9vbF9pZBABGFBvb2xJZAABDGVyYRABIEVyYUluZGV4AAEcYmFsYW5jZRgBMEJhbGFuY2VPZjxUPgAKBCUBVGhlIHVuYm9uZCBwb29sIGF0IGBlcmFgIG9mIHBvb2wgYHBvb2xfaWRgIGhhcyBiZWVuIHNsYXNoZWQgdG8gYGJhbGFuY2VgLlRQb29sQ29tbWlzc2lvblVwZGF0ZWQIARxwb29sX2lkEAEYUG9vbElkAAEcY3VycmVudDkEAXxPcHRpb248KFBlcmJpbGwsIFQ6OkFjY291bnRJZCk+AAsEtEEgcG9vbCdzIGNvbW1pc3Npb24gc2V0dGluZyBoYXMgYmVlbiBjaGFuZ2VkLmBQb29sTWF4Q29tbWlzc2lvblVwZGF0ZWQIARxwb29sX2lkEAEYUG9vbElkAAE4bWF4X2NvbW1pc3Npb26sARxQZXJiaWxsAAwE1EEgcG9vbCdzIG1heGltdW0gY29tbWlzc2lvbiBzZXR0aW5nIGhhcyBiZWVuIGNoYW5nZWQufFBvb2xDb21taXNzaW9uQ2hhbmdlUmF0ZVVwZGF0ZWQIARxwb29sX2lkEAEYUG9vbElkAAEsY2hhbmdlX3JhdGVBBAGcQ29tbWlzc2lvbkNoYW5nZVJhdGU8QmxvY2tOdW1iZXJGb3I8VD4+AA0EzEEgcG9vbCdzIGNvbW1pc3Npb24gYGNoYW5nZV9yYXRlYCBoYXMgYmVlbiBjaGFuZ2VkLpBQb29sQ29tbWlzc2lvbkNsYWltUGVybWlzc2lvblVwZGF0ZWQIARxwb29sX2lkEAEYUG9vbElkAAEocGVybWlzc2lvbkUEAbxPcHRpb248Q29tbWlzc2lvbkNsYWltUGVybWlzc2lvbjxUOjpBY2NvdW50SWQ+PgAOBMhQb29sIGNvbW1pc3Npb24gY2xhaW0gcGVybWlzc2lvbiBoYXMgYmVlbiB1cGRhdGVkLlRQb29sQ29tbWlzc2lvbkNsYWltZWQIARxwb29sX2lkEAEYUG9vbElkAAEoY29tbWlzc2lvbhgBMEJhbGFuY2VPZjxUPgAPBIRQb29sIGNvbW1pc3Npb24gaGFzIGJlZW4gY2xhaW1lZC5kTWluQmFsYW5jZURlZmljaXRBZGp1c3RlZAgBHHBvb2xfaWQQARhQb29sSWQAARhhbW91bnQYATBCYWxhbmNlT2Y8VD4AEATIVG9wcGVkIHVwIGRlZmljaXQgaW4gZnJvemVuIEVEIG9mIHRoZSByZXdhcmQgcG9vbC5gTWluQmFsYW5jZUV4Y2Vzc0FkanVzdGVkCAEccG9vbF9pZBABGFBvb2xJZAABGGFtb3VudBgBMEJhbGFuY2VPZjxUPgARBLxDbGFpbWVkIGV4Y2VzcyBmcm96ZW4gRUQgb2YgYWYgdGhlIHJld2FyZCBwb29sLgRYRXZlbnRzIG9mIHRoaXMgcGFsbGV0LmUHDExwYWxsZXRfZmFzdF91bnN0YWtlGHBhbGxldBRFdmVudAQEVAABFCBVbnN0YWtlZAgBFHN0YXNoAAEwVDo6QWNjb3VudElkAAEYcmVzdWx0iAE4RGlzcGF0Y2hSZXN1bHQAAARYQSBzdGFrZXIgd2FzIHVuc3Rha2VkLhxTbGFzaGVkCAEUc3Rhc2gAATBUOjpBY2NvdW50SWQAARhhbW91bnQYATBCYWxhbmNlT2Y8VD4AAQQZAUEgc3Rha2VyIHdhcyBzbGFzaGVkIGZvciByZXF1ZXN0aW5nIGZhc3QtdW5zdGFrZSB3aGlsc3QgYmVpbmcgZXhwb3NlZC4wQmF0Y2hDaGVja2VkBAEQZXJhc+UBATRWZWM8RXJhSW5kZXg+AAIERQFBIGJhdGNoIHdhcyBwYXJ0aWFsbHkgY2hlY2tlZCBmb3IgdGhlIGdpdmVuIGVyYXMsIGJ1dCB0aGUgcHJvY2VzcyBkaWQgbm90IGZpbmlzaC40QmF0Y2hGaW5pc2hlZAQBEHNpemUQAQx1MzIAAxCcQSBiYXRjaCBvZiBhIGdpdmVuIHNpemUgd2FzIHRlcm1pbmF0ZWQuAFUBVGhpcyBpcyBhbHdheXMgZm9sbG93cyBieSBhIG51bWJlciBvZiBgVW5zdGFrZWRgIG9yIGBTbGFzaGVkYCBldmVudHMsIG1hcmtpbmcgdGhlIGVuZOhvZiB0aGUgYmF0Y2guIEEgbmV3IGJhdGNoIHdpbGwgYmUgY3JlYXRlZCB1cG9uIG5leHQgYmxvY2suNEludGVybmFsRXJyb3IABAToQW4gaW50ZXJuYWwgZXJyb3IgaGFwcGVuZWQuIE9wZXJhdGlvbnMgd2lsbCBiZSBwYXVzZWQgbm93LgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldGkHEGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMkaW5jbHVzaW9uGHBhbGxldBRFdmVudAQEVAABEDxDYW5kaWRhdGVCYWNrZWQQAG0HAWRDYW5kaWRhdGVSZWNlaXB0PFQ6Okhhc2g+AADZBAEgSGVhZERhdGEAAHEHASRDb3JlSW5kZXgAAHUHAShHcm91cEluZGV4AAAEwEEgY2FuZGlkYXRlIHdhcyBiYWNrZWQuIGBbY2FuZGlkYXRlLCBoZWFkX2RhdGFdYERDYW5kaWRhdGVJbmNsdWRlZBAAbQcBZENhbmRpZGF0ZVJlY2VpcHQ8VDo6SGFzaD4AANkEASBIZWFkRGF0YQAAcQcBJENvcmVJbmRleAAAdQcBKEdyb3VwSW5kZXgAAQTIQSBjYW5kaWRhdGUgd2FzIGluY2x1ZGVkLiBgW2NhbmRpZGF0ZSwgaGVhZF9kYXRhXWBEQ2FuZGlkYXRlVGltZWRPdXQMAG0HAWRDYW5kaWRhdGVSZWNlaXB0PFQ6Okhhc2g+AADZBAEgSGVhZERhdGEAAHEHASRDb3JlSW5kZXgAAgS8QSBjYW5kaWRhdGUgdGltZWQgb3V0LiBgW2NhbmRpZGF0ZSwgaGVhZF9kYXRhXWBYVXB3YXJkTWVzc2FnZXNSZWNlaXZlZAgBEGZyb22NAgEYUGFyYUlkAAEUY291bnQQAQx1MzIAAwT4U29tZSB1cHdhcmQgbWVzc2FnZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIGFuZCB3aWxsIGJlIHByb2Nlc3NlZC4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXRtBwxMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2N0BDYW5kaWRhdGVSZWNlaXB0BARIATQACAEoZGVzY3JpcHRvcq0EAVhDYW5kaWRhdGVEZXNjcmlwdG9yPEg+AAFAY29tbWl0bWVudHNfaGFzaDQBEEhhc2gAAHEHDExwb2xrYWRvdF9wcmltaXRpdmVzCHY3JENvcmVJbmRleAAABAAQAQx1MzIAAHUHDExwb2xrYWRvdF9wcmltaXRpdmVzCHY3KEdyb3VwSW5kZXgAAAQAEAEMdTMyAAB5BxBscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zFHBhcmFzGHBhbGxldBRFdmVudAABIEhDdXJyZW50Q29kZVVwZGF0ZWQEAI0CARhQYXJhSWQAAATMQ3VycmVudCBjb2RlIGhhcyBiZWVuIHVwZGF0ZWQgZm9yIGEgUGFyYS4gYHBhcmFfaWRgSEN1cnJlbnRIZWFkVXBkYXRlZAQAjQIBGFBhcmFJZAABBMxDdXJyZW50IGhlYWQgaGFzIGJlZW4gdXBkYXRlZCBmb3IgYSBQYXJhLiBgcGFyYV9pZGBQQ29kZVVwZ3JhZGVTY2hlZHVsZWQEAI0CARhQYXJhSWQAAgTcQSBjb2RlIHVwZ3JhZGUgaGFzIGJlZW4gc2NoZWR1bGVkIGZvciBhIFBhcmEuIGBwYXJhX2lkYDBOZXdIZWFkTm90ZWQEAI0CARhQYXJhSWQAAwS8QSBuZXcgaGVhZCBoYXMgYmVlbiBub3RlZCBmb3IgYSBQYXJhLiBgcGFyYV9pZGAwQWN0aW9uUXVldWVkCACNAgEYUGFyYUlkAAAQATBTZXNzaW9uSW5kZXgABATwQSBwYXJhIGhhcyBiZWVuIHF1ZXVlZCB0byBleGVjdXRlIHBlbmRpbmcgYWN0aW9ucy4gYHBhcmFfaWRgPFB2ZkNoZWNrU3RhcnRlZAgAuQQBSFZhbGlkYXRpb25Db2RlSGFzaAAAjQIBGFBhcmFJZAAFCFUBVGhlIGdpdmVuIHBhcmEgZWl0aGVyIGluaXRpYXRlZCBvciBzdWJzY3JpYmVkIHRvIGEgUFZGIGNoZWNrIGZvciB0aGUgZ2l2ZW4gdmFsaWRhdGlvbmxjb2RlLiBgY29kZV9oYXNoYCBgcGFyYV9pZGBAUHZmQ2hlY2tBY2NlcHRlZAgAuQQBSFZhbGlkYXRpb25Db2RlSGFzaAAAjQIBGFBhcmFJZAAGCBEBVGhlIGdpdmVuIHZhbGlkYXRpb24gY29kZSB3YXMgYWNjZXB0ZWQgYnkgdGhlIFBWRiBwcmUtY2hlY2tpbmcgdm90ZS5UYGNvZGVfaGFzaGAgYHBhcmFfaWRgQFB2ZkNoZWNrUmVqZWN0ZWQIALkEAUhWYWxpZGF0aW9uQ29kZUhhc2gAAI0CARhQYXJhSWQABwgRAVRoZSBnaXZlbiB2YWxpZGF0aW9uIGNvZGUgd2FzIHJlamVjdGVkIGJ5IHRoZSBQVkYgcHJlLWNoZWNraW5nIHZvdGUuVGBjb2RlX2hhc2hgIGBwYXJhX2lkYAR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldH0HEGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMQaHJtcBhwYWxsZXQURXZlbnQEBFQAARxQT3BlbkNoYW5uZWxSZXF1ZXN0ZWQQARhzZW5kZXKNAgEYUGFyYUlkAAEkcmVjaXBpZW50jQIBGFBhcmFJZAABVHByb3Bvc2VkX21heF9jYXBhY2l0eRABDHUzMgABZHByb3Bvc2VkX21heF9tZXNzYWdlX3NpemUQAQx1MzIAAARwT3BlbiBIUk1QIGNoYW5uZWwgcmVxdWVzdGVkLkxPcGVuQ2hhbm5lbENhbmNlbGVkCAEwYnlfcGFyYWNoYWlujQIBGFBhcmFJZAABKGNoYW5uZWxfaWQZBQE0SHJtcENoYW5uZWxJZAABBCkBQW4gSFJNUCBjaGFubmVsIHJlcXVlc3Qgc2VudCBieSB0aGUgcmVjZWl2ZXIgd2FzIGNhbmNlbGVkIGJ5IGVpdGhlciBwYXJ0eS5MT3BlbkNoYW5uZWxBY2NlcHRlZAgBGHNlbmRlco0CARhQYXJhSWQAASRyZWNpcGllbnSNAgEYUGFyYUlkAAIEbE9wZW4gSFJNUCBjaGFubmVsIGFjY2VwdGVkLjRDaGFubmVsQ2xvc2VkCAEwYnlfcGFyYWNoYWlujQIBGFBhcmFJZAABKGNoYW5uZWxfaWQZBQE0SHJtcENoYW5uZWxJZAADBFBIUk1QIGNoYW5uZWwgY2xvc2VkLlhIcm1wQ2hhbm5lbEZvcmNlT3BlbmVkEAEYc2VuZGVyjQIBGFBhcmFJZAABJHJlY2lwaWVudI0CARhQYXJhSWQAAVRwcm9wb3NlZF9tYXhfY2FwYWNpdHkQAQx1MzIAAWRwcm9wb3NlZF9tYXhfbWVzc2FnZV9zaXplEAEMdTMyAAQErEFuIEhSTVAgY2hhbm5lbCB3YXMgb3BlbmVkIHZpYSBSb290IG9yaWdpbi5cSHJtcFN5c3RlbUNoYW5uZWxPcGVuZWQQARhzZW5kZXKNAgEYUGFyYUlkAAEkcmVjaXBpZW50jQIBGFBhcmFJZAABVHByb3Bvc2VkX21heF9jYXBhY2l0eRABDHUzMgABZHByb3Bvc2VkX21heF9tZXNzYWdlX3NpemUQAQx1MzIABQS8QW4gSFJNUCBjaGFubmVsIHdhcyBvcGVuZWQgd2l0aCBhIHN5c3RlbSBjaGFpbi5oT3BlbkNoYW5uZWxEZXBvc2l0c1VwZGF0ZWQIARhzZW5kZXKNAgEYUGFyYUlkAAEkcmVjaXBpZW50jQIBGFBhcmFJZAAGBKBBbiBIUk1QIGNoYW5uZWwncyBkZXBvc2l0cyB3ZXJlIHVwZGF0ZWQuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0gQcQbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucyBkaXNwdXRlcxhwYWxsZXQURXZlbnQEBFQAAQxARGlzcHV0ZUluaXRpYXRlZAgA7QQBNENhbmRpZGF0ZUhhc2gAAIUHATxEaXNwdXRlTG9jYXRpb24AAAQJAUEgZGlzcHV0ZSBoYXMgYmVlbiBpbml0aWF0ZWQuIFxbY2FuZGlkYXRlIGhhc2gsIGRpc3B1dGUgbG9jYXRpb25cXUBEaXNwdXRlQ29uY2x1ZGVkCADtBAE0Q2FuZGlkYXRlSGFzaAAAiQcBNERpc3B1dGVSZXN1bHQAAQjMQSBkaXNwdXRlIGhhcyBjb25jbHVkZWQgZm9yIG9yIGFnYWluc3QgYSBjYW5kaWRhdGUutGBcW3BhcmEgaWQsIGNhbmRpZGF0ZSBoYXNoLCBkaXNwdXRlIHJlc3VsdFxdYBhSZXZlcnQEABABREJsb2NrTnVtYmVyRm9yPFQ+AAIQ/EEgZGlzcHV0ZSBoYXMgY29uY2x1ZGVkIHdpdGggc3VwZXJtYWpvcml0eSBhZ2FpbnN0IGEgY2FuZGlkYXRlLg0BQmxvY2sgYXV0aG9ycyBzaG91bGQgbm8gbG9uZ2VyIGJ1aWxkIG9uIHRvcCBvZiB0aGlzIGhlYWQgYW5kIHNob3VsZAEBaW5zdGVhZCByZXZlcnQgdGhlIGJsb2NrIGF0IHRoZSBnaXZlbiBoZWlnaHQuIFRoaXMgc2hvdWxkIGJlIHRoZfxudW1iZXIgb2YgdGhlIGNoaWxkIG9mIHRoZSBsYXN0IGtub3duIHZhbGlkIGJsb2NrIGluIHRoZSBjaGFpbi4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXSFBwxscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zIGRpc3B1dGVzPERpc3B1dGVMb2NhdGlvbgABCBRMb2NhbAAAABhSZW1vdGUAAQAAiQcMbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucyBkaXNwdXRlczREaXNwdXRlUmVzdWx0AAEIFFZhbGlkAAAAHEludmFsaWQAAQAAjQcQbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWluc0hhc3NpZ25lcl9vbl9kZW1hbmQYcGFsbGV0FEV2ZW50BARUAAEITE9uRGVtYW5kT3JkZXJQbGFjZWQMARxwYXJhX2lkjQIBGFBhcmFJZAABKHNwb3RfcHJpY2UYATBCYWxhbmNlT2Y8VD4AAShvcmRlcmVkX2J5AAEwVDo6QWNjb3VudElkAAAEDQFBbiBvcmRlciB3YXMgcGxhY2VkIGF0IHNvbWUgc3BvdCBwcmljZSBhbW91bnQgYnkgb3JkZXJlciBvcmRlcmVkX2J5MFNwb3RQcmljZVNldAQBKHNwb3RfcHJpY2UYATBCYWxhbmNlT2Y8VD4AAQS4VGhlIHZhbHVlIG9mIHRoZSBzcG90IHByaWNlIGhhcyBsaWtlbHkgY2hhbmdlZAR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldJEHEFxwb2xrYWRvdF9ydW50aW1lX2NvbW1vbjxwYXJhc19yZWdpc3RyYXIYcGFsbGV0FEV2ZW50BARUAAEQKFJlZ2lzdGVyZWQIARxwYXJhX2lkjQIBGFBhcmFJZAABHG1hbmFnZXIAATBUOjpBY2NvdW50SWQAAAAwRGVyZWdpc3RlcmVkBAEccGFyYV9pZI0CARhQYXJhSWQAAQAgUmVzZXJ2ZWQIARxwYXJhX2lkjQIBGFBhcmFJZAABDHdobwABMFQ6OkFjY291bnRJZAACABxTd2FwcGVkCAEccGFyYV9pZI0CARhQYXJhSWQAASBvdGhlcl9pZI0CARhQYXJhSWQAAwAEfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXSVBxBccG9sa2Fkb3RfcnVudGltZV9jb21tb24Uc2xvdHMYcGFsbGV0FEV2ZW50BARUAAEIOE5ld0xlYXNlUGVyaW9kBAEwbGVhc2VfcGVyaW9kEAFATGVhc2VQZXJpb2RPZjxUPgAABJBBIG5ldyBgW2xlYXNlX3BlcmlvZF1gIGlzIGJlZ2lubmluZy4YTGVhc2VkGAEccGFyYV9pZI0CARhQYXJhSWQAARhsZWFzZXIAATBUOjpBY2NvdW50SWQAATBwZXJpb2RfYmVnaW4QAUBMZWFzZVBlcmlvZE9mPFQ+AAEwcGVyaW9kX2NvdW50EAFATGVhc2VQZXJpb2RPZjxUPgABOGV4dHJhX3Jlc2VydmVkGAEwQmFsYW5jZU9mPFQ+AAEwdG90YWxfYW1vdW50GAEwQmFsYW5jZU9mPFQ+AAEMNQFBIHBhcmEgaGFzIHdvbiB0aGUgcmlnaHQgdG8gYSBjb250aW51b3VzIHNldCBvZiBsZWFzZSBwZXJpb2RzIGFzIGEgcGFyYWNoYWluLkUBRmlyc3QgYmFsYW5jZSBpcyBhbnkgZXh0cmEgYW1vdW50IHJlc2VydmVkIG9uIHRvcCBvZiB0aGUgcGFyYSdzIGV4aXN0aW5nIGRlcG9zaXQusFNlY29uZCBiYWxhbmNlIGlzIHRoZSB0b3RhbCBhbW91bnQgcmVzZXJ2ZWQuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0mQcQXHBvbGthZG90X3J1bnRpbWVfY29tbW9uIGF1Y3Rpb25zGHBhbGxldBRFdmVudAQEVAABHDhBdWN0aW9uU3RhcnRlZAwBNGF1Y3Rpb25faW5kZXgQATBBdWN0aW9uSW5kZXgAATBsZWFzZV9wZXJpb2QQAUBMZWFzZVBlcmlvZE9mPFQ+AAEYZW5kaW5nEAFEQmxvY2tOdW1iZXJGb3I8VD4AAAhJAUFuIGF1Y3Rpb24gc3RhcnRlZC4gUHJvdmlkZXMgaXRzIGluZGV4IGFuZCB0aGUgYmxvY2sgbnVtYmVyIHdoZXJlIGl0IHdpbGwgYmVnaW4gdG8VAWNsb3NlIGFuZCB0aGUgZmlyc3QgbGVhc2UgcGVyaW9kIG9mIHRoZSBxdWFkcnVwbGV0IHRoYXQgaXMgYXVjdGlvbmVkLjRBdWN0aW9uQ2xvc2VkBAE0YXVjdGlvbl9pbmRleBABMEF1Y3Rpb25JbmRleAABBLhBbiBhdWN0aW9uIGVuZGVkLiBBbGwgZnVuZHMgYmVjb21lIHVucmVzZXJ2ZWQuIFJlc2VydmVkDAEYYmlkZGVyAAEwVDo6QWNjb3VudElkAAE4ZXh0cmFfcmVzZXJ2ZWQYATBCYWxhbmNlT2Y8VD4AATB0b3RhbF9hbW91bnQYATBCYWxhbmNlT2Y8VD4AAghJAUZ1bmRzIHdlcmUgcmVzZXJ2ZWQgZm9yIGEgd2lubmluZyBiaWQuIEZpcnN0IGJhbGFuY2UgaXMgdGhlIGV4dHJhIGFtb3VudCByZXNlcnZlZC5QU2Vjb25kIGlzIHRoZSB0b3RhbC4oVW5yZXNlcnZlZAgBGGJpZGRlcgABMFQ6OkFjY291bnRJZAABGGFtb3VudBgBMEJhbGFuY2VPZjxUPgADBCkBRnVuZHMgd2VyZSB1bnJlc2VydmVkIHNpbmNlIGJpZGRlciBpcyBubyBsb25nZXIgYWN0aXZlLiBgW2JpZGRlciwgYW1vdW50XWBIUmVzZXJ2ZUNvbmZpc2NhdGVkDAEccGFyYV9pZI0CARhQYXJhSWQAARhsZWFzZXIAATBUOjpBY2NvdW50SWQAARhhbW91bnQYATBCYWxhbmNlT2Y8VD4ABAhVAVNvbWVvbmUgYXR0ZW1wdGVkIHRvIGxlYXNlIHRoZSBzYW1lIHNsb3QgdHdpY2UgZm9yIGEgcGFyYWNoYWluLiBUaGUgYW1vdW50IGlzIGhlbGQgaW64cmVzZXJ2ZSBidXQgbm8gcGFyYWNoYWluIHNsb3QgaGFzIGJlZW4gbGVhc2VkLixCaWRBY2NlcHRlZBQBGGJpZGRlcgABMFQ6OkFjY291bnRJZAABHHBhcmFfaWSNAgEYUGFyYUlkAAEYYW1vdW50GAEwQmFsYW5jZU9mPFQ+AAEoZmlyc3Rfc2xvdBABQExlYXNlUGVyaW9kT2Y8VD4AASRsYXN0X3Nsb3QQAUBMZWFzZVBlcmlvZE9mPFQ+AAUEyEEgbmV3IGJpZCBoYXMgYmVlbiBhY2NlcHRlZCBhcyB0aGUgY3VycmVudCB3aW5uZXIuNFdpbm5pbmdPZmZzZXQIATRhdWN0aW9uX2luZGV4EAEwQXVjdGlvbkluZGV4AAEwYmxvY2tfbnVtYmVyEAFEQmxvY2tOdW1iZXJGb3I8VD4ABghZAVRoZSB3aW5uaW5nIG9mZnNldCB3YXMgY2hvc2VuIGZvciBhbiBhdWN0aW9uLiBUaGlzIHdpbGwgbWFwIGludG8gdGhlIGBXaW5uaW5nYCBzdG9yYWdlEG1hcC4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXSdBxBccG9sa2Fkb3RfcnVudGltZV9jb21tb24kY3Jvd2Rsb2FuGHBhbGxldBRFdmVudAQEVAABKBxDcmVhdGVkBAEccGFyYV9pZI0CARhQYXJhSWQAAASMQ3JlYXRlIGEgbmV3IGNyb3dkbG9hbmluZyBjYW1wYWlnbi4sQ29udHJpYnV0ZWQMAQx3aG8AATBUOjpBY2NvdW50SWQAAShmdW5kX2luZGV4jQIBGFBhcmFJZAABGGFtb3VudBgBMEJhbGFuY2VPZjxUPgABBHBDb250cmlidXRlZCB0byBhIGNyb3dkIHNhbGUuIFdpdGhkcmV3DAEMd2hvAAEwVDo6QWNjb3VudElkAAEoZnVuZF9pbmRleI0CARhQYXJhSWQAARhhbW91bnQYATBCYWxhbmNlT2Y8VD4AAgScV2l0aGRyZXcgZnVsbCBiYWxhbmNlIG9mIGEgY29udHJpYnV0b3IuRFBhcnRpYWxseVJlZnVuZGVkBAEccGFyYV9pZI0CARhQYXJhSWQAAwgtAVRoZSBsb2FucyBpbiBhIGZ1bmQgaGF2ZSBiZWVuIHBhcnRpYWxseSBkaXNzb2x2ZWQsIGkuZS4gdGhlcmUgYXJlIHNvbWUgbGVmdLRvdmVyIGNoaWxkIGtleXMgdGhhdCBzdGlsbCBuZWVkIHRvIGJlIGtpbGxlZC4sQWxsUmVmdW5kZWQEARxwYXJhX2lkjQIBGFBhcmFJZAAEBJxBbGwgbG9hbnMgaW4gYSBmdW5kIGhhdmUgYmVlbiByZWZ1bmRlZC4kRGlzc29sdmVkBAEccGFyYV9pZI0CARhQYXJhSWQABQRIRnVuZCBpcyBkaXNzb2x2ZWQuPEhhbmRsZUJpZFJlc3VsdAgBHHBhcmFfaWSNAgEYUGFyYUlkAAEYcmVzdWx0iAE4RGlzcGF0Y2hSZXN1bHQABgT0VGhlIHJlc3VsdCBvZiB0cnlpbmcgdG8gc3VibWl0IGEgbmV3IGJpZCB0byB0aGUgU2xvdHMgcGFsbGV0LhhFZGl0ZWQEARxwYXJhX2lkjQIBGFBhcmFJZAAHBMRUaGUgY29uZmlndXJhdGlvbiB0byBhIGNyb3dkbG9hbiBoYXMgYmVlbiBlZGl0ZWQuLE1lbW9VcGRhdGVkDAEMd2hvAAEwVDo6QWNjb3VudElkAAEccGFyYV9pZI0CARhQYXJhSWQAARBtZW1vOAEcVmVjPHU4PgAIBGBBIG1lbW8gaGFzIGJlZW4gdXBkYXRlZC48QWRkZWRUb05ld1JhaXNlBAEccGFyYV9pZI0CARhQYXJhSWQACQSgQSBwYXJhY2hhaW4gaGFzIGJlZW4gbW92ZWQgdG8gYE5ld1JhaXNlYAR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldKEHEGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMgY29yZXRpbWUYcGFsbGV0FEV2ZW50BARUAAEIUFJldmVudWVJbmZvUmVxdWVzdGVkBAEQd2hlbhABREJsb2NrTnVtYmVyRm9yPFQ+AAAEIQFUaGUgYnJva2VyIGNoYWluIGhhcyBhc2tlZCBmb3IgcmV2ZW51ZSBpbmZvcm1hdGlvbiBmb3IgYSBzcGVjaWZpYyBibG9jay4wQ29yZUFzc2lnbmVkBAEQY29yZXEHASRDb3JlSW5kZXgAAQTsQSBjb3JlIGhhcyByZWNlaXZlZCBhIG5ldyBhc3NpZ25tZW50IGZyb20gdGhlIGJyb2tlciBjaGFpbi4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXSlBwxscGFsbGV0X3N0YXRlX3RyaWVfbWlncmF0aW9uGHBhbGxldBRFdmVudAQEVAABECBNaWdyYXRlZAwBDHRvcBABDHUzMgABFGNoaWxkEAEMdTMyAAEcY29tcHV0ZakHAUBNaWdyYXRpb25Db21wdXRlAAAIOQFHaXZlbiBudW1iZXIgb2YgYCh0b3AsIGNoaWxkKWAga2V5cyB3ZXJlIG1pZ3JhdGVkIHJlc3BlY3RpdmVseSwgd2l0aCB0aGUgZ2l2ZW4oYGNvbXB1dGVgLhxTbGFzaGVkCAEMd2hvAAEwVDo6QWNjb3VudElkAAEYYW1vdW50GAEwQmFsYW5jZU9mPFQ+AAEEtFNvbWUgYWNjb3VudCBnb3Qgc2xhc2hlZCBieSB0aGUgZ2l2ZW4gYW1vdW50LlRBdXRvTWlncmF0aW9uRmluaXNoZWQAAgSEVGhlIGF1dG8gbWlncmF0aW9uIHRhc2sgZmluaXNoZWQuGEhhbHRlZAQBFGVycm9yrQcBIEVycm9yPFQ+AAME7E1pZ3JhdGlvbiBnb3QgaGFsdGVkIGR1ZSB0byBhbiBlcnJvciBvciBtaXNzLWNvbmZpZ3VyYXRpb24uBHBJbm5lciBldmVudHMgb2YgdGhpcyBwYWxsZXQuqQcMbHBhbGxldF9zdGF0ZV90cmllX21pZ3JhdGlvbhhwYWxsZXRATWlncmF0aW9uQ29tcHV0ZQABCBhTaWduZWQAAAAQQXV0bwABAACtBwxscGFsbGV0X3N0YXRlX3RyaWVfbWlncmF0aW9uGHBhbGxldBRFcnJvcgQEVAABGDxNYXhTaWduZWRMaW1pdHMAAASATWF4IHNpZ25lZCBsaW1pdHMgbm90IHJlc3BlY3RlZC4oS2V5VG9vTG9uZwABHLRBIGtleSB3YXMgbG9uZ2VyIHRoYW4gdGhlIGNvbmZpZ3VyZWQgbWF4aW11bS4AEQFUaGlzIG1lYW5zIHRoYXQgdGhlIG1pZ3JhdGlvbiBoYWx0ZWQgYXQgdGhlIGN1cnJlbnQgW2BQcm9ncmVzc2BdIGFuZAEBY2FuIGJlIHJlc3VtZWQgd2l0aCBhIGxhcmdlciBbYGNyYXRlOjpDb25maWc6Ok1heEtleUxlbmBdIHZhbHVlLiEBUmV0cnlpbmcgd2l0aCB0aGUgc2FtZSBbYGNyYXRlOjpDb25maWc6Ok1heEtleUxlbmBdIHZhbHVlIHdpbGwgbm90IHdvcmsuRQFUaGUgdmFsdWUgc2hvdWxkIG9ubHkgYmUgaW5jcmVhc2VkIHRvIGF2b2lkIGEgc3RvcmFnZSBtaWdyYXRpb24gZm9yIHRoZSBjdXJyZW50bHmQc3RvcmVkIFtgY3JhdGU6OlByb2dyZXNzOjpMYXN0S2V5YF0uOE5vdEVub3VnaEZ1bmRzAAIElHN1Ym1pdHRlciBkb2VzIG5vdCBoYXZlIGVub3VnaCBmdW5kcy4oQmFkV2l0bmVzcwADBGhCYWQgd2l0bmVzcyBkYXRhIHByb3ZpZGVkLmRTaWduZWRNaWdyYXRpb25Ob3RBbGxvd2VkAAQEJQFTaWduZWQgbWlncmF0aW9uIGlzIG5vdCBhbGxvd2VkIGJlY2F1c2UgdGhlIG1heGltdW0gbGltaXQgaXMgbm90IHNldCB5ZXQuMEJhZENoaWxkUm9vdAAFBGBCYWQgY2hpbGQgcm9vdCBwcm92aWRlZC4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQusQcMKHBhbGxldF94Y20YcGFsbGV0FEV2ZW50BARUAAFgJEF0dGVtcHRlZAQBHG91dGNvbWW1BwFQeGNtOjpsYXRlc3Q6Ok91dGNvbWUAAASoRXhlY3V0aW9uIG9mIGFuIFhDTSBtZXNzYWdlIHdhcyBhdHRlbXB0ZWQuEFNlbnQQARhvcmlnaW4NAQEgTG9jYXRpb24AASxkZXN0aW5hdGlvbg0BASBMb2NhdGlvbgABHG1lc3NhZ2VBBgEcWGNtPCgpPgABKG1lc3NhZ2VfaWQEARxYY21IYXNoAAEEXEEgWENNIG1lc3NhZ2Ugd2FzIHNlbnQuSFVuZXhwZWN0ZWRSZXNwb25zZQgBGG9yaWdpbg0BASBMb2NhdGlvbgABIHF1ZXJ5X2lkMAEcUXVlcnlJZAACDFkBUXVlcnkgcmVzcG9uc2UgcmVjZWl2ZWQgd2hpY2ggZG9lcyBub3QgbWF0Y2ggYSByZWdpc3RlcmVkIHF1ZXJ5LiBUaGlzIG1heSBiZSBiZWNhdXNlIGFVAW1hdGNoaW5nIHF1ZXJ5IHdhcyBuZXZlciByZWdpc3RlcmVkLCBpdCBtYXkgYmUgYmVjYXVzZSBpdCBpcyBhIGR1cGxpY2F0ZSByZXNwb25zZSwgb3JwYmVjYXVzZSB0aGUgcXVlcnkgdGltZWQgb3V0LjRSZXNwb25zZVJlYWR5CAEgcXVlcnlfaWQwARxRdWVyeUlkAAEgcmVzcG9uc2VhBgEgUmVzcG9uc2UAAwhdAVF1ZXJ5IHJlc3BvbnNlIGhhcyBiZWVuIHJlY2VpdmVkIGFuZCBpcyByZWFkeSBmb3IgdGFraW5nIHdpdGggYHRha2VfcmVzcG9uc2VgLiBUaGVyZSBpc4BubyByZWdpc3RlcmVkIG5vdGlmaWNhdGlvbiBjYWxsLiBOb3RpZmllZAwBIHF1ZXJ5X2lkMAEcUXVlcnlJZAABMHBhbGxldF9pbmRleAgBCHU4AAEoY2FsbF9pbmRleAgBCHU4AAQIWQFRdWVyeSByZXNwb25zZSBoYXMgYmVlbiByZWNlaXZlZCBhbmQgcXVlcnkgaXMgcmVtb3ZlZC4gVGhlIHJlZ2lzdGVyZWQgbm90aWZpY2F0aW9uIGhhc6hiZWVuIGRpc3BhdGNoZWQgYW5kIGV4ZWN1dGVkIHN1Y2Nlc3NmdWxseS5ATm90aWZ5T3ZlcndlaWdodBQBIHF1ZXJ5X2lkMAEcUXVlcnlJZAABMHBhbGxldF9pbmRleAgBCHU4AAEoY2FsbF9pbmRleAgBCHU4AAE0YWN0dWFsX3dlaWdodCgBGFdlaWdodAABTG1heF9idWRnZXRlZF93ZWlnaHQoARhXZWlnaHQABQxJAVF1ZXJ5IHJlc3BvbnNlIGhhcyBiZWVuIHJlY2VpdmVkIGFuZCBxdWVyeSBpcyByZW1vdmVkLiBUaGUgcmVnaXN0ZXJlZCBub3RpZmljYXRpb25ZAWNvdWxkIG5vdCBiZSBkaXNwYXRjaGVkIGJlY2F1c2UgdGhlIGRpc3BhdGNoIHdlaWdodCBpcyBncmVhdGVyIHRoYW4gdGhlIG1heGltdW0gd2VpZ2h05G9yaWdpbmFsbHkgYnVkZ2V0ZWQgYnkgdGhpcyBydW50aW1lIGZvciB0aGUgcXVlcnkgcmVzdWx0LkxOb3RpZnlEaXNwYXRjaEVycm9yDAEgcXVlcnlfaWQwARxRdWVyeUlkAAEwcGFsbGV0X2luZGV4CAEIdTgAAShjYWxsX2luZGV4CAEIdTgABghVAVF1ZXJ5IHJlc3BvbnNlIGhhcyBiZWVuIHJlY2VpdmVkIGFuZCBxdWVyeSBpcyByZW1vdmVkLiBUaGVyZSB3YXMgYSBnZW5lcmFsIGVycm9yIHdpdGiIZGlzcGF0Y2hpbmcgdGhlIG5vdGlmaWNhdGlvbiBjYWxsLkhOb3RpZnlEZWNvZGVGYWlsZWQMASBxdWVyeV9pZDABHFF1ZXJ5SWQAATBwYWxsZXRfaW5kZXgIAQh1OAABKGNhbGxfaW5kZXgIAQh1OAAHDFEBUXVlcnkgcmVzcG9uc2UgaGFzIGJlZW4gcmVjZWl2ZWQgYW5kIHF1ZXJ5IGlzIHJlbW92ZWQuIFRoZSBkaXNwYXRjaCB3YXMgdW5hYmxlIHRvIGJlWQFkZWNvZGVkIGludG8gYSBgQ2FsbGA7IHRoaXMgbWlnaHQgYmUgZHVlIHRvIGRpc3BhdGNoIGZ1bmN0aW9uIGhhdmluZyBhIHNpZ25hdHVyZSB3aGljaJRpcyBub3QgYChvcmlnaW4sIFF1ZXJ5SWQsIFJlc3BvbnNlKWAuQEludmFsaWRSZXNwb25kZXIMARhvcmlnaW4NAQEgTG9jYXRpb24AASBxdWVyeV9pZDABHFF1ZXJ5SWQAAURleHBlY3RlZF9sb2NhdGlvbnUGAUBPcHRpb248TG9jYXRpb24+AAgMWQFFeHBlY3RlZCBxdWVyeSByZXNwb25zZSBoYXMgYmVlbiByZWNlaXZlZCBidXQgdGhlIG9yaWdpbiBsb2NhdGlvbiBvZiB0aGUgcmVzcG9uc2UgZG9lc1UBbm90IG1hdGNoIHRoYXQgZXhwZWN0ZWQuIFRoZSBxdWVyeSByZW1haW5zIHJlZ2lzdGVyZWQgZm9yIGEgbGF0ZXIsIHZhbGlkLCByZXNwb25zZSB0b2xiZSByZWNlaXZlZCBhbmQgYWN0ZWQgdXBvbi5cSW52YWxpZFJlc3BvbmRlclZlcnNpb24IARhvcmlnaW4NAQEgTG9jYXRpb24AASBxdWVyeV9pZDABHFF1ZXJ5SWQACRxRAUV4cGVjdGVkIHF1ZXJ5IHJlc3BvbnNlIGhhcyBiZWVuIHJlY2VpdmVkIGJ1dCB0aGUgZXhwZWN0ZWQgb3JpZ2luIGxvY2F0aW9uIHBsYWNlZCBpbk0Bc3RvcmFnZSBieSB0aGlzIHJ1bnRpbWUgcHJldmlvdXNseSBjYW5ub3QgYmUgZGVjb2RlZC4gVGhlIHF1ZXJ5IHJlbWFpbnMgcmVnaXN0ZXJlZC4AQQFUaGlzIGlzIHVuZXhwZWN0ZWQgKHNpbmNlIGEgbG9jYXRpb24gcGxhY2VkIGluIHN0b3JhZ2UgaW4gYSBwcmV2aW91c2x5IGV4ZWN1dGluZ00BcnVudGltZSBzaG91bGQgYmUgcmVhZGFibGUgcHJpb3IgdG8gcXVlcnkgdGltZW91dCkgYW5kIGRhbmdlcm91cyBzaW5jZSB0aGUgcG9zc2libHlZAXZhbGlkIHJlc3BvbnNlIHdpbGwgYmUgZHJvcHBlZC4gTWFudWFsIGdvdmVybmFuY2UgaW50ZXJ2ZW50aW9uIGlzIHByb2JhYmx5IGdvaW5nIHRvIGJlHG5lZWRlZC40UmVzcG9uc2VUYWtlbgQBIHF1ZXJ5X2lkMAEcUXVlcnlJZAAKBMhSZWNlaXZlZCBxdWVyeSByZXNwb25zZSBoYXMgYmVlbiByZWFkIGFuZCByZW1vdmVkLjRBc3NldHNUcmFwcGVkDAEQaGFzaDQBEEgyNTYAARhvcmlnaW4NAQEgTG9jYXRpb24AARhhc3NldHOJBgE8VmVyc2lvbmVkQXNzZXRzAAsEuFNvbWUgYXNzZXRzIGhhdmUgYmVlbiBwbGFjZWQgaW4gYW4gYXNzZXQgdHJhcC5UVmVyc2lvbkNoYW5nZU5vdGlmaWVkEAEsZGVzdGluYXRpb24NAQEgTG9jYXRpb24AARhyZXN1bHQQAShYY21WZXJzaW9uAAEQY29zdE0GARhBc3NldHMAAShtZXNzYWdlX2lkBAEcWGNtSGFzaAAMDCUBQW4gWENNIHZlcnNpb24gY2hhbmdlIG5vdGlmaWNhdGlvbiBtZXNzYWdlIGhhcyBiZWVuIGF0dGVtcHRlZCB0byBiZSBzZW50LgDgVGhlIGNvc3Qgb2Ygc2VuZGluZyBpdCAoYm9ybmUgYnkgdGhlIGNoYWluKSBpcyBpbmNsdWRlZC5cU3VwcG9ydGVkVmVyc2lvbkNoYW5nZWQIASBsb2NhdGlvbg0BASBMb2NhdGlvbgABHHZlcnNpb24QAShYY21WZXJzaW9uAA0IOQFUaGUgc3VwcG9ydGVkIHZlcnNpb24gb2YgYSBsb2NhdGlvbiBoYXMgYmVlbiBjaGFuZ2VkLiBUaGlzIG1pZ2h0IGJlIHRocm91Z2ggYW7AYXV0b21hdGljIG5vdGlmaWNhdGlvbiBvciBhIG1hbnVhbCBpbnRlcnZlbnRpb24uUE5vdGlmeVRhcmdldFNlbmRGYWlsDAEgbG9jYXRpb24NAQEgTG9jYXRpb24AASBxdWVyeV9pZDABHFF1ZXJ5SWQAARRlcnJvcgkGASBYY21FcnJvcgAOCFkBQSBnaXZlbiBsb2NhdGlvbiB3aGljaCBoYWQgYSB2ZXJzaW9uIGNoYW5nZSBzdWJzY3JpcHRpb24gd2FzIGRyb3BwZWQgb3dpbmcgdG8gYW4gZXJyb3J8c2VuZGluZyB0aGUgbm90aWZpY2F0aW9uIHRvIGl0LmROb3RpZnlUYXJnZXRNaWdyYXRpb25GYWlsCAEgbG9jYXRpb25FAQFEVmVyc2lvbmVkTG9jYXRpb24AASBxdWVyeV9pZDABHFF1ZXJ5SWQADwhZAUEgZ2l2ZW4gbG9jYXRpb24gd2hpY2ggaGFkIGEgdmVyc2lvbiBjaGFuZ2Ugc3Vic2NyaXB0aW9uIHdhcyBkcm9wcGVkIG93aW5nIHRvIGFuIGVycm9ytG1pZ3JhdGluZyB0aGUgbG9jYXRpb24gdG8gb3VyIG5ldyBYQ00gZm9ybWF0LlRJbnZhbGlkUXVlcmllclZlcnNpb24IARhvcmlnaW4NAQEgTG9jYXRpb24AASBxdWVyeV9pZDABHFF1ZXJ5SWQAEBxVAUV4cGVjdGVkIHF1ZXJ5IHJlc3BvbnNlIGhhcyBiZWVuIHJlY2VpdmVkIGJ1dCB0aGUgZXhwZWN0ZWQgcXVlcmllciBsb2NhdGlvbiBwbGFjZWQgaW5NAXN0b3JhZ2UgYnkgdGhpcyBydW50aW1lIHByZXZpb3VzbHkgY2Fubm90IGJlIGRlY29kZWQuIFRoZSBxdWVyeSByZW1haW5zIHJlZ2lzdGVyZWQuAEEBVGhpcyBpcyB1bmV4cGVjdGVkIChzaW5jZSBhIGxvY2F0aW9uIHBsYWNlZCBpbiBzdG9yYWdlIGluIGEgcHJldmlvdXNseSBleGVjdXRpbmdNAXJ1bnRpbWUgc2hvdWxkIGJlIHJlYWRhYmxlIHByaW9yIHRvIHF1ZXJ5IHRpbWVvdXQpIGFuZCBkYW5nZXJvdXMgc2luY2UgdGhlIHBvc3NpYmx5WQF2YWxpZCByZXNwb25zZSB3aWxsIGJlIGRyb3BwZWQuIE1hbnVhbCBnb3Zlcm5hbmNlIGludGVydmVudGlvbiBpcyBwcm9iYWJseSBnb2luZyB0byBiZRxuZWVkZWQuOEludmFsaWRRdWVyaWVyEAEYb3JpZ2luDQEBIExvY2F0aW9uAAEgcXVlcnlfaWQwARxRdWVyeUlkAAFAZXhwZWN0ZWRfcXVlcmllcg0BASBMb2NhdGlvbgABUG1heWJlX2FjdHVhbF9xdWVyaWVydQYBQE9wdGlvbjxMb2NhdGlvbj4AEQxdAUV4cGVjdGVkIHF1ZXJ5IHJlc3BvbnNlIGhhcyBiZWVuIHJlY2VpdmVkIGJ1dCB0aGUgcXVlcmllciBsb2NhdGlvbiBvZiB0aGUgcmVzcG9uc2UgZG9lc1EBbm90IG1hdGNoIHRoZSBleHBlY3RlZC4gVGhlIHF1ZXJ5IHJlbWFpbnMgcmVnaXN0ZXJlZCBmb3IgYSBsYXRlciwgdmFsaWQsIHJlc3BvbnNlIHRvbGJlIHJlY2VpdmVkIGFuZCBhY3RlZCB1cG9uLlBWZXJzaW9uTm90aWZ5U3RhcnRlZAwBLGRlc3RpbmF0aW9uDQEBIExvY2F0aW9uAAEQY29zdE0GARhBc3NldHMAAShtZXNzYWdlX2lkBAEcWGNtSGFzaAASCFkBQSByZW1vdGUgaGFzIHJlcXVlc3RlZCBYQ00gdmVyc2lvbiBjaGFuZ2Ugbm90aWZpY2F0aW9uIGZyb20gdXMgYW5kIHdlIGhhdmUgaG9ub3JlZCBpdC4dAUEgdmVyc2lvbiBpbmZvcm1hdGlvbiBtZXNzYWdlIGlzIHNlbnQgdG8gdGhlbSBhbmQgaXRzIGNvc3QgaXMgaW5jbHVkZWQuWFZlcnNpb25Ob3RpZnlSZXF1ZXN0ZWQMASxkZXN0aW5hdGlvbg0BASBMb2NhdGlvbgABEGNvc3RNBgEYQXNzZXRzAAEobWVzc2FnZV9pZAQBHFhjbUhhc2gAEwQ9AVdlIGhhdmUgcmVxdWVzdGVkIHRoYXQgYSByZW1vdGUgY2hhaW4gc2VuZCB1cyBYQ00gdmVyc2lvbiBjaGFuZ2Ugbm90aWZpY2F0aW9ucy5gVmVyc2lvbk5vdGlmeVVucmVxdWVzdGVkDAEsZGVzdGluYXRpb24NAQEgTG9jYXRpb24AARBjb3N0TQYBGEFzc2V0cwABKG1lc3NhZ2VfaWQEARxYY21IYXNoABQIJQFXZSBoYXZlIHJlcXVlc3RlZCB0aGF0IGEgcmVtb3RlIGNoYWluIHN0b3BzIHNlbmRpbmcgdXMgWENNIHZlcnNpb24gY2hhbmdlOG5vdGlmaWNhdGlvbnMuIEZlZXNQYWlkCAEYcGF5aW5nDQEBIExvY2F0aW9uAAEQZmVlc00GARhBc3NldHMAFQQxAUZlZXMgd2VyZSBwYWlkIGZyb20gYSBsb2NhdGlvbiBmb3IgYW4gb3BlcmF0aW9uIChvZnRlbiBmb3IgdXNpbmcgYFNlbmRYY21gKS40QXNzZXRzQ2xhaW1lZAwBEGhhc2g0ARBIMjU2AAEYb3JpZ2luDQEBIExvY2F0aW9uAAEYYXNzZXRziQYBPFZlcnNpb25lZEFzc2V0cwAWBMBTb21lIGFzc2V0cyBoYXZlIGJlZW4gY2xhaW1lZCBmcm9tIGFuIGFzc2V0IHRyYXBgVmVyc2lvbk1pZ3JhdGlvbkZpbmlzaGVkBAEcdmVyc2lvbhABKFhjbVZlcnNpb24AFwSEQSBYQ00gdmVyc2lvbiBtaWdyYXRpb24gZmluaXNoZWQuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0tQcQLHN0YWdpbmdfeGNtCHY0GHRyYWl0cxxPdXRjb21lAAEMIENvbXBsZXRlBAEQdXNlZCgBGFdlaWdodAAAAChJbmNvbXBsZXRlCAEQdXNlZCgBGFdlaWdodAABFGVycm9yCQYBFEVycm9yAAEAFEVycm9yBAEUZXJyb3IJBgEURXJyb3IAAgAAuQcMUHBhbGxldF9tZXNzYWdlX3F1ZXVlGHBhbGxldBRFdmVudAQEVAABEEBQcm9jZXNzaW5nRmFpbGVkDAEIaWQ0ARBIMjU2BJRUaGUgYGJsYWtlMl8yNTZgIGhhc2ggb2YgdGhlIG1lc3NhZ2UuARhvcmlnaW7FBgFITWVzc2FnZU9yaWdpbk9mPFQ+BGRUaGUgcXVldWUgb2YgdGhlIG1lc3NhZ2UuARRlcnJvcr0HAUxQcm9jZXNzTWVzc2FnZUVycm9yEGBUaGUgZXJyb3IgdGhhdCBvY2N1cnJlZC4ASQFUaGlzIGVycm9yIGlzIHByZXR0eSBvcGFxdWUuIE1vcmUgZmluZS1ncmFpbmVkIGVycm9ycyBuZWVkIHRvIGJlIGVtaXR0ZWQgYXMgZXZlbnRzaGJ5IHRoZSBgTWVzc2FnZVByb2Nlc3NvcmAuAARVAU1lc3NhZ2UgZGlzY2FyZGVkIGR1ZSB0byBhbiBlcnJvciBpbiB0aGUgYE1lc3NhZ2VQcm9jZXNzb3JgICh1c3VhbGx5IGEgZm9ybWF0IGVycm9yKS4kUHJvY2Vzc2VkEAEIaWQ0ARBIMjU2BJRUaGUgYGJsYWtlMl8yNTZgIGhhc2ggb2YgdGhlIG1lc3NhZ2UuARhvcmlnaW7FBgFITWVzc2FnZU9yaWdpbk9mPFQ+BGRUaGUgcXVldWUgb2YgdGhlIG1lc3NhZ2UuASx3ZWlnaHRfdXNlZCgBGFdlaWdodATASG93IG11Y2ggd2VpZ2h0IHdhcyB1c2VkIHRvIHByb2Nlc3MgdGhlIG1lc3NhZ2UuARxzdWNjZXNzIAEQYm9vbBiIV2hldGhlciB0aGUgbWVzc2FnZSB3YXMgcHJvY2Vzc2VkLgBJAU5vdGUgdGhhdCB0aGlzIGRvZXMgbm90IG1lYW4gdGhhdCB0aGUgdW5kZXJseWluZyBgTWVzc2FnZVByb2Nlc3NvcmAgd2FzIGludGVybmFsbHk1AXN1Y2Nlc3NmdWwuIEl0ICpzb2xlbHkqIG1lYW5zIHRoYXQgdGhlIE1RIHBhbGxldCB3aWxsIHRyZWF0IHRoaXMgYXMgYSBzdWNjZXNzTQFjb25kaXRpb24gYW5kIGRpc2NhcmQgdGhlIG1lc3NhZ2UuIEFueSBpbnRlcm5hbCBlcnJvciBuZWVkcyB0byBiZSBlbWl0dGVkIGFzIGV2ZW50c2hieSB0aGUgYE1lc3NhZ2VQcm9jZXNzb3JgLgEEVE1lc3NhZ2UgaXMgcHJvY2Vzc2VkLkhPdmVyd2VpZ2h0RW5xdWV1ZWQQAQhpZAQBIFt1ODsgMzJdBJRUaGUgYGJsYWtlMl8yNTZgIGhhc2ggb2YgdGhlIG1lc3NhZ2UuARhvcmlnaW7FBgFITWVzc2FnZU9yaWdpbk9mPFQ+BGRUaGUgcXVldWUgb2YgdGhlIG1lc3NhZ2UuAShwYWdlX2luZGV4EAEkUGFnZUluZGV4BGBUaGUgcGFnZSBvZiB0aGUgbWVzc2FnZS4BNG1lc3NhZ2VfaW5kZXgQARxUOjpTaXplBKRUaGUgaW5kZXggb2YgdGhlIG1lc3NhZ2Ugd2l0aGluIHRoZSBwYWdlLgIEjE1lc3NhZ2UgcGxhY2VkIGluIG92ZXJ3ZWlnaHQgcXVldWUuKFBhZ2VSZWFwZWQIARhvcmlnaW7FBgFITWVzc2FnZU9yaWdpbk9mPFQ+BFhUaGUgcXVldWUgb2YgdGhlIHBhZ2UuARRpbmRleBABJFBhZ2VJbmRleARYVGhlIGluZGV4IG9mIHRoZSBwYWdlLgMEVFRoaXMgcGFnZSB3YXMgcmVhcGVkLgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldL0HEDRmcmFtZV9zdXBwb3J0GHRyYWl0cyBtZXNzYWdlc0xQcm9jZXNzTWVzc2FnZUVycm9yAAEYJEJhZEZvcm1hdAAAABxDb3JydXB0AAEALFVuc3VwcG9ydGVkAAIAKE92ZXJ3ZWlnaHQEACgBGFdlaWdodAADABRZaWVsZAAEAERTdGFja0xpbWl0UmVhY2hlZAAFAADBBwxEcGFsbGV0X2Fzc2V0X3JhdGUYcGFsbGV0FEV2ZW50BARUAAEMQEFzc2V0UmF0ZUNyZWF0ZWQIAShhc3NldF9raW5k3AEwVDo6QXNzZXRLaW5kAAEQcmF0ZdEGASRGaXhlZFUxMjgAAABAQXNzZXRSYXRlUmVtb3ZlZAQBKGFzc2V0X2tpbmTcATBUOjpBc3NldEtpbmQAAQBAQXNzZXRSYXRlVXBkYXRlZAwBKGFzc2V0X2tpbmTcATBUOjpBc3NldEtpbmQAAQxvbGTRBgEkRml4ZWRVMTI4AAEMbmV30QYBJEZpeGVkVTEyOAACAAR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldMUHCDBmcmFtZV9zeXN0ZW0UUGhhc2UAAQw4QXBwbHlFeHRyaW5zaWMEABABDHUzMgAAADBGaW5hbGl6YXRpb24AAQA4SW5pdGlhbGl6YXRpb24AAgAAyQcAAAKAAM0HCDBmcmFtZV9zeXN0ZW1YTGFzdFJ1bnRpbWVVcGdyYWRlSW5mbwAACAEwc3BlY192ZXJzaW9u7AFMY29kZWM6OkNvbXBhY3Q8dTMyPgABJHNwZWNfbmFtZdEHAWRzcF9ydW50aW1lOjpSdW50aW1lU3RyaW5nAADRBwAABQIA1QcIMGZyYW1lX3N5c3RlbWBDb2RlVXBncmFkZUF1dGhvcml6YXRpb24EBFQAAAgBJGNvZGVfaGFzaDQBHFQ6Okhhc2gAATRjaGVja192ZXJzaW9uIAEQYm9vbAAA2QcMMGZyYW1lX3N5c3RlbRhsaW1pdHMwQmxvY2tXZWlnaHRzAAAMAShiYXNlX2Jsb2NrKAEYV2VpZ2h0AAEkbWF4X2Jsb2NrKAEYV2VpZ2h0AAEkcGVyX2NsYXNz3QcBhFBlckRpc3BhdGNoQ2xhc3M8V2VpZ2h0c1BlckNsYXNzPgAA3QcMNGZyYW1lX3N1cHBvcnQgZGlzcGF0Y2hAUGVyRGlzcGF0Y2hDbGFzcwQEVAHhBwAMARhub3JtYWzhBwEEVAABLG9wZXJhdGlvbmFs4QcBBFQAASRtYW5kYXRvcnnhBwEEVAAA4QcMMGZyYW1lX3N5c3RlbRhsaW1pdHM8V2VpZ2h0c1BlckNsYXNzAAAQAThiYXNlX2V4dHJpbnNpYygBGFdlaWdodAABNG1heF9leHRyaW5zaWMRBwE4T3B0aW9uPFdlaWdodD4AASRtYXhfdG90YWwRBwE4T3B0aW9uPFdlaWdodD4AASByZXNlcnZlZBEHAThPcHRpb248V2VpZ2h0PgAA5QcMMGZyYW1lX3N5c3RlbRhsaW1pdHMsQmxvY2tMZW5ndGgAAAQBDG1heOkHAVRQZXJEaXNwYXRjaENsYXNzPHUzMj4AAOkHDDRmcmFtZV9zdXBwb3J0IGRpc3BhdGNoQFBlckRpc3BhdGNoQ2xhc3MEBFQBEAAMARhub3JtYWwQAQRUAAEsb3BlcmF0aW9uYWwQAQRUAAEkbWFuZGF0b3J5EAEEVAAA7QcIKHNwX3dlaWdodHM8UnVudGltZURiV2VpZ2h0AAAIARByZWFkMAEMdTY0AAEUd3JpdGUwAQx1NjQAAPEHCChzcF92ZXJzaW9uOFJ1bnRpbWVWZXJzaW9uAAAgASRzcGVjX25hbWXRBwE0UnVudGltZVN0cmluZwABJGltcGxfbmFtZdEHATRSdW50aW1lU3RyaW5nAAFEYXV0aG9yaW5nX3ZlcnNpb24QAQx1MzIAATBzcGVjX3ZlcnNpb24QAQx1MzIAATBpbXBsX3ZlcnNpb24QAQx1MzIAARBhcGlz9QcBHEFwaXNWZWMAAUx0cmFuc2FjdGlvbl92ZXJzaW9uEAEMdTMyAAE0c3RhdGVfdmVyc2lvbggBCHU4AAD1BwQMQ293BARUAfkHAAQA+QcAAAD5BwAAAv0HAP0HAAAECLEFEAABCAwwZnJhbWVfc3lzdGVtGHBhbGxldBRFcnJvcgQEVAABJDxJbnZhbGlkU3BlY05hbWUAAAgRAVRoZSBuYW1lIG9mIHNwZWNpZmljYXRpb24gZG9lcyBub3QgbWF0Y2ggYmV0d2VlbiB0aGUgY3VycmVudCBydW50aW1lUGFuZCB0aGUgbmV3IHJ1bnRpbWUuaFNwZWNWZXJzaW9uTmVlZHNUb0luY3JlYXNlAAEIQQFUaGUgc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGlzIG5vdCBhbGxvd2VkIHRvIGRlY3JlYXNlIGJldHdlZW4gdGhlIGN1cnJlbnQgcnVudGltZVBhbmQgdGhlIG5ldyBydW50aW1lLnRGYWlsZWRUb0V4dHJhY3RSdW50aW1lVmVyc2lvbgACDOxGYWlsZWQgdG8gZXh0cmFjdCB0aGUgcnVudGltZSB2ZXJzaW9uIGZyb20gdGhlIG5ldyBydW50aW1lLgAJAUVpdGhlciBjYWxsaW5nIGBDb3JlX3ZlcnNpb25gIG9yIGRlY29kaW5nIGBSdW50aW1lVmVyc2lvbmAgZmFpbGVkLkxOb25EZWZhdWx0Q29tcG9zaXRlAAME/FN1aWNpZGUgY2FsbGVkIHdoZW4gdGhlIGFjY291bnQgaGFzIG5vbi1kZWZhdWx0IGNvbXBvc2l0ZSBkYXRhLjxOb25aZXJvUmVmQ291bnQABAQ1AVRoZXJlIGlzIGEgbm9uLXplcm8gcmVmZXJlbmNlIGNvdW50IHByZXZlbnRpbmcgdGhlIGFjY291bnQgZnJvbSBiZWluZyBwdXJnZWQuMENhbGxGaWx0ZXJlZAAFBNBUaGUgb3JpZ2luIGZpbHRlciBwcmV2ZW50IHRoZSBjYWxsIHRvIGJlIGRpc3BhdGNoZWQubE11bHRpQmxvY2tNaWdyYXRpb25zT25nb2luZwAGBFUBQSBtdWx0aS1ibG9jayBtaWdyYXRpb24gaXMgb25nb2luZyBhbmQgcHJldmVudHMgdGhlIGN1cnJlbnQgY29kZSBmcm9tIGJlaW5nIHJlcGxhY2VkLkROb3RoaW5nQXV0aG9yaXplZAAHBFhObyB1cGdyYWRlIGF1dGhvcml6ZWQuMFVuYXV0aG9yaXplZAAIBJRUaGUgc3VibWl0dGVkIGNvZGUgaXMgbm90IGF1dGhvcml6ZWQuBGxFcnJvciBmb3IgdGhlIFN5c3RlbSBwYWxsZXQFCAxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAQkIBFMAAAQAEQgBGFZlYzxUPgAACQgEGE9wdGlvbgQEVAENCAEIEE5vbmUAAAAQU29tZQQADQgAAAEAAA0ICEBwYWxsZXRfc2NoZWR1bGVyJFNjaGVkdWxlZBQQTmFtZQEEEENhbGwBcQEsQmxvY2tOdW1iZXIBEDRQYWxsZXRzT3JpZ2luAX0CJEFjY291bnRJZAEAABQBIG1heWJlX2lkhAEwT3B0aW9uPE5hbWU+AAEgcHJpb3JpdHkIAUhzY2hlZHVsZTo6UHJpb3JpdHkAARBjYWxscQEBEENhbGwAAThtYXliZV9wZXJpb2RpY40BAZRPcHRpb248c2NoZWR1bGU6OlBlcmlvZDxCbG9ja051bWJlcj4+AAEYb3JpZ2lufQIBNFBhbGxldHNPcmlnaW4AABEIAAACCQgAFQgIQHBhbGxldF9zY2hlZHVsZXIsUmV0cnlDb25maWcEGFBlcmlvZAEQAAwBNHRvdGFsX3JldHJpZXMIAQh1OAABJHJlbWFpbmluZwgBCHU4AAEYcGVyaW9kEAEYUGVyaW9kAAAZCAxAcGFsbGV0X3NjaGVkdWxlchhwYWxsZXQURXJyb3IEBFQAARRARmFpbGVkVG9TY2hlZHVsZQAABGRGYWlsZWQgdG8gc2NoZWR1bGUgYSBjYWxsIE5vdEZvdW5kAAEEfENhbm5vdCBmaW5kIHRoZSBzY2hlZHVsZWQgY2FsbC5cVGFyZ2V0QmxvY2tOdW1iZXJJblBhc3QAAgSkR2l2ZW4gdGFyZ2V0IGJsb2NrIG51bWJlciBpcyBpbiB0aGUgcGFzdC5IUmVzY2hlZHVsZU5vQ2hhbmdlAAME8FJlc2NoZWR1bGUgZmFpbGVkIGJlY2F1c2UgaXQgZG9lcyBub3QgY2hhbmdlIHNjaGVkdWxlZCB0aW1lLhROYW1lZAAEBNBBdHRlbXB0IHRvIHVzZSBhIG5vbi1uYW1lZCBmdW5jdGlvbiBvbiBhIG5hbWVkIHRhc2suBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0Lh0ICDxwYWxsZXRfcHJlaW1hZ2VAT2xkUmVxdWVzdFN0YXR1cwgkQWNjb3VudElkAQAcQmFsYW5jZQEYAQgsVW5yZXF1ZXN0ZWQIARxkZXBvc2l0EQQBUChBY2NvdW50SWQsIEJhbGFuY2UpAAEMbGVuEAEMdTMyAAAAJFJlcXVlc3RlZAwBHGRlcG9zaXQhCAFwT3B0aW9uPChBY2NvdW50SWQsIEJhbGFuY2UpPgABFGNvdW50EAEMdTMyAAEMbGVuYQIBLE9wdGlvbjx1MzI+AAEAACEIBBhPcHRpb24EBFQBEQQBCBBOb25lAAAAEFNvbWUEABEEAAABAAAlCAg8cGFsbGV0X3ByZWltYWdlNFJlcXVlc3RTdGF0dXMIJEFjY291bnRJZAEAGFRpY2tldAEpCAEILFVucmVxdWVzdGVkCAEYdGlja2V0LQgBTChBY2NvdW50SWQsIFRpY2tldCkAAQxsZW4QAQx1MzIAAAAkUmVxdWVzdGVkDAEwbWF5YmVfdGlja2V0MQgBbE9wdGlvbjwoQWNjb3VudElkLCBUaWNrZXQpPgABFGNvdW50EAEMdTMyAAEkbWF5YmVfbGVuYQIBLE9wdGlvbjx1MzI+AAEAACkIFDRmcmFtZV9zdXBwb3J0GHRyYWl0cxh0b2tlbnMgZnVuZ2libGVESG9sZENvbnNpZGVyYXRpb24UBEEABEYABFIABEQACEZwAAAEABgBKEY6OkJhbGFuY2UAAC0IAAAECAApCAAxCAQYT3B0aW9uBARUAS0IAQgQTm9uZQAAABBTb21lBAAtCAAAAQAANQgAAAQINBAAOQgMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAEIBFMAAAQAOAEYVmVjPFQ+AAA9CAw8cGFsbGV0X3ByZWltYWdlGHBhbGxldBRFcnJvcgQEVAABJBhUb29CaWcAAASgUHJlaW1hZ2UgaXMgdG9vIGxhcmdlIHRvIHN0b3JlIG9uLWNoYWluLjBBbHJlYWR5Tm90ZWQAAQSkUHJlaW1hZ2UgaGFzIGFscmVhZHkgYmVlbiBub3RlZCBvbi1jaGFpbi40Tm90QXV0aG9yaXplZAACBMhUaGUgdXNlciBpcyBub3QgYXV0aG9yaXplZCB0byBwZXJmb3JtIHRoaXMgYWN0aW9uLiBOb3ROb3RlZAADBPxUaGUgcHJlaW1hZ2UgY2Fubm90IGJlIHJlbW92ZWQgc2luY2UgaXQgaGFzIG5vdCB5ZXQgYmVlbiBub3RlZC4kUmVxdWVzdGVkAAQECQFBIHByZWltYWdlIG1heSBub3QgYmUgcmVtb3ZlZCB3aGVuIHRoZXJlIGFyZSBvdXRzdGFuZGluZyByZXF1ZXN0cy4wTm90UmVxdWVzdGVkAAUELQFUaGUgcHJlaW1hZ2UgcmVxdWVzdCBjYW5ub3QgYmUgcmVtb3ZlZCBzaW5jZSBubyBvdXRzdGFuZGluZyByZXF1ZXN0cyBleGlzdC4cVG9vTWFueQAGBFUBTW9yZSB0aGFuIGBNQVhfSEFTSF9VUEdSQURFX0JVTEtfQ09VTlRgIGhhc2hlcyB3ZXJlIHJlcXVlc3RlZCB0byBiZSB1cGdyYWRlZCBhdCBvbmNlLhhUb29GZXcABwTkVG9vIGZldyBoYXNoZXMgd2VyZSByZXF1ZXN0ZWQgdG8gYmUgdXBncmFkZWQgKGkuZS4gemVybykuGE5vQ29zdAAIBFkBTm8gdGlja2V0IHdpdGggYSBjb3N0IHdhcyByZXR1cm5lZCBieSBbYENvbmZpZzo6Q29uc2lkZXJhdGlvbmBdIHRvIHN0b3JlIHRoZSBwcmVpbWFnZS4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQuQQgMTGJvdW5kZWRfY29sbGVjdGlvbnNAd2Vha19ib3VuZGVkX3ZlYzhXZWFrQm91bmRlZFZlYwgEVAFFCARTAAAEAEkIARhWZWM8VD4AAEUIAAAECKUBMABJCAAAAkUIAE0IDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBBARTAAAEAFEIARhWZWM8VD4AAFEIAAACBABVCAQYT3B0aW9uBARUAVkIAQgQTm9uZQAAABBTb21lBABZCAAAAQAAWQgMRHNwX2NvbnNlbnN1c19iYWJlHGRpZ2VzdHMkUHJlRGlnZXN0AAEMHFByaW1hcnkEAF0IAUBQcmltYXJ5UHJlRGlnZXN0AAEAOFNlY29uZGFyeVBsYWluBABlCAFcU2Vjb25kYXJ5UGxhaW5QcmVEaWdlc3QAAgAwU2Vjb25kYXJ5VlJGBABpCAFUU2Vjb25kYXJ5VlJGUHJlRGlnZXN0AAMAAF0IDERzcF9jb25zZW5zdXNfYmFiZRxkaWdlc3RzQFByaW1hcnlQcmVEaWdlc3QAAAwBPGF1dGhvcml0eV9pbmRleBABVHN1cGVyOjpBdXRob3JpdHlJbmRleAABEHNsb3SpAQEQU2xvdAABNHZyZl9zaWduYXR1cmVhCAEwVnJmU2lnbmF0dXJlAABhCBAcc3BfY29yZRxzcjI1NTE5DHZyZjBWcmZTaWduYXR1cmUAAAgBKHByZV9vdXRwdXQEATBWcmZQcmVPdXRwdXQAARRwcm9vZkkCASBWcmZQcm9vZgAAZQgMRHNwX2NvbnNlbnN1c19iYWJlHGRpZ2VzdHNcU2Vjb25kYXJ5UGxhaW5QcmVEaWdlc3QAAAgBPGF1dGhvcml0eV9pbmRleBABVHN1cGVyOjpBdXRob3JpdHlJbmRleAABEHNsb3SpAQEQU2xvdAAAaQgMRHNwX2NvbnNlbnN1c19iYWJlHGRpZ2VzdHNUU2Vjb25kYXJ5VlJGUHJlRGlnZXN0AAAMATxhdXRob3JpdHlfaW5kZXgQAVRzdXBlcjo6QXV0aG9yaXR5SW5kZXgAARBzbG90qQEBEFNsb3QAATR2cmZfc2lnbmF0dXJlYQgBMFZyZlNpZ25hdHVyZQAAbQgIRHNwX2NvbnNlbnN1c19iYWJlWEJhYmVFcG9jaENvbmZpZ3VyYXRpb24AAAgBBGO1AQEoKHU2NCwgdTY0KQABNGFsbG93ZWRfc2xvdHO5AQEwQWxsb3dlZFNsb3RzAABxCAxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAXUIBFMAAAQAeQgBGFZlYzxUPgAAdQgAAAQIMBAAeQgAAAJ1CAB9CAwscGFsbGV0X2JhYmUYcGFsbGV0FEVycm9yBARUAAEQYEludmFsaWRFcXVpdm9jYXRpb25Qcm9vZgAABDEBQW4gZXF1aXZvY2F0aW9uIHByb29mIHByb3ZpZGVkIGFzIHBhcnQgb2YgYW4gZXF1aXZvY2F0aW9uIHJlcG9ydCBpcyBpbnZhbGlkLmBJbnZhbGlkS2V5T3duZXJzaGlwUHJvb2YAAQQxAUEga2V5IG93bmVyc2hpcCBwcm9vZiBwcm92aWRlZCBhcyBwYXJ0IG9mIGFuIGVxdWl2b2NhdGlvbiByZXBvcnQgaXMgaW52YWxpZC5YRHVwbGljYXRlT2ZmZW5jZVJlcG9ydAACBBUBQSBnaXZlbiBlcXVpdm9jYXRpb24gcmVwb3J0IGlzIHZhbGlkIGJ1dCBhbHJlYWR5IHByZXZpb3VzbHkgcmVwb3J0ZWQuUEludmFsaWRDb25maWd1cmF0aW9uAAMEjFN1Ym1pdHRlZCBjb25maWd1cmF0aW9uIGlzIGludmFsaWQuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LoEIAAAEDAAYIACFCAw4cGFsbGV0X2luZGljZXMYcGFsbGV0FEVycm9yBARUAAEULE5vdEFzc2lnbmVkAAAEjFRoZSBpbmRleCB3YXMgbm90IGFscmVhZHkgYXNzaWduZWQuIE5vdE93bmVyAAEEpFRoZSBpbmRleCBpcyBhc3NpZ25lZCB0byBhbm90aGVyIGFjY291bnQuFEluVXNlAAIEcFRoZSBpbmRleCB3YXMgbm90IGF2YWlsYWJsZS4sTm90VHJhbnNmZXIAAwTIVGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gYWNjb3VudHMgYXJlIGlkZW50aWNhbC4kUGVybWFuZW50AAQE0FRoZSBpbmRleCBpcyBwZXJtYW5lbnQgYW5kIG1heSBub3QgYmUgZnJlZWQvY2hhbmdlZC4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQuiQgMTGJvdW5kZWRfY29sbGVjdGlvbnNAd2Vha19ib3VuZGVkX3ZlYzhXZWFrQm91bmRlZFZlYwgEVAGNCARTAAAEAJUIARhWZWM8VD4AAI0IDDxwYWxsZXRfYmFsYW5jZXMUdHlwZXMsQmFsYW5jZUxvY2sEHEJhbGFuY2UBGAAMAQhpZLEFAThMb2NrSWRlbnRpZmllcgABGGFtb3VudBgBHEJhbGFuY2UAARxyZWFzb25zkQgBHFJlYXNvbnMAAJEIDDxwYWxsZXRfYmFsYW5jZXMUdHlwZXMcUmVhc29ucwABDAxGZWUAAAAQTWlzYwABAAxBbGwAAgAAlQgAAAKNCACZCAxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAZ0IBFMAAAQAoQgBGFZlYzxUPgAAnQgMPHBhbGxldF9iYWxhbmNlcxR0eXBlcyxSZXNlcnZlRGF0YQhEUmVzZXJ2ZUlkZW50aWZpZXIBsQUcQmFsYW5jZQEYAAgBCGlksQUBRFJlc2VydmVJZGVudGlmaWVyAAEYYW1vdW50GAEcQmFsYW5jZQAAoQgAAAKdCAClCAxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAakIBFMAAAQAuQgBGFZlYzxUPgAAqQgUNGZyYW1lX3N1cHBvcnQYdHJhaXRzGHRva2VucxBtaXNjIElkQW1vdW50CAhJZAGtCBxCYWxhbmNlARgACAEIaWStCAEISWQAARhhbW91bnQYARxCYWxhbmNlAACtCAhAcG9sa2Fkb3RfcnVudGltZURSdW50aW1lSG9sZFJlYXNvbgABCCBQcmVpbWFnZQQAsQgBbHBhbGxldF9wcmVpbWFnZTo6SG9sZFJlYXNvbgAKAEhTdGF0ZVRyaWVNaWdyYXRpb24EALUIAZxwYWxsZXRfc3RhdGVfdHJpZV9taWdyYXRpb246OkhvbGRSZWFzb24AYgAAsQgMPHBhbGxldF9wcmVpbWFnZRhwYWxsZXQoSG9sZFJlYXNvbgABBCBQcmVpbWFnZQAAAAC1CAxscGFsbGV0X3N0YXRlX3RyaWVfbWlncmF0aW9uGHBhbGxldChIb2xkUmVhc29uAAEEPFNsYXNoRm9yTWlncmF0ZQAAAAC5CAAAAqkIAL0IDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBwQgEUwAABADNCAEYVmVjPFQ+AADBCBQ0ZnJhbWVfc3VwcG9ydBh0cmFpdHMYdG9rZW5zEG1pc2MgSWRBbW91bnQICElkAcUIHEJhbGFuY2UBGAAIAQhpZMUIAQhJZAABGGFtb3VudBgBHEJhbGFuY2UAAMUICEBwb2xrYWRvdF9ydW50aW1lTFJ1bnRpbWVGcmVlemVSZWFzb24AAQQ8Tm9taW5hdGlvblBvb2xzBADJCAGUcGFsbGV0X25vbWluYXRpb25fcG9vbHM6OkZyZWV6ZVJlYXNvbgAnAADJCAxccGFsbGV0X25vbWluYXRpb25fcG9vbHMYcGFsbGV0MEZyZWV6ZVJlYXNvbgABBDhQb29sTWluQmFsYW5jZQAAAADNCAAAAsEIANEIDDxwYWxsZXRfYmFsYW5jZXMYcGFsbGV0FEVycm9yCARUAARJAAEwOFZlc3RpbmdCYWxhbmNlAAAEnFZlc3RpbmcgYmFsYW5jZSB0b28gaGlnaCB0byBzZW5kIHZhbHVlLlRMaXF1aWRpdHlSZXN0cmljdGlvbnMAAQTIQWNjb3VudCBsaXF1aWRpdHkgcmVzdHJpY3Rpb25zIHByZXZlbnQgd2l0aGRyYXdhbC5MSW5zdWZmaWNpZW50QmFsYW5jZQACBHhCYWxhbmNlIHRvbyBsb3cgdG8gc2VuZCB2YWx1ZS5IRXhpc3RlbnRpYWxEZXBvc2l0AAME7FZhbHVlIHRvbyBsb3cgdG8gY3JlYXRlIGFjY291bnQgZHVlIHRvIGV4aXN0ZW50aWFsIGRlcG9zaXQuNEV4cGVuZGFiaWxpdHkABASQVHJhbnNmZXIvcGF5bWVudCB3b3VsZCBraWxsIGFjY291bnQuXEV4aXN0aW5nVmVzdGluZ1NjaGVkdWxlAAUEzEEgdmVzdGluZyBzY2hlZHVsZSBhbHJlYWR5IGV4aXN0cyBmb3IgdGhpcyBhY2NvdW50LixEZWFkQWNjb3VudAAGBIxCZW5lZmljaWFyeSBhY2NvdW50IG11c3QgcHJlLWV4aXN0LjxUb29NYW55UmVzZXJ2ZXMABwS4TnVtYmVyIG9mIG5hbWVkIHJlc2VydmVzIGV4Y2VlZCBgTWF4UmVzZXJ2ZXNgLjBUb29NYW55SG9sZHMACAT4TnVtYmVyIG9mIGhvbGRzIGV4Y2VlZCBgVmFyaWFudENvdW50T2Y8VDo6UnVudGltZUhvbGRSZWFzb24+YC44VG9vTWFueUZyZWV6ZXMACQSYTnVtYmVyIG9mIGZyZWV6ZXMgZXhjZWVkIGBNYXhGcmVlemVzYC5MSXNzdWFuY2VEZWFjdGl2YXRlZAAKBAEBVGhlIGlzc3VhbmNlIGNhbm5vdCBiZSBtb2RpZmllZCBzaW5jZSBpdCBpcyBhbHJlYWR5IGRlYWN0aXZhdGVkLiREZWx0YVplcm8ACwRkVGhlIGRlbHRhIGNhbm5vdCBiZSB6ZXJvLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC7VCAhocGFsbGV0X3RyYW5zYWN0aW9uX3BheW1lbnQgUmVsZWFzZXMAAQgkVjFBbmNpZW50AAAACFYyAAEAANkICDhwYWxsZXRfc3Rha2luZzRTdGFraW5nTGVkZ2VyBARUAAAUARRzdGFzaAABMFQ6OkFjY291bnRJZAABFHRvdGFs/AEwQmFsYW5jZU9mPFQ+AAEYYWN0aXZl/AEwQmFsYW5jZU9mPFQ+AAEkdW5sb2NraW5nCQIB8EJvdW5kZWRWZWM8VW5sb2NrQ2h1bms8QmFsYW5jZU9mPFQ+PiwgVDo6TWF4VW5sb2NraW5nQ2h1bmtzPgABWGxlZ2FjeV9jbGFpbWVkX3Jld2FyZHPdCAGUQm91bmRlZFZlYzxFcmFJbmRleCwgVDo6SGlzdG9yeURlcHRoPgAA3QgMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAEQBFMAAAQA5QEBGFZlYzxUPgAA4QgIOHBhbGxldF9zdGFraW5nLE5vbWluYXRpb25zBARUAAAMARx0YXJnZXRz5QgBtEJvdW5kZWRWZWM8VDo6QWNjb3VudElkLCBNYXhOb21pbmF0aW9uc09mPFQ+PgABMHN1Ym1pdHRlZF9pbhABIEVyYUluZGV4AAEoc3VwcHJlc3NlZCABEGJvb2wAAOUIDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBAARTAAAEANEBARhWZWM8VD4AAOkICDhwYWxsZXRfc3Rha2luZzRBY3RpdmVFcmFJbmZvAAAIARRpbmRleBABIEVyYUluZGV4AAEUc3RhcnTtCAEsT3B0aW9uPHU2ND4AAO0IBBhPcHRpb24EBFQBMAEIEE5vbmUAAAAQU29tZQQAMAAAAQAA8QgAAAQIEAAA9QgIKHNwX3N0YWtpbmcgRXhwb3N1cmUIJEFjY291bnRJZAEAHEJhbGFuY2UBGAAMARR0b3RhbPwBHEJhbGFuY2UAAQxvd278ARxCYWxhbmNlAAEYb3RoZXJz+QgBrFZlYzxJbmRpdmlkdWFsRXhwb3N1cmU8QWNjb3VudElkLCBCYWxhbmNlPj4AAPkIAAAC/QgA/QgIKHNwX3N0YWtpbmdISW5kaXZpZHVhbEV4cG9zdXJlCCRBY2NvdW50SWQBABxCYWxhbmNlARgACAEMd2hvAAEkQWNjb3VudElkAAEUdmFsdWX8ARxCYWxhbmNlAAABCQgoc3Bfc3Rha2luZ1RQYWdlZEV4cG9zdXJlTWV0YWRhdGEEHEJhbGFuY2UBGAAQARR0b3RhbPwBHEJhbGFuY2UAAQxvd278ARxCYWxhbmNlAAE8bm9taW5hdG9yX2NvdW50EAEMdTMyAAEocGFnZV9jb3VudBABEFBhZ2UAAAUJAAAEDBAAEAAJCQgoc3Bfc3Rha2luZzBFeHBvc3VyZVBhZ2UIJEFjY291bnRJZAEAHEJhbGFuY2UBGAAIAShwYWdlX3RvdGFs/AEcQmFsYW5jZQABGG90aGVyc/kIAaxWZWM8SW5kaXZpZHVhbEV4cG9zdXJlPEFjY291bnRJZCwgQmFsYW5jZT4+AAANCQg4cGFsbGV0X3N0YWtpbmc8RXJhUmV3YXJkUG9pbnRzBCRBY2NvdW50SWQBAAAIARR0b3RhbBABLFJld2FyZFBvaW50AAEoaW5kaXZpZHVhbBEJAYBCVHJlZU1hcDxBY2NvdW50SWQsIFJld2FyZFBvaW50PgAAEQkEIEJUcmVlTWFwCARLAQAEVgEQAAQAFQkAAAAVCQAAAhkJABkJAAAECAAQAB0JAAACIQkAIQkIOHBhbGxldF9zdGFraW5nOFVuYXBwbGllZFNsYXNoCCRBY2NvdW50SWQBABxCYWxhbmNlARgAFAEkdmFsaWRhdG9yAAEkQWNjb3VudElkAAEMb3duGAEcQmFsYW5jZQABGG90aGVycw0EAWRWZWM8KEFjY291bnRJZCwgQmFsYW5jZSk+AAEkcmVwb3J0ZXJz0QEBOFZlYzxBY2NvdW50SWQ+AAEYcGF5b3V0GAEcQmFsYW5jZQAAJQkAAAQIrBgAKQkMOHBhbGxldF9zdGFraW5nIHNsYXNoaW5nNFNsYXNoaW5nU3BhbnMAABABKHNwYW5faW5kZXgQASRTcGFuSW5kZXgAAShsYXN0X3N0YXJ0EAEgRXJhSW5kZXgAAUhsYXN0X25vbnplcm9fc2xhc2gQASBFcmFJbmRleAABFHByaW9y5QEBNFZlYzxFcmFJbmRleD4AAC0JDDhwYWxsZXRfc3Rha2luZyBzbGFzaGluZyhTcGFuUmVjb3JkBBxCYWxhbmNlARgACAEcc2xhc2hlZBgBHEJhbGFuY2UAASBwYWlkX291dBgBHEJhbGFuY2UAADEJEDhwYWxsZXRfc3Rha2luZxhwYWxsZXQYcGFsbGV0FEVycm9yBARUAAF8NE5vdENvbnRyb2xsZXIAAARkTm90IGEgY29udHJvbGxlciBhY2NvdW50LiBOb3RTdGFzaAABBFBOb3QgYSBzdGFzaCBhY2NvdW50LjRBbHJlYWR5Qm9uZGVkAAIEYFN0YXNoIGlzIGFscmVhZHkgYm9uZGVkLjRBbHJlYWR5UGFpcmVkAAMEdENvbnRyb2xsZXIgaXMgYWxyZWFkeSBwYWlyZWQuMEVtcHR5VGFyZ2V0cwAEBGBUYXJnZXRzIGNhbm5vdCBiZSBlbXB0eS44RHVwbGljYXRlSW5kZXgABQRARHVwbGljYXRlIGluZGV4LkRJbnZhbGlkU2xhc2hJbmRleAAGBIRTbGFzaCByZWNvcmQgaW5kZXggb3V0IG9mIGJvdW5kcy5ASW5zdWZmaWNpZW50Qm9uZAAHDFkBQ2Fubm90IGhhdmUgYSB2YWxpZGF0b3Igb3Igbm9taW5hdG9yIHJvbGUsIHdpdGggdmFsdWUgbGVzcyB0aGFuIHRoZSBtaW5pbXVtIGRlZmluZWQgYnk9AWdvdmVybmFuY2UgKHNlZSBgTWluVmFsaWRhdG9yQm9uZGAgYW5kIGBNaW5Ob21pbmF0b3JCb25kYCkuIElmIHVuYm9uZGluZyBpcyB0aGUVAWludGVudGlvbiwgYGNoaWxsYCBmaXJzdCB0byByZW1vdmUgb25lJ3Mgcm9sZSBhcyB2YWxpZGF0b3Ivbm9taW5hdG9yLjBOb01vcmVDaHVua3MACASQQ2FuIG5vdCBzY2hlZHVsZSBtb3JlIHVubG9jayBjaHVua3MuNE5vVW5sb2NrQ2h1bmsACQSgQ2FuIG5vdCByZWJvbmQgd2l0aG91dCB1bmxvY2tpbmcgY2h1bmtzLjBGdW5kZWRUYXJnZXQACgTIQXR0ZW1wdGluZyB0byB0YXJnZXQgYSBzdGFzaCB0aGF0IHN0aWxsIGhhcyBmdW5kcy5ISW52YWxpZEVyYVRvUmV3YXJkAAsEWEludmFsaWQgZXJhIHRvIHJld2FyZC5oSW52YWxpZE51bWJlck9mTm9taW5hdGlvbnMADAR4SW52YWxpZCBudW1iZXIgb2Ygbm9taW5hdGlvbnMuSE5vdFNvcnRlZEFuZFVuaXF1ZQANBIBJdGVtcyBhcmUgbm90IHNvcnRlZCBhbmQgdW5pcXVlLjhBbHJlYWR5Q2xhaW1lZAAOBAkBUmV3YXJkcyBmb3IgdGhpcyBlcmEgaGF2ZSBhbHJlYWR5IGJlZW4gY2xhaW1lZCBmb3IgdGhpcyB2YWxpZGF0b3IuLEludmFsaWRQYWdlAA8EhE5vIG5vbWluYXRvcnMgZXhpc3Qgb24gdGhpcyBwYWdlLlRJbmNvcnJlY3RIaXN0b3J5RGVwdGgAEATASW5jb3JyZWN0IHByZXZpb3VzIGhpc3RvcnkgZGVwdGggaW5wdXQgcHJvdmlkZWQuWEluY29ycmVjdFNsYXNoaW5nU3BhbnMAEQSwSW5jb3JyZWN0IG51bWJlciBvZiBzbGFzaGluZyBzcGFucyBwcm92aWRlZC4gQmFkU3RhdGUAEgQ5AUludGVybmFsIHN0YXRlIGhhcyBiZWNvbWUgc29tZWhvdyBjb3JydXB0ZWQgYW5kIHRoZSBvcGVyYXRpb24gY2Fubm90IGNvbnRpbnVlLjhUb29NYW55VGFyZ2V0cwATBJRUb28gbWFueSBub21pbmF0aW9uIHRhcmdldHMgc3VwcGxpZWQuJEJhZFRhcmdldAAUBD0BQSBub21pbmF0aW9uIHRhcmdldCB3YXMgc3VwcGxpZWQgdGhhdCB3YXMgYmxvY2tlZCBvciBvdGhlcndpc2Ugbm90IGEgdmFsaWRhdG9yLkBDYW5ub3RDaGlsbE90aGVyABUEVQFUaGUgdXNlciBoYXMgZW5vdWdoIGJvbmQgYW5kIHRodXMgY2Fubm90IGJlIGNoaWxsZWQgZm9yY2VmdWxseSBieSBhbiBleHRlcm5hbCBwZXJzb24uRFRvb01hbnlOb21pbmF0b3JzABYITQFUaGVyZSBhcmUgdG9vIG1hbnkgbm9taW5hdG9ycyBpbiB0aGUgc3lzdGVtLiBHb3Zlcm5hbmNlIG5lZWRzIHRvIGFkanVzdCB0aGUgc3Rha2luZ7RzZXR0aW5ncyB0byBrZWVwIHRoaW5ncyBzYWZlIGZvciB0aGUgcnVudGltZS5EVG9vTWFueVZhbGlkYXRvcnMAFwhVAVRoZXJlIGFyZSB0b28gbWFueSB2YWxpZGF0b3IgY2FuZGlkYXRlcyBpbiB0aGUgc3lzdGVtLiBHb3Zlcm5hbmNlIG5lZWRzIHRvIGFkanVzdCB0aGXUc3Rha2luZyBzZXR0aW5ncyB0byBrZWVwIHRoaW5ncyBzYWZlIGZvciB0aGUgcnVudGltZS5AQ29tbWlzc2lvblRvb0xvdwAYBOBDb21taXNzaW9uIGlzIHRvbyBsb3cuIE11c3QgYmUgYXQgbGVhc3QgYE1pbkNvbW1pc3Npb25gLixCb3VuZE5vdE1ldAAZBFhTb21lIGJvdW5kIGlzIG5vdCBtZXQuUENvbnRyb2xsZXJEZXByZWNhdGVkABoEAQFVc2VkIHdoZW4gYXR0ZW1wdGluZyB0byB1c2UgZGVwcmVjYXRlZCBjb250cm9sbGVyIGFjY291bnQgbG9naWMuTENhbm5vdFJlc3RvcmVMZWRnZXIAGwRYQ2Fubm90IHJlc2V0IGEgbGVkZ2VyLmxSZXdhcmREZXN0aW5hdGlvblJlc3RyaWN0ZWQAHASsUHJvdmlkZWQgcmV3YXJkIGRlc3RpbmF0aW9uIGlzIG5vdCBhbGxvd2VkLjhOb3RFbm91Z2hGdW5kcwAdBJxOb3QgZW5vdWdoIGZ1bmRzIGF2YWlsYWJsZSB0byB3aXRoZHJhdy5cVmlydHVhbFN0YWtlck5vdEFsbG93ZWQAHgSoT3BlcmF0aW9uIG5vdCBhbGxvd2VkIGZvciB2aXJ0dWFsIHN0YWtlcnMuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LjUJDChzcF9zdGFraW5nHG9mZmVuY2U4T2ZmZW5jZURldGFpbHMIIFJlcG9ydGVyAQAgT2ZmZW5kZXIBOQkACAEgb2ZmZW5kZXI5CQEgT2ZmZW5kZXIAASRyZXBvcnRlcnPRAQE0VmVjPFJlcG9ydGVyPgAAOQkAAAQIAPUIAD0JAAAECMA4AEEJAAACRQkARQkAAAQIABkCAEkJAAAECE0JOABNCQwcc3BfY29yZRhjcnlwdG8kS2V5VHlwZUlkAAAEAEgBHFt1ODsgNF0AAFEJDDhwYWxsZXRfc2Vzc2lvbhhwYWxsZXQURXJyb3IEBFQAARQwSW52YWxpZFByb29mAAAEYEludmFsaWQgb3duZXJzaGlwIHByb29mLlxOb0Fzc29jaWF0ZWRWYWxpZGF0b3JJZAABBJxObyBhc3NvY2lhdGVkIHZhbGlkYXRvciBJRCBmb3IgYWNjb3VudC40RHVwbGljYXRlZEtleQACBGRSZWdpc3RlcmVkIGR1cGxpY2F0ZSBrZXkuGE5vS2V5cwADBKRObyBrZXlzIGFyZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBhY2NvdW50LiROb0FjY291bnQABAQZAUtleSBzZXR0aW5nIGFjY291bnQgaXMgbm90IGxpdmUsIHNvIGl0J3MgaW1wb3NzaWJsZSB0byBhc3NvY2lhdGUga2V5cy4EdEVycm9yIGZvciB0aGUgc2Vzc2lvbiBwYWxsZXQuVQkIOHBhbGxldF9ncmFuZHBhLFN0b3JlZFN0YXRlBAROARABEBBMaXZlAAAAMFBlbmRpbmdQYXVzZQgBMHNjaGVkdWxlZF9hdBABBE4AARRkZWxheRABBE4AAQAYUGF1c2VkAAIANFBlbmRpbmdSZXN1bWUIATBzY2hlZHVsZWRfYXQQAQROAAEUZGVsYXkQAQROAAMAAFkJCDhwYWxsZXRfZ3JhbmRwYUxTdG9yZWRQZW5kaW5nQ2hhbmdlCAROARAUTGltaXQAABABMHNjaGVkdWxlZF9hdBABBE4AARRkZWxheRABBE4AAUBuZXh0X2F1dGhvcml0aWVzXQkBbEJvdW5kZWRBdXRob3JpdHlMaXN0PExpbWl0PgABGGZvcmNlZGECASRPcHRpb248Tj4AAF0JDExib3VuZGVkX2NvbGxlY3Rpb25zQHdlYWtfYm91bmRlZF92ZWM4V2Vha0JvdW5kZWRWZWMIBFQB0ARTAAAEAMwBGFZlYzxUPgAAYQkMOHBhbGxldF9ncmFuZHBhGHBhbGxldBRFcnJvcgQEVAABHCxQYXVzZUZhaWxlZAAACAUBQXR0ZW1wdCB0byBzaWduYWwgR1JBTkRQQSBwYXVzZSB3aGVuIHRoZSBhdXRob3JpdHkgc2V0IGlzbid0IGxpdmWkKGVpdGhlciBwYXVzZWQgb3IgYWxyZWFkeSBwZW5kaW5nIHBhdXNlKS4wUmVzdW1lRmFpbGVkAAEIEQFBdHRlbXB0IHRvIHNpZ25hbCBHUkFORFBBIHJlc3VtZSB3aGVuIHRoZSBhdXRob3JpdHkgc2V0IGlzbid0IHBhdXNlZKAoZWl0aGVyIGxpdmUgb3IgYWxyZWFkeSBwZW5kaW5nIHJlc3VtZSkuNENoYW5nZVBlbmRpbmcAAgToQXR0ZW1wdCB0byBzaWduYWwgR1JBTkRQQSBjaGFuZ2Ugd2l0aCBvbmUgYWxyZWFkeSBwZW5kaW5nLhxUb29Tb29uAAMEvENhbm5vdCBzaWduYWwgZm9yY2VkIGNoYW5nZSBzbyBzb29uIGFmdGVyIGxhc3QuYEludmFsaWRLZXlPd25lcnNoaXBQcm9vZgAEBDEBQSBrZXkgb3duZXJzaGlwIHByb29mIHByb3ZpZGVkIGFzIHBhcnQgb2YgYW4gZXF1aXZvY2F0aW9uIHJlcG9ydCBpcyBpbnZhbGlkLmBJbnZhbGlkRXF1aXZvY2F0aW9uUHJvb2YABQQxAUFuIGVxdWl2b2NhdGlvbiBwcm9vZiBwcm92aWRlZCBhcyBwYXJ0IG9mIGFuIGVxdWl2b2NhdGlvbiByZXBvcnQgaXMgaW52YWxpZC5YRHVwbGljYXRlT2ZmZW5jZVJlcG9ydAAGBBUBQSBnaXZlbiBlcXVpdm9jYXRpb24gcmVwb3J0IGlzIHZhbGlkIGJ1dCBhbHJlYWR5IHByZXZpb3VzbHkgcmVwb3J0ZWQuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LmUJDExib3VuZGVkX2NvbGxlY3Rpb25zQHdlYWtfYm91bmRlZF92ZWM4V2Vha0JvdW5kZWRWZWMIBFQBJQIEUwAABABpCQEYVmVjPFQ+AABpCQAAAiUCAG0JCDxwYWxsZXRfdHJlYXN1cnkgUHJvcG9zYWwIJEFjY291bnRJZAEAHEJhbGFuY2UBGAAQASBwcm9wb3NlcgABJEFjY291bnRJZAABFHZhbHVlGAEcQmFsYW5jZQABLGJlbmVmaWNpYXJ5AAEkQWNjb3VudElkAAEQYm9uZBgBHEJhbGFuY2UAAHEJDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBEARTAAAEAOUBARhWZWM8VD4AAHUJCDxwYWxsZXRfdHJlYXN1cnksU3BlbmRTdGF0dXMUJEFzc2V0S2luZAHcMEFzc2V0QmFsYW5jZQEYLEJlbmVmaWNpYXJ5AUUBLEJsb2NrTnVtYmVyARAkUGF5bWVudElkATAAGAEoYXNzZXRfa2luZNwBJEFzc2V0S2luZAABGGFtb3VudBgBMEFzc2V0QmFsYW5jZQABLGJlbmVmaWNpYXJ5RQEBLEJlbmVmaWNpYXJ5AAEodmFsaWRfZnJvbRABLEJsb2NrTnVtYmVyAAEkZXhwaXJlX2F0EAEsQmxvY2tOdW1iZXIAARhzdGF0dXN5CQFcUGF5bWVudFN0YXRlPFBheW1lbnRJZD4AAHkJCDxwYWxsZXRfdHJlYXN1cnkwUGF5bWVudFN0YXRlBAhJZAEwAQwcUGVuZGluZwAAACRBdHRlbXB0ZWQEAQhpZDABCElkAAEAGEZhaWxlZAACAAB9CQw0c3BfYXJpdGhtZXRpYyhwZXJfdGhpbmdzHFBlcm1pbGwAAAQAEAEMdTMyAACBCQg0ZnJhbWVfc3VwcG9ydCBQYWxsZXRJZAAABACxBQEcW3U4OyA4XQAAhQkMPHBhbGxldF90cmVhc3VyeRhwYWxsZXQURXJyb3IIBFQABEkAASwwSW52YWxpZEluZGV4AAAErE5vIHByb3Bvc2FsLCBib3VudHkgb3Igc3BlbmQgYXQgdGhhdCBpbmRleC5AVG9vTWFueUFwcHJvdmFscwABBIBUb28gbWFueSBhcHByb3ZhbHMgaW4gdGhlIHF1ZXVlLlhJbnN1ZmZpY2llbnRQZXJtaXNzaW9uAAIIRQFUaGUgc3BlbmQgb3JpZ2luIGlzIHZhbGlkIGJ1dCB0aGUgYW1vdW50IGl0IGlzIGFsbG93ZWQgdG8gc3BlbmQgaXMgbG93ZXIgdGhhbiB0aGVMYW1vdW50IHRvIGJlIHNwZW50LkxQcm9wb3NhbE5vdEFwcHJvdmVkAAMEfFByb3Bvc2FsIGhhcyBub3QgYmVlbiBhcHByb3ZlZC5YRmFpbGVkVG9Db252ZXJ0QmFsYW5jZQAEBFEBVGhlIGJhbGFuY2Ugb2YgdGhlIGFzc2V0IGtpbmQgaXMgbm90IGNvbnZlcnRpYmxlIHRvIHRoZSBiYWxhbmNlIG9mIHRoZSBuYXRpdmUgYXNzZXQuMFNwZW5kRXhwaXJlZAAFBLBUaGUgc3BlbmQgaGFzIGV4cGlyZWQgYW5kIGNhbm5vdCBiZSBjbGFpbWVkLixFYXJseVBheW91dAAGBKRUaGUgc3BlbmQgaXMgbm90IHlldCBlbGlnaWJsZSBmb3IgcGF5b3V0LkBBbHJlYWR5QXR0ZW1wdGVkAAcEnFRoZSBwYXltZW50IGhhcyBhbHJlYWR5IGJlZW4gYXR0ZW1wdGVkLixQYXlvdXRFcnJvcgAIBMxUaGVyZSB3YXMgc29tZSBpc3N1ZSB3aXRoIHRoZSBtZWNoYW5pc20gb2YgcGF5bWVudC4wTm90QXR0ZW1wdGVkAAkEpFRoZSBwYXlvdXQgd2FzIG5vdCB5ZXQgYXR0ZW1wdGVkL2NsYWltZWQuMEluY29uY2x1c2l2ZQAKBMRUaGUgcGF5bWVudCBoYXMgbmVpdGhlciBmYWlsZWQgbm9yIHN1Y2NlZWRlZCB5ZXQuBHhFcnJvciBmb3IgdGhlIHRyZWFzdXJ5IHBhbGxldC6JCQAABAgAbQEAjQkMYHBhbGxldF9jb252aWN0aW9uX3ZvdGluZxB2b3RlGFZvdGluZxQcQmFsYW5jZQEYJEFjY291bnRJZAEALEJsb2NrTnVtYmVyARAkUG9sbEluZGV4ARAgTWF4Vm90ZXMAAQgcQ2FzdGluZwQAkQkByENhc3Rpbmc8QmFsYW5jZSwgQmxvY2tOdW1iZXIsIFBvbGxJbmRleCwgTWF4Vm90ZXM+AAAAKERlbGVnYXRpbmcEAKkJAaxEZWxlZ2F0aW5nPEJhbGFuY2UsIEFjY291bnRJZCwgQmxvY2tOdW1iZXI+AAEAAJEJDGBwYWxsZXRfY29udmljdGlvbl92b3RpbmcQdm90ZRxDYXN0aW5nEBxCYWxhbmNlARgsQmxvY2tOdW1iZXIBECRQb2xsSW5kZXgBECBNYXhWb3RlcwAADAEUdm90ZXOVCQHcQm91bmRlZFZlYzwoUG9sbEluZGV4LCBBY2NvdW50Vm90ZTxCYWxhbmNlPiksIE1heFZvdGVzPgABLGRlbGVnYXRpb25zoQkBUERlbGVnYXRpb25zPEJhbGFuY2U+AAEUcHJpb3KlCQF8UHJpb3JMb2NrPEJsb2NrTnVtYmVyLCBCYWxhbmNlPgAAlQkMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAGZCQRTAAAEAJ0JARhWZWM8VD4AAJkJAAAECBBpAgCdCQAAApkJAKEJDGBwYWxsZXRfY29udmljdGlvbl92b3RpbmcUdHlwZXMsRGVsZWdhdGlvbnMEHEJhbGFuY2UBGAAIARR2b3RlcxgBHEJhbGFuY2UAARxjYXBpdGFsGAEcQmFsYW5jZQAApQkMYHBhbGxldF9jb252aWN0aW9uX3ZvdGluZxB2b3RlJFByaW9yTG9jawgsQmxvY2tOdW1iZXIBEBxCYWxhbmNlARgACAAQASxCbG9ja051bWJlcgAAGAEcQmFsYW5jZQAAqQkMYHBhbGxldF9jb252aWN0aW9uX3ZvdGluZxB2b3RlKERlbGVnYXRpbmcMHEJhbGFuY2UBGCRBY2NvdW50SWQBACxCbG9ja051bWJlcgEQABQBHGJhbGFuY2UYARxCYWxhbmNlAAEYdGFyZ2V0AAEkQWNjb3VudElkAAEoY29udmljdGlvbnECAShDb252aWN0aW9uAAEsZGVsZWdhdGlvbnOhCQFQRGVsZWdhdGlvbnM8QmFsYW5jZT4AARRwcmlvcqUJAXxQcmlvckxvY2s8QmxvY2tOdW1iZXIsIEJhbGFuY2U+AACtCQxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAbEJBFMAAAQAtQkBGFZlYzxUPgAAsQkAAAQIbQEYALUJAAACsQkAuQkMYHBhbGxldF9jb252aWN0aW9uX3ZvdGluZxhwYWxsZXQURXJyb3IIBFQABEkAATAoTm90T25nb2luZwAABFBQb2xsIGlzIG5vdCBvbmdvaW5nLiBOb3RWb3RlcgABBKxUaGUgZ2l2ZW4gYWNjb3VudCBkaWQgbm90IHZvdGUgb24gdGhlIHBvbGwuME5vUGVybWlzc2lvbgACBMhUaGUgYWN0b3IgaGFzIG5vIHBlcm1pc3Npb24gdG8gY29uZHVjdCB0aGUgYWN0aW9uLjxOb1Blcm1pc3Npb25ZZXQAAwRZAVRoZSBhY3RvciBoYXMgbm8gcGVybWlzc2lvbiB0byBjb25kdWN0IHRoZSBhY3Rpb24gcmlnaHQgbm93IGJ1dCB3aWxsIGRvIGluIHRoZSBmdXR1cmUuREFscmVhZHlEZWxlZ2F0aW5nAAQEiFRoZSBhY2NvdW50IGlzIGFscmVhZHkgZGVsZWdhdGluZy40QWxyZWFkeVZvdGluZwAFCFUBVGhlIGFjY291bnQgY3VycmVudGx5IGhhcyB2b3RlcyBhdHRhY2hlZCB0byBpdCBhbmQgdGhlIG9wZXJhdGlvbiBjYW5ub3Qgc3VjY2VlZCB1bnRpbKB0aGVzZSBhcmUgcmVtb3ZlZCB0aHJvdWdoIGByZW1vdmVfdm90ZWAuREluc3VmZmljaWVudEZ1bmRzAAYE/FRvbyBoaWdoIGEgYmFsYW5jZSB3YXMgcHJvdmlkZWQgdGhhdCB0aGUgYWNjb3VudCBjYW5ub3QgYWZmb3JkLjROb3REZWxlZ2F0aW5nAAcEoFRoZSBhY2NvdW50IGlzIG5vdCBjdXJyZW50bHkgZGVsZWdhdGluZy4gTm9uc2Vuc2UACASURGVsZWdhdGlvbiB0byBvbmVzZWxmIG1ha2VzIG5vIHNlbnNlLjxNYXhWb3Rlc1JlYWNoZWQACQSATWF4aW11bSBudW1iZXIgb2Ygdm90ZXMgcmVhY2hlZC4sQ2xhc3NOZWVkZWQACgQ5AVRoZSBjbGFzcyBtdXN0IGJlIHN1cHBsaWVkIHNpbmNlIGl0IGlzIG5vdCBlYXNpbHkgZGV0ZXJtaW5hYmxlIGZyb20gdGhlIHN0YXRlLiBCYWRDbGFzcwALBIRUaGUgY2xhc3MgSUQgc3VwcGxpZWQgaXMgaW52YWxpZC4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQuvQkMQHBhbGxldF9yZWZlcmVuZGEUdHlwZXM4UmVmZXJlbmR1bUluZm8gHFRyYWNrSWQBbQE0UnVudGltZU9yaWdpbgF9AhhNb21lbnQBEBBDYWxsAXEBHEJhbGFuY2UBGBRUYWxseQEBByRBY2NvdW50SWQBADxTY2hlZHVsZUFkZHJlc3MBgAEYHE9uZ29pbmcEAMEJAY0BUmVmZXJlbmR1bVN0YXR1czxUcmFja0lkLCBSdW50aW1lT3JpZ2luLCBNb21lbnQsIENhbGwsIEJhbGFuY2UsIFRhbGx5LApBY2NvdW50SWQsIFNjaGVkdWxlQWRkcmVzcyw+AAAAIEFwcHJvdmVkDAAQARhNb21lbnQAAMkJAYxPcHRpb248RGVwb3NpdDxBY2NvdW50SWQsIEJhbGFuY2U+PgAAyQkBjE9wdGlvbjxEZXBvc2l0PEFjY291bnRJZCwgQmFsYW5jZT4+AAEAIFJlamVjdGVkDAAQARhNb21lbnQAAMkJAYxPcHRpb248RGVwb3NpdDxBY2NvdW50SWQsIEJhbGFuY2U+PgAAyQkBjE9wdGlvbjxEZXBvc2l0PEFjY291bnRJZCwgQmFsYW5jZT4+AAIAJENhbmNlbGxlZAwAEAEYTW9tZW50AADJCQGMT3B0aW9uPERlcG9zaXQ8QWNjb3VudElkLCBCYWxhbmNlPj4AAMkJAYxPcHRpb248RGVwb3NpdDxBY2NvdW50SWQsIEJhbGFuY2U+PgADACBUaW1lZE91dAwAEAEYTW9tZW50AADJCQGMT3B0aW9uPERlcG9zaXQ8QWNjb3VudElkLCBCYWxhbmNlPj4AAMkJAYxPcHRpb248RGVwb3NpdDxBY2NvdW50SWQsIEJhbGFuY2U+PgAEABhLaWxsZWQEABABGE1vbWVudAAFAADBCQxAcGFsbGV0X3JlZmVyZW5kYRR0eXBlc0BSZWZlcmVuZHVtU3RhdHVzIBxUcmFja0lkAW0BNFJ1bnRpbWVPcmlnaW4BfQIYTW9tZW50ARAQQ2FsbAFxARxCYWxhbmNlARgUVGFsbHkBAQckQWNjb3VudElkAQA8U2NoZWR1bGVBZGRyZXNzAYAALAEUdHJhY2ttAQEcVHJhY2tJZAABGG9yaWdpbn0CATRSdW50aW1lT3JpZ2luAAEgcHJvcG9zYWxxAQEQQ2FsbAABJGVuYWN0bWVudJkCAVBEaXNwYXRjaFRpbWU8TW9tZW50PgABJHN1Ym1pdHRlZBABGE1vbWVudAABSHN1Ym1pc3Npb25fZGVwb3NpdMUJAWxEZXBvc2l0PEFjY291bnRJZCwgQmFsYW5jZT4AAUBkZWNpc2lvbl9kZXBvc2l0yQkBjE9wdGlvbjxEZXBvc2l0PEFjY291bnRJZCwgQmFsYW5jZT4+AAEgZGVjaWRpbmfNCQF4T3B0aW9uPERlY2lkaW5nU3RhdHVzPE1vbWVudD4+AAEUdGFsbHkBBwEUVGFsbHkAASBpbl9xdWV1ZSABEGJvb2wAARRhbGFybdUJAYRPcHRpb248KE1vbWVudCwgU2NoZWR1bGVBZGRyZXNzKT4AAMUJDEBwYWxsZXRfcmVmZXJlbmRhFHR5cGVzHERlcG9zaXQIJEFjY291bnRJZAEAHEJhbGFuY2UBGAAIAQx3aG8AASRBY2NvdW50SWQAARhhbW91bnQYARxCYWxhbmNlAADJCQQYT3B0aW9uBARUAcUJAQgQTm9uZQAAABBTb21lBADFCQAAAQAAzQkEGE9wdGlvbgQEVAHRCQEIEE5vbmUAAAAQU29tZQQA0QkAAAEAANEJDEBwYWxsZXRfcmVmZXJlbmRhFHR5cGVzOERlY2lkaW5nU3RhdHVzBCxCbG9ja051bWJlcgEQAAgBFHNpbmNlEAEsQmxvY2tOdW1iZXIAAShjb25maXJtaW5nYQIBTE9wdGlvbjxCbG9ja051bWJlcj4AANUJBBhPcHRpb24EBFQB2QkBCBBOb25lAAAAEFNvbWUEANkJAAABAADZCQAABAgQgADdCQxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAeEJBFMAAAQA5QkBGFZlYzxUPgAA4QkAAAQIEBgA5QkAAALhCQDpCQAAAu0JAO0JAAAECG0B8QkA8QkMQHBhbGxldF9yZWZlcmVuZGEUdHlwZXMkVHJhY2tJbmZvCBxCYWxhbmNlARgYTW9tZW50ARAAJAEQbmFtZdEHATAmJ3N0YXRpYyBzdHIAATBtYXhfZGVjaWRpbmcQAQx1MzIAAUBkZWNpc2lvbl9kZXBvc2l0GAEcQmFsYW5jZQABOHByZXBhcmVfcGVyaW9kEAEYTW9tZW50AAE8ZGVjaXNpb25fcGVyaW9kEAEYTW9tZW50AAE4Y29uZmlybV9wZXJpb2QQARhNb21lbnQAAVBtaW5fZW5hY3RtZW50X3BlcmlvZBABGE1vbWVudAABMG1pbl9hcHByb3ZhbPUJARRDdXJ2ZQABLG1pbl9zdXBwb3J09QkBFEN1cnZlAAD1CQxAcGFsbGV0X3JlZmVyZW5kYRR0eXBlcxRDdXJ2ZQABDEBMaW5lYXJEZWNyZWFzaW5nDAEYbGVuZ3RorAEcUGVyYmlsbAABFGZsb29yrAEcUGVyYmlsbAABEGNlaWysARxQZXJiaWxsAAAARFN0ZXBwZWREZWNyZWFzaW5nEAEUYmVnaW6sARxQZXJiaWxsAAEMZW5krAEcUGVyYmlsbAABEHN0ZXCsARxQZXJiaWxsAAEYcGVyaW9krAEcUGVyYmlsbAABAChSZWNpcHJvY2FsDAEYZmFjdG9y+QkBIEZpeGVkSTY0AAEgeF9vZmZzZXT5CQEgRml4ZWRJNjQAASB5X29mZnNldPkJASBGaXhlZEk2NAACAAD5CQw0c3BfYXJpdGhtZXRpYyxmaXhlZF9wb2ludCBGaXhlZEk2NAAABAD9CQEMaTY0AAD9CQAABQwAAQoMQHBhbGxldF9yZWZlcmVuZGEYcGFsbGV0FEVycm9yCARUAARJAAE4KE5vdE9uZ29pbmcAAARoUmVmZXJlbmR1bSBpcyBub3Qgb25nb2luZy4oSGFzRGVwb3NpdAABBLhSZWZlcmVuZHVtJ3MgZGVjaXNpb24gZGVwb3NpdCBpcyBhbHJlYWR5IHBhaWQuIEJhZFRyYWNrAAIEnFRoZSB0cmFjayBpZGVudGlmaWVyIGdpdmVuIHdhcyBpbnZhbGlkLhBGdWxsAAMEMQFUaGVyZSBhcmUgYWxyZWFkeSBhIGZ1bGwgY29tcGxlbWVudCBvZiByZWZlcmVuZGEgaW4gcHJvZ3Jlc3MgZm9yIHRoaXMgdHJhY2suKFF1ZXVlRW1wdHkABASAVGhlIHF1ZXVlIG9mIHRoZSB0cmFjayBpcyBlbXB0eS40QmFkUmVmZXJlbmR1bQAFBORUaGUgcmVmZXJlbmR1bSBpbmRleCBwcm92aWRlZCBpcyBpbnZhbGlkIGluIHRoaXMgY29udGV4dC4sTm90aGluZ1RvRG8ABgSsVGhlcmUgd2FzIG5vdGhpbmcgdG8gZG8gaW4gdGhlIGFkdmFuY2VtZW50LhxOb1RyYWNrAAcEoE5vIHRyYWNrIGV4aXN0cyBmb3IgdGhlIHByb3Bvc2FsIG9yaWdpbi4oVW5maW5pc2hlZAAIBAEBQW55IGRlcG9zaXQgY2Fubm90IGJlIHJlZnVuZGVkIHVudGlsIGFmdGVyIHRoZSBkZWNpc2lvbiBpcyBvdmVyLjBOb1Blcm1pc3Npb24ACQSoVGhlIGRlcG9zaXQgcmVmdW5kZXIgaXMgbm90IHRoZSBkZXBvc2l0b3IuJE5vRGVwb3NpdAAKBMxUaGUgZGVwb3NpdCBjYW5ub3QgYmUgcmVmdW5kZWQgc2luY2Ugbm9uZSB3YXMgbWFkZS4kQmFkU3RhdHVzAAsE0FRoZSByZWZlcmVuZHVtIHN0YXR1cyBpcyBpbnZhbGlkIGZvciB0aGlzIG9wZXJhdGlvbi5AUHJlaW1hZ2VOb3RFeGlzdAAMBHBUaGUgcHJlaW1hZ2UgZG9lcyBub3QgZXhpc3QuhFByZWltYWdlU3RvcmVkV2l0aERpZmZlcmVudExlbmd0aAANBBUBVGhlIHByZWltYWdlIGlzIHN0b3JlZCB3aXRoIGEgZGlmZmVyZW50IGxlbmd0aCB0aGFuIHRoZSBvbmUgcHJvdmlkZWQuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LgUKDEBwYWxsZXRfd2hpdGVsaXN0GHBhbGxldBRFcnJvcgQEVAABFExVbmF2YWlsYWJsZVByZUltYWdlAAAEyFRoZSBwcmVpbWFnZSBvZiB0aGUgY2FsbCBoYXNoIGNvdWxkIG5vdCBiZSBsb2FkZWQuPFVuZGVjb2RhYmxlQ2FsbAABBHhUaGUgY2FsbCBjb3VsZCBub3QgYmUgZGVjb2RlZC5gSW52YWxpZENhbGxXZWlnaHRXaXRuZXNzAAIE7FRoZSB3ZWlnaHQgb2YgdGhlIGRlY29kZWQgY2FsbCB3YXMgaGlnaGVyIHRoYW4gdGhlIHdpdG5lc3MuUENhbGxJc05vdFdoaXRlbGlzdGVkAAMEdFRoZSBjYWxsIHdhcyBub3Qgd2hpdGVsaXN0ZWQuWENhbGxBbHJlYWR5V2hpdGVsaXN0ZWQABASgVGhlIGNhbGwgd2FzIGFscmVhZHkgd2hpdGVsaXN0ZWQ7IE5vLU9wLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC4JChBccG9sa2Fkb3RfcnVudGltZV9jb21tb24YY2xhaW1zGHBhbGxldBRFcnJvcgQEVAABGGBJbnZhbGlkRXRoZXJldW1TaWduYXR1cmUAAARsSW52YWxpZCBFdGhlcmV1bSBzaWduYXR1cmUuQFNpZ25lckhhc05vQ2xhaW0AAQR4RXRoZXJldW0gYWRkcmVzcyBoYXMgbm8gY2xhaW0uQFNlbmRlckhhc05vQ2xhaW0AAgSwQWNjb3VudCBJRCBzZW5kaW5nIHRyYW5zYWN0aW9uIGhhcyBubyBjbGFpbS4wUG90VW5kZXJmbG93AAMISQFUaGVyZSdzIG5vdCBlbm91Z2ggaW4gdGhlIHBvdCB0byBwYXkgb3V0IHNvbWUgdW52ZXN0ZWQgYW1vdW50LiBHZW5lcmFsbHkgaW1wbGllcyBhMGxvZ2ljIGVycm9yLkBJbnZhbGlkU3RhdGVtZW50AAQEkEEgbmVlZGVkIHN0YXRlbWVudCB3YXMgbm90IGluY2x1ZGVkLkxWZXN0ZWRCYWxhbmNlRXhpc3RzAAUEpFRoZSBhY2NvdW50IGFscmVhZHkgaGFzIGEgdmVzdGVkIGJhbGFuY2UuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0Lg0KDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQB9QIEUwAABAARCgEYVmVjPFQ+AAARCgAAAvUCABUKCDhwYWxsZXRfdmVzdGluZyBSZWxlYXNlcwABCAhWMAAAAAhWMQABAAAZCgw4cGFsbGV0X3Zlc3RpbmcYcGFsbGV0FEVycm9yBARUAAEUKE5vdFZlc3RpbmcAAASEVGhlIGFjY291bnQgZ2l2ZW4gaXMgbm90IHZlc3RpbmcuVEF0TWF4VmVzdGluZ1NjaGVkdWxlcwABCCUBVGhlIGFjY291bnQgYWxyZWFkeSBoYXMgYE1heFZlc3RpbmdTY2hlZHVsZXNgIGNvdW50IG9mIHNjaGVkdWxlcyBhbmQgdGh1c1EBY2Fubm90IGFkZCBhbm90aGVyIG9uZS4gQ29uc2lkZXIgbWVyZ2luZyBleGlzdGluZyBzY2hlZHVsZXMgaW4gb3JkZXIgdG8gYWRkIGFub3RoZXIuJEFtb3VudExvdwACBAUBQW1vdW50IGJlaW5nIHRyYW5zZmVycmVkIGlzIHRvbyBsb3cgdG8gY3JlYXRlIGEgdmVzdGluZyBzY2hlZHVsZS5gU2NoZWR1bGVJbmRleE91dE9mQm91bmRzAAME0EFuIGluZGV4IHdhcyBvdXQgb2YgYm91bmRzIG9mIHRoZSB2ZXN0aW5nIHNjaGVkdWxlcy5USW52YWxpZFNjaGVkdWxlUGFyYW1zAAQEDQFGYWlsZWQgdG8gY3JlYXRlIGEgbmV3IHNjaGVkdWxlIGJlY2F1c2Ugc29tZSBwYXJhbWV0ZXIgd2FzIGludmFsaWQuBHRFcnJvciBmb3IgdGhlIHZlc3RpbmcgcGFsbGV0Lh0KDDhwYWxsZXRfdXRpbGl0eRhwYWxsZXQURXJyb3IEBFQAAQQwVG9vTWFueUNhbGxzAAAEXFRvbyBtYW55IGNhbGxzIGJhdGNoZWQuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LiEKAAAECCUKGAAlCgxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUASkKBFMAAAQALQoBGFZlYzxUPgAAKQoIMHBhbGxldF9wcm94eTxQcm94eURlZmluaXRpb24MJEFjY291bnRJZAEAJFByb3h5VHlwZQEJAyxCbG9ja051bWJlcgEQAAwBIGRlbGVnYXRlAAEkQWNjb3VudElkAAEocHJveHlfdHlwZQkDASRQcm94eVR5cGUAARRkZWxheRABLEJsb2NrTnVtYmVyAAAtCgAAAikKADEKAAAECDUKGAA1CgxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUATkKBFMAAAQAPQoBGFZlYzxUPgAAOQoIMHBhbGxldF9wcm94eTBBbm5vdW5jZW1lbnQMJEFjY291bnRJZAEAEEhhc2gBNCxCbG9ja051bWJlcgEQAAwBEHJlYWwAASRBY2NvdW50SWQAASRjYWxsX2hhc2g0ARBIYXNoAAEYaGVpZ2h0EAEsQmxvY2tOdW1iZXIAAD0KAAACOQoAQQoMMHBhbGxldF9wcm94eRhwYWxsZXQURXJyb3IEBFQAASAcVG9vTWFueQAABCEBVGhlcmUgYXJlIHRvbyBtYW55IHByb3hpZXMgcmVnaXN0ZXJlZCBvciB0b28gbWFueSBhbm5vdW5jZW1lbnRzIHBlbmRpbmcuIE5vdEZvdW5kAAEEdFByb3h5IHJlZ2lzdHJhdGlvbiBub3QgZm91bmQuIE5vdFByb3h5AAIEzFNlbmRlciBpcyBub3QgYSBwcm94eSBvZiB0aGUgYWNjb3VudCB0byBiZSBwcm94aWVkLixVbnByb3h5YWJsZQADBCEBQSBjYWxsIHdoaWNoIGlzIGluY29tcGF0aWJsZSB3aXRoIHRoZSBwcm94eSB0eXBlJ3MgZmlsdGVyIHdhcyBhdHRlbXB0ZWQuJER1cGxpY2F0ZQAEBGxBY2NvdW50IGlzIGFscmVhZHkgYSBwcm94eS4wTm9QZXJtaXNzaW9uAAUEFQFDYWxsIG1heSBub3QgYmUgbWFkZSBieSBwcm94eSBiZWNhdXNlIGl0IG1heSBlc2NhbGF0ZSBpdHMgcHJpdmlsZWdlcy4sVW5hbm5vdW5jZWQABgTQQW5ub3VuY2VtZW50LCBpZiBtYWRlIGF0IGFsbCwgd2FzIG1hZGUgdG9vIHJlY2VudGx5LixOb1NlbGZQcm94eQAHBGRDYW5ub3QgYWRkIHNlbGYgYXMgcHJveHkuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LkUKAAAECAAEAEkKCDxwYWxsZXRfbXVsdGlzaWcgTXVsdGlzaWcQLEJsb2NrTnVtYmVyARAcQmFsYW5jZQEYJEFjY291bnRJZAEAME1heEFwcHJvdmFscwAAEAEQd2hlbhUDAVhUaW1lcG9pbnQ8QmxvY2tOdW1iZXI+AAEcZGVwb3NpdBgBHEJhbGFuY2UAASRkZXBvc2l0b3IAASRBY2NvdW50SWQAASRhcHByb3ZhbHNNCgGMQm91bmRlZFZlYzxBY2NvdW50SWQsIE1heEFwcHJvdmFscz4AAE0KDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBAARTAAAEANEBARhWZWM8VD4AAFEKDDxwYWxsZXRfbXVsdGlzaWcYcGFsbGV0FEVycm9yBARUAAE4QE1pbmltdW1UaHJlc2hvbGQAAAR8VGhyZXNob2xkIG11c3QgYmUgMiBvciBncmVhdGVyLjxBbHJlYWR5QXBwcm92ZWQAAQSsQ2FsbCBpcyBhbHJlYWR5IGFwcHJvdmVkIGJ5IHRoaXMgc2lnbmF0b3J5LkROb0FwcHJvdmFsc05lZWRlZAACBJxDYWxsIGRvZXNuJ3QgbmVlZCBhbnkgKG1vcmUpIGFwcHJvdmFscy5EVG9vRmV3U2lnbmF0b3JpZXMAAwSoVGhlcmUgYXJlIHRvbyBmZXcgc2lnbmF0b3JpZXMgaW4gdGhlIGxpc3QuSFRvb01hbnlTaWduYXRvcmllcwAEBKxUaGVyZSBhcmUgdG9vIG1hbnkgc2lnbmF0b3JpZXMgaW4gdGhlIGxpc3QuVFNpZ25hdG9yaWVzT3V0T2ZPcmRlcgAFBA0BVGhlIHNpZ25hdG9yaWVzIHdlcmUgcHJvdmlkZWQgb3V0IG9mIG9yZGVyOyB0aGV5IHNob3VsZCBiZSBvcmRlcmVkLkxTZW5kZXJJblNpZ25hdG9yaWVzAAYEDQFUaGUgc2VuZGVyIHdhcyBjb250YWluZWQgaW4gdGhlIG90aGVyIHNpZ25hdG9yaWVzOyBpdCBzaG91bGRuJ3QgYmUuIE5vdEZvdW5kAAcE3E11bHRpc2lnIG9wZXJhdGlvbiBub3QgZm91bmQgd2hlbiBhdHRlbXB0aW5nIHRvIGNhbmNlbC4gTm90T3duZXIACAQtAU9ubHkgdGhlIGFjY291bnQgdGhhdCBvcmlnaW5hbGx5IGNyZWF0ZWQgdGhlIG11bHRpc2lnIGlzIGFibGUgdG8gY2FuY2VsIGl0LixOb1RpbWVwb2ludAAJBB0BTm8gdGltZXBvaW50IHdhcyBnaXZlbiwgeWV0IHRoZSBtdWx0aXNpZyBvcGVyYXRpb24gaXMgYWxyZWFkeSB1bmRlcndheS44V3JvbmdUaW1lcG9pbnQACgQtAUEgZGlmZmVyZW50IHRpbWVwb2ludCB3YXMgZ2l2ZW4gdG8gdGhlIG11bHRpc2lnIG9wZXJhdGlvbiB0aGF0IGlzIHVuZGVyd2F5LkxVbmV4cGVjdGVkVGltZXBvaW50AAsE9EEgdGltZXBvaW50IHdhcyBnaXZlbiwgeWV0IG5vIG11bHRpc2lnIG9wZXJhdGlvbiBpcyB1bmRlcndheS48TWF4V2VpZ2h0VG9vTG93AAwE0FRoZSBtYXhpbXVtIHdlaWdodCBpbmZvcm1hdGlvbiBwcm92aWRlZCB3YXMgdG9vIGxvdy40QWxyZWFkeVN0b3JlZAANBKBUaGUgZGF0YSB0byBiZSBzdG9yZWQgaXMgYWxyZWFkeSBzdG9yZWQuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LlUKCDxwYWxsZXRfYm91bnRpZXMYQm91bnR5DCRBY2NvdW50SWQBABxCYWxhbmNlARgsQmxvY2tOdW1iZXIBEAAYASBwcm9wb3NlcgABJEFjY291bnRJZAABFHZhbHVlGAEcQmFsYW5jZQABDGZlZRgBHEJhbGFuY2UAATxjdXJhdG9yX2RlcG9zaXQYARxCYWxhbmNlAAEQYm9uZBgBHEJhbGFuY2UAARhzdGF0dXNZCgGQQm91bnR5U3RhdHVzPEFjY291bnRJZCwgQmxvY2tOdW1iZXI+AABZCgg8cGFsbGV0X2JvdW50aWVzMEJvdW50eVN0YXR1cwgkQWNjb3VudElkAQAsQmxvY2tOdW1iZXIBEAEYIFByb3Bvc2VkAAAAIEFwcHJvdmVkAAEAGEZ1bmRlZAACADxDdXJhdG9yUHJvcG9zZWQEARxjdXJhdG9yAAEkQWNjb3VudElkAAMAGEFjdGl2ZQgBHGN1cmF0b3IAASRBY2NvdW50SWQAASh1cGRhdGVfZHVlEAEsQmxvY2tOdW1iZXIABAA0UGVuZGluZ1BheW91dAwBHGN1cmF0b3IAASRBY2NvdW50SWQAASxiZW5lZmljaWFyeQABJEFjY291bnRJZAABJHVubG9ja19hdBABLEJsb2NrTnVtYmVyAAUAAF0KDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBCARTAAAEADgBGFZlYzxUPgAAYQoMPHBhbGxldF9ib3VudGllcxhwYWxsZXQURXJyb3IIBFQABEkAASxwSW5zdWZmaWNpZW50UHJvcG9zZXJzQmFsYW5jZQAABHhQcm9wb3NlcidzIGJhbGFuY2UgaXMgdG9vIGxvdy4wSW52YWxpZEluZGV4AAEEkE5vIHByb3Bvc2FsIG9yIGJvdW50eSBhdCB0aGF0IGluZGV4LjBSZWFzb25Ub29CaWcAAgSEVGhlIHJlYXNvbiBnaXZlbiBpcyBqdXN0IHRvbyBiaWcuQFVuZXhwZWN0ZWRTdGF0dXMAAwSAVGhlIGJvdW50eSBzdGF0dXMgaXMgdW5leHBlY3RlZC44UmVxdWlyZUN1cmF0b3IABARcUmVxdWlyZSBib3VudHkgY3VyYXRvci4wSW52YWxpZFZhbHVlAAUEVEludmFsaWQgYm91bnR5IHZhbHVlLihJbnZhbGlkRmVlAAYETEludmFsaWQgYm91bnR5IGZlZS40UGVuZGluZ1BheW91dAAHCGxBIGJvdW50eSBwYXlvdXQgaXMgcGVuZGluZy74VG8gY2FuY2VsIHRoZSBib3VudHksIHlvdSBtdXN0IHVuYXNzaWduIGFuZCBzbGFzaCB0aGUgY3VyYXRvci4kUHJlbWF0dXJlAAgERQFUaGUgYm91bnRpZXMgY2Fubm90IGJlIGNsYWltZWQvY2xvc2VkIGJlY2F1c2UgaXQncyBzdGlsbCBpbiB0aGUgY291bnRkb3duIHBlcmlvZC5QSGFzQWN0aXZlQ2hpbGRCb3VudHkACQQFAVRoZSBib3VudHkgY2Fubm90IGJlIGNsb3NlZCBiZWNhdXNlIGl0IGhhcyBhY3RpdmUgY2hpbGQgYm91bnRpZXMuNFRvb01hbnlRdWV1ZWQACgSYVG9vIG1hbnkgYXBwcm92YWxzIGFyZSBhbHJlYWR5IHF1ZXVlZC4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQuZQoIVHBhbGxldF9jaGlsZF9ib3VudGllcyxDaGlsZEJvdW50eQwkQWNjb3VudElkAQAcQmFsYW5jZQEYLEJsb2NrTnVtYmVyARAAFAE0cGFyZW50X2JvdW50eRABLEJvdW50eUluZGV4AAEUdmFsdWUYARxCYWxhbmNlAAEMZmVlGAEcQmFsYW5jZQABPGN1cmF0b3JfZGVwb3NpdBgBHEJhbGFuY2UAARhzdGF0dXNpCgGkQ2hpbGRCb3VudHlTdGF0dXM8QWNjb3VudElkLCBCbG9ja051bWJlcj4AAGkKCFRwYWxsZXRfY2hpbGRfYm91bnRpZXNEQ2hpbGRCb3VudHlTdGF0dXMIJEFjY291bnRJZAEALEJsb2NrTnVtYmVyARABEBRBZGRlZAAAADxDdXJhdG9yUHJvcG9zZWQEARxjdXJhdG9yAAEkQWNjb3VudElkAAEAGEFjdGl2ZQQBHGN1cmF0b3IAASRBY2NvdW50SWQAAgA0UGVuZGluZ1BheW91dAwBHGN1cmF0b3IAASRBY2NvdW50SWQAASxiZW5lZmljaWFyeQABJEFjY291bnRJZAABJHVubG9ja19hdBABLEJsb2NrTnVtYmVyAAMAAG0KDFRwYWxsZXRfY2hpbGRfYm91bnRpZXMYcGFsbGV0FEVycm9yBARUAAEMVFBhcmVudEJvdW50eU5vdEFjdGl2ZQAABKRUaGUgcGFyZW50IGJvdW50eSBpcyBub3QgaW4gYWN0aXZlIHN0YXRlLmRJbnN1ZmZpY2llbnRCb3VudHlCYWxhbmNlAAEE5FRoZSBib3VudHkgYmFsYW5jZSBpcyBub3QgZW5vdWdoIHRvIGFkZCBuZXcgY2hpbGQtYm91bnR5LlBUb29NYW55Q2hpbGRCb3VudGllcwACBA0BTnVtYmVyIG9mIGNoaWxkIGJvdW50aWVzIGV4Y2VlZHMgbGltaXQgYE1heEFjdGl2ZUNoaWxkQm91bnR5Q291bnRgLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC5xCgiQcGFsbGV0X2VsZWN0aW9uX3Byb3ZpZGVyX211bHRpX3BoYXNlNFJlYWR5U29sdXRpb24IJEFjY291bnRJZAAoTWF4V2lubmVycwAADAEgc3VwcG9ydHN1CgGYQm91bmRlZFN1cHBvcnRzPEFjY291bnRJZCwgTWF4V2lubmVycz4AARRzY29yZfUDATRFbGVjdGlvblNjb3JlAAEcY29tcHV0ZVEHATxFbGVjdGlvbkNvbXB1dGUAAHUKDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBBQQEUwAABAABBAEYVmVjPFQ+AAB5CgiQcGFsbGV0X2VsZWN0aW9uX3Byb3ZpZGVyX211bHRpX3BoYXNlNFJvdW5kU25hcHNob3QIJEFjY291bnRJZAEAMERhdGFQcm92aWRlcgF9CgAIARh2b3RlcnOBCgFEVmVjPERhdGFQcm92aWRlcj4AARx0YXJnZXRz0QEBOFZlYzxBY2NvdW50SWQ+AAB9CgAABAwAMOUIAIEKAAACfQoAhQoMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAGJCgRTAAAEAI0KARhWZWM8VD4AAIkKAAAEDPUDEBAAjQoAAAKJCgCRCgyQcGFsbGV0X2VsZWN0aW9uX3Byb3ZpZGVyX211bHRpX3BoYXNlGHNpZ25lZEBTaWduZWRTdWJtaXNzaW9uDCRBY2NvdW50SWQBABxCYWxhbmNlARggU29sdXRpb24BKQMAEAEMd2hvAAEkQWNjb3VudElkAAEcZGVwb3NpdBgBHEJhbGFuY2UAATByYXdfc29sdXRpb24lAwFUUmF3U29sdXRpb248U29sdXRpb24+AAEgY2FsbF9mZWUYARxCYWxhbmNlAACVCgyQcGFsbGV0X2VsZWN0aW9uX3Byb3ZpZGVyX211bHRpX3BoYXNlGHBhbGxldBRFcnJvcgQEVAABPGhQcmVEaXNwYXRjaEVhcmx5U3VibWlzc2lvbgAABGRTdWJtaXNzaW9uIHdhcyB0b28gZWFybHkubFByZURpc3BhdGNoV3JvbmdXaW5uZXJDb3VudAABBIhXcm9uZyBudW1iZXIgb2Ygd2lubmVycyBwcmVzZW50ZWQuZFByZURpc3BhdGNoV2Vha1N1Ym1pc3Npb24AAgSQU3VibWlzc2lvbiB3YXMgdG9vIHdlYWssIHNjb3JlLXdpc2UuPFNpZ25lZFF1ZXVlRnVsbAADBEkBVGhlIHF1ZXVlIHdhcyBmdWxsLCBhbmQgdGhlIHNvbHV0aW9uIHdhcyBub3QgYmV0dGVyIHRoYW4gYW55IG9mIHRoZSBleGlzdGluZyBvbmVzLlhTaWduZWRDYW5ub3RQYXlEZXBvc2l0AAQElFRoZSBvcmlnaW4gZmFpbGVkIHRvIHBheSB0aGUgZGVwb3NpdC5QU2lnbmVkSW52YWxpZFdpdG5lc3MABQSgV2l0bmVzcyBkYXRhIHRvIGRpc3BhdGNoYWJsZSBpcyBpbnZhbGlkLkxTaWduZWRUb29NdWNoV2VpZ2h0AAYEuFRoZSBzaWduZWQgc3VibWlzc2lvbiBjb25zdW1lcyB0b28gbXVjaCB3ZWlnaHQ8T2N3Q2FsbFdyb25nRXJhAAcEmE9DVyBzdWJtaXR0ZWQgc29sdXRpb24gZm9yIHdyb25nIHJvdW5kXE1pc3NpbmdTbmFwc2hvdE1ldGFkYXRhAAgEqFNuYXBzaG90IG1ldGFkYXRhIHNob3VsZCBleGlzdCBidXQgZGlkbid0LlhJbnZhbGlkU3VibWlzc2lvbkluZGV4AAkE0GBTZWxmOjppbnNlcnRfc3VibWlzc2lvbmAgcmV0dXJuZWQgYW4gaW52YWxpZCBpbmRleC44Q2FsbE5vdEFsbG93ZWQACgSYVGhlIGNhbGwgaXMgbm90IGFsbG93ZWQgYXQgdGhpcyBwb2ludC44RmFsbGJhY2tGYWlsZWQACwRMVGhlIGZhbGxiYWNrIGZhaWxlZCxCb3VuZE5vdE1ldAAMBEhTb21lIGJvdW5kIG5vdCBtZXQ4VG9vTWFueVdpbm5lcnMADQScU3VibWl0dGVkIHNvbHV0aW9uIGhhcyB0b28gbWFueSB3aW5uZXJzZFByZURpc3BhdGNoRGlmZmVyZW50Um91bmQADgS4U3VibWlzc2lvbiB3YXMgcHJlcGFyZWQgZm9yIGEgZGlmZmVyZW50IHJvdW5kLgQNAUVycm9yIG9mIHRoZSBwYWxsZXQgdGhhdCBjYW4gYmUgcmV0dXJuZWQgaW4gcmVzcG9uc2UgdG8gZGlzcGF0Y2hlcy6ZCgxAcGFsbGV0X2JhZ3NfbGlzdBBsaXN0EE5vZGUIBFQABEkAABQBCGlkAAEwVDo6QWNjb3VudElkAAEQcHJldv0BAVBPcHRpb248VDo6QWNjb3VudElkPgABEG5leHT9AQFQT3B0aW9uPFQ6OkFjY291bnRJZD4AASRiYWdfdXBwZXIwASBUOjpTY29yZQABFHNjb3JlMAEgVDo6U2NvcmUAAJ0KDEBwYWxsZXRfYmFnc19saXN0EGxpc3QMQmFnCARUAARJAAAIARBoZWFk/QEBUE9wdGlvbjxUOjpBY2NvdW50SWQ+AAEQdGFpbP0BAVBPcHRpb248VDo6QWNjb3VudElkPgAAoQoAAAIwAKUKDEBwYWxsZXRfYmFnc19saXN0GHBhbGxldBRFcnJvcggEVAAESQABBBBMaXN0BACpCgEkTGlzdEVycm9yAAAEtEEgZXJyb3IgaW4gdGhlIGxpc3QgaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC6pCgxAcGFsbGV0X2JhZ3NfbGlzdBBsaXN0JExpc3RFcnJvcgABECREdXBsaWNhdGUAAAAoTm90SGVhdmllcgABADBOb3RJblNhbWVCYWcAAgAwTm9kZU5vdEZvdW5kAAMAAK0KCFxwYWxsZXRfbm9taW5hdGlvbl9wb29scyhQb29sTWVtYmVyBARUAAAQARxwb29sX2lkEAEYUG9vbElkAAEYcG9pbnRzGAEwQmFsYW5jZU9mPFQ+AAFwbGFzdF9yZWNvcmRlZF9yZXdhcmRfY291bnRlctEGAUBUOjpSZXdhcmRDb3VudGVyAAE4dW5ib25kaW5nX2VyYXOxCgHgQm91bmRlZEJUcmVlTWFwPEVyYUluZGV4LCBCYWxhbmNlT2Y8VD4sIFQ6Ok1heFVuYm9uZGluZz4AALEKDExib3VuZGVkX2NvbGxlY3Rpb25zRGJvdW5kZWRfYnRyZWVfbWFwPEJvdW5kZWRCVHJlZU1hcAwESwEQBFYBGARTAAAEALUKAThCVHJlZU1hcDxLLCBWPgAAtQoEIEJUcmVlTWFwCARLARAEVgEYAAQA5QkAAAC5CghccGFsbGV0X25vbWluYXRpb25fcG9vbHM8Qm9uZGVkUG9vbElubmVyBARUAAAUAShjb21taXNzaW9uvQoBNENvbW1pc3Npb248VD4AAThtZW1iZXJfY291bnRlchABDHUzMgABGHBvaW50cxgBMEJhbGFuY2VPZjxUPgABFHJvbGVzyQoBXFBvb2xSb2xlczxUOjpBY2NvdW50SWQ+AAEUc3RhdGUhBAEkUG9vbFN0YXRlAAC9CghccGFsbGV0X25vbWluYXRpb25fcG9vbHMoQ29tbWlzc2lvbgQEVAAAFAEcY3VycmVudDkEAXxPcHRpb248KFBlcmJpbGwsIFQ6OkFjY291bnRJZCk+AAEMbWF4wQoBPE9wdGlvbjxQZXJiaWxsPgABLGNoYW5nZV9yYXRlxQoBvE9wdGlvbjxDb21taXNzaW9uQ2hhbmdlUmF0ZTxCbG9ja051bWJlckZvcjxUPj4+AAE0dGhyb3R0bGVfZnJvbWECAWRPcHRpb248QmxvY2tOdW1iZXJGb3I8VD4+AAFAY2xhaW1fcGVybWlzc2lvbkUEAbxPcHRpb248Q29tbWlzc2lvbkNsYWltUGVybWlzc2lvbjxUOjpBY2NvdW50SWQ+PgAAwQoEGE9wdGlvbgQEVAGsAQgQTm9uZQAAABBTb21lBACsAAABAADFCgQYT3B0aW9uBARUAUEEAQgQTm9uZQAAABBTb21lBABBBAAAAQAAyQoIXHBhbGxldF9ub21pbmF0aW9uX3Bvb2xzJFBvb2xSb2xlcwQkQWNjb3VudElkAQAAEAEkZGVwb3NpdG9yAAEkQWNjb3VudElkAAEQcm9vdP0BAURPcHRpb248QWNjb3VudElkPgABJG5vbWluYXRvcv0BAURPcHRpb248QWNjb3VudElkPgABHGJvdW5jZXL9AQFET3B0aW9uPEFjY291bnRJZD4AAM0KCFxwYWxsZXRfbm9taW5hdGlvbl9wb29scyhSZXdhcmRQb29sBARUAAAUAXBsYXN0X3JlY29yZGVkX3Jld2FyZF9jb3VudGVy0QYBQFQ6OlJld2FyZENvdW50ZXIAAWxsYXN0X3JlY29yZGVkX3RvdGFsX3BheW91dHMYATBCYWxhbmNlT2Y8VD4AAVR0b3RhbF9yZXdhcmRzX2NsYWltZWQYATBCYWxhbmNlT2Y8VD4AAWB0b3RhbF9jb21taXNzaW9uX3BlbmRpbmcYATBCYWxhbmNlT2Y8VD4AAWB0b3RhbF9jb21taXNzaW9uX2NsYWltZWQYATBCYWxhbmNlT2Y8VD4AANEKCFxwYWxsZXRfbm9taW5hdGlvbl9wb29scyBTdWJQb29scwQEVAAACAEYbm9fZXJh1QoBNFVuYm9uZFBvb2w8VD4AASB3aXRoX2VyYdkKAQEBQm91bmRlZEJUcmVlTWFwPEVyYUluZGV4LCBVbmJvbmRQb29sPFQ+LCBUb3RhbFVuYm9uZGluZ1Bvb2xzPFQ+PgAA1QoIXHBhbGxldF9ub21pbmF0aW9uX3Bvb2xzKFVuYm9uZFBvb2wEBFQAAAgBGHBvaW50cxgBMEJhbGFuY2VPZjxUPgABHGJhbGFuY2UYATBCYWxhbmNlT2Y8VD4AANkKDExib3VuZGVkX2NvbGxlY3Rpb25zRGJvdW5kZWRfYnRyZWVfbWFwPEJvdW5kZWRCVHJlZU1hcAwESwEQBFYB1QoEUwAABADdCgE4QlRyZWVNYXA8SywgVj4AAN0KBCBCVHJlZU1hcAgESwEQBFYB1QoABADhCgAAAOEKAAAC5QoA5QoAAAQIENUKAOkKDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBCARTAAAEADgBGFZlYzxUPgAA7QoMXHBhbGxldF9ub21pbmF0aW9uX3Bvb2xzGHBhbGxldBRFcnJvcgQEVAABkDBQb29sTm90Rm91bmQAAASIQSAoYm9uZGVkKSBwb29sIGlkIGRvZXMgbm90IGV4aXN0LkhQb29sTWVtYmVyTm90Rm91bmQAAQRsQW4gYWNjb3VudCBpcyBub3QgYSBtZW1iZXIuSFJld2FyZFBvb2xOb3RGb3VuZAACBCEBQSByZXdhcmQgcG9vbCBkb2VzIG5vdCBleGlzdC4gSW4gYWxsIGNhc2VzIHRoaXMgaXMgYSBzeXN0ZW0gbG9naWMgZXJyb3IuQFN1YlBvb2xzTm90Rm91bmQAAwRoQSBzdWIgcG9vbCBkb2VzIG5vdCBleGlzdC5kQWNjb3VudEJlbG9uZ3NUb090aGVyUG9vbAAECE0BQW4gYWNjb3VudCBpcyBhbHJlYWR5IGRlbGVnYXRpbmcgaW4gYW5vdGhlciBwb29sLiBBbiBhY2NvdW50IG1heSBvbmx5IGJlbG9uZyB0byBvbmU8cG9vbCBhdCBhIHRpbWUuOEZ1bGx5VW5ib25kaW5nAAUIPQFUaGUgbWVtYmVyIGlzIGZ1bGx5IHVuYm9uZGVkIChhbmQgdGh1cyBjYW5ub3QgYWNjZXNzIHRoZSBib25kZWQgYW5kIHJld2FyZCBwb29sqGFueW1vcmUgdG8sIGZvciBleGFtcGxlLCBjb2xsZWN0IHJld2FyZHMpLkRNYXhVbmJvbmRpbmdMaW1pdAAGBAkBVGhlIG1lbWJlciBjYW5ub3QgdW5ib25kIGZ1cnRoZXIgY2h1bmtzIGR1ZSB0byByZWFjaGluZyB0aGUgbGltaXQuRENhbm5vdFdpdGhkcmF3QW55AAcETQFOb25lIG9mIHRoZSBmdW5kcyBjYW4gYmUgd2l0aGRyYXduIHlldCBiZWNhdXNlIHRoZSBib25kaW5nIGR1cmF0aW9uIGhhcyBub3QgcGFzc2VkLkRNaW5pbXVtQm9uZE5vdE1ldAAIFCkBVGhlIGFtb3VudCBkb2VzIG5vdCBtZWV0IHRoZSBtaW5pbXVtIGJvbmQgdG8gZWl0aGVyIGpvaW4gb3IgY3JlYXRlIGEgcG9vbC4AVQFUaGUgZGVwb3NpdG9yIGNhbiBuZXZlciB1bmJvbmQgdG8gYSB2YWx1ZSBsZXNzIHRoYW4gYFBhbGxldDo6ZGVwb3NpdG9yX21pbl9ib25kYC4gVGhlXQFjYWxsZXIgZG9lcyBub3QgaGF2ZSBub21pbmF0aW5nIHBlcm1pc3Npb25zIGZvciB0aGUgcG9vbC4gTWVtYmVycyBjYW4gbmV2ZXIgdW5ib25kIHRvIGFodmFsdWUgYmVsb3cgYE1pbkpvaW5Cb25kYC4wT3ZlcmZsb3dSaXNrAAkEIQFUaGUgdHJhbnNhY3Rpb24gY291bGQgbm90IGJlIGV4ZWN1dGVkIGR1ZSB0byBvdmVyZmxvdyByaXNrIGZvciB0aGUgcG9vbC40Tm90RGVzdHJveWluZwAKCF0BQSBwb29sIG11c3QgYmUgaW4gW2BQb29sU3RhdGU6OkRlc3Ryb3lpbmdgXSBpbiBvcmRlciBmb3IgdGhlIGRlcG9zaXRvciB0byB1bmJvbmQgb3IgZm9yuG90aGVyIG1lbWJlcnMgdG8gYmUgcGVybWlzc2lvbmxlc3NseSB1bmJvbmRlZC4wTm90Tm9taW5hdG9yAAsE9FRoZSBjYWxsZXIgZG9lcyBub3QgaGF2ZSBub21pbmF0aW5nIHBlcm1pc3Npb25zIGZvciB0aGUgcG9vbC5UTm90S2lja2VyT3JEZXN0cm95aW5nAAwEPQFFaXRoZXIgYSkgdGhlIGNhbGxlciBjYW5ub3QgbWFrZSBhIHZhbGlkIGtpY2sgb3IgYikgdGhlIHBvb2wgaXMgbm90IGRlc3Ryb3lpbmcuHE5vdE9wZW4ADQRwVGhlIHBvb2wgaXMgbm90IG9wZW4gdG8gam9pbiBNYXhQb29scwAOBIRUaGUgc3lzdGVtIGlzIG1heGVkIG91dCBvbiBwb29scy44TWF4UG9vbE1lbWJlcnMADwScVG9vIG1hbnkgbWVtYmVycyBpbiB0aGUgcG9vbCBvciBzeXN0ZW0uRENhbk5vdENoYW5nZVN0YXRlABAEiFRoZSBwb29scyBzdGF0ZSBjYW5ub3QgYmUgY2hhbmdlZC5URG9lc05vdEhhdmVQZXJtaXNzaW9uABEEuFRoZSBjYWxsZXIgZG9lcyBub3QgaGF2ZSBhZGVxdWF0ZSBwZXJtaXNzaW9ucy5UTWV0YWRhdGFFeGNlZWRzTWF4TGVuABIErE1ldGFkYXRhIGV4Y2VlZHMgW2BDb25maWc6Ok1heE1ldGFkYXRhTGVuYF0kRGVmZW5zaXZlBADxCgE4RGVmZW5zaXZlRXJyb3IAEwgxAVNvbWUgZXJyb3Igb2NjdXJyZWQgdGhhdCBzaG91bGQgbmV2ZXIgaGFwcGVuLiBUaGlzIHNob3VsZCBiZSByZXBvcnRlZCB0byB0aGUwbWFpbnRhaW5lcnMunFBhcnRpYWxVbmJvbmROb3RBbGxvd2VkUGVybWlzc2lvbmxlc3NseQAUBLxQYXJ0aWFsIHVuYm9uZGluZyBub3cgYWxsb3dlZCBwZXJtaXNzaW9ubGVzc2x5LlxNYXhDb21taXNzaW9uUmVzdHJpY3RlZAAVBB0BVGhlIHBvb2wncyBtYXggY29tbWlzc2lvbiBjYW5ub3QgYmUgc2V0IGhpZ2hlciB0aGFuIHRoZSBleGlzdGluZyB2YWx1ZS5gQ29tbWlzc2lvbkV4Y2VlZHNNYXhpbXVtABYE7FRoZSBzdXBwbGllZCBjb21taXNzaW9uIGV4Y2VlZHMgdGhlIG1heCBhbGxvd2VkIGNvbW1pc3Npb24ueENvbW1pc3Npb25FeGNlZWRzR2xvYmFsTWF4aW11bQAXBOhUaGUgc3VwcGxpZWQgY29tbWlzc2lvbiBleGNlZWRzIGdsb2JhbCBtYXhpbXVtIGNvbW1pc3Npb24uZENvbW1pc3Npb25DaGFuZ2VUaHJvdHRsZWQAGAQJAU5vdCBlbm91Z2ggYmxvY2tzIGhhdmUgc3VycGFzc2VkIHNpbmNlIHRoZSBsYXN0IGNvbW1pc3Npb24gdXBkYXRlLnhDb21taXNzaW9uQ2hhbmdlUmF0ZU5vdEFsbG93ZWQAGQQBAVRoZSBzdWJtaXR0ZWQgY2hhbmdlcyB0byBjb21taXNzaW9uIGNoYW5nZSByYXRlIGFyZSBub3QgYWxsb3dlZC5MTm9QZW5kaW5nQ29tbWlzc2lvbgAaBKBUaGVyZSBpcyBubyBwZW5kaW5nIGNvbW1pc3Npb24gdG8gY2xhaW0uWE5vQ29tbWlzc2lvbkN1cnJlbnRTZXQAGwSMTm8gY29tbWlzc2lvbiBjdXJyZW50IGhhcyBiZWVuIHNldC4sUG9vbElkSW5Vc2UAHARkUG9vbCBpZCBjdXJyZW50bHkgaW4gdXNlLjRJbnZhbGlkUG9vbElkAB0EnFBvb2wgaWQgcHJvdmlkZWQgaXMgbm90IGNvcnJlY3QvdXNhYmxlLkxCb25kRXh0cmFSZXN0cmljdGVkAB4E/EJvbmRpbmcgZXh0cmEgaXMgcmVzdHJpY3RlZCB0byB0aGUgZXhhY3QgcGVuZGluZyByZXdhcmQgYW1vdW50LjxOb3RoaW5nVG9BZGp1c3QAHwSwTm8gaW1iYWxhbmNlIGluIHRoZSBFRCBkZXBvc2l0IGZvciB0aGUgcG9vbC44Tm90aGluZ1RvU2xhc2gAIATMTm8gc2xhc2ggcGVuZGluZyB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIHRoZSBtZW1iZXIuPEFscmVhZHlNaWdyYXRlZAAhBBUBVGhlIHBvb2wgb3IgbWVtYmVyIGRlbGVnYXRpb24gaGFzIGFscmVhZHkgbWlncmF0ZWQgdG8gZGVsZWdhdGUgc3Rha2UuLE5vdE1pZ3JhdGVkACIEFQFUaGUgcG9vbCBvciBtZW1iZXIgZGVsZWdhdGlvbiBoYXMgbm90IG1pZ3JhdGVkIHlldCB0byBkZWxlZ2F0ZSBzdGFrZS4wTm90U3VwcG9ydGVkACME8FRoaXMgY2FsbCBpcyBub3QgYWxsb3dlZCBpbiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgcGFsbGV0LgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC7xCgxccGFsbGV0X25vbWluYXRpb25fcG9vbHMYcGFsbGV0OERlZmVuc2l2ZUVycm9yAAEcaE5vdEVub3VnaFNwYWNlSW5VbmJvbmRQb29sAAAAMFBvb2xOb3RGb3VuZAABAEhSZXdhcmRQb29sTm90Rm91bmQAAgBAU3ViUG9vbHNOb3RGb3VuZAADAHBCb25kZWRTdGFzaEtpbGxlZFByZW1hdHVyZWx5AAQAVERlbGVnYXRpb25VbnN1cHBvcnRlZAAFADxTbGFzaE5vdEFwcGxpZWQABgAA9QoMTHBhbGxldF9mYXN0X3Vuc3Rha2UUdHlwZXM4VW5zdGFrZVJlcXVlc3QEBFQAAAgBHHN0YXNoZXP5CgHYQm91bmRlZFZlYzwoVDo6QWNjb3VudElkLCBCYWxhbmNlT2Y8VD4pLCBUOjpCYXRjaFNpemU+AAEcY2hlY2tlZP0KAZBCb3VuZGVkVmVjPEVyYUluZGV4LCBNYXhDaGVja2luZzxUPj4AAPkKDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBEQQEUwAABAANBAEYVmVjPFQ+AAD9CgxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUARAEUwAABADlAQEYVmVjPFQ+AAABCwxMcGFsbGV0X2Zhc3RfdW5zdGFrZRhwYWxsZXQURXJyb3IEBFQAARg0Tm90Q29udHJvbGxlcgAADLhUaGUgcHJvdmlkZWQgQ29udHJvbGxlciBhY2NvdW50IHdhcyBub3QgZm91bmQuAMBUaGlzIG1lYW5zIHRoYXQgdGhlIGdpdmVuIGFjY291bnQgaXMgbm90IGJvbmRlZC40QWxyZWFkeVF1ZXVlZAABBKxUaGUgYm9uZGVkIGFjY291bnQgaGFzIGFscmVhZHkgYmVlbiBxdWV1ZWQuOE5vdEZ1bGx5Qm9uZGVkAAIEvFRoZSBib25kZWQgYWNjb3VudCBoYXMgYWN0aXZlIHVubG9ja2luZyBjaHVua3MuJE5vdFF1ZXVlZAADBLRUaGUgcHJvdmlkZWQgdW4tc3Rha2VyIGlzIG5vdCBpbiB0aGUgYFF1ZXVlYC4sQWxyZWFkeUhlYWQABAQFAVRoZSBwcm92aWRlZCB1bi1zdGFrZXIgaXMgYWxyZWFkeSBpbiBIZWFkLCBhbmQgY2Fubm90IGRlcmVnaXN0ZXIuOENhbGxOb3RBbGxvd2VkAAUEHQFUaGUgY2FsbCBpcyBub3QgYWxsb3dlZCBhdCB0aGlzIHBvaW50IGJlY2F1c2UgdGhlIHBhbGxldCBpcyBub3QgYWN0aXZlLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC4FCwxscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zNGNvbmZpZ3VyYXRpb25ESG9zdENvbmZpZ3VyYXRpb24ELEJsb2NrTnVtYmVyARAAjAE0bWF4X2NvZGVfc2l6ZRABDHUzMgABSG1heF9oZWFkX2RhdGFfc2l6ZRABDHUzMgABWG1heF91cHdhcmRfcXVldWVfY291bnQQAQx1MzIAAVRtYXhfdXB3YXJkX3F1ZXVlX3NpemUQAQx1MzIAAVxtYXhfdXB3YXJkX21lc3NhZ2Vfc2l6ZRABDHUzMgABkG1heF91cHdhcmRfbWVzc2FnZV9udW1fcGVyX2NhbmRpZGF0ZRABDHUzMgABiGhybXBfbWF4X21lc3NhZ2VfbnVtX3Blcl9jYW5kaWRhdGUQAQx1MzIAAWx2YWxpZGF0aW9uX3VwZ3JhZGVfY29vbGRvd24QASxCbG9ja051bWJlcgABYHZhbGlkYXRpb25fdXBncmFkZV9kZWxheRABLEJsb2NrTnVtYmVyAAFQYXN5bmNfYmFja2luZ19wYXJhbXNVBAFIQXN5bmNCYWNraW5nUGFyYW1zAAEwbWF4X3Bvdl9zaXplEAEMdTMyAAFkbWF4X2Rvd253YXJkX21lc3NhZ2Vfc2l6ZRABDHUzMgABkGhybXBfbWF4X3BhcmFjaGFpbl9vdXRib3VuZF9jaGFubmVscxABDHUzMgABTGhybXBfc2VuZGVyX2RlcG9zaXQYARxCYWxhbmNlAAFYaHJtcF9yZWNpcGllbnRfZGVwb3NpdBgBHEJhbGFuY2UAAWRocm1wX2NoYW5uZWxfbWF4X2NhcGFjaXR5EAEMdTMyAAFsaHJtcF9jaGFubmVsX21heF90b3RhbF9zaXplEAEMdTMyAAGMaHJtcF9tYXhfcGFyYWNoYWluX2luYm91bmRfY2hhbm5lbHMQAQx1MzIAAXRocm1wX2NoYW5uZWxfbWF4X21lc3NhZ2Vfc2l6ZRABDHUzMgABPGV4ZWN1dG9yX3BhcmFtc1kEAThFeGVjdXRvclBhcmFtcwABVGNvZGVfcmV0ZW50aW9uX3BlcmlvZBABLEJsb2NrTnVtYmVyAAE4bWF4X3ZhbGlkYXRvcnNhAgEsT3B0aW9uPHUzMj4AAThkaXNwdXRlX3BlcmlvZBABMFNlc3Npb25JbmRleAABpGRpc3B1dGVfcG9zdF9jb25jbHVzaW9uX2FjY2VwdGFuY2VfcGVyaW9kEAEsQmxvY2tOdW1iZXIAATRub19zaG93X3Nsb3RzEAEMdTMyAAFAbl9kZWxheV90cmFuY2hlcxABDHUzMgABaHplcm90aF9kZWxheV90cmFuY2hlX3dpZHRoEAEMdTMyAAFAbmVlZGVkX2FwcHJvdmFscxABDHUzMgABYHJlbGF5X3ZyZl9tb2R1bG9fc2FtcGxlcxABDHUzMgABOHB2Zl92b3RpbmdfdHRsEAEwU2Vzc2lvbkluZGV4AAGAbWluaW11bV92YWxpZGF0aW9uX3VwZ3JhZGVfZGVsYXkQASxCbG9ja051bWJlcgABVG1pbmltdW1fYmFja2luZ192b3RlcxABDHUzMgABNG5vZGVfZmVhdHVyZXORBAEwTm9kZUZlYXR1cmVzAAFYYXBwcm92YWxfdm90aW5nX3BhcmFtc20EAVBBcHByb3ZhbFZvdGluZ1BhcmFtcwABQHNjaGVkdWxlcl9wYXJhbXNxBAFwU2NoZWR1bGVyUGFyYW1zPEJsb2NrTnVtYmVyPgAACQsAAAINCwANCwAABAgQBQsAEQsQbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWluczRjb25maWd1cmF0aW9uGHBhbGxldBRFcnJvcgQEVAABBDxJbnZhbGlkTmV3VmFsdWUAAATcVGhlIG5ldyB2YWx1ZSBmb3IgYSBjb25maWd1cmF0aW9uIHBhcmFtZXRlciBpcyBpbnZhbGlkLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC4VCwAAApkEABkLAAACHQIAHQsMbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucxhzaGFyZWRoQWxsb3dlZFJlbGF5UGFyZW50c1RyYWNrZXIIEEhhc2gBNCxCbG9ja051bWJlcgEQAAgBGGJ1ZmZlciELAVhWZWNEZXF1ZTwoSGFzaCwgSGFzaCk+AAE0bGF0ZXN0X251bWJlchABLEJsb2NrTnVtYmVyAAAhCwAAAiULACULAAAECDQ0ACkLAAACLQsALQsMbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucyRpbmNsdXNpb25wQ2FuZGlkYXRlUGVuZGluZ0F2YWlsYWJpbGl0eQgESAE0BE4BEAAkARBjb3JlcQcBJENvcmVJbmRleAABEGhhc2jtBAE0Q2FuZGlkYXRlSGFzaAABKGRlc2NyaXB0b3KtBAFYQ2FuZGlkYXRlRGVzY3JpcHRvcjxIPgABLGNvbW1pdG1lbnRzvQQBUENhbmRpZGF0ZUNvbW1pdG1lbnRzAAFIYXZhaWxhYmlsaXR5X3ZvdGVzkQQBYEJpdFZlYzx1OCwgQml0T3JkZXJMc2IwPgABHGJhY2tlcnORBAFgQml0VmVjPHU4LCBCaXRPcmRlckxzYjA+AAFMcmVsYXlfcGFyZW50X251bWJlchABBE4AAUBiYWNrZWRfaW5fbnVtYmVyEAEETgABNGJhY2tpbmdfZ3JvdXB1BwEoR3JvdXBJbmRleAAAMQsQbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucyRpbmNsdXNpb24YcGFsbGV0FEVycm9yBARUAAFIZFZhbGlkYXRvckluZGV4T3V0T2ZCb3VuZHMAAAR4VmFsaWRhdG9yIGluZGV4IG91dCBvZiBib3VuZHMuUFVuc2NoZWR1bGVkQ2FuZGlkYXRlAAEErENhbmRpZGF0ZSBzdWJtaXR0ZWQgYnV0IHBhcmEgbm90IHNjaGVkdWxlZC5ASGVhZERhdGFUb29MYXJnZQACBKRIZWFkIGRhdGEgZXhjZWVkcyB0aGUgY29uZmlndXJlZCBtYXhpbXVtLlBQcmVtYXR1cmVDb2RlVXBncmFkZQADBGRDb2RlIHVwZ3JhZGUgcHJlbWF0dXJlbHkuPE5ld0NvZGVUb29MYXJnZQAEBGBPdXRwdXQgY29kZSBpcyB0b28gbGFyZ2VURGlzYWxsb3dlZFJlbGF5UGFyZW50AAUI7FRoZSBjYW5kaWRhdGUncyByZWxheS1wYXJlbnQgd2FzIG5vdCBhbGxvd2VkLiBFaXRoZXIgaXQgd2FzJQFub3QgcmVjZW50IGVub3VnaCBvciBpdCBkaWRuJ3QgYWR2YW5jZSBiYXNlZCBvbiB0aGUgbGFzdCBwYXJhY2hhaW4gYmxvY2suREludmFsaWRBc3NpZ25tZW50AAYIFQFGYWlsZWQgdG8gY29tcHV0ZSBncm91cCBpbmRleCBmb3IgdGhlIGNvcmU6IGVpdGhlciBpdCdzIG91dCBvZiBib3VuZHPob3IgdGhlIHJlbGF5IHBhcmVudCBkb2Vzbid0IGJlbG9uZyB0byB0aGUgY3VycmVudCBzZXNzaW9uLkRJbnZhbGlkR3JvdXBJbmRleAAHBJxJbnZhbGlkIGdyb3VwIGluZGV4IGluIGNvcmUgYXNzaWdubWVudC5MSW5zdWZmaWNpZW50QmFja2luZwAIBJBJbnN1ZmZpY2llbnQgKG5vbi1tYWpvcml0eSkgYmFja2luZy44SW52YWxpZEJhY2tpbmcACQTkSW52YWxpZCAoYmFkIHNpZ25hdHVyZSwgdW5rbm93biB2YWxpZGF0b3IsIGV0Yy4pIGJhY2tpbmcuRE5vdENvbGxhdG9yU2lnbmVkAAoEaENvbGxhdG9yIGRpZCBub3Qgc2lnbiBQb1YuaFZhbGlkYXRpb25EYXRhSGFzaE1pc21hdGNoAAsExFRoZSB2YWxpZGF0aW9uIGRhdGEgaGFzaCBkb2VzIG5vdCBtYXRjaCBleHBlY3RlZC6ASW5jb3JyZWN0RG93bndhcmRNZXNzYWdlSGFuZGxpbmcADATYVGhlIGRvd253YXJkIG1lc3NhZ2UgcXVldWUgaXMgbm90IHByb2Nlc3NlZCBjb3JyZWN0bHkuVEludmFsaWRVcHdhcmRNZXNzYWdlcwANBB0BQXQgbGVhc3Qgb25lIHVwd2FyZCBtZXNzYWdlIHNlbnQgZG9lcyBub3QgcGFzcyB0aGUgYWNjZXB0YW5jZSBjcml0ZXJpYS5gSHJtcFdhdGVybWFya01pc2hhbmRsaW5nAA4EEQFUaGUgY2FuZGlkYXRlIGRpZG4ndCBmb2xsb3cgdGhlIHJ1bGVzIG9mIEhSTVAgd2F0ZXJtYXJrIGFkdmFuY2VtZW50LkxJbnZhbGlkT3V0Ym91bmRIcm1wAA8E1FRoZSBIUk1QIG1lc3NhZ2VzIHNlbnQgYnkgdGhlIGNhbmRpZGF0ZSBpcyBub3QgdmFsaWQuZEludmFsaWRWYWxpZGF0aW9uQ29kZUhhc2gAEATcVGhlIHZhbGlkYXRpb24gY29kZSBoYXNoIG9mIHRoZSBjYW5kaWRhdGUgaXMgbm90IHZhbGlkLkBQYXJhSGVhZE1pc21hdGNoABEIVQFUaGUgYHBhcmFfaGVhZGAgaGFzaCBpbiB0aGUgY2FuZGlkYXRlIGRlc2NyaXB0b3IgZG9lc24ndCBtYXRjaCB0aGUgaGFzaCBvZiB0aGUgYWN0dWFsdHBhcmEgaGVhZCBpbiB0aGUgY29tbWl0bWVudHMuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LjULDExwb2xrYWRvdF9wcmltaXRpdmVzCHY3TFNjcmFwZWRPbkNoYWluVm90ZXMEBEgBNAAMARxzZXNzaW9uEAEwU2Vzc2lvbkluZGV4AAGAYmFja2luZ192YWxpZGF0b3JzX3Blcl9jYW5kaWRhdGU5CwEdAVZlYzwoQ2FuZGlkYXRlUmVjZWlwdDxIPiwgVmVjPChWYWxpZGF0b3JJbmRleCwgVmFsaWRpdHlBdHRlc3RhdGlvbik+KQo+AAEgZGlzcHV0ZXPlBAFgTXVsdGlEaXNwdXRlU3RhdGVtZW50U2V0AAA5CwAAAj0LAD0LAAAECG0HQQsAQQsAAAJFCwBFCwAABAiZBOEEAEkLEGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnM4cGFyYXNfaW5oZXJlbnQYcGFsbGV0FEVycm9yBARUAAEUZFRvb01hbnlJbmNsdXNpb25JbmhlcmVudHMAAATMSW5jbHVzaW9uIGluaGVyZW50IGNhbGxlZCBtb3JlIHRoYW4gb25jZSBwZXIgYmxvY2suTEludmFsaWRQYXJlbnRIZWFkZXIAAQhVAVRoZSBoYXNoIG9mIHRoZSBzdWJtaXR0ZWQgcGFyZW50IGhlYWRlciBkb2Vzbid0IGNvcnJlc3BvbmQgdG8gdGhlIHNhdmVkIGJsb2NrIGhhc2ggb2YsdGhlIHBhcmVudC5ISW5oZXJlbnRPdmVyd2VpZ2h0AAIECQFUaGUgZGF0YSBnaXZlbiB0byB0aGUgaW5oZXJlbnQgd2lsbCByZXN1bHQgaW4gYW4gb3ZlcndlaWdodCBibG9jay6EQ2FuZGlkYXRlc0ZpbHRlcmVkRHVyaW5nRXhlY3V0aW9uAAMITQFBIGNhbmRpZGF0ZSB3YXMgZmlsdGVyZWQgZHVyaW5nIGluaGVyZW50IGV4ZWN1dGlvbi4gVGhpcyBzaG91bGQgaGF2ZSBvbmx5IGJlZW4gZG9uZUBkdXJpbmcgY3JlYXRpb24uUFVuc2NoZWR1bGVkQ2FuZGlkYXRlAAQEdFRvbyBtYW55IGNhbmRpZGF0ZXMgc3VwcGxpZWQuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0Lk0LAAACFQsAUQsAAAJVCwBVCxBscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zJHNjaGVkdWxlchhwYWxsZXQwQ29yZU9jY3VwaWVkBAROARABCBBGcmVlAAAAFFBhcmFzBABZCwE0UGFyYXNFbnRyeTxOPgABAABZCxBscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zJHNjaGVkdWxlchhwYWxsZXQoUGFyYXNFbnRyeQQETgEQAAwBKGFzc2lnbm1lbnRdCwEoQXNzaWdubWVudAABVGF2YWlsYWJpbGl0eV90aW1lb3V0cxABDHUzMgABDHR0bBABBE4AAF0LEGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMkc2NoZWR1bGVyGGNvbW1vbihBc3NpZ25tZW50AAEIEFBvb2wIARxwYXJhX2lkjQIBGFBhcmFJZAABKGNvcmVfaW5kZXhxBwEkQ29yZUluZGV4AAAAEEJ1bGsEAI0CARhQYXJhSWQAAQAAYQsEIEJUcmVlTWFwCARLAXEHBFYBZQsABABpCwAAAGULAAACWQsAaQsAAAJtCwBtCwAABAhxB2ULAHELDGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMUcGFyYXNcUHZmQ2hlY2tBY3RpdmVWb3RlU3RhdGUELEJsb2NrTnVtYmVyARAAFAEwdm90ZXNfYWNjZXB0kQQBYEJpdFZlYzx1OCwgQml0T3JkZXJMc2IwPgABMHZvdGVzX3JlamVjdJEEAWBCaXRWZWM8dTgsIEJpdE9yZGVyTHNiMD4AAQxhZ2UQATBTZXNzaW9uSW5kZXgAAShjcmVhdGVkX2F0EAEsQmxvY2tOdW1iZXIAARhjYXVzZXN1CwF8VmVjPFB2ZkNoZWNrQ2F1c2U8QmxvY2tOdW1iZXI+PgAAdQsAAAJ5CwB5CwxscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zFHBhcmFzNFB2ZkNoZWNrQ2F1c2UELEJsb2NrTnVtYmVyARABCChPbmJvYXJkaW5nBACNAgEYUGFyYUlkAAAAHFVwZ3JhZGUMAQhpZI0CARhQYXJhSWQAASxpbmNsdWRlZF9hdBABLEJsb2NrTnVtYmVyAAFAdXBncmFkZV9zdHJhdGVneX0LATxVcGdyYWRlU3RyYXRlZ3kAAQAAfQsMbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucxRwYXJhczxVcGdyYWRlU3RyYXRlZ3kAAQhAU2V0R29BaGVhZFNpZ25hbAAAAFBBcHBseUF0RXhwZWN0ZWRCbG9jawABAACBCwAAArkEAIULAAACjQIAiQsMbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucxRwYXJhczRQYXJhTGlmZWN5Y2xlAAEcKE9uYm9hcmRpbmcAAAAoUGFyYXRocmVhZAABACRQYXJhY2hhaW4AAgBMVXBncmFkaW5nUGFyYXRocmVhZAADAFBEb3duZ3JhZGluZ1BhcmFjaGFpbgAEAFRPZmZib2FyZGluZ1BhcmF0aHJlYWQABQBQT2ZmYm9hcmRpbmdQYXJhY2hhaW4ABgAAjQsAAAQIjQIQAJELDGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMUcGFyYXNAUGFyYVBhc3RDb2RlTWV0YQQETgEQAAgBNHVwZ3JhZGVfdGltZXOVCwFgVmVjPFJlcGxhY2VtZW50VGltZXM8Tj4+AAEsbGFzdF9wcnVuZWRhAgEkT3B0aW9uPE4+AACVCwAAApkLAJkLDGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMUcGFyYXNAUmVwbGFjZW1lbnRUaW1lcwQETgEQAAgBLGV4cGVjdGVkX2F0EAEETgABMGFjdGl2YXRlZF9hdBABBE4AAJ0LAAACjQsAoQsMTHBvbGthZG90X3ByaW1pdGl2ZXMIdjc4VXBncmFkZUdvQWhlYWQAAQgUQWJvcnQAAAAcR29BaGVhZAABAAClCwxMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2N0hVcGdyYWRlUmVzdHJpY3Rpb24AAQQcUHJlc2VudAAAAACpCwxscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zFHBhcmFzPFBhcmFHZW5lc2lzQXJncwAADAEwZ2VuZXNpc19oZWFk2QQBIEhlYWREYXRhAAE8dmFsaWRhdGlvbl9jb2Rl1QQBOFZhbGlkYXRpb25Db2RlAAEkcGFyYV9raW5kIAEgUGFyYUtpbmQAAK0LEGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMUcGFyYXMYcGFsbGV0FEVycm9yBARUAAE0NE5vdFJlZ2lzdGVyZWQAAASUUGFyYSBpcyBub3QgcmVnaXN0ZXJlZCBpbiBvdXIgc3lzdGVtLjRDYW5ub3RPbmJvYXJkAAEEFQFQYXJhIGNhbm5vdCBiZSBvbmJvYXJkZWQgYmVjYXVzZSBpdCBpcyBhbHJlYWR5IHRyYWNrZWQgYnkgb3VyIHN5c3RlbS44Q2Fubm90T2ZmYm9hcmQAAgScUGFyYSBjYW5ub3QgYmUgb2ZmYm9hcmRlZCBhdCB0aGlzIHRpbWUuNENhbm5vdFVwZ3JhZGUAAwTUUGFyYSBjYW5ub3QgYmUgdXBncmFkZWQgdG8gYSBsZWFzZSBob2xkaW5nIHBhcmFjaGFpbi48Q2Fubm90RG93bmdyYWRlAAQE0FBhcmEgY2Fubm90IGJlIGRvd25ncmFkZWQgdG8gYW4gb24tZGVtYW5kIHBhcmFjaGFpbi5YUHZmQ2hlY2tTdGF0ZW1lbnRTdGFsZQAFBLBUaGUgc3RhdGVtZW50IGZvciBQVkYgcHJlLWNoZWNraW5nIGlzIHN0YWxlLlxQdmZDaGVja1N0YXRlbWVudEZ1dHVyZQAGBOxUaGUgc3RhdGVtZW50IGZvciBQVkYgcHJlLWNoZWNraW5nIGlzIGZvciBhIGZ1dHVyZSBzZXNzaW9uLoRQdmZDaGVja1ZhbGlkYXRvckluZGV4T3V0T2ZCb3VuZHMABwSkQ2xhaW1lZCB2YWxpZGF0b3IgaW5kZXggaXMgb3V0IG9mIGJvdW5kcy5gUHZmQ2hlY2tJbnZhbGlkU2lnbmF0dXJlAAgEyFRoZSBzaWduYXR1cmUgZm9yIHRoZSBQVkYgcHJlLWNoZWNraW5nIGlzIGludmFsaWQuSFB2ZkNoZWNrRG91YmxlVm90ZQAJBLBUaGUgZ2l2ZW4gdmFsaWRhdG9yIGFscmVhZHkgaGFzIGNhc3QgYSB2b3RlLlhQdmZDaGVja1N1YmplY3RJbnZhbGlkAAoE9FRoZSBnaXZlbiBQVkYgZG9lcyBub3QgZXhpc3QgYXQgdGhlIG1vbWVudCBvZiBwcm9jZXNzIGEgdm90ZS5EQ2Fubm90VXBncmFkZUNvZGUACwTMUGFyYWNoYWluIGNhbm5vdCBjdXJyZW50bHkgc2NoZWR1bGUgYSBjb2RlIHVwZ3JhZGUuLEludmFsaWRDb2RlAAwEdEludmFsaWQgdmFsaWRhdGlvbiBjb2RlIHNpemUuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LrELAAACtQsAtQsMbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucyxpbml0aWFsaXplclRCdWZmZXJlZFNlc3Npb25DaGFuZ2UAAAwBKHZhbGlkYXRvcnMZCwFAVmVjPFZhbGlkYXRvcklkPgABGHF1ZXVlZBkLAUBWZWM8VmFsaWRhdG9ySWQ+AAE0c2Vzc2lvbl9pbmRleBABMFNlc3Npb25JbmRleAAAuQsAAAK9CwC9CwhgcG9sa2Fkb3RfY29yZV9wcmltaXRpdmVzWEluYm91bmREb3dud2FyZE1lc3NhZ2UELEJsb2NrTnVtYmVyARAACAEcc2VudF9hdBABLEJsb2NrTnVtYmVyAAEMbXNnOAE8RG93bndhcmRNZXNzYWdlAADBCwxscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zEGhybXBYSHJtcE9wZW5DaGFubmVsUmVxdWVzdAAAGAEkY29uZmlybWVkIAEQYm9vbAABEF9hZ2UQATBTZXNzaW9uSW5kZXgAAThzZW5kZXJfZGVwb3NpdBgBHEJhbGFuY2UAAUBtYXhfbWVzc2FnZV9zaXplEAEMdTMyAAEwbWF4X2NhcGFjaXR5EAEMdTMyAAE4bWF4X3RvdGFsX3NpemUQAQx1MzIAAMULAAACGQUAyQsMbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucxBocm1wLEhybXBDaGFubmVsAAAgATBtYXhfY2FwYWNpdHkQAQx1MzIAAThtYXhfdG90YWxfc2l6ZRABDHUzMgABQG1heF9tZXNzYWdlX3NpemUQAQx1MzIAASRtc2dfY291bnQQAQx1MzIAASh0b3RhbF9zaXplEAEMdTMyAAEgbXFjX2hlYWSdAgEwT3B0aW9uPEhhc2g+AAE4c2VuZGVyX2RlcG9zaXQYARxCYWxhbmNlAAFEcmVjaXBpZW50X2RlcG9zaXQYARxCYWxhbmNlAADNCwAAAtELANELCGBwb2xrYWRvdF9jb3JlX3ByaW1pdGl2ZXNISW5ib3VuZEhybXBNZXNzYWdlBCxCbG9ja051bWJlcgEQAAgBHHNlbnRfYXQQASxCbG9ja051bWJlcgABEGRhdGE4AVBzcF9zdGQ6OnZlYzo6VmVjPHU4PgAA1QsAAALZCwDZCwAABAgQhQsA3QsQbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucxBocm1wGHBhbGxldBRFcnJvcgQEVAABUFRPcGVuSHJtcENoYW5uZWxUb1NlbGYAAATEVGhlIHNlbmRlciB0cmllZCB0byBvcGVuIGEgY2hhbm5lbCB0byB0aGVtc2VsdmVzLnxPcGVuSHJtcENoYW5uZWxJbnZhbGlkUmVjaXBpZW50AAEEiFRoZSByZWNpcGllbnQgaXMgbm90IGEgdmFsaWQgcGFyYS5sT3BlbkhybXBDaGFubmVsWmVyb0NhcGFjaXR5AAIEfFRoZSByZXF1ZXN0ZWQgY2FwYWNpdHkgaXMgemVyby6MT3BlbkhybXBDaGFubmVsQ2FwYWNpdHlFeGNlZWRzTGltaXQAAwTAVGhlIHJlcXVlc3RlZCBjYXBhY2l0eSBleGNlZWRzIHRoZSBnbG9iYWwgbGltaXQueE9wZW5Icm1wQ2hhbm5lbFplcm9NZXNzYWdlU2l6ZQAEBKBUaGUgcmVxdWVzdGVkIG1heGltdW0gbWVzc2FnZSBzaXplIGlzIDAumE9wZW5Icm1wQ2hhbm5lbE1lc3NhZ2VTaXplRXhjZWVkc0xpbWl0AAUEKQFUaGUgb3BlbiByZXF1ZXN0IHJlcXVlc3RlZCB0aGUgbWVzc2FnZSBzaXplIHRoYXQgZXhjZWVkcyB0aGUgZ2xvYmFsIGxpbWl0LnBPcGVuSHJtcENoYW5uZWxBbHJlYWR5RXhpc3RzAAYEaFRoZSBjaGFubmVsIGFscmVhZHkgZXhpc3RzfE9wZW5Icm1wQ2hhbm5lbEFscmVhZHlSZXF1ZXN0ZWQABwTQVGhlcmUgaXMgYWxyZWFkeSBhIHJlcXVlc3QgdG8gb3BlbiB0aGUgc2FtZSBjaGFubmVsLnBPcGVuSHJtcENoYW5uZWxMaW1pdEV4Y2VlZGVkAAgEHQFUaGUgc2VuZGVyIGFscmVhZHkgaGFzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBhbGxvd2VkIG91dGJvdW5kIGNoYW5uZWxzLnBBY2NlcHRIcm1wQ2hhbm5lbERvZXNudEV4aXN0AAkE4FRoZSBjaGFubmVsIGZyb20gdGhlIHNlbmRlciB0byB0aGUgb3JpZ2luIGRvZXNuJ3QgZXhpc3QuhEFjY2VwdEhybXBDaGFubmVsQWxyZWFkeUNvbmZpcm1lZAAKBIRUaGUgY2hhbm5lbCBpcyBhbHJlYWR5IGNvbmZpcm1lZC54QWNjZXB0SHJtcENoYW5uZWxMaW1pdEV4Y2VlZGVkAAsEJQFUaGUgcmVjaXBpZW50IGFscmVhZHkgaGFzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBhbGxvd2VkIGluYm91bmQgY2hhbm5lbHMucENsb3NlSHJtcENoYW5uZWxVbmF1dGhvcml6ZWQADARVAVRoZSBvcmlnaW4gdHJpZXMgdG8gY2xvc2UgYSBjaGFubmVsIHdoZXJlIGl0IGlzIG5laXRoZXIgdGhlIHNlbmRlciBub3IgdGhlIHJlY2lwaWVudC5sQ2xvc2VIcm1wQ2hhbm5lbERvZXNudEV4aXN0AA0EnFRoZSBjaGFubmVsIHRvIGJlIGNsb3NlZCBkb2Vzbid0IGV4aXN0LnxDbG9zZUhybXBDaGFubmVsQWxyZWFkeVVuZGVyd2F5AA4EvFRoZSBjaGFubmVsIGNsb3NlIHJlcXVlc3QgaXMgYWxyZWFkeSByZXF1ZXN0ZWQuhENhbmNlbEhybXBPcGVuQ2hhbm5lbFVuYXV0aG9yaXplZAAPBF0BQ2FuY2VsaW5nIGlzIHJlcXVlc3RlZCBieSBuZWl0aGVyIHRoZSBzZW5kZXIgbm9yIHJlY2lwaWVudCBvZiB0aGUgb3BlbiBjaGFubmVsIHJlcXVlc3QuaE9wZW5Icm1wQ2hhbm5lbERvZXNudEV4aXN0ABAEfFRoZSBvcGVuIHJlcXVlc3QgZG9lc24ndCBleGlzdC58T3BlbkhybXBDaGFubmVsQWxyZWFkeUNvbmZpcm1lZAARBC0BQ2Fubm90IGNhbmNlbCBhbiBIUk1QIG9wZW4gY2hhbm5lbCByZXF1ZXN0IGJlY2F1c2UgaXQgaXMgYWxyZWFkeSBjb25maXJtZWQuMFdyb25nV2l0bmVzcwASBIxUaGUgcHJvdmlkZWQgd2l0bmVzcyBkYXRhIGlzIHdyb25nLnBDaGFubmVsQ3JlYXRpb25Ob3RBdXRob3JpemVkABME6FRoZSBjaGFubmVsIGJldHdlZW4gdGhlc2UgdHdvIGNoYWlucyBjYW5ub3QgYmUgYXV0aG9yaXplZC4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQu4QsAAAIhAgDlCwxMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2NyxTZXNzaW9uSW5mbwAANAFgYWN0aXZlX3ZhbGlkYXRvcl9pbmRpY2VzFQsBTFZlYzxWYWxpZGF0b3JJbmRleD4AASxyYW5kb21fc2VlZAQBIFt1ODsgMzJdAAE4ZGlzcHV0ZV9wZXJpb2QQATBTZXNzaW9uSW5kZXgAASh2YWxpZGF0b3Jz6QsBnEluZGV4ZWRWZWM8VmFsaWRhdG9ySW5kZXgsIFZhbGlkYXRvcklkPgABOGRpc2NvdmVyeV9rZXlzaQkBZFZlYzxBdXRob3JpdHlEaXNjb3ZlcnlJZD4AATxhc3NpZ25tZW50X2tleXPhCwFEVmVjPEFzc2lnbm1lbnRJZD4AAUB2YWxpZGF0b3JfZ3JvdXBz7QsBrEluZGV4ZWRWZWM8R3JvdXBJbmRleCwgVmVjPFZhbGlkYXRvckluZGV4Pj4AARxuX2NvcmVzEAEMdTMyAAFoemVyb3RoX2RlbGF5X3RyYW5jaGVfd2lkdGgQAQx1MzIAAWByZWxheV92cmZfbW9kdWxvX3NhbXBsZXMQAQx1MzIAAUBuX2RlbGF5X3RyYW5jaGVzEAEMdTMyAAE0bm9fc2hvd19zbG90cxABDHUzMgABQG5lZWRlZF9hcHByb3ZhbHMQAQx1MzIAAOkLDExwb2xrYWRvdF9wcmltaXRpdmVzCHY3KEluZGV4ZWRWZWMIBEsBmQQEVgEdAgAEABkLARhWZWM8Vj4AAO0LDExwb2xrYWRvdF9wcmltaXRpdmVzCHY3KEluZGV4ZWRWZWMIBEsBdQcEVgEVCwAEAE0LARhWZWM8Vj4AAPELAAAECBDtBAD1CwxMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2NzBEaXNwdXRlU3RhdGUEBE4BEAAQATh2YWxpZGF0b3JzX2ZvcpEEAXxCaXRWZWM8dTgsIGJpdHZlYzo6b3JkZXI6OkxzYjA+AAFIdmFsaWRhdG9yc19hZ2FpbnN0kQQBfEJpdFZlYzx1OCwgYml0dmVjOjpvcmRlcjo6THNiMD4AARRzdGFydBABBE4AATBjb25jbHVkZWRfYXRhAgEkT3B0aW9uPE4+AAD5CwQgQlRyZWVTZXQEBFQBmQQABAAVCwAAAP0LEGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMgZGlzcHV0ZXMYcGFsbGV0FEVycm9yBARUAAEkdER1cGxpY2F0ZURpc3B1dGVTdGF0ZW1lbnRTZXRzAAAEqER1cGxpY2F0ZSBkaXNwdXRlIHN0YXRlbWVudCBzZXRzIHByb3ZpZGVkLlxBbmNpZW50RGlzcHV0ZVN0YXRlbWVudAABBIxBbmNpZW50IGRpc3B1dGUgc3RhdGVtZW50IHByb3ZpZGVkLmRWYWxpZGF0b3JJbmRleE91dE9mQm91bmRzAAIE6FZhbGlkYXRvciBpbmRleCBvbiBzdGF0ZW1lbnQgaXMgb3V0IG9mIGJvdW5kcyBmb3Igc2Vzc2lvbi5ASW52YWxpZFNpZ25hdHVyZQADBHxJbnZhbGlkIHNpZ25hdHVyZSBvbiBzdGF0ZW1lbnQuSER1cGxpY2F0ZVN0YXRlbWVudAAEBMxWYWxpZGF0b3Igdm90ZSBzdWJtaXR0ZWQgbW9yZSB0aGFuIG9uY2UgdG8gZGlzcHV0ZS5IU2luZ2xlU2lkZWREaXNwdXRlAAUExEEgZGlzcHV0ZSB3aGVyZSB0aGVyZSBhcmUgb25seSB2b3RlcyBvbiBvbmUgc2lkZS48TWFsaWNpb3VzQmFja2VyAAYEnEEgZGlzcHV0ZSB2b3RlIGZyb20gYSBtYWxpY2lvdXMgYmFja2VyLkxNaXNzaW5nQmFja2luZ1ZvdGVzAAcE4E5vIGJhY2tpbmcgdm90ZXMgd2VyZSBwcm92aWRlcyBhbG9uZyBkaXNwdXRlIHN0YXRlbWVudHMuSFVuY29uZmlybWVkRGlzcHV0ZQAIBLBVbmNvbmZpcm1lZCBkaXNwdXRlIHN0YXRlbWVudCBzZXRzIHByb3ZpZGVkLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC4BDBBMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2NyBzbGFzaGluZzhQZW5kaW5nU2xhc2hlcwAACAEQa2V5cwUMAZRCVHJlZU1hcDxWYWxpZGF0b3JJbmRleCwgVmFsaWRhdG9ySWQ+AAEQa2luZC0FAUxTbGFzaGluZ09mZmVuY2VLaW5kAAAFDAQgQlRyZWVNYXAIBEsBmQQEVgEdAgAEAAkMAAAACQwAAAINDAANDAAABAiZBB0CABEMFGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMgZGlzcHV0ZXMgc2xhc2hpbmcYcGFsbGV0FEVycm9yBARUAAEYYEludmFsaWRLZXlPd25lcnNoaXBQcm9vZgAABIxUaGUga2V5IG93bmVyc2hpcCBwcm9vZiBpcyBpbnZhbGlkLkxJbnZhbGlkU2Vzc2lvbkluZGV4AAEEoFRoZSBzZXNzaW9uIGluZGV4IGlzIHRvbyBvbGQgb3IgaW52YWxpZC5QSW52YWxpZENhbmRpZGF0ZUhhc2gAAgR4VGhlIGNhbmRpZGF0ZSBoYXNoIGlzIGludmFsaWQuVEludmFsaWRWYWxpZGF0b3JJbmRleAADCAEBVGhlcmUgaXMgbm8gcGVuZGluZyBzbGFzaCBmb3IgdGhlIGdpdmVuIHZhbGlkYXRvciBpbmRleCBhbmQgdGltZRRzbG90LmBWYWxpZGF0b3JJbmRleElkTWlzbWF0Y2gABATQVGhlIHZhbGlkYXRvciBpbmRleCBkb2VzIG5vdCBtYXRjaCB0aGUgdmFsaWRhdG9yIGlkLlxEdXBsaWNhdGVTbGFzaGluZ1JlcG9ydAAFBA0BVGhlIGdpdmVuIHNsYXNoaW5nIHJlcG9ydCBpcyB2YWxpZCBidXQgYWxyZWFkeSBwcmV2aW91c2x5IHJlcG9ydGVkLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC4VDBBscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zSGFzc2lnbmVyX29uX2RlbWFuZBR0eXBlc0RDb3JlQWZmaW5pdHlDb3VudAAACAEoY29yZV9pbmRleHEHASRDb3JlSW5kZXgAARRjb3VudBABDHUzMgAAGQwQbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWluc0hhc3NpZ25lcl9vbl9kZW1hbmQUdHlwZXM8UXVldWVTdGF0dXNUeXBlAAAQARx0cmFmZmlj0QYBJEZpeGVkVTEyOAABKG5leHRfaW5kZXgdDAEoUXVldWVJbmRleAABOHNtYWxsZXN0X2luZGV4HQwBKFF1ZXVlSW5kZXgAATRmcmVlZF9pbmRpY2VzIQwBdEJpbmFyeUhlYXA8UmV2ZXJzZVF1ZXVlSW5kZXg+AAAdDBBscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zSGFzc2lnbmVyX29uX2RlbWFuZBR0eXBlcyhRdWV1ZUluZGV4AAAEABABDHUzMgAAIQwEKEJpbmFyeUhlYXAEBFQBJQwABAApDAAAACUMEGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnNIYXNzaWduZXJfb25fZGVtYW5kFHR5cGVzRFJldmVyc2VRdWV1ZUluZGV4AAAEABABDHUzMgAAKQwAAAIlDAAtDAQoQmluYXJ5SGVhcAQEVAExDAAEADUMAAAAMQwQbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWluc0hhc3NpZ25lcl9vbl9kZW1hbmQUdHlwZXM0RW5xdWV1ZWRPcmRlcgAACAEccGFyYV9pZI0CARhQYXJhSWQAAQxpZHgdDAEoUXVldWVJbmRleAAANQwAAAIxDAA5DAxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUARgEUwAABAA9DAEYVmVjPFQ+AAA9DAAAAhgAQQwQbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWluc0hhc3NpZ25lcl9vbl9kZW1hbmQYcGFsbGV0FEVycm9yBARUAAEIJFF1ZXVlRnVsbAAABORUaGUgb3JkZXIgcXVldWUgaXMgZnVsbCwgYHBsYWNlX29yZGVyYCB3aWxsIG5vdCBjb250aW51ZS5wU3BvdFByaWNlSGlnaGVyVGhhbk1heEFtb3VudAABCE0BVGhlIGN1cnJlbnQgc3BvdCBwcmljZSBpcyBoaWdoZXIgdGhhbiB0aGUgbWF4IGFtb3VudCBzcGVjaWZpZWQgaW4gdGhlIGBwbGFjZV9vcmRlcmBgY2FsbCwgbWFraW5nIGl0IGludmFsaWQuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LkUMAAAECBBxBwBJDAxscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zRGFzc2lnbmVyX2NvcmV0aW1lIFNjaGVkdWxlBAROARAADAEsYXNzaWdubWVudHNdBQGMVmVjPChDb3JlQXNzaWdubWVudCwgUGFydHNPZjU3NjAwKT4AASBlbmRfaGludGECASRPcHRpb248Tj4AATRuZXh0X3NjaGVkdWxlYQIBJE9wdGlvbjxOPgAATQwMbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWluc0Rhc3NpZ25lcl9jb3JldGltZThDb3JlRGVzY3JpcHRvcgQETgEQAAgBFHF1ZXVlUQwBaE9wdGlvbjxRdWV1ZURlc2NyaXB0b3I8Tj4+AAEwY3VycmVudF93b3JrWQwBUE9wdGlvbjxXb3JrU3RhdGU8Tj4+AABRDAQYT3B0aW9uBARUAVUMAQgQTm9uZQAAABBTb21lBABVDAAAAQAAVQwMbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWluc0Rhc3NpZ25lcl9jb3JldGltZTxRdWV1ZURlc2NyaXB0b3IEBE4BEAAIARRmaXJzdBABBE4AARBsYXN0EAEETgAAWQwEGE9wdGlvbgQEVAFdDAEIEE5vbmUAAAAQU29tZQQAXQwAAAEAAF0MDGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnNEYXNzaWduZXJfY29yZXRpbWUkV29ya1N0YXRlBAROARAAEAEsYXNzaWdubWVudHNhDAGYVmVjPChDb3JlQXNzaWdubWVudCwgQXNzaWdubWVudFN0YXRlKT4AASBlbmRfaGludGECASRPcHRpb248Tj4AAQxwb3NtAQEMdTE2AAEQc3RlcGkFATBQYXJ0c09mNTc2MDAAAGEMAAACZQwAZQwAAAQIZQVpDABpDAxscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zRGFzc2lnbmVyX2NvcmV0aW1lPEFzc2lnbm1lbnRTdGF0ZQAACAEUcmF0aW9pBQEwUGFydHNPZjU3NjAwAAEkcmVtYWluaW5naQUBMFBhcnRzT2Y1NzYwMAAAbQwQbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWluc0Rhc3NpZ25lcl9jb3JldGltZRhwYWxsZXQURXJyb3IEBFQAARhAQXNzaWdubWVudHNFbXB0eQAAADRPdmVyU2NoZWR1bGVkAAEEkEFzc2lnbm1lbnRzIHRvZ2V0aGVyIGV4Y2VlZGVkIDU3NjAwLjhVbmRlclNjaGVkdWxlZAACBJBBc3NpZ25tZW50cyB0b2dldGhlciBsZXNzIHRoYW4gNTc2MDBARGlzYWxsb3dlZEluc2VydAADCFEBYXNzaWduX2NvcmUgaXMgb25seSBhbGxvd2VkIHRvIGFwcGVuZCBuZXcgYXNzaWdubWVudHMgYXQgdGhlIGVuZCBvZiBhbHJlYWR5IGV4aXN0aW5nFG9uZXMuPER1cGxpY2F0ZUluc2VydAAEBFUBVHJpZWQgdG8gaW5zZXJ0IGEgc2NoZWR1bGUgZm9yIHRoZSBzYW1lIGNvcmUgYW5kIGJsb2NrIG51bWJlciBhcyBhbiBleGlzdGluZyBzY2hlZHVsZVBBc3NpZ25tZW50c05vdFNvcnRlZAAFBKxUcmllZCB0byBhZGQgYW4gdW5zb3J0ZWQgc2V0IG9mIGFzc2lnbm1lbnRzBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LnEMDFxwb2xrYWRvdF9ydW50aW1lX2NvbW1vbjxwYXJhc19yZWdpc3RyYXIgUGFyYUluZm8IHEFjY291bnQBABxCYWxhbmNlARgADAEcbWFuYWdlcgABHEFjY291bnQAARxkZXBvc2l0GAEcQmFsYW5jZQABGGxvY2tlZM0CATBPcHRpb248Ym9vbD4AAHUMEFxwb2xrYWRvdF9ydW50aW1lX2NvbW1vbjxwYXJhc19yZWdpc3RyYXIYcGFsbGV0FEVycm9yBARUAAE4NE5vdFJlZ2lzdGVyZWQAAARkVGhlIElEIGlzIG5vdCByZWdpc3RlcmVkLkRBbHJlYWR5UmVnaXN0ZXJlZAABBHRUaGUgSUQgaXMgYWxyZWFkeSByZWdpc3RlcmVkLiBOb3RPd25lcgACBJxUaGUgY2FsbGVyIGlzIG5vdCB0aGUgb3duZXIgb2YgdGhpcyBJZC4wQ29kZVRvb0xhcmdlAAMEXEludmFsaWQgcGFyYSBjb2RlIHNpemUuQEhlYWREYXRhVG9vTGFyZ2UABARwSW52YWxpZCBwYXJhIGhlYWQgZGF0YSBzaXplLjBOb3RQYXJhY2hhaW4ABQRgUGFyYSBpcyBub3QgYSBQYXJhY2hhaW4uNE5vdFBhcmF0aHJlYWQABgS8UGFyYSBpcyBub3QgYSBQYXJhdGhyZWFkIChvbi1kZW1hbmQgcGFyYWNoYWluKS5AQ2Fubm90RGVyZWdpc3RlcgAHBFhDYW5ub3QgZGVyZWdpc3RlciBwYXJhPENhbm5vdERvd25ncmFkZQAIBC0BQ2Fubm90IHNjaGVkdWxlIGRvd25ncmFkZSBvZiBsZWFzZSBob2xkaW5nIHBhcmFjaGFpbiB0byBvbi1kZW1hbmQgcGFyYWNoYWluNENhbm5vdFVwZ3JhZGUACQQlAUNhbm5vdCBzY2hlZHVsZSB1cGdyYWRlIG9mIG9uLWRlbWFuZCBwYXJhY2hhaW4gdG8gbGVhc2UgaG9sZGluZyBwYXJhY2hhaW4oUGFyYUxvY2tlZAAKCEkBUGFyYSBpcyBsb2NrZWQgZnJvbSBtYW5pcHVsYXRpb24gYnkgdGhlIG1hbmFnZXIuIE11c3QgdXNlIHBhcmFjaGFpbiBvciByZWxheSBjaGFpbixnb3Zlcm5hbmNlLixOb3RSZXNlcnZlZAALBNBUaGUgSUQgZ2l2ZW4gZm9yIHJlZ2lzdHJhdGlvbiBoYXMgbm90IGJlZW4gcmVzZXJ2ZWQuLEludmFsaWRDb2RlAAwEfFRoZSB2YWxpZGF0aW9uIGNvZGUgaXMgaW52YWxpZC4oQ2Fubm90U3dhcAANCFEBQ2Fubm90IHBlcmZvcm0gYSBwYXJhY2hhaW4gc2xvdCAvIGxpZmVjeWNsZSBzd2FwLiBDaGVjayB0aGF0IHRoZSBzdGF0ZSBvZiBib3RoIHBhcmFzhGFyZSBjb3JyZWN0IGZvciB0aGUgc3dhcCB0byB3b3JrLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC55DAAAAiEIAH0MEFxwb2xrYWRvdF9ydW50aW1lX2NvbW1vbhRzbG90cxhwYWxsZXQURXJyb3IEBFQAAQhEUGFyYU5vdE9uYm9hcmRpbmcAAASMVGhlIHBhcmFjaGFpbiBJRCBpcyBub3Qgb25ib2FyZGluZy4oTGVhc2VFcnJvcgABBIhUaGVyZSB3YXMgYW4gZXJyb3Igd2l0aCB0aGUgbGVhc2UuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LoEMAAAECACNAgCFDAAAAyQAAACJDACJDAQYT3B0aW9uBARUAY0MAQgQTm9uZQAAABBTb21lBACNDAAAAQAAjQwAAAQMAI0CGACRDBBccG9sa2Fkb3RfcnVudGltZV9jb21tb24gYXVjdGlvbnMYcGFsbGV0FEVycm9yBARUAAEcREF1Y3Rpb25JblByb2dyZXNzAAAEkFRoaXMgYXVjdGlvbiBpcyBhbHJlYWR5IGluIHByb2dyZXNzLkRMZWFzZVBlcmlvZEluUGFzdAABBIBUaGUgbGVhc2UgcGVyaW9kIGlzIGluIHRoZSBwYXN0LkRQYXJhTm90UmVnaXN0ZXJlZAACBFhQYXJhIGlzIG5vdCByZWdpc3RlcmVkRE5vdEN1cnJlbnRBdWN0aW9uAAMEWE5vdCBhIGN1cnJlbnQgYXVjdGlvbi4oTm90QXVjdGlvbgAEBDxOb3QgYW4gYXVjdGlvbi4wQXVjdGlvbkVuZGVkAAUEaEF1Y3Rpb24gaGFzIGFscmVhZHkgZW5kZWQuQEFscmVhZHlMZWFzZWRPdXQABgTYVGhlIHBhcmEgaXMgYWxyZWFkeSBsZWFzZWQgb3V0IGZvciBwYXJ0IG9mIHRoaXMgcmFuZ2UuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LpUMDFxwb2xrYWRvdF9ydW50aW1lX2NvbW1vbiRjcm93ZGxvYW4gRnVuZEluZm8QJEFjY291bnRJZAEAHEJhbGFuY2UBGCxCbG9ja051bWJlcgEQLExlYXNlUGVyaW9kARAAKAEkZGVwb3NpdG9yAAEkQWNjb3VudElkAAEgdmVyaWZpZXJJBQFMT3B0aW9uPE11bHRpU2lnbmVyPgABHGRlcG9zaXQYARxCYWxhbmNlAAEYcmFpc2VkGAEcQmFsYW5jZQABDGVuZBABLEJsb2NrTnVtYmVyAAEMY2FwGAEcQmFsYW5jZQABRGxhc3RfY29udHJpYnV0aW9umQwBdExhc3RDb250cmlidXRpb248QmxvY2tOdW1iZXI+AAEwZmlyc3RfcGVyaW9kEAEsTGVhc2VQZXJpb2QAASxsYXN0X3BlcmlvZBABLExlYXNlUGVyaW9kAAEoZnVuZF9pbmRleBABJEZ1bmRJbmRleAAAmQwMXHBvbGthZG90X3J1bnRpbWVfY29tbW9uJGNyb3dkbG9hbkBMYXN0Q29udHJpYnV0aW9uBCxCbG9ja051bWJlcgEQAQwUTmV2ZXIAAAAkUHJlRW5kaW5nBAAQAQx1MzIAAQAYRW5kaW5nBAAQASxCbG9ja051bWJlcgACAACdDBBccG9sa2Fkb3RfcnVudGltZV9jb21tb24kY3Jvd2Rsb2FuGHBhbGxldBRFcnJvcgQEVAABXERGaXJzdFBlcmlvZEluUGFzdAAABPRUaGUgY3VycmVudCBsZWFzZSBwZXJpb2QgaXMgbW9yZSB0aGFuIHRoZSBmaXJzdCBsZWFzZSBwZXJpb2QuZEZpcnN0UGVyaW9kVG9vRmFySW5GdXR1cmUAAQQRAVRoZSBmaXJzdCBsZWFzZSBwZXJpb2QgbmVlZHMgdG8gYXQgbGVhc3QgYmUgbGVzcyB0aGFuIDMgYG1heF92YWx1ZWAubExhc3RQZXJpb2RCZWZvcmVGaXJzdFBlcmlvZAACBOhMYXN0IGxlYXNlIHBlcmlvZCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBmaXJzdCBsZWFzZSBwZXJpb2QuYExhc3RQZXJpb2RUb29GYXJJbkZ1dHVyZQADBC0BVGhlIGxhc3QgbGVhc2UgcGVyaW9kIGNhbm5vdCBiZSBtb3JlIHRoYW4gMyBwZXJpb2RzIGFmdGVyIHRoZSBmaXJzdCBwZXJpb2QuPENhbm5vdEVuZEluUGFzdAAEBEUBVGhlIGNhbXBhaWduIGVuZHMgYmVmb3JlIHRoZSBjdXJyZW50IGJsb2NrIG51bWJlci4gVGhlIGVuZCBtdXN0IGJlIGluIHRoZSBmdXR1cmUuREVuZFRvb0ZhckluRnV0dXJlAAUEwFRoZSBlbmQgZGF0ZSBmb3IgdGhpcyBjcm93ZGxvYW4gaXMgbm90IHNlbnNpYmxlLiBPdmVyZmxvdwAGBFhUaGVyZSB3YXMgYW4gb3ZlcmZsb3cuUENvbnRyaWJ1dGlvblRvb1NtYWxsAAcE6FRoZSBjb250cmlidXRpb24gd2FzIGJlbG93IHRoZSBtaW5pbXVtLCBgTWluQ29udHJpYnV0aW9uYC40SW52YWxpZFBhcmFJZAAIBExJbnZhbGlkIGZ1bmQgaW5kZXguLENhcEV4Y2VlZGVkAAkEkENvbnRyaWJ1dGlvbnMgZXhjZWVkIG1heGltdW0gYW1vdW50LlhDb250cmlidXRpb25QZXJpb2RPdmVyAAoEqFRoZSBjb250cmlidXRpb24gcGVyaW9kIGhhcyBhbHJlYWR5IGVuZGVkLjRJbnZhbGlkT3JpZ2luAAsEjFRoZSBvcmlnaW4gb2YgdGhpcyBjYWxsIGlzIGludmFsaWQuME5vdFBhcmFjaGFpbgAMBMhUaGlzIGNyb3dkbG9hbiBkb2VzIG5vdCBjb3JyZXNwb25kIHRvIGEgcGFyYWNoYWluLixMZWFzZUFjdGl2ZQANBBUBVGhpcyBwYXJhY2hhaW4gbGVhc2UgaXMgc3RpbGwgYWN0aXZlIGFuZCByZXRpcmVtZW50IGNhbm5vdCB5ZXQgYmVnaW4uQEJpZE9yTGVhc2VBY3RpdmUADgQxAVRoaXMgcGFyYWNoYWluJ3MgYmlkIG9yIGxlYXNlIGlzIHN0aWxsIGFjdGl2ZSBhbmQgd2l0aGRyYXcgY2Fubm90IHlldCBiZWdpbi4wRnVuZE5vdEVuZGVkAA8EgFRoZSBjcm93ZGxvYW4gaGFzIG5vdCB5ZXQgZW5kZWQuPE5vQ29udHJpYnV0aW9ucwAQBNBUaGVyZSBhcmUgbm8gY29udHJpYnV0aW9ucyBzdG9yZWQgaW4gdGhpcyBjcm93ZGxvYW4uSE5vdFJlYWR5VG9EaXNzb2x2ZQARCFUBVGhlIGNyb3dkbG9hbiBpcyBub3QgcmVhZHkgdG8gZGlzc29sdmUuIFBvdGVudGlhbGx5IHN0aWxsIGhhcyBhIHNsb3Qgb3IgaW4gcmV0aXJlbWVudBxwZXJpb2QuQEludmFsaWRTaWduYXR1cmUAEgRISW52YWxpZCBzaWduYXR1cmUuME1lbW9Ub29MYXJnZQATBHxUaGUgcHJvdmlkZWQgbWVtbyBpcyB0b28gbGFyZ2UuREFscmVhZHlJbk5ld1JhaXNlABQEhFRoZSBmdW5kIGlzIGFscmVhZHkgaW4gYE5ld1JhaXNlYEhWcmZEZWxheUluUHJvZ3Jlc3MAFQS0Tm8gY29udHJpYnV0aW9ucyBhbGxvd2VkIGR1cmluZyB0aGUgVlJGIGRlbGF5NE5vTGVhc2VQZXJpb2QAFgQtAUEgbGVhc2UgcGVyaW9kIGhhcyBub3Qgc3RhcnRlZCB5ZXQsIGR1ZSB0byBhbiBvZmZzZXQgaW4gdGhlIHN0YXJ0aW5nIGJsb2NrLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC6hDBBscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zIGNvcmV0aW1lGHBhbGxldBRFcnJvcgQEVAABDCROb3RCcm9rZXIAAAQpAVRoZSBwYXJhaWQgbWFraW5nIHRoZSBjYWxsIGlzIG5vdCB0aGUgY29yZXRpbWUgYnJva2VyYWdlIHN5c3RlbSBwYXJhY2hhaW4uWFJlcXVlc3RlZEZ1dHVyZVJldmVudWUAAQhFAVJlcXVlc3RlZCByZXZlbnVlIGluZm9ybWF0aW9uIGB3aGVuYCBwYXJhbWV0ZXIgd2FzIGluIHRoZSBmdXR1cmUgZnJvbSB0aGUgY3VycmVudDRibG9jayBoZWlnaHQuTEFzc2V0VHJhbnNmZXJGYWlsZWQAAgS8RmFpbGVkIHRvIHRyYW5zZmVyIGFzc2V0cyB0byB0aGUgY29yZXRpbWUgY2hhaW4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQupQwMKHBhbGxldF94Y20YcGFsbGV0LFF1ZXJ5U3RhdHVzBCxCbG9ja051bWJlcgEQAQwcUGVuZGluZxABJHJlc3BvbmRlckUBAURWZXJzaW9uZWRMb2NhdGlvbgABTG1heWJlX21hdGNoX3F1ZXJpZXKpDAFkT3B0aW9uPFZlcnNpb25lZExvY2F0aW9uPgABMG1heWJlX25vdGlmea0MAUBPcHRpb248KHU4LCB1OCk+AAEcdGltZW91dBABLEJsb2NrTnVtYmVyAAAAPFZlcnNpb25Ob3RpZmllcggBGG9yaWdpbkUBAURWZXJzaW9uZWRMb2NhdGlvbgABJGlzX2FjdGl2ZSABEGJvb2wAAQAUUmVhZHkIASByZXNwb25zZbUMAURWZXJzaW9uZWRSZXNwb25zZQABCGF0EAEsQmxvY2tOdW1iZXIAAgAAqQwEGE9wdGlvbgQEVAFFAQEIEE5vbmUAAAAQU29tZQQARQEAAAEAAK0MBBhPcHRpb24EBFQBsQwBCBBOb25lAAAAEFNvbWUEALEMAAABAACxDAAABAgICAC1DAgMeGNtRFZlcnNpb25lZFJlc3BvbnNlAAEMCFYyBAC1BQEwdjI6OlJlc3BvbnNlAAIACFYzBAD9BQEwdjM6OlJlc3BvbnNlAAMACFY0BABhBgEwdjQ6OlJlc3BvbnNlAAQAALkMAAAECBBFAQC9DAAABAwwKBAAwQwMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAHFDARTAAAEAMkMARhWZWM8VD4AAMUMAAAECEUBEADJDAAAAsUMAM0MDChwYWxsZXRfeGNtGHBhbGxldFRWZXJzaW9uTWlncmF0aW9uU3RhZ2UAARBcTWlncmF0ZVN1cHBvcnRlZFZlcnNpb24AAABcTWlncmF0ZVZlcnNpb25Ob3RpZmllcnMAAQBQTm90aWZ5Q3VycmVudFRhcmdldHMEANEMATxPcHRpb248VmVjPHU4Pj4AAgBoTWlncmF0ZUFuZE5vdGlmeU9sZFRhcmdldHMAAwAA0QwEGE9wdGlvbgQEVAE4AQgQTm9uZQAAABBTb21lBAA4AAABAADVDAAABAwQAL0GANkMDChwYWxsZXRfeGNtGHBhbGxldGhSZW1vdGVMb2NrZWRGdW5naWJsZVJlY29yZAhIQ29uc3VtZXJJZGVudGlmaWVyAYwwTWF4Q29uc3VtZXJzAAAQARhhbW91bnQYARB1MTI4AAEUb3duZXJFAQFEVmVyc2lvbmVkTG9jYXRpb24AARhsb2NrZXJFAQFEVmVyc2lvbmVkTG9jYXRpb24AASRjb25zdW1lcnPdDAHQQm91bmRlZFZlYzwoQ29uc3VtZXJJZGVudGlmaWVyLCB1MTI4KSwgTWF4Q29uc3VtZXJzPgAA3QwMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAHhDARTAAAEAOUMARhWZWM8VD4AAOEMAAAECIwYAOUMAAAC4QwA6QwMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAHtDARTAAAEAPEMARhWZWM8VD4AAO0MAAAECBhFAQDxDAAAAu0MAPUMDChwYWxsZXRfeGNtGHBhbGxldBRFcnJvcgQEVAABYCxVbnJlYWNoYWJsZQAACF0BVGhlIGRlc2lyZWQgZGVzdGluYXRpb24gd2FzIHVucmVhY2hhYmxlLCBnZW5lcmFsbHkgYmVjYXVzZSB0aGVyZSBpcyBhIG5vIHdheSBvZiByb3V0aW5nGHRvIGl0LixTZW5kRmFpbHVyZQABCEEBVGhlcmUgd2FzIHNvbWUgb3RoZXIgaXNzdWUgKGkuZS4gbm90IHRvIGRvIHdpdGggcm91dGluZykgaW4gc2VuZGluZyB0aGUgbWVzc2FnZS7IUGVyaGFwcyBhIGxhY2sgb2Ygc3BhY2UgZm9yIGJ1ZmZlcmluZyB0aGUgbWVzc2FnZS4gRmlsdGVyZWQAAgScVGhlIG1lc3NhZ2UgZXhlY3V0aW9uIGZhaWxzIHRoZSBmaWx0ZXIuSFVud2VpZ2hhYmxlTWVzc2FnZQADBLRUaGUgbWVzc2FnZSdzIHdlaWdodCBjb3VsZCBub3QgYmUgZGV0ZXJtaW5lZC5gRGVzdGluYXRpb25Ob3RJbnZlcnRpYmxlAAQE3FRoZSBkZXN0aW5hdGlvbiBgTG9jYXRpb25gIHByb3ZpZGVkIGNhbm5vdCBiZSBpbnZlcnRlZC4URW1wdHkABQSAVGhlIGFzc2V0cyB0byBiZSBzZW50IGFyZSBlbXB0eS44Q2Fubm90UmVhbmNob3IABgQ1AUNvdWxkIG5vdCByZS1hbmNob3IgdGhlIGFzc2V0cyB0byBkZWNsYXJlIHRoZSBmZWVzIGZvciB0aGUgZGVzdGluYXRpb24gY2hhaW4uNFRvb01hbnlBc3NldHMABwTEVG9vIG1hbnkgYXNzZXRzIGhhdmUgYmVlbiBhdHRlbXB0ZWQgZm9yIHRyYW5zZmVyLjRJbnZhbGlkT3JpZ2luAAgEeE9yaWdpbiBpcyBpbnZhbGlkIGZvciBzZW5kaW5nLihCYWRWZXJzaW9uAAkEIQFUaGUgdmVyc2lvbiBvZiB0aGUgYFZlcnNpb25lZGAgdmFsdWUgdXNlZCBpcyBub3QgYWJsZSB0byBiZSBpbnRlcnByZXRlZC4sQmFkTG9jYXRpb24ACghBAVRoZSBnaXZlbiBsb2NhdGlvbiBjb3VsZCBub3QgYmUgdXNlZCAoZS5nLiBiZWNhdXNlIGl0IGNhbm5vdCBiZSBleHByZXNzZWQgaW4gdGhlYGRlc2lyZWQgdmVyc2lvbiBvZiBYQ00pLjhOb1N1YnNjcmlwdGlvbgALBLxUaGUgcmVmZXJlbmNlZCBzdWJzY3JpcHRpb24gY291bGQgbm90IGJlIGZvdW5kLkRBbHJlYWR5U3Vic2NyaWJlZAAMBBEBVGhlIGxvY2F0aW9uIGlzIGludmFsaWQgc2luY2UgaXQgYWxyZWFkeSBoYXMgYSBzdWJzY3JpcHRpb24gZnJvbSB1cy5YQ2Fubm90Q2hlY2tPdXRUZWxlcG9ydAANBCkBQ291bGQgbm90IGNoZWNrLW91dCB0aGUgYXNzZXRzIGZvciB0ZWxlcG9ydGF0aW9uIHRvIHRoZSBkZXN0aW5hdGlvbiBjaGFpbi4oTG93QmFsYW5jZQAOBEEBVGhlIG93bmVyIGRvZXMgbm90IG93biAoYWxsKSBvZiB0aGUgYXNzZXQgdGhhdCB0aGV5IHdpc2ggdG8gZG8gdGhlIG9wZXJhdGlvbiBvbi4wVG9vTWFueUxvY2tzAA8EwFRoZSBhc3NldCBvd25lciBoYXMgdG9vIG1hbnkgbG9ja3Mgb24gdGhlIGFzc2V0LkxBY2NvdW50Tm90U292ZXJlaWduABAEMQFUaGUgZ2l2ZW4gYWNjb3VudCBpcyBub3QgYW4gaWRlbnRpZmlhYmxlIHNvdmVyZWlnbiBhY2NvdW50IGZvciBhbnkgbG9jYXRpb24uKEZlZXNOb3RNZXQAEQQpAVRoZSBvcGVyYXRpb24gcmVxdWlyZWQgZmVlcyB0byBiZSBwYWlkIHdoaWNoIHRoZSBpbml0aWF0b3IgY291bGQgbm90IG1lZXQuMExvY2tOb3RGb3VuZAASBPRBIHJlbW90ZSBsb2NrIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgZGF0YSBjb3VsZCBub3QgYmUgZm91bmQuFEluVXNlABMESQFUaGUgdW5sb2NrIG9wZXJhdGlvbiBjYW5ub3Qgc3VjY2VlZCBiZWNhdXNlIHRoZXJlIGFyZSBzdGlsbCBjb25zdW1lcnMgb2YgdGhlIGxvY2suaEludmFsaWRBc3NldFVua25vd25SZXNlcnZlABUE8EludmFsaWQgYXNzZXQsIHJlc2VydmUgY2hhaW4gY291bGQgbm90IGJlIGRldGVybWluZWQgZm9yIGl0LnhJbnZhbGlkQXNzZXRVbnN1cHBvcnRlZFJlc2VydmUAFgRFAUludmFsaWQgYXNzZXQsIGRvIG5vdCBzdXBwb3J0IHJlbW90ZSBhc3NldCByZXNlcnZlcyB3aXRoIGRpZmZlcmVudCBmZWVzIHJlc2VydmVzLjxUb29NYW55UmVzZXJ2ZXMAFwRJAVRvbyBtYW55IGFzc2V0cyB3aXRoIGRpZmZlcmVudCByZXNlcnZlIGxvY2F0aW9ucyBoYXZlIGJlZW4gYXR0ZW1wdGVkIGZvciB0cmFuc2Zlci5gTG9jYWxFeGVjdXRpb25JbmNvbXBsZXRlABgEfExvY2FsIFhDTSBleGVjdXRpb24gaW5jb21wbGV0ZS4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQu+QwIUHBhbGxldF9tZXNzYWdlX3F1ZXVlJEJvb2tTdGF0ZQQ0TWVzc2FnZU9yaWdpbgHFBgAYARRiZWdpbhABJFBhZ2VJbmRleAABDGVuZBABJFBhZ2VJbmRleAABFGNvdW50EAEkUGFnZUluZGV4AAFAcmVhZHlfbmVpZ2hib3Vyc/0MAYRPcHRpb248TmVpZ2hib3VyczxNZXNzYWdlT3JpZ2luPj4AATRtZXNzYWdlX2NvdW50MAEMdTY0AAEQc2l6ZTABDHU2NAAA/QwEGE9wdGlvbgQEVAEBDQEIEE5vbmUAAAAQU29tZQQAAQ0AAAEAAAENCFBwYWxsZXRfbWVzc2FnZV9xdWV1ZShOZWlnaGJvdXJzBDRNZXNzYWdlT3JpZ2luAcUGAAgBEHByZXbFBgE0TWVzc2FnZU9yaWdpbgABEG5leHTFBgE0TWVzc2FnZU9yaWdpbgAABQ0AAAQIxQYQAAkNCFBwYWxsZXRfbWVzc2FnZV9xdWV1ZRBQYWdlCBBTaXplARAgSGVhcFNpemUAABgBJHJlbWFpbmluZxABEFNpemUAAThyZW1haW5pbmdfc2l6ZRABEFNpemUAASxmaXJzdF9pbmRleBABEFNpemUAARRmaXJzdBABEFNpemUAARBsYXN0EAEQU2l6ZQABEGhlYXANDQGcQm91bmRlZFZlYzx1OCwgSW50b1UzMjxIZWFwU2l6ZSwgU2l6ZT4+AAANDQxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAQgEUwAABAA4ARhWZWM8VD4AABENDFBwYWxsZXRfbWVzc2FnZV9xdWV1ZRhwYWxsZXQURXJyb3IEBFQAASQsTm90UmVhcGFibGUAAAhJAVBhZ2UgaXMgbm90IHJlYXBhYmxlIGJlY2F1c2UgaXQgaGFzIGl0ZW1zIHJlbWFpbmluZyB0byBiZSBwcm9jZXNzZWQgYW5kIGlzIG5vdCBvbGQcZW5vdWdoLhhOb1BhZ2UAAQSEUGFnZSB0byBiZSByZWFwZWQgZG9lcyBub3QgZXhpc3QuJE5vTWVzc2FnZQACBKhUaGUgcmVmZXJlbmNlZCBtZXNzYWdlIGNvdWxkIG5vdCBiZSBmb3VuZC5AQWxyZWFkeVByb2Nlc3NlZAADBAEBVGhlIG1lc3NhZ2Ugd2FzIGFscmVhZHkgcHJvY2Vzc2VkIGFuZCBjYW5ub3QgYmUgcHJvY2Vzc2VkIGFnYWluLhhRdWV1ZWQABASsVGhlIG1lc3NhZ2UgaXMgcXVldWVkIGZvciBmdXR1cmUgZXhlY3V0aW9uLkhJbnN1ZmZpY2llbnRXZWlnaHQABQQZAVRoZXJlIGlzIHRlbXBvcmFyaWx5IG5vdCBlbm91Z2ggd2VpZ2h0IHRvIGNvbnRpbnVlIHNlcnZpY2luZyBtZXNzYWdlcy5gVGVtcG9yYXJpbHlVbnByb2Nlc3NhYmxlAAYQqFRoaXMgbWVzc2FnZSBpcyB0ZW1wb3JhcmlseSB1bnByb2Nlc3NhYmxlLgBZAVN1Y2ggZXJyb3JzIGFyZSBleHBlY3RlZCwgYnV0IG5vdCBndWFyYW50ZWVkLCB0byByZXNvbHZlIHRoZW1zZWx2ZXMgZXZlbnR1YWxseSB0aHJvdWdoJHJldHJ5aW5nLixRdWV1ZVBhdXNlZAAHDOxUaGUgcXVldWUgaXMgcGF1c2VkIGFuZCBubyBtZXNzYWdlIGNhbiBiZSBleGVjdXRlZCBmcm9tIGl0LgAdAVRoaXMgY2FuIGNoYW5nZSBhdCBhbnkgdGltZSBhbmQgbWF5IHJlc29sdmUgaW4gdGhlIGZ1dHVyZSBieSByZS10cnlpbmcuTFJlY3Vyc2l2ZURpc2FsbG93ZWQACAQxAUFub3RoZXIgY2FsbCBpcyBpbiBwcm9ncmVzcyBhbmQgbmVlZHMgdG8gZmluaXNoIGJlZm9yZSB0aGlzIGNhbGwgY2FuIGhhcHBlbi4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQuFQ0MRHBhbGxldF9hc3NldF9yYXRlGHBhbGxldBRFcnJvcgQEVAABDEBVbmtub3duQXNzZXRLaW5kAAAEeFRoZSBnaXZlbiBhc3NldCBJRCBpcyB1bmtub3duLjRBbHJlYWR5RXhpc3RzAAEEUQFUaGUgZ2l2ZW4gYXNzZXQgSUQgYWxyZWFkeSBoYXMgYW4gYXNzaWduZWQgY29udmVyc2lvbiByYXRlIGFuZCBjYW5ub3QgYmUgcmUtY3JlYXRlZC4gT3ZlcmZsb3cAAgTMT3ZlcmZsb3cgb2N1cnJlZCB3aGVuIGNhbGN1bGF0aW5nIHRoZSBpbnZlcnNlIHJhdGUuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LhkNDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBKQIEUwAABAAdDQEYVmVjPFQ+AAAdDQAAAikCACENDDBwYWxsZXRfYmVlZnkYcGFsbGV0FEVycm9yBARUAAEQYEludmFsaWRLZXlPd25lcnNoaXBQcm9vZgAABDEBQSBrZXkgb3duZXJzaGlwIHByb29mIHByb3ZpZGVkIGFzIHBhcnQgb2YgYW4gZXF1aXZvY2F0aW9uIHJlcG9ydCBpcyBpbnZhbGlkLmBJbnZhbGlkRXF1aXZvY2F0aW9uUHJvb2YAAQQxAUFuIGVxdWl2b2NhdGlvbiBwcm9vZiBwcm92aWRlZCBhcyBwYXJ0IG9mIGFuIGVxdWl2b2NhdGlvbiByZXBvcnQgaXMgaW52YWxpZC5YRHVwbGljYXRlT2ZmZW5jZVJlcG9ydAACBBUBQSBnaXZlbiBlcXVpdm9jYXRpb24gcmVwb3J0IGlzIHZhbGlkIGJ1dCBhbHJlYWR5IHByZXZpb3VzbHkgcmVwb3J0ZWQuUEludmFsaWRDb25maWd1cmF0aW9uAAMEjFN1Ym1pdHRlZCBjb25maWd1cmF0aW9uIGlzIGludmFsaWQuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LiUNDEhzcF9jb25zZW5zdXNfYmVlZnkMbW1yREJlZWZ5QXV0aG9yaXR5U2V0BFhBdXRob3JpdHlTZXRDb21taXRtZW50ATQADAEIaWQwAVRjcmF0ZTo6VmFsaWRhdG9yU2V0SWQAAQxsZW4QAQx1MzIAAURrZXlzZXRfY29tbWl0bWVudDQBWEF1dGhvcml0eVNldENvbW1pdG1lbnQAACkNAAAEKC0NMQ01DTkNPQ1FDUkNTQ1RDVUNAC0NEDBmcmFtZV9zeXN0ZW0oZXh0ZW5zaW9uc1RjaGVja19ub25femVyb19zZW5kZXJIQ2hlY2tOb25aZXJvU2VuZGVyBARUAAAAADENEDBmcmFtZV9zeXN0ZW0oZXh0ZW5zaW9uc0hjaGVja19zcGVjX3ZlcnNpb25AQ2hlY2tTcGVjVmVyc2lvbgQEVAAAAAA1DRAwZnJhbWVfc3lzdGVtKGV4dGVuc2lvbnNAY2hlY2tfdHhfdmVyc2lvbjhDaGVja1R4VmVyc2lvbgQEVAAAAAA5DRAwZnJhbWVfc3lzdGVtKGV4dGVuc2lvbnM0Y2hlY2tfZ2VuZXNpczBDaGVja0dlbmVzaXMEBFQAAAAAPQ0QMGZyYW1lX3N5c3RlbShleHRlbnNpb25zPGNoZWNrX21vcnRhbGl0eThDaGVja01vcnRhbGl0eQQEVAAABABBDQEMRXJhAABBDRAoc3BfcnVudGltZRxnZW5lcmljDGVyYQxFcmEAAQEEIEltbW9ydGFsAAAAHE1vcnRhbDEEAAgAAAEAHE1vcnRhbDIEAAgAAAIAHE1vcnRhbDMEAAgAAAMAHE1vcnRhbDQEAAgAAAQAHE1vcnRhbDUEAAgAAAUAHE1vcnRhbDYEAAgAAAYAHE1vcnRhbDcEAAgAAAcAHE1vcnRhbDgEAAgAAAgAHE1vcnRhbDkEAAgAAAkAIE1vcnRhbDEwBAAIAAAKACBNb3J0YWwxMQQACAAACwAgTW9ydGFsMTIEAAgAAAwAIE1vcnRhbDEzBAAIAAANACBNb3J0YWwxNAQACAAADgAgTW9ydGFsMTUEAAgAAA8AIE1vcnRhbDE2BAAIAAAQACBNb3J0YWwxNwQACAAAEQAgTW9ydGFsMTgEAAgAABIAIE1vcnRhbDE5BAAIAAATACBNb3J0YWwyMAQACAAAFAAgTW9ydGFsMjEEAAgAABUAIE1vcnRhbDIyBAAIAAAWACBNb3J0YWwyMwQACAAAFwAgTW9ydGFsMjQEAAgAABgAIE1vcnRhbDI1BAAIAAAZACBNb3J0YWwyNgQACAAAGgAgTW9ydGFsMjcEAAgAABsAIE1vcnRhbDI4BAAIAAAcACBNb3J0YWwyOQQACAAAHQAgTW9ydGFsMzAEAAgAAB4AIE1vcnRhbDMxBAAIAAAfACBNb3J0YWwzMgQACAAAIAAgTW9ydGFsMzMEAAgAACEAIE1vcnRhbDM0BAAIAAAiACBNb3J0YWwzNQQACAAAIwAgTW9ydGFsMzYEAAgAACQAIE1vcnRhbDM3BAAIAAAlACBNb3J0YWwzOAQACAAAJgAgTW9ydGFsMzkEAAgAACcAIE1vcnRhbDQwBAAIAAAoACBNb3J0YWw0MQQACAAAKQAgTW9ydGFsNDIEAAgAACoAIE1vcnRhbDQzBAAIAAArACBNb3J0YWw0NAQACAAALAAgTW9ydGFsNDUEAAgAAC0AIE1vcnRhbDQ2BAAIAAAuACBNb3J0YWw0NwQACAAALwAgTW9ydGFsNDgEAAgAADAAIE1vcnRhbDQ5BAAIAAAxACBNb3J0YWw1MAQACAAAMgAgTW9ydGFsNTEEAAgAADMAIE1vcnRhbDUyBAAIAAA0ACBNb3J0YWw1MwQACAAANQAgTW9ydGFsNTQEAAgAADYAIE1vcnRhbDU1BAAIAAA3ACBNb3J0YWw1NgQACAAAOAAgTW9ydGFsNTcEAAgAADkAIE1vcnRhbDU4BAAIAAA6ACBNb3J0YWw1OQQACAAAOwAgTW9ydGFsNjAEAAgAADwAIE1vcnRhbDYxBAAIAAA9ACBNb3J0YWw2MgQACAAAPgAgTW9ydGFsNjMEAAgAAD8AIE1vcnRhbDY0BAAIAABAACBNb3J0YWw2NQQACAAAQQAgTW9ydGFsNjYEAAgAAEIAIE1vcnRhbDY3BAAIAABDACBNb3J0YWw2OAQACAAARAAgTW9ydGFsNjkEAAgAAEUAIE1vcnRhbDcwBAAIAABGACBNb3J0YWw3MQQACAAARwAgTW9ydGFsNzIEAAgAAEgAIE1vcnRhbDczBAAIAABJACBNb3J0YWw3NAQACAAASgAgTW9ydGFsNzUEAAgAAEsAIE1vcnRhbDc2BAAIAABMACBNb3J0YWw3NwQACAAATQAgTW9ydGFsNzgEAAgAAE4AIE1vcnRhbDc5BAAIAABPACBNb3J0YWw4MAQACAAAUAAgTW9ydGFsODEEAAgAAFEAIE1vcnRhbDgyBAAIAABSACBNb3J0YWw4MwQACAAAUwAgTW9ydGFsODQEAAgAAFQAIE1vcnRhbDg1BAAIAABVACBNb3J0YWw4NgQACAAAVgAgTW9ydGFsODcEAAgAAFcAIE1vcnRhbDg4BAAIAABYACBNb3J0YWw4OQQACAAAWQAgTW9ydGFsOTAEAAgAAFoAIE1vcnRhbDkxBAAIAABbACBNb3J0YWw5MgQACAAAXAAgTW9ydGFsOTMEAAgAAF0AIE1vcnRhbDk0BAAIAABeACBNb3J0YWw5NQQACAAAXwAgTW9ydGFsOTYEAAgAAGAAIE1vcnRhbDk3BAAIAABhACBNb3J0YWw5OAQACAAAYgAgTW9ydGFsOTkEAAgAAGMAJE1vcnRhbDEwMAQACAAAZAAkTW9ydGFsMTAxBAAIAABlACRNb3J0YWwxMDIEAAgAAGYAJE1vcnRhbDEwMwQACAAAZwAkTW9ydGFsMTA0BAAIAABoACRNb3J0YWwxMDUEAAgAAGkAJE1vcnRhbDEwNgQACAAAagAkTW9ydGFsMTA3BAAIAABrACRNb3J0YWwxMDgEAAgAAGwAJE1vcnRhbDEwOQQACAAAbQAkTW9ydGFsMTEwBAAIAABuACRNb3J0YWwxMTEEAAgAAG8AJE1vcnRhbDExMgQACAAAcAAkTW9ydGFsMTEzBAAIAABxACRNb3J0YWwxMTQEAAgAAHIAJE1vcnRhbDExNQQACAAAcwAkTW9ydGFsMTE2BAAIAAB0ACRNb3J0YWwxMTcEAAgAAHUAJE1vcnRhbDExOAQACAAAdgAkTW9ydGFsMTE5BAAIAAB3ACRNb3J0YWwxMjAEAAgAAHgAJE1vcnRhbDEyMQQACAAAeQAkTW9ydGFsMTIyBAAIAAB6ACRNb3J0YWwxMjMEAAgAAHsAJE1vcnRhbDEyNAQACAAAfAAkTW9ydGFsMTI1BAAIAAB9ACRNb3J0YWwxMjYEAAgAAH4AJE1vcnRhbDEyNwQACAAAfwAkTW9ydGFsMTI4BAAIAACAACRNb3J0YWwxMjkEAAgAAIEAJE1vcnRhbDEzMAQACAAAggAkTW9ydGFsMTMxBAAIAACDACRNb3J0YWwxMzIEAAgAAIQAJE1vcnRhbDEzMwQACAAAhQAkTW9ydGFsMTM0BAAIAACGACRNb3J0YWwxMzUEAAgAAIcAJE1vcnRhbDEzNgQACAAAiAAkTW9ydGFsMTM3BAAIAACJACRNb3J0YWwxMzgEAAgAAIoAJE1vcnRhbDEzOQQACAAAiwAkTW9ydGFsMTQwBAAIAACMACRNb3J0YWwxNDEEAAgAAI0AJE1vcnRhbDE0MgQACAAAjgAkTW9ydGFsMTQzBAAIAACPACRNb3J0YWwxNDQEAAgAAJAAJE1vcnRhbDE0NQQACAAAkQAkTW9ydGFsMTQ2BAAIAACSACRNb3J0YWwxNDcEAAgAAJMAJE1vcnRhbDE0OAQACAAAlAAkTW9ydGFsMTQ5BAAIAACVACRNb3J0YWwxNTAEAAgAAJYAJE1vcnRhbDE1MQQACAAAlwAkTW9ydGFsMTUyBAAIAACYACRNb3J0YWwxNTMEAAgAAJkAJE1vcnRhbDE1NAQACAAAmgAkTW9ydGFsMTU1BAAIAACbACRNb3J0YWwxNTYEAAgAAJwAJE1vcnRhbDE1NwQACAAAnQAkTW9ydGFsMTU4BAAIAACeACRNb3J0YWwxNTkEAAgAAJ8AJE1vcnRhbDE2MAQACAAAoAAkTW9ydGFsMTYxBAAIAAChACRNb3J0YWwxNjIEAAgAAKIAJE1vcnRhbDE2MwQACAAAowAkTW9ydGFsMTY0BAAIAACkACRNb3J0YWwxNjUEAAgAAKUAJE1vcnRhbDE2NgQACAAApgAkTW9ydGFsMTY3BAAIAACnACRNb3J0YWwxNjgEAAgAAKgAJE1vcnRhbDE2OQQACAAAqQAkTW9ydGFsMTcwBAAIAACqACRNb3J0YWwxNzEEAAgAAKsAJE1vcnRhbDE3MgQACAAArAAkTW9ydGFsMTczBAAIAACtACRNb3J0YWwxNzQEAAgAAK4AJE1vcnRhbDE3NQQACAAArwAkTW9ydGFsMTc2BAAIAACwACRNb3J0YWwxNzcEAAgAALEAJE1vcnRhbDE3OAQACAAAsgAkTW9ydGFsMTc5BAAIAACzACRNb3J0YWwxODAEAAgAALQAJE1vcnRhbDE4MQQACAAAtQAkTW9ydGFsMTgyBAAIAAC2ACRNb3J0YWwxODMEAAgAALcAJE1vcnRhbDE4NAQACAAAuAAkTW9ydGFsMTg1BAAIAAC5ACRNb3J0YWwxODYEAAgAALoAJE1vcnRhbDE4NwQACAAAuwAkTW9ydGFsMTg4BAAIAAC8ACRNb3J0YWwxODkEAAgAAL0AJE1vcnRhbDE5MAQACAAAvgAkTW9ydGFsMTkxBAAIAAC/ACRNb3J0YWwxOTIEAAgAAMAAJE1vcnRhbDE5MwQACAAAwQAkTW9ydGFsMTk0BAAIAADCACRNb3J0YWwxOTUEAAgAAMMAJE1vcnRhbDE5NgQACAAAxAAkTW9ydGFsMTk3BAAIAADFACRNb3J0YWwxOTgEAAgAAMYAJE1vcnRhbDE5OQQACAAAxwAkTW9ydGFsMjAwBAAIAADIACRNb3J0YWwyMDEEAAgAAMkAJE1vcnRhbDIwMgQACAAAygAkTW9ydGFsMjAzBAAIAADLACRNb3J0YWwyMDQEAAgAAMwAJE1vcnRhbDIwNQQACAAAzQAkTW9ydGFsMjA2BAAIAADOACRNb3J0YWwyMDcEAAgAAM8AJE1vcnRhbDIwOAQACAAA0AAkTW9ydGFsMjA5BAAIAADRACRNb3J0YWwyMTAEAAgAANIAJE1vcnRhbDIxMQQACAAA0wAkTW9ydGFsMjEyBAAIAADUACRNb3J0YWwyMTMEAAgAANUAJE1vcnRhbDIxNAQACAAA1gAkTW9ydGFsMjE1BAAIAADXACRNb3J0YWwyMTYEAAgAANgAJE1vcnRhbDIxNwQACAAA2QAkTW9ydGFsMjE4BAAIAADaACRNb3J0YWwyMTkEAAgAANsAJE1vcnRhbDIyMAQACAAA3AAkTW9ydGFsMjIxBAAIAADdACRNb3J0YWwyMjIEAAgAAN4AJE1vcnRhbDIyMwQACAAA3wAkTW9ydGFsMjI0BAAIAADgACRNb3J0YWwyMjUEAAgAAOEAJE1vcnRhbDIyNgQACAAA4gAkTW9ydGFsMjI3BAAIAADjACRNb3J0YWwyMjgEAAgAAOQAJE1vcnRhbDIyOQQACAAA5QAkTW9ydGFsMjMwBAAIAADmACRNb3J0YWwyMzEEAAgAAOcAJE1vcnRhbDIzMgQACAAA6AAkTW9ydGFsMjMzBAAIAADpACRNb3J0YWwyMzQEAAgAAOoAJE1vcnRhbDIzNQQACAAA6wAkTW9ydGFsMjM2BAAIAADsACRNb3J0YWwyMzcEAAgAAO0AJE1vcnRhbDIzOAQACAAA7gAkTW9ydGFsMjM5BAAIAADvACRNb3J0YWwyNDAEAAgAAPAAJE1vcnRhbDI0MQQACAAA8QAkTW9ydGFsMjQyBAAIAADyACRNb3J0YWwyNDMEAAgAAPMAJE1vcnRhbDI0NAQACAAA9AAkTW9ydGFsMjQ1BAAIAAD1ACRNb3J0YWwyNDYEAAgAAPYAJE1vcnRhbDI0NwQACAAA9wAkTW9ydGFsMjQ4BAAIAAD4ACRNb3J0YWwyNDkEAAgAAPkAJE1vcnRhbDI1MAQACAAA+gAkTW9ydGFsMjUxBAAIAAD7ACRNb3J0YWwyNTIEAAgAAPwAJE1vcnRhbDI1MwQACAAA/QAkTW9ydGFsMjU0BAAIAAD+ACRNb3J0YWwyNTUEAAgAAP8AAEUNEDBmcmFtZV9zeXN0ZW0oZXh0ZW5zaW9ucyxjaGVja19ub25jZShDaGVja05vbmNlBARUAAAEAOwBIFQ6Ok5vbmNlAABJDRAwZnJhbWVfc3lzdGVtKGV4dGVuc2lvbnMwY2hlY2tfd2VpZ2h0LENoZWNrV2VpZ2h0BARUAAAAAE0NCGhwYWxsZXRfdHJhbnNhY3Rpb25fcGF5bWVudGBDaGFyZ2VUcmFuc2FjdGlvblBheW1lbnQEBFQAAAQA/AEwQmFsYW5jZU9mPFQ+AABRDQxccG9sa2Fkb3RfcnVudGltZV9jb21tb24YY2xhaW1zSFByZXZhbGlkYXRlQXR0ZXN0cwQEVAAAAABVDQh0ZnJhbWVfbWV0YWRhdGFfaGFzaF9leHRlbnNpb25EQ2hlY2tNZXRhZGF0YUhhc2gEBFQAAAQBEG1vZGVZDQEQTW9kZQAAWQ0IdGZyYW1lX21ldGFkYXRhX2hhc2hfZXh0ZW5zaW9uEE1vZGUAAQggRGlzYWJsZWQAAAAcRW5hYmxlZAABAABdDQhAcG9sa2Fkb3RfcnVudGltZRxSdW50aW1lAAAAAGENDDByZWxheV9jb21tb24QYXBpczRJbmZsYXRpb25JbmZvAAAIASRpbmZsYXRpb265AgFcc3BfcnVudGltZTo6UGVycXVpbnRpbGwAASRuZXh0X21pbnRlDQHwKHBvbGthZG90X3ByaW1pdGl2ZXM6OkJhbGFuY2UsIHBvbGthZG90X3ByaW1pdGl2ZXM6OkJhbGFuY2UpAABlDQAABAgYGABpDRAoc3BfcnVudGltZRxnZW5lcmljFGJsb2NrFEJsb2NrCBhIZWFkZXIBoQEkRXh0cmluc2ljAW0NAAgBGGhlYWRlcqEBARhIZWFkZXIAAShleHRyaW5zaWNzcQ0BOFZlYzxFeHRyaW5zaWM+AABtDRAoc3BfcnVudGltZRxnZW5lcmljTHVuY2hlY2tlZF9leHRyaW5zaWNIVW5jaGVja2VkRXh0cmluc2ljEBxBZGRyZXNzAcUBEENhbGwBdQEkU2lnbmF0dXJlAVUFFEV4dHJhASkNAAQAOAAAAHENAAACbQ0AdQ0IKHNwX3J1bnRpbWVYRXh0cmluc2ljSW5jbHVzaW9uTW9kZQABCDRBbGxFeHRyaW5zaWNzAAAANE9ubHlJbmhlcmVudHMAAQAAeQ0IHHNwX2NvcmU4T3BhcXVlTWV0YWRhdGEAAAQAOAEcVmVjPHU4PgAAfQ0EGE9wdGlvbgQEVAF5DQEIEE5vbmUAAAAQU29tZQQAeQ0AAAEAAIENBBhSZXN1bHQIBFQBiARFAYUNAQgIT2sEAIgAAAAADEVycgQAhQ0AAAEAAIUNDChzcF9ydW50aW1lUHRyYW5zYWN0aW9uX3ZhbGlkaXR5YFRyYW5zYWN0aW9uVmFsaWRpdHlFcnJvcgABCBxJbnZhbGlkBACJDQFISW52YWxpZFRyYW5zYWN0aW9uAAAAHFVua25vd24EAI0NAUhVbmtub3duVHJhbnNhY3Rpb24AAQAAiQ0MKHNwX3J1bnRpbWVQdHJhbnNhY3Rpb25fdmFsaWRpdHlISW52YWxpZFRyYW5zYWN0aW9uAAEsEENhbGwAAAAcUGF5bWVudAABABhGdXR1cmUAAgAUU3RhbGUAAwAgQmFkUHJvb2YABABEQW5jaWVudEJpcnRoQmxvY2sABQBERXhoYXVzdHNSZXNvdXJjZXMABgAYQ3VzdG9tBAAIAQh1OAAHADBCYWRNYW5kYXRvcnkACABMTWFuZGF0b3J5VmFsaWRhdGlvbgAJACRCYWRTaWduZXIACgAAjQ0MKHNwX3J1bnRpbWVQdHJhbnNhY3Rpb25fdmFsaWRpdHlIVW5rbm93blRyYW5zYWN0aW9uAAEMMENhbm5vdExvb2t1cAAAAExOb1Vuc2lnbmVkVmFsaWRhdG9yAAEAGEN1c3RvbQQACAEIdTgAAgAAkQ0IMHNwX2luaGVyZW50czBJbmhlcmVudERhdGEAAAQBEGRhdGGVDQGUQlRyZWVNYXA8SW5oZXJlbnRJZGVudGlmaWVyLCBWZWM8dTg+PgAAlQ0EIEJUcmVlTWFwCARLAbEFBFYBOAAEAJkNAAAAmQ0AAAKdDQCdDQAABAixBTgAoQ0IMHNwX2luaGVyZW50c1BDaGVja0luaGVyZW50c1Jlc3VsdAAADAEQb2theSABEGJvb2wAASxmYXRhbF9lcnJvciABEGJvb2wAARhlcnJvcnORDQEwSW5oZXJlbnREYXRhAAClDQwoc3BfcnVudGltZVB0cmFuc2FjdGlvbl92YWxpZGl0eURUcmFuc2FjdGlvblNvdXJjZQABDBxJbkJsb2NrAAAAFExvY2FsAAEAIEV4dGVybmFsAAIAAKkNBBhSZXN1bHQIBFQBrQ0ERQGFDQEICE9rBACtDQAAAAAMRXJyBACFDQAAAQAArQ0MKHNwX3J1bnRpbWVQdHJhbnNhY3Rpb25fdmFsaWRpdHlAVmFsaWRUcmFuc2FjdGlvbgAAFAEgcHJpb3JpdHkwAUxUcmFuc2FjdGlvblByaW9yaXR5AAEgcmVxdWlyZXOFAQFMVmVjPFRyYW5zYWN0aW9uVGFnPgABIHByb3ZpZGVzhQEBTFZlYzxUcmFuc2FjdGlvblRhZz4AASRsb25nZXZpdHkwAVBUcmFuc2FjdGlvbkxvbmdldml0eQABJHByb3BhZ2F0ZSABEGJvb2wAALENAAAECE0LtQ0AtQ0MTHBvbGthZG90X3ByaW1pdGl2ZXMIdjdER3JvdXBSb3RhdGlvbkluZm8EBE4BEAAMAUxzZXNzaW9uX3N0YXJ0X2Jsb2NrEAEETgABYGdyb3VwX3JvdGF0aW9uX2ZyZXF1ZW5jeRABBE4AAQxub3cQAQROAAC5DQAAAr0NAL0NDExwb2xrYWRvdF9wcmltaXRpdmVzCHY3JENvcmVTdGF0ZQgESAE0BE4BEAEMIE9jY3VwaWVkBADBDQFIT2NjdXBpZWRDb3JlPEgsIE4+AAAAJFNjaGVkdWxlZAQAyQ0BNFNjaGVkdWxlZENvcmUAAQAQRnJlZQACAADBDQxMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2NzBPY2N1cGllZENvcmUIBEgBNAROARAAIAFQbmV4dF91cF9vbl9hdmFpbGFibGXFDQFUT3B0aW9uPFNjaGVkdWxlZENvcmU+AAE4b2NjdXBpZWRfc2luY2UQAQROAAEsdGltZV9vdXRfYXQQAQROAAFMbmV4dF91cF9vbl90aW1lX291dMUNAVRPcHRpb248U2NoZWR1bGVkQ29yZT4AATBhdmFpbGFiaWxpdHmRBAF8Qml0VmVjPHU4LCBiaXR2ZWM6Om9yZGVyOjpMc2IwPgABRGdyb3VwX3Jlc3BvbnNpYmxldQcBKEdyb3VwSW5kZXgAAThjYW5kaWRhdGVfaGFzaO0EATRDYW5kaWRhdGVIYXNoAAFQY2FuZGlkYXRlX2Rlc2NyaXB0b3KtBAFYQ2FuZGlkYXRlRGVzY3JpcHRvcjxIPgAAxQ0EGE9wdGlvbgQEVAHJDQEIEE5vbmUAAAAQU29tZQQAyQ0AAAEAAMkNDExwb2xrYWRvdF9wcmltaXRpdmVzCHY3NFNjaGVkdWxlZENvcmUAAAgBHHBhcmFfaWSNAgEISWQAASBjb2xsYXRvcs0NAUhPcHRpb248Q29sbGF0b3JJZD4AAM0NBBhPcHRpb24EBFQBsQQBCBBOb25lAAAAEFNvbWUEALEEAAABAADRDQxMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2N1hPY2N1cGllZENvcmVBc3N1bXB0aW9uAAEMIEluY2x1ZGVkAAAAIFRpbWVkT3V0AAEAEEZyZWUAAgAA1Q0EGE9wdGlvbgQEVAHZDQEIEE5vbmUAAAAQU29tZQQA2Q0AAAEAANkNDExwb2xrYWRvdF9wcmltaXRpdmVzCHY3XFBlcnNpc3RlZFZhbGlkYXRpb25EYXRhCARIATQETgEQABABLHBhcmVudF9oZWFk2QQBIEhlYWREYXRhAAFMcmVsYXlfcGFyZW50X251bWJlchABBE4AAWRyZWxheV9wYXJlbnRfc3RvcmFnZV9yb290NAEESAABMG1heF9wb3Zfc2l6ZRABDHUzMgAA3Q0EGE9wdGlvbgQEVAHhDQEIEE5vbmUAAAAQU29tZQQA4Q0AAAEAAOENAAAECNkNuQQA5Q0EGE9wdGlvbgQEVAGpBAEIEE5vbmUAAAAQU29tZQQAqQQAAAEAAOkNAAAC7Q0A7Q0MTHBvbGthZG90X3ByaW1pdGl2ZXMIdjc4Q2FuZGlkYXRlRXZlbnQEBEgBNAEMPENhbmRpZGF0ZUJhY2tlZBAAbQcBTENhbmRpZGF0ZVJlY2VpcHQ8SD4AANkEASBIZWFkRGF0YQAAcQcBJENvcmVJbmRleAAAdQcBKEdyb3VwSW5kZXgAAABEQ2FuZGlkYXRlSW5jbHVkZWQQAG0HAUxDYW5kaWRhdGVSZWNlaXB0PEg+AADZBAEgSGVhZERhdGEAAHEHASRDb3JlSW5kZXgAAHUHAShHcm91cEluZGV4AAEARENhbmRpZGF0ZVRpbWVkT3V0DABtBwFMQ2FuZGlkYXRlUmVjZWlwdDxIPgAA2QQBIEhlYWREYXRhAABxBwEkQ29yZUluZGV4AAIAAPENBCBCVHJlZU1hcAgESwGNAgRWAc0LAAQA9Q0AAAD1DQAAAvkNAPkNAAAECI0CzQsA/Q0EGE9wdGlvbgQEVAE1CwEIEE5vbmUAAAAQU29tZQQANQsAAAEAAAEOBBhPcHRpb24EBFQB5QsBCBBOb25lAAAAEFNvbWUEAOULAAABAAAFDgQYT3B0aW9uBARUAbkEAQgQTm9uZQAAABBTb21lBAC5BAAAAQAACQ4AAAINDgANDgAABAwQ7QT1CwARDgQYT3B0aW9uBARUAVkEAQgQTm9uZQAAABBTb21lBABZBAAAAQAAFQ4AAAIZDgAZDgAABAwQ7QQBDAAdDgQYT3B0aW9uBARUASEOAQgQTm9uZQAAABBTb21lBAAhDgAAAQAAIQ4QTHBvbGthZG90X3ByaW1pdGl2ZXMIdjcgc2xhc2hpbmdcT3BhcXVlS2V5T3duZXJzaGlwUHJvb2YAAAQAOAEcVmVjPHU4PgAAJQ4EGE9wdGlvbgQEVAGMAQgQTm9uZQAAABBTb21lBACMAAABAAApDgQYT3B0aW9uBARUAS0OAQgQTm9uZQAAABBTb21lBAAtDgAAAQAALQ4QTHBvbGthZG90X3ByaW1pdGl2ZXMIdjc0YXN5bmNfYmFja2luZzBCYWNraW5nU3RhdGUIBEgBNAROARAACAEsY29uc3RyYWludHMxDgE4Q29uc3RyYWludHM8Tj4AAVBwZW5kaW5nX2F2YWlsYWJpbGl0eVEOAZxWZWM8Q2FuZGlkYXRlUGVuZGluZ0F2YWlsYWJpbGl0eTxILCBOPj4AADEOEExwb2xrYWRvdF9wcmltaXRpdmVzCHY3NGFzeW5jX2JhY2tpbmcsQ29uc3RyYWludHMEBE4BEAA4AVxtaW5fcmVsYXlfcGFyZW50X251bWJlchABBE4AATBtYXhfcG92X3NpemUQAQx1MzIAATRtYXhfY29kZV9zaXplEAEMdTMyAAE0dW1wX3JlbWFpbmluZxABDHUzMgABTHVtcF9yZW1haW5pbmdfYnl0ZXMQAQx1MzIAAWRtYXhfdW1wX251bV9wZXJfY2FuZGlkYXRlEAEMdTMyAAFYZG1wX3JlbWFpbmluZ19tZXNzYWdlc+UBARhWZWM8Tj4AATBocm1wX2luYm91bmQ1DgFkSW5ib3VuZEhybXBMaW1pdGF0aW9uczxOPgABRGhybXBfY2hhbm5lbHNfb3V0OQ4BpFZlYzwoSWQsIE91dGJvdW5kSHJtcENoYW5uZWxMaW1pdGF0aW9ucyk+AAFobWF4X2hybXBfbnVtX3Blcl9jYW5kaWRhdGUQAQx1MzIAATxyZXF1aXJlZF9wYXJlbnTZBAEgSGVhZERhdGEAAVB2YWxpZGF0aW9uX2NvZGVfaGFzaLkEAUhWYWxpZGF0aW9uQ29kZUhhc2gAAUx1cGdyYWRlX3Jlc3RyaWN0aW9uRQ4BaE9wdGlvbjxVcGdyYWRlUmVzdHJpY3Rpb24+AAFYZnV0dXJlX3ZhbGlkYXRpb25fY29kZUkOAXxPcHRpb248KE4sIFZhbGlkYXRpb25Db2RlSGFzaCk+AAA1DhBMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2NzRhc3luY19iYWNraW5nWEluYm91bmRIcm1wTGltaXRhdGlvbnMEBE4BEAAEAUB2YWxpZF93YXRlcm1hcmtz5QEBGFZlYzxOPgAAOQ4AAAI9DgA9DgAABAiNAkEOAEEOEExwb2xrYWRvdF9wcmltaXRpdmVzCHY3NGFzeW5jX2JhY2tpbmd4T3V0Ym91bmRIcm1wQ2hhbm5lbExpbWl0YXRpb25zAAAIATxieXRlc19yZW1haW5pbmcQAQx1MzIAAUhtZXNzYWdlc19yZW1haW5pbmcQAQx1MzIAAEUOBBhPcHRpb24EBFQBpQsBCBBOb25lAAAAEFNvbWUEAKULAAABAABJDgQYT3B0aW9uBARUAU0OAQgQTm9uZQAAABBTb21lBABNDgAAAQAATQ4AAAQIELkEAFEOAAACVQ4AVQ4QTHBvbGthZG90X3ByaW1pdGl2ZXMIdjc0YXN5bmNfYmFja2luZ3BDYW5kaWRhdGVQZW5kaW5nQXZhaWxhYmlsaXR5CARIATQETgEQABQBOGNhbmRpZGF0ZV9oYXNo7QQBNENhbmRpZGF0ZUhhc2gAAShkZXNjcmlwdG9yrQQBWENhbmRpZGF0ZURlc2NyaXB0b3I8SD4AASxjb21taXRtZW50c70EAVBDYW5kaWRhdGVDb21taXRtZW50cwABTHJlbGF5X3BhcmVudF9udW1iZXIQAQROAAEwbWF4X3Bvdl9zaXplEAEMdTMyAABZDgQgQlRyZWVNYXAIBEsBcQcEVgGFCwAEAF0OAAAAXQ4AAAJhDgBhDgAABAhxB4ULAGUOAAACqQQAaQ4EGE9wdGlvbgQEVAFtDgEIEE5vbmUAAAAQU29tZQQAbQ4AAAEAAG0OCEhzcF9jb25zZW5zdXNfYmVlZnkwVmFsaWRhdG9yU2V0BCxBdXRob3JpdHlJZAEpAgAIASh2YWxpZGF0b3JzHQ0BQFZlYzxBdXRob3JpdHlJZD4AAQhpZDABOFZhbGlkYXRvclNldElkAABxDggoc3BfcnVudGltZSxPcGFxdWVWYWx1ZQAABAA4ARxWZWM8dTg+AAB1DgQYT3B0aW9uBARUAXEOAQgQTm9uZQAAABBTb21lBABxDgAAAQAAeQ4EGFJlc3VsdAgEVAE0BEUBfQ4BCAhPawQANAAAAAAMRXJyBAB9DgAAAQAAfQ4IRHNwX21tcl9wcmltaXRpdmVzFEVycm9yAAEoQEludmFsaWROdW1lcmljT3AAAAAQUHVzaAABABxHZXRSb290AAIAGENvbW1pdAADADRHZW5lcmF0ZVByb29mAAQAGFZlcmlmeQAFADBMZWFmTm90Rm91bmQABgBEUGFsbGV0Tm90SW5jbHVkZWQABwBASW52YWxpZExlYWZJbmRleAAIAFRJbnZhbGlkQmVzdEtub3duQmxvY2sACQAAgQ4EGFJlc3VsdAgEVAEwBEUBfQ4BCAhPawQAMAAAAAAMRXJyBAB9DgAAAQAAhQ4EGFJlc3VsdAgEVAGJDgRFAX0OAQgIT2sEAIkOAAAAAAxFcnIEAH0OAAABAACJDgAABAiNDpUOAI0OAAACkQ4AkQ4IRHNwX21tcl9wcmltaXRpdmVzTEVuY29kYWJsZU9wYXF1ZUxlYWYAAAQAOAEcVmVjPHU4PgAAlQ4IRHNwX21tcl9wcmltaXRpdmVzJExlYWZQcm9vZgQQSGFzaAE0AAwBMGxlYWZfaW5kaWNlc6EKAThWZWM8TGVhZkluZGV4PgABKGxlYWZfY291bnQwASROb2RlSW5kZXgAARRpdGVtc5UBASRWZWM8SGFzaD4AAJkOBBhSZXN1bHQIBFQBjARFAX0OAQgIT2sEAIwAAAAADEVycgQAfQ4AAAEAAJ0OCERzcF9jb25zZW5zdXNfYmFiZURCYWJlQ29uZmlndXJhdGlvbgAAGAE0c2xvdF9kdXJhdGlvbjABDHU2NAABMGVwb2NoX2xlbmd0aDABDHU2NAABBGO1AQEoKHU2NCwgdTY0KQABLGF1dGhvcml0aWVzSQgBnFZlYzwoQXV0aG9yaXR5SWQsIEJhYmVBdXRob3JpdHlXZWlnaHQpPgABKHJhbmRvbW5lc3MEAShSYW5kb21uZXNzAAE0YWxsb3dlZF9zbG90c7kBATBBbGxvd2VkU2xvdHMAAKEOCERzcF9jb25zZW5zdXNfYmFiZRRFcG9jaAAAGAEsZXBvY2hfaW5kZXgwAQx1NjQAAShzdGFydF9zbG90qQEBEFNsb3QAASBkdXJhdGlvbjABDHU2NAABLGF1dGhvcml0aWVzSQgBnFZlYzwoQXV0aG9yaXR5SWQsIEJhYmVBdXRob3JpdHlXZWlnaHQpPgABKHJhbmRvbW5lc3MEAShSYW5kb21uZXNzAAEYY29uZmlnbQgBWEJhYmVFcG9jaENvbmZpZ3VyYXRpb24AAKUOBBhPcHRpb24EBFQBqQ4BCBBOb25lAAAAEFNvbWUEAKkOAAABAACpDghEc3BfY29uc2Vuc3VzX2JhYmVcT3BhcXVlS2V5T3duZXJzaGlwUHJvb2YAAAQAOAEcVmVjPHU4PgAArQ4EGE9wdGlvbgQEVAGxDgEIEE5vbmUAAAAQU29tZQQAsQ4AAAEAALEOAAACtQ4AtQ4AAAQIOE0JALkODGhwYWxsZXRfdHJhbnNhY3Rpb25fcGF5bWVudBR0eXBlc0xSdW50aW1lRGlzcGF0Y2hJbmZvCBxCYWxhbmNlARgYV2VpZ2h0ASgADAEYd2VpZ2h0KAEYV2VpZ2h0AAEUY2xhc3NgATREaXNwYXRjaENsYXNzAAEscGFydGlhbF9mZWUYARxCYWxhbmNlAAC9DgxocGFsbGV0X3RyYW5zYWN0aW9uX3BheW1lbnQUdHlwZXMoRmVlRGV0YWlscwQcQmFsYW5jZQEYAAgBNGluY2x1c2lvbl9mZWXBDgF0T3B0aW9uPEluY2x1c2lvbkZlZTxCYWxhbmNlPj4AAQx0aXAYARxCYWxhbmNlAADBDgQYT3B0aW9uBARUAcUOAQgQTm9uZQAAABBTb21lBADFDgAAAQAAxQ4MaHBhbGxldF90cmFuc2FjdGlvbl9wYXltZW50FHR5cGVzMEluY2x1c2lvbkZlZQQcQmFsYW5jZQEYAAwBIGJhc2VfZmVlGAEcQmFsYW5jZQABHGxlbl9mZWUYARxCYWxhbmNlAAFMYWRqdXN0ZWRfd2VpZ2h0X2ZlZRgBHEJhbGFuY2UAAMkOBBhSZXN1bHQIBFQBzQ4ERQHRDgEICE9rBADNDgAAAAAMRXJyBADRDgAAAQAAzQ4AAAK9BgDRDgxAeGNtX3J1bnRpbWVfYXBpcxBmZWVzFEVycm9yAAEYNFVuaW1wbGVtZW50ZWQAAABkVmVyc2lvbmVkQ29udmVyc2lvbkZhaWxlZAABAExXZWlnaHROb3RDb21wdXRhYmxlAAIATFVuaGFuZGxlZFhjbVZlcnNpb24AAwA0QXNzZXROb3RGb3VuZAAEAChVbnJvdXRhYmxlAAUAANUOBBhSZXN1bHQIBFQBKARFAdEOAQgIT2sEACgAAAAADEVycgQA0Q4AAAEAANkOBBhSZXN1bHQIBFQBGARFAdEOAQgIT2sEABgAAAAADEVycgQA0Q4AAAEAAN0OBBhSZXN1bHQIBFQBiQYERQHRDgEICE9rBACJBgAAAAAMRXJyBADRDgAAAQAA4Q4EGFJlc3VsdAgEVAHlDgRFAf0OAQgIT2sEAOUOAAAAAAxFcnIEAP0OAAABAADlDgxAeGNtX3J1bnRpbWVfYXBpcxxkcnlfcnVuRENhbGxEcnlSdW5FZmZlY3RzBBRFdmVudAFUABABQGV4ZWN1dGlvbl9yZXN1bHQJBwFoRGlzcGF0Y2hSZXN1bHRXaXRoUG9zdEluZm8AAThlbWl0dGVkX2V2ZW50c+kOAShWZWM8RXZlbnQ+AAEkbG9jYWxfeGNt7Q4BYE9wdGlvbjxWZXJzaW9uZWRYY208KCk+PgABOGZvcndhcmRlZF94Y21z8Q4BvFZlYzwoVmVyc2lvbmVkTG9jYXRpb24sIFZlYzxWZXJzaW9uZWRYY208KCk+Pik+AADpDgAAAlQA7Q4EGE9wdGlvbgQEVAGJBQEIEE5vbmUAAAAQU29tZQQAiQUAAAEAAPEOAAAC9Q4A9Q4AAAQIRQH5DgD5DgAAAokFAP0ODEB4Y21fcnVudGltZV9hcGlzHGRyeV9ydW4URXJyb3IAAQg0VW5pbXBsZW1lbnRlZAAAAGRWZXJzaW9uZWRDb252ZXJzaW9uRmFpbGVkAAEAAAEPBBhSZXN1bHQIBFQBBQ8ERQH9DgEICE9rBAAFDwAAAAAMRXJyBAD9DgAAAQAABQ8MQHhjbV9ydW50aW1lX2FwaXMcZHJ5X3J1bkBYY21EcnlSdW5FZmZlY3RzBBRFdmVudAFUAAwBQGV4ZWN1dGlvbl9yZXN1bHS1BwEcT3V0Y29tZQABOGVtaXR0ZWRfZXZlbnRz6Q4BKFZlYzxFdmVudD4AAThmb3J3YXJkZWRfeGNtc/EOAbxWZWM8KFZlcnNpb25lZExvY2F0aW9uLCBWZWM8VmVyc2lvbmVkWGNtPCgpPj4pPgAACQ8EGFJlc3VsdAgEVAEABEUBDQ8BCAhPawQAAAAAAAAMRXJyBAANDwAAAQAADQ8MQHhjbV9ydW50aW1lX2FwaXMsY29udmVyc2lvbnMURXJyb3IAAQgsVW5zdXBwb3J0ZWQAAABkVmVyc2lvbmVkQ29udmVyc2lvbkZhaWxlZAABAAARDwQYUmVzdWx0CARUAYwERQHRBwEICE9rBACMAAAAAAxFcnIEANEHAAABAAAVDwQYT3B0aW9uBARUAdEHAQgQTm9uZQAAABBTb21lBADRBwAAAQAAGQ8AAALRBwAdDwhAcG9sa2Fkb3RfcnVudGltZTBSdW50aW1lRXJyb3IAAawYU3lzdGVtBAABCAFwZnJhbWVfc3lzdGVtOjpFcnJvcjxSdW50aW1lPgAAACRTY2hlZHVsZXIEABkIAYBwYWxsZXRfc2NoZWR1bGVyOjpFcnJvcjxSdW50aW1lPgABACBQcmVpbWFnZQQAPQgBfHBhbGxldF9wcmVpbWFnZTo6RXJyb3I8UnVudGltZT4ACgAQQmFiZQQAfQgBbHBhbGxldF9iYWJlOjpFcnJvcjxSdW50aW1lPgACABxJbmRpY2VzBACFCAF4cGFsbGV0X2luZGljZXM6OkVycm9yPFJ1bnRpbWU+AAQAIEJhbGFuY2VzBADRCAF8cGFsbGV0X2JhbGFuY2VzOjpFcnJvcjxSdW50aW1lPgAFABxTdGFraW5nBAAxCQF4cGFsbGV0X3N0YWtpbmc6OkVycm9yPFJ1bnRpbWU+AAcAHFNlc3Npb24EAFEJAXhwYWxsZXRfc2Vzc2lvbjo6RXJyb3I8UnVudGltZT4ACQAcR3JhbmRwYQQAYQkBeHBhbGxldF9ncmFuZHBhOjpFcnJvcjxSdW50aW1lPgALACBUcmVhc3VyeQQAhQkBfHBhbGxldF90cmVhc3VyeTo6RXJyb3I8UnVudGltZT4AEwBAQ29udmljdGlvblZvdGluZwQAuQkBoHBhbGxldF9jb252aWN0aW9uX3ZvdGluZzo6RXJyb3I8UnVudGltZT4AFAAkUmVmZXJlbmRhBAABCgGAcGFsbGV0X3JlZmVyZW5kYTo6RXJyb3I8UnVudGltZT4AFQAkV2hpdGVsaXN0BAAFCgGAcGFsbGV0X3doaXRlbGlzdDo6RXJyb3I8UnVudGltZT4AFwAYQ2xhaW1zBAAJCgFYY2xhaW1zOjpFcnJvcjxSdW50aW1lPgAYABxWZXN0aW5nBAAZCgF4cGFsbGV0X3Zlc3Rpbmc6OkVycm9yPFJ1bnRpbWU+ABkAHFV0aWxpdHkEAB0KAXhwYWxsZXRfdXRpbGl0eTo6RXJyb3I8UnVudGltZT4AGgAUUHJveHkEAEEKAXBwYWxsZXRfcHJveHk6OkVycm9yPFJ1bnRpbWU+AB0AIE11bHRpc2lnBABRCgF8cGFsbGV0X211bHRpc2lnOjpFcnJvcjxSdW50aW1lPgAeACBCb3VudGllcwQAYQoBfHBhbGxldF9ib3VudGllczo6RXJyb3I8UnVudGltZT4AIgA0Q2hpbGRCb3VudGllcwQAbQoBlHBhbGxldF9jaGlsZF9ib3VudGllczo6RXJyb3I8UnVudGltZT4AJgBoRWxlY3Rpb25Qcm92aWRlck11bHRpUGhhc2UEAJUKAdBwYWxsZXRfZWxlY3Rpb25fcHJvdmlkZXJfbXVsdGlfcGhhc2U6OkVycm9yPFJ1bnRpbWU+ACQAJFZvdGVyTGlzdAQApQoB9HBhbGxldF9iYWdzX2xpc3Q6OkVycm9yPFJ1bnRpbWUsIHBhbGxldF9iYWdzX2xpc3Q6Okluc3RhbmNlMT4AJQA8Tm9taW5hdGlvblBvb2xzBADtCgGccGFsbGV0X25vbWluYXRpb25fcG9vbHM6OkVycm9yPFJ1bnRpbWU+ACcALEZhc3RVbnN0YWtlBAABCwGMcGFsbGV0X2Zhc3RfdW5zdGFrZTo6RXJyb3I8UnVudGltZT4AKAA0Q29uZmlndXJhdGlvbgQAEQsBoHBhcmFjaGFpbnNfY29uZmlndXJhdGlvbjo6RXJyb3I8UnVudGltZT4AMwA0UGFyYUluY2x1c2lvbgQAMQsBkHBhcmFjaGFpbnNfaW5jbHVzaW9uOjpFcnJvcjxSdW50aW1lPgA1ADBQYXJhSW5oZXJlbnQEAEkLAaRwYXJhY2hhaW5zX3BhcmFzX2luaGVyZW50OjpFcnJvcjxSdW50aW1lPgA2ABRQYXJhcwQArQsBgHBhcmFjaGFpbnNfcGFyYXM6OkVycm9yPFJ1bnRpbWU+ADgAEEhybXAEAN0LAXxwYXJhY2hhaW5zX2hybXA6OkVycm9yPFJ1bnRpbWU+ADwANFBhcmFzRGlzcHV0ZXMEAP0LAYxwYXJhY2hhaW5zX2Rpc3B1dGVzOjpFcnJvcjxSdW50aW1lPgA+ADRQYXJhc1NsYXNoaW5nBAARDAGMcGFyYWNoYWluc19zbGFzaGluZzo6RXJyb3I8UnVudGltZT4APwAgT25EZW1hbmQEAEEMAbRwYXJhY2hhaW5zX2Fzc2lnbmVyX29uX2RlbWFuZDo6RXJyb3I8UnVudGltZT4AQABoQ29yZXRpbWVBc3NpZ25tZW50UHJvdmlkZXIEAG0MAbBwYXJhY2hhaW5zX2Fzc2lnbmVyX2NvcmV0aW1lOjpFcnJvcjxSdW50aW1lPgBBACRSZWdpc3RyYXIEAHUMAXxwYXJhc19yZWdpc3RyYXI6OkVycm9yPFJ1bnRpbWU+AEYAFFNsb3RzBAB9DAFUc2xvdHM6OkVycm9yPFJ1bnRpbWU+AEcAIEF1Y3Rpb25zBACRDAFgYXVjdGlvbnM6OkVycm9yPFJ1bnRpbWU+AEgAJENyb3dkbG9hbgQAnQwBZGNyb3dkbG9hbjo6RXJyb3I8UnVudGltZT4ASQAgQ29yZXRpbWUEAKEMAWBjb3JldGltZTo6RXJyb3I8UnVudGltZT4ASgBIU3RhdGVUcmllTWlncmF0aW9uBACtBwGscGFsbGV0X3N0YXRlX3RyaWVfbWlncmF0aW9uOjpFcnJvcjxSdW50aW1lPgBiACRYY21QYWxsZXQEAPUMAWhwYWxsZXRfeGNtOjpFcnJvcjxSdW50aW1lPgBjADBNZXNzYWdlUXVldWUEABENAZBwYWxsZXRfbWVzc2FnZV9xdWV1ZTo6RXJyb3I8UnVudGltZT4AZAAkQXNzZXRSYXRlBAAVDQGEcGFsbGV0X2Fzc2V0X3JhdGU6OkVycm9yPFJ1bnRpbWU+AGUAFEJlZWZ5BAAhDQFwcGFsbGV0X2JlZWZ5OjpFcnJvcjxSdW50aW1lPgDIAADsGFN5c3RlbQEYU3lzdGVtSBxBY2NvdW50AQEEAgAMQQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAToIFRoZSBmdWxsIGFjY291bnQgaW5mb3JtYXRpb24gZm9yIGEgcGFydGljdWxhciBhY2NvdW50IElELjhFeHRyaW5zaWNDb3VudAAAEAQABLggVG90YWwgZXh0cmluc2ljcyBjb3VudCBmb3IgdGhlIGN1cnJlbnQgYmxvY2suQEluaGVyZW50c0FwcGxpZWQBACAEAASkIFdoZXRoZXIgYWxsIGluaGVyZW50cyBoYXZlIGJlZW4gYXBwbGllZC4sQmxvY2tXZWlnaHQBACQYAAAAAAAABIggVGhlIGN1cnJlbnQgd2VpZ2h0IGZvciB0aGUgYmxvY2suQEFsbEV4dHJpbnNpY3NMZW4AABAEAARBASBUb3RhbCBsZW5ndGggKGluIGJ5dGVzKSBmb3IgYWxsIGV4dHJpbnNpY3MgcHV0IHRvZ2V0aGVyLCBmb3IgdGhlIGN1cnJlbnQgYmxvY2suJEJsb2NrSGFzaAEBBAUQNIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASYIE1hcCBvZiBibG9jayBudW1iZXJzIHRvIGJsb2NrIGhhc2hlcy40RXh0cmluc2ljRGF0YQEBBAUQOAQABD0BIEV4dHJpbnNpY3MgZGF0YSBmb3IgdGhlIGN1cnJlbnQgYmxvY2sgKG1hcHMgYW4gZXh0cmluc2ljJ3MgaW5kZXggdG8gaXRzIGRhdGEpLhhOdW1iZXIBABAQAAAAAAQJASBUaGUgY3VycmVudCBibG9jayBudW1iZXIgYmVpbmcgcHJvY2Vzc2VkLiBTZXQgYnkgYGV4ZWN1dGVfYmxvY2tgLihQYXJlbnRIYXNoAQA0gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHAgSGFzaCBvZiB0aGUgcHJldmlvdXMgYmxvY2suGERpZ2VzdAEAPAQABPAgRGlnZXN0IG9mIHRoZSBjdXJyZW50IGJsb2NrLCBhbHNvIHBhcnQgb2YgdGhlIGJsb2NrIGhlYWRlci4YRXZlbnRzAQBMBAAcoCBFdmVudHMgZGVwb3NpdGVkIGZvciB0aGUgY3VycmVudCBibG9jay4AHQEgTk9URTogVGhlIGl0ZW0gaXMgdW5ib3VuZCBhbmQgc2hvdWxkIHRoZXJlZm9yZSBuZXZlciBiZSByZWFkIG9uIGNoYWluLtAgSXQgY291bGQgb3RoZXJ3aXNlIGluZmxhdGUgdGhlIFBvViBzaXplIG9mIGEgYmxvY2suAC0BIEV2ZW50cyBoYXZlIGEgbGFyZ2UgaW4tbWVtb3J5IHNpemUuIEJveCB0aGUgZXZlbnRzIHRvIG5vdCBnbyBvdXQtb2YtbWVtb3J5/CBqdXN0IGluIGNhc2Ugc29tZW9uZSBzdGlsbCByZWFkcyB0aGVtIGZyb20gd2l0aGluIHRoZSBydW50aW1lLihFdmVudENvdW50AQAQEAAAAAAEuCBUaGUgbnVtYmVyIG9mIGV2ZW50cyBpbiB0aGUgYEV2ZW50czxUPmAgbGlzdC4sRXZlbnRUb3BpY3MBAQQCNMkHBAAoJQEgTWFwcGluZyBiZXR3ZWVuIGEgdG9waWMgKHJlcHJlc2VudGVkIGJ5IFQ6Okhhc2gpIGFuZCBhIHZlY3RvciBvZiBpbmRleGVzlCBvZiBldmVudHMgaW4gdGhlIGA8RXZlbnRzPFQ+PmAgbGlzdC4AUQEgQWxsIHRvcGljIHZlY3RvcnMgaGF2ZSBkZXRlcm1pbmlzdGljIHN0b3JhZ2UgbG9jYXRpb25zIGRlcGVuZGluZyBvbiB0aGUgdG9waWMuIFRoaXNFASBhbGxvd3MgbGlnaHQtY2xpZW50cyB0byBsZXZlcmFnZSB0aGUgY2hhbmdlcyB0cmllIHN0b3JhZ2UgdHJhY2tpbmcgbWVjaGFuaXNtIGFuZOQgaW4gY2FzZSBvZiBjaGFuZ2VzIGZldGNoIHRoZSBsaXN0IG9mIGV2ZW50cyBvZiBpbnRlcmVzdC4AWQEgVGhlIHZhbHVlIGhhcyB0aGUgdHlwZSBgKEJsb2NrTnVtYmVyRm9yPFQ+LCBFdmVudEluZGV4KWAgYmVjYXVzZSBpZiB3ZSB1c2VkIG9ubHkganVzdE0BIHRoZSBgRXZlbnRJbmRleGAgdGhlbiBpbiBjYXNlIGlmIHRoZSB0b3BpYyBoYXMgdGhlIHNhbWUgY29udGVudHMgb24gdGhlIG5leHQgYmxvY2sBASBubyBub3RpZmljYXRpb24gd2lsbCBiZSB0cmlnZ2VyZWQgdGh1cyB0aGUgZXZlbnQgbWlnaHQgYmUgbG9zdC5ITGFzdFJ1bnRpbWVVcGdyYWRlAADNBwQABFUBIFN0b3JlcyB0aGUgYHNwZWNfdmVyc2lvbmAgYW5kIGBzcGVjX25hbWVgIG9mIHdoZW4gdGhlIGxhc3QgcnVudGltZSB1cGdyYWRlIGhhcHBlbmVkLlRVcGdyYWRlZFRvVTMyUmVmQ291bnQBACAEAARNASBUcnVlIGlmIHdlIGhhdmUgdXBncmFkZWQgc28gdGhhdCBgdHlwZSBSZWZDb3VudGAgaXMgYHUzMmAuIEZhbHNlIChkZWZhdWx0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AXwINE1heGltdW1XZWlnaHQoQAsAgG6HdAETzMzMzMzMzMwEKQEgVGhlIG1heGltdW0gd2VpZ2h0IHRoYXQgbWF5IGJlIHNjaGVkdWxlZCBwZXIgYmxvY2sgZm9yIGFueSBkaXNwYXRjaGFibGVzLlBNYXhTY2hlZHVsZWRQZXJCbG9jaxAQMgAAABQdASBUaGUgbWF4aW11bSBudW1iZXIgb2Ygc2NoZWR1bGVkIGNhbGxzIGluIHRoZSBxdWV1ZSBmb3IgYSBzaW5nbGUgYmxvY2suABggTk9URTpRASArIERlcGVuZGVudCBwYWxsZXRzJyBiZW5jaG1hcmtzIG1pZ2h0IHJlcXVpcmUgYSBoaWdoZXIgbGltaXQgZm9yIHRoZSBzZXR0aW5nLiBTZXQgYcQgaGlnaGVyIGxpbWl0IHVuZGVyIGBydW50aW1lLWJlbmNobWFya3NgIGZlYXR1cmUuARkIAQAgUHJlaW1hZ2UBIFByZWltYWdlDCRTdGF0dXNGb3IAAQQGNB0IBAAEkCBUaGUgcmVxdWVzdCBzdGF0dXMgb2YgYSBnaXZlbiBoYXNoLkBSZXF1ZXN0U3RhdHVzRm9yAAEEBjQlCAQABJAgVGhlIHJlcXVlc3Qgc3RhdHVzIG9mIGEgZ2l2ZW4gaGFzaC4sUHJlaW1hZ2VGb3IAAQQGNQg5CAQAAAGRAQGQAAE9CAoAEEJhYmUBEEJhYmVEKEVwb2NoSW5kZXgBADAgAAAAAAAAAAAEVCBDdXJyZW50IGVwb2NoIGluZGV4LixBdXRob3JpdGllcwEAQQgEAARsIEN1cnJlbnQgZXBvY2ggYXV0aG9yaXRpZXMuLEdlbmVzaXNTbG90AQCpASAAAAAAAAAAAAj4IFRoZSBzbG90IGF0IHdoaWNoIHRoZSBmaXJzdCBlcG9jaCBhY3R1YWxseSBzdGFydGVkLiBUaGlzIGlzIDCQIHVudGlsIHRoZSBmaXJzdCBibG9jayBvZiB0aGUgY2hhaW4uLEN1cnJlbnRTbG90AQCpASAAAAAAAAAAAARUIEN1cnJlbnQgc2xvdCBudW1iZXIuKFJhbmRvbW5lc3MBAASAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAouCBUaGUgZXBvY2ggcmFuZG9tbmVzcyBmb3IgdGhlICpjdXJyZW50KiBlcG9jaC4ALCAjIFNlY3VyaXR5AAUBIFRoaXMgTVVTVCBOT1QgYmUgdXNlZCBmb3IgZ2FtYmxpbmcsIGFzIGl0IGNhbiBiZSBpbmZsdWVuY2VkIGJ5IGH4IG1hbGljaW91cyB2YWxpZGF0b3IgaW4gdGhlIHNob3J0IHRlcm0uIEl0IE1BWSBiZSB1c2VkIGluIG1hbnkVASBjcnlwdG9ncmFwaGljIHByb3RvY29scywgaG93ZXZlciwgc28gbG9uZyBhcyBvbmUgcmVtZW1iZXJzIHRoYXQgdGhpcxUBIChsaWtlIGV2ZXJ5dGhpbmcgZWxzZSBvbi1jaGFpbikgaXQgaXMgcHVibGljLiBGb3IgZXhhbXBsZSwgaXQgY2FuIGJlBQEgdXNlZCB3aGVyZSBhIG51bWJlciBpcyBuZWVkZWQgdGhhdCBjYW5ub3QgaGF2ZSBiZWVuIGNob3NlbiBieSBhbg0BIGFkdmVyc2FyeSwgZm9yIHB1cnBvc2VzIHN1Y2ggYXMgcHVibGljLWNvaW4gemVyby1rbm93bGVkZ2UgcHJvb2ZzLmBQZW5kaW5nRXBvY2hDb25maWdDaGFuZ2UAALEBBAAEYQEgUGVuZGluZyBlcG9jaCBjb25maWd1cmF0aW9uIGNoYW5nZSB0aGF0IHdpbGwgYmUgYXBwbGllZCB3aGVuIHRoZSBuZXh0IGVwb2NoIGlzIGVuYWN0ZWQuOE5leHRSYW5kb21uZXNzAQAEgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFwgTmV4dCBlcG9jaCByYW5kb21uZXNzLjxOZXh0QXV0aG9yaXRpZXMBAEEIBAAEYCBOZXh0IGVwb2NoIGF1dGhvcml0aWVzLjBTZWdtZW50SW5kZXgBABAQAAAAACR8IFJhbmRvbW5lc3MgdW5kZXIgY29uc3RydWN0aW9uLgD4IFdlIG1ha2UgYSB0cmFkZS1vZmYgYmV0d2VlbiBzdG9yYWdlIGFjY2Vzc2VzIGFuZCBsaXN0IGxlbmd0aC4BASBXZSBzdG9yZSB0aGUgdW5kZXItY29uc3RydWN0aW9uIHJhbmRvbW5lc3MgaW4gc2VnbWVudHMgb2YgdXAgdG+UIGBVTkRFUl9DT05TVFJVQ1RJT05fU0VHTUVOVF9MRU5HVEhgLgDsIE9uY2UgYSBzZWdtZW50IHJlYWNoZXMgdGhpcyBsZW5ndGgsIHdlIGJlZ2luIHRoZSBuZXh0IG9uZS4JASBXZSByZXNldCBhbGwgc2VnbWVudHMgYW5kIHJldHVybiB0byBgMGAgYXQgdGhlIGJlZ2lubmluZyBvZiBldmVyeRwgZXBvY2guRFVuZGVyQ29uc3RydWN0aW9uAQEEBRBNCAQABBUBIFRXT1gtTk9URTogYFNlZ21lbnRJbmRleGAgaXMgYW4gaW5jcmVhc2luZyBpbnRlZ2VyLCBzbyB0aGlzIGlzIG9rYXkuLEluaXRpYWxpemVkAABVCAQACAEBIFRlbXBvcmFyeSB2YWx1ZSAoY2xlYXJlZCBhdCBibG9jayBmaW5hbGl6YXRpb24pIHdoaWNoIGlzIGBTb21lYB0BIGlmIHBlci1ibG9jayBpbml0aWFsaXphdGlvbiBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZCBmb3IgY3VycmVudCBibG9jay5MQXV0aG9yVnJmUmFuZG9tbmVzcwEAhAQAEBUBIFRoaXMgZmllbGQgc2hvdWxkIGFsd2F5cyBiZSBwb3B1bGF0ZWQgZHVyaW5nIGJsb2NrIHByb2Nlc3NpbmcgdW5sZXNzGQEgc2Vjb25kYXJ5IHBsYWluIHNsb3RzIGFyZSBlbmFibGVkICh3aGljaCBkb24ndCBjb250YWluIGEgVlJGIG91dHB1dCkuAEkBIEl0IGlzIHNldCBpbiBgb25fZmluYWxpemVgLCBiZWZvcmUgaXQgd2lsbCBjb250YWluIHRoZSB2YWx1ZSBmcm9tIHRoZSBsYXN0IGJsb2NrLihFcG9jaFN0YXJ0AQCAIAAAAAAAAAAAFF0BIFRoZSBibG9jayBudW1iZXJzIHdoZW4gdGhlIGxhc3QgYW5kIGN1cnJlbnQgZXBvY2ggaGF2ZSBzdGFydGVkLCByZXNwZWN0aXZlbHkgYE4tMWAgYW5kFCBgTmAuSQEgTk9URTogV2UgdHJhY2sgdGhpcyBpcyBpbiBvcmRlciB0byBhbm5vdGF0ZSB0aGUgYmxvY2sgbnVtYmVyIHdoZW4gYSBnaXZlbiBwb29sIG9mWQEgZW50cm9weSB3YXMgZml4ZWQgKGkuZS4gaXQgd2FzIGtub3duIHRvIGNoYWluIG9ic2VydmVycykuIFNpbmNlIGVwb2NocyBhcmUgZGVmaW5lZCBpblkBIHNsb3RzLCB3aGljaCBtYXkgYmUgc2tpcHBlZCwgdGhlIGJsb2NrIG51bWJlcnMgbWF5IG5vdCBsaW5lIHVwIHdpdGggdGhlIHNsb3QgbnVtYmVycy4gTGF0ZW5lc3MBABAQAAAAABTYIEhvdyBsYXRlIHRoZSBjdXJyZW50IGJsb2NrIGlzIGNvbXBhcmVkIHRvIGl0cyBwYXJlbnQuABUBIFRoaXMgZW50cnkgaXMgcG9wdWxhdGVkIGFzIHBhcnQgb2YgYmxvY2sgZXhlY3V0aW9uIGFuZCBpcyBjbGVhbmVkIHVwEQEgb24gYmxvY2sgZmluYWxpemF0aW9uLiBRdWVyeWluZyB0aGlzIHN0b3JhZ2UgZW50cnkgb3V0c2lkZSBvZiBibG9ja7AgZXhlY3V0aW9uIGNvbnRleHQgc2hvdWxkIGFsd2F5cyB5aWVsZCB6ZXJvLixFcG9jaENvbmZpZwAAbQgEAAhhASBUaGUgY29uZmlndXJhdGlvbiBmb3IgdGhlIGN1cnJlbnQgZXBvY2guIFNob3VsZCBuZXZlciBiZSBgTm9uZWAgYXMgaXQgaXMgaW5pdGlhbGl6ZWQgaW4kIGdlbmVzaXMuPE5leHRFcG9jaENvbmZpZwAAbQgEAAgtASBUaGUgY29uZmlndXJhdGlvbiBmb3IgdGhlIG5leHQgZXBvY2gsIGBOb25lYCBpZiB0aGUgY29uZmlnIHdpbGwgbm90IGNoYW5nZeggKHlvdSBjYW4gZmFsbGJhY2sgdG8gYEVwb2NoQ29uZmlnYCBpbnN0ZWFkIGluIHRoYXQgY2FzZSkuNFNraXBwZWRFcG9jaHMBAHEIBAAgKQEgQSBsaXN0IG9mIHRoZSBsYXN0IDEwMCBza2lwcGVkIGVwb2NocyBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgc2Vzc2lvbiBpbmRleHAgd2hlbiB0aGUgZXBvY2ggd2FzIHNraXBwZWQuADEBIFRoaXMgaXMgb25seSB1c2VkIGZvciB2YWxpZGF0aW5nIGVxdWl2b2NhdGlvbiBwcm9vZnMuIEFuIGVxdWl2b2NhdGlvbiBwcm9vZjUBIG11c3QgY29udGFpbnMgYSBrZXktb3duZXJzaGlwIHByb29mIGZvciBhIGdpdmVuIHNlc3Npb24sIHRoZXJlZm9yZSB3ZSBuZWVkIGE5ASB3YXkgdG8gdGllIHRvZ2V0aGVyIHNlc3Npb25zIGFuZCBlcG9jaCBpbmRpY2VzLCBpLmUuIHdlIG5lZWQgdG8gdmFsaWRhdGUgdGhhdCkBIGEgdmFsaWRhdG9yIHdhcyB0aGUgb3duZXIgb2YgYSBnaXZlbiBrZXkgb24gYSBnaXZlbiBzZXNzaW9uLCBhbmQgd2hhdCB0aGWwIGFjdGl2ZSBlcG9jaCBpbmRleCB3YXMgZHVyaW5nIHRoYXQgc2Vzc2lvbi4BmQEAEDRFcG9jaER1cmF0aW9uMCBgCQAAAAAAAAzsIFRoZSBhbW91bnQgb2YgdGltZSwgaW4gc2xvdHMsIHRoYXQgZWFjaCBlcG9jaCBzaG91bGQgbGFzdC4ZASBOT1RFOiBDdXJyZW50bHkgaXQgaXMgbm90IHBvc3NpYmxlIHRvIGNoYW5nZSB0aGUgZXBvY2ggZHVyYXRpb24gYWZ0ZXIhASB0aGUgY2hhaW4gaGFzIHN0YXJ0ZWQuIEF0dGVtcHRpbmcgdG8gZG8gc28gd2lsbCBicmljayBibG9jayBwcm9kdWN0aW9uLkRFeHBlY3RlZEJsb2NrVGltZTAgcBcAAAAAAAAUBQEgVGhlIGV4cGVjdGVkIGF2ZXJhZ2UgYmxvY2sgdGltZSBhdCB3aGljaCBCQUJFIHNob3VsZCBiZSBjcmVhdGluZxEBIGJsb2Nrcy4gU2luY2UgQkFCRSBpcyBwcm9iYWJpbGlzdGljIGl0IGlzIG5vdCB0cml2aWFsIHRvIGZpZ3VyZSBvdXQFASB3aGF0IHRoZSBleHBlY3RlZCBhdmVyYWdlIGJsb2NrIHRpbWUgc2hvdWxkIGJlIGJhc2VkIG9uIHRoZSBzbG90CQEgZHVyYXRpb24gYW5kIHRoZSBzZWN1cml0eSBwYXJhbWV0ZXIgYGNgICh3aGVyZSBgMSAtIGNgIHJlcHJlc2VudHOgIHRoZSBwcm9iYWJpbGl0eSBvZiBhIHNsb3QgYmVpbmcgZW1wdHkpLjhNYXhBdXRob3JpdGllcxAQoIYBAASIIE1heCBudW1iZXIgb2YgYXV0aG9yaXRpZXMgYWxsb3dlZDRNYXhOb21pbmF0b3JzEBAAAgAABNQgVGhlIG1heGltdW0gbnVtYmVyIG9mIG5vbWluYXRvcnMgZm9yIGVhY2ggdmFsaWRhdG9yLgF9CAIAJFRpbWVzdGFtcAEkVGltZXN0YW1wCAxOb3cBADAgAAAAAAAAAAAEoCBUaGUgY3VycmVudCB0aW1lIGZvciB0aGUgY3VycmVudCBibG9jay4kRGlkVXBkYXRlAQAgBAAQ2CBXaGV0aGVyIHRoZSB0aW1lc3RhbXAgaGFzIGJlZW4gdXBkYXRlZCBpbiB0aGlzIGJsb2NrLgBVASBUaGlzIHZhbHVlIGlzIHVwZGF0ZWQgdG8gYHRydWVgIHVwb24gc3VjY2Vzc2Z1bCBzdWJtaXNzaW9uIG9mIGEgdGltZXN0YW1wIGJ5IGEgbm9kZS5FASBJdCBpcyB0aGVuIGNoZWNrZWQgYXQgdGhlIGVuZCBvZiBlYWNoIGJsb2NrIGV4ZWN1dGlvbiBpbiB0aGUgYG9uX2ZpbmFsaXplYCBob29rLgG9AQAENE1pbmltdW1QZXJpb2QwILgLAAAAAAAAGIwgVGhlIG1pbmltdW0gcGVyaW9kIGJldHdlZW4gYmxvY2tzLgBNASBCZSBhd2FyZSB0aGF0IHRoaXMgaXMgZGlmZmVyZW50IHRvIHRoZSAqZXhwZWN0ZWQqIHBlcmlvZCB0aGF0IHRoZSBibG9jayBwcm9kdWN0aW9uSQEgYXBwYXJhdHVzIHByb3ZpZGVzLiBZb3VyIGNob3NlbiBjb25zZW5zdXMgc3lzdGVtIHdpbGwgZ2VuZXJhbGx5IHdvcmsgd2l0aCB0aGlzIHRvYQEgZGV0ZXJtaW5lIGEgc2Vuc2libGUgYmxvY2sgdGltZS4gRm9yIGV4YW1wbGUsIGluIHRoZSBBdXJhIHBhbGxldCBpdCB3aWxsIGJlIGRvdWJsZSB0aGlzcCBwZXJpb2Qgb24gZGVmYXVsdCBzZXR0aW5ncy4AAwAcSW5kaWNlcwEcSW5kaWNlcwQgQWNjb3VudHMAAQQCEIEIBAAEiCBUaGUgbG9va3VwIGZyb20gaW5kZXggdG8gYWNjb3VudC4BwQEBlAQcRGVwb3NpdBhAAOh2SBcAAAAAAAAAAAAAAASsIFRoZSBkZXBvc2l0IG5lZWRlZCBmb3IgcmVzZXJ2aW5nIGFuIGluZGV4LgGFCAQAIEJhbGFuY2VzASBCYWxhbmNlcxw0VG90YWxJc3N1YW5jZQEAGEAAAAAAAAAAAAAAAAAAAAAABJggVGhlIHRvdGFsIHVuaXRzIGlzc3VlZCBpbiB0aGUgc3lzdGVtLkBJbmFjdGl2ZUlzc3VhbmNlAQAYQAAAAAAAAAAAAAAAAAAAAAAECQEgVGhlIHRvdGFsIHVuaXRzIG9mIG91dHN0YW5kaW5nIGRlYWN0aXZhdGVkIGJhbGFuY2UgaW4gdGhlIHN5c3RlbS4cQWNjb3VudAEBBAIAFAEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgGAJASBUaGUgQmFsYW5jZXMgcGFsbGV0IGV4YW1wbGUgb2Ygc3RvcmluZyB0aGUgYmFsYW5jZSBvZiBhbiBhY2NvdW50LgAoICMgRXhhbXBsZQA0IGBgYG5vY29tcGlsZbAgIGltcGwgcGFsbGV0X2JhbGFuY2VzOjpDb25maWcgZm9yIFJ1bnRpbWUgexkCICAgIHR5cGUgQWNjb3VudFN0b3JlID0gU3RvcmFnZU1hcFNoaW08U2VsZjo6QWNjb3VudDxSdW50aW1lPiwgZnJhbWVfc3lzdGVtOjpQcm92aWRlcjxSdW50aW1lPiwgQWNjb3VudElkLCBTZWxmOjpBY2NvdW50RGF0YTxCYWxhbmNlPj4MICB9ECBgYGAAFQEgWW91IGNhbiBhbHNvIHN0b3JlIHRoZSBiYWxhbmNlIG9mIGFuIGFjY291bnQgaW4gdGhlIGBTeXN0ZW1gIHBhbGxldC4AKCAjIEV4YW1wbGUANCBgYGBub2NvbXBpbGWwICBpbXBsIHBhbGxldF9iYWxhbmNlczo6Q29uZmlnIGZvciBSdW50aW1lIHt0ICAgdHlwZSBBY2NvdW50U3RvcmUgPSBTeXN0ZW0MICB9ECBgYGAAUQEgQnV0IHRoaXMgY29tZXMgd2l0aCB0cmFkZW9mZnMsIHN0b3JpbmcgYWNjb3VudCBiYWxhbmNlcyBpbiB0aGUgc3lzdGVtIHBhbGxldCBzdG9yZXNtASBgZnJhbWVfc3lzdGVtYCBkYXRhIGFsb25nc2lkZSB0aGUgYWNjb3VudCBkYXRhIGNvbnRyYXJ5IHRvIHN0b3JpbmcgYWNjb3VudCBiYWxhbmNlcyBpbiB0aGUpASBgQmFsYW5jZXNgIHBhbGxldCwgd2hpY2ggdXNlcyBhIGBTdG9yYWdlTWFwYCB0byBzdG9yZSBiYWxhbmNlcyBkYXRhIG9ubHkuQQEgTk9URTogVGhpcyBpcyBvbmx5IHVzZWQgaW4gdGhlIGNhc2UgdGhhdCB0aGlzIHBhbGxldCBpcyB1c2VkIHRvIHN0b3JlIGJhbGFuY2VzLhRMb2NrcwEBBAIAiQgEABC4IEFueSBsaXF1aWRpdHkgbG9ja3Mgb24gc29tZSBhY2NvdW50IGJhbGFuY2VzLiUBIE5PVEU6IFNob3VsZCBvbmx5IGJlIGFjY2Vzc2VkIHdoZW4gc2V0dGluZywgY2hhbmdpbmcgYW5kIGZyZWVpbmcgYSBsb2NrLgCtASBVc2Ugb2YgbG9ja3MgaXMgZGVwcmVjYXRlZCBpbiBmYXZvdXIgb2YgZnJlZXplcy4gU2VlIGBodHRwczovL2dpdGh1Yi5jb20vcGFyaXR5dGVjaC9zdWJzdHJhdGUvcHVsbC8xMjk1MS9gIFJlc2VydmVzAQEEAgCZCAQADKQgTmFtZWQgcmVzZXJ2ZXMgb24gc29tZSBhY2NvdW50IGJhbGFuY2VzLgCxASBVc2Ugb2YgcmVzZXJ2ZXMgaXMgZGVwcmVjYXRlZCBpbiBmYXZvdXIgb2YgaG9sZHMuIFNlZSBgaHR0cHM6Ly9naXRodWIuY29tL3Bhcml0eXRlY2gvc3Vic3RyYXRlL3B1bGwvMTI5NTEvYBRIb2xkcwEBBAIApQgEAARsIEhvbGRzIG9uIGFjY291bnQgYmFsYW5jZXMuHEZyZWV6ZXMBAQQCAL0IBAAEiCBGcmVlemUgbG9ja3Mgb24gYWNjb3VudCBiYWxhbmNlcy4BzQEBmBBIRXhpc3RlbnRpYWxEZXBvc2l0GEAA5AtUAgAAAAAAAAAAAAAAIEEBIFRoZSBtaW5pbXVtIGFtb3VudCByZXF1aXJlZCB0byBrZWVwIGFuIGFjY291bnQgb3Blbi4gTVVTVCBCRSBHUkVBVEVSIFRIQU4gWkVSTyEAWQEgSWYgeW91ICpyZWFsbHkqIG5lZWQgaXQgdG8gYmUgemVybywgeW91IGNhbiBlbmFibGUgdGhlIGZlYXR1cmUgYGluc2VjdXJlX3plcm9fZWRgIGZvcmEBIHRoaXMgcGFsbGV0LiBIb3dldmVyLCB5b3UgZG8gc28gYXQgeW91ciBvd24gcmlzazogdGhpcyB3aWxsIG9wZW4gdXAgYSBtYWpvciBEb1MgdmVjdG9yLlkBIEluIGNhc2UgeW91IGhhdmUgbXVsdGlwbGUgc291cmNlcyBvZiBwcm92aWRlciByZWZlcmVuY2VzLCB5b3UgbWF5IGFsc28gZ2V0IHVuZXhwZWN0ZWSMIGJlaGF2aW91ciBpZiB5b3Ugc2V0IHRoaXMgdG8gemVyby4A8CBCb3R0b20gbGluZTogRG8geW91cnNlbGYgYSBmYXZvdXIgYW5kIG1ha2UgaXQgYXQgbGVhc3Qgb25lISBNYXhMb2NrcxAQMgAAABD0IFRoZSBtYXhpbXVtIG51bWJlciBvZiBsb2NrcyB0aGF0IHNob3VsZCBleGlzdCBvbiBhbiBhY2NvdW50LtwgTm90IHN0cmljdGx5IGVuZm9yY2VkLCBidXQgdXNlZCBmb3Igd2VpZ2h0IGVzdGltYXRpb24uAK0BIFVzZSBvZiBsb2NrcyBpcyBkZXByZWNhdGVkIGluIGZhdm91ciBvZiBmcmVlemVzLiBTZWUgYGh0dHBzOi8vZ2l0aHViLmNvbS9wYXJpdHl0ZWNoL3N1YnN0cmF0ZS9wdWxsLzEyOTUxL2AsTWF4UmVzZXJ2ZXMQEDIAAAAMDQEgVGhlIG1heGltdW0gbnVtYmVyIG9mIG5hbWVkIHJlc2VydmVzIHRoYXQgY2FuIGV4aXN0IG9uIGFuIGFjY291bnQuALEBIFVzZSBvZiByZXNlcnZlcyBpcyBkZXByZWNhdGVkIGluIGZhdm91ciBvZiBob2xkcy4gU2VlIGBodHRwczovL2dpdGh1Yi5jb20vcGFyaXR5dGVjaC9zdWJzdHJhdGUvcHVsbC8xMjk1MS9gKE1heEZyZWV6ZXMQEAgAAAAEYQEgVGhlIG1heGltdW0gbnVtYmVyIG9mIGluZGl2aWR1YWwgZnJlZXplIGxvY2tzIHRoYXQgY2FuIGV4aXN0IG9uIGFuIGFjY291bnQgYXQgYW55IHRpbWUuAdEIBQBIVHJhbnNhY3Rpb25QYXltZW50AUhUcmFuc2FjdGlvblBheW1lbnQIRE5leHRGZWVNdWx0aXBsaWVyAQDRBkAAAGSns7bgDQAAAAAAAAAAADhTdG9yYWdlVmVyc2lvbgEA1QgEAAAAAaAEYE9wZXJhdGlvbmFsRmVlTXVsdGlwbGllcggEBVRZASBBIGZlZSBtdWx0aXBsaWVyIGZvciBgT3BlcmF0aW9uYWxgIGV4dHJpbnNpY3MgdG8gY29tcHV0ZSAidmlydHVhbCB0aXAiIHRvIGJvb3N0IHRoZWlyLCBgcHJpb3JpdHlgAFEBIFRoaXMgdmFsdWUgaXMgbXVsdGlwbGllZCBieSB0aGUgYGZpbmFsX2ZlZWAgdG8gb2J0YWluIGEgInZpcnR1YWwgdGlwIiB0aGF0IGlzIGxhdGVy9CBhZGRlZCB0byBhIHRpcCBjb21wb25lbnQgaW4gcmVndWxhciBgcHJpb3JpdHlgIGNhbGN1bGF0aW9ucy5NASBJdCBtZWFucyB0aGF0IGEgYE5vcm1hbGAgdHJhbnNhY3Rpb24gY2FuIGZyb250LXJ1biBhIHNpbWlsYXJseS1zaXplZCBgT3BlcmF0aW9uYWxgQQEgZXh0cmluc2ljICh3aXRoIG5vIHRpcCksIGJ5IGluY2x1ZGluZyBhIHRpcCB2YWx1ZSBncmVhdGVyIHRoYW4gdGhlIHZpcnR1YWwgdGlwLgA8IGBgYHJ1c3QsaWdub3JlQCAvLyBGb3IgYE5vcm1hbGCMIGxldCBwcmlvcml0eSA9IHByaW9yaXR5X2NhbGModGlwKTsAVCAvLyBGb3IgYE9wZXJhdGlvbmFsYBEBIGxldCB2aXJ0dWFsX3RpcCA9IChpbmNsdXNpb25fZmVlICsgdGlwKSAqIE9wZXJhdGlvbmFsRmVlTXVsdGlwbGllcjvEIGxldCBwcmlvcml0eSA9IHByaW9yaXR5X2NhbGModGlwICsgdmlydHVhbF90aXApOxAgYGBgAFEBIE5vdGUgdGhhdCBzaW5jZSB3ZSB1c2UgYGZpbmFsX2ZlZWAgdGhlIG11bHRpcGxpZXIgYXBwbGllcyBhbHNvIHRvIHRoZSByZWd1bGFyIGB0aXBgXQEgc2VudCB3aXRoIHRoZSB0cmFuc2FjdGlvbi4gU28sIG5vdCBvbmx5IGRvZXMgdGhlIHRyYW5zYWN0aW9uIGdldCBhIHByaW9yaXR5IGJ1bXAgYmFzZWRhASBvbiB0aGUgYGluY2x1c2lvbl9mZWVgLCBidXQgd2UgYWxzbyBhbXBsaWZ5IHRoZSBpbXBhY3Qgb2YgdGlwcyBhcHBsaWVkIHRvIGBPcGVyYXRpb25hbGA4IHRyYW5zYWN0aW9ucy4AIAAoQXV0aG9yc2hpcAEoQXV0aG9yc2hpcAQYQXV0aG9yAAAABAAEZCBBdXRob3Igb2YgY3VycmVudCBibG9jay4AAAAABgAcU3Rha2luZwEcU3Rha2luZ6w4VmFsaWRhdG9yQ291bnQBABAQAAAAAAScIFRoZSBpZGVhbCBudW1iZXIgb2YgYWN0aXZlIHZhbGlkYXRvcnMuVE1pbmltdW1WYWxpZGF0b3JDb3VudAEAEBAAAAAABEEBIE1pbmltdW0gbnVtYmVyIG9mIHN0YWtpbmcgcGFydGljaXBhbnRzIGJlZm9yZSBlbWVyZ2VuY3kgY29uZGl0aW9ucyBhcmUgaW1wb3NlZC40SW52dWxuZXJhYmxlcwEA0QEEAAxZASBBbnkgdmFsaWRhdG9ycyB0aGF0IG1heSBuZXZlciBiZSBzbGFzaGVkIG9yIGZvcmNpYmx5IGtpY2tlZC4gSXQncyBhIFZlYyBzaW5jZSB0aGV5J3JlTQEgZWFzeSB0byBpbml0aWFsaXplIGFuZCB0aGUgcGVyZm9ybWFuY2UgaGl0IGlzIG1pbmltYWwgKHdlIGV4cGVjdCBubyBtb3JlIHRoYW4gZm91cqwgaW52dWxuZXJhYmxlcykgYW5kIHJlc3RyaWN0ZWQgdG8gdGVzdG5ldHMuGEJvbmRlZAABBAUAAAQADAEBIE1hcCBmcm9tIGFsbCBsb2NrZWQgInN0YXNoIiBhY2NvdW50cyB0byB0aGUgY29udHJvbGxlciBhY2NvdW50LgDQIFRXT1gtTk9URTogU0FGRSBzaW5jZSBgQWNjb3VudElkYCBpcyBhIHNlY3VyZSBoYXNoLkBNaW5Ob21pbmF0b3JCb25kAQAYQAAAAAAAAAAAAAAAAAAAAAAEIQEgVGhlIG1pbmltdW0gYWN0aXZlIGJvbmQgdG8gYmVjb21lIGFuZCBtYWludGFpbiB0aGUgcm9sZSBvZiBhIG5vbWluYXRvci5ATWluVmFsaWRhdG9yQm9uZAEAGEAAAAAAAAAAAAAAAAAAAAAABCEBIFRoZSBtaW5pbXVtIGFjdGl2ZSBib25kIHRvIGJlY29tZSBhbmQgbWFpbnRhaW4gdGhlIHJvbGUgb2YgYSB2YWxpZGF0b3IuSE1pbmltdW1BY3RpdmVTdGFrZQEAGEAAAAAAAAAAAAAAAAAAAAAABBEBIFRoZSBtaW5pbXVtIGFjdGl2ZSBub21pbmF0b3Igc3Rha2Ugb2YgdGhlIGxhc3Qgc3VjY2Vzc2Z1bCBlbGVjdGlvbi40TWluQ29tbWlzc2lvbgEArBAAAAAADOggVGhlIG1pbmltdW0gYW1vdW50IG9mIGNvbW1pc3Npb24gdGhhdCB2YWxpZGF0b3JzIGNhbiBzZXQuAIAgSWYgc2V0IHRvIGAwYCwgbm8gbGltaXQgZXhpc3RzLhhMZWRnZXIAAQQCANkIBAAQRQEgTWFwIGZyb20gYWxsICh1bmxvY2tlZCkgImNvbnRyb2xsZXIiIGFjY291bnRzIHRvIHRoZSBpbmZvIHJlZ2FyZGluZyB0aGUgc3Rha2luZy4AdQEgTm90ZTogQWxsIHRoZSByZWFkcyBhbmQgbXV0YXRpb25zIHRvIHRoaXMgc3RvcmFnZSAqTVVTVCogYmUgZG9uZSB0aHJvdWdoIHRoZSBtZXRob2RzIGV4cG9zZWToIGJ5IFtgU3Rha2luZ0xlZGdlcmBdIHRvIGVuc3VyZSBkYXRhIGFuZCBsb2NrIGNvbnNpc3RlbmN5LhRQYXllZQABBAUAqAQADOQgV2hlcmUgdGhlIHJld2FyZCBwYXltZW50IHNob3VsZCBiZSBtYWRlLiBLZXllZCBieSBzdGFzaC4A0CBUV09YLU5PVEU6IFNBRkUgc2luY2UgYEFjY291bnRJZGAgaXMgYSBzZWN1cmUgaGFzaC4oVmFsaWRhdG9ycwEBBAUAsAgAAAxFASBUaGUgbWFwIGZyb20gKHdhbm5hYmUpIHZhbGlkYXRvciBzdGFzaCBrZXkgdG8gdGhlIHByZWZlcmVuY2VzIG9mIHRoYXQgdmFsaWRhdG9yLgDQIFRXT1gtTk9URTogU0FGRSBzaW5jZSBgQWNjb3VudElkYCBpcyBhIHNlY3VyZSBoYXNoLlBDb3VudGVyRm9yVmFsaWRhdG9ycwEAEBAAAAAABKxDb3VudGVyIGZvciB0aGUgcmVsYXRlZCBjb3VudGVkIHN0b3JhZ2UgbWFwSE1heFZhbGlkYXRvcnNDb3VudAAAEAQADDEBIFRoZSBtYXhpbXVtIHZhbGlkYXRvciBjb3VudCBiZWZvcmUgd2Ugc3RvcCBhbGxvd2luZyBuZXcgdmFsaWRhdG9ycyB0byBqb2luLgDQIFdoZW4gdGhpcyB2YWx1ZSBpcyBub3Qgc2V0LCBubyBsaW1pdHMgYXJlIGVuZm9yY2VkLihOb21pbmF0b3JzAAEEBQDhCAQATHUBIFRoZSBtYXAgZnJvbSBub21pbmF0b3Igc3Rhc2gga2V5IHRvIHRoZWlyIG5vbWluYXRpb24gcHJlZmVyZW5jZXMsIG5hbWVseSB0aGUgdmFsaWRhdG9ycyB0aGF0WCB0aGV5IHdpc2ggdG8gc3VwcG9ydC4AOQEgTm90ZSB0aGF0IHRoZSBrZXlzIG9mIHRoaXMgc3RvcmFnZSBtYXAgbWlnaHQgYmVjb21lIG5vbi1kZWNvZGFibGUgaW4gY2FzZSB0aGUtASBhY2NvdW50J3MgW2BOb21pbmF0aW9uc1F1b3RhOjpNYXhOb21pbmF0aW9uc2BdIGNvbmZpZ3VyYXRpb24gaXMgZGVjcmVhc2VkLpAgSW4gdGhpcyByYXJlIGNhc2UsIHRoZXNlIG5vbWluYXRvcnNlASBhcmUgc3RpbGwgZXhpc3RlbnQgaW4gc3RvcmFnZSwgdGhlaXIga2V5IGlzIGNvcnJlY3QgYW5kIHJldHJpZXZhYmxlIChpLmUuIGBjb250YWluc19rZXlgcQEgaW5kaWNhdGVzIHRoYXQgdGhleSBleGlzdCksIGJ1dCB0aGVpciB2YWx1ZSBjYW5ub3QgYmUgZGVjb2RlZC4gVGhlcmVmb3JlLCB0aGUgbm9uLWRlY29kYWJsZW0BIG5vbWluYXRvcnMgd2lsbCBlZmZlY3RpdmVseSBub3QtZXhpc3QsIHVudGlsIHRoZXkgcmUtc3VibWl0IHRoZWlyIHByZWZlcmVuY2VzIHN1Y2ggdGhhdCBpdAEBIGlzIHdpdGhpbiB0aGUgYm91bmRzIG9mIHRoZSBuZXdseSBzZXQgYENvbmZpZzo6TWF4Tm9taW5hdGlvbnNgLgBhASBUaGlzIGltcGxpZXMgdGhhdCBgOjppdGVyX2tleXMoKS5jb3VudCgpYCBhbmQgYDo6aXRlcigpLmNvdW50KClgIG1pZ2h0IHJldHVybiBkaWZmZXJlbnRtASB2YWx1ZXMgZm9yIHRoaXMgbWFwLiBNb3Jlb3ZlciwgdGhlIG1haW4gYDo6Y291bnQoKWAgaXMgYWxpZ25lZCB3aXRoIHRoZSBmb3JtZXIsIG5hbWVseSB0aGVsIG51bWJlciBvZiBrZXlzIHRoYXQgZXhpc3QuAG0BIExhc3RseSwgaWYgYW55IG9mIHRoZSBub21pbmF0b3JzIGJlY29tZSBub24tZGVjb2RhYmxlLCB0aGV5IGNhbiBiZSBjaGlsbGVkIGltbWVkaWF0ZWx5IHZpYbggW2BDYWxsOjpjaGlsbF9vdGhlcmBdIGRpc3BhdGNoYWJsZSBieSBhbnlvbmUuANAgVFdPWC1OT1RFOiBTQUZFIHNpbmNlIGBBY2NvdW50SWRgIGlzIGEgc2VjdXJlIGhhc2guUENvdW50ZXJGb3JOb21pbmF0b3JzAQAQEAAAAAAErENvdW50ZXIgZm9yIHRoZSByZWxhdGVkIGNvdW50ZWQgc3RvcmFnZSBtYXA4VmlydHVhbFN0YWtlcnMAAQQFAIwEABjIIFN0YWtlcnMgd2hvc2UgZnVuZHMgYXJlIG1hbmFnZWQgYnkgb3RoZXIgcGFsbGV0cy4AdQEgVGhpcyBwYWxsZXQgZG9lcyBub3QgYXBwbHkgYW55IGxvY2tzIG9uIHRoZW0sIHRoZXJlZm9yZSB0aGV5IGFyZSBvbmx5IHZpcnR1YWxseSBib25kZWQuIFRoZXltASBhcmUgZXhwZWN0ZWQgdG8gYmUga2V5bGVzcyBhY2NvdW50cyBhbmQgaGVuY2Ugc2hvdWxkIG5vdCBiZSBhbGxvd2VkIHRvIG11dGF0ZSB0aGVpciBsZWRnZXJxASBkaXJlY3RseSB2aWEgdGhpcyBwYWxsZXQuIEluc3RlYWQsIHRoZXNlIGFjY291bnRzIGFyZSBtYW5hZ2VkIGJ5IG90aGVyIHBhbGxldHMgYW5kIGFjY2Vzc2VkKQEgdmlhIGxvdyBsZXZlbCBhcGlzLiBXZSBrZWVwIHRyYWNrIG9mIHRoZW0gdG8gZG8gbWluaW1hbCBpbnRlZ3JpdHkgY2hlY2tzLmBDb3VudGVyRm9yVmlydHVhbFN0YWtlcnMBABAQAAAAAASsQ291bnRlciBmb3IgdGhlIHJlbGF0ZWQgY291bnRlZCBzdG9yYWdlIG1hcEhNYXhOb21pbmF0b3JzQ291bnQAABAEAAwxASBUaGUgbWF4aW11bSBub21pbmF0b3IgY291bnQgYmVmb3JlIHdlIHN0b3AgYWxsb3dpbmcgbmV3IHZhbGlkYXRvcnMgdG8gam9pbi4A0CBXaGVuIHRoaXMgdmFsdWUgaXMgbm90IHNldCwgbm8gbGltaXRzIGFyZSBlbmZvcmNlZC4oQ3VycmVudEVyYQAAEAQAEFwgVGhlIGN1cnJlbnQgZXJhIGluZGV4LgBlASBUaGlzIGlzIHRoZSBsYXRlc3QgcGxhbm5lZCBlcmEsIGRlcGVuZGluZyBvbiBob3cgdGhlIFNlc3Npb24gcGFsbGV0IHF1ZXVlcyB0aGUgdmFsaWRhdG9ygCBzZXQsIGl0IG1pZ2h0IGJlIGFjdGl2ZSBvciBub3QuJEFjdGl2ZUVyYQAA6QgEABDYIFRoZSBhY3RpdmUgZXJhIGluZm9ybWF0aW9uLCBpdCBob2xkcyBpbmRleCBhbmQgc3RhcnQuAFkBIFRoZSBhY3RpdmUgZXJhIGlzIHRoZSBlcmEgYmVpbmcgY3VycmVudGx5IHJld2FyZGVkLiBWYWxpZGF0b3Igc2V0IG9mIHRoaXMgZXJhIG11c3QgYmWsIGVxdWFsIHRvIFtgU2Vzc2lvbkludGVyZmFjZTo6dmFsaWRhdG9yc2BdLlRFcmFzU3RhcnRTZXNzaW9uSW5kZXgAAQQFEBAEABBVASBUaGUgc2Vzc2lvbiBpbmRleCBhdCB3aGljaCB0aGUgZXJhIHN0YXJ0IGZvciB0aGUgbGFzdCBbYENvbmZpZzo6SGlzdG9yeURlcHRoYF0gZXJhcy4AYQEgTm90ZTogVGhpcyB0cmFja3MgdGhlIHN0YXJ0aW5nIHNlc3Npb24gKGkuZS4gc2Vzc2lvbiBpbmRleCB3aGVuIGVyYSBzdGFydCBiZWluZyBhY3RpdmUp8CBmb3IgdGhlIGVyYXMgaW4gYFtDdXJyZW50RXJhIC0gSElTVE9SWV9ERVBUSCwgQ3VycmVudEVyYV1gLixFcmFzU3Rha2VycwEBCAUF8Qj1CAwAAAAgeCBFeHBvc3VyZSBvZiB2YWxpZGF0b3IgYXQgZXJhLgBhASBUaGlzIGlzIGtleWVkIGZpcnN0IGJ5IHRoZSBlcmEgaW5kZXggdG8gYWxsb3cgYnVsayBkZWxldGlvbiBhbmQgdGhlbiB0aGUgc3Rhc2ggYWNjb3VudC4AzCBJcyBpdCByZW1vdmVkIGFmdGVyIFtgQ29uZmlnOjpIaXN0b3J5RGVwdGhgXSBlcmFzLkEBIElmIHN0YWtlcnMgaGFzbid0IGJlZW4gc2V0IG9yIGhhcyBiZWVuIHJlbW92ZWQgdGhlbiBlbXB0eSBleHBvc3VyZSBpcyByZXR1cm5lZC4AKQEgTm90ZTogRGVwcmVjYXRlZCBzaW5jZSB2MTQuIFVzZSBgRXJhSW5mb2AgaW5zdGVhZCB0byB3b3JrIHdpdGggZXhwb3N1cmVzLkxFcmFzU3Rha2Vyc092ZXJ2aWV3AAEIBQXxCAEJBAAwuCBTdW1tYXJ5IG9mIHZhbGlkYXRvciBleHBvc3VyZSBhdCBhIGdpdmVuIGVyYS4AcQEgVGhpcyBjb250YWlucyB0aGUgdG90YWwgc3Rha2UgaW4gc3VwcG9ydCBvZiB0aGUgdmFsaWRhdG9yIGFuZCB0aGVpciBvd24gc3Rha2UuIEluIGFkZGl0aW9uLHUBIGl0IGNhbiBhbHNvIGJlIHVzZWQgdG8gZ2V0IHRoZSBudW1iZXIgb2Ygbm9taW5hdG9ycyBiYWNraW5nIHRoaXMgdmFsaWRhdG9yIGFuZCB0aGUgbnVtYmVyIG9maQEgZXhwb3N1cmUgcGFnZXMgdGhleSBhcmUgZGl2aWRlZCBpbnRvLiBUaGUgcGFnZSBjb3VudCBpcyB1c2VmdWwgdG8gZGV0ZXJtaW5lIHRoZSBudW1iZXIgb2asIHBhZ2VzIG9mIHJld2FyZHMgdGhhdCBuZWVkcyB0byBiZSBjbGFpbWVkLgBhASBUaGlzIGlzIGtleWVkIGZpcnN0IGJ5IHRoZSBlcmEgaW5kZXggdG8gYWxsb3cgYnVsayBkZWxldGlvbiBhbmQgdGhlbiB0aGUgc3Rhc2ggYWNjb3VudC6sIFNob3VsZCBvbmx5IGJlIGFjY2Vzc2VkIHRocm91Z2ggYEVyYUluZm9gLgDMIElzIGl0IHJlbW92ZWQgYWZ0ZXIgW2BDb25maWc6Okhpc3RvcnlEZXB0aGBdIGVyYXMuQQEgSWYgc3Rha2VycyBoYXNuJ3QgYmVlbiBzZXQgb3IgaGFzIGJlZW4gcmVtb3ZlZCB0aGVuIGVtcHR5IG92ZXJ2aWV3IGlzIHJldHVybmVkLkhFcmFzU3Rha2Vyc0NsaXBwZWQBAQgFBfEI9QgMAAAAQJggQ2xpcHBlZCBFeHBvc3VyZSBvZiB2YWxpZGF0b3IgYXQgZXJhLgBlASBOb3RlOiBUaGlzIGlzIGRlcHJlY2F0ZWQsIHNob3VsZCBiZSB1c2VkIGFzIHJlYWQtb25seSBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUuMQEgTmV3IGBFeHBvc3VyZWBzIGFyZSBzdG9yZWQgaW4gYSBwYWdlZCBtYW5uZXIgaW4gYEVyYXNTdGFrZXJzUGFnZWRgIGluc3RlYWQuAFkBIFRoaXMgaXMgc2ltaWxhciB0byBbYEVyYXNTdGFrZXJzYF0gYnV0IG51bWJlciBvZiBub21pbmF0b3JzIGV4cG9zZWQgaXMgcmVkdWNlZCB0byB0aGWoIGBUOjpNYXhFeHBvc3VyZVBhZ2VTaXplYCBiaWdnZXN0IHN0YWtlcnMuHQEgKE5vdGU6IHRoZSBmaWVsZCBgdG90YWxgIGFuZCBgb3duYCBvZiB0aGUgZXhwb3N1cmUgcmVtYWlucyB1bmNoYW5nZWQpLvQgVGhpcyBpcyB1c2VkIHRvIGxpbWl0IHRoZSBpL28gY29zdCBmb3IgdGhlIG5vbWluYXRvciBwYXlvdXQuAF0BIFRoaXMgaXMga2V5ZWQgZmlzdCBieSB0aGUgZXJhIGluZGV4IHRvIGFsbG93IGJ1bGsgZGVsZXRpb24gYW5kIHRoZW4gdGhlIHN0YXNoIGFjY291bnQuAMwgSXQgaXMgcmVtb3ZlZCBhZnRlciBbYENvbmZpZzo6SGlzdG9yeURlcHRoYF0gZXJhcy5BASBJZiBzdGFrZXJzIGhhc24ndCBiZWVuIHNldCBvciBoYXMgYmVlbiByZW1vdmVkIHRoZW4gZW1wdHkgZXhwb3N1cmUgaXMgcmV0dXJuZWQuACkBIE5vdGU6IERlcHJlY2F0ZWQgc2luY2UgdjE0LiBVc2UgYEVyYUluZm9gIGluc3RlYWQgdG8gd29yayB3aXRoIGV4cG9zdXJlcy5ARXJhc1N0YWtlcnNQYWdlZAABDAUFBQUJCQkEABjAIFBhZ2luYXRlZCBleHBvc3VyZSBvZiBhIHZhbGlkYXRvciBhdCBnaXZlbiBlcmEuAHEBIFRoaXMgaXMga2V5ZWQgZmlyc3QgYnkgdGhlIGVyYSBpbmRleCB0byBhbGxvdyBidWxrIGRlbGV0aW9uLCB0aGVuIHN0YXNoIGFjY291bnQgYW5kIGZpbmFsbHnUIHRoZSBwYWdlLiBTaG91bGQgb25seSBiZSBhY2Nlc3NlZCB0aHJvdWdoIGBFcmFJbmZvYC4A1CBUaGlzIGlzIGNsZWFyZWQgYWZ0ZXIgW2BDb25maWc6Okhpc3RvcnlEZXB0aGBdIGVyYXMuOENsYWltZWRSZXdhcmRzAQEIBQXxCOUBBAAY3CBIaXN0b3J5IG9mIGNsYWltZWQgcGFnZWQgcmV3YXJkcyBieSBlcmEgYW5kIHZhbGlkYXRvci4AaQEgVGhpcyBpcyBrZXllZCBieSBlcmEgYW5kIHZhbGlkYXRvciBzdGFzaCB3aGljaCBtYXBzIHRvIHRoZSBzZXQgb2YgcGFnZSBpbmRleGVzIHdoaWNoIGhhdmU4IGJlZW4gY2xhaW1lZC4AzCBJdCBpcyByZW1vdmVkIGFmdGVyIFtgQ29uZmlnOjpIaXN0b3J5RGVwdGhgXSBlcmFzLkhFcmFzVmFsaWRhdG9yUHJlZnMBAQgFBfEIsAgAABQRASBTaW1pbGFyIHRvIGBFcmFzU3Rha2Vyc2AsIHRoaXMgaG9sZHMgdGhlIHByZWZlcmVuY2VzIG9mIHZhbGlkYXRvcnMuAGEBIFRoaXMgaXMga2V5ZWQgZmlyc3QgYnkgdGhlIGVyYSBpbmRleCB0byBhbGxvdyBidWxrIGRlbGV0aW9uIGFuZCB0aGVuIHRoZSBzdGFzaCBhY2NvdW50LgDMIElzIGl0IHJlbW92ZWQgYWZ0ZXIgW2BDb25maWc6Okhpc3RvcnlEZXB0aGBdIGVyYXMuTEVyYXNWYWxpZGF0b3JSZXdhcmQAAQQFEBgEAAwtASBUaGUgdG90YWwgdmFsaWRhdG9yIGVyYSBwYXlvdXQgZm9yIHRoZSBsYXN0IFtgQ29uZmlnOjpIaXN0b3J5RGVwdGhgXSBlcmFzLgAhASBFcmFzIHRoYXQgaGF2ZW4ndCBmaW5pc2hlZCB5ZXQgb3IgaGFzIGJlZW4gcmVtb3ZlZCBkb2Vzbid0IGhhdmUgcmV3YXJkLkBFcmFzUmV3YXJkUG9pbnRzAQEEBRANCRQAAAAAAAjQIFJld2FyZHMgZm9yIHRoZSBsYXN0IFtgQ29uZmlnOjpIaXN0b3J5RGVwdGhgXSBlcmFzLiUBIElmIHJld2FyZCBoYXNuJ3QgYmVlbiBzZXQgb3IgaGFzIGJlZW4gcmVtb3ZlZCB0aGVuIDAgcmV3YXJkIGlzIHJldHVybmVkLjhFcmFzVG90YWxTdGFrZQEBBAUQGEAAAAAAAAAAAAAAAAAAAAAACBEBIFRoZSB0b3RhbCBhbW91bnQgc3Rha2VkIGZvciB0aGUgbGFzdCBbYENvbmZpZzo6SGlzdG9yeURlcHRoYF0gZXJhcy4dASBJZiB0b3RhbCBoYXNuJ3QgYmVlbiBzZXQgb3IgaGFzIGJlZW4gcmVtb3ZlZCB0aGVuIDAgc3Rha2UgaXMgcmV0dXJuZWQuIEZvcmNlRXJhAQC4BAAEVCBNb2RlIG9mIGVyYSBmb3JjaW5nLkBNYXhTdGFrZWRSZXdhcmRzAADhAQQADBkBIE1heGltdW0gc3Rha2VkIHJld2FyZHMsIGkuZS4gdGhlIHBlcmNlbnRhZ2Ugb2YgdGhlIGVyYSBpbmZsYXRpb24gdGhhdGwgaXMgdXNlZCBmb3Igc3Rha2UgcmV3YXJkcy6sIFNlZSBbRXJhIHBheW91dF0oLi9pbmRleC5odG1sI2VyYS1wYXlvdXQpLkxTbGFzaFJld2FyZEZyYWN0aW9uAQCsEAAAAAAM+CBUaGUgcGVyY2VudGFnZSBvZiB0aGUgc2xhc2ggdGhhdCBpcyBkaXN0cmlidXRlZCB0byByZXBvcnRlcnMuAOQgVGhlIHJlc3Qgb2YgdGhlIHNsYXNoZWQgdmFsdWUgaXMgaGFuZGxlZCBieSB0aGUgYFNsYXNoYC5MQ2FuY2VsZWRTbGFzaFBheW91dAEAGEAAAAAAAAAAAAAAAAAAAAAACBUBIFRoZSBhbW91bnQgb2YgY3VycmVuY3kgZ2l2ZW4gdG8gcmVwb3J0ZXJzIG9mIGEgc2xhc2ggZXZlbnQgd2hpY2ggd2Fz7CBjYW5jZWxlZCBieSBleHRyYW9yZGluYXJ5IGNpcmN1bXN0YW5jZXMgKGUuZy4gZ292ZXJuYW5jZSkuQFVuYXBwbGllZFNsYXNoZXMBAQQFEB0JBAAExCBBbGwgdW5hcHBsaWVkIHNsYXNoZXMgdGhhdCBhcmUgcXVldWVkIGZvciBsYXRlci4oQm9uZGVkRXJhcwEAyQcEABAlASBBIG1hcHBpbmcgZnJvbSBzdGlsbC1ib25kZWQgZXJhcyB0byB0aGUgZmlyc3Qgc2Vzc2lvbiBpbmRleCBvZiB0aGF0IGVyYS4AyCBNdXN0IGNvbnRhaW5zIGluZm9ybWF0aW9uIGZvciBlcmFzIGZvciB0aGUgcmFuZ2U6vCBgW2FjdGl2ZV9lcmEgLSBib3VuZGluZ19kdXJhdGlvbjsgYWN0aXZlX2VyYV1gTFZhbGlkYXRvclNsYXNoSW5FcmEAAQgFBfEIJQkEAAhFASBBbGwgc2xhc2hpbmcgZXZlbnRzIG9uIHZhbGlkYXRvcnMsIG1hcHBlZCBieSBlcmEgdG8gdGhlIGhpZ2hlc3Qgc2xhc2ggcHJvcG9ydGlvbnAgYW5kIHNsYXNoIHZhbHVlIG9mIHRoZSBlcmEuTE5vbWluYXRvclNsYXNoSW5FcmEAAQgFBfEIGAQABGEBIEFsbCBzbGFzaGluZyBldmVudHMgb24gbm9taW5hdG9ycywgbWFwcGVkIGJ5IGVyYSB0byB0aGUgaGlnaGVzdCBzbGFzaCB2YWx1ZSBvZiB0aGUgZXJhLjRTbGFzaGluZ1NwYW5zAAEEBQApCQQABIwgU2xhc2hpbmcgc3BhbnMgZm9yIHN0YXNoIGFjY291bnRzLiRTcGFuU2xhc2gBAQQFGQktCYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAg9ASBSZWNvcmRzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBtYXhpbXVtIHNsYXNoIG9mIGEgc3Rhc2ggd2l0aGluIGEgc2xhc2hpbmcgc3Bhbiy4IGFzIHdlbGwgYXMgaG93IG11Y2ggcmV3YXJkIGhhcyBiZWVuIHBhaWQgb3V0LlRDdXJyZW50UGxhbm5lZFNlc3Npb24BABAQAAAAAAzoIFRoZSBsYXN0IHBsYW5uZWQgc2Vzc2lvbiBzY2hlZHVsZWQgYnkgdGhlIHNlc3Npb24gcGFsbGV0LgBxASBUaGlzIGlzIGJhc2ljYWxseSBpbiBzeW5jIHdpdGggdGhlIGNhbGwgdG8gW2BwYWxsZXRfc2Vzc2lvbjo6U2Vzc2lvbk1hbmFnZXI6Om5ld19zZXNzaW9uYF0uSERpc2FibGVkVmFsaWRhdG9ycwEA5QEEABx1ASBJbmRpY2VzIG9mIHZhbGlkYXRvcnMgdGhhdCBoYXZlIG9mZmVuZGVkIGluIHRoZSBhY3RpdmUgZXJhLiBUaGUgb2ZmZW5kZXJzIGFyZSBkaXNhYmxlZCBmb3IgYWkBIHdob2xlIGVyYS4gRm9yIHRoaXMgcmVhc29uIHRoZXkgYXJlIGtlcHQgaGVyZSAtIG9ubHkgc3Rha2luZyBwYWxsZXQga25vd3MgYWJvdXQgZXJhcy4gVGhlVQEgaW1wbGVtZW50b3Igb2YgW2BEaXNhYmxpbmdTdHJhdGVneWBdIGRlZmluZXMgaWYgYSB2YWxpZGF0b3Igc2hvdWxkIGJlIGRpc2FibGVkIHdoaWNobQEgaW1wbGljaXRseSBtZWFucyB0aGF0IHRoZSBpbXBsZW1lbnRvciBhbHNvIGNvbnRyb2xzIHRoZSBtYXggbnVtYmVyIG9mIGRpc2FibGVkIHZhbGlkYXRvcnMuAG0BIFRoZSB2ZWMgaXMgYWx3YXlzIGtlcHQgc29ydGVkIHNvIHRoYXQgd2UgY2FuIGZpbmQgd2hldGhlciBhIGdpdmVuIHZhbGlkYXRvciBoYXMgcHJldmlvdXNseXggb2ZmZW5kZWQgdXNpbmcgYmluYXJ5IHNlYXJjaC44Q2hpbGxUaHJlc2hvbGQAAOEBBAAMUQEgVGhlIHRocmVzaG9sZCBmb3Igd2hlbiB1c2VycyBjYW4gc3RhcnQgY2FsbGluZyBgY2hpbGxfb3RoZXJgIGZvciBvdGhlciB2YWxpZGF0b3JzIC9ZASBub21pbmF0b3JzLiBUaGUgdGhyZXNob2xkIGlzIGNvbXBhcmVkIHRvIHRoZSBhY3R1YWwgbnVtYmVyIG9mIHZhbGlkYXRvcnMgLyBub21pbmF0b3JzKQEgKGBDb3VudEZvcipgKSBpbiB0aGUgc3lzdGVtIGNvbXBhcmVkIHRvIHRoZSBjb25maWd1cmVkIG1heCAoYE1heCpDb3VudGApLgHZAQGkGDBIaXN0b3J5RGVwdGgQEFQAAABQjCBOdW1iZXIgb2YgZXJhcyB0byBrZWVwIGluIGhpc3RvcnkuAOggRm9sbG93aW5nIGluZm9ybWF0aW9uIGlzIGtlcHQgZm9yIGVyYXMgaW4gYFtjdXJyZW50X2VyYSAtCQEgSGlzdG9yeURlcHRoLCBjdXJyZW50X2VyYV1gOiBgRXJhc1N0YWtlcnNgLCBgRXJhc1N0YWtlcnNDbGlwcGVkYCwFASBgRXJhc1ZhbGlkYXRvclByZWZzYCwgYEVyYXNWYWxpZGF0b3JSZXdhcmRgLCBgRXJhc1Jld2FyZFBvaW50c2AsRQEgYEVyYXNUb3RhbFN0YWtlYCwgYEVyYXNTdGFydFNlc3Npb25JbmRleGAsIGBDbGFpbWVkUmV3YXJkc2AsIGBFcmFzU3Rha2Vyc1BhZ2VkYCxcIGBFcmFzU3Rha2Vyc092ZXJ2aWV3YC4A5CBNdXN0IGJlIG1vcmUgdGhhbiB0aGUgbnVtYmVyIG9mIGVyYXMgZGVsYXllZCBieSBzZXNzaW9uLvggSS5lLiBhY3RpdmUgZXJhIG11c3QgYWx3YXlzIGJlIGluIGhpc3RvcnkuIEkuZS4gYGFjdGl2ZV9lcmEgPsQgY3VycmVudF9lcmEgLSBoaXN0b3J5X2RlcHRoYCBtdXN0IGJlIGd1YXJhbnRlZWQuABEBIElmIG1pZ3JhdGluZyBhbiBleGlzdGluZyBwYWxsZXQgZnJvbSBzdG9yYWdlIHZhbHVlIHRvIGNvbmZpZyB2YWx1ZSzsIHRoaXMgc2hvdWxkIGJlIHNldCB0byBzYW1lIHZhbHVlIG9yIGdyZWF0ZXIgYXMgaW4gc3RvcmFnZS4AFQEgTm90ZTogYEhpc3RvcnlEZXB0aGAgaXMgdXNlZCBhcyB0aGUgdXBwZXIgYm91bmQgZm9yIHRoZSBgQm91bmRlZFZlY2AtASBpdGVtIGBTdGFraW5nTGVkZ2VyLmxlZ2FjeV9jbGFpbWVkX3Jld2FyZHNgLiBTZXR0aW5nIHRoaXMgdmFsdWUgbG93ZXIgdGhhbtggdGhlIGV4aXN0aW5nIHZhbHVlIGNhbiBsZWFkIHRvIGluY29uc2lzdGVuY2llcyBpbiB0aGUVASBgU3Rha2luZ0xlZGdlcmAgYW5kIHdpbGwgbmVlZCB0byBiZSBoYW5kbGVkIHByb3Blcmx5IGluIGEgbWlncmF0aW9uLvAgVGhlIHRlc3QgYHJlZHVjaW5nX2hpc3RvcnlfZGVwdGhfYWJydXB0YCBzaG93cyB0aGlzIGVmZmVjdC44U2Vzc2lvbnNQZXJFcmEQEAYAAAAEcCBOdW1iZXIgb2Ygc2Vzc2lvbnMgcGVyIGVyYS48Qm9uZGluZ0R1cmF0aW9uEBAcAAAABOQgTnVtYmVyIG9mIGVyYXMgdGhhdCBzdGFrZWQgZnVuZHMgbXVzdCByZW1haW4gYm9uZGVkIGZvci5IU2xhc2hEZWZlckR1cmF0aW9uEBAbAAAAEAEBIE51bWJlciBvZiBlcmFzIHRoYXQgc2xhc2hlcyBhcmUgZGVmZXJyZWQgYnksIGFmdGVyIGNvbXB1dGF0aW9uLgANASBUaGlzIHNob3VsZCBiZSBsZXNzIHRoYW4gdGhlIGJvbmRpbmcgZHVyYXRpb24uIFNldCB0byAwIGlmIHNsYXNoZXMVASBzaG91bGQgYmUgYXBwbGllZCBpbW1lZGlhdGVseSwgd2l0aG91dCBvcHBvcnR1bml0eSBmb3IgaW50ZXJ2ZW50aW9uLkxNYXhFeHBvc3VyZVBhZ2VTaXplEBAAAgAALLAgVGhlIG1heGltdW0gc2l6ZSBvZiBlYWNoIGBUOjpFeHBvc3VyZVBhZ2VgLgApASBBbiBgRXhwb3N1cmVQYWdlYCBpcyB3ZWFrbHkgYm91bmRlZCB0byBhIG1heGltdW0gb2YgYE1heEV4cG9zdXJlUGFnZVNpemVgMCBub21pbmF0b3JzLgAhASBGb3Igb2xkZXIgbm9uLXBhZ2VkIGV4cG9zdXJlLCBhIHJld2FyZCBwYXlvdXQgd2FzIHJlc3RyaWN0ZWQgdG8gdGhlIHRvcCEBIGBNYXhFeHBvc3VyZVBhZ2VTaXplYCBub21pbmF0b3JzLiBUaGlzIGlzIHRvIGxpbWl0IHRoZSBpL28gY29zdCBmb3IgdGhlSCBub21pbmF0b3IgcGF5b3V0LgBZASBOb3RlOiBgTWF4RXhwb3N1cmVQYWdlU2l6ZWAgaXMgdXNlZCB0byBib3VuZCBgQ2xhaW1lZFJld2FyZHNgIGFuZCBpcyB1bnNhZmUgdG8gcmVkdWNlkCB3aXRob3V0IGhhbmRsaW5nIGl0IGluIGEgbWlncmF0aW9uLkhNYXhVbmxvY2tpbmdDaHVua3MQECAAAAAoBQEgVGhlIG1heGltdW0gbnVtYmVyIG9mIGB1bmxvY2tpbmdgIGNodW5rcyBhIFtgU3Rha2luZ0xlZGdlcmBdIGNhbgkBIGhhdmUuIEVmZmVjdGl2ZWx5IGRldGVybWluZXMgaG93IG1hbnkgdW5pcXVlIGVyYXMgYSBzdGFrZXIgbWF5IGJlOCB1bmJvbmRpbmcgaW4uAPggTm90ZTogYE1heFVubG9ja2luZ0NodW5rc2AgaXMgdXNlZCBhcyB0aGUgdXBwZXIgYm91bmQgZm9yIHRoZQEBIGBCb3VuZGVkVmVjYCBpdGVtIGBTdGFraW5nTGVkZ2VyLnVubG9ja2luZ2AuIFNldHRpbmcgdGhpcyB2YWx1ZQUBIGxvd2VyIHRoYW4gdGhlIGV4aXN0aW5nIHZhbHVlIGNhbiBsZWFkIHRvIGluY29uc2lzdGVuY2llcyBpbiB0aGUJASBgU3Rha2luZ0xlZGdlcmAgYW5kIHdpbGwgbmVlZCB0byBiZSBoYW5kbGVkIHByb3Blcmx5IGluIGEgcnVudGltZQUBIG1pZ3JhdGlvbi4gVGhlIHRlc3QgYHJlZHVjaW5nX21heF91bmxvY2tpbmdfY2h1bmtzX2FicnVwdGAgc2hvd3M0IHRoaXMgZWZmZWN0LgExCQcAIE9mZmVuY2VzASBPZmZlbmNlcwgcUmVwb3J0cwABBAU0NQkEAARJASBUaGUgcHJpbWFyeSBzdHJ1Y3R1cmUgdGhhdCBob2xkcyBhbGwgb2ZmZW5jZSByZWNvcmRzIGtleWVkIGJ5IHJlcG9ydCBpZGVudGlmaWVycy5YQ29uY3VycmVudFJlcG9ydHNJbmRleAEBCAUFPQmVAQQABCkBIEEgdmVjdG9yIG9mIHJlcG9ydHMgb2YgdGhlIHNhbWUga2luZCB0aGF0IGhhcHBlbmVkIGF0IHRoZSBzYW1lIHRpbWUgc2xvdC4AAbwAAAgAKEhpc3RvcmljYWwBKEhpc3RvcmljYWwISEhpc3RvcmljYWxTZXNzaW9ucwABBAUQNQgEAARdASBNYXBwaW5nIGZyb20gaGlzdG9yaWNhbCBzZXNzaW9uIGluZGljZXMgdG8gc2Vzc2lvbi1kYXRhIHJvb3QgaGFzaCBhbmQgdmFsaWRhdG9yIGNvdW50LixTdG9yZWRSYW5nZQAAgAQABOQgVGhlIHJhbmdlIG9mIGhpc3RvcmljYWwgc2Vzc2lvbnMgd2Ugc3RvcmUuIFtmaXJzdCwgbGFzdCkAAAAAIQAcU2Vzc2lvbgEcU2Vzc2lvbhwoVmFsaWRhdG9ycwEA0QEEAAR8IFRoZSBjdXJyZW50IHNldCBvZiB2YWxpZGF0b3JzLjBDdXJyZW50SW5kZXgBABAQAAAAAAR4IEN1cnJlbnQgaW5kZXggb2YgdGhlIHNlc3Npb24uNFF1ZXVlZENoYW5nZWQBACAEAAg5ASBUcnVlIGlmIHRoZSB1bmRlcmx5aW5nIGVjb25vbWljIGlkZW50aXRpZXMgb3Igd2VpZ2h0aW5nIGJlaGluZCB0aGUgdmFsaWRhdG9yc6QgaGFzIGNoYW5nZWQgaW4gdGhlIHF1ZXVlZCB2YWxpZGF0b3Igc2V0LihRdWV1ZWRLZXlzAQBBCQQACD0BIFRoZSBxdWV1ZWQga2V5cyBmb3IgdGhlIG5leHQgc2Vzc2lvbi4gV2hlbiB0aGUgbmV4dCBzZXNzaW9uIGJlZ2lucywgdGhlc2Uga2V5c+Agd2lsbCBiZSB1c2VkIHRvIGRldGVybWluZSB0aGUgdmFsaWRhdG9yJ3Mgc2Vzc2lvbiBrZXlzLkhEaXNhYmxlZFZhbGlkYXRvcnMBAOUBBAAUgCBJbmRpY2VzIG9mIGRpc2FibGVkIHZhbGlkYXRvcnMuAD0BIFRoZSB2ZWMgaXMgYWx3YXlzIGtlcHQgc29ydGVkIHNvIHRoYXQgd2UgY2FuIGZpbmQgd2hldGhlciBhIGdpdmVuIHZhbGlkYXRvciBpcz0BIGRpc2FibGVkIHVzaW5nIGJpbmFyeSBzZWFyY2guIEl0IGdldHMgY2xlYXJlZCB3aGVuIGBvbl9zZXNzaW9uX2VuZGluZ2AgcmV0dXJuc2QgYSBuZXcgc2V0IG9mIGlkZW50aXRpZXMuIE5leHRLZXlzAAEEBQAZAgQABJwgVGhlIG5leHQgc2Vzc2lvbiBrZXlzIGZvciBhIHZhbGlkYXRvci4gS2V5T3duZXIAAQQFSQkABAAECQEgVGhlIG93bmVyIG9mIGEga2V5LiBUaGUga2V5IGlzIHRoZSBgS2V5VHlwZUlkYCArIHRoZSBlbmNvZGVkIGtleS4BFQIBxAABUQkJABxHcmFuZHBhARxHcmFuZHBhHBRTdGF0ZQEAVQkEAASQIFN0YXRlIG9mIHRoZSBjdXJyZW50IGF1dGhvcml0eSBzZXQuNFBlbmRpbmdDaGFuZ2UAAFkJBAAExCBQZW5kaW5nIGNoYW5nZTogKHNpZ25hbGVkIGF0LCBzY2hlZHVsZWQgY2hhbmdlKS4oTmV4dEZvcmNlZAAAEAQABLwgbmV4dCBibG9jayBudW1iZXIgd2hlcmUgd2UgY2FuIGZvcmNlIGEgY2hhbmdlLhxTdGFsbGVkAACABAAEkCBgdHJ1ZWAgaWYgd2UgYXJlIGN1cnJlbnRseSBzdGFsbGVkLjBDdXJyZW50U2V0SWQBADAgAAAAAAAAAAAIXQEgVGhlIG51bWJlciBvZiBjaGFuZ2VzIChib3RoIGluIHRlcm1zIG9mIGtleXMgYW5kIHVuZGVybHlpbmcgZWNvbm9taWMgcmVzcG9uc2liaWxpdGllcynEIGluIHRoZSAic2V0IiBvZiBHcmFuZHBhIHZhbGlkYXRvcnMgZnJvbSBnZW5lc2lzLjBTZXRJZFNlc3Npb24AAQQFMBAEAChZASBBIG1hcHBpbmcgZnJvbSBncmFuZHBhIHNldCBJRCB0byB0aGUgaW5kZXggb2YgdGhlICptb3N0IHJlY2VudCogc2Vzc2lvbiBmb3Igd2hpY2ggaXRzaCBtZW1iZXJzIHdlcmUgcmVzcG9uc2libGUuAEUBIFRoaXMgaXMgb25seSB1c2VkIGZvciB2YWxpZGF0aW5nIGVxdWl2b2NhdGlvbiBwcm9vZnMuIEFuIGVxdWl2b2NhdGlvbiBwcm9vZiBtdXN0TQEgY29udGFpbnMgYSBrZXktb3duZXJzaGlwIHByb29mIGZvciBhIGdpdmVuIHNlc3Npb24sIHRoZXJlZm9yZSB3ZSBuZWVkIGEgd2F5IHRvIHRpZUUBIHRvZ2V0aGVyIHNlc3Npb25zIGFuZCBHUkFORFBBIHNldCBpZHMsIGkuZS4gd2UgbmVlZCB0byB2YWxpZGF0ZSB0aGF0IGEgdmFsaWRhdG9yQQEgd2FzIHRoZSBvd25lciBvZiBhIGdpdmVuIGtleSBvbiBhIGdpdmVuIHNlc3Npb24sIGFuZCB3aGF0IHRoZSBhY3RpdmUgc2V0IElEIHdhc1QgZHVyaW5nIHRoYXQgc2Vzc2lvbi4AuCBUV09YLU5PVEU6IGBTZXRJZGAgaXMgbm90IHVuZGVyIHVzZXIgY29udHJvbC4sQXV0aG9yaXRpZXMBAF0JBAAEhCBUaGUgY3VycmVudCBsaXN0IG9mIGF1dGhvcml0aWVzLgExAgHIDDhNYXhBdXRob3JpdGllcxAQoIYBAARcIE1heCBBdXRob3JpdGllcyBpbiB1c2U0TWF4Tm9taW5hdG9ycxAQAAIAAATUIFRoZSBtYXhpbXVtIG51bWJlciBvZiBub21pbmF0b3JzIGZvciBlYWNoIHZhbGlkYXRvci5YTWF4U2V0SWRTZXNzaW9uRW50cmllczAgqAAAAAAAAAAYOQEgVGhlIG1heGltdW0gbnVtYmVyIG9mIGVudHJpZXMgdG8ga2VlcCBpbiB0aGUgc2V0IGlkIHRvIHNlc3Npb24gaW5kZXggbWFwcGluZy4AMQEgU2luY2UgdGhlIGBTZXRJZFNlc3Npb25gIG1hcCBpcyBvbmx5IHVzZWQgZm9yIHZhbGlkYXRpbmcgZXF1aXZvY2F0aW9ucyB0aGlzKQEgdmFsdWUgc2hvdWxkIHJlbGF0ZSB0byB0aGUgYm9uZGluZyBkdXJhdGlvbiBvZiB3aGF0ZXZlciBzdGFraW5nIHN5c3RlbSBpczUBIGJlaW5nIHVzZWQgKGlmIGFueSkuIElmIGVxdWl2b2NhdGlvbiBoYW5kbGluZyBpcyBub3QgZW5hYmxlZCB0aGVuIHRoaXMgdmFsdWU0IGNhbiBiZSB6ZXJvLgFhCQsASEF1dGhvcml0eURpc2NvdmVyeQFIQXV0aG9yaXR5RGlzY292ZXJ5CBBLZXlzAQBlCQQABIwgS2V5cyBvZiB0aGUgY3VycmVudCBhdXRob3JpdHkgc2V0LiBOZXh0S2V5cwEAZQkEAASAIEtleXMgb2YgdGhlIG5leHQgYXV0aG9yaXR5IHNldC4AAAAADQAgVHJlYXN1cnkBIFRyZWFzdXJ5GDRQcm9wb3NhbENvdW50AQAQEAAAAAAEpCBOdW1iZXIgb2YgcHJvcG9zYWxzIHRoYXQgaGF2ZSBiZWVuIG1hZGUuJFByb3Bvc2FscwABBAUQbQkEAAR8IFByb3Bvc2FscyB0aGF0IGhhdmUgYmVlbiBtYWRlLixEZWFjdGl2YXRlZAEAGEAAAAAAAAAAAAAAAAAAAAAABPAgVGhlIGFtb3VudCB3aGljaCBoYXMgYmVlbiByZXBvcnRlZCBhcyBpbmFjdGl2ZSB0byBDdXJyZW5jeS4kQXBwcm92YWxzAQBxCQQABPggUHJvcG9zYWwgaW5kaWNlcyB0aGF0IGhhdmUgYmVlbiBhcHByb3ZlZCBidXQgbm90IHlldCBhd2FyZGVkLihTcGVuZENvdW50AQAQEAAAAAAEpCBUaGUgY291bnQgb2Ygc3BlbmRzIHRoYXQgaGF2ZSBiZWVuIG1hZGUuGFNwZW5kcwABBAUQdQkEAATQIFNwZW5kcyB0aGF0IGhhdmUgYmVlbiBhcHByb3ZlZCBhbmQgYmVpbmcgcHJvY2Vzc2VkLgFdAgHYFCxTcGVuZFBlcmlvZBAQAEYFAASIIFBlcmlvZCBiZXR3ZWVuIHN1Y2Nlc3NpdmUgc3BlbmRzLhBCdXJufQkQECcAAAQRASBQZXJjZW50YWdlIG9mIHNwYXJlIGZ1bmRzIChpZiBhbnkpIHRoYXQgYXJlIGJ1cm50IHBlciBzcGVuZCBwZXJpb2QuIFBhbGxldElkgQkgcHkvdHJzcnkEGQEgVGhlIHRyZWFzdXJ5J3MgcGFsbGV0IGlkLCB1c2VkIGZvciBkZXJpdmluZyBpdHMgc292ZXJlaWduIGFjY291bnQgSUQuME1heEFwcHJvdmFscxAQZAAAAAwVASBUaGUgbWF4aW11bSBudW1iZXIgb2YgYXBwcm92YWxzIHRoYXQgY2FuIHdhaXQgaW4gdGhlIHNwZW5kaW5nIHF1ZXVlLgBNASBOT1RFOiBUaGlzIHBhcmFtZXRlciBpcyBhbHNvIHVzZWQgd2l0aGluIHRoZSBCb3VudGllcyBQYWxsZXQgZXh0ZW5zaW9uIGlmIGVuYWJsZWQuMFBheW91dFBlcmlvZBAQgJcGAAQZASBUaGUgcGVyaW9kIGR1cmluZyB3aGljaCBhbiBhcHByb3ZlZCB0cmVhc3VyeSBzcGVuZCBoYXMgdG8gYmUgY2xhaW1lZC4BhQkTAEBDb252aWN0aW9uVm90aW5nAUBDb252aWN0aW9uVm90aW5nCCRWb3RpbmdGb3IBAQgFBYkJjQnYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACHUBIEFsbCB2b3RpbmcgZm9yIGEgcGFydGljdWxhciB2b3RlciBpbiBhIHBhcnRpY3VsYXIgdm90aW5nIGNsYXNzLiBXZSBzdG9yZSB0aGUgYmFsYW5jZSBmb3IgdGhlnCBudW1iZXIgb2Ygdm90ZXMgdGhhdCB3ZSBoYXZlIHJlY29yZGVkLjRDbGFzc0xvY2tzRm9yAQEEBQCtCQQADGkBIFRoZSB2b3RpbmcgY2xhc3NlcyB3aGljaCBoYXZlIGEgbm9uLXplcm8gbG9jayByZXF1aXJlbWVudCBhbmQgdGhlIGxvY2sgYW1vdW50cyB3aGljaCB0aGV5bQEgcmVxdWlyZS4gVGhlIGFjdHVhbCBhbW91bnQgbG9ja2VkIG9uIGJlaGFsZiBvZiB0aGlzIHBhbGxldCBzaG91bGQgYWx3YXlzIGJlIHRoZSBtYXhpbXVtIG9mLCB0aGlzIGxpc3QuAWUCAWUBCCBNYXhWb3RlcxAQAAIAABDwIFRoZSBtYXhpbXVtIG51bWJlciBvZiBjb25jdXJyZW50IHZvdGVzIGFuIGFjY291bnQgbWF5IGhhdmUuAFUBIEFsc28gdXNlZCB0byBjb21wdXRlIHdlaWdodCwgYW4gb3Zlcmx5IGxhcmdlIHZhbHVlIGNhbiBsZWFkIHRvIGV4dHJpbnNpY3Mgd2l0aCBsYXJnZcAgd2VpZ2h0IGVzdGltYXRpb246IHNlZSBgZGVsZWdhdGVgIGZvciBpbnN0YW5jZS5EVm90ZUxvY2tpbmdQZXJpb2QQEMCJAQAQkCBUaGUgbWluaW11bSBwZXJpb2Qgb2Ygdm90ZSBsb2NraW5nLgBlASBJdCBzaG91bGQgYmUgbm8gc2hvcnRlciB0aGFuIGVuYWN0bWVudCBwZXJpb2QgdG8gZW5zdXJlIHRoYXQgaW4gdGhlIGNhc2Ugb2YgYW4gYXBwcm92YWwsSQEgdGhvc2Ugc3VjY2Vzc2Z1bCB2b3RlcnMgYXJlIGxvY2tlZCBpbnRvIHRoZSBjb25zZXF1ZW5jZXMgdGhhdCB0aGVpciB2b3RlcyBlbnRhaWwuAbkJFAAkUmVmZXJlbmRhASRSZWZlcmVuZGEUPFJlZmVyZW5kdW1Db3VudAEAEBAAAAAABDEBIFRoZSBuZXh0IGZyZWUgcmVmZXJlbmR1bSBpbmRleCwgYWthIHRoZSBudW1iZXIgb2YgcmVmZXJlbmRhIHN0YXJ0ZWQgc28gZmFyLkRSZWZlcmVuZHVtSW5mb0ZvcgABBAIQvQkEAAS0IEluZm9ybWF0aW9uIGNvbmNlcm5pbmcgYW55IGdpdmVuIHJlZmVyZW5kdW0uKFRyYWNrUXVldWUBAQQFbQHdCQQAEF0BIFRoZSBzb3J0ZWQgbGlzdCBvZiByZWZlcmVuZGEgcmVhZHkgdG8gYmUgZGVjaWRlZCBidXQgbm90IHlldCBiZWluZyBkZWNpZGVkLCBvcmRlcmVkIGJ5fCBjb252aWN0aW9uLXdlaWdodGVkIGFwcHJvdmFscy4AQQEgVGhpcyBzaG91bGQgYmUgZW1wdHkgaWYgYERlY2lkaW5nQ291bnRgIGlzIGxlc3MgdGhhbiBgVHJhY2tJbmZvOjptYXhfZGVjaWRpbmdgLjREZWNpZGluZ0NvdW50AQEEBW0BEBAAAAAABMQgVGhlIG51bWJlciBvZiByZWZlcmVuZGEgYmVpbmcgZGVjaWRlZCBjdXJyZW50bHkuKE1ldGFkYXRhT2YAAQQCEDQEABgFASBUaGUgbWV0YWRhdGEgaXMgYSBnZW5lcmFsIGluZm9ybWF0aW9uIGNvbmNlcm5pbmcgdGhlIHJlZmVyZW5kdW0uSQEgVGhlIGBIYXNoYCByZWZlcnMgdG8gdGhlIHByZWltYWdlIG9mIHRoZSBgUHJlaW1hZ2VzYCBwcm92aWRlciB3aGljaCBjYW4gYmUgYSBKU09OiCBkdW1wIG9yIElQRlMgaGFzaCBvZiBhIEpTT04gZmlsZS4AdQEgQ29uc2lkZXIgYSBnYXJiYWdlIGNvbGxlY3Rpb24gZm9yIGEgbWV0YWRhdGEgb2YgZmluaXNoZWQgcmVmZXJlbmR1bXMgdG8gYHVucmVxdWVzdGAgKHJlbW92ZSlEIGxhcmdlIHByZWltYWdlcy4BeQIBaQEURFN1Ym1pc3Npb25EZXBvc2l0GEAA5AtUAgAAAAAAAAAAAAAABDUBIFRoZSBtaW5pbXVtIGFtb3VudCB0byBiZSB1c2VkIGFzIGEgZGVwb3NpdCBmb3IgYSBwdWJsaWMgcmVmZXJlbmR1bSBwcm9wb3NhbC4kTWF4UXVldWVkEBBkAAAABOQgTWF4aW11bSBzaXpl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Y291bnQ6AAEJChgAHFZlc3RpbmcBHFZlc3RpbmcIHFZlc3RpbmcAAQQCAA0KBAAE2CBJbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhlIHZlc3Rpbmcgb2YgYSBnaXZlbiBhY2NvdW50LjhTdG9yYWdlVmVyc2lvbgEAFQoEAAx8IFN0b3JhZ2UgdmVyc2lvbiBvZiB0aGUgcGFsbGV0LgAxASBOZXcgbmV0d29ya3Mgc3RhcnQgd2l0aCBsYXRlc3QgdmVyc2lvbiwgYXMgZGV0ZXJtaW5lZCBieSB0aGUgZ2VuZXNpcyBidWlsZC4B8QIBNQcIRE1pblZlc3RlZFRyYW5zZmVyGEAA5AtUAgAAAAAAAAAAAAAABOggVGhlIG1pbmltdW0gYW1vdW50IHRyYW5zZmVycmVkIHRvIGNhbGwgYHZlc3RlZF90cmFuc2ZlcmAuTE1heFZlc3RpbmdTY2hlZHVsZXMQEBwAAAAAARkKGQAcVXRpbGl0eQAB+QIBOQcETGJhdGNoZWRfY2FsbHNfbGltaXQQEKoqAAAEqCBUaGUgbGltaXQgb24gdGhlIG51bWJlciBvZiBiYXRjaGVkIGNhbGxzLgEdChoAFFByb3h5ARRQcm94eQgcUHJveGllcwEBBAUAIQpEAAAAAAAAAAAAAAAAAAAAAAAIRQEgVGhlIHNldCBvZiBhY2NvdW50IHByb3hpZXMuIE1hcHMgdGhlIGFjY291bnQgd2hpY2ggaGFzIGRlbGVnYXRlZCB0byB0aGUgYWNjb3VudHMhASB3aGljaCBhcmUgYmVpbmcgZGVsZWdhdGVkIHRvLCB0b2dldGhlciB3aXRoIHRoZSBhbW91bnQgaGVsZCBvbiBkZXBvc2l0LjRBbm5vdW5jZW1lbnRzAQEEBQAxCkQAAAAAAAAAAAAAAAAAAAAAAASsIFRoZSBhbm5vdW5jZW1lbnRzIG1hZGUgYnkgdGhlIHByb3h5IChrZXkpLgEBAwE9BxhAUHJveHlEZXBvc2l0QmFzZRhAAISylS4AAAAAAAAAAAAAABARASBUaGUgYmFzZSBhbW91bnQgb2YgY3VycmVuY3kgbmVlZGVkIHRvIHJlc2VydmUgZm9yIGNyZWF0aW5nIGEgcHJveHkuAAEBIFRoaXMgaXMgaGVsZCBmb3IgYW4gYWRkaXRpb25hbCBzdG9yYWdlIGl0ZW0gd2hvc2UgdmFsdWUgc2l6ZSBpcyUBIGBzaXplb2YoQmFsYW5jZSlgIGJ5dGVzIGFuZCB3aG9zZSBrZXkgc2l6ZSBpcyBgc2l6ZW9mKEFjY291bnRJZClgIGJ5dGVzLkhQcm94eURlcG9zaXRGYWN0b3IYQIBmqxMAAAAAAAAAAAAAAAAUvCBUaGUgYW1vdW50IG9mIGN1cnJlbmN5IG5lZWRlZCBwZXIgcHJveHkgYWRkZWQuADUBIFRoaXMgaXMgaGVsZCBmb3IgYWRkaW5nIDMyIGJ5dGVzIHBsdXMgYW4gaW5zdGFuY2Ugb2YgYFByb3h5VHlwZWAgbW9yZSBpbnRvIGFhASBwcmUtZXhpc3Rpbmcgc3RvcmFnZSB2YWx1ZS4gVGh1cywgd2hlbiBjb25maWd1cmluZyBgUHJveHlEZXBvc2l0RmFjdG9yYCBvbmUgc2hvdWxkIHRha2X0IGludG8gYWNjb3VudCBgMzIgKyBwcm94eV90eXBlLmVuY29kZSgpLmxlbigpYCBieXRlcyBvZiBkYXRhLihNYXhQcm94aWVzEBAgAAAABPAgVGhlIG1heGltdW0gYW1vdW50IG9mIHByb3hpZXMgYWxsb3dlZCBmb3IgYSBzaW5nbGUgYWNjb3VudC4oTWF4UGVuZGluZxAQIAAAAARFASBUaGUgbWF4aW11bSBhbW91bnQgb2YgdGltZS1kZWxheWVkIGFubm91bmNlbWVudHMgdGhhdCBhcmUgYWxsb3dlZCB0byBiZSBwZW5kaW5nLlxBbm5vdW5jZW1lbnREZXBvc2l0QmFzZRhAAISylS4AAAAAAAAAAAAAABAxASBUaGUgYmFzZSBhbW91bnQgb2YgY3VycmVuY3kgbmVlZGVkIHRvIHJlc2VydmUgZm9yIGNyZWF0aW5nIGFuIGFubm91bmNlbWVudC4ASQEgVGhpcyBpcyBoZWxkIHdoZW4gYSBuZXcgc3RvcmFnZSBpdGVtIGhvbGRpbmcgYSBgQmFsYW5jZWAgaXMgY3JlYXRlZCAodHlwaWNhbGx5IDE2ICBieXRlcykuZEFubm91bmNlbWVudERlcG9zaXRGYWN0b3IYQADNVicAAAAAAAAAAAAAAAAQ1CBUaGUgYW1vdW50IG9mIGN1cnJlbmN5IG5lZWRlZCBwZXIgYW5ub3VuY2VtZW50IG1hZGUuAFkBIFRoaXMgaXMgaGVsZCBmb3IgYWRkaW5nIGFuIGBBY2NvdW50SWRgLCBgSGFzaGAgYW5kIGBCbG9ja051bWJlcmAgKHR5cGljYWxseSA2OCBieXRlcymMIGludG8gYSBwcmUtZXhpc3Rpbmcgc3RvcmFnZSB2YWx1ZS4BQQodACBNdWx0aXNpZwEgTXVsdGlzaWcEJE11bHRpc2lncwABCAUCRQpJCgQABJQgVGhlIHNldCBvZiBvcGVuIG11bHRpc2lnIG9wZXJhdGlvbnMuAQ0DAUEHDCxEZXBvc2l0QmFzZRhAAIxhxS4AAAAAAAAAAAAAABhZASBUaGUgYmFzZSBhbW91bnQgb2YgY3VycmVuY3kgbmVlZGVkIHRvIHJlc2VydmUgZm9yIGNyZWF0aW5nIGEgbXVsdGlzaWcgZXhlY3V0aW9uIG9yIHRvhCBzdG9yZSBhIGRpc3BhdGNoIGNhbGwgZm9yIGxhdGVyLgABASBUaGlzIGlzIGhlbGQgZm9yIGFuIGFkZGl0aW9uYWwgc3RvcmFnZSBpdGVtIHdob3NlIHZhbHVlIHNpemUgaXMxASBgNCArIHNpemVvZigoQmxvY2tOdW1iZXIsIEJhbGFuY2UsIEFjY291bnRJZCkpYCBieXRlcyBhbmQgd2hvc2Uga2V5IHNpemUgaXOAIGAzMiArIHNpemVvZihBY2NvdW50SWQpYCBieXRlcy40RGVwb3NpdEZhY3RvchhAANASEwAAAAAAAAAAAAAAAAxVASBUaGUgYW1vdW50IG9mIGN1cnJlbmN5IG5lZWRlZCBwZXIgdW5pdCB0aHJlc2hvbGQgd2hlbiBjcmVhdGluZyBhIG11bHRpc2lnIGV4ZWN1dGlvbi4AJQEgVGhpcyBpcyBoZWxkIGZvciBhZGRpbmcgMzIgYnl0ZXMgbW9yZSBpbnRvIGEgcHJlLWV4aXN0aW5nIHN0b3JhZ2UgdmFsdWUuOE1heFNpZ25hdG9yaWVzEBBkAAAABOwgVGhlIG1heGltdW0gYW1vdW50IG9mIHNpZ25hdG9yaWVzIGFsbG93ZWQgaW4gdGhlIG11bHRpc2lnLgFRCh4AIEJvdW50aWVzASBCb3VudGllcxAsQm91bnR5Q291bnQBABAQAAAAAATAIE51bWJlciBvZiBib3VudHkgcHJvcG9zYWxzIHRoYXQgaGF2ZSBiZWVuIG1hZGUuIEJvdW50aWVzAAEEBRBVCgQABHggQm91bnRpZXMgdGhhdCBoYXZlIGJlZW4gbWFkZS5IQm91bnR5RGVzY3JpcHRpb25zAAEEBRBdCgQABIAgVGhlIGRlc2NyaXB0aW9uIG9mIGVhY2ggYm91bnR5LjxCb3VudHlBcHByb3ZhbHMBAHEJBAAE7CBCb3VudHkgaW5kaWNlcyB0aGF0IGhhdmUgYmVlbiBhcHByb3ZlZCBidXQgbm90IHlldCBmdW5kZWQuARkDAUUHJERCb3VudHlEZXBvc2l0QmFzZRhAAOQLVAIAAAAAAAAAAAAAAAToIFRoZSBhbW91bnQgaGVsZCBvbiBkZXBvc2l0IGZvciBwbGFjaW5nIGEgYm91bnR5IHByb3Bvc2FsLmBCb3VudHlEZXBvc2l0UGF5b3V0RGVsYXkQEAAAAAAEWQEgVGhlIGRlbGF5IHBlcmlvZCBmb3Igd2hpY2ggYSBib3VudHkgYmVuZWZpY2lhcnkgbmVlZCB0byB3YWl0IGJlZm9yZSBjbGFpbSB0aGUgcGF5b3V0LkhCb3VudHlVcGRhdGVQZXJpb2QQEIDGEwAEbCBCb3VudHkgZHVyYXRpb24gaW4gYmxvY2tzLmBDdXJhdG9yRGVwb3NpdE11bHRpcGxpZXJ9CRAgoQcAEBkBIFRoZSBjdXJhdG9yIGRlcG9zaXQgaXMgY2FsY3VsYXRlZCBhcyBhIHBlcmNlbnRhZ2Ugb2YgdGhlIGN1cmF0b3IgZmVlLgA5ASBUaGlzIGRlcG9zaXQgaGFzIG9wdGlvbmFsIHVwcGVyIGFuZCBsb3dlciBib3VuZHMgd2l0aCBgQ3VyYXRvckRlcG9zaXRNYXhgIGFuZFQgYEN1cmF0b3JEZXBvc2l0TWluYC5EQ3VyYXRvckRlcG9zaXRNYXgBAkQBACBKqdEBAAAAAAAAAAAAAARJASBNYXhpbXVtIGFtb3VudCBvZiBmdW5kcyB0aGF0IHNob3VsZCBiZSBwbGFjZWQgaW4gYSBkZXBvc2l0IGZvciBtYWtpbmcgYSBwcm9wb3NhbC5EQ3VyYXRvckRlcG9zaXRNaW4BAkQBAOh2SBcAAAAAAAAAAAAAAARJASBNaW5pbXVtIGFtb3VudCBvZiBmdW5kcyB0aGF0IHNob3VsZCBiZSBwbGFjZWQgaW4gYSBkZXBvc2l0IGZvciBtYWtpbmcgYSBwcm9wb3NhbC5IQm91bnR5VmFsdWVNaW5pbXVtGEAA6HZIFwAAAAAAAAAAAAAABHAgTWluaW11bSB2YWx1ZSBmb3IgYSBib3VudHkuSERhdGFEZXBvc2l0UGVyQnl0ZRhAAOH1BQAAAAAAAAAAAAAAAARhASBUaGUgYW1vdW50IGhlbGQgb24gZGVwb3NpdCBwZXIgYnl0ZSB3aXRoaW4gdGhlIHRpcCByZXBvcnQgcmVhc29uIG9yIGJvdW50eSBkZXNjcmlwdGlvbi5MTWF4aW11bVJlYXNvbkxlbmd0aBAQAEAAAAyIIE1heGltdW0gYWNjZXB0YWJsZSByZWFzb24gbGVuZ3RoLgBlASBCZW5jaG1hcmtzIGRlcGVuZCBvbiB0aGlzIHZhbHVlLCBiZSBzdXJlIHRvIHVwZGF0ZSB3ZWlnaHRzIGZpbGUgd2hlbiBjaGFuZ2luZyB0aGlzIHZhbHVlAWEKIgA0Q2hpbGRCb3VudGllcwE0Q2hpbGRCb3VudGllcxRAQ2hpbGRCb3VudHlDb3VudAEAEBAAAAAABIAgTnVtYmVyIG9mIHRvdGFsIGNoaWxkIGJvdW50aWVzLkxQYXJlbnRDaGlsZEJvdW50aWVzAQEEBRAQEAAAAAAIsCBOdW1iZXIgb2YgY2hpbGQgYm91bnRpZXMgcGVyIHBhcmVudCBib3VudHku4CBNYXAgb2YgcGFyZW50IGJvdW50eSBpbmRleCB0byBudW1iZXIgb2YgY2hpbGQgYm91bnRpZXMuNENoaWxkQm91bnRpZXMAAQgFBYBlCgQABJQgQ2hpbGQgYm91bnRpZXMgdGhhdCBoYXZlIGJlZW4gYWRkZWQuXENoaWxkQm91bnR5RGVzY3JpcHRpb25zAAEEBRBdCgQABJggVGhlIGRlc2NyaXB0aW9uIG9mIGVhY2ggY2hpbGQtYm91bnR5LkxDaGlsZHJlbkN1cmF0b3JGZWVzAQEEBRAYQAAAAAAAAAAAAAAAAAAAAAAEAQEgVGhlIGN1bXVsYXRpdmUgY2hpbGQtYm91bnR5IGN1cmF0b3IgZmVlIGZvciBlYWNoIHBhcmVudCBib3VudHkuAR0DAUkHCGRNYXhBY3RpdmVDaGlsZEJvdW50eUNvdW50EBBkAAAABB0BIE1heGltdW0gbnVtYmVyIG9mIGNoaWxkIGJvdW50aWVzIHRoYXQgY2FuIGJlIGFkZGVkIHRvIGEgcGFyZW50IGJvdW50eS5cQ2hpbGRCb3VudHlWYWx1ZU1pbmltdW0YQADkC1QCAAAAAAAAAAAAAAAEiCBNaW5pbXVtIHZhbHVlIGZvciBhIGNoaWxkLWJvdW50eS4BbQomAGhFbGVjdGlvblByb3ZpZGVyTXVsdGlQaGFzZQFoRWxlY3Rpb25Qcm92aWRlck11bHRpUGhhc2UoFFJvdW5kAQAQEAEAAAAYrCBJbnRlcm5hbCBjb3VudGVyIGZvciB0aGUgbnVtYmVyIG9mIHJvdW5kcy4AVQEgVGhpcyBpcyB1c2VmdWwgZm9yIGRlLWR1cGxpY2F0aW9uIG9mIHRyYW5zYWN0aW9ucyBzdWJtaXR0ZWQgdG8gdGhlIHBvb2wsIGFuZCBnZW5lcmFsbCBkaWFnbm9zdGljcyBvZiB0aGUgcGFsbGV0LgBNASBUaGlzIGlzIG1lcmVseSBpbmNyZW1lbnRlZCBvbmNlIHBlciBldmVyeSB0aW1lIHRoYXQgYW4gdXBzdHJlYW0gYGVsZWN0YCBpcyBjYWxsZWQuMEN1cnJlbnRQaGFzZQEAVQcEAAQ8IEN1cnJlbnQgcGhhc2UuOFF1ZXVlZFNvbHV0aW9uAABxCgQADD0BIEN1cnJlbnQgYmVzdCBzb2x1dGlvbiwgc2lnbmVkIG9yIHVuc2lnbmVkLCBxdWV1ZWQgdG8gYmUgcmV0dXJuZWQgdXBvbiBgZWxlY3RgLgBgIEFsd2F5cyBzb3J0ZWQgYnkgc2NvcmUuIFNuYXBzaG90AAB5CgQAEHAgU25hcHNob3QgZGF0YSBvZiB0aGUgcm91bmQuAF0BIFRoaXMgaXMgY3JlYXRlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzaWduZWQgcGhhc2UgYW5kIGNsZWFyZWQgdXBvbiBjYWxsaW5nIGBlbGVjdGAuKQEgTm90ZTogVGhpcyBzdG9yYWdlIHR5cGUgbXVzdCBvbmx5IGJlIG11dGF0ZWQgdGhyb3VnaCBbYFNuYXBzaG90V3JhcHBlcmBdLjhEZXNpcmVkVGFyZ2V0cwAAEAQAEMwgRGVzaXJlZCBudW1iZXIgb2YgdGFyZ2V0cyB0byBlbGVjdCBmb3IgdGhpcyByb3VuZC4AqCBPbmx5IGV4aXN0cyB3aGVuIFtgU25hcHNob3RgXSBpcyBwcmVzZW50LikBIE5vdGU6IFRoaXMgc3RvcmFnZSB0eXBlIG11c3Qgb25seSBiZSBtdXRhdGVkIHRocm91Z2ggW2BTbmFwc2hvdFdyYXBwZXJgXS5AU25hcHNob3RNZXRhZGF0YQAA+QMEABCYIFRoZSBtZXRhZGF0YSBvZiB0aGUgW2BSb3VuZFNuYXBzaG90YF0AqCBPbmx5IGV4aXN0cyB3aGVuIFtgU25hcHNob3RgXSBpcyBwcmVzZW50LikBIE5vdGU6IFRoaXMgc3RvcmFnZSB0eXBlIG11c3Qgb25seSBiZSBtdXRhdGVkIHRocm91Z2ggW2BTbmFwc2hvdFdyYXBwZXJgXS5kU2lnbmVkU3VibWlzc2lvbk5leHRJbmRleAEAEBAAAAAAJAEBIFRoZSBuZXh0IGluZGV4IHRvIGJlIGFzc2lnbmVkIHRvIGFuIGluY29taW5nIHNpZ25lZCBzdWJtaXNzaW9uLgB1ASBFdmVyeSBhY2NlcHRlZCBzdWJtaXNzaW9uIGlzIGFzc2lnbmVkIGEgdW5pcXVlIGluZGV4OyB0aGF0IGluZGV4IGlzIGJvdW5kIHRvIHRoYXQgcGFydGljdWxhcmUBIHN1Ym1pc3Npb24gZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgZWxlY3Rpb24uIE9uIGVsZWN0aW9uIGZpbmFsaXphdGlvbiwgdGhlIG5leHQgaW5kZXggaXMwIHJlc2V0IHRvIDAuAGkBIFdlIGNhbid0IGp1c3QgdXNlIGBTaWduZWRTdWJtaXNzaW9uSW5kaWNlcy5sZW4oKWAsIGJlY2F1c2UgdGhhdCdzIGEgYm91bmRlZCBzZXQ7IHBhc3QgaXRzWQEgY2FwYWNpdHksIGl0IHdpbGwgc2ltcGx5IHNhdHVyYXRlLiBXZSBjYW4ndCBqdXN0IGl0ZXJhdGUgb3ZlciBgU2lnbmVkU3VibWlzc2lvbnNNYXBgLPQgYmVjYXVzZSBpdGVyYXRpb24gaXMgc2xvdy4gSW5zdGVhZCwgd2Ugc3RvcmUgdGhlIHZhbHVlIGhlcmUuXFNpZ25lZFN1Ym1pc3Npb25JbmRpY2VzAQCFCgQAGG0BIEEgc29ydGVkLCBib3VuZGVkIHZlY3RvciBvZiBgKHNjb3JlLCBibG9ja19udW1iZXIsIGluZGV4KWAsIHdoZXJlIGVhY2ggYGluZGV4YCBwb2ludHMgdG8gYXggdmFsdWUgaW4gYFNpZ25lZFN1Ym1pc3Npb25zYC4AcQEgV2UgbmV2ZXIgbmVlZCB0byBwcm9jZXNzIG1vcmUgdGhhbiBhIHNpbmdsZSBzaWduZWQgc3VibWlzc2lvbiBhdCBhIHRpbWUuIFNpZ25lZCBzdWJtaXNzaW9uc3UBIGNhbiBiZSBxdWl0ZSBsYXJnZSwgc28gd2UncmUgd2lsbGluZyB0byBwYXkgdGhlIGNvc3Qgb2YgbXVsdGlwbGUgZGF0YWJhc2UgYWNjZXNzZXMgdG8gYWNjZXNzIQEgdGhlbSBvbmUgYXQgYSB0aW1lIGluc3RlYWQgb2YgcmVhZGluZyBhbmQgZGVjb2RpbmcgYWxsIG9mIHRoZW0gYXQgb25jZS5QU2lnbmVkU3VibWlzc2lvbnNNYXAAAQQFEJEKBAAcdCBVbmNoZWNrZWQsIHNpZ25lZCBzb2x1dGlvbnMuAGkBIFRvZ2V0aGVyIHdpdGggYFN1Ym1pc3Npb25JbmRpY2VzYCwgdGhpcyBzdG9yZXMgYSBib3VuZGVkIHNldCBvZiBgU2lnbmVkU3VibWlzc2lvbnNgIHdoaWxl7CBhbGxvd2luZyB1cyB0byBrZWVwIG9ubHkgYSBzaW5nbGUgb25lIGluIG1lbW9yeSBhdCBhIHRpbWUuAGkBIFR3b3ggbm90ZTogdGhlIGtleSBvZiB0aGUgbWFwIGlzIGFuIGF1dG8taW5jcmVtZW50aW5nIGluZGV4IHdoaWNoIHVzZXJzIGNhbm5vdCBpbnNwZWN0IG9y9CBhZmZlY3Q7IHdlIHNob3VsZG4ndCBuZWVkIGEgY3J5cHRvZ3JhcGhpY2FsbHkgc2VjdXJlIGhhc2hlci5UTWluaW11bVVudHJ1c3RlZFNjb3JlAAD1AwQAEF0BIFRoZSBtaW5pbXVtIHNjb3JlIHRoYXQgZWFjaCAndW50cnVzdGVkJyBzb2x1dGlvbiBtdXN0IGF0dGFpbiBpbiBvcmRlciB0byBiZSBjb25zaWRlcmVkKCBmZWFzaWJsZS4AuCBDYW4gYmUgc2V0IHZpYSBgc2V0X21pbmltdW1fdW50cnVzdGVkX3Njb3JlYC4BIQMBTQc4VEJldHRlclNpZ25lZFRocmVzaG9sZKwQAAAAAAhNASBUaGUgbWluaW11bSBhbW91bnQgb2YgaW1wcm92ZW1lbnQgdG8gdGhlIHNvbHV0aW9uIHNjb3JlIHRoYXQgZGVmaW5lcyBhIHNvbHV0aW9uIGFzeCAiYmV0dGVyIiBpbiB0aGUgU2lnbmVkIHBoYXNlLjhPZmZjaGFpblJlcGVhdBAQEgAAABC0IFRoZSByZXBlYXQgdGhyZXNob2xkIG9mIHRoZSBvZmZjaGFpbiB3b3JrZXIuAGEBIEZvciBleGFtcGxlLCBpZiBpdCBpcyA1LCB0aGF0IG1lYW5zIHRoYXQgYXQgbGVhc3QgNSBibG9ja3Mgd2lsbCBlbGFwc2UgYmV0d2VlbiBhdHRlbXB0c4QgdG8gc3VibWl0IHRoZSB3b3JrZXIncyBzb2x1dGlvbi48TWluZXJUeFByaW9yaXR5MCBlZmZmZmZm5gQlASBUaGUgcHJpb3JpdHkgb2YgdGhlIHVuc2lnbmVkIHRyYW5zYWN0aW9uIHN1Ym1pdHRlZCBpbiB0aGUgdW5zaWduZWQtcGhhc2VQU2lnbmVkTWF4U3VibWlzc2lvbnMQEBAAAAAc5CBNYXhpbXVtIG51bWJlciBvZiBzaWduZWQgc3VibWlzc2lvbnMgdGhhdCBjYW4gYmUgcXVldWVkLgBVASBJdCBpcyBiZXN0IHRvIGF2b2lkIGFkanVzdGluZyB0aGlzIGR1cmluZyBhbiBlbGVjdGlvbiwgYXMgaXQgaW1wYWN0cyBkb3duc3RyZWFtIGRhdGFlASBzdHJ1Y3R1cmVzLiBJbiBwYXJ0aWN1bGFyLCBgU2lnbmVkU3VibWlzc2lvbkluZGljZXM8VD5gIGlzIGJvdW5kZWQgb24gdGhpcyB2YWx1ZS4gSWYgeW919CB1cGRhdGUgdGhpcyB2YWx1ZSBkdXJpbmcgYW4gZWxlY3Rpb24sIHlvdSBfbXVzdF8gZW5zdXJlIHRoYXRNASBgU2lnbmVkU3VibWlzc2lvbkluZGljZXMubGVuKClgIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgbmV3IHZhbHVlLiBPdGhlcndpc2Us8CBhdHRlbXB0cyB0byBzdWJtaXQgbmV3IHNvbHV0aW9ucyBtYXkgY2F1c2UgYSBydW50aW1lIHBhbmljLjxTaWduZWRNYXhXZWlnaHQoQAsIx3JYVQETo3A9CtejcL0UlCBNYXhpbXVtIHdlaWdodCBvZiBhIHNpZ25lZCBzb2x1dGlvbi4AXQEgSWYgW2BDb25maWc6Ok1pbmVyQ29uZmlnYF0gaXMgYmVpbmcgaW1wbGVtZW50ZWQgdG8gc3VibWl0IHNpZ25lZCBzb2x1dGlvbnMgKG91dHNpZGUgb2Y9ASB0aGlzIHBhbGxldCksIHRoZW4gW2BNaW5lckNvbmZpZzo6c29sdXRpb25fd2VpZ2h0YF0gaXMgdXNlZCB0byBjb21wYXJlIGFnYWluc3QwIHRoaXMgdmFsdWUuQFNpZ25lZE1heFJlZnVuZHMQEAQAAAAEGQEgVGhlIG1heGltdW0gYW1vdW50IG9mIHVuY2hlY2tlZCBzb2x1dGlvbnMgdG8gcmVmdW5kIHRoZSBjYWxsIGZlZSBmb3IuQFNpZ25lZFJld2FyZEJhc2UYQADkC1QCAAAAAAAAAAAAAAAEiCBCYXNlIHJld2FyZCBmb3IgYSBzaWduZWQgc29sdXRpb25EU2lnbmVkRGVwb3NpdEJ5dGUYQHh9AQAAAAAAAAAAAAAAAAAEoCBQZXItYnl0ZSBkZXBvc2l0IGZvciBhIHNpZ25lZCBzb2x1dGlvbi5MU2lnbmVkRGVwb3NpdFdlaWdodBhAAAAAAAAAAAAAAAAAAAAAAASoIFBlci13ZWlnaHQgZGVwb3NpdCBmb3IgYSBzaWduZWQgc29sdXRpb24uKE1heFdpbm5lcnMQELAEAAAQNQEgVGhlIG1heGltdW0gbnVtYmVyIG9mIHdpbm5lcnMgdGhhdCBjYW4gYmUgZWxlY3RlZCBieSB0aGlzIGBFbGVjdGlvblByb3ZpZGVyYEAgaW1wbGVtZW50YXRpb24uAFEBIE5vdGU6IFRoaXMgbXVzdCBhbHdheXMgYmUgZ3JlYXRlciBvciBlcXVhbCB0byBgVDo6RGF0YVByb3ZpZGVyOjpkZXNpcmVkX3RhcmdldHMoKWAuOE1pbmVyTWF4TGVuZ3RoEBAAADYAADhNaW5lck1heFdl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AEEBIFRoZXJlIGlzIGFuIGltcGxpZWQgdXBwZXIgbGltaXQgb2YgYFNjb3JlOjpNQVhgOyB0aGF0IHZhbHVlIGRvZXMgbm90IG5lZWQgdG8gYmUhASBzcGVjaWZpZWQgd2l0aGluIHRoZSBiYWcuIEZvciBhbnkgdHdvIHRocmVzaG9sZCBsaXN0cywgaWYgb25lIGVuZHMgd2l0aDEBIGBTY29yZTo6TUFYYCwgdGhlIG90aGVyIG9uZSBkb2VzIG5vdCwgYW5kIHRoZXkgYXJlIG90aGVyd2lzZSBlcXVhbCwgdGhlIHR3b3wgbGlzdHMgd2lsbCBiZWhhdmUgaWRlbnRpY2FsbHkuADggIyBDYWxjdWxhdGlvbgBVASBJdCBpcyByZWNvbW1lbmRlZCB0byBnZW5lcmF0ZSB0aGUgc2V0IG9mIHRocmVzaG9sZHMgaW4gYSBnZW9tZXRyaWMgc2VyaWVzLCBzdWNoIHRoYXRBASB0aGVyZSBleGlzdHMgc29tZSBjb25zdGFudCByYXRpbyBzdWNoIHRoYXQgYHRocmVzaG9sZFtrICsgMV0gPT0gKHRocmVzaG9sZFtrXSAq0CBjb25zdGFudF9yYXRpbykubWF4KHRocmVzaG9sZFtrXSArIDEpYCBmb3IgYWxsIGBrYC4AWQEgVGhlIGhlbHBlcnMgaW4gdGhlIGAvdXRpbHMvZnJhbWUvZ2VuZXJhdGUtYmFnc2AgbW9kdWxlIGNhbiBzaW1wbGlmeSB0aGlzIGNhbGN1bGF0aW9uLgAsICMgRXhhbXBsZXMAUQEgLSBJZiBgQmFnVGhyZXNob2xkczo6Z2V0KCkuaXNfZW1wdHkoKWAsIHRoZW4gYWxsIGlkcyBhcmUgcHV0IGludG8gdGhlIHNhbWUgYmFnLCBhbmSwICAgaXRlcmF0aW9uIGlzIHN0cmljdGx5IGluIGluc2VydGlvbiBvcmRlci5hASAtIElmIGBCYWdUaHJlc2hvbGRzOjpnZXQoKS5sZW4oKSA9PSA2NGAsIGFuZCB0aGUgdGhyZXNob2xkcyBhcmUgZGV0ZXJtaW5lZCBhY2NvcmRpbmcgdG8RASAgIHRoZSBwcm9jZWR1cmUgZ2l2ZW4gYWJvdmUsIHRoZW4gdGhlIGNvbnN0YW50IHJhdGlvIGlzIGVxdWFsIHRvIDIuZQEgLSBJZiBgQmFnVGhyZXNob2xkczo6Z2V0KCkubGVuKCkgPT0gMjAwYCwgYW5kIHRoZSB0aHJlc2hvbGRzIGFyZSBkZXRlcm1pbmVkIGFjY29yZGluZyB0b1kBICAgdGhlIHByb2NlZHVyZSBnaXZlbiBhYm92ZSwgdGhlbiB0aGUgY29uc3RhbnQgcmF0aW8gaXMgYXBwcm94aW1hdGVseSBlcXVhbCB0byAxLjI0OC5hASAtIElmIHRoZSB0aHJlc2hvbGQgbGlzdCBiZWdpbnMgYFsxLCAyLCAzLCAuLi5dYCwgdGhlbiBhbiBpZCB3aXRoIHNjb3JlIDAgb3IgMSB3aWxsIGZhbGzwICAgaW50byBiYWcgMCwgYW4gaWQgd2l0aCBzY29yZSAyIHdpbGwgZmFsbCBpbnRvIGJhZyAxLCBldGMuADAgIyBNaWdyYXRpb24AYQEgSW4gdGhlIGV2ZW50IHRoYXQgdGhpcyBsaXN0IGV2ZXIgY2hhbmdlcywgYSBjb3B5IG9mIHRoZSBvbGQgYmFncyBsaXN0IG11c3QgYmUgcmV0YWluZWQuXQEgV2l0aCB0aGF0IGBMaXN0OjptaWdyYXRlYCBjYW4gYmUgY2FsbGVkLCB3aGljaCB3aWxsIHBlcmZvcm0gdGhlIGFwcHJvcHJpYXRlIG1pZ3JhdGlvbi4BpQolADxOb21pbmF0aW9uUG9vbHMBPE5vbWluYXRpb25Qb29sc1RAVG90YWxWYWx1ZUxvY2tlZAEAGEAAAAAAAAAAAAAAAAAAAAAAFIwgVGhlIHN1bSBvZiBmdW5kcyBhY3Jvc3MgYWxsIHBvb2xzLgBxASBUaGlzIG1pZ2h0IGJlIGxvd2VyIGJ1dCBuZXZlciBoaWdoZXIgdGhhbiB0aGUgc3VtIG9mIGB0b3RhbF9iYWxhbmNlYCBvZiBhbGwgW2BQb29sTWVtYmVyc2BdWQEgYmVjYXVzZSBjYWxsaW5nIGBwb29sX3dpdGhkcmF3X3VuYm9uZGVkYCBtaWdodCBkZWNyZWFzZSB0aGUgdG90YWwgc3Rha2Ugb2YgdGhlIHBvb2wncykBIGBib25kZWRfYWNjb3VudGAgd2l0aG91dCBhZGp1c3RpbmcgdGhlIHBhbGxldC1pbnRlcm5hbCBgVW5ib25kaW5nUG9vbGAncy4sTWluSm9pbkJvbmQBABhAAAAAAAAAAAAAAAAAAAAAAAScIE1pbmltdW0gYW1vdW50IHRvIGJvbmQgdG8gam9pbiBhIHBvb2wuNE1pbkNyZWF0ZUJvbmQBABhAAAAAAAAAAAAAAAAAAAAAABygIE1pbmltdW0gYm9uZCByZXF1aXJlZCB0byBjcmVhdGUgYSBwb29sLgBlASBUaGlzIGlzIHRoZSBhbW91bnQgdGhhdCB0aGUgZGVwb3NpdG9yIG11c3QgcHV0IGFzIHRoZWlyIGluaXRpYWwgc3Rha2UgaW4gdGhlIHBvb2wsIGFzIGFuiCBpbmRpY2F0aW9uIG9mICJza2luIGluIHRoZSBnYW1lIi4AaQEgVGhpcyBpcyB0aGUgdmFsdWUgdGhhdCB3aWxsIGFsd2F5cyBleGlzdCBpbiB0aGUgc3Rha2luZyBsZWRnZXIgb2YgdGhlIHBvb2wgYm9uZGVkIGFjY291bnSAIHdoaWxlIGFsbCBvdGhlciBhY2NvdW50cyBsZWF2ZS4gTWF4UG9vbHMAABAEAAhpASBNYXhpbXVtIG51bWJlciBvZiBub21pbmF0aW9uIHBvb2xzIHRoYXQgY2FuIGV4aXN0LiBJZiBgTm9uZWAsIHRoZW4gYW4gdW5ib3VuZGVkIG51bWJlciBvZkQgcG9vbHMgY2FuIGV4aXN0LjhNYXhQb29sTWVtYmVycwAAEAQACEkBIE1heGltdW0gbnVtYmVyIG9mIG1lbWJlcnMgdGhhdCBjYW4gZXhpc3QgaW4gdGhlIHN5c3RlbS4gSWYgYE5vbmVgLCB0aGVuIHRoZSBjb3VudLggbWVtYmVycyBhcmUgbm90IGJvdW5kIG9uIGEgc3lzdGVtIHdpZGUgYmFzaXMuVE1heFBvb2xNZW1iZXJzUGVyUG9vbAAAEAQACEEBIE1heGltdW0gbnVtYmVyIG9mIG1lbWJlcnMgdGhhdCBtYXkgYmVsb25nIHRvIHBvb2wuIElmIGBOb25lYCwgdGhlbiB0aGUgY291bnQgb2aoIG1lbWJlcnMgaXMgbm90IGJvdW5kIG9uIGEgcGVyIHBvb2wgYmFzaXMuTEdsb2JhbE1heENvbW1pc3Npb24AAKwEAAxpASBUaGUgbWF4aW11bSBjb21taXNzaW9uIHRoYXQgY2FuIGJlIGNoYXJnZWQgYnkgYSBwb29sLiBVc2VkIG9uIGNvbW1pc3Npb24gcGF5b3V0cyB0byBib3VuZCUBIHBvb2wgY29tbWlzc2lvbnMgdGhhdCBhcmUgPiBgR2xvYmFsTWF4Q29tbWlzc2lvbmAsIG5lY2Vzc2FyeSBpZiBhIGZ1dHVyZQ0BIGBHbG9iYWxNYXhDb21taXNzaW9uYCBpcyBsb3dlciB0aGFuIHNvbWUgY3VycmVudCBwb29sIGNvbW1pc3Npb25zLixQb29sTWVtYmVycwABBAUArQoEAAxAIEFjdGl2ZSBtZW1iZXJzLgDQIFRXT1gtTk9URTogU0FGRSBzaW5jZSBgQWNjb3VudElkYCBpcyBhIHNlY3VyZSBoYXNoLlRDb3VudGVyRm9yUG9vbE1lbWJlcnMBABAQAAAAAASsQ291bnRlciBmb3IgdGhlIHJlbGF0ZWQgY291bnRlZCBzdG9yYWdlIG1hcCxCb25kZWRQb29scwABBAUQuQoEAARoIFN0b3JhZ2UgZm9yIGJvbmRlZCBwb29scy5UQ291bnRlckZvckJvbmRlZFBvb2xzAQAQEAAAAAAErENvdW50ZXIgZm9yIHRoZSByZWxhdGVkIGNvdW50ZWQgc3RvcmFnZSBtYXAsUmV3YXJkUG9vbHMAAQQFEM0KBAAIdQEgUmV3YXJkIHBvb2xzLiBUaGlzIGlzIHdoZXJlIHRoZXJlIHJld2FyZHMgZm9yIGVhY2ggcG9vbCBhY2N1bXVsYXRlLiBXaGVuIGEgbWVtYmVycyBwYXlvdXQgaXNZASBjbGFpbWVkLCB0aGUgYmFsYW5jZSBjb21lcyBvdXQgb2YgdGhlIHJld2FyZCBwb29sLiBLZXllZCBieSB0aGUgYm9uZGVkIHBvb2xzIGFjY291bnQuVENvdW50ZXJGb3JSZXdhcmRQb29scwEAEBAAAAAABKxDb3VudGVyIGZvciB0aGUgcmVsYXRlZCBjb3VudGVkIHN0b3JhZ2UgbWFwPFN1YlBvb2xzU3RvcmFnZQABBAUQ0QoEAAgZASBHcm91cHMgb2YgdW5ib25kaW5nIHBvb2xzLiBFYWNoIGdyb3VwIG9mIHVuYm9uZGluZyBwb29scyBiZWxvbmdzIHRvIGEpASBib25kZWQgcG9vbCwgaGVuY2UgdGhlIG5hbWUgc3ViLXBvb2xzLiBLZXllZCBieSB0aGUgYm9uZGVkIHBvb2xzIGFjY291bnQuZENvdW50ZXJGb3JTdWJQb29sc1N0b3JhZ2UBABAQAAAAAASsQ291bnRlciBmb3IgdGhlIHJlbGF0ZWQgY291bnRlZCBzdG9yYWdlIG1hcCBNZXRhZGF0YQEBBAUQ6QoEAARcIE1ldGFkYXRhIGZvciB0aGUgcG9vbC5IQ291bnRlckZvck1ldGFkYXRhAQAQEAAAAAAErENvdW50ZXIgZm9yIHRoZSByZWxhdGVkIGNvdW50ZWQgc3RvcmFnZSBtYXAoTGFzdFBvb2xJZAEAEBAAAAAABNAgRXZlciBpbmNyZWFzaW5nIG51bWJlciBvZiBhbGwgcG9vbHMgY3JlYXRlZCBzbyBmYXIuTFJldmVyc2VQb29sSWRMb29rdXAAAQQFABAEABDcIEEgcmV2ZXJzZSBsb29rdXAgZnJvbSB0aGUgcG9vbCdzIGFjY291bnQgaWQgdG8gaXRzIGlkLgB1ASBUaGlzIGlzIG9ubHkgdXNlZCBmb3Igc2xhc2hpbmcgYW5kIG9uIGF1dG9tYXRpYyB3aXRoZHJhdyB1cGRhdGUuIEluIGFsbCBvdGhlciBpbnN0YW5jZXMsIHRoZSUBIHBvb2wgaWQgaXMgdXNlZCwgYW5kIHRoZSBhY2NvdW50cyBhcmUgZGV0ZXJtaW5pc3RpY2FsbHkgZGVyaXZlZCBmcm9tIGl0LnRDb3VudGVyRm9yUmV2ZXJzZVBvb2xJZExvb2t1cAEAEBAAAAAABKxDb3VudGVyIGZvciB0aGUgcmVsYXRlZCBjb3VudGVkIHN0b3JhZ2UgbWFwQENsYWltUGVybWlzc2lvbnMBAQQFADUEBAIEAQEgTWFwIGZyb20gYSBwb29sIG1lbWJlciBhY2NvdW50IHRvIHRoZWlyIG9wdGVkIGNsYWltIHBlcm1pc3Npb24uARkEAWEHDCBQYWxsZXRJZIEJIHB5L25vcGxzBIQgVGhlIG5vbWluYXRpb24gcG9vbCdzIHBhbGxldCBpZC5ITWF4UG9pbnRzVG9CYWxhbmNlCAQKMB0BIFRoZSBtYXhpbXVtIHBvb2wgcG9pbnRzLXRvLWJhbGFuY2UgcmF0aW8gdGhhdCBhbiBgb3BlbmAgcG9vbCBjYW4gaGF2ZS4AVQEgVGhpcyBpcyBpbXBvcnRhbnQgaW4gdGhlIGV2ZW50IHNsYXNoaW5nIHRha2VzIHBsYWNlIGFuZCB0aGUgcG9vbCdzIHBvaW50cy10by1iYWxhbmNlfCByYXRpbyBiZWNvbWVzIGRpc3Byb3BvcnRpb25hbC4AZQEgTW9yZW92ZXIsIHRoaXMgcmVsYXRlcyB0byB0aGUgYFJld2FyZENvdW50ZXJgIHR5cGUgYXMgd2VsbCwgYXMgdGhlIGFyaXRobWV0aWMgb3BlcmF0aW9uc1UBIGFyZSBhIGZ1bmN0aW9uIG9mIG51bWJlciBvZiBwb2ludHMsIGFuZCBieSBzZXR0aW5nIHRoaXMgdmFsdWUgdG8gZS5nLiAxMCwgeW91IGVuc3VyZWUBIHRoYXQgdGhlIHRvdGFsIG51bWJlciBvZiBwb2ludHMgaW4gdGhlIHN5c3RlbSBhcmUgYXQgbW9zdCAxMCB0aW1lcyB0aGUgdG90YWxfaXNzdWFuY2Ugb2acIHRoZSBjaGFpbiwgaW4gdGhlIGFic29sdXRlIHdvcnNlIGNhc2UuAEkBIEZvciBhIHZhbHVlIG9mIDEwLCB0aGUgdGhyZXNob2xkIHdvdWxkIGJlIGEgcG9vbCBwb2ludHMtdG8tYmFsYW5jZSByYXRpbyBvZiAxMDoxLjEBIFN1Y2ggYSBzY2VuYXJpbyB3b3VsZCBhbHNvIGJlIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBwb29sIGJlaW5nIDkwJSBzbGFzaGVkLjBNYXhVbmJvbmRpbmcQECAAAAAEPQEgVGhlIG1heGltdW0gbnVtYmVyIG9mIHNpbXVsdGFuZW91cyB1bmJvbmRpbmcgY2h1bmtzIHRoYXQgY2FuIGV4aXN0IHBlciBtZW1iZXIuAe0KJwAsRmFzdFVuc3Rha2UBLEZhc3RVbnN0YWtlEBBIZWFkAAD1CgQADMAgVGhlIGN1cnJlbnQgImhlYWQgb2YgdGhlIHF1ZXVlIiBiZWluZyB1bnN0YWtlZC4AKQEgVGhlIGhlYWQgaW4gaXRzZWxmIGNhbiBiZSBhIGJhdGNoIG9mIHVwIHRvIFtgQ29uZmlnOjpCYXRjaFNpemVgXSBzdGFrZXJzLhRRdWV1ZQABBAUAGAQADMAgVGhlIG1hcCBvZiBhbGwgYWNjb3VudHMgd2lzaGluZyB0byBiZSB1bnN0YWtlZC4AOQEgS2VlcHMgdHJhY2sgb2YgYEFjY291bnRJZGAgd2lzaGluZyB0byB1bnN0YWtlIGFuZCBpdCdzIGNvcnJlc3BvbmRpbmcgZGVwb3NpdC48Q291bnRlckZvclF1ZXVlAQAQEAAAAAAErENvdW50ZXIgZm9yIHRoZSByZWxhdGVkIGNvdW50ZWQgc3RvcmFnZSBtYXBMRXJhc1RvQ2hlY2tQZXJCbG9jawEAEBAAAAAAIIwgTnVtYmVyIG9mIGVyYXMgdG8gY2hlY2sgcGVyIGJsb2NrLgA1ASBJZiBzZXQgdG8gMCwgdGhpcyBwYWxsZXQgZG9lcyBhYnNvbHV0ZWx5IG5vdGhpbmcuIENhbm5vdCBiZSBzZXQgdG8gbW9yZSB0aGFukCBbYENvbmZpZzo6TWF4RXJhc1RvQ2hlY2tQZXJCbG9ja2BdLgBlASBCYXNlZCBvbiB0aGUgYW1vdW50IG9mIHdlaWdodCBhdmFpbGFibGUgYXQgW2BQYWxsZXQ6Om9uX2lkbGVgXSwgdXAgdG8gdGhpcyBtYW55IGVyYXMgYXJlXQEgY2hlY2tlZC4gVGhlIGNoZWNraW5nIGlzIHJlcHJlc2VudGVkIGJ5IHVwZGF0aW5nIFtgVW5zdGFrZVJlcXVlc3Q6OmNoZWNrZWRgXSwgd2hpY2ggaXNQIHN0b3JlZCBpbiBbYEhlYWRgXS4BTQQBZQcEHERlcG9zaXQYQADkC1QCAAAAAAAAAAAAAAAIZQEgRGVwb3NpdCB0byB0YWtlIGZvciB1bnN0YWtpbmcsIHRvIG1ha2Ugc3VyZSB3ZSdyZSBhYmxlIHRvIHNsYXNoIHRoZSBpdCBpbiBvcmRlciB0byBjb3ZlcsAgdGhlIGNvc3RzIG9mIHJlc291cmNlcyBvbiB1bnN1Y2Nlc3NmdWwgdW5zdGFrZS4BAQsoAEBQYXJhY2hhaW5zT3JpZ2luAAAAAAAyEHkBIFRoZXJlIGlzIG5vIHdheSB0byByZWdpc3RlciBhbiBvcmlnaW4gdHlwZSBpbiBgY29uc3RydWN0X3J1bnRpbWVgIHdpdGhvdXQgYSBwYWxsZXQgdGhlIG9yaWdpbjAgYmVsb25ncyB0by4AdQEgVGhpcyBtb2R1bGUgZnVsZmlsbHMgb25seSB0aGUgc2luZ2xlIHB1cnBvc2Ugb2YgaG91c2luZyB0aGUgYE9yaWdpbmAgaW4gYGNvbnN0cnVjdF9ydW50aW1lYC40Q29uZmlndXJhdGlvbgE0Q29uZmlndXJhdGlvbgwwQWN0aXZlQ29uZmlnAQAFC0EDAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAZAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAgAAAAIAAAACAAAAAAEAAAABAAAAAQAAAAABAAAAAAAAAAAAAAAQJwAAgLLmDoDDyQGAlpgAAAAAAAAAAAAAAAAABQAAAATIIFRoZSBhY3RpdmUgY29uZmlndXJhdGlvbiBmb3IgdGhlIGN1cnJlbnQgc2Vzc2lvbi44UGVuZGluZ0NvbmZpZ3MBAAkLBAAcfCBQZW5kaW5nIGNvbmZpZ3VyYXRpb24gY2hhbmdlcy4AWQEgVGhpcyBpcyBhIGxpc3Qgb2YgY29uZmlndXJhdGlvbiBjaGFuZ2VzLCBlYWNoIHdpdGggYSBzZXNzaW9uIGluZGV4IGF0IHdoaWNoIGl0IHNob3VsZDAgYmUgYXBwbGllZC4AYQEgVGhlIGxpc3QgaXMgc29ydGVkIGFzY2VuZGluZyBieSBzZXNzaW9uIGluZGV4LiBBbHNvLCB0aGlzIGxpc3QgY2FuIG9ubHkgY29udGFpbiBhdCBtb3N0/CAyIGl0ZW1zOiBmb3IgdGhlIG5leHQgc2Vzc2lvbiBhbmQgZm9yIHRoZSBgc2NoZWR1bGVkX3Nlc3Npb25gLlhCeXBhc3NDb25zaXN0ZW5jeUNoZWNrAQAgBAAIYQEgSWYgdGhpcyBpcyBzZXQsIHRoZW4gdGhlIGNvbmZpZ3VyYXRpb24gc2V0dGVycyB3aWxsIGJ5cGFzcyB0aGUgY29uc2lzdGVuY3kgY2hlY2tzLiBUaGlztCBpcyBtZWFudCB0byBiZSB1c2VkIG9ubHkgYXMgdGhlIGxhc3QgcmVzb3J0LgFRBAAAARELMwAsUGFyYXNTaGFyZWQBLFBhcmFzU2hhcmVkEExDdXJyZW50U2Vzc2lvbkluZGV4AQAQEAAAAAAEbCBUaGUgY3VycmVudCBzZXNzaW9uIGluZGV4LlhBY3RpdmVWYWxpZGF0b3JJbmRpY2VzAQAVCwQACAkBIEFsbCB0aGUgdmFsaWRhdG9ycyBhY3RpdmVseSBwYXJ0aWNpcGF0aW5nIGluIHBhcmFjaGFpbiBjb25zZW5zdXMusCBJbmRpY2VzIGFyZSBpbnRvIHRoZSBicm9hZGVyIHZhbGlkYXRvciBzZXQuTEFjdGl2ZVZhbGlkYXRvcktleXMBABkLBAAIVQEgVGhlIHBhcmFjaGFpbiBhdHRlc3RhdGlvbiBrZXlzIG9mIHRoZSB2YWxpZGF0b3JzIGFjdGl2ZWx5IHBhcnRpY2lwYXRpbmcgaW4gcGFyYWNoYWluHQEgY29uc2Vuc3VzLiBUaGlzIHNob3VsZCBiZSB0aGUgc2FtZSBsZW5ndGggYXMgYEFjdGl2ZVZhbGlkYXRvckluZGljZXNgLkxBbGxvd2VkUmVsYXlQYXJlbnRzAQAdCxQAAAAAAARsIEFsbCBhbGxvd2VkIHJlbGF5LXBhcmVudHMuAXUEAAAANAA0UGFyYUluY2x1c2lvbgE0UGFyYUluY2x1c2lvbgQIVjEAAQQFjQIpCwQAFGEBIENhbmRpZGF0ZXMgcGVuZGluZyBhdmFpbGFiaWxpdHkgYnkgYFBhcmFJZGAuIFRoZXkgZm9ybSBhIGNoYWluIHN0YXJ0aW5nIGZyb20gdGhlIGxhdGVzdGwgaW5jbHVkZWQgaGVhZCBvZiB0aGUgcGFyYS5hASBVc2UgYSBkaWZmZXJlbnQgcHJlZml4IHBvc3QtbWlncmF0aW9uIHRvIHYxLCBzaW5jZSB0aGUgdjAgYFBlbmRpbmdBdmFpbGFiaWxpdHlgIHN0b3JhZ2VxASB3b3VsZCBvdGhlcndpc2UgaGF2ZSB0aGUgZXhhY3Qgc2FtZSBwcmVmaXggd2hpY2ggY291bGQgY2F1c2UgdW5kZWZpbmVkIGJlaGF2aW91ciB3aGVuIGRvaW5nPCB0aGUgbWlncmF0aW9uLgF5BAFpBwABMQs1ADBQYXJhSW5oZXJlbnQBMFBhcmFJbmhlcmVudAggSW5jbHVkZWQAAIwEABjsIFdoZXRoZXIgdGhlIHBhcmFzIGluaGVyZW50IHdhcyBpbmNsdWRlZCB3aXRoaW4gdGhpcyBibG9jay4AaQEgVGhlIGBPcHRpb248KCk+YCBpcyBlZmZlY3RpdmVseSBhIGBib29sYCwgYnV0IGl0IG5ldmVyIGhpdHMgc3RvcmFnZSBpbiB0aGUgYE5vbmVgIHZhcmlhbnS8IGR1ZSB0byB0aGUgZ3VhcmFudGVlcyBvZiBGUkFNRSdzIHN0b3JhZ2UgQVBJcy4ASQEgSWYgdGhpcyBpcyBgTm9uZWAgYXQgdGhlIGVuZCBvZiB0aGUgYmxvY2ssIHdlIHBhbmljIGFuZCByZW5kZXIgdGhlIGJsb2NrIGludmFsaWQuME9uQ2hhaW5Wb3RlcwAANQsEAARFASBTY3JhcGVkIG9uIGNoYWluIGRhdGEgZm9yIGV4dHJhY3RpbmcgcmVzb2x2ZWQgZGlzcHV0ZXMgYXMgd2VsbCBhcyBiYWNraW5nIHZvdGVzLgF9BAAAAUkLNgA0UGFyYVNjaGVkdWxlcgE0UGFyYVNjaGVkdWxlchA8VmFsaWRhdG9yR3JvdXBzAQBNCwQAHG0BIEFsbCB0aGUgdmFsaWRhdG9yIGdyb3Vwcy4gT25lIGZvciBlYWNoIGNvcmUuIEluZGljZXMgYXJlIGludG8gYEFjdGl2ZVZhbGlkYXRvcnNgIC0gbm90IHRoZW0BIGJyb2FkZXIgc2V0IG9mIFBvbGthZG90IHZhbGlkYXRvcnMsIGJ1dCBpbnN0ZWFkIGp1c3QgdGhlIHN1YnNldCB1c2VkIGZvciBwYXJhY2hhaW5zIGR1cmluZzggdGhpcyBzZXNzaW9uLgBJASBCb3VuZDogVGhlIG51bWJlciBvZiBjb3JlcyBpcyB0aGUgc3VtIG9mIHRoZSBudW1iZXJzIG9mIHBhcmFjaGFpbnMgYW5kIHBhcmF0aHJlYWRpASBtdWx0aXBsZXhlcnMuIFJlYXNvbmFibHksIDEwMC0xMDAwLiBUaGUgZG9taW5hbnQgZmFjdG9yIGlzIHRoZSBudW1iZXIgb2YgdmFsaWRhdG9yczogc2FmZVAgdXBwZXIgYm91bmQgYXQgMTBrLkRBdmFpbGFiaWxpdHlDb3JlcwEAUQsEABhxASBPbmUgZW50cnkgZm9yIGVhY2ggYXZhaWxhYmlsaXR5IGNvcmUuIFRoZSBpJ3RoIHBhcmFjaGFpbiBiZWxvbmdzIHRvIHRoZSBpJ3RoIGNvcmUsIHdpdGggdGhl8CByZW1haW5pbmcgY29yZXMgYWxsIGJlaW5nIG9uIGRlbWFuZCBwYXJhY2hhaW4gbXVsdGlwbGV4ZXJzLgDYIEJvdW5kZWQgYnkgdGhlIG1heGltdW0gb2YgZWl0aGVyIG9mIHRoZXNlIHR3byB2YWx1ZXM65CAgICogVGhlIG51bWJlciBvZiBwYXJhY2hhaW5zIGFuZCBwYXJhdGhyZWFkIG11bHRpcGxleGVyc0UBICAgKiBUaGUgbnVtYmVyIG9mIHZhbGlkYXRvcnMgZGl2aWRlZCBieSBgY29uZmlndXJhdGlvbi5tYXhfdmFsaWRhdG9yc19wZXJfY29yZWAuRFNlc3Npb25TdGFydEJsb2NrAQAQEAAAAAAcaQEgVGhlIGJsb2NrIG51bWJlciB3aGVyZSB0aGUgc2Vzc2lvbiBzdGFydCBvY2N1cnJlZC4gVXNlZCB0byB0cmFjayBob3cgbWFueSBncm91cCByb3RhdGlvbnM8IGhhdmUgb2NjdXJyZWQuAFUBIE5vdGUgdGhhdCBpbiB0aGUgY29udGV4dCBvZiBwYXJhY2hhaW5zIG1vZHVsZXMgdGhlIHNlc3Npb24gY2hhbmdlIGlzIHNpZ25hbGVkIGR1cmluZ2EBIHRoZSBibG9jayBhbmQgZW5hY3RlZCBhdCB0aGUgZW5kIG9mIHRoZSBibG9jayAoYXQgdGhlIGZpbmFsaXphdGlvbiBzdGFnZSwgdG8gYmUgZXhhY3QpLlkBIFRodXMgZm9yIGFsbCBpbnRlbnRzIGFuZCBwdXJwb3NlcyB0aGUgZWZmZWN0IG9mIHRoZSBzZXNzaW9uIGNoYW5nZSBpcyBvYnNlcnZlZCBhdCB0aGVlASBibG9jayBmb2xsb3dpbmcgdGhlIHNlc3Npb24gY2hhbmdlLCBibG9jayBudW1iZXIgb2Ygd2hpY2ggd2Ugc2F2ZSBpbiB0aGlzIHN0b3JhZ2UgdmFsdWUuKENsYWltUXVldWUBAGELBAAMWQEgT25lIGVudHJ5IGZvciBlYWNoIGF2YWlsYWJpbGl0eSBjb3JlLiBUaGUgYFZlY0RlcXVlYCByZXByZXNlbnRzIHRoZSBhc3NpZ25tZW50cyB0byBiZVEBIHNjaGVkdWxlZCBvbiB0aGF0IGNvcmUuIFRoZSB2YWx1ZSBjb250YWluZWQgaGVyZSB3aWxsIG5vdCBiZSB2YWxpZCBhZnRlciB0aGUgZW5kIG9maQEgYSBibG9jay4gUnVudGltZSBBUElzIHNob3VsZCBiZSB1c2VkIHRvIGRldGVybWluZSBzY2hlZHVsZWQgY29yZXMgZm9yIHRoZSB1cGNvbWluZyBibG9jay4AAAAANwAUUGFyYXMBFFBhcmFzVEBQdmZBY3RpdmVWb3RlTWFwAAEEBbkEcQsEABC0IEFsbCBjdXJyZW50bHkgYWN0aXZlIFBWRiBwcmUtY2hlY2tpbmcgdm90ZXMuACwgSW52YXJpYW50OnUBIC0gVGhlcmUgYXJlIG5vIFBWRiBwcmUtY2hlY2tpbmcgdm90ZXMgdGhhdCBleGlzdHMgaW4gbGlzdCBidXQgbm90IGluIHRoZSBzZXQgYW5kIHZpY2UgdmVyc2EuRFB2ZkFjdGl2ZVZvdGVMaXN0AQCBCwQABDUBIFRoZSBsaXN0IG9mIGFsbCBjdXJyZW50bHkgYWN0aXZlIFBWRiB2b3Rlcy4gQXV4aWxpYXJ5IHRvIGBQdmZBY3RpdmVWb3RlTWFwYC4oUGFyYWNoYWlucwEAhQsEABBpASBBbGwgbGVhc2UgaG9sZGluZyBwYXJhY2hhaW5zLiBPcmRlcmVkIGFzY2VuZGluZyBieSBgUGFyYUlkYC4gT24gZGVtYW5kIHBhcmFjaGFpbnMgYXJlIG5vdCggaW5jbHVkZWQuAOggQ29uc2lkZXIgdXNpbmcgdGhlIFtgUGFyYWNoYWluc0NhY2hlYF0gdHlwZSBvZiBtb2RpZnlpbmcuOFBhcmFMaWZlY3ljbGVzAAEEBY0CiQsEAAS8IFRoZSBjdXJyZW50IGxpZmVjeWNsZSBvZiBhIGFsbCBrbm93biBQYXJhIElEcy4USGVhZHMAAQQFjQLZBAQABKAgVGhlIGhlYWQtZGF0YSBvZiBldmVyeSByZWdpc3RlcmVkIHBhcmEuRE1vc3RSZWNlbnRDb250ZXh0AAEEBY0CEAQABCkBIFRoZSBjb250ZXh0IChyZWxheS1jaGFpbiBibG9jayBudW1iZXIpIG9mIHRoZSBtb3N0IHJlY2VudCBwYXJhY2hhaW4gaGVhZC48Q3VycmVudENvZGVIYXNoAAEEBY0CuQQEAAy0IFRoZSB2YWxpZGF0aW9uIGNvZGUgaGFzaCBvZiBldmVyeSBsaXZlIHBhcmEuAOQgQ29ycmVzcG9uZGluZyBjb2RlIGNhbiBiZSByZXRyaWV2ZWQgd2l0aCBbYENvZGVCeUhhc2hgXS4wUGFzdENvZGVIYXNoAAEEBY0LuQQEABBhASBBY3R1YWwgcGFzdCBjb2RlIGhhc2gsIGluZGljYXRlZCBieSB0aGUgcGFyYSBpZCBhcyB3ZWxsIGFzIHRoZSBibG9jayBudW1iZXIgYXQgd2hpY2ggaXREIGJlY2FtZSBvdXRkYXRlZC4A5CBDb3JyZXNwb25kaW5nIGNvZGUgY2FuIGJlIHJldHJpZXZlZCB3aXRoIFtgQ29kZUJ5SGFzaGBdLjBQYXN0Q29kZU1ldGEBAQQFjQKRCwgAAAxJASBQYXN0IGNvZGUgb2YgcGFyYWNoYWlucy4gVGhlIHBhcmFjaGFpbnMgdGhlbXNlbHZlcyBtYXkgbm90IGJlIHJlZ2lzdGVyZWQgYW55bW9yZSxJASBidXQgd2UgYWxzbyBrZWVwIHRoZWlyIGNvZGUgb24tY2hhaW4gZm9yIHRoZSBzYW1lIGFtb3VudCBvZiB0aW1lIGFzIG91dGRhdGVkIGNvZGWwIHRvIGtlZXAgaXQgYXZhaWxhYmxlIGZvciBhcHByb3ZhbCBjaGVja2Vycy48UGFzdENvZGVQcnVuaW5nAQCdCwQAGGkBIFdoaWNoIHBhcmFzIGhhdmUgcGFzdCBjb2RlIHRoYXQgbmVlZHMgcHJ1bmluZyBhbmQgdGhlIHJlbGF5LWNoYWluIGJsb2NrIGF0IHdoaWNoIHRoZSBjb2RlaQEgd2FzIHJlcGxhY2VkLiBOb3RlIHRoYXQgdGhpcyBpcyB0aGUgYWN0dWFsIGhlaWdodCBvZiB0aGUgaW5jbHVkZWQgYmxvY2ssIG5vdCB0aGUgZXhwZWN0ZWQ9ASBoZWlnaHQgYXQgd2hpY2ggdGhlIGNvZGUgdXBncmFkZSB3b3VsZCBiZSBhcHBsaWVkLCBhbHRob3VnaCB0aGV5IG1heSBiZSBlcXVhbC5tASBUaGlzIGlzIHRvIGVuc3VyZSB0aGUgZW50aXJlIGFjY2VwdGFuY2UgcGVyaW9kIGlzIGNvdmVyZWQsIG5vdCBhbiBvZmZzZXQgYWNjZXB0YW5jZSBwZXJpb2RtASBzdGFydGluZyBmcm9tIHRoZSB0aW1lIGF0IHdoaWNoIHRoZSBwYXJhY2hhaW4gcGVyY2VpdmVzIGEgY29kZSB1cGdyYWRlIGFzIGhhdmluZyBvY2N1cnJlZC5VASBNdWx0aXBsZSBlbnRyaWVzIGZvciBhIHNpbmdsZSBwYXJhIGFyZSBwZXJtaXR0ZWQuIE9yZGVyZWQgYXNjZW5kaW5nIGJ5IGJsb2NrIG51bWJlci5IRnV0dXJlQ29kZVVwZ3JhZGVzAAEEBY0CEAQAED0BIFRoZSBibG9jayBudW1iZXIgYXQgd2hpY2ggdGhlIHBsYW5uZWQgY29kZSBjaGFuZ2UgaXMgZXhwZWN0ZWQgZm9yIGEgcGFyYWNoYWluLgBlASBUaGUgY2hhbmdlIHdpbGwgYmUgYXBwbGllZCBhZnRlciB0aGUgZmlyc3QgcGFyYWJsb2NrIGZvciB0aGlzIElEIGluY2x1ZGVkIHdoaWNoIGV4ZWN1dGVzGQEgaW4gdGhlIGNvbnRleHQgb2YgYSByZWxheSBjaGFpbiBibG9jayB3aXRoIGEgbnVtYmVyID49IGBleHBlY3RlZF9hdGAuUEZ1dHVyZUNvZGVVcGdyYWRlc0F0AQCdCwQAIKwgVGhlIGxpc3Qgb2YgdXBjb21pbmcgZnV0dXJlIGNvZGUgdXBncmFkZXMuAG0BIEVhY2ggaXRlbSBpcyBhIHBhaXIgb2YgdGhlIHBhcmFjaGFpbiBhbmQgdGhlIGV4cGVjdGVkIGJsb2NrIGF0IHdoaWNoIHRoZSB1cGdyYWRlIHNob3VsZCBiZVEBIGFwcGxpZWQuIFRoZSB1cGdyYWRlIHdpbGwgYmUgYXBwbGllZCBhdCB0aGUgZ2l2ZW4gcmVsYXkgY2hhaW4gYmxvY2suIEluIGNvbnRyYXN0IHRvdQEgW2BGdXR1cmVDb2RlVXBncmFkZXNgXSB0aGlzIGNvZGUgdXBncmFkZSB3aWxsIGJlIGFwcGxpZWQgcmVnYXJkbGVzcyB0aGUgcGFyYWNoYWluIG1ha2luZyBhbnlEIHByb2dyZXNzIG9yIG5vdC4AjCBPcmRlcmVkIGFzY2VuZGluZyBieSBibG9jayBudW1iZXIuOEZ1dHVyZUNvZGVIYXNoAAEEBY0CuQQEAAycIFRoZSBhY3R1YWwgZnV0dXJlIGNvZGUgaGFzaCBvZiBhIHBhcmEuAOQgQ29ycmVzcG9uZGluZyBjb2RlIGNhbiBiZSByZXRyaWV2ZWQgd2l0aCBbYENvZGVCeUhhc2hgXS5QVXBncmFkZUdvQWhlYWRTaWduYWwAAQQFjQKhCwQAKHUBIFRoaXMgaXMgdXNlZCBieSB0aGUgcmVsYXktY2hhaW4gdG8gY29tbXVuaWNhdGUgdG8gYSBwYXJhY2hhaW4gYSBnby1haGVhZCB3aXRoIGluIHRoZSB1cGdyYWRlLCBwcm9jZWR1cmUuAHUBIFRoaXMgdmFsdWUgaXMgYWJzZW50IHdoZW4gdGhlcmUgYXJlIG5vIHVwZ3JhZGVzIHNjaGVkdWxlZCBvciBkdXJpbmcgdGhlIHRpbWUgdGhlIHJlbGF5IGNoYWluVQEgcGVyZm9ybXMgdGhlIGNoZWNrcy4gSXQgaXMgc2V0IGF0IHRoZSBmaXJzdCByZWxheS1jaGFpbiBibG9jayB3aGVuIHRoZSBjb3JyZXNwb25kaW5ndQEgcGFyYWNoYWluIGNhbiBzd2l0Y2ggaXRzIHVwZ3JhZGUgZnVuY3Rpb24uIEFzIHNvb24gYXMgdGhlIHBhcmFjaGFpbidzIGJsb2NrIGlzIGluY2x1ZGVkLCB0aGVwIHZhbHVlIGdldHMgcmVzZXQgdG8gYE5vbmVgLgBlASBOT1RFIHRoYXQgdGhpcyBmaWVsZCBpcyB1c2VkIGJ5IHBhcmFjaGFpbnMgdmlhIG1lcmtsZSBzdG9yYWdlIHByb29mcywgdGhlcmVmb3JlIGNoYW5naW5nxCB0aGUgZm9ybWF0IHdpbGwgcmVxdWlyZSBtaWdyYXRpb24gb2YgcGFyYWNoYWlucy5gVXBncmFkZVJlc3RyaWN0aW9uU2lnbmFsAAEEBY0CpQsEACRpASBUaGlzIGlzIHVzZWQgYnkgdGhlIHJlbGF5LWNoYWluIHRvIGNvbW11bmljYXRlIHRoYXQgdGhlcmUgYXJlIHJlc3RyaWN0aW9ucyBmb3IgcGVyZm9ybWluZ3wgYW4gdXBncmFkZSBmb3IgdGhpcyBwYXJhY2hhaW4uAFkBIFRoaXMgbWF5IGJlIGEgYmVjYXVzZSB0aGUgcGFyYWNoYWluIHdhaXRzIGZvciB0aGUgdXBncmFkZSBjb29sZG93biB0byBleHBpcmUuIEFub3RoZXJtASBwb3RlbnRpYWwgdXNlIGNhc2UgaXMgd2hlbiB3ZSB3YW50IHRvIHBlcmZvcm0gc29tZSBtYWludGVuYW5jZSAoc3VjaCBhcyBzdG9yYWdlIG1pZ3JhdGlvbingIHdlIGNvdWxkIHJlc3RyaWN0IHVwZ3JhZGVzIHRvIG1ha2UgdGhlIHByb2Nlc3Mgc2ltcGxlci4AZQEgTk9URSB0aGF0IHRoaXMgZmllbGQgaXMgdXNlZCBieSBwYXJhY2hhaW5zIHZpYSBtZXJrbGUgc3RvcmFnZSBwcm9vZnMsIHRoZXJlZm9yZSBjaGFuZ2luZ8QgdGhlIGZvcm1hdCB3aWxsIHJlcXVpcmUgbWlncmF0aW9uIG9mIHBhcmFjaGFpbnMuQFVwZ3JhZGVDb29sZG93bnMBAJ0LBAAMUQEgVGhlIGxpc3Qgb2YgcGFyYWNoYWlucyB0aGF0IGFyZSBhd2FpdGluZyBmb3IgdGhlaXIgdXBncmFkZSByZXN0cmljdGlvbiB0byBjb29sZG93bi4AjCBPcmRlcmVkIGFzY2VuZGluZyBieSBibG9jayBudW1iZXIuQFVwY29taW5nVXBncmFkZXMBAJ0LBAAYkCBUaGUgbGlzdCBvZiB1cGNvbWluZyBjb2RlIHVwZ3JhZGVzLgBxASBFYWNoIGl0ZW0gaXMgYSBwYWlyIG9mIHdoaWNoIHBhcmEgcGVyZm9ybXMgYSBjb2RlIHVwZ3JhZGUgYW5kIGF0IHdoaWNoIHJlbGF5LWNoYWluIGJsb2NrIGl0QCBpcyBleHBlY3RlZCBhdC4AjCBPcmRlcmVkIGFzY2VuZGluZyBieSBibG9jayBudW1iZXIuMEFjdGlvbnNRdWV1ZQEBBAUQhQsEAAQVASBUaGUgYWN0aW9ucyB0byBwZXJmb3JtIGR1cmluZyB0aGUgc3RhcnQgb2YgYSBzcGVjaWZpYyBzZXNzaW9uIGluZGV4LlBVcGNvbWluZ1BhcmFzR2VuZXNpcwABBAWNAqkLBAAQoCBVcGNvbWluZyBwYXJhcyBpbnN0YW50aWF0aW9uIGFyZ3VtZW50cy4AZQEgTk9URSB0aGF0IGFmdGVyIFBWRiBwcmUtY2hlY2tpbmcgaXMgZW5hYmxlZCB0aGUgcGFyYSBnZW5lc2lzIGFyZyB3aWxsIGhhdmUgaXQncyBjb2RlIHNldGEBIHRvIGVtcHR5LiBJbnN0ZWFkLCB0aGUgY29kZSB3aWxsIGJlIHNhdmVkIGludG8gdGhlIHN0b3JhZ2UgcmlnaHQgYXdheSB2aWEgYENvZGVCeUhhc2hgLjhDb2RlQnlIYXNoUmVmcwEBBAa5BBAQAAAAAAQpASBUaGUgbnVtYmVyIG9mIHJlZmVyZW5jZSBvbiB0aGUgdmFsaWRhdGlvbiBjb2RlIGluIFtgQ29kZUJ5SGFzaGBdIHN0b3JhZ2UuKENvZGVCeUhhc2gAAQQGuQTVBAQAEJAgVmFsaWRhdGlvbiBjb2RlIHN0b3JlZCBieSBpdHMgaGFzaC4AMQEgVGhpcyBzdG9yYWdlIGlzIGNvbnNpc3RlbnQgd2l0aCBbYEZ1dHVyZUNvZGVIYXNoYF0sIFtgQ3VycmVudENvZGVIYXNoYF0gYW5kSCBbYFBhc3RDb2RlSGFzaGBdLgEJBQF5BwRAVW5zaWduZWRQcmlvcml0eTAg//////////8AAa0LOAAsSW5pdGlhbGl6ZXIBLEluaXRpYWxpemVyCDhIYXNJbml0aWFsaXplZAAAjAQAICEBIFdoZXRoZXIgdGhlIHBhcmFjaGFpbnMgbW9kdWxlcyBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQgd2l0aGluIHRoaXMgYmxvY2suACUBIFNlbWFudGljYWxseSBhIGBib29sYCwgYnV0IHRoaXMgZ3VhcmFudGVlcyBpdCBzaG91bGQgbmV2ZXIgaGl0IHRoZSB0cmllLGkBIGFzIHRoaXMgaXMgY2xlYXJlZCBpbiBgb25fZmluYWxpemVgIGFuZCBGcmFtZSBvcHRpbWl6ZXMgYE5vbmVgIHZhbHVlcyB0byBiZSBlbXB0eSB2YWx1ZXMuAHEBIEFzIGEgYGJvb2xgLCBgc2V0KGZhbHNlKWAgYW5kIGByZW1vdmUoKWAgYm90aCBsZWFkIHRvIHRoZSBuZXh0IGBnZXQoKWAgYmVpbmcgZmFsc2UsIGJ1dCBvbmV1ASBvZiB0aGVtIHdyaXRlcyB0byB0aGUgdHJpZSBhbmQgb25lIGRvZXMgbm90LiBUaGlzIGNvbmZ1c2lvbiBtYWtlcyBgT3B0aW9uPCgpPmAgbW9yZSBzdWl0YWJsZZAgZm9yIHRoZSBzZW1hbnRpY3Mgb2YgdGhpcyB2YXJpYWJsZS5YQnVmZmVyZWRTZXNzaW9uQ2hhbmdlcwEAsQsEABxZASBCdWZmZXJlZCBzZXNzaW9uIGNoYW5nZXMgYWxvbmcgd2l0aCB0aGUgYmxvY2sgbnVtYmVyIGF0IHdoaWNoIHRoZXkgc2hvdWxkIGJlIGFwcGxpZWQuAF0BIFR5cGljYWxseSB0aGlzIHdpbGwgYmUgZW1wdHkgb3Igb25lIGVsZW1lbnQgbG9uZy4gQXBhcnQgZnJvbSB0aGF0IHRoaXMgaXRlbSBuZXZlciBoaXRzNCB0aGUgc3RvcmFnZS4AaQEgSG93ZXZlciB0aGlzIGlzIGEgYFZlY2AgcmVnYXJkbGVzcyB0byBoYW5kbGUgdmFyaW91cyBlZGdlIGNhc2VzIHRoYXQgbWF5IG9jY3VyIGF0IHJ1bnRpbWXAIHVwZ3JhZGUgYm91bmRhcmllcyBvciBpZiBnb3Zlcm5hbmNlIGludGVydmVuZXMuAREFAAAAOQAMRG1wAQxEbXAMVERvd253YXJkTWVzc2FnZVF1ZXVlcwEBBAWNArkLBAAE0CBUaGUgZG93bndhcmQgbWVzc2FnZXMgYWRkcmVzc2VkIGZvciBhIGNlcnRhaW4gcGFyYS5kRG93bndhcmRNZXNzYWdlUXVldWVIZWFkcwEBBAWNAjSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcJQEgQSBtYXBwaW5nIHRoYXQgc3RvcmVzIHRoZSBkb3dud2FyZCBtZXNzYWdlIHF1ZXVlIE1RQyBoZWFkIGZvciBlYWNoIHBhcmEuAJAgRWFjaCBsaW5rIGluIHRoaXMgY2hhaW4gaGFzIGEgZm9ybTp4IGAocHJldl9oZWFkLCBCLCBIKE0pKWAsIHdoZXJl6CAtIGBwcmV2X2hlYWRgOiBpcyB0aGUgcHJldmlvdXMgaGVhZCBoYXNoIG9yIHplcm8gaWYgbm9uZS4hASAtIGBCYDogaXMgdGhlIHJlbGF5LWNoYWluIGJsb2NrIG51bWJlciBpbiB3aGljaCBhIG1lc3NhZ2Ugd2FzIGFwcGVuZGVkLtQgLSBgSChNKWA6IGlzIHRoZSBoYXNoIG9mIHRoZSBtZXNzYWdlIGJlaW5nIGFwcGVuZGVkLkREZWxpdmVyeUZlZUZhY3RvcgEBBAWNAtEGQAAAZKeztuANAAAAAAAAAAAExCBUaGUgZmFjdG9yIHRvIG11bHRpcGx5IHRoZSBiYXNlIGRlbGl2ZXJ5IGZlZSBieS4AAAAAOgAQSHJtcAEQSHJtcDBcSHJtcE9wZW5DaGFubmVsUmVxdWVzdHMAAQQFGQXBCwQAGLwgVGhlIHNldCBvZiBwZW5kaW5nIEhSTVAgb3BlbiBjaGFubmVsIHJlcXVlc3RzLgDAIFRoZSBzZXQgaXMgYWNjb21wYW5pZWQgYnkgYSBsaXN0IGZvciBpdGVyYXRpb24uACwgSW52YXJpYW50Oj0BIC0gVGhlcmUgYXJlIG5vIGNoYW5uZWxzIHRoYXQgZXhpc3RzIGluIGxpc3QgYnV0IG5vdCBpbiB0aGUgc2V0IGFuZCB2aWNlIHZlcnNhLmxIcm1wT3BlbkNoYW5uZWxSZXF1ZXN0c0xpc3QBAMULBAAAbEhybXBPcGVuQ2hhbm5lbFJlcXVlc3RDb3VudAEBBAWNAhAQAAAAAAxlASBUaGlzIG1hcHBpbmcgdHJhY2tzIGhvdyBtYW55IG9wZW4gY2hhbm5lbCByZXF1ZXN0cyBhcmUgaW5pdGlhdGVkIGJ5IGEgZ2l2ZW4gc2VuZGVyIHBhcmEuWQEgSW52YXJpYW50OiBgSHJtcE9wZW5DaGFubmVsUmVxdWVzdHNgIHNob3VsZCBjb250YWluIHRoZSBzYW1lIG51bWJlciBvZiBpdGVtcyB0aGF0IGhhcwUBIGAoWCwgXylgIGFzIHRoZSBudW1iZXIgb2YgYEhybXBPcGVuQ2hhbm5lbFJlcXVlc3RDb3VudGAgZm9yIGBYYC58SHJtcEFjY2VwdGVkQ2hhbm5lbFJlcXVlc3RDb3VudAEBBAWNAhAQAAAAAAxxASBUaGlzIG1hcHBpbmcgdHJhY2tzIGhvdyBtYW55IG9wZW4gY2hhbm5lbCByZXF1ZXN0cyB3ZXJlIGFjY2VwdGVkIGJ5IGEgZ2l2ZW4gcmVjaXBpZW50IHBhcmEubQEgSW52YXJpYW50OiBgSHJtcE9wZW5DaGFubmVsUmVxdWVzdHNgIHNob3VsZCBjb250YWluIHRoZSBzYW1lIG51bWJlciBvZiBpdGVtcyBgKF8sIFgpYCB3aXRoVQEgYGNvbmZpcm1lZGAgc2V0IHRvIHRydWUsIGFzIHRoZSBudW1iZXIgb2YgYEhybXBBY2NlcHRlZENoYW5uZWxSZXF1ZXN0Q291bnRgIGZvciBgWGAuYEhybXBDbG9zZUNoYW5uZWxSZXF1ZXN0cwABBAUZBYwEABxxASBBIHNldCBvZiBwZW5kaW5nIEhSTVAgY2xvc2UgY2hhbm5lbCByZXF1ZXN0cyB0aGF0IGFyZSBnb2luZyB0byBiZSBjbG9zZWQgZHVyaW5nIHRoZSBzZXNzaW9uIQEgY2hhbmdlLiBVc2VkIGZvciBjaGVja2luZyBpZiBhIGdpdmVuIGNoYW5uZWwgaXMgcmVnaXN0ZXJlZCBmb3IgY2xvc3VyZS4AwCBUaGUgc2V0IGlzIGFjY29tcGFuaWVkIGJ5IGEgbGlzdCBmb3IgaXRlcmF0aW9uLgAsIEludmFyaWFudDo9ASAtIFRoZXJlIGFyZSBubyBjaGFubmVscyB0aGF0IGV4aXN0cyBpbiBsaXN0IGJ1dCBub3QgaW4gdGhlIHNldCBhbmQgdmljZSB2ZXJzYS5wSHJtcENsb3NlQ2hhbm5lbFJlcXVlc3RzTGlzdAEAxQsEAAA4SHJtcFdhdGVybWFya3MAAQQFjQIQBAAQuCBUaGUgSFJNUCB3YXRlcm1hcmsgYXNzb2NpYXRlZCB3aXRoIGVhY2ggcGFyYS4sIEludmFyaWFudDpVASAtIGVhY2ggcGFyYSBgUGAgdXNlZCBoZXJlIGFzIGEga2V5IHNob3VsZCBzYXRpc2Z5IGBQYXJhczo6aXNfdmFsaWRfcGFyYShQKWAgd2l0aGluIGEsICAgc2Vzc2lvbi4wSHJtcENoYW5uZWxzAAEEBRkFyQsEAAy0IEhSTVAgY2hhbm5lbCBkYXRhIGFzc29jaWF0ZWQgd2l0aCBlYWNoIHBhcmEuLCBJbnZhcmlhbnQ6dQEgLSBlYWNoIHBhcnRpY2lwYW50IGluIHRoZSBjaGFubmVsIHNob3VsZCBzYXRpc2Z5IGBQYXJhczo6aXNfdmFsaWRfcGFyYShQKWAgd2l0aGluIGEgc2Vzc2lvbi5gSHJtcEluZ3Jlc3NDaGFubmVsc0luZGV4AQEEBY0ChQsEADRxASBJbmdyZXNzL2VncmVzcyBpbmRleGVzIGFsbG93IHRvIGZpbmQgYWxsIHRoZSBzZW5kZXJzIGFuZCByZWNlaXZlcnMgZ2l2ZW4gdGhlIG9wcG9zaXRlIHNpZGUuFCBJLmUuACEBIChhKSBpbmdyZXNzIGluZGV4IGFsbG93cyB0byBmaW5kIGFsbCB0aGUgc2VuZGVycyBmb3IgYSBnaXZlbiByZWNpcGllbnQuHQEgKGIpIGVncmVzcyBpbmRleCBhbGxvd3MgdG8gZmluZCBhbGwgdGhlIHJlY2lwaWVudHMgZm9yIGEgZ2l2ZW4gc2VuZGVyLgAwIEludmFyaWFudHM6UQEgLSBmb3IgZWFjaCBpbmdyZXNzIGluZGV4IGVudHJ5IGZvciBgUGAgZWFjaCBpdGVtIGBJYCBpbiB0aGUgaW5kZXggc2hvdWxkIHByZXNlbnQgaW54ICAgYEhybXBDaGFubmVsc2AgYXMgYChJLCBQKWAuTQEgLSBmb3IgZWFjaCBlZ3Jlc3MgaW5kZXggZW50cnkgZm9yIGBQYCBlYWNoIGl0ZW0gYEVgIGluIHRoZSBpbmRleCBzaG91bGQgcHJlc2VudCBpbnggICBgSHJtcENoYW5uZWxzYCBhcyBgKFAsIEUpYC4BASAtIHRoZXJlIHNob3VsZCBiZSBubyBvdGhlciBkYW5nbGluZyBjaGFubmVscyBpbiBgSHJtcENoYW5uZWxzYC5oIC0gdGhlIHZlY3RvcnMgYXJlIHNvcnRlZC5cSHJtcEVncmVzc0NoYW5uZWxzSW5kZXgBAQQFjQKFCwQAAExIcm1wQ2hhbm5lbENvbnRlbnRzAQEEBRkFzQsEAAisIFN0b3JhZ2UgZm9yIHRoZSBtZXNzYWdlcyBmb3IgZWFjaCBjaGFubmVsLmUBIEludmFyaWFudDogY2Fubm90IGJlIG5vbi1lbXB0eSBpZiB0aGUgY29ycmVzcG9uZGluZyBjaGFubmVsIGluIGBIcm1wQ2hhbm5lbHNgIGlzIGBOb25lYC5ISHJtcENoYW5uZWxEaWdlc3RzAQEEBY0C1QsEABhpASBNYWludGFpbnMgYSBtYXBwaW5nIHRoYXQgY2FuIGJlIHVzZWQgdG8gYW5zd2VyIHRoZSBxdWVzdGlvbjogV2hhdCBwYXJhcyBzZW50IGEgbWVzc2FnZSBhdOQgdGhlIGdpdmVuIGJsb2NrIG51bWJlciBmb3IgYSBnaXZlbiByZWNlaXZlci4gSW52YXJpYW50czqoIC0gVGhlIGlubmVyIGBWZWM8UGFyYUlkPmAgaXMgbmV2ZXIgZW1wdHku6CAtIFRoZSBpbm5lciBgVmVjPFBhcmFJZD5gIGNhbm5vdCBzdG9yZSB0d28gc2FtZSBgUGFyYUlkYC5tASAtIFRoZSBvdXRlciB2ZWN0b3IgaXMgc29ydGVkIGFzY2VuZGluZyBieSBibG9jayBudW1iZXIgYW5kIGNhbm5vdCBzdG9yZSB0d28gaXRlbXMgd2l0aCB0aGVUICAgc2FtZSBibG9jayBudW1iZXIuARUFAX0HAAHdCzwAPFBhcmFTZXNzaW9uSW5mbwE8UGFyYVNlc3Npb25JbmZvFFBBc3NpZ25tZW50S2V5c1Vuc2FmZQEA4QsEAAykIEFzc2lnbm1lbnQga2V5cyBmb3IgdGhlIGN1cnJlbnQgc2Vzc2lvbi5tASBOb3RlIHRoYXQgdGhpcyBBUEkgaXMgcHJpdmF0ZSBkdWUgdG8gaXQgYmVpbmcgcHJvbmUgdG8gJ29mZi1ieS1vbmUnIGF0IHNlc3Npb24gYm91bmRhcmllcy6sIFdoZW4gaW4gZG91YnQsIHVzZSBgU2Vzc2lvbnNgIEFQSSBpbnN0ZWFkLlRFYXJsaWVzdFN0b3JlZFNlc3Npb24BABAQAAAAAAQBASBUaGUgZWFybGllc3Qgc2Vzc2lvbiBmb3Igd2hpY2ggcHJldmlvdXMgc2Vzc2lvbiBpbmZvIGlzIHN0b3JlZC4gU2Vzc2lvbnMAAQQGEOULBAAMpCBTZXNzaW9uIGluZm9ybWF0aW9uIGluIGEgcm9sbGluZyB3aW5kb3cuNQEgU2hvdWxkIGhhdmUgYW4gZW50cnkgaW4gcmFuZ2UgYEVhcmxpZXN0U3RvcmVkU2Vzc2lvbi4uPUN1cnJlbnRTZXNzaW9uSW5kZXhgLnUBIERvZXMgbm90IGhhdmUgYW55IGVudHJpZXMgYmVmb3JlIHRoZSBzZXNzaW9uIGluZGV4IGluIHRoZSBmaXJzdCBzZXNzaW9uIGNoYW5nZSBub3RpZmljYXRpb24uLEFjY291bnRLZXlzAAEEBhDRAQQABHEBIFRoZSB2YWxpZGF0b3IgYWNjb3VudCBrZXlzIG9mIHRoZSB2YWxpZGF0b3JzIGFjdGl2ZWx5IHBhcnRpY2lwYXRpbmcgaW4gcGFyYWNoYWluIGNvbnNlbnN1cy5UU2Vzc2lvbkV4ZWN1dG9yUGFyYW1zAAEEBhBZBAQABMQgRXhlY3V0b3IgcGFyYW1ldGVyIHNldCBmb3IgYSBnaXZlbiBzZXNzaW9uIGluZGV4AAAAAD0ANFBhcmFzRGlzcHV0ZXMBNFBhcmFzRGlzcHV0ZXMURExhc3RQcnVuZWRTZXNzaW9uAAAQBAAIAQEgVGhlIGxhc3QgcHJ1bmVkIHNlc3Npb24sIGlmIGFueS4gQWxsIGRhdGEgc3RvcmVkIGJ5IHRoaXMgbW9kdWxlVCByZWZlcmVuY2VzIHNlc3Npb25zLiBEaXNwdXRlcwABCAUC8Qv1CwQABAUBIEFsbCBvbmdvaW5nIG9yIGNvbmNsdWRlZCBkaXNwdXRlcyBmb3IgdGhlIGxhc3Qgc2V2ZXJhbCBzZXNzaW9ucy5EQmFja2Vyc09uRGlzcHV0ZXMAAQgFAvEL+QsEAAicIEJhY2tpbmcgdm90ZXMgc3RvcmVkIGZvciBlYWNoIGRpc3B1dGUujCBUaGlzIHN0b3JhZ2UgaXMgdXNlZCBmb3Igc2xhc2hpbmcuIEluY2x1ZGVkAAEIBQLxCxAEAAhFASBBbGwgaW5jbHVkZWQgYmxvY2tzIG9uIHRoZSBjaGFpbiwgYXMgd2VsbCBhcyB0aGUgYmxvY2sgbnVtYmVyIGluIHRoaXMgY2hhaW4gdGhhdFkBIHNob3VsZCBiZSByZXZlcnRlZCBiYWNrIHRvIGlmIHRoZSBjYW5kaWRhdGUgaXMgZGlzcHV0ZWQgYW5kIGRldGVybWluZWQgdG8gYmUgaW52YWxpZC4YRnJvemVuAQBhAgQAEBEBIFdoZXRoZXIgdGhlIGNoYWluIGlzIGZyb3plbi4gU3RhcnRzIGFzIGBOb25lYC4gV2hlbiB0aGlzIGlzIGBTb21lYCw1ASB0aGUgY2hhaW4gd2lsbCBub3QgYWNjZXB0IGFueSBuZXcgcGFyYWNoYWluIGJsb2NrcyBmb3IgYmFja2luZyBvciBpbmNsdXNpb24sCQEgYW5kIGl0cyB2YWx1ZSBpbmRpY2F0ZXMgdGhlIGxhc3QgdmFsaWQgYmxvY2sgbnVtYmVyIGluIHRoZSBjaGFpbi74IEl0IGNhbiBvbmx5IGJlIHNldCBiYWNrIHRvIGBOb25lYCBieSBnb3Zlcm5hbmNlIGludGVydmVudGlvbi4BHQUBgQcAAf0LPgA0UGFyYXNTbGFzaGluZwE0UGFyYXNTbGFzaGluZwhAVW5hcHBsaWVkU2xhc2hlcwABCAUC8QsBDAQABJAgVmFsaWRhdG9ycyBwZW5kaW5nIGRpc3B1dGUgc2xhc2hlcy5IVmFsaWRhdG9yU2V0Q291bnRzAAEEBRAQBAAEhCBgVmFsaWRhdG9yU2V0Q291bnRgIHBlciBzZXNzaW9uLgEhBQAAAREMPwAgT25EZW1hbmQBIE9uRGVtYW5kFDhQYXJhSWRBZmZpbml0eQABBAWNAhUMBAAMcQEgTWFwcyBhIGBQYXJhSWRgIHRvIGBDb3JlSW5kZXhgIGFuZCBrZWVwcyB0cmFjayBvZiBob3cgbWFueSBhc3NpZ25tZW50cyB0aGUgc2NoZWR1bGVyIGhhcyBpbl0BIGl0J3MgbG9va2FoZWFkLiBLZWVwaW5nIHRyYWNrIG9mIHRoaXMgYWZmaW5pdHkgcHJldmVudHMgcGFyYWxsZWwgZXhlY3V0aW9uIG9mIHRoZSBzYW1lnCBgUGFyYUlkYCBvbiB0d28gb3IgbW9yZSBgQ29yZUluZGV4YGVzLixRdWV1ZVN0YXR1cwEAGQxkAABkp7O24A0AAAAAAAAAAAAAAAAAAAAAAATcIE92ZXJhbGwgc3RhdHVzIG9mIHF1ZXVlIChib3RoIGZyZWUgKyBhZmZpbml0eSBlbnRyaWVzKSxGcmVlRW50cmllcwEALQwEAARhASBQcmlvcml0eSBxdWV1ZSBmb3IgYWxsIG9yZGVycyB3aGljaCBkb24ndCB5ZXQgKG9yIG5vdCBhbnkgbW9yZSkgaGF2ZSBhbnkgY29yZSBhZmZpbml0eS48QWZmaW5pdHlFbnRyaWVzAQEEBXEHLQwEAARJASBRdWV1ZSBlbnRyaWVzIHRoYXQgYXJlIGN1cnJlbnRseSBib3VuZCB0byBhIHBhcnRpY3VsYXIgY29yZSBkdWUgdG8gY29yZSBhZmZpbml0eS4cUmV2ZW51ZQEAOQwEAAT8IEtlZXBzIHRyYWNrIG9mIGFjY3VtdWxhdGVkIHJldmVudWUgZnJvbSBvbiBkZW1hbmQgb3JkZXIgc2FsZXMuATEFAY0HDExUcmFmZmljRGVmYXVsdFZhbHVl0QZAAABkp7O24A0AAAAAAAAAAATMIFRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgc3BvdCB0cmFmZmljIG11bHRpcGxpZXIuUE1heEhpc3RvcmljYWxSZXZlbnVlEBCgAAAACNQgVGhlIG1heGltdW0gbnVtYmVyIG9mIGJsb2NrcyBzb21lIGhpc3RvcmljYWwgcmV2ZW51ZWAgaW5mb3JtYXRpb24gc3RvcmVkIGZvci4gUGFsbGV0SWSBCSBweS9vbmRtZAS0IElkZW50aWZpZXIgZm9yIHRoZSBpbnRlcm5hbCByZXZlbnVlIGJhbGFuY2UuAUEMQABoQ29yZXRpbWVBc3NpZ25tZW50UHJvdmlkZXIBaENvcmV0aW1lQXNzaWdubWVudFByb3ZpZGVyCDRDb3JlU2NoZWR1bGVzAAEEBEUMSQwEABBsIFNjaGVkdWxlZCBhc3NpZ25tZW50IHNldHMuAG0BIEFzc2lnbm1lbnRzIGFzIG9mIHRoZSBnaXZlbiBibG9jayBudW1iZXIuIFRoZXkgd2lsbCBnbyBpbnRvIHN0YXRlIG9uY2UgdGhlIGJsb2NrIG51bWJlciBpc9AgcmVhY2hlZCAoYW5kIHJlcGxhY2Ugd2hhdGV2ZXIgd2FzIGluIHRoZXJlIGJlZm9yZSkuPENvcmVEZXNjcmlwdG9ycwEBBARxB00MCAAAEKAgQXNzaWdubWVudHMgd2hpY2ggYXJlIGN1cnJlbnRseSBhY3RpdmUuAGkBIFRoZXkgd2lsbCBiZSBwaWNrZWQgZnJvbSBgUGVuZGluZ0Fzc2lnbm1lbnRzYCBvbmNlIHdlIHJlYWNoIHRoZSBzY2hlZHVsZWQgYmxvY2sgbnVtYmVyIGluWCBgUGVuZGluZ0Fzc2lnbm1lbnRzYC4AAAABbQxBACRSZWdpc3RyYXIBJFJlZ2lzdHJhcgwsUGVuZGluZ1N3YXAAAQQFjQKNAgQABGQgUGVuZGluZyBzd2FwIG9wZXJhdGlvbnMuFFBhcmFzAAEEBY0CcQwEABAFASBBbW91bnQgaGVsZCBvbiBkZXBvc2l0IGZvciBlYWNoIHBhcmEgYW5kIHRoZSBvcmlnaW5hbCBkZXBvc2l0b3IuAHEBIFRoZSBnaXZlbiBhY2NvdW50IElEIGlzIHJlc3BvbnNpYmxlIGZvciByZWdpc3RlcmluZyB0aGUgY29kZSBhbmQgaW5pdGlhbCBoZWFkIGRhdGEsIGJ1dCBtYXlVASBvbmx5IGRvIHNvIGlmIGl0IGlzbid0IHlldCByZWdpc3RlcmVkLiAoQWZ0ZXIgdGhhdCwgaXQncyB1cCB0byBnb3Zlcm5hbmNlIHRvIGRvIHNvLik4TmV4dEZyZWVQYXJhSWQBAI0CEAAAAAAEYCBUaGUgbmV4dCBmcmVlIGBQYXJhSWRgLgE1BQGRBwgsUGFyYURlcG9zaXQYQAAQpdToAAAAAAAAAAAAAAAI1CBUaGUgZGVwb3NpdCB0byBiZSBwYWlkIHRvIHJ1biBhIG9uLWRlbWFuZCBwYXJhY2hhaW4uPQEgVGhpcyBzaG91bGQgaW5jbHVkZSB0aGUgY29zdCBmb3Igc3RvcmluZyB0aGUgZ2VuZXNpcyBoZWFkIGFuZCB2YWxpZGF0aW9uIGNvZGUuSERhdGFEZXBvc2l0UGVyQnl0ZRhAgJaYAAAAAAAAAAAAAAAAAATEIFRoZSBkZXBvc2l0IHRvIGJlIHBhaWQgcGVyIGJ5dGUgc3RvcmVkIG9uIGNoYWluLgF1DEYAFFNsb3RzARRTbG90cwQYTGVhc2VzAQEEBY0CeQwEAEAVASBBbW91bnRzIGhlbGQgb24gZGVwb3NpdCBmb3IgZWFjaCAocG9zc2libHkgZnV0dXJlKSBsZWFzZWQgcGFyYWNoYWluLgBhASBUaGUgYWN0dWFsIGFtb3VudCBsb2NrZWQgb24gaXRzIGJlaGFsZiBieSBhbnkgYWNjb3VudCBhdCBhbnkgdGltZSBpcyB0aGUgbWF4aW11bSBvZiB0aGUpASBzZWNvbmQgdmFsdWVzIG9mIHRoZSBpdGVtcyBpbiB0aGlzIGxpc3Qgd2hvc2UgZmlyc3QgdmFsdWUgaXMgdGhlIGFjY291bnQuAGEBIFRoZSBmaXJzdCBpdGVtIGluIHRoZSBsaXN0IGlzIHRoZSBhbW91bnQgbG9ja2VkIGZvciB0aGUgY3VycmVudCBMZWFzZSBQZXJpb2QuIEZvbGxvd2luZ7AgaXRlbXMgYXJlIGZvciB0aGUgc3Vic2VxdWVudCBsZWFzZSBwZXJpb2RzLgBhASBUaGUgZGVmYXVsdCB2YWx1ZSAoYW4gZW1wdHkgbGlzdCkgaW1wbGllcyB0aGF0IHRoZSBwYXJhY2hhaW4gbm8gbG9uZ2VyIGV4aXN0cyAob3IgbmV2ZXK0IGV4aXN0ZWQpIGFzIGZhciBhcyB0aGlzIHBhbGxldCBpcyBjb25jZXJuZWQuAFEBIElmIGEgcGFyYWNoYWluIGRvZXNuJ3QgZXhpc3QgKnlldCogYnV0IGlzIHNjaGVkdWxlZCB0byBleGlzdCBpbiB0aGUgZnV0dXJlLCB0aGVuIGl0YQEgd2lsbCBiZSBsZWZ0LXBhZGRlZCB3aXRoIG9uZSBvciBtb3JlIGBOb25lYHMgdG8gZGVub3RlIHRoZSBmYWN0IHRoYXQgbm90aGluZyBpcyBoZWxkIG9uXQEgZGVwb3NpdCBmb3IgdGhlIG5vbi1leGlzdGVudCBjaGFpbiBjdXJyZW50bHksIGJ1dCBpcyBoZWxkIGF0IHNvbWUgcG9pbnQgaW4gdGhlIGZ1dHVyZS4A3CBJdCBpcyBpbGxlZ2FsIGZvciBhIGBOb25lYCB2YWx1ZSB0byB0cmFpbCBpbiB0aGUgbGlzdC4BOQUBlQcILExlYXNlUGVyaW9kEBAAdRIABNwgVGhlIG51bWJlciBvZiBibG9ja3Mgb3ZlciB3aGljaCBhIHNpbmdsZSBwZXJpb2QgbGFzdHMuLExlYXNlT2Zmc2V0EBAAEA4ABNQgVGhlIG51bWJlciBvZiBibG9ja3MgdG8gb2Zmc2V0IGVhY2ggbGVhc2UgcGVyaW9kIGJ5LgF9DEcAIEF1Y3Rpb25zASBBdWN0aW9ucxA4QXVjdGlvbkNvdW50ZXIBABAQAAAAAASMIE51bWJlciBvZiBhdWN0aW9ucyBzdGFydGVkIHNvIGZhci4sQXVjdGlvbkluZm8AAIAEABT4IEluZm9ybWF0aW9uIHJlbGF0aW5nIHRvIHRoZSBjdXJyZW50IGF1Y3Rpb24sIGlmIHRoZXJlIGlzIG9uZS4ARQEgVGhlIGZpcnN0IGl0ZW0gaW4gdGhlIHR1cGxlIGlzIHRoZSBsZWFzZSBwZXJpb2QgaW5kZXggdGhhdCB0aGUgZmlyc3Qgb2YgdGhlIGZvdXJRASBjb250aWd1b3VzIGxlYXNlIHBlcmlvZHMgb24gYXVjdGlvbiBpcyBmb3IuIFRoZSBzZWNvbmQgaXMgdGhlIGJsb2NrIG51bWJlciB3aGVuIHRoZV0BIGF1Y3Rpb24gd2lsbCAiYmVnaW4gdG8gZW5kIiwgaS5lLiB0aGUgZmlyc3QgYmxvY2sgb2YgdGhlIEVuZGluZyBQZXJpb2Qgb2YgdGhlIGF1Y3Rpb24uPFJlc2VydmVkQW1vdW50cwABBAWBDBgEAAgxASBBbW91bnRzIGN1cnJlbnRseSByZXNlcnZlZCBpbiB0aGUgYWNjb3VudHMgb2YgdGhlIGJpZGRlcnMgY3VycmVudGx5IHdpbm5pbmc4IChzdWItKXJhbmdlcy4cV2lubmluZwABBAUQhQwEAAxhASBUaGUgd2lubmluZyBiaWRzIGZvciBlYWNoIG9mIHRoZSAxMCByYW5nZXMgYXQgZWFjaCBzYW1wbGUgaW4gdGhlIGZpbmFsIEVuZGluZyBQZXJpb2Qgb2ZJASB0aGUgY3VycmVudCBhdWN0aW9uLiBUaGUgbWFwJ3Mga2V5IGlzIHRoZSAwLWJhc2VkIGluZGV4IGludG8gdGhlIFNhbXBsZSBTaXplLiBUaGUdASBmaXJzdCBzYW1wbGUgb2YgdGhlIGVuZGluZyBwZXJpb2QgaXMgMDsgdGhlIGxhc3QgaXMgYFNhbXBsZSBTaXplIC0gMWAuAT0FAZkHEDBFbmRpbmdQZXJpb2QQEEAZAQAEHQEgVGhlIG51bWJlciBvZiBibG9ja3Mgb3ZlciB3aGljaCBhbiBhdWN0aW9uIG1heSBiZSByZXRyb2FjdGl2ZWx5IGVuZGVkLjBTYW1wbGVMZW5ndGgQEBQAAAAM8CBUaGUgbGVuZ3RoIG9mIGVhY2ggc2FtcGxlIHRvIHRha2UgZHVyaW5nIHRoZSBlbmRpbmcgcGVyaW9kLgDUIGBFbmRpbmdQZXJpb2RgIC8gYFNhbXBsZUxlbmd0aGAgPSBUb3RhbCAjIG9mIFNhbXBsZXM4U2xvdFJhbmdlQ291bnQQECQAAAAATExlYXNlUGVyaW9kc1BlclNsb3QQEAgAAAAAAZEMSAAkQ3Jvd2Rsb2FuASRDcm93ZGxvYW4QFEZ1bmRzAAEEBY0ClQwEAARoIEluZm8gb24gYWxsIG9mIHRoZSBmdW5kcy4gTmV3UmFpc2UBAIULBAAIVQEgVGhlIGZ1bmRzIHRoYXQgaGF2ZSBoYWQgYWRkaXRpb25hbCBjb250cmlidXRpb25zIGR1cmluZyB0aGUgbGFzdCBibG9jay4gVGhpcyBpcyB1c2VkFQEgaW4gb3JkZXIgdG8gZGV0ZXJtaW5lIHdoaWNoIGZ1bmRzIHNob3VsZCBzdWJtaXQgbmV3IG9yIHVwZGF0ZWQgYmlkcy4wRW5kaW5nc0NvdW50AQAQEAAAAAAEKQEgVGhlIG51bWJlciBvZiBhdWN0aW9ucyB0aGF0IGhhdmUgZW50ZXJlZCBpbnRvIHRoZWlyIGVuZGluZyBwZXJpb2Qgc28gZmFyLjROZXh0RnVuZEluZGV4AQAQEAAAAAAEqCBUcmFja2VyIGZvciB0aGUgbmV4dCBhdmFpbGFibGUgZnVuZCBpbmRleAFFBQGdBwwgUGFsbGV0SWSBCSBweS9jZnVuZAgNASBgUGFsbGV0SWRgIGZvciB0aGUgY3Jvd2Rsb2FuIHBhbGxldC4gQW4gYXBwcm9wcmlhdGUgdmFsdWUgY291bGQgYmVkIGBQYWxsZXRJZCgqYiJweS9jZnVuZCIpYDxNaW5Db250cmlidXRpb24YQAB0O6QLAAAAAAAAAAAAAAAIYQEgVGhlIG1pbmltdW0gYW1vdW50IHRoYXQgbWF5IGJlIGNvbnRyaWJ1dGVkIGludG8gYSBjcm93ZGxvYW4uIFNob3VsZCBhbG1vc3QgY2VydGFpbmx5IGJlfCBhdCBsZWFzdCBgRXhpc3RlbnRpYWxEZXBvc2l0YC48UmVtb3ZlS2V5c0xpbWl0EBDoAwAABOQgTWF4IG51bWJlciBvZiBzdG9yYWdlIGtleXMgdG8gcmVtb3ZlIHBlciBleHRyaW5zaWMgY2FsbC4BnQxJACBDb3JldGltZQABWQUBoQcIIEJyb2tlcklkEBDtAwAABIggVGhlIFBhcmFJZCBvZiB0aGUgY29yZXRpbWUgY2hhaW4uREJyb2tlclBvdExvY2F0aW9uEQGMAQEAbW9kbHB5L2Jyb2tlAAAAAAAAAAAAAAAAAAAAAAAAAAAEhCBUaGUgY29yZXRpbWUgY2hhaW4gcG90IGxvY2F0aW9uLgGhDEoASFN0YXRlVHJpZU1pZ3JhdGlvbgFIU3RhdGVUcmllTWlncmF0aW9uDEBNaWdyYXRpb25Qcm9jZXNzAQB5BTgAAAAAAAAAAAAAAAAAABBQIE1pZ3JhdGlvbiBwcm9ncmVzcy4AXQEgVGhpcyBzdG9yZXMgdGhlIHNuYXBzaG90IG9mIHRoZSBsYXN0IG1pZ3JhdGVkIGtleXMuIEl0IGNhbiBiZSBzZXQgaW50byBtb3Rpb24gYW5kIG1vdmXUIGZvcndhcmQgYnkgYW55IG9mIHRoZSBtZWFucyBwcm92aWRlZCBieSB0aGlzIHBhbGxldC4oQXV0b0xpbWl0cwEAcQUEAAzUIFRoZSBsaW1pdHMgdGhhdCBhcmUgaW1wb3NlZCBvbiBhdXRvbWF0aWMgbWlncmF0aW9ucy4A1CBJZiBzZXQgdG8gTm9uZSwgdGhlbiBubyBhdXRvbWF0aWMgbWlncmF0aW9uIGhhcHBlbnMuYFNpZ25lZE1pZ3JhdGlvbk1heExpbWl0cwAAdQUEAAzgIFRoZSBtYXhpbXVtIGxpbWl0cyB0aGF0IHRoZSBzaWduZWQgbWlncmF0aW9uIGNvdWxkIHVzZS4AtCBJZiBub3Qgc2V0LCBubyBzaWduZWQgc3VibWlzc2lvbiBpcyBhbGxvd2VkLgFtBQGlBwQkTWF4S2V5TGVuEBAAAgAAVLQgTWF4aW1hbCBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGtleSBjYW4gaGF2ZS4AsCBGUkFNRSBpdHNlbGYgZG9lcyBub3QgbGltaXQgdGhlIGtleSBsZW5ndGguAQEgVGhlIGNvbmNyZXRlIHZhbHVlIG11c3QgdGhlcmVmb3JlIGRlcGVuZCBvbiB5b3VyIHN0b3JhZ2UgdXNhZ2UuWQEgQSBbYGZyYW1lX3N1cHBvcnQ6OnN0b3JhZ2U6OlN0b3JhZ2VOTWFwYF0gZm9yIGV4YW1wbGUgY2FuIGhhdmUgYW4gYXJiaXRyYXJ5IG51bWJlciBvZkUBIGtleXMgd2hpY2ggYXJlIHRoZW4gaGFzaGVkIGFuZCBjb25jYXRlbmF0ZWQsIHJlc3VsdGluZyBpbiBhcmJpdHJhcmlseSBsb25nIGtleXMuAEEBIFVzZSB0aGUgKnN0YXRlIG1pZ3JhdGlvbiBSUEMqIHRvIHJldHJpZXZlIHRoZSBsZW5ndGggb2YgdGhlIGxvbmdlc3Qga2V5IGluIHlvdXIBASBzdG9yYWdlOiA8aHR0cHM6Ly9naXRodWIuY29tL3Bhcml0eXRlY2gvc3Vic3RyYXRlL2lzc3Vlcy8xMTY0Mj4AKQEgVGhlIG1pZ3JhdGlvbiB3aWxsIGhhbHQgd2l0aCBhIGBIYWx0ZWRgIGV2ZW50IGlmIHRoaXMgdmFsdWUgaXMgdG9vIHNtYWxsLkkBIFNpbmNlIHRoZXJlIGlzIG5vIHJlYWwgcGVuYWx0eSBmcm9tIG92ZXItZXN0aW1hdGluZywgaXQgaXMgYWR2aXNlZCB0byB1c2UgYSBsYXJnZYAgdmFsdWUuIFRoZSBkZWZhdWx0IGlzIDUxMiBieXRlLgCAIFNvbWUga2V5IGxlbmd0aHMgZm9yIHJlZmVyZW5jZTrQIC0gW2BmcmFtZV9zdXBwb3J0OjpzdG9yYWdlOjpTdG9yYWdlVmFsdWVgXTogMzIgYnl0ZcggLSBbYGZyYW1lX3N1cHBvcnQ6OnN0b3JhZ2U6OlN0b3JhZ2VNYXBgXTogNjQgYnl0ZeAgLSBbYGZyYW1lX3N1cHBvcnQ6OnN0b3JhZ2U6OlN0b3JhZ2VEb3VibGVNYXBgXTogOTYgYnl0ZQBIIEZvciBtb3JlIGluZm8gc2VlSQEgPGh0dHBzOi8vd3d3LnNoYXdudGFicml6aS5jb20vYmxvZy9zdWJzdHJhdGUvcXVlcnlpbmctc3Vic3RyYXRlLXN0b3JhZ2UtdmlhLXJwYy8+Aa0HYgAkWGNtUGFsbGV0ASRYY21QYWxsZXQ4MFF1ZXJ5Q291bnRlcgEAMCAAAAAAAAAAAASIIFRoZSBsYXRlc3QgYXZhaWxhYmxlIHF1ZXJ5IGluZGV4LhxRdWVyaWVzAAEEAjClDAQABFQgVGhlIG9uZ29pbmcgcXVlcmllcy4oQXNzZXRUcmFwcwEBBAY0EBAAAAAAEGggVGhlIGV4aXN0aW5nIGFzc2V0IHRyYXBzLgBhASBLZXkgaXMgdGhlIGJsYWtlMiAyNTYgaGFzaCBvZiAob3JpZ2luLCB2ZXJzaW9uZWQgYEFzc2V0c2ApIHBhaXIuIFZhbHVlIGlzIHRoZSBudW1iZXIgb2YdASB0aW1lcyB0aGlzIHBhaXIgaGFzIGJlZW4gdHJhcHBlZCAodXN1YWxseSBqdXN0IDEgaWYgaXQgZXhpc3RzIGF0IGFsbCkuOFNhZmVYY21WZXJzaW9uAAAQBAAIYQEgRGVmYXVsdCB2ZXJzaW9uIHRvIGVuY29kZSBYQ00gd2hlbiBsYXRlc3QgdmVyc2lvbiBvZiBkZXN0aW5hdGlvbiBpcyB1bmtub3duLiBJZiBgTm9uZWAsPQEgdGhlbiB0aGUgZGVzdGluYXRpb25zIHdob3NlIFhDTSB2ZXJzaW9uIGlzIHVua25vd24gYXJlIGNvbnNpZGVyZWQgdW5yZWFjaGFibGUuQFN1cHBvcnRlZFZlcnNpb24AAQgFArkMEAQABPAgVGhlIExhdGVzdCB2ZXJzaW9ucyB0aGF0IHdlIGtub3cgdmFyaW91cyBsb2NhdGlvbnMgc3VwcG9ydC5AVmVyc2lvbk5vdGlmaWVycwABCAUCuQwwBAAEBQEgQWxsIGxvY2F0aW9ucyB0aGF0IHdlIGhhdmUgcmVxdWVzdGVkIHZlcnNpb24gbm90aWZpY2F0aW9ucyBmcm9tLlBWZXJzaW9uTm90aWZ5VGFyZ2V0cwABCAUCuQy9DAQACHEBIFRoZSB0YXJnZXQgbG9jYXRpb25zIHRoYXQgYXJlIHN1YnNjcmliZWQgdG8gb3VyIHZlcnNpb24gY2hhbmdlcywgYXMgd2VsbCBhcyB0aGUgbW9zdCByZWNlbnSUIG9mIG91ciB2ZXJzaW9ucyB3ZSBpbmZvcm1lZCB0aGVtIG9mLlRWZXJzaW9uRGlzY292ZXJ5UXVldWUBAMEMBAAMZQEgRGVzdGluYXRpb25zIHdob3NlIGxhdGVzdCBYQ00gdmVyc2lvbiB3ZSB3b3VsZCBsaWtlIHRvIGtub3cuIER1cGxpY2F0ZXMgbm90IGFsbG93ZWQsIGFuZHEBIHRoZSBgdTMyYCBjb3VudGVyIGlzIHRoZSBudW1iZXIgb2YgdGltZXMgdGhhdCBhIHNlbmQgdG8gdGhlIGRlc3RpbmF0aW9uIGhhcyBiZWVuIGF0dGVtcHRlZCyMIHdoaWNoIGlzIHVzZWQgYXMgYSBwcmlvcml0aXphdGlvbi5AQ3VycmVudE1pZ3JhdGlvbgAAzQwEAAScIFRoZSBjdXJyZW50IG1pZ3JhdGlvbidzIHN0YWdlLCBpZiBhbnkuVFJlbW90ZUxvY2tlZEZ1bmdpYmxlcwABDAUCAtUM2QwEAATwIEZ1bmdpYmxlIGFzc2V0cyB3aGljaCB3ZSBrbm93IGFyZSBsb2NrZWQgb24gYSByZW1vdGUgY2hhaW4uPExvY2tlZEZ1bmdpYmxlcwABBAIA6QwEAATgIEZ1bmdpYmxlIGFzc2V0cyB3aGljaCB3ZSBrbm93IGFyZSBsb2NrZWQgb24gdGhpcyBjaGFpbi5UWGNtRXhlY3V0aW9uU3VzcGVuZGVkAQAgBAAEtCBHbG9iYWwgc3VzcGVuc2lvbiBzdGF0ZSBvZiB0aGUgWENNIGV4ZWN1dG9yLjxTaG91bGRSZWNvcmRYY20BACAEABxZASBXaGV0aGVyIG9yIG5vdCBpbmNvbWluZyBYQ01zIChib3RoIGV4ZWN1dGVkIGxvY2FsbHkgYW5kIHJlY2VpdmVkKSBzaG91bGQgYmUgcmVjb3JkZWQuxCBPbmx5IG9uZSBYQ00gcHJvZ3JhbSB3aWxsIGJlIHJlY29yZGVkIGF0IGEgdGltZS4pASBUaGlzIGlzIG1lYW50IHRvIGJlIHVzZWQgaW4gcnVudGltZSBBUElzLCBhbmQgaXQncyBhZHZpc2VkIGl0IHN0YXlzIGZhbHNlDQEgZm9yIGFsbCBvdGhlciB1c2UgY2FzZXMsIHNvIGFzIHRvIG5vdCBkZWdyYWRlIHJlZ3VsYXIgcGVyZm9ybWFuY2UuAFkBIE9ubHkgcmVsZXZhbnQgaWYgdGhpcyBwYWxsZXQgaXMgYmVpbmcgdXNlZCBhcyB0aGUgW2B4Y21fZXhlY3V0b3I6OnRyYWl0czo6UmVjb3JkWGNtYF3IIGltcGxlbWVudGF0aW9uIGluIHRoZSBYQ00gZXhlY3V0b3IgY29uZmlndXJhdGlvbi4sUmVjb3JkZWRYY20AAEEGBAAYSQEgSWYgW2BTaG91bGRSZWNvcmRYY21gXSBpcyBzZXQgdG8gdHJ1ZSwgdGhlbiB0aGUgbGFzdCBYQ00gcHJvZ3JhbSBleGVjdXRlZCBsb2NhbGx5VCB3aWxsIGJlIHN0b3JlZCBoZXJlLikBIFJ1bnRpbWUgQVBJcyBjYW4gZmV0Y2ggdGhlIFhDTSB0aGF0IHdhcyBleGVjdXRlZCBieSBhY2Nlc3NpbmcgdGhpcyB2YWx1ZS4AWQEgT25seSByZWxldmFudCBpZiB0aGlzIHBhbGxldCBpcyBiZWluZyB1c2VkIGFzIHRoZSBbYHhjbV9leGVjdXRvcjo6dHJhaXRzOjpSZWNvcmRYY21gXcggaW1wbGVtZW50YXRpb24gaW4gdGhlIFhDTSBleGVjdXRvciBjb25maWd1cmF0aW9uLgGFBQGxBwAB9QxjADBNZXNzYWdlUXVldWUBME1lc3NhZ2VRdWV1ZQwwQm9va1N0YXRlRm9yAQEEBcUG+Qx0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEzCBUaGUgaW5kZXggb2YgdGhlIGZpcnN0IGFuZCBsYXN0IChub24tZW1wdHkpIHBhZ2VzLixTZXJ2aWNlSGVhZAAAxQYEAAS8IFRoZSBvcmlnaW4gYXQgd2hpY2ggd2Ugc2hvdWxkIGJlZ2luIHNlcnZpY2luZy4UUGFnZXMAAQgFBQUNCQ0EAASIIFRoZSBtYXAgb2YgcGFnZSBpbmRpY2VzIHRvIHBhZ2VzLgHBBgG5BxAgSGVhcFNpemUQEAAAAQAUPQEgVGhlIHNpemUgb2YgdGhlIHBhZ2U7IHRoaXMgaW1wbGllcyB0aGUgbWF4aW11bSBtZXNzYWdlIHNpemUgd2hpY2ggY2FuIGJlIHNlbnQuAFkBIEEgZ29vZCB2YWx1ZSBkZXBlbmRzIG9uIHRoZSBleHBlY3RlZCBtZXNzYWdlIHNpemVzLCB0aGVpciB3ZWlnaHRzLCB0aGUgd2VpZ2h0IHRoYXQgaXNdASBhdmFpbGFibGUgZm9yIHByb2Nlc3NpbmcgdGhlbSBhbmQgdGhlIG1heGltYWwgbmVlZGVkIG1lc3NhZ2Ugc2l6ZS4gVGhlIG1heGltYWwgbWVzc2FnZREBIHNpemUgaXMgc2xpZ2h0bHkgbG93ZXIgdGhhbiB0aGlzIGFzIGRlZmluZWQgYnkgW2BNYXhNZXNzYWdlTGVuT2ZgXS4gTWF4U3RhbGUQEAgAAAAMXQEgVGhlIG1heGltdW0gbnVtYmVyIG9mIHN0YWxlIHBhZ2VzIChpLmUuIG9mIG92ZXJ3ZWlnaHQgbWVzc2FnZXMpIGFsbG93ZWQgYmVmb3JlIGN1bGxpbmdRASBjYW4gaGFwcGVuLiBPbmNlIHRoZXJlIGFyZSBtb3JlIHN0YWxlIHBhZ2VzIHRoYW4gdGhpcywgdGhlbiBoaXN0b3JpY2FsIHBhZ2VzIG1heSBiZfwgZHJvcHBlZCwgZXZlbiBpZiB0aGV5IGNvbnRhaW4gdW5wcm9jZXNzZWQgb3ZlcndlaWdodCBtZXNzYWdlcy40U2VydmljZVdlaWdodBEHQAEHAKDbIV0TMzMzMzMzMzMYQQEgVGhlIGFtb3VudCBvZiB3ZWlnaHQgKGlmIGFueSkgd2hpY2ggc2hvdWxkIGJlIHByb3ZpZGVkIHRvIHRoZSBtZXNzYWdlIHF1ZXVlIGZvcqggc2VydmljaW5nIGVucXVldWVkIGl0ZW1zIGBvbl9pbml0aWFsaXplYC4A/CBUaGlzIG1heSBiZSBsZWdpdGltYXRlbHkgYE5vbmVgIGluIHRoZSBjYXNlIHRoYXQgeW91IHdpbGwgY2FsbF0BIGBTZXJ2aWNlUXVldWVzOjpzZXJ2aWNlX3F1ZXVlc2AgbWFudWFsbHkgb3Igc2V0IFtgU2VsZjo6SWRsZU1heFNlcnZpY2VXZWlnaHRgXSB0byBoYXZlVCBpdCBydW4gaW4gYG9uX2lkbGVgLlBJZGxlTWF4U2VydmljZVdlaWdodBEHQAEHAKDbIV0TMzMzMzMzMzMUXQEgVGhlIG1heGltdW0gYW1vdW50IG9mIHdlaWdodCAoaWYgYW55KSB0byBiZSB1c2VkIGZyb20gcmVtYWluaW5nIHdlaWdodCBgb25faWRsZWAgd2hpY2hBASBzaG91bGQgYmUgcHJvdmlkZWQgdG8gdGhlIG1lc3NhZ2UgcXVldWUgZm9yIHNlcnZpY2luZyBlbnF1ZXVlZCBpdGVtcyBgb25faWRsZWAuPQEgVXNlZnVsIGZvciBwYXJhY2hhaW5zIHRvIHByb2Nlc3MgbWVzc2FnZXMgYXQgdGhlIHNhbWUgYmxvY2sgdGhleSBhcmUgcmVjZWl2ZWQuACkBIElmIGBOb25lYCwgaXQgd2lsbCBub3QgY2FsbCBgU2VydmljZVF1ZXVlczo6c2VydmljZV9xdWV1ZXNgIGluIGBvbl9pZGxlYC4BEQ1kACRBc3NldFJhdGUBJEFzc2V0UmF0ZQRYQ29udmVyc2lvblJhdGVUb05hdGl2ZQABBALc0QYEAAwdASBNYXBzIGFuIGFzc2V0IHRvIGl0cyBmaXhlZCBwb2ludCByZXByZXNlbnRhdGlvbiBpbiB0aGUgbmF0aXZlIGJhbGFuY2UuAE0BIEUuZy4gYG5hdGl2ZV9hbW91bnQgPSBhc3NldF9hbW91bnQgKiBDb252ZXJzaW9uUmF0ZVRvTmF0aXZlOjo8VD46OmdldChhc3NldF9raW5kKWABzQYBwQcAARUNZQAUQmVlZnkBFEJlZWZ5FCxBdXRob3JpdGllcwEAGQ0EAARwIFRoZSBjdXJyZW50IGF1dGhvcml0aWVzIHNldDhWYWxpZGF0b3JTZXRJZAEAMCAAAAAAAAAAAAR0IFRoZSBjdXJyZW50IHZhbGlkYXRvciBzZXQgaWQ8TmV4dEF1dGhvcml0aWVzAQAZDQQABOwgQXV0aG9yaXRpZXMgc2V0IHNjaGVkdWxlZCB0byBiZSB1c2VkIHdpdGggdGhlIG5leHQgc2Vzc2lvbjBTZXRJZFNlc3Npb24AAQQFMBAEAChRASBBIG1hcHBpbmcgZnJvbSBCRUVGWSBzZXQgSUQgdG8gdGhlIGluZGV4IG9mIHRoZSAqbW9zdCByZWNlbnQqIHNlc3Npb24gZm9yIHdoaWNoIGl0c2ggbWVtYmVycyB3ZXJlIHJlc3BvbnNpYmxlLgBFASBUaGlzIGlzIG9ubHkgdXNlZCBmb3IgdmFsaWRhdGluZyBlcXVpdm9jYXRpb24gcHJvb2ZzLiBBbiBlcXVpdm9jYXRpb24gcHJvb2YgbXVzdE0BIGNvbnRhaW5zIGEga2V5LW93bmVyc2hpcCBwcm9vZiBmb3IgYSBnaXZlbiBzZXNzaW9uLCB0aGVyZWZvcmUgd2UgbmVlZCBhIHdheSB0byB0aWU9ASB0b2dldGhlciBzZXNzaW9ucyBhbmQgQkVFRlkgc2V0IGlkcywgaS5lLiB3ZSBuZWVkIHRvIHZhbGlkYXRlIHRoYXQgYSB2YWxpZGF0b3JBASB3YXMgdGhlIG93bmVyIG9mIGEgZ2l2ZW4ga2V5IG9uIGEgZ2l2ZW4gc2Vzc2lvbiwgYW5kIHdoYXQgdGhlIGFjdGl2ZSBzZXQgSUQgd2FzVCBkdXJpbmcgdGhhdCBzZXNzaW9uLgDcIFRXT1gtTk9URTogYFZhbGlkYXRvclNldElkYCBpcyBub3QgdW5kZXIgdXNlciBjb250cm9sLjBHZW5lc2lzQmxvY2sBAGECBAAM3CBCbG9jayBudW1iZXIgd2hlcmUgQkVFRlkgY29uc2Vuc3VzIGlzIGVuYWJsZWQvc3RhcnRlZC5pASBCeSBjaGFuZ2luZyB0aGlzICh0aHJvdWdoIHByaXZpbGVnZWQgYHNldF9uZXdfZ2VuZXNpcygpYCksIEJFRUZZIGNvbnNlbnN1cyBpcyBlZmZlY3RpdmVseawgcmVzdGFydGVkIGZyb20gdGhlIG5ld2x5IHNldCBibG9jayBudW1iZXIuAdUGAAw4TWF4QXV0aG9yaXRpZXMQEKCGAQAE1CBUaGUgbWF4aW11bSBudW1iZXIgb2YgYXV0aG9yaXRpZXMgdGhhdCBjYW4gYmUgYWRkZWQuNE1heE5vbWluYXRvcnMQEAACAAAE1CBUaGUgbWF4aW11bSBudW1iZXIgb2Ygbm9taW5hdG9ycyBmb3IgZWFjaCB2YWxpZGF0b3IuWE1heFNldElkU2Vzc2lvbkVudHJpZXMwIKgAAAAAAAAAGDkBIFRoZSBtYXhpbXVtIG51bWJlciBvZiBlbnRyaWVzIHRvIGtlZXAgaW4gdGhlIHNldCBpZCB0byBzZXNzaW9uIGluZGV4IG1hcHBpbmcuADEBIFNpbmNlIHRoZSBgU2V0SWRTZXNzaW9uYCBtYXAgaXMgb25seSB1c2VkIGZvciB2YWxpZGF0aW5nIGVxdWl2b2NhdGlvbnMgdGhpcykBIHZhbHVlIHNob3VsZCByZWxhdGUgdG8gdGhlIGJvbmRpbmcgZHVyYXRpb24gb2Ygd2hhdGV2ZXIgc3Rha2luZyBzeXN0ZW0gaXM1ASBiZWluZyB1c2VkIChpZiBhbnkpLiBJZiBlcXVpdm9jYXRpb24gaGFuZGxpbmcgaXMgbm90IGVuYWJsZWQgdGhlbiB0aGlzIHZhbHVlNCBjYW4gYmUgemVyby4BIQ3IAAxNbXIBDE1tcgwgUm9vdEhhc2gBADSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEWCBMYXRlc3QgTU1SIFJvb3QgaGFzaC44TnVtYmVyT2ZMZWF2ZXMBADAgAAAAAAAAAAAEsCBDdXJyZW50IHNpemUgb2YgdGhlIE1NUiAobnVtYmVyIG9mIGxlYXZlcykuFE5vZGVzAAEEBjA0BAAQgCBIYXNoZXMgb2YgdGhlIG5vZGVzIGluIHRoZSBNTVIuAC0BIE5vdGUgdGhpcyBjb2xsZWN0aW9uIG9ubHkgY29udGFpbnMgTU1SIHBlYWtzLCB0aGUgaW5uZXIgbm9kZXMgKGFuZCBsZWF2ZXMpvCBhcmUgcHJ1bmVkIGFuZCBvbmx5IHN0b3JlZCBpbiB0aGUgT2ZmY2hhaW4gREIuAAAAAMkAMEJlZWZ5TW1yTGVhZgEwQmVlZnlNbXJMZWFmCEBCZWVmeUF1dGhvcml0aWVzAQAlDbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASgIERldGFpbHMgb2YgY3VycmVudCBCRUVGWSBhdXRob3JpdHkgc2V0LlBCZWVmeU5leHRBdXRob3JpdGllcwEAJQ2wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMlCBEZXRhaWxzIG9mIG5leHQgQkVFRlkgYXV0aG9yaXR5IHNldC4AUQEgVGhpcyBzdG9yYWdlIGVudHJ5IGlzIHVzZWQgYXMgY2FjaGUgZm9yIGNhbGxzIHRvIGB1cGRhdGVfYmVlZnlfbmV4dF9hdXRob3JpdHlfc2V0YC4AAAAAygAExQF1AVUFKQ0oSENoZWNrTm9uWmVyb1NlbmRlci0NjEBDaGVja1NwZWNWZXJzaW9uMQ0QOENoZWNrVHhWZXJzaW9uNQ0QMENoZWNrR2VuZXNpczkNNDhDaGVja01vcnRhbGl0eT0NNChDaGVja05vbmNlRQ2MLENoZWNrV2VpZ2h0SQ2MYENoYXJnZVRyYW5zYWN0aW9uUGF5bWVudE0NjEhQcmV2YWxpZGF0ZUF0dGVzdHNRDYxEQ2hlY2tNZXRhZGF0YUhhc2hVDYRdDVwkSW5mbGF0aW9uBJhleHBlcmltZW50YWxfaW5mbGF0aW9uX3ByZWRpY3Rpb25faW5mbwBhDRDYIFJldHVybiB0aGUgY3VycmVudCBlc3RpbWF0ZXMgb2YgdGhlIGluZmxhdGlvbiBhbW91bnQuAFEBIFRoaXMgaXMgbWFya2VkIGFzIGV4cGVyaW1lbnRhbCBpbiBsaWdodCBvZiBSRkMjODkuIE5vbmV0aGVsZXNzLCBpdHMgdXNhZ2UgaXMgaGlnaGx5JQEgcmVjb21tZW5kZWQgb3ZlciB0cnlpbmcgdG8gcmVhZC1zdG9yYWdlLCBvciByZS1jcmVhdGUgdGhlIG9uY2hhaW4gbG9naWMuABBDb3JlDBx2ZXJzaW9uAPEHBJAgUmV0dXJucyB0aGUgdmVyc2lvbiBvZiB0aGUgcnVudGltZS40ZXhlY3V0ZV9ibG9jawQUYmxvY2tpDYwEZCBFeGVjdXRlIHRoZSBnaXZlbiBibG9jay5AaW5pdGlhbGl6ZV9ibG9jawQYaGVhZGVyoQF1DQRBASBJbml0aWFsaXplIGEgYmxvY2sgd2l0aCB0aGUgZ2l2ZW4gaGVhZGVyIGFuZCByZXR1cm4gdGhlIHJ1bnRpbWUgZXhlY3V0aXZlIG1vZGUuBCEBIFRoZSBgQ29yZWAgcnVudGltZSBhcGkgdGhhdCBldmVyeSBTdWJzdHJhdGUgcnVudGltZSBuZWVkcyB0byBpbXBsZW1lbnQuIE1ldGFkYXRhDCBtZXRhZGF0YQB5DQSMIFJldHVybnMgdGhlIG1ldGFkYXRhIG9mIGEgcnVudGltZS5MbWV0YWRhdGFfYXRfdmVyc2lvbgQcdmVyc2lvbhB9DRCkIFJldHVybnMgdGhlIG1ldGFkYXRhIGF0IGEgZ2l2ZW4gdmVyc2lvbi4ABQEgSWYgdGhlIGdpdmVuIGB2ZXJzaW9uYCBpc24ndCBzdXBwb3J0ZWQsIHRoaXMgd2lsbCByZXR1cm4gYE5vbmVgLnUBIFVzZSBbYFNlbGY6Om1ldGFkYXRhX3ZlcnNpb25zYF0gdG8gZmluZCBvdXQgYWJvdXQgc3VwcG9ydGVkIG1ldGFkYXRhIHZlcnNpb24gb2YgdGhlIHJ1bnRpbWUuRG1ldGFkYXRhX3ZlcnNpb25zAOUBDKQgUmV0dXJucyB0aGUgc3VwcG9ydGVkIG1ldGFkYXRhIHZlcnNpb25zLgDAIFRoaXMgY2FuIGJlIHVzZWQgdG8gY2FsbCBgbWV0YWRhdGFfYXRfdmVyc2lvbmAuBAEBIFRoZSBgTWV0YWRhdGFgIGFwaSB0cmFpdCB0aGF0IHJldHVybnMgbWV0YWRhdGEgZm9yIHRoZSBydW50aW1lLjBCbG9ja0J1aWxkZXIQPGFwcGx5X2V4dHJpbnNpYwQkZXh0cmluc2ljbQ2BDRBsIEFwcGx5IHRoZSBnaXZlbiBleHRyaW5zaWMuADkBIFJldHVybnMgYW4gaW5jbHVzaW9uIG91dGNvbWUgd2hpY2ggc3BlY2lmaWVzIGlmIHRoaXMgZXh0cmluc2ljIGlzIGluY2x1ZGVkIGluTCB0aGlzIGJsb2NrIG9yIG5vdC44ZmluYWxpemVfYmxvY2sAoQEEaCBGaW5pc2ggdGhlIGN1cnJlbnQgYmxvY2suTGluaGVyZW50X2V4dHJpbnNpY3MEIGluaGVyZW50kQ1xDQQ9ASBHZW5lcmF0ZSBpbmhlcmVudCBleHRyaW5zaWNzLiBUaGUgaW5oZXJlbnQgZGF0YSB3aWxsIHZhcnkgZnJvbSBjaGFpbiB0byBjaGFpbi48Y2hlY2tfaW5oZXJlbnRzCBRibG9ja2kNEGRhdGGRDaENBFUBIENoZWNrIHRoYXQgdGhlIGluaGVyZW50cyBhcmUgdmFsaWQuIFRoZSBpbmhlcmVudCBkYXRhIHdpbGwgdmFyeSBmcm9tIGNoYWluIHRvIGNoYWluLgRxASBUaGUgYEJsb2NrQnVpbGRlcmAgYXBpIHRyYWl0IHRoYXQgcHJvdmlkZXMgdGhlIHJlcXVpcmVkIGZ1bmN0aW9uYWxpdHkgZm9yIGJ1aWxkaW5nIGEgYmxvY2suSE5vbWluYXRpb25Qb29sc0FwaRw8cGVuZGluZ19yZXdhcmRzBAx3aG8AGAQ1ASBSZXR1cm5zIHRoZSBwZW5kaW5nIHJld2FyZHMgZm9yIHRoZSBtZW1iZXIgdGhhdCB0aGUgQWNjb3VudElkIHdhcyBnaXZlbiBmb3IuRHBvaW50c190b19iYWxhbmNlCBxwb29sX2lkEBhwb2ludHMYGAT0IFJldHVybnMgdGhlIGVxdWl2YWxlbnQgYmFsYW5jZSBvZiBgcG9pbnRzYCBmb3IgYSBnaXZlbiBwb29sLkRiYWxhbmNlX3RvX3BvaW50cwgccG9vbF9pZBAkbmV3X2Z1bmRzGBgE/CBSZXR1cm5zIHRoZSBlcXVpdmFsZW50IHBvaW50cyBvZiBgbmV3X2Z1bmRzYCBmb3IgYSBnaXZlbiBwb29sLkhwb29sX3BlbmRpbmdfc2xhc2gEHHBvb2xfaWQQGASwIFJldHVybnMgdGhlIHBlbmRpbmcgc2xhc2ggZm9yIGEgZ2l2ZW4gcG9vbC5QbWVtYmVyX3BlbmRpbmdfc2xhc2gEGG1lbWJlcgAYBMwgUmV0dXJucyB0aGUgcGVuZGluZyBzbGFzaCBmb3IgYSBnaXZlbiBwb29sIG1lbWJlci50cG9vbF9uZWVkc19kZWxlZ2F0ZV9taWdyYXRpb24EHHBvb2xfaWQQICDkIFJldHVybnMgdHJ1ZSBpZiB0aGUgcG9vbCB3aXRoIGBwb29sX2lkYCBuZWVkcyBtaWdyYXRpb24uAEkBIFRoaXMgY2FuIGhhcHBlbiB3aGVuIHRoZSBgcGFsbGV0LW5vbWluYXRpb24tcG9vbHNgIGhhcyBzd2l0Y2hlZCB0byB1c2luZyBzdHJhdGVneUEBIFtgRGVsZWdhdGVTdGFrZWBdKHBhbGxldF9ub21pbmF0aW9uX3Bvb2xzOjphZGFwdGVyOjpEZWxlZ2F0ZVN0YWtlKSBidXQgdGhlIHBvb2zoIHN0aWxsIGhhcyBmdW5kcyB0aGF0IHdlcmUgc3Rha2VkIHVzaW5nIHRoZSBvbGRlciBzdHJhdGVneRkBIFtUcmFuc2ZlclN0YWtlXShwYWxsZXRfbm9taW5hdGlvbl9wb29sczo6YWRhcHRlcjo6VHJhbnNmZXJTdGFrZSkuIFVzZYkBIFtgbWlncmF0ZV9wb29sX3RvX2RlbGVnYXRlX3N0YWtlYF0ocGFsbGV0X25vbWluYXRpb25fcG9vbHM6OkNhbGw6Om1pZ3JhdGVfcG9vbF90b19kZWxlZ2F0ZV9zdGFrZSlUIHRvIG1pZ3JhdGUgdGhlIHBvb2wufG1lbWJlcl9uZWVkc19kZWxlZ2F0ZV9taWdyYXRpb24EGG1lbWJlcgAgHCkBIFJldHVybnMgdHJ1ZSBpZiB0aGUgZGVsZWdhdGVkIGZ1bmRzIG9mIHRoZSBwb29sIGBtZW1iZXJgIG5lZWRzIG1pZ3JhdGlvbi4A2CBPbmNlIGEgcG9vbCBoYXMgc3VjY2Vzc2Z1bGx5IG1pZ3JhdGVkIHRvIHRoZSBzdHJhdGVneVUBIFtgRGVsZWdhdGVTdGFrZWBdKHBhbGxldF9ub21pbmF0aW9uX3Bvb2xzOjphZGFwdGVyOjpEZWxlZ2F0ZVN0YWtlKSwgdGhlIGZ1bmRzIG9mIHRoZRkBIG1lbWJlciBjYW4gYmUgbWlncmF0ZWQgZnJvbSBwb29sIGFjY291bnQgdG8gdGhlIG1lbWJlcidzIGFjY291bnQuIFVzZSkBIFtgbWlncmF0ZV9kZWxlZ2F0aW9uYF0ocGFsbGV0X25vbWluYXRpb25fcG9vbHM6OkNhbGw6Om1pZ3JhdGVfZGVsZWdhdGlvbimkIHRvIG1pZ3JhdGUgdGhlIGZ1bmRzIG9mIHRoZSBwb29sIG1lbWJlci4E+CBSdW50aW1lIGFwaSBmb3IgYWNjZXNzaW5nIGluZm9ybWF0aW9uIGFib3V0IG5vbWluYXRpb24gcG9vbHMuKFN0YWtpbmdBcGkMRG5vbWluYXRpb25zX3F1b3RhBBxiYWxhbmNlGBAEEQEgUmV0dXJucyB0aGUgbm9taW5hdGlvbnMgcXVvdGEgZm9yIGEgbm9taW5hdG9yIHdpdGggYSBnaXZlbiBiYWxhbmNlLlxlcmFzX3N0YWtlcnNfcGFnZV9jb3VudAgMZXJhEBxhY2NvdW50ABAEOQEgUmV0dXJucyB0aGUgcGFnZSBjb3VudCBvZiBleHBvc3VyZXMgZm9yIGEgdmFsaWRhdG9yIGBhY2NvdW50YCBpbiBhIGdpdmVuIGVyYS48cGVuZGluZ19yZXdhcmRzCAxlcmEQHGFjY291bnQAIAQ9ASBSZXR1cm5zIHRydWUgaWYgdmFsaWRhdG9yIGBhY2NvdW50YCBoYXMgcGFnZXMgdG8gYmUgY2xhaW1lZCBmb3IgdGhlIGdpdmVuIGVyYS4AWFRhZ2dlZFRyYW5zYWN0aW9uUXVldWUEUHZhbGlkYXRlX3RyYW5zYWN0aW9uDBhzb3VyY2WlDQh0eG0NKGJsb2NrX2hhc2g0qQ0kaCBWYWxpZGF0ZSB0aGUgdHJhbnNhY3Rpb24uAGUBIFRoaXMgbWV0aG9kIGlzIGludm9rZWQgYnkgdGhlIHRyYW5zYWN0aW9uIHBvb2wgdG8gbGVhcm4gZGV0YWlscyBhYm91dCBnaXZlbiB0cmFuc2FjdGlvbi5FASBUaGUgaW1wbGVtZW50YXRpb24gc2hvdWxkIG1ha2Ugc3VyZSB0byB2ZXJpZnkgdGhlIGNvcnJlY3RuZXNzIG9mIHRoZSB0cmFuc2FjdGlvbk0BIGFnYWluc3QgY3VycmVudCBzdGF0ZS4gVGhlIGdpdmVuIGBibG9ja19oYXNoYCBjb3JyZXNwb25kcyB0byB0aGUgaGFzaCBvZiB0aGUgYmxvY2t8IHRoYXQgaXMgdXNlZCBhcyBjdXJyZW50IHN0YXRlLgBFASBOb3RlIHRoYXQgdGhpcyBjYWxsIG1heSBiZSBwZXJmb3JtZWQgYnkgdGhlIHBvb2wgbXVsdGlwbGUgdGltZXMgYW5kIHRyYW5zYWN0aW9uc6QgbWlnaHQgYmUgdmVyaWZpZWQgaW4gYW55IHBvc3NpYmxlIG9yZGVyLgRNASBUaGUgYFRhZ2dlZFRyYW5zYWN0aW9uUXVldWVgIGFwaSB0cmFpdCBmb3IgaW50ZXJmZXJpbmcgd2l0aCB0aGUgdHJhbnNhY3Rpb24gcXVldWUuRE9mZmNoYWluV29ya2VyQXBpBDxvZmZjaGFpbl93b3JrZXIEGGhlYWRlcqEBjATIIFN0YXJ0cyB0aGUgb2ZmLWNoYWluIHRhc2sgZm9yIGdpdmVuIGJsb2NrIGhlYWRlci4EZCBUaGUgb2ZmY2hhaW4gd29ya2VyIGFwaS40UGFyYWNoYWluSG9zdHwodmFsaWRhdG9ycwAZCwRwIEdldCB0aGUgY3VycmVudCB2YWxpZGF0b3JzLkB2YWxpZGF0b3JfZ3JvdXBzALENDGUBIFJldHVybnMgdGhlIHZhbGlkYXRvciBncm91cHMgYW5kIHJvdGF0aW9uIGluZm8gbG9jYWxpemVkIGJhc2VkIG9uIHRoZSBoeXBvdGhldGljYWwgY2hpbGRhASAgb2YgYSBibG9jayB3aG9zZSBzdGF0ZSAgdGhpcyBpcyBpbnZva2VkIG9uLiBOb3RlIHRoYXQgYG5vd2AgaW4gdGhlIGBHcm91cFJvdGF0aW9uSW5mb2DQIHNob3VsZCBiZSB0aGUgc3VjY2Vzc29yIG9mIHRoZSBudW1iZXIgb2YgdGhlIGJsb2NrLkhhdmFpbGFiaWxpdHlfY29yZXMAuQ0INQEgWWllbGRzIGluZm9ybWF0aW9uIG9uIGFsbCBhdmFpbGFiaWxpdHkgY29yZXMgYXMgcmVsZXZhbnQgdG8gdGhlIGNoaWxkIGJsb2NrLj0BIENvcmVzIGFyZSBlaXRoZXIgZnJlZSBvciBvY2N1cGllZC4gRnJlZSBjb3JlcyBjYW4gaGF2ZSBwYXJhcyBhc3NpZ25lZCB0byB0aGVtLmRwZXJzaXN0ZWRfdmFsaWRhdGlvbl9kYXRhCBxwYXJhX2lkjQIoYXNzdW1wdGlvbtEN1Q0UaQEgWWllbGRzIHRoZSBwZXJzaXN0ZWQgdmFsaWRhdGlvbiBkYXRhIGZvciB0aGUgZ2l2ZW4gYFBhcmFJZGAgYWxvbmcgd2l0aCBhbiBhc3N1bXB0aW9uIHRoYXTYIHNob3VsZCBiZSB1c2VkIGlmIHRoZSBwYXJhIGN1cnJlbnRseSBvY2N1cGllcyBhIGNvcmUuAEUBIFJldHVybnMgYE5vbmVgIGlmIGVpdGhlciB0aGUgcGFyYSBpcyBub3QgcmVnaXN0ZXJlZCBvciB0aGUgYXNzdW1wdGlvbiBpcyBgRnJlZWRgmCBhbmQgdGhlIHBhcmEgYWxyZWFkeSBvY2N1cGllcyBhIGNvcmUuXGFzc3VtZWRfdmFsaWRhdGlvbl9kYXRhCBxwYXJhX2lkjQKcZXhwZWN0ZWRfcGVyc2lzdGVkX3ZhbGlkYXRpb25fZGF0YV9oYXNoNN0NDGkBIFJldHVybnMgdGhlIHBlcnNpc3RlZCB2YWxpZGF0aW9uIGRhdGEgZm9yIHRoZSBnaXZlbiBgUGFyYUlkYCBhbG9uZyB3aXRoIHRoZSBjb3JyZXNwb25kaW5ndQEgdmFsaWRhdGlvbiBjb2RlIGhhc2guIEluc3RlYWQgb2YgYWNjZXB0aW5nIGFzc3VtcHRpb24gYWJvdXQgdGhlIHBhcmEsIG1hdGNoZXMgdGhlIHZhbGlkYXRpb24pASBkYXRhIGhhc2ggYWdhaW5zdCBhbiBleHBlY3RlZCBvbmUgYW5kIHlpZWxkcyBgTm9uZWAgaWYgdGhleSdyZSBub3QgZXF1YWwuYGNoZWNrX3ZhbGlkYXRpb25fb3V0cHV0cwgccGFyYV9pZI0CHG91dHB1dHO9BCAEFQEgQ2hlY2tzIGlmIHRoZSBnaXZlbiB2YWxpZGF0aW9uIG91dHB1dHMgcGFzcyB0aGUgYWNjZXB0YW5jZSBjcml0ZXJpYS5cc2Vzc2lvbl9pbmRleF9mb3JfY2hpbGQAEAzwIFJldHVybnMgdGhlIHNlc3Npb24gaW5kZXggZXhwZWN0ZWQgYXQgYSBjaGlsZCBvZiB0aGUgYmxvY2suANAgVGhpcyBjYW4gYmUgdXNlZCB0byBpbnN0YW50aWF0ZSBhIGBTaWduaW5nQ29udGV4dGAuPHZhbGlkYXRpb25fY29kZQgccGFyYV9pZI0CKGFzc3VtcHRpb27RDdEEEFUBIEZldGNoIHRoZSB2YWxpZGF0aW9uIGNvZGUgdXNlZCBieSBhIHBhcmEsIG1ha2luZyB0aGUgZ2l2ZW4gYE9jY3VwaWVkQ29yZUFzc3VtcHRpb25gLgBFASBSZXR1cm5zIGBOb25lYCBpZiBlaXRoZXIgdGhlIHBhcmEgaXMgbm90IHJlZ2lzdGVyZWQgb3IgdGhlIGFzc3VtcHRpb24gaXMgYEZyZWVkYJggYW5kIHRoZSBwYXJhIGFscmVhZHkgb2NjdXBpZXMgYSBjb3JlLnhjYW5kaWRhdGVfcGVuZGluZ19hdmFpbGFiaWxpdHkEHHBhcmFfaWSNAuUNCF0BIEdldCB0aGUgcmVjZWlwdCBvZiBhIGNhbmRpZGF0ZSBwZW5kaW5nIGF2YWlsYWJpbGl0eS4gVGhpcyByZXR1cm5zIGBTb21lYCBmb3IgYW55IHBhcmFzJQEgYXNzaWduZWQgdG8gb2NjdXBpZWQgY29yZXMgaW4gYGF2YWlsYWJpbGl0eV9jb3Jlc2AgYW5kIGBOb25lYCBvdGhlcndpc2UuQGNhbmRpZGF0ZV9ldmVudHMA6Q0ELQEgR2V0IGEgdmVjdG9yIG9mIGV2ZW50cyBjb25jZXJuaW5nIGNhbmRpZGF0ZXMgdGhhdCBvY2N1cnJlZCB3aXRoaW4gYSBibG9jay4wZG1xX2NvbnRlbnRzBCRyZWNpcGllbnSNArkLBD0BIEdldCBhbGwgdGhlIHBlbmRpbmcgaW5ib3VuZCBtZXNzYWdlcyBpbiB0aGUgZG93bndhcmQgbWVzc2FnZSBxdWV1ZSBmb3IgYSBwYXJhLnhpbmJvdW5kX2hybXBfY2hhbm5lbHNfY29udGVudHMEJHJlY2lwaWVudI0C8Q0IZQEgR2V0IHRoZSBjb250ZW50cyBvZiBhbGwgY2hhbm5lbHMgYWRkcmVzc2VkIHRvIHRoZSBnaXZlbiByZWNpcGllbnQuIENoYW5uZWxzIHRoYXQgaGF2ZSBub5AgbWVzc2FnZXMgaW4gdGhlbSBhcmUgYWxzbyBpbmNsdWRlZC5cdmFsaWRhdGlvbl9jb2RlX2J5X2hhc2gEEGhhc2i5BNEEBJwgR2V0IHRoZSB2YWxpZGF0aW9uIGNvZGUgZnJvbSBpdHMgaGFzaC44b25fY2hhaW5fdm90ZXMA/Q0EMQEgU2NyYXBlIGRpc3B1dGUgcmVsZXZhbnQgZnJvbSBvbi1jaGFpbiwgYmFja2luZyB2b3RlcyBhbmQgcmVzb2x2ZWQgZGlzcHV0ZXMuMHNlc3Npb25faW5mbwQUaW5kZXgQAQ4M3CBHZXQgdGhlIHNlc3Npb24gaW5mbyBmb3IgdGhlIGdpdmVuIHNlc3Npb24sIGlmIHN0b3JlZC4AGQEgTk9URTogVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGF2YWlsYWJsZSBzaW5jZSBwYXJhY2hhaW4gaG9zdCB2ZXJzaW9uIDIuaHN1Ym1pdF9wdmZfY2hlY2tfc3RhdGVtZW50CBBzdG10DQUkc2lnbmF0dXJlnQSMDAEBIFN1Ym1pdHMgYSBQVkYgcHJlLWNoZWNraW5nIHN0YXRlbWVudCBpbnRvIHRoZSB0cmFuc2FjdGlvbiBwb29sLgAZASBOT1RFOiBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgYXZhaWxhYmxlIHNpbmNlIHBhcmFjaGFpbiBob3N0IHZlcnNpb24gMi5UcHZmc19yZXF1aXJlX3ByZWNoZWNrAIELDF0BIFJldHVybnMgY29kZSBoYXNoZXMgb2YgUFZGcyB0aGF0IHJlcXVpcmUgcHJlLWNoZWNraW5nIGJ5IHZhbGlkYXRvcnMgaW4gdGhlIGFjdGl2ZSBzZXQuABkBIE5PVEU6IFRoaXMgZnVuY3Rpb24gaXMgb25seSBhdmFpbGFibGUgc2luY2UgcGFyYWNoYWluIGhvc3QgdmVyc2lvbiAyLlB2YWxpZGF0aW9uX2NvZGVfaGFzaAgccGFyYV9pZI0CKGFzc3VtcHRpb27RDQUODIUBIEZldGNoIHRoZSBoYXNoIG9mIHRoZSB2YWxpZGF0aW9uIGNvZGUgdXNlZCBieSBhIHBhcmEsIG1ha2luZyB0aGUgZ2l2ZW4gYE9jY3VwaWVkQ29yZUFzc3VtcHRpb25gLgAZASBOT1RFOiBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgYXZhaWxhYmxlIHNpbmNlIHBhcmFjaGFpbiBob3N0IHZlcnNpb24gMi4gZGlzcHV0ZXMACQ4EeCBSZXR1cm5zIGFsbCBvbmNoYWluIGRpc3B1dGVzLlxzZXNzaW9uX2V4ZWN1dG9yX3BhcmFtcwQ0c2Vzc2lvbl9pbmRleBARDgS4IFJldHVybnMgZXhlY3V0aW9uIHBhcmFtZXRlcnMgZm9yIHRoZSBzZXNzaW9uLkR1bmFwcGxpZWRfc2xhc2hlcwAVDghZASBSZXR1cm5zIGEgbGlzdCBvZiB2YWxpZGF0b3JzIHRoYXQgbG9zdCBhIHBhc3Qgc2Vzc2lvbiBkaXNwdXRlIGFuZCBuZWVkIHRvIGJlIHNsYXNoZWQuGQEgTk9URTogVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGF2YWlsYWJsZSBzaW5jZSBwYXJhY2hhaW4gaG9zdCB2ZXJzaW9uIDUuTGtleV9vd25lcnNoaXBfcHJvb2YEMHZhbGlkYXRvcl9pZB0CHQ4IzCBSZXR1cm5zIGEgbWVya2xlIHByb29mIG9mIGEgdmFsaWRhdG9yIHNlc3Npb24ga2V5LhkBIE5PVEU6IFRoaXMgZnVuY3Rpb24gaXMgb25seSBhdmFpbGFibGUgc2luY2UgcGFyYWNoYWluIGhvc3QgdmVyc2lvbiA1LmhzdWJtaXRfcmVwb3J0X2Rpc3B1dGVfbG9zdAg0ZGlzcHV0ZV9wcm9vZiUFTGtleV9vd25lcnNoaXBfcHJvb2YhDiUODCkBIFN1Ym1pdCBhbiB1bnNpZ25lZCBleHRyaW5zaWMgdG8gc2xhc2ggdmFsaWRhdG9ycyB3aG8gbG9zdCBhIGRpc3B1dGUgYWJvdXR8IGEgY2FuZGlkYXRlIG9mIGEgcGFzdCBzZXNzaW9uLhkBIE5PVEU6IFRoaXMgZnVuY3Rpb24gaXMgb25seSBhdmFpbGFibGUgc2luY2UgcGFyYWNoYWluIGhvc3QgdmVyc2lvbiA1LlRtaW5pbXVtX2JhY2tpbmdfdm90ZXMAEAgNASBHZXQgdGhlIG1pbmltdW0gbnVtYmVyIG9mIGJhY2tpbmcgdm90ZXMgZm9yIGEgcGFyYWNoYWluIGNhbmRpZGF0ZS70IFRoaXMgaXMgYSBzdGFnaW5nIG1ldGhvZCEgRG8gbm90IHVzZSBvbiBwcm9kdWN0aW9uIHJ1bnRpbWVzIUhwYXJhX2JhY2tpbmdfc3RhdGUEBF+NAikOBOQgUmV0dXJucyB0aGUgc3RhdGUgb2YgcGFyYWNoYWluIGJhY2tpbmcgZm9yIGEgZ2l2ZW4gcGFyYS5QYXN5bmNfYmFja2luZ19wYXJhbXMAVQQEYQEgUmV0dXJucyBjYW5kaWRhdGUncyBhY2NlcHRhbmNlIGxpbWl0YXRpb25zIGZvciBhc3luY2hyb25vdXMgYmFja2luZyBmb3IgYSByZWxheSBwYXJlbnQuTGRpc2FibGVkX3ZhbGlkYXRvcnMAFQsE+CBSZXR1cm5zIGEgbGlzdCBvZiBhbGwgZGlzYWJsZWQgdmFsaWRhdG9ycyBhdCB0aGUgZ2l2ZW4gYmxvY2suNG5vZGVfZmVhdHVyZXMAkQQITCBHZXQgbm9kZSBmZWF0dXJlcy70IFRoaXMgaXMgYSBzdGFnaW5nIG1ldGhvZCEgRG8gbm90IHVzZSBvbiBwcm9kdWN0aW9uIHJ1bnRpbWVzIVhhcHByb3ZhbF92b3RpbmdfcGFyYW1zAG0EBKQgQXBwcm92YWwgdm90aW5nIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyxjbGFpbV9xdWV1ZQBZDgQwIENsYWltIHF1ZXVlfGNhbmRpZGF0ZXNfcGVuZGluZ19hdmFpbGFiaWxpdHkEHHBhcmFfaWSNAmUOBGAgRWxhc3RpYyBzY2FsaW5nIHN1cHBvcnQE3CBUaGUgQVBJIGZvciBxdWVyeWluZyB0aGUgc3RhdGUgb2YgcGFyYWNoYWlucyBvbi1jaGFpbi4gQmVlZnlBcGkQNGJlZWZ5X2dlbmVzaXMAYQIEBQEgUmV0dXJuIHRoZSBibG9jayBudW1iZXIgd2hlcmUgQkVFRlkgY29uc2Vuc3VzIGlzIGVuYWJsZWQvc3RhcnRlZDR2YWxpZGF0b3Jfc2V0AGkOBLggUmV0dXJuIHRoZSBjdXJyZW50IGFjdGl2ZSBCRUVGWSB2YWxpZGF0b3Igc2V0tHN1Ym1pdF9yZXBvcnRfZXF1aXZvY2F0aW9uX3Vuc2lnbmVkX2V4dHJpbnNpYwhIZXF1aXZvY2F0aW9uX3Byb29m2QY8a2V5X293bmVyX3Byb29mcQ4lDiARASBTdWJtaXRzIGFuIHVuc2lnbmVkIGV4dHJpbnNpYyB0byByZXBvcnQgYW4gZXF1aXZvY2F0aW9uLiBUaGUgY2FsbGVy+CBtdXN0IHByb3ZpZGUgdGhlIGVxdWl2b2NhdGlvbiBwcm9vZiBhbmQgYSBrZXkgb3duZXJzaGlwIHByb29m/CAoc2hvdWxkIGJlIG9idGFpbmVkIHVzaW5nIGBnZW5lcmF0ZV9rZXlfb3duZXJzaGlwX3Byb29mYCkuIFRoZQUBIGV4dHJpbnNpYyB3aWxsIGJlIHVuc2lnbmVkIGFuZCBzaG91bGQgb25seSBiZSBhY2NlcHRlZCBmb3IgbG9jYWwVASBhdXRob3JzaGlwIChub3QgdG8gYmUgYnJvYWRjYXN0IHRvIHRoZSBuZXR3b3JrKS4gVGhpcyBtZXRob2QgcmV0dXJucwkBIGBOb25lYCB3aGVuIGNyZWF0aW9uIG9mIHRoZSBleHRyaW5zaWMgZmFpbHMsIGUuZy4gaWYgZXF1aXZvY2F0aW9uBQEgcmVwb3J0aW5nIGlzIGRpc2FibGVkIGZvciB0aGUgZ2l2ZW4gcnVudGltZSAoaS5lLiB0aGlzIG1ldGhvZCBpcwUBIGhhcmRjb2RlZCB0byByZXR1cm4gYE5vbmVgKS4gT25seSB1c2VmdWwgaW4gYW4gb2ZmY2hhaW4gY29udGV4dC5wZ2VuZXJhdGVfa2V5X293bmVyc2hpcF9wcm9vZggYc2V0X2lkMDBhdXRob3JpdHlfaWQpAnUOLAkBIEdlbmVyYXRlcyBhIHByb29mIG9mIGtleSBvd25lcnNoaXAgZm9yIHRoZSBnaXZlbiBhdXRob3JpdHkgaW4gdGhl/CBnaXZlbiBzZXQuIEFuIGV4YW1wbGUgdXNhZ2Ugb2YgdGhpcyBtb2R1bGUgaXMgY291cGxlZCB3aXRoIHRoZQUBIHNlc3Npb24gaGlzdG9yaWNhbCBtb2R1bGUgdG8gcHJvdmUgdGhhdCBhIGdpdmVuIGF1dGhvcml0eSBrZXkgaXMNASB0aWVkIHRvIGEgZ2l2ZW4gc3Rha2luZyBpZGVudGl0eSBkdXJpbmcgYSBzcGVjaWZpYyBzZXNzaW9uLiBQcm9vZnMRASBvZiBrZXkgb3duZXJzaGlwIGFyZSBuZWNlc3NhcnkgZm9yIHN1Ym1pdHRpbmcgZXF1aXZvY2F0aW9uIHJlcG9ydHMuEQEgTk9URTogZXZlbiB0aG91Z2ggdGhlIEFQSSB0YWtlcyBhIGBzZXRfaWRgIGFzIHBhcmFtZXRlciB0aGUgY3VycmVudAkBIGltcGxlbWVudGF0aW9ucyBpZ25vcmVzIHRoaXMgcGFyYW1ldGVyIGFuZCBpbnN0ZWFkIHJlbGllcyBvbiB0aGlzDQEgbWV0aG9kIGJlaW5nIGNhbGxlZCBhdCB0aGUgY29ycmVjdCBibG9jayBoZWlnaHQsIGkuZS4gYW55IHBvaW50IGF0FQEgd2hpY2ggdGhlIGdpdmVuIHNldCBpZCBpcyBsaXZlIG9uLWNoYWluLiBGdXR1cmUgaW1wbGVtZW50YXRpb25zIHdpbGwNASBpbnN0ZWFkIHVzZSBpbmRleGVkIGRhdGEgdGhyb3VnaCBhbiBvZmZjaGFpbiB3b3JrZXIsIG5vdCByZXF1aXJpbmd4IG9sZGVyIHN0YXRlcyB0byBiZSBhdmFpbGFibGUuBIAgQVBJIG5lY2Vzc2FyeSBmb3IgQkVFRlkgdm90ZXJzLhhNbXJBcGkUIG1tcl9yb290AHkOBIwgUmV0dXJuIHRoZSBvbi1jaGFpbiBNTVIgcm9vdCBoYXNoLjhtbXJfbGVhZl9jb3VudACBDgS4IFJldHVybiB0aGUgbnVtYmVyIG9mIE1NUiBibG9ja3MgaW4gdGhlIGNoYWluLjhnZW5lcmF0ZV9wcm9vZgg0YmxvY2tfbnVtYmVyc+UBXGJlc3Rfa25vd25fYmxvY2tfbnVtYmVyYQKFDghpASBHZW5lcmF0ZSBNTVIgcHJvb2YgZm9yIGEgc2VyaWVzIG9mIGJsb2NrIG51bWJlcnMuIElmIGBiZXN0X2tub3duX2Jsb2NrX251bWJlciA9IFNvbWUobilgLEUBIHVzZSBoaXN0b3JpY2FsIE1NUiBzdGF0ZSBhdCBnaXZlbiBibG9jayBoZWlnaHQgYG5gLiBFbHNlLCB1c2UgY3VycmVudCBNTVIgc3RhdGUuMHZlcmlmeV9wcm9vZggYbGVhdmVzjQ4UcHJvb2aVDpkOFPQgVmVyaWZ5IE1NUiBwcm9vZiBhZ2FpbnN0IG9uLWNoYWluIE1NUiBmb3IgYSBiYXRjaCBvZiBsZWF2ZXMuAHEBIE5vdGUgdGhpcyBmdW5jdGlvbiB3aWxsIHVzZSBvbi1jaGFpbiBNTVIgcm9vdCBoYXNoIGFuZCBjaGVjayBpZiB0aGUgcHJvb2YgbWF0Y2hlcyB0aGUgaGFzaC5tASBOb3RlLCB0aGUgbGVhdmVzIHNob3VsZCBiZSBzb3J0ZWQgc3VjaCB0aGF0IGNvcnJlc3BvbmRpbmcgbGVhdmVzIGFuZCBsZWFmIGluZGljZXMgaGF2ZSB0aGWVASBzYW1lIHBvc2l0aW9uIGluIGJvdGggdGhlIGBsZWF2ZXNgIHZlY3RvciBhbmQgdGhlIGBsZWFmX2luZGljZXNgIHZlY3RvciBjb250YWluZWQgaW4gdGhlIFtMZWFmUHJvb2ZdWHZlcmlmeV9wcm9vZl9zdGF0ZWxlc3MMEHJvb3Q0GGxlYXZlc40OFHByb29mlQ6ZDhwBASBWZXJpZnkgTU1SIHByb29mIGFnYWluc3QgZ2l2ZW4gcm9vdCBoYXNoIGZvciBhIGJhdGNoIG9mIGxlYXZlcy4A/CBOb3RlIHRoaXMgZnVuY3Rpb24gZG9lcyBub3QgcmVxdWlyZSBhbnkgb24tY2hhaW4gc3RvcmFnZSAtIHRoZbwgcHJvb2YgaXMgdmVyaWZpZWQgYWdhaW5zdCBnaXZlbiBNTVIgcm9vdCBoYXNoLgBtASBOb3RlLCB0aGUgbGVhdmVzIHNob3VsZCBiZSBzb3J0ZWQgc3VjaCB0aGF0IGNvcnJlc3BvbmRpbmcgbGVhdmVzIGFuZCBsZWFmIGluZGljZXMgaGF2ZSB0aGWVASBzYW1lIHBvc2l0aW9uIGluIGJvdGggdGhlIGBsZWF2ZXNgIHZlY3RvciBhbmQgdGhlIGBsZWFmX2luZGljZXNgIHZlY3RvciBjb250YWluZWQgaW4gdGhlIFtMZWFmUHJvb2ZdBIQgQVBJIHRvIGludGVyYWN0IHdpdGggTU1SIHBhbGxldC4sQmVlZnlNbXJBcGkITGF1dGhvcml0eV9zZXRfcHJvb2YAJQ0E3CBSZXR1cm4gdGhlIGN1cnJlbnRseSBhY3RpdmUgQkVFRlkgYXV0aG9yaXR5IHNldCBwcm9vZi5gbmV4dF9hdXRob3JpdHlfc2V0X3Byb29mACUNBMggUmV0dXJuIHRoZSBuZXh0L3F1ZXVlZCBCRUVGWSBhdXRob3JpdHkgc2V0IHByb29mLgSQIEFQSSB1c2VmdWwgZm9yIEJFRUZZIGxpZ2h0IGNsaWVudHMuKEdyYW5kcGFBcGkQTGdyYW5kcGFfYXV0aG9yaXRpZXMAzBg9ASBHZXQgdGhlIGN1cnJlbnQgR1JBTkRQQSBhdXRob3JpdGllcyBhbmQgd2VpZ2h0cy4gVGhpcyBzaG91bGQgbm90IGNoYW5nZSBleGNlcHQdASBmb3Igd2hlbiBjaGFuZ2VzIGFyZSBzY2hlZHVsZWQgYW5kIHRoZSBjb3JyZXNwb25kaW5nIGRlbGF5IGhhcyBwYXNzZWQuADUBIFdoZW4gY2FsbGVkIGF0IGJsb2NrIEIsIGl0IHdpbGwgcmV0dXJuIHRoZSBzZXQgb2YgYXV0aG9yaXRpZXMgdGhhdCBzaG91bGQgYmU9ASB1c2VkIHRvIGZpbmFsaXplIGRlc2NlbmRhbnRzIG9mIHRoaXMgYmxvY2sgKEIrMSwgQisyLCAuLi4pLiBUaGUgYmxvY2sgQiBpdHNlbGbAIGlzIGZpbmFsaXplZCBieSB0aGUgYXV0aG9yaXRpZXMgZnJvbSBibG9jayBCLTEutHN1Ym1pdF9yZXBvcnRfZXF1aXZvY2F0aW9uX3Vuc2lnbmVkX2V4dHJpbnNpYwhIZXF1aXZvY2F0aW9uX3Byb29mNQI8a2V5X293bmVyX3Byb29mcQ4lDiARASBTdWJtaXRzIGFuIHVuc2lnbmVkIGV4dHJpbnNpYyB0byByZXBvcnQgYW4gZXF1aXZvY2F0aW9uLiBUaGUgY2FsbGVy+CBtdXN0IHByb3ZpZGUgdGhlIGVxdWl2b2NhdGlvbiBwcm9vZiBhbmQgYSBrZXkgb3duZXJzaGlwIHByb29m/CAoc2hvdWxkIGJlIG9idGFpbmVkIHVzaW5nIGBnZW5lcmF0ZV9rZXlfb3duZXJzaGlwX3Byb29mYCkuIFRoZQUBIGV4dHJpbnNpYyB3aWxsIGJlIHVuc2lnbmVkIGFuZCBzaG91bGQgb25seSBiZSBhY2NlcHRlZCBmb3IgbG9jYWwVASBhdXRob3JzaGlwIChub3QgdG8gYmUgYnJvYWRjYXN0IHRvIHRoZSBuZXR3b3JrKS4gVGhpcyBtZXRob2QgcmV0dXJucwkBIGBOb25lYCB3aGVuIGNyZWF0aW9uIG9mIHRoZSBleHRyaW5zaWMgZmFpbHMsIGUuZy4gaWYgZXF1aXZvY2F0aW9uBQEgcmVwb3J0aW5nIGlzIGRpc2FibGVkIGZvciB0aGUgZ2l2ZW4gcnVudGltZSAoaS5lLiB0aGlzIG1ldGhvZCBpcwUBIGhhcmRjb2RlZCB0byByZXR1cm4gYE5vbmVgKS4gT25seSB1c2VmdWwgaW4gYW4gb2ZmY2hhaW4gY29udGV4dC5wZ2VuZXJhdGVfa2V5X293bmVyc2hpcF9wcm9vZggYc2V0X2lkMDBhdXRob3JpdHlfaWTUdQ4sCQEgR2VuZXJhdGVzIGEgcHJvb2Ygb2Yga2V5IG93bmVyc2hpcCBmb3IgdGhlIGdpdmVuIGF1dGhvcml0eSBpbiB0aGX8IGdpdmVuIHNldC4gQW4gZXhhbXBsZSB1c2FnZSBvZiB0aGlzIG1vZHVsZSBpcyBjb3VwbGVkIHdpdGggdGhlBQEgc2Vzc2lvbiBoaXN0b3JpY2FsIG1vZHVsZSB0byBwcm92ZSB0aGF0IGEgZ2l2ZW4gYXV0aG9yaXR5IGtleSBpcw0BIHRpZWQgdG8gYSBnaXZlbiBzdGFraW5nIGlkZW50aXR5IGR1cmluZyBhIHNwZWNpZmljIHNlc3Npb24uIFByb29mcxEBIG9mIGtleSBvd25lcnNoaXAgYXJlIG5lY2Vzc2FyeSBmb3Igc3VibWl0dGluZyBlcXVpdm9jYXRpb24gcmVwb3J0cy4RASBOT1RFOiBldmVuIHRob3VnaCB0aGUgQVBJIHRha2VzIGEgYHNldF9pZGAgYXMgcGFyYW1ldGVyIHRoZSBjdXJyZW50/CBpbXBsZW1lbnRhdGlvbnMgaWdub3JlIHRoaXMgcGFyYW1ldGVyIGFuZCBpbnN0ZWFkIHJlbHkgb24gdGhpcw0BIG1ldGhvZCBiZWluZyBjYWxsZWQgYXQgdGhlIGNvcnJlY3QgYmxvY2sgaGVpZ2h0LCBpLmUuIGFueSBwb2ludCBhdBUBIHdoaWNoIHRoZSBnaXZlbiBzZXQgaWQgaXMgbGl2ZSBvbi1jaGFpbi4gRnV0dXJlIGltcGxlbWVudGF0aW9ucyB3aWxsDQEgaW5zdGVhZCB1c2UgaW5kZXhlZCBkYXRhIHRocm91Z2ggYW4gb2ZmY2hhaW4gd29ya2VyLCBub3QgcmVxdWlyaW5neCBvbGRlciBzdGF0ZXMgdG8gYmUgYXZhaWxhYmxlLjhjdXJyZW50X3NldF9pZAAwBJggR2V0IGN1cnJlbnQgR1JBTkRQQSBhdXRob3JpdHkgc2V0IGlkLiQBASBBUElzIGZvciBpbnRlZ3JhdGluZyB0aGUgR1JBTkRQQSBmaW5hbGl0eSBnYWRnZXQgaW50byBydW50aW1lcy7AIFRoaXMgc2hvdWxkIGJlIGltcGxlbWVudGVkIG9uIHRoZSBydW50aW1lIHNpZGUuABUBIFRoaXMgaXMgcHJpbWFyaWx5IHVzZWQgZm9yIG5lZ290aWF0aW5nIGF1dGhvcml0eS1zZXQgY2hhbmdlcyBmb3IgdGhlDQEgZ2FkZ2V0LiBHUkFORFBBIHVzZXMgYSBzaWduYWxpbmcgbW9kZWwgb2YgY2hhbmdpbmcgYXV0aG9yaXR5IHNldHM6MQEgY2hhbmdlcyBzaG91bGQgYmUgc2lnbmFsZWQgd2l0aCBhIGRlbGF5IG9mIE4gYmxvY2tzLCBhbmQgdGhlbiBhdXRvbWF0aWNhbGx55CBhcHBsaWVkIGluIHRoZSBydW50aW1lIGFmdGVyIHRob3NlIE4gYmxvY2tzIGhhdmUgcGFzc2VkLgD8IFRoZSBjb25zZW5zdXMgcHJvdG9jb2wgd2lsbCBjb29yZGluYXRlIHRoZSBoYW5kb2ZmIGV4dGVybmFsbHkuHEJhYmVBcGkYNGNvbmZpZ3VyYXRpb24AnQ4EjCBSZXR1cm4gdGhlIGNvbmZpZ3VyYXRpb24gZm9yIEJBQkUuTGN1cnJlbnRfZXBvY2hfc3RhcnQAqQEExCBSZXR1cm5zIHRoZSBzbG90IHRoYXQgc3RhcnRlZCB0aGUgY3VycmVudCBlcG9jaC40Y3VycmVudF9lcG9jaAChDgTEIFJldHVybnMgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoZSBjdXJyZW50IGVwb2NoLihuZXh0X2Vwb2NoAKEOCAEBIFJldHVybnMgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoZSBuZXh0IGVwb2NoICh3aGljaCB3YXMgYWxyZWFkeVwgcHJldmlvdXNseSBhbm5vdW5jZWQpLnBnZW5lcmF0ZV9rZXlfb3duZXJzaGlwX3Byb29mCBBzbG90qQEwYXV0aG9yaXR5X2lkpQGlDiwJASBHZW5lcmF0ZXMgYSBwcm9vZiBvZiBrZXkgb3duZXJzaGlwIGZvciB0aGUgZ2l2ZW4gYXV0aG9yaXR5IGluIHRoZQ0BIGN1cnJlbnQgZXBvY2guIEFuIGV4YW1wbGUgdXNhZ2Ugb2YgdGhpcyBtb2R1bGUgaXMgY291cGxlZCB3aXRoIHRoZQUBIHNlc3Npb24gaGlzdG9yaWNhbCBtb2R1bGUgdG8gcHJvdmUgdGhhdCBhIGdpdmVuIGF1dGhvcml0eSBrZXkgaXMNASB0aWVkIHRvIGEgZ2l2ZW4gc3Rha2luZyBpZGVudGl0eSBkdXJpbmcgYSBzcGVjaWZpYyBzZXNzaW9uLiBQcm9vZnMRASBvZiBrZXkgb3duZXJzaGlwIGFyZSBuZWNlc3NhcnkgZm9yIHN1Ym1pdHRpbmcgZXF1aXZvY2F0aW9uIHJlcG9ydHMuCQEgTk9URTogZXZlbiB0aG91Z2ggdGhlIEFQSSB0YWtlcyBhIGBzbG90YCBhcyBwYXJhbWV0ZXIgdGhlIGN1cnJlbnQJASBpbXBsZW1lbnRhdGlvbnMgaWdub3JlcyB0aGlzIHBhcmFtZXRlciBhbmQgaW5zdGVhZCByZWxpZXMgb24gdGhpcw0BIG1ldGhvZCBiZWluZyBjYWxsZWQgYXQgdGhlIGNvcnJlY3QgYmxvY2sgaGVpZ2h0LCBpLmUuIGFueSBwb2ludCBhdPAgd2hpY2ggdGhlIGVwb2NoIGZvciB0aGUgZ2l2ZW4gc2xvdCBpcyBsaXZlIG9uLWNoYWluLiBGdXR1cmUJASBpbXBsZW1lbnRhdGlvbnMgd2lsbCBpbnN0ZWFkIHVzZSBpbmRleGVkIGRhdGEgdGhyb3VnaCBhbiBvZmZjaGFpbtAgd29ya2VyLCBub3QgcmVxdWlyaW5nIG9sZGVyIHN0YXRlcyB0byBiZSBhdmFpbGFibGUutHN1Ym1pdF9yZXBvcnRfZXF1aXZvY2F0aW9uX3Vuc2lnbmVkX2V4dHJpbnNpYwhIZXF1aXZvY2F0aW9uX3Byb29mnQE8a2V5X293bmVyX3Byb29mqQ4lDiARASBTdWJtaXRzIGFuIHVuc2lnbmVkIGV4dHJpbnNpYyB0byByZXBvcnQgYW4gZXF1aXZvY2F0aW9uLiBUaGUgY2FsbGVy+CBtdXN0IHByb3ZpZGUgdGhlIGVxdWl2b2NhdGlvbiBwcm9vZiBhbmQgYSBrZXkgb3duZXJzaGlwIHByb29m/CAoc2hvdWxkIGJlIG9idGFpbmVkIHVzaW5nIGBnZW5lcmF0ZV9rZXlfb3duZXJzaGlwX3Byb29mYCkuIFRoZQUBIGV4dHJpbnNpYyB3aWxsIGJlIHVuc2lnbmVkIGFuZCBzaG91bGQgb25seSBiZSBhY2NlcHRlZCBmb3IgbG9jYWwVASBhdXRob3JzaGlwIChub3QgdG8gYmUgYnJvYWRjYXN0IHRvIHRoZSBuZXR3b3JrKS4gVGhpcyBtZXRob2QgcmV0dXJucwkBIGBOb25lYCB3aGVuIGNyZWF0aW9uIG9mIHRoZSBleHRyaW5zaWMgZmFpbHMsIGUuZy4gaWYgZXF1aXZvY2F0aW9uBQEgcmVwb3J0aW5nIGlzIGRpc2FibGVkIGZvciB0aGUgZ2l2ZW4gcnVudGltZSAoaS5lLiB0aGlzIG1ldGhvZCBpcwUBIGhhcmRjb2RlZCB0byByZXR1cm4gYE5vbmVgKS4gT25seSB1c2VmdWwgaW4gYW4gb2ZmY2hhaW4gY29udGV4dC4EuCBBUEkgbmVjZXNzYXJ5IGZvciBibG9jayBhdXRob3JzaGlwIHdpdGggQkFCRS5UQXV0aG9yaXR5RGlzY292ZXJ5QXBpBCxhdXRob3JpdGllcwBpCQQZASBSZXRyaWV2ZSBhdXRob3JpdHkgaWRlbnRpZmllcnMgb2YgdGhlIGN1cnJlbnQgYW5kIG5leHQgYXV0aG9yaXR5IHNldC4QdCBUaGUgYXV0aG9yaXR5IGRpc2NvdmVyeSBhcGkuAFEBIFRoaXMgYXBpIGlzIHVzZWQgYnkgdGhlIGBjbGllbnQvYXV0aG9yaXR5LWRpc2NvdmVyeWAgbW9kdWxlIHRvIHJldHJpZXZlIGlkZW50aWZpZXJznCBvZiB0aGUgY3VycmVudCBhbmQgbmV4dCBhdXRob3JpdHkgc2V0LixTZXNzaW9uS2V5cwhUZ2VuZXJhdGVfc2Vzc2lvbl9rZXlzBBBzZWVk0Qw4HBUBIEdlbmVyYXRlIGEgc2V0IG9mIHNlc3Npb24ga2V5cyB3aXRoIG9wdGlvbmFsbHkgdXNpbmcgdGhlIGdpdmVuIHNlZWQuCQEgVGhlIGtleXMgc2hvdWxkIGJlIHN0b3JlZCB3aXRoaW4gdGhlIGtleXN0b3JlIGV4cG9zZWQgdmlhIHJ1bnRpbWU8IGV4dGVybmFsaXRpZXMuALAgVGhlIHNlZWQgbmVlZHMgdG8gYmUgYSB2YWxpZCBgdXRmOGAgc3RyaW5nLgDQIFJldHVybnMgdGhlIGNvbmNhdGVuYXRlZCBTQ0FMRSBlbmNvZGVkIHB1YmxpYyBrZXlzLkxkZWNvZGVfc2Vzc2lvbl9rZXlzBBxlbmNvZGVkOK0ODJggRGVjb2RlIHRoZSBnaXZlbiBwdWJsaWMgc2Vzc2lvbiBrZXlzLgDcIFJldHVybnMgdGhlIGxpc3Qgb2YgcHVibGljIHJhdyBwdWJsaWMga2V5cyArIGtleSB0eXBlLgRoIFNlc3Npb24ga2V5cyBydW50aW1lIGFwaS48QWNjb3VudE5vbmNlQXBpBDRhY2NvdW50X25vbmNlBBxhY2NvdW50ABAEwCBHZXQgY3VycmVudCBhY2NvdW50IG5vbmNlIG9mIGdpdmVuIGBBY2NvdW50SWRgLgSAIFRoZSBBUEkgdG8gcXVlcnkgYWNjb3VudCBub25jZS5UVHJhbnNhY3Rpb25QYXltZW50QXBpEChxdWVyeV9pbmZvCAx1eHRtDQxsZW4QuQ4ARHF1ZXJ5X2ZlZV9kZXRhaWxzCAx1eHRtDQxsZW4QvQ4ATHF1ZXJ5X3dlaWdodF90b19mZWUEGHdlaWdodCgYAExxdWVyeV9sZW5ndGhfdG9fZmVlBBhsZW5ndGgQGAAAZFRyYW5zYWN0aW9uUGF5bWVudENhbGxBcGkQPHF1ZXJ5X2NhbGxfaW5mbwgQY2FsbHUBDGxlbhC5DgRJASBRdWVyeSBpbmZvcm1hdGlvbiBvZiBhIGRpc3BhdGNoIGNsYXNzLCB3ZWlnaHQsIGFuZCBmZWUgb2YgYSBnaXZlbiBlbmNvZGVkIGBDYWxsYC5YcXVlcnlfY2FsbF9mZWVfZGV0YWlscwgQY2FsbHUBDGxlbhC9DgS0IFF1ZXJ5IGZlZSBkZXRhaWxzIG9mIGEgZ2l2ZW4gZW5jb2RlZCBgQ2FsbGAuTHF1ZXJ5X3dlaWdodF90b19mZWUEGHdlaWdodCgYBAEBIFF1ZXJ5IHRoZSBvdXRwdXQgb2YgdGhlIGN1cnJlbnQgYFdlaWdodFRvRmVlYCBnaXZlbiBzb21lIGlucHV0LkxxdWVyeV9sZW5ndGhfdG9fZmVlBBhsZW5ndGgQGAQBASBRdWVyeSB0aGUgb3V0cHV0IG9mIHRoZSBjdXJyZW50IGBMZW5ndGhUb0ZlZWAgZ2l2ZW4gc29tZSBpbnB1dC4ANFhjbVBheW1lbnRBcGkQfHF1ZXJ5X2FjY2VwdGFibGVfcGF5bWVudF9hc3NldHMELHhjbV92ZXJzaW9uEMkOFLQgUmV0dXJucyBhIGxpc3Qgb2YgYWNjZXB0YWJsZSBwYXltZW50IGFzc2V0cy4AMCAjIEFyZ3VtZW50cwBoICogYHhjbV92ZXJzaW9uYDogVmVyc2lvbi5AcXVlcnlfeGNtX3dlaWdodAQcbWVzc2FnZYkF1Q4UqCBSZXR1cm5zIGEgd2VpZ2h0IG5lZWRlZCB0byBleGVjdXRlIGEgWENNLgAwICMgQXJndW1lbnRzAHQgKiBgbWVzc2FnZWA6IGBWZXJzaW9uZWRYY21gLmRxdWVyeV93ZWlnaHRfdG9fYXNzZXRfZmVlCBh3ZWlnaHQoFGFzc2V0vQbZDhjoIENvbnZlcnRzIGEgd2VpZ2h0IGludG8gYSBmZWUgZm9yIHRoZSBzcGVjaWZpZWQgYEFzc2V0SWRgLgAwICMgQXJndW1lbnRzAIggKiBgd2VpZ2h0YDogY29udmVydGlibGUgYFdlaWdodGAufCAqIGBhc3NldGA6IGBWZXJzaW9uZWRBc3NldElkYC5McXVlcnlfZGVsaXZlcnlfZmVlcwgsZGVzdGluYXRpb25FARxtZXNzYWdliQXdDiAdASBHZXQgZGVsaXZlcnkgZmVlcyBmb3Igc2VuZGluZyBhIHNwZWNpZmljIGBtZXNzYWdlYCB0byBhIGBkZXN0aW5hdGlvbmAu9CBUaGVzZSBhbHdheXMgY29tZSBpbiBhIHNwZWNpZmljIGFzc2V0LCBkZWZpbmVkIGJ5IHRoZSBjaGFpbi4AMCAjIEFyZ3VtZW50c4EBICogYG1lc3NhZ2VgOiBUaGUgbWVzc2FnZSB0aGF0J2xsIGJlIHNlbnQsIG5lY2Vzc2FyeSBiZWNhdXNlIG1vc3QgZGVsaXZlcnkgZmVlcyBhcmUgYmFzZWQgb24gdGhlXCAgIHNpemUgb2YgdGhlIG1lc3NhZ2UuYQEgKiBgZGVzdGluYXRpb25gOiBUaGUgZGVzdGluYXRpb24gdG8gc2VuZCB0aGUgbWVzc2FnZSB0by4gRGlmZmVyZW50IGRlc3RpbmF0aW9ucyBtYXkgdXNlwCAgIGRpZmZlcmVudCBzZW5kZXJzIHRoYXQgY2hhcmdlIGRpZmZlcmVudCBmZWVzLixwIEEgdHJhaXQgb2YgWENNIHBheW1lbnQgQVBJLgCoIEFQSSBwcm92aWRlcyBmdW5jdGlvbmFsaXR5IGZvciBvYnRhaW5pbmc6AMQgKiB0aGUgd2VpZ2h0IHJlcXVpcmVkIHRvIGV4ZWN1dGUgYW4gWENNIG1lc3NhZ2UsBQEgKiBhIGxpc3Qgb2YgYWNjZXB0YWJsZSBgQXNzZXRJZGBzIGZvciBtZXNzYWdlIGV4ZWN1dGlvbiBwYXltZW50LAEBICogdGhlIGNvc3Qgb2YgdGhlIHdlaWdodCBpbiB0aGUgc3BlY2lmaWVkIGFjY2VwdGFibGUgYEFzc2V0SWRgLqAgKiB0aGUgZmVlcyBmb3IgYW4gWENNIG1lc3NhZ2UgZGVsaXZlcnkuAPAgVG8gZGV0ZXJtaW5lIHRoZSBleGVjdXRpb24gd2VpZ2h0IG9mIHRoZSBjYWxscyByZXF1aXJlZCBmb3J1ASBbYHhjbTo6bGF0ZXN0OjpJbnN0cnVjdGlvbjo6VHJhbnNhY3RgXSBpbnN0cnVjdGlvbiwgYFRyYW5zYWN0aW9uUGF5bWVudENhbGxBcGlgIGNhbiBiZSB1c2VkLiREcnlSdW5BcGkIMGRyeV9ydW5fY2FsbAgYb3JpZ2lufQIQY2FsbHUB4Q4EOCBEcnkgcnVuIGNhbGwuLGRyeV9ydW5feGNtCDxvcmlnaW5fbG9jYXRpb25FAQx4Y22NBgEPBFAgRHJ5IHJ1biBYQ00gcHJvZ3JhbSSxASBBUEkgZm9yIGRyeS1ydW5uaW5nIGV4dHJpbnNpY3MgYW5kIFhDTSBwcm9ncmFtcyB0byBnZXQgdGhlIHByb2dyYW1zIHRoYXQgbmVlZCB0byBiZSBwYXNzZWQgdG8gdGhlIGZlZXMgQVBJLgCBASBBbGwgY2FsbHMgcmV0dXJuIGEgdmVjdG9yIG9mIHR1cGxlcyAobG9jYXRpb24sIHhjbSkgd2hlcmUgZWFjaCAieGNtIiBpcyBleGVjdXRlZCBpbiAibG9jYXRpb24iLuQgSWYgdGhlcmUncyBsb2NhbCBleGVjdXRpb24sIHRoZSBsb2NhdGlvbiB3aWxsIGJlICJIZXJlIi4dASBUaGlzIHZlY3RvciBjYW4gYmUgdXNlZCB0byBjYWxjdWxhdGUgYm90aCBleGVjdXRpb24gYW5kIGRlbGl2ZXJ5IGZlZXMuAJkBIENhbGxzIG9yIFhDTXMgbWlnaHQgZmFpbCB3aGVuIGV4ZWN1dGVkLCB0aGlzIGRvZXNuJ3QgbWVhbiB0aGUgcmVzdWx0IG9mIHRoZXNlIGNhbGxzIHdpbGwgYmUgYW4gYEVycmAuZQEgSW4gdGhvc2UgY2FzZXMsIHRoZXJlIG1pZ2h0IHN0aWxsIGJlIGEgdmFsaWQgcmVzdWx0LCB3aXRoIHRoZSBleGVjdXRpb24gZXJyb3IgaW5zaWRlIGl0LmUBIFRoZSBvbmx5IHJlYXNvbnMgd2h5IHRoZXNlIGNhbGxzIG1pZ2h0IHJldHVybiBhbiBlcnJvciBhcmUgbGlzdGVkIGluIHRoZSBbYEVycm9yYF0gZW51bS5QTG9jYXRpb25Ub0FjY291bnRBcGkEQGNvbnZlcnRfbG9jYXRpb24EIGxvY2F0aW9uRQEJDwSQIENvbnZlcnRzIGBMb2NhdGlvbmAgdG8gYEFjY291bnRJZGAuBA0BIEFQSSBmb3IgdXNlZnVsIGNvbnZlcnNpb25zIGJldHdlZW4gWENNIGBMb2NhdGlvbmAgYW5kIGBBY2NvdW50SWRgLjhHZW5lc2lzQnVpbGRlcgwsYnVpbGRfc3RhdGUEEGpzb244EQ8kZQEgQnVpbGQgYFJ1bnRpbWVHZW5lc2lzQ29uZmlnYCBmcm9tIGEgSlNPTiBibG9iIG5vdCB1c2luZyBhbnkgZGVmYXVsdHMgYW5kIHN0b3JlIGl0IGluIHRoZSQgc3RvcmFnZS4A+QEgSW4gdGhlIGNhc2Ugb2YgYSBGUkFNRS1iYXNlZCBydW50aW1lLCB0aGlzIGZ1bmN0aW9uIGRlc2VyaWFsaXplcyB0aGUgZnVsbCBgUnVudGltZUdlbmVzaXNDb25maWdgIGZyb20gdGhlIGdpdmVuIEpTT04gYmxvYiBhbmRZASBwdXRzIGl0IGludG8gdGhlIHN0b3JhZ2UuIElmIHRoZSBwcm92aWRlZCBKU09OIGJsb2IgaXMgaW5jb3JyZWN0IG9yIGluY29tcGxldGUgb3IgdGhltCBkZXNlcmlhbGl6YXRpb24gZmFpbHMsIGFuIGVycm9yIGlzIHJldHVybmVkLgBdASBQbGVhc2Ugbm90ZSB0aGF0IHByb3ZpZGVkIEpTT04gYmxvYiBtdXN0IGNvbnRhaW4gYWxsIGBSdW50aW1lR2VuZXNpc0NvbmZpZ2AgZmllbGRzLCBub1wgZGVmYXVsdHMgd2lsbCBiZSB1c2VkLihnZXRfcHJlc2V0BAhpZBUP0Qw4YQEgUmV0dXJucyBhIEpTT04gYmxvYiByZXByZXNlbnRhdGlvbiBvZiB0aGUgYnVpbHQtaW4gYFJ1bnRpbWVHZW5lc2lzQ29uZmlnYCBpZGVudGlmaWVkIGJ5GCBgaWRgLgA9ASBJZiBgaWRgIGlzIGBOb25lYCB0aGUgZnVuY3Rpb24gcmV0dXJucyBKU09OIGJsb2IgcmVwcmVzZW50YXRpb24gb2YgdGhlIGRlZmF1bHRJASBgUnVudGltZUdlbmVzaXNDb25maWdgIHN0cnVjdCBvZiB0aGUgcnVudGltZS4gSW1wbGVtZW50YXRpb24gbXVzdCBwcm92aWRlIGRlZmF1bHRgIGBSdW50aW1lR2VuZXNpc0NvbmZpZ2AuACEBIE90aGVyd2lzZSBmdW5jdGlvbiByZXR1cm5zIGEgSlNPTiByZXByZXNlbnRhdGlvbiBvZiB0aGUgYnVpbHQtaW4sIG5hbWVkUQEgYFJ1bnRpbWVHZW5lc2lzQ29uZmlnYCBwcmVzZXQgaWRlbnRpZmllZCBieSBgaWRgLCBvciBgTm9uZWAgaWYgc3VjaCBwcmVzZXQgZG9lcyBub3RlASBleGlzdHMuIFJldHVybmVkIGBWZWM8dTg+YCBjb250YWlucyBieXRlcyBvZiBKU09OIGJsb2IgKHBhdGNoKSB3aGljaCBjb21wcmlzZXMgYSBsaXN0IG9mTQEgKHBvdGVudGlhbGx5IG5lc3RlZCkga2V5LXZhbHVlIHBhaXJzIHRoYXQgYXJlIGludGVuZGVkIGZvciBjdXN0b21pemluZyB0aGUgZGVmYXVsdGUBIHJ1bnRpbWUgZ2VuZXNpcyBjb25maWcuIFRoZSBwYXRjaCBzaGFsbCBiZSBtZXJnZWQgKHJmYzczODYpIHdpdGggdGhlIEpTT04gcmVwcmVzZW50YXRpb25hASBvZiB0aGUgZGVmYXVsdCBgUnVudGltZUdlbmVzaXNDb25maWdgIHRvIGNyZWF0ZSBhIGNvbXByZWhlbnNpdmUgZ2VuZXNpcyBjb25maWcgdGhhdCBjYW6EIGJlIHVzZWQgaW4gYGJ1aWxkX3N0YXRlYCBtZXRob2QuMHByZXNldF9uYW1lcwAZDxBRASBSZXR1cm5zIGEgbGlzdCBvZiBpZGVudGlmaWVycyBmb3IgYXZhaWxhYmxlIGJ1aWx0aW4gYFJ1bnRpbWVHZW5lc2lzQ29uZmlnYCBwcmVzZXRzLgBhASBUaGUgcHJlc2V0cyBmcm9tIHRoZSBsaXN0IGNhbiBiZSBxdWVyaWVkIHdpdGggW2BHZW5lc2lzQnVpbGRlcjo6Z2V0X3ByZXNldGBdIG1ldGhvZC4gSWYBASBubyBuYW1lZCBwcmVzZXRzIGFyZSBwcm92aWRlZCBieSB0aGUgcnVudGltZSB0aGUgbGlzdCBpcyBlbXB0eS4E6CBBUEkgdG8gaW50ZXJhY3Qgd2l0aCBSdW50aW1lR2VuZXNpc0NvbmZpZyBmb3IgdGhlIHJ1bnRpbWV1AVQdDwA="; +var dot_metadata_default = binMeta; +export { + dot_metadata_default as default +}; diff --git a/examples/with-vite-papi/.papi/descriptors/dist/dot_metadata.d.ts b/examples/with-vite-papi/.papi/descriptors/dist/dot_metadata.d.ts new file mode 100644 index 0000000..e54c947 --- /dev/null +++ b/examples/with-vite-papi/.papi/descriptors/dist/dot_metadata.d.ts @@ -0,0 +1,2 @@ +declare const binMeta: string; +export default binMeta; diff --git a/examples/with-vite-papi/.papi/descriptors/dist/index.d.ts b/examples/with-vite-papi/.papi/descriptors/dist/index.d.ts new file mode 100644 index 0000000..a16f64d --- /dev/null +++ b/examples/with-vite-papi/.papi/descriptors/dist/index.d.ts @@ -0,0 +1,9 @@ +export { default as dot, DotCallData } from "./dot"; +export type * from "./dot"; +export { default as ksm, KsmCallData } from "./ksm"; +export type * from "./ksm"; +export { default as paseo, PaseoCallData } from "./paseo"; +export type * from "./paseo"; +export { default as wnd, WndCallData } from "./wnd"; +export type * from "./wnd"; +export { DigestItem, Phase, DispatchClass, BagsListListListError, TokenError, ArithmeticError, TransactionalError, PreimageEvent, IndicesEvent, BalanceStatus, TransactionPaymentEvent, StakingEvent, StakingRewardDestination, StakingForcing, OffencesEvent, SessionEvent, GrandpaEvent, VersionedLocatableAsset, XcmV3Junctions, XcmV3Junction, XcmV3JunctionNetworkId, XcmV3JunctionBodyId, XcmV2JunctionBodyPart, XcmV3MultiassetAssetId, DotXcmVersionedLocation, XcmV2MultilocationJunctions, XcmV2Junction, XcmV2NetworkId, XcmV2BodyId, ConvictionVotingEvent, PreimagesBounded, CommonClaimsEvent, VestingEvent, BountiesEvent, ChildBountiesEvent, ElectionProviderMultiPhaseEvent, ElectionProviderMultiPhaseElectionCompute, ElectionProviderMultiPhasePhase, BagsListEvent, NominationPoolsEvent, NominationPoolsPoolState, NominationPoolsCommissionClaimPermission, ParachainsInclusionEvent, ParachainsParasEvent, ParachainsHrmpEvent, ParachainsDisputesEvent, ParachainsDisputeLocation, ParachainsDisputeResult, CommonParasRegistrarEvent, CommonSlotsEvent, CommonAuctionsEvent, PolkadotRuntimeParachainsCoretimeEvent, XcmV4TraitsOutcome, XcmV3TraitsError, XcmV4Instruction, XcmV3MultiassetFungibility, XcmV3MultiassetAssetInstance, XcmV4Response, XcmV3MaybeErrorCode, XcmV2OriginKind, XcmV4AssetAssetFilter, XcmV4AssetWildAsset, XcmV2MultiassetWildFungibility, XcmV3WeightLimit, DotXcmVersionedAssets, XcmV2MultiassetAssetId, XcmV2MultiassetFungibility, XcmV2MultiassetAssetInstance, ParachainsInclusionAggregateMessageOrigin, ParachainsInclusionUmpQueueId, AssetRateEvent, PolkadotRuntimeOriginCaller, DispatchRawOrigin, GovernanceOrigin, ParachainsOrigin, XcmPalletOrigin, PreimageOldRequestStatus, PreimageRequestStatus, BabeDigestsNextConfigDescriptor, BabeAllowedSlots, BabeDigestsPreDigest, BalancesTypesReasons, PreimagePalletHoldReason, WestendRuntimeRuntimeFreezeReason, NominationPoolsPalletFreezeReason, TransactionPaymentReleases, GrandpaStoredState, TreasuryPaymentState, ConvictionVotingVoteVoting, ConvictionVotingVoteAccountVote, VotingConviction, TraitsScheduleDispatchTime, ClaimsStatementKind, Version, BountiesBountyStatus, ChildBountyStatus, NominationPoolsClaimPermission, PolkadotPrimitivesV6ExecutorParamsExecutorParam, PolkadotPrimitivesV6PvfPrepKind, PvfExecKind, ValidityAttestation, PolkadotPrimitivesV6DisputeStatement, PolkadotPrimitivesV6ValidDisputeStatementKind, InvalidDisputeStatementKind, PolkadotRuntimeParachainsSchedulerPalletCoreOccupied, PolkadotRuntimeParachainsSchedulerCommonAssignment, ParachainsParasParaLifecycle, UpgradeGoAhead, UpgradeRestriction, SlashingOffenceKind, BrokerCoretimeInterfaceCoreAssignment, MultiSigner, CommonCrowdloanLastContribution, XcmPalletQueryStatus, XcmVersionedResponse, XcmV2Response, XcmV2TraitsError, XcmV3Response, XcmPalletVersionMigrationStage, DotXcmVersionedAssetId, ReferendaTypesCurve, MultiAddress, BalancesAdjustmentDirection, StakingPalletConfigOpBig, StakingPalletConfigOp, GrandpaEquivocation, NominationPoolsBondExtra, NominationPoolsConfigOp, MultiSignature, DotXcmVersionedXcm, XcmV2Instruction, XcmV2MultiAssetFilter, XcmV2MultiassetWildMultiAsset, XcmV2WeightLimit, XcmV3Instruction, XcmV3MultiassetMultiAssetFilter, XcmV3MultiassetWildMultiAsset, TransactionValidityError, TransactionValidityInvalidTransaction, TransactionValidityUnknownTransaction, TransactionValidityTransactionSource, CoreState, OccupiedCoreAssumption, CandidateEvent, MmrPrimitivesError, RecoveryEvent, XcmV5Junctions, XcmV5Junction, XcmV5NetworkId, XcmVersionedLocation, PolkadotRuntimeCommonAssignedSlotsEvent, XcmV5Instruction, XcmV5AssetFilter, XcmV5WildAsset, XcmVersionedAssets, RootTestingEvent, PolkadotRuntimeCommonIdentityMigratorEvent, IdentityJudgement, IdentityData, WestendRuntimeGovernanceOriginsPalletCustomOriginsOrigin, XcmVersionedAssetId, XcmVersionedXcm, PolkadotRuntimeCommonAssignedSlotsSlotLeasePeriodStart, ExtensionsCheckMortality, XcmVersionedAsset } from './common-types'; diff --git a/examples/with-vite-papi/.papi/descriptors/dist/index.js b/examples/with-vite-papi/.papi/descriptors/dist/index.js new file mode 100644 index 0000000..9190be2 --- /dev/null +++ b/examples/with-vite-papi/.papi/descriptors/dist/index.js @@ -0,0 +1,580 @@ +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __esm = (fn, res) => function __init() { + return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res; +}; +var __export = (target, all) => { + for (var name in all) + __defProp(target, name, { get: all[name], enumerable: true }); +}; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); + +// .papi/descriptors/src/descriptors.ts +var descriptors_exports = {}; +__export(descriptors_exports, { + Dot: () => Dot, + Ksm: () => Ksm, + Paseo: () => Paseo, + Wnd: () => Wnd +}); +var minified, commonTrees, tokens, replaceTokens, tokenizedCommonTrees, unwrap, getChainDescriptors, Dot, Ksm, Paseo, Wnd; +var init_descriptors = __esm({ + ".papi/descriptors/src/descriptors.ts"() { + [minified, commonTrees, tokens] = JSON.parse(`[{"dot":{"345":{"18":{"0":0,"1":1,"2":2,"3":3,"4":1,"5":4,"6":5,"7":1,"8":6,"9":7,"10":8,"11":1,"12":9,"13":10,"14":2,"15":2,"16":11,"17":12},"23":0,"27":1,"45":2,"48":3,"50":4,"57":5,"60":6,"62":7,"106":8,"109":9,"112":10,"118":11,"125":12,"127":13,"134":14,"137":15,"143":16,"144":17,"146":18,"147":19,"148":20,"150":21,"153":17,"156":22,"158":23,"160":24,"165":25,"178":26,"182":27,"204":28,"209":29,"210":17,"214":30,"219":31,"221":32,"224":33,"229":34,"251":35,"254":36,"258":37,"271":38,"277":39,"282":40,"284":41,"290":42,"293":43,"296":44,"298":45,"303":46,"308":47,"309":17,"313":48,"328":49,"332":50,"334":51,"337":52,"341":53,"344":54},"644":{"18":57,"23":{"357":35,"358":36,"359":37,"360":38,"361":39,"362":40,"363":41,"364":42,"365":43,"366":38},"27":58,"45":59,"48":60,"50":61,"57":62,"60":17,"62":17,"106":63,"109":17,"112":17,"118":64,"125":65,"127":17,"134":66,"137":67,"143":68,"144":17,"146":{"442":210,"443":210,"444":211,"445":212},"147":69,"148":70,"150":71,"153":{"457":237,"458":238,"459":237,"460":239,"461":237,"462":240},"156":{"463":246,"464":247,"465":247,"466":128,"467":248,"468":249,"469":250,"470":250,"471":251,"472":252},"158":{"473":257,"474":258,"475":259,"476":260},"160":72,"165":73,"178":74,"182":75,"204":76,"209":77,"210":17,"214":78,"219":17,"221":17,"224":79,"229":17,"251":80,"254":81,"258":17,"271":82,"277":17,"282":83,"284":84,"290":85,"293":17,"296":86,"298":87,"303":88,"308":89,"309":90,"313":91,"328":92,"332":93,"334":94,"337":95,"341":17,"344":17},"876":{"18":{"645":24,"646":25,"647":26,"648":27,"649":27,"650":28,"651":29},"23":{"652":44,"653":44,"654":45,"655":46,"656":47,"657":47,"658":47,"659":47,"660":47},"27":97,"45":17,"48":17,"50":98,"57":99,"60":100,"62":17,"106":101,"109":102,"112":17,"118":103,"125":104,"127":17,"134":105,"137":106,"143":107,"144":17,"146":{"738":213,"739":213,"740":214},"147":108,"148":109,"150":110,"153":{"745":241,"746":26,"747":26,"748":26,"749":242,"750":243},"156":{"751":243,"752":253,"753":254,"754":255,"755":255},"158":{"756":261,"757":262,"758":263,"759":264},"160":111,"165":112,"178":113,"182":114,"204":115,"209":{"676":150,"793":358,"794":359,"795":155,"796":26},"210":17,"214":17,"219":17,"221":116,"224":17,"229":17,"251":117,"254":17,"258":17,"271":118,"277":17,"282":119,"284":17,"290":120,"293":17,"296":121,"298":122,"303":123,"308":{"778":448,"831":472,"832":472,"833":448,"834":448,"835":448,"836":473,"837":448,"838":474,"839":448},"309":124,"313":125,"328":126,"332":127,"334":128,"337":17,"341":17,"344":17},"974":{"18":129,"23":130,"27":17,"45":131,"48":132,"50":133,"57":134,"60":135,"62":17,"106":136,"109":17,"112":17,"118":17,"125":137,"127":17,"134":138,"137":139,"143":140,"144":17,"146":17,"147":17,"148":141,"150":142,"153":143,"156":144,"158":145,"160":146,"165":147,"178":148,"182":149,"204":150,"209":133,"210":17,"214":17,"219":17,"221":17,"224":17,"229":17,"251":151,"254":17,"258":17,"271":17,"277":17,"282":17,"284":17,"290":152,"293":17,"296":153,"298":154,"303":155,"308":156,"309":157,"313":158,"328":17,"332":159,"334":17,"337":137,"341":17,"344":17},"1087":{"198":161,"976":162,"980":163,"988":{"984":556,"985":557,"986":558,"987":559},"996":164,"999":165,"1001":166,"1003":167,"1035":168,"1040":169,"1046":170,"1049":171,"1052":172,"1057":173,"1059":174,"1062":175,"1064":176,"1069":177,"1072":{"1067":622,"1068":623,"1070":624,"1071":625},"1077":178,"1080":{"1078":630,"1079":631},"1082":179,"1086":180}},"ksm":{"345":{"18":{"0":0,"1":1,"2":2,"3":3,"4":1,"5":4,"6":5,"7":1,"8":6,"9":7,"10":636,"11":1,"12":9,"13":10,"14":2,"15":2,"16":11,"17":12},"23":{"19":1,"20":707,"21":32,"22":33},"27":1,"45":2,"48":3,"50":4,"57":{"0":73,"51":55,"52":55,"53":74,"54":75,"55":638,"56":77},"60":6,"62":7,"106":8,"109":9,"112":10,"118":11,"125":12,"127":13,"134":14,"137":15,"143":{"138":1,"139":639,"140":199,"141":106,"142":4},"144":17,"146":18,"147":19,"148":20,"150":21,"153":17,"156":{"154":713,"155":245},"158":23,"160":24,"165":25,"178":{"168":1,"169":285,"170":286,"171":287,"172":1,"173":288,"174":1,"175":289,"176":724,"177":291},"182":27,"204":28,"209":29,"210":17,"214":30,"219":31,"221":32,"224":33,"229":34,"251":35,"254":36,"258":37,"271":38,"277":39,"282":40,"284":41,"293":43,"296":44,"298":45,"303":46,"308":47,"309":17,"328":49,"332":50,"334":51,"337":52,"341":53,"344":54,"1090":{"1088":106,"1089":314,"IdToIndex":641,"IndexToId":642,"Voting":643,"VotingCleanup":5},"1091":{"138":1,"139":652,"140":653,"141":106,"142":4},"1092":{"147":665,"205":97,"1088":1,"1089":666,"Pot":55,"Founder":97,"Rules":6,"Payouts":667,"MemberByIndex":668,"SuspendedMembers":666,"RoundCount":1,"Bids":669,"Candidates":670,"Skeptic":97,"Votes":671,"VoteClearCursor":672,"NextHead":673,"ChallengeRoundCount":1,"Defending":674,"DefenderVotes":675},"1095":55,"1096":{"QueueTotals":727,"Queues":728,"Summary":729,"Receipts":730},"1097":{"0":73,"51":55,"52":55,"53":74,"54":75,"55":638,"56":739},"1098":42},"644":{"18":57,"23":{"357":708,"358":36,"359":709,"360":38,"361":710,"362":711,"363":41,"364":42,"365":43,"366":38},"27":58,"45":59,"48":60,"50":61,"57":62,"60":17,"62":17,"106":63,"109":17,"112":17,"118":64,"125":65,"127":17,"134":66,"137":67,"143":96,"144":17,"146":{"442":210,"443":210,"444":211,"445":656},"147":69,"148":70,"150":71,"153":{"457":658,"458":659,"459":658,"460":660,"461":658,"462":661},"156":{"463":714,"464":715,"465":715,"466":128,"467":716,"468":717,"469":250,"470":250,"471":251,"472":718},"158":{"473":721,"474":722,"475":259,"476":260},"160":72,"165":73,"178":{"434":726,"490":725,"491":293,"492":294,"493":296},"182":75,"204":76,"209":77,"210":17,"214":78,"219":17,"221":17,"224":79,"229":17,"251":80,"254":81,"258":17,"271":82,"277":17,"282":83,"284":84,"293":17,"296":86,"298":87,"303":88,"308":89,"309":90,"328":92,"332":93,"334":94,"337":95,"341":17,"344":17,"1090":{"428":646,"add_member":644,"promote_member":644,"demote_member":644,"remove_member":645,"cleanup_poll":647,"exchange_member":648},"1091":96,"1092":{"425":128,"428":677,"606":124,"611":128,"unbid":128,"vouch":676,"unvouch":128,"defender_vote":678,"waive_repay":679,"found_society":680,"judge_suspended_member":681,"set_parameters":682,"punish_skeptic":128,"claim_membership":128,"bestow_membership":683,"kick_candidate":683,"resign_candidacy":128,"drop_candidate":683,"cleanup_candidacy":684,"cleanup_challenge":685},"1095":{"1099":699,"1100":700,"1101":701,"1102":702,"1103":700,"1104":702,"1105":703,"1106":128,"1107":702},"1096":{"place_bid":732,"retract_bid":732,"fund_deficit":128,"thaw_private":733,"thaw_communal":68,"communify":68,"privatize":68},"1097":62,"1098":85},"876":{"18":{"645":24,"646":637,"647":26,"648":27,"649":27,"650":28,"651":29},"23":{"652":44,"653":44,"654":712,"655":46,"656":47,"657":47,"658":47,"659":47,"660":47},"27":97,"45":17,"48":17,"50":98,"57":99,"60":100,"62":17,"106":101,"109":102,"112":17,"118":103,"125":104,"127":17,"134":105,"137":106,"143":107,"144":17,"146":{"738":213,"739":213,"740":657},"147":108,"148":109,"150":110,"153":{"745":662,"746":26,"747":26,"748":26,"749":663,"750":664},"156":{"751":664,"752":719,"753":254,"754":720,"755":720},"158":{"756":261,"757":262,"758":723,"759":264},"160":111,"165":112,"178":113,"182":114,"204":115,"209":{"676":150,"793":740,"794":359,"795":155,"796":26},"210":17,"214":17,"219":17,"221":116,"224":17,"229":17,"251":117,"254":17,"258":17,"271":118,"277":17,"282":119,"284":17,"293":17,"296":121,"298":122,"303":123,"308":{"778":448,"831":472,"832":472,"833":448,"834":448,"835":448,"836":741,"837":448,"838":474,"839":448},"309":124,"328":126,"332":127,"334":128,"337":17,"341":17,"344":17,"1090":{"782":649,"1108":650,"MemberAdded":92,"RankChanged":649,"MemberExchanged":651},"1091":{"722":204,"723":205,"724":205,"725":90,"726":654,"727":72,"728":72,"729":655,"730":72,"731":655,"732":655,"733":655,"734":655,"735":205,"736":208,"737":208},"1092":{"674":183,"Founded":686,"Bid":687,"Vouch":688,"AutoUnbid":689,"Unbid":689,"Unvouch":689,"Inducted":690,"SuspendedMemberJudgement":691,"CandidateSuspended":689,"MemberSuspended":692,"Challenged":692,"Vote":693,"DefenderVote":694,"NewParams":695,"Unfounded":686,"Elevated":696},"1095":{"1109":27,"1110":704,"1111":705,"1112":704,"1113":704,"1114":706},"1096":{"682":735,"686":736,"BidPlaced":734,"BidRetracted":734,"BidDropped":734,"Funded":737,"Transferred":738},"1097":99,"1098":120},"974":{"18":129,"23":130,"27":17,"45":131,"48":132,"50":133,"57":134,"60":135,"62":17,"106":136,"109":17,"112":17,"118":17,"125":137,"127":17,"134":138,"137":139,"143":140,"144":17,"146":17,"147":17,"148":141,"150":142,"153":143,"156":144,"158":145,"160":146,"165":147,"178":148,"182":149,"204":150,"209":133,"210":17,"214":17,"219":17,"221":17,"224":17,"229":17,"251":151,"254":17,"258":17,"271":17,"277":17,"282":17,"284":17,"293":17,"296":153,"298":154,"303":155,"308":156,"309":157,"328":17,"332":159,"334":17,"337":137,"341":17,"344":17,"1090":17,"1091":140,"1092":{"904":175,"GraceStrikes":1,"PeriodSpend":55,"VotingPeriod":1,"ClaimPeriod":1,"MaxLockDuration":1,"ChallengePeriod":1,"MaxPayouts":1,"MaxBids":1},"1095":160,"1096":{"904":175,"QueueCount":1,"MaxQueueLen":1,"FifoQueueLen":1,"BasePeriod":1,"MinBid":55,"MinReceipt":55,"IntakePeriod":1,"MaxIntakeWeight":34,"ThawThrottle":731},"1097":134,"1098":152},"1087":{"198":161,"976":162,"980":163,"988":{"984":742,"985":557,"986":558,"987":559},"996":164,"999":165,"1001":166,"1003":167,"1035":168,"1040":169,"1046":170,"1049":171,"1052":172,"1057":173,"1059":174,"1062":175,"1064":176,"1069":177,"1072":{"1067":622,"1068":623,"1070":743,"1071":744},"1077":178,"1080":{"1078":745,"1079":746},"1082":179,"1086":180}},"paseo":{"345":{"18":{"0":0,"1":1,"2":2,"3":3,"4":1,"5":4,"6":5,"7":1,"8":6,"9":7,"10":747,"11":1,"12":9,"13":10,"14":2,"15":2,"16":11,"17":12},"23":0,"27":1,"45":2,"48":3,"50":4,"57":5,"60":6,"62":7,"106":8,"109":9,"112":10,"118":11,"125":12,"127":13,"134":14,"137":15,"143":16,"144":17,"146":18,"147":19,"148":20,"150":21,"153":17,"156":22,"158":23,"160":24,"165":25,"178":26,"182":27,"204":28,"209":29,"210":17,"214":30,"219":31,"221":32,"224":33,"229":34,"251":35,"254":36,"258":37,"271":38,"277":39,"282":40,"284":41,"290":42,"293":43,"296":44,"298":45,"303":46,"308":47,"309":17,"313":48,"328":49,"332":50,"334":51,"337":52,"341":53,"344":54,"1119":17,"1121":56},"644":{"18":57,"23":{"357":749,"358":36,"359":750,"360":38,"361":751,"362":752,"363":41,"364":42,"365":43,"366":38},"27":58,"45":59,"48":60,"50":61,"57":62,"60":17,"62":17,"106":63,"109":17,"112":17,"118":64,"125":65,"127":17,"134":66,"137":67,"143":68,"144":17,"146":{"442":210,"443":210,"444":211,"445":754},"147":69,"148":70,"150":71,"153":{"457":756,"458":757,"459":756,"460":758,"461":756,"462":759},"156":{"463":763,"464":247,"465":247,"466":128,"467":248,"468":249,"469":250,"470":250,"471":251,"472":764},"158":{"473":765,"474":766,"475":259,"476":260},"160":72,"165":73,"178":74,"182":75,"204":76,"209":77,"210":17,"214":78,"219":17,"221":17,"224":79,"229":17,"251":80,"254":81,"258":17,"271":82,"277":17,"282":83,"284":84,"290":85,"293":17,"296":86,"298":87,"303":88,"308":89,"309":90,"313":91,"328":92,"332":93,"334":94,"337":95,"341":17,"344":17,"1119":{"1122":770,"1123":445,"1124":445,"1125":445,"1126":771,"1127":416},"1121":{"1128":754,"1129":759,"1130":772,"1131":773,"1132":128}},"876":{"18":{"645":24,"646":748,"647":26,"648":27,"649":27,"650":28,"651":29},"23":{"652":44,"653":44,"654":753,"655":46,"656":47,"657":47,"658":47,"659":47,"660":47},"27":97,"45":17,"48":17,"50":98,"57":99,"60":100,"62":17,"106":101,"109":102,"112":17,"118":103,"125":104,"127":17,"134":105,"137":106,"143":107,"144":17,"146":{"738":213,"739":213,"740":755},"147":108,"148":109,"150":110,"153":{"745":760,"746":26,"747":26,"748":26,"749":761,"750":762},"156":{"751":762,"752":253,"753":254,"754":255,"755":255},"158":{"756":261,"757":262,"758":767,"759":264},"160":111,"165":112,"178":113,"182":114,"204":115,"209":{"676":150,"793":768,"794":359,"795":155,"796":26},"210":17,"214":17,"219":17,"221":116,"224":17,"229":17,"251":117,"254":17,"258":17,"271":118,"277":17,"282":119,"284":17,"290":120,"293":17,"296":121,"298":122,"303":123,"308":{"778":448,"831":472,"832":472,"833":448,"834":448,"835":448,"836":769,"837":448,"838":474,"839":448},"309":124,"313":125,"328":126,"332":127,"334":128,"337":17,"341":17,"344":17,"1119":17,"1121":{"1133":774,"1134":775,"1135":26,"1136":774}},"974":{"18":129,"23":130,"27":17,"45":131,"48":132,"50":133,"57":134,"60":135,"62":17,"106":136,"109":17,"112":17,"118":17,"125":137,"127":17,"134":138,"137":139,"143":140,"144":17,"146":17,"147":17,"148":141,"150":142,"153":143,"156":144,"158":145,"160":146,"165":147,"178":148,"182":149,"204":150,"209":133,"210":17,"214":17,"219":17,"221":17,"224":17,"229":17,"251":151,"254":17,"258":17,"271":17,"277":17,"282":17,"284":17,"290":152,"293":17,"296":153,"298":154,"303":155,"308":156,"309":157,"313":158,"328":17,"332":159,"334":17,"337":137,"341":17,"344":17,"1119":17,"1121":17},"1087":{"198":161,"976":162,"980":163,"988":{"984":776,"985":557,"986":558,"987":559},"996":164,"999":165,"1001":166,"1003":167,"1035":168,"1040":169,"1046":170,"1049":171,"1052":172,"1057":173,"1059":174,"1062":175,"1064":176,"1069":177,"1072":{"1067":622,"1068":623,"1070":777,"1071":778},"1077":178,"1080":{"1078":779,"1079":780},"1082":179,"1086":180}},"wnd":{"345":{"18":{"0":0,"1":1,"2":2,"3":3,"4":1,"5":4,"6":5,"7":1,"8":6,"9":7,"10":781,"11":1,"12":9,"13":10,"14":2,"15":2,"16":11,"17":12,"ExtrinsicWeightReclaimed":34},"23":{"19":1,"20":838,"21":32,"22":33},"27":1,"45":2,"48":3,"50":4,"57":{"0":73,"51":55,"52":55,"53":74,"54":75,"55":786,"56":77},"60":6,"62":7,"106":{"63":1,"64":1,"65":98,"66":99,"67":55,"68":55,"69":55,"70":1,"71":100,"72":101,"73":102,"74":1,"75":1,"76":103,"77":1,"78":104,"79":1,"80":1,"81":1,"82":105,"83":106,"84":107,"85":108,"86":107,"87":109,"88":110,"89":111,"90":112,"91":113,"92":112,"93":114,"94":1,"95":1,"96":55,"97":115,"98":116,"99":117,"100":118,"101":119,"102":120,"103":1,"105":1},"109":9,"112":10,"118":{"73":98,"104":116,"113":1,"114":2,"115":162,"116":163,"117":164},"125":12,"127":13,"134":{"128":1,"129":173,"130":55,"131":121,"132":1,"133":873,"LastSpendPeriod":1},"137":15,"143":{"138":1,"139":870,"140":199,"141":106,"142":4},"144":17,"146":18,"147":19,"150":21,"153":17,"156":{"154":847,"155":245},"158":23,"178":26,"182":{"179":301,"180":1,"181":302,"NextNodeAutoRebagged":97,"Lock":374},"204":28,"209":29,"210":17,"214":30,"219":{"215":1,"216":121,"217":172,"218":879},"221":{"220":880},"224":{"222":374,"223":883},"229":{"225":377,"227":1,"228":885},"251":{"230":380,"231":172,"232":121,"233":381,"234":5,"235":106,"236":4,"237":382,"238":383,"239":116,"240":106,"241":116,"242":4,"243":384,"244":385,"245":116,"246":116,"247":386,"248":387,"249":388,"250":389,"AuthorizedCodeHash":886},"254":36,"258":37,"271":38,"277":39,"282":40,"284":{"97":889,"283":106},"293":43,"296":44,"298":45,"303":46,"308":47,"309":17,"328":{"314":55,"315":916,"316":388,"317":1,"318":917,"319":918,"320":919,"321":920,"322":497,"323":921,"324":922,"325":2,"326":2,"327":923,"AuthorizedAliases":924},"332":50,"334":{"333":954},"337":52,"341":53,"344":54,"1095":55,"1098":{"285":433,"286":434,"287":435,"288":436,"289":303,"Credits":356},"1121":56,"1137":{"IdentityOf":801,"UsernameOf":672,"SuperOf":802,"SubsOf":803,"Registrars":804,"AuthorityOf":805,"UsernameInfoOf":806,"PendingUsernames":807,"UnbindingUsernames":808},"1138":{"Delegators":876,"CounterForDelegators":1,"Agents":877,"CounterForAgents":1},"1139":17,"1140":{"PermanentSlots":893,"PermanentSlotCount":1,"TemporarySlots":894,"TemporarySlotCount":1,"ActiveTemporarySlotCount":1,"MaxTemporarySlots":1,"MaxPermanentSlots":1},"1141":{"ValidatorSet":900,"IncompleteValidatorSetReport":901,"ValidatorPoints":314,"Mode":902,"NextSessionChangesValidators":1,"ValidatorSetAppliedAt":1,"BufferedOffences":903},"1142":{"Cursor":908,"Historic":909},"1143":17,"1144":17,"1145":17,"1146":17},"644":{"18":57,"23":{"357":839,"358":36,"359":840,"360":38,"361":841,"362":842,"363":41,"364":42,"365":43,"366":38},"27":58,"45":59,"48":60,"50":{"376":68,"377":69,"378":68,"379":70,"380":68,"1147":68},"57":62,"60":17,"62":17,"106":{"389":122,"390":123,"391":124,"392":125,"393":126,"394":127,"395":128,"396":129,"397":128,"398":130,"399":131,"400":132,"401":128,"402":128,"403":133,"404":134,"405":128,"406":135,"407":136,"408":124,"409":134,"410":137,"411":138,"412":139,"413":140,"414":130,"415":141,"416":142,"417":143,"418":144,"migrate_currency":139,"manual_slash":787},"109":17,"112":17,"118":64,"125":65,"127":17,"134":{"422":176,"423":177,"424":874,"425":68,"426":68,"427":68},"137":67,"143":{"358":68,"434":871,"435":68,"436":68,"437":68,"438":68,"439":202,"440":68,"441":203},"144":17,"146":{"442":210,"443":210,"444":211,"445":844},"147":69,"150":71,"153":{"457":792,"458":793,"459":792,"460":794,"461":792,"462":795,"if_else":796,"dispatch_as_fallible":794},"156":{"463":848,"464":849,"465":849,"466":128,"467":850,"468":851,"469":250,"470":250,"471":251,"472":852,"1147":128},"158":{"473":857,"474":858,"475":259,"476":260,"1147":859},"178":{"434":295,"490":292,"491":293,"492":294,"493":128},"182":75,"204":76,"209":77,"210":17,"214":{"520":130,"521":130,"522":130,"523":130,"524":130,"525":130,"526":130,"528":130,"529":130,"530":130,"531":362,"532":362,"533":130,"534":130,"535":130,"536":130,"537":130,"538":130,"539":130,"540":130,"541":130,"542":130,"543":130,"544":130,"545":130,"546":363,"547":363,"548":130,"549":130,"550":130,"551":130,"552":130,"553":130,"554":130,"555":130,"556":364,"557":365,"558":366,"559":363,"560":130,"561":130,"562":130,"564":130,"565":367,"566":130,"567":368},"219":17,"221":17,"224":{"568":884},"229":17,"251":{"569":390,"570":391,"571":392,"572":391,"573":393,"574":394,"575":395,"576":396,"577":397,"remove_upgrade_cooldown":393,"authorize_force_set_current_code_hash":887,"apply_authorized_force_set_current_code":390},"254":81,"258":17,"271":82,"277":17,"282":83,"284":{"591":890},"293":17,"296":86,"298":87,"303":88,"308":89,"309":{"616":476,"617":477,"618":478,"credit_account":899},"328":{"625":925,"626":926,"627":926,"628":927,"629":928,"630":505,"631":929,"632":929,"633":930,"634":930,"635":508,"636":930,"637":931,"638":932,"add_authorized_alias":933,"remove_authorized_alias":934,"remove_all_authorized_aliases":128},"332":93,"334":{"500":955,"641":955,"642":956},"337":{"643":546,"report_double_voting":545,"report_double_voting_unsigned":545,"report_fork_voting":963,"report_fork_voting_unsigned":963,"report_future_block_voting":964,"report_future_block_voting_unsigned":964},"341":17,"344":17,"1095":{"1099":834,"1100":700,"1101":701,"1102":702,"1103":700,"1104":702,"1105":703,"1106":128,"1107":702,"1147":835},"1098":{"592":437,"593":437,"place_order_with_credits":437},"1121":{"1128":844,"1129":795,"1130":772,"1131":845,"1132":128},"1137":{"add_registrar":702,"set_identity":809,"set_subs":810,"clear_identity":128,"request_judgement":811,"cancel_request":812,"set_fee":813,"set_account_id":69,"set_fields":814,"provide_judgement":815,"kill_identity":231,"add_sub":816,"rename_sub":816,"remove_sub":817,"quit_sub":128,"add_username_authority":818,"remove_username_authority":819,"set_username_for":820,"accept_username":821,"remove_expired_approval":821,"set_primary_username":821,"unbind_username":821,"remove_username":821,"kill_username":821},"1138":17,"1139":{"1122":770,"1123":445,"1124":445,"1125":445,"1126":891,"1127":416},"1140":{"assign_perm_parachain_slot":445,"assign_temp_parachain_slot":895,"unassign_parachain_slot":445,"set_max_permanent_slots":896,"set_max_temporary_slots":896},"1141":{"1037":904,"set_mode":905,"force_on_migration_end":128},"1142":{"force_set_cursor":910,"force_set_active_cursor":911,"force_onboard_mbms":128,"clear_historic":912},"1143":{"fill_block":960,"trigger_defensive":128},"1144":{"dispatch":961},"1145":17,"1146":{"1147":965,"reap_identity":965}},"876":{"18":{"645":24,"646":783,"647":26,"648":27,"649":27,"650":28,"651":29,"RejectedInvalidAuthorizedUpgrade":784},"23":{"652":44,"653":44,"654":843,"655":46,"656":47,"657":47,"658":47,"659":47,"660":47,"AgendaIncomplete":479},"27":97,"45":17,"48":17,"50":{"664":71,"665":72,"666":71,"1148":785},"57":99,"60":100,"62":17,"106":{"66":150,"93":156,"676":147,"689":145,"690":146,"691":148,"692":149,"693":26,"694":150,"695":150,"696":151,"697":26,"698":152,"699":788,"700":154,"701":155,"702":155,"703":157,"CurrencyMigrated":789},"109":102,"112":{"RootStored":72,"RootsPruned":790},"118":{"705":149,"NewQueued":26,"ValidatorDisabled":791,"ValidatorReenabled":791},"125":104,"127":17,"134":{"674":183,"709":179,"710":180,"711":181,"712":182,"713":184,"714":185,"715":875,"716":72,"717":187,"718":187,"719":72},"137":{"720":196,"721":197,"1108":868,"VoteRemoved":868,"VoteUnlocked":869},"143":107,"144":17,"146":{"738":213,"739":213,"740":872},"147":108,"150":{"743":236,"744":27,"VestingCreated":837},"153":{"745":797,"746":26,"747":26,"748":26,"749":798,"750":799,"IfElseMainSuccess":26,"IfElseFallbackCalled":800},"156":{"751":799,"752":853,"753":254,"754":855,"755":855,"1148":856,"PureKilled":854},"158":{"756":261,"757":262,"758":860,"759":264,"1148":861},"178":113,"182":114,"204":{"66":338,"694":340,"695":341,"778":337,"779":339,"780":342,"781":343,"782":863,"783":345,"784":346,"785":347,"786":348,"787":349,"788":350,"789":351,"790":352,"791":353,"792":353,"MemberClaimPermissionUpdated":864,"MetadataUpdated":865,"PoolNominationMade":865,"PoolNominatorChilled":865,"GlobalParamsUpdated":866},"209":{"676":150,"793":867,"794":359,"795":155,"796":26},"210":17,"214":17,"219":17,"221":{"797":881,"798":881,"799":882,"800":373},"224":17,"229":17,"251":{"801":398,"802":398,"803":398,"804":398,"805":399,"806":400,"807":400,"808":400,"UpgradeCooldownRemoved":448,"CodeAuthorized":888},"254":17,"258":17,"271":118,"277":17,"282":119,"284":17,"293":17,"296":121,"298":122,"303":123,"308":{"778":448,"831":472,"832":472,"833":448,"834":448,"835":448,"836":892,"837":448,"838":474,"839":448},"309":124,"328":{"845":935,"846":936,"847":939,"848":940,"849":515,"850":516,"851":515,"852":515,"853":941,"854":939,"855":518,"856":942,"857":943,"858":944,"859":945,"860":946,"861":939,"862":947,"863":948,"864":948,"865":948,"866":949,"867":942,"868":527,"SendFailed":937,"ProcessXcmError":938,"AliasAuthorized":950,"AliasAuthorizationRemoved":951,"AliasesAuthorizationsRemoved":952},"332":127,"334":{"873":957,"874":958,"875":959},"337":17,"341":17,"344":17,"1095":{"1109":27,"1110":704,"1111":705,"1112":704,"1113":704,"1114":706,"1148":836},"1098":{"819":438,"820":439,"AccountCredited":90},"1121":{"1133":846,"1134":775,"1135":26,"1136":846},"1137":{"IdentitySet":92,"IdentityCleared":822,"IdentityKilled":822,"JudgementRequested":823,"JudgementUnrequested":823,"JudgementGiven":824,"RegistrarAdded":825,"SubIdentityAdded":826,"SubIdentitiesSet":827,"SubIdentityRenamed":828,"SubIdentityRemoved":826,"SubIdentityRevoked":826,"AuthorityAdded":829,"AuthorityRemoved":829,"UsernameSet":830,"UsernameQueued":831,"PreapprovalExpired":832,"PrimaryUsernameSet":830,"DanglingUsernameRemoved":830,"UsernameUnbound":833,"UsernameRemoved":833,"UsernameKilled":833},"1138":{"676":878,"720":878,"Released":878,"MigratedDelegation":878},"1139":17,"1140":{"PermanentSlotAssigned":398,"TemporarySlotAssigned":398,"MaxPermanentSlotsChanged":897,"MaxTemporarySlotsChanged":897},"1141":{"ValidatorSetReceived":906,"CouldNotMergeAndDropped":26,"SetTooSmallAndDropped":26,"Unexpected":907},"1142":{"UpgradeStarted":913,"UpgradeCompleted":26,"UpgradeFailed":26,"MigrationSkipped":72,"MigrationAdvanced":914,"MigrationCompleted":914,"MigrationFailed":914,"HistoricCleared":915},"1143":{"DefensiveTestCall":26},"1144":{"654":962},"1145":17,"1146":{"IdentityReaped":92,"DepositUpdated":966}},"974":{"18":{"877":13,"878":14,"879":1,"880":15,"881":782,"882":1},"23":130,"27":17,"45":131,"48":132,"50":133,"57":134,"60":135,"62":17,"106":{"895":1,"896":1,"897":1,"898":1,"899":1,"900":1,"MaxValidatorSet":1},"109":17,"112":17,"118":{"KeyDeposit":55},"125":137,"127":17,"134":{"902":1,"903":1,"904":175,"905":1,"906":1,"pot_account":97},"137":139,"143":140,"144":17,"146":17,"147":17,"150":142,"153":143,"156":144,"158":145,"178":{"938":1,"939":1,"940":55,"941":1,"942":34,"943":1,"944":55,"945":55,"946":55,"947":1,"948":1,"949":34,"950":1,"951":1,"MaxBackersPerWinner":1},"182":{"952":303,"MaxAutoRebagPerBlock":1},"204":150,"209":133,"210":17,"214":17,"219":17,"221":17,"224":17,"229":17,"251":151,"254":17,"258":17,"271":17,"277":17,"282":17,"284":17,"293":17,"296":153,"298":154,"303":155,"308":156,"309":{"967":1,"968":898},"328":{"UniversalLocation":898,"AdvertisedXcmVersion":1,"MaxLockers":1,"MaxRemoteLockConsumers":1},"332":159,"334":17,"337":137,"341":17,"344":17,"1095":160,"1098":152,"1121":17,"1137":{"BasicDeposit":55,"ByteDeposit":55,"UsernameDeposit":55,"SubAccountDeposit":55,"MaxSubAccounts":1,"MaxRegistrars":1,"PendingUsernameExpiration":1,"UsernameGracePeriod":1,"MaxSuffixLength":1,"MaxUsernameLength":1},"1138":{"95":1,"904":175},"1139":17,"1140":{"PermanentSlotLeasePeriodLength":1,"TemporarySlotLeasePeriodLength":1,"MaxTemporarySlotPerLeasePeriod":1},"1141":17,"1142":{"CursorMaxLen":1,"IdentifierMaxLen":1},"1143":17,"1144":17,"1145":17,"1146":17},"1087":{"198":161,"980":{"977":967,"978":551,"979":552},"988":{"984":969,"985":557,"986":558,"987":559},"996":{"989":560,"990":561,"991":562,"992":563,"993":564,"994":565,"995":566,"member_total_balance":560,"pool_balance":563,"pool_accounts":990},"999":165,"1001":{"1000":970},"1003":167,"1035":{"1004":572,"1005":573,"1006":971,"1007":575,"1008":576,"1009":577,"1010":578,"1011":579,"1012":972,"1013":973,"1014":582,"1015":583,"1016":584,"1017":974,"1018":586,"1019":587,"1020":572,"1021":588,"1022":589,"1023":590,"1024":591,"1025":592,"1026":593,"1027":578,"1028":975,"1029":595,"1030":555,"1031":596,"1032":578,"1033":597,"1034":976,"validation_code_bomb_limit":578,"backing_constraints":977,"scheduling_lookahead":578,"para_ids":555},"1040":{"1036":599,"1037":600,"1039":602,"submit_report_double_voting_unsigned_extrinsic":601,"submit_report_fork_voting_unsigned_extrinsic":978,"submit_report_future_block_voting_unsigned_extrinsic":979,"generate_ancestry_proof":980},"1046":170,"1049":171,"1052":172,"1057":173,"1059":174,"1062":175,"1064":176,"1069":177,"1072":{"1067":622,"1068":623,"1070":981,"1071":982},"1077":{"1073":983,"1074":984,"1075":985,"1076":986},"1080":{"1078":987,"1079":988},"1082":{"1081":989},"1086":180,"RuntimeViewFunction":{"execute_view_function":968},"TrustedQueryApi":{"is_trusted_reserve":991,"is_trusted_teleporter":991}}}},[{"19":1,"20":31,"21":32,"22":33},{"24":48,"25":49,"26":50},{"28":55,"29":56,"30":55,"31":55,"32":6,"33":57,"34":6,"35":56,"36":1,"37":58,"38":59,"39":60,"40":61,"41":1,"42":62,"43":62,"44":63},{"46":55,"47":2},{"49":67},{"0":73,"51":55,"52":55,"53":74,"54":75,"55":76,"56":77},{"58":55,"59":95},{"61":97},{"63":1,"64":1,"65":98,"66":99,"67":55,"68":55,"69":55,"70":1,"71":100,"72":101,"73":102,"74":1,"75":1,"76":103,"77":1,"78":104,"79":1,"80":1,"81":1,"82":105,"83":106,"84":107,"85":108,"86":107,"87":109,"88":110,"89":111,"90":112,"91":113,"92":112,"93":114,"94":1,"95":1,"96":55,"97":115,"98":116,"99":117,"100":118,"101":119,"102":120,"103":1,"104":121,"105":1},{"107":158,"108":159},{"110":161,"111":61},{"73":98,"104":121,"113":1,"114":2,"115":162,"116":163,"117":164},{"29":56,"119":166,"120":167,"121":1,"122":61,"123":55,"124":168},{"116":172,"126":172},{"128":1,"129":173,"130":55,"131":121,"132":1,"133":174},{"135":188,"136":189},{"138":1,"139":198,"140":199,"141":106,"142":4},{},{"145":209},{"147":215},{"148":218,"149":55,"150":219,"151":220,"152":221},{"59":230,"150":229},{"154":244,"155":245},{"157":256},{"159":1,"160":265,"161":5,"162":121},{"163":1,"164":106,"165":277,"166":5,"167":112},{"168":1,"169":285,"170":286,"171":287,"172":1,"173":288,"174":1,"175":289,"176":290,"177":291},{"179":301,"180":1,"181":302},{"183":55,"184":55,"185":55,"186":1,"187":1,"188":1,"189":1,"190":310,"191":1,"192":311,"193":1,"194":312,"195":1,"196":313,"197":1,"198":5,"199":1,"200":1,"201":314,"202":1,"203":315},{"205":355,"206":356,"207":1,"208":1},{"211":360,"212":361,"213":2},{"215":1,"216":121,"217":172,"218":369},{"220":370},{"222":374,"223":375},{"225":377,"226":378,"227":1,"228":379},{"230":380,"231":172,"232":121,"233":381,"234":5,"235":106,"236":4,"237":382,"238":383,"239":116,"240":106,"241":116,"242":4,"243":384,"244":385,"245":116,"246":116,"247":386,"248":387,"249":388,"250":389},{"252":374,"253":401},{"255":403,"256":4,"257":112},{"259":404,"260":405,"261":106,"262":106,"263":406,"264":405,"265":106,"266":407,"267":386,"268":386,"269":408,"270":409},{"272":172,"273":1,"274":422,"275":423,"276":424},{"222":427,"278":1,"279":425,"280":426,"281":428},{"97":431,"283":106},{"285":433,"286":434,"287":435,"288":436,"289":303},{"291":440,"292":441},{"251":442,"294":106,"295":1},{"297":451},{"299":1,"300":61,"301":455,"302":456},{"304":466,"305":121,"306":1,"307":1},{"310":481,"311":482,"312":483},{"314":55,"315":492,"316":388,"317":1,"318":493,"319":494,"320":495,"321":496,"322":497,"323":498,"324":499,"325":2,"326":2,"327":500},{"329":528,"330":529,"331":530},{"333":538},{"29":544,"35":544,"124":168,"335":55,"336":428},{"338":6,"339":55,"340":547},{"342":548,"343":548},{"156":99,"1093":697,"1094":698},{"1120":97},{"346":17,"347":18,"348":19,"349":19,"350":20,"351":21,"352":22,"353":17,"354":23,"355":23,"356":19},{"367":51,"368":52,"369":52,"370":52,"371":53},{"372":64,"373":64,"374":65},{"375":66},{"376":68,"377":69,"378":68,"379":70,"380":68},{"379":79,"381":78,"382":78,"383":80,"384":81,"385":82,"386":83,"387":84,"388":85},{"389":122,"390":123,"391":124,"392":125,"393":126,"394":127,"395":128,"396":129,"397":128,"398":130,"399":131,"400":132,"401":128,"402":128,"403":133,"404":134,"405":128,"406":135,"407":136,"408":124,"409":134,"410":137,"411":138,"412":139,"413":140,"414":130,"415":141,"416":142,"417":143,"418":144},{"419":165,"420":128},{"372":169,"373":169,"421":170},{"422":176,"423":177,"424":178,"425":68,"426":68,"427":68},{"428":190,"429":191,"430":192,"431":193,"432":194,"433":195},{"358":68,"434":201,"435":68,"436":68,"437":68,"438":68,"439":202,"440":68,"441":203},{"446":216},{"376":223,"447":224,"448":225,"449":226,"450":227},{"451":128,"452":231,"453":232,"454":233,"455":234,"456":235},{"477":267,"478":268,"479":269,"480":268,"481":268,"482":270,"483":268,"484":268,"485":271},{"479":279,"480":280,"481":280,"486":278,"487":281,"488":280,"489":280},{"434":295,"490":292,"491":293,"492":294,"493":296},{"494":304,"495":305,"496":306},{"390":317,"391":318,"392":320,"394":323,"395":328,"441":325,"497":316,"498":128,"499":319,"500":321,"501":322,"502":324,"503":326,"504":327,"505":329,"506":330,"507":331,"508":332,"509":333,"510":334,"511":328,"512":328,"513":335,"514":336,"515":336,"516":328},{"517":128,"518":128,"519":357},{"520":130,"521":130,"522":130,"523":130,"524":130,"525":130,"526":130,"527":130,"528":130,"529":130,"530":130,"531":362,"532":362,"533":130,"534":130,"535":130,"536":130,"537":130,"538":130,"539":130,"540":130,"541":130,"542":130,"543":130,"544":130,"545":130,"546":363,"547":363,"548":130,"549":130,"550":130,"551":130,"552":130,"553":130,"554":130,"555":130,"556":364,"557":365,"558":366,"559":363,"560":130,"561":130,"562":130,"563":130,"564":130,"565":367,"566":130,"567":368},{"568":376},{"569":390,"570":391,"571":392,"572":391,"573":393,"574":394,"575":395,"576":396,"577":397},{"578":402},{"579":410,"580":411,"581":412,"582":413,"583":414,"584":414,"585":415,"586":416,"587":417,"588":417,"589":418},{"590":128},{"591":432},{"592":437,"593":437},{"518":445,"594":443,"595":444,"596":446,"597":393,"598":128,"599":393,"600":390,"601":391},{"602":452,"603":393,"604":393},{"605":457,"606":458,"607":128},{"500":467,"608":468,"609":469,"610":68,"611":68,"612":467,"613":470,"614":68,"615":471},{"616":476,"617":477,"618":478},{"619":484,"620":485,"621":486,"622":487,"623":488,"624":489},{"625":501,"626":502,"627":502,"628":503,"629":504,"630":505,"631":506,"632":506,"633":507,"634":507,"635":508,"636":507,"637":509,"638":510},{"639":532,"640":533},{"500":539,"641":539,"642":540},{"372":545,"373":545,"643":546},{"358":68,"434":640,"435":68,"436":68,"437":68,"438":68,"439":202,"440":68,"441":203},{"661":54,"662":54,"663":54},{"664":71,"665":72,"666":71},{"281":90,"667":86,"668":87,"669":88,"670":89,"671":90,"672":90,"673":91,"674":90,"675":90,"676":90,"677":90,"678":90,"679":90,"680":90,"681":92,"682":93,"683":93,"684":90,"685":90,"686":90,"687":94},{"688":96},{"66":150,"93":156,"676":147,"689":145,"690":146,"691":148,"692":149,"693":26,"694":150,"695":150,"696":151,"697":26,"698":152,"699":153,"700":154,"701":155,"702":155,"703":157},{"704":160},{"705":149},{"706":171,"707":26,"708":26},{"674":183,"709":179,"710":180,"711":181,"712":182,"713":184,"714":185,"715":186,"716":72,"717":187,"718":187,"719":72},{"720":196,"721":197},{"722":204,"723":205,"724":205,"725":90,"726":206,"727":72,"728":72,"729":207,"730":72,"731":207,"732":207,"733":207,"734":207,"735":205,"736":208,"737":208},{"741":217},{"742":228},{"743":236,"744":27},{"760":72,"761":272,"762":72,"763":273,"764":274,"765":72,"766":72,"767":72,"768":275,"769":276,"770":275},{"653":282,"710":283,"742":284,"771":282},{"676":299,"690":299,"772":297,"773":298,"774":26,"775":300},{"776":307,"777":308},{"66":338,"694":340,"695":341,"778":337,"779":339,"780":342,"781":343,"782":344,"783":345,"784":346,"785":347,"786":348,"787":349,"788":350,"789":351,"790":352,"791":353,"792":353},{"797":371,"798":371,"799":372,"800":373},{"801":398,"802":398,"803":398,"804":398,"805":399,"806":400,"807":400,"808":400},{"809":419,"810":420,"811":421,"812":420,"813":419,"814":419,"815":421},{"816":429,"817":430,"818":398},{"819":438,"820":439},{"671":449,"821":447,"822":448,"823":450},{"824":453,"825":454},{"671":461,"672":462,"826":459,"827":460,"828":463,"829":464,"830":465},{"840":479,"841":480},{"676":90,"842":490,"843":26,"844":491},{"845":511,"846":512,"847":513,"848":514,"849":515,"850":516,"851":515,"852":515,"853":517,"854":513,"855":518,"856":519,"857":520,"858":521,"859":522,"860":523,"861":513,"862":524,"863":525,"864":525,"865":525,"866":526,"867":519,"868":527},{"869":534,"870":535,"871":536,"872":537},{"873":541,"874":542,"875":543},{"877":13,"878":14,"879":1,"880":15,"881":16,"882":1},{"883":34,"884":1},{"885":55,"886":55,"887":1,"888":1},{"889":55},{"674":55},{"890":55,"891":1,"892":1,"893":1},{"894":1},{"895":1,"896":1,"897":1,"898":1,"899":1,"900":1},{"887":1,"888":1,"901":55},{"902":1,"903":1,"904":175,"905":1,"906":1},{"907":1,"908":1},{"909":55,"910":1,"911":1,"912":1,"913":200},{"914":222},{"915":55,"916":1},{"917":1},{"918":55,"919":55,"920":1,"921":1,"922":55,"923":55},{"924":55,"925":55,"926":1},{"927":55,"928":1,"929":1,"930":1,"931":266,"932":266,"933":55,"934":55,"935":1},{"936":1,"937":55},{"938":1,"939":1,"940":55,"941":1,"942":34,"943":1,"944":55,"945":55,"946":55,"947":1,"948":1,"949":34,"950":1,"951":1},{"952":303},{"904":175,"953":1,"954":1},{"955":55},{"904":175,"956":55,"957":1},{"934":55,"958":55},{"959":1,"960":1},{"961":1,"962":1,"963":1,"964":1},{"904":175,"965":55,"966":1},{"967":1,"968":475},{"969":1},{"970":1,"971":1,"972":531,"973":531},{"1115":55,"1116":55,"1117":1,"1118":55},{"981":553,"982":554,"983":555},{"975":549},{"977":550,"978":551,"979":552},{"989":560,"990":561,"991":562,"992":563,"993":564,"994":565,"995":566},{"989":569,"997":567,"998":568},{"1000":570},{"1002":571},{"1004":572,"1005":573,"1006":574,"1007":575,"1008":576,"1009":577,"1010":578,"1011":579,"1012":580,"1013":581,"1014":582,"1015":583,"1016":584,"1017":585,"1018":586,"1019":587,"1020":572,"1021":588,"1022":589,"1023":590,"1024":591,"1025":592,"1026":593,"1027":578,"1028":594,"1029":595,"1030":555,"1031":596,"1032":578,"1033":597,"1034":598},{"1036":599,"1037":600,"1038":601,"1039":602},{"1041":603,"1042":604,"1043":605,"1044":606,"1045":607},{"1047":608,"1048":608},{"1038":610,"1039":611,"1050":609,"1051":612},{"1038":616,"1039":615,"1053":613,"1054":612,"1055":614,"1056":614},{"1058":572},{"1060":617,"1061":618},{"1063":619},{"1065":620,"1066":621,"1067":622,"1068":623},{"1073":626,"1074":627,"1075":628,"1076":629},{"1081":632},{"1083":633,"1084":634,"1085":635}],["Account","ExtrinsicCount","InherentsApplied","BlockWeight","AllExtrinsicsLen","BlockHash","ExtrinsicData","Number","ParentHash","Digest","Events","EventCount","EventTopics","LastRuntimeUpgrade","UpgradedToU32RefCount","UpgradedToTripleRefCount","ExecutionPhase","AuthorizedUpgrade","System","IncompleteSince","Agenda","Retries","Lookup","Scheduler","StatusFor","RequestStatusFor","PreimageFor","Preimage","EpochIndex","Authorities","GenesisSlot","CurrentSlot","Randomness","PendingEpochConfigChange","NextRandomness","NextAuthorities","SegmentIndex","UnderConstruction","Initialized","AuthorVrfRandomness","EpochStart","Lateness","EpochConfig","NextEpochConfig","SkippedEpochs","Babe","Now","DidUpdate","Timestamp","Accounts","Indices","TotalIssuance","InactiveIssuance","Locks","Reserves","Holds","Freezes","Balances","NextFeeMultiplier","StorageVersion","TransactionPayment","Author","Authorship","ValidatorCount","MinimumValidatorCount","Invulnerables","Bonded","MinNominatorBond","MinValidatorBond","MinimumActiveStake","MinCommission","Ledger","Payee","Validators","CounterForValidators","MaxValidatorsCount","Nominators","CounterForNominators","VirtualStakers","CounterForVirtualStakers","MaxNominatorsCount","CurrentEra","ActiveEra","ErasStartSessionIndex","ErasStakers","ErasStakersOverview","ErasStakersClipped","ErasStakersPaged","ClaimedRewards","ErasValidatorPrefs","ErasValidatorReward","ErasRewardPoints","ErasTotalStake","ForceEra","MaxStakedRewards","SlashRewardFraction","CanceledSlashPayout","UnappliedSlashes","BondedEras","ValidatorSlashInEra","NominatorSlashInEra","SlashingSpans","SpanSlash","CurrentPlannedSession","DisabledValidators","ChillThreshold","Staking","Reports","ConcurrentReportsIndex","Offences","HistoricalSessions","StoredRange","Historical","CurrentIndex","QueuedChanged","QueuedKeys","NextKeys","KeyOwner","Session","State","PendingChange","NextForced","Stalled","CurrentSetId","SetIdSession","Grandpa","Keys","AuthorityDiscovery","ProposalCount","Proposals","Deactivated","Approvals","SpendCount","Spends","Treasury","VotingFor","ClassLocksFor","ConvictionVoting","ReferendumCount","ReferendumInfoFor","TrackQueue","DecidingCount","MetadataOf","Referenda","Origins","WhitelistedCall","Whitelist","Parameters","Claims","Total","Vesting","Signing","Preclaims","Utility","Proxies","Announcements","Proxy","Multisigs","Multisig","BountyCount","Bounties","BountyDescriptions","BountyApprovals","ChildBountyCount","ParentChildBounties","ChildBounties","ChildBountyDescriptions","ChildrenCuratorFees","Round","CurrentPhase","QueuedSolution","Snapshot","DesiredTargets","SnapshotMetadata","SignedSubmissionNextIndex","SignedSubmissionIndices","SignedSubmissionsMap","MinimumUntrustedScore","ElectionProviderMultiPhase","ListNodes","CounterForListNodes","ListBags","VoterList","TotalValueLocked","MinJoinBond","MinCreateBond","MaxPools","MaxPoolMembers","MaxPoolMembersPerPool","GlobalMaxCommission","PoolMembers","CounterForPoolMembers","BondedPools","CounterForBondedPools","RewardPools","CounterForRewardPools","SubPoolsStorage","CounterForSubPoolsStorage","Metadata","CounterForMetadata","LastPoolId","ReversePoolIdLookup","CounterForReversePoolIdLookup","ClaimPermissions","NominationPools","Head","Queue","CounterForQueue","ErasToCheckPerBlock","FastUnstake","ParachainsOrigin","ActiveConfig","PendingConfigs","BypassConsistencyCheck","Configuration","CurrentSessionIndex","ActiveValidatorIndices","ActiveValidatorKeys","AllowedRelayParents","ParasShared","V1","ParaInclusion","Included","OnChainVotes","ParaInherent","ValidatorGroups","AvailabilityCores","SessionStartBlock","ClaimQueue","ParaScheduler","PvfActiveVoteMap","PvfActiveVoteList","Parachains","ParaLifecycles","Heads","MostRecentContext","CurrentCodeHash","PastCodeHash","PastCodeMeta","PastCodePruning","FutureCodeUpgrades","FutureCodeUpgradesAt","FutureCodeHash","UpgradeGoAheadSignal","UpgradeRestrictionSignal","UpgradeCooldowns","UpcomingUpgrades","ActionsQueue","UpcomingParasGenesis","CodeByHashRefs","CodeByHash","Paras","HasInitialized","BufferedSessionChanges","Initializer","DownwardMessageQueues","DownwardMessageQueueHeads","DeliveryFeeFactor","Dmp","HrmpOpenChannelRequests","HrmpOpenChannelRequestsList","HrmpOpenChannelRequestCount","HrmpAcceptedChannelRequestCount","HrmpCloseChannelRequests","HrmpCloseChannelRequestsList","HrmpWatermarks","HrmpChannels","HrmpIngressChannelsIndex","HrmpEgressChannelsIndex","HrmpChannelContents","HrmpChannelDigests","Hrmp","AssignmentKeysUnsafe","EarliestStoredSession","Sessions","AccountKeys","SessionExecutorParams","ParaSessionInfo","LastPrunedSession","Disputes","BackersOnDisputes","Frozen","ParasDisputes","ValidatorSetCounts","ParasSlashing","ParaIdAffinity","QueueStatus","FreeEntries","AffinityEntries","Revenue","OnDemand","CoreSchedules","CoreDescriptors","CoretimeAssignmentProvider","PendingSwap","NextFreeParaId","Registrar","Leases","Slots","AuctionCounter","AuctionInfo","ReservedAmounts","Winning","Auctions","Funds","NewRaise","EndingsCount","NextFundIndex","Crowdloan","Coretime","MigrationProcess","AutoLimits","SignedMigrationMaxLimits","StateTrieMigration","QueryCounter","Queries","AssetTraps","SafeXcmVersion","SupportedVersion","VersionNotifiers","VersionNotifyTargets","VersionDiscoveryQueue","CurrentMigration","RemoteLockedFungibles","LockedFungibles","XcmExecutionSuspended","ShouldRecordXcm","RecordedXcm","XcmPallet","BookStateFor","ServiceHead","Pages","MessageQueue","ConversionRateToNative","AssetRate","ValidatorSetId","GenesisBlock","Beefy","RootHash","NumberOfLeaves","Nodes","Mmr","BeefyAuthorities","BeefyNextAuthorities","BeefyMmrLeaf","storage","remark","set_heap_pages","set_code","set_code_without_checks","set_storage","kill_storage","kill_prefix","remark_with_event","authorize_upgrade","authorize_upgrade_without_checks","apply_authorized_upgrade","schedule","cancel","schedule_named","cancel_named","schedule_after","schedule_named_after","set_retry","set_retry_named","cancel_retry","cancel_retry_named","note_preimage","unnote_preimage","request_preimage","unrequest_preimage","ensure_updated","report_equivocation","report_equivocation_unsigned","plan_config_change","set","claim","transfer","free","force_transfer","freeze","transfer_allow_death","transfer_keep_alive","transfer_all","force_unreserve","upgrade_accounts","force_set_balance","force_adjust_total_issuance","burn","bond","bond_extra","unbond","withdraw_unbonded","validate","nominate","chill","set_payee","set_controller","set_validator_count","increase_validator_count","scale_validator_count","force_no_eras","force_new_era","set_invulnerables","force_unstake","force_new_era_always","cancel_deferred_slash","payout_stakers","rebond","reap_stash","kick","set_staking_configs","chill_other","force_apply_min_commission","set_min_commission","payout_stakers_by_page","update_payee","deprecate_controller_batch","restore_ledger","set_keys","purge_keys","note_stalled","spend_local","remove_approval","spend","payout","check_status","void_spend","vote","delegate","undelegate","unlock","remove_vote","remove_other_vote","submit","place_decision_deposit","refund_decision_deposit","kill","nudge_referendum","one_fewer_deciding","refund_submission_deposit","set_metadata","whitelist_call","remove_whitelisted_call","dispatch_whitelisted_call","dispatch_whitelisted_call_with_preimage","set_parameter","mint_claim","claim_attest","attest","move_claim","vest","vest_other","vested_transfer","force_vested_transfer","merge_schedules","force_remove_vesting_schedule","batch","as_derivative","batch_all","dispatch_as","force_batch","with_weight","proxy","add_proxy","remove_proxy","remove_proxies","create_pure","kill_pure","announce","remove_announcement","reject_announcement","proxy_announced","as_multi_threshold_1","as_multi","approve_as_multi","cancel_as_multi","propose_bounty","approve_bounty","propose_curator","unassign_curator","accept_curator","award_bounty","claim_bounty","close_bounty","extend_bounty_expiry","add_child_bounty","award_child_bounty","claim_child_bounty","close_child_bounty","submit_unsigned","set_minimum_untrusted_score","set_emergency_election_result","governance_fallback","rebag","put_in_front_of","put_in_front_of_other","join","claim_payout","pool_withdraw_unbonded","create","create_with_pool_id","set_state","set_configs","update_roles","bond_extra_other","set_claim_permission","claim_payout_other","set_commission","set_commission_max","set_commission_change_rate","claim_commission","adjust_pool_deposit","set_commission_claim_permission","apply_slash","migrate_delegation","migrate_pool_to_delegate_stake","register_fast_unstake","deregister","control","set_validation_upgrade_cooldown","set_validation_upgrade_delay","set_code_retention_period","set_max_code_size","set_max_pov_size","set_max_head_data_size","set_coretime_cores","set_max_availability_timeouts","set_group_rotation_frequency","set_paras_availability_period","set_scheduling_lookahead","set_max_validators_per_core","set_max_validators","set_dispute_period","set_dispute_post_conclusion_acceptance_period","set_no_show_slots","set_n_delay_tranches","set_zeroth_delay_tranche_width","set_needed_approvals","set_relay_vrf_modulo_samples","set_max_upward_queue_count","set_max_upward_queue_size","set_max_downward_message_size","set_max_upward_message_size","set_max_upward_message_num_per_candidate","set_hrmp_open_request_ttl","set_hrmp_sender_deposit","set_hrmp_recipient_deposit","set_hrmp_channel_max_capacity","set_hrmp_channel_max_total_size","set_hrmp_max_parachain_inbound_channels","set_hrmp_channel_max_message_size","set_hrmp_max_parachain_outbound_channels","set_hrmp_max_message_num_per_candidate","set_pvf_voting_ttl","set_minimum_validation_upgrade_delay","set_bypass_consistency_check","set_async_backing_params","set_executor_params","set_on_demand_base_fee","set_on_demand_fee_variability","set_on_demand_queue_max_size","set_on_demand_target_queue_utilization","set_on_demand_ttl","set_minimum_backing_votes","set_node_feature","set_approval_voting_params","set_scheduler_params","enter","force_set_current_code","force_set_current_head","force_schedule_code_upgrade","force_note_new_head","force_queue_action","add_trusted_validation_code","poke_unused_validation_code","include_pvf_check_statement","force_set_most_recent_context","force_approve","hrmp_init_open_channel","hrmp_accept_open_channel","hrmp_close_channel","force_clean_hrmp","force_process_hrmp_open","force_process_hrmp_close","hrmp_cancel_open_request","force_open_hrmp_channel","establish_system_channel","poke_channel_deposits","establish_channel_with_system","force_unfreeze","report_dispute_lost_unsigned","place_order_allow_death","place_order_keep_alive","register","force_register","swap","remove_lock","reserve","add_lock","schedule_code_upgrade","set_current_head","force_lease","clear_all_leases","trigger_onboard","new_auction","bid","cancel_auction","contribute","withdraw","refund","dissolve","edit","add_memo","poke","contribute_all","request_core_count","request_revenue_at","assign_core","control_auto_migration","continue_migrate","migrate_custom_top","migrate_custom_child","set_signed_max_limits","force_set_progress","send","teleport_assets","reserve_transfer_assets","execute","force_xcm_version","force_default_xcm_version","force_subscribe_version_notify","force_unsubscribe_version_notify","limited_reserve_transfer_assets","limited_teleport_assets","force_suspension","transfer_assets","claim_assets","transfer_assets_using_type_and_then","reap_page","execute_overweight","update","remove","set_new_genesis","tx","ExtrinsicSuccess","ExtrinsicFailed","CodeUpdated","NewAccount","KilledAccount","Remarked","UpgradeAuthorized","Scheduled","Canceled","Dispatched","RetrySet","RetryCancelled","CallUnavailable","PeriodicFailed","RetryFailed","PermanentlyOverweight","Noted","Requested","Cleared","IndexAssigned","IndexFreed","IndexFrozen","Endowed","DustLost","Transfer","BalanceSet","Reserved","Unreserved","ReserveRepatriated","Deposit","Withdraw","Slashed","Minted","Burned","Suspended","Restored","Upgraded","Issued","Rescinded","Locked","Unlocked","Thawed","TotalIssuanceForced","TransactionFeePaid","EraPaid","Rewarded","SlashReported","OldSlashingReportDiscarded","StakersElected","Unbonded","Withdrawn","Kicked","StakingElectionFailed","Chilled","PayoutStarted","ValidatorPrefsSet","SnapshotVotersSizeExceeded","SnapshotTargetsSizeExceeded","ControllerBatchDeprecated","Offence","NewSession","NewAuthorities","Paused","Resumed","Spending","Awarded","Burnt","Rollover","SpendApproved","UpdatedInactive","AssetSpendApproved","AssetSpendVoided","Paid","PaymentFailed","SpendProcessed","Delegated","Undelegated","Submitted","DecisionDepositPlaced","DecisionDepositRefunded","DepositSlashed","DecisionStarted","ConfirmStarted","ConfirmAborted","Confirmed","Approved","Rejected","TimedOut","Cancelled","Killed","SubmissionDepositRefunded","MetadataSet","MetadataCleared","CallWhitelisted","WhitelistedCallRemoved","WhitelistedCallDispatched","Updated","Claimed","VestingUpdated","VestingCompleted","BatchInterrupted","BatchCompleted","BatchCompletedWithErrors","ItemCompleted","ItemFailed","DispatchedAs","ProxyExecuted","PureCreated","Announced","ProxyAdded","ProxyRemoved","NewMultisig","MultisigApproval","MultisigExecuted","MultisigCancelled","BountyProposed","BountyRejected","BountyBecameActive","BountyAwarded","BountyClaimed","BountyCanceled","BountyExtended","BountyApproved","CuratorProposed","CuratorUnassigned","CuratorAccepted","Added","SolutionStored","ElectionFinalized","ElectionFailed","PhaseTransitioned","Rebagged","ScoreUpdated","Created","PaidOut","Destroyed","StateChanged","MemberRemoved","RolesUpdated","PoolSlashed","UnbondingPoolSlashed","PoolCommissionUpdated","PoolMaxCommissionUpdated","PoolCommissionChangeRateUpdated","PoolCommissionClaimPermissionUpdated","PoolCommissionClaimed","MinBalanceDeficitAdjusted","MinBalanceExcessAdjusted","Unstaked","BatchChecked","BatchFinished","InternalError","CandidateBacked","CandidateIncluded","CandidateTimedOut","UpwardMessagesReceived","CurrentCodeUpdated","CurrentHeadUpdated","CodeUpgradeScheduled","NewHeadNoted","ActionQueued","PvfCheckStarted","PvfCheckAccepted","PvfCheckRejected","OpenChannelRequested","OpenChannelCanceled","OpenChannelAccepted","ChannelClosed","HrmpChannelForceOpened","HrmpSystemChannelOpened","OpenChannelDepositsUpdated","DisputeInitiated","DisputeConcluded","Revert","OnDemandOrderPlaced","SpotPriceSet","Registered","Deregistered","Swapped","NewLeasePeriod","Leased","AuctionStarted","AuctionClosed","ReserveConfiscated","BidAccepted","WinningOffset","Contributed","Withdrew","PartiallyRefunded","AllRefunded","Dissolved","HandleBidResult","Edited","MemoUpdated","AddedToNewRaise","RevenueInfoRequested","CoreAssigned","Migrated","AutoMigrationFinished","Halted","Attempted","Sent","UnexpectedResponse","ResponseReady","Notified","NotifyOverweight","NotifyDispatchError","NotifyDecodeFailed","InvalidResponder","InvalidResponderVersion","ResponseTaken","AssetsTrapped","VersionChangeNotified","SupportedVersionChanged","NotifyTargetSendFail","NotifyTargetMigrationFail","InvalidQuerierVersion","InvalidQuerier","VersionNotifyStarted","VersionNotifyRequested","VersionNotifyUnrequested","FeesPaid","AssetsClaimed","VersionMigrationFinished","ProcessingFailed","Processed","OverweightEnqueued","PageReaped","AssetRateCreated","AssetRateRemoved","AssetRateUpdated","events","BlockWeights","BlockLength","BlockHashCount","DbWeight","Version","SS58Prefix","MaximumWeight","MaxScheduledPerBlock","EpochDuration","ExpectedBlockTime","MaxAuthorities","MaxNominators","MinimumPeriod","ExistentialDeposit","MaxLocks","MaxReserves","MaxFreezes","OperationalFeeMultiplier","HistoryDepth","SessionsPerEra","BondingDuration","SlashDeferDuration","MaxExposurePageSize","MaxUnlockingChunks","MaxSetIdSessionEntries","SpendPeriod","Burn","PalletId","MaxApprovals","PayoutPeriod","MaxVotes","VoteLockingPeriod","SubmissionDeposit","MaxQueued","UndecidingTimeout","AlarmInterval","Tracks","Prefix","MinVestedTransfer","MaxVestingSchedules","batched_calls_limit","ProxyDepositBase","ProxyDepositFactor","MaxProxies","MaxPending","AnnouncementDepositBase","AnnouncementDepositFactor","DepositBase","DepositFactor","MaxSignatories","BountyDepositBase","BountyDepositPayoutDelay","BountyUpdatePeriod","CuratorDepositMultiplier","CuratorDepositMax","CuratorDepositMin","BountyValueMinimum","DataDepositPerByte","MaximumReasonLength","MaxActiveChildBountyCount","ChildBountyValueMinimum","BetterSignedThreshold","OffchainRepeat","MinerTxPriority","SignedMaxSubmissions","SignedMaxWeight","SignedMaxRefunds","SignedRewardBase","SignedDepositByte","SignedDepositWeight","MaxWinners","MinerMaxLength","MinerMaxWeight","MinerMaxVotesPerVoter","MinerMaxWinners","BagThresholds","MaxPointsToBalance","MaxUnbonding","UnsignedPriority","TrafficDefaultValue","MaxHistoricalRevenue","ParaDeposit","LeasePeriod","LeaseOffset","EndingPeriod","SampleLength","SlotRangeCount","LeasePeriodsPerSlot","MinContribution","RemoveKeysLimit","BrokerId","BrokerPotLocation","MaxKeyLen","HeapSize","MaxStale","ServiceWeight","IdleMaxServiceWeight","constants","experimental_inflation_prediction_info","Inflation","version","execute_block","initialize_block","Core","metadata","metadata_at_version","metadata_versions","apply_extrinsic","finalize_block","inherent_extrinsics","check_inherents","BlockBuilder","pending_rewards","points_to_balance","balance_to_points","pool_pending_slash","member_pending_slash","pool_needs_delegate_migration","member_needs_delegate_migration","NominationPoolsApi","nominations_quota","eras_stakers_page_count","StakingApi","validate_transaction","TaggedTransactionQueue","offchain_worker","OffchainWorkerApi","validators","validator_groups","availability_cores","persisted_validation_data","assumed_validation_data","check_validation_outputs","session_index_for_child","validation_code","candidate_pending_availability","candidate_events","dmq_contents","inbound_hrmp_channels_contents","validation_code_by_hash","on_chain_votes","session_info","submit_pvf_check_statement","pvfs_require_precheck","validation_code_hash","disputes","session_executor_params","unapplied_slashes","key_ownership_proof","submit_report_dispute_lost","minimum_backing_votes","para_backing_state","async_backing_params","disabled_validators","node_features","approval_voting_params","claim_queue","candidates_pending_availability","ParachainHost","beefy_genesis","validator_set","submit_report_equivocation_unsigned_extrinsic","generate_key_ownership_proof","BeefyApi","mmr_root","mmr_leaf_count","generate_proof","verify_proof","verify_proof_stateless","MmrApi","authority_set_proof","next_authority_set_proof","BeefyMmrApi","grandpa_authorities","current_set_id","GrandpaApi","configuration","current_epoch_start","current_epoch","next_epoch","BabeApi","authorities","AuthorityDiscoveryApi","generate_session_keys","decode_session_keys","SessionKeys","account_nonce","AccountNonceApi","query_info","query_fee_details","query_weight_to_fee","query_length_to_fee","TransactionPaymentApi","query_call_info","query_call_fee_details","TransactionPaymentCallApi","query_acceptable_payment_assets","query_xcm_weight","query_weight_to_asset_fee","query_delivery_fees","XcmPaymentApi","dry_run_call","dry_run_xcm","DryRunApi","convert_location","LocationToAccountApi","build_state","get_preset","preset_names","GenesisBuilder","apis","MemberCount","Members","FellowshipCollective","FellowshipReferenda","Society","Recoverable","ActiveRecoveries","Recovery","Nis","NisCounterpartBalances","OnDemandAssignmentProvider","as_recovered","set_recovered","create_recovery","initiate_recovery","vouch_recovery","claim_recovery","close_recovery","remove_recovery","cancel_recovered","Voted","RecoveryCreated","RecoveryInitiated","RecoveryVouched","RecoveryClosed","AccountRecovered","RecoveryRemoved","ConfigDepositBase","FriendDepositFactor","MaxFriends","RecoveryDeposit","ParaSudoWrapper","Key","Sudo","sudo_schedule_para_initialize","sudo_schedule_para_cleanup","sudo_schedule_parathread_upgrade","sudo_schedule_parachain_downgrade","sudo_queue_downward_xcm","sudo_establish_hrmp_channel","sudo","sudo_unchecked_weight","set_key","sudo_as","remove_key","Sudid","KeyChanged","KeyRemoved","SudoAsDone","Identity","DelegatedStaking","ParasSudoWrapper","AssignedSlots","StakingAhClient","MultiBlockMigrations","RootTesting","MetaTx","VerifySignature","IdentityMigrator","poke_deposit","DepositPoked"]]`); + replaceTokens = (obj) => Object.fromEntries( + Object.entries(obj).map(([key, value]) => { + const unwrappedValue = typeof value === "object" ? replaceTokens(value) : value; + const numericKey = Number(key); + if (Number.isNaN(numericKey)) { + return [key, unwrappedValue]; + } + return [tokens[numericKey], unwrappedValue]; + }) + ); + tokenizedCommonTrees = commonTrees.map(replaceTokens); + unwrap = (obj, depth) => depth === 0 ? obj : Object.fromEntries( + Object.entries(obj).map(([key, value]) => [ + key, + unwrap( + typeof value === "object" ? value : tokenizedCommonTrees[value], + depth - 1 + ) + ]) + ); + getChainDescriptors = (key) => unwrap(replaceTokens(minified[key]), 2); + Dot = getChainDescriptors("dot"); + Ksm = getChainDescriptors("ksm"); + Paseo = getChainDescriptors("paseo"); + Wnd = getChainDescriptors("wnd"); + } +}); + +// .papi/descriptors/src/metadataTypes.ts +var metadataTypes_exports = {}; +__export(metadataTypes_exports, { + default: () => metadataTypes_default +}); +var content, metadataTypes_default; +var init_metadataTypes = __esm({ + ".papi/descriptors/src/metadataTypes.ts"() { + content = "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CBRzdGFzaABIbnVtX3NsYXNoaW5nX3NwYW5zBAEBBQEACAxlcmEENHNsYXNoX2luZGljZXM5AgEBBQEACDx2YWxpZGF0b3Jfc3Rhc2gADGVyYQQBAQUBAAQMd2hv6QMBAQUBABxIbWluX25vbWluYXRvcl9ib25k7QNIbWluX3ZhbGlkYXRvcl9ib25k7QNMbWF4X25vbWluYXRvcl9jb3VudPEDTG1heF92YWxpZGF0b3JfY291bnTxAzxjaGlsbF90aHJlc2hvbGTxAzhtaW5fY29tbWlzc2lvbvEDSG1heF9zdGFrZWRfcmV3YXJkc/EDAQEFAQAEFHN0YXNoAAEBBQEABDx2YWxpZGF0b3Jfc3Rhc2gAAQEFAQAMPHZhbGlkYXRvcl9zdGFzaAAMZXJhBBBwYWdlBAEBBQEABChjb250cm9sbGVyAAEBBQEABCxjb250cm9sbGVyc90DAQEFAQAQFHN0YXNoAEBtYXliZV9jb250cm9sbGVyBQIsbWF5YmVfdG90YWz1AzxtYXliZV91bmxvY2tpbmcBBAEBBQEBBQEADCRlcmFfaW5kZXgEQHZhbGlkYXRvcl9wYXlvdXQIJHJlbWFpbmRlcggBAQUBAAwUc3Rhc2gAEGRlc3Q1ARhhbW91bnQIAQEFAQAIGHN0YWtlcgAYYW1vdW50CAEBBQEADCR2YWxpZGF0b3IAIGZyYWN0aW9uBCRzbGFzaF9lcmEEAQEFAQAENHNlc3Npb25faW5kZXgEAQEFAQAIFHN0YXNoABhhbW91bnQIAQEFAQAIJG5vbWluYXRvcgAUc3Rhc2gAAQEFAQAEFHN0YXNoAAEBBQEACCRlcmFfaW5kZXgEPHZhbGlkYXRvcl9zdGFzaAABAQUBAAgUc3Rhc2gAFHByZWZzOQEBAQUBAAQQc2l6ZQQBAQUBAAQQbW9kZT0BAQEFAQAEIGZhaWx1cmVzBAAgAJkHAJ0HADkDAQEFAQAIEGtpbmRFASB0aW1lc2xvdCQABADtBgEBBQClBwAAAA0EAKkHAAABAAgQa2V5cw0EFHByb29mJAEBBQEBBQCtBwEBBQCxBwAIAAQBAAhIZXF1aXZvY2F0aW9uX3Byb29mJQQ8a2V5X293bmVyX3Byb29mvQMBAQUBAAgUZGVsYXkEbGJlc3RfZmluYWxpemVkX2Jsb2NrX251bWJlcgQBAQUBAQUBAAQ0YXV0aG9yaXR5X3NldFUBAQEFADkDAAQAtQcABAC9BwEBBQCRAgEACBhhbW91bnQILGJlbmVmaWNpYXJ51QMBAQUBAAQscHJvcG9zYWxfaWQEAQEFAQAQKGFzc2V0X2tpbmSBARhhbW91bnQILGJlbmVmaWNpYXJ5mQEodmFsaWRfZnJvbS0EAQEFAQEFAQAEQGJ1ZGdldF9yZW1haW5pbmcIAQEFAQAMOHByb3Bvc2FsX2luZGV4BBRhd2FyZAgcYWNjb3VudAABAQUBAAQsYnVybnRfZnVuZHMIAQEFAQAEQHJvbGxvdmVyX2JhbGFuY2UIAQEFAQAEFHZhbHVlCAEBBQEADDhwcm9wb3NhbF9pbmRleAQYYW1vdW50CCxiZW5lZmljaWFyeQABAQUBAAgscmVhY3RpdmF0ZWQILGRlYWN0aXZhdGVkCAEBBQEAGBRpbmRleAQoYXNzZXRfa2luZIEBGGFtb3VudAgsYmVuZWZpY2lhcnmZASh2YWxpZF9mcm9tBCRleHBpcmVfYXQEAQEFAQAIFGluZGV4BChwYXltZW50X2lkCAB1BwDVBwAAANkHAQAIKHBvbGxfaW5kZXgEEHZvdGU1BAEBBQEAEBRjbGFzcwQIdG/VAyhjb252aWN0aW9uOQQcYmFsYW5jZQgBAQUBAAQUY2xhc3MEAQEFAQAIFGNsYXNzBBh0YXJnZXTVAwEBBQEACBRjbGFzcy0EFGluZGV4BAEBBQEADBh0YXJnZXTVAxRjbGFzcwQUaW5kZXgEAQEFAQEFAQQAAQgBAQUAAAAEAPkHAAQA2QcBAQUACQgBAAw8cHJvcG9zYWxfb3JpZ2lulQMgcHJvcG9zYWylAUBlbmFjdG1lbnRfbW9tZW50QQQBAQUBAAQUdHJhY2sEAQEFAQAIFGluZGV4BChtYXliZV9oYXNoEQEBAQUBAQUBAAwUaW5kZXgEFHRyYWNrBCBwcm9wb3NhbKUBAQEFAQAMFGluZGV4BAx3aG8AGGFtb3VudAgBAQUBABAUaW5kZXgEFHRyYWNrBCBwcm9wb3NhbKUBFHRhbGx5qQEBAQUBAAgUaW5kZXgEFHRhbGx5qQEBAQUBAAgUaW5kZXgEEGhhc2ggACAAFQEBAAQkY2FsbF9oYXNoIAEBBQEADCRjYWxsX2hhc2ggQGNhbGxfZW5jb2RlZF9sZW4ETGNhbGxfd2VpZ2h0X3dpdG5lc3MYAQEFAQAEEGNhbGzdBgEBBQEBBQEABCRjYWxsX2hhc2ggAQEFAQAIJGNhbGxfaGFzaCAYcmVzdWx0vQEAyQEA0QEBAAQka2V5X3ZhbHVlVQQBAQUBAQUBAAwMa2V5yQEkb2xkX3ZhbHVl1QEkbmV3X3ZhbHVl1QEAZQEACABlAQBhBABlAQBpBAAAAGUBAQEFACQBAAgQZGVzdABIZXRoZXJldW1fc2lnbmF0dXJlXQQBAQUBABAMd2hvZQEUdmFsdWUIQHZlc3Rpbmdfc2NoZWR1bGVlBCRzdGF0ZW1lbnRtBAEBBQEADBBkZXN0AEhldGhlcmV1bV9zaWduYXR1cmVdBCRzdGF0ZW1lbnQkAQEFAQAEJHN0YXRlbWVudCQBAQUBAAwMb2xkZQEMbmV3ZQE4bWF5YmVfcHJlY2xhaW0FAgEBBQEBBQEADAx3aG8AQGV0aGVyZXVtX2FkZHJlc3NlARhhbW91bnQIAAAADQgBAQUAEQgBAAQYdGFyZ2V01QMBAQUBAAgYdGFyZ2V01QMgc2NoZWR1bGV1BAEBBQEADBhzb3VyY2XVAxh0YXJnZXTVAyBzY2hlZHVsZXUEAQEFAQAIPHNjaGVkdWxlMV9pbmRleAQ8c2NoZWR1bGUyX2luZGV4BAEBBQEACBh0YXJnZXTVAzhzY2hlZHVsZV9pbmRleAQBAQUBAQUBAAgcYWNjb3VudAAgdW52ZXN0ZWQIAQAEFGNhbGxzfQQBAQUBAAgUaW5kZXgEEGNhbGzdBgEBBQEACCRhc19vcmlnaW6VAxBjYWxs3QYBAQUBAAgQY2FsbN0GGHdlaWdodBgBAQUBAQUBAAgUaW5kZXgEFGVycm9yBQEBAQUBAAQUZXJyb3IFAQEBBQEABBhyZXN1bHQZAQAAAB0IAAAAKQgBAAwQcmVhbNUDQGZvcmNlX3Byb3h5X3R5cGWFBBBjYWxs3QYBAQUBAAwgZGVsZWdhdGXVAyhwcm94eV90eXBl6QEUZGVsYXkEAQEFAQAMKHByb3h5X3R5cGXpARRkZWxheQQUaW5kZXgEAQEFAQAUHHNwYXduZXLVAyhwcm94eV90eXBl6QEUaW5kZXgEGGhlaWdodAQkZXh0X2luZGV4BAEBBQEACBByZWFs1QMkY2FsbF9oYXNoIAEBBQEACCBkZWxlZ2F0ZdUDJGNhbGxfaGFzaCABAQUBABAgZGVsZWdhdGXVAxByZWFs1QNAZm9yY2VfcHJveHlfdHlwZYUEEGNhbGzdBgEBBQEBBQEAEBBwdXJlAAx3aG8AKHByb3h5X3R5cGXpAVBkaXNhbWJpZ3VhdGlvbl9pbmRleAQBAQUBAAwQcmVhbAAUcHJveHkAJGNhbGxfaGFzaCABAQUBABAkZGVsZWdhdG9yACRkZWxlZ2F0ZWUAKHByb3h5X3R5cGXpARRkZWxheQQALQgAMQgBAAhEb3RoZXJfc2lnbmF0b3JpZXPdAxBjYWxs3QYBAQUBABQkdGhyZXNob2xkBERvdGhlcl9zaWduYXRvcmllc90DPG1heWJlX3RpbWVwb2ludI0EEGNhbGzdBihtYXhfd2VpZ2h0GAEBBQEAFCR0aHJlc2hvbGQERG90aGVyX3NpZ25hdG9yaWVz3QM8bWF5YmVfdGltZXBvaW50jQQkY2FsbF9oYXNoIChtYXhfd2VpZ2h0GAEBBQEAECR0aHJlc2hvbGQERG90aGVyX3NpZ25hdG9yaWVz3QMkdGltZXBvaW508QEkY2FsbF9oYXNoIAEBBQEBBQEADCRhcHByb3ZpbmcAIG11bHRpc2lnACRjYWxsX2hhc2ggAQEFAQAQJGFwcHJvdmluZwAkdGltZXBvaW508QEgbXVsdGlzaWcAJGNhbGxfaGFzaCABAQUBABQkYXBwcm92aW5nACR0aW1lcG9pbnTxASBtdWx0aXNpZwAkY2FsbF9oYXNoIBhyZXN1bHQZAQEBBQEAEChjYW5jZWxsaW5nACR0aW1lcG9pbnTxASBtdWx0aXNpZwAkY2FsbF9oYXNoIAAEADkIAQEFAPUDAQAIFHZhbHVlCCxkZXNjcmlwdGlvbiQBAQUBAAQkYm91bnR5X2lkBAEBBQEADCRib3VudHlfaWQEHGN1cmF0b3LVAwxmZWUIAQEFAQAIJGJvdW50eV9pZAQsYmVuZWZpY2lhcnnVAwEBBQEACCRib3VudHlfaWQEGHJlbWFyayQBAQUBAQUBAAgUaW5kZXgEEGJvbmQIAQEFAQAIFGluZGV4BCxiZW5lZmljaWFyeQABAQUBAAwUaW5kZXgEGHBheW91dAgsYmVuZWZpY2lhcnkAAQEFAQAIJGJvdW50eV9pZAQcY3VyYXRvcgABAQUBAAQkYm91bnR5X2lkBAANAQBBCAEADEBwYXJlbnRfYm91bnR5X2lkBBR2YWx1ZQgsZGVzY3JpcHRpb24kAQEFAQAQQHBhcmVudF9ib3VudHlfaWQEPGNoaWxkX2JvdW50eV9pZAQcY3VyYXRvctUDDGZlZQgBAQUBAAhAcGFyZW50X2JvdW50eV9pZAQ8Y2hpbGRfYm91bnR5X2lkBAEBBQEADEBwYXJlbnRfYm91bnR5X2lkBDxjaGlsZF9ib3VudHlfaWQELGJlbmVmaWNpYXJ51QMBAQUBAQUBAAgUaW5kZXgELGNoaWxkX2luZGV4BAEBBQEADBRpbmRleAQsY2hpbGRfaW5kZXgELGJlbmVmaWNpYXJ5AAEBBQEAEBRpbmRleAQsY2hpbGRfaW5kZXgEGHBheW91dAgsYmVuZWZpY2lhcnkAAQEFABECAQEFAEUIAQEFAFEIAQEFAF0FAQEFAFkIAAQAXQgBAQUACQIBAAgwcmF3X3NvbHV0aW9uWQUcd2l0bmVzc10FAQEFAQAEQG1heWJlX25leHRfc2NvcmVhBQEBBQEABCBzdXBwb3J0c3UFAQEFAQAEMHJhd19zb2x1dGlvblkFAQEFAQAIQG1heWJlX21heF92b3RlcnMtBERtYXliZV9tYXhfdGFyZ2V0cy0EAQEFAQEFAQAMHGNvbXB1dGUBAhhvcmlnaW4FAjBwcmV2X2VqZWN0ZWQUAQEFAQAIHGNvbXB1dGUBAhRzY29yZQkCAQEFAQAIHGFjY291bnQAFHZhbHVlCAEBBQEADBBmcm9tEQIIdG8RAhRyb3VuZAQAAABhCAAIAGUIAQEFAGkIAQAEKGRpc2xvY2F0ZWTVAwEBBQEABBxsaWdodGVy1QMBAQUBAAgcaGVhdmllctUDHGxpZ2h0ZXLVAwEBBQEBBQEADAx3aG8AEGZyb20ICHRvCAEBBQEACAx3aG8AJG5ld19zY29yZQgBAQUAmAAAAG0IAAQAfQgABACBCAAEAJEIAAAABAAAAIkFAQAIGGFtb3VudAgccG9vbF9pZAQBAQUBAAQUZXh0cmGBBQEBBQEACDhtZW1iZXJfYWNjb3VudNUDQHVuYm9uZGluZ19wb2ludHMIAQEFAQAIHHBvb2xfaWQESG51bV9zbGFzaGluZ19zcGFucwQBAQUBAAg4bWVtYmVyX2FjY291bnTVA0hudW1fc2xhc2hpbmdfc3BhbnMEAQEFAQAQGGFtb3VudAgQcm9vdNUDJG5vbWluYXRvctUDHGJvdW5jZXLVAwEBBQEAFBhhbW91bnQIEHJvb3TVAyRub21pbmF0b3LVAxxib3VuY2Vy1QMccG9vbF9pZAQBAQUBAAgccG9vbF9pZAQodmFsaWRhdG9yc90DAQEFAQAIHHBvb2xfaWQEFHN0YXRlHQIBAQUBAAgccG9vbF9pZAQgbWV0YWRhdGEkAQEFAQAYNG1pbl9qb2luX2JvbmTtAzxtaW5fY3JlYXRlX2JvbmTtAyRtYXhfcG9vbHPxAyxtYXhfbWVtYmVyc/EDUG1heF9tZW1iZXJzX3Blcl9wb29s8QNUZ2xvYmFsX21heF9jb21taXNzaW9u8QMBAQUBABAccG9vbF9pZAQgbmV3X3Jvb3SFBTRuZXdfbm9taW5hdG9yhQUsbmV3X2JvdW5jZXKFBQEBBQEABBxwb29sX2lkBAEBBQEACBhtZW1iZXLVAxRleHRyYYEFAQEFAQAEKHBlcm1pc3Npb26JBQEBBQEABBRvdGhlcgABAQUBAAgccG9vbF9pZAQ4bmV3X2NvbW1pc3Npb24lAgEBBQEACBxwb29sX2lkBDhtYXhfY29tbWlzc2lvbgQBAQUBAAgccG9vbF9pZAQsY2hhbmdlX3JhdGUpAgEBBQEACBxwb29sX2lkBChwZXJtaXNzaW9uMQIBAQUBAAQ4bWVtYmVyX2FjY291bnTVAwEBBQEBBQEACCRkZXBvc2l0b3IAHHBvb2xfaWQEAQEFAQAQGG1lbWJlcgAccG9vbF9pZAQYYm9uZGVkCBhqb2luZWQUAQEFAQAMGG1lbWJlcgAccG9vbF9pZAQYcGF5b3V0CAEBBQEAFBhtZW1iZXIAHHBvb2xfaWQEHGJhbGFuY2UIGHBvaW50cwgMZXJhBAEBBQEAEBhtZW1iZXIAHHBvb2xfaWQEHGJhbGFuY2UIGHBvaW50cwgBAQUBAAQccG9vbF9pZAQBAQUBAAgccG9vbF9pZAQkbmV3X3N0YXRlHQIBAQUBAAgccG9vbF9pZAQYbWVtYmVyAAEBBQEADBByb290BQIcYm91bmNlcgUCJG5vbWluYXRvcgUCAQEFAQAIHHBvb2xfaWQEHGJhbGFuY2UIAQEFAQAMHHBvb2xfaWQEDGVyYQQcYmFsYW5jZQgBAQUBAAgccG9vbF9pZAQcY3VycmVudCUCAQEFAQAIHHBvb2xfaWQEOG1heF9jb21taXNzaW9uBAEBBQEACBxwb29sX2lkBCxjaGFuZ2VfcmF0ZSkCAQEFAQAIHHBvb2xfaWQEKHBlcm1pc3Npb24xAgEBBQEACBxwb29sX2lkBChjb21taXNzaW9uCAEBBQEACBxwb29sX2lkBBhhbW91bnQIAQEFAKABAQUAlQgAAAAIAQAENGVyYXNfdG9fY2hlY2sEAQEFAQEFAQAIFHN0YXNoABhyZXN1bHQZAQEBBQEABBBlcmFzOQIBAQUAmQgBAQUAoQgBAAQMbmV3LQQBAQUBAAQMbmV3CAEBBQEABAxuZXcUAQEFAQAEDG5ld5UFAQEFAQAEDG5ld6UFAQEFAQAIFGluZGV4BBR2YWx1ZRQBAQUBAAQMbmV3qQUBAQUBAQUArQgABAC1CAEBBQEDEEkCJAQEAQEFAQMMSQIkBAEBBQEACBBmcm9tBBRjb3VudAQBAQUAFQEBAQUAyQgBAAQQZGF0Yf0FAQEFAQEFAM0IAQEFAN0IAQEFAOkIACAA+QgABAD9CAANAQAgAAQACQkABAANCQAEABEJAAQAOQIABAAVCQAgAAQAIAAkAQAIEHBhcmEEIG5ld19jb2RlJAEBBQEACBBwYXJhBCBuZXdfaGVhZCQBAQUBAAwQcGFyYQQgbmV3X2NvZGUkTHJlbGF5X3BhcmVudF9udW1iZXIEAQEFAQAEEHBhcmEEAQEFAQAEPHZhbGlkYXRpb25fY29kZSQBAQUBAARQdmFsaWRhdGlvbl9jb2RlX2hhc2ggAQEFAQAIEHN0bXQFBiRzaWduYXR1cmVBAgEBBQEACBBwYXJhBBxjb250ZXh0BAEBBQEBBQAEAQEFAQQEAQgBAQUBAwggBAEBBQAdCQEABBR1cF90bwQBAQUABAAlCQBVAgApCQEBBQAtCQBVAgAVAQBVAgAxCQBVAgA5CQAEAEEJAQAMJHJlY2lwaWVudARUcHJvcG9zZWRfbWF4X2NhcGFjaXR5BGRwcm9wb3NlZF9tYXhfbWVzc2FnZV9zaXplBAEBBQEABBhzZW5kZXIEAQEFAQAEKGNoYW5uZWxfaWRVAgEBBQEADBBwYXJhBCxudW1faW5ib3VuZAQwbnVtX291dGJvdW5kBAEBBQEABCBjaGFubmVscwQBAQUBAAgoY2hhbm5lbF9pZFUCNG9wZW5fcmVxdWVzdHMEAQEFAQAQGHNlbmRlcgQkcmVjaXBpZW50BDBtYXhfY2FwYWNpdHkEQG1heF9tZXNzYWdlX3NpemUEAQEFAQAIGHNlbmRlcgQkcmVjaXBpZW50BAEBBQEABEx0YXJnZXRfc3lzdGVtX2NoYWluBAEBBQEBBQEAEBhzZW5kZXIEJHJlY2lwaWVudARUcHJvcG9zZWRfbWF4X2NhcGFjaXR5BGRwcm9wb3NlZF9tYXhfbWVzc2FnZV9zaXplBAEBBQEACDBieV9wYXJhY2hhaW4EKGNoYW5uZWxfaWRVAgEBBQEACBhzZW5kZXIEJHJlY2lwaWVudAQABABFCQAEAN0DAAQApQUASQkATQkASQkAOQIASQkABAEBBQAtBAEBBQEDCCBdAgEBBQEDCCBhAgBJCQBVCQEACDRkaXNwdXRlX3Byb29mIQY8a2V5X293bmVyX3Byb29mvQMBAQUABABZCQEBBQBdCQEBBQBlCQAEAGUJAQAIKG1heF9hbW91bnQIHHBhcmFfaWQEAQEFAQEFAQAMHHBhcmFfaWQEKHNwb3RfcHJpY2UIKG9yZGVyZWRfYnkAAQEFAQAEKHNwb3RfcHJpY2UIAA0BAGkJAAQAiQkABACNCQEADAhpZAQwZ2VuZXNpc19oZWFkJDx2YWxpZGF0aW9uX2NvZGUkAQEFAQAUDHdobwAcZGVwb3NpdAgIaWQEMGdlbmVzaXNfaGVhZCQ8dmFsaWRhdGlvbl9jb2RlJAEBBQEABAhpZAQBAQUBAAgIaWQEFG90aGVyBAEBBQEBBQEACBxwYXJhX2lkBBxtYW5hZ2VyAAEBBQEABBxwYXJhX2lkBAEBBQEACBxwYXJhX2lkBAx3aG8AAQEFAQAIHHBhcmFfaWQEIG90aGVyX2lkBAAEAJEJAQAUEHBhcmEEGGxlYXNlcgAYYW1vdW50CDBwZXJpb2RfYmVnaW4EMHBlcmlvZF9jb3VudAQBAQUBAQUBAAQwbGVhc2VfcGVyaW9kBAEBBQEAGBxwYXJhX2lkBBhsZWFzZXIAMHBlcmlvZF9iZWdpbgQwcGVyaW9kX2NvdW50BDhleHRyYV9yZXNlcnZlZAgwdG90YWxfYW1vdW50CAB1BwAIAAQAnQkBAAggZHVyYXRpb24ESGxlYXNlX3BlcmlvZF9pbmRleAQBAQUBABQQcGFyYQQ0YXVjdGlvbl9pbmRleAQoZmlyc3Rfc2xvdAQkbGFzdF9zbG90BBhhbW91bnQIAQEFAQEFAQAMNGF1Y3Rpb25faW5kZXgEMGxlYXNlX3BlcmlvZAQYZW5kaW5nBAEBBQEABDRhdWN0aW9uX2luZGV4BAEBBQEADBhiaWRkZXIAOGV4dHJhX3Jlc2VydmVkCDB0b3RhbF9hbW91bnQIAQEFAQAIGGJpZGRlcgAYYW1vdW50CAEBBQEADBxwYXJhX2lkBBhsZWFzZXIAGGFtb3VudAgBAQUBABQYYmlkZGVyABxwYXJhX2lkBBhhbW91bnQIKGZpcnN0X3Nsb3QEJGxhc3Rfc2xvdAQBAQUBAAg0YXVjdGlvbl9pbmRleAQwYmxvY2tfbnVtYmVyBAAEAKUJAQAYFGluZGV4BAxjYXAIMGZpcnN0X3BlcmlvZAQsbGFzdF9wZXJpb2QEDGVuZAQgdmVyaWZpZXI9BgEBBQEADBRpbmRleAQUdmFsdWUIJHNpZ25hdHVyZUUGAQEFAQAIDHdobwAUaW5kZXgEAQEFAQAIFGluZGV4BBBtZW1vJAEBBQEACBRpbmRleAQkc2lnbmF0dXJlRQYBAQUBAQUBAAwMd2hvAChmdW5kX2luZGV4BBhhbW91bnQIAQEFAQAIHHBhcmFfaWQEGHJlc3VsdBkBAQEFAQAMDHdobwAccGFyYV9pZAQQbWVtbyQBAQUAdQEBAAQUY291bnQEAQEFAQAEEHdoZW4EAQEFAQAQEGNvcmUEFGJlZ2luBChhc3NpZ25tZW50VQYgZW5kX2hpbnQtBAEBBQEBBQEABBB3aGVuBAEBBQEABBBjb3JlBAEBBQBpBgEBBQBhBgEBBQBdBgEABDBtYXliZV9jb25maWdhBgEBBQEADBhsaW1pdHNdBjxyZWFsX3NpemVfdXBwZXIEMHdpdG5lc3NfdGFza2kGAQEFAQAIEGtleXN9AzB3aXRuZXNzX3NpemUEAQEFAQAMEHJvb3QkKGNoaWxkX2tleXN9Ayh0b3RhbF9zaXplBAEBBQEABBhsaW1pdHNdBgEBBQEACDBwcm9ncmVzc190b3BlBjhwcm9ncmVzc19jaGlsZGUGAQEFAQEFAQAMDHRvcAQUY2hpbGQEHGNvbXB1dGWBAgEBBQEABBRlcnJvcuQACAC1CQC5CQAEALkJAAgAuQkAvQkBAQUAxQkBAQUAyQkAzQkA2QkAAADhCQEBBQD5AgEACBBkZXN0mQEcbWVzc2FnZakGAQEFAQAQEGRlc3SZASxiZW5lZmljaWFyeZkBGGFzc2V0cxkDOGZlZV9hc3NldF9pdGVtBAEBBQEACBxtZXNzYWdlqQYobWF4X3dlaWdodBgBAQUBAAggbG9jYXRpb255ARx2ZXJzaW9uBAEBBQEABERtYXliZV94Y21fdmVyc2lvbi0EAQEFAQAEIGxvY2F0aW9umQEBAQUBABQQZGVzdJkBLGJlbmVmaWNpYXJ5mQEYYXNzZXRzGQM4ZmVlX2Fzc2V0X2l0ZW0EMHdlaWdodF9saW1pdPECAQEFAQAEJHN1c3BlbmRlZBQBAQUBAAgYYXNzZXRzGQMsYmVuZWZpY2lhcnmZAQEBBQEAHBBkZXN0mQEYYXNzZXRzGQNQYXNzZXRzX3RyYW5zZmVyX3R5cGWtBjhyZW1vdGVfZmVlc19pZLEGSGZlZXNfdHJhbnNmZXJfdHlwZa0GSGN1c3RvbV94Y21fb25fZGVzdKkGMHdlaWdodF9saW1pdPECAQEFAQEFAQAEHG91dGNvbWWNAgEBBQEAEBhvcmlnaW55ASxkZXN0aW5hdGlvbnkBHG1lc3NhZ2X5AihtZXNzYWdlX2lkIAEBBQEACBhvcmlnaW55ASBxdWVyeV9pZAgBAQUBAAggcXVlcnlfaWQIIHJlc3BvbnNluQIBAQUBAAwgcXVlcnlfaWQIMHBhbGxldF9pbmRleAQoY2FsbF9pbmRleAQBAQUBABQgcXVlcnlfaWQIMHBhbGxldF9pbmRleAQoY2FsbF9pbmRleAQ0YWN0dWFsX3dlaWdodBhMbWF4X2J1ZGdldGVkX3dlaWdodBgBAQUBAAwYb3JpZ2lueQEgcXVlcnlfaWQIRGV4cGVjdGVkX2xvY2F0aW9uvQIBAQUBAAQgcXVlcnlfaWQIAQEFAQAMEGhhc2ggGG9yaWdpbnkBGGFzc2V0cxkDAQEFAQAQLGRlc3RpbmF0aW9ueQEYcmVzdWx0BBBjb3N0oQIobWVzc2FnZV9pZCABAQUBAAggbG9jYXRpb255ARx2ZXJzaW9u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AQEFAQAEGHJlc3VsdJULAQEFAJ0LAAAAoQwAAAClDAAEAAABAQUAsQwAAAC5DAC9DADBDAAAACQBAQUAxQwBAQUAyQwAIQIAwQwBAAwMd2hv1QMUdmFsdWUIDHRpcAgBAQUBAAgkY2FuZGlkYXRl1QMcYXBwcm92ZRQBAQUBAAQcYXBwcm92ZRQBAQUBAAQYYW1vdW50CAEBBQEAGBxmb3VuZGVy1QMsbWF4X21lbWJlcnMEKG1heF9pbnRha2UELG1heF9zdHJpa2VzBERjYW5kaWRhdGVfZGVwb3NpdAgUcnVsZXMkAQEFAQAIDHdob9UDHGZvcmdpdmUUAQEFAQAQLG1heF9tZW1iZXJzBChtYXhfaW50YWtlBCxtYXhfc3RyaWtlcwREY2FuZGlkYXRlX2RlcG9zaXQIAQEFAQAEJGNhbmRpZGF0ZQABAQUBAAgkY2FuZGlkYXRlAAxtYXgEAQEFAQAIPGNoYWxsZW5nZV9yb3VuZAQMbWF4BAEBBQEBBQEABBxmb3VuZGVyAAEBBQEACDBjYW5kaWRhdGVfaWQAFG9mZmVyCAEBBQEADDBjYW5kaWRhdGVfaWQAFG9mZmVyCCB2b3VjaGluZwABAQUBAAQkY2FuZGlkYXRlAAEBBQEACBxwcmltYXJ5AChjYW5kaWRhdGVz3QMBAQUBAAgMd2hvABhqdWRnZWQUAQEFAQAEGG1lbWJlcgABAQUBAAwkY2FuZGlkYXRlABR2b3RlcgAQdm90ZRQBAQUBAAgUdm90ZXIAEHZvdGUUAQEFAQAEGHBhcmFtc50LAQEFAQAIGG1lbWJlcgAQcmFuawQAAADNDAC9DADRDAEACBxhY2NvdW501QMQY2FsbJUMAQEFAQAIEGxvc3TVAxxyZXNjdWVy1QMBAQUBAAwcZnJpZW5kc90DJHRocmVzaG9sZAQwZGVsYXlfcGVyaW9kBAEBBQEABBxhY2NvdW501QMBAQUBAAQccmVzY3VlctUDAQEFAQEFAQAIMGxvc3RfYWNjb3VudAA8cmVzY3Vlcl9hY2NvdW50AAEBBQEADDBsb3N0X2FjY291bnQAPHJlc2N1ZXJfYWNjb3VudAAYc2VuZGVyAAEBBQEABDBsb3N0X2FjY291bnQAAAQA3QwBABAQd2hlbgQ4bWF5YmVfcGVyaW9kaWOBAyBwcmlvcml0eQQQY2FsbJUMAQEFAQAUCGlkIBB3aGVuBDhtYXliZV9wZXJpb2RpY4EDIHByaW9yaXR5BBBjYWxslQwBAQUBABAUYWZ0ZXIEOG1heWJlX3BlcmlvZGljgQMgcHJpb3JpdHkEEGNhbGyVDAEBBQEAFAhpZCAUYWZ0ZXIEOG1heWJlX3BlcmlvZGljgQMgcHJpb3JpdHkEEGNhbGyVDAEBBQEBBQEADBB0YXNrDQEIaWQRARhyZXN1bHSVCwAAAOkMAQAMEHJlYWzVA0Bmb3JjZV9wcm94eV90eXBlGQwQY2FsbJUMAQEFAQAMIGRlbGVnYXRl1QMocHJveHlfdHlwZa0LFGRlbGF5BAEBBQEADChwcm94eV90eXBlrQsUZGVsYXkEFGluZGV4BAEBBQEAFBxzcGF3bmVy1QMocHJveHlfdHlwZa0LFGluZGV4BBhoZWlnaHQEJGV4dF9pbmRleAQBAQUBABAgZGVsZWdhdGXVAxByZWFs1QNAZm9yY2VfcHJveHlfdHlwZRkMEGNhbGyVDAEBBQEBBQEAEBBwdXJlAAx3aG8AKHByb3h5X3R5cGWtC1BkaXNhbWJpZ3VhdGlvbl9pbmRleAQBAQUBABAkZGVsZWdhdG9yACRkZWxlZ2F0ZWUAKHByb3h5X3R5cGWtCxRkZWxheQQBAAhEb3RoZXJfc2lnbmF0b3JpZXPdAxBjYWxslQwBAQUBABQkdGhyZXNob2xkBERvdGhlcl9zaWduYXRvcmllc90DPG1heWJlX3RpbWVwb2ludI0EEGNhbGyVDChtYXhfd2VpZ2h0GAEBBQEBBQEAFCRhcHByb3ZpbmcAJHRpbWVwb2ludPEBIG11bHRpc2lnACRjYWxsX2hhc2ggGHJlc3VsdJULAAQA7QwBAAgwcmF3X3NvbHV0aW9uiQwcd2l0bmVzc10FAQEFAQAEMHJhd19zb2x1dGlvbokMAQEFAQEFANkHAAQA8QwBAQUA9QwABAD5DAEBBQAJBwEACBhhbW91bnQIIGR1cmF0aW9uBAEBBQEACBRpbmRleARAbWF5YmVfcHJvcG9ydGlvbvUDAQEFAQEFAQAMDHdobwAYYW1vdW50CCBkdXJhdGlvbgQBAQUBABQUaW5kZXgEGGV4cGlyeQQMd2hvAChwcm9wb3J0aW9uCBhhbW91bnQIAQEFAQAUFGluZGV4BAx3aG8AKHByb3BvcnRpb24IGGFtb3VudAgcZHJvcHBlZBQBAQUBAAQcZGVmaWNpdAgBAQUBAAwQZnJvbQAIdG8AFGluZGV4BAAAAAENAQEFAQAIFHN0YXNoABhyZXN1bHSVCwEBBQEACBxwYXJhX2lkBBhyZXN1bHSVCwEDBCQABQ0BAwiVDAQA+QoBAwiVDAQABQsBAwjlC5UMABENAQMImQGpBgAZDQEBBQBlDQEBBQEACDhkaXNwYXRjaF9lcnJvcikNNGRpc3BhdGNoX2luZm9AAQAQEHdoZW4EOG1heWJlX3BlcmlvZGljgQMgcHJpb3JpdHkEEGNhbGyJDQEBBQEAFAhpZCAQd2hlbgQ4bWF5YmVfcGVyaW9kaWOBAyBwcmlvcml0eQQQY2FsbIkNAQEFAQAQFGFmdGVyBDhtYXliZV9wZXJpb2RpY4EDIHByaW9yaXR5BBBjYWxsiQ0BAQUBABQIaWQgFGFmdGVyBDhtYXliZV9wZXJpb2RpY4EDIHByaW9yaXR5BBBjYWxsiQ0BAQUBAQUBAAwQdGFzaw0BCGlkEQEYcmVzdWx0MQ0BAAQQY2FsbIkNAQEFAQEFAQAIJGNhbGxfaGFzaCAYcmVzdWx0PQ0BAAQUY2FsbHNxDQEBBQEACBRpbmRleAQQY2FsbIkNAQEFAQAIJGFzX29yaWdpbpUDEGNhbGyJDQEBBQEACBBjYWxsiQ0Yd2VpZ2h0GAEBBQEBBQEACBRpbmRleAQUZXJyb3IpDQEBBQEABBRlcnJvcikNAQEFAQAEGHJlc3VsdDENAQAMEHJlYWzVA0Bmb3JjZV9wcm94eV90eXBlhQQQY2FsbIkNAQEFAQAQIGRlbGVnYXRl1QMQcmVhbNUDQGZvcmNlX3Byb3h5X3R5cGWFBBBjYWxsiQ0BAQUBAAhEb3RoZXJfc2lnbmF0b3JpZXPdAxBjYWxsiQ0BAQUBABQkdGhyZXNob2xkBERvdGhlcl9zaWduYXRvcmllc90DPG1heWJlX3RpbWVwb2ludI0EEGNhbGyJDShtYXhfd2VpZ2h0GAEBBQEBBQEAFCRhcHByb3ZpbmcAJHRpbWVwb2ludPEBIG11bHRpc2lnACRjYWxsX2hhc2ggGHJlc3VsdDENAQEFAQAIFHN0YXNoABhyZXN1bHQxDQEBBQEACBxwYXJhX2lkBBhyZXN1bHQxDQEACAhpZAQcZ2VuZXNpcxUJAQEFAQAICGlkBAx4Y22pBgEBBQEABAxuZXfVAwEBBQEACAx3aG/VAxBjYWxsiQ0BAQUBAQUBAAQsc3Vkb19yZXN1bHQxDQEBBQEACAxvbGQFAgxuZXcAAQMEJACNDQEDCIkNBAD5CgEDCIkNBAAFCwEDCJUDiQ0AmQ0BAwiZAakGAKENAQEFAD0PAQEFAEEPAQEFAQAIOGRpc3BhdGNoX2Vycm9y/Q00ZGlzcGF0Y2hfaW5mb0ABAQUBAAgkY29kZV9oYXNoIBRlcnJvcv0NAQEFAQAQDHdobwAUaW5kZXgELG9sZF9kZXBvc2l0CCxuZXdfZGVwb3NpdAgAAABdDwEADDx2YWxpZGF0b3Jfc3Rhc2gADGVyYQQ4c2xhc2hfZnJhY3Rpb24EAQEFAQEFAQAQJGVyYV9pbmRleAQ8dmFsaWRhdG9yX3N0YXNoABBwYWdlBBBuZXh0LQQBAQUBAAgUc3Rhc2gAOGZvcmNlX3dpdGhkcmF3CAEBBQEABBR1cF90bwQBAQUBAAQkdmFsaWRhdG9yAAEABBRjYWxsc9UQAQEFAQAIFGluZGV4BBBjYWxs0RABAQUBAAgkYXNfb3JpZ2ludQ8QY2FsbNEQAQEFAQAIEGNhbGzREBh3ZWlnaHQYAQEFAQAIEG1haW7RECBmYWxsYmFja9EQAQEFAQEFAQAIFGluZGV4BBRlcnJvcv0NAQEFAQAEFGVycm9y/Q0BAQUBAAQYcmVzdWx0FQ4BAQUBAAQobWFpbl9lcnJvcv0NAAAA4RAAAADxDwAAAOUQAQEFAPEQACQA9RAAJAD9EAAkAAERACQABAEABBBpbmZv7Q8BAQUBAAQQc3Vic/UPAQEFAQAIJHJlZ19pbmRleAQcbWF4X2ZlZQgBAQUBAAQkcmVnX2luZGV4BAEBBQEACBRpbmRleAQMZmVlCAEBBQEACBRpbmRleAQYZmllbGRzCAEBBQEAECRyZWdfaW5kZXgEGHRhcmdldNUDJGp1ZGdlbWVudPkPIGlkZW50aXR5IAEBBQEACAxzdWLVAxBkYXRh3Q8BAQUBAAQMc3Vi1QMBAQUBAAwkYXV0aG9yaXR51QMYc3VmZml4JChhbGxvY2F0aW9uBAEBBQEACBhzdWZmaXgkJGF1dGhvcml0edUDAQEFAQAQDHdob9UDIHVzZXJuYW1lJCRzaWduYXR1cmVFBjh1c2VfYWxsb2NhdGlvbhQBAQUBAAQgdXNlcm5hbWUkAQEFAQEFAQAIDHdobwAcZGVwb3NpdAgBAQUBAAgMd2hvADxyZWdpc3RyYXJfaW5kZXgEAQEFAQAIGHRhcmdldAA8cmVnaXN0cmFyX2luZGV4BAEBBQEABDxyZWdpc3RyYXJfaW5kZXgEAQEFAQAMDHN1YgAQbWFpbgAcZGVwb3NpdAgBAQUBAAwQbWFpbgA4bnVtYmVyX29mX3N1YnMELG5ld19kZXBvc2l0CAEBBQEACAxzdWIAEG1haW4AAQEFAQAEJGF1dGhvcml0eQABAQUBAAgMd2hvACB1c2VybmFtZSQBAQUBAAwMd2hvACB1c2VybmFtZSQoZXhwaXJhdGlvbgQBAQUBAAQUd2hvc2UAAQEFAQAEIHVzZXJuYW1lJAEACBxhY2NvdW501QMQY2FsbNEQAQEFAQAENG1heWJlX2FjY291bnQBEAEBBQEBBQEAEAx3aG8AEGtpbmQhDixvbGRfZGVwb3NpdAgsbmV3X2RlcG9zaXQIAQEFAQAIHGFjY291bnQAOHNjaGVkdWxlX2luZGV4BAAEAA0RAQAQEHdoZW4EOG1heWJlX3BlcmlvZGljgQMgcHJpb3JpdHkEEGNhbGzREAEBBQEAFAhpZCAQd2hlbgQ4bWF5YmVfcGVyaW9kaWOBAyBwcmlvcml0eQQQY2FsbNEQAQEFAQAQFGFmdGVyBDhtYXliZV9wZXJpb2RpY4EDIHByaW9yaXR5BBBjYWxs0RABAQUBABQIaWQgFGFmdGVyBDhtYXliZV9wZXJpb2RpY4EDIHByaW9yaXR5BBBjYWxs0RABAQUBAQUBAAwQdGFzaw0BCGlkEQEYcmVzdWx0FQ4BAAQQY2FsbNEQAQEFAQAIDHdob9UDEGNhbGzREAEBBQEBBQEABCxzdWRvX3Jlc3VsdBUOAAAAGREBAAwQcmVhbNUDQGZvcmNlX3Byb3h5X3R5cGUREBBjYWxs0RABAQUBAAwgZGVsZWdhdGXVAyhwcm94eV90eXBlNQ4UZGVsYXkEAQEFAQAMKHByb3h5X3R5cGU1DhRkZWxheQQUaW5kZXgEAQEFAQAUHHNwYXduZXLVAyhwcm94eV90eXBlNQ4UaW5kZXgEGGhlaWdodAQkZXh0X2luZGV4BAEBBQEAECBkZWxlZ2F0ZdUDEHJlYWzVA0Bmb3JjZV9wcm94eV90eXBlERAQY2FsbNEQAQEFAQEFAQAQEHB1cmUADHdobwAocHJveHlfdHlwZTUOUGRpc2FtYmlndWF0aW9uX2luZGV4BAEBBQEAEBBwdXJlABxzcGF3bmVyAChwcm94eV90eXBlNQ5QZGlzYW1iaWd1YXRpb25faW5kZXgEAQEFAQAQJGRlbGVnYXRvcgAkZGVsZWdhdGVlAChwcm94eV90eXBlNQ4UZGVsYXkEAQEFAQAQDHdobwAQa2luZDkOLG9sZF9kZXBvc2l0CCxuZXdfZGVwb3NpdAgBAAhEb3RoZXJfc2lnbmF0b3JpZXPdAxBjYWxs0RABAQUBABQkdGhyZXNob2xkBERvdGhlcl9zaWduYXRvcmllc90DPG1heWJlX3RpbWVwb2ludI0EEGNhbGzREChtYXhfd2VpZ2h0GAEBBQEADCR0aHJlc2hvbGQERG90aGVyX3NpZ25hdG9yaWVz3QMkY2FsbF9oYXNoIAEBBQEBBQEAFCRhcHByb3ZpbmcAJHRpbWVwb2ludPEBIG11bHRpc2lnACRjYWxsX2hhc2ggGHJlc3VsdBUOAQEFAQAQDHdobwAkY2FsbF9oYXNoICxvbGRfZGVwb3NpdAgsbmV3X2RlcG9zaXQIAQEFALENAQEFAQAMHHBvb2xfaWQEGG1lbWJlcgBAcmVsZWFzZWRfYmFsYW5jZQgBAQUBAAgYbWVtYmVyAChwZXJtaXNzaW9uiQUBAQUBAAgccG9vbF9pZAQYY2FsbGVyAAEBBQEAGDRtaW5fam9pbl9ib25kCDxtaW5fY3JlYXRlX2JvbmQIJG1heF9wb29scy0ELG1heF9tZW1iZXJzLQRQbWF4X21lbWJlcnNfcGVyX3Bvb2wtBFRnbG9iYWxfbWF4X2NvbW1pc3Npb24tBAEBBQEACBRzdGFzaAAYcmVzdWx0FQ4BAQUBAAgMd2hvABB2b3RlNQQBAQUBAAgMd2hvABRjbGFzcwQABAAhEQEADDxwcm9wb3NhbF9vcmlnaW51DyBwcm9wb3NhbKUBQGVuYWN0bWVudF9tb21lbnRBBAEBBQEBBQEACCRjYWxsX2hhc2ggGHJlc3VsdFUOAAQAJREBABAoYXNzZXRfa2luZI0OGGFtb3VudAgsYmVuZWZpY2lhcnmRDih2YWxpZF9mcm9tLQQBAQUBAQUBABgUaW5kZXgEKGFzc2V0X2tpbmSNDhhhbW91bnQILGJlbmVmaWNpYXJ5kQ4odmFsaWRfZnJvbQQkZXhwaXJlX2F0BAAAACkRAAAALREBAQUBAAwUYWdlbnQAJGRlbGVnYXRvcgAYYW1vdW50CAEBBQBBEQAEAEkRAQEFAQMQpQ4kBAQBAQUBAwylDiQEAQEFAFURAQAEEGRhdGE9EAEBBQEBBQBhEQAEAGURAQAMEHBhcmEENG5ld19jb2RlX2hhc2ggMHZhbGlkX3BlcmlvZAQBAQUBAQUBAAwccGFyYV9pZAQkY29kZV9oYXNoICRleHBpcmVfYXQEAEkJAGkRAQAINGRpc3B1dGVfcHJvb2ZNEDxrZXlfb3duZXJfcHJvb2a9AwEBBQEACAhpZAQMeGNtWRABAQUBAQUBAAgccGFyYV9pZAQYcmVzdWx0FQ4ABAANAQAEAG0RAQAICGlkBEhsZWFzZV9wZXJpb2Rfc3RhcnRhEAEBBQEABBRzbG90cwQBAQUBAQUBAAQUc2xvdHMEAQEFAIUOAQAIDHdobwAYYW1vdW50CAEBBQEBBQBxEQEBBQBtEAEBBQBxEAEBBQCFEQEABBhyZXBvcnRtEAEBBQEABBBtb2RlcRABAQUBAQUBABAIaWQEXG5ld192YWxpZGF0b3Jfc2V0X2NvdW50BCxwcnVuZV91cF90by0EIGxlZnRvdmVyFAEBBQC9DgEBBQB9EAAkABUBAQAEGGN1cnNvcoEQAQEFAQAMFGluZGV4BDBpbm5lcl9jdXJzb3LFBShzdGFydGVkX2F0LQQBAQUBAAQgc2VsZWN0b3KFEAEBBQEBBQEABChtaWdyYXRpb25zBAEBBQEACBRpbmRleAQQdG9vawQBAQUBAAQsbmV4dF9jdXJzb3LFBQAIAJERAJURAAQAlREACACVEQC9CQEBBQCdEQChEQClEQAAAK0RAQEFABUPAJEOALkRAQAIEGRlc3SRDhxtZXNzYWdlWRABAQUBABAQZGVzdJEOLGJlbmVmaWNpYXJ5kQ4YYXNzZXRzHQ84ZmVlX2Fzc2V0X2l0ZW0EAQEFAQAIHG1lc3NhZ2VZEChtYXhfd2VpZ2h0GAEBBQEACCBsb2NhdGlvbokOHHZlcnNpb24EAQEFAQAEIGxvY2F0aW9ukQ4BAQUBABQQZGVzdJEOLGJlbmVmaWNpYXJ5kQ4YYXNzZXRzHQ84ZmVlX2Fzc2V0X2l0ZW0EMHdlaWdodF9saW1pdPECAQEFAQAIGGFzc2V0cx0PLGJlbmVmaWNpYXJ5kQ4BAQUBABwQZGVzdJEOGGFzc2V0cx0PUGFzc2V0c190cmFuc2Zlcl90eXBljRA4cmVtb3RlX2ZlZXNfaWSREEhmZWVzX3RyYW5zZmVyX3R5cGWNEEhjdXN0b21feGNtX29uX2Rlc3RZEDB3ZWlnaHRfbGltaXTxAgEBBQEACBxhbGlhc2VykQ4cZXhwaXJlc/UDAQEFAQAEHGFsaWFzZXKRDgEBBQEBBQEABBxvdXRjb21l0Q4BAQUBABAYb3JpZ2luiQ4sZGVzdGluYXRpb26JDhxtZXNzYWdlFQ8obWVzc2FnZV9pZCABAQUBABAYb3JpZ2luiQ4sZGVzdGluYXRpb26JDhRlcnJvchkPKG1lc3NhZ2VfaWQgAQEFAQAMGG9yaWdpbokOFGVycm9yyQ4obWVzc2FnZV9pZCABAQUBAAgYb3JpZ2luiQ4gcXVlcnlfaWQIAQEFAQAIIHF1ZXJ5X2lkCCByZXNwb25zZeUOAQEFAQAMGG9yaWdpbokOIHF1ZXJ5X2lkCERleHBlY3RlZF9sb2NhdGlvbukOAQEFAQAMEGhhc2ggGG9yaWdpbokOGGFzc2V0cx0PAQEFAQAQLGRlc3RpbmF0aW9uiQ4YcmVzdWx0BBBjb3N02Q4obWVzc2FnZV9pZCABAQUBAAggbG9jYXRpb26JDhx2ZXJzaW9uBAEBBQEADCBsb2NhdGlvbokOIHF1ZXJ5X2lkCBRlcnJvcskOAQEFAQAIIGxvY2F0aW9ukQ4gcXVlcnlfaWQIAQEFAQAQGG9yaWdpbokOIHF1ZXJ5X2lkCEBleHBlY3RlZF9xdWVyaWVyiQ5QbWF5YmVfYWN0dWFsX3F1ZXJpZXLpDgEBBQEADCxkZXN0aW5hdGlvbokOEGNvc3TZDihtZXNzYWdlX2lkIAEBBQEACBhwYXlpbmeJDhBmZWVz2Q4BAQUBAAwcYWxpYXNlcokOGHRhcmdldIkOGGV4cGlyefUDAQEFAQAIHGFsaWFzZXKJDhh0YXJnZXSJDgEBBQEABBh0YXJnZXSJDgEBBQEACBRpbmRleAQUZXJyb3LlDQCNDgAIAQAIKGFzc2V0X2tpbmSNDhByYXRlCAEBBQEABChhc3NldF9raW5kjQ4BAQUBAQUBAAgoYXNzZXRfa2luZI0OEHJhdGUIAQEFAQAEKGFzc2V0X2tpbmSNDgEBBQEADChhc3NldF9raW5kjQ4Mb2xkCAxuZXcIAQAEFHJhdGlvBAEBBQEABBxtZXRhX3R4sRABAQUBAQUBAAQYcmVzdWx0VQ4BAAhIZXF1aXZvY2F0aW9uX3Byb29mxRA8a2V5X293bmVyX3Byb29mvQMBAQUBAAhIZXF1aXZvY2F0aW9uX3Byb29m0QY8a2V5X293bmVyX3Byb29mvQMBAQUBAAQMd2hvAAEBBQEBBQEADAx3aG8AIGlkZW50aXR5CBBzdWJzCAEDAABBDwEDCL0RJADFEQEDBCQA0REBAwwpCiQgANURAQMAAOERAQMEBADlEQEDAADtEQEDAADxEQEDBAQAARIBAwQEAAUSAQMEBAANEgEDCBESJAAUAQMI0QYkABQBAwgELQQAxQUBAwjREAQA+QoBAwjREAQABQsBAwQEABkSAQMEWRAAFQsBAwgYkRAAGQsBAwiRDlkQAB0SAQMMdQ/REAQAORIBAwiRDlkQAEESAQMEkQ4ATQsBAwQEAL0MAQMIRRKRDgBNElESAQEBAgEDABAQZnJlZQggcmVzZXJ2ZWQIGGZyb3plbggUZmxhZ3MIABQUbm9uY2UEJGNvbnN1bWVycwQkcHJvdmlkZXJzBCxzdWZmaWNpZW50cwQQZGF0YQwBAAAIIHJlZl90aW1lCChwcm9vZl9zaXplCAAMGG5vcm1hbBgsb3BlcmF0aW9uYWwYJG1hbmRhdG9yeRgFAYAFAAUBEAIUKFByZVJ1bnRpbWUBAwgoJCRDb25zZW5zdXMBAwgoJBBTZWFsAQMIKCQUT3RoZXIBBQBkUnVudGltZUVudmlyb25tZW50VXBkYXRlZAEBBQQsAAIMOEFwcGx5RXh0cmluc2ljAQECMEZpbmFsaXphdGlvbgEBBThJbml0aWFsaXphdGlvbgEBBQIMGE5vcm1hbAEBBSxPcGVyYXRpb25hbAEBBSRNYW5kYXRvcnkBAQUCCAxZZXMBAQUITm8BAQUADBh3ZWlnaHQYFGNsYXNzOCBwYXlzX2ZlZTwCJDxJbnZhbGlkU3BlY05hbWUBAQVoU3BlY1ZlcnNpb25OZWVkc1RvSW5jcmVhc2UBAQV0RmFpbGVkVG9FeHRyYWN0UnVudGltZVZlcnNpb24BAQVMTm9uRGVmYXVsdENvbXBvc2l0ZQEBBTxOb25aZXJvUmVmQ291bnQBAQUwQ2FsbEZpbHRlcmVkAQEFbE11bHRpQmxvY2tNaWdyYXRpb25zT25nb2luZwEBBUROb3RoaW5nQXV0aG9yaXplZAEBBTBVbmF1dGhvcml6ZWQBAQUCFEBGYWlsZWRUb1NjaGVkdWxlAQEFIE5vdEZvdW5kAQEFXFRhcmdldEJsb2NrTnVtYmVySW5QYXN0AQEFSFJlc2NoZWR1bGVOb0NoYW5nZQEBBRROYW1lZAEBBQIkGFRvb0JpZwEBBTBBbHJlYWR5Tm90ZWQBAQU0Tm90QXV0aG9yaXplZAEBBSBOb3ROb3RlZAEBBSRSZXF1ZXN0ZWQBAQUwTm90UmVxdWVzdGVkAQEFHFRvb01hbnkBAQUYVG9vRmV3AQEFGE5vQ29zdAEBBQIQYEludmFsaWRFcXVpdm9jYXRpb25Qcm9vZgEBBWBJbnZhbGlkS2V5T3duZXJzaGlwUHJvb2YBAQVYRHVwbGljYXRlT2ZmZW5jZVJlcG9ydAEBBVBJbnZhbGlkQ29uZmlndXJhdGlvbgEBBQIULE5vdEFzc2lnbmVkAQEFIE5vdE93bmVyAQEFFEluVXNlAQEFLE5vdFRyYW5zZmVyAQEFJFBlcm1hbmVudAEBBQIwOFZlc3RpbmdCYWxhbmNlAQEFVExpcXVpZGl0eVJlc3RyaWN0aW9ucwEBBUxJbnN1ZmZpY2llbnRCYWxhbmNlAQEFSEV4aXN0ZW50aWFsRGVwb3NpdAEBBTRFeHBlbmRhYmlsaXR5AQEFXEV4aXN0aW5nVmVzdGluZ1NjaGVkdWxlAQEFLERlYWRBY2NvdW50AQEFPFRvb01hbnlSZXNlcnZlcwEBBTBUb29NYW55SG9sZHMBAQU4VG9vTWFueUZyZWV6ZXMBAQVMSXNzdWFuY2VEZWFjdGl2YXRlZAEBBSREZWx0YVplcm8BAQUCfDROb3RDb250cm9sbGVyAQEFIE5vdFN0YXNoAQEFNEFscmVhZHlCb25kZWQBAQU0QWxyZWFkeVBhaXJlZAEBBTBFbXB0eVRhcmdldHMBAQU4RHVwbGljYXRlSW5kZXgBAQVESW52YWxpZFNsYXNoSW5kZXgBAQVASW5zdWZmaWNpZW50Qm9uZAEBBTBOb01vcmVDaHVua3MBAQU0Tm9VbmxvY2tDaHVuawEBBTBGdW5kZWRUYXJnZXQBAQVISW52YWxpZEVyYVRvUmV3YXJkAQEFaEludmFsaWROdW1iZXJPZk5vbWluYXRpb25zAQEFSE5vdFNvcnRlZEFuZFVuaXF1ZQEBBThBbHJlYWR5Q2xhaW1lZAEBBSxJbnZhbGlkUGFnZQEBBVRJbmNvcnJlY3RIaXN0b3J5RGVwdGgBAQVYSW5jb3JyZWN0U2xhc2hpbmdTcGFucwEBBSBCYWRTdGF0ZQEBBThUb29NYW55VGFyZ2V0cwEBBSRCYWRUYXJnZXQBAQVAQ2Fubm90Q2hpbGxPdGhlcgEBBURUb29NYW55Tm9taW5hdG9ycwEBBURUb29NYW55VmFsaWRhdG9ycwEBBUBDb21taXNzaW9uVG9vTG93AQEFLEJvdW5kTm90TWV0AQEFUENvbnRyb2xsZXJEZXByZWNhdGVkAQEFTENhbm5vdFJlc3RvcmVMZWRnZXIBAQVsUmV3YXJkRGVzdGluYXRpb25SZXN0cmljdGVkAQEFOE5vdEVub3VnaEZ1bmRzAQEFXFZpcnR1YWxTdGFrZXJOb3RBbGxvd2VkAQEFAhQwSW52YWxpZFByb29mAQEFXE5vQXNzb2NpYXRlZFZhbGlkYXRvcklkAQEFNER1cGxpY2F0ZWRLZXkBAQUYTm9LZXlzAQEFJE5vQWNjb3VudAEBBQIcLFBhdXNlRmFpbGVkAQEFMFJlc3VtZUZhaWxlZAEBBTRDaGFuZ2VQZW5kaW5nAQEFHFRvb1Nvb24BAQVgSW52YWxpZEtleU93bmVyc2hpcFByb29mAQEFYEludmFsaWRFcXVpdm9jYXRpb25Qcm9vZgEBBVhEdXBsaWNhdGVPZmZlbmNlUmVwb3J0AQEFAiwwSW52YWxpZEluZGV4AQEFQFRvb01hbnlBcHByb3ZhbHMBAQVYSW5zdWZmaWNpZW50UGVybWlzc2lvbgEBBUxQcm9wb3NhbE5vdEFwcHJvdmVkAQEFWEZhaWxlZFRvQ29udmVydEJhbGFuY2UBAQUwU3BlbmRFeHBpcmVkAQEFLEVhcmx5UGF5b3V0AQEFQEFscmVhZHlBdHRlbXB0ZWQBAQUsUGF5b3V0RXJyb3IBAQUwTm90QXR0ZW1wdGVkAQEFMEluY29uY2x1c2l2ZQEBBQIwKE5vdE9uZ29pbmcBAQUgTm90Vm90ZXIBAQUwTm9QZXJtaXNzaW9uAQEFPE5vUGVybWlzc2lvbllldAEBBURBbHJlYWR5RGVsZWdhdGluZwEBBTRBbHJlYWR5Vm90aW5nAQEFREluc3VmZmljaWVudEZ1bmRzAQEFNE5vdERlbGVnYXRpbmcBAQUgTm9uc2Vuc2UBAQU8TWF4Vm90ZXNSZWFjaGVkAQEFLENsYXNzTmVlZGVkAQEFIEJhZENsYXNzAQEFAjgoTm90T25nb2luZwEBBShIYXNEZXBvc2l0AQEFIEJhZFRyYWNrAQEFEEZ1bGwBAQUoUXVldWVFbXB0eQEBBTRCYWRSZWZlcmVuZHVtAQEFLE5vdGhpbmdUb0RvAQEFHE5vVHJhY2sBAQUoVW5maW5pc2hlZAEBBTBOb1Blcm1pc3Npb24BAQUkTm9EZXBvc2l0AQEFJEJhZFN0YXR1cwEBBUBQcmVpbWFnZU5vdEV4aXN0AQEFhFByZWltYWdlU3RvcmVkV2l0aERpZmZlcmVudExlbmd0aAEBBQIUTFVuYXZhaWxhYmxlUHJlSW1hZ2UBAQU8VW5kZWNvZGFibGVDYWxsAQEFYEludmFsaWRDYWxsV2VpZ2h0V2l0bmVzcwEBBVBDYWxsSXNOb3RXaGl0ZWxpc3RlZAEBBVhDYWxsQWxyZWFkeVdoaXRlbGlzdGVkAQEFAhhgSW52YWxpZEV0aGVyZXVtU2lnbmF0dXJlAQEFQFNpZ25lckhhc05vQ2xhaW0BAQVAU2VuZGVySGFzTm9DbGFpbQEBBTBQb3RVbmRlcmZsb3cBAQVASW52YWxpZFN0YXRlbWVudAEBBUxWZXN0ZWRCYWxhbmNlRXhpc3RzAQEFAhQoTm90VmVzdGluZwEBBVRBdE1heFZlc3RpbmdTY2hlZHVsZXMBAQUkQW1vdW50TG93AQEFYFNjaGVkdWxlSW5kZXhPdXRPZkJvdW5kcwEBBVRJbnZhbGlkU2NoZWR1bGVQYXJhbXMBAQUCBDBUb29NYW55Q2FsbHMBAQUCIBxUb29NYW55AQEFIE5vdEZvdW5kAQEFIE5vdFByb3h5AQEFLFVucHJveHlhYmxlAQEFJER1cGxpY2F0ZQEBBTBOb1Blcm1pc3Npb24BAQUsVW5hbm5vdW5jZWQBAQUsTm9TZWxmUHJveHkBAQUCOEBNaW5pbXVtVGhyZXNob2xkAQEFPEFscmVhZHlBcHByb3ZlZAEBBUROb0FwcHJvdmFsc05lZWRlZAEBBURUb29GZXdTaWduYXRvcmllcwEBBUhUb29NYW55U2lnbmF0b3JpZXMBAQVUU2lnbmF0b3JpZXNPdXRPZk9yZGVyAQEFTFNlbmRlckluU2lnbmF0b3JpZXMBAQUgTm90Rm91bmQBAQUgTm90T3duZXIBAQUsTm9UaW1lcG9pbnQBAQU4V3JvbmdUaW1lcG9pbnQBAQVMVW5leHBlY3RlZFRpbWVwb2ludAEBBTxNYXhXZWlnaHRUb29Mb3cBAQU0QWxyZWFkeVN0b3JlZAEBBQIscEluc3VmZmljaWVudFByb3Bvc2Vyc0JhbGFuY2UBAQUwSW52YWxpZEluZGV4AQEFMFJlYXNvblRvb0JpZwEBBUBVbmV4cGVjdGVkU3RhdHVzAQEFOFJlcXVpcmVDdXJhdG9yAQEFMEludmFsaWRWYWx1ZQEBBShJbnZhbGlkRmVlAQEFNFBlbmRpbmdQYXlvdXQBAQUkUHJlbWF0dXJlAQEFUEhhc0FjdGl2ZUNoaWxkQm91bnR5AQEFNFRvb01hbnlRdWV1ZWQBAQUCDFRQYXJlbnRCb3VudHlOb3RBY3RpdmUBAQVkSW5zdWZmaWNpZW50Qm91bnR5QmFsYW5jZQEBBVBUb29NYW55Q2hpbGRCb3VudGllcwEBBQI8aFByZURpc3BhdGNoRWFybHlTdWJtaXNzaW9uAQEFbFByZURpc3BhdGNoV3JvbmdXaW5uZXJDb3VudAEBBWRQcmVEaXNwYXRjaFdlYWtTdWJtaXNzaW9uAQEFPFNpZ25lZFF1ZXVlRnVsbAEBBVhTaWduZWRDYW5ub3RQYXlEZXBvc2l0AQEFUFNpZ25lZEludmFsaWRXaXRuZXNzAQEFTFNpZ25lZFRvb011Y2hXZWlnaHQBAQU8T2N3Q2FsbFdyb25nRXJhAQEFXE1pc3NpbmdTbmFwc2hvdE1ldGFkYXRhAQEFWEludmFsaWRTdWJtaXNzaW9uSW5kZXgBAQU4Q2FsbE5vdEFsbG93ZWQBAQU4RmFsbGJhY2tGYWlsZWQBAQUsQm91bmROb3RNZXQBAQU4VG9vTWFueVdpbm5lcnMBAQVkUHJlRGlzcGF0Y2hEaWZmZXJlbnRSb3VuZAEBBQIQJER1cGxpY2F0ZQEBBShOb3RIZWF2aWVyAQEFME5vdEluU2FtZUJhZwEBBTBOb2RlTm90Rm91bmQBAQUCBBBMaXN0AQIQJER1cGxpY2F0ZQEBBShOb3RIZWF2aWVyAQEFME5vdEluU2FtZUJhZwEBBTBOb2RlTm90Rm91bmQBAQUCHGhOb3RFbm91Z2hTcGFjZUluVW5ib25kUG9vbAEBBTBQb29sTm90Rm91bmQBAQVIUmV3YXJkUG9vbE5vdEZvdW5kAQEFQFN1YlBvb2xzTm90Rm91bmQBAQVwQm9uZGVkU3Rhc2hLaWxsZWRQcmVtYXR1cmVseQEBBVREZWxlZ2F0aW9uVW5zdXBwb3J0ZWQBAQU8U2xhc2hOb3RBcHBsaWVkAQEFApAwUG9vbE5vdEZvdW5kAQEFSFBvb2xNZW1iZXJOb3RGb3VuZAEBBUhSZXdhcmRQb29sTm90Rm91bmQBAQVAU3ViUG9vbHNOb3RGb3VuZAEBBWRBY2NvdW50QmVsb25nc1RvT3RoZXJQb29sAQEFOEZ1bGx5VW5ib25kaW5nAQEFRE1heFVuYm9uZGluZ0xpbWl0AQEFRENhbm5vdFdpdGhkcmF3QW55AQEFRE1pbmltdW1Cb25kTm90TWV0AQEFME92ZXJmbG93UmlzawEBBTROb3REZXN0cm95aW5nAQEFME5vdE5vbWluYXRvcgEBBVROb3RLaWNrZXJPckRlc3Ryb3lpbmcBAQUcTm90T3BlbgEBBSBNYXhQb29scwEBBThNYXhQb29sTWVtYmVycwEBBURDYW5Ob3RDaGFuZ2VTdGF0ZQEBBVREb2VzTm90SGF2ZVBlcm1pc3Npb24BAQVUTWV0YWRhdGFFeGNlZWRzTWF4TGVuAQEFJERlZmVuc2l2ZQECHGhOb3RFbm91Z2hTcGFjZUluVW5ib25kUG9vbAEBBTBQb29sTm90Rm91bmQBAQVIUmV3YXJkUG9vbE5vdEZvdW5kAQEFQFN1YlBvb2xzTm90Rm91bmQBAQVwQm9uZGVkU3Rhc2hLaWxsZWRQcmVtYXR1cmVseQEBBVREZWxlZ2F0aW9uVW5zdXBwb3J0ZWQBAQU8U2xhc2hOb3RBcHBsaWVkAQEFnFBhcnRpYWxVbmJvbmROb3RBbGxvd2VkUGVybWlzc2lvbmxlc3NseQEBBVxNYXhDb21taXNzaW9uUmVzdHJpY3RlZAEBBWBDb21taXNzaW9uRXhjZWVkc01heGltdW0BAQV4Q29tbWlzc2lvbkV4Y2VlZHNHbG9iYWxNYXhpbXVtAQEFZENvbW1pc3Npb25DaGFuZ2VUaHJvdHRsZWQBAQV4Q29tbWlzc2lvbkNoYW5nZVJhdGVOb3RBbGxvd2VkAQEFTE5vUGVuZGluZ0NvbW1pc3Npb24BAQVYTm9Db21taXNzaW9uQ3VycmVudFNldAEBBSxQb29sSWRJblVzZQEBBTRJbnZhbGlkUG9vbElkAQEFTEJvbmRFeHRyYVJlc3RyaWN0ZWQBAQU8Tm90aGluZ1RvQWRqdXN0AQEFOE5vdGhpbmdUb1NsYXNoAQEFPEFscmVhZHlNaWdyYXRlZAEBBSxOb3RNaWdyYXRlZAEBBTBOb3RTdXBwb3J0ZWQBAQUCGDROb3RDb250cm9sbGVyAQEFNEFscmVhZHlRdWV1ZWQBAQU4Tm90RnVsbHlCb25kZWQBAQUkTm90UXVldWVkAQEFLEFscmVhZHlIZWFkAQEFOENhbGxOb3RBbGxvd2VkAQEFAgQ8SW52YWxpZE5ld1ZhbHVlAQEFAkhkVmFsaWRhdG9ySW5kZXhPdXRPZkJvdW5kcwEBBVBVbnNjaGVkdWxlZENhbmRpZGF0ZQEBBUBIZWFkRGF0YVRvb0xhcmdlAQEFUFByZW1hdHVyZUNvZGVVcGdyYWRlAQEFPE5ld0NvZGVUb29MYXJnZQEBBVREaXNhbGxvd2VkUmVsYXlQYXJlbnQBAQVESW52YWxpZEFzc2lnbm1lbnQBAQVESW52YWxpZEdyb3VwSW5kZXgBAQVMSW5zdWZmaWNpZW50QmFja2luZwEBBThJbnZhbGlkQmFja2luZwEBBUROb3RDb2xsYXRvclNpZ25lZAEBBWhWYWxpZGF0aW9uRGF0YUhhc2hNaXNtYXRjaAEBBYBJbmNvcnJlY3REb3dud2FyZE1lc3NhZ2VIYW5kbGluZwEBBVRJbnZhbGlkVXB3YXJkTWVzc2FnZXMBAQVgSHJtcFdhdGVybWFya01pc2hhbmRsaW5nAQEFTEludmFsaWRPdXRib3VuZEhybXABAQVkSW52YWxpZFZhbGlkYXRpb25Db2RlSGFzaAEBBUBQYXJhSGVhZE1pc21hdGNoAQEFAhRkVG9vTWFueUluY2x1c2lvbkluaGVyZW50cwEBBUxJbnZhbGlkUGFyZW50SGVhZGVyAQEFSEluaGVyZW50T3ZlcndlaWdodAEBBYRDYW5kaWRhdGVzRmlsdGVyZWREdXJpbmdFeGVjdXRpb24BAQVQVW5zY2hlZHVsZWRDYW5kaWRhdGUBAQUCNDROb3RSZWdpc3RlcmVkAQEFNENhbm5vdE9uYm9hcmQBAQU4Q2Fubm90T2ZmYm9hcmQBAQU0Q2Fubm90VXBncmFkZQEBBTxDYW5ub3REb3duZ3JhZGUBAQVYUHZmQ2hlY2tTdGF0ZW1lbnRTdGFsZQEBBVxQdmZDaGVja1N0YXRlbWVudEZ1dHVyZQEBBYRQdmZDaGVja1ZhbGlkYXRvckluZGV4T3V0T2ZCb3VuZHMBAQVgUHZmQ2hlY2tJbnZhbGlkU2lnbmF0dXJlAQEFSFB2ZkNoZWNrRG91YmxlVm90ZQEBBVhQdmZDaGVja1N1YmplY3RJbnZhbGlkAQEFRENhbm5vdFVwZ3JhZGVDb2RlAQEFLEludmFsaWRDb2RlAQEFAlBUT3BlbkhybXBDaGFubmVsVG9TZWxmAQEFfE9wZW5Icm1wQ2hhbm5lbEludmFsaWRSZWNpcGllbnQBAQVsT3BlbkhybXBDaGFubmVsWmVyb0NhcGFjaXR5AQEFjE9wZW5Icm1wQ2hhbm5lbENhcGFjaXR5RXhjZWVkc0xpbWl0AQEFeE9wZW5Icm1wQ2hhbm5lbFplcm9NZXNzYWdlU2l6ZQEBBZhPcGVuSHJtcENoYW5uZWxNZXNzYWdlU2l6ZUV4Y2VlZHNMaW1pdAEBBXBPcGVuSHJtcENoYW5uZWxBbHJlYWR5RXhpc3RzAQEFfE9wZW5Icm1wQ2hhbm5lbEFscmVhZHlSZXF1ZXN0ZWQBAQVwT3BlbkhybXBDaGFubmVsTGltaXRFeGNlZWRlZAEBBXBBY2NlcHRIcm1wQ2hhbm5lbERvZXNudEV4aXN0AQEFhEFjY2VwdEhybXBDaGFubmVsQWxyZWFkeUNvbmZpcm1lZAEBBXhBY2NlcHRIcm1wQ2hhbm5lbExpbWl0RXhjZWVkZWQBAQVwQ2xvc2VIcm1wQ2hhbm5lbFVuYXV0aG9yaXplZAEBBWxDbG9zZUhybXBDaGFubmVsRG9lc250RXhpc3QBAQV8Q2xvc2VIcm1wQ2hhbm5lbEFscmVhZHlVbmRlcndheQEBBYRDYW5jZWxIcm1wT3BlbkNoYW5uZWxVbmF1dGhvcml6ZWQBAQVoT3BlbkhybXBDaGFubmVsRG9lc250RXhpc3QBAQV8T3BlbkhybXBDaGFubmVsQWxyZWFkeUNvbmZpcm1lZAEBBTBXcm9uZ1dpdG5lc3MBAQVwQ2hhbm5lbENyZWF0aW9uTm90QXV0aG9yaXplZAEBBQIkdER1cGxpY2F0ZURpc3B1dGVTdGF0ZW1lbnRTZXRzAQEFXEFuY2llbnREaXNwdXRlU3RhdGVtZW50AQEFZFZhbGlkYXRvckluZGV4T3V0T2ZCb3VuZHMBAQVASW52YWxpZFNpZ25hdHVyZQEBBUhEdXBsaWNhdGVTdGF0ZW1lbnQBAQVIU2luZ2xlU2lkZWREaXNwdXRlAQEFPE1hbGljaW91c0JhY2tlcgEBBUxNaXNzaW5nQmFja2luZ1ZvdGVzAQEFSFVuY29uZmlybWVkRGlzcHV0ZQEBBQIYYEludmFsaWRLZXlPd25lcnNoaXBQcm9vZgEBBUxJbnZhbGlkU2Vzc2lvbkluZGV4AQEFUEludmFsaWRDYW5kaWRhdGVIYXNoAQEFVEludmFsaWRWYWxpZGF0b3JJbmRleAEBBWBWYWxpZGF0b3JJbmRleElkTWlzbWF0Y2gBAQVcRHVwbGljYXRlU2xhc2hpbmdSZXBvcnQBAQUCCCRRdWV1ZUZ1bGwBAQVwU3BvdFByaWNlSGlnaGVyVGhhbk1heEFtb3VudAEBBQIYQEFzc2lnbm1lbnRzRW1wdHkBAQU0T3ZlclNjaGVkdWxlZAEBBThVbmRlclNjaGVkdWxlZAEBBUBEaXNhbGxvd2VkSW5zZXJ0AQEFPER1cGxpY2F0ZUluc2VydAEBBVBBc3NpZ25tZW50c05vdFNvcnRlZAEBBQI4NE5vdFJlZ2lzdGVyZWQBAQVEQWxyZWFkeVJlZ2lzdGVyZWQBAQUgTm90T3duZXIBAQUwQ29kZVRvb0xhcmdlAQEFQEhlYWREYXRhVG9vTGFyZ2UBAQUwTm90UGFyYWNoYWluAQEFNE5vdFBhcmF0aHJlYWQBAQVAQ2Fubm90RGVyZWdpc3RlcgEBBTxDYW5ub3REb3duZ3JhZGUBAQU0Q2Fubm90VXBncmFkZQEBBShQYXJhTG9ja2VkAQEFLE5vdFJlc2VydmVkAQEFLEludmFsaWRDb2RlAQEFKENhbm5vdFN3YXABAQUCCERQYXJhTm90T25ib2FyZGluZwEBBShMZWFzZUVycm9yAQEFAhxEQXVjdGlvbkluUHJvZ3Jlc3MBAQVETGVhc2VQZXJpb2RJblBhc3QBAQVEUGFyYU5vdFJlZ2lzdGVyZWQBAQVETm90Q3VycmVudEF1Y3Rpb24BAQUoTm90QXVjdGlvbgEBBTBBdWN0aW9uRW5kZWQBAQVAQWxyZWFkeUxlYXNlZE91dAEBBQJcREZpcnN0UGVyaW9kSW5QYXN0AQEFZEZpcnN0UGVyaW9kVG9vRmFySW5GdXR1cmUBAQVsTGFzdFBlcmlvZEJlZm9yZUZpcnN0UGVyaW9kAQEFYExhc3RQZXJpb2RUb29GYXJJbkZ1dHVyZQEBBTxDYW5ub3RFbmRJblBhc3QBAQVERW5kVG9vRmFySW5GdXR1cmUBAQUgT3ZlcmZsb3cBAQVQQ29udHJpYnV0aW9uVG9vU21hbGwBAQU0SW52YWxpZFBhcmFJZAEBBSxDYXBFeGNlZWRlZAEBBVhDb250cmlidXRpb25QZXJpb2RPdmVyAQEFNEludmFsaWRPcmlnaW4BAQUwTm90UGFyYWNoYWluAQEFLExlYXNlQWN0aXZlAQEFQEJpZE9yTGVhc2VBY3RpdmUBAQUwRnVuZE5vdEVuZGVkAQEFPE5vQ29udHJpYnV0aW9ucwEBBUhOb3RSZWFkeVRvRGlzc29sdmUBAQVASW52YWxpZFNpZ25hdHVyZQEBBTBNZW1vVG9vTGFyZ2UBAQVEQWxyZWFkeUluTmV3UmFpc2UBAQVIVnJmRGVsYXlJblByb2dyZXNzAQEFNE5vTGVhc2VQZXJpb2QBAQUCDCROb3RCcm9rZXIBAQVYUmVxdWVzdGVkRnV0dXJlUmV2ZW51ZQEBBUxBc3NldFRyYW5zZmVyRmFpbGVkAQEFAhg8TWF4U2lnbmVkTGltaXRzAQEFKEtleVRvb0xvbmcBAQU4Tm90RW5vdWdoRnVuZHMBAQUoQmFkV2l0bmVzcwEBBWRTaWduZWRNaWdyYXRpb25Ob3RBbGxvd2VkAQEFMEJhZENoaWxkUm9vdAEBBQJgLFVucmVhY2hhYmxlAQEFLFNlbmRGYWlsdXJlAQEFIEZpbHRlcmVkAQEFSFVud2VpZ2hhYmxlTWVzc2FnZQEBBWBEZXN0aW5hdGlvbk5vdEludmVydGlibGUBAQUURW1wdHkBAQU4Q2Fubm90UmVhbmNob3IBAQU0VG9vTWFueUFzc2V0cwEBBTRJbnZhbGlkT3JpZ2luAQEFKEJhZFZlcnNpb24BAQUsQmFkTG9jYXRpb24BAQU4Tm9TdWJzY3JpcHRpb24BAQVEQWxyZWFkeVN1YnNjcmliZWQBAQVYQ2Fubm90Q2hlY2tPdXRUZWxlcG9ydAEBBShMb3dCYWxhbmNlAQEFMFRvb01hbnlMb2NrcwEBBUxBY2NvdW50Tm90U292ZXJlaWduAQEFKEZlZXNOb3RNZXQBAQUwTG9ja05vdEZvdW5kAQEFFEluVXNlAQEFaEludmFsaWRBc3NldFVua25vd25SZXNlcnZlAQEFeEludmFsaWRBc3NldFVuc3VwcG9ydGVkUmVzZXJ2ZQEBBTxUb29NYW55UmVzZXJ2ZXMBAQVgTG9jYWxFeGVjdXRpb25JbmNvbXBsZXRlAQEFAiQsTm90UmVhcGFibGUBAQUYTm9QYWdlAQEFJE5vTWVzc2FnZQEBBUBBbHJlYWR5UHJvY2Vzc2VkAQEFGFF1ZXVlZAEBBUhJbnN1ZmZpY2llbnRXZWlnaHQBAQVgVGVtcG9yYXJpbHlVbnByb2Nlc3NhYmxlAQEFLFF1ZXVlUGF1c2VkAQEFTFJlY3Vyc2l2ZURpc2FsbG93ZWQBAQUCDEBVbmtub3duQXNzZXRLaW5kAQEFNEFscmVhZHlFeGlzdHMBAQUgT3ZlcmZsb3cBAQUC7BhTeXN0ZW0BAiQ8SW52YWxpZFNwZWNOYW1lAQEFaFNwZWNWZXJzaW9uTmVlZHNUb0luY3JlYXNlAQEFdEZhaWxlZFRvRXh0cmFjdFJ1bnRpbWVWZXJzaW9uAQEFTE5vbkRlZmF1bHRDb21wb3NpdGUBAQU8Tm9uWmVyb1JlZkNvdW50AQEFMENhbGxGaWx0ZXJlZAEBBWxNdWx0aUJsb2NrTWlncmF0aW9uc09uZ29pbmcBAQVETm90aGluZ0F1dGhvcml6ZWQBAQUwVW5hdXRob3JpemVkAQEFJFNjaGVkdWxlcgECFEBGYWlsZWRUb1NjaGVkdWxlAQEFIE5vdEZvdW5kAQEFXFRhcmdldEJsb2NrTnVtYmVySW5QYXN0AQEFSFJlc2NoZWR1bGVOb0NoYW5nZQEBBRROYW1lZAEBBSBQcmVpbWFnZQECJBhUb29CaWcBAQUwQWxyZWFkeU5vdGVkAQEFNE5vdEF1dGhvcml6ZWQBAQUgTm90Tm90ZWQBAQUkUmVxdWVzdGVkAQEFME5vdFJlcXVlc3RlZAEBBRxUb29NYW55AQEFGFRvb0ZldwEBBRhOb0Nvc3QBAQUQQmFiZQECEGBJbnZhbGlkRXF1aXZvY2F0aW9uUHJvb2YBAQVgSW52YWxpZEtleU93bmVyc2hpcFByb29mAQEFWER1cGxpY2F0ZU9mZmVuY2VSZXBvcnQBAQVQSW52YWxpZENvbmZpZ3VyYXRpb24BAQUkVGltZXN0YW1wAQEFHEluZGljZXMBAhQsTm90QXNzaWduZWQBAQUgTm90T3duZXIBAQUUSW5Vc2UBAQUsTm90VHJhbnNmZXIBAQUkUGVybWFuZW50AQEFIEJhbGFuY2VzAQIwOFZlc3RpbmdCYWxhbmNlAQEFVExpcXVpZGl0eVJlc3RyaWN0aW9ucwEBBUxJbnN1ZmZpY2llbnRCYWxhbmNlAQEFSEV4aXN0ZW50aWFsRGVwb3NpdAEBBTRFeHBlbmRhYmlsaXR5AQEFXEV4aXN0aW5nVmVzdGluZ1NjaGVkdWxlAQEFLERlYWRBY2NvdW50AQEFPFRvb01hbnlSZXNlcnZlcwEBBTBUb29NYW55SG9sZHMBAQU4VG9vTWFueUZyZWV6ZXMBAQVMSXNzdWFuY2VEZWFjdGl2YXRlZAEBBSREZWx0YVplcm8BAQVIVHJhbnNhY3Rpb25QYXltZW50AQEFKEF1dGhvcnNoaXABAQUcU3Rha2luZwECfDROb3RDb250cm9sbGVyAQEFIE5vdFN0YXNoAQEFNEFscmVhZHlCb25kZWQBAQU0QWxyZWFkeVBhaXJlZAEBBTBFbXB0eVRhcmdldHMBAQU4RHVwbGljYXRlSW5kZXgBAQVESW52YWxpZFNsYXNoSW5kZXgBAQVASW5zdWZmaWNpZW50Qm9uZAEBBTBOb01vcmVDaHVua3MBAQU0Tm9VbmxvY2tDaHVuawEBBTBGdW5kZWRUYXJnZXQBAQVISW52YWxpZEVyYVRvUmV3YXJkAQEFaEludmFsaWROdW1iZXJPZk5vbWluYXRpb25zAQEFSE5vdFNvcnRlZEFuZFVuaXF1ZQEBBThBbHJlYWR5Q2xhaW1lZAEBBSxJbnZhbGlkUGFnZQEBBVRJbmNvcnJlY3RIaXN0b3J5RGVwdGgBAQVYSW5jb3JyZWN0U2xhc2hpbmdTcGFucwEBBSBCYWRTdGF0ZQEBBThUb29NYW55VGFyZ2V0cwEBBSRCYWRUYXJnZXQBAQVAQ2Fubm90Q2hpbGxPdGhlcgEBBURUb29NYW55Tm9taW5hdG9ycwEBBURUb29NYW55VmFsaWRhdG9ycwEBBUBDb21taXNzaW9uVG9vTG93AQEFLEJvdW5kTm90TWV0AQEFUENvbnRyb2xsZXJEZXByZWNhdGVkAQEFTENhbm5vdFJlc3RvcmVMZWRnZXIBAQVsUmV3YXJkRGVzdGluYXRpb25SZXN0cmljdGVkAQEFOE5vdEVub3VnaEZ1bmRzAQEFXFZpcnR1YWxTdGFrZXJOb3RBbGxvd2VkAQEFIE9mZmVuY2VzAQEFKEhpc3RvcmljYWwBAQUcU2Vzc2lvbgECFDBJbnZhbGlkUHJvb2YBAQVcTm9Bc3NvY2lhdGVkVmFsaWRhdG9ySWQBAQU0RHVwbGljYXRlZEtleQEBBRhOb0tleXMBAQUkTm9BY2NvdW50AQEFHEdyYW5kcGEBAhwsUGF1c2VGYWlsZWQBAQUwUmVzdW1lRmFpbGVkAQEFNENoYW5nZVBlbmRpbmcBAQUcVG9vU29vbgEBBWBJbnZhbGlkS2V5T3duZXJzaGlwUHJvb2YBAQVgSW52YWxpZEVxdWl2b2NhdGlvblByb29mAQEFWER1cGxpY2F0ZU9mZmVuY2VSZXBvcnQBAQVIQXV0aG9yaXR5RGlzY292ZXJ5AQEFIFRyZWFzdXJ5AQIsMEludmFsaWRJbmRleAEBBUBUb29NYW55QXBwcm92YWxzAQEFWEluc3VmZmljaWVudFBlcm1pc3Npb24BAQVMUHJvcG9zYWxOb3RBcHByb3ZlZAEBBVhGYWlsZWRUb0NvbnZlcnRCYWxhbmNlAQEFMFNwZW5kRXhwaXJlZAEBBSxFYXJseVBheW91dAEBBUBBbHJlYWR5QXR0ZW1wdGVkAQEFLFBheW91dEVycm9yAQEFME5vdEF0dGVtcHRlZAEBBTBJbmNvbmNsdXNpdmUBAQVAQ29udmljdGlvblZvdGluZwECMChOb3RPbmdvaW5nAQEFIE5vdFZvdGVyAQEFME5vUGVybWlzc2lvbgEBBTxOb1Blcm1pc3Npb25ZZXQBAQVEQWxyZWFkeURlbGVnYXRpbmcBAQU0QWxyZWFkeVZvdGluZwEBBURJbnN1ZmZpY2llbnRGdW5kcwEBBTROb3REZWxlZ2F0aW5nAQEFIE5vbnNlbnNlAQEFPE1heFZvdGVzUmVhY2hlZAEBBSxDbGFzc05lZWRlZAEBBSBCYWRDbGFzcwEBBSRSZWZlcmVuZGEBAjgoTm90T25nb2luZwEBBShIYXNEZXBvc2l0AQEFIEJhZFRyYWNrAQEFEEZ1bGwBAQUoUXVldWVFbXB0eQEBBTRCYWRSZWZlcmVuZHVtAQEFLE5vdGhpbmdUb0RvAQEFHE5vVHJhY2sBAQUoVW5maW5pc2hlZAEBBTBOb1Blcm1pc3Npb24BAQUkTm9EZXBvc2l0AQEFJEJhZFN0YXR1cwEBBUBQcmVpbWFnZU5vdEV4aXN0AQEFhFByZWltYWdlU3RvcmVkV2l0aERpZmZlcmVudExlbmd0aAEBBRxPcmlnaW5zAQEFJFdoaXRlbGlzdAECFExVbmF2YWlsYWJsZVByZUltYWdlAQEFPFVuZGVjb2RhYmxlQ2FsbAEBBWBJbnZhbGlkQ2FsbFdlaWdodFdpdG5lc3MBAQVQQ2FsbElzTm90V2hpdGVsaXN0ZWQBAQVYQ2FsbEFscmVhZHlXaGl0ZWxpc3RlZAEBBShQYXJhbWV0ZXJzAQEFGENsYWltcwECGGBJbnZhbGlkRXRoZXJldW1TaWduYXR1cmUBAQVAU2lnbmVySGFzTm9DbGFpbQEBBUBTZW5kZXJIYXNOb0NsYWltAQEFMFBvdFVuZGVyZmxvdwEBBUBJbnZhbGlkU3RhdGVtZW50AQEFTFZlc3RlZEJhbGFuY2VFeGlzdHMBAQUcVmVzdGluZwECFChOb3RWZXN0aW5nAQEFVEF0TWF4VmVzdGluZ1NjaGVkdWxlcwEBBSRBbW91bnRMb3cBAQVgU2NoZWR1bGVJbmRleE91dE9mQm91bmRzAQEFVEludmFsaWRTY2hlZHVsZVBhcmFtcwEBBRxVdGlsaXR5AQIEMFRvb01hbnlDYWxscwEBBRRQcm94eQECIBxUb29NYW55AQEFIE5vdEZvdW5kAQEFIE5vdFByb3h5AQEFLFVucHJveHlhYmxlAQEFJER1cGxpY2F0ZQEBBTBOb1Blcm1pc3Npb24BAQUsVW5hbm5vdW5jZWQBAQUsTm9TZWxmUHJveHkBAQUgTXVsdGlzaWcBAjhATWluaW11bVRocmVzaG9sZAEBBTxBbHJlYWR5QXBwcm92ZWQBAQVETm9BcHByb3ZhbHNOZWVkZWQBAQVEVG9vRmV3U2lnbmF0b3JpZXMBAQVIVG9vTWFueVNpZ25hdG9yaWVzAQEFVFNpZ25hdG9yaWVzT3V0T2ZPcmRlcgEBBUxTZW5kZXJJblNpZ25hdG9yaWVzAQEFIE5vdEZvdW5kAQEFIE5vdE93bmVyAQEFLE5vVGltZXBvaW50AQEFOFdyb25nVGltZXBvaW50AQEFTFVuZXhwZWN0ZWRUaW1lcG9pbnQBAQU8TWF4V2VpZ2h0VG9vTG93AQEFNEFscmVhZHlTdG9yZWQBAQUgQm91bnRpZXMBAixwSW5zdWZmaWNpZW50UHJvcG9zZXJzQmFsYW5jZQEBBTBJbnZhbGlkSW5kZXgBAQUwUmVhc29uVG9vQmlnAQEFQFVuZXhwZWN0ZWRTdGF0dXMBAQU4UmVxdWlyZUN1cmF0b3IBAQUwSW52YWxpZFZhbHVlAQEFKEludmFsaWRGZWUBAQU0UGVuZGluZ1BheW91dAEBBSRQcmVtYXR1cmUBAQVQSGFzQWN0aXZlQ2hpbGRCb3VudHkBAQU0VG9vTWFueVF1ZXVlZAEBBTRDaGlsZEJvdW50aWVzAQIMVFBhcmVudEJvdW50eU5vdEFjdGl2ZQEBBWRJbnN1ZmZpY2llbnRCb3VudHlCYWxhbmNlAQEFUFRvb01hbnlDaGlsZEJvdW50aWVzAQEFaEVsZWN0aW9uUHJvdmlkZXJNdWx0aVBoYXNlAQI8aFByZURpc3BhdGNoRWFybHlTdWJtaXNzaW9uAQEFbFByZURpc3BhdGNoV3JvbmdXaW5uZXJDb3VudAEBBWRQcmVEaXNwYXRjaFdlYWtTdWJtaXNzaW9uAQEFPFNpZ25lZFF1ZXVlRnVsbAEBBVhTaWduZWRDYW5ub3RQYXlEZXBvc2l0AQEFUFNpZ25lZEludmFsaWRXaXRuZXNzAQEFTFNpZ25lZFRvb011Y2hXZWlnaHQBAQU8T2N3Q2FsbFdyb25nRXJhAQEFXE1pc3NpbmdTbmFwc2hvdE1ldGFkYXRhAQEFWEludmFsaWRTdWJtaXNzaW9uSW5kZXgBAQU4Q2FsbE5vdEFsbG93ZWQBAQU4RmFsbGJhY2tGYWlsZWQBAQUsQm91bmROb3RNZXQBAQU4VG9vTWFueVdpbm5lcnMBAQVkUHJlRGlzcGF0Y2hEaWZmZXJlbnRSb3VuZAEBBSRWb3Rlckxpc3QBAgQQTGlzdAECECREdXBsaWNhdGUBAQUoTm90SGVhdmllcgEBBTBOb3RJblNhbWVCYWcBAQUwTm9kZU5vdEZvdW5kAQEFPE5vbWluYXRpb25Qb29scwECkDBQb29sTm90Rm91bmQBAQVIUG9vbE1lbWJlck5vdEZvdW5kAQEFSFJld2FyZFBvb2xOb3RGb3VuZAEBBUBTdWJQb29sc05vdEZvdW5kAQEFZEFjY291bnRCZWxvbmdzVG9PdGhlclBvb2wBAQU4RnVsbHlVbmJvbmRpbmcBAQVETWF4VW5ib25kaW5nTGltaXQBAQVEQ2Fubm90V2l0aGRyYXdBbnkBAQVETWluaW11bUJvbmROb3RNZXQBAQUwT3ZlcmZsb3dSaXNrAQEFNE5vdERlc3Ryb3lpbmcBAQUwTm90Tm9taW5hdG9yAQEFVE5vdEtpY2tlck9yRGVzdHJveWluZwEBBRxOb3RPcGVuAQEFIE1heFBvb2xzAQEFOE1heFBvb2xNZW1iZXJzAQEFRENhbk5vdENoYW5nZVN0YXRlAQEFVERvZXNOb3RIYXZlUGVybWlzc2lvbgEBBVRNZXRhZGF0YUV4Y2VlZHNNYXhMZW4BAQUkRGVmZW5zaXZlAQIcaE5vdEVub3VnaFNwYWNlSW5VbmJvbmRQb29sAQEFMFBvb2xOb3RGb3VuZAEBBUhSZXdhcmRQb29sTm90Rm91bmQBAQVAU3ViUG9vbHNOb3RGb3VuZAEBBXBCb25kZWRTdGFzaEtpbGxlZFByZW1hdHVyZWx5AQEFVERlbGVnYXRpb25VbnN1cHBvcnRlZAEBBTxTbGFzaE5vdEFwcGxpZWQBAQWcUGFydGlhbFVuYm9uZE5vdEFsbG93ZWRQZXJtaXNzaW9ubGVzc2x5AQEFXE1heENvbW1pc3Npb25SZXN0cmljdGVkAQEFYENvbW1pc3Npb25FeGNlZWRzTWF4aW11bQEBBXhDb21taXNzaW9uRXhjZWVkc0dsb2JhbE1heGltdW0BAQVkQ29tbWlzc2lvbkNoYW5nZVRocm90dGxlZAEBBXhDb21taXNzaW9uQ2hhbmdlUmF0ZU5vdEFsbG93ZWQBAQVMTm9QZW5kaW5nQ29tbWlzc2lvbgEBBVhOb0NvbW1pc3Npb25DdXJyZW50U2V0AQEFLFBvb2xJZEluVXNlAQEFNEludmFsaWRQb29sSWQBAQVMQm9uZEV4dHJhUmVzdHJpY3RlZAEBBTxOb3RoaW5nVG9BZGp1c3QBAQU4Tm90aGluZ1RvU2xhc2gBAQU8QWxyZWFkeU1pZ3JhdGVkAQEFLE5vdE1pZ3JhdGVkAQEFME5vdFN1cHBvcnRlZAEBBSxGYXN0VW5zdGFrZQECGDROb3RDb250cm9sbGVyAQEFNEFscmVhZHlRdWV1ZWQBAQU4Tm90RnVsbHlCb25kZWQBAQUkTm90UXVldWVkAQEFLEFscmVhZHlIZWFkAQEFOENhbGxOb3RBbGxvd2VkAQEFQFBhcmFjaGFpbnNPcmlnaW4BAQU0Q29uZmlndXJhdGlvbgECBDxJbnZhbGlkTmV3VmFsdWUBAQUsUGFyYXNTaGFyZWQBAQU0UGFyYUluY2x1c2lvbgECSGRWYWxpZGF0b3JJbmRleE91dE9mQm91bmRzAQEFUFVuc2NoZWR1bGVkQ2FuZGlkYXRlAQEFQEhlYWREYXRhVG9vTGFyZ2UBAQVQUHJlbWF0dXJlQ29kZVVwZ3JhZGUBAQU8TmV3Q29kZVRvb0xhcmdlAQEFVERpc2FsbG93ZWRSZWxheVBhcmVudAEBBURJbnZhbGlkQXNzaWdubWVudAEBBURJbnZhbGlkR3JvdXBJbmRleAEBBUxJbnN1ZmZpY2llbnRCYWNraW5nAQEFOEludmFsaWRCYWNraW5nAQEFRE5vdENvbGxhdG9yU2lnbmVkAQEFaFZhbGlkYXRpb25EYXRhSGFzaE1pc21hdGNoAQEFgEluY29ycmVjdERvd253YXJkTWVzc2FnZUhhbmRsaW5nAQEFVEludmFsaWRVcHdhcmRNZXNzYWdlcwEBBWBIcm1wV2F0ZXJtYXJrTWlzaGFuZGxpbmcBAQVMSW52YWxpZE91dGJvdW5kSHJtcAEBBWRJbnZhbGlkVmFsaWRhdGlvbkNvZGVIYXNoAQEFQFBhcmFIZWFkTWlzbWF0Y2gBAQUwUGFyYUluaGVyZW50AQIUZFRvb01hbnlJbmNsdXNpb25JbmhlcmVudHMBAQVMSW52YWxpZFBhcmVudEhlYWRlcgEBBUhJbmhlcmVudE92ZXJ3ZWlnaHQBAQWEQ2FuZGlkYXRlc0ZpbHRlcmVkRHVyaW5nRXhlY3V0aW9uAQEFUFVuc2NoZWR1bGVkQ2FuZGlkYXRlAQEFNFBhcmFTY2hlZHVsZXIBAQUUUGFyYXMBAjQ0Tm90UmVnaXN0ZXJlZAEBBTRDYW5ub3RPbmJvYXJkAQEFOENhbm5vdE9mZmJvYXJkAQEFNENhbm5vdFVwZ3JhZGUBAQU8Q2Fubm90RG93bmdyYWRlAQEFWFB2ZkNoZWNrU3RhdGVtZW50U3RhbGUBAQVcUHZmQ2hlY2tTdGF0ZW1lbnRGdXR1cmUBAQWEUHZmQ2hlY2tWYWxpZGF0b3JJbmRleE91dE9mQm91bmRzAQEFYFB2ZkNoZWNrSW52YWxpZFNpZ25hdHVyZQEBBUhQdmZDaGVja0RvdWJsZVZvdGUBAQVYUHZmQ2hlY2tTdWJqZWN0SW52YWxpZAEBBURDYW5ub3RVcGdyYWRlQ29kZQEBBSxJbnZhbGlkQ29kZQEBBSxJbml0aWFsaXplcgEBBQxEbXABAQUQSHJtcAECUFRPcGVuSHJtcENoYW5uZWxUb1NlbGYBAQV8T3BlbkhybXBDaGFubmVsSW52YWxpZFJlY2lwaWVudAEBBWxPcGVuSHJtcENoYW5uZWxaZXJvQ2FwYWNpdHkBAQWMT3BlbkhybXBDaGFubmVsQ2FwYWNpdHlFeGNlZWRzTGltaXQBAQV4T3BlbkhybXBDaGFubmVsWmVyb01lc3NhZ2VTaXplAQEFmE9wZW5Icm1wQ2hhbm5lbE1lc3NhZ2VTaXplRXhjZWVkc0xpbWl0AQEFcE9wZW5Icm1wQ2hhbm5lbEFscmVhZHlFeGlzdHMBAQV8T3BlbkhybXBDaGFubmVsQWxyZWFkeVJlcXVlc3RlZAEBBXBPcGVuSHJtcENoYW5uZWxMaW1pdEV4Y2VlZGVkAQEFcEFjY2VwdEhybXBDaGFubmVsRG9lc250RXhpc3QBAQWEQWNjZXB0SHJtcENoYW5uZWxBbHJlYWR5Q29uZmlybWVkAQEFeEFjY2VwdEhybXBDaGFubmVsTGltaXRFeGNlZWRlZAEBBXBDbG9zZUhybXBDaGFubmVsVW5hdXRob3JpemVkAQEFbENsb3NlSHJtcENoYW5uZWxEb2VzbnRFeGlzdAEBBXxDbG9zZUhybXBDaGFubmVsQWxyZWFkeVVuZGVyd2F5AQEFhENhbmNlbEhybXBPcGVuQ2hhbm5lbFVuYXV0aG9yaXplZAEBBWhPcGVuSHJtcENoYW5uZWxEb2VzbnRFeGlzdAEBBXxPcGVuSHJtcENoYW5uZWxBbHJlYWR5Q29uZmlybWVkAQEFMFdyb25nV2l0bmVzcwEBBXBDaGFubmVsQ3JlYXRpb25Ob3RBdXRob3JpemVkAQEFPFBhcmFTZXNzaW9uSW5mbwEBBTRQYXJhc0Rpc3B1dGVzAQIkdER1cGxpY2F0ZURpc3B1dGVTdGF0ZW1lbnRTZXRzAQEFXEFuY2llbnREaXNwdXRlU3RhdGVtZW50AQEFZFZhbGlkYXRvckluZGV4T3V0T2ZCb3VuZHMBAQVASW52YWxpZFNpZ25hdHVyZQEBBUhEdXBsaWNhdGVTdGF0ZW1lbnQBAQVIU2luZ2xlU2lkZWREaXNwdXRlAQEFPE1hbGljaW91c0JhY2tlcgEBBUxNaXNzaW5nQmFja2luZ1ZvdGVzAQEFSFVuY29uZmlybWVkRGlzcHV0ZQEBBTRQYXJhc1NsYXNoaW5nAQIYYEludmFsaWRLZXlPd25lcnNoaXBQcm9vZgEBBUxJbnZhbGlkU2Vzc2lvbkluZGV4AQEFUEludmFsaWRDYW5kaWRhdGVIYXNoAQEFVEludmFsaWRWYWxpZGF0b3JJbmRleAEBBWBWYWxpZGF0b3JJbmRleElkTWlzbWF0Y2gBAQVcRHVwbGljYXRlU2xhc2hpbmdSZXBvcnQBAQUgT25EZW1hbmQBAggkUXVldWVGdWxsAQEFcFNwb3RQcmljZUhpZ2hlclRoYW5NYXhBbW91bnQBAQVoQ29yZXRpbWVBc3NpZ25tZW50UHJvdmlkZXIBAhhAQXNzaWdubWVudHNFbXB0eQEBBTRPdmVyU2NoZWR1bGVkAQEFOFVuZGVyU2NoZWR1bGVkAQEFQERpc2FsbG93ZWRJbnNlcnQBAQU8RHVwbGljYXRlSW5zZXJ0AQEFUEFzc2lnbm1lbnRzTm90U29ydGVkAQEFJFJlZ2lzdHJhcgECODROb3RSZWdpc3RlcmVkAQEFREFscmVhZHlSZWdpc3RlcmVkAQEFIE5vdE93bmVyAQEFMENvZGVUb29MYXJnZQEBBUBIZWFkRGF0YVRvb0xhcmdlAQEFME5vdFBhcmFjaGFpbgEBBTROb3RQYXJhdGhyZWFkAQEFQENhbm5vdERlcmVnaXN0ZXIBAQU8Q2Fubm90RG93bmdyYWRlAQEFNENhbm5vdFVwZ3JhZGUBAQUoUGFyYUxvY2tlZAEBBSxOb3RSZXNlcnZlZAEBBSxJbnZhbGlkQ29kZQEBBShDYW5ub3RTd2FwAQEFFFNsb3RzAQIIRFBhcmFOb3RPbmJvYXJkaW5nAQEFKExlYXNlRXJyb3IBAQUgQXVjdGlvbnMBAhxEQXVjdGlvbkluUHJvZ3Jlc3MBAQVETGVhc2VQZXJpb2RJblBhc3QBAQVEUGFyYU5vdFJlZ2lzdGVyZWQBAQVETm90Q3VycmVudEF1Y3Rpb24BAQUoTm90QXVjdGlvbgEBBTBBdWN0aW9uRW5kZWQBAQVAQWxyZWFkeUxlYXNlZE91dAEBBSRDcm93ZGxvYW4BAlxERmlyc3RQZXJpb2RJblBhc3QBAQVkRmlyc3RQZXJpb2RUb29GYXJJbkZ1dHVyZQEBBWxMYXN0UGVyaW9kQmVmb3JlRmlyc3RQZXJpb2QBAQVgTGFzdFBlcmlvZFRvb0ZhckluRnV0dXJlAQEFPENhbm5vdEVuZEluUGFzdAEBBURFbmRUb29GYXJJbkZ1dHVyZQEBBSBPdmVyZmxvdwEBBVBDb250cmlidXRpb25Ub29TbWFsbAEBBTRJbnZhbGlkUGFyYUlkAQEFLENhcEV4Y2VlZGVkAQEFWENvbnRyaWJ1dGlvblBlcmlvZE92ZXIBAQU0SW52YWxpZE9yaWdpbgEBBTBOb3RQYXJhY2hhaW4BAQUsTGVhc2VBY3RpdmUBAQVAQmlkT3JMZWFzZUFjdGl2ZQEBBTBGdW5kTm90RW5kZWQBAQU8Tm9Db250cmlidXRpb25zAQEFSE5vdFJlYWR5VG9EaXNzb2x2ZQEBBUBJbnZhbGlkU2lnbmF0dXJlAQEFME1lbW9Ub29MYXJnZQEBBURBbHJlYWR5SW5OZXdSYWlzZQEBBUhWcmZEZWxheUluUHJvZ3Jlc3MBAQU0Tm9MZWFzZVBlcmlvZAEBBSBDb3JldGltZQECDCROb3RCcm9rZXIBAQVYUmVxdWVzdGVkRnV0dXJlUmV2ZW51ZQEBBUxBc3NldFRyYW5zZmVyRmFpbGVkAQEFSFN0YXRlVHJpZU1pZ3JhdGlvbgECGDxNYXhTaWduZWRMaW1pdHMBAQUoS2V5VG9vTG9uZwEBBThOb3RFbm91Z2hGdW5kcwEBBShCYWRXaXRuZXNzAQEFZFNpZ25lZE1pZ3JhdGlvbk5vdEFsbG93ZWQBAQUwQmFkQ2hpbGRSb290AQEFJFhjbVBhbGxldAECYCxVbnJlYWNoYWJsZQEBBSxTZW5kRmFpbHVyZQEBBSBGaWx0ZXJlZAEBBUhVbndlaWdoYWJsZU1lc3NhZ2UBAQVgRGVzdGluYXRpb25Ob3RJbnZlcnRpYmxlAQEFFEVtcHR5AQEFOENhbm5vdFJlYW5jaG9yAQEFNFRvb01hbnlBc3NldHMBAQU0SW52YWxpZE9yaWdpbgEBBShCYWRWZXJzaW9uAQEFLEJhZExvY2F0aW9uAQEFOE5vU3Vic2NyaXB0aW9uAQEFREFscmVhZHlTdWJzY3JpYmVkAQEFWENhbm5vdENoZWNrT3V0VGVsZXBvcnQBAQUoTG93QmFsYW5jZQEBBTBUb29NYW55TG9ja3MBAQVMQWNjb3VudE5vdFNvdmVyZWlnbgEBBShGZWVzTm90TWV0AQEFMExvY2tOb3RGb3VuZAEBBRRJblVzZQEBBWhJbnZhbGlkQXNzZXRVbmtub3duUmVzZXJ2ZQEBBXhJbnZhbGlkQXNzZXRVbnN1cHBvcnRlZFJlc2VydmUBAQU8VG9vTWFueVJlc2VydmVzAQEFYExvY2FsRXhlY3V0aW9uSW5jb21wbGV0ZQEBBTBNZXNzYWdlUXVldWUBAiQsTm90UmVhcGFibGUBAQUYTm9QYWdlAQEFJE5vTWVzc2FnZQEBBUBBbHJlYWR5UHJvY2Vzc2VkAQEFGFF1ZXVlZAEBBUhJbnN1ZmZpY2llbnRXZWlnaHQBAQVgVGVtcG9yYXJpbHlVbnByb2Nlc3NhYmxlAQEFLFF1ZXVlUGF1c2VkAQEFTFJlY3Vyc2l2ZURpc2FsbG93ZWQBAQUkQXNzZXRSYXRlAQIMQFVua25vd25Bc3NldEtpbmQBAQU0QWxyZWFkeUV4aXN0cwEBBSBPdmVyZmxvdwEBBRRCZWVmeQECEGBJbnZhbGlkS2V5T3duZXJzaGlwUHJvb2YBAQVgSW52YWxpZEVxdWl2b2NhdGlvblByb29mAQEFWER1cGxpY2F0ZU9mZmVuY2VSZXBvcnQBAQVQSW52YWxpZENvbmZpZ3VyYXRpb24BAQUMTW1yAQEFMEJlZWZ5TW1yTGVhZgEBBQIoQEZ1bmRzVW5hdmFpbGFibGUBAQUwT25seVByb3ZpZGVyAQEFMEJlbG93TWluaW11bQEBBTBDYW5ub3RDcmVhdGUBAQUwVW5rbm93bkFzc2V0AQEFGEZyb3plbgEBBSxVbnN1cHBvcnRlZAEBBUBDYW5ub3RDcmVhdGVIb2xkAQEFNE5vdEV4cGVuZGFibGUBAQUcQmxvY2tlZAEBBQIMJFVuZGVyZmxvdwEBBSBPdmVyZmxvdwEBBThEaXZpc2lvbkJ5WmVybwEBBQIIMExpbWl0UmVhY2hlZAEBBRxOb0xheWVyAQEFAjgUT3RoZXIBAQUwQ2Fubm90TG9va3VwAQEFJEJhZE9yaWdpbgEBBRhNb2R1bGUBAuwYU3lzdGVtAQIkPEludmFsaWRTcGVjTmFtZQEBBWhTcGVjVmVyc2lvbk5lZWRzVG9JbmNyZWFzZQEBBXRGYWlsZWRUb0V4dHJhY3RSdW50aW1lVmVyc2lvbgEBBUxOb25EZWZhdWx0Q29tcG9zaXRlAQEFPE5vblplcm9SZWZDb3VudAEBBTBDYWxsRmlsdGVyZWQBAQVsTXVsdGlCbG9ja01pZ3JhdGlvbnNPbmdvaW5nAQEFRE5vdGhpbmdBdXRob3JpemVkAQEFMFVuYXV0aG9yaXplZAEBBSRTY2hlZHVsZXIBAhRARmFpbGVkVG9TY2hlZHVsZQEBBSBOb3RGb3VuZAEBBVxUYXJnZXRCbG9ja051bWJlckluUGFzdAEBBUhSZXNjaGVkdWxlTm9DaGFuZ2UBAQUUTmFtZWQBAQUgUHJlaW1hZ2UBAiQYVG9vQmlnAQEFMEFscmVhZHlOb3RlZAEBBTROb3RBdXRob3JpemVkAQEFIE5vdE5vdGVkAQEFJFJlcXVlc3RlZAEBBTBOb3RSZXF1ZXN0ZWQBAQUcVG9vTWFueQEBBRhUb29GZXcBAQUYTm9Db3N0AQEFEEJhYmUBAhBgSW52YWxpZEVxdWl2b2NhdGlvblByb29mAQEFYEludmFsaWRLZXlPd25lcnNoaXBQcm9vZgEBBVhEdXBsaWNhdGVPZmZlbmNlUmVwb3J0AQEFUEludmFsaWRDb25maWd1cmF0aW9uAQEFJFRpbWVzdGFtcAEBBRxJbmRpY2VzAQIULE5vdEFzc2lnbmVkAQEFIE5vdE93bmVyAQEFFEluVXNlAQEFLE5vdFRyYW5zZmVyAQEFJFBlcm1hbmVudAEBBSBCYWxhbmNlcwECMDhWZXN0aW5nQmFsYW5jZQEBBVRMaXF1aWRpdHlSZXN0cmljdGlvbnMBAQVMSW5zdWZmaWNpZW50QmFsYW5jZQEBBUhFeGlzdGVudGlhbERlcG9zaXQBAQU0RXhwZW5kYWJpbGl0eQEBBVxFeGlzdGluZ1Zlc3RpbmdTY2hlZHVsZQEBBSxEZWFkQWNjb3VudAEBBTxUb29NYW55UmVzZXJ2ZXMBAQUwVG9vTWFueUhvbGRzAQEFOFRvb01hbnlGcmVlemVzAQEFTElzc3VhbmNlRGVhY3RpdmF0ZWQBAQUkRGVsdGFaZXJvAQEFSFRyYW5zYWN0aW9uUGF5bWVudAEBBShBdXRob3JzaGlwAQEFHFN0YWtpbmcBAnw0Tm90Q29udHJvbGxlcgEBBSBOb3RTdGFzaAEBBTRBbHJlYWR5Qm9uZGVkAQEFNEFscmVhZHlQYWlyZWQBAQUwRW1wdHlUYXJnZXRzAQEFOER1cGxpY2F0ZUluZGV4AQEFREludmFsaWRTbGFzaEluZGV4AQEFQEluc3VmZmljaWVudEJvbmQBAQUwTm9Nb3JlQ2h1bmtzAQEFNE5vVW5sb2NrQ2h1bmsBAQUwRnVuZGVkVGFyZ2V0AQEFSEludmFsaWRFcmFUb1Jld2FyZAEBBWhJbnZhbGlkTnVtYmVyT2ZOb21pbmF0aW9ucwEBBUhOb3RTb3J0ZWRBbmRVbmlxdWUBAQU4QWxyZWFkeUNsYWltZWQBAQUsSW52YWxpZFBhZ2UBAQVUSW5jb3JyZWN0SGlzdG9yeURlcHRoAQEFWEluY29ycmVjdFNsYXNoaW5nU3BhbnMBAQUgQmFkU3RhdGUBAQU4VG9vTWFueVRhcmdldHMBAQUkQmFkVGFyZ2V0AQEFQENhbm5vdENoaWxsT3RoZXIBAQVEVG9vTWFueU5vbWluYXRvcnMBAQVEVG9vTWFueVZhbGlkYXRvcnMBAQVAQ29tbWlzc2lvblRvb0xvdwEBBSxCb3VuZE5vdE1ldAEBBVBDb250cm9sbGVyRGVwcmVjYXRlZAEBBUxDYW5ub3RSZXN0b3JlTGVkZ2VyAQEFbFJld2FyZERlc3RpbmF0aW9uUmVzdHJpY3RlZAEBBThOb3RFbm91Z2hGdW5kcwEBBVxWaXJ0dWFsU3Rha2VyTm90QWxsb3dlZAEBBSBPZmZlbmNlcwEBBShIaXN0b3JpY2FsAQEFHFNlc3Npb24BAhQwSW52YWxpZFByb29mAQEFXE5vQXNzb2NpYXRlZFZhbGlkYXRvcklkAQEFNER1cGxpY2F0ZWRLZXkBAQUYTm9LZXlzAQEFJE5vQWNjb3VudAEBBRxHcmFuZHBhAQIcLFBhdXNlRmFpbGVkAQEFMFJlc3VtZUZhaWxlZAEBBTRDaGFuZ2VQZW5kaW5nAQEFHFRvb1Nvb24BAQVgSW52YWxpZEtleU93bmVyc2hpcFByb29mAQEFYEludmFsaWRFcXVpdm9jYXRpb25Qcm9vZgEBBVhEdXBsaWNhdGVPZmZlbmNlUmVwb3J0AQEFSEF1dGhvcml0eURpc2NvdmVyeQEBBSBUcmVhc3VyeQECLDBJbnZhbGlkSW5kZXgBAQVAVG9vTWFueUFwcHJvdmFscwEBBVhJbnN1ZmZpY2llbnRQZXJtaXNzaW9uAQEFTFByb3Bvc2FsTm90QXBwcm92ZWQBAQVYRmFpbGVkVG9Db252ZXJ0QmFsYW5jZQEBBTBTcGVuZEV4cGlyZWQBAQUsRWFybHlQYXlvdXQBAQVAQWxyZWFkeUF0dGVtcHRlZAEBBSxQYXlvdXRFcnJvcgEBBTBOb3RBdHRlbXB0ZWQBAQUwSW5jb25jbHVzaXZlAQEFQENvbnZpY3Rpb25Wb3RpbmcBAjAoTm90T25nb2luZwEBBSBOb3RWb3RlcgEBBTBOb1Blcm1pc3Npb24BAQU8Tm9QZXJtaXNzaW9uWWV0AQEFREFscmVhZHlEZWxlZ2F0aW5nAQEFNEFscmVhZHlWb3RpbmcBAQVESW5zdWZmaWNpZW50RnVuZHMBAQU0Tm90RGVsZWdhdGluZwEBBSBOb25zZW5zZQEBBTxNYXhWb3Rlc1JlYWNoZWQBAQUsQ2xhc3NOZWVkZWQBAQUgQmFkQ2xhc3MBAQUkUmVmZXJlbmRhAQI4KE5vdE9uZ29pbmcBAQUoSGFzRGVwb3NpdAEBBSBCYWRUcmFjawEBBRBGdWxsAQEFKFF1ZXVlRW1wdHkBAQU0QmFkUmVmZXJlbmR1bQEBBSxOb3RoaW5nVG9EbwEBBRxOb1RyYWNrAQEFKFVuZmluaXNoZWQBAQUwTm9QZXJtaXNzaW9uAQEFJE5vRGVwb3NpdAEBBSRCYWRTdGF0dXMBAQVAUHJlaW1hZ2VOb3RFeGlzdAEBBYRQcmVpbWFnZVN0b3JlZFdpdGhEaWZmZXJlbnRMZW5ndGgBAQUcT3JpZ2lucwEBBSRXaGl0ZWxpc3QBAhRMVW5hdmFpbGFibGVQcmVJbWFnZQEBBTxVbmRlY29kYWJsZUNhbGwBAQVgSW52YWxpZENhbGxXZWlnaHRXaXRuZXNzAQEFUENhbGxJc05vdFdoaXRlbGlzdGVkAQEFWENhbGxBbHJlYWR5V2hpdGVsaXN0ZWQBAQUoUGFyYW1ldGVycwEBBRhDbGFpbXMBAhhgSW52YWxpZEV0aGVyZXVtU2lnbmF0dXJlAQEFQFNpZ25lckhhc05vQ2xhaW0BAQVAU2VuZGVySGFzTm9DbGFpbQEBBTBQb3RVbmRlcmZsb3cBAQVASW52YWxpZFN0YXRlbWVudAEBBUxWZXN0ZWRCYWxhbmNlRXhpc3RzAQEFHFZlc3RpbmcBAhQoTm90VmVzdGluZwEBBVRBdE1heFZlc3RpbmdTY2hlZHVsZXMBAQUkQW1vdW50TG93AQEFYFNjaGVkdWxlSW5kZXhPdXRPZkJvdW5kcwEBBVRJbnZhbGlkU2NoZWR1bGVQYXJhbXMBAQUcVXRpbGl0eQECBDBUb29NYW55Q2FsbHMBAQUUUHJveHkBAiAcVG9vTWFueQEBBSBOb3RGb3VuZAEBBSBOb3RQcm94eQEBBSxVbnByb3h5YWJsZQEBBSREdXBsaWNhdGUBAQUwTm9QZXJtaXNzaW9uAQEFLFVuYW5ub3VuY2VkAQEFLE5vU2VsZlByb3h5AQEFIE11bHRpc2lnAQI4QE1pbmltdW1UaHJlc2hvbGQBAQU8QWxyZWFkeUFwcHJvdmVkAQEFRE5vQXBwcm92YWxzTmVlZGVkAQEFRFRvb0Zld1NpZ25hdG9yaWVzAQEFSFRvb01hbnlTaWduYXRvcmllcwEBBVRTaWduYXRvcmllc091dE9mT3JkZXIBAQVMU2VuZGVySW5TaWduYXRvcmllcwEBBSBOb3RGb3VuZAEBBSBOb3RPd25lcgEBBSxOb1RpbWVwb2ludAEBBThXcm9uZ1RpbWVwb2ludAEBBUxVbmV4cGVjdGVkVGltZXBvaW50AQEFPE1heFdlaWdodFRvb0xvdwEBBTRBbHJlYWR5U3RvcmVkAQEFIEJvdW50aWVzAQIscEluc3VmZmljaWVudFByb3Bvc2Vyc0JhbGFuY2UBAQUwSW52YWxpZEluZGV4AQEFMFJlYXNvblRvb0JpZwEBBUBVbmV4cGVjdGVkU3RhdHVzAQEFOFJlcXVpcmVDdXJhdG9yAQEFMEludmFsaWRWYWx1ZQEBBShJbnZhbGlkRmVlAQEFNFBlbmRpbmdQYXlvdXQBAQUkUHJlbWF0dXJlAQEFUEhhc0FjdGl2ZUNoaWxkQm91bnR5AQEFNFRvb01hbnlRdWV1ZWQBAQU0Q2hpbGRCb3VudGllcwECDFRQYXJlbnRCb3VudHlOb3RBY3RpdmUBAQVkSW5zdWZmaWNpZW50Qm91bnR5QmFsYW5jZQEBBVBUb29NYW55Q2hpbGRCb3VudGllcwEBBWhFbGVjdGlvblByb3ZpZGVyTXVsdGlQaGFzZQECPGhQcmVEaXNwYXRjaEVhcmx5U3VibWlzc2lvbgEBBWxQcmVEaXNwYXRjaFdyb25nV2lubmVyQ291bnQBAQVkUHJlRGlzcGF0Y2hXZWFrU3VibWlzc2lvbgEBBTxTaWduZWRRdWV1ZUZ1bGwBAQVYU2lnbmVkQ2Fubm90UGF5RGVwb3NpdAEBBVBTaWduZWRJbnZhbGlkV2l0bmVzcwEBBUxTaWduZWRUb29NdWNoV2VpZ2h0AQEFPE9jd0NhbGxXcm9uZ0VyYQEBBVxNaXNzaW5nU25hcHNob3RNZXRhZGF0YQEBBVhJbnZhbGlkU3VibWlzc2lvbkluZGV4AQEFOENhbGxOb3RBbGxvd2VkAQEFOEZhbGxiYWNrRmFpbGVkAQEFLEJvdW5kTm90TWV0AQEFOFRvb01hbnlXaW5uZXJzAQEFZFByZURpc3BhdGNoRGlmZmVyZW50Um91bmQBAQUkVm90ZXJMaXN0AQIEEExpc3QBAhAkRHVwbGljYXRlAQEFKE5vdEhlYXZpZXIBAQUwTm90SW5TYW1lQmFnAQEFME5vZGVOb3RGb3VuZAEBBTxOb21pbmF0aW9uUG9vbHMBApAwUG9vbE5vdEZvdW5kAQEFSFBvb2xNZW1iZXJOb3RGb3VuZAEBBUhSZXdhcmRQb29sTm90Rm91bmQBAQVAU3ViUG9vbHNOb3RGb3VuZAEBBWRBY2NvdW50QmVsb25nc1RvT3RoZXJQb29sAQEFOEZ1bGx5VW5ib25kaW5nAQEFRE1heFVuYm9uZGluZ0xpbWl0AQEFRENhbm5vdFdpdGhkcmF3QW55AQEFRE1pbmltdW1Cb25kTm90TWV0AQEFME92ZXJmbG93UmlzawEBBTROb3REZXN0cm95aW5nAQEFME5vdE5vbWluYXRvcgEBBVROb3RLaWNrZXJPckRlc3Ryb3lpbmcBAQUcTm90T3BlbgEBBSBNYXhQb29scwEBBThNYXhQb29sTWVtYmVycwEBBURDYW5Ob3RDaGFuZ2VTdGF0ZQEBBVREb2VzTm90SGF2ZVBlcm1pc3Npb24BAQVUTWV0YWRhdGFFeGNlZWRzTWF4TGVuAQEFJERlZmVuc2l2ZQECHGhOb3RFbm91Z2hTcGFjZUluVW5ib25kUG9vbAEBBTBQb29sTm90Rm91bmQBAQVIUmV3YXJkUG9vbE5vdEZvdW5kAQEFQFN1YlBvb2xzTm90Rm91bmQBAQVwQm9uZGVkU3Rhc2hLaWxsZWRQcmVtYXR1cmVseQEBBVREZWxlZ2F0aW9uVW5zdXBwb3J0ZWQBAQU8U2xhc2hOb3RBcHBsaWVkAQEFnFBhcnRpYWxVbmJvbmROb3RBbGxvd2VkUGVybWlzc2lvbmxlc3NseQEBBVxNYXhDb21taXNzaW9uUmVzdHJpY3RlZAEBBWBDb21taXNzaW9uRXhjZWVkc01heGltdW0BAQV4Q29tbWlzc2lvbkV4Y2VlZHNHbG9iYWxNYXhpbXVtAQEFZENvbW1pc3Npb25DaGFuZ2VUaHJvdHRsZWQBAQV4Q29tbWlzc2lvbkNoYW5nZVJhdGVOb3RBbGxvd2VkAQEFTE5vUGVuZGluZ0NvbW1pc3Npb24BAQVYTm9Db21taXNzaW9uQ3VycmVudFNldAEBBSxQb29sSWRJblVzZQEBBTRJbnZhbGlkUG9vbElkAQEFTEJvbmRFeHRyYVJlc3RyaWN0ZWQBAQU8Tm90aGluZ1RvQWRqdXN0AQEFOE5vdGhpbmdUb1NsYXNoAQEFPEFscmVhZHlNaWdyYXRlZAEBBSxOb3RNaWdyYXRlZAEBBTBOb3RTdXBwb3J0ZWQBAQUsRmFzdFVuc3Rha2UBAhg0Tm90Q29udHJvbGxlcgEBBTRBbHJlYWR5UXVldWVkAQEFOE5vdEZ1bGx5Qm9uZGVkAQEFJE5vdFF1ZXVlZAEBBSxBbHJlYWR5SGVhZAEBBThDYWxsTm90QWxsb3dlZAEBBUBQYXJhY2hhaW5zT3JpZ2luAQEFNENvbmZpZ3VyYXRpb24BAgQ8SW52YWxpZE5ld1ZhbHVlAQEFLFBhcmFzU2hhcmVkAQEFNFBhcmFJbmNsdXNpb24BAkhkVmFsaWRhdG9ySW5kZXhPdXRPZkJvdW5kcwEBBVBVbnNjaGVkdWxlZENhbmRpZGF0ZQEBBUBIZWFkRGF0YVRvb0xhcmdlAQEFUFByZW1hdHVyZUNvZGVVcGdyYWRlAQEFPE5ld0NvZGVUb29MYXJnZQEBBVREaXNhbGxvd2VkUmVsYXlQYXJlbnQBAQVESW52YWxpZEFzc2lnbm1lbnQBAQVESW52YWxpZEdyb3VwSW5kZXgBAQVMSW5zdWZmaWNpZW50QmFja2luZwEBBThJbnZhbGlkQmFja2luZwEBBUROb3RDb2xsYXRvclNpZ25lZAEBBWhWYWxpZGF0aW9uRGF0YUhhc2hNaXNtYXRjaAEBBYBJbmNvcnJlY3REb3dud2FyZE1lc3NhZ2VIYW5kbGluZwEBBVRJbnZhbGlkVXB3YXJkTWVzc2FnZXMBAQVgSHJtcFdhdGVybWFya01pc2hhbmRsaW5nAQEFTEludmFsaWRPdXRib3VuZEhybXABAQVkSW52YWxpZFZhbGlkYXRpb25Db2RlSGFzaAEBBUBQYXJhSGVhZE1pc21hdGNoAQEFMFBhcmFJbmhlcmVudAECFGRUb29NYW55SW5jbHVzaW9uSW5oZXJlbnRzAQEFTEludmFsaWRQYXJlbnRIZWFkZXIBAQVISW5oZXJlbnRPdmVyd2VpZ2h0AQEFhENhbmRpZGF0ZXNGaWx0ZXJlZER1cmluZ0V4ZWN1dGlvbgEBBVBVbnNjaGVkdWxlZENhbmRpZGF0ZQEBBTRQYXJhU2NoZWR1bGVyAQEFFFBhcmFzAQI0NE5vdFJlZ2lzdGVyZWQBAQU0Q2Fubm90T25ib2FyZAEBBThDYW5ub3RPZmZib2FyZAEBBTRDYW5ub3RVcGdyYWRlAQEFPENhbm5vdERvd25ncmFkZQEBBVhQdmZDaGVja1N0YXRlbWVudFN0YWxlAQEFXFB2ZkNoZWNrU3RhdGVtZW50RnV0dXJlAQEFhFB2ZkNoZWNrVmFsaWRhdG9ySW5kZXhPdXRPZkJvdW5kcwEBBWBQdmZDaGVja0ludmFsaWRTaWduYXR1cmUBAQVIUHZmQ2hlY2tEb3VibGVWb3RlAQEFWFB2ZkNoZWNrU3ViamVjdEludmFsaWQBAQVEQ2Fubm90VXBncmFkZUNvZGUBAQUsSW52YWxpZENvZGUBAQUsSW5pdGlhbGl6ZXIBAQUMRG1wAQEFEEhybXABAlBUT3BlbkhybXBDaGFubmVsVG9TZWxmAQEFfE9wZW5Icm1wQ2hhbm5lbEludmFsaWRSZWNpcGllbnQBAQVsT3BlbkhybXBDaGFubmVsWmVyb0NhcGFjaXR5AQEFjE9wZW5Icm1wQ2hhbm5lbENhcGFjaXR5RXhjZWVkc0xpbWl0AQEFeE9wZW5Icm1wQ2hhbm5lbFplcm9NZXNzYWdlU2l6ZQEBBZhPcGVuSHJtcENoYW5uZWxNZXNzYWdlU2l6ZUV4Y2VlZHNMaW1pdAEBBXBPcGVuSHJtcENoYW5uZWxBbHJlYWR5RXhpc3RzAQEFfE9wZW5Icm1wQ2hhbm5lbEFscmVhZHlSZXF1ZXN0ZWQBAQVwT3BlbkhybXBDaGFubmVsTGltaXRFeGNlZWRlZAEBBXBBY2NlcHRIcm1wQ2hhbm5lbERvZXNudEV4aXN0AQEFhEFjY2VwdEhybXBDaGFubmVsQWxyZWFkeUNvbmZpcm1lZAEBBXhBY2NlcHRIcm1wQ2hhbm5lbExpbWl0RXhjZWVkZWQBAQVwQ2xvc2VIcm1wQ2hhbm5lbFVuYXV0aG9yaXplZAEBBWxDbG9zZUhybXBDaGFubmVsRG9lc250RXhpc3QBAQV8Q2xvc2VIcm1wQ2hhbm5lbEFscmVhZHlVbmRlcndheQEBBYRDYW5jZWxIcm1wT3BlbkNoYW5uZWxVbmF1dGhvcml6ZWQBAQVoT3BlbkhybXBDaGFubmVsRG9lc250RXhpc3QBAQV8T3BlbkhybXBDaGFubmVsQWxyZWFkeUNvbmZpcm1lZAEBBTBXcm9uZ1dpdG5lc3MBAQVwQ2hhbm5lbENyZWF0aW9uTm90QXV0aG9yaXplZAEBBTxQYXJhU2Vzc2lvbkluZm8BAQU0UGFyYXNEaXNwdXRlcwECJHREdXBsaWNhdGVEaXNwdXRlU3RhdGVtZW50U2V0cwEBBVxBbmNpZW50RGlzcHV0ZVN0YXRlbWVudAEBBWRWYWxpZGF0b3JJbmRleE91dE9mQm91bmRzAQEFQEludmFsaWRTaWduYXR1cmUBAQVIRHVwbGljYXRlU3RhdGVtZW50AQEFSFNpbmdsZVNpZGVkRGlzcHV0ZQEBBTxNYWxpY2lvdXNCYWNrZXIBAQVMTWlzc2luZ0JhY2tpbmdWb3RlcwEBBUhVbmNvbmZpcm1lZERpc3B1dGUBAQU0UGFyYXNTbGFzaGluZwECGGBJbnZhbGlkS2V5T3duZXJzaGlwUHJvb2YBAQVMSW52YWxpZFNlc3Npb25JbmRleAEBBVBJbnZhbGlkQ2FuZGlkYXRlSGFzaAEBBVRJbnZhbGlkVmFsaWRhdG9ySW5kZXgBAQVgVmFsaWRhdG9ySW5kZXhJZE1pc21hdGNoAQEFXER1cGxpY2F0ZVNsYXNoaW5nUmVwb3J0AQEFIE9uRGVtYW5kAQIIJFF1ZXVlRnVsbAEBBXBTcG90UHJpY2VIaWdoZXJUaGFuTWF4QW1vdW50AQEFaENvcmV0aW1lQXNzaWdubWVudFByb3ZpZGVyAQIYQEFzc2lnbm1lbnRzRW1wdHkBAQU0T3ZlclNjaGVkdWxlZAEBBThVbmRlclNjaGVkdWxlZAEBBUBEaXNhbGxvd2VkSW5zZXJ0AQEFPER1cGxpY2F0ZUluc2VydAEBBVBBc3NpZ25tZW50c05vdFNvcnRlZAEBBSRSZWdpc3RyYXIBAjg0Tm90UmVnaXN0ZXJlZAEBBURBbHJlYWR5UmVnaXN0ZXJlZAEBBSBOb3RPd25lcgEBBTBDb2RlVG9vTGFyZ2UBAQVASGVhZERhdGFUb29MYXJnZQEBBTBOb3RQYXJhY2hhaW4BAQU0Tm90UGFyYXRocmVhZAEBBUBDYW5ub3REZXJlZ2lzdGVyAQEFPENhbm5vdERvd25ncmFkZQEBBTRDYW5ub3RVcGdyYWRlAQEFKFBhcmFMb2NrZWQBAQUsTm90UmVzZXJ2ZWQBAQUsSW52YWxpZENvZGUBAQUoQ2Fubm90U3dhcAEBBRRTbG90cwECCERQYXJhTm90T25ib2FyZGluZwEBBShMZWFzZUVycm9yAQEFIEF1Y3Rpb25zAQIcREF1Y3Rpb25JblByb2dyZXNzAQEFRExlYXNlUGVyaW9kSW5QYXN0AQEFRFBhcmFOb3RSZWdpc3RlcmVkAQEFRE5vdEN1cnJlbnRBdWN0aW9uAQEFKE5vdEF1Y3Rpb24BAQUwQXVjdGlvbkVuZGVkAQEFQEFscmVhZHlMZWFzZWRPdXQBAQUkQ3Jvd2Rsb2FuAQJcREZpcnN0UGVyaW9kSW5QYXN0AQEFZEZpcnN0UGVyaW9kVG9vRmFySW5GdXR1cmUBAQVsTGFzdFBlcmlvZEJlZm9yZUZpcnN0UGVyaW9kAQEFYExhc3RQZXJpb2RUb29GYXJJbkZ1dHVyZQEBBTxDYW5ub3RFbmRJblBhc3QBAQVERW5kVG9vRmFySW5GdXR1cmUBAQUgT3ZlcmZsb3cBAQVQQ29udHJpYnV0aW9uVG9vU21hbGwBAQU0SW52YWxpZFBhcmFJZAEBBSxDYXBFeGNlZWRlZAEBBVhDb250cmlidXRpb25QZXJpb2RPdmVyAQEFNEludmFsaWRPcmlnaW4BAQUwTm90UGFyYWNoYWluAQEFLExlYXNlQWN0aXZlAQEFQEJpZE9yTGVhc2VBY3RpdmUBAQUwRnVuZE5vdEVuZGVkAQEFPE5vQ29udHJpYnV0aW9ucwEBBUhOb3RSZWFkeVRvRGlzc29sdmUBAQVASW52YWxpZFNpZ25hdHVyZQEBBTBNZW1vVG9vTGFyZ2UBAQVEQWxyZWFkeUluTmV3UmFpc2UBAQVIVnJmRGVsYXlJblByb2dyZXNzAQEFNE5vTGVhc2VQZXJpb2QBAQUgQ29yZXRpbWUBAgwkTm90QnJva2VyAQEFWFJlcXVlc3RlZEZ1dHVyZVJldmVudWUBAQVMQXNzZXRUcmFuc2ZlckZhaWxlZAEBBUhTdGF0ZVRyaWVNaWdyYXRpb24BAhg8TWF4U2lnbmVkTGltaXRzAQEFKEtleVRvb0xvbmcBAQU4Tm90RW5vdWdoRnVuZHMBAQUoQmFkV2l0bmVzcwEBBWRTaWduZWRNaWdyYXRpb25Ob3RBbGxvd2VkAQEFMEJhZENoaWxkUm9vdAEBBSRYY21QYWxsZXQBAmAsVW5yZWFjaGFibGUBAQUsU2VuZEZhaWx1cmUBAQUgRmlsdGVyZWQBAQVIVW53ZWlnaGFibGVNZXNzYWdlAQEFYERlc3RpbmF0aW9uTm90SW52ZXJ0aWJsZQEBBRRFbXB0eQEBBThDYW5ub3RSZWFuY2hvcgEBBTRUb29NYW55QXNzZXRzAQEFNEludmFsaWRPcmlnaW4BAQUoQmFkVmVyc2lvbgEBBSxCYWRMb2NhdGlvbgEBBThOb1N1YnNjcmlwdGlvbgEBBURBbHJlYWR5U3Vic2NyaWJlZAEBBVhDYW5ub3RDaGVja091dFRlbGVwb3J0AQEFKExvd0JhbGFuY2UBAQUwVG9vTWFueUxvY2tzAQEFTEFjY291bnROb3RTb3ZlcmVpZ24BAQUoRmVlc05vdE1ldAEBBTBMb2NrTm90Rm91bmQBAQUUSW5Vc2UBAQVoSW52YWxpZEFzc2V0VW5rbm93blJlc2VydmUBAQV4SW52YWxpZEFzc2V0VW5zdXBwb3J0ZWRSZXNlcnZlAQEFPFRvb01hbnlSZXNlcnZlcwEBBWBMb2NhbEV4ZWN1dGlvbkluY29tcGxldGUBAQUwTWVzc2FnZVF1ZXVlAQIkLE5vdFJlYXBhYmxlAQEFGE5vUGFnZQEBBSROb01lc3NhZ2UBAQVAQWxyZWFkeVByb2Nlc3NlZAEBBRhRdWV1ZWQBAQVISW5zdWZmaWNpZW50V2VpZ2h0AQEFYFRlbXBvcmFyaWx5VW5wcm9jZXNzYWJsZQEBBSxRdWV1ZVBhdXNlZAEBBUxSZWN1cnNpdmVEaXNhbGxvd2VkAQEFJEFzc2V0UmF0ZQECDEBVbmtub3duQXNzZXRLaW5kAQEFNEFscmVhZHlFeGlzdHMBAQUgT3ZlcmZsb3cBAQUUQmVlZnkBAhBgSW52YWxpZEtleU93bmVyc2hpcFByb29mAQEFYEludmFsaWRFcXVpdm9jYXRpb25Qcm9vZgEBBVhEdXBsaWNhdGVPZmZlbmNlUmVwb3J0AQEFUEludmFsaWRDb25maWd1cmF0aW9uAQEFDE1tcgEBBTBCZWVmeU1tckxlYWYBAQVEQ29uc3VtZXJSZW1haW5pbmcBAQUsTm9Qcm92aWRlcnMBAQVAVG9vTWFueUNvbnN1bWVycwEBBRRUb2tlbgECKEBGdW5kc1VuYXZhaWxhYmxlAQEFME9ubHlQcm92aWRlcgEBBTBCZWxvd01pbmltdW0BAQUwQ2Fubm90Q3JlYXRlAQEFMFVua25vd25Bc3NldAEBBRhGcm96ZW4BAQUsVW5zdXBwb3J0ZWQBAQVAQ2Fubm90Q3JlYXRlSG9sZAEBBTROb3RFeHBlbmRhYmxlAQEFHEJsb2NrZWQBAQUoQXJpdGhtZXRpYwECDCRVbmRlcmZsb3cBAQUgT3ZlcmZsb3cBAQU4RGl2aXNpb25CeVplcm8BAQU0VHJhbnNhY3Rpb25hbAECCDBMaW1pdFJlYWNoZWQBAQUcTm9MYXllcgEBBSRFeGhhdXN0ZWQBAQUoQ29ycnVwdGlvbgEBBSxVbmF2YWlsYWJsZQEBBThSb290Tm90QWxsb3dlZAEBBQIcQEV4dHJpbnNpY1N1Y2Nlc3MBAAQ0ZGlzcGF0Y2hfaW5mb0A8RXh0cmluc2ljRmFpbGVkAQAIOGRpc3BhdGNoX2Vycm9yBQE0ZGlzcGF0Y2hfaW5mb0AsQ29kZVVwZGF0ZWQBAQUoTmV3QWNjb3VudAEABBxhY2NvdW50ADRLaWxsZWRBY2NvdW50AQAEHGFjY291bnQAIFJlbWFya2VkAQAIGHNlbmRlcgAQaGFzaCBEVXBncmFkZUF1dGhvcml6ZWQBAAgkY29kZV9oYXNoIDRjaGVja192ZXJzaW9uFAQEAQgGIAEFBxUBBQECJCRTY2hlZHVsZWQBAAgQd2hlbgQUaW5kZXgEIENhbmNlbGVkAQAIEHdoZW4EFGluZGV4BChEaXNwYXRjaGVkAQAMEHRhc2sNAQhpZBEBGHJlc3VsdBkBIFJldHJ5U2V0AQAQEHRhc2sNAQhpZBEBGHBlcmlvZAQccmV0cmllcwQ4UmV0cnlDYW5jZWxsZWQBAAgQdGFzaw0BCGlkEQE8Q2FsbFVuYXZhaWxhYmxlAQAIEHRhc2sNAQhpZBEBOFBlcmlvZGljRmFpbGVkAQAIEHRhc2sNAQhpZBEBLFJldHJ5RmFpbGVkAQAIEHRhc2sNAQhpZBEBVFBlcm1hbmVudGx5T3ZlcndlaWdodAEACBB0YXNrDQEIaWQRAQIMFE5vdGVkAQAEEGhhc2ggJFJlcXVlc3RlZAEABBBoYXNoIBxDbGVhcmVkAQAEEGhhc2ggAgw0SW5kZXhBc3NpZ25lZAEACAx3aG8AFGluZGV4BChJbmRleEZyZWVkAQAEFGluZGV4BCxJbmRleEZyb3plbgEACBRpbmRleAQMd2hvAAIIEEZyZWUBAQUgUmVzZXJ2ZWQBAQUCWBxFbmRvd2VkAQAIHGFjY291bnQAMGZyZWVfYmFsYW5jZQggRHVzdExvc3QBAAgcYWNjb3VudAAYYW1vdW50CCBUcmFuc2ZlcgEADBBmcm9tAAh0bwAYYW1vdW50CChCYWxhbmNlU2V0AQAIDHdobwAQZnJlZQggUmVzZXJ2ZWQBAAgMd2hvABhhbW91bnQIKFVucmVzZXJ2ZWQBAAgMd2hvABhhbW91bnQISFJlc2VydmVSZXBhdHJpYXRlZAEAEBBmcm9tAAh0bwAYYW1vdW50CEhkZXN0aW5hdGlvbl9zdGF0dXMpARxEZXBvc2l0AQAIDHdobwAYYW1vdW50CCBXaXRoZHJhdwEACAx3aG8AGGFtb3VudAgcU2xhc2hlZAEACAx3aG8AGGFtb3VudAgYTWludGVkAQAIDHdobwAYYW1vdW50CBhCdXJuZWQBAAgMd2hvABhhbW91bnQIJFN1c3BlbmRlZAEACAx3aG8AGGFtb3VudAggUmVzdG9yZWQBAAgMd2hvABhhbW91bnQIIFVwZ3JhZGVkAQAEDHdobwAYSXNzdWVkAQAEGGFtb3VudAgkUmVzY2luZGVkAQAEGGFtb3VudAgYTG9ja2VkAQAIDHdobwAYYW1vdW50CCBVbmxvY2tlZAEACAx3aG8AGGFtb3VudAgYRnJvemVuAQAIDHdobwAYYW1vdW50CBhUaGF3ZWQBAAgMd2hvABhhbW91bnQITFRvdGFsSXNzdWFuY2VGb3JjZWQBAAgMb2xkCAxuZXcIAgRIVHJhbnNhY3Rpb25GZWVQYWlkAQAMDHdobwAoYWN0dWFsX2ZlZQgMdGlwCAIUGFN0YWtlZAEBBRRTdGFzaAEBBShDb250cm9sbGVyAQEFHEFjY291bnQBAQEQTm9uZQEBBQAIKGNvbW1pc3Npb24EHGJsb2NrZWQUAhAoTm90Rm9yY2luZwEBBSBGb3JjZU5ldwEBBSRGb3JjZU5vbmUBAQUsRm9yY2VBbHdheXMBAQUCSBxFcmFQYWlkAQAMJGVyYV9pbmRleARAdmFsaWRhdG9yX3BheW91dAgkcmVtYWluZGVyCCBSZXdhcmRlZAEADBRzdGFzaAAQZGVzdDUBGGFtb3VudAgcU2xhc2hlZAEACBhzdGFrZXIAGGFtb3VudAg0U2xhc2hSZXBvcnRlZAEADCR2YWxpZGF0b3IAIGZyYWN0aW9uBCRzbGFzaF9lcmEEaE9sZFNsYXNoaW5nUmVwb3J0RGlzY2FyZGVkAQAENHNlc3Npb25faW5kZXgEOFN0YWtlcnNFbGVjdGVkAQEFGEJvbmRlZAEACBRzdGFzaAAYYW1vdW50CCBVbmJvbmRlZAEACBRzdGFzaAAYYW1vdW50CCRXaXRoZHJhd24BAAgUc3Rhc2gAGGFtb3VudAgYS2lja2VkAQAIJG5vbWluYXRvcgAUc3Rhc2gAVFN0YWtpbmdFbGVjdGlvbkZhaWxlZAEBBRxDaGlsbGVkAQAEFHN0YXNoADRQYXlvdXRTdGFydGVkAQAIJGVyYV9pbmRleAQ8dmFsaWRhdG9yX3N0YXNoAERWYWxpZGF0b3JQcmVmc1NldAEACBRzdGFzaAAUcHJlZnM5AWhTbmFwc2hvdFZvdGVyc1NpemVFeGNlZWRlZAEABBBzaXplBGxTbmFwc2hvdFRhcmdldHNTaXplRXhjZWVkZWQBAAQQc2l6ZQQgRm9yY2VFcmEBAAQQbW9kZT0BZENvbnRyb2xsZXJCYXRjaERlcHJlY2F0ZWQBAAQgZmFpbHVyZXMEBQFAAgQcT2ZmZW5jZQEACBBraW5kRQEgdGltZXNsb3QkAgQoTmV3U2Vzc2lvbgEABDRzZXNzaW9uX2luZGV4BAMIIAgEUQEAAgw4TmV3QXV0aG9yaXRpZXMBAAQ0YXV0aG9yaXR5X3NldFUBGFBhdXNlZAEBBRxSZXN1bWVkAQEFAiwkQnlHZW5lc2lzAQUBgBhCeUZvcmsBAAgwYmxvY2tfbnVtYmVyCChibG9ja19oYXNoICBQb2xrYWRvdAEBBRhLdXNhbWEBAQUcV2VzdGVuZAEBBRhSb2NvY28BAQUYV29jb2NvAQEFIEV0aGVyZXVtAQAEIGNoYWluX2lkCCxCaXRjb2luQ29yZQEBBSxCaXRjb2luQ2FzaAEBBUBQb2xrYWRvdEJ1bGxldGluAQEFBl0BBQFQAigQVW5pdAEBBRxNb25pa2VyAQUBEBRJbmRleAEBAiRFeGVjdXRpdmUBAQUkVGVjaG5pY2FsAQEFLExlZ2lzbGF0aXZlAQEFIEp1ZGljaWFsAQEFHERlZmVuc2UBAQU4QWRtaW5pc3RyYXRpb24BAQUgVHJlYXN1cnkBAQUCFBRWb2ljZQEBBRxNZW1iZXJzAQAEFGNvdW50BCBGcmFjdGlvbgEACAxub20EFGRlbm9tBERBdExlYXN0UHJvcG9ydGlvbgEACAxub20EFGRlbm9tBEhNb3JlVGhhblByb3BvcnRpb24BAAgMbm9tBBRkZW5vbQQCKCRQYXJhY2hhaW4BAQIsQWNjb3VudElkMzIBAAgcbmV0d29ya2EBCGlkIDhBY2NvdW50SW5kZXg2NAEACBxuZXR3b3JrYQEUaW5kZXgIMEFjY291bnRLZXkyMAEACBxuZXR3b3JrYQEMa2V5ZQE4UGFsbGV0SW5zdGFuY2UBAQIwR2VuZXJhbEluZGV4AQEDKEdlbmVyYWxLZXkBAAgYbGVuZ3RoBBBkYXRhICRPbmx5Q2hpbGQBAQUkUGx1cmFsaXR5AQAICGlkaQEQcGFydG0BPEdsb2JhbENvbnNlbnN1cwECLCRCeUdlbmVzaXMBBQGAGEJ5Rm9yawEACDBibG9ja19udW1iZXIIKGJsb2NrX2hhc2ggIFBvbGthZG90AQEFGEt1c2FtYQEBBRxXZXN0ZW5kAQEFGFJvY29jbwEBBRhXb2NvY28BAQUgRXRoZXJldW0BAAQgY2hhaW5faWQILEJpdGNvaW5Db3JlAQEFLEJpdGNvaW5DYXNoAQEFQFBvbGthZG90QnVsbGV0aW4BAQUCJBBIZXJlAQEFCFgxAQIoJFBhcmFjaGFpbgEBAixBY2NvdW50SWQzMgEACBxuZXR3b3JrYQEIaWQgOEFjY291bnRJbmRleDY0AQAIHG5ldHdvcmthARRpbmRleAgwQWNjb3VudEtleTIwAQAIHG5ldHdvcmthAQxrZXllAThQYWxsZXRJbnN0YW5jZQEBAjBHZW5lcmFsSW5kZXgBAQMoR2VuZXJhbEtleQEACBhsZW5ndGgEEGRhdGEgJE9ubHlDaGlsZAEBBSRQbHVyYWxpdHkBAAgIaWRpARBwYXJ0bQE8R2xvYmFsQ29uc2Vuc3VzAQIsJEJ5R2VuZXNpcwEFAYAYQnlGb3JrAQAIMGJsb2NrX251bWJlcggoYmxvY2tfaGFzaCAgUG9sa2Fkb3QBAQUYS3VzYW1hAQEFHFdlc3RlbmQBAQUYUm9jb2NvAQEFGFdvY29jbwEBBSBFdGhlcmV1bQEABCBjaGFpbl9pZAgsQml0Y29pbkNvcmUBAQUsQml0Y29pbkNhc2gBAQVAUG9sa2Fkb3RCdWxsZXRpbgEBBQhYMgEEcQEBCAhYMwEEcQEBDAhYNAEEcQEBEAhYNQEEcQEBFAhYNgEEcQEBGAhYNwEEcQEBHAhYOAEEcQEBIAAIHHBhcmVudHMEIGludGVyaW9ydQECCCBDb25jcmV0ZQEACBxwYXJlbnRzBCBpbnRlcmlvcnUBIEFic3RyYWN0AQUBgAIICFYzAQAIIGxvY2F0aW9ueQEgYXNzZXRfaWR9AQhWNAEACCBsb2NhdGlvbnkBIGFzc2V0X2lkeQECEAxBbnkBAQUUTmFtZWQBBQAgUG9sa2Fkb3QBAQUYS3VzYW1hAQEFAigQVW5pdAEBBRROYW1lZAEFABRJbmRleAEBAiRFeGVjdXRpdmUBAQUkVGVjaG5pY2FsAQEFLExlZ2lzbGF0aXZlAQEFIEp1ZGljaWFsAQEFHERlZmVuc2UBAQU4QWRtaW5pc3RyYXRpb24BAQUgVHJlYXN1cnkBAQUCJCRQYXJhY2hhaW4BAQIsQWNjb3VudElkMzIBAAgcbmV0d29ya4UBCGlkIDhBY2NvdW50SW5kZXg2NAEACBxuZXR3b3JrhQEUaW5kZXgIMEFjY291bnRLZXkyMAEACBxuZXR3b3JrhQEMa2V5ZQE4UGFsbGV0SW5zdGFuY2UBAQIwR2VuZXJhbEluZGV4AQEDKEdlbmVyYWxLZXkBBQAkT25seUNoaWxkAQEFJFBsdXJhbGl0eQEACAhpZIkBEHBhcnRtAQIkEEhlcmUBAQUIWDEBAiQkUGFyYWNoYWluAQECLEFjY291bnRJZDMyAQAIHG5ldHdvcmuFAQhpZCA4QWNjb3VudEluZGV4NjQBAAgcbmV0d29ya4UBFGluZGV4CDBBY2NvdW50S2V5MjABAAgcbmV0d29ya4UBDGtleWUBOFBhbGxldEluc3RhbmNlAQECMEdlbmVyYWxJbmRleAEBAyhHZW5lcmFsS2V5AQUAJE9ubHlDaGlsZAEBBSRQbHVyYWxpdHkBAAgIaWSJARBwYXJ0bQEIWDIBBI0BAQgIWDMBBI0BAQwIWDQBBI0BARAIWDUBBI0BARQIWDYBBI0BARgIWDcBBI0BARwIWDgBBI0BASAACBxwYXJlbnRzBCBpbnRlcmlvcpEBAgwIVjIBAAgccGFyZW50cwQgaW50ZXJpb3KRAQhWMwEACBxwYXJlbnRzBCBpbnRlcmlvcnUBCFY0AQAIHHBhcmVudHMEIGludGVyaW9ydQECMCBTcGVuZGluZwEABEBidWRnZXRfcmVtYWluaW5nCBxBd2FyZGVkAQAMOHByb3Bvc2FsX2luZGV4BBRhd2FyZAgcYWNjb3VudAAUQnVybnQBAAQsYnVybnRfZnVuZHMIIFJvbGxvdmVyAQAEQHJvbGxvdmVyX2JhbGFuY2UIHERlcG9zaXQBAAQUdmFsdWUINFNwZW5kQXBwcm92ZWQBAAw4cHJvcG9zYWxfaW5kZXgEGGFtb3VudAgsYmVuZWZpY2lhcnkAPFVwZGF0ZWRJbmFjdGl2ZQEACCxyZWFjdGl2YXRlZAgsZGVhY3RpdmF0ZWQISEFzc2V0U3BlbmRBcHByb3ZlZAEAGBRpbmRleAQoYXNzZXRfa2luZIEBGGFtb3VudAgsYmVuZWZpY2lhcnmZASh2YWxpZF9mcm9tBCRleHBpcmVfYXQEQEFzc2V0U3BlbmRWb2lkZWQBAAQUaW5kZXgEEFBhaWQBAAgUaW5kZXgEKHBheW1lbnRfaWQINFBheW1lbnRGYWlsZWQBAAgUaW5kZXgEKHBheW1lbnRfaWQIOFNwZW5kUHJvY2Vzc2VkAQAEFGluZGV4BAIIJERlbGVnYXRlZAEEAAEILFVuZGVsZWdhdGVkAQEBAgwYTGVnYWN5AQAEEGhhc2ggGElubGluZQEFABhMb29rdXABAAgQaGFzaCAMbGVuBAAMEGF5ZXMIEG5heXMIHHN1cHBvcnQIAkAkU3VibWl0dGVkAQAMFGluZGV4BBR0cmFjawQgcHJvcG9zYWylAVREZWNpc2lvbkRlcG9zaXRQbGFjZWQBAAwUaW5kZXgEDHdobwAYYW1vdW50CFxEZWNpc2lvbkRlcG9zaXRSZWZ1bmRlZAEADBRpbmRleAQMd2hvABhhbW91bnQIOERlcG9zaXRTbGFzaGVkAQAIDHdobwAYYW1vdW50CDxEZWNpc2lvblN0YXJ0ZWQBABAUaW5kZXgEFHRyYWNrBCBwcm9wb3NhbKUBFHRhbGx5qQE4Q29uZmlybVN0YXJ0ZWQBAAQUaW5kZXgEOENvbmZpcm1BYm9ydGVkAQAEFGluZGV4BCRDb25maXJtZWQBAAgUaW5kZXgEFHRhbGx5qQEgQXBwcm92ZWQBAAQUaW5kZXgEIFJlamVjdGVkAQAIFGluZGV4BBR0YWxseakBIFRpbWVkT3V0AQAIFGluZGV4BBR0YWxseakBJENhbmNlbGxlZAEACBRpbmRleAQUdGFsbHmpARhLaWxsZWQBAAgUaW5kZXgEFHRhbGx5qQFkU3VibWlzc2lvbkRlcG9zaXRSZWZ1bmRlZAEADBRpbmRleAQMd2hvABhhbW91bnQILE1ldGFkYXRhU2V0AQAIFGluZGV4BBBoYXNoIDxNZXRhZGF0YUNsZWFyZWQBAAgUaW5kZXgEEGhhc2ggBhgACDRhY3R1YWxfd2VpZ2h0sQEgcGF5c19mZWU8AAgkcG9zdF9pbmZvtQEUZXJyb3IFAQe1AbkBAgw8Q2FsbFdoaXRlbGlzdGVkAQAEJGNhbGxfaGFzaCBYV2hpdGVsaXN0ZWRDYWxsUmVtb3ZlZAEABCRjYWxsX2hhc2ggZFdoaXRlbGlzdGVkQ2FsbERpc3BhdGNoZWQBAAgkY2FsbF9oYXNoIBhyZXN1bHS9AQIUME1pbkluZmxhdGlvbgEBBTBNYXhJbmZsYXRpb24BAQUoSWRlYWxTdGFrZQEBBRxGYWxsb2ZmAQEFPFVzZUF1Y3Rpb25TbG90cwEBBQIEJEluZmxhdGlvbgECFDBNaW5JbmZsYXRpb24BAQUwTWF4SW5mbGF0aW9uAQEFKElkZWFsU3Rha2UBAQUcRmFsbG9mZgEBBTxVc2VBdWN0aW9uU2xvdHMBAQUCFDBNaW5JbmZsYXRpb24BAQMwTWF4SW5mbGF0aW9uAQEDKElkZWFsU3Rha2UBAQMcRmFsbG9mZgEBAzxVc2VBdWN0aW9uU2xvdHMBAQACBCRJbmZsYXRpb24BAhQwTWluSW5mbGF0aW9uAQEDME1heEluZmxhdGlvbgEBAyhJZGVhbFN0YWtlAQEDHEZhbGxvZmYBAQM8VXNlQXVjdGlvblNsb3RzAQEABtEBAgQcVXBkYXRlZAEADAxrZXnJASRvbGRfdmFsdWXVASRuZXdfdmFsdWXVAQIEHENsYWltZWQBAAwMd2hvAEBldGhlcmV1bV9hZGRyZXNzZQEYYW1vdW50CAIIOFZlc3RpbmdVcGRhdGVkAQAIHGFjY291bnQAIHVudmVzdGVkCEBWZXN0aW5nQ29tcGxldGVkAQAEHGFjY291bnQAAhhAQmF0Y2hJbnRlcnJ1cHRlZAEACBRpbmRleAQUZXJyb3IFAThCYXRjaENvbXBsZXRlZAEBBWBCYXRjaENvbXBsZXRlZFdpdGhFcnJvcnMBAQU0SXRlbUNvbXBsZXRlZAEBBShJdGVtRmFpbGVkAQAEFGVycm9yBQEwRGlzcGF0Y2hlZEFzAQAEGHJlc3VsdBkBAhwMQW55AQEFLE5vblRyYW5zZmVyAQEFKEdvdmVybmFuY2UBAQUcU3Rha2luZwEBBSxDYW5jZWxQcm94eQEBBRxBdWN0aW9uAQEFPE5vbWluYXRpb25Qb29scwEBBQIUNFByb3h5RXhlY3V0ZWQBAAQYcmVzdWx0GQEsUHVyZUNyZWF0ZWQBABAQcHVyZQAMd2hvAChwcm94eV90eXBl6QFQZGlzYW1iaWd1YXRpb25faW5kZXgEJEFubm91bmNlZAEADBByZWFsABRwcm94eQAkY2FsbF9oYXNoIChQcm94eUFkZGVkAQAQJGRlbGVnYXRvcgAkZGVsZWdhdGVlAChwcm94eV90eXBl6QEUZGVsYXkEMFByb3h5UmVtb3ZlZAEAECRkZWxlZ2F0b3IAJGRlbGVnYXRlZQAocHJveHlfdHlwZekBFGRlbGF5BAAIGGhlaWdodAQUaW5kZXgEAhAsTmV3TXVsdGlzaWcBAAwkYXBwcm92aW5nACBtdWx0aXNpZwAkY2FsbF9oYXNoIEBNdWx0aXNpZ0FwcHJvdmFsAQAQJGFwcHJvdmluZwAkdGltZXBvaW508QEgbXVsdGlzaWcAJGNhbGxfaGFzaCBATXVsdGlzaWdFeGVjdXRlZAEAFCRhcHByb3ZpbmcAJHRpbWVwb2ludPEBIG11bHRpc2lnACRjYWxsX2hhc2ggGHJlc3VsdBkBRE11bHRpc2lnQ2FuY2VsbGVkAQAQKGNhbmNlbGxpbmcAJHRpbWVwb2ludPEBIG11bHRpc2lnACRjYWxsX2hhc2ggAiw4Qm91bnR5UHJvcG9zZWQBAAQUaW5kZXgEOEJvdW50eVJlamVjdGVkAQAIFGluZGV4BBBib25kCEhCb3VudHlCZWNhbWVBY3RpdmUBAAQUaW5kZXgENEJvdW50eUF3YXJkZWQBAAgUaW5kZXgELGJlbmVmaWNpYXJ5ADRCb3VudHlDbGFpbWVkAQAMFGluZGV4BBhwYXlvdXQILGJlbmVmaWNpYXJ5ADhCb3VudHlDYW5jZWxlZAEABBRpbmRleAQ4Qm91bnR5RXh0ZW5kZWQBAAQUaW5kZXgEOEJvdW50eUFwcHJvdmVkAQAEFGluZGV4BDxDdXJhdG9yUHJvcG9zZWQBAAgkYm91bnR5X2lkBBxjdXJhdG9yAERDdXJhdG9yVW5hc3NpZ25lZAEABCRib3VudHlfaWQEPEN1cmF0b3JBY2NlcHRlZAEACCRib3VudHlfaWQEHGN1cmF0b3IAAhAUQWRkZWQBAAgUaW5kZXgELGNoaWxkX2luZGV4BBxBd2FyZGVkAQAMFGluZGV4BCxjaGlsZF9pbmRleAQsYmVuZWZpY2lhcnkAHENsYWltZWQBABAUaW5kZXgELGNoaWxkX2luZGV4BBhwYXlvdXQILGJlbmVmaWNpYXJ5ACBDYW5jZWxlZAEACBRpbmRleAQsY2hpbGRfaW5kZXgEAhQcT25DaGFpbgEBBRhTaWduZWQBAQUgVW5zaWduZWQBAQUgRmFsbGJhY2sBAQUkRW1lcmdlbmN5AQEFBgAADDRtaW5pbWFsX3N0YWtlCCRzdW1fc3Rha2UIRHN1bV9zdGFrZV9zcXVhcmVkCAMIFAQCEAxPZmYBAQUYU2lnbmVkAQEFIFVuc2lnbmVkAQMIFAQkRW1lcmdlbmN5AQEFAhg4U29sdXRpb25TdG9yZWQBAAwcY29tcHV0ZQECGG9yaWdpbgUCMHByZXZfZWplY3RlZBRERWxlY3Rpb25GaW5hbGl6ZWQBAAgcY29tcHV0ZQECFHNjb3JlCQI4RWxlY3Rpb25GYWlsZWQBAQUgUmV3YXJkZWQBAAgcYWNjb3VudAAUdmFsdWUIHFNsYXNoZWQBAAgcYWNjb3VudAAUdmFsdWUIRFBoYXNlVHJhbnNpdGlvbmVkAQAMEGZyb20RAgh0bxECFHJvdW5kBAIIIFJlYmFnZ2VkAQAMDHdobwAQZnJvbQgIdG8IMFNjb3JlVXBkYXRlZAEACAx3aG8AJG5ld19zY29yZQgCDBBPcGVuAQEFHEJsb2NrZWQBAQUoRGVzdHJveWluZwEBBQMIBAAGIQIACDBtYXhfaW5jcmVhc2UEJG1pbl9kZWxheQQCCDhQZXJtaXNzaW9ubGVzcwEBBRxBY2NvdW50AQEBBi0CAkgcQ3JlYXRlZAEACCRkZXBvc2l0b3IAHHBvb2xfaWQEGEJvbmRlZAEAEBhtZW1iZXIAHHBvb2xfaWQEGGJvbmRlZAgYam9pbmVkFBxQYWlkT3V0AQAMGG1lbWJlcgAccG9vbF9pZAQYcGF5b3V0CCBVbmJvbmRlZAEAFBhtZW1iZXIAHHBvb2xfaWQEHGJhbGFuY2UIGHBvaW50cwgMZXJhBCRXaXRoZHJhd24BABAYbWVtYmVyABxwb29sX2lkBBxiYWxhbmNlCBhwb2ludHMIJERlc3Ryb3llZAEABBxwb29sX2lkBDBTdGF0ZUNoYW5nZWQBAAgccG9vbF9pZAQkbmV3X3N0YXRlHQI0TWVtYmVyUmVtb3ZlZAEACBxwb29sX2lkBBhtZW1iZXIAMFJvbGVzVXBkYXRlZAEADBByb290BQIcYm91bmNlcgUCJG5vbWluYXRvcgUCLFBvb2xTbGFzaGVkAQAIHHBvb2xfaWQEHGJhbGFuY2UIUFVuYm9uZGluZ1Bvb2xTbGFzaGVkAQAMHHBvb2xfaWQEDGVyYQQcYmFsYW5jZQhUUG9vbENvbW1pc3Npb25VcGRhdGVkAQAIHHBvb2xfaWQEHGN1cnJlbnQlAmBQb29sTWF4Q29tbWlzc2lvblVwZGF0ZWQBAAgccG9vbF9pZAQ4bWF4X2NvbW1pc3Npb24EfFBvb2xDb21taXNzaW9uQ2hhbmdlUmF0ZVVwZGF0ZWQBAAgccG9vbF9pZAQsY2hhbmdlX3JhdGUpApBQb29sQ29tbWlzc2lvbkNsYWltUGVybWlzc2lvblVwZGF0ZWQBAAgccG9vbF9pZAQocGVybWlzc2lvbjECVFBvb2xDb21taXNzaW9uQ2xhaW1lZAEACBxwb29sX2lkBChjb21taXNzaW9uCGRNaW5CYWxhbmNlRGVmaWNpdEFkanVzdGVkAQAIHHBvb2xfaWQEGGFtb3VudAhgTWluQmFsYW5jZUV4Y2Vzc0FkanVzdGVkAQAIHHBvb2xfaWQEGGFtb3VudAgEBAACFCBVbnN0YWtlZAEACBRzdGFzaAAYcmVzdWx0GQEcU2xhc2hlZAEACBRzdGFzaAAYYW1vdW50CDBCYXRjaENoZWNrZWQBAAQQZXJhczkCNEJhdGNoRmluaXNoZWQBAAQQc2l6ZQQ0SW50ZXJuYWxFcnJvcgEBBQUBAQEAJBxwYXJhX2lkBDByZWxheV9wYXJlbnQgIGNvbGxhdG9yIHhwZXJzaXN0ZWRfdmFsaWRhdGlvbl9kYXRhX2hhc2ggIHBvdl9oYXNoIDBlcmFzdXJlX3Jvb3QgJHNpZ25hdHVyZUECJHBhcmFfaGVhZCBQdmFsaWRhdGlvbl9jb2RlX2hhc2ggAAgoZGVzY3JpcHRvckUCQGNvbW1pdG1lbnRzX2hhc2ggAhA8Q2FuZGlkYXRlQmFja2VkAQMQSQIkBAREQ2FuZGlkYXRlSW5jbHVkZWQBAxBJAiQEBERDYW5kaWRhdGVUaW1lZE91dAEDDEkCJARYVXB3YXJkTWVzc2FnZXNSZWNlaXZlZAEACBBmcm9tBBRjb3VudAQCIEhDdXJyZW50Q29kZVVwZGF0ZWQBAQJIQ3VycmVudEhlYWRVcGRhdGVkAQECUENvZGVVcGdyYWRlU2NoZWR1bGVkAQECME5ld0hlYWROb3RlZAEBAjBBY3Rpb25RdWV1ZWQBBAQBCDxQdmZDaGVja1N0YXJ0ZWQBAwggBEBQdmZDaGVja0FjY2VwdGVkAQMIIARAUHZmQ2hlY2tSZWplY3RlZAEDCCAEAAgYc2VuZGVyBCRyZWNpcGllbnQEAhxQT3BlbkNoYW5uZWxSZXF1ZXN0ZWQBABAYc2VuZGVyBCRyZWNpcGllbnQEVHByb3Bvc2VkX21heF9jYXBhY2l0eQRkcHJvcG9zZWRfbWF4X21lc3NhZ2Vfc2l6ZQRMT3BlbkNoYW5uZWxDYW5jZWxlZAEACDBieV9wYXJhY2hhaW4EKGNoYW5uZWxfaWRVAkxPcGVuQ2hhbm5lbEFjY2VwdGVkAQAIGHNlbmRlcgQkcmVjaXBpZW50BDRDaGFubmVsQ2xvc2VkAQAIMGJ5X3BhcmFjaGFpbgQoY2hhbm5lbF9pZFUCWEhybXBDaGFubmVsRm9yY2VPcGVuZWQBABAYc2VuZGVyBCRyZWNpcGllbnQEVHByb3Bvc2VkX21heF9jYXBhY2l0eQRkcHJvcG9zZWRfbWF4X21lc3NhZ2Vfc2l6ZQRcSHJtcFN5c3RlbUNoYW5uZWxPcGVuZWQBABAYc2VuZGVyBCRyZWNpcGllbnQEVHByb3Bvc2VkX21heF9jYXBhY2l0eQRkcHJvcG9zZWRfbWF4X21lc3NhZ2Vfc2l6ZQRoT3BlbkNoYW5uZWxEZXBvc2l0c1VwZGF0ZWQBAAgYc2VuZGVyBCRyZWNpcGllbnQEAggUTG9jYWwBAQUYUmVtb3RlAQEFAggUVmFsaWQBAQUcSW52YWxpZAEBBQIMQERpc3B1dGVJbml0aWF0ZWQBAwggXQJARGlzcHV0ZUNvbmNsdWRlZAEDCCBhAhhSZXZlcnQBAQICCExPbkRlbWFuZE9yZGVyUGxhY2VkAQAMHHBhcmFfaWQEKHNwb3RfcHJpY2UIKG9yZGVyZWRfYnkAMFNwb3RQcmljZVNldAEABChzcG90X3ByaWNlCAIQKFJlZ2lzdGVyZWQBAAgccGFyYV9pZAQcbWFuYWdlcgAwRGVyZWdpc3RlcmVkAQAEHHBhcmFfaWQEIFJlc2VydmVkAQAIHHBhcmFfaWQEDHdobwAcU3dhcHBlZAEACBxwYXJhX2lkBCBvdGhlcl9pZAQCCDhOZXdMZWFzZVBlcmlvZAEABDBsZWFzZV9wZXJpb2QEGExlYXNlZAEAGBxwYXJhX2lkBBhsZWFzZXIAMHBlcmlvZF9iZWdpbgQwcGVyaW9kX2NvdW50BDhleHRyYV9yZXNlcnZlZAgwdG90YWxfYW1vdW50CAIcOEF1Y3Rpb25TdGFydGVkAQAMNGF1Y3Rpb25faW5kZXgEMGxlYXNlX3BlcmlvZAQYZW5kaW5nBDRBdWN0aW9uQ2xvc2VkAQAENGF1Y3Rpb25faW5kZXgEIFJlc2VydmVkAQAMGGJpZGRlcgA4ZXh0cmFfcmVzZXJ2ZWQIMHRvdGFsX2Ftb3VudAgoVW5yZXNlcnZlZAEACBhiaWRkZXIAGGFtb3VudAhIUmVzZXJ2ZUNvbmZpc2NhdGVkAQAMHHBhcmFfaWQEGGxlYXNlcgAYYW1vdW50CCxCaWRBY2NlcHRlZAEAFBhiaWRkZXIAHHBhcmFfaWQEGGFtb3VudAgoZmlyc3Rfc2xvdAQkbGFzdF9zbG90BDRXaW5uaW5nT2Zmc2V0AQAINGF1Y3Rpb25faW5kZXgEMGJsb2NrX251bWJlcgQCKBxDcmVhdGVkAQAEHHBhcmFfaWQELENvbnRyaWJ1dGVkAQAMDHdobwAoZnVuZF9pbmRleAQYYW1vdW50CCBXaXRoZHJldwEADAx3aG8AKGZ1bmRfaW5kZXgEGGFtb3VudAhEUGFydGlhbGx5UmVmdW5kZWQBAAQccGFyYV9pZAQsQWxsUmVmdW5kZWQBAAQccGFyYV9pZAQkRGlzc29sdmVkAQAEHHBhcmFfaWQEPEhhbmRsZUJpZFJlc3VsdAEACBxwYXJhX2lkBBhyZXN1bHQZARhFZGl0ZWQBAAQccGFyYV9pZAQsTWVtb1VwZGF0ZWQBAAwMd2hvABxwYXJhX2lkBBBtZW1vJDxBZGRlZFRvTmV3UmFpc2UBAAQccGFyYV9pZAQCCFBSZXZlbnVlSW5mb1JlcXVlc3RlZAEABBB3aGVuBDBDb3JlQXNzaWduZWQBAAQQY29yZQQCCBhTaWduZWQBAQUQQXV0bwEBBQIQIE1pZ3JhdGVkAQAMDHRvcAQUY2hpbGQEHGNvbXB1dGWBAhxTbGFzaGVkAQAIDHdobwAYYW1vdW50CFRBdXRvTWlncmF0aW9uRmluaXNoZWQBAQUYSGFsdGVkAQAEFGVycm9y5AKgIE92ZXJmbG93AQEFNFVuaW1wbGVtZW50ZWQBAQVgVW50cnVzdGVkUmVzZXJ2ZUxvY2F0aW9uAQEFZFVudHJ1c3RlZFRlbGVwb3J0TG9jYXRpb24BAQUwTG9jYXRpb25GdWxsAQEFVExvY2F0aW9uTm90SW52ZXJ0aWJsZQEBBSRCYWRPcmlnaW4BAQU8SW52YWxpZExvY2F0aW9uAQEFNEFzc2V0Tm90Rm91bmQBAQVURmFpbGVkVG9UcmFuc2FjdEFzc2V0AQEFPE5vdFdpdGhkcmF3YWJsZQEBBUhMb2NhdGlvbkNhbm5vdEhvbGQBAQVURXhjZWVkc01heE1lc3NhZ2VTaXplAQEFWERlc3RpbmF0aW9uVW5zdXBwb3J0ZWQBAQUkVHJhbnNwb3J0AQEFKFVucm91dGFibGUBAQUwVW5rbm93bkNsYWltAQEFOEZhaWxlZFRvRGVjb2RlAQEFQE1heFdlaWdodEludmFsaWQBAQU4Tm90SG9sZGluZ0ZlZXMBAQUwVG9vRXhwZW5zaXZlAQEFEFRyYXABAQNARXhwZWN0YXRpb25GYWxzZQEBBThQYWxsZXROb3RGb3VuZAEBBTBOYW1lTWlzbWF0Y2gBAQVMVmVyc2lvbkluY29tcGF0aWJsZQEBBVBIb2xkaW5nV291bGRPdmVyZmxvdwEBBSxFeHBvcnRFcnJvcgEBBThSZWFuY2hvckZhaWxlZAEBBRhOb0RlYWwBAQUoRmVlc05vdE1ldAEBBSRMb2NrRXJyb3IBAQUwTm9QZXJtaXNzaW9uAQEFKFVuYW5jaG9yZWQBAQU4Tm90RGVwb3NpdGFibGUBAQVMVW5oYW5kbGVkWGNtVmVyc2lvbgEBBUhXZWlnaHRMaW1pdFJlYWNoZWQBAAggcmVmX3RpbWUIKHByb29mX3NpemUIHEJhcnJpZXIBAQVMV2VpZ2h0Tm90Q29tcHV0YWJsZQEBBURFeGNlZWRzU3RhY2tMaW1pdAEBBQIMIENvbXBsZXRlAQAEEHVzZWQYKEluY29tcGxldGUBAAgQdXNlZBgUZXJyb3KJAhRFcnJvcgEABBRlcnJvcokCBQEgAhgkVW5kZWZpbmVkAQEFFEluZGV4AQEDGEFycmF5NAEFARAYQXJyYXk4AQUBIBxBcnJheTE2AQUBQBxBcnJheTMyAQUBgAIIIEZ1bmdpYmxlAQEDLE5vbkZ1bmdpYmxlAQIYJFVuZGVmaW5lZAEBBRRJbmRleAEBAxhBcnJheTQBBQEQGEFycmF5OAEFASAcQXJyYXkxNgEFAUAcQXJyYXkzMgEFAYAACAhpZHkBDGZ1bpkCBJ0CAAMIBIkCBqUCABgUaW5kZXgEEG5hbWUkLG1vZHVsZV9uYW1lJBRtYWpvcgQUbWlub3IEFHBhdGNoBAStAgACDBxTdWNjZXNzAQEFFEVycm9yAQUAOFRydW5jYXRlZEVycm9yAQUAAhgQTnVsbAEBBRhBc3NldHMBBJ0CADxFeGVjdXRpb25SZXN1bHQBBqUCHFZlcnNpb24BAQIsUGFsbGV0c0luZm8BBK0CADhEaXNwYXRjaFJlc3VsdAECDBxTdWNjZXNzAQEFFEVycm9yAQUAOFRydW5jYXRlZEVycm9yAQUABnkBAhAYTmF0aXZlAQEFQFNvdmVyZWlnbkFjY291bnQBAQUkU3VwZXJ1c2VyAQEFDFhjbQEBBQRxAQEIBHEBAQwEcQEBEARxAQEUBHEBARgEcQEBHARxAQEgAAwsZGVzdGluYXRpb255ASBxdWVyeV9pZAgobWF4X3dlaWdodBgCCCBGdW5naWJsZQEBBSxOb25GdW5naWJsZQEBBQIQDEFsbAEBBRRBbGxPZgEACAhpZHkBDGZ1buUCKEFsbENvdW50ZWQBAQIwQWxsT2ZDb3VudGVkAQAMCGlkeQEMZnVu5QIUY291bnQEAgggRGVmaW5pdGUBBJ0CABBXaWxkAQIQDEFsbAEBBRRBbGxPZgEACAhpZHkBDGZ1buUCKEFsbENvdW50ZWQBAQIwQWxsT2ZDb3VudGVkAQAMCGlkeQEMZnVu5QIUY291bnQEAggkVW5saW1pdGVkAQEFHExpbWl0ZWQBAAggcmVmX3RpbWUIKHByb29mX3NpemUIAsA0V2l0aGRyYXdBc3NldAEEnQIAVFJlc2VydmVBc3NldERlcG9zaXRlZAEEnQIAWFJlY2VpdmVUZWxlcG9ydGVkQXNzZXQBBJ0CADRRdWVyeVJlc3BvbnNlAQAQIHF1ZXJ5X2lkCCByZXNwb25zZbkCKG1heF93ZWlnaHQYHHF1ZXJpZXK9AjRUcmFuc2ZlckFzc2V0AQAIGGFzc2V0c6ECLGJlbmVmaWNpYXJ5eQFQVHJhbnNmZXJSZXNlcnZlQXNzZXQBAAwYYXNzZXRzoQIQZGVzdHkBDHhjbfkCIFRyYW5zYWN0AQAMLG9yaWdpbl9raW5kwQJYcmVxdWlyZV93ZWlnaHRfYXRfbW9zdBgQY2FsbCRkSHJtcE5ld0NoYW5uZWxPcGVuUmVxdWVzdAEADBhzZW5kZXIEQG1heF9tZXNzYWdlX3NpemUEMG1heF9jYXBhY2l0eQRMSHJtcENoYW5uZWxBY2NlcHRlZAEABCRyZWNpcGllbnQESEhybXBDaGFubmVsQ2xvc2luZwEADCRpbml0aWF0b3IEGHNlbmRlcgQkcmVjaXBpZW50BCxDbGVhck9yaWdpbgEBBTREZXNjZW5kT3JpZ2luAQIkEEhlcmUBAQUIWDEBAigkUGFyYWNoYWluAQECLEFjY291bnRJZDMyAQAIHG5ldHdvcmthAQhpZCA4QWNjb3VudEluZGV4NjQBAAgcbmV0d29ya2EBFGluZGV4CDBBY2NvdW50S2V5MjABAAgcbmV0d29ya2EBDGtleWUBOFBhbGxldEluc3RhbmNlAQECMEdlbmVyYWxJbmRleAEBAyhHZW5lcmFsS2V5AQAIGGxlbmd0aAQQZGF0YSAkT25seUNoaWxkAQEFJFBsdXJhbGl0eQEACAhpZGkBEHBhcnRtATxHbG9iYWxDb25zZW5zdXMBAiwkQnlHZW5lc2lzAQUBgBhCeUZvcmsBAAgwYmxvY2tfbnVtYmVyCChibG9ja19oYXNoICBQb2xrYWRvdAEBBRhLdXNhbWEBAQUcV2VzdGVuZAEBBRhSb2NvY28BAQUYV29jb2NvAQEFIEV0aGVyZXVtAQAEIGNoYWluX2lkCCxCaXRjb2luQ29yZQEBBSxCaXRjb2luQ2FzaAEBBUBQb2xrYWRvdEJ1bGxldGluAQEFCFgyAQRxAQEICFgzAQRxAQEMCFg0AQRxAQEQCFg1AQRxAQEUCFg2AQRxAQEYCFg3AQRxAQEcCFg4AQRxAQEgLFJlcG9ydEVycm9yAQAMLGRlc3RpbmF0aW9ueQEgcXVlcnlfaWQIKG1heF93ZWlnaHQYMERlcG9zaXRBc3NldAEACBhhc3NldHPtAixiZW5lZmljaWFyeXkBTERlcG9zaXRSZXNlcnZlQXNzZXQBAAwYYXNzZXRz7QIQZGVzdHkBDHhjbfkCNEV4Y2hhbmdlQXNzZXQBAAwQZ2l2Ze0CEHdhbnShAhxtYXhpbWFsFFxJbml0aWF0ZVJlc2VydmVXaXRoZHJhdwEADBhhc3NldHPtAhxyZXNlcnZleQEMeGNt+QJASW5pdGlhdGVUZWxlcG9ydAEADBhhc3NldHPtAhBkZXN0eQEMeGNt+QI0UmVwb3J0SG9sZGluZwEACDRyZXNwb25zZV9pbmZv4QIYYXNzZXRz7QIwQnV5RXhlY3V0aW9uAQAIEGZlZXOdAjB3ZWlnaHRfbGltaXTxAjRSZWZ1bmRTdXJwbHVzAQEFPFNldEVycm9ySGFuZGxlcgEE9QIALFNldEFwcGVuZGl4AQT1AgAoQ2xlYXJFcnJvcgEBBShDbGFpbUFzc2V0AQAIGGFzc2V0c6ECGHRpY2tldHkBEFRyYXABAQNAU3Vic2NyaWJlVmVyc2lvbgEACCBxdWVyeV9pZAhMbWF4X3Jlc3BvbnNlX3dlaWdodBhIVW5zdWJzY3JpYmVWZXJzaW9uAQEFJEJ1cm5Bc3NldAEEnQIALEV4cGVjdEFzc2V0AQSdAgAwRXhwZWN0T3JpZ2luAQZ5ASxFeHBlY3RFcnJvcgEGpQJQRXhwZWN0VHJhbnNhY3RTdGF0dXMBAgwcU3VjY2VzcwEBBRRFcnJvcgEFADhUcnVuY2F0ZWRFcnJvcgEFACxRdWVyeVBhbGxldAEACCxtb2R1bGVfbmFtZSQ0cmVzcG9uc2VfaW5mb+ECMEV4cGVjdFBhbGxldAEAFBRpbmRleAQQbmFtZSQsbW9kdWxlX25hbWUkLGNyYXRlX21ham9yBDxtaW5fY3JhdGVfbWlub3IEUFJlcG9ydFRyYW5zYWN0U3RhdHVzAQAMLGRlc3RpbmF0aW9ueQEgcXVlcnlfaWQIKG1heF93ZWlnaHQYTENsZWFyVHJhbnNhY3RTdGF0dXMBAQU8VW5pdmVyc2FsT3JpZ2luAQIoJFBhcmFjaGFpbgEBAixBY2NvdW50SWQzMgEACBxuZXR3b3JrYQEIaWQgOEFjY291bnRJbmRleDY0AQAIHG5ldHdvcmthARRpbmRleAgwQWNjb3VudEtleTIwAQAIHG5ldHdvcmthAQxrZXllAThQYWxsZXRJbnN0YW5jZQEBAjBHZW5lcmFsSW5kZXgBAQMoR2VuZXJhbEtleQEACBhsZW5ndGgEEGRhdGEgJE9ubHlDaGlsZAEBBSRQbHVyYWxpdHkBAAgIaWRpARBwYXJ0bQE8R2xvYmFsQ29uc2Vuc3VzAQIsJEJ5R2VuZXNpcwEFAYAYQnlGb3JrAQAIMGJsb2NrX251bWJlcggoYmxvY2tfaGFzaCAgUG9sa2Fkb3QBAQUYS3VzYW1hAQEFHFdlc3RlbmQBAQUYUm9jb2NvAQEFGFdvY29jbwEBBSBFdGhlcmV1bQEABCBjaGFpbl9pZAgsQml0Y29pbkNvcmUBAQUsQml0Y29pbkNhc2gBAQVAUG9sa2Fkb3RCdWxsZXRpbgEBBTRFeHBvcnRNZXNzYWdlAQAMHG5ldHdvcmtdASxkZXN0aW5hdGlvbnUBDHhjbfkCJExvY2tBc3NldAEACBRhc3NldJ0CIHVubG9ja2VyeQEsVW5sb2NrQXNzZXQBAAgUYXNzZXSdAhh0YXJnZXR5AThOb3RlVW5sb2NrYWJsZQEACBRhc3NldJ0CFG93bmVyeQE0UmVxdWVzdFVubG9jawEACBRhc3NldJ0CGGxvY2tlcnkBLFNldEZlZXNNb2RlAQAEMGppdF93aXRoZHJhdxQgU2V0VG9waWMBBQGAKENsZWFyVG9waWMBAQUsQWxpYXNPcmlnaW4BAAgccGFyZW50cwQgaW50ZXJpb3J1ATxVbnBhaWRFeGVjdXRpb24BAAgwd2VpZ2h0X2xpbWl08QIwY2hlY2tfb3JpZ2luvQIE9QIAAgggQ29uY3JldGUBAAgccGFyZW50cwQgaW50ZXJpb3KRASBBYnN0cmFjdAEFAAIcJFVuZGVmaW5lZAEBBRRJbmRleAEBAxhBcnJheTQBBQEQGEFycmF5OAEFASAcQXJyYXkxNgEFAUAcQXJyYXkzMgEFAYAQQmxvYgEFAAIIIEZ1bmdpYmxlAQEDLE5vbkZ1bmdpYmxlAQIcJFVuZGVmaW5lZAEBBRRJbmRleAEBAxhBcnJheTQBBQEQGEFycmF5OAEFASAcQXJyYXkxNgEFAUAcQXJyYXkzMgEFAYAQQmxvYgEFAAAICGlk/QIMZnVuBQMECQMAAAgIaWR9AQxmdW6ZAgQRAwACDAhWMgEECQMACFYzAQQRAwAIVjQBBJ0CAAJgJEF0dGVtcHRlZAEABBxvdXRjb21ljQIQU2VudAEAEBhvcmlnaW55ASxkZXN0aW5hdGlvbnkBHG1lc3NhZ2X5AihtZXNzYWdlX2lkIEhVbmV4cGVjdGVkUmVzcG9uc2UBAAgYb3JpZ2lueQEgcXVlcnlfaWQINFJlc3BvbnNlUmVhZHkBAAggcXVlcnlfaWQIIHJlc3BvbnNluQIgTm90aWZpZWQBAAwgcXVlcnlfaWQIMHBhbGxldF9pbmRleAQoY2FsbF9pbmRleARATm90aWZ5T3ZlcndlaWdodAEAFCBxdWVyeV9pZAgwcGFsbGV0X2luZGV4BChjYWxsX2luZGV4BDRhY3R1YWxfd2VpZ2h0GExtYXhfYnVkZ2V0ZWRfd2VpZ2h0GExOb3RpZnlEaXNwYXRjaEVycm9yAQAMIHF1ZXJ5X2lkCDBwYWxsZXRfaW5kZXgEKGNhbGxfaW5kZXgESE5vdGlmeURlY29kZUZhaWxlZAEADCBxdWVyeV9pZAgwcGFsbGV0X2luZGV4BChjYWxsX2luZGV4BEBJbnZhbGlkUmVzcG9uZGVyAQAMGG9yaWdpbnkBIHF1ZXJ5X2lkCERleHBlY3RlZF9sb2NhdGlvbr0CXEludmFsaWRSZXNwb25kZXJWZXJzaW9uAQAIGG9yaWdpbnkBIHF1ZXJ5X2lkCDRSZXNwb25zZVRha2VuAQAEIHF1ZXJ5X2lkCDRBc3NldHNUcmFwcGVkAQAMEGhhc2ggGG9yaWdpbnkBGGFzc2V0cxkDVFZlcnNpb25DaGFuZ2VOb3RpZmllZAEAECxkZXN0aW5hdGlvbnkBGHJlc3VsdAQQY29zdKECKG1lc3NhZ2VfaWQgXFN1cHBvcnRlZFZlcnNpb25DaGFuZ2VkAQAIIGxvY2F0aW9ueQEcdmVyc2lvbgRQTm90aWZ5VGFyZ2V0U2VuZEZhaWwBAAwgbG9jYXRpb255ASBxdWVyeV9pZAgUZXJyb3KJAmROb3RpZnlUYXJnZXRNaWdyYXRpb25GYWlsAQAIIGxvY2F0aW9umQEgcXVlcnlfaWQIVEludmFsaWRRdWVyaWVyVmVyc2lvbgEACBhvcmlnaW55ASBxdWVyeV9pZAg4SW52YWxpZFF1ZXJpZXIBABAYb3JpZ2lueQEgcXVlcnlfaWQIQGV4cGVjdGVkX3F1ZXJpZXJ5AVBtYXliZV9hY3R1YWxfcXVlcmllcr0CUFZlcnNpb25Ob3RpZnlTdGFydGVkAQAMLGRlc3RpbmF0aW9ueQEQY29zdKECKG1lc3NhZ2VfaWQgWFZlcnNpb25Ob3RpZnlSZXF1ZXN0ZWQBAAwsZGVzdGluYXRpb255ARBjb3N0oQIobWVzc2FnZV9pZCBgVmVyc2lvbk5vdGlmeVVucmVxdWVzdGVkAQAMLGRlc3RpbmF0aW9ueQEQY29zdKECKG1lc3NhZ2VfaWQgIEZlZXNQYWlkAQAIGHBheWluZ3kBEGZlZXOhAjRBc3NldHNDbGFpbWVkAQAMEGhhc2ggGG9yaWdpbnkBGGFzc2V0cxkDYFZlcnNpb25NaWdyYXRpb25GaW5pc2hlZAEABBx2ZXJzaW9uBAIEEFBhcmEBAQICBAxVbXABAgQQUGFyYQEBAgIYJEJhZEZvcm1hdAEBBRxDb3JydXB0AQEFLFVuc3VwcG9ydGVkAQEFKE92ZXJ3ZWlnaHQBAAggcmVmX3RpbWUIKHByb29mX3NpemUIFFlpZWxkAQEFRFN0YWNrTGltaXRSZWFjaGVkAQEFAhBAUHJvY2Vzc2luZ0ZhaWxlZAEADAhpZCAYb3JpZ2luJQMUZXJyb3IpAyRQcm9jZXNzZWQBABAIaWQgGG9yaWdpbiUDLHdlaWdodF91c2VkGBxzdWNjZXNzFEhPdmVyd2VpZ2h0RW5xdWV1ZWQBABAIaWQgGG9yaWdpbiUDKHBhZ2VfaW5kZXgENG1lc3NhZ2VfaW5kZXgEKFBhZ2VSZWFwZWQBAAgYb3JpZ2luJQMUaW5kZXgEAgxAQXNzZXRSYXRlQ3JlYXRlZAEACChhc3NldF9raW5kgQEQcmF0ZQhAQXNzZXRSYXRlUmVtb3ZlZAEABChhc3NldF9raW5kgQFAQXNzZXRSYXRlVXBkYXRlZAEADChhc3NldF9raW5kgQEMb2xkCAxuZXcIAqAYU3lzdGVtAQIcQEV4dHJpbnNpY1N1Y2Nlc3MBAAQ0ZGlzcGF0Y2hfaW5mb0A8RXh0cmluc2ljRmFpbGVkAQAIOGRpc3BhdGNoX2Vycm9yBQE0ZGlzcGF0Y2hfaW5mb0AsQ29kZVVwZGF0ZWQBAQUoTmV3QWNjb3VudAEABBxhY2NvdW50ADRLaWxsZWRBY2NvdW50AQAEHGFjY291bnQAIFJlbWFya2VkAQAIGHNlbmRlcgAQaGFzaCBEVXBncmFkZUF1dGhvcml6ZWQBAAgkY29kZV9oYXNoIDRjaGVja192ZXJzaW9uFCRTY2hlZHVsZXIBAiQkU2NoZWR1bGVkAQAIEHdoZW4EFGluZGV4BCBDYW5jZWxlZAEACBB3aGVuBBRpbmRleAQoRGlzcGF0Y2hlZAEADBB0YXNrDQEIaWQRARhyZXN1bHQZASBSZXRyeVNldAEAEBB0YXNrDQEIaWQRARhwZXJpb2QEHHJldHJpZXMEOFJldHJ5Q2FuY2VsbGVkAQAIEHRhc2sNAQhpZBEBPENhbGxVbmF2YWlsYWJsZQEACBB0YXNrDQEIaWQRAThQZXJpb2RpY0ZhaWxlZAEACBB0YXNrDQEIaWQRASxSZXRyeUZhaWxlZAEACBB0YXNrDQEIaWQRAVRQZXJtYW5lbnRseU92ZXJ3ZWlnaHQBAAgQdGFzaw0BCGlkEQEgUHJlaW1hZ2UBAgwUTm90ZWQBAAQQaGFzaCAkUmVxdWVzdGVkAQAEEGhhc2ggHENsZWFyZWQBAAQQaGFzaCAcSW5kaWNlcwECDDRJbmRleEFzc2lnbmVkAQAIDHdobwAUaW5kZXgEKEluZGV4RnJlZWQBAAQUaW5kZXgELEluZGV4RnJvemVuAQAIFGluZGV4BAx3aG8AIEJhbGFuY2VzAQJYHEVuZG93ZWQBAAgcYWNjb3VudAAwZnJlZV9iYWxhbmNlCCBEdXN0TG9zdAEACBxhY2NvdW50ABhhbW91bnQIIFRyYW5zZmVyAQAMEGZyb20ACHRvABhhbW91bnQIKEJhbGFuY2VTZXQBAAgMd2hvABBmcmVlCCBSZXNlcnZlZAEACAx3aG8AGGFtb3VudAgoVW5yZXNlcnZlZAEACAx3aG8AGGFtb3VudAhIUmVzZXJ2ZVJlcGF0cmlhdGVkAQAQEGZyb20ACHRvABhhbW91bnQISGRlc3RpbmF0aW9uX3N0YXR1cykBHERlcG9zaXQBAAgMd2hvABhhbW91bnQIIFdpdGhkcmF3AQAIDHdobwAYYW1vdW50CBxTbGFzaGVkAQAIDHdobwAYYW1vdW50CBhNaW50ZWQBAAgMd2hvABhhbW91bnQIGEJ1cm5lZAEACAx3aG8AGGFtb3VudAgkU3VzcGVuZGVkAQAIDHdobwAYYW1vdW50CCBSZXN0b3JlZAEACAx3aG8AGGFtb3VudAggVXBncmFkZWQBAAQMd2hvABhJc3N1ZWQBAAQYYW1vdW50CCRSZXNjaW5kZWQBAAQYYW1vdW50CBhMb2NrZWQBAAgMd2hvABhhbW91bnQIIFVubG9ja2VkAQAIDHdobwAYYW1vdW50CBhGcm96ZW4BAAgMd2hvABhhbW91bnQIGFRoYXdlZAEACAx3aG8AGGFtb3VudAhMVG90YWxJc3N1YW5jZUZvcmNlZAEACAxvbGQIDG5ldwhIVHJhbnNhY3Rpb25QYXltZW50AQIESFRyYW5zYWN0aW9uRmVlUGFpZAEADAx3aG8AKGFjdHVhbF9mZWUIDHRpcAgcU3Rha2luZwECSBxFcmFQYWlkAQAMJGVyYV9pbmRleARAdmFsaWRhdG9yX3BheW91dAgkcmVtYWluZGVyCCBSZXdhcmRlZAEADBRzdGFzaAAQZGVzdDUBGGFtb3VudAgcU2xhc2hlZAEACBhzdGFrZXIAGGFtb3VudAg0U2xhc2hSZXBvcnRlZAEADCR2YWxpZGF0b3IAIGZyYWN0aW9uBCRzbGFzaF9lcmEEaE9sZFNsYXNoaW5nUmVwb3J0RGlzY2FyZGVkAQAENHNlc3Npb25faW5kZXgEOFN0YWtlcnNFbGVjdGVkAQEFGEJvbmRlZAEACBRzdGFzaAAYYW1vdW50CCBVbmJvbmRlZAEACBRzdGFzaAAYYW1vdW50CCRXaXRoZHJhd24BAAgUc3Rhc2gAGGFtb3VudAgYS2lja2VkAQAIJG5vbWluYXRvcgAUc3Rhc2gAVFN0YWtpbmdFbGVjdGlvbkZhaWxlZAEBBRxDaGlsbGVkAQAEFHN0YXNoADRQYXlvdXRTdGFydGVkAQAIJGVyYV9pbmRleAQ8dmFsaWRhdG9yX3N0YXNoAERWYWxpZGF0b3JQcmVmc1NldAEACBRzdGFzaAAUcHJlZnM5AWhTbmFwc2hvdFZvdGVyc1NpemVFeGNlZWRlZAEABBBzaXplBGxTbmFwc2hvdFRhcmdldHNTaXplRXhjZWVkZWQBAAQQc2l6ZQQgRm9yY2VFcmEBAAQQbW9kZT0BZENvbnRyb2xsZXJCYXRjaERlcHJlY2F0ZWQBAAQgZmFpbHVyZXMEIE9mZmVuY2VzAQIEHE9mZmVuY2UBAAgQa2luZEUBIHRpbWVzbG90JBxTZXNzaW9uAQIEKE5ld1Nlc3Npb24BAAQ0c2Vzc2lvbl9pbmRleAQcR3JhbmRwYQECDDhOZXdBdXRob3JpdGllcwEABDRhdXRob3JpdHlfc2V0VQEYUGF1c2VkAQEFHFJlc3VtZWQBAQUgVHJlYXN1cnkBAjAgU3BlbmRpbmcBAARAYnVkZ2V0X3JlbWFpbmluZwgcQXdhcmRlZAEADDhwcm9wb3NhbF9pbmRleAQUYXdhcmQIHGFjY291bnQAFEJ1cm50AQAELGJ1cm50X2Z1bmRzCCBSb2xsb3ZlcgEABEByb2xsb3Zlcl9iYWxhbmNlCBxEZXBvc2l0AQAEFHZhbHVlCDRTcGVuZEFwcHJvdmVkAQAMOHByb3Bvc2FsX2luZGV4BBhhbW91bnQILGJlbmVmaWNpYXJ5ADxVcGRhdGVkSW5hY3RpdmUBAAgscmVhY3RpdmF0ZWQILGRlYWN0aXZhdGVkCEhBc3NldFNwZW5kQXBwcm92ZWQBABgUaW5kZXgEKGFzc2V0X2tpbmSBARhhbW91bnQILGJlbmVmaWNpYXJ5mQEodmFsaWRfZnJvbQQkZXhwaXJlX2F0BEBBc3NldFNwZW5kVm9pZGVkAQAEFGluZGV4BBBQYWlkAQAIFGluZGV4BChwYXltZW50X2lkCDRQYXltZW50RmFpbGVkAQAIFGluZGV4BChwYXltZW50X2lkCDhTcGVuZFByb2Nlc3NlZAEABBRpbmRleARAQ29udmljdGlvblZvdGluZwECCCREZWxlZ2F0ZWQBBAABCCxVbmRlbGVnYXRlZAEBASRSZWZlcmVuZGEBAkAkU3VibWl0dGVkAQAMFGluZGV4BBR0cmFjawQgcHJvcG9zYWylAVREZWNpc2lvbkRlcG9zaXRQbGFjZWQBAAwUaW5kZXgEDHdobwAYYW1vdW50CFxEZWNpc2lvbkRlcG9zaXRSZWZ1bmRlZAEADBRpbmRleAQMd2hvABhhbW91bnQIOERlcG9zaXRTbGFzaGVkAQAIDHdobwAYYW1vdW50CDxEZWNpc2lvblN0YXJ0ZWQBABAUaW5kZXgEFHRyYWNrBCBwcm9wb3NhbKUBFHRhbGx5qQE4Q29uZmlybVN0YXJ0ZWQBAAQUaW5kZXgEOENvbmZpcm1BYm9ydGVkAQAEFGluZGV4BCRDb25maXJtZWQBAAgUaW5kZXgEFHRhbGx5qQEgQXBwcm92ZWQBAAQUaW5kZXgEIFJlamVjdGVkAQAIFGluZGV4BBR0YWxseakBIFRpbWVkT3V0AQAIFGluZGV4BBR0YWxseakBJENhbmNlbGxlZAEACBRpbmRleAQUdGFsbHmpARhLaWxsZWQBAAgUaW5kZXgEFHRhbGx5qQFkU3VibWlzc2lvbkRlcG9zaXRSZWZ1bmRlZAEADBRpbmRleAQMd2hvABhhbW91bnQILE1ldGFkYXRhU2V0AQAIFGluZGV4BBBoYXNoIDxNZXRhZGF0YUNsZWFyZWQBAAgUaW5kZXgEEGhhc2ggJFdoaXRlbGlzdAECDDxDYWxsV2hpdGVsaXN0ZWQBAAQkY2FsbF9oYXNoIFhXaGl0ZWxpc3RlZENhbGxSZW1vdmVkAQAEJGNhbGxfaGFzaCBkV2hpdGVsaXN0ZWRDYWxsRGlzcGF0Y2hlZAEACCRjYWxsX2hhc2ggGHJlc3VsdL0BKFBhcmFtZXRlcnMBAgQcVXBkYXRlZAEADAxrZXnJASRvbGRfdmFsdWXVASRuZXdfdmFsdWXVARhDbGFpbXMBAgQcQ2xhaW1lZAEADAx3aG8AQGV0aGVyZXVtX2FkZHJlc3NlARhhbW91bnQIHFZlc3RpbmcBAgg4VmVzdGluZ1VwZGF0ZWQBAAgcYWNjb3VudAAgdW52ZXN0ZWQIQFZlc3RpbmdDb21wbGV0ZWQBAAQcYWNjb3VudAAcVXRpbGl0eQECGEBCYXRjaEludGVycnVwdGVkAQAIFGluZGV4BBRlcnJvcgUBOEJhdGNoQ29tcGxldGVkAQEFYEJhdGNoQ29tcGxldGVkV2l0aEVycm9ycwEBBTRJdGVtQ29tcGxldGVkAQEFKEl0ZW1GYWlsZWQBAAQUZXJyb3IFATBEaXNwYXRjaGVkQXMBAAQYcmVzdWx0GQEUUHJveHkBAhQ0UHJveHlFeGVjdXRlZAEABBhyZXN1bHQZASxQdXJlQ3JlYXRlZAEAEBBwdXJlAAx3aG8AKHByb3h5X3R5cGXpAVBkaXNhbWJpZ3VhdGlvbl9pbmRleAQkQW5ub3VuY2VkAQAMEHJlYWwAFHByb3h5ACRjYWxsX2hhc2ggKFByb3h5QWRkZWQBABAkZGVsZWdhdG9yACRkZWxlZ2F0ZWUAKHByb3h5X3R5cGXpARRkZWxheQQwUHJveHlSZW1vdmVkAQAQJGRlbGVnYXRvcgAkZGVsZWdhdGVlAChwcm94eV90eXBl6QEUZGVsYXkEIE11bHRpc2lnAQIQLE5ld011bHRpc2lnAQAMJGFwcHJvdmluZwAgbXVsdGlzaWcAJGNhbGxfaGFzaCBATXVsdGlzaWdBcHByb3ZhbAEAECRhcHByb3ZpbmcAJHRpbWVwb2ludPEBIG11bHRpc2lnACRjYWxsX2hhc2ggQE11bHRpc2lnRXhlY3V0ZWQBABQkYXBwcm92aW5nACR0aW1lcG9pbnTxASBtdWx0aXNpZwAkY2FsbF9oYXNoIBhyZXN1bHQZAURNdWx0aXNpZ0NhbmNlbGxlZAEAEChjYW5jZWxsaW5nACR0aW1lcG9pbnTxASBtdWx0aXNpZwAkY2FsbF9oYXNoICBCb3VudGllcwECLDhCb3VudHlQcm9wb3NlZAEABBRpbmRleAQ4Qm91bnR5UmVqZWN0ZWQBAAgUaW5kZXgEEGJvbmQISEJvdW50eUJlY2FtZUFjdGl2ZQEABBRpbmRleAQ0Qm91bnR5QXdhcmRlZAEACBRpbmRleAQsYmVuZWZpY2lhcnkANEJvdW50eUNsYWltZWQBAAwUaW5kZXgEGHBheW91dAgsYmVuZWZpY2lhcnkAOEJvdW50eUNhbmNlbGVkAQAEFGluZGV4BDhCb3VudHlFeHRlbmRlZAEABBRpbmRleAQ4Qm91bnR5QXBwcm92ZWQBAAQUaW5kZXgEPEN1cmF0b3JQcm9wb3NlZAEACCRib3VudHlfaWQEHGN1cmF0b3IAREN1cmF0b3JVbmFzc2lnbmVkAQAEJGJvdW50eV9pZAQ8Q3VyYXRvckFjY2VwdGVkAQAIJGJvdW50eV9pZAQcY3VyYXRvcgA0Q2hpbGRCb3VudGllcwECEBRBZGRlZAEACBRpbmRleAQsY2hpbGRfaW5kZXgEHEF3YXJkZWQBAAwUaW5kZXgELGNoaWxkX2luZGV4BCxiZW5lZmljaWFyeQAcQ2xhaW1lZAEAEBRpbmRleAQsY2hpbGRfaW5kZXgEGHBheW91dAgsYmVuZWZpY2lhcnkAIENhbmNlbGVkAQAIFGluZGV4BCxjaGlsZF9pbmRleARoRWxlY3Rpb25Qcm92aWRlck11bHRpUGhhc2UBAhg4U29sdXRpb25TdG9yZWQBAAwcY29tcHV0ZQECGG9yaWdpbgUCMHByZXZfZWplY3RlZBRERWxlY3Rpb25GaW5hbGl6ZWQBAAgcY29tcHV0ZQECFHNjb3JlCQI4RWxlY3Rpb25GYWlsZWQBAQUgUmV3YXJkZWQBAAgcYWNjb3VudAAUdmFsdWUIHFNsYXNoZWQBAAgcYWNjb3VudAAUdmFsdWUIRFBoYXNlVHJhbnNpdGlvbmVkAQAMEGZyb20RAgh0bxECFHJvdW5kBCRWb3Rlckxpc3QBAgggUmViYWdnZWQBAAwMd2hvABBmcm9tCAh0bwgwU2NvcmVVcGRhdGVkAQAIDHdobwAkbmV3X3Njb3JlCDxOb21pbmF0aW9uUG9vbHMBAkgcQ3JlYXRlZAEACCRkZXBvc2l0b3IAHHBvb2xfaWQEGEJvbmRlZAEAEBhtZW1iZXIAHHBvb2xfaWQEGGJvbmRlZAgYam9pbmVkFBxQYWlkT3V0AQAMGG1lbWJlcgAccG9vbF9pZAQYcGF5b3V0CCBVbmJvbmRlZAEAFBhtZW1iZXIAHHBvb2xfaWQEHGJhbGFuY2UIGHBvaW50cwgMZXJhBCRXaXRoZHJhd24BABAYbWVtYmVyABxwb29sX2lkBBxiYWxhbmNlCBhwb2ludHMIJERlc3Ryb3llZAEABBxwb29sX2lkBDBTdGF0ZUNoYW5nZWQBAAgccG9vbF9pZAQkbmV3X3N0YXRlHQI0TWVtYmVyUmVtb3ZlZAEACBxwb29sX2lkBBhtZW1iZXIAMFJvbGVzVXBkYXRlZAEADBByb290BQIcYm91bmNlcgUCJG5vbWluYXRvcgUCLFBvb2xTbGFzaGVkAQAIHHBvb2xfaWQEHGJhbGFuY2UIUFVuYm9uZGluZ1Bvb2xTbGFzaGVkAQAMHHBvb2xfaWQEDGVyYQQcYmFsYW5jZQhUUG9vbENvbW1pc3Npb25VcGRhdGVkAQAIHHBvb2xfaWQEHGN1cnJlbnQlAmBQb29sTWF4Q29tbWlzc2lvblVwZGF0ZWQBAAgccG9vbF9pZAQ4bWF4X2NvbW1pc3Npb24EfFBvb2xDb21taXNzaW9uQ2hhbmdlUmF0ZVVwZGF0ZWQBAAgccG9vbF9pZAQsY2hhbmdlX3JhdGUpApBQb29sQ29tbWlzc2lvbkNsYWltUGVybWlzc2lvblVwZGF0ZWQBAAgccG9vbF9pZAQocGVybWlzc2lvbjECVFBvb2xDb21taXNzaW9uQ2xhaW1lZAEACBxwb29sX2lkBChjb21taXNzaW9uCGRNaW5CYWxhbmNlRGVmaWNpdEFkanVzdGVkAQAIHHBvb2xfaWQEGGFtb3VudAhgTWluQmFsYW5jZUV4Y2Vzc0FkanVzdGVkAQAIHHBvb2xfaWQEGGFtb3VudAgsRmFzdFVuc3Rha2UBAhQgVW5zdGFrZWQBAAgUc3Rhc2gAGHJlc3VsdBkBHFNsYXNoZWQBAAgUc3Rhc2gAGGFtb3VudAgwQmF0Y2hDaGVja2VkAQAEEGVyYXM5AjRCYXRjaEZpbmlzaGVkAQAEEHNpemUENEludGVybmFsRXJyb3IBAQU0UGFyYUluY2x1c2lvbgECEDxDYW5kaWRhdGVCYWNrZWQBAxBJAiQEBERDYW5kaWRhdGVJbmNsdWRlZAEDEEkCJAQERENhbmRpZGF0ZVRpbWVkT3V0AQMMSQIkBFhVcHdhcmRNZXNzYWdlc1JlY2VpdmVkAQAIEGZyb20EFGNvdW50BBRQYXJhcwECIEhDdXJyZW50Q29kZVVwZGF0ZWQBAQJIQ3VycmVudEhlYWRVcGRhdGVkAQECUENvZGVVcGdyYWRlU2NoZWR1bGVkAQECME5ld0hlYWROb3RlZAEBAjBBY3Rpb25RdWV1ZWQBBAQBCDxQdmZDaGVja1N0YXJ0ZWQBAwggBEBQdmZDaGVja0FjY2VwdGVkAQMIIARAUHZmQ2hlY2tSZWplY3RlZAEDCCAEEEhybXABAhxQT3BlbkNoYW5uZWxSZXF1ZXN0ZWQBABAYc2VuZGVyBCRyZWNpcGllbnQEVHByb3Bvc2VkX21heF9jYXBhY2l0eQRkcHJvcG9zZWRfbWF4X21lc3NhZ2Vfc2l6ZQRMT3BlbkNoYW5uZWxDYW5jZWxlZAEACDBieV9wYXJhY2hhaW4EKGNoYW5uZWxfaWRVAkxPcGVuQ2hhbm5lbEFjY2VwdGVkAQAIGHNlbmRlcgQkcmVjaXBpZW50BDRDaGFubmVsQ2xvc2VkAQAIMGJ5X3BhcmFjaGFpbgQoY2hhbm5lbF9pZFUCWEhybXBDaGFubmVsRm9yY2VPcGVuZWQBABAYc2VuZGVyBCRyZWNpcGllbnQEVHByb3Bvc2VkX21heF9jYXBhY2l0eQRkcHJvcG9zZWRfbWF4X21lc3NhZ2Vfc2l6ZQRcSHJtcFN5c3RlbUNoYW5uZWxPcGVuZWQBABAYc2VuZGVyBCRyZWNpcGllbnQEVHByb3Bvc2VkX21heF9jYXBhY2l0eQRkcHJvcG9zZWRfbWF4X21lc3NhZ2Vfc2l6ZQRoT3BlbkNoYW5uZWxEZXBvc2l0c1VwZGF0ZWQBAAgYc2VuZGVyBCRyZWNpcGllbnQENFBhcmFzRGlzcHV0ZXMBAgxARGlzcHV0ZUluaXRpYXRlZAEDCCBdAkBEaXNwdXRlQ29uY2x1ZGVkAQMIIGECGFJldmVydAEBAiBPbkRlbWFuZAECCExPbkRlbWFuZE9yZGVyUGxhY2VkAQAMHHBhcmFfaWQEKHNwb3RfcHJpY2UIKG9yZGVyZWRfYnkAMFNwb3RQcmljZVNldAEABChzcG90X3ByaWNlCCRSZWdpc3RyYXIBAhAoUmVnaXN0ZXJlZAEACBxwYXJhX2lkBBxtYW5hZ2VyADBEZXJlZ2lzdGVyZWQBAAQccGFyYV9pZAQgUmVzZXJ2ZWQBAAgccGFyYV9pZAQMd2hvABxTd2FwcGVkAQAIHHBhcmFfaWQEIG90aGVyX2lkBBRTbG90cwECCDhOZXdMZWFzZVBlcmlvZAEABDBsZWFzZV9wZXJpb2QEGExlYXNlZAEAGBxwYXJhX2lkBBhsZWFzZXIAMHBlcmlvZF9iZWdpbgQwcGVyaW9kX2NvdW50BDhleHRyYV9yZXNlcnZlZAgwdG90YWxfYW1vdW50CCBBdWN0aW9ucwECHDhBdWN0aW9uU3RhcnRlZAEADDRhdWN0aW9uX2luZGV4BDBsZWFzZV9wZXJpb2QEGGVuZGluZwQ0QXVjdGlvbkNsb3NlZAEABDRhdWN0aW9uX2luZGV4BCBSZXNlcnZlZAEADBhiaWRkZXIAOGV4dHJhX3Jlc2VydmVkCDB0b3RhbF9hbW91bnQIKFVucmVzZXJ2ZWQBAAgYYmlkZGVyABhhbW91bnQISFJlc2VydmVDb25maXNjYXRlZAEADBxwYXJhX2lkBBhsZWFzZXIAGGFtb3VudAgsQmlkQWNjZXB0ZWQBABQYYmlkZGVyABxwYXJhX2lkBBhhbW91bnQIKGZpcnN0X3Nsb3QEJGxhc3Rfc2xvdAQ0V2lubmluZ09mZnNldAEACDRhdWN0aW9uX2luZGV4BDBibG9ja19udW1iZXIEJENyb3dkbG9hbgECKBxDcmVhdGVkAQAEHHBhcmFfaWQELENvbnRyaWJ1dGVkAQAMDHdobwAoZnVuZF9pbmRleAQYYW1vdW50CCBXaXRoZHJldwEADAx3aG8AKGZ1bmRfaW5kZXgEGGFtb3VudAhEUGFydGlhbGx5UmVmdW5kZWQBAAQccGFyYV9pZAQsQWxsUmVmdW5kZWQBAAQccGFyYV9pZAQkRGlzc29sdmVkAQAEHHBhcmFfaWQEPEhhbmRsZUJpZFJlc3VsdAEACBxwYXJhX2lkBBhyZXN1bHQZARhFZGl0ZWQBAAQccGFyYV9pZAQsTWVtb1VwZGF0ZWQBAAwMd2hvABxwYXJhX2lkBBBtZW1vJDxBZGRlZFRvTmV3UmFpc2UBAAQccGFyYV9pZAQgQ29yZXRpbWUBAghQUmV2ZW51ZUluZm9SZXF1ZXN0ZWQBAAQQd2hlbgQwQ29yZUFzc2lnbmVkAQAEEGNvcmUESFN0YXRlVHJpZU1pZ3JhdGlvbgECECBNaWdyYXRlZAEADAx0b3AEFGNoaWxkBBxjb21wdXRlgQIcU2xhc2hlZAEACAx3aG8AGGFtb3VudAhUQXV0b01pZ3JhdGlvbkZpbmlzaGVkAQEFGEhhbHRlZAEABBRlcnJvcuQkWGNtUGFsbGV0AQJgJEF0dGVtcHRlZAEABBxvdXRjb21ljQIQU2VudAEAEBhvcmlnaW55ASxkZXN0aW5hdGlvbnkBHG1lc3NhZ2X5AihtZXNzYWdlX2lkIEhVbmV4cGVjdGVkUmVzcG9uc2UBAAgYb3JpZ2lueQEgcXVlcnlfaWQINFJlc3BvbnNlUmVhZHkBAAggcXVlcnlfaWQIIHJlc3BvbnNluQIgTm90aWZpZWQBAAwgcXVlcnlfaWQIMHBhbGxldF9pbmRleAQoY2FsbF9pbmRleARATm90aWZ5T3ZlcndlaWdodAEAFCBxdWVyeV9pZAgwcGFsbGV0X2luZGV4BChjYWxsX2luZGV4BDRhY3R1YWxfd2VpZ2h0GExtYXhfYnVkZ2V0ZWRfd2VpZ2h0GExOb3RpZnlEaXNwYXRjaEVycm9yAQAMIHF1ZXJ5X2lkCDBwYWxsZXRfaW5kZXgEKGNhbGxfaW5kZXgESE5vdGlmeURlY29kZUZhaWxlZAEADCBxdWVyeV9pZAgwcGFsbGV0X2luZGV4BChjYWxsX2luZGV4BEBJbnZhbGlkUmVzcG9uZGVyAQAMGG9yaWdpbnkBIHF1ZXJ5X2lkCERleHBlY3RlZF9sb2NhdGlvbr0CXEludmFsaWRSZXNwb25kZXJWZXJzaW9uAQAIGG9yaWdpbnkBIHF1ZXJ5X2lkCDRSZXNwb25zZVRha2VuAQAEIHF1ZXJ5X2lkCDRBc3NldHNUcmFwcGVkAQAMEGhhc2ggGG9yaWdpbnkBGGFzc2V0cxkDVFZlcnNpb25DaGFuZ2VOb3RpZmllZAEAECxkZXN0aW5hdGlvbnkBGHJlc3VsdAQQY29zdKECKG1lc3NhZ2VfaWQgXFN1cHBvcnRlZFZlcnNpb25DaGFuZ2VkAQAIIGxvY2F0aW9ueQEcdmVyc2lvbgRQTm90aWZ5VGFyZ2V0U2VuZEZhaWwBAAwgbG9jYXRpb255ASBxdWVyeV9pZAgUZXJyb3KJAmROb3RpZnlUYXJnZXRNaWdyYXRpb25GYWlsAQAIIGxvY2F0aW9umQEgcXVlcnlfaWQIVEludmFsaWRRdWVyaWVyVmVyc2lvbgEACBhvcmlnaW55ASBxdWVyeV9pZAg4SW52YWxpZFF1ZXJpZXIBABAYb3JpZ2lueQEgcXVlcnlfaWQIQGV4cGVjdGVkX3F1ZXJpZXJ5AVBtYXliZV9hY3R1YWxfcXVlcmllcr0CUFZlcnNpb25Ob3RpZnlTdGFydGVkAQAMLGRlc3RpbmF0aW9ueQEQY29zdKECKG1lc3NhZ2VfaWQgWFZlcnNpb25Ob3RpZnlSZXF1ZXN0ZWQBAAwsZGVzdGluYXRpb255ARBjb3N0oQIobWVzc2FnZV9pZCBgVmVyc2lvbk5vdGlmeVVucmVxdWVzdGVkAQAMLGRlc3RpbmF0aW9ueQEQY29zdKECKG1lc3NhZ2VfaWQgIEZlZXNQYWlkAQAIGHBheWluZ3kBEGZlZXOhAjRBc3NldHNDbGFpbWVkAQAMEGhhc2ggGG9yaWdpbnkBGGFzc2V0cxkDYFZlcnNpb25NaWdyYXRpb25GaW5pc2hlZAEABBx2ZXJzaW9uBDBNZXNzYWdlUXVldWUBAhBAUHJvY2Vzc2luZ0ZhaWxlZAEADAhpZCAYb3JpZ2luJQMUZXJyb3IpAyRQcm9jZXNzZWQBABAIaWQgGG9yaWdpbiUDLHdlaWdodF91c2VkGBxzdWNjZXNzFEhPdmVyd2VpZ2h0RW5xdWV1ZWQBABAIaWQgGG9yaWdpbiUDKHBhZ2VfaW5kZXgENG1lc3NhZ2VfaW5kZXgEKFBhZ2VSZWFwZWQBAAgYb3JpZ2luJQMUaW5kZXgEJEFzc2V0UmF0ZQECDEBBc3NldFJhdGVDcmVhdGVkAQAIKGFzc2V0X2tpbmSBARByYXRlCEBBc3NldFJhdGVSZW1vdmVkAQAEKGFzc2V0X2tpbmSBAUBBc3NldFJhdGVVcGRhdGVkAQAMKGFzc2V0X2tpbmSBAQxvbGQIDG5ldwgEIAAADBRwaGFzZTQUZXZlbnQ1Axh0b3BpY3M5AwQ9AwAEDQEAAQEACDBzcGVjX3ZlcnNpb24EJHNwZWNfbmFtZUkDAAgkY29kZV9oYXNoIDRjaGVja192ZXJzaW9uFAAQOGJhc2VfZXh0cmluc2ljGDRtYXhfZXh0cmluc2ljsQEkbWF4X3RvdGFssQEgcmVzZXJ2ZWSxAQAMGG5vcm1hbFUDLG9wZXJhdGlvbmFsVQMkbWFuZGF0b3J5VQMADChiYXNlX2Jsb2NrGCRtYXhfYmxvY2sYJHBlcl9jbGFzc1kDAAwYbm9ybWFsBCxvcGVyYXRpb25hbAQkbWFuZGF0b3J5BAAIEHJlYWQIFHdyaXRlCAMIkQIEBGkDAAAgJHNwZWNfbmFtZUkDJGltcGxfbmFtZUkDRGF1dGhvcmluZ192ZXJzaW9uBDBzcGVjX3ZlcnNpb24EMGltcGxfdmVyc2lvbgQQYXBpc20DTHRyYW5zYWN0aW9uX3ZlcnNpb24ENHN0YXRlX3ZlcnNpb24EBCQBCAR1AwAEJAAGDQECDBBSb290AQEFGFNpZ25lZAEBARBOb25lAQEFAjwwU3Rha2luZ0FkbWluAQEFJFRyZWFzdXJlcgEBBTxGZWxsb3dzaGlwQWRtaW4BAQUwR2VuZXJhbEFkbWluAQEFMEF1Y3Rpb25BZG1pbgEBBShMZWFzZUFkbWluAQEFTFJlZmVyZW5kdW1DYW5jZWxsZXIBAQVAUmVmZXJlbmR1bUtpbGxlcgEBBSxTbWFsbFRpcHBlcgEBBSRCaWdUaXBwZXIBAQUwU21hbGxTcGVuZGVyAQEFNE1lZGl1bVNwZW5kZXIBAQUoQmlnU3BlbmRlcgEBBURXaGl0ZWxpc3RlZENhbGxlcgEBBTRXaXNoRm9yQ2hhbmdlAQEFAgQkUGFyYWNoYWluAQECAggMWGNtAQAIHHBhcmVudHMEIGludGVyaW9ydQEgUmVzcG9uc2UBAAgccGFyZW50cwQgaW50ZXJpb3J1AQIUGHN5c3RlbQECDBBSb290AQEFGFNpZ25lZAEBARBOb25lAQEFHE9yaWdpbnMBAjwwU3Rha2luZ0FkbWluAQEFJFRyZWFzdXJlcgEBBTxGZWxsb3dzaGlwQWRtaW4BAQUwR2VuZXJhbEFkbWluAQEFMEF1Y3Rpb25BZG1pbgEBBShMZWFzZUFkbWluAQEFTFJlZmVyZW5kdW1DYW5jZWxsZXIBAQVAUmVmZXJlbmR1bUtpbGxlcgEBBSxTbWFsbFRpcHBlcgEBBSRCaWdUaXBwZXIBAQUwU21hbGxTcGVuZGVyAQEFNE1lZGl1bVNwZW5kZXIBAQUoQmlnU3BlbmRlcgEBBURXaGl0ZWxpc3RlZENhbGxlcgEBBTRXaXNoRm9yQ2hhbmdlAQEFQFBhcmFjaGFpbnNPcmlnaW4BAgQkUGFyYWNoYWluAQECJFhjbVBhbGxldAECCAxYY20BAAgccGFyZW50cwQgaW50ZXJpb3J1ASBSZXNwb25zZQEACBxwYXJlbnRzBCBpbnRlcmlvcnUBEFZvaWQBAQUAFCBtYXliZV9pZBEBIHByaW9yaXR5BBBjYWxspQE4bWF5YmVfcGVyaW9kaWOBAxhvcmlnaW6VAwaZAwSdAwAADDR0b3RhbF9yZXRyaWVzBCRyZW1haW5pbmcEGHBlcmlvZAQCLBhyZW1hcmsBAAQYcmVtYXJrJDhzZXRfaGVhcF9wYWdlcwEABBRwYWdlcwggc2V0X2NvZGUBAAQQY29kZSRcc2V0X2NvZGVfd2l0aG91dF9jaGVja3MBAAQQY29kZSQsc2V0X3N0b3JhZ2UBAAQUaXRlbXN5AzBraWxsX3N0b3JhZ2UBAAQQa2V5c30DLGtpbGxfcHJlZml4AQAIGHByZWZpeCQcc3Via2V5cwREcmVtYXJrX3dpdGhfZXZlbnQBAAQYcmVtYXJrJERhdXRob3JpemVfdXBncmFkZQEABCRjb2RlX2hhc2gggGF1dGhvcml6ZV91cGdyYWRlX3dpdGhvdXRfY2hlY2tzAQAEJGNvZGVfaGFzaCBgYXBwbHlfYXV0aG9yaXplZF91cGdyYWRlAQAEEGNvZGUkAiggc2NoZWR1bGUBABAQd2hlbgQ4bWF5YmVfcGVyaW9kaWOBAyBwcmlvcml0eQQQY2FsbN0GGGNhbmNlbAEACBB3aGVuBBRpbmRleAQ4c2NoZWR1bGVfbmFtZWQBABQIaWQgEHdoZW4EOG1heWJlX3BlcmlvZGljgQMgcHJpb3JpdHkEEGNhbGzdBjBjYW5jZWxfbmFtZWQBAAQIaWQgOHNjaGVkdWxlX2FmdGVyAQAQFGFmdGVyBDhtYXliZV9wZXJpb2RpY4EDIHByaW9yaXR5BBBjYWxs3QZQc2NoZWR1bGVfbmFtZWRfYWZ0ZXIBABQIaWQgFGFmdGVyBDhtYXliZV9wZXJpb2RpY4EDIHByaW9yaXR5BBBjYWxs3QYkc2V0X3JldHJ5AQAMEHRhc2sNARxyZXRyaWVzBBhwZXJpb2QEPHNldF9yZXRyeV9uYW1lZAEADAhpZCAccmV0cmllcwQYcGVyaW9kBDBjYW5jZWxfcmV0cnkBAAQQdGFzaw0BSGNhbmNlbF9yZXRyeV9uYW1lZAEABAhpZCACFDRub3RlX3ByZWltYWdlAQAEFGJ5dGVzJDx1bm5vdGVfcHJlaW1hZ2UBAAQQaGFzaCBAcmVxdWVzdF9wcmVpbWFnZQEABBBoYXNoIEh1bnJlcXVlc3RfcHJlaW1hZ2UBAAQQaGFzaCA4ZW5zdXJlX3VwZGF0ZWQBAAQYaGFzaGVzOQMAFCxwYXJlbnRfaGFzaCAYbnVtYmVyBChzdGF0ZV9yb290IDxleHRyaW5zaWNzX3Jvb3QgGGRpZ2VzdDAAECBvZmZlbmRlciAQc2xvdAgwZmlyc3RfaGVhZGVytQM0c2Vjb25kX2hlYWRlcrUDAAwcc2Vzc2lvbgQodHJpZV9ub2Rlc30DPHZhbGlkYXRvcl9jb3VudAQECAEIAgwwUHJpbWFyeVNsb3RzAQEFdFByaW1hcnlBbmRTZWNvbmRhcnlQbGFpblNsb3RzAQEFbFByaW1hcnlBbmRTZWNvbmRhcnlWUkZTbG90cwEBBQIECFYxAQAIBGPBAzRhbGxvd2VkX3Nsb3RzxQMCDExyZXBvcnRfZXF1aXZvY2F0aW9uAQAISGVxdWl2b2NhdGlvbl9wcm9vZrkDPGtleV9vd25lcl9wcm9vZr0DcHJlcG9ydF9lcXVpdm9jYXRpb25fdW5zaWduZWQBAAhIZXF1aXZvY2F0aW9uX3Byb29muQM8a2V5X293bmVyX3Byb29mvQNIcGxhbl9jb25maWdfY2hhbmdlAQAEGGNvbmZpZ8kDAgQMc2V0AQAEDG5vdwgCFAhJZAEBARRJbmRleAEBBQxSYXcBBQAkQWRkcmVzczMyAQUBgCRBZGRyZXNzMjABBQFQAhQUY2xhaW0BAAQUaW5kZXgEIHRyYW5zZmVyAQAIDG5ld9UDFGluZGV4BBBmcmVlAQAEFGluZGV4BDhmb3JjZV90cmFuc2ZlcgEADAxuZXfVAxRpbmRleAQYZnJlZXplFBhmcmVlemUBAAQUaW5kZXgEBAAAAgggSW5jcmVhc2UBAQUgRGVjcmVhc2UBAQUCJFB0cmFuc2Zlcl9hbGxvd19kZWF0aAEACBBkZXN01QMUdmFsdWUIOGZvcmNlX3RyYW5zZmVyAQAMGHNvdXJjZdUDEGRlc3TVAxR2YWx1ZQhMdHJhbnNmZXJfa2VlcF9hbGl2ZQEACBBkZXN01QMUdmFsdWUIMHRyYW5zZmVyX2FsbAEACBBkZXN01QMoa2VlcF9hbGl2ZRQ8Zm9yY2VfdW5yZXNlcnZlAQAIDHdob9UDGGFtb3VudAhAdXBncmFkZV9hY2NvdW50cwEABAx3aG/dA0Rmb3JjZV9zZXRfYmFsYW5jZQEACAx3aG/VAyBuZXdfZnJlZQhsZm9yY2VfYWRqdXN0X3RvdGFsX2lzc3VhbmNlAQAIJGRpcmVjdGlvbuEDFGRlbHRhCBBidXJuAQAIFHZhbHVlCChrZWVwX2FsaXZlFATVAwACDBBOb29wAQEFDFNldAEBAxhSZW1vdmUBAQUCDBBOb29wAQEFDFNldAEBAhhSZW1vdmUBAQUGCAAIFHZhbHVlCAxlcmEEBPkDAAb9AwJ4EGJvbmQBAAgUdmFsdWUIFHBheWVlNQEoYm9uZF9leHRyYQEABDhtYXhfYWRkaXRpb25hbAgYdW5ib25kAQAEFHZhbHVlCER3aXRoZHJhd191bmJvbmRlZAEABEhudW1fc2xhc2hpbmdfc3BhbnMEIHZhbGlkYXRlAQAEFHByZWZzOQEgbm9taW5hdGUBAAQcdGFyZ2V0c+kDFGNoaWxsAQEFJHNldF9wYXllZQEABBRwYXllZTUBOHNldF9jb250cm9sbGVyAQEFTHNldF92YWxpZGF0b3JfY291bnQBAAQMbmV3BGBpbmNyZWFzZV92YWxpZGF0b3JfY291bnQBAAQoYWRkaXRpb25hbARUc2NhbGVfdmFsaWRhdG9yX2NvdW50AQAEGGZhY3RvcgQ0Zm9yY2Vfbm9fZXJhcwEBBTRmb3JjZV9uZXdfZXJhAQEFRHNldF9pbnZ1bG5lcmFibGVzAQAENGludnVsbmVyYWJsZXPdAzRmb3JjZV91bnN0YWtlAQAIFHN0YXNoAEhudW1fc2xhc2hpbmdfc3BhbnMEUGZvcmNlX25ld19lcmFfYWx3YXlzAQEFVGNhbmNlbF9kZWZlcnJlZF9zbGFzaAEACAxlcmEENHNsYXNoX2luZGljZXM5AjhwYXlvdXRfc3Rha2VycwEACDx2YWxpZGF0b3Jfc3Rhc2gADGVyYQQYcmVib25kAQAEFHZhbHVlCChyZWFwX3N0YXNoAQAIFHN0YXNoAEhudW1fc2xhc2hpbmdfc3BhbnMEEGtpY2sBAAQMd2hv6QNMc2V0X3N0YWtpbmdfY29uZmlncwEAHEhtaW5fbm9taW5hdG9yX2JvbmTtA0htaW5fdmFsaWRhdG9yX2JvbmTtA0xtYXhfbm9taW5hdG9yX2NvdW508QNMbWF4X3ZhbGlkYXRvcl9jb3VudPEDPGNoaWxsX3RocmVzaG9sZPEDOG1pbl9jb21taXNzaW9u8QNIbWF4X3N0YWtlZF9yZXdhcmRz8QMsY2hpbGxfb3RoZXIBAAQUc3Rhc2gAaGZvcmNlX2FwcGx5X21pbl9jb21taXNzaW9uAQAEPHZhbGlkYXRvcl9zdGFzaABIc2V0X21pbl9jb21taXNzaW9uAQAEDG5ldwRYcGF5b3V0X3N0YWtlcnNfYnlfcGFnZQEADDx2YWxpZGF0b3Jfc3Rhc2gADGVyYQQQcGFnZQQwdXBkYXRlX3BheWVlAQAEKGNvbnRyb2xsZXIAaGRlcHJlY2F0ZV9jb250cm9sbGVyX2JhdGNoAQAELGNvbnRyb2xsZXJz3QM4cmVzdG9yZV9sZWRnZXIBABAUc3Rhc2gAQG1heWJlX2NvbnRyb2xsZXIFAixtYXliZV90b3RhbPUDPG1heWJlX3VubG9ja2luZwEEBQGEABgcZ3JhbmRwYSAQYmFiZSA4cGFyYV92YWxpZGF0b3IgPHBhcmFfYXNzaWdubWVudCBMYXV0aG9yaXR5X2Rpc2NvdmVyeSAUYmVlZnkJBAIIIHNldF9rZXlzAQAIEGtleXMNBBRwcm9vZiQocHVyZ2Vfa2V5cwEBBQAILHRhcmdldF9oYXNoIDR0YXJnZXRfbnVtYmVyBAMIFQRBAgAQMHJvdW5kX251bWJlcgggaWRlbnRpdHkgFGZpcnN0GQQYc2Vjb25kGQQCCBxQcmV2b3RlAQAQMHJvdW5kX251bWJlcgggaWRlbnRpdHkgFGZpcnN0GQQYc2Vjb25kGQQkUHJlY29tbWl0AQAQMHJvdW5kX251bWJlcgggaWRlbnRpdHkgFGZpcnN0GQQYc2Vjb25kGQQACBhzZXRfaWQIMGVxdWl2b2NhdGlvbiEEAgxMcmVwb3J0X2VxdWl2b2NhdGlvbgEACEhlcXVpdm9jYXRpb25fcHJvb2YlBDxrZXlfb3duZXJfcHJvb2a9A3ByZXBvcnRfZXF1aXZvY2F0aW9uX3Vuc2lnbmVkAQAISGVxdWl2b2NhdGlvbl9wcm9vZiUEPGtleV9vd25lcl9wcm9vZr0DMG5vdGVfc3RhbGxlZAEACBRkZWxheQRsYmVzdF9maW5hbGl6ZWRfYmxvY2tfbnVtYmVyBAYEAhgsc3BlbmRfbG9jYWwBAAgYYW1vdW50CCxiZW5lZmljaWFyedUDPHJlbW92ZV9hcHByb3ZhbAEABCxwcm9wb3NhbF9pZAQUc3BlbmQBABAoYXNzZXRfa2luZIEBGGFtb3VudAgsYmVuZWZpY2lhcnmZASh2YWxpZF9mcm9tLQQYcGF5b3V0AQAEFGluZGV4BDBjaGVja19zdGF0dXMBAAQUaW5kZXgEKHZvaWRfc3BlbmQBAAQUaW5kZXgEAgwgU3RhbmRhcmQBAAgQdm90ZQQcYmFsYW5jZQgUU3BsaXQBAAgMYXllCAxuYXkIMFNwbGl0QWJzdGFpbgEADAxheWUIDG5heQgcYWJzdGFpbggCHBBOb25lAQEFIExvY2tlZDF4AQEFIExvY2tlZDJ4AQEFIExvY2tlZDN4AQEFIExvY2tlZDR4AQEFIExvY2tlZDV4AQEFIExvY2tlZDZ4AQEFAhgQdm90ZQEACChwb2xsX2luZGV4BBB2b3RlNQQgZGVsZWdhdGUBABAUY2xhc3MECHRv1QMoY29udmljdGlvbjkEHGJhbGFuY2UIKHVuZGVsZWdhdGUBAAQUY2xhc3MEGHVubG9jawEACBRjbGFzcwQYdGFyZ2V01QMscmVtb3ZlX3ZvdGUBAAgUY2xhc3MtBBRpbmRleAREcmVtb3ZlX290aGVyX3ZvdGUBAAwYdGFyZ2V01QMUY2xhc3MEFGluZGV4BAIICEF0AQECFEFmdGVyAQECAiQYc3VibWl0AQAMPHByb3Bvc2FsX29yaWdpbpUDIHByb3Bvc2FspQFAZW5hY3RtZW50X21vbWVudEEEWHBsYWNlX2RlY2lzaW9uX2RlcG9zaXQBAAQUaW5kZXgEXHJlZnVuZF9kZWNpc2lvbl9kZXBvc2l0AQAEFGluZGV4BBhjYW5jZWwBAAQUaW5kZXgEEGtpbGwBAAQUaW5kZXgEQG51ZGdlX3JlZmVyZW5kdW0BAAQUaW5kZXgESG9uZV9mZXdlcl9kZWNpZGluZwEABBR0cmFjawRkcmVmdW5kX3N1Ym1pc3Npb25fZGVwb3NpdAEABBRpbmRleAQwc2V0X21ldGFkYXRhAQAIFGluZGV4BChtYXliZV9oYXNoEQECEDh3aGl0ZWxpc3RfY2FsbAEABCRjYWxsX2hhc2ggXHJlbW92ZV93aGl0ZWxpc3RlZF9jYWxsAQAEJGNhbGxfaGFzaCBkZGlzcGF0Y2hfd2hpdGVsaXN0ZWRfY2FsbAEADCRjYWxsX2hhc2ggQGNhbGxfZW5jb2RlZF9sZW4ETGNhbGxfd2VpZ2h0X3dpdG5lc3MYnGRpc3BhdGNoX3doaXRlbGlzdGVkX2NhbGxfd2l0aF9wcmVpbWFnZQEABBBjYWxs3QYGFAIUME1pbkluZmxhdGlvbgEE9QMBBDBNYXhJbmZsYXRpb24BBPUDAQQoSWRlYWxTdGFrZQEE9QMBBBxGYWxsb2ZmAQT1AwEEPFVzZUF1Y3Rpb25TbG90cwEETQQBBAIEJEluZmxhdGlvbgECFDBNaW5JbmZsYXRpb24BBPUDAQQwTWF4SW5mbGF0aW9uAQT1AwEEKElkZWFsU3Rha2UBBPUDAQQcRmFsbG9mZgEE9QMBBDxVc2VBdWN0aW9uU2xvdHMBBE0EAQQCBDRzZXRfcGFyYW1ldGVyAQAEJGtleV92YWx1ZVUEBQEFAQMMCAgEBmEEAggcUmVndWxhcgEBBRBTYWZ0AQEFBmkEAhQUY2xhaW0BAAgQZGVzdABIZXRoZXJldW1fc2lnbmF0dXJlXQQobWludF9jbGFpbQEAEAx3aG9lARR2YWx1ZQhAdmVzdGluZ19zY2hlZHVsZWUEJHN0YXRlbWVudG0EMGNsYWltX2F0dGVzdAEADBBkZXN0AEhldGhlcmV1bV9zaWduYXR1cmVdBCRzdGF0ZW1lbnQkGGF0dGVzdAEABCRzdGF0ZW1lbnQkKG1vdmVfY2xhaW0BAAwMb2xkZQEMbmV3ZQE4bWF5YmVfcHJlY2xhaW0FAgAMGGxvY2tlZAgkcGVyX2Jsb2NrCDhzdGFydGluZ19ibG9jawQCGBB2ZXN0AQEFKHZlc3Rfb3RoZXIBAAQYdGFyZ2V01QM8dmVzdGVkX3RyYW5zZmVyAQAIGHRhcmdldNUDIHNjaGVkdWxldQRUZm9yY2VfdmVzdGVkX3RyYW5zZmVyAQAMGHNvdXJjZdUDGHRhcmdldNUDIHNjaGVkdWxldQQ8bWVyZ2Vfc2NoZWR1bGVzAQAIPHNjaGVkdWxlMV9pbmRleAQ8c2NoZWR1bGUyX2luZGV4BHRmb3JjZV9yZW1vdmVfdmVzdGluZ19zY2hlZHVsZQEACBh0YXJnZXTVAzhzY2hlZHVsZV9pbmRleAQE3QYAAhgUYmF0Y2gBAAQUY2FsbHN9BDRhc19kZXJpdmF0aXZlAQAIFGluZGV4BBBjYWxs3QYkYmF0Y2hfYWxsAQAEFGNhbGxzfQQsZGlzcGF0Y2hfYXMBAAgkYXNfb3JpZ2lulQMQY2FsbN0GLGZvcmNlX2JhdGNoAQAEFGNhbGxzfQQsd2l0aF93ZWlnaHQBAAgQY2FsbN0GGHdlaWdodBgG6QECKBRwcm94eQEADBByZWFs1QNAZm9yY2VfcHJveHlfdHlwZYUEEGNhbGzdBiRhZGRfcHJveHkBAAwgZGVsZWdhdGXVAyhwcm94eV90eXBl6QEUZGVsYXkEMHJlbW92ZV9wcm94eQEADCBkZWxlZ2F0ZdUDKHByb3h5X3R5cGXpARRkZWxheQQ4cmVtb3ZlX3Byb3hpZXMBAQUsY3JlYXRlX3B1cmUBAAwocHJveHlfdHlwZekBFGRlbGF5BBRpbmRleAQka2lsbF9wdXJlAQAUHHNwYXduZXLVAyhwcm94eV90eXBl6QEUaW5kZXgEGGhlaWdodAQkZXh0X2luZGV4BCBhbm5vdW5jZQEACBByZWFs1QMkY2FsbF9oYXNoIExyZW1vdmVfYW5ub3VuY2VtZW50AQAIEHJlYWzVAyRjYWxsX2hhc2ggTHJlamVjdF9hbm5vdW5jZW1lbnQBAAggZGVsZWdhdGXVAyRjYWxsX2hhc2ggPHByb3h5X2Fubm91bmNlZAEAECBkZWxlZ2F0ZdUDEHJlYWzVA0Bmb3JjZV9wcm94eV90eXBlhQQQY2FsbN0GBvEBAhBQYXNfbXVsdGlfdGhyZXNob2xkXzEBAAhEb3RoZXJfc2lnbmF0b3JpZXPdAxBjYWxs3QYgYXNfbXVsdGkBABQkdGhyZXNob2xkBERvdGhlcl9zaWduYXRvcmllc90DPG1heWJlX3RpbWVwb2ludI0EEGNhbGzdBihtYXhfd2VpZ2h0GEBhcHByb3ZlX2FzX211bHRpAQAUJHRocmVzaG9sZAREb3RoZXJfc2lnbmF0b3JpZXPdAzxtYXliZV90aW1lcG9pbnSNBCRjYWxsX2hhc2ggKG1heF93ZWlnaHQYPGNhbmNlbF9hc19tdWx0aQEAECR0aHJlc2hvbGQERG90aGVyX3NpZ25hdG9yaWVz3QMkdGltZXBvaW508QEkY2FsbF9oYXNoIAIkOHByb3Bvc2VfYm91bnR5AQAIFHZhbHVlCCxkZXNjcmlwdGlvbiQ4YXBwcm92ZV9ib3VudHkBAAQkYm91bnR5X2lkBDxwcm9wb3NlX2N1cmF0b3IBAAwkYm91bnR5X2lkBBxjdXJhdG9y1QMMZmVlCEB1bmFzc2lnbl9jdXJhdG9yAQAEJGJvdW50eV9pZAQ4YWNjZXB0X2N1cmF0b3IBAAQkYm91bnR5X2lkBDBhd2FyZF9ib3VudHkBAAgkYm91bnR5X2lkBCxiZW5lZmljaWFyedUDMGNsYWltX2JvdW50eQEABCRib3VudHlfaWQEMGNsb3NlX2JvdW50eQEABCRib3VudHlfaWQEUGV4dGVuZF9ib3VudHlfZXhwaXJ5AQAIJGJvdW50eV9pZAQYcmVtYXJrJAIcQGFkZF9jaGlsZF9ib3VudHkBAAxAcGFyZW50X2JvdW50eV9pZAQUdmFsdWUILGRlc2NyaXB0aW9uJDxwcm9wb3NlX2N1cmF0b3IBABBAcGFyZW50X2JvdW50eV9pZAQ8Y2hpbGRfYm91bnR5X2lkBBxjdXJhdG9y1QMMZmVlCDhhY2NlcHRfY3VyYXRvcgEACEBwYXJlbnRfYm91bnR5X2lkBDxjaGlsZF9ib3VudHlfaWQEQHVuYXNzaWduX2N1cmF0b3IBAAhAcGFyZW50X2JvdW50eV9pZAQ8Y2hpbGRfYm91bnR5X2lkBEhhd2FyZF9jaGlsZF9ib3VudHkBAAxAcGFyZW50X2JvdW50eV9pZAQ8Y2hpbGRfYm91bnR5X2lkBCxiZW5lZmljaWFyedUDSGNsYWltX2NoaWxkX2JvdW50eQEACEBwYXJlbnRfYm91bnR5X2lkBDxjaGlsZF9ib3VudHlfaWQESGNsb3NlX2NoaWxkX2JvdW50eQEACEBwYXJlbnRfYm91bnR5X2lkBDxjaGlsZF9ib3VudHlfaWQEAwgEBASdBAADDASdBAQEpQQABJ0EAQgDDAStBAQEsQQABJ0EAQwDDAS5BAQEvQQABJ0EARADDATFBAQEyQQABJ0EARQDDATRBAQE1QQABJ0EARgDDATdBAQE4QQABJ0EARwDDATpBAQE7QQABJ0EASADDAT1BAQE+QQABJ0EASQDDAQBBQQEBQUABJ0EASgDDAQNBQQEEQUABJ0EASwDDAQZBQQEHQUABJ0EATADDAQlBQQEKQUABJ0EATQDDAQxBQQENQUABJ0EATgDDAQ9BQQEQQUABJ0EATwDDARJBQQETQUAAEAYdm90ZXMxoQQYdm90ZXMyqQQYdm90ZXMztQQYdm90ZXM0wQQYdm90ZXM1zQQYdm90ZXM22QQYdm90ZXM35QQYdm90ZXM48QQYdm90ZXM5/QQcdm90ZXMxMAkFHHZvdGVzMTEVBRx2b3RlczEyIQUcdm90ZXMxMy0FHHZvdGVzMTQ5BRx2b3RlczE1RQUcdm90ZXMxNlEFAAwgc29sdXRpb25VBRRzY29yZQkCFHJvdW5kBAAIGHZvdGVycwQcdGFyZ2V0cwQGCQIDCAAIBGUFAAAIFHRvdGFsCBh2b3RlcnNpBQMIAG0FBHEFAAIUPHN1Ym1pdF91bnNpZ25lZAEACDByYXdfc29sdXRpb25ZBRx3aXRuZXNzXQVsc2V0X21pbmltdW1fdW50cnVzdGVkX3Njb3JlAQAEQG1heWJlX25leHRfc2NvcmVhBXRzZXRfZW1lcmdlbmN5X2VsZWN0aW9uX3Jlc3VsdAEABCBzdXBwb3J0c3UFGHN1Ym1pdAEABDByYXdfc29sdXRpb25ZBUxnb3Zlcm5hbmNlX2ZhbGxiYWNrAQAIQG1heWJlX21heF92b3RlcnMtBERtYXliZV9tYXhfdGFyZ2V0cy0EAgwUcmViYWcBAAQoZGlzbG9jYXRlZNUDPHB1dF9pbl9mcm9udF9vZgEABBxsaWdodGVy1QNUcHV0X2luX2Zyb250X29mX290aGVyAQAIHGhlYXZpZXLVAxxsaWdodGVy1QMCCCxGcmVlQmFsYW5jZQEBAxxSZXdhcmRzAQEFAgwQTm9vcAEBBQxTZXQBAQEYUmVtb3ZlAQEFAhAwUGVybWlzc2lvbmVkAQEFWFBlcm1pc3Npb25sZXNzQ29tcG91bmQBAQVYUGVybWlzc2lvbmxlc3NXaXRoZHJhdwEBBURQZXJtaXNzaW9ubGVzc0FsbAEBBQJoEGpvaW4BAAgYYW1vdW50CBxwb29sX2lkBChib25kX2V4dHJhAQAEFGV4dHJhgQUwY2xhaW1fcGF5b3V0AQEFGHVuYm9uZAEACDhtZW1iZXJfYWNjb3VudNUDQHVuYm9uZGluZ19wb2ludHMIWHBvb2xfd2l0aGRyYXdfdW5ib25kZWQBAAgccG9vbF9pZARIbnVtX3NsYXNoaW5nX3NwYW5zBER3aXRoZHJhd191bmJvbmRlZAEACDhtZW1iZXJfYWNjb3VudNUDSG51bV9zbGFzaGluZ19zcGFucwQYY3JlYXRlAQAQGGFtb3VudAgQcm9vdNUDJG5vbWluYXRvctUDHGJvdW5jZXLVA0xjcmVhdGVfd2l0aF9wb29sX2lkAQAUGGFtb3VudAgQcm9vdNUDJG5vbWluYXRvctUDHGJvdW5jZXLVAxxwb29sX2lkBCBub21pbmF0ZQEACBxwb29sX2lkBCh2YWxpZGF0b3Jz3QMkc2V0X3N0YXRlAQAIHHBvb2xfaWQEFHN0YXRlHQIwc2V0X21ldGFkYXRhAQAIHHBvb2xfaWQEIG1ldGFkYXRhJCxzZXRfY29uZmlncwEAGDRtaW5fam9pbl9ib25k7QM8bWluX2NyZWF0ZV9ib25k7QMkbWF4X3Bvb2xz8QMsbWF4X21lbWJlcnPxA1BtYXhfbWVtYmVyc19wZXJfcG9vbPEDVGdsb2JhbF9tYXhfY29tbWlzc2lvbvEDMHVwZGF0ZV9yb2xlcwEAEBxwb29sX2lkBCBuZXdfcm9vdIUFNG5ld19ub21pbmF0b3KFBSxuZXdfYm91bmNlcoUFFGNoaWxsAQAEHHBvb2xfaWQEQGJvbmRfZXh0cmFfb3RoZXIBAAgYbWVtYmVy1QMUZXh0cmGBBVBzZXRfY2xhaW1fcGVybWlzc2lvbgEABChwZXJtaXNzaW9uiQVIY2xhaW1fcGF5b3V0X290aGVyAQAEFG90aGVyADhzZXRfY29tbWlzc2lvbgEACBxwb29sX2lkBDhuZXdfY29tbWlzc2lvbiUCSHNldF9jb21taXNzaW9uX21heAEACBxwb29sX2lkBDhtYXhfY29tbWlzc2lvbgRoc2V0X2NvbW1pc3Npb25fY2hhbmdlX3JhdGUBAAgccG9vbF9pZAQsY2hhbmdlX3JhdGUpAkBjbGFpbV9jb21taXNzaW9uAQAEHHBvb2xfaWQETGFkanVzdF9wb29sX2RlcG9zaXQBAAQccG9vbF9pZAR8c2V0X2NvbW1pc3Npb25fY2xhaW1fcGVybWlzc2lvbgEACBxwb29sX2lkBChwZXJtaXNzaW9uMQIsYXBwbHlfc2xhc2gBAAQ4bWVtYmVyX2FjY291bnTVA0htaWdyYXRlX2RlbGVnYXRpb24BAAQ4bWVtYmVyX2FjY291bnTVA3htaWdyYXRlX3Bvb2xfdG9fZGVsZWdhdGVfc3Rha2UBAAQccG9vbF9pZAQCDFRyZWdpc3Rlcl9mYXN0X3Vuc3Rha2UBAQUoZGVyZWdpc3RlcgEBBRxjb250cm9sAQAENGVyYXNfdG9fY2hlY2sEAAhMbWF4X2NhbmRpZGF0ZV9kZXB0aARQYWxsb3dlZF9hbmNlc3RyeV9sZW4EAgggUHJlY2hlY2sBAQUcUHJlcGFyZQEBBQIIHEJhY2tpbmcBAQUgQXBwcm92YWwBAQUCHDhNYXhNZW1vcnlQYWdlcwEBAjxTdGFja0xvZ2ljYWxNYXgBAQI4U3RhY2tOYXRpdmVNYXgBAQJQUHJlY2hlY2tpbmdNYXhNZW1vcnkBAQM4UHZmUHJlcFRpbWVvdXQBAwiZBQg4UHZmRXhlY1RpbWVvdXQBAwidBQhEV2FzbUV4dEJ1bGtNZW1vcnkBAQUEoQUAACxgZ3JvdXBfcm90YXRpb25fZnJlcXVlbmN5BGRwYXJhc19hdmFpbGFiaWxpdHlfcGVyaW9kBFxtYXhfdmFsaWRhdG9yc19wZXJfY29yZS0EJGxvb2thaGVhZAQkbnVtX2NvcmVzBGRtYXhfYXZhaWxhYmlsaXR5X3RpbWVvdXRzBGBvbl9kZW1hbmRfcXVldWVfbWF4X3NpemUEiG9uX2RlbWFuZF90YXJnZXRfcXVldWVfdXRpbGl6YXRpb24EZG9uX2RlbWFuZF9mZWVfdmFyaWFiaWxpdHkESG9uX2RlbWFuZF9iYXNlX2ZlZQgMdHRsBALAfHNldF92YWxpZGF0aW9uX3VwZ3JhZGVfY29vbGRvd24BAAQMbmV3BHBzZXRfdmFsaWRhdGlvbl91cGdyYWRlX2RlbGF5AQAEDG5ldwRkc2V0X2NvZGVfcmV0ZW50aW9uX3BlcmlvZAEABAxuZXcERHNldF9tYXhfY29kZV9zaXplAQAEDG5ldwRAc2V0X21heF9wb3Zfc2l6ZQEABAxuZXcEWHNldF9tYXhfaGVhZF9kYXRhX3NpemUBAAQMbmV3BEhzZXRfY29yZXRpbWVfY29yZXMBAAQMbmV3BHRzZXRfbWF4X2F2YWlsYWJpbGl0eV90aW1lb3V0cwEABAxuZXcEcHNldF9ncm91cF9yb3RhdGlvbl9mcmVxdWVuY3kBAAQMbmV3BHRzZXRfcGFyYXNfYXZhaWxhYmlsaXR5X3BlcmlvZAEABAxuZXcEYHNldF9zY2hlZHVsaW5nX2xvb2thaGVhZAEABAxuZXcEbHNldF9tYXhfdmFsaWRhdG9yc19wZXJfY29yZQEABAxuZXctBEhzZXRfbWF4X3ZhbGlkYXRvcnMBAAQMbmV3LQRIc2V0X2Rpc3B1dGVfcGVyaW9kAQAEDG5ldwS0c2V0X2Rpc3B1dGVfcG9zdF9jb25jbHVzaW9uX2FjY2VwdGFuY2VfcGVyaW9kAQAEDG5ldwREc2V0X25vX3Nob3dfc2xvdHMBAAQMbmV3BFBzZXRfbl9kZWxheV90cmFuY2hlcwEABAxuZXcEeHNldF96ZXJvdGhfZGVsYXlfdHJhbmNoZV93aWR0aAEABAxuZXcEUHNldF9uZWVkZWRfYXBwcm92YWxzAQAEDG5ldwRwc2V0X3JlbGF5X3ZyZl9tb2R1bG9fc2FtcGxlcwEABAxuZXcEaHNldF9tYXhfdXB3YXJkX3F1ZXVlX2NvdW50AQAEDG5ldwRkc2V0X21heF91cHdhcmRfcXVldWVfc2l6ZQEABAxuZXcEdHNldF9tYXhfZG93bndhcmRfbWVzc2FnZV9zaXplAQAEDG5ldwRsc2V0X21heF91cHdhcmRfbWVzc2FnZV9zaXplAQAEDG5ldwSgc2V0X21heF91cHdhcmRfbWVzc2FnZV9udW1fcGVyX2NhbmRpZGF0ZQEABAxuZXcEZHNldF9ocm1wX29wZW5fcmVxdWVzdF90dGwBAAQMbmV3BFxzZXRfaHJtcF9zZW5kZXJfZGVwb3NpdAEABAxuZXcIaHNldF9ocm1wX3JlY2lwaWVudF9kZXBvc2l0AQAEDG5ldwh0c2V0X2hybXBfY2hhbm5lbF9tYXhfY2FwYWNpdHkBAAQMbmV3BHxzZXRfaHJtcF9jaGFubmVsX21heF90b3RhbF9zaXplAQAEDG5ldwScc2V0X2hybXBfbWF4X3BhcmFjaGFpbl9pbmJvdW5kX2NoYW5uZWxzAQAEDG5ldwSEc2V0X2hybXBfY2hhbm5lbF9tYXhfbWVzc2FnZV9zaXplAQAEDG5ldwSgc2V0X2hybXBfbWF4X3BhcmFjaGFpbl9vdXRib3VuZF9jaGFubmVscwEABAxuZXcEmHNldF9ocm1wX21heF9tZXNzYWdlX251bV9wZXJfY2FuZGlkYXRlAQAEDG5ldwRIc2V0X3B2Zl92b3RpbmdfdHRsAQAEDG5ldwSQc2V0X21pbmltdW1fdmFsaWRhdGlvbl91cGdyYWRlX2RlbGF5AQAEDG5ldwRwc2V0X2J5cGFzc19jb25zaXN0ZW5jeV9jaGVjawEABAxuZXcUYHNldF9hc3luY19iYWNraW5nX3BhcmFtcwEABAxuZXeVBUxzZXRfZXhlY3V0b3JfcGFyYW1zAQAEDG5ld6UFWHNldF9vbl9kZW1hbmRfYmFzZV9mZWUBAAQMbmV3CHRzZXRfb25fZGVtYW5kX2ZlZV92YXJpYWJpbGl0eQEABAxuZXcEcHNldF9vbl9kZW1hbmRfcXVldWVfbWF4X3NpemUBAAQMbmV3BJhzZXRfb25fZGVtYW5kX3RhcmdldF9xdWV1ZV91dGlsaXphdGlvbgEABAxuZXcERHNldF9vbl9kZW1hbmRfdHRsAQAEDG5ldwRkc2V0X21pbmltdW1fYmFja2luZ192b3RlcwEABAxuZXcEQHNldF9ub2RlX2ZlYXR1cmUBAAgUaW5kZXgEFHZhbHVlFGhzZXRfYXBwcm92YWxfdm90aW5nX3BhcmFtcwEABAxuZXcEUHNldF9zY2hlZHVsZXJfcGFyYW1zAQAEDG5ld6kFAQQADBxwYXlsb2FksQU8dmFsaWRhdG9yX2luZGV4BCRzaWduYXR1cmVBAgS1BQAACCRyZWNpcGllbnQEEGRhdGEkBL0FAAYkABg8dXB3YXJkX21lc3NhZ2VzfQNMaG9yaXpvbnRhbF9tZXNzYWdlc8EFTG5ld192YWxpZGF0aW9uX2NvZGXFBSRoZWFkX2RhdGEkbHByb2Nlc3NlZF9kb3dud2FyZF9tZXNzYWdlcwQ4aHJtcF93YXRlcm1hcmsEAAgoZGVzY3JpcHRvckUCLGNvbW1pdG1lbnRzyQUCCCBJbXBsaWNpdAEFAQEBIEV4cGxpY2l0AQUBAQEE0QUAAAwkY2FuZGlkYXRlzQU4dmFsaWRpdHlfdm90ZXPVBUR2YWxpZGF0b3JfaW5kaWNlc7EFBNkFAAIUIEV4cGxpY2l0AQEFPEJhY2tpbmdTZWNvbmRlZAEFAYAwQmFja2luZ1ZhbGlkAQUBgEBBcHByb3ZhbENoZWNraW5nAQEFiEFwcHJvdmFsQ2hlY2tpbmdNdWx0aXBsZUNhbmRpZGF0ZXMBBCAAAgQgRXhwbGljaXQBAQUCCBRWYWxpZAECFCBFeHBsaWNpdAEBBTxCYWNraW5nU2Vjb25kZWQBBQGAMEJhY2tpbmdWYWxpZAEFAYBAQXBwcm92YWxDaGVja2luZwEBBYhBcHByb3ZhbENoZWNraW5nTXVsdGlwbGVDYW5kaWRhdGVzAQQgABxJbnZhbGlkAQIEIEV4cGxpY2l0AQEFAwzpBQRBAgTtBQAADDhjYW5kaWRhdGVfaGFzaCAcc2Vzc2lvbgQoc3RhdGVtZW50c/EFBPUFAAAQJGJpdGZpZWxkc7kFRGJhY2tlZF9jYW5kaWRhdGVz3QUgZGlzcHV0ZXP5BTRwYXJlbnRfaGVhZGVytQMCBBRlbnRlcgEABBBkYXRh/QUAEBhhY2NlcHQUHHN1YmplY3QgNHNlc3Npb25faW5kZXgEPHZhbGlkYXRvcl9pbmRleAQCJFhmb3JjZV9zZXRfY3VycmVudF9jb2RlAQAIEHBhcmEEIG5ld19jb2RlJFhmb3JjZV9zZXRfY3VycmVudF9oZWFkAQAIEHBhcmEEIG5ld19oZWFkJGxmb3JjZV9zY2hlZHVsZV9jb2RlX3VwZ3JhZGUBAAwQcGFyYQQgbmV3X2NvZGUkTHJlbGF5X3BhcmVudF9udW1iZXIETGZvcmNlX25vdGVfbmV3X2hlYWQBAAgQcGFyYQQgbmV3X2hlYWQkSGZvcmNlX3F1ZXVlX2FjdGlvbgEABBBwYXJhBGxhZGRfdHJ1c3RlZF92YWxpZGF0aW9uX2NvZGUBAAQ8dmFsaWRhdGlvbl9jb2RlJGxwb2tlX3VudXNlZF92YWxpZGF0aW9uX2NvZGUBAARQdmFsaWRhdGlvbl9jb2RlX2hhc2ggbGluY2x1ZGVfcHZmX2NoZWNrX3N0YXRlbWVudAEACBBzdG10BQYkc2lnbmF0dXJlQQJ0Zm9yY2Vfc2V0X21vc3RfcmVjZW50X2NvbnRleHQBAAgQcGFyYQQcY29udGV4dAQCBDRmb3JjZV9hcHByb3ZlAQAEFHVwX3RvBAIsWGhybXBfaW5pdF9vcGVuX2NoYW5uZWwBAAwkcmVjaXBpZW50BFRwcm9wb3NlZF9tYXhfY2FwYWNpdHkEZHByb3Bvc2VkX21heF9tZXNzYWdlX3NpemUEYGhybXBfYWNjZXB0X29wZW5fY2hhbm5lbAEABBhzZW5kZXIESGhybXBfY2xvc2VfY2hhbm5lbAEABChjaGFubmVsX2lkVQJAZm9yY2VfY2xlYW5faHJtcAEADBBwYXJhBCxudW1faW5ib3VuZAQwbnVtX291dGJvdW5kBFxmb3JjZV9wcm9jZXNzX2hybXBfb3BlbgEABCBjaGFubmVscwRgZm9yY2VfcHJvY2Vzc19ocm1wX2Nsb3NlAQAEIGNoYW5uZWxzBGBocm1wX2NhbmNlbF9vcGVuX3JlcXVlc3QBAAgoY2hhbm5lbF9pZFUCNG9wZW5fcmVxdWVzdHMEXGZvcmNlX29wZW5faHJtcF9jaGFubmVsAQAQGHNlbmRlcgQkcmVjaXBpZW50BDBtYXhfY2FwYWNpdHkEQG1heF9tZXNzYWdlX3NpemUEYGVzdGFibGlzaF9zeXN0ZW1fY2hhbm5lbAEACBhzZW5kZXIEJHJlY2lwaWVudARUcG9rZV9jaGFubmVsX2RlcG9zaXRzAQAIGHNlbmRlcgQkcmVjaXBpZW50BHRlc3RhYmxpc2hfY2hhbm5lbF93aXRoX3N5c3RlbQEABEx0YXJnZXRfc3lzdGVtX2NoYWluBAIEOGZvcmNlX3VuZnJlZXplAQEFAAg0c2Vzc2lvbl9pbmRleAQ4Y2FuZGlkYXRlX2hhc2ggAggoRm9ySW52YWxpZAEBBTBBZ2FpbnN0VmFsaWQBAQUAECR0aW1lX3Nsb3QZBhBraW5kHQY8dmFsaWRhdG9yX2luZGV4BDB2YWxpZGF0b3JfaWQgAgRwcmVwb3J0X2Rpc3B1dGVfbG9zdF91bnNpZ25lZAEACDRkaXNwdXRlX3Byb29mIQY8a2V5X293bmVyX3Byb29mvQMCCFxwbGFjZV9vcmRlcl9hbGxvd19kZWF0aAEACChtYXhfYW1vdW50CBxwYXJhX2lkBFhwbGFjZV9vcmRlcl9rZWVwX2FsaXZlAQAIKG1heF9hbW91bnQIHHBhcmFfaWQEAiQgcmVnaXN0ZXIBAAwIaWQEMGdlbmVzaXNfaGVhZCQ8dmFsaWRhdGlvbl9jb2RlJDhmb3JjZV9yZWdpc3RlcgEAFAx3aG8AHGRlcG9zaXQICGlkBDBnZW5lc2lzX2hlYWQkPHZhbGlkYXRpb25fY29kZSQoZGVyZWdpc3RlcgEABAhpZAQQc3dhcAEACAhpZAQUb3RoZXIELHJlbW92ZV9sb2NrAQAEEHBhcmEEHHJlc2VydmUBAQUgYWRkX2xvY2sBAAQQcGFyYQRUc2NoZWR1bGVfY29kZV91cGdyYWRlAQAIEHBhcmEEIG5ld19jb2RlJEBzZXRfY3VycmVudF9oZWFkAQAIEHBhcmEEIG5ld19oZWFkJAIMLGZvcmNlX2xlYXNlAQAUEHBhcmEEGGxlYXNlcgAYYW1vdW50CDBwZXJpb2RfYmVnaW4EMHBlcmlvZF9jb3VudARAY2xlYXJfYWxsX2xlYXNlcwEABBBwYXJhBDx0cmlnZ2VyX29uYm9hcmQBAAQQcGFyYQQCDCxuZXdfYXVjdGlvbgEACCBkdXJhdGlvbgRIbGVhc2VfcGVyaW9kX2luZGV4BAxiaWQBABQQcGFyYQQ0YXVjdGlvbl9pbmRleAQoZmlyc3Rfc2xvdAQkbGFzdF9zbG90BBhhbW91bnQIOGNhbmNlbF9hdWN0aW9uAQEFAgwcRWQyNTUxOQEFAYAcU3IyNTUxOQEFAYAURWNkc2EBBQGEBjkGAgwcRWQyNTUxOQEFAQEBHFNyMjU1MTkBBQEBARRFY2RzYQEFAQUBBkEGAiQYY3JlYXRlAQAYFGluZGV4BAxjYXAIMGZpcnN0X3BlcmlvZAQsbGFzdF9wZXJpb2QEDGVuZAQgdmVyaWZpZXI9Bihjb250cmlidXRlAQAMFGluZGV4BBR2YWx1ZQgkc2lnbmF0dXJlRQYgd2l0aGRyYXcBAAgMd2hvABRpbmRleAQYcmVmdW5kAQAEFGluZGV4BCBkaXNzb2x2ZQEABBRpbmRleAQQZWRpdAEAGBRpbmRleAQMY2FwCDBmaXJzdF9wZXJpb2QELGxhc3RfcGVyaW9kBAxlbmQEIHZlcmlmaWVyPQYgYWRkX21lbW8BAAgUaW5kZXgEEG1lbW8kEHBva2UBAAQUaW5kZXgEOGNvbnRyaWJ1dGVfYWxsAQAIFGluZGV4BCRzaWduYXR1cmVFBgIMEElkbGUBAQUQUG9vbAEBBRBUYXNrAQECAwhNBgQEUQYAAgxIcmVxdWVzdF9jb3JlX2NvdW50AQAEFGNvdW50BEhyZXF1ZXN0X3JldmVudWVfYXQBAAQQd2hlbgQsYXNzaWduX2NvcmUBABAQY29yZQQUYmVnaW4EKGFzc2lnbm1lbnRVBiBlbmRfaGludC0EAAgQc2l6ZQQQaXRlbQQGXQYCDBxUb1N0YXJ0AQEFHExhc3RLZXkBBQAgQ29tcGxldGUBAQUAFDBwcm9ncmVzc190b3BlBjhwcm9ncmVzc19jaGlsZGUGEHNpemUEJHRvcF9pdGVtcwQsY2hpbGRfaXRlbXMEAhhYY29udHJvbF9hdXRvX21pZ3JhdGlvbgEABDBtYXliZV9jb25maWdhBkBjb250aW51ZV9taWdyYXRlAQAMGGxpbWl0c10GPHJlYWxfc2l6ZV91cHBlcgQwd2l0bmVzc190YXNraQZIbWlncmF0ZV9jdXN0b21fdG9wAQAIEGtleXN9AzB3aXRuZXNzX3NpemUEUG1pZ3JhdGVfY3VzdG9tX2NoaWxkAQAMEHJvb3QkKGNoaWxkX2tleXN9Ayh0b3RhbF9zaXplBFRzZXRfc2lnbmVkX21heF9saW1pdHMBAAQYbGltaXRzXQZIZm9yY2Vfc2V0X3Byb2dyZXNzAQAIMHByb2dyZXNzX3RvcGUGOHByb2dyZXNzX2NoaWxkZQYCaCBPdmVyZmxvdwEBBTRVbmltcGxlbWVudGVkAQEFYFVudHJ1c3RlZFJlc2VydmVMb2NhdGlvbgEBBWRVbnRydXN0ZWRUZWxlcG9ydExvY2F0aW9uAQEFRE11bHRpTG9jYXRpb25GdWxsAQEFaE11bHRpTG9jYXRpb25Ob3RJbnZlcnRpYmxlAQEFJEJhZE9yaWdpbgEBBTxJbnZhbGlkTG9jYXRpb24BAQU0QXNzZXROb3RGb3VuZAEBBVRGYWlsZWRUb1RyYW5zYWN0QXNzZXQBAQU8Tm90V2l0aGRyYXdhYmxlAQEFSExvY2F0aW9uQ2Fubm90SG9sZAEBBVRFeGNlZWRzTWF4TWVzc2FnZVNpemUBAQVYRGVzdGluYXRpb25VbnN1cHBvcnRlZAEBBSRUcmFuc3BvcnQBAQUoVW5yb3V0YWJsZQEBBTBVbmtub3duQ2xhaW0BAQU4RmFpbGVkVG9EZWNvZGUBAQVATWF4V2VpZ2h0SW52YWxpZAEBBThOb3RIb2xkaW5nRmVlcwEBBTBUb29FeHBlbnNpdmUBAQUQVHJhcAEBA0xVbmhhbmRsZWRYY21WZXJzaW9uAQEFSFdlaWdodExpbWl0UmVhY2hlZAEBAxxCYXJyaWVyAQEFTFdlaWdodE5vdENvbXB1dGFibGUBAQUDCARxBgZ1BgIQEE51bGwBAQUYQXNzZXRzAQQJAwA8RXhlY3V0aW9uUmVzdWx0AQZ1BhxWZXJzaW9uAQECAggMQWxsAQEFFEFsbE9mAQAICGlk/QIMZnVu5QICCCBEZWZpbml0ZQEECQMAEFdpbGQBAggMQWxsAQEFFEFsbE9mAQAICGlk/QIMZnVu5QICCCRVbmxpbWl0ZWQBAQUcTGltaXRlZAEBAwJwNFdpdGhkcmF3QXNzZXQBBAkDAFRSZXNlcnZlQXNzZXREZXBvc2l0ZWQBBAkDAFhSZWNlaXZlVGVsZXBvcnRlZEFzc2V0AQQJAwA0UXVlcnlSZXNwb25zZQEADCBxdWVyeV9pZAggcmVzcG9uc2V9BihtYXhfd2VpZ2h0CDRUcmFuc2ZlckFzc2V0AQAIGGFzc2V0cw0DLGJlbmVmaWNpYXJ5lQFQVHJhbnNmZXJSZXNlcnZlQXNzZXQBAAwYYXNzZXRzDQMQZGVzdJUBDHhjbZEGIFRyYW5zYWN0AQAMLG9yaWdpbl90eXBlwQJYcmVxdWlyZV93ZWlnaHRfYXRfbW9zdAgQY2FsbCRkSHJtcE5ld0NoYW5uZWxPcGVuUmVxdWVzdAEADBhzZW5kZXIEQG1heF9tZXNzYWdlX3NpemUEMG1heF9jYXBhY2l0eQRMSHJtcENoYW5uZWxBY2NlcHRlZAEABCRyZWNpcGllbnQESEhybXBDaGFubmVsQ2xvc2luZwEADCRpbml0aWF0b3IEGHNlbmRlcgQkcmVjaXBpZW50BCxDbGVhck9yaWdpbgEBBTREZXNjZW5kT3JpZ2luAQIkEEhlcmUBAQUIWDEBAiQkUGFyYWNoYWluAQECLEFjY291bnRJZDMyAQAIHG5ldHdvcmuFAQhpZCA4QWNjb3VudEluZGV4NjQBAAgcbmV0d29ya4UBFGluZGV4CDBBY2NvdW50S2V5MjABAAgcbmV0d29ya4UBDGtleWUBOFBhbGxldEluc3RhbmNlAQECMEdlbmVyYWxJbmRleAEBAyhHZW5lcmFsS2V5AQUAJE9ubHlDaGlsZAEBBSRQbHVyYWxpdHkBAAgIaWSJARBwYXJ0bQEIWDIBBI0BAQgIWDMBBI0BAQwIWDQBBI0BARAIWDUBBI0BARQIWDYBBI0BARgIWDcBBI0BARwIWDgBBI0BASAsUmVwb3J0RXJyb3IBAAwgcXVlcnlfaWQIEGRlc3SVAUxtYXhfcmVzcG9uc2Vfd2VpZ2h0CDBEZXBvc2l0QXNzZXQBAAwYYXNzZXRzhQYobWF4X2Fzc2V0cwQsYmVuZWZpY2lhcnmVAUxEZXBvc2l0UmVzZXJ2ZUFzc2V0AQAQGGFzc2V0c4UGKG1heF9hc3NldHMEEGRlc3SVAQx4Y22RBjRFeGNoYW5nZUFzc2V0AQAIEGdpdmWFBhxyZWNlaXZlDQNcSW5pdGlhdGVSZXNlcnZlV2l0aGRyYXcBAAwYYXNzZXRzhQYccmVzZXJ2ZZUBDHhjbZEGQEluaXRpYXRlVGVsZXBvcnQBAAwYYXNzZXRzhQYQZGVzdJUBDHhjbZEGMFF1ZXJ5SG9sZGluZwEAECBxdWVyeV9pZAgQZGVzdJUBGGFzc2V0c4UGTG1heF9yZXNwb25zZV93ZWlnaHQIMEJ1eUV4ZWN1dGlvbgEACBBmZWVzCQMwd2VpZ2h0X2xpbWl0iQY0UmVmdW5kU3VycGx1cwEBBTxTZXRFcnJvckhhbmRsZXIBBI0GACxTZXRBcHBlbmRpeAEEjQYAKENsZWFyRXJyb3IBAQUoQ2xhaW1Bc3NldAEACBhhc3NldHMNAxh0aWNrZXSVARBUcmFwAQEDQFN1YnNjcmliZVZlcnNpb24BAAggcXVlcnlfaWQITG1heF9yZXNwb25zZV93ZWlnaHQISFVuc3Vic2NyaWJlVmVyc2lvbgEBBQSNBgACGBBOdWxsAQEFGEFzc2V0cwEEEQMAPEV4ZWN1dGlvblJlc3VsdAEGpQIcVmVyc2lvbgEBAixQYWxsZXRzSW5mbwEErQIAOERpc3BhdGNoUmVzdWx0AQIMHFN1Y2Nlc3MBAQUURXJyb3IBBQA4VHJ1bmNhdGVkRXJyb3IBBQACEAxBbGwBAQUUQWxsT2YBAAgIaWR9AQxmdW7lAihBbGxDb3VudGVkAQECMEFsbE9mQ291bnRlZAEADAhpZH0BDGZ1buUCFGNvdW50BAIIIERlZmluaXRlAQQRAwAQV2lsZAECEAxBbGwBAQUUQWxsT2YBAAgIaWR9AQxmdW7lAihBbGxDb3VudGVkAQECMEFsbE9mQ291bnRlZAEADAhpZH0BDGZ1buUCFGNvdW50BALANFdpdGhkcmF3QXNzZXQBBBEDAFRSZXNlcnZlQXNzZXREZXBvc2l0ZWQBBBEDAFhSZWNlaXZlVGVsZXBvcnRlZEFzc2V0AQQRAwA0UXVlcnlSZXNwb25zZQEAECBxdWVyeV9pZAggcmVzcG9uc2WVBihtYXhfd2VpZ2h0GBxxdWVyaWVyvQI0VHJhbnNmZXJBc3NldAEACBhhc3NldHMVAyxiZW5lZmljaWFyeXkBUFRyYW5zZmVyUmVzZXJ2ZUFzc2V0AQAMGGFzc2V0cxUDEGRlc3R5AQx4Y22lBiBUcmFuc2FjdAEADCxvcmlnaW5fa2luZMECWHJlcXVpcmVfd2VpZ2h0X2F0X21vc3QYEGNhbGwkZEhybXBOZXdDaGFubmVsT3BlblJlcXVlc3QBAAwYc2VuZGVyBEBtYXhfbWVzc2FnZV9zaXplBDBtYXhfY2FwYWNpdHkETEhybXBDaGFubmVsQWNjZXB0ZWQBAAQkcmVjaXBpZW50BEhIcm1wQ2hhbm5lbENsb3NpbmcBAAwkaW5pdGlhdG9yBBhzZW5kZXIEJHJlY2lwaWVudAQsQ2xlYXJPcmlnaW4BAQU0RGVzY2VuZE9yaWdpbgECJBBIZXJlAQEFCFgxAQIoJFBhcmFjaGFpbgEBAixBY2NvdW50SWQzMgEACBxuZXR3b3JrYQEIaWQgOEFjY291bnRJbmRleDY0AQAIHG5ldHdvcmthARRpbmRleAgwQWNjb3VudEtleTIwAQAIHG5ldHdvcmthAQxrZXllAThQYWxsZXRJbnN0YW5jZQEBAjBHZW5lcmFsSW5kZXgBAQMoR2VuZXJhbEtleQEACBhsZW5ndGgEEGRhdGEgJE9ubHlDaGlsZAEBBSRQbHVyYWxpdHkBAAgIaWRpARBwYXJ0bQE8R2xvYmFsQ29uc2Vuc3VzAQIsJEJ5R2VuZXNpcwEFAYAYQnlGb3JrAQAIMGJsb2NrX251bWJlcggoYmxvY2tfaGFzaCAgUG9sa2Fkb3QBAQUYS3VzYW1hAQEFHFdlc3RlbmQBAQUYUm9jb2NvAQEFGFdvY29jbwEBBSBFdGhlcmV1bQEABCBjaGFpbl9pZAgsQml0Y29pbkNvcmUBAQUsQml0Y29pbkNhc2gBAQVAUG9sa2Fkb3RCdWxsZXRpbgEBBQhYMgEEcQEBCAhYMwEEcQEBDAhYNAEEcQEBEAhYNQEEcQEBFAhYNgEEcQEBGAhYNwEEcQEBHAhYOAEEcQEBICxSZXBvcnRFcnJvcgEADCxkZXN0aW5hdGlvbnkBIHF1ZXJ5X2lkCChtYXhfd2VpZ2h0GDBEZXBvc2l0QXNzZXQBAAgYYXNzZXRznQYsYmVuZWZpY2lhcnl5AUxEZXBvc2l0UmVzZXJ2ZUFzc2V0AQAMGGFzc2V0c50GEGRlc3R5AQx4Y22lBjRFeGNoYW5nZUFzc2V0AQAMEGdpdmWdBhB3YW50FQMcbWF4aW1hbBRcSW5pdGlhdGVSZXNlcnZlV2l0aGRyYXcBAAwYYXNzZXRznQYccmVzZXJ2ZXkBDHhjbaUGQEluaXRpYXRlVGVsZXBvcnQBAAwYYXNzZXRznQYQZGVzdHkBDHhjbaUGNFJlcG9ydEhvbGRpbmcBAAg0cmVzcG9uc2VfaW5mb+ECGGFzc2V0c50GMEJ1eUV4ZWN1dGlvbgEACBBmZWVzEQMwd2VpZ2h0X2xpbWl08QI0UmVmdW5kU3VycGx1cwEBBTxTZXRFcnJvckhhbmRsZXIBBKEGACxTZXRBcHBlbmRpeAEEoQYAKENsZWFyRXJyb3IBAQUoQ2xhaW1Bc3NldAEACBhhc3NldHMVAxh0aWNrZXR5ARBUcmFwAQEDQFN1YnNjcmliZVZlcnNpb24BAAggcXVlcnlfaWQITG1heF9yZXNwb25zZV93ZWlnaHQYSFVuc3Vic2NyaWJlVmVyc2lvbgEBBSRCdXJuQXNzZXQBBBEDACxFeHBlY3RBc3NldAEEEQMAMEV4cGVjdE9yaWdpbgEGeQEsRXhwZWN0RXJyb3IBBqUCUEV4cGVjdFRyYW5zYWN0U3RhdHVzAQIMHFN1Y2Nlc3MBAQUURXJyb3IBBQA4VHJ1bmNhdGVkRXJyb3IBBQAsUXVlcnlQYWxsZXQBAAgsbW9kdWxlX25hbWUkNHJlc3BvbnNlX2luZm/hAjBFeHBlY3RQYWxsZXQBABQUaW5kZXgEEG5hbWUkLG1vZHVsZV9uYW1lJCxjcmF0ZV9tYWpvcgQ8bWluX2NyYXRlX21pbm9yBFBSZXBvcnRUcmFuc2FjdFN0YXR1cwEADCxkZXN0aW5hdGlvbnkBIHF1ZXJ5X2lkCChtYXhfd2VpZ2h0GExDbGVhclRyYW5zYWN0U3RhdHVzAQEFPFVuaXZlcnNhbE9yaWdpbgECKCRQYXJhY2hhaW4BAQIsQWNjb3VudElkMzIBAAgcbmV0d29ya2EBCGlkIDhBY2NvdW50SW5kZXg2NAEACBxuZXR3b3JrYQEUaW5kZXgIMEFjY291bnRLZXkyMAEACBxuZXR3b3JrYQEMa2V5ZQE4UGFsbGV0SW5zdGFuY2UBAQIwR2VuZXJhbEluZGV4AQEDKEdlbmVyYWxLZXkBAAgYbGVuZ3RoBBBkYXRhICRPbmx5Q2hpbGQBAQUkUGx1cmFsaXR5AQAICGlkaQEQcGFydG0BPEdsb2JhbENvbnNlbnN1cwECLCRCeUdlbmVzaXMBBQGAGEJ5Rm9yawEACDBibG9ja19udW1iZXIIKGJsb2NrX2hhc2ggIFBvbGthZG90AQEFGEt1c2FtYQEBBRxXZXN0ZW5kAQEFGFJvY29jbwEBBRhXb2NvY28BAQUgRXRoZXJldW0BAAQgY2hhaW5faWQILEJpdGNvaW5Db3JlAQEFLEJpdGNvaW5DYXNoAQEFQFBvbGthZG90QnVsbGV0aW4BAQU0RXhwb3J0TWVzc2FnZQEADBxuZXR3b3JrXQEsZGVzdGluYXRpb251AQx4Y22lBiRMb2NrQXNzZXQBAAgUYXNzZXQRAyB1bmxvY2tlcnkBLFVubG9ja0Fzc2V0AQAIFGFzc2V0EQMYdGFyZ2V0eQE4Tm90ZVVubG9ja2FibGUBAAgUYXNzZXQRAxRvd25lcnkBNFJlcXVlc3RVbmxvY2sBAAgUYXNzZXQRAxhsb2NrZXJ5ASxTZXRGZWVzTW9kZQEABDBqaXRfd2l0aGRyYXcUIFNldFRvcGljAQUBgChDbGVhclRvcGljAQEFLEFsaWFzT3JpZ2luAQAIHHBhcmVudHMEIGludGVyaW9ydQE8VW5wYWlkRXhlY3V0aW9uAQAIMHdlaWdodF9saW1pdPECMGNoZWNrX29yaWdpbr0CBKEGAAIMCFYyAQSNBgAIVjMBBKEGAAhWNAEE9QIAAhAgVGVsZXBvcnQBAQUwTG9jYWxSZXNlcnZlAQEFSERlc3RpbmF0aW9uUmVzZXJ2ZQEBBTRSZW1vdGVSZXNlcnZlAQIMCFYyAQAIHHBhcmVudHMEIGludGVyaW9ykQEIVjMBAAgccGFyZW50cwQgaW50ZXJpb3J1AQhWNAEACBxwYXJlbnRzBCBpbnRlcmlvcnUBAggIVjMBAgggQ29uY3JldGUBAAgccGFyZW50cwQgaW50ZXJpb3J1ASBBYnN0cmFjdAEFAYAIVjQBAAgccGFyZW50cwQgaW50ZXJpb3J1AQI4EHNlbmQBAAgQZGVzdJkBHG1lc3NhZ2WpBjx0ZWxlcG9ydF9hc3NldHMBABAQZGVzdJkBLGJlbmVmaWNpYXJ5mQEYYXNzZXRzGQM4ZmVlX2Fzc2V0X2l0ZW0EXHJlc2VydmVfdHJhbnNmZXJfYXNzZXRzAQAQEGRlc3SZASxiZW5lZmljaWFyeZkBGGFzc2V0cxkDOGZlZV9hc3NldF9pdGVtBBxleGVjdXRlAQAIHG1lc3NhZ2WpBihtYXhfd2VpZ2h0GERmb3JjZV94Y21fdmVyc2lvbgEACCBsb2NhdGlvbnkBHHZlcnNpb24EZGZvcmNlX2RlZmF1bHRfeGNtX3ZlcnNpb24BAAREbWF5YmVfeGNtX3ZlcnNpb24tBHhmb3JjZV9zdWJzY3JpYmVfdmVyc2lvbl9ub3RpZnkBAAQgbG9jYXRpb26ZAYBmb3JjZV91bnN1YnNjcmliZV92ZXJzaW9uX25vdGlmeQEABCBsb2NhdGlvbpkBfGxpbWl0ZWRfcmVzZXJ2ZV90cmFuc2Zlcl9hc3NldHMBABQQZGVzdJkBLGJlbmVmaWNpYXJ5mQEYYXNzZXRzGQM4ZmVlX2Fzc2V0X2l0ZW0EMHdlaWdodF9saW1pdPECXGxpbWl0ZWRfdGVsZXBvcnRfYXNzZXRzAQAUEGRlc3SZASxiZW5lZmljaWFyeZkBGGFzc2V0cxkDOGZlZV9hc3NldF9pdGVtBDB3ZWlnaHRfbGltaXTxAkBmb3JjZV9zdXNwZW5zaW9uAQAEJHN1c3BlbmRlZBQ8dHJhbnNmZXJfYXNzZXRzAQAUEGRlc3SZASxiZW5lZmljaWFyeZkBGGFzc2V0cxkDOGZlZV9hc3NldF9pdGVtBDB3ZWlnaHRfbGltaXTxAjBjbGFpbV9hc3NldHMBAAgYYXNzZXRzGQMsYmVuZWZpY2lhcnmZAYx0cmFuc2Zlcl9hc3NldHNfdXNpbmdfdHlwZV9hbmRfdGhlbgEAHBBkZXN0mQEYYXNzZXRzGQNQYXNzZXRzX3RyYW5zZmVyX3R5cGWtBjhyZW1vdGVfZmVlc19pZLEGSGZlZXNfdHJhbnNmZXJfdHlwZa0GSGN1c3RvbV94Y21fb25fZGVzdKkGMHdlaWdodF9saW1pdPECAggkcmVhcF9wYWdlAQAIOG1lc3NhZ2Vfb3JpZ2luJQMocGFnZV9pbmRleARIZXhlY3V0ZV9vdmVyd2VpZ2h0AQAQOG1lc3NhZ2Vfb3JpZ2luJQMQcGFnZQQUaW5kZXgEMHdlaWdodF9saW1pdBgCDBhjcmVhdGUBAAgoYXNzZXRfa2luZIEBEHJhdGUIGHVwZGF0ZQEACChhc3NldF9raW5kgQEQcmF0ZQgYcmVtb3ZlAQAEKGFzc2V0X2tpbmSBAQUBCAMIwQYkBMUGAAAMHHBheWxvYWTJBjBibG9ja19udW1iZXIEQHZhbGlkYXRvcl9zZXRfaWQIAAwoY29tbWl0bWVudM0GCGlkCQQkc2lnbmF0dXJlXQQACBRmaXJzdNEGGHNlY29uZNEGAgxMcmVwb3J0X2VxdWl2b2NhdGlvbgEACEhlcXVpdm9jYXRpb25fcHJvb2bVBjxrZXlfb3duZXJfcHJvb2a9A3ByZXBvcnRfZXF1aXZvY2F0aW9uX3Vuc2lnbmVkAQAISGVxdWl2b2NhdGlvbl9wcm9vZtUGPGtleV9vd25lcl9wcm9vZr0DPHNldF9uZXdfZ2VuZXNpcwEABDxkZWxheV9pbl9ibG9ja3MEArgYU3lzdGVtAQIsGHJlbWFyawEABBhyZW1hcmskOHNldF9oZWFwX3BhZ2VzAQAEFHBhZ2VzCCBzZXRfY29kZQEABBBjb2RlJFxzZXRfY29kZV93aXRob3V0X2NoZWNrcwEABBBjb2RlJCxzZXRfc3RvcmFnZQEABBRpdGVtc3kDMGtpbGxfc3RvcmFnZQEABBBrZXlzfQMsa2lsbF9wcmVmaXgBAAgYcHJlZml4JBxzdWJrZXlzBERyZW1hcmtfd2l0aF9ldmVudAEABBhyZW1hcmskRGF1dGhvcml6ZV91cGdyYWRlAQAEJGNvZGVfaGFzaCCAYXV0aG9yaXplX3VwZ3JhZGVfd2l0aG91dF9jaGVja3MBAAQkY29kZV9oYXNoIGBhcHBseV9hdXRob3JpemVkX3VwZ3JhZGUBAAQQY29kZSQkU2NoZWR1bGVyAQIoIHNjaGVkdWxlAQAQEHdoZW4EOG1heWJlX3BlcmlvZGljgQMgcHJpb3JpdHkEEGNhbGzdBhhjYW5jZWwBAAgQd2hlbgQUaW5kZXgEOHNjaGVkdWxlX25hbWVkAQAUCGlkIBB3aGVuBDhtYXliZV9wZXJpb2RpY4EDIHByaW9yaXR5BBBjYWxs3QYwY2FuY2VsX25hbWVkAQAECGlkIDhzY2hlZHVsZV9hZnRlcgEAEBRhZnRlcgQ4bWF5YmVfcGVyaW9kaWOBAyBwcmlvcml0eQQQY2FsbN0GUHNjaGVkdWxlX25hbWVkX2FmdGVyAQAUCGlkIBRhZnRlcgQ4bWF5YmVfcGVyaW9kaWOBAyBwcmlvcml0eQQQY2FsbN0GJHNldF9yZXRyeQEADBB0YXNrDQEccmV0cmllcwQYcGVyaW9kBDxzZXRfcmV0cnlfbmFtZWQBAAwIaWQgHHJldHJpZXMEGHBlcmlvZAQwY2FuY2VsX3JldHJ5AQAEEHRhc2sNAUhjYW5jZWxfcmV0cnlfbmFtZWQBAAQIaWQgIFByZWltYWdlAQIUNG5vdGVfcHJlaW1hZ2UBAAQUYnl0ZXMkPHVubm90ZV9wcmVpbWFnZQEABBBoYXNoIEByZXF1ZXN0X3ByZWltYWdlAQAEEGhhc2ggSHVucmVxdWVzdF9wcmVpbWFnZQEABBBoYXNoIDhlbnN1cmVfdXBkYXRlZAEABBhoYXNoZXM5AxBCYWJlAQIMTHJlcG9ydF9lcXVpdm9jYXRpb24BAAhIZXF1aXZvY2F0aW9uX3Byb29muQM8a2V5X293bmVyX3Byb29mvQNwcmVwb3J0X2VxdWl2b2NhdGlvbl91bnNpZ25lZAEACEhlcXVpdm9jYXRpb25fcHJvb2a5AzxrZXlfb3duZXJfcHJvb2a9A0hwbGFuX2NvbmZpZ19jaGFuZ2UBAAQYY29uZmlnyQMkVGltZXN0YW1wAQIEDHNldAEABAxub3cIHEluZGljZXMBAhQUY2xhaW0BAAQUaW5kZXgEIHRyYW5zZmVyAQAIDG5ld9UDFGluZGV4BBBmcmVlAQAEFGluZGV4BDhmb3JjZV90cmFuc2ZlcgEADAxuZXfVAxRpbmRleAQYZnJlZXplFBhmcmVlemUBAAQUaW5kZXgEIEJhbGFuY2VzAQIkUHRyYW5zZmVyX2FsbG93X2RlYXRoAQAIEGRlc3TVAxR2YWx1ZQg4Zm9yY2VfdHJhbnNmZXIBAAwYc291cmNl1QMQZGVzdNUDFHZhbHVlCEx0cmFuc2Zlcl9rZWVwX2FsaXZlAQAIEGRlc3TVAxR2YWx1ZQgwdHJhbnNmZXJfYWxsAQAIEGRlc3TVAyhrZWVwX2FsaXZlFDxmb3JjZV91bnJlc2VydmUBAAgMd2hv1QMYYW1vdW50CEB1cGdyYWRlX2FjY291bnRzAQAEDHdob90DRGZvcmNlX3NldF9iYWxhbmNlAQAIDHdob9UDIG5ld19mcmVlCGxmb3JjZV9hZGp1c3RfdG90YWxfaXNzdWFuY2UBAAgkZGlyZWN0aW9u4QMUZGVsdGEIEGJ1cm4BAAgUdmFsdWUIKGtlZXBfYWxpdmUUHFN0YWtpbmcBAngQYm9uZAEACBR2YWx1ZQgUcGF5ZWU1AShib25kX2V4dHJhAQAEOG1heF9hZGRpdGlvbmFsCBh1bmJvbmQBAAQUdmFsdWUIRHdpdGhkcmF3X3VuYm9uZGVkAQAESG51bV9zbGFzaGluZ19zcGFucwQgdmFsaWRhdGUBAAQUcHJlZnM5ASBub21pbmF0ZQEABBx0YXJnZXRz6QMUY2hpbGwBAQUkc2V0X3BheWVlAQAEFHBheWVlNQE4c2V0X2NvbnRyb2xsZXIBAQVMc2V0X3ZhbGlkYXRvcl9jb3VudAEABAxuZXcEYGluY3JlYXNlX3ZhbGlkYXRvcl9jb3VudAEABChhZGRpdGlvbmFsBFRzY2FsZV92YWxpZGF0b3JfY291bnQBAAQYZmFjdG9yBDRmb3JjZV9ub19lcmFzAQEFNGZvcmNlX25ld19lcmEBAQVEc2V0X2ludnVsbmVyYWJsZXMBAAQ0aW52dWxuZXJhYmxlc90DNGZvcmNlX3Vuc3Rha2UBAAgUc3Rhc2gASG51bV9zbGFzaGluZ19zcGFucwRQZm9yY2VfbmV3X2VyYV9hbHdheXMBAQVUY2FuY2VsX2RlZmVycmVkX3NsYXNoAQAIDGVyYQQ0c2xhc2hfaW5kaWNlczkCOHBheW91dF9zdGFrZXJzAQAIPHZhbGlkYXRvcl9zdGFzaAAMZXJhBBhyZWJvbmQBAAQUdmFsdWUIKHJlYXBfc3Rhc2gBAAgUc3Rhc2gASG51bV9zbGFzaGluZ19zcGFucwQQa2ljawEABAx3aG/pA0xzZXRfc3Rha2luZ19jb25maWdzAQAcSG1pbl9ub21pbmF0b3JfYm9uZO0DSG1pbl92YWxpZGF0b3JfYm9uZO0DTG1heF9ub21pbmF0b3JfY291bnTxA0xtYXhfdmFsaWRhdG9yX2NvdW508QM8Y2hpbGxfdGhyZXNob2xk8QM4bWluX2NvbW1pc3Npb27xA0htYXhfc3Rha2VkX3Jld2FyZHPxAyxjaGlsbF9vdGhlcgEABBRzdGFzaABoZm9yY2VfYXBwbHlfbWluX2NvbW1pc3Npb24BAAQ8dmFsaWRhdG9yX3N0YXNoAEhzZXRfbWluX2NvbW1pc3Npb24BAAQMbmV3BFhwYXlvdXRfc3Rha2Vyc19ieV9wYWdlAQAMPHZhbGlkYXRvcl9zdGFzaAAMZXJhBBBwYWdlBDB1cGRhdGVfcGF5ZWUBAAQoY29udHJvbGxlcgBoZGVwcmVjYXRlX2NvbnRyb2xsZXJfYmF0Y2gBAAQsY29udHJvbGxlcnPdAzhyZXN0b3JlX2xlZGdlcgEAEBRzdGFzaABAbWF5YmVfY29udHJvbGxlcgUCLG1heWJlX3RvdGFs9QM8bWF5YmVfdW5sb2NraW5nAQQcU2Vzc2lvbgECCCBzZXRfa2V5cwEACBBrZXlzDQQUcHJvb2YkKHB1cmdlX2tleXMBAQUcR3JhbmRwYQECDExyZXBvcnRfZXF1aXZvY2F0aW9uAQAISGVxdWl2b2NhdGlvbl9wcm9vZiUEPGtleV9vd25lcl9wcm9vZr0DcHJlcG9ydF9lcXVpdm9jYXRpb25fdW5zaWduZWQBAAhIZXF1aXZvY2F0aW9uX3Byb29mJQQ8a2V5X293bmVyX3Byb29mvQMwbm90ZV9zdGFsbGVkAQAIFGRlbGF5BGxiZXN0X2ZpbmFsaXplZF9ibG9ja19udW1iZXIEIFRyZWFzdXJ5AQIYLHNwZW5kX2xvY2FsAQAIGGFtb3VudAgsYmVuZWZpY2lhcnnVAzxyZW1vdmVfYXBwcm92YWwBAAQscHJvcG9zYWxfaWQEFHNwZW5kAQAQKGFzc2V0X2tpbmSBARhhbW91bnQILGJlbmVmaWNpYXJ5mQEodmFsaWRfZnJvbS0EGHBheW91dAEABBRpbmRleAQwY2hlY2tfc3RhdHVzAQAEFGluZGV4BCh2b2lkX3NwZW5kAQAEFGluZGV4BEBDb252aWN0aW9uVm90aW5nAQIYEHZvdGUBAAgocG9sbF9pbmRleAQQdm90ZTUEIGRlbGVnYXRlAQAQFGNsYXNzBAh0b9UDKGNvbnZpY3Rpb245BBxiYWxhbmNlCCh1bmRlbGVnYXRlAQAEFGNsYXNzBBh1bmxvY2sBAAgUY2xhc3MEGHRhcmdldNUDLHJlbW92ZV92b3RlAQAIFGNsYXNzLQQUaW5kZXgERHJlbW92ZV9vdGhlcl92b3RlAQAMGHRhcmdldNUDFGNsYXNzBBRpbmRleAQkUmVmZXJlbmRhAQIkGHN1Ym1pdAEADDxwcm9wb3NhbF9vcmlnaW6VAyBwcm9wb3NhbKUBQGVuYWN0bWVudF9tb21lbnRBBFhwbGFjZV9kZWNpc2lvbl9kZXBvc2l0AQAEFGluZGV4BFxyZWZ1bmRfZGVjaXNpb25fZGVwb3NpdAEABBRpbmRleAQYY2FuY2VsAQAEFGluZGV4BBBraWxsAQAEFGluZGV4BEBudWRnZV9yZWZlcmVuZHVtAQAEFGluZGV4BEhvbmVfZmV3ZXJfZGVjaWRpbmcBAAQUdHJhY2sEZHJlZnVuZF9zdWJtaXNzaW9uX2RlcG9zaXQBAAQUaW5kZXgEMHNldF9tZXRhZGF0YQEACBRpbmRleAQobWF5YmVfaGFzaBEBJFdoaXRlbGlzdAECEDh3aGl0ZWxpc3RfY2FsbAEABCRjYWxsX2hhc2ggXHJlbW92ZV93aGl0ZWxpc3RlZF9jYWxsAQAEJGNhbGxfaGFzaCBkZGlzcGF0Y2hfd2hpdGVsaXN0ZWRfY2FsbAEADCRjYWxsX2hhc2ggQGNhbGxfZW5jb2RlZF9sZW4ETGNhbGxfd2VpZ2h0X3dpdG5lc3MYnGRpc3BhdGNoX3doaXRlbGlzdGVkX2NhbGxfd2l0aF9wcmVpbWFnZQEABBBjYWxs3QYoUGFyYW1ldGVycwECBDRzZXRfcGFyYW1ldGVyAQAEJGtleV92YWx1ZVUEGENsYWltcwECFBRjbGFpbQEACBBkZXN0AEhldGhlcmV1bV9zaWduYXR1cmVdBChtaW50X2NsYWltAQAQDHdob2UBFHZhbHVlCEB2ZXN0aW5nX3NjaGVkdWxlZQQkc3RhdGVtZW50bQQwY2xhaW1fYXR0ZXN0AQAMEGRlc3QASGV0aGVyZXVtX3NpZ25hdHVyZV0EJHN0YXRlbWVudCQYYXR0ZXN0AQAEJHN0YXRlbWVudCQobW92ZV9jbGFpbQEADAxvbGRlAQxuZXdlAThtYXliZV9wcmVjbGFpbQUCHFZlc3RpbmcBAhgQdmVzdAEBBSh2ZXN0X290aGVyAQAEGHRhcmdldNUDPHZlc3RlZF90cmFuc2ZlcgEACBh0YXJnZXTVAyBzY2hlZHVsZXUEVGZvcmNlX3Zlc3RlZF90cmFuc2ZlcgEADBhzb3VyY2XVAxh0YXJnZXTVAyBzY2hlZHVsZXUEPG1lcmdlX3NjaGVkdWxlcwEACDxzY2hlZHVsZTFfaW5kZXgEPHNjaGVkdWxlMl9pbmRleAR0Zm9yY2VfcmVtb3ZlX3Zlc3Rpbmdfc2NoZWR1bGUBAAgYdGFyZ2V01QM4c2NoZWR1bGVfaW5kZXgEHFV0aWxpdHkBAhgUYmF0Y2gBAAQUY2FsbHN9BDRhc19kZXJpdmF0aXZlAQAIFGluZGV4BBBjYWxs3QYkYmF0Y2hfYWxsAQAEFGNhbGxzfQQsZGlzcGF0Y2hfYXMBAAgkYXNfb3JpZ2lulQMQY2FsbN0GLGZvcmNlX2JhdGNoAQAEFGNhbGxzfQQsd2l0aF93ZWlnaHQBAAgQY2FsbN0GGHdlaWdodBgUUHJveHkBAigUcHJveHkBAAwQcmVhbNUDQGZvcmNlX3Byb3h5X3R5cGWFBBBjYWxs3QYkYWRkX3Byb3h5AQAMIGRlbGVnYXRl1QMocHJveHlfdHlwZekBFGRlbGF5BDByZW1vdmVfcHJveHkBAAwgZGVsZWdhdGXVAyhwcm94eV90eXBl6QEUZGVsYXkEOHJlbW92ZV9wcm94aWVzAQEFLGNyZWF0ZV9wdXJlAQAMKHByb3h5X3R5cGXpARRkZWxheQQUaW5kZXgEJGtpbGxfcHVyZQEAFBxzcGF3bmVy1QMocHJveHlfdHlwZekBFGluZGV4BBhoZWlnaHQEJGV4dF9pbmRleAQgYW5ub3VuY2UBAAgQcmVhbNUDJGNhbGxfaGFzaCBMcmVtb3ZlX2Fubm91bmNlbWVudAEACBByZWFs1QMkY2FsbF9oYXNoIExyZWplY3RfYW5ub3VuY2VtZW50AQAIIGRlbGVnYXRl1QMkY2FsbF9oYXNoIDxwcm94eV9hbm5vdW5jZWQBABAgZGVsZWdhdGXVAxByZWFs1QNAZm9yY2VfcHJveHlfdHlwZYUEEGNhbGzdBiBNdWx0aXNpZwECEFBhc19tdWx0aV90aHJlc2hvbGRfMQEACERvdGhlcl9zaWduYXRvcmllc90DEGNhbGzdBiBhc19tdWx0aQEAFCR0aHJlc2hvbGQERG90aGVyX3NpZ25hdG9yaWVz3QM8bWF5YmVfdGltZXBvaW50jQQQY2FsbN0GKG1heF93ZWlnaHQYQGFwcHJvdmVfYXNfbXVsdGkBABQkdGhyZXNob2xkBERvdGhlcl9zaWduYXRvcmllc90DPG1heWJlX3RpbWVwb2ludI0EJGNhbGxfaGFzaCAobWF4X3dlaWdodBg8Y2FuY2VsX2FzX211bHRpAQAQJHRocmVzaG9sZAREb3RoZXJfc2lnbmF0b3JpZXPdAyR0aW1lcG9pbnTxASRjYWxsX2hhc2ggIEJvdW50aWVzAQIkOHByb3Bvc2VfYm91bnR5AQAIFHZhbHVlCCxkZXNjcmlwdGlvbiQ4YXBwcm92ZV9ib3VudHkBAAQkYm91bnR5X2lkBDxwcm9wb3NlX2N1cmF0b3IBAAwkYm91bnR5X2lkBBxjdXJhdG9y1QMMZmVlCEB1bmFzc2lnbl9jdXJhdG9yAQAEJGJvdW50eV9pZAQ4YWNjZXB0X2N1cmF0b3IBAAQkYm91bnR5X2lkBDBhd2FyZF9ib3VudHkBAAgkYm91bnR5X2lkBCxiZW5lZmljaWFyedUDMGNsYWltX2JvdW50eQEABCRib3VudHlfaWQEMGNsb3NlX2JvdW50eQEABCRib3VudHlfaWQEUGV4dGVuZF9ib3VudHlfZXhwaXJ5AQAIJGJvdW50eV9pZAQYcmVtYXJrJDRDaGlsZEJvdW50aWVzAQIcQGFkZF9jaGlsZF9ib3VudHkBAAxAcGFyZW50X2JvdW50eV9pZAQUdmFsdWUILGRlc2NyaXB0aW9uJDxwcm9wb3NlX2N1cmF0b3IBABBAcGFyZW50X2JvdW50eV9pZAQ8Y2hpbGRfYm91bnR5X2lkBBxjdXJhdG9y1QMMZmVlCDhhY2NlcHRfY3VyYXRvcgEACEBwYXJlbnRfYm91bnR5X2lkBDxjaGlsZF9ib3VudHlfaWQEQHVuYXNzaWduX2N1cmF0b3IBAAhAcGFyZW50X2JvdW50eV9pZAQ8Y2hpbGRfYm91bnR5X2lkBEhhd2FyZF9jaGlsZF9ib3VudHkBAAxAcGFyZW50X2JvdW50eV9pZAQ8Y2hpbGRfYm91bnR5X2lkBCxiZW5lZmljaWFyedUDSGNsYWltX2NoaWxkX2JvdW50eQEACEBwYXJlbnRfYm91bnR5X2lkBDxjaGlsZF9ib3VudHlfaWQESGNsb3NlX2NoaWxkX2JvdW50eQEACEBwYXJlbnRfYm91bnR5X2lkBDxjaGlsZF9ib3VudHlfaWQEaEVsZWN0aW9uUHJvdmlkZXJNdWx0aVBoYXNlAQIUPHN1Ym1pdF91bnNpZ25lZAEACDByYXdfc29sdXRpb25ZBRx3aXRuZXNzXQVsc2V0X21pbmltdW1fdW50cnVzdGVkX3Njb3JlAQAEQG1heWJlX25leHRfc2NvcmVhBXRzZXRfZW1lcmdlbmN5X2VsZWN0aW9uX3Jlc3VsdAEABCBzdXBwb3J0c3UFGHN1Ym1pdAEABDByYXdfc29sdXRpb25ZBUxnb3Zlcm5hbmNlX2ZhbGxiYWNrAQAIQG1heWJlX21heF92b3RlcnMtBERtYXliZV9tYXhfdGFyZ2V0cy0EJFZvdGVyTGlzdAECDBRyZWJhZwEABChkaXNsb2NhdGVk1QM8cHV0X2luX2Zyb250X29mAQAEHGxpZ2h0ZXLVA1RwdXRfaW5fZnJvbnRfb2Zfb3RoZXIBAAgcaGVhdmllctUDHGxpZ2h0ZXLVAzxOb21pbmF0aW9uUG9vbHMBAmgQam9pbgEACBhhbW91bnQIHHBvb2xfaWQEKGJvbmRfZXh0cmEBAAQUZXh0cmGBBTBjbGFpbV9wYXlvdXQBAQUYdW5ib25kAQAIOG1lbWJlcl9hY2NvdW501QNAdW5ib25kaW5nX3BvaW50cwhYcG9vbF93aXRoZHJhd191bmJvbmRlZAEACBxwb29sX2lkBEhudW1fc2xhc2hpbmdfc3BhbnMERHdpdGhkcmF3X3VuYm9uZGVkAQAIOG1lbWJlcl9hY2NvdW501QNIbnVtX3NsYXNoaW5nX3NwYW5zBBhjcmVhdGUBABAYYW1vdW50CBByb2901QMkbm9taW5hdG9y1QMcYm91bmNlctUDTGNyZWF0ZV93aXRoX3Bvb2xfaWQBABQYYW1vdW50CBByb2901QMkbm9taW5hdG9y1QMcYm91bmNlctUDHHBvb2xfaWQEIG5vbWluYXRlAQAIHHBvb2xfaWQEKHZhbGlkYXRvcnPdAyRzZXRfc3RhdGUBAAgccG9vbF9pZAQUc3RhdGUdAjBzZXRfbWV0YWRhdGEBAAgccG9vbF9pZAQgbWV0YWRhdGEkLHNldF9jb25maWdzAQAYNG1pbl9qb2luX2JvbmTtAzxtaW5fY3JlYXRlX2JvbmTtAyRtYXhfcG9vbHPxAyxtYXhfbWVtYmVyc/EDUG1heF9tZW1iZXJzX3Blcl9wb29s8QNUZ2xvYmFsX21heF9jb21taXNzaW9u8QMwdXBkYXRlX3JvbGVzAQAQHHBvb2xfaWQEIG5ld19yb290hQU0bmV3X25vbWluYXRvcoUFLG5ld19ib3VuY2VyhQUUY2hpbGwBAAQccG9vbF9pZARAYm9uZF9leHRyYV9vdGhlcgEACBhtZW1iZXLVAxRleHRyYYEFUHNldF9jbGFpbV9wZXJtaXNzaW9uAQAEKHBlcm1pc3Npb26JBUhjbGFpbV9wYXlvdXRfb3RoZXIBAAQUb3RoZXIAOHNldF9jb21taXNzaW9uAQAIHHBvb2xfaWQEOG5ld19jb21taXNzaW9uJQJIc2V0X2NvbW1pc3Npb25fbWF4AQAIHHBvb2xfaWQEOG1heF9jb21taXNzaW9uBGhzZXRfY29tbWlzc2lvbl9jaGFuZ2VfcmF0ZQEACBxwb29sX2lkBCxjaGFuZ2VfcmF0ZSkCQGNsYWltX2NvbW1pc3Npb24BAAQccG9vbF9pZARMYWRqdXN0X3Bvb2xfZGVwb3NpdAEABBxwb29sX2lkBHxzZXRfY29tbWlzc2lvbl9jbGFpbV9wZXJtaXNzaW9uAQAIHHBvb2xfaWQEKHBlcm1pc3Npb24xAixhcHBseV9zbGFzaAEABDhtZW1iZXJfYWNjb3VudNUDSG1pZ3JhdGVfZGVsZWdhdGlvbgEABDhtZW1iZXJfYWNjb3VudNUDeG1pZ3JhdGVfcG9vbF90b19kZWxlZ2F0ZV9zdGFrZQEABBxwb29sX2lkBCxGYXN0VW5zdGFrZQECDFRyZWdpc3Rlcl9mYXN0X3Vuc3Rha2UBAQUoZGVyZWdpc3RlcgEBBRxjb250cm9sAQAENGVyYXNfdG9fY2hlY2sENENvbmZpZ3VyYXRpb24BAsB8c2V0X3ZhbGlkYXRpb25fdXBncmFkZV9jb29sZG93bgEABAxuZXcEcHNldF92YWxpZGF0aW9uX3VwZ3JhZGVfZGVsYXkBAAQMbmV3BGRzZXRfY29kZV9yZXRlbnRpb25fcGVyaW9kAQAEDG5ldwREc2V0X21heF9jb2RlX3NpemUBAAQMbmV3BEBzZXRfbWF4X3Bvdl9zaXplAQAEDG5ldwRYc2V0X21heF9oZWFkX2RhdGFfc2l6ZQEABAxuZXcESHNldF9jb3JldGltZV9jb3JlcwEABAxuZXcEdHNldF9tYXhfYXZhaWxhYmlsaXR5X3RpbWVvdXRzAQAEDG5ldwRwc2V0X2dyb3VwX3JvdGF0aW9uX2ZyZXF1ZW5jeQEABAxuZXcEdHNldF9wYXJhc19hdmFpbGFiaWxpdHlfcGVyaW9kAQAEDG5ldwRgc2V0X3NjaGVkdWxpbmdfbG9va2FoZWFkAQAEDG5ldwRsc2V0X21heF92YWxpZGF0b3JzX3Blcl9jb3JlAQAEDG5ldy0ESHNldF9tYXhfdmFsaWRhdG9ycwEABAxuZXctBEhzZXRfZGlzcHV0ZV9wZXJpb2QBAAQMbmV3BLRzZXRfZGlzcHV0ZV9wb3N0X2NvbmNsdXNpb25fYWNjZXB0YW5jZV9wZXJpb2QBAAQMbmV3BERzZXRfbm9fc2hvd19zbG90cwEABAxuZXcEUHNldF9uX2RlbGF5X3RyYW5jaGVzAQAEDG5ldwR4c2V0X3plcm90aF9kZWxheV90cmFuY2hlX3dpZHRoAQAEDG5ldwRQc2V0X25lZWRlZF9hcHByb3ZhbHMBAAQMbmV3BHBzZXRfcmVsYXlfdnJmX21vZHVsb19zYW1wbGVzAQAEDG5ldwRoc2V0X21heF91cHdhcmRfcXVldWVfY291bnQBAAQMbmV3BGRzZXRfbWF4X3Vwd2FyZF9xdWV1ZV9zaXplAQAEDG5ldwR0c2V0X21heF9kb3dud2FyZF9tZXNzYWdlX3NpemUBAAQMbmV3BGxzZXRfbWF4X3Vwd2FyZF9tZXNzYWdlX3NpemUBAAQMbmV3BKBzZXRfbWF4X3Vwd2FyZF9tZXNzYWdlX251bV9wZXJfY2FuZGlkYXRlAQAEDG5ldwRkc2V0X2hybXBfb3Blbl9yZXF1ZXN0X3R0bAEABAxuZXcEXHNldF9ocm1wX3NlbmRlcl9kZXBvc2l0AQAEDG5ldwhoc2V0X2hybXBfcmVjaXBpZW50X2RlcG9zaXQBAAQMbmV3CHRzZXRfaHJtcF9jaGFubmVsX21heF9jYXBhY2l0eQEABAxuZXcEfHNldF9ocm1wX2NoYW5uZWxfbWF4X3RvdGFsX3NpemUBAAQMbmV3BJxzZXRfaHJtcF9tYXhfcGFyYWNoYWluX2luYm91bmRfY2hhbm5lbHMBAAQMbmV3BIRzZXRfaHJtcF9jaGFubmVsX21heF9tZXNzYWdlX3NpemUBAAQMbmV3BKBzZXRfaHJtcF9tYXhfcGFyYWNoYWluX291dGJvdW5kX2NoYW5uZWxzAQAEDG5ldwSYc2V0X2hybXBfbWF4X21lc3NhZ2VfbnVtX3Blcl9jYW5kaWRhdGUBAAQMbmV3BEhzZXRfcHZmX3ZvdGluZ190dGwBAAQMbmV3BJBzZXRfbWluaW11bV92YWxpZGF0aW9uX3VwZ3JhZGVfZGVsYXkBAAQMbmV3BHBzZXRfYnlwYXNzX2NvbnNpc3RlbmN5X2NoZWNrAQAEDG5ldxRgc2V0X2FzeW5jX2JhY2tpbmdfcGFyYW1zAQAEDG5ld5UFTHNldF9leGVjdXRvcl9wYXJhbXMBAAQMbmV3pQVYc2V0X29uX2RlbWFuZF9iYXNlX2ZlZQEABAxuZXcIdHNldF9vbl9kZW1hbmRfZmVlX3ZhcmlhYmlsaXR5AQAEDG5ldwRwc2V0X29uX2RlbWFuZF9xdWV1ZV9tYXhfc2l6ZQEABAxuZXcEmHNldF9vbl9kZW1hbmRfdGFyZ2V0X3F1ZXVlX3V0aWxpemF0aW9uAQAEDG5ldwREc2V0X29uX2RlbWFuZF90dGwBAAQMbmV3BGRzZXRfbWluaW11bV9iYWNraW5nX3ZvdGVzAQAEDG5ldwRAc2V0X25vZGVfZmVhdHVyZQEACBRpbmRleAQUdmFsdWUUaHNldF9hcHByb3ZhbF92b3RpbmdfcGFyYW1zAQAEDG5ldwRQc2V0X3NjaGVkdWxlcl9wYXJhbXMBAAQMbmV3qQUsUGFyYXNTaGFyZWQBAQU0UGFyYUluY2x1c2lvbgEBBTBQYXJhSW5oZXJlbnQBAgQUZW50ZXIBAAQQZGF0Yf0FFFBhcmFzAQIkWGZvcmNlX3NldF9jdXJyZW50X2NvZGUBAAgQcGFyYQQgbmV3X2NvZGUkWGZvcmNlX3NldF9jdXJyZW50X2hlYWQBAAgQcGFyYQQgbmV3X2hlYWQkbGZvcmNlX3NjaGVkdWxlX2NvZGVfdXBncmFkZQEADBBwYXJhBCBuZXdfY29kZSRMcmVsYXlfcGFyZW50X251bWJlcgRMZm9yY2Vfbm90ZV9uZXdfaGVhZAEACBBwYXJhBCBuZXdfaGVhZCRIZm9yY2VfcXVldWVfYWN0aW9uAQAEEHBhcmEEbGFkZF90cnVzdGVkX3ZhbGlkYXRpb25fY29kZQEABDx2YWxpZGF0aW9uX2NvZGUkbHBva2VfdW51c2VkX3ZhbGlkYXRpb25fY29kZQEABFB2YWxpZGF0aW9uX2NvZGVfaGFzaCBsaW5jbHVkZV9wdmZfY2hlY2tfc3RhdGVtZW50AQAIEHN0bXQFBiRzaWduYXR1cmVBAnRmb3JjZV9zZXRfbW9zdF9yZWNlbnRfY29udGV4dAEACBBwYXJhBBxjb250ZXh0BCxJbml0aWFsaXplcgECBDRmb3JjZV9hcHByb3ZlAQAEFHVwX3RvBBBIcm1wAQIsWGhybXBfaW5pdF9vcGVuX2NoYW5uZWwBAAwkcmVjaXBpZW50BFRwcm9wb3NlZF9tYXhfY2FwYWNpdHkEZHByb3Bvc2VkX21heF9tZXNzYWdlX3NpemUEYGhybXBfYWNjZXB0X29wZW5fY2hhbm5lbAEABBhzZW5kZXIESGhybXBfY2xvc2VfY2hhbm5lbAEABChjaGFubmVsX2lkVQJAZm9yY2VfY2xlYW5faHJtcAEADBBwYXJhBCxudW1faW5ib3VuZAQwbnVtX291dGJvdW5kBFxmb3JjZV9wcm9jZXNzX2hybXBfb3BlbgEABCBjaGFubmVscwRgZm9yY2VfcHJvY2Vzc19ocm1wX2Nsb3NlAQAEIGNoYW5uZWxzBGBocm1wX2NhbmNlbF9vcGVuX3JlcXVlc3QBAAgoY2hhbm5lbF9pZFUCNG9wZW5fcmVxdWVzdHMEXGZvcmNlX29wZW5faHJtcF9jaGFubmVsAQAQGHNlbmRlcgQkcmVjaXBpZW50BDBtYXhfY2FwYWNpdHkEQG1heF9tZXNzYWdlX3NpemUEYGVzdGFibGlzaF9zeXN0ZW1fY2hhbm5lbAEACBhzZW5kZXIEJHJlY2lwaWVudARUcG9rZV9jaGFubmVsX2RlcG9zaXRzAQAIGHNlbmRlcgQkcmVjaXBpZW50BHRlc3RhYmxpc2hfY2hhbm5lbF93aXRoX3N5c3RlbQEABEx0YXJnZXRfc3lzdGVtX2NoYWluBDRQYXJhc0Rpc3B1dGVzAQIEOGZvcmNlX3VuZnJlZXplAQEFNFBhcmFzU2xhc2hpbmcBAgRwcmVwb3J0X2Rpc3B1dGVfbG9zdF91bnNpZ25lZAEACDRkaXNwdXRlX3Byb29mIQY8a2V5X293bmVyX3Byb29mvQMgT25EZW1hbmQBAghccGxhY2Vfb3JkZXJfYWxsb3dfZGVhdGgBAAgobWF4X2Ftb3VudAgccGFyYV9pZARYcGxhY2Vfb3JkZXJfa2VlcF9hbGl2ZQEACChtYXhfYW1vdW50CBxwYXJhX2lkBCRSZWdpc3RyYXIBAiQgcmVnaXN0ZXIBAAwIaWQEMGdlbmVzaXNfaGVhZCQ8dmFsaWRhdGlvbl9jb2RlJDhmb3JjZV9yZWdpc3RlcgEAFAx3aG8AHGRlcG9zaXQICGlkBDBnZW5lc2lzX2hlYWQkPHZhbGlkYXRpb25fY29kZSQoZGVyZWdpc3RlcgEABAhpZAQQc3dhcAEACAhpZAQUb3RoZXIELHJlbW92ZV9sb2NrAQAEEHBhcmEEHHJlc2VydmUBAQUgYWRkX2xvY2sBAAQQcGFyYQRUc2NoZWR1bGVfY29kZV91cGdyYWRlAQAIEHBhcmEEIG5ld19jb2RlJEBzZXRfY3VycmVudF9oZWFkAQAIEHBhcmEEIG5ld19oZWFkJBRTbG90cwECDCxmb3JjZV9sZWFzZQEAFBBwYXJhBBhsZWFzZXIAGGFtb3VudAgwcGVyaW9kX2JlZ2luBDBwZXJpb2RfY291bnQEQGNsZWFyX2FsbF9sZWFzZXMBAAQQcGFyYQQ8dHJpZ2dlcl9vbmJvYXJkAQAEEHBhcmEEIEF1Y3Rpb25zAQIMLG5ld19hdWN0aW9uAQAIIGR1cmF0aW9uBEhsZWFzZV9wZXJpb2RfaW5kZXgEDGJpZAEAFBBwYXJhBDRhdWN0aW9uX2luZGV4BChmaXJzdF9zbG90BCRsYXN0X3Nsb3QEGGFtb3VudAg4Y2FuY2VsX2F1Y3Rpb24BAQUkQ3Jvd2Rsb2FuAQIkGGNyZWF0ZQEAGBRpbmRleAQMY2FwCDBmaXJzdF9wZXJpb2QELGxhc3RfcGVyaW9kBAxlbmQEIHZlcmlmaWVyPQYoY29udHJpYnV0ZQEADBRpbmRleAQUdmFsdWUIJHNpZ25hdHVyZUUGIHdpdGhkcmF3AQAIDHdobwAUaW5kZXgEGHJlZnVuZAEABBRpbmRleAQgZGlzc29sdmUBAAQUaW5kZXgEEGVkaXQBABgUaW5kZXgEDGNhcAgwZmlyc3RfcGVyaW9kBCxsYXN0X3BlcmlvZAQMZW5kBCB2ZXJpZmllcj0GIGFkZF9tZW1vAQAIFGluZGV4BBBtZW1vJBBwb2tlAQAEFGluZGV4BDhjb250cmlidXRlX2FsbAEACBRpbmRleAQkc2lnbmF0dXJlRQYgQ29yZXRpbWUBAgxIcmVxdWVzdF9jb3JlX2NvdW50AQAEFGNvdW50BEhyZXF1ZXN0X3JldmVudWVfYXQBAAQQd2hlbgQsYXNzaWduX2NvcmUBABAQY29yZQQUYmVnaW4EKGFzc2lnbm1lbnRVBiBlbmRfaGludC0ESFN0YXRlVHJpZU1pZ3JhdGlvbgECGFhjb250cm9sX2F1dG9fbWlncmF0aW9uAQAEMG1heWJlX2NvbmZpZ2EGQGNvbnRpbnVlX21pZ3JhdGUBAAwYbGltaXRzXQY8cmVhbF9zaXplX3VwcGVyBDB3aXRuZXNzX3Rhc2tpBkhtaWdyYXRlX2N1c3RvbV90b3ABAAgQa2V5c30DMHdpdG5lc3Nfc2l6ZQRQbWlncmF0ZV9jdXN0b21fY2hpbGQBAAwQcm9vdCQoY2hpbGRfa2V5c30DKHRvdGFsX3NpemUEVHNldF9zaWduZWRfbWF4X2xpbWl0cwEABBhsaW1pdHNdBkhmb3JjZV9zZXRfcHJvZ3Jlc3MBAAgwcHJvZ3Jlc3NfdG9wZQY4cHJvZ3Jlc3NfY2hpbGRlBiRYY21QYWxsZXQBAjgQc2VuZAEACBBkZXN0mQEcbWVzc2FnZakGPHRlbGVwb3J0X2Fzc2V0cwEAEBBkZXN0mQEsYmVuZWZpY2lhcnmZARhhc3NldHMZAzhmZWVfYXNzZXRfaXRlbQRccmVzZXJ2ZV90cmFuc2Zlcl9hc3NldHMBABAQZGVzdJkBLGJlbmVmaWNpYXJ5mQEYYXNzZXRzGQM4ZmVlX2Fzc2V0X2l0ZW0EHGV4ZWN1dGUBAAgcbWVzc2FnZakGKG1heF93ZWlnaHQYRGZvcmNlX3hjbV92ZXJzaW9uAQAIIGxvY2F0aW9ueQEcdmVyc2lvbgRkZm9yY2VfZGVmYXVsdF94Y21fdmVyc2lvbgEABERtYXliZV94Y21fdmVyc2lvbi0EeGZvcmNlX3N1YnNjcmliZV92ZXJzaW9uX25vdGlmeQEABCBsb2NhdGlvbpkBgGZvcmNlX3Vuc3Vic2NyaWJlX3ZlcnNpb25fbm90aWZ5AQAEIGxvY2F0aW9umQF8bGltaXRlZF9yZXNlcnZlX3RyYW5zZmVyX2Fzc2V0cwEAFBBkZXN0mQEsYmVuZWZpY2lhcnmZARhhc3NldHMZAzhmZWVfYXNzZXRfaXRlbQQwd2VpZ2h0X2xpbWl08QJcbGltaXRlZF90ZWxlcG9ydF9hc3NldHMBABQQZGVzdJkBLGJlbmVmaWNpYXJ5mQEYYXNzZXRzGQM4ZmVlX2Fzc2V0X2l0ZW0EMHdlaWdodF9saW1pdPECQGZvcmNlX3N1c3BlbnNpb24BAAQkc3VzcGVuZGVkFDx0cmFuc2Zlcl9hc3NldHMBABQQZGVzdJkBLGJlbmVmaWNpYXJ5mQEYYXNzZXRzGQM4ZmVlX2Fzc2V0X2l0ZW0EMHdlaWdodF9saW1pdPECMGNsYWltX2Fzc2V0cwEACBhhc3NldHMZAyxiZW5lZmljaWFyeZkBjHRyYW5zZmVyX2Fzc2V0c191c2luZ190eXBlX2FuZF90aGVuAQAcEGRlc3SZARhhc3NldHMZA1Bhc3NldHNfdHJhbnNmZXJfdHlwZa0GOHJlbW90ZV9mZWVzX2lksQZIZmVlc190cmFuc2Zlcl90eXBlrQZIY3VzdG9tX3hjbV9vbl9kZXN0qQYwd2VpZ2h0X2xpbWl08QIwTWVzc2FnZVF1ZXVlAQIIJHJlYXBfcGFnZQEACDhtZXNzYWdlX29yaWdpbiUDKHBhZ2VfaW5kZXgESGV4ZWN1dGVfb3ZlcndlaWdodAEAEDhtZXNzYWdlX29yaWdpbiUDEHBhZ2UEFGluZGV4BDB3ZWlnaHRfbGltaXQYJEFzc2V0UmF0ZQECDBhjcmVhdGUBAAgoYXNzZXRfa2luZIEBEHJhdGUIGHVwZGF0ZQEACChhc3NldF9raW5kgQEQcmF0ZQgYcmVtb3ZlAQAEKGFzc2V0X2tpbmSBARRCZWVmeQECDExyZXBvcnRfZXF1aXZvY2F0aW9uAQAISGVxdWl2b2NhdGlvbl9wcm9vZtUGPGtleV9vd25lcl9wcm9vZr0DcHJlcG9ydF9lcXVpdm9jYXRpb25fdW5zaWduZWQBAAhIZXF1aXZvY2F0aW9uX3Byb29m1QY8a2V5X293bmVyX3Byb29mvQM8c2V0X25ld19nZW5lc2lzAQAEPGRlbGF5X2luX2Jsb2NrcwQGZQUCCCxVbnJlcXVlc3RlZAEACBxkZXBvc2l0ZQUMbGVuBCRSZXF1ZXN0ZWQBAAwcZGVwb3NpdOEGFGNvdW50BAxsZW4tBAIILFVucmVxdWVzdGVkAQAIGHRpY2tldGUFDGxlbgQkUmVxdWVzdGVkAQAMMG1heWJlX3RpY2tldOEGFGNvdW50BCRtYXliZV9sZW4tBAMIIAQACChwcmVfb3V0cHV0IBRwcm9vZkECAAw8YXV0aG9yaXR5X2luZGV4BBBzbG90CDR2cmZfc2lnbmF0dXJl8QYACDxhdXRob3JpdHlfaW5kZXgEEHNsb3QIAgwcUHJpbWFyeQEADDxhdXRob3JpdHlfaW5kZXgEEHNsb3QINHZyZl9zaWduYXR1cmXxBjhTZWNvbmRhcnlQbGFpbgEACDxhdXRob3JpdHlfaW5kZXgEEHNsb3QIMFNlY29uZGFyeVZSRgEADDxhdXRob3JpdHlfaW5kZXgEEHNsb3QINHZyZl9zaWduYXR1cmXxBgb9BgAIBGPBAzRhbGxvd2VkX3Nsb3RzxQMDCAgEBAkHAAMMAAgUAgwMRmVlAQEFEE1pc2MBAQUMQWxsAQEFAAwIaWSRAhhhbW91bnQIHHJlYXNvbnMVBwQZBwAACAhpZJECGGFtb3VudAgEIQcAAgQgUHJlaW1hZ2UBAQUCBDxTbGFzaEZvck1pZ3JhdGUBAQUCCCBQcmVpbWFnZQECBCBQcmVpbWFnZQEBBUhTdGF0ZVRyaWVNaWdyYXRpb24BAgQ8U2xhc2hGb3JNaWdyYXRlAQEFAAgIaWQxBxhhbW91bnQIBDUHAAIEOFBvb2xNaW5CYWxhbmNlAQEFAgQ8Tm9taW5hdGlvblBvb2xzAQIEOFBvb2xNaW5CYWxhbmNlAQEFAAgIaWRBBxhhbW91bnQIBEUHAAIIJFYxQW5jaWVudAEBBQhWMgEBBQAUFHN0YXNoABR0b3RhbAgYYWN0aXZlCCR1bmxvY2tpbmf9A1hsZWdhY3lfY2xhaW1lZF9yZXdhcmRzOQIADBx0YXJnZXRz3QMwc3VibWl0dGVkX2luBChzdXBwcmVzc2VkFAAIFGluZGV4BBRzdGFydPUDAAgMd2hvABR2YWx1ZQgEXQcAAAwUdG90YWwIDG93bggYb3RoZXJzYQcAEBR0b3RhbAgMb3duCDxub21pbmF0b3JfY291bnQEKHBhZ2VfY291bnQEAwwEAAQACChwYWdlX3RvdGFsCBhvdGhlcnNhBwMIAAQEdQcAAAgUdG90YWwEKGluZGl2aWR1YWx5BwAUJHZhbGlkYXRvcgAMb3duCBhvdGhlcnNpBSRyZXBvcnRlcnPdAxhwYXlvdXQIBIEHAAMIBAgAEChzcGFuX2luZGV4BChsYXN0X3N0YXJ0BEhsYXN0X25vbnplcm9fc2xhc2gEFHByaW9yOQIACBxzbGFzaGVkCCBwYWlkX291dAgDCABlBwAIIG9mZmVuZGVylQckcmVwb3J0ZXJz3QMDCEUBJAMIAA0EBKEHAAMIKCQCEBBMaXZlAQEFMFBlbmRpbmdQYXVzZQEACDBzY2hlZHVsZWRfYXQEFGRlbGF5BBhQYXVzZWQBAQU0UGVuZGluZ1Jlc3VtZQEACDBzY2hlZHVsZWRfYXQEFGRlbGF5BAAQMHNjaGVkdWxlZF9hdAQUZGVsYXkEQG5leHRfYXV0aG9yaXRpZXNVARhmb3JjZWQtBAAQIHByb3Bvc2VyABR2YWx1ZQgsYmVuZWZpY2lhcnkAEGJvbmQIAgwcUGVuZGluZwEBBSRBdHRlbXB0ZWQBAAQIaWQIGEZhaWxlZAEBBQAYKGFzc2V0X2tpbmSBARhhbW91bnQILGJlbmVmaWNpYXJ5mQEodmFsaWRfZnJvbQQkZXhwaXJlX2F0BBhzdGF0dXO5BwMIBDUEBMEHAAAIFHZvdGVzCBxjYXBpdGFsCAAMFHZvdGVzxQcsZGVsZWdhdGlvbnPJBxRwcmlvcokHABQcYmFsYW5jZQgYdGFyZ2V0AChjb252aWN0aW9uOQQsZGVsZWdhdGlvbnPJBxRwcmlvcokHAggcQ2FzdGluZwEADBR2b3Rlc8UHLGRlbGVnYXRpb25zyQcUcHJpb3KJByhEZWxlZ2F0aW5nAQAUHGJhbGFuY2UIGHRhcmdldAAoY29udmljdGlvbjkELGRlbGVnYXRpb25zyQcUcHJpb3KJBwSJBwAACAx3aG8AGGFtb3VudAgG3QcACBRzaW5jZQQoY29uZmlybWluZy0EBuUHAwgEDQEG7QcALBR0cmFjawQYb3JpZ2lulQMgcHJvcG9zYWylASRlbmFjdG1lbnRBBCRzdWJtaXR0ZWQESHN1Ym1pc3Npb25fZGVwb3NpdN0HQGRlY2lzaW9uX2RlcG9zaXThByBkZWNpZGluZ+kHFHRhbGx5qQEgaW5fcXVldWUUFGFsYXJt8QcCGBxPbmdvaW5nAQAsFHRyYWNrBBhvcmlnaW6VAyBwcm9wb3NhbKUBJGVuYWN0bWVudEEEJHN1Ym1pdHRlZARIc3VibWlzc2lvbl9kZXBvc2l03QdAZGVjaXNpb25fZGVwb3NpdOEHIGRlY2lkaW5n6QcUdGFsbHmpASBpbl9xdWV1ZRQUYWxhcm3xByBBcHByb3ZlZAEDDAThB+EHIFJlamVjdGVkAQMMBOEH4QckQ2FuY2VsbGVkAQMMBOEH4QcgVGltZWRPdXQBAwwE4QfhBxhLaWxsZWQBAQICDEBMaW5lYXJEZWNyZWFzaW5nAQAMGGxlbmd0aAQUZmxvb3IEEGNlaWwERFN0ZXBwZWREZWNyZWFzaW5nAQAQFGJlZ2luBAxlbmQEEHN0ZXAEGHBlcmlvZAQoUmVjaXByb2NhbAEADBhmYWN0b3IIIHhfb2Zmc2V0CCB5X29mZnNldAgAJBBuYW1lSQMwbWF4X2RlY2lkaW5nBEBkZWNpc2lvbl9kZXBvc2l0CDhwcmVwYXJlX3BlcmlvZAQ8ZGVjaXNpb25fcGVyaW9kBDhjb25maXJtX3BlcmlvZARQbWluX2VuYWN0bWVudF9wZXJpb2QEMG1pbl9hcHByb3ZhbP0HLG1pbl9zdXBwb3J0/QcDCAQBCAQFCAAEdQQAAggIVjABAQUIVjEBAQUADCBkZWxlZ2F0ZQAocHJveHlfdHlwZekBFGRlbGF5BAQVCAADCBkICAAMEHJlYWwAJGNhbGxfaGFzaCAYaGVpZ2h0BAQhCAADCCUICAMIACAAEBB3aGVu8QEcZGVwb3NpdAgkZGVwb3NpdG9yACRhcHByb3ZhbHPdAwIYIFByb3Bvc2VkAQEFIEFwcHJvdmVkAQEFGEZ1bmRlZAEBBTxDdXJhdG9yUHJvcG9zZWQBAAQcY3VyYXRvcgAYQWN0aXZlAQAIHGN1cmF0b3IAKHVwZGF0ZV9kdWUENFBlbmRpbmdQYXlvdXQBAAwcY3VyYXRvcgAsYmVuZWZpY2lhcnkAJHVubG9ja19hdAQAGCBwcm9wb3NlcgAUdmFsdWUIDGZlZQg8Y3VyYXRvcl9kZXBvc2l0CBBib25kCBhzdGF0dXM1CAIQFEFkZGVkAQEFPEN1cmF0b3JQcm9wb3NlZAEABBxjdXJhdG9yABhBY3RpdmUBAAQcY3VyYXRvcgA0UGVuZGluZ1BheW91dAEADBxjdXJhdG9yACxiZW5lZmljaWFyeQAkdW5sb2NrX2F0BAAUNHBhcmVudF9ib3VudHkEFHZhbHVlCAxmZWUIPGN1cmF0b3JfZGVwb3NpdAgYc3RhdHVzPQgADCBzdXBwb3J0c3UFFHNjb3JlCQIcY29tcHV0ZQECAwwACN0DBEkIAAAIGHZvdGVyc00IHHRhcmdldHPdAwMMCQIEBARVCAAAEAx3aG8AHGRlcG9zaXQIMHJhd19zb2x1dGlvblkFIGNhbGxfZmVlCAAUCGlkABBwcmV2BQIQbmV4dAUCJGJhZ191cHBlcggUc2NvcmUIAAgQaGVhZAUCEHRhaWwFAgQIAAAQHHBvb2xfaWQEGHBvaW50cwhwbGFzdF9yZWNvcmRlZF9yZXdhcmRfY291bnRlcgg4dW5ib25kaW5nX2VyYXPZBwYpAgAUHGN1cnJlbnQlAgxtYXgtBCxjaGFuZ2VfcmF0ZXEINHRocm90dGxlX2Zyb20tBEBjbGFpbV9wZXJtaXNzaW9uMQIAECRkZXBvc2l0b3IAEHJvb3QFAiRub21pbmF0b3IFAhxib3VuY2VyBQIAFChjb21taXNzaW9udQg4bWVtYmVyX2NvdW50ZXIEGHBvaW50cwgUcm9sZXN5CBRzdGF0ZR0CABRwbGFzdF9yZWNvcmRlZF9yZXdhcmRfY291bnRlcghsbGFzdF9yZWNvcmRlZF90b3RhbF9wYXlvdXRzCFR0b3RhbF9yZXdhcmRzX2NsYWltZWQIYHRvdGFsX2NvbW1pc3Npb25fcGVuZGluZwhgdG90YWxfY29tbWlzc2lvbl9jbGFpbWVkCAAIGHBvaW50cwgcYmFsYW5jZQgDCASFCASJCAAACBhub19lcmGFCCB3aXRoX2VyYY0IAAgcc3Rhc2hlc2kFHGNoZWNrZWQ5AgCMNG1heF9jb2RlX3NpemUESG1heF9oZWFkX2RhdGFfc2l6ZQRYbWF4X3Vwd2FyZF9xdWV1ZV9jb3VudARUbWF4X3Vwd2FyZF9xdWV1ZV9zaXplBFxtYXhfdXB3YXJkX21lc3NhZ2Vfc2l6ZQSQbWF4X3Vwd2FyZF9tZXNzYWdlX251bV9wZXJfY2FuZGlkYXRlBIhocm1wX21heF9tZXNzYWdlX251bV9wZXJfY2FuZGlkYXRlBGx2YWxpZGF0aW9uX3VwZ3JhZGVfY29vbGRvd24EYHZhbGlkYXRpb25fdXBncmFkZV9kZWxheQRQYXN5bmNfYmFja2luZ19wYXJhbXOVBTBtYXhfcG92X3NpemUEZG1heF9kb3dud2FyZF9tZXNzYWdlX3NpemUEkGhybXBfbWF4X3BhcmFjaGFpbl9vdXRib3VuZF9jaGFubmVscwRMaHJtcF9zZW5kZXJfZGVwb3NpdAhYaHJtcF9yZWNpcGllbnRfZGVwb3NpdAhkaHJtcF9jaGFubmVsX21heF9jYXBhY2l0eQRsaHJtcF9jaGFubmVsX21heF90b3RhbF9zaXplBIxocm1wX21heF9wYXJhY2hhaW5faW5ib3VuZF9jaGFubmVscwR0aHJtcF9jaGFubmVsX21heF9tZXNzYWdlX3NpemUEPGV4ZWN1dG9yX3BhcmFtc6UFVGNvZGVfcmV0ZW50aW9uX3BlcmlvZAQ4bWF4X3ZhbGlkYXRvcnMtBDhkaXNwdXRlX3BlcmlvZASkZGlzcHV0ZV9wb3N0X2NvbmNsdXNpb25fYWNjZXB0YW5jZV9wZXJpb2QENG5vX3Nob3dfc2xvdHMEQG5fZGVsYXlfdHJhbmNoZXMEaHplcm90aF9kZWxheV90cmFuY2hlX3dpZHRoBEBuZWVkZWRfYXBwcm92YWxzBGByZWxheV92cmZfbW9kdWxvX3NhbXBsZXMEOHB2Zl92b3RpbmdfdHRsBIBtaW5pbXVtX3ZhbGlkYXRpb25fdXBncmFkZV9kZWxheQRUbWluaW11bV9iYWNraW5nX3ZvdGVzBDRub2RlX2ZlYXR1cmVzsQVYYXBwcm92YWxfdm90aW5nX3BhcmFtcwRAc2NoZWR1bGVyX3BhcmFtc6kFAwgEmQgEnQgABCABCASlCAAACBhidWZmZXKpCDRsYXRlc3RfbnVtYmVyBAAkEGNvcmUEEGhhc2ggKGRlc2NyaXB0b3JFAixjb21taXRtZW50c8kFSGF2YWlsYWJpbGl0eV92b3Rlc7EFHGJhY2tlcnOxBUxyZWxheV9wYXJlbnRfbnVtYmVyBEBiYWNrZWRfaW5fbnVtYmVyBDRiYWNraW5nX2dyb3VwBASxCAADCATRBQS5CAADCEkCvQgEwQgAAAwcc2Vzc2lvbgSAYmFja2luZ192YWxpZGF0b3JzX3Blcl9jYW5kaWRhdGXFCCBkaXNwdXRlc/kFBDkCAAIIEFBvb2wBAAgccGFyYV9pZAQoY29yZV9pbmRleAQQQnVsawEBAgAMKGFzc2lnbm1lbnTRCFRhdmFpbGFiaWxpdHlfdGltZW91dHMEDHR0bAQCCBBGcmVlAQEFFFBhcmFzAQAMKGFzc2lnbm1lbnTRCFRhdmFpbGFiaWxpdHlfdGltZW91dHMEDHR0bAQE2QgABNUIAAMIBOEIBOUIAAIIQFNldEdvQWhlYWRTaWduYWwBAQVQQXBwbHlBdEV4cGVjdGVkQmxvY2sBAQUCCChPbmJvYXJkaW5nAQECHFVwZ3JhZGUBAAwIaWQELGluY2x1ZGVkX2F0BEB1cGdyYWRlX3N0cmF0ZWd57QgE8QgAABQwdm90ZXNfYWNjZXB0sQUwdm90ZXNfcmVqZWN0sQUMYWdlBChjcmVhdGVkX2F0BBhjYXVzZXP1CAIcKE9uYm9hcmRpbmcBAQUoUGFyYXRocmVhZAEBBSRQYXJhY2hhaW4BAQVMVXBncmFkaW5nUGFyYXRocmVhZAEBBVBEb3duZ3JhZGluZ1BhcmFjaGFpbgEBBVRPZmZib2FyZGluZ1BhcmF0aHJlYWQBAQVQT2ZmYm9hcmRpbmdQYXJhY2hhaW4BAQUACCxleHBlY3RlZF9hdAQwYWN0aXZhdGVkX2F0BAQBCQAACDR1cGdyYWRlX3RpbWVzBQksbGFzdF9wcnVuZWQtBAIIFEFib3J0AQEFHEdvQWhlYWQBAQUCBBxQcmVzZW50AQEFAAwwZ2VuZXNpc19oZWFkJDx2YWxpZGF0aW9uX2NvZGUkJHBhcmFfa2luZBQADCh2YWxpZGF0b3JzOQMYcXVldWVkOQM0c2Vzc2lvbl9pbmRleAQEGQkAAAgcc2VudF9hdAQMbXNnJAQhCQAAGCRjb25maXJtZWQUEF9hZ2UEOHNlbmRlcl9kZXBvc2l0CEBtYXhfbWVzc2FnZV9zaXplBDBtYXhfY2FwYWNpdHkEOG1heF90b3RhbF9zaXplBARVAgAAIDBtYXhfY2FwYWNpdHkEOG1heF90b3RhbF9zaXplBEBtYXhfbWVzc2FnZV9zaXplBCRtc2dfY291bnQEKHRvdGFsX3NpemUEIG1xY19oZWFkEQE4c2VuZGVyX2RlcG9zaXQIRHJlY2lwaWVudF9kZXBvc2l0CAAIHHNlbnRfYXQEEGRhdGEkBDUJAAMIBDkCBD0JAAA0YGFjdGl2ZV92YWxpZGF0b3JfaW5kaWNlczkCLHJhbmRvbV9zZWVkIDhkaXNwdXRlX3BlcmlvZAQodmFsaWRhdG9yczkDOGRpc2NvdmVyeV9rZXlzOQM8YXNzaWdubWVudF9rZXlzOQNAdmFsaWRhdG9yX2dyb3Vwc80IHG5fY29yZXMEaHplcm90aF9kZWxheV90cmFuY2hlX3dpZHRoBGByZWxheV92cmZfbW9kdWxvX3NhbXBsZXMEQG5fZGVsYXlfdHJhbmNoZXMENG5vX3Nob3dfc2xvdHMEQG5lZWRlZF9hcHByb3ZhbHMEAwgEIAAQOHZhbGlkYXRvcnNfZm9ysQVIdmFsaWRhdG9yc19hZ2FpbnN0sQUUc3RhcnQEMGNvbmNsdWRlZF9hdC0EBEkJAAAIEGtleXNRCRBraW5kHQYACChjb3JlX2luZGV4BBRjb3VudAQAEBx0cmFmZmljCChuZXh0X2luZGV4BDhzbWFsbGVzdF9pbmRleAQ0ZnJlZWRfaW5kaWNlczkCAAgccGFyYV9pZAQMaWR4BARhCQAADCxhc3NpZ25tZW50c1UGIGVuZF9oaW50LQQ0bmV4dF9zY2hlZHVsZS0EAAgUZmlyc3QEEGxhc3QEBm0JAAgUcmF0aW8EJHJlbWFpbmluZwQDCE0GdQkEeQkAABAsYXNzaWdubWVudHN9CSBlbmRfaGludC0EDHBvcwQQc3RlcAQGgQkACBRxdWV1ZXEJMGN1cnJlbnRfd29ya4UJAAwcbWFuYWdlcgAcZGVwb3NpdAgYbG9ja2VkTQQE4QYAAwwABAgGlQkEmQkBkAIMFE5ldmVyAQEFJFByZUVuZGluZwEBAhhFbmRpbmcBAQIAKCRkZXBvc2l0b3IAIHZlcmlmaWVyPQYcZGVwb3NpdAgYcmFpc2VkCAxlbmQEDGNhcAhEbGFzdF9jb250cmlidXRpb26hCTBmaXJzdF9wZXJpb2QELGxhc3RfcGVyaW9kBChmdW5kX2luZGV4BAaZAQbBBgIMCFYyAQIQEE51bGwBAQUYQXNzZXRzAQQJAwA8RXhlY3V0aW9uUmVzdWx0AQZ1BhxWZXJzaW9uAQECCFYzAQIYEE51bGwBAQUYQXNzZXRzAQQRAwA8RXhlY3V0aW9uUmVzdWx0AQalAhxWZXJzaW9uAQECLFBhbGxldHNJbmZvAQStAgA4RGlzcGF0Y2hSZXN1bHQBAgwcU3VjY2VzcwEBBRRFcnJvcgEFADhUcnVuY2F0ZWRFcnJvcgEFAAhWNAECGBBOdWxsAQEFGEFzc2V0cwEEnQIAPEV4ZWN1dGlvblJlc3VsdAEGpQIcVmVyc2lvbgEBAixQYWxsZXRzSW5mbwEErQIAOERpc3BhdGNoUmVzdWx0AQIMHFN1Y2Nlc3MBAQUURXJyb3IBBQA4VHJ1bmNhdGVkRXJyb3IBBQACDBxQZW5kaW5nAQAQJHJlc3BvbmRlcpkBTG1heWJlX21hdGNoX3F1ZXJpZXKpCTBtYXliZV9ub3RpZnmtCRx0aW1lb3V0BDxWZXJzaW9uTm90aWZpZXIBAAgYb3JpZ2lumQEkaXNfYWN0aXZlFBRSZWFkeQEACCByZXNwb25zZbEJCGF0BAMIBJkBAwwIGAQDCJkBBATBCQACEFxNaWdyYXRlU3VwcG9ydGVkVmVyc2lvbgEBBVxNaWdyYXRlVmVyc2lvbk5vdGlmaWVycwEBBVBOb3RpZnlDdXJyZW50VGFyZ2V0cwEGJGhNaWdyYXRlQW5kTm90aWZ5T2xkVGFyZ2V0cwEBBQMMBACxBgMIFQEIBNEJAAAQGGFtb3VudAgUb3duZXKZARhsb2NrZXKZASRjb25zdW1lcnPVCQMICJkBBN0JAAAIEHByZXYlAxBuZXh0JQMG5QkAGBRiZWdpbgQMZW5kBBRjb3VudARAcmVhZHlfbmVpZ2hib3Vyc+kJNG1lc3NhZ2VfY291bnQIEHNpemUIAwglAwQAGCRyZW1haW5pbmcEOHJlbWFpbmluZ19zaXplBCxmaXJzdF9pbmRleAQUZmlyc3QEEGxhc3QEEGhlYXAkBAkEAAAMCGlkCAxsZW4ERGtleXNldF9jb21taXRtZW50IAAIJGluZmxhdGlvbggkbmV4dF9taW50wQMACBhoZWFkZXK1AyhleHRyaW5zaWNzfQMCCDRBbGxFeHRyaW5zaWNzAQEFNE9ubHlJbmhlcmVudHMBAQUCLBBDYWxsAQEFHFBheW1lbnQBAQUYRnV0dXJlAQEFFFN0YWxlAQEFIEJhZFByb29mAQEFREFuY2llbnRCaXJ0aEJsb2NrAQEFREV4aGF1c3RzUmVzb3VyY2VzAQEFGEN1c3RvbQEBAjBCYWRNYW5kYXRvcnkBAQVMTWFuZGF0b3J5VmFsaWRhdGlvbgEBBSRCYWRTaWduZXIBAQUCDDBDYW5ub3RMb29rdXABAQVMTm9VbnNpZ25lZFZhbGlkYXRvcgEBBRhDdXN0b20BAQICCBxJbnZhbGlkAQIsEENhbGwBAQUcUGF5bWVudAEBBRhGdXR1cmUBAQUUU3RhbGUBAQUgQmFkUHJvb2YBAQVEQW5jaWVudEJpcnRoQmxvY2sBAQVERXhoYXVzdHNSZXNvdXJjZXMBAQUYQ3VzdG9tAQECMEJhZE1hbmRhdG9yeQEBBUxNYW5kYXRvcnlWYWxpZGF0aW9uAQEFJEJhZFNpZ25lcgEBBRxVbmtub3duAQIMMENhbm5vdExvb2t1cAEBBUxOb1Vuc2lnbmVkVmFsaWRhdG9yAQEFGEN1c3RvbQEBAgcZARUKAwiRAiQEHQoAAAwQb2theRQsZmF0YWxfZXJyb3IUGGVycm9ycyEKAgwcSW5CbG9jawEBBRRMb2NhbAEBBSBFeHRlcm5hbAEBBQAUIHByaW9yaXR5CCByZXF1aXJlc30DIHByb3ZpZGVzfQMkbG9uZ2V2aXR5CCRwcm9wYWdhdGUUBy0KFQoADExzZXNzaW9uX3N0YXJ0X2Jsb2NrBGBncm91cF9yb3RhdGlvbl9mcmVxdWVuY3kEDG5vdwQDCM0INQoACBxwYXJhX2lkBCBjb2xsYXRvchEBBj0KACBQbmV4dF91cF9vbl9hdmFpbGFibGVBCjhvY2N1cGllZF9zaW5jZQQsdGltZV9vdXRfYXQETG5leHRfdXBfb25fdGltZV9vdXRBCjBhdmFpbGFiaWxpdHmxBURncm91cF9yZXNwb25zaWJsZQQ4Y2FuZGlkYXRlX2hhc2ggUGNhbmRpZGF0ZV9kZXNjcmlwdG9yRQICDCBPY2N1cGllZAEAIFBuZXh0X3VwX29uX2F2YWlsYWJsZUEKOG9jY3VwaWVkX3NpbmNlBCx0aW1lX291dF9hdARMbmV4dF91cF9vbl90aW1lX291dEEKMGF2YWlsYWJpbGl0ebEFRGdyb3VwX3Jlc3BvbnNpYmxlBDhjYW5kaWRhdGVfaGFzaCBQY2FuZGlkYXRlX2Rlc2NyaXB0b3JFAiRTY2hlZHVsZWQBAAgccGFyYV9pZAQgY29sbGF0b3IRARBGcmVlAQEFBEkKAAIMIEluY2x1ZGVkAQEFIFRpbWVkT3V0AQEFEEZyZWUBAQUAECxwYXJlbnRfaGVhZCRMcmVsYXlfcGFyZW50X251bWJlcgRkcmVsYXlfcGFyZW50X3N0b3JhZ2Vfcm9vdCAwbWF4X3Bvdl9zaXplBAZVCgMIVQogBl0KBs0FAgw8Q2FuZGlkYXRlQmFja2VkAQMQSQIkBAREQ2FuZGlkYXRlSW5jbHVkZWQBAxBJAiQEBERDYW5kaWRhdGVUaW1lZE91dAEDDEkCJAQEaQoAAwgEOQkEcQoABskIBkUJAwwEIE0JBIEKAAalBQMMBCBVCQSNCgAACDxieXRlc19yZW1haW5pbmcESG1lc3NhZ2VzX3JlbWFpbmluZwQDCASVCgSZCgAGEQkGSQkAOFxtaW5fcmVsYXlfcGFyZW50X251bWJlcgQwbWF4X3Bvdl9zaXplBDRtYXhfY29kZV9zaXplBDR1bXBfcmVtYWluaW5nBEx1bXBfcmVtYWluaW5nX2J5dGVzBGRtYXhfdW1wX251bV9wZXJfY2FuZGlkYXRlBFhkbXBfcmVtYWluaW5nX21lc3NhZ2VzOQIwaHJtcF9pbmJvdW5kOQJEaHJtcF9jaGFubmVsc19vdXSdCmhtYXhfaHJtcF9udW1fcGVyX2NhbmRpZGF0ZQQ8cmVxdWlyZWRfcGFyZW50JFB2YWxpZGF0aW9uX2NvZGVfaGFzaCBMdXBncmFkZV9yZXN0cmljdGlvbqEKWGZ1dHVyZV92YWxpZGF0aW9uX2NvZGWlCgAUOGNhbmRpZGF0ZV9oYXNoIChkZXNjcmlwdG9yRQIsY29tbWl0bWVudHPJBUxyZWxheV9wYXJlbnRfbnVtYmVyBDBtYXhfcG92X3NpemUEBK0KAAAILGNvbnN0cmFpbnRzqQpQcGVuZGluZ19hdmFpbGFiaWxpdHmxCga1CgTNBQAACCh2YWxpZGF0b3Jz+QkIaWQIBsEKAihASW52YWxpZE51bWVyaWNPcAEBBRBQdXNoAQEFHEdldFJvb3QBAQUYQ29tbWl0AQEFNEdlbmVyYXRlUHJvb2YBAQUYVmVyaWZ5AQEFMExlYWZOb3RGb3VuZAEBBURQYWxsZXROb3RJbmNsdWRlZAEBBUBJbnZhbGlkTGVhZkluZGV4AQEFVEludmFsaWRCZXN0S25vd25CbG9jawEBBQcgyQoHCMkKAAwwbGVhZl9pbmRpY2VzaQgobGVhZl9jb3VudAgUaXRlbXM5AwMIfQPVCgfZCskKBxUByQoAGDRzbG90X2R1cmF0aW9uCDBlcG9jaF9sZW5ndGgIBGPBAyxhdXRob3JpdGllc1UBKHJhbmRvbW5lc3MgNGFsbG93ZWRfc2xvdHPFAwAYLGVwb2NoX2luZGV4CChzdGFydF9zbG90CCBkdXJhdGlvbggsYXV0aG9yaXRpZXNVAShyYW5kb21uZXNzIBhjb25maWcFBwMIJCgE7QoABvEKAAwYd2VpZ2h0GBRjbGFzczgscGFydGlhbF9mZWUIAAwgYmFzZV9mZWUIHGxlbl9mZWUITGFkanVzdGVkX3dlaWdodF9mZWUIBv0KAAg0aW5jbHVzaW9uX2ZlZQELDHRpcAgEsQYAAhg0VW5pbXBsZW1lbnRlZAEBBWRWZXJzaW9uZWRDb252ZXJzaW9uRmFpbGVkAQEFTFdlaWdodE5vdENvbXB1dGFibGUBAQVMVW5oYW5kbGVkWGNtVmVyc2lvbgEBBTRBc3NldE5vdEZvdW5kAQEFKFVucm91dGFibGUBAQUHCQsNCwcYDQsHCA0LBxkDDQsENQMABqkGBKkGAAMImQEpCwQtCwAAEEBleGVjdXRpb25fcmVzdWx0vQE4ZW1pdHRlZF9ldmVudHMhCyRsb2NhbF94Y20lCzhmb3J3YXJkZWRfeGNtczELAgg0VW5pbXBsZW1lbnRlZAEBBWRWZXJzaW9uZWRDb252ZXJzaW9uRmFpbGVkAQEFBzULOQsADEBleGVjdXRpb25fcmVzdWx0jQI4ZW1pdHRlZF9ldmVudHMhCzhmb3J3YXJkZWRfeGNtczELB0ELOQsCCCxVbnN1cHBvcnRlZAEBBWRWZXJzaW9uZWRDb252ZXJzaW9uRmFpbGVkAQEFBwBJCwcVAUkDBkkDBEkDAAIsNEFscmVhZHlNZW1iZXIBAQUkTm90TWVtYmVyAQEFKE5vdFBvbGxpbmcBAQUcT25nb2luZwEBBTROb25lUmVtYWluaW5nAQEFKENvcnJ1cHRpb24BAQUoUmFua1Rvb0xvdwEBBThJbnZhbGlkV2l0bmVzcwEBBTBOb1Blcm1pc3Npb24BAQUoU2FtZU1lbWJlcgEBBThUb29NYW55TWVtYmVycwEBBQKAJE5vdE1lbWJlcgEBBTRBbHJlYWR5TWVtYmVyAQEFJFN1c3BlbmRlZAEBBTBOb3RTdXNwZW5kZWQBAQUgTm9QYXlvdXQBAQU4QWxyZWFkeUZvdW5kZWQBAQU8SW5zdWZmaWNpZW50UG90AQEFPEFscmVhZHlWb3VjaGluZwEBBUxOb3RWb3VjaGluZ09uQmlkZGVyAQEFEEhlYWQBAQUcRm91bmRlcgEBBShBbHJlYWR5QmlkAQEFQEFscmVhZHlDYW5kaWRhdGUBAQUwTm90Q2FuZGlkYXRlAQEFKE1heE1lbWJlcnMBAQUoTm90Rm91bmRlcgEBBRxOb3RIZWFkAQEFLE5vdEFwcHJvdmVkAQEFLE5vdFJlamVjdGVkAQEFIEFwcHJvdmVkAQEFIFJlamVjdGVkAQEFKEluUHJvZ3Jlc3MBAQUgVG9vRWFybHkBAQUUVm90ZWQBAQUcRXhwaXJlZAEBBSROb3RCaWRkZXIBAQUoTm9EZWZlbmRlcgEBBSBOb3RHcm91cAEBBTxBbHJlYWR5RWxldmF0ZWQBAQU8QWxyZWFkeVB1bmlzaGVkAQEFREluc3VmZmljaWVudEZ1bmRzAQEFHE5vVm90ZXMBAQUCQChOb3RBbGxvd2VkAQEFNFplcm9UaHJlc2hvbGQBAQVATm90RW5vdWdoRnJpZW5kcwEBBShNYXhGcmllbmRzAQEFJE5vdFNvcnRlZAEBBThOb3RSZWNvdmVyYWJsZQEBBUhBbHJlYWR5UmVjb3ZlcmFibGUBAQU4QWxyZWFkeVN0YXJ0ZWQBAQUoTm90U3RhcnRlZAEBBSROb3RGcmllbmQBAQUsRGVsYXlQZXJpb2QBAQU4QWxyZWFkeVZvdWNoZWQBAQUkVGhyZXNob2xkAQEFLFN0aWxsQWN0aXZlAQEFMEFscmVhZHlQcm94eQEBBSBCYWRTdGF0ZQEBBQI8QER1cmF0aW9uVG9vU21hbGwBAQU4RHVyYXRpb25Ub29CaWcBAQU4QW1vdW50VG9vU21hbGwBAQUkQmlkVG9vTG93AQEFOFVua25vd25SZWNlaXB0AQEFIE5vdE93bmVyAQEFKE5vdEV4cGlyZWQBAQUoVW5rbm93bkJpZAEBBTRQb3J0aW9uVG9vQmlnAQEFIFVuZnVuZGVkAQEFNEFscmVhZHlGdW5kZWQBAQUkVGhyb3R0bGVkAQEFJE1ha2VzRHVzdAEBBTxBbHJlYWR5Q29tbXVuYWwBAQU4QWxyZWFkeVByaXZhdGUBAQUCAQEYU3lzdGVtAQIkPEludmFsaWRTcGVjTmFtZQEBBWhTcGVjVmVyc2lvbk5lZWRzVG9JbmNyZWFzZQEBBXRGYWlsZWRUb0V4dHJhY3RSdW50aW1lVmVyc2lvbgEBBUxOb25EZWZhdWx0Q29tcG9zaXRlAQEFPE5vblplcm9SZWZDb3VudAEBBTBDYWxsRmlsdGVyZWQBAQVsTXVsdGlCbG9ja01pZ3JhdGlvbnNPbmdvaW5nAQEFRE5vdGhpbmdBdXRob3JpemVkAQEFMFVuYXV0aG9yaXplZAEBBRBCYWJlAQIQYEludmFsaWRFcXVpdm9jYXRpb25Qcm9vZgEBBWBJbnZhbGlkS2V5T3duZXJzaGlwUHJvb2YBAQVYRHVwbGljYXRlT2ZmZW5jZVJlcG9ydAEBBVBJbnZhbGlkQ29uZmlndXJhdGlvbgEBBSRUaW1lc3RhbXABAQUcSW5kaWNlcwECFCxOb3RBc3NpZ25lZAEBBSBOb3RPd25lcgEBBRRJblVzZQEBBSxOb3RUcmFuc2ZlcgEBBSRQZXJtYW5lbnQBAQUgQmFsYW5jZXMBAjA4VmVzdGluZ0JhbGFuY2UBAQVUTGlxdWlkaXR5UmVzdHJpY3Rpb25zAQEFTEluc3VmZmljaWVudEJhbGFuY2UBAQVIRXhpc3RlbnRpYWxEZXBvc2l0AQEFNEV4cGVuZGFiaWxpdHkBAQVcRXhpc3RpbmdWZXN0aW5nU2NoZWR1bGUBAQUsRGVhZEFjY291bnQBAQU8VG9vTWFueVJlc2VydmVzAQEFMFRvb01hbnlIb2xkcwEBBThUb29NYW55RnJlZXplcwEBBUxJc3N1YW5jZURlYWN0aXZhdGVkAQEFJERlbHRhWmVybwEBBUhUcmFuc2FjdGlvblBheW1lbnQBAQUoQXV0aG9yc2hpcAEBBRxTdGFraW5nAQJ8NE5vdENvbnRyb2xsZXIBAQUgTm90U3Rhc2gBAQU0QWxyZWFkeUJvbmRlZAEBBTRBbHJlYWR5UGFpcmVkAQEFMEVtcHR5VGFyZ2V0cwEBBThEdXBsaWNhdGVJbmRleAEBBURJbnZhbGlkU2xhc2hJbmRleAEBBUBJbnN1ZmZpY2llbnRCb25kAQEFME5vTW9yZUNodW5rcwEBBTROb1VubG9ja0NodW5rAQEFMEZ1bmRlZFRhcmdldAEBBUhJbnZhbGlkRXJhVG9SZXdhcmQBAQVoSW52YWxpZE51bWJlck9mTm9taW5hdGlvbnMBAQVITm90U29ydGVkQW5kVW5pcXVlAQEFOEFscmVhZHlDbGFpbWVkAQEFLEludmFsaWRQYWdlAQEFVEluY29ycmVjdEhpc3RvcnlEZXB0aAEBBVhJbmNvcnJlY3RTbGFzaGluZ1NwYW5zAQEFIEJhZFN0YXRlAQEFOFRvb01hbnlUYXJnZXRzAQEFJEJhZFRhcmdldAEBBUBDYW5ub3RDaGlsbE90aGVyAQEFRFRvb01hbnlOb21pbmF0b3JzAQEFRFRvb01hbnlWYWxpZGF0b3JzAQEFQENvbW1pc3Npb25Ub29Mb3cBAQUsQm91bmROb3RNZXQBAQVQQ29udHJvbGxlckRlcHJlY2F0ZWQBAQVMQ2Fubm90UmVzdG9yZUxlZGdlcgEBBWxSZXdhcmREZXN0aW5hdGlvblJlc3RyaWN0ZWQBAQU4Tm90RW5vdWdoRnVuZHMBAQVcVmlydHVhbFN0YWtlck5vdEFsbG93ZWQBAQUgT2ZmZW5jZXMBAQUoSGlzdG9yaWNhbAEBBRxTZXNzaW9uAQIUMEludmFsaWRQcm9vZgEBBVxOb0Fzc29jaWF0ZWRWYWxpZGF0b3JJZAEBBTREdXBsaWNhdGVkS2V5AQEFGE5vS2V5cwEBBSROb0FjY291bnQBAQUcR3JhbmRwYQECHCxQYXVzZUZhaWxlZAEBBTBSZXN1bWVGYWlsZWQBAQU0Q2hhbmdlUGVuZGluZwEBBRxUb29Tb29uAQEFYEludmFsaWRLZXlPd25lcnNoaXBQcm9vZgEBBWBJbnZhbGlkRXF1aXZvY2F0aW9uUHJvb2YBAQVYRHVwbGljYXRlT2ZmZW5jZVJlcG9ydAEBBUhBdXRob3JpdHlEaXNjb3ZlcnkBAQUgVHJlYXN1cnkBAiwwSW52YWxpZEluZGV4AQEFQFRvb01hbnlBcHByb3ZhbHMBAQVYSW5zdWZmaWNpZW50UGVybWlzc2lvbgEBBUxQcm9wb3NhbE5vdEFwcHJvdmVkAQEFWEZhaWxlZFRvQ29udmVydEJhbGFuY2UBAQUwU3BlbmRFeHBpcmVkAQEFLEVhcmx5UGF5b3V0AQEFQEFscmVhZHlBdHRlbXB0ZWQBAQUsUGF5b3V0RXJyb3IBAQUwTm90QXR0ZW1wdGVkAQEFMEluY29uY2x1c2l2ZQEBBUBDb252aWN0aW9uVm90aW5nAQIwKE5vdE9uZ29pbmcBAQUgTm90Vm90ZXIBAQUwTm9QZXJtaXNzaW9uAQEFPE5vUGVybWlzc2lvbllldAEBBURBbHJlYWR5RGVsZWdhdGluZwEBBTRBbHJlYWR5Vm90aW5nAQEFREluc3VmZmljaWVudEZ1bmRzAQEFNE5vdERlbGVnYXRpbmcBAQUgTm9uc2Vuc2UBAQU8TWF4Vm90ZXNSZWFjaGVkAQEFLENsYXNzTmVlZGVkAQEFIEJhZENsYXNzAQEFJFJlZmVyZW5kYQECOChOb3RPbmdvaW5nAQEFKEhhc0RlcG9zaXQBAQUgQmFkVHJhY2sBAQUQRnVsbAEBBShRdWV1ZUVtcHR5AQEFNEJhZFJlZmVyZW5kdW0BAQUsTm90aGluZ1RvRG8BAQUcTm9UcmFjawEBBShVbmZpbmlzaGVkAQEFME5vUGVybWlzc2lvbgEBBSROb0RlcG9zaXQBAQUkQmFkU3RhdHVzAQEFQFByZWltYWdlTm90RXhpc3QBAQWEUHJlaW1hZ2VTdG9yZWRXaXRoRGlmZmVyZW50TGVuZ3RoAQEFUEZlbGxvd3NoaXBDb2xsZWN0aXZlAQIsNEFscmVhZHlNZW1iZXIBAQUkTm90TWVtYmVyAQEFKE5vdFBvbGxpbmcBAQUcT25nb2luZwEBBTROb25lUmVtYWluaW5nAQEFKENvcnJ1cHRpb24BAQUoUmFua1Rvb0xvdwEBBThJbnZhbGlkV2l0bmVzcwEBBTBOb1Blcm1pc3Npb24BAQUoU2FtZU1lbWJlcgEBBThUb29NYW55TWVtYmVycwEBBUxGZWxsb3dzaGlwUmVmZXJlbmRhAQI4KE5vdE9uZ29pbmcBAQUoSGFzRGVwb3NpdAEBBSBCYWRUcmFjawEBBRBGdWxsAQEFKFF1ZXVlRW1wdHkBAQU0QmFkUmVmZXJlbmR1bQEBBSxOb3RoaW5nVG9EbwEBBRxOb1RyYWNrAQEFKFVuZmluaXNoZWQBAQUwTm9QZXJtaXNzaW9uAQEFJE5vRGVwb3NpdAEBBSRCYWRTdGF0dXMBAQVAUHJlaW1hZ2VOb3RFeGlzdAEBBYRQcmVpbWFnZVN0b3JlZFdpdGhEaWZmZXJlbnRMZW5ndGgBAQUcT3JpZ2lucwEBBSRXaGl0ZWxpc3QBAhRMVW5hdmFpbGFibGVQcmVJbWFnZQEBBTxVbmRlY29kYWJsZUNhbGwBAQVgSW52YWxpZENhbGxXZWlnaHRXaXRuZXNzAQEFUENhbGxJc05vdFdoaXRlbGlzdGVkAQEFWENhbGxBbHJlYWR5V2hpdGVsaXN0ZWQBAQUoUGFyYW1ldGVycwEBBRhDbGFpbXMBAhhgSW52YWxpZEV0aGVyZXVtU2lnbmF0dXJlAQEFQFNpZ25lckhhc05vQ2xhaW0BAQVAU2VuZGVySGFzTm9DbGFpbQEBBTBQb3RVbmRlcmZsb3cBAQVASW52YWxpZFN0YXRlbWVudAEBBUxWZXN0ZWRCYWxhbmNlRXhpc3RzAQEFHFV0aWxpdHkBAgQwVG9vTWFueUNhbGxzAQEFHFNvY2lldHkBAoAkTm90TWVtYmVyAQEFNEFscmVhZHlNZW1iZXIBAQUkU3VzcGVuZGVkAQEFME5vdFN1c3BlbmRlZAEBBSBOb1BheW91dAEBBThBbHJlYWR5Rm91bmRlZAEBBTxJbnN1ZmZpY2llbnRQb3QBAQU8QWxyZWFkeVZvdWNoaW5nAQEFTE5vdFZvdWNoaW5nT25CaWRkZXIBAQUQSGVhZAEBBRxGb3VuZGVyAQEFKEFscmVhZHlCaWQBAQVAQWxyZWFkeUNhbmRpZGF0ZQEBBTBOb3RDYW5kaWRhdGUBAQUoTWF4TWVtYmVycwEBBShOb3RGb3VuZGVyAQEFHE5vdEhlYWQBAQUsTm90QXBwcm92ZWQBAQUsTm90UmVqZWN0ZWQBAQUgQXBwcm92ZWQBAQUgUmVqZWN0ZWQBAQUoSW5Qcm9ncmVzcwEBBSBUb29FYXJseQEBBRRWb3RlZAEBBRxFeHBpcmVkAQEFJE5vdEJpZGRlcgEBBShOb0RlZmVuZGVyAQEFIE5vdEdyb3VwAQEFPEFscmVhZHlFbGV2YXRlZAEBBTxBbHJlYWR5UHVuaXNoZWQBAQVESW5zdWZmaWNpZW50RnVuZHMBAQUcTm9Wb3RlcwEBBSBSZWNvdmVyeQECQChOb3RBbGxvd2VkAQEFNFplcm9UaHJlc2hvbGQBAQVATm90RW5vdWdoRnJpZW5kcwEBBShNYXhGcmllbmRzAQEFJE5vdFNvcnRlZAEBBThOb3RSZWNvdmVyYWJsZQEBBUhBbHJlYWR5UmVjb3ZlcmFibGUBAQU4QWxyZWFkeVN0YXJ0ZWQBAQUoTm90U3RhcnRlZAEBBSROb3RGcmllbmQBAQUsRGVsYXlQZXJpb2QBAQU4QWxyZWFkeVZvdWNoZWQBAQUkVGhyZXNob2xkAQEFLFN0aWxsQWN0aXZlAQEFMEFscmVhZHlQcm94eQEBBSBCYWRTdGF0ZQEBBRxWZXN0aW5nAQIUKE5vdFZlc3RpbmcBAQVUQXRNYXhWZXN0aW5nU2NoZWR1bGVzAQEFJEFtb3VudExvdwEBBWBTY2hlZHVsZUluZGV4T3V0T2ZCb3VuZHMBAQVUSW52YWxpZFNjaGVkdWxlUGFyYW1zAQEFJFNjaGVkdWxlcgECFEBGYWlsZWRUb1NjaGVkdWxlAQEFIE5vdEZvdW5kAQEFXFRhcmdldEJsb2NrTnVtYmVySW5QYXN0AQEFSFJlc2NoZWR1bGVOb0NoYW5nZQEBBRROYW1lZAEBBRRQcm94eQECIBxUb29NYW55AQEFIE5vdEZvdW5kAQEFIE5vdFByb3h5AQEFLFVucHJveHlhYmxlAQEFJER1cGxpY2F0ZQEBBTBOb1Blcm1pc3Npb24BAQUsVW5hbm5vdW5jZWQBAQUsTm9TZWxmUHJveHkBAQUgTXVsdGlzaWcBAjhATWluaW11bVRocmVzaG9sZAEBBTxBbHJlYWR5QXBwcm92ZWQBAQVETm9BcHByb3ZhbHNOZWVkZWQBAQVEVG9vRmV3U2lnbmF0b3JpZXMBAQVIVG9vTWFueVNpZ25hdG9yaWVzAQEFVFNpZ25hdG9yaWVzT3V0T2ZPcmRlcgEBBUxTZW5kZXJJblNpZ25hdG9yaWVzAQEFIE5vdEZvdW5kAQEFIE5vdE93bmVyAQEFLE5vVGltZXBvaW50AQEFOFdyb25nVGltZXBvaW50AQEFTFVuZXhwZWN0ZWRUaW1lcG9pbnQBAQU8TWF4V2VpZ2h0VG9vTG93AQEFNEFscmVhZHlTdG9yZWQBAQUgUHJlaW1hZ2UBAiQYVG9vQmlnAQEFMEFscmVhZHlOb3RlZAEBBTROb3RBdXRob3JpemVkAQEFIE5vdE5vdGVkAQEFJFJlcXVlc3RlZAEBBTBOb3RSZXF1ZXN0ZWQBAQUcVG9vTWFueQEBBRhUb29GZXcBAQUYTm9Db3N0AQEFIEJvdW50aWVzAQIscEluc3VmZmljaWVudFByb3Bvc2Vyc0JhbGFuY2UBAQUwSW52YWxpZEluZGV4AQEFMFJlYXNvblRvb0JpZwEBBUBVbmV4cGVjdGVkU3RhdHVzAQEFOFJlcXVpcmVDdXJhdG9yAQEFMEludmFsaWRWYWx1ZQEBBShJbnZhbGlkRmVlAQEFNFBlbmRpbmdQYXlvdXQBAQUkUHJlbWF0dXJlAQEFUEhhc0FjdGl2ZUNoaWxkQm91bnR5AQEFNFRvb01hbnlRdWV1ZWQBAQU0Q2hpbGRCb3VudGllcwECDFRQYXJlbnRCb3VudHlOb3RBY3RpdmUBAQVkSW5zdWZmaWNpZW50Qm91bnR5QmFsYW5jZQEBBVBUb29NYW55Q2hpbGRCb3VudGllcwEBBWhFbGVjdGlvblByb3ZpZGVyTXVsdGlQaGFzZQECPGhQcmVEaXNwYXRjaEVhcmx5U3VibWlzc2lvbgEBBWxQcmVEaXNwYXRjaFdyb25nV2lubmVyQ291bnQBAQVkUHJlRGlzcGF0Y2hXZWFrU3VibWlzc2lvbgEBBTxTaWduZWRRdWV1ZUZ1bGwBAQVYU2lnbmVkQ2Fubm90UGF5RGVwb3NpdAEBBVBTaWduZWRJbnZhbGlkV2l0bmVzcwEBBUxTaWduZWRUb29NdWNoV2VpZ2h0AQEFPE9jd0NhbGxXcm9uZ0VyYQEBBVxNaXNzaW5nU25hcHNob3RNZXRhZGF0YQEBBVhJbnZhbGlkU3VibWlzc2lvbkluZGV4AQEFOENhbGxOb3RBbGxvd2VkAQEFOEZhbGxiYWNrRmFpbGVkAQEFLEJvdW5kTm90TWV0AQEFOFRvb01hbnlXaW5uZXJzAQEFZFByZURpc3BhdGNoRGlmZmVyZW50Um91bmQBAQUMTmlzAQI8QER1cmF0aW9uVG9vU21hbGwBAQU4RHVyYXRpb25Ub29CaWcBAQU4QW1vdW50VG9vU21hbGwBAQUkQmlkVG9vTG93AQEFOFVua25vd25SZWNlaXB0AQEFIE5vdE93bmVyAQEFKE5vdEV4cGlyZWQBAQUoVW5rbm93bkJpZAEBBTRQb3J0aW9uVG9vQmlnAQEFIFVuZnVuZGVkAQEFNEFscmVhZHlGdW5kZWQBAQUkVGhyb3R0bGVkAQEFJE1ha2VzRHVzdAEBBTxBbHJlYWR5Q29tbXVuYWwBAQU4QWxyZWFkeVByaXZhdGUBAQVYTmlzQ291bnRlcnBhcnRCYWxhbmNlcwECMDhWZXN0aW5nQmFsYW5jZQEBBVRMaXF1aWRpdHlSZXN0cmljdGlvbnMBAQVMSW5zdWZmaWNpZW50QmFsYW5jZQEBBUhFeGlzdGVudGlhbERlcG9zaXQBAQU0RXhwZW5kYWJpbGl0eQEBBVxFeGlzdGluZ1Zlc3RpbmdTY2hlZHVsZQEBBSxEZWFkQWNjb3VudAEBBTxUb29NYW55UmVzZXJ2ZXMBAQUwVG9vTWFueUhvbGRzAQEFOFRvb01hbnlGcmVlemVzAQEFTElzc3VhbmNlRGVhY3RpdmF0ZWQBAQUkRGVsdGFaZXJvAQEFJFZvdGVyTGlzdAECBBBMaXN0AQIQJER1cGxpY2F0ZQEBBShOb3RIZWF2aWVyAQEFME5vdEluU2FtZUJhZwEBBTBOb2RlTm90Rm91bmQBAQU8Tm9taW5hdGlvblBvb2xzAQKQMFBvb2xOb3RGb3VuZAEBBUhQb29sTWVtYmVyTm90Rm91bmQBAQVIUmV3YXJkUG9vbE5vdEZvdW5kAQEFQFN1YlBvb2xzTm90Rm91bmQBAQVkQWNjb3VudEJlbG9uZ3NUb090aGVyUG9vbAEBBThGdWxseVVuYm9uZGluZwEBBURNYXhVbmJvbmRpbmdMaW1pdAEBBURDYW5ub3RXaXRoZHJhd0FueQEBBURNaW5pbXVtQm9uZE5vdE1ldAEBBTBPdmVyZmxvd1Jpc2sBAQU0Tm90RGVzdHJveWluZwEBBTBOb3ROb21pbmF0b3IBAQVUTm90S2lja2VyT3JEZXN0cm95aW5nAQEFHE5vdE9wZW4BAQUgTWF4UG9vbHMBAQU4TWF4UG9vbE1lbWJlcnMBAQVEQ2FuTm90Q2hhbmdlU3RhdGUBAQVURG9lc05vdEhhdmVQZXJtaXNzaW9uAQEFVE1ldGFkYXRhRXhjZWVkc01heExlbgEBBSREZWZlbnNpdmUBAhxoTm90RW5vdWdoU3BhY2VJblVuYm9uZFBvb2wBAQUwUG9vbE5vdEZvdW5kAQEFSFJld2FyZFBvb2xOb3RGb3VuZAEBBUBTdWJQb29sc05vdEZvdW5kAQEFcEJvbmRlZFN0YXNoS2lsbGVkUHJlbWF0dXJlbHkBAQVURGVsZWdhdGlvblVuc3VwcG9ydGVkAQEFPFNsYXNoTm90QXBwbGllZAEBBZxQYXJ0aWFsVW5ib25kTm90QWxsb3dlZFBlcm1pc3Npb25sZXNzbHkBAQVcTWF4Q29tbWlzc2lvblJlc3RyaWN0ZWQBAQVgQ29tbWlzc2lvbkV4Y2VlZHNNYXhpbXVtAQEFeENvbW1pc3Npb25FeGNlZWRzR2xvYmFsTWF4aW11bQEBBWRDb21taXNzaW9uQ2hhbmdlVGhyb3R0bGVkAQEFeENvbW1pc3Npb25DaGFuZ2VSYXRlTm90QWxsb3dlZAEBBUxOb1BlbmRpbmdDb21taXNzaW9uAQEFWE5vQ29tbWlzc2lvbkN1cnJlbnRTZXQBAQUsUG9vbElkSW5Vc2UBAQU0SW52YWxpZFBvb2xJZAEBBUxCb25kRXh0cmFSZXN0cmljdGVkAQEFPE5vdGhpbmdUb0FkanVzdAEBBThOb3RoaW5nVG9TbGFzaAEBBTxBbHJlYWR5TWlncmF0ZWQBAQUsTm90TWlncmF0ZWQBAQUwTm90U3VwcG9ydGVkAQEFLEZhc3RVbnN0YWtlAQIYNE5vdENvbnRyb2xsZXIBAQU0QWxyZWFkeVF1ZXVlZAEBBThOb3RGdWxseUJvbmRlZAEBBSROb3RRdWV1ZWQBAQUsQWxyZWFkeUhlYWQBAQU4Q2FsbE5vdEFsbG93ZWQBAQVAUGFyYWNoYWluc09yaWdpbgEBBTRDb25maWd1cmF0aW9uAQIEPEludmFsaWROZXdWYWx1ZQEBBSxQYXJhc1NoYXJlZAEBBTRQYXJhSW5jbHVzaW9uAQJIZFZhbGlkYXRvckluZGV4T3V0T2ZCb3VuZHMBAQVQVW5zY2hlZHVsZWRDYW5kaWRhdGUBAQVASGVhZERhdGFUb29MYXJnZQEBBVBQcmVtYXR1cmVDb2RlVXBncmFkZQEBBTxOZXdDb2RlVG9vTGFyZ2UBAQVURGlzYWxsb3dlZFJlbGF5UGFyZW50AQEFREludmFsaWRBc3NpZ25tZW50AQEFREludmFsaWRHcm91cEluZGV4AQEFTEluc3VmZmljaWVudEJhY2tpbmcBAQU4SW52YWxpZEJhY2tpbmcBAQVETm90Q29sbGF0b3JTaWduZWQBAQVoVmFsaWRhdGlvbkRhdGFIYXNoTWlzbWF0Y2gBAQWASW5jb3JyZWN0RG93bndhcmRNZXNzYWdlSGFuZGxpbmcBAQVUSW52YWxpZFVwd2FyZE1lc3NhZ2VzAQEFYEhybXBXYXRlcm1hcmtNaXNoYW5kbGluZwEBBUxJbnZhbGlkT3V0Ym91bmRIcm1wAQEFZEludmFsaWRWYWxpZGF0aW9uQ29kZUhhc2gBAQVAUGFyYUhlYWRNaXNtYXRjaAEBBTBQYXJhSW5oZXJlbnQBAhRkVG9vTWFueUluY2x1c2lvbkluaGVyZW50cwEBBUxJbnZhbGlkUGFyZW50SGVhZGVyAQEFSEluaGVyZW50T3ZlcndlaWdodAEBBYRDYW5kaWRhdGVzRmlsdGVyZWREdXJpbmdFeGVjdXRpb24BAQVQVW5zY2hlZHVsZWRDYW5kaWRhdGUBAQU0UGFyYVNjaGVkdWxlcgEBBRRQYXJhcwECNDROb3RSZWdpc3RlcmVkAQEFNENhbm5vdE9uYm9hcmQBAQU4Q2Fubm90T2ZmYm9hcmQBAQU0Q2Fubm90VXBncmFkZQEBBTxDYW5ub3REb3duZ3JhZGUBAQVYUHZmQ2hlY2tTdGF0ZW1lbnRTdGFsZQEBBVxQdmZDaGVja1N0YXRlbWVudEZ1dHVyZQEBBYRQdmZDaGVja1ZhbGlkYXRvckluZGV4T3V0T2ZCb3VuZHMBAQVgUHZmQ2hlY2tJbnZhbGlkU2lnbmF0dXJlAQEFSFB2ZkNoZWNrRG91YmxlVm90ZQEBBVhQdmZDaGVja1N1YmplY3RJbnZhbGlkAQEFRENhbm5vdFVwZ3JhZGVDb2RlAQEFLEludmFsaWRDb2RlAQEFLEluaXRpYWxpemVyAQEFDERtcAEBBRBIcm1wAQJQVE9wZW5Icm1wQ2hhbm5lbFRvU2VsZgEBBXxPcGVuSHJtcENoYW5uZWxJbnZhbGlkUmVjaXBpZW50AQEFbE9wZW5Icm1wQ2hhbm5lbFplcm9DYXBhY2l0eQEBBYxPcGVuSHJtcENoYW5uZWxDYXBhY2l0eUV4Y2VlZHNMaW1pdAEBBXhPcGVuSHJtcENoYW5uZWxaZXJvTWVzc2FnZVNpemUBAQWYT3BlbkhybXBDaGFubmVsTWVzc2FnZVNpemVFeGNlZWRzTGltaXQBAQVwT3BlbkhybXBDaGFubmVsQWxyZWFkeUV4aXN0cwEBBXxPcGVuSHJtcENoYW5uZWxBbHJlYWR5UmVxdWVzdGVkAQEFcE9wZW5Icm1wQ2hhbm5lbExpbWl0RXhjZWVkZWQBAQVwQWNjZXB0SHJtcENoYW5uZWxEb2VzbnRFeGlzdAEBBYRBY2NlcHRIcm1wQ2hhbm5lbEFscmVhZHlDb25maXJtZWQBAQV4QWNjZXB0SHJtcENoYW5uZWxMaW1pdEV4Y2VlZGVkAQEFcENsb3NlSHJtcENoYW5uZWxVbmF1dGhvcml6ZWQBAQVsQ2xvc2VIcm1wQ2hhbm5lbERvZXNudEV4aXN0AQEFfENsb3NlSHJtcENoYW5uZWxBbHJlYWR5VW5kZXJ3YXkBAQWEQ2FuY2VsSHJtcE9wZW5DaGFubmVsVW5hdXRob3JpemVkAQEFaE9wZW5Icm1wQ2hhbm5lbERvZXNudEV4aXN0AQEFfE9wZW5Icm1wQ2hhbm5lbEFscmVhZHlDb25maXJtZWQBAQUwV3JvbmdXaXRuZXNzAQEFcENoYW5uZWxDcmVhdGlvbk5vdEF1dGhvcml6ZWQBAQU8UGFyYVNlc3Npb25JbmZvAQEFNFBhcmFzRGlzcHV0ZXMBAiR0RHVwbGljYXRlRGlzcHV0ZVN0YXRlbWVudFNldHMBAQVcQW5jaWVudERpc3B1dGVTdGF0ZW1lbnQBAQVkVmFsaWRhdG9ySW5kZXhPdXRPZkJvdW5kcwEBBUBJbnZhbGlkU2lnbmF0dXJlAQEFSER1cGxpY2F0ZVN0YXRlbWVudAEBBUhTaW5nbGVTaWRlZERpc3B1dGUBAQU8TWFsaWNpb3VzQmFja2VyAQEFTE1pc3NpbmdCYWNraW5nVm90ZXMBAQVIVW5jb25maXJtZWREaXNwdXRlAQEFNFBhcmFzU2xhc2hpbmcBAhhgSW52YWxpZEtleU93bmVyc2hpcFByb29mAQEFTEludmFsaWRTZXNzaW9uSW5kZXgBAQVQSW52YWxpZENhbmRpZGF0ZUhhc2gBAQVUSW52YWxpZFZhbGlkYXRvckluZGV4AQEFYFZhbGlkYXRvckluZGV4SWRNaXNtYXRjaAEBBVxEdXBsaWNhdGVTbGFzaGluZ1JlcG9ydAEBBWhPbkRlbWFuZEFzc2lnbm1lbnRQcm92aWRlcgECCCRRdWV1ZUZ1bGwBAQVwU3BvdFByaWNlSGlnaGVyVGhhbk1heEFtb3VudAEBBWhDb3JldGltZUFzc2lnbm1lbnRQcm92aWRlcgECGEBBc3NpZ25tZW50c0VtcHR5AQEFNE92ZXJTY2hlZHVsZWQBAQU4VW5kZXJTY2hlZHVsZWQBAQVARGlzYWxsb3dlZEluc2VydAEBBTxEdXBsaWNhdGVJbnNlcnQBAQVQQXNzaWdubWVudHNOb3RTb3J0ZWQBAQUkUmVnaXN0cmFyAQI4NE5vdFJlZ2lzdGVyZWQBAQVEQWxyZWFkeVJlZ2lzdGVyZWQBAQUgTm90T3duZXIBAQUwQ29kZVRvb0xhcmdlAQEFQEhlYWREYXRhVG9vTGFyZ2UBAQUwTm90UGFyYWNoYWluAQEFNE5vdFBhcmF0aHJlYWQBAQVAQ2Fubm90RGVyZWdpc3RlcgEBBTxDYW5ub3REb3duZ3JhZGUBAQU0Q2Fubm90VXBncmFkZQEBBShQYXJhTG9ja2VkAQEFLE5vdFJlc2VydmVkAQEFLEludmFsaWRDb2RlAQEFKENhbm5vdFN3YXABAQUUU2xvdHMBAghEUGFyYU5vdE9uYm9hcmRpbmcBAQUoTGVhc2VFcnJvcgEBBSBBdWN0aW9ucwECHERBdWN0aW9uSW5Qcm9ncmVzcwEBBURMZWFzZVBlcmlvZEluUGFzdAEBBURQYXJhTm90UmVnaXN0ZXJlZAEBBUROb3RDdXJyZW50QXVjdGlvbgEBBShOb3RBdWN0aW9uAQEFMEF1Y3Rpb25FbmRlZAEBBUBBbHJlYWR5TGVhc2VkT3V0AQEFJENyb3dkbG9hbgECXERGaXJzdFBlcmlvZEluUGFzdAEBBWRGaXJzdFBlcmlvZFRvb0ZhckluRnV0dXJlAQEFbExhc3RQZXJpb2RCZWZvcmVGaXJzdFBlcmlvZAEBBWBMYXN0UGVyaW9kVG9vRmFySW5GdXR1cmUBAQU8Q2Fubm90RW5kSW5QYXN0AQEFREVuZFRvb0ZhckluRnV0dXJlAQEFIE92ZXJmbG93AQEFUENvbnRyaWJ1dGlvblRvb1NtYWxsAQEFNEludmFsaWRQYXJhSWQBAQUsQ2FwRXhjZWVkZWQBAQVYQ29udHJpYnV0aW9uUGVyaW9kT3ZlcgEBBTRJbnZhbGlkT3JpZ2luAQEFME5vdFBhcmFjaGFpbgEBBSxMZWFzZUFjdGl2ZQEBBUBCaWRPckxlYXNlQWN0aXZlAQEFMEZ1bmROb3RFbmRlZAEBBTxOb0NvbnRyaWJ1dGlvbnMBAQVITm90UmVhZHlUb0Rpc3NvbHZlAQEFQEludmFsaWRTaWduYXR1cmUBAQUwTWVtb1Rvb0xhcmdlAQEFREFscmVhZHlJbk5ld1JhaXNlAQEFSFZyZkRlbGF5SW5Qcm9ncmVzcwEBBTROb0xlYXNlUGVyaW9kAQEFIENvcmV0aW1lAQIMJE5vdEJyb2tlcgEBBVhSZXF1ZXN0ZWRGdXR1cmVSZXZlbnVlAQEFTEFzc2V0VHJhbnNmZXJGYWlsZWQBAQUkWGNtUGFsbGV0AQJgLFVucmVhY2hhYmxlAQEFLFNlbmRGYWlsdXJlAQEFIEZpbHRlcmVkAQEFSFVud2VpZ2hhYmxlTWVzc2FnZQEBBWBEZXN0aW5hdGlvbk5vdEludmVydGlibGUBAQUURW1wdHkBAQU4Q2Fubm90UmVhbmNob3IBAQU0VG9vTWFueUFzc2V0cwEBBTRJbnZhbGlkT3JpZ2luAQEFKEJhZFZlcnNpb24BAQUsQmFkTG9jYXRpb24BAQU4Tm9TdWJzY3JpcHRpb24BAQVEQWxyZWFkeVN1YnNjcmliZWQBAQVYQ2Fubm90Q2hlY2tPdXRUZWxlcG9ydAEBBShMb3dCYWxhbmNlAQEFMFRvb01hbnlMb2NrcwEBBUxBY2NvdW50Tm90U292ZXJlaWduAQEFKEZlZXNOb3RNZXQBAQUwTG9ja05vdEZvdW5kAQEFFEluVXNlAQEFaEludmFsaWRBc3NldFVua25vd25SZXNlcnZlAQEFeEludmFsaWRBc3NldFVuc3VwcG9ydGVkUmVzZXJ2ZQEBBTxUb29NYW55UmVzZXJ2ZXMBAQVgTG9jYWxFeGVjdXRpb25JbmNvbXBsZXRlAQEFME1lc3NhZ2VRdWV1ZQECJCxOb3RSZWFwYWJsZQEBBRhOb1BhZ2UBAQUkTm9NZXNzYWdlAQEFQEFscmVhZHlQcm9jZXNzZWQBAQUYUXVldWVkAQEFSEluc3VmZmljaWVudFdlaWdodAEBBWBUZW1wb3JhcmlseVVucHJvY2Vzc2FibGUBAQUsUXVldWVQYXVzZWQBAQVMUmVjdXJzaXZlRGlzYWxsb3dlZAEBBSRBc3NldFJhdGUBAgxAVW5rbm93bkFzc2V0S2luZAEBBTRBbHJlYWR5RXhpc3RzAQEFIE92ZXJmbG93AQEFFEJlZWZ5AQIQYEludmFsaWRLZXlPd25lcnNoaXBQcm9vZgEBBWBJbnZhbGlkRXF1aXZvY2F0aW9uUHJvb2YBAQVYRHVwbGljYXRlT2ZmZW5jZVJlcG9ydAEBBVBJbnZhbGlkQ29uZmlndXJhdGlvbgEBBQxNbXIBAQUwQmVlZnlNbXJMZWFmAQEFAjgUT3RoZXIBAQUwQ2Fubm90TG9va3VwAQEFJEJhZE9yaWdpbgEBBRhNb2R1bGUBAgEBGFN5c3RlbQECJDxJbnZhbGlkU3BlY05hbWUBAQVoU3BlY1ZlcnNpb25OZWVkc1RvSW5jcmVhc2UBAQV0RmFpbGVkVG9FeHRyYWN0UnVudGltZVZlcnNpb24BAQVMTm9uRGVmYXVsdENvbXBvc2l0ZQEBBTxOb25aZXJvUmVmQ291bnQBAQUwQ2FsbEZpbHRlcmVkAQEFbE11bHRpQmxvY2tNaWdyYXRpb25zT25nb2luZwEBBUROb3RoaW5nQXV0aG9yaXplZAEBBTBVbmF1dGhvcml6ZWQBAQUQQmFiZQECEGBJbnZhbGlkRXF1aXZvY2F0aW9uUHJvb2YBAQVgSW52YWxpZEtleU93bmVyc2hpcFByb29mAQEFWER1cGxpY2F0ZU9mZmVuY2VSZXBvcnQBAQVQSW52YWxpZENvbmZpZ3VyYXRpb24BAQUkVGltZXN0YW1wAQEFHEluZGljZXMBAhQsTm90QXNzaWduZWQBAQUgTm90T3duZXIBAQUUSW5Vc2UBAQUsTm90VHJhbnNmZXIBAQUkUGVybWFuZW50AQEFIEJhbGFuY2VzAQIwOFZlc3RpbmdCYWxhbmNlAQEFVExpcXVpZGl0eVJlc3RyaWN0aW9ucwEBBUxJbnN1ZmZpY2llbnRCYWxhbmNlAQEFSEV4aXN0ZW50aWFsRGVwb3NpdAEBBTRFeHBlbmRhYmlsaXR5AQEFXEV4aXN0aW5nVmVzdGluZ1NjaGVkdWxlAQEFLERlYWRBY2NvdW50AQEFPFRvb01hbnlSZXNlcnZlcwEBBTBUb29NYW55SG9sZHMBAQU4VG9vTWFueUZyZWV6ZXMBAQVMSXNzdWFuY2VEZWFjdGl2YXRlZAEBBSREZWx0YVplcm8BAQVIVHJhbnNhY3Rpb25QYXltZW50AQEFKEF1dGhvcnNoaXABAQUcU3Rha2luZwECfDROb3RDb250cm9sbGVyAQEFIE5vdFN0YXNoAQEFNEFscmVhZHlCb25kZWQBAQU0QWxyZWFkeVBhaXJlZAEBBTBFbXB0eVRhcmdldHMBAQU4RHVwbGljYXRlSW5kZXgBAQVESW52YWxpZFNsYXNoSW5kZXgBAQVASW5zdWZmaWNpZW50Qm9uZAEBBTBOb01vcmVDaHVua3MBAQU0Tm9VbmxvY2tDaHVuawEBBTBGdW5kZWRUYXJnZXQBAQVISW52YWxpZEVyYVRvUmV3YXJkAQEFaEludmFsaWROdW1iZXJPZk5vbWluYXRpb25zAQEFSE5vdFNvcnRlZEFuZFVuaXF1ZQEBBThBbHJlYWR5Q2xhaW1lZAEBBSxJbnZhbGlkUGFnZQEBBVRJbmNvcnJlY3RIaXN0b3J5RGVwdGgBAQVYSW5jb3JyZWN0U2xhc2hpbmdTcGFucwEBBSBCYWRTdGF0ZQEBBThUb29NYW55VGFyZ2V0cwEBBSRCYWRUYXJnZXQBAQVAQ2Fubm90Q2hpbGxPdGhlcgEBBURUb29NYW55Tm9taW5hdG9ycwEBBURUb29NYW55VmFsaWRhdG9ycwEBBUBDb21taXNzaW9uVG9vTG93AQEFLEJvdW5kTm90TWV0AQEFUENvbnRyb2xsZXJEZXByZWNhdGVkAQEFTENhbm5vdFJlc3RvcmVMZWRnZXIBAQVsUmV3YXJkRGVzdGluYXRpb25SZXN0cmljdGVkAQEFOE5vdEVub3VnaEZ1bmRzAQEFXFZpcnR1YWxTdGFrZXJOb3RBbGxvd2VkAQEFIE9mZmVuY2VzAQEFKEhpc3RvcmljYWwBAQUcU2Vzc2lvbgECFDBJbnZhbGlkUHJvb2YBAQVcTm9Bc3NvY2lhdGVkVmFsaWRhdG9ySWQBAQU0RHVwbGljYXRlZEtleQEBBRhOb0tleXMBAQUkTm9BY2NvdW50AQEFHEdyYW5kcGEBAhwsUGF1c2VGYWlsZWQBAQUwUmVzdW1lRmFpbGVkAQEFNENoYW5nZVBlbmRpbmcBAQUcVG9vU29vbgEBBWBJbnZhbGlkS2V5T3duZXJzaGlwUHJvb2YBAQVgSW52YWxpZEVxdWl2b2NhdGlvblByb29mAQEFWER1cGxpY2F0ZU9mZmVuY2VSZXBvcnQBAQVIQXV0aG9yaXR5RGlzY292ZXJ5AQEFIFRyZWFzdXJ5AQIsMEludmFsaWRJbmRleAEBBUBUb29NYW55QXBwcm92YWxzAQEFWEluc3VmZmljaWVudFBlcm1pc3Npb24BAQVMUHJvcG9zYWxOb3RBcHByb3ZlZAEBBVhGYWlsZWRUb0NvbnZlcnRCYWxhbmNlAQEFMFNwZW5kRXhwaXJlZAEBBSxFYXJseVBheW91dAEBBUBBbHJlYWR5QXR0ZW1wdGVkAQEFLFBheW91dEVycm9yAQEFME5vdEF0dGVtcHRlZAEBBTBJbmNvbmNsdXNpdmUBAQVAQ29udmljdGlvblZvdGluZwECMChOb3RPbmdvaW5nAQEFIE5vdFZvdGVyAQEFME5vUGVybWlzc2lvbgEBBTxOb1Blcm1pc3Npb25ZZXQBAQVEQWxyZWFkeURlbGVnYXRpbmcBAQU0QWxyZWFkeVZvdGluZwEBBURJbnN1ZmZpY2llbnRGdW5kcwEBBTROb3REZWxlZ2F0aW5nAQEFIE5vbnNlbnNlAQEFPE1heFZvdGVzUmVhY2hlZAEBBSxDbGFzc05lZWRlZAEBBSBCYWRDbGFzcwEBBSRSZWZlcmVuZGEBAjgoTm90T25nb2luZwEBBShIYXNEZXBvc2l0AQEFIEJhZFRyYWNrAQEFEEZ1bGwBAQUoUXVldWVFbXB0eQEBBTRCYWRSZWZlcmVuZHVtAQEFLE5vdGhpbmdUb0RvAQEFHE5vVHJhY2sBAQUoVW5maW5pc2hlZAEBBTBOb1Blcm1pc3Npb24BAQUkTm9EZXBvc2l0AQEFJEJhZFN0YXR1cwEBBUBQcmVpbWFnZU5vdEV4aXN0AQEFhFByZWltYWdlU3RvcmVkV2l0aERpZmZlcmVudExlbmd0aAEBBVBGZWxsb3dzaGlwQ29sbGVjdGl2ZQECLDRBbHJlYWR5TWVtYmVyAQEFJE5vdE1lbWJlcgEBBShOb3RQb2xsaW5nAQEFHE9uZ29pbmcBAQU0Tm9uZVJlbWFpbmluZwEBBShDb3JydXB0aW9uAQEFKFJhbmtUb29Mb3cBAQU4SW52YWxpZFdpdG5lc3MBAQUwTm9QZXJtaXNzaW9uAQEFKFNhbWVNZW1iZXIBAQU4VG9vTWFueU1lbWJlcnMBAQVMRmVsbG93c2hpcFJlZmVyZW5kYQECOChOb3RPbmdvaW5nAQEFKEhhc0RlcG9zaXQBAQUgQmFkVHJhY2sBAQUQRnVsbAEBBShRdWV1ZUVtcHR5AQEFNEJhZFJlZmVyZW5kdW0BAQUsTm90aGluZ1RvRG8BAQUcTm9UcmFjawEBBShVbmZpbmlzaGVkAQEFME5vUGVybWlzc2lvbgEBBSROb0RlcG9zaXQBAQUkQmFkU3RhdHVzAQEFQFByZWltYWdlTm90RXhpc3QBAQWEUHJlaW1hZ2VTdG9yZWRXaXRoRGlmZmVyZW50TGVuZ3RoAQEFHE9yaWdpbnMBAQUkV2hpdGVsaXN0AQIUTFVuYXZhaWxhYmxlUHJlSW1hZ2UBAQU8VW5kZWNvZGFibGVDYWxsAQEFYEludmFsaWRDYWxsV2VpZ2h0V2l0bmVzcwEBBVBDYWxsSXNOb3RXaGl0ZWxpc3RlZAEBBVhDYWxsQWxyZWFkeVdoaXRlbGlzdGVkAQEFKFBhcmFtZXRlcnMBAQUYQ2xhaW1zAQIYYEludmFsaWRFdGhlcmV1bVNpZ25hdHVyZQEBBUBTaWduZXJIYXNOb0NsYWltAQEFQFNlbmRlckhhc05vQ2xhaW0BAQUwUG90VW5kZXJmbG93AQEFQEludmFsaWRTdGF0ZW1lbnQBAQVMVmVzdGVkQmFsYW5jZUV4aXN0cwEBBRxVdGlsaXR5AQIEMFRvb01hbnlDYWxscwEBBRxTb2NpZXR5AQKAJE5vdE1lbWJlcgEBBTRBbHJlYWR5TWVtYmVyAQEFJFN1c3BlbmRlZAEBBTBOb3RTdXNwZW5kZWQBAQUgTm9QYXlvdXQBAQU4QWxyZWFkeUZvdW5kZWQBAQU8SW5zdWZmaWNpZW50UG90AQEFPEFscmVhZHlWb3VjaGluZwEBBUxOb3RWb3VjaGluZ09uQmlkZGVyAQEFEEhlYWQBAQUcRm91bmRlcgEBBShBbHJlYWR5QmlkAQEFQEFscmVhZHlDYW5kaWRhdGUBAQUwTm90Q2FuZGlkYXRlAQEFKE1heE1lbWJlcnMBAQUoTm90Rm91bmRlcgEBBRxOb3RIZWFkAQEFLE5vdEFwcHJvdmVkAQEFLE5vdFJlamVjdGVkAQEFIEFwcHJvdmVkAQEFIFJlamVjdGVkAQEFKEluUHJvZ3Jlc3MBAQUgVG9vRWFybHkBAQUUVm90ZWQBAQUcRXhwaXJlZAEBBSROb3RCaWRkZXIBAQUoTm9EZWZlbmRlcgEBBSBOb3RHcm91cAEBBTxBbHJlYWR5RWxldmF0ZWQBAQU8QWxyZWFkeVB1bmlzaGVkAQEFREluc3VmZmljaWVudEZ1bmRzAQEFHE5vVm90ZXMBAQUgUmVjb3ZlcnkBAkAoTm90QWxsb3dlZAEBBTRaZXJvVGhyZXNob2xkAQEFQE5vdEVub3VnaEZyaWVuZHMBAQUoTWF4RnJpZW5kcwEBBSROb3RTb3J0ZWQBAQU4Tm90UmVjb3ZlcmFibGUBAQVIQWxyZWFkeVJlY292ZXJhYmxlAQEFOEFscmVhZHlTdGFydGVkAQEFKE5vdFN0YXJ0ZWQBAQUkTm90RnJpZW5kAQEFLERlbGF5UGVyaW9kAQEFOEFscmVhZHlWb3VjaGVkAQEFJFRocmVzaG9sZAEBBSxTdGlsbEFjdGl2ZQEBBTBBbHJlYWR5UHJveHkBAQUgQmFkU3RhdGUBAQUcVmVzdGluZwECFChOb3RWZXN0aW5nAQEFVEF0TWF4VmVzdGluZ1NjaGVkdWxlcwEBBSRBbW91bnRMb3cBAQVgU2NoZWR1bGVJbmRleE91dE9mQm91bmRzAQEFVEludmFsaWRTY2hlZHVsZVBhcmFtcwEBBSRTY2hlZHVsZXIBAhRARmFpbGVkVG9TY2hlZHVsZQEBBSBOb3RGb3VuZAEBBVxUYXJnZXRCbG9ja051bWJlckluUGFzdAEBBUhSZXNjaGVkdWxlTm9DaGFuZ2UBAQUUTmFtZWQBAQUUUHJveHkBAiAcVG9vTWFueQEBBSBOb3RGb3VuZAEBBSBOb3RQcm94eQEBBSxVbnByb3h5YWJsZQEBBSREdXBsaWNhdGUBAQUwTm9QZXJtaXNzaW9uAQEFLFVuYW5ub3VuY2VkAQEFLE5vU2VsZlByb3h5AQEFIE11bHRpc2lnAQI4QE1pbmltdW1UaHJlc2hvbGQBAQU8QWxyZWFkeUFwcHJvdmVkAQEFRE5vQXBwcm92YWxzTmVlZGVkAQEFRFRvb0Zld1NpZ25hdG9yaWVzAQEFSFRvb01hbnlTaWduYXRvcmllcwEBBVRTaWduYXRvcmllc091dE9mT3JkZXIBAQVMU2VuZGVySW5TaWduYXRvcmllcwEBBSBOb3RGb3VuZAEBBSBOb3RPd25lcgEBBSxOb1RpbWVwb2ludAEBBThXcm9uZ1RpbWVwb2ludAEBBUxVbmV4cGVjdGVkVGltZXBvaW50AQEFPE1heFdlaWdodFRvb0xvdwEBBTRBbHJlYWR5U3RvcmVkAQEFIFByZWltYWdlAQIkGFRvb0JpZwEBBTBBbHJlYWR5Tm90ZWQBAQU0Tm90QXV0aG9yaXplZAEBBSBOb3ROb3RlZAEBBSRSZXF1ZXN0ZWQBAQUwTm90UmVxdWVzdGVkAQEFHFRvb01hbnkBAQUYVG9vRmV3AQEFGE5vQ29zdAEBBSBCb3VudGllcwECLHBJbnN1ZmZpY2llbnRQcm9wb3NlcnNCYWxhbmNlAQEFMEludmFsaWRJbmRleAEBBTBSZWFzb25Ub29CaWcBAQVAVW5leHBlY3RlZFN0YXR1cwEBBThSZXF1aXJlQ3VyYXRvcgEBBTBJbnZhbGlkVmFsdWUBAQUoSW52YWxpZEZlZQEBBTRQZW5kaW5nUGF5b3V0AQEFJFByZW1hdHVyZQEBBVBIYXNBY3RpdmVDaGlsZEJvdW50eQEBBTRUb29NYW55UXVldWVkAQEFNENoaWxkQm91bnRpZXMBAgxUUGFyZW50Qm91bnR5Tm90QWN0aXZlAQEFZEluc3VmZmljaWVudEJvdW50eUJhbGFuY2UBAQVQVG9vTWFueUNoaWxkQm91bnRpZXMBAQVoRWxlY3Rpb25Qcm92aWRlck11bHRpUGhhc2UBAjxoUHJlRGlzcGF0Y2hFYXJseVN1Ym1pc3Npb24BAQVsUHJlRGlzcGF0Y2hXcm9uZ1dpbm5lckNvdW50AQEFZFByZURpc3BhdGNoV2Vha1N1Ym1pc3Npb24BAQU8U2lnbmVkUXVldWVGdWxsAQEFWFNpZ25lZENhbm5vdFBheURlcG9zaXQBAQVQU2lnbmVkSW52YWxpZFdpdG5lc3MBAQVMU2lnbmVkVG9vTXVjaFdlaWdodAEBBTxPY3dDYWxsV3JvbmdFcmEBAQVcTWlzc2luZ1NuYXBzaG90TWV0YWRhdGEBAQVYSW52YWxpZFN1Ym1pc3Npb25JbmRleAEBBThDYWxsTm90QWxsb3dlZAEBBThGYWxsYmFja0ZhaWxlZAEBBSxCb3VuZE5vdE1ldAEBBThUb29NYW55V2lubmVycwEBBWRQcmVEaXNwYXRjaERpZmZlcmVudFJvdW5kAQEFDE5pcwECPEBEdXJhdGlvblRvb1NtYWxsAQEFOER1cmF0aW9uVG9vQmlnAQEFOEFtb3VudFRvb1NtYWxsAQEFJEJpZFRvb0xvdwEBBThVbmtub3duUmVjZWlwdAEBBSBOb3RPd25lcgEBBShOb3RFeHBpcmVkAQEFKFVua25vd25CaWQBAQU0UG9ydGlvblRvb0JpZwEBBSBVbmZ1bmRlZAEBBTRBbHJlYWR5RnVuZGVkAQEFJFRocm90dGxlZAEBBSRNYWtlc0R1c3QBAQU8QWxyZWFkeUNvbW11bmFsAQEFOEFscmVhZHlQcml2YXRlAQEFWE5pc0NvdW50ZXJwYXJ0QmFsYW5jZXMBAjA4VmVzdGluZ0JhbGFuY2UBAQVUTGlxdWlkaXR5UmVzdHJpY3Rpb25zAQEFTEluc3VmZmljaWVudEJhbGFuY2UBAQVIRXhpc3RlbnRpYWxEZXBvc2l0AQEFNEV4cGVuZGFiaWxpdHkBAQVcRXhpc3RpbmdWZXN0aW5nU2NoZWR1bGUBAQUsRGVhZEFjY291bnQBAQU8VG9vTWFueVJlc2VydmVzAQEFMFRvb01hbnlIb2xkcwEBBThUb29NYW55RnJlZXplcwEBBUxJc3N1YW5jZURlYWN0aXZhdGVkAQEFJERlbHRhWmVybwEBBSRWb3Rlckxpc3QBAgQQTGlzdAECECREdXBsaWNhdGUBAQUoTm90SGVhdmllcgEBBTBOb3RJblNhbWVCYWcBAQUwTm9kZU5vdEZvdW5kAQEFPE5vbWluYXRpb25Qb29scwECkDBQb29sTm90Rm91bmQBAQVIUG9vbE1lbWJlck5vdEZvdW5kAQEFSFJld2FyZFBvb2xOb3RGb3VuZAEBBUBTdWJQb29sc05vdEZvdW5kAQEFZEFjY291bnRCZWxvbmdzVG9PdGhlclBvb2wBAQU4RnVsbHlVbmJvbmRpbmcBAQVETWF4VW5ib25kaW5nTGltaXQBAQVEQ2Fubm90V2l0aGRyYXdBbnkBAQVETWluaW11bUJvbmROb3RNZXQBAQUwT3ZlcmZsb3dSaXNrAQEFNE5vdERlc3Ryb3lpbmcBAQUwTm90Tm9taW5hdG9yAQEFVE5vdEtpY2tlck9yRGVzdHJveWluZwEBBRxOb3RPcGVuAQEFIE1heFBvb2xzAQEFOE1heFBvb2xNZW1iZXJzAQEFRENhbk5vdENoYW5nZVN0YXRlAQEFVERvZXNOb3RIYXZlUGVybWlzc2lvbgEBBVRNZXRhZGF0YUV4Y2VlZHNNYXhMZW4BAQUkRGVmZW5zaXZlAQIcaE5vdEVub3VnaFNwYWNlSW5VbmJvbmRQb29sAQEFMFBvb2xOb3RGb3VuZAEBBUhSZXdhcmRQb29sTm90Rm91bmQBAQVAU3ViUG9vbHNOb3RGb3VuZAEBBXBCb25kZWRTdGFzaEtpbGxlZFByZW1hdHVyZWx5AQEFVERlbGVnYXRpb25VbnN1cHBvcnRlZAEBBTxTbGFzaE5vdEFwcGxpZWQBAQWcUGFydGlhbFVuYm9uZE5vdEFsbG93ZWRQZXJtaXNzaW9ubGVzc2x5AQEFXE1heENvbW1pc3Npb25SZXN0cmljdGVkAQEFYENvbW1pc3Npb25FeGNlZWRzTWF4aW11bQEBBXhDb21taXNzaW9uRXhjZWVkc0dsb2JhbE1heGltdW0BAQVkQ29tbWlzc2lvbkNoYW5nZVRocm90dGxlZAEBBXhDb21taXNzaW9uQ2hhbmdlUmF0ZU5vdEFsbG93ZWQBAQVMTm9QZW5kaW5nQ29tbWlzc2lvbgEBBVhOb0NvbW1pc3Npb25DdXJyZW50U2V0AQEFLFBvb2xJZEluVXNlAQEFNEludmFsaWRQb29sSWQBAQVMQm9uZEV4dHJhUmVzdHJpY3RlZAEBBTxOb3RoaW5nVG9BZGp1c3QBAQU4Tm90aGluZ1RvU2xhc2gBAQU8QWxyZWFkeU1pZ3JhdGVkAQEFLE5vdE1pZ3JhdGVkAQEFME5vdFN1cHBvcnRlZAEBBSxGYXN0VW5zdGFrZQECGDROb3RDb250cm9sbGVyAQEFNEFscmVhZHlRdWV1ZWQBAQU4Tm90RnVsbHlCb25kZWQBAQUkTm90UXVldWVkAQEFLEFscmVhZHlIZWFkAQEFOENhbGxOb3RBbGxvd2VkAQEFQFBhcmFjaGFpbnNPcmlnaW4BAQU0Q29uZmlndXJhdGlvbgECBDxJbnZhbGlkTmV3VmFsdWUBAQUsUGFyYXNTaGFyZWQBAQU0UGFyYUluY2x1c2lvbgECSGRWYWxpZGF0b3JJbmRleE91dE9mQm91bmRzAQEFUFVuc2NoZWR1bGVkQ2FuZGlkYXRlAQEFQEhlYWREYXRhVG9vTGFyZ2UBAQVQUHJlbWF0dXJlQ29kZVVwZ3JhZGUBAQU8TmV3Q29kZVRvb0xhcmdlAQEFVERpc2FsbG93ZWRSZWxheVBhcmVudAEBBURJbnZhbGlkQXNzaWdubWVudAEBBURJbnZhbGlkR3JvdXBJbmRleAEBBUxJbnN1ZmZpY2llbnRCYWNraW5nAQEFOEludmFsaWRCYWNraW5nAQEFRE5vdENvbGxhdG9yU2lnbmVkAQEFaFZhbGlkYXRpb25EYXRhSGFzaE1pc21hdGNoAQEFgEluY29ycmVjdERvd253YXJkTWVzc2FnZUhhbmRsaW5nAQEFVEludmFsaWRVcHdhcmRNZXNzYWdlcwEBBWBIcm1wV2F0ZXJtYXJrTWlzaGFuZGxpbmcBAQVMSW52YWxpZE91dGJvdW5kSHJtcAEBBWRJbnZhbGlkVmFsaWRhdGlvbkNvZGVIYXNoAQEFQFBhcmFIZWFkTWlzbWF0Y2gBAQUwUGFyYUluaGVyZW50AQIUZFRvb01hbnlJbmNsdXNpb25JbmhlcmVudHMBAQVMSW52YWxpZFBhcmVudEhlYWRlcgEBBUhJbmhlcmVudE92ZXJ3ZWlnaHQBAQWEQ2FuZGlkYXRlc0ZpbHRlcmVkRHVyaW5nRXhlY3V0aW9uAQEFUFVuc2NoZWR1bGVkQ2FuZGlkYXRlAQEFNFBhcmFTY2hlZHVsZXIBAQUUUGFyYXMBAjQ0Tm90UmVnaXN0ZXJlZAEBBTRDYW5ub3RPbmJvYXJkAQEFOENhbm5vdE9mZmJvYXJkAQEFNENhbm5vdFVwZ3JhZGUBAQU8Q2Fubm90RG93bmdyYWRlAQEFWFB2ZkNoZWNrU3RhdGVtZW50U3RhbGUBAQVcUHZmQ2hlY2tTdGF0ZW1lbnRGdXR1cmUBAQWEUHZmQ2hlY2tWYWxpZGF0b3JJbmRleE91dE9mQm91bmRzAQEFYFB2ZkNoZWNrSW52YWxpZFNpZ25hdHVyZQEBBUhQdmZDaGVja0RvdWJsZVZvdGUBAQVYUHZmQ2hlY2tTdWJqZWN0SW52YWxpZAEBBURDYW5ub3RVcGdyYWRlQ29kZQEBBSxJbnZhbGlkQ29kZQEBBSxJbml0aWFsaXplcgEBBQxEbXABAQUQSHJtcAECUFRPcGVuSHJtcENoYW5uZWxUb1NlbGYBAQV8T3BlbkhybXBDaGFubmVsSW52YWxpZFJlY2lwaWVudAEBBWxPcGVuSHJtcENoYW5uZWxaZXJvQ2FwYWNpdHkBAQWMT3BlbkhybXBDaGFubmVsQ2FwYWNpdHlFeGNlZWRzTGltaXQBAQV4T3BlbkhybXBDaGFubmVsWmVyb01lc3NhZ2VTaXplAQEFmE9wZW5Icm1wQ2hhbm5lbE1lc3NhZ2VTaXplRXhjZWVkc0xpbWl0AQEFcE9wZW5Icm1wQ2hhbm5lbEFscmVhZHlFeGlzdHMBAQV8T3BlbkhybXBDaGFubmVsQWxyZWFkeVJlcXVlc3RlZAEBBXBPcGVuSHJtcENoYW5uZWxMaW1pdEV4Y2VlZGVkAQEFcEFjY2VwdEhybXBDaGFubmVsRG9lc250RXhpc3QBAQWEQWNjZXB0SHJtcENoYW5uZWxBbHJlYWR5Q29uZmlybWVkAQEFeEFjY2VwdEhybXBDaGFubmVsTGltaXRFeGNlZWRlZAEBBXBDbG9zZUhybXBDaGFubmVsVW5hdXRob3JpemVkAQEFbENsb3NlSHJtcENoYW5uZWxEb2VzbnRFeGlzdAEBBXxDbG9zZUhybXBDaGFubmVsQWxyZWFkeVVuZGVyd2F5AQEFhENhbmNlbEhybXBPcGVuQ2hhbm5lbFVuYXV0aG9yaXplZAEBBWhPcGVuSHJtcENoYW5uZWxEb2VzbnRFeGlzdAEBBXxPcGVuSHJtcENoYW5uZWxBbHJlYWR5Q29uZmlybWVkAQEFMFdyb25nV2l0bmVzcwEBBXBDaGFubmVsQ3JlYXRpb25Ob3RBdXRob3JpemVkAQEFPFBhcmFTZXNzaW9uSW5mbwEBBTRQYXJhc0Rpc3B1dGVzAQIkdER1cGxpY2F0ZURpc3B1dGVTdGF0ZW1lbnRTZXRzAQEFXEFuY2llbnREaXNwdXRlU3RhdGVtZW50AQEFZFZhbGlkYXRvckluZGV4T3V0T2ZCb3VuZHMBAQVASW52YWxpZFNpZ25hdHVyZQEBBUhEdXBsaWNhdGVTdGF0ZW1lbnQBAQVIU2luZ2xlU2lkZWREaXNwdXRlAQEFPE1hbGljaW91c0JhY2tlcgEBBUxNaXNzaW5nQmFja2luZ1ZvdGVzAQEFSFVuY29uZmlybWVkRGlzcHV0ZQEBBTRQYXJhc1NsYXNoaW5nAQIYYEludmFsaWRLZXlPd25lcnNoaXBQcm9vZgEBBUxJbnZhbGlkU2Vzc2lvbkluZGV4AQEFUEludmFsaWRDYW5kaWRhdGVIYXNoAQEFVEludmFsaWRWYWxpZGF0b3JJbmRleAEBBWBWYWxpZGF0b3JJbmRleElkTWlzbWF0Y2gBAQVcRHVwbGljYXRlU2xhc2hpbmdSZXBvcnQBAQVoT25EZW1hbmRBc3NpZ25tZW50UHJvdmlkZXIBAggkUXVldWVGdWxsAQEFcFNwb3RQcmljZUhpZ2hlclRoYW5NYXhBbW91bnQBAQVoQ29yZXRpbWVBc3NpZ25tZW50UHJvdmlkZXIBAhhAQXNzaWdubWVudHNFbXB0eQEBBTRPdmVyU2NoZWR1bGVkAQEFOFVuZGVyU2NoZWR1bGVkAQEFQERpc2FsbG93ZWRJbnNlcnQBAQU8RHVwbGljYXRlSW5zZXJ0AQEFUEFzc2lnbm1lbnRzTm90U29ydGVkAQEFJFJlZ2lzdHJhcgECODROb3RSZWdpc3RlcmVkAQEFREFscmVhZHlSZWdpc3RlcmVkAQEFIE5vdE93bmVyAQEFMENvZGVUb29MYXJnZQEBBUBIZWFkRGF0YVRvb0xhcmdlAQEFME5vdFBhcmFjaGFpbgEBBTROb3RQYXJhdGhyZWFkAQEFQENhbm5vdERlcmVnaXN0ZXIBAQU8Q2Fubm90RG93bmdyYWRlAQEFNENhbm5vdFVwZ3JhZGUBAQUoUGFyYUxvY2tlZAEBBSxOb3RSZXNlcnZlZAEBBSxJbnZhbGlkQ29kZQEBBShDYW5ub3RTd2FwAQEFFFNsb3RzAQIIRFBhcmFOb3RPbmJvYXJkaW5nAQEFKExlYXNlRXJyb3IBAQUgQXVjdGlvbnMBAhxEQXVjdGlvbkluUHJvZ3Jlc3MBAQVETGVhc2VQZXJpb2RJblBhc3QBAQVEUGFyYU5vdFJlZ2lzdGVyZWQBAQVETm90Q3VycmVudEF1Y3Rpb24BAQUoTm90QXVjdGlvbgEBBTBBdWN0aW9uRW5kZWQBAQVAQWxyZWFkeUxlYXNlZE91dAEBBSRDcm93ZGxvYW4BAlxERmlyc3RQZXJpb2RJblBhc3QBAQVkRmlyc3RQZXJpb2RUb29GYXJJbkZ1dHVyZQEBBWxMYXN0UGVyaW9kQmVmb3JlRmlyc3RQZXJpb2QBAQVgTGFzdFBlcmlvZFRvb0ZhckluRnV0dXJlAQEFPENhbm5vdEVuZEluUGFzdAEBBURFbmRUb29GYXJJbkZ1dHVyZQEBBSBPdmVyZmxvdwEBBVBDb250cmlidXRpb25Ub29TbWFsbAEBBTRJbnZhbGlkUGFyYUlkAQEFLENhcEV4Y2VlZGVkAQEFWENvbnRyaWJ1dGlvblBlcmlvZE92ZXIBAQU0SW52YWxpZE9yaWdpbgEBBTBOb3RQYXJhY2hhaW4BAQUsTGVhc2VBY3RpdmUBAQVAQmlkT3JMZWFzZUFjdGl2ZQEBBTBGdW5kTm90RW5kZWQBAQU8Tm9Db250cmlidXRpb25zAQEFSE5vdFJlYWR5VG9EaXNzb2x2ZQEBBUBJbnZhbGlkU2lnbmF0dXJlAQEFME1lbW9Ub29MYXJnZQEBBURBbHJlYWR5SW5OZXdSYWlzZQEBBUhWcmZEZWxheUluUHJvZ3Jlc3MBAQU0Tm9MZWFzZVBlcmlvZAEBBSBDb3JldGltZQECDCROb3RCcm9rZXIBAQVYUmVxdWVzdGVkRnV0dXJlUmV2ZW51ZQEBBUxBc3NldFRyYW5zZmVyRmFpbGVkAQEFJFhjbVBhbGxldAECYCxVbnJlYWNoYWJsZQEBBSxTZW5kRmFpbHVyZQEBBSBGaWx0ZXJlZAEBBUhVbndlaWdoYWJsZU1lc3NhZ2UBAQVgRGVzdGluYXRpb25Ob3RJbnZlcnRpYmxlAQEFFEVtcHR5AQEFOENhbm5vdFJlYW5jaG9yAQEFNFRvb01hbnlBc3NldHMBAQU0SW52YWxpZE9yaWdpbgEBBShCYWRWZXJzaW9uAQEFLEJhZExvY2F0aW9uAQEFOE5vU3Vic2NyaXB0aW9uAQEFREFscmVhZHlTdWJzY3JpYmVkAQEFWENhbm5vdENoZWNrT3V0VGVsZXBvcnQBAQUoTG93QmFsYW5jZQEBBTBUb29NYW55TG9ja3MBAQVMQWNjb3VudE5vdFNvdmVyZWlnbgEBBShGZWVzTm90TWV0AQEFMExvY2tOb3RGb3VuZAEBBRRJblVzZQEBBWhJbnZhbGlkQXNzZXRVbmtub3duUmVzZXJ2ZQEBBXhJbnZhbGlkQXNzZXRVbnN1cHBvcnRlZFJlc2VydmUBAQU8VG9vTWFueVJlc2VydmVzAQEFYExvY2FsRXhlY3V0aW9uSW5jb21wbGV0ZQEBBTBNZXNzYWdlUXVldWUBAiQsTm90UmVhcGFibGUBAQUYTm9QYWdlAQEFJE5vTWVzc2FnZQEBBUBBbHJlYWR5UHJvY2Vzc2VkAQEFGFF1ZXVlZAEBBUhJbnN1ZmZpY2llbnRXZWlnaHQBAQVgVGVtcG9yYXJpbHlVbnByb2Nlc3NhYmxlAQEFLFF1ZXVlUGF1c2VkAQEFTFJlY3Vyc2l2ZURpc2FsbG93ZWQBAQUkQXNzZXRSYXRlAQIMQFVua25vd25Bc3NldEtpbmQBAQU0QWxyZWFkeUV4aXN0cwEBBSBPdmVyZmxvdwEBBRRCZWVmeQECEGBJbnZhbGlkS2V5T3duZXJzaGlwUHJvb2YBAQVgSW52YWxpZEVxdWl2b2NhdGlvblByb29mAQEFWER1cGxpY2F0ZU9mZmVuY2VSZXBvcnQBAQVQSW52YWxpZENvbmZpZ3VyYXRpb24BAQUMTW1yAQEFMEJlZWZ5TW1yTGVhZgEBBURDb25zdW1lclJlbWFpbmluZwEBBSxOb1Byb3ZpZGVycwEBBUBUb29NYW55Q29uc3VtZXJzAQEFFFRva2VuAQIoQEZ1bmRzVW5hdmFpbGFibGUBAQUwT25seVByb3ZpZGVyAQEFMEJlbG93TWluaW11bQEBBTBDYW5ub3RDcmVhdGUBAQUwVW5rbm93bkFzc2V0AQEFGEZyb3plbgEBBSxVbnN1cHBvcnRlZAEBBUBDYW5ub3RDcmVhdGVIb2xkAQEFNE5vdEV4cGVuZGFibGUBAQUcQmxvY2tlZAEBBShBcml0aG1ldGljAQIMJFVuZGVyZmxvdwEBBSBPdmVyZmxvdwEBBThEaXZpc2lvbkJ5WmVybwEBBTRUcmFuc2FjdGlvbmFsAQIIMExpbWl0UmVhY2hlZAEBBRxOb0xheWVyAQEFJEV4aGF1c3RlZAEBBShDb3JydXB0aW9uAQEFLFVuYXZhaWxhYmxlAQEFOFJvb3ROb3RBbGxvd2VkAQEFAhxARXh0cmluc2ljU3VjY2VzcwEABDRkaXNwYXRjaF9pbmZvQDxFeHRyaW5zaWNGYWlsZWQBAAg4ZGlzcGF0Y2hfZXJyb3JxCzRkaXNwYXRjaF9pbmZvQCxDb2RlVXBkYXRlZAEBBShOZXdBY2NvdW50AQAEHGFjY291bnQANEtpbGxlZEFjY291bnQBAAQcYWNjb3VudAAgUmVtYXJrZWQBAAgYc2VuZGVyABBoYXNoIERVcGdyYWRlQXV0aG9yaXplZAEACCRjb2RlX2hhc2ggNGNoZWNrX3ZlcnNpb24UAggMQXllAQECDE5heQEBAgAMJGJhcmVfYXllcwQQYXllcwQQbmF5cwQCFCxNZW1iZXJBZGRlZAEABAx3aG8ALFJhbmtDaGFuZ2VkAQAIDHdobwAQcmFuawQ0TWVtYmVyUmVtb3ZlZAEACAx3aG8AEHJhbmsEFFZvdGVkAQAQDHdobwAQcG9sbAQQdm90ZXkLFHRhbGx5fQs8TWVtYmVyRXhjaGFuZ2VkAQAIDHdobwAcbmV3X3dobwACQCRTdWJtaXR0ZWQBAAwUaW5kZXgEFHRyYWNrBCBwcm9wb3NhbKUBVERlY2lzaW9uRGVwb3NpdFBsYWNlZAEADBRpbmRleAQMd2hvABhhbW91bnQIXERlY2lzaW9uRGVwb3NpdFJlZnVuZGVkAQAMFGluZGV4BAx3aG8AGGFtb3VudAg4RGVwb3NpdFNsYXNoZWQBAAgMd2hvABhhbW91bnQIPERlY2lzaW9uU3RhcnRlZAEAEBRpbmRleAQUdHJhY2sEIHByb3Bvc2FspQEUdGFsbHl9CzhDb25maXJtU3RhcnRlZAEABBRpbmRleAQ4Q29uZmlybUFib3J0ZWQBAAQUaW5kZXgEJENvbmZpcm1lZAEACBRpbmRleAQUdGFsbHl9CyBBcHByb3ZlZAEABBRpbmRleAQgUmVqZWN0ZWQBAAgUaW5kZXgEFHRhbGx5fQsgVGltZWRPdXQBAAgUaW5kZXgEFHRhbGx5fQskQ2FuY2VsbGVkAQAIFGluZGV4BBR0YWxseX0LGEtpbGxlZAEACBRpbmRleAQUdGFsbHl9C2RTdWJtaXNzaW9uRGVwb3NpdFJlZnVuZGVkAQAMFGluZGV4BAx3aG8AGGFtb3VudAgsTWV0YWRhdGFTZXQBAAgUaW5kZXgEEGhhc2ggPE1ldGFkYXRhQ2xlYXJlZAEACBRpbmRleAQQaGFzaCAACCRwb3N0X2luZm+1ARRlcnJvcnELB7UBiQsCDDxDYWxsV2hpdGVsaXN0ZWQBAAQkY2FsbF9oYXNoIFhXaGl0ZWxpc3RlZENhbGxSZW1vdmVkAQAEJGNhbGxfaGFzaCBkV2hpdGVsaXN0ZWRDYWxsRGlzcGF0Y2hlZAEACCRjYWxsX2hhc2ggGHJlc3VsdI0LBxUBcQsCGEBCYXRjaEludGVycnVwdGVkAQAIFGluZGV4BBRlcnJvcnELOEJhdGNoQ29tcGxldGVkAQEFYEJhdGNoQ29tcGxldGVkV2l0aEVycm9ycwEBBTRJdGVtQ29tcGxldGVkAQEFKEl0ZW1GYWlsZWQBAAQUZXJyb3JxCzBEaXNwYXRjaGVkQXMBAAQYcmVzdWx0lQsAECxtYXhfbWVtYmVycwQobWF4X2ludGFrZQQsbWF4X3N0cmlrZXMERGNhbmRpZGF0ZV9kZXBvc2l0CAJEHEZvdW5kZWQBAAQcZm91bmRlcgAMQmlkAQAIMGNhbmRpZGF0ZV9pZAAUb2ZmZXIIFFZvdWNoAQAMMGNhbmRpZGF0ZV9pZAAUb2ZmZXIIIHZvdWNoaW5nACRBdXRvVW5iaWQBAAQkY2FuZGlkYXRlABRVbmJpZAEABCRjYW5kaWRhdGUAHFVudm91Y2gBAAQkY2FuZGlkYXRlACBJbmR1Y3RlZAEACBxwcmltYXJ5AChjYW5kaWRhdGVz3QNgU3VzcGVuZGVkTWVtYmVySnVkZ2VtZW50AQAIDHdobwAYanVkZ2VkFEhDYW5kaWRhdGVTdXNwZW5kZWQBAAQkY2FuZGlkYXRlADxNZW1iZXJTdXNwZW5kZWQBAAQYbWVtYmVyAChDaGFsbGVuZ2VkAQAEGG1lbWJlcgAQVm90ZQEADCRjYW5kaWRhdGUAFHZvdGVyABB2b3RlFDBEZWZlbmRlclZvdGUBAAgUdm90ZXIAEHZvdGUUJE5ld1BhcmFtcwEABBhwYXJhbXOdCyRVbmZvdW5kZWQBAAQcZm91bmRlcgAcRGVwb3NpdAEABBR2YWx1ZQggRWxldmF0ZWQBAAgYbWVtYmVyABByYW5rBAIYPFJlY292ZXJ5Q3JlYXRlZAEABBxhY2NvdW50AERSZWNvdmVyeUluaXRpYXRlZAEACDBsb3N0X2FjY291bnQAPHJlc2N1ZXJfYWNjb3VudAA8UmVjb3ZlcnlWb3VjaGVkAQAMMGxvc3RfYWNjb3VudAA8cmVzY3Vlcl9hY2NvdW50ABhzZW5kZXIAOFJlY292ZXJ5Q2xvc2VkAQAIMGxvc3RfYWNjb3VudAA8cmVzY3Vlcl9hY2NvdW50AEBBY2NvdW50UmVjb3ZlcmVkAQAIMGxvc3RfYWNjb3VudAA8cmVzY3Vlcl9hY2NvdW50ADxSZWNvdmVyeVJlbW92ZWQBAAQwbG9zdF9hY2NvdW50AAIkJFNjaGVkdWxlZAEACBB3aGVuBBRpbmRleAQgQ2FuY2VsZWQBAAgQd2hlbgQUaW5kZXgEKERpc3BhdGNoZWQBAAwQdGFzaw0BCGlkEQEYcmVzdWx0lQsgUmV0cnlTZXQBABAQdGFzaw0BCGlkEQEYcGVyaW9kBBxyZXRyaWVzBDhSZXRyeUNhbmNlbGxlZAEACBB0YXNrDQEIaWQRATxDYWxsVW5hdmFpbGFibGUBAAgQdGFzaw0BCGlkEQE4UGVyaW9kaWNGYWlsZWQBAAgQdGFzaw0BCGlkEQEsUmV0cnlGYWlsZWQBAAgQdGFzaw0BCGlkEQFUUGVybWFuZW50bHlPdmVyd2VpZ2h0AQAIEHRhc2sNAQhpZBEBAiQMQW55AQEFLE5vblRyYW5zZmVyAQEFKEdvdmVybmFuY2UBAQUcU3Rha2luZwEBBSxDYW5jZWxQcm94eQEBBRxBdWN0aW9uAQEFHFNvY2lldHkBAQU8Tm9taW5hdGlvblBvb2xzAQEFMFNwb2tlc3BlcnNvbgEBBQIUNFByb3h5RXhlY3V0ZWQBAAQYcmVzdWx0lQssUHVyZUNyZWF0ZWQBABAQcHVyZQAMd2hvAChwcm94eV90eXBlrQtQZGlzYW1iaWd1YXRpb25faW5kZXgEJEFubm91bmNlZAEADBByZWFsABRwcm94eQAkY2FsbF9oYXNoIChQcm94eUFkZGVkAQAQJGRlbGVnYXRvcgAkZGVsZWdhdGVlAChwcm94eV90eXBlrQsUZGVsYXkEMFByb3h5UmVtb3ZlZAEAECRkZWxlZ2F0b3IAJGRlbGVnYXRlZQAocHJveHlfdHlwZa0LFGRlbGF5BAIQLE5ld011bHRpc2lnAQAMJGFwcHJvdmluZwAgbXVsdGlzaWcAJGNhbGxfaGFzaCBATXVsdGlzaWdBcHByb3ZhbAEAECRhcHByb3ZpbmcAJHRpbWVwb2ludPEBIG11bHRpc2lnACRjYWxsX2hhc2ggQE11bHRpc2lnRXhlY3V0ZWQBABQkYXBwcm92aW5nACR0aW1lcG9pbnTxASBtdWx0aXNpZwAkY2FsbF9oYXNoIBhyZXN1bHSVC0RNdWx0aXNpZ0NhbmNlbGxlZAEAEChjYW5jZWxsaW5nACR0aW1lcG9pbnTxASBtdWx0aXNpZwAkY2FsbF9oYXNoIAIcJEJpZFBsYWNlZAEADAx3aG8AGGFtb3VudAggZHVyYXRpb24EMEJpZFJldHJhY3RlZAEADAx3aG8AGGFtb3VudAggZHVyYXRpb24EKEJpZERyb3BwZWQBAAwMd2hvABhhbW91bnQIIGR1cmF0aW9uBBhJc3N1ZWQBABQUaW5kZXgEGGV4cGlyeQQMd2hvAChwcm9wb3J0aW9uCBhhbW91bnQIGFRoYXdlZAEAFBRpbmRleAQMd2hvAChwcm9wb3J0aW9uCBhhbW91bnQIHGRyb3BwZWQUGEZ1bmRlZAEABBxkZWZpY2l0CCxUcmFuc2ZlcnJlZAEADBBmcm9tAAh0bwAUaW5kZXgEAhQgVW5zdGFrZWQBAAgUc3Rhc2gAGHJlc3VsdJULHFNsYXNoZWQBAAgUc3Rhc2gAGGFtb3VudAgwQmF0Y2hDaGVja2VkAQAEEGVyYXM5AjRCYXRjaEZpbmlzaGVkAQAEEHNpemUENEludGVybmFsRXJyb3IBAQUCKBxDcmVhdGVkAQAEHHBhcmFfaWQELENvbnRyaWJ1dGVkAQAMDHdobwAoZnVuZF9pbmRleAQYYW1vdW50CCBXaXRoZHJldwEADAx3aG8AKGZ1bmRfaW5kZXgEGGFtb3VudAhEUGFydGlhbGx5UmVmdW5kZWQBAAQccGFyYV9pZAQsQWxsUmVmdW5kZWQBAAQccGFyYV9pZAQkRGlzc29sdmVkAQAEHHBhcmFfaWQEPEhhbmRsZUJpZFJlc3VsdAEACBxwYXJhX2lkBBhyZXN1bHSVCxhFZGl0ZWQBAAQccGFyYV9pZAQsTWVtb1VwZGF0ZWQBAAwMd2hvABxwYXJhX2lkBBBtZW1vJDxBZGRlZFRvTmV3UmFpc2UBAAQccGFyYV9pZAQCtBhTeXN0ZW0BAhxARXh0cmluc2ljU3VjY2VzcwEABDRkaXNwYXRjaF9pbmZvQDxFeHRyaW5zaWNGYWlsZWQBAAg4ZGlzcGF0Y2hfZXJyb3JxCzRkaXNwYXRjaF9pbmZvQCxDb2RlVXBkYXRlZAEBBShOZXdBY2NvdW50AQAEHGFjY291bnQANEtpbGxlZEFjY291bnQBAAQcYWNjb3VudAAgUmVtYXJrZWQBAAgYc2VuZGVyABBoYXNoIERVcGdyYWRlQXV0aG9yaXplZAEACCRjb2RlX2hhc2ggNGNoZWNrX3ZlcnNpb24UHEluZGljZXMBAgw0SW5kZXhBc3NpZ25lZAEACAx3aG8AFGluZGV4BChJbmRleEZyZWVkAQAEFGluZGV4BCxJbmRleEZyb3plbgEACBRpbmRleAQMd2hvACBCYWxhbmNlcwECWBxFbmRvd2VkAQAIHGFjY291bnQAMGZyZWVfYmFsYW5jZQggRHVzdExvc3QBAAgcYWNjb3VudAAYYW1vdW50CCBUcmFuc2ZlcgEADBBmcm9tAAh0bwAYYW1vdW50CChCYWxhbmNlU2V0AQAIDHdobwAQZnJlZQggUmVzZXJ2ZWQBAAgMd2hvABhhbW91bnQIKFVucmVzZXJ2ZWQBAAgMd2hvABhhbW91bnQISFJlc2VydmVSZXBhdHJpYXRlZAEAEBBmcm9tAAh0bwAYYW1vdW50CEhkZXN0aW5hdGlvbl9zdGF0dXMpARxEZXBvc2l0AQAIDHdobwAYYW1vdW50CCBXaXRoZHJhdwEACAx3aG8AGGFtb3VudAgcU2xhc2hlZAEACAx3aG8AGGFtb3VudAgYTWludGVkAQAIDHdobwAYYW1vdW50CBhCdXJuZWQBAAgMd2hvABhhbW91bnQIJFN1c3BlbmRlZAEACAx3aG8AGGFtb3VudAggUmVzdG9yZWQBAAgMd2hvABhhbW91bnQIIFVwZ3JhZGVkAQAEDHdobwAYSXNzdWVkAQAEGGFtb3VudAgkUmVzY2luZGVkAQAEGGFtb3VudAgYTG9ja2VkAQAIDHdobwAYYW1vdW50CCBVbmxvY2tlZAEACAx3aG8AGGFtb3VudAgYRnJvemVuAQAIDHdobwAYYW1vdW50CBhUaGF3ZWQBAAgMd2hvABhhbW91bnQITFRvdGFsSXNzdWFuY2VGb3JjZWQBAAgMb2xkCAxuZXcISFRyYW5zYWN0aW9uUGF5bWVudAECBEhUcmFuc2FjdGlvbkZlZVBhaWQBAAwMd2hvAChhY3R1YWxfZmVlCAx0aXAIHFN0YWtpbmcBAkgcRXJhUGFpZAEADCRlcmFfaW5kZXgEQHZhbGlkYXRvcl9wYXlvdXQIJHJlbWFpbmRlcgggUmV3YXJkZWQBAAwUc3Rhc2gAEGRlc3Q1ARhhbW91bnQIHFNsYXNoZWQBAAgYc3Rha2VyABhhbW91bnQINFNsYXNoUmVwb3J0ZWQBAAwkdmFsaWRhdG9yACBmcmFjdGlvbgQkc2xhc2hfZXJhBGhPbGRTbGFzaGluZ1JlcG9ydERpc2NhcmRlZAEABDRzZXNzaW9uX2luZGV4BDhTdGFrZXJzRWxlY3RlZAEBBRhCb25kZWQBAAgUc3Rhc2gAGGFtb3VudAggVW5ib25kZWQBAAgUc3Rhc2gAGGFtb3VudAgkV2l0aGRyYXduAQAIFHN0YXNoABhhbW91bnQIGEtpY2tlZAEACCRub21pbmF0b3IAFHN0YXNoAFRTdGFraW5nRWxlY3Rpb25GYWlsZWQBAQUcQ2hpbGxlZAEABBRzdGFzaAA0UGF5b3V0U3RhcnRlZAEACCRlcmFfaW5kZXgEPHZhbGlkYXRvcl9zdGFzaABEVmFsaWRhdG9yUHJlZnNTZXQBAAgUc3Rhc2gAFHByZWZzOQFoU25hcHNob3RWb3RlcnNTaXplRXhjZWVkZWQBAAQQc2l6ZQRsU25hcHNob3RUYXJnZXRzU2l6ZUV4Y2VlZGVkAQAEEHNpemUEIEZvcmNlRXJhAQAEEG1vZGU9AWRDb250cm9sbGVyQmF0Y2hEZXByZWNhdGVkAQAEIGZhaWx1cmVzBCBPZmZlbmNlcwECBBxPZmZlbmNlAQAIEGtpbmRFASB0aW1lc2xvdCQcU2Vzc2lvbgECBChOZXdTZXNzaW9uAQAENHNlc3Npb25faW5kZXgEHEdyYW5kcGEBAgw4TmV3QXV0aG9yaXRpZXMBAAQ0YXV0aG9yaXR5X3NldFUBGFBhdXNlZAEBBRxSZXN1bWVkAQEFIFRyZWFzdXJ5AQIwIFNwZW5kaW5nAQAEQGJ1ZGdldF9yZW1haW5pbmcIHEF3YXJkZWQBAAw4cHJvcG9zYWxfaW5kZXgEFGF3YXJkCBxhY2NvdW50ABRCdXJudAEABCxidXJudF9mdW5kcwggUm9sbG92ZXIBAARAcm9sbG92ZXJfYmFsYW5jZQgcRGVwb3NpdAEABBR2YWx1ZQg0U3BlbmRBcHByb3ZlZAEADDhwcm9wb3NhbF9pbmRleAQYYW1vdW50CCxiZW5lZmljaWFyeQA8VXBkYXRlZEluYWN0aXZlAQAILHJlYWN0aXZhdGVkCCxkZWFjdGl2YXRlZAhIQXNzZXRTcGVuZEFwcHJvdmVkAQAYFGluZGV4BChhc3NldF9raW5kgQEYYW1vdW50CCxiZW5lZmljaWFyeZkBKHZhbGlkX2Zyb20EJGV4cGlyZV9hdARAQXNzZXRTcGVuZFZvaWRlZAEABBRpbmRleAQQUGFpZAEACBRpbmRleAQocGF5bWVudF9pZAg0UGF5bWVudEZhaWxlZAEACBRpbmRleAQocGF5bWVudF9pZAg4U3BlbmRQcm9jZXNzZWQBAAQUaW5kZXgEQENvbnZpY3Rpb25Wb3RpbmcBAggkRGVsZWdhdGVkAQQAAQgsVW5kZWxlZ2F0ZWQBAQEkUmVmZXJlbmRhAQJAJFN1Ym1pdHRlZAEADBRpbmRleAQUdHJhY2sEIHByb3Bvc2FspQFURGVjaXNpb25EZXBvc2l0UGxhY2VkAQAMFGluZGV4BAx3aG8AGGFtb3VudAhcRGVjaXNpb25EZXBvc2l0UmVmdW5kZWQBAAwUaW5kZXgEDHdobwAYYW1vdW50CDhEZXBvc2l0U2xhc2hlZAEACAx3aG8AGGFtb3VudAg8RGVjaXNpb25TdGFydGVkAQAQFGluZGV4BBR0cmFjawQgcHJvcG9zYWylARR0YWxseakBOENvbmZpcm1TdGFydGVkAQAEFGluZGV4BDhDb25maXJtQWJvcnRlZAEABBRpbmRleAQkQ29uZmlybWVkAQAIFGluZGV4BBR0YWxseakBIEFwcHJvdmVkAQAEFGluZGV4BCBSZWplY3RlZAEACBRpbmRleAQUdGFsbHmpASBUaW1lZE91dAEACBRpbmRleAQUdGFsbHmpASRDYW5jZWxsZWQBAAgUaW5kZXgEFHRhbGx5qQEYS2lsbGVkAQAIFGluZGV4BBR0YWxseakBZFN1Ym1pc3Npb25EZXBvc2l0UmVmdW5kZWQBAAwUaW5kZXgEDHdobwAYYW1vdW50CCxNZXRhZGF0YVNldAEACBRpbmRleAQQaGFzaCA8TWV0YWRhdGFDbGVhcmVkAQAIFGluZGV4BBBoYXNoIFBGZWxsb3dzaGlwQ29sbGVjdGl2ZQECFCxNZW1iZXJBZGRlZAEABAx3aG8ALFJhbmtDaGFuZ2VkAQAIDHdobwAQcmFuawQ0TWVtYmVyUmVtb3ZlZAEACAx3aG8AEHJhbmsEFFZvdGVkAQAQDHdobwAQcG9sbAQQdm90ZXkLFHRhbGx5fQs8TWVtYmVyRXhjaGFuZ2VkAQAIDHdobwAcbmV3X3dobwBMRmVsbG93c2hpcFJlZmVyZW5kYQECQCRTdWJtaXR0ZWQBAAwUaW5kZXgEFHRyYWNrBCBwcm9wb3NhbKUBVERlY2lzaW9uRGVwb3NpdFBsYWNlZAEADBRpbmRleAQMd2hvABhhbW91bnQIXERlY2lzaW9uRGVwb3NpdFJlZnVuZGVkAQAMFGluZGV4BAx3aG8AGGFtb3VudAg4RGVwb3NpdFNsYXNoZWQBAAgMd2hvABhhbW91bnQIPERlY2lzaW9uU3RhcnRlZAEAEBRpbmRleAQUdHJhY2sEIHByb3Bvc2FspQEUdGFsbHl9CzhDb25maXJtU3RhcnRlZAEABBRpbmRleAQ4Q29uZmlybUFib3J0ZWQBAAQUaW5kZXgEJENvbmZpcm1lZAEACBRpbmRleAQUdGFsbHl9CyBBcHByb3ZlZAEABBRpbmRleAQgUmVqZWN0ZWQBAAgUaW5kZXgEFHRhbGx5fQsgVGltZWRPdXQBAAgUaW5kZXgEFHRhbGx5fQskQ2FuY2VsbGVkAQAIFGluZGV4BBR0YWxseX0LGEtpbGxlZAEACBRpbmRleAQUdGFsbHl9C2RTdWJtaXNzaW9uRGVwb3NpdFJlZnVuZGVkAQAMFGluZGV4BAx3aG8AGGFtb3VudAgsTWV0YWRhdGFTZXQBAAgUaW5kZXgEEGhhc2ggPE1ldGFkYXRhQ2xlYXJlZAEACBRpbmRleAQQaGFzaCAkV2hpdGVsaXN0AQIMPENhbGxXaGl0ZWxpc3RlZAEABCRjYWxsX2hhc2ggWFdoaXRlbGlzdGVkQ2FsbFJlbW92ZWQBAAQkY2FsbF9oYXNoIGRXaGl0ZWxpc3RlZENhbGxEaXNwYXRjaGVkAQAIJGNhbGxfaGFzaCAYcmVzdWx0jQsoUGFyYW1ldGVycwECBBxVcGRhdGVkAQAMDGtleckBJG9sZF92YWx1ZdUBJG5ld192YWx1ZdUBGENsYWltcwECBBxDbGFpbWVkAQAMDHdobwBAZXRoZXJldW1fYWRkcmVzc2UBGGFtb3VudAgcVXRpbGl0eQECGEBCYXRjaEludGVycnVwdGVkAQAIFGluZGV4BBRlcnJvcnELOEJhdGNoQ29tcGxldGVkAQEFYEJhdGNoQ29tcGxldGVkV2l0aEVycm9ycwEBBTRJdGVtQ29tcGxldGVkAQEFKEl0ZW1GYWlsZWQBAAQUZXJyb3JxCzBEaXNwYXRjaGVkQXMBAAQYcmVzdWx0lQscU29jaWV0eQECRBxGb3VuZGVkAQAEHGZvdW5kZXIADEJpZAEACDBjYW5kaWRhdGVfaWQAFG9mZmVyCBRWb3VjaAEADDBjYW5kaWRhdGVfaWQAFG9mZmVyCCB2b3VjaGluZwAkQXV0b1VuYmlkAQAEJGNhbmRpZGF0ZQAUVW5iaWQBAAQkY2FuZGlkYXRlABxVbnZvdWNoAQAEJGNhbmRpZGF0ZQAgSW5kdWN0ZWQBAAgccHJpbWFyeQAoY2FuZGlkYXRlc90DYFN1c3BlbmRlZE1lbWJlckp1ZGdlbWVudAEACAx3aG8AGGp1ZGdlZBRIQ2FuZGlkYXRlU3VzcGVuZGVkAQAEJGNhbmRpZGF0ZQA8TWVtYmVyU3VzcGVuZGVkAQAEGG1lbWJlcgAoQ2hhbGxlbmdlZAEABBhtZW1iZXIAEFZvdGUBAAwkY2FuZGlkYXRlABR2b3RlcgAQdm90ZRQwRGVmZW5kZXJWb3RlAQAIFHZvdGVyABB2b3RlFCROZXdQYXJhbXMBAAQYcGFyYW1znQskVW5mb3VuZGVkAQAEHGZvdW5kZXIAHERlcG9zaXQBAAQUdmFsdWUIIEVsZXZhdGVkAQAIGG1lbWJlcgAQcmFuawQgUmVjb3ZlcnkBAhg8UmVjb3ZlcnlDcmVhdGVkAQAEHGFjY291bnQARFJlY292ZXJ5SW5pdGlhdGVkAQAIMGxvc3RfYWNjb3VudAA8cmVzY3Vlcl9hY2NvdW50ADxSZWNvdmVyeVZvdWNoZWQBAAwwbG9zdF9hY2NvdW50ADxyZXNjdWVyX2FjY291bnQAGHNlbmRlcgA4UmVjb3ZlcnlDbG9zZWQBAAgwbG9zdF9hY2NvdW50ADxyZXNjdWVyX2FjY291bnQAQEFjY291bnRSZWNvdmVyZWQBAAgwbG9zdF9hY2NvdW50ADxyZXNjdWVyX2FjY291bnQAPFJlY292ZXJ5UmVtb3ZlZAEABDBsb3N0X2FjY291bnQAHFZlc3RpbmcBAgg4VmVzdGluZ1VwZGF0ZWQBAAgcYWNjb3VudAAgdW52ZXN0ZWQIQFZlc3RpbmdDb21wbGV0ZWQBAAQcYWNjb3VudAAkU2NoZWR1bGVyAQIkJFNjaGVkdWxlZAEACBB3aGVuBBRpbmRleAQgQ2FuY2VsZWQBAAgQd2hlbgQUaW5kZXgEKERpc3BhdGNoZWQBAAwQdGFzaw0BCGlkEQEYcmVzdWx0lQsgUmV0cnlTZXQBABAQdGFzaw0BCGlkEQEYcGVyaW9kBBxyZXRyaWVzBDhSZXRyeUNhbmNlbGxlZAEACBB0YXNrDQEIaWQRATxDYWxsVW5hdmFpbGFibGUBAAgQdGFzaw0BCGlkEQE4UGVyaW9kaWNGYWlsZWQBAAgQdGFzaw0BCGlkEQEsUmV0cnlGYWlsZWQBAAgQdGFzaw0BCGlkEQFUUGVybWFuZW50bHlPdmVyd2VpZ2h0AQAIEHRhc2sNAQhpZBEBFFByb3h5AQIUNFByb3h5RXhlY3V0ZWQBAAQYcmVzdWx0lQssUHVyZUNyZWF0ZWQBABAQcHVyZQAMd2hvAChwcm94eV90eXBlrQtQZGlzYW1iaWd1YXRpb25faW5kZXgEJEFubm91bmNlZAEADBByZWFsABRwcm94eQAkY2FsbF9oYXNoIChQcm94eUFkZGVkAQAQJGRlbGVnYXRvcgAkZGVsZWdhdGVlAChwcm94eV90eXBlrQsUZGVsYXkEMFByb3h5UmVtb3ZlZAEAECRkZWxlZ2F0b3IAJGRlbGVnYXRlZQAocHJveHlfdHlwZa0LFGRlbGF5BCBNdWx0aXNpZwECECxOZXdNdWx0aXNpZwEADCRhcHByb3ZpbmcAIG11bHRpc2lnACRjYWxsX2hhc2ggQE11bHRpc2lnQXBwcm92YWwBABAkYXBwcm92aW5nACR0aW1lcG9pbnTxASBtdWx0aXNpZwAkY2FsbF9oYXNoIEBNdWx0aXNpZ0V4ZWN1dGVkAQAUJGFwcHJvdmluZwAkdGltZXBvaW508QEgbXVsdGlzaWcAJGNhbGxfaGFzaCAYcmVzdWx0lQtETXVsdGlzaWdDYW5jZWxsZWQBABAoY2FuY2VsbGluZwAkdGltZXBvaW508QEgbXVsdGlzaWcAJGNhbGxfaGFzaCAgUHJlaW1hZ2UBAgwUTm90ZWQBAAQQaGFzaCAkUmVxdWVzdGVkAQAEEGhhc2ggHENsZWFyZWQBAAQQaGFzaCAgQm91bnRpZXMBAiw4Qm91bnR5UHJvcG9zZWQBAAQUaW5kZXgEOEJvdW50eVJlamVjdGVkAQAIFGluZGV4BBBib25kCEhCb3VudHlCZWNhbWVBY3RpdmUBAAQUaW5kZXgENEJvdW50eUF3YXJkZWQBAAgUaW5kZXgELGJlbmVmaWNpYXJ5ADRCb3VudHlDbGFpbWVkAQAMFGluZGV4BBhwYXlvdXQILGJlbmVmaWNpYXJ5ADhCb3VudHlDYW5jZWxlZAEABBRpbmRleAQ4Qm91bnR5RXh0ZW5kZWQBAAQUaW5kZXgEOEJvdW50eUFwcHJvdmVkAQAEFGluZGV4BDxDdXJhdG9yUHJvcG9zZWQBAAgkYm91bnR5X2lkBBxjdXJhdG9yAERDdXJhdG9yVW5hc3NpZ25lZAEABCRib3VudHlfaWQEPEN1cmF0b3JBY2NlcHRlZAEACCRib3VudHlfaWQEHGN1cmF0b3IANENoaWxkQm91bnRpZXMBAhAUQWRkZWQBAAgUaW5kZXgELGNoaWxkX2luZGV4BBxBd2FyZGVkAQAMFGluZGV4BCxjaGlsZF9pbmRleAQsYmVuZWZpY2lhcnkAHENsYWltZWQBABAUaW5kZXgELGNoaWxkX2luZGV4BBhwYXlvdXQILGJlbmVmaWNpYXJ5ACBDYW5jZWxlZAEACBRpbmRleAQsY2hpbGRfaW5kZXgEaEVsZWN0aW9uUHJvdmlkZXJNdWx0aVBoYXNlAQIYOFNvbHV0aW9uU3RvcmVkAQAMHGNvbXB1dGUBAhhvcmlnaW4FAjBwcmV2X2VqZWN0ZWQUREVsZWN0aW9uRmluYWxpemVkAQAIHGNvbXB1dGUBAhRzY29yZQkCOEVsZWN0aW9uRmFpbGVkAQEFIFJld2FyZGVkAQAIHGFjY291bnQAFHZhbHVlCBxTbGFzaGVkAQAIHGFjY291bnQAFHZhbHVlCERQaGFzZVRyYW5zaXRpb25lZAEADBBmcm9tEQIIdG8RAhRyb3VuZAQMTmlzAQIcJEJpZFBsYWNlZAEADAx3aG8AGGFtb3VudAggZHVyYXRpb24EMEJpZFJldHJhY3RlZAEADAx3aG8AGGFtb3VudAggZHVyYXRpb24EKEJpZERyb3BwZWQBAAwMd2hvABhhbW91bnQIIGR1cmF0aW9uBBhJc3N1ZWQBABQUaW5kZXgEGGV4cGlyeQQMd2hvAChwcm9wb3J0aW9uCBhhbW91bnQIGFRoYXdlZAEAFBRpbmRleAQMd2hvAChwcm9wb3J0aW9uCBhhbW91bnQIHGRyb3BwZWQUGEZ1bmRlZAEABBxkZWZpY2l0CCxUcmFuc2ZlcnJlZAEADBBmcm9tAAh0bwAUaW5kZXgEWE5pc0NvdW50ZXJwYXJ0QmFsYW5jZXMBAlgcRW5kb3dlZAEACBxhY2NvdW50ADBmcmVlX2JhbGFuY2UIIER1c3RMb3N0AQAIHGFjY291bnQAGGFtb3VudAggVHJhbnNmZXIBAAwQZnJvbQAIdG8AGGFtb3VudAgoQmFsYW5jZVNldAEACAx3aG8AEGZyZWUIIFJlc2VydmVkAQAIDHdobwAYYW1vdW50CChVbnJlc2VydmVkAQAIDHdobwAYYW1vdW50CEhSZXNlcnZlUmVwYXRyaWF0ZWQBABAQZnJvbQAIdG8AGGFtb3VudAhIZGVzdGluYXRpb25fc3RhdHVzKQEcRGVwb3NpdAEACAx3aG8AGGFtb3VudAggV2l0aGRyYXcBAAgMd2hvABhhbW91bnQIHFNsYXNoZWQBAAgMd2hvABhhbW91bnQIGE1pbnRlZAEACAx3aG8AGGFtb3VudAgYQnVybmVkAQAIDHdobwAYYW1vdW50CCRTdXNwZW5kZWQBAAgMd2hvABhhbW91bnQIIFJlc3RvcmVkAQAIDHdobwAYYW1vdW50CCBVcGdyYWRlZAEABAx3aG8AGElzc3VlZAEABBhhbW91bnQIJFJlc2NpbmRlZAEABBhhbW91bnQIGExvY2tlZAEACAx3aG8AGGFtb3VudAggVW5sb2NrZWQBAAgMd2hvABhhbW91bnQIGEZyb3plbgEACAx3aG8AGGFtb3VudAgYVGhhd2VkAQAIDHdobwAYYW1vdW50CExUb3RhbElzc3VhbmNlRm9yY2VkAQAIDG9sZAgMbmV3CCRWb3Rlckxpc3QBAgggUmViYWdnZWQBAAwMd2hvABBmcm9tCAh0bwgwU2NvcmVVcGRhdGVkAQAIDHdobwAkbmV3X3Njb3JlCDxOb21pbmF0aW9uUG9vbHMBAkgcQ3JlYXRlZAEACCRkZXBvc2l0b3IAHHBvb2xfaWQEGEJvbmRlZAEAEBhtZW1iZXIAHHBvb2xfaWQEGGJvbmRlZAgYam9pbmVkFBxQYWlkT3V0AQAMGG1lbWJlcgAccG9vbF9pZAQYcGF5b3V0CCBVbmJvbmRlZAEAFBhtZW1iZXIAHHBvb2xfaWQEHGJhbGFuY2UIGHBvaW50cwgMZXJhBCRXaXRoZHJhd24BABAYbWVtYmVyABxwb29sX2lkBBxiYWxhbmNlCBhwb2ludHMIJERlc3Ryb3llZAEABBxwb29sX2lkBDBTdGF0ZUNoYW5nZWQBAAgccG9vbF9pZAQkbmV3X3N0YXRlHQI0TWVtYmVyUmVtb3ZlZAEACBxwb29sX2lkBBhtZW1iZXIAMFJvbGVzVXBkYXRlZAEADBByb290BQIcYm91bmNlcgUCJG5vbWluYXRvcgUCLFBvb2xTbGFzaGVkAQAIHHBvb2xfaWQEHGJhbGFuY2UIUFVuYm9uZGluZ1Bvb2xTbGFzaGVkAQAMHHBvb2xfaWQEDGVyYQQcYmFsYW5jZQhUUG9vbENvbW1pc3Npb25VcGRhdGVkAQAIHHBvb2xfaWQEHGN1cnJlbnQlAmBQb29sTWF4Q29tbWlzc2lvblVwZGF0ZWQBAAgccG9vbF9pZAQ4bWF4X2NvbW1pc3Npb24EfFBvb2xDb21taXNzaW9uQ2hhbmdlUmF0ZVVwZGF0ZWQBAAgccG9vbF9pZAQsY2hhbmdlX3JhdGUpApBQb29sQ29tbWlzc2lvbkNsYWltUGVybWlzc2lvblVwZGF0ZWQBAAgccG9vbF9pZAQocGVybWlzc2lvbjECVFBvb2xDb21taXNzaW9uQ2xhaW1lZAEACBxwb29sX2lkBChjb21taXNzaW9uCGRNaW5CYWxhbmNlRGVmaWNpdEFkanVzdGVkAQAIHHBvb2xfaWQEGGFtb3VudAhgTWluQmFsYW5jZUV4Y2Vzc0FkanVzdGVkAQAIHHBvb2xfaWQEGGFtb3VudAgsRmFzdFVuc3Rha2UBAhQgVW5zdGFrZWQBAAgUc3Rhc2gAGHJlc3VsdJULHFNsYXNoZWQBAAgUc3Rhc2gAGGFtb3VudAgwQmF0Y2hDaGVja2VkAQAEEGVyYXM5AjRCYXRjaEZpbmlzaGVkAQAEEHNpemUENEludGVybmFsRXJyb3IBAQU0UGFyYUluY2x1c2lvbgECEDxDYW5kaWRhdGVCYWNrZWQBAxBJAiQEBERDYW5kaWRhdGVJbmNsdWRlZAEDEEkCJAQERENhbmRpZGF0ZVRpbWVkT3V0AQMMSQIkBFhVcHdhcmRNZXNzYWdlc1JlY2VpdmVkAQAIEGZyb20EFGNvdW50BBRQYXJhcwECIEhDdXJyZW50Q29kZVVwZGF0ZWQBAQJIQ3VycmVudEhlYWRVcGRhdGVkAQECUENvZGVVcGdyYWRlU2NoZWR1bGVkAQECME5ld0hlYWROb3RlZAEBAjBBY3Rpb25RdWV1ZWQBBAQBCDxQdmZDaGVja1N0YXJ0ZWQBAwggBEBQdmZDaGVja0FjY2VwdGVkAQMIIARAUHZmQ2hlY2tSZWplY3RlZAEDCCAEEEhybXABAhxQT3BlbkNoYW5uZWxSZXF1ZXN0ZWQBABAYc2VuZGVyBCRyZWNpcGllbnQEVHByb3Bvc2VkX21heF9jYXBhY2l0eQRkcHJvcG9zZWRfbWF4X21lc3NhZ2Vfc2l6ZQRMT3BlbkNoYW5uZWxDYW5jZWxlZAEACDBieV9wYXJhY2hhaW4EKGNoYW5uZWxfaWRVAkxPcGVuQ2hhbm5lbEFjY2VwdGVkAQAIGHNlbmRlcgQkcmVjaXBpZW50BDRDaGFubmVsQ2xvc2VkAQAIMGJ5X3BhcmFjaGFpbgQoY2hhbm5lbF9pZFUCWEhybXBDaGFubmVsRm9yY2VPcGVuZWQBABAYc2VuZGVyBCRyZWNpcGllbnQEVHByb3Bvc2VkX21heF9jYXBhY2l0eQRkcHJvcG9zZWRfbWF4X21lc3NhZ2Vfc2l6ZQRcSHJtcFN5c3RlbUNoYW5uZWxPcGVuZWQBABAYc2VuZGVyBCRyZWNpcGllbnQEVHByb3Bvc2VkX21heF9jYXBhY2l0eQRkcHJvcG9zZWRfbWF4X21lc3NhZ2Vfc2l6ZQRoT3BlbkNoYW5uZWxEZXBvc2l0c1VwZGF0ZWQBAAgYc2VuZGVyBCRyZWNpcGllbnQENFBhcmFzRGlzcHV0ZXMBAgxARGlzcHV0ZUluaXRpYXRlZAEDCCBdAkBEaXNwdXRlQ29uY2x1ZGVkAQMIIGECGFJldmVydAEBAmhPbkRlbWFuZEFzc2lnbm1lbnRQcm92aWRlcgECCExPbkRlbWFuZE9yZGVyUGxhY2VkAQAMHHBhcmFfaWQEKHNwb3RfcHJpY2UIKG9yZGVyZWRfYnkAMFNwb3RQcmljZVNldAEABChzcG90X3ByaWNlCCRSZWdpc3RyYXIBAhAoUmVnaXN0ZXJlZAEACBxwYXJhX2lkBBxtYW5hZ2VyADBEZXJlZ2lzdGVyZWQBAAQccGFyYV9pZAQgUmVzZXJ2ZWQBAAgccGFyYV9pZAQMd2hvABxTd2FwcGVkAQAIHHBhcmFfaWQEIG90aGVyX2lkBBRTbG90cwECCDhOZXdMZWFzZVBlcmlvZAEABDBsZWFzZV9wZXJpb2QEGExlYXNlZAEAGBxwYXJhX2lkBBhsZWFzZXIAMHBlcmlvZF9iZWdpbgQwcGVyaW9kX2NvdW50BDhleHRyYV9yZXNlcnZlZAgwdG90YWxfYW1vdW50CCBBdWN0aW9ucwECHDhBdWN0aW9uU3RhcnRlZAEADDRhdWN0aW9uX2luZGV4BDBsZWFzZV9wZXJpb2QEGGVuZGluZwQ0QXVjdGlvbkNsb3NlZAEABDRhdWN0aW9uX2luZGV4BCBSZXNlcnZlZAEADBhiaWRkZXIAOGV4dHJhX3Jlc2VydmVkCDB0b3RhbF9hbW91bnQIKFVucmVzZXJ2ZWQBAAgYYmlkZGVyABhhbW91bnQISFJlc2VydmVDb25maXNjYXRlZAEADBxwYXJhX2lkBBhsZWFzZXIAGGFtb3VudAgsQmlkQWNjZXB0ZWQBABQYYmlkZGVyABxwYXJhX2lkBBhhbW91bnQIKGZpcnN0X3Nsb3QEJGxhc3Rfc2xvdAQ0V2lubmluZ09mZnNldAEACDRhdWN0aW9uX2luZGV4BDBibG9ja19udW1iZXIEJENyb3dkbG9hbgECKBxDcmVhdGVkAQAEHHBhcmFfaWQELENvbnRyaWJ1dGVkAQAMDHdobwAoZnVuZF9pbmRleAQYYW1vdW50CCBXaXRoZHJldwEADAx3aG8AKGZ1bmRfaW5kZXgEGGFtb3VudAhEUGFydGlhbGx5UmVmdW5kZWQBAAQccGFyYV9pZAQsQWxsUmVmdW5kZWQBAAQccGFyYV9pZAQkRGlzc29sdmVkAQAEHHBhcmFfaWQEPEhhbmRsZUJpZFJlc3VsdAEACBxwYXJhX2lkBBhyZXN1bHSVCxhFZGl0ZWQBAAQccGFyYV9pZAQsTWVtb1VwZGF0ZWQBAAwMd2hvABxwYXJhX2lkBBBtZW1vJDxBZGRlZFRvTmV3UmFpc2UBAAQccGFyYV9pZAQgQ29yZXRpbWUBAghQUmV2ZW51ZUluZm9SZXF1ZXN0ZWQBAAQQd2hlbgQwQ29yZUFzc2lnbmVkAQAEEGNvcmUEJFhjbVBhbGxldAECYCRBdHRlbXB0ZWQBAAQcb3V0Y29tZY0CEFNlbnQBABAYb3JpZ2lueQEsZGVzdGluYXRpb255ARxtZXNzYWdl+QIobWVzc2FnZV9pZCBIVW5leHBlY3RlZFJlc3BvbnNlAQAIGG9yaWdpbnkBIHF1ZXJ5X2lkCDRSZXNwb25zZVJlYWR5AQAIIHF1ZXJ5X2lkCCByZXNwb25zZbkCIE5vdGlmaWVkAQAMIHF1ZXJ5X2lkCDBwYWxsZXRfaW5kZXgEKGNhbGxfaW5kZXgEQE5vdGlmeU92ZXJ3ZWlnaHQBABQgcXVlcnlfaWQIMHBhbGxldF9pbmRleAQoY2FsbF9pbmRleAQ0YWN0dWFsX3dlaWdodBhMbWF4X2J1ZGdldGVkX3dlaWdodBhMTm90aWZ5RGlzcGF0Y2hFcnJvcgEADCBxdWVyeV9pZAgwcGFsbGV0X2luZGV4BChjYWxsX2luZGV4BEhOb3RpZnlEZWNvZGVGYWlsZWQBAAwgcXVlcnlfaWQIMHBhbGxldF9pbmRleAQoY2FsbF9pbmRleARASW52YWxpZFJlc3BvbmRlcgEADBhvcmlnaW55ASBxdWVyeV9pZAhEZXhwZWN0ZWRfbG9jYXRpb269AlxJbnZhbGlkUmVzcG9uZGVyVmVyc2lvbgEACBhvcmlnaW55ASBxdWVyeV9pZAg0UmVzcG9uc2VUYWtlbgEABCBxdWVyeV9pZAg0QXNzZXRzVHJhcHBlZAEADBBoYXNoIBhvcmlnaW55ARhhc3NldHMZA1RWZXJzaW9uQ2hhbmdlTm90aWZpZWQBABAsZGVzdGluYXRpb255ARhyZXN1bHQEEGNvc3ShAihtZXNzYWdlX2lkIFxTdXBwb3J0ZWRWZXJzaW9uQ2hhbmdlZAEACCBsb2NhdGlvbnkBHHZlcnNpb24EUE5vdGlmeVRhcmdldFNlbmRGYWlsAQAMIGxvY2F0aW9ueQEgcXVlcnlfaWQIFGVycm9yiQJkTm90aWZ5VGFyZ2V0TWlncmF0aW9uRmFpbAEACCBsb2NhdGlvbpkBIHF1ZXJ5X2lkCFRJbnZhbGlkUXVlcmllclZlcnNpb24BAAgYb3JpZ2lueQEgcXVlcnlfaWQIOEludmFsaWRRdWVyaWVyAQAQGG9yaWdpbnkBIHF1ZXJ5X2lkCEBleHBlY3RlZF9xdWVyaWVyeQFQbWF5YmVfYWN0dWFsX3F1ZXJpZXK9AlBWZXJzaW9uTm90aWZ5U3RhcnRlZAEADCxkZXN0aW5hdGlvbnkBEGNvc3ShAihtZXNzYWdlX2lkIFhWZXJzaW9uTm90aWZ5UmVxdWVzdGVkAQAMLGRlc3RpbmF0aW9ueQEQY29zdKECKG1lc3NhZ2VfaWQgYFZlcnNpb25Ob3RpZnlVbnJlcXVlc3RlZAEADCxkZXN0aW5hdGlvbnkBEGNvc3ShAihtZXNzYWdlX2lkICBGZWVzUGFpZAEACBhwYXlpbmd5ARBmZWVzoQI0QXNzZXRzQ2xhaW1lZAEADBBoYXNoIBhvcmlnaW55ARhhc3NldHMZA2BWZXJzaW9uTWlncmF0aW9uRmluaXNoZWQBAAQcdmVyc2lvbgQwTWVzc2FnZVF1ZXVlAQIQQFByb2Nlc3NpbmdGYWlsZWQBAAwIaWQgGG9yaWdpbiUDFGVycm9yKQMkUHJvY2Vzc2VkAQAQCGlkIBhvcmlnaW4lAyx3ZWlnaHRfdXNlZBgcc3VjY2VzcxRIT3ZlcndlaWdodEVucXVldWVkAQAQCGlkIBhvcmlnaW4lAyhwYWdlX2luZGV4BDRtZXNzYWdlX2luZGV4BChQYWdlUmVhcGVkAQAIGG9yaWdpbiUDFGluZGV4BCRBc3NldFJhdGUBAgxAQXNzZXRSYXRlQ3JlYXRlZAEACChhc3NldF9raW5kgQEQcmF0ZQhAQXNzZXRSYXRlUmVtb3ZlZAEABChhc3NldF9raW5kgQFAQXNzZXRSYXRlVXBkYXRlZAEADChhc3NldF9raW5kgQEMb2xkCAxuZXcIAAwUcGhhc2U0FGV2ZW50xQsYdG9waWNzOQMEyQsAAgQoTmZ0UmVjZWlwdAEBBQIIIFByZWltYWdlAQIEIFByZWltYWdlAQEFDE5pcwECBChOZnRSZWNlaXB0AQEFAAgIaWTVCxhhbW91bnQIBNkLAAJwMFN0YWtpbmdBZG1pbgEBBSRUcmVhc3VyZXIBAQU8RmVsbG93c2hpcEFkbWluAQEFMEdlbmVyYWxBZG1pbgEBBTBBdWN0aW9uQWRtaW4BAQUoTGVhc2VBZG1pbgEBBUxSZWZlcmVuZHVtQ2FuY2VsbGVyAQEFQFJlZmVyZW5kdW1LaWxsZXIBAQUsU21hbGxUaXBwZXIBAQUkQmlnVGlwcGVyAQEFMFNtYWxsU3BlbmRlcgEBBTRNZWRpdW1TcGVuZGVyAQEFKEJpZ1NwZW5kZXIBAQVEV2hpdGVsaXN0ZWRDYWxsZXIBAQVMRmVsbG93c2hpcEluaXRpYXRlcwEBBRxGZWxsb3dzAQEFREZlbGxvd3NoaXBFeHBlcnRzAQEFREZlbGxvd3NoaXBNYXN0ZXJzAQEFOEZlbGxvd3NoaXAxRGFuAQEFOEZlbGxvd3NoaXAyRGFuAQEFOEZlbGxvd3NoaXAzRGFuAQEFOEZlbGxvd3NoaXA0RGFuAQEFOEZlbGxvd3NoaXA1RGFuAQEFOEZlbGxvd3NoaXA2RGFuAQEFOEZlbGxvd3NoaXA3RGFuAQEFOEZlbGxvd3NoaXA4RGFuAQEFOEZlbGxvd3NoaXA5RGFuAQEFNFdpc2hGb3JDaGFuZ2UBAQUCFBhzeXN0ZW0BAgwQUm9vdAEBBRhTaWduZWQBAQEQTm9uZQEBBRxPcmlnaW5zAQJwMFN0YWtpbmdBZG1pbgEBBSRUcmVhc3VyZXIBAQU8RmVsbG93c2hpcEFkbWluAQEFMEdlbmVyYWxBZG1pbgEBBTBBdWN0aW9uQWRtaW4BAQUoTGVhc2VBZG1pbgEBBUxSZWZlcmVuZHVtQ2FuY2VsbGVyAQEFQFJlZmVyZW5kdW1LaWxsZXIBAQUsU21hbGxUaXBwZXIBAQUkQmlnVGlwcGVyAQEFMFNtYWxsU3BlbmRlcgEBBTRNZWRpdW1TcGVuZGVyAQEFKEJpZ1NwZW5kZXIBAQVEV2hpdGVsaXN0ZWRDYWxsZXIBAQVMRmVsbG93c2hpcEluaXRpYXRlcwEBBRxGZWxsb3dzAQEFREZlbGxvd3NoaXBFeHBlcnRzAQEFREZlbGxvd3NoaXBNYXN0ZXJzAQEFOEZlbGxvd3NoaXAxRGFuAQEFOEZlbGxvd3NoaXAyRGFuAQEFOEZlbGxvd3NoaXAzRGFuAQEFOEZlbGxvd3NoaXA0RGFuAQEFOEZlbGxvd3NoaXA1RGFuAQEFOEZlbGxvd3NoaXA2RGFuAQEFOEZlbGxvd3NoaXA3RGFuAQEFOEZlbGxvd3NoaXA4RGFuAQEFOEZlbGxvd3NoaXA5RGFuAQEFNFdpc2hGb3JDaGFuZ2UBAQVAUGFyYWNoYWluc09yaWdpbgECBCRQYXJhY2hhaW4BAQIkWGNtUGFsbGV0AQIIDFhjbQEACBxwYXJlbnRzBCBpbnRlcmlvcnUBIFJlc3BvbnNlAQAIHHBhcmVudHMEIGludGVyaW9ydQEQVm9pZAEBBQAsFHRyYWNrBBhvcmlnaW7lCyBwcm9wb3NhbKUBJGVuYWN0bWVudEEEJHN1Ym1pdHRlZARIc3VibWlzc2lvbl9kZXBvc2l03QdAZGVjaXNpb25fZGVwb3NpdOEHIGRlY2lkaW5n6QcUdGFsbHmpASBpbl9xdWV1ZRQUYWxhcm3xBwIYHE9uZ29pbmcBACwUdHJhY2sEGG9yaWdpbuULIHByb3Bvc2FspQEkZW5hY3RtZW50QQQkc3VibWl0dGVkBEhzdWJtaXNzaW9uX2RlcG9zaXTdB0BkZWNpc2lvbl9kZXBvc2l04QcgZGVjaWRpbmfpBxR0YWxseakBIGluX3F1ZXVlFBRhbGFybfEHIEFwcHJvdmVkAQMMBOEH4QcgUmVqZWN0ZWQBAwwE4QfhByRDYW5jZWxsZWQBAwwE4QfhByBUaW1lZE91dAEDDAThB+EHGEtpbGxlZAEBAgAsFHRyYWNrBBhvcmlnaW7lCyBwcm9wb3NhbKUBJGVuYWN0bWVudEEEJHN1Ym1pdHRlZARIc3VibWlzc2lvbl9kZXBvc2l03QdAZGVjaXNpb25fZGVwb3NpdOEHIGRlY2lkaW5n6QcUdGFsbHl9CyBpbl9xdWV1ZRQUYWxhcm3xBwIYHE9uZ29pbmcBACwUdHJhY2sEGG9yaWdpbuULIHByb3Bvc2FspQEkZW5hY3RtZW50QQQkc3VibWl0dGVkBEhzdWJtaXNzaW9uX2RlcG9zaXTdB0BkZWNpc2lvbl9kZXBvc2l04QcgZGVjaWRpbmfpBxR0YWxseX0LIGluX3F1ZXVlFBRhbGFybfEHIEFwcHJvdmVkAQMMBOEH4QcgUmVqZWN0ZWQBAwwE4QfhByRDYW5jZWxsZWQBAwwE4QfhByBUaW1lZE91dAEDDAThB+EHGEtpbGxlZAEBAgIkGHN1Ym1pdAEADDxwcm9wb3NhbF9vcmlnaW7lCyBwcm9wb3NhbKUBQGVuYWN0bWVudF9tb21lbnRBBFhwbGFjZV9kZWNpc2lvbl9kZXBvc2l0AQAEFGluZGV4BFxyZWZ1bmRfZGVjaXNpb25fZGVwb3NpdAEABBRpbmRleAQYY2FuY2VsAQAEFGluZGV4BBBraWxsAQAEFGluZGV4BEBudWRnZV9yZWZlcmVuZHVtAQAEFGluZGV4BEhvbmVfZmV3ZXJfZGVjaWRpbmcBAAQUdHJhY2sEZHJlZnVuZF9zdWJtaXNzaW9uX2RlcG9zaXQBAAQUaW5kZXgEMHNldF9tZXRhZGF0YQEACBRpbmRleAQobWF5YmVfaGFzaBEBAhwoYWRkX21lbWJlcgEABAx3aG/VAzhwcm9tb3RlX21lbWJlcgEABAx3aG/VAzRkZW1vdGVfbWVtYmVyAQAEDHdob9UDNHJlbW92ZV9tZW1iZXIBAAgMd2hv1QMgbWluX3JhbmsEEHZvdGUBAAgQcG9sbAQMYXllFDBjbGVhbnVwX3BvbGwBAAgocG9sbF9pbmRleAQMbWF4BDxleGNoYW5nZV9tZW1iZXIBAAgMd2hv1QMcbmV3X3dob9UDAhA4d2hpdGVsaXN0X2NhbGwBAAQkY2FsbF9oYXNoIFxyZW1vdmVfd2hpdGVsaXN0ZWRfY2FsbAEABCRjYWxsX2hhc2ggZGRpc3BhdGNoX3doaXRlbGlzdGVkX2NhbGwBAAwkY2FsbF9oYXNoIEBjYWxsX2VuY29kZWRfbGVuBExjYWxsX3dlaWdodF93aXRuZXNzGJxkaXNwYXRjaF93aGl0ZWxpc3RlZF9jYWxsX3dpdGhfcHJlaW1hZ2UBAAQQY2FsbJUMBJUMAAIYFGJhdGNoAQAEFGNhbGxzBQw0YXNfZGVyaXZhdGl2ZQEACBRpbmRleAQQY2FsbJUMJGJhdGNoX2FsbAEABBRjYWxscwUMLGRpc3BhdGNoX2FzAQAIJGFzX29yaWdpbuULEGNhbGyVDCxmb3JjZV9iYXRjaAEABBRjYWxscwUMLHdpdGhfd2VpZ2h0AQAIEGNhbGyVDBh3ZWlnaHQYAlAMYmlkAQAEFHZhbHVlCBR1bmJpZAEBBRR2b3VjaAEADAx3aG/VAxR2YWx1ZQgMdGlwCBx1bnZvdWNoAQEFEHZvdGUBAAgkY2FuZGlkYXRl1QMcYXBwcm92ZRQ0ZGVmZW5kZXJfdm90ZQEABBxhcHByb3ZlFBhwYXlvdXQBAQUsd2FpdmVfcmVwYXkBAAQYYW1vdW50CDRmb3VuZF9zb2NpZXR5AQAYHGZvdW5kZXLVAyxtYXhfbWVtYmVycwQobWF4X2ludGFrZQQsbWF4X3N0cmlrZXMERGNhbmRpZGF0ZV9kZXBvc2l0CBRydWxlcyQgZGlzc29sdmUBAQVYanVkZ2Vfc3VzcGVuZGVkX21lbWJlcgEACAx3aG/VAxxmb3JnaXZlFDhzZXRfcGFyYW1ldGVycwEAECxtYXhfbWVtYmVycwQobWF4X2ludGFrZQQsbWF4X3N0cmlrZXMERGNhbmRpZGF0ZV9kZXBvc2l0CDhwdW5pc2hfc2tlcHRpYwEBBUBjbGFpbV9tZW1iZXJzaGlwAQEFRGJlc3Rvd19tZW1iZXJzaGlwAQAEJGNhbmRpZGF0ZQA4a2lja19jYW5kaWRhdGUBAAQkY2FuZGlkYXRlAEByZXNpZ25fY2FuZGlkYWN5AQEFOGRyb3BfY2FuZGlkYXRlAQAEJGNhbmRpZGF0ZQBEY2xlYW51cF9jYW5kaWRhY3kBAAgkY2FuZGlkYXRlAAxtYXgERGNsZWFudXBfY2hhbGxlbmdlAQAIPGNoYWxsZW5nZV9yb3VuZAQMbWF4BAIkMGFzX3JlY292ZXJlZAEACBxhY2NvdW501QMQY2FsbJUMNHNldF9yZWNvdmVyZWQBAAgQbG9zdNUDHHJlc2N1ZXLVAzxjcmVhdGVfcmVjb3ZlcnkBAAwcZnJpZW5kc90DJHRocmVzaG9sZAQwZGVsYXlfcGVyaW9kBERpbml0aWF0ZV9yZWNvdmVyeQEABBxhY2NvdW501QM4dm91Y2hfcmVjb3ZlcnkBAAgQbG9zdNUDHHJlc2N1ZXLVAzhjbGFpbV9yZWNvdmVyeQEABBxhY2NvdW501QM4Y2xvc2VfcmVjb3ZlcnkBAAQccmVzY3VlctUDPHJlbW92ZV9yZWNvdmVyeQEBBUBjYW5jZWxfcmVjb3ZlcmVkAQAEHGFjY291bnTVAwIoIHNjaGVkdWxlAQAQEHdoZW4EOG1heWJlX3BlcmlvZGljgQMgcHJpb3JpdHkEEGNhbGyVDBhjYW5jZWwBAAgQd2hlbgQUaW5kZXgEOHNjaGVkdWxlX25hbWVkAQAUCGlkIBB3aGVuBDhtYXliZV9wZXJpb2RpY4EDIHByaW9yaXR5BBBjYWxslQwwY2FuY2VsX25hbWVkAQAECGlkIDhzY2hlZHVsZV9hZnRlcgEAEBRhZnRlcgQ4bWF5YmVfcGVyaW9kaWOBAyBwcmlvcml0eQQQY2FsbJUMUHNjaGVkdWxlX25hbWVkX2FmdGVyAQAUCGlkIBRhZnRlcgQ4bWF5YmVfcGVyaW9kaWOBAyBwcmlvcml0eQQQY2FsbJUMJHNldF9yZXRyeQEADBB0YXNrDQEccmV0cmllcwQYcGVyaW9kBDxzZXRfcmV0cnlfbmFtZWQBAAwIaWQgHHJldHJpZXMEGHBlcmlvZAQwY2FuY2VsX3JldHJ5AQAEEHRhc2sNAUhjYW5jZWxfcmV0cnlfbmFtZWQBAAQIaWQgBq0LAigUcHJveHkBAAwQcmVhbNUDQGZvcmNlX3Byb3h5X3R5cGUZDBBjYWxslQwkYWRkX3Byb3h5AQAMIGRlbGVnYXRl1QMocHJveHlfdHlwZa0LFGRlbGF5BDByZW1vdmVfcHJveHkBAAwgZGVsZWdhdGXVAyhwcm94eV90eXBlrQsUZGVsYXkEOHJlbW92ZV9wcm94aWVzAQEFLGNyZWF0ZV9wdXJlAQAMKHByb3h5X3R5cGWtCxRkZWxheQQUaW5kZXgEJGtpbGxfcHVyZQEAFBxzcGF3bmVy1QMocHJveHlfdHlwZa0LFGluZGV4BBhoZWlnaHQEJGV4dF9pbmRleAQgYW5ub3VuY2UBAAgQcmVhbNUDJGNhbGxfaGFzaCBMcmVtb3ZlX2Fubm91bmNlbWVudAEACBByZWFs1QMkY2FsbF9oYXNoIExyZWplY3RfYW5ub3VuY2VtZW50AQAIIGRlbGVnYXRl1QMkY2FsbF9oYXNoIDxwcm94eV9hbm5vdW5jZWQBABAgZGVsZWdhdGXVAxByZWFs1QNAZm9yY2VfcHJveHlfdHlwZRkMEGNhbGyVDAIQUGFzX211bHRpX3RocmVzaG9sZF8xAQAIRG90aGVyX3NpZ25hdG9yaWVz3QMQY2FsbJUMIGFzX211bHRpAQAUJHRocmVzaG9sZAREb3RoZXJfc2lnbmF0b3JpZXPdAzxtYXliZV90aW1lcG9pbnSNBBBjYWxslQwobWF4X3dlaWdodBhAYXBwcm92ZV9hc19tdWx0aQEAFCR0aHJlc2hvbGQERG90aGVyX3NpZ25hdG9yaWVz3QM8bWF5YmVfdGltZXBvaW50jQQkY2FsbF9oYXNoIChtYXhfd2VpZ2h0GDxjYW5jZWxfYXNfbXVsdGkBABAkdGhyZXNob2xkBERvdGhlcl9zaWduYXRvcmllc90DJHRpbWVwb2ludPEBJGNhbGxfaGFzaCAEnQQBQAMMBCUMBAQpDAAEnQQBRAMMBDEMBAQ1DAAEnQQBSAMMBD0MBARBDAAEnQQBTAMMBEkMBARNDAAEnQQBUAMMBFUMBARZDAAEnQQBVAMMBGEMBARlDAAEnQQBWAMMBG0MBARxDAAEnQQBXAMMBHkMBAR9DAAAYBh2b3RlczGhBBh2b3RlczKpBBh2b3RlczO1BBh2b3RlczTBBBh2b3RlczXNBBh2b3RlczbZBBh2b3RlczflBBh2b3RlczjxBBh2b3Rlczn9BBx2b3RlczEwCQUcdm90ZXMxMRUFHHZvdGVzMTIhBRx2b3RlczEzLQUcdm90ZXMxNDkFHHZvdGVzMTVFBRx2b3RlczE2UQUcdm90ZXMxNy0MHHZvdGVzMTg5DBx2b3RlczE5RQwcdm90ZXMyMFEMHHZvdGVzMjFdDBx2b3RlczIyaQwcdm90ZXMyM3UMHHZvdGVzMjSBDAAMIHNvbHV0aW9uhQwUc2NvcmUJAhRyb3VuZAQCFDxzdWJtaXRfdW5zaWduZWQBAAgwcmF3X3NvbHV0aW9uiQwcd2l0bmVzc10FbHNldF9taW5pbXVtX3VudHJ1c3RlZF9zY29yZQEABEBtYXliZV9uZXh0X3Njb3JlYQV0c2V0X2VtZXJnZW5jeV9lbGVjdGlvbl9yZXN1bHQBAAQgc3VwcG9ydHN1BRhzdWJtaXQBAAQwcmF3X3NvbHV0aW9uiQxMZ292ZXJuYW5jZV9mYWxsYmFjawEACEBtYXliZV9tYXhfdm90ZXJzLQREbWF5YmVfbWF4X3RhcmdldHMtBAIcJHBsYWNlX2JpZAEACBhhbW91bnQIIGR1cmF0aW9uBCxyZXRyYWN0X2JpZAEACBhhbW91bnQIIGR1cmF0aW9uBDBmdW5kX2RlZmljaXQBAQUwdGhhd19wcml2YXRlAQAIFGluZGV4BEBtYXliZV9wcm9wb3J0aW9u9QM0dGhhd19jb21tdW5hbAEABBRpbmRleAQkY29tbXVuaWZ5AQAEFGluZGV4BCRwcml2YXRpemUBAAQUaW5kZXgEAswYU3lzdGVtAQIsGHJlbWFyawEABBhyZW1hcmskOHNldF9oZWFwX3BhZ2VzAQAEFHBhZ2VzCCBzZXRfY29kZQEABBBjb2RlJFxzZXRfY29kZV93aXRob3V0X2NoZWNrcwEABBBjb2RlJCxzZXRfc3RvcmFnZQEABBRpdGVtc3kDMGtpbGxfc3RvcmFnZQEABBBrZXlzfQMsa2lsbF9wcmVmaXgBAAgYcHJlZml4JBxzdWJrZXlzBERyZW1hcmtfd2l0aF9ldmVudAEABBhyZW1hcmskRGF1dGhvcml6ZV91cGdyYWRlAQAEJGNvZGVfaGFzaCCAYXV0aG9yaXplX3VwZ3JhZGVfd2l0aG91dF9jaGVja3MBAAQkY29kZV9oYXNoIGBhcHBseV9hdXRob3JpemVkX3VwZ3JhZGUBAAQQY29kZSQQQmFiZQECDExyZXBvcnRfZXF1aXZvY2F0aW9uAQAISGVxdWl2b2NhdGlvbl9wcm9vZrkDPGtleV9vd25lcl9wcm9vZr0DcHJlcG9ydF9lcXVpdm9jYXRpb25fdW5zaWduZWQBAAhIZXF1aXZvY2F0aW9uX3Byb29muQM8a2V5X293bmVyX3Byb29mvQNIcGxhbl9jb25maWdfY2hhbmdlAQAEGGNvbmZpZ8kDJFRpbWVzdGFtcAECBAxzZXQBAAQMbm93CBxJbmRpY2VzAQIUFGNsYWltAQAEFGluZGV4BCB0cmFuc2ZlcgEACAxuZXfVAxRpbmRleAQQZnJlZQEABBRpbmRleAQ4Zm9yY2VfdHJhbnNmZXIBAAwMbmV31QMUaW5kZXgEGGZyZWV6ZRQYZnJlZXplAQAEFGluZGV4BCBCYWxhbmNlcwECJFB0cmFuc2Zlcl9hbGxvd19kZWF0aAEACBBkZXN01QMUdmFsdWUIOGZvcmNlX3RyYW5zZmVyAQAMGHNvdXJjZdUDEGRlc3TVAxR2YWx1ZQhMdHJhbnNmZXJfa2VlcF9hbGl2ZQEACBBkZXN01QMUdmFsdWUIMHRyYW5zZmVyX2FsbAEACBBkZXN01QMoa2VlcF9hbGl2ZRQ8Zm9yY2VfdW5yZXNlcnZlAQAIDHdob9UDGGFtb3VudAhAdXBncmFkZV9hY2NvdW50cwEABAx3aG/dA0Rmb3JjZV9zZXRfYmFsYW5jZQEACAx3aG/VAyBuZXdfZnJlZQhsZm9yY2VfYWRqdXN0X3RvdGFsX2lzc3VhbmNlAQAIJGRpcmVjdGlvbuEDFGRlbHRhCBBidXJuAQAIFHZhbHVlCChrZWVwX2FsaXZlFBxTdGFraW5nAQJ4EGJvbmQBAAgUdmFsdWUIFHBheWVlNQEoYm9uZF9leHRyYQEABDhtYXhfYWRkaXRpb25hbAgYdW5ib25kAQAEFHZhbHVlCER3aXRoZHJhd191bmJvbmRlZAEABEhudW1fc2xhc2hpbmdfc3BhbnMEIHZhbGlkYXRlAQAEFHByZWZzOQEgbm9taW5hdGUBAAQcdGFyZ2V0c+kDFGNoaWxsAQEFJHNldF9wYXllZQEABBRwYXllZTUBOHNldF9jb250cm9sbGVyAQEFTHNldF92YWxpZGF0b3JfY291bnQBAAQMbmV3BGBpbmNyZWFzZV92YWxpZGF0b3JfY291bnQBAAQoYWRkaXRpb25hbARUc2NhbGVfdmFsaWRhdG9yX2NvdW50AQAEGGZhY3RvcgQ0Zm9yY2Vfbm9fZXJhcwEBBTRmb3JjZV9uZXdfZXJhAQEFRHNldF9pbnZ1bG5lcmFibGVzAQAENGludnVsbmVyYWJsZXPdAzRmb3JjZV91bnN0YWtlAQAIFHN0YXNoAEhudW1fc2xhc2hpbmdfc3BhbnMEUGZvcmNlX25ld19lcmFfYWx3YXlzAQEFVGNhbmNlbF9kZWZlcnJlZF9zbGFzaAEACAxlcmEENHNsYXNoX2luZGljZXM5AjhwYXlvdXRfc3Rha2VycwEACDx2YWxpZGF0b3Jfc3Rhc2gADGVyYQQYcmVib25kAQAEFHZhbHVlCChyZWFwX3N0YXNoAQAIFHN0YXNoAEhudW1fc2xhc2hpbmdfc3BhbnMEEGtpY2sBAAQMd2hv6QNMc2V0X3N0YWtpbmdfY29uZmlncwEAHEhtaW5fbm9taW5hdG9yX2JvbmTtA0htaW5fdmFsaWRhdG9yX2JvbmTtA0xtYXhfbm9taW5hdG9yX2NvdW508QNMbWF4X3ZhbGlkYXRvcl9jb3VudPEDPGNoaWxsX3RocmVzaG9sZPEDOG1pbl9jb21taXNzaW9u8QNIbWF4X3N0YWtlZF9yZXdhcmRz8QMsY2hpbGxfb3RoZXIBAAQUc3Rhc2gAaGZvcmNlX2FwcGx5X21pbl9jb21taXNzaW9uAQAEPHZhbGlkYXRvcl9zdGFzaABIc2V0X21pbl9jb21taXNzaW9uAQAEDG5ldwRYcGF5b3V0X3N0YWtlcnNfYnlfcGFnZQEADDx2YWxpZGF0b3Jfc3Rhc2gADGVyYQQQcGFnZQQwdXBkYXRlX3BheWVlAQAEKGNvbnRyb2xsZXIAaGRlcHJlY2F0ZV9jb250cm9sbGVyX2JhdGNoAQAELGNvbnRyb2xsZXJz3QM4cmVzdG9yZV9sZWRnZXIBABAUc3Rhc2gAQG1heWJlX2NvbnRyb2xsZXIFAixtYXliZV90b3RhbPUDPG1heWJlX3VubG9ja2luZwEEHFNlc3Npb24BAgggc2V0X2tleXMBAAgQa2V5cw0EFHByb29mJChwdXJnZV9rZXlzAQEFHEdyYW5kcGEBAgxMcmVwb3J0X2VxdWl2b2NhdGlvbgEACEhlcXVpdm9jYXRpb25fcHJvb2YlBDxrZXlfb3duZXJfcHJvb2a9A3ByZXBvcnRfZXF1aXZvY2F0aW9uX3Vuc2lnbmVkAQAISGVxdWl2b2NhdGlvbl9wcm9vZiUEPGtleV9vd25lcl9wcm9vZr0DMG5vdGVfc3RhbGxlZAEACBRkZWxheQRsYmVzdF9maW5hbGl6ZWRfYmxvY2tfbnVtYmVyBCBUcmVhc3VyeQECGCxzcGVuZF9sb2NhbAEACBhhbW91bnQILGJlbmVmaWNpYXJ51QM8cmVtb3ZlX2FwcHJvdmFsAQAELHByb3Bvc2FsX2lkBBRzcGVuZAEAEChhc3NldF9raW5kgQEYYW1vdW50CCxiZW5lZmljaWFyeZkBKHZhbGlkX2Zyb20tBBhwYXlvdXQBAAQUaW5kZXgEMGNoZWNrX3N0YXR1cwEABBRpbmRleAQodm9pZF9zcGVuZAEABBRpbmRleARAQ29udmljdGlvblZvdGluZwECGBB2b3RlAQAIKHBvbGxfaW5kZXgEEHZvdGU1BCBkZWxlZ2F0ZQEAEBRjbGFzcwQIdG/VAyhjb252aWN0aW9uOQQcYmFsYW5jZQgodW5kZWxlZ2F0ZQEABBRjbGFzcwQYdW5sb2NrAQAIFGNsYXNzBBh0YXJnZXTVAyxyZW1vdmVfdm90ZQEACBRjbGFzcy0EFGluZGV4BERyZW1vdmVfb3RoZXJfdm90ZQEADBh0YXJnZXTVAxRjbGFzcwQUaW5kZXgEJFJlZmVyZW5kYQECJBhzdWJtaXQBAAw8cHJvcG9zYWxfb3JpZ2lu5QsgcHJvcG9zYWylAUBlbmFjdG1lbnRfbW9tZW50QQRYcGxhY2VfZGVjaXNpb25fZGVwb3NpdAEABBRpbmRleARccmVmdW5kX2RlY2lzaW9uX2RlcG9zaXQBAAQUaW5kZXgEGGNhbmNlbAEABBRpbmRleAQQa2lsbAEABBRpbmRleARAbnVkZ2VfcmVmZXJlbmR1bQEABBRpbmRleARIb25lX2Zld2VyX2RlY2lkaW5nAQAEFHRyYWNrBGRyZWZ1bmRfc3VibWlzc2lvbl9kZXBvc2l0AQAEFGluZGV4BDBzZXRfbWV0YWRhdGEBAAgUaW5kZXgEKG1heWJlX2hhc2gRAVBGZWxsb3dzaGlwQ29sbGVjdGl2ZQECHChhZGRfbWVtYmVyAQAEDHdob9UDOHByb21vdGVfbWVtYmVyAQAEDHdob9UDNGRlbW90ZV9tZW1iZXIBAAQMd2hv1QM0cmVtb3ZlX21lbWJlcgEACAx3aG/VAyBtaW5fcmFuawQQdm90ZQEACBBwb2xsBAxheWUUMGNsZWFudXBfcG9sbAEACChwb2xsX2luZGV4BAxtYXgEPGV4Y2hhbmdlX21lbWJlcgEACAx3aG/VAxxuZXdfd2hv1QNMRmVsbG93c2hpcFJlZmVyZW5kYQECJBhzdWJtaXQBAAw8cHJvcG9zYWxfb3JpZ2lu5QsgcHJvcG9zYWylAUBlbmFjdG1lbnRfbW9tZW50QQRYcGxhY2VfZGVjaXNpb25fZGVwb3NpdAEABBRpbmRleARccmVmdW5kX2RlY2lzaW9uX2RlcG9zaXQBAAQUaW5kZXgEGGNhbmNlbAEABBRpbmRleAQQa2lsbAEABBRpbmRleARAbnVkZ2VfcmVmZXJlbmR1bQEABBRpbmRleARIb25lX2Zld2VyX2RlY2lkaW5nAQAEFHRyYWNrBGRyZWZ1bmRfc3VibWlzc2lvbl9kZXBvc2l0AQAEFGluZGV4BDBzZXRfbWV0YWRhdGEBAAgUaW5kZXgEKG1heWJlX2hhc2gRASRXaGl0ZWxpc3QBAhA4d2hpdGVsaXN0X2NhbGwBAAQkY2FsbF9oYXNoIFxyZW1vdmVfd2hpdGVsaXN0ZWRfY2FsbAEABCRjYWxsX2hhc2ggZGRpc3BhdGNoX3doaXRlbGlzdGVkX2NhbGwBAAwkY2FsbF9oYXNoIEBjYWxsX2VuY29kZWRfbGVuBExjYWxsX3dlaWdodF93aXRuZXNzGJxkaXNwYXRjaF93aGl0ZWxpc3RlZF9jYWxsX3dpdGhfcHJlaW1hZ2UBAAQQY2FsbJUMKFBhcmFtZXRlcnMBAgQ0c2V0X3BhcmFtZXRlcgEABCRrZXlfdmFsdWVVBBhDbGFpbXMBAhQUY2xhaW0BAAgQZGVzdABIZXRoZXJldW1fc2lnbmF0dXJlXQQobWludF9jbGFpbQEAEAx3aG9lARR2YWx1ZQhAdmVzdGluZ19zY2hlZHVsZWUEJHN0YXRlbWVudG0EMGNsYWltX2F0dGVzdAEADBBkZXN0AEhldGhlcmV1bV9zaWduYXR1cmVdBCRzdGF0ZW1lbnQkGGF0dGVzdAEABCRzdGF0ZW1lbnQkKG1vdmVfY2xhaW0BAAwMb2xkZQEMbmV3ZQE4bWF5YmVfcHJlY2xhaW0FAhxVdGlsaXR5AQIYFGJhdGNoAQAEFGNhbGxzBQw0YXNfZGVyaXZhdGl2ZQEACBRpbmRleAQQY2FsbJUMJGJhdGNoX2FsbAEABBRjYWxscwUMLGRpc3BhdGNoX2FzAQAIJGFzX29yaWdpbuULEGNhbGyVDCxmb3JjZV9iYXRjaAEABBRjYWxscwUMLHdpdGhfd2VpZ2h0AQAIEGNhbGyVDBh3ZWlnaHQYHFNvY2lldHkBAlAMYmlkAQAEFHZhbHVlCBR1bmJpZAEBBRR2b3VjaAEADAx3aG/VAxR2YWx1ZQgMdGlwCBx1bnZvdWNoAQEFEHZvdGUBAAgkY2FuZGlkYXRl1QMcYXBwcm92ZRQ0ZGVmZW5kZXJfdm90ZQEABBxhcHByb3ZlFBhwYXlvdXQBAQUsd2FpdmVfcmVwYXkBAAQYYW1vdW50CDRmb3VuZF9zb2NpZXR5AQAYHGZvdW5kZXLVAyxtYXhfbWVtYmVycwQobWF4X2ludGFrZQQsbWF4X3N0cmlrZXMERGNhbmRpZGF0ZV9kZXBvc2l0CBRydWxlcyQgZGlzc29sdmUBAQVYanVkZ2Vfc3VzcGVuZGVkX21lbWJlcgEACAx3aG/VAxxmb3JnaXZlFDhzZXRfcGFyYW1ldGVycwEAECxtYXhfbWVtYmVycwQobWF4X2ludGFrZQQsbWF4X3N0cmlrZXMERGNhbmRpZGF0ZV9kZXBvc2l0CDhwdW5pc2hfc2tlcHRpYwEBBUBjbGFpbV9tZW1iZXJzaGlwAQEFRGJlc3Rvd19tZW1iZXJzaGlwAQAEJGNhbmRpZGF0ZQA4a2lja19jYW5kaWRhdGUBAAQkY2FuZGlkYXRlAEByZXNpZ25fY2FuZGlkYWN5AQEFOGRyb3BfY2FuZGlkYXRlAQAEJGNhbmRpZGF0ZQBEY2xlYW51cF9jYW5kaWRhY3kBAAgkY2FuZGlkYXRlAAxtYXgERGNsZWFudXBfY2hhbGxlbmdlAQAIPGNoYWxsZW5nZV9yb3VuZAQMbWF4BCBSZWNvdmVyeQECJDBhc19yZWNvdmVyZWQBAAgcYWNjb3VudNUDEGNhbGyVDDRzZXRfcmVjb3ZlcmVkAQAIEGxvc3TVAxxyZXNjdWVy1QM8Y3JlYXRlX3JlY292ZXJ5AQAMHGZyaWVuZHPdAyR0aHJlc2hvbGQEMGRlbGF5X3BlcmlvZAREaW5pdGlhdGVfcmVjb3ZlcnkBAAQcYWNjb3VudNUDOHZvdWNoX3JlY292ZXJ5AQAIEGxvc3TVAxxyZXNjdWVy1QM4Y2xhaW1fcmVjb3ZlcnkBAAQcYWNjb3VudNUDOGNsb3NlX3JlY292ZXJ5AQAEHHJlc2N1ZXLVAzxyZW1vdmVfcmVjb3ZlcnkBAQVAY2FuY2VsX3JlY292ZXJlZAEABBxhY2NvdW501QMcVmVzdGluZwECGBB2ZXN0AQEFKHZlc3Rfb3RoZXIBAAQYdGFyZ2V01QM8dmVzdGVkX3RyYW5zZmVyAQAIGHRhcmdldNUDIHNjaGVkdWxldQRUZm9yY2VfdmVzdGVkX3RyYW5zZmVyAQAMGHNvdXJjZdUDGHRhcmdldNUDIHNjaGVkdWxldQQ8bWVyZ2Vfc2NoZWR1bGVzAQAIPHNjaGVkdWxlMV9pbmRleAQ8c2NoZWR1bGUyX2luZGV4BHRmb3JjZV9yZW1vdmVfdmVzdGluZ19zY2hlZHVsZQEACBh0YXJnZXTVAzhzY2hlZHVsZV9pbmRleAQkU2NoZWR1bGVyAQIoIHNjaGVkdWxlAQAQEHdoZW4EOG1heWJlX3BlcmlvZGljgQMgcHJpb3JpdHkEEGNhbGyVDBhjYW5jZWwBAAgQd2hlbgQUaW5kZXgEOHNjaGVkdWxlX25hbWVkAQAUCGlkIBB3aGVuBDhtYXliZV9wZXJpb2RpY4EDIHByaW9yaXR5BBBjYWxslQwwY2FuY2VsX25hbWVkAQAECGlkIDhzY2hlZHVsZV9hZnRlcgEAEBRhZnRlcgQ4bWF5YmVfcGVyaW9kaWOBAyBwcmlvcml0eQQQY2FsbJUMUHNjaGVkdWxlX25hbWVkX2FmdGVyAQAUCGlkIBRhZnRlcgQ4bWF5YmVfcGVyaW9kaWOBAyBwcmlvcml0eQQQY2FsbJUMJHNldF9yZXRyeQEADBB0YXNrDQEccmV0cmllcwQYcGVyaW9kBDxzZXRfcmV0cnlfbmFtZWQBAAwIaWQgHHJldHJpZXMEGHBlcmlvZAQwY2FuY2VsX3JldHJ5AQAEEHRhc2sNAUhjYW5jZWxfcmV0cnlfbmFtZWQBAAQIaWQgFFByb3h5AQIoFHByb3h5AQAMEHJlYWzVA0Bmb3JjZV9wcm94eV90eXBlGQwQY2FsbJUMJGFkZF9wcm94eQEADCBkZWxlZ2F0ZdUDKHByb3h5X3R5cGWtCxRkZWxheQQwcmVtb3ZlX3Byb3h5AQAMIGRlbGVnYXRl1QMocHJveHlfdHlwZa0LFGRlbGF5BDhyZW1vdmVfcHJveGllcwEBBSxjcmVhdGVfcHVyZQEADChwcm94eV90eXBlrQsUZGVsYXkEFGluZGV4BCRraWxsX3B1cmUBABQcc3Bhd25lctUDKHByb3h5X3R5cGWtCxRpbmRleAQYaGVpZ2h0BCRleHRfaW5kZXgEIGFubm91bmNlAQAIEHJlYWzVAyRjYWxsX2hhc2ggTHJlbW92ZV9hbm5vdW5jZW1lbnQBAAgQcmVhbNUDJGNhbGxfaGFzaCBMcmVqZWN0X2Fubm91bmNlbWVudAEACCBkZWxlZ2F0ZdUDJGNhbGxfaGFzaCA8cHJveHlfYW5ub3VuY2VkAQAQIGRlbGVnYXRl1QMQcmVhbNUDQGZvcmNlX3Byb3h5X3R5cGUZDBBjYWxslQwgTXVsdGlzaWcBAhBQYXNfbXVsdGlfdGhyZXNob2xkXzEBAAhEb3RoZXJfc2lnbmF0b3JpZXPdAxBjYWxslQwgYXNfbXVsdGkBABQkdGhyZXNob2xkBERvdGhlcl9zaWduYXRvcmllc90DPG1heWJlX3RpbWVwb2ludI0EEGNhbGyVDChtYXhfd2VpZ2h0GEBhcHByb3ZlX2FzX211bHRpAQAUJHRocmVzaG9sZAREb3RoZXJfc2lnbmF0b3JpZXPdAzxtYXliZV90aW1lcG9pbnSNBCRjYWxsX2hhc2ggKG1heF93ZWlnaHQYPGNhbmNlbF9hc19tdWx0aQEAECR0aHJlc2hvbGQERG90aGVyX3NpZ25hdG9yaWVz3QMkdGltZXBvaW508QEkY2FsbF9oYXNoICBQcmVpbWFnZQECFDRub3RlX3ByZWltYWdlAQAEFGJ5dGVzJDx1bm5vdGVfcHJlaW1hZ2UBAAQQaGFzaCBAcmVxdWVzdF9wcmVpbWFnZQEABBBoYXNoIEh1bnJlcXVlc3RfcHJlaW1hZ2UBAAQQaGFzaCA4ZW5zdXJlX3VwZGF0ZWQBAAQYaGFzaGVzOQMgQm91bnRpZXMBAiQ4cHJvcG9zZV9ib3VudHkBAAgUdmFsdWUILGRlc2NyaXB0aW9uJDhhcHByb3ZlX2JvdW50eQEABCRib3VudHlfaWQEPHByb3Bvc2VfY3VyYXRvcgEADCRib3VudHlfaWQEHGN1cmF0b3LVAwxmZWUIQHVuYXNzaWduX2N1cmF0b3IBAAQkYm91bnR5X2lkBDhhY2NlcHRfY3VyYXRvcgEABCRib3VudHlfaWQEMGF3YXJkX2JvdW50eQEACCRib3VudHlfaWQELGJlbmVmaWNpYXJ51QMwY2xhaW1fYm91bnR5AQAEJGJvdW50eV9pZAQwY2xvc2VfYm91bnR5AQAEJGJvdW50eV9pZARQZXh0ZW5kX2JvdW50eV9leHBpcnkBAAgkYm91bnR5X2lkBBhyZW1hcmskNENoaWxkQm91bnRpZXMBAhxAYWRkX2NoaWxkX2JvdW50eQEADEBwYXJlbnRfYm91bnR5X2lkBBR2YWx1ZQgsZGVzY3JpcHRpb24kPHByb3Bvc2VfY3VyYXRvcgEAEEBwYXJlbnRfYm91bnR5X2lkBDxjaGlsZF9ib3VudHlfaWQEHGN1cmF0b3LVAwxmZWUIOGFjY2VwdF9jdXJhdG9yAQAIQHBhcmVudF9ib3VudHlfaWQEPGNoaWxkX2JvdW50eV9pZARAdW5hc3NpZ25fY3VyYXRvcgEACEBwYXJlbnRfYm91bnR5X2lkBDxjaGlsZF9ib3VudHlfaWQESGF3YXJkX2NoaWxkX2JvdW50eQEADEBwYXJlbnRfYm91bnR5X2lkBDxjaGlsZF9ib3VudHlfaWQELGJlbmVmaWNpYXJ51QNIY2xhaW1fY2hpbGRfYm91bnR5AQAIQHBhcmVudF9ib3VudHlfaWQEPGNoaWxkX2JvdW50eV9pZARIY2xvc2VfY2hpbGRfYm91bnR5AQAIQHBhcmVudF9ib3VudHlfaWQEPGNoaWxkX2JvdW50eV9pZARoRWxlY3Rpb25Qcm92aWRlck11bHRpUGhhc2UBAhQ8c3VibWl0X3Vuc2lnbmVkAQAIMHJhd19zb2x1dGlvbokMHHdpdG5lc3NdBWxzZXRfbWluaW11bV91bnRydXN0ZWRfc2NvcmUBAARAbWF5YmVfbmV4dF9zY29yZWEFdHNldF9lbWVyZ2VuY3lfZWxlY3Rpb25fcmVzdWx0AQAEIHN1cHBvcnRzdQUYc3VibWl0AQAEMHJhd19zb2x1dGlvbokMTGdvdmVybmFuY2VfZmFsbGJhY2sBAAhAbWF5YmVfbWF4X3ZvdGVycy0ERG1heWJlX21heF90YXJnZXRzLQQMTmlzAQIcJHBsYWNlX2JpZAEACBhhbW91bnQIIGR1cmF0aW9uBCxyZXRyYWN0X2JpZAEACBhhbW91bnQIIGR1cmF0aW9uBDBmdW5kX2RlZmljaXQBAQUwdGhhd19wcml2YXRlAQAIFGluZGV4BEBtYXliZV9wcm9wb3J0aW9u9QM0dGhhd19jb21tdW5hbAEABBRpbmRleAQkY29tbXVuaWZ5AQAEFGluZGV4BCRwcml2YXRpemUBAAQUaW5kZXgEWE5pc0NvdW50ZXJwYXJ0QmFsYW5jZXMBAiRQdHJhbnNmZXJfYWxsb3dfZGVhdGgBAAgQZGVzdNUDFHZhbHVlCDhmb3JjZV90cmFuc2ZlcgEADBhzb3VyY2XVAxBkZXN01QMUdmFsdWUITHRyYW5zZmVyX2tlZXBfYWxpdmUBAAgQZGVzdNUDFHZhbHVlCDB0cmFuc2Zlcl9hbGwBAAgQZGVzdNUDKGtlZXBfYWxpdmUUPGZvcmNlX3VucmVzZXJ2ZQEACAx3aG/VAxhhbW91bnQIQHVwZ3JhZGVfYWNjb3VudHMBAAQMd2hv3QNEZm9yY2Vfc2V0X2JhbGFuY2UBAAgMd2hv1QMgbmV3X2ZyZWUIbGZvcmNlX2FkanVzdF90b3RhbF9pc3N1YW5jZQEACCRkaXJlY3Rpb27hAxRkZWx0YQgQYnVybgEACBR2YWx1ZQgoa2VlcF9hbGl2ZRQkVm90ZXJMaXN0AQIMFHJlYmFnAQAEKGRpc2xvY2F0ZWTVAzxwdXRfaW5fZnJvbnRfb2YBAAQcbGlnaHRlctUDVHB1dF9pbl9mcm9udF9vZl9vdGhlcgEACBxoZWF2aWVy1QMcbGlnaHRlctUDPE5vbWluYXRpb25Qb29scwECaBBqb2luAQAIGGFtb3VudAgccG9vbF9pZAQoYm9uZF9leHRyYQEABBRleHRyYYEFMGNsYWltX3BheW91dAEBBRh1bmJvbmQBAAg4bWVtYmVyX2FjY291bnTVA0B1bmJvbmRpbmdfcG9pbnRzCFhwb29sX3dpdGhkcmF3X3VuYm9uZGVkAQAIHHBvb2xfaWQESG51bV9zbGFzaGluZ19zcGFucwREd2l0aGRyYXdfdW5ib25kZWQBAAg4bWVtYmVyX2FjY291bnTVA0hudW1fc2xhc2hpbmdfc3BhbnMEGGNyZWF0ZQEAEBhhbW91bnQIEHJvb3TVAyRub21pbmF0b3LVAxxib3VuY2Vy1QNMY3JlYXRlX3dpdGhfcG9vbF9pZAEAFBhhbW91bnQIEHJvb3TVAyRub21pbmF0b3LVAxxib3VuY2Vy1QMccG9vbF9pZAQgbm9taW5hdGUBAAgccG9vbF9pZAQodmFsaWRhdG9yc90DJHNldF9zdGF0ZQEACBxwb29sX2lkBBRzdGF0ZR0CMHNldF9tZXRhZGF0YQEACBxwb29sX2lkBCBtZXRhZGF0YSQsc2V0X2NvbmZpZ3MBABg0bWluX2pvaW5fYm9uZO0DPG1pbl9jcmVhdGVfYm9uZO0DJG1heF9wb29sc/EDLG1heF9tZW1iZXJz8QNQbWF4X21lbWJlcnNfcGVyX3Bvb2zxA1RnbG9iYWxfbWF4X2NvbW1pc3Npb27xAzB1cGRhdGVfcm9sZXMBABAccG9vbF9pZAQgbmV3X3Jvb3SFBTRuZXdfbm9taW5hdG9yhQUsbmV3X2JvdW5jZXKFBRRjaGlsbAEABBxwb29sX2lkBEBib25kX2V4dHJhX290aGVyAQAIGG1lbWJlctUDFGV4dHJhgQVQc2V0X2NsYWltX3Blcm1pc3Npb24BAAQocGVybWlzc2lvbokFSGNsYWltX3BheW91dF9vdGhlcgEABBRvdGhlcgA4c2V0X2NvbW1pc3Npb24BAAgccG9vbF9pZAQ4bmV3X2NvbW1pc3Npb24lAkhzZXRfY29tbWlzc2lvbl9tYXgBAAgccG9vbF9pZAQ4bWF4X2NvbW1pc3Npb24EaHNldF9jb21taXNzaW9uX2NoYW5nZV9yYXRlAQAIHHBvb2xfaWQELGNoYW5nZV9yYXRlKQJAY2xhaW1fY29tbWlzc2lvbgEABBxwb29sX2lkBExhZGp1c3RfcG9vbF9kZXBvc2l0AQAEHHBvb2xfaWQEfHNldF9jb21taXNzaW9uX2NsYWltX3Blcm1pc3Npb24BAAgccG9vbF9pZAQocGVybWlzc2lvbjECLGFwcGx5X3NsYXNoAQAEOG1lbWJlcl9hY2NvdW501QNIbWlncmF0ZV9kZWxlZ2F0aW9uAQAEOG1lbWJlcl9hY2NvdW501QN4bWlncmF0ZV9wb29sX3RvX2RlbGVnYXRlX3N0YWtlAQAEHHBvb2xfaWQELEZhc3RVbnN0YWtlAQIMVHJlZ2lzdGVyX2Zhc3RfdW5zdGFrZQEBBShkZXJlZ2lzdGVyAQEFHGNvbnRyb2wBAAQ0ZXJhc190b19jaGVjawQ0Q29uZmlndXJhdGlvbgECwHxzZXRfdmFsaWRhdGlvbl91cGdyYWRlX2Nvb2xkb3duAQAEDG5ldwRwc2V0X3ZhbGlkYXRpb25fdXBncmFkZV9kZWxheQEABAxuZXcEZHNldF9jb2RlX3JldGVudGlvbl9wZXJpb2QBAAQMbmV3BERzZXRfbWF4X2NvZGVfc2l6ZQEABAxuZXcEQHNldF9tYXhfcG92X3NpemUBAAQMbmV3BFhzZXRfbWF4X2hlYWRfZGF0YV9zaXplAQAEDG5ldwRIc2V0X2NvcmV0aW1lX2NvcmVzAQAEDG5ldwR0c2V0X21heF9hdmFpbGFiaWxpdHlfdGltZW91dHMBAAQMbmV3BHBzZXRfZ3JvdXBfcm90YXRpb25fZnJlcXVlbmN5AQAEDG5ldwR0c2V0X3BhcmFzX2F2YWlsYWJpbGl0eV9wZXJpb2QBAAQMbmV3BGBzZXRfc2NoZWR1bGluZ19sb29rYWhlYWQBAAQMbmV3BGxzZXRfbWF4X3ZhbGlkYXRvcnNfcGVyX2NvcmUBAAQMbmV3LQRIc2V0X21heF92YWxpZGF0b3JzAQAEDG5ldy0ESHNldF9kaXNwdXRlX3BlcmlvZAEABAxuZXcEtHNldF9kaXNwdXRlX3Bvc3RfY29uY2x1c2lvbl9hY2NlcHRhbmNlX3BlcmlvZAEABAxuZXcERHNldF9ub19zaG93X3Nsb3RzAQAEDG5ldwRQc2V0X25fZGVsYXlfdHJhbmNoZXMBAAQMbmV3BHhzZXRfemVyb3RoX2RlbGF5X3RyYW5jaGVfd2lkdGgBAAQMbmV3BFBzZXRfbmVlZGVkX2FwcHJvdmFscwEABAxuZXcEcHNldF9yZWxheV92cmZfbW9kdWxvX3NhbXBsZXMBAAQMbmV3BGhzZXRfbWF4X3Vwd2FyZF9xdWV1ZV9jb3VudAEABAxuZXcEZHNldF9tYXhfdXB3YXJkX3F1ZXVlX3NpemUBAAQMbmV3BHRzZXRfbWF4X2Rvd253YXJkX21lc3NhZ2Vfc2l6ZQEABAxuZXcEbHNldF9tYXhfdXB3YXJkX21lc3NhZ2Vfc2l6ZQEABAxuZXcEoHNldF9tYXhfdXB3YXJkX21lc3NhZ2VfbnVtX3Blcl9jYW5kaWRhdGUBAAQMbmV3BGRzZXRfaHJtcF9vcGVuX3JlcXVlc3RfdHRsAQAEDG5ldwRcc2V0X2hybXBfc2VuZGVyX2RlcG9zaXQBAAQMbmV3CGhzZXRfaHJtcF9yZWNpcGllbnRfZGVwb3NpdAEABAxuZXcIdHNldF9ocm1wX2NoYW5uZWxfbWF4X2NhcGFjaXR5AQAEDG5ldwR8c2V0X2hybXBfY2hhbm5lbF9tYXhfdG90YWxfc2l6ZQEABAxuZXcEnHNldF9ocm1wX21heF9wYXJhY2hhaW5faW5ib3VuZF9jaGFubmVscwEABAxuZXcEhHNldF9ocm1wX2NoYW5uZWxfbWF4X21lc3NhZ2Vfc2l6ZQEABAxuZXcEoHNldF9ocm1wX21heF9wYXJhY2hhaW5fb3V0Ym91bmRfY2hhbm5lbHMBAAQMbmV3BJhzZXRfaHJtcF9tYXhfbWVzc2FnZV9udW1fcGVyX2NhbmRpZGF0ZQEABAxuZXcESHNldF9wdmZfdm90aW5nX3R0bAEABAxuZXcEkHNldF9taW5pbXVtX3ZhbGlkYXRpb25fdXBncmFkZV9kZWxheQEABAxuZXcEcHNldF9ieXBhc3NfY29uc2lzdGVuY3lfY2hlY2sBAAQMbmV3FGBzZXRfYXN5bmNfYmFja2luZ19wYXJhbXMBAAQMbmV3lQVMc2V0X2V4ZWN1dG9yX3BhcmFtcwEABAxuZXelBVhzZXRfb25fZGVtYW5kX2Jhc2VfZmVlAQAEDG5ldwh0c2V0X29uX2RlbWFuZF9mZWVfdmFyaWFiaWxpdHkBAAQMbmV3BHBzZXRfb25fZGVtYW5kX3F1ZXVlX21heF9zaXplAQAEDG5ldwSYc2V0X29uX2RlbWFuZF90YXJnZXRfcXVldWVfdXRpbGl6YXRpb24BAAQMbmV3BERzZXRfb25fZGVtYW5kX3R0bAEABAxuZXcEZHNldF9taW5pbXVtX2JhY2tpbmdfdm90ZXMBAAQMbmV3BEBzZXRfbm9kZV9mZWF0dXJlAQAIFGluZGV4BBR2YWx1ZRRoc2V0X2FwcHJvdmFsX3ZvdGluZ19wYXJhbXMBAAQMbmV3BFBzZXRfc2NoZWR1bGVyX3BhcmFtcwEABAxuZXepBSxQYXJhc1NoYXJlZAEBBTRQYXJhSW5jbHVzaW9uAQEFMFBhcmFJbmhlcmVudAECBBRlbnRlcgEABBBkYXRh/QUUUGFyYXMBAiRYZm9yY2Vfc2V0X2N1cnJlbnRfY29kZQEACBBwYXJhBCBuZXdfY29kZSRYZm9yY2Vfc2V0X2N1cnJlbnRfaGVhZAEACBBwYXJhBCBuZXdfaGVhZCRsZm9yY2Vfc2NoZWR1bGVfY29kZV91cGdyYWRlAQAMEHBhcmEEIG5ld19jb2RlJExyZWxheV9wYXJlbnRfbnVtYmVyBExmb3JjZV9ub3RlX25ld19oZWFkAQAIEHBhcmEEIG5ld19oZWFkJEhmb3JjZV9xdWV1ZV9hY3Rpb24BAAQQcGFyYQRsYWRkX3RydXN0ZWRfdmFsaWRhdGlvbl9jb2RlAQAEPHZhbGlkYXRpb25fY29kZSRscG9rZV91bnVzZWRfdmFsaWRhdGlvbl9jb2RlAQAEUHZhbGlkYXRpb25fY29kZV9oYXNoIGxpbmNsdWRlX3B2Zl9jaGVja19zdGF0ZW1lbnQBAAgQc3RtdAUGJHNpZ25hdHVyZUECdGZvcmNlX3NldF9tb3N0X3JlY2VudF9jb250ZXh0AQAIEHBhcmEEHGNvbnRleHQELEluaXRpYWxpemVyAQIENGZvcmNlX2FwcHJvdmUBAAQUdXBfdG8EEEhybXABAixYaHJtcF9pbml0X29wZW5fY2hhbm5lbAEADCRyZWNpcGllbnQEVHByb3Bvc2VkX21heF9jYXBhY2l0eQRkcHJvcG9zZWRfbWF4X21lc3NhZ2Vfc2l6ZQRgaHJtcF9hY2NlcHRfb3Blbl9jaGFubmVsAQAEGHNlbmRlcgRIaHJtcF9jbG9zZV9jaGFubmVsAQAEKGNoYW5uZWxfaWRVAkBmb3JjZV9jbGVhbl9ocm1wAQAMEHBhcmEELG51bV9pbmJvdW5kBDBudW1fb3V0Ym91bmQEXGZvcmNlX3Byb2Nlc3NfaHJtcF9vcGVuAQAEIGNoYW5uZWxzBGBmb3JjZV9wcm9jZXNzX2hybXBfY2xvc2UBAAQgY2hhbm5lbHMEYGhybXBfY2FuY2VsX29wZW5fcmVxdWVzdAEACChjaGFubmVsX2lkVQI0b3Blbl9yZXF1ZXN0cwRcZm9yY2Vfb3Blbl9ocm1wX2NoYW5uZWwBABAYc2VuZGVyBCRyZWNpcGllbnQEMG1heF9jYXBhY2l0eQRAbWF4X21lc3NhZ2Vfc2l6ZQRgZXN0YWJsaXNoX3N5c3RlbV9jaGFubmVsAQAIGHNlbmRlcgQkcmVjaXBpZW50BFRwb2tlX2NoYW5uZWxfZGVwb3NpdHMBAAgYc2VuZGVyBCRyZWNpcGllbnQEdGVzdGFibGlzaF9jaGFubmVsX3dpdGhfc3lzdGVtAQAETHRhcmdldF9zeXN0ZW1fY2hhaW4ENFBhcmFzRGlzcHV0ZXMBAgQ4Zm9yY2VfdW5mcmVlemUBAQU0UGFyYXNTbGFzaGluZwECBHByZXBvcnRfZGlzcHV0ZV9sb3N0X3Vuc2lnbmVkAQAINGRpc3B1dGVfcHJvb2YhBjxrZXlfb3duZXJfcHJvb2a9A2hPbkRlbWFuZEFzc2lnbm1lbnRQcm92aWRlcgECCFxwbGFjZV9vcmRlcl9hbGxvd19kZWF0aAEACChtYXhfYW1vdW50CBxwYXJhX2lkBFhwbGFjZV9vcmRlcl9rZWVwX2FsaXZlAQAIKG1heF9hbW91bnQIHHBhcmFfaWQEJFJlZ2lzdHJhcgECJCByZWdpc3RlcgEADAhpZAQwZ2VuZXNpc19oZWFkJDx2YWxpZGF0aW9uX2NvZGUkOGZvcmNlX3JlZ2lzdGVyAQAUDHdobwAcZGVwb3NpdAgIaWQEMGdlbmVzaXNfaGVhZCQ8dmFsaWRhdGlvbl9jb2RlJChkZXJlZ2lzdGVyAQAECGlkBBBzd2FwAQAICGlkBBRvdGhlcgQscmVtb3ZlX2xvY2sBAAQQcGFyYQQccmVzZXJ2ZQEBBSBhZGRfbG9jawEABBBwYXJhBFRzY2hlZHVsZV9jb2RlX3VwZ3JhZGUBAAgQcGFyYQQgbmV3X2NvZGUkQHNldF9jdXJyZW50X2hlYWQBAAgQcGFyYQQgbmV3X2hlYWQkFFNsb3RzAQIMLGZvcmNlX2xlYXNlAQAUEHBhcmEEGGxlYXNlcgAYYW1vdW50CDBwZXJpb2RfYmVnaW4EMHBlcmlvZF9jb3VudARAY2xlYXJfYWxsX2xlYXNlcwEABBBwYXJhBDx0cmlnZ2VyX29uYm9hcmQBAAQQcGFyYQQgQXVjdGlvbnMBAgwsbmV3X2F1Y3Rpb24BAAggZHVyYXRpb24ESGxlYXNlX3BlcmlvZF9pbmRleAQMYmlkAQAUEHBhcmEENGF1Y3Rpb25faW5kZXgEKGZpcnN0X3Nsb3QEJGxhc3Rfc2xvdAQYYW1vdW50CDhjYW5jZWxfYXVjdGlvbgEBBSRDcm93ZGxvYW4BAiQYY3JlYXRlAQAYFGluZGV4BAxjYXAIMGZpcnN0X3BlcmlvZAQsbGFzdF9wZXJpb2QEDGVuZAQgdmVyaWZpZXI9Bihjb250cmlidXRlAQAMFGluZGV4BBR2YWx1ZQgkc2lnbmF0dXJlRQYgd2l0aGRyYXcBAAgMd2hvABRpbmRleAQYcmVmdW5kAQAEFGluZGV4BCBkaXNzb2x2ZQEABBRpbmRleAQQZWRpdAEAGBRpbmRleAQMY2FwCDBmaXJzdF9wZXJpb2QELGxhc3RfcGVyaW9kBAxlbmQEIHZlcmlmaWVyPQYgYWRkX21lbW8BAAgUaW5kZXgEEG1lbW8kEHBva2UBAAQUaW5kZXgEOGNvbnRyaWJ1dGVfYWxsAQAIFGluZGV4BCRzaWduYXR1cmVFBiBDb3JldGltZQECDEhyZXF1ZXN0X2NvcmVfY291bnQBAAQUY291bnQESHJlcXVlc3RfcmV2ZW51ZV9hdAEABBB3aGVuBCxhc3NpZ25fY29yZQEAEBBjb3JlBBRiZWdpbgQoYXNzaWdubWVudFUGIGVuZF9oaW50LQQkWGNtUGFsbGV0AQI4EHNlbmQBAAgQZGVzdJkBHG1lc3NhZ2WpBjx0ZWxlcG9ydF9hc3NldHMBABAQZGVzdJkBLGJlbmVmaWNpYXJ5mQEYYXNzZXRzGQM4ZmVlX2Fzc2V0X2l0ZW0EXHJlc2VydmVfdHJhbnNmZXJfYXNzZXRzAQAQEGRlc3SZASxiZW5lZmljaWFyeZkBGGFzc2V0cxkDOGZlZV9hc3NldF9pdGVtBBxleGVjdXRlAQAIHG1lc3NhZ2WpBihtYXhfd2VpZ2h0GERmb3JjZV94Y21fdmVyc2lvbgEACCBsb2NhdGlvbnkBHHZlcnNpb24EZGZvcmNlX2RlZmF1bHRfeGNtX3ZlcnNpb24BAAREbWF5YmVfeGNtX3ZlcnNpb24tBHhmb3JjZV9zdWJzY3JpYmVfdmVyc2lvbl9ub3RpZnkBAAQgbG9jYXRpb26ZAYBmb3JjZV91bnN1YnNjcmliZV92ZXJzaW9uX25vdGlmeQEABCBsb2NhdGlvbpkBfGxpbWl0ZWRfcmVzZXJ2ZV90cmFuc2Zlcl9hc3NldHMBABQQZGVzdJkBLGJlbmVmaWNpYXJ5mQEYYXNzZXRzGQM4ZmVlX2Fzc2V0X2l0ZW0EMHdlaWdodF9saW1pdPECXGxpbWl0ZWRfdGVsZXBvcnRfYXNzZXRzAQAUEGRlc3SZASxiZW5lZmljaWFyeZkBGGFzc2V0cxkDOGZlZV9hc3NldF9pdGVtBDB3ZWlnaHRfbGltaXTxAkBmb3JjZV9zdXNwZW5zaW9uAQAEJHN1c3BlbmRlZBQ8dHJhbnNmZXJfYXNzZXRzAQAUEGRlc3SZASxiZW5lZmljaWFyeZkBGGFzc2V0cxkDOGZlZV9hc3NldF9pdGVtBDB3ZWlnaHRfbGltaXTxAjBjbGFpbV9hc3NldHMBAAgYYXNzZXRzGQMsYmVuZWZpY2lhcnmZAYx0cmFuc2Zlcl9hc3NldHNfdXNpbmdfdHlwZV9hbmRfdGhlbgEAHBBkZXN0mQEYYXNzZXRzGQNQYXNzZXRzX3RyYW5zZmVyX3R5cGWtBjhyZW1vdGVfZmVlc19pZLEGSGZlZXNfdHJhbnNmZXJfdHlwZa0GSGN1c3RvbV94Y21fb25fZGVzdKkGMHdlaWdodF9saW1pdPECME1lc3NhZ2VRdWV1ZQECCCRyZWFwX3BhZ2UBAAg4bWVzc2FnZV9vcmlnaW4lAyhwYWdlX2luZGV4BEhleGVjdXRlX292ZXJ3ZWlnaHQBABA4bWVzc2FnZV9vcmlnaW4lAxBwYWdlBBRpbmRleAQwd2VpZ2h0X2xpbWl0GCRBc3NldFJhdGUBAgwYY3JlYXRlAQAIKGFzc2V0X2tpbmSBARByYXRlCBh1cGRhdGUBAAgoYXNzZXRfa2luZIEBEHJhdGUIGHJlbW92ZQEABChhc3NldF9raW5kgQEUQmVlZnkBAgxMcmVwb3J0X2VxdWl2b2NhdGlvbgEACEhlcXVpdm9jYXRpb25fcHJvb2bVBjxrZXlfb3duZXJfcHJvb2a9A3ByZXBvcnRfZXF1aXZvY2F0aW9uX3Vuc2lnbmVkAQAISGVxdWl2b2NhdGlvbl9wcm9vZtUGPGtleV9vd25lcl9wcm9vZr0DPHNldF9uZXdfZ2VuZXNpcwEABDxkZWxheV9pbl9ibG9ja3MEAgggVm91Y2hpbmcBAQUYQmFubmVkAQEFBpkMABAQcmFuawQcc3RyaWtlcwQgdm91Y2hpbmedDBRpbmRleAQACBBwYWlkCBxwYXlvdXRz2QcCCBxEZXBvc2l0AQEDFFZvdWNoAQMIAAgADAx3aG8AEGtpbmSpDBR2YWx1ZQgErQwAAAgkYXBwcm92YWxzBChyZWplY3Rpb25zBAAUFHJvdW5kBBBraW5kqQwMYmlkCBR0YWxsebUMOHNrZXB0aWNfc3RydWNrFAQAAQgACBxhcHByb3ZlFBh3ZWlnaHQEAAwMd2hvAAxiaWQIFHJvdW5kBAMMAAC1DAAQMGRlbGF5X3BlcmlvZAQcZGVwb3NpdAgcZnJpZW5kc90DJHRocmVzaG9sZAQADBxjcmVhdGVkBBxkZXBvc2l0CBxmcmllbmRz3QMAFCBtYXliZV9pZBEBIHByaW9yaXR5BBBjYWxspQE4bWF5YmVfcGVyaW9kaWOBAxhvcmlnaW7lCwbVDATZDAAADCBkZWxlZ2F0ZQAocHJveHlfdHlwZa0LFGRlbGF5BAThDAADCOUMCAAQDHdobwAcZGVwb3NpdAgwcmF3X3NvbHV0aW9uiQwgY2FsbF9mZWUIBN0HAAAUPHByb3BvcnRpb25fb3dlZAgUaW5kZXgEGHRoYXdlZAgsbGFzdF9wZXJpb2QEQHJlY2VpcHRzX29uX2hvbGQIAAwocHJvcG9ydGlvbggUb3duZXLhBhhleHBpcnkEAAQYYW1vdW50CAT9DAAHlQsVCgTFCwAAEEBleGVjdXRpb25fcmVzdWx0jQs4ZW1pdHRlZF9ldmVudHMJDSRsb2NhbF94Y20lCzhmb3J3YXJkZWRfeGNtczELBw0NOQsADEBleGVjdXRpb25fcmVzdWx0jQI4ZW1pdHRlZF9ldmVudHMJDThmb3J3YXJkZWRfeGNtczELBxUNOQsCJDxQYXJhRG9lc250RXhpc3QBAQVEUGFyYUFscmVhZHlFeGlzdHMBAQVURXhjZWVkc01heE1lc3NhZ2VTaXplAQEFOENvdWxkbnRDbGVhbnVwAQEFNE5vdFBhcmF0aHJlYWQBAQUwTm90UGFyYWNoYWluAQEFNENhbm5vdFVwZ3JhZGUBAQU8Q2Fubm90RG93bmdyYWRlAQEFMFRvb01hbnlDb3JlcwEBBQIELFJlcXVpcmVTdWRvAQEFAvQYU3lzdGVtAQIkPEludmFsaWRTcGVjTmFtZQEBBWhTcGVjVmVyc2lvbk5lZWRzVG9JbmNyZWFzZQEBBXRGYWlsZWRUb0V4dHJhY3RSdW50aW1lVmVyc2lvbgEBBUxOb25EZWZhdWx0Q29tcG9zaXRlAQEFPE5vblplcm9SZWZDb3VudAEBBTBDYWxsRmlsdGVyZWQBAQVsTXVsdGlCbG9ja01pZ3JhdGlvbnNPbmdvaW5nAQEFRE5vdGhpbmdBdXRob3JpemVkAQEFMFVuYXV0aG9yaXplZAEBBSRTY2hlZHVsZXIBAhRARmFpbGVkVG9TY2hlZHVsZQEBBSBOb3RGb3VuZAEBBVxUYXJnZXRCbG9ja051bWJlckluUGFzdAEBBUhSZXNjaGVkdWxlTm9DaGFuZ2UBAQUUTmFtZWQBAQUgUHJlaW1hZ2UBAiQYVG9vQmlnAQEFMEFscmVhZHlOb3RlZAEBBTROb3RBdXRob3JpemVkAQEFIE5vdE5vdGVkAQEFJFJlcXVlc3RlZAEBBTBOb3RSZXF1ZXN0ZWQBAQUcVG9vTWFueQEBBRhUb29GZXcBAQUYTm9Db3N0AQEFEEJhYmUBAhBgSW52YWxpZEVxdWl2b2NhdGlvblByb29mAQEFYEludmFsaWRLZXlPd25lcnNoaXBQcm9vZgEBBVhEdXBsaWNhdGVPZmZlbmNlUmVwb3J0AQEFUEludmFsaWRDb25maWd1cmF0aW9uAQEFJFRpbWVzdGFtcAEBBRxJbmRpY2VzAQIULE5vdEFzc2lnbmVkAQEFIE5vdE93bmVyAQEFFEluVXNlAQEFLE5vdFRyYW5zZmVyAQEFJFBlcm1hbmVudAEBBSBCYWxhbmNlcwECMDhWZXN0aW5nQmFsYW5jZQEBBVRMaXF1aWRpdHlSZXN0cmljdGlvbnMBAQVMSW5zdWZmaWNpZW50QmFsYW5jZQEBBUhFeGlzdGVudGlhbERlcG9zaXQBAQU0RXhwZW5kYWJpbGl0eQEBBVxFeGlzdGluZ1Zlc3RpbmdTY2hlZHVsZQEBBSxEZWFkQWNjb3VudAEBBTxUb29NYW55UmVzZXJ2ZXMBAQUwVG9vTWFueUhvbGRzAQEFOFRvb01hbnlGcmVlemVzAQEFTElzc3VhbmNlRGVhY3RpdmF0ZWQBAQUkRGVsdGFaZXJvAQEFSFRyYW5zYWN0aW9uUGF5bWVudAEBBShBdXRob3JzaGlwAQEFHFN0YWtpbmcBAnw0Tm90Q29udHJvbGxlcgEBBSBOb3RTdGFzaAEBBTRBbHJlYWR5Qm9uZGVkAQEFNEFscmVhZHlQYWlyZWQBAQUwRW1wdHlUYXJnZXRzAQEFOER1cGxpY2F0ZUluZGV4AQEFREludmFsaWRTbGFzaEluZGV4AQEFQEluc3VmZmljaWVudEJvbmQBAQUwTm9Nb3JlQ2h1bmtzAQEFNE5vVW5sb2NrQ2h1bmsBAQUwRnVuZGVkVGFyZ2V0AQEFSEludmFsaWRFcmFUb1Jld2FyZAEBBWhJbnZhbGlkTnVtYmVyT2ZOb21pbmF0aW9ucwEBBUhOb3RTb3J0ZWRBbmRVbmlxdWUBAQU4QWxyZWFkeUNsYWltZWQBAQUsSW52YWxpZFBhZ2UBAQVUSW5jb3JyZWN0SGlzdG9yeURlcHRoAQEFWEluY29ycmVjdFNsYXNoaW5nU3BhbnMBAQUgQmFkU3RhdGUBAQU4VG9vTWFueVRhcmdldHMBAQUkQmFkVGFyZ2V0AQEFQENhbm5vdENoaWxsT3RoZXIBAQVEVG9vTWFueU5vbWluYXRvcnMBAQVEVG9vTWFueVZhbGlkYXRvcnMBAQVAQ29tbWlzc2lvblRvb0xvdwEBBSxCb3VuZE5vdE1ldAEBBVBDb250cm9sbGVyRGVwcmVjYXRlZAEBBUxDYW5ub3RSZXN0b3JlTGVkZ2VyAQEFbFJld2FyZERlc3RpbmF0aW9uUmVzdHJpY3RlZAEBBThOb3RFbm91Z2hGdW5kcwEBBVxWaXJ0dWFsU3Rha2VyTm90QWxsb3dlZAEBBSBPZmZlbmNlcwEBBShIaXN0b3JpY2FsAQEFHFNlc3Npb24BAhQwSW52YWxpZFByb29mAQEFXE5vQXNzb2NpYXRlZFZhbGlkYXRvcklkAQEFNER1cGxpY2F0ZWRLZXkBAQUYTm9LZXlzAQEFJE5vQWNjb3VudAEBBRxHcmFuZHBhAQIcLFBhdXNlRmFpbGVkAQEFMFJlc3VtZUZhaWxlZAEBBTRDaGFuZ2VQZW5kaW5nAQEFHFRvb1Nvb24BAQVgSW52YWxpZEtleU93bmVyc2hpcFByb29mAQEFYEludmFsaWRFcXVpdm9jYXRpb25Qcm9vZgEBBVhEdXBsaWNhdGVPZmZlbmNlUmVwb3J0AQEFSEF1dGhvcml0eURpc2NvdmVyeQEBBSBUcmVhc3VyeQECLDBJbnZhbGlkSW5kZXgBAQVAVG9vTWFueUFwcHJvdmFscwEBBVhJbnN1ZmZpY2llbnRQZXJtaXNzaW9uAQEFTFByb3Bvc2FsTm90QXBwcm92ZWQBAQVYRmFpbGVkVG9Db252ZXJ0QmFsYW5jZQEBBTBTcGVuZEV4cGlyZWQBAQUsRWFybHlQYXlvdXQBAQVAQWxyZWFkeUF0dGVtcHRlZAEBBSxQYXlvdXRFcnJvcgEBBTBOb3RBdHRlbXB0ZWQBAQUwSW5jb25jbHVzaXZlAQEFQENvbnZpY3Rpb25Wb3RpbmcBAjAoTm90T25nb2luZwEBBSBOb3RWb3RlcgEBBTBOb1Blcm1pc3Npb24BAQU8Tm9QZXJtaXNzaW9uWWV0AQEFREFscmVhZHlEZWxlZ2F0aW5nAQEFNEFscmVhZHlWb3RpbmcBAQVESW5zdWZmaWNpZW50RnVuZHMBAQU0Tm90RGVsZWdhdGluZwEBBSBOb25zZW5zZQEBBTxNYXhWb3Rlc1JlYWNoZWQBAQUsQ2xhc3NOZWVkZWQBAQUgQmFkQ2xhc3MBAQUkUmVmZXJlbmRhAQI4KE5vdE9uZ29pbmcBAQUoSGFzRGVwb3NpdAEBBSBCYWRUcmFjawEBBRBGdWxsAQEFKFF1ZXVlRW1wdHkBAQU0QmFkUmVmZXJlbmR1bQEBBSxOb3RoaW5nVG9EbwEBBRxOb1RyYWNrAQEFKFVuZmluaXNoZWQBAQUwTm9QZXJtaXNzaW9uAQEFJE5vRGVwb3NpdAEBBSRCYWRTdGF0dXMBAQVAUHJlaW1hZ2VOb3RFeGlzdAEBBYRQcmVpbWFnZVN0b3JlZFdpdGhEaWZmZXJlbnRMZW5ndGgBAQUcT3JpZ2lucwEBBSRXaGl0ZWxpc3QBAhRMVW5hdmFpbGFibGVQcmVJbWFnZQEBBTxVbmRlY29kYWJsZUNhbGwBAQVgSW52YWxpZENhbGxXZWlnaHRXaXRuZXNzAQEFUENhbGxJc05vdFdoaXRlbGlzdGVkAQEFWENhbGxBbHJlYWR5V2hpdGVsaXN0ZWQBAQUoUGFyYW1ldGVycwEBBRhDbGFpbXMBAhhgSW52YWxpZEV0aGVyZXVtU2lnbmF0dXJlAQEFQFNpZ25lckhhc05vQ2xhaW0BAQVAU2VuZGVySGFzTm9DbGFpbQEBBTBQb3RVbmRlcmZsb3cBAQVASW52YWxpZFN0YXRlbWVudAEBBUxWZXN0ZWRCYWxhbmNlRXhpc3RzAQEFHFZlc3RpbmcBAhQoTm90VmVzdGluZwEBBVRBdE1heFZlc3RpbmdTY2hlZHVsZXMBAQUkQW1vdW50TG93AQEFYFNjaGVkdWxlSW5kZXhPdXRPZkJvdW5kcwEBBVRJbnZhbGlkU2NoZWR1bGVQYXJhbXMBAQUcVXRpbGl0eQECBDBUb29NYW55Q2FsbHMBAQUUUHJveHkBAiAcVG9vTWFueQEBBSBOb3RGb3VuZAEBBSBOb3RQcm94eQEBBSxVbnByb3h5YWJsZQEBBSREdXBsaWNhdGUBAQUwTm9QZXJtaXNzaW9uAQEFLFVuYW5ub3VuY2VkAQEFLE5vU2VsZlByb3h5AQEFIE11bHRpc2lnAQI4QE1pbmltdW1UaHJlc2hvbGQBAQU8QWxyZWFkeUFwcHJvdmVkAQEFRE5vQXBwcm92YWxzTmVlZGVkAQEFRFRvb0Zld1NpZ25hdG9yaWVzAQEFSFRvb01hbnlTaWduYXRvcmllcwEBBVRTaWduYXRvcmllc091dE9mT3JkZXIBAQVMU2VuZGVySW5TaWduYXRvcmllcwEBBSBOb3RGb3VuZAEBBSBOb3RPd25lcgEBBSxOb1RpbWVwb2ludAEBBThXcm9uZ1RpbWVwb2ludAEBBUxVbmV4cGVjdGVkVGltZXBvaW50AQEFPE1heFdlaWdodFRvb0xvdwEBBTRBbHJlYWR5U3RvcmVkAQEFIEJvdW50aWVzAQIscEluc3VmZmljaWVudFByb3Bvc2Vyc0JhbGFuY2UBAQUwSW52YWxpZEluZGV4AQEFMFJlYXNvblRvb0JpZwEBBUBVbmV4cGVjdGVkU3RhdHVzAQEFOFJlcXVpcmVDdXJhdG9yAQEFMEludmFsaWRWYWx1ZQEBBShJbnZhbGlkRmVlAQEFNFBlbmRpbmdQYXlvdXQBAQUkUHJlbWF0dXJlAQEFUEhhc0FjdGl2ZUNoaWxkQm91bnR5AQEFNFRvb01hbnlRdWV1ZWQBAQU0Q2hpbGRCb3VudGllcwECDFRQYXJlbnRCb3VudHlOb3RBY3RpdmUBAQVkSW5zdWZmaWNpZW50Qm91bnR5QmFsYW5jZQEBBVBUb29NYW55Q2hpbGRCb3VudGllcwEBBWhFbGVjdGlvblByb3ZpZGVyTXVsdGlQaGFzZQECPGhQcmVEaXNwYXRjaEVhcmx5U3VibWlzc2lvbgEBBWxQcmVEaXNwYXRjaFdyb25nV2lubmVyQ291bnQBAQVkUHJlRGlzcGF0Y2hXZWFrU3VibWlzc2lvbgEBBTxTaWduZWRRdWV1ZUZ1bGwBAQVYU2lnbmVkQ2Fubm90UGF5RGVwb3NpdAEBBVBTaWduZWRJbnZhbGlkV2l0bmVzcwEBBUxTaWduZWRUb29NdWNoV2VpZ2h0AQEFPE9jd0NhbGxXcm9uZ0VyYQEBBVxNaXNzaW5nU25hcHNob3RNZXRhZGF0YQEBBVhJbnZhbGlkU3VibWlzc2lvbkluZGV4AQEFOENhbGxOb3RBbGxvd2VkAQEFOEZhbGxiYWNrRmFpbGVkAQEFLEJvdW5kTm90TWV0AQEFOFRvb01hbnlXaW5uZXJzAQEFZFByZURpc3BhdGNoRGlmZmVyZW50Um91bmQBAQUkVm90ZXJMaXN0AQIEEExpc3QBAhAkRHVwbGljYXRlAQEFKE5vdEhlYXZpZXIBAQUwTm90SW5TYW1lQmFnAQEFME5vZGVOb3RGb3VuZAEBBTxOb21pbmF0aW9uUG9vbHMBApAwUG9vbE5vdEZvdW5kAQEFSFBvb2xNZW1iZXJOb3RGb3VuZAEBBUhSZXdhcmRQb29sTm90Rm91bmQBAQVAU3ViUG9vbHNOb3RGb3VuZAEBBWRBY2NvdW50QmVsb25nc1RvT3RoZXJQb29sAQEFOEZ1bGx5VW5ib25kaW5nAQEFRE1heFVuYm9uZGluZ0xpbWl0AQEFRENhbm5vdFdpdGhkcmF3QW55AQEFRE1pbmltdW1Cb25kTm90TWV0AQEFME92ZXJmbG93UmlzawEBBTROb3REZXN0cm95aW5nAQEFME5vdE5vbWluYXRvcgEBBVROb3RLaWNrZXJPckRlc3Ryb3lpbmcBAQUcTm90T3BlbgEBBSBNYXhQb29scwEBBThNYXhQb29sTWVtYmVycwEBBURDYW5Ob3RDaGFuZ2VTdGF0ZQEBBVREb2VzTm90SGF2ZVBlcm1pc3Npb24BAQVUTWV0YWRhdGFFeGNlZWRzTWF4TGVuAQEFJERlZmVuc2l2ZQECHGhOb3RFbm91Z2hTcGFjZUluVW5ib25kUG9vbAEBBTBQb29sTm90Rm91bmQBAQVIUmV3YXJkUG9vbE5vdEZvdW5kAQEFQFN1YlBvb2xzTm90Rm91bmQBAQVwQm9uZGVkU3Rhc2hLaWxsZWRQcmVtYXR1cmVseQEBBVREZWxlZ2F0aW9uVW5zdXBwb3J0ZWQBAQU8U2xhc2hOb3RBcHBsaWVkAQEFnFBhcnRpYWxVbmJvbmROb3RBbGxvd2VkUGVybWlzc2lvbmxlc3NseQEBBVxNYXhDb21taXNzaW9uUmVzdHJpY3RlZAEBBWBDb21taXNzaW9uRXhjZWVkc01heGltdW0BAQV4Q29tbWlzc2lvbkV4Y2VlZHNHbG9iYWxNYXhpbXVtAQEFZENvbW1pc3Npb25DaGFuZ2VUaHJvdHRsZWQBAQV4Q29tbWlzc2lvbkNoYW5nZVJhdGVOb3RBbGxvd2VkAQEFTE5vUGVuZGluZ0NvbW1pc3Npb24BAQVYTm9Db21taXNzaW9uQ3VycmVudFNldAEBBSxQb29sSWRJblVzZQEBBTRJbnZhbGlkUG9vbElkAQEFTEJvbmRFeHRyYVJlc3RyaWN0ZWQBAQU8Tm90aGluZ1RvQWRqdXN0AQEFOE5vdGhpbmdUb1NsYXNoAQEFPEFscmVhZHlNaWdyYXRlZAEBBSxOb3RNaWdyYXRlZAEBBTBOb3RTdXBwb3J0ZWQBAQUsRmFzdFVuc3Rha2UBAhg0Tm90Q29udHJvbGxlcgEBBTRBbHJlYWR5UXVldWVkAQEFOE5vdEZ1bGx5Qm9uZGVkAQEFJE5vdFF1ZXVlZAEBBSxBbHJlYWR5SGVhZAEBBThDYWxsTm90QWxsb3dlZAEBBUBQYXJhY2hhaW5zT3JpZ2luAQEFNENvbmZpZ3VyYXRpb24BAgQ8SW52YWxpZE5ld1ZhbHVlAQEFLFBhcmFzU2hhcmVkAQEFNFBhcmFJbmNsdXNpb24BAkhkVmFsaWRhdG9ySW5kZXhPdXRPZkJvdW5kcwEBBVBVbnNjaGVkdWxlZENhbmRpZGF0ZQEBBUBIZWFkRGF0YVRvb0xhcmdlAQEFUFByZW1hdHVyZUNvZGVVcGdyYWRlAQEFPE5ld0NvZGVUb29MYXJnZQEBBVREaXNhbGxvd2VkUmVsYXlQYXJlbnQBAQVESW52YWxpZEFzc2lnbm1lbnQBAQVESW52YWxpZEdyb3VwSW5kZXgBAQVMSW5zdWZmaWNpZW50QmFja2luZwEBBThJbnZhbGlkQmFja2luZwEBBUROb3RDb2xsYXRvclNpZ25lZAEBBWhWYWxpZGF0aW9uRGF0YUhhc2hNaXNtYXRjaAEBBYBJbmNvcnJlY3REb3dud2FyZE1lc3NhZ2VIYW5kbGluZwEBBVRJbnZhbGlkVXB3YXJkTWVzc2FnZXMBAQVgSHJtcFdhdGVybWFya01pc2hhbmRsaW5nAQEFTEludmFsaWRPdXRib3VuZEhybXABAQVkSW52YWxpZFZhbGlkYXRpb25Db2RlSGFzaAEBBUBQYXJhSGVhZE1pc21hdGNoAQEFMFBhcmFJbmhlcmVudAECFGRUb29NYW55SW5jbHVzaW9uSW5oZXJlbnRzAQEFTEludmFsaWRQYXJlbnRIZWFkZXIBAQVISW5oZXJlbnRPdmVyd2VpZ2h0AQEFhENhbmRpZGF0ZXNGaWx0ZXJlZER1cmluZ0V4ZWN1dGlvbgEBBVBVbnNjaGVkdWxlZENhbmRpZGF0ZQEBBTRQYXJhU2NoZWR1bGVyAQEFFFBhcmFzAQI0NE5vdFJlZ2lzdGVyZWQBAQU0Q2Fubm90T25ib2FyZAEBBThDYW5ub3RPZmZib2FyZAEBBTRDYW5ub3RVcGdyYWRlAQEFPENhbm5vdERvd25ncmFkZQEBBVhQdmZDaGVja1N0YXRlbWVudFN0YWxlAQEFXFB2ZkNoZWNrU3RhdGVtZW50RnV0dXJlAQEFhFB2ZkNoZWNrVmFsaWRhdG9ySW5kZXhPdXRPZkJvdW5kcwEBBWBQdmZDaGVja0ludmFsaWRTaWduYXR1cmUBAQVIUHZmQ2hlY2tEb3VibGVWb3RlAQEFWFB2ZkNoZWNrU3ViamVjdEludmFsaWQBAQVEQ2Fubm90VXBncmFkZUNvZGUBAQUsSW52YWxpZENvZGUBAQUsSW5pdGlhbGl6ZXIBAQUMRG1wAQEFEEhybXABAlBUT3BlbkhybXBDaGFubmVsVG9TZWxmAQEFfE9wZW5Icm1wQ2hhbm5lbEludmFsaWRSZWNpcGllbnQBAQVsT3BlbkhybXBDaGFubmVsWmVyb0NhcGFjaXR5AQEFjE9wZW5Icm1wQ2hhbm5lbENhcGFjaXR5RXhjZWVkc0xpbWl0AQEFeE9wZW5Icm1wQ2hhbm5lbFplcm9NZXNzYWdlU2l6ZQEBBZhPcGVuSHJtcENoYW5uZWxNZXNzYWdlU2l6ZUV4Y2VlZHNMaW1pdAEBBXBPcGVuSHJtcENoYW5uZWxBbHJlYWR5RXhpc3RzAQEFfE9wZW5Icm1wQ2hhbm5lbEFscmVhZHlSZXF1ZXN0ZWQBAQVwT3BlbkhybXBDaGFubmVsTGltaXRFeGNlZWRlZAEBBXBBY2NlcHRIcm1wQ2hhbm5lbERvZXNudEV4aXN0AQEFhEFjY2VwdEhybXBDaGFubmVsQWxyZWFkeUNvbmZpcm1lZAEBBXhBY2NlcHRIcm1wQ2hhbm5lbExpbWl0RXhjZWVkZWQBAQVwQ2xvc2VIcm1wQ2hhbm5lbFVuYXV0aG9yaXplZAEBBWxDbG9zZUhybXBDaGFubmVsRG9lc250RXhpc3QBAQV8Q2xvc2VIcm1wQ2hhbm5lbEFscmVhZHlVbmRlcndheQEBBYRDYW5jZWxIcm1wT3BlbkNoYW5uZWxVbmF1dGhvcml6ZWQBAQVoT3BlbkhybXBDaGFubmVsRG9lc250RXhpc3QBAQV8T3BlbkhybXBDaGFubmVsQWxyZWFkeUNvbmZpcm1lZAEBBTBXcm9uZ1dpdG5lc3MBAQVwQ2hhbm5lbENyZWF0aW9uTm90QXV0aG9yaXplZAEBBTxQYXJhU2Vzc2lvbkluZm8BAQU0UGFyYXNEaXNwdXRlcwECJHREdXBsaWNhdGVEaXNwdXRlU3RhdGVtZW50U2V0cwEBBVxBbmNpZW50RGlzcHV0ZVN0YXRlbWVudAEBBWRWYWxpZGF0b3JJbmRleE91dE9mQm91bmRzAQEFQEludmFsaWRTaWduYXR1cmUBAQVIRHVwbGljYXRlU3RhdGVtZW50AQEFSFNpbmdsZVNpZGVkRGlzcHV0ZQEBBTxNYWxpY2lvdXNCYWNrZXIBAQVMTWlzc2luZ0JhY2tpbmdWb3RlcwEBBUhVbmNvbmZpcm1lZERpc3B1dGUBAQU0UGFyYXNTbGFzaGluZwECGGBJbnZhbGlkS2V5T3duZXJzaGlwUHJvb2YBAQVMSW52YWxpZFNlc3Npb25JbmRleAEBBVBJbnZhbGlkQ2FuZGlkYXRlSGFzaAEBBVRJbnZhbGlkVmFsaWRhdG9ySW5kZXgBAQVgVmFsaWRhdG9ySW5kZXhJZE1pc21hdGNoAQEFXER1cGxpY2F0ZVNsYXNoaW5nUmVwb3J0AQEFIE9uRGVtYW5kAQIIJFF1ZXVlRnVsbAEBBXBTcG90UHJpY2VIaWdoZXJUaGFuTWF4QW1vdW50AQEFaENvcmV0aW1lQXNzaWdubWVudFByb3ZpZGVyAQIYQEFzc2lnbm1lbnRzRW1wdHkBAQU0T3ZlclNjaGVkdWxlZAEBBThVbmRlclNjaGVkdWxlZAEBBUBEaXNhbGxvd2VkSW5zZXJ0AQEFPER1cGxpY2F0ZUluc2VydAEBBVBBc3NpZ25tZW50c05vdFNvcnRlZAEBBSRSZWdpc3RyYXIBAjg0Tm90UmVnaXN0ZXJlZAEBBURBbHJlYWR5UmVnaXN0ZXJlZAEBBSBOb3RPd25lcgEBBTBDb2RlVG9vTGFyZ2UBAQVASGVhZERhdGFUb29MYXJnZQEBBTBOb3RQYXJhY2hhaW4BAQU0Tm90UGFyYXRocmVhZAEBBUBDYW5ub3REZXJlZ2lzdGVyAQEFPENhbm5vdERvd25ncmFkZQEBBTRDYW5ub3RVcGdyYWRlAQEFKFBhcmFMb2NrZWQBAQUsTm90UmVzZXJ2ZWQBAQUsSW52YWxpZENvZGUBAQUoQ2Fubm90U3dhcAEBBRRTbG90cwECCERQYXJhTm90T25ib2FyZGluZwEBBShMZWFzZUVycm9yAQEFIEF1Y3Rpb25zAQIcREF1Y3Rpb25JblByb2dyZXNzAQEFRExlYXNlUGVyaW9kSW5QYXN0AQEFRFBhcmFOb3RSZWdpc3RlcmVkAQEFRE5vdEN1cnJlbnRBdWN0aW9uAQEFKE5vdEF1Y3Rpb24BAQUwQXVjdGlvbkVuZGVkAQEFQEFscmVhZHlMZWFzZWRPdXQBAQUkQ3Jvd2Rsb2FuAQJcREZpcnN0UGVyaW9kSW5QYXN0AQEFZEZpcnN0UGVyaW9kVG9vRmFySW5GdXR1cmUBAQVsTGFzdFBlcmlvZEJlZm9yZUZpcnN0UGVyaW9kAQEFYExhc3RQZXJpb2RUb29GYXJJbkZ1dHVyZQEBBTxDYW5ub3RFbmRJblBhc3QBAQVERW5kVG9vRmFySW5GdXR1cmUBAQUgT3ZlcmZsb3cBAQVQQ29udHJpYnV0aW9uVG9vU21hbGwBAQU0SW52YWxpZFBhcmFJZAEBBSxDYXBFeGNlZWRlZAEBBVhDb250cmlidXRpb25QZXJpb2RPdmVyAQEFNEludmFsaWRPcmlnaW4BAQUwTm90UGFyYWNoYWluAQEFLExlYXNlQWN0aXZlAQEFQEJpZE9yTGVhc2VBY3RpdmUBAQUwRnVuZE5vdEVuZGVkAQEFPE5vQ29udHJpYnV0aW9ucwEBBUhOb3RSZWFkeVRvRGlzc29sdmUBAQVASW52YWxpZFNpZ25hdHVyZQEBBTBNZW1vVG9vTGFyZ2UBAQVEQWxyZWFkeUluTmV3UmFpc2UBAQVIVnJmRGVsYXlJblByb2dyZXNzAQEFNE5vTGVhc2VQZXJpb2QBAQUgQ29yZXRpbWUBAgwkTm90QnJva2VyAQEFWFJlcXVlc3RlZEZ1dHVyZVJldmVudWUBAQVMQXNzZXRUcmFuc2ZlckZhaWxlZAEBBUhTdGF0ZVRyaWVNaWdyYXRpb24BAhg8TWF4U2lnbmVkTGltaXRzAQEFKEtleVRvb0xvbmcBAQU4Tm90RW5vdWdoRnVuZHMBAQUoQmFkV2l0bmVzcwEBBWRTaWduZWRNaWdyYXRpb25Ob3RBbGxvd2VkAQEFMEJhZENoaWxkUm9vdAEBBSRYY21QYWxsZXQBAmAsVW5yZWFjaGFibGUBAQUsU2VuZEZhaWx1cmUBAQUgRmlsdGVyZWQBAQVIVW53ZWlnaGFibGVNZXNzYWdlAQEFYERlc3RpbmF0aW9uTm90SW52ZXJ0aWJsZQEBBRRFbXB0eQEBBThDYW5ub3RSZWFuY2hvcgEBBTRUb29NYW55QXNzZXRzAQEFNEludmFsaWRPcmlnaW4BAQUoQmFkVmVyc2lvbgEBBSxCYWRMb2NhdGlvbgEBBThOb1N1YnNjcmlwdGlvbgEBBURBbHJlYWR5U3Vic2NyaWJlZAEBBVhDYW5ub3RDaGVja091dFRlbGVwb3J0AQEFKExvd0JhbGFuY2UBAQUwVG9vTWFueUxvY2tzAQEFTEFjY291bnROb3RTb3ZlcmVpZ24BAQUoRmVlc05vdE1ldAEBBTBMb2NrTm90Rm91bmQBAQUUSW5Vc2UBAQVoSW52YWxpZEFzc2V0VW5rbm93blJlc2VydmUBAQV4SW52YWxpZEFzc2V0VW5zdXBwb3J0ZWRSZXNlcnZlAQEFPFRvb01hbnlSZXNlcnZlcwEBBWBMb2NhbEV4ZWN1dGlvbkluY29tcGxldGUBAQUwTWVzc2FnZVF1ZXVlAQIkLE5vdFJlYXBhYmxlAQEFGE5vUGFnZQEBBSROb01lc3NhZ2UBAQVAQWxyZWFkeVByb2Nlc3NlZAEBBRhRdWV1ZWQBAQVISW5zdWZmaWNpZW50V2VpZ2h0AQEFYFRlbXBvcmFyaWx5VW5wcm9jZXNzYWJsZQEBBSxRdWV1ZVBhdXNlZAEBBUxSZWN1cnNpdmVEaXNhbGxvd2VkAQEFJEFzc2V0UmF0ZQECDEBVbmtub3duQXNzZXRLaW5kAQEFNEFscmVhZHlFeGlzdHMBAQUgT3ZlcmZsb3cBAQUUQmVlZnkBAhBgSW52YWxpZEtleU93bmVyc2hpcFByb29mAQEFYEludmFsaWRFcXVpdm9jYXRpb25Qcm9vZgEBBVhEdXBsaWNhdGVPZmZlbmNlUmVwb3J0AQEFUEludmFsaWRDb25maWd1cmF0aW9uAQEFDE1tcgEBBTBCZWVmeU1tckxlYWYBAQU8UGFyYVN1ZG9XcmFwcGVyAQIkPFBhcmFEb2VzbnRFeGlzdAEBBURQYXJhQWxyZWFkeUV4aXN0cwEBBVRFeGNlZWRzTWF4TWVzc2FnZVNpemUBAQU4Q291bGRudENsZWFudXABAQU0Tm90UGFyYXRocmVhZAEBBTBOb3RQYXJhY2hhaW4BAQU0Q2Fubm90VXBncmFkZQEBBTxDYW5ub3REb3duZ3JhZGUBAQUwVG9vTWFueUNvcmVzAQEFEFN1ZG8BAgQsUmVxdWlyZVN1ZG8BAQUCOBRPdGhlcgEBBTBDYW5ub3RMb29rdXABAQUkQmFkT3JpZ2luAQEFGE1vZHVsZQEC9BhTeXN0ZW0BAiQ8SW52YWxpZFNwZWNOYW1lAQEFaFNwZWNWZXJzaW9uTmVlZHNUb0luY3JlYXNlAQEFdEZhaWxlZFRvRXh0cmFjdFJ1bnRpbWVWZXJzaW9uAQEFTE5vbkRlZmF1bHRDb21wb3NpdGUBAQU8Tm9uWmVyb1JlZkNvdW50AQEFMENhbGxGaWx0ZXJlZAEBBWxNdWx0aUJsb2NrTWlncmF0aW9uc09uZ29pbmcBAQVETm90aGluZ0F1dGhvcml6ZWQBAQUwVW5hdXRob3JpemVkAQEFJFNjaGVkdWxlcgECFEBGYWlsZWRUb1NjaGVkdWxlAQEFIE5vdEZvdW5kAQEFXFRhcmdldEJsb2NrTnVtYmVySW5QYXN0AQEFSFJlc2NoZWR1bGVOb0NoYW5nZQEBBRROYW1lZAEBBSBQcmVpbWFnZQECJBhUb29CaWcBAQUwQWxyZWFkeU5vdGVkAQEFNE5vdEF1dGhvcml6ZWQBAQUgTm90Tm90ZWQBAQUkUmVxdWVzdGVkAQEFME5vdFJlcXVlc3RlZAEBBRxUb29NYW55AQEFGFRvb0ZldwEBBRhOb0Nvc3QBAQUQQmFiZQECEGBJbnZhbGlkRXF1aXZvY2F0aW9uUHJvb2YBAQVgSW52YWxpZEtleU93bmVyc2hpcFByb29mAQEFWER1cGxpY2F0ZU9mZmVuY2VSZXBvcnQBAQVQSW52YWxpZENvbmZpZ3VyYXRpb24BAQUkVGltZXN0YW1wAQEFHEluZGljZXMBAhQsTm90QXNzaWduZWQBAQUgTm90T3duZXIBAQUUSW5Vc2UBAQUsTm90VHJhbnNmZXIBAQUkUGVybWFuZW50AQEFIEJhbGFuY2VzAQIwOFZlc3RpbmdCYWxhbmNlAQEFVExpcXVpZGl0eVJlc3RyaWN0aW9ucwEBBUxJbnN1ZmZpY2llbnRCYWxhbmNlAQEFSEV4aXN0ZW50aWFsRGVwb3NpdAEBBTRFeHBlbmRhYmlsaXR5AQEFXEV4aXN0aW5nVmVzdGluZ1NjaGVkdWxlAQEFLERlYWRBY2NvdW50AQEFPFRvb01hbnlSZXNlcnZlcwEBBTBUb29NYW55SG9sZHMBAQU4VG9vTWFueUZyZWV6ZXMBAQVMSXNzdWFuY2VEZWFjdGl2YXRlZAEBBSREZWx0YVplcm8BAQVIVHJhbnNhY3Rpb25QYXltZW50AQEFKEF1dGhvcnNoaXABAQUcU3Rha2luZwECfDROb3RDb250cm9sbGVyAQEFIE5vdFN0YXNoAQEFNEFscmVhZHlCb25kZWQBAQU0QWxyZWFkeVBhaXJlZAEBBTBFbXB0eVRhcmdldHMBAQU4RHVwbGljYXRlSW5kZXgBAQVESW52YWxpZFNsYXNoSW5kZXgBAQVASW5zdWZmaWNpZW50Qm9uZAEBBTBOb01vcmVDaHVua3MBAQU0Tm9VbmxvY2tDaHVuawEBBTBGdW5kZWRUYXJnZXQBAQVISW52YWxpZEVyYVRvUmV3YXJkAQEFaEludmFsaWROdW1iZXJPZk5vbWluYXRpb25zAQEFSE5vdFNvcnRlZEFuZFVuaXF1ZQEBBThBbHJlYWR5Q2xhaW1lZAEBBSxJbnZhbGlkUGFnZQEBBVRJbmNvcnJlY3RIaXN0b3J5RGVwdGgBAQVYSW5jb3JyZWN0U2xhc2hpbmdTcGFucwEBBSBCYWRTdGF0ZQEBBThUb29NYW55VGFyZ2V0cwEBBSRCYWRUYXJnZXQBAQVAQ2Fubm90Q2hpbGxPdGhlcgEBBURUb29NYW55Tm9taW5hdG9ycwEBBURUb29NYW55VmFsaWRhdG9ycwEBBUBDb21taXNzaW9uVG9vTG93AQEFLEJvdW5kTm90TWV0AQEFUENvbnRyb2xsZXJEZXByZWNhdGVkAQEFTENhbm5vdFJlc3RvcmVMZWRnZXIBAQVsUmV3YXJkRGVzdGluYXRpb25SZXN0cmljdGVkAQEFOE5vdEVub3VnaEZ1bmRzAQEFXFZpcnR1YWxTdGFrZXJOb3RBbGxvd2VkAQEFIE9mZmVuY2VzAQEFKEhpc3RvcmljYWwBAQUcU2Vzc2lvbgECFDBJbnZhbGlkUHJvb2YBAQVcTm9Bc3NvY2lhdGVkVmFsaWRhdG9ySWQBAQU0RHVwbGljYXRlZEtleQEBBRhOb0tleXMBAQUkTm9BY2NvdW50AQEFHEdyYW5kcGEBAhwsUGF1c2VGYWlsZWQBAQUwUmVzdW1lRmFpbGVkAQEFNENoYW5nZVBlbmRpbmcBAQUcVG9vU29vbgEBBWBJbnZhbGlkS2V5T3duZXJzaGlwUHJvb2YBAQVgSW52YWxpZEVxdWl2b2NhdGlvblByb29mAQEFWER1cGxpY2F0ZU9mZmVuY2VSZXBvcnQBAQVIQXV0aG9yaXR5RGlzY292ZXJ5AQEFIFRyZWFzdXJ5AQIsMEludmFsaWRJbmRleAEBBUBUb29NYW55QXBwcm92YWxzAQEFWEluc3VmZmljaWVudFBlcm1pc3Npb24BAQVMUHJvcG9zYWxOb3RBcHByb3ZlZAEBBVhGYWlsZWRUb0NvbnZlcnRCYWxhbmNlAQEFMFNwZW5kRXhwaXJlZAEBBSxFYXJseVBheW91dAEBBUBBbHJlYWR5QXR0ZW1wdGVkAQEFLFBheW91dEVycm9yAQEFME5vdEF0dGVtcHRlZAEBBTBJbmNvbmNsdXNpdmUBAQVAQ29udmljdGlvblZvdGluZwECMChOb3RPbmdvaW5nAQEFIE5vdFZvdGVyAQEFME5vUGVybWlzc2lvbgEBBTxOb1Blcm1pc3Npb25ZZXQBAQVEQWxyZWFkeURlbGVnYXRpbmcBAQU0QWxyZWFkeVZvdGluZwEBBURJbnN1ZmZpY2llbnRGdW5kcwEBBTROb3REZWxlZ2F0aW5nAQEFIE5vbnNlbnNlAQEFPE1heFZvdGVzUmVhY2hlZAEBBSxDbGFzc05lZWRlZAEBBSBCYWRDbGFzcwEBBSRSZWZlcmVuZGEBAjgoTm90T25nb2luZwEBBShIYXNEZXBvc2l0AQEFIEJhZFRyYWNrAQEFEEZ1bGwBAQUoUXVldWVFbXB0eQEBBTRCYWRSZWZlcmVuZHVtAQEFLE5vdGhpbmdUb0RvAQEFHE5vVHJhY2sBAQUoVW5maW5pc2hlZAEBBTBOb1Blcm1pc3Npb24BAQUkTm9EZXBvc2l0AQEFJEJhZFN0YXR1cwEBBUBQcmVpbWFnZU5vdEV4aXN0AQEFhFByZWltYWdlU3RvcmVkV2l0aERpZmZlcmVudExlbmd0aAEBBRxPcmlnaW5zAQEFJFdoaXRlbGlzdAECFExVbmF2YWlsYWJsZVByZUltYWdlAQEFPFVuZGVjb2RhYmxlQ2FsbAEBBWBJbnZhbGlkQ2FsbFdlaWdodFdpdG5lc3MBAQVQQ2FsbElzTm90V2hpdGVsaXN0ZWQBAQVYQ2FsbEFscmVhZHlXaGl0ZWxpc3RlZAEBBShQYXJhbWV0ZXJzAQEFGENsYWltcwECGGBJbnZhbGlkRXRoZXJldW1TaWduYXR1cmUBAQVAU2lnbmVySGFzTm9DbGFpbQEBBUBTZW5kZXJIYXNOb0NsYWltAQEFMFBvdFVuZGVyZmxvdwEBBUBJbnZhbGlkU3RhdGVtZW50AQEFTFZlc3RlZEJhbGFuY2VFeGlzdHMBAQUcVmVzdGluZwECFChOb3RWZXN0aW5nAQEFVEF0TWF4VmVzdGluZ1NjaGVkdWxlcwEBBSRBbW91bnRMb3cBAQVgU2NoZWR1bGVJbmRleE91dE9mQm91bmRzAQEFVEludmFsaWRTY2hlZHVsZVBhcmFtcwEBBRxVdGlsaXR5AQIEMFRvb01hbnlDYWxscwEBBRRQcm94eQECIBxUb29NYW55AQEFIE5vdEZvdW5kAQEFIE5vdFByb3h5AQEFLFVucHJveHlhYmxlAQEFJER1cGxpY2F0ZQEBBTBOb1Blcm1pc3Npb24BAQUsVW5hbm5vdW5jZWQBAQUsTm9TZWxmUHJveHkBAQUgTXVsdGlzaWcBAjhATWluaW11bVRocmVzaG9sZAEBBTxBbHJlYWR5QXBwcm92ZWQBAQVETm9BcHByb3ZhbHNOZWVkZWQBAQVEVG9vRmV3U2lnbmF0b3JpZXMBAQVIVG9vTWFueVNpZ25hdG9yaWVzAQEFVFNpZ25hdG9yaWVzT3V0T2ZPcmRlcgEBBUxTZW5kZXJJblNpZ25hdG9yaWVzAQEFIE5vdEZvdW5kAQEFIE5vdE93bmVyAQEFLE5vVGltZXBvaW50AQEFOFdyb25nVGltZXBvaW50AQEFTFVuZXhwZWN0ZWRUaW1lcG9pbnQBAQU8TWF4V2VpZ2h0VG9vTG93AQEFNEFscmVhZHlTdG9yZWQBAQUgQm91bnRpZXMBAixwSW5zdWZmaWNpZW50UHJvcG9zZXJzQmFsYW5jZQEBBTBJbnZhbGlkSW5kZXgBAQUwUmVhc29uVG9vQmlnAQEFQFVuZXhwZWN0ZWRTdGF0dXMBAQU4UmVxdWlyZUN1cmF0b3IBAQUwSW52YWxpZFZhbHVlAQEFKEludmFsaWRGZWUBAQU0UGVuZGluZ1BheW91dAEBBSRQcmVtYXR1cmUBAQVQSGFzQWN0aXZlQ2hpbGRCb3VudHkBAQU0VG9vTWFueVF1ZXVlZAEBBTRDaGlsZEJvdW50aWVzAQIMVFBhcmVudEJvdW50eU5vdEFjdGl2ZQEBBWRJbnN1ZmZpY2llbnRCb3VudHlCYWxhbmNlAQEFUFRvb01hbnlDaGlsZEJvdW50aWVzAQEFaEVsZWN0aW9uUHJvdmlkZXJNdWx0aVBoYXNlAQI8aFByZURpc3BhdGNoRWFybHlTdWJtaXNzaW9uAQEFbFByZURpc3BhdGNoV3JvbmdXaW5uZXJDb3VudAEBBWRQcmVEaXNwYXRjaFdlYWtTdWJtaXNzaW9uAQEFPFNpZ25lZFF1ZXVlRnVsbAEBBVhTaWduZWRDYW5ub3RQYXlEZXBvc2l0AQEFUFNpZ25lZEludmFsaWRXaXRuZXNzAQEFTFNpZ25lZFRvb011Y2hXZWlnaHQBAQU8T2N3Q2FsbFdyb25nRXJhAQEFXE1pc3NpbmdTbmFwc2hvdE1ldGFkYXRhAQEFWEludmFsaWRTdWJtaXNzaW9uSW5kZXgBAQU4Q2FsbE5vdEFsbG93ZWQBAQU4RmFsbGJhY2tGYWlsZWQBAQUsQm91bmROb3RNZXQBAQU4VG9vTWFueVdpbm5lcnMBAQVkUHJlRGlzcGF0Y2hEaWZmZXJlbnRSb3VuZAEBBSRWb3Rlckxpc3QBAgQQTGlzdAECECREdXBsaWNhdGUBAQUoTm90SGVhdmllcgEBBTBOb3RJblNhbWVCYWcBAQUwTm9kZU5vdEZvdW5kAQEFPE5vbWluYXRpb25Qb29scwECkDBQb29sTm90Rm91bmQBAQVIUG9vbE1lbWJlck5vdEZvdW5kAQEFSFJld2FyZFBvb2xOb3RGb3VuZAEBBUBTdWJQb29sc05vdEZvdW5kAQEFZEFjY291bnRCZWxvbmdzVG9PdGhlclBvb2wBAQU4RnVsbHlVbmJvbmRpbmcBAQVETWF4VW5ib25kaW5nTGltaXQBAQVEQ2Fubm90V2l0aGRyYXdBbnkBAQVETWluaW11bUJvbmROb3RNZXQBAQUwT3ZlcmZsb3dSaXNrAQEFNE5vdERlc3Ryb3lpbmcBAQUwTm90Tm9taW5hdG9yAQEFVE5vdEtpY2tlck9yRGVzdHJveWluZwEBBRxOb3RPcGVuAQEFIE1heFBvb2xzAQEFOE1heFBvb2xNZW1iZXJzAQEFRENhbk5vdENoYW5nZVN0YXRlAQEFVERvZXNOb3RIYXZlUGVybWlzc2lvbgEBBVRNZXRhZGF0YUV4Y2VlZHNNYXhMZW4BAQUkRGVmZW5zaXZlAQIcaE5vdEVub3VnaFNwYWNlSW5VbmJvbmRQb29sAQEFMFBvb2xOb3RGb3VuZAEBBUhSZXdhcmRQb29sTm90Rm91bmQBAQVAU3ViUG9vbHNOb3RGb3VuZAEBBXBCb25kZWRTdGFzaEtpbGxlZFByZW1hdHVyZWx5AQEFVERlbGVnYXRpb25VbnN1cHBvcnRlZAEBBTxTbGFzaE5vdEFwcGxpZWQBAQWcUGFydGlhbFVuYm9uZE5vdEFsbG93ZWRQZXJtaXNzaW9ubGVzc2x5AQEFXE1heENvbW1pc3Npb25SZXN0cmljdGVkAQEFYENvbW1pc3Npb25FeGNlZWRzTWF4aW11bQEBBXhDb21taXNzaW9uRXhjZWVkc0dsb2JhbE1heGltdW0BAQVkQ29tbWlzc2lvbkNoYW5nZVRocm90dGxlZAEBBXhDb21taXNzaW9uQ2hhbmdlUmF0ZU5vdEFsbG93ZWQBAQVMTm9QZW5kaW5nQ29tbWlzc2lvbgEBBVhOb0NvbW1pc3Npb25DdXJyZW50U2V0AQEFLFBvb2xJZEluVXNlAQEFNEludmFsaWRQb29sSWQBAQVMQm9uZEV4dHJhUmVzdHJpY3RlZAEBBTxOb3RoaW5nVG9BZGp1c3QBAQU4Tm90aGluZ1RvU2xhc2gBAQU8QWxyZWFkeU1pZ3JhdGVkAQEFLE5vdE1pZ3JhdGVkAQEFME5vdFN1cHBvcnRlZAEBBSxGYXN0VW5zdGFrZQECGDROb3RDb250cm9sbGVyAQEFNEFscmVhZHlRdWV1ZWQBAQU4Tm90RnVsbHlCb25kZWQBAQUkTm90UXVldWVkAQEFLEFscmVhZHlIZWFkAQEFOENhbGxOb3RBbGxvd2VkAQEFQFBhcmFjaGFpbnNPcmlnaW4BAQU0Q29uZmlndXJhdGlvbgECBDxJbnZhbGlkTmV3VmFsdWUBAQUsUGFyYXNTaGFyZWQBAQU0UGFyYUluY2x1c2lvbgECSGRWYWxpZGF0b3JJbmRleE91dE9mQm91bmRzAQEFUFVuc2NoZWR1bGVkQ2FuZGlkYXRlAQEFQEhlYWREYXRhVG9vTGFyZ2UBAQVQUHJlbWF0dXJlQ29kZVVwZ3JhZGUBAQU8TmV3Q29kZVRvb0xhcmdlAQEFVERpc2FsbG93ZWRSZWxheVBhcmVudAEBBURJbnZhbGlkQXNzaWdubWVudAEBBURJbnZhbGlkR3JvdXBJbmRleAEBBUxJbnN1ZmZpY2llbnRCYWNraW5nAQEFOEludmFsaWRCYWNraW5nAQEFRE5vdENvbGxhdG9yU2lnbmVkAQEFaFZhbGlkYXRpb25EYXRhSGFzaE1pc21hdGNoAQEFgEluY29ycmVjdERvd253YXJkTWVzc2FnZUhhbmRsaW5nAQEFVEludmFsaWRVcHdhcmRNZXNzYWdlcwEBBWBIcm1wV2F0ZXJtYXJrTWlzaGFuZGxpbmcBAQVMSW52YWxpZE91dGJvdW5kSHJtcAEBBWRJbnZhbGlkVmFsaWRhdGlvbkNvZGVIYXNoAQEFQFBhcmFIZWFkTWlzbWF0Y2gBAQUwUGFyYUluaGVyZW50AQIUZFRvb01hbnlJbmNsdXNpb25JbmhlcmVudHMBAQVMSW52YWxpZFBhcmVudEhlYWRlcgEBBUhJbmhlcmVudE92ZXJ3ZWlnaHQBAQWEQ2FuZGlkYXRlc0ZpbHRlcmVkRHVyaW5nRXhlY3V0aW9uAQEFUFVuc2NoZWR1bGVkQ2FuZGlkYXRlAQEFNFBhcmFTY2hlZHVsZXIBAQUUUGFyYXMBAjQ0Tm90UmVnaXN0ZXJlZAEBBTRDYW5ub3RPbmJvYXJkAQEFOENhbm5vdE9mZmJvYXJkAQEFNENhbm5vdFVwZ3JhZGUBAQU8Q2Fubm90RG93bmdyYWRlAQEFWFB2ZkNoZWNrU3RhdGVtZW50U3RhbGUBAQVcUHZmQ2hlY2tTdGF0ZW1lbnRGdXR1cmUBAQWEUHZmQ2hlY2tWYWxpZGF0b3JJbmRleE91dE9mQm91bmRzAQEFYFB2ZkNoZWNrSW52YWxpZFNpZ25hdHVyZQEBBUhQdmZDaGVja0RvdWJsZVZvdGUBAQVYUHZmQ2hlY2tTdWJqZWN0SW52YWxpZAEBBURDYW5ub3RVcGdyYWRlQ29kZQEBBSxJbnZhbGlkQ29kZQEBBSxJbml0aWFsaXplcgEBBQxEbXABAQUQSHJtcAECUFRPcGVuSHJtcENoYW5uZWxUb1NlbGYBAQV8T3BlbkhybXBDaGFubmVsSW52YWxpZFJlY2lwaWVudAEBBWxPcGVuSHJtcENoYW5uZWxaZXJvQ2FwYWNpdHkBAQWMT3BlbkhybXBDaGFubmVsQ2FwYWNpdHlFeGNlZWRzTGltaXQBAQV4T3BlbkhybXBDaGFubmVsWmVyb01lc3NhZ2VTaXplAQEFmE9wZW5Icm1wQ2hhbm5lbE1lc3NhZ2VTaXplRXhjZWVkc0xpbWl0AQEFcE9wZW5Icm1wQ2hhbm5lbEFscmVhZHlFeGlzdHMBAQV8T3BlbkhybXBDaGFubmVsQWxyZWFkeVJlcXVlc3RlZAEBBXBPcGVuSHJtcENoYW5uZWxMaW1pdEV4Y2VlZGVkAQEFcEFjY2VwdEhybXBDaGFubmVsRG9lc250RXhpc3QBAQWEQWNjZXB0SHJtcENoYW5uZWxBbHJlYWR5Q29uZmlybWVkAQEFeEFjY2VwdEhybXBDaGFubmVsTGltaXRFeGNlZWRlZAEBBXBDbG9zZUhybXBDaGFubmVsVW5hdXRob3JpemVkAQEFbENsb3NlSHJtcENoYW5uZWxEb2VzbnRFeGlzdAEBBXxDbG9zZUhybXBDaGFubmVsQWxyZWFkeVVuZGVyd2F5AQEFhENhbmNlbEhybXBPcGVuQ2hhbm5lbFVuYXV0aG9yaXplZAEBBWhPcGVuSHJtcENoYW5uZWxEb2VzbnRFeGlzdAEBBXxPcGVuSHJtcENoYW5uZWxBbHJlYWR5Q29uZmlybWVkAQEFMFdyb25nV2l0bmVzcwEBBXBDaGFubmVsQ3JlYXRpb25Ob3RBdXRob3JpemVkAQEFPFBhcmFTZXNzaW9uSW5mbwEBBTRQYXJhc0Rpc3B1dGVzAQIkdER1cGxpY2F0ZURpc3B1dGVTdGF0ZW1lbnRTZXRzAQEFXEFuY2llbnREaXNwdXRlU3RhdGVtZW50AQEFZFZhbGlkYXRvckluZGV4T3V0T2ZCb3VuZHMBAQVASW52YWxpZFNpZ25hdHVyZQEBBUhEdXBsaWNhdGVTdGF0ZW1lbnQBAQVIU2luZ2xlU2lkZWREaXNwdXRlAQEFPE1hbGljaW91c0JhY2tlcgEBBUxNaXNzaW5nQmFja2luZ1ZvdGVzAQEFSFVuY29uZmlybWVkRGlzcHV0ZQEBBTRQYXJhc1NsYXNoaW5nAQIYYEludmFsaWRLZXlPd25lcnNoaXBQcm9vZgEBBUxJbnZhbGlkU2Vzc2lvbkluZGV4AQEFUEludmFsaWRDYW5kaWRhdGVIYXNoAQEFVEludmFsaWRWYWxpZGF0b3JJbmRleAEBBWBWYWxpZGF0b3JJbmRleElkTWlzbWF0Y2gBAQVcRHVwbGljYXRlU2xhc2hpbmdSZXBvcnQBAQUgT25EZW1hbmQBAggkUXVldWVGdWxsAQEFcFNwb3RQcmljZUhpZ2hlclRoYW5NYXhBbW91bnQBAQVoQ29yZXRpbWVBc3NpZ25tZW50UHJvdmlkZXIBAhhAQXNzaWdubWVudHNFbXB0eQEBBTRPdmVyU2NoZWR1bGVkAQEFOFVuZGVyU2NoZWR1bGVkAQEFQERpc2FsbG93ZWRJbnNlcnQBAQU8RHVwbGljYXRlSW5zZXJ0AQEFUEFzc2lnbm1lbnRzTm90U29ydGVkAQEFJFJlZ2lzdHJhcgECODROb3RSZWdpc3RlcmVkAQEFREFscmVhZHlSZWdpc3RlcmVkAQEFIE5vdE93bmVyAQEFMENvZGVUb29MYXJnZQEBBUBIZWFkRGF0YVRvb0xhcmdlAQEFME5vdFBhcmFjaGFpbgEBBTROb3RQYXJhdGhyZWFkAQEFQENhbm5vdERlcmVnaXN0ZXIBAQU8Q2Fubm90RG93bmdyYWRlAQEFNENhbm5vdFVwZ3JhZGUBAQUoUGFyYUxvY2tlZAEBBSxOb3RSZXNlcnZlZAEBBSxJbnZhbGlkQ29kZQEBBShDYW5ub3RTd2FwAQEFFFNsb3RzAQIIRFBhcmFOb3RPbmJvYXJkaW5nAQEFKExlYXNlRXJyb3IBAQUgQXVjdGlvbnMBAhxEQXVjdGlvbkluUHJvZ3Jlc3MBAQVETGVhc2VQZXJpb2RJblBhc3QBAQVEUGFyYU5vdFJlZ2lzdGVyZWQBAQVETm90Q3VycmVudEF1Y3Rpb24BAQUoTm90QXVjdGlvbgEBBTBBdWN0aW9uRW5kZWQBAQVAQWxyZWFkeUxlYXNlZE91dAEBBSRDcm93ZGxvYW4BAlxERmlyc3RQZXJpb2RJblBhc3QBAQVkRmlyc3RQZXJpb2RUb29GYXJJbkZ1dHVyZQEBBWxMYXN0UGVyaW9kQmVmb3JlRmlyc3RQZXJpb2QBAQVgTGFzdFBlcmlvZFRvb0ZhckluRnV0dXJlAQEFPENhbm5vdEVuZEluUGFzdAEBBURFbmRUb29GYXJJbkZ1dHVyZQEBBSBPdmVyZmxvdwEBBVBDb250cmlidXRpb25Ub29TbWFsbAEBBTRJbnZhbGlkUGFyYUlkAQEFLENhcEV4Y2VlZGVkAQEFWENvbnRyaWJ1dGlvblBlcmlvZE92ZXIBAQU0SW52YWxpZE9yaWdpbgEBBTBOb3RQYXJhY2hhaW4BAQUsTGVhc2VBY3RpdmUBAQVAQmlkT3JMZWFzZUFjdGl2ZQEBBTBGdW5kTm90RW5kZWQBAQU8Tm9Db250cmlidXRpb25zAQEFSE5vdFJlYWR5VG9EaXNzb2x2ZQEBBUBJbnZhbGlkU2lnbmF0dXJlAQEFME1lbW9Ub29MYXJnZQEBBURBbHJlYWR5SW5OZXdSYWlzZQEBBUhWcmZEZWxheUluUHJvZ3Jlc3MBAQU0Tm9MZWFzZVBlcmlvZAEBBSBDb3JldGltZQECDCROb3RCcm9rZXIBAQVYUmVxdWVzdGVkRnV0dXJlUmV2ZW51ZQEBBUxBc3NldFRyYW5zZmVyRmFpbGVkAQEFSFN0YXRlVHJpZU1pZ3JhdGlvbgECGDxNYXhTaWduZWRMaW1pdHMBAQUoS2V5VG9vTG9uZwEBBThOb3RFbm91Z2hGdW5kcwEBBShCYWRXaXRuZXNzAQEFZFNpZ25lZE1pZ3JhdGlvbk5vdEFsbG93ZWQBAQUwQmFkQ2hpbGRSb290AQEFJFhjbVBhbGxldAECYCxVbnJlYWNoYWJsZQEBBSxTZW5kRmFpbHVyZQEBBSBGaWx0ZXJlZAEBBUhVbndlaWdoYWJsZU1lc3NhZ2UBAQVgRGVzdGluYXRpb25Ob3RJbnZlcnRpYmxlAQEFFEVtcHR5AQEFOENhbm5vdFJlYW5jaG9yAQEFNFRvb01hbnlBc3NldHMBAQU0SW52YWxpZE9yaWdpbgEBBShCYWRWZXJzaW9uAQEFLEJhZExvY2F0aW9uAQEFOE5vU3Vic2NyaXB0aW9uAQEFREFscmVhZHlTdWJzY3JpYmVkAQEFWENhbm5vdENoZWNrT3V0VGVsZXBvcnQBAQUoTG93QmFsYW5jZQEBBTBUb29NYW55TG9ja3MBAQVMQWNjb3VudE5vdFNvdmVyZWlnbgEBBShGZWVzTm90TWV0AQEFMExvY2tOb3RGb3VuZAEBBRRJblVzZQEBBWhJbnZhbGlkQXNzZXRVbmtub3duUmVzZXJ2ZQEBBXhJbnZhbGlkQXNzZXRVbnN1cHBvcnRlZFJlc2VydmUBAQU8VG9vTWFueVJlc2VydmVzAQEFYExvY2FsRXhlY3V0aW9uSW5jb21wbGV0ZQEBBTBNZXNzYWdlUXVldWUBAiQsTm90UmVhcGFibGUBAQUYTm9QYWdlAQEFJE5vTWVzc2FnZQEBBUBBbHJlYWR5UHJvY2Vzc2VkAQEFGFF1ZXVlZAEBBUhJbnN1ZmZpY2llbnRXZWlnaHQBAQVgVGVtcG9yYXJpbHlVbnByb2Nlc3NhYmxlAQEFLFF1ZXVlUGF1c2VkAQEFTFJlY3Vyc2l2ZURpc2FsbG93ZWQBAQUkQXNzZXRSYXRlAQIMQFVua25vd25Bc3NldEtpbmQBAQU0QWxyZWFkeUV4aXN0cwEBBSBPdmVyZmxvdwEBBRRCZWVmeQECEGBJbnZhbGlkS2V5T3duZXJzaGlwUHJvb2YBAQVgSW52YWxpZEVxdWl2b2NhdGlvblByb29mAQEFWER1cGxpY2F0ZU9mZmVuY2VSZXBvcnQBAQVQSW52YWxpZENvbmZpZ3VyYXRpb24BAQUMTW1yAQEFMEJlZWZ5TW1yTGVhZgEBBTxQYXJhU3Vkb1dyYXBwZXIBAiQ8UGFyYURvZXNudEV4aXN0AQEFRFBhcmFBbHJlYWR5RXhpc3RzAQEFVEV4Y2VlZHNNYXhNZXNzYWdlU2l6ZQEBBThDb3VsZG50Q2xlYW51cAEBBTROb3RQYXJhdGhyZWFkAQEFME5vdFBhcmFjaGFpbgEBBTRDYW5ub3RVcGdyYWRlAQEFPENhbm5vdERvd25ncmFkZQEBBTBUb29NYW55Q29yZXMBAQUQU3VkbwECBCxSZXF1aXJlU3VkbwEBBURDb25zdW1lclJlbWFpbmluZwEBBSxOb1Byb3ZpZGVycwEBBUBUb29NYW55Q29uc3VtZXJzAQEFFFRva2VuAQIoQEZ1bmRzVW5hdmFpbGFibGUBAQUwT25seVByb3ZpZGVyAQEFMEJlbG93TWluaW11bQEBBTBDYW5ub3RDcmVhdGUBAQUwVW5rbm93bkFzc2V0AQEFGEZyb3plbgEBBSxVbnN1cHBvcnRlZAEBBUBDYW5ub3RDcmVhdGVIb2xkAQEFNE5vdEV4cGVuZGFibGUBAQUcQmxvY2tlZAEBBShBcml0aG1ldGljAQIMJFVuZGVyZmxvdwEBBSBPdmVyZmxvdwEBBThEaXZpc2lvbkJ5WmVybwEBBTRUcmFuc2FjdGlvbmFsAQIIMExpbWl0UmVhY2hlZAEBBRxOb0xheWVyAQEFJEV4aGF1c3RlZAEBBShDb3JydXB0aW9uAQEFLFVuYXZhaWxhYmxlAQEFOFJvb3ROb3RBbGxvd2VkAQEFAhxARXh0cmluc2ljU3VjY2VzcwEABDRkaXNwYXRjaF9pbmZvQDxFeHRyaW5zaWNGYWlsZWQBAAg4ZGlzcGF0Y2hfZXJyb3IpDTRkaXNwYXRjaF9pbmZvQCxDb2RlVXBkYXRlZAEBBShOZXdBY2NvdW50AQAEHGFjY291bnQANEtpbGxlZEFjY291bnQBAAQcYWNjb3VudAAgUmVtYXJrZWQBAAgYc2VuZGVyABBoYXNoIERVcGdyYWRlQXV0aG9yaXplZAEACCRjb2RlX2hhc2ggNGNoZWNrX3ZlcnNpb24UBxUBKQ0CJCRTY2hlZHVsZWQBAAgQd2hlbgQUaW5kZXgEIENhbmNlbGVkAQAIEHdoZW4EFGluZGV4BChEaXNwYXRjaGVkAQAMEHRhc2sNAQhpZBEBGHJlc3VsdDENIFJldHJ5U2V0AQAQEHRhc2sNAQhpZBEBGHBlcmlvZAQccmV0cmllcwQ4UmV0cnlDYW5jZWxsZWQBAAgQdGFzaw0BCGlkEQE8Q2FsbFVuYXZhaWxhYmxlAQAIEHRhc2sNAQhpZBEBOFBlcmlvZGljRmFpbGVkAQAIEHRhc2sNAQhpZBEBLFJldHJ5RmFpbGVkAQAIEHRhc2sNAQhpZBEBVFBlcm1hbmVudGx5T3ZlcndlaWdodAEACBB0YXNrDQEIaWQRAQAIJHBvc3RfaW5mb7UBFGVycm9yKQ0HtQE5DQIMPENhbGxXaGl0ZWxpc3RlZAEABCRjYWxsX2hhc2ggWFdoaXRlbGlzdGVkQ2FsbFJlbW92ZWQBAAQkY2FsbF9oYXNoIGRXaGl0ZWxpc3RlZENhbGxEaXNwYXRjaGVkAQAIJGNhbGxfaGFzaCAYcmVzdWx0PQ0CGEBCYXRjaEludGVycnVwdGVkAQAIFGluZGV4BBRlcnJvcikNOEJhdGNoQ29tcGxldGVkAQEFYEJhdGNoQ29tcGxldGVkV2l0aEVycm9ycwEBBTRJdGVtQ29tcGxldGVkAQEFKEl0ZW1GYWlsZWQBAAQUZXJyb3IpDTBEaXNwYXRjaGVkQXMBAAQYcmVzdWx0MQ0CFDRQcm94eUV4ZWN1dGVkAQAEGHJlc3VsdDENLFB1cmVDcmVhdGVkAQAQEHB1cmUADHdobwAocHJveHlfdHlwZekBUGRpc2FtYmlndWF0aW9uX2luZGV4BCRBbm5vdW5jZWQBAAwQcmVhbAAUcHJveHkAJGNhbGxfaGFzaCAoUHJveHlBZGRlZAEAECRkZWxlZ2F0b3IAJGRlbGVnYXRlZQAocHJveHlfdHlwZekBFGRlbGF5BDBQcm94eVJlbW92ZWQBABAkZGVsZWdhdG9yACRkZWxlZ2F0ZWUAKHByb3h5X3R5cGXpARRkZWxheQQCECxOZXdNdWx0aXNpZwEADCRhcHByb3ZpbmcAIG11bHRpc2lnACRjYWxsX2hhc2ggQE11bHRpc2lnQXBwcm92YWwBABAkYXBwcm92aW5nACR0aW1lcG9pbnTxASBtdWx0aXNpZwAkY2FsbF9oYXNoIEBNdWx0aXNpZ0V4ZWN1dGVkAQAUJGFwcHJvdmluZwAkdGltZXBvaW508QEgbXVsdGlzaWcAJGNhbGxfaGFzaCAYcmVzdWx0MQ1ETXVsdGlzaWdDYW5jZWxsZWQBABAoY2FuY2VsbGluZwAkdGltZXBvaW508QEgbXVsdGlzaWcAJGNhbGxfaGFzaCACFCBVbnN0YWtlZAEACBRzdGFzaAAYcmVzdWx0MQ0cU2xhc2hlZAEACBRzdGFzaAAYYW1vdW50CDBCYXRjaENoZWNrZWQBAAQQZXJhczkCNEJhdGNoRmluaXNoZWQBAAQQc2l6ZQQ0SW50ZXJuYWxFcnJvcgEBBQIoHENyZWF0ZWQBAAQccGFyYV9pZAQsQ29udHJpYnV0ZWQBAAwMd2hvAChmdW5kX2luZGV4BBhhbW91bnQIIFdpdGhkcmV3AQAMDHdobwAoZnVuZF9pbmRleAQYYW1vdW50CERQYXJ0aWFsbHlSZWZ1bmRlZAEABBxwYXJhX2lkBCxBbGxSZWZ1bmRlZAEABBxwYXJhX2lkBCREaXNzb2x2ZWQBAAQccGFyYV9pZAQ8SGFuZGxlQmlkUmVzdWx0AQAIHHBhcmFfaWQEGHJlc3VsdDENGEVkaXRlZAEABBxwYXJhX2lkBCxNZW1vVXBkYXRlZAEADAx3aG8AHHBhcmFfaWQEEG1lbW8kPEFkZGVkVG9OZXdSYWlzZQEABBxwYXJhX2lkBAIQFFN1ZGlkAQAELHN1ZG9fcmVzdWx0MQ0oS2V5Q2hhbmdlZAEACAxvbGQFAgxuZXcAKEtleVJlbW92ZWQBAQUoU3Vkb0FzRG9uZQEABCxzdWRvX3Jlc3VsdDENAqQYU3lzdGVtAQIcQEV4dHJpbnNpY1N1Y2Nlc3MBAAQ0ZGlzcGF0Y2hfaW5mb0A8RXh0cmluc2ljRmFpbGVkAQAIOGRpc3BhdGNoX2Vycm9yKQ00ZGlzcGF0Y2hfaW5mb0AsQ29kZVVwZGF0ZWQBAQUoTmV3QWNjb3VudAEABBxhY2NvdW50ADRLaWxsZWRBY2NvdW50AQAEHGFjY291bnQAIFJlbWFya2VkAQAIGHNlbmRlcgAQaGFzaCBEVXBncmFkZUF1dGhvcml6ZWQBAAgkY29kZV9oYXNoIDRjaGVja192ZXJzaW9uFCRTY2hlZHVsZXIBAiQkU2NoZWR1bGVkAQAIEHdoZW4EFGluZGV4BCBDYW5jZWxlZAEACBB3aGVuBBRpbmRleAQoRGlzcGF0Y2hlZAEADBB0YXNrDQEIaWQRARhyZXN1bHQxDSBSZXRyeVNldAEAEBB0YXNrDQEIaWQRARhwZXJpb2QEHHJldHJpZXMEOFJldHJ5Q2FuY2VsbGVkAQAIEHRhc2sNAQhpZBEBPENhbGxVbmF2YWlsYWJsZQEACBB0YXNrDQEIaWQRAThQZXJpb2RpY0ZhaWxlZAEACBB0YXNrDQEIaWQRASxSZXRyeUZhaWxlZAEACBB0YXNrDQEIaWQRAVRQZXJtYW5lbnRseU92ZXJ3ZWlnaHQBAAgQdGFzaw0BCGlkEQEgUHJlaW1hZ2UBAgwUTm90ZWQBAAQQaGFzaCAkUmVxdWVzdGVkAQAEEGhhc2ggHENsZWFyZWQBAAQQaGFzaCAcSW5kaWNlcwECDDRJbmRleEFzc2lnbmVkAQAIDHdobwAUaW5kZXgEKEluZGV4RnJlZWQBAAQUaW5kZXgELEluZGV4RnJvemVuAQAIFGluZGV4BAx3aG8AIEJhbGFuY2VzAQJYHEVuZG93ZWQBAAgcYWNjb3VudAAwZnJlZV9iYWxhbmNlCCBEdXN0TG9zdAEACBxhY2NvdW50ABhhbW91bnQIIFRyYW5zZmVyAQAMEGZyb20ACHRvABhhbW91bnQIKEJhbGFuY2VTZXQBAAgMd2hvABBmcmVlCCBSZXNlcnZlZAEACAx3aG8AGGFtb3VudAgoVW5yZXNlcnZlZAEACAx3aG8AGGFtb3VudAhIUmVzZXJ2ZVJlcGF0cmlhdGVkAQAQEGZyb20ACHRvABhhbW91bnQISGRlc3RpbmF0aW9uX3N0YXR1cykBHERlcG9zaXQBAAgMd2hvABhhbW91bnQIIFdpdGhkcmF3AQAIDHdobwAYYW1vdW50CBxTbGFzaGVkAQAIDHdobwAYYW1vdW50CBhNaW50ZWQBAAgMd2hvABhhbW91bnQIGEJ1cm5lZAEACAx3aG8AGGFtb3VudAgkU3VzcGVuZGVkAQAIDHdobwAYYW1vdW50CCBSZXN0b3JlZAEACAx3aG8AGGFtb3VudAggVXBncmFkZWQBAAQMd2hvABhJc3N1ZWQBAAQYYW1vdW50CCRSZXNjaW5kZWQBAAQYYW1vdW50CBhMb2NrZWQBAAgMd2hvABhhbW91bnQIIFVubG9ja2VkAQAIDHdobwAYYW1vdW50CBhGcm96ZW4BAAgMd2hvABhhbW91bnQIGFRoYXdlZAEACAx3aG8AGGFtb3VudAhMVG90YWxJc3N1YW5jZUZvcmNlZAEACAxvbGQIDG5ldwhIVHJhbnNhY3Rpb25QYXltZW50AQIESFRyYW5zYWN0aW9uRmVlUGFpZAEADAx3aG8AKGFjdHVhbF9mZWUIDHRpcAgcU3Rha2luZwECSBxFcmFQYWlkAQAMJGVyYV9pbmRleARAdmFsaWRhdG9yX3BheW91dAgkcmVtYWluZGVyCCBSZXdhcmRlZAEADBRzdGFzaAAQZGVzdDUBGGFtb3VudAgcU2xhc2hlZAEACBhzdGFrZXIAGGFtb3VudAg0U2xhc2hSZXBvcnRlZAEADCR2YWxpZGF0b3IAIGZyYWN0aW9uBCRzbGFzaF9lcmEEaE9sZFNsYXNoaW5nUmVwb3J0RGlzY2FyZGVkAQAENHNlc3Npb25faW5kZXgEOFN0YWtlcnNFbGVjdGVkAQEFGEJvbmRlZAEACBRzdGFzaAAYYW1vdW50CCBVbmJvbmRlZAEACBRzdGFzaAAYYW1vdW50CCRXaXRoZHJhd24BAAgUc3Rhc2gAGGFtb3VudAgYS2lja2VkAQAIJG5vbWluYXRvcgAUc3Rhc2gAVFN0YWtpbmdFbGVjdGlvbkZhaWxlZAEBBRxDaGlsbGVkAQAEFHN0YXNoADRQYXlvdXRTdGFydGVkAQAIJGVyYV9pbmRleAQ8dmFsaWRhdG9yX3N0YXNoAERWYWxpZGF0b3JQcmVmc1NldAEACBRzdGFzaAAUcHJlZnM5AWhTbmFwc2hvdFZvdGVyc1NpemVFeGNlZWRlZAEABBBzaXplBGxTbmFwc2hvdFRhcmdldHNTaXplRXhjZWVkZWQBAAQQc2l6ZQQgRm9yY2VFcmEBAAQQbW9kZT0BZENvbnRyb2xsZXJCYXRjaERlcHJlY2F0ZWQBAAQgZmFpbHVyZXMEIE9mZmVuY2VzAQIEHE9mZmVuY2UBAAgQa2luZEUBIHRpbWVzbG90JBxTZXNzaW9uAQIEKE5ld1Nlc3Npb24BAAQ0c2Vzc2lvbl9pbmRleAQcR3JhbmRwYQECDDhOZXdBdXRob3JpdGllcwEABDRhdXRob3JpdHlfc2V0VQEYUGF1c2VkAQEFHFJlc3VtZWQBAQUgVHJlYXN1cnkBAjAgU3BlbmRpbmcBAARAYnVkZ2V0X3JlbWFpbmluZwgcQXdhcmRlZAEADDhwcm9wb3NhbF9pbmRleAQUYXdhcmQIHGFjY291bnQAFEJ1cm50AQAELGJ1cm50X2Z1bmRzCCBSb2xsb3ZlcgEABEByb2xsb3Zlcl9iYWxhbmNlCBxEZXBvc2l0AQAEFHZhbHVlCDRTcGVuZEFwcHJvdmVkAQAMOHByb3Bvc2FsX2luZGV4BBhhbW91bnQILGJlbmVmaWNpYXJ5ADxVcGRhdGVkSW5hY3RpdmUBAAgscmVhY3RpdmF0ZWQILGRlYWN0aXZhdGVkCEhBc3NldFNwZW5kQXBwcm92ZWQBABgUaW5kZXgEKGFzc2V0X2tpbmSBARhhbW91bnQILGJlbmVmaWNpYXJ5mQEodmFsaWRfZnJvbQQkZXhwaXJlX2F0BEBBc3NldFNwZW5kVm9pZGVkAQAEFGluZGV4BBBQYWlkAQAIFGluZGV4BChwYXltZW50X2lkCDRQYXltZW50RmFpbGVkAQAIFGluZGV4BChwYXltZW50X2lkCDhTcGVuZFByb2Nlc3NlZAEABBRpbmRleARAQ29udmljdGlvblZvdGluZwECCCREZWxlZ2F0ZWQBBAABCCxVbmRlbGVnYXRlZAEBASRSZWZlcmVuZGEBAkAkU3VibWl0dGVkAQAMFGluZGV4BBR0cmFjawQgcHJvcG9zYWylAVREZWNpc2lvbkRlcG9zaXRQbGFjZWQBAAwUaW5kZXgEDHdobwAYYW1vdW50CFxEZWNpc2lvbkRlcG9zaXRSZWZ1bmRlZAEADBRpbmRleAQMd2hvABhhbW91bnQIOERlcG9zaXRTbGFzaGVkAQAIDHdobwAYYW1vdW50CDxEZWNpc2lvblN0YXJ0ZWQBABAUaW5kZXgEFHRyYWNrBCBwcm9wb3NhbKUBFHRhbGx5qQE4Q29uZmlybVN0YXJ0ZWQBAAQUaW5kZXgEOENvbmZpcm1BYm9ydGVkAQAEFGluZGV4BCRDb25maXJtZWQBAAgUaW5kZXgEFHRhbGx5qQEgQXBwcm92ZWQBAAQUaW5kZXgEIFJlamVjdGVkAQAIFGluZGV4BBR0YWxseakBIFRpbWVkT3V0AQAIFGluZGV4BBR0YWxseakBJENhbmNlbGxlZAEACBRpbmRleAQUdGFsbHmpARhLaWxsZWQBAAgUaW5kZXgEFHRhbGx5qQFkU3VibWlzc2lvbkRlcG9zaXRSZWZ1bmRlZAEADBRpbmRleAQMd2hvABhhbW91bnQILE1ldGFkYXRhU2V0AQAIFGluZGV4BBBoYXNoIDxNZXRhZGF0YUNsZWFyZWQBAAgUaW5kZXgEEGhhc2ggJFdoaXRlbGlzdAECDDxDYWxsV2hpdGVsaXN0ZWQBAAQkY2FsbF9oYXNoIFhXaGl0ZWxpc3RlZENhbGxSZW1vdmVkAQAEJGNhbGxfaGFzaCBkV2hpdGVsaXN0ZWRDYWxsRGlzcGF0Y2hlZAEACCRjYWxsX2hhc2ggGHJlc3VsdD0NKFBhcmFtZXRlcnMBAgQcVXBkYXRlZAEADAxrZXnJASRvbGRfdmFsdWXVASRuZXdfdmFsdWXVARhDbGFpbXMBAgQcQ2xhaW1lZAEADAx3aG8AQGV0aGVyZXVtX2FkZHJlc3NlARhhbW91bnQIHFZlc3RpbmcBAgg4VmVzdGluZ1VwZGF0ZWQBAAgcYWNjb3VudAAgdW52ZXN0ZWQIQFZlc3RpbmdDb21wbGV0ZWQBAAQcYWNjb3VudAAcVXRpbGl0eQECGEBCYXRjaEludGVycnVwdGVkAQAIFGluZGV4BBRlcnJvcikNOEJhdGNoQ29tcGxldGVkAQEFYEJhdGNoQ29tcGxldGVkV2l0aEVycm9ycwEBBTRJdGVtQ29tcGxldGVkAQEFKEl0ZW1GYWlsZWQBAAQUZXJyb3IpDTBEaXNwYXRjaGVkQXMBAAQYcmVzdWx0MQ0UUHJveHkBAhQ0UHJveHlFeGVjdXRlZAEABBhyZXN1bHQxDSxQdXJlQ3JlYXRlZAEAEBBwdXJlAAx3aG8AKHByb3h5X3R5cGXpAVBkaXNhbWJpZ3VhdGlvbl9pbmRleAQkQW5ub3VuY2VkAQAMEHJlYWwAFHByb3h5ACRjYWxsX2hhc2ggKFByb3h5QWRkZWQBABAkZGVsZWdhdG9yACRkZWxlZ2F0ZWUAKHByb3h5X3R5cGXpARRkZWxheQQwUHJveHlSZW1vdmVkAQAQJGRlbGVnYXRvcgAkZGVsZWdhdGVlAChwcm94eV90eXBl6QEUZGVsYXkEIE11bHRpc2lnAQIQLE5ld011bHRpc2lnAQAMJGFwcHJvdmluZwAgbXVsdGlzaWcAJGNhbGxfaGFzaCBATXVsdGlzaWdBcHByb3ZhbAEAECRhcHByb3ZpbmcAJHRpbWVwb2ludPEBIG11bHRpc2lnACRjYWxsX2hhc2ggQE11bHRpc2lnRXhlY3V0ZWQBABQkYXBwcm92aW5nACR0aW1lcG9pbnTxASBtdWx0aXNpZwAkY2FsbF9oYXNoIBhyZXN1bHQxDURNdWx0aXNpZ0NhbmNlbGxlZAEAEChjYW5jZWxsaW5nACR0aW1lcG9pbnTxASBtdWx0aXNpZwAkY2FsbF9oYXNoICBCb3VudGllcwECLDhCb3VudHlQcm9wb3NlZAEABBRpbmRleAQ4Qm91bnR5UmVqZWN0ZWQBAAgUaW5kZXgEEGJvbmQISEJvdW50eUJlY2FtZUFjdGl2ZQEABBRpbmRleAQ0Qm91bnR5QXdhcmRlZAEACBRpbmRleAQsYmVuZWZpY2lhcnkANEJvdW50eUNsYWltZWQBAAwUaW5kZXgEGHBheW91dAgsYmVuZWZpY2lhcnkAOEJvdW50eUNhbmNlbGVkAQAEFGluZGV4BDhCb3VudHlFeHRlbmRlZAEABBRpbmRleAQ4Qm91bnR5QXBwcm92ZWQBAAQUaW5kZXgEPEN1cmF0b3JQcm9wb3NlZAEACCRib3VudHlfaWQEHGN1cmF0b3IAREN1cmF0b3JVbmFzc2lnbmVkAQAEJGJvdW50eV9pZAQ8Q3VyYXRvckFjY2VwdGVkAQAIJGJvdW50eV9pZAQcY3VyYXRvcgA0Q2hpbGRCb3VudGllcwECEBRBZGRlZAEACBRpbmRleAQsY2hpbGRfaW5kZXgEHEF3YXJkZWQBAAwUaW5kZXgELGNoaWxkX2luZGV4BCxiZW5lZmljaWFyeQAcQ2xhaW1lZAEAEBRpbmRleAQsY2hpbGRfaW5kZXgEGHBheW91dAgsYmVuZWZpY2lhcnkAIENhbmNlbGVkAQAIFGluZGV4BCxjaGlsZF9pbmRleARoRWxlY3Rpb25Qcm92aWRlck11bHRpUGhhc2UBAhg4U29sdXRpb25TdG9yZWQBAAwcY29tcHV0ZQECGG9yaWdpbgUCMHByZXZfZWplY3RlZBRERWxlY3Rpb25GaW5hbGl6ZWQBAAgcY29tcHV0ZQECFHNjb3JlCQI4RWxlY3Rpb25GYWlsZWQBAQUgUmV3YXJkZWQBAAgcYWNjb3VudAAUdmFsdWUIHFNsYXNoZWQBAAgcYWNjb3VudAAUdmFsdWUIRFBoYXNlVHJhbnNpdGlvbmVkAQAMEGZyb20RAgh0bxECFHJvdW5kBCRWb3Rlckxpc3QBAgggUmViYWdnZWQBAAwMd2hvABBmcm9tCAh0bwgwU2NvcmVVcGRhdGVkAQAIDHdobwAkbmV3X3Njb3JlCDxOb21pbmF0aW9uUG9vbHMBAkgcQ3JlYXRlZAEACCRkZXBvc2l0b3IAHHBvb2xfaWQEGEJvbmRlZAEAEBhtZW1iZXIAHHBvb2xfaWQEGGJvbmRlZAgYam9pbmVkFBxQYWlkT3V0AQAMGG1lbWJlcgAccG9vbF9pZAQYcGF5b3V0CCBVbmJvbmRlZAEAFBhtZW1iZXIAHHBvb2xfaWQEHGJhbGFuY2UIGHBvaW50cwgMZXJhBCRXaXRoZHJhd24BABAYbWVtYmVyABxwb29sX2lkBBxiYWxhbmNlCBhwb2ludHMIJERlc3Ryb3llZAEABBxwb29sX2lkBDBTdGF0ZUNoYW5nZWQBAAgccG9vbF9pZAQkbmV3X3N0YXRlHQI0TWVtYmVyUmVtb3ZlZAEACBxwb29sX2lkBBhtZW1iZXIAMFJvbGVzVXBkYXRlZAEADBByb290BQIcYm91bmNlcgUCJG5vbWluYXRvcgUCLFBvb2xTbGFzaGVkAQAIHHBvb2xfaWQEHGJhbGFuY2UIUFVuYm9uZGluZ1Bvb2xTbGFzaGVkAQAMHHBvb2xfaWQEDGVyYQQcYmFsYW5jZQhUUG9vbENvbW1pc3Npb25VcGRhdGVkAQAIHHBvb2xfaWQEHGN1cnJlbnQlAmBQb29sTWF4Q29tbWlzc2lvblVwZGF0ZWQBAAgccG9vbF9pZAQ4bWF4X2NvbW1pc3Npb24EfFBvb2xDb21taXNzaW9uQ2hhbmdlUmF0ZVVwZGF0ZWQBAAgccG9vbF9pZAQsY2hhbmdlX3JhdGUpApBQb29sQ29tbWlzc2lvbkNsYWltUGVybWlzc2lvblVwZGF0ZWQBAAgccG9vbF9pZAQocGVybWlzc2lvbjECVFBvb2xDb21taXNzaW9uQ2xhaW1lZAEACBxwb29sX2lkBChjb21taXNzaW9uCGRNaW5CYWxhbmNlRGVmaWNpdEFkanVzdGVkAQAIHHBvb2xfaWQEGGFtb3VudAhgTWluQmFsYW5jZUV4Y2Vzc0FkanVzdGVkAQAIHHBvb2xfaWQEGGFtb3VudAgsRmFzdFVuc3Rha2UBAhQgVW5zdGFrZWQBAAgUc3Rhc2gAGHJlc3VsdDENHFNsYXNoZWQBAAgUc3Rhc2gAGGFtb3VudAgwQmF0Y2hDaGVja2VkAQAEEGVyYXM5AjRCYXRjaEZpbmlzaGVkAQAEEHNpemUENEludGVybmFsRXJyb3IBAQU0UGFyYUluY2x1c2lvbgECEDxDYW5kaWRhdGVCYWNrZWQBAxBJAiQEBERDYW5kaWRhdGVJbmNsdWRlZAEDEEkCJAQERENhbmRpZGF0ZVRpbWVkT3V0AQMMSQIkBFhVcHdhcmRNZXNzYWdlc1JlY2VpdmVkAQAIEGZyb20EFGNvdW50BBRQYXJhcwECIEhDdXJyZW50Q29kZVVwZGF0ZWQBAQJIQ3VycmVudEhlYWRVcGRhdGVkAQECUENvZGVVcGdyYWRlU2NoZWR1bGVkAQECME5ld0hlYWROb3RlZAEBAjBBY3Rpb25RdWV1ZWQBBAQBCDxQdmZDaGVja1N0YXJ0ZWQBAwggBEBQdmZDaGVja0FjY2VwdGVkAQMIIARAUHZmQ2hlY2tSZWplY3RlZAEDCCAEEEhybXABAhxQT3BlbkNoYW5uZWxSZXF1ZXN0ZWQBABAYc2VuZGVyBCRyZWNpcGllbnQEVHByb3Bvc2VkX21heF9jYXBhY2l0eQRkcHJvcG9zZWRfbWF4X21lc3NhZ2Vfc2l6ZQRMT3BlbkNoYW5uZWxDYW5jZWxlZAEACDBieV9wYXJhY2hhaW4EKGNoYW5uZWxfaWRVAkxPcGVuQ2hhbm5lbEFjY2VwdGVkAQAIGHNlbmRlcgQkcmVjaXBpZW50BDRDaGFubmVsQ2xvc2VkAQAIMGJ5X3BhcmFjaGFpbgQoY2hhbm5lbF9pZFUCWEhybXBDaGFubmVsRm9yY2VPcGVuZWQBABAYc2VuZGVyBCRyZWNpcGllbnQEVHByb3Bvc2VkX21heF9jYXBhY2l0eQRkcHJvcG9zZWRfbWF4X21lc3NhZ2Vfc2l6ZQRcSHJtcFN5c3RlbUNoYW5uZWxPcGVuZWQBABAYc2VuZGVyBCRyZWNpcGllbnQEVHByb3Bvc2VkX21heF9jYXBhY2l0eQRkcHJvcG9zZWRfbWF4X21lc3NhZ2Vfc2l6ZQRoT3BlbkNoYW5uZWxEZXBvc2l0c1VwZGF0ZWQBAAgYc2VuZGVyBCRyZWNpcGllbnQENFBhcmFzRGlzcHV0ZXMBAgxARGlzcHV0ZUluaXRpYXRlZAEDCCBdAkBEaXNwdXRlQ29uY2x1ZGVkAQMIIGECGFJldmVydAEBAiBPbkRlbWFuZAECCExPbkRlbWFuZE9yZGVyUGxhY2VkAQAMHHBhcmFfaWQEKHNwb3RfcHJpY2UIKG9yZGVyZWRfYnkAMFNwb3RQcmljZVNldAEABChzcG90X3ByaWNlCCRSZWdpc3RyYXIBAhAoUmVnaXN0ZXJlZAEACBxwYXJhX2lkBBxtYW5hZ2VyADBEZXJlZ2lzdGVyZWQBAAQccGFyYV9pZAQgUmVzZXJ2ZWQBAAgccGFyYV9pZAQMd2hvABxTd2FwcGVkAQAIHHBhcmFfaWQEIG90aGVyX2lkBBRTbG90cwECCDhOZXdMZWFzZVBlcmlvZAEABDBsZWFzZV9wZXJpb2QEGExlYXNlZAEAGBxwYXJhX2lkBBhsZWFzZXIAMHBlcmlvZF9iZWdpbgQwcGVyaW9kX2NvdW50BDhleHRyYV9yZXNlcnZlZAgwdG90YWxfYW1vdW50CCBBdWN0aW9ucwECHDhBdWN0aW9uU3RhcnRlZAEADDRhdWN0aW9uX2luZGV4BDBsZWFzZV9wZXJpb2QEGGVuZGluZwQ0QXVjdGlvbkNsb3NlZAEABDRhdWN0aW9uX2luZGV4BCBSZXNlcnZlZAEADBhiaWRkZXIAOGV4dHJhX3Jlc2VydmVkCDB0b3RhbF9hbW91bnQIKFVucmVzZXJ2ZWQBAAgYYmlkZGVyABhhbW91bnQISFJlc2VydmVDb25maXNjYXRlZAEADBxwYXJhX2lkBBhsZWFzZXIAGGFtb3VudAgsQmlkQWNjZXB0ZWQBABQYYmlkZGVyABxwYXJhX2lkBBhhbW91bnQIKGZpcnN0X3Nsb3QEJGxhc3Rfc2xvdAQ0V2lubmluZ09mZnNldAEACDRhdWN0aW9uX2luZGV4BDBibG9ja19udW1iZXIEJENyb3dkbG9hbgECKBxDcmVhdGVkAQAEHHBhcmFfaWQELENvbnRyaWJ1dGVkAQAMDHdobwAoZnVuZF9pbmRleAQYYW1vdW50CCBXaXRoZHJldwEADAx3aG8AKGZ1bmRfaW5kZXgEGGFtb3VudAhEUGFydGlhbGx5UmVmdW5kZWQBAAQccGFyYV9pZAQsQWxsUmVmdW5kZWQBAAQccGFyYV9pZAQkRGlzc29sdmVkAQAEHHBhcmFfaWQEPEhhbmRsZUJpZFJlc3VsdAEACBxwYXJhX2lkBBhyZXN1bHQxDRhFZGl0ZWQBAAQccGFyYV9pZAQsTWVtb1VwZGF0ZWQBAAwMd2hvABxwYXJhX2lkBBBtZW1vJDxBZGRlZFRvTmV3UmFpc2UBAAQccGFyYV9pZAQgQ29yZXRpbWUBAghQUmV2ZW51ZUluZm9SZXF1ZXN0ZWQBAAQQd2hlbgQwQ29yZUFzc2lnbmVkAQAEEGNvcmUESFN0YXRlVHJpZU1pZ3JhdGlvbgECECBNaWdyYXRlZAEADAx0b3AEFGNoaWxkBBxjb21wdXRlgQIcU2xhc2hlZAEACAx3aG8AGGFtb3VudAhUQXV0b01pZ3JhdGlvbkZpbmlzaGVkAQEFGEhhbHRlZAEABBRlcnJvcuQkWGNtUGFsbGV0AQJgJEF0dGVtcHRlZAEABBxvdXRjb21ljQIQU2VudAEAEBhvcmlnaW55ASxkZXN0aW5hdGlvbnkBHG1lc3NhZ2X5AihtZXNzYWdlX2lkIEhVbmV4cGVjdGVkUmVzcG9uc2UBAAgYb3JpZ2lueQEgcXVlcnlfaWQINFJlc3BvbnNlUmVhZHkBAAggcXVlcnlfaWQIIHJlc3BvbnNluQIgTm90aWZpZWQBAAwgcXVlcnlfaWQIMHBhbGxldF9pbmRleAQoY2FsbF9pbmRleARATm90aWZ5T3ZlcndlaWdodAEAFCBxdWVyeV9pZAgwcGFsbGV0X2luZGV4BChjYWxsX2luZGV4BDRhY3R1YWxfd2VpZ2h0GExtYXhfYnVkZ2V0ZWRfd2VpZ2h0GExOb3RpZnlEaXNwYXRjaEVycm9yAQAMIHF1ZXJ5X2lkCDBwYWxsZXRfaW5kZXgEKGNhbGxfaW5kZXgESE5vdGlmeURlY29kZUZhaWxlZAEADCBxdWVyeV9pZAgwcGFsbGV0X2luZGV4BChjYWxsX2luZGV4BEBJbnZhbGlkUmVzcG9uZGVyAQAMGG9yaWdpbnkBIHF1ZXJ5X2lkCERleHBlY3RlZF9sb2NhdGlvbr0CXEludmFsaWRSZXNwb25kZXJWZXJzaW9uAQAIGG9yaWdpbnkBIHF1ZXJ5X2lkCDRSZXNwb25zZVRha2VuAQAEIHF1ZXJ5X2lkCDRBc3NldHNUcmFwcGVkAQAMEGhhc2ggGG9yaWdpbnkBGGFzc2V0cxkDVFZlcnNpb25DaGFuZ2VOb3RpZmllZAEAECxkZXN0aW5hdGlvbnkBGHJlc3VsdAQQY29zdKECKG1lc3NhZ2VfaWQgXFN1cHBvcnRlZFZlcnNpb25DaGFuZ2VkAQAIIGxvY2F0aW9ueQEcdmVyc2lvbgRQTm90aWZ5VGFyZ2V0U2VuZEZhaWwBAAwgbG9jYXRpb255ASBxdWVyeV9pZAgUZXJyb3KJAmROb3RpZnlUYXJnZXRNaWdyYXRpb25GYWlsAQAIIGxvY2F0aW9umQEgcXVlcnlfaWQIVEludmFsaWRRdWVyaWVyVmVyc2lvbgEACBhvcmlnaW55ASBxdWVyeV9pZAg4SW52YWxpZFF1ZXJpZXIBABAYb3JpZ2lueQEgcXVlcnlfaWQIQGV4cGVjdGVkX3F1ZXJpZXJ5AVBtYXliZV9hY3R1YWxfcXVlcmllcr0CUFZlcnNpb25Ob3RpZnlTdGFydGVkAQAMLGRlc3RpbmF0aW9ueQEQY29zdKECKG1lc3NhZ2VfaWQgWFZlcnNpb25Ob3RpZnlSZXF1ZXN0ZWQBAAwsZGVzdGluYXRpb255ARBjb3N0oQIobWVzc2FnZV9pZCBgVmVyc2lvbk5vdGlmeVVucmVxdWVzdGVkAQAMLGRlc3RpbmF0aW9ueQEQY29zdKECKG1lc3NhZ2VfaWQgIEZlZXNQYWlkAQAIGHBheWluZ3kBEGZlZXOhAjRBc3NldHNDbGFpbWVkAQAMEGhhc2ggGG9yaWdpbnkBGGFzc2V0cxkDYFZlcnNpb25NaWdyYXRpb25GaW5pc2hlZAEABBx2ZXJzaW9uBDBNZXNzYWdlUXVldWUBAhBAUHJvY2Vzc2luZ0ZhaWxlZAEADAhpZCAYb3JpZ2luJQMUZXJyb3IpAyRQcm9jZXNzZWQBABAIaWQgGG9yaWdpbiUDLHdlaWdodF91c2VkGBxzdWNjZXNzFEhPdmVyd2VpZ2h0RW5xdWV1ZWQBABAIaWQgGG9yaWdpbiUDKHBhZ2VfaW5kZXgENG1lc3NhZ2VfaW5kZXgEKFBhZ2VSZWFwZWQBAAgYb3JpZ2luJQMUaW5kZXgEJEFzc2V0UmF0ZQECDEBBc3NldFJhdGVDcmVhdGVkAQAIKGFzc2V0X2tpbmSBARByYXRlCEBBc3NldFJhdGVSZW1vdmVkAQAEKGFzc2V0X2tpbmSBAUBBc3NldFJhdGVVcGRhdGVkAQAMKGFzc2V0X2tpbmSBAQxvbGQIDG5ldwgQU3VkbwECEBRTdWRpZAEABCxzdWRvX3Jlc3VsdDENKEtleUNoYW5nZWQBAAgMb2xkBQIMbmV3AChLZXlSZW1vdmVkAQEFKFN1ZG9Bc0RvbmUBAAQsc3Vkb19yZXN1bHQxDQAMFHBoYXNlNBRldmVudF0NGHRvcGljczkDBGENAAIoIHNjaGVkdWxlAQAQEHdoZW4EOG1heWJlX3BlcmlvZGljgQMgcHJpb3JpdHkEEGNhbGyJDRhjYW5jZWwBAAgQd2hlbgQUaW5kZXgEOHNjaGVkdWxlX25hbWVkAQAUCGlkIBB3aGVuBDhtYXliZV9wZXJpb2RpY4EDIHByaW9yaXR5BBBjYWxsiQ0wY2FuY2VsX25hbWVkAQAECGlkIDhzY2hlZHVsZV9hZnRlcgEAEBRhZnRlcgQ4bWF5YmVfcGVyaW9kaWOBAyBwcmlvcml0eQQQY2FsbIkNUHNjaGVkdWxlX25hbWVkX2FmdGVyAQAUCGlkIBRhZnRlcgQ4bWF5YmVfcGVyaW9kaWOBAyBwcmlvcml0eQQQY2FsbIkNJHNldF9yZXRyeQEADBB0YXNrDQEccmV0cmllcwQYcGVyaW9kBDxzZXRfcmV0cnlfbmFtZWQBAAwIaWQgHHJldHJpZXMEGHBlcmlvZAQwY2FuY2VsX3JldHJ5AQAEEHRhc2sNAUhjYW5jZWxfcmV0cnlfbmFtZWQBAAQIaWQgAhA4d2hpdGVsaXN0X2NhbGwBAAQkY2FsbF9oYXNoIFxyZW1vdmVfd2hpdGVsaXN0ZWRfY2FsbAEABCRjYWxsX2hhc2ggZGRpc3BhdGNoX3doaXRlbGlzdGVkX2NhbGwBAAwkY2FsbF9oYXNoIEBjYWxsX2VuY29kZWRfbGVuBExjYWxsX3dlaWdodF93aXRuZXNzGJxkaXNwYXRjaF93aGl0ZWxpc3RlZF9jYWxsX3dpdGhfcHJlaW1hZ2UBAAQQY2FsbIkNBIkNAAIYFGJhdGNoAQAEFGNhbGxzcQ00YXNfZGVyaXZhdGl2ZQEACBRpbmRleAQQY2FsbIkNJGJhdGNoX2FsbAEABBRjYWxsc3ENLGRpc3BhdGNoX2FzAQAIJGFzX29yaWdpbpUDEGNhbGyJDSxmb3JjZV9iYXRjaAEABBRjYWxsc3ENLHdpdGhfd2VpZ2h0AQAIEGNhbGyJDRh3ZWlnaHQYAigUcHJveHkBAAwQcmVhbNUDQGZvcmNlX3Byb3h5X3R5cGWFBBBjYWxsiQ0kYWRkX3Byb3h5AQAMIGRlbGVnYXRl1QMocHJveHlfdHlwZekBFGRlbGF5BDByZW1vdmVfcHJveHkBAAwgZGVsZWdhdGXVAyhwcm94eV90eXBl6QEUZGVsYXkEOHJlbW92ZV9wcm94aWVzAQEFLGNyZWF0ZV9wdXJlAQAMKHByb3h5X3R5cGXpARRkZWxheQQUaW5kZXgEJGtpbGxfcHVyZQEAFBxzcGF3bmVy1QMocHJveHlfdHlwZekBFGluZGV4BBhoZWlnaHQEJGV4dF9pbmRleAQgYW5ub3VuY2UBAAgQcmVhbNUDJGNhbGxfaGFzaCBMcmVtb3ZlX2Fubm91bmNlbWVudAEACBByZWFs1QMkY2FsbF9oYXNoIExyZWplY3RfYW5ub3VuY2VtZW50AQAIIGRlbGVnYXRl1QMkY2FsbF9oYXNoIDxwcm94eV9hbm5vdW5jZWQBABAgZGVsZWdhdGXVAxByZWFs1QNAZm9yY2VfcHJveHlfdHlwZYUEEGNhbGyJDQIQUGFzX211bHRpX3RocmVzaG9sZF8xAQAIRG90aGVyX3NpZ25hdG9yaWVz3QMQY2FsbIkNIGFzX211bHRpAQAUJHRocmVzaG9sZAREb3RoZXJfc2lnbmF0b3JpZXPdAzxtYXliZV90aW1lcG9pbnSNBBBjYWxsiQ0obWF4X3dlaWdodBhAYXBwcm92ZV9hc19tdWx0aQEAFCR0aHJlc2hvbGQERG90aGVyX3NpZ25hdG9yaWVz3QM8bWF5YmVfdGltZXBvaW50jQQkY2FsbF9oYXNoIChtYXhfd2VpZ2h0GDxjYW5jZWxfYXNfbXVsdGkBABAkdGhyZXNob2xkBERvdGhlcl9zaWduYXRvcmllc90DJHRpbWVwb2ludPEBJGNhbGxfaGFzaCACGHRzdWRvX3NjaGVkdWxlX3BhcmFfaW5pdGlhbGl6ZQEACAhpZAQcZ2VuZXNpcxUJaHN1ZG9fc2NoZWR1bGVfcGFyYV9jbGVhbnVwAQAECGlkBIBzdWRvX3NjaGVkdWxlX3BhcmF0aHJlYWRfdXBncmFkZQEABAhpZASEc3Vkb19zY2hlZHVsZV9wYXJhY2hhaW5fZG93bmdyYWRlAQAECGlkBFxzdWRvX3F1ZXVlX2Rvd253YXJkX3hjbQEACAhpZAQMeGNtqQZsc3Vkb19lc3RhYmxpc2hfaHJtcF9jaGFubmVsAQAQGHNlbmRlcgQkcmVjaXBpZW50BDBtYXhfY2FwYWNpdHkEQG1heF9tZXNzYWdlX3NpemUEAhQQc3VkbwEABBBjYWxsiQ1Uc3Vkb191bmNoZWNrZWRfd2VpZ2h0AQAIEGNhbGyJDRh3ZWlnaHQYHHNldF9rZXkBAAQMbmV31QMcc3Vkb19hcwEACAx3aG/VAxBjYWxsiQ0ocmVtb3ZlX2tleQEBBQLAGFN5c3RlbQECLBhyZW1hcmsBAAQYcmVtYXJrJDhzZXRfaGVhcF9wYWdlcwEABBRwYWdlcwggc2V0X2NvZGUBAAQQY29kZSRcc2V0X2NvZGVfd2l0aG91dF9jaGVja3MBAAQQY29kZSQsc2V0X3N0b3JhZ2UBAAQUaXRlbXN5AzBraWxsX3N0b3JhZ2UBAAQQa2V5c30DLGtpbGxfcHJlZml4AQAIGHByZWZpeCQcc3Via2V5cwREcmVtYXJrX3dpdGhfZXZlbnQBAAQYcmVtYXJrJERhdXRob3JpemVfdXBncmFkZQEABCRjb2RlX2hhc2gggGF1dGhvcml6ZV91cGdyYWRlX3dpdGhvdXRfY2hlY2tzAQAEJGNvZGVfaGFzaCBgYXBwbHlfYXV0aG9yaXplZF91cGdyYWRlAQAEEGNvZGUkJFNjaGVkdWxlcgECKCBzY2hlZHVsZQEAEBB3aGVuBDhtYXliZV9wZXJpb2RpY4EDIHByaW9yaXR5BBBjYWxsiQ0YY2FuY2VsAQAIEHdoZW4EFGluZGV4BDhzY2hlZHVsZV9uYW1lZAEAFAhpZCAQd2hlbgQ4bWF5YmVfcGVyaW9kaWOBAyBwcmlvcml0eQQQY2FsbIkNMGNhbmNlbF9uYW1lZAEABAhpZCA4c2NoZWR1bGVfYWZ0ZXIBABAUYWZ0ZXIEOG1heWJlX3BlcmlvZGljgQMgcHJpb3JpdHkEEGNhbGyJDVBzY2hlZHVsZV9uYW1lZF9hZnRlcgEAFAhpZCAUYWZ0ZXIEOG1heWJlX3BlcmlvZGljgQMgcHJpb3JpdHkEEGNhbGyJDSRzZXRfcmV0cnkBAAwQdGFzaw0BHHJldHJpZXMEGHBlcmlvZAQ8c2V0X3JldHJ5X25hbWVkAQAMCGlkIBxyZXRyaWVzBBhwZXJpb2QEMGNhbmNlbF9yZXRyeQEABBB0YXNrDQFIY2FuY2VsX3JldHJ5X25hbWVkAQAECGlkICBQcmVpbWFnZQECFDRub3RlX3ByZWltYWdlAQAEFGJ5dGVzJDx1bm5vdGVfcHJlaW1hZ2UBAAQQaGFzaCBAcmVxdWVzdF9wcmVpbWFnZQEABBBoYXNoIEh1bnJlcXVlc3RfcHJlaW1hZ2UBAAQQaGFzaCA4ZW5zdXJlX3VwZGF0ZWQBAAQYaGFzaGVzOQMQQmFiZQECDExyZXBvcnRfZXF1aXZvY2F0aW9uAQAISGVxdWl2b2NhdGlvbl9wcm9vZrkDPGtleV9vd25lcl9wcm9vZr0DcHJlcG9ydF9lcXVpdm9jYXRpb25fdW5zaWduZWQBAAhIZXF1aXZvY2F0aW9uX3Byb29muQM8a2V5X293bmVyX3Byb29mvQNIcGxhbl9jb25maWdfY2hhbmdlAQAEGGNvbmZpZ8kDJFRpbWVzdGFtcAECBAxzZXQBAAQMbm93CBxJbmRpY2VzAQIUFGNsYWltAQAEFGluZGV4BCB0cmFuc2ZlcgEACAxuZXfVAxRpbmRleAQQZnJlZQEABBRpbmRleAQ4Zm9yY2VfdHJhbnNmZXIBAAwMbmV31QMUaW5kZXgEGGZyZWV6ZRQYZnJlZXplAQAEFGluZGV4BCBCYWxhbmNlcwECJFB0cmFuc2Zlcl9hbGxvd19kZWF0aAEACBBkZXN01QMUdmFsdWUIOGZvcmNlX3RyYW5zZmVyAQAMGHNvdXJjZdUDEGRlc3TVAxR2YWx1ZQhMdHJhbnNmZXJfa2VlcF9hbGl2ZQEACBBkZXN01QMUdmFsdWUIMHRyYW5zZmVyX2FsbAEACBBkZXN01QMoa2VlcF9hbGl2ZRQ8Zm9yY2VfdW5yZXNlcnZlAQAIDHdob9UDGGFtb3VudAhAdXBncmFkZV9hY2NvdW50cwEABAx3aG/dA0Rmb3JjZV9zZXRfYmFsYW5jZQEACAx3aG/VAyBuZXdfZnJlZQhsZm9yY2VfYWRqdXN0X3RvdGFsX2lzc3VhbmNlAQAIJGRpcmVjdGlvbuEDFGRlbHRhCBBidXJuAQAIFHZhbHVlCChrZWVwX2FsaXZlFBxTdGFraW5nAQJ4EGJvbmQBAAgUdmFsdWUIFHBheWVlNQEoYm9uZF9leHRyYQEABDhtYXhfYWRkaXRpb25hbAgYdW5ib25kAQAEFHZhbHVlCER3aXRoZHJhd191bmJvbmRlZAEABEhudW1fc2xhc2hpbmdfc3BhbnMEIHZhbGlkYXRlAQAEFHByZWZzOQEgbm9taW5hdGUBAAQcdGFyZ2V0c+kDFGNoaWxsAQEFJHNldF9wYXllZQEABBRwYXllZTUBOHNldF9jb250cm9sbGVyAQEFTHNldF92YWxpZGF0b3JfY291bnQBAAQMbmV3BGBpbmNyZWFzZV92YWxpZGF0b3JfY291bnQBAAQoYWRkaXRpb25hbARUc2NhbGVfdmFsaWRhdG9yX2NvdW50AQAEGGZhY3RvcgQ0Zm9yY2Vfbm9fZXJhcwEBBTRmb3JjZV9uZXdfZXJhAQEFRHNldF9pbnZ1bG5lcmFibGVzAQAENGludnVsbmVyYWJsZXPdAzRmb3JjZV91bnN0YWtlAQAIFHN0YXNoAEhudW1fc2xhc2hpbmdfc3BhbnMEUGZvcmNlX25ld19lcmFfYWx3YXlzAQEFVGNhbmNlbF9kZWZlcnJlZF9zbGFzaAEACAxlcmEENHNsYXNoX2luZGljZXM5AjhwYXlvdXRfc3Rha2VycwEACDx2YWxpZGF0b3Jfc3Rhc2gADGVyYQQYcmVib25kAQAEFHZhbHVlCChyZWFwX3N0YXNoAQAIFHN0YXNoAEhudW1fc2xhc2hpbmdfc3BhbnMEEGtpY2sBAAQMd2hv6QNMc2V0X3N0YWtpbmdfY29uZmlncwEAHEhtaW5fbm9taW5hdG9yX2JvbmTtA0htaW5fdmFsaWRhdG9yX2JvbmTtA0xtYXhfbm9taW5hdG9yX2NvdW508QNMbWF4X3ZhbGlkYXRvcl9jb3VudPEDPGNoaWxsX3RocmVzaG9sZPEDOG1pbl9jb21taXNzaW9u8QNIbWF4X3N0YWtlZF9yZXdhcmRz8QMsY2hpbGxfb3RoZXIBAAQUc3Rhc2gAaGZvcmNlX2FwcGx5X21pbl9jb21taXNzaW9uAQAEPHZhbGlkYXRvcl9zdGFzaABIc2V0X21pbl9jb21taXNzaW9uAQAEDG5ldwRYcGF5b3V0X3N0YWtlcnNfYnlfcGFnZQEADDx2YWxpZGF0b3Jfc3Rhc2gADGVyYQQQcGFnZQQwdXBkYXRlX3BheWVlAQAEKGNvbnRyb2xsZXIAaGRlcHJlY2F0ZV9jb250cm9sbGVyX2JhdGNoAQAELGNvbnRyb2xsZXJz3QM4cmVzdG9yZV9sZWRnZXIBABAUc3Rhc2gAQG1heWJlX2NvbnRyb2xsZXIFAixtYXliZV90b3RhbPUDPG1heWJlX3VubG9ja2luZwEEHFNlc3Npb24BAgggc2V0X2tleXMBAAgQa2V5cw0EFHByb29mJChwdXJnZV9rZXlzAQEFHEdyYW5kcGEBAgxMcmVwb3J0X2VxdWl2b2NhdGlvbgEACEhlcXVpdm9jYXRpb25fcHJvb2YlBDxrZXlfb3duZXJfcHJvb2a9A3ByZXBvcnRfZXF1aXZvY2F0aW9uX3Vuc2lnbmVkAQAISGVxdWl2b2NhdGlvbl9wcm9vZiUEPGtleV9vd25lcl9wcm9vZr0DMG5vdGVfc3RhbGxlZAEACBRkZWxheQRsYmVzdF9maW5hbGl6ZWRfYmxvY2tfbnVtYmVyBCBUcmVhc3VyeQECGCxzcGVuZF9sb2NhbAEACBhhbW91bnQILGJlbmVmaWNpYXJ51QM8cmVtb3ZlX2FwcHJvdmFsAQAELHByb3Bvc2FsX2lkBBRzcGVuZAEAEChhc3NldF9raW5kgQEYYW1vdW50CCxiZW5lZmljaWFyeZkBKHZhbGlkX2Zyb20tBBhwYXlvdXQBAAQUaW5kZXgEMGNoZWNrX3N0YXR1cwEABBRpbmRleAQodm9pZF9zcGVuZAEABBRpbmRleARAQ29udmljdGlvblZvdGluZwECGBB2b3RlAQAIKHBvbGxfaW5kZXgEEHZvdGU1BCBkZWxlZ2F0ZQEAEBRjbGFzcwQIdG/VAyhjb252aWN0aW9uOQQcYmFsYW5jZQgodW5kZWxlZ2F0ZQEABBRjbGFzcwQYdW5sb2NrAQAIFGNsYXNzBBh0YXJnZXTVAyxyZW1vdmVfdm90ZQEACBRjbGFzcy0EFGluZGV4BERyZW1vdmVfb3RoZXJfdm90ZQEADBh0YXJnZXTVAxRjbGFzcwQUaW5kZXgEJFJlZmVyZW5kYQECJBhzdWJtaXQBAAw8cHJvcG9zYWxfb3JpZ2lulQMgcHJvcG9zYWylAUBlbmFjdG1lbnRfbW9tZW50QQRYcGxhY2VfZGVjaXNpb25fZGVwb3NpdAEABBRpbmRleARccmVmdW5kX2RlY2lzaW9uX2RlcG9zaXQBAAQUaW5kZXgEGGNhbmNlbAEABBRpbmRleAQQa2lsbAEABBRpbmRleARAbnVkZ2VfcmVmZXJlbmR1bQEABBRpbmRleARIb25lX2Zld2VyX2RlY2lkaW5nAQAEFHRyYWNrBGRyZWZ1bmRfc3VibWlzc2lvbl9kZXBvc2l0AQAEFGluZGV4BDBzZXRfbWV0YWRhdGEBAAgUaW5kZXgEKG1heWJlX2hhc2gRASRXaGl0ZWxpc3QBAhA4d2hpdGVsaXN0X2NhbGwBAAQkY2FsbF9oYXNoIFxyZW1vdmVfd2hpdGVsaXN0ZWRfY2FsbAEABCRjYWxsX2hhc2ggZGRpc3BhdGNoX3doaXRlbGlzdGVkX2NhbGwBAAwkY2FsbF9oYXNoIEBjYWxsX2VuY29kZWRfbGVuBExjYWxsX3dlaWdodF93aXRuZXNzGJxkaXNwYXRjaF93aGl0ZWxpc3RlZF9jYWxsX3dpdGhfcHJlaW1hZ2UBAAQQY2FsbIkNKFBhcmFtZXRlcnMBAgQ0c2V0X3BhcmFtZXRlcgEABCRrZXlfdmFsdWVVBBhDbGFpbXMBAhQUY2xhaW0BAAgQZGVzdABIZXRoZXJldW1fc2lnbmF0dXJlXQQobWludF9jbGFpbQEAEAx3aG9lARR2YWx1ZQhAdmVzdGluZ19zY2hlZHVsZWUEJHN0YXRlbWVudG0EMGNsYWltX2F0dGVzdAEADBBkZXN0AEhldGhlcmV1bV9zaWduYXR1cmVdBCRzdGF0ZW1lbnQkGGF0dGVzdAEABCRzdGF0ZW1lbnQkKG1vdmVfY2xhaW0BAAwMb2xkZQEMbmV3ZQE4bWF5YmVfcHJlY2xhaW0FAhxWZXN0aW5nAQIYEHZlc3QBAQUodmVzdF9vdGhlcgEABBh0YXJnZXTVAzx2ZXN0ZWRfdHJhbnNmZXIBAAgYdGFyZ2V01QMgc2NoZWR1bGV1BFRmb3JjZV92ZXN0ZWRfdHJhbnNmZXIBAAwYc291cmNl1QMYdGFyZ2V01QMgc2NoZWR1bGV1BDxtZXJnZV9zY2hlZHVsZXMBAAg8c2NoZWR1bGUxX2luZGV4BDxzY2hlZHVsZTJfaW5kZXgEdGZvcmNlX3JlbW92ZV92ZXN0aW5nX3NjaGVkdWxlAQAIGHRhcmdldNUDOHNjaGVkdWxlX2luZGV4BBxVdGlsaXR5AQIYFGJhdGNoAQAEFGNhbGxzcQ00YXNfZGVyaXZhdGl2ZQEACBRpbmRleAQQY2FsbIkNJGJhdGNoX2FsbAEABBRjYWxsc3ENLGRpc3BhdGNoX2FzAQAIJGFzX29yaWdpbpUDEGNhbGyJDSxmb3JjZV9iYXRjaAEABBRjYWxsc3ENLHdpdGhfd2VpZ2h0AQAIEGNhbGyJDRh3ZWlnaHQYFFByb3h5AQIoFHByb3h5AQAMEHJlYWzVA0Bmb3JjZV9wcm94eV90eXBlhQQQY2FsbIkNJGFkZF9wcm94eQEADCBkZWxlZ2F0ZdUDKHByb3h5X3R5cGXpARRkZWxheQQwcmVtb3ZlX3Byb3h5AQAMIGRlbGVnYXRl1QMocHJveHlfdHlwZekBFGRlbGF5BDhyZW1vdmVfcHJveGllcwEBBSxjcmVhdGVfcHVyZQEADChwcm94eV90eXBl6QEUZGVsYXkEFGluZGV4BCRraWxsX3B1cmUBABQcc3Bhd25lctUDKHByb3h5X3R5cGXpARRpbmRleAQYaGVpZ2h0BCRleHRfaW5kZXgEIGFubm91bmNlAQAIEHJlYWzVAyRjYWxsX2hhc2ggTHJlbW92ZV9hbm5vdW5jZW1lbnQBAAgQcmVhbNUDJGNhbGxfaGFzaCBMcmVqZWN0X2Fubm91bmNlbWVudAEACCBkZWxlZ2F0ZdUDJGNhbGxfaGFzaCA8cHJveHlfYW5ub3VuY2VkAQAQIGRlbGVnYXRl1QMQcmVhbNUDQGZvcmNlX3Byb3h5X3R5cGWFBBBjYWxsiQ0gTXVsdGlzaWcBAhBQYXNfbXVsdGlfdGhyZXNob2xkXzEBAAhEb3RoZXJfc2lnbmF0b3JpZXPdAxBjYWxsiQ0gYXNfbXVsdGkBABQkdGhyZXNob2xkBERvdGhlcl9zaWduYXRvcmllc90DPG1heWJlX3RpbWVwb2ludI0EEGNhbGyJDShtYXhfd2VpZ2h0GEBhcHByb3ZlX2FzX211bHRpAQAUJHRocmVzaG9sZAREb3RoZXJfc2lnbmF0b3JpZXPdAzxtYXliZV90aW1lcG9pbnSNBCRjYWxsX2hhc2ggKG1heF93ZWlnaHQYPGNhbmNlbF9hc19tdWx0aQEAECR0aHJlc2hvbGQERG90aGVyX3NpZ25hdG9yaWVz3QMkdGltZXBvaW508QEkY2FsbF9oYXNoICBCb3VudGllcwECJDhwcm9wb3NlX2JvdW50eQEACBR2YWx1ZQgsZGVzY3JpcHRpb24kOGFwcHJvdmVfYm91bnR5AQAEJGJvdW50eV9pZAQ8cHJvcG9zZV9jdXJhdG9yAQAMJGJvdW50eV9pZAQcY3VyYXRvctUDDGZlZQhAdW5hc3NpZ25fY3VyYXRvcgEABCRib3VudHlfaWQEOGFjY2VwdF9jdXJhdG9yAQAEJGJvdW50eV9pZAQwYXdhcmRfYm91bnR5AQAIJGJvdW50eV9pZAQsYmVuZWZpY2lhcnnVAzBjbGFpbV9ib3VudHkBAAQkYm91bnR5X2lkBDBjbG9zZV9ib3VudHkBAAQkYm91bnR5X2lkBFBleHRlbmRfYm91bnR5X2V4cGlyeQEACCRib3VudHlfaWQEGHJlbWFyayQ0Q2hpbGRCb3VudGllcwECHEBhZGRfY2hpbGRfYm91bnR5AQAMQHBhcmVudF9ib3VudHlfaWQEFHZhbHVlCCxkZXNjcmlwdGlvbiQ8cHJvcG9zZV9jdXJhdG9yAQAQQHBhcmVudF9ib3VudHlfaWQEPGNoaWxkX2JvdW50eV9pZAQcY3VyYXRvctUDDGZlZQg4YWNjZXB0X2N1cmF0b3IBAAhAcGFyZW50X2JvdW50eV9pZAQ8Y2hpbGRfYm91bnR5X2lkBEB1bmFzc2lnbl9jdXJhdG9yAQAIQHBhcmVudF9ib3VudHlfaWQEPGNoaWxkX2JvdW50eV9pZARIYXdhcmRfY2hpbGRfYm91bnR5AQAMQHBhcmVudF9ib3VudHlfaWQEPGNoaWxkX2JvdW50eV9pZAQsYmVuZWZpY2lhcnnVA0hjbGFpbV9jaGlsZF9ib3VudHkBAAhAcGFyZW50X2JvdW50eV9pZAQ8Y2hpbGRfYm91bnR5X2lkBEhjbG9zZV9jaGlsZF9ib3VudHkBAAhAcGFyZW50X2JvdW50eV9pZAQ8Y2hpbGRfYm91bnR5X2lkBGhFbGVjdGlvblByb3ZpZGVyTXVsdGlQaGFzZQECFDxzdWJtaXRfdW5zaWduZWQBAAgwcmF3X3NvbHV0aW9uWQUcd2l0bmVzc10FbHNldF9taW5pbXVtX3VudHJ1c3RlZF9zY29yZQEABEBtYXliZV9uZXh0X3Njb3JlYQV0c2V0X2VtZXJnZW5jeV9lbGVjdGlvbl9yZXN1bHQBAAQgc3VwcG9ydHN1BRhzdWJtaXQBAAQwcmF3X3NvbHV0aW9uWQVMZ292ZXJuYW5jZV9mYWxsYmFjawEACEBtYXliZV9tYXhfdm90ZXJzLQREbWF5YmVfbWF4X3RhcmdldHMtBCRWb3Rlckxpc3QBAgwUcmViYWcBAAQoZGlzbG9jYXRlZNUDPHB1dF9pbl9mcm9udF9vZgEABBxsaWdodGVy1QNUcHV0X2luX2Zyb250X29mX290aGVyAQAIHGhlYXZpZXLVAxxsaWdodGVy1QM8Tm9taW5hdGlvblBvb2xzAQJoEGpvaW4BAAgYYW1vdW50CBxwb29sX2lkBChib25kX2V4dHJhAQAEFGV4dHJhgQUwY2xhaW1fcGF5b3V0AQEFGHVuYm9uZAEACDhtZW1iZXJfYWNjb3VudNUDQHVuYm9uZGluZ19wb2ludHMIWHBvb2xfd2l0aGRyYXdfdW5ib25kZWQBAAgccG9vbF9pZARIbnVtX3NsYXNoaW5nX3NwYW5zBER3aXRoZHJhd191bmJvbmRlZAEACDhtZW1iZXJfYWNjb3VudNUDSG51bV9zbGFzaGluZ19zcGFucwQYY3JlYXRlAQAQGGFtb3VudAgQcm9vdNUDJG5vbWluYXRvctUDHGJvdW5jZXLVA0xjcmVhdGVfd2l0aF9wb29sX2lkAQAUGGFtb3VudAgQcm9vdNUDJG5vbWluYXRvctUDHGJvdW5jZXLVAxxwb29sX2lkBCBub21pbmF0ZQEACBxwb29sX2lkBCh2YWxpZGF0b3Jz3QMkc2V0X3N0YXRlAQAIHHBvb2xfaWQEFHN0YXRlHQIwc2V0X21ldGFkYXRhAQAIHHBvb2xfaWQEIG1ldGFkYXRhJCxzZXRfY29uZmlncwEAGDRtaW5fam9pbl9ib25k7QM8bWluX2NyZWF0ZV9ib25k7QMkbWF4X3Bvb2xz8QMsbWF4X21lbWJlcnPxA1BtYXhfbWVtYmVyc19wZXJfcG9vbPEDVGdsb2JhbF9tYXhfY29tbWlzc2lvbvEDMHVwZGF0ZV9yb2xlcwEAEBxwb29sX2lkBCBuZXdfcm9vdIUFNG5ld19ub21pbmF0b3KFBSxuZXdfYm91bmNlcoUFFGNoaWxsAQAEHHBvb2xfaWQEQGJvbmRfZXh0cmFfb3RoZXIBAAgYbWVtYmVy1QMUZXh0cmGBBVBzZXRfY2xhaW1fcGVybWlzc2lvbgEABChwZXJtaXNzaW9uiQVIY2xhaW1fcGF5b3V0X290aGVyAQAEFG90aGVyADhzZXRfY29tbWlzc2lvbgEACBxwb29sX2lkBDhuZXdfY29tbWlzc2lvbiUCSHNldF9jb21taXNzaW9uX21heAEACBxwb29sX2lkBDhtYXhfY29tbWlzc2lvbgRoc2V0X2NvbW1pc3Npb25fY2hhbmdlX3JhdGUBAAgccG9vbF9pZAQsY2hhbmdlX3JhdGUpAkBjbGFpbV9jb21taXNzaW9uAQAEHHBvb2xfaWQETGFkanVzdF9wb29sX2RlcG9zaXQBAAQccG9vbF9pZAR8c2V0X2NvbW1pc3Npb25fY2xhaW1fcGVybWlzc2lvbgEACBxwb29sX2lkBChwZXJtaXNzaW9uMQIsYXBwbHlfc2xhc2gBAAQ4bWVtYmVyX2FjY291bnTVA0htaWdyYXRlX2RlbGVnYXRpb24BAAQ4bWVtYmVyX2FjY291bnTVA3htaWdyYXRlX3Bvb2xfdG9fZGVsZWdhdGVfc3Rha2UBAAQccG9vbF9pZAQsRmFzdFVuc3Rha2UBAgxUcmVnaXN0ZXJfZmFzdF91bnN0YWtlAQEFKGRlcmVnaXN0ZXIBAQUcY29udHJvbAEABDRlcmFzX3RvX2NoZWNrBDRDb25maWd1cmF0aW9uAQLAfHNldF92YWxpZGF0aW9uX3VwZ3JhZGVfY29vbGRvd24BAAQMbmV3BHBzZXRfdmFsaWRhdGlvbl91cGdyYWRlX2RlbGF5AQAEDG5ldwRkc2V0X2NvZGVfcmV0ZW50aW9uX3BlcmlvZAEABAxuZXcERHNldF9tYXhfY29kZV9zaXplAQAEDG5ldwRAc2V0X21heF9wb3Zfc2l6ZQEABAxuZXcEWHNldF9tYXhfaGVhZF9kYXRhX3NpemUBAAQMbmV3BEhzZXRfY29yZXRpbWVfY29yZXMBAAQMbmV3BHRzZXRfbWF4X2F2YWlsYWJpbGl0eV90aW1lb3V0cwEABAxuZXcEcHNldF9ncm91cF9yb3RhdGlvbl9mcmVxdWVuY3kBAAQMbmV3BHRzZXRfcGFyYXNfYXZhaWxhYmlsaXR5X3BlcmlvZAEABAxuZXcEYHNldF9zY2hlZHVsaW5nX2xvb2thaGVhZAEABAxuZXcEbHNldF9tYXhfdmFsaWRhdG9yc19wZXJfY29yZQEABAxuZXctBEhzZXRfbWF4X3ZhbGlkYXRvcnMBAAQMbmV3LQRIc2V0X2Rpc3B1dGVfcGVyaW9kAQAEDG5ldwS0c2V0X2Rpc3B1dGVfcG9zdF9jb25jbHVzaW9uX2FjY2VwdGFuY2VfcGVyaW9kAQAEDG5ldwREc2V0X25vX3Nob3dfc2xvdHMBAAQMbmV3BFBzZXRfbl9kZWxheV90cmFuY2hlcwEABAxuZXcEeHNldF96ZXJvdGhfZGVsYXlfdHJhbmNoZV93aWR0aAEABAxuZXcEUHNldF9uZWVkZWRfYXBwcm92YWxzAQAEDG5ldwRwc2V0X3JlbGF5X3ZyZl9tb2R1bG9fc2FtcGxlcwEABAxuZXcEaHNldF9tYXhfdXB3YXJkX3F1ZXVlX2NvdW50AQAEDG5ldwRkc2V0X21heF91cHdhcmRfcXVldWVfc2l6ZQEABAxuZXcEdHNldF9tYXhfZG93bndhcmRfbWVzc2FnZV9zaXplAQAEDG5ldwRsc2V0X21heF91cHdhcmRfbWVzc2FnZV9zaXplAQAEDG5ldwSgc2V0X21heF91cHdhcmRfbWVzc2FnZV9udW1fcGVyX2NhbmRpZGF0ZQEABAxuZXcEZHNldF9ocm1wX29wZW5fcmVxdWVzdF90dGwBAAQMbmV3BFxzZXRfaHJtcF9zZW5kZXJfZGVwb3NpdAEABAxuZXcIaHNldF9ocm1wX3JlY2lwaWVudF9kZXBvc2l0AQAEDG5ldwh0c2V0X2hybXBfY2hhbm5lbF9tYXhfY2FwYWNpdHkBAAQMbmV3BHxzZXRfaHJtcF9jaGFubmVsX21heF90b3RhbF9zaXplAQAEDG5ldwScc2V0X2hybXBfbWF4X3BhcmFjaGFpbl9pbmJvdW5kX2NoYW5uZWxzAQAEDG5ldwSEc2V0X2hybXBfY2hhbm5lbF9tYXhfbWVzc2FnZV9zaXplAQAEDG5ldwSgc2V0X2hybXBfbWF4X3BhcmFjaGFpbl9vdXRib3VuZF9jaGFubmVscwEABAxuZXcEmHNldF9ocm1wX21heF9tZXNzYWdlX251bV9wZXJfY2FuZGlkYXRlAQAEDG5ldwRIc2V0X3B2Zl92b3RpbmdfdHRsAQAEDG5ldwSQc2V0X21pbmltdW1fdmFsaWRhdGlvbl91cGdyYWRlX2RlbGF5AQAEDG5ldwRwc2V0X2J5cGFzc19jb25zaXN0ZW5jeV9jaGVjawEABAxuZXcUYHNldF9hc3luY19iYWNraW5nX3BhcmFtcwEABAxuZXeVBUxzZXRfZXhlY3V0b3JfcGFyYW1zAQAEDG5ld6UFWHNldF9vbl9kZW1hbmRfYmFzZV9mZWUBAAQMbmV3CHRzZXRfb25fZGVtYW5kX2ZlZV92YXJpYWJpbGl0eQEABAxuZXcEcHNldF9vbl9kZW1hbmRfcXVldWVfbWF4X3NpemUBAAQMbmV3BJhzZXRfb25fZGVtYW5kX3RhcmdldF9xdWV1ZV91dGlsaXphdGlvbgEABAxuZXcERHNldF9vbl9kZW1hbmRfdHRsAQAEDG5ldwRkc2V0X21pbmltdW1fYmFja2luZ192b3RlcwEABAxuZXcEQHNldF9ub2RlX2ZlYXR1cmUBAAgUaW5kZXgEFHZhbHVlFGhzZXRfYXBwcm92YWxfdm90aW5nX3BhcmFtcwEABAxuZXcEUHNldF9zY2hlZHVsZXJfcGFyYW1zAQAEDG5ld6kFLFBhcmFzU2hhcmVkAQEFNFBhcmFJbmNsdXNpb24BAQUwUGFyYUluaGVyZW50AQIEFGVudGVyAQAEEGRhdGH9BRRQYXJhcwECJFhmb3JjZV9zZXRfY3VycmVudF9jb2RlAQAIEHBhcmEEIG5ld19jb2RlJFhmb3JjZV9zZXRfY3VycmVudF9oZWFkAQAIEHBhcmEEIG5ld19oZWFkJGxmb3JjZV9zY2hlZHVsZV9jb2RlX3VwZ3JhZGUBAAwQcGFyYQQgbmV3X2NvZGUkTHJlbGF5X3BhcmVudF9udW1iZXIETGZvcmNlX25vdGVfbmV3X2hlYWQBAAgQcGFyYQQgbmV3X2hlYWQkSGZvcmNlX3F1ZXVlX2FjdGlvbgEABBBwYXJhBGxhZGRfdHJ1c3RlZF92YWxpZGF0aW9uX2NvZGUBAAQ8dmFsaWRhdGlvbl9jb2RlJGxwb2tlX3VudXNlZF92YWxpZGF0aW9uX2NvZGUBAARQdmFsaWRhdGlvbl9jb2RlX2hhc2ggbGluY2x1ZGVfcHZmX2NoZWNrX3N0YXRlbWVudAEACBBzdG10BQYkc2lnbmF0dXJlQQJ0Zm9yY2Vfc2V0X21vc3RfcmVjZW50X2NvbnRleHQBAAgQcGFyYQQcY29udGV4dAQsSW5pdGlhbGl6ZXIBAgQ0Zm9yY2VfYXBwcm92ZQEABBR1cF90bwQQSHJtcAECLFhocm1wX2luaXRfb3Blbl9jaGFubmVsAQAMJHJlY2lwaWVudARUcHJvcG9zZWRfbWF4X2NhcGFjaXR5BGRwcm9wb3NlZF9tYXhfbWVzc2FnZV9zaXplBGBocm1wX2FjY2VwdF9vcGVuX2NoYW5uZWwBAAQYc2VuZGVyBEhocm1wX2Nsb3NlX2NoYW5uZWwBAAQoY2hhbm5lbF9pZFUCQGZvcmNlX2NsZWFuX2hybXABAAwQcGFyYQQsbnVtX2luYm91bmQEMG51bV9vdXRib3VuZARcZm9yY2VfcHJvY2Vzc19ocm1wX29wZW4BAAQgY2hhbm5lbHMEYGZvcmNlX3Byb2Nlc3NfaHJtcF9jbG9zZQEABCBjaGFubmVscwRgaHJtcF9jYW5jZWxfb3Blbl9yZXF1ZXN0AQAIKGNoYW5uZWxfaWRVAjRvcGVuX3JlcXVlc3RzBFxmb3JjZV9vcGVuX2hybXBfY2hhbm5lbAEAEBhzZW5kZXIEJHJlY2lwaWVudAQwbWF4X2NhcGFjaXR5BEBtYXhfbWVzc2FnZV9zaXplBGBlc3RhYmxpc2hfc3lzdGVtX2NoYW5uZWwBAAgYc2VuZGVyBCRyZWNpcGllbnQEVHBva2VfY2hhbm5lbF9kZXBvc2l0cwEACBhzZW5kZXIEJHJlY2lwaWVudAR0ZXN0YWJsaXNoX2NoYW5uZWxfd2l0aF9zeXN0ZW0BAARMdGFyZ2V0X3N5c3RlbV9jaGFpbgQ0UGFyYXNEaXNwdXRlcwECBDhmb3JjZV91bmZyZWV6ZQEBBTRQYXJhc1NsYXNoaW5nAQIEcHJlcG9ydF9kaXNwdXRlX2xvc3RfdW5zaWduZWQBAAg0ZGlzcHV0ZV9wcm9vZiEGPGtleV9vd25lcl9wcm9vZr0DIE9uRGVtYW5kAQIIXHBsYWNlX29yZGVyX2FsbG93X2RlYXRoAQAIKG1heF9hbW91bnQIHHBhcmFfaWQEWHBsYWNlX29yZGVyX2tlZXBfYWxpdmUBAAgobWF4X2Ftb3VudAgccGFyYV9pZAQkUmVnaXN0cmFyAQIkIHJlZ2lzdGVyAQAMCGlkBDBnZW5lc2lzX2hlYWQkPHZhbGlkYXRpb25fY29kZSQ4Zm9yY2VfcmVnaXN0ZXIBABQMd2hvABxkZXBvc2l0CAhpZAQwZ2VuZXNpc19oZWFkJDx2YWxpZGF0aW9uX2NvZGUkKGRlcmVnaXN0ZXIBAAQIaWQEEHN3YXABAAgIaWQEFG90aGVyBCxyZW1vdmVfbG9jawEABBBwYXJhBBxyZXNlcnZlAQEFIGFkZF9sb2NrAQAEEHBhcmEEVHNjaGVkdWxlX2NvZGVfdXBncmFkZQEACBBwYXJhBCBuZXdfY29kZSRAc2V0X2N1cnJlbnRfaGVhZAEACBBwYXJhBCBuZXdfaGVhZCQUU2xvdHMBAgwsZm9yY2VfbGVhc2UBABQQcGFyYQQYbGVhc2VyABhhbW91bnQIMHBlcmlvZF9iZWdpbgQwcGVyaW9kX2NvdW50BEBjbGVhcl9hbGxfbGVhc2VzAQAEEHBhcmEEPHRyaWdnZXJfb25ib2FyZAEABBBwYXJhBCBBdWN0aW9ucwECDCxuZXdfYXVjdGlvbgEACCBkdXJhdGlvbgRIbGVhc2VfcGVyaW9kX2luZGV4BAxiaWQBABQQcGFyYQQ0YXVjdGlvbl9pbmRleAQoZmlyc3Rfc2xvdAQkbGFzdF9zbG90BBhhbW91bnQIOGNhbmNlbF9hdWN0aW9uAQEFJENyb3dkbG9hbgECJBhjcmVhdGUBABgUaW5kZXgEDGNhcAgwZmlyc3RfcGVyaW9kBCxsYXN0X3BlcmlvZAQMZW5kBCB2ZXJpZmllcj0GKGNvbnRyaWJ1dGUBAAwUaW5kZXgEFHZhbHVlCCRzaWduYXR1cmVFBiB3aXRoZHJhdwEACAx3aG8AFGluZGV4BBhyZWZ1bmQBAAQUaW5kZXgEIGRpc3NvbHZlAQAEFGluZGV4BBBlZGl0AQAYFGluZGV4BAxjYXAIMGZpcnN0X3BlcmlvZAQsbGFzdF9wZXJpb2QEDGVuZAQgdmVyaWZpZXI9BiBhZGRfbWVtbwEACBRpbmRleAQQbWVtbyQQcG9rZQEABBRpbmRleAQ4Y29udHJpYnV0ZV9hbGwBAAgUaW5kZXgEJHNpZ25hdHVyZUUGIENvcmV0aW1lAQIMSHJlcXVlc3RfY29yZV9jb3VudAEABBRjb3VudARIcmVxdWVzdF9yZXZlbnVlX2F0AQAEEHdoZW4ELGFzc2lnbl9jb3JlAQAQEGNvcmUEFGJlZ2luBChhc3NpZ25tZW50VQYgZW5kX2hpbnQtBEhTdGF0ZVRyaWVNaWdyYXRpb24BAhhYY29udHJvbF9hdXRvX21pZ3JhdGlvbgEABDBtYXliZV9jb25maWdhBkBjb250aW51ZV9taWdyYXRlAQAMGGxpbWl0c10GPHJlYWxfc2l6ZV91cHBlcgQwd2l0bmVzc190YXNraQZIbWlncmF0ZV9jdXN0b21fdG9wAQAIEGtleXN9AzB3aXRuZXNzX3NpemUEUG1pZ3JhdGVfY3VzdG9tX2NoaWxkAQAMEHJvb3QkKGNoaWxkX2tleXN9Ayh0b3RhbF9zaXplBFRzZXRfc2lnbmVkX21heF9saW1pdHMBAAQYbGltaXRzXQZIZm9yY2Vfc2V0X3Byb2dyZXNzAQAIMHByb2dyZXNzX3RvcGUGOHByb2dyZXNzX2NoaWxkZQYkWGNtUGFsbGV0AQI4EHNlbmQBAAgQZGVzdJkBHG1lc3NhZ2WpBjx0ZWxlcG9ydF9hc3NldHMBABAQZGVzdJkBLGJlbmVmaWNpYXJ5mQEYYXNzZXRzGQM4ZmVlX2Fzc2V0X2l0ZW0EXHJlc2VydmVfdHJhbnNmZXJfYXNzZXRzAQAQEGRlc3SZASxiZW5lZmljaWFyeZkBGGFzc2V0cxkDOGZlZV9hc3NldF9pdGVtBBxleGVjdXRlAQAIHG1lc3NhZ2WpBihtYXhfd2VpZ2h0GERmb3JjZV94Y21fdmVyc2lvbgEACCBsb2NhdGlvbnkBHHZlcnNpb24EZGZvcmNlX2RlZmF1bHRfeGNtX3ZlcnNpb24BAAREbWF5YmVfeGNtX3ZlcnNpb24tBHhmb3JjZV9zdWJzY3JpYmVfdmVyc2lvbl9ub3RpZnkBAAQgbG9jYXRpb26ZAYBmb3JjZV91bnN1YnNjcmliZV92ZXJzaW9uX25vdGlmeQEABCBsb2NhdGlvbpkBfGxpbWl0ZWRfcmVzZXJ2ZV90cmFuc2Zlcl9hc3NldHMBABQQZGVzdJkBLGJlbmVmaWNpYXJ5mQEYYXNzZXRzGQM4ZmVlX2Fzc2V0X2l0ZW0EMHdlaWdodF9saW1pdPECXGxpbWl0ZWRfdGVsZXBvcnRfYXNzZXRzAQAUEGRlc3SZASxiZW5lZmljaWFyeZkBGGFzc2V0cxkDOGZlZV9hc3NldF9pdGVtBDB3ZWlnaHRfbGltaXTxAkBmb3JjZV9zdXNwZW5zaW9uAQAEJHN1c3BlbmRlZBQ8dHJhbnNmZXJfYXNzZXRzAQAUEGRlc3SZASxiZW5lZmljaWFyeZkBGGFzc2V0cxkDOGZlZV9hc3NldF9pdGVtBDB3ZWlnaHRfbGltaXTxAjBjbGFpbV9hc3NldHMBAAgYYXNzZXRzGQMsYmVuZWZpY2lhcnmZAYx0cmFuc2Zlcl9hc3NldHNfdXNpbmdfdHlwZV9hbmRfdGhlbgEAHBBkZXN0mQEYYXNzZXRzGQNQYXNzZXRzX3RyYW5zZmVyX3R5cGWtBjhyZW1vdGVfZmVlc19pZLEGSGZlZXNfdHJhbnNmZXJfdHlwZa0GSGN1c3RvbV94Y21fb25fZGVzdKkGMHdlaWdodF9saW1pdPECME1lc3NhZ2VRdWV1ZQECCCRyZWFwX3BhZ2UBAAg4bWVzc2FnZV9vcmlnaW4lAyhwYWdlX2luZGV4BEhleGVjdXRlX292ZXJ3ZWlnaHQBABA4bWVzc2FnZV9vcmlnaW4lAxBwYWdlBBRpbmRleAQwd2VpZ2h0X2xpbWl0GCRBc3NldFJhdGUBAgwYY3JlYXRlAQAIKGFzc2V0X2tpbmSBARByYXRlCBh1cGRhdGUBAAgoYXNzZXRfa2luZIEBEHJhdGUIGHJlbW92ZQEABChhc3NldF9raW5kgQEUQmVlZnkBAgxMcmVwb3J0X2VxdWl2b2NhdGlvbgEACEhlcXVpdm9jYXRpb25fcHJvb2bVBjxrZXlfb3duZXJfcHJvb2a9A3ByZXBvcnRfZXF1aXZvY2F0aW9uX3Vuc2lnbmVkAQAISGVxdWl2b2NhdGlvbl9wcm9vZtUGPGtleV9vd25lcl9wcm9vZr0DPHNldF9uZXdfZ2VuZXNpcwEABDxkZWxheV9pbl9ibG9ja3MEPFBhcmFTdWRvV3JhcHBlcgECGHRzdWRvX3NjaGVkdWxlX3BhcmFfaW5pdGlhbGl6ZQEACAhpZAQcZ2VuZXNpcxUJaHN1ZG9fc2NoZWR1bGVfcGFyYV9jbGVhbnVwAQAECGlkBIBzdWRvX3NjaGVkdWxlX3BhcmF0aHJlYWRfdXBncmFkZQEABAhpZASEc3Vkb19zY2hlZHVsZV9wYXJhY2hhaW5fZG93bmdyYWRlAQAECGlkBFxzdWRvX3F1ZXVlX2Rvd253YXJkX3hjbQEACAhpZAQMeGNtqQZsc3Vkb19lc3RhYmxpc2hfaHJtcF9jaGFubmVsAQAQGHNlbmRlcgQkcmVjaXBpZW50BDBtYXhfY2FwYWNpdHkEQG1heF9tZXNzYWdlX3NpemUEEFN1ZG8BAhQQc3VkbwEABBBjYWxsiQ1Uc3Vkb191bmNoZWNrZWRfd2VpZ2h0AQAIEGNhbGyJDRh3ZWlnaHQYHHNldF9rZXkBAAQMbmV31QMcc3Vkb19hcwEACAx3aG/VAxBjYWxsiQ0ocmVtb3ZlX2tleQEBBQcxDRUKBF0NAAAQQGV4ZWN1dGlvbl9yZXN1bHQ9DThlbWl0dGVkX2V2ZW50c5ENJGxvY2FsX3hjbSULOGZvcndhcmRlZF94Y21zMQsHlQ05CwAMQGV4ZWN1dGlvbl9yZXN1bHSNAjhlbWl0dGVkX2V2ZW50c5ENOGZvcndhcmRlZF94Y21zMQsHnQ05CwKINE5vdENvbnRyb2xsZXIBAQUgTm90U3Rhc2gBAQU0QWxyZWFkeUJvbmRlZAEBBTRBbHJlYWR5UGFpcmVkAQEFMEVtcHR5VGFyZ2V0cwEBBThEdXBsaWNhdGVJbmRleAEBBURJbnZhbGlkU2xhc2hJbmRleAEBBUBJbnN1ZmZpY2llbnRCb25kAQEFME5vTW9yZUNodW5rcwEBBTROb1VubG9ja0NodW5rAQEFMEZ1bmRlZFRhcmdldAEBBUhJbnZhbGlkRXJhVG9SZXdhcmQBAQVoSW52YWxpZE51bWJlck9mTm9taW5hdGlvbnMBAQVITm90U29ydGVkQW5kVW5pcXVlAQEFOEFscmVhZHlDbGFpbWVkAQEFLEludmFsaWRQYWdlAQEFVEluY29ycmVjdEhpc3RvcnlEZXB0aAEBBVhJbmNvcnJlY3RTbGFzaGluZ1NwYW5zAQEFIEJhZFN0YXRlAQEFOFRvb01hbnlUYXJnZXRzAQEFJEJhZFRhcmdldAEBBUBDYW5ub3RDaGlsbE90aGVyAQEFRFRvb01hbnlOb21pbmF0b3JzAQEFRFRvb01hbnlWYWxpZGF0b3JzAQEFQENvbW1pc3Npb25Ub29Mb3cBAQUsQm91bmROb3RNZXQBAQVQQ29udHJvbGxlckRlcHJlY2F0ZWQBAQVMQ2Fubm90UmVzdG9yZUxlZGdlcgEBBWxSZXdhcmREZXN0aW5hdGlvblJlc3RyaWN0ZWQBAQU4Tm90RW5vdWdoRnVuZHMBAQVcVmlydHVhbFN0YWtlck5vdEFsbG93ZWQBAQU8Q2Fubm90UmVhcFN0YXNoAQEFPEFscmVhZHlNaWdyYXRlZAEBBShSZXN0cmljdGVkAQEFAnhIVG9vTWFueVN1YkFjY291bnRzAQEFIE5vdEZvdW5kAQEFIE5vdE5hbWVkAQEFKEVtcHR5SW5kZXgBAQUoRmVlQ2hhbmdlZAEBBShOb0lkZW50aXR5AQEFPFN0aWNreUp1ZGdlbWVudAEBBThKdWRnZW1lbnRHaXZlbgEBBUBJbnZhbGlkSnVkZ2VtZW50AQEFMEludmFsaWRJbmRleAEBBTRJbnZhbGlkVGFyZ2V0AQEFRFRvb01hbnlSZWdpc3RyYXJzAQEFOEFscmVhZHlDbGFpbWVkAQEFGE5vdFN1YgEBBSBOb3RPd25lZAEBBXRKdWRnZW1lbnRGb3JEaWZmZXJlbnRJZGVudGl0eQEBBVhKdWRnZW1lbnRQYXltZW50RmFpbGVkAQEFNEludmFsaWRTdWZmaXgBAQVQTm90VXNlcm5hbWVBdXRob3JpdHkBAQUwTm9BbGxvY2F0aW9uAQEFQEludmFsaWRTaWduYXR1cmUBAQVEUmVxdWlyZXNTaWduYXR1cmUBAQU8SW52YWxpZFVzZXJuYW1lAQEFNFVzZXJuYW1lVGFrZW4BAQUoTm9Vc2VybmFtZQEBBShOb3RFeHBpcmVkAQEFIFRvb0Vhcmx5AQEFME5vdFVuYmluZGluZwEBBUBBbHJlYWR5VW5iaW5kaW5nAQEFWEluc3VmZmljaWVudFByaXZpbGVnZXMBAQUCIBhUb29CaWcBAQUwQWxyZWFkeU5vdGVkAQEFNE5vdEF1dGhvcml6ZWQBAQUgTm90Tm90ZWQBAQUkUmVxdWVzdGVkAQEFME5vdFJlcXVlc3RlZAEBBRxUb29NYW55AQEFGFRvb0ZldwEBBQIUJER1cGxpY2F0ZQEBBShOb3RIZWF2aWVyAQEFME5vdEluU2FtZUJhZwEBBTBOb2RlTm90Rm91bmQBAQUYTG9ja2VkAQEFAggQTGlzdAECFCREdXBsaWNhdGUBAQUoTm90SGVhdmllcgEBBTBOb3RJblNhbWVCYWcBAQUwTm9kZU5vdEZvdW5kAQEFGExvY2tlZAEBBRhMb2NrZWQBAQUCmDBQb29sTm90Rm91bmQBAQVIUG9vbE1lbWJlck5vdEZvdW5kAQEFSFJld2FyZFBvb2xOb3RGb3VuZAEBBUBTdWJQb29sc05vdEZvdW5kAQEFZEFjY291bnRCZWxvbmdzVG9PdGhlclBvb2wBAQU4RnVsbHlVbmJvbmRpbmcBAQVETWF4VW5ib25kaW5nTGltaXQBAQVEQ2Fubm90V2l0aGRyYXdBbnkBAQVETWluaW11bUJvbmROb3RNZXQBAQUwT3ZlcmZsb3dSaXNrAQEFNE5vdERlc3Ryb3lpbmcBAQUwTm90Tm9taW5hdG9yAQEFVE5vdEtpY2tlck9yRGVzdHJveWluZwEBBRxOb3RPcGVuAQEFIE1heFBvb2xzAQEFOE1heFBvb2xNZW1iZXJzAQEFRENhbk5vdENoYW5nZVN0YXRlAQEFVERvZXNOb3RIYXZlUGVybWlzc2lvbgEBBVRNZXRhZGF0YUV4Y2VlZHNNYXhMZW4BAQUkRGVmZW5zaXZlAQIcaE5vdEVub3VnaFNwYWNlSW5VbmJvbmRQb29sAQEFMFBvb2xOb3RGb3VuZAEBBUhSZXdhcmRQb29sTm90Rm91bmQBAQVAU3ViUG9vbHNOb3RGb3VuZAEBBXBCb25kZWRTdGFzaEtpbGxlZFByZW1hdHVyZWx5AQEFVERlbGVnYXRpb25VbnN1cHBvcnRlZAEBBTxTbGFzaE5vdEFwcGxpZWQBAQWcUGFydGlhbFVuYm9uZE5vdEFsbG93ZWRQZXJtaXNzaW9ubGVzc2x5AQEFXE1heENvbW1pc3Npb25SZXN0cmljdGVkAQEFYENvbW1pc3Npb25FeGNlZWRzTWF4aW11bQEBBXhDb21taXNzaW9uRXhjZWVkc0dsb2JhbE1heGltdW0BAQVkQ29tbWlzc2lvbkNoYW5nZVRocm90dGxlZAEBBXhDb21taXNzaW9uQ2hhbmdlUmF0ZU5vdEFsbG93ZWQBAQVMTm9QZW5kaW5nQ29tbWlzc2lvbgEBBVhOb0NvbW1pc3Npb25DdXJyZW50U2V0AQEFLFBvb2xJZEluVXNlAQEFNEludmFsaWRQb29sSWQBAQVMQm9uZEV4dHJhUmVzdHJpY3RlZAEBBTxOb3RoaW5nVG9BZGp1c3QBAQU4Tm90aGluZ1RvU2xhc2gBAQUsU2xhc2hUb29Mb3cBAQU8QWxyZWFkeU1pZ3JhdGVkAQEFLE5vdE1pZ3JhdGVkAQEFME5vdFN1cHBvcnRlZAEBBShSZXN0cmljdGVkAQEFAjAoTm90QWxsb3dlZAEBBThBbHJlYWR5U3Rha2luZwEBBWBJbnZhbGlkUmV3YXJkRGVzdGluYXRpb24BAQVESW52YWxpZERlbGVnYXRpb24BAQU4Tm90RW5vdWdoRnVuZHMBAQUgTm90QWdlbnQBAQUwTm90RGVsZWdhdG9yAQEFIEJhZFN0YXRlAQEFOFVuYXBwbGllZFNsYXNoAQEFOE5vdGhpbmdUb1NsYXNoAQEFOFdpdGhkcmF3RmFpbGVkAQEFME5vdFN1cHBvcnRlZAEBBQJEZFZhbGlkYXRvckluZGV4T3V0T2ZCb3VuZHMBAQVQVW5zY2hlZHVsZWRDYW5kaWRhdGUBAQVASGVhZERhdGFUb29MYXJnZQEBBVBQcmVtYXR1cmVDb2RlVXBncmFkZQEBBTxOZXdDb2RlVG9vTGFyZ2UBAQVURGlzYWxsb3dlZFJlbGF5UGFyZW50AQEFREludmFsaWRBc3NpZ25tZW50AQEFREludmFsaWRHcm91cEluZGV4AQEFTEluc3VmZmljaWVudEJhY2tpbmcBAQU4SW52YWxpZEJhY2tpbmcBAQVoVmFsaWRhdGlvbkRhdGFIYXNoTWlzbWF0Y2gBAQWASW5jb3JyZWN0RG93bndhcmRNZXNzYWdlSGFuZGxpbmcBAQVUSW52YWxpZFVwd2FyZE1lc3NhZ2VzAQEFYEhybXBXYXRlcm1hcmtNaXNoYW5kbGluZwEBBUxJbnZhbGlkT3V0Ym91bmRIcm1wAQEFZEludmFsaWRWYWxpZGF0aW9uQ29kZUhhc2gBAQVAUGFyYUhlYWRNaXNtYXRjaAEBBQIQZFRvb01hbnlJbmNsdXNpb25JbmhlcmVudHMBAQVMSW52YWxpZFBhcmVudEhlYWRlcgEBBYxJbmhlcmVudERhdGFGaWx0ZXJlZER1cmluZ0V4ZWN1dGlvbgEBBVBVbnNjaGVkdWxlZENhbmRpZGF0ZQEBBQJANE5vdFJlZ2lzdGVyZWQBAQU0Q2Fubm90T25ib2FyZAEBBThDYW5ub3RPZmZib2FyZAEBBTRDYW5ub3RVcGdyYWRlAQEFPENhbm5vdERvd25ncmFkZQEBBVhQdmZDaGVja1N0YXRlbWVudFN0YWxlAQEFXFB2ZkNoZWNrU3RhdGVtZW50RnV0dXJlAQEFhFB2ZkNoZWNrVmFsaWRhdG9ySW5kZXhPdXRPZkJvdW5kcwEBBWBQdmZDaGVja0ludmFsaWRTaWduYXR1cmUBAQVIUHZmQ2hlY2tEb3VibGVWb3RlAQEFWFB2ZkNoZWNrU3ViamVjdEludmFsaWQBAQVEQ2Fubm90VXBncmFkZUNvZGUBAQUsSW52YWxpZENvZGUBAQVETm90aGluZ0F1dGhvcml6ZWQBAQUwVW5hdXRob3JpemVkAQEFSEludmFsaWRCbG9ja051bWJlcgEBBQIMJFF1ZXVlRnVsbAEBBXBTcG90UHJpY2VIaWdoZXJUaGFuTWF4QW1vdW50AQEFTEluc3VmZmljaWVudENyZWRpdHMBAQUCCEBBc3NpZ25tZW50c0VtcHR5AQEFQERpc2FsbG93ZWRJbnNlcnQBAQUCKDxQYXJhRG9lc250RXhpc3QBAQVEUGFyYUFscmVhZHlFeGlzdHMBAQVURXhjZWVkc01heE1lc3NhZ2VTaXplAQEFKFVucm91dGFibGUBAQU4Q291bGRudENsZWFudXABAQU0Tm90UGFyYXRocmVhZAEBBTBOb3RQYXJhY2hhaW4BAQU0Q2Fubm90VXBncmFkZQEBBTxDYW5ub3REb3duZ3JhZGUBAQUwVG9vTWFueUNvcmVzAQEFAiQ8UGFyYURvZXNudEV4aXN0AQEFNE5vdFBhcmF0aHJlYWQBAQU0Q2Fubm90VXBncmFkZQEBBTxDYW5ub3REb3duZ3JhZGUBAQVMU2xvdEFscmVhZHlBc3NpZ25lZAEBBTxTbG90Tm90QXNzaWduZWQBAQVIT25nb2luZ0xlYXNlRXhpc3RzAQEFZE1heFBlcm1hbmVudFNsb3RzRXhjZWVkZWQBAQVkTWF4VGVtcG9yYXJ5U2xvdHNFeGNlZWRlZAEBBQIEHEJsb2NrZWQBAQUCBBxPbmdvaW5nAQEFAqQgT3ZlcmZsb3cBAQU0VW5pbXBsZW1lbnRlZAEBBWBVbnRydXN0ZWRSZXNlcnZlTG9jYXRpb24BAQVkVW50cnVzdGVkVGVsZXBvcnRMb2NhdGlvbgEBBTBMb2NhdGlvbkZ1bGwBAQVUTG9jYXRpb25Ob3RJbnZlcnRpYmxlAQEFJEJhZE9yaWdpbgEBBTxJbnZhbGlkTG9jYXRpb24BAQU0QXNzZXROb3RGb3VuZAEBBVRGYWlsZWRUb1RyYW5zYWN0QXNzZXQBAQU8Tm90V2l0aGRyYXdhYmxlAQEFSExvY2F0aW9uQ2Fubm90SG9sZAEBBVRFeGNlZWRzTWF4TWVzc2FnZVNpemUBAQVYRGVzdGluYXRpb25VbnN1cHBvcnRlZAEBBSRUcmFuc3BvcnQBAQUoVW5yb3V0YWJsZQEBBTBVbmtub3duQ2xhaW0BAQU4RmFpbGVkVG9EZWNvZGUBAQVATWF4V2VpZ2h0SW52YWxpZAEBBThOb3RIb2xkaW5nRmVlcwEBBTBUb29FeHBlbnNpdmUBAQUQVHJhcAEBBUBFeHBlY3RhdGlvbkZhbHNlAQEFOFBhbGxldE5vdEZvdW5kAQEFME5hbWVNaXNtYXRjaAEBBUxWZXJzaW9uSW5jb21wYXRpYmxlAQEFUEhvbGRpbmdXb3VsZE92ZXJmbG93AQEFLEV4cG9ydEVycm9yAQEFOFJlYW5jaG9yRmFpbGVkAQEFGE5vRGVhbAEBBShGZWVzTm90TWV0AQEFJExvY2tFcnJvcgEBBTBOb1Blcm1pc3Npb24BAQUoVW5hbmNob3JlZAEBBThOb3REZXBvc2l0YWJsZQEBBTRUb29NYW55QXNzZXRzAQEFTFVuaGFuZGxlZFhjbVZlcnNpb24BAQVIV2VpZ2h0TGltaXRSZWFjaGVkAQEFHEJhcnJpZXIBAQVMV2VpZ2h0Tm90Q29tcHV0YWJsZQEBBURFeGNlZWRzU3RhY2tMaW1pdAEBBQJwLFVucmVhY2hhYmxlAQEFLFNlbmRGYWlsdXJlAQEFIEZpbHRlcmVkAQEFSFVud2VpZ2hhYmxlTWVzc2FnZQEBBWBEZXN0aW5hdGlvbk5vdEludmVydGlibGUBAQUURW1wdHkBAQU4Q2Fubm90UmVhbmNob3IBAQU0VG9vTWFueUFzc2V0cwEBBTRJbnZhbGlkT3JpZ2luAQEFKEJhZFZlcnNpb24BAQUsQmFkTG9jYXRpb24BAQU4Tm9TdWJzY3JpcHRpb24BAQVEQWxyZWFkeVN1YnNjcmliZWQBAQVYQ2Fubm90Q2hlY2tPdXRUZWxlcG9ydAEBBShMb3dCYWxhbmNlAQEFMFRvb01hbnlMb2NrcwEBBUxBY2NvdW50Tm90U292ZXJlaWduAQEFKEZlZXNOb3RNZXQBAQUwTG9ja05vdEZvdW5kAQEFFEluVXNlAQEFaEludmFsaWRBc3NldFVua25vd25SZXNlcnZlAQEFeEludmFsaWRBc3NldFVuc3VwcG9ydGVkUmVzZXJ2ZQEBBTxUb29NYW55UmVzZXJ2ZXMBAQVgTG9jYWxFeGVjdXRpb25JbmNvbXBsZXRlAQEFYFRvb01hbnlBdXRob3JpemVkQWxpYXNlcwEBBTRFeHBpcmVzSW5QYXN0AQEFNEFsaWFzTm90Rm91bmQBAQWETG9jYWxFeGVjdXRpb25JbmNvbXBsZXRlV2l0aEVycm9yAQAIFGluZGV4BBRlcnJvcuUNAhggQmFkUHJvb2YBAQUYRnV0dXJlAQEFFFN0YWxlAQEFREFuY2llbnRCaXJ0aEJsb2NrAQEFNFVua25vd25PcmlnaW4BAQUcSW52YWxpZAEBBQIcYEludmFsaWRLZXlPd25lcnNoaXBQcm9vZgEBBWBJbnZhbGlkRG91YmxlVm90aW5nUHJvb2YBAQVYSW52YWxpZEZvcmtWb3RpbmdQcm9vZgEBBXRJbnZhbGlkRnV0dXJlQmxvY2tWb3RpbmdQcm9vZgEBBXxJbnZhbGlkRXF1aXZvY2F0aW9uUHJvb2ZTZXNzaW9uAQEFWER1cGxpY2F0ZU9mZmVuY2VSZXBvcnQBAQVQSW52YWxpZENvbmZpZ3VyYXRpb24BAQUCDQEYU3lzdGVtAQIkPEludmFsaWRTcGVjTmFtZQEBBWhTcGVjVmVyc2lvbk5lZWRzVG9JbmNyZWFzZQEBBXRGYWlsZWRUb0V4dHJhY3RSdW50aW1lVmVyc2lvbgEBBUxOb25EZWZhdWx0Q29tcG9zaXRlAQEFPE5vblplcm9SZWZDb3VudAEBBTBDYWxsRmlsdGVyZWQBAQVsTXVsdGlCbG9ja01pZ3JhdGlvbnNPbmdvaW5nAQEFRE5vdGhpbmdBdXRob3JpemVkAQEFMFVuYXV0aG9yaXplZAEBBRBCYWJlAQIQYEludmFsaWRFcXVpdm9jYXRpb25Qcm9vZgEBBWBJbnZhbGlkS2V5T3duZXJzaGlwUHJvb2YBAQVYRHVwbGljYXRlT2ZmZW5jZVJlcG9ydAEBBVBJbnZhbGlkQ29uZmlndXJhdGlvbgEBBSRUaW1lc3RhbXABAQUcSW5kaWNlcwECFCxOb3RBc3NpZ25lZAEBBSBOb3RPd25lcgEBBRRJblVzZQEBBSxOb3RUcmFuc2ZlcgEBBSRQZXJtYW5lbnQBAQUgQmFsYW5jZXMBAjA4VmVzdGluZ0JhbGFuY2UBAQVUTGlxdWlkaXR5UmVzdHJpY3Rpb25zAQEFTEluc3VmZmljaWVudEJhbGFuY2UBAQVIRXhpc3RlbnRpYWxEZXBvc2l0AQEFNEV4cGVuZGFiaWxpdHkBAQVcRXhpc3RpbmdWZXN0aW5nU2NoZWR1bGUBAQUsRGVhZEFjY291bnQBAQU8VG9vTWFueVJlc2VydmVzAQEFMFRvb01hbnlIb2xkcwEBBThUb29NYW55RnJlZXplcwEBBUxJc3N1YW5jZURlYWN0aXZhdGVkAQEFJERlbHRhWmVybwEBBUhUcmFuc2FjdGlvblBheW1lbnQBAQUoQXV0aG9yc2hpcAEBBRxTdGFraW5nAQKINE5vdENvbnRyb2xsZXIBAQUgTm90U3Rhc2gBAQU0QWxyZWFkeUJvbmRlZAEBBTRBbHJlYWR5UGFpcmVkAQEFMEVtcHR5VGFyZ2V0cwEBBThEdXBsaWNhdGVJbmRleAEBBURJbnZhbGlkU2xhc2hJbmRleAEBBUBJbnN1ZmZpY2llbnRCb25kAQEFME5vTW9yZUNodW5rcwEBBTROb1VubG9ja0NodW5rAQEFMEZ1bmRlZFRhcmdldAEBBUhJbnZhbGlkRXJhVG9SZXdhcmQBAQVoSW52YWxpZE51bWJlck9mTm9taW5hdGlvbnMBAQVITm90U29ydGVkQW5kVW5pcXVlAQEFOEFscmVhZHlDbGFpbWVkAQEFLEludmFsaWRQYWdlAQEFVEluY29ycmVjdEhpc3RvcnlEZXB0aAEBBVhJbmNvcnJlY3RTbGFzaGluZ1NwYW5zAQEFIEJhZFN0YXRlAQEFOFRvb01hbnlUYXJnZXRzAQEFJEJhZFRhcmdldAEBBUBDYW5ub3RDaGlsbE90aGVyAQEFRFRvb01hbnlOb21pbmF0b3JzAQEFRFRvb01hbnlWYWxpZGF0b3JzAQEFQENvbW1pc3Npb25Ub29Mb3cBAQUsQm91bmROb3RNZXQBAQVQQ29udHJvbGxlckRlcHJlY2F0ZWQBAQVMQ2Fubm90UmVzdG9yZUxlZGdlcgEBBWxSZXdhcmREZXN0aW5hdGlvblJlc3RyaWN0ZWQBAQU4Tm90RW5vdWdoRnVuZHMBAQVcVmlydHVhbFN0YWtlck5vdEFsbG93ZWQBAQU8Q2Fubm90UmVhcFN0YXNoAQEFPEFscmVhZHlNaWdyYXRlZAEBBShSZXN0cmljdGVkAQEFIE9mZmVuY2VzAQEFKEhpc3RvcmljYWwBAQUoUGFyYW1ldGVycwEBBRxTZXNzaW9uAQIUMEludmFsaWRQcm9vZgEBBVxOb0Fzc29jaWF0ZWRWYWxpZGF0b3JJZAEBBTREdXBsaWNhdGVkS2V5AQEFGE5vS2V5cwEBBSROb0FjY291bnQBAQUcR3JhbmRwYQECHCxQYXVzZUZhaWxlZAEBBTBSZXN1bWVGYWlsZWQBAQU0Q2hhbmdlUGVuZGluZwEBBRxUb29Tb29uAQEFYEludmFsaWRLZXlPd25lcnNoaXBQcm9vZgEBBWBJbnZhbGlkRXF1aXZvY2F0aW9uUHJvb2YBAQVYRHVwbGljYXRlT2ZmZW5jZVJlcG9ydAEBBUhBdXRob3JpdHlEaXNjb3ZlcnkBAQUcVXRpbGl0eQECBDBUb29NYW55Q2FsbHMBAQUgSWRlbnRpdHkBAnhIVG9vTWFueVN1YkFjY291bnRzAQEFIE5vdEZvdW5kAQEFIE5vdE5hbWVkAQEFKEVtcHR5SW5kZXgBAQUoRmVlQ2hhbmdlZAEBBShOb0lkZW50aXR5AQEFPFN0aWNreUp1ZGdlbWVudAEBBThKdWRnZW1lbnRHaXZlbgEBBUBJbnZhbGlkSnVkZ2VtZW50AQEFMEludmFsaWRJbmRleAEBBTRJbnZhbGlkVGFyZ2V0AQEFRFRvb01hbnlSZWdpc3RyYXJzAQEFOEFscmVhZHlDbGFpbWVkAQEFGE5vdFN1YgEBBSBOb3RPd25lZAEBBXRKdWRnZW1lbnRGb3JEaWZmZXJlbnRJZGVudGl0eQEBBVhKdWRnZW1lbnRQYXltZW50RmFpbGVkAQEFNEludmFsaWRTdWZmaXgBAQVQTm90VXNlcm5hbWVBdXRob3JpdHkBAQUwTm9BbGxvY2F0aW9uAQEFQEludmFsaWRTaWduYXR1cmUBAQVEUmVxdWlyZXNTaWduYXR1cmUBAQU8SW52YWxpZFVzZXJuYW1lAQEFNFVzZXJuYW1lVGFrZW4BAQUoTm9Vc2VybmFtZQEBBShOb3RFeHBpcmVkAQEFIFRvb0Vhcmx5AQEFME5vdFVuYmluZGluZwEBBUBBbHJlYWR5VW5iaW5kaW5nAQEFWEluc3VmZmljaWVudFByaXZpbGVnZXMBAQUgUmVjb3ZlcnkBAkAoTm90QWxsb3dlZAEBBTRaZXJvVGhyZXNob2xkAQEFQE5vdEVub3VnaEZyaWVuZHMBAQUoTWF4RnJpZW5kcwEBBSROb3RTb3J0ZWQBAQU4Tm90UmVjb3ZlcmFibGUBAQVIQWxyZWFkeVJlY292ZXJhYmxlAQEFOEFscmVhZHlTdGFydGVkAQEFKE5vdFN0YXJ0ZWQBAQUkTm90RnJpZW5kAQEFLERlbGF5UGVyaW9kAQEFOEFscmVhZHlWb3VjaGVkAQEFJFRocmVzaG9sZAEBBSxTdGlsbEFjdGl2ZQEBBTBBbHJlYWR5UHJveHkBAQUgQmFkU3RhdGUBAQUcVmVzdGluZwECFChOb3RWZXN0aW5nAQEFVEF0TWF4VmVzdGluZ1NjaGVkdWxlcwEBBSRBbW91bnRMb3cBAQVgU2NoZWR1bGVJbmRleE91dE9mQm91bmRzAQEFVEludmFsaWRTY2hlZHVsZVBhcmFtcwEBBSRTY2hlZHVsZXIBAhRARmFpbGVkVG9TY2hlZHVsZQEBBSBOb3RGb3VuZAEBBVxUYXJnZXRCbG9ja051bWJlckluUGFzdAEBBUhSZXNjaGVkdWxlTm9DaGFuZ2UBAQUUTmFtZWQBAQUgUHJlaW1hZ2UBAiAYVG9vQmlnAQEFMEFscmVhZHlOb3RlZAEBBTROb3RBdXRob3JpemVkAQEFIE5vdE5vdGVkAQEFJFJlcXVlc3RlZAEBBTBOb3RSZXF1ZXN0ZWQBAQUcVG9vTWFueQEBBRhUb29GZXcBAQUQU3VkbwECBCxSZXF1aXJlU3VkbwEBBRRQcm94eQECIBxUb29NYW55AQEFIE5vdEZvdW5kAQEFIE5vdFByb3h5AQEFLFVucHJveHlhYmxlAQEFJER1cGxpY2F0ZQEBBTBOb1Blcm1pc3Npb24BAQUsVW5hbm5vdW5jZWQBAQUsTm9TZWxmUHJveHkBAQUgTXVsdGlzaWcBAjhATWluaW11bVRocmVzaG9sZAEBBTxBbHJlYWR5QXBwcm92ZWQBAQVETm9BcHByb3ZhbHNOZWVkZWQBAQVEVG9vRmV3U2lnbmF0b3JpZXMBAQVIVG9vTWFueVNpZ25hdG9yaWVzAQEFVFNpZ25hdG9yaWVzT3V0T2ZPcmRlcgEBBUxTZW5kZXJJblNpZ25hdG9yaWVzAQEFIE5vdEZvdW5kAQEFIE5vdE93bmVyAQEFLE5vVGltZXBvaW50AQEFOFdyb25nVGltZXBvaW50AQEFTFVuZXhwZWN0ZWRUaW1lcG9pbnQBAQU8TWF4V2VpZ2h0VG9vTG93AQEFNEFscmVhZHlTdG9yZWQBAQVoRWxlY3Rpb25Qcm92aWRlck11bHRpUGhhc2UBAjxoUHJlRGlzcGF0Y2hFYXJseVN1Ym1pc3Npb24BAQVsUHJlRGlzcGF0Y2hXcm9uZ1dpbm5lckNvdW50AQEFZFByZURpc3BhdGNoV2Vha1N1Ym1pc3Npb24BAQU8U2lnbmVkUXVldWVGdWxsAQEFWFNpZ25lZENhbm5vdFBheURlcG9zaXQBAQVQU2lnbmVkSW52YWxpZFdpdG5lc3MBAQVMU2lnbmVkVG9vTXVjaFdlaWdodAEBBTxPY3dDYWxsV3JvbmdFcmEBAQVcTWlzc2luZ1NuYXBzaG90TWV0YWRhdGEBAQVYSW52YWxpZFN1Ym1pc3Npb25JbmRleAEBBThDYWxsTm90QWxsb3dlZAEBBThGYWxsYmFja0ZhaWxlZAEBBSxCb3VuZE5vdE1ldAEBBThUb29NYW55V2lubmVycwEBBWRQcmVEaXNwYXRjaERpZmZlcmVudFJvdW5kAQEFJFZvdGVyTGlzdAECCBBMaXN0AQIUJER1cGxpY2F0ZQEBBShOb3RIZWF2aWVyAQEFME5vdEluU2FtZUJhZwEBBTBOb2RlTm90Rm91bmQBAQUYTG9ja2VkAQEFGExvY2tlZAEBBTxOb21pbmF0aW9uUG9vbHMBApgwUG9vbE5vdEZvdW5kAQEFSFBvb2xNZW1iZXJOb3RGb3VuZAEBBUhSZXdhcmRQb29sTm90Rm91bmQBAQVAU3ViUG9vbHNOb3RGb3VuZAEBBWRBY2NvdW50QmVsb25nc1RvT3RoZXJQb29sAQEFOEZ1bGx5VW5ib25kaW5nAQEFRE1heFVuYm9uZGluZ0xpbWl0AQEFRENhbm5vdFdpdGhkcmF3QW55AQEFRE1pbmltdW1Cb25kTm90TWV0AQEFME92ZXJmbG93UmlzawEBBTROb3REZXN0cm95aW5nAQEFME5vdE5vbWluYXRvcgEBBVROb3RLaWNrZXJPckRlc3Ryb3lpbmcBAQUcTm90T3BlbgEBBSBNYXhQb29scwEBBThNYXhQb29sTWVtYmVycwEBBURDYW5Ob3RDaGFuZ2VTdGF0ZQEBBVREb2VzTm90SGF2ZVBlcm1pc3Npb24BAQVUTWV0YWRhdGFFeGNlZWRzTWF4TGVuAQEFJERlZmVuc2l2ZQECHGhOb3RFbm91Z2hTcGFjZUluVW5ib25kUG9vbAEBBTBQb29sTm90Rm91bmQBAQVIUmV3YXJkUG9vbE5vdEZvdW5kAQEFQFN1YlBvb2xzTm90Rm91bmQBAQVwQm9uZGVkU3Rhc2hLaWxsZWRQcmVtYXR1cmVseQEBBVREZWxlZ2F0aW9uVW5zdXBwb3J0ZWQBAQU8U2xhc2hOb3RBcHBsaWVkAQEFnFBhcnRpYWxVbmJvbmROb3RBbGxvd2VkUGVybWlzc2lvbmxlc3NseQEBBVxNYXhDb21taXNzaW9uUmVzdHJpY3RlZAEBBWBDb21taXNzaW9uRXhjZWVkc01heGltdW0BAQV4Q29tbWlzc2lvbkV4Y2VlZHNHbG9iYWxNYXhpbXVtAQEFZENvbW1pc3Npb25DaGFuZ2VUaHJvdHRsZWQBAQV4Q29tbWlzc2lvbkNoYW5nZVJhdGVOb3RBbGxvd2VkAQEFTE5vUGVuZGluZ0NvbW1pc3Npb24BAQVYTm9Db21taXNzaW9uQ3VycmVudFNldAEBBSxQb29sSWRJblVzZQEBBTRJbnZhbGlkUG9vbElkAQEFTEJvbmRFeHRyYVJlc3RyaWN0ZWQBAQU8Tm90aGluZ1RvQWRqdXN0AQEFOE5vdGhpbmdUb1NsYXNoAQEFLFNsYXNoVG9vTG93AQEFPEFscmVhZHlNaWdyYXRlZAEBBSxOb3RNaWdyYXRlZAEBBTBOb3RTdXBwb3J0ZWQBAQUoUmVzdHJpY3RlZAEBBSxGYXN0VW5zdGFrZQECGDROb3RDb250cm9sbGVyAQEFNEFscmVhZHlRdWV1ZWQBAQU4Tm90RnVsbHlCb25kZWQBAQUkTm90UXVldWVkAQEFLEFscmVhZHlIZWFkAQEFOENhbGxOb3RBbGxvd2VkAQEFQENvbnZpY3Rpb25Wb3RpbmcBAjAoTm90T25nb2luZwEBBSBOb3RWb3RlcgEBBTBOb1Blcm1pc3Npb24BAQU8Tm9QZXJtaXNzaW9uWWV0AQEFREFscmVhZHlEZWxlZ2F0aW5nAQEFNEFscmVhZHlWb3RpbmcBAQVESW5zdWZmaWNpZW50RnVuZHMBAQU0Tm90RGVsZWdhdGluZwEBBSBOb25zZW5zZQEBBTxNYXhWb3Rlc1JlYWNoZWQBAQUsQ2xhc3NOZWVkZWQBAQUgQmFkQ2xhc3MBAQUkUmVmZXJlbmRhAQI4KE5vdE9uZ29pbmcBAQUoSGFzRGVwb3NpdAEBBSBCYWRUcmFjawEBBRBGdWxsAQEFKFF1ZXVlRW1wdHkBAQU0QmFkUmVmZXJlbmR1bQEBBSxOb3RoaW5nVG9EbwEBBRxOb1RyYWNrAQEFKFVuZmluaXNoZWQBAQUwTm9QZXJtaXNzaW9uAQEFJE5vRGVwb3NpdAEBBSRCYWRTdGF0dXMBAQVAUHJlaW1hZ2VOb3RFeGlzdAEBBYRQcmVpbWFnZVN0b3JlZFdpdGhEaWZmZXJlbnRMZW5ndGgBAQUcT3JpZ2lucwEBBSRXaGl0ZWxpc3QBAhRMVW5hdmFpbGFibGVQcmVJbWFnZQEBBTxVbmRlY29kYWJsZUNhbGwBAQVgSW52YWxpZENhbGxXZWlnaHRXaXRuZXNzAQEFUENhbGxJc05vdFdoaXRlbGlzdGVkAQEFWENhbGxBbHJlYWR5V2hpdGVsaXN0ZWQBAQUgVHJlYXN1cnkBAiwwSW52YWxpZEluZGV4AQEFQFRvb01hbnlBcHByb3ZhbHMBAQVYSW5zdWZmaWNpZW50UGVybWlzc2lvbgEBBUxQcm9wb3NhbE5vdEFwcHJvdmVkAQEFWEZhaWxlZFRvQ29udmVydEJhbGFuY2UBAQUwU3BlbmRFeHBpcmVkAQEFLEVhcmx5UGF5b3V0AQEFQEFscmVhZHlBdHRlbXB0ZWQBAQUsUGF5b3V0RXJyb3IBAQUwTm90QXR0ZW1wdGVkAQEFMEluY29uY2x1c2l2ZQEBBUBEZWxlZ2F0ZWRTdGFraW5nAQIwKE5vdEFsbG93ZWQBAQU4QWxyZWFkeVN0YWtpbmcBAQVgSW52YWxpZFJld2FyZERlc3RpbmF0aW9uAQEFREludmFsaWREZWxlZ2F0aW9uAQEFOE5vdEVub3VnaEZ1bmRzAQEFIE5vdEFnZW50AQEFME5vdERlbGVnYXRvcgEBBSBCYWRTdGF0ZQEBBThVbmFwcGxpZWRTbGFzaAEBBThOb3RoaW5nVG9TbGFzaAEBBThXaXRoZHJhd0ZhaWxlZAEBBTBOb3RTdXBwb3J0ZWQBAQVAUGFyYWNoYWluc09yaWdpbgEBBTRDb25maWd1cmF0aW9uAQIEPEludmFsaWROZXdWYWx1ZQEBBSxQYXJhc1NoYXJlZAEBBTRQYXJhSW5jbHVzaW9uAQJEZFZhbGlkYXRvckluZGV4T3V0T2ZCb3VuZHMBAQVQVW5zY2hlZHVsZWRDYW5kaWRhdGUBAQVASGVhZERhdGFUb29MYXJnZQEBBVBQcmVtYXR1cmVDb2RlVXBncmFkZQEBBTxOZXdDb2RlVG9vTGFyZ2UBAQVURGlzYWxsb3dlZFJlbGF5UGFyZW50AQEFREludmFsaWRBc3NpZ25tZW50AQEFREludmFsaWRHcm91cEluZGV4AQEFTEluc3VmZmljaWVudEJhY2tpbmcBAQU4SW52YWxpZEJhY2tpbmcBAQVoVmFsaWRhdGlvbkRhdGFIYXNoTWlzbWF0Y2gBAQWASW5jb3JyZWN0RG93bndhcmRNZXNzYWdlSGFuZGxpbmcBAQVUSW52YWxpZFVwd2FyZE1lc3NhZ2VzAQEFYEhybXBXYXRlcm1hcmtNaXNoYW5kbGluZwEBBUxJbnZhbGlkT3V0Ym91bmRIcm1wAQEFZEludmFsaWRWYWxpZGF0aW9uQ29kZUhhc2gBAQVAUGFyYUhlYWRNaXNtYXRjaAEBBTBQYXJhSW5oZXJlbnQBAhBkVG9vTWFueUluY2x1c2lvbkluaGVyZW50cwEBBUxJbnZhbGlkUGFyZW50SGVhZGVyAQEFjEluaGVyZW50RGF0YUZpbHRlcmVkRHVyaW5nRXhlY3V0aW9uAQEFUFVuc2NoZWR1bGVkQ2FuZGlkYXRlAQEFNFBhcmFTY2hlZHVsZXIBAQUUUGFyYXMBAkA0Tm90UmVnaXN0ZXJlZAEBBTRDYW5ub3RPbmJvYXJkAQEFOENhbm5vdE9mZmJvYXJkAQEFNENhbm5vdFVwZ3JhZGUBAQU8Q2Fubm90RG93bmdyYWRlAQEFWFB2ZkNoZWNrU3RhdGVtZW50U3RhbGUBAQVcUHZmQ2hlY2tTdGF0ZW1lbnRGdXR1cmUBAQWEUHZmQ2hlY2tWYWxpZGF0b3JJbmRleE91dE9mQm91bmRzAQEFYFB2ZkNoZWNrSW52YWxpZFNpZ25hdHVyZQEBBUhQdmZDaGVja0RvdWJsZVZvdGUBAQVYUHZmQ2hlY2tTdWJqZWN0SW52YWxpZAEBBURDYW5ub3RVcGdyYWRlQ29kZQEBBSxJbnZhbGlkQ29kZQEBBUROb3RoaW5nQXV0aG9yaXplZAEBBTBVbmF1dGhvcml6ZWQBAQVISW52YWxpZEJsb2NrTnVtYmVyAQEFLEluaXRpYWxpemVyAQEFDERtcAEBBRBIcm1wAQJQVE9wZW5Icm1wQ2hhbm5lbFRvU2VsZgEBBXxPcGVuSHJtcENoYW5uZWxJbnZhbGlkUmVjaXBpZW50AQEFbE9wZW5Icm1wQ2hhbm5lbFplcm9DYXBhY2l0eQEBBYxPcGVuSHJtcENoYW5uZWxDYXBhY2l0eUV4Y2VlZHNMaW1pdAEBBXhPcGVuSHJtcENoYW5uZWxaZXJvTWVzc2FnZVNpemUBAQWYT3BlbkhybXBDaGFubmVsTWVzc2FnZVNpemVFeGNlZWRzTGltaXQBAQVwT3BlbkhybXBDaGFubmVsQWxyZWFkeUV4aXN0cwEBBXxPcGVuSHJtcENoYW5uZWxBbHJlYWR5UmVxdWVzdGVkAQEFcE9wZW5Icm1wQ2hhbm5lbExpbWl0RXhjZWVkZWQBAQVwQWNjZXB0SHJtcENoYW5uZWxEb2VzbnRFeGlzdAEBBYRBY2NlcHRIcm1wQ2hhbm5lbEFscmVhZHlDb25maXJtZWQBAQV4QWNjZXB0SHJtcENoYW5uZWxMaW1pdEV4Y2VlZGVkAQEFcENsb3NlSHJtcENoYW5uZWxVbmF1dGhvcml6ZWQBAQVsQ2xvc2VIcm1wQ2hhbm5lbERvZXNudEV4aXN0AQEFfENsb3NlSHJtcENoYW5uZWxBbHJlYWR5VW5kZXJ3YXkBAQWEQ2FuY2VsSHJtcE9wZW5DaGFubmVsVW5hdXRob3JpemVkAQEFaE9wZW5Icm1wQ2hhbm5lbERvZXNudEV4aXN0AQEFfE9wZW5Icm1wQ2hhbm5lbEFscmVhZHlDb25maXJtZWQBAQUwV3JvbmdXaXRuZXNzAQEFcENoYW5uZWxDcmVhdGlvbk5vdEF1dGhvcml6ZWQBAQU8UGFyYVNlc3Npb25JbmZvAQEFNFBhcmFzRGlzcHV0ZXMBAiR0RHVwbGljYXRlRGlzcHV0ZVN0YXRlbWVudFNldHMBAQVcQW5jaWVudERpc3B1dGVTdGF0ZW1lbnQBAQVkVmFsaWRhdG9ySW5kZXhPdXRPZkJvdW5kcwEBBUBJbnZhbGlkU2lnbmF0dXJlAQEFSER1cGxpY2F0ZVN0YXRlbWVudAEBBUhTaW5nbGVTaWRlZERpc3B1dGUBAQU8TWFsaWNpb3VzQmFja2VyAQEFTE1pc3NpbmdCYWNraW5nVm90ZXMBAQVIVW5jb25maXJtZWREaXNwdXRlAQEFNFBhcmFzU2xhc2hpbmcBAhhgSW52YWxpZEtleU93bmVyc2hpcFByb29mAQEFTEludmFsaWRTZXNzaW9uSW5kZXgBAQVQSW52YWxpZENhbmRpZGF0ZUhhc2gBAQVUSW52YWxpZFZhbGlkYXRvckluZGV4AQEFYFZhbGlkYXRvckluZGV4SWRNaXNtYXRjaAEBBVxEdXBsaWNhdGVTbGFzaGluZ1JlcG9ydAEBBWhPbkRlbWFuZEFzc2lnbm1lbnRQcm92aWRlcgECDCRRdWV1ZUZ1bGwBAQVwU3BvdFByaWNlSGlnaGVyVGhhbk1heEFtb3VudAEBBUxJbnN1ZmZpY2llbnRDcmVkaXRzAQEFaENvcmV0aW1lQXNzaWdubWVudFByb3ZpZGVyAQIIQEFzc2lnbm1lbnRzRW1wdHkBAQVARGlzYWxsb3dlZEluc2VydAEBBSRSZWdpc3RyYXIBAjg0Tm90UmVnaXN0ZXJlZAEBBURBbHJlYWR5UmVnaXN0ZXJlZAEBBSBOb3RPd25lcgEBBTBDb2RlVG9vTGFyZ2UBAQVASGVhZERhdGFUb29MYXJnZQEBBTBOb3RQYXJhY2hhaW4BAQU0Tm90UGFyYXRocmVhZAEBBUBDYW5ub3REZXJlZ2lzdGVyAQEFPENhbm5vdERvd25ncmFkZQEBBTRDYW5ub3RVcGdyYWRlAQEFKFBhcmFMb2NrZWQBAQUsTm90UmVzZXJ2ZWQBAQUsSW52YWxpZENvZGUBAQUoQ2Fubm90U3dhcAEBBRRTbG90cwECCERQYXJhTm90T25ib2FyZGluZwEBBShMZWFzZUVycm9yAQEFQFBhcmFzU3Vkb1dyYXBwZXIBAig8UGFyYURvZXNudEV4aXN0AQEFRFBhcmFBbHJlYWR5RXhpc3RzAQEFVEV4Y2VlZHNNYXhNZXNzYWdlU2l6ZQEBBShVbnJvdXRhYmxlAQEFOENvdWxkbnRDbGVhbnVwAQEFNE5vdFBhcmF0aHJlYWQBAQUwTm90UGFyYWNoYWluAQEFNENhbm5vdFVwZ3JhZGUBAQU8Q2Fubm90RG93bmdyYWRlAQEFMFRvb01hbnlDb3JlcwEBBSBBdWN0aW9ucwECHERBdWN0aW9uSW5Qcm9ncmVzcwEBBURMZWFzZVBlcmlvZEluUGFzdAEBBURQYXJhTm90UmVnaXN0ZXJlZAEBBUROb3RDdXJyZW50QXVjdGlvbgEBBShOb3RBdWN0aW9uAQEFMEF1Y3Rpb25FbmRlZAEBBUBBbHJlYWR5TGVhc2VkT3V0AQEFJENyb3dkbG9hbgECXERGaXJzdFBlcmlvZEluUGFzdAEBBWRGaXJzdFBlcmlvZFRvb0ZhckluRnV0dXJlAQEFbExhc3RQZXJpb2RCZWZvcmVGaXJzdFBlcmlvZAEBBWBMYXN0UGVyaW9kVG9vRmFySW5GdXR1cmUBAQU8Q2Fubm90RW5kSW5QYXN0AQEFREVuZFRvb0ZhckluRnV0dXJlAQEFIE92ZXJmbG93AQEFUENvbnRyaWJ1dGlvblRvb1NtYWxsAQEFNEludmFsaWRQYXJhSWQBAQUsQ2FwRXhjZWVkZWQBAQVYQ29udHJpYnV0aW9uUGVyaW9kT3ZlcgEBBTRJbnZhbGlkT3JpZ2luAQEFME5vdFBhcmFjaGFpbgEBBSxMZWFzZUFjdGl2ZQEBBUBCaWRPckxlYXNlQWN0aXZlAQEFMEZ1bmROb3RFbmRlZAEBBTxOb0NvbnRyaWJ1dGlvbnMBAQVITm90UmVhZHlUb0Rpc3NvbHZlAQEFQEludmFsaWRTaWduYXR1cmUBAQUwTWVtb1Rvb0xhcmdlAQEFREFscmVhZHlJbk5ld1JhaXNlAQEFSFZyZkRlbGF5SW5Qcm9ncmVzcwEBBTROb0xlYXNlUGVyaW9kAQEFNEFzc2lnbmVkU2xvdHMBAiQ8UGFyYURvZXNudEV4aXN0AQEFNE5vdFBhcmF0aHJlYWQBAQU0Q2Fubm90VXBncmFkZQEBBTxDYW5ub3REb3duZ3JhZGUBAQVMU2xvdEFscmVhZHlBc3NpZ25lZAEBBTxTbG90Tm90QXNzaWduZWQBAQVIT25nb2luZ0xlYXNlRXhpc3RzAQEFZE1heFBlcm1hbmVudFNsb3RzRXhjZWVkZWQBAQVkTWF4VGVtcG9yYXJ5U2xvdHNFeGNlZWRlZAEBBSBDb3JldGltZQECDCROb3RCcm9rZXIBAQVYUmVxdWVzdGVkRnV0dXJlUmV2ZW51ZQEBBUxBc3NldFRyYW5zZmVyRmFpbGVkAQEFPFN0YWtpbmdBaENsaWVudAECBBxCbG9ja2VkAQEFUE11bHRpQmxvY2tNaWdyYXRpb25zAQIEHE9uZ29pbmcBAQUkWGNtUGFsbGV0AQJwLFVucmVhY2hhYmxlAQEFLFNlbmRGYWlsdXJlAQEFIEZpbHRlcmVkAQEFSFVud2VpZ2hhYmxlTWVzc2FnZQEBBWBEZXN0aW5hdGlvbk5vdEludmVydGlibGUBAQUURW1wdHkBAQU4Q2Fubm90UmVhbmNob3IBAQU0VG9vTWFueUFzc2V0cwEBBTRJbnZhbGlkT3JpZ2luAQEFKEJhZFZlcnNpb24BAQUsQmFkTG9jYXRpb24BAQU4Tm9TdWJzY3JpcHRpb24BAQVEQWxyZWFkeVN1YnNjcmliZWQBAQVYQ2Fubm90Q2hlY2tPdXRUZWxlcG9ydAEBBShMb3dCYWxhbmNlAQEFMFRvb01hbnlMb2NrcwEBBUxBY2NvdW50Tm90U292ZXJlaWduAQEFKEZlZXNOb3RNZXQBAQUwTG9ja05vdEZvdW5kAQEFFEluVXNlAQEFaEludmFsaWRBc3NldFVua25vd25SZXNlcnZlAQEFeEludmFsaWRBc3NldFVuc3VwcG9ydGVkUmVzZXJ2ZQEBBTxUb29NYW55UmVzZXJ2ZXMBAQVgTG9jYWxFeGVjdXRpb25JbmNvbXBsZXRlAQEFYFRvb01hbnlBdXRob3JpemVkQWxpYXNlcwEBBTRFeHBpcmVzSW5QYXN0AQEFNEFsaWFzTm90Rm91bmQBAQWETG9jYWxFeGVjdXRpb25JbmNvbXBsZXRlV2l0aEVycm9yAQAIFGluZGV4BBRlcnJvcuUNME1lc3NhZ2VRdWV1ZQECJCxOb3RSZWFwYWJsZQEBBRhOb1BhZ2UBAQUkTm9NZXNzYWdlAQEFQEFscmVhZHlQcm9jZXNzZWQBAQUYUXVldWVkAQEFSEluc3VmZmljaWVudFdlaWdodAEBBWBUZW1wb3JhcmlseVVucHJvY2Vzc2FibGUBAQUsUXVldWVQYXVzZWQBAQVMUmVjdXJzaXZlRGlzYWxsb3dlZAEBBSRBc3NldFJhdGUBAgxAVW5rbm93bkFzc2V0S2luZAEBBTRBbHJlYWR5RXhpc3RzAQEFIE92ZXJmbG93AQEFLFJvb3RUZXN0aW5nAQEFGE1ldGFUeAECGCBCYWRQcm9vZgEBBRhGdXR1cmUBAQUUU3RhbGUBAQVEQW5jaWVudEJpcnRoQmxvY2sBAQU0VW5rbm93bk9yaWdpbgEBBRxJbnZhbGlkAQEFPFZlcmlmeVNpZ25hdHVyZQEBBRRCZWVmeQECHGBJbnZhbGlkS2V5T3duZXJzaGlwUHJvb2YBAQVgSW52YWxpZERvdWJsZVZvdGluZ1Byb29mAQEFWEludmFsaWRGb3JrVm90aW5nUHJvb2YBAQV0SW52YWxpZEZ1dHVyZUJsb2NrVm90aW5nUHJvb2YBAQV8SW52YWxpZEVxdWl2b2NhdGlvblByb29mU2Vzc2lvbgEBBVhEdXBsaWNhdGVPZmZlbmNlUmVwb3J0AQEFUEludmFsaWRDb25maWd1cmF0aW9uAQEFDE1tcgEBBTBCZWVmeU1tckxlYWYBAQVASWRlbnRpdHlNaWdyYXRvcgEBBQI4QEludmFsaWRTdGF0ZVJvb3QBAQVISW5jb21wbGV0ZURhdGFiYXNlAQEFUFZhbHVlQXRJbmNvbXBsZXRlS2V5AQEFMERlY29kZXJFcnJvcgEBBSxJbnZhbGlkSGFzaAEBBTBEdXBsaWNhdGVLZXkBAQU4RXh0cmFuZW91c05vZGUBAQU8RXh0cmFuZW91c1ZhbHVlAQEFXEV4dHJhbmVvdXNIYXNoUmVmZXJlbmNlAQEFVEludmFsaWRDaGlsZFJlZmVyZW5jZQEBBTRWYWx1ZU1pc21hdGNoAQEFPEluY29tcGxldGVQcm9vZgEBBTBSb290TWlzbWF0Y2gBAQUsRGVjb2RlRXJyb3IBAQUCPBRPdGhlcgEBBTBDYW5ub3RMb29rdXABAQUkQmFkT3JpZ2luAQEFGE1vZHVsZQECDQEYU3lzdGVtAQIkPEludmFsaWRTcGVjTmFtZQEBBWhTcGVjVmVyc2lvbk5lZWRzVG9JbmNyZWFzZQEBBXRGYWlsZWRUb0V4dHJhY3RSdW50aW1lVmVyc2lvbgEBBUxOb25EZWZhdWx0Q29tcG9zaXRlAQEFPE5vblplcm9SZWZDb3VudAEBBTBDYWxsRmlsdGVyZWQBAQVsTXVsdGlCbG9ja01pZ3JhdGlvbnNPbmdvaW5nAQEFRE5vdGhpbmdBdXRob3JpemVkAQEFMFVuYXV0aG9yaXplZAEBBRBCYWJlAQIQYEludmFsaWRFcXVpdm9jYXRpb25Qcm9vZgEBBWBJbnZhbGlkS2V5T3duZXJzaGlwUHJvb2YBAQVYRHVwbGljYXRlT2ZmZW5jZVJlcG9ydAEBBVBJbnZhbGlkQ29uZmlndXJhdGlvbgEBBSRUaW1lc3RhbXABAQUcSW5kaWNlcwECFCxOb3RBc3NpZ25lZAEBBSBOb3RPd25lcgEBBRRJblVzZQEBBSxOb3RUcmFuc2ZlcgEBBSRQZXJtYW5lbnQBAQUgQmFsYW5jZXMBAjA4VmVzdGluZ0JhbGFuY2UBAQVUTGlxdWlkaXR5UmVzdHJpY3Rpb25zAQEFTEluc3VmZmljaWVudEJhbGFuY2UBAQVIRXhpc3RlbnRpYWxEZXBvc2l0AQEFNEV4cGVuZGFiaWxpdHkBAQVcRXhpc3RpbmdWZXN0aW5nU2NoZWR1bGUBAQUsRGVhZEFjY291bnQBAQU8VG9vTWFueVJlc2VydmVzAQEFMFRvb01hbnlIb2xkcwEBBThUb29NYW55RnJlZXplcwEBBUxJc3N1YW5jZURlYWN0aXZhdGVkAQEFJERlbHRhWmVybwEBBUhUcmFuc2FjdGlvblBheW1lbnQBAQUoQXV0aG9yc2hpcAEBBRxTdGFraW5nAQKINE5vdENvbnRyb2xsZXIBAQUgTm90U3Rhc2gBAQU0QWxyZWFkeUJvbmRlZAEBBTRBbHJlYWR5UGFpcmVkAQEFMEVtcHR5VGFyZ2V0cwEBBThEdXBsaWNhdGVJbmRleAEBBURJbnZhbGlkU2xhc2hJbmRleAEBBUBJbnN1ZmZpY2llbnRCb25kAQEFME5vTW9yZUNodW5rcwEBBTROb1VubG9ja0NodW5rAQEFMEZ1bmRlZFRhcmdldAEBBUhJbnZhbGlkRXJhVG9SZXdhcmQBAQVoSW52YWxpZE51bWJlck9mTm9taW5hdGlvbnMBAQVITm90U29ydGVkQW5kVW5pcXVlAQEFOEFscmVhZHlDbGFpbWVkAQEFLEludmFsaWRQYWdlAQEFVEluY29ycmVjdEhpc3RvcnlEZXB0aAEBBVhJbmNvcnJlY3RTbGFzaGluZ1NwYW5zAQEFIEJhZFN0YXRlAQEFOFRvb01hbnlUYXJnZXRzAQEFJEJhZFRhcmdldAEBBUBDYW5ub3RDaGlsbE90aGVyAQEFRFRvb01hbnlOb21pbmF0b3JzAQEFRFRvb01hbnlWYWxpZGF0b3JzAQEFQENvbW1pc3Npb25Ub29Mb3cBAQUsQm91bmROb3RNZXQBAQVQQ29udHJvbGxlckRlcHJlY2F0ZWQBAQVMQ2Fubm90UmVzdG9yZUxlZGdlcgEBBWxSZXdhcmREZXN0aW5hdGlvblJlc3RyaWN0ZWQBAQU4Tm90RW5vdWdoRnVuZHMBAQVcVmlydHVhbFN0YWtlck5vdEFsbG93ZWQBAQU8Q2Fubm90UmVhcFN0YXNoAQEFPEFscmVhZHlNaWdyYXRlZAEBBShSZXN0cmljdGVkAQEFIE9mZmVuY2VzAQEFKEhpc3RvcmljYWwBAQUoUGFyYW1ldGVycwEBBRxTZXNzaW9uAQIUMEludmFsaWRQcm9vZgEBBVxOb0Fzc29jaWF0ZWRWYWxpZGF0b3JJZAEBBTREdXBsaWNhdGVkS2V5AQEFGE5vS2V5cwEBBSROb0FjY291bnQBAQUcR3JhbmRwYQECHCxQYXVzZUZhaWxlZAEBBTBSZXN1bWVGYWlsZWQBAQU0Q2hhbmdlUGVuZGluZwEBBRxUb29Tb29uAQEFYEludmFsaWRLZXlPd25lcnNoaXBQcm9vZgEBBWBJbnZhbGlkRXF1aXZvY2F0aW9uUHJvb2YBAQVYRHVwbGljYXRlT2ZmZW5jZVJlcG9ydAEBBUhBdXRob3JpdHlEaXNjb3ZlcnkBAQUcVXRpbGl0eQECBDBUb29NYW55Q2FsbHMBAQUgSWRlbnRpdHkBAnhIVG9vTWFueVN1YkFjY291bnRzAQEFIE5vdEZvdW5kAQEFIE5vdE5hbWVkAQEFKEVtcHR5SW5kZXgBAQUoRmVlQ2hhbmdlZAEBBShOb0lkZW50aXR5AQEFPFN0aWNreUp1ZGdlbWVudAEBBThKdWRnZW1lbnRHaXZlbgEBBUBJbnZhbGlkSnVkZ2VtZW50AQEFMEludmFsaWRJbmRleAEBBTRJbnZhbGlkVGFyZ2V0AQEFRFRvb01hbnlSZWdpc3RyYXJzAQEFOEFscmVhZHlDbGFpbWVkAQEFGE5vdFN1YgEBBSBOb3RPd25lZAEBBXRKdWRnZW1lbnRGb3JEaWZmZXJlbnRJZGVudGl0eQEBBVhKdWRnZW1lbnRQYXltZW50RmFpbGVkAQEFNEludmFsaWRTdWZmaXgBAQVQTm90VXNlcm5hbWVBdXRob3JpdHkBAQUwTm9BbGxvY2F0aW9uAQEFQEludmFsaWRTaWduYXR1cmUBAQVEUmVxdWlyZXNTaWduYXR1cmUBAQU8SW52YWxpZFVzZXJuYW1lAQEFNFVzZXJuYW1lVGFrZW4BAQUoTm9Vc2VybmFtZQEBBShOb3RFeHBpcmVkAQEFIFRvb0Vhcmx5AQEFME5vdFVuYmluZGluZwEBBUBBbHJlYWR5VW5iaW5kaW5nAQEFWEluc3VmZmljaWVudFByaXZpbGVnZXMBAQUgUmVjb3ZlcnkBAkAoTm90QWxsb3dlZAEBBTRaZXJvVGhyZXNob2xkAQEFQE5vdEVub3VnaEZyaWVuZHMBAQUoTWF4RnJpZW5kcwEBBSROb3RTb3J0ZWQBAQU4Tm90UmVjb3ZlcmFibGUBAQVIQWxyZWFkeVJlY292ZXJhYmxlAQEFOEFscmVhZHlTdGFydGVkAQEFKE5vdFN0YXJ0ZWQBAQUkTm90RnJpZW5kAQEFLERlbGF5UGVyaW9kAQEFOEFscmVhZHlWb3VjaGVkAQEFJFRocmVzaG9sZAEBBSxTdGlsbEFjdGl2ZQEBBTBBbHJlYWR5UHJveHkBAQUgQmFkU3RhdGUBAQUcVmVzdGluZwECFChOb3RWZXN0aW5nAQEFVEF0TWF4VmVzdGluZ1NjaGVkdWxlcwEBBSRBbW91bnRMb3cBAQVgU2NoZWR1bGVJbmRleE91dE9mQm91bmRzAQEFVEludmFsaWRTY2hlZHVsZVBhcmFtcwEBBSRTY2hlZHVsZXIBAhRARmFpbGVkVG9TY2hlZHVsZQEBBSBOb3RGb3VuZAEBBVxUYXJnZXRCbG9ja051bWJlckluUGFzdAEBBUhSZXNjaGVkdWxlTm9DaGFuZ2UBAQUUTmFtZWQBAQUgUHJlaW1hZ2UBAiAYVG9vQmlnAQEFMEFscmVhZHlOb3RlZAEBBTROb3RBdXRob3JpemVkAQEFIE5vdE5vdGVkAQEFJFJlcXVlc3RlZAEBBTBOb3RSZXF1ZXN0ZWQBAQUcVG9vTWFueQEBBRhUb29GZXcBAQUQU3VkbwECBCxSZXF1aXJlU3VkbwEBBRRQcm94eQECIBxUb29NYW55AQEFIE5vdEZvdW5kAQEFIE5vdFByb3h5AQEFLFVucHJveHlhYmxlAQEFJER1cGxpY2F0ZQEBBTBOb1Blcm1pc3Npb24BAQUsVW5hbm5vdW5jZWQBAQUsTm9TZWxmUHJveHkBAQUgTXVsdGlzaWcBAjhATWluaW11bVRocmVzaG9sZAEBBTxBbHJlYWR5QXBwcm92ZWQBAQVETm9BcHByb3ZhbHNOZWVkZWQBAQVEVG9vRmV3U2lnbmF0b3JpZXMBAQVIVG9vTWFueVNpZ25hdG9yaWVzAQEFVFNpZ25hdG9yaWVzT3V0T2ZPcmRlcgEBBUxTZW5kZXJJblNpZ25hdG9yaWVzAQEFIE5vdEZvdW5kAQEFIE5vdE93bmVyAQEFLE5vVGltZXBvaW50AQEFOFdyb25nVGltZXBvaW50AQEFTFVuZXhwZWN0ZWRUaW1lcG9pbnQBAQU8TWF4V2VpZ2h0VG9vTG93AQEFNEFscmVhZHlTdG9yZWQBAQVoRWxlY3Rpb25Qcm92aWRlck11bHRpUGhhc2UBAjxoUHJlRGlzcGF0Y2hFYXJseVN1Ym1pc3Npb24BAQVsUHJlRGlzcGF0Y2hXcm9uZ1dpbm5lckNvdW50AQEFZFByZURpc3BhdGNoV2Vha1N1Ym1pc3Npb24BAQU8U2lnbmVkUXVldWVGdWxsAQEFWFNpZ25lZENhbm5vdFBheURlcG9zaXQBAQVQU2lnbmVkSW52YWxpZFdpdG5lc3MBAQVMU2lnbmVkVG9vTXVjaFdlaWdodAEBBTxPY3dDYWxsV3JvbmdFcmEBAQVcTWlzc2luZ1NuYXBzaG90TWV0YWRhdGEBAQVYSW52YWxpZFN1Ym1pc3Npb25JbmRleAEBBThDYWxsTm90QWxsb3dlZAEBBThGYWxsYmFja0ZhaWxlZAEBBSxCb3VuZE5vdE1ldAEBBThUb29NYW55V2lubmVycwEBBWRQcmVEaXNwYXRjaERpZmZlcmVudFJvdW5kAQEFJFZvdGVyTGlzdAECCBBMaXN0AQIUJER1cGxpY2F0ZQEBBShOb3RIZWF2aWVyAQEFME5vdEluU2FtZUJhZwEBBTBOb2RlTm90Rm91bmQBAQUYTG9ja2VkAQEFGExvY2tlZAEBBTxOb21pbmF0aW9uUG9vbHMBApgwUG9vbE5vdEZvdW5kAQEFSFBvb2xNZW1iZXJOb3RGb3VuZAEBBUhSZXdhcmRQb29sTm90Rm91bmQBAQVAU3ViUG9vbHNOb3RGb3VuZAEBBWRBY2NvdW50QmVsb25nc1RvT3RoZXJQb29sAQEFOEZ1bGx5VW5ib25kaW5nAQEFRE1heFVuYm9uZGluZ0xpbWl0AQEFRENhbm5vdFdpdGhkcmF3QW55AQEFRE1pbmltdW1Cb25kTm90TWV0AQEFME92ZXJmbG93UmlzawEBBTROb3REZXN0cm95aW5nAQEFME5vdE5vbWluYXRvcgEBBVROb3RLaWNrZXJPckRlc3Ryb3lpbmcBAQUcTm90T3BlbgEBBSBNYXhQb29scwEBBThNYXhQb29sTWVtYmVycwEBBURDYW5Ob3RDaGFuZ2VTdGF0ZQEBBVREb2VzTm90SGF2ZVBlcm1pc3Npb24BAQVUTWV0YWRhdGFFeGNlZWRzTWF4TGVuAQEFJERlZmVuc2l2ZQECHGhOb3RFbm91Z2hTcGFjZUluVW5ib25kUG9vbAEBBTBQb29sTm90Rm91bmQBAQVIUmV3YXJkUG9vbE5vdEZvdW5kAQEFQFN1YlBvb2xzTm90Rm91bmQBAQVwQm9uZGVkU3Rhc2hLaWxsZWRQcmVtYXR1cmVseQEBBVREZWxlZ2F0aW9uVW5zdXBwb3J0ZWQBAQU8U2xhc2hOb3RBcHBsaWVkAQEFnFBhcnRpYWxVbmJvbmROb3RBbGxvd2VkUGVybWlzc2lvbmxlc3NseQEBBVxNYXhDb21taXNzaW9uUmVzdHJpY3RlZAEBBWBDb21taXNzaW9uRXhjZWVkc01heGltdW0BAQV4Q29tbWlzc2lvbkV4Y2VlZHNHbG9iYWxNYXhpbXVtAQEFZENvbW1pc3Npb25DaGFuZ2VUaHJvdHRsZWQBAQV4Q29tbWlzc2lvbkNoYW5nZVJhdGVOb3RBbGxvd2VkAQEFTE5vUGVuZGluZ0NvbW1pc3Npb24BAQVYTm9Db21taXNzaW9uQ3VycmVudFNldAEBBSxQb29sSWRJblVzZQEBBTRJbnZhbGlkUG9vbElkAQEFTEJvbmRFeHRyYVJlc3RyaWN0ZWQBAQU8Tm90aGluZ1RvQWRqdXN0AQEFOE5vdGhpbmdUb1NsYXNoAQEFLFNsYXNoVG9vTG93AQEFPEFscmVhZHlNaWdyYXRlZAEBBSxOb3RNaWdyYXRlZAEBBTBOb3RTdXBwb3J0ZWQBAQUoUmVzdHJpY3RlZAEBBSxGYXN0VW5zdGFrZQECGDROb3RDb250cm9sbGVyAQEFNEFscmVhZHlRdWV1ZWQBAQU4Tm90RnVsbHlCb25kZWQBAQUkTm90UXVldWVkAQEFLEFscmVhZHlIZWFkAQEFOENhbGxOb3RBbGxvd2VkAQEFQENvbnZpY3Rpb25Wb3RpbmcBAjAoTm90T25nb2luZwEBBSBOb3RWb3RlcgEBBTBOb1Blcm1pc3Npb24BAQU8Tm9QZXJtaXNzaW9uWWV0AQEFREFscmVhZHlEZWxlZ2F0aW5nAQEFNEFscmVhZHlWb3RpbmcBAQVESW5zdWZmaWNpZW50RnVuZHMBAQU0Tm90RGVsZWdhdGluZwEBBSBOb25zZW5zZQEBBTxNYXhWb3Rlc1JlYWNoZWQBAQUsQ2xhc3NOZWVkZWQBAQUgQmFkQ2xhc3MBAQUkUmVmZXJlbmRhAQI4KE5vdE9uZ29pbmcBAQUoSGFzRGVwb3NpdAEBBSBCYWRUcmFjawEBBRBGdWxsAQEFKFF1ZXVlRW1wdHkBAQU0QmFkUmVmZXJlbmR1bQEBBSxOb3RoaW5nVG9EbwEBBRxOb1RyYWNrAQEFKFVuZmluaXNoZWQBAQUwTm9QZXJtaXNzaW9uAQEFJE5vRGVwb3NpdAEBBSRCYWRTdGF0dXMBAQVAUHJlaW1hZ2VOb3RFeGlzdAEBBYRQcmVpbWFnZVN0b3JlZFdpdGhEaWZmZXJlbnRMZW5ndGgBAQUcT3JpZ2lucwEBBSRXaGl0ZWxpc3QBAhRMVW5hdmFpbGFibGVQcmVJbWFnZQEBBTxVbmRlY29kYWJsZUNhbGwBAQVgSW52YWxpZENhbGxXZWlnaHRXaXRuZXNzAQEFUENhbGxJc05vdFdoaXRlbGlzdGVkAQEFWENhbGxBbHJlYWR5V2hpdGVsaXN0ZWQBAQUgVHJlYXN1cnkBAiwwSW52YWxpZEluZGV4AQEFQFRvb01hbnlBcHByb3ZhbHMBAQVYSW5zdWZmaWNpZW50UGVybWlzc2lvbgEBBUxQcm9wb3NhbE5vdEFwcHJvdmVkAQEFWEZhaWxlZFRvQ29udmVydEJhbGFuY2UBAQUwU3BlbmRFeHBpcmVkAQEFLEVhcmx5UGF5b3V0AQEFQEFscmVhZHlBdHRlbXB0ZWQBAQUsUGF5b3V0RXJyb3IBAQUwTm90QXR0ZW1wdGVkAQEFMEluY29uY2x1c2l2ZQEBBUBEZWxlZ2F0ZWRTdGFraW5nAQIwKE5vdEFsbG93ZWQBAQU4QWxyZWFkeVN0YWtpbmcBAQVgSW52YWxpZFJld2FyZERlc3RpbmF0aW9uAQEFREludmFsaWREZWxlZ2F0aW9uAQEFOE5vdEVub3VnaEZ1bmRzAQEFIE5vdEFnZW50AQEFME5vdERlbGVnYXRvcgEBBSBCYWRTdGF0ZQEBBThVbmFwcGxpZWRTbGFzaAEBBThOb3RoaW5nVG9TbGFzaAEBBThXaXRoZHJhd0ZhaWxlZAEBBTBOb3RTdXBwb3J0ZWQBAQVAUGFyYWNoYWluc09yaWdpbgEBBTRDb25maWd1cmF0aW9uAQIEPEludmFsaWROZXdWYWx1ZQEBBSxQYXJhc1NoYXJlZAEBBTRQYXJhSW5jbHVzaW9uAQJEZFZhbGlkYXRvckluZGV4T3V0T2ZCb3VuZHMBAQVQVW5zY2hlZHVsZWRDYW5kaWRhdGUBAQVASGVhZERhdGFUb29MYXJnZQEBBVBQcmVtYXR1cmVDb2RlVXBncmFkZQEBBTxOZXdDb2RlVG9vTGFyZ2UBAQVURGlzYWxsb3dlZFJlbGF5UGFyZW50AQEFREludmFsaWRBc3NpZ25tZW50AQEFREludmFsaWRHcm91cEluZGV4AQEFTEluc3VmZmljaWVudEJhY2tpbmcBAQU4SW52YWxpZEJhY2tpbmcBAQVoVmFsaWRhdGlvbkRhdGFIYXNoTWlzbWF0Y2gBAQWASW5jb3JyZWN0RG93bndhcmRNZXNzYWdlSGFuZGxpbmcBAQVUSW52YWxpZFVwd2FyZE1lc3NhZ2VzAQEFYEhybXBXYXRlcm1hcmtNaXNoYW5kbGluZwEBBUxJbnZhbGlkT3V0Ym91bmRIcm1wAQEFZEludmFsaWRWYWxpZGF0aW9uQ29kZUhhc2gBAQVAUGFyYUhlYWRNaXNtYXRjaAEBBTBQYXJhSW5oZXJlbnQBAhBkVG9vTWFueUluY2x1c2lvbkluaGVyZW50cwEBBUxJbnZhbGlkUGFyZW50SGVhZGVyAQEFjEluaGVyZW50RGF0YUZpbHRlcmVkRHVyaW5nRXhlY3V0aW9uAQEFUFVuc2NoZWR1bGVkQ2FuZGlkYXRlAQEFNFBhcmFTY2hlZHVsZXIBAQUUUGFyYXMBAkA0Tm90UmVnaXN0ZXJlZAEBBTRDYW5ub3RPbmJvYXJkAQEFOENhbm5vdE9mZmJvYXJkAQEFNENhbm5vdFVwZ3JhZGUBAQU8Q2Fubm90RG93bmdyYWRlAQEFWFB2ZkNoZWNrU3RhdGVtZW50U3RhbGUBAQVcUHZmQ2hlY2tTdGF0ZW1lbnRGdXR1cmUBAQWEUHZmQ2hlY2tWYWxpZGF0b3JJbmRleE91dE9mQm91bmRzAQEFYFB2ZkNoZWNrSW52YWxpZFNpZ25hdHVyZQEBBUhQdmZDaGVja0RvdWJsZVZvdGUBAQVYUHZmQ2hlY2tTdWJqZWN0SW52YWxpZAEBBURDYW5ub3RVcGdyYWRlQ29kZQEBBSxJbnZhbGlkQ29kZQEBBUROb3RoaW5nQXV0aG9yaXplZAEBBTBVbmF1dGhvcml6ZWQBAQVISW52YWxpZEJsb2NrTnVtYmVyAQEFLEluaXRpYWxpemVyAQEFDERtcAEBBRBIcm1wAQJQVE9wZW5Icm1wQ2hhbm5lbFRvU2VsZgEBBXxPcGVuSHJtcENoYW5uZWxJbnZhbGlkUmVjaXBpZW50AQEFbE9wZW5Icm1wQ2hhbm5lbFplcm9DYXBhY2l0eQEBBYxPcGVuSHJtcENoYW5uZWxDYXBhY2l0eUV4Y2VlZHNMaW1pdAEBBXhPcGVuSHJtcENoYW5uZWxaZXJvTWVzc2FnZVNpemUBAQWYT3BlbkhybXBDaGFubmVsTWVzc2FnZVNpemVFeGNlZWRzTGltaXQBAQVwT3BlbkhybXBDaGFubmVsQWxyZWFkeUV4aXN0cwEBBXxPcGVuSHJtcENoYW5uZWxBbHJlYWR5UmVxdWVzdGVkAQEFcE9wZW5Icm1wQ2hhbm5lbExpbWl0RXhjZWVkZWQBAQVwQWNjZXB0SHJtcENoYW5uZWxEb2VzbnRFeGlzdAEBBYRBY2NlcHRIcm1wQ2hhbm5lbEFscmVhZHlDb25maXJtZWQBAQV4QWNjZXB0SHJtcENoYW5uZWxMaW1pdEV4Y2VlZGVkAQEFcENsb3NlSHJtcENoYW5uZWxVbmF1dGhvcml6ZWQBAQVsQ2xvc2VIcm1wQ2hhbm5lbERvZXNudEV4aXN0AQEFfENsb3NlSHJtcENoYW5uZWxBbHJlYWR5VW5kZXJ3YXkBAQWEQ2FuY2VsSHJtcE9wZW5DaGFubmVsVW5hdXRob3JpemVkAQEFaE9wZW5Icm1wQ2hhbm5lbERvZXNudEV4aXN0AQEFfE9wZW5Icm1wQ2hhbm5lbEFscmVhZHlDb25maXJtZWQBAQUwV3JvbmdXaXRuZXNzAQEFcENoYW5uZWxDcmVhdGlvbk5vdEF1dGhvcml6ZWQBAQU8UGFyYVNlc3Npb25JbmZvAQEFNFBhcmFzRGlzcHV0ZXMBAiR0RHVwbGljYXRlRGlzcHV0ZVN0YXRlbWVudFNldHMBAQVcQW5jaWVudERpc3B1dGVTdGF0ZW1lbnQBAQVkVmFsaWRhdG9ySW5kZXhPdXRPZkJvdW5kcwEBBUBJbnZhbGlkU2lnbmF0dXJlAQEFSER1cGxpY2F0ZVN0YXRlbWVudAEBBUhTaW5nbGVTaWRlZERpc3B1dGUBAQU8TWFsaWNpb3VzQmFja2VyAQEFTE1pc3NpbmdCYWNraW5nVm90ZXMBAQVIVW5jb25maXJtZWREaXNwdXRlAQEFNFBhcmFzU2xhc2hpbmcBAhhgSW52YWxpZEtleU93bmVyc2hpcFByb29mAQEFTEludmFsaWRTZXNzaW9uSW5kZXgBAQVQSW52YWxpZENhbmRpZGF0ZUhhc2gBAQVUSW52YWxpZFZhbGlkYXRvckluZGV4AQEFYFZhbGlkYXRvckluZGV4SWRNaXNtYXRjaAEBBVxEdXBsaWNhdGVTbGFzaGluZ1JlcG9ydAEBBWhPbkRlbWFuZEFzc2lnbm1lbnRQcm92aWRlcgECDCRRdWV1ZUZ1bGwBAQVwU3BvdFByaWNlSGlnaGVyVGhhbk1heEFtb3VudAEBBUxJbnN1ZmZpY2llbnRDcmVkaXRzAQEFaENvcmV0aW1lQXNzaWdubWVudFByb3ZpZGVyAQIIQEFzc2lnbm1lbnRzRW1wdHkBAQVARGlzYWxsb3dlZEluc2VydAEBBSRSZWdpc3RyYXIBAjg0Tm90UmVnaXN0ZXJlZAEBBURBbHJlYWR5UmVnaXN0ZXJlZAEBBSBOb3RPd25lcgEBBTBDb2RlVG9vTGFyZ2UBAQVASGVhZERhdGFUb29MYXJnZQEBBTBOb3RQYXJhY2hhaW4BAQU0Tm90UGFyYXRocmVhZAEBBUBDYW5ub3REZXJlZ2lzdGVyAQEFPENhbm5vdERvd25ncmFkZQEBBTRDYW5ub3RVcGdyYWRlAQEFKFBhcmFMb2NrZWQBAQUsTm90UmVzZXJ2ZWQBAQUsSW52YWxpZENvZGUBAQUoQ2Fubm90U3dhcAEBBRRTbG90cwECCERQYXJhTm90T25ib2FyZGluZwEBBShMZWFzZUVycm9yAQEFQFBhcmFzU3Vkb1dyYXBwZXIBAig8UGFyYURvZXNudEV4aXN0AQEFRFBhcmFBbHJlYWR5RXhpc3RzAQEFVEV4Y2VlZHNNYXhNZXNzYWdlU2l6ZQEBBShVbnJvdXRhYmxlAQEFOENvdWxkbnRDbGVhbnVwAQEFNE5vdFBhcmF0aHJlYWQBAQUwTm90UGFyYWNoYWluAQEFNENhbm5vdFVwZ3JhZGUBAQU8Q2Fubm90RG93bmdyYWRlAQEFMFRvb01hbnlDb3JlcwEBBSBBdWN0aW9ucwECHERBdWN0aW9uSW5Qcm9ncmVzcwEBBURMZWFzZVBlcmlvZEluUGFzdAEBBURQYXJhTm90UmVnaXN0ZXJlZAEBBUROb3RDdXJyZW50QXVjdGlvbgEBBShOb3RBdWN0aW9uAQEFMEF1Y3Rpb25FbmRlZAEBBUBBbHJlYWR5TGVhc2VkT3V0AQEFJENyb3dkbG9hbgECXERGaXJzdFBlcmlvZEluUGFzdAEBBWRGaXJzdFBlcmlvZFRvb0ZhckluRnV0dXJlAQEFbExhc3RQZXJpb2RCZWZvcmVGaXJzdFBlcmlvZAEBBWBMYXN0UGVyaW9kVG9vRmFySW5GdXR1cmUBAQU8Q2Fubm90RW5kSW5QYXN0AQEFREVuZFRvb0ZhckluRnV0dXJlAQEFIE92ZXJmbG93AQEFUENvbnRyaWJ1dGlvblRvb1NtYWxsAQEFNEludmFsaWRQYXJhSWQBAQUsQ2FwRXhjZWVkZWQBAQVYQ29udHJpYnV0aW9uUGVyaW9kT3ZlcgEBBTRJbnZhbGlkT3JpZ2luAQEFME5vdFBhcmFjaGFpbgEBBSxMZWFzZUFjdGl2ZQEBBUBCaWRPckxlYXNlQWN0aXZlAQEFMEZ1bmROb3RFbmRlZAEBBTxOb0NvbnRyaWJ1dGlvbnMBAQVITm90UmVhZHlUb0Rpc3NvbHZlAQEFQEludmFsaWRTaWduYXR1cmUBAQUwTWVtb1Rvb0xhcmdlAQEFREFscmVhZHlJbk5ld1JhaXNlAQEFSFZyZkRlbGF5SW5Qcm9ncmVzcwEBBTROb0xlYXNlUGVyaW9kAQEFNEFzc2lnbmVkU2xvdHMBAiQ8UGFyYURvZXNudEV4aXN0AQEFNE5vdFBhcmF0aHJlYWQBAQU0Q2Fubm90VXBncmFkZQEBBTxDYW5ub3REb3duZ3JhZGUBAQVMU2xvdEFscmVhZHlBc3NpZ25lZAEBBTxTbG90Tm90QXNzaWduZWQBAQVIT25nb2luZ0xlYXNlRXhpc3RzAQEFZE1heFBlcm1hbmVudFNsb3RzRXhjZWVkZWQBAQVkTWF4VGVtcG9yYXJ5U2xvdHNFeGNlZWRlZAEBBSBDb3JldGltZQECDCROb3RCcm9rZXIBAQVYUmVxdWVzdGVkRnV0dXJlUmV2ZW51ZQEBBUxBc3NldFRyYW5zZmVyRmFpbGVkAQEFPFN0YWtpbmdBaENsaWVudAECBBxCbG9ja2VkAQEFUE11bHRpQmxvY2tNaWdyYXRpb25zAQIEHE9uZ29pbmcBAQUkWGNtUGFsbGV0AQJwLFVucmVhY2hhYmxlAQEFLFNlbmRGYWlsdXJlAQEFIEZpbHRlcmVkAQEFSFVud2VpZ2hhYmxlTWVzc2FnZQEBBWBEZXN0aW5hdGlvbk5vdEludmVydGlibGUBAQUURW1wdHkBAQU4Q2Fubm90UmVhbmNob3IBAQU0VG9vTWFueUFzc2V0cwEBBTRJbnZhbGlkT3JpZ2luAQEFKEJhZFZlcnNpb24BAQUsQmFkTG9jYXRpb24BAQU4Tm9TdWJzY3JpcHRpb24BAQVEQWxyZWFkeVN1YnNjcmliZWQBAQVYQ2Fubm90Q2hlY2tPdXRUZWxlcG9ydAEBBShMb3dCYWxhbmNlAQEFMFRvb01hbnlMb2NrcwEBBUxBY2NvdW50Tm90U292ZXJlaWduAQEFKEZlZXNOb3RNZXQBAQUwTG9ja05vdEZvdW5kAQEFFEluVXNlAQEFaEludmFsaWRBc3NldFVua25vd25SZXNlcnZlAQEFeEludmFsaWRBc3NldFVuc3VwcG9ydGVkUmVzZXJ2ZQEBBTxUb29NYW55UmVzZXJ2ZXMBAQVgTG9jYWxFeGVjdXRpb25JbmNvbXBsZXRlAQEFYFRvb01hbnlBdXRob3JpemVkQWxpYXNlcwEBBTRFeHBpcmVzSW5QYXN0AQEFNEFsaWFzTm90Rm91bmQBAQWETG9jYWxFeGVjdXRpb25JbmNvbXBsZXRlV2l0aEVycm9yAQAIFGluZGV4BBRlcnJvcuUNME1lc3NhZ2VRdWV1ZQECJCxOb3RSZWFwYWJsZQEBBRhOb1BhZ2UBAQUkTm9NZXNzYWdlAQEFQEFscmVhZHlQcm9jZXNzZWQBAQUYUXVldWVkAQEFSEluc3VmZmljaWVudFdlaWdodAEBBWBUZW1wb3JhcmlseVVucHJvY2Vzc2FibGUBAQUsUXVldWVQYXVzZWQBAQVMUmVjdXJzaXZlRGlzYWxsb3dlZAEBBSRBc3NldFJhdGUBAgxAVW5rbm93bkFzc2V0S2luZAEBBTRBbHJlYWR5RXhpc3RzAQEFIE92ZXJmbG93AQEFLFJvb3RUZXN0aW5nAQEFGE1ldGFUeAECGCBCYWRQcm9vZgEBBRhGdXR1cmUBAQUUU3RhbGUBAQVEQW5jaWVudEJpcnRoQmxvY2sBAQU0VW5rbm93bk9yaWdpbgEBBRxJbnZhbGlkAQEFPFZlcmlmeVNpZ25hdHVyZQEBBRRCZWVmeQECHGBJbnZhbGlkS2V5T3duZXJzaGlwUHJvb2YBAQVgSW52YWxpZERvdWJsZVZvdGluZ1Byb29mAQEFWEludmFsaWRGb3JrVm90aW5nUHJvb2YBAQV0SW52YWxpZEZ1dHVyZUJsb2NrVm90aW5nUHJvb2YBAQV8SW52YWxpZEVxdWl2b2NhdGlvblByb29mU2Vzc2lvbgEBBVhEdXBsaWNhdGVPZmZlbmNlUmVwb3J0AQEFUEludmFsaWRDb25maWd1cmF0aW9uAQEFDE1tcgEBBTBCZWVmeU1tckxlYWYBAQVASWRlbnRpdHlNaWdyYXRvcgEBBURDb25zdW1lclJlbWFpbmluZwEBBSxOb1Byb3ZpZGVycwEBBUBUb29NYW55Q29uc3VtZXJzAQEFFFRva2VuAQIoQEZ1bmRzVW5hdmFpbGFibGUBAQUwT25seVByb3ZpZGVyAQEFMEJlbG93TWluaW11bQEBBTBDYW5ub3RDcmVhdGUBAQUwVW5rbm93bkFzc2V0AQEFGEZyb3plbgEBBSxVbnN1cHBvcnRlZAEBBUBDYW5ub3RDcmVhdGVIb2xkAQEFNE5vdEV4cGVuZGFibGUBAQUcQmxvY2tlZAEBBShBcml0aG1ldGljAQIMJFVuZGVyZmxvdwEBBSBPdmVyZmxvdwEBBThEaXZpc2lvbkJ5WmVybwEBBTRUcmFuc2FjdGlvbmFsAQIIMExpbWl0UmVhY2hlZAEBBRxOb0xheWVyAQEFJEV4aGF1c3RlZAEBBShDb3JydXB0aW9uAQEFLFVuYXZhaWxhYmxlAQEFOFJvb3ROb3RBbGxvd2VkAQEFEFRyaWUBAjhASW52YWxpZFN0YXRlUm9vdAEBBUhJbmNvbXBsZXRlRGF0YWJhc2UBAQVQVmFsdWVBdEluY29tcGxldGVLZXkBAQUwRGVjb2RlckVycm9yAQEFLEludmFsaWRIYXNoAQEFMER1cGxpY2F0ZUtleQEBBThFeHRyYW5lb3VzTm9kZQEBBTxFeHRyYW5lb3VzVmFsdWUBAQVcRXh0cmFuZW91c0hhc2hSZWZlcmVuY2UBAQVUSW52YWxpZENoaWxkUmVmZXJlbmNlAQEFNFZhbHVlTWlzbWF0Y2gBAQU8SW5jb21wbGV0ZVByb29mAQEFMFJvb3RNaXNtYXRjaAEBBSxEZWNvZGVFcnJvcgEBBQIgQEV4dHJpbnNpY1N1Y2Nlc3MBAAQ0ZGlzcGF0Y2hfaW5mb0A8RXh0cmluc2ljRmFpbGVkAQAIOGRpc3BhdGNoX2Vycm9y/Q00ZGlzcGF0Y2hfaW5mb0AsQ29kZVVwZGF0ZWQBAQUoTmV3QWNjb3VudAEABBxhY2NvdW50ADRLaWxsZWRBY2NvdW50AQAEHGFjY291bnQAIFJlbWFya2VkAQAIGHNlbmRlcgAQaGFzaCBEVXBncmFkZUF1dGhvcml6ZWQBAAgkY29kZV9oYXNoIDRjaGVja192ZXJzaW9uFIBSZWplY3RlZEludmFsaWRBdXRob3JpemVkVXBncmFkZQEACCRjb2RlX2hhc2ggFGVycm9y/Q0CEDRJbmRleEFzc2lnbmVkAQAIDHdobwAUaW5kZXgEKEluZGV4RnJlZWQBAAQUaW5kZXgELEluZGV4RnJvemVuAQAIFGluZGV4BAx3aG8AMERlcG9zaXRQb2tlZAEAEAx3aG8AFGluZGV4BCxvbGRfZGVwb3NpdAgsbmV3X2RlcG9zaXQIAkwcRXJhUGFpZAEADCRlcmFfaW5kZXgEQHZhbGlkYXRvcl9wYXlvdXQIJHJlbWFpbmRlcgggUmV3YXJkZWQBAAwUc3Rhc2gAEGRlc3Q1ARhhbW91bnQIHFNsYXNoZWQBAAgYc3Rha2VyABhhbW91bnQINFNsYXNoUmVwb3J0ZWQBAAwkdmFsaWRhdG9yACBmcmFjdGlvbgQkc2xhc2hfZXJhBGhPbGRTbGFzaGluZ1JlcG9ydERpc2NhcmRlZAEABDRzZXNzaW9uX2luZGV4BDhTdGFrZXJzRWxlY3RlZAEBBRhCb25kZWQBAAgUc3Rhc2gAGGFtb3VudAggVW5ib25kZWQBAAgUc3Rhc2gAGGFtb3VudAgkV2l0aGRyYXduAQAIFHN0YXNoABhhbW91bnQIGEtpY2tlZAEACCRub21pbmF0b3IAFHN0YXNoAFRTdGFraW5nRWxlY3Rpb25GYWlsZWQBAQUcQ2hpbGxlZAEABBRzdGFzaAA0UGF5b3V0U3RhcnRlZAEAECRlcmFfaW5kZXgEPHZhbGlkYXRvcl9zdGFzaAAQcGFnZQQQbmV4dC0ERFZhbGlkYXRvclByZWZzU2V0AQAIFHN0YXNoABRwcmVmczkBaFNuYXBzaG90Vm90ZXJzU2l6ZUV4Y2VlZGVkAQAEEHNpemUEbFNuYXBzaG90VGFyZ2V0c1NpemVFeGNlZWRlZAEABBBzaXplBCBGb3JjZUVyYQEABBBtb2RlPQFkQ29udHJvbGxlckJhdGNoRGVwcmVjYXRlZAEABCBmYWlsdXJlcwRAQ3VycmVuY3lNaWdyYXRlZAEACBRzdGFzaAA4Zm9yY2Vfd2l0aGRyYXcIAggoUm9vdFN0b3JlZAEABBRpbmRleAQsUm9vdHNQcnVuZWQBAAQUdXBfdG8EAhAoTmV3U2Vzc2lvbgEABDRzZXNzaW9uX2luZGV4BCROZXdRdWV1ZWQBAQVEVmFsaWRhdG9yRGlzYWJsZWQBAAQkdmFsaWRhdG9yAEhWYWxpZGF0b3JSZWVuYWJsZWQBAAQkdmFsaWRhdG9yAAcVAf0NAiBAQmF0Y2hJbnRlcnJ1cHRlZAEACBRpbmRleAQUZXJyb3L9DThCYXRjaENvbXBsZXRlZAEBBWBCYXRjaENvbXBsZXRlZFdpdGhFcnJvcnMBAQU0SXRlbUNvbXBsZXRlZAEBBShJdGVtRmFpbGVkAQAEFGVycm9y/Q0wRGlzcGF0Y2hlZEFzAQAEGHJlc3VsdBUORElmRWxzZU1haW5TdWNjZXNzAQEFUElmRWxzZUZhbGxiYWNrQ2FsbGVkAQAEKG1haW5fZXJyb3L9DQJYLElkZW50aXR5U2V0AQAEDHdobwA8SWRlbnRpdHlDbGVhcmVkAQAIDHdobwAcZGVwb3NpdAg4SWRlbnRpdHlLaWxsZWQBAAgMd2hvABxkZXBvc2l0CEhKdWRnZW1lbnRSZXF1ZXN0ZWQBAAgMd2hvADxyZWdpc3RyYXJfaW5kZXgEUEp1ZGdlbWVudFVucmVxdWVzdGVkAQAIDHdobwA8cmVnaXN0cmFyX2luZGV4BDhKdWRnZW1lbnRHaXZlbgEACBh0YXJnZXQAPHJlZ2lzdHJhcl9pbmRleAQ4UmVnaXN0cmFyQWRkZWQBAAQ8cmVnaXN0cmFyX2luZGV4BEBTdWJJZGVudGl0eUFkZGVkAQAMDHN1YgAQbWFpbgAcZGVwb3NpdAhAU3ViSWRlbnRpdGllc1NldAEADBBtYWluADhudW1iZXJfb2Zfc3VicwQsbmV3X2RlcG9zaXQISFN1YklkZW50aXR5UmVuYW1lZAEACAxzdWIAEG1haW4ASFN1YklkZW50aXR5UmVtb3ZlZAEADAxzdWIAEG1haW4AHGRlcG9zaXQISFN1YklkZW50aXR5UmV2b2tlZAEADAxzdWIAEG1haW4AHGRlcG9zaXQIOEF1dGhvcml0eUFkZGVkAQAEJGF1dGhvcml0eQBAQXV0aG9yaXR5UmVtb3ZlZAEABCRhdXRob3JpdHkALFVzZXJuYW1lU2V0AQAIDHdobwAgdXNlcm5hbWUkOFVzZXJuYW1lUXVldWVkAQAMDHdobwAgdXNlcm5hbWUkKGV4cGlyYXRpb24ESFByZWFwcHJvdmFsRXhwaXJlZAEABBR3aG9zZQBIUHJpbWFyeVVzZXJuYW1lU2V0AQAIDHdobwAgdXNlcm5hbWUkXERhbmdsaW5nVXNlcm5hbWVSZW1vdmVkAQAIDHdobwAgdXNlcm5hbWUkPFVzZXJuYW1lVW5ib3VuZAEABCB1c2VybmFtZSQ8VXNlcm5hbWVSZW1vdmVkAQAEIHVzZXJuYW1lJDhVc2VybmFtZUtpbGxlZAEABCB1c2VybmFtZSQCCDhSZWNvdmVyeUNvbmZpZwEBBURBY3RpdmVSZWNvdmVyeUZvcgEBAQIcPFJlY292ZXJ5Q3JlYXRlZAEABBxhY2NvdW50AERSZWNvdmVyeUluaXRpYXRlZAEACDBsb3N0X2FjY291bnQAPHJlc2N1ZXJfYWNjb3VudAA8UmVjb3ZlcnlWb3VjaGVkAQAMMGxvc3RfYWNjb3VudAA8cmVzY3Vlcl9hY2NvdW50ABhzZW5kZXIAOFJlY292ZXJ5Q2xvc2VkAQAIMGxvc3RfYWNjb3VudAA8cmVzY3Vlcl9hY2NvdW50AEBBY2NvdW50UmVjb3ZlcmVkAQAIMGxvc3RfYWNjb3VudAA8cmVzY3Vlcl9hY2NvdW50ADxSZWNvdmVyeVJlbW92ZWQBAAQwbG9zdF9hY2NvdW50ADBEZXBvc2l0UG9rZWQBABAMd2hvABBraW5kIQ4sb2xkX2RlcG9zaXQILG5ld19kZXBvc2l0CAIMOFZlc3RpbmdDcmVhdGVkAQAIHGFjY291bnQAOHNjaGVkdWxlX2luZGV4BDhWZXN0aW5nVXBkYXRlZAEACBxhY2NvdW50ACB1bnZlc3RlZAhAVmVzdGluZ0NvbXBsZXRlZAEABBxhY2NvdW50AAIoJFNjaGVkdWxlZAEACBB3aGVuBBRpbmRleAQgQ2FuY2VsZWQBAAgQd2hlbgQUaW5kZXgEKERpc3BhdGNoZWQBAAwQdGFzaw0BCGlkEQEYcmVzdWx0FQ4gUmV0cnlTZXQBABAQdGFzaw0BCGlkEQEYcGVyaW9kBBxyZXRyaWVzBDhSZXRyeUNhbmNlbGxlZAEACBB0YXNrDQEIaWQRATxDYWxsVW5hdmFpbGFibGUBAAgQdGFzaw0BCGlkEQE4UGVyaW9kaWNGYWlsZWQBAAgQdGFzaw0BCGlkEQEsUmV0cnlGYWlsZWQBAAgQdGFzaw0BCGlkEQFUUGVybWFuZW50bHlPdmVyd2VpZ2h0AQAIEHRhc2sNAQhpZBEBQEFnZW5kYUluY29tcGxldGUBAAQQd2hlbgQCEBRTdWRpZAEABCxzdWRvX3Jlc3VsdBUOKEtleUNoYW5nZWQBAAgMb2xkBQIMbmV3AChLZXlSZW1vdmVkAQEFKFN1ZG9Bc0RvbmUBAAQsc3Vkb19yZXN1bHQVDgIoDEFueQEBBSxOb25UcmFuc2ZlcgEBBShHb3Zlcm5hbmNlAQEFHFN0YWtpbmcBAQUwU3Vkb0JhbGFuY2VzAQEFRElkZW50aXR5SnVkZ2VtZW50AQEFLENhbmNlbFByb3h5AQEFHEF1Y3Rpb24BAQU8Tm9taW5hdGlvblBvb2xzAQEFQFBhcmFSZWdpc3RyYXRpb24BAQUCCBxQcm94aWVzAQEFNEFubm91bmNlbWVudHMBAQUCHDRQcm94eUV4ZWN1dGVkAQAEGHJlc3VsdBUOLFB1cmVDcmVhdGVkAQAQEHB1cmUADHdobwAocHJveHlfdHlwZTUOUGRpc2FtYmlndWF0aW9uX2luZGV4BChQdXJlS2lsbGVkAQAQEHB1cmUAHHNwYXduZXIAKHByb3h5X3R5cGU1DlBkaXNhbWJpZ3VhdGlvbl9pbmRleAQkQW5ub3VuY2VkAQAMEHJlYWwAFHByb3h5ACRjYWxsX2hhc2ggKFByb3h5QWRkZWQBABAkZGVsZWdhdG9yACRkZWxlZ2F0ZWUAKHByb3h5X3R5cGU1DhRkZWxheQQwUHJveHlSZW1vdmVkAQAQJGRlbGVnYXRvcgAkZGVsZWdhdGVlAChwcm94eV90eXBlNQ4UZGVsYXkEMERlcG9zaXRQb2tlZAEAEAx3aG8AEGtpbmQ5DixvbGRfZGVwb3NpdAgsbmV3X2RlcG9zaXQIAhQsTmV3TXVsdGlzaWcBAAwkYXBwcm92aW5nACBtdWx0aXNpZwAkY2FsbF9oYXNoIEBNdWx0aXNpZ0FwcHJvdmFsAQAQJGFwcHJvdmluZwAkdGltZXBvaW508QEgbXVsdGlzaWcAJGNhbGxfaGFzaCBATXVsdGlzaWdFeGVjdXRlZAEAFCRhcHByb3ZpbmcAJHRpbWVwb2ludPEBIG11bHRpc2lnACRjYWxsX2hhc2ggGHJlc3VsdBUORE11bHRpc2lnQ2FuY2VsbGVkAQAQKGNhbmNlbGxpbmcAJHRpbWVwb2ludPEBIG11bHRpc2lnACRjYWxsX2hhc2ggMERlcG9zaXRQb2tlZAEAEAx3aG8AJGNhbGxfaGFzaCAsb2xkX2RlcG9zaXQILG5ld19kZXBvc2l0CAJcHENyZWF0ZWQBAAgkZGVwb3NpdG9yABxwb29sX2lkBBhCb25kZWQBABAYbWVtYmVyABxwb29sX2lkBBhib25kZWQIGGpvaW5lZBQcUGFpZE91dAEADBhtZW1iZXIAHHBvb2xfaWQEGHBheW91dAggVW5ib25kZWQBABQYbWVtYmVyABxwb29sX2lkBBxiYWxhbmNlCBhwb2ludHMIDGVyYQQkV2l0aGRyYXduAQAQGG1lbWJlcgAccG9vbF9pZAQcYmFsYW5jZQgYcG9pbnRzCCREZXN0cm95ZWQBAAQccG9vbF9pZAQwU3RhdGVDaGFuZ2VkAQAIHHBvb2xfaWQEJG5ld19zdGF0ZR0CNE1lbWJlclJlbW92ZWQBAAwccG9vbF9pZAQYbWVtYmVyAEByZWxlYXNlZF9iYWxhbmNlCDBSb2xlc1VwZGF0ZWQBAAwQcm9vdAUCHGJvdW5jZXIFAiRub21pbmF0b3IFAixQb29sU2xhc2hlZAEACBxwb29sX2lkBBxiYWxhbmNlCFBVbmJvbmRpbmdQb29sU2xhc2hlZAEADBxwb29sX2lkBAxlcmEEHGJhbGFuY2UIVFBvb2xDb21taXNzaW9uVXBkYXRlZAEACBxwb29sX2lkBBxjdXJyZW50JQJgUG9vbE1heENvbW1pc3Npb25VcGRhdGVkAQAIHHBvb2xfaWQEOG1heF9jb21taXNzaW9uBHxQb29sQ29tbWlzc2lvbkNoYW5nZVJhdGVVcGRhdGVkAQAIHHBvb2xfaWQELGNoYW5nZV9yYXRlKQKQUG9vbENvbW1pc3Npb25DbGFpbVBlcm1pc3Npb25VcGRhdGVkAQAIHHBvb2xfaWQEKHBlcm1pc3Npb24xAlRQb29sQ29tbWlzc2lvbkNsYWltZWQBAAgccG9vbF9pZAQoY29tbWlzc2lvbghkTWluQmFsYW5jZURlZmljaXRBZGp1c3RlZAEACBxwb29sX2lkBBhhbW91bnQIYE1pbkJhbGFuY2VFeGNlc3NBZGp1c3RlZAEACBxwb29sX2lkBBhhbW91bnQIcE1lbWJlckNsYWltUGVybWlzc2lvblVwZGF0ZWQBAAgYbWVtYmVyAChwZXJtaXNzaW9uiQU8TWV0YWRhdGFVcGRhdGVkAQAIHHBvb2xfaWQEGGNhbGxlcgBIUG9vbE5vbWluYXRpb25NYWRlAQAIHHBvb2xfaWQEGGNhbGxlcgBQUG9vbE5vbWluYXRvckNoaWxsZWQBAAgccG9vbF9pZAQYY2FsbGVyAExHbG9iYWxQYXJhbXNVcGRhdGVkAQAYNG1pbl9qb2luX2JvbmQIPG1pbl9jcmVhdGVfYm9uZAgkbWF4X3Bvb2xzLQQsbWF4X21lbWJlcnMtBFBtYXhfbWVtYmVyc19wZXJfcG9vbC0EVGdsb2JhbF9tYXhfY29tbWlzc2lvbi0EAhQgVW5zdGFrZWQBAAgUc3Rhc2gAGHJlc3VsdBUOHFNsYXNoZWQBAAgUc3Rhc2gAGGFtb3VudAgwQmF0Y2hDaGVja2VkAQAEEGVyYXM5AjRCYXRjaEZpbmlzaGVkAQAEEHNpemUENEludGVybmFsRXJyb3IBAQUCFCREZWxlZ2F0ZWQBBAABCCxVbmRlbGVnYXRlZAEBARRWb3RlZAEACAx3aG8AEHZvdGU1BCxWb3RlUmVtb3ZlZAEACAx3aG8AEHZvdGU1BDBWb3RlVW5sb2NrZWQBAAgMd2hvABRjbGFzcwQACCRwb3N0X2luZm+1ARRlcnJvcv0NB7UBUQ4CDDxDYWxsV2hpdGVsaXN0ZWQBAAQkY2FsbF9oYXNoIFhXaGl0ZWxpc3RlZENhbGxSZW1vdmVkAQAEJGNhbGxfaGFzaCBkV2hpdGVsaXN0ZWRDYWxsRGlzcGF0Y2hlZAEACCRjYWxsX2hhc2ggGHJlc3VsdFUOAiAkQnlHZW5lc2lzAQUBgBhCeUZvcmsBAAgwYmxvY2tfbnVtYmVyCChibG9ja19oYXNoICBQb2xrYWRvdAEBBRhLdXNhbWEBAQUgRXRoZXJldW0BAAQgY2hhaW5faWQILEJpdGNvaW5Db3JlAQEFLEJpdGNvaW5DYXNoAQEFQFBvbGthZG90QnVsbGV0aW4BAQUGXQ4CKCRQYXJhY2hhaW4BAQIsQWNjb3VudElkMzIBAAgcbmV0d29ya2EOCGlkIDhBY2NvdW50SW5kZXg2NAEACBxuZXR3b3JrYQ4UaW5kZXgIMEFjY291bnRLZXkyMAEACBxuZXR3b3JrYQ4Ma2V5ZQE4UGFsbGV0SW5zdGFuY2UBAQIwR2VuZXJhbEluZGV4AQEDKEdlbmVyYWxLZXkBAAgYbGVuZ3RoBBBkYXRhICRPbmx5Q2hpbGQBAQUkUGx1cmFsaXR5AQAICGlkaQEQcGFydG0BPEdsb2JhbENvbnNlbnN1cwECICRCeUdlbmVzaXMBBQGAGEJ5Rm9yawEACDBibG9ja19udW1iZXIIKGJsb2NrX2hhc2ggIFBvbGthZG90AQEFGEt1c2FtYQEBBSBFdGhlcmV1bQEABCBjaGFpbl9pZAgsQml0Y29pbkNvcmUBAQUsQml0Y29pbkNhc2gBAQVAUG9sa2Fkb3RCdWxsZXRpbgEBBQRlDgEIBGUOAQwEZQ4BEARlDgEUBGUOARgEZQ4BHARlDgEgAiQQSGVyZQEBBQhYMQECKCRQYXJhY2hhaW4BAQIsQWNjb3VudElkMzIBAAgcbmV0d29ya2EOCGlkIDhBY2NvdW50SW5kZXg2NAEACBxuZXR3b3JrYQ4UaW5kZXgIMEFjY291bnRLZXkyMAEACBxuZXR3b3JrYQ4Ma2V5ZQE4UGFsbGV0SW5zdGFuY2UBAQIwR2VuZXJhbEluZGV4AQEDKEdlbmVyYWxLZXkBAAgYbGVuZ3RoBBBkYXRhICRPbmx5Q2hpbGQBAQUkUGx1cmFsaXR5AQAICGlkaQEQcGFydG0BPEdsb2JhbENvbnNlbnN1cwECICRCeUdlbmVzaXMBBQGAGEJ5Rm9yawEACDBibG9ja19udW1iZXIIKGJsb2NrX2hhc2ggIFBvbGthZG90AQEFGEt1c2FtYQEBBSBFdGhlcmV1bQEABCBjaGFpbl9pZAgsQml0Y29pbkNvcmUBAQUsQml0Y29pbkNhc2gBAQVAUG9sa2Fkb3RCdWxsZXRpbgEBBQhYMgEEZQ4BCAhYMwEEZQ4BDAhYNAEEZQ4BEAhYNQEEZQ4BFAhYNgEEZQ4BGAhYNwEEZQ4BHAhYOAEEZQ4BIAAIHHBhcmVudHMEIGludGVyaW9yhQ4CDAhWMwEACCBsb2NhdGlvbnkBIGFzc2V0X2lkfQEIVjQBAAggbG9jYXRpb255ASBhc3NldF9pZHkBCFY1AQAIIGxvY2F0aW9uiQ4gYXNzZXRfaWSJDgIMCFYzAQAIHHBhcmVudHMEIGludGVyaW9ydQEIVjQBAAgccGFyZW50cwQgaW50ZXJpb3J1AQhWNQEACBxwYXJlbnRzBCBpbnRlcmlvcoUOAjAgU3BlbmRpbmcBAARAYnVkZ2V0X3JlbWFpbmluZwgcQXdhcmRlZAEADDhwcm9wb3NhbF9pbmRleAQUYXdhcmQIHGFjY291bnQAFEJ1cm50AQAELGJ1cm50X2Z1bmRzCCBSb2xsb3ZlcgEABEByb2xsb3Zlcl9iYWxhbmNlCBxEZXBvc2l0AQAEFHZhbHVlCDRTcGVuZEFwcHJvdmVkAQAMOHByb3Bvc2FsX2luZGV4BBhhbW91bnQILGJlbmVmaWNpYXJ5ADxVcGRhdGVkSW5hY3RpdmUBAAgscmVhY3RpdmF0ZWQILGRlYWN0aXZhdGVkCEhBc3NldFNwZW5kQXBwcm92ZWQBABgUaW5kZXgEKGFzc2V0X2tpbmSNDhhhbW91bnQILGJlbmVmaWNpYXJ5kQ4odmFsaWRfZnJvbQQkZXhwaXJlX2F0BEBBc3NldFNwZW5kVm9pZGVkAQAEFGluZGV4BBBQYWlkAQAIFGluZGV4BChwYXltZW50X2lkCDRQYXltZW50RmFpbGVkAQAIFGluZGV4BChwYXltZW50X2lkCDhTcGVuZFByb2Nlc3NlZAEABBRpbmRleAQCECREZWxlZ2F0ZWQBAAwUYWdlbnQAJGRlbGVnYXRvcgAYYW1vdW50CCBSZWxlYXNlZAEADBRhZ2VudAAkZGVsZWdhdG9yABhhbW91bnQIHFNsYXNoZWQBAAwUYWdlbnQAJGRlbGVnYXRvcgAYYW1vdW50CEhNaWdyYXRlZERlbGVnYXRpb24BAAwUYWdlbnQAJGRlbGVnYXRvcgAYYW1vdW50CAUBZAAwHHBhcmFfaWQEMHJlbGF5X3BhcmVudCAcdmVyc2lvbgQoY29yZV9pbmRleAQ0c2Vzc2lvbl9pbmRleAQkcmVzZXJ2ZWQxnQ54cGVyc2lzdGVkX3ZhbGlkYXRpb25fZGF0YV9oYXNoICBwb3ZfaGFzaCAwZXJhc3VyZV9yb290ICRyZXNlcnZlZDJBAiRwYXJhX2hlYWQgUHZhbGlkYXRpb25fY29kZV9oYXNoIAAIKGRlc2NyaXB0b3KhDkBjb21taXRtZW50c19oYXNoIAIQPENhbmRpZGF0ZUJhY2tlZAEDEKUOJAQERENhbmRpZGF0ZUluY2x1ZGVkAQMQpQ4kBAREQ2FuZGlkYXRlVGltZWRPdXQBAwylDiQEWFVwd2FyZE1lc3NhZ2VzUmVjZWl2ZWQBAAgQZnJvbQQUY291bnQEAihIQ3VycmVudENvZGVVcGRhdGVkAQECSEN1cnJlbnRIZWFkVXBkYXRlZAEBAlBDb2RlVXBncmFkZVNjaGVkdWxlZAEBAjBOZXdIZWFkTm90ZWQBAQIwQWN0aW9uUXVldWVkAQQEAQg8UHZmQ2hlY2tTdGFydGVkAQMIIARAUHZmQ2hlY2tBY2NlcHRlZAEDCCAEQFB2ZkNoZWNrUmVqZWN0ZWQBAwggBFhVcGdyYWRlQ29vbGRvd25SZW1vdmVkAQAEHHBhcmFfaWQEOENvZGVBdXRob3JpemVkAQAMHHBhcmFfaWQEJGNvZGVfaGFzaCAkZXhwaXJlX2F0BAIMTE9uRGVtYW5kT3JkZXJQbGFjZWQBAAwccGFyYV9pZAQoc3BvdF9wcmljZQgob3JkZXJlZF9ieQAwU3BvdFByaWNlU2V0AQAEKHNwb3RfcHJpY2UIPEFjY291bnRDcmVkaXRlZAEACAx3aG8AGGFtb3VudAgCKBxDcmVhdGVkAQAEHHBhcmFfaWQELENvbnRyaWJ1dGVkAQAMDHdobwAoZnVuZF9pbmRleAQYYW1vdW50CCBXaXRoZHJldwEADAx3aG8AKGZ1bmRfaW5kZXgEGGFtb3VudAhEUGFydGlhbGx5UmVmdW5kZWQBAAQccGFyYV9pZAQsQWxsUmVmdW5kZWQBAAQccGFyYV9pZAQkRGlzc29sdmVkAQAEHHBhcmFfaWQEPEhhbmRsZUJpZFJlc3VsdAEACBxwYXJhX2lkBBhyZXN1bHQVDhhFZGl0ZWQBAAQccGFyYV9pZAQsTWVtb1VwZGF0ZWQBAAwMd2hvABxwYXJhX2lkBBBtZW1vJDxBZGRlZFRvTmV3UmFpc2UBAAQccGFyYV9pZAQCEFRQZXJtYW5lbnRTbG90QXNzaWduZWQBAQJUVGVtcG9yYXJ5U2xvdEFzc2lnbmVkAQECYE1heFBlcm1hbmVudFNsb3RzQ2hhbmdlZAEABBRzbG90cwRgTWF4VGVtcG9yYXJ5U2xvdHNDaGFuZ2VkAQAEFHNsb3RzBAIIgFJlY2VpdmVkVmFsaWRhdG9yU2V0V2hpbGVQYXNzaXZlAQEFYFVuZXhwZWN0ZWRNb2RlVHJhbnNpdGlvbgEBBQIQUFZhbGlkYXRvclNldFJlY2VpdmVkAQAQCGlkBFxuZXdfdmFsaWRhdG9yX3NldF9jb3VudAQscHJ1bmVfdXBfdG8tBCBsZWZ0b3ZlchRcQ291bGROb3RNZXJnZUFuZERyb3BwZWQBAQVUU2V0VG9vU21hbGxBbmREcm9wcGVkAQEFKFVuZXhwZWN0ZWQBAgiAUmVjZWl2ZWRWYWxpZGF0b3JTZXRXaGlsZVBhc3NpdmUBAQVgVW5leHBlY3RlZE1vZGVUcmFuc2l0aW9uAQEFAiA4VXBncmFkZVN0YXJ0ZWQBAAQobWlncmF0aW9ucwRAVXBncmFkZUNvbXBsZXRlZAEBBTRVcGdyYWRlRmFpbGVkAQEFQE1pZ3JhdGlvblNraXBwZWQBAAQUaW5kZXgERE1pZ3JhdGlvbkFkdmFuY2VkAQAIFGluZGV4BBB0b29rBEhNaWdyYXRpb25Db21wbGV0ZWQBAAgUaW5kZXgEEHRvb2sEPE1pZ3JhdGlvbkZhaWxlZAEACBRpbmRleAQQdG9vawQ8SGlzdG9yaWNDbGVhcmVkAQAELG5leHRfY3Vyc29yxQUCpCBPdmVyZmxvdwEBBTRVbmltcGxlbWVudGVkAQEFYFVudHJ1c3RlZFJlc2VydmVMb2NhdGlvbgEBBWRVbnRydXN0ZWRUZWxlcG9ydExvY2F0aW9uAQEFMExvY2F0aW9uRnVsbAEBBVRMb2NhdGlvbk5vdEludmVydGlibGUBAQUkQmFkT3JpZ2luAQEFPEludmFsaWRMb2NhdGlvbgEBBTRBc3NldE5vdEZvdW5kAQEFVEZhaWxlZFRvVHJhbnNhY3RBc3NldAEBBTxOb3RXaXRoZHJhd2FibGUBAQVITG9jYXRpb25DYW5ub3RIb2xkAQEFVEV4Y2VlZHNNYXhNZXNzYWdlU2l6ZQEBBVhEZXN0aW5hdGlvblVuc3VwcG9ydGVkAQEFJFRyYW5zcG9ydAEBBShVbnJvdXRhYmxlAQEFMFVua25vd25DbGFpbQEBBThGYWlsZWRUb0RlY29kZQEBBUBNYXhXZWlnaHRJbnZhbGlkAQEFOE5vdEhvbGRpbmdGZWVzAQEFMFRvb0V4cGVuc2l2ZQEBBRBUcmFwAQEDQEV4cGVjdGF0aW9uRmFsc2UBAQU4UGFsbGV0Tm90Rm91bmQBAQUwTmFtZU1pc21hdGNoAQEFTFZlcnNpb25JbmNvbXBhdGlibGUBAQVQSG9sZGluZ1dvdWxkT3ZlcmZsb3cBAQUsRXhwb3J0RXJyb3IBAQU4UmVhbmNob3JGYWlsZWQBAQUYTm9EZWFsAQEFKEZlZXNOb3RNZXQBAQUkTG9ja0Vycm9yAQEFME5vUGVybWlzc2lvbgEBBShVbmFuY2hvcmVkAQEFOE5vdERlcG9zaXRhYmxlAQEFNFRvb01hbnlBc3NldHMBAQVMVW5oYW5kbGVkWGNtVmVyc2lvbgEBBUhXZWlnaHRMaW1pdFJlYWNoZWQBAAggcmVmX3RpbWUIKHByb29mX3NpemUIHEJhcnJpZXIBAQVMV2VpZ2h0Tm90Q29tcHV0YWJsZQEBBURFeGNlZWRzU3RhY2tMaW1pdAEBBQAIFGluZGV4BBRlcnJvcskOAgwgQ29tcGxldGUBAAQQdXNlZBgoSW5jb21wbGV0ZQEACBB1c2VkGBRlcnJvcs0OFEVycm9yAQAIFGluZGV4BBRlcnJvcskOAAgIaWSJDgxmdW6ZAgTVDgADCATJDgbdDgIYEE51bGwBAQUYQXNzZXRzAQTVDgA8RXhlY3V0aW9uUmVzdWx0AQbdDhxWZXJzaW9uAQECLFBhbGxldHNJbmZvAQStAgA4RGlzcGF0Y2hSZXN1bHQBAgwcU3VjY2VzcwEBBRRFcnJvcgEFADhUcnVuY2F0ZWRFcnJvcgEFAAaJDgAMLGRlc3RpbmF0aW9uiQ4gcXVlcnlfaWQIKG1heF93ZWlnaHQYAhAMQWxsAQEFFEFsbE9mAQAICGlkiQ4MZnVu5QIoQWxsQ291bnRlZAEBAjBBbGxPZkNvdW50ZWQBAAwIaWSJDgxmdW7lAhRjb3VudAQCCCBEZWZpbml0ZQEE1Q4AEFdpbGQBAhAMQWxsAQEFFEFsbE9mAQAICGlkiQ4MZnVu5QIoQWxsQ291bnRlZAEBAjBBbGxPZkNvdW50ZWQBAAwIaWSJDgxmdW7lAhRjb3VudAQCDCBUZWxlcG9ydAECCCBEZWZpbml0ZQEE1Q4AEFdpbGQBAhAMQWxsAQEFFEFsbE9mAQAICGlkiQ4MZnVu5QIoQWxsQ291bnRlZAEBAjBBbGxPZkNvdW50ZWQBAAwIaWSJDgxmdW7lAhRjb3VudAQ4UmVzZXJ2ZURlcG9zaXQBAgggRGVmaW5pdGUBBNUOABBXaWxkAQIQDEFsbAEBBRRBbGxPZgEACAhpZIkODGZ1buUCKEFsbENvdW50ZWQBAQIwQWxsT2ZDb3VudGVkAQAMCGlkiQ4MZnVu5QIUY291bnQEPFJlc2VydmVXaXRoZHJhdwECCCBEZWZpbml0ZQEE1Q4AEFdpbGQBAhAMQWxsAQEFFEFsbE9mAQAICGlkiQ4MZnVu5QIoQWxsQ291bnRlZAEBAjBBbGxPZkNvdW50ZWQBAAwIaWSJDgxmdW7lAhRjb3VudAQG+Q4E+Q4ABoUOAgQwQXNzZXRDbGFpbWVyAQAEIGxvY2F0aW9uiQ4ECQ8AAtA0V2l0aGRyYXdBc3NldAEE1Q4AVFJlc2VydmVBc3NldERlcG9zaXRlZAEE1Q4AWFJlY2VpdmVUZWxlcG9ydGVkQXNzZXQBBNUOADRRdWVyeVJlc3BvbnNlAQAQIHF1ZXJ5X2lkCCByZXNwb25zZeUOKG1heF93ZWlnaHQYHHF1ZXJpZXLpDjRUcmFuc2ZlckFzc2V0AQAIGGFzc2V0c9kOLGJlbmVmaWNpYXJ5iQ5QVHJhbnNmZXJSZXNlcnZlQXNzZXQBAAwYYXNzZXRz2Q4QZGVzdIkODHhjbRUPIFRyYW5zYWN0AQAMLG9yaWdpbl9raW5kwQJMZmFsbGJhY2tfbWF4X3dlaWdodLEBEGNhbGwkZEhybXBOZXdDaGFubmVsT3BlblJlcXVlc3QBAAwYc2VuZGVyBEBtYXhfbWVzc2FnZV9zaXplBDBtYXhfY2FwYWNpdHkETEhybXBDaGFubmVsQWNjZXB0ZWQBAAQkcmVjaXBpZW50BEhIcm1wQ2hhbm5lbENsb3NpbmcBAAwkaW5pdGlhdG9yBBhzZW5kZXIEJHJlY2lwaWVudAQsQ2xlYXJPcmlnaW4BAQU0RGVzY2VuZE9yaWdpbgECJBBIZXJlAQEFCFgxAQIoJFBhcmFjaGFpbgEBAixBY2NvdW50SWQzMgEACBxuZXR3b3JrYQ4IaWQgOEFjY291bnRJbmRleDY0AQAIHG5ldHdvcmthDhRpbmRleAgwQWNjb3VudEtleTIwAQAIHG5ldHdvcmthDgxrZXllAThQYWxsZXRJbnN0YW5jZQEBAjBHZW5lcmFsSW5kZXgBAQMoR2VuZXJhbEtleQEACBhsZW5ndGgEEGRhdGEgJE9ubHlDaGlsZAEBBSRQbHVyYWxpdHkBAAgIaWRpARBwYXJ0bQE8R2xvYmFsQ29uc2Vuc3VzAQIgJEJ5R2VuZXNpcwEFAYAYQnlGb3JrAQAIMGJsb2NrX251bWJlcggoYmxvY2tfaGFzaCAgUG9sa2Fkb3QBAQUYS3VzYW1hAQEFIEV0aGVyZXVtAQAEIGNoYWluX2lkCCxCaXRjb2luQ29yZQEBBSxCaXRjb2luQ2FzaAEBBUBQb2xrYWRvdEJ1bGxldGluAQEFCFgyAQRlDgEICFgzAQRlDgEMCFg0AQRlDgEQCFg1AQRlDgEUCFg2AQRlDgEYCFg3AQRlDgEcCFg4AQRlDgEgLFJlcG9ydEVycm9yAQAMLGRlc3RpbmF0aW9uiQ4gcXVlcnlfaWQIKG1heF93ZWlnaHQYMERlcG9zaXRBc3NldAEACBhhc3NldHP1DixiZW5lZmljaWFyeYkOTERlcG9zaXRSZXNlcnZlQXNzZXQBAAwYYXNzZXRz9Q4QZGVzdIkODHhjbRUPNEV4Y2hhbmdlQXNzZXQBAAwQZ2l2ZfUOEHdhbnTZDhxtYXhpbWFsFFxJbml0aWF0ZVJlc2VydmVXaXRoZHJhdwEADBhhc3NldHP1DhxyZXNlcnZliQ4MeGNtFQ9ASW5pdGlhdGVUZWxlcG9ydAEADBhhc3NldHP1DhBkZXN0iQ4MeGNtFQ80UmVwb3J0SG9sZGluZwEACDRyZXNwb25zZV9pbmZv7Q4YYXNzZXRz9Q4wQnV5RXhlY3V0aW9uAQAIEGZlZXPVDjB3ZWlnaHRfbGltaXTxAjRSZWZ1bmRTdXJwbHVzAQEFPFNldEVycm9ySGFuZGxlcgEEEQ8ALFNldEFwcGVuZGl4AQQRDwAoQ2xlYXJFcnJvcgEBBShDbGFpbUFzc2V0AQAIGGFzc2V0c9kOGHRpY2tldIkOEFRyYXABAQNAU3Vic2NyaWJlVmVyc2lvbgEACCBxdWVyeV9pZAhMbWF4X3Jlc3BvbnNlX3dlaWdodBhIVW5zdWJzY3JpYmVWZXJzaW9uAQEFJEJ1cm5Bc3NldAEE1Q4ALEV4cGVjdEFzc2V0AQTVDgAwRXhwZWN0T3JpZ2luAQaJDixFeHBlY3RFcnJvcgEG3Q5QRXhwZWN0VHJhbnNhY3RTdGF0dXMBAgwcU3VjY2VzcwEBBRRFcnJvcgEFADhUcnVuY2F0ZWRFcnJvcgEFACxRdWVyeVBhbGxldAEACCxtb2R1bGVfbmFtZSQ0cmVzcG9uc2VfaW5mb+0OMEV4cGVjdFBhbGxldAEAFBRpbmRleAQQbmFtZSQsbW9kdWxlX25hbWUkLGNyYXRlX21ham9yBDxtaW5fY3JhdGVfbWlub3IEUFJlcG9ydFRyYW5zYWN0U3RhdHVzAQAMLGRlc3RpbmF0aW9uiQ4gcXVlcnlfaWQIKG1heF93ZWlnaHQYTENsZWFyVHJhbnNhY3RTdGF0dXMBAQU8VW5pdmVyc2FsT3JpZ2luAQIoJFBhcmFjaGFpbgEBAixBY2NvdW50SWQzMgEACBxuZXR3b3JrYQ4IaWQgOEFjY291bnRJbmRleDY0AQAIHG5ldHdvcmthDhRpbmRleAgwQWNjb3VudEtleTIwAQAIHG5ldHdvcmthDgxrZXllAThQYWxsZXRJbnN0YW5jZQEBAjBHZW5lcmFsSW5kZXgBAQMoR2VuZXJhbEtleQEACBhsZW5ndGgEEGRhdGEgJE9ubHlDaGlsZAEBBSRQbHVyYWxpdHkBAAgIaWRpARBwYXJ0bQE8R2xvYmFsQ29uc2Vuc3VzAQIgJEJ5R2VuZXNpcwEFAYAYQnlGb3JrAQAIMGJsb2NrX251bWJlcggoYmxvY2tfaGFzaCAgUG9sa2Fkb3QBAQUYS3VzYW1hAQEFIEV0aGVyZXVtAQAEIGNoYWluX2lkCCxCaXRjb2luQ29yZQEBBSxCaXRjb2luQ2FzaAEBBUBQb2xrYWRvdEJ1bGxldGluAQEFNEV4cG9ydE1lc3NhZ2UBAAwcbmV0d29ya10OLGRlc3RpbmF0aW9uhQ4MeGNtFQ8kTG9ja0Fzc2V0AQAIFGFzc2V01Q4gdW5sb2NrZXKJDixVbmxvY2tBc3NldAEACBRhc3NldNUOGHRhcmdldIkOOE5vdGVVbmxvY2thYmxlAQAIFGFzc2V01Q4Ub3duZXKJDjRSZXF1ZXN0VW5sb2NrAQAIFGFzc2V01Q4YbG9ja2VyiQ4sU2V0RmVlc01vZGUBAAQwaml0X3dpdGhkcmF3FCBTZXRUb3BpYwEFAYAoQ2xlYXJUb3BpYwEBBSxBbGlhc09yaWdpbgEACBxwYXJlbnRzBCBpbnRlcmlvcoUOPFVucGFpZEV4ZWN1dGlvbgEACDB3ZWlnaHRfbGltaXTxAjBjaGVja19vcmlnaW7pDhxQYXlGZWVzAQAEFGFzc2V01Q5ASW5pdGlhdGVUcmFuc2ZlcgEAFCxkZXN0aW5hdGlvbokOLHJlbW90ZV9mZWVz/Q48cHJlc2VydmVfb3JpZ2luFBhhc3NldHMBDyhyZW1vdGVfeGNtFQ9ERXhlY3V0ZVdpdGhPcmlnaW4BAAhEZGVzY2VuZGFudF9vcmlnaW4FDwx4Y20VDyBTZXRIaW50cwEABBRoaW50cw0PBBEPAAIcNE5vdEFwcGxpY2FibGUBAQUkVHJhbnNwb3J0AQEFKFVucm91dGFibGUBAQVYRGVzdGluYXRpb25VbnN1cHBvcnRlZAEBBVRFeGNlZWRzTWF4TWVzc2FnZVNpemUBAQU8TWlzc2luZ0FyZ3VtZW50AQEFEEZlZXMBAQUCDAhWMwEEEQMACFY0AQSdAgAIVjUBBNUOAAJ0JEF0dGVtcHRlZAEABBxvdXRjb21l0Q4QU2VudAEAEBhvcmlnaW6JDixkZXN0aW5hdGlvbokOHG1lc3NhZ2UVDyhtZXNzYWdlX2lkIChTZW5kRmFpbGVkAQAQGG9yaWdpbokOLGRlc3RpbmF0aW9uiQ4UZXJyb3IZDyhtZXNzYWdlX2lkIDxQcm9jZXNzWGNtRXJyb3IBAAwYb3JpZ2luiQ4UZXJyb3LJDihtZXNzYWdlX2lkIEhVbmV4cGVjdGVkUmVzcG9uc2UBAAgYb3JpZ2luiQ4gcXVlcnlfaWQINFJlc3BvbnNlUmVhZHkBAAggcXVlcnlfaWQIIHJlc3BvbnNl5Q4gTm90aWZpZWQBAAwgcXVlcnlfaWQIMHBhbGxldF9pbmRleAQoY2FsbF9pbmRleARATm90aWZ5T3ZlcndlaWdodAEAFCBxdWVyeV9pZAgwcGFsbGV0X2luZGV4BChjYWxsX2luZGV4BDRhY3R1YWxfd2VpZ2h0GExtYXhfYnVkZ2V0ZWRfd2VpZ2h0GExOb3RpZnlEaXNwYXRjaEVycm9yAQAMIHF1ZXJ5X2lkCDBwYWxsZXRfaW5kZXgEKGNhbGxfaW5kZXgESE5vdGlmeURlY29kZUZhaWxlZAEADCBxdWVyeV9pZAgwcGFsbGV0X2luZGV4BChjYWxsX2luZGV4BEBJbnZhbGlkUmVzcG9uZGVyAQAMGG9yaWdpbokOIHF1ZXJ5X2lkCERleHBlY3RlZF9sb2NhdGlvbukOXEludmFsaWRSZXNwb25kZXJWZXJzaW9uAQAIGG9yaWdpbokOIHF1ZXJ5X2lkCDRSZXNwb25zZVRha2VuAQAEIHF1ZXJ5X2lkCDRBc3NldHNUcmFwcGVkAQAMEGhhc2ggGG9yaWdpbokOGGFzc2V0cx0PVFZlcnNpb25DaGFuZ2VOb3RpZmllZAEAECxkZXN0aW5hdGlvbokOGHJlc3VsdAQQY29zdNkOKG1lc3NhZ2VfaWQgXFN1cHBvcnRlZFZlcnNpb25DaGFuZ2VkAQAIIGxvY2F0aW9uiQ4cdmVyc2lvbgRQTm90aWZ5VGFyZ2V0U2VuZEZhaWwBAAwgbG9jYXRpb26JDiBxdWVyeV9pZAgUZXJyb3LJDmROb3RpZnlUYXJnZXRNaWdyYXRpb25GYWlsAQAIIGxvY2F0aW9ukQ4gcXVlcnlfaWQIVEludmFsaWRRdWVyaWVyVmVyc2lvbgEACBhvcmlnaW6JDiBxdWVyeV9pZAg4SW52YWxpZFF1ZXJpZXIBABAYb3JpZ2luiQ4gcXVlcnlfaWQIQGV4cGVjdGVkX3F1ZXJpZXKJDlBtYXliZV9hY3R1YWxfcXVlcmllcukOUFZlcnNpb25Ob3RpZnlTdGFydGVkAQAMLGRlc3RpbmF0aW9uiQ4QY29zdNkOKG1lc3NhZ2VfaWQgWFZlcnNpb25Ob3RpZnlSZXF1ZXN0ZWQBAAwsZGVzdGluYXRpb26JDhBjb3N02Q4obWVzc2FnZV9pZCBgVmVyc2lvbk5vdGlmeVVucmVxdWVzdGVkAQAMLGRlc3RpbmF0aW9uiQ4QY29zdNkOKG1lc3NhZ2VfaWQgIEZlZXNQYWlkAQAIGHBheWluZ4kOEGZlZXPZDjRBc3NldHNDbGFpbWVkAQAMEGhhc2ggGG9yaWdpbokOGGFzc2V0cx0PYFZlcnNpb25NaWdyYXRpb25GaW5pc2hlZAEABBx2ZXJzaW9uBDxBbGlhc0F1dGhvcml6ZWQBAAwcYWxpYXNlcokOGHRhcmdldIkOGGV4cGlyefUDZEFsaWFzQXV0aG9yaXphdGlvblJlbW92ZWQBAAgcYWxpYXNlcokOGHRhcmdldIkOcEFsaWFzZXNBdXRob3JpemF0aW9uc1JlbW92ZWQBAAQYdGFyZ2V0iQ4CDEBBc3NldFJhdGVDcmVhdGVkAQAIKGFzc2V0X2tpbmSNDhByYXRlCEBBc3NldFJhdGVSZW1vdmVkAQAEKGFzc2V0X2tpbmSNDkBBc3NldFJhdGVVcGRhdGVkAQAMKGFzc2V0X2tpbmSNDgxvbGQIDG5ldwgCBEREZWZlbnNpdmVUZXN0Q2FsbAEBBQIEKERpc3BhdGNoZWQBAAQYcmVzdWx0VQ4CCDhJZGVudGl0eVJlYXBlZAEABAx3aG8AOERlcG9zaXRVcGRhdGVkAQAMDHdobwAgaWRlbnRpdHkIEHN1YnMIArwYU3lzdGVtAQIgQEV4dHJpbnNpY1N1Y2Nlc3MBAAQ0ZGlzcGF0Y2hfaW5mb0A8RXh0cmluc2ljRmFpbGVkAQAIOGRpc3BhdGNoX2Vycm9y/Q00ZGlzcGF0Y2hfaW5mb0AsQ29kZVVwZGF0ZWQBAQUoTmV3QWNjb3VudAEABBxhY2NvdW50ADRLaWxsZWRBY2NvdW50AQAEHGFjY291bnQAIFJlbWFya2VkAQAIGHNlbmRlcgAQaGFzaCBEVXBncmFkZUF1dGhvcml6ZWQBAAgkY29kZV9oYXNoIDRjaGVja192ZXJzaW9uFIBSZWplY3RlZEludmFsaWRBdXRob3JpemVkVXBncmFkZQEACCRjb2RlX2hhc2ggFGVycm9y/Q0cSW5kaWNlcwECEDRJbmRleEFzc2lnbmVkAQAIDHdobwAUaW5kZXgEKEluZGV4RnJlZWQBAAQUaW5kZXgELEluZGV4RnJvemVuAQAIFGluZGV4BAx3aG8AMERlcG9zaXRQb2tlZAEAEAx3aG8AFGluZGV4BCxvbGRfZGVwb3NpdAgsbmV3X2RlcG9zaXQIIEJhbGFuY2VzAQJYHEVuZG93ZWQBAAgcYWNjb3VudAAwZnJlZV9iYWxhbmNlCCBEdXN0TG9zdAEACBxhY2NvdW50ABhhbW91bnQIIFRyYW5zZmVyAQAMEGZyb20ACHRvABhhbW91bnQIKEJhbGFuY2VTZXQBAAgMd2hvABBmcmVlCCBSZXNlcnZlZAEACAx3aG8AGGFtb3VudAgoVW5yZXNlcnZlZAEACAx3aG8AGGFtb3VudAhIUmVzZXJ2ZVJlcGF0cmlhdGVkAQAQEGZyb20ACHRvABhhbW91bnQISGRlc3RpbmF0aW9uX3N0YXR1cykBHERlcG9zaXQBAAgMd2hvABhhbW91bnQIIFdpdGhkcmF3AQAIDHdobwAYYW1vdW50CBxTbGFzaGVkAQAIDHdobwAYYW1vdW50CBhNaW50ZWQBAAgMd2hvABhhbW91bnQIGEJ1cm5lZAEACAx3aG8AGGFtb3VudAgkU3VzcGVuZGVkAQAIDHdobwAYYW1vdW50CCBSZXN0b3JlZAEACAx3aG8AGGFtb3VudAggVXBncmFkZWQBAAQMd2hvABhJc3N1ZWQBAAQYYW1vdW50CCRSZXNjaW5kZWQBAAQYYW1vdW50CBhMb2NrZWQBAAgMd2hvABhhbW91bnQIIFVubG9ja2VkAQAIDHdobwAYYW1vdW50CBhGcm96ZW4BAAgMd2hvABhhbW91bnQIGFRoYXdlZAEACAx3aG8AGGFtb3VudAhMVG90YWxJc3N1YW5jZUZvcmNlZAEACAxvbGQIDG5ldwhIVHJhbnNhY3Rpb25QYXltZW50AQIESFRyYW5zYWN0aW9uRmVlUGFpZAEADAx3aG8AKGFjdHVhbF9mZWUIDHRpcAgcU3Rha2luZwECTBxFcmFQYWlkAQAMJGVyYV9pbmRleARAdmFsaWRhdG9yX3BheW91dAgkcmVtYWluZGVyCCBSZXdhcmRlZAEADBRzdGFzaAAQZGVzdDUBGGFtb3VudAgcU2xhc2hlZAEACBhzdGFrZXIAGGFtb3VudAg0U2xhc2hSZXBvcnRlZAEADCR2YWxpZGF0b3IAIGZyYWN0aW9uBCRzbGFzaF9lcmEEaE9sZFNsYXNoaW5nUmVwb3J0RGlzY2FyZGVkAQAENHNlc3Npb25faW5kZXgEOFN0YWtlcnNFbGVjdGVkAQEFGEJvbmRlZAEACBRzdGFzaAAYYW1vdW50CCBVbmJvbmRlZAEACBRzdGFzaAAYYW1vdW50CCRXaXRoZHJhd24BAAgUc3Rhc2gAGGFtb3VudAgYS2lja2VkAQAIJG5vbWluYXRvcgAUc3Rhc2gAVFN0YWtpbmdFbGVjdGlvbkZhaWxlZAEBBRxDaGlsbGVkAQAEFHN0YXNoADRQYXlvdXRTdGFydGVkAQAQJGVyYV9pbmRleAQ8dmFsaWRhdG9yX3N0YXNoABBwYWdlBBBuZXh0LQREVmFsaWRhdG9yUHJlZnNTZXQBAAgUc3Rhc2gAFHByZWZzOQFoU25hcHNob3RWb3RlcnNTaXplRXhjZWVkZWQBAAQQc2l6ZQRsU25hcHNob3RUYXJnZXRzU2l6ZUV4Y2VlZGVkAQAEEHNpemUEIEZvcmNlRXJhAQAEEG1vZGU9AWRDb250cm9sbGVyQmF0Y2hEZXByZWNhdGVkAQAEIGZhaWx1cmVzBEBDdXJyZW5jeU1pZ3JhdGVkAQAIFHN0YXNoADhmb3JjZV93aXRoZHJhdwggT2ZmZW5jZXMBAgQcT2ZmZW5jZQEACBBraW5kRQEgdGltZXNsb3QkKEhpc3RvcmljYWwBAggoUm9vdFN0b3JlZAEABBRpbmRleAQsUm9vdHNQcnVuZWQBAAQUdXBfdG8EKFBhcmFtZXRlcnMBAgQcVXBkYXRlZAEADAxrZXnJASRvbGRfdmFsdWXVASRuZXdfdmFsdWXVARxTZXNzaW9uAQIQKE5ld1Nlc3Npb24BAAQ0c2Vzc2lvbl9pbmRleAQkTmV3UXVldWVkAQEFRFZhbGlkYXRvckRpc2FibGVkAQAEJHZhbGlkYXRvcgBIVmFsaWRhdG9yUmVlbmFibGVkAQAEJHZhbGlkYXRvcgAcR3JhbmRwYQECDDhOZXdBdXRob3JpdGllcwEABDRhdXRob3JpdHlfc2V0VQEYUGF1c2VkAQEFHFJlc3VtZWQBAQUcVXRpbGl0eQECIEBCYXRjaEludGVycnVwdGVkAQAIFGluZGV4BBRlcnJvcv0NOEJhdGNoQ29tcGxldGVkAQEFYEJhdGNoQ29tcGxldGVkV2l0aEVycm9ycwEBBTRJdGVtQ29tcGxldGVkAQEFKEl0ZW1GYWlsZWQBAAQUZXJyb3L9DTBEaXNwYXRjaGVkQXMBAAQYcmVzdWx0FQ5ESWZFbHNlTWFpblN1Y2Nlc3MBAQVQSWZFbHNlRmFsbGJhY2tDYWxsZWQBAAQobWFpbl9lcnJvcv0NIElkZW50aXR5AQJYLElkZW50aXR5U2V0AQAEDHdobwA8SWRlbnRpdHlDbGVhcmVkAQAIDHdobwAcZGVwb3NpdAg4SWRlbnRpdHlLaWxsZWQBAAgMd2hvABxkZXBvc2l0CEhKdWRnZW1lbnRSZXF1ZXN0ZWQBAAgMd2hvADxyZWdpc3RyYXJfaW5kZXgEUEp1ZGdlbWVudFVucmVxdWVzdGVkAQAIDHdobwA8cmVnaXN0cmFyX2luZGV4BDhKdWRnZW1lbnRHaXZlbgEACBh0YXJnZXQAPHJlZ2lzdHJhcl9pbmRleAQ4UmVnaXN0cmFyQWRkZWQBAAQ8cmVnaXN0cmFyX2luZGV4BEBTdWJJZGVudGl0eUFkZGVkAQAMDHN1YgAQbWFpbgAcZGVwb3NpdAhAU3ViSWRlbnRpdGllc1NldAEADBBtYWluADhudW1iZXJfb2Zfc3VicwQsbmV3X2RlcG9zaXQISFN1YklkZW50aXR5UmVuYW1lZAEACAxzdWIAEG1haW4ASFN1YklkZW50aXR5UmVtb3ZlZAEADAxzdWIAEG1haW4AHGRlcG9zaXQISFN1YklkZW50aXR5UmV2b2tlZAEADAxzdWIAEG1haW4AHGRlcG9zaXQIOEF1dGhvcml0eUFkZGVkAQAEJGF1dGhvcml0eQBAQXV0aG9yaXR5UmVtb3ZlZAEABCRhdXRob3JpdHkALFVzZXJuYW1lU2V0AQAIDHdobwAgdXNlcm5hbWUkOFVzZXJuYW1lUXVldWVkAQAMDHdobwAgdXNlcm5hbWUkKGV4cGlyYXRpb24ESFByZWFwcHJvdmFsRXhwaXJlZAEABBR3aG9zZQBIUHJpbWFyeVVzZXJuYW1lU2V0AQAIDHdobwAgdXNlcm5hbWUkXERhbmdsaW5nVXNlcm5hbWVSZW1vdmVkAQAIDHdobwAgdXNlcm5hbWUkPFVzZXJuYW1lVW5ib3VuZAEABCB1c2VybmFtZSQ8VXNlcm5hbWVSZW1vdmVkAQAEIHVzZXJuYW1lJDhVc2VybmFtZUtpbGxlZAEABCB1c2VybmFtZSQgUmVjb3ZlcnkBAhw8UmVjb3ZlcnlDcmVhdGVkAQAEHGFjY291bnQARFJlY292ZXJ5SW5pdGlhdGVkAQAIMGxvc3RfYWNjb3VudAA8cmVzY3Vlcl9hY2NvdW50ADxSZWNvdmVyeVZvdWNoZWQBAAwwbG9zdF9hY2NvdW50ADxyZXNjdWVyX2FjY291bnQAGHNlbmRlcgA4UmVjb3ZlcnlDbG9zZWQBAAgwbG9zdF9hY2NvdW50ADxyZXNjdWVyX2FjY291bnQAQEFjY291bnRSZWNvdmVyZWQBAAgwbG9zdF9hY2NvdW50ADxyZXNjdWVyX2FjY291bnQAPFJlY292ZXJ5UmVtb3ZlZAEABDBsb3N0X2FjY291bnQAMERlcG9zaXRQb2tlZAEAEAx3aG8AEGtpbmQhDixvbGRfZGVwb3NpdAgsbmV3X2RlcG9zaXQIHFZlc3RpbmcBAgw4VmVzdGluZ0NyZWF0ZWQBAAgcYWNjb3VudAA4c2NoZWR1bGVfaW5kZXgEOFZlc3RpbmdVcGRhdGVkAQAIHGFjY291bnQAIHVudmVzdGVkCEBWZXN0aW5nQ29tcGxldGVkAQAEHGFjY291bnQAJFNjaGVkdWxlcgECKCRTY2hlZHVsZWQBAAgQd2hlbgQUaW5kZXgEIENhbmNlbGVkAQAIEHdoZW4EFGluZGV4BChEaXNwYXRjaGVkAQAMEHRhc2sNAQhpZBEBGHJlc3VsdBUOIFJldHJ5U2V0AQAQEHRhc2sNAQhpZBEBGHBlcmlvZAQccmV0cmllcwQ4UmV0cnlDYW5jZWxsZWQBAAgQdGFzaw0BCGlkEQE8Q2FsbFVuYXZhaWxhYmxlAQAIEHRhc2sNAQhpZBEBOFBlcmlvZGljRmFpbGVkAQAIEHRhc2sNAQhpZBEBLFJldHJ5RmFpbGVkAQAIEHRhc2sNAQhpZBEBVFBlcm1hbmVudGx5T3ZlcndlaWdodAEACBB0YXNrDQEIaWQRAUBBZ2VuZGFJbmNvbXBsZXRlAQAEEHdoZW4EIFByZWltYWdlAQIMFE5vdGVkAQAEEGhhc2ggJFJlcXVlc3RlZAEABBBoYXNoIBxDbGVhcmVkAQAEEGhhc2ggEFN1ZG8BAhAUU3VkaWQBAAQsc3Vkb19yZXN1bHQVDihLZXlDaGFuZ2VkAQAIDG9sZAUCDG5ldwAoS2V5UmVtb3ZlZAEBBShTdWRvQXNEb25lAQAELHN1ZG9fcmVzdWx0FQ4UUHJveHkBAhw0UHJveHlFeGVjdXRlZAEABBhyZXN1bHQVDixQdXJlQ3JlYXRlZAEAEBBwdXJlAAx3aG8AKHByb3h5X3R5cGU1DlBkaXNhbWJpZ3VhdGlvbl9pbmRleAQoUHVyZUtpbGxlZAEAEBBwdXJlABxzcGF3bmVyAChwcm94eV90eXBlNQ5QZGlzYW1iaWd1YXRpb25faW5kZXgEJEFubm91bmNlZAEADBByZWFsABRwcm94eQAkY2FsbF9oYXNoIChQcm94eUFkZGVkAQAQJGRlbGVnYXRvcgAkZGVsZWdhdGVlAChwcm94eV90eXBlNQ4UZGVsYXkEMFByb3h5UmVtb3ZlZAEAECRkZWxlZ2F0b3IAJGRlbGVnYXRlZQAocHJveHlfdHlwZTUOFGRlbGF5BDBEZXBvc2l0UG9rZWQBABAMd2hvABBraW5kOQ4sb2xkX2RlcG9zaXQILG5ld19kZXBvc2l0CCBNdWx0aXNpZwECFCxOZXdNdWx0aXNpZwEADCRhcHByb3ZpbmcAIG11bHRpc2lnACRjYWxsX2hhc2ggQE11bHRpc2lnQXBwcm92YWwBABAkYXBwcm92aW5nACR0aW1lcG9pbnTxASBtdWx0aXNpZwAkY2FsbF9oYXNoIEBNdWx0aXNpZ0V4ZWN1dGVkAQAUJGFwcHJvdmluZwAkdGltZXBvaW508QEgbXVsdGlzaWcAJGNhbGxfaGFzaCAYcmVzdWx0FQ5ETXVsdGlzaWdDYW5jZWxsZWQBABAoY2FuY2VsbGluZwAkdGltZXBvaW508QEgbXVsdGlzaWcAJGNhbGxfaGFzaCAwRGVwb3NpdFBva2VkAQAQDHdobwAkY2FsbF9oYXNoICxvbGRfZGVwb3NpdAgsbmV3X2RlcG9zaXQIaEVsZWN0aW9uUHJvdmlkZXJNdWx0aVBoYXNlAQIYOFNvbHV0aW9uU3RvcmVkAQAMHGNvbXB1dGUBAhhvcmlnaW4FAjBwcmV2X2VqZWN0ZWQUREVsZWN0aW9uRmluYWxpemVkAQAIHGNvbXB1dGUBAhRzY29yZQkCOEVsZWN0aW9uRmFpbGVkAQEFIFJld2FyZGVkAQAIHGFjY291bnQAFHZhbHVlCBxTbGFzaGVkAQAIHGFjY291bnQAFHZhbHVlCERQaGFzZVRyYW5zaXRpb25lZAEADBBmcm9tEQIIdG8RAhRyb3VuZAQkVm90ZXJMaXN0AQIIIFJlYmFnZ2VkAQAMDHdobwAQZnJvbQgIdG8IMFNjb3JlVXBkYXRlZAEACAx3aG8AJG5ld19zY29yZQg8Tm9taW5hdGlvblBvb2xzAQJcHENyZWF0ZWQBAAgkZGVwb3NpdG9yABxwb29sX2lkBBhCb25kZWQBABAYbWVtYmVyABxwb29sX2lkBBhib25kZWQIGGpvaW5lZBQcUGFpZE91dAEADBhtZW1iZXIAHHBvb2xfaWQEGHBheW91dAggVW5ib25kZWQBABQYbWVtYmVyABxwb29sX2lkBBxiYWxhbmNlCBhwb2ludHMIDGVyYQQkV2l0aGRyYXduAQAQGG1lbWJlcgAccG9vbF9pZAQcYmFsYW5jZQgYcG9pbnRzCCREZXN0cm95ZWQBAAQccG9vbF9pZAQwU3RhdGVDaGFuZ2VkAQAIHHBvb2xfaWQEJG5ld19zdGF0ZR0CNE1lbWJlclJlbW92ZWQBAAwccG9vbF9pZAQYbWVtYmVyAEByZWxlYXNlZF9iYWxhbmNlCDBSb2xlc1VwZGF0ZWQBAAwQcm9vdAUCHGJvdW5jZXIFAiRub21pbmF0b3IFAixQb29sU2xhc2hlZAEACBxwb29sX2lkBBxiYWxhbmNlCFBVbmJvbmRpbmdQb29sU2xhc2hlZAEADBxwb29sX2lkBAxlcmEEHGJhbGFuY2UIVFBvb2xDb21taXNzaW9uVXBkYXRlZAEACBxwb29sX2lkBBxjdXJyZW50JQJgUG9vbE1heENvbW1pc3Npb25VcGRhdGVkAQAIHHBvb2xfaWQEOG1heF9jb21taXNzaW9uBHxQb29sQ29tbWlzc2lvbkNoYW5nZVJhdGVVcGRhdGVkAQAIHHBvb2xfaWQELGNoYW5nZV9yYXRlKQKQUG9vbENvbW1pc3Npb25DbGFpbVBlcm1pc3Npb25VcGRhdGVkAQAIHHBvb2xfaWQEKHBlcm1pc3Npb24xAlRQb29sQ29tbWlzc2lvbkNsYWltZWQBAAgccG9vbF9pZAQoY29tbWlzc2lvbghkTWluQmFsYW5jZURlZmljaXRBZGp1c3RlZAEACBxwb29sX2lkBBhhbW91bnQIYE1pbkJhbGFuY2VFeGNlc3NBZGp1c3RlZAEACBxwb29sX2lkBBhhbW91bnQIcE1lbWJlckNsYWltUGVybWlzc2lvblVwZGF0ZWQBAAgYbWVtYmVyAChwZXJtaXNzaW9uiQU8TWV0YWRhdGFVcGRhdGVkAQAIHHBvb2xfaWQEGGNhbGxlcgBIUG9vbE5vbWluYXRpb25NYWRlAQAIHHBvb2xfaWQEGGNhbGxlcgBQUG9vbE5vbWluYXRvckNoaWxsZWQBAAgccG9vbF9pZAQYY2FsbGVyAExHbG9iYWxQYXJhbXNVcGRhdGVkAQAYNG1pbl9qb2luX2JvbmQIPG1pbl9jcmVhdGVfYm9uZAgkbWF4X3Bvb2xzLQQsbWF4X21lbWJlcnMtBFBtYXhfbWVtYmVyc19wZXJfcG9vbC0EVGdsb2JhbF9tYXhfY29tbWlzc2lvbi0ELEZhc3RVbnN0YWtlAQIUIFVuc3Rha2VkAQAIFHN0YXNoABhyZXN1bHQVDhxTbGFzaGVkAQAIFHN0YXNoABhhbW91bnQIMEJhdGNoQ2hlY2tlZAEABBBlcmFzOQI0QmF0Y2hGaW5pc2hlZAEABBBzaXplBDRJbnRlcm5hbEVycm9yAQEFQENvbnZpY3Rpb25Wb3RpbmcBAhQkRGVsZWdhdGVkAQQAAQgsVW5kZWxlZ2F0ZWQBAQEUVm90ZWQBAAgMd2hvABB2b3RlNQQsVm90ZVJlbW92ZWQBAAgMd2hvABB2b3RlNQQwVm90ZVVubG9ja2VkAQAIDHdobwAUY2xhc3MEJFJlZmVyZW5kYQECQCRTdWJtaXR0ZWQBAAwUaW5kZXgEFHRyYWNrBCBwcm9wb3NhbKUBVERlY2lzaW9uRGVwb3NpdFBsYWNlZAEADBRpbmRleAQMd2hvABhhbW91bnQIXERlY2lzaW9uRGVwb3NpdFJlZnVuZGVkAQAMFGluZGV4BAx3aG8AGGFtb3VudAg4RGVwb3NpdFNsYXNoZWQBAAgMd2hvABhhbW91bnQIPERlY2lzaW9uU3RhcnRlZAEAEBRpbmRleAQUdHJhY2sEIHByb3Bvc2FspQEUdGFsbHmpAThDb25maXJtU3RhcnRlZAEABBRpbmRleAQ4Q29uZmlybUFib3J0ZWQBAAQUaW5kZXgEJENvbmZpcm1lZAEACBRpbmRleAQUdGFsbHmpASBBcHByb3ZlZAEABBRpbmRleAQgUmVqZWN0ZWQBAAgUaW5kZXgEFHRhbGx5qQEgVGltZWRPdXQBAAgUaW5kZXgEFHRhbGx5qQEkQ2FuY2VsbGVkAQAIFGluZGV4BBR0YWxseakBGEtpbGxlZAEACBRpbmRleAQUdGFsbHmpAWRTdWJtaXNzaW9uRGVwb3NpdFJlZnVuZGVkAQAMFGluZGV4BAx3aG8AGGFtb3VudAgsTWV0YWRhdGFTZXQBAAgUaW5kZXgEEGhhc2ggPE1ldGFkYXRhQ2xlYXJlZAEACBRpbmRleAQQaGFzaCAkV2hpdGVsaXN0AQIMPENhbGxXaGl0ZWxpc3RlZAEABCRjYWxsX2hhc2ggWFdoaXRlbGlzdGVkQ2FsbFJlbW92ZWQBAAQkY2FsbF9oYXNoIGRXaGl0ZWxpc3RlZENhbGxEaXNwYXRjaGVkAQAIJGNhbGxfaGFzaCAYcmVzdWx0VQ4gVHJlYXN1cnkBAjAgU3BlbmRpbmcBAARAYnVkZ2V0X3JlbWFpbmluZwgcQXdhcmRlZAEADDhwcm9wb3NhbF9pbmRleAQUYXdhcmQIHGFjY291bnQAFEJ1cm50AQAELGJ1cm50X2Z1bmRzCCBSb2xsb3ZlcgEABEByb2xsb3Zlcl9iYWxhbmNlCBxEZXBvc2l0AQAEFHZhbHVlCDRTcGVuZEFwcHJvdmVkAQAMOHByb3Bvc2FsX2luZGV4BBhhbW91bnQILGJlbmVmaWNpYXJ5ADxVcGRhdGVkSW5hY3RpdmUBAAgscmVhY3RpdmF0ZWQILGRlYWN0aXZhdGVkCEhBc3NldFNwZW5kQXBwcm92ZWQBABgUaW5kZXgEKGFzc2V0X2tpbmSNDhhhbW91bnQILGJlbmVmaWNpYXJ5kQ4odmFsaWRfZnJvbQQkZXhwaXJlX2F0BEBBc3NldFNwZW5kVm9pZGVkAQAEFGluZGV4BBBQYWlkAQAIFGluZGV4BChwYXltZW50X2lkCDRQYXltZW50RmFpbGVkAQAIFGluZGV4BChwYXltZW50X2lkCDhTcGVuZFByb2Nlc3NlZAEABBRpbmRleARARGVsZWdhdGVkU3Rha2luZwECECREZWxlZ2F0ZWQBAAwUYWdlbnQAJGRlbGVnYXRvcgAYYW1vdW50CCBSZWxlYXNlZAEADBRhZ2VudAAkZGVsZWdhdG9yABhhbW91bnQIHFNsYXNoZWQBAAwUYWdlbnQAJGRlbGVnYXRvcgAYYW1vdW50CEhNaWdyYXRlZERlbGVnYXRpb24BAAwUYWdlbnQAJGRlbGVnYXRvcgAYYW1vdW50CDRQYXJhSW5jbHVzaW9uAQIQPENhbmRpZGF0ZUJhY2tlZAEDEKUOJAQERENhbmRpZGF0ZUluY2x1ZGVkAQMQpQ4kBAREQ2FuZGlkYXRlVGltZWRPdXQBAwylDiQEWFVwd2FyZE1lc3NhZ2VzUmVjZWl2ZWQBAAgQZnJvbQQUY291bnQEFFBhcmFzAQIoSEN1cnJlbnRDb2RlVXBkYXRlZAEBAkhDdXJyZW50SGVhZFVwZGF0ZWQBAQJQQ29kZVVwZ3JhZGVTY2hlZHVsZWQBAQIwTmV3SGVhZE5vdGVkAQECMEFjdGlvblF1ZXVlZAEEBAEIPFB2ZkNoZWNrU3RhcnRlZAEDCCAEQFB2ZkNoZWNrQWNjZXB0ZWQBAwggBEBQdmZDaGVja1JlamVjdGVkAQMIIARYVXBncmFkZUNvb2xkb3duUmVtb3ZlZAEABBxwYXJhX2lkBDhDb2RlQXV0aG9yaXplZAEADBxwYXJhX2lkBCRjb2RlX2hhc2ggJGV4cGlyZV9hdAQQSHJtcAECHFBPcGVuQ2hhbm5lbFJlcXVlc3RlZAEAEBhzZW5kZXIEJHJlY2lwaWVudARUcHJvcG9zZWRfbWF4X2NhcGFjaXR5BGRwcm9wb3NlZF9tYXhfbWVzc2FnZV9zaXplBExPcGVuQ2hhbm5lbENhbmNlbGVkAQAIMGJ5X3BhcmFjaGFpbgQoY2hhbm5lbF9pZFUCTE9wZW5DaGFubmVsQWNjZXB0ZWQBAAgYc2VuZGVyBCRyZWNpcGllbnQENENoYW5uZWxDbG9zZWQBAAgwYnlfcGFyYWNoYWluBChjaGFubmVsX2lkVQJYSHJtcENoYW5uZWxGb3JjZU9wZW5lZAEAEBhzZW5kZXIEJHJlY2lwaWVudARUcHJvcG9zZWRfbWF4X2NhcGFjaXR5BGRwcm9wb3NlZF9tYXhfbWVzc2FnZV9zaXplBFxIcm1wU3lzdGVtQ2hhbm5lbE9wZW5lZAEAEBhzZW5kZXIEJHJlY2lwaWVudARUcHJvcG9zZWRfbWF4X2NhcGFjaXR5BGRwcm9wb3NlZF9tYXhfbWVzc2FnZV9zaXplBGhPcGVuQ2hhbm5lbERlcG9zaXRzVXBkYXRlZAEACBhzZW5kZXIEJHJlY2lwaWVudAQ0UGFyYXNEaXNwdXRlcwECDEBEaXNwdXRlSW5pdGlhdGVkAQMIIF0CQERpc3B1dGVDb25jbHVkZWQBAwggYQIYUmV2ZXJ0AQECaE9uRGVtYW5kQXNzaWdubWVudFByb3ZpZGVyAQIMTE9uRGVtYW5kT3JkZXJQbGFjZWQBAAwccGFyYV9pZAQoc3BvdF9wcmljZQgob3JkZXJlZF9ieQAwU3BvdFByaWNlU2V0AQAEKHNwb3RfcHJpY2UIPEFjY291bnRDcmVkaXRlZAEACAx3aG8AGGFtb3VudAgkUmVnaXN0cmFyAQIQKFJlZ2lzdGVyZWQBAAgccGFyYV9pZAQcbWFuYWdlcgAwRGVyZWdpc3RlcmVkAQAEHHBhcmFfaWQEIFJlc2VydmVkAQAIHHBhcmFfaWQEDHdobwAcU3dhcHBlZAEACBxwYXJhX2lkBCBvdGhlcl9pZAQUU2xvdHMBAgg4TmV3TGVhc2VQZXJpb2QBAAQwbGVhc2VfcGVyaW9kBBhMZWFzZWQBABgccGFyYV9pZAQYbGVhc2VyADBwZXJpb2RfYmVnaW4EMHBlcmlvZF9jb3VudAQ4ZXh0cmFfcmVzZXJ2ZWQIMHRvdGFsX2Ftb3VudAggQXVjdGlvbnMBAhw4QXVjdGlvblN0YXJ0ZWQBAAw0YXVjdGlvbl9pbmRleAQwbGVhc2VfcGVyaW9kBBhlbmRpbmcENEF1Y3Rpb25DbG9zZWQBAAQ0YXVjdGlvbl9pbmRleAQgUmVzZXJ2ZWQBAAwYYmlkZGVyADhleHRyYV9yZXNlcnZlZAgwdG90YWxfYW1vdW50CChVbnJlc2VydmVkAQAIGGJpZGRlcgAYYW1vdW50CEhSZXNlcnZlQ29uZmlzY2F0ZWQBAAwccGFyYV9pZAQYbGVhc2VyABhhbW91bnQILEJpZEFjY2VwdGVkAQAUGGJpZGRlcgAccGFyYV9pZAQYYW1vdW50CChmaXJzdF9zbG90BCRsYXN0X3Nsb3QENFdpbm5pbmdPZmZzZXQBAAg0YXVjdGlvbl9pbmRleAQwYmxvY2tfbnVtYmVyBCRDcm93ZGxvYW4BAigcQ3JlYXRlZAEABBxwYXJhX2lkBCxDb250cmlidXRlZAEADAx3aG8AKGZ1bmRfaW5kZXgEGGFtb3VudAggV2l0aGRyZXcBAAwMd2hvAChmdW5kX2luZGV4BBhhbW91bnQIRFBhcnRpYWxseVJlZnVuZGVkAQAEHHBhcmFfaWQELEFsbFJlZnVuZGVkAQAEHHBhcmFfaWQEJERpc3NvbHZlZAEABBxwYXJhX2lkBDxIYW5kbGVCaWRSZXN1bHQBAAgccGFyYV9pZAQYcmVzdWx0FQ4YRWRpdGVkAQAEHHBhcmFfaWQELE1lbW9VcGRhdGVkAQAMDHdobwAccGFyYV9pZAQQbWVtbyQ8QWRkZWRUb05ld1JhaXNlAQAEHHBhcmFfaWQENEFzc2lnbmVkU2xvdHMBAhBUUGVybWFuZW50U2xvdEFzc2lnbmVkAQECVFRlbXBvcmFyeVNsb3RBc3NpZ25lZAEBAmBNYXhQZXJtYW5lbnRTbG90c0NoYW5nZWQBAAQUc2xvdHMEYE1heFRlbXBvcmFyeVNsb3RzQ2hhbmdlZAEABBRzbG90cwQgQ29yZXRpbWUBAghQUmV2ZW51ZUluZm9SZXF1ZXN0ZWQBAAQQd2hlbgQwQ29yZUFzc2lnbmVkAQAEEGNvcmUEPFN0YWtpbmdBaENsaWVudAECEFBWYWxpZGF0b3JTZXRSZWNlaXZlZAEAEAhpZARcbmV3X3ZhbGlkYXRvcl9zZXRfY291bnQELHBydW5lX3VwX3RvLQQgbGVmdG92ZXIUXENvdWxkTm90TWVyZ2VBbmREcm9wcGVkAQEFVFNldFRvb1NtYWxsQW5kRHJvcHBlZAEBBShVbmV4cGVjdGVkAQIIgFJlY2VpdmVkVmFsaWRhdG9yU2V0V2hpbGVQYXNzaXZlAQEFYFVuZXhwZWN0ZWRNb2RlVHJhbnNpdGlvbgEBBVBNdWx0aUJsb2NrTWlncmF0aW9ucwECIDhVcGdyYWRlU3RhcnRlZAEABChtaWdyYXRpb25zBEBVcGdyYWRlQ29tcGxldGVkAQEFNFVwZ3JhZGVGYWlsZWQBAQVATWlncmF0aW9uU2tpcHBlZAEABBRpbmRleARETWlncmF0aW9uQWR2YW5jZWQBAAgUaW5kZXgEEHRvb2sESE1pZ3JhdGlvbkNvbXBsZXRlZAEACBRpbmRleAQQdG9vawQ8TWlncmF0aW9uRmFpbGVkAQAIFGluZGV4BBB0b29rBDxIaXN0b3JpY0NsZWFyZWQBAAQsbmV4dF9jdXJzb3LFBSRYY21QYWxsZXQBAnQkQXR0ZW1wdGVkAQAEHG91dGNvbWXRDhBTZW50AQAQGG9yaWdpbokOLGRlc3RpbmF0aW9uiQ4cbWVzc2FnZRUPKG1lc3NhZ2VfaWQgKFNlbmRGYWlsZWQBABAYb3JpZ2luiQ4sZGVzdGluYXRpb26JDhRlcnJvchkPKG1lc3NhZ2VfaWQgPFByb2Nlc3NYY21FcnJvcgEADBhvcmlnaW6JDhRlcnJvcskOKG1lc3NhZ2VfaWQgSFVuZXhwZWN0ZWRSZXNwb25zZQEACBhvcmlnaW6JDiBxdWVyeV9pZAg0UmVzcG9uc2VSZWFkeQEACCBxdWVyeV9pZAggcmVzcG9uc2XlDiBOb3RpZmllZAEADCBxdWVyeV9pZAgwcGFsbGV0X2luZGV4BChjYWxsX2luZGV4BEBOb3RpZnlPdmVyd2VpZ2h0AQAUIHF1ZXJ5X2lkCDBwYWxsZXRfaW5kZXgEKGNhbGxfaW5kZXgENGFjdHVhbF93ZWlnaHQYTG1heF9idWRnZXRlZF93ZWlnaHQYTE5vdGlmeURpc3BhdGNoRXJyb3IBAAwgcXVlcnlfaWQIMHBhbGxldF9pbmRleAQoY2FsbF9pbmRleARITm90aWZ5RGVjb2RlRmFpbGVkAQAMIHF1ZXJ5X2lkCDBwYWxsZXRfaW5kZXgEKGNhbGxfaW5kZXgEQEludmFsaWRSZXNwb25kZXIBAAwYb3JpZ2luiQ4gcXVlcnlfaWQIRGV4cGVjdGVkX2xvY2F0aW9u6Q5cSW52YWxpZFJlc3BvbmRlclZlcnNpb24BAAgYb3JpZ2luiQ4gcXVlcnlfaWQINFJlc3BvbnNlVGFrZW4BAAQgcXVlcnlfaWQINEFzc2V0c1RyYXBwZWQBAAwQaGFzaCAYb3JpZ2luiQ4YYXNzZXRzHQ9UVmVyc2lvbkNoYW5nZU5vdGlmaWVkAQAQLGRlc3RpbmF0aW9uiQ4YcmVzdWx0BBBjb3N02Q4obWVzc2FnZV9pZCBcU3VwcG9ydGVkVmVyc2lvbkNoYW5nZWQBAAggbG9jYXRpb26JDhx2ZXJzaW9uBFBOb3RpZnlUYXJnZXRTZW5kRmFpbAEADCBsb2NhdGlvbokOIHF1ZXJ5X2lkCBRlcnJvcskOZE5vdGlmeVRhcmdldE1pZ3JhdGlvbkZhaWwBAAggbG9jYXRpb26RDiBxdWVyeV9pZAhUSW52YWxpZFF1ZXJpZXJWZXJzaW9uAQAIGG9yaWdpbokOIHF1ZXJ5X2lkCDhJbnZhbGlkUXVlcmllcgEAEBhvcmlnaW6JDiBxdWVyeV9pZAhAZXhwZWN0ZWRfcXVlcmllcokOUG1heWJlX2FjdHVhbF9xdWVyaWVy6Q5QVmVyc2lvbk5vdGlmeVN0YXJ0ZWQBAAwsZGVzdGluYXRpb26JDhBjb3N02Q4obWVzc2FnZV9pZCBYVmVyc2lvbk5vdGlmeVJlcXVlc3RlZAEADCxkZXN0aW5hdGlvbokOEGNvc3TZDihtZXNzYWdlX2lkIGBWZXJzaW9uTm90aWZ5VW5yZXF1ZXN0ZWQBAAwsZGVzdGluYXRpb26JDhBjb3N02Q4obWVzc2FnZV9pZCAgRmVlc1BhaWQBAAgYcGF5aW5niQ4QZmVlc9kONEFzc2V0c0NsYWltZWQBAAwQaGFzaCAYb3JpZ2luiQ4YYXNzZXRzHQ9gVmVyc2lvbk1pZ3JhdGlvbkZpbmlzaGVkAQAEHHZlcnNpb24EPEFsaWFzQXV0aG9yaXplZAEADBxhbGlhc2VyiQ4YdGFyZ2V0iQ4YZXhwaXJ59QNkQWxpYXNBdXRob3JpemF0aW9uUmVtb3ZlZAEACBxhbGlhc2VyiQ4YdGFyZ2V0iQ5wQWxpYXNlc0F1dGhvcml6YXRpb25zUmVtb3ZlZAEABBh0YXJnZXSJDjBNZXNzYWdlUXVldWUBAhBAUHJvY2Vzc2luZ0ZhaWxlZAEADAhpZCAYb3JpZ2luJQMUZXJyb3IpAyRQcm9jZXNzZWQBABAIaWQgGG9yaWdpbiUDLHdlaWdodF91c2VkGBxzdWNjZXNzFEhPdmVyd2VpZ2h0RW5xdWV1ZWQBABAIaWQgGG9yaWdpbiUDKHBhZ2VfaW5kZXgENG1lc3NhZ2VfaW5kZXgEKFBhZ2VSZWFwZWQBAAgYb3JpZ2luJQMUaW5kZXgEJEFzc2V0UmF0ZQECDEBBc3NldFJhdGVDcmVhdGVkAQAIKGFzc2V0X2tpbmSNDhByYXRlCEBBc3NldFJhdGVSZW1vdmVkAQAEKGFzc2V0X2tpbmSNDkBBc3NldFJhdGVVcGRhdGVkAQAMKGFzc2V0X2tpbmSNDgxvbGQIDG5ldwgsUm9vdFRlc3RpbmcBAgRERGVmZW5zaXZlVGVzdENhbGwBAQUYTWV0YVR4AQIEKERpc3BhdGNoZWQBAAQYcmVzdWx0VQ5ASWRlbnRpdHlNaWdyYXRvcgECCDhJZGVudGl0eVJlYXBlZAEABAx3aG8AOERlcG9zaXRVcGRhdGVkAQAMDHdobwAgaWRlbnRpdHkIEHN1YnMIAAwUcGhhc2U0FGV2ZW50NQ8YdG9waWNzOQMEOQ8AACAkc3BlY19uYW1lSQMkaW1wbF9uYW1lSQNEYXV0aG9yaW5nX3ZlcnNpb24EMHNwZWNfdmVyc2lvbgQwaW1wbF92ZXJzaW9uBBBhcGlzbQNMdHJhbnNhY3Rpb25fdmVyc2lvbgQ4c3lzdGVtX3ZlcnNpb24EAgQcU3Rha2luZwEBBQIEEEtleXMBAQUCBERTdGFraW5nRGVsZWdhdGlvbgEBBQIEOEF1dGhvcml6ZUFsaWFzAQEFAhQcU3Rha2luZwECBBxTdGFraW5nAQEFHFNlc3Npb24BAgQQS2V5cwEBBSBQcmVpbWFnZQECBCBQcmVpbWFnZQEBBUBEZWxlZ2F0ZWRTdGFraW5nAQIERFN0YWtpbmdEZWxlZ2F0aW9uAQEFJFhjbVBhbGxldAECBDhBdXRob3JpemVBbGlhcwEBBQAICGlkVQ8YYW1vdW50CARZDwACGBRjbGFpbQEABBRpbmRleAQgdHJhbnNmZXIBAAgMbmV31QMUaW5kZXgEEGZyZWUBAAQUaW5kZXgEOGZvcmNlX3RyYW5zZmVyAQAMDG5ld9UDFGluZGV4BBhmcmVlemUUGGZyZWV6ZQEABBRpbmRleAQwcG9rZV9kZXBvc2l0AQAEFGluZGV4BAKAEGJvbmQBAAgUdmFsdWUIFHBheWVlNQEoYm9uZF9leHRyYQEABDhtYXhfYWRkaXRpb25hbAgYdW5ib25kAQAEFHZhbHVlCER3aXRoZHJhd191bmJvbmRlZAEABEhudW1fc2xhc2hpbmdfc3BhbnMEIHZhbGlkYXRlAQAEFHByZWZzOQEgbm9taW5hdGUBAAQcdGFyZ2V0c+kDFGNoaWxsAQEFJHNldF9wYXllZQEABBRwYXllZTUBOHNldF9jb250cm9sbGVyAQEFTHNldF92YWxpZGF0b3JfY291bnQBAAQMbmV3BGBpbmNyZWFzZV92YWxpZGF0b3JfY291bnQBAAQoYWRkaXRpb25hbARUc2NhbGVfdmFsaWRhdG9yX2NvdW50AQAEGGZhY3RvcgQ0Zm9yY2Vfbm9fZXJhcwEBBTRmb3JjZV9uZXdfZXJhAQEFRHNldF9pbnZ1bG5lcmFibGVzAQAENGludnVsbmVyYWJsZXPdAzRmb3JjZV91bnN0YWtlAQAIFHN0YXNoAEhudW1fc2xhc2hpbmdfc3BhbnMEUGZvcmNlX25ld19lcmFfYWx3YXlzAQEFVGNhbmNlbF9kZWZlcnJlZF9zbGFzaAEACAxlcmEENHNsYXNoX2luZGljZXM5AjhwYXlvdXRfc3Rha2VycwEACDx2YWxpZGF0b3Jfc3Rhc2gADGVyYQQYcmVib25kAQAEFHZhbHVlCChyZWFwX3N0YXNoAQAIFHN0YXNoAEhudW1fc2xhc2hpbmdfc3BhbnMEEGtpY2sBAAQMd2hv6QNMc2V0X3N0YWtpbmdfY29uZmlncwEAHEhtaW5fbm9taW5hdG9yX2JvbmTtA0htaW5fdmFsaWRhdG9yX2JvbmTtA0xtYXhfbm9taW5hdG9yX2NvdW508QNMbWF4X3ZhbGlkYXRvcl9jb3VudPEDPGNoaWxsX3RocmVzaG9sZPEDOG1pbl9jb21taXNzaW9u8QNIbWF4X3N0YWtlZF9yZXdhcmRz8QMsY2hpbGxfb3RoZXIBAAQUc3Rhc2gAaGZvcmNlX2FwcGx5X21pbl9jb21taXNzaW9uAQAEPHZhbGlkYXRvcl9zdGFzaABIc2V0X21pbl9jb21taXNzaW9uAQAEDG5ldwRYcGF5b3V0X3N0YWtlcnNfYnlfcGFnZQEADDx2YWxpZGF0b3Jfc3Rhc2gADGVyYQQQcGFnZQQwdXBkYXRlX3BheWVlAQAEKGNvbnRyb2xsZXIAaGRlcHJlY2F0ZV9jb250cm9sbGVyX2JhdGNoAQAELGNvbnRyb2xsZXJz3QM4cmVzdG9yZV9sZWRnZXIBABAUc3Rhc2gAQG1heWJlX2NvbnRyb2xsZXIFAixtYXliZV90b3RhbPUDPG1heWJlX3VubG9ja2luZwEEQG1pZ3JhdGVfY3VycmVuY3kBAAQUc3Rhc2gAMG1hbnVhbF9zbGFzaAEADDx2YWxpZGF0b3Jfc3Rhc2gADGVyYQQ4c2xhc2hfZnJhY3Rpb24EAhAQUm9vdAEBBRhTaWduZWQBAQEQTm9uZQEBBShBdXRob3JpemVkAQEFAmwwU3Rha2luZ0FkbWluAQEFJFRyZWFzdXJlcgEBBTxGZWxsb3dzaGlwQWRtaW4BAQUwR2VuZXJhbEFkbWluAQEFMEF1Y3Rpb25BZG1pbgEBBShMZWFzZUFkbWluAQEFTFJlZmVyZW5kdW1DYW5jZWxsZXIBAQVAUmVmZXJlbmR1bUtpbGxlcgEBBSxTbWFsbFRpcHBlcgEBBSRCaWdUaXBwZXIBAQUwU21hbGxTcGVuZGVyAQEFNE1lZGl1bVNwZW5kZXIBAQUoQmlnU3BlbmRlcgEBBURXaGl0ZWxpc3RlZENhbGxlcgEBBUxGZWxsb3dzaGlwSW5pdGlhdGVzAQEFHEZlbGxvd3MBAQVERmVsbG93c2hpcEV4cGVydHMBAQVERmVsbG93c2hpcE1hc3RlcnMBAQU4RmVsbG93c2hpcDFEYW4BAQU4RmVsbG93c2hpcDJEYW4BAQU4RmVsbG93c2hpcDNEYW4BAQU4RmVsbG93c2hpcDREYW4BAQU4RmVsbG93c2hpcDVEYW4BAQU4RmVsbG93c2hpcDZEYW4BAQU4RmVsbG93c2hpcDdEYW4BAQU4RmVsbG93c2hpcDhEYW4BAQU4RmVsbG93c2hpcDlEYW4BAQUCCAxYY20BAAgccGFyZW50cwQgaW50ZXJpb3KFDiBSZXNwb25zZQEACBxwYXJlbnRzBCBpbnRlcmlvcoUOAhAYc3lzdGVtAQIQEFJvb3QBAQUYU2lnbmVkAQEBEE5vbmUBAQUoQXV0aG9yaXplZAEBBRxPcmlnaW5zAQJsMFN0YWtpbmdBZG1pbgEBBSRUcmVhc3VyZXIBAQU8RmVsbG93c2hpcEFkbWluAQEFMEdlbmVyYWxBZG1pbgEBBTBBdWN0aW9uQWRtaW4BAQUoTGVhc2VBZG1pbgEBBUxSZWZlcmVuZHVtQ2FuY2VsbGVyAQEFQFJlZmVyZW5kdW1LaWxsZXIBAQUsU21hbGxUaXBwZXIBAQUkQmlnVGlwcGVyAQEFMFNtYWxsU3BlbmRlcgEBBTRNZWRpdW1TcGVuZGVyAQEFKEJpZ1NwZW5kZXIBAQVEV2hpdGVsaXN0ZWRDYWxsZXIBAQVMRmVsbG93c2hpcEluaXRpYXRlcwEBBRxGZWxsb3dzAQEFREZlbGxvd3NoaXBFeHBlcnRzAQEFREZlbGxvd3NoaXBNYXN0ZXJzAQEFOEZlbGxvd3NoaXAxRGFuAQEFOEZlbGxvd3NoaXAyRGFuAQEFOEZlbGxvd3NoaXAzRGFuAQEFOEZlbGxvd3NoaXA0RGFuAQEFOEZlbGxvd3NoaXA1RGFuAQEFOEZlbGxvd3NoaXA2RGFuAQEFOEZlbGxvd3NoaXA3RGFuAQEFOEZlbGxvd3NoaXA4RGFuAQEFOEZlbGxvd3NoaXA5RGFuAQEFQFBhcmFjaGFpbnNPcmlnaW4BAgQkUGFyYWNoYWluAQECJFhjbVBhbGxldAECCAxYY20BAAgccGFyZW50cwQgaW50ZXJpb3KFDiBSZXNwb25zZQEACBxwYXJlbnRzBCBpbnRlcmlvcoUOAiAUYmF0Y2gBAAQUY2FsbHPVEDRhc19kZXJpdmF0aXZlAQAIFGluZGV4BBBjYWxs0RAkYmF0Y2hfYWxsAQAEFGNhbGxz1RAsZGlzcGF0Y2hfYXMBAAgkYXNfb3JpZ2ludQ8QY2FsbNEQLGZvcmNlX2JhdGNoAQAEFGNhbGxz1RAsd2l0aF93ZWlnaHQBAAgQY2FsbNEQGHdlaWdodBgcaWZfZWxzZQEACBBtYWlu0RAgZmFsbGJhY2vREFBkaXNwYXRjaF9hc19mYWxsaWJsZQEACCRhc19vcmlnaW51DxBjYWxs0RAFAQwFARQFARgFARwFASQFASgFASwFATAFATQFATgFATwFAUQFAUgFAUwFAVQFAVgFAVwFAWAFAWgFAWwFAXAFAXQFAXgFAXwCmBBOb25lAQEFEFJhdzABAQUQUmF3MQEBAhBSYXcyAQUBCBBSYXczAQUBDBBSYXc0AQUBEBBSYXc1AQUBFBBSYXc2AQUBGBBSYXc3AQUBHBBSYXc4AQUBIBBSYXc5AQUBJBRSYXcxMAEFASgUUmF3MTEBBQEsFFJhdzEyAQUBMBRSYXcxMwEFATQUUmF3MTQBBQE4FFJhdzE1AQUBPBRSYXcxNgEFAUAUUmF3MTcBBQFEFFJhdzE4AQUBSBRSYXcxOQEFAUwUUmF3MjABBQFQFFJhdzIxAQUBVBRSYXcyMgEFAVgUUmF3MjMBBQFcFFJhdzI0AQUBYBRSYXcyNQEFAWQUUmF3MjYBBQFoFFJhdzI3AQUBbBRSYXcyOAEFAXAUUmF3MjkBBQF0FFJhdzMwAQUBeBRSYXczMQEFAXwUUmF3MzIBBQGALEJsYWtlVHdvMjU2AQUBgBhTaGEyNTYBBQGAJEtlY2NhazI1NgEFAYAsU2hhVGhyZWUyNTYBBQGABN0PAQgE4Q8ABmUBACQoYWRkaXRpb25hbOUPHGRpc3BsYXndDxRsZWdhbN0PDHdlYt0PEHJpb3TdDxRlbWFpbN0PPHBncF9maW5nZXJwcmludOkPFGltYWdl3Q8cdHdpdHRlct0PAwgA3Q8E8Q8AAhwcVW5rbm93bgEBBRxGZWVQYWlkAQEDKFJlYXNvbmFibGUBAQUkS25vd25Hb29kAQEFJE91dE9mRGF0ZQEBBShMb3dRdWFsaXR5AQEFJEVycm9uZW91cwEBBQJgNGFkZF9yZWdpc3RyYXIBAAQcYWNjb3VudNUDMHNldF9pZGVudGl0eQEABBBpbmZv7Q8gc2V0X3N1YnMBAAQQc3Vic/UPOGNsZWFyX2lkZW50aXR5AQEFRHJlcXVlc3RfanVkZ2VtZW50AQAIJHJlZ19pbmRleAQcbWF4X2ZlZQg4Y2FuY2VsX3JlcXVlc3QBAAQkcmVnX2luZGV4BBxzZXRfZmVlAQAIFGluZGV4BAxmZWUIOHNldF9hY2NvdW50X2lkAQAIFGluZGV4BAxuZXfVAyhzZXRfZmllbGRzAQAIFGluZGV4BBhmaWVsZHMIRHByb3ZpZGVfanVkZ2VtZW50AQAQJHJlZ19pbmRleAQYdGFyZ2V01QMkanVkZ2VtZW50+Q8gaWRlbnRpdHkgNGtpbGxfaWRlbnRpdHkBAAQYdGFyZ2V01QMcYWRkX3N1YgEACAxzdWLVAxBkYXRh3Q8ocmVuYW1lX3N1YgEACAxzdWLVAxBkYXRh3Q8ocmVtb3ZlX3N1YgEABAxzdWLVAyBxdWl0X3N1YgEBBVhhZGRfdXNlcm5hbWVfYXV0aG9yaXR5AQAMJGF1dGhvcml0edUDGHN1ZmZpeCQoYWxsb2NhdGlvbgRkcmVtb3ZlX3VzZXJuYW1lX2F1dGhvcml0eQEACBhzdWZmaXgkJGF1dGhvcml0edUDQHNldF91c2VybmFtZV9mb3IBABAMd2hv1QMgdXNlcm5hbWUkJHNpZ25hdHVyZUUGOHVzZV9hbGxvY2F0aW9uFDxhY2NlcHRfdXNlcm5hbWUBAAQgdXNlcm5hbWUkXHJlbW92ZV9leHBpcmVkX2FwcHJvdmFsAQAEIHVzZXJuYW1lJFBzZXRfcHJpbWFyeV91c2VybmFtZQEABCB1c2VybmFtZSQ8dW5iaW5kX3VzZXJuYW1lAQAEIHVzZXJuYW1lJDxyZW1vdmVfdXNlcm5hbWUBAAQgdXNlcm5hbWUkNGtpbGxfdXNlcm5hbWUBAAQgdXNlcm5hbWUkBtUDAigwYXNfcmVjb3ZlcmVkAQAIHGFjY291bnTVAxBjYWxs0RA0c2V0X3JlY292ZXJlZAEACBBsb3N01QMccmVzY3VlctUDPGNyZWF0ZV9yZWNvdmVyeQEADBxmcmllbmRz3QMkdGhyZXNob2xkBDBkZWxheV9wZXJpb2QERGluaXRpYXRlX3JlY292ZXJ5AQAEHGFjY291bnTVAzh2b3VjaF9yZWNvdmVyeQEACBBsb3N01QMccmVzY3VlctUDOGNsYWltX3JlY292ZXJ5AQAEHGFjY291bnTVAzhjbG9zZV9yZWNvdmVyeQEABBxyZXNjdWVy1QM8cmVtb3ZlX3JlY292ZXJ5AQEFQGNhbmNlbF9yZWNvdmVyZWQBAAQcYWNjb3VudNUDMHBva2VfZGVwb3NpdAEABDRtYXliZV9hY2NvdW50ARACKCBzY2hlZHVsZQEAEBB3aGVuBDhtYXliZV9wZXJpb2RpY4EDIHByaW9yaXR5BBBjYWxs0RAYY2FuY2VsAQAIEHdoZW4EFGluZGV4BDhzY2hlZHVsZV9uYW1lZAEAFAhpZCAQd2hlbgQ4bWF5YmVfcGVyaW9kaWOBAyBwcmlvcml0eQQQY2FsbNEQMGNhbmNlbF9uYW1lZAEABAhpZCA4c2NoZWR1bGVfYWZ0ZXIBABAUYWZ0ZXIEOG1heWJlX3BlcmlvZGljgQMgcHJpb3JpdHkEEGNhbGzREFBzY2hlZHVsZV9uYW1lZF9hZnRlcgEAFAhpZCAUYWZ0ZXIEOG1heWJlX3BlcmlvZGljgQMgcHJpb3JpdHkEEGNhbGzRECRzZXRfcmV0cnkBAAwQdGFzaw0BHHJldHJpZXMEGHBlcmlvZAQ8c2V0X3JldHJ5X25hbWVkAQAMCGlkIBxyZXRyaWVzBBhwZXJpb2QEMGNhbmNlbF9yZXRyeQEABBB0YXNrDQFIY2FuY2VsX3JldHJ5X25hbWVkAQAECGlkIAIUEHN1ZG8BAAQQY2FsbNEQVHN1ZG9fdW5jaGVja2VkX3dlaWdodAEACBBjYWxs0RAYd2VpZ2h0GBxzZXRfa2V5AQAEDG5ld9UDHHN1ZG9fYXMBAAgMd2hv1QMQY2FsbNEQKHJlbW92ZV9rZXkBAQUGNQ4CLBRwcm94eQEADBByZWFs1QNAZm9yY2VfcHJveHlfdHlwZREQEGNhbGzRECRhZGRfcHJveHkBAAwgZGVsZWdhdGXVAyhwcm94eV90eXBlNQ4UZGVsYXkEMHJlbW92ZV9wcm94eQEADCBkZWxlZ2F0ZdUDKHByb3h5X3R5cGU1DhRkZWxheQQ4cmVtb3ZlX3Byb3hpZXMBAQUsY3JlYXRlX3B1cmUBAAwocHJveHlfdHlwZTUOFGRlbGF5BBRpbmRleAQka2lsbF9wdXJlAQAUHHNwYXduZXLVAyhwcm94eV90eXBlNQ4UaW5kZXgEGGhlaWdodAQkZXh0X2luZGV4BCBhbm5vdW5jZQEACBByZWFs1QMkY2FsbF9oYXNoIExyZW1vdmVfYW5ub3VuY2VtZW50AQAIEHJlYWzVAyRjYWxsX2hhc2ggTHJlamVjdF9hbm5vdW5jZW1lbnQBAAggZGVsZWdhdGXVAyRjYWxsX2hhc2ggPHByb3h5X2Fubm91bmNlZAEAECBkZWxlZ2F0ZdUDEHJlYWzVA0Bmb3JjZV9wcm94eV90eXBlERAQY2FsbNEQMHBva2VfZGVwb3NpdAEBBQIUUGFzX211bHRpX3RocmVzaG9sZF8xAQAIRG90aGVyX3NpZ25hdG9yaWVz3QMQY2FsbNEQIGFzX211bHRpAQAUJHRocmVzaG9sZAREb3RoZXJfc2lnbmF0b3JpZXPdAzxtYXliZV90aW1lcG9pbnSNBBBjYWxs0RAobWF4X3dlaWdodBhAYXBwcm92ZV9hc19tdWx0aQEAFCR0aHJlc2hvbGQERG90aGVyX3NpZ25hdG9yaWVz3QM8bWF5YmVfdGltZXBvaW50jQQkY2FsbF9oYXNoIChtYXhfd2VpZ2h0GDxjYW5jZWxfYXNfbXVsdGkBABAkdGhyZXNob2xkBERvdGhlcl9zaWduYXRvcmllc90DJHRpbWVwb2ludPEBJGNhbGxfaGFzaCAwcG9rZV9kZXBvc2l0AQAMJHRocmVzaG9sZAREb3RoZXJfc2lnbmF0b3JpZXPdAyRjYWxsX2hhc2ggAhQ8c3VibWl0X3Vuc2lnbmVkAQAIMHJhd19zb2x1dGlvblkFHHdpdG5lc3NdBWxzZXRfbWluaW11bV91bnRydXN0ZWRfc2NvcmUBAARAbWF5YmVfbmV4dF9zY29yZWEFdHNldF9lbWVyZ2VuY3lfZWxlY3Rpb25fcmVzdWx0AQAEIHN1cHBvcnRzdQUYc3VibWl0AQAEMHJhd19zb2x1dGlvblkFTGdvdmVybmFuY2VfZmFsbGJhY2sBAQUCJBhzdWJtaXQBAAw8cHJvcG9zYWxfb3JpZ2ludQ8gcHJvcG9zYWylAUBlbmFjdG1lbnRfbW9tZW50QQRYcGxhY2VfZGVjaXNpb25fZGVwb3NpdAEABBRpbmRleARccmVmdW5kX2RlY2lzaW9uX2RlcG9zaXQBAAQUaW5kZXgEGGNhbmNlbAEABBRpbmRleAQQa2lsbAEABBRpbmRleARAbnVkZ2VfcmVmZXJlbmR1bQEABBRpbmRleARIb25lX2Zld2VyX2RlY2lkaW5nAQAEFHRyYWNrBGRyZWZ1bmRfc3VibWlzc2lvbl9kZXBvc2l0AQAEFGluZGV4BDBzZXRfbWV0YWRhdGEBAAgUaW5kZXgEKG1heWJlX2hhc2gRAQIQOHdoaXRlbGlzdF9jYWxsAQAEJGNhbGxfaGFzaCBccmVtb3ZlX3doaXRlbGlzdGVkX2NhbGwBAAQkY2FsbF9oYXNoIGRkaXNwYXRjaF93aGl0ZWxpc3RlZF9jYWxsAQAMJGNhbGxfaGFzaCBAY2FsbF9lbmNvZGVkX2xlbgRMY2FsbF93ZWlnaHRfd2l0bmVzcxicZGlzcGF0Y2hfd2hpdGVsaXN0ZWRfY2FsbF93aXRoX3ByZWltYWdlAQAEEGNhbGzREAIYLHNwZW5kX2xvY2FsAQAIGGFtb3VudAgsYmVuZWZpY2lhcnnVAzxyZW1vdmVfYXBwcm92YWwBAAQscHJvcG9zYWxfaWQEFHNwZW5kAQAQKGFzc2V0X2tpbmSNDhhhbW91bnQILGJlbmVmaWNpYXJ5kQ4odmFsaWRfZnJvbS0EGHBheW91dAEABBRpbmRleAQwY2hlY2tfc3RhdHVzAQAEFGluZGV4BCh2b2lkX3NwZW5kAQAEFGluZGV4BAK4fHNldF92YWxpZGF0aW9uX3VwZ3JhZGVfY29vbGRvd24BAAQMbmV3BHBzZXRfdmFsaWRhdGlvbl91cGdyYWRlX2RlbGF5AQAEDG5ldwRkc2V0X2NvZGVfcmV0ZW50aW9uX3BlcmlvZAEABAxuZXcERHNldF9tYXhfY29kZV9zaXplAQAEDG5ldwRAc2V0X21heF9wb3Zfc2l6ZQEABAxuZXcEWHNldF9tYXhfaGVhZF9kYXRhX3NpemUBAAQMbmV3BEhzZXRfY29yZXRpbWVfY29yZXMBAAQMbmV3BHBzZXRfZ3JvdXBfcm90YXRpb25fZnJlcXVlbmN5AQAEDG5ldwR0c2V0X3BhcmFzX2F2YWlsYWJpbGl0eV9wZXJpb2QBAAQMbmV3BGBzZXRfc2NoZWR1bGluZ19sb29rYWhlYWQBAAQMbmV3BGxzZXRfbWF4X3ZhbGlkYXRvcnNfcGVyX2NvcmUBAAQMbmV3LQRIc2V0X21heF92YWxpZGF0b3JzAQAEDG5ldy0ESHNldF9kaXNwdXRlX3BlcmlvZAEABAxuZXcEtHNldF9kaXNwdXRlX3Bvc3RfY29uY2x1c2lvbl9hY2NlcHRhbmNlX3BlcmlvZAEABAxuZXcERHNldF9ub19zaG93X3Nsb3RzAQAEDG5ldwRQc2V0X25fZGVsYXlfdHJhbmNoZXMBAAQMbmV3BHhzZXRfemVyb3RoX2RlbGF5X3RyYW5jaGVfd2lkdGgBAAQMbmV3BFBzZXRfbmVlZGVkX2FwcHJvdmFscwEABAxuZXcEcHNldF9yZWxheV92cmZfbW9kdWxvX3NhbXBsZXMBAAQMbmV3BGhzZXRfbWF4X3Vwd2FyZF9xdWV1ZV9jb3VudAEABAxuZXcEZHNldF9tYXhfdXB3YXJkX3F1ZXVlX3NpemUBAAQMbmV3BHRzZXRfbWF4X2Rvd253YXJkX21lc3NhZ2Vfc2l6ZQEABAxuZXcEbHNldF9tYXhfdXB3YXJkX21lc3NhZ2Vfc2l6ZQEABAxuZXcEoHNldF9tYXhfdXB3YXJkX21lc3NhZ2VfbnVtX3Blcl9jYW5kaWRhdGUBAAQMbmV3BGRzZXRfaHJtcF9vcGVuX3JlcXVlc3RfdHRsAQAEDG5ldwRcc2V0X2hybXBfc2VuZGVyX2RlcG9zaXQBAAQMbmV3CGhzZXRfaHJtcF9yZWNpcGllbnRfZGVwb3NpdAEABAxuZXcIdHNldF9ocm1wX2NoYW5uZWxfbWF4X2NhcGFjaXR5AQAEDG5ldwR8c2V0X2hybXBfY2hhbm5lbF9tYXhfdG90YWxfc2l6ZQEABAxuZXcEnHNldF9ocm1wX21heF9wYXJhY2hhaW5faW5ib3VuZF9jaGFubmVscwEABAxuZXcEhHNldF9ocm1wX2NoYW5uZWxfbWF4X21lc3NhZ2Vfc2l6ZQEABAxuZXcEoHNldF9ocm1wX21heF9wYXJhY2hhaW5fb3V0Ym91bmRfY2hhbm5lbHMBAAQMbmV3BJhzZXRfaHJtcF9tYXhfbWVzc2FnZV9udW1fcGVyX2NhbmRpZGF0ZQEABAxuZXcESHNldF9wdmZfdm90aW5nX3R0bAEABAxuZXcEkHNldF9taW5pbXVtX3ZhbGlkYXRpb25fdXBncmFkZV9kZWxheQEABAxuZXcEcHNldF9ieXBhc3NfY29uc2lzdGVuY3lfY2hlY2sBAAQMbmV3FGBzZXRfYXN5bmNfYmFja2luZ19wYXJhbXMBAAQMbmV3lQVMc2V0X2V4ZWN1dG9yX3BhcmFtcwEABAxuZXelBVhzZXRfb25fZGVtYW5kX2Jhc2VfZmVlAQAEDG5ldwh0c2V0X29uX2RlbWFuZF9mZWVfdmFyaWFiaWxpdHkBAAQMbmV3BHBzZXRfb25fZGVtYW5kX3F1ZXVlX21heF9zaXplAQAEDG5ldwSYc2V0X29uX2RlbWFuZF90YXJnZXRfcXVldWVfdXRpbGl6YXRpb24BAAQMbmV3BGRzZXRfbWluaW11bV9iYWNraW5nX3ZvdGVzAQAEDG5ldwRAc2V0X25vZGVfZmVhdHVyZQEACBRpbmRleAQUdmFsdWUUaHNldF9hcHByb3ZhbF92b3RpbmdfcGFyYW1zAQAEDG5ldwRQc2V0X3NjaGVkdWxlcl9wYXJhbXMBAAQMbmV3qQUACChkZXNjcmlwdG9yoQ4sY29tbWl0bWVudHPJBQAMJGNhbmRpZGF0ZTEQOHZhbGlkaXR5X3ZvdGVz1QVEdmFsaWRhdG9yX2luZGljZXOxBQQ1EAAAECRiaXRmaWVsZHO5BURiYWNrZWRfY2FuZGlkYXRlczkQIGRpc3B1dGVz+QU0cGFyZW50X2hlYWRlcrUDAgQUZW50ZXIBAAQQZGF0YT0QAjBYZm9yY2Vfc2V0X2N1cnJlbnRfY29kZQEACBBwYXJhBCBuZXdfY29kZSRYZm9yY2Vfc2V0X2N1cnJlbnRfaGVhZAEACBBwYXJhBCBuZXdfaGVhZCRsZm9yY2Vfc2NoZWR1bGVfY29kZV91cGdyYWRlAQAMEHBhcmEEIG5ld19jb2RlJExyZWxheV9wYXJlbnRfbnVtYmVyBExmb3JjZV9ub3RlX25ld19oZWFkAQAIEHBhcmEEIG5ld19oZWFkJEhmb3JjZV9xdWV1ZV9hY3Rpb24BAAQQcGFyYQRsYWRkX3RydXN0ZWRfdmFsaWRhdGlvbl9jb2RlAQAEPHZhbGlkYXRpb25fY29kZSRscG9rZV91bnVzZWRfdmFsaWRhdGlvbl9jb2RlAQAEUHZhbGlkYXRpb25fY29kZV9oYXNoIGxpbmNsdWRlX3B2Zl9jaGVja19zdGF0ZW1lbnQBAAgQc3RtdAUGJHNpZ25hdHVyZUECdGZvcmNlX3NldF9tb3N0X3JlY2VudF9jb250ZXh0AQAIEHBhcmEEHGNvbnRleHQEXHJlbW92ZV91cGdyYWRlX2Nvb2xkb3duAQAEEHBhcmEElGF1dGhvcml6ZV9mb3JjZV9zZXRfY3VycmVudF9jb2RlX2hhc2gBAAwQcGFyYQQ0bmV3X2NvZGVfaGFzaCAwdmFsaWRfcGVyaW9kBJxhcHBseV9hdXRob3JpemVkX2ZvcmNlX3NldF9jdXJyZW50X2NvZGUBAAgQcGFyYQQgbmV3X2NvZGUkAgxARm9ySW52YWxpZEJhY2tlZAEBBTBBZ2FpbnN0VmFsaWQBAQVIRm9ySW52YWxpZEFwcHJvdmVkAQEFABAkdGltZV9zbG90GQYQa2luZEkQPHZhbGlkYXRvcl9pbmRleAQwdmFsaWRhdG9yX2lkIAIEcHJlcG9ydF9kaXNwdXRlX2xvc3RfdW5zaWduZWQBAAg0ZGlzcHV0ZV9wcm9vZk0QPGtleV9vd25lcl9wcm9vZr0DAgxccGxhY2Vfb3JkZXJfYWxsb3dfZGVhdGgBAAgobWF4X2Ftb3VudAgccGFyYV9pZARYcGxhY2Vfb3JkZXJfa2VlcF9hbGl2ZQEACChtYXhfYW1vdW50CBxwYXJhX2lkBGBwbGFjZV9vcmRlcl93aXRoX2NyZWRpdHMBAAgobWF4X2Ftb3VudAgccGFyYV9pZAQCDAhWMwEEoQYACFY0AQT1AgAIVjUBBBEPAAIYdHN1ZG9fc2NoZWR1bGVfcGFyYV9pbml0aWFsaXplAQAICGlkBBxnZW5lc2lzFQloc3Vkb19zY2hlZHVsZV9wYXJhX2NsZWFudXABAAQIaWQEgHN1ZG9fc2NoZWR1bGVfcGFyYXRocmVhZF91cGdyYWRlAQAECGlkBIRzdWRvX3NjaGVkdWxlX3BhcmFjaGFpbl9kb3duZ3JhZGUBAAQIaWQEXHN1ZG9fcXVldWVfZG93bndhcmRfeGNtAQAICGlkBAx4Y21ZEGxzdWRvX2VzdGFibGlzaF9ocm1wX2NoYW5uZWwBABAYc2VuZGVyBCRyZWNpcGllbnQEMG1heF9jYXBhY2l0eQRAbWF4X21lc3NhZ2Vfc2l6ZQQCCBxDdXJyZW50AQEFEE5leHQBAQUCFGhhc3NpZ25fcGVybV9wYXJhY2hhaW5fc2xvdAEABAhpZARoYXNzaWduX3RlbXBfcGFyYWNoYWluX3Nsb3QBAAgIaWQESGxlYXNlX3BlcmlvZF9zdGFydGEQXHVuYXNzaWduX3BhcmFjaGFpbl9zbG90AQAECGlkBFxzZXRfbWF4X3Blcm1hbmVudF9zbG90cwEABBRzbG90cwRcc2V0X21heF90ZW1wb3Jhcnlfc2xvdHMBAAQUc2xvdHMEAhBIcmVxdWVzdF9jb3JlX2NvdW50AQAEFGNvdW50BEhyZXF1ZXN0X3JldmVudWVfYXQBAAQQd2hlbgQ4Y3JlZGl0X2FjY291bnQBAAgMd2hvABhhbW91bnQILGFzc2lnbl9jb3JlAQAQEGNvcmUEFGJlZ2luBChhc3NpZ25tZW50VQYgZW5kX2hpbnQtBAAQRG5ld192YWxpZGF0b3Jfc2V03QMIaWQELHBydW5lX3VwX3RvLQQgbGVmdG92ZXIUAgwcUGFzc2l2ZQEBBSBCdWZmZXJlZAEBBRhBY3RpdmUBAQUCDDR2YWxpZGF0b3Jfc2V0AQAEGHJlcG9ydG0QIHNldF9tb2RlAQAEEG1vZGVxEFhmb3JjZV9vbl9taWdyYXRpb25fZW5kAQEFAAwUaW5kZXgEMGlubmVyX2N1cnNvcsUFKHN0YXJ0ZWRfYXQEAggYQWN0aXZlAQAMFGluZGV4BDBpbm5lcl9jdXJzb3LFBShzdGFydGVkX2F0BBRTdHVjawEBBQZ9EAIIIFNwZWNpZmljAQQkACBXaWxkY2FyZAEACBRsaW1pdC0EPHByZXZpb3VzX2N1cnNvcsUFAhBAZm9yY2Vfc2V0X2N1cnNvcgEABBhjdXJzb3KBEFxmb3JjZV9zZXRfYWN0aXZlX2N1cnNvcgEADBRpbmRleAQwaW5uZXJfY3Vyc29yxQUoc3RhcnRlZF9hdC0ESGZvcmNlX29uYm9hcmRfbWJtcwEBBThjbGVhcl9oaXN0b3JpYwEABCBzZWxlY3RvcoUQAhAgVGVsZXBvcnQBAQUwTG9jYWxSZXNlcnZlAQEFSERlc3RpbmF0aW9uUmVzZXJ2ZQEBBTRSZW1vdGVSZXNlcnZlAQIMCFYzAQAIHHBhcmVudHMEIGludGVyaW9ydQEIVjQBAAgccGFyZW50cwQgaW50ZXJpb3J1AQhWNQEACBxwYXJlbnRzBCBpbnRlcmlvcoUOAgwIVjMBAgggQ29uY3JldGUBAAgccGFyZW50cwQgaW50ZXJpb3J1ASBBYnN0cmFjdAEFAYAIVjQBAAgccGFyZW50cwQgaW50ZXJpb3J1AQhWNQEACBxwYXJlbnRzBCBpbnRlcmlvcoUOAkQQc2VuZAEACBBkZXN0kQ4cbWVzc2FnZVkQPHRlbGVwb3J0X2Fzc2V0cwEAEBBkZXN0kQ4sYmVuZWZpY2lhcnmRDhhhc3NldHMdDzhmZWVfYXNzZXRfaXRlbQRccmVzZXJ2ZV90cmFuc2Zlcl9hc3NldHMBABAQZGVzdJEOLGJlbmVmaWNpYXJ5kQ4YYXNzZXRzHQ84ZmVlX2Fzc2V0X2l0ZW0EHGV4ZWN1dGUBAAgcbWVzc2FnZVkQKG1heF93ZWlnaHQYRGZvcmNlX3hjbV92ZXJzaW9uAQAIIGxvY2F0aW9uiQ4cdmVyc2lvbgRkZm9yY2VfZGVmYXVsdF94Y21fdmVyc2lvbgEABERtYXliZV94Y21fdmVyc2lvbi0EeGZvcmNlX3N1YnNjcmliZV92ZXJzaW9uX25vdGlmeQEABCBsb2NhdGlvbpEOgGZvcmNlX3Vuc3Vic2NyaWJlX3ZlcnNpb25fbm90aWZ5AQAEIGxvY2F0aW9ukQ58bGltaXRlZF9yZXNlcnZlX3RyYW5zZmVyX2Fzc2V0cwEAFBBkZXN0kQ4sYmVuZWZpY2lhcnmRDhhhc3NldHMdDzhmZWVfYXNzZXRfaXRlbQQwd2VpZ2h0X2xpbWl08QJcbGltaXRlZF90ZWxlcG9ydF9hc3NldHMBABQQZGVzdJEOLGJlbmVmaWNpYXJ5kQ4YYXNzZXRzHQ84ZmVlX2Fzc2V0X2l0ZW0EMHdlaWdodF9saW1pdPECQGZvcmNlX3N1c3BlbnNpb24BAAQkc3VzcGVuZGVkFDx0cmFuc2Zlcl9hc3NldHMBABQQZGVzdJEOLGJlbmVmaWNpYXJ5kQ4YYXNzZXRzHQ84ZmVlX2Fzc2V0X2l0ZW0EMHdlaWdodF9saW1pdPECMGNsYWltX2Fzc2V0cwEACBhhc3NldHMdDyxiZW5lZmljaWFyeZEOjHRyYW5zZmVyX2Fzc2V0c191c2luZ190eXBlX2FuZF90aGVuAQAcEGRlc3SRDhhhc3NldHMdD1Bhc3NldHNfdHJhbnNmZXJfdHlwZY0QOHJlbW90ZV9mZWVzX2lkkRBIZmVlc190cmFuc2Zlcl90eXBljRBIY3VzdG9tX3hjbV9vbl9kZXN0WRAwd2VpZ2h0X2xpbWl08QJQYWRkX2F1dGhvcml6ZWRfYWxpYXMBAAgcYWxpYXNlcpEOHGV4cGlyZXP1A1xyZW1vdmVfYXV0aG9yaXplZF9hbGlhcwEABBxhbGlhc2VykQ50cmVtb3ZlX2FsbF9hdXRob3JpemVkX2FsaWFzZXMBAQUCDBhjcmVhdGUBAAgoYXNzZXRfa2luZI0OEHJhdGUIGHVwZGF0ZQEACChhc3NldF9raW5kjQ4QcmF0ZQgYcmVtb3ZlAQAEKGFzc2V0X2tpbmSNDgIIKGZpbGxfYmxvY2sBAAQUcmF0aW8ERHRyaWdnZXJfZGVmZW5zaXZlAQEFAggYU2lnbmVkAQAIJHNpZ25hdHVyZUEGHGFjY291bnQAIERpc2FibGVkAQEFAgEEIEltbW9ydGFsAQEFHE1vcnRhbDEBAQIcTW9ydGFsMgEBAhxNb3J0YWwzAQECHE1vcnRhbDQBAQIcTW9ydGFsNQEBAhxNb3J0YWw2AQECHE1vcnRhbDcBAQIcTW9ydGFsOAEBAhxNb3J0YWw5AQECIE1vcnRhbDEwAQECIE1vcnRhbDExAQECIE1vcnRhbDEyAQECIE1vcnRhbDEzAQECIE1vcnRhbDE0AQECIE1vcnRhbDE1AQECIE1vcnRhbDE2AQECIE1vcnRhbDE3AQECIE1vcnRhbDE4AQECIE1vcnRhbDE5AQECIE1vcnRhbDIwAQECIE1vcnRhbDIxAQECIE1vcnRhbDIyAQECIE1vcnRhbDIzAQECIE1vcnRhbDI0AQECIE1vcnRhbDI1AQECIE1vcnRhbDI2AQECIE1vcnRhbDI3AQECIE1vcnRhbDI4AQECIE1vcnRhbDI5AQECIE1vcnRhbDMwAQECIE1vcnRhbDMxAQECIE1vcnRhbDMyAQECIE1vcnRhbDMzAQECIE1vcnRhbDM0AQECIE1vcnRhbDM1AQECIE1vcnRhbDM2AQECIE1vcnRhbDM3AQECIE1vcnRhbDM4AQECIE1vcnRhbDM5AQECIE1vcnRhbDQwAQECIE1vcnRhbDQxAQECIE1vcnRhbDQyAQECIE1vcnRhbDQzAQECIE1vcnRhbDQ0AQECIE1vcnRhbDQ1AQECIE1vcnRhbDQ2AQECIE1vcnRhbDQ3AQECIE1vcnRhbDQ4AQECIE1vcnRhbDQ5AQECIE1vcnRhbDUwAQECIE1vcnRhbDUxAQECIE1vcnRhbDUyAQECIE1vcnRhbDUzAQECIE1vcnRhbDU0AQECIE1vcnRhbDU1AQECIE1vcnRhbDU2AQECIE1vcnRhbDU3AQECIE1vcnRhbDU4AQECIE1vcnRhbDU5AQECIE1vcnRhbDYwAQECIE1vcnRhbDYxAQECIE1vcnRhbDYyAQECIE1vcnRhbDYzAQECIE1vcnRhbDY0AQECIE1vcnRhbDY1AQECIE1vcnRhbDY2AQECIE1vcnRhbDY3AQECIE1vcnRhbDY4AQECIE1vcnRhbDY5AQECIE1vcnRhbDcwAQECIE1vcnRhbDcxAQECIE1vcnRhbDcyAQECIE1vcnRhbDczAQECIE1vcnRhbDc0AQECIE1vcnRhbDc1AQECIE1vcnRhbDc2AQECIE1vcnRhbDc3AQECIE1vcnRhbDc4AQECIE1vcnRhbDc5AQECIE1vcnRhbDgwAQECIE1vcnRhbDgxAQECIE1vcnRhbDgyAQECIE1vcnRhbDgzAQECIE1vcnRhbDg0AQECIE1vcnRhbDg1AQECIE1vcnRhbDg2AQECIE1vcnRhbDg3AQECIE1vcnRhbDg4AQECIE1vcnRhbDg5AQECIE1vcnRhbDkwAQECIE1vcnRhbDkxAQECIE1vcnRhbDkyAQECIE1vcnRhbDkzAQECIE1vcnRhbDk0AQECIE1vcnRhbDk1AQECIE1vcnRhbDk2AQECIE1vcnRhbDk3AQECIE1vcnRhbDk4AQECIE1vcnRhbDk5AQECJE1vcnRhbDEwMAEBAiRNb3J0YWwxMDEBAQIkTW9ydGFsMTAyAQECJE1vcnRhbDEwMwEBAiRNb3J0YWwxMDQBAQIkTW9ydGFsMTA1AQECJE1vcnRhbDEwNgEBAiRNb3J0YWwxMDcBAQIkTW9ydGFsMTA4AQECJE1vcnRhbDEwOQEBAiRNb3J0YWwxMTABAQIkTW9ydGFsMTExAQECJE1vcnRhbDExMgEBAiRNb3J0YWwxMTMBAQIkTW9ydGFsMTE0AQECJE1vcnRhbDExNQEBAiRNb3J0YWwxMTYBAQIkTW9ydGFsMTE3AQECJE1vcnRhbDExOAEBAiRNb3J0YWwxMTkBAQIkTW9ydGFsMTIwAQECJE1vcnRhbDEyMQEBAiRNb3J0YWwxMjIBAQIkTW9ydGFsMTIzAQECJE1vcnRhbDEyNAEBAiRNb3J0YWwxMjUBAQIkTW9ydGFsMTI2AQECJE1vcnRhbDEyNwEBAiRNb3J0YWwxMjgBAQIkTW9ydGFsMTI5AQECJE1vcnRhbDEzMAEBAiRNb3J0YWwxMzEBAQIkTW9ydGFsMTMyAQECJE1vcnRhbDEzMwEBAiRNb3J0YWwxMzQBAQIkTW9ydGFsMTM1AQECJE1vcnRhbDEzNgEBAiRNb3J0YWwxMzcBAQIkTW9ydGFsMTM4AQECJE1vcnRhbDEzOQEBAiRNb3J0YWwxNDABAQIkTW9ydGFsMTQxAQECJE1vcnRhbDE0MgEBAiRNb3J0YWwxNDMBAQIkTW9ydGFsMTQ0AQECJE1vcnRhbDE0NQEBAiRNb3J0YWwxNDYBAQIkTW9ydGFsMTQ3AQECJE1vcnRhbDE0OAEBAiRNb3J0YWwxNDkBAQIkTW9ydGFsMTUwAQECJE1vcnRhbDE1MQEBAiRNb3J0YWwxNTIBAQIkTW9ydGFsMTUzAQECJE1vcnRhbDE1NAEBAiRNb3J0YWwxNTUBAQIkTW9ydGFsMTU2AQECJE1vcnRhbDE1NwEBAiRNb3J0YWwxNTgBAQIkTW9ydGFsMTU5AQECJE1vcnRhbDE2MAEBAiRNb3J0YWwxNjEBAQIkTW9ydGFsMTYyAQECJE1vcnRhbDE2MwEBAiRNb3J0YWwxNjQBAQIkTW9ydGFsMTY1AQECJE1vcnRhbDE2NgEBAiRNb3J0YWwxNjcBAQIkTW9ydGFsMTY4AQECJE1vcnRhbDE2OQEBAiRNb3J0YWwxNzABAQIkTW9ydGFsMTcxAQECJE1vcnRhbDE3MgEBAiRNb3J0YWwxNzMBAQIkTW9ydGFsMTc0AQECJE1vcnRhbDE3NQEBAiRNb3J0YWwxNzYBAQIkTW9ydGFsMTc3AQECJE1vcnRhbDE3OAEBAiRNb3J0YWwxNzkBAQIkTW9ydGFsMTgwAQECJE1vcnRhbDE4MQEBAiRNb3J0YWwxODIBAQIkTW9ydGFsMTgzAQECJE1vcnRhbDE4NAEBAiRNb3J0YWwxODUBAQIkTW9ydGFsMTg2AQECJE1vcnRhbDE4NwEBAiRNb3J0YWwxODgBAQIkTW9ydGFsMTg5AQECJE1vcnRhbDE5MAEBAiRNb3J0YWwxOTEBAQIkTW9ydGFsMTkyAQECJE1vcnRhbDE5MwEBAiRNb3J0YWwxOTQBAQIkTW9ydGFsMTk1AQECJE1vcnRhbDE5NgEBAiRNb3J0YWwxOTcBAQIkTW9ydGFsMTk4AQECJE1vcnRhbDE5OQEBAiRNb3J0YWwyMDABAQIkTW9ydGFsMjAxAQECJE1vcnRhbDIwMgEBAiRNb3J0YWwyMDMBAQIkTW9ydGFsMjA0AQECJE1vcnRhbDIwNQEBAiRNb3J0YWwyMDYBAQIkTW9ydGFsMjA3AQECJE1vcnRhbDIwOAEBAiRNb3J0YWwyMDkBAQIkTW9ydGFsMjEwAQECJE1vcnRhbDIxMQEBAiRNb3J0YWwyMTIBAQIkTW9ydGFsMjEzAQECJE1vcnRhbDIxNAEBAiRNb3J0YWwyMTUBAQIkTW9ydGFsMjE2AQECJE1vcnRhbDIxNwEBAiRNb3J0YWwyMTgBAQIkTW9ydGFsMjE5AQECJE1vcnRhbDIyMAEBAiRNb3J0YWwyMjEBAQIkTW9ydGFsMjIyAQECJE1vcnRhbDIyMwEBAiRNb3J0YWwyMjQBAQIkTW9ydGFsMjI1AQECJE1vcnRhbDIyNgEBAiRNb3J0YWwyMjcBAQIkTW9ydGFsMjI4AQECJE1vcnRhbDIyOQEBAiRNb3J0YWwyMzABAQIkTW9ydGFsMjMxAQECJE1vcnRhbDIzMgEBAiRNb3J0YWwyMzMBAQIkTW9ydGFsMjM0AQECJE1vcnRhbDIzNQEBAiRNb3J0YWwyMzYBAQIkTW9ydGFsMjM3AQECJE1vcnRhbDIzOAEBAiRNb3J0YWwyMzkBAQIkTW9ydGFsMjQwAQECJE1vcnRhbDI0MQEBAiRNb3J0YWwyNDIBAQIkTW9ydGFsMjQzAQECJE1vcnRhbDI0NAEBAiRNb3J0YWwyNDUBAQIkTW9ydGFsMjQ2AQECJE1vcnRhbDI0NwEBAiRNb3J0YWwyNDgBAQIkTW9ydGFsMjQ5AQECJE1vcnRhbDI1MAEBAiRNb3J0YWwyNTEBAQIkTW9ydGFsMjUyAQECJE1vcnRhbDI1MwEBAiRNb3J0YWwyNTQBAQIkTW9ydGFsMjU1AQECAgggRGlzYWJsZWQBAQUcRW5hYmxlZAEBBQMkoRAVARUBFQEVARUBpRAEqRAADBBjYWxs0RBEZXh0ZW5zaW9uX3ZlcnNpb24EJGV4dGVuc2lvbq0QAgQgZGlzcGF0Y2gBAAQcbWV0YV90eLEQAwgIIAS5EAAAEChwcmV2X3BlYWtzOQM8cHJldl9sZWFmX2NvdW50CChsZWFmX2NvdW50CBRpdGVtc70QAAwQdm90ZdEGOGFuY2VzdHJ5X3Byb29mwRAYaGVhZGVytQMCHFByZXBvcnRfZG91YmxlX3ZvdGluZwEACEhlcXVpdm9jYXRpb25fcHJvb2bVBjxrZXlfb3duZXJfcHJvb2a9A3RyZXBvcnRfZG91YmxlX3ZvdGluZ191bnNpZ25lZAEACEhlcXVpdm9jYXRpb25fcHJvb2bVBjxrZXlfb3duZXJfcHJvb2a9AzxzZXRfbmV3X2dlbmVzaXMBAAQ8ZGVsYXlfaW5fYmxvY2tzBEhyZXBvcnRfZm9ya192b3RpbmcBAAhIZXF1aXZvY2F0aW9uX3Byb29mxRA8a2V5X293bmVyX3Byb29mvQNscmVwb3J0X2Zvcmtfdm90aW5nX3Vuc2lnbmVkAQAISGVxdWl2b2NhdGlvbl9wcm9vZsUQPGtleV9vd25lcl9wcm9vZr0DaHJlcG9ydF9mdXR1cmVfYmxvY2tfdm90aW5nAQAISGVxdWl2b2NhdGlvbl9wcm9vZtEGPGtleV9vd25lcl9wcm9vZr0DjHJlcG9ydF9mdXR1cmVfYmxvY2tfdm90aW5nX3Vuc2lnbmVkAQAISGVxdWl2b2NhdGlvbl9wcm9vZtEGPGtleV9vd25lcl9wcm9vZr0DAgg0cmVhcF9pZGVudGl0eQEABAx3aG8AMHBva2VfZGVwb3NpdAEABAx3aG8AAtAYU3lzdGVtAQIsGHJlbWFyawEABBhyZW1hcmskOHNldF9oZWFwX3BhZ2VzAQAEFHBhZ2VzCCBzZXRfY29kZQEABBBjb2RlJFxzZXRfY29kZV93aXRob3V0X2NoZWNrcwEABBBjb2RlJCxzZXRfc3RvcmFnZQEABBRpdGVtc3kDMGtpbGxfc3RvcmFnZQEABBBrZXlzfQMsa2lsbF9wcmVmaXgBAAgYcHJlZml4JBxzdWJrZXlzBERyZW1hcmtfd2l0aF9ldmVudAEABBhyZW1hcmskRGF1dGhvcml6ZV91cGdyYWRlAQAEJGNvZGVfaGFzaCCAYXV0aG9yaXplX3VwZ3JhZGVfd2l0aG91dF9jaGVja3MBAAQkY29kZV9oYXNoIGBhcHBseV9hdXRob3JpemVkX3VwZ3JhZGUBAAQQY29kZSQQQmFiZQECDExyZXBvcnRfZXF1aXZvY2F0aW9uAQAISGVxdWl2b2NhdGlvbl9wcm9vZrkDPGtleV9vd25lcl9wcm9vZr0DcHJlcG9ydF9lcXVpdm9jYXRpb25fdW5zaWduZWQBAAhIZXF1aXZvY2F0aW9uX3Byb29muQM8a2V5X293bmVyX3Byb29mvQNIcGxhbl9jb25maWdfY2hhbmdlAQAEGGNvbmZpZ8kDJFRpbWVzdGFtcAECBAxzZXQBAAQMbm93CBxJbmRpY2VzAQIYFGNsYWltAQAEFGluZGV4BCB0cmFuc2ZlcgEACAxuZXfVAxRpbmRleAQQZnJlZQEABBRpbmRleAQ4Zm9yY2VfdHJhbnNmZXIBAAwMbmV31QMUaW5kZXgEGGZyZWV6ZRQYZnJlZXplAQAEFGluZGV4BDBwb2tlX2RlcG9zaXQBAAQUaW5kZXgEIEJhbGFuY2VzAQIkUHRyYW5zZmVyX2FsbG93X2RlYXRoAQAIEGRlc3TVAxR2YWx1ZQg4Zm9yY2VfdHJhbnNmZXIBAAwYc291cmNl1QMQZGVzdNUDFHZhbHVlCEx0cmFuc2Zlcl9rZWVwX2FsaXZlAQAIEGRlc3TVAxR2YWx1ZQgwdHJhbnNmZXJfYWxsAQAIEGRlc3TVAyhrZWVwX2FsaXZlFDxmb3JjZV91bnJlc2VydmUBAAgMd2hv1QMYYW1vdW50CEB1cGdyYWRlX2FjY291bnRzAQAEDHdob90DRGZvcmNlX3NldF9iYWxhbmNlAQAIDHdob9UDIG5ld19mcmVlCGxmb3JjZV9hZGp1c3RfdG90YWxfaXNzdWFuY2UBAAgkZGlyZWN0aW9u4QMUZGVsdGEIEGJ1cm4BAAgUdmFsdWUIKGtlZXBfYWxpdmUUHFN0YWtpbmcBAoAQYm9uZAEACBR2YWx1ZQgUcGF5ZWU1AShib25kX2V4dHJhAQAEOG1heF9hZGRpdGlvbmFsCBh1bmJvbmQBAAQUdmFsdWUIRHdpdGhkcmF3X3VuYm9uZGVkAQAESG51bV9zbGFzaGluZ19zcGFucwQgdmFsaWRhdGUBAAQUcHJlZnM5ASBub21pbmF0ZQEABBx0YXJnZXRz6QMUY2hpbGwBAQUkc2V0X3BheWVlAQAEFHBheWVlNQE4c2V0X2NvbnRyb2xsZXIBAQVMc2V0X3ZhbGlkYXRvcl9jb3VudAEABAxuZXcEYGluY3JlYXNlX3ZhbGlkYXRvcl9jb3VudAEABChhZGRpdGlvbmFsBFRzY2FsZV92YWxpZGF0b3JfY291bnQBAAQYZmFjdG9yBDRmb3JjZV9ub19lcmFzAQEFNGZvcmNlX25ld19lcmEBAQVEc2V0X2ludnVsbmVyYWJsZXMBAAQ0aW52dWxuZXJhYmxlc90DNGZvcmNlX3Vuc3Rha2UBAAgUc3Rhc2gASG51bV9zbGFzaGluZ19zcGFucwRQZm9yY2VfbmV3X2VyYV9hbHdheXMBAQVUY2FuY2VsX2RlZmVycmVkX3NsYXNoAQAIDGVyYQQ0c2xhc2hfaW5kaWNlczkCOHBheW91dF9zdGFrZXJzAQAIPHZhbGlkYXRvcl9zdGFzaAAMZXJhBBhyZWJvbmQBAAQUdmFsdWUIKHJlYXBfc3Rhc2gBAAgUc3Rhc2gASG51bV9zbGFzaGluZ19zcGFucwQQa2ljawEABAx3aG/pA0xzZXRfc3Rha2luZ19jb25maWdzAQAcSG1pbl9ub21pbmF0b3JfYm9uZO0DSG1pbl92YWxpZGF0b3JfYm9uZO0DTG1heF9ub21pbmF0b3JfY291bnTxA0xtYXhfdmFsaWRhdG9yX2NvdW508QM8Y2hpbGxfdGhyZXNob2xk8QM4bWluX2NvbW1pc3Npb27xA0htYXhfc3Rha2VkX3Jld2FyZHPxAyxjaGlsbF9vdGhlcgEABBRzdGFzaABoZm9yY2VfYXBwbHlfbWluX2NvbW1pc3Npb24BAAQ8dmFsaWRhdG9yX3N0YXNoAEhzZXRfbWluX2NvbW1pc3Npb24BAAQMbmV3BFhwYXlvdXRfc3Rha2Vyc19ieV9wYWdlAQAMPHZhbGlkYXRvcl9zdGFzaAAMZXJhBBBwYWdlBDB1cGRhdGVfcGF5ZWUBAAQoY29udHJvbGxlcgBoZGVwcmVjYXRlX2NvbnRyb2xsZXJfYmF0Y2gBAAQsY29udHJvbGxlcnPdAzhyZXN0b3JlX2xlZGdlcgEAEBRzdGFzaABAbWF5YmVfY29udHJvbGxlcgUCLG1heWJlX3RvdGFs9QM8bWF5YmVfdW5sb2NraW5nAQRAbWlncmF0ZV9jdXJyZW5jeQEABBRzdGFzaAAwbWFudWFsX3NsYXNoAQAMPHZhbGlkYXRvcl9zdGFzaAAMZXJhBDhzbGFzaF9mcmFjdGlvbgQoUGFyYW1ldGVycwECBDRzZXRfcGFyYW1ldGVyAQAEJGtleV92YWx1ZVUEHFNlc3Npb24BAgggc2V0X2tleXMBAAgQa2V5cw0EFHByb29mJChwdXJnZV9rZXlzAQEFHEdyYW5kcGEBAgxMcmVwb3J0X2VxdWl2b2NhdGlvbgEACEhlcXVpdm9jYXRpb25fcHJvb2YlBDxrZXlfb3duZXJfcHJvb2a9A3ByZXBvcnRfZXF1aXZvY2F0aW9uX3Vuc2lnbmVkAQAISGVxdWl2b2NhdGlvbl9wcm9vZiUEPGtleV9vd25lcl9wcm9vZr0DMG5vdGVfc3RhbGxlZAEACBRkZWxheQRsYmVzdF9maW5hbGl6ZWRfYmxvY2tfbnVtYmVyBBxVdGlsaXR5AQIgFGJhdGNoAQAEFGNhbGxz1RA0YXNfZGVyaXZhdGl2ZQEACBRpbmRleAQQY2FsbNEQJGJhdGNoX2FsbAEABBRjYWxsc9UQLGRpc3BhdGNoX2FzAQAIJGFzX29yaWdpbnUPEGNhbGzRECxmb3JjZV9iYXRjaAEABBRjYWxsc9UQLHdpdGhfd2VpZ2h0AQAIEGNhbGzREBh3ZWlnaHQYHGlmX2Vsc2UBAAgQbWFpbtEQIGZhbGxiYWNr0RBQZGlzcGF0Y2hfYXNfZmFsbGlibGUBAAgkYXNfb3JpZ2ludQ8QY2FsbNEQIElkZW50aXR5AQJgNGFkZF9yZWdpc3RyYXIBAAQcYWNjb3VudNUDMHNldF9pZGVudGl0eQEABBBpbmZv7Q8gc2V0X3N1YnMBAAQQc3Vic/UPOGNsZWFyX2lkZW50aXR5AQEFRHJlcXVlc3RfanVkZ2VtZW50AQAIJHJlZ19pbmRleAQcbWF4X2ZlZQg4Y2FuY2VsX3JlcXVlc3QBAAQkcmVnX2luZGV4BBxzZXRfZmVlAQAIFGluZGV4BAxmZWUIOHNldF9hY2NvdW50X2lkAQAIFGluZGV4BAxuZXfVAyhzZXRfZmllbGRzAQAIFGluZGV4BBhmaWVsZHMIRHByb3ZpZGVfanVkZ2VtZW50AQAQJHJlZ19pbmRleAQYdGFyZ2V01QMkanVkZ2VtZW50+Q8gaWRlbnRpdHkgNGtpbGxfaWRlbnRpdHkBAAQYdGFyZ2V01QMcYWRkX3N1YgEACAxzdWLVAxBkYXRh3Q8ocmVuYW1lX3N1YgEACAxzdWLVAxBkYXRh3Q8ocmVtb3ZlX3N1YgEABAxzdWLVAyBxdWl0X3N1YgEBBVhhZGRfdXNlcm5hbWVfYXV0aG9yaXR5AQAMJGF1dGhvcml0edUDGHN1ZmZpeCQoYWxsb2NhdGlvbgRkcmVtb3ZlX3VzZXJuYW1lX2F1dGhvcml0eQEACBhzdWZmaXgkJGF1dGhvcml0edUDQHNldF91c2VybmFtZV9mb3IBABAMd2hv1QMgdXNlcm5hbWUkJHNpZ25hdHVyZUUGOHVzZV9hbGxvY2F0aW9uFDxhY2NlcHRfdXNlcm5hbWUBAAQgdXNlcm5hbWUkXHJlbW92ZV9leHBpcmVkX2FwcHJvdmFsAQAEIHVzZXJuYW1lJFBzZXRfcHJpbWFyeV91c2VybmFtZQEABCB1c2VybmFtZSQ8dW5iaW5kX3VzZXJuYW1lAQAEIHVzZXJuYW1lJDxyZW1vdmVfdXNlcm5hbWUBAAQgdXNlcm5hbWUkNGtpbGxfdXNlcm5hbWUBAAQgdXNlcm5hbWUkIFJlY292ZXJ5AQIoMGFzX3JlY292ZXJlZAEACBxhY2NvdW501QMQY2FsbNEQNHNldF9yZWNvdmVyZWQBAAgQbG9zdNUDHHJlc2N1ZXLVAzxjcmVhdGVfcmVjb3ZlcnkBAAwcZnJpZW5kc90DJHRocmVzaG9sZAQwZGVsYXlfcGVyaW9kBERpbml0aWF0ZV9yZWNvdmVyeQEABBxhY2NvdW501QM4dm91Y2hfcmVjb3ZlcnkBAAgQbG9zdNUDHHJlc2N1ZXLVAzhjbGFpbV9yZWNvdmVyeQEABBxhY2NvdW501QM4Y2xvc2VfcmVjb3ZlcnkBAAQccmVzY3VlctUDPHJlbW92ZV9yZWNvdmVyeQEBBUBjYW5jZWxfcmVjb3ZlcmVkAQAEHGFjY291bnTVAzBwb2tlX2RlcG9zaXQBAAQ0bWF5YmVfYWNjb3VudAEQHFZlc3RpbmcBAhgQdmVzdAEBBSh2ZXN0X290aGVyAQAEGHRhcmdldNUDPHZlc3RlZF90cmFuc2ZlcgEACBh0YXJnZXTVAyBzY2hlZHVsZXUEVGZvcmNlX3Zlc3RlZF90cmFuc2ZlcgEADBhzb3VyY2XVAxh0YXJnZXTVAyBzY2hlZHVsZXUEPG1lcmdlX3NjaGVkdWxlcwEACDxzY2hlZHVsZTFfaW5kZXgEPHNjaGVkdWxlMl9pbmRleAR0Zm9yY2VfcmVtb3ZlX3Zlc3Rpbmdfc2NoZWR1bGUBAAgYdGFyZ2V01QM4c2NoZWR1bGVfaW5kZXgEJFNjaGVkdWxlcgECKCBzY2hlZHVsZQEAEBB3aGVuBDhtYXliZV9wZXJpb2RpY4EDIHByaW9yaXR5BBBjYWxs0RAYY2FuY2VsAQAIEHdoZW4EFGluZGV4BDhzY2hlZHVsZV9uYW1lZAEAFAhpZCAQd2hlbgQ4bWF5YmVfcGVyaW9kaWOBAyBwcmlvcml0eQQQY2FsbNEQMGNhbmNlbF9uYW1lZAEABAhpZCA4c2NoZWR1bGVfYWZ0ZXIBABAUYWZ0ZXIEOG1heWJlX3BlcmlvZGljgQMgcHJpb3JpdHkEEGNhbGzREFBzY2hlZHVsZV9uYW1lZF9hZnRlcgEAFAhpZCAUYWZ0ZXIEOG1heWJlX3BlcmlvZGljgQMgcHJpb3JpdHkEEGNhbGzRECRzZXRfcmV0cnkBAAwQdGFzaw0BHHJldHJpZXMEGHBlcmlvZAQ8c2V0X3JldHJ5X25hbWVkAQAMCGlkIBxyZXRyaWVzBBhwZXJpb2QEMGNhbmNlbF9yZXRyeQEABBB0YXNrDQFIY2FuY2VsX3JldHJ5X25hbWVkAQAECGlkICBQcmVpbWFnZQECFDRub3RlX3ByZWltYWdlAQAEFGJ5dGVzJDx1bm5vdGVfcHJlaW1hZ2UBAAQQaGFzaCBAcmVxdWVzdF9wcmVpbWFnZQEABBBoYXNoIEh1bnJlcXVlc3RfcHJlaW1hZ2UBAAQQaGFzaCA4ZW5zdXJlX3VwZGF0ZWQBAAQYaGFzaGVzOQMQU3VkbwECFBBzdWRvAQAEEGNhbGzREFRzdWRvX3VuY2hlY2tlZF93ZWlnaHQBAAgQY2FsbNEQGHdlaWdodBgcc2V0X2tleQEABAxuZXfVAxxzdWRvX2FzAQAIDHdob9UDEGNhbGzREChyZW1vdmVfa2V5AQEFFFByb3h5AQIsFHByb3h5AQAMEHJlYWzVA0Bmb3JjZV9wcm94eV90eXBlERAQY2FsbNEQJGFkZF9wcm94eQEADCBkZWxlZ2F0ZdUDKHByb3h5X3R5cGU1DhRkZWxheQQwcmVtb3ZlX3Byb3h5AQAMIGRlbGVnYXRl1QMocHJveHlfdHlwZTUOFGRlbGF5BDhyZW1vdmVfcHJveGllcwEBBSxjcmVhdGVfcHVyZQEADChwcm94eV90eXBlNQ4UZGVsYXkEFGluZGV4BCRraWxsX3B1cmUBABQcc3Bhd25lctUDKHByb3h5X3R5cGU1DhRpbmRleAQYaGVpZ2h0BCRleHRfaW5kZXgEIGFubm91bmNlAQAIEHJlYWzVAyRjYWxsX2hhc2ggTHJlbW92ZV9hbm5vdW5jZW1lbnQBAAgQcmVhbNUDJGNhbGxfaGFzaCBMcmVqZWN0X2Fubm91bmNlbWVudAEACCBkZWxlZ2F0ZdUDJGNhbGxfaGFzaCA8cHJveHlfYW5ub3VuY2VkAQAQIGRlbGVnYXRl1QMQcmVhbNUDQGZvcmNlX3Byb3h5X3R5cGUREBBjYWxs0RAwcG9rZV9kZXBvc2l0AQEFIE11bHRpc2lnAQIUUGFzX211bHRpX3RocmVzaG9sZF8xAQAIRG90aGVyX3NpZ25hdG9yaWVz3QMQY2FsbNEQIGFzX211bHRpAQAUJHRocmVzaG9sZAREb3RoZXJfc2lnbmF0b3JpZXPdAzxtYXliZV90aW1lcG9pbnSNBBBjYWxs0RAobWF4X3dlaWdodBhAYXBwcm92ZV9hc19tdWx0aQEAFCR0aHJlc2hvbGQERG90aGVyX3NpZ25hdG9yaWVz3QM8bWF5YmVfdGltZXBvaW50jQQkY2FsbF9oYXNoIChtYXhfd2VpZ2h0GDxjYW5jZWxfYXNfbXVsdGkBABAkdGhyZXNob2xkBERvdGhlcl9zaWduYXRvcmllc90DJHRpbWVwb2ludPEBJGNhbGxfaGFzaCAwcG9rZV9kZXBvc2l0AQAMJHRocmVzaG9sZAREb3RoZXJfc2lnbmF0b3JpZXPdAyRjYWxsX2hhc2ggaEVsZWN0aW9uUHJvdmlkZXJNdWx0aVBoYXNlAQIUPHN1Ym1pdF91bnNpZ25lZAEACDByYXdfc29sdXRpb25ZBRx3aXRuZXNzXQVsc2V0X21pbmltdW1fdW50cnVzdGVkX3Njb3JlAQAEQG1heWJlX25leHRfc2NvcmVhBXRzZXRfZW1lcmdlbmN5X2VsZWN0aW9uX3Jlc3VsdAEABCBzdXBwb3J0c3UFGHN1Ym1pdAEABDByYXdfc29sdXRpb25ZBUxnb3Zlcm5hbmNlX2ZhbGxiYWNrAQEFJFZvdGVyTGlzdAECDBRyZWJhZwEABChkaXNsb2NhdGVk1QM8cHV0X2luX2Zyb250X29mAQAEHGxpZ2h0ZXLVA1RwdXRfaW5fZnJvbnRfb2Zfb3RoZXIBAAgcaGVhdmllctUDHGxpZ2h0ZXLVAzxOb21pbmF0aW9uUG9vbHMBAmgQam9pbgEACBhhbW91bnQIHHBvb2xfaWQEKGJvbmRfZXh0cmEBAAQUZXh0cmGBBTBjbGFpbV9wYXlvdXQBAQUYdW5ib25kAQAIOG1lbWJlcl9hY2NvdW501QNAdW5ib25kaW5nX3BvaW50cwhYcG9vbF93aXRoZHJhd191bmJvbmRlZAEACBxwb29sX2lkBEhudW1fc2xhc2hpbmdfc3BhbnMERHdpdGhkcmF3X3VuYm9uZGVkAQAIOG1lbWJlcl9hY2NvdW501QNIbnVtX3NsYXNoaW5nX3NwYW5zBBhjcmVhdGUBABAYYW1vdW50CBByb2901QMkbm9taW5hdG9y1QMcYm91bmNlctUDTGNyZWF0ZV93aXRoX3Bvb2xfaWQBABQYYW1vdW50CBByb2901QMkbm9taW5hdG9y1QMcYm91bmNlctUDHHBvb2xfaWQEIG5vbWluYXRlAQAIHHBvb2xfaWQEKHZhbGlkYXRvcnPdAyRzZXRfc3RhdGUBAAgccG9vbF9pZAQUc3RhdGUdAjBzZXRfbWV0YWRhdGEBAAgccG9vbF9pZAQgbWV0YWRhdGEkLHNldF9jb25maWdzAQAYNG1pbl9qb2luX2JvbmTtAzxtaW5fY3JlYXRlX2JvbmTtAyRtYXhfcG9vbHPxAyxtYXhfbWVtYmVyc/EDUG1heF9tZW1iZXJzX3Blcl9wb29s8QNUZ2xvYmFsX21heF9jb21taXNzaW9u8QMwdXBkYXRlX3JvbGVzAQAQHHBvb2xfaWQEIG5ld19yb290hQU0bmV3X25vbWluYXRvcoUFLG5ld19ib3VuY2VyhQUUY2hpbGwBAAQccG9vbF9pZARAYm9uZF9leHRyYV9vdGhlcgEACBhtZW1iZXLVAxRleHRyYYEFUHNldF9jbGFpbV9wZXJtaXNzaW9uAQAEKHBlcm1pc3Npb26JBUhjbGFpbV9wYXlvdXRfb3RoZXIBAAQUb3RoZXIAOHNldF9jb21taXNzaW9uAQAIHHBvb2xfaWQEOG5ld19jb21taXNzaW9uJQJIc2V0X2NvbW1pc3Npb25fbWF4AQAIHHBvb2xfaWQEOG1heF9jb21taXNzaW9uBGhzZXRfY29tbWlzc2lvbl9jaGFuZ2VfcmF0ZQEACBxwb29sX2lkBCxjaGFuZ2VfcmF0ZSkCQGNsYWltX2NvbW1pc3Npb24BAAQccG9vbF9pZARMYWRqdXN0X3Bvb2xfZGVwb3NpdAEABBxwb29sX2lkBHxzZXRfY29tbWlzc2lvbl9jbGFpbV9wZXJtaXNzaW9uAQAIHHBvb2xfaWQEKHBlcm1pc3Npb24xAixhcHBseV9zbGFzaAEABDhtZW1iZXJfYWNjb3VudNUDSG1pZ3JhdGVfZGVsZWdhdGlvbgEABDhtZW1iZXJfYWNjb3VudNUDeG1pZ3JhdGVfcG9vbF90b19kZWxlZ2F0ZV9zdGFrZQEABBxwb29sX2lkBCxGYXN0VW5zdGFrZQECDFRyZWdpc3Rlcl9mYXN0X3Vuc3Rha2UBAQUoZGVyZWdpc3RlcgEBBRxjb250cm9sAQAENGVyYXNfdG9fY2hlY2sEQENvbnZpY3Rpb25Wb3RpbmcBAhgQdm90ZQEACChwb2xsX2luZGV4BBB2b3RlNQQgZGVsZWdhdGUBABAUY2xhc3MECHRv1QMoY29udmljdGlvbjkEHGJhbGFuY2UIKHVuZGVsZWdhdGUBAAQUY2xhc3MEGHVubG9jawEACBRjbGFzcwQYdGFyZ2V01QMscmVtb3ZlX3ZvdGUBAAgUY2xhc3MtBBRpbmRleAREcmVtb3ZlX290aGVyX3ZvdGUBAAwYdGFyZ2V01QMUY2xhc3MEFGluZGV4BCRSZWZlcmVuZGEBAiQYc3VibWl0AQAMPHByb3Bvc2FsX29yaWdpbnUPIHByb3Bvc2FspQFAZW5hY3RtZW50X21vbWVudEEEWHBsYWNlX2RlY2lzaW9uX2RlcG9zaXQBAAQUaW5kZXgEXHJlZnVuZF9kZWNpc2lvbl9kZXBvc2l0AQAEFGluZGV4BBhjYW5jZWwBAAQUaW5kZXgEEGtpbGwBAAQUaW5kZXgEQG51ZGdlX3JlZmVyZW5kdW0BAAQUaW5kZXgESG9uZV9mZXdlcl9kZWNpZGluZwEABBR0cmFjawRkcmVmdW5kX3N1Ym1pc3Npb25fZGVwb3NpdAEABBRpbmRleAQwc2V0X21ldGFkYXRhAQAIFGluZGV4BChtYXliZV9oYXNoEQEkV2hpdGVsaXN0AQIQOHdoaXRlbGlzdF9jYWxsAQAEJGNhbGxfaGFzaCBccmVtb3ZlX3doaXRlbGlzdGVkX2NhbGwBAAQkY2FsbF9oYXNoIGRkaXNwYXRjaF93aGl0ZWxpc3RlZF9jYWxsAQAMJGNhbGxfaGFzaCBAY2FsbF9lbmNvZGVkX2xlbgRMY2FsbF93ZWlnaHRfd2l0bmVzcxicZGlzcGF0Y2hfd2hpdGVsaXN0ZWRfY2FsbF93aXRoX3ByZWltYWdlAQAEEGNhbGzRECBUcmVhc3VyeQECGCxzcGVuZF9sb2NhbAEACBhhbW91bnQILGJlbmVmaWNpYXJ51QM8cmVtb3ZlX2FwcHJvdmFsAQAELHByb3Bvc2FsX2lkBBRzcGVuZAEAEChhc3NldF9raW5kjQ4YYW1vdW50CCxiZW5lZmljaWFyeZEOKHZhbGlkX2Zyb20tBBhwYXlvdXQBAAQUaW5kZXgEMGNoZWNrX3N0YXR1cwEABBRpbmRleAQodm9pZF9zcGVuZAEABBRpbmRleAQ0Q29uZmlndXJhdGlvbgECuHxzZXRfdmFsaWRhdGlvbl91cGdyYWRlX2Nvb2xkb3duAQAEDG5ldwRwc2V0X3ZhbGlkYXRpb25fdXBncmFkZV9kZWxheQEABAxuZXcEZHNldF9jb2RlX3JldGVudGlvbl9wZXJpb2QBAAQMbmV3BERzZXRfbWF4X2NvZGVfc2l6ZQEABAxuZXcEQHNldF9tYXhfcG92X3NpemUBAAQMbmV3BFhzZXRfbWF4X2hlYWRfZGF0YV9zaXplAQAEDG5ldwRIc2V0X2NvcmV0aW1lX2NvcmVzAQAEDG5ldwRwc2V0X2dyb3VwX3JvdGF0aW9uX2ZyZXF1ZW5jeQEABAxuZXcEdHNldF9wYXJhc19hdmFpbGFiaWxpdHlfcGVyaW9kAQAEDG5ldwRgc2V0X3NjaGVkdWxpbmdfbG9va2FoZWFkAQAEDG5ldwRsc2V0X21heF92YWxpZGF0b3JzX3Blcl9jb3JlAQAEDG5ldy0ESHNldF9tYXhfdmFsaWRhdG9ycwEABAxuZXctBEhzZXRfZGlzcHV0ZV9wZXJpb2QBAAQMbmV3BLRzZXRfZGlzcHV0ZV9wb3N0X2NvbmNsdXNpb25fYWNjZXB0YW5jZV9wZXJpb2QBAAQMbmV3BERzZXRfbm9fc2hvd19zbG90cwEABAxuZXcEUHNldF9uX2RlbGF5X3RyYW5jaGVzAQAEDG5ldwR4c2V0X3plcm90aF9kZWxheV90cmFuY2hlX3dpZHRoAQAEDG5ldwRQc2V0X25lZWRlZF9hcHByb3ZhbHMBAAQMbmV3BHBzZXRfcmVsYXlfdnJmX21vZHVsb19zYW1wbGVzAQAEDG5ldwRoc2V0X21heF91cHdhcmRfcXVldWVfY291bnQBAAQMbmV3BGRzZXRfbWF4X3Vwd2FyZF9xdWV1ZV9zaXplAQAEDG5ldwR0c2V0X21heF9kb3dud2FyZF9tZXNzYWdlX3NpemUBAAQMbmV3BGxzZXRfbWF4X3Vwd2FyZF9tZXNzYWdlX3NpemUBAAQMbmV3BKBzZXRfbWF4X3Vwd2FyZF9tZXNzYWdlX251bV9wZXJfY2FuZGlkYXRlAQAEDG5ldwRkc2V0X2hybXBfb3Blbl9yZXF1ZXN0X3R0bAEABAxuZXcEXHNldF9ocm1wX3NlbmRlcl9kZXBvc2l0AQAEDG5ldwhoc2V0X2hybXBfcmVjaXBpZW50X2RlcG9zaXQBAAQMbmV3CHRzZXRfaHJtcF9jaGFubmVsX21heF9jYXBhY2l0eQEABAxuZXcEfHNldF9ocm1wX2NoYW5uZWxfbWF4X3RvdGFsX3NpemUBAAQMbmV3BJxzZXRfaHJtcF9tYXhfcGFyYWNoYWluX2luYm91bmRfY2hhbm5lbHMBAAQMbmV3BIRzZXRfaHJtcF9jaGFubmVsX21heF9tZXNzYWdlX3NpemUBAAQMbmV3BKBzZXRfaHJtcF9tYXhfcGFyYWNoYWluX291dGJvdW5kX2NoYW5uZWxzAQAEDG5ldwSYc2V0X2hybXBfbWF4X21lc3NhZ2VfbnVtX3Blcl9jYW5kaWRhdGUBAAQMbmV3BEhzZXRfcHZmX3ZvdGluZ190dGwBAAQMbmV3BJBzZXRfbWluaW11bV92YWxpZGF0aW9uX3VwZ3JhZGVfZGVsYXkBAAQMbmV3BHBzZXRfYnlwYXNzX2NvbnNpc3RlbmN5X2NoZWNrAQAEDG5ldxRgc2V0X2FzeW5jX2JhY2tpbmdfcGFyYW1zAQAEDG5ld5UFTHNldF9leGVjdXRvcl9wYXJhbXMBAAQMbmV3pQVYc2V0X29uX2RlbWFuZF9iYXNlX2ZlZQEABAxuZXcIdHNldF9vbl9kZW1hbmRfZmVlX3ZhcmlhYmlsaXR5AQAEDG5ldwRwc2V0X29uX2RlbWFuZF9xdWV1ZV9tYXhfc2l6ZQEABAxuZXcEmHNldF9vbl9kZW1hbmRfdGFyZ2V0X3F1ZXVlX3V0aWxpemF0aW9uAQAEDG5ldwRkc2V0X21pbmltdW1fYmFja2luZ192b3RlcwEABAxuZXcEQHNldF9ub2RlX2ZlYXR1cmUBAAgUaW5kZXgEFHZhbHVlFGhzZXRfYXBwcm92YWxfdm90aW5nX3BhcmFtcwEABAxuZXcEUHNldF9zY2hlZHVsZXJfcGFyYW1zAQAEDG5ld6kFLFBhcmFzU2hhcmVkAQEFNFBhcmFJbmNsdXNpb24BAQUwUGFyYUluaGVyZW50AQIEFGVudGVyAQAEEGRhdGE9EBRQYXJhcwECMFhmb3JjZV9zZXRfY3VycmVudF9jb2RlAQAIEHBhcmEEIG5ld19jb2RlJFhmb3JjZV9zZXRfY3VycmVudF9oZWFkAQAIEHBhcmEEIG5ld19oZWFkJGxmb3JjZV9zY2hlZHVsZV9jb2RlX3VwZ3JhZGUBAAwQcGFyYQQgbmV3X2NvZGUkTHJlbGF5X3BhcmVudF9udW1iZXIETGZvcmNlX25vdGVfbmV3X2hlYWQBAAgQcGFyYQQgbmV3X2hlYWQkSGZvcmNlX3F1ZXVlX2FjdGlvbgEABBBwYXJhBGxhZGRfdHJ1c3RlZF92YWxpZGF0aW9uX2NvZGUBAAQ8dmFsaWRhdGlvbl9jb2RlJGxwb2tlX3VudXNlZF92YWxpZGF0aW9uX2NvZGUBAARQdmFsaWRhdGlvbl9jb2RlX2hhc2ggbGluY2x1ZGVfcHZmX2NoZWNrX3N0YXRlbWVudAEACBBzdG10BQYkc2lnbmF0dXJlQQJ0Zm9yY2Vfc2V0X21vc3RfcmVjZW50X2NvbnRleHQBAAgQcGFyYQQcY29udGV4dARccmVtb3ZlX3VwZ3JhZGVfY29vbGRvd24BAAQQcGFyYQSUYXV0aG9yaXplX2ZvcmNlX3NldF9jdXJyZW50X2NvZGVfaGFzaAEADBBwYXJhBDRuZXdfY29kZV9oYXNoIDB2YWxpZF9wZXJpb2QEnGFwcGx5X2F1dGhvcml6ZWRfZm9yY2Vfc2V0X2N1cnJlbnRfY29kZQEACBBwYXJhBCBuZXdfY29kZSQsSW5pdGlhbGl6ZXIBAgQ0Zm9yY2VfYXBwcm92ZQEABBR1cF90bwQQSHJtcAECLFhocm1wX2luaXRfb3Blbl9jaGFubmVsAQAMJHJlY2lwaWVudARUcHJvcG9zZWRfbWF4X2NhcGFjaXR5BGRwcm9wb3NlZF9tYXhfbWVzc2FnZV9zaXplBGBocm1wX2FjY2VwdF9vcGVuX2NoYW5uZWwBAAQYc2VuZGVyBEhocm1wX2Nsb3NlX2NoYW5uZWwBAAQoY2hhbm5lbF9pZFUCQGZvcmNlX2NsZWFuX2hybXABAAwQcGFyYQQsbnVtX2luYm91bmQEMG51bV9vdXRib3VuZARcZm9yY2VfcHJvY2Vzc19ocm1wX29wZW4BAAQgY2hhbm5lbHMEYGZvcmNlX3Byb2Nlc3NfaHJtcF9jbG9zZQEABCBjaGFubmVscwRgaHJtcF9jYW5jZWxfb3Blbl9yZXF1ZXN0AQAIKGNoYW5uZWxfaWRVAjRvcGVuX3JlcXVlc3RzBFxmb3JjZV9vcGVuX2hybXBfY2hhbm5lbAEAEBhzZW5kZXIEJHJlY2lwaWVudAQwbWF4X2NhcGFjaXR5BEBtYXhfbWVzc2FnZV9zaXplBGBlc3RhYmxpc2hfc3lzdGVtX2NoYW5uZWwBAAgYc2VuZGVyBCRyZWNpcGllbnQEVHBva2VfY2hhbm5lbF9kZXBvc2l0cwEACBhzZW5kZXIEJHJlY2lwaWVudAR0ZXN0YWJsaXNoX2NoYW5uZWxfd2l0aF9zeXN0ZW0BAARMdGFyZ2V0X3N5c3RlbV9jaGFpbgQ0UGFyYXNEaXNwdXRlcwECBDhmb3JjZV91bmZyZWV6ZQEBBTRQYXJhc1NsYXNoaW5nAQIEcHJlcG9ydF9kaXNwdXRlX2xvc3RfdW5zaWduZWQBAAg0ZGlzcHV0ZV9wcm9vZk0QPGtleV9vd25lcl9wcm9vZr0DaE9uRGVtYW5kQXNzaWdubWVudFByb3ZpZGVyAQIMXHBsYWNlX29yZGVyX2FsbG93X2RlYXRoAQAIKG1heF9hbW91bnQIHHBhcmFfaWQEWHBsYWNlX29yZGVyX2tlZXBfYWxpdmUBAAgobWF4X2Ftb3VudAgccGFyYV9pZARgcGxhY2Vfb3JkZXJfd2l0aF9jcmVkaXRzAQAIKG1heF9hbW91bnQIHHBhcmFfaWQEJFJlZ2lzdHJhcgECJCByZWdpc3RlcgEADAhpZAQwZ2VuZXNpc19oZWFkJDx2YWxpZGF0aW9uX2NvZGUkOGZvcmNlX3JlZ2lzdGVyAQAUDHdobwAcZGVwb3NpdAgIaWQEMGdlbmVzaXNfaGVhZCQ8dmFsaWRhdGlvbl9jb2RlJChkZXJlZ2lzdGVyAQAECGlkBBBzd2FwAQAICGlkBBRvdGhlcgQscmVtb3ZlX2xvY2sBAAQQcGFyYQQccmVzZXJ2ZQEBBSBhZGRfbG9jawEABBBwYXJhBFRzY2hlZHVsZV9jb2RlX3VwZ3JhZGUBAAgQcGFyYQQgbmV3X2NvZGUkQHNldF9jdXJyZW50X2hlYWQBAAgQcGFyYQQgbmV3X2hlYWQkFFNsb3RzAQIMLGZvcmNlX2xlYXNlAQAUEHBhcmEEGGxlYXNlcgAYYW1vdW50CDBwZXJpb2RfYmVnaW4EMHBlcmlvZF9jb3VudARAY2xlYXJfYWxsX2xlYXNlcwEABBBwYXJhBDx0cmlnZ2VyX29uYm9hcmQBAAQQcGFyYQRAUGFyYXNTdWRvV3JhcHBlcgECGHRzdWRvX3NjaGVkdWxlX3BhcmFfaW5pdGlhbGl6ZQEACAhpZAQcZ2VuZXNpcxUJaHN1ZG9fc2NoZWR1bGVfcGFyYV9jbGVhbnVwAQAECGlkBIBzdWRvX3NjaGVkdWxlX3BhcmF0aHJlYWRfdXBncmFkZQEABAhpZASEc3Vkb19zY2hlZHVsZV9wYXJhY2hhaW5fZG93bmdyYWRlAQAECGlkBFxzdWRvX3F1ZXVlX2Rvd253YXJkX3hjbQEACAhpZAQMeGNtWRBsc3Vkb19lc3RhYmxpc2hfaHJtcF9jaGFubmVsAQAQGHNlbmRlcgQkcmVjaXBpZW50BDBtYXhfY2FwYWNpdHkEQG1heF9tZXNzYWdlX3NpemUEIEF1Y3Rpb25zAQIMLG5ld19hdWN0aW9uAQAIIGR1cmF0aW9uBEhsZWFzZV9wZXJpb2RfaW5kZXgEDGJpZAEAFBBwYXJhBDRhdWN0aW9uX2luZGV4BChmaXJzdF9zbG90BCRsYXN0X3Nsb3QEGGFtb3VudAg4Y2FuY2VsX2F1Y3Rpb24BAQUkQ3Jvd2Rsb2FuAQIkGGNyZWF0ZQEAGBRpbmRleAQMY2FwCDBmaXJzdF9wZXJpb2QELGxhc3RfcGVyaW9kBAxlbmQEIHZlcmlmaWVyPQYoY29udHJpYnV0ZQEADBRpbmRleAQUdmFsdWUIJHNpZ25hdHVyZUUGIHdpdGhkcmF3AQAIDHdobwAUaW5kZXgEGHJlZnVuZAEABBRpbmRleAQgZGlzc29sdmUBAAQUaW5kZXgEEGVkaXQBABgUaW5kZXgEDGNhcAgwZmlyc3RfcGVyaW9kBCxsYXN0X3BlcmlvZAQMZW5kBCB2ZXJpZmllcj0GIGFkZF9tZW1vAQAIFGluZGV4BBBtZW1vJBBwb2tlAQAEFGluZGV4BDhjb250cmlidXRlX2FsbAEACBRpbmRleAQkc2lnbmF0dXJlRQY0QXNzaWduZWRTbG90cwECFGhhc3NpZ25fcGVybV9wYXJhY2hhaW5fc2xvdAEABAhpZARoYXNzaWduX3RlbXBfcGFyYWNoYWluX3Nsb3QBAAgIaWQESGxlYXNlX3BlcmlvZF9zdGFydGEQXHVuYXNzaWduX3BhcmFjaGFpbl9zbG90AQAECGlkBFxzZXRfbWF4X3Blcm1hbmVudF9zbG90cwEABBRzbG90cwRcc2V0X21heF90ZW1wb3Jhcnlfc2xvdHMBAAQUc2xvdHMEIENvcmV0aW1lAQIQSHJlcXVlc3RfY29yZV9jb3VudAEABBRjb3VudARIcmVxdWVzdF9yZXZlbnVlX2F0AQAEEHdoZW4EOGNyZWRpdF9hY2NvdW50AQAIDHdobwAYYW1vdW50CCxhc3NpZ25fY29yZQEAEBBjb3JlBBRiZWdpbgQoYXNzaWdubWVudFUGIGVuZF9oaW50LQQ8U3Rha2luZ0FoQ2xpZW50AQIMNHZhbGlkYXRvcl9zZXQBAAQYcmVwb3J0bRAgc2V0X21vZGUBAAQQbW9kZXEQWGZvcmNlX29uX21pZ3JhdGlvbl9lbmQBAQVQTXVsdGlCbG9ja01pZ3JhdGlvbnMBAhBAZm9yY2Vfc2V0X2N1cnNvcgEABBhjdXJzb3KBEFxmb3JjZV9zZXRfYWN0aXZlX2N1cnNvcgEADBRpbmRleAQwaW5uZXJfY3Vyc29yxQUoc3RhcnRlZF9hdC0ESGZvcmNlX29uYm9hcmRfbWJtcwEBBThjbGVhcl9oaXN0b3JpYwEABCBzZWxlY3RvcoUQJFhjbVBhbGxldAECRBBzZW5kAQAIEGRlc3SRDhxtZXNzYWdlWRA8dGVsZXBvcnRfYXNzZXRzAQAQEGRlc3SRDixiZW5lZmljaWFyeZEOGGFzc2V0cx0POGZlZV9hc3NldF9pdGVtBFxyZXNlcnZlX3RyYW5zZmVyX2Fzc2V0cwEAEBBkZXN0kQ4sYmVuZWZpY2lhcnmRDhhhc3NldHMdDzhmZWVfYXNzZXRfaXRlbQQcZXhlY3V0ZQEACBxtZXNzYWdlWRAobWF4X3dlaWdodBhEZm9yY2VfeGNtX3ZlcnNpb24BAAggbG9jYXRpb26JDhx2ZXJzaW9uBGRmb3JjZV9kZWZhdWx0X3hjbV92ZXJzaW9uAQAERG1heWJlX3hjbV92ZXJzaW9uLQR4Zm9yY2Vfc3Vic2NyaWJlX3ZlcnNpb25fbm90aWZ5AQAEIGxvY2F0aW9ukQ6AZm9yY2VfdW5zdWJzY3JpYmVfdmVyc2lvbl9ub3RpZnkBAAQgbG9jYXRpb26RDnxsaW1pdGVkX3Jlc2VydmVfdHJhbnNmZXJfYXNzZXRzAQAUEGRlc3SRDixiZW5lZmljaWFyeZEOGGFzc2V0cx0POGZlZV9hc3NldF9pdGVtBDB3ZWlnaHRfbGltaXTxAlxsaW1pdGVkX3RlbGVwb3J0X2Fzc2V0cwEAFBBkZXN0kQ4sYmVuZWZpY2lhcnmRDhhhc3NldHMdDzhmZWVfYXNzZXRfaXRlbQQwd2VpZ2h0X2xpbWl08QJAZm9yY2Vfc3VzcGVuc2lvbgEABCRzdXNwZW5kZWQUPHRyYW5zZmVyX2Fzc2V0cwEAFBBkZXN0kQ4sYmVuZWZpY2lhcnmRDhhhc3NldHMdDzhmZWVfYXNzZXRfaXRlbQQwd2VpZ2h0X2xpbWl08QIwY2xhaW1fYXNzZXRzAQAIGGFzc2V0cx0PLGJlbmVmaWNpYXJ5kQ6MdHJhbnNmZXJfYXNzZXRzX3VzaW5nX3R5cGVfYW5kX3RoZW4BABwQZGVzdJEOGGFzc2V0cx0PUGFzc2V0c190cmFuc2Zlcl90eXBljRA4cmVtb3RlX2ZlZXNfaWSREEhmZWVzX3RyYW5zZmVyX3R5cGWNEEhjdXN0b21feGNtX29uX2Rlc3RZEDB3ZWlnaHRfbGltaXTxAlBhZGRfYXV0aG9yaXplZF9hbGlhcwEACBxhbGlhc2VykQ4cZXhwaXJlc/UDXHJlbW92ZV9hdXRob3JpemVkX2FsaWFzAQAEHGFsaWFzZXKRDnRyZW1vdmVfYWxsX2F1dGhvcml6ZWRfYWxpYXNlcwEBBTBNZXNzYWdlUXVldWUBAggkcmVhcF9wYWdlAQAIOG1lc3NhZ2Vfb3JpZ2luJQMocGFnZV9pbmRleARIZXhlY3V0ZV9vdmVyd2VpZ2h0AQAQOG1lc3NhZ2Vfb3JpZ2luJQMQcGFnZQQUaW5kZXgEMHdlaWdodF9saW1pdBgkQXNzZXRSYXRlAQIMGGNyZWF0ZQEACChhc3NldF9raW5kjQ4QcmF0ZQgYdXBkYXRlAQAIKGFzc2V0X2tpbmSNDhByYXRlCBhyZW1vdmUBAAQoYXNzZXRfa2luZI0OLFJvb3RUZXN0aW5nAQIIKGZpbGxfYmxvY2sBAAQUcmF0aW8ERHRyaWdnZXJfZGVmZW5zaXZlAQEFGE1ldGFUeAECBCBkaXNwYXRjaAEABBxtZXRhX3R4sRAUQmVlZnkBAhxQcmVwb3J0X2RvdWJsZV92b3RpbmcBAAhIZXF1aXZvY2F0aW9uX3Byb29m1QY8a2V5X293bmVyX3Byb29mvQN0cmVwb3J0X2RvdWJsZV92b3RpbmdfdW5zaWduZWQBAAhIZXF1aXZvY2F0aW9uX3Byb29m1QY8a2V5X293bmVyX3Byb29mvQM8c2V0X25ld19nZW5lc2lzAQAEPGRlbGF5X2luX2Jsb2NrcwRIcmVwb3J0X2Zvcmtfdm90aW5nAQAISGVxdWl2b2NhdGlvbl9wcm9vZsUQPGtleV9vd25lcl9wcm9vZr0DbHJlcG9ydF9mb3JrX3ZvdGluZ191bnNpZ25lZAEACEhlcXVpdm9jYXRpb25fcHJvb2bFEDxrZXlfb3duZXJfcHJvb2a9A2hyZXBvcnRfZnV0dXJlX2Jsb2NrX3ZvdGluZwEACEhlcXVpdm9jYXRpb25fcHJvb2bRBjxrZXlfb3duZXJfcHJvb2a9A4xyZXBvcnRfZnV0dXJlX2Jsb2NrX3ZvdGluZ191bnNpZ25lZAEACEhlcXVpdm9jYXRpb25fcHJvb2bRBjxrZXlfb3duZXJfcHJvb2a9A0BJZGVudGl0eU1pZ3JhdG9yAQIINHJlYXBfaWRlbnRpdHkBAAQMd2hvADBwb2tlX2RlcG9zaXQBAAQMd2hvAATREAADCAT5DwTZEAAADChqdWRnZW1lbnRz3RAcZGVwb3NpdAgQaW5mb+0PAwgI3QMADBxhY2NvdW50AAxmZWUIGGZpZWxkcwgG6RAE7RAAAAgoYWNjb3VudF9pZAAoYWxsb2NhdGlvbgQCDChBbGxvY2F0aW9uAQEFQEF1dGhvcml0eURlcG9zaXQBAQMYU3lzdGVtAQEFAAgUb3duZXIAIHByb3ZpZGVy+RADDAAE+RAAFCBtYXliZV9pZBEBIHByaW9yaXR5BBBjYWxspQE4bWF5YmVfcGVyaW9kaWOBAxhvcmlnaW51DwYFEQQJEQAADCBkZWxlZ2F0ZQAocHJveHlfdHlwZTUOFGRlbGF5BAQREQADCBURCAAsFHRyYWNrBBhvcmlnaW51DyBwcm9wb3NhbKUBJGVuYWN0bWVudEEEJHN1Ym1pdHRlZARIc3VibWlzc2lvbl9kZXBvc2l03QdAZGVjaXNpb25fZGVwb3NpdOEHIGRlY2lkaW5n6QcUdGFsbHmpASBpbl9xdWV1ZRQUYWxhcm3xBwIYHE9uZ29pbmcBACwUdHJhY2sEGG9yaWdpbnUPIHByb3Bvc2FspQEkZW5hY3RtZW50QQQkc3VibWl0dGVkBEhzdWJtaXNzaW9uX2RlcG9zaXTdB0BkZWNpc2lvbl9kZXBvc2l04QcgZGVjaWRpbmfpBxR0YWxseakBIGluX3F1ZXVlFBRhbGFybfEHIEFwcHJvdmVkAQMMBOEH4QcgUmVqZWN0ZWQBAwwE4QfhByRDYW5jZWxsZWQBAwwE4QfhByBUaW1lZE91dAEDDAThB+EHGEtpbGxlZAEBAgAYKGFzc2V0X2tpbmSNDhhhbW91bnQILGJlbmVmaWNpYXJ5kQ4odmFsaWRfZnJvbQQkZXhwaXJlX2F0BBhzdGF0dXO5BwAIFGFnZW50ABhhbW91bnQIABAUcGF5ZWUAPHRvdGFsX2RlbGVnYXRlZAhUdW5jbGFpbWVkX3dpdGhkcmF3YWxzCDRwZW5kaW5nX3NsYXNoCAMIBEEJBDERAAAMMHJlbGF5X3BhcmVudCAoc3RhdGVfcm9vdCAsY2xhaW1fcXVldWU1EQQ5EQAACBhidWZmZXI9ETRsYXRlc3RfbnVtYmVyBAAkEGNvcmUEEGhhc2ggKGRlc2NyaXB0b3KhDixjb21taXRtZW50c8kFSGF2YWlsYWJpbGl0eV92b3Rlc7EFHGJhY2tlcnOxBUxyZWxheV9wYXJlbnRfbnVtYmVyBEBiYWNrZWRfaW5fbnVtYmVyBDRiYWNraW5nX2dyb3VwBARFEQADCKUOvQgETREAAAwcc2Vzc2lvbgSAYmFja2luZ192YWxpZGF0b3JzX3Blcl9jYW5kaWRhdGVRESBkaXNwdXRlc/kFBNEIAAMIBFkRBF0RAAAIJGNvZGVfaGFzaCAkZXhwaXJlX2F0BAAIEGtleXNRCRBraW5kSRAAFBxtYW5hZ2VyADBwZXJpb2RfYmVnaW4EMHBlcmlvZF9jb3VudAQobGFzdF9sZWFzZS0ELGxlYXNlX2NvdW50BAMIBN0DAAggcmVwb3J0ZXIFAjhzbGFzaF9mcmFjdGlvbgQDCAB1EQR5EQADCAR9EQSBEQAGkQ4CDAhWMwECGBBOdWxsAQEFGEFzc2V0cwEEEQMAPEV4ZWN1dGlvblJlc3VsdAEGpQIcVmVyc2lvbgEBAixQYWxsZXRzSW5mbwEErQIAOERpc3BhdGNoUmVzdWx0AQIMHFN1Y2Nlc3MBAQUURXJyb3IBBQA4VHJ1bmNhdGVkRXJyb3IBBQAIVjQBAhgQTnVsbAEBBRhBc3NldHMBBJ0CADxFeGVjdXRpb25SZXN1bHQBBqUCHFZlcnNpb24BAQIsUGFsbGV0c0luZm8BBK0CADhEaXNwYXRjaFJlc3VsdAECDBxTdWNjZXNzAQEFFEVycm9yAQUAOFRydW5jYXRlZEVycm9yAQUACFY1AQIYEE51bGwBAQUYQXNzZXRzAQTVDgA8RXhlY3V0aW9uUmVzdWx0AQbdDhxWZXJzaW9uAQECLFBhbGxldHNJbmZvAQStAgA4RGlzcGF0Y2hSZXN1bHQBAgwcU3VjY2VzcwEBBRRFcnJvcgEFADhUcnVuY2F0ZWRFcnJvcgEFAAIMHFBlbmRpbmcBABAkcmVzcG9uZGVykQ5MbWF5YmVfbWF0Y2hfcXVlcmllcokRMG1heWJlX25vdGlmea0JHHRpbWVvdXQEPFZlcnNpb25Ob3RpZmllcgEACBhvcmlnaW6RDiRpc19hY3RpdmUUFFJlYWR5AQAIIHJlc3BvbnNljREIYXQEAwgEkQ4DCJEOBASZEQADDAQAkRAAEBhhbW91bnQIFG93bmVykQ4YbG9ja2VykQ4kY29uc3VtZXJz1QkDCAiRDgSpEQAACCBsb2NhdGlvbpEOGGV4cGlyefUDBLERAAAEIGFsaWFzZXJztREACBhwcmVmaXhFARhzdWZmaXhFAQIMOE5vdEltcGxlbWVudGVkAQEFIE5vdEZvdW5kAQAIGHByZWZpeEUBGHN1ZmZpeEUBFENvZGVjAQEFByTBEQI0EENhbGwBAQUcUGF5bWVudAEBBRhGdXR1cmUBAQUUU3RhbGUBAQUgQmFkUHJvb2YBAQVEQW5jaWVudEJpcnRoQmxvY2sBAQVERXhoYXVzdHNSZXNvdXJjZXMBAQUYQ3VzdG9tAQECMEJhZE1hbmRhdG9yeQEBBUxNYW5kYXRvcnlWYWxpZGF0aW9uAQEFJEJhZFNpZ25lcgEBBVRJbmRldGVybWluYXRlSW1wbGljaXQBAQU0VW5rbm93bk9yaWdpbgEBBQIIHEludmFsaWQBAjQQQ2FsbAEBBRxQYXltZW50AQEFGEZ1dHVyZQEBBRRTdGFsZQEBBSBCYWRQcm9vZgEBBURBbmNpZW50QmlydGhCbG9jawEBBURFeGhhdXN0c1Jlc291cmNlcwEBBRhDdXN0b20BAQIwQmFkTWFuZGF0b3J5AQEFTE1hbmRhdG9yeVZhbGlkYXRpb24BAQUkQmFkU2lnbmVyAQEFVEluZGV0ZXJtaW5hdGVJbXBsaWNpdAEBBTRVbmtub3duT3JpZ2luAQEFHFVua25vd24BAgwwQ2Fubm90TG9va3VwAQEFTE5vVW5zaWduZWRWYWxpZGF0b3IBAQUYQ3VzdG9tAQECBxUOzREHLQrNEQAgUG5leHRfdXBfb25fYXZhaWxhYmxlQQo4b2NjdXBpZWRfc2luY2UELHRpbWVfb3V0X2F0BExuZXh0X3VwX29uX3RpbWVfb3V0QQowYXZhaWxhYmlsaXR5sQVEZ3JvdXBfcmVzcG9uc2libGUEOGNhbmRpZGF0ZV9oYXNoIFBjYW5kaWRhdGVfZGVzY3JpcHRvcqEOAgwgT2NjdXBpZWQBACBQbmV4dF91cF9vbl9hdmFpbGFibGVBCjhvY2N1cGllZF9zaW5jZQQsdGltZV9vdXRfYXQETG5leHRfdXBfb25fdGltZV9vdXRBCjBhdmFpbGFiaWxpdHmxBURncm91cF9yZXNwb25zaWJsZQQ4Y2FuZGlkYXRlX2hhc2ggUGNhbmRpZGF0ZV9kZXNjcmlwdG9yoQ4kU2NoZWR1bGVkAQAIHHBhcmFfaWQEIGNvbGxhdG9yEQEQRnJlZQEBBQTdEQAGMRACDDxDYW5kaWRhdGVCYWNrZWQBAxClDiQEBERDYW5kaWRhdGVJbmNsdWRlZAEDEKUOJAQERENhbmRpZGF0ZVRpbWVkT3V0AQMMpQ4kBATpEQAGVREAFDhjYW5kaWRhdGVfaGFzaCAoZGVzY3JpcHRvcqEOLGNvbW1pdG1lbnRzyQVMcmVsYXlfcGFyZW50X251bWJlcgQwbWF4X3Bvdl9zaXplBAT1EQAACCxjb25zdHJhaW50c6kKUHBlbmRpbmdfYXZhaWxhYmlsaXR5+REG/REEMRAAADxcbWluX3JlbGF5X3BhcmVudF9udW1iZXIEMG1heF9wb3Zfc2l6ZQQ0bWF4X2NvZGVfc2l6ZQRIbWF4X2hlYWRfZGF0YV9zaXplBDR1bXBfcmVtYWluaW5nBEx1bXBfcmVtYWluaW5nX2J5dGVzBGRtYXhfdW1wX251bV9wZXJfY2FuZGlkYXRlBFhkbXBfcmVtYWluaW5nX21lc3NhZ2VzOQIwaHJtcF9pbmJvdW5kOQJEaHJtcF9jaGFubmVsc19vdXSdCmhtYXhfaHJtcF9udW1fcGVyX2NhbmRpZGF0ZQQ8cmVxdWlyZWRfcGFyZW50JFB2YWxpZGF0aW9uX2NvZGVfaGFzaCBMdXBncmFkZV9yZXN0cmljdGlvbqEKWGZ1dHVyZV92YWxpZGF0aW9uX2NvZGWlCgYJEgAMEHZvdGXRBjhhbmNlc3RyeV9wcm9vZiQYaGVhZGVytQMEkRAABxUSDQsHHQ8NCwQ1DwAGWRAEWRAAAwiRDikSBC0SAAAQQGV4ZWN1dGlvbl9yZXN1bHRVDjhlbWl0dGVkX2V2ZW50cyESJGxvY2FsX3hjbSUSOGZvcndhcmRlZF94Y21zMRIHNRI5CwAMQGV4ZWN1dGlvbl9yZXN1bHTRDjhlbWl0dGVkX2V2ZW50cyESOGZvcndhcmRlZF94Y21zMRIHPRI5CwIMCFYzAQAICGlkfQEMZnVumQIIVjQBAAgIaWR5AQxmdW6ZAghWNQEACAhpZIkODGZ1bpkCAgh4VmVyc2lvbmVkQXNzZXRDb252ZXJzaW9uRmFpbGVkAQEFhFZlcnNpb25lZExvY2F0aW9uQ29udmVyc2lvbkZhaWxlZAEBBQcUSRI="; + metadataTypes_default = content; + } +}); + +// .papi/descriptors/src/dot_metadata.ts +var dot_metadata_exports = {}; +__export(dot_metadata_exports, { + default: () => dot_metadata_default +}); +var binMeta, dot_metadata_default; +var init_dot_metadata = __esm({ + ".papi/descriptors/src/dot_metadata.ts"() { + binMeta = "bWV0YQ8hDwAMHHNwX2NvcmUYY3J5cHRvLEFjY291bnRJZDMyAAAEAAQBIFt1ODsgMzJdAAAEAAADIAAAAAgACAAABQMADAgwZnJhbWVfc3lzdGVtLEFjY291bnRJbmZvCBROb25jZQEQLEFjY291bnREYXRhARQAFAEUbm9uY2UQARROb25jZQABJGNvbnN1bWVycxABIFJlZkNvdW50AAEkcHJvdmlkZXJzEAEgUmVmQ291bnQAASxzdWZmaWNpZW50cxABIFJlZkNvdW50AAEQZGF0YRQBLEFjY291bnREYXRhAAAQAAAFBQAUDDxwYWxsZXRfYmFsYW5jZXMUdHlwZXMsQWNjb3VudERhdGEEHEJhbGFuY2UBGAAQARBmcmVlGAEcQmFsYW5jZQABIHJlc2VydmVkGAEcQmFsYW5jZQABGGZyb3plbhgBHEJhbGFuY2UAARRmbGFncxwBKEV4dHJhRmxhZ3MAABgAAAUHABwMPHBhbGxldF9iYWxhbmNlcxR0eXBlcyhFeHRyYUZsYWdzAAAEABgBEHUxMjgAACAAAAUAACQMNGZyYW1lX3N1cHBvcnQgZGlzcGF0Y2hAUGVyRGlzcGF0Y2hDbGFzcwQEVAEoAAwBGG5vcm1hbCgBBFQAASxvcGVyYXRpb25hbCgBBFQAASRtYW5kYXRvcnkoAQRUAAAoDChzcF93ZWlnaHRzJHdlaWdodF92MhhXZWlnaHQAAAgBIHJlZl90aW1lLAEMdTY0AAEocHJvb2Zfc2l6ZSwBDHU2NAAALAAABjAAMAAABQYANAg8cHJpbWl0aXZlX3R5cGVzEEgyNTYAAAQABAEgW3U4OyAzMl0AADgAAAIIADwQKHNwX3J1bnRpbWUcZ2VuZXJpYxhkaWdlc3QYRGlnZXN0AAAEARBsb2dzQAE8VmVjPERpZ2VzdEl0ZW0+AABAAAACRABEEChzcF9ydW50aW1lHGdlbmVyaWMYZGlnZXN0KERpZ2VzdEl0ZW0AARQoUHJlUnVudGltZQgASAFEQ29uc2Vuc3VzRW5naW5lSWQAADgBHFZlYzx1OD4ABgAkQ29uc2Vuc3VzCABIAURDb25zZW5zdXNFbmdpbmVJZAAAOAEcVmVjPHU4PgAEABBTZWFsCABIAURDb25zZW5zdXNFbmdpbmVJZAAAOAEcVmVjPHU4PgAFABRPdGhlcgQAOAEcVmVjPHU4PgAAAGRSdW50aW1lRW52aXJvbm1lbnRVcGRhdGVkAAgAAEgAAAMEAAAACABMAAACUABQCDBmcmFtZV9zeXN0ZW0sRXZlbnRSZWNvcmQIBEUBVARUATQADAEUcGhhc2XFBwEUUGhhc2UAARRldmVudFQBBEUAARh0b3BpY3OVAQEYVmVjPFQ+AABUCEBwb2xrYWRvdF9ydW50aW1lMFJ1bnRpbWVFdmVudAABoBhTeXN0ZW0EAFgBcGZyYW1lX3N5c3RlbTo6RXZlbnQ8UnVudGltZT4AAAAkU2NoZWR1bGVyBAB8AYBwYWxsZXRfc2NoZWR1bGVyOjpFdmVudDxSdW50aW1lPgABACBQcmVpbWFnZQQAkAF8cGFsbGV0X3ByZWltYWdlOjpFdmVudDxSdW50aW1lPgAKABxJbmRpY2VzBACUAXhwYWxsZXRfaW5kaWNlczo6RXZlbnQ8UnVudGltZT4ABAAgQmFsYW5jZXMEAJgBfHBhbGxldF9iYWxhbmNlczo6RXZlbnQ8UnVudGltZT4ABQBIVHJhbnNhY3Rpb25QYXltZW50BACgAahwYWxsZXRfdHJhbnNhY3Rpb25fcGF5bWVudDo6RXZlbnQ8UnVudGltZT4AIAAcU3Rha2luZwQApAF4cGFsbGV0X3N0YWtpbmc6OkV2ZW50PFJ1bnRpbWU+AAcAIE9mZmVuY2VzBAC8AVhwYWxsZXRfb2ZmZW5jZXM6OkV2ZW50AAgAHFNlc3Npb24EAMQBVHBhbGxldF9zZXNzaW9uOjpFdmVudAAJABxHcmFuZHBhBADIAVRwYWxsZXRfZ3JhbmRwYTo6RXZlbnQACwAgVHJlYXN1cnkEANgBfHBhbGxldF90cmVhc3VyeTo6RXZlbnQ8UnVudGltZT4AEwBAQ29udmljdGlvblZvdGluZwQAZQEBoHBhbGxldF9jb252aWN0aW9uX3ZvdGluZzo6RXZlbnQ8UnVudGltZT4AFAAkUmVmZXJlbmRhBABpAQGAcGFsbGV0X3JlZmVyZW5kYTo6RXZlbnQ8UnVudGltZT4AFQAkV2hpdGVsaXN0BAAFBwGAcGFsbGV0X3doaXRlbGlzdDo6RXZlbnQ8UnVudGltZT4AFwAoUGFyYW1ldGVycwQAGQcBhHBhbGxldF9wYXJhbWV0ZXJzOjpFdmVudDxSdW50aW1lPgAbABhDbGFpbXMEADEHAVhjbGFpbXM6OkV2ZW50PFJ1bnRpbWU+ABgAHFZlc3RpbmcEADUHAXhwYWxsZXRfdmVzdGluZzo6RXZlbnQ8UnVudGltZT4AGQAcVXRpbGl0eQQAOQcBVHBhbGxldF91dGlsaXR5OjpFdmVudAAaABRQcm94eQQAPQcBcHBhbGxldF9wcm94eTo6RXZlbnQ8UnVudGltZT4AHQAgTXVsdGlzaWcEAEEHAXxwYWxsZXRfbXVsdGlzaWc6OkV2ZW50PFJ1bnRpbWU+AB4AIEJvdW50aWVzBABFBwF8cGFsbGV0X2JvdW50aWVzOjpFdmVudDxSdW50aW1lPgAiADRDaGlsZEJvdW50aWVzBABJBwGUcGFsbGV0X2NoaWxkX2JvdW50aWVzOjpFdmVudDxSdW50aW1lPgAmAGhFbGVjdGlvblByb3ZpZGVyTXVsdGlQaGFzZQQATQcB0HBhbGxldF9lbGVjdGlvbl9wcm92aWRlcl9tdWx0aV9waGFzZTo6RXZlbnQ8UnVudGltZT4AJAAkVm90ZXJMaXN0BABdBwH0cGFsbGV0X2JhZ3NfbGlzdDo6RXZlbnQ8UnVudGltZSwgcGFsbGV0X2JhZ3NfbGlzdDo6SW5zdGFuY2UxPgAlADxOb21pbmF0aW9uUG9vbHMEAGEHAZxwYWxsZXRfbm9taW5hdGlvbl9wb29sczo6RXZlbnQ8UnVudGltZT4AJwAsRmFzdFVuc3Rha2UEAGUHAYxwYWxsZXRfZmFzdF91bnN0YWtlOjpFdmVudDxSdW50aW1lPgAoADRQYXJhSW5jbHVzaW9uBABpBwGQcGFyYWNoYWluc19pbmNsdXNpb246OkV2ZW50PFJ1bnRpbWU+ADUAFFBhcmFzBAB5BwFccGFyYWNoYWluc19wYXJhczo6RXZlbnQAOAAQSHJtcAQAfQcBfHBhcmFjaGFpbnNfaHJtcDo6RXZlbnQ8UnVudGltZT4APAA0UGFyYXNEaXNwdXRlcwQAgQcBjHBhcmFjaGFpbnNfZGlzcHV0ZXM6OkV2ZW50PFJ1bnRpbWU+AD4AIE9uRGVtYW5kBACNBwG0cGFyYWNoYWluc19hc3NpZ25lcl9vbl9kZW1hbmQ6OkV2ZW50PFJ1bnRpbWU+AEAAJFJlZ2lzdHJhcgQAkQcBfHBhcmFzX3JlZ2lzdHJhcjo6RXZlbnQ8UnVudGltZT4ARgAUU2xvdHMEAJUHAVRzbG90czo6RXZlbnQ8UnVudGltZT4ARwAgQXVjdGlvbnMEAJkHAWBhdWN0aW9uczo6RXZlbnQ8UnVudGltZT4ASAAkQ3Jvd2Rsb2FuBACdBwFkY3Jvd2Rsb2FuOjpFdmVudDxSdW50aW1lPgBJACBDb3JldGltZQQAoQcBYGNvcmV0aW1lOjpFdmVudDxSdW50aW1lPgBKAEhTdGF0ZVRyaWVNaWdyYXRpb24EAKUHAaxwYWxsZXRfc3RhdGVfdHJpZV9taWdyYXRpb246OkV2ZW50PFJ1bnRpbWU+AGIAJFhjbVBhbGxldAQAsQcBaHBhbGxldF94Y206OkV2ZW50PFJ1bnRpbWU+AGMAME1lc3NhZ2VRdWV1ZQQAuQcBkHBhbGxldF9tZXNzYWdlX3F1ZXVlOjpFdmVudDxSdW50aW1lPgBkACRBc3NldFJhdGUEAMEHAYRwYWxsZXRfYXNzZXRfcmF0ZTo6RXZlbnQ8UnVudGltZT4AZQAAWAwwZnJhbWVfc3lzdGVtGHBhbGxldBRFdmVudAQEVAABHEBFeHRyaW5zaWNTdWNjZXNzBAE0ZGlzcGF0Y2hfaW5mb1wBMERpc3BhdGNoSW5mbwAABJBBbiBleHRyaW5zaWMgY29tcGxldGVkIHN1Y2Nlc3NmdWxseS48RXh0cmluc2ljRmFpbGVkCAE4ZGlzcGF0Y2hfZXJyb3JoATREaXNwYXRjaEVycm9yAAE0ZGlzcGF0Y2hfaW5mb1wBMERpc3BhdGNoSW5mbwABBFBBbiBleHRyaW5zaWMgZmFpbGVkLixDb2RlVXBkYXRlZAACBFBgOmNvZGVgIHdhcyB1cGRhdGVkLihOZXdBY2NvdW50BAEcYWNjb3VudAABMFQ6OkFjY291bnRJZAADBGhBIG5ldyBhY2NvdW50IHdhcyBjcmVhdGVkLjRLaWxsZWRBY2NvdW50BAEcYWNjb3VudAABMFQ6OkFjY291bnRJZAAEBFhBbiBhY2NvdW50IHdhcyByZWFwZWQuIFJlbWFya2VkCAEYc2VuZGVyAAEwVDo6QWNjb3VudElkAAEQaGFzaDQBHFQ6Okhhc2gABQRwT24gb24tY2hhaW4gcmVtYXJrIGhhcHBlbmVkLkRVcGdyYWRlQXV0aG9yaXplZAgBJGNvZGVfaGFzaDQBHFQ6Okhhc2gAATRjaGVja192ZXJzaW9uIAEQYm9vbAAGBGhBbiB1cGdyYWRlIHdhcyBhdXRob3JpemVkLgRwRXZlbnQgZm9yIHRoZSBTeXN0ZW0gcGFsbGV0LlwMNGZyYW1lX3N1cHBvcnQgZGlzcGF0Y2gwRGlzcGF0Y2hJbmZvAAAMARh3ZWlnaHQoARhXZWlnaHQAARRjbGFzc2ABNERpc3BhdGNoQ2xhc3MAASBwYXlzX2ZlZWQBEFBheXMAAGAMNGZyYW1lX3N1cHBvcnQgZGlzcGF0Y2g0RGlzcGF0Y2hDbGFzcwABDBhOb3JtYWwAAAAsT3BlcmF0aW9uYWwAAQAkTWFuZGF0b3J5AAIAAGQMNGZyYW1lX3N1cHBvcnQgZGlzcGF0Y2gQUGF5cwABCAxZZXMAAAAITm8AAQAAaAgoc3BfcnVudGltZTREaXNwYXRjaEVycm9yAAE4FE90aGVyAAAAMENhbm5vdExvb2t1cAABACRCYWRPcmlnaW4AAgAYTW9kdWxlBABsASxNb2R1bGVFcnJvcgADAERDb25zdW1lclJlbWFpbmluZwAEACxOb1Byb3ZpZGVycwAFAEBUb29NYW55Q29uc3VtZXJzAAYAFFRva2VuBABwAShUb2tlbkVycm9yAAcAKEFyaXRobWV0aWMEAHQBPEFyaXRobWV0aWNFcnJvcgAIADRUcmFuc2FjdGlvbmFsBAB4AUhUcmFuc2FjdGlvbmFsRXJyb3IACQAkRXhoYXVzdGVkAAoAKENvcnJ1cHRpb24ACwAsVW5hdmFpbGFibGUADAA4Um9vdE5vdEFsbG93ZWQADQAAbAgoc3BfcnVudGltZSxNb2R1bGVFcnJvcgAACAEUaW5kZXgIAQh1OAABFGVycm9ySAGMW3U4OyBNQVhfTU9EVUxFX0VSUk9SX0VOQ09ERURfU0laRV0AAHAIKHNwX3J1bnRpbWUoVG9rZW5FcnJvcgABKEBGdW5kc1VuYXZhaWxhYmxlAAAAME9ubHlQcm92aWRlcgABADBCZWxvd01pbmltdW0AAgAwQ2Fubm90Q3JlYXRlAAMAMFVua25vd25Bc3NldAAEABhGcm96ZW4ABQAsVW5zdXBwb3J0ZWQABgBAQ2Fubm90Q3JlYXRlSG9sZAAHADROb3RFeHBlbmRhYmxlAAgAHEJsb2NrZWQACQAAdAg0c3BfYXJpdGhtZXRpYzxBcml0aG1ldGljRXJyb3IAAQwkVW5kZXJmbG93AAAAIE92ZXJmbG93AAEAOERpdmlzaW9uQnlaZXJvAAIAAHgIKHNwX3J1bnRpbWVIVHJhbnNhY3Rpb25hbEVycm9yAAEIMExpbWl0UmVhY2hlZAAAABxOb0xheWVyAAEAAHwMQHBhbGxldF9zY2hlZHVsZXIYcGFsbGV0FEV2ZW50BARUAAEkJFNjaGVkdWxlZAgBEHdoZW4QAURCbG9ja051bWJlckZvcjxUPgABFGluZGV4EAEMdTMyAAAEUFNjaGVkdWxlZCBzb21lIHRhc2suIENhbmNlbGVkCAEQd2hlbhABREJsb2NrTnVtYmVyRm9yPFQ+AAEUaW5kZXgQAQx1MzIAAQRMQ2FuY2VsZWQgc29tZSB0YXNrLihEaXNwYXRjaGVkDAEQdGFza4ABeFRhc2tBZGRyZXNzPEJsb2NrTnVtYmVyRm9yPFQ+PgABCGlkhAFAT3B0aW9uPFRhc2tOYW1lPgABGHJlc3VsdIgBOERpc3BhdGNoUmVzdWx0AAIEVERpc3BhdGNoZWQgc29tZSB0YXNrLiBSZXRyeVNldBABEHRhc2uAAXhUYXNrQWRkcmVzczxCbG9ja051bWJlckZvcjxUPj4AAQhpZIQBQE9wdGlvbjxUYXNrTmFtZT4AARhwZXJpb2QQAURCbG9ja051bWJlckZvcjxUPgABHHJldHJpZXMIAQh1OAADBKBTZXQgYSByZXRyeSBjb25maWd1cmF0aW9uIGZvciBzb21lIHRhc2suOFJldHJ5Q2FuY2VsbGVkCAEQdGFza4ABeFRhc2tBZGRyZXNzPEJsb2NrTnVtYmVyRm9yPFQ+PgABCGlkhAFAT3B0aW9uPFRhc2tOYW1lPgAEBKxDYW5jZWwgYSByZXRyeSBjb25maWd1cmF0aW9uIGZvciBzb21lIHRhc2suPENhbGxVbmF2YWlsYWJsZQgBEHRhc2uAAXhUYXNrQWRkcmVzczxCbG9ja051bWJlckZvcjxUPj4AAQhpZIQBQE9wdGlvbjxUYXNrTmFtZT4ABQQpAVRoZSBjYWxsIGZvciB0aGUgcHJvdmlkZWQgaGFzaCB3YXMgbm90IGZvdW5kIHNvIHRoZSB0YXNrIGhhcyBiZWVuIGFib3J0ZWQuOFBlcmlvZGljRmFpbGVkCAEQdGFza4ABeFRhc2tBZGRyZXNzPEJsb2NrTnVtYmVyRm9yPFQ+PgABCGlkhAFAT3B0aW9uPFRhc2tOYW1lPgAGBD0BVGhlIGdpdmVuIHRhc2sgd2FzIHVuYWJsZSB0byBiZSByZW5ld2VkIHNpbmNlIHRoZSBhZ2VuZGEgaXMgZnVsbCBhdCB0aGF0IGJsb2NrLixSZXRyeUZhaWxlZAgBEHRhc2uAAXhUYXNrQWRkcmVzczxCbG9ja051bWJlckZvcjxUPj4AAQhpZIQBQE9wdGlvbjxUYXNrTmFtZT4ABwhdAVRoZSBnaXZlbiB0YXNrIHdhcyB1bmFibGUgdG8gYmUgcmV0cmllZCBzaW5jZSB0aGUgYWdlbmRhIGlzIGZ1bGwgYXQgdGhhdCBibG9jayBvciB0aGVyZZx3YXMgbm90IGVub3VnaCB3ZWlnaHQgdG8gcmVzY2hlZHVsZSBpdC5UUGVybWFuZW50bHlPdmVyd2VpZ2h0CAEQdGFza4ABeFRhc2tBZGRyZXNzPEJsb2NrTnVtYmVyRm9yPFQ+PgABCGlkhAFAT3B0aW9uPFRhc2tOYW1lPgAIBPBUaGUgZ2l2ZW4gdGFzayBjYW4gbmV2ZXIgYmUgZXhlY3V0ZWQgc2luY2UgaXQgaXMgb3ZlcndlaWdodC4EMEV2ZW50cyB0eXBlLoAAAAQIEBAAhAQYT3B0aW9uBARUAQQBCBBOb25lAAAAEFNvbWUEAAQAAAEAAIgEGFJlc3VsdAgEVAGMBEUBaAEICE9rBACMAAAAAAxFcnIEAGgAAAEAAIwAAAQAAJAMPHBhbGxldF9wcmVpbWFnZRhwYWxsZXQURXZlbnQEBFQAAQwUTm90ZWQEARBoYXNoNAEcVDo6SGFzaAAABGhBIHByZWltYWdlIGhhcyBiZWVuIG5vdGVkLiRSZXF1ZXN0ZWQEARBoYXNoNAEcVDo6SGFzaAABBHhBIHByZWltYWdlIGhhcyBiZWVuIHJlcXVlc3RlZC4cQ2xlYXJlZAQBEGhhc2g0ARxUOjpIYXNoAAIEbEEgcHJlaW1hZ2UgaGFzIGJlbiBjbGVhcmVkLgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldJQMOHBhbGxldF9pbmRpY2VzGHBhbGxldBRFdmVudAQEVAABDDRJbmRleEFzc2lnbmVkCAEMd2hvAAEwVDo6QWNjb3VudElkAAEUaW5kZXgQATxUOjpBY2NvdW50SW5kZXgAAAR0QSBhY2NvdW50IGluZGV4IHdhcyBhc3NpZ25lZC4oSW5kZXhGcmVlZAQBFGluZGV4EAE8VDo6QWNjb3VudEluZGV4AAEEvEEgYWNjb3VudCBpbmRleCBoYXMgYmVlbiBmcmVlZCB1cCAodW5hc3NpZ25lZCkuLEluZGV4RnJvemVuCAEUaW5kZXgQATxUOjpBY2NvdW50SW5kZXgAAQx3aG8AATBUOjpBY2NvdW50SWQAAgToQSBhY2NvdW50IGluZGV4IGhhcyBiZWVuIGZyb3plbiB0byBpdHMgY3VycmVudCBhY2NvdW50IElELgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldJgMPHBhbGxldF9iYWxhbmNlcxhwYWxsZXQURXZlbnQIBFQABEkAAVgcRW5kb3dlZAgBHGFjY291bnQAATBUOjpBY2NvdW50SWQAATBmcmVlX2JhbGFuY2UYAShUOjpCYWxhbmNlAAAEuEFuIGFjY291bnQgd2FzIGNyZWF0ZWQgd2l0aCBzb21lIGZyZWUgYmFsYW5jZS4gRHVzdExvc3QIARxhY2NvdW50AAEwVDo6QWNjb3VudElkAAEYYW1vdW50GAEoVDo6QmFsYW5jZQABCD0BQW4gYWNjb3VudCB3YXMgcmVtb3ZlZCB3aG9zZSBiYWxhbmNlIHdhcyBub24temVybyBidXQgYmVsb3cgRXhpc3RlbnRpYWxEZXBvc2l0LHhyZXN1bHRpbmcgaW4gYW4gb3V0cmlnaHQgbG9zcy4gVHJhbnNmZXIMARBmcm9tAAEwVDo6QWNjb3VudElkAAEIdG8AATBUOjpBY2NvdW50SWQAARhhbW91bnQYAShUOjpCYWxhbmNlAAIETFRyYW5zZmVyIHN1Y2NlZWRlZC4oQmFsYW5jZVNldAgBDHdobwABMFQ6OkFjY291bnRJZAABEGZyZWUYAShUOjpCYWxhbmNlAAMEaEEgYmFsYW5jZSB3YXMgc2V0IGJ5IHJvb3QuIFJlc2VydmVkCAEMd2hvAAEwVDo6QWNjb3VudElkAAEYYW1vdW50GAEoVDo6QmFsYW5jZQAEBOBTb21lIGJhbGFuY2Ugd2FzIHJlc2VydmVkIChtb3ZlZCBmcm9tIGZyZWUgdG8gcmVzZXJ2ZWQpLihVbnJlc2VydmVkCAEMd2hvAAEwVDo6QWNjb3VudElkAAEYYW1vdW50GAEoVDo6QmFsYW5jZQAFBOhTb21lIGJhbGFuY2Ugd2FzIHVucmVzZXJ2ZWQgKG1vdmVkIGZyb20gcmVzZXJ2ZWQgdG8gZnJlZSkuSFJlc2VydmVSZXBhdHJpYXRlZBABEGZyb20AATBUOjpBY2NvdW50SWQAAQh0bwABMFQ6OkFjY291bnRJZAABGGFtb3VudBgBKFQ6OkJhbGFuY2UAAUhkZXN0aW5hdGlvbl9zdGF0dXOcARhTdGF0dXMABghNAVNvbWUgYmFsYW5jZSB3YXMgbW92ZWQgZnJvbSB0aGUgcmVzZXJ2ZSBvZiB0aGUgZmlyc3QgYWNjb3VudCB0byB0aGUgc2Vjb25kIGFjY291bnQu2EZpbmFsIGFyZ3VtZW50IGluZGljYXRlcyB0aGUgZGVzdGluYXRpb24gYmFsYW5jZSB0eXBlLhxEZXBvc2l0CAEMd2hvAAEwVDo6QWNjb3VudElkAAEYYW1vdW50GAEoVDo6QmFsYW5jZQAHBNhTb21lIGFtb3VudCB3YXMgZGVwb3NpdGVkIChlLmcuIGZvciB0cmFuc2FjdGlvbiBmZWVzKS4gV2l0aGRyYXcIAQx3aG8AATBUOjpBY2NvdW50SWQAARhhbW91bnQYAShUOjpCYWxhbmNlAAgEHQFTb21lIGFtb3VudCB3YXMgd2l0aGRyYXduIGZyb20gdGhlIGFjY291bnQgKGUuZy4gZm9yIHRyYW5zYWN0aW9uIGZlZXMpLhxTbGFzaGVkCAEMd2hvAAEwVDo6QWNjb3VudElkAAEYYW1vdW50GAEoVDo6QmFsYW5jZQAJBAEBU29tZSBhbW91bnQgd2FzIHJlbW92ZWQgZnJvbSB0aGUgYWNjb3VudCAoZS5nLiBmb3IgbWlzYmVoYXZpb3IpLhhNaW50ZWQIAQx3aG8AATBUOjpBY2NvdW50SWQAARhhbW91bnQYAShUOjpCYWxhbmNlAAoEnFNvbWUgYW1vdW50IHdhcyBtaW50ZWQgaW50byBhbiBhY2NvdW50LhhCdXJuZWQIAQx3aG8AATBUOjpBY2NvdW50SWQAARhhbW91bnQYAShUOjpCYWxhbmNlAAsEnFNvbWUgYW1vdW50IHdhcyBidXJuZWQgZnJvbSBhbiBhY2NvdW50LiRTdXNwZW5kZWQIAQx3aG8AATBUOjpBY2NvdW50SWQAARhhbW91bnQYAShUOjpCYWxhbmNlAAwEFQFTb21lIGFtb3VudCB3YXMgc3VzcGVuZGVkIGZyb20gYW4gYWNjb3VudCAoaXQgY2FuIGJlIHJlc3RvcmVkIGxhdGVyKS4gUmVzdG9yZWQIAQx3aG8AATBUOjpBY2NvdW50SWQAARhhbW91bnQYAShUOjpCYWxhbmNlAA0EpFNvbWUgYW1vdW50IHdhcyByZXN0b3JlZCBpbnRvIGFuIGFjY291bnQuIFVwZ3JhZGVkBAEMd2hvAAEwVDo6QWNjb3VudElkAA4EYEFuIGFjY291bnQgd2FzIHVwZ3JhZGVkLhhJc3N1ZWQEARhhbW91bnQYAShUOjpCYWxhbmNlAA8ELQFUb3RhbCBpc3N1YW5jZSB3YXMgaW5jcmVhc2VkIGJ5IGBhbW91bnRgLCBjcmVhdGluZyBhIGNyZWRpdCB0byBiZSBiYWxhbmNlZC4kUmVzY2luZGVkBAEYYW1vdW50GAEoVDo6QmFsYW5jZQAQBCUBVG90YWwgaXNzdWFuY2Ugd2FzIGRlY3JlYXNlZCBieSBgYW1vdW50YCwgY3JlYXRpbmcgYSBkZWJ0IHRvIGJlIGJhbGFuY2VkLhhMb2NrZWQIAQx3aG8AATBUOjpBY2NvdW50SWQAARhhbW91bnQYAShUOjpCYWxhbmNlABEEYFNvbWUgYmFsYW5jZSB3YXMgbG9ja2VkLiBVbmxvY2tlZAgBDHdobwABMFQ6OkFjY291bnRJZAABGGFtb3VudBgBKFQ6OkJhbGFuY2UAEgRoU29tZSBiYWxhbmNlIHdhcyB1bmxvY2tlZC4YRnJvemVuCAEMd2hvAAEwVDo6QWNjb3VudElkAAEYYW1vdW50GAEoVDo6QmFsYW5jZQATBGBTb21lIGJhbGFuY2Ugd2FzIGZyb3plbi4YVGhhd2VkCAEMd2hvAAEwVDo6QWNjb3VudElkAAEYYW1vdW50GAEoVDo6QmFsYW5jZQAUBGBTb21lIGJhbGFuY2Ugd2FzIHRoYXdlZC5MVG90YWxJc3N1YW5jZUZvcmNlZAgBDG9sZBgBKFQ6OkJhbGFuY2UAAQxuZXcYAShUOjpCYWxhbmNlABUErFRoZSBgVG90YWxJc3N1YW5jZWAgd2FzIGZvcmNlZnVsbHkgY2hhbmdlZC4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXScFDRmcmFtZV9zdXBwb3J0GHRyYWl0cxh0b2tlbnMQbWlzYzRCYWxhbmNlU3RhdHVzAAEIEEZyZWUAAAAgUmVzZXJ2ZWQAAQAAoAxocGFsbGV0X3RyYW5zYWN0aW9uX3BheW1lbnQYcGFsbGV0FEV2ZW50BARUAAEESFRyYW5zYWN0aW9uRmVlUGFpZAwBDHdobwABMFQ6OkFjY291bnRJZAABKGFjdHVhbF9mZWUYATBCYWxhbmNlT2Y8VD4AAQx0aXAYATBCYWxhbmNlT2Y8VD4AAAhZAUEgdHJhbnNhY3Rpb24gZmVlIGBhY3R1YWxfZmVlYCwgb2Ygd2hpY2ggYHRpcGAgd2FzIGFkZGVkIHRvIHRoZSBtaW5pbXVtIGluY2x1c2lvbiBmZWUsXGhhcyBiZWVuIHBhaWQgYnkgYHdob2AuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0pBA4cGFsbGV0X3N0YWtpbmcYcGFsbGV0GHBhbGxldBRFdmVudAQEVAABSBxFcmFQYWlkDAEkZXJhX2luZGV4EAEgRXJhSW5kZXgAAUB2YWxpZGF0b3JfcGF5b3V0GAEwQmFsYW5jZU9mPFQ+AAEkcmVtYWluZGVyGAEwQmFsYW5jZU9mPFQ+AAAIVQFUaGUgZXJhIHBheW91dCBoYXMgYmVlbiBzZXQ7IHRoZSBmaXJzdCBiYWxhbmNlIGlzIHRoZSB2YWxpZGF0b3ItcGF5b3V0OyB0aGUgc2Vjb25kIGlzwHRoZSByZW1haW5kZXIgZnJvbSB0aGUgbWF4aW11bSBhbW91bnQgb2YgcmV3YXJkLiBSZXdhcmRlZAwBFHN0YXNoAAEwVDo6QWNjb3VudElkAAEQZGVzdKgBfFJld2FyZERlc3RpbmF0aW9uPFQ6OkFjY291bnRJZD4AARhhbW91bnQYATBCYWxhbmNlT2Y8VD4AAQQNAVRoZSBub21pbmF0b3IgaGFzIGJlZW4gcmV3YXJkZWQgYnkgdGhpcyBhbW91bnQgdG8gdGhpcyBkZXN0aW5hdGlvbi4cU2xhc2hlZAgBGHN0YWtlcgABMFQ6OkFjY291bnRJZAABGGFtb3VudBgBMEJhbGFuY2VPZjxUPgACBB0BQSBzdGFrZXIgKHZhbGlkYXRvciBvciBub21pbmF0b3IpIGhhcyBiZWVuIHNsYXNoZWQgYnkgdGhlIGdpdmVuIGFtb3VudC40U2xhc2hSZXBvcnRlZAwBJHZhbGlkYXRvcgABMFQ6OkFjY291bnRJZAABIGZyYWN0aW9urAEcUGVyYmlsbAABJHNsYXNoX2VyYRABIEVyYUluZGV4AAMIWQFBIHNsYXNoIGZvciB0aGUgZ2l2ZW4gdmFsaWRhdG9yLCBmb3IgdGhlIGdpdmVuIHBlcmNlbnRhZ2Ugb2YgdGhlaXIgc3Rha2UsIGF0IHRoZSBnaXZlblRlcmEgYXMgYmVlbiByZXBvcnRlZC5oT2xkU2xhc2hpbmdSZXBvcnREaXNjYXJkZWQEATRzZXNzaW9uX2luZGV4EAEwU2Vzc2lvbkluZGV4AAQIGQFBbiBvbGQgc2xhc2hpbmcgcmVwb3J0IGZyb20gYSBwcmlvciBlcmEgd2FzIGRpc2NhcmRlZCBiZWNhdXNlIGl0IGNvdWxkRG5vdCBiZSBwcm9jZXNzZWQuOFN0YWtlcnNFbGVjdGVkAAUEhEEgbmV3IHNldCBvZiBzdGFrZXJzIHdhcyBlbGVjdGVkLhhCb25kZWQIARRzdGFzaAABMFQ6OkFjY291bnRJZAABGGFtb3VudBgBMEJhbGFuY2VPZjxUPgAGENBBbiBhY2NvdW50IGhhcyBib25kZWQgdGhpcyBhbW91bnQuIFxbc3Rhc2gsIGFtb3VudFxdAE0BTk9URTogVGhpcyBldmVudCBpcyBvbmx5IGVtaXR0ZWQgd2hlbiBmdW5kcyBhcmUgYm9uZGVkIHZpYSBhIGRpc3BhdGNoYWJsZS4gTm90YWJseSwhAWl0IHdpbGwgbm90IGJlIGVtaXR0ZWQgZm9yIHN0YWtpbmcgcmV3YXJkcyB3aGVuIHRoZXkgYXJlIGFkZGVkIHRvIHN0YWtlLiBVbmJvbmRlZAgBFHN0YXNoAAEwVDo6QWNjb3VudElkAAEYYW1vdW50GAEwQmFsYW5jZU9mPFQ+AAcEkEFuIGFjY291bnQgaGFzIHVuYm9uZGVkIHRoaXMgYW1vdW50LiRXaXRoZHJhd24IARRzdGFzaAABMFQ6OkFjY291bnRJZAABGGFtb3VudBgBMEJhbGFuY2VPZjxUPgAICFkBQW4gYWNjb3VudCBoYXMgY2FsbGVkIGB3aXRoZHJhd191bmJvbmRlZGAgYW5kIHJlbW92ZWQgdW5ib25kaW5nIGNodW5rcyB3b3J0aCBgQmFsYW5jZWBkZnJvbSB0aGUgdW5sb2NraW5nIHF1ZXVlLhhLaWNrZWQIASRub21pbmF0b3IAATBUOjpBY2NvdW50SWQAARRzdGFzaAABMFQ6OkFjY291bnRJZAAJBLRBIG5vbWluYXRvciBoYXMgYmVlbiBraWNrZWQgZnJvbSBhIHZhbGlkYXRvci5UU3Rha2luZ0VsZWN0aW9uRmFpbGVkAAoErFRoZSBlbGVjdGlvbiBmYWlsZWQuIE5vIG5ldyBlcmEgaXMgcGxhbm5lZC4cQ2hpbGxlZAQBFHN0YXNoAAEwVDo6QWNjb3VudElkAAsEIQFBbiBhY2NvdW50IGhhcyBzdG9wcGVkIHBhcnRpY2lwYXRpbmcgYXMgZWl0aGVyIGEgdmFsaWRhdG9yIG9yIG5vbWluYXRvci40UGF5b3V0U3RhcnRlZAgBJGVyYV9pbmRleBABIEVyYUluZGV4AAE8dmFsaWRhdG9yX3N0YXNoAAEwVDo6QWNjb3VudElkAAwEmFRoZSBzdGFrZXJzJyByZXdhcmRzIGFyZSBnZXR0aW5nIHBhaWQuRFZhbGlkYXRvclByZWZzU2V0CAEUc3Rhc2gAATBUOjpBY2NvdW50SWQAARRwcmVmc7ABOFZhbGlkYXRvclByZWZzAA0EmEEgdmFsaWRhdG9yIGhhcyBzZXQgdGhlaXIgcHJlZmVyZW5jZXMuaFNuYXBzaG90Vm90ZXJzU2l6ZUV4Y2VlZGVkBAEQc2l6ZRABDHUzMgAOBGhWb3RlcnMgc2l6ZSBsaW1pdCByZWFjaGVkLmxTbmFwc2hvdFRhcmdldHNTaXplRXhjZWVkZWQEARBzaXplEAEMdTMyAA8EbFRhcmdldHMgc2l6ZSBsaW1pdCByZWFjaGVkLiBGb3JjZUVyYQQBEG1vZGW4ARxGb3JjaW5nABAEdEEgbmV3IGZvcmNlIGVyYSBtb2RlIHdhcyBzZXQuZENvbnRyb2xsZXJCYXRjaERlcHJlY2F0ZWQEASBmYWlsdXJlcxABDHUzMgARBKRSZXBvcnQgb2YgYSBjb250cm9sbGVyIGJhdGNoIGRlcHJlY2F0aW9uLgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldKgIOHBhbGxldF9zdGFraW5nRFJld2FyZERlc3RpbmF0aW9uBCRBY2NvdW50SWQBAAEUGFN0YWtlZAAAABRTdGFzaAABAChDb250cm9sbGVyAAIAHEFjY291bnQEAAABJEFjY291bnRJZAADABBOb25lAAQAAKwMNHNwX2FyaXRobWV0aWMocGVyX3RoaW5ncxxQZXJiaWxsAAAEABABDHUzMgAAsAg4cGFsbGV0X3N0YWtpbmc4VmFsaWRhdG9yUHJlZnMAAAgBKGNvbW1pc3Npb260ARxQZXJiaWxsAAEcYmxvY2tlZCABEGJvb2wAALQAAAasALgIOHBhbGxldF9zdGFraW5nHEZvcmNpbmcAARAoTm90Rm9yY2luZwAAACBGb3JjZU5ldwABACRGb3JjZU5vbmUAAgAsRm9yY2VBbHdheXMAAwAAvAw8cGFsbGV0X29mZmVuY2VzGHBhbGxldBRFdmVudAABBBxPZmZlbmNlCAEQa2luZMABEEtpbmQAASB0aW1lc2xvdDgBOE9wYXF1ZVRpbWVTbG90AAAMUQFUaGVyZSBpcyBhbiBvZmZlbmNlIHJlcG9ydGVkIG9mIHRoZSBnaXZlbiBga2luZGAgaGFwcGVuZWQgYXQgdGhlIGBzZXNzaW9uX2luZGV4YCBhbmQ1AShraW5kLXNwZWNpZmljKSB0aW1lIHNsb3QuIFRoaXMgZXZlbnQgaXMgbm90IGRlcG9zaXRlZCBmb3IgZHVwbGljYXRlIHNsYXNoZXMuTFxba2luZCwgdGltZXNsb3RcXS4EMEV2ZW50cyB0eXBlLsAAAAMQAAAACADEDDhwYWxsZXRfc2Vzc2lvbhhwYWxsZXQURXZlbnQAAQQoTmV3U2Vzc2lvbgQBNHNlc3Npb25faW5kZXgQATBTZXNzaW9uSW5kZXgAAAg5AU5ldyBzZXNzaW9uIGhhcyBoYXBwZW5lZC4gTm90ZSB0aGF0IHRoZSBhcmd1bWVudCBpcyB0aGUgc2Vzc2lvbiBpbmRleCwgbm90IHRoZZxibG9jayBudW1iZXIgYXMgdGhlIHR5cGUgbWlnaHQgc3VnZ2VzdC4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXTIDDhwYWxsZXRfZ3JhbmRwYRhwYWxsZXQURXZlbnQAAQw4TmV3QXV0aG9yaXRpZXMEATRhdXRob3JpdHlfc2V0zAE0QXV0aG9yaXR5TGlzdAAABIxOZXcgYXV0aG9yaXR5IHNldCBoYXMgYmVlbiBhcHBsaWVkLhhQYXVzZWQAAQSYQ3VycmVudCBhdXRob3JpdHkgc2V0IGhhcyBiZWVuIHBhdXNlZC4cUmVzdW1lZAACBJxDdXJyZW50IGF1dGhvcml0eSBzZXQgaGFzIGJlZW4gcmVzdW1lZC4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXTMAAAC0ADQAAAECNQwANQMUHNwX2NvbnNlbnN1c19ncmFuZHBhDGFwcBhQdWJsaWMAAAQABAE8ZWQyNTUxOTo6UHVibGljAADYDDxwYWxsZXRfdHJlYXN1cnkYcGFsbGV0FEV2ZW50CARUAARJAAEwIFNwZW5kaW5nBAFAYnVkZ2V0X3JlbWFpbmluZxgBPEJhbGFuY2VPZjxULCBJPgAABORXZSBoYXZlIGVuZGVkIGEgc3BlbmQgcGVyaW9kIGFuZCB3aWxsIG5vdyBhbGxvY2F0ZSBmdW5kcy4cQXdhcmRlZAwBOHByb3Bvc2FsX2luZGV4EAE0UHJvcG9zYWxJbmRleAABFGF3YXJkGAE8QmFsYW5jZU9mPFQsIEk+AAEcYWNjb3VudAABMFQ6OkFjY291bnRJZAABBHxTb21lIGZ1bmRzIGhhdmUgYmVlbiBhbGxvY2F0ZWQuFEJ1cm50BAEsYnVybnRfZnVuZHMYATxCYWxhbmNlT2Y8VCwgST4AAgSIU29tZSBvZiBvdXIgZnVuZHMgaGF2ZSBiZWVuIGJ1cm50LiBSb2xsb3ZlcgQBQHJvbGxvdmVyX2JhbGFuY2UYATxCYWxhbmNlT2Y8VCwgST4AAwQtAVNwZW5kaW5nIGhhcyBmaW5pc2hlZDsgdGhpcyBpcyB0aGUgYW1vdW50IHRoYXQgcm9sbHMgb3ZlciB1bnRpbCBuZXh0IHNwZW5kLhxEZXBvc2l0BAEUdmFsdWUYATxCYWxhbmNlT2Y8VCwgST4ABAR8U29tZSBmdW5kcyBoYXZlIGJlZW4gZGVwb3NpdGVkLjRTcGVuZEFwcHJvdmVkDAE4cHJvcG9zYWxfaW5kZXgQATRQcm9wb3NhbEluZGV4AAEYYW1vdW50GAE8QmFsYW5jZU9mPFQsIEk+AAEsYmVuZWZpY2lhcnkAATBUOjpBY2NvdW50SWQABQScQSBuZXcgc3BlbmQgcHJvcG9zYWwgaGFzIGJlZW4gYXBwcm92ZWQuPFVwZGF0ZWRJbmFjdGl2ZQgBLHJlYWN0aXZhdGVkGAE8QmFsYW5jZU9mPFQsIEk+AAEsZGVhY3RpdmF0ZWQYATxCYWxhbmNlT2Y8VCwgST4ABgTMVGhlIGluYWN0aXZlIGZ1bmRzIG9mIHRoZSBwYWxsZXQgaGF2ZSBiZWVuIHVwZGF0ZWQuSEFzc2V0U3BlbmRBcHByb3ZlZBgBFGluZGV4EAEoU3BlbmRJbmRleAABKGFzc2V0X2tpbmTcATBUOjpBc3NldEtpbmQAARhhbW91bnQYAVBBc3NldEJhbGFuY2VPZjxULCBJPgABLGJlbmVmaWNpYXJ5RQEBOFQ6OkJlbmVmaWNpYXJ5AAEodmFsaWRfZnJvbRABREJsb2NrTnVtYmVyRm9yPFQ+AAEkZXhwaXJlX2F0EAFEQmxvY2tOdW1iZXJGb3I8VD4ABwS0QSBuZXcgYXNzZXQgc3BlbmQgcHJvcG9zYWwgaGFzIGJlZW4gYXBwcm92ZWQuQEFzc2V0U3BlbmRWb2lkZWQEARRpbmRleBABKFNwZW5kSW5kZXgACAR0QW4gYXBwcm92ZWQgc3BlbmQgd2FzIHZvaWRlZC4QUGFpZAgBFGluZGV4EAEoU3BlbmRJbmRleAABKHBheW1lbnRfaWQwAWQ8VDo6UGF5bWFzdGVyIGFzIFBheT46OklkAAkETEEgcGF5bWVudCBoYXBwZW5lZC40UGF5bWVudEZhaWxlZAgBFGluZGV4EAEoU3BlbmRJbmRleAABKHBheW1lbnRfaWQwAWQ8VDo6UGF5bWFzdGVyIGFzIFBheT46OklkAAoEkEEgcGF5bWVudCBmYWlsZWQgYW5kIGNhbiBiZSByZXRyaWVkLjhTcGVuZFByb2Nlc3NlZAQBFGluZGV4EAEoU3BlbmRJbmRleAALCE0BQSBzcGVuZCB3YXMgcHJvY2Vzc2VkIGFuZCByZW1vdmVkIGZyb20gdGhlIHN0b3JhZ2UuIEl0IG1pZ2h0IGhhdmUgYmVlbiBzdWNjZXNzZnVsbHlwcGFpZCBvciBpdCBtYXkgaGF2ZSBleHBpcmVkLgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldNwMXHBvbGthZG90X3J1bnRpbWVfY29tbW9uFGltcGxzXFZlcnNpb25lZExvY2F0YWJsZUFzc2V0AAEICFYzCAEgbG9jYXRpb27gAUR4Y206OnYzOjpMb2NhdGlvbgABIGFzc2V0X2lkCQEBQHhjbTo6djM6OkFzc2V0SWQAAwAIVjQIASBsb2NhdGlvbg0BAUR4Y206OnY0OjpMb2NhdGlvbgABIGFzc2V0X2lkQQEBQHhjbTo6djQ6OkFzc2V0SWQABAAA4BAsc3RhZ2luZ194Y20IdjM0bXVsdGlsb2NhdGlvbjRNdWx0aUxvY2F0aW9uAAAIARxwYXJlbnRzCAEIdTgAASBpbnRlcmlvcuQBJEp1bmN0aW9ucwAA5BAMeGNtCHYzJGp1bmN0aW9ucyRKdW5jdGlvbnMAASQQSGVyZQAAAAhYMQQA6AEgSnVuY3Rpb24AAQAIWDIIAOgBIEp1bmN0aW9uAADoASBKdW5jdGlvbgACAAhYMwwA6AEgSnVuY3Rpb24AAOgBIEp1bmN0aW9uAADoASBKdW5jdGlvbgADAAhYNBAA6AEgSnVuY3Rpb24AAOgBIEp1bmN0aW9uAADoASBKdW5jdGlvbgAA6AEgSnVuY3Rpb24ABAAIWDUUAOgBIEp1bmN0aW9uAADoASBKdW5jdGlvbgAA6AEgSnVuY3Rpb24AAOgBIEp1bmN0aW9uAADoASBKdW5jdGlvbgAFAAhYNhgA6AEgSnVuY3Rpb24AAOgBIEp1bmN0aW9uAADoASBKdW5jdGlvbgAA6AEgSnVuY3Rpb24AAOgBIEp1bmN0aW9uAADoASBKdW5jdGlvbgAGAAhYNxwA6AEgSnVuY3Rpb24AAOgBIEp1bmN0aW9uAADoASBKdW5jdGlvbgAA6AEgSnVuY3Rpb24AAOgBIEp1bmN0aW9uAADoASBKdW5jdGlvbgAA6AEgSnVuY3Rpb24ABwAIWDggAOgBIEp1bmN0aW9uAADoASBKdW5jdGlvbgAA6AEgSnVuY3Rpb24AAOgBIEp1bmN0aW9uAADoASBKdW5jdGlvbgAA6AEgSnVuY3Rpb24AAOgBIEp1bmN0aW9uAADoASBKdW5jdGlvbgAIAADoEAx4Y20IdjMganVuY3Rpb24gSnVuY3Rpb24AASgkUGFyYWNoYWluBADsAQx1MzIAAAAsQWNjb3VudElkMzIIARxuZXR3b3Jr8AFET3B0aW9uPE5ldHdvcmtJZD4AAQhpZAQBIFt1ODsgMzJdAAEAOEFjY291bnRJbmRleDY0CAEcbmV0d29ya/ABRE9wdGlvbjxOZXR3b3JrSWQ+AAEUaW5kZXgsAQx1NjQAAgAwQWNjb3VudEtleTIwCAEcbmV0d29ya/ABRE9wdGlvbjxOZXR3b3JrSWQ+AAEMa2V5+AEgW3U4OyAyMF0AAwA4UGFsbGV0SW5zdGFuY2UEAAgBCHU4AAQAMEdlbmVyYWxJbmRleAQA/AEQdTEyOAAFAChHZW5lcmFsS2V5CAEYbGVuZ3RoCAEIdTgAARBkYXRhBAEgW3U4OyAzMl0ABgAkT25seUNoaWxkAAcAJFBsdXJhbGl0eQgBCGlkAQEBGEJvZHlJZAABEHBhcnQFAQEgQm9keVBhcnQACAA8R2xvYmFsQ29uc2Vuc3VzBAD0ASROZXR3b3JrSWQACQAA7AAABhAA8AQYT3B0aW9uBARUAfQBCBBOb25lAAAAEFNvbWUEAPQAAAEAAPQQDHhjbQh2MyBqdW5jdGlvbiROZXR3b3JrSWQAASwkQnlHZW5lc2lzBAAEASBbdTg7IDMyXQAAABhCeUZvcmsIATBibG9ja19udW1iZXIwAQx1NjQAAShibG9ja19oYXNoBAEgW3U4OyAzMl0AAQAgUG9sa2Fkb3QAAgAYS3VzYW1hAAMAHFdlc3RlbmQABAAYUm9jb2NvAAUAGFdvY29jbwAGACBFdGhlcmV1bQQBIGNoYWluX2lkLAEMdTY0AAcALEJpdGNvaW5Db3JlAAgALEJpdGNvaW5DYXNoAAkAQFBvbGthZG90QnVsbGV0aW4ACgAA+AAAAxQAAAAIAPwAAAYYAAEBEAx4Y20IdjMganVuY3Rpb24YQm9keUlkAAEoEFVuaXQAAAAcTW9uaWtlcgQASAEcW3U4OyA0XQABABRJbmRleAQA7AEMdTMyAAIAJEV4ZWN1dGl2ZQADACRUZWNobmljYWwABAAsTGVnaXNsYXRpdmUABQAgSnVkaWNpYWwABgAcRGVmZW5zZQAHADhBZG1pbmlzdHJhdGlvbgAIACBUcmVhc3VyeQAJAAAFARAMeGNtCHYzIGp1bmN0aW9uIEJvZHlQYXJ0AAEUFFZvaWNlAAAAHE1lbWJlcnMEARRjb3VudOwBDHUzMgABACBGcmFjdGlvbggBDG5vbewBDHUzMgABFGRlbm9t7AEMdTMyAAIAREF0TGVhc3RQcm9wb3J0aW9uCAEMbm9t7AEMdTMyAAEUZGVub23sAQx1MzIAAwBITW9yZVRoYW5Qcm9wb3J0aW9uCAEMbm9t7AEMdTMyAAEUZGVub23sAQx1MzIABAAACQEQDHhjbQh2MyhtdWx0aWFzc2V0HEFzc2V0SWQAAQggQ29uY3JldGUEAOABNE11bHRpTG9jYXRpb24AAAAgQWJzdHJhY3QEAAQBIFt1ODsgMzJdAAEAAA0BECxzdGFnaW5nX3hjbQh2NCBsb2NhdGlvbiBMb2NhdGlvbgAACAEccGFyZW50cwgBCHU4AAEgaW50ZXJpb3IRAQEkSnVuY3Rpb25zAAARARAsc3RhZ2luZ194Y20IdjQkanVuY3Rpb25zJEp1bmN0aW9ucwABJBBIZXJlAAAACFgxBAAVAQFIQXJjPFtKdW5jdGlvbjsgMV0+AAEACFgyBAAlAQFIQXJjPFtKdW5jdGlvbjsgMl0+AAIACFgzBAApAQFIQXJjPFtKdW5jdGlvbjsgM10+AAMACFg0BAAtAQFIQXJjPFtKdW5jdGlvbjsgNF0+AAQACFg1BAAxAQFIQXJjPFtKdW5jdGlvbjsgNV0+AAUACFg2BAA1AQFIQXJjPFtKdW5jdGlvbjsgNl0+AAYACFg3BAA5AQFIQXJjPFtKdW5jdGlvbjsgN10+AAcACFg4BAA9AQFIQXJjPFtKdW5jdGlvbjsgOF0+AAgAABUBAAADAQAAABkBABkBECxzdGFnaW5nX3hjbQh2NCBqdW5jdGlvbiBKdW5jdGlvbgABKCRQYXJhY2hhaW4EAOwBDHUzMgAAACxBY2NvdW50SWQzMggBHG5ldHdvcmsdAQFET3B0aW9uPE5ldHdvcmtJZD4AAQhpZAQBIFt1ODsgMzJdAAEAOEFjY291bnRJbmRleDY0CAEcbmV0d29yax0BAURPcHRpb248TmV0d29ya0lkPgABFGluZGV4LAEMdTY0AAIAMEFjY291bnRLZXkyMAgBHG5ldHdvcmsdAQFET3B0aW9uPE5ldHdvcmtJZD4AAQxrZXn4ASBbdTg7IDIwXQADADhQYWxsZXRJbnN0YW5jZQQACAEIdTgABAAwR2VuZXJhbEluZGV4BAD8ARB1MTI4AAUAKEdlbmVyYWxLZXkIARhsZW5ndGgIAQh1OAABEGRhdGEEASBbdTg7IDMyXQAGACRPbmx5Q2hpbGQABwAkUGx1cmFsaXR5CAEIaWQBAQEYQm9keUlkAAEQcGFydAUBASBCb2R5UGFydAAIADxHbG9iYWxDb25zZW5zdXMEACEBASROZXR3b3JrSWQACQAAHQEEGE9wdGlvbgQEVAEhAQEIEE5vbmUAAAAQU29tZQQAIQEAAAEAACEBECxzdGFnaW5nX3hjbQh2NCBqdW5jdGlvbiROZXR3b3JrSWQAASwkQnlHZW5lc2lzBAAEASBbdTg7IDMyXQAAABhCeUZvcmsIATBibG9ja19udW1iZXIwAQx1NjQAAShibG9ja19oYXNoBAEgW3U4OyAzMl0AAQAgUG9sa2Fkb3QAAgAYS3VzYW1hAAMAHFdlc3RlbmQABAAYUm9jb2NvAAUAGFdvY29jbwAGACBFdGhlcmV1bQQBIGNoYWluX2lkLAEMdTY0AAcALEJpdGNvaW5Db3JlAAgALEJpdGNvaW5DYXNoAAkAQFBvbGthZG90QnVsbGV0aW4ACgAAJQEAAAMCAAAAGQEAKQEAAAMDAAAAGQEALQEAAAMEAAAAGQEAMQEAAAMFAAAAGQEANQEAAAMGAAAAGQEAOQEAAAMHAAAAGQEAPQEAAAMIAAAAGQEAQQEQLHN0YWdpbmdfeGNtCHY0FGFzc2V0HEFzc2V0SWQAAAQADQEBIExvY2F0aW9uAABFAQgMeGNtRFZlcnNpb25lZExvY2F0aW9uAAEMCFYyBABJAQFEdjI6Ok11bHRpTG9jYXRpb24AAQAIVjMEAOABRHYzOjpNdWx0aUxvY2F0aW9uAAMACFY0BAANAQEwdjQ6OkxvY2F0aW9uAAQAAEkBEAx4Y20IdjI0bXVsdGlsb2NhdGlvbjRNdWx0aUxvY2F0aW9uAAAIARxwYXJlbnRzCAEIdTgAASBpbnRlcmlvck0BASRKdW5jdGlvbnMAAE0BEAx4Y20IdjI0bXVsdGlsb2NhdGlvbiRKdW5jdGlvbnMAASQQSGVyZQAAAAhYMQQAUQEBIEp1bmN0aW9uAAEACFgyCABRAQEgSnVuY3Rpb24AAFEBASBKdW5jdGlvbgACAAhYMwwAUQEBIEp1bmN0aW9uAABRAQEgSnVuY3Rpb24AAFEBASBKdW5jdGlvbgADAAhYNBAAUQEBIEp1bmN0aW9uAABRAQEgSnVuY3Rpb24AAFEBASBKdW5jdGlvbgAAUQEBIEp1bmN0aW9uAAQACFg1FABRAQEgSnVuY3Rpb24AAFEBASBKdW5jdGlvbgAAUQEBIEp1bmN0aW9uAABRAQEgSnVuY3Rpb24AAFEBASBKdW5jdGlvbgAFAAhYNhgAUQEBIEp1bmN0aW9uAABRAQEgSnVuY3Rpb24AAFEBASBKdW5jdGlvbgAAUQEBIEp1bmN0aW9uAABRAQEgSnVuY3Rpb24AAFEBASBKdW5jdGlvbgAGAAhYNxwAUQEBIEp1bmN0aW9uAABRAQEgSnVuY3Rpb24AAFEBASBKdW5jdGlvbgAAUQEBIEp1bmN0aW9uAABRAQEgSnVuY3Rpb24AAFEBASBKdW5jdGlvbgAAUQEBIEp1bmN0aW9uAAcACFg4IABRAQEgSnVuY3Rpb24AAFEBASBKdW5jdGlvbgAAUQEBIEp1bmN0aW9uAABRAQEgSnVuY3Rpb24AAFEBASBKdW5jdGlvbgAAUQEBIEp1bmN0aW9uAABRAQEgSnVuY3Rpb24AAFEBASBKdW5jdGlvbgAIAABRARAMeGNtCHYyIGp1bmN0aW9uIEp1bmN0aW9uAAEkJFBhcmFjaGFpbgQA7AEMdTMyAAAALEFjY291bnRJZDMyCAEcbmV0d29ya1UBASROZXR3b3JrSWQAAQhpZAQBIFt1ODsgMzJdAAEAOEFjY291bnRJbmRleDY0CAEcbmV0d29ya1UBASROZXR3b3JrSWQAARRpbmRleCwBDHU2NAACADBBY2NvdW50S2V5MjAIARxuZXR3b3JrVQEBJE5ldHdvcmtJZAABDGtlefgBIFt1ODsgMjBdAAMAOFBhbGxldEluc3RhbmNlBAAIAQh1OAAEADBHZW5lcmFsSW5kZXgEAPwBEHUxMjgABQAoR2VuZXJhbEtleQQAWQEBgFdlYWtCb3VuZGVkVmVjPHU4LCBDb25zdFUzMjwzMj4+AAYAJE9ubHlDaGlsZAAHACRQbHVyYWxpdHkIAQhpZF0BARhCb2R5SWQAARBwYXJ0YQEBIEJvZHlQYXJ0AAgAAFUBDAx4Y20IdjIkTmV0d29ya0lkAAEQDEFueQAAABROYW1lZAQAWQEBgFdlYWtCb3VuZGVkVmVjPHU4LCBDb25zdFUzMjwzMj4+AAEAIFBvbGthZG90AAIAGEt1c2FtYQADAABZAQxMYm91bmRlZF9jb2xsZWN0aW9uc0B3ZWFrX2JvdW5kZWRfdmVjOFdlYWtCb3VuZGVkVmVjCARUAQgEUwAABAA4ARhWZWM8VD4AAF0BDAx4Y20IdjIYQm9keUlkAAEoEFVuaXQAAAAUTmFtZWQEAFkBAYBXZWFrQm91bmRlZFZlYzx1OCwgQ29uc3RVMzI8MzI+PgABABRJbmRleAQA7AEMdTMyAAIAJEV4ZWN1dGl2ZQADACRUZWNobmljYWwABAAsTGVnaXNsYXRpdmUABQAgSnVkaWNpYWwABgAcRGVmZW5zZQAHADhBZG1pbmlzdHJhdGlvbgAIACBUcmVhc3VyeQAJAABhAQwMeGNtCHYyIEJvZHlQYXJ0AAEUFFZvaWNlAAAAHE1lbWJlcnMEARRjb3VudOwBDHUzMgABACBGcmFjdGlvbggBDG5vbewBDHUzMgABFGRlbm9t7AEMdTMyAAIAREF0TGVhc3RQcm9wb3J0aW9uCAEMbm9t7AEMdTMyAAEUZGVub23sAQx1MzIAAwBITW9yZVRoYW5Qcm9wb3J0aW9uCAEMbm9t7AEMdTMyAAEUZGVub23sAQx1MzIABAAAZQEMYHBhbGxldF9jb252aWN0aW9uX3ZvdGluZxhwYWxsZXQURXZlbnQIBFQABEkAAQgkRGVsZWdhdGVkCAAAATBUOjpBY2NvdW50SWQAAAABMFQ6OkFjY291bnRJZAAABB0BQW4gYWNjb3VudCBoYXMgZGVsZWdhdGVkIHRoZWlyIHZvdGUgdG8gYW5vdGhlciBhY2NvdW50LiBcW3dobywgdGFyZ2V0XF0sVW5kZWxlZ2F0ZWQEAAABMFQ6OkFjY291bnRJZAABBPRBbiBcW2FjY291bnRcXSBoYXMgY2FuY2VsbGVkIGEgcHJldmlvdXMgZGVsZWdhdGlvbiBvcGVyYXRpb24uBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0aQEMQHBhbGxldF9yZWZlcmVuZGEYcGFsbGV0FEV2ZW50CARUAARJAAFAJFN1Ym1pdHRlZAwBFGluZGV4EAE8UmVmZXJlbmR1bUluZGV4BGBJbmRleCBvZiB0aGUgcmVmZXJlbmR1bS4BFHRyYWNrbQEBPFRyYWNrSWRPZjxULCBJPgQlAVRoZSB0cmFjayAoYW5kIGJ5IGV4dGVuc2lvbiBwcm9wb3NhbCBkaXNwYXRjaCBvcmlnaW4pIG9mIHRoaXMgcmVmZXJlbmR1bS4BIHByb3Bvc2FscQEBTEJvdW5kZWRDYWxsT2Y8VCwgST4EgFRoZSBwcm9wb3NhbCBmb3IgdGhlIHJlZmVyZW5kdW0uAASAQSByZWZlcmVuZHVtIGhhcyBiZWVuIHN1Ym1pdHRlZC5URGVjaXNpb25EZXBvc2l0UGxhY2VkDAEUaW5kZXgQATxSZWZlcmVuZHVtSW5kZXgEYEluZGV4IG9mIHRoZSByZWZlcmVuZHVtLgEMd2hvAAEwVDo6QWNjb3VudElkBIxUaGUgYWNjb3VudCB3aG8gcGxhY2VkIHRoZSBkZXBvc2l0LgEYYW1vdW50GAE8QmFsYW5jZU9mPFQsIEk+BIRUaGUgYW1vdW50IHBsYWNlZCBieSB0aGUgYWNjb3VudC4BBJRUaGUgZGVjaXNpb24gZGVwb3NpdCBoYXMgYmVlbiBwbGFjZWQuXERlY2lzaW9uRGVwb3NpdFJlZnVuZGVkDAEUaW5kZXgQATxSZWZlcmVuZHVtSW5kZXgEYEluZGV4IG9mIHRoZSByZWZlcmVuZHVtLgEMd2hvAAEwVDo6QWNjb3VudElkBIxUaGUgYWNjb3VudCB3aG8gcGxhY2VkIHRoZSBkZXBvc2l0LgEYYW1vdW50GAE8QmFsYW5jZU9mPFQsIEk+BIRUaGUgYW1vdW50IHBsYWNlZCBieSB0aGUgYWNjb3VudC4CBJxUaGUgZGVjaXNpb24gZGVwb3NpdCBoYXMgYmVlbiByZWZ1bmRlZC44RGVwb3NpdFNsYXNoZWQIAQx3aG8AATBUOjpBY2NvdW50SWQEjFRoZSBhY2NvdW50IHdobyBwbGFjZWQgdGhlIGRlcG9zaXQuARhhbW91bnQYATxCYWxhbmNlT2Y8VCwgST4EhFRoZSBhbW91bnQgcGxhY2VkIGJ5IHRoZSBhY2NvdW50LgMEbEEgZGVwb3NpdCBoYXMgYmVlbiBzbGFzaGVkLjxEZWNpc2lvblN0YXJ0ZWQQARRpbmRleBABPFJlZmVyZW5kdW1JbmRleARgSW5kZXggb2YgdGhlIHJlZmVyZW5kdW0uARR0cmFja20BATxUcmFja0lkT2Y8VCwgST4EJQFUaGUgdHJhY2sgKGFuZCBieSBleHRlbnNpb24gcHJvcG9zYWwgZGlzcGF0Y2ggb3JpZ2luKSBvZiB0aGlzIHJlZmVyZW5kdW0uASBwcm9wb3NhbHEBAUxCb3VuZGVkQ2FsbE9mPFQsIEk+BIBUaGUgcHJvcG9zYWwgZm9yIHRoZSByZWZlcmVuZHVtLgEUdGFsbHkBBwEgVDo6VGFsbHkEuFRoZSBjdXJyZW50IHRhbGx5IG9mIHZvdGVzIGluIHRoaXMgcmVmZXJlbmR1bS4EBLxBIHJlZmVyZW5kdW0gaGFzIG1vdmVkIGludG8gdGhlIGRlY2lkaW5nIHBoYXNlLjhDb25maXJtU3RhcnRlZAQBFGluZGV4EAE8UmVmZXJlbmR1bUluZGV4BGBJbmRleCBvZiB0aGUgcmVmZXJlbmR1bS4FADhDb25maXJtQWJvcnRlZAQBFGluZGV4EAE8UmVmZXJlbmR1bUluZGV4BGBJbmRleCBvZiB0aGUgcmVmZXJlbmR1bS4GACRDb25maXJtZWQIARRpbmRleBABPFJlZmVyZW5kdW1JbmRleARgSW5kZXggb2YgdGhlIHJlZmVyZW5kdW0uARR0YWxseQEHASBUOjpUYWxseQSwVGhlIGZpbmFsIHRhbGx5IG9mIHZvdGVzIGluIHRoaXMgcmVmZXJlbmR1bS4HBCEBQSByZWZlcmVuZHVtIGhhcyBlbmRlZCBpdHMgY29uZmlybWF0aW9uIHBoYXNlIGFuZCBpcyByZWFkeSBmb3IgYXBwcm92YWwuIEFwcHJvdmVkBAEUaW5kZXgQATxSZWZlcmVuZHVtSW5kZXgEYEluZGV4IG9mIHRoZSByZWZlcmVuZHVtLggEDQFBIHJlZmVyZW5kdW0gaGFzIGJlZW4gYXBwcm92ZWQgYW5kIGl0cyBwcm9wb3NhbCBoYXMgYmVlbiBzY2hlZHVsZWQuIFJlamVjdGVkCAEUaW5kZXgQATxSZWZlcmVuZHVtSW5kZXgEYEluZGV4IG9mIHRoZSByZWZlcmVuZHVtLgEUdGFsbHkBBwEgVDo6VGFsbHkEsFRoZSBmaW5hbCB0YWxseSBvZiB2b3RlcyBpbiB0aGlzIHJlZmVyZW5kdW0uCQSsQSBwcm9wb3NhbCBoYXMgYmVlbiByZWplY3RlZCBieSByZWZlcmVuZHVtLiBUaW1lZE91dAgBFGluZGV4EAE8UmVmZXJlbmR1bUluZGV4BGBJbmRleCBvZiB0aGUgcmVmZXJlbmR1bS4BFHRhbGx5AQcBIFQ6OlRhbGx5BLBUaGUgZmluYWwgdGFsbHkgb2Ygdm90ZXMgaW4gdGhpcyByZWZlcmVuZHVtLgoE2EEgcmVmZXJlbmR1bSBoYXMgYmVlbiB0aW1lZCBvdXQgd2l0aG91dCBiZWluZyBkZWNpZGVkLiRDYW5jZWxsZWQIARRpbmRleBABPFJlZmVyZW5kdW1JbmRleARgSW5kZXggb2YgdGhlIHJlZmVyZW5kdW0uARR0YWxseQEHASBUOjpUYWxseQSwVGhlIGZpbmFsIHRhbGx5IG9mIHZvdGVzIGluIHRoaXMgcmVmZXJlbmR1bS4LBIBBIHJlZmVyZW5kdW0gaGFzIGJlZW4gY2FuY2VsbGVkLhhLaWxsZWQIARRpbmRleBABPFJlZmVyZW5kdW1JbmRleARgSW5kZXggb2YgdGhlIHJlZmVyZW5kdW0uARR0YWxseQEHASBUOjpUYWxseQSwVGhlIGZpbmFsIHRhbGx5IG9mIHZvdGVzIGluIHRoaXMgcmVmZXJlbmR1bS4MBHRBIHJlZmVyZW5kdW0gaGFzIGJlZW4ga2lsbGVkLmRTdWJtaXNzaW9uRGVwb3NpdFJlZnVuZGVkDAEUaW5kZXgQATxSZWZlcmVuZHVtSW5kZXgEYEluZGV4IG9mIHRoZSByZWZlcmVuZHVtLgEMd2hvAAEwVDo6QWNjb3VudElkBIxUaGUgYWNjb3VudCB3aG8gcGxhY2VkIHRoZSBkZXBvc2l0LgEYYW1vdW50GAE8QmFsYW5jZU9mPFQsIEk+BIRUaGUgYW1vdW50IHBsYWNlZCBieSB0aGUgYWNjb3VudC4NBKRUaGUgc3VibWlzc2lvbiBkZXBvc2l0IGhhcyBiZWVuIHJlZnVuZGVkLixNZXRhZGF0YVNldAgBFGluZGV4EAE8UmVmZXJlbmR1bUluZGV4BGBJbmRleCBvZiB0aGUgcmVmZXJlbmR1bS4BEGhhc2g0ARxUOjpIYXNoBDhQcmVpbWFnZSBoYXNoLg4EnE1ldGFkYXRhIGZvciBhIHJlZmVyZW5kdW0gaGFzIGJlZW4gc2V0LjxNZXRhZGF0YUNsZWFyZWQIARRpbmRleBABPFJlZmVyZW5kdW1JbmRleARgSW5kZXggb2YgdGhlIHJlZmVyZW5kdW0uARBoYXNoNAEcVDo6SGFzaAQ4UHJlaW1hZ2UgaGFzaC4PBKxNZXRhZGF0YSBmb3IgYSByZWZlcmVuZHVtIGhhcyBiZWVuIGNsZWFyZWQuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0bQEAAAUEAHEBEDRmcmFtZV9zdXBwb3J0GHRyYWl0cyRwcmVpbWFnZXMcQm91bmRlZAgEVAF1AQRIAfkGAQwYTGVnYWN5BAEQaGFzaDQBJEg6Ok91dHB1dAAAABhJbmxpbmUEAP0GATRCb3VuZGVkSW5saW5lAAEAGExvb2t1cAgBEGhhc2g0ASRIOjpPdXRwdXQAAQxsZW4QAQx1MzIAAgAAdQEIQHBvbGthZG90X3J1bnRpbWUsUnVudGltZUNhbGwAAbgYU3lzdGVtBAB5AQGtAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxTeXN0ZW0sIFJ1bnRpbWU+AAAAJFNjaGVkdWxlcgQAiQEBuQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8U2NoZWR1bGVyLCBSdW50aW1lPgABACBQcmVpbWFnZQQAkQEBtQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8UHJlaW1hZ2UsIFJ1bnRpbWU+AAoAEEJhYmUEAJkBAaUBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPEJhYmUsIFJ1bnRpbWU+AAIAJFRpbWVzdGFtcAQAvQEBuQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8VGltZXN0YW1wLCBSdW50aW1lPgADABxJbmRpY2VzBADBAQGxAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxJbmRpY2VzLCBSdW50aW1lPgAEACBCYWxhbmNlcwQAzQEBtQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8QmFsYW5jZXMsIFJ1bnRpbWU+AAUAHFN0YWtpbmcEANkBAbEBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPFN0YWtpbmcsIFJ1bnRpbWU+AAcAHFNlc3Npb24EABUCAbEBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPFNlc3Npb24sIFJ1bnRpbWU+AAkAHEdyYW5kcGEEADECAbEBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPEdyYW5kcGEsIFJ1bnRpbWU+AAsAIFRyZWFzdXJ5BABdAgG1AXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxUcmVhc3VyeSwgUnVudGltZT4AEwBAQ29udmljdGlvblZvdGluZwQAZQIB1QFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8Q29udmljdGlvblZvdGluZywgUnVudGltZT4AFAAkUmVmZXJlbmRhBAB5AgG5AXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxSZWZlcmVuZGEsIFJ1bnRpbWU+ABUAJFdoaXRlbGlzdAQAoQIBuQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8V2hpdGVsaXN0LCBSdW50aW1lPgAXAChQYXJhbWV0ZXJzBAClAgG9AXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxQYXJhbWV0ZXJzLCBSdW50aW1lPgAbABhDbGFpbXMEANECAa0Bc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPENsYWltcywgUnVudGltZT4AGAAcVmVzdGluZwQA8QIBsQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8VmVzdGluZywgUnVudGltZT4AGQAcVXRpbGl0eQQA+QIBsQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8VXRpbGl0eSwgUnVudGltZT4AGgAUUHJveHkEAAEDAakBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPFByb3h5LCBSdW50aW1lPgAdACBNdWx0aXNpZwQADQMBtQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8TXVsdGlzaWcsIFJ1bnRpbWU+AB4AIEJvdW50aWVzBAAZAwG1AXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxCb3VudGllcywgUnVudGltZT4AIgA0Q2hpbGRCb3VudGllcwQAHQMByQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8Q2hpbGRCb3VudGllcywgUnVudGltZT4AJgBoRWxlY3Rpb25Qcm92aWRlck11bHRpUGhhc2UEACEDAf0Bc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPEVsZWN0aW9uUHJvdmlkZXJNdWx0aVBoYXNlLCBSdW50aW1lPgAkACRWb3Rlckxpc3QEABUEAbkBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPFZvdGVyTGlzdCwgUnVudGltZT4AJQA8Tm9taW5hdGlvblBvb2xzBAAZBAHRAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxOb21pbmF0aW9uUG9vbHMsIFJ1bnRpbWU+ACcALEZhc3RVbnN0YWtlBABNBAHBAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxGYXN0VW5zdGFrZSwgUnVudGltZT4AKAA0Q29uZmlndXJhdGlvbgQAUQQByQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8Q29uZmlndXJhdGlvbiwgUnVudGltZT4AMwAsUGFyYXNTaGFyZWQEAHUEAcEBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPFBhcmFzU2hhcmVkLCBSdW50aW1lPgA0ADRQYXJhSW5jbHVzaW9uBAB5BAHJAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxQYXJhSW5jbHVzaW9uLCBSdW50aW1lPgA1ADBQYXJhSW5oZXJlbnQEAH0EAcUBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPFBhcmFJbmhlcmVudCwgUnVudGltZT4ANgAUUGFyYXMEAAkFAakBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPFBhcmFzLCBSdW50aW1lPgA4ACxJbml0aWFsaXplcgQAEQUBwQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8SW5pdGlhbGl6ZXIsIFJ1bnRpbWU+ADkAEEhybXAEABUFAaUBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPEhybXAsIFJ1bnRpbWU+ADwANFBhcmFzRGlzcHV0ZXMEAB0FAckBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPFBhcmFzRGlzcHV0ZXMsIFJ1bnRpbWU+AD4ANFBhcmFzU2xhc2hpbmcEACEFAckBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPFBhcmFzU2xhc2hpbmcsIFJ1bnRpbWU+AD8AIE9uRGVtYW5kBAAxBQG1AXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxPbkRlbWFuZCwgUnVudGltZT4AQAAkUmVnaXN0cmFyBAA1BQG5AXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxSZWdpc3RyYXIsIFJ1bnRpbWU+AEYAFFNsb3RzBAA5BQGpAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxTbG90cywgUnVudGltZT4ARwAgQXVjdGlvbnMEAD0FAbUBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPEF1Y3Rpb25zLCBSdW50aW1lPgBIACRDcm93ZGxvYW4EAEUFAbkBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPENyb3dkbG9hbiwgUnVudGltZT4ASQAgQ29yZXRpbWUEAFkFAbUBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPENvcmV0aW1lLCBSdW50aW1lPgBKAEhTdGF0ZVRyaWVNaWdyYXRpb24EAG0FAd0Bc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPFN0YXRlVHJpZU1pZ3JhdGlvbiwgUnVudGltZT4AYgAkWGNtUGFsbGV0BACFBQG5AXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxYY21QYWxsZXQsIFJ1bnRpbWU+AGMAME1lc3NhZ2VRdWV1ZQQAwQYBxQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8TWVzc2FnZVF1ZXVlLCBSdW50aW1lPgBkACRBc3NldFJhdGUEAM0GAbkBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPEFzc2V0UmF0ZSwgUnVudGltZT4AZQAUQmVlZnkEANUGAakBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPEJlZWZ5LCBSdW50aW1lPgDIAAB5AQwwZnJhbWVfc3lzdGVtGHBhbGxldBBDYWxsBARUAAEsGHJlbWFyawQBGHJlbWFyazgBHFZlYzx1OD4AAAxoTWFrZSBzb21lIG9uLWNoYWluIHJlbWFyay4AiENhbiBiZSBleGVjdXRlZCBieSBldmVyeSBgb3JpZ2luYC44c2V0X2hlYXBfcGFnZXMEARRwYWdlczABDHU2NAABBPhTZXQgdGhlIG51bWJlciBvZiBwYWdlcyBpbiB0aGUgV2ViQXNzZW1ibHkgZW52aXJvbm1lbnQncyBoZWFwLiBzZXRfY29kZQQBEGNvZGU4ARxWZWM8dTg+AAIEZFNldCB0aGUgbmV3IHJ1bnRpbWUgY29kZS5cc2V0X2NvZGVfd2l0aG91dF9jaGVja3MEARBjb2RlOAEcVmVjPHU4PgADEBkBU2V0IHRoZSBuZXcgcnVudGltZSBjb2RlIHdpdGhvdXQgZG9pbmcgYW55IGNoZWNrcyBvZiB0aGUgZ2l2ZW4gYGNvZGVgLgBRAU5vdGUgdGhhdCBydW50aW1lIHVwZ3JhZGVzIHdpbGwgbm90IHJ1biBpZiB0aGlzIGlzIGNhbGxlZCB3aXRoIGEgbm90LWluY3JlYXNpbmcgc3BlYyB2ZXJzaW9uISxzZXRfc3RvcmFnZQQBFGl0ZW1zfQEBNFZlYzxLZXlWYWx1ZT4ABARoU2V0IHNvbWUgaXRlbXMgb2Ygc3RvcmFnZS4wa2lsbF9zdG9yYWdlBAEQa2V5c4UBASBWZWM8S2V5PgAFBHRLaWxsIHNvbWUgaXRlbXMgZnJvbSBzdG9yYWdlLixraWxsX3ByZWZpeAgBGHByZWZpeDgBDEtleQABHHN1YmtleXMQAQx1MzIABhARAUtpbGwgYWxsIHN0b3JhZ2UgaXRlbXMgd2l0aCBhIGtleSB0aGF0IHN0YXJ0cyB3aXRoIHRoZSBnaXZlbiBwcmVmaXguADkBKipOT1RFOioqIFdlIHJlbHkgb24gdGhlIFJvb3Qgb3JpZ2luIHRvIHByb3ZpZGUgdXMgdGhlIG51bWJlciBvZiBzdWJrZXlzIHVuZGVyPQF0aGUgcHJlZml4IHdlIGFyZSByZW1vdmluZyB0byBhY2N1cmF0ZWx5IGNhbGN1bGF0ZSB0aGUgd2VpZ2h0IG9mIHRoaXMgZnVuY3Rpb24uRHJlbWFya193aXRoX2V2ZW50BAEYcmVtYXJrOAEcVmVjPHU4PgAHBKRNYWtlIHNvbWUgb24tY2hhaW4gcmVtYXJrIGFuZCBlbWl0IGV2ZW50LkRhdXRob3JpemVfdXBncmFkZQQBJGNvZGVfaGFzaDQBHFQ6Okhhc2gACRBhAUF1dGhvcml6ZSBhbiB1cGdyYWRlIHRvIGEgZ2l2ZW4gYGNvZGVfaGFzaGAgZm9yIHRoZSBydW50aW1lLiBUaGUgcnVudGltZSBjYW4gYmUgc3VwcGxpZWQYbGF0ZXIuAHxUaGlzIGNhbGwgcmVxdWlyZXMgUm9vdCBvcmlnaW4ugGF1dGhvcml6ZV91cGdyYWRlX3dpdGhvdXRfY2hlY2tzBAEkY29kZV9oYXNoNAEcVDo6SGFzaAAKIGEBQXV0aG9yaXplIGFuIHVwZ3JhZGUgdG8gYSBnaXZlbiBgY29kZV9oYXNoYCBmb3IgdGhlIHJ1bnRpbWUuIFRoZSBydW50aW1lIGNhbiBiZSBzdXBwbGllZBhsYXRlci4AXQFXQVJOSU5HOiBUaGlzIGF1dGhvcml6ZXMgYW4gdXBncmFkZSB0aGF0IHdpbGwgdGFrZSBwbGFjZSB3aXRob3V0IGFueSBzYWZldHkgY2hlY2tzLCBmb3JZAWV4YW1wbGUgdGhhdCB0aGUgc3BlYyBuYW1lIHJlbWFpbnMgdGhlIHNhbWUgYW5kIHRoYXQgdGhlIHZlcnNpb24gbnVtYmVyIGluY3JlYXNlcy4gTm908HJlY29tbWVuZGVkIGZvciBub3JtYWwgdXNlLiBVc2UgYGF1dGhvcml6ZV91cGdyYWRlYCBpbnN0ZWFkLgB8VGhpcyBjYWxsIHJlcXVpcmVzIFJvb3Qgb3JpZ2luLmBhcHBseV9hdXRob3JpemVkX3VwZ3JhZGUEARBjb2RlOAEcVmVjPHU4PgALJFUBUHJvdmlkZSB0aGUgcHJlaW1hZ2UgKHJ1bnRpbWUgYmluYXJ5KSBgY29kZWAgZm9yIGFuIHVwZ3JhZGUgdGhhdCBoYXMgYmVlbiBhdXRob3JpemVkLgBJAUlmIHRoZSBhdXRob3JpemF0aW9uIHJlcXVpcmVkIGEgdmVyc2lvbiBjaGVjaywgdGhpcyBjYWxsIHdpbGwgZW5zdXJlIHRoZSBzcGVjIG5hbWXocmVtYWlucyB1bmNoYW5nZWQgYW5kIHRoYXQgdGhlIHNwZWMgdmVyc2lvbiBoYXMgaW5jcmVhc2VkLgBZAURlcGVuZGluZyBvbiB0aGUgcnVudGltZSdzIGBPblNldENvZGVgIGNvbmZpZ3VyYXRpb24sIHRoaXMgZnVuY3Rpb24gbWF5IGRpcmVjdGx5IGFwcGx5EQF0aGUgbmV3IGBjb2RlYCBpbiB0aGUgc2FtZSBibG9jayBvciBhdHRlbXB0IHRvIHNjaGVkdWxlIHRoZSB1cGdyYWRlLgBgQWxsIG9yaWdpbnMgYXJlIGFsbG93ZWQuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLn0BAAACgQEAgQEAAAQIODgAhQEAAAI4AIkBDEBwYWxsZXRfc2NoZWR1bGVyGHBhbGxldBBDYWxsBARUAAEoIHNjaGVkdWxlEAEQd2hlbhABREJsb2NrTnVtYmVyRm9yPFQ+AAE4bWF5YmVfcGVyaW9kaWONAQGsT3B0aW9uPHNjaGVkdWxlOjpQZXJpb2Q8QmxvY2tOdW1iZXJGb3I8VD4+PgABIHByaW9yaXR5CAFIc2NoZWR1bGU6OlByaW9yaXR5AAEQY2FsbHUBAXxCb3g8PFQgYXMgQ29uZmlnPjo6UnVudGltZUNhbGw+AAAEcEFub255bW91c2x5IHNjaGVkdWxlIGEgdGFzay4YY2FuY2VsCAEQd2hlbhABREJsb2NrTnVtYmVyRm9yPFQ+AAEUaW5kZXgQAQx1MzIAAQSUQ2FuY2VsIGFuIGFub255bW91c2x5IHNjaGVkdWxlZCB0YXNrLjhzY2hlZHVsZV9uYW1lZBQBCGlkBAEgVGFza05hbWUAARB3aGVuEAFEQmxvY2tOdW1iZXJGb3I8VD4AAThtYXliZV9wZXJpb2RpY40BAaxPcHRpb248c2NoZWR1bGU6OlBlcmlvZDxCbG9ja051bWJlckZvcjxUPj4+AAEgcHJpb3JpdHkIAUhzY2hlZHVsZTo6UHJpb3JpdHkAARBjYWxsdQEBfEJveDw8VCBhcyBDb25maWc+OjpSdW50aW1lQ2FsbD4AAgRYU2NoZWR1bGUgYSBuYW1lZCB0YXNrLjBjYW5jZWxfbmFtZWQEAQhpZAQBIFRhc2tOYW1lAAMEeENhbmNlbCBhIG5hbWVkIHNjaGVkdWxlZCB0YXNrLjhzY2hlZHVsZV9hZnRlchABFGFmdGVyEAFEQmxvY2tOdW1iZXJGb3I8VD4AAThtYXliZV9wZXJpb2RpY40BAaxPcHRpb248c2NoZWR1bGU6OlBlcmlvZDxCbG9ja051bWJlckZvcjxUPj4+AAEgcHJpb3JpdHkIAUhzY2hlZHVsZTo6UHJpb3JpdHkAARBjYWxsdQEBfEJveDw8VCBhcyBDb25maWc+OjpSdW50aW1lQ2FsbD4ABASoQW5vbnltb3VzbHkgc2NoZWR1bGUgYSB0YXNrIGFmdGVyIGEgZGVsYXkuUHNjaGVkdWxlX25hbWVkX2FmdGVyFAEIaWQEASBUYXNrTmFtZQABFGFmdGVyEAFEQmxvY2tOdW1iZXJGb3I8VD4AAThtYXliZV9wZXJpb2RpY40BAaxPcHRpb248c2NoZWR1bGU6OlBlcmlvZDxCbG9ja051bWJlckZvcjxUPj4+AAEgcHJpb3JpdHkIAUhzY2hlZHVsZTo6UHJpb3JpdHkAARBjYWxsdQEBfEJveDw8VCBhcyBDb25maWc+OjpSdW50aW1lQ2FsbD4ABQSQU2NoZWR1bGUgYSBuYW1lZCB0YXNrIGFmdGVyIGEgZGVsYXkuJHNldF9yZXRyeQwBEHRhc2uAAXhUYXNrQWRkcmVzczxCbG9ja051bWJlckZvcjxUPj4AARxyZXRyaWVzCAEIdTgAARhwZXJpb2QQAURCbG9ja051bWJlckZvcjxUPgAGMFkBU2V0IGEgcmV0cnkgY29uZmlndXJhdGlvbiBmb3IgYSB0YXNrIHNvIHRoYXQsIGluIGNhc2UgaXRzIHNjaGVkdWxlZCBydW4gZmFpbHMsIGl0IHdpbGxVAWJlIHJldHJpZWQgYWZ0ZXIgYHBlcmlvZGAgYmxvY2tzLCBmb3IgYSB0b3RhbCBhbW91bnQgb2YgYHJldHJpZXNgIHJldHJpZXMgb3IgdW50aWwgaXQkc3VjY2VlZHMuAFUBVGFza3Mgd2hpY2ggbmVlZCB0byBiZSBzY2hlZHVsZWQgZm9yIGEgcmV0cnkgYXJlIHN0aWxsIHN1YmplY3QgdG8gd2VpZ2h0IG1ldGVyaW5nIGFuZFEBYWdlbmRhIHNwYWNlLCBzYW1lIGFzIGEgcmVndWxhciB0YXNrLiBJZiBhIHBlcmlvZGljIHRhc2sgZmFpbHMsIGl0IHdpbGwgYmUgc2NoZWR1bGVkkG5vcm1hbGx5IHdoaWxlIHRoZSB0YXNrIGlzIHJldHJ5aW5nLgBRAVRhc2tzIHNjaGVkdWxlZCBhcyBhIHJlc3VsdCBvZiBhIHJldHJ5IGZvciBhIHBlcmlvZGljIHRhc2sgYXJlIHVubmFtZWQsIG5vbi1wZXJpb2RpYz0BY2xvbmVzIG9mIHRoZSBvcmlnaW5hbCB0YXNrLiBUaGVpciByZXRyeSBjb25maWd1cmF0aW9uIHdpbGwgYmUgZGVyaXZlZCBmcm9tIHRoZU0Bb3JpZ2luYWwgdGFzaydzIGNvbmZpZ3VyYXRpb24sIGJ1dCB3aWxsIGhhdmUgYSBsb3dlciB2YWx1ZSBmb3IgYHJlbWFpbmluZ2AgdGhhbiB0aGVkb3JpZ2luYWwgYHRvdGFsX3JldHJpZXNgLjxzZXRfcmV0cnlfbmFtZWQMAQhpZAQBIFRhc2tOYW1lAAEccmV0cmllcwgBCHU4AAEYcGVyaW9kEAFEQmxvY2tOdW1iZXJGb3I8VD4ABzBdAVNldCBhIHJldHJ5IGNvbmZpZ3VyYXRpb24gZm9yIGEgbmFtZWQgdGFzayBzbyB0aGF0LCBpbiBjYXNlIGl0cyBzY2hlZHVsZWQgcnVuIGZhaWxzLCBpdF0Bd2lsbCBiZSByZXRyaWVkIGFmdGVyIGBwZXJpb2RgIGJsb2NrcywgZm9yIGEgdG90YWwgYW1vdW50IG9mIGByZXRyaWVzYCByZXRyaWVzIG9yIHVudGlsMGl0IHN1Y2NlZWRzLgBVAVRhc2tzIHdoaWNoIG5lZWQgdG8gYmUgc2NoZWR1bGVkIGZvciBhIHJldHJ5IGFyZSBzdGlsbCBzdWJqZWN0IHRvIHdlaWdodCBtZXRlcmluZyBhbmRRAWFnZW5kYSBzcGFjZSwgc2FtZSBhcyBhIHJlZ3VsYXIgdGFzay4gSWYgYSBwZXJpb2RpYyB0YXNrIGZhaWxzLCBpdCB3aWxsIGJlIHNjaGVkdWxlZJBub3JtYWxseSB3aGlsZSB0aGUgdGFzayBpcyByZXRyeWluZy4AUQFUYXNrcyBzY2hlZHVsZWQgYXMgYSByZXN1bHQgb2YgYSByZXRyeSBmb3IgYSBwZXJpb2RpYyB0YXNrIGFyZSB1bm5hbWVkLCBub24tcGVyaW9kaWM9AWNsb25lcyBvZiB0aGUgb3JpZ2luYWwgdGFzay4gVGhlaXIgcmV0cnkgY29uZmlndXJhdGlvbiB3aWxsIGJlIGRlcml2ZWQgZnJvbSB0aGVNAW9yaWdpbmFsIHRhc2sncyBjb25maWd1cmF0aW9uLCBidXQgd2lsbCBoYXZlIGEgbG93ZXIgdmFsdWUgZm9yIGByZW1haW5pbmdgIHRoYW4gdGhlZG9yaWdpbmFsIGB0b3RhbF9yZXRyaWVzYC4wY2FuY2VsX3JldHJ5BAEQdGFza4ABeFRhc2tBZGRyZXNzPEJsb2NrTnVtYmVyRm9yPFQ+PgAIBKhSZW1vdmVzIHRoZSByZXRyeSBjb25maWd1cmF0aW9uIG9mIGEgdGFzay5IY2FuY2VsX3JldHJ5X25hbWVkBAEIaWQEASBUYXNrTmFtZQAJBLxDYW5jZWwgdGhlIHJldHJ5IGNvbmZpZ3VyYXRpb24gb2YgYSBuYW1lZCB0YXNrLgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy6NAQQYT3B0aW9uBARUAYABCBBOb25lAAAAEFNvbWUEAIAAAAEAAJEBDDxwYWxsZXRfcHJlaW1hZ2UYcGFsbGV0EENhbGwEBFQAARQ0bm90ZV9wcmVpbWFnZQQBFGJ5dGVzOAEcVmVjPHU4PgAAEHRSZWdpc3RlciBhIHByZWltYWdlIG9uLWNoYWluLgBVAUlmIHRoZSBwcmVpbWFnZSB3YXMgcHJldmlvdXNseSByZXF1ZXN0ZWQsIG5vIGZlZXMgb3IgZGVwb3NpdHMgYXJlIHRha2VuIGZvciBwcm92aWRpbmdVAXRoZSBwcmVpbWFnZS4gT3RoZXJ3aXNlLCBhIGRlcG9zaXQgaXMgdGFrZW4gcHJvcG9ydGlvbmFsIHRvIHRoZSBzaXplIG9mIHRoZSBwcmVpbWFnZS48dW5ub3RlX3ByZWltYWdlBAEQaGFzaDQBHFQ6Okhhc2gAARjcQ2xlYXIgYW4gdW5yZXF1ZXN0ZWQgcHJlaW1hZ2UgZnJvbSB0aGUgcnVudGltZSBzdG9yYWdlLgD8SWYgYGxlbmAgaXMgcHJvdmlkZWQsIHRoZW4gaXQgd2lsbCBiZSBhIG11Y2ggY2hlYXBlciBvcGVyYXRpb24uAAEBLSBgaGFzaGA6IFRoZSBoYXNoIG9mIHRoZSBwcmVpbWFnZSB0byBiZSByZW1vdmVkIGZyb20gdGhlIHN0b3JlLrgtIGBsZW5gOiBUaGUgbGVuZ3RoIG9mIHRoZSBwcmVpbWFnZSBvZiBgaGFzaGAuQHJlcXVlc3RfcHJlaW1hZ2UEARBoYXNoNAEcVDo6SGFzaAACEEEBUmVxdWVzdCBhIHByZWltYWdlIGJlIHVwbG9hZGVkIHRvIHRoZSBjaGFpbiB3aXRob3V0IHBheWluZyBhbnkgZmVlcyBvciBkZXBvc2l0cy4AVQFJZiB0aGUgcHJlaW1hZ2UgcmVxdWVzdHMgaGFzIGFscmVhZHkgYmVlbiBwcm92aWRlZCBvbi1jaGFpbiwgd2UgdW5yZXNlcnZlIGFueSBkZXBvc2l0OQFhIHVzZXIgbWF5IGhhdmUgcGFpZCwgYW5kIHRha2UgdGhlIGNvbnRyb2wgb2YgdGhlIHByZWltYWdlIG91dCBvZiB0aGVpciBoYW5kcy5IdW5yZXF1ZXN0X3ByZWltYWdlBAEQaGFzaDQBHFQ6Okhhc2gAAwy8Q2xlYXIgYSBwcmV2aW91c2x5IG1hZGUgcmVxdWVzdCBmb3IgYSBwcmVpbWFnZS4ALQFOT1RFOiBUSElTIE1VU1QgTk9UIEJFIENBTExFRCBPTiBgaGFzaGAgTU9SRSBUSU1FUyBUSEFOIGByZXF1ZXN0X3ByZWltYWdlYC44ZW5zdXJlX3VwZGF0ZWQEARhoYXNoZXOVAQEwVmVjPFQ6Okhhc2g+AAQMxEVuc3VyZSB0aGF0IHRoZSBhIGJ1bGsgb2YgcHJlLWltYWdlcyBpcyB1cGdyYWRlZC4APQFUaGUgY2FsbGVyIHBheXMgbm8gZmVlIGlmIGF0IGxlYXN0IDkwJSBvZiBwcmUtaW1hZ2VzIHdlcmUgc3VjY2Vzc2Z1bGx5IHVwZGF0ZWQuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLpUBAAACNACZAQwscGFsbGV0X2JhYmUYcGFsbGV0EENhbGwEBFQAAQxMcmVwb3J0X2VxdWl2b2NhdGlvbggBSGVxdWl2b2NhdGlvbl9wcm9vZp0BAZBCb3g8RXF1aXZvY2F0aW9uUHJvb2Y8SGVhZGVyRm9yPFQ+Pj4AATxrZXlfb3duZXJfcHJvb2atAQFAVDo6S2V5T3duZXJQcm9vZgAAEAkBUmVwb3J0IGF1dGhvcml0eSBlcXVpdm9jYXRpb24vbWlzYmVoYXZpb3IuIFRoaXMgbWV0aG9kIHdpbGwgdmVyaWZ5BQF0aGUgZXF1aXZvY2F0aW9uIHByb29mIGFuZCB2YWxpZGF0ZSB0aGUgZ2l2ZW4ga2V5IG93bmVyc2hpcCBwcm9vZg0BYWdhaW5zdCB0aGUgZXh0cmFjdGVkIG9mZmVuZGVyLiBJZiBib3RoIGFyZSB2YWxpZCwgdGhlIG9mZmVuY2Ugd2lsbDBiZSByZXBvcnRlZC5wcmVwb3J0X2VxdWl2b2NhdGlvbl91bnNpZ25lZAgBSGVxdWl2b2NhdGlvbl9wcm9vZp0BAZBCb3g8RXF1aXZvY2F0aW9uUHJvb2Y8SGVhZGVyRm9yPFQ+Pj4AATxrZXlfb3duZXJfcHJvb2atAQFAVDo6S2V5T3duZXJQcm9vZgABIAkBUmVwb3J0IGF1dGhvcml0eSBlcXVpdm9jYXRpb24vbWlzYmVoYXZpb3IuIFRoaXMgbWV0aG9kIHdpbGwgdmVyaWZ5BQF0aGUgZXF1aXZvY2F0aW9uIHByb29mIGFuZCB2YWxpZGF0ZSB0aGUgZ2l2ZW4ga2V5IG93bmVyc2hpcCBwcm9vZg0BYWdhaW5zdCB0aGUgZXh0cmFjdGVkIG9mZmVuZGVyLiBJZiBib3RoIGFyZSB2YWxpZCwgdGhlIG9mZmVuY2Ugd2lsbDBiZSByZXBvcnRlZC4NAVRoaXMgZXh0cmluc2ljIG11c3QgYmUgY2FsbGVkIHVuc2lnbmVkIGFuZCBpdCBpcyBleHBlY3RlZCB0aGF0IG9ubHkVAWJsb2NrIGF1dGhvcnMgd2lsbCBjYWxsIGl0ICh2YWxpZGF0ZWQgaW4gYFZhbGlkYXRlVW5zaWduZWRgKSwgYXMgc3VjaBUBaWYgdGhlIGJsb2NrIGF1dGhvciBpcyBkZWZpbmVkIGl0IHdpbGwgYmUgZGVmaW5lZCBhcyB0aGUgZXF1aXZvY2F0aW9uJHJlcG9ydGVyLkhwbGFuX2NvbmZpZ19jaGFuZ2UEARhjb25maWexAQFQTmV4dENvbmZpZ0Rlc2NyaXB0b3IAAhBdAVBsYW4gYW4gZXBvY2ggY29uZmlnIGNoYW5nZS4gVGhlIGVwb2NoIGNvbmZpZyBjaGFuZ2UgaXMgcmVjb3JkZWQgYW5kIHdpbGwgYmUgZW5hY3RlZCBvblEBdGhlIG5leHQgY2FsbCB0byBgZW5hY3RfZXBvY2hfY2hhbmdlYC4gVGhlIGNvbmZpZyB3aWxsIGJlIGFjdGl2YXRlZCBvbmUgZXBvY2ggYWZ0ZXIuWQFNdWx0aXBsZSBjYWxscyB0byB0aGlzIG1ldGhvZCB3aWxsIHJlcGxhY2UgYW55IGV4aXN0aW5nIHBsYW5uZWQgY29uZmlnIGNoYW5nZSB0aGF0IGhhZFRub3QgYmVlbiBlbmFjdGVkIHlldC4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMunQEISHNwX2NvbnNlbnN1c19zbG90c0RFcXVpdm9jYXRpb25Qcm9vZggYSGVhZGVyAaEBCElkAaUBABABIG9mZmVuZGVypQEBCElkAAEQc2xvdKkBARBTbG90AAEwZmlyc3RfaGVhZGVyoQEBGEhlYWRlcgABNHNlY29uZF9oZWFkZXKhAQEYSGVhZGVyAAChARAoc3BfcnVudGltZRxnZW5lcmljGGhlYWRlchhIZWFkZXIIGE51bWJlcgEQEEhhc2gAABQBLHBhcmVudF9oYXNoNAEwSGFzaDo6T3V0cHV0AAEYbnVtYmVy7AEYTnVtYmVyAAEoc3RhdGVfcm9vdDQBMEhhc2g6Ok91dHB1dAABPGV4dHJpbnNpY3Nfcm9vdDQBMEhhc2g6Ok91dHB1dAABGGRpZ2VzdDwBGERpZ2VzdAAApQEMRHNwX2NvbnNlbnN1c19iYWJlDGFwcBhQdWJsaWMAAAQABAE8c3IyNTUxOTo6UHVibGljAACpAQhIc3BfY29uc2Vuc3VzX3Nsb3RzEFNsb3QAAAQAMAEMdTY0AACtAQgoc3Bfc2Vzc2lvbjxNZW1iZXJzaGlwUHJvb2YAAAwBHHNlc3Npb24QATBTZXNzaW9uSW5kZXgAASh0cmllX25vZGVzhQEBMFZlYzxWZWM8dTg+PgABPHZhbGlkYXRvcl9jb3VudBABOFZhbGlkYXRvckNvdW50AACxAQxEc3BfY29uc2Vuc3VzX2JhYmUcZGlnZXN0c1BOZXh0Q29uZmlnRGVzY3JpcHRvcgABBAhWMQgBBGO1AQEoKHU2NCwgdTY0KQABNGFsbG93ZWRfc2xvdHO5AQEwQWxsb3dlZFNsb3RzAAEAALUBAAAECDAwALkBCERzcF9jb25zZW5zdXNfYmFiZTBBbGxvd2VkU2xvdHMAAQwwUHJpbWFyeVNsb3RzAAAAdFByaW1hcnlBbmRTZWNvbmRhcnlQbGFpblNsb3RzAAEAbFByaW1hcnlBbmRTZWNvbmRhcnlWUkZTbG90cwACAAC9AQxAcGFsbGV0X3RpbWVzdGFtcBhwYWxsZXQQQ2FsbAQEVAABBAxzZXQEAQxub3csASRUOjpNb21lbnQAAExUU2V0IHRoZSBjdXJyZW50IHRpbWUuAFUBVGhpcyBjYWxsIHNob3VsZCBiZSBpbnZva2VkIGV4YWN0bHkgb25jZSBwZXIgYmxvY2suIEl0IHdpbGwgcGFuaWMgYXQgdGhlIGZpbmFsaXphdGlvbtRwaGFzZSwgaWYgdGhpcyBjYWxsIGhhc24ndCBiZWVuIGludm9rZWQgYnkgdGhhdCB0aW1lLgBBAVRoZSB0aW1lc3RhbXAgc2hvdWxkIGJlIGdyZWF0ZXIgdGhhbiB0aGUgcHJldmlvdXMgb25lIGJ5IHRoZSBhbW91bnQgc3BlY2lmaWVkIGJ5aFtgQ29uZmlnOjpNaW5pbXVtUGVyaW9kYF0uAMRUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfTm9uZV8uAFEBVGhpcyBkaXNwYXRjaCBjbGFzcyBpcyBfTWFuZGF0b3J5XyB0byBlbnN1cmUgaXQgZ2V0cyBleGVjdXRlZCBpbiB0aGUgYmxvY2suIEJlIGF3YXJlUQF0aGF0IGNoYW5naW5nIHRoZSBjb21wbGV4aXR5IG9mIHRoaXMgY2FsbCBjb3VsZCByZXN1bHQgZXhoYXVzdGluZyB0aGUgcmVzb3VyY2VzIGluIGGEYmxvY2sgdG8gZXhlY3V0ZSBhbnkgb3RoZXIgY2FsbHMuADQjIyBDb21wbGV4aXR5MQEtIGBPKDEpYCAoTm90ZSB0aGF0IGltcGxlbWVudGF0aW9ucyBvZiBgT25UaW1lc3RhbXBTZXRgIG11c3QgYWxzbyBiZSBgTygxKWApVQEtIDEgc3RvcmFnZSByZWFkIGFuZCAxIHN0b3JhZ2UgbXV0YXRpb24gKGNvZGVjIGBPKDEpYCBiZWNhdXNlIG9mIGBEaWRVcGRhdGU6OnRha2VgIGluQCAgYG9uX2ZpbmFsaXplYCnULSAxIGV2ZW50IGhhbmRsZXIgYG9uX3RpbWVzdGFtcF9zZXRgLiBNdXN0IGJlIGBPKDEpYC4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMuwQEMOHBhbGxldF9pbmRpY2VzGHBhbGxldBBDYWxsBARUAAEUFGNsYWltBAEUaW5kZXgQATxUOjpBY2NvdW50SW5kZXgAADCYQXNzaWduIGFuIHByZXZpb3VzbHkgdW5hc3NpZ25lZCBpbmRleC4A3FBheW1lbnQ6IGBEZXBvc2l0YCBpcyByZXNlcnZlZCBmcm9tIHRoZSBzZW5kZXIgYWNjb3VudC4AzFRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfLgDwLSBgaW5kZXhgOiB0aGUgaW5kZXggdG8gYmUgY2xhaW1lZC4gVGhpcyBtdXN0IG5vdCBiZSBpbiB1c2UuAJBFbWl0cyBgSW5kZXhBc3NpZ25lZGAgaWYgc3VjY2Vzc2Z1bC4ANCMjIENvbXBsZXhpdHkkLSBgTygxKWAuIHRyYW5zZmVyCAEMbmV3xQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEUaW5kZXgQATxUOjpBY2NvdW50SW5kZXgAATBdAUFzc2lnbiBhbiBpbmRleCBhbHJlYWR5IG93bmVkIGJ5IHRoZSBzZW5kZXIgdG8gYW5vdGhlciBhY2NvdW50LiBUaGUgYmFsYW5jZSByZXNlcnZhdGlvbrhpcyBlZmZlY3RpdmVseSB0cmFuc2ZlcnJlZCB0byB0aGUgbmV3IGFjY291bnQuAMxUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXy4AJQEtIGBpbmRleGA6IHRoZSBpbmRleCB0byBiZSByZS1hc3NpZ25lZC4gVGhpcyBtdXN0IGJlIG93bmVkIGJ5IHRoZSBzZW5kZXIuXQEtIGBuZXdgOiB0aGUgbmV3IG93bmVyIG9mIHRoZSBpbmRleC4gVGhpcyBmdW5jdGlvbiBpcyBhIG5vLW9wIGlmIGl0IGlzIGVxdWFsIHRvIHNlbmRlci4AkEVtaXRzIGBJbmRleEFzc2lnbmVkYCBpZiBzdWNjZXNzZnVsLgA0IyMgQ29tcGxleGl0eSQtIGBPKDEpYC4QZnJlZQQBFGluZGV4EAE8VDo6QWNjb3VudEluZGV4AAIwlEZyZWUgdXAgYW4gaW5kZXggb3duZWQgYnkgdGhlIHNlbmRlci4AXQFQYXltZW50OiBBbnkgcHJldmlvdXMgZGVwb3NpdCBwbGFjZWQgZm9yIHRoZSBpbmRleCBpcyB1bnJlc2VydmVkIGluIHRoZSBzZW5kZXIgYWNjb3VudC4AVQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXyBhbmQgdGhlIHNlbmRlciBtdXN0IG93biB0aGUgaW5kZXguAA0BLSBgaW5kZXhgOiB0aGUgaW5kZXggdG8gYmUgZnJlZWQuIFRoaXMgbXVzdCBiZSBvd25lZCBieSB0aGUgc2VuZGVyLgCERW1pdHMgYEluZGV4RnJlZWRgIGlmIHN1Y2Nlc3NmdWwuADQjIyBDb21wbGV4aXR5JC0gYE8oMSlgLjhmb3JjZV90cmFuc2ZlcgwBDG5ld8UBAVBBY2NvdW50SWRMb29rdXBPZjxUPgABFGluZGV4EAE8VDo6QWNjb3VudEluZGV4AAEYZnJlZXplIAEQYm9vbAADNFUBRm9yY2UgYW4gaW5kZXggdG8gYW4gYWNjb3VudC4gVGhpcyBkb2Vzbid0IHJlcXVpcmUgYSBkZXBvc2l0LiBJZiB0aGUgaW5kZXggaXMgYWxyZWFkeehoZWxkLCB0aGVuIGFueSBkZXBvc2l0IGlzIHJlaW1idXJzZWQgdG8gaXRzIGN1cnJlbnQgb3duZXIuAMRUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfUm9vdF8uAKQtIGBpbmRleGA6IHRoZSBpbmRleCB0byBiZSAocmUtKWFzc2lnbmVkLl0BLSBgbmV3YDogdGhlIG5ldyBvd25lciBvZiB0aGUgaW5kZXguIFRoaXMgZnVuY3Rpb24gaXMgYSBuby1vcCBpZiBpdCBpcyBlcXVhbCB0byBzZW5kZXIuQQEtIGBmcmVlemVgOiBpZiBzZXQgdG8gYHRydWVgLCB3aWxsIGZyZWV6ZSB0aGUgaW5kZXggc28gaXQgY2Fubm90IGJlIHRyYW5zZmVycmVkLgCQRW1pdHMgYEluZGV4QXNzaWduZWRgIGlmIHN1Y2Nlc3NmdWwuADQjIyBDb21wbGV4aXR5JC0gYE8oMSlgLhhmcmVlemUEARRpbmRleBABPFQ6OkFjY291bnRJbmRleAAEMEEBRnJlZXplIGFuIGluZGV4IHNvIGl0IHdpbGwgYWx3YXlzIHBvaW50IHRvIHRoZSBzZW5kZXIgYWNjb3VudC4gVGhpcyBjb25zdW1lcyB0aGUgZGVwb3NpdC4AWQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXyBhbmQgdGhlIHNpZ25pbmcgYWNjb3VudCBtdXN0IGhhdmUgYWxub24tZnJvemVuIGFjY291bnQgYGluZGV4YC4ArC0gYGluZGV4YDogdGhlIGluZGV4IHRvIGJlIGZyb3plbiBpbiBwbGFjZS4AiEVtaXRzIGBJbmRleEZyb3plbmAgaWYgc3VjY2Vzc2Z1bC4ANCMjIENvbXBsZXhpdHkkLSBgTygxKWAuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLsUBDChzcF9ydW50aW1lMG11bHRpYWRkcmVzczBNdWx0aUFkZHJlc3MIJEFjY291bnRJZAEAMEFjY291bnRJbmRleAGMARQISWQEAAABJEFjY291bnRJZAAAABRJbmRleAQAyQEBMEFjY291bnRJbmRleAABAAxSYXcEADgBHFZlYzx1OD4AAgAkQWRkcmVzczMyBAAEASBbdTg7IDMyXQADACRBZGRyZXNzMjAEAPgBIFt1ODsgMjBdAAQAAMkBAAAGjADNAQw8cGFsbGV0X2JhbGFuY2VzGHBhbGxldBBDYWxsCARUAARJAAEkUHRyYW5zZmVyX2FsbG93X2RlYXRoCAEQZGVzdMUBAVBBY2NvdW50SWRMb29rdXBPZjxUPgABFHZhbHVl/AEoVDo6QmFsYW5jZQAAHNRUcmFuc2ZlciBzb21lIGxpcXVpZCBmcmVlIGJhbGFuY2UgdG8gYW5vdGhlciBhY2NvdW50LgA1AWB0cmFuc2Zlcl9hbGxvd19kZWF0aGAgd2lsbCBzZXQgdGhlIGBGcmVlQmFsYW5jZWAgb2YgdGhlIHNlbmRlciBhbmQgcmVjZWl2ZXIuEQFJZiB0aGUgc2VuZGVyJ3MgYWNjb3VudCBpcyBiZWxvdyB0aGUgZXhpc3RlbnRpYWwgZGVwb3NpdCBhcyBhIHJlc3VsdLBvZiB0aGUgdHJhbnNmZXIsIHRoZSBhY2NvdW50IHdpbGwgYmUgcmVhcGVkLgAVAVRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIGBTaWduZWRgIGJ5IHRoZSB0cmFuc2FjdG9yLjhmb3JjZV90cmFuc2ZlcgwBGHNvdXJjZcUBAVBBY2NvdW50SWRMb29rdXBPZjxUPgABEGRlc3TFAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AARR2YWx1ZfwBKFQ6OkJhbGFuY2UAAghhAUV4YWN0bHkgYXMgYHRyYW5zZmVyX2FsbG93X2RlYXRoYCwgZXhjZXB0IHRoZSBvcmlnaW4gbXVzdCBiZSByb290IGFuZCB0aGUgc291cmNlIGFjY291bnREbWF5IGJlIHNwZWNpZmllZC5MdHJhbnNmZXJfa2VlcF9hbGl2ZQgBEGRlc3TFAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AARR2YWx1ZfwBKFQ6OkJhbGFuY2UAAxhZAVNhbWUgYXMgdGhlIFtgdHJhbnNmZXJfYWxsb3dfZGVhdGhgXSBjYWxsLCBidXQgd2l0aCBhIGNoZWNrIHRoYXQgdGhlIHRyYW5zZmVyIHdpbGwgbm90YGtpbGwgdGhlIG9yaWdpbiBhY2NvdW50LgDoOTklIG9mIHRoZSB0aW1lIHlvdSB3YW50IFtgdHJhbnNmZXJfYWxsb3dfZGVhdGhgXSBpbnN0ZWFkLgDwW2B0cmFuc2Zlcl9hbGxvd19kZWF0aGBdOiBzdHJ1Y3QuUGFsbGV0Lmh0bWwjbWV0aG9kLnRyYW5zZmVyMHRyYW5zZmVyX2FsbAgBEGRlc3TFAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AAShrZWVwX2FsaXZlIAEQYm9vbAAEPAUBVHJhbnNmZXIgdGhlIGVudGlyZSB0cmFuc2ZlcmFibGUgYmFsYW5jZSBmcm9tIHRoZSBjYWxsZXIgYWNjb3VudC4AWQFOT1RFOiBUaGlzIGZ1bmN0aW9uIG9ubHkgYXR0ZW1wdHMgdG8gdHJhbnNmZXIgX3RyYW5zZmVyYWJsZV8gYmFsYW5jZXMuIFRoaXMgbWVhbnMgdGhhdGEBYW55IGxvY2tlZCwgcmVzZXJ2ZWQsIG9yIGV4aXN0ZW50aWFsIGRlcG9zaXRzICh3aGVuIGBrZWVwX2FsaXZlYCBpcyBgdHJ1ZWApLCB3aWxsIG5vdCBiZV0BdHJhbnNmZXJyZWQgYnkgdGhpcyBmdW5jdGlvbi4gVG8gZW5zdXJlIHRoYXQgdGhpcyBmdW5jdGlvbiByZXN1bHRzIGluIGEga2lsbGVkIGFjY291bnQsRQF5b3UgbWlnaHQgbmVlZCB0byBwcmVwYXJlIHRoZSBhY2NvdW50IGJ5IHJlbW92aW5nIGFueSByZWZlcmVuY2UgY291bnRlcnMsIHN0b3JhZ2VAZGVwb3NpdHMsIGV0Yy4uLgDAVGhlIGRpc3BhdGNoIG9yaWdpbiBvZiB0aGlzIGNhbGwgbXVzdCBiZSBTaWduZWQuAKAtIGBkZXN0YDogVGhlIHJlY2lwaWVudCBvZiB0aGUgdHJhbnNmZXIuWQEtIGBrZWVwX2FsaXZlYDogQSBib29sZWFuIHRvIGRldGVybWluZSBpZiB0aGUgYHRyYW5zZmVyX2FsbGAgb3BlcmF0aW9uIHNob3VsZCBzZW5kIGFsbE0BICBvZiB0aGUgZnVuZHMgdGhlIGFjY291bnQgaGFzLCBjYXVzaW5nIHRoZSBzZW5kZXIgYWNjb3VudCB0byBiZSBraWxsZWQgKGZhbHNlKSwgb3JZASAgdHJhbnNmZXIgZXZlcnl0aGluZyBleGNlcHQgYXQgbGVhc3QgdGhlIGV4aXN0ZW50aWFsIGRlcG9zaXQsIHdoaWNoIHdpbGwgZ3VhcmFudGVlIHRvnCAga2VlcCB0aGUgc2VuZGVyIGFjY291bnQgYWxpdmUgKHRydWUpLjxmb3JjZV91bnJlc2VydmUIAQx3aG/FAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AARhhbW91bnQYAShUOjpCYWxhbmNlAAUMsFVucmVzZXJ2ZSBzb21lIGJhbGFuY2UgZnJvbSBhIHVzZXIgYnkgZm9yY2UuAGxDYW4gb25seSBiZSBjYWxsZWQgYnkgUk9PVC5AdXBncmFkZV9hY2NvdW50cwQBDHdob9EBAURWZWM8VDo6QWNjb3VudElkPgAGIHBVcGdyYWRlIGEgc3BlY2lmaWVkIGFjY291bnQuAHQtIGBvcmlnaW5gOiBNdXN0IGJlIGBTaWduZWRgLpAtIGB3aG9gOiBUaGUgYWNjb3VudCB0byBiZSB1cGdyYWRlZC4AVQFUaGlzIHdpbGwgd2FpdmUgdGhlIHRyYW5zYWN0aW9uIGZlZSBpZiBhdCBsZWFzdCBhbGwgYnV0IDEwJSBvZiB0aGUgYWNjb3VudHMgbmVlZGVkIHRvQQFiZSB1cGdyYWRlZC4gKFdlIGxldCBzb21lIG5vdCBoYXZlIHRvIGJlIHVwZ3JhZGVkIGp1c3QgaW4gb3JkZXIgdG8gYWxsb3cgZm9yIHRoZVhwb3NzaWJpbGl0eSBvZiBjaHVybikuRGZvcmNlX3NldF9iYWxhbmNlCAEMd2hvxQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEgbmV3X2ZyZWX8AShUOjpCYWxhbmNlAAgMrFNldCB0aGUgcmVndWxhciBiYWxhbmNlIG9mIGEgZ2l2ZW4gYWNjb3VudC4AsFRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBpcyBgcm9vdGAubGZvcmNlX2FkanVzdF90b3RhbF9pc3N1YW5jZQgBJGRpcmVjdGlvbtUBAUxBZGp1c3RtZW50RGlyZWN0aW9uAAEUZGVsdGH8AShUOjpCYWxhbmNlAAkUuEFkanVzdCB0aGUgdG90YWwgaXNzdWFuY2UgaW4gYSBzYXR1cmF0aW5nIHdheS4A/ENhbiBvbmx5IGJlIGNhbGxlZCBieSByb290IGFuZCBhbHdheXMgbmVlZHMgYSBwb3NpdGl2ZSBgZGVsdGFgLgAkIyBFeGFtcGxlEGJ1cm4IARR2YWx1ZfwBKFQ6OkJhbGFuY2UAAShrZWVwX2FsaXZlIAEQYm9vbAAKHPxCdXJuIHRoZSBzcGVjaWZpZWQgbGlxdWlkIGZyZWUgYmFsYW5jZSBmcm9tIHRoZSBvcmlnaW4gYWNjb3VudC4AJQFJZiB0aGUgb3JpZ2luJ3MgYWNjb3VudCBlbmRzIHVwIGJlbG93IHRoZSBleGlzdGVudGlhbCBkZXBvc2l0IGFzIGEgcmVzdWx0CQFvZiB0aGUgYnVybiBhbmQgYGtlZXBfYWxpdmVgIGlzIGZhbHNlLCB0aGUgYWNjb3VudCB3aWxsIGJlIHJlYXBlZC4AUQFVbmxpa2Ugc2VuZGluZyBmdW5kcyB0byBhIF9idXJuXyBhZGRyZXNzLCB3aGljaCBtZXJlbHkgbWFrZXMgdGhlIGZ1bmRzIGluYWNjZXNzaWJsZSwhAXRoaXMgYGJ1cm5gIG9wZXJhdGlvbiB3aWxsIHJlZHVjZSB0b3RhbCBpc3N1YW5jZSBieSB0aGUgYW1vdW50IF9idXJuZWRfLgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy7RAQAAAgAA1QEMPHBhbGxldF9iYWxhbmNlcxR0eXBlc0xBZGp1c3RtZW50RGlyZWN0aW9uAAEIIEluY3JlYXNlAAAAIERlY3JlYXNlAAEAANkBEDhwYWxsZXRfc3Rha2luZxhwYWxsZXQYcGFsbGV0EENhbGwEBFQAAXgQYm9uZAgBFHZhbHVl/AEwQmFsYW5jZU9mPFQ+AAEUcGF5ZWWoAXxSZXdhcmREZXN0aW5hdGlvbjxUOjpBY2NvdW50SWQ+AABAYQFUYWtlIHRoZSBvcmlnaW4gYWNjb3VudCBhcyBhIHN0YXNoIGFuZCBsb2NrIHVwIGB2YWx1ZWAgb2YgaXRzIGJhbGFuY2UuIGBjb250cm9sbGVyYCB3aWxsgGJlIHRoZSBhY2NvdW50IHRoYXQgY29udHJvbHMgaXQuAC0BYHZhbHVlYCBtdXN0IGJlIG1vcmUgdGhhbiB0aGUgYG1pbmltdW1fYmFsYW5jZWAgc3BlY2lmaWVkIGJ5IGBUOjpDdXJyZW5jeWAuACEBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8gYnkgdGhlIHN0YXNoIGFjY291bnQuADxFbWl0cyBgQm9uZGVkYC40IyMgQ29tcGxleGl0edAtIEluZGVwZW5kZW50IG9mIHRoZSBhcmd1bWVudHMuIE1vZGVyYXRlIGNvbXBsZXhpdHkuHC0gTygxKS5kLSBUaHJlZSBleHRyYSBEQiBlbnRyaWVzLgBNAU5PVEU6IFR3byBvZiB0aGUgc3RvcmFnZSB3cml0ZXMgKGBTZWxmOjpib25kZWRgLCBgU2VsZjo6cGF5ZWVgKSBhcmUgX25ldmVyXyBjbGVhbmVkWQF1bmxlc3MgdGhlIGBvcmlnaW5gIGZhbGxzIGJlbG93IF9leGlzdGVudGlhbCBkZXBvc2l0XyAob3IgZXF1YWwgdG8gMCkgYW5kIGdldHMgcmVtb3ZlZCBhcyBkdXN0Lihib25kX2V4dHJhBAE4bWF4X2FkZGl0aW9uYWz8ATBCYWxhbmNlT2Y8VD4AAThhAUFkZCBzb21lIGV4dHJhIGFtb3VudCB0aGF0IGhhdmUgYXBwZWFyZWQgaW4gdGhlIHN0YXNoIGBmcmVlX2JhbGFuY2VgIGludG8gdGhlIGJhbGFuY2UgdXAwZm9yIHN0YWtpbmcuAFEBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8gYnkgdGhlIHN0YXNoLCBub3QgdGhlIGNvbnRyb2xsZXIuAE0BVXNlIHRoaXMgaWYgdGhlcmUgYXJlIGFkZGl0aW9uYWwgZnVuZHMgaW4geW91ciBzdGFzaCBhY2NvdW50IHRoYXQgeW91IHdpc2ggdG8gYm9uZC5VAVVubGlrZSBbYGJvbmRgXShTZWxmOjpib25kKSBvciBbYHVuYm9uZGBdKFNlbGY6OnVuYm9uZCkgdGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBpbXBvc2W8YW55IGxpbWl0YXRpb24gb24gdGhlIGFtb3VudCB0aGF0IGNhbiBiZSBhZGRlZC4APEVtaXRzIGBCb25kZWRgLgA0IyMgQ29tcGxleGl0eeQtIEluZGVwZW5kZW50IG9mIHRoZSBhcmd1bWVudHMuIEluc2lnbmlmaWNhbnQgY29tcGxleGl0eS4cLSBPKDEpLhh1bmJvbmQEARR2YWx1ZfwBMEJhbGFuY2VPZjxUPgACTFEBU2NoZWR1bGUgYSBwb3J0aW9uIG9mIHRoZSBzdGFzaCB0byBiZSB1bmxvY2tlZCByZWFkeSBmb3IgdHJhbnNmZXIgb3V0IGFmdGVyIHRoZSBib25k/HBlcmlvZCBlbmRzLiBJZiB0aGlzIGxlYXZlcyBhbiBhbW91bnQgYWN0aXZlbHkgYm9uZGVkIGxlc3MgdGhhbiEBVDo6Q3VycmVuY3k6Om1pbmltdW1fYmFsYW5jZSgpLCB0aGVuIGl0IGlzIGluY3JlYXNlZCB0byB0aGUgZnVsbCBhbW91bnQuAFEBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8gYnkgdGhlIGNvbnRyb2xsZXIsIG5vdCB0aGUgc3Rhc2guAEUBT25jZSB0aGUgdW5sb2NrIHBlcmlvZCBpcyBkb25lLCB5b3UgY2FuIGNhbGwgYHdpdGhkcmF3X3VuYm9uZGVkYCB0byBhY3R1YWxseSBtb3ZlvHRoZSBmdW5kcyBvdXQgb2YgbWFuYWdlbWVudCByZWFkeSBmb3IgdHJhbnNmZXIuADEBTm8gbW9yZSB0aGFuIGEgbGltaXRlZCBudW1iZXIgb2YgdW5sb2NraW5nIGNodW5rcyAoc2VlIGBNYXhVbmxvY2tpbmdDaHVua3NgKUEBY2FuIGNvLWV4aXN0cyBhdCB0aGUgc2FtZSB0aW1lLiBJZiB0aGVyZSBhcmUgbm8gdW5sb2NraW5nIGNodW5rcyBzbG90cyBhdmFpbGFibGVFAVtgQ2FsbDo6d2l0aGRyYXdfdW5ib25kZWRgXSBpcyBjYWxsZWQgdG8gcmVtb3ZlIHNvbWUgb2YgdGhlIGNodW5rcyAoaWYgcG9zc2libGUpLgA5AUlmIGEgdXNlciBlbmNvdW50ZXJzIHRoZSBgSW5zdWZmaWNpZW50Qm9uZGAgZXJyb3Igd2hlbiBjYWxsaW5nIHRoaXMgZXh0cmluc2ljLBkBdGhleSBzaG91bGQgY2FsbCBgY2hpbGxgIGZpcnN0IGluIG9yZGVyIHRvIGZyZWUgdXAgdGhlaXIgYm9uZGVkIGZ1bmRzLgBERW1pdHMgYFVuYm9uZGVkYC4AlFNlZSBhbHNvIFtgQ2FsbDo6d2l0aGRyYXdfdW5ib25kZWRgXS5Ed2l0aGRyYXdfdW5ib25kZWQEAUhudW1fc2xhc2hpbmdfc3BhbnMQAQx1MzIAA1wpAVJlbW92ZSBhbnkgdW5sb2NrZWQgY2h1bmtzIGZyb20gdGhlIGB1bmxvY2tpbmdgIHF1ZXVlIGZyb20gb3VyIG1hbmFnZW1lbnQuAFUBVGhpcyBlc3NlbnRpYWxseSBmcmVlcyB1cCB0aGF0IGJhbGFuY2UgdG8gYmUgdXNlZCBieSB0aGUgc3Rhc2ggYWNjb3VudCB0byBkbyB3aGF0ZXZlciRpdCB3YW50cy4AFQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXyBieSB0aGUgY29udHJvbGxlci4ASEVtaXRzIGBXaXRoZHJhd25gLgBoU2VlIGFsc28gW2BDYWxsOjp1bmJvbmRgXS4ANCMjIFBhcmFtZXRlcnMAUQEtIGBudW1fc2xhc2hpbmdfc3BhbnNgIGluZGljYXRlcyB0aGUgbnVtYmVyIG9mIG1ldGFkYXRhIHNsYXNoaW5nIHNwYW5zIHRvIGNsZWFyIHdoZW5VAXRoaXMgY2FsbCByZXN1bHRzIGluIGEgY29tcGxldGUgcmVtb3ZhbCBvZiBhbGwgdGhlIGRhdGEgcmVsYXRlZCB0byB0aGUgc3Rhc2ggYWNjb3VudC49AUluIHRoaXMgY2FzZSwgdGhlIGBudW1fc2xhc2hpbmdfc3BhbnNgIG11c3QgYmUgbGFyZ2VyIG9yIGVxdWFsIHRvIHRoZSBudW1iZXIgb2ZdAXNsYXNoaW5nIHNwYW5zIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3Rhc2ggYWNjb3VudCBpbiB0aGUgW2BTbGFzaGluZ1NwYW5zYF0gc3RvcmFnZSB0eXBlLCUBb3RoZXJ3aXNlIHRoZSBjYWxsIHdpbGwgZmFpbC4gVGhlIGNhbGwgd2VpZ2h0IGlzIGRpcmVjdGx5IHByb3BvcnRpb25hbCB0b1RgbnVtX3NsYXNoaW5nX3NwYW5zYC4ANCMjIENvbXBsZXhpdHnYTyhTKSB3aGVyZSBTIGlzIHRoZSBudW1iZXIgb2Ygc2xhc2hpbmcgc3BhbnMgdG8gcmVtb3ZlCQFOT1RFOiBXZWlnaHQgYW5ub3RhdGlvbiBpcyB0aGUga2lsbCBzY2VuYXJpbywgd2UgcmVmdW5kIG90aGVyd2lzZS4gdmFsaWRhdGUEARRwcmVmc7ABOFZhbGlkYXRvclByZWZzAAQU5ERlY2xhcmUgdGhlIGRlc2lyZSB0byB2YWxpZGF0ZSBmb3IgdGhlIG9yaWdpbiBjb250cm9sbGVyLgDYRWZmZWN0cyB3aWxsIGJlIGZlbHQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbmV4dCBlcmEuAFEBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8gYnkgdGhlIGNvbnRyb2xsZXIsIG5vdCB0aGUgc3Rhc2guIG5vbWluYXRlBAEcdGFyZ2V0c90BAWRWZWM8QWNjb3VudElkTG9va3VwT2Y8VD4+AAUoDQFEZWNsYXJlIHRoZSBkZXNpcmUgdG8gbm9taW5hdGUgYHRhcmdldHNgIGZvciB0aGUgb3JpZ2luIGNvbnRyb2xsZXIuANhFZmZlY3RzIHdpbGwgYmUgZmVsdCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBuZXh0IGVyYS4AUQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXyBieSB0aGUgY29udHJvbGxlciwgbm90IHRoZSBzdGFzaC4ANCMjIENvbXBsZXhpdHktAS0gVGhlIHRyYW5zYWN0aW9uJ3MgY29tcGxleGl0eSBpcyBwcm9wb3J0aW9uYWwgdG8gdGhlIHNpemUgb2YgYHRhcmdldHNgIChOKQUBd2hpY2ggaXMgY2FwcGVkIGF0IENvbXBhY3RBc3NpZ25tZW50czo6TElNSVQgKFQ6Ok1heE5vbWluYXRpb25zKS7ULSBCb3RoIHRoZSByZWFkcyBhbmQgd3JpdGVzIGZvbGxvdyBhIHNpbWlsYXIgcGF0dGVybi4UY2hpbGwABijERGVjbGFyZSBubyBkZXNpcmUgdG8gZWl0aGVyIHZhbGlkYXRlIG9yIG5vbWluYXRlLgDYRWZmZWN0cyB3aWxsIGJlIGZlbHQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbmV4dCBlcmEuAFEBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8gYnkgdGhlIGNvbnRyb2xsZXIsIG5vdCB0aGUgc3Rhc2guADQjIyBDb21wbGV4aXR55C0gSW5kZXBlbmRlbnQgb2YgdGhlIGFyZ3VtZW50cy4gSW5zaWduaWZpY2FudCBjb21wbGV4aXR5LlAtIENvbnRhaW5zIG9uZSByZWFkLsQtIFdyaXRlcyBhcmUgbGltaXRlZCB0byB0aGUgYG9yaWdpbmAgYWNjb3VudCBrZXkuJHNldF9wYXllZQQBFHBheWVlqAF8UmV3YXJkRGVzdGluYXRpb248VDo6QWNjb3VudElkPgAHMLQoUmUtKXNldCB0aGUgcGF5bWVudCB0YXJnZXQgZm9yIGEgY29udHJvbGxlci4AUQFFZmZlY3RzIHdpbGwgYmUgZmVsdCBpbnN0YW50bHkgKGFzIHNvb24gYXMgdGhpcyBmdW5jdGlvbiBpcyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5KS4AUQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXyBieSB0aGUgY29udHJvbGxlciwgbm90IHRoZSBzdGFzaC4ANCMjIENvbXBsZXhpdHkYLSBPKDEp5C0gSW5kZXBlbmRlbnQgb2YgdGhlIGFyZ3VtZW50cy4gSW5zaWduaWZpY2FudCBjb21wbGV4aXR5LpQtIENvbnRhaW5zIGEgbGltaXRlZCBudW1iZXIgb2YgcmVhZHMuxC0gV3JpdGVzIGFyZSBsaW1pdGVkIHRvIHRoZSBgb3JpZ2luYCBhY2NvdW50IGtleS4kLS0tLS0tLS0tOHNldF9jb250cm9sbGVyAAg4RQEoUmUtKXNldHMgdGhlIGNvbnRyb2xsZXIgb2YgYSBzdGFzaCB0byB0aGUgc3Rhc2ggaXRzZWxmLiBUaGlzIGZ1bmN0aW9uIHByZXZpb3VzbHlNAWFjY2VwdGVkIGEgYGNvbnRyb2xsZXJgIGFyZ3VtZW50IHRvIHNldCB0aGUgY29udHJvbGxlciB0byBhbiBhY2NvdW50IG90aGVyIHRoYW4gdGhlWQFzdGFzaCBpdHNlbGYuIFRoaXMgZnVuY3Rpb25hbGl0eSBoYXMgbm93IGJlZW4gcmVtb3ZlZCwgbm93IG9ubHkgc2V0dGluZyB0aGUgY29udHJvbGxlcox0byB0aGUgc3Rhc2gsIGlmIGl0IGlzIG5vdCBhbHJlYWR5LgBRAUVmZmVjdHMgd2lsbCBiZSBmZWx0IGluc3RhbnRseSAoYXMgc29vbiBhcyB0aGlzIGZ1bmN0aW9uIGlzIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkpLgBRAVRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfIGJ5IHRoZSBzdGFzaCwgbm90IHRoZSBjb250cm9sbGVyLgA0IyMgQ29tcGxleGl0eRBPKDEp5C0gSW5kZXBlbmRlbnQgb2YgdGhlIGFyZ3VtZW50cy4gSW5zaWduaWZpY2FudCBjb21wbGV4aXR5LpQtIENvbnRhaW5zIGEgbGltaXRlZCBudW1iZXIgb2YgcmVhZHMuxC0gV3JpdGVzIGFyZSBsaW1pdGVkIHRvIHRoZSBgb3JpZ2luYCBhY2NvdW50IGtleS5Mc2V0X3ZhbGlkYXRvcl9jb3VudAQBDG5ld+wBDHUzMgAJGJBTZXRzIHRoZSBpZGVhbCBudW1iZXIgb2YgdmFsaWRhdG9ycy4AhFRoZSBkaXNwYXRjaCBvcmlnaW4gbXVzdCBiZSBSb290LgA0IyMgQ29tcGxleGl0eRBPKDEpYGluY3JlYXNlX3ZhbGlkYXRvcl9jb3VudAQBKGFkZGl0aW9uYWzsAQx1MzIAChzoSW5jcmVtZW50cyB0aGUgaWRlYWwgbnVtYmVyIG9mIHZhbGlkYXRvcnMgdXAgdG8gbWF4aW11bSBvZoxgRWxlY3Rpb25Qcm92aWRlckJhc2U6Ok1heFdpbm5lcnNgLgCEVGhlIGRpc3BhdGNoIG9yaWdpbiBtdXN0IGJlIFJvb3QuADQjIyBDb21wbGV4aXR5mFNhbWUgYXMgW2BTZWxmOjpzZXRfdmFsaWRhdG9yX2NvdW50YF0uVHNjYWxlX3ZhbGlkYXRvcl9jb3VudAQBGGZhY3RvcuEBARxQZXJjZW50AAscEQFTY2FsZSB1cCB0aGUgaWRlYWwgbnVtYmVyIG9mIHZhbGlkYXRvcnMgYnkgYSBmYWN0b3IgdXAgdG8gbWF4aW11bSBvZoxgRWxlY3Rpb25Qcm92aWRlckJhc2U6Ok1heFdpbm5lcnNgLgCEVGhlIGRpc3BhdGNoIG9yaWdpbiBtdXN0IGJlIFJvb3QuADQjIyBDb21wbGV4aXR5mFNhbWUgYXMgW2BTZWxmOjpzZXRfdmFsaWRhdG9yX2NvdW50YF0uNGZvcmNlX25vX2VyYXMADDSsRm9yY2UgdGhlcmUgdG8gYmUgbm8gbmV3IGVyYXMgaW5kZWZpbml0ZWx5LgCEVGhlIGRpc3BhdGNoIG9yaWdpbiBtdXN0IGJlIFJvb3QuACQjIFdhcm5pbmcAGQFUaGUgZWxlY3Rpb24gcHJvY2VzcyBzdGFydHMgbXVsdGlwbGUgYmxvY2tzIGJlZm9yZSB0aGUgZW5kIG9mIHRoZSBlcmEuOQFUaHVzIHRoZSBlbGVjdGlvbiBwcm9jZXNzIG1heSBiZSBvbmdvaW5nIHdoZW4gdGhpcyBpcyBjYWxsZWQuIEluIHRoaXMgY2FzZSB0aGXcZWxlY3Rpb24gd2lsbCBjb250aW51ZSB1bnRpbCB0aGUgbmV4dCBlcmEgaXMgdHJpZ2dlcmVkLgA0IyMgQ29tcGxleGl0eTwtIE5vIGFyZ3VtZW50cy44LSBXZWlnaHQ6IE8oMSk0Zm9yY2VfbmV3X2VyYQANOEkBRm9yY2UgdGhlcmUgdG8gYmUgYSBuZXcgZXJhIGF0IHRoZSBlbmQgb2YgdGhlIG5leHQgc2Vzc2lvbi4gQWZ0ZXIgdGhpcywgaXQgd2lsbCBiZZxyZXNldCB0byBub3JtYWwgKG5vbi1mb3JjZWQpIGJlaGF2aW91ci4AhFRoZSBkaXNwYXRjaCBvcmlnaW4gbXVzdCBiZSBSb290LgAkIyBXYXJuaW5nABkBVGhlIGVsZWN0aW9uIHByb2Nlc3Mgc3RhcnRzIG11bHRpcGxlIGJsb2NrcyBiZWZvcmUgdGhlIGVuZCBvZiB0aGUgZXJhLkkBSWYgdGhpcyBpcyBjYWxsZWQganVzdCBiZWZvcmUgYSBuZXcgZXJhIGlzIHRyaWdnZXJlZCwgdGhlIGVsZWN0aW9uIHByb2Nlc3MgbWF5IG5vdIxoYXZlIGVub3VnaCBibG9ja3MgdG8gZ2V0IGEgcmVzdWx0LgA0IyMgQ29tcGxleGl0eTwtIE5vIGFyZ3VtZW50cy44LSBXZWlnaHQ6IE8oMSlEc2V0X2ludnVsbmVyYWJsZXMEATRpbnZ1bG5lcmFibGVz0QEBRFZlYzxUOjpBY2NvdW50SWQ+AA4MyFNldCB0aGUgdmFsaWRhdG9ycyB3aG8gY2Fubm90IGJlIHNsYXNoZWQgKGlmIGFueSkuAIRUaGUgZGlzcGF0Y2ggb3JpZ2luIG11c3QgYmUgUm9vdC40Zm9yY2VfdW5zdGFrZQgBFHN0YXNoAAEwVDo6QWNjb3VudElkAAFIbnVtX3NsYXNoaW5nX3NwYW5zEAEMdTMyAA8gCQFGb3JjZSBhIGN1cnJlbnQgc3Rha2VyIHRvIGJlY29tZSBjb21wbGV0ZWx5IHVuc3Rha2VkLCBpbW1lZGlhdGVseS4AhFRoZSBkaXNwYXRjaCBvcmlnaW4gbXVzdCBiZSBSb290LgA0IyMgUGFyYW1ldGVycwBFAS0gYG51bV9zbGFzaGluZ19zcGFuc2A6IFJlZmVyIHRvIGNvbW1lbnRzIG9uIFtgQ2FsbDo6d2l0aGRyYXdfdW5ib25kZWRgXSBmb3IgbW9yZSBkZXRhaWxzLlBmb3JjZV9uZXdfZXJhX2Fsd2F5cwAQJAEBRm9yY2UgdGhlcmUgdG8gYmUgYSBuZXcgZXJhIGF0IHRoZSBlbmQgb2Ygc2Vzc2lvbnMgaW5kZWZpbml0ZWx5LgCEVGhlIGRpc3BhdGNoIG9yaWdpbiBtdXN0IGJlIFJvb3QuACQjIFdhcm5pbmcAGQFUaGUgZWxlY3Rpb24gcHJvY2VzcyBzdGFydHMgbXVsdGlwbGUgYmxvY2tzIGJlZm9yZSB0aGUgZW5kIG9mIHRoZSBlcmEuSQFJZiB0aGlzIGlzIGNhbGxlZCBqdXN0IGJlZm9yZSBhIG5ldyBlcmEgaXMgdHJpZ2dlcmVkLCB0aGUgZWxlY3Rpb24gcHJvY2VzcyBtYXkgbm90jGhhdmUgZW5vdWdoIGJsb2NrcyB0byBnZXQgYSByZXN1bHQuVGNhbmNlbF9kZWZlcnJlZF9zbGFzaAgBDGVyYRABIEVyYUluZGV4AAE0c2xhc2hfaW5kaWNlc+UBASBWZWM8dTMyPgARFJRDYW5jZWwgZW5hY3RtZW50IG9mIGEgZGVmZXJyZWQgc2xhc2guAJhDYW4gYmUgY2FsbGVkIGJ5IHRoZSBgVDo6QWRtaW5PcmlnaW5gLgABAVBhcmFtZXRlcnM6IGVyYSBhbmQgaW5kaWNlcyBvZiB0aGUgc2xhc2hlcyBmb3IgdGhhdCBlcmEgdG8ga2lsbC44cGF5b3V0X3N0YWtlcnMIATx2YWxpZGF0b3Jfc3Rhc2gAATBUOjpBY2NvdW50SWQAAQxlcmEQASBFcmFJbmRleAASNBkBUGF5IG91dCBuZXh0IHBhZ2Ugb2YgdGhlIHN0YWtlcnMgYmVoaW5kIGEgdmFsaWRhdG9yIGZvciB0aGUgZ2l2ZW4gZXJhLgDoLSBgdmFsaWRhdG9yX3N0YXNoYCBpcyB0aGUgc3Rhc2ggYWNjb3VudCBvZiB0aGUgdmFsaWRhdG9yLjEBLSBgZXJhYCBtYXkgYmUgYW55IGVyYSBiZXR3ZWVuIGBbY3VycmVudF9lcmEgLSBoaXN0b3J5X2RlcHRoOyBjdXJyZW50X2VyYV1gLgBVAVRoZSBvcmlnaW4gb2YgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uIEFueSBhY2NvdW50IGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24sIGV2ZW4gaWZ0aXQgaXMgbm90IG9uZSBvZiB0aGUgc3Rha2Vycy4ASQFUaGUgcmV3YXJkIHBheW91dCBjb3VsZCBiZSBwYWdlZCBpbiBjYXNlIHRoZXJlIGFyZSB0b28gbWFueSBub21pbmF0b3JzIGJhY2tpbmcgdGhlXQFgdmFsaWRhdG9yX3N0YXNoYC4gVGhpcyBjYWxsIHdpbGwgcGF5b3V0IHVucGFpZCBwYWdlcyBpbiBhbiBhc2NlbmRpbmcgb3JkZXIuIFRvIGNsYWltIGG0c3BlY2lmaWMgcGFnZSwgdXNlIGBwYXlvdXRfc3Rha2Vyc19ieV9wYWdlYC5gAPBJZiBhbGwgcGFnZXMgYXJlIGNsYWltZWQsIGl0IHJldHVybnMgYW4gZXJyb3IgYEludmFsaWRQYWdlYC4YcmVib25kBAEUdmFsdWX8ATBCYWxhbmNlT2Y8VD4AExzcUmVib25kIGEgcG9ydGlvbiBvZiB0aGUgc3Rhc2ggc2NoZWR1bGVkIHRvIGJlIHVubG9ja2VkLgDUVGhlIGRpc3BhdGNoIG9yaWdpbiBtdXN0IGJlIHNpZ25lZCBieSB0aGUgY29udHJvbGxlci4ANCMjIENvbXBsZXhpdHnQLSBUaW1lIGNvbXBsZXhpdHk6IE8oTCksIHdoZXJlIEwgaXMgdW5sb2NraW5nIGNodW5rc4gtIEJvdW5kZWQgYnkgYE1heFVubG9ja2luZ0NodW5rc2AuKHJlYXBfc3Rhc2gIARRzdGFzaAABMFQ6OkFjY291bnRJZAABSG51bV9zbGFzaGluZ19zcGFucxABDHUzMgAUSF0BUmVtb3ZlIGFsbCBkYXRhIHN0cnVjdHVyZXMgY29uY2VybmluZyBhIHN0YWtlci9zdGFzaCBvbmNlIGl0IGlzIGF0IGEgc3RhdGUgd2hlcmUgaXQgY2FuBQFiZSBjb25zaWRlcmVkIGBkdXN0YCBpbiB0aGUgc3Rha2luZyBzeXN0ZW0uIFRoZSByZXF1aXJlbWVudHMgYXJlOgAFATEuIHRoZSBgdG90YWxfYmFsYW5jZWAgb2YgdGhlIHN0YXNoIGlzIGJlbG93IGV4aXN0ZW50aWFsIGRlcG9zaXQuEQEyLiBvciwgdGhlIGBsZWRnZXIudG90YWxgIG9mIHRoZSBzdGFzaCBpcyBiZWxvdyBleGlzdGVudGlhbCBkZXBvc2l0LmEBMy4gb3IsIGV4aXN0ZW50aWFsIGRlcG9zaXQgaXMgemVybyBhbmQgZWl0aGVyIGB0b3RhbF9iYWxhbmNlYCBvciBgbGVkZ2VyLnRvdGFsYCBpcyB6ZXJvLgBVAVRoZSBmb3JtZXIgY2FuIGhhcHBlbiBpbiBjYXNlcyBsaWtlIGEgc2xhc2g7IHRoZSBsYXR0ZXIgd2hlbiBhIGZ1bGx5IHVuYm9uZGVkIGFjY291bnQJAWlzIHN0aWxsIHJlY2VpdmluZyBzdGFraW5nIHJld2FyZHMgaW4gYFJld2FyZERlc3RpbmF0aW9uOjpTdGFrZWRgLgAxAUl0IGNhbiBiZSBjYWxsZWQgYnkgYW55b25lLCBhcyBsb25nIGFzIGBzdGFzaGAgbWVldHMgdGhlIGFib3ZlIHJlcXVpcmVtZW50cy4A3FJlZnVuZHMgdGhlIHRyYW5zYWN0aW9uIGZlZXMgdXBvbiBzdWNjZXNzZnVsIGV4ZWN1dGlvbi4ANCMjIFBhcmFtZXRlcnMARQEtIGBudW1fc2xhc2hpbmdfc3BhbnNgOiBSZWZlciB0byBjb21tZW50cyBvbiBbYENhbGw6OndpdGhkcmF3X3VuYm9uZGVkYF0gZm9yIG1vcmUgZGV0YWlscy4Qa2ljawQBDHdob90BAWRWZWM8QWNjb3VudElkTG9va3VwT2Y8VD4+ABUs4FJlbW92ZSB0aGUgZ2l2ZW4gbm9taW5hdGlvbnMgZnJvbSB0aGUgY2FsbGluZyB2YWxpZGF0b3IuANhFZmZlY3RzIHdpbGwgYmUgZmVsdCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBuZXh0IGVyYS4AUQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXyBieSB0aGUgY29udHJvbGxlciwgbm90IHRoZSBzdGFzaC4ATQEtIGB3aG9gOiBBIGxpc3Qgb2Ygbm9taW5hdG9yIHN0YXNoIGFjY291bnRzIHdobyBhcmUgbm9taW5hdGluZyB0aGlzIHZhbGlkYXRvciB3aGljaMAgIHNob3VsZCBubyBsb25nZXIgYmUgbm9taW5hdGluZyB0aGlzIHZhbGlkYXRvci4AVQFOb3RlOiBNYWtpbmcgdGhpcyBjYWxsIG9ubHkgbWFrZXMgc2Vuc2UgaWYgeW91IGZpcnN0IHNldCB0aGUgdmFsaWRhdG9yIHByZWZlcmVuY2VzIHRveGJsb2NrIGFueSBmdXJ0aGVyIG5vbWluYXRpb25zLkxzZXRfc3Rha2luZ19jb25maWdzHAFIbWluX25vbWluYXRvcl9ib25k6QEBWENvbmZpZ09wPEJhbGFuY2VPZjxUPj4AAUhtaW5fdmFsaWRhdG9yX2JvbmTpAQFYQ29uZmlnT3A8QmFsYW5jZU9mPFQ+PgABTG1heF9ub21pbmF0b3JfY291bnTtAQE0Q29uZmlnT3A8dTMyPgABTG1heF92YWxpZGF0b3JfY291bnTtAQE0Q29uZmlnT3A8dTMyPgABPGNoaWxsX3RocmVzaG9sZPEBAURDb25maWdPcDxQZXJjZW50PgABOG1pbl9jb21taXNzaW9u9QEBRENvbmZpZ09wPFBlcmJpbGw+AAFIbWF4X3N0YWtlZF9yZXdhcmRz8QEBRENvbmZpZ09wPFBlcmNlbnQ+ABZErFVwZGF0ZSB0aGUgdmFyaW91cyBzdGFraW5nIGNvbmZpZ3VyYXRpb25zIC4AJQEqIGBtaW5fbm9taW5hdG9yX2JvbmRgOiBUaGUgbWluaW11bSBhY3RpdmUgYm9uZCBuZWVkZWQgdG8gYmUgYSBub21pbmF0b3IuJQEqIGBtaW5fdmFsaWRhdG9yX2JvbmRgOiBUaGUgbWluaW11bSBhY3RpdmUgYm9uZCBuZWVkZWQgdG8gYmUgYSB2YWxpZGF0b3IuVQEqIGBtYXhfbm9taW5hdG9yX2NvdW50YDogVGhlIG1heCBudW1iZXIgb2YgdXNlcnMgd2hvIGNhbiBiZSBhIG5vbWluYXRvciBhdCBvbmNlLiBXaGVumCAgc2V0IHRvIGBOb25lYCwgbm8gbGltaXQgaXMgZW5mb3JjZWQuVQEqIGBtYXhfdmFsaWRhdG9yX2NvdW50YDogVGhlIG1heCBudW1iZXIgb2YgdXNlcnMgd2hvIGNhbiBiZSBhIHZhbGlkYXRvciBhdCBvbmNlLiBXaGVumCAgc2V0IHRvIGBOb25lYCwgbm8gbGltaXQgaXMgZW5mb3JjZWQuWQEqIGBjaGlsbF90aHJlc2hvbGRgOiBUaGUgcmF0aW8gb2YgYG1heF9ub21pbmF0b3JfY291bnRgIG9yIGBtYXhfdmFsaWRhdG9yX2NvdW50YCB3aGljaBkBICBzaG91bGQgYmUgZmlsbGVkIGluIG9yZGVyIGZvciB0aGUgYGNoaWxsX290aGVyYCB0cmFuc2FjdGlvbiB0byB3b3JrLmEBKiBgbWluX2NvbW1pc3Npb25gOiBUaGUgbWluaW11bSBhbW91bnQgb2YgY29tbWlzc2lvbiB0aGF0IGVhY2ggdmFsaWRhdG9ycyBtdXN0IG1haW50YWluLlUBICBUaGlzIGlzIGNoZWNrZWQgb25seSB1cG9uIGNhbGxpbmcgYHZhbGlkYXRlYC4gRXhpc3RpbmcgdmFsaWRhdG9ycyBhcmUgbm90IGFmZmVjdGVkLgDEUnVudGltZU9yaWdpbiBtdXN0IGJlIFJvb3QgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uLgA1AU5PVEU6IEV4aXN0aW5nIG5vbWluYXRvcnMgYW5kIHZhbGlkYXRvcnMgd2lsbCBub3QgYmUgYWZmZWN0ZWQgYnkgdGhpcyB1cGRhdGUuEQF0byBraWNrIHBlb3BsZSB1bmRlciB0aGUgbmV3IGxpbWl0cywgYGNoaWxsX290aGVyYCBzaG91bGQgYmUgY2FsbGVkLixjaGlsbF9vdGhlcgQBFHN0YXNoAAEwVDo6QWNjb3VudElkABdoQQFEZWNsYXJlIGEgYGNvbnRyb2xsZXJgIHRvIHN0b3AgcGFydGljaXBhdGluZyBhcyBlaXRoZXIgYSB2YWxpZGF0b3Igb3Igbm9taW5hdG9yLgDYRWZmZWN0cyB3aWxsIGJlIGZlbHQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbmV4dCBlcmEuAEEBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8sIGJ1dCBjYW4gYmUgY2FsbGVkIGJ5IGFueW9uZS4AWQFJZiB0aGUgY2FsbGVyIGlzIHRoZSBzYW1lIGFzIHRoZSBjb250cm9sbGVyIGJlaW5nIHRhcmdldGVkLCB0aGVuIG5vIGZ1cnRoZXIgY2hlY2tzIGFyZdhlbmZvcmNlZCwgYW5kIHRoaXMgZnVuY3Rpb24gYmVoYXZlcyBqdXN0IGxpa2UgYGNoaWxsYC4AXQFJZiB0aGUgY2FsbGVyIGlzIGRpZmZlcmVudCB0aGFuIHRoZSBjb250cm9sbGVyIGJlaW5nIHRhcmdldGVkLCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMwbXVzdCBiZSBtZXQ6AB0BKiBgY29udHJvbGxlcmAgbXVzdCBiZWxvbmcgdG8gYSBub21pbmF0b3Igd2hvIGhhcyBiZWNvbWUgbm9uLWRlY29kYWJsZSwADE9yOgA9ASogQSBgQ2hpbGxUaHJlc2hvbGRgIG11c3QgYmUgc2V0IGFuZCBjaGVja2VkIHdoaWNoIGRlZmluZXMgaG93IGNsb3NlIHRvIHRoZSBtYXhVASAgbm9taW5hdG9ycyBvciB2YWxpZGF0b3JzIHdlIG11c3QgcmVhY2ggYmVmb3JlIHVzZXJzIGNhbiBzdGFydCBjaGlsbGluZyBvbmUtYW5vdGhlci5ZASogQSBgTWF4Tm9taW5hdG9yQ291bnRgIGFuZCBgTWF4VmFsaWRhdG9yQ291bnRgIG11c3QgYmUgc2V0IHdoaWNoIGlzIHVzZWQgdG8gZGV0ZXJtaW5lkCAgaG93IGNsb3NlIHdlIGFyZSB0byB0aGUgdGhyZXNob2xkLl0BKiBBIGBNaW5Ob21pbmF0b3JCb25kYCBhbmQgYE1pblZhbGlkYXRvckJvbmRgIG11c3QgYmUgc2V0IGFuZCBjaGVja2VkLCB3aGljaCBkZXRlcm1pbmVzUQEgIGlmIHRoaXMgaXMgYSBwZXJzb24gdGhhdCBzaG91bGQgYmUgY2hpbGxlZCBiZWNhdXNlIHRoZXkgaGF2ZSBub3QgbWV0IHRoZSB0aHJlc2hvbGRAICBib25kIHJlcXVpcmVkLgBVAVRoaXMgY2FuIGJlIGhlbHBmdWwgaWYgYm9uZCByZXF1aXJlbWVudHMgYXJlIHVwZGF0ZWQsIGFuZCB3ZSBuZWVkIHRvIHJlbW92ZSBvbGQgdXNlcnOYd2hvIGRvIG5vdCBzYXRpc2Z5IHRoZXNlIHJlcXVpcmVtZW50cy5oZm9yY2VfYXBwbHlfbWluX2NvbW1pc3Npb24EATx2YWxpZGF0b3Jfc3Rhc2gAATBUOjpBY2NvdW50SWQAGAxFAUZvcmNlIGEgdmFsaWRhdG9yIHRvIGhhdmUgYXQgbGVhc3QgdGhlIG1pbmltdW0gY29tbWlzc2lvbi4gVGhpcyB3aWxsIG5vdCBhZmZlY3QgYWEBdmFsaWRhdG9yIHdobyBhbHJlYWR5IGhhcyBhIGNvbW1pc3Npb24gZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBtaW5pbXVtLiBBbnkgYWNjb3VudDhjYW4gY2FsbCB0aGlzLkhzZXRfbWluX2NvbW1pc3Npb24EAQxuZXesARxQZXJiaWxsABkQJQFTZXRzIHRoZSBtaW5pbXVtIGFtb3VudCBvZiBjb21taXNzaW9uIHRoYXQgZWFjaCB2YWxpZGF0b3JzIG11c3QgbWFpbnRhaW4uAFkBVGhpcyBjYWxsIGhhcyBsb3dlciBwcml2aWxlZ2UgcmVxdWlyZW1lbnRzIHRoYW4gYHNldF9zdGFraW5nX2NvbmZpZ2AgYW5kIGNhbiBiZSBjYWxsZWTMYnkgdGhlIGBUOjpBZG1pbk9yaWdpbmAuIFJvb3QgY2FuIGFsd2F5cyBjYWxsIHRoaXMuWHBheW91dF9zdGFrZXJzX2J5X3BhZ2UMATx2YWxpZGF0b3Jfc3Rhc2gAATBUOjpBY2NvdW50SWQAAQxlcmEQASBFcmFJbmRleAABEHBhZ2UQARBQYWdlABpEMQFQYXkgb3V0IGEgcGFnZSBvZiB0aGUgc3Rha2VycyBiZWhpbmQgYSB2YWxpZGF0b3IgZm9yIHRoZSBnaXZlbiBlcmEgYW5kIHBhZ2UuAOgtIGB2YWxpZGF0b3Jfc3Rhc2hgIGlzIHRoZSBzdGFzaCBhY2NvdW50IG9mIHRoZSB2YWxpZGF0b3IuMQEtIGBlcmFgIG1heSBiZSBhbnkgZXJhIGJldHdlZW4gYFtjdXJyZW50X2VyYSAtIGhpc3RvcnlfZGVwdGg7IGN1cnJlbnRfZXJhXWAuMQEtIGBwYWdlYCBpcyB0aGUgcGFnZSBpbmRleCBvZiBub21pbmF0b3JzIHRvIHBheSBvdXQgd2l0aCB2YWx1ZSBiZXR3ZWVuIDAgYW5ksCAgYG51bV9ub21pbmF0b3JzIC8gVDo6TWF4RXhwb3N1cmVQYWdlU2l6ZWAuAFUBVGhlIG9yaWdpbiBvZiB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXy4gQW55IGFjY291bnQgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbiwgZXZlbiBpZnRpdCBpcyBub3Qgb25lIG9mIHRoZSBzdGFrZXJzLgA9AUlmIGEgdmFsaWRhdG9yIGhhcyBtb3JlIHRoYW4gW2BDb25maWc6Ok1heEV4cG9zdXJlUGFnZVNpemVgXSBub21pbmF0b3JzIGJhY2tpbmcpAXRoZW0sIHRoZW4gdGhlIGxpc3Qgb2Ygbm9taW5hdG9ycyBpcyBwYWdlZCwgd2l0aCBlYWNoIHBhZ2UgYmVpbmcgY2FwcGVkIGF0VQFbYENvbmZpZzo6TWF4RXhwb3N1cmVQYWdlU2l6ZWAuXSBJZiBhIHZhbGlkYXRvciBoYXMgbW9yZSB0aGFuIG9uZSBwYWdlIG9mIG5vbWluYXRvcnMsSQF0aGUgY2FsbCBuZWVkcyB0byBiZSBtYWRlIGZvciBlYWNoIHBhZ2Ugc2VwYXJhdGVseSBpbiBvcmRlciBmb3IgYWxsIHRoZSBub21pbmF0b3JzVQFiYWNraW5nIGEgdmFsaWRhdG9yIHRvIHJlY2VpdmUgdGhlIHJld2FyZC4gVGhlIG5vbWluYXRvcnMgYXJlIG5vdCBzb3J0ZWQgYWNyb3NzIHBhZ2VzYQFhbmQgc28gaXQgc2hvdWxkIG5vdCBiZSBhc3N1bWVkIHRoZSBoaWdoZXN0IHN0YWtlciB3b3VsZCBiZSBvbiB0aGUgdG9wbW9zdCBwYWdlIGFuZCB2aWNlSQF2ZXJzYS4gSWYgcmV3YXJkcyBhcmUgbm90IGNsYWltZWQgaW4gW2BDb25maWc6Okhpc3RvcnlEZXB0aGBdIGVyYXMsIHRoZXkgYXJlIGxvc3QuMHVwZGF0ZV9wYXllZQQBKGNvbnRyb2xsZXIAATBUOjpBY2NvdW50SWQAGxjgTWlncmF0ZXMgYW4gYWNjb3VudCdzIGBSZXdhcmREZXN0aW5hdGlvbjo6Q29udHJvbGxlcmAgdG+kYFJld2FyZERlc3RpbmF0aW9uOjpBY2NvdW50KGNvbnRyb2xsZXIpYC4AUQFFZmZlY3RzIHdpbGwgYmUgZmVsdCBpbnN0YW50bHkgKGFzIHNvb24gYXMgdGhpcyBmdW5jdGlvbiBpcyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5KS4AMQFUaGlzIHdpbGwgd2FpdmUgdGhlIHRyYW5zYWN0aW9uIGZlZSBpZiB0aGUgYHBheWVlYCBpcyBzdWNjZXNzZnVsbHkgbWlncmF0ZWQuaGRlcHJlY2F0ZV9jb250cm9sbGVyX2JhdGNoBAEsY29udHJvbGxlcnP5AQH0Qm91bmRlZFZlYzxUOjpBY2NvdW50SWQsIFQ6Ok1heENvbnRyb2xsZXJzSW5EZXByZWNhdGlvbkJhdGNoPgAcHF0BVXBkYXRlcyBhIGJhdGNoIG9mIGNvbnRyb2xsZXIgYWNjb3VudHMgdG8gdGhlaXIgY29ycmVzcG9uZGluZyBzdGFzaCBhY2NvdW50IGlmIHRoZXkgYXJlYQFub3QgdGhlIHNhbWUuIElnbm9yZXMgYW55IGNvbnRyb2xsZXIgYWNjb3VudHMgdGhhdCBkbyBub3QgZXhpc3QsIGFuZCBkb2VzIG5vdCBvcGVyYXRlIGlmuHRoZSBzdGFzaCBhbmQgY29udHJvbGxlciBhcmUgYWxyZWFkeSB0aGUgc2FtZS4AUQFFZmZlY3RzIHdpbGwgYmUgZmVsdCBpbnN0YW50bHkgKGFzIHNvb24gYXMgdGhpcyBmdW5jdGlvbiBpcyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5KS4AtFRoZSBkaXNwYXRjaCBvcmlnaW4gbXVzdCBiZSBgVDo6QWRtaW5PcmlnaW5gLjhyZXN0b3JlX2xlZGdlchABFHN0YXNoAAEwVDo6QWNjb3VudElkAAFAbWF5YmVfY29udHJvbGxlcv0BAVBPcHRpb248VDo6QWNjb3VudElkPgABLG1heWJlX3RvdGFsAQIBUE9wdGlvbjxCYWxhbmNlT2Y8VD4+AAE8bWF5YmVfdW5sb2NraW5nBQIBFQFPcHRpb248Qm91bmRlZFZlYzxVbmxvY2tDaHVuazxCYWxhbmNlT2Y8VD4+LCBUOjoKTWF4VW5sb2NraW5nQ2h1bmtzPj4AHSwFAVJlc3RvcmVzIHRoZSBzdGF0ZSBvZiBhIGxlZGdlciB3aGljaCBpcyBpbiBhbiBpbmNvbnNpc3RlbnQgc3RhdGUuANxUaGUgcmVxdWlyZW1lbnRzIHRvIHJlc3RvcmUgYSBsZWRnZXIgYXJlIHRoZSBmb2xsb3dpbmc6ZCogVGhlIHN0YXNoIGlzIGJvbmRlZDsgb3INASogVGhlIHN0YXNoIGlzIG5vdCBib25kZWQgYnV0IGl0IGhhcyBhIHN0YWtpbmcgbG9jayBsZWZ0IGJlaGluZDsgb3IlASogSWYgdGhlIHN0YXNoIGhhcyBhbiBhc3NvY2lhdGVkIGxlZGdlciBhbmQgaXRzIHN0YXRlIGlzIGluY29uc2lzdGVudDsgb3IdASogSWYgdGhlIGxlZGdlciBpcyBub3QgY29ycnVwdGVkICpidXQqIGl0cyBzdGFraW5nIGxvY2sgaXMgb3V0IG9mIHN5bmMuAGEBVGhlIGBtYXliZV8qYCBpbnB1dCBwYXJhbWV0ZXJzIHdpbGwgb3ZlcndyaXRlIHRoZSBjb3JyZXNwb25kaW5nIGRhdGEgYW5kIG1ldGFkYXRhIG9mIHRoZVkBbGVkZ2VyIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3Rhc2guIElmIHRoZSBpbnB1dCBwYXJhbWV0ZXJzIGFyZSBub3Qgc2V0LCB0aGUgbGVkZ2VyIHdpbGyQYmUgcmVzZXQgdmFsdWVzIGZyb20gb24tY2hhaW4gc3RhdGUuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLt0BAAACxQEA4QEMNHNwX2FyaXRobWV0aWMocGVyX3RoaW5ncxxQZXJjZW50AAAEAAgBCHU4AADlAQAAAhAA6QEQOHBhbGxldF9zdGFraW5nGHBhbGxldBhwYWxsZXQgQ29uZmlnT3AEBFQBGAEMEE5vb3AAAAAMU2V0BAAYAQRUAAEAGFJlbW92ZQACAADtARA4cGFsbGV0X3N0YWtpbmcYcGFsbGV0GHBhbGxldCBDb25maWdPcAQEVAEQAQwQTm9vcAAAAAxTZXQEABABBFQAAQAYUmVtb3ZlAAIAAPEBEDhwYWxsZXRfc3Rha2luZxhwYWxsZXQYcGFsbGV0IENvbmZpZ09wBARUAeEBAQwQTm9vcAAAAAxTZXQEAOEBAQRUAAEAGFJlbW92ZQACAAD1ARA4cGFsbGV0X3N0YWtpbmcYcGFsbGV0GHBhbGxldCBDb25maWdPcAQEVAGsAQwQTm9vcAAAAAxTZXQEAKwBBFQAAQAYUmVtb3ZlAAIAAPkBDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBAARTAAAEANEBARhWZWM8VD4AAP0BBBhPcHRpb24EBFQBAAEIEE5vbmUAAAAQU29tZQQAAAAAAQAAAQIEGE9wdGlvbgQEVAEYAQgQTm9uZQAAABBTb21lBAAYAAABAAAFAgQYT3B0aW9uBARUAQkCAQgQTm9uZQAAABBTb21lBAAJAgAAAQAACQIMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAENAgRTAAAEABECARhWZWM8VD4AAA0CCDhwYWxsZXRfc3Rha2luZyxVbmxvY2tDaHVuawQcQmFsYW5jZQEYAAgBFHZhbHVl/AEcQmFsYW5jZQABDGVyYewBIEVyYUluZGV4AAARAgAAAg0CABUCDDhwYWxsZXRfc2Vzc2lvbhhwYWxsZXQQQ2FsbAQEVAABCCBzZXRfa2V5cwgBEGtleXMZAgEcVDo6S2V5cwABFHByb29mOAEcVmVjPHU4PgAAJORTZXRzIHRoZSBzZXNzaW9uIGtleShzKSBvZiB0aGUgZnVuY3Rpb24gY2FsbGVyIHRvIGBrZXlzYC4dAUFsbG93cyBhbiBhY2NvdW50IHRvIHNldCBpdHMgc2Vzc2lvbiBrZXkgcHJpb3IgdG8gYmVjb21pbmcgYSB2YWxpZGF0b3IuwFRoaXMgZG9lc24ndCB0YWtlIGVmZmVjdCB1bnRpbCB0aGUgbmV4dCBzZXNzaW9uLgDQVGhlIGRpc3BhdGNoIG9yaWdpbiBvZiB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgc2lnbmVkLgA0IyMgQ29tcGxleGl0eVkBLSBgTygxKWAuIEFjdHVhbCBjb3N0IGRlcGVuZHMgb24gdGhlIG51bWJlciBvZiBsZW5ndGggb2YgYFQ6OktleXM6OmtleV9pZHMoKWAgd2hpY2ggaXMgICBmaXhlZC4ocHVyZ2Vfa2V5cwABMMhSZW1vdmVzIGFueSBzZXNzaW9uIGtleShzKSBvZiB0aGUgZnVuY3Rpb24gY2FsbGVyLgDAVGhpcyBkb2Vzbid0IHRha2UgZWZmZWN0IHVudGlsIHRoZSBuZXh0IHNlc3Npb24uAFUBVGhlIGRpc3BhdGNoIG9yaWdpbiBvZiB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgU2lnbmVkIGFuZCB0aGUgYWNjb3VudCBtdXN0IGJlIGVpdGhlciBiZV0BY29udmVydGlibGUgdG8gYSB2YWxpZGF0b3IgSUQgdXNpbmcgdGhlIGNoYWluJ3MgdHlwaWNhbCBhZGRyZXNzaW5nIHN5c3RlbSAodGhpcyB1c3VhbGx5UQFtZWFucyBiZWluZyBhIGNvbnRyb2xsZXIgYWNjb3VudCkgb3IgZGlyZWN0bHkgY29udmVydGlibGUgaW50byBhIHZhbGlkYXRvciBJRCAod2hpY2iUdXN1YWxseSBtZWFucyBiZWluZyBhIHN0YXNoIGFjY291bnQpLgA0IyMgQ29tcGxleGl0eT0BLSBgTygxKWAgaW4gbnVtYmVyIG9mIGtleSB0eXBlcy4gQWN0dWFsIGNvc3QgZGVwZW5kcyBvbiB0aGUgbnVtYmVyIG9mIGxlbmd0aCBvZpggIGBUOjpLZXlzOjprZXlfaWRzKClgIHdoaWNoIGlzIGZpeGVkLgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy4ZAghAcG9sa2Fkb3RfcnVudGltZSxTZXNzaW9uS2V5cwAAGAEcZ3JhbmRwYdQB0DxHcmFuZHBhIGFzICRjcmF0ZTo6Qm91bmRUb1J1bnRpbWVBcHBQdWJsaWM+OjpQdWJsaWMAARBiYWJlpQEBxDxCYWJlIGFzICRjcmF0ZTo6Qm91bmRUb1J1bnRpbWVBcHBQdWJsaWM+OjpQdWJsaWMAAThwYXJhX3ZhbGlkYXRvch0CAeA8SW5pdGlhbGl6ZXIgYXMgJGNyYXRlOjpCb3VuZFRvUnVudGltZUFwcFB1YmxpYz46OlB1YmxpYwABPHBhcmFfYXNzaWdubWVudCECAfA8UGFyYVNlc3Npb25JbmZvIGFzICRjcmF0ZTo6Qm91bmRUb1J1bnRpbWVBcHBQdWJsaWM+OjpQdWJsaWMAAUxhdXRob3JpdHlfZGlzY292ZXJ5JQIB/DxBdXRob3JpdHlEaXNjb3ZlcnkgYXMgJGNyYXRlOjpCb3VuZFRvUnVudGltZUFwcFB1YmxpYz46OlB1YmxpYwABFGJlZWZ5KQIByDxCZWVmeSBhcyAkY3JhdGU6OkJvdW5kVG9SdW50aW1lQXBwUHVibGljPjo6UHVibGljAAAdAhBMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2NzR2YWxpZGF0b3JfYXBwGFB1YmxpYwAABAAEATxzcjI1NTE5OjpQdWJsaWMAACECEExwb2xrYWRvdF9wcmltaXRpdmVzCHY3OGFzc2lnbm1lbnRfYXBwGFB1YmxpYwAABAAEATxzcjI1NTE5OjpQdWJsaWMAACUCDFhzcF9hdXRob3JpdHlfZGlzY292ZXJ5DGFwcBhQdWJsaWMAAAQABAE8c3IyNTUxOTo6UHVibGljAAApAgxIc3BfY29uc2Vuc3VzX2JlZWZ5MGVjZHNhX2NyeXB0bxhQdWJsaWMAAAQALQIBNGVjZHNhOjpQdWJsaWMAAC0CAAADIQAAAAgAMQIMOHBhbGxldF9ncmFuZHBhGHBhbGxldBBDYWxsBARUAAEMTHJlcG9ydF9lcXVpdm9jYXRpb24IAUhlcXVpdm9jYXRpb25fcHJvb2Y1AgHIQm94PEVxdWl2b2NhdGlvblByb29mPFQ6Okhhc2gsIEJsb2NrTnVtYmVyRm9yPFQ+Pj4AATxrZXlfb3duZXJfcHJvb2atAQFAVDo6S2V5T3duZXJQcm9vZgAAEAkBUmVwb3J0IHZvdGVyIGVxdWl2b2NhdGlvbi9taXNiZWhhdmlvci4gVGhpcyBtZXRob2Qgd2lsbCB2ZXJpZnkgdGhl9GVxdWl2b2NhdGlvbiBwcm9vZiBhbmQgdmFsaWRhdGUgdGhlIGdpdmVuIGtleSBvd25lcnNoaXAgcHJvb2b4YWdhaW5zdCB0aGUgZXh0cmFjdGVkIG9mZmVuZGVyLiBJZiBib3RoIGFyZSB2YWxpZCwgdGhlIG9mZmVuY2VEd2lsbCBiZSByZXBvcnRlZC5wcmVwb3J0X2VxdWl2b2NhdGlvbl91bnNpZ25lZAgBSGVxdWl2b2NhdGlvbl9wcm9vZjUCAchCb3g8RXF1aXZvY2F0aW9uUHJvb2Y8VDo6SGFzaCwgQmxvY2tOdW1iZXJGb3I8VD4+PgABPGtleV9vd25lcl9wcm9vZq0BAUBUOjpLZXlPd25lclByb29mAAEkCQFSZXBvcnQgdm90ZXIgZXF1aXZvY2F0aW9uL21pc2JlaGF2aW9yLiBUaGlzIG1ldGhvZCB3aWxsIHZlcmlmeSB0aGX0ZXF1aXZvY2F0aW9uIHByb29mIGFuZCB2YWxpZGF0ZSB0aGUgZ2l2ZW4ga2V5IG93bmVyc2hpcCBwcm9vZvhhZ2FpbnN0IHRoZSBleHRyYWN0ZWQgb2ZmZW5kZXIuIElmIGJvdGggYXJlIHZhbGlkLCB0aGUgb2ZmZW5jZUR3aWxsIGJlIHJlcG9ydGVkLgANAVRoaXMgZXh0cmluc2ljIG11c3QgYmUgY2FsbGVkIHVuc2lnbmVkIGFuZCBpdCBpcyBleHBlY3RlZCB0aGF0IG9ubHkVAWJsb2NrIGF1dGhvcnMgd2lsbCBjYWxsIGl0ICh2YWxpZGF0ZWQgaW4gYFZhbGlkYXRlVW5zaWduZWRgKSwgYXMgc3VjaBUBaWYgdGhlIGJsb2NrIGF1dGhvciBpcyBkZWZpbmVkIGl0IHdpbGwgYmUgZGVmaW5lZCBhcyB0aGUgZXF1aXZvY2F0aW9uJHJlcG9ydGVyLjBub3RlX3N0YWxsZWQIARRkZWxheRABREJsb2NrTnVtYmVyRm9yPFQ+AAFsYmVzdF9maW5hbGl6ZWRfYmxvY2tfbnVtYmVyEAFEQmxvY2tOdW1iZXJGb3I8VD4AAjA9AU5vdGUgdGhhdCB0aGUgY3VycmVudCBhdXRob3JpdHkgc2V0IG9mIHRoZSBHUkFORFBBIGZpbmFsaXR5IGdhZGdldCBoYXMgc3RhbGxlZC4AYQFUaGlzIHdpbGwgdHJpZ2dlciBhIGZvcmNlZCBhdXRob3JpdHkgc2V0IGNoYW5nZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBuZXh0IHNlc3Npb24sIHRvYQFiZSBlbmFjdGVkIGBkZWxheWAgYmxvY2tzIGFmdGVyIHRoYXQuIFRoZSBgZGVsYXlgIHNob3VsZCBiZSBoaWdoIGVub3VnaCB0byBzYWZlbHkgYXNzdW1lSQF0aGF0IHRoZSBibG9jayBzaWduYWxsaW5nIHRoZSBmb3JjZWQgY2hhbmdlIHdpbGwgbm90IGJlIHJlLW9yZ2VkIGUuZy4gMTAwMCBibG9ja3MuXQFUaGUgYmxvY2sgcHJvZHVjdGlvbiByYXRlICh3aGljaCBtYXkgYmUgc2xvd2VkIGRvd24gYmVjYXVzZSBvZiBmaW5hbGl0eSBsYWdnaW5nKSBzaG91bGRRAWJlIHRha2VuIGludG8gYWNjb3VudCB3aGVuIGNob29zaW5nIHRoZSBgZGVsYXlgLiBUaGUgR1JBTkRQQSB2b3RlcnMgYmFzZWQgb24gdGhlIG5ld1UBYXV0aG9yaXR5IHdpbGwgc3RhcnQgdm90aW5nIG9uIHRvcCBvZiBgYmVzdF9maW5hbGl6ZWRfYmxvY2tfbnVtYmVyYCBmb3IgbmV3IGZpbmFsaXplZE0BYmxvY2tzLiBgYmVzdF9maW5hbGl6ZWRfYmxvY2tfbnVtYmVyYCBzaG91bGQgYmUgdGhlIGhpZ2hlc3Qgb2YgdGhlIGxhdGVzdCBmaW5hbGl6ZWTEYmxvY2sgb2YgYWxsIHZhbGlkYXRvcnMgb2YgdGhlIG5ldyBhdXRob3JpdHkgc2V0LgBYT25seSBjYWxsYWJsZSBieSByb290LgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy41AghQc3BfY29uc2Vuc3VzX2dyYW5kcGFERXF1aXZvY2F0aW9uUHJvb2YIBEgBNAROARAACAEYc2V0X2lkMAEUU2V0SWQAATBlcXVpdm9jYXRpb245AgFIRXF1aXZvY2F0aW9uPEgsIE4+AAA5AghQc3BfY29uc2Vuc3VzX2dyYW5kcGEwRXF1aXZvY2F0aW9uCARIATQETgEQAQgcUHJldm90ZQQAPQIBiQFmaW5hbGl0eV9ncmFuZHBhOjpFcXVpdm9jYXRpb248QXV0aG9yaXR5SWQsIGZpbmFsaXR5X2dyYW5kcGE6OlByZXZvdGU8CkgsIE4+LCBBdXRob3JpdHlTaWduYXR1cmUsPgAAACRQcmVjb21taXQEAFECAZEBZmluYWxpdHlfZ3JhbmRwYTo6RXF1aXZvY2F0aW9uPEF1dGhvcml0eUlkLCBmaW5hbGl0eV9ncmFuZHBhOjpQcmVjb21taXQKPEgsIE4+LCBBdXRob3JpdHlTaWduYXR1cmUsPgABAAA9AghAZmluYWxpdHlfZ3JhbmRwYTBFcXVpdm9jYXRpb24MCElkAdQEVgFBAgRTAUUCABABMHJvdW5kX251bWJlcjABDHU2NAABIGlkZW50aXR51AEISWQAARRmaXJzdE0CARgoViwgUykAARhzZWNvbmRNAgEYKFYsIFMpAABBAghAZmluYWxpdHlfZ3JhbmRwYRxQcmV2b3RlCARIATQETgEQAAgBLHRhcmdldF9oYXNoNAEESAABNHRhcmdldF9udW1iZXIQAQROAABFAgxQc3BfY29uc2Vuc3VzX2dyYW5kcGEMYXBwJFNpZ25hdHVyZQAABABJAgFIZWQyNTUxOTo6U2lnbmF0dXJlAABJAgAAA0AAAAAIAE0CAAAECEECRQIAUQIIQGZpbmFsaXR5X2dyYW5kcGEwRXF1aXZvY2F0aW9uDAhJZAHUBFYBVQIEUwFFAgAQATByb3VuZF9udW1iZXIwAQx1NjQAASBpZGVudGl0edQBCElkAAEUZmlyc3RZAgEYKFYsIFMpAAEYc2Vjb25kWQIBGChWLCBTKQAAVQIIQGZpbmFsaXR5X2dyYW5kcGEkUHJlY29tbWl0CARIATQETgEQAAgBLHRhcmdldF9oYXNoNAEESAABNHRhcmdldF9udW1iZXIQAQROAABZAgAABAhVAkUCAF0CDDxwYWxsZXRfdHJlYXN1cnkYcGFsbGV0EENhbGwIBFQABEkAARgsc3BlbmRfbG9jYWwIARhhbW91bnT8ATxCYWxhbmNlT2Y8VCwgST4AASxiZW5lZmljaWFyecUBAVBBY2NvdW50SWRMb29rdXBPZjxUPgADRLhQcm9wb3NlIGFuZCBhcHByb3ZlIGEgc3BlbmQgb2YgdHJlYXN1cnkgZnVuZHMuAEgjIyBEaXNwYXRjaCBPcmlnaW4ARQFNdXN0IGJlIFtgQ29uZmlnOjpTcGVuZE9yaWdpbmBdIHdpdGggdGhlIGBTdWNjZXNzYCB2YWx1ZSBiZWluZyBhdCBsZWFzdCBgYW1vdW50YC4ALCMjIyBEZXRhaWxzRQFOT1RFOiBGb3IgcmVjb3JkLWtlZXBpbmcgcHVycG9zZXMsIHRoZSBwcm9wb3NlciBpcyBkZWVtZWQgdG8gYmUgZXF1aXZhbGVudCB0byB0aGUwYmVuZWZpY2lhcnkuADgjIyMgUGFyYW1ldGVyc0EBLSBgYW1vdW50YDogVGhlIGFtb3VudCB0byBiZSB0cmFuc2ZlcnJlZCBmcm9tIHRoZSB0cmVhc3VyeSB0byB0aGUgYGJlbmVmaWNpYXJ5YC7oLSBgYmVuZWZpY2lhcnlgOiBUaGUgZGVzdGluYXRpb24gYWNjb3VudCBmb3IgdGhlIHRyYW5zZmVyLgAkIyMgRXZlbnRzALRFbWl0cyBbYEV2ZW50OjpTcGVuZEFwcHJvdmVkYF0gaWYgc3VjY2Vzc2Z1bC48cmVtb3ZlX2FwcHJvdmFsBAEscHJvcG9zYWxfaWTsATRQcm9wb3NhbEluZGV4AARULQFGb3JjZSBhIHByZXZpb3VzbHkgYXBwcm92ZWQgcHJvcG9zYWwgdG8gYmUgcmVtb3ZlZCBmcm9tIHRoZSBhcHByb3ZhbCBxdWV1ZS4ASCMjIERpc3BhdGNoIE9yaWdpbgCETXVzdCBiZSBbYENvbmZpZzo6UmVqZWN0T3JpZ2luYF0uACgjIyBEZXRhaWxzAMBUaGUgb3JpZ2luYWwgZGVwb3NpdCB3aWxsIG5vIGxvbmdlciBiZSByZXR1cm5lZC4AOCMjIyBQYXJhbWV0ZXJzoC0gYHByb3Bvc2FsX2lkYDogVGhlIGluZGV4IG9mIGEgcHJvcG9zYWwAOCMjIyBDb21wbGV4aXR5rC0gTyhBKSB3aGVyZSBgQWAgaXMgdGhlIG51bWJlciBvZiBhcHByb3ZhbHMAKCMjIyBFcnJvcnNFAS0gW2BFcnJvcjo6UHJvcG9zYWxOb3RBcHByb3ZlZGBdOiBUaGUgYHByb3Bvc2FsX2lkYCBzdXBwbGllZCB3YXMgbm90IGZvdW5kIGluIHRoZVEBICBhcHByb3ZhbCBxdWV1ZSwgaS5lLiwgdGhlIHByb3Bvc2FsIGhhcyBub3QgYmVlbiBhcHByb3ZlZC4gVGhpcyBjb3VsZCBhbHNvIG1lYW4gdGhlWQEgIHByb3Bvc2FsIGRvZXMgbm90IGV4aXN0IGFsdG9nZXRoZXIsIHRodXMgdGhlcmUgaXMgbm8gd2F5IGl0IHdvdWxkIGhhdmUgYmVlbiBhcHByb3ZlZFQgIGluIHRoZSBmaXJzdCBwbGFjZS4Uc3BlbmQQAShhc3NldF9raW5k3AFEQm94PFQ6OkFzc2V0S2luZD4AARhhbW91bnT8AVBBc3NldEJhbGFuY2VPZjxULCBJPgABLGJlbmVmaWNpYXJ5RQEBeEJveDxCZW5lZmljaWFyeUxvb2t1cE9mPFQsIEk+PgABKHZhbGlkX2Zyb21hAgFkT3B0aW9uPEJsb2NrTnVtYmVyRm9yPFQ+PgAFaLhQcm9wb3NlIGFuZCBhcHByb3ZlIGEgc3BlbmQgb2YgdHJlYXN1cnkgZnVuZHMuAEgjIyBEaXNwYXRjaCBPcmlnaW4AHQFNdXN0IGJlIFtgQ29uZmlnOjpTcGVuZE9yaWdpbmBdIHdpdGggdGhlIGBTdWNjZXNzYCB2YWx1ZSBiZWluZyBhdCBsZWFzdFUBYGFtb3VudGAgb2YgYGFzc2V0X2tpbmRgIGluIHRoZSBuYXRpdmUgYXNzZXQuIFRoZSBhbW91bnQgb2YgYGFzc2V0X2tpbmRgIGlzIGNvbnZlcnRlZNRmb3IgYXNzZXJ0aW9uIHVzaW5nIHRoZSBbYENvbmZpZzo6QmFsYW5jZUNvbnZlcnRlcmBdLgAoIyMgRGV0YWlscwBJAUNyZWF0ZSBhbiBhcHByb3ZlZCBzcGVuZCBmb3IgdHJhbnNmZXJyaW5nIGEgc3BlY2lmaWMgYGFtb3VudGAgb2YgYGFzc2V0X2tpbmRgIHRvIGFhAWRlc2lnbmF0ZWQgYmVuZWZpY2lhcnkuIFRoZSBzcGVuZCBtdXN0IGJlIGNsYWltZWQgdXNpbmcgdGhlIGBwYXlvdXRgIGRpc3BhdGNoYWJsZSB3aXRoaW50dGhlIFtgQ29uZmlnOjpQYXlvdXRQZXJpb2RgXS4AOCMjIyBQYXJhbWV0ZXJzFQEtIGBhc3NldF9raW5kYDogQW4gaW5kaWNhdG9yIG9mIHRoZSBzcGVjaWZpYyBhc3NldCBjbGFzcyB0byBiZSBzcGVudC5BAS0gYGFtb3VudGA6IFRoZSBhbW91bnQgdG8gYmUgdHJhbnNmZXJyZWQgZnJvbSB0aGUgdHJlYXN1cnkgdG8gdGhlIGBiZW5lZmljaWFyeWAuuC0gYGJlbmVmaWNpYXJ5YDogVGhlIGJlbmVmaWNpYXJ5IG9mIHRoZSBzcGVuZC5VAS0gYHZhbGlkX2Zyb21gOiBUaGUgYmxvY2sgbnVtYmVyIGZyb20gd2hpY2ggdGhlIHNwZW5kIGNhbiBiZSBjbGFpbWVkLiBJdCBjYW4gcmVmZXIgdG8ZASAgdGhlIHBhc3QgaWYgdGhlIHJlc3VsdGluZyBzcGVuZCBoYXMgbm90IHlldCBleHBpcmVkIGFjY29yZGluZyB0byB0aGVFASAgW2BDb25maWc6OlBheW91dFBlcmlvZGBdLiBJZiBgTm9uZWAsIHRoZSBzcGVuZCBjYW4gYmUgY2xhaW1lZCBpbW1lZGlhdGVseSBhZnRlciwgIGFwcHJvdmFsLgAkIyMgRXZlbnRzAMhFbWl0cyBbYEV2ZW50OjpBc3NldFNwZW5kQXBwcm92ZWRgXSBpZiBzdWNjZXNzZnVsLhhwYXlvdXQEARRpbmRleBABKFNwZW5kSW5kZXgABkw4Q2xhaW0gYSBzcGVuZC4ASCMjIERpc3BhdGNoIE9yaWdpbgA4TXVzdCBiZSBzaWduZWQAKCMjIERldGFpbHMAVQFTcGVuZHMgbXVzdCBiZSBjbGFpbWVkIHdpdGhpbiBzb21lIHRlbXBvcmFsIGJvdW5kcy4gQSBzcGVuZCBtYXkgYmUgY2xhaW1lZCB3aXRoaW4gb25l1FtgQ29uZmlnOjpQYXlvdXRQZXJpb2RgXSBmcm9tIHRoZSBgdmFsaWRfZnJvbWAgYmxvY2suVQFJbiBjYXNlIG9mIGEgcGF5b3V0IGZhaWx1cmUsIHRoZSBzcGVuZCBzdGF0dXMgbXVzdCBiZSB1cGRhdGVkIHdpdGggdGhlIGBjaGVja19zdGF0dXNg3GRpc3BhdGNoYWJsZSBiZWZvcmUgcmV0cnlpbmcgd2l0aCB0aGUgY3VycmVudCBmdW5jdGlvbi4AOCMjIyBQYXJhbWV0ZXJzbC0gYGluZGV4YDogVGhlIHNwZW5kIGluZGV4LgAkIyMgRXZlbnRzAJBFbWl0cyBbYEV2ZW50OjpQYWlkYF0gaWYgc3VjY2Vzc2Z1bC4wY2hlY2tfc3RhdHVzBAEUaW5kZXgQAShTcGVuZEluZGV4AAdMKQFDaGVjayB0aGUgc3RhdHVzIG9mIHRoZSBzcGVuZCBhbmQgcmVtb3ZlIGl0IGZyb20gdGhlIHN0b3JhZ2UgaWYgcHJvY2Vzc2VkLgBIIyMgRGlzcGF0Y2ggT3JpZ2luADxNdXN0IGJlIHNpZ25lZC4AKCMjIERldGFpbHMAAQFUaGUgc3RhdHVzIGNoZWNrIGlzIGEgcHJlcmVxdWlzaXRlIGZvciByZXRyeWluZyBhIGZhaWxlZCBwYXlvdXQuSQFJZiBhIHNwZW5kIGhhcyBlaXRoZXIgc3VjY2VlZGVkIG9yIGV4cGlyZWQsIGl0IGlzIHJlbW92ZWQgZnJvbSB0aGUgc3RvcmFnZSBieSB0aGlz7GZ1bmN0aW9uLiBJbiBzdWNoIGluc3RhbmNlcywgdHJhbnNhY3Rpb24gZmVlcyBhcmUgcmVmdW5kZWQuADgjIyMgUGFyYW1ldGVyc2wtIGBpbmRleGA6IFRoZSBzcGVuZCBpbmRleC4AJCMjIEV2ZW50cwD4RW1pdHMgW2BFdmVudDo6UGF5bWVudEZhaWxlZGBdIGlmIHRoZSBzcGVuZCBwYXlvdXQgaGFzIGZhaWxlZC4BAUVtaXRzIFtgRXZlbnQ6OlNwZW5kUHJvY2Vzc2VkYF0gaWYgdGhlIHNwZW5kIHBheW91dCBoYXMgc3VjY2VlZC4odm9pZF9zcGVuZAQBFGluZGV4EAEoU3BlbmRJbmRleAAIQHxWb2lkIHByZXZpb3VzbHkgYXBwcm92ZWQgc3BlbmQuAEgjIyBEaXNwYXRjaCBPcmlnaW4AhE11c3QgYmUgW2BDb25maWc6OlJlamVjdE9yaWdpbmBdLgAoIyMgRGV0YWlscwAdAUEgc3BlbmQgdm9pZCBpcyBvbmx5IHBvc3NpYmxlIGlmIHRoZSBwYXlvdXQgaGFzIG5vdCBiZWVuIGF0dGVtcHRlZCB5ZXQuADgjIyMgUGFyYW1ldGVyc2wtIGBpbmRleGA6IFRoZSBzcGVuZCBpbmRleC4AJCMjIEV2ZW50cwDARW1pdHMgW2BFdmVudDo6QXNzZXRTcGVuZFZvaWRlZGBdIGlmIHN1Y2Nlc3NmdWwuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLmECBBhPcHRpb24EBFQBEAEIEE5vbmUAAAAQU29tZQQAEAAAAQAAZQIMYHBhbGxldF9jb252aWN0aW9uX3ZvdGluZxhwYWxsZXQQQ2FsbAgEVAAESQABGBB2b3RlCAEocG9sbF9pbmRleOwBRFBvbGxJbmRleE9mPFQsIEk+AAEQdm90ZWkCAXBBY2NvdW50Vm90ZTxCYWxhbmNlT2Y8VCwgST4+AAAkGQFWb3RlIGluIGEgcG9sbC4gSWYgYHZvdGUuaXNfYXllKClgLCB0aGUgdm90ZSBpcyB0byBlbmFjdCB0aGUgcHJvcG9zYWw7uG90aGVyd2lzZSBpdCBpcyBhIHZvdGUgdG8ga2VlcCB0aGUgc3RhdHVzIHF1by4AyFRoZSBkaXNwYXRjaCBvcmlnaW4gb2YgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uAMgtIGBwb2xsX2luZGV4YDogVGhlIGluZGV4IG9mIHRoZSBwb2xsIHRvIHZvdGUgZm9yLoQtIGB2b3RlYDogVGhlIHZvdGUgY29uZmlndXJhdGlvbi4AFQFXZWlnaHQ6IGBPKFIpYCB3aGVyZSBSIGlzIHRoZSBudW1iZXIgb2YgcG9sbHMgdGhlIHZvdGVyIGhhcyB2b3RlZCBvbi4gZGVsZWdhdGUQARRjbGFzc20BATRDbGFzc09mPFQsIEk+AAEIdG/FAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AAShjb252aWN0aW9ucQIBKENvbnZpY3Rpb24AARxiYWxhbmNlGAE8QmFsYW5jZU9mPFQsIEk+AAFcTQFEZWxlZ2F0ZSB0aGUgdm90aW5nIHBvd2VyICh3aXRoIHNvbWUgZ2l2ZW4gY29udmljdGlvbikgb2YgdGhlIHNlbmRpbmcgYWNjb3VudCBmb3IgYWhwYXJ0aWN1bGFyIGNsYXNzIG9mIHBvbGxzLgBVAVRoZSBiYWxhbmNlIGRlbGVnYXRlZCBpcyBsb2NrZWQgZm9yIGFzIGxvbmcgYXMgaXQncyBkZWxlZ2F0ZWQsIGFuZCB0aGVyZWFmdGVyIGZvciB0aGXIdGltZSBhcHByb3ByaWF0ZSBmb3IgdGhlIGNvbnZpY3Rpb24ncyBsb2NrIHBlcmlvZC4AXQFUaGUgZGlzcGF0Y2ggb3JpZ2luIG9mIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfLCBhbmQgdGhlIHNpZ25pbmcgYWNjb3VudCBtdXN0IGVpdGhlcjp0ICAtIGJlIGRlbGVnYXRpbmcgYWxyZWFkeTsgb3JFASAgLSBoYXZlIG5vIHZvdGluZyBhY3Rpdml0eSAoaWYgdGhlcmUgaXMsIHRoZW4gaXQgd2lsbCBuZWVkIHRvIGJlIHJlbW92ZWQgdGhyb3VnaEwgICAgYHJlbW92ZV92b3RlYCkuAEUBLSBgdG9gOiBUaGUgYWNjb3VudCB3aG9zZSB2b3RpbmcgdGhlIGB0YXJnZXRgIGFjY291bnQncyB2b3RpbmcgcG93ZXIgd2lsbCBmb2xsb3cuXQEtIGBjbGFzc2A6IFRoZSBjbGFzcyBvZiBwb2xscyB0byBkZWxlZ2F0ZS4gVG8gZGVsZWdhdGUgbXVsdGlwbGUgY2xhc3NlcywgbXVsdGlwbGUgY2FsbHOAICB0byB0aGlzIGZ1bmN0aW9uIGFyZSByZXF1aXJlZC5VAS0gYGNvbnZpY3Rpb25gOiBUaGUgY29udmljdGlvbiB0aGF0IHdpbGwgYmUgYXR0YWNoZWQgdG8gdGhlIGRlbGVnYXRlZCB2b3Rlcy4gV2hlbiB0aGVBASAgYWNjb3VudCBpcyB1bmRlbGVnYXRlZCwgdGhlIGZ1bmRzIHdpbGwgYmUgbG9ja2VkIGZvciB0aGUgY29ycmVzcG9uZGluZyBwZXJpb2QuYQEtIGBiYWxhbmNlYDogVGhlIGFtb3VudCBvZiB0aGUgYWNjb3VudCdzIGJhbGFuY2UgdG8gYmUgdXNlZCBpbiBkZWxlZ2F0aW5nLiBUaGlzIG11c3Qgbm90tCAgYmUgbW9yZSB0aGFuIHRoZSBhY2NvdW50J3MgY3VycmVudCBiYWxhbmNlLgBIRW1pdHMgYERlbGVnYXRlZGAuACUBV2VpZ2h0OiBgTyhSKWAgd2hlcmUgUiBpcyB0aGUgbnVtYmVyIG9mIHBvbGxzIHRoZSB2b3RlciBkZWxlZ2F0aW5nIHRvIGhhc00BICB2b3RlZCBvbi4gV2VpZ2h0IGlzIGluaXRpYWxseSBjaGFyZ2VkIGFzIGlmIG1heGltdW0gdm90ZXMsIGJ1dCBpcyByZWZ1bmRlZCBsYXRlci4odW5kZWxlZ2F0ZQQBFGNsYXNzbQEBNENsYXNzT2Y8VCwgST4AAjhNAVVuZGVsZWdhdGUgdGhlIHZvdGluZyBwb3dlciBvZiB0aGUgc2VuZGluZyBhY2NvdW50IGZvciBhIHBhcnRpY3VsYXIgY2xhc3Mgb2YgcG9sbHMuAF0BVG9rZW5zIG1heSBiZSB1bmxvY2tlZCBmb2xsb3dpbmcgb25jZSBhbiBhbW91bnQgb2YgdGltZSBjb25zaXN0ZW50IHdpdGggdGhlIGxvY2sgcGVyaW9kCQFvZiB0aGUgY29udmljdGlvbiB3aXRoIHdoaWNoIHRoZSBkZWxlZ2F0aW9uIHdhcyBpc3N1ZWQgaGFzIHBhc3NlZC4ARQFUaGUgZGlzcGF0Y2ggb3JpZ2luIG9mIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfIGFuZCB0aGUgc2lnbmluZyBhY2NvdW50IG11c3QgYmVUY3VycmVudGx5IGRlbGVnYXRpbmcuAPAtIGBjbGFzc2A6IFRoZSBjbGFzcyBvZiBwb2xscyB0byByZW1vdmUgdGhlIGRlbGVnYXRpb24gZnJvbS4AUEVtaXRzIGBVbmRlbGVnYXRlZGAuACUBV2VpZ2h0OiBgTyhSKWAgd2hlcmUgUiBpcyB0aGUgbnVtYmVyIG9mIHBvbGxzIHRoZSB2b3RlciBkZWxlZ2F0aW5nIHRvIGhhc00BICB2b3RlZCBvbi4gV2VpZ2h0IGlzIGluaXRpYWxseSBjaGFyZ2VkIGFzIGlmIG1heGltdW0gdm90ZXMsIGJ1dCBpcyByZWZ1bmRlZCBsYXRlci4YdW5sb2NrCAEUY2xhc3NtAQE0Q2xhc3NPZjxULCBJPgABGHRhcmdldMUBAVBBY2NvdW50SWRMb29rdXBPZjxUPgADJF0BUmVtb3ZlIHRoZSBsb2NrIGNhdXNlZCBieSBwcmlvciB2b3RpbmcvZGVsZWdhdGluZyB3aGljaCBoYXMgZXhwaXJlZCB3aXRoaW4gYSBwYXJ0aWN1bGFyGGNsYXNzLgDIVGhlIGRpc3BhdGNoIG9yaWdpbiBvZiB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXy4AoC0gYGNsYXNzYDogVGhlIGNsYXNzIG9mIHBvbGxzIHRvIHVubG9jay64LSBgdGFyZ2V0YDogVGhlIGFjY291bnQgdG8gcmVtb3ZlIHRoZSBsb2NrIG9uLgC8V2VpZ2h0OiBgTyhSKWAgd2l0aCBSIG51bWJlciBvZiB2b3RlIG9mIHRhcmdldC4scmVtb3ZlX3ZvdGUIARRjbGFzc3UCAVRPcHRpb248Q2xhc3NPZjxULCBJPj4AARRpbmRleBABRFBvbGxJbmRleE9mPFQsIEk+AAR0ZFJlbW92ZSBhIHZvdGUgZm9yIGEgcG9sbC4ADElmOnAtIHRoZSBwb2xsIHdhcyBjYW5jZWxsZWQsIG9yZC0gdGhlIHBvbGwgaXMgb25nb2luZywgb3J4LSB0aGUgcG9sbCBoYXMgZW5kZWQgc3VjaCB0aGF0/CAgLSB0aGUgdm90ZSBvZiB0aGUgYWNjb3VudCB3YXMgaW4gb3Bwb3NpdGlvbiB0byB0aGUgcmVzdWx0OyBvctQgIC0gdGhlcmUgd2FzIG5vIGNvbnZpY3Rpb24gdG8gdGhlIGFjY291bnQncyB2b3RlOyBvcoQgIC0gdGhlIGFjY291bnQgbWFkZSBhIHNwbGl0IHZvdGVdAS4uLnRoZW4gdGhlIHZvdGUgaXMgcmVtb3ZlZCBjbGVhbmx5IGFuZCBhIGZvbGxvd2luZyBjYWxsIHRvIGB1bmxvY2tgIG1heSByZXN1bHQgaW4gbW9yZVhmdW5kcyBiZWluZyBhdmFpbGFibGUuAJBJZiwgaG93ZXZlciwgdGhlIHBvbGwgaGFzIGVuZGVkIGFuZDrsLSBpdCBmaW5pc2hlZCBjb3JyZXNwb25kaW5nIHRvIHRoZSB2b3RlIG9mIHRoZSBhY2NvdW50LCBhbmTcLSB0aGUgYWNjb3VudCBtYWRlIGEgc3RhbmRhcmQgdm90ZSB3aXRoIGNvbnZpY3Rpb24sIGFuZLwtIHRoZSBsb2NrIHBlcmlvZCBvZiB0aGUgY29udmljdGlvbiBpcyBub3Qgb3ZlclkBLi4udGhlbiB0aGUgbG9jayB3aWxsIGJlIGFnZ3JlZ2F0ZWQgaW50byB0aGUgb3ZlcmFsbCBhY2NvdW50J3MgbG9jaywgd2hpY2ggbWF5IGludm9sdmVZASpvdmVybG9ja2luZyogKHdoZXJlIHRoZSB0d28gbG9ja3MgYXJlIGNvbWJpbmVkIGludG8gYSBzaW5nbGUgbG9jayB0aGF0IGlzIHRoZSBtYXhpbXVt5G9mIGJvdGggdGhlIGFtb3VudCBsb2NrZWQgYW5kIHRoZSB0aW1lIGlzIGl0IGxvY2tlZCBmb3IpLgBJAVRoZSBkaXNwYXRjaCBvcmlnaW4gb2YgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8sIGFuZCB0aGUgc2lnbmVyIG11c3QgaGF2ZSBhIHZvdGVwcmVnaXN0ZXJlZCBmb3IgcG9sbCBgaW5kZXhgLgDcLSBgaW5kZXhgOiBUaGUgaW5kZXggb2YgcG9sbCBvZiB0aGUgdm90ZSB0byBiZSByZW1vdmVkLlUBLSBgY2xhc3NgOiBPcHRpb25hbCBwYXJhbWV0ZXIsIGlmIGdpdmVuIGl0IGluZGljYXRlcyB0aGUgY2xhc3Mgb2YgdGhlIHBvbGwuIEZvciBwb2xsc/AgIHdoaWNoIGhhdmUgZmluaXNoZWQgb3IgYXJlIGNhbmNlbGxlZCwgdGhpcyBtdXN0IGJlIGBTb21lYC4ARQFXZWlnaHQ6IGBPKFIgKyBsb2cgUilgIHdoZXJlIFIgaXMgdGhlIG51bWJlciBvZiBwb2xscyB0aGF0IGB0YXJnZXRgIGhhcyB2b3RlZCBvbi7YICBXZWlnaHQgaXMgY2FsY3VsYXRlZCBmb3IgdGhlIG1heGltdW0gbnVtYmVyIG9mIHZvdGUuRHJlbW92ZV9vdGhlcl92b3RlDAEYdGFyZ2V0xQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEUY2xhc3NtAQE0Q2xhc3NPZjxULCBJPgABFGluZGV4EAFEUG9sbEluZGV4T2Y8VCwgST4ABUBkUmVtb3ZlIGEgdm90ZSBmb3IgYSBwb2xsLgBNAUlmIHRoZSBgdGFyZ2V0YCBpcyBlcXVhbCB0byB0aGUgc2lnbmVyLCB0aGVuIHRoaXMgZnVuY3Rpb24gaXMgZXhhY3RseSBlcXVpdmFsZW50IHRvLQFgcmVtb3ZlX3ZvdGVgLiBJZiBub3QgZXF1YWwgdG8gdGhlIHNpZ25lciwgdGhlbiB0aGUgdm90ZSBtdXN0IGhhdmUgZXhwaXJlZCwlAWVpdGhlciBiZWNhdXNlIHRoZSBwb2xsIHdhcyBjYW5jZWxsZWQsIGJlY2F1c2UgdGhlIHZvdGVyIGxvc3QgdGhlIHBvbGwgb3KYYmVjYXVzZSB0aGUgY29udmljdGlvbiBwZXJpb2QgaXMgb3Zlci4AyFRoZSBkaXNwYXRjaCBvcmlnaW4gb2YgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uAGEBLSBgdGFyZ2V0YDogVGhlIGFjY291bnQgb2YgdGhlIHZvdGUgdG8gYmUgcmVtb3ZlZDsgdGhpcyBhY2NvdW50IG11c3QgaGF2ZSB2b3RlZCBmb3IgcG9sbCggIGBpbmRleGAu3C0gYGluZGV4YDogVGhlIGluZGV4IG9mIHBvbGwgb2YgdGhlIHZvdGUgdG8gYmUgcmVtb3ZlZC6ELSBgY2xhc3NgOiBUaGUgY2xhc3Mgb2YgdGhlIHBvbGwuAEUBV2VpZ2h0OiBgTyhSICsgbG9nIFIpYCB3aGVyZSBSIGlzIHRoZSBudW1iZXIgb2YgcG9sbHMgdGhhdCBgdGFyZ2V0YCBoYXMgdm90ZWQgb24u2CAgV2VpZ2h0IGlzIGNhbGN1bGF0ZWQgZm9yIHRoZSBtYXhpbXVtIG51bWJlciBvZiB2b3RlLgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy5pAgxgcGFsbGV0X2NvbnZpY3Rpb25fdm90aW5nEHZvdGUsQWNjb3VudFZvdGUEHEJhbGFuY2UBGAEMIFN0YW5kYXJkCAEQdm90ZW0CARBWb3RlAAEcYmFsYW5jZRgBHEJhbGFuY2UAAAAUU3BsaXQIAQxheWUYARxCYWxhbmNlAAEMbmF5GAEcQmFsYW5jZQABADBTcGxpdEFic3RhaW4MAQxheWUYARxCYWxhbmNlAAEMbmF5GAEcQmFsYW5jZQABHGFic3RhaW4YARxCYWxhbmNlAAIAAG0CDGBwYWxsZXRfY29udmljdGlvbl92b3RpbmcQdm90ZRBWb3RlAAAEAAgAAABxAgxgcGFsbGV0X2NvbnZpY3Rpb25fdm90aW5nKGNvbnZpY3Rpb24oQ29udmljdGlvbgABHBBOb25lAAAAIExvY2tlZDF4AAEAIExvY2tlZDJ4AAIAIExvY2tlZDN4AAMAIExvY2tlZDR4AAQAIExvY2tlZDV4AAUAIExvY2tlZDZ4AAYAAHUCBBhPcHRpb24EBFQBbQEBCBBOb25lAAAAEFNvbWUEAG0BAAABAAB5AgxAcGFsbGV0X3JlZmVyZW5kYRhwYWxsZXQQQ2FsbAgEVAAESQABJBhzdWJtaXQMATxwcm9wb3NhbF9vcmlnaW59AgFcQm94PFBhbGxldHNPcmlnaW5PZjxUPj4AASBwcm9wb3NhbHEBAUxCb3VuZGVkQ2FsbE9mPFQsIEk+AAFAZW5hY3RtZW50X21vbWVudJkCAXxEaXNwYXRjaFRpbWU8QmxvY2tOdW1iZXJGb3I8VD4+AAAksFByb3Bvc2UgYSByZWZlcmVuZHVtIG9uIGEgcHJpdmlsZWdlZCBhY3Rpb24uAFkBLSBgb3JpZ2luYDogbXVzdCBiZSBgU3VibWl0T3JpZ2luYCBhbmQgdGhlIGFjY291bnQgbXVzdCBoYXZlIGBTdWJtaXNzaW9uRGVwb3NpdGAgZnVuZHMwICBhdmFpbGFibGUuLQEtIGBwcm9wb3NhbF9vcmlnaW5gOiBUaGUgb3JpZ2luIGZyb20gd2hpY2ggdGhlIHByb3Bvc2FsIHNob3VsZCBiZSBleGVjdXRlZC5sLSBgcHJvcG9zYWxgOiBUaGUgcHJvcG9zYWwuFQEtIGBlbmFjdG1lbnRfbW9tZW50YDogVGhlIG1vbWVudCB0aGF0IHRoZSBwcm9wb3NhbCBzaG91bGQgYmUgZW5hY3RlZC4ASEVtaXRzIGBTdWJtaXR0ZWRgLlhwbGFjZV9kZWNpc2lvbl9kZXBvc2l0BAEUaW5kZXgQATxSZWZlcmVuZHVtSW5kZXgAASCsUG9zdCB0aGUgRGVjaXNpb24gRGVwb3NpdCBmb3IgYSByZWZlcmVuZHVtLgA5AS0gYG9yaWdpbmA6IG11c3QgYmUgYFNpZ25lZGAgYW5kIHRoZSBhY2NvdW50IG11c3QgaGF2ZSBmdW5kcyBhdmFpbGFibGUgZm9yIHRoZaAgIHJlZmVyZW5kdW0ncyB0cmFjaydzIERlY2lzaW9uIERlcG9zaXQuUQEtIGBpbmRleGA6IFRoZSBpbmRleCBvZiB0aGUgc3VibWl0dGVkIHJlZmVyZW5kdW0gd2hvc2UgRGVjaXNpb24gRGVwb3NpdCBpcyB5ZXQgdG8gYmUkICBwb3N0ZWQuAHhFbWl0cyBgRGVjaXNpb25EZXBvc2l0UGxhY2VkYC5ccmVmdW5kX2RlY2lzaW9uX2RlcG9zaXQEARRpbmRleBABPFJlZmVyZW5kdW1JbmRleAACHCkBUmVmdW5kIHRoZSBEZWNpc2lvbiBEZXBvc2l0IGZvciBhIGNsb3NlZCByZWZlcmVuZHVtIGJhY2sgdG8gdGhlIGRlcG9zaXRvci4AnC0gYG9yaWdpbmA6IG11c3QgYmUgYFNpZ25lZGAgb3IgYFJvb3RgLk0BLSBgaW5kZXhgOiBUaGUgaW5kZXggb2YgYSBjbG9zZWQgcmVmZXJlbmR1bSB3aG9zZSBEZWNpc2lvbiBEZXBvc2l0IGhhcyBub3QgeWV0IGJlZW4sICByZWZ1bmRlZC4AgEVtaXRzIGBEZWNpc2lvbkRlcG9zaXRSZWZ1bmRlZGAuGGNhbmNlbAQBFGluZGV4EAE8UmVmZXJlbmR1bUluZGV4AAMYdENhbmNlbCBhbiBvbmdvaW5nIHJlZmVyZW5kdW0uAJwtIGBvcmlnaW5gOiBtdXN0IGJlIHRoZSBgQ2FuY2VsT3JpZ2luYC7cLSBgaW5kZXhgOiBUaGUgaW5kZXggb2YgdGhlIHJlZmVyZW5kdW0gdG8gYmUgY2FuY2VsbGVkLgBIRW1pdHMgYENhbmNlbGxlZGAuEGtpbGwEARRpbmRleBABPFJlZmVyZW5kdW1JbmRleAAEGNBDYW5jZWwgYW4gb25nb2luZyByZWZlcmVuZHVtIGFuZCBzbGFzaCB0aGUgZGVwb3NpdHMuAJQtIGBvcmlnaW5gOiBtdXN0IGJlIHRoZSBgS2lsbE9yaWdpbmAu3C0gYGluZGV4YDogVGhlIGluZGV4IG9mIHRoZSByZWZlcmVuZHVtIHRvIGJlIGNhbmNlbGxlZC4AkEVtaXRzIGBLaWxsZWRgIGFuZCBgRGVwb3NpdFNsYXNoZWRgLkBudWRnZV9yZWZlcmVuZHVtBAEUaW5kZXgQATxSZWZlcmVuZHVtSW5kZXgABRAdAUFkdmFuY2UgYSByZWZlcmVuZHVtIG9udG8gaXRzIG5leHQgbG9naWNhbCBzdGF0ZS4gT25seSB1c2VkIGludGVybmFsbHkuAGwtIGBvcmlnaW5gOiBtdXN0IGJlIGBSb290YC6kLSBgaW5kZXhgOiB0aGUgcmVmZXJlbmR1bSB0byBiZSBhZHZhbmNlZC5Ib25lX2Zld2VyX2RlY2lkaW5nBAEUdHJhY2ttAQE8VHJhY2tJZE9mPFQsIEk+AAYkCQFBZHZhbmNlIGEgdHJhY2sgb250byBpdHMgbmV4dCBsb2dpY2FsIHN0YXRlLiBPbmx5IHVzZWQgaW50ZXJuYWxseS4AbC0gYG9yaWdpbmA6IG11c3QgYmUgYFJvb3RgLpAtIGB0cmFja2A6IHRoZSB0cmFjayB0byBiZSBhZHZhbmNlZC4AUQFBY3Rpb24gaXRlbSBmb3Igd2hlbiB0aGVyZSBpcyBub3cgb25lIGZld2VyIHJlZmVyZW5kdW0gaW4gdGhlIGRlY2lkaW5nIHBoYXNlIGFuZCB0aGUVAWBEZWNpZGluZ0NvdW50YCBpcyBub3QgeWV0IHVwZGF0ZWQuIFRoaXMgbWVhbnMgdGhhdCB3ZSBzaG91bGQgZWl0aGVyOiUBLSBiZWdpbiBkZWNpZGluZyBhbm90aGVyIHJlZmVyZW5kdW0gKGFuZCBsZWF2ZSBgRGVjaWRpbmdDb3VudGAgYWxvbmUpOyBvcnAtIGRlY3JlbWVudCBgRGVjaWRpbmdDb3VudGAuZHJlZnVuZF9zdWJtaXNzaW9uX2RlcG9zaXQEARRpbmRleBABPFJlZmVyZW5kdW1JbmRleAAHHDEBUmVmdW5kIHRoZSBTdWJtaXNzaW9uIERlcG9zaXQgZm9yIGEgY2xvc2VkIHJlZmVyZW5kdW0gYmFjayB0byB0aGUgZGVwb3NpdG9yLgCcLSBgb3JpZ2luYDogbXVzdCBiZSBgU2lnbmVkYCBvciBgUm9vdGAuVQEtIGBpbmRleGA6IFRoZSBpbmRleCBvZiBhIGNsb3NlZCByZWZlcmVuZHVtIHdob3NlIFN1Ym1pc3Npb24gRGVwb3NpdCBoYXMgbm90IHlldCBiZWVuLCAgcmVmdW5kZWQuAIhFbWl0cyBgU3VibWlzc2lvbkRlcG9zaXRSZWZ1bmRlZGAuMHNldF9tZXRhZGF0YQgBFGluZGV4EAE8UmVmZXJlbmR1bUluZGV4AAEobWF5YmVfaGFzaJ0CATxPcHRpb248VDo6SGFzaD4ACByYU2V0IG9yIGNsZWFyIG1ldGFkYXRhIG9mIGEgcmVmZXJlbmR1bS4ALFBhcmFtZXRlcnM6RQEtIGBvcmlnaW5gOiBNdXN0IGJlIGBTaWduZWRgIGJ5IGEgY3JlYXRvciBvZiBhIHJlZmVyZW5kdW0gb3IgYnkgYW55b25lIHRvIGNsZWFyIGGQICBtZXRhZGF0YSBvZiBhIGZpbmlzaGVkIHJlZmVyZW5kdW0uDQEtIGBpbmRleGA6ICBUaGUgaW5kZXggb2YgYSByZWZlcmVuZHVtIHRvIHNldCBvciBjbGVhciBtZXRhZGF0YSBmb3IuUQEtIGBtYXliZV9oYXNoYDogVGhlIGhhc2ggb2YgYW4gb24tY2hhaW4gc3RvcmVkIHByZWltYWdlLiBgTm9uZWAgdG8gY2xlYXIgYSBtZXRhZGF0YS4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMufQIIQHBvbGthZG90X3J1bnRpbWUwT3JpZ2luQ2FsbGVyAAEUGHN5c3RlbQQAgQIBdGZyYW1lX3N5c3RlbTo6T3JpZ2luPFJ1bnRpbWU+AAAAHE9yaWdpbnMEAIUCAXRwYWxsZXRfY3VzdG9tX29yaWdpbnM6Ok9yaWdpbgAWAEBQYXJhY2hhaW5zT3JpZ2luBACJAgFkcGFyYWNoYWluc19vcmlnaW46Ok9yaWdpbgAyACRYY21QYWxsZXQEAJECAUhwYWxsZXRfeGNtOjpPcmlnaW4AYwAQVm9pZAQAlQIBQQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6Cl9fcHJpdmF0ZTo6Vm9pZAAEAACBAgw0ZnJhbWVfc3VwcG9ydCBkaXNwYXRjaCRSYXdPcmlnaW4EJEFjY291bnRJZAEAAQwQUm9vdAAAABhTaWduZWQEAAABJEFjY291bnRJZAABABBOb25lAAIAAIUCFEBwb2xrYWRvdF9ydW50aW1lKGdvdmVybmFuY2Ucb3JpZ2luc1RwYWxsZXRfY3VzdG9tX29yaWdpbnMYT3JpZ2luAAE8MFN0YWtpbmdBZG1pbgAAACRUcmVhc3VyZXIAAQA8RmVsbG93c2hpcEFkbWluAAIAMEdlbmVyYWxBZG1pbgADADBBdWN0aW9uQWRtaW4ABAAoTGVhc2VBZG1pbgAFAExSZWZlcmVuZHVtQ2FuY2VsbGVyAAYAQFJlZmVyZW5kdW1LaWxsZXIABwAsU21hbGxUaXBwZXIACAAkQmlnVGlwcGVyAAkAMFNtYWxsU3BlbmRlcgAKADRNZWRpdW1TcGVuZGVyAAsAKEJpZ1NwZW5kZXIADABEV2hpdGVsaXN0ZWRDYWxsZXIADQA0V2lzaEZvckNoYW5nZQAOAACJAhBscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zGG9yaWdpbhhwYWxsZXQYT3JpZ2luAAEEJFBhcmFjaGFpbgQAjQIBGFBhcmFJZAAAAACNAgx0cG9sa2Fkb3RfcGFyYWNoYWluX3ByaW1pdGl2ZXMocHJpbWl0aXZlcwhJZAAABAAQAQx1MzIAAJECDChwYWxsZXRfeGNtGHBhbGxldBhPcmlnaW4AAQgMWGNtBAANAQEgTG9jYXRpb24AAAAgUmVzcG9uc2UEAA0BASBMb2NhdGlvbgABAACVAggcc3BfY29yZRBWb2lkAAEAAJkCEDRmcmFtZV9zdXBwb3J0GHRyYWl0cyBzY2hlZHVsZTBEaXNwYXRjaFRpbWUELEJsb2NrTnVtYmVyARABCAhBdAQAEAEsQmxvY2tOdW1iZXIAAAAUQWZ0ZXIEABABLEJsb2NrTnVtYmVyAAEAAJ0CBBhPcHRpb24EBFQBNAEIEE5vbmUAAAAQU29tZQQANAAAAQAAoQIMQHBhbGxldF93aGl0ZWxpc3QYcGFsbGV0EENhbGwEBFQAARA4d2hpdGVsaXN0X2NhbGwEASRjYWxsX2hhc2g0ARxUOjpIYXNoAAAAXHJlbW92ZV93aGl0ZWxpc3RlZF9jYWxsBAEkY2FsbF9oYXNoNAEcVDo6SGFzaAABAGRkaXNwYXRjaF93aGl0ZWxpc3RlZF9jYWxsDAEkY2FsbF9oYXNoNAEcVDo6SGFzaAABQGNhbGxfZW5jb2RlZF9sZW4QAQx1MzIAAUxjYWxsX3dlaWdodF93aXRuZXNzKAEYV2VpZ2h0AAIAnGRpc3BhdGNoX3doaXRlbGlzdGVkX2NhbGxfd2l0aF9wcmVpbWFnZQQBEGNhbGx1AQF8Qm94PDxUIGFzIENvbmZpZz46OlJ1bnRpbWVDYWxsPgADAAQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy6lAgxEcGFsbGV0X3BhcmFtZXRlcnMYcGFsbGV0EENhbGwEBFQAAQQ0c2V0X3BhcmFtZXRlcgQBJGtleV92YWx1ZakCAVBUOjpSdW50aW1lUGFyYW1ldGVycwAAEHRTZXQgdGhlIHZhbHVlIG9mIGEgcGFyYW1ldGVyLgBVAVRoZSBkaXNwYXRjaCBvcmlnaW4gb2YgdGhpcyBjYWxsIG11c3QgYmUgYEFkbWluT3JpZ2luYCBmb3IgdGhlIGdpdmVuIGBrZXlgLiBWYWx1ZXMgYmWIZGVsZXRlZCBieSBzZXR0aW5nIHRoZW0gdG8gYE5vbmVgLgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy6pAghAcG9sa2Fkb3RfcnVudGltZURSdW50aW1lUGFyYW1ldGVycwABBCRJbmZsYXRpb24EAK0CAZRkeW5hbWljX3BhcmFtczo6aW5mbGF0aW9uOjpQYXJhbWV0ZXJzAAAAAK0CEEBwb2xrYWRvdF9ydW50aW1lOGR5bmFtaWNfcGFyYW1zJGluZmxhdGlvbihQYXJhbWV0ZXJzAAEUME1pbkluZmxhdGlvbggAsQIBME1pbkluZmxhdGlvbgAAtQIBTE9wdGlvbjxQZXJxdWludGlsbD4AAAAwTWF4SW5mbGF0aW9uCAC9AgEwTWF4SW5mbGF0aW9uAAC1AgFMT3B0aW9uPFBlcnF1aW50aWxsPgABAChJZGVhbFN0YWtlCADBAgEoSWRlYWxTdGFrZQAAtQIBTE9wdGlvbjxQZXJxdWludGlsbD4AAgAcRmFsbG9mZggAxQIBHEZhbGxvZmYAALUCAUxPcHRpb248UGVycXVpbnRpbGw+AAMAPFVzZUF1Y3Rpb25TbG90cwgAyQIBPFVzZUF1Y3Rpb25TbG90cwAAzQIBME9wdGlvbjxib29sPgAEAACxAhBAcG9sa2Fkb3RfcnVudGltZThkeW5hbWljX3BhcmFtcyRpbmZsYXRpb24wTWluSW5mbGF0aW9uAAAAALUCBBhPcHRpb24EBFQBuQIBCBBOb25lAAAAEFNvbWUEALkCAAABAAC5Agw0c3BfYXJpdGhtZXRpYyhwZXJfdGhpbmdzLFBlcnF1aW50aWxsAAAEADABDHU2NAAAvQIQQHBvbGthZG90X3J1bnRpbWU4ZHluYW1pY19wYXJhbXMkaW5mbGF0aW9uME1heEluZmxhdGlvbgAAAADBAhBAcG9sa2Fkb3RfcnVudGltZThkeW5hbWljX3BhcmFtcyRpbmZsYXRpb24oSWRlYWxTdGFrZQAAAADFAhBAcG9sa2Fkb3RfcnVudGltZThkeW5hbWljX3BhcmFtcyRpbmZsYXRpb24cRmFsbG9mZgAAAADJAhBAcG9sa2Fkb3RfcnVudGltZThkeW5hbWljX3BhcmFtcyRpbmZsYXRpb248VXNlQXVjdGlvblNsb3RzAAAAAM0CBBhPcHRpb24EBFQBIAEIEE5vbmUAAAAQU29tZQQAIAAAAQAA0QIQXHBvbGthZG90X3J1bnRpbWVfY29tbW9uGGNsYWltcxhwYWxsZXQQQ2FsbAQEVAABFBRjbGFpbQgBEGRlc3QAATBUOjpBY2NvdW50SWQAAUhldGhlcmV1bV9zaWduYXR1cmXVAgE4RWNkc2FTaWduYXR1cmUAAGCITWFrZSBhIGNsYWltIHRvIGNvbGxlY3QgeW91ciBET1RzLgDEVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX05vbmVfLgBQVW5zaWduZWQgVmFsaWRhdGlvbjoFAUEgY2FsbCB0byBjbGFpbSBpcyBkZWVtZWQgdmFsaWQgaWYgdGhlIHNpZ25hdHVyZSBwcm92aWRlZCBtYXRjaGVzfHRoZSBleHBlY3RlZCBzaWduZWQgbWVzc2FnZSBvZjoAaD4gRXRoZXJldW0gU2lnbmVkIE1lc3NhZ2U6lD4gKGNvbmZpZ3VyZWQgcHJlZml4IHN0cmluZykoYWRkcmVzcykApGFuZCBgYWRkcmVzc2AgbWF0Y2hlcyB0aGUgYGRlc3RgIGFjY291bnQuACxQYXJhbWV0ZXJzOtgtIGBkZXN0YDogVGhlIGRlc3RpbmF0aW9uIGFjY291bnQgdG8gcGF5b3V0IHRoZSBjbGFpbS5dAS0gYGV0aGVyZXVtX3NpZ25hdHVyZWA6IFRoZSBzaWduYXR1cmUgb2YgYW4gZXRoZXJldW0gc2lnbmVkIG1lc3NhZ2UgbWF0Y2hpbmcgdGhlIGZvcm1hdEggIGRlc2NyaWJlZCBhYm92ZS4AIDx3ZWlnaHQ+/FRoZSB3ZWlnaHQgb2YgdGhpcyBjYWxsIGlzIGludmFyaWFudCBvdmVyIHRoZSBpbnB1dCBwYXJhbWV0ZXJzLuBXZWlnaHQgaW5jbHVkZXMgbG9naWMgdG8gdmFsaWRhdGUgdW5zaWduZWQgYGNsYWltYCBjYWxsLgBYVG90YWwgQ29tcGxleGl0eTogTygxKSQ8L3dlaWdodD4obWludF9jbGFpbRABDHdob90CATxFdGhlcmV1bUFkZHJlc3MAARR2YWx1ZRgBMEJhbGFuY2VPZjxUPgABQHZlc3Rpbmdfc2NoZWR1bGXhAgHcT3B0aW9uPChCYWxhbmNlT2Y8VD4sIEJhbGFuY2VPZjxUPiwgQmxvY2tOdW1iZXJGb3I8VD4pPgABJHN0YXRlbWVudOkCAVRPcHRpb248U3RhdGVtZW50S2luZD4AATyETWludCBhIG5ldyBjbGFpbSB0byBjb2xsZWN0IERPVHMuAMRUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfUm9vdF8uACxQYXJhbWV0ZXJzOvAtIGB3aG9gOiBUaGUgRXRoZXJldW0gYWRkcmVzcyBhbGxvd2VkIHRvIGNvbGxlY3QgdGhpcyBjbGFpbS7MLSBgdmFsdWVgOiBUaGUgbnVtYmVyIG9mIERPVHMgdGhhdCB3aWxsIGJlIGNsYWltZWQuCQEtIGB2ZXN0aW5nX3NjaGVkdWxlYDogQW4gb3B0aW9uYWwgdmVzdGluZyBzY2hlZHVsZSBmb3IgdGhlc2UgRE9Ucy4AIDx3ZWlnaHQ+/FRoZSB3ZWlnaHQgb2YgdGhpcyBjYWxsIGlzIGludmFyaWFudCBvdmVyIHRoZSBpbnB1dCBwYXJhbWV0ZXJzLh0BV2UgYXNzdW1lIHdvcnN0IGNhc2UgdGhhdCBib3RoIHZlc3RpbmcgYW5kIHN0YXRlbWVudCBpcyBiZWluZyBpbnNlcnRlZC4AWFRvdGFsIENvbXBsZXhpdHk6IE8oMSkkPC93ZWlnaHQ+MGNsYWltX2F0dGVzdAwBEGRlc3QAATBUOjpBY2NvdW50SWQAAUhldGhlcmV1bV9zaWduYXR1cmXVAgE4RWNkc2FTaWduYXR1cmUAASRzdGF0ZW1lbnQ4ARxWZWM8dTg+AAJs5E1ha2UgYSBjbGFpbSB0byBjb2xsZWN0IHlvdXIgRE9UcyBieSBzaWduaW5nIGEgc3RhdGVtZW50LgDEVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX05vbmVfLgBQVW5zaWduZWQgVmFsaWRhdGlvbjopAUEgY2FsbCB0byBgY2xhaW1fYXR0ZXN0YCBpcyBkZWVtZWQgdmFsaWQgaWYgdGhlIHNpZ25hdHVyZSBwcm92aWRlZCBtYXRjaGVzfHRoZSBleHBlY3RlZCBzaWduZWQgbWVzc2FnZSBvZjoAaD4gRXRoZXJldW0gU2lnbmVkIE1lc3NhZ2U6wD4gKGNvbmZpZ3VyZWQgcHJlZml4IHN0cmluZykoYWRkcmVzcykoc3RhdGVtZW50KQBJAWFuZCBgYWRkcmVzc2AgbWF0Y2hlcyB0aGUgYGRlc3RgIGFjY291bnQ7IHRoZSBgc3RhdGVtZW50YCBtdXN0IG1hdGNoIHRoYXQgd2hpY2ggaXPAZXhwZWN0ZWQgYWNjb3JkaW5nIHRvIHlvdXIgcHVyY2hhc2UgYXJyYW5nZW1lbnQuACxQYXJhbWV0ZXJzOtgtIGBkZXN0YDogVGhlIGRlc3RpbmF0aW9uIGFjY291bnQgdG8gcGF5b3V0IHRoZSBjbGFpbS5dAS0gYGV0aGVyZXVtX3NpZ25hdHVyZWA6IFRoZSBzaWduYXR1cmUgb2YgYW4gZXRoZXJldW0gc2lnbmVkIG1lc3NhZ2UgbWF0Y2hpbmcgdGhlIGZvcm1hdEggIGRlc2NyaWJlZCBhYm92ZS45AS0gYHN0YXRlbWVudGA6IFRoZSBpZGVudGl0eSBvZiB0aGUgc3RhdGVtZW50IHdoaWNoIGlzIGJlaW5nIGF0dGVzdGVkIHRvIGluIHRoZTAgIHNpZ25hdHVyZS4AIDx3ZWlnaHQ+/FRoZSB3ZWlnaHQgb2YgdGhpcyBjYWxsIGlzIGludmFyaWFudCBvdmVyIHRoZSBpbnB1dCBwYXJhbWV0ZXJzLvxXZWlnaHQgaW5jbHVkZXMgbG9naWMgdG8gdmFsaWRhdGUgdW5zaWduZWQgYGNsYWltX2F0dGVzdGAgY2FsbC4AWFRvdGFsIENvbXBsZXhpdHk6IE8oMSkkPC93ZWlnaHQ+GGF0dGVzdAQBJHN0YXRlbWVudDgBHFZlYzx1OD4AA0z0QXR0ZXN0IHRvIGEgc3RhdGVtZW50LCBuZWVkZWQgdG8gZmluYWxpemUgdGhlIGNsYWltcyBwcm9jZXNzLgAZAVdBUk5JTkc6IEluc2VjdXJlIHVubGVzcyB5b3VyIGNoYWluIGluY2x1ZGVzIGBQcmV2YWxpZGF0ZUF0dGVzdHNgIGFzIGFIYFNpZ25lZEV4dGVuc2lvbmAuAFBVbnNpZ25lZCBWYWxpZGF0aW9uOikBQSBjYWxsIHRvIGF0dGVzdCBpcyBkZWVtZWQgdmFsaWQgaWYgdGhlIHNlbmRlciBoYXMgYSBgUHJlY2xhaW1gIHJlZ2lzdGVyZWT0YW5kIHByb3ZpZGVzIGEgYHN0YXRlbWVudGAgd2hpY2ggaXMgZXhwZWN0ZWQgZm9yIHRoZSBhY2NvdW50LgAsUGFyYW1ldGVyczo5AS0gYHN0YXRlbWVudGA6IFRoZSBpZGVudGl0eSBvZiB0aGUgc3RhdGVtZW50IHdoaWNoIGlzIGJlaW5nIGF0dGVzdGVkIHRvIGluIHRoZTAgIHNpZ25hdHVyZS4AIDx3ZWlnaHQ+/FRoZSB3ZWlnaHQgb2YgdGhpcyBjYWxsIGlzIGludmFyaWFudCBvdmVyIHRoZSBpbnB1dCBwYXJhbWV0ZXJzLvBXZWlnaHQgaW5jbHVkZXMgbG9naWMgdG8gZG8gcHJlLXZhbGlkYXRpb24gb24gYGF0dGVzdGAgY2FsbC4AWFRvdGFsIENvbXBsZXhpdHk6IE8oMSkkPC93ZWlnaHQ+KG1vdmVfY2xhaW0MAQxvbGTdAgE8RXRoZXJldW1BZGRyZXNzAAEMbmV33QIBPEV0aGVyZXVtQWRkcmVzcwABOG1heWJlX3ByZWNsYWlt/QEBUE9wdGlvbjxUOjpBY2NvdW50SWQ+AAQABA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLtUCDFxwb2xrYWRvdF9ydW50aW1lX2NvbW1vbhhjbGFpbXM4RWNkc2FTaWduYXR1cmUAAAQA2QIBIFt1ODsgNjVdAADZAgAAA0EAAAAIAN0CDFxwb2xrYWRvdF9ydW50aW1lX2NvbW1vbhhjbGFpbXM8RXRoZXJldW1BZGRyZXNzAAAEAPgBIFt1ODsgMjBdAADhAgQYT3B0aW9uBARUAeUCAQgQTm9uZQAAABBTb21lBADlAgAAAQAA5QIAAAQMGBgQAOkCBBhPcHRpb24EBFQB7QIBCBBOb25lAAAAEFNvbWUEAO0CAAABAADtAgxccG9sa2Fkb3RfcnVudGltZV9jb21tb24YY2xhaW1zNFN0YXRlbWVudEtpbmQAAQgcUmVndWxhcgAAABBTYWZ0AAEAAPECDDhwYWxsZXRfdmVzdGluZxhwYWxsZXQQQ2FsbAQEVAABGBB2ZXN0AAAkuFVubG9jayBhbnkgdmVzdGVkIGZ1bmRzIG9mIHRoZSBzZW5kZXIgYWNjb3VudC4AXQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXyBhbmQgdGhlIHNlbmRlciBtdXN0IGhhdmUgZnVuZHMgc3RpbGxkbG9ja2VkIHVuZGVyIHRoaXMgcGFsbGV0LgDQRW1pdHMgZWl0aGVyIGBWZXN0aW5nQ29tcGxldGVkYCBvciBgVmVzdGluZ1VwZGF0ZWRgLgA0IyMgQ29tcGxleGl0eSQtIGBPKDEpYC4odmVzdF9vdGhlcgQBGHRhcmdldMUBAVBBY2NvdW50SWRMb29rdXBPZjxUPgABLLhVbmxvY2sgYW55IHZlc3RlZCBmdW5kcyBvZiBhIGB0YXJnZXRgIGFjY291bnQuAMxUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXy4AUQEtIGB0YXJnZXRgOiBUaGUgYWNjb3VudCB3aG9zZSB2ZXN0ZWQgZnVuZHMgc2hvdWxkIGJlIHVubG9ja2VkLiBNdXN0IGhhdmUgZnVuZHMgc3RpbGxkbG9ja2VkIHVuZGVyIHRoaXMgcGFsbGV0LgDQRW1pdHMgZWl0aGVyIGBWZXN0aW5nQ29tcGxldGVkYCBvciBgVmVzdGluZ1VwZGF0ZWRgLgA0IyMgQ29tcGxleGl0eSQtIGBPKDEpYC48dmVzdGVkX3RyYW5zZmVyCAEYdGFyZ2V0xQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEgc2NoZWR1bGX1AgGwVmVzdGluZ0luZm88QmFsYW5jZU9mPFQ+LCBCbG9ja051bWJlckZvcjxUPj4AAjRkQ3JlYXRlIGEgdmVzdGVkIHRyYW5zZmVyLgDMVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uAMwtIGB0YXJnZXRgOiBUaGUgYWNjb3VudCByZWNlaXZpbmcgdGhlIHZlc3RlZCBmdW5kcy7wLSBgc2NoZWR1bGVgOiBUaGUgdmVzdGluZyBzY2hlZHVsZSBhdHRhY2hlZCB0byB0aGUgdHJhbnNmZXIuAFxFbWl0cyBgVmVzdGluZ0NyZWF0ZWRgLgD8Tk9URTogVGhpcyB3aWxsIHVubG9jayBhbGwgc2NoZWR1bGVzIHRocm91Z2ggdGhlIGN1cnJlbnQgYmxvY2suADQjIyBDb21wbGV4aXR5JC0gYE8oMSlgLlRmb3JjZV92ZXN0ZWRfdHJhbnNmZXIMARhzb3VyY2XFAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AARh0YXJnZXTFAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AASBzY2hlZHVsZfUCAbBWZXN0aW5nSW5mbzxCYWxhbmNlT2Y8VD4sIEJsb2NrTnVtYmVyRm9yPFQ+PgADOGBGb3JjZSBhIHZlc3RlZCB0cmFuc2Zlci4AxFRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9Sb290Xy4A6C0gYHNvdXJjZWA6IFRoZSBhY2NvdW50IHdob3NlIGZ1bmRzIHNob3VsZCBiZSB0cmFuc2ZlcnJlZC4RAS0gYHRhcmdldGA6IFRoZSBhY2NvdW50IHRoYXQgc2hvdWxkIGJlIHRyYW5zZmVycmVkIHRoZSB2ZXN0ZWQgZnVuZHMu8C0gYHNjaGVkdWxlYDogVGhlIHZlc3Rpbmcgc2NoZWR1bGUgYXR0YWNoZWQgdG8gdGhlIHRyYW5zZmVyLgBcRW1pdHMgYFZlc3RpbmdDcmVhdGVkYC4A/E5PVEU6IFRoaXMgd2lsbCB1bmxvY2sgYWxsIHNjaGVkdWxlcyB0aHJvdWdoIHRoZSBjdXJyZW50IGJsb2NrLgA0IyMgQ29tcGxleGl0eSQtIGBPKDEpYC48bWVyZ2Vfc2NoZWR1bGVzCAE8c2NoZWR1bGUxX2luZGV4EAEMdTMyAAE8c2NoZWR1bGUyX2luZGV4EAEMdTMyAARUXQFNZXJnZSB0d28gdmVzdGluZyBzY2hlZHVsZXMgdG9nZXRoZXIsIGNyZWF0aW5nIGEgbmV3IHZlc3Rpbmcgc2NoZWR1bGUgdGhhdCB1bmxvY2tzIG92ZXJVAXRoZSBoaWdoZXN0IHBvc3NpYmxlIHN0YXJ0IGFuZCBlbmQgYmxvY2tzLiBJZiBib3RoIHNjaGVkdWxlcyBoYXZlIGFscmVhZHkgc3RhcnRlZCB0aGVZAWN1cnJlbnQgYmxvY2sgd2lsbCBiZSB1c2VkIGFzIHRoZSBzY2hlZHVsZSBzdGFydDsgd2l0aCB0aGUgY2F2ZWF0IHRoYXQgaWYgb25lIHNjaGVkdWxlXQFpcyBmaW5pc2hlZCBieSB0aGUgY3VycmVudCBibG9jaywgdGhlIG90aGVyIHdpbGwgYmUgdHJlYXRlZCBhcyB0aGUgbmV3IG1lcmdlZCBzY2hlZHVsZSwsdW5tb2RpZmllZC4A+E5PVEU6IElmIGBzY2hlZHVsZTFfaW5kZXggPT0gc2NoZWR1bGUyX2luZGV4YCB0aGlzIGlzIGEgbm8tb3AuQQFOT1RFOiBUaGlzIHdpbGwgdW5sb2NrIGFsbCBzY2hlZHVsZXMgdGhyb3VnaCB0aGUgY3VycmVudCBibG9jayBwcmlvciB0byBtZXJnaW5nLmEBTk9URTogSWYgYm90aCBzY2hlZHVsZXMgaGF2ZSBlbmRlZCBieSB0aGUgY3VycmVudCBibG9jaywgbm8gbmV3IHNjaGVkdWxlIHdpbGwgYmUgY3JlYXRlZGRhbmQgYm90aCB3aWxsIGJlIHJlbW92ZWQuAGxNZXJnZWQgc2NoZWR1bGUgYXR0cmlidXRlczo1AS0gYHN0YXJ0aW5nX2Jsb2NrYDogYE1BWChzY2hlZHVsZTEuc3RhcnRpbmdfYmxvY2ssIHNjaGVkdWxlZDIuc3RhcnRpbmdfYmxvY2ssSCAgY3VycmVudF9ibG9jaylgLiEBLSBgZW5kaW5nX2Jsb2NrYDogYE1BWChzY2hlZHVsZTEuZW5kaW5nX2Jsb2NrLCBzY2hlZHVsZTIuZW5kaW5nX2Jsb2NrKWAuWQEtIGBsb2NrZWRgOiBgc2NoZWR1bGUxLmxvY2tlZF9hdChjdXJyZW50X2Jsb2NrKSArIHNjaGVkdWxlMi5sb2NrZWRfYXQoY3VycmVudF9ibG9jaylgLgDMVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uAOgtIGBzY2hlZHVsZTFfaW5kZXhgOiBpbmRleCBvZiB0aGUgZmlyc3Qgc2NoZWR1bGUgdG8gbWVyZ2Uu7C0gYHNjaGVkdWxlMl9pbmRleGA6IGluZGV4IG9mIHRoZSBzZWNvbmQgc2NoZWR1bGUgdG8gbWVyZ2UudGZvcmNlX3JlbW92ZV92ZXN0aW5nX3NjaGVkdWxlCAEYdGFyZ2V0xQEBjDxUOjpMb29rdXAgYXMgU3RhdGljTG9va3VwPjo6U291cmNlAAE4c2NoZWR1bGVfaW5kZXgQAQx1MzIABRh8Rm9yY2UgcmVtb3ZlIGEgdmVzdGluZyBzY2hlZHVsZQDEVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1Jvb3RfLgDILSBgdGFyZ2V0YDogQW4gYWNjb3VudCB0aGF0IGhhcyBhIHZlc3Rpbmcgc2NoZWR1bGUVAS0gYHNjaGVkdWxlX2luZGV4YDogVGhlIHZlc3Rpbmcgc2NoZWR1bGUgaW5kZXggdGhhdCBzaG91bGQgYmUgcmVtb3ZlZAQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy71Agw4cGFsbGV0X3Zlc3RpbmcwdmVzdGluZ19pbmZvLFZlc3RpbmdJbmZvCBxCYWxhbmNlARgsQmxvY2tOdW1iZXIBEAAMARhsb2NrZWQYARxCYWxhbmNlAAEkcGVyX2Jsb2NrGAEcQmFsYW5jZQABOHN0YXJ0aW5nX2Jsb2NrEAEsQmxvY2tOdW1iZXIAAPkCDDhwYWxsZXRfdXRpbGl0eRhwYWxsZXQQQ2FsbAQEVAABGBRiYXRjaAQBFGNhbGxz/QIBfFZlYzw8VCBhcyBDb25maWc+OjpSdW50aW1lQ2FsbD4AAEh8U2VuZCBhIGJhdGNoIG9mIGRpc3BhdGNoIGNhbGxzLgCwTWF5IGJlIGNhbGxlZCBmcm9tIGFueSBvcmlnaW4gZXhjZXB0IGBOb25lYC4AXQEtIGBjYWxsc2A6IFRoZSBjYWxscyB0byBiZSBkaXNwYXRjaGVkIGZyb20gdGhlIHNhbWUgb3JpZ2luLiBUaGUgbnVtYmVyIG9mIGNhbGwgbXVzdCBub3Q5ASAgZXhjZWVkIHRoZSBjb25zdGFudDogYGJhdGNoZWRfY2FsbHNfbGltaXRgIChhdmFpbGFibGUgaW4gY29uc3RhbnQgbWV0YWRhdGEpLgBVAUlmIG9yaWdpbiBpcyByb290IHRoZW4gdGhlIGNhbGxzIGFyZSBkaXNwYXRjaGVkIHdpdGhvdXQgY2hlY2tpbmcgb3JpZ2luIGZpbHRlci4gKFRoaXPsaW5jbHVkZXMgYnlwYXNzaW5nIGBmcmFtZV9zeXN0ZW06OkNvbmZpZzo6QmFzZUNhbGxGaWx0ZXJgKS4ANCMjIENvbXBsZXhpdHnQLSBPKEMpIHdoZXJlIEMgaXMgdGhlIG51bWJlciBvZiBjYWxscyB0byBiZSBiYXRjaGVkLgBVAVRoaXMgd2lsbCByZXR1cm4gYE9rYCBpbiBhbGwgY2lyY3Vtc3RhbmNlcy4gVG8gZGV0ZXJtaW5lIHRoZSBzdWNjZXNzIG9mIHRoZSBiYXRjaCwgYW4xAWV2ZW50IGlzIGRlcG9zaXRlZC4gSWYgYSBjYWxsIGZhaWxlZCBhbmQgdGhlIGJhdGNoIHdhcyBpbnRlcnJ1cHRlZCwgdGhlbiB0aGVVAWBCYXRjaEludGVycnVwdGVkYCBldmVudCBpcyBkZXBvc2l0ZWQsIGFsb25nIHdpdGggdGhlIG51bWJlciBvZiBzdWNjZXNzZnVsIGNhbGxzIG1hZGVNAWFuZCB0aGUgZXJyb3Igb2YgdGhlIGZhaWxlZCBjYWxsLiBJZiBhbGwgd2VyZSBzdWNjZXNzZnVsLCB0aGVuIHRoZSBgQmF0Y2hDb21wbGV0ZWRgTGV2ZW50IGlzIGRlcG9zaXRlZC40YXNfZGVyaXZhdGl2ZQgBFGluZGV4bQEBDHUxNgABEGNhbGx1AQF8Qm94PDxUIGFzIENvbmZpZz46OlJ1bnRpbWVDYWxsPgABNNxTZW5kIGEgY2FsbCB0aHJvdWdoIGFuIGluZGV4ZWQgcHNldWRvbnltIG9mIHRoZSBzZW5kZXIuAFUBRmlsdGVyIGZyb20gb3JpZ2luIGFyZSBwYXNzZWQgYWxvbmcuIFRoZSBjYWxsIHdpbGwgYmUgZGlzcGF0Y2hlZCB3aXRoIGFuIG9yaWdpbiB3aGljaLx1c2UgdGhlIHNhbWUgZmlsdGVyIGFzIHRoZSBvcmlnaW4gb2YgdGhpcyBjYWxsLgBFAU5PVEU6IElmIHlvdSBuZWVkIHRvIGVuc3VyZSB0aGF0IGFueSBhY2NvdW50LWJhc2VkIGZpbHRlcmluZyBpcyBub3QgaG9ub3JlZCAoaS5lLmEBYmVjYXVzZSB5b3UgZXhwZWN0IGBwcm94eWAgdG8gaGF2ZSBiZWVuIHVzZWQgcHJpb3IgaW4gdGhlIGNhbGwgc3RhY2sgYW5kIHlvdSBkbyBub3Qgd2FudFEBdGhlIGNhbGwgcmVzdHJpY3Rpb25zIHRvIGFwcGx5IHRvIGFueSBzdWItYWNjb3VudHMpLCB0aGVuIHVzZSBgYXNfbXVsdGlfdGhyZXNob2xkXzFgfGluIHRoZSBNdWx0aXNpZyBwYWxsZXQgaW5zdGVhZC4A9E5PVEU6IFByaW9yIHRvIHZlcnNpb24gKjEyLCB0aGlzIHdhcyBjYWxsZWQgYGFzX2xpbWl0ZWRfc3ViYC4AzFRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfLiRiYXRjaF9hbGwEARRjYWxsc/0CAXxWZWM8PFQgYXMgQ29uZmlnPjo6UnVudGltZUNhbGw+AAI07FNlbmQgYSBiYXRjaCBvZiBkaXNwYXRjaCBjYWxscyBhbmQgYXRvbWljYWxseSBleGVjdXRlIHRoZW0uIQFUaGUgd2hvbGUgdHJhbnNhY3Rpb24gd2lsbCByb2xsYmFjayBhbmQgZmFpbCBpZiBhbnkgb2YgdGhlIGNhbGxzIGZhaWxlZC4AsE1heSBiZSBjYWxsZWQgZnJvbSBhbnkgb3JpZ2luIGV4Y2VwdCBgTm9uZWAuAF0BLSBgY2FsbHNgOiBUaGUgY2FsbHMgdG8gYmUgZGlzcGF0Y2hlZCBmcm9tIHRoZSBzYW1lIG9yaWdpbi4gVGhlIG51bWJlciBvZiBjYWxsIG11c3Qgbm90OQEgIGV4Y2VlZCB0aGUgY29uc3RhbnQ6IGBiYXRjaGVkX2NhbGxzX2xpbWl0YCAoYXZhaWxhYmxlIGluIGNvbnN0YW50IG1ldGFkYXRhKS4AVQFJZiBvcmlnaW4gaXMgcm9vdCB0aGVuIHRoZSBjYWxscyBhcmUgZGlzcGF0Y2hlZCB3aXRob3V0IGNoZWNraW5nIG9yaWdpbiBmaWx0ZXIuIChUaGlz7GluY2x1ZGVzIGJ5cGFzc2luZyBgZnJhbWVfc3lzdGVtOjpDb25maWc6OkJhc2VDYWxsRmlsdGVyYCkuADQjIyBDb21wbGV4aXR50C0gTyhDKSB3aGVyZSBDIGlzIHRoZSBudW1iZXIgb2YgY2FsbHMgdG8gYmUgYmF0Y2hlZC4sZGlzcGF0Y2hfYXMIASRhc19vcmlnaW59AgFUQm94PFQ6OlBhbGxldHNPcmlnaW4+AAEQY2FsbHUBAXxCb3g8PFQgYXMgQ29uZmlnPjo6UnVudGltZUNhbGw+AAMYyERpc3BhdGNoZXMgYSBmdW5jdGlvbiBjYWxsIHdpdGggYSBwcm92aWRlZCBvcmlnaW4uAMRUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfUm9vdF8uADQjIyBDb21wbGV4aXR5HC0gTygxKS4sZm9yY2VfYmF0Y2gEARRjYWxsc/0CAXxWZWM8PFQgYXMgQ29uZmlnPjo6UnVudGltZUNhbGw+AAQ0fFNlbmQgYSBiYXRjaCBvZiBkaXNwYXRjaCBjYWxscy7UVW5saWtlIGBiYXRjaGAsIGl0IGFsbG93cyBlcnJvcnMgYW5kIHdvbid0IGludGVycnVwdC4AsE1heSBiZSBjYWxsZWQgZnJvbSBhbnkgb3JpZ2luIGV4Y2VwdCBgTm9uZWAuAF0BLSBgY2FsbHNgOiBUaGUgY2FsbHMgdG8gYmUgZGlzcGF0Y2hlZCBmcm9tIHRoZSBzYW1lIG9yaWdpbi4gVGhlIG51bWJlciBvZiBjYWxsIG11c3Qgbm90OQEgIGV4Y2VlZCB0aGUgY29uc3RhbnQ6IGBiYXRjaGVkX2NhbGxzX2xpbWl0YCAoYXZhaWxhYmxlIGluIGNvbnN0YW50IG1ldGFkYXRhKS4ATQFJZiBvcmlnaW4gaXMgcm9vdCB0aGVuIHRoZSBjYWxscyBhcmUgZGlzcGF0Y2ggd2l0aG91dCBjaGVja2luZyBvcmlnaW4gZmlsdGVyLiAoVGhpc+xpbmNsdWRlcyBieXBhc3NpbmcgYGZyYW1lX3N5c3RlbTo6Q29uZmlnOjpCYXNlQ2FsbEZpbHRlcmApLgA0IyMgQ29tcGxleGl0edAtIE8oQykgd2hlcmUgQyBpcyB0aGUgbnVtYmVyIG9mIGNhbGxzIHRvIGJlIGJhdGNoZWQuLHdpdGhfd2VpZ2h0CAEQY2FsbHUBAXxCb3g8PFQgYXMgQ29uZmlnPjo6UnVudGltZUNhbGw+AAEYd2VpZ2h0KAEYV2VpZ2h0AAUYxERpc3BhdGNoIGEgZnVuY3Rpb24gY2FsbCB3aXRoIGEgc3BlY2lmaWVkIHdlaWdodC4ALQFUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IGNoZWNrIHRoZSB3ZWlnaHQgb2YgdGhlIGNhbGwsIGFuZCBpbnN0ZWFkIGFsbG93cyB0aGW4Um9vdCBvcmlnaW4gdG8gc3BlY2lmeSB0aGUgd2VpZ2h0IG9mIHRoZSBjYWxsLgDEVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1Jvb3RfLgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy79AgAAAnUBAAEDDDBwYWxsZXRfcHJveHkYcGFsbGV0EENhbGwEBFQAASgUcHJveHkMARByZWFsxQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAFAZm9yY2VfcHJveHlfdHlwZQUDAVBPcHRpb248VDo6UHJveHlUeXBlPgABEGNhbGx1AQF8Qm94PDxUIGFzIENvbmZpZz46OlJ1bnRpbWVDYWxsPgAAJE0BRGlzcGF0Y2ggdGhlIGdpdmVuIGBjYWxsYCBmcm9tIGFuIGFjY291bnQgdGhhdCB0aGUgc2VuZGVyIGlzIGF1dGhvcmlzZWQgZm9yIHRocm91Z2gwYGFkZF9wcm94eWAuAMxUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXy4ALFBhcmFtZXRlcnM6DQEtIGByZWFsYDogVGhlIGFjY291bnQgdGhhdCB0aGUgcHJveHkgd2lsbCBtYWtlIGEgY2FsbCBvbiBiZWhhbGYgb2YuYQEtIGBmb3JjZV9wcm94eV90eXBlYDogU3BlY2lmeSB0aGUgZXhhY3QgcHJveHkgdHlwZSB0byBiZSB1c2VkIGFuZCBjaGVja2VkIGZvciB0aGlzIGNhbGwu0C0gYGNhbGxgOiBUaGUgY2FsbCB0byBiZSBtYWRlIGJ5IHRoZSBgcmVhbGAgYWNjb3VudC4kYWRkX3Byb3h5DAEgZGVsZWdhdGXFAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AAShwcm94eV90eXBlCQMBMFQ6OlByb3h5VHlwZQABFGRlbGF5EAFEQmxvY2tOdW1iZXJGb3I8VD4AASRFAVJlZ2lzdGVyIGEgcHJveHkgYWNjb3VudCBmb3IgdGhlIHNlbmRlciB0aGF0IGlzIGFibGUgdG8gbWFrZSBjYWxscyBvbiBpdHMgYmVoYWxmLgDMVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uACxQYXJhbWV0ZXJzOhEBLSBgcHJveHlgOiBUaGUgYWNjb3VudCB0aGF0IHRoZSBgY2FsbGVyYCB3b3VsZCBsaWtlIHRvIG1ha2UgYSBwcm94eS78LSBgcHJveHlfdHlwZWA6IFRoZSBwZXJtaXNzaW9ucyBhbGxvd2VkIGZvciB0aGlzIHByb3h5IGFjY291bnQuTQEtIGBkZWxheWA6IFRoZSBhbm5vdW5jZW1lbnQgcGVyaW9kIHJlcXVpcmVkIG9mIHRoZSBpbml0aWFsIHByb3h5LiBXaWxsIGdlbmVyYWxseSBiZRR6ZXJvLjByZW1vdmVfcHJveHkMASBkZWxlZ2F0ZcUBAVBBY2NvdW50SWRMb29rdXBPZjxUPgABKHByb3h5X3R5cGUJAwEwVDo6UHJveHlUeXBlAAEUZGVsYXkQAURCbG9ja051bWJlckZvcjxUPgACHKhVbnJlZ2lzdGVyIGEgcHJveHkgYWNjb3VudCBmb3IgdGhlIHNlbmRlci4AzFRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfLgAsUGFyYW1ldGVyczolAS0gYHByb3h5YDogVGhlIGFjY291bnQgdGhhdCB0aGUgYGNhbGxlcmAgd291bGQgbGlrZSB0byByZW1vdmUgYXMgYSBwcm94eS5BAS0gYHByb3h5X3R5cGVgOiBUaGUgcGVybWlzc2lvbnMgY3VycmVudGx5IGVuYWJsZWQgZm9yIHRoZSByZW1vdmVkIHByb3h5IGFjY291bnQuOHJlbW92ZV9wcm94aWVzAAMYtFVucmVnaXN0ZXIgYWxsIHByb3h5IGFjY291bnRzIGZvciB0aGUgc2VuZGVyLgDMVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uAEEBV0FSTklORzogVGhpcyBtYXkgYmUgY2FsbGVkIG9uIGFjY291bnRzIGNyZWF0ZWQgYnkgYHB1cmVgLCBob3dldmVyIGlmIGRvbmUsIHRoZW5ZAXRoZSB1bnJlc2VydmVkIGZlZXMgd2lsbCBiZSBpbmFjY2Vzc2libGUuICoqQWxsIGFjY2VzcyB0byB0aGlzIGFjY291bnQgd2lsbCBiZSBsb3N0LioqLGNyZWF0ZV9wdXJlDAEocHJveHlfdHlwZQkDATBUOjpQcm94eVR5cGUAARRkZWxheRABREJsb2NrTnVtYmVyRm9yPFQ+AAEUaW5kZXhtAQEMdTE2AARIOQFTcGF3biBhIGZyZXNoIG5ldyBhY2NvdW50IHRoYXQgaXMgZ3VhcmFudGVlZCB0byBiZSBvdGhlcndpc2UgaW5hY2Nlc3NpYmxlLCBhbmT8aW5pdGlhbGl6ZSBpdCB3aXRoIGEgcHJveHkgb2YgYHByb3h5X3R5cGVgIGZvciBgb3JpZ2luYCBzZW5kZXIuAGxSZXF1aXJlcyBhIGBTaWduZWRgIG9yaWdpbi4AUQEtIGBwcm94eV90eXBlYDogVGhlIHR5cGUgb2YgdGhlIHByb3h5IHRoYXQgdGhlIHNlbmRlciB3aWxsIGJlIHJlZ2lzdGVyZWQgYXMgb3ZlciB0aGVNAW5ldyBhY2NvdW50LiBUaGlzIHdpbGwgYWxtb3N0IGFsd2F5cyBiZSB0aGUgbW9zdCBwZXJtaXNzaXZlIGBQcm94eVR5cGVgIHBvc3NpYmxlIHRveGFsbG93IGZvciBtYXhpbXVtIGZsZXhpYmlsaXR5LlEBLSBgaW5kZXhgOiBBIGRpc2FtYmlndWF0aW9uIGluZGV4LCBpbiBjYXNlIHRoaXMgaXMgY2FsbGVkIG11bHRpcGxlIHRpbWVzIGluIHRoZSBzYW1lXQF0cmFuc2FjdGlvbiAoZS5nLiB3aXRoIGB1dGlsaXR5OjpiYXRjaGApLiBVbmxlc3MgeW91J3JlIHVzaW5nIGBiYXRjaGAgeW91IHByb2JhYmx5IGp1c3RAd2FudCB0byB1c2UgYDBgLk0BLSBgZGVsYXlgOiBUaGUgYW5ub3VuY2VtZW50IHBlcmlvZCByZXF1aXJlZCBvZiB0aGUgaW5pdGlhbCBwcm94eS4gV2lsbCBnZW5lcmFsbHkgYmUUemVyby4AUQFGYWlscyB3aXRoIGBEdXBsaWNhdGVgIGlmIHRoaXMgaGFzIGFscmVhZHkgYmVlbiBjYWxsZWQgaW4gdGhpcyB0cmFuc2FjdGlvbiwgZnJvbSB0aGWYc2FtZSBzZW5kZXIsIHdpdGggdGhlIHNhbWUgcGFyYW1ldGVycy4A5EZhaWxzIGlmIHRoZXJlIGFyZSBpbnN1ZmZpY2llbnQgZnVuZHMgdG8gcGF5IGZvciBkZXBvc2l0LiRraWxsX3B1cmUUARxzcGF3bmVyxQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEocHJveHlfdHlwZQkDATBUOjpQcm94eVR5cGUAARRpbmRleG0BAQx1MTYAARhoZWlnaHTsAURCbG9ja051bWJlckZvcjxUPgABJGV4dF9pbmRleOwBDHUzMgAFQKBSZW1vdmVzIGEgcHJldmlvdXNseSBzcGF3bmVkIHB1cmUgcHJveHkuAEkBV0FSTklORzogKipBbGwgYWNjZXNzIHRvIHRoaXMgYWNjb3VudCB3aWxsIGJlIGxvc3QuKiogQW55IGZ1bmRzIGhlbGQgaW4gaXQgd2lsbCBiZTRpbmFjY2Vzc2libGUuAFkBUmVxdWlyZXMgYSBgU2lnbmVkYCBvcmlnaW4sIGFuZCB0aGUgc2VuZGVyIGFjY291bnQgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCBieSBhIGNhbGwgdG+UYHB1cmVgIHdpdGggY29ycmVzcG9uZGluZyBwYXJhbWV0ZXJzLgA5AS0gYHNwYXduZXJgOiBUaGUgYWNjb3VudCB0aGF0IG9yaWdpbmFsbHkgY2FsbGVkIGBwdXJlYCB0byBjcmVhdGUgdGhpcyBhY2NvdW50LjkBLSBgaW5kZXhgOiBUaGUgZGlzYW1iaWd1YXRpb24gaW5kZXggb3JpZ2luYWxseSBwYXNzZWQgdG8gYHB1cmVgLiBQcm9iYWJseSBgMGAu7C0gYHByb3h5X3R5cGVgOiBUaGUgcHJveHkgdHlwZSBvcmlnaW5hbGx5IHBhc3NlZCB0byBgcHVyZWAuKQEtIGBoZWlnaHRgOiBUaGUgaGVpZ2h0IG9mIHRoZSBjaGFpbiB3aGVuIHRoZSBjYWxsIHRvIGBwdXJlYCB3YXMgcHJvY2Vzc2VkLjUBLSBgZXh0X2luZGV4YDogVGhlIGV4dHJpbnNpYyBpbmRleCBpbiB3aGljaCB0aGUgY2FsbCB0byBgcHVyZWAgd2FzIHByb2Nlc3NlZC4ANQFGYWlscyB3aXRoIGBOb1Blcm1pc3Npb25gIGluIGNhc2UgdGhlIGNhbGxlciBpcyBub3QgYSBwcmV2aW91c2x5IGNyZWF0ZWQgcHVyZdxhY2NvdW50IHdob3NlIGBwdXJlYCBjYWxsIGhhcyBjb3JyZXNwb25kaW5nIHBhcmFtZXRlcnMuIGFubm91bmNlCAEQcmVhbMUBAVBBY2NvdW50SWRMb29rdXBPZjxUPgABJGNhbGxfaGFzaDQBNENhbGxIYXNoT2Y8VD4ABjwFAVB1Ymxpc2ggdGhlIGhhc2ggb2YgYSBwcm94eS1jYWxsIHRoYXQgd2lsbCBiZSBtYWRlIGluIHRoZSBmdXR1cmUuAF0BVGhpcyBtdXN0IGJlIGNhbGxlZCBzb21lIG51bWJlciBvZiBibG9ja3MgYmVmb3JlIHRoZSBjb3JyZXNwb25kaW5nIGBwcm94eWAgaXMgYXR0ZW1wdGVkJQFpZiB0aGUgZGVsYXkgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm94eSByZWxhdGlvbnNoaXAgaXMgZ3JlYXRlciB0aGFuIHplcm8uABEBTm8gbW9yZSB0aGFuIGBNYXhQZW5kaW5nYCBhbm5vdW5jZW1lbnRzIG1heSBiZSBtYWRlIGF0IGFueSBvbmUgdGltZS4ACQFUaGlzIHdpbGwgdGFrZSBhIGRlcG9zaXQgb2YgYEFubm91bmNlbWVudERlcG9zaXRGYWN0b3JgIGFzIHdlbGwgYXMZAWBBbm5vdW5jZW1lbnREZXBvc2l0QmFzZWAgaWYgdGhlcmUgYXJlIG5vIG90aGVyIHBlbmRpbmcgYW5ub3VuY2VtZW50cy4AJQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXyBhbmQgYSBwcm94eSBvZiBgcmVhbGAuACxQYXJhbWV0ZXJzOg0BLSBgcmVhbGA6IFRoZSBhY2NvdW50IHRoYXQgdGhlIHByb3h5IHdpbGwgbWFrZSBhIGNhbGwgb24gYmVoYWxmIG9mLhUBLSBgY2FsbF9oYXNoYDogVGhlIGhhc2ggb2YgdGhlIGNhbGwgdG8gYmUgbWFkZSBieSB0aGUgYHJlYWxgIGFjY291bnQuTHJlbW92ZV9hbm5vdW5jZW1lbnQIARByZWFsxQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEkY2FsbF9oYXNoNAE0Q2FsbEhhc2hPZjxUPgAHKHBSZW1vdmUgYSBnaXZlbiBhbm5vdW5jZW1lbnQuAFkBTWF5IGJlIGNhbGxlZCBieSBhIHByb3h5IGFjY291bnQgdG8gcmVtb3ZlIGEgY2FsbCB0aGV5IHByZXZpb3VzbHkgYW5ub3VuY2VkIGFuZCByZXR1cm4wdGhlIGRlcG9zaXQuAMxUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXy4ALFBhcmFtZXRlcnM6DQEtIGByZWFsYDogVGhlIGFjY291bnQgdGhhdCB0aGUgcHJveHkgd2lsbCBtYWtlIGEgY2FsbCBvbiBiZWhhbGYgb2YuFQEtIGBjYWxsX2hhc2hgOiBUaGUgaGFzaCBvZiB0aGUgY2FsbCB0byBiZSBtYWRlIGJ5IHRoZSBgcmVhbGAgYWNjb3VudC5McmVqZWN0X2Fubm91bmNlbWVudAgBIGRlbGVnYXRlxQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEkY2FsbF9oYXNoNAE0Q2FsbEhhc2hPZjxUPgAIKLBSZW1vdmUgdGhlIGdpdmVuIGFubm91bmNlbWVudCBvZiBhIGRlbGVnYXRlLgBhAU1heSBiZSBjYWxsZWQgYnkgYSB0YXJnZXQgKHByb3hpZWQpIGFjY291bnQgdG8gcmVtb3ZlIGEgY2FsbCB0aGF0IG9uZSBvZiB0aGVpciBkZWxlZ2F0ZXMlAShgZGVsZWdhdGVgKSBoYXMgYW5ub3VuY2VkIHRoZXkgd2FudCB0byBleGVjdXRlLiBUaGUgZGVwb3NpdCBpcyByZXR1cm5lZC4AzFRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfLgAsUGFyYW1ldGVyczr0LSBgZGVsZWdhdGVgOiBUaGUgYWNjb3VudCB0aGF0IHByZXZpb3VzbHkgYW5ub3VuY2VkIHRoZSBjYWxsLrwtIGBjYWxsX2hhc2hgOiBUaGUgaGFzaCBvZiB0aGUgY2FsbCB0byBiZSBtYWRlLjxwcm94eV9hbm5vdW5jZWQQASBkZWxlZ2F0ZcUBAVBBY2NvdW50SWRMb29rdXBPZjxUPgABEHJlYWzFAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AAUBmb3JjZV9wcm94eV90eXBlBQMBUE9wdGlvbjxUOjpQcm94eVR5cGU+AAEQY2FsbHUBAXxCb3g8PFQgYXMgQ29uZmlnPjo6UnVudGltZUNhbGw+AAksTQFEaXNwYXRjaCB0aGUgZ2l2ZW4gYGNhbGxgIGZyb20gYW4gYWNjb3VudCB0aGF0IHRoZSBzZW5kZXIgaXMgYXV0aG9yaXplZCBmb3IgdGhyb3VnaDBgYWRkX3Byb3h5YC4AqFJlbW92ZXMgYW55IGNvcnJlc3BvbmRpbmcgYW5ub3VuY2VtZW50KHMpLgDMVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uACxQYXJhbWV0ZXJzOg0BLSBgcmVhbGA6IFRoZSBhY2NvdW50IHRoYXQgdGhlIHByb3h5IHdpbGwgbWFrZSBhIGNhbGwgb24gYmVoYWxmIG9mLmEBLSBgZm9yY2VfcHJveHlfdHlwZWA6IFNwZWNpZnkgdGhlIGV4YWN0IHByb3h5IHR5cGUgdG8gYmUgdXNlZCBhbmQgY2hlY2tlZCBmb3IgdGhpcyBjYWxsLtAtIGBjYWxsYDogVGhlIGNhbGwgdG8gYmUgbWFkZSBieSB0aGUgYHJlYWxgIGFjY291bnQuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLgUDBBhPcHRpb24EBFQBCQMBCBBOb25lAAAAEFNvbWUEAAkDAAABAAAJAwhAcG9sa2Fkb3RfcnVudGltZSRQcm94eVR5cGUAARwMQW55AAAALE5vblRyYW5zZmVyAAEAKEdvdmVybmFuY2UAAgAcU3Rha2luZwADACxDYW5jZWxQcm94eQAGABxBdWN0aW9uAAcAPE5vbWluYXRpb25Qb29scwAIAAANAww8cGFsbGV0X211bHRpc2lnGHBhbGxldBBDYWxsBARUAAEQUGFzX211bHRpX3RocmVzaG9sZF8xCAFEb3RoZXJfc2lnbmF0b3JpZXPRAQFEVmVjPFQ6OkFjY291bnRJZD4AARBjYWxsdQEBfEJveDw8VCBhcyBDb25maWc+OjpSdW50aW1lQ2FsbD4AADBRAUltbWVkaWF0ZWx5IGRpc3BhdGNoIGEgbXVsdGktc2lnbmF0dXJlIGNhbGwgdXNpbmcgYSBzaW5nbGUgYXBwcm92YWwgZnJvbSB0aGUgY2FsbGVyLgDMVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uAD0BLSBgb3RoZXJfc2lnbmF0b3JpZXNgOiBUaGUgYWNjb3VudHMgKG90aGVyIHRoYW4gdGhlIHNlbmRlcikgd2hvIGFyZSBwYXJ0IG9mIHRoZQEBbXVsdGktc2lnbmF0dXJlLCBidXQgZG8gbm90IHBhcnRpY2lwYXRlIGluIHRoZSBhcHByb3ZhbCBwcm9jZXNzLogtIGBjYWxsYDogVGhlIGNhbGwgdG8gYmUgZXhlY3V0ZWQuALhSZXN1bHQgaXMgZXF1aXZhbGVudCB0byB0aGUgZGlzcGF0Y2hlZCByZXN1bHQuADQjIyBDb21wbGV4aXR5GQFPKFogKyBDKSB3aGVyZSBaIGlzIHRoZSBsZW5ndGggb2YgdGhlIGNhbGwgYW5kIEMgaXRzIGV4ZWN1dGlvbiB3ZWlnaHQuIGFzX211bHRpFAEkdGhyZXNob2xkbQEBDHUxNgABRG90aGVyX3NpZ25hdG9yaWVz0QEBRFZlYzxUOjpBY2NvdW50SWQ+AAE8bWF5YmVfdGltZXBvaW50EQMBkE9wdGlvbjxUaW1lcG9pbnQ8QmxvY2tOdW1iZXJGb3I8VD4+PgABEGNhbGx1AQF8Qm94PDxUIGFzIENvbmZpZz46OlJ1bnRpbWVDYWxsPgABKG1heF93ZWlnaHQoARhXZWlnaHQAAZxVAVJlZ2lzdGVyIGFwcHJvdmFsIGZvciBhIGRpc3BhdGNoIHRvIGJlIG1hZGUgZnJvbSBhIGRldGVybWluaXN0aWMgY29tcG9zaXRlIGFjY291bnQgaWb4YXBwcm92ZWQgYnkgYSB0b3RhbCBvZiBgdGhyZXNob2xkIC0gMWAgb2YgYG90aGVyX3NpZ25hdG9yaWVzYC4AsElmIHRoZXJlIGFyZSBlbm91Z2gsIHRoZW4gZGlzcGF0Y2ggdGhlIGNhbGwuAC0BUGF5bWVudDogYERlcG9zaXRCYXNlYCB3aWxsIGJlIHJlc2VydmVkIGlmIHRoaXMgaXMgdGhlIGZpcnN0IGFwcHJvdmFsLCBwbHVzPQFgdGhyZXNob2xkYCB0aW1lcyBgRGVwb3NpdEZhY3RvcmAuIEl0IGlzIHJldHVybmVkIG9uY2UgdGhpcyBkaXNwYXRjaCBoYXBwZW5zIG9yNGlzIGNhbmNlbGxlZC4AzFRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfLgBVAS0gYHRocmVzaG9sZGA6IFRoZSB0b3RhbCBudW1iZXIgb2YgYXBwcm92YWxzIGZvciB0aGlzIGRpc3BhdGNoIGJlZm9yZSBpdCBpcyBleGVjdXRlZC5BAS0gYG90aGVyX3NpZ25hdG9yaWVzYDogVGhlIGFjY291bnRzIChvdGhlciB0aGFuIHRoZSBzZW5kZXIpIHdobyBjYW4gYXBwcm92ZSB0aGlzbGRpc3BhdGNoLiBNYXkgbm90IGJlIGVtcHR5LlkBLSBgbWF5YmVfdGltZXBvaW50YDogSWYgdGhpcyBpcyB0aGUgZmlyc3QgYXBwcm92YWwsIHRoZW4gdGhpcyBtdXN0IGJlIGBOb25lYC4gSWYgaXQgaXNRAW5vdCB0aGUgZmlyc3QgYXBwcm92YWwsIHRoZW4gaXQgbXVzdCBiZSBgU29tZWAsIHdpdGggdGhlIHRpbWVwb2ludCAoYmxvY2sgbnVtYmVyIGFuZNR0cmFuc2FjdGlvbiBpbmRleCkgb2YgdGhlIGZpcnN0IGFwcHJvdmFsIHRyYW5zYWN0aW9uLogtIGBjYWxsYDogVGhlIGNhbGwgdG8gYmUgZXhlY3V0ZWQuAB0BTk9URTogVW5sZXNzIHRoaXMgaXMgdGhlIGZpbmFsIGFwcHJvdmFsLCB5b3Ugd2lsbCBnZW5lcmFsbHkgd2FudCB0byB1c2UZAWBhcHByb3ZlX2FzX211bHRpYCBpbnN0ZWFkLCBzaW5jZSBpdCBvbmx5IHJlcXVpcmVzIGEgaGFzaCBvZiB0aGUgY2FsbC4AWQFSZXN1bHQgaXMgZXF1aXZhbGVudCB0byB0aGUgZGlzcGF0Y2hlZCByZXN1bHQgaWYgYHRocmVzaG9sZGAgaXMgZXhhY3RseSBgMWAuIE90aGVyd2lzZVUBb24gc3VjY2VzcywgcmVzdWx0IGlzIGBPa2AgYW5kIHRoZSByZXN1bHQgZnJvbSB0aGUgaW50ZXJpb3IgY2FsbCwgaWYgaXQgd2FzIGV4ZWN1dGVkLNxtYXkgYmUgZm91bmQgaW4gdGhlIGRlcG9zaXRlZCBgTXVsdGlzaWdFeGVjdXRlZGAgZXZlbnQuADQjIyBDb21wbGV4aXR5UC0gYE8oUyArIFogKyBDYWxsKWAuzC0gVXAgdG8gb25lIGJhbGFuY2UtcmVzZXJ2ZSBvciB1bnJlc2VydmUgb3BlcmF0aW9uLj0BLSBPbmUgcGFzc3Rocm91Z2ggb3BlcmF0aW9uLCBvbmUgaW5zZXJ0LCBib3RoIGBPKFMpYCB3aGVyZSBgU2AgaXMgdGhlIG51bWJlciBvZkUBICBzaWduYXRvcmllcy4gYFNgIGlzIGNhcHBlZCBieSBgTWF4U2lnbmF0b3JpZXNgLCB3aXRoIHdlaWdodCBiZWluZyBwcm9wb3J0aW9uYWwuIQEtIE9uZSBjYWxsIGVuY29kZSAmIGhhc2gsIGJvdGggb2YgY29tcGxleGl0eSBgTyhaKWAgd2hlcmUgYFpgIGlzIHR4LWxlbi68LSBPbmUgZW5jb2RlICYgaGFzaCwgYm90aCBvZiBjb21wbGV4aXR5IGBPKFMpYC7ULSBVcCB0byBvbmUgYmluYXJ5IHNlYXJjaCBhbmQgaW5zZXJ0IChgTyhsb2dTICsgUylgKS74LSBJL086IDEgcmVhZCBgTyhTKWAsIHVwIHRvIDEgbXV0YXRlIGBPKFMpYC4gVXAgdG8gb25lIHJlbW92ZS4wLSBPbmUgZXZlbnQubC0gVGhlIHdlaWdodCBvZiB0aGUgYGNhbGxgLk0BLSBTdG9yYWdlOiBpbnNlcnRzIG9uZSBpdGVtLCB2YWx1ZSBzaXplIGJvdW5kZWQgYnkgYE1heFNpZ25hdG9yaWVzYCwgd2l0aCBhIGRlcG9zaXQZASAgdGFrZW4gZm9yIGl0cyBsaWZldGltZSBvZiBgRGVwb3NpdEJhc2UgKyB0aHJlc2hvbGQgKiBEZXBvc2l0RmFjdG9yYC5AYXBwcm92ZV9hc19tdWx0aRQBJHRocmVzaG9sZG0BAQx1MTYAAURvdGhlcl9zaWduYXRvcmllc9EBAURWZWM8VDo6QWNjb3VudElkPgABPG1heWJlX3RpbWVwb2ludBEDAZBPcHRpb248VGltZXBvaW50PEJsb2NrTnVtYmVyRm9yPFQ+Pj4AASRjYWxsX2hhc2gEASBbdTg7IDMyXQABKG1heF93ZWlnaHQoARhXZWlnaHQAAnhVAVJlZ2lzdGVyIGFwcHJvdmFsIGZvciBhIGRpc3BhdGNoIHRvIGJlIG1hZGUgZnJvbSBhIGRldGVybWluaXN0aWMgY29tcG9zaXRlIGFjY291bnQgaWb4YXBwcm92ZWQgYnkgYSB0b3RhbCBvZiBgdGhyZXNob2xkIC0gMWAgb2YgYG90aGVyX3NpZ25hdG9yaWVzYC4ALQFQYXltZW50OiBgRGVwb3NpdEJhc2VgIHdpbGwgYmUgcmVzZXJ2ZWQgaWYgdGhpcyBpcyB0aGUgZmlyc3QgYXBwcm92YWwsIHBsdXM9AWB0aHJlc2hvbGRgIHRpbWVzIGBEZXBvc2l0RmFjdG9yYC4gSXQgaXMgcmV0dXJuZWQgb25jZSB0aGlzIGRpc3BhdGNoIGhhcHBlbnMgb3I0aXMgY2FuY2VsbGVkLgDMVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uAFUBLSBgdGhyZXNob2xkYDogVGhlIHRvdGFsIG51bWJlciBvZiBhcHByb3ZhbHMgZm9yIHRoaXMgZGlzcGF0Y2ggYmVmb3JlIGl0IGlzIGV4ZWN1dGVkLkEBLSBgb3RoZXJfc2lnbmF0b3JpZXNgOiBUaGUgYWNjb3VudHMgKG90aGVyIHRoYW4gdGhlIHNlbmRlcikgd2hvIGNhbiBhcHByb3ZlIHRoaXNsZGlzcGF0Y2guIE1heSBub3QgYmUgZW1wdHkuWQEtIGBtYXliZV90aW1lcG9pbnRgOiBJZiB0aGlzIGlzIHRoZSBmaXJzdCBhcHByb3ZhbCwgdGhlbiB0aGlzIG11c3QgYmUgYE5vbmVgLiBJZiBpdCBpc1EBbm90IHRoZSBmaXJzdCBhcHByb3ZhbCwgdGhlbiBpdCBtdXN0IGJlIGBTb21lYCwgd2l0aCB0aGUgdGltZXBvaW50IChibG9jayBudW1iZXIgYW5k1HRyYW5zYWN0aW9uIGluZGV4KSBvZiB0aGUgZmlyc3QgYXBwcm92YWwgdHJhbnNhY3Rpb24uzC0gYGNhbGxfaGFzaGA6IFRoZSBoYXNoIG9mIHRoZSBjYWxsIHRvIGJlIGV4ZWN1dGVkLgA1AU5PVEU6IElmIHRoaXMgaXMgdGhlIGZpbmFsIGFwcHJvdmFsLCB5b3Ugd2lsbCB3YW50IHRvIHVzZSBgYXNfbXVsdGlgIGluc3RlYWQuADQjIyBDb21wbGV4aXR5JC0gYE8oUylgLswtIFVwIHRvIG9uZSBiYWxhbmNlLXJlc2VydmUgb3IgdW5yZXNlcnZlIG9wZXJhdGlvbi49AS0gT25lIHBhc3N0aHJvdWdoIG9wZXJhdGlvbiwgb25lIGluc2VydCwgYm90aCBgTyhTKWAgd2hlcmUgYFNgIGlzIHRoZSBudW1iZXIgb2ZFASAgc2lnbmF0b3JpZXMuIGBTYCBpcyBjYXBwZWQgYnkgYE1heFNpZ25hdG9yaWVzYCwgd2l0aCB3ZWlnaHQgYmVpbmcgcHJvcG9ydGlvbmFsLrwtIE9uZSBlbmNvZGUgJiBoYXNoLCBib3RoIG9mIGNvbXBsZXhpdHkgYE8oUylgLtQtIFVwIHRvIG9uZSBiaW5hcnkgc2VhcmNoIGFuZCBpbnNlcnQgKGBPKGxvZ1MgKyBTKWApLvgtIEkvTzogMSByZWFkIGBPKFMpYCwgdXAgdG8gMSBtdXRhdGUgYE8oUylgLiBVcCB0byBvbmUgcmVtb3ZlLjAtIE9uZSBldmVudC5NAS0gU3RvcmFnZTogaW5zZXJ0cyBvbmUgaXRlbSwgdmFsdWUgc2l6ZSBib3VuZGVkIGJ5IGBNYXhTaWduYXRvcmllc2AsIHdpdGggYSBkZXBvc2l0GQEgIHRha2VuIGZvciBpdHMgbGlmZXRpbWUgb2YgYERlcG9zaXRCYXNlICsgdGhyZXNob2xkICogRGVwb3NpdEZhY3RvcmAuPGNhbmNlbF9hc19tdWx0aRABJHRocmVzaG9sZG0BAQx1MTYAAURvdGhlcl9zaWduYXRvcmllc9EBAURWZWM8VDo6QWNjb3VudElkPgABJHRpbWVwb2ludBUDAXBUaW1lcG9pbnQ8QmxvY2tOdW1iZXJGb3I8VD4+AAEkY2FsbF9oYXNoBAEgW3U4OyAzMl0AA1RVAUNhbmNlbCBhIHByZS1leGlzdGluZywgb24tZ29pbmcgbXVsdGlzaWcgdHJhbnNhY3Rpb24uIEFueSBkZXBvc2l0IHJlc2VydmVkIHByZXZpb3VzbHnEZm9yIHRoaXMgb3BlcmF0aW9uIHdpbGwgYmUgdW5yZXNlcnZlZCBvbiBzdWNjZXNzLgDMVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uAFUBLSBgdGhyZXNob2xkYDogVGhlIHRvdGFsIG51bWJlciBvZiBhcHByb3ZhbHMgZm9yIHRoaXMgZGlzcGF0Y2ggYmVmb3JlIGl0IGlzIGV4ZWN1dGVkLkEBLSBgb3RoZXJfc2lnbmF0b3JpZXNgOiBUaGUgYWNjb3VudHMgKG90aGVyIHRoYW4gdGhlIHNlbmRlcikgd2hvIGNhbiBhcHByb3ZlIHRoaXNsZGlzcGF0Y2guIE1heSBub3QgYmUgZW1wdHkuXQEtIGB0aW1lcG9pbnRgOiBUaGUgdGltZXBvaW50IChibG9jayBudW1iZXIgYW5kIHRyYW5zYWN0aW9uIGluZGV4KSBvZiB0aGUgZmlyc3QgYXBwcm92YWx4dHJhbnNhY3Rpb24gZm9yIHRoaXMgZGlzcGF0Y2guzC0gYGNhbGxfaGFzaGA6IFRoZSBoYXNoIG9mIHRoZSBjYWxsIHRvIGJlIGV4ZWN1dGVkLgA0IyMgQ29tcGxleGl0eSQtIGBPKFMpYC7MLSBVcCB0byBvbmUgYmFsYW5jZS1yZXNlcnZlIG9yIHVucmVzZXJ2ZSBvcGVyYXRpb24uPQEtIE9uZSBwYXNzdGhyb3VnaCBvcGVyYXRpb24sIG9uZSBpbnNlcnQsIGJvdGggYE8oUylgIHdoZXJlIGBTYCBpcyB0aGUgbnVtYmVyIG9mRQEgIHNpZ25hdG9yaWVzLiBgU2AgaXMgY2FwcGVkIGJ5IGBNYXhTaWduYXRvcmllc2AsIHdpdGggd2VpZ2h0IGJlaW5nIHByb3BvcnRpb25hbC68LSBPbmUgZW5jb2RlICYgaGFzaCwgYm90aCBvZiBjb21wbGV4aXR5IGBPKFMpYC4wLSBPbmUgZXZlbnQuhC0gSS9POiAxIHJlYWQgYE8oUylgLCBvbmUgcmVtb3ZlLnAtIFN0b3JhZ2U6IHJlbW92ZXMgb25lIGl0ZW0uBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLhEDBBhPcHRpb24EBFQBFQMBCBBOb25lAAAAEFNvbWUEABUDAAABAAAVAwg8cGFsbGV0X211bHRpc2lnJFRpbWVwb2ludAQsQmxvY2tOdW1iZXIBEAAIARhoZWlnaHQQASxCbG9ja051bWJlcgABFGluZGV4EAEMdTMyAAAZAww8cGFsbGV0X2JvdW50aWVzGHBhbGxldBBDYWxsCARUAARJAAEkOHByb3Bvc2VfYm91bnR5CAEUdmFsdWX8ATxCYWxhbmNlT2Y8VCwgST4AASxkZXNjcmlwdGlvbjgBHFZlYzx1OD4AADBUUHJvcG9zZSBhIG5ldyBib3VudHkuAMxUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXy4AUQFQYXltZW50OiBgVGlwUmVwb3J0RGVwb3NpdEJhc2VgIHdpbGwgYmUgcmVzZXJ2ZWQgZnJvbSB0aGUgb3JpZ2luIGFjY291bnQsIGFzIHdlbGwgYXNRAWBEYXRhRGVwb3NpdFBlckJ5dGVgIGZvciBlYWNoIGJ5dGUgaW4gYHJlYXNvbmAuIEl0IHdpbGwgYmUgdW5yZXNlcnZlZCB1cG9uIGFwcHJvdmFsLGRvciBzbGFzaGVkIHdoZW4gcmVqZWN0ZWQuAPgtIGBjdXJhdG9yYDogVGhlIGN1cmF0b3IgYWNjb3VudCB3aG9tIHdpbGwgbWFuYWdlIHRoaXMgYm91bnR5LmQtIGBmZWVgOiBUaGUgY3VyYXRvciBmZWUuJQEtIGB2YWx1ZWA6IFRoZSB0b3RhbCBwYXltZW50IGFtb3VudCBvZiB0aGlzIGJvdW50eSwgY3VyYXRvciBmZWUgaW5jbHVkZWQuwC0gYGRlc2NyaXB0aW9uYDogVGhlIGRlc2NyaXB0aW9uIG9mIHRoaXMgYm91bnR5LjhhcHByb3ZlX2JvdW50eQQBJGJvdW50eV9pZOwBLEJvdW50eUluZGV4AAEcXQFBcHByb3ZlIGEgYm91bnR5IHByb3Bvc2FsLiBBdCBhIGxhdGVyIHRpbWUsIHRoZSBib3VudHkgd2lsbCBiZSBmdW5kZWQgYW5kIGJlY29tZSBhY3RpdmWoYW5kIHRoZSBvcmlnaW5hbCBkZXBvc2l0IHdpbGwgYmUgcmV0dXJuZWQuAKRNYXkgb25seSBiZSBjYWxsZWQgZnJvbSBgVDo6U3BlbmRPcmlnaW5gLgA0IyMgQ29tcGxleGl0eRwtIE8oMSkuPHByb3Bvc2VfY3VyYXRvcgwBJGJvdW50eV9pZOwBLEJvdW50eUluZGV4AAEcY3VyYXRvcsUBAVBBY2NvdW50SWRMb29rdXBPZjxUPgABDGZlZfwBPEJhbGFuY2VPZjxULCBJPgACGJRQcm9wb3NlIGEgY3VyYXRvciB0byBhIGZ1bmRlZCBib3VudHkuAKRNYXkgb25seSBiZSBjYWxsZWQgZnJvbSBgVDo6U3BlbmRPcmlnaW5gLgA0IyMgQ29tcGxleGl0eRwtIE8oMSkuQHVuYXNzaWduX2N1cmF0b3IEASRib3VudHlfaWTsASxCb3VudHlJbmRleAADRHxVbmFzc2lnbiBjdXJhdG9yIGZyb20gYSBib3VudHkuAB0BVGhpcyBmdW5jdGlvbiBjYW4gb25seSBiZSBjYWxsZWQgYnkgdGhlIGBSZWplY3RPcmlnaW5gIGEgc2lnbmVkIG9yaWdpbi4APQFJZiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgYFJlamVjdE9yaWdpbmAsIHdlIGFzc3VtZSB0aGF0IHRoZSBjdXJhdG9yIGlzMQFtYWxpY2lvdXMgb3IgaW5hY3RpdmUuIEFzIGEgcmVzdWx0LCB3ZSB3aWxsIHNsYXNoIHRoZSBjdXJhdG9yIHdoZW4gcG9zc2libGUuAGEBSWYgdGhlIG9yaWdpbiBpcyB0aGUgY3VyYXRvciwgd2UgdGFrZSB0aGlzIGFzIGEgc2lnbiB0aGV5IGFyZSB1bmFibGUgdG8gZG8gdGhlaXIgam9iIGFuZF0BdGhleSB3aWxsaW5nbHkgZ2l2ZSB1cC4gV2UgY291bGQgc2xhc2ggdGhlbSwgYnV0IGZvciBub3cgd2UgYWxsb3cgdGhlbSB0byByZWNvdmVyIHRoZWlyNQFkZXBvc2l0IGFuZCBleGl0IHdpdGhvdXQgaXNzdWUuIChXZSBtYXkgd2FudCB0byBjaGFuZ2UgdGhpcyBpZiBpdCBpcyBhYnVzZWQuKQBdAUZpbmFsbHksIHRoZSBvcmlnaW4gY2FuIGJlIGFueW9uZSBpZiBhbmQgb25seSBpZiB0aGUgY3VyYXRvciBpcyAiaW5hY3RpdmUiLiBUaGlzIGFsbG93c2EBYW55b25lIGluIHRoZSBjb21tdW5pdHkgdG8gY2FsbCBvdXQgdGhhdCBhIGN1cmF0b3IgaXMgbm90IGRvaW5nIHRoZWlyIGR1ZSBkaWxpZ2VuY2UsIGFuZDkBd2Ugc2hvdWxkIHBpY2sgYSBuZXcgY3VyYXRvci4gSW4gdGhpcyBjYXNlIHRoZSBjdXJhdG9yIHNob3VsZCBhbHNvIGJlIHNsYXNoZWQuADQjIyBDb21wbGV4aXR5HC0gTygxKS44YWNjZXB0X2N1cmF0b3IEASRib3VudHlfaWTsASxCb3VudHlJbmRleAAEHJRBY2NlcHQgdGhlIGN1cmF0b3Igcm9sZSBmb3IgYSBib3VudHkuKQFBIGRlcG9zaXQgd2lsbCBiZSByZXNlcnZlZCBmcm9tIGN1cmF0b3IgYW5kIHJlZnVuZCB1cG9uIHN1Y2Nlc3NmdWwgcGF5b3V0LgCQTWF5IG9ubHkgYmUgY2FsbGVkIGZyb20gdGhlIGN1cmF0b3IuADQjIyBDb21wbGV4aXR5HC0gTygxKS4wYXdhcmRfYm91bnR5CAEkYm91bnR5X2lk7AEsQm91bnR5SW5kZXgAASxiZW5lZmljaWFyecUBAVBBY2NvdW50SWRMb29rdXBPZjxUPgAFKFkBQXdhcmQgYm91bnR5IHRvIGEgYmVuZWZpY2lhcnkgYWNjb3VudC4gVGhlIGJlbmVmaWNpYXJ5IHdpbGwgYmUgYWJsZSB0byBjbGFpbSB0aGUgZnVuZHM4YWZ0ZXIgYSBkZWxheS4AFQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSB0aGUgY3VyYXRvciBvZiB0aGlzIGJvdW50eS4AiC0gYGJvdW50eV9pZGA6IEJvdW50eSBJRCB0byBhd2FyZC4ZAS0gYGJlbmVmaWNpYXJ5YDogVGhlIGJlbmVmaWNpYXJ5IGFjY291bnQgd2hvbSB3aWxsIHJlY2VpdmUgdGhlIHBheW91dC4ANCMjIENvbXBsZXhpdHkcLSBPKDEpLjBjbGFpbV9ib3VudHkEASRib3VudHlfaWTsASxCb3VudHlJbmRleAAGIOxDbGFpbSB0aGUgcGF5b3V0IGZyb20gYW4gYXdhcmRlZCBib3VudHkgYWZ0ZXIgcGF5b3V0IGRlbGF5LgAlAVRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIHRoZSBiZW5lZmljaWFyeSBvZiB0aGlzIGJvdW50eS4AiC0gYGJvdW50eV9pZGA6IEJvdW50eSBJRCB0byBjbGFpbS4ANCMjIENvbXBsZXhpdHkcLSBPKDEpLjBjbG9zZV9ib3VudHkEASRib3VudHlfaWTsASxCb3VudHlJbmRleAAHJDkBQ2FuY2VsIGEgcHJvcG9zZWQgb3IgYWN0aXZlIGJvdW50eS4gQWxsIHRoZSBmdW5kcyB3aWxsIGJlIHNlbnQgdG8gdHJlYXN1cnkgYW5kzHRoZSBjdXJhdG9yIGRlcG9zaXQgd2lsbCBiZSB1bnJlc2VydmVkIGlmIHBvc3NpYmxlLgDIT25seSBgVDo6UmVqZWN0T3JpZ2luYCBpcyBhYmxlIHRvIGNhbmNlbCBhIGJvdW50eS4AjC0gYGJvdW50eV9pZGA6IEJvdW50eSBJRCB0byBjYW5jZWwuADQjIyBDb21wbGV4aXR5HC0gTygxKS5QZXh0ZW5kX2JvdW50eV9leHBpcnkIASRib3VudHlfaWTsASxCb3VudHlJbmRleAABGHJlbWFyazgBHFZlYzx1OD4ACCSsRXh0ZW5kIHRoZSBleHBpcnkgdGltZSBvZiBhbiBhY3RpdmUgYm91bnR5LgAVAVRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIHRoZSBjdXJhdG9yIG9mIHRoaXMgYm91bnR5LgCMLSBgYm91bnR5X2lkYDogQm91bnR5IElEIHRvIGV4dGVuZC6MLSBgcmVtYXJrYDogYWRkaXRpb25hbCBpbmZvcm1hdGlvbi4ANCMjIENvbXBsZXhpdHkcLSBPKDEpLgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy4dAwxUcGFsbGV0X2NoaWxkX2JvdW50aWVzGHBhbGxldBBDYWxsBARUAAEcQGFkZF9jaGlsZF9ib3VudHkMAUBwYXJlbnRfYm91bnR5X2lk7AEsQm91bnR5SW5kZXgAARR2YWx1ZfwBMEJhbGFuY2VPZjxUPgABLGRlc2NyaXB0aW9uOAEcVmVjPHU4PgAATFxBZGQgYSBuZXcgY2hpbGQtYm91bnR5LgD8VGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgdGhlIGN1cmF0b3Igb2YgcGFyZW503GJvdW50eSBhbmQgdGhlIHBhcmVudCBib3VudHkgbXVzdCBiZSBpbiAiYWN0aXZlIiBzdGF0ZS4ABQFDaGlsZC1ib3VudHkgZ2V0cyBhZGRlZCBzdWNjZXNzZnVsbHkgJiBmdW5kIGdldHMgdHJhbnNmZXJyZWQgZnJvbQkBcGFyZW50IGJvdW50eSB0byBjaGlsZC1ib3VudHkgYWNjb3VudCwgaWYgcGFyZW50IGJvdW50eSBoYXMgZW5vdWdobGZ1bmRzLCBlbHNlIHRoZSBjYWxsIGZhaWxzLgANAVVwcGVyIGJvdW5kIHRvIG1heGltdW0gbnVtYmVyIG9mIGFjdGl2ZSAgY2hpbGQgYm91bnRpZXMgdGhhdCBjYW4gYmWoYWRkZWQgYXJlIG1hbmFnZWQgdmlhIHJ1bnRpbWUgdHJhaXQgY29uZmlnmFtgQ29uZmlnOjpNYXhBY3RpdmVDaGlsZEJvdW50eUNvdW50YF0uAAEBSWYgdGhlIGNhbGwgaXMgc3VjY2VzcywgdGhlIHN0YXR1cyBvZiBjaGlsZC1ib3VudHkgaXMgdXBkYXRlZCB0byAiQWRkZWQiLgBNAS0gYHBhcmVudF9ib3VudHlfaWRgOiBJbmRleCBvZiBwYXJlbnQgYm91bnR5IGZvciB3aGljaCBjaGlsZC1ib3VudHkgaXMgYmVpbmcgYWRkZWQusC0gYHZhbHVlYDogVmFsdWUgZm9yIGV4ZWN1dGluZyB0aGUgcHJvcG9zYWwu3C0gYGRlc2NyaXB0aW9uYDogVGV4dCBkZXNjcmlwdGlvbiBmb3IgdGhlIGNoaWxkLWJvdW50eS48cHJvcG9zZV9jdXJhdG9yEAFAcGFyZW50X2JvdW50eV9pZOwBLEJvdW50eUluZGV4AAE8Y2hpbGRfYm91bnR5X2lk7AEsQm91bnR5SW5kZXgAARxjdXJhdG9yxQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEMZmVl/AEwQmFsYW5jZU9mPFQ+AAE8oFByb3Bvc2UgY3VyYXRvciBmb3IgZnVuZGVkIGNoaWxkLWJvdW50eS4ADQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBjdXJhdG9yIG9mIHBhcmVudCBib3VudHkuABEBUGFyZW50IGJvdW50eSBtdXN0IGJlIGluIGFjdGl2ZSBzdGF0ZSwgZm9yIHRoaXMgY2hpbGQtYm91bnR5IGNhbGwgdG8Ud29yay4ADQFDaGlsZC1ib3VudHkgbXVzdCBiZSBpbiAiQWRkZWQiIHN0YXRlLCBmb3IgcHJvY2Vzc2luZyB0aGUgY2FsbC4gQW5kBQFzdGF0ZSBvZiBjaGlsZC1ib3VudHkgaXMgbW92ZWQgdG8gIkN1cmF0b3JQcm9wb3NlZCIgb24gc3VjY2Vzc2Z1bEBjYWxsIGNvbXBsZXRpb24uALQtIGBwYXJlbnRfYm91bnR5X2lkYDogSW5kZXggb2YgcGFyZW50IGJvdW50eS6sLSBgY2hpbGRfYm91bnR5X2lkYDogSW5kZXggb2YgY2hpbGQgYm91bnR5LrQtIGBjdXJhdG9yYDogQWRkcmVzcyBvZiBjaGlsZC1ib3VudHkgY3VyYXRvci7sLSBgZmVlYDogcGF5bWVudCBmZWUgdG8gY2hpbGQtYm91bnR5IGN1cmF0b3IgZm9yIGV4ZWN1dGlvbi44YWNjZXB0X2N1cmF0b3IIAUBwYXJlbnRfYm91bnR5X2lk7AEsQm91bnR5SW5kZXgAATxjaGlsZF9ib3VudHlfaWTsASxCb3VudHlJbmRleAACTLRBY2NlcHQgdGhlIGN1cmF0b3Igcm9sZSBmb3IgdGhlIGNoaWxkLWJvdW50eS4A9FRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIHRoZSBjdXJhdG9yIG9mIHRoaXM0Y2hpbGQtYm91bnR5LgDsQSBkZXBvc2l0IHdpbGwgYmUgcmVzZXJ2ZWQgZnJvbSB0aGUgY3VyYXRvciBhbmQgcmVmdW5kIHVwb26Ic3VjY2Vzc2Z1bCBwYXlvdXQgb3IgY2FuY2VsbGF0aW9uLgD4RmVlIGZvciBjdXJhdG9yIGlzIGRlZHVjdGVkIGZyb20gY3VyYXRvciBmZWUgb2YgcGFyZW50IGJvdW50eS4AEQFQYXJlbnQgYm91bnR5IG11c3QgYmUgaW4gYWN0aXZlIHN0YXRlLCBmb3IgdGhpcyBjaGlsZC1ib3VudHkgY2FsbCB0bxR3b3JrLgANAUNoaWxkLWJvdW50eSBtdXN0IGJlIGluICJDdXJhdG9yUHJvcG9zZWQiIHN0YXRlLCBmb3IgcHJvY2Vzc2luZyB0aGUJAWNhbGwuIEFuZCBzdGF0ZSBvZiBjaGlsZC1ib3VudHkgaXMgbW92ZWQgdG8gIkFjdGl2ZSIgb24gc3VjY2Vzc2Z1bEBjYWxsIGNvbXBsZXRpb24uALQtIGBwYXJlbnRfYm91bnR5X2lkYDogSW5kZXggb2YgcGFyZW50IGJvdW50eS6sLSBgY2hpbGRfYm91bnR5X2lkYDogSW5kZXggb2YgY2hpbGQgYm91bnR5LkB1bmFzc2lnbl9jdXJhdG9yCAFAcGFyZW50X2JvdW50eV9pZOwBLEJvdW50eUluZGV4AAE8Y2hpbGRfYm91bnR5X2lk7AEsQm91bnR5SW5kZXgAA4iUVW5hc3NpZ24gY3VyYXRvciBmcm9tIGEgY2hpbGQtYm91bnR5LgAJAVRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBjYW4gYmUgZWl0aGVyIGBSZWplY3RPcmlnaW5gLCBvctx0aGUgY3VyYXRvciBvZiB0aGUgcGFyZW50IGJvdW50eSwgb3IgYW55IHNpZ25lZCBvcmlnaW4uAPhGb3IgdGhlIG9yaWdpbiBvdGhlciB0aGFuIFQ6OlJlamVjdE9yaWdpbiBhbmQgdGhlIGNoaWxkLWJvdW50eQEBY3VyYXRvciwgcGFyZW50IGJvdW50eSBtdXN0IGJlIGluIGFjdGl2ZSBzdGF0ZSwgZm9yIHRoaXMgY2FsbCB0bwkBd29yay4gV2UgYWxsb3cgY2hpbGQtYm91bnR5IGN1cmF0b3IgYW5kIFQ6OlJlamVjdE9yaWdpbiB0byBleGVjdXRlyHRoaXMgY2FsbCBpcnJlc3BlY3RpdmUgb2YgdGhlIHBhcmVudCBib3VudHkgc3RhdGUuANxJZiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgYFJlamVjdE9yaWdpbmAgb3IgdGhlBQFwYXJlbnQgYm91bnR5IGN1cmF0b3IsIHdlIGFzc3VtZSB0aGF0IHRoZSBjaGlsZC1ib3VudHkgY3VyYXRvciBpcw0BbWFsaWNpb3VzIG9yIGluYWN0aXZlLiBBcyBhIHJlc3VsdCwgY2hpbGQtYm91bnR5IGN1cmF0b3IgZGVwb3NpdCBpcyBzbGFzaGVkLgAFAUlmIHRoZSBvcmlnaW4gaXMgdGhlIGNoaWxkLWJvdW50eSBjdXJhdG9yLCB3ZSB0YWtlIHRoaXMgYXMgYSBzaWduCQF0aGF0IHRoZXkgYXJlIHVuYWJsZSB0byBkbyB0aGVpciBqb2IsIGFuZCBhcmUgd2lsbGluZ2x5IGdpdmluZyB1cC4JAVdlIGNvdWxkIHNsYXNoIHRoZSBkZXBvc2l0LCBidXQgZm9yIG5vdyB3ZSBhbGxvdyB0aGVtIHRvIHVucmVzZXJ2ZREBdGhlaXIgZGVwb3NpdCBhbmQgZXhpdCB3aXRob3V0IGlzc3VlLiAoV2UgbWF5IHdhbnQgdG8gY2hhbmdlIHRoaXMgaWY4aXQgaXMgYWJ1c2VkLikABQFGaW5hbGx5LCB0aGUgb3JpZ2luIGNhbiBiZSBhbnlvbmUgaWZmIHRoZSBjaGlsZC1ib3VudHkgY3VyYXRvciBpcwkBImluYWN0aXZlIi4gRXhwaXJ5IHVwZGF0ZSBkdWUgb2YgcGFyZW50IGJvdW50eSBpcyB1c2VkIHRvIGVzdGltYXRlnGluYWN0aXZlIHN0YXRlIG9mIGNoaWxkLWJvdW50eSBjdXJhdG9yLgANAVRoaXMgYWxsb3dzIGFueW9uZSBpbiB0aGUgY29tbXVuaXR5IHRvIGNhbGwgb3V0IHRoYXQgYSBjaGlsZC1ib3VudHkJAWN1cmF0b3IgaXMgbm90IGRvaW5nIHRoZWlyIGR1ZSBkaWxpZ2VuY2UsIGFuZCB3ZSBzaG91bGQgcGljayBhIG5ld/hvbmUuIEluIHRoaXMgY2FzZSB0aGUgY2hpbGQtYm91bnR5IGN1cmF0b3IgZGVwb3NpdCBpcyBzbGFzaGVkLgABAVN0YXRlIG9mIGNoaWxkLWJvdW50eSBpcyBtb3ZlZCB0byBBZGRlZCBzdGF0ZSBvbiBzdWNjZXNzZnVsIGNhbGwsY29tcGxldGlvbi4AtC0gYHBhcmVudF9ib3VudHlfaWRgOiBJbmRleCBvZiBwYXJlbnQgYm91bnR5LqwtIGBjaGlsZF9ib3VudHlfaWRgOiBJbmRleCBvZiBjaGlsZCBib3VudHkuSGF3YXJkX2NoaWxkX2JvdW50eQwBQHBhcmVudF9ib3VudHlfaWTsASxCb3VudHlJbmRleAABPGNoaWxkX2JvdW50eV9pZOwBLEJvdW50eUluZGV4AAEsYmVuZWZpY2lhcnnFAQFQQWNjb3VudElkTG9va3VwT2Y8VD4ABESQQXdhcmQgY2hpbGQtYm91bnR5IHRvIGEgYmVuZWZpY2lhcnkuAPhUaGUgYmVuZWZpY2lhcnkgd2lsbCBiZSBhYmxlIHRvIGNsYWltIHRoZSBmdW5kcyBhZnRlciBhIGRlbGF5LgD8VGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgdGhlIHBhcmVudCBjdXJhdG9yIG9ydGN1cmF0b3Igb2YgdGhpcyBjaGlsZC1ib3VudHkuABEBUGFyZW50IGJvdW50eSBtdXN0IGJlIGluIGFjdGl2ZSBzdGF0ZSwgZm9yIHRoaXMgY2hpbGQtYm91bnR5IGNhbGwgdG8Ud29yay4ACQFDaGlsZC1ib3VudHkgbXVzdCBiZSBpbiBhY3RpdmUgc3RhdGUsIGZvciBwcm9jZXNzaW5nIHRoZSBjYWxsLiBBbmQRAXN0YXRlIG9mIGNoaWxkLWJvdW50eSBpcyBtb3ZlZCB0byAiUGVuZGluZ1BheW91dCIgb24gc3VjY2Vzc2Z1bCBjYWxsLGNvbXBsZXRpb24uALQtIGBwYXJlbnRfYm91bnR5X2lkYDogSW5kZXggb2YgcGFyZW50IGJvdW50eS6sLSBgY2hpbGRfYm91bnR5X2lkYDogSW5kZXggb2YgY2hpbGQgYm91bnR5LpQtIGBiZW5lZmljaWFyeWA6IEJlbmVmaWNpYXJ5IGFjY291bnQuSGNsYWltX2NoaWxkX2JvdW50eQgBQHBhcmVudF9ib3VudHlfaWTsASxCb3VudHlJbmRleAABPGNoaWxkX2JvdW50eV9pZOwBLEJvdW50eUluZGV4AAVABQFDbGFpbSB0aGUgcGF5b3V0IGZyb20gYW4gYXdhcmRlZCBjaGlsZC1ib3VudHkgYWZ0ZXIgcGF5b3V0IGRlbGF5LgDsVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG1heSBiZSBhbnkgc2lnbmVkIG9yaWdpbi4ABQFDYWxsIHdvcmtzIGluZGVwZW5kZW50IG9mIHBhcmVudCBib3VudHkgc3RhdGUsIE5vIG5lZWQgZm9yIHBhcmVudHRib3VudHkgdG8gYmUgaW4gYWN0aXZlIHN0YXRlLgARAVRoZSBCZW5lZmljaWFyeSBpcyBwYWlkIG91dCB3aXRoIGFncmVlZCBib3VudHkgdmFsdWUuIEN1cmF0b3IgZmVlIGlzlHBhaWQgJiBjdXJhdG9yIGRlcG9zaXQgaXMgdW5yZXNlcnZlZC4ABQFDaGlsZC1ib3VudHkgbXVzdCBiZSBpbiAiUGVuZGluZ1BheW91dCIgc3RhdGUsIGZvciBwcm9jZXNzaW5nIHRoZfxjYWxsLiBBbmQgaW5zdGFuY2Ugb2YgY2hpbGQtYm91bnR5IGlzIHJlbW92ZWQgZnJvbSB0aGUgc3RhdGUgb25sc3VjY2Vzc2Z1bCBjYWxsIGNvbXBsZXRpb24uALQtIGBwYXJlbnRfYm91bnR5X2lkYDogSW5kZXggb2YgcGFyZW50IGJvdW50eS6sLSBgY2hpbGRfYm91bnR5X2lkYDogSW5kZXggb2YgY2hpbGQgYm91bnR5LkhjbG9zZV9jaGlsZF9ib3VudHkIAUBwYXJlbnRfYm91bnR5X2lk7AEsQm91bnR5SW5kZXgAATxjaGlsZF9ib3VudHlfaWTsASxCb3VudHlJbmRleAAGWBEBQ2FuY2VsIGEgcHJvcG9zZWQgb3IgYWN0aXZlIGNoaWxkLWJvdW50eS4gQ2hpbGQtYm91bnR5IGFjY291bnQgZnVuZHMJAWFyZSB0cmFuc2ZlcnJlZCB0byBwYXJlbnQgYm91bnR5IGFjY291bnQuIFRoZSBjaGlsZC1ib3VudHkgY3VyYXRvcphkZXBvc2l0IG1heSBiZSB1bnJlc2VydmVkIGlmIHBvc3NpYmxlLgAJAVRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIGVpdGhlciBwYXJlbnQgY3VyYXRvciBvckhgVDo6UmVqZWN0T3JpZ2luYC4A8ElmIHRoZSBzdGF0ZSBvZiBjaGlsZC1ib3VudHkgaXMgYEFjdGl2ZWAsIGN1cmF0b3IgZGVwb3NpdCBpcyx1bnJlc2VydmVkLgD0SWYgdGhlIHN0YXRlIG9mIGNoaWxkLWJvdW50eSBpcyBgUGVuZGluZ1BheW91dGAsIGNhbGwgZmFpbHMgJnhyZXR1cm5zIGBQZW5kaW5nUGF5b3V0YCBlcnJvci4ADQFGb3IgdGhlIG9yaWdpbiBvdGhlciB0aGFuIFQ6OlJlamVjdE9yaWdpbiwgcGFyZW50IGJvdW50eSBtdXN0IGJlIGlu8GFjdGl2ZSBzdGF0ZSwgZm9yIHRoaXMgY2hpbGQtYm91bnR5IGNhbGwgdG8gd29yay4gRm9yIG9yaWdpbpBUOjpSZWplY3RPcmlnaW4gZXhlY3V0aW9uIGlzIGZvcmNlZC4AAQFJbnN0YW5jZSBvZiBjaGlsZC1ib3VudHkgaXMgcmVtb3ZlZCBmcm9tIHRoZSBzdGF0ZSBvbiBzdWNjZXNzZnVsQGNhbGwgY29tcGxldGlvbi4AtC0gYHBhcmVudF9ib3VudHlfaWRgOiBJbmRleCBvZiBwYXJlbnQgYm91bnR5LqwtIGBjaGlsZF9ib3VudHlfaWRgOiBJbmRleCBvZiBjaGlsZCBib3VudHkuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLiEDDJBwYWxsZXRfZWxlY3Rpb25fcHJvdmlkZXJfbXVsdGlfcGhhc2UYcGFsbGV0EENhbGwEBFQAARQ8c3VibWl0X3Vuc2lnbmVkCAEwcmF3X3NvbHV0aW9uJQMBsEJveDxSYXdTb2x1dGlvbjxTb2x1dGlvbk9mPFQ6Ok1pbmVyQ29uZmlnPj4+AAEcd2l0bmVzc/kDAVhTb2x1dGlvbk9yU25hcHNob3RTaXplAAA4pFN1Ym1pdCBhIHNvbHV0aW9uIGZvciB0aGUgdW5zaWduZWQgcGhhc2UuAMhUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvIHRoaXMgY2FsbCBtdXN0IGJlIF9fbm9uZV9fLgA9AVRoaXMgc3VibWlzc2lvbiBpcyBjaGVja2VkIG9uIHRoZSBmbHkuIE1vcmVvdmVyLCB0aGlzIHVuc2lnbmVkIHNvbHV0aW9uIGlzIG9ubHlVAXZhbGlkYXRlZCB3aGVuIHN1Ym1pdHRlZCB0byB0aGUgcG9vbCBmcm9tIHRoZSAqKmxvY2FsKiogbm9kZS4gRWZmZWN0aXZlbHksIHRoaXMgbWVhbnNdAXRoYXQgb25seSBhY3RpdmUgdmFsaWRhdG9ycyBjYW4gc3VibWl0IHRoaXMgdHJhbnNhY3Rpb24gd2hlbiBhdXRob3JpbmcgYSBibG9jayAoc2ltaWxhckB0byBhbiBpbmhlcmVudCkuAFkBVG8gcHJldmVudCBhbnkgaW5jb3JyZWN0IHNvbHV0aW9uIChhbmQgdGh1cyB3YXN0ZWQgdGltZS93ZWlnaHQpLCB0aGlzIHRyYW5zYWN0aW9uIHdpbGxNAXBhbmljIGlmIHRoZSBzb2x1dGlvbiBzdWJtaXR0ZWQgYnkgdGhlIHZhbGlkYXRvciBpcyBpbnZhbGlkIGluIGFueSB3YXksIGVmZmVjdGl2ZWx5nHB1dHRpbmcgdGhlaXIgYXV0aG9yaW5nIHJld2FyZCBhdCByaXNrLgDgTm8gZGVwb3NpdCBvciByZXdhcmQgaXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc3VibWlzc2lvbi5sc2V0X21pbmltdW1fdW50cnVzdGVkX3Njb3JlBAFAbWF5YmVfbmV4dF9zY29yZf0DAVRPcHRpb248RWxlY3Rpb25TY29yZT4AARSwU2V0IGEgbmV3IHZhbHVlIGZvciBgTWluaW11bVVudHJ1c3RlZFNjb3JlYC4A2ERpc3BhdGNoIG9yaWdpbiBtdXN0IGJlIGFsaWduZWQgd2l0aCBgVDo6Rm9yY2VPcmlnaW5gLgDwVGhpcyBjaGVjayBjYW4gYmUgdHVybmVkIG9mZiBieSBzZXR0aW5nIHRoZSB2YWx1ZSB0byBgTm9uZWAudHNldF9lbWVyZ2VuY3lfZWxlY3Rpb25fcmVzdWx0BAEgc3VwcG9ydHMBBAFYU3VwcG9ydHM8VDo6QWNjb3VudElkPgACIFkBU2V0IGEgc29sdXRpb24gaW4gdGhlIHF1ZXVlLCB0byBiZSBoYW5kZWQgb3V0IHRvIHRoZSBjbGllbnQgb2YgdGhpcyBwYWxsZXQgaW4gdGhlIG5leHSIY2FsbCB0byBgRWxlY3Rpb25Qcm92aWRlcjo6ZWxlY3RgLgBFAVRoaXMgY2FuIG9ubHkgYmUgc2V0IGJ5IGBUOjpGb3JjZU9yaWdpbmAsIGFuZCBvbmx5IHdoZW4gdGhlIHBoYXNlIGlzIGBFbWVyZ2VuY3lgLgBhAVRoZSBzb2x1dGlvbiBpcyBub3QgY2hlY2tlZCBmb3IgYW55IGZlYXNpYmlsaXR5IGFuZCBpcyBhc3N1bWVkIHRvIGJlIHRydXN0d29ydGh5LCBhcyBhbnlRAWZlYXNpYmlsaXR5IGNoZWNrIGl0c2VsZiBjYW4gaW4gcHJpbmNpcGxlIGNhdXNlIHRoZSBlbGVjdGlvbiBwcm9jZXNzIHRvIGZhaWwgKGR1ZSB0b2htZW1vcnkvd2VpZ2h0IGNvbnN0cmFpbnMpLhhzdWJtaXQEATByYXdfc29sdXRpb24lAwGwQm94PFJhd1NvbHV0aW9uPFNvbHV0aW9uT2Y8VDo6TWluZXJDb25maWc+Pj4AAyScU3VibWl0IGEgc29sdXRpb24gZm9yIHRoZSBzaWduZWQgcGhhc2UuANBUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvIHRoaXMgY2FsbCBtdXN0IGJlIF9fc2lnbmVkX18uAF0BVGhlIHNvbHV0aW9uIGlzIHBvdGVudGlhbGx5IHF1ZXVlZCwgYmFzZWQgb24gdGhlIGNsYWltZWQgc2NvcmUgYW5kIHByb2Nlc3NlZCBhdCB0aGUgZW5kUG9mIHRoZSBzaWduZWQgcGhhc2UuAF0BQSBkZXBvc2l0IGlzIHJlc2VydmVkIGFuZCByZWNvcmRlZCBmb3IgdGhlIHNvbHV0aW9uLiBCYXNlZCBvbiB0aGUgb3V0Y29tZSwgdGhlIHNvbHV0aW9uFQFtaWdodCBiZSByZXdhcmRlZCwgc2xhc2hlZCwgb3IgZ2V0IGFsbCBvciBhIHBhcnQgb2YgdGhlIGRlcG9zaXQgYmFjay5MZ292ZXJuYW5jZV9mYWxsYmFjawgBQG1heWJlX21heF92b3RlcnNhAgEsT3B0aW9uPHUzMj4AAURtYXliZV9tYXhfdGFyZ2V0c2ECASxPcHRpb248dTMyPgAE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IHByb3Blcmx5IGZhbGwgaW50byBhIGRpZmZlcmVudCBiYWcgdGhhbiBpdHMgY3VycmVudBBvbmUuAB0BQW55b25lIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24gYWJvdXQgYW55IHBvdGVudGlhbGx5IGRpc2xvY2F0ZWQgYWNjb3VudC4ASQFXaWxsIGFsd2F5cyB1cGRhdGUgdGhlIHN0b3JlZCBzY29yZSBvZiBgZGlzbG9jYXRlZGAgdG8gdGhlIGNvcnJlY3Qgc2NvcmUsIGJhc2VkIG9uQGBTY29yZVByb3ZpZGVyYC4A1ElmIGBkaXNsb2NhdGVkYCBkb2VzIG5vdCBleGlzdHMsIGl0IHJldHVybnMgYW4gZXJyb3IuPHB1dF9pbl9mcm9udF9vZgQBHGxpZ2h0ZXLFAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AASjQTW92ZSB0aGUgY2FsbGVyJ3MgSWQgZGlyZWN0bHkgaW4gZnJvbnQgb2YgYGxpZ2h0ZXJgLgBZAVRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfIGFuZCBjYW4gb25seSBiZSBjYWxsZWQgYnkgdGhlIElkIG9mNQF0aGUgYWNjb3VudCBnb2luZyBpbiBmcm9udCBvZiBgbGlnaHRlcmAuIEZlZSBpcyBwYXllZCBieSB0aGUgb3JpZ2luIHVuZGVyIGFsbDhjaXJjdW1zdGFuY2VzLgA4T25seSB3b3JrcyBpZjoAlC0gYm90aCBub2RlcyBhcmUgd2l0aGluIHRoZSBzYW1lIGJhZyzQLSBhbmQgYG9yaWdpbmAgaGFzIGEgZ3JlYXRlciBgU2NvcmVgIHRoYW4gYGxpZ2h0ZXJgLlRwdXRfaW5fZnJvbnRfb2Zfb3RoZXIIARxoZWF2aWVyxQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEcbGlnaHRlcsUBAVBBY2NvdW50SWRMb29rdXBPZjxUPgACDBEBU2FtZSBhcyBbYFBhbGxldDo6cHV0X2luX2Zyb250X29mYF0sIGJ1dCBpdCBjYW4gYmUgY2FsbGVkIGJ5IGFueW9uZS4AyEZlZSBpcyBwYWlkIGJ5IHRoZSBvcmlnaW4gdW5kZXIgYWxsIGNpcmN1bXN0YW5jZXMuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLhkEDFxwYWxsZXRfbm9taW5hdGlvbl9wb29scxhwYWxsZXQQQ2FsbAQEVAABaBBqb2luCAEYYW1vdW50/AEwQmFsYW5jZU9mPFQ+AAEccG9vbF9pZBABGFBvb2xJZAAAKEUBU3Rha2UgZnVuZHMgd2l0aCBhIHBvb2wuIFRoZSBhbW91bnQgdG8gYm9uZCBpcyB0cmFuc2ZlcnJlZCBmcm9tIHRoZSBtZW1iZXIgdG8gdGhl3HBvb2xzIGFjY291bnQgYW5kIGltbWVkaWF0ZWx5IGluY3JlYXNlcyB0aGUgcG9vbHMgYm9uZC4AGCMgTm90ZQDMKiBBbiBhY2NvdW50IGNhbiBvbmx5IGJlIGEgbWVtYmVyIG9mIGEgc2luZ2xlIHBvb2wu2CogQW4gYWNjb3VudCBjYW5ub3Qgam9pbiB0aGUgc2FtZSBwb29sIG11bHRpcGxlIHRpbWVzLkEBKiBUaGlzIGNhbGwgd2lsbCAqbm90KiBkdXN0IHRoZSBtZW1iZXIgYWNjb3VudCwgc28gdGhlIG1lbWJlciBtdXN0IGhhdmUgYXQgbGVhc3TIICBgZXhpc3RlbnRpYWwgZGVwb3NpdCArIGFtb3VudGAgaW4gdGhlaXIgYWNjb3VudC7QKiBPbmx5IGEgcG9vbCB3aXRoIFtgUG9vbFN0YXRlOjpPcGVuYF0gY2FuIGJlIGpvaW5lZChib25kX2V4dHJhBAEUZXh0cmEdBAFcQm9uZEV4dHJhPEJhbGFuY2VPZjxUPj4AARxFAUJvbmQgYGV4dHJhYCBtb3JlIGZ1bmRzIGZyb20gYG9yaWdpbmAgaW50byB0aGUgcG9vbCB0byB3aGljaCB0aGV5IGFscmVhZHkgYmVsb25nLgBJAUFkZGl0aW9uYWwgZnVuZHMgY2FuIGNvbWUgZnJvbSBlaXRoZXIgdGhlIGZyZWUgYmFsYW5jZSBvZiB0aGUgYWNjb3VudCwgb2YgZnJvbSB0aGWcYWNjdW11bGF0ZWQgcmV3YXJkcywgc2VlIFtgQm9uZEV4dHJhYF0uAD0BQm9uZGluZyBleHRyYSBmdW5kcyBpbXBsaWVzIGFuIGF1dG9tYXRpYyBwYXlvdXQgb2YgYWxsIHBlbmRpbmcgcmV3YXJkcyBhcyB3ZWxsLgkBU2VlIGBib25kX2V4dHJhX290aGVyYCB0byBib25kIHBlbmRpbmcgcmV3YXJkcyBvZiBgb3RoZXJgIG1lbWJlcnMuMGNsYWltX3BheW91dAACIFUBQSBib25kZWQgbWVtYmVyIGNhbiB1c2UgdGhpcyB0byBjbGFpbSB0aGVpciBwYXlvdXQgYmFzZWQgb24gdGhlIHJld2FyZHMgdGhhdCB0aGUgcG9vbGEBaGFzIGFjY3VtdWxhdGVkIHNpbmNlIHRoZWlyIGxhc3QgY2xhaW1lZCBwYXlvdXQgKE9SIHNpbmNlIGpvaW5pbmcgaWYgdGhpcyBpcyB0aGVpciBmaXJzdD0BdGltZSBjbGFpbWluZyByZXdhcmRzKS4gVGhlIHBheW91dCB3aWxsIGJlIHRyYW5zZmVycmVkIHRvIHRoZSBtZW1iZXIncyBhY2NvdW50LgBJAVRoZSBtZW1iZXIgd2lsbCBlYXJuIHJld2FyZHMgcHJvIHJhdGEgYmFzZWQgb24gdGhlIG1lbWJlcnMgc3Rha2UgdnMgdGhlIHN1bSBvZiB0aGXQbWVtYmVycyBpbiB0aGUgcG9vbHMgc3Rha2UuIFJld2FyZHMgZG8gbm90ICJleHBpcmUiLgBBAVNlZSBgY2xhaW1fcGF5b3V0X290aGVyYCB0byBjbGFpbSByZXdhcmRzIG9uIGJlaGFsZiBvZiBzb21lIGBvdGhlcmAgcG9vbCBtZW1iZXIuGHVuYm9uZAgBOG1lbWJlcl9hY2NvdW50xQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAFAdW5ib25kaW5nX3BvaW50c/wBMEJhbGFuY2VPZjxUPgADfEUBVW5ib25kIHVwIHRvIGB1bmJvbmRpbmdfcG9pbnRzYCBvZiB0aGUgYG1lbWJlcl9hY2NvdW50YCdzIGZ1bmRzIGZyb20gdGhlIHBvb2wuIEl0RQFpbXBsaWNpdGx5IGNvbGxlY3RzIHRoZSByZXdhcmRzIG9uZSBsYXN0IHRpbWUsIHNpbmNlIG5vdCBkb2luZyBzbyB3b3VsZCBtZWFuIHNvbWVscmV3YXJkcyB3b3VsZCBiZSBmb3JmZWl0ZWQuAE0BVW5kZXIgY2VydGFpbiBjb25kaXRpb25zLCB0aGlzIGNhbGwgY2FuIGJlIGRpc3BhdGNoZWQgcGVybWlzc2lvbmxlc3NseSAoaS5lLiBieSBhbnkkYWNjb3VudCkuAKwjIENvbmRpdGlvbnMgZm9yIGEgcGVybWlzc2lvbmxlc3MgZGlzcGF0Y2guAF0BKiBUaGUgcG9vbCBpcyBibG9ja2VkIGFuZCB0aGUgY2FsbGVyIGlzIGVpdGhlciB0aGUgcm9vdCBvciBib3VuY2VyLiBUaGlzIGlzIHJlZmVyZWVkIHRvMCAgYXMgYSBraWNrLvQqIFRoZSBwb29sIGlzIGRlc3Ryb3lpbmcgYW5kIHRoZSBtZW1iZXIgaXMgbm90IHRoZSBkZXBvc2l0b3IuVQEqIFRoZSBwb29sIGlzIGRlc3Ryb3lpbmcsIHRoZSBtZW1iZXIgaXMgdGhlIGRlcG9zaXRvciBhbmQgbm8gb3RoZXIgbWVtYmVycyBhcmUgaW4gdGhlHCAgcG9vbC4AEQEjIyBDb25kaXRpb25zIGZvciBwZXJtaXNzaW9uZWQgZGlzcGF0Y2ggKGkuZS4gdGhlIGNhbGxlciBpcyBhbHNvIHRoZUhgbWVtYmVyX2FjY291bnRgKToAiCogVGhlIGNhbGxlciBpcyBub3QgdGhlIGRlcG9zaXRvci5VASogVGhlIGNhbGxlciBpcyB0aGUgZGVwb3NpdG9yLCB0aGUgcG9vbCBpcyBkZXN0cm95aW5nIGFuZCBubyBvdGhlciBtZW1iZXJzIGFyZSBpbiB0aGUcICBwb29sLgAYIyBOb3RlAB0BSWYgdGhlcmUgYXJlIHRvbyBtYW55IHVubG9ja2luZyBjaHVua3MgdG8gdW5ib25kIHdpdGggdGhlIHBvb2wgYWNjb3VudCxRAVtgQ2FsbDo6cG9vbF93aXRoZHJhd191bmJvbmRlZGBdIGNhbiBiZSBjYWxsZWQgdG8gdHJ5IGFuZCBtaW5pbWl6ZSB1bmxvY2tpbmcgY2h1bmtzLlkBVGhlIFtgU3Rha2luZ0ludGVyZmFjZTo6dW5ib25kYF0gd2lsbCBpbXBsaWNpdGx5IGNhbGwgW2BDYWxsOjpwb29sX3dpdGhkcmF3X3VuYm9uZGVkYF1VAXRvIHRyeSB0byBmcmVlIGNodW5rcyBpZiBuZWNlc3NhcnkgKGllLiBpZiB1bmJvdW5kIHdhcyBjYWxsZWQgYW5kIG5vIHVubG9ja2luZyBjaHVua3NhAWFyZSBhdmFpbGFibGUpLiBIb3dldmVyLCBpdCBtYXkgbm90IGJlIHBvc3NpYmxlIHRvIHJlbGVhc2UgdGhlIGN1cnJlbnQgdW5sb2NraW5nIGNodW5rcyxdAWluIHdoaWNoIGNhc2UsIHRoZSByZXN1bHQgb2YgdGhpcyBjYWxsIHdpbGwgbGlrZWx5IGJlIHRoZSBgTm9Nb3JlQ2h1bmtzYCBlcnJvciBmcm9tIHRoZTxzdGFraW5nIHN5c3RlbS5YcG9vbF93aXRoZHJhd191bmJvbmRlZAgBHHBvb2xfaWQQARhQb29sSWQAAUhudW1fc2xhc2hpbmdfc3BhbnMQAQx1MzIABBhVAUNhbGwgYHdpdGhkcmF3X3VuYm9uZGVkYCBmb3IgdGhlIHBvb2xzIGFjY291bnQuIFRoaXMgY2FsbCBjYW4gYmUgbWFkZSBieSBhbnkgYWNjb3VudC4AQQFUaGlzIGlzIHVzZWZ1bCBpZiB0aGVyZSBhcmUgdG9vIG1hbnkgdW5sb2NraW5nIGNodW5rcyB0byBjYWxsIGB1bmJvbmRgLCBhbmQgc29tZWEBY2FuIGJlIGNsZWFyZWQgYnkgd2l0aGRyYXdpbmcuIEluIHRoZSBjYXNlIHRoZXJlIGFyZSB0b28gbWFueSB1bmxvY2tpbmcgY2h1bmtzLCB0aGUgdXNlclEBd291bGQgcHJvYmFibHkgc2VlIGFuIGVycm9yIGxpa2UgYE5vTW9yZUNodW5rc2AgZW1pdHRlZCBmcm9tIHRoZSBzdGFraW5nIHN5c3RlbSB3aGVuXHRoZXkgYXR0ZW1wdCB0byB1bmJvbmQuRHdpdGhkcmF3X3VuYm9uZGVkCAE4bWVtYmVyX2FjY291bnTFAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AAUhudW1fc2xhc2hpbmdfc3BhbnMQAQx1MzIABVhVAVdpdGhkcmF3IHVuYm9uZGVkIGZ1bmRzIGZyb20gYG1lbWJlcl9hY2NvdW50YC4gSWYgbm8gYm9uZGVkIGZ1bmRzIGNhbiBiZSB1bmJvbmRlZCwgYW5IZXJyb3IgaXMgcmV0dXJuZWQuAE0BVW5kZXIgY2VydGFpbiBjb25kaXRpb25zLCB0aGlzIGNhbGwgY2FuIGJlIGRpc3BhdGNoZWQgcGVybWlzc2lvbmxlc3NseSAoaS5lLiBieSBhbnkkYWNjb3VudCkuAKgjIENvbmRpdGlvbnMgZm9yIGEgcGVybWlzc2lvbmxlc3MgZGlzcGF0Y2gACQEqIFRoZSBwb29sIGlzIGluIGRlc3Ryb3kgbW9kZSBhbmQgdGhlIHRhcmdldCBpcyBub3QgdGhlIGRlcG9zaXRvci4xASogVGhlIHRhcmdldCBpcyB0aGUgZGVwb3NpdG9yIGFuZCB0aGV5IGFyZSB0aGUgb25seSBtZW1iZXIgaW4gdGhlIHN1YiBwb29scy4NASogVGhlIHBvb2wgaXMgYmxvY2tlZCBhbmQgdGhlIGNhbGxlciBpcyBlaXRoZXIgdGhlIHJvb3Qgb3IgYm91bmNlci4AmCMgQ29uZGl0aW9ucyBmb3IgcGVybWlzc2lvbmVkIGRpc3BhdGNoAOgqIFRoZSBjYWxsZXIgaXMgdGhlIHRhcmdldCBhbmQgdGhleSBhcmUgbm90IHRoZSBkZXBvc2l0b3IuABgjIE5vdGUA9C0gSWYgdGhlIHRhcmdldCBpcyB0aGUgZGVwb3NpdG9yLCB0aGUgcG9vbCB3aWxsIGJlIGRlc3Ryb3llZC5hAS0gSWYgdGhlIHBvb2wgaGFzIGFueSBwZW5kaW5nIHNsYXNoLCB3ZSBhbHNvIHRyeSB0byBzbGFzaCB0aGUgbWVtYmVyIGJlZm9yZSBsZXR0aW5nIHRoZW1dAXdpdGhkcmF3LiBUaGlzIGNhbGN1bGF0aW9uIGFkZHMgc29tZSB3ZWlnaHQgb3ZlcmhlYWQgYW5kIGlzIG9ubHkgZGVmZW5zaXZlLiBJbiByZWFsaXR5LFUBcG9vbCBzbGFzaGVzIG11c3QgaGF2ZSBiZWVuIGFscmVhZHkgYXBwbGllZCB2aWEgcGVybWlzc2lvbmxlc3MgW2BDYWxsOjphcHBseV9zbGFzaGBdLhhjcmVhdGUQARhhbW91bnT8ATBCYWxhbmNlT2Y8VD4AARByb290xQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEkbm9taW5hdG9yxQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEcYm91bmNlcsUBAVBBY2NvdW50SWRMb29rdXBPZjxUPgAGRHRDcmVhdGUgYSBuZXcgZGVsZWdhdGlvbiBwb29sLgAsIyBBcmd1bWVudHMAVQEqIGBhbW91bnRgIC0gVGhlIGFtb3VudCBvZiBmdW5kcyB0byBkZWxlZ2F0ZSB0byB0aGUgcG9vbC4gVGhpcyBhbHNvIGFjdHMgb2YgYSBzb3J0IG9mTQEgIGRlcG9zaXQgc2luY2UgdGhlIHBvb2xzIGNyZWF0b3IgY2Fubm90IGZ1bGx5IHVuYm9uZCBmdW5kcyB1bnRpbCB0aGUgcG9vbCBpcyBiZWluZzAgIGRlc3Ryb3llZC5RASogYGluZGV4YCAtIEEgZGlzYW1iaWd1YXRpb24gaW5kZXggZm9yIGNyZWF0aW5nIHRoZSBhY2NvdW50LiBMaWtlbHkgb25seSB1c2VmdWwgd2hlbsAgIGNyZWF0aW5nIG11bHRpcGxlIHBvb2xzIGluIHRoZSBzYW1lIGV4dHJpbnNpYy7UKiBgcm9vdGAgLSBUaGUgYWNjb3VudCB0byBzZXQgYXMgW2BQb29sUm9sZXM6OnJvb3RgXS4NASogYG5vbWluYXRvcmAgLSBUaGUgYWNjb3VudCB0byBzZXQgYXMgdGhlIFtgUG9vbFJvbGVzOjpub21pbmF0b3JgXS78KiBgYm91bmNlcmAgLSBUaGUgYWNjb3VudCB0byBzZXQgYXMgdGhlIFtgUG9vbFJvbGVzOjpib3VuY2VyYF0uABgjIE5vdGUAYQFJbiBhZGRpdGlvbiB0byBgYW1vdW50YCwgdGhlIGNhbGxlciB3aWxsIHRyYW5zZmVyIHRoZSBleGlzdGVudGlhbCBkZXBvc2l0OyBzbyB0aGUgY2FsbGVyDQFuZWVkcyBhdCBoYXZlIGF0IGxlYXN0IGBhbW91bnQgKyBleGlzdGVudGlhbF9kZXBvc2l0YCB0cmFuc2ZlcmFibGUuTGNyZWF0ZV93aXRoX3Bvb2xfaWQUARhhbW91bnT8ATBCYWxhbmNlT2Y8VD4AARByb290xQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEkbm9taW5hdG9yxQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEcYm91bmNlcsUBAVBBY2NvdW50SWRMb29rdXBPZjxUPgABHHBvb2xfaWQQARhQb29sSWQABxjsQ3JlYXRlIGEgbmV3IGRlbGVnYXRpb24gcG9vbCB3aXRoIGEgcHJldmlvdXNseSB1c2VkIHBvb2wgaWQALCMgQXJndW1lbnRzAJhzYW1lIGFzIGBjcmVhdGVgIHdpdGggdGhlIGluY2x1c2lvbiBvZngqIGBwb29sX2lkYCAtIGBBIHZhbGlkIFBvb2xJZC4gbm9taW5hdGUIARxwb29sX2lkEAEYUG9vbElkAAEodmFsaWRhdG9yc9EBAURWZWM8VDo6QWNjb3VudElkPgAIMHxOb21pbmF0ZSBvbiBiZWhhbGYgb2YgdGhlIHBvb2wuAEUBVGhlIGRpc3BhdGNoIG9yaWdpbiBvZiB0aGlzIGNhbGwgbXVzdCBiZSBzaWduZWQgYnkgdGhlIHBvb2wgbm9taW5hdG9yIG9yIHRoZSBwb29sKHJvb3Qgcm9sZS4ASQFUaGlzIGRpcmVjdGx5IGZvcndhcmQgdGhlIGNhbGwgdG8gdGhlIHN0YWtpbmcgcGFsbGV0LCBvbiBiZWhhbGYgb2YgdGhlIHBvb2wgYm9uZGVkIGFjY291bnQuABgjIE5vdGUAXQFJbiBhZGRpdGlvbiB0byBhIGByb290YCBvciBgbm9taW5hdG9yYCByb2xlIG9mIGBvcmlnaW5gLCBwb29sJ3MgZGVwb3NpdG9yIG5lZWRzIHRvIGhhdmX4YXQgbGVhc3QgYGRlcG9zaXRvcl9taW5fYm9uZGAgaW4gdGhlIHBvb2wgdG8gc3RhcnQgbm9taW5hdGluZy4kc2V0X3N0YXRlCAEccG9vbF9pZBABGFBvb2xJZAABFHN0YXRlIQQBJFBvb2xTdGF0ZQAJKHRTZXQgYSBuZXcgc3RhdGUgZm9yIHRoZSBwb29sLgBVAUlmIGEgcG9vbCBpcyBhbHJlYWR5IGluIHRoZSBgRGVzdHJveWluZ2Agc3RhdGUsIHRoZW4gdW5kZXIgbm8gY29uZGl0aW9uIGNhbiBpdHMgc3RhdGU0Y2hhbmdlIGFnYWluLgDAVGhlIGRpc3BhdGNoIG9yaWdpbiBvZiB0aGlzIGNhbGwgbXVzdCBiZSBlaXRoZXI6ANwxLiBzaWduZWQgYnkgdGhlIGJvdW5jZXIsIG9yIHRoZSByb290IHJvbGUgb2YgdGhlIHBvb2wsXQEyLiBpZiB0aGUgcG9vbCBjb25kaXRpb25zIHRvIGJlIG9wZW4gYXJlIE5PVCBtZXQgKGFzIGRlc2NyaWJlZCBieSBgb2tfdG9fYmVfb3BlbmApLCBhbmQ5ASAgIHRoZW4gdGhlIHN0YXRlIG9mIHRoZSBwb29sIGNhbiBiZSBwZXJtaXNzaW9ubGVzc2x5IGNoYW5nZWQgdG8gYERlc3Ryb3lpbmdgLjBzZXRfbWV0YWRhdGEIARxwb29sX2lkEAEYUG9vbElkAAEgbWV0YWRhdGE4ARxWZWM8dTg+AAoQgFNldCBhIG5ldyBtZXRhZGF0YSBmb3IgdGhlIHBvb2wuAF0BVGhlIGRpc3BhdGNoIG9yaWdpbiBvZiB0aGlzIGNhbGwgbXVzdCBiZSBzaWduZWQgYnkgdGhlIGJvdW5jZXIsIG9yIHRoZSByb290IHJvbGUgb2YgdGhlFHBvb2wuLHNldF9jb25maWdzGAE0bWluX2pvaW5fYm9uZCUEAVhDb25maWdPcDxCYWxhbmNlT2Y8VD4+AAE8bWluX2NyZWF0ZV9ib25kJQQBWENvbmZpZ09wPEJhbGFuY2VPZjxUPj4AASRtYXhfcG9vbHMpBAE0Q29uZmlnT3A8dTMyPgABLG1heF9tZW1iZXJzKQQBNENvbmZpZ09wPHUzMj4AAVBtYXhfbWVtYmVyc19wZXJfcG9vbCkEATRDb25maWdPcDx1MzI+AAFUZ2xvYmFsX21heF9jb21taXNzaW9uLQQBRENvbmZpZ09wPFBlcmJpbGw+AAssQQFVcGRhdGUgY29uZmlndXJhdGlvbnMgZm9yIHRoZSBub21pbmF0aW9uIHBvb2xzLiBUaGUgb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZWBbYENvbmZpZzo6QWRtaW5PcmlnaW5gXS4ALCMgQXJndW1lbnRzAKAqIGBtaW5fam9pbl9ib25kYCAtIFNldCBbYE1pbkpvaW5Cb25kYF0usCogYG1pbl9jcmVhdGVfYm9uZGAgLSBTZXQgW2BNaW5DcmVhdGVCb25kYF0uhCogYG1heF9wb29sc2AgLSBTZXQgW2BNYXhQb29sc2BdLqQqIGBtYXhfbWVtYmVyc2AgLSBTZXQgW2BNYXhQb29sTWVtYmVyc2BdLuQqIGBtYXhfbWVtYmVyc19wZXJfcG9vbGAgLSBTZXQgW2BNYXhQb29sTWVtYmVyc1BlclBvb2xgXS7gKiBgZ2xvYmFsX21heF9jb21taXNzaW9uYCAtIFNldCBbYEdsb2JhbE1heENvbW1pc3Npb25gXS4wdXBkYXRlX3JvbGVzEAEccG9vbF9pZBABGFBvb2xJZAABIG5ld19yb290MQQBWENvbmZpZ09wPFQ6OkFjY291bnRJZD4AATRuZXdfbm9taW5hdG9yMQQBWENvbmZpZ09wPFQ6OkFjY291bnRJZD4AASxuZXdfYm91bmNlcjEEAVhDb25maWdPcDxUOjpBY2NvdW50SWQ+AAwcdFVwZGF0ZSB0aGUgcm9sZXMgb2YgdGhlIHBvb2wuAD0BVGhlIHJvb3QgaXMgdGhlIG9ubHkgZW50aXR5IHRoYXQgY2FuIGNoYW5nZSBhbnkgb2YgdGhlIHJvbGVzLCBpbmNsdWRpbmcgaXRzZWxmLLhleGNsdWRpbmcgdGhlIGRlcG9zaXRvciwgd2hvIGNhbiBuZXZlciBjaGFuZ2UuAFEBSXQgZW1pdHMgYW4gZXZlbnQsIG5vdGlmeWluZyBVSXMgb2YgdGhlIHJvbGUgY2hhbmdlLiBUaGlzIGV2ZW50IGlzIHF1aXRlIHJlbGV2YW50IHRvHQFtb3N0IHBvb2wgbWVtYmVycyBhbmQgdGhleSBzaG91bGQgYmUgaW5mb3JtZWQgb2YgY2hhbmdlcyB0byBwb29sIHJvbGVzLhRjaGlsbAQBHHBvb2xfaWQQARhQb29sSWQADUBwQ2hpbGwgb24gYmVoYWxmIG9mIHRoZSBwb29sLgBBAVRoZSBkaXNwYXRjaCBvcmlnaW4gb2YgdGhpcyBjYWxsIGNhbiBiZSBzaWduZWQgYnkgdGhlIHBvb2wgbm9taW5hdG9yIG9yIHRoZSBwb29soHJvb3Qgcm9sZSwgc2FtZSBhcyBbYFBhbGxldDo6bm9taW5hdGVgXS4ATQFVbmRlciBjZXJ0YWluIGNvbmRpdGlvbnMsIHRoaXMgY2FsbCBjYW4gYmUgZGlzcGF0Y2hlZCBwZXJtaXNzaW9ubGVzc2x5IChpLmUuIGJ5IGFueSRhY2NvdW50KS4ArCMgQ29uZGl0aW9ucyBmb3IgYSBwZXJtaXNzaW9ubGVzcyBkaXNwYXRjaDpZASogV2hlbiBwb29sIGRlcG9zaXRvciBoYXMgbGVzcyB0aGFuIGBNaW5Ob21pbmF0b3JCb25kYCBzdGFrZWQsIG90aGVyd2lzZSAgcG9vbCBtZW1iZXJzXCAgYXJlIHVuYWJsZSB0byB1bmJvbmQuAJwjIENvbmRpdGlvbnMgZm9yIHBlcm1pc3Npb25lZCBkaXNwYXRjaDrYKiBUaGUgY2FsbGVyIGhhcyBhIG5vbWluYXRvciBvciByb290IHJvbGUgb2YgdGhlIHBvb2wuSQFUaGlzIGRpcmVjdGx5IGZvcndhcmQgdGhlIGNhbGwgdG8gdGhlIHN0YWtpbmcgcGFsbGV0LCBvbiBiZWhhbGYgb2YgdGhlIHBvb2wgYm9uZGVkIGFjY291bnQuQGJvbmRfZXh0cmFfb3RoZXIIARhtZW1iZXLFAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AARRleHRyYR0EAVxCb25kRXh0cmE8QmFsYW5jZU9mPFQ+PgAOJFUBYG9yaWdpbmAgYm9uZHMgZnVuZHMgZnJvbSBgZXh0cmFgIGZvciBzb21lIHBvb2wgbWVtYmVyIGBtZW1iZXJgIGludG8gdGhlaXIgcmVzcGVjdGl2ZRhwb29scy4ASQFgb3JpZ2luYCBjYW4gYm9uZCBleHRyYSBmdW5kcyBmcm9tIGZyZWUgYmFsYW5jZSBvciBwZW5kaW5nIHJld2FyZHMgd2hlbiBgb3JpZ2luID09HG90aGVyYC4ARQFJbiB0aGUgY2FzZSBvZiBgb3JpZ2luICE9IG90aGVyYCwgYG9yaWdpbmAgY2FuIG9ubHkgYm9uZCBleHRyYSBwZW5kaW5nIHJld2FyZHMgb2YVAWBvdGhlcmAgbWVtYmVycyBhc3N1bWluZyBzZXRfY2xhaW1fcGVybWlzc2lvbiBmb3IgdGhlIGdpdmVuIG1lbWJlciBpc8BgUGVybWlzc2lvbmxlc3NDb21wb3VuZGAgb3IgYFBlcm1pc3Npb25sZXNzQWxsYC5Qc2V0X2NsYWltX3Blcm1pc3Npb24EAShwZXJtaXNzaW9uNQQBPENsYWltUGVybWlzc2lvbgAPHEkBQWxsb3dzIGEgcG9vbCBtZW1iZXIgdG8gc2V0IGEgY2xhaW0gcGVybWlzc2lvbiB0byBhbGxvdyBvciBkaXNhbGxvdyBwZXJtaXNzaW9ubGVzc2Bib25kaW5nIGFuZCB3aXRoZHJhd2luZy4ALCMgQXJndW1lbnRzAHgqIGBvcmlnaW5gIC0gTWVtYmVyIG9mIGEgcG9vbC64KiBgcGVybWlzc2lvbmAgLSBUaGUgcGVybWlzc2lvbiB0byBiZSBhcHBsaWVkLkhjbGFpbV9wYXlvdXRfb3RoZXIEARRvdGhlcgABMFQ6OkFjY291bnRJZAAQEAEBYG9yaWdpbmAgY2FuIGNsYWltIHBheW91dHMgb24gc29tZSBwb29sIG1lbWJlciBgb3RoZXJgJ3MgYmVoYWxmLgBVAVBvb2wgbWVtYmVyIGBvdGhlcmAgbXVzdCBoYXZlIGEgYFBlcm1pc3Npb25sZXNzV2l0aGRyYXdgIG9yIGBQZXJtaXNzaW9ubGVzc0FsbGAgY2xhaW2ocGVybWlzc2lvbiBmb3IgdGhpcyBjYWxsIHRvIGJlIHN1Y2Nlc3NmdWwuOHNldF9jb21taXNzaW9uCAEccG9vbF9pZBABGFBvb2xJZAABOG5ld19jb21taXNzaW9uOQQBfE9wdGlvbjwoUGVyYmlsbCwgVDo6QWNjb3VudElkKT4AERR0U2V0IHRoZSBjb21taXNzaW9uIG9mIGEgcG9vbC5VAUJvdGggYSBjb21taXNzaW9uIHBlcmNlbnRhZ2UgYW5kIGEgY29tbWlzc2lvbiBwYXllZSBtdXN0IGJlIHByb3ZpZGVkIGluIHRoZSBgY3VycmVudGBdAXR1cGxlLiBXaGVyZSBhIGBjdXJyZW50YCBvZiBgTm9uZWAgaXMgcHJvdmlkZWQsIGFueSBjdXJyZW50IGNvbW1pc3Npb24gd2lsbCBiZSByZW1vdmVkLgBNAS0gSWYgYSBgTm9uZWAgaXMgc3VwcGxpZWQgdG8gYG5ld19jb21taXNzaW9uYCwgZXhpc3RpbmcgY29tbWlzc2lvbiB3aWxsIGJlIHJlbW92ZWQuSHNldF9jb21taXNzaW9uX21heAgBHHBvb2xfaWQQARhQb29sSWQAAThtYXhfY29tbWlzc2lvbqwBHFBlcmJpbGwAEhSUU2V0IHRoZSBtYXhpbXVtIGNvbW1pc3Npb24gb2YgYSBwb29sLgA5AS0gSW5pdGlhbCBtYXggY2FuIGJlIHNldCB0byBhbnkgYFBlcmJpbGxgLCBhbmQgb25seSBzbWFsbGVyIHZhbHVlcyB0aGVyZWFmdGVyLjUBLSBDdXJyZW50IGNvbW1pc3Npb24gd2lsbCBiZSBsb3dlcmVkIGluIHRoZSBldmVudCBpdCBpcyBoaWdoZXIgdGhhbiBhIG5ldyBtYXg0ICBjb21taXNzaW9uLmhzZXRfY29tbWlzc2lvbl9jaGFuZ2VfcmF0ZQgBHHBvb2xfaWQQARhQb29sSWQAASxjaGFuZ2VfcmF0ZUEEAZxDb21taXNzaW9uQ2hhbmdlUmF0ZTxCbG9ja051bWJlckZvcjxUPj4AExCoU2V0IHRoZSBjb21taXNzaW9uIGNoYW5nZSByYXRlIGZvciBhIHBvb2wuAD0BSW5pdGlhbCBjaGFuZ2UgcmF0ZSBpcyBub3QgYm91bmRlZCwgd2hlcmVhcyBzdWJzZXF1ZW50IHVwZGF0ZXMgY2FuIG9ubHkgYmUgbW9yZXRyZXN0cmljdGl2ZSB0aGFuIHRoZSBjdXJyZW50LkBjbGFpbV9jb21taXNzaW9uBAEccG9vbF9pZBABGFBvb2xJZAAUFGRDbGFpbSBwZW5kaW5nIGNvbW1pc3Npb24uAF0BVGhlIGRpc3BhdGNoIG9yaWdpbiBvZiB0aGlzIGNhbGwgbXVzdCBiZSBzaWduZWQgYnkgdGhlIGByb290YCByb2xlIG9mIHRoZSBwb29sLiBQZW5kaW5nXQFjb21taXNzaW9uIGlzIHBhaWQgb3V0IGFuZCBhZGRlZCB0byB0b3RhbCBjbGFpbWVkIGNvbW1pc3Npb25gLiBUb3RhbCBwZW5kaW5nIGNvbW1pc3Npb254aXMgcmVzZXQgdG8gemVyby4gdGhlIGN1cnJlbnQuTGFkanVzdF9wb29sX2RlcG9zaXQEARxwb29sX2lkEAEYUG9vbElkABUc7FRvcCB1cCB0aGUgZGVmaWNpdCBvciB3aXRoZHJhdyB0aGUgZXhjZXNzIEVEIGZyb20gdGhlIHBvb2wuAFEBV2hlbiBhIHBvb2wgaXMgY3JlYXRlZCwgdGhlIHBvb2wgZGVwb3NpdG9yIHRyYW5zZmVycyBFRCB0byB0aGUgcmV3YXJkIGFjY291bnQgb2YgdGhlVQFwb29sLiBFRCBpcyBzdWJqZWN0IHRvIGNoYW5nZSBhbmQgb3ZlciB0aW1lLCB0aGUgZGVwb3NpdCBpbiB0aGUgcmV3YXJkIGFjY291bnQgbWF5IGJlUQFpbnN1ZmZpY2llbnQgdG8gY292ZXIgdGhlIEVEIGRlZmljaXQgb2YgdGhlIHBvb2wgb3IgdmljZS12ZXJzYSB3aGVyZSB0aGVyZSBpcyBleGNlc3MxAWRlcG9zaXQgdG8gdGhlIHBvb2wuIFRoaXMgY2FsbCBhbGxvd3MgYW55b25lIHRvIGFkanVzdCB0aGUgRUQgZGVwb3NpdCBvZiB0aGX0cG9vbCBieSBlaXRoZXIgdG9wcGluZyB1cCB0aGUgZGVmaWNpdCBvciBjbGFpbWluZyB0aGUgZXhjZXNzLnxzZXRfY29tbWlzc2lvbl9jbGFpbV9wZXJtaXNzaW9uCAEccG9vbF9pZBABGFBvb2xJZAABKHBlcm1pc3Npb25FBAG8T3B0aW9uPENvbW1pc3Npb25DbGFpbVBlcm1pc3Npb248VDo6QWNjb3VudElkPj4AFhDMU2V0IG9yIHJlbW92ZSBhIHBvb2wncyBjb21taXNzaW9uIGNsYWltIHBlcm1pc3Npb24uAGEBRGV0ZXJtaW5lcyB3aG8gY2FuIGNsYWltIHRoZSBwb29sJ3MgcGVuZGluZyBjb21taXNzaW9uLiBPbmx5IHRoZSBgUm9vdGAgcm9sZSBvZiB0aGUgcG9vbMhpcyBhYmxlIHRvIGNvbmZpZ3VyZSBjb21taXNzaW9uIGNsYWltIHBlcm1pc3Npb25zLixhcHBseV9zbGFzaAQBOG1lbWJlcl9hY2NvdW50xQEBUEFjY291bnRJZExvb2t1cE9mPFQ+ABcciEFwcGx5IGEgcGVuZGluZyBzbGFzaCBvbiBhIG1lbWJlci4AJQFGYWlscyB1bmxlc3MgW2BjcmF0ZTo6cGFsbGV0OjpDb25maWc6OlN0YWtlQWRhcHRlcmBdIGlzIG9mIHN0cmF0ZWd5IHR5cGU6pFtgYWRhcHRlcjo6U3Rha2VTdHJhdGVneVR5cGU6OkRlbGVnYXRlYF0uAFUBVGhpcyBjYWxsIGNhbiBiZSBkaXNwYXRjaGVkIHBlcm1pc3Npb25sZXNzbHkgKGkuZS4gYnkgYW55IGFjY291bnQpLiBJZiB0aGUgbWVtYmVyIGhhcx0Bc2xhc2ggdG8gYmUgYXBwbGllZCwgY2FsbGVyIG1heSBiZSByZXdhcmRlZCB3aXRoIHRoZSBwYXJ0IG9mIHRoZSBzbGFzaC5IbWlncmF0ZV9kZWxlZ2F0aW9uBAE4bWVtYmVyX2FjY291bnTFAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AGCQdAU1pZ3JhdGVzIGRlbGVnYXRlZCBmdW5kcyBmcm9tIHRoZSBwb29sIGFjY291bnQgdG8gdGhlIGBtZW1iZXJfYWNjb3VudGAuACUBRmFpbHMgdW5sZXNzIFtgY3JhdGU6OnBhbGxldDo6Q29uZmlnOjpTdGFrZUFkYXB0ZXJgXSBpcyBvZiBzdHJhdGVneSB0eXBlOqRbYGFkYXB0ZXI6OlN0YWtlU3RyYXRlZ3lUeXBlOjpEZWxlZ2F0ZWBdLgApAVRoaXMgaXMgYSBwZXJtaXNzaW9uLWxlc3MgY2FsbCBhbmQgcmVmdW5kcyBhbnkgZmVlIGlmIGNsYWltIGlzIHN1Y2Nlc3NmdWwuAF0BSWYgdGhlIHBvb2wgaGFzIG1pZ3JhdGVkIHRvIGRlbGVnYXRpb24gYmFzZWQgc3Rha2luZywgdGhlIHN0YWtlZCB0b2tlbnMgb2YgcG9vbCBtZW1iZXJzKQFjYW4gYmUgbW92ZWQgYW5kIGhlbGQgaW4gdGhlaXIgb3duIGFjY291bnQuIFNlZSBbYGFkYXB0ZXI6OkRlbGVnYXRlU3Rha2VgXXhtaWdyYXRlX3Bvb2xfdG9fZGVsZWdhdGVfc3Rha2UEARxwb29sX2lkEAEYUG9vbElkABkk9E1pZ3JhdGUgcG9vbCBmcm9tIFtgYWRhcHRlcjo6U3Rha2VTdHJhdGVneVR5cGU6OlRyYW5zZmVyYF0gdG+kW2BhZGFwdGVyOjpTdGFrZVN0cmF0ZWd5VHlwZTo6RGVsZWdhdGVgXS4AJQFGYWlscyB1bmxlc3MgW2BjcmF0ZTo6cGFsbGV0OjpDb25maWc6OlN0YWtlQWRhcHRlcmBdIGlzIG9mIHN0cmF0ZWd5IHR5cGU6pFtgYWRhcHRlcjo6U3Rha2VTdHJhdGVneVR5cGU6OkRlbGVnYXRlYF0uAEEBVGhpcyBjYWxsIGNhbiBiZSBkaXNwYXRjaGVkIHBlcm1pc3Npb25sZXNzbHksIGFuZCByZWZ1bmRzIGFueSBmZWUgaWYgc3VjY2Vzc2Z1bC4ASQFJZiB0aGUgcG9vbCBoYXMgYWxyZWFkeSBtaWdyYXRlZCB0byBkZWxlZ2F0aW9uIGJhc2VkIHN0YWtpbmcsIHRoaXMgY2FsbCB3aWxsIGZhaWwuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLh0ECFxwYWxsZXRfbm9taW5hdGlvbl9wb29scyRCb25kRXh0cmEEHEJhbGFuY2UBGAEILEZyZWVCYWxhbmNlBAAYARxCYWxhbmNlAAAAHFJld2FyZHMAAQAAIQQIXHBhbGxldF9ub21pbmF0aW9uX3Bvb2xzJFBvb2xTdGF0ZQABDBBPcGVuAAAAHEJsb2NrZWQAAQAoRGVzdHJveWluZwACAAAlBAhccGFsbGV0X25vbWluYXRpb25fcG9vbHMgQ29uZmlnT3AEBFQBGAEMEE5vb3AAAAAMU2V0BAAYAQRUAAEAGFJlbW92ZQACAAApBAhccGFsbGV0X25vbWluYXRpb25fcG9vbHMgQ29uZmlnT3AEBFQBEAEMEE5vb3AAAAAMU2V0BAAQAQRUAAEAGFJlbW92ZQACAAAtBAhccGFsbGV0X25vbWluYXRpb25fcG9vbHMgQ29uZmlnT3AEBFQBrAEMEE5vb3AAAAAMU2V0BACsAQRUAAEAGFJlbW92ZQACAAAxBAhccGFsbGV0X25vbWluYXRpb25fcG9vbHMgQ29uZmlnT3AEBFQBAAEMEE5vb3AAAAAMU2V0BAAAAQRUAAEAGFJlbW92ZQACAAA1BAhccGFsbGV0X25vbWluYXRpb25fcG9vbHM8Q2xhaW1QZXJtaXNzaW9uAAEQMFBlcm1pc3Npb25lZAAAAFhQZXJtaXNzaW9ubGVzc0NvbXBvdW5kAAEAWFBlcm1pc3Npb25sZXNzV2l0aGRyYXcAAgBEUGVybWlzc2lvbmxlc3NBbGwAAwAAOQQEGE9wdGlvbgQEVAE9BAEIEE5vbmUAAAAQU29tZQQAPQQAAAEAAD0EAAAECKwAAEEECFxwYWxsZXRfbm9taW5hdGlvbl9wb29sc1BDb21taXNzaW9uQ2hhbmdlUmF0ZQQsQmxvY2tOdW1iZXIBEAAIATBtYXhfaW5jcmVhc2WsARxQZXJiaWxsAAEkbWluX2RlbGF5EAEsQmxvY2tOdW1iZXIAAEUEBBhPcHRpb24EBFQBSQQBCBBOb25lAAAAEFNvbWUEAEkEAAABAABJBAhccGFsbGV0X25vbWluYXRpb25fcG9vbHNkQ29tbWlzc2lvbkNsYWltUGVybWlzc2lvbgQkQWNjb3VudElkAQABCDhQZXJtaXNzaW9ubGVzcwAAABxBY2NvdW50BAAAASRBY2NvdW50SWQAAQAATQQMTHBhbGxldF9mYXN0X3Vuc3Rha2UYcGFsbGV0EENhbGwEBFQAAQxUcmVnaXN0ZXJfZmFzdF91bnN0YWtlAABoiFJlZ2lzdGVyIG9uZXNlbGYgZm9yIGZhc3QtdW5zdGFrZS4ASCMjIERpc3BhdGNoIE9yaWdpbgBFAVRoZSBkaXNwYXRjaCBvcmlnaW4gb2YgdGhpcyBjYWxsIG11c3QgYmUgKnNpZ25lZCogYnkgd2hvZXZlciBpcyBwZXJtaXR0ZWQgdG8gY2FsbPB1bmJvbmQgZnVuZHMgYnkgdGhlIHN0YWtpbmcgc3lzdGVtLiBTZWUgW2BDb25maWc6OlN0YWtpbmdgXS4AKCMjIERldGFpbHMAOQFUaGUgc3Rhc2ggYXNzb2NpYXRlZCB3aXRoIHRoZSBvcmlnaW4gbXVzdCBoYXZlIG5vIG9uZ29pbmcgdW5sb2NraW5nIGNodW5rcy4gSWZdAXN1Y2Nlc3NmdWwsIHRoaXMgd2lsbCBmdWxseSB1bmJvbmQgYW5kIGNoaWxsIHRoZSBzdGFzaC4gVGhlbiwgaXQgd2lsbCBlbnF1ZXVlIHRoZSBzdGFzaIB0byBiZSBjaGVja2VkIGluIGZ1cnRoZXIgYmxvY2tzLgBRAUlmIGJ5IHRoZSB0aW1lIHRoaXMgaXMgY2FsbGVkLCB0aGUgc3Rhc2ggaXMgYWN0dWFsbHkgZWxpZ2libGUgZm9yIGZhc3QtdW5zdGFrZSwgdGhlbkUBdGhleSBhcmUgZ3VhcmFudGVlZCB0byByZW1haW4gZWxpZ2libGUsIGJlY2F1c2UgdGhlIGNhbGwgd2lsbCBjaGlsbCB0aGVtIGFzIHdlbGwuAD0BSWYgdGhlIGNoZWNrIHdvcmtzLCB0aGUgZW50aXJlIHN0YWtpbmcgZGF0YSBpcyByZW1vdmVkLCBpLmUuIHRoZSBzdGFzaCBpcyBmdWxseSR1bnN0YWtlZC4AXQFJZiB0aGUgY2hlY2sgZmFpbHMsIHRoZSBzdGFzaCByZW1haW5zIGNoaWxsZWQgYW5kIHdhaXRpbmcgZm9yIGJlaW5nIHVuYm9uZGVkIGFzIGluIHdpdGhhAXRoZSBub3JtYWwgc3Rha2luZyBzeXN0ZW0sIGJ1dCB0aGV5IGxvc2UgcGFydCBvZiB0aGVpciB1bmJvbmRpbmcgY2h1bmtzIGR1ZSB0byBjb25zdW1pbmdYdGhlIGNoYWluJ3MgcmVzb3VyY2VzLgAkIyMgRXZlbnRzAAkBU29tZSBldmVudHMgZnJvbSB0aGUgc3Rha2luZyBhbmQgY3VycmVuY3kgc3lzdGVtIG1pZ2h0IGJlIGVtaXR0ZWQuKGRlcmVnaXN0ZXIAAUikRGVyZWdpc3RlciBvbmVzZWxmIGZyb20gdGhlIGZhc3QtdW5zdGFrZS4ASCMjIERpc3BhdGNoIE9yaWdpbgBFAVRoZSBkaXNwYXRjaCBvcmlnaW4gb2YgdGhpcyBjYWxsIG11c3QgYmUgKnNpZ25lZCogYnkgd2hvZXZlciBpcyBwZXJtaXR0ZWQgdG8gY2FsbPB1bmJvbmQgZnVuZHMgYnkgdGhlIHN0YWtpbmcgc3lzdGVtLiBTZWUgW2BDb25maWc6OlN0YWtpbmdgXS4AKCMjIERldGFpbHMAYQFUaGlzIGlzIHVzZWZ1bCBpZiBvbmUgaXMgcmVnaXN0ZXJlZCwgdGhleSBhcmUgc3RpbGwgd2FpdGluZywgYW5kIHRoZXkgY2hhbmdlIHRoZWlyIG1pbmQuAFkBTm90ZSB0aGF0IHRoZSBhc3NvY2lhdGVkIHN0YXNoIGlzIHN0aWxsIGZ1bGx5IHVuYm9uZGVkIGFuZCBjaGlsbGVkIGFzIGEgY29uc2VxdWVuY2Ugb2ZZAWNhbGxpbmcgW2BQYWxsZXQ6OnJlZ2lzdGVyX2Zhc3RfdW5zdGFrZWBdLiBUaGVyZWZvcmUsIHRoaXMgc2hvdWxkIHByb2JhYmx5IGJlIGZvbGxvd2VksGJ5IGEgY2FsbCB0byBgcmVib25kYCBpbiB0aGUgc3Rha2luZyBzeXN0ZW0uACQjIyBFdmVudHMACQFTb21lIGV2ZW50cyBmcm9tIHRoZSBzdGFraW5nIGFuZCBjdXJyZW5jeSBzeXN0ZW0gbWlnaHQgYmUgZW1pdHRlZC4cY29udHJvbAQBNGVyYXNfdG9fY2hlY2sQASBFcmFJbmRleAACNJRDb250cm9sIHRoZSBvcGVyYXRpb24gb2YgdGhpcyBwYWxsZXQuAEgjIyBEaXNwYXRjaCBPcmlnaW4ADQFUaGUgZGlzcGF0Y2ggb3JpZ2luIG9mIHRoaXMgY2FsbCBtdXN0IGJlIFtgQ29uZmlnOjpDb250cm9sT3JpZ2luYF0uACgjIyBEZXRhaWxzAEEBQ2FuIHNldCB0aGUgbnVtYmVyIG9mIGVyYXMgdG8gY2hlY2sgcGVyIGJsb2NrLCBhbmQgcG90ZW50aWFsbHkgb3RoZXIgYWRtaW4gd29yay4AJCMjIEV2ZW50cwCkTm8gZXZlbnRzIGFyZSBlbWl0dGVkIGZyb20gdGhpcyBkaXNwYXRjaC4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMuUQQQbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWluczRjb25maWd1cmF0aW9uGHBhbGxldBBDYWxsBARUAAHAfHNldF92YWxpZGF0aW9uX3VwZ3JhZGVfY29vbGRvd24EAQxuZXcQAURCbG9ja051bWJlckZvcjxUPgAABJBTZXQgdGhlIHZhbGlkYXRpb24gdXBncmFkZSBjb29sZG93bi5wc2V0X3ZhbGlkYXRpb25fdXBncmFkZV9kZWxheQQBDG5ldxABREJsb2NrTnVtYmVyRm9yPFQ+AAEEhFNldCB0aGUgdmFsaWRhdGlvbiB1cGdyYWRlIGRlbGF5LmRzZXRfY29kZV9yZXRlbnRpb25fcGVyaW9kBAEMbmV3EAFEQmxvY2tOdW1iZXJGb3I8VD4AAgTQU2V0IHRoZSBhY2NlcHRhbmNlIHBlcmlvZCBmb3IgYW4gaW5jbHVkZWQgY2FuZGlkYXRlLkRzZXRfbWF4X2NvZGVfc2l6ZQQBDG5ldxABDHUzMgADBNxTZXQgdGhlIG1heCB2YWxpZGF0aW9uIGNvZGUgc2l6ZSBmb3IgaW5jb21pbmcgdXBncmFkZXMuQHNldF9tYXhfcG92X3NpemUEAQxuZXcQAQx1MzIABATEU2V0IHRoZSBtYXggUE9WIGJsb2NrIHNpemUgZm9yIGluY29taW5nIHVwZ3JhZGVzLlhzZXRfbWF4X2hlYWRfZGF0YV9zaXplBAEMbmV3EAEMdTMyAAUElFNldCB0aGUgbWF4IGhlYWQgZGF0YSBzaXplIGZvciBwYXJhcy5Ic2V0X2NvcmV0aW1lX2NvcmVzBAEMbmV3EAEMdTMyAAYQrFNldCB0aGUgbnVtYmVyIG9mIGNvcmV0aW1lIGV4ZWN1dGlvbiBjb3Jlcy4AUQFOT1RFOiB0aGF0IHRoaXMgY29uZmlndXJhdGlvbiBpcyBtYW5hZ2VkIGJ5IHRoZSBjb3JldGltZSBjaGFpbi4gT25seSBtYW51YWxseSBjaGFuZ2WwdGhpcywgaWYgeW91IHJlYWxseSBrbm93IHdoYXQgeW91IGFyZSBkb2luZyF0c2V0X21heF9hdmFpbGFiaWxpdHlfdGltZW91dHMEAQxuZXcQAQx1MzIABwRBAVNldCB0aGUgbWF4IG51bWJlciBvZiB0aW1lcyBhIGNsYWltIG1heSB0aW1lb3V0IG9uIGEgY29yZSBiZWZvcmUgaXQgaXMgYWJhbmRvbmVkcHNldF9ncm91cF9yb3RhdGlvbl9mcmVxdWVuY3kEAQxuZXcQAURCbG9ja051bWJlckZvcjxUPgAIBNBTZXQgdGhlIHBhcmFjaGFpbiB2YWxpZGF0b3ItZ3JvdXAgcm90YXRpb24gZnJlcXVlbmN5dHNldF9wYXJhc19hdmFpbGFiaWxpdHlfcGVyaW9kBAEMbmV3EAFEQmxvY2tOdW1iZXJGb3I8VD4ACQSYU2V0IHRoZSBhdmFpbGFiaWxpdHkgcGVyaW9kIGZvciBwYXJhcy5gc2V0X3NjaGVkdWxpbmdfbG9va2FoZWFkBAEMbmV3EAEMdTMyAAsEOQFTZXQgdGhlIHNjaGVkdWxpbmcgbG9va2FoZWFkLCBpbiBleHBlY3RlZCBudW1iZXIgb2YgYmxvY2tzIGF0IHBlYWsgdGhyb3VnaHB1dC5sc2V0X21heF92YWxpZGF0b3JzX3Blcl9jb3JlBAEMbmV3YQIBLE9wdGlvbjx1MzI+AAwE7FNldCB0aGUgbWF4aW11bSBudW1iZXIgb2YgdmFsaWRhdG9ycyB0byBhc3NpZ24gdG8gYW55IGNvcmUuSHNldF9tYXhfdmFsaWRhdG9ycwQBDG5ld2ECASxPcHRpb248dTMyPgANBA0BU2V0IHRoZSBtYXhpbXVtIG51bWJlciBvZiB2YWxpZGF0b3JzIHRvIHVzZSBpbiBwYXJhY2hhaW4gY29uc2Vuc3VzLkhzZXRfZGlzcHV0ZV9wZXJpb2QEAQxuZXcQATBTZXNzaW9uSW5kZXgADgQNAVNldCB0aGUgZGlzcHV0ZSBwZXJpb2QsIGluIG51bWJlciBvZiBzZXNzaW9ucyB0byBrZWVwIGZvciBkaXNwdXRlcy60c2V0X2Rpc3B1dGVfcG9zdF9jb25jbHVzaW9uX2FjY2VwdGFuY2VfcGVyaW9kBAEMbmV3EAFEQmxvY2tOdW1iZXJGb3I8VD4ADwTIU2V0IHRoZSBkaXNwdXRlIHBvc3QgY29uY2x1c2lvbiBhY2NlcHRhbmNlIHBlcmlvZC5Ec2V0X25vX3Nob3dfc2xvdHMEAQxuZXcQAQx1MzIAEgj4U2V0IHRoZSBubyBzaG93IHNsb3RzLCBpbiBudW1iZXIgb2YgbnVtYmVyIG9mIGNvbnNlbnN1cyBzbG90cy5MTXVzdCBiZSBhdCBsZWFzdCAxLlBzZXRfbl9kZWxheV90cmFuY2hlcwQBDG5ldxABDHUzMgATBJxTZXQgdGhlIHRvdGFsIG51bWJlciBvZiBkZWxheSB0cmFuY2hlcy54c2V0X3plcm90aF9kZWxheV90cmFuY2hlX3dpZHRoBAEMbmV3EAEMdTMyABQEjFNldCB0aGUgemVyb3RoIGRlbGF5IHRyYW5jaGUgd2lkdGguUHNldF9uZWVkZWRfYXBwcm92YWxzBAEMbmV3EAEMdTMyABUE3FNldCB0aGUgbnVtYmVyIG9mIHZhbGlkYXRvcnMgbmVlZGVkIHRvIGFwcHJvdmUgYSBibG9jay5wc2V0X3JlbGF5X3ZyZl9tb2R1bG9fc2FtcGxlcwQBDG5ldxABDHUzMgAWBFkBU2V0IHRoZSBudW1iZXIgb2Ygc2FtcGxlcyB0byBkbyBvZiB0aGUgYFJlbGF5VlJGTW9kdWxvYCBhcHByb3ZhbCBhc3NpZ25tZW50IGNyaXRlcmlvbi5oc2V0X21heF91cHdhcmRfcXVldWVfY291bnQEAQxuZXcQAQx1MzIAFwQtAVNldHMgdGhlIG1heGltdW0gaXRlbXMgdGhhdCBjYW4gcHJlc2VudCBpbiBhIHVwd2FyZCBkaXNwYXRjaCBxdWV1ZSBhdCBvbmNlLmRzZXRfbWF4X3Vwd2FyZF9xdWV1ZV9zaXplBAEMbmV3EAEMdTMyABgITQFTZXRzIHRoZSBtYXhpbXVtIHRvdGFsIHNpemUgb2YgaXRlbXMgdGhhdCBjYW4gcHJlc2VudCBpbiBhIHVwd2FyZCBkaXNwYXRjaCBxdWV1ZSBhdBRvbmNlLnRzZXRfbWF4X2Rvd253YXJkX21lc3NhZ2Vfc2l6ZQQBDG5ldxABDHUzMgAZBJxTZXQgdGhlIGNyaXRpY2FsIGRvd253YXJkIG1lc3NhZ2Ugc2l6ZS5sc2V0X21heF91cHdhcmRfbWVzc2FnZV9zaXplBAEMbmV3EAEMdTMyABsELQFTZXRzIHRoZSBtYXhpbXVtIHNpemUgb2YgYW4gdXB3YXJkIG1lc3NhZ2UgdGhhdCBjYW4gYmUgc2VudCBieSBhIGNhbmRpZGF0ZS6gc2V0X21heF91cHdhcmRfbWVzc2FnZV9udW1fcGVyX2NhbmRpZGF0ZQQBDG5ldxABDHUzMgAcBAUBU2V0cyB0aGUgbWF4aW11bSBudW1iZXIgb2YgbWVzc2FnZXMgdGhhdCBhIGNhbmRpZGF0ZSBjYW4gY29udGFpbi5kc2V0X2hybXBfb3Blbl9yZXF1ZXN0X3R0bAQBDG5ldxABDHUzMgAdBDUBU2V0cyB0aGUgbnVtYmVyIG9mIHNlc3Npb25zIGFmdGVyIHdoaWNoIGFuIEhSTVAgb3BlbiBjaGFubmVsIHJlcXVlc3QgZXhwaXJlcy5cc2V0X2hybXBfc2VuZGVyX2RlcG9zaXQEAQxuZXcYARxCYWxhbmNlAB4EUQFTZXRzIHRoZSBhbW91bnQgb2YgZnVuZHMgdGhhdCB0aGUgc2VuZGVyIHNob3VsZCBwcm92aWRlIGZvciBvcGVuaW5nIGFuIEhSTVAgY2hhbm5lbC5oc2V0X2hybXBfcmVjaXBpZW50X2RlcG9zaXQEAQxuZXcYARxCYWxhbmNlAB8IYQFTZXRzIHRoZSBhbW91bnQgb2YgZnVuZHMgdGhhdCB0aGUgcmVjaXBpZW50IHNob3VsZCBwcm92aWRlIGZvciBhY2NlcHRpbmcgb3BlbmluZyBhbiBIUk1QIGNoYW5uZWwudHNldF9ocm1wX2NoYW5uZWxfbWF4X2NhcGFjaXR5BAEMbmV3EAEMdTMyACAEHQFTZXRzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBtZXNzYWdlcyBhbGxvd2VkIGluIGFuIEhSTVAgY2hhbm5lbCBhdCBvbmNlLnxzZXRfaHJtcF9jaGFubmVsX21heF90b3RhbF9zaXplBAEMbmV3EAEMdTMyACEEUQFTZXRzIHRoZSBtYXhpbXVtIHRvdGFsIHNpemUgb2YgbWVzc2FnZXMgaW4gYnl0ZXMgYWxsb3dlZCBpbiBhbiBIUk1QIGNoYW5uZWwgYXQgb25jZS6cc2V0X2hybXBfbWF4X3BhcmFjaGFpbl9pbmJvdW5kX2NoYW5uZWxzBAEMbmV3EAEMdTMyACIESQFTZXRzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBpbmJvdW5kIEhSTVAgY2hhbm5lbHMgYSBwYXJhY2hhaW4gaXMgYWxsb3dlZCB0byBhY2NlcHQuhHNldF9ocm1wX2NoYW5uZWxfbWF4X21lc3NhZ2Vfc2l6ZQQBDG5ldxABDHUzMgAkBD0BU2V0cyB0aGUgbWF4aW11bSBzaXplIG9mIGEgbWVzc2FnZSB0aGF0IGNvdWxkIGV2ZXIgYmUgcHV0IGludG8gYW4gSFJNUCBjaGFubmVsLqBzZXRfaHJtcF9tYXhfcGFyYWNoYWluX291dGJvdW5kX2NoYW5uZWxzBAEMbmV3EAEMdTMyACUERQFTZXRzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBvdXRib3VuZCBIUk1QIGNoYW5uZWxzIGEgcGFyYWNoYWluIGlzIGFsbG93ZWQgdG8gb3Blbi6Yc2V0X2hybXBfbWF4X21lc3NhZ2VfbnVtX3Blcl9jYW5kaWRhdGUEAQxuZXcQAQx1MzIAJwQ1AVNldHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIG91dGJvdW5kIEhSTVAgbWVzc2FnZXMgY2FuIGJlIHNlbnQgYnkgYSBjYW5kaWRhdGUuSHNldF9wdmZfdm90aW5nX3R0bAQBDG5ldxABMFNlc3Npb25JbmRleAAqBFEBU2V0IHRoZSBudW1iZXIgb2Ygc2Vzc2lvbiBjaGFuZ2VzIGFmdGVyIHdoaWNoIGEgUFZGIHByZS1jaGVja2luZyB2b3RpbmcgaXMgcmVqZWN0ZWQukHNldF9taW5pbXVtX3ZhbGlkYXRpb25fdXBncmFkZV9kZWxheQQBDG5ldxABREJsb2NrTnVtYmVyRm9yPFQ+ACsQVQFTZXRzIHRoZSBtaW5pbXVtIGRlbGF5IGJldHdlZW4gYW5ub3VuY2luZyB0aGUgdXBncmFkZSBibG9jayBmb3IgYSBwYXJhY2hhaW4gdW50aWwgdGhlVHVwZ3JhZGUgdGFraW5nIHBsYWNlLgA5AVNlZSB0aGUgZmllbGQgZG9jdW1lbnRhdGlvbiBmb3IgaW5mb3JtYXRpb24gYW5kIGNvbnN0cmFpbnRzIGZvciB0aGUgbmV3IHZhbHVlLnBzZXRfYnlwYXNzX2NvbnNpc3RlbmN5X2NoZWNrBAEMbmV3IAEQYm9vbAAsCE0BU2V0dGluZyB0aGlzIHRvIHRydWUgd2lsbCBkaXNhYmxlIGNvbnNpc3RlbmN5IGNoZWNrcyBmb3IgdGhlIGNvbmZpZ3VyYXRpb24gc2V0dGVycy5EVXNlIHdpdGggY2F1dGlvbi5gc2V0X2FzeW5jX2JhY2tpbmdfcGFyYW1zBAEMbmV3VQQBSEFzeW5jQmFja2luZ1BhcmFtcwAtBKBTZXQgdGhlIGFzeW5jaHJvbm91cyBiYWNraW5nIHBhcmFtZXRlcnMuTHNldF9leGVjdXRvcl9wYXJhbXMEAQxuZXdZBAE4RXhlY3V0b3JQYXJhbXMALgRwU2V0IFBWRiBleGVjdXRvciBwYXJhbWV0ZXJzLlhzZXRfb25fZGVtYW5kX2Jhc2VfZmVlBAEMbmV3GAEcQmFsYW5jZQAvBKRTZXQgdGhlIG9uIGRlbWFuZCAocGFyYXRocmVhZHMpIGJhc2UgZmVlLnRzZXRfb25fZGVtYW5kX2ZlZV92YXJpYWJpbGl0eQQBDG5ld6wBHFBlcmJpbGwAMATAU2V0IHRoZSBvbiBkZW1hbmQgKHBhcmF0aHJlYWRzKSBmZWUgdmFyaWFiaWxpdHkucHNldF9vbl9kZW1hbmRfcXVldWVfbWF4X3NpemUEAQxuZXcQAQx1MzIAMQS8U2V0IHRoZSBvbiBkZW1hbmQgKHBhcmF0aHJlYWRzKSBxdWV1ZSBtYXggc2l6ZS6Yc2V0X29uX2RlbWFuZF90YXJnZXRfcXVldWVfdXRpbGl6YXRpb24EAQxuZXesARxQZXJiaWxsADIEwFNldCB0aGUgb24gZGVtYW5kIChwYXJhdGhyZWFkcykgZmVlIHZhcmlhYmlsaXR5LkRzZXRfb25fZGVtYW5kX3R0bAQBDG5ldxABREJsb2NrTnVtYmVyRm9yPFQ+ADME2FNldCB0aGUgb24gZGVtYW5kIChwYXJhdGhyZWFkcykgdHRsIGluIHRoZSBjbGFpbXF1ZXVlLmRzZXRfbWluaW11bV9iYWNraW5nX3ZvdGVzBAEMbmV3EAEMdTMyADQEoFNldCB0aGUgbWluaW11bSBiYWNraW5nIHZvdGVzIHRocmVzaG9sZC5Ac2V0X25vZGVfZmVhdHVyZQgBFGluZGV4CAEIdTgAARR2YWx1ZSABEGJvb2wANQRkU2V0L1Vuc2V0IGEgbm9kZSBmZWF0dXJlLmhzZXRfYXBwcm92YWxfdm90aW5nX3BhcmFtcwQBDG5ld20EAVBBcHByb3ZhbFZvdGluZ1BhcmFtcwA2BGxTZXQgYXBwcm92YWwtdm90aW5nLXBhcmFtcy5Qc2V0X3NjaGVkdWxlcl9wYXJhbXMEAQxuZXdxBAGIU2NoZWR1bGVyUGFyYW1zPEJsb2NrTnVtYmVyRm9yPFQ+PgA3BFRTZXQgc2NoZWR1bGVyLXBhcmFtcy4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMuVQQQTHBvbGthZG90X3ByaW1pdGl2ZXMIdjc0YXN5bmNfYmFja2luZ0hBc3luY0JhY2tpbmdQYXJhbXMAAAgBTG1heF9jYW5kaWRhdGVfZGVwdGgQAQx1MzIAAVBhbGxvd2VkX2FuY2VzdHJ5X2xlbhABDHUzMgAAWQQQTHBvbGthZG90X3ByaW1pdGl2ZXMIdjc8ZXhlY3V0b3JfcGFyYW1zOEV4ZWN1dG9yUGFyYW1zAAAEAF0EAUhWZWM8RXhlY3V0b3JQYXJhbT4AAF0EAAACYQQAYQQQTHBvbGthZG90X3ByaW1pdGl2ZXMIdjc8ZXhlY3V0b3JfcGFyYW1zNEV4ZWN1dG9yUGFyYW0AARw4TWF4TWVtb3J5UGFnZXMEABABDHUzMgABADxTdGFja0xvZ2ljYWxNYXgEABABDHUzMgACADhTdGFja05hdGl2ZU1heAQAEAEMdTMyAAMAUFByZWNoZWNraW5nTWF4TWVtb3J5BAAwAQx1NjQABAA4UHZmUHJlcFRpbWVvdXQIAGUEASxQdmZQcmVwS2luZAAAMAEMdTY0AAUAOFB2ZkV4ZWNUaW1lb3V0CABpBAEsUHZmRXhlY0tpbmQAADABDHU2NAAGAERXYXNtRXh0QnVsa01lbW9yeQAHAABlBAxMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2NyxQdmZQcmVwS2luZAABCCBQcmVjaGVjawAAABxQcmVwYXJlAAEAAGkEDExwb2xrYWRvdF9wcmltaXRpdmVzCHY3LFB2ZkV4ZWNLaW5kAAEIHEJhY2tpbmcAAAAgQXBwcm92YWwAAQAAbQQMTHBvbGthZG90X3ByaW1pdGl2ZXMIdjdQQXBwcm92YWxWb3RpbmdQYXJhbXMAAAQBbG1heF9hcHByb3ZhbF9jb2FsZXNjZV9jb3VudBABDHUzMgAAcQQMTHBvbGthZG90X3ByaW1pdGl2ZXMgdnN0YWdpbmc8U2NoZWR1bGVyUGFyYW1zBCxCbG9ja051bWJlcgEQACwBYGdyb3VwX3JvdGF0aW9uX2ZyZXF1ZW5jeRABLEJsb2NrTnVtYmVyAAFkcGFyYXNfYXZhaWxhYmlsaXR5X3BlcmlvZBABLEJsb2NrTnVtYmVyAAFcbWF4X3ZhbGlkYXRvcnNfcGVyX2NvcmVhAgEsT3B0aW9uPHUzMj4AASRsb29rYWhlYWQQAQx1MzIAASRudW1fY29yZXMQAQx1MzIAAWRtYXhfYXZhaWxhYmlsaXR5X3RpbWVvdXRzEAEMdTMyAAFgb25fZGVtYW5kX3F1ZXVlX21heF9zaXplEAEMdTMyAAGIb25fZGVtYW5kX3RhcmdldF9xdWV1ZV91dGlsaXphdGlvbqwBHFBlcmJpbGwAAWRvbl9kZW1hbmRfZmVlX3ZhcmlhYmlsaXR5rAEcUGVyYmlsbAABSG9uX2RlbWFuZF9iYXNlX2ZlZRgBHEJhbGFuY2UAAQx0dGwQASxCbG9ja051bWJlcgAAdQQQbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucxhzaGFyZWQYcGFsbGV0EENhbGwEBFQAAQAEDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMueQQQbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucyRpbmNsdXNpb24YcGFsbGV0EENhbGwEBFQAAQAEDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMufQQQbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWluczhwYXJhc19pbmhlcmVudBhwYWxsZXQQQ2FsbAQEVAABBBRlbnRlcgQBEGRhdGGBBAGQUGFyYWNoYWluc0luaGVyZW50RGF0YTxIZWFkZXJGb3I8VD4+AAAEMQFFbnRlciB0aGUgcGFyYXMgaW5oZXJlbnQuIFRoaXMgd2lsbCBwcm9jZXNzIGJpdGZpZWxkcyBhbmQgYmFja2VkIGNhbmRpZGF0ZXMuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLoEEDExwb2xrYWRvdF9wcmltaXRpdmVzCHY3MEluaGVyZW50RGF0YQQMSERSAaEBABABJGJpdGZpZWxkc4UEAZBVbmNoZWNrZWRTaWduZWRBdmFpbGFiaWxpdHlCaXRmaWVsZHMAAURiYWNrZWRfY2FuZGlkYXRlc6EEAXxWZWM8QmFja2VkQ2FuZGlkYXRlPEhEUjo6SGFzaD4+AAEgZGlzcHV0ZXPlBAFgTXVsdGlEaXNwdXRlU3RhdGVtZW50U2V0AAE0cGFyZW50X2hlYWRlcqEBAQxIRFIAAIUEAAACiQQAiQQQTHBvbGthZG90X3ByaW1pdGl2ZXMIdjcYc2lnbmVkPFVuY2hlY2tlZFNpZ25lZAgcUGF5bG9hZAGNBCxSZWFsUGF5bG9hZAGNBAAMARxwYXlsb2FkjQQBHFBheWxvYWQAATx2YWxpZGF0b3JfaW5kZXiZBAE4VmFsaWRhdG9ySW5kZXgAASRzaWduYXR1cmWdBAFIVmFsaWRhdG9yU2lnbmF0dXJlAACNBAxMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2N1BBdmFpbGFiaWxpdHlCaXRmaWVsZAAABACRBAF8Qml0VmVjPHU4LCBiaXR2ZWM6Om9yZGVyOjpMc2IwPgAAkQQAAAcIlQQAlQQMGGJpdHZlYxRvcmRlchBMc2IwAAAAAJkEDExwb2xrYWRvdF9wcmltaXRpdmVzCHY3OFZhbGlkYXRvckluZGV4AAAEABABDHUzMgAAnQQQTHBvbGthZG90X3ByaW1pdGl2ZXMIdjc0dmFsaWRhdG9yX2FwcCRTaWduYXR1cmUAAAQASQIBSHNyMjU1MTk6OlNpZ25hdHVyZQAAoQQAAAKlBAClBAxMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2NzxCYWNrZWRDYW5kaWRhdGUEBEgBNAAMASRjYW5kaWRhdGWpBAFwQ29tbWl0dGVkQ2FuZGlkYXRlUmVjZWlwdDxIPgABOHZhbGlkaXR5X3ZvdGVz3QQBYFZlYzxWYWxpZGl0eUF0dGVzdGF0aW9uPgABRHZhbGlkYXRvcl9pbmRpY2VzkQQBfEJpdFZlYzx1OCwgYml0dmVjOjpvcmRlcjo6THNiMD4AAKkEDExwb2xrYWRvdF9wcmltaXRpdmVzCHY3ZENvbW1pdHRlZENhbmRpZGF0ZVJlY2VpcHQEBEgBNAAIAShkZXNjcmlwdG9yrQQBWENhbmRpZGF0ZURlc2NyaXB0b3I8SD4AASxjb21taXRtZW50c70EAVBDYW5kaWRhdGVDb21taXRtZW50cwAArQQMTHBvbGthZG90X3ByaW1pdGl2ZXMIdjdMQ2FuZGlkYXRlRGVzY3JpcHRvcgQESAE0ACQBHHBhcmFfaWSNAgEISWQAATByZWxheV9wYXJlbnQ0AQRIAAEgY29sbGF0b3KxBAEoQ29sbGF0b3JJZAABeHBlcnNpc3RlZF92YWxpZGF0aW9uX2RhdGFfaGFzaDQBEEhhc2gAASBwb3ZfaGFzaDQBEEhhc2gAATBlcmFzdXJlX3Jvb3Q0ARBIYXNoAAEkc2lnbmF0dXJltQQBRENvbGxhdG9yU2lnbmF0dXJlAAEkcGFyYV9oZWFkNAEQSGFzaAABUHZhbGlkYXRpb25fY29kZV9oYXNouQQBSFZhbGlkYXRpb25Db2RlSGFzaAAAsQQQTHBvbGthZG90X3ByaW1pdGl2ZXMIdjcwY29sbGF0b3JfYXBwGFB1YmxpYwAABAAEATxzcjI1NTE5OjpQdWJsaWMAALUEEExwb2xrYWRvdF9wcmltaXRpdmVzCHY3MGNvbGxhdG9yX2FwcCRTaWduYXR1cmUAAAQASQIBSHNyMjU1MTk6OlNpZ25hdHVyZQAAuQQMdHBvbGthZG90X3BhcmFjaGFpbl9wcmltaXRpdmVzKHByaW1pdGl2ZXNIVmFsaWRhdGlvbkNvZGVIYXNoAAAEADQBEEhhc2gAAL0EDExwb2xrYWRvdF9wcmltaXRpdmVzCHY3UENhbmRpZGF0ZUNvbW1pdG1lbnRzBAROARAAGAE8dXB3YXJkX21lc3NhZ2VzwQQBOFVwd2FyZE1lc3NhZ2VzAAFMaG9yaXpvbnRhbF9tZXNzYWdlc8UEAUhIb3Jpem9udGFsTWVzc2FnZXMAAUxuZXdfdmFsaWRhdGlvbl9jb2Rl0QQBWE9wdGlvbjxWYWxpZGF0aW9uQ29kZT4AASRoZWFkX2RhdGHZBAEgSGVhZERhdGEAAWxwcm9jZXNzZWRfZG93bndhcmRfbWVzc2FnZXMQAQx1MzIAAThocm1wX3dhdGVybWFyaxABBE4AAMEEDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBOARTAAAEAIUBARhWZWM8VD4AAMUEDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQByQQEUwAABADNBAEYVmVjPFQ+AADJBAhgcG9sa2Fkb3RfY29yZV9wcmltaXRpdmVzTE91dGJvdW5kSHJtcE1lc3NhZ2UECElkAY0CAAgBJHJlY2lwaWVudI0CAQhJZAABEGRhdGE4AVBzcF9zdGQ6OnZlYzo6VmVjPHU4PgAAzQQAAALJBADRBAQYT3B0aW9uBARUAdUEAQgQTm9uZQAAABBTb21lBADVBAAAAQAA1QQMdHBvbGthZG90X3BhcmFjaGFpbl9wcmltaXRpdmVzKHByaW1pdGl2ZXM4VmFsaWRhdGlvbkNvZGUAAAQAOAEcVmVjPHU4PgAA2QQMdHBvbGthZG90X3BhcmFjaGFpbl9wcmltaXRpdmVzKHByaW1pdGl2ZXMgSGVhZERhdGEAAAQAOAEcVmVjPHU4PgAA3QQAAALhBADhBAxMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2N0xWYWxpZGl0eUF0dGVzdGF0aW9uAAEIIEltcGxpY2l0BACdBAFIVmFsaWRhdG9yU2lnbmF0dXJlAAEAIEV4cGxpY2l0BACdBAFIVmFsaWRhdG9yU2lnbmF0dXJlAAIAAOUEAAAC6QQA6QQMTHBvbGthZG90X3ByaW1pdGl2ZXMIdjdMRGlzcHV0ZVN0YXRlbWVudFNldAAADAE4Y2FuZGlkYXRlX2hhc2jtBAE0Q2FuZGlkYXRlSGFzaAABHHNlc3Npb24QATBTZXNzaW9uSW5kZXgAAShzdGF0ZW1lbnRz8QQB7FZlYzwoRGlzcHV0ZVN0YXRlbWVudCwgVmFsaWRhdG9ySW5kZXgsIFZhbGlkYXRvclNpZ25hdHVyZSk+AADtBAhgcG9sa2Fkb3RfY29yZV9wcmltaXRpdmVzNENhbmRpZGF0ZUhhc2gAAAQANAEQSGFzaAAA8QQAAAL1BAD1BAAABAz5BJkEnQQA+QQMTHBvbGthZG90X3ByaW1pdGl2ZXMIdjdARGlzcHV0ZVN0YXRlbWVudAABCBRWYWxpZAQA/QQBZFZhbGlkRGlzcHV0ZVN0YXRlbWVudEtpbmQAAAAcSW52YWxpZAQABQUBbEludmFsaWREaXNwdXRlU3RhdGVtZW50S2luZAABAAD9BAxMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2N2RWYWxpZERpc3B1dGVTdGF0ZW1lbnRLaW5kAAEUIEV4cGxpY2l0AAAAPEJhY2tpbmdTZWNvbmRlZAQANAEQSGFzaAABADBCYWNraW5nVmFsaWQEADQBEEhhc2gAAgBAQXBwcm92YWxDaGVja2luZwADAIhBcHByb3ZhbENoZWNraW5nTXVsdGlwbGVDYW5kaWRhdGVzBAABBQFIVmVjPENhbmRpZGF0ZUhhc2g+AAQAAAEFAAAC7QQABQUMTHBvbGthZG90X3ByaW1pdGl2ZXMIdjdsSW52YWxpZERpc3B1dGVTdGF0ZW1lbnRLaW5kAAEEIEV4cGxpY2l0AAAAAAkFEGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMUcGFyYXMYcGFsbGV0EENhbGwEBFQAASRYZm9yY2Vfc2V0X2N1cnJlbnRfY29kZQgBEHBhcmGNAgEYUGFyYUlkAAEgbmV3X2NvZGXVBAE4VmFsaWRhdGlvbkNvZGUAAAT4U2V0IHRoZSBzdG9yYWdlIGZvciB0aGUgcGFyYWNoYWluIHZhbGlkYXRpb24gY29kZSBpbW1lZGlhdGVseS5YZm9yY2Vfc2V0X2N1cnJlbnRfaGVhZAgBEHBhcmGNAgEYUGFyYUlkAAEgbmV3X2hlYWTZBAEgSGVhZERhdGEAAQQBAVNldCB0aGUgc3RvcmFnZSBmb3IgdGhlIGN1cnJlbnQgcGFyYWNoYWluIGhlYWQgZGF0YSBpbW1lZGlhdGVseS5sZm9yY2Vfc2NoZWR1bGVfY29kZV91cGdyYWRlDAEQcGFyYY0CARhQYXJhSWQAASBuZXdfY29kZdUEAThWYWxpZGF0aW9uQ29kZQABTHJlbGF5X3BhcmVudF9udW1iZXIQAURCbG9ja051bWJlckZvcjxUPgACBC0BU2NoZWR1bGUgYW4gdXBncmFkZSBhcyBpZiBpdCB3YXMgc2NoZWR1bGVkIGluIHRoZSBnaXZlbiByZWxheSBwYXJlbnQgYmxvY2suTGZvcmNlX25vdGVfbmV3X2hlYWQIARBwYXJhjQIBGFBhcmFJZAABIG5ld19oZWFk2QQBIEhlYWREYXRhAAMEHQFOb3RlIGEgbmV3IGJsb2NrIGhlYWQgZm9yIHBhcmEgd2l0aGluIHRoZSBjb250ZXh0IG9mIHRoZSBjdXJyZW50IGJsb2NrLkhmb3JjZV9xdWV1ZV9hY3Rpb24EARBwYXJhjQIBGFBhcmFJZAAEDPhQdXQgYSBwYXJhY2hhaW4gZGlyZWN0bHkgaW50byB0aGUgbmV4dCBzZXNzaW9uJ3MgYWN0aW9uIHF1ZXVlLvRXZSBjYW4ndCBxdWV1ZSBpdCBhbnkgc29vbmVyIHRoYW4gdGhpcyB3aXRob3V0IGdvaW5nIGludG8gdGhlOGluaXRpYWxpemVyLi4ubGFkZF90cnVzdGVkX3ZhbGlkYXRpb25fY29kZQQBPHZhbGlkYXRpb25fY29kZdUEAThWYWxpZGF0aW9uQ29kZQAFOKBBZGRzIHRoZSB2YWxpZGF0aW9uIGNvZGUgdG8gdGhlIHN0b3JhZ2UuAFkBVGhlIGNvZGUgd2lsbCBub3QgYmUgYWRkZWQgaWYgaXQgaXMgYWxyZWFkeSBwcmVzZW50LiBBZGRpdGlvbmFsbHksIGlmIFBWRiBwcmUtY2hlY2tpbmfgaXMgcnVubmluZyBmb3IgdGhhdCBjb2RlLCBpdCB3aWxsIGJlIGluc3RhbnRseSBhY2NlcHRlZC4AUQFPdGhlcndpc2UsIHRoZSBjb2RlIHdpbGwgYmUgYWRkZWQgaW50byB0aGUgc3RvcmFnZS4gTm90ZSB0aGF0IHRoZSBjb2RlIHdpbGwgYmUgYWRkZWRhAWludG8gc3RvcmFnZSB3aXRoIHJlZmVyZW5jZSBjb3VudCAwLiBUaGlzIGlzIHRvIGFjY291bnQgdGhlIGZhY3QgdGhhdCB0aGVyZSBhcmUgbm8gdXNlcnNNAWZvciB0aGlzIGNvZGUgeWV0LiBUaGUgY2FsbGVyIHdpbGwgaGF2ZSB0byBtYWtlIHN1cmUgdGhhdCB0aGlzIGNvZGUgZXZlbnR1YWxseSBnZXRzSQF1c2VkIGJ5IHNvbWUgcGFyYWNoYWluIG9yIHJlbW92ZWQgZnJvbSB0aGUgc3RvcmFnZSB0byBhdm9pZCBzdG9yYWdlIGxlYWtzLiBGb3IgdGhlSQFsYXR0ZXIgcHJlZmVyIHRvIHVzZSB0aGUgYHBva2VfdW51c2VkX3ZhbGlkYXRpb25fY29kZWAgZGlzcGF0Y2hhYmxlIHRvIHJhdyBzdG9yYWdlNG1hbmlwdWxhdGlvbi4AUQFUaGlzIGZ1bmN0aW9uIGlzIG1haW5seSBtZWFudCB0byBiZSB1c2VkIGZvciB1cGdyYWRpbmcgcGFyYWNoYWlucyB0aGF0IGRvIG5vdCBmb2xsb3cJAXRoZSBnby1haGVhZCBzaWduYWwgd2hpbGUgdGhlIFBWRiBwcmUtY2hlY2tpbmcgZmVhdHVyZSBpcyBlbmFibGVkLmxwb2tlX3VudXNlZF92YWxpZGF0aW9uX2NvZGUEAVB2YWxpZGF0aW9uX2NvZGVfaGFzaLkEAUhWYWxpZGF0aW9uQ29kZUhhc2gABhQlAVJlbW92ZSB0aGUgdmFsaWRhdGlvbiBjb2RlIGZyb20gdGhlIHN0b3JhZ2UgaWZmIHRoZSByZWZlcmVuY2UgY291bnQgaXMgMC4AWQFUaGlzIGlzIGJldHRlciB0aGFuIHJlbW92aW5nIHRoZSBzdG9yYWdlIGRpcmVjdGx5LCBiZWNhdXNlIGl0IHdpbGwgbm90IHJlbW92ZSB0aGUgY29kZUEBdGhhdCB3YXMgc3VkZGVubHkgZ290IHVzZWQgYnkgc29tZSBwYXJhY2hhaW4gd2hpbGUgdGhpcyBkaXNwYXRjaGFibGUgd2FzIHBlbmRpbmcwZGlzcGF0Y2hpbmcubGluY2x1ZGVfcHZmX2NoZWNrX3N0YXRlbWVudAgBEHN0bXQNBQFEUHZmQ2hlY2tTdGF0ZW1lbnQAASRzaWduYXR1cmWdBAFIVmFsaWRhdG9yU2lnbmF0dXJlAAcIVQFJbmNsdWRlcyBhIHN0YXRlbWVudCBmb3IgYSBQVkYgcHJlLWNoZWNraW5nIHZvdGUuIFBvdGVudGlhbGx5LCBmaW5hbGl6ZXMgdGhlIHZvdGUgYW5kQQFlbmFjdHMgdGhlIHJlc3VsdHMgaWYgdGhhdCB3YXMgdGhlIGxhc3Qgdm90ZSBiZWZvcmUgYWNoaWV2aW5nIHRoZSBzdXBlcm1ham9yaXR5LnRmb3JjZV9zZXRfbW9zdF9yZWNlbnRfY29udGV4dAgBEHBhcmGNAgEYUGFyYUlkAAEcY29udGV4dBABREJsb2NrTnVtYmVyRm9yPFQ+AAgEAQFTZXQgdGhlIHN0b3JhZ2UgZm9yIHRoZSBjdXJyZW50IHBhcmFjaGFpbiBoZWFkIGRhdGEgaW1tZWRpYXRlbHkuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLg0FDExwb2xrYWRvdF9wcmltaXRpdmVzCHY3RFB2ZkNoZWNrU3RhdGVtZW50AAAQARhhY2NlcHQgARBib29sAAEcc3ViamVjdLkEAUhWYWxpZGF0aW9uQ29kZUhhc2gAATRzZXNzaW9uX2luZGV4EAEwU2Vzc2lvbkluZGV4AAE8dmFsaWRhdG9yX2luZGV4mQQBOFZhbGlkYXRvckluZGV4AAARBRBscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zLGluaXRpYWxpemVyGHBhbGxldBBDYWxsBARUAAEENGZvcmNlX2FwcHJvdmUEARR1cF90bxABLEJsb2NrTnVtYmVyAAAMOQFJc3N1ZSBhIHNpZ25hbCB0byB0aGUgY29uc2Vuc3VzIGVuZ2luZSB0byBmb3JjaWJseSBhY3QgYXMgdGhvdWdoIGFsbCBwYXJhY2hhaW5RAWJsb2NrcyBpbiBhbGwgcmVsYXkgY2hhaW4gYmxvY2tzIHVwIHRvIGFuZCBpbmNsdWRpbmcgdGhlIGdpdmVuIG51bWJlciBpbiB0aGUgY3VycmVudKBjaGFpbiBhcmUgdmFsaWQgYW5kIHNob3VsZCBiZSBmaW5hbGl6ZWQuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLhUFEGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMQaHJtcBhwYWxsZXQQQ2FsbAQEVAABLFhocm1wX2luaXRfb3Blbl9jaGFubmVsDAEkcmVjaXBpZW50jQIBGFBhcmFJZAABVHByb3Bvc2VkX21heF9jYXBhY2l0eRABDHUzMgABZHByb3Bvc2VkX21heF9tZXNzYWdlX3NpemUQAQx1MzIAAChNAUluaXRpYXRlIG9wZW5pbmcgYSBjaGFubmVsIGZyb20gYSBwYXJhY2hhaW4gdG8gYSBnaXZlbiByZWNpcGllbnQgd2l0aCBnaXZlbiBjaGFubmVsLHBhcmFtZXRlcnMuAFkBLSBgcHJvcG9zZWRfbWF4X2NhcGFjaXR5YCAtIHNwZWNpZmllcyBob3cgbWFueSBtZXNzYWdlcyBjYW4gYmUgaW4gdGhlIGNoYW5uZWwgYXQgb25jZS4tAS0gYHByb3Bvc2VkX21heF9tZXNzYWdlX3NpemVgIC0gc3BlY2lmaWVzIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIG1lc3NhZ2VzLgARAVRoZXNlIG51bWJlcnMgYXJlIGEgc3ViamVjdCB0byB0aGUgcmVsYXktY2hhaW4gY29uZmlndXJhdGlvbiBsaW1pdHMuAFEBVGhlIGNoYW5uZWwgY2FuIGJlIG9wZW5lZCBvbmx5IGFmdGVyIHRoZSByZWNpcGllbnQgY29uZmlybXMgaXQgYW5kIG9ubHkgb24gYSBzZXNzaW9uHGNoYW5nZS5gaHJtcF9hY2NlcHRfb3Blbl9jaGFubmVsBAEYc2VuZGVyjQIBGFBhcmFJZAABDPBBY2NlcHQgYSBwZW5kaW5nIG9wZW4gY2hhbm5lbCByZXF1ZXN0IGZyb20gdGhlIGdpdmVuIHNlbmRlci4A9FRoZSBjaGFubmVsIHdpbGwgYmUgb3BlbmVkIG9ubHkgb24gdGhlIG5leHQgc2Vzc2lvbiBib3VuZGFyeS5IaHJtcF9jbG9zZV9jaGFubmVsBAEoY2hhbm5lbF9pZBkFATRIcm1wQ2hhbm5lbElkAAIQVQFJbml0aWF0ZSB1bmlsYXRlcmFsIGNsb3Npbmcgb2YgYSBjaGFubmVsLiBUaGUgb3JpZ2luIG11c3QgYmUgZWl0aGVyIHRoZSBzZW5kZXIgb3IgdGhlmHJlY2lwaWVudCBpbiB0aGUgY2hhbm5lbCBiZWluZyBjbG9zZWQuAMBUaGUgY2xvc3VyZSBjYW4gb25seSBoYXBwZW4gb24gYSBzZXNzaW9uIGNoYW5nZS5AZm9yY2VfY2xlYW5faHJtcAwBEHBhcmGNAgEYUGFyYUlkAAEsbnVtX2luYm91bmQQAQx1MzIAATBudW1fb3V0Ym91bmQQAQx1MzIAAxxdAVRoaXMgZXh0cmluc2ljIHRyaWdnZXJzIHRoZSBjbGVhbnVwIG9mIGFsbCB0aGUgSFJNUCBzdG9yYWdlIGl0ZW1zIHRoYXQgYSBwYXJhIG1heSBoYXZlLkkBTm9ybWFsbHkgdGhpcyBoYXBwZW5zIG9uY2UgcGVyIHNlc3Npb24sIGJ1dCB0aGlzIGFsbG93cyB5b3UgdG8gdHJpZ2dlciB0aGUgY2xlYW51cJRpbW1lZGlhdGVseSBmb3IgYSBzcGVjaWZpYyBwYXJhY2hhaW4uAFEBTnVtYmVyIG9mIGluYm91bmQgYW5kIG91dGJvdW5kIGNoYW5uZWxzIGZvciBgcGFyYWAgbXVzdCBiZSBwcm92aWRlZCBhcyB3aXRuZXNzIGRhdGEuAJBPcmlnaW4gbXVzdCBiZSB0aGUgYENoYW5uZWxNYW5hZ2VyYC5cZm9yY2VfcHJvY2Vzc19ocm1wX29wZW4EASBjaGFubmVscxABDHUzMgAEIKRGb3JjZSBwcm9jZXNzIEhSTVAgb3BlbiBjaGFubmVsIHJlcXVlc3RzLgBVAUlmIHRoZXJlIGFyZSBwZW5kaW5nIEhSTVAgb3BlbiBjaGFubmVsIHJlcXVlc3RzLCB5b3UgY2FuIHVzZSB0aGlzIGZ1bmN0aW9uIHRvIHByb2Nlc3OIYWxsIG9mIHRob3NlIHJlcXVlc3RzIGltbWVkaWF0ZWx5LgAJAVRvdGFsIG51bWJlciBvZiBvcGVuaW5nIGNoYW5uZWxzIG11c3QgYmUgcHJvdmlkZWQgYXMgd2l0bmVzcyBkYXRhLgCQT3JpZ2luIG11c3QgYmUgdGhlIGBDaGFubmVsTWFuYWdlcmAuYGZvcmNlX3Byb2Nlc3NfaHJtcF9jbG9zZQQBIGNoYW5uZWxzEAEMdTMyAAUgqEZvcmNlIHByb2Nlc3MgSFJNUCBjbG9zZSBjaGFubmVsIHJlcXVlc3RzLgBZAUlmIHRoZXJlIGFyZSBwZW5kaW5nIEhSTVAgY2xvc2UgY2hhbm5lbCByZXF1ZXN0cywgeW91IGNhbiB1c2UgdGhpcyBmdW5jdGlvbiB0byBwcm9jZXNziGFsbCBvZiB0aG9zZSByZXF1ZXN0cyBpbW1lZGlhdGVseS4ACQFUb3RhbCBudW1iZXIgb2YgY2xvc2luZyBjaGFubmVscyBtdXN0IGJlIHByb3ZpZGVkIGFzIHdpdG5lc3MgZGF0YS4AkE9yaWdpbiBtdXN0IGJlIHRoZSBgQ2hhbm5lbE1hbmFnZXJgLmBocm1wX2NhbmNlbF9vcGVuX3JlcXVlc3QIAShjaGFubmVsX2lkGQUBNEhybXBDaGFubmVsSWQAATRvcGVuX3JlcXVlc3RzEAEMdTMyAAYgXQFUaGlzIGNhbmNlbHMgYSBwZW5kaW5nIG9wZW4gY2hhbm5lbCByZXF1ZXN0LiBJdCBjYW4gYmUgY2FuY2VsZWQgYnkgZWl0aGVyIG9mIHRoZSBzZW5kZXIZAW9yIHRoZSByZWNpcGllbnQgZm9yIHRoYXQgcmVxdWVzdC4gVGhlIG9yaWdpbiBtdXN0IGJlIGVpdGhlciBvZiB0aG9zZS4AXQFUaGUgY2FuY2VsbGF0aW9uIGhhcHBlbnMgaW1tZWRpYXRlbHkuIEl0IGlzIG5vdCBwb3NzaWJsZSB0byBjYW5jZWwgdGhlIHJlcXVlc3QgaWYgaXQgaXNEYWxyZWFkeSBhY2NlcHRlZC4AWQFUb3RhbCBudW1iZXIgb2Ygb3BlbiByZXF1ZXN0cyAoaS5lLiBgSHJtcE9wZW5DaGFubmVsUmVxdWVzdHNMaXN0YCkgbXVzdCBiZSBwcm92aWRlZCBhczR3aXRuZXNzIGRhdGEuXGZvcmNlX29wZW5faHJtcF9jaGFubmVsEAEYc2VuZGVyjQIBGFBhcmFJZAABJHJlY2lwaWVudI0CARhQYXJhSWQAATBtYXhfY2FwYWNpdHkQAQx1MzIAAUBtYXhfbWVzc2FnZV9zaXplEAEMdTMyAAcgYQFPcGVuIGEgY2hhbm5lbCBmcm9tIGEgYHNlbmRlcmAgdG8gYSBgcmVjaXBpZW50YCBgUGFyYUlkYC4gQWx0aG91Z2ggb3BlbmVkIGJ5IGdvdmVybmFuY2UsQQF0aGUgYG1heF9jYXBhY2l0eWAgYW5kIGBtYXhfbWVzc2FnZV9zaXplYCBhcmUgc3RpbGwgc3ViamVjdCB0byB0aGUgUmVsYXkgQ2hhaW4nc0hjb25maWd1cmVkIGxpbWl0cy4ATQFFeHBlY3RlZCB1c2UgaXMgd2hlbiBvbmUgKGFuZCBvbmx5IG9uZSkgb2YgdGhlIGBQYXJhSWRgcyBpbnZvbHZlZCBpbiB0aGUgY2hhbm5lbCBpc8Bnb3Zlcm5lZCBieSB0aGUgc3lzdGVtLCBlLmcuIGEgc3lzdGVtIHBhcmFjaGFpbi4AkE9yaWdpbiBtdXN0IGJlIHRoZSBgQ2hhbm5lbE1hbmFnZXJgLmBlc3RhYmxpc2hfc3lzdGVtX2NoYW5uZWwIARhzZW5kZXKNAgEYUGFyYUlkAAEkcmVjaXBpZW50jQIBGFBhcmFJZAAIMFEBRXN0YWJsaXNoIGFuIEhSTVAgY2hhbm5lbCBiZXR3ZWVuIHR3byBzeXN0ZW0gY2hhaW5zLiBJZiB0aGUgY2hhbm5lbCBkb2VzIG5vdCBhbHJlYWR5UQFleGlzdCwgdGhlIHRyYW5zYWN0aW9uIGZlZXMgd2lsbCBiZSByZWZ1bmRlZCB0byB0aGUgY2FsbGVyLiBUaGUgc3lzdGVtIGRvZXMgbm90IHRha2VZAWRlcG9zaXRzIGZvciBjaGFubmVscyBiZXR3ZWVuIHN5c3RlbSBjaGFpbnMsIGFuZCBhdXRvbWF0aWNhbGx5IHNldHMgdGhlIG1lc3NhZ2UgbnVtYmVyGQFhbmQgc2l6ZSBsaW1pdHMgdG8gdGhlIG1heGltdW0gYWxsb3dlZCBieSB0aGUgbmV0d29yaydzIGNvbmZpZ3VyYXRpb24uAChBcmd1bWVudHM6AJQtIGBzZW5kZXJgOiBBIHN5c3RlbSBjaGFpbiwgYFBhcmFJZGAuoC0gYHJlY2lwaWVudGA6IEEgc3lzdGVtIGNoYWluLCBgUGFyYUlkYC4AVQFBbnkgc2lnbmVkIG9yaWdpbiBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uLCBidXQgX2JvdGhfIGlucHV0cyBNVVNUIGJlIHN5c3RlbSBjaGFpbnMuIElmwHRoZSBjaGFubmVsIGRvZXMgbm90IGV4aXN0IHlldCwgdGhlcmUgaXMgbm8gZmVlLlRwb2tlX2NoYW5uZWxfZGVwb3NpdHMIARhzZW5kZXKNAgEYUGFyYUlkAAEkcmVjaXBpZW50jQIBGFBhcmFJZAAJJFEBVXBkYXRlIHRoZSBkZXBvc2l0cyBoZWxkIGZvciBhbiBIUk1QIGNoYW5uZWwgdG8gdGhlIGxhdGVzdCBgQ29uZmlndXJhdGlvbmAuIENoYW5uZWxzsHdpdGggc3lzdGVtIGNoYWlucyBkbyBub3QgcmVxdWlyZSBhIGRlcG9zaXQuAChBcmd1bWVudHM6AHgtIGBzZW5kZXJgOiBBIGNoYWluLCBgUGFyYUlkYC6ELSBgcmVjaXBpZW50YDogQSBjaGFpbiwgYFBhcmFJZGAuAKRBbnkgc2lnbmVkIG9yaWdpbiBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uLnRlc3RhYmxpc2hfY2hhbm5lbF93aXRoX3N5c3RlbQQBTHRhcmdldF9zeXN0ZW1fY2hhaW6NAgEYUGFyYUlkAAocOQFFc3RhYmxpc2ggYSBiaWRpcmVjdGlvbmFsIEhSTVAgY2hhbm5lbCBiZXR3ZWVuIGEgcGFyYWNoYWluIGFuZCBhIHN5c3RlbSBjaGFpbi4AKEFyZ3VtZW50czoAyC0gYHRhcmdldF9zeXN0ZW1fY2hhaW5gOiBBIHN5c3RlbSBjaGFpbiwgYFBhcmFJZGAuALBUaGUgb3JpZ2luIG5lZWRzIHRvIGJlIHRoZSBwYXJhY2hhaW4gb3JpZ2luLgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy4ZBQx0cG9sa2Fkb3RfcGFyYWNoYWluX3ByaW1pdGl2ZXMocHJpbWl0aXZlczRIcm1wQ2hhbm5lbElkAAAIARhzZW5kZXKNAgEISWQAASRyZWNpcGllbnSNAgEISWQAAB0FEGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMgZGlzcHV0ZXMYcGFsbGV0EENhbGwEBFQAAQQ4Zm9yY2VfdW5mcmVlemUAAAAEDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMuIQUUbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucyBkaXNwdXRlcyBzbGFzaGluZxhwYWxsZXQQQ2FsbAQEVAABBHByZXBvcnRfZGlzcHV0ZV9sb3N0X3Vuc2lnbmVkCAE0ZGlzcHV0ZV9wcm9vZiUFAURCb3g8RGlzcHV0ZVByb29mPgABPGtleV9vd25lcl9wcm9vZq0BAUBUOjpLZXlPd25lclByb29mAAAABA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLiUFEExwb2xrYWRvdF9wcmltaXRpdmVzCHY3IHNsYXNoaW5nMERpc3B1dGVQcm9vZgAAEAEkdGltZV9zbG90KQUBQERpc3B1dGVzVGltZVNsb3QAARBraW5kLQUBTFNsYXNoaW5nT2ZmZW5jZUtpbmQAATx2YWxpZGF0b3JfaW5kZXiZBAE4VmFsaWRhdG9ySW5kZXgAATB2YWxpZGF0b3JfaWQdAgEsVmFsaWRhdG9ySWQAACkFEExwb2xrYWRvdF9wcmltaXRpdmVzCHY3IHNsYXNoaW5nQERpc3B1dGVzVGltZVNsb3QAAAgBNHNlc3Npb25faW5kZXgQATBTZXNzaW9uSW5kZXgAAThjYW5kaWRhdGVfaGFzaO0EATRDYW5kaWRhdGVIYXNoAAAtBRBMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2NyBzbGFzaGluZ0xTbGFzaGluZ09mZmVuY2VLaW5kAAEIKEZvckludmFsaWQAAAAwQWdhaW5zdFZhbGlkAAEAADEFEGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnNIYXNzaWduZXJfb25fZGVtYW5kGHBhbGxldBBDYWxsBARUAAEIXHBsYWNlX29yZGVyX2FsbG93X2RlYXRoCAEobWF4X2Ftb3VudBgBMEJhbGFuY2VPZjxUPgABHHBhcmFfaWSNAgEYUGFyYUlkAAA8lENyZWF0ZSBhIHNpbmdsZSBvbiBkZW1hbmQgY29yZSBvcmRlci5JAVdpbGwgdXNlIHRoZSBzcG90IHByaWNlIGZvciB0aGUgY3VycmVudCBibG9jayBhbmQgd2lsbCByZWFwIHRoZSBhY2NvdW50IGlmIG5lZWRlZC4ALFBhcmFtZXRlcnM6OQEtIGBvcmlnaW5gOiBUaGUgc2VuZGVyIG9mIHRoZSBjYWxsLCBmdW5kcyB3aWxsIGJlIHdpdGhkcmF3biBmcm9tIHRoaXMgYWNjb3VudC5JAS0gYG1heF9hbW91bnRgOiBUaGUgbWF4aW11bSBiYWxhbmNlIHRvIHdpdGhkcmF3IGZyb20gdGhlIG9yaWdpbiB0byBwbGFjZSBhbiBvcmRlci4NAS0gYHBhcmFfaWRgOiBBIGBQYXJhSWRgIHRoZSBvcmlnaW4gd2FudHMgdG8gcHJvdmlkZSBibG9ja3NwYWNlIGZvci4AHEVycm9yczrkLSBgSW5zdWZmaWNpZW50QmFsYW5jZWA6IGZyb20gdGhlIEN1cnJlbmN5IGltcGxlbWVudGF0aW9uNC0gYFF1ZXVlRnVsbGCALSBgU3BvdFByaWNlSGlnaGVyVGhhbk1heEFtb3VudGAAHEV2ZW50czpcLSBgT25EZW1hbmRPcmRlclBsYWNlZGBYcGxhY2Vfb3JkZXJfa2VlcF9hbGl2ZQgBKG1heF9hbW91bnQYATBCYWxhbmNlT2Y8VD4AARxwYXJhX2lkjQIBGFBhcmFJZAABPGEBU2FtZSBhcyB0aGUgW2BwbGFjZV9vcmRlcl9hbGxvd19kZWF0aGBdKFNlbGY6OnBsYWNlX29yZGVyX2FsbG93X2RlYXRoKSBjYWxsICwgYnV0IHdpdGggYdxjaGVjayB0aGF0IHBsYWNpbmcgdGhlIG9yZGVyIHdpbGwgbm90IHJlYXAgdGhlIGFjY291bnQuACxQYXJhbWV0ZXJzOjkBLSBgb3JpZ2luYDogVGhlIHNlbmRlciBvZiB0aGUgY2FsbCwgZnVuZHMgd2lsbCBiZSB3aXRoZHJhd24gZnJvbSB0aGlzIGFjY291bnQuSQEtIGBtYXhfYW1vdW50YDogVGhlIG1heGltdW0gYmFsYW5jZSB0byB3aXRoZHJhdyBmcm9tIHRoZSBvcmlnaW4gdG8gcGxhY2UgYW4gb3JkZXIuDQEtIGBwYXJhX2lkYDogQSBgUGFyYUlkYCB0aGUgb3JpZ2luIHdhbnRzIHRvIHByb3ZpZGUgYmxvY2tzcGFjZSBmb3IuABxFcnJvcnM65C0gYEluc3VmZmljaWVudEJhbGFuY2VgOiBmcm9tIHRoZSBDdXJyZW5jeSBpbXBsZW1lbnRhdGlvbjQtIGBRdWV1ZUZ1bGxggC0gYFNwb3RQcmljZUhpZ2hlclRoYW5NYXhBbW91bnRgABxFdmVudHM6XC0gYE9uRGVtYW5kT3JkZXJQbGFjZWRgBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLjUFEFxwb2xrYWRvdF9ydW50aW1lX2NvbW1vbjxwYXJhc19yZWdpc3RyYXIYcGFsbGV0EENhbGwEBFQAASQgcmVnaXN0ZXIMAQhpZI0CARhQYXJhSWQAATBnZW5lc2lzX2hlYWTZBAEgSGVhZERhdGEAATx2YWxpZGF0aW9uX2NvZGXVBAE4VmFsaWRhdGlvbkNvZGUAAFD4UmVnaXN0ZXIgaGVhZCBkYXRhIGFuZCB2YWxpZGF0aW9uIGNvZGUgZm9yIGEgcmVzZXJ2ZWQgUGFyYSBJZC4AMCMjIEFyZ3VtZW50c8AtIGBvcmlnaW5gOiBNdXN0IGJlIGNhbGxlZCBieSBhIGBTaWduZWRgIG9yaWdpbi4tAS0gYGlkYDogVGhlIHBhcmEgSUQuIE11c3QgYmUgb3duZWQvbWFuYWdlZCBieSB0aGUgYG9yaWdpbmAgc2lnbmluZyBhY2NvdW50LgEBLSBgZ2VuZXNpc19oZWFkYDogVGhlIGdlbmVzaXMgaGVhZCBkYXRhIG9mIHRoZSBwYXJhY2hhaW4vdGhyZWFkLiUBLSBgdmFsaWRhdGlvbl9jb2RlYDogVGhlIGluaXRpYWwgdmFsaWRhdGlvbiBjb2RlIG9mIHRoZSBwYXJhY2hhaW4vdGhyZWFkLgBAIyMgRGVwb3NpdHMvRmVlcwkBVGhlIGFjY291bnQgd2l0aCB0aGUgb3JpZ2luYXRpbmcgc2lnbmF0dXJlIG11c3QgcmVzZXJ2ZSBhIGRlcG9zaXQuAE0BVGhlIGRlcG9zaXQgaXMgcmVxdWlyZWQgdG8gY292ZXIgdGhlIGNvc3RzIGFzc29jaWF0ZWQgd2l0aCBzdG9yaW5nIHRoZSBnZW5lc2lzIGhlYWR0ZGF0YSBhbmQgdGhlIHZhbGlkYXRpb24gY29kZS4xAVRoaXMgYWNjb3VudHMgZm9yIHRoZSBwb3RlbnRpYWwgdG8gc3RvcmUgdmFsaWRhdGlvbiBjb2RlIG9mIGEgc2l6ZSB1cCB0byB0aGXcYG1heF9jb2RlX3NpemVgLCBhcyBkZWZpbmVkIGluIHRoZSBjb25maWd1cmF0aW9uIHBhbGxldAAdAUFueXRoaW5nIGFscmVhZHkgcmVzZXJ2ZWQgcHJldmlvdXNseSBmb3IgdGhpcyBwYXJhIElEIGlzIGFjY291bnRlZCBmb3IuACQjIyBFdmVudHPUVGhlIGBSZWdpc3RlcmVkYCBldmVudCBpcyBlbWl0dGVkIGluIGNhc2Ugb2Ygc3VjY2Vzcy44Zm9yY2VfcmVnaXN0ZXIUAQx3aG8AATBUOjpBY2NvdW50SWQAARxkZXBvc2l0GAEwQmFsYW5jZU9mPFQ+AAEIaWSNAgEYUGFyYUlkAAEwZ2VuZXNpc19oZWFk2QQBIEhlYWREYXRhAAE8dmFsaWRhdGlvbl9jb2Rl1QQBOFZhbGlkYXRpb25Db2RlAAEY3EZvcmNlIHRoZSByZWdpc3RyYXRpb24gb2YgYSBQYXJhIElkIG9uIHRoZSByZWxheSBjaGFpbi4AuFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgYnkgYSBSb290IG9yaWdpbi4AGQFUaGUgZGVwb3NpdCB0YWtlbiBjYW4gYmUgc3BlY2lmaWVkIGZvciB0aGlzIHJlZ2lzdHJhdGlvbi4gQW55IGBQYXJhSWRgGQFjYW4gYmUgcmVnaXN0ZXJlZCwgaW5jbHVkaW5nIHN1Yi0xMDAwIElEcyB3aGljaCBhcmUgU3lzdGVtIFBhcmFjaGFpbnMuKGRlcmVnaXN0ZXIEAQhpZI0CARhQYXJhSWQAAhAFAURlcmVnaXN0ZXIgYSBQYXJhIElkLCBmcmVlaW5nIGFsbCBkYXRhIGFuZCByZXR1cm5pbmcgYW55IGRlcG9zaXQuAFEBVGhlIGNhbGxlciBtdXN0IGJlIFJvb3QsIHRoZSBgcGFyYWAgb3duZXIsIG9yIHRoZSBgcGFyYWAgaXRzZWxmLiBUaGUgcGFyYSBtdXN0IGJlIGFuUG9uLWRlbWFuZCBwYXJhY2hhaW4uEHN3YXAIAQhpZI0CARhQYXJhSWQAARRvdGhlco0CARhQYXJhSWQAAzBBAVN3YXAgYSBsZWFzZSBob2xkaW5nIHBhcmFjaGFpbiB3aXRoIGFub3RoZXIgcGFyYWNoYWluLCBlaXRoZXIgb24tZGVtYW5kIG9yIGxlYXNlIGhvbGRpbmcuAAEBVGhlIG9yaWdpbiBtdXN0IGJlIFJvb3QsIHRoZSBgcGFyYWAgb3duZXIsIG9yIHRoZSBgcGFyYWAgaXRzZWxmLgBhAVRoZSBzd2FwIHdpbGwgaGFwcGVuIG9ubHkgaWYgdGhlcmUgaXMgYWxyZWFkeSBhbiBvcHBvc2l0ZSBzd2FwIHBlbmRpbmcuIElmIHRoZXJlIGlzIG5vdCxZAXRoZSBzd2FwIHdpbGwgYmUgc3RvcmVkIGluIHRoZSBwZW5kaW5nIHN3YXBzIG1hcCwgcmVhZHkgZm9yIGEgbGF0ZXIgY29uZmlybWF0b3J5IHN3YXAuAF0BVGhlIGBQYXJhSWRgcyByZW1haW4gbWFwcGVkIHRvIHRoZSBzYW1lIGhlYWQgZGF0YSBhbmQgY29kZSBzbyBleHRlcm5hbCBjb2RlIGNhbiByZWx5IG9uPQFgUGFyYUlkYCB0byBiZSBhIGxvbmctdGVybSBpZGVudGlmaWVyIG9mIGEgbm90aW9uYWwgInBhcmFjaGFpbiIuIEhvd2V2ZXIsIHRoZWlyNQFzY2hlZHVsaW5nIGluZm8gKGkuZS4gd2hldGhlciB0aGV5J3JlIGFuIG9uLWRlbWFuZCBwYXJhY2hhaW4gb3IgbGVhc2UgaG9sZGluZxUBcGFyYWNoYWluKSwgYXVjdGlvbiBpbmZvcm1hdGlvbiBhbmQgdGhlIGF1Y3Rpb24gZGVwb3NpdCBhcmUgc3dpdGNoZWQuLHJlbW92ZV9sb2NrBAEQcGFyYY0CARhQYXJhSWQABBANAVJlbW92ZSBhIG1hbmFnZXIgbG9jayBmcm9tIGEgcGFyYS4gVGhpcyB3aWxsIGFsbG93IHRoZSBtYW5hZ2VyIG9mIGE1AXByZXZpb3VzbHkgbG9ja2VkIHBhcmEgdG8gZGVyZWdpc3RlciBvciBzd2FwIGEgcGFyYSB3aXRob3V0IHVzaW5nIGdvdmVybmFuY2UuANxDYW4gb25seSBiZSBjYWxsZWQgYnkgdGhlIFJvb3Qgb3JpZ2luIG9yIHRoZSBwYXJhY2hhaW4uHHJlc2VydmUABUSUUmVzZXJ2ZSBhIFBhcmEgSWQgb24gdGhlIHJlbGF5IGNoYWluLgBNAVRoaXMgZnVuY3Rpb24gd2lsbCByZXNlcnZlIGEgbmV3IFBhcmEgSWQgdG8gYmUgb3duZWQvbWFuYWdlZCBieSB0aGUgb3JpZ2luIGFjY291bnQuYQFUaGUgb3JpZ2luIGFjY291bnQgaXMgYWJsZSB0byByZWdpc3RlciBoZWFkIGRhdGEgYW5kIHZhbGlkYXRpb24gY29kZSB1c2luZyBgcmVnaXN0ZXJgIHRvWQFjcmVhdGUgYW4gb24tZGVtYW5kIHBhcmFjaGFpbi4gVXNpbmcgdGhlIFNsb3RzIHBhbGxldCwgYW4gb24tZGVtYW5kIHBhcmFjaGFpbiBjYW4gdGhlbqRiZSB1cGdyYWRlZCB0byBhIGxlYXNlIGhvbGRpbmcgcGFyYWNoYWluLgAwIyMgQXJndW1lbnRzVQEtIGBvcmlnaW5gOiBNdXN0IGJlIGNhbGxlZCBieSBhIGBTaWduZWRgIG9yaWdpbi4gQmVjb21lcyB0aGUgbWFuYWdlci9vd25lciBvZiB0aGUgbmV3KCAgcGFyYSBJRC4AQCMjIERlcG9zaXRzL0ZlZXMhAVRoZSBvcmlnaW4gbXVzdCByZXNlcnZlIGEgZGVwb3NpdCBvZiBgUGFyYURlcG9zaXRgIGZvciB0aGUgcmVnaXN0cmF0aW9uLgAkIyMgRXZlbnRzWQFUaGUgYFJlc2VydmVkYCBldmVudCBpcyBlbWl0dGVkIGluIGNhc2Ugb2Ygc3VjY2Vzcywgd2hpY2ggcHJvdmlkZXMgdGhlIElEIHJlc2VydmVkIGZvchB1c2UuIGFkZF9sb2NrBAEQcGFyYY0CARhQYXJhSWQABhQJAUFkZCBhIG1hbmFnZXIgbG9jayBmcm9tIGEgcGFyYS4gVGhpcyB3aWxsIHByZXZlbnQgdGhlIG1hbmFnZXIgb2YgYYhwYXJhIHRvIGRlcmVnaXN0ZXIgb3Igc3dhcCBhIHBhcmEuAEkBQ2FuIGJlIGNhbGxlZCBieSBSb290LCB0aGUgcGFyYWNoYWluLCBvciB0aGUgcGFyYWNoYWluIG1hbmFnZXIgaWYgdGhlIHBhcmFjaGFpbiBpcyR1bmxvY2tlZC5Uc2NoZWR1bGVfY29kZV91cGdyYWRlCAEQcGFyYY0CARhQYXJhSWQAASBuZXdfY29kZdUEAThWYWxpZGF0aW9uQ29kZQAHLHRTY2hlZHVsZSBhIHBhcmFjaGFpbiB1cGdyYWRlLgBVAVRoaXMgd2lsbCBraWNrIG9mZiBhIGNoZWNrIG9mIGBuZXdfY29kZWAgYnkgYWxsIHZhbGlkYXRvcnMuIEFmdGVyIHRoZSBtYWpvcml0eSBvZiB0aGVVAXZhbGlkYXRvcnMgaGF2ZSByZXBvcnRlZCBvbiB0aGUgdmFsaWRpdHkgb2YgdGhlIGNvZGUsIHRoZSBjb2RlIHdpbGwgZWl0aGVyIGJlIGVuYWN0ZWRVAW9yIHRoZSB1cGdyYWRlIHdpbGwgYmUgcmVqZWN0ZWQuIElmIHRoZSBjb2RlIHdpbGwgYmUgZW5hY3RlZCwgdGhlIGN1cnJlbnQgY29kZSBvZiB0aGVdAXBhcmFjaGFpbiB3aWxsIGJlIG92ZXJ3cml0dGVuIGRpcmVjdGx5LiBUaGlzIG1lYW5zIHRoYXQgYW55IFBvViB3aWxsIGJlIGNoZWNrZWQgYnkgdGhpc10BbmV3IGNvZGUuIFRoZSBwYXJhY2hhaW4gaXRzZWxmIHdpbGwgbm90IGJlIGluZm9ybWVkIGV4cGxpY2l0bHkgdGhhdCB0aGUgdmFsaWRhdGlvbiBjb2RlMGhhcyBjaGFuZ2VkLgBJAUNhbiBiZSBjYWxsZWQgYnkgUm9vdCwgdGhlIHBhcmFjaGFpbiwgb3IgdGhlIHBhcmFjaGFpbiBtYW5hZ2VyIGlmIHRoZSBwYXJhY2hhaW4gaXMkdW5sb2NrZWQuQHNldF9jdXJyZW50X2hlYWQIARBwYXJhjQIBGFBhcmFJZAABIG5ld19oZWFk2QQBIEhlYWREYXRhAAgQhFNldCB0aGUgcGFyYWNoYWluJ3MgY3VycmVudCBoZWFkLgBJAUNhbiBiZSBjYWxsZWQgYnkgUm9vdCwgdGhlIHBhcmFjaGFpbiwgb3IgdGhlIHBhcmFjaGFpbiBtYW5hZ2VyIGlmIHRoZSBwYXJhY2hhaW4gaXMkdW5sb2NrZWQuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLjkFEFxwb2xrYWRvdF9ydW50aW1lX2NvbW1vbhRzbG90cxhwYWxsZXQQQ2FsbAQEVAABDCxmb3JjZV9sZWFzZRQBEHBhcmGNAgEYUGFyYUlkAAEYbGVhc2VyAAEwVDo6QWNjb3VudElkAAEYYW1vdW50GAEwQmFsYW5jZU9mPFQ+AAEwcGVyaW9kX2JlZ2luEAFATGVhc2VQZXJpb2RPZjxUPgABMHBlcmlvZF9jb3VudBABQExlYXNlUGVyaW9kT2Y8VD4AABBNAUp1c3QgYSBjb25uZWN0IGludG8gdGhlIGBsZWFzZV9vdXRgIGNhbGwsIGluIGNhc2UgUm9vdCB3YW50cyB0byBmb3JjZSBzb21lIGxlYXNlIHRv/GhhcHBlbiBpbmRlcGVuZGVudGx5IG9mIGFueSBvdGhlciBvbi1jaGFpbiBtZWNoYW5pc20gdG8gdXNlIGl0LgD4VGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgbWF0Y2ggYFQ6OkZvcmNlT3JpZ2luYC5AY2xlYXJfYWxsX2xlYXNlcwQBEHBhcmGNAgEYUGFyYUlkAAEMTQFDbGVhciBhbGwgbGVhc2VzIGZvciBhIFBhcmEgSWQsIHJlZnVuZGluZyBhbnkgZGVwb3NpdHMgYmFjayB0byB0aGUgb3JpZ2luYWwgb3duZXJzLgD4VGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgbWF0Y2ggYFQ6OkZvcmNlT3JpZ2luYC48dHJpZ2dlcl9vbmJvYXJkBAEQcGFyYY0CARhQYXJhSWQAAhwlAVRyeSB0byBvbmJvYXJkIGEgcGFyYWNoYWluIHRoYXQgaGFzIGEgbGVhc2UgZm9yIHRoZSBjdXJyZW50IGxlYXNlIHBlcmlvZC4ARQFUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VmdWwgaWYgdGhlcmUgd2FzIHNvbWUgc3RhdGUgaXNzdWUgd2l0aCBhIHBhcmEgdGhhdCBzaG91bGQ5AWhhdmUgb25ib2FyZGVkLCBidXQgd2FzIHVuYWJsZSB0by4gQXMgbG9uZyBhcyB0aGV5IGhhdmUgYSBsZWFzZSBwZXJpb2QsIHdlIGNhbmxsZXQgdGhlbSBvbmJvYXJkIGZyb20gaGVyZS4AzE9yaWdpbiBtdXN0IGJlIHNpZ25lZCwgYnV0IGNhbiBiZSBjYWxsZWQgYnkgYW55b25lLgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy49BRBccG9sa2Fkb3RfcnVudGltZV9jb21tb24gYXVjdGlvbnMYcGFsbGV0EENhbGwEBFQAAQwsbmV3X2F1Y3Rpb24IASBkdXJhdGlvbuwBREJsb2NrTnVtYmVyRm9yPFQ+AAFIbGVhc2VfcGVyaW9kX2luZGV47AFATGVhc2VQZXJpb2RPZjxUPgAAFFRDcmVhdGUgYSBuZXcgYXVjdGlvbi4AUQFUaGlzIGNhbiBvbmx5IGhhcHBlbiB3aGVuIHRoZXJlIGlzbid0IGFscmVhZHkgYW4gYXVjdGlvbiBpbiBwcm9ncmVzcyBhbmQgbWF5IG9ubHkgYmUlAWNhbGxlZCBieSB0aGUgcm9vdCBvcmlnaW4uIEFjY2VwdHMgdGhlIGBkdXJhdGlvbmAgb2YgdGhpcyBhdWN0aW9uIGFuZCB0aGVZAWBsZWFzZV9wZXJpb2RfaW5kZXhgIG9mIHRoZSBpbml0aWFsIGxlYXNlIHBlcmlvZCBvZiB0aGUgZm91ciB0aGF0IGFyZSB0byBiZSBhdWN0aW9uZWQuDGJpZBQBEHBhcmFBBQEYUGFyYUlkAAE0YXVjdGlvbl9pbmRleOwBMEF1Y3Rpb25JbmRleAABKGZpcnN0X3Nsb3TsAUBMZWFzZVBlcmlvZE9mPFQ+AAEkbGFzdF9zbG907AFATGVhc2VQZXJpb2RPZjxUPgABGGFtb3VudPwBMEJhbGFuY2VPZjxUPgABQEkBTWFrZSBhIG5ldyBiaWQgZnJvbSBhbiBhY2NvdW50IChpbmNsdWRpbmcgYSBwYXJhY2hhaW4gYWNjb3VudCkgZm9yIGRlcGxveWluZyBhIG5ldyhwYXJhY2hhaW4uAFkBTXVsdGlwbGUgc2ltdWx0YW5lb3VzIGJpZHMgZnJvbSB0aGUgc2FtZSBiaWRkZXIgYXJlIGFsbG93ZWQgb25seSBhcyBsb25nIGFzIGFsbCBhY3RpdmU9AWJpZHMgb3ZlcmxhcCBlYWNoIG90aGVyIChpLmUuIGFyZSBtdXR1YWxseSBleGNsdXNpdmUpLiBCaWRzIGNhbm5vdCBiZSByZWRhY3RlZC4AVQEtIGBzdWJgIGlzIHRoZSBzdWItYmlkZGVyIElELCBhbGxvd2luZyBmb3IgbXVsdGlwbGUgY29tcGV0aW5nIGJpZHMgdG8gYmUgbWFkZSBieSAoYW5kcGZ1bmRlZCBieSkgdGhlIHNhbWUgYWNjb3VudC5NAS0gYGF1Y3Rpb25faW5kZXhgIGlzIHRoZSBpbmRleCBvZiB0aGUgYXVjdGlvbiB0byBiaWQgb24uIFNob3VsZCBqdXN0IGJlIHRoZSBwcmVzZW50aHZhbHVlIG9mIGBBdWN0aW9uQ291bnRlcmAuSQEtIGBmaXJzdF9zbG90YCBpcyB0aGUgZmlyc3QgbGVhc2UgcGVyaW9kIGluZGV4IG9mIHRoZSByYW5nZSB0byBiaWQgb24uIFRoaXMgaXMgdGhlCQFhYnNvbHV0ZSBsZWFzZSBwZXJpb2QgaW5kZXggdmFsdWUsIG5vdCBhbiBhdWN0aW9uLXNwZWNpZmljIG9mZnNldC5BAS0gYGxhc3Rfc2xvdGAgaXMgdGhlIGxhc3QgbGVhc2UgcGVyaW9kIGluZGV4IG9mIHRoZSByYW5nZSB0byBiaWQgb24uIFRoaXMgaXMgdGhlCQFhYnNvbHV0ZSBsZWFzZSBwZXJpb2QgaW5kZXggdmFsdWUsIG5vdCBhbiBhdWN0aW9uLXNwZWNpZmljIG9mZnNldC5JAS0gYGFtb3VudGAgaXMgdGhlIGFtb3VudCB0byBiaWQgdG8gYmUgaGVsZCBhcyBkZXBvc2l0IGZvciB0aGUgcGFyYWNoYWluIHNob3VsZCB0aGXIYmlkIHdpbi4gVGhpcyBhbW91bnQgaXMgaGVsZCB0aHJvdWdob3V0IHRoZSByYW5nZS44Y2FuY2VsX2F1Y3Rpb24AAgx4Q2FuY2VsIGFuIGluLXByb2dyZXNzIGF1Y3Rpb24uAIhDYW4gb25seSBiZSBjYWxsZWQgYnkgUm9vdCBvcmlnaW4uBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLkEFAAAGjQIARQUQXHBvbGthZG90X3J1bnRpbWVfY29tbW9uJGNyb3dkbG9hbhhwYWxsZXQQQ2FsbAQEVAABJBhjcmVhdGUYARRpbmRleEEFARhQYXJhSWQAAQxjYXD8ATBCYWxhbmNlT2Y8VD4AATBmaXJzdF9wZXJpb2TsAUBMZWFzZVBlcmlvZE9mPFQ+AAEsbGFzdF9wZXJpb2TsAUBMZWFzZVBlcmlvZE9mPFQ+AAEMZW5k7AFEQmxvY2tOdW1iZXJGb3I8VD4AASB2ZXJpZmllckkFAUxPcHRpb248TXVsdGlTaWduZXI+AAAUTQFDcmVhdGUgYSBuZXcgY3Jvd2Rsb2FuaW5nIGNhbXBhaWduIGZvciBhIHBhcmFjaGFpbiBzbG90IHdpdGggdGhlIGdpdmVuIGxlYXNlIHBlcmlvZBhyYW5nZS4AXQFUaGlzIGFwcGxpZXMgYSBsb2NrIHRvIHlvdXIgcGFyYWNoYWluIGNvbmZpZ3VyYXRpb24sIGVuc3VyaW5nIHRoYXQgaXQgY2Fubm90IGJlIGNoYW5nZWRkYnkgdGhlIHBhcmFjaGFpbiBtYW5hZ2VyLihjb250cmlidXRlDAEUaW5kZXhBBQEYUGFyYUlkAAEUdmFsdWX8ATBCYWxhbmNlT2Y8VD4AASRzaWduYXR1cmVRBQFYT3B0aW9uPE11bHRpU2lnbmF0dXJlPgABCFEBQ29udHJpYnV0ZSB0byBhIGNyb3dkIHNhbGUuIFRoaXMgd2lsbCB0cmFuc2ZlciBzb21lIGJhbGFuY2Ugb3ZlciB0byBmdW5kIGEgcGFyYWNoYWluUQFzbG90LiBJdCB3aWxsIGJlIHdpdGhkcmF3YWJsZSB3aGVuIHRoZSBjcm93ZGxvYW4gaGFzIGVuZGVkIGFuZCB0aGUgZnVuZHMgYXJlIHVudXNlZC4gd2l0aGRyYXcIAQx3aG8AATBUOjpBY2NvdW50SWQAARRpbmRleEEFARhQYXJhSWQAAkTAV2l0aGRyYXcgZnVsbCBiYWxhbmNlIG9mIGEgc3BlY2lmaWMgY29udHJpYnV0b3IuAMBPcmlnaW4gbXVzdCBiZSBzaWduZWQsIGJ1dCBjYW4gY29tZSBmcm9tIGFueW9uZS4AXQFUaGUgZnVuZCBtdXN0IGJlIGVpdGhlciBpbiwgb3IgcmVhZHkgZm9yLCByZXRpcmVtZW50LiBGb3IgYSBmdW5kIHRvIGJlICppbiogcmV0aXJlbWVudCxJAXRoZW4gdGhlIHJldGlyZW1lbnQgZmxhZyBtdXN0IGJlIHNldC4gRm9yIGEgZnVuZCB0byBiZSByZWFkeSBmb3IgcmV0aXJlbWVudCwgdGhlbjqcLSBpdCBtdXN0IG5vdCBhbHJlYWR5IGJlIGluIHJldGlyZW1lbnQ7TQEtIHRoZSBhbW91bnQgb2YgcmFpc2VkIGZ1bmRzIG11c3QgYmUgYmlnZ2VyIHRoYW4gdGhlIF9mcmVlXyBiYWxhbmNlIG9mIHRoZSBhY2NvdW50OzQtIGFuZCBlaXRoZXI6vCAgLSB0aGUgYmxvY2sgbnVtYmVyIG11c3QgYmUgYXQgbGVhc3QgYGVuZGA7IG9yLQEgIC0gdGhlIGN1cnJlbnQgbGVhc2UgcGVyaW9kIG11c3QgYmUgZ3JlYXRlciB0aGFuIHRoZSBmdW5kJ3MgYGxhc3RfcGVyaW9kYC4AVQFJbiB0aGlzIGNhc2UsIHRoZSBmdW5kJ3MgcmV0aXJlbWVudCBmbGFnIGlzIHNldCBhbmQgaXRzIGBlbmRgIGlzIHJlc2V0IHRvIHRoZSBjdXJyZW50NGJsb2NrIG51bWJlci4A8C0gYHdob2A6IFRoZSBhY2NvdW50IHdob3NlIGNvbnRyaWJ1dGlvbiBzaG91bGQgYmUgd2l0aGRyYXduLhkBLSBgaW5kZXhgOiBUaGUgcGFyYWNoYWluIHRvIHdob3NlIGNyb3dkbG9hbiB0aGUgY29udHJpYnV0aW9uIHdhcyBtYWRlLhhyZWZ1bmQEARRpbmRleEEFARhQYXJhSWQAAxTgQXV0b21hdGljYWxseSByZWZ1bmQgY29udHJpYnV0b3JzIG9mIGFuIGVuZGVkIGNyb3dkbG9hbi4hAUR1ZSB0byB3ZWlnaHQgcmVzdHJpY3Rpb25zLCB0aGlzIGZ1bmN0aW9uIG1heSBuZWVkIHRvIGJlIGNhbGxlZCBtdWx0aXBsZUkBdGltZXMgdG8gZnVsbHkgcmVmdW5kIGFsbCB1c2Vycy4gV2Ugd2lsbCByZWZ1bmQgYFJlbW92ZUtleXNMaW1pdGAgdXNlcnMgYXQgYSB0aW1lLgDAT3JpZ2luIG11c3QgYmUgc2lnbmVkLCBidXQgY2FuIGNvbWUgZnJvbSBhbnlvbmUuIGRpc3NvbHZlBAEUaW5kZXhBBQEYUGFyYUlkAAQEVQFSZW1vdmUgYSBmdW5kIGFmdGVyIHRoZSByZXRpcmVtZW50IHBlcmlvZCBoYXMgZW5kZWQgYW5kIGFsbCBmdW5kcyBoYXZlIGJlZW4gcmV0dXJuZWQuEGVkaXQYARRpbmRleEEFARhQYXJhSWQAAQxjYXD8ATBCYWxhbmNlT2Y8VD4AATBmaXJzdF9wZXJpb2TsAUBMZWFzZVBlcmlvZE9mPFQ+AAEsbGFzdF9wZXJpb2TsAUBMZWFzZVBlcmlvZE9mPFQ+AAEMZW5k7AFEQmxvY2tOdW1iZXJGb3I8VD4AASB2ZXJpZmllckkFAUxPcHRpb248TXVsdGlTaWduZXI+AAUM0EVkaXQgdGhlIGNvbmZpZ3VyYXRpb24gZm9yIGFuIGluLXByb2dyZXNzIGNyb3dkbG9hbi4AiENhbiBvbmx5IGJlIGNhbGxlZCBieSBSb290IG9yaWdpbi4gYWRkX21lbW8IARRpbmRleI0CARhQYXJhSWQAARBtZW1vOAEcVmVjPHU4PgAGDOxBZGQgYW4gb3B0aW9uYWwgbWVtbyB0byBhbiBleGlzdGluZyBjcm93ZGxvYW4gY29udHJpYnV0aW9uLgAtAU9yaWdpbiBtdXN0IGJlIFNpZ25lZCwgYW5kIHRoZSB1c2VyIG11c3QgaGF2ZSBjb250cmlidXRlZCB0byB0aGUgY3Jvd2Rsb2FuLhBwb2tlBAEUaW5kZXiNAgEYUGFyYUlkAAcMdFBva2UgdGhlIGZ1bmQgaW50byBgTmV3UmFpc2VgANxPcmlnaW4gbXVzdCBiZSBTaWduZWQsIGFuZCB0aGUgZnVuZCBoYXMgbm9uLXplcm8gcmFpc2UuOGNvbnRyaWJ1dGVfYWxsCAEUaW5kZXhBBQEYUGFyYUlkAAEkc2lnbmF0dXJlUQUBWE9wdGlvbjxNdWx0aVNpZ25hdHVyZT4ACAxhAUNvbnRyaWJ1dGUgeW91ciBlbnRpcmUgYmFsYW5jZSB0byBhIGNyb3dkIHNhbGUuIFRoaXMgd2lsbCB0cmFuc2ZlciB0aGUgZW50aXJlIGJhbGFuY2Ugb2ZRAWEgdXNlciBvdmVyIHRvIGZ1bmQgYSBwYXJhY2hhaW4gc2xvdC4gSXQgd2lsbCBiZSB3aXRoZHJhd2FibGUgd2hlbiB0aGUgY3Jvd2Rsb2FuIGhhc3xlbmRlZCBhbmQgdGhlIGZ1bmRzIGFyZSB1bnVzZWQuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLkkFBBhPcHRpb24EBFQBTQUBCBBOb25lAAAAEFNvbWUEAE0FAAABAABNBQgoc3BfcnVudGltZSxNdWx0aVNpZ25lcgABDBxFZDI1NTE5BAAEATxlZDI1NTE5OjpQdWJsaWMAAAAcU3IyNTUxOQQABAE8c3IyNTUxOTo6UHVibGljAAEAFEVjZHNhBAAtAgE0ZWNkc2E6OlB1YmxpYwACAABRBQQYT3B0aW9uBARUAVUFAQgQTm9uZQAAABBTb21lBABVBQAAAQAAVQUIKHNwX3J1bnRpbWU4TXVsdGlTaWduYXR1cmUAAQwcRWQyNTUxOQQASQIBSGVkMjU1MTk6OlNpZ25hdHVyZQAAABxTcjI1NTE5BABJAgFIc3IyNTUxOTo6U2lnbmF0dXJlAAEAFEVjZHNhBADZAgFAZWNkc2E6OlNpZ25hdHVyZQACAABZBRBscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zIGNvcmV0aW1lGHBhbGxldBBDYWxsBARUAAEMSHJlcXVlc3RfY29yZV9jb3VudAQBFGNvdW50bQEBDHUxNgABGFEBUmVxdWVzdCB0aGUgY29uZmlndXJhdGlvbiB0byBiZSB1cGRhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgY29yZXMuIFdhcm5pbmc6UQFTaW5jZSB0aGlzIG9ubHkgc2NoZWR1bGVzIGEgY29uZmlndXJhdGlvbiB1cGRhdGUsIGl0IHRha2VzIHR3byBzZXNzaW9ucyB0byBjb21lIGludG8cZWZmZWN0LgCYLSBgb3JpZ2luYDogUm9vdCBvciB0aGUgQ29yZXRpbWUgQ2hhaW6ALSBgY291bnRgOiB0b3RhbCBudW1iZXIgb2YgY29yZXNIcmVxdWVzdF9yZXZlbnVlX2F0BAEQd2hlbhABLEJsb2NrTnVtYmVyAAIQYQFSZXF1ZXN0IHRvIGNsYWltIHRoZSBpbnN0YW50YW5lb3VzIGNvcmV0aW1lIHNhbGVzIHJldmVudWUgc3RhcnRpbmcgZnJvbSB0aGUgYmxvY2sgaXQgd2FzXQFsYXN0IGNsYWltZWQgdW50aWwgYW5kIHVwIHRvIHRoZSBibG9jayBzcGVjaWZpZWQuIFRoZSBjbGFpbWVkIGFtb3VudCB2YWx1ZSBpcyBzZW50IGJhY2tRAXRvIHRoZSBDb3JldGltZSBjaGFpbiBpbiBhIGBub3RpZnlfcmV2ZW51ZWAgbWVzc2FnZS4gQXQgdGhlIHNhbWUgdGltZSwgdGhlIGFtb3VudCBpc4R0ZWxlcG9ydGVkIHRvIHRoZSBDb3JldGltZSBjaGFpbi4sYXNzaWduX2NvcmUQARBjb3JlbQEBPEJyb2tlckNvcmVJbmRleAABFGJlZ2luEAFEQmxvY2tOdW1iZXJGb3I8VD4AAShhc3NpZ25tZW50XQUBjFZlYzwoQ29yZUFzc2lnbm1lbnQsIFBhcnRzT2Y1NzYwMCk+AAEgZW5kX2hpbnRhAgFkT3B0aW9uPEJsb2NrTnVtYmVyRm9yPFQ+PgAEJFkBUmVjZWl2ZSBpbnN0cnVjdGlvbnMgZnJvbSB0aGUgYEV4dGVybmFsQnJva2VyT3JpZ2luYCwgZGV0YWlsaW5nIGhvdyBhIHNwZWNpZmljIGNvcmUgaXMsdG8gYmUgdXNlZC4ALFBhcmFtZXRlcnM6IQEtYG9yaWdpbmA6IFRoZSBgRXh0ZXJuYWxCcm9rZXJPcmlnaW5gLCBhc3N1bWVkIHRvIGJlIHRoZSBjb3JldGltZSBjaGFpbi6sLWBjb3JlYDogVGhlIGNvcmUgdGhhdCBzaG91bGQgYmUgc2NoZWR1bGVkLtgtYGJlZ2luYDogVGhlIHN0YXJ0aW5nIGJsb2NraGVpZ2h0IG9mIHRoZSBpbnN0cnVjdGlvbi7ULWBhc3NpZ25tZW50YDogSG93IHRoZSBibG9ja3NwYWNlIHNob3VsZCBiZSB1dGlsaXNlZC5ZAS1gZW5kX2hpbnRgOiBBbiBvcHRpb25hbCBoaW50IGFzIHRvIHdoZW4gdGhpcyBwYXJ0aWN1bGFyIHNldCBvZiBpbnN0cnVjdGlvbnMgd2lsbCBlbmQuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLl0FAAACYQUAYQUAAAQIZQVpBQBlBQw0cGFsbGV0X2Jyb2tlckhjb3JldGltZV9pbnRlcmZhY2U4Q29yZUFzc2lnbm1lbnQAAQwQSWRsZQAAABBQb29sAAEAEFRhc2sEABABGFRhc2tJZAACAABpBQxscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zRGFzc2lnbmVyX2NvcmV0aW1lMFBhcnRzT2Y1NzYwMAAABABtAQEMdTE2AABtBQxscGFsbGV0X3N0YXRlX3RyaWVfbWlncmF0aW9uGHBhbGxldBBDYWxsBARUAAEYWGNvbnRyb2xfYXV0b19taWdyYXRpb24EATBtYXliZV9jb25maWdxBQFcT3B0aW9uPE1pZ3JhdGlvbkxpbWl0cz4AAAyAQ29udHJvbCB0aGUgYXV0b21hdGljIG1pZ3JhdGlvbi4ADQFUaGUgZGlzcGF0Y2ggb3JpZ2luIG9mIHRoaXMgY2FsbCBtdXN0IGJlIFtgQ29uZmlnOjpDb250cm9sT3JpZ2luYF0uQGNvbnRpbnVlX21pZ3JhdGUMARhsaW1pdHN1BQE8TWlncmF0aW9uTGltaXRzAAE8cmVhbF9zaXplX3VwcGVyEAEMdTMyAAEwd2l0bmVzc190YXNreQUBQE1pZ3JhdGlvblRhc2s8VD4AAVS4Q29udGludWUgdGhlIG1pZ3JhdGlvbiBmb3IgdGhlIGdpdmVuIGBsaW1pdHNgLgDsVGhlIGRpc3BhdGNoIG9yaWdpbiBvZiB0aGlzIGNhbGwgY2FuIGJlIGFueSBzaWduZWQgYWNjb3VudC4AXQFUaGlzIHRyYW5zYWN0aW9uIGhhcyBOTyBNT05FVEFSWSBJTkNFTlRJVkVTLiBjYWxsaW5nIGl0IHdpbGwgbm90IHJld2FyZCBhbnlvbmUuIEFsYmVpdCzsVXBvbiBzdWNjZXNzZnVsIGV4ZWN1dGlvbiwgdGhlIHRyYW5zYWN0aW9uIGZlZSBpcyByZXR1cm5lZC4AQQFUaGUgKHBvdGVudGlhbGx5IG92ZXItZXN0aW1hdGVkKSBvZiB0aGUgYnl0ZSBsZW5ndGggb2YgYWxsIHRoZSBkYXRhIHJlYWQgbXVzdCBiZVkBcHJvdmlkZWQgZm9yIHVwLWZyb250IGZlZS1wYXltZW50IGFuZCB3ZWlnaGluZy4gSW4gZXNzZW5jZSwgdGhlIGNhbGxlciBpcyBndWFyYW50ZWVpbmdJAXRoYXQgZXhlY3V0aW5nIHRoZSBjdXJyZW50IGBNaWdyYXRpb25UYXNrYCB3aXRoIHRoZSBnaXZlbiBgbGltaXRzYCB3aWxsIG5vdCBleGNlZWSUYHJlYWxfc2l6ZV91cHBlcmAgYnl0ZXMgb2YgcmVhZCBkYXRhLgBFAVRoZSBgd2l0bmVzc190YXNrYCBpcyBtZXJlbHkgYSBoZWxwZXIgdG8gcHJldmVudCB0aGUgY2FsbGVyIGZyb20gYmVpbmcgc2xhc2hlZCBvcl0BZ2VuZXJhbGx5IHRyaWdnZXIgYSBtaWdyYXRpb24gdGhhdCB0aGV5IGRvIG5vdCBpbnRlbmQuIFRoaXMgcGFyYW1ldGVyIGlzIGp1c3QgYSBtZXNzYWdlPQFmcm9tIGNhbGxlciwgc2F5aW5nIHRoYXQgdGhleSBiZWxpZXZlZCBgd2l0bmVzc190YXNrYCB3YXMgdGhlIGxhc3Qgc3RhdGUgb2YgdGhlWQFtaWdyYXRpb24sIGFuZCB0aGV5IG9ubHkgd2lzaCBmb3IgdGhlaXIgdHJhbnNhY3Rpb24gdG8gZG8gYW55dGhpbmcsIGlmIHRoaXMgYXNzdW1wdGlvbhEBaG9sZHMuIEluIGNhc2UgYHdpdG5lc3NfdGFza2AgZG9lcyBub3QgbWF0Y2gsIHRoZSB0cmFuc2FjdGlvbiBmYWlscy4AOQFCYXNlZCBvbiB0aGUgZG9jdW1lbnRhdGlvbiBvZiBbYE1pZ3JhdGlvblRhc2s6Om1pZ3JhdGVfdW50aWxfZXhoYXVzdGlvbmBdLCB0aGVNAXJlY29tbWVuZGVkIHdheSBvZiBkb2luZyB0aGlzIGlzIHRvIHBhc3MgYSBgbGltaXRgIHRoYXQgb25seSBib3VuZHMgYGNvdW50YCwgYXMgdGhlnGBzaXplYCBsaW1pdCBjYW4gYWx3YXlzIGJlIG92ZXJ3cml0dGVuLkhtaWdyYXRlX2N1c3RvbV90b3AIARBrZXlzhQEBMFZlYzxWZWM8dTg+PgABMHdpdG5lc3Nfc2l6ZRABDHUzMgACEAkBTWlncmF0ZSB0aGUgbGlzdCBvZiB0b3Aga2V5cyBieSBpdGVyYXRpbmcgZWFjaCBvZiB0aGVtIG9uZSBieSBvbmUuAFUBVGhpcyBkb2VzIG5vdCBhZmZlY3QgdGhlIGdsb2JhbCBtaWdyYXRpb24gcHJvY2VzcyB0cmFja2VyIChbYE1pZ3JhdGlvblByb2Nlc3NgXSksIGFuZPxzaG91bGQgb25seSBiZSB1c2VkIGluIGNhc2UgYW55IGtleXMgYXJlIGxlZnRvdmVyIGR1ZSB0byBhIGJ1Zy5QbWlncmF0ZV9jdXN0b21fY2hpbGQMARByb290OAEcVmVjPHU4PgABKGNoaWxkX2tleXOFAQEwVmVjPFZlYzx1OD4+AAEodG90YWxfc2l6ZRABDHUzMgADGBEBTWlncmF0ZSB0aGUgbGlzdCBvZiBjaGlsZCBrZXlzIGJ5IGl0ZXJhdGluZyBlYWNoIG9mIHRoZW0gb25lIGJ5IG9uZS4ADQFBbGwgb2YgdGhlIGdpdmVuIGNoaWxkIGtleXMgbXVzdCBiZSBwcmVzZW50IHVuZGVyIG9uZSBgY2hpbGRfcm9vdGAuAFUBVGhpcyBkb2VzIG5vdCBhZmZlY3QgdGhlIGdsb2JhbCBtaWdyYXRpb24gcHJvY2VzcyB0cmFja2VyIChbYE1pZ3JhdGlvblByb2Nlc3NgXSksIGFuZPxzaG91bGQgb25seSBiZSB1c2VkIGluIGNhc2UgYW55IGtleXMgYXJlIGxlZnRvdmVyIGR1ZSB0byBhIGJ1Zy5Uc2V0X3NpZ25lZF9tYXhfbGltaXRzBAEYbGltaXRzdQUBPE1pZ3JhdGlvbkxpbWl0cwAEBLhTZXQgdGhlIG1heGltdW0gbGltaXQgb2YgdGhlIHNpZ25lZCBtaWdyYXRpb24uSGZvcmNlX3NldF9wcm9ncmVzcwgBMHByb2dyZXNzX3RvcH0FATRQcm9ncmVzc09mPFQ+AAE4cHJvZ3Jlc3NfY2hpbGR9BQE0UHJvZ3Jlc3NPZjxUPgAFJMhGb3JjZWZ1bGx5IHNldCB0aGUgcHJvZ3Jlc3MgdGhlIHJ1bm5pbmcgbWlncmF0aW9uLgBdAVRoaXMgaXMgb25seSB1c2VmdWwgaW4gb25lIGNhc2U6IHRoZSBuZXh0IGtleSB0byBtaWdyYXRlIGlzIHRvbyBiaWcgdG8gYmUgbWlncmF0ZWQgd2l0aFUBYSBzaWduZWQgYWNjb3VudCwgaW4gYSBwYXJhY2hhaW4gY29udGV4dCwgYW5kIHdlIHNpbXBseSB3YW50IHRvIHNraXAgaXQuIEEgcmVhc29uYWJsZWEBZXhhbXBsZSBvZiB0aGlzIHdvdWxkIGJlIGA6Y29kZTpgLCB3aGljaCBpcyBib3RoIHZlcnkgZXhwZW5zaXZlIHRvIG1pZ3JhdGUsIGFuZCBjb21tb25seaR1c2VkLCBzbyBwcm9iYWJseSBpdCBpcyBhbHJlYWR5IG1pZ3JhdGVkLgBdAUluIGNhc2UgeW91IG1lc3MgdGhpbmdzIHVwLCB5b3UgY2FuIGFsc28sIGluIHByaW5jaXBsZSwgdXNlIHRoaXMgdG8gcmVzZXQgdGhlIG1pZ3JhdGlvbiBwcm9jZXNzLgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy5xBQQYT3B0aW9uBARUAXUFAQgQTm9uZQAAABBTb21lBAB1BQAAAQAAdQUMbHBhbGxldF9zdGF0ZV90cmllX21pZ3JhdGlvbhhwYWxsZXQ8TWlncmF0aW9uTGltaXRzAAAIARBzaXplEAEMdTMyAAEQaXRlbRABDHUzMgAAeQUMbHBhbGxldF9zdGF0ZV90cmllX21pZ3JhdGlvbhhwYWxsZXQ0TWlncmF0aW9uVGFzawQEVAAAFAEwcHJvZ3Jlc3NfdG9wfQUBNFByb2dyZXNzT2Y8VD4AAThwcm9ncmVzc19jaGlsZH0FATRQcm9ncmVzc09mPFQ+AAEQc2l6ZRABDHUzMgABJHRvcF9pdGVtcxABDHUzMgABLGNoaWxkX2l0ZW1zEAEMdTMyAAB9BQxscGFsbGV0X3N0YXRlX3RyaWVfbWlncmF0aW9uGHBhbGxldCBQcm9ncmVzcwQkTWF4S2V5TGVuAAEMHFRvU3RhcnQAAAAcTGFzdEtleQQAgQUBZEJvdW5kZWRWZWM8dTgsIE1heEtleUxlbj4AAQAgQ29tcGxldGUAAgAAgQUMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAEIBFMAAAQAOAEYVmVjPFQ+AACFBQwocGFsbGV0X3hjbRhwYWxsZXQQQ2FsbAQEVAABOBBzZW5kCAEQZGVzdEUBAVhCb3g8VmVyc2lvbmVkTG9jYXRpb24+AAEcbWVzc2FnZYkFAVRCb3g8VmVyc2lvbmVkWGNtPCgpPj4AAAA8dGVsZXBvcnRfYXNzZXRzEAEQZGVzdEUBAVhCb3g8VmVyc2lvbmVkTG9jYXRpb24+AAEsYmVuZWZpY2lhcnlFAQFYQm94PFZlcnNpb25lZExvY2F0aW9uPgABGGFzc2V0c4kGAVBCb3g8VmVyc2lvbmVkQXNzZXRzPgABOGZlZV9hc3NldF9pdGVtEAEMdTMyAAFIEQFUZWxlcG9ydCBzb21lIGFzc2V0cyBmcm9tIHRoZSBsb2NhbCBjaGFpbiB0byBzb21lIGRlc3RpbmF0aW9uIGNoYWluLgAdASoqVGhpcyBmdW5jdGlvbiBpcyBkZXByZWNhdGVkOiBVc2UgYGxpbWl0ZWRfdGVsZXBvcnRfYXNzZXRzYCBpbnN0ZWFkLioqAFEBRmVlIHBheW1lbnQgb24gdGhlIGRlc3RpbmF0aW9uIHNpZGUgaXMgbWFkZSBmcm9tIHRoZSBhc3NldCBpbiB0aGUgYGFzc2V0c2AgdmVjdG9yIG9mYQFpbmRleCBgZmVlX2Fzc2V0X2l0ZW1gLiBUaGUgd2VpZ2h0IGxpbWl0IGZvciBmZWVzIGlzIG5vdCBwcm92aWRlZCBhbmQgdGh1cyBpcyB1bmxpbWl0ZWQstHdpdGggYWxsIGZlZXMgdGFrZW4gYXMgbmVlZGVkIGZyb20gdGhlIGFzc2V0LgApAS0gYG9yaWdpbmA6IE11c3QgYmUgY2FwYWJsZSBvZiB3aXRoZHJhd2luZyB0aGUgYGFzc2V0c2AgYW5kIGV4ZWN1dGluZyBYQ00uJQEtIGBkZXN0YDogRGVzdGluYXRpb24gY29udGV4dCBmb3IgdGhlIGFzc2V0cy4gV2lsbCB0eXBpY2FsbHkgYmUgYFtQYXJlbnQsYQEgIFBhcmFjaGFpbiguLildYCB0byBzZW5kIGZyb20gcGFyYWNoYWluIHRvIHBhcmFjaGFpbiwgb3IgYFtQYXJhY2hhaW4oLi4pXWAgdG8gc2VuZCBmcm9tVCAgcmVsYXkgdG8gcGFyYWNoYWluLlUBLSBgYmVuZWZpY2lhcnlgOiBBIGJlbmVmaWNpYXJ5IGxvY2F0aW9uIGZvciB0aGUgYXNzZXRzIGluIHRoZSBjb250ZXh0IG9mIGBkZXN0YC4gV2lsbJggIGdlbmVyYWxseSBiZSBhbiBgQWNjb3VudElkMzJgIHZhbHVlLlkBLSBgYXNzZXRzYDogVGhlIGFzc2V0cyB0byBiZSB3aXRoZHJhd24uIFRoaXMgc2hvdWxkIGluY2x1ZGUgdGhlIGFzc2V0cyB1c2VkIHRvIHBheSB0aGVoICBmZWUgb24gdGhlIGBkZXN0YCBjaGFpbi5NAS0gYGZlZV9hc3NldF9pdGVtYDogVGhlIGluZGV4IGludG8gYGFzc2V0c2Agb2YgdGhlIGl0ZW0gd2hpY2ggc2hvdWxkIGJlIHVzZWQgdG8gcGF5HCAgZmVlcy5ccmVzZXJ2ZV90cmFuc2Zlcl9hc3NldHMQARBkZXN0RQEBWEJveDxWZXJzaW9uZWRMb2NhdGlvbj4AASxiZW5lZmljaWFyeUUBAVhCb3g8VmVyc2lvbmVkTG9jYXRpb24+AAEYYXNzZXRziQYBUEJveDxWZXJzaW9uZWRBc3NldHM+AAE4ZmVlX2Fzc2V0X2l0ZW0QAQx1MzIAAnhdAVRyYW5zZmVyIHNvbWUgYXNzZXRzIGZyb20gdGhlIGxvY2FsIGNoYWluIHRvIHRoZSBkZXN0aW5hdGlvbiBjaGFpbiB0aHJvdWdoIHRoZWlyIGxvY2FsLHhkZXN0aW5hdGlvbiBvciByZW1vdGUgcmVzZXJ2ZS4APQFgYXNzZXRzYCBtdXN0IGhhdmUgc2FtZSByZXNlcnZlIGxvY2F0aW9uIGFuZCBtYXkgbm90IGJlIHRlbGVwb3J0YWJsZSB0byBgZGVzdGAuTQEgLSBgYXNzZXRzYCBoYXZlIGxvY2FsIHJlc2VydmU6IHRyYW5zZmVyIGFzc2V0cyB0byBzb3ZlcmVpZ24gYWNjb3VudCBvZiBkZXN0aW5hdGlvbk0BICAgY2hhaW4gYW5kIGZvcndhcmQgYSBub3RpZmljYXRpb24gWENNIHRvIGBkZXN0YCB0byBtaW50IGFuZCBkZXBvc2l0IHJlc2VydmUtYmFzZWRsICAgYXNzZXRzIHRvIGBiZW5lZmljaWFyeWAuVQEgLSBgYXNzZXRzYCBoYXZlIGRlc3RpbmF0aW9uIHJlc2VydmU6IGJ1cm4gbG9jYWwgYXNzZXRzIGFuZCBmb3J3YXJkIGEgbm90aWZpY2F0aW9uIHRvWQEgICBgZGVzdGAgY2hhaW4gdG8gd2l0aGRyYXcgdGhlIHJlc2VydmUgYXNzZXRzIGZyb20gdGhpcyBjaGFpbidzIHNvdmVyZWlnbiBhY2NvdW50IGFuZIQgICBkZXBvc2l0IHRoZW0gdG8gYGJlbmVmaWNpYXJ5YC5hASAtIGBhc3NldHNgIGhhdmUgcmVtb3RlIHJlc2VydmU6IGJ1cm4gbG9jYWwgYXNzZXRzLCBmb3J3YXJkIFhDTSB0byByZXNlcnZlIGNoYWluIHRvIG1vdmVhASAgIHJlc2VydmVzIGZyb20gdGhpcyBjaGFpbidzIFNBIHRvIGBkZXN0YCBjaGFpbidzIFNBLCBhbmQgZm9yd2FyZCBhbm90aGVyIFhDTSB0byBgZGVzdGD0ICAgdG8gbWludCBhbmQgZGVwb3NpdCByZXNlcnZlLWJhc2VkIGFzc2V0cyB0byBgYmVuZWZpY2lhcnlgLgA9ASoqVGhpcyBmdW5jdGlvbiBpcyBkZXByZWNhdGVkOiBVc2UgYGxpbWl0ZWRfcmVzZXJ2ZV90cmFuc2Zlcl9hc3NldHNgIGluc3RlYWQuKioAUQFGZWUgcGF5bWVudCBvbiB0aGUgZGVzdGluYXRpb24gc2lkZSBpcyBtYWRlIGZyb20gdGhlIGFzc2V0IGluIHRoZSBgYXNzZXRzYCB2ZWN0b3Igb2ZhAWluZGV4IGBmZWVfYXNzZXRfaXRlbWAuIFRoZSB3ZWlnaHQgbGltaXQgZm9yIGZlZXMgaXMgbm90IHByb3ZpZGVkIGFuZCB0aHVzIGlzIHVubGltaXRlZCy0d2l0aCBhbGwgZmVlcyB0YWtlbiBhcyBuZWVkZWQgZnJvbSB0aGUgYXNzZXQuACkBLSBgb3JpZ2luYDogTXVzdCBiZSBjYXBhYmxlIG9mIHdpdGhkcmF3aW5nIHRoZSBgYXNzZXRzYCBhbmQgZXhlY3V0aW5nIFhDTS4lAS0gYGRlc3RgOiBEZXN0aW5hdGlvbiBjb250ZXh0IGZvciB0aGUgYXNzZXRzLiBXaWxsIHR5cGljYWxseSBiZSBgW1BhcmVudCxhASAgUGFyYWNoYWluKC4uKV1gIHRvIHNlbmQgZnJvbSBwYXJhY2hhaW4gdG8gcGFyYWNoYWluLCBvciBgW1BhcmFjaGFpbiguLildYCB0byBzZW5kIGZyb21UICByZWxheSB0byBwYXJhY2hhaW4uVQEtIGBiZW5lZmljaWFyeWA6IEEgYmVuZWZpY2lhcnkgbG9jYXRpb24gZm9yIHRoZSBhc3NldHMgaW4gdGhlIGNvbnRleHQgb2YgYGRlc3RgLiBXaWxsmCAgZ2VuZXJhbGx5IGJlIGFuIGBBY2NvdW50SWQzMmAgdmFsdWUuWQEtIGBhc3NldHNgOiBUaGUgYXNzZXRzIHRvIGJlIHdpdGhkcmF3bi4gVGhpcyBzaG91bGQgaW5jbHVkZSB0aGUgYXNzZXRzIHVzZWQgdG8gcGF5IHRoZcggIGZlZSBvbiB0aGUgYGRlc3RgIChhbmQgcG9zc2libHkgcmVzZXJ2ZSkgY2hhaW5zLk0BLSBgZmVlX2Fzc2V0X2l0ZW1gOiBUaGUgaW5kZXggaW50byBgYXNzZXRzYCBvZiB0aGUgaXRlbSB3aGljaCBzaG91bGQgYmUgdXNlZCB0byBwYXkcICBmZWVzLhxleGVjdXRlCAEcbWVzc2FnZY0GAbRCb3g8VmVyc2lvbmVkWGNtPDxUIGFzIENvbmZpZz46OlJ1bnRpbWVDYWxsPj4AAShtYXhfd2VpZ2h0KAEYV2VpZ2h0AAMg0EV4ZWN1dGUgYW4gWENNIG1lc3NhZ2UgZnJvbSBhIGxvY2FsLCBzaWduZWQsIG9yaWdpbi4ATQFBbiBldmVudCBpcyBkZXBvc2l0ZWQgaW5kaWNhdGluZyB3aGV0aGVyIGBtc2dgIGNvdWxkIGJlIGV4ZWN1dGVkIGNvbXBsZXRlbHkgb3Igb25seShwYXJ0aWFsbHkuAF0BTm8gbW9yZSB0aGFuIGBtYXhfd2VpZ2h0YCB3aWxsIGJlIHVzZWQgaW4gaXRzIGF0dGVtcHRlZCBleGVjdXRpb24uIElmIHRoaXMgaXMgbGVzcyB0aGFuQQF0aGUgbWF4aW11bSBhbW91bnQgb2Ygd2VpZ2h0IHRoYXQgdGhlIG1lc3NhZ2UgY291bGQgdGFrZSB0byBiZSBleGVjdXRlZCwgdGhlbiBub3xleGVjdXRpb24gYXR0ZW1wdCB3aWxsIGJlIG1hZGUuRGZvcmNlX3hjbV92ZXJzaW9uCAEgbG9jYXRpb24NAQE0Qm94PExvY2F0aW9uPgABHHZlcnNpb24QAShYY21WZXJzaW9uAAQYSQFFeHRvbGwgdGhhdCBhIHBhcnRpY3VsYXIgZGVzdGluYXRpb24gY2FuIGJlIGNvbW11bmljYXRlZCB3aXRoIHRocm91Z2ggYSBwYXJ0aWN1bGFyPHZlcnNpb24gb2YgWENNLgDcLSBgb3JpZ2luYDogTXVzdCBiZSBhbiBvcmlnaW4gc3BlY2lmaWVkIGJ5IEFkbWluT3JpZ2luLtgtIGBsb2NhdGlvbmA6IFRoZSBkZXN0aW5hdGlvbiB0aGF0IGlzIGJlaW5nIGRlc2NyaWJlZC4RAS0gYHhjbV92ZXJzaW9uYDogVGhlIGxhdGVzdCB2ZXJzaW9uIG9mIFhDTSB0aGF0IGBsb2NhdGlvbmAgc3VwcG9ydHMuZGZvcmNlX2RlZmF1bHRfeGNtX3ZlcnNpb24EAURtYXliZV94Y21fdmVyc2lvbmECAUhPcHRpb248WGNtVmVyc2lvbj4ABRRZAVNldCBhIHNhZmUgWENNIHZlcnNpb24gKHRoZSB2ZXJzaW9uIHRoYXQgWENNIHNob3VsZCBiZSBlbmNvZGVkIHdpdGggaWYgdGhlIG1vc3QgcmVjZW50tHZlcnNpb24gYSBkZXN0aW5hdGlvbiBjYW4gYWNjZXB0IGlzIHVua25vd24pLgDcLSBgb3JpZ2luYDogTXVzdCBiZSBhbiBvcmlnaW4gc3BlY2lmaWVkIGJ5IEFkbWluT3JpZ2luLjkBLSBgbWF5YmVfeGNtX3ZlcnNpb25gOiBUaGUgZGVmYXVsdCBYQ00gZW5jb2RpbmcgdmVyc2lvbiwgb3IgYE5vbmVgIHRvIGRpc2FibGUueGZvcmNlX3N1YnNjcmliZV92ZXJzaW9uX25vdGlmeQQBIGxvY2F0aW9uRQEBWEJveDxWZXJzaW9uZWRMb2NhdGlvbj4ABhA5AUFzayBhIGxvY2F0aW9uIHRvIG5vdGlmeSB1cyByZWdhcmRpbmcgdGhlaXIgWENNIHZlcnNpb24gYW5kIGFueSBjaGFuZ2VzIHRvIGl0LgDcLSBgb3JpZ2luYDogTXVzdCBiZSBhbiBvcmlnaW4gc3BlY2lmaWVkIGJ5IEFkbWluT3JpZ2luLlkBLSBgbG9jYXRpb25gOiBUaGUgbG9jYXRpb24gdG8gd2hpY2ggd2Ugc2hvdWxkIHN1YnNjcmliZSBmb3IgWENNIHZlcnNpb24gbm90aWZpY2F0aW9ucy6AZm9yY2VfdW5zdWJzY3JpYmVfdmVyc2lvbl9ub3RpZnkEASBsb2NhdGlvbkUBAVhCb3g8VmVyc2lvbmVkTG9jYXRpb24+AAcYSQFSZXF1aXJlIHRoYXQgYSBwYXJ0aWN1bGFyIGRlc3RpbmF0aW9uIHNob3VsZCBubyBsb25nZXIgbm90aWZ5IHVzIHJlZ2FyZGluZyBhbnkgWENNQHZlcnNpb24gY2hhbmdlcy4A3C0gYG9yaWdpbmA6IE11c3QgYmUgYW4gb3JpZ2luIHNwZWNpZmllZCBieSBBZG1pbk9yaWdpbi49AS0gYGxvY2F0aW9uYDogVGhlIGxvY2F0aW9uIHRvIHdoaWNoIHdlIGFyZSBjdXJyZW50bHkgc3Vic2NyaWJlZCBmb3IgWENNIHZlcnNpb26oICBub3RpZmljYXRpb25zIHdoaWNoIHdlIG5vIGxvbmdlciBkZXNpcmUufGxpbWl0ZWRfcmVzZXJ2ZV90cmFuc2Zlcl9hc3NldHMUARBkZXN0RQEBWEJveDxWZXJzaW9uZWRMb2NhdGlvbj4AASxiZW5lZmljaWFyeUUBAVhCb3g8VmVyc2lvbmVkTG9jYXRpb24+AAEYYXNzZXRziQYBUEJveDxWZXJzaW9uZWRBc3NldHM+AAE4ZmVlX2Fzc2V0X2l0ZW0QAQx1MzIAATB3ZWlnaHRfbGltaXQ9BgEsV2VpZ2h0TGltaXQACHhdAVRyYW5zZmVyIHNvbWUgYXNzZXRzIGZyb20gdGhlIGxvY2FsIGNoYWluIHRvIHRoZSBkZXN0aW5hdGlvbiBjaGFpbiB0aHJvdWdoIHRoZWlyIGxvY2FsLHhkZXN0aW5hdGlvbiBvciByZW1vdGUgcmVzZXJ2ZS4APQFgYXNzZXRzYCBtdXN0IGhhdmUgc2FtZSByZXNlcnZlIGxvY2F0aW9uIGFuZCBtYXkgbm90IGJlIHRlbGVwb3J0YWJsZSB0byBgZGVzdGAuTQEgLSBgYXNzZXRzYCBoYXZlIGxvY2FsIHJlc2VydmU6IHRyYW5zZmVyIGFzc2V0cyB0byBzb3ZlcmVpZ24gYWNjb3VudCBvZiBkZXN0aW5hdGlvbk0BICAgY2hhaW4gYW5kIGZvcndhcmQgYSBub3RpZmljYXRpb24gWENNIHRvIGBkZXN0YCB0byBtaW50IGFuZCBkZXBvc2l0IHJlc2VydmUtYmFzZWRsICAgYXNzZXRzIHRvIGBiZW5lZmljaWFyeWAuVQEgLSBgYXNzZXRzYCBoYXZlIGRlc3RpbmF0aW9uIHJlc2VydmU6IGJ1cm4gbG9jYWwgYXNzZXRzIGFuZCBmb3J3YXJkIGEgbm90aWZpY2F0aW9uIHRvWQEgICBgZGVzdGAgY2hhaW4gdG8gd2l0aGRyYXcgdGhlIHJlc2VydmUgYXNzZXRzIGZyb20gdGhpcyBjaGFpbidzIHNvdmVyZWlnbiBhY2NvdW50IGFuZIQgICBkZXBvc2l0IHRoZW0gdG8gYGJlbmVmaWNpYXJ5YC5hASAtIGBhc3NldHNgIGhhdmUgcmVtb3RlIHJlc2VydmU6IGJ1cm4gbG9jYWwgYXNzZXRzLCBmb3J3YXJkIFhDTSB0byByZXNlcnZlIGNoYWluIHRvIG1vdmVhASAgIHJlc2VydmVzIGZyb20gdGhpcyBjaGFpbidzIFNBIHRvIGBkZXN0YCBjaGFpbidzIFNBLCBhbmQgZm9yd2FyZCBhbm90aGVyIFhDTSB0byBgZGVzdGD0ICAgdG8gbWludCBhbmQgZGVwb3NpdCByZXNlcnZlLWJhc2VkIGFzc2V0cyB0byBgYmVuZWZpY2lhcnlgLgBRAUZlZSBwYXltZW50IG9uIHRoZSBkZXN0aW5hdGlvbiBzaWRlIGlzIG1hZGUgZnJvbSB0aGUgYXNzZXQgaW4gdGhlIGBhc3NldHNgIHZlY3RvciBvZmEBaW5kZXggYGZlZV9hc3NldF9pdGVtYCwgdXAgdG8gZW5vdWdoIHRvIHBheSBmb3IgYHdlaWdodF9saW1pdGAgb2Ygd2VpZ2h0LiBJZiBtb3JlIHdlaWdodFkBaXMgbmVlZGVkIHRoYW4gYHdlaWdodF9saW1pdGAsIHRoZW4gdGhlIG9wZXJhdGlvbiB3aWxsIGZhaWwgYW5kIHRoZSBzZW50IGFzc2V0cyBtYXkgYmUgYXQgcmlzay4AKQEtIGBvcmlnaW5gOiBNdXN0IGJlIGNhcGFibGUgb2Ygd2l0aGRyYXdpbmcgdGhlIGBhc3NldHNgIGFuZCBleGVjdXRpbmcgWENNLiUBLSBgZGVzdGA6IERlc3RpbmF0aW9uIGNvbnRleHQgZm9yIHRoZSBhc3NldHMuIFdpbGwgdHlwaWNhbGx5IGJlIGBbUGFyZW50LGEBICBQYXJhY2hhaW4oLi4pXWAgdG8gc2VuZCBmcm9tIHBhcmFjaGFpbiB0byBwYXJhY2hhaW4sIG9yIGBbUGFyYWNoYWluKC4uKV1gIHRvIHNlbmQgZnJvbVQgIHJlbGF5IHRvIHBhcmFjaGFpbi5VAS0gYGJlbmVmaWNpYXJ5YDogQSBiZW5lZmljaWFyeSBsb2NhdGlvbiBmb3IgdGhlIGFzc2V0cyBpbiB0aGUgY29udGV4dCBvZiBgZGVzdGAuIFdpbGyYICBnZW5lcmFsbHkgYmUgYW4gYEFjY291bnRJZDMyYCB2YWx1ZS5ZAS0gYGFzc2V0c2A6IFRoZSBhc3NldHMgdG8gYmUgd2l0aGRyYXduLiBUaGlzIHNob3VsZCBpbmNsdWRlIHRoZSBhc3NldHMgdXNlZCB0byBwYXkgdGhlyCAgZmVlIG9uIHRoZSBgZGVzdGAgKGFuZCBwb3NzaWJseSByZXNlcnZlKSBjaGFpbnMuTQEtIGBmZWVfYXNzZXRfaXRlbWA6IFRoZSBpbmRleCBpbnRvIGBhc3NldHNgIG9mIHRoZSBpdGVtIHdoaWNoIHNob3VsZCBiZSB1c2VkIHRvIHBheRwgIGZlZXMuRQEtIGB3ZWlnaHRfbGltaXRgOiBUaGUgcmVtb3RlLXNpZGUgd2VpZ2h0IGxpbWl0LCBpZiBhbnksIGZvciB0aGUgWENNIGZlZSBwdXJjaGFzZS5cbGltaXRlZF90ZWxlcG9ydF9hc3NldHMUARBkZXN0RQEBWEJveDxWZXJzaW9uZWRMb2NhdGlvbj4AASxiZW5lZmljaWFyeUUBAVhCb3g8VmVyc2lvbmVkTG9jYXRpb24+AAEYYXNzZXRziQYBUEJveDxWZXJzaW9uZWRBc3NldHM+AAE4ZmVlX2Fzc2V0X2l0ZW0QAQx1MzIAATB3ZWlnaHRfbGltaXQ9BgEsV2VpZ2h0TGltaXQACUgRAVRlbGVwb3J0IHNvbWUgYXNzZXRzIGZyb20gdGhlIGxvY2FsIGNoYWluIHRvIHNvbWUgZGVzdGluYXRpb24gY2hhaW4uAFEBRmVlIHBheW1lbnQgb24gdGhlIGRlc3RpbmF0aW9uIHNpZGUgaXMgbWFkZSBmcm9tIHRoZSBhc3NldCBpbiB0aGUgYGFzc2V0c2AgdmVjdG9yIG9mYQFpbmRleCBgZmVlX2Fzc2V0X2l0ZW1gLCB1cCB0byBlbm91Z2ggdG8gcGF5IGZvciBgd2VpZ2h0X2xpbWl0YCBvZiB3ZWlnaHQuIElmIG1vcmUgd2VpZ2h0WQFpcyBuZWVkZWQgdGhhbiBgd2VpZ2h0X2xpbWl0YCwgdGhlbiB0aGUgb3BlcmF0aW9uIHdpbGwgZmFpbCBhbmQgdGhlIHNlbnQgYXNzZXRzIG1heSBiZSBhdCByaXNrLgApAS0gYG9yaWdpbmA6IE11c3QgYmUgY2FwYWJsZSBvZiB3aXRoZHJhd2luZyB0aGUgYGFzc2V0c2AgYW5kIGV4ZWN1dGluZyBYQ00uJQEtIGBkZXN0YDogRGVzdGluYXRpb24gY29udGV4dCBmb3IgdGhlIGFzc2V0cy4gV2lsbCB0eXBpY2FsbHkgYmUgYFtQYXJlbnQsYQEgIFBhcmFjaGFpbiguLildYCB0byBzZW5kIGZyb20gcGFyYWNoYWluIHRvIHBhcmFjaGFpbiwgb3IgYFtQYXJhY2hhaW4oLi4pXWAgdG8gc2VuZCBmcm9tVCAgcmVsYXkgdG8gcGFyYWNoYWluLlUBLSBgYmVuZWZpY2lhcnlgOiBBIGJlbmVmaWNpYXJ5IGxvY2F0aW9uIGZvciB0aGUgYXNzZXRzIGluIHRoZSBjb250ZXh0IG9mIGBkZXN0YC4gV2lsbJggIGdlbmVyYWxseSBiZSBhbiBgQWNjb3VudElkMzJgIHZhbHVlLlkBLSBgYXNzZXRzYDogVGhlIGFzc2V0cyB0byBiZSB3aXRoZHJhd24uIFRoaXMgc2hvdWxkIGluY2x1ZGUgdGhlIGFzc2V0cyB1c2VkIHRvIHBheSB0aGVoICBmZWUgb24gdGhlIGBkZXN0YCBjaGFpbi5NAS0gYGZlZV9hc3NldF9pdGVtYDogVGhlIGluZGV4IGludG8gYGFzc2V0c2Agb2YgdGhlIGl0ZW0gd2hpY2ggc2hvdWxkIGJlIHVzZWQgdG8gcGF5HCAgZmVlcy5FAS0gYHdlaWdodF9saW1pdGA6IFRoZSByZW1vdGUtc2lkZSB3ZWlnaHQgbGltaXQsIGlmIGFueSwgZm9yIHRoZSBYQ00gZmVlIHB1cmNoYXNlLkBmb3JjZV9zdXNwZW5zaW9uBAEkc3VzcGVuZGVkIAEQYm9vbAAKEPRTZXQgb3IgdW5zZXQgdGhlIGdsb2JhbCBzdXNwZW5zaW9uIHN0YXRlIG9mIHRoZSBYQ00gZXhlY3V0b3IuANwtIGBvcmlnaW5gOiBNdXN0IGJlIGFuIG9yaWdpbiBzcGVjaWZpZWQgYnkgQWRtaW5PcmlnaW4u0C0gYHN1c3BlbmRlZGA6IGB0cnVlYCB0byBzdXNwZW5kLCBgZmFsc2VgIHRvIHJlc3VtZS48dHJhbnNmZXJfYXNzZXRzFAEQZGVzdEUBAVhCb3g8VmVyc2lvbmVkTG9jYXRpb24+AAEsYmVuZWZpY2lhcnlFAQFYQm94PFZlcnNpb25lZExvY2F0aW9uPgABGGFzc2V0c4kGAVBCb3g8VmVyc2lvbmVkQXNzZXRzPgABOGZlZV9hc3NldF9pdGVtEAEMdTMyAAEwd2VpZ2h0X2xpbWl0PQYBLFdlaWdodExpbWl0AAuEXQFUcmFuc2ZlciBzb21lIGFzc2V0cyBmcm9tIHRoZSBsb2NhbCBjaGFpbiB0byB0aGUgZGVzdGluYXRpb24gY2hhaW4gdGhyb3VnaCB0aGVpciBsb2NhbCzQZGVzdGluYXRpb24gb3IgcmVtb3RlIHJlc2VydmUsIG9yIHRocm91Z2ggdGVsZXBvcnRzLgBRAUZlZSBwYXltZW50IG9uIHRoZSBkZXN0aW5hdGlvbiBzaWRlIGlzIG1hZGUgZnJvbSB0aGUgYXNzZXQgaW4gdGhlIGBhc3NldHNgIHZlY3RvciBvZjUBaW5kZXggYGZlZV9hc3NldF9pdGVtYCAoaGVuY2UgcmVmZXJyZWQgdG8gYXMgYGZlZXNgKSwgdXAgdG8gZW5vdWdoIHRvIHBheSBmb3JBAWB3ZWlnaHRfbGltaXRgIG9mIHdlaWdodC4gSWYgbW9yZSB3ZWlnaHQgaXMgbmVlZGVkIHRoYW4gYHdlaWdodF9saW1pdGAsIHRoZW4gdGhl3G9wZXJhdGlvbiB3aWxsIGZhaWwgYW5kIHRoZSBzZW50IGFzc2V0cyBtYXkgYmUgYXQgcmlzay4AYQFgYXNzZXRzYCAoZXhjbHVkaW5nIGBmZWVzYCkgbXVzdCBoYXZlIHNhbWUgcmVzZXJ2ZSBsb2NhdGlvbiBvciBvdGhlcndpc2UgYmUgdGVsZXBvcnRhYmxlsHRvIGBkZXN0YCwgbm8gbGltaXRhdGlvbnMgaW1wb3NlZCBvbiBgZmVlc2AuTQEgLSBmb3IgbG9jYWwgcmVzZXJ2ZTogdHJhbnNmZXIgYXNzZXRzIHRvIHNvdmVyZWlnbiBhY2NvdW50IG9mIGRlc3RpbmF0aW9uIGNoYWluIGFuZE0BICAgZm9yd2FyZCBhIG5vdGlmaWNhdGlvbiBYQ00gdG8gYGRlc3RgIHRvIG1pbnQgYW5kIGRlcG9zaXQgcmVzZXJ2ZS1iYXNlZCBhc3NldHMgdG9EICAgYGJlbmVmaWNpYXJ5YC5hASAtIGZvciBkZXN0aW5hdGlvbiByZXNlcnZlOiBidXJuIGxvY2FsIGFzc2V0cyBhbmQgZm9yd2FyZCBhIG5vdGlmaWNhdGlvbiB0byBgZGVzdGAgY2hhaW5ZASAgIHRvIHdpdGhkcmF3IHRoZSByZXNlcnZlIGFzc2V0cyBmcm9tIHRoaXMgY2hhaW4ncyBzb3ZlcmVpZ24gYWNjb3VudCBhbmQgZGVwb3NpdCB0aGVtUCAgIHRvIGBiZW5lZmljaWFyeWAuXQEgLSBmb3IgcmVtb3RlIHJlc2VydmU6IGJ1cm4gbG9jYWwgYXNzZXRzLCBmb3J3YXJkIFhDTSB0byByZXNlcnZlIGNoYWluIHRvIG1vdmUgcmVzZXJ2ZXNdASAgIGZyb20gdGhpcyBjaGFpbidzIFNBIHRvIGBkZXN0YCBjaGFpbidzIFNBLCBhbmQgZm9yd2FyZCBhbm90aGVyIFhDTSB0byBgZGVzdGAgdG8gbWludNQgICBhbmQgZGVwb3NpdCByZXNlcnZlLWJhc2VkIGFzc2V0cyB0byBgYmVuZWZpY2lhcnlgLlEBIC0gZm9yIHRlbGVwb3J0czogYnVybiBsb2NhbCBhc3NldHMgYW5kIGZvcndhcmQgWENNIHRvIGBkZXN0YCBjaGFpbiB0byBtaW50L3RlbGVwb3J0sCAgIGFzc2V0cyBhbmQgZGVwb3NpdCB0aGVtIHRvIGBiZW5lZmljaWFyeWAuACkBLSBgb3JpZ2luYDogTXVzdCBiZSBjYXBhYmxlIG9mIHdpdGhkcmF3aW5nIHRoZSBgYXNzZXRzYCBhbmQgZXhlY3V0aW5nIFhDTS4tAS0gYGRlc3RgOiBEZXN0aW5hdGlvbiBjb250ZXh0IGZvciB0aGUgYXNzZXRzLiBXaWxsIHR5cGljYWxseSBiZSBgWDIoUGFyZW50LFUBICBQYXJhY2hhaW4oLi4pKWAgdG8gc2VuZCBmcm9tIHBhcmFjaGFpbiB0byBwYXJhY2hhaW4sIG9yIGBYMShQYXJhY2hhaW4oLi4pKWAgdG8gc2VuZGggIGZyb20gcmVsYXkgdG8gcGFyYWNoYWluLlUBLSBgYmVuZWZpY2lhcnlgOiBBIGJlbmVmaWNpYXJ5IGxvY2F0aW9uIGZvciB0aGUgYXNzZXRzIGluIHRoZSBjb250ZXh0IG9mIGBkZXN0YC4gV2lsbJggIGdlbmVyYWxseSBiZSBhbiBgQWNjb3VudElkMzJgIHZhbHVlLlkBLSBgYXNzZXRzYDogVGhlIGFzc2V0cyB0byBiZSB3aXRoZHJhd24uIFRoaXMgc2hvdWxkIGluY2x1ZGUgdGhlIGFzc2V0cyB1c2VkIHRvIHBheSB0aGXIICBmZWUgb24gdGhlIGBkZXN0YCAoYW5kIHBvc3NpYmx5IHJlc2VydmUpIGNoYWlucy5NAS0gYGZlZV9hc3NldF9pdGVtYDogVGhlIGluZGV4IGludG8gYGFzc2V0c2Agb2YgdGhlIGl0ZW0gd2hpY2ggc2hvdWxkIGJlIHVzZWQgdG8gcGF5HCAgZmVlcy5FAS0gYHdlaWdodF9saW1pdGA6IFRoZSByZW1vdGUtc2lkZSB3ZWlnaHQgbGltaXQsIGlmIGFueSwgZm9yIHRoZSBYQ00gZmVlIHB1cmNoYXNlLjBjbGFpbV9hc3NldHMIARhhc3NldHOJBgFQQm94PFZlcnNpb25lZEFzc2V0cz4AASxiZW5lZmljaWFyeUUBAVhCb3g8VmVyc2lvbmVkTG9jYXRpb24+AAwYVQFDbGFpbXMgYXNzZXRzIHRyYXBwZWQgb24gdGhpcyBwYWxsZXQgYmVjYXVzZSBvZiBsZWZ0b3ZlciBhc3NldHMgZHVyaW5nIFhDTSBleGVjdXRpb24uAKwtIGBvcmlnaW5gOiBBbnlvbmUgY2FuIGNhbGwgdGhpcyBleHRyaW5zaWMuXQEtIGBhc3NldHNgOiBUaGUgZXhhY3QgYXNzZXRzIHRoYXQgd2VyZSB0cmFwcGVkLiBVc2UgdGhlIHZlcnNpb24gdG8gc3BlY2lmeSB3aGF0IHZlcnNpb26Yd2FzIHRoZSBsYXRlc3Qgd2hlbiB0aGV5IHdlcmUgdHJhcHBlZC5FAS0gYGJlbmVmaWNpYXJ5YDogVGhlIGxvY2F0aW9uL2FjY291bnQgd2hlcmUgdGhlIGNsYWltZWQgYXNzZXRzIHdpbGwgYmUgZGVwb3NpdGVkLox0cmFuc2Zlcl9hc3NldHNfdXNpbmdfdHlwZV9hbmRfdGhlbhwBEGRlc3RFAQFYQm94PFZlcnNpb25lZExvY2F0aW9uPgABGGFzc2V0c4kGAVBCb3g8VmVyc2lvbmVkQXNzZXRzPgABUGFzc2V0c190cmFuc2Zlcl90eXBluQYBREJveDxUcmFuc2ZlclR5cGU+AAE4cmVtb3RlX2ZlZXNfaWS9BgFUQm94PFZlcnNpb25lZEFzc2V0SWQ+AAFIZmVlc190cmFuc2Zlcl90eXBluQYBREJveDxUcmFuc2ZlclR5cGU+AAFIY3VzdG9tX3hjbV9vbl9kZXN0iQUBVEJveDxWZXJzaW9uZWRYY208KCk+PgABMHdlaWdodF9saW1pdD0GASxXZWlnaHRMaW1pdAANwFUBVHJhbnNmZXIgYXNzZXRzIGZyb20gdGhlIGxvY2FsIGNoYWluIHRvIHRoZSBkZXN0aW5hdGlvbiBjaGFpbiB1c2luZyBleHBsaWNpdCB0cmFuc2Zlcmh0eXBlcyBmb3IgYXNzZXRzIGFuZCBmZWVzLgBZAWBhc3NldHNgIG11c3QgaGF2ZSBzYW1lIHJlc2VydmUgbG9jYXRpb24gb3IgbWF5IGJlIHRlbGVwb3J0YWJsZSB0byBgZGVzdGAuIENhbGxlciBtdXN07HByb3ZpZGUgdGhlIGBhc3NldHNfdHJhbnNmZXJfdHlwZWAgdG8gYmUgdXNlZCBmb3IgYGFzc2V0c2A6UQEgLSBgVHJhbnNmZXJUeXBlOjpMb2NhbFJlc2VydmVgOiB0cmFuc2ZlciBhc3NldHMgdG8gc292ZXJlaWduIGFjY291bnQgb2YgZGVzdGluYXRpb25NASAgIGNoYWluIGFuZCBmb3J3YXJkIGEgbm90aWZpY2F0aW9uIFhDTSB0byBgZGVzdGAgdG8gbWludCBhbmQgZGVwb3NpdCByZXNlcnZlLWJhc2VkbCAgIGFzc2V0cyB0byBgYmVuZWZpY2lhcnlgLlkBIC0gYFRyYW5zZmVyVHlwZTo6RGVzdGluYXRpb25SZXNlcnZlYDogYnVybiBsb2NhbCBhc3NldHMgYW5kIGZvcndhcmQgYSBub3RpZmljYXRpb24gdG9ZASAgIGBkZXN0YCBjaGFpbiB0byB3aXRoZHJhdyB0aGUgcmVzZXJ2ZSBhc3NldHMgZnJvbSB0aGlzIGNoYWluJ3Mgc292ZXJlaWduIGFjY291bnQgYW5khCAgIGRlcG9zaXQgdGhlbSB0byBgYmVuZWZpY2lhcnlgLlkBIC0gYFRyYW5zZmVyVHlwZTo6UmVtb3RlUmVzZXJ2ZShyZXNlcnZlKWA6IGJ1cm4gbG9jYWwgYXNzZXRzLCBmb3J3YXJkIFhDTSB0byBgcmVzZXJ2ZWBhASAgIGNoYWluIHRvIG1vdmUgcmVzZXJ2ZXMgZnJvbSB0aGlzIGNoYWluJ3MgU0EgdG8gYGRlc3RgIGNoYWluJ3MgU0EsIGFuZCBmb3J3YXJkIGFub3RoZXJVASAgIFhDTSB0byBgZGVzdGAgdG8gbWludCBhbmQgZGVwb3NpdCByZXNlcnZlLWJhc2VkIGFzc2V0cyB0byBgYmVuZWZpY2lhcnlgLiBUeXBpY2FsbHmUICAgdGhlIHJlbW90ZSBgcmVzZXJ2ZWAgaXMgQXNzZXQgSHViLkUBIC0gYFRyYW5zZmVyVHlwZTo6VGVsZXBvcnRgOiBidXJuIGxvY2FsIGFzc2V0cyBhbmQgZm9yd2FyZCBYQ00gdG8gYGRlc3RgIGNoYWluIHRv6CAgIG1pbnQvdGVsZXBvcnQgYXNzZXRzIGFuZCBkZXBvc2l0IHRoZW0gdG8gYGJlbmVmaWNpYXJ5YC4AVQFPbiB0aGUgZGVzdGluYXRpb24gY2hhaW4sIGFzIHdlbGwgYXMgYW55IGludGVybWVkaWFyeSBob3BzLCBgQnV5RXhlY3V0aW9uYCBpcyB1c2VkIHRvIQFidXkgZXhlY3V0aW9uIHVzaW5nIHRyYW5zZmVycmVkIGBhc3NldHNgIGlkZW50aWZpZWQgYnkgYHJlbW90ZV9mZWVzX2lkYC5ZAU1ha2Ugc3VyZSBlbm91Z2ggb2YgdGhlIHNwZWNpZmllZCBgcmVtb3RlX2ZlZXNfaWRgIGFzc2V0IGlzIGluY2x1ZGVkIGluIHRoZSBnaXZlbiBsaXN0YQFvZiBgYXNzZXRzYC4gYHJlbW90ZV9mZWVzX2lkYCBzaG91bGQgYmUgZW5vdWdoIHRvIHBheSBmb3IgYHdlaWdodF9saW1pdGAuIElmIG1vcmUgd2VpZ2h0WQFpcyBuZWVkZWQgdGhhbiBgd2VpZ2h0X2xpbWl0YCwgdGhlbiB0aGUgb3BlcmF0aW9uIHdpbGwgZmFpbCBhbmQgdGhlIHNlbnQgYXNzZXRzIG1heSBiZSBhdCByaXNrLgBFAWByZW1vdGVfZmVlc19pZGAgbWF5IHVzZSBkaWZmZXJlbnQgdHJhbnNmZXIgdHlwZSB0aGFuIHJlc3Qgb2YgYGFzc2V0c2AgYW5kIGNhbiBiZZxzcGVjaWZpZWQgdGhyb3VnaCBgZmVlc190cmFuc2Zlcl90eXBlYC4AYQFUaGUgY2FsbGVyIG5lZWRzIHRvIHNwZWNpZnkgd2hhdCBzaG91bGQgaGFwcGVuIHRvIHRoZSB0cmFuc2ZlcnJlZCBhc3NldHMgb25jZSB0aGV5IHJlYWNoQQF0aGUgYGRlc3RgIGNoYWluLiBUaGlzIGlzIGRvbmUgdGhyb3VnaCB0aGUgYGN1c3RvbV94Y21fb25fZGVzdGAgcGFyYW1ldGVyLCB3aGljaPxjb250YWlucyB0aGUgaW5zdHJ1Y3Rpb25zIHRvIGV4ZWN1dGUgb24gYGRlc3RgIGFzIGEgZmluYWwgc3RlcC58ICBUaGlzIGlzIHVzdWFsbHkgYXMgc2ltcGxlIGFzOlEBICBgWGNtKHZlYyFbRGVwb3NpdEFzc2V0IHsgYXNzZXRzOiBXaWxkKEFsbENvdW50ZWQoYXNzZXRzLmxlbigpKSksIGJlbmVmaWNpYXJ5IH1dKWAsMQEgIGJ1dCBjb3VsZCBiZSBzb21ldGhpbmcgbW9yZSBleG90aWMgbGlrZSBzZW5kaW5nIHRoZSBgYXNzZXRzYCBldmVuIGZ1cnRoZXIuACkBLSBgb3JpZ2luYDogTXVzdCBiZSBjYXBhYmxlIG9mIHdpdGhkcmF3aW5nIHRoZSBgYXNzZXRzYCBhbmQgZXhlY3V0aW5nIFhDTS4lAS0gYGRlc3RgOiBEZXN0aW5hdGlvbiBjb250ZXh0IGZvciB0aGUgYXNzZXRzLiBXaWxsIHR5cGljYWxseSBiZSBgW1BhcmVudCxhASAgUGFyYWNoYWluKC4uKV1gIHRvIHNlbmQgZnJvbSBwYXJhY2hhaW4gdG8gcGFyYWNoYWluLCBvciBgW1BhcmFjaGFpbiguLildYCB0byBzZW5kIGZyb209ASAgcmVsYXkgdG8gcGFyYWNoYWluLCBvciBgKHBhcmVudHM6IDIsIChHbG9iYWxDb25zZW5zdXMoLi4pLCAuLikpYCB0byBzZW5kIGZyb230ICBwYXJhY2hhaW4gYWNyb3NzIGEgYnJpZGdlIHRvIGFub3RoZXIgZWNvc3lzdGVtIGRlc3RpbmF0aW9uLlkBLSBgYXNzZXRzYDogVGhlIGFzc2V0cyB0byBiZSB3aXRoZHJhd24uIFRoaXMgc2hvdWxkIGluY2x1ZGUgdGhlIGFzc2V0cyB1c2VkIHRvIHBheSB0aGXIICBmZWUgb24gdGhlIGBkZXN0YCAoYW5kIHBvc3NpYmx5IHJlc2VydmUpIGNoYWlucy49AS0gYGFzc2V0c190cmFuc2Zlcl90eXBlYDogVGhlIFhDTSBgVHJhbnNmZXJUeXBlYCB1c2VkIHRvIHRyYW5zZmVyIHRoZSBgYXNzZXRzYC4hAS0gYHJlbW90ZV9mZWVzX2lkYDogT25lIG9mIHRoZSBpbmNsdWRlZCBgYXNzZXRzYCB0byBiZSB1c2VkIHRvIHBheSBmZWVzLkkBLSBgZmVlc190cmFuc2Zlcl90eXBlYDogVGhlIFhDTSBgVHJhbnNmZXJUeXBlYCB1c2VkIHRvIHRyYW5zZmVyIHRoZSBgZmVlc2AgYXNzZXRzLlkBLSBgY3VzdG9tX3hjbV9vbl9kZXN0YDogVGhlIFhDTSB0byBiZSBleGVjdXRlZCBvbiBgZGVzdGAgY2hhaW4gYXMgdGhlIGxhc3Qgc3RlcCBvZiB0aGVZASAgdHJhbnNmZXIsIHdoaWNoIGFsc28gZGV0ZXJtaW5lcyB3aGF0IGhhcHBlbnMgdG8gdGhlIGFzc2V0cyBvbiB0aGUgZGVzdGluYXRpb24gY2hhaW4uRQEtIGB3ZWlnaHRfbGltaXRgOiBUaGUgcmVtb3RlLXNpZGUgd2VpZ2h0IGxpbWl0LCBpZiBhbnksIGZvciB0aGUgWENNIGZlZSBwdXJjaGFzZS4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMuiQUIDHhjbTBWZXJzaW9uZWRYY20ELFJ1bnRpbWVDYWxsAAEMCFYyBACNBQFQdjI6OlhjbTxSdW50aW1lQ2FsbD4AAgAIVjMEAN0FAVB2Mzo6WGNtPFJ1bnRpbWVDYWxsPgADAAhWNAQAQQYBUHY0OjpYY208UnVudGltZUNhbGw+AAQAAI0FDAx4Y20IdjIMWGNtBCxSdW50aW1lQ2FsbAAABACRBQF0VmVjPEluc3RydWN0aW9uPFJ1bnRpbWVDYWxsPj4AAJEFAAAClQUAlQUMDHhjbQh2MixJbnN0cnVjdGlvbgQsUnVudGltZUNhbGwAAXA0V2l0aGRyYXdBc3NldAQAmQUBLE11bHRpQXNzZXRzAAAAVFJlc2VydmVBc3NldERlcG9zaXRlZAQAmQUBLE11bHRpQXNzZXRzAAEAWFJlY2VpdmVUZWxlcG9ydGVkQXNzZXQEAJkFASxNdWx0aUFzc2V0cwACADRRdWVyeVJlc3BvbnNlDAEgcXVlcnlfaWQsARxRdWVyeUlkAAEgcmVzcG9uc2W1BQEgUmVzcG9uc2UAAShtYXhfd2VpZ2h0LAEMdTY0AAMANFRyYW5zZmVyQXNzZXQIARhhc3NldHOZBQEsTXVsdGlBc3NldHMAASxiZW5lZmljaWFyeUkBATRNdWx0aUxvY2F0aW9uAAQAUFRyYW5zZmVyUmVzZXJ2ZUFzc2V0DAEYYXNzZXRzmQUBLE11bHRpQXNzZXRzAAEQZGVzdEkBATRNdWx0aUxvY2F0aW9uAAEMeGNtjQUBHFhjbTwoKT4ABQAgVHJhbnNhY3QMASxvcmlnaW5fdHlwZcUFAShPcmlnaW5LaW5kAAFYcmVxdWlyZV93ZWlnaHRfYXRfbW9zdCwBDHU2NAABEGNhbGzJBQFoRG91YmxlRW5jb2RlZDxSdW50aW1lQ2FsbD4ABgBkSHJtcE5ld0NoYW5uZWxPcGVuUmVxdWVzdAwBGHNlbmRlcuwBDHUzMgABQG1heF9tZXNzYWdlX3NpemXsAQx1MzIAATBtYXhfY2FwYWNpdHnsAQx1MzIABwBMSHJtcENoYW5uZWxBY2NlcHRlZAQBJHJlY2lwaWVudOwBDHUzMgAIAEhIcm1wQ2hhbm5lbENsb3NpbmcMASRpbml0aWF0b3LsAQx1MzIAARhzZW5kZXLsAQx1MzIAASRyZWNpcGllbnTsAQx1MzIACQAsQ2xlYXJPcmlnaW4ACgA0RGVzY2VuZE9yaWdpbgQATQEBVEludGVyaW9yTXVsdGlMb2NhdGlvbgALACxSZXBvcnRFcnJvcgwBIHF1ZXJ5X2lkLAEcUXVlcnlJZAABEGRlc3RJAQE0TXVsdGlMb2NhdGlvbgABTG1heF9yZXNwb25zZV93ZWlnaHQsAQx1NjQADAAwRGVwb3NpdEFzc2V0DAEYYXNzZXRzzQUBQE11bHRpQXNzZXRGaWx0ZXIAAShtYXhfYXNzZXRz7AEMdTMyAAEsYmVuZWZpY2lhcnlJAQE0TXVsdGlMb2NhdGlvbgANAExEZXBvc2l0UmVzZXJ2ZUFzc2V0EAEYYXNzZXRzzQUBQE11bHRpQXNzZXRGaWx0ZXIAAShtYXhfYXNzZXRz7AEMdTMyAAEQZGVzdEkBATRNdWx0aUxvY2F0aW9uAAEMeGNtjQUBHFhjbTwoKT4ADgA0RXhjaGFuZ2VBc3NldAgBEGdpdmXNBQFATXVsdGlBc3NldEZpbHRlcgABHHJlY2VpdmWZBQEsTXVsdGlBc3NldHMADwBcSW5pdGlhdGVSZXNlcnZlV2l0aGRyYXcMARhhc3NldHPNBQFATXVsdGlBc3NldEZpbHRlcgABHHJlc2VydmVJAQE0TXVsdGlMb2NhdGlvbgABDHhjbY0FARxYY208KCk+ABAAQEluaXRpYXRlVGVsZXBvcnQMARhhc3NldHPNBQFATXVsdGlBc3NldEZpbHRlcgABEGRlc3RJAQE0TXVsdGlMb2NhdGlvbgABDHhjbY0FARxYY208KCk+ABEAMFF1ZXJ5SG9sZGluZxABIHF1ZXJ5X2lkLAEcUXVlcnlJZAABEGRlc3RJAQE0TXVsdGlMb2NhdGlvbgABGGFzc2V0c80FAUBNdWx0aUFzc2V0RmlsdGVyAAFMbWF4X3Jlc3BvbnNlX3dlaWdodCwBDHU2NAASADBCdXlFeGVjdXRpb24IARBmZWVzoQUBKE11bHRpQXNzZXQAATB3ZWlnaHRfbGltaXTZBQEsV2VpZ2h0TGltaXQAEwA0UmVmdW5kU3VycGx1cwAUADxTZXRFcnJvckhhbmRsZXIEAI0FAUBYY208UnVudGltZUNhbGw+ABUALFNldEFwcGVuZGl4BACNBQFAWGNtPFJ1bnRpbWVDYWxsPgAWAChDbGVhckVycm9yABcAKENsYWltQXNzZXQIARhhc3NldHOZBQEsTXVsdGlBc3NldHMAARh0aWNrZXRJAQE0TXVsdGlMb2NhdGlvbgAYABBUcmFwBAAsAQx1NjQAGQBAU3Vic2NyaWJlVmVyc2lvbggBIHF1ZXJ5X2lkLAEcUXVlcnlJZAABTG1heF9yZXNwb25zZV93ZWlnaHQsAQx1NjQAGgBIVW5zdWJzY3JpYmVWZXJzaW9uABsAAJkFEAx4Y20IdjIobXVsdGlhc3NldCxNdWx0aUFzc2V0cwAABACdBQE8VmVjPE11bHRpQXNzZXQ+AACdBQAAAqEFAKEFEAx4Y20IdjIobXVsdGlhc3NldChNdWx0aUFzc2V0AAAIAQhpZKUFARxBc3NldElkAAEMZnVuqQUBLEZ1bmdpYmlsaXR5AAClBRAMeGNtCHYyKG11bHRpYXNzZXQcQXNzZXRJZAABCCBDb25jcmV0ZQQASQEBNE11bHRpTG9jYXRpb24AAAAgQWJzdHJhY3QEADgBHFZlYzx1OD4AAQAAqQUQDHhjbQh2MihtdWx0aWFzc2V0LEZ1bmdpYmlsaXR5AAEIIEZ1bmdpYmxlBAD8ARB1MTI4AAAALE5vbkZ1bmdpYmxlBACtBQE0QXNzZXRJbnN0YW5jZQABAACtBRAMeGNtCHYyKG11bHRpYXNzZXQ0QXNzZXRJbnN0YW5jZQABHCRVbmRlZmluZWQAAAAUSW5kZXgEAPwBEHUxMjgAAQAYQXJyYXk0BABIARxbdTg7IDRdAAIAGEFycmF5OAQAsQUBHFt1ODsgOF0AAwAcQXJyYXkxNgQAwAEgW3U4OyAxNl0ABAAcQXJyYXkzMgQABAEgW3U4OyAzMl0ABQAQQmxvYgQAOAEcVmVjPHU4PgAGAACxBQAAAwgAAAAIALUFDAx4Y20IdjIgUmVzcG9uc2UAARAQTnVsbAAAABhBc3NldHMEAJkFASxNdWx0aUFzc2V0cwABADxFeGVjdXRpb25SZXN1bHQEALkFAVBPcHRpb248KHUzMiwgRXJyb3IpPgACABxWZXJzaW9uBAAQAThzdXBlcjo6VmVyc2lvbgADAAC5BQQYT3B0aW9uBARUAb0FAQgQTm9uZQAAABBTb21lBAC9BQAAAQAAvQUAAAQIEMEFAMEFEAx4Y20IdjIYdHJhaXRzFEVycm9yAAFoIE92ZXJmbG93AAAANFVuaW1wbGVtZW50ZWQAAQBgVW50cnVzdGVkUmVzZXJ2ZUxvY2F0aW9uAAIAZFVudHJ1c3RlZFRlbGVwb3J0TG9jYXRpb24AAwBETXVsdGlMb2NhdGlvbkZ1bGwABABoTXVsdGlMb2NhdGlvbk5vdEludmVydGlibGUABQAkQmFkT3JpZ2luAAYAPEludmFsaWRMb2NhdGlvbgAHADRBc3NldE5vdEZvdW5kAAgAVEZhaWxlZFRvVHJhbnNhY3RBc3NldAAJADxOb3RXaXRoZHJhd2FibGUACgBITG9jYXRpb25DYW5ub3RIb2xkAAsAVEV4Y2VlZHNNYXhNZXNzYWdlU2l6ZQAMAFhEZXN0aW5hdGlvblVuc3VwcG9ydGVkAA0AJFRyYW5zcG9ydAAOAChVbnJvdXRhYmxlAA8AMFVua25vd25DbGFpbQAQADhGYWlsZWRUb0RlY29kZQARAEBNYXhXZWlnaHRJbnZhbGlkABIAOE5vdEhvbGRpbmdGZWVzABMAMFRvb0V4cGVuc2l2ZQAUABBUcmFwBAAwAQx1NjQAFQBMVW5oYW5kbGVkWGNtVmVyc2lvbgAWAEhXZWlnaHRMaW1pdFJlYWNoZWQEADABGFdlaWdodAAXABxCYXJyaWVyABgATFdlaWdodE5vdENvbXB1dGFibGUAGQAAxQUMDHhjbQh2MihPcmlnaW5LaW5kAAEQGE5hdGl2ZQAAAEBTb3ZlcmVpZ25BY2NvdW50AAEAJFN1cGVydXNlcgACAAxYY20AAwAAyQUMDHhjbThkb3VibGVfZW5jb2RlZDREb3VibGVFbmNvZGVkBARUAAAEARxlbmNvZGVkOAEcVmVjPHU4PgAAzQUQDHhjbQh2MihtdWx0aWFzc2V0QE11bHRpQXNzZXRGaWx0ZXIAAQggRGVmaW5pdGUEAJkFASxNdWx0aUFzc2V0cwAAABBXaWxkBADRBQE4V2lsZE11bHRpQXNzZXQAAQAA0QUQDHhjbQh2MihtdWx0aWFzc2V0OFdpbGRNdWx0aUFzc2V0AAEIDEFsbAAAABRBbGxPZggBCGlkpQUBHEFzc2V0SWQAAQxmdW7VBQE8V2lsZEZ1bmdpYmlsaXR5AAEAANUFEAx4Y20IdjIobXVsdGlhc3NldDxXaWxkRnVuZ2liaWxpdHkAAQggRnVuZ2libGUAAAAsTm9uRnVuZ2libGUAAQAA2QUMDHhjbQh2MixXZWlnaHRMaW1pdAABCCRVbmxpbWl0ZWQAAAAcTGltaXRlZAQALAEMdTY0AAEAAN0FDAx4Y20IdjMMWGNtBBBDYWxsAAAEAOEFAVhWZWM8SW5zdHJ1Y3Rpb248Q2FsbD4+AADhBQAAAuUFAOUFDAx4Y20IdjMsSW5zdHJ1Y3Rpb24EEENhbGwAAcA0V2l0aGRyYXdBc3NldAQA6QUBLE11bHRpQXNzZXRzAAAAVFJlc2VydmVBc3NldERlcG9zaXRlZAQA6QUBLE11bHRpQXNzZXRzAAEAWFJlY2VpdmVUZWxlcG9ydGVkQXNzZXQEAOkFASxNdWx0aUFzc2V0cwACADRRdWVyeVJlc3BvbnNlEAEgcXVlcnlfaWQsARxRdWVyeUlkAAEgcmVzcG9uc2X9BQEgUmVzcG9uc2UAAShtYXhfd2VpZ2h0KAEYV2VpZ2h0AAEccXVlcmllciUGAVRPcHRpb248TXVsdGlMb2NhdGlvbj4AAwA0VHJhbnNmZXJBc3NldAgBGGFzc2V0c+kFASxNdWx0aUFzc2V0cwABLGJlbmVmaWNpYXJ54AE0TXVsdGlMb2NhdGlvbgAEAFBUcmFuc2ZlclJlc2VydmVBc3NldAwBGGFzc2V0c+kFASxNdWx0aUFzc2V0cwABEGRlc3TgATRNdWx0aUxvY2F0aW9uAAEMeGNt3QUBHFhjbTwoKT4ABQAgVHJhbnNhY3QMASxvcmlnaW5fa2luZCkGAShPcmlnaW5LaW5kAAFYcmVxdWlyZV93ZWlnaHRfYXRfbW9zdCgBGFdlaWdodAABEGNhbGzJBQFMRG91YmxlRW5jb2RlZDxDYWxsPgAGAGRIcm1wTmV3Q2hhbm5lbE9wZW5SZXF1ZXN0DAEYc2VuZGVy7AEMdTMyAAFAbWF4X21lc3NhZ2Vfc2l6ZewBDHUzMgABMG1heF9jYXBhY2l0eewBDHUzMgAHAExIcm1wQ2hhbm5lbEFjY2VwdGVkBAEkcmVjaXBpZW507AEMdTMyAAgASEhybXBDaGFubmVsQ2xvc2luZwwBJGluaXRpYXRvcuwBDHUzMgABGHNlbmRlcuwBDHUzMgABJHJlY2lwaWVudOwBDHUzMgAJACxDbGVhck9yaWdpbgAKADREZXNjZW5kT3JpZ2luBADkAVRJbnRlcmlvck11bHRpTG9jYXRpb24ACwAsUmVwb3J0RXJyb3IEAC0GAURRdWVyeVJlc3BvbnNlSW5mbwAMADBEZXBvc2l0QXNzZXQIARhhc3NldHMxBgFATXVsdGlBc3NldEZpbHRlcgABLGJlbmVmaWNpYXJ54AE0TXVsdGlMb2NhdGlvbgANAExEZXBvc2l0UmVzZXJ2ZUFzc2V0DAEYYXNzZXRzMQYBQE11bHRpQXNzZXRGaWx0ZXIAARBkZXN04AE0TXVsdGlMb2NhdGlvbgABDHhjbd0FARxYY208KCk+AA4ANEV4Y2hhbmdlQXNzZXQMARBnaXZlMQYBQE11bHRpQXNzZXRGaWx0ZXIAARB3YW506QUBLE11bHRpQXNzZXRzAAEcbWF4aW1hbCABEGJvb2wADwBcSW5pdGlhdGVSZXNlcnZlV2l0aGRyYXcMARhhc3NldHMxBgFATXVsdGlBc3NldEZpbHRlcgABHHJlc2VydmXgATRNdWx0aUxvY2F0aW9uAAEMeGNt3QUBHFhjbTwoKT4AEABASW5pdGlhdGVUZWxlcG9ydAwBGGFzc2V0czEGAUBNdWx0aUFzc2V0RmlsdGVyAAEQZGVzdOABNE11bHRpTG9jYXRpb24AAQx4Y23dBQEcWGNtPCgpPgARADRSZXBvcnRIb2xkaW5nCAE0cmVzcG9uc2VfaW5mby0GAURRdWVyeVJlc3BvbnNlSW5mbwABGGFzc2V0czEGAUBNdWx0aUFzc2V0RmlsdGVyABIAMEJ1eUV4ZWN1dGlvbggBEGZlZXPxBQEoTXVsdGlBc3NldAABMHdlaWdodF9saW1pdD0GASxXZWlnaHRMaW1pdAATADRSZWZ1bmRTdXJwbHVzABQAPFNldEVycm9ySGFuZGxlcgQA3QUBJFhjbTxDYWxsPgAVACxTZXRBcHBlbmRpeAQA3QUBJFhjbTxDYWxsPgAWAChDbGVhckVycm9yABcAKENsYWltQXNzZXQIARhhc3NldHPpBQEsTXVsdGlBc3NldHMAARh0aWNrZXTgATRNdWx0aUxvY2F0aW9uABgAEFRyYXAEACwBDHU2NAAZAEBTdWJzY3JpYmVWZXJzaW9uCAEgcXVlcnlfaWQsARxRdWVyeUlkAAFMbWF4X3Jlc3BvbnNlX3dlaWdodCgBGFdlaWdodAAaAEhVbnN1YnNjcmliZVZlcnNpb24AGwAkQnVybkFzc2V0BADpBQEsTXVsdGlBc3NldHMAHAAsRXhwZWN0QXNzZXQEAOkFASxNdWx0aUFzc2V0cwAdADBFeHBlY3RPcmlnaW4EACUGAVRPcHRpb248TXVsdGlMb2NhdGlvbj4AHgAsRXhwZWN0RXJyb3IEAAEGAVBPcHRpb248KHUzMiwgRXJyb3IpPgAfAFBFeHBlY3RUcmFuc2FjdFN0YXR1cwQAHQYBOE1heWJlRXJyb3JDb2RlACAALFF1ZXJ5UGFsbGV0CAEsbW9kdWxlX25hbWU4ARxWZWM8dTg+AAE0cmVzcG9uc2VfaW5mby0GAURRdWVyeVJlc3BvbnNlSW5mbwAhADBFeHBlY3RQYWxsZXQUARRpbmRleOwBDHUzMgABEG5hbWU4ARxWZWM8dTg+AAEsbW9kdWxlX25hbWU4ARxWZWM8dTg+AAEsY3JhdGVfbWFqb3LsAQx1MzIAATxtaW5fY3JhdGVfbWlub3LsAQx1MzIAIgBQUmVwb3J0VHJhbnNhY3RTdGF0dXMEAC0GAURRdWVyeVJlc3BvbnNlSW5mbwAjAExDbGVhclRyYW5zYWN0U3RhdHVzACQAPFVuaXZlcnNhbE9yaWdpbgQA6AEgSnVuY3Rpb24AJQA0RXhwb3J0TWVzc2FnZQwBHG5ldHdvcmv0ASROZXR3b3JrSWQAASxkZXN0aW5hdGlvbuQBVEludGVyaW9yTXVsdGlMb2NhdGlvbgABDHhjbd0FARxYY208KCk+ACYAJExvY2tBc3NldAgBFGFzc2V08QUBKE11bHRpQXNzZXQAASB1bmxvY2tlcuABNE11bHRpTG9jYXRpb24AJwAsVW5sb2NrQXNzZXQIARRhc3NldPEFAShNdWx0aUFzc2V0AAEYdGFyZ2V04AE0TXVsdGlMb2NhdGlvbgAoADhOb3RlVW5sb2NrYWJsZQgBFGFzc2V08QUBKE11bHRpQXNzZXQAARRvd25lcuABNE11bHRpTG9jYXRpb24AKQA0UmVxdWVzdFVubG9jawgBFGFzc2V08QUBKE11bHRpQXNzZXQAARhsb2NrZXLgATRNdWx0aUxvY2F0aW9uACoALFNldEZlZXNNb2RlBAEwaml0X3dpdGhkcmF3IAEQYm9vbAArACBTZXRUb3BpYwQABAEgW3U4OyAzMl0ALAAoQ2xlYXJUb3BpYwAtACxBbGlhc09yaWdpbgQA4AE0TXVsdGlMb2NhdGlvbgAuADxVbnBhaWRFeGVjdXRpb24IATB3ZWlnaHRfbGltaXQ9BgEsV2VpZ2h0TGltaXQAATBjaGVja19vcmlnaW4lBgFUT3B0aW9uPE11bHRpTG9jYXRpb24+AC8AAOkFEAx4Y20IdjMobXVsdGlhc3NldCxNdWx0aUFzc2V0cwAABADtBQE8VmVjPE11bHRpQXNzZXQ+AADtBQAAAvEFAPEFEAx4Y20IdjMobXVsdGlhc3NldChNdWx0aUFzc2V0AAAIAQhpZAkBARxBc3NldElkAAEMZnVu9QUBLEZ1bmdpYmlsaXR5AAD1BRAMeGNtCHYzKG11bHRpYXNzZXQsRnVuZ2liaWxpdHkAAQggRnVuZ2libGUEAPwBEHUxMjgAAAAsTm9uRnVuZ2libGUEAPkFATRBc3NldEluc3RhbmNlAAEAAPkFEAx4Y20IdjMobXVsdGlhc3NldDRBc3NldEluc3RhbmNlAAEYJFVuZGVmaW5lZAAAABRJbmRleAQA/AEQdTEyOAABABhBcnJheTQEAEgBHFt1ODsgNF0AAgAYQXJyYXk4BACxBQEcW3U4OyA4XQADABxBcnJheTE2BADAASBbdTg7IDE2XQAEABxBcnJheTMyBAAEASBbdTg7IDMyXQAFAAD9BQwMeGNtCHYzIFJlc3BvbnNlAAEYEE51bGwAAAAYQXNzZXRzBADpBQEsTXVsdGlBc3NldHMAAQA8RXhlY3V0aW9uUmVzdWx0BAABBgFQT3B0aW9uPCh1MzIsIEVycm9yKT4AAgAcVmVyc2lvbgQAEAE4c3VwZXI6OlZlcnNpb24AAwAsUGFsbGV0c0luZm8EAA0GAZhCb3VuZGVkVmVjPFBhbGxldEluZm8sIE1heFBhbGxldHNJbmZvPgAEADhEaXNwYXRjaFJlc3VsdAQAHQYBOE1heWJlRXJyb3JDb2RlAAUAAAEGBBhPcHRpb24EBFQBBQYBCBBOb25lAAAAEFNvbWUEAAUGAAABAAAFBgAABAgQCQYACQYQDHhjbQh2Mxh0cmFpdHMURXJyb3IAAaAgT3ZlcmZsb3cAAAA0VW5pbXBsZW1lbnRlZAABAGBVbnRydXN0ZWRSZXNlcnZlTG9jYXRpb24AAgBkVW50cnVzdGVkVGVsZXBvcnRMb2NhdGlvbgADADBMb2NhdGlvbkZ1bGwABABUTG9jYXRpb25Ob3RJbnZlcnRpYmxlAAUAJEJhZE9yaWdpbgAGADxJbnZhbGlkTG9jYXRpb24ABwA0QXNzZXROb3RGb3VuZAAIAFRGYWlsZWRUb1RyYW5zYWN0QXNzZXQACQA8Tm90V2l0aGRyYXdhYmxlAAoASExvY2F0aW9uQ2Fubm90SG9sZAALAFRFeGNlZWRzTWF4TWVzc2FnZVNpemUADABYRGVzdGluYXRpb25VbnN1cHBvcnRlZAANACRUcmFuc3BvcnQADgAoVW5yb3V0YWJsZQAPADBVbmtub3duQ2xhaW0AEAA4RmFpbGVkVG9EZWNvZGUAEQBATWF4V2VpZ2h0SW52YWxpZAASADhOb3RIb2xkaW5nRmVlcwATADBUb29FeHBlbnNpdmUAFAAQVHJhcAQAMAEMdTY0ABUAQEV4cGVjdGF0aW9uRmFsc2UAFgA4UGFsbGV0Tm90Rm91bmQAFwAwTmFtZU1pc21hdGNoABgATFZlcnNpb25JbmNvbXBhdGlibGUAGQBQSG9sZGluZ1dvdWxkT3ZlcmZsb3cAGgAsRXhwb3J0RXJyb3IAGwA4UmVhbmNob3JGYWlsZWQAHAAYTm9EZWFsAB0AKEZlZXNOb3RNZXQAHgAkTG9ja0Vycm9yAB8AME5vUGVybWlzc2lvbgAgAChVbmFuY2hvcmVkACEAOE5vdERlcG9zaXRhYmxlACIATFVuaGFuZGxlZFhjbVZlcnNpb24AIwBIV2VpZ2h0TGltaXRSZWFjaGVkBAAoARhXZWlnaHQAJAAcQmFycmllcgAlAExXZWlnaHROb3RDb21wdXRhYmxlACYAREV4Y2VlZHNTdGFja0xpbWl0ACcAAA0GDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBEQYEUwAABAAZBgEYVmVjPFQ+AAARBgwMeGNtCHYzKFBhbGxldEluZm8AABgBFGluZGV47AEMdTMyAAEQbmFtZRUGAYBCb3VuZGVkVmVjPHU4LCBNYXhQYWxsZXROYW1lTGVuPgABLG1vZHVsZV9uYW1lFQYBgEJvdW5kZWRWZWM8dTgsIE1heFBhbGxldE5hbWVMZW4+AAEUbWFqb3LsAQx1MzIAARRtaW5vcuwBDHUzMgABFHBhdGNo7AEMdTMyAAAVBgxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAQgEUwAABAA4ARhWZWM8VD4AABkGAAACEQYAHQYMDHhjbQh2MzhNYXliZUVycm9yQ29kZQABDBxTdWNjZXNzAAAAFEVycm9yBAAhBgGMQm91bmRlZFZlYzx1OCwgTWF4RGlzcGF0Y2hFcnJvckxlbj4AAQA4VHJ1bmNhdGVkRXJyb3IEACEGAYxCb3VuZGVkVmVjPHU4LCBNYXhEaXNwYXRjaEVycm9yTGVuPgACAAAhBgxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAQgEUwAABAA4ARhWZWM8VD4AACUGBBhPcHRpb24EBFQB4AEIEE5vbmUAAAAQU29tZQQA4AAAAQAAKQYMDHhjbQh2MyhPcmlnaW5LaW5kAAEQGE5hdGl2ZQAAAEBTb3ZlcmVpZ25BY2NvdW50AAEAJFN1cGVydXNlcgACAAxYY20AAwAALQYMDHhjbQh2M0RRdWVyeVJlc3BvbnNlSW5mbwAADAEsZGVzdGluYXRpb27gATRNdWx0aUxvY2F0aW9uAAEgcXVlcnlfaWQsARxRdWVyeUlkAAEobWF4X3dlaWdodCgBGFdlaWdodAAAMQYQDHhjbQh2MyhtdWx0aWFzc2V0QE11bHRpQXNzZXRGaWx0ZXIAAQggRGVmaW5pdGUEAOkFASxNdWx0aUFzc2V0cwAAABBXaWxkBAA1BgE4V2lsZE11bHRpQXNzZXQAAQAANQYQDHhjbQh2MyhtdWx0aWFzc2V0OFdpbGRNdWx0aUFzc2V0AAEQDEFsbAAAABRBbGxPZggBCGlkCQEBHEFzc2V0SWQAAQxmdW45BgE8V2lsZEZ1bmdpYmlsaXR5AAEAKEFsbENvdW50ZWQEAOwBDHUzMgACADBBbGxPZkNvdW50ZWQMAQhpZAkBARxBc3NldElkAAEMZnVuOQYBPFdpbGRGdW5naWJpbGl0eQABFGNvdW507AEMdTMyAAMAADkGEAx4Y20IdjMobXVsdGlhc3NldDxXaWxkRnVuZ2liaWxpdHkAAQggRnVuZ2libGUAAAAsTm9uRnVuZ2libGUAAQAAPQYMDHhjbQh2MyxXZWlnaHRMaW1pdAABCCRVbmxpbWl0ZWQAAAAcTGltaXRlZAQAKAEYV2VpZ2h0AAEAAEEGDCxzdGFnaW5nX3hjbQh2NAxYY20EEENhbGwAAAQARQYBWFZlYzxJbnN0cnVjdGlvbjxDYWxsPj4AAEUGAAACSQYASQYMLHN0YWdpbmdfeGNtCHY0LEluc3RydWN0aW9uBBBDYWxsAAHANFdpdGhkcmF3QXNzZXQEAE0GARhBc3NldHMAAABUUmVzZXJ2ZUFzc2V0RGVwb3NpdGVkBABNBgEYQXNzZXRzAAEAWFJlY2VpdmVUZWxlcG9ydGVkQXNzZXQEAE0GARhBc3NldHMAAgA0UXVlcnlSZXNwb25zZRABIHF1ZXJ5X2lkLAEcUXVlcnlJZAABIHJlc3BvbnNlYQYBIFJlc3BvbnNlAAEobWF4X3dlaWdodCgBGFdlaWdodAABHHF1ZXJpZXJ1BgFAT3B0aW9uPExvY2F0aW9uPgADADRUcmFuc2ZlckFzc2V0CAEYYXNzZXRzTQYBGEFzc2V0cwABLGJlbmVmaWNpYXJ5DQEBIExvY2F0aW9uAAQAUFRyYW5zZmVyUmVzZXJ2ZUFzc2V0DAEYYXNzZXRzTQYBGEFzc2V0cwABEGRlc3QNAQEgTG9jYXRpb24AAQx4Y21BBgEcWGNtPCgpPgAFACBUcmFuc2FjdAwBLG9yaWdpbl9raW5kKQYBKE9yaWdpbktpbmQAAVhyZXF1aXJlX3dlaWdodF9hdF9tb3N0KAEYV2VpZ2h0AAEQY2FsbMkFAUxEb3VibGVFbmNvZGVkPENhbGw+AAYAZEhybXBOZXdDaGFubmVsT3BlblJlcXVlc3QMARhzZW5kZXLsAQx1MzIAAUBtYXhfbWVzc2FnZV9zaXpl7AEMdTMyAAEwbWF4X2NhcGFjaXR57AEMdTMyAAcATEhybXBDaGFubmVsQWNjZXB0ZWQEASRyZWNpcGllbnTsAQx1MzIACABISHJtcENoYW5uZWxDbG9zaW5nDAEkaW5pdGlhdG9y7AEMdTMyAAEYc2VuZGVy7AEMdTMyAAEkcmVjaXBpZW507AEMdTMyAAkALENsZWFyT3JpZ2luAAoANERlc2NlbmRPcmlnaW4EABEBAUBJbnRlcmlvckxvY2F0aW9uAAsALFJlcG9ydEVycm9yBAB5BgFEUXVlcnlSZXNwb25zZUluZm8ADAAwRGVwb3NpdEFzc2V0CAEYYXNzZXRzfQYBLEFzc2V0RmlsdGVyAAEsYmVuZWZpY2lhcnkNAQEgTG9jYXRpb24ADQBMRGVwb3NpdFJlc2VydmVBc3NldAwBGGFzc2V0c30GASxBc3NldEZpbHRlcgABEGRlc3QNAQEgTG9jYXRpb24AAQx4Y21BBgEcWGNtPCgpPgAOADRFeGNoYW5nZUFzc2V0DAEQZ2l2ZX0GASxBc3NldEZpbHRlcgABEHdhbnRNBgEYQXNzZXRzAAEcbWF4aW1hbCABEGJvb2wADwBcSW5pdGlhdGVSZXNlcnZlV2l0aGRyYXcMARhhc3NldHN9BgEsQXNzZXRGaWx0ZXIAARxyZXNlcnZlDQEBIExvY2F0aW9uAAEMeGNtQQYBHFhjbTwoKT4AEABASW5pdGlhdGVUZWxlcG9ydAwBGGFzc2V0c30GASxBc3NldEZpbHRlcgABEGRlc3QNAQEgTG9jYXRpb24AAQx4Y21BBgEcWGNtPCgpPgARADRSZXBvcnRIb2xkaW5nCAE0cmVzcG9uc2VfaW5mb3kGAURRdWVyeVJlc3BvbnNlSW5mbwABGGFzc2V0c30GASxBc3NldEZpbHRlcgASADBCdXlFeGVjdXRpb24IARBmZWVzVQYBFEFzc2V0AAEwd2VpZ2h0X2xpbWl0PQYBLFdlaWdodExpbWl0ABMANFJlZnVuZFN1cnBsdXMAFAA8U2V0RXJyb3JIYW5kbGVyBABBBgEkWGNtPENhbGw+ABUALFNldEFwcGVuZGl4BABBBgEkWGNtPENhbGw+ABYAKENsZWFyRXJyb3IAFwAoQ2xhaW1Bc3NldAgBGGFzc2V0c00GARhBc3NldHMAARh0aWNrZXQNAQEgTG9jYXRpb24AGAAQVHJhcAQALAEMdTY0ABkAQFN1YnNjcmliZVZlcnNpb24IASBxdWVyeV9pZCwBHFF1ZXJ5SWQAAUxtYXhfcmVzcG9uc2Vfd2VpZ2h0KAEYV2VpZ2h0ABoASFVuc3Vic2NyaWJlVmVyc2lvbgAbACRCdXJuQXNzZXQEAE0GARhBc3NldHMAHAAsRXhwZWN0QXNzZXQEAE0GARhBc3NldHMAHQAwRXhwZWN0T3JpZ2luBAB1BgFAT3B0aW9uPExvY2F0aW9uPgAeACxFeHBlY3RFcnJvcgQAAQYBUE9wdGlvbjwodTMyLCBFcnJvcik+AB8AUEV4cGVjdFRyYW5zYWN0U3RhdHVzBAAdBgE4TWF5YmVFcnJvckNvZGUAIAAsUXVlcnlQYWxsZXQIASxtb2R1bGVfbmFtZTgBHFZlYzx1OD4AATRyZXNwb25zZV9pbmZveQYBRFF1ZXJ5UmVzcG9uc2VJbmZvACEAMEV4cGVjdFBhbGxldBQBFGluZGV47AEMdTMyAAEQbmFtZTgBHFZlYzx1OD4AASxtb2R1bGVfbmFtZTgBHFZlYzx1OD4AASxjcmF0ZV9tYWpvcuwBDHUzMgABPG1pbl9jcmF0ZV9taW5vcuwBDHUzMgAiAFBSZXBvcnRUcmFuc2FjdFN0YXR1cwQAeQYBRFF1ZXJ5UmVzcG9uc2VJbmZvACMATENsZWFyVHJhbnNhY3RTdGF0dXMAJAA8VW5pdmVyc2FsT3JpZ2luBAAZAQEgSnVuY3Rpb24AJQA0RXhwb3J0TWVzc2FnZQwBHG5ldHdvcmshAQEkTmV0d29ya0lkAAEsZGVzdGluYXRpb24RAQFASW50ZXJpb3JMb2NhdGlvbgABDHhjbUEGARxYY208KCk+ACYAJExvY2tBc3NldAgBFGFzc2V0VQYBFEFzc2V0AAEgdW5sb2NrZXINAQEgTG9jYXRpb24AJwAsVW5sb2NrQXNzZXQIARRhc3NldFUGARRBc3NldAABGHRhcmdldA0BASBMb2NhdGlvbgAoADhOb3RlVW5sb2NrYWJsZQgBFGFzc2V0VQYBFEFzc2V0AAEUb3duZXINAQEgTG9jYXRpb24AKQA0UmVxdWVzdFVubG9jawgBFGFzc2V0VQYBFEFzc2V0AAEYbG9ja2VyDQEBIExvY2F0aW9uACoALFNldEZlZXNNb2RlBAEwaml0X3dpdGhkcmF3IAEQYm9vbAArACBTZXRUb3BpYwQABAEgW3U4OyAzMl0ALAAoQ2xlYXJUb3BpYwAtACxBbGlhc09yaWdpbgQADQEBIExvY2F0aW9uAC4APFVucGFpZEV4ZWN1dGlvbggBMHdlaWdodF9saW1pdD0GASxXZWlnaHRMaW1pdAABMGNoZWNrX29yaWdpbnUGAUBPcHRpb248TG9jYXRpb24+AC8AAE0GECxzdGFnaW5nX3hjbQh2NBRhc3NldBhBc3NldHMAAAQAUQYBKFZlYzxBc3NldD4AAFEGAAACVQYAVQYQLHN0YWdpbmdfeGNtCHY0FGFzc2V0FEFzc2V0AAAIAQhpZEEBARxBc3NldElkAAEMZnVuWQYBLEZ1bmdpYmlsaXR5AABZBhAsc3RhZ2luZ194Y20IdjQUYXNzZXQsRnVuZ2liaWxpdHkAAQggRnVuZ2libGUEAPwBEHUxMjgAAAAsTm9uRnVuZ2libGUEAF0GATRBc3NldEluc3RhbmNlAAEAAF0GECxzdGFnaW5nX3hjbQh2NBRhc3NldDRBc3NldEluc3RhbmNlAAEYJFVuZGVmaW5lZAAAABRJbmRleAQA/AEQdTEyOAABABhBcnJheTQEAEgBHFt1ODsgNF0AAgAYQXJyYXk4BACxBQEcW3U4OyA4XQADABxBcnJheTE2BADAASBbdTg7IDE2XQAEABxBcnJheTMyBAAEASBbdTg7IDMyXQAFAABhBgwsc3RhZ2luZ194Y20IdjQgUmVzcG9uc2UAARgQTnVsbAAAABhBc3NldHMEAE0GARhBc3NldHMAAQA8RXhlY3V0aW9uUmVzdWx0BAABBgFQT3B0aW9uPCh1MzIsIEVycm9yKT4AAgAcVmVyc2lvbgQAEAE4c3VwZXI6OlZlcnNpb24AAwAsUGFsbGV0c0luZm8EAGUGAZhCb3VuZGVkVmVjPFBhbGxldEluZm8sIE1heFBhbGxldHNJbmZvPgAEADhEaXNwYXRjaFJlc3VsdAQAHQYBOE1heWJlRXJyb3JDb2RlAAUAAGUGDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBaQYEUwAABABxBgEYVmVjPFQ+AABpBgwsc3RhZ2luZ194Y20IdjQoUGFsbGV0SW5mbwAAGAEUaW5kZXjsAQx1MzIAARBuYW1lbQYBgEJvdW5kZWRWZWM8dTgsIE1heFBhbGxldE5hbWVMZW4+AAEsbW9kdWxlX25hbWVtBgGAQm91bmRlZFZlYzx1OCwgTWF4UGFsbGV0TmFtZUxlbj4AARRtYWpvcuwBDHUzMgABFG1pbm9y7AEMdTMyAAEUcGF0Y2jsAQx1MzIAAG0GDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBCARTAAAEADgBGFZlYzxUPgAAcQYAAAJpBgB1BgQYT3B0aW9uBARUAQ0BAQgQTm9uZQAAABBTb21lBAANAQAAAQAAeQYMLHN0YWdpbmdfeGNtCHY0RFF1ZXJ5UmVzcG9uc2VJbmZvAAAMASxkZXN0aW5hdGlvbg0BASBMb2NhdGlvbgABIHF1ZXJ5X2lkLAEcUXVlcnlJZAABKG1heF93ZWlnaHQoARhXZWlnaHQAAH0GECxzdGFnaW5nX3hjbQh2NBRhc3NldCxBc3NldEZpbHRlcgABCCBEZWZpbml0ZQQATQYBGEFzc2V0cwAAABBXaWxkBACBBgEkV2lsZEFzc2V0AAEAAIEGECxzdGFnaW5nX3hjbQh2NBRhc3NldCRXaWxkQXNzZXQAARAMQWxsAAAAFEFsbE9mCAEIaWRBAQEcQXNzZXRJZAABDGZ1boUGATxXaWxkRnVuZ2liaWxpdHkAAQAoQWxsQ291bnRlZAQA7AEMdTMyAAIAMEFsbE9mQ291bnRlZAwBCGlkQQEBHEFzc2V0SWQAAQxmdW6FBgE8V2lsZEZ1bmdpYmlsaXR5AAEUY291bnTsAQx1MzIAAwAAhQYQLHN0YWdpbmdfeGNtCHY0FGFzc2V0PFdpbGRGdW5naWJpbGl0eQABCCBGdW5naWJsZQAAACxOb25GdW5naWJsZQABAACJBggMeGNtPFZlcnNpb25lZEFzc2V0cwABDAhWMgQAmQUBPHYyOjpNdWx0aUFzc2V0cwABAAhWMwQA6QUBPHYzOjpNdWx0aUFzc2V0cwADAAhWNAQATQYBKHY0OjpBc3NldHMABAAAjQYIDHhjbTBWZXJzaW9uZWRYY20ELFJ1bnRpbWVDYWxsAAEMCFYyBACRBgFQdjI6OlhjbTxSdW50aW1lQ2FsbD4AAgAIVjMEAKEGAVB2Mzo6WGNtPFJ1bnRpbWVDYWxsPgADAAhWNAQArQYBUHY0OjpYY208UnVudGltZUNhbGw+AAQAAJEGDAx4Y20IdjIMWGNtBCxSdW50aW1lQ2FsbAAABACVBgF0VmVjPEluc3RydWN0aW9uPFJ1bnRpbWVDYWxsPj4AAJUGAAACmQYAmQYMDHhjbQh2MixJbnN0cnVjdGlvbgQsUnVudGltZUNhbGwAAXA0V2l0aGRyYXdBc3NldAQAmQUBLE11bHRpQXNzZXRzAAAAVFJlc2VydmVBc3NldERlcG9zaXRlZAQAmQUBLE11bHRpQXNzZXRzAAEAWFJlY2VpdmVUZWxlcG9ydGVkQXNzZXQEAJkFASxNdWx0aUFzc2V0cwACADRRdWVyeVJlc3BvbnNlDAEgcXVlcnlfaWQsARxRdWVyeUlkAAEgcmVzcG9uc2W1BQEgUmVzcG9uc2UAAShtYXhfd2VpZ2h0LAEMdTY0AAMANFRyYW5zZmVyQXNzZXQIARhhc3NldHOZBQEsTXVsdGlBc3NldHMAASxiZW5lZmljaWFyeUkBATRNdWx0aUxvY2F0aW9uAAQAUFRyYW5zZmVyUmVzZXJ2ZUFzc2V0DAEYYXNzZXRzmQUBLE11bHRpQXNzZXRzAAEQZGVzdEkBATRNdWx0aUxvY2F0aW9uAAEMeGNtjQUBHFhjbTwoKT4ABQAgVHJhbnNhY3QMASxvcmlnaW5fdHlwZcUFAShPcmlnaW5LaW5kAAFYcmVxdWlyZV93ZWlnaHRfYXRfbW9zdCwBDHU2NAABEGNhbGydBgFoRG91YmxlRW5jb2RlZDxSdW50aW1lQ2FsbD4ABgBkSHJtcE5ld0NoYW5uZWxPcGVuUmVxdWVzdAwBGHNlbmRlcuwBDHUzMgABQG1heF9tZXNzYWdlX3NpemXsAQx1MzIAATBtYXhfY2FwYWNpdHnsAQx1MzIABwBMSHJtcENoYW5uZWxBY2NlcHRlZAQBJHJlY2lwaWVudOwBDHUzMgAIAEhIcm1wQ2hhbm5lbENsb3NpbmcMASRpbml0aWF0b3LsAQx1MzIAARhzZW5kZXLsAQx1MzIAASRyZWNpcGllbnTsAQx1MzIACQAsQ2xlYXJPcmlnaW4ACgA0RGVzY2VuZE9yaWdpbgQATQEBVEludGVyaW9yTXVsdGlMb2NhdGlvbgALACxSZXBvcnRFcnJvcgwBIHF1ZXJ5X2lkLAEcUXVlcnlJZAABEGRlc3RJAQE0TXVsdGlMb2NhdGlvbgABTG1heF9yZXNwb25zZV93ZWlnaHQsAQx1NjQADAAwRGVwb3NpdEFzc2V0DAEYYXNzZXRzzQUBQE11bHRpQXNzZXRGaWx0ZXIAAShtYXhfYXNzZXRz7AEMdTMyAAEsYmVuZWZpY2lhcnlJAQE0TXVsdGlMb2NhdGlvbgANAExEZXBvc2l0UmVzZXJ2ZUFzc2V0EAEYYXNzZXRzzQUBQE11bHRpQXNzZXRGaWx0ZXIAAShtYXhfYXNzZXRz7AEMdTMyAAEQZGVzdEkBATRNdWx0aUxvY2F0aW9uAAEMeGNtjQUBHFhjbTwoKT4ADgA0RXhjaGFuZ2VBc3NldAgBEGdpdmXNBQFATXVsdGlBc3NldEZpbHRlcgABHHJlY2VpdmWZBQEsTXVsdGlBc3NldHMADwBcSW5pdGlhdGVSZXNlcnZlV2l0aGRyYXcMARhhc3NldHPNBQFATXVsdGlBc3NldEZpbHRlcgABHHJlc2VydmVJAQE0TXVsdGlMb2NhdGlvbgABDHhjbY0FARxYY208KCk+ABAAQEluaXRpYXRlVGVsZXBvcnQMARhhc3NldHPNBQFATXVsdGlBc3NldEZpbHRlcgABEGRlc3RJAQE0TXVsdGlMb2NhdGlvbgABDHhjbY0FARxYY208KCk+ABEAMFF1ZXJ5SG9sZGluZxABIHF1ZXJ5X2lkLAEcUXVlcnlJZAABEGRlc3RJAQE0TXVsdGlMb2NhdGlvbgABGGFzc2V0c80FAUBNdWx0aUFzc2V0RmlsdGVyAAFMbWF4X3Jlc3BvbnNlX3dlaWdodCwBDHU2NAASADBCdXlFeGVjdXRpb24IARBmZWVzoQUBKE11bHRpQXNzZXQAATB3ZWlnaHRfbGltaXTZBQEsV2VpZ2h0TGltaXQAEwA0UmVmdW5kU3VycGx1cwAUADxTZXRFcnJvckhhbmRsZXIEAJEGAUBYY208UnVudGltZUNhbGw+ABUALFNldEFwcGVuZGl4BACRBgFAWGNtPFJ1bnRpbWVDYWxsPgAWAChDbGVhckVycm9yABcAKENsYWltQXNzZXQIARhhc3NldHOZBQEsTXVsdGlBc3NldHMAARh0aWNrZXRJAQE0TXVsdGlMb2NhdGlvbgAYABBUcmFwBAAsAQx1NjQAGQBAU3Vic2NyaWJlVmVyc2lvbggBIHF1ZXJ5X2lkLAEcUXVlcnlJZAABTG1heF9yZXNwb25zZV93ZWlnaHQsAQx1NjQAGgBIVW5zdWJzY3JpYmVWZXJzaW9uABsAAJ0GDAx4Y204ZG91YmxlX2VuY29kZWQ0RG91YmxlRW5jb2RlZAQEVAAABAEcZW5jb2RlZDgBHFZlYzx1OD4AAKEGDAx4Y20IdjMMWGNtBBBDYWxsAAAEAKUGAVhWZWM8SW5zdHJ1Y3Rpb248Q2FsbD4+AAClBgAAAqkGAKkGDAx4Y20IdjMsSW5zdHJ1Y3Rpb24EEENhbGwAAcA0V2l0aGRyYXdBc3NldAQA6QUBLE11bHRpQXNzZXRzAAAAVFJlc2VydmVBc3NldERlcG9zaXRlZAQA6QUBLE11bHRpQXNzZXRzAAEAWFJlY2VpdmVUZWxlcG9ydGVkQXNzZXQEAOkFASxNdWx0aUFzc2V0cwACADRRdWVyeVJlc3BvbnNlEAEgcXVlcnlfaWQsARxRdWVyeUlkAAEgcmVzcG9uc2X9BQEgUmVzcG9uc2UAAShtYXhfd2VpZ2h0KAEYV2VpZ2h0AAEccXVlcmllciUGAVRPcHRpb248TXVsdGlMb2NhdGlvbj4AAwA0VHJhbnNmZXJBc3NldAgBGGFzc2V0c+kFASxNdWx0aUFzc2V0cwABLGJlbmVmaWNpYXJ54AE0TXVsdGlMb2NhdGlvbgAEAFBUcmFuc2ZlclJlc2VydmVBc3NldAwBGGFzc2V0c+kFASxNdWx0aUFzc2V0cwABEGRlc3TgATRNdWx0aUxvY2F0aW9uAAEMeGNt3QUBHFhjbTwoKT4ABQAgVHJhbnNhY3QMASxvcmlnaW5fa2luZCkGAShPcmlnaW5LaW5kAAFYcmVxdWlyZV93ZWlnaHRfYXRfbW9zdCgBGFdlaWdodAABEGNhbGydBgFMRG91YmxlRW5jb2RlZDxDYWxsPgAGAGRIcm1wTmV3Q2hhbm5lbE9wZW5SZXF1ZXN0DAEYc2VuZGVy7AEMdTMyAAFAbWF4X21lc3NhZ2Vfc2l6ZewBDHUzMgABMG1heF9jYXBhY2l0eewBDHUzMgAHAExIcm1wQ2hhbm5lbEFjY2VwdGVkBAEkcmVjaXBpZW507AEMdTMyAAgASEhybXBDaGFubmVsQ2xvc2luZwwBJGluaXRpYXRvcuwBDHUzMgABGHNlbmRlcuwBDHUzMgABJHJlY2lwaWVudOwBDHUzMgAJACxDbGVhck9yaWdpbgAKADREZXNjZW5kT3JpZ2luBADkAVRJbnRlcmlvck11bHRpTG9jYXRpb24ACwAsUmVwb3J0RXJyb3IEAC0GAURRdWVyeVJlc3BvbnNlSW5mbwAMADBEZXBvc2l0QXNzZXQIARhhc3NldHMxBgFATXVsdGlBc3NldEZpbHRlcgABLGJlbmVmaWNpYXJ54AE0TXVsdGlMb2NhdGlvbgANAExEZXBvc2l0UmVzZXJ2ZUFzc2V0DAEYYXNzZXRzMQYBQE11bHRpQXNzZXRGaWx0ZXIAARBkZXN04AE0TXVsdGlMb2NhdGlvbgABDHhjbd0FARxYY208KCk+AA4ANEV4Y2hhbmdlQXNzZXQMARBnaXZlMQYBQE11bHRpQXNzZXRGaWx0ZXIAARB3YW506QUBLE11bHRpQXNzZXRzAAEcbWF4aW1hbCABEGJvb2wADwBcSW5pdGlhdGVSZXNlcnZlV2l0aGRyYXcMARhhc3NldHMxBgFATXVsdGlBc3NldEZpbHRlcgABHHJlc2VydmXgATRNdWx0aUxvY2F0aW9uAAEMeGNt3QUBHFhjbTwoKT4AEABASW5pdGlhdGVUZWxlcG9ydAwBGGFzc2V0czEGAUBNdWx0aUFzc2V0RmlsdGVyAAEQZGVzdOABNE11bHRpTG9jYXRpb24AAQx4Y23dBQEcWGNtPCgpPgARADRSZXBvcnRIb2xkaW5nCAE0cmVzcG9uc2VfaW5mby0GAURRdWVyeVJlc3BvbnNlSW5mbwABGGFzc2V0czEGAUBNdWx0aUFzc2V0RmlsdGVyABIAMEJ1eUV4ZWN1dGlvbggBEGZlZXPxBQEoTXVsdGlBc3NldAABMHdlaWdodF9saW1pdD0GASxXZWlnaHRMaW1pdAATADRSZWZ1bmRTdXJwbHVzABQAPFNldEVycm9ySGFuZGxlcgQAoQYBJFhjbTxDYWxsPgAVACxTZXRBcHBlbmRpeAQAoQYBJFhjbTxDYWxsPgAWAChDbGVhckVycm9yABcAKENsYWltQXNzZXQIARhhc3NldHPpBQEsTXVsdGlBc3NldHMAARh0aWNrZXTgATRNdWx0aUxvY2F0aW9uABgAEFRyYXAEACwBDHU2NAAZAEBTdWJzY3JpYmVWZXJzaW9uCAEgcXVlcnlfaWQsARxRdWVyeUlkAAFMbWF4X3Jlc3BvbnNlX3dlaWdodCgBGFdlaWdodAAaAEhVbnN1YnNjcmliZVZlcnNpb24AGwAkQnVybkFzc2V0BADpBQEsTXVsdGlBc3NldHMAHAAsRXhwZWN0QXNzZXQEAOkFASxNdWx0aUFzc2V0cwAdADBFeHBlY3RPcmlnaW4EACUGAVRPcHRpb248TXVsdGlMb2NhdGlvbj4AHgAsRXhwZWN0RXJyb3IEAAEGAVBPcHRpb248KHUzMiwgRXJyb3IpPgAfAFBFeHBlY3RUcmFuc2FjdFN0YXR1cwQAHQYBOE1heWJlRXJyb3JDb2RlACAALFF1ZXJ5UGFsbGV0CAEsbW9kdWxlX25hbWU4ARxWZWM8dTg+AAE0cmVzcG9uc2VfaW5mby0GAURRdWVyeVJlc3BvbnNlSW5mbwAhADBFeHBlY3RQYWxsZXQUARRpbmRleOwBDHUzMgABEG5hbWU4ARxWZWM8dTg+AAEsbW9kdWxlX25hbWU4ARxWZWM8dTg+AAEsY3JhdGVfbWFqb3LsAQx1MzIAATxtaW5fY3JhdGVfbWlub3LsAQx1MzIAIgBQUmVwb3J0VHJhbnNhY3RTdGF0dXMEAC0GAURRdWVyeVJlc3BvbnNlSW5mbwAjAExDbGVhclRyYW5zYWN0U3RhdHVzACQAPFVuaXZlcnNhbE9yaWdpbgQA6AEgSnVuY3Rpb24AJQA0RXhwb3J0TWVzc2FnZQwBHG5ldHdvcmv0ASROZXR3b3JrSWQAASxkZXN0aW5hdGlvbuQBVEludGVyaW9yTXVsdGlMb2NhdGlvbgABDHhjbd0FARxYY208KCk+ACYAJExvY2tBc3NldAgBFGFzc2V08QUBKE11bHRpQXNzZXQAASB1bmxvY2tlcuABNE11bHRpTG9jYXRpb24AJwAsVW5sb2NrQXNzZXQIARRhc3NldPEFAShNdWx0aUFzc2V0AAEYdGFyZ2V04AE0TXVsdGlMb2NhdGlvbgAoADhOb3RlVW5sb2NrYWJsZQgBFGFzc2V08QUBKE11bHRpQXNzZXQAARRvd25lcuABNE11bHRpTG9jYXRpb24AKQA0UmVxdWVzdFVubG9jawgBFGFzc2V08QUBKE11bHRpQXNzZXQAARhsb2NrZXLgATRNdWx0aUxvY2F0aW9uACoALFNldEZlZXNNb2RlBAEwaml0X3dpdGhkcmF3IAEQYm9vbAArACBTZXRUb3BpYwQABAEgW3U4OyAzMl0ALAAoQ2xlYXJUb3BpYwAtACxBbGlhc09yaWdpbgQA4AE0TXVsdGlMb2NhdGlvbgAuADxVbnBhaWRFeGVjdXRpb24IATB3ZWlnaHRfbGltaXQ9BgEsV2VpZ2h0TGltaXQAATBjaGVja19vcmlnaW4lBgFUT3B0aW9uPE11bHRpTG9jYXRpb24+AC8AAK0GDCxzdGFnaW5nX3hjbQh2NAxYY20EEENhbGwAAAQAsQYBWFZlYzxJbnN0cnVjdGlvbjxDYWxsPj4AALEGAAACtQYAtQYMLHN0YWdpbmdfeGNtCHY0LEluc3RydWN0aW9uBBBDYWxsAAHANFdpdGhkcmF3QXNzZXQEAE0GARhBc3NldHMAAABUUmVzZXJ2ZUFzc2V0RGVwb3NpdGVkBABNBgEYQXNzZXRzAAEAWFJlY2VpdmVUZWxlcG9ydGVkQXNzZXQEAE0GARhBc3NldHMAAgA0UXVlcnlSZXNwb25zZRABIHF1ZXJ5X2lkLAEcUXVlcnlJZAABIHJlc3BvbnNlYQYBIFJlc3BvbnNlAAEobWF4X3dlaWdodCgBGFdlaWdodAABHHF1ZXJpZXJ1BgFAT3B0aW9uPExvY2F0aW9uPgADADRUcmFuc2ZlckFzc2V0CAEYYXNzZXRzTQYBGEFzc2V0cwABLGJlbmVmaWNpYXJ5DQEBIExvY2F0aW9uAAQAUFRyYW5zZmVyUmVzZXJ2ZUFzc2V0DAEYYXNzZXRzTQYBGEFzc2V0cwABEGRlc3QNAQEgTG9jYXRpb24AAQx4Y21BBgEcWGNtPCgpPgAFACBUcmFuc2FjdAwBLG9yaWdpbl9raW5kKQYBKE9yaWdpbktpbmQAAVhyZXF1aXJlX3dlaWdodF9hdF9tb3N0KAEYV2VpZ2h0AAEQY2FsbJ0GAUxEb3VibGVFbmNvZGVkPENhbGw+AAYAZEhybXBOZXdDaGFubmVsT3BlblJlcXVlc3QMARhzZW5kZXLsAQx1MzIAAUBtYXhfbWVzc2FnZV9zaXpl7AEMdTMyAAEwbWF4X2NhcGFjaXR57AEMdTMyAAcATEhybXBDaGFubmVsQWNjZXB0ZWQEASRyZWNpcGllbnTsAQx1MzIACABISHJtcENoYW5uZWxDbG9zaW5nDAEkaW5pdGlhdG9y7AEMdTMyAAEYc2VuZGVy7AEMdTMyAAEkcmVjaXBpZW507AEMdTMyAAkALENsZWFyT3JpZ2luAAoANERlc2NlbmRPcmlnaW4EABEBAUBJbnRlcmlvckxvY2F0aW9uAAsALFJlcG9ydEVycm9yBAB5BgFEUXVlcnlSZXNwb25zZUluZm8ADAAwRGVwb3NpdEFzc2V0CAEYYXNzZXRzfQYBLEFzc2V0RmlsdGVyAAEsYmVuZWZpY2lhcnkNAQEgTG9jYXRpb24ADQBMRGVwb3NpdFJlc2VydmVBc3NldAwBGGFzc2V0c30GASxBc3NldEZpbHRlcgABEGRlc3QNAQEgTG9jYXRpb24AAQx4Y21BBgEcWGNtPCgpPgAOADRFeGNoYW5nZUFzc2V0DAEQZ2l2ZX0GASxBc3NldEZpbHRlcgABEHdhbnRNBgEYQXNzZXRzAAEcbWF4aW1hbCABEGJvb2wADwBcSW5pdGlhdGVSZXNlcnZlV2l0aGRyYXcMARhhc3NldHN9BgEsQXNzZXRGaWx0ZXIAARxyZXNlcnZlDQEBIExvY2F0aW9uAAEMeGNtQQYBHFhjbTwoKT4AEABASW5pdGlhdGVUZWxlcG9ydAwBGGFzc2V0c30GASxBc3NldEZpbHRlcgABEGRlc3QNAQEgTG9jYXRpb24AAQx4Y21BBgEcWGNtPCgpPgARADRSZXBvcnRIb2xkaW5nCAE0cmVzcG9uc2VfaW5mb3kGAURRdWVyeVJlc3BvbnNlSW5mbwABGGFzc2V0c30GASxBc3NldEZpbHRlcgASADBCdXlFeGVjdXRpb24IARBmZWVzVQYBFEFzc2V0AAEwd2VpZ2h0X2xpbWl0PQYBLFdlaWdodExpbWl0ABMANFJlZnVuZFN1cnBsdXMAFAA8U2V0RXJyb3JIYW5kbGVyBACtBgEkWGNtPENhbGw+ABUALFNldEFwcGVuZGl4BACtBgEkWGNtPENhbGw+ABYAKENsZWFyRXJyb3IAFwAoQ2xhaW1Bc3NldAgBGGFzc2V0c00GARhBc3NldHMAARh0aWNrZXQNAQEgTG9jYXRpb24AGAAQVHJhcAQALAEMdTY0ABkAQFN1YnNjcmliZVZlcnNpb24IASBxdWVyeV9pZCwBHFF1ZXJ5SWQAAUxtYXhfcmVzcG9uc2Vfd2VpZ2h0KAEYV2VpZ2h0ABoASFVuc3Vic2NyaWJlVmVyc2lvbgAbACRCdXJuQXNzZXQEAE0GARhBc3NldHMAHAAsRXhwZWN0QXNzZXQEAE0GARhBc3NldHMAHQAwRXhwZWN0T3JpZ2luBAB1BgFAT3B0aW9uPExvY2F0aW9uPgAeACxFeHBlY3RFcnJvcgQAAQYBUE9wdGlvbjwodTMyLCBFcnJvcik+AB8AUEV4cGVjdFRyYW5zYWN0U3RhdHVzBAAdBgE4TWF5YmVFcnJvckNvZGUAIAAsUXVlcnlQYWxsZXQIASxtb2R1bGVfbmFtZTgBHFZlYzx1OD4AATRyZXNwb25zZV9pbmZveQYBRFF1ZXJ5UmVzcG9uc2VJbmZvACEAMEV4cGVjdFBhbGxldBQBFGluZGV47AEMdTMyAAEQbmFtZTgBHFZlYzx1OD4AASxtb2R1bGVfbmFtZTgBHFZlYzx1OD4AASxjcmF0ZV9tYWpvcuwBDHUzMgABPG1pbl9jcmF0ZV9taW5vcuwBDHUzMgAiAFBSZXBvcnRUcmFuc2FjdFN0YXR1cwQAeQYBRFF1ZXJ5UmVzcG9uc2VJbmZvACMATENsZWFyVHJhbnNhY3RTdGF0dXMAJAA8VW5pdmVyc2FsT3JpZ2luBAAZAQEgSnVuY3Rpb24AJQA0RXhwb3J0TWVzc2FnZQwBHG5ldHdvcmshAQEkTmV0d29ya0lkAAEsZGVzdGluYXRpb24RAQFASW50ZXJpb3JMb2NhdGlvbgABDHhjbUEGARxYY208KCk+ACYAJExvY2tBc3NldAgBFGFzc2V0VQYBFEFzc2V0AAEgdW5sb2NrZXINAQEgTG9jYXRpb24AJwAsVW5sb2NrQXNzZXQIARRhc3NldFUGARRBc3NldAABGHRhcmdldA0BASBMb2NhdGlvbgAoADhOb3RlVW5sb2NrYWJsZQgBFGFzc2V0VQYBFEFzc2V0AAEUb3duZXINAQEgTG9jYXRpb24AKQA0UmVxdWVzdFVubG9jawgBFGFzc2V0VQYBFEFzc2V0AAEYbG9ja2VyDQEBIExvY2F0aW9uACoALFNldEZlZXNNb2RlBAEwaml0X3dpdGhkcmF3IAEQYm9vbAArACBTZXRUb3BpYwQABAEgW3U4OyAzMl0ALAAoQ2xlYXJUb3BpYwAtACxBbGlhc09yaWdpbgQADQEBIExvY2F0aW9uAC4APFVucGFpZEV4ZWN1dGlvbggBMHdlaWdodF9saW1pdD0GASxXZWlnaHRMaW1pdAABMGNoZWNrX29yaWdpbnUGAUBPcHRpb248TG9jYXRpb24+AC8AALkGEFBzdGFnaW5nX3hjbV9leGVjdXRvchh0cmFpdHM4YXNzZXRfdHJhbnNmZXIwVHJhbnNmZXJUeXBlAAEQIFRlbGVwb3J0AAAAMExvY2FsUmVzZXJ2ZQABAEhEZXN0aW5hdGlvblJlc2VydmUAAgA0UmVtb3RlUmVzZXJ2ZQQARQEBRFZlcnNpb25lZExvY2F0aW9uAAMAAL0GCAx4Y21AVmVyc2lvbmVkQXNzZXRJZAABCAhWMwQACQEBLHYzOjpBc3NldElkAAMACFY0BABBAQEsdjQ6OkFzc2V0SWQABAAAwQYMUHBhbGxldF9tZXNzYWdlX3F1ZXVlGHBhbGxldBBDYWxsBARUAAEIJHJlYXBfcGFnZQgBOG1lc3NhZ2Vfb3JpZ2luxQYBSE1lc3NhZ2VPcmlnaW5PZjxUPgABKHBhZ2VfaW5kZXgQASRQYWdlSW5kZXgAAAQ9AVJlbW92ZSBhIHBhZ2Ugd2hpY2ggaGFzIG5vIG1vcmUgbWVzc2FnZXMgcmVtYWluaW5nIHRvIGJlIHByb2Nlc3NlZCBvciBpcyBzdGFsZS5IZXhlY3V0ZV9vdmVyd2VpZ2h0EAE4bWVzc2FnZV9vcmlnaW7FBgFITWVzc2FnZU9yaWdpbk9mPFQ+AAEQcGFnZRABJFBhZ2VJbmRleAABFGluZGV4EAEcVDo6U2l6ZQABMHdlaWdodF9saW1pdCgBGFdlaWdodAABNHhFeGVjdXRlIGFuIG92ZXJ3ZWlnaHQgbWVzc2FnZS4ATQFUZW1wb3JhcnkgcHJvY2Vzc2luZyBlcnJvcnMgd2lsbCBiZSBwcm9wYWdhdGVkIHdoZXJlYXMgcGVybWFuZW50IGVycm9ycyBhcmUgdHJlYXRlZFRhcyBzdWNjZXNzIGNvbmRpdGlvbi4AdC0gYG9yaWdpbmA6IE11c3QgYmUgYFNpZ25lZGAuNQEtIGBtZXNzYWdlX29yaWdpbmA6IFRoZSBvcmlnaW4gZnJvbSB3aGljaCB0aGUgbWVzc2FnZSB0byBiZSBleGVjdXRlZCBhcnJpdmVkLj0BLSBgcGFnZWA6IFRoZSBwYWdlIGluIHRoZSBxdWV1ZSBpbiB3aGljaCB0aGUgbWVzc2FnZSB0byBiZSBleGVjdXRlZCBpcyBzaXR0aW5nLgkBLSBgaW5kZXhgOiBUaGUgaW5kZXggaW50byB0aGUgcXVldWUgb2YgdGhlIG1lc3NhZ2UgdG8gYmUgZXhlY3V0ZWQuWQEtIGB3ZWlnaHRfbGltaXRgOiBUaGUgbWF4aW11bSBhbW91bnQgb2Ygd2VpZ2h0IGFsbG93ZWQgdG8gYmUgY29uc3VtZWQgaW4gdGhlIGV4ZWN1dGlvbkQgIG9mIHRoZSBtZXNzYWdlLgD0QmVuY2htYXJrIGNvbXBsZXhpdHkgY29uc2lkZXJhdGlvbnM6IE8oaW5kZXggKyB3ZWlnaHRfbGltaXQpLgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy7FBgxscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zJGluY2x1c2lvblhBZ2dyZWdhdGVNZXNzYWdlT3JpZ2luAAEEDFVtcAQAyQYBKFVtcFF1ZXVlSWQAAAAAyQYMbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucyRpbmNsdXNpb24oVW1wUXVldWVJZAABBBBQYXJhBACNAgEYUGFyYUlkAAAAAM0GDERwYWxsZXRfYXNzZXRfcmF0ZRhwYWxsZXQQQ2FsbAQEVAABDBhjcmVhdGUIAShhc3NldF9raW5k3AFEQm94PFQ6OkFzc2V0S2luZD4AARByYXRl0QYBJEZpeGVkVTEyOAAAEA0BSW5pdGlhbGl6ZSBhIGNvbnZlcnNpb24gcmF0ZSB0byBuYXRpdmUgYmFsYW5jZSBmb3IgdGhlIGdpdmVuIGFzc2V0LgA0IyMgQ29tcGxleGl0eRgtIE8oMSkYdXBkYXRlCAEoYXNzZXRfa2luZNwBREJveDxUOjpBc3NldEtpbmQ+AAEQcmF0ZdEGASRGaXhlZFUxMjgAARAFAVVwZGF0ZSB0aGUgY29udmVyc2lvbiByYXRlIHRvIG5hdGl2ZSBiYWxhbmNlIGZvciB0aGUgZ2l2ZW4gYXNzZXQuADQjIyBDb21wbGV4aXR5GC0gTygxKRhyZW1vdmUEAShhc3NldF9raW5k3AFEQm94PFQ6OkFzc2V0S2luZD4AAhAlAVJlbW92ZSBhbiBleGlzdGluZyBjb252ZXJzaW9uIHJhdGUgdG8gbmF0aXZlIGJhbGFuY2UgZm9yIHRoZSBnaXZlbiBhc3NldC4ANCMjIENvbXBsZXhpdHkYLSBPKDEpBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLtEGDDRzcF9hcml0aG1ldGljLGZpeGVkX3BvaW50JEZpeGVkVTEyOAAABAAYARB1MTI4AADVBgwwcGFsbGV0X2JlZWZ5GHBhbGxldBBDYWxsBARUAAEMTHJlcG9ydF9lcXVpdm9jYXRpb24IAUhlcXVpdm9jYXRpb25fcHJvb2bZBgGNAUJveDxEb3VibGVWb3RpbmdQcm9vZjxCbG9ja051bWJlckZvcjxUPiwgVDo6QmVlZnlJZCw8VDo6QmVlZnlJZAphcyBSdW50aW1lQXBwUHVibGljPjo6U2lnbmF0dXJlLD4sPgABPGtleV9vd25lcl9wcm9vZq0BAUBUOjpLZXlPd25lclByb29mAAAQCQFSZXBvcnQgdm90ZXIgZXF1aXZvY2F0aW9uL21pc2JlaGF2aW9yLiBUaGlzIG1ldGhvZCB3aWxsIHZlcmlmeSB0aGX0ZXF1aXZvY2F0aW9uIHByb29mIGFuZCB2YWxpZGF0ZSB0aGUgZ2l2ZW4ga2V5IG93bmVyc2hpcCBwcm9vZvhhZ2FpbnN0IHRoZSBleHRyYWN0ZWQgb2ZmZW5kZXIuIElmIGJvdGggYXJlIHZhbGlkLCB0aGUgb2ZmZW5jZUR3aWxsIGJlIHJlcG9ydGVkLnByZXBvcnRfZXF1aXZvY2F0aW9uX3Vuc2lnbmVkCAFIZXF1aXZvY2F0aW9uX3Byb29m2QYBjQFCb3g8RG91YmxlVm90aW5nUHJvb2Y8QmxvY2tOdW1iZXJGb3I8VD4sIFQ6OkJlZWZ5SWQsPFQ6OkJlZWZ5SWQKYXMgUnVudGltZUFwcFB1YmxpYz46OlNpZ25hdHVyZSw+LD4AATxrZXlfb3duZXJfcHJvb2atAQFAVDo6S2V5T3duZXJQcm9vZgABJAkBUmVwb3J0IHZvdGVyIGVxdWl2b2NhdGlvbi9taXNiZWhhdmlvci4gVGhpcyBtZXRob2Qgd2lsbCB2ZXJpZnkgdGhl9GVxdWl2b2NhdGlvbiBwcm9vZiBhbmQgdmFsaWRhdGUgdGhlIGdpdmVuIGtleSBvd25lcnNoaXAgcHJvb2b4YWdhaW5zdCB0aGUgZXh0cmFjdGVkIG9mZmVuZGVyLiBJZiBib3RoIGFyZSB2YWxpZCwgdGhlIG9mZmVuY2VEd2lsbCBiZSByZXBvcnRlZC4ADQFUaGlzIGV4dHJpbnNpYyBtdXN0IGJlIGNhbGxlZCB1bnNpZ25lZCBhbmQgaXQgaXMgZXhwZWN0ZWQgdGhhdCBvbmx5FQFibG9jayBhdXRob3JzIHdpbGwgY2FsbCBpdCAodmFsaWRhdGVkIGluIGBWYWxpZGF0ZVVuc2lnbmVkYCksIGFzIHN1Y2gVAWlmIHRoZSBibG9jayBhdXRob3IgaXMgZGVmaW5lZCBpdCB3aWxsIGJlIGRlZmluZWQgYXMgdGhlIGVxdWl2b2NhdGlvbiRyZXBvcnRlci48c2V0X25ld19nZW5lc2lzBAE8ZGVsYXlfaW5fYmxvY2tzEAFEQmxvY2tOdW1iZXJGb3I8VD4AAhBdAVJlc2V0IEJFRUZZIGNvbnNlbnN1cyBieSBzZXR0aW5nIGEgbmV3IEJFRUZZIGdlbmVzaXMgYXQgYGRlbGF5X2luX2Jsb2Nrc2AgYmxvY2tzIGluIHRoZRxmdXR1cmUuALROb3RlOiBgZGVsYXlfaW5fYmxvY2tzYCBoYXMgdG8gYmUgYXQgbGVhc3QgMS4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMu2QYISHNwX2NvbnNlbnN1c19iZWVmeUREb3VibGVWb3RpbmdQcm9vZgwYTnVtYmVyARAISWQBKQIkU2lnbmF0dXJlAd0GAAgBFGZpcnN04QYBiFZvdGVNZXNzYWdlPE51bWJlciwgSWQsIFNpZ25hdHVyZT4AARhzZWNvbmThBgGIVm90ZU1lc3NhZ2U8TnVtYmVyLCBJZCwgU2lnbmF0dXJlPgAA3QYMSHNwX2NvbnNlbnN1c19iZWVmeTBlY2RzYV9jcnlwdG8kU2lnbmF0dXJlAAAEANkCAUBlY2RzYTo6U2lnbmF0dXJlAADhBghIc3BfY29uc2Vuc3VzX2JlZWZ5LFZvdGVNZXNzYWdlDBhOdW1iZXIBEAhJZAEpAiRTaWduYXR1cmUB3QYADAEoY29tbWl0bWVudOUGAUhDb21taXRtZW50PE51bWJlcj4AAQhpZCkCAQhJZAABJHNpZ25hdHVyZd0GASRTaWduYXR1cmUAAOUGDEhzcF9jb25zZW5zdXNfYmVlZnkoY29tbWl0bWVudChDb21taXRtZW50BDBUQmxvY2tOdW1iZXIBEAAMARxwYXlsb2Fk6QYBHFBheWxvYWQAATBibG9ja19udW1iZXIQATBUQmxvY2tOdW1iZXIAAUB2YWxpZGF0b3Jfc2V0X2lkMAE4VmFsaWRhdG9yU2V0SWQAAOkGDEhzcF9jb25zZW5zdXNfYmVlZnkccGF5bG9hZBxQYXlsb2FkAAAEAO0GAXhWZWM8KEJlZWZ5UGF5bG9hZElkLCBWZWM8dTg+KT4AAO0GAAAC8QYA8QYAAAQI9QY4APUGAAADAgAAAAgA+QYMKHNwX3J1bnRpbWUYdHJhaXRzLEJsYWtlVHdvMjU2AAAAAP0GDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBCARTAAAEADgBGFZlYzxUPgAAAQcMYHBhbGxldF9jb252aWN0aW9uX3ZvdGluZxR0eXBlcxRUYWxseQgUVm90ZXMBGBRUb3RhbAAADAEQYXllcxgBFFZvdGVzAAEQbmF5cxgBFFZvdGVzAAEcc3VwcG9ydBgBFFZvdGVzAAAFBwxAcGFsbGV0X3doaXRlbGlzdBhwYWxsZXQURXZlbnQEBFQAAQw8Q2FsbFdoaXRlbGlzdGVkBAEkY2FsbF9oYXNoNAEcVDo6SGFzaAAAAFhXaGl0ZWxpc3RlZENhbGxSZW1vdmVkBAEkY2FsbF9oYXNoNAEcVDo6SGFzaAABAGRXaGl0ZWxpc3RlZENhbGxEaXNwYXRjaGVkCAEkY2FsbF9oYXNoNAEcVDo6SGFzaAABGHJlc3VsdAkHAWhEaXNwYXRjaFJlc3VsdFdpdGhQb3N0SW5mbwACAAR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldAkHBBhSZXN1bHQIBFQBDQcERQEVBwEICE9rBAANBwAAAAAMRXJyBAAVBwAAAQAADQcMNGZyYW1lX3N1cHBvcnQgZGlzcGF0Y2hAUG9zdERpc3BhdGNoSW5mbwAACAE0YWN0dWFsX3dlaWdodBEHAThPcHRpb248V2VpZ2h0PgABIHBheXNfZmVlZAEQUGF5cwAAEQcEGE9wdGlvbgQEVAEoAQgQTm9uZQAAABBTb21lBAAoAAABAAAVBwgoc3BfcnVudGltZWREaXNwYXRjaEVycm9yV2l0aFBvc3RJbmZvBBBJbmZvAQ0HAAgBJHBvc3RfaW5mbw0HARBJbmZvAAEUZXJyb3JoATREaXNwYXRjaEVycm9yAAAZBwxEcGFsbGV0X3BhcmFtZXRlcnMYcGFsbGV0FEV2ZW50BARUAAEEHFVwZGF0ZWQMAQxrZXkdBwHEPFQ6OlJ1bnRpbWVQYXJhbWV0ZXJzIGFzIEFnZ3JlZ2F0ZWRLZXlWYWx1ZT46OktleQRkVGhlIGtleSB0aGF0IHdhcyB1cGRhdGVkLgEkb2xkX3ZhbHVlJQcB7E9wdGlvbjw8VDo6UnVudGltZVBhcmFtZXRlcnMgYXMgQWdncmVnYXRlZEtleVZhbHVlPjo6VmFsdWU+BHxUaGUgb2xkIHZhbHVlIGJlZm9yZSB0aGlzIGNhbGwuASRuZXdfdmFsdWUlBwHsT3B0aW9uPDxUOjpSdW50aW1lUGFyYW1ldGVycyBhcyBBZ2dyZWdhdGVkS2V5VmFsdWU+OjpWYWx1ZT4EeFRoZSBuZXcgdmFsdWUgYWZ0ZXIgdGhpcyBjYWxsLgAMUEEgUGFyYW1ldGVyIHdhcyBzZXQuALxJcyBhbHNvIGVtaXR0ZWQgd2hlbiB0aGUgdmFsdWUgd2FzIG5vdCBjaGFuZ2VkLgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldB0HCEBwb2xrYWRvdF9ydW50aW1lUFJ1bnRpbWVQYXJhbWV0ZXJzS2V5AAEEJEluZmxhdGlvbgQAIQcBqQE8ZHluYW1pY19wYXJhbXM6OmluZmxhdGlvbjo6UGFyYW1ldGVycyBhcyBmcmFtZV9zdXBwb3J0Ojp0cmFpdHM6OgpkeW5hbWljX3BhcmFtczo6QWdncmVnYXRlZEtleVZhbHVlPjo6S2V5AAAAACEHEEBwb2xrYWRvdF9ydW50aW1lOGR5bmFtaWNfcGFyYW1zJGluZmxhdGlvbjRQYXJhbWV0ZXJzS2V5AAEUME1pbkluZmxhdGlvbgQAsQIBME1pbkluZmxhdGlvbgAAADBNYXhJbmZsYXRpb24EAL0CATBNYXhJbmZsYXRpb24AAQAoSWRlYWxTdGFrZQQAwQIBKElkZWFsU3Rha2UAAgAcRmFsbG9mZgQAxQIBHEZhbGxvZmYAAwA8VXNlQXVjdGlvblNsb3RzBADJAgE8VXNlQXVjdGlvblNsb3RzAAQAACUHBBhPcHRpb24EBFQBKQcBCBBOb25lAAAAEFNvbWUEACkHAAABAAApBwhAcG9sa2Fkb3RfcnVudGltZVhSdW50aW1lUGFyYW1ldGVyc1ZhbHVlAAEEJEluZmxhdGlvbgQALQcBsQE8ZHluYW1pY19wYXJhbXM6OmluZmxhdGlvbjo6UGFyYW1ldGVycyBhcyBmcmFtZV9zdXBwb3J0Ojp0cmFpdHM6OgpkeW5hbWljX3BhcmFtczo6QWdncmVnYXRlZEtleVZhbHVlPjo6VmFsdWUAAAAALQcQQHBvbGthZG90X3J1bnRpbWU4ZHluYW1pY19wYXJhbXMkaW5mbGF0aW9uPFBhcmFtZXRlcnNWYWx1ZQABFDBNaW5JbmZsYXRpb24EALkCASxQZXJxdWludGlsbAAAADBNYXhJbmZsYXRpb24EALkCASxQZXJxdWludGlsbAABAChJZGVhbFN0YWtlBAC5AgEsUGVycXVpbnRpbGwAAgAcRmFsbG9mZgQAuQIBLFBlcnF1aW50aWxsAAMAPFVzZUF1Y3Rpb25TbG90cwQAIAEQYm9vbAAEAAAxBxBccG9sa2Fkb3RfcnVudGltZV9jb21tb24YY2xhaW1zGHBhbGxldBRFdmVudAQEVAABBBxDbGFpbWVkDAEMd2hvAAEwVDo6QWNjb3VudElkAAFAZXRoZXJldW1fYWRkcmVzc90CATxFdGhlcmV1bUFkZHJlc3MAARhhbW91bnQYATBCYWxhbmNlT2Y8VD4AAARoU29tZW9uZSBjbGFpbWVkIHNvbWUgRE9Ucy4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXQ1Bww4cGFsbGV0X3Zlc3RpbmcYcGFsbGV0FEV2ZW50BARUAAEIOFZlc3RpbmdVcGRhdGVkCAEcYWNjb3VudAABMFQ6OkFjY291bnRJZAABIHVudmVzdGVkGAEwQmFsYW5jZU9mPFQ+AAAIUQFUaGUgYW1vdW50IHZlc3RlZCBoYXMgYmVlbiB1cGRhdGVkLiBUaGlzIGNvdWxkIGluZGljYXRlIGEgY2hhbmdlIGluIGZ1bmRzIGF2YWlsYWJsZS4lAVRoZSBiYWxhbmNlIGdpdmVuIGlzIHRoZSBhbW91bnQgd2hpY2ggaXMgbGVmdCB1bnZlc3RlZCAoYW5kIHRodXMgbG9ja2VkKS5AVmVzdGluZ0NvbXBsZXRlZAQBHGFjY291bnQAATBUOjpBY2NvdW50SWQAAQScQW4gXFthY2NvdW50XF0gaGFzIGJlY29tZSBmdWxseSB2ZXN0ZWQuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0OQcMOHBhbGxldF91dGlsaXR5GHBhbGxldBRFdmVudAABGEBCYXRjaEludGVycnVwdGVkCAEUaW5kZXgQAQx1MzIAARRlcnJvcmgBNERpc3BhdGNoRXJyb3IAAAhVAUJhdGNoIG9mIGRpc3BhdGNoZXMgZGlkIG5vdCBjb21wbGV0ZSBmdWxseS4gSW5kZXggb2YgZmlyc3QgZmFpbGluZyBkaXNwYXRjaCBnaXZlbiwgYXNId2VsbCBhcyB0aGUgZXJyb3IuOEJhdGNoQ29tcGxldGVkAAEEyEJhdGNoIG9mIGRpc3BhdGNoZXMgY29tcGxldGVkIGZ1bGx5IHdpdGggbm8gZXJyb3IuYEJhdGNoQ29tcGxldGVkV2l0aEVycm9ycwACBLRCYXRjaCBvZiBkaXNwYXRjaGVzIGNvbXBsZXRlZCBidXQgaGFzIGVycm9ycy40SXRlbUNvbXBsZXRlZAADBB0BQSBzaW5nbGUgaXRlbSB3aXRoaW4gYSBCYXRjaCBvZiBkaXNwYXRjaGVzIGhhcyBjb21wbGV0ZWQgd2l0aCBubyBlcnJvci4oSXRlbUZhaWxlZAQBFGVycm9yaAE0RGlzcGF0Y2hFcnJvcgAEBBEBQSBzaW5nbGUgaXRlbSB3aXRoaW4gYSBCYXRjaCBvZiBkaXNwYXRjaGVzIGhhcyBjb21wbGV0ZWQgd2l0aCBlcnJvci4wRGlzcGF0Y2hlZEFzBAEYcmVzdWx0iAE4RGlzcGF0Y2hSZXN1bHQABQRYQSBjYWxsIHdhcyBkaXNwYXRjaGVkLgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldD0HDDBwYWxsZXRfcHJveHkYcGFsbGV0FEV2ZW50BARUAAEUNFByb3h5RXhlY3V0ZWQEARhyZXN1bHSIAThEaXNwYXRjaFJlc3VsdAAABLxBIHByb3h5IHdhcyBleGVjdXRlZCBjb3JyZWN0bHksIHdpdGggdGhlIGdpdmVuLixQdXJlQ3JlYXRlZBABEHB1cmUAATBUOjpBY2NvdW50SWQAAQx3aG8AATBUOjpBY2NvdW50SWQAAShwcm94eV90eXBlCQMBMFQ6OlByb3h5VHlwZQABUGRpc2FtYmlndWF0aW9uX2luZGV4bQEBDHUxNgABCNxBIHB1cmUgYWNjb3VudCBoYXMgYmVlbiBjcmVhdGVkIGJ5IG5ldyBwcm94eSB3aXRoIGdpdmVukGRpc2FtYmlndWF0aW9uIGluZGV4IGFuZCBwcm94eSB0eXBlLiRBbm5vdW5jZWQMARByZWFsAAEwVDo6QWNjb3VudElkAAEUcHJveHkAATBUOjpBY2NvdW50SWQAASRjYWxsX2hhc2g0ATRDYWxsSGFzaE9mPFQ+AAIE4EFuIGFubm91bmNlbWVudCB3YXMgcGxhY2VkIHRvIG1ha2UgYSBjYWxsIGluIHRoZSBmdXR1cmUuKFByb3h5QWRkZWQQASRkZWxlZ2F0b3IAATBUOjpBY2NvdW50SWQAASRkZWxlZ2F0ZWUAATBUOjpBY2NvdW50SWQAAShwcm94eV90eXBlCQMBMFQ6OlByb3h5VHlwZQABFGRlbGF5EAFEQmxvY2tOdW1iZXJGb3I8VD4AAwRIQSBwcm94eSB3YXMgYWRkZWQuMFByb3h5UmVtb3ZlZBABJGRlbGVnYXRvcgABMFQ6OkFjY291bnRJZAABJGRlbGVnYXRlZQABMFQ6OkFjY291bnRJZAABKHByb3h5X3R5cGUJAwEwVDo6UHJveHlUeXBlAAEUZGVsYXkQAURCbG9ja051bWJlckZvcjxUPgAEBFBBIHByb3h5IHdhcyByZW1vdmVkLgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldEEHDDxwYWxsZXRfbXVsdGlzaWcYcGFsbGV0FEV2ZW50BARUAAEQLE5ld011bHRpc2lnDAEkYXBwcm92aW5nAAEwVDo6QWNjb3VudElkAAEgbXVsdGlzaWcAATBUOjpBY2NvdW50SWQAASRjYWxsX2hhc2gEASBDYWxsSGFzaAAABIxBIG5ldyBtdWx0aXNpZyBvcGVyYXRpb24gaGFzIGJlZ3VuLkBNdWx0aXNpZ0FwcHJvdmFsEAEkYXBwcm92aW5nAAEwVDo6QWNjb3VudElkAAEkdGltZXBvaW50FQMBcFRpbWVwb2ludDxCbG9ja051bWJlckZvcjxUPj4AASBtdWx0aXNpZwABMFQ6OkFjY291bnRJZAABJGNhbGxfaGFzaAQBIENhbGxIYXNoAAEEyEEgbXVsdGlzaWcgb3BlcmF0aW9uIGhhcyBiZWVuIGFwcHJvdmVkIGJ5IHNvbWVvbmUuQE11bHRpc2lnRXhlY3V0ZWQUASRhcHByb3ZpbmcAATBUOjpBY2NvdW50SWQAASR0aW1lcG9pbnQVAwFwVGltZXBvaW50PEJsb2NrTnVtYmVyRm9yPFQ+PgABIG11bHRpc2lnAAEwVDo6QWNjb3VudElkAAEkY2FsbF9oYXNoBAEgQ2FsbEhhc2gAARhyZXN1bHSIAThEaXNwYXRjaFJlc3VsdAACBJxBIG11bHRpc2lnIG9wZXJhdGlvbiBoYXMgYmVlbiBleGVjdXRlZC5ETXVsdGlzaWdDYW5jZWxsZWQQAShjYW5jZWxsaW5nAAEwVDo6QWNjb3VudElkAAEkdGltZXBvaW50FQMBcFRpbWVwb2ludDxCbG9ja051bWJlckZvcjxUPj4AASBtdWx0aXNpZwABMFQ6OkFjY291bnRJZAABJGNhbGxfaGFzaAQBIENhbGxIYXNoAAMEoEEgbXVsdGlzaWcgb3BlcmF0aW9uIGhhcyBiZWVuIGNhbmNlbGxlZC4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXRFBww8cGFsbGV0X2JvdW50aWVzGHBhbGxldBRFdmVudAgEVAAESQABLDhCb3VudHlQcm9wb3NlZAQBFGluZGV4EAEsQm91bnR5SW5kZXgAAARQTmV3IGJvdW50eSBwcm9wb3NhbC44Qm91bnR5UmVqZWN0ZWQIARRpbmRleBABLEJvdW50eUluZGV4AAEQYm9uZBgBPEJhbGFuY2VPZjxULCBJPgABBMxBIGJvdW50eSBwcm9wb3NhbCB3YXMgcmVqZWN0ZWQ7IGZ1bmRzIHdlcmUgc2xhc2hlZC5IQm91bnR5QmVjYW1lQWN0aXZlBAEUaW5kZXgQASxCb3VudHlJbmRleAACBLhBIGJvdW50eSBwcm9wb3NhbCBpcyBmdW5kZWQgYW5kIGJlY2FtZSBhY3RpdmUuNEJvdW50eUF3YXJkZWQIARRpbmRleBABLEJvdW50eUluZGV4AAEsYmVuZWZpY2lhcnkAATBUOjpBY2NvdW50SWQAAwSUQSBib3VudHkgaXMgYXdhcmRlZCB0byBhIGJlbmVmaWNpYXJ5LjRCb3VudHlDbGFpbWVkDAEUaW5kZXgQASxCb3VudHlJbmRleAABGHBheW91dBgBPEJhbGFuY2VPZjxULCBJPgABLGJlbmVmaWNpYXJ5AAEwVDo6QWNjb3VudElkAAQEjEEgYm91bnR5IGlzIGNsYWltZWQgYnkgYmVuZWZpY2lhcnkuOEJvdW50eUNhbmNlbGVkBAEUaW5kZXgQASxCb3VudHlJbmRleAAFBFhBIGJvdW50eSBpcyBjYW5jZWxsZWQuOEJvdW50eUV4dGVuZGVkBAEUaW5kZXgQASxCb3VudHlJbmRleAAGBHBBIGJvdW50eSBleHBpcnkgaXMgZXh0ZW5kZWQuOEJvdW50eUFwcHJvdmVkBAEUaW5kZXgQASxCb3VudHlJbmRleAAHBFRBIGJvdW50eSBpcyBhcHByb3ZlZC48Q3VyYXRvclByb3Bvc2VkCAEkYm91bnR5X2lkEAEsQm91bnR5SW5kZXgAARxjdXJhdG9yAAEwVDo6QWNjb3VudElkAAgEdEEgYm91bnR5IGN1cmF0b3IgaXMgcHJvcG9zZWQuREN1cmF0b3JVbmFzc2lnbmVkBAEkYm91bnR5X2lkEAEsQm91bnR5SW5kZXgACQR8QSBib3VudHkgY3VyYXRvciBpcyB1bmFzc2lnbmVkLjxDdXJhdG9yQWNjZXB0ZWQIASRib3VudHlfaWQQASxCb3VudHlJbmRleAABHGN1cmF0b3IAATBUOjpBY2NvdW50SWQACgR0QSBib3VudHkgY3VyYXRvciBpcyBhY2NlcHRlZC4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXRJBwxUcGFsbGV0X2NoaWxkX2JvdW50aWVzGHBhbGxldBRFdmVudAQEVAABEBRBZGRlZAgBFGluZGV4EAEsQm91bnR5SW5kZXgAASxjaGlsZF9pbmRleBABLEJvdW50eUluZGV4AAAEYEEgY2hpbGQtYm91bnR5IGlzIGFkZGVkLhxBd2FyZGVkDAEUaW5kZXgQASxCb3VudHlJbmRleAABLGNoaWxkX2luZGV4EAEsQm91bnR5SW5kZXgAASxiZW5lZmljaWFyeQABMFQ6OkFjY291bnRJZAABBKxBIGNoaWxkLWJvdW50eSBpcyBhd2FyZGVkIHRvIGEgYmVuZWZpY2lhcnkuHENsYWltZWQQARRpbmRleBABLEJvdW50eUluZGV4AAEsY2hpbGRfaW5kZXgQASxCb3VudHlJbmRleAABGHBheW91dBgBMEJhbGFuY2VPZjxUPgABLGJlbmVmaWNpYXJ5AAEwVDo6QWNjb3VudElkAAIEpEEgY2hpbGQtYm91bnR5IGlzIGNsYWltZWQgYnkgYmVuZWZpY2lhcnkuIENhbmNlbGVkCAEUaW5kZXgQASxCb3VudHlJbmRleAABLGNoaWxkX2luZGV4EAEsQm91bnR5SW5kZXgAAwRwQSBjaGlsZC1ib3VudHkgaXMgY2FuY2VsbGVkLgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldE0HDJBwYWxsZXRfZWxlY3Rpb25fcHJvdmlkZXJfbXVsdGlfcGhhc2UYcGFsbGV0FEV2ZW50BARUAAEYOFNvbHV0aW9uU3RvcmVkDAEcY29tcHV0ZVEHATxFbGVjdGlvbkNvbXB1dGUAARhvcmlnaW79AQFQT3B0aW9uPFQ6OkFjY291bnRJZD4AATBwcmV2X2VqZWN0ZWQgARBib29sAAActEEgc29sdXRpb24gd2FzIHN0b3JlZCB3aXRoIHRoZSBnaXZlbiBjb21wdXRlLgBRAVRoZSBgb3JpZ2luYCBpbmRpY2F0ZXMgdGhlIG9yaWdpbiBvZiB0aGUgc29sdXRpb24uIElmIGBvcmlnaW5gIGlzIGBTb21lKEFjY291bnRJZClgLFkBdGhlIHN0b3JlZCBzb2x1dGlvbiB3YXMgc3VibWl0dGVkIGluIHRoZSBzaWduZWQgcGhhc2UgYnkgYSBtaW5lciB3aXRoIHRoZSBgQWNjb3VudElkYC4lAU90aGVyd2lzZSwgdGhlIHNvbHV0aW9uIHdhcyBzdG9yZWQgZWl0aGVyIGR1cmluZyB0aGUgdW5zaWduZWQgcGhhc2Ugb3IgYnlNAWBUOjpGb3JjZU9yaWdpbmAuIFRoZSBgYm9vbGAgaXMgYHRydWVgIHdoZW4gYSBwcmV2aW91cyBzb2x1dGlvbiB3YXMgZWplY3RlZCB0byBtYWtlSHJvb20gZm9yIHRoaXMgb25lLkRFbGVjdGlvbkZpbmFsaXplZAgBHGNvbXB1dGVRBwE8RWxlY3Rpb25Db21wdXRlAAEUc2NvcmX1AwE0RWxlY3Rpb25TY29yZQABBBkBVGhlIGVsZWN0aW9uIGhhcyBiZWVuIGZpbmFsaXplZCwgd2l0aCB0aGUgZ2l2ZW4gY29tcHV0YXRpb24gYW5kIHNjb3JlLjhFbGVjdGlvbkZhaWxlZAACDExBbiBlbGVjdGlvbiBmYWlsZWQuAAEBTm90IG11Y2ggY2FuIGJlIHNhaWQgYWJvdXQgd2hpY2ggY29tcHV0ZXMgZmFpbGVkIGluIHRoZSBwcm9jZXNzLiBSZXdhcmRlZAgBHGFjY291bnQAAZg8VCBhcyBmcmFtZV9zeXN0ZW06OkNvbmZpZz46OkFjY291bnRJZAABFHZhbHVlGAEwQmFsYW5jZU9mPFQ+AAMEJQFBbiBhY2NvdW50IGhhcyBiZWVuIHJld2FyZGVkIGZvciB0aGVpciBzaWduZWQgc3VibWlzc2lvbiBiZWluZyBmaW5hbGl6ZWQuHFNsYXNoZWQIARxhY2NvdW50AAGYPFQgYXMgZnJhbWVfc3lzdGVtOjpDb25maWc+OjpBY2NvdW50SWQAARR2YWx1ZRgBMEJhbGFuY2VPZjxUPgAEBCEBQW4gYWNjb3VudCBoYXMgYmVlbiBzbGFzaGVkIGZvciBzdWJtaXR0aW5nIGFuIGludmFsaWQgc2lnbmVkIHN1Ym1pc3Npb24uRFBoYXNlVHJhbnNpdGlvbmVkDAEQZnJvbVUHAWBQaGFzZTxCbG9ja051bWJlckZvcjxUPj4AAQh0b1UHAWBQaGFzZTxCbG9ja051bWJlckZvcjxUPj4AARRyb3VuZBABDHUzMgAFBLhUaGVyZSB3YXMgYSBwaGFzZSB0cmFuc2l0aW9uIGluIGEgZ2l2ZW4gcm91bmQuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0UQcIkHBhbGxldF9lbGVjdGlvbl9wcm92aWRlcl9tdWx0aV9waGFzZTxFbGVjdGlvbkNvbXB1dGUAARQcT25DaGFpbgAAABhTaWduZWQAAQAgVW5zaWduZWQAAgAgRmFsbGJhY2sAAwAkRW1lcmdlbmN5AAQAAFUHCJBwYWxsZXRfZWxlY3Rpb25fcHJvdmlkZXJfbXVsdGlfcGhhc2UUUGhhc2UECEJuARABEAxPZmYAAAAYU2lnbmVkAAEAIFVuc2lnbmVkBABZBwEoKGJvb2wsIEJuKQACACRFbWVyZ2VuY3kAAwAAWQcAAAQIIBAAXQcMQHBhbGxldF9iYWdzX2xpc3QYcGFsbGV0FEV2ZW50CARUAARJAAEIIFJlYmFnZ2VkDAEMd2hvAAEwVDo6QWNjb3VudElkAAEQZnJvbTABIFQ6OlNjb3JlAAEIdG8wASBUOjpTY29yZQAABKRNb3ZlZCBhbiBhY2NvdW50IGZyb20gb25lIGJhZyB0byBhbm90aGVyLjBTY29yZVVwZGF0ZWQIAQx3aG8AATBUOjpBY2NvdW50SWQAASRuZXdfc2NvcmUwASBUOjpTY29yZQABBNhVcGRhdGVkIHRoZSBzY29yZSBvZiBzb21lIGFjY291bnQgdG8gdGhlIGdpdmVuIGFtb3VudC4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXRhBwxccGFsbGV0X25vbWluYXRpb25fcG9vbHMYcGFsbGV0FEV2ZW50BARUAAFIHENyZWF0ZWQIASRkZXBvc2l0b3IAATBUOjpBY2NvdW50SWQAARxwb29sX2lkEAEYUG9vbElkAAAEYEEgcG9vbCBoYXMgYmVlbiBjcmVhdGVkLhhCb25kZWQQARhtZW1iZXIAATBUOjpBY2NvdW50SWQAARxwb29sX2lkEAEYUG9vbElkAAEYYm9uZGVkGAEwQmFsYW5jZU9mPFQ+AAEYam9pbmVkIAEQYm9vbAABBJRBIG1lbWJlciBoYXMgYmVjYW1lIGJvbmRlZCBpbiBhIHBvb2wuHFBhaWRPdXQMARhtZW1iZXIAATBUOjpBY2NvdW50SWQAARxwb29sX2lkEAEYUG9vbElkAAEYcGF5b3V0GAEwQmFsYW5jZU9mPFQ+AAIEjEEgcGF5b3V0IGhhcyBiZWVuIG1hZGUgdG8gYSBtZW1iZXIuIFVuYm9uZGVkFAEYbWVtYmVyAAEwVDo6QWNjb3VudElkAAEccG9vbF9pZBABGFBvb2xJZAABHGJhbGFuY2UYATBCYWxhbmNlT2Y8VD4AARhwb2ludHMYATBCYWxhbmNlT2Y8VD4AAQxlcmEQASBFcmFJbmRleAADLJhBIG1lbWJlciBoYXMgdW5ib25kZWQgZnJvbSB0aGVpciBwb29sLgA5AS0gYGJhbGFuY2VgIGlzIHRoZSBjb3JyZXNwb25kaW5nIGJhbGFuY2Ugb2YgdGhlIG51bWJlciBvZiBwb2ludHMgdGhhdCBoYXMgYmVlblUBICByZXF1ZXN0ZWQgdG8gYmUgdW5ib25kZWQgKHRoZSBhcmd1bWVudCBvZiB0aGUgYHVuYm9uZGAgdHJhbnNhY3Rpb24pIGZyb20gdGhlIGJvbmRlZBwgIHBvb2wuRQEtIGBwb2ludHNgIGlzIHRoZSBudW1iZXIgb2YgcG9pbnRzIHRoYXQgYXJlIGlzc3VlZCBhcyBhIHJlc3VsdCBvZiBgYmFsYW5jZWAgYmVpbmfAZGlzc29sdmVkIGludG8gdGhlIGNvcnJlc3BvbmRpbmcgdW5ib25kaW5nIHBvb2wu5C0gYGVyYWAgaXMgdGhlIGVyYSBpbiB3aGljaCB0aGUgYmFsYW5jZSB3aWxsIGJlIHVuYm9uZGVkLlUBSW4gdGhlIGFic2VuY2Ugb2Ygc2xhc2hpbmcsIHRoZXNlIHZhbHVlcyB3aWxsIG1hdGNoLiBJbiB0aGUgcHJlc2VuY2Ugb2Ygc2xhc2hpbmcsIHRoZU0BbnVtYmVyIG9mIHBvaW50cyB0aGF0IGFyZSBpc3N1ZWQgaW4gdGhlIHVuYm9uZGluZyBwb29sIHdpbGwgYmUgbGVzcyB0aGFuIHRoZSBhbW91bnRkcmVxdWVzdGVkIHRvIGJlIHVuYm9uZGVkLiRXaXRoZHJhd24QARhtZW1iZXIAATBUOjpBY2NvdW50SWQAARxwb29sX2lkEAEYUG9vbElkAAEcYmFsYW5jZRgBMEJhbGFuY2VPZjxUPgABGHBvaW50cxgBMEJhbGFuY2VPZjxUPgAEGJxBIG1lbWJlciBoYXMgd2l0aGRyYXduIGZyb20gdGhlaXIgcG9vbC4AIQFUaGUgZ2l2ZW4gbnVtYmVyIG9mIGBwb2ludHNgIGhhdmUgYmVlbiBkaXNzb2x2ZWQgaW4gcmV0dXJuIG9mIGBiYWxhbmNlYC4AWQFTaW1pbGFyIHRvIGBVbmJvbmRlZGAgZXZlbnQsIGluIHRoZSBhYnNlbmNlIG9mIHNsYXNoaW5nLCB0aGUgcmF0aW8gb2YgcG9pbnQgdG8gYmFsYW5jZSh3aWxsIGJlIDEuJERlc3Ryb3llZAQBHHBvb2xfaWQQARhQb29sSWQABQRoQSBwb29sIGhhcyBiZWVuIGRlc3Ryb3llZC4wU3RhdGVDaGFuZ2VkCAEccG9vbF9pZBABGFBvb2xJZAABJG5ld19zdGF0ZSEEASRQb29sU3RhdGUABgR8VGhlIHN0YXRlIG9mIGEgcG9vbCBoYXMgY2hhbmdlZDRNZW1iZXJSZW1vdmVkCAEccG9vbF9pZBABGFBvb2xJZAABGG1lbWJlcgABMFQ6OkFjY291bnRJZAAHDJhBIG1lbWJlciBoYXMgYmVlbiByZW1vdmVkIGZyb20gYSBwb29sLgBRAVRoZSByZW1vdmFsIGNhbiBiZSB2b2x1bnRhcnkgKHdpdGhkcmF3biBhbGwgdW5ib25kZWQgZnVuZHMpIG9yIGludm9sdW50YXJ5IChraWNrZWQpLjBSb2xlc1VwZGF0ZWQMARByb290/QEBUE9wdGlvbjxUOjpBY2NvdW50SWQ+AAEcYm91bmNlcv0BAVBPcHRpb248VDo6QWNjb3VudElkPgABJG5vbWluYXRvcv0BAVBPcHRpb248VDo6QWNjb3VudElkPgAICFUBVGhlIHJvbGVzIG9mIGEgcG9vbCBoYXZlIGJlZW4gdXBkYXRlZCB0byB0aGUgZ2l2ZW4gbmV3IHJvbGVzLiBOb3RlIHRoYXQgdGhlIGRlcG9zaXRvckRjYW4gbmV2ZXIgY2hhbmdlLixQb29sU2xhc2hlZAgBHHBvb2xfaWQQARhQb29sSWQAARxiYWxhbmNlGAEwQmFsYW5jZU9mPFQ+AAkEDQFUaGUgYWN0aXZlIGJhbGFuY2Ugb2YgcG9vbCBgcG9vbF9pZGAgaGFzIGJlZW4gc2xhc2hlZCB0byBgYmFsYW5jZWAuUFVuYm9uZGluZ1Bvb2xTbGFzaGVkDAEccG9vbF9pZBABGFBvb2xJZAABDGVyYRABIEVyYUluZGV4AAEcYmFsYW5jZRgBMEJhbGFuY2VPZjxUPgAKBCUBVGhlIHVuYm9uZCBwb29sIGF0IGBlcmFgIG9mIHBvb2wgYHBvb2xfaWRgIGhhcyBiZWVuIHNsYXNoZWQgdG8gYGJhbGFuY2VgLlRQb29sQ29tbWlzc2lvblVwZGF0ZWQIARxwb29sX2lkEAEYUG9vbElkAAEcY3VycmVudDkEAXxPcHRpb248KFBlcmJpbGwsIFQ6OkFjY291bnRJZCk+AAsEtEEgcG9vbCdzIGNvbW1pc3Npb24gc2V0dGluZyBoYXMgYmVlbiBjaGFuZ2VkLmBQb29sTWF4Q29tbWlzc2lvblVwZGF0ZWQIARxwb29sX2lkEAEYUG9vbElkAAE4bWF4X2NvbW1pc3Npb26sARxQZXJiaWxsAAwE1EEgcG9vbCdzIG1heGltdW0gY29tbWlzc2lvbiBzZXR0aW5nIGhhcyBiZWVuIGNoYW5nZWQufFBvb2xDb21taXNzaW9uQ2hhbmdlUmF0ZVVwZGF0ZWQIARxwb29sX2lkEAEYUG9vbElkAAEsY2hhbmdlX3JhdGVBBAGcQ29tbWlzc2lvbkNoYW5nZVJhdGU8QmxvY2tOdW1iZXJGb3I8VD4+AA0EzEEgcG9vbCdzIGNvbW1pc3Npb24gYGNoYW5nZV9yYXRlYCBoYXMgYmVlbiBjaGFuZ2VkLpBQb29sQ29tbWlzc2lvbkNsYWltUGVybWlzc2lvblVwZGF0ZWQIARxwb29sX2lkEAEYUG9vbElkAAEocGVybWlzc2lvbkUEAbxPcHRpb248Q29tbWlzc2lvbkNsYWltUGVybWlzc2lvbjxUOjpBY2NvdW50SWQ+PgAOBMhQb29sIGNvbW1pc3Npb24gY2xhaW0gcGVybWlzc2lvbiBoYXMgYmVlbiB1cGRhdGVkLlRQb29sQ29tbWlzc2lvbkNsYWltZWQIARxwb29sX2lkEAEYUG9vbElkAAEoY29tbWlzc2lvbhgBMEJhbGFuY2VPZjxUPgAPBIRQb29sIGNvbW1pc3Npb24gaGFzIGJlZW4gY2xhaW1lZC5kTWluQmFsYW5jZURlZmljaXRBZGp1c3RlZAgBHHBvb2xfaWQQARhQb29sSWQAARhhbW91bnQYATBCYWxhbmNlT2Y8VD4AEATIVG9wcGVkIHVwIGRlZmljaXQgaW4gZnJvemVuIEVEIG9mIHRoZSByZXdhcmQgcG9vbC5gTWluQmFsYW5jZUV4Y2Vzc0FkanVzdGVkCAEccG9vbF9pZBABGFBvb2xJZAABGGFtb3VudBgBMEJhbGFuY2VPZjxUPgARBLxDbGFpbWVkIGV4Y2VzcyBmcm96ZW4gRUQgb2YgYWYgdGhlIHJld2FyZCBwb29sLgRYRXZlbnRzIG9mIHRoaXMgcGFsbGV0LmUHDExwYWxsZXRfZmFzdF91bnN0YWtlGHBhbGxldBRFdmVudAQEVAABFCBVbnN0YWtlZAgBFHN0YXNoAAEwVDo6QWNjb3VudElkAAEYcmVzdWx0iAE4RGlzcGF0Y2hSZXN1bHQAAARYQSBzdGFrZXIgd2FzIHVuc3Rha2VkLhxTbGFzaGVkCAEUc3Rhc2gAATBUOjpBY2NvdW50SWQAARhhbW91bnQYATBCYWxhbmNlT2Y8VD4AAQQZAUEgc3Rha2VyIHdhcyBzbGFzaGVkIGZvciByZXF1ZXN0aW5nIGZhc3QtdW5zdGFrZSB3aGlsc3QgYmVpbmcgZXhwb3NlZC4wQmF0Y2hDaGVja2VkBAEQZXJhc+UBATRWZWM8RXJhSW5kZXg+AAIERQFBIGJhdGNoIHdhcyBwYXJ0aWFsbHkgY2hlY2tlZCBmb3IgdGhlIGdpdmVuIGVyYXMsIGJ1dCB0aGUgcHJvY2VzcyBkaWQgbm90IGZpbmlzaC40QmF0Y2hGaW5pc2hlZAQBEHNpemUQAQx1MzIAAxCcQSBiYXRjaCBvZiBhIGdpdmVuIHNpemUgd2FzIHRlcm1pbmF0ZWQuAFUBVGhpcyBpcyBhbHdheXMgZm9sbG93cyBieSBhIG51bWJlciBvZiBgVW5zdGFrZWRgIG9yIGBTbGFzaGVkYCBldmVudHMsIG1hcmtpbmcgdGhlIGVuZOhvZiB0aGUgYmF0Y2guIEEgbmV3IGJhdGNoIHdpbGwgYmUgY3JlYXRlZCB1cG9uIG5leHQgYmxvY2suNEludGVybmFsRXJyb3IABAToQW4gaW50ZXJuYWwgZXJyb3IgaGFwcGVuZWQuIE9wZXJhdGlvbnMgd2lsbCBiZSBwYXVzZWQgbm93LgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldGkHEGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMkaW5jbHVzaW9uGHBhbGxldBRFdmVudAQEVAABEDxDYW5kaWRhdGVCYWNrZWQQAG0HAWRDYW5kaWRhdGVSZWNlaXB0PFQ6Okhhc2g+AADZBAEgSGVhZERhdGEAAHEHASRDb3JlSW5kZXgAAHUHAShHcm91cEluZGV4AAAEwEEgY2FuZGlkYXRlIHdhcyBiYWNrZWQuIGBbY2FuZGlkYXRlLCBoZWFkX2RhdGFdYERDYW5kaWRhdGVJbmNsdWRlZBAAbQcBZENhbmRpZGF0ZVJlY2VpcHQ8VDo6SGFzaD4AANkEASBIZWFkRGF0YQAAcQcBJENvcmVJbmRleAAAdQcBKEdyb3VwSW5kZXgAAQTIQSBjYW5kaWRhdGUgd2FzIGluY2x1ZGVkLiBgW2NhbmRpZGF0ZSwgaGVhZF9kYXRhXWBEQ2FuZGlkYXRlVGltZWRPdXQMAG0HAWRDYW5kaWRhdGVSZWNlaXB0PFQ6Okhhc2g+AADZBAEgSGVhZERhdGEAAHEHASRDb3JlSW5kZXgAAgS8QSBjYW5kaWRhdGUgdGltZWQgb3V0LiBgW2NhbmRpZGF0ZSwgaGVhZF9kYXRhXWBYVXB3YXJkTWVzc2FnZXNSZWNlaXZlZAgBEGZyb22NAgEYUGFyYUlkAAEUY291bnQQAQx1MzIAAwT4U29tZSB1cHdhcmQgbWVzc2FnZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIGFuZCB3aWxsIGJlIHByb2Nlc3NlZC4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXRtBwxMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2N0BDYW5kaWRhdGVSZWNlaXB0BARIATQACAEoZGVzY3JpcHRvcq0EAVhDYW5kaWRhdGVEZXNjcmlwdG9yPEg+AAFAY29tbWl0bWVudHNfaGFzaDQBEEhhc2gAAHEHDExwb2xrYWRvdF9wcmltaXRpdmVzCHY3JENvcmVJbmRleAAABAAQAQx1MzIAAHUHDExwb2xrYWRvdF9wcmltaXRpdmVzCHY3KEdyb3VwSW5kZXgAAAQAEAEMdTMyAAB5BxBscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zFHBhcmFzGHBhbGxldBRFdmVudAABIEhDdXJyZW50Q29kZVVwZGF0ZWQEAI0CARhQYXJhSWQAAATMQ3VycmVudCBjb2RlIGhhcyBiZWVuIHVwZGF0ZWQgZm9yIGEgUGFyYS4gYHBhcmFfaWRgSEN1cnJlbnRIZWFkVXBkYXRlZAQAjQIBGFBhcmFJZAABBMxDdXJyZW50IGhlYWQgaGFzIGJlZW4gdXBkYXRlZCBmb3IgYSBQYXJhLiBgcGFyYV9pZGBQQ29kZVVwZ3JhZGVTY2hlZHVsZWQEAI0CARhQYXJhSWQAAgTcQSBjb2RlIHVwZ3JhZGUgaGFzIGJlZW4gc2NoZWR1bGVkIGZvciBhIFBhcmEuIGBwYXJhX2lkYDBOZXdIZWFkTm90ZWQEAI0CARhQYXJhSWQAAwS8QSBuZXcgaGVhZCBoYXMgYmVlbiBub3RlZCBmb3IgYSBQYXJhLiBgcGFyYV9pZGAwQWN0aW9uUXVldWVkCACNAgEYUGFyYUlkAAAQATBTZXNzaW9uSW5kZXgABATwQSBwYXJhIGhhcyBiZWVuIHF1ZXVlZCB0byBleGVjdXRlIHBlbmRpbmcgYWN0aW9ucy4gYHBhcmFfaWRgPFB2ZkNoZWNrU3RhcnRlZAgAuQQBSFZhbGlkYXRpb25Db2RlSGFzaAAAjQIBGFBhcmFJZAAFCFUBVGhlIGdpdmVuIHBhcmEgZWl0aGVyIGluaXRpYXRlZCBvciBzdWJzY3JpYmVkIHRvIGEgUFZGIGNoZWNrIGZvciB0aGUgZ2l2ZW4gdmFsaWRhdGlvbmxjb2RlLiBgY29kZV9oYXNoYCBgcGFyYV9pZGBAUHZmQ2hlY2tBY2NlcHRlZAgAuQQBSFZhbGlkYXRpb25Db2RlSGFzaAAAjQIBGFBhcmFJZAAGCBEBVGhlIGdpdmVuIHZhbGlkYXRpb24gY29kZSB3YXMgYWNjZXB0ZWQgYnkgdGhlIFBWRiBwcmUtY2hlY2tpbmcgdm90ZS5UYGNvZGVfaGFzaGAgYHBhcmFfaWRgQFB2ZkNoZWNrUmVqZWN0ZWQIALkEAUhWYWxpZGF0aW9uQ29kZUhhc2gAAI0CARhQYXJhSWQABwgRAVRoZSBnaXZlbiB2YWxpZGF0aW9uIGNvZGUgd2FzIHJlamVjdGVkIGJ5IHRoZSBQVkYgcHJlLWNoZWNraW5nIHZvdGUuVGBjb2RlX2hhc2hgIGBwYXJhX2lkYAR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldH0HEGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMQaHJtcBhwYWxsZXQURXZlbnQEBFQAARxQT3BlbkNoYW5uZWxSZXF1ZXN0ZWQQARhzZW5kZXKNAgEYUGFyYUlkAAEkcmVjaXBpZW50jQIBGFBhcmFJZAABVHByb3Bvc2VkX21heF9jYXBhY2l0eRABDHUzMgABZHByb3Bvc2VkX21heF9tZXNzYWdlX3NpemUQAQx1MzIAAARwT3BlbiBIUk1QIGNoYW5uZWwgcmVxdWVzdGVkLkxPcGVuQ2hhbm5lbENhbmNlbGVkCAEwYnlfcGFyYWNoYWlujQIBGFBhcmFJZAABKGNoYW5uZWxfaWQZBQE0SHJtcENoYW5uZWxJZAABBCkBQW4gSFJNUCBjaGFubmVsIHJlcXVlc3Qgc2VudCBieSB0aGUgcmVjZWl2ZXIgd2FzIGNhbmNlbGVkIGJ5IGVpdGhlciBwYXJ0eS5MT3BlbkNoYW5uZWxBY2NlcHRlZAgBGHNlbmRlco0CARhQYXJhSWQAASRyZWNpcGllbnSNAgEYUGFyYUlkAAIEbE9wZW4gSFJNUCBjaGFubmVsIGFjY2VwdGVkLjRDaGFubmVsQ2xvc2VkCAEwYnlfcGFyYWNoYWlujQIBGFBhcmFJZAABKGNoYW5uZWxfaWQZBQE0SHJtcENoYW5uZWxJZAADBFBIUk1QIGNoYW5uZWwgY2xvc2VkLlhIcm1wQ2hhbm5lbEZvcmNlT3BlbmVkEAEYc2VuZGVyjQIBGFBhcmFJZAABJHJlY2lwaWVudI0CARhQYXJhSWQAAVRwcm9wb3NlZF9tYXhfY2FwYWNpdHkQAQx1MzIAAWRwcm9wb3NlZF9tYXhfbWVzc2FnZV9zaXplEAEMdTMyAAQErEFuIEhSTVAgY2hhbm5lbCB3YXMgb3BlbmVkIHZpYSBSb290IG9yaWdpbi5cSHJtcFN5c3RlbUNoYW5uZWxPcGVuZWQQARhzZW5kZXKNAgEYUGFyYUlkAAEkcmVjaXBpZW50jQIBGFBhcmFJZAABVHByb3Bvc2VkX21heF9jYXBhY2l0eRABDHUzMgABZHByb3Bvc2VkX21heF9tZXNzYWdlX3NpemUQAQx1MzIABQS8QW4gSFJNUCBjaGFubmVsIHdhcyBvcGVuZWQgd2l0aCBhIHN5c3RlbSBjaGFpbi5oT3BlbkNoYW5uZWxEZXBvc2l0c1VwZGF0ZWQIARhzZW5kZXKNAgEYUGFyYUlkAAEkcmVjaXBpZW50jQIBGFBhcmFJZAAGBKBBbiBIUk1QIGNoYW5uZWwncyBkZXBvc2l0cyB3ZXJlIHVwZGF0ZWQuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0gQcQbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucyBkaXNwdXRlcxhwYWxsZXQURXZlbnQEBFQAAQxARGlzcHV0ZUluaXRpYXRlZAgA7QQBNENhbmRpZGF0ZUhhc2gAAIUHATxEaXNwdXRlTG9jYXRpb24AAAQJAUEgZGlzcHV0ZSBoYXMgYmVlbiBpbml0aWF0ZWQuIFxbY2FuZGlkYXRlIGhhc2gsIGRpc3B1dGUgbG9jYXRpb25cXUBEaXNwdXRlQ29uY2x1ZGVkCADtBAE0Q2FuZGlkYXRlSGFzaAAAiQcBNERpc3B1dGVSZXN1bHQAAQjMQSBkaXNwdXRlIGhhcyBjb25jbHVkZWQgZm9yIG9yIGFnYWluc3QgYSBjYW5kaWRhdGUutGBcW3BhcmEgaWQsIGNhbmRpZGF0ZSBoYXNoLCBkaXNwdXRlIHJlc3VsdFxdYBhSZXZlcnQEABABREJsb2NrTnVtYmVyRm9yPFQ+AAIQ/EEgZGlzcHV0ZSBoYXMgY29uY2x1ZGVkIHdpdGggc3VwZXJtYWpvcml0eSBhZ2FpbnN0IGEgY2FuZGlkYXRlLg0BQmxvY2sgYXV0aG9ycyBzaG91bGQgbm8gbG9uZ2VyIGJ1aWxkIG9uIHRvcCBvZiB0aGlzIGhlYWQgYW5kIHNob3VsZAEBaW5zdGVhZCByZXZlcnQgdGhlIGJsb2NrIGF0IHRoZSBnaXZlbiBoZWlnaHQuIFRoaXMgc2hvdWxkIGJlIHRoZfxudW1iZXIgb2YgdGhlIGNoaWxkIG9mIHRoZSBsYXN0IGtub3duIHZhbGlkIGJsb2NrIGluIHRoZSBjaGFpbi4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXSFBwxscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zIGRpc3B1dGVzPERpc3B1dGVMb2NhdGlvbgABCBRMb2NhbAAAABhSZW1vdGUAAQAAiQcMbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucyBkaXNwdXRlczREaXNwdXRlUmVzdWx0AAEIFFZhbGlkAAAAHEludmFsaWQAAQAAjQcQbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWluc0hhc3NpZ25lcl9vbl9kZW1hbmQYcGFsbGV0FEV2ZW50BARUAAEITE9uRGVtYW5kT3JkZXJQbGFjZWQMARxwYXJhX2lkjQIBGFBhcmFJZAABKHNwb3RfcHJpY2UYATBCYWxhbmNlT2Y8VD4AAShvcmRlcmVkX2J5AAEwVDo6QWNjb3VudElkAAAEDQFBbiBvcmRlciB3YXMgcGxhY2VkIGF0IHNvbWUgc3BvdCBwcmljZSBhbW91bnQgYnkgb3JkZXJlciBvcmRlcmVkX2J5MFNwb3RQcmljZVNldAQBKHNwb3RfcHJpY2UYATBCYWxhbmNlT2Y8VD4AAQS4VGhlIHZhbHVlIG9mIHRoZSBzcG90IHByaWNlIGhhcyBsaWtlbHkgY2hhbmdlZAR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldJEHEFxwb2xrYWRvdF9ydW50aW1lX2NvbW1vbjxwYXJhc19yZWdpc3RyYXIYcGFsbGV0FEV2ZW50BARUAAEQKFJlZ2lzdGVyZWQIARxwYXJhX2lkjQIBGFBhcmFJZAABHG1hbmFnZXIAATBUOjpBY2NvdW50SWQAAAAwRGVyZWdpc3RlcmVkBAEccGFyYV9pZI0CARhQYXJhSWQAAQAgUmVzZXJ2ZWQIARxwYXJhX2lkjQIBGFBhcmFJZAABDHdobwABMFQ6OkFjY291bnRJZAACABxTd2FwcGVkCAEccGFyYV9pZI0CARhQYXJhSWQAASBvdGhlcl9pZI0CARhQYXJhSWQAAwAEfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXSVBxBccG9sa2Fkb3RfcnVudGltZV9jb21tb24Uc2xvdHMYcGFsbGV0FEV2ZW50BARUAAEIOE5ld0xlYXNlUGVyaW9kBAEwbGVhc2VfcGVyaW9kEAFATGVhc2VQZXJpb2RPZjxUPgAABJBBIG5ldyBgW2xlYXNlX3BlcmlvZF1gIGlzIGJlZ2lubmluZy4YTGVhc2VkGAEccGFyYV9pZI0CARhQYXJhSWQAARhsZWFzZXIAATBUOjpBY2NvdW50SWQAATBwZXJpb2RfYmVnaW4QAUBMZWFzZVBlcmlvZE9mPFQ+AAEwcGVyaW9kX2NvdW50EAFATGVhc2VQZXJpb2RPZjxUPgABOGV4dHJhX3Jlc2VydmVkGAEwQmFsYW5jZU9mPFQ+AAEwdG90YWxfYW1vdW50GAEwQmFsYW5jZU9mPFQ+AAEMNQFBIHBhcmEgaGFzIHdvbiB0aGUgcmlnaHQgdG8gYSBjb250aW51b3VzIHNldCBvZiBsZWFzZSBwZXJpb2RzIGFzIGEgcGFyYWNoYWluLkUBRmlyc3QgYmFsYW5jZSBpcyBhbnkgZXh0cmEgYW1vdW50IHJlc2VydmVkIG9uIHRvcCBvZiB0aGUgcGFyYSdzIGV4aXN0aW5nIGRlcG9zaXQusFNlY29uZCBiYWxhbmNlIGlzIHRoZSB0b3RhbCBhbW91bnQgcmVzZXJ2ZWQuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0mQcQXHBvbGthZG90X3J1bnRpbWVfY29tbW9uIGF1Y3Rpb25zGHBhbGxldBRFdmVudAQEVAABHDhBdWN0aW9uU3RhcnRlZAwBNGF1Y3Rpb25faW5kZXgQATBBdWN0aW9uSW5kZXgAATBsZWFzZV9wZXJpb2QQAUBMZWFzZVBlcmlvZE9mPFQ+AAEYZW5kaW5nEAFEQmxvY2tOdW1iZXJGb3I8VD4AAAhJAUFuIGF1Y3Rpb24gc3RhcnRlZC4gUHJvdmlkZXMgaXRzIGluZGV4IGFuZCB0aGUgYmxvY2sgbnVtYmVyIHdoZXJlIGl0IHdpbGwgYmVnaW4gdG8VAWNsb3NlIGFuZCB0aGUgZmlyc3QgbGVhc2UgcGVyaW9kIG9mIHRoZSBxdWFkcnVwbGV0IHRoYXQgaXMgYXVjdGlvbmVkLjRBdWN0aW9uQ2xvc2VkBAE0YXVjdGlvbl9pbmRleBABMEF1Y3Rpb25JbmRleAABBLhBbiBhdWN0aW9uIGVuZGVkLiBBbGwgZnVuZHMgYmVjb21lIHVucmVzZXJ2ZWQuIFJlc2VydmVkDAEYYmlkZGVyAAEwVDo6QWNjb3VudElkAAE4ZXh0cmFfcmVzZXJ2ZWQYATBCYWxhbmNlT2Y8VD4AATB0b3RhbF9hbW91bnQYATBCYWxhbmNlT2Y8VD4AAghJAUZ1bmRzIHdlcmUgcmVzZXJ2ZWQgZm9yIGEgd2lubmluZyBiaWQuIEZpcnN0IGJhbGFuY2UgaXMgdGhlIGV4dHJhIGFtb3VudCByZXNlcnZlZC5QU2Vjb25kIGlzIHRoZSB0b3RhbC4oVW5yZXNlcnZlZAgBGGJpZGRlcgABMFQ6OkFjY291bnRJZAABGGFtb3VudBgBMEJhbGFuY2VPZjxUPgADBCkBRnVuZHMgd2VyZSB1bnJlc2VydmVkIHNpbmNlIGJpZGRlciBpcyBubyBsb25nZXIgYWN0aXZlLiBgW2JpZGRlciwgYW1vdW50XWBIUmVzZXJ2ZUNvbmZpc2NhdGVkDAEccGFyYV9pZI0CARhQYXJhSWQAARhsZWFzZXIAATBUOjpBY2NvdW50SWQAARhhbW91bnQYATBCYWxhbmNlT2Y8VD4ABAhVAVNvbWVvbmUgYXR0ZW1wdGVkIHRvIGxlYXNlIHRoZSBzYW1lIHNsb3QgdHdpY2UgZm9yIGEgcGFyYWNoYWluLiBUaGUgYW1vdW50IGlzIGhlbGQgaW64cmVzZXJ2ZSBidXQgbm8gcGFyYWNoYWluIHNsb3QgaGFzIGJlZW4gbGVhc2VkLixCaWRBY2NlcHRlZBQBGGJpZGRlcgABMFQ6OkFjY291bnRJZAABHHBhcmFfaWSNAgEYUGFyYUlkAAEYYW1vdW50GAEwQmFsYW5jZU9mPFQ+AAEoZmlyc3Rfc2xvdBABQExlYXNlUGVyaW9kT2Y8VD4AASRsYXN0X3Nsb3QQAUBMZWFzZVBlcmlvZE9mPFQ+AAUEyEEgbmV3IGJpZCBoYXMgYmVlbiBhY2NlcHRlZCBhcyB0aGUgY3VycmVudCB3aW5uZXIuNFdpbm5pbmdPZmZzZXQIATRhdWN0aW9uX2luZGV4EAEwQXVjdGlvbkluZGV4AAEwYmxvY2tfbnVtYmVyEAFEQmxvY2tOdW1iZXJGb3I8VD4ABghZAVRoZSB3aW5uaW5nIG9mZnNldCB3YXMgY2hvc2VuIGZvciBhbiBhdWN0aW9uLiBUaGlzIHdpbGwgbWFwIGludG8gdGhlIGBXaW5uaW5nYCBzdG9yYWdlEG1hcC4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXSdBxBccG9sa2Fkb3RfcnVudGltZV9jb21tb24kY3Jvd2Rsb2FuGHBhbGxldBRFdmVudAQEVAABKBxDcmVhdGVkBAEccGFyYV9pZI0CARhQYXJhSWQAAASMQ3JlYXRlIGEgbmV3IGNyb3dkbG9hbmluZyBjYW1wYWlnbi4sQ29udHJpYnV0ZWQMAQx3aG8AATBUOjpBY2NvdW50SWQAAShmdW5kX2luZGV4jQIBGFBhcmFJZAABGGFtb3VudBgBMEJhbGFuY2VPZjxUPgABBHBDb250cmlidXRlZCB0byBhIGNyb3dkIHNhbGUuIFdpdGhkcmV3DAEMd2hvAAEwVDo6QWNjb3VudElkAAEoZnVuZF9pbmRleI0CARhQYXJhSWQAARhhbW91bnQYATBCYWxhbmNlT2Y8VD4AAgScV2l0aGRyZXcgZnVsbCBiYWxhbmNlIG9mIGEgY29udHJpYnV0b3IuRFBhcnRpYWxseVJlZnVuZGVkBAEccGFyYV9pZI0CARhQYXJhSWQAAwgtAVRoZSBsb2FucyBpbiBhIGZ1bmQgaGF2ZSBiZWVuIHBhcnRpYWxseSBkaXNzb2x2ZWQsIGkuZS4gdGhlcmUgYXJlIHNvbWUgbGVmdLRvdmVyIGNoaWxkIGtleXMgdGhhdCBzdGlsbCBuZWVkIHRvIGJlIGtpbGxlZC4sQWxsUmVmdW5kZWQEARxwYXJhX2lkjQIBGFBhcmFJZAAEBJxBbGwgbG9hbnMgaW4gYSBmdW5kIGhhdmUgYmVlbiByZWZ1bmRlZC4kRGlzc29sdmVkBAEccGFyYV9pZI0CARhQYXJhSWQABQRIRnVuZCBpcyBkaXNzb2x2ZWQuPEhhbmRsZUJpZFJlc3VsdAgBHHBhcmFfaWSNAgEYUGFyYUlkAAEYcmVzdWx0iAE4RGlzcGF0Y2hSZXN1bHQABgT0VGhlIHJlc3VsdCBvZiB0cnlpbmcgdG8gc3VibWl0IGEgbmV3IGJpZCB0byB0aGUgU2xvdHMgcGFsbGV0LhhFZGl0ZWQEARxwYXJhX2lkjQIBGFBhcmFJZAAHBMRUaGUgY29uZmlndXJhdGlvbiB0byBhIGNyb3dkbG9hbiBoYXMgYmVlbiBlZGl0ZWQuLE1lbW9VcGRhdGVkDAEMd2hvAAEwVDo6QWNjb3VudElkAAEccGFyYV9pZI0CARhQYXJhSWQAARBtZW1vOAEcVmVjPHU4PgAIBGBBIG1lbW8gaGFzIGJlZW4gdXBkYXRlZC48QWRkZWRUb05ld1JhaXNlBAEccGFyYV9pZI0CARhQYXJhSWQACQSgQSBwYXJhY2hhaW4gaGFzIGJlZW4gbW92ZWQgdG8gYE5ld1JhaXNlYAR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldKEHEGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMgY29yZXRpbWUYcGFsbGV0FEV2ZW50BARUAAEIUFJldmVudWVJbmZvUmVxdWVzdGVkBAEQd2hlbhABREJsb2NrTnVtYmVyRm9yPFQ+AAAEIQFUaGUgYnJva2VyIGNoYWluIGhhcyBhc2tlZCBmb3IgcmV2ZW51ZSBpbmZvcm1hdGlvbiBmb3IgYSBzcGVjaWZpYyBibG9jay4wQ29yZUFzc2lnbmVkBAEQY29yZXEHASRDb3JlSW5kZXgAAQTsQSBjb3JlIGhhcyByZWNlaXZlZCBhIG5ldyBhc3NpZ25tZW50IGZyb20gdGhlIGJyb2tlciBjaGFpbi4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXSlBwxscGFsbGV0X3N0YXRlX3RyaWVfbWlncmF0aW9uGHBhbGxldBRFdmVudAQEVAABECBNaWdyYXRlZAwBDHRvcBABDHUzMgABFGNoaWxkEAEMdTMyAAEcY29tcHV0ZakHAUBNaWdyYXRpb25Db21wdXRlAAAIOQFHaXZlbiBudW1iZXIgb2YgYCh0b3AsIGNoaWxkKWAga2V5cyB3ZXJlIG1pZ3JhdGVkIHJlc3BlY3RpdmVseSwgd2l0aCB0aGUgZ2l2ZW4oYGNvbXB1dGVgLhxTbGFzaGVkCAEMd2hvAAEwVDo6QWNjb3VudElkAAEYYW1vdW50GAEwQmFsYW5jZU9mPFQ+AAEEtFNvbWUgYWNjb3VudCBnb3Qgc2xhc2hlZCBieSB0aGUgZ2l2ZW4gYW1vdW50LlRBdXRvTWlncmF0aW9uRmluaXNoZWQAAgSEVGhlIGF1dG8gbWlncmF0aW9uIHRhc2sgZmluaXNoZWQuGEhhbHRlZAQBFGVycm9yrQcBIEVycm9yPFQ+AAME7E1pZ3JhdGlvbiBnb3QgaGFsdGVkIGR1ZSB0byBhbiBlcnJvciBvciBtaXNzLWNvbmZpZ3VyYXRpb24uBHBJbm5lciBldmVudHMgb2YgdGhpcyBwYWxsZXQuqQcMbHBhbGxldF9zdGF0ZV90cmllX21pZ3JhdGlvbhhwYWxsZXRATWlncmF0aW9uQ29tcHV0ZQABCBhTaWduZWQAAAAQQXV0bwABAACtBwxscGFsbGV0X3N0YXRlX3RyaWVfbWlncmF0aW9uGHBhbGxldBRFcnJvcgQEVAABGDxNYXhTaWduZWRMaW1pdHMAAASATWF4IHNpZ25lZCBsaW1pdHMgbm90IHJlc3BlY3RlZC4oS2V5VG9vTG9uZwABHLRBIGtleSB3YXMgbG9uZ2VyIHRoYW4gdGhlIGNvbmZpZ3VyZWQgbWF4aW11bS4AEQFUaGlzIG1lYW5zIHRoYXQgdGhlIG1pZ3JhdGlvbiBoYWx0ZWQgYXQgdGhlIGN1cnJlbnQgW2BQcm9ncmVzc2BdIGFuZAEBY2FuIGJlIHJlc3VtZWQgd2l0aCBhIGxhcmdlciBbYGNyYXRlOjpDb25maWc6Ok1heEtleUxlbmBdIHZhbHVlLiEBUmV0cnlpbmcgd2l0aCB0aGUgc2FtZSBbYGNyYXRlOjpDb25maWc6Ok1heEtleUxlbmBdIHZhbHVlIHdpbGwgbm90IHdvcmsuRQFUaGUgdmFsdWUgc2hvdWxkIG9ubHkgYmUgaW5jcmVhc2VkIHRvIGF2b2lkIGEgc3RvcmFnZSBtaWdyYXRpb24gZm9yIHRoZSBjdXJyZW50bHmQc3RvcmVkIFtgY3JhdGU6OlByb2dyZXNzOjpMYXN0S2V5YF0uOE5vdEVub3VnaEZ1bmRzAAIElHN1Ym1pdHRlciBkb2VzIG5vdCBoYXZlIGVub3VnaCBmdW5kcy4oQmFkV2l0bmVzcwADBGhCYWQgd2l0bmVzcyBkYXRhIHByb3ZpZGVkLmRTaWduZWRNaWdyYXRpb25Ob3RBbGxvd2VkAAQEJQFTaWduZWQgbWlncmF0aW9uIGlzIG5vdCBhbGxvd2VkIGJlY2F1c2UgdGhlIG1heGltdW0gbGltaXQgaXMgbm90IHNldCB5ZXQuMEJhZENoaWxkUm9vdAAFBGBCYWQgY2hpbGQgcm9vdCBwcm92aWRlZC4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQusQcMKHBhbGxldF94Y20YcGFsbGV0FEV2ZW50BARUAAFgJEF0dGVtcHRlZAQBHG91dGNvbWW1BwFQeGNtOjpsYXRlc3Q6Ok91dGNvbWUAAASoRXhlY3V0aW9uIG9mIGFuIFhDTSBtZXNzYWdlIHdhcyBhdHRlbXB0ZWQuEFNlbnQQARhvcmlnaW4NAQEgTG9jYXRpb24AASxkZXN0aW5hdGlvbg0BASBMb2NhdGlvbgABHG1lc3NhZ2VBBgEcWGNtPCgpPgABKG1lc3NhZ2VfaWQEARxYY21IYXNoAAEEXEEgWENNIG1lc3NhZ2Ugd2FzIHNlbnQuSFVuZXhwZWN0ZWRSZXNwb25zZQgBGG9yaWdpbg0BASBMb2NhdGlvbgABIHF1ZXJ5X2lkMAEcUXVlcnlJZAACDFkBUXVlcnkgcmVzcG9uc2UgcmVjZWl2ZWQgd2hpY2ggZG9lcyBub3QgbWF0Y2ggYSByZWdpc3RlcmVkIHF1ZXJ5LiBUaGlzIG1heSBiZSBiZWNhdXNlIGFVAW1hdGNoaW5nIHF1ZXJ5IHdhcyBuZXZlciByZWdpc3RlcmVkLCBpdCBtYXkgYmUgYmVjYXVzZSBpdCBpcyBhIGR1cGxpY2F0ZSByZXNwb25zZSwgb3JwYmVjYXVzZSB0aGUgcXVlcnkgdGltZWQgb3V0LjRSZXNwb25zZVJlYWR5CAEgcXVlcnlfaWQwARxRdWVyeUlkAAEgcmVzcG9uc2VhBgEgUmVzcG9uc2UAAwhdAVF1ZXJ5IHJlc3BvbnNlIGhhcyBiZWVuIHJlY2VpdmVkIGFuZCBpcyByZWFkeSBmb3IgdGFraW5nIHdpdGggYHRha2VfcmVzcG9uc2VgLiBUaGVyZSBpc4BubyByZWdpc3RlcmVkIG5vdGlmaWNhdGlvbiBjYWxsLiBOb3RpZmllZAwBIHF1ZXJ5X2lkMAEcUXVlcnlJZAABMHBhbGxldF9pbmRleAgBCHU4AAEoY2FsbF9pbmRleAgBCHU4AAQIWQFRdWVyeSByZXNwb25zZSBoYXMgYmVlbiByZWNlaXZlZCBhbmQgcXVlcnkgaXMgcmVtb3ZlZC4gVGhlIHJlZ2lzdGVyZWQgbm90aWZpY2F0aW9uIGhhc6hiZWVuIGRpc3BhdGNoZWQgYW5kIGV4ZWN1dGVkIHN1Y2Nlc3NmdWxseS5ATm90aWZ5T3ZlcndlaWdodBQBIHF1ZXJ5X2lkMAEcUXVlcnlJZAABMHBhbGxldF9pbmRleAgBCHU4AAEoY2FsbF9pbmRleAgBCHU4AAE0YWN0dWFsX3dlaWdodCgBGFdlaWdodAABTG1heF9idWRnZXRlZF93ZWlnaHQoARhXZWlnaHQABQxJAVF1ZXJ5IHJlc3BvbnNlIGhhcyBiZWVuIHJlY2VpdmVkIGFuZCBxdWVyeSBpcyByZW1vdmVkLiBUaGUgcmVnaXN0ZXJlZCBub3RpZmljYXRpb25ZAWNvdWxkIG5vdCBiZSBkaXNwYXRjaGVkIGJlY2F1c2UgdGhlIGRpc3BhdGNoIHdlaWdodCBpcyBncmVhdGVyIHRoYW4gdGhlIG1heGltdW0gd2VpZ2h05G9yaWdpbmFsbHkgYnVkZ2V0ZWQgYnkgdGhpcyBydW50aW1lIGZvciB0aGUgcXVlcnkgcmVzdWx0LkxOb3RpZnlEaXNwYXRjaEVycm9yDAEgcXVlcnlfaWQwARxRdWVyeUlkAAEwcGFsbGV0X2luZGV4CAEIdTgAAShjYWxsX2luZGV4CAEIdTgABghVAVF1ZXJ5IHJlc3BvbnNlIGhhcyBiZWVuIHJlY2VpdmVkIGFuZCBxdWVyeSBpcyByZW1vdmVkLiBUaGVyZSB3YXMgYSBnZW5lcmFsIGVycm9yIHdpdGiIZGlzcGF0Y2hpbmcgdGhlIG5vdGlmaWNhdGlvbiBjYWxsLkhOb3RpZnlEZWNvZGVGYWlsZWQMASBxdWVyeV9pZDABHFF1ZXJ5SWQAATBwYWxsZXRfaW5kZXgIAQh1OAABKGNhbGxfaW5kZXgIAQh1OAAHDFEBUXVlcnkgcmVzcG9uc2UgaGFzIGJlZW4gcmVjZWl2ZWQgYW5kIHF1ZXJ5IGlzIHJlbW92ZWQuIFRoZSBkaXNwYXRjaCB3YXMgdW5hYmxlIHRvIGJlWQFkZWNvZGVkIGludG8gYSBgQ2FsbGA7IHRoaXMgbWlnaHQgYmUgZHVlIHRvIGRpc3BhdGNoIGZ1bmN0aW9uIGhhdmluZyBhIHNpZ25hdHVyZSB3aGljaJRpcyBub3QgYChvcmlnaW4sIFF1ZXJ5SWQsIFJlc3BvbnNlKWAuQEludmFsaWRSZXNwb25kZXIMARhvcmlnaW4NAQEgTG9jYXRpb24AASBxdWVyeV9pZDABHFF1ZXJ5SWQAAURleHBlY3RlZF9sb2NhdGlvbnUGAUBPcHRpb248TG9jYXRpb24+AAgMWQFFeHBlY3RlZCBxdWVyeSByZXNwb25zZSBoYXMgYmVlbiByZWNlaXZlZCBidXQgdGhlIG9yaWdpbiBsb2NhdGlvbiBvZiB0aGUgcmVzcG9uc2UgZG9lc1UBbm90IG1hdGNoIHRoYXQgZXhwZWN0ZWQuIFRoZSBxdWVyeSByZW1haW5zIHJlZ2lzdGVyZWQgZm9yIGEgbGF0ZXIsIHZhbGlkLCByZXNwb25zZSB0b2xiZSByZWNlaXZlZCBhbmQgYWN0ZWQgdXBvbi5cSW52YWxpZFJlc3BvbmRlclZlcnNpb24IARhvcmlnaW4NAQEgTG9jYXRpb24AASBxdWVyeV9pZDABHFF1ZXJ5SWQACRxRAUV4cGVjdGVkIHF1ZXJ5IHJlc3BvbnNlIGhhcyBiZWVuIHJlY2VpdmVkIGJ1dCB0aGUgZXhwZWN0ZWQgb3JpZ2luIGxvY2F0aW9uIHBsYWNlZCBpbk0Bc3RvcmFnZSBieSB0aGlzIHJ1bnRpbWUgcHJldmlvdXNseSBjYW5ub3QgYmUgZGVjb2RlZC4gVGhlIHF1ZXJ5IHJlbWFpbnMgcmVnaXN0ZXJlZC4AQQFUaGlzIGlzIHVuZXhwZWN0ZWQgKHNpbmNlIGEgbG9jYXRpb24gcGxhY2VkIGluIHN0b3JhZ2UgaW4gYSBwcmV2aW91c2x5IGV4ZWN1dGluZ00BcnVudGltZSBzaG91bGQgYmUgcmVhZGFibGUgcHJpb3IgdG8gcXVlcnkgdGltZW91dCkgYW5kIGRhbmdlcm91cyBzaW5jZSB0aGUgcG9zc2libHlZAXZhbGlkIHJlc3BvbnNlIHdpbGwgYmUgZHJvcHBlZC4gTWFudWFsIGdvdmVybmFuY2UgaW50ZXJ2ZW50aW9uIGlzIHByb2JhYmx5IGdvaW5nIHRvIGJlHG5lZWRlZC40UmVzcG9uc2VUYWtlbgQBIHF1ZXJ5X2lkMAEcUXVlcnlJZAAKBMhSZWNlaXZlZCBxdWVyeSByZXNwb25zZSBoYXMgYmVlbiByZWFkIGFuZCByZW1vdmVkLjRBc3NldHNUcmFwcGVkDAEQaGFzaDQBEEgyNTYAARhvcmlnaW4NAQEgTG9jYXRpb24AARhhc3NldHOJBgE8VmVyc2lvbmVkQXNzZXRzAAsEuFNvbWUgYXNzZXRzIGhhdmUgYmVlbiBwbGFjZWQgaW4gYW4gYXNzZXQgdHJhcC5UVmVyc2lvbkNoYW5nZU5vdGlmaWVkEAEsZGVzdGluYXRpb24NAQEgTG9jYXRpb24AARhyZXN1bHQQAShYY21WZXJzaW9uAAEQY29zdE0GARhBc3NldHMAAShtZXNzYWdlX2lkBAEcWGNtSGFzaAAMDCUBQW4gWENNIHZlcnNpb24gY2hhbmdlIG5vdGlmaWNhdGlvbiBtZXNzYWdlIGhhcyBiZWVuIGF0dGVtcHRlZCB0byBiZSBzZW50LgDgVGhlIGNvc3Qgb2Ygc2VuZGluZyBpdCAoYm9ybmUgYnkgdGhlIGNoYWluKSBpcyBpbmNsdWRlZC5cU3VwcG9ydGVkVmVyc2lvbkNoYW5nZWQIASBsb2NhdGlvbg0BASBMb2NhdGlvbgABHHZlcnNpb24QAShYY21WZXJzaW9uAA0IOQFUaGUgc3VwcG9ydGVkIHZlcnNpb24gb2YgYSBsb2NhdGlvbiBoYXMgYmVlbiBjaGFuZ2VkLiBUaGlzIG1pZ2h0IGJlIHRocm91Z2ggYW7AYXV0b21hdGljIG5vdGlmaWNhdGlvbiBvciBhIG1hbnVhbCBpbnRlcnZlbnRpb24uUE5vdGlmeVRhcmdldFNlbmRGYWlsDAEgbG9jYXRpb24NAQEgTG9jYXRpb24AASBxdWVyeV9pZDABHFF1ZXJ5SWQAARRlcnJvcgkGASBYY21FcnJvcgAOCFkBQSBnaXZlbiBsb2NhdGlvbiB3aGljaCBoYWQgYSB2ZXJzaW9uIGNoYW5nZSBzdWJzY3JpcHRpb24gd2FzIGRyb3BwZWQgb3dpbmcgdG8gYW4gZXJyb3J8c2VuZGluZyB0aGUgbm90aWZpY2F0aW9uIHRvIGl0LmROb3RpZnlUYXJnZXRNaWdyYXRpb25GYWlsCAEgbG9jYXRpb25FAQFEVmVyc2lvbmVkTG9jYXRpb24AASBxdWVyeV9pZDABHFF1ZXJ5SWQADwhZAUEgZ2l2ZW4gbG9jYXRpb24gd2hpY2ggaGFkIGEgdmVyc2lvbiBjaGFuZ2Ugc3Vic2NyaXB0aW9uIHdhcyBkcm9wcGVkIG93aW5nIHRvIGFuIGVycm9ytG1pZ3JhdGluZyB0aGUgbG9jYXRpb24gdG8gb3VyIG5ldyBYQ00gZm9ybWF0LlRJbnZhbGlkUXVlcmllclZlcnNpb24IARhvcmlnaW4NAQEgTG9jYXRpb24AASBxdWVyeV9pZDABHFF1ZXJ5SWQAEBxVAUV4cGVjdGVkIHF1ZXJ5IHJlc3BvbnNlIGhhcyBiZWVuIHJlY2VpdmVkIGJ1dCB0aGUgZXhwZWN0ZWQgcXVlcmllciBsb2NhdGlvbiBwbGFjZWQgaW5NAXN0b3JhZ2UgYnkgdGhpcyBydW50aW1lIHByZXZpb3VzbHkgY2Fubm90IGJlIGRlY29kZWQuIFRoZSBxdWVyeSByZW1haW5zIHJlZ2lzdGVyZWQuAEEBVGhpcyBpcyB1bmV4cGVjdGVkIChzaW5jZSBhIGxvY2F0aW9uIHBsYWNlZCBpbiBzdG9yYWdlIGluIGEgcHJldmlvdXNseSBleGVjdXRpbmdNAXJ1bnRpbWUgc2hvdWxkIGJlIHJlYWRhYmxlIHByaW9yIHRvIHF1ZXJ5IHRpbWVvdXQpIGFuZCBkYW5nZXJvdXMgc2luY2UgdGhlIHBvc3NpYmx5WQF2YWxpZCByZXNwb25zZSB3aWxsIGJlIGRyb3BwZWQuIE1hbnVhbCBnb3Zlcm5hbmNlIGludGVydmVudGlvbiBpcyBwcm9iYWJseSBnb2luZyB0byBiZRxuZWVkZWQuOEludmFsaWRRdWVyaWVyEAEYb3JpZ2luDQEBIExvY2F0aW9uAAEgcXVlcnlfaWQwARxRdWVyeUlkAAFAZXhwZWN0ZWRfcXVlcmllcg0BASBMb2NhdGlvbgABUG1heWJlX2FjdHVhbF9xdWVyaWVydQYBQE9wdGlvbjxMb2NhdGlvbj4AEQxdAUV4cGVjdGVkIHF1ZXJ5IHJlc3BvbnNlIGhhcyBiZWVuIHJlY2VpdmVkIGJ1dCB0aGUgcXVlcmllciBsb2NhdGlvbiBvZiB0aGUgcmVzcG9uc2UgZG9lc1EBbm90IG1hdGNoIHRoZSBleHBlY3RlZC4gVGhlIHF1ZXJ5IHJlbWFpbnMgcmVnaXN0ZXJlZCBmb3IgYSBsYXRlciwgdmFsaWQsIHJlc3BvbnNlIHRvbGJlIHJlY2VpdmVkIGFuZCBhY3RlZCB1cG9uLlBWZXJzaW9uTm90aWZ5U3RhcnRlZAwBLGRlc3RpbmF0aW9uDQEBIExvY2F0aW9uAAEQY29zdE0GARhBc3NldHMAAShtZXNzYWdlX2lkBAEcWGNtSGFzaAASCFkBQSByZW1vdGUgaGFzIHJlcXVlc3RlZCBYQ00gdmVyc2lvbiBjaGFuZ2Ugbm90aWZpY2F0aW9uIGZyb20gdXMgYW5kIHdlIGhhdmUgaG9ub3JlZCBpdC4dAUEgdmVyc2lvbiBpbmZvcm1hdGlvbiBtZXNzYWdlIGlzIHNlbnQgdG8gdGhlbSBhbmQgaXRzIGNvc3QgaXMgaW5jbHVkZWQuWFZlcnNpb25Ob3RpZnlSZXF1ZXN0ZWQMASxkZXN0aW5hdGlvbg0BASBMb2NhdGlvbgABEGNvc3RNBgEYQXNzZXRzAAEobWVzc2FnZV9pZAQBHFhjbUhhc2gAEwQ9AVdlIGhhdmUgcmVxdWVzdGVkIHRoYXQgYSByZW1vdGUgY2hhaW4gc2VuZCB1cyBYQ00gdmVyc2lvbiBjaGFuZ2Ugbm90aWZpY2F0aW9ucy5gVmVyc2lvbk5vdGlmeVVucmVxdWVzdGVkDAEsZGVzdGluYXRpb24NAQEgTG9jYXRpb24AARBjb3N0TQYBGEFzc2V0cwABKG1lc3NhZ2VfaWQEARxYY21IYXNoABQIJQFXZSBoYXZlIHJlcXVlc3RlZCB0aGF0IGEgcmVtb3RlIGNoYWluIHN0b3BzIHNlbmRpbmcgdXMgWENNIHZlcnNpb24gY2hhbmdlOG5vdGlmaWNhdGlvbnMuIEZlZXNQYWlkCAEYcGF5aW5nDQEBIExvY2F0aW9uAAEQZmVlc00GARhBc3NldHMAFQQxAUZlZXMgd2VyZSBwYWlkIGZyb20gYSBsb2NhdGlvbiBmb3IgYW4gb3BlcmF0aW9uIChvZnRlbiBmb3IgdXNpbmcgYFNlbmRYY21gKS40QXNzZXRzQ2xhaW1lZAwBEGhhc2g0ARBIMjU2AAEYb3JpZ2luDQEBIExvY2F0aW9uAAEYYXNzZXRziQYBPFZlcnNpb25lZEFzc2V0cwAWBMBTb21lIGFzc2V0cyBoYXZlIGJlZW4gY2xhaW1lZCBmcm9tIGFuIGFzc2V0IHRyYXBgVmVyc2lvbk1pZ3JhdGlvbkZpbmlzaGVkBAEcdmVyc2lvbhABKFhjbVZlcnNpb24AFwSEQSBYQ00gdmVyc2lvbiBtaWdyYXRpb24gZmluaXNoZWQuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0tQcQLHN0YWdpbmdfeGNtCHY0GHRyYWl0cxxPdXRjb21lAAEMIENvbXBsZXRlBAEQdXNlZCgBGFdlaWdodAAAAChJbmNvbXBsZXRlCAEQdXNlZCgBGFdlaWdodAABFGVycm9yCQYBFEVycm9yAAEAFEVycm9yBAEUZXJyb3IJBgEURXJyb3IAAgAAuQcMUHBhbGxldF9tZXNzYWdlX3F1ZXVlGHBhbGxldBRFdmVudAQEVAABEEBQcm9jZXNzaW5nRmFpbGVkDAEIaWQ0ARBIMjU2BJRUaGUgYGJsYWtlMl8yNTZgIGhhc2ggb2YgdGhlIG1lc3NhZ2UuARhvcmlnaW7FBgFITWVzc2FnZU9yaWdpbk9mPFQ+BGRUaGUgcXVldWUgb2YgdGhlIG1lc3NhZ2UuARRlcnJvcr0HAUxQcm9jZXNzTWVzc2FnZUVycm9yEGBUaGUgZXJyb3IgdGhhdCBvY2N1cnJlZC4ASQFUaGlzIGVycm9yIGlzIHByZXR0eSBvcGFxdWUuIE1vcmUgZmluZS1ncmFpbmVkIGVycm9ycyBuZWVkIHRvIGJlIGVtaXR0ZWQgYXMgZXZlbnRzaGJ5IHRoZSBgTWVzc2FnZVByb2Nlc3NvcmAuAARVAU1lc3NhZ2UgZGlzY2FyZGVkIGR1ZSB0byBhbiBlcnJvciBpbiB0aGUgYE1lc3NhZ2VQcm9jZXNzb3JgICh1c3VhbGx5IGEgZm9ybWF0IGVycm9yKS4kUHJvY2Vzc2VkEAEIaWQ0ARBIMjU2BJRUaGUgYGJsYWtlMl8yNTZgIGhhc2ggb2YgdGhlIG1lc3NhZ2UuARhvcmlnaW7FBgFITWVzc2FnZU9yaWdpbk9mPFQ+BGRUaGUgcXVldWUgb2YgdGhlIG1lc3NhZ2UuASx3ZWlnaHRfdXNlZCgBGFdlaWdodATASG93IG11Y2ggd2VpZ2h0IHdhcyB1c2VkIHRvIHByb2Nlc3MgdGhlIG1lc3NhZ2UuARxzdWNjZXNzIAEQYm9vbBiIV2hldGhlciB0aGUgbWVzc2FnZSB3YXMgcHJvY2Vzc2VkLgBJAU5vdGUgdGhhdCB0aGlzIGRvZXMgbm90IG1lYW4gdGhhdCB0aGUgdW5kZXJseWluZyBgTWVzc2FnZVByb2Nlc3NvcmAgd2FzIGludGVybmFsbHk1AXN1Y2Nlc3NmdWwuIEl0ICpzb2xlbHkqIG1lYW5zIHRoYXQgdGhlIE1RIHBhbGxldCB3aWxsIHRyZWF0IHRoaXMgYXMgYSBzdWNjZXNzTQFjb25kaXRpb24gYW5kIGRpc2NhcmQgdGhlIG1lc3NhZ2UuIEFueSBpbnRlcm5hbCBlcnJvciBuZWVkcyB0byBiZSBlbWl0dGVkIGFzIGV2ZW50c2hieSB0aGUgYE1lc3NhZ2VQcm9jZXNzb3JgLgEEVE1lc3NhZ2UgaXMgcHJvY2Vzc2VkLkhPdmVyd2VpZ2h0RW5xdWV1ZWQQAQhpZAQBIFt1ODsgMzJdBJRUaGUgYGJsYWtlMl8yNTZgIGhhc2ggb2YgdGhlIG1lc3NhZ2UuARhvcmlnaW7FBgFITWVzc2FnZU9yaWdpbk9mPFQ+BGRUaGUgcXVldWUgb2YgdGhlIG1lc3NhZ2UuAShwYWdlX2luZGV4EAEkUGFnZUluZGV4BGBUaGUgcGFnZSBvZiB0aGUgbWVzc2FnZS4BNG1lc3NhZ2VfaW5kZXgQARxUOjpTaXplBKRUaGUgaW5kZXggb2YgdGhlIG1lc3NhZ2Ugd2l0aGluIHRoZSBwYWdlLgIEjE1lc3NhZ2UgcGxhY2VkIGluIG92ZXJ3ZWlnaHQgcXVldWUuKFBhZ2VSZWFwZWQIARhvcmlnaW7FBgFITWVzc2FnZU9yaWdpbk9mPFQ+BFhUaGUgcXVldWUgb2YgdGhlIHBhZ2UuARRpbmRleBABJFBhZ2VJbmRleARYVGhlIGluZGV4IG9mIHRoZSBwYWdlLgMEVFRoaXMgcGFnZSB3YXMgcmVhcGVkLgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldL0HEDRmcmFtZV9zdXBwb3J0GHRyYWl0cyBtZXNzYWdlc0xQcm9jZXNzTWVzc2FnZUVycm9yAAEYJEJhZEZvcm1hdAAAABxDb3JydXB0AAEALFVuc3VwcG9ydGVkAAIAKE92ZXJ3ZWlnaHQEACgBGFdlaWdodAADABRZaWVsZAAEAERTdGFja0xpbWl0UmVhY2hlZAAFAADBBwxEcGFsbGV0X2Fzc2V0X3JhdGUYcGFsbGV0FEV2ZW50BARUAAEMQEFzc2V0UmF0ZUNyZWF0ZWQIAShhc3NldF9raW5k3AEwVDo6QXNzZXRLaW5kAAEQcmF0ZdEGASRGaXhlZFUxMjgAAABAQXNzZXRSYXRlUmVtb3ZlZAQBKGFzc2V0X2tpbmTcATBUOjpBc3NldEtpbmQAAQBAQXNzZXRSYXRlVXBkYXRlZAwBKGFzc2V0X2tpbmTcATBUOjpBc3NldEtpbmQAAQxvbGTRBgEkRml4ZWRVMTI4AAEMbmV30QYBJEZpeGVkVTEyOAACAAR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldMUHCDBmcmFtZV9zeXN0ZW0UUGhhc2UAAQw4QXBwbHlFeHRyaW5zaWMEABABDHUzMgAAADBGaW5hbGl6YXRpb24AAQA4SW5pdGlhbGl6YXRpb24AAgAAyQcAAAKAAM0HCDBmcmFtZV9zeXN0ZW1YTGFzdFJ1bnRpbWVVcGdyYWRlSW5mbwAACAEwc3BlY192ZXJzaW9u7AFMY29kZWM6OkNvbXBhY3Q8dTMyPgABJHNwZWNfbmFtZdEHAWRzcF9ydW50aW1lOjpSdW50aW1lU3RyaW5nAADRBwAABQIA1QcIMGZyYW1lX3N5c3RlbWBDb2RlVXBncmFkZUF1dGhvcml6YXRpb24EBFQAAAgBJGNvZGVfaGFzaDQBHFQ6Okhhc2gAATRjaGVja192ZXJzaW9uIAEQYm9vbAAA2QcMMGZyYW1lX3N5c3RlbRhsaW1pdHMwQmxvY2tXZWlnaHRzAAAMAShiYXNlX2Jsb2NrKAEYV2VpZ2h0AAEkbWF4X2Jsb2NrKAEYV2VpZ2h0AAEkcGVyX2NsYXNz3QcBhFBlckRpc3BhdGNoQ2xhc3M8V2VpZ2h0c1BlckNsYXNzPgAA3QcMNGZyYW1lX3N1cHBvcnQgZGlzcGF0Y2hAUGVyRGlzcGF0Y2hDbGFzcwQEVAHhBwAMARhub3JtYWzhBwEEVAABLG9wZXJhdGlvbmFs4QcBBFQAASRtYW5kYXRvcnnhBwEEVAAA4QcMMGZyYW1lX3N5c3RlbRhsaW1pdHM8V2VpZ2h0c1BlckNsYXNzAAAQAThiYXNlX2V4dHJpbnNpYygBGFdlaWdodAABNG1heF9leHRyaW5zaWMRBwE4T3B0aW9uPFdlaWdodD4AASRtYXhfdG90YWwRBwE4T3B0aW9uPFdlaWdodD4AASByZXNlcnZlZBEHAThPcHRpb248V2VpZ2h0PgAA5QcMMGZyYW1lX3N5c3RlbRhsaW1pdHMsQmxvY2tMZW5ndGgAAAQBDG1heOkHAVRQZXJEaXNwYXRjaENsYXNzPHUzMj4AAOkHDDRmcmFtZV9zdXBwb3J0IGRpc3BhdGNoQFBlckRpc3BhdGNoQ2xhc3MEBFQBEAAMARhub3JtYWwQAQRUAAEsb3BlcmF0aW9uYWwQAQRUAAEkbWFuZGF0b3J5EAEEVAAA7QcIKHNwX3dlaWdodHM8UnVudGltZURiV2VpZ2h0AAAIARByZWFkMAEMdTY0AAEUd3JpdGUwAQx1NjQAAPEHCChzcF92ZXJzaW9uOFJ1bnRpbWVWZXJzaW9uAAAgASRzcGVjX25hbWXRBwE0UnVudGltZVN0cmluZwABJGltcGxfbmFtZdEHATRSdW50aW1lU3RyaW5nAAFEYXV0aG9yaW5nX3ZlcnNpb24QAQx1MzIAATBzcGVjX3ZlcnNpb24QAQx1MzIAATBpbXBsX3ZlcnNpb24QAQx1MzIAARBhcGlz9QcBHEFwaXNWZWMAAUx0cmFuc2FjdGlvbl92ZXJzaW9uEAEMdTMyAAE0c3RhdGVfdmVyc2lvbggBCHU4AAD1BwQMQ293BARUAfkHAAQA+QcAAAD5BwAAAv0HAP0HAAAECLEFEAABCAwwZnJhbWVfc3lzdGVtGHBhbGxldBRFcnJvcgQEVAABJDxJbnZhbGlkU3BlY05hbWUAAAgRAVRoZSBuYW1lIG9mIHNwZWNpZmljYXRpb24gZG9lcyBub3QgbWF0Y2ggYmV0d2VlbiB0aGUgY3VycmVudCBydW50aW1lUGFuZCB0aGUgbmV3IHJ1bnRpbWUuaFNwZWNWZXJzaW9uTmVlZHNUb0luY3JlYXNlAAEIQQFUaGUgc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGlzIG5vdCBhbGxvd2VkIHRvIGRlY3JlYXNlIGJldHdlZW4gdGhlIGN1cnJlbnQgcnVudGltZVBhbmQgdGhlIG5ldyBydW50aW1lLnRGYWlsZWRUb0V4dHJhY3RSdW50aW1lVmVyc2lvbgACDOxGYWlsZWQgdG8gZXh0cmFjdCB0aGUgcnVudGltZSB2ZXJzaW9uIGZyb20gdGhlIG5ldyBydW50aW1lLgAJAUVpdGhlciBjYWxsaW5nIGBDb3JlX3ZlcnNpb25gIG9yIGRlY29kaW5nIGBSdW50aW1lVmVyc2lvbmAgZmFpbGVkLkxOb25EZWZhdWx0Q29tcG9zaXRlAAME/FN1aWNpZGUgY2FsbGVkIHdoZW4gdGhlIGFjY291bnQgaGFzIG5vbi1kZWZhdWx0IGNvbXBvc2l0ZSBkYXRhLjxOb25aZXJvUmVmQ291bnQABAQ1AVRoZXJlIGlzIGEgbm9uLXplcm8gcmVmZXJlbmNlIGNvdW50IHByZXZlbnRpbmcgdGhlIGFjY291bnQgZnJvbSBiZWluZyBwdXJnZWQuMENhbGxGaWx0ZXJlZAAFBNBUaGUgb3JpZ2luIGZpbHRlciBwcmV2ZW50IHRoZSBjYWxsIHRvIGJlIGRpc3BhdGNoZWQubE11bHRpQmxvY2tNaWdyYXRpb25zT25nb2luZwAGBFUBQSBtdWx0aS1ibG9jayBtaWdyYXRpb24gaXMgb25nb2luZyBhbmQgcHJldmVudHMgdGhlIGN1cnJlbnQgY29kZSBmcm9tIGJlaW5nIHJlcGxhY2VkLkROb3RoaW5nQXV0aG9yaXplZAAHBFhObyB1cGdyYWRlIGF1dGhvcml6ZWQuMFVuYXV0aG9yaXplZAAIBJRUaGUgc3VibWl0dGVkIGNvZGUgaXMgbm90IGF1dGhvcml6ZWQuBGxFcnJvciBmb3IgdGhlIFN5c3RlbSBwYWxsZXQFCAxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAQkIBFMAAAQAEQgBGFZlYzxUPgAACQgEGE9wdGlvbgQEVAENCAEIEE5vbmUAAAAQU29tZQQADQgAAAEAAA0ICEBwYWxsZXRfc2NoZWR1bGVyJFNjaGVkdWxlZBQQTmFtZQEEEENhbGwBcQEsQmxvY2tOdW1iZXIBEDRQYWxsZXRzT3JpZ2luAX0CJEFjY291bnRJZAEAABQBIG1heWJlX2lkhAEwT3B0aW9uPE5hbWU+AAEgcHJpb3JpdHkIAUhzY2hlZHVsZTo6UHJpb3JpdHkAARBjYWxscQEBEENhbGwAAThtYXliZV9wZXJpb2RpY40BAZRPcHRpb248c2NoZWR1bGU6OlBlcmlvZDxCbG9ja051bWJlcj4+AAEYb3JpZ2lufQIBNFBhbGxldHNPcmlnaW4AABEIAAACCQgAFQgIQHBhbGxldF9zY2hlZHVsZXIsUmV0cnlDb25maWcEGFBlcmlvZAEQAAwBNHRvdGFsX3JldHJpZXMIAQh1OAABJHJlbWFpbmluZwgBCHU4AAEYcGVyaW9kEAEYUGVyaW9kAAAZCAxAcGFsbGV0X3NjaGVkdWxlchhwYWxsZXQURXJyb3IEBFQAARRARmFpbGVkVG9TY2hlZHVsZQAABGRGYWlsZWQgdG8gc2NoZWR1bGUgYSBjYWxsIE5vdEZvdW5kAAEEfENhbm5vdCBmaW5kIHRoZSBzY2hlZHVsZWQgY2FsbC5cVGFyZ2V0QmxvY2tOdW1iZXJJblBhc3QAAgSkR2l2ZW4gdGFyZ2V0IGJsb2NrIG51bWJlciBpcyBpbiB0aGUgcGFzdC5IUmVzY2hlZHVsZU5vQ2hhbmdlAAME8FJlc2NoZWR1bGUgZmFpbGVkIGJlY2F1c2UgaXQgZG9lcyBub3QgY2hhbmdlIHNjaGVkdWxlZCB0aW1lLhROYW1lZAAEBNBBdHRlbXB0IHRvIHVzZSBhIG5vbi1uYW1lZCBmdW5jdGlvbiBvbiBhIG5hbWVkIHRhc2suBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0Lh0ICDxwYWxsZXRfcHJlaW1hZ2VAT2xkUmVxdWVzdFN0YXR1cwgkQWNjb3VudElkAQAcQmFsYW5jZQEYAQgsVW5yZXF1ZXN0ZWQIARxkZXBvc2l0EQQBUChBY2NvdW50SWQsIEJhbGFuY2UpAAEMbGVuEAEMdTMyAAAAJFJlcXVlc3RlZAwBHGRlcG9zaXQhCAFwT3B0aW9uPChBY2NvdW50SWQsIEJhbGFuY2UpPgABFGNvdW50EAEMdTMyAAEMbGVuYQIBLE9wdGlvbjx1MzI+AAEAACEIBBhPcHRpb24EBFQBEQQBCBBOb25lAAAAEFNvbWUEABEEAAABAAAlCAg8cGFsbGV0X3ByZWltYWdlNFJlcXVlc3RTdGF0dXMIJEFjY291bnRJZAEAGFRpY2tldAEpCAEILFVucmVxdWVzdGVkCAEYdGlja2V0LQgBTChBY2NvdW50SWQsIFRpY2tldCkAAQxsZW4QAQx1MzIAAAAkUmVxdWVzdGVkDAEwbWF5YmVfdGlja2V0MQgBbE9wdGlvbjwoQWNjb3VudElkLCBUaWNrZXQpPgABFGNvdW50EAEMdTMyAAEkbWF5YmVfbGVuYQIBLE9wdGlvbjx1MzI+AAEAACkIFDRmcmFtZV9zdXBwb3J0GHRyYWl0cxh0b2tlbnMgZnVuZ2libGVESG9sZENvbnNpZGVyYXRpb24UBEEABEYABFIABEQACEZwAAAEABgBKEY6OkJhbGFuY2UAAC0IAAAECAApCAAxCAQYT3B0aW9uBARUAS0IAQgQTm9uZQAAABBTb21lBAAtCAAAAQAANQgAAAQINBAAOQgMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAEIBFMAAAQAOAEYVmVjPFQ+AAA9CAw8cGFsbGV0X3ByZWltYWdlGHBhbGxldBRFcnJvcgQEVAABJBhUb29CaWcAAASgUHJlaW1hZ2UgaXMgdG9vIGxhcmdlIHRvIHN0b3JlIG9uLWNoYWluLjBBbHJlYWR5Tm90ZWQAAQSkUHJlaW1hZ2UgaGFzIGFscmVhZHkgYmVlbiBub3RlZCBvbi1jaGFpbi40Tm90QXV0aG9yaXplZAACBMhUaGUgdXNlciBpcyBub3QgYXV0aG9yaXplZCB0byBwZXJmb3JtIHRoaXMgYWN0aW9uLiBOb3ROb3RlZAADBPxUaGUgcHJlaW1hZ2UgY2Fubm90IGJlIHJlbW92ZWQgc2luY2UgaXQgaGFzIG5vdCB5ZXQgYmVlbiBub3RlZC4kUmVxdWVzdGVkAAQECQFBIHByZWltYWdlIG1heSBub3QgYmUgcmVtb3ZlZCB3aGVuIHRoZXJlIGFyZSBvdXRzdGFuZGluZyByZXF1ZXN0cy4wTm90UmVxdWVzdGVkAAUELQFUaGUgcHJlaW1hZ2UgcmVxdWVzdCBjYW5ub3QgYmUgcmVtb3ZlZCBzaW5jZSBubyBvdXRzdGFuZGluZyByZXF1ZXN0cyBleGlzdC4cVG9vTWFueQAGBFUBTW9yZSB0aGFuIGBNQVhfSEFTSF9VUEdSQURFX0JVTEtfQ09VTlRgIGhhc2hlcyB3ZXJlIHJlcXVlc3RlZCB0byBiZSB1cGdyYWRlZCBhdCBvbmNlLhhUb29GZXcABwTkVG9vIGZldyBoYXNoZXMgd2VyZSByZXF1ZXN0ZWQgdG8gYmUgdXBncmFkZWQgKGkuZS4gemVybykuGE5vQ29zdAAIBFkBTm8gdGlja2V0IHdpdGggYSBjb3N0IHdhcyByZXR1cm5lZCBieSBbYENvbmZpZzo6Q29uc2lkZXJhdGlvbmBdIHRvIHN0b3JlIHRoZSBwcmVpbWFnZS4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQuQQgMTGJvdW5kZWRfY29sbGVjdGlvbnNAd2Vha19ib3VuZGVkX3ZlYzhXZWFrQm91bmRlZFZlYwgEVAFFCARTAAAEAEkIARhWZWM8VD4AAEUIAAAECKUBMABJCAAAAkUIAE0IDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBBARTAAAEAFEIARhWZWM8VD4AAFEIAAACBABVCAQYT3B0aW9uBARUAVkIAQgQTm9uZQAAABBTb21lBABZCAAAAQAAWQgMRHNwX2NvbnNlbnN1c19iYWJlHGRpZ2VzdHMkUHJlRGlnZXN0AAEMHFByaW1hcnkEAF0IAUBQcmltYXJ5UHJlRGlnZXN0AAEAOFNlY29uZGFyeVBsYWluBABlCAFcU2Vjb25kYXJ5UGxhaW5QcmVEaWdlc3QAAgAwU2Vjb25kYXJ5VlJGBABpCAFUU2Vjb25kYXJ5VlJGUHJlRGlnZXN0AAMAAF0IDERzcF9jb25zZW5zdXNfYmFiZRxkaWdlc3RzQFByaW1hcnlQcmVEaWdlc3QAAAwBPGF1dGhvcml0eV9pbmRleBABVHN1cGVyOjpBdXRob3JpdHlJbmRleAABEHNsb3SpAQEQU2xvdAABNHZyZl9zaWduYXR1cmVhCAEwVnJmU2lnbmF0dXJlAABhCBAcc3BfY29yZRxzcjI1NTE5DHZyZjBWcmZTaWduYXR1cmUAAAgBKHByZV9vdXRwdXQEATBWcmZQcmVPdXRwdXQAARRwcm9vZkkCASBWcmZQcm9vZgAAZQgMRHNwX2NvbnNlbnN1c19iYWJlHGRpZ2VzdHNcU2Vjb25kYXJ5UGxhaW5QcmVEaWdlc3QAAAgBPGF1dGhvcml0eV9pbmRleBABVHN1cGVyOjpBdXRob3JpdHlJbmRleAABEHNsb3SpAQEQU2xvdAAAaQgMRHNwX2NvbnNlbnN1c19iYWJlHGRpZ2VzdHNUU2Vjb25kYXJ5VlJGUHJlRGlnZXN0AAAMATxhdXRob3JpdHlfaW5kZXgQAVRzdXBlcjo6QXV0aG9yaXR5SW5kZXgAARBzbG90qQEBEFNsb3QAATR2cmZfc2lnbmF0dXJlYQgBMFZyZlNpZ25hdHVyZQAAbQgIRHNwX2NvbnNlbnN1c19iYWJlWEJhYmVFcG9jaENvbmZpZ3VyYXRpb24AAAgBBGO1AQEoKHU2NCwgdTY0KQABNGFsbG93ZWRfc2xvdHO5AQEwQWxsb3dlZFNsb3RzAABxCAxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAXUIBFMAAAQAeQgBGFZlYzxUPgAAdQgAAAQIMBAAeQgAAAJ1CAB9CAwscGFsbGV0X2JhYmUYcGFsbGV0FEVycm9yBARUAAEQYEludmFsaWRFcXVpdm9jYXRpb25Qcm9vZgAABDEBQW4gZXF1aXZvY2F0aW9uIHByb29mIHByb3ZpZGVkIGFzIHBhcnQgb2YgYW4gZXF1aXZvY2F0aW9uIHJlcG9ydCBpcyBpbnZhbGlkLmBJbnZhbGlkS2V5T3duZXJzaGlwUHJvb2YAAQQxAUEga2V5IG93bmVyc2hpcCBwcm9vZiBwcm92aWRlZCBhcyBwYXJ0IG9mIGFuIGVxdWl2b2NhdGlvbiByZXBvcnQgaXMgaW52YWxpZC5YRHVwbGljYXRlT2ZmZW5jZVJlcG9ydAACBBUBQSBnaXZlbiBlcXVpdm9jYXRpb24gcmVwb3J0IGlzIHZhbGlkIGJ1dCBhbHJlYWR5IHByZXZpb3VzbHkgcmVwb3J0ZWQuUEludmFsaWRDb25maWd1cmF0aW9uAAMEjFN1Ym1pdHRlZCBjb25maWd1cmF0aW9uIGlzIGludmFsaWQuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LoEIAAAEDAAYIACFCAw4cGFsbGV0X2luZGljZXMYcGFsbGV0FEVycm9yBARUAAEULE5vdEFzc2lnbmVkAAAEjFRoZSBpbmRleCB3YXMgbm90IGFscmVhZHkgYXNzaWduZWQuIE5vdE93bmVyAAEEpFRoZSBpbmRleCBpcyBhc3NpZ25lZCB0byBhbm90aGVyIGFjY291bnQuFEluVXNlAAIEcFRoZSBpbmRleCB3YXMgbm90IGF2YWlsYWJsZS4sTm90VHJhbnNmZXIAAwTIVGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gYWNjb3VudHMgYXJlIGlkZW50aWNhbC4kUGVybWFuZW50AAQE0FRoZSBpbmRleCBpcyBwZXJtYW5lbnQgYW5kIG1heSBub3QgYmUgZnJlZWQvY2hhbmdlZC4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQuiQgMTGJvdW5kZWRfY29sbGVjdGlvbnNAd2Vha19ib3VuZGVkX3ZlYzhXZWFrQm91bmRlZFZlYwgEVAGNCARTAAAEAJUIARhWZWM8VD4AAI0IDDxwYWxsZXRfYmFsYW5jZXMUdHlwZXMsQmFsYW5jZUxvY2sEHEJhbGFuY2UBGAAMAQhpZLEFAThMb2NrSWRlbnRpZmllcgABGGFtb3VudBgBHEJhbGFuY2UAARxyZWFzb25zkQgBHFJlYXNvbnMAAJEIDDxwYWxsZXRfYmFsYW5jZXMUdHlwZXMcUmVhc29ucwABDAxGZWUAAAAQTWlzYwABAAxBbGwAAgAAlQgAAAKNCACZCAxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAZ0IBFMAAAQAoQgBGFZlYzxUPgAAnQgMPHBhbGxldF9iYWxhbmNlcxR0eXBlcyxSZXNlcnZlRGF0YQhEUmVzZXJ2ZUlkZW50aWZpZXIBsQUcQmFsYW5jZQEYAAgBCGlksQUBRFJlc2VydmVJZGVudGlmaWVyAAEYYW1vdW50GAEcQmFsYW5jZQAAoQgAAAKdCAClCAxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAakIBFMAAAQAuQgBGFZlYzxUPgAAqQgUNGZyYW1lX3N1cHBvcnQYdHJhaXRzGHRva2VucxBtaXNjIElkQW1vdW50CAhJZAGtCBxCYWxhbmNlARgACAEIaWStCAEISWQAARhhbW91bnQYARxCYWxhbmNlAACtCAhAcG9sa2Fkb3RfcnVudGltZURSdW50aW1lSG9sZFJlYXNvbgABCCBQcmVpbWFnZQQAsQgBbHBhbGxldF9wcmVpbWFnZTo6SG9sZFJlYXNvbgAKAEhTdGF0ZVRyaWVNaWdyYXRpb24EALUIAZxwYWxsZXRfc3RhdGVfdHJpZV9taWdyYXRpb246OkhvbGRSZWFzb24AYgAAsQgMPHBhbGxldF9wcmVpbWFnZRhwYWxsZXQoSG9sZFJlYXNvbgABBCBQcmVpbWFnZQAAAAC1CAxscGFsbGV0X3N0YXRlX3RyaWVfbWlncmF0aW9uGHBhbGxldChIb2xkUmVhc29uAAEEPFNsYXNoRm9yTWlncmF0ZQAAAAC5CAAAAqkIAL0IDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBwQgEUwAABADNCAEYVmVjPFQ+AADBCBQ0ZnJhbWVfc3VwcG9ydBh0cmFpdHMYdG9rZW5zEG1pc2MgSWRBbW91bnQICElkAcUIHEJhbGFuY2UBGAAIAQhpZMUIAQhJZAABGGFtb3VudBgBHEJhbGFuY2UAAMUICEBwb2xrYWRvdF9ydW50aW1lTFJ1bnRpbWVGcmVlemVSZWFzb24AAQQ8Tm9taW5hdGlvblBvb2xzBADJCAGUcGFsbGV0X25vbWluYXRpb25fcG9vbHM6OkZyZWV6ZVJlYXNvbgAnAADJCAxccGFsbGV0X25vbWluYXRpb25fcG9vbHMYcGFsbGV0MEZyZWV6ZVJlYXNvbgABBDhQb29sTWluQmFsYW5jZQAAAADNCAAAAsEIANEIDDxwYWxsZXRfYmFsYW5jZXMYcGFsbGV0FEVycm9yCARUAARJAAEwOFZlc3RpbmdCYWxhbmNlAAAEnFZlc3RpbmcgYmFsYW5jZSB0b28gaGlnaCB0byBzZW5kIHZhbHVlLlRMaXF1aWRpdHlSZXN0cmljdGlvbnMAAQTIQWNjb3VudCBsaXF1aWRpdHkgcmVzdHJpY3Rpb25zIHByZXZlbnQgd2l0aGRyYXdhbC5MSW5zdWZmaWNpZW50QmFsYW5jZQACBHhCYWxhbmNlIHRvbyBsb3cgdG8gc2VuZCB2YWx1ZS5IRXhpc3RlbnRpYWxEZXBvc2l0AAME7FZhbHVlIHRvbyBsb3cgdG8gY3JlYXRlIGFjY291bnQgZHVlIHRvIGV4aXN0ZW50aWFsIGRlcG9zaXQuNEV4cGVuZGFiaWxpdHkABASQVHJhbnNmZXIvcGF5bWVudCB3b3VsZCBraWxsIGFjY291bnQuXEV4aXN0aW5nVmVzdGluZ1NjaGVkdWxlAAUEzEEgdmVzdGluZyBzY2hlZHVsZSBhbHJlYWR5IGV4aXN0cyBmb3IgdGhpcyBhY2NvdW50LixEZWFkQWNjb3VudAAGBIxCZW5lZmljaWFyeSBhY2NvdW50IG11c3QgcHJlLWV4aXN0LjxUb29NYW55UmVzZXJ2ZXMABwS4TnVtYmVyIG9mIG5hbWVkIHJlc2VydmVzIGV4Y2VlZCBgTWF4UmVzZXJ2ZXNgLjBUb29NYW55SG9sZHMACAT4TnVtYmVyIG9mIGhvbGRzIGV4Y2VlZCBgVmFyaWFudENvdW50T2Y8VDo6UnVudGltZUhvbGRSZWFzb24+YC44VG9vTWFueUZyZWV6ZXMACQSYTnVtYmVyIG9mIGZyZWV6ZXMgZXhjZWVkIGBNYXhGcmVlemVzYC5MSXNzdWFuY2VEZWFjdGl2YXRlZAAKBAEBVGhlIGlzc3VhbmNlIGNhbm5vdCBiZSBtb2RpZmllZCBzaW5jZSBpdCBpcyBhbHJlYWR5IGRlYWN0aXZhdGVkLiREZWx0YVplcm8ACwRkVGhlIGRlbHRhIGNhbm5vdCBiZSB6ZXJvLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC7VCAhocGFsbGV0X3RyYW5zYWN0aW9uX3BheW1lbnQgUmVsZWFzZXMAAQgkVjFBbmNpZW50AAAACFYyAAEAANkICDhwYWxsZXRfc3Rha2luZzRTdGFraW5nTGVkZ2VyBARUAAAUARRzdGFzaAABMFQ6OkFjY291bnRJZAABFHRvdGFs/AEwQmFsYW5jZU9mPFQ+AAEYYWN0aXZl/AEwQmFsYW5jZU9mPFQ+AAEkdW5sb2NraW5nCQIB8EJvdW5kZWRWZWM8VW5sb2NrQ2h1bms8QmFsYW5jZU9mPFQ+PiwgVDo6TWF4VW5sb2NraW5nQ2h1bmtzPgABWGxlZ2FjeV9jbGFpbWVkX3Jld2FyZHPdCAGUQm91bmRlZFZlYzxFcmFJbmRleCwgVDo6SGlzdG9yeURlcHRoPgAA3QgMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAEQBFMAAAQA5QEBGFZlYzxUPgAA4QgIOHBhbGxldF9zdGFraW5nLE5vbWluYXRpb25zBARUAAAMARx0YXJnZXRz5QgBtEJvdW5kZWRWZWM8VDo6QWNjb3VudElkLCBNYXhOb21pbmF0aW9uc09mPFQ+PgABMHN1Ym1pdHRlZF9pbhABIEVyYUluZGV4AAEoc3VwcHJlc3NlZCABEGJvb2wAAOUIDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBAARTAAAEANEBARhWZWM8VD4AAOkICDhwYWxsZXRfc3Rha2luZzRBY3RpdmVFcmFJbmZvAAAIARRpbmRleBABIEVyYUluZGV4AAEUc3RhcnTtCAEsT3B0aW9uPHU2ND4AAO0IBBhPcHRpb24EBFQBMAEIEE5vbmUAAAAQU29tZQQAMAAAAQAA8QgAAAQIEAAA9QgIKHNwX3N0YWtpbmcgRXhwb3N1cmUIJEFjY291bnRJZAEAHEJhbGFuY2UBGAAMARR0b3RhbPwBHEJhbGFuY2UAAQxvd278ARxCYWxhbmNlAAEYb3RoZXJz+QgBrFZlYzxJbmRpdmlkdWFsRXhwb3N1cmU8QWNjb3VudElkLCBCYWxhbmNlPj4AAPkIAAAC/QgA/QgIKHNwX3N0YWtpbmdISW5kaXZpZHVhbEV4cG9zdXJlCCRBY2NvdW50SWQBABxCYWxhbmNlARgACAEMd2hvAAEkQWNjb3VudElkAAEUdmFsdWX8ARxCYWxhbmNlAAABCQgoc3Bfc3Rha2luZ1RQYWdlZEV4cG9zdXJlTWV0YWRhdGEEHEJhbGFuY2UBGAAQARR0b3RhbPwBHEJhbGFuY2UAAQxvd278ARxCYWxhbmNlAAE8bm9taW5hdG9yX2NvdW50EAEMdTMyAAEocGFnZV9jb3VudBABEFBhZ2UAAAUJAAAEDBAAEAAJCQgoc3Bfc3Rha2luZzBFeHBvc3VyZVBhZ2UIJEFjY291bnRJZAEAHEJhbGFuY2UBGAAIAShwYWdlX3RvdGFs/AEcQmFsYW5jZQABGG90aGVyc/kIAaxWZWM8SW5kaXZpZHVhbEV4cG9zdXJlPEFjY291bnRJZCwgQmFsYW5jZT4+AAANCQg4cGFsbGV0X3N0YWtpbmc8RXJhUmV3YXJkUG9pbnRzBCRBY2NvdW50SWQBAAAIARR0b3RhbBABLFJld2FyZFBvaW50AAEoaW5kaXZpZHVhbBEJAYBCVHJlZU1hcDxBY2NvdW50SWQsIFJld2FyZFBvaW50PgAAEQkEIEJUcmVlTWFwCARLAQAEVgEQAAQAFQkAAAAVCQAAAhkJABkJAAAECAAQAB0JAAACIQkAIQkIOHBhbGxldF9zdGFraW5nOFVuYXBwbGllZFNsYXNoCCRBY2NvdW50SWQBABxCYWxhbmNlARgAFAEkdmFsaWRhdG9yAAEkQWNjb3VudElkAAEMb3duGAEcQmFsYW5jZQABGG90aGVycw0EAWRWZWM8KEFjY291bnRJZCwgQmFsYW5jZSk+AAEkcmVwb3J0ZXJz0QEBOFZlYzxBY2NvdW50SWQ+AAEYcGF5b3V0GAEcQmFsYW5jZQAAJQkAAAQIrBgAKQkMOHBhbGxldF9zdGFraW5nIHNsYXNoaW5nNFNsYXNoaW5nU3BhbnMAABABKHNwYW5faW5kZXgQASRTcGFuSW5kZXgAAShsYXN0X3N0YXJ0EAEgRXJhSW5kZXgAAUhsYXN0X25vbnplcm9fc2xhc2gQASBFcmFJbmRleAABFHByaW9y5QEBNFZlYzxFcmFJbmRleD4AAC0JDDhwYWxsZXRfc3Rha2luZyBzbGFzaGluZyhTcGFuUmVjb3JkBBxCYWxhbmNlARgACAEcc2xhc2hlZBgBHEJhbGFuY2UAASBwYWlkX291dBgBHEJhbGFuY2UAADEJEDhwYWxsZXRfc3Rha2luZxhwYWxsZXQYcGFsbGV0FEVycm9yBARUAAF8NE5vdENvbnRyb2xsZXIAAARkTm90IGEgY29udHJvbGxlciBhY2NvdW50LiBOb3RTdGFzaAABBFBOb3QgYSBzdGFzaCBhY2NvdW50LjRBbHJlYWR5Qm9uZGVkAAIEYFN0YXNoIGlzIGFscmVhZHkgYm9uZGVkLjRBbHJlYWR5UGFpcmVkAAMEdENvbnRyb2xsZXIgaXMgYWxyZWFkeSBwYWlyZWQuMEVtcHR5VGFyZ2V0cwAEBGBUYXJnZXRzIGNhbm5vdCBiZSBlbXB0eS44RHVwbGljYXRlSW5kZXgABQRARHVwbGljYXRlIGluZGV4LkRJbnZhbGlkU2xhc2hJbmRleAAGBIRTbGFzaCByZWNvcmQgaW5kZXggb3V0IG9mIGJvdW5kcy5ASW5zdWZmaWNpZW50Qm9uZAAHDFkBQ2Fubm90IGhhdmUgYSB2YWxpZGF0b3Igb3Igbm9taW5hdG9yIHJvbGUsIHdpdGggdmFsdWUgbGVzcyB0aGFuIHRoZSBtaW5pbXVtIGRlZmluZWQgYnk9AWdvdmVybmFuY2UgKHNlZSBgTWluVmFsaWRhdG9yQm9uZGAgYW5kIGBNaW5Ob21pbmF0b3JCb25kYCkuIElmIHVuYm9uZGluZyBpcyB0aGUVAWludGVudGlvbiwgYGNoaWxsYCBmaXJzdCB0byByZW1vdmUgb25lJ3Mgcm9sZSBhcyB2YWxpZGF0b3Ivbm9taW5hdG9yLjBOb01vcmVDaHVua3MACASQQ2FuIG5vdCBzY2hlZHVsZSBtb3JlIHVubG9jayBjaHVua3MuNE5vVW5sb2NrQ2h1bmsACQSgQ2FuIG5vdCByZWJvbmQgd2l0aG91dCB1bmxvY2tpbmcgY2h1bmtzLjBGdW5kZWRUYXJnZXQACgTIQXR0ZW1wdGluZyB0byB0YXJnZXQgYSBzdGFzaCB0aGF0IHN0aWxsIGhhcyBmdW5kcy5ISW52YWxpZEVyYVRvUmV3YXJkAAsEWEludmFsaWQgZXJhIHRvIHJld2FyZC5oSW52YWxpZE51bWJlck9mTm9taW5hdGlvbnMADAR4SW52YWxpZCBudW1iZXIgb2Ygbm9taW5hdGlvbnMuSE5vdFNvcnRlZEFuZFVuaXF1ZQANBIBJdGVtcyBhcmUgbm90IHNvcnRlZCBhbmQgdW5pcXVlLjhBbHJlYWR5Q2xhaW1lZAAOBAkBUmV3YXJkcyBmb3IgdGhpcyBlcmEgaGF2ZSBhbHJlYWR5IGJlZW4gY2xhaW1lZCBmb3IgdGhpcyB2YWxpZGF0b3IuLEludmFsaWRQYWdlAA8EhE5vIG5vbWluYXRvcnMgZXhpc3Qgb24gdGhpcyBwYWdlLlRJbmNvcnJlY3RIaXN0b3J5RGVwdGgAEATASW5jb3JyZWN0IHByZXZpb3VzIGhpc3RvcnkgZGVwdGggaW5wdXQgcHJvdmlkZWQuWEluY29ycmVjdFNsYXNoaW5nU3BhbnMAEQSwSW5jb3JyZWN0IG51bWJlciBvZiBzbGFzaGluZyBzcGFucyBwcm92aWRlZC4gQmFkU3RhdGUAEgQ5AUludGVybmFsIHN0YXRlIGhhcyBiZWNvbWUgc29tZWhvdyBjb3JydXB0ZWQgYW5kIHRoZSBvcGVyYXRpb24gY2Fubm90IGNvbnRpbnVlLjhUb29NYW55VGFyZ2V0cwATBJRUb28gbWFueSBub21pbmF0aW9uIHRhcmdldHMgc3VwcGxpZWQuJEJhZFRhcmdldAAUBD0BQSBub21pbmF0aW9uIHRhcmdldCB3YXMgc3VwcGxpZWQgdGhhdCB3YXMgYmxvY2tlZCBvciBvdGhlcndpc2Ugbm90IGEgdmFsaWRhdG9yLkBDYW5ub3RDaGlsbE90aGVyABUEVQFUaGUgdXNlciBoYXMgZW5vdWdoIGJvbmQgYW5kIHRodXMgY2Fubm90IGJlIGNoaWxsZWQgZm9yY2VmdWxseSBieSBhbiBleHRlcm5hbCBwZXJzb24uRFRvb01hbnlOb21pbmF0b3JzABYITQFUaGVyZSBhcmUgdG9vIG1hbnkgbm9taW5hdG9ycyBpbiB0aGUgc3lzdGVtLiBHb3Zlcm5hbmNlIG5lZWRzIHRvIGFkanVzdCB0aGUgc3Rha2luZ7RzZXR0aW5ncyB0byBrZWVwIHRoaW5ncyBzYWZlIGZvciB0aGUgcnVudGltZS5EVG9vTWFueVZhbGlkYXRvcnMAFwhVAVRoZXJlIGFyZSB0b28gbWFueSB2YWxpZGF0b3IgY2FuZGlkYXRlcyBpbiB0aGUgc3lzdGVtLiBHb3Zlcm5hbmNlIG5lZWRzIHRvIGFkanVzdCB0aGXUc3Rha2luZyBzZXR0aW5ncyB0byBrZWVwIHRoaW5ncyBzYWZlIGZvciB0aGUgcnVudGltZS5AQ29tbWlzc2lvblRvb0xvdwAYBOBDb21taXNzaW9uIGlzIHRvbyBsb3cuIE11c3QgYmUgYXQgbGVhc3QgYE1pbkNvbW1pc3Npb25gLixCb3VuZE5vdE1ldAAZBFhTb21lIGJvdW5kIGlzIG5vdCBtZXQuUENvbnRyb2xsZXJEZXByZWNhdGVkABoEAQFVc2VkIHdoZW4gYXR0ZW1wdGluZyB0byB1c2UgZGVwcmVjYXRlZCBjb250cm9sbGVyIGFjY291bnQgbG9naWMuTENhbm5vdFJlc3RvcmVMZWRnZXIAGwRYQ2Fubm90IHJlc2V0IGEgbGVkZ2VyLmxSZXdhcmREZXN0aW5hdGlvblJlc3RyaWN0ZWQAHASsUHJvdmlkZWQgcmV3YXJkIGRlc3RpbmF0aW9uIGlzIG5vdCBhbGxvd2VkLjhOb3RFbm91Z2hGdW5kcwAdBJxOb3QgZW5vdWdoIGZ1bmRzIGF2YWlsYWJsZSB0byB3aXRoZHJhdy5cVmlydHVhbFN0YWtlck5vdEFsbG93ZWQAHgSoT3BlcmF0aW9uIG5vdCBhbGxvd2VkIGZvciB2aXJ0dWFsIHN0YWtlcnMuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LjUJDChzcF9zdGFraW5nHG9mZmVuY2U4T2ZmZW5jZURldGFpbHMIIFJlcG9ydGVyAQAgT2ZmZW5kZXIBOQkACAEgb2ZmZW5kZXI5CQEgT2ZmZW5kZXIAASRyZXBvcnRlcnPRAQE0VmVjPFJlcG9ydGVyPgAAOQkAAAQIAPUIAD0JAAAECMA4AEEJAAACRQkARQkAAAQIABkCAEkJAAAECE0JOABNCQwcc3BfY29yZRhjcnlwdG8kS2V5VHlwZUlkAAAEAEgBHFt1ODsgNF0AAFEJDDhwYWxsZXRfc2Vzc2lvbhhwYWxsZXQURXJyb3IEBFQAARQwSW52YWxpZFByb29mAAAEYEludmFsaWQgb3duZXJzaGlwIHByb29mLlxOb0Fzc29jaWF0ZWRWYWxpZGF0b3JJZAABBJxObyBhc3NvY2lhdGVkIHZhbGlkYXRvciBJRCBmb3IgYWNjb3VudC40RHVwbGljYXRlZEtleQACBGRSZWdpc3RlcmVkIGR1cGxpY2F0ZSBrZXkuGE5vS2V5cwADBKRObyBrZXlzIGFyZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBhY2NvdW50LiROb0FjY291bnQABAQZAUtleSBzZXR0aW5nIGFjY291bnQgaXMgbm90IGxpdmUsIHNvIGl0J3MgaW1wb3NzaWJsZSB0byBhc3NvY2lhdGUga2V5cy4EdEVycm9yIGZvciB0aGUgc2Vzc2lvbiBwYWxsZXQuVQkIOHBhbGxldF9ncmFuZHBhLFN0b3JlZFN0YXRlBAROARABEBBMaXZlAAAAMFBlbmRpbmdQYXVzZQgBMHNjaGVkdWxlZF9hdBABBE4AARRkZWxheRABBE4AAQAYUGF1c2VkAAIANFBlbmRpbmdSZXN1bWUIATBzY2hlZHVsZWRfYXQQAQROAAEUZGVsYXkQAQROAAMAAFkJCDhwYWxsZXRfZ3JhbmRwYUxTdG9yZWRQZW5kaW5nQ2hhbmdlCAROARAUTGltaXQAABABMHNjaGVkdWxlZF9hdBABBE4AARRkZWxheRABBE4AAUBuZXh0X2F1dGhvcml0aWVzXQkBbEJvdW5kZWRBdXRob3JpdHlMaXN0PExpbWl0PgABGGZvcmNlZGECASRPcHRpb248Tj4AAF0JDExib3VuZGVkX2NvbGxlY3Rpb25zQHdlYWtfYm91bmRlZF92ZWM4V2Vha0JvdW5kZWRWZWMIBFQB0ARTAAAEAMwBGFZlYzxUPgAAYQkMOHBhbGxldF9ncmFuZHBhGHBhbGxldBRFcnJvcgQEVAABHCxQYXVzZUZhaWxlZAAACAUBQXR0ZW1wdCB0byBzaWduYWwgR1JBTkRQQSBwYXVzZSB3aGVuIHRoZSBhdXRob3JpdHkgc2V0IGlzbid0IGxpdmWkKGVpdGhlciBwYXVzZWQgb3IgYWxyZWFkeSBwZW5kaW5nIHBhdXNlKS4wUmVzdW1lRmFpbGVkAAEIEQFBdHRlbXB0IHRvIHNpZ25hbCBHUkFORFBBIHJlc3VtZSB3aGVuIHRoZSBhdXRob3JpdHkgc2V0IGlzbid0IHBhdXNlZKAoZWl0aGVyIGxpdmUgb3IgYWxyZWFkeSBwZW5kaW5nIHJlc3VtZSkuNENoYW5nZVBlbmRpbmcAAgToQXR0ZW1wdCB0byBzaWduYWwgR1JBTkRQQSBjaGFuZ2Ugd2l0aCBvbmUgYWxyZWFkeSBwZW5kaW5nLhxUb29Tb29uAAMEvENhbm5vdCBzaWduYWwgZm9yY2VkIGNoYW5nZSBzbyBzb29uIGFmdGVyIGxhc3QuYEludmFsaWRLZXlPd25lcnNoaXBQcm9vZgAEBDEBQSBrZXkgb3duZXJzaGlwIHByb29mIHByb3ZpZGVkIGFzIHBhcnQgb2YgYW4gZXF1aXZvY2F0aW9uIHJlcG9ydCBpcyBpbnZhbGlkLmBJbnZhbGlkRXF1aXZvY2F0aW9uUHJvb2YABQQxAUFuIGVxdWl2b2NhdGlvbiBwcm9vZiBwcm92aWRlZCBhcyBwYXJ0IG9mIGFuIGVxdWl2b2NhdGlvbiByZXBvcnQgaXMgaW52YWxpZC5YRHVwbGljYXRlT2ZmZW5jZVJlcG9ydAAGBBUBQSBnaXZlbiBlcXVpdm9jYXRpb24gcmVwb3J0IGlzIHZhbGlkIGJ1dCBhbHJlYWR5IHByZXZpb3VzbHkgcmVwb3J0ZWQuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LmUJDExib3VuZGVkX2NvbGxlY3Rpb25zQHdlYWtfYm91bmRlZF92ZWM4V2Vha0JvdW5kZWRWZWMIBFQBJQIEUwAABABpCQEYVmVjPFQ+AABpCQAAAiUCAG0JCDxwYWxsZXRfdHJlYXN1cnkgUHJvcG9zYWwIJEFjY291bnRJZAEAHEJhbGFuY2UBGAAQASBwcm9wb3NlcgABJEFjY291bnRJZAABFHZhbHVlGAEcQmFsYW5jZQABLGJlbmVmaWNpYXJ5AAEkQWNjb3VudElkAAEQYm9uZBgBHEJhbGFuY2UAAHEJDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBEARTAAAEAOUBARhWZWM8VD4AAHUJCDxwYWxsZXRfdHJlYXN1cnksU3BlbmRTdGF0dXMUJEFzc2V0S2luZAHcMEFzc2V0QmFsYW5jZQEYLEJlbmVmaWNpYXJ5AUUBLEJsb2NrTnVtYmVyARAkUGF5bWVudElkATAAGAEoYXNzZXRfa2luZNwBJEFzc2V0S2luZAABGGFtb3VudBgBMEFzc2V0QmFsYW5jZQABLGJlbmVmaWNpYXJ5RQEBLEJlbmVmaWNpYXJ5AAEodmFsaWRfZnJvbRABLEJsb2NrTnVtYmVyAAEkZXhwaXJlX2F0EAEsQmxvY2tOdW1iZXIAARhzdGF0dXN5CQFcUGF5bWVudFN0YXRlPFBheW1lbnRJZD4AAHkJCDxwYWxsZXRfdHJlYXN1cnkwUGF5bWVudFN0YXRlBAhJZAEwAQwcUGVuZGluZwAAACRBdHRlbXB0ZWQEAQhpZDABCElkAAEAGEZhaWxlZAACAAB9CQw0c3BfYXJpdGhtZXRpYyhwZXJfdGhpbmdzHFBlcm1pbGwAAAQAEAEMdTMyAACBCQg0ZnJhbWVfc3VwcG9ydCBQYWxsZXRJZAAABACxBQEcW3U4OyA4XQAAhQkMPHBhbGxldF90cmVhc3VyeRhwYWxsZXQURXJyb3IIBFQABEkAASwwSW52YWxpZEluZGV4AAAErE5vIHByb3Bvc2FsLCBib3VudHkgb3Igc3BlbmQgYXQgdGhhdCBpbmRleC5AVG9vTWFueUFwcHJvdmFscwABBIBUb28gbWFueSBhcHByb3ZhbHMgaW4gdGhlIHF1ZXVlLlhJbnN1ZmZpY2llbnRQZXJtaXNzaW9uAAIIRQFUaGUgc3BlbmQgb3JpZ2luIGlzIHZhbGlkIGJ1dCB0aGUgYW1vdW50IGl0IGlzIGFsbG93ZWQgdG8gc3BlbmQgaXMgbG93ZXIgdGhhbiB0aGVMYW1vdW50IHRvIGJlIHNwZW50LkxQcm9wb3NhbE5vdEFwcHJvdmVkAAMEfFByb3Bvc2FsIGhhcyBub3QgYmVlbiBhcHByb3ZlZC5YRmFpbGVkVG9Db252ZXJ0QmFsYW5jZQAEBFEBVGhlIGJhbGFuY2Ugb2YgdGhlIGFzc2V0IGtpbmQgaXMgbm90IGNvbnZlcnRpYmxlIHRvIHRoZSBiYWxhbmNlIG9mIHRoZSBuYXRpdmUgYXNzZXQuMFNwZW5kRXhwaXJlZAAFBLBUaGUgc3BlbmQgaGFzIGV4cGlyZWQgYW5kIGNhbm5vdCBiZSBjbGFpbWVkLixFYXJseVBheW91dAAGBKRUaGUgc3BlbmQgaXMgbm90IHlldCBlbGlnaWJsZSBmb3IgcGF5b3V0LkBBbHJlYWR5QXR0ZW1wdGVkAAcEnFRoZSBwYXltZW50IGhhcyBhbHJlYWR5IGJlZW4gYXR0ZW1wdGVkLixQYXlvdXRFcnJvcgAIBMxUaGVyZSB3YXMgc29tZSBpc3N1ZSB3aXRoIHRoZSBtZWNoYW5pc20gb2YgcGF5bWVudC4wTm90QXR0ZW1wdGVkAAkEpFRoZSBwYXlvdXQgd2FzIG5vdCB5ZXQgYXR0ZW1wdGVkL2NsYWltZWQuMEluY29uY2x1c2l2ZQAKBMRUaGUgcGF5bWVudCBoYXMgbmVpdGhlciBmYWlsZWQgbm9yIHN1Y2NlZWRlZCB5ZXQuBHhFcnJvciBmb3IgdGhlIHRyZWFzdXJ5IHBhbGxldC6JCQAABAgAbQEAjQkMYHBhbGxldF9jb252aWN0aW9uX3ZvdGluZxB2b3RlGFZvdGluZxQcQmFsYW5jZQEYJEFjY291bnRJZAEALEJsb2NrTnVtYmVyARAkUG9sbEluZGV4ARAgTWF4Vm90ZXMAAQgcQ2FzdGluZwQAkQkByENhc3Rpbmc8QmFsYW5jZSwgQmxvY2tOdW1iZXIsIFBvbGxJbmRleCwgTWF4Vm90ZXM+AAAAKERlbGVnYXRpbmcEAKkJAaxEZWxlZ2F0aW5nPEJhbGFuY2UsIEFjY291bnRJZCwgQmxvY2tOdW1iZXI+AAEAAJEJDGBwYWxsZXRfY29udmljdGlvbl92b3RpbmcQdm90ZRxDYXN0aW5nEBxCYWxhbmNlARgsQmxvY2tOdW1iZXIBECRQb2xsSW5kZXgBECBNYXhWb3RlcwAADAEUdm90ZXOVCQHcQm91bmRlZFZlYzwoUG9sbEluZGV4LCBBY2NvdW50Vm90ZTxCYWxhbmNlPiksIE1heFZvdGVzPgABLGRlbGVnYXRpb25zoQkBUERlbGVnYXRpb25zPEJhbGFuY2U+AAEUcHJpb3KlCQF8UHJpb3JMb2NrPEJsb2NrTnVtYmVyLCBCYWxhbmNlPgAAlQkMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAGZCQRTAAAEAJ0JARhWZWM8VD4AAJkJAAAECBBpAgCdCQAAApkJAKEJDGBwYWxsZXRfY29udmljdGlvbl92b3RpbmcUdHlwZXMsRGVsZWdhdGlvbnMEHEJhbGFuY2UBGAAIARR2b3RlcxgBHEJhbGFuY2UAARxjYXBpdGFsGAEcQmFsYW5jZQAApQkMYHBhbGxldF9jb252aWN0aW9uX3ZvdGluZxB2b3RlJFByaW9yTG9jawgsQmxvY2tOdW1iZXIBEBxCYWxhbmNlARgACAAQASxCbG9ja051bWJlcgAAGAEcQmFsYW5jZQAAqQkMYHBhbGxldF9jb252aWN0aW9uX3ZvdGluZxB2b3RlKERlbGVnYXRpbmcMHEJhbGFuY2UBGCRBY2NvdW50SWQBACxCbG9ja051bWJlcgEQABQBHGJhbGFuY2UYARxCYWxhbmNlAAEYdGFyZ2V0AAEkQWNjb3VudElkAAEoY29udmljdGlvbnECAShDb252aWN0aW9uAAEsZGVsZWdhdGlvbnOhCQFQRGVsZWdhdGlvbnM8QmFsYW5jZT4AARRwcmlvcqUJAXxQcmlvckxvY2s8QmxvY2tOdW1iZXIsIEJhbGFuY2U+AACtCQxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAbEJBFMAAAQAtQkBGFZlYzxUPgAAsQkAAAQIbQEYALUJAAACsQkAuQkMYHBhbGxldF9jb252aWN0aW9uX3ZvdGluZxhwYWxsZXQURXJyb3IIBFQABEkAATAoTm90T25nb2luZwAABFBQb2xsIGlzIG5vdCBvbmdvaW5nLiBOb3RWb3RlcgABBKxUaGUgZ2l2ZW4gYWNjb3VudCBkaWQgbm90IHZvdGUgb24gdGhlIHBvbGwuME5vUGVybWlzc2lvbgACBMhUaGUgYWN0b3IgaGFzIG5vIHBlcm1pc3Npb24gdG8gY29uZHVjdCB0aGUgYWN0aW9uLjxOb1Blcm1pc3Npb25ZZXQAAwRZAVRoZSBhY3RvciBoYXMgbm8gcGVybWlzc2lvbiB0byBjb25kdWN0IHRoZSBhY3Rpb24gcmlnaHQgbm93IGJ1dCB3aWxsIGRvIGluIHRoZSBmdXR1cmUuREFscmVhZHlEZWxlZ2F0aW5nAAQEiFRoZSBhY2NvdW50IGlzIGFscmVhZHkgZGVsZWdhdGluZy40QWxyZWFkeVZvdGluZwAFCFUBVGhlIGFjY291bnQgY3VycmVudGx5IGhhcyB2b3RlcyBhdHRhY2hlZCB0byBpdCBhbmQgdGhlIG9wZXJhdGlvbiBjYW5ub3Qgc3VjY2VlZCB1bnRpbKB0aGVzZSBhcmUgcmVtb3ZlZCB0aHJvdWdoIGByZW1vdmVfdm90ZWAuREluc3VmZmljaWVudEZ1bmRzAAYE/FRvbyBoaWdoIGEgYmFsYW5jZSB3YXMgcHJvdmlkZWQgdGhhdCB0aGUgYWNjb3VudCBjYW5ub3QgYWZmb3JkLjROb3REZWxlZ2F0aW5nAAcEoFRoZSBhY2NvdW50IGlzIG5vdCBjdXJyZW50bHkgZGVsZWdhdGluZy4gTm9uc2Vuc2UACASURGVsZWdhdGlvbiB0byBvbmVzZWxmIG1ha2VzIG5vIHNlbnNlLjxNYXhWb3Rlc1JlYWNoZWQACQSATWF4aW11bSBudW1iZXIgb2Ygdm90ZXMgcmVhY2hlZC4sQ2xhc3NOZWVkZWQACgQ5AVRoZSBjbGFzcyBtdXN0IGJlIHN1cHBsaWVkIHNpbmNlIGl0IGlzIG5vdCBlYXNpbHkgZGV0ZXJtaW5hYmxlIGZyb20gdGhlIHN0YXRlLiBCYWRDbGFzcwALBIRUaGUgY2xhc3MgSUQgc3VwcGxpZWQgaXMgaW52YWxpZC4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQuvQkMQHBhbGxldF9yZWZlcmVuZGEUdHlwZXM4UmVmZXJlbmR1bUluZm8gHFRyYWNrSWQBbQE0UnVudGltZU9yaWdpbgF9AhhNb21lbnQBEBBDYWxsAXEBHEJhbGFuY2UBGBRUYWxseQEBByRBY2NvdW50SWQBADxTY2hlZHVsZUFkZHJlc3MBgAEYHE9uZ29pbmcEAMEJAY0BUmVmZXJlbmR1bVN0YXR1czxUcmFja0lkLCBSdW50aW1lT3JpZ2luLCBNb21lbnQsIENhbGwsIEJhbGFuY2UsIFRhbGx5LApBY2NvdW50SWQsIFNjaGVkdWxlQWRkcmVzcyw+AAAAIEFwcHJvdmVkDAAQARhNb21lbnQAAMkJAYxPcHRpb248RGVwb3NpdDxBY2NvdW50SWQsIEJhbGFuY2U+PgAAyQkBjE9wdGlvbjxEZXBvc2l0PEFjY291bnRJZCwgQmFsYW5jZT4+AAEAIFJlamVjdGVkDAAQARhNb21lbnQAAMkJAYxPcHRpb248RGVwb3NpdDxBY2NvdW50SWQsIEJhbGFuY2U+PgAAyQkBjE9wdGlvbjxEZXBvc2l0PEFjY291bnRJZCwgQmFsYW5jZT4+AAIAJENhbmNlbGxlZAwAEAEYTW9tZW50AADJCQGMT3B0aW9uPERlcG9zaXQ8QWNjb3VudElkLCBCYWxhbmNlPj4AAMkJAYxPcHRpb248RGVwb3NpdDxBY2NvdW50SWQsIEJhbGFuY2U+PgADACBUaW1lZE91dAwAEAEYTW9tZW50AADJCQGMT3B0aW9uPERlcG9zaXQ8QWNjb3VudElkLCBCYWxhbmNlPj4AAMkJAYxPcHRpb248RGVwb3NpdDxBY2NvdW50SWQsIEJhbGFuY2U+PgAEABhLaWxsZWQEABABGE1vbWVudAAFAADBCQxAcGFsbGV0X3JlZmVyZW5kYRR0eXBlc0BSZWZlcmVuZHVtU3RhdHVzIBxUcmFja0lkAW0BNFJ1bnRpbWVPcmlnaW4BfQIYTW9tZW50ARAQQ2FsbAFxARxCYWxhbmNlARgUVGFsbHkBAQckQWNjb3VudElkAQA8U2NoZWR1bGVBZGRyZXNzAYAALAEUdHJhY2ttAQEcVHJhY2tJZAABGG9yaWdpbn0CATRSdW50aW1lT3JpZ2luAAEgcHJvcG9zYWxxAQEQQ2FsbAABJGVuYWN0bWVudJkCAVBEaXNwYXRjaFRpbWU8TW9tZW50PgABJHN1Ym1pdHRlZBABGE1vbWVudAABSHN1Ym1pc3Npb25fZGVwb3NpdMUJAWxEZXBvc2l0PEFjY291bnRJZCwgQmFsYW5jZT4AAUBkZWNpc2lvbl9kZXBvc2l0yQkBjE9wdGlvbjxEZXBvc2l0PEFjY291bnRJZCwgQmFsYW5jZT4+AAEgZGVjaWRpbmfNCQF4T3B0aW9uPERlY2lkaW5nU3RhdHVzPE1vbWVudD4+AAEUdGFsbHkBBwEUVGFsbHkAASBpbl9xdWV1ZSABEGJvb2wAARRhbGFybdUJAYRPcHRpb248KE1vbWVudCwgU2NoZWR1bGVBZGRyZXNzKT4AAMUJDEBwYWxsZXRfcmVmZXJlbmRhFHR5cGVzHERlcG9zaXQIJEFjY291bnRJZAEAHEJhbGFuY2UBGAAIAQx3aG8AASRBY2NvdW50SWQAARhhbW91bnQYARxCYWxhbmNlAADJCQQYT3B0aW9uBARUAcUJAQgQTm9uZQAAABBTb21lBADFCQAAAQAAzQkEGE9wdGlvbgQEVAHRCQEIEE5vbmUAAAAQU29tZQQA0QkAAAEAANEJDEBwYWxsZXRfcmVmZXJlbmRhFHR5cGVzOERlY2lkaW5nU3RhdHVzBCxCbG9ja051bWJlcgEQAAgBFHNpbmNlEAEsQmxvY2tOdW1iZXIAAShjb25maXJtaW5nYQIBTE9wdGlvbjxCbG9ja051bWJlcj4AANUJBBhPcHRpb24EBFQB2QkBCBBOb25lAAAAEFNvbWUEANkJAAABAADZCQAABAgQgADdCQxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAeEJBFMAAAQA5QkBGFZlYzxUPgAA4QkAAAQIEBgA5QkAAALhCQDpCQAAAu0JAO0JAAAECG0B8QkA8QkMQHBhbGxldF9yZWZlcmVuZGEUdHlwZXMkVHJhY2tJbmZvCBxCYWxhbmNlARgYTW9tZW50ARAAJAEQbmFtZdEHATAmJ3N0YXRpYyBzdHIAATBtYXhfZGVjaWRpbmcQAQx1MzIAAUBkZWNpc2lvbl9kZXBvc2l0GAEcQmFsYW5jZQABOHByZXBhcmVfcGVyaW9kEAEYTW9tZW50AAE8ZGVjaXNpb25fcGVyaW9kEAEYTW9tZW50AAE4Y29uZmlybV9wZXJpb2QQARhNb21lbnQAAVBtaW5fZW5hY3RtZW50X3BlcmlvZBABGE1vbWVudAABMG1pbl9hcHByb3ZhbPUJARRDdXJ2ZQABLG1pbl9zdXBwb3J09QkBFEN1cnZlAAD1CQxAcGFsbGV0X3JlZmVyZW5kYRR0eXBlcxRDdXJ2ZQABDEBMaW5lYXJEZWNyZWFzaW5nDAEYbGVuZ3RorAEcUGVyYmlsbAABFGZsb29yrAEcUGVyYmlsbAABEGNlaWysARxQZXJiaWxsAAAARFN0ZXBwZWREZWNyZWFzaW5nEAEUYmVnaW6sARxQZXJiaWxsAAEMZW5krAEcUGVyYmlsbAABEHN0ZXCsARxQZXJiaWxsAAEYcGVyaW9krAEcUGVyYmlsbAABAChSZWNpcHJvY2FsDAEYZmFjdG9y+QkBIEZpeGVkSTY0AAEgeF9vZmZzZXT5CQEgRml4ZWRJNjQAASB5X29mZnNldPkJASBGaXhlZEk2NAACAAD5CQw0c3BfYXJpdGhtZXRpYyxmaXhlZF9wb2ludCBGaXhlZEk2NAAABAD9CQEMaTY0AAD9CQAABQwAAQoMQHBhbGxldF9yZWZlcmVuZGEYcGFsbGV0FEVycm9yCARUAARJAAE4KE5vdE9uZ29pbmcAAARoUmVmZXJlbmR1bSBpcyBub3Qgb25nb2luZy4oSGFzRGVwb3NpdAABBLhSZWZlcmVuZHVtJ3MgZGVjaXNpb24gZGVwb3NpdCBpcyBhbHJlYWR5IHBhaWQuIEJhZFRyYWNrAAIEnFRoZSB0cmFjayBpZGVudGlmaWVyIGdpdmVuIHdhcyBpbnZhbGlkLhBGdWxsAAMEMQFUaGVyZSBhcmUgYWxyZWFkeSBhIGZ1bGwgY29tcGxlbWVudCBvZiByZWZlcmVuZGEgaW4gcHJvZ3Jlc3MgZm9yIHRoaXMgdHJhY2suKFF1ZXVlRW1wdHkABASAVGhlIHF1ZXVlIG9mIHRoZSB0cmFjayBpcyBlbXB0eS40QmFkUmVmZXJlbmR1bQAFBORUaGUgcmVmZXJlbmR1bSBpbmRleCBwcm92aWRlZCBpcyBpbnZhbGlkIGluIHRoaXMgY29udGV4dC4sTm90aGluZ1RvRG8ABgSsVGhlcmUgd2FzIG5vdGhpbmcgdG8gZG8gaW4gdGhlIGFkdmFuY2VtZW50LhxOb1RyYWNrAAcEoE5vIHRyYWNrIGV4aXN0cyBmb3IgdGhlIHByb3Bvc2FsIG9yaWdpbi4oVW5maW5pc2hlZAAIBAEBQW55IGRlcG9zaXQgY2Fubm90IGJlIHJlZnVuZGVkIHVudGlsIGFmdGVyIHRoZSBkZWNpc2lvbiBpcyBvdmVyLjBOb1Blcm1pc3Npb24ACQSoVGhlIGRlcG9zaXQgcmVmdW5kZXIgaXMgbm90IHRoZSBkZXBvc2l0b3IuJE5vRGVwb3NpdAAKBMxUaGUgZGVwb3NpdCBjYW5ub3QgYmUgcmVmdW5kZWQgc2luY2Ugbm9uZSB3YXMgbWFkZS4kQmFkU3RhdHVzAAsE0FRoZSByZWZlcmVuZHVtIHN0YXR1cyBpcyBpbnZhbGlkIGZvciB0aGlzIG9wZXJhdGlvbi5AUHJlaW1hZ2VOb3RFeGlzdAAMBHBUaGUgcHJlaW1hZ2UgZG9lcyBub3QgZXhpc3QuhFByZWltYWdlU3RvcmVkV2l0aERpZmZlcmVudExlbmd0aAANBBUBVGhlIHByZWltYWdlIGlzIHN0b3JlZCB3aXRoIGEgZGlmZmVyZW50IGxlbmd0aCB0aGFuIHRoZSBvbmUgcHJvdmlkZWQuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LgUKDEBwYWxsZXRfd2hpdGVsaXN0GHBhbGxldBRFcnJvcgQEVAABFExVbmF2YWlsYWJsZVByZUltYWdlAAAEyFRoZSBwcmVpbWFnZSBvZiB0aGUgY2FsbCBoYXNoIGNvdWxkIG5vdCBiZSBsb2FkZWQuPFVuZGVjb2RhYmxlQ2FsbAABBHhUaGUgY2FsbCBjb3VsZCBub3QgYmUgZGVjb2RlZC5gSW52YWxpZENhbGxXZWlnaHRXaXRuZXNzAAIE7FRoZSB3ZWlnaHQgb2YgdGhlIGRlY29kZWQgY2FsbCB3YXMgaGlnaGVyIHRoYW4gdGhlIHdpdG5lc3MuUENhbGxJc05vdFdoaXRlbGlzdGVkAAMEdFRoZSBjYWxsIHdhcyBub3Qgd2hpdGVsaXN0ZWQuWENhbGxBbHJlYWR5V2hpdGVsaXN0ZWQABASgVGhlIGNhbGwgd2FzIGFscmVhZHkgd2hpdGVsaXN0ZWQ7IE5vLU9wLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC4JChBccG9sa2Fkb3RfcnVudGltZV9jb21tb24YY2xhaW1zGHBhbGxldBRFcnJvcgQEVAABGGBJbnZhbGlkRXRoZXJldW1TaWduYXR1cmUAAARsSW52YWxpZCBFdGhlcmV1bSBzaWduYXR1cmUuQFNpZ25lckhhc05vQ2xhaW0AAQR4RXRoZXJldW0gYWRkcmVzcyBoYXMgbm8gY2xhaW0uQFNlbmRlckhhc05vQ2xhaW0AAgSwQWNjb3VudCBJRCBzZW5kaW5nIHRyYW5zYWN0aW9uIGhhcyBubyBjbGFpbS4wUG90VW5kZXJmbG93AAMISQFUaGVyZSdzIG5vdCBlbm91Z2ggaW4gdGhlIHBvdCB0byBwYXkgb3V0IHNvbWUgdW52ZXN0ZWQgYW1vdW50LiBHZW5lcmFsbHkgaW1wbGllcyBhMGxvZ2ljIGVycm9yLkBJbnZhbGlkU3RhdGVtZW50AAQEkEEgbmVlZGVkIHN0YXRlbWVudCB3YXMgbm90IGluY2x1ZGVkLkxWZXN0ZWRCYWxhbmNlRXhpc3RzAAUEpFRoZSBhY2NvdW50IGFscmVhZHkgaGFzIGEgdmVzdGVkIGJhbGFuY2UuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0Lg0KDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQB9QIEUwAABAARCgEYVmVjPFQ+AAARCgAAAvUCABUKCDhwYWxsZXRfdmVzdGluZyBSZWxlYXNlcwABCAhWMAAAAAhWMQABAAAZCgw4cGFsbGV0X3Zlc3RpbmcYcGFsbGV0FEVycm9yBARUAAEUKE5vdFZlc3RpbmcAAASEVGhlIGFjY291bnQgZ2l2ZW4gaXMgbm90IHZlc3RpbmcuVEF0TWF4VmVzdGluZ1NjaGVkdWxlcwABCCUBVGhlIGFjY291bnQgYWxyZWFkeSBoYXMgYE1heFZlc3RpbmdTY2hlZHVsZXNgIGNvdW50IG9mIHNjaGVkdWxlcyBhbmQgdGh1c1EBY2Fubm90IGFkZCBhbm90aGVyIG9uZS4gQ29uc2lkZXIgbWVyZ2luZyBleGlzdGluZyBzY2hlZHVsZXMgaW4gb3JkZXIgdG8gYWRkIGFub3RoZXIuJEFtb3VudExvdwACBAUBQW1vdW50IGJlaW5nIHRyYW5zZmVycmVkIGlzIHRvbyBsb3cgdG8gY3JlYXRlIGEgdmVzdGluZyBzY2hlZHVsZS5gU2NoZWR1bGVJbmRleE91dE9mQm91bmRzAAME0EFuIGluZGV4IHdhcyBvdXQgb2YgYm91bmRzIG9mIHRoZSB2ZXN0aW5nIHNjaGVkdWxlcy5USW52YWxpZFNjaGVkdWxlUGFyYW1zAAQEDQFGYWlsZWQgdG8gY3JlYXRlIGEgbmV3IHNjaGVkdWxlIGJlY2F1c2Ugc29tZSBwYXJhbWV0ZXIgd2FzIGludmFsaWQuBHRFcnJvciBmb3IgdGhlIHZlc3RpbmcgcGFsbGV0Lh0KDDhwYWxsZXRfdXRpbGl0eRhwYWxsZXQURXJyb3IEBFQAAQQwVG9vTWFueUNhbGxzAAAEXFRvbyBtYW55IGNhbGxzIGJhdGNoZWQuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LiEKAAAECCUKGAAlCgxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUASkKBFMAAAQALQoBGFZlYzxUPgAAKQoIMHBhbGxldF9wcm94eTxQcm94eURlZmluaXRpb24MJEFjY291bnRJZAEAJFByb3h5VHlwZQEJAyxCbG9ja051bWJlcgEQAAwBIGRlbGVnYXRlAAEkQWNjb3VudElkAAEocHJveHlfdHlwZQkDASRQcm94eVR5cGUAARRkZWxheRABLEJsb2NrTnVtYmVyAAAtCgAAAikKADEKAAAECDUKGAA1CgxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUATkKBFMAAAQAPQoBGFZlYzxUPgAAOQoIMHBhbGxldF9wcm94eTBBbm5vdW5jZW1lbnQMJEFjY291bnRJZAEAEEhhc2gBNCxCbG9ja051bWJlcgEQAAwBEHJlYWwAASRBY2NvdW50SWQAASRjYWxsX2hhc2g0ARBIYXNoAAEYaGVpZ2h0EAEsQmxvY2tOdW1iZXIAAD0KAAACOQoAQQoMMHBhbGxldF9wcm94eRhwYWxsZXQURXJyb3IEBFQAASAcVG9vTWFueQAABCEBVGhlcmUgYXJlIHRvbyBtYW55IHByb3hpZXMgcmVnaXN0ZXJlZCBvciB0b28gbWFueSBhbm5vdW5jZW1lbnRzIHBlbmRpbmcuIE5vdEZvdW5kAAEEdFByb3h5IHJlZ2lzdHJhdGlvbiBub3QgZm91bmQuIE5vdFByb3h5AAIEzFNlbmRlciBpcyBub3QgYSBwcm94eSBvZiB0aGUgYWNjb3VudCB0byBiZSBwcm94aWVkLixVbnByb3h5YWJsZQADBCEBQSBjYWxsIHdoaWNoIGlzIGluY29tcGF0aWJsZSB3aXRoIHRoZSBwcm94eSB0eXBlJ3MgZmlsdGVyIHdhcyBhdHRlbXB0ZWQuJER1cGxpY2F0ZQAEBGxBY2NvdW50IGlzIGFscmVhZHkgYSBwcm94eS4wTm9QZXJtaXNzaW9uAAUEFQFDYWxsIG1heSBub3QgYmUgbWFkZSBieSBwcm94eSBiZWNhdXNlIGl0IG1heSBlc2NhbGF0ZSBpdHMgcHJpdmlsZWdlcy4sVW5hbm5vdW5jZWQABgTQQW5ub3VuY2VtZW50LCBpZiBtYWRlIGF0IGFsbCwgd2FzIG1hZGUgdG9vIHJlY2VudGx5LixOb1NlbGZQcm94eQAHBGRDYW5ub3QgYWRkIHNlbGYgYXMgcHJveHkuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LkUKAAAECAAEAEkKCDxwYWxsZXRfbXVsdGlzaWcgTXVsdGlzaWcQLEJsb2NrTnVtYmVyARAcQmFsYW5jZQEYJEFjY291bnRJZAEAME1heEFwcHJvdmFscwAAEAEQd2hlbhUDAVhUaW1lcG9pbnQ8QmxvY2tOdW1iZXI+AAEcZGVwb3NpdBgBHEJhbGFuY2UAASRkZXBvc2l0b3IAASRBY2NvdW50SWQAASRhcHByb3ZhbHNNCgGMQm91bmRlZFZlYzxBY2NvdW50SWQsIE1heEFwcHJvdmFscz4AAE0KDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBAARTAAAEANEBARhWZWM8VD4AAFEKDDxwYWxsZXRfbXVsdGlzaWcYcGFsbGV0FEVycm9yBARUAAE4QE1pbmltdW1UaHJlc2hvbGQAAAR8VGhyZXNob2xkIG11c3QgYmUgMiBvciBncmVhdGVyLjxBbHJlYWR5QXBwcm92ZWQAAQSsQ2FsbCBpcyBhbHJlYWR5IGFwcHJvdmVkIGJ5IHRoaXMgc2lnbmF0b3J5LkROb0FwcHJvdmFsc05lZWRlZAACBJxDYWxsIGRvZXNuJ3QgbmVlZCBhbnkgKG1vcmUpIGFwcHJvdmFscy5EVG9vRmV3U2lnbmF0b3JpZXMAAwSoVGhlcmUgYXJlIHRvbyBmZXcgc2lnbmF0b3JpZXMgaW4gdGhlIGxpc3QuSFRvb01hbnlTaWduYXRvcmllcwAEBKxUaGVyZSBhcmUgdG9vIG1hbnkgc2lnbmF0b3JpZXMgaW4gdGhlIGxpc3QuVFNpZ25hdG9yaWVzT3V0T2ZPcmRlcgAFBA0BVGhlIHNpZ25hdG9yaWVzIHdlcmUgcHJvdmlkZWQgb3V0IG9mIG9yZGVyOyB0aGV5IHNob3VsZCBiZSBvcmRlcmVkLkxTZW5kZXJJblNpZ25hdG9yaWVzAAYEDQFUaGUgc2VuZGVyIHdhcyBjb250YWluZWQgaW4gdGhlIG90aGVyIHNpZ25hdG9yaWVzOyBpdCBzaG91bGRuJ3QgYmUuIE5vdEZvdW5kAAcE3E11bHRpc2lnIG9wZXJhdGlvbiBub3QgZm91bmQgd2hlbiBhdHRlbXB0aW5nIHRvIGNhbmNlbC4gTm90T3duZXIACAQtAU9ubHkgdGhlIGFjY291bnQgdGhhdCBvcmlnaW5hbGx5IGNyZWF0ZWQgdGhlIG11bHRpc2lnIGlzIGFibGUgdG8gY2FuY2VsIGl0LixOb1RpbWVwb2ludAAJBB0BTm8gdGltZXBvaW50IHdhcyBnaXZlbiwgeWV0IHRoZSBtdWx0aXNpZyBvcGVyYXRpb24gaXMgYWxyZWFkeSB1bmRlcndheS44V3JvbmdUaW1lcG9pbnQACgQtAUEgZGlmZmVyZW50IHRpbWVwb2ludCB3YXMgZ2l2ZW4gdG8gdGhlIG11bHRpc2lnIG9wZXJhdGlvbiB0aGF0IGlzIHVuZGVyd2F5LkxVbmV4cGVjdGVkVGltZXBvaW50AAsE9EEgdGltZXBvaW50IHdhcyBnaXZlbiwgeWV0IG5vIG11bHRpc2lnIG9wZXJhdGlvbiBpcyB1bmRlcndheS48TWF4V2VpZ2h0VG9vTG93AAwE0FRoZSBtYXhpbXVtIHdlaWdodCBpbmZvcm1hdGlvbiBwcm92aWRlZCB3YXMgdG9vIGxvdy40QWxyZWFkeVN0b3JlZAANBKBUaGUgZGF0YSB0byBiZSBzdG9yZWQgaXMgYWxyZWFkeSBzdG9yZWQuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LlUKCDxwYWxsZXRfYm91bnRpZXMYQm91bnR5DCRBY2NvdW50SWQBABxCYWxhbmNlARgsQmxvY2tOdW1iZXIBEAAYASBwcm9wb3NlcgABJEFjY291bnRJZAABFHZhbHVlGAEcQmFsYW5jZQABDGZlZRgBHEJhbGFuY2UAATxjdXJhdG9yX2RlcG9zaXQYARxCYWxhbmNlAAEQYm9uZBgBHEJhbGFuY2UAARhzdGF0dXNZCgGQQm91bnR5U3RhdHVzPEFjY291bnRJZCwgQmxvY2tOdW1iZXI+AABZCgg8cGFsbGV0X2JvdW50aWVzMEJvdW50eVN0YXR1cwgkQWNjb3VudElkAQAsQmxvY2tOdW1iZXIBEAEYIFByb3Bvc2VkAAAAIEFwcHJvdmVkAAEAGEZ1bmRlZAACADxDdXJhdG9yUHJvcG9zZWQEARxjdXJhdG9yAAEkQWNjb3VudElkAAMAGEFjdGl2ZQgBHGN1cmF0b3IAASRBY2NvdW50SWQAASh1cGRhdGVfZHVlEAEsQmxvY2tOdW1iZXIABAA0UGVuZGluZ1BheW91dAwBHGN1cmF0b3IAASRBY2NvdW50SWQAASxiZW5lZmljaWFyeQABJEFjY291bnRJZAABJHVubG9ja19hdBABLEJsb2NrTnVtYmVyAAUAAF0KDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBCARTAAAEADgBGFZlYzxUPgAAYQoMPHBhbGxldF9ib3VudGllcxhwYWxsZXQURXJyb3IIBFQABEkAASxwSW5zdWZmaWNpZW50UHJvcG9zZXJzQmFsYW5jZQAABHhQcm9wb3NlcidzIGJhbGFuY2UgaXMgdG9vIGxvdy4wSW52YWxpZEluZGV4AAEEkE5vIHByb3Bvc2FsIG9yIGJvdW50eSBhdCB0aGF0IGluZGV4LjBSZWFzb25Ub29CaWcAAgSEVGhlIHJlYXNvbiBnaXZlbiBpcyBqdXN0IHRvbyBiaWcuQFVuZXhwZWN0ZWRTdGF0dXMAAwSAVGhlIGJvdW50eSBzdGF0dXMgaXMgdW5leHBlY3RlZC44UmVxdWlyZUN1cmF0b3IABARcUmVxdWlyZSBib3VudHkgY3VyYXRvci4wSW52YWxpZFZhbHVlAAUEVEludmFsaWQgYm91bnR5IHZhbHVlLihJbnZhbGlkRmVlAAYETEludmFsaWQgYm91bnR5IGZlZS40UGVuZGluZ1BheW91dAAHCGxBIGJvdW50eSBwYXlvdXQgaXMgcGVuZGluZy74VG8gY2FuY2VsIHRoZSBib3VudHksIHlvdSBtdXN0IHVuYXNzaWduIGFuZCBzbGFzaCB0aGUgY3VyYXRvci4kUHJlbWF0dXJlAAgERQFUaGUgYm91bnRpZXMgY2Fubm90IGJlIGNsYWltZWQvY2xvc2VkIGJlY2F1c2UgaXQncyBzdGlsbCBpbiB0aGUgY291bnRkb3duIHBlcmlvZC5QSGFzQWN0aXZlQ2hpbGRCb3VudHkACQQFAVRoZSBib3VudHkgY2Fubm90IGJlIGNsb3NlZCBiZWNhdXNlIGl0IGhhcyBhY3RpdmUgY2hpbGQgYm91bnRpZXMuNFRvb01hbnlRdWV1ZWQACgSYVG9vIG1hbnkgYXBwcm92YWxzIGFyZSBhbHJlYWR5IHF1ZXVlZC4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQuZQoIVHBhbGxldF9jaGlsZF9ib3VudGllcyxDaGlsZEJvdW50eQwkQWNjb3VudElkAQAcQmFsYW5jZQEYLEJsb2NrTnVtYmVyARAAFAE0cGFyZW50X2JvdW50eRABLEJvdW50eUluZGV4AAEUdmFsdWUYARxCYWxhbmNlAAEMZmVlGAEcQmFsYW5jZQABPGN1cmF0b3JfZGVwb3NpdBgBHEJhbGFuY2UAARhzdGF0dXNpCgGkQ2hpbGRCb3VudHlTdGF0dXM8QWNjb3VudElkLCBCbG9ja051bWJlcj4AAGkKCFRwYWxsZXRfY2hpbGRfYm91bnRpZXNEQ2hpbGRCb3VudHlTdGF0dXMIJEFjY291bnRJZAEALEJsb2NrTnVtYmVyARABEBRBZGRlZAAAADxDdXJhdG9yUHJvcG9zZWQEARxjdXJhdG9yAAEkQWNjb3VudElkAAEAGEFjdGl2ZQQBHGN1cmF0b3IAASRBY2NvdW50SWQAAgA0UGVuZGluZ1BheW91dAwBHGN1cmF0b3IAASRBY2NvdW50SWQAASxiZW5lZmljaWFyeQABJEFjY291bnRJZAABJHVubG9ja19hdBABLEJsb2NrTnVtYmVyAAMAAG0KDFRwYWxsZXRfY2hpbGRfYm91bnRpZXMYcGFsbGV0FEVycm9yBARUAAEMVFBhcmVudEJvdW50eU5vdEFjdGl2ZQAABKRUaGUgcGFyZW50IGJvdW50eSBpcyBub3QgaW4gYWN0aXZlIHN0YXRlLmRJbnN1ZmZpY2llbnRCb3VudHlCYWxhbmNlAAEE5FRoZSBib3VudHkgYmFsYW5jZSBpcyBub3QgZW5vdWdoIHRvIGFkZCBuZXcgY2hpbGQtYm91bnR5LlBUb29NYW55Q2hpbGRCb3VudGllcwACBA0BTnVtYmVyIG9mIGNoaWxkIGJvdW50aWVzIGV4Y2VlZHMgbGltaXQgYE1heEFjdGl2ZUNoaWxkQm91bnR5Q291bnRgLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC5xCgiQcGFsbGV0X2VsZWN0aW9uX3Byb3ZpZGVyX211bHRpX3BoYXNlNFJlYWR5U29sdXRpb24IJEFjY291bnRJZAAoTWF4V2lubmVycwAADAEgc3VwcG9ydHN1CgGYQm91bmRlZFN1cHBvcnRzPEFjY291bnRJZCwgTWF4V2lubmVycz4AARRzY29yZfUDATRFbGVjdGlvblNjb3JlAAEcY29tcHV0ZVEHATxFbGVjdGlvbkNvbXB1dGUAAHUKDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBBQQEUwAABAABBAEYVmVjPFQ+AAB5CgiQcGFsbGV0X2VsZWN0aW9uX3Byb3ZpZGVyX211bHRpX3BoYXNlNFJvdW5kU25hcHNob3QIJEFjY291bnRJZAEAMERhdGFQcm92aWRlcgF9CgAIARh2b3RlcnOBCgFEVmVjPERhdGFQcm92aWRlcj4AARx0YXJnZXRz0QEBOFZlYzxBY2NvdW50SWQ+AAB9CgAABAwAMOUIAIEKAAACfQoAhQoMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAGJCgRTAAAEAI0KARhWZWM8VD4AAIkKAAAEDPUDEBAAjQoAAAKJCgCRCgyQcGFsbGV0X2VsZWN0aW9uX3Byb3ZpZGVyX211bHRpX3BoYXNlGHNpZ25lZEBTaWduZWRTdWJtaXNzaW9uDCRBY2NvdW50SWQBABxCYWxhbmNlARggU29sdXRpb24BKQMAEAEMd2hvAAEkQWNjb3VudElkAAEcZGVwb3NpdBgBHEJhbGFuY2UAATByYXdfc29sdXRpb24lAwFUUmF3U29sdXRpb248U29sdXRpb24+AAEgY2FsbF9mZWUYARxCYWxhbmNlAACVCgyQcGFsbGV0X2VsZWN0aW9uX3Byb3ZpZGVyX211bHRpX3BoYXNlGHBhbGxldBRFcnJvcgQEVAABPGhQcmVEaXNwYXRjaEVhcmx5U3VibWlzc2lvbgAABGRTdWJtaXNzaW9uIHdhcyB0b28gZWFybHkubFByZURpc3BhdGNoV3JvbmdXaW5uZXJDb3VudAABBIhXcm9uZyBudW1iZXIgb2Ygd2lubmVycyBwcmVzZW50ZWQuZFByZURpc3BhdGNoV2Vha1N1Ym1pc3Npb24AAgSQU3VibWlzc2lvbiB3YXMgdG9vIHdlYWssIHNjb3JlLXdpc2UuPFNpZ25lZFF1ZXVlRnVsbAADBEkBVGhlIHF1ZXVlIHdhcyBmdWxsLCBhbmQgdGhlIHNvbHV0aW9uIHdhcyBub3QgYmV0dGVyIHRoYW4gYW55IG9mIHRoZSBleGlzdGluZyBvbmVzLlhTaWduZWRDYW5ub3RQYXlEZXBvc2l0AAQElFRoZSBvcmlnaW4gZmFpbGVkIHRvIHBheSB0aGUgZGVwb3NpdC5QU2lnbmVkSW52YWxpZFdpdG5lc3MABQSgV2l0bmVzcyBkYXRhIHRvIGRpc3BhdGNoYWJsZSBpcyBpbnZhbGlkLkxTaWduZWRUb29NdWNoV2VpZ2h0AAYEuFRoZSBzaWduZWQgc3VibWlzc2lvbiBjb25zdW1lcyB0b28gbXVjaCB3ZWlnaHQ8T2N3Q2FsbFdyb25nRXJhAAcEmE9DVyBzdWJtaXR0ZWQgc29sdXRpb24gZm9yIHdyb25nIHJvdW5kXE1pc3NpbmdTbmFwc2hvdE1ldGFkYXRhAAgEqFNuYXBzaG90IG1ldGFkYXRhIHNob3VsZCBleGlzdCBidXQgZGlkbid0LlhJbnZhbGlkU3VibWlzc2lvbkluZGV4AAkE0GBTZWxmOjppbnNlcnRfc3VibWlzc2lvbmAgcmV0dXJuZWQgYW4gaW52YWxpZCBpbmRleC44Q2FsbE5vdEFsbG93ZWQACgSYVGhlIGNhbGwgaXMgbm90IGFsbG93ZWQgYXQgdGhpcyBwb2ludC44RmFsbGJhY2tGYWlsZWQACwRMVGhlIGZhbGxiYWNrIGZhaWxlZCxCb3VuZE5vdE1ldAAMBEhTb21lIGJvdW5kIG5vdCBtZXQ4VG9vTWFueVdpbm5lcnMADQScU3VibWl0dGVkIHNvbHV0aW9uIGhhcyB0b28gbWFueSB3aW5uZXJzZFByZURpc3BhdGNoRGlmZmVyZW50Um91bmQADgS4U3VibWlzc2lvbiB3YXMgcHJlcGFyZWQgZm9yIGEgZGlmZmVyZW50IHJvdW5kLgQNAUVycm9yIG9mIHRoZSBwYWxsZXQgdGhhdCBjYW4gYmUgcmV0dXJuZWQgaW4gcmVzcG9uc2UgdG8gZGlzcGF0Y2hlcy6ZCgxAcGFsbGV0X2JhZ3NfbGlzdBBsaXN0EE5vZGUIBFQABEkAABQBCGlkAAEwVDo6QWNjb3VudElkAAEQcHJldv0BAVBPcHRpb248VDo6QWNjb3VudElkPgABEG5leHT9AQFQT3B0aW9uPFQ6OkFjY291bnRJZD4AASRiYWdfdXBwZXIwASBUOjpTY29yZQABFHNjb3JlMAEgVDo6U2NvcmUAAJ0KDEBwYWxsZXRfYmFnc19saXN0EGxpc3QMQmFnCARUAARJAAAIARBoZWFk/QEBUE9wdGlvbjxUOjpBY2NvdW50SWQ+AAEQdGFpbP0BAVBPcHRpb248VDo6QWNjb3VudElkPgAAoQoAAAIwAKUKDEBwYWxsZXRfYmFnc19saXN0GHBhbGxldBRFcnJvcggEVAAESQABBBBMaXN0BACpCgEkTGlzdEVycm9yAAAEtEEgZXJyb3IgaW4gdGhlIGxpc3QgaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC6pCgxAcGFsbGV0X2JhZ3NfbGlzdBBsaXN0JExpc3RFcnJvcgABECREdXBsaWNhdGUAAAAoTm90SGVhdmllcgABADBOb3RJblNhbWVCYWcAAgAwTm9kZU5vdEZvdW5kAAMAAK0KCFxwYWxsZXRfbm9taW5hdGlvbl9wb29scyhQb29sTWVtYmVyBARUAAAQARxwb29sX2lkEAEYUG9vbElkAAEYcG9pbnRzGAEwQmFsYW5jZU9mPFQ+AAFwbGFzdF9yZWNvcmRlZF9yZXdhcmRfY291bnRlctEGAUBUOjpSZXdhcmRDb3VudGVyAAE4dW5ib25kaW5nX2VyYXOxCgHgQm91bmRlZEJUcmVlTWFwPEVyYUluZGV4LCBCYWxhbmNlT2Y8VD4sIFQ6Ok1heFVuYm9uZGluZz4AALEKDExib3VuZGVkX2NvbGxlY3Rpb25zRGJvdW5kZWRfYnRyZWVfbWFwPEJvdW5kZWRCVHJlZU1hcAwESwEQBFYBGARTAAAEALUKAThCVHJlZU1hcDxLLCBWPgAAtQoEIEJUcmVlTWFwCARLARAEVgEYAAQA5QkAAAC5CghccGFsbGV0X25vbWluYXRpb25fcG9vbHM8Qm9uZGVkUG9vbElubmVyBARUAAAUAShjb21taXNzaW9uvQoBNENvbW1pc3Npb248VD4AAThtZW1iZXJfY291bnRlchABDHUzMgABGHBvaW50cxgBMEJhbGFuY2VPZjxUPgABFHJvbGVzyQoBXFBvb2xSb2xlczxUOjpBY2NvdW50SWQ+AAEUc3RhdGUhBAEkUG9vbFN0YXRlAAC9CghccGFsbGV0X25vbWluYXRpb25fcG9vbHMoQ29tbWlzc2lvbgQEVAAAFAEcY3VycmVudDkEAXxPcHRpb248KFBlcmJpbGwsIFQ6OkFjY291bnRJZCk+AAEMbWF4wQoBPE9wdGlvbjxQZXJiaWxsPgABLGNoYW5nZV9yYXRlxQoBvE9wdGlvbjxDb21taXNzaW9uQ2hhbmdlUmF0ZTxCbG9ja051bWJlckZvcjxUPj4+AAE0dGhyb3R0bGVfZnJvbWECAWRPcHRpb248QmxvY2tOdW1iZXJGb3I8VD4+AAFAY2xhaW1fcGVybWlzc2lvbkUEAbxPcHRpb248Q29tbWlzc2lvbkNsYWltUGVybWlzc2lvbjxUOjpBY2NvdW50SWQ+PgAAwQoEGE9wdGlvbgQEVAGsAQgQTm9uZQAAABBTb21lBACsAAABAADFCgQYT3B0aW9uBARUAUEEAQgQTm9uZQAAABBTb21lBABBBAAAAQAAyQoIXHBhbGxldF9ub21pbmF0aW9uX3Bvb2xzJFBvb2xSb2xlcwQkQWNjb3VudElkAQAAEAEkZGVwb3NpdG9yAAEkQWNjb3VudElkAAEQcm9vdP0BAURPcHRpb248QWNjb3VudElkPgABJG5vbWluYXRvcv0BAURPcHRpb248QWNjb3VudElkPgABHGJvdW5jZXL9AQFET3B0aW9uPEFjY291bnRJZD4AAM0KCFxwYWxsZXRfbm9taW5hdGlvbl9wb29scyhSZXdhcmRQb29sBARUAAAUAXBsYXN0X3JlY29yZGVkX3Jld2FyZF9jb3VudGVy0QYBQFQ6OlJld2FyZENvdW50ZXIAAWxsYXN0X3JlY29yZGVkX3RvdGFsX3BheW91dHMYATBCYWxhbmNlT2Y8VD4AAVR0b3RhbF9yZXdhcmRzX2NsYWltZWQYATBCYWxhbmNlT2Y8VD4AAWB0b3RhbF9jb21taXNzaW9uX3BlbmRpbmcYATBCYWxhbmNlT2Y8VD4AAWB0b3RhbF9jb21taXNzaW9uX2NsYWltZWQYATBCYWxhbmNlT2Y8VD4AANEKCFxwYWxsZXRfbm9taW5hdGlvbl9wb29scyBTdWJQb29scwQEVAAACAEYbm9fZXJh1QoBNFVuYm9uZFBvb2w8VD4AASB3aXRoX2VyYdkKAQEBQm91bmRlZEJUcmVlTWFwPEVyYUluZGV4LCBVbmJvbmRQb29sPFQ+LCBUb3RhbFVuYm9uZGluZ1Bvb2xzPFQ+PgAA1QoIXHBhbGxldF9ub21pbmF0aW9uX3Bvb2xzKFVuYm9uZFBvb2wEBFQAAAgBGHBvaW50cxgBMEJhbGFuY2VPZjxUPgABHGJhbGFuY2UYATBCYWxhbmNlT2Y8VD4AANkKDExib3VuZGVkX2NvbGxlY3Rpb25zRGJvdW5kZWRfYnRyZWVfbWFwPEJvdW5kZWRCVHJlZU1hcAwESwEQBFYB1QoEUwAABADdCgE4QlRyZWVNYXA8SywgVj4AAN0KBCBCVHJlZU1hcAgESwEQBFYB1QoABADhCgAAAOEKAAAC5QoA5QoAAAQIENUKAOkKDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBCARTAAAEADgBGFZlYzxUPgAA7QoMXHBhbGxldF9ub21pbmF0aW9uX3Bvb2xzGHBhbGxldBRFcnJvcgQEVAABkDBQb29sTm90Rm91bmQAAASIQSAoYm9uZGVkKSBwb29sIGlkIGRvZXMgbm90IGV4aXN0LkhQb29sTWVtYmVyTm90Rm91bmQAAQRsQW4gYWNjb3VudCBpcyBub3QgYSBtZW1iZXIuSFJld2FyZFBvb2xOb3RGb3VuZAACBCEBQSByZXdhcmQgcG9vbCBkb2VzIG5vdCBleGlzdC4gSW4gYWxsIGNhc2VzIHRoaXMgaXMgYSBzeXN0ZW0gbG9naWMgZXJyb3IuQFN1YlBvb2xzTm90Rm91bmQAAwRoQSBzdWIgcG9vbCBkb2VzIG5vdCBleGlzdC5kQWNjb3VudEJlbG9uZ3NUb090aGVyUG9vbAAECE0BQW4gYWNjb3VudCBpcyBhbHJlYWR5IGRlbGVnYXRpbmcgaW4gYW5vdGhlciBwb29sLiBBbiBhY2NvdW50IG1heSBvbmx5IGJlbG9uZyB0byBvbmU8cG9vbCBhdCBhIHRpbWUuOEZ1bGx5VW5ib25kaW5nAAUIPQFUaGUgbWVtYmVyIGlzIGZ1bGx5IHVuYm9uZGVkIChhbmQgdGh1cyBjYW5ub3QgYWNjZXNzIHRoZSBib25kZWQgYW5kIHJld2FyZCBwb29sqGFueW1vcmUgdG8sIGZvciBleGFtcGxlLCBjb2xsZWN0IHJld2FyZHMpLkRNYXhVbmJvbmRpbmdMaW1pdAAGBAkBVGhlIG1lbWJlciBjYW5ub3QgdW5ib25kIGZ1cnRoZXIgY2h1bmtzIGR1ZSB0byByZWFjaGluZyB0aGUgbGltaXQuRENhbm5vdFdpdGhkcmF3QW55AAcETQFOb25lIG9mIHRoZSBmdW5kcyBjYW4gYmUgd2l0aGRyYXduIHlldCBiZWNhdXNlIHRoZSBib25kaW5nIGR1cmF0aW9uIGhhcyBub3QgcGFzc2VkLkRNaW5pbXVtQm9uZE5vdE1ldAAIFCkBVGhlIGFtb3VudCBkb2VzIG5vdCBtZWV0IHRoZSBtaW5pbXVtIGJvbmQgdG8gZWl0aGVyIGpvaW4gb3IgY3JlYXRlIGEgcG9vbC4AVQFUaGUgZGVwb3NpdG9yIGNhbiBuZXZlciB1bmJvbmQgdG8gYSB2YWx1ZSBsZXNzIHRoYW4gYFBhbGxldDo6ZGVwb3NpdG9yX21pbl9ib25kYC4gVGhlXQFjYWxsZXIgZG9lcyBub3QgaGF2ZSBub21pbmF0aW5nIHBlcm1pc3Npb25zIGZvciB0aGUgcG9vbC4gTWVtYmVycyBjYW4gbmV2ZXIgdW5ib25kIHRvIGFodmFsdWUgYmVsb3cgYE1pbkpvaW5Cb25kYC4wT3ZlcmZsb3dSaXNrAAkEIQFUaGUgdHJhbnNhY3Rpb24gY291bGQgbm90IGJlIGV4ZWN1dGVkIGR1ZSB0byBvdmVyZmxvdyByaXNrIGZvciB0aGUgcG9vbC40Tm90RGVzdHJveWluZwAKCF0BQSBwb29sIG11c3QgYmUgaW4gW2BQb29sU3RhdGU6OkRlc3Ryb3lpbmdgXSBpbiBvcmRlciBmb3IgdGhlIGRlcG9zaXRvciB0byB1bmJvbmQgb3IgZm9yuG90aGVyIG1lbWJlcnMgdG8gYmUgcGVybWlzc2lvbmxlc3NseSB1bmJvbmRlZC4wTm90Tm9taW5hdG9yAAsE9FRoZSBjYWxsZXIgZG9lcyBub3QgaGF2ZSBub21pbmF0aW5nIHBlcm1pc3Npb25zIGZvciB0aGUgcG9vbC5UTm90S2lja2VyT3JEZXN0cm95aW5nAAwEPQFFaXRoZXIgYSkgdGhlIGNhbGxlciBjYW5ub3QgbWFrZSBhIHZhbGlkIGtpY2sgb3IgYikgdGhlIHBvb2wgaXMgbm90IGRlc3Ryb3lpbmcuHE5vdE9wZW4ADQRwVGhlIHBvb2wgaXMgbm90IG9wZW4gdG8gam9pbiBNYXhQb29scwAOBIRUaGUgc3lzdGVtIGlzIG1heGVkIG91dCBvbiBwb29scy44TWF4UG9vbE1lbWJlcnMADwScVG9vIG1hbnkgbWVtYmVycyBpbiB0aGUgcG9vbCBvciBzeXN0ZW0uRENhbk5vdENoYW5nZVN0YXRlABAEiFRoZSBwb29scyBzdGF0ZSBjYW5ub3QgYmUgY2hhbmdlZC5URG9lc05vdEhhdmVQZXJtaXNzaW9uABEEuFRoZSBjYWxsZXIgZG9lcyBub3QgaGF2ZSBhZGVxdWF0ZSBwZXJtaXNzaW9ucy5UTWV0YWRhdGFFeGNlZWRzTWF4TGVuABIErE1ldGFkYXRhIGV4Y2VlZHMgW2BDb25maWc6Ok1heE1ldGFkYXRhTGVuYF0kRGVmZW5zaXZlBADxCgE4RGVmZW5zaXZlRXJyb3IAEwgxAVNvbWUgZXJyb3Igb2NjdXJyZWQgdGhhdCBzaG91bGQgbmV2ZXIgaGFwcGVuLiBUaGlzIHNob3VsZCBiZSByZXBvcnRlZCB0byB0aGUwbWFpbnRhaW5lcnMunFBhcnRpYWxVbmJvbmROb3RBbGxvd2VkUGVybWlzc2lvbmxlc3NseQAUBLxQYXJ0aWFsIHVuYm9uZGluZyBub3cgYWxsb3dlZCBwZXJtaXNzaW9ubGVzc2x5LlxNYXhDb21taXNzaW9uUmVzdHJpY3RlZAAVBB0BVGhlIHBvb2wncyBtYXggY29tbWlzc2lvbiBjYW5ub3QgYmUgc2V0IGhpZ2hlciB0aGFuIHRoZSBleGlzdGluZyB2YWx1ZS5gQ29tbWlzc2lvbkV4Y2VlZHNNYXhpbXVtABYE7FRoZSBzdXBwbGllZCBjb21taXNzaW9uIGV4Y2VlZHMgdGhlIG1heCBhbGxvd2VkIGNvbW1pc3Npb24ueENvbW1pc3Npb25FeGNlZWRzR2xvYmFsTWF4aW11bQAXBOhUaGUgc3VwcGxpZWQgY29tbWlzc2lvbiBleGNlZWRzIGdsb2JhbCBtYXhpbXVtIGNvbW1pc3Npb24uZENvbW1pc3Npb25DaGFuZ2VUaHJvdHRsZWQAGAQJAU5vdCBlbm91Z2ggYmxvY2tzIGhhdmUgc3VycGFzc2VkIHNpbmNlIHRoZSBsYXN0IGNvbW1pc3Npb24gdXBkYXRlLnhDb21taXNzaW9uQ2hhbmdlUmF0ZU5vdEFsbG93ZWQAGQQBAVRoZSBzdWJtaXR0ZWQgY2hhbmdlcyB0byBjb21taXNzaW9uIGNoYW5nZSByYXRlIGFyZSBub3QgYWxsb3dlZC5MTm9QZW5kaW5nQ29tbWlzc2lvbgAaBKBUaGVyZSBpcyBubyBwZW5kaW5nIGNvbW1pc3Npb24gdG8gY2xhaW0uWE5vQ29tbWlzc2lvbkN1cnJlbnRTZXQAGwSMTm8gY29tbWlzc2lvbiBjdXJyZW50IGhhcyBiZWVuIHNldC4sUG9vbElkSW5Vc2UAHARkUG9vbCBpZCBjdXJyZW50bHkgaW4gdXNlLjRJbnZhbGlkUG9vbElkAB0EnFBvb2wgaWQgcHJvdmlkZWQgaXMgbm90IGNvcnJlY3QvdXNhYmxlLkxCb25kRXh0cmFSZXN0cmljdGVkAB4E/EJvbmRpbmcgZXh0cmEgaXMgcmVzdHJpY3RlZCB0byB0aGUgZXhhY3QgcGVuZGluZyByZXdhcmQgYW1vdW50LjxOb3RoaW5nVG9BZGp1c3QAHwSwTm8gaW1iYWxhbmNlIGluIHRoZSBFRCBkZXBvc2l0IGZvciB0aGUgcG9vbC44Tm90aGluZ1RvU2xhc2gAIATMTm8gc2xhc2ggcGVuZGluZyB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIHRoZSBtZW1iZXIuPEFscmVhZHlNaWdyYXRlZAAhBBUBVGhlIHBvb2wgb3IgbWVtYmVyIGRlbGVnYXRpb24gaGFzIGFscmVhZHkgbWlncmF0ZWQgdG8gZGVsZWdhdGUgc3Rha2UuLE5vdE1pZ3JhdGVkACIEFQFUaGUgcG9vbCBvciBtZW1iZXIgZGVsZWdhdGlvbiBoYXMgbm90IG1pZ3JhdGVkIHlldCB0byBkZWxlZ2F0ZSBzdGFrZS4wTm90U3VwcG9ydGVkACME8FRoaXMgY2FsbCBpcyBub3QgYWxsb3dlZCBpbiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgcGFsbGV0LgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC7xCgxccGFsbGV0X25vbWluYXRpb25fcG9vbHMYcGFsbGV0OERlZmVuc2l2ZUVycm9yAAEcaE5vdEVub3VnaFNwYWNlSW5VbmJvbmRQb29sAAAAMFBvb2xOb3RGb3VuZAABAEhSZXdhcmRQb29sTm90Rm91bmQAAgBAU3ViUG9vbHNOb3RGb3VuZAADAHBCb25kZWRTdGFzaEtpbGxlZFByZW1hdHVyZWx5AAQAVERlbGVnYXRpb25VbnN1cHBvcnRlZAAFADxTbGFzaE5vdEFwcGxpZWQABgAA9QoMTHBhbGxldF9mYXN0X3Vuc3Rha2UUdHlwZXM4VW5zdGFrZVJlcXVlc3QEBFQAAAgBHHN0YXNoZXP5CgHYQm91bmRlZFZlYzwoVDo6QWNjb3VudElkLCBCYWxhbmNlT2Y8VD4pLCBUOjpCYXRjaFNpemU+AAEcY2hlY2tlZP0KAZBCb3VuZGVkVmVjPEVyYUluZGV4LCBNYXhDaGVja2luZzxUPj4AAPkKDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBEQQEUwAABAANBAEYVmVjPFQ+AAD9CgxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUARAEUwAABADlAQEYVmVjPFQ+AAABCwxMcGFsbGV0X2Zhc3RfdW5zdGFrZRhwYWxsZXQURXJyb3IEBFQAARg0Tm90Q29udHJvbGxlcgAADLhUaGUgcHJvdmlkZWQgQ29udHJvbGxlciBhY2NvdW50IHdhcyBub3QgZm91bmQuAMBUaGlzIG1lYW5zIHRoYXQgdGhlIGdpdmVuIGFjY291bnQgaXMgbm90IGJvbmRlZC40QWxyZWFkeVF1ZXVlZAABBKxUaGUgYm9uZGVkIGFjY291bnQgaGFzIGFscmVhZHkgYmVlbiBxdWV1ZWQuOE5vdEZ1bGx5Qm9uZGVkAAIEvFRoZSBib25kZWQgYWNjb3VudCBoYXMgYWN0aXZlIHVubG9ja2luZyBjaHVua3MuJE5vdFF1ZXVlZAADBLRUaGUgcHJvdmlkZWQgdW4tc3Rha2VyIGlzIG5vdCBpbiB0aGUgYFF1ZXVlYC4sQWxyZWFkeUhlYWQABAQFAVRoZSBwcm92aWRlZCB1bi1zdGFrZXIgaXMgYWxyZWFkeSBpbiBIZWFkLCBhbmQgY2Fubm90IGRlcmVnaXN0ZXIuOENhbGxOb3RBbGxvd2VkAAUEHQFUaGUgY2FsbCBpcyBub3QgYWxsb3dlZCBhdCB0aGlzIHBvaW50IGJlY2F1c2UgdGhlIHBhbGxldCBpcyBub3QgYWN0aXZlLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC4FCwxscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zNGNvbmZpZ3VyYXRpb25ESG9zdENvbmZpZ3VyYXRpb24ELEJsb2NrTnVtYmVyARAAjAE0bWF4X2NvZGVfc2l6ZRABDHUzMgABSG1heF9oZWFkX2RhdGFfc2l6ZRABDHUzMgABWG1heF91cHdhcmRfcXVldWVfY291bnQQAQx1MzIAAVRtYXhfdXB3YXJkX3F1ZXVlX3NpemUQAQx1MzIAAVxtYXhfdXB3YXJkX21lc3NhZ2Vfc2l6ZRABDHUzMgABkG1heF91cHdhcmRfbWVzc2FnZV9udW1fcGVyX2NhbmRpZGF0ZRABDHUzMgABiGhybXBfbWF4X21lc3NhZ2VfbnVtX3Blcl9jYW5kaWRhdGUQAQx1MzIAAWx2YWxpZGF0aW9uX3VwZ3JhZGVfY29vbGRvd24QASxCbG9ja051bWJlcgABYHZhbGlkYXRpb25fdXBncmFkZV9kZWxheRABLEJsb2NrTnVtYmVyAAFQYXN5bmNfYmFja2luZ19wYXJhbXNVBAFIQXN5bmNCYWNraW5nUGFyYW1zAAEwbWF4X3Bvdl9zaXplEAEMdTMyAAFkbWF4X2Rvd253YXJkX21lc3NhZ2Vfc2l6ZRABDHUzMgABkGhybXBfbWF4X3BhcmFjaGFpbl9vdXRib3VuZF9jaGFubmVscxABDHUzMgABTGhybXBfc2VuZGVyX2RlcG9zaXQYARxCYWxhbmNlAAFYaHJtcF9yZWNpcGllbnRfZGVwb3NpdBgBHEJhbGFuY2UAAWRocm1wX2NoYW5uZWxfbWF4X2NhcGFjaXR5EAEMdTMyAAFsaHJtcF9jaGFubmVsX21heF90b3RhbF9zaXplEAEMdTMyAAGMaHJtcF9tYXhfcGFyYWNoYWluX2luYm91bmRfY2hhbm5lbHMQAQx1MzIAAXRocm1wX2NoYW5uZWxfbWF4X21lc3NhZ2Vfc2l6ZRABDHUzMgABPGV4ZWN1dG9yX3BhcmFtc1kEAThFeGVjdXRvclBhcmFtcwABVGNvZGVfcmV0ZW50aW9uX3BlcmlvZBABLEJsb2NrTnVtYmVyAAE4bWF4X3ZhbGlkYXRvcnNhAgEsT3B0aW9uPHUzMj4AAThkaXNwdXRlX3BlcmlvZBABMFNlc3Npb25JbmRleAABpGRpc3B1dGVfcG9zdF9jb25jbHVzaW9uX2FjY2VwdGFuY2VfcGVyaW9kEAEsQmxvY2tOdW1iZXIAATRub19zaG93X3Nsb3RzEAEMdTMyAAFAbl9kZWxheV90cmFuY2hlcxABDHUzMgABaHplcm90aF9kZWxheV90cmFuY2hlX3dpZHRoEAEMdTMyAAFAbmVlZGVkX2FwcHJvdmFscxABDHUzMgABYHJlbGF5X3ZyZl9tb2R1bG9fc2FtcGxlcxABDHUzMgABOHB2Zl92b3RpbmdfdHRsEAEwU2Vzc2lvbkluZGV4AAGAbWluaW11bV92YWxpZGF0aW9uX3VwZ3JhZGVfZGVsYXkQASxCbG9ja051bWJlcgABVG1pbmltdW1fYmFja2luZ192b3RlcxABDHUzMgABNG5vZGVfZmVhdHVyZXORBAEwTm9kZUZlYXR1cmVzAAFYYXBwcm92YWxfdm90aW5nX3BhcmFtc20EAVBBcHByb3ZhbFZvdGluZ1BhcmFtcwABQHNjaGVkdWxlcl9wYXJhbXNxBAFwU2NoZWR1bGVyUGFyYW1zPEJsb2NrTnVtYmVyPgAACQsAAAINCwANCwAABAgQBQsAEQsQbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWluczRjb25maWd1cmF0aW9uGHBhbGxldBRFcnJvcgQEVAABBDxJbnZhbGlkTmV3VmFsdWUAAATcVGhlIG5ldyB2YWx1ZSBmb3IgYSBjb25maWd1cmF0aW9uIHBhcmFtZXRlciBpcyBpbnZhbGlkLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC4VCwAAApkEABkLAAACHQIAHQsMbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucxhzaGFyZWRoQWxsb3dlZFJlbGF5UGFyZW50c1RyYWNrZXIIEEhhc2gBNCxCbG9ja051bWJlcgEQAAgBGGJ1ZmZlciELAVhWZWNEZXF1ZTwoSGFzaCwgSGFzaCk+AAE0bGF0ZXN0X251bWJlchABLEJsb2NrTnVtYmVyAAAhCwAAAiULACULAAAECDQ0ACkLAAACLQsALQsMbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucyRpbmNsdXNpb25wQ2FuZGlkYXRlUGVuZGluZ0F2YWlsYWJpbGl0eQgESAE0BE4BEAAkARBjb3JlcQcBJENvcmVJbmRleAABEGhhc2jtBAE0Q2FuZGlkYXRlSGFzaAABKGRlc2NyaXB0b3KtBAFYQ2FuZGlkYXRlRGVzY3JpcHRvcjxIPgABLGNvbW1pdG1lbnRzvQQBUENhbmRpZGF0ZUNvbW1pdG1lbnRzAAFIYXZhaWxhYmlsaXR5X3ZvdGVzkQQBYEJpdFZlYzx1OCwgQml0T3JkZXJMc2IwPgABHGJhY2tlcnORBAFgQml0VmVjPHU4LCBCaXRPcmRlckxzYjA+AAFMcmVsYXlfcGFyZW50X251bWJlchABBE4AAUBiYWNrZWRfaW5fbnVtYmVyEAEETgABNGJhY2tpbmdfZ3JvdXB1BwEoR3JvdXBJbmRleAAAMQsQbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucyRpbmNsdXNpb24YcGFsbGV0FEVycm9yBARUAAFIZFZhbGlkYXRvckluZGV4T3V0T2ZCb3VuZHMAAAR4VmFsaWRhdG9yIGluZGV4IG91dCBvZiBib3VuZHMuUFVuc2NoZWR1bGVkQ2FuZGlkYXRlAAEErENhbmRpZGF0ZSBzdWJtaXR0ZWQgYnV0IHBhcmEgbm90IHNjaGVkdWxlZC5ASGVhZERhdGFUb29MYXJnZQACBKRIZWFkIGRhdGEgZXhjZWVkcyB0aGUgY29uZmlndXJlZCBtYXhpbXVtLlBQcmVtYXR1cmVDb2RlVXBncmFkZQADBGRDb2RlIHVwZ3JhZGUgcHJlbWF0dXJlbHkuPE5ld0NvZGVUb29MYXJnZQAEBGBPdXRwdXQgY29kZSBpcyB0b28gbGFyZ2VURGlzYWxsb3dlZFJlbGF5UGFyZW50AAUI7FRoZSBjYW5kaWRhdGUncyByZWxheS1wYXJlbnQgd2FzIG5vdCBhbGxvd2VkLiBFaXRoZXIgaXQgd2FzJQFub3QgcmVjZW50IGVub3VnaCBvciBpdCBkaWRuJ3QgYWR2YW5jZSBiYXNlZCBvbiB0aGUgbGFzdCBwYXJhY2hhaW4gYmxvY2suREludmFsaWRBc3NpZ25tZW50AAYIFQFGYWlsZWQgdG8gY29tcHV0ZSBncm91cCBpbmRleCBmb3IgdGhlIGNvcmU6IGVpdGhlciBpdCdzIG91dCBvZiBib3VuZHPob3IgdGhlIHJlbGF5IHBhcmVudCBkb2Vzbid0IGJlbG9uZyB0byB0aGUgY3VycmVudCBzZXNzaW9uLkRJbnZhbGlkR3JvdXBJbmRleAAHBJxJbnZhbGlkIGdyb3VwIGluZGV4IGluIGNvcmUgYXNzaWdubWVudC5MSW5zdWZmaWNpZW50QmFja2luZwAIBJBJbnN1ZmZpY2llbnQgKG5vbi1tYWpvcml0eSkgYmFja2luZy44SW52YWxpZEJhY2tpbmcACQTkSW52YWxpZCAoYmFkIHNpZ25hdHVyZSwgdW5rbm93biB2YWxpZGF0b3IsIGV0Yy4pIGJhY2tpbmcuRE5vdENvbGxhdG9yU2lnbmVkAAoEaENvbGxhdG9yIGRpZCBub3Qgc2lnbiBQb1YuaFZhbGlkYXRpb25EYXRhSGFzaE1pc21hdGNoAAsExFRoZSB2YWxpZGF0aW9uIGRhdGEgaGFzaCBkb2VzIG5vdCBtYXRjaCBleHBlY3RlZC6ASW5jb3JyZWN0RG93bndhcmRNZXNzYWdlSGFuZGxpbmcADATYVGhlIGRvd253YXJkIG1lc3NhZ2UgcXVldWUgaXMgbm90IHByb2Nlc3NlZCBjb3JyZWN0bHkuVEludmFsaWRVcHdhcmRNZXNzYWdlcwANBB0BQXQgbGVhc3Qgb25lIHVwd2FyZCBtZXNzYWdlIHNlbnQgZG9lcyBub3QgcGFzcyB0aGUgYWNjZXB0YW5jZSBjcml0ZXJpYS5gSHJtcFdhdGVybWFya01pc2hhbmRsaW5nAA4EEQFUaGUgY2FuZGlkYXRlIGRpZG4ndCBmb2xsb3cgdGhlIHJ1bGVzIG9mIEhSTVAgd2F0ZXJtYXJrIGFkdmFuY2VtZW50LkxJbnZhbGlkT3V0Ym91bmRIcm1wAA8E1FRoZSBIUk1QIG1lc3NhZ2VzIHNlbnQgYnkgdGhlIGNhbmRpZGF0ZSBpcyBub3QgdmFsaWQuZEludmFsaWRWYWxpZGF0aW9uQ29kZUhhc2gAEATcVGhlIHZhbGlkYXRpb24gY29kZSBoYXNoIG9mIHRoZSBjYW5kaWRhdGUgaXMgbm90IHZhbGlkLkBQYXJhSGVhZE1pc21hdGNoABEIVQFUaGUgYHBhcmFfaGVhZGAgaGFzaCBpbiB0aGUgY2FuZGlkYXRlIGRlc2NyaXB0b3IgZG9lc24ndCBtYXRjaCB0aGUgaGFzaCBvZiB0aGUgYWN0dWFsdHBhcmEgaGVhZCBpbiB0aGUgY29tbWl0bWVudHMuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LjULDExwb2xrYWRvdF9wcmltaXRpdmVzCHY3TFNjcmFwZWRPbkNoYWluVm90ZXMEBEgBNAAMARxzZXNzaW9uEAEwU2Vzc2lvbkluZGV4AAGAYmFja2luZ192YWxpZGF0b3JzX3Blcl9jYW5kaWRhdGU5CwEdAVZlYzwoQ2FuZGlkYXRlUmVjZWlwdDxIPiwgVmVjPChWYWxpZGF0b3JJbmRleCwgVmFsaWRpdHlBdHRlc3RhdGlvbik+KQo+AAEgZGlzcHV0ZXPlBAFgTXVsdGlEaXNwdXRlU3RhdGVtZW50U2V0AAA5CwAAAj0LAD0LAAAECG0HQQsAQQsAAAJFCwBFCwAABAiZBOEEAEkLEGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnM4cGFyYXNfaW5oZXJlbnQYcGFsbGV0FEVycm9yBARUAAEUZFRvb01hbnlJbmNsdXNpb25JbmhlcmVudHMAAATMSW5jbHVzaW9uIGluaGVyZW50IGNhbGxlZCBtb3JlIHRoYW4gb25jZSBwZXIgYmxvY2suTEludmFsaWRQYXJlbnRIZWFkZXIAAQhVAVRoZSBoYXNoIG9mIHRoZSBzdWJtaXR0ZWQgcGFyZW50IGhlYWRlciBkb2Vzbid0IGNvcnJlc3BvbmQgdG8gdGhlIHNhdmVkIGJsb2NrIGhhc2ggb2YsdGhlIHBhcmVudC5ISW5oZXJlbnRPdmVyd2VpZ2h0AAIECQFUaGUgZGF0YSBnaXZlbiB0byB0aGUgaW5oZXJlbnQgd2lsbCByZXN1bHQgaW4gYW4gb3ZlcndlaWdodCBibG9jay6EQ2FuZGlkYXRlc0ZpbHRlcmVkRHVyaW5nRXhlY3V0aW9uAAMITQFBIGNhbmRpZGF0ZSB3YXMgZmlsdGVyZWQgZHVyaW5nIGluaGVyZW50IGV4ZWN1dGlvbi4gVGhpcyBzaG91bGQgaGF2ZSBvbmx5IGJlZW4gZG9uZUBkdXJpbmcgY3JlYXRpb24uUFVuc2NoZWR1bGVkQ2FuZGlkYXRlAAQEdFRvbyBtYW55IGNhbmRpZGF0ZXMgc3VwcGxpZWQuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0Lk0LAAACFQsAUQsAAAJVCwBVCxBscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zJHNjaGVkdWxlchhwYWxsZXQwQ29yZU9jY3VwaWVkBAROARABCBBGcmVlAAAAFFBhcmFzBABZCwE0UGFyYXNFbnRyeTxOPgABAABZCxBscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zJHNjaGVkdWxlchhwYWxsZXQoUGFyYXNFbnRyeQQETgEQAAwBKGFzc2lnbm1lbnRdCwEoQXNzaWdubWVudAABVGF2YWlsYWJpbGl0eV90aW1lb3V0cxABDHUzMgABDHR0bBABBE4AAF0LEGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMkc2NoZWR1bGVyGGNvbW1vbihBc3NpZ25tZW50AAEIEFBvb2wIARxwYXJhX2lkjQIBGFBhcmFJZAABKGNvcmVfaW5kZXhxBwEkQ29yZUluZGV4AAAAEEJ1bGsEAI0CARhQYXJhSWQAAQAAYQsEIEJUcmVlTWFwCARLAXEHBFYBZQsABABpCwAAAGULAAACWQsAaQsAAAJtCwBtCwAABAhxB2ULAHELDGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMUcGFyYXNcUHZmQ2hlY2tBY3RpdmVWb3RlU3RhdGUELEJsb2NrTnVtYmVyARAAFAEwdm90ZXNfYWNjZXB0kQQBYEJpdFZlYzx1OCwgQml0T3JkZXJMc2IwPgABMHZvdGVzX3JlamVjdJEEAWBCaXRWZWM8dTgsIEJpdE9yZGVyTHNiMD4AAQxhZ2UQATBTZXNzaW9uSW5kZXgAAShjcmVhdGVkX2F0EAEsQmxvY2tOdW1iZXIAARhjYXVzZXN1CwF8VmVjPFB2ZkNoZWNrQ2F1c2U8QmxvY2tOdW1iZXI+PgAAdQsAAAJ5CwB5CwxscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zFHBhcmFzNFB2ZkNoZWNrQ2F1c2UELEJsb2NrTnVtYmVyARABCChPbmJvYXJkaW5nBACNAgEYUGFyYUlkAAAAHFVwZ3JhZGUMAQhpZI0CARhQYXJhSWQAASxpbmNsdWRlZF9hdBABLEJsb2NrTnVtYmVyAAFAdXBncmFkZV9zdHJhdGVneX0LATxVcGdyYWRlU3RyYXRlZ3kAAQAAfQsMbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucxRwYXJhczxVcGdyYWRlU3RyYXRlZ3kAAQhAU2V0R29BaGVhZFNpZ25hbAAAAFBBcHBseUF0RXhwZWN0ZWRCbG9jawABAACBCwAAArkEAIULAAACjQIAiQsMbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucxRwYXJhczRQYXJhTGlmZWN5Y2xlAAEcKE9uYm9hcmRpbmcAAAAoUGFyYXRocmVhZAABACRQYXJhY2hhaW4AAgBMVXBncmFkaW5nUGFyYXRocmVhZAADAFBEb3duZ3JhZGluZ1BhcmFjaGFpbgAEAFRPZmZib2FyZGluZ1BhcmF0aHJlYWQABQBQT2ZmYm9hcmRpbmdQYXJhY2hhaW4ABgAAjQsAAAQIjQIQAJELDGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMUcGFyYXNAUGFyYVBhc3RDb2RlTWV0YQQETgEQAAgBNHVwZ3JhZGVfdGltZXOVCwFgVmVjPFJlcGxhY2VtZW50VGltZXM8Tj4+AAEsbGFzdF9wcnVuZWRhAgEkT3B0aW9uPE4+AACVCwAAApkLAJkLDGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMUcGFyYXNAUmVwbGFjZW1lbnRUaW1lcwQETgEQAAgBLGV4cGVjdGVkX2F0EAEETgABMGFjdGl2YXRlZF9hdBABBE4AAJ0LAAACjQsAoQsMTHBvbGthZG90X3ByaW1pdGl2ZXMIdjc4VXBncmFkZUdvQWhlYWQAAQgUQWJvcnQAAAAcR29BaGVhZAABAAClCwxMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2N0hVcGdyYWRlUmVzdHJpY3Rpb24AAQQcUHJlc2VudAAAAACpCwxscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zFHBhcmFzPFBhcmFHZW5lc2lzQXJncwAADAEwZ2VuZXNpc19oZWFk2QQBIEhlYWREYXRhAAE8dmFsaWRhdGlvbl9jb2Rl1QQBOFZhbGlkYXRpb25Db2RlAAEkcGFyYV9raW5kIAEgUGFyYUtpbmQAAK0LEGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMUcGFyYXMYcGFsbGV0FEVycm9yBARUAAE0NE5vdFJlZ2lzdGVyZWQAAASUUGFyYSBpcyBub3QgcmVnaXN0ZXJlZCBpbiBvdXIgc3lzdGVtLjRDYW5ub3RPbmJvYXJkAAEEFQFQYXJhIGNhbm5vdCBiZSBvbmJvYXJkZWQgYmVjYXVzZSBpdCBpcyBhbHJlYWR5IHRyYWNrZWQgYnkgb3VyIHN5c3RlbS44Q2Fubm90T2ZmYm9hcmQAAgScUGFyYSBjYW5ub3QgYmUgb2ZmYm9hcmRlZCBhdCB0aGlzIHRpbWUuNENhbm5vdFVwZ3JhZGUAAwTUUGFyYSBjYW5ub3QgYmUgdXBncmFkZWQgdG8gYSBsZWFzZSBob2xkaW5nIHBhcmFjaGFpbi48Q2Fubm90RG93bmdyYWRlAAQE0FBhcmEgY2Fubm90IGJlIGRvd25ncmFkZWQgdG8gYW4gb24tZGVtYW5kIHBhcmFjaGFpbi5YUHZmQ2hlY2tTdGF0ZW1lbnRTdGFsZQAFBLBUaGUgc3RhdGVtZW50IGZvciBQVkYgcHJlLWNoZWNraW5nIGlzIHN0YWxlLlxQdmZDaGVja1N0YXRlbWVudEZ1dHVyZQAGBOxUaGUgc3RhdGVtZW50IGZvciBQVkYgcHJlLWNoZWNraW5nIGlzIGZvciBhIGZ1dHVyZSBzZXNzaW9uLoRQdmZDaGVja1ZhbGlkYXRvckluZGV4T3V0T2ZCb3VuZHMABwSkQ2xhaW1lZCB2YWxpZGF0b3IgaW5kZXggaXMgb3V0IG9mIGJvdW5kcy5gUHZmQ2hlY2tJbnZhbGlkU2lnbmF0dXJlAAgEyFRoZSBzaWduYXR1cmUgZm9yIHRoZSBQVkYgcHJlLWNoZWNraW5nIGlzIGludmFsaWQuSFB2ZkNoZWNrRG91YmxlVm90ZQAJBLBUaGUgZ2l2ZW4gdmFsaWRhdG9yIGFscmVhZHkgaGFzIGNhc3QgYSB2b3RlLlhQdmZDaGVja1N1YmplY3RJbnZhbGlkAAoE9FRoZSBnaXZlbiBQVkYgZG9lcyBub3QgZXhpc3QgYXQgdGhlIG1vbWVudCBvZiBwcm9jZXNzIGEgdm90ZS5EQ2Fubm90VXBncmFkZUNvZGUACwTMUGFyYWNoYWluIGNhbm5vdCBjdXJyZW50bHkgc2NoZWR1bGUgYSBjb2RlIHVwZ3JhZGUuLEludmFsaWRDb2RlAAwEdEludmFsaWQgdmFsaWRhdGlvbiBjb2RlIHNpemUuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LrELAAACtQsAtQsMbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucyxpbml0aWFsaXplclRCdWZmZXJlZFNlc3Npb25DaGFuZ2UAAAwBKHZhbGlkYXRvcnMZCwFAVmVjPFZhbGlkYXRvcklkPgABGHF1ZXVlZBkLAUBWZWM8VmFsaWRhdG9ySWQ+AAE0c2Vzc2lvbl9pbmRleBABMFNlc3Npb25JbmRleAAAuQsAAAK9CwC9CwhgcG9sa2Fkb3RfY29yZV9wcmltaXRpdmVzWEluYm91bmREb3dud2FyZE1lc3NhZ2UELEJsb2NrTnVtYmVyARAACAEcc2VudF9hdBABLEJsb2NrTnVtYmVyAAEMbXNnOAE8RG93bndhcmRNZXNzYWdlAADBCwxscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zEGhybXBYSHJtcE9wZW5DaGFubmVsUmVxdWVzdAAAGAEkY29uZmlybWVkIAEQYm9vbAABEF9hZ2UQATBTZXNzaW9uSW5kZXgAAThzZW5kZXJfZGVwb3NpdBgBHEJhbGFuY2UAAUBtYXhfbWVzc2FnZV9zaXplEAEMdTMyAAEwbWF4X2NhcGFjaXR5EAEMdTMyAAE4bWF4X3RvdGFsX3NpemUQAQx1MzIAAMULAAACGQUAyQsMbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucxBocm1wLEhybXBDaGFubmVsAAAgATBtYXhfY2FwYWNpdHkQAQx1MzIAAThtYXhfdG90YWxfc2l6ZRABDHUzMgABQG1heF9tZXNzYWdlX3NpemUQAQx1MzIAASRtc2dfY291bnQQAQx1MzIAASh0b3RhbF9zaXplEAEMdTMyAAEgbXFjX2hlYWSdAgEwT3B0aW9uPEhhc2g+AAE4c2VuZGVyX2RlcG9zaXQYARxCYWxhbmNlAAFEcmVjaXBpZW50X2RlcG9zaXQYARxCYWxhbmNlAADNCwAAAtELANELCGBwb2xrYWRvdF9jb3JlX3ByaW1pdGl2ZXNISW5ib3VuZEhybXBNZXNzYWdlBCxCbG9ja051bWJlcgEQAAgBHHNlbnRfYXQQASxCbG9ja051bWJlcgABEGRhdGE4AVBzcF9zdGQ6OnZlYzo6VmVjPHU4PgAA1QsAAALZCwDZCwAABAgQhQsA3QsQbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucxBocm1wGHBhbGxldBRFcnJvcgQEVAABUFRPcGVuSHJtcENoYW5uZWxUb1NlbGYAAATEVGhlIHNlbmRlciB0cmllZCB0byBvcGVuIGEgY2hhbm5lbCB0byB0aGVtc2VsdmVzLnxPcGVuSHJtcENoYW5uZWxJbnZhbGlkUmVjaXBpZW50AAEEiFRoZSByZWNpcGllbnQgaXMgbm90IGEgdmFsaWQgcGFyYS5sT3BlbkhybXBDaGFubmVsWmVyb0NhcGFjaXR5AAIEfFRoZSByZXF1ZXN0ZWQgY2FwYWNpdHkgaXMgemVyby6MT3BlbkhybXBDaGFubmVsQ2FwYWNpdHlFeGNlZWRzTGltaXQAAwTAVGhlIHJlcXVlc3RlZCBjYXBhY2l0eSBleGNlZWRzIHRoZSBnbG9iYWwgbGltaXQueE9wZW5Icm1wQ2hhbm5lbFplcm9NZXNzYWdlU2l6ZQAEBKBUaGUgcmVxdWVzdGVkIG1heGltdW0gbWVzc2FnZSBzaXplIGlzIDAumE9wZW5Icm1wQ2hhbm5lbE1lc3NhZ2VTaXplRXhjZWVkc0xpbWl0AAUEKQFUaGUgb3BlbiByZXF1ZXN0IHJlcXVlc3RlZCB0aGUgbWVzc2FnZSBzaXplIHRoYXQgZXhjZWVkcyB0aGUgZ2xvYmFsIGxpbWl0LnBPcGVuSHJtcENoYW5uZWxBbHJlYWR5RXhpc3RzAAYEaFRoZSBjaGFubmVsIGFscmVhZHkgZXhpc3RzfE9wZW5Icm1wQ2hhbm5lbEFscmVhZHlSZXF1ZXN0ZWQABwTQVGhlcmUgaXMgYWxyZWFkeSBhIHJlcXVlc3QgdG8gb3BlbiB0aGUgc2FtZSBjaGFubmVsLnBPcGVuSHJtcENoYW5uZWxMaW1pdEV4Y2VlZGVkAAgEHQFUaGUgc2VuZGVyIGFscmVhZHkgaGFzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBhbGxvd2VkIG91dGJvdW5kIGNoYW5uZWxzLnBBY2NlcHRIcm1wQ2hhbm5lbERvZXNudEV4aXN0AAkE4FRoZSBjaGFubmVsIGZyb20gdGhlIHNlbmRlciB0byB0aGUgb3JpZ2luIGRvZXNuJ3QgZXhpc3QuhEFjY2VwdEhybXBDaGFubmVsQWxyZWFkeUNvbmZpcm1lZAAKBIRUaGUgY2hhbm5lbCBpcyBhbHJlYWR5IGNvbmZpcm1lZC54QWNjZXB0SHJtcENoYW5uZWxMaW1pdEV4Y2VlZGVkAAsEJQFUaGUgcmVjaXBpZW50IGFscmVhZHkgaGFzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBhbGxvd2VkIGluYm91bmQgY2hhbm5lbHMucENsb3NlSHJtcENoYW5uZWxVbmF1dGhvcml6ZWQADARVAVRoZSBvcmlnaW4gdHJpZXMgdG8gY2xvc2UgYSBjaGFubmVsIHdoZXJlIGl0IGlzIG5laXRoZXIgdGhlIHNlbmRlciBub3IgdGhlIHJlY2lwaWVudC5sQ2xvc2VIcm1wQ2hhbm5lbERvZXNudEV4aXN0AA0EnFRoZSBjaGFubmVsIHRvIGJlIGNsb3NlZCBkb2Vzbid0IGV4aXN0LnxDbG9zZUhybXBDaGFubmVsQWxyZWFkeVVuZGVyd2F5AA4EvFRoZSBjaGFubmVsIGNsb3NlIHJlcXVlc3QgaXMgYWxyZWFkeSByZXF1ZXN0ZWQuhENhbmNlbEhybXBPcGVuQ2hhbm5lbFVuYXV0aG9yaXplZAAPBF0BQ2FuY2VsaW5nIGlzIHJlcXVlc3RlZCBieSBuZWl0aGVyIHRoZSBzZW5kZXIgbm9yIHJlY2lwaWVudCBvZiB0aGUgb3BlbiBjaGFubmVsIHJlcXVlc3QuaE9wZW5Icm1wQ2hhbm5lbERvZXNudEV4aXN0ABAEfFRoZSBvcGVuIHJlcXVlc3QgZG9lc24ndCBleGlzdC58T3BlbkhybXBDaGFubmVsQWxyZWFkeUNvbmZpcm1lZAARBC0BQ2Fubm90IGNhbmNlbCBhbiBIUk1QIG9wZW4gY2hhbm5lbCByZXF1ZXN0IGJlY2F1c2UgaXQgaXMgYWxyZWFkeSBjb25maXJtZWQuMFdyb25nV2l0bmVzcwASBIxUaGUgcHJvdmlkZWQgd2l0bmVzcyBkYXRhIGlzIHdyb25nLnBDaGFubmVsQ3JlYXRpb25Ob3RBdXRob3JpemVkABME6FRoZSBjaGFubmVsIGJldHdlZW4gdGhlc2UgdHdvIGNoYWlucyBjYW5ub3QgYmUgYXV0aG9yaXplZC4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQu4QsAAAIhAgDlCwxMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2NyxTZXNzaW9uSW5mbwAANAFgYWN0aXZlX3ZhbGlkYXRvcl9pbmRpY2VzFQsBTFZlYzxWYWxpZGF0b3JJbmRleD4AASxyYW5kb21fc2VlZAQBIFt1ODsgMzJdAAE4ZGlzcHV0ZV9wZXJpb2QQATBTZXNzaW9uSW5kZXgAASh2YWxpZGF0b3Jz6QsBnEluZGV4ZWRWZWM8VmFsaWRhdG9ySW5kZXgsIFZhbGlkYXRvcklkPgABOGRpc2NvdmVyeV9rZXlzaQkBZFZlYzxBdXRob3JpdHlEaXNjb3ZlcnlJZD4AATxhc3NpZ25tZW50X2tleXPhCwFEVmVjPEFzc2lnbm1lbnRJZD4AAUB2YWxpZGF0b3JfZ3JvdXBz7QsBrEluZGV4ZWRWZWM8R3JvdXBJbmRleCwgVmVjPFZhbGlkYXRvckluZGV4Pj4AARxuX2NvcmVzEAEMdTMyAAFoemVyb3RoX2RlbGF5X3RyYW5jaGVfd2lkdGgQAQx1MzIAAWByZWxheV92cmZfbW9kdWxvX3NhbXBsZXMQAQx1MzIAAUBuX2RlbGF5X3RyYW5jaGVzEAEMdTMyAAE0bm9fc2hvd19zbG90cxABDHUzMgABQG5lZWRlZF9hcHByb3ZhbHMQAQx1MzIAAOkLDExwb2xrYWRvdF9wcmltaXRpdmVzCHY3KEluZGV4ZWRWZWMIBEsBmQQEVgEdAgAEABkLARhWZWM8Vj4AAO0LDExwb2xrYWRvdF9wcmltaXRpdmVzCHY3KEluZGV4ZWRWZWMIBEsBdQcEVgEVCwAEAE0LARhWZWM8Vj4AAPELAAAECBDtBAD1CwxMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2NzBEaXNwdXRlU3RhdGUEBE4BEAAQATh2YWxpZGF0b3JzX2ZvcpEEAXxCaXRWZWM8dTgsIGJpdHZlYzo6b3JkZXI6OkxzYjA+AAFIdmFsaWRhdG9yc19hZ2FpbnN0kQQBfEJpdFZlYzx1OCwgYml0dmVjOjpvcmRlcjo6THNiMD4AARRzdGFydBABBE4AATBjb25jbHVkZWRfYXRhAgEkT3B0aW9uPE4+AAD5CwQgQlRyZWVTZXQEBFQBmQQABAAVCwAAAP0LEGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMgZGlzcHV0ZXMYcGFsbGV0FEVycm9yBARUAAEkdER1cGxpY2F0ZURpc3B1dGVTdGF0ZW1lbnRTZXRzAAAEqER1cGxpY2F0ZSBkaXNwdXRlIHN0YXRlbWVudCBzZXRzIHByb3ZpZGVkLlxBbmNpZW50RGlzcHV0ZVN0YXRlbWVudAABBIxBbmNpZW50IGRpc3B1dGUgc3RhdGVtZW50IHByb3ZpZGVkLmRWYWxpZGF0b3JJbmRleE91dE9mQm91bmRzAAIE6FZhbGlkYXRvciBpbmRleCBvbiBzdGF0ZW1lbnQgaXMgb3V0IG9mIGJvdW5kcyBmb3Igc2Vzc2lvbi5ASW52YWxpZFNpZ25hdHVyZQADBHxJbnZhbGlkIHNpZ25hdHVyZSBvbiBzdGF0ZW1lbnQuSER1cGxpY2F0ZVN0YXRlbWVudAAEBMxWYWxpZGF0b3Igdm90ZSBzdWJtaXR0ZWQgbW9yZSB0aGFuIG9uY2UgdG8gZGlzcHV0ZS5IU2luZ2xlU2lkZWREaXNwdXRlAAUExEEgZGlzcHV0ZSB3aGVyZSB0aGVyZSBhcmUgb25seSB2b3RlcyBvbiBvbmUgc2lkZS48TWFsaWNpb3VzQmFja2VyAAYEnEEgZGlzcHV0ZSB2b3RlIGZyb20gYSBtYWxpY2lvdXMgYmFja2VyLkxNaXNzaW5nQmFja2luZ1ZvdGVzAAcE4E5vIGJhY2tpbmcgdm90ZXMgd2VyZSBwcm92aWRlcyBhbG9uZyBkaXNwdXRlIHN0YXRlbWVudHMuSFVuY29uZmlybWVkRGlzcHV0ZQAIBLBVbmNvbmZpcm1lZCBkaXNwdXRlIHN0YXRlbWVudCBzZXRzIHByb3ZpZGVkLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC4BDBBMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2NyBzbGFzaGluZzhQZW5kaW5nU2xhc2hlcwAACAEQa2V5cwUMAZRCVHJlZU1hcDxWYWxpZGF0b3JJbmRleCwgVmFsaWRhdG9ySWQ+AAEQa2luZC0FAUxTbGFzaGluZ09mZmVuY2VLaW5kAAAFDAQgQlRyZWVNYXAIBEsBmQQEVgEdAgAEAAkMAAAACQwAAAINDAANDAAABAiZBB0CABEMFGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMgZGlzcHV0ZXMgc2xhc2hpbmcYcGFsbGV0FEVycm9yBARUAAEYYEludmFsaWRLZXlPd25lcnNoaXBQcm9vZgAABIxUaGUga2V5IG93bmVyc2hpcCBwcm9vZiBpcyBpbnZhbGlkLkxJbnZhbGlkU2Vzc2lvbkluZGV4AAEEoFRoZSBzZXNzaW9uIGluZGV4IGlzIHRvbyBvbGQgb3IgaW52YWxpZC5QSW52YWxpZENhbmRpZGF0ZUhhc2gAAgR4VGhlIGNhbmRpZGF0ZSBoYXNoIGlzIGludmFsaWQuVEludmFsaWRWYWxpZGF0b3JJbmRleAADCAEBVGhlcmUgaXMgbm8gcGVuZGluZyBzbGFzaCBmb3IgdGhlIGdpdmVuIHZhbGlkYXRvciBpbmRleCBhbmQgdGltZRRzbG90LmBWYWxpZGF0b3JJbmRleElkTWlzbWF0Y2gABATQVGhlIHZhbGlkYXRvciBpbmRleCBkb2VzIG5vdCBtYXRjaCB0aGUgdmFsaWRhdG9yIGlkLlxEdXBsaWNhdGVTbGFzaGluZ1JlcG9ydAAFBA0BVGhlIGdpdmVuIHNsYXNoaW5nIHJlcG9ydCBpcyB2YWxpZCBidXQgYWxyZWFkeSBwcmV2aW91c2x5IHJlcG9ydGVkLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC4VDBBscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zSGFzc2lnbmVyX29uX2RlbWFuZBR0eXBlc0RDb3JlQWZmaW5pdHlDb3VudAAACAEoY29yZV9pbmRleHEHASRDb3JlSW5kZXgAARRjb3VudBABDHUzMgAAGQwQbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWluc0hhc3NpZ25lcl9vbl9kZW1hbmQUdHlwZXM8UXVldWVTdGF0dXNUeXBlAAAQARx0cmFmZmlj0QYBJEZpeGVkVTEyOAABKG5leHRfaW5kZXgdDAEoUXVldWVJbmRleAABOHNtYWxsZXN0X2luZGV4HQwBKFF1ZXVlSW5kZXgAATRmcmVlZF9pbmRpY2VzIQwBdEJpbmFyeUhlYXA8UmV2ZXJzZVF1ZXVlSW5kZXg+AAAdDBBscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zSGFzc2lnbmVyX29uX2RlbWFuZBR0eXBlcyhRdWV1ZUluZGV4AAAEABABDHUzMgAAIQwEKEJpbmFyeUhlYXAEBFQBJQwABAApDAAAACUMEGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnNIYXNzaWduZXJfb25fZGVtYW5kFHR5cGVzRFJldmVyc2VRdWV1ZUluZGV4AAAEABABDHUzMgAAKQwAAAIlDAAtDAQoQmluYXJ5SGVhcAQEVAExDAAEADUMAAAAMQwQbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWluc0hhc3NpZ25lcl9vbl9kZW1hbmQUdHlwZXM0RW5xdWV1ZWRPcmRlcgAACAEccGFyYV9pZI0CARhQYXJhSWQAAQxpZHgdDAEoUXVldWVJbmRleAAANQwAAAIxDAA5DAxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUARgEUwAABAA9DAEYVmVjPFQ+AAA9DAAAAhgAQQwQbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWluc0hhc3NpZ25lcl9vbl9kZW1hbmQYcGFsbGV0FEVycm9yBARUAAEIJFF1ZXVlRnVsbAAABORUaGUgb3JkZXIgcXVldWUgaXMgZnVsbCwgYHBsYWNlX29yZGVyYCB3aWxsIG5vdCBjb250aW51ZS5wU3BvdFByaWNlSGlnaGVyVGhhbk1heEFtb3VudAABCE0BVGhlIGN1cnJlbnQgc3BvdCBwcmljZSBpcyBoaWdoZXIgdGhhbiB0aGUgbWF4IGFtb3VudCBzcGVjaWZpZWQgaW4gdGhlIGBwbGFjZV9vcmRlcmBgY2FsbCwgbWFraW5nIGl0IGludmFsaWQuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LkUMAAAECBBxBwBJDAxscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zRGFzc2lnbmVyX2NvcmV0aW1lIFNjaGVkdWxlBAROARAADAEsYXNzaWdubWVudHNdBQGMVmVjPChDb3JlQXNzaWdubWVudCwgUGFydHNPZjU3NjAwKT4AASBlbmRfaGludGECASRPcHRpb248Tj4AATRuZXh0X3NjaGVkdWxlYQIBJE9wdGlvbjxOPgAATQwMbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWluc0Rhc3NpZ25lcl9jb3JldGltZThDb3JlRGVzY3JpcHRvcgQETgEQAAgBFHF1ZXVlUQwBaE9wdGlvbjxRdWV1ZURlc2NyaXB0b3I8Tj4+AAEwY3VycmVudF93b3JrWQwBUE9wdGlvbjxXb3JrU3RhdGU8Tj4+AABRDAQYT3B0aW9uBARUAVUMAQgQTm9uZQAAABBTb21lBABVDAAAAQAAVQwMbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWluc0Rhc3NpZ25lcl9jb3JldGltZTxRdWV1ZURlc2NyaXB0b3IEBE4BEAAIARRmaXJzdBABBE4AARBsYXN0EAEETgAAWQwEGE9wdGlvbgQEVAFdDAEIEE5vbmUAAAAQU29tZQQAXQwAAAEAAF0MDGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnNEYXNzaWduZXJfY29yZXRpbWUkV29ya1N0YXRlBAROARAAEAEsYXNzaWdubWVudHNhDAGYVmVjPChDb3JlQXNzaWdubWVudCwgQXNzaWdubWVudFN0YXRlKT4AASBlbmRfaGludGECASRPcHRpb248Tj4AAQxwb3NtAQEMdTE2AAEQc3RlcGkFATBQYXJ0c09mNTc2MDAAAGEMAAACZQwAZQwAAAQIZQVpDABpDAxscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zRGFzc2lnbmVyX2NvcmV0aW1lPEFzc2lnbm1lbnRTdGF0ZQAACAEUcmF0aW9pBQEwUGFydHNPZjU3NjAwAAEkcmVtYWluaW5naQUBMFBhcnRzT2Y1NzYwMAAAbQwQbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWluc0Rhc3NpZ25lcl9jb3JldGltZRhwYWxsZXQURXJyb3IEBFQAARhAQXNzaWdubWVudHNFbXB0eQAAADRPdmVyU2NoZWR1bGVkAAEEkEFzc2lnbm1lbnRzIHRvZ2V0aGVyIGV4Y2VlZGVkIDU3NjAwLjhVbmRlclNjaGVkdWxlZAACBJBBc3NpZ25tZW50cyB0b2dldGhlciBsZXNzIHRoYW4gNTc2MDBARGlzYWxsb3dlZEluc2VydAADCFEBYXNzaWduX2NvcmUgaXMgb25seSBhbGxvd2VkIHRvIGFwcGVuZCBuZXcgYXNzaWdubWVudHMgYXQgdGhlIGVuZCBvZiBhbHJlYWR5IGV4aXN0aW5nFG9uZXMuPER1cGxpY2F0ZUluc2VydAAEBFUBVHJpZWQgdG8gaW5zZXJ0IGEgc2NoZWR1bGUgZm9yIHRoZSBzYW1lIGNvcmUgYW5kIGJsb2NrIG51bWJlciBhcyBhbiBleGlzdGluZyBzY2hlZHVsZVBBc3NpZ25tZW50c05vdFNvcnRlZAAFBKxUcmllZCB0byBhZGQgYW4gdW5zb3J0ZWQgc2V0IG9mIGFzc2lnbm1lbnRzBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LnEMDFxwb2xrYWRvdF9ydW50aW1lX2NvbW1vbjxwYXJhc19yZWdpc3RyYXIgUGFyYUluZm8IHEFjY291bnQBABxCYWxhbmNlARgADAEcbWFuYWdlcgABHEFjY291bnQAARxkZXBvc2l0GAEcQmFsYW5jZQABGGxvY2tlZM0CATBPcHRpb248Ym9vbD4AAHUMEFxwb2xrYWRvdF9ydW50aW1lX2NvbW1vbjxwYXJhc19yZWdpc3RyYXIYcGFsbGV0FEVycm9yBARUAAE4NE5vdFJlZ2lzdGVyZWQAAARkVGhlIElEIGlzIG5vdCByZWdpc3RlcmVkLkRBbHJlYWR5UmVnaXN0ZXJlZAABBHRUaGUgSUQgaXMgYWxyZWFkeSByZWdpc3RlcmVkLiBOb3RPd25lcgACBJxUaGUgY2FsbGVyIGlzIG5vdCB0aGUgb3duZXIgb2YgdGhpcyBJZC4wQ29kZVRvb0xhcmdlAAMEXEludmFsaWQgcGFyYSBjb2RlIHNpemUuQEhlYWREYXRhVG9vTGFyZ2UABARwSW52YWxpZCBwYXJhIGhlYWQgZGF0YSBzaXplLjBOb3RQYXJhY2hhaW4ABQRgUGFyYSBpcyBub3QgYSBQYXJhY2hhaW4uNE5vdFBhcmF0aHJlYWQABgS8UGFyYSBpcyBub3QgYSBQYXJhdGhyZWFkIChvbi1kZW1hbmQgcGFyYWNoYWluKS5AQ2Fubm90RGVyZWdpc3RlcgAHBFhDYW5ub3QgZGVyZWdpc3RlciBwYXJhPENhbm5vdERvd25ncmFkZQAIBC0BQ2Fubm90IHNjaGVkdWxlIGRvd25ncmFkZSBvZiBsZWFzZSBob2xkaW5nIHBhcmFjaGFpbiB0byBvbi1kZW1hbmQgcGFyYWNoYWluNENhbm5vdFVwZ3JhZGUACQQlAUNhbm5vdCBzY2hlZHVsZSB1cGdyYWRlIG9mIG9uLWRlbWFuZCBwYXJhY2hhaW4gdG8gbGVhc2UgaG9sZGluZyBwYXJhY2hhaW4oUGFyYUxvY2tlZAAKCEkBUGFyYSBpcyBsb2NrZWQgZnJvbSBtYW5pcHVsYXRpb24gYnkgdGhlIG1hbmFnZXIuIE11c3QgdXNlIHBhcmFjaGFpbiBvciByZWxheSBjaGFpbixnb3Zlcm5hbmNlLixOb3RSZXNlcnZlZAALBNBUaGUgSUQgZ2l2ZW4gZm9yIHJlZ2lzdHJhdGlvbiBoYXMgbm90IGJlZW4gcmVzZXJ2ZWQuLEludmFsaWRDb2RlAAwEfFRoZSB2YWxpZGF0aW9uIGNvZGUgaXMgaW52YWxpZC4oQ2Fubm90U3dhcAANCFEBQ2Fubm90IHBlcmZvcm0gYSBwYXJhY2hhaW4gc2xvdCAvIGxpZmVjeWNsZSBzd2FwLiBDaGVjayB0aGF0IHRoZSBzdGF0ZSBvZiBib3RoIHBhcmFzhGFyZSBjb3JyZWN0IGZvciB0aGUgc3dhcCB0byB3b3JrLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC55DAAAAiEIAH0MEFxwb2xrYWRvdF9ydW50aW1lX2NvbW1vbhRzbG90cxhwYWxsZXQURXJyb3IEBFQAAQhEUGFyYU5vdE9uYm9hcmRpbmcAAASMVGhlIHBhcmFjaGFpbiBJRCBpcyBub3Qgb25ib2FyZGluZy4oTGVhc2VFcnJvcgABBIhUaGVyZSB3YXMgYW4gZXJyb3Igd2l0aCB0aGUgbGVhc2UuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LoEMAAAECACNAgCFDAAAAyQAAACJDACJDAQYT3B0aW9uBARUAY0MAQgQTm9uZQAAABBTb21lBACNDAAAAQAAjQwAAAQMAI0CGACRDBBccG9sa2Fkb3RfcnVudGltZV9jb21tb24gYXVjdGlvbnMYcGFsbGV0FEVycm9yBARUAAEcREF1Y3Rpb25JblByb2dyZXNzAAAEkFRoaXMgYXVjdGlvbiBpcyBhbHJlYWR5IGluIHByb2dyZXNzLkRMZWFzZVBlcmlvZEluUGFzdAABBIBUaGUgbGVhc2UgcGVyaW9kIGlzIGluIHRoZSBwYXN0LkRQYXJhTm90UmVnaXN0ZXJlZAACBFhQYXJhIGlzIG5vdCByZWdpc3RlcmVkRE5vdEN1cnJlbnRBdWN0aW9uAAMEWE5vdCBhIGN1cnJlbnQgYXVjdGlvbi4oTm90QXVjdGlvbgAEBDxOb3QgYW4gYXVjdGlvbi4wQXVjdGlvbkVuZGVkAAUEaEF1Y3Rpb24gaGFzIGFscmVhZHkgZW5kZWQuQEFscmVhZHlMZWFzZWRPdXQABgTYVGhlIHBhcmEgaXMgYWxyZWFkeSBsZWFzZWQgb3V0IGZvciBwYXJ0IG9mIHRoaXMgcmFuZ2UuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LpUMDFxwb2xrYWRvdF9ydW50aW1lX2NvbW1vbiRjcm93ZGxvYW4gRnVuZEluZm8QJEFjY291bnRJZAEAHEJhbGFuY2UBGCxCbG9ja051bWJlcgEQLExlYXNlUGVyaW9kARAAKAEkZGVwb3NpdG9yAAEkQWNjb3VudElkAAEgdmVyaWZpZXJJBQFMT3B0aW9uPE11bHRpU2lnbmVyPgABHGRlcG9zaXQYARxCYWxhbmNlAAEYcmFpc2VkGAEcQmFsYW5jZQABDGVuZBABLEJsb2NrTnVtYmVyAAEMY2FwGAEcQmFsYW5jZQABRGxhc3RfY29udHJpYnV0aW9umQwBdExhc3RDb250cmlidXRpb248QmxvY2tOdW1iZXI+AAEwZmlyc3RfcGVyaW9kEAEsTGVhc2VQZXJpb2QAASxsYXN0X3BlcmlvZBABLExlYXNlUGVyaW9kAAEoZnVuZF9pbmRleBABJEZ1bmRJbmRleAAAmQwMXHBvbGthZG90X3J1bnRpbWVfY29tbW9uJGNyb3dkbG9hbkBMYXN0Q29udHJpYnV0aW9uBCxCbG9ja051bWJlcgEQAQwUTmV2ZXIAAAAkUHJlRW5kaW5nBAAQAQx1MzIAAQAYRW5kaW5nBAAQASxCbG9ja051bWJlcgACAACdDBBccG9sa2Fkb3RfcnVudGltZV9jb21tb24kY3Jvd2Rsb2FuGHBhbGxldBRFcnJvcgQEVAABXERGaXJzdFBlcmlvZEluUGFzdAAABPRUaGUgY3VycmVudCBsZWFzZSBwZXJpb2QgaXMgbW9yZSB0aGFuIHRoZSBmaXJzdCBsZWFzZSBwZXJpb2QuZEZpcnN0UGVyaW9kVG9vRmFySW5GdXR1cmUAAQQRAVRoZSBmaXJzdCBsZWFzZSBwZXJpb2QgbmVlZHMgdG8gYXQgbGVhc3QgYmUgbGVzcyB0aGFuIDMgYG1heF92YWx1ZWAubExhc3RQZXJpb2RCZWZvcmVGaXJzdFBlcmlvZAACBOhMYXN0IGxlYXNlIHBlcmlvZCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBmaXJzdCBsZWFzZSBwZXJpb2QuYExhc3RQZXJpb2RUb29GYXJJbkZ1dHVyZQADBC0BVGhlIGxhc3QgbGVhc2UgcGVyaW9kIGNhbm5vdCBiZSBtb3JlIHRoYW4gMyBwZXJpb2RzIGFmdGVyIHRoZSBmaXJzdCBwZXJpb2QuPENhbm5vdEVuZEluUGFzdAAEBEUBVGhlIGNhbXBhaWduIGVuZHMgYmVmb3JlIHRoZSBjdXJyZW50IGJsb2NrIG51bWJlci4gVGhlIGVuZCBtdXN0IGJlIGluIHRoZSBmdXR1cmUuREVuZFRvb0ZhckluRnV0dXJlAAUEwFRoZSBlbmQgZGF0ZSBmb3IgdGhpcyBjcm93ZGxvYW4gaXMgbm90IHNlbnNpYmxlLiBPdmVyZmxvdwAGBFhUaGVyZSB3YXMgYW4gb3ZlcmZsb3cuUENvbnRyaWJ1dGlvblRvb1NtYWxsAAcE6FRoZSBjb250cmlidXRpb24gd2FzIGJlbG93IHRoZSBtaW5pbXVtLCBgTWluQ29udHJpYnV0aW9uYC40SW52YWxpZFBhcmFJZAAIBExJbnZhbGlkIGZ1bmQgaW5kZXguLENhcEV4Y2VlZGVkAAkEkENvbnRyaWJ1dGlvbnMgZXhjZWVkIG1heGltdW0gYW1vdW50LlhDb250cmlidXRpb25QZXJpb2RPdmVyAAoEqFRoZSBjb250cmlidXRpb24gcGVyaW9kIGhhcyBhbHJlYWR5IGVuZGVkLjRJbnZhbGlkT3JpZ2luAAsEjFRoZSBvcmlnaW4gb2YgdGhpcyBjYWxsIGlzIGludmFsaWQuME5vdFBhcmFjaGFpbgAMBMhUaGlzIGNyb3dkbG9hbiBkb2VzIG5vdCBjb3JyZXNwb25kIHRvIGEgcGFyYWNoYWluLixMZWFzZUFjdGl2ZQANBBUBVGhpcyBwYXJhY2hhaW4gbGVhc2UgaXMgc3RpbGwgYWN0aXZlIGFuZCByZXRpcmVtZW50IGNhbm5vdCB5ZXQgYmVnaW4uQEJpZE9yTGVhc2VBY3RpdmUADgQxAVRoaXMgcGFyYWNoYWluJ3MgYmlkIG9yIGxlYXNlIGlzIHN0aWxsIGFjdGl2ZSBhbmQgd2l0aGRyYXcgY2Fubm90IHlldCBiZWdpbi4wRnVuZE5vdEVuZGVkAA8EgFRoZSBjcm93ZGxvYW4gaGFzIG5vdCB5ZXQgZW5kZWQuPE5vQ29udHJpYnV0aW9ucwAQBNBUaGVyZSBhcmUgbm8gY29udHJpYnV0aW9ucyBzdG9yZWQgaW4gdGhpcyBjcm93ZGxvYW4uSE5vdFJlYWR5VG9EaXNzb2x2ZQARCFUBVGhlIGNyb3dkbG9hbiBpcyBub3QgcmVhZHkgdG8gZGlzc29sdmUuIFBvdGVudGlhbGx5IHN0aWxsIGhhcyBhIHNsb3Qgb3IgaW4gcmV0aXJlbWVudBxwZXJpb2QuQEludmFsaWRTaWduYXR1cmUAEgRISW52YWxpZCBzaWduYXR1cmUuME1lbW9Ub29MYXJnZQATBHxUaGUgcHJvdmlkZWQgbWVtbyBpcyB0b28gbGFyZ2UuREFscmVhZHlJbk5ld1JhaXNlABQEhFRoZSBmdW5kIGlzIGFscmVhZHkgaW4gYE5ld1JhaXNlYEhWcmZEZWxheUluUHJvZ3Jlc3MAFQS0Tm8gY29udHJpYnV0aW9ucyBhbGxvd2VkIGR1cmluZyB0aGUgVlJGIGRlbGF5NE5vTGVhc2VQZXJpb2QAFgQtAUEgbGVhc2UgcGVyaW9kIGhhcyBub3Qgc3RhcnRlZCB5ZXQsIGR1ZSB0byBhbiBvZmZzZXQgaW4gdGhlIHN0YXJ0aW5nIGJsb2NrLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC6hDBBscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zIGNvcmV0aW1lGHBhbGxldBRFcnJvcgQEVAABDCROb3RCcm9rZXIAAAQpAVRoZSBwYXJhaWQgbWFraW5nIHRoZSBjYWxsIGlzIG5vdCB0aGUgY29yZXRpbWUgYnJva2VyYWdlIHN5c3RlbSBwYXJhY2hhaW4uWFJlcXVlc3RlZEZ1dHVyZVJldmVudWUAAQhFAVJlcXVlc3RlZCByZXZlbnVlIGluZm9ybWF0aW9uIGB3aGVuYCBwYXJhbWV0ZXIgd2FzIGluIHRoZSBmdXR1cmUgZnJvbSB0aGUgY3VycmVudDRibG9jayBoZWlnaHQuTEFzc2V0VHJhbnNmZXJGYWlsZWQAAgS8RmFpbGVkIHRvIHRyYW5zZmVyIGFzc2V0cyB0byB0aGUgY29yZXRpbWUgY2hhaW4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQupQwMKHBhbGxldF94Y20YcGFsbGV0LFF1ZXJ5U3RhdHVzBCxCbG9ja051bWJlcgEQAQwcUGVuZGluZxABJHJlc3BvbmRlckUBAURWZXJzaW9uZWRMb2NhdGlvbgABTG1heWJlX21hdGNoX3F1ZXJpZXKpDAFkT3B0aW9uPFZlcnNpb25lZExvY2F0aW9uPgABMG1heWJlX25vdGlmea0MAUBPcHRpb248KHU4LCB1OCk+AAEcdGltZW91dBABLEJsb2NrTnVtYmVyAAAAPFZlcnNpb25Ob3RpZmllcggBGG9yaWdpbkUBAURWZXJzaW9uZWRMb2NhdGlvbgABJGlzX2FjdGl2ZSABEGJvb2wAAQAUUmVhZHkIASByZXNwb25zZbUMAURWZXJzaW9uZWRSZXNwb25zZQABCGF0EAEsQmxvY2tOdW1iZXIAAgAAqQwEGE9wdGlvbgQEVAFFAQEIEE5vbmUAAAAQU29tZQQARQEAAAEAAK0MBBhPcHRpb24EBFQBsQwBCBBOb25lAAAAEFNvbWUEALEMAAABAACxDAAABAgICAC1DAgMeGNtRFZlcnNpb25lZFJlc3BvbnNlAAEMCFYyBAC1BQEwdjI6OlJlc3BvbnNlAAIACFYzBAD9BQEwdjM6OlJlc3BvbnNlAAMACFY0BABhBgEwdjQ6OlJlc3BvbnNlAAQAALkMAAAECBBFAQC9DAAABAwwKBAAwQwMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAHFDARTAAAEAMkMARhWZWM8VD4AAMUMAAAECEUBEADJDAAAAsUMAM0MDChwYWxsZXRfeGNtGHBhbGxldFRWZXJzaW9uTWlncmF0aW9uU3RhZ2UAARBcTWlncmF0ZVN1cHBvcnRlZFZlcnNpb24AAABcTWlncmF0ZVZlcnNpb25Ob3RpZmllcnMAAQBQTm90aWZ5Q3VycmVudFRhcmdldHMEANEMATxPcHRpb248VmVjPHU4Pj4AAgBoTWlncmF0ZUFuZE5vdGlmeU9sZFRhcmdldHMAAwAA0QwEGE9wdGlvbgQEVAE4AQgQTm9uZQAAABBTb21lBAA4AAABAADVDAAABAwQAL0GANkMDChwYWxsZXRfeGNtGHBhbGxldGhSZW1vdGVMb2NrZWRGdW5naWJsZVJlY29yZAhIQ29uc3VtZXJJZGVudGlmaWVyAYwwTWF4Q29uc3VtZXJzAAAQARhhbW91bnQYARB1MTI4AAEUb3duZXJFAQFEVmVyc2lvbmVkTG9jYXRpb24AARhsb2NrZXJFAQFEVmVyc2lvbmVkTG9jYXRpb24AASRjb25zdW1lcnPdDAHQQm91bmRlZFZlYzwoQ29uc3VtZXJJZGVudGlmaWVyLCB1MTI4KSwgTWF4Q29uc3VtZXJzPgAA3QwMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAHhDARTAAAEAOUMARhWZWM8VD4AAOEMAAAECIwYAOUMAAAC4QwA6QwMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAHtDARTAAAEAPEMARhWZWM8VD4AAO0MAAAECBhFAQDxDAAAAu0MAPUMDChwYWxsZXRfeGNtGHBhbGxldBRFcnJvcgQEVAABYCxVbnJlYWNoYWJsZQAACF0BVGhlIGRlc2lyZWQgZGVzdGluYXRpb24gd2FzIHVucmVhY2hhYmxlLCBnZW5lcmFsbHkgYmVjYXVzZSB0aGVyZSBpcyBhIG5vIHdheSBvZiByb3V0aW5nGHRvIGl0LixTZW5kRmFpbHVyZQABCEEBVGhlcmUgd2FzIHNvbWUgb3RoZXIgaXNzdWUgKGkuZS4gbm90IHRvIGRvIHdpdGggcm91dGluZykgaW4gc2VuZGluZyB0aGUgbWVzc2FnZS7IUGVyaGFwcyBhIGxhY2sgb2Ygc3BhY2UgZm9yIGJ1ZmZlcmluZyB0aGUgbWVzc2FnZS4gRmlsdGVyZWQAAgScVGhlIG1lc3NhZ2UgZXhlY3V0aW9uIGZhaWxzIHRoZSBmaWx0ZXIuSFVud2VpZ2hhYmxlTWVzc2FnZQADBLRUaGUgbWVzc2FnZSdzIHdlaWdodCBjb3VsZCBub3QgYmUgZGV0ZXJtaW5lZC5gRGVzdGluYXRpb25Ob3RJbnZlcnRpYmxlAAQE3FRoZSBkZXN0aW5hdGlvbiBgTG9jYXRpb25gIHByb3ZpZGVkIGNhbm5vdCBiZSBpbnZlcnRlZC4URW1wdHkABQSAVGhlIGFzc2V0cyB0byBiZSBzZW50IGFyZSBlbXB0eS44Q2Fubm90UmVhbmNob3IABgQ1AUNvdWxkIG5vdCByZS1hbmNob3IgdGhlIGFzc2V0cyB0byBkZWNsYXJlIHRoZSBmZWVzIGZvciB0aGUgZGVzdGluYXRpb24gY2hhaW4uNFRvb01hbnlBc3NldHMABwTEVG9vIG1hbnkgYXNzZXRzIGhhdmUgYmVlbiBhdHRlbXB0ZWQgZm9yIHRyYW5zZmVyLjRJbnZhbGlkT3JpZ2luAAgEeE9yaWdpbiBpcyBpbnZhbGlkIGZvciBzZW5kaW5nLihCYWRWZXJzaW9uAAkEIQFUaGUgdmVyc2lvbiBvZiB0aGUgYFZlcnNpb25lZGAgdmFsdWUgdXNlZCBpcyBub3QgYWJsZSB0byBiZSBpbnRlcnByZXRlZC4sQmFkTG9jYXRpb24ACghBAVRoZSBnaXZlbiBsb2NhdGlvbiBjb3VsZCBub3QgYmUgdXNlZCAoZS5nLiBiZWNhdXNlIGl0IGNhbm5vdCBiZSBleHByZXNzZWQgaW4gdGhlYGRlc2lyZWQgdmVyc2lvbiBvZiBYQ00pLjhOb1N1YnNjcmlwdGlvbgALBLxUaGUgcmVmZXJlbmNlZCBzdWJzY3JpcHRpb24gY291bGQgbm90IGJlIGZvdW5kLkRBbHJlYWR5U3Vic2NyaWJlZAAMBBEBVGhlIGxvY2F0aW9uIGlzIGludmFsaWQgc2luY2UgaXQgYWxyZWFkeSBoYXMgYSBzdWJzY3JpcHRpb24gZnJvbSB1cy5YQ2Fubm90Q2hlY2tPdXRUZWxlcG9ydAANBCkBQ291bGQgbm90IGNoZWNrLW91dCB0aGUgYXNzZXRzIGZvciB0ZWxlcG9ydGF0aW9uIHRvIHRoZSBkZXN0aW5hdGlvbiBjaGFpbi4oTG93QmFsYW5jZQAOBEEBVGhlIG93bmVyIGRvZXMgbm90IG93biAoYWxsKSBvZiB0aGUgYXNzZXQgdGhhdCB0aGV5IHdpc2ggdG8gZG8gdGhlIG9wZXJhdGlvbiBvbi4wVG9vTWFueUxvY2tzAA8EwFRoZSBhc3NldCBvd25lciBoYXMgdG9vIG1hbnkgbG9ja3Mgb24gdGhlIGFzc2V0LkxBY2NvdW50Tm90U292ZXJlaWduABAEMQFUaGUgZ2l2ZW4gYWNjb3VudCBpcyBub3QgYW4gaWRlbnRpZmlhYmxlIHNvdmVyZWlnbiBhY2NvdW50IGZvciBhbnkgbG9jYXRpb24uKEZlZXNOb3RNZXQAEQQpAVRoZSBvcGVyYXRpb24gcmVxdWlyZWQgZmVlcyB0byBiZSBwYWlkIHdoaWNoIHRoZSBpbml0aWF0b3IgY291bGQgbm90IG1lZXQuMExvY2tOb3RGb3VuZAASBPRBIHJlbW90ZSBsb2NrIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgZGF0YSBjb3VsZCBub3QgYmUgZm91bmQuFEluVXNlABMESQFUaGUgdW5sb2NrIG9wZXJhdGlvbiBjYW5ub3Qgc3VjY2VlZCBiZWNhdXNlIHRoZXJlIGFyZSBzdGlsbCBjb25zdW1lcnMgb2YgdGhlIGxvY2suaEludmFsaWRBc3NldFVua25vd25SZXNlcnZlABUE8EludmFsaWQgYXNzZXQsIHJlc2VydmUgY2hhaW4gY291bGQgbm90IGJlIGRldGVybWluZWQgZm9yIGl0LnhJbnZhbGlkQXNzZXRVbnN1cHBvcnRlZFJlc2VydmUAFgRFAUludmFsaWQgYXNzZXQsIGRvIG5vdCBzdXBwb3J0IHJlbW90ZSBhc3NldCByZXNlcnZlcyB3aXRoIGRpZmZlcmVudCBmZWVzIHJlc2VydmVzLjxUb29NYW55UmVzZXJ2ZXMAFwRJAVRvbyBtYW55IGFzc2V0cyB3aXRoIGRpZmZlcmVudCByZXNlcnZlIGxvY2F0aW9ucyBoYXZlIGJlZW4gYXR0ZW1wdGVkIGZvciB0cmFuc2Zlci5gTG9jYWxFeGVjdXRpb25JbmNvbXBsZXRlABgEfExvY2FsIFhDTSBleGVjdXRpb24gaW5jb21wbGV0ZS4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQu+QwIUHBhbGxldF9tZXNzYWdlX3F1ZXVlJEJvb2tTdGF0ZQQ0TWVzc2FnZU9yaWdpbgHFBgAYARRiZWdpbhABJFBhZ2VJbmRleAABDGVuZBABJFBhZ2VJbmRleAABFGNvdW50EAEkUGFnZUluZGV4AAFAcmVhZHlfbmVpZ2hib3Vyc/0MAYRPcHRpb248TmVpZ2hib3VyczxNZXNzYWdlT3JpZ2luPj4AATRtZXNzYWdlX2NvdW50MAEMdTY0AAEQc2l6ZTABDHU2NAAA/QwEGE9wdGlvbgQEVAEBDQEIEE5vbmUAAAAQU29tZQQAAQ0AAAEAAAENCFBwYWxsZXRfbWVzc2FnZV9xdWV1ZShOZWlnaGJvdXJzBDRNZXNzYWdlT3JpZ2luAcUGAAgBEHByZXbFBgE0TWVzc2FnZU9yaWdpbgABEG5leHTFBgE0TWVzc2FnZU9yaWdpbgAABQ0AAAQIxQYQAAkNCFBwYWxsZXRfbWVzc2FnZV9xdWV1ZRBQYWdlCBBTaXplARAgSGVhcFNpemUAABgBJHJlbWFpbmluZxABEFNpemUAAThyZW1haW5pbmdfc2l6ZRABEFNpemUAASxmaXJzdF9pbmRleBABEFNpemUAARRmaXJzdBABEFNpemUAARBsYXN0EAEQU2l6ZQABEGhlYXANDQGcQm91bmRlZFZlYzx1OCwgSW50b1UzMjxIZWFwU2l6ZSwgU2l6ZT4+AAANDQxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAQgEUwAABAA4ARhWZWM8VD4AABENDFBwYWxsZXRfbWVzc2FnZV9xdWV1ZRhwYWxsZXQURXJyb3IEBFQAASQsTm90UmVhcGFibGUAAAhJAVBhZ2UgaXMgbm90IHJlYXBhYmxlIGJlY2F1c2UgaXQgaGFzIGl0ZW1zIHJlbWFpbmluZyB0byBiZSBwcm9jZXNzZWQgYW5kIGlzIG5vdCBvbGQcZW5vdWdoLhhOb1BhZ2UAAQSEUGFnZSB0byBiZSByZWFwZWQgZG9lcyBub3QgZXhpc3QuJE5vTWVzc2FnZQACBKhUaGUgcmVmZXJlbmNlZCBtZXNzYWdlIGNvdWxkIG5vdCBiZSBmb3VuZC5AQWxyZWFkeVByb2Nlc3NlZAADBAEBVGhlIG1lc3NhZ2Ugd2FzIGFscmVhZHkgcHJvY2Vzc2VkIGFuZCBjYW5ub3QgYmUgcHJvY2Vzc2VkIGFnYWluLhhRdWV1ZWQABASsVGhlIG1lc3NhZ2UgaXMgcXVldWVkIGZvciBmdXR1cmUgZXhlY3V0aW9uLkhJbnN1ZmZpY2llbnRXZWlnaHQABQQZAVRoZXJlIGlzIHRlbXBvcmFyaWx5IG5vdCBlbm91Z2ggd2VpZ2h0IHRvIGNvbnRpbnVlIHNlcnZpY2luZyBtZXNzYWdlcy5gVGVtcG9yYXJpbHlVbnByb2Nlc3NhYmxlAAYQqFRoaXMgbWVzc2FnZSBpcyB0ZW1wb3JhcmlseSB1bnByb2Nlc3NhYmxlLgBZAVN1Y2ggZXJyb3JzIGFyZSBleHBlY3RlZCwgYnV0IG5vdCBndWFyYW50ZWVkLCB0byByZXNvbHZlIHRoZW1zZWx2ZXMgZXZlbnR1YWxseSB0aHJvdWdoJHJldHJ5aW5nLixRdWV1ZVBhdXNlZAAHDOxUaGUgcXVldWUgaXMgcGF1c2VkIGFuZCBubyBtZXNzYWdlIGNhbiBiZSBleGVjdXRlZCBmcm9tIGl0LgAdAVRoaXMgY2FuIGNoYW5nZSBhdCBhbnkgdGltZSBhbmQgbWF5IHJlc29sdmUgaW4gdGhlIGZ1dHVyZSBieSByZS10cnlpbmcuTFJlY3Vyc2l2ZURpc2FsbG93ZWQACAQxAUFub3RoZXIgY2FsbCBpcyBpbiBwcm9ncmVzcyBhbmQgbmVlZHMgdG8gZmluaXNoIGJlZm9yZSB0aGlzIGNhbGwgY2FuIGhhcHBlbi4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQuFQ0MRHBhbGxldF9hc3NldF9yYXRlGHBhbGxldBRFcnJvcgQEVAABDEBVbmtub3duQXNzZXRLaW5kAAAEeFRoZSBnaXZlbiBhc3NldCBJRCBpcyB1bmtub3duLjRBbHJlYWR5RXhpc3RzAAEEUQFUaGUgZ2l2ZW4gYXNzZXQgSUQgYWxyZWFkeSBoYXMgYW4gYXNzaWduZWQgY29udmVyc2lvbiByYXRlIGFuZCBjYW5ub3QgYmUgcmUtY3JlYXRlZC4gT3ZlcmZsb3cAAgTMT3ZlcmZsb3cgb2N1cnJlZCB3aGVuIGNhbGN1bGF0aW5nIHRoZSBpbnZlcnNlIHJhdGUuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LhkNDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBKQIEUwAABAAdDQEYVmVjPFQ+AAAdDQAAAikCACENDDBwYWxsZXRfYmVlZnkYcGFsbGV0FEVycm9yBARUAAEQYEludmFsaWRLZXlPd25lcnNoaXBQcm9vZgAABDEBQSBrZXkgb3duZXJzaGlwIHByb29mIHByb3ZpZGVkIGFzIHBhcnQgb2YgYW4gZXF1aXZvY2F0aW9uIHJlcG9ydCBpcyBpbnZhbGlkLmBJbnZhbGlkRXF1aXZvY2F0aW9uUHJvb2YAAQQxAUFuIGVxdWl2b2NhdGlvbiBwcm9vZiBwcm92aWRlZCBhcyBwYXJ0IG9mIGFuIGVxdWl2b2NhdGlvbiByZXBvcnQgaXMgaW52YWxpZC5YRHVwbGljYXRlT2ZmZW5jZVJlcG9ydAACBBUBQSBnaXZlbiBlcXVpdm9jYXRpb24gcmVwb3J0IGlzIHZhbGlkIGJ1dCBhbHJlYWR5IHByZXZpb3VzbHkgcmVwb3J0ZWQuUEludmFsaWRDb25maWd1cmF0aW9uAAMEjFN1Ym1pdHRlZCBjb25maWd1cmF0aW9uIGlzIGludmFsaWQuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LiUNDEhzcF9jb25zZW5zdXNfYmVlZnkMbW1yREJlZWZ5QXV0aG9yaXR5U2V0BFhBdXRob3JpdHlTZXRDb21taXRtZW50ATQADAEIaWQwAVRjcmF0ZTo6VmFsaWRhdG9yU2V0SWQAAQxsZW4QAQx1MzIAAURrZXlzZXRfY29tbWl0bWVudDQBWEF1dGhvcml0eVNldENvbW1pdG1lbnQAACkNAAAEKC0NMQ01DTkNPQ1FDUkNTQ1RDVUNAC0NEDBmcmFtZV9zeXN0ZW0oZXh0ZW5zaW9uc1RjaGVja19ub25femVyb19zZW5kZXJIQ2hlY2tOb25aZXJvU2VuZGVyBARUAAAAADENEDBmcmFtZV9zeXN0ZW0oZXh0ZW5zaW9uc0hjaGVja19zcGVjX3ZlcnNpb25AQ2hlY2tTcGVjVmVyc2lvbgQEVAAAAAA1DRAwZnJhbWVfc3lzdGVtKGV4dGVuc2lvbnNAY2hlY2tfdHhfdmVyc2lvbjhDaGVja1R4VmVyc2lvbgQEVAAAAAA5DRAwZnJhbWVfc3lzdGVtKGV4dGVuc2lvbnM0Y2hlY2tfZ2VuZXNpczBDaGVja0dlbmVzaXMEBFQAAAAAPQ0QMGZyYW1lX3N5c3RlbShleHRlbnNpb25zPGNoZWNrX21vcnRhbGl0eThDaGVja01vcnRhbGl0eQQEVAAABABBDQEMRXJhAABBDRAoc3BfcnVudGltZRxnZW5lcmljDGVyYQxFcmEAAQEEIEltbW9ydGFsAAAAHE1vcnRhbDEEAAgAAAEAHE1vcnRhbDIEAAgAAAIAHE1vcnRhbDMEAAgAAAMAHE1vcnRhbDQEAAgAAAQAHE1vcnRhbDUEAAgAAAUAHE1vcnRhbDYEAAgAAAYAHE1vcnRhbDcEAAgAAAcAHE1vcnRhbDgEAAgAAAgAHE1vcnRhbDkEAAgAAAkAIE1vcnRhbDEwBAAIAAAKACBNb3J0YWwxMQQACAAACwAgTW9ydGFsMTIEAAgAAAwAIE1vcnRhbDEzBAAIAAANACBNb3J0YWwxNAQACAAADgAgTW9ydGFsMTUEAAgAAA8AIE1vcnRhbDE2BAAIAAAQACBNb3J0YWwxNwQACAAAEQAgTW9ydGFsMTgEAAgAABIAIE1vcnRhbDE5BAAIAAATACBNb3J0YWwyMAQACAAAFAAgTW9ydGFsMjEEAAgAABUAIE1vcnRhbDIyBAAIAAAWACBNb3J0YWwyMwQACAAAFwAgTW9ydGFsMjQEAAgAABgAIE1vcnRhbDI1BAAIAAAZACBNb3J0YWwyNgQACAAAGgAgTW9ydGFsMjcEAAgAABsAIE1vcnRhbDI4BAAIAAAcACBNb3J0YWwyOQQACAAAHQAgTW9ydGFsMzAEAAgAAB4AIE1vcnRhbDMxBAAIAAAfACBNb3J0YWwzMgQACAAAIAAgTW9ydGFsMzMEAAgAACEAIE1vcnRhbDM0BAAIAAAiACBNb3J0YWwzNQQACAAAIwAgTW9ydGFsMzYEAAgAACQAIE1vcnRhbDM3BAAIAAAlACBNb3J0YWwzOAQACAAAJgAgTW9ydGFsMzkEAAgAACcAIE1vcnRhbDQwBAAIAAAoACBNb3J0YWw0MQQACAAAKQAgTW9ydGFsNDIEAAgAACoAIE1vcnRhbDQzBAAIAAArACBNb3J0YWw0NAQACAAALAAgTW9ydGFsNDUEAAgAAC0AIE1vcnRhbDQ2BAAIAAAuACBNb3J0YWw0NwQACAAALwAgTW9ydGFsNDgEAAgAADAAIE1vcnRhbDQ5BAAIAAAxACBNb3J0YWw1MAQACAAAMgAgTW9ydGFsNTEEAAgAADMAIE1vcnRhbDUyBAAIAAA0ACBNb3J0YWw1MwQACAAANQAgTW9ydGFsNTQEAAgAADYAIE1vcnRhbDU1BAAIAAA3ACBNb3J0YWw1NgQACAAAOAAgTW9ydGFsNTcEAAgAADkAIE1vcnRhbDU4BAAIAAA6ACBNb3J0YWw1OQQACAAAOwAgTW9ydGFsNjAEAAgAADwAIE1vcnRhbDYxBAAIAAA9ACBNb3J0YWw2MgQACAAAPgAgTW9ydGFsNjMEAAgAAD8AIE1vcnRhbDY0BAAIAABAACBNb3J0YWw2NQQACAAAQQAgTW9ydGFsNjYEAAgAAEIAIE1vcnRhbDY3BAAIAABDACBNb3J0YWw2OAQACAAARAAgTW9ydGFsNjkEAAgAAEUAIE1vcnRhbDcwBAAIAABGACBNb3J0YWw3MQQACAAARwAgTW9ydGFsNzIEAAgAAEgAIE1vcnRhbDczBAAIAABJACBNb3J0YWw3NAQACAAASgAgTW9ydGFsNzUEAAgAAEsAIE1vcnRhbDc2BAAIAABMACBNb3J0YWw3NwQACAAATQAgTW9ydGFsNzgEAAgAAE4AIE1vcnRhbDc5BAAIAABPACBNb3J0YWw4MAQACAAAUAAgTW9ydGFsODEEAAgAAFEAIE1vcnRhbDgyBAAIAABSACBNb3J0YWw4MwQACAAAUwAgTW9ydGFsODQEAAgAAFQAIE1vcnRhbDg1BAAIAABVACBNb3J0YWw4NgQACAAAVgAgTW9ydGFsODcEAAgAAFcAIE1vcnRhbDg4BAAIAABYACBNb3J0YWw4OQQACAAAWQAgTW9ydGFsOTAEAAgAAFoAIE1vcnRhbDkxBAAIAABbACBNb3J0YWw5MgQACAAAXAAgTW9ydGFsOTMEAAgAAF0AIE1vcnRhbDk0BAAIAABeACBNb3J0YWw5NQQACAAAXwAgTW9ydGFsOTYEAAgAAGAAIE1vcnRhbDk3BAAIAABhACBNb3J0YWw5OAQACAAAYgAgTW9ydGFsOTkEAAgAAGMAJE1vcnRhbDEwMAQACAAAZAAkTW9ydGFsMTAxBAAIAABlACRNb3J0YWwxMDIEAAgAAGYAJE1vcnRhbDEwMwQACAAAZwAkTW9ydGFsMTA0BAAIAABoACRNb3J0YWwxMDUEAAgAAGkAJE1vcnRhbDEwNgQACAAAagAkTW9ydGFsMTA3BAAIAABrACRNb3J0YWwxMDgEAAgAAGwAJE1vcnRhbDEwOQQACAAAbQAkTW9ydGFsMTEwBAAIAABuACRNb3J0YWwxMTEEAAgAAG8AJE1vcnRhbDExMgQACAAAcAAkTW9ydGFsMTEzBAAIAABxACRNb3J0YWwxMTQEAAgAAHIAJE1vcnRhbDExNQQACAAAcwAkTW9ydGFsMTE2BAAIAAB0ACRNb3J0YWwxMTcEAAgAAHUAJE1vcnRhbDExOAQACAAAdgAkTW9ydGFsMTE5BAAIAAB3ACRNb3J0YWwxMjAEAAgAAHgAJE1vcnRhbDEyMQQACAAAeQAkTW9ydGFsMTIyBAAIAAB6ACRNb3J0YWwxMjMEAAgAAHsAJE1vcnRhbDEyNAQACAAAfAAkTW9ydGFsMTI1BAAIAAB9ACRNb3J0YWwxMjYEAAgAAH4AJE1vcnRhbDEyNwQACAAAfwAkTW9ydGFsMTI4BAAIAACAACRNb3J0YWwxMjkEAAgAAIEAJE1vcnRhbDEzMAQACAAAggAkTW9ydGFsMTMxBAAIAACDACRNb3J0YWwxMzIEAAgAAIQAJE1vcnRhbDEzMwQACAAAhQAkTW9ydGFsMTM0BAAIAACGACRNb3J0YWwxMzUEAAgAAIcAJE1vcnRhbDEzNgQACAAAiAAkTW9ydGFsMTM3BAAIAACJACRNb3J0YWwxMzgEAAgAAIoAJE1vcnRhbDEzOQQACAAAiwAkTW9ydGFsMTQwBAAIAACMACRNb3J0YWwxNDEEAAgAAI0AJE1vcnRhbDE0MgQACAAAjgAkTW9ydGFsMTQzBAAIAACPACRNb3J0YWwxNDQEAAgAAJAAJE1vcnRhbDE0NQQACAAAkQAkTW9ydGFsMTQ2BAAIAACSACRNb3J0YWwxNDcEAAgAAJMAJE1vcnRhbDE0OAQACAAAlAAkTW9ydGFsMTQ5BAAIAACVACRNb3J0YWwxNTAEAAgAAJYAJE1vcnRhbDE1MQQACAAAlwAkTW9ydGFsMTUyBAAIAACYACRNb3J0YWwxNTMEAAgAAJkAJE1vcnRhbDE1NAQACAAAmgAkTW9ydGFsMTU1BAAIAACbACRNb3J0YWwxNTYEAAgAAJwAJE1vcnRhbDE1NwQACAAAnQAkTW9ydGFsMTU4BAAIAACeACRNb3J0YWwxNTkEAAgAAJ8AJE1vcnRhbDE2MAQACAAAoAAkTW9ydGFsMTYxBAAIAAChACRNb3J0YWwxNjIEAAgAAKIAJE1vcnRhbDE2MwQACAAAowAkTW9ydGFsMTY0BAAIAACkACRNb3J0YWwxNjUEAAgAAKUAJE1vcnRhbDE2NgQACAAApgAkTW9ydGFsMTY3BAAIAACnACRNb3J0YWwxNjgEAAgAAKgAJE1vcnRhbDE2OQQACAAAqQAkTW9ydGFsMTcwBAAIAACqACRNb3J0YWwxNzEEAAgAAKsAJE1vcnRhbDE3MgQACAAArAAkTW9ydGFsMTczBAAIAACtACRNb3J0YWwxNzQEAAgAAK4AJE1vcnRhbDE3NQQACAAArwAkTW9ydGFsMTc2BAAIAACwACRNb3J0YWwxNzcEAAgAALEAJE1vcnRhbDE3OAQACAAAsgAkTW9ydGFsMTc5BAAIAACzACRNb3J0YWwxODAEAAgAALQAJE1vcnRhbDE4MQQACAAAtQAkTW9ydGFsMTgyBAAIAAC2ACRNb3J0YWwxODMEAAgAALcAJE1vcnRhbDE4NAQACAAAuAAkTW9ydGFsMTg1BAAIAAC5ACRNb3J0YWwxODYEAAgAALoAJE1vcnRhbDE4NwQACAAAuwAkTW9ydGFsMTg4BAAIAAC8ACRNb3J0YWwxODkEAAgAAL0AJE1vcnRhbDE5MAQACAAAvgAkTW9ydGFsMTkxBAAIAAC/ACRNb3J0YWwxOTIEAAgAAMAAJE1vcnRhbDE5MwQACAAAwQAkTW9ydGFsMTk0BAAIAADCACRNb3J0YWwxOTUEAAgAAMMAJE1vcnRhbDE5NgQACAAAxAAkTW9ydGFsMTk3BAAIAADFACRNb3J0YWwxOTgEAAgAAMYAJE1vcnRhbDE5OQQACAAAxwAkTW9ydGFsMjAwBAAIAADIACRNb3J0YWwyMDEEAAgAAMkAJE1vcnRhbDIwMgQACAAAygAkTW9ydGFsMjAzBAAIAADLACRNb3J0YWwyMDQEAAgAAMwAJE1vcnRhbDIwNQQACAAAzQAkTW9ydGFsMjA2BAAIAADOACRNb3J0YWwyMDcEAAgAAM8AJE1vcnRhbDIwOAQACAAA0AAkTW9ydGFsMjA5BAAIAADRACRNb3J0YWwyMTAEAAgAANIAJE1vcnRhbDIxMQQACAAA0wAkTW9ydGFsMjEyBAAIAADUACRNb3J0YWwyMTMEAAgAANUAJE1vcnRhbDIxNAQACAAA1gAkTW9ydGFsMjE1BAAIAADXACRNb3J0YWwyMTYEAAgAANgAJE1vcnRhbDIxNwQACAAA2QAkTW9ydGFsMjE4BAAIAADaACRNb3J0YWwyMTkEAAgAANsAJE1vcnRhbDIyMAQACAAA3AAkTW9ydGFsMjIxBAAIAADdACRNb3J0YWwyMjIEAAgAAN4AJE1vcnRhbDIyMwQACAAA3wAkTW9ydGFsMjI0BAAIAADgACRNb3J0YWwyMjUEAAgAAOEAJE1vcnRhbDIyNgQACAAA4gAkTW9ydGFsMjI3BAAIAADjACRNb3J0YWwyMjgEAAgAAOQAJE1vcnRhbDIyOQQACAAA5QAkTW9ydGFsMjMwBAAIAADmACRNb3J0YWwyMzEEAAgAAOcAJE1vcnRhbDIzMgQACAAA6AAkTW9ydGFsMjMzBAAIAADpACRNb3J0YWwyMzQEAAgAAOoAJE1vcnRhbDIzNQQACAAA6wAkTW9ydGFsMjM2BAAIAADsACRNb3J0YWwyMzcEAAgAAO0AJE1vcnRhbDIzOAQACAAA7gAkTW9ydGFsMjM5BAAIAADvACRNb3J0YWwyNDAEAAgAAPAAJE1vcnRhbDI0MQQACAAA8QAkTW9ydGFsMjQyBAAIAADyACRNb3J0YWwyNDMEAAgAAPMAJE1vcnRhbDI0NAQACAAA9AAkTW9ydGFsMjQ1BAAIAAD1ACRNb3J0YWwyNDYEAAgAAPYAJE1vcnRhbDI0NwQACAAA9wAkTW9ydGFsMjQ4BAAIAAD4ACRNb3J0YWwyNDkEAAgAAPkAJE1vcnRhbDI1MAQACAAA+gAkTW9ydGFsMjUxBAAIAAD7ACRNb3J0YWwyNTIEAAgAAPwAJE1vcnRhbDI1MwQACAAA/QAkTW9ydGFsMjU0BAAIAAD+ACRNb3J0YWwyNTUEAAgAAP8AAEUNEDBmcmFtZV9zeXN0ZW0oZXh0ZW5zaW9ucyxjaGVja19ub25jZShDaGVja05vbmNlBARUAAAEAOwBIFQ6Ok5vbmNlAABJDRAwZnJhbWVfc3lzdGVtKGV4dGVuc2lvbnMwY2hlY2tfd2VpZ2h0LENoZWNrV2VpZ2h0BARUAAAAAE0NCGhwYWxsZXRfdHJhbnNhY3Rpb25fcGF5bWVudGBDaGFyZ2VUcmFuc2FjdGlvblBheW1lbnQEBFQAAAQA/AEwQmFsYW5jZU9mPFQ+AABRDQxccG9sa2Fkb3RfcnVudGltZV9jb21tb24YY2xhaW1zSFByZXZhbGlkYXRlQXR0ZXN0cwQEVAAAAABVDQh0ZnJhbWVfbWV0YWRhdGFfaGFzaF9leHRlbnNpb25EQ2hlY2tNZXRhZGF0YUhhc2gEBFQAAAQBEG1vZGVZDQEQTW9kZQAAWQ0IdGZyYW1lX21ldGFkYXRhX2hhc2hfZXh0ZW5zaW9uEE1vZGUAAQggRGlzYWJsZWQAAAAcRW5hYmxlZAABAABdDQhAcG9sa2Fkb3RfcnVudGltZRxSdW50aW1lAAAAAGENDDByZWxheV9jb21tb24QYXBpczRJbmZsYXRpb25JbmZvAAAIASRpbmZsYXRpb265AgFcc3BfcnVudGltZTo6UGVycXVpbnRpbGwAASRuZXh0X21pbnRlDQHwKHBvbGthZG90X3ByaW1pdGl2ZXM6OkJhbGFuY2UsIHBvbGthZG90X3ByaW1pdGl2ZXM6OkJhbGFuY2UpAABlDQAABAgYGABpDRAoc3BfcnVudGltZRxnZW5lcmljFGJsb2NrFEJsb2NrCBhIZWFkZXIBoQEkRXh0cmluc2ljAW0NAAgBGGhlYWRlcqEBARhIZWFkZXIAAShleHRyaW5zaWNzcQ0BOFZlYzxFeHRyaW5zaWM+AABtDRAoc3BfcnVudGltZRxnZW5lcmljTHVuY2hlY2tlZF9leHRyaW5zaWNIVW5jaGVja2VkRXh0cmluc2ljEBxBZGRyZXNzAcUBEENhbGwBdQEkU2lnbmF0dXJlAVUFFEV4dHJhASkNAAQAOAAAAHENAAACbQ0AdQ0IKHNwX3J1bnRpbWVYRXh0cmluc2ljSW5jbHVzaW9uTW9kZQABCDRBbGxFeHRyaW5zaWNzAAAANE9ubHlJbmhlcmVudHMAAQAAeQ0IHHNwX2NvcmU4T3BhcXVlTWV0YWRhdGEAAAQAOAEcVmVjPHU4PgAAfQ0EGE9wdGlvbgQEVAF5DQEIEE5vbmUAAAAQU29tZQQAeQ0AAAEAAIENBBhSZXN1bHQIBFQBiARFAYUNAQgIT2sEAIgAAAAADEVycgQAhQ0AAAEAAIUNDChzcF9ydW50aW1lUHRyYW5zYWN0aW9uX3ZhbGlkaXR5YFRyYW5zYWN0aW9uVmFsaWRpdHlFcnJvcgABCBxJbnZhbGlkBACJDQFISW52YWxpZFRyYW5zYWN0aW9uAAAAHFVua25vd24EAI0NAUhVbmtub3duVHJhbnNhY3Rpb24AAQAAiQ0MKHNwX3J1bnRpbWVQdHJhbnNhY3Rpb25fdmFsaWRpdHlISW52YWxpZFRyYW5zYWN0aW9uAAEsEENhbGwAAAAcUGF5bWVudAABABhGdXR1cmUAAgAUU3RhbGUAAwAgQmFkUHJvb2YABABEQW5jaWVudEJpcnRoQmxvY2sABQBERXhoYXVzdHNSZXNvdXJjZXMABgAYQ3VzdG9tBAAIAQh1OAAHADBCYWRNYW5kYXRvcnkACABMTWFuZGF0b3J5VmFsaWRhdGlvbgAJACRCYWRTaWduZXIACgAAjQ0MKHNwX3J1bnRpbWVQdHJhbnNhY3Rpb25fdmFsaWRpdHlIVW5rbm93blRyYW5zYWN0aW9uAAEMMENhbm5vdExvb2t1cAAAAExOb1Vuc2lnbmVkVmFsaWRhdG9yAAEAGEN1c3RvbQQACAEIdTgAAgAAkQ0IMHNwX2luaGVyZW50czBJbmhlcmVudERhdGEAAAQBEGRhdGGVDQGUQlRyZWVNYXA8SW5oZXJlbnRJZGVudGlmaWVyLCBWZWM8dTg+PgAAlQ0EIEJUcmVlTWFwCARLAbEFBFYBOAAEAJkNAAAAmQ0AAAKdDQCdDQAABAixBTgAoQ0IMHNwX2luaGVyZW50c1BDaGVja0luaGVyZW50c1Jlc3VsdAAADAEQb2theSABEGJvb2wAASxmYXRhbF9lcnJvciABEGJvb2wAARhlcnJvcnORDQEwSW5oZXJlbnREYXRhAAClDQwoc3BfcnVudGltZVB0cmFuc2FjdGlvbl92YWxpZGl0eURUcmFuc2FjdGlvblNvdXJjZQABDBxJbkJsb2NrAAAAFExvY2FsAAEAIEV4dGVybmFsAAIAAKkNBBhSZXN1bHQIBFQBrQ0ERQGFDQEICE9rBACtDQAAAAAMRXJyBACFDQAAAQAArQ0MKHNwX3J1bnRpbWVQdHJhbnNhY3Rpb25fdmFsaWRpdHlAVmFsaWRUcmFuc2FjdGlvbgAAFAEgcHJpb3JpdHkwAUxUcmFuc2FjdGlvblByaW9yaXR5AAEgcmVxdWlyZXOFAQFMVmVjPFRyYW5zYWN0aW9uVGFnPgABIHByb3ZpZGVzhQEBTFZlYzxUcmFuc2FjdGlvblRhZz4AASRsb25nZXZpdHkwAVBUcmFuc2FjdGlvbkxvbmdldml0eQABJHByb3BhZ2F0ZSABEGJvb2wAALENAAAECE0LtQ0AtQ0MTHBvbGthZG90X3ByaW1pdGl2ZXMIdjdER3JvdXBSb3RhdGlvbkluZm8EBE4BEAAMAUxzZXNzaW9uX3N0YXJ0X2Jsb2NrEAEETgABYGdyb3VwX3JvdGF0aW9uX2ZyZXF1ZW5jeRABBE4AAQxub3cQAQROAAC5DQAAAr0NAL0NDExwb2xrYWRvdF9wcmltaXRpdmVzCHY3JENvcmVTdGF0ZQgESAE0BE4BEAEMIE9jY3VwaWVkBADBDQFIT2NjdXBpZWRDb3JlPEgsIE4+AAAAJFNjaGVkdWxlZAQAyQ0BNFNjaGVkdWxlZENvcmUAAQAQRnJlZQACAADBDQxMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2NzBPY2N1cGllZENvcmUIBEgBNAROARAAIAFQbmV4dF91cF9vbl9hdmFpbGFibGXFDQFUT3B0aW9uPFNjaGVkdWxlZENvcmU+AAE4b2NjdXBpZWRfc2luY2UQAQROAAEsdGltZV9vdXRfYXQQAQROAAFMbmV4dF91cF9vbl90aW1lX291dMUNAVRPcHRpb248U2NoZWR1bGVkQ29yZT4AATBhdmFpbGFiaWxpdHmRBAF8Qml0VmVjPHU4LCBiaXR2ZWM6Om9yZGVyOjpMc2IwPgABRGdyb3VwX3Jlc3BvbnNpYmxldQcBKEdyb3VwSW5kZXgAAThjYW5kaWRhdGVfaGFzaO0EATRDYW5kaWRhdGVIYXNoAAFQY2FuZGlkYXRlX2Rlc2NyaXB0b3KtBAFYQ2FuZGlkYXRlRGVzY3JpcHRvcjxIPgAAxQ0EGE9wdGlvbgQEVAHJDQEIEE5vbmUAAAAQU29tZQQAyQ0AAAEAAMkNDExwb2xrYWRvdF9wcmltaXRpdmVzCHY3NFNjaGVkdWxlZENvcmUAAAgBHHBhcmFfaWSNAgEISWQAASBjb2xsYXRvcs0NAUhPcHRpb248Q29sbGF0b3JJZD4AAM0NBBhPcHRpb24EBFQBsQQBCBBOb25lAAAAEFNvbWUEALEEAAABAADRDQxMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2N1hPY2N1cGllZENvcmVBc3N1bXB0aW9uAAEMIEluY2x1ZGVkAAAAIFRpbWVkT3V0AAEAEEZyZWUAAgAA1Q0EGE9wdGlvbgQEVAHZDQEIEE5vbmUAAAAQU29tZQQA2Q0AAAEAANkNDExwb2xrYWRvdF9wcmltaXRpdmVzCHY3XFBlcnNpc3RlZFZhbGlkYXRpb25EYXRhCARIATQETgEQABABLHBhcmVudF9oZWFk2QQBIEhlYWREYXRhAAFMcmVsYXlfcGFyZW50X251bWJlchABBE4AAWRyZWxheV9wYXJlbnRfc3RvcmFnZV9yb290NAEESAABMG1heF9wb3Zfc2l6ZRABDHUzMgAA3Q0EGE9wdGlvbgQEVAHhDQEIEE5vbmUAAAAQU29tZQQA4Q0AAAEAAOENAAAECNkNuQQA5Q0EGE9wdGlvbgQEVAGpBAEIEE5vbmUAAAAQU29tZQQAqQQAAAEAAOkNAAAC7Q0A7Q0MTHBvbGthZG90X3ByaW1pdGl2ZXMIdjc4Q2FuZGlkYXRlRXZlbnQEBEgBNAEMPENhbmRpZGF0ZUJhY2tlZBAAbQcBTENhbmRpZGF0ZVJlY2VpcHQ8SD4AANkEASBIZWFkRGF0YQAAcQcBJENvcmVJbmRleAAAdQcBKEdyb3VwSW5kZXgAAABEQ2FuZGlkYXRlSW5jbHVkZWQQAG0HAUxDYW5kaWRhdGVSZWNlaXB0PEg+AADZBAEgSGVhZERhdGEAAHEHASRDb3JlSW5kZXgAAHUHAShHcm91cEluZGV4AAEARENhbmRpZGF0ZVRpbWVkT3V0DABtBwFMQ2FuZGlkYXRlUmVjZWlwdDxIPgAA2QQBIEhlYWREYXRhAABxBwEkQ29yZUluZGV4AAIAAPENBCBCVHJlZU1hcAgESwGNAgRWAc0LAAQA9Q0AAAD1DQAAAvkNAPkNAAAECI0CzQsA/Q0EGE9wdGlvbgQEVAE1CwEIEE5vbmUAAAAQU29tZQQANQsAAAEAAAEOBBhPcHRpb24EBFQB5QsBCBBOb25lAAAAEFNvbWUEAOULAAABAAAFDgQYT3B0aW9uBARUAbkEAQgQTm9uZQAAABBTb21lBAC5BAAAAQAACQ4AAAINDgANDgAABAwQ7QT1CwARDgQYT3B0aW9uBARUAVkEAQgQTm9uZQAAABBTb21lBABZBAAAAQAAFQ4AAAIZDgAZDgAABAwQ7QQBDAAdDgQYT3B0aW9uBARUASEOAQgQTm9uZQAAABBTb21lBAAhDgAAAQAAIQ4QTHBvbGthZG90X3ByaW1pdGl2ZXMIdjcgc2xhc2hpbmdcT3BhcXVlS2V5T3duZXJzaGlwUHJvb2YAAAQAOAEcVmVjPHU4PgAAJQ4EGE9wdGlvbgQEVAGMAQgQTm9uZQAAABBTb21lBACMAAABAAApDgQYT3B0aW9uBARUAS0OAQgQTm9uZQAAABBTb21lBAAtDgAAAQAALQ4QTHBvbGthZG90X3ByaW1pdGl2ZXMIdjc0YXN5bmNfYmFja2luZzBCYWNraW5nU3RhdGUIBEgBNAROARAACAEsY29uc3RyYWludHMxDgE4Q29uc3RyYWludHM8Tj4AAVBwZW5kaW5nX2F2YWlsYWJpbGl0eVEOAZxWZWM8Q2FuZGlkYXRlUGVuZGluZ0F2YWlsYWJpbGl0eTxILCBOPj4AADEOEExwb2xrYWRvdF9wcmltaXRpdmVzCHY3NGFzeW5jX2JhY2tpbmcsQ29uc3RyYWludHMEBE4BEAA4AVxtaW5fcmVsYXlfcGFyZW50X251bWJlchABBE4AATBtYXhfcG92X3NpemUQAQx1MzIAATRtYXhfY29kZV9zaXplEAEMdTMyAAE0dW1wX3JlbWFpbmluZxABDHUzMgABTHVtcF9yZW1haW5pbmdfYnl0ZXMQAQx1MzIAAWRtYXhfdW1wX251bV9wZXJfY2FuZGlkYXRlEAEMdTMyAAFYZG1wX3JlbWFpbmluZ19tZXNzYWdlc+UBARhWZWM8Tj4AATBocm1wX2luYm91bmQ1DgFkSW5ib3VuZEhybXBMaW1pdGF0aW9uczxOPgABRGhybXBfY2hhbm5lbHNfb3V0OQ4BpFZlYzwoSWQsIE91dGJvdW5kSHJtcENoYW5uZWxMaW1pdGF0aW9ucyk+AAFobWF4X2hybXBfbnVtX3Blcl9jYW5kaWRhdGUQAQx1MzIAATxyZXF1aXJlZF9wYXJlbnTZBAEgSGVhZERhdGEAAVB2YWxpZGF0aW9uX2NvZGVfaGFzaLkEAUhWYWxpZGF0aW9uQ29kZUhhc2gAAUx1cGdyYWRlX3Jlc3RyaWN0aW9uRQ4BaE9wdGlvbjxVcGdyYWRlUmVzdHJpY3Rpb24+AAFYZnV0dXJlX3ZhbGlkYXRpb25fY29kZUkOAXxPcHRpb248KE4sIFZhbGlkYXRpb25Db2RlSGFzaCk+AAA1DhBMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2NzRhc3luY19iYWNraW5nWEluYm91bmRIcm1wTGltaXRhdGlvbnMEBE4BEAAEAUB2YWxpZF93YXRlcm1hcmtz5QEBGFZlYzxOPgAAOQ4AAAI9DgA9DgAABAiNAkEOAEEOEExwb2xrYWRvdF9wcmltaXRpdmVzCHY3NGFzeW5jX2JhY2tpbmd4T3V0Ym91bmRIcm1wQ2hhbm5lbExpbWl0YXRpb25zAAAIATxieXRlc19yZW1haW5pbmcQAQx1MzIAAUhtZXNzYWdlc19yZW1haW5pbmcQAQx1MzIAAEUOBBhPcHRpb24EBFQBpQsBCBBOb25lAAAAEFNvbWUEAKULAAABAABJDgQYT3B0aW9uBARUAU0OAQgQTm9uZQAAABBTb21lBABNDgAAAQAATQ4AAAQIELkEAFEOAAACVQ4AVQ4QTHBvbGthZG90X3ByaW1pdGl2ZXMIdjc0YXN5bmNfYmFja2luZ3BDYW5kaWRhdGVQZW5kaW5nQXZhaWxhYmlsaXR5CARIATQETgEQABQBOGNhbmRpZGF0ZV9oYXNo7QQBNENhbmRpZGF0ZUhhc2gAAShkZXNjcmlwdG9yrQQBWENhbmRpZGF0ZURlc2NyaXB0b3I8SD4AASxjb21taXRtZW50c70EAVBDYW5kaWRhdGVDb21taXRtZW50cwABTHJlbGF5X3BhcmVudF9udW1iZXIQAQROAAEwbWF4X3Bvdl9zaXplEAEMdTMyAABZDgQgQlRyZWVNYXAIBEsBcQcEVgGFCwAEAF0OAAAAXQ4AAAJhDgBhDgAABAhxB4ULAGUOAAACqQQAaQ4EGE9wdGlvbgQEVAFtDgEIEE5vbmUAAAAQU29tZQQAbQ4AAAEAAG0OCEhzcF9jb25zZW5zdXNfYmVlZnkwVmFsaWRhdG9yU2V0BCxBdXRob3JpdHlJZAEpAgAIASh2YWxpZGF0b3JzHQ0BQFZlYzxBdXRob3JpdHlJZD4AAQhpZDABOFZhbGlkYXRvclNldElkAABxDggoc3BfcnVudGltZSxPcGFxdWVWYWx1ZQAABAA4ARxWZWM8dTg+AAB1DgQYT3B0aW9uBARUAXEOAQgQTm9uZQAAABBTb21lBABxDgAAAQAAeQ4EGFJlc3VsdAgEVAE0BEUBfQ4BCAhPawQANAAAAAAMRXJyBAB9DgAAAQAAfQ4IRHNwX21tcl9wcmltaXRpdmVzFEVycm9yAAEoQEludmFsaWROdW1lcmljT3AAAAAQUHVzaAABABxHZXRSb290AAIAGENvbW1pdAADADRHZW5lcmF0ZVByb29mAAQAGFZlcmlmeQAFADBMZWFmTm90Rm91bmQABgBEUGFsbGV0Tm90SW5jbHVkZWQABwBASW52YWxpZExlYWZJbmRleAAIAFRJbnZhbGlkQmVzdEtub3duQmxvY2sACQAAgQ4EGFJlc3VsdAgEVAEwBEUBfQ4BCAhPawQAMAAAAAAMRXJyBAB9DgAAAQAAhQ4EGFJlc3VsdAgEVAGJDgRFAX0OAQgIT2sEAIkOAAAAAAxFcnIEAH0OAAABAACJDgAABAiNDpUOAI0OAAACkQ4AkQ4IRHNwX21tcl9wcmltaXRpdmVzTEVuY29kYWJsZU9wYXF1ZUxlYWYAAAQAOAEcVmVjPHU4PgAAlQ4IRHNwX21tcl9wcmltaXRpdmVzJExlYWZQcm9vZgQQSGFzaAE0AAwBMGxlYWZfaW5kaWNlc6EKAThWZWM8TGVhZkluZGV4PgABKGxlYWZfY291bnQwASROb2RlSW5kZXgAARRpdGVtc5UBASRWZWM8SGFzaD4AAJkOBBhSZXN1bHQIBFQBjARFAX0OAQgIT2sEAIwAAAAADEVycgQAfQ4AAAEAAJ0OCERzcF9jb25zZW5zdXNfYmFiZURCYWJlQ29uZmlndXJhdGlvbgAAGAE0c2xvdF9kdXJhdGlvbjABDHU2NAABMGVwb2NoX2xlbmd0aDABDHU2NAABBGO1AQEoKHU2NCwgdTY0KQABLGF1dGhvcml0aWVzSQgBnFZlYzwoQXV0aG9yaXR5SWQsIEJhYmVBdXRob3JpdHlXZWlnaHQpPgABKHJhbmRvbW5lc3MEAShSYW5kb21uZXNzAAE0YWxsb3dlZF9zbG90c7kBATBBbGxvd2VkU2xvdHMAAKEOCERzcF9jb25zZW5zdXNfYmFiZRRFcG9jaAAAGAEsZXBvY2hfaW5kZXgwAQx1NjQAAShzdGFydF9zbG90qQEBEFNsb3QAASBkdXJhdGlvbjABDHU2NAABLGF1dGhvcml0aWVzSQgBnFZlYzwoQXV0aG9yaXR5SWQsIEJhYmVBdXRob3JpdHlXZWlnaHQpPgABKHJhbmRvbW5lc3MEAShSYW5kb21uZXNzAAEYY29uZmlnbQgBWEJhYmVFcG9jaENvbmZpZ3VyYXRpb24AAKUOBBhPcHRpb24EBFQBqQ4BCBBOb25lAAAAEFNvbWUEAKkOAAABAACpDghEc3BfY29uc2Vuc3VzX2JhYmVcT3BhcXVlS2V5T3duZXJzaGlwUHJvb2YAAAQAOAEcVmVjPHU4PgAArQ4EGE9wdGlvbgQEVAGxDgEIEE5vbmUAAAAQU29tZQQAsQ4AAAEAALEOAAACtQ4AtQ4AAAQIOE0JALkODGhwYWxsZXRfdHJhbnNhY3Rpb25fcGF5bWVudBR0eXBlc0xSdW50aW1lRGlzcGF0Y2hJbmZvCBxCYWxhbmNlARgYV2VpZ2h0ASgADAEYd2VpZ2h0KAEYV2VpZ2h0AAEUY2xhc3NgATREaXNwYXRjaENsYXNzAAEscGFydGlhbF9mZWUYARxCYWxhbmNlAAC9DgxocGFsbGV0X3RyYW5zYWN0aW9uX3BheW1lbnQUdHlwZXMoRmVlRGV0YWlscwQcQmFsYW5jZQEYAAgBNGluY2x1c2lvbl9mZWXBDgF0T3B0aW9uPEluY2x1c2lvbkZlZTxCYWxhbmNlPj4AAQx0aXAYARxCYWxhbmNlAADBDgQYT3B0aW9uBARUAcUOAQgQTm9uZQAAABBTb21lBADFDgAAAQAAxQ4MaHBhbGxldF90cmFuc2FjdGlvbl9wYXltZW50FHR5cGVzMEluY2x1c2lvbkZlZQQcQmFsYW5jZQEYAAwBIGJhc2VfZmVlGAEcQmFsYW5jZQABHGxlbl9mZWUYARxCYWxhbmNlAAFMYWRqdXN0ZWRfd2VpZ2h0X2ZlZRgBHEJhbGFuY2UAAMkOBBhSZXN1bHQIBFQBzQ4ERQHRDgEICE9rBADNDgAAAAAMRXJyBADRDgAAAQAAzQ4AAAK9BgDRDgxAeGNtX3J1bnRpbWVfYXBpcxBmZWVzFEVycm9yAAEYNFVuaW1wbGVtZW50ZWQAAABkVmVyc2lvbmVkQ29udmVyc2lvbkZhaWxlZAABAExXZWlnaHROb3RDb21wdXRhYmxlAAIATFVuaGFuZGxlZFhjbVZlcnNpb24AAwA0QXNzZXROb3RGb3VuZAAEAChVbnJvdXRhYmxlAAUAANUOBBhSZXN1bHQIBFQBKARFAdEOAQgIT2sEACgAAAAADEVycgQA0Q4AAAEAANkOBBhSZXN1bHQIBFQBGARFAdEOAQgIT2sEABgAAAAADEVycgQA0Q4AAAEAAN0OBBhSZXN1bHQIBFQBiQYERQHRDgEICE9rBACJBgAAAAAMRXJyBADRDgAAAQAA4Q4EGFJlc3VsdAgEVAHlDgRFAf0OAQgIT2sEAOUOAAAAAAxFcnIEAP0OAAABAADlDgxAeGNtX3J1bnRpbWVfYXBpcxxkcnlfcnVuRENhbGxEcnlSdW5FZmZlY3RzBBRFdmVudAFUABABQGV4ZWN1dGlvbl9yZXN1bHQJBwFoRGlzcGF0Y2hSZXN1bHRXaXRoUG9zdEluZm8AAThlbWl0dGVkX2V2ZW50c+kOAShWZWM8RXZlbnQ+AAEkbG9jYWxfeGNt7Q4BYE9wdGlvbjxWZXJzaW9uZWRYY208KCk+PgABOGZvcndhcmRlZF94Y21z8Q4BvFZlYzwoVmVyc2lvbmVkTG9jYXRpb24sIFZlYzxWZXJzaW9uZWRYY208KCk+Pik+AADpDgAAAlQA7Q4EGE9wdGlvbgQEVAGJBQEIEE5vbmUAAAAQU29tZQQAiQUAAAEAAPEOAAAC9Q4A9Q4AAAQIRQH5DgD5DgAAAokFAP0ODEB4Y21fcnVudGltZV9hcGlzHGRyeV9ydW4URXJyb3IAAQg0VW5pbXBsZW1lbnRlZAAAAGRWZXJzaW9uZWRDb252ZXJzaW9uRmFpbGVkAAEAAAEPBBhSZXN1bHQIBFQBBQ8ERQH9DgEICE9rBAAFDwAAAAAMRXJyBAD9DgAAAQAABQ8MQHhjbV9ydW50aW1lX2FwaXMcZHJ5X3J1bkBYY21EcnlSdW5FZmZlY3RzBBRFdmVudAFUAAwBQGV4ZWN1dGlvbl9yZXN1bHS1BwEcT3V0Y29tZQABOGVtaXR0ZWRfZXZlbnRz6Q4BKFZlYzxFdmVudD4AAThmb3J3YXJkZWRfeGNtc/EOAbxWZWM8KFZlcnNpb25lZExvY2F0aW9uLCBWZWM8VmVyc2lvbmVkWGNtPCgpPj4pPgAACQ8EGFJlc3VsdAgEVAEABEUBDQ8BCAhPawQAAAAAAAAMRXJyBAANDwAAAQAADQ8MQHhjbV9ydW50aW1lX2FwaXMsY29udmVyc2lvbnMURXJyb3IAAQgsVW5zdXBwb3J0ZWQAAABkVmVyc2lvbmVkQ29udmVyc2lvbkZhaWxlZAABAAARDwQYUmVzdWx0CARUAYwERQHRBwEICE9rBACMAAAAAAxFcnIEANEHAAABAAAVDwQYT3B0aW9uBARUAdEHAQgQTm9uZQAAABBTb21lBADRBwAAAQAAGQ8AAALRBwAdDwhAcG9sa2Fkb3RfcnVudGltZTBSdW50aW1lRXJyb3IAAawYU3lzdGVtBAABCAFwZnJhbWVfc3lzdGVtOjpFcnJvcjxSdW50aW1lPgAAACRTY2hlZHVsZXIEABkIAYBwYWxsZXRfc2NoZWR1bGVyOjpFcnJvcjxSdW50aW1lPgABACBQcmVpbWFnZQQAPQgBfHBhbGxldF9wcmVpbWFnZTo6RXJyb3I8UnVudGltZT4ACgAQQmFiZQQAfQgBbHBhbGxldF9iYWJlOjpFcnJvcjxSdW50aW1lPgACABxJbmRpY2VzBACFCAF4cGFsbGV0X2luZGljZXM6OkVycm9yPFJ1bnRpbWU+AAQAIEJhbGFuY2VzBADRCAF8cGFsbGV0X2JhbGFuY2VzOjpFcnJvcjxSdW50aW1lPgAFABxTdGFraW5nBAAxCQF4cGFsbGV0X3N0YWtpbmc6OkVycm9yPFJ1bnRpbWU+AAcAHFNlc3Npb24EAFEJAXhwYWxsZXRfc2Vzc2lvbjo6RXJyb3I8UnVudGltZT4ACQAcR3JhbmRwYQQAYQkBeHBhbGxldF9ncmFuZHBhOjpFcnJvcjxSdW50aW1lPgALACBUcmVhc3VyeQQAhQkBfHBhbGxldF90cmVhc3VyeTo6RXJyb3I8UnVudGltZT4AEwBAQ29udmljdGlvblZvdGluZwQAuQkBoHBhbGxldF9jb252aWN0aW9uX3ZvdGluZzo6RXJyb3I8UnVudGltZT4AFAAkUmVmZXJlbmRhBAABCgGAcGFsbGV0X3JlZmVyZW5kYTo6RXJyb3I8UnVudGltZT4AFQAkV2hpdGVsaXN0BAAFCgGAcGFsbGV0X3doaXRlbGlzdDo6RXJyb3I8UnVudGltZT4AFwAYQ2xhaW1zBAAJCgFYY2xhaW1zOjpFcnJvcjxSdW50aW1lPgAYABxWZXN0aW5nBAAZCgF4cGFsbGV0X3Zlc3Rpbmc6OkVycm9yPFJ1bnRpbWU+ABkAHFV0aWxpdHkEAB0KAXhwYWxsZXRfdXRpbGl0eTo6RXJyb3I8UnVudGltZT4AGgAUUHJveHkEAEEKAXBwYWxsZXRfcHJveHk6OkVycm9yPFJ1bnRpbWU+AB0AIE11bHRpc2lnBABRCgF8cGFsbGV0X211bHRpc2lnOjpFcnJvcjxSdW50aW1lPgAeACBCb3VudGllcwQAYQoBfHBhbGxldF9ib3VudGllczo6RXJyb3I8UnVudGltZT4AIgA0Q2hpbGRCb3VudGllcwQAbQoBlHBhbGxldF9jaGlsZF9ib3VudGllczo6RXJyb3I8UnVudGltZT4AJgBoRWxlY3Rpb25Qcm92aWRlck11bHRpUGhhc2UEAJUKAdBwYWxsZXRfZWxlY3Rpb25fcHJvdmlkZXJfbXVsdGlfcGhhc2U6OkVycm9yPFJ1bnRpbWU+ACQAJFZvdGVyTGlzdAQApQoB9HBhbGxldF9iYWdzX2xpc3Q6OkVycm9yPFJ1bnRpbWUsIHBhbGxldF9iYWdzX2xpc3Q6Okluc3RhbmNlMT4AJQA8Tm9taW5hdGlvblBvb2xzBADtCgGccGFsbGV0X25vbWluYXRpb25fcG9vbHM6OkVycm9yPFJ1bnRpbWU+ACcALEZhc3RVbnN0YWtlBAABCwGMcGFsbGV0X2Zhc3RfdW5zdGFrZTo6RXJyb3I8UnVudGltZT4AKAA0Q29uZmlndXJhdGlvbgQAEQsBoHBhcmFjaGFpbnNfY29uZmlndXJhdGlvbjo6RXJyb3I8UnVudGltZT4AMwA0UGFyYUluY2x1c2lvbgQAMQsBkHBhcmFjaGFpbnNfaW5jbHVzaW9uOjpFcnJvcjxSdW50aW1lPgA1ADBQYXJhSW5oZXJlbnQEAEkLAaRwYXJhY2hhaW5zX3BhcmFzX2luaGVyZW50OjpFcnJvcjxSdW50aW1lPgA2ABRQYXJhcwQArQsBgHBhcmFjaGFpbnNfcGFyYXM6OkVycm9yPFJ1bnRpbWU+ADgAEEhybXAEAN0LAXxwYXJhY2hhaW5zX2hybXA6OkVycm9yPFJ1bnRpbWU+ADwANFBhcmFzRGlzcHV0ZXMEAP0LAYxwYXJhY2hhaW5zX2Rpc3B1dGVzOjpFcnJvcjxSdW50aW1lPgA+ADRQYXJhc1NsYXNoaW5nBAARDAGMcGFyYWNoYWluc19zbGFzaGluZzo6RXJyb3I8UnVudGltZT4APwAgT25EZW1hbmQEAEEMAbRwYXJhY2hhaW5zX2Fzc2lnbmVyX29uX2RlbWFuZDo6RXJyb3I8UnVudGltZT4AQABoQ29yZXRpbWVBc3NpZ25tZW50UHJvdmlkZXIEAG0MAbBwYXJhY2hhaW5zX2Fzc2lnbmVyX2NvcmV0aW1lOjpFcnJvcjxSdW50aW1lPgBBACRSZWdpc3RyYXIEAHUMAXxwYXJhc19yZWdpc3RyYXI6OkVycm9yPFJ1bnRpbWU+AEYAFFNsb3RzBAB9DAFUc2xvdHM6OkVycm9yPFJ1bnRpbWU+AEcAIEF1Y3Rpb25zBACRDAFgYXVjdGlvbnM6OkVycm9yPFJ1bnRpbWU+AEgAJENyb3dkbG9hbgQAnQwBZGNyb3dkbG9hbjo6RXJyb3I8UnVudGltZT4ASQAgQ29yZXRpbWUEAKEMAWBjb3JldGltZTo6RXJyb3I8UnVudGltZT4ASgBIU3RhdGVUcmllTWlncmF0aW9uBACtBwGscGFsbGV0X3N0YXRlX3RyaWVfbWlncmF0aW9uOjpFcnJvcjxSdW50aW1lPgBiACRYY21QYWxsZXQEAPUMAWhwYWxsZXRfeGNtOjpFcnJvcjxSdW50aW1lPgBjADBNZXNzYWdlUXVldWUEABENAZBwYWxsZXRfbWVzc2FnZV9xdWV1ZTo6RXJyb3I8UnVudGltZT4AZAAkQXNzZXRSYXRlBAAVDQGEcGFsbGV0X2Fzc2V0X3JhdGU6OkVycm9yPFJ1bnRpbWU+AGUAFEJlZWZ5BAAhDQFwcGFsbGV0X2JlZWZ5OjpFcnJvcjxSdW50aW1lPgDIAADsGFN5c3RlbQEYU3lzdGVtSBxBY2NvdW50AQEEAgAMQQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAToIFRoZSBmdWxsIGFjY291bnQgaW5mb3JtYXRpb24gZm9yIGEgcGFydGljdWxhciBhY2NvdW50IElELjhFeHRyaW5zaWNDb3VudAAAEAQABLggVG90YWwgZXh0cmluc2ljcyBjb3VudCBmb3IgdGhlIGN1cnJlbnQgYmxvY2suQEluaGVyZW50c0FwcGxpZWQBACAEAASkIFdoZXRoZXIgYWxsIGluaGVyZW50cyBoYXZlIGJlZW4gYXBwbGllZC4sQmxvY2tXZWlnaHQBACQYAAAAAAAABIggVGhlIGN1cnJlbnQgd2VpZ2h0IGZvciB0aGUgYmxvY2suQEFsbEV4dHJpbnNpY3NMZW4AABAEAARBASBUb3RhbCBsZW5ndGggKGluIGJ5dGVzKSBmb3IgYWxsIGV4dHJpbnNpY3MgcHV0IHRvZ2V0aGVyLCBmb3IgdGhlIGN1cnJlbnQgYmxvY2suJEJsb2NrSGFzaAEBBAUQNIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASYIE1hcCBvZiBibG9jayBudW1iZXJzIHRvIGJsb2NrIGhhc2hlcy40RXh0cmluc2ljRGF0YQEBBAUQOAQABD0BIEV4dHJpbnNpY3MgZGF0YSBmb3IgdGhlIGN1cnJlbnQgYmxvY2sgKG1hcHMgYW4gZXh0cmluc2ljJ3MgaW5kZXggdG8gaXRzIGRhdGEpLhhOdW1iZXIBABAQAAAAAAQJASBUaGUgY3VycmVudCBibG9jayBudW1iZXIgYmVpbmcgcHJvY2Vzc2VkLiBTZXQgYnkgYGV4ZWN1dGVfYmxvY2tgLihQYXJlbnRIYXNoAQA0gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHAgSGFzaCBvZiB0aGUgcHJldmlvdXMgYmxvY2suGERpZ2VzdAEAPAQABPAgRGlnZXN0IG9mIHRoZSBjdXJyZW50IGJsb2NrLCBhbHNvIHBhcnQgb2YgdGhlIGJsb2NrIGhlYWRlci4YRXZlbnRzAQBMBAAcoCBFdmVudHMgZGVwb3NpdGVkIGZvciB0aGUgY3VycmVudCBibG9jay4AHQEgTk9URTogVGhlIGl0ZW0gaXMgdW5ib3VuZCBhbmQgc2hvdWxkIHRoZXJlZm9yZSBuZXZlciBiZSByZWFkIG9uIGNoYWluLtAgSXQgY291bGQgb3RoZXJ3aXNlIGluZmxhdGUgdGhlIFBvViBzaXplIG9mIGEgYmxvY2suAC0BIEV2ZW50cyBoYXZlIGEgbGFyZ2UgaW4tbWVtb3J5IHNpemUuIEJveCB0aGUgZXZlbnRzIHRvIG5vdCBnbyBvdXQtb2YtbWVtb3J5/CBqdXN0IGluIGNhc2Ugc29tZW9uZSBzdGlsbCByZWFkcyB0aGVtIGZyb20gd2l0aGluIHRoZSBydW50aW1lLihFdmVudENvdW50AQAQEAAAAAAEuCBUaGUgbnVtYmVyIG9mIGV2ZW50cyBpbiB0aGUgYEV2ZW50czxUPmAgbGlzdC4sRXZlbnRUb3BpY3MBAQQCNMkHBAAoJQEgTWFwcGluZyBiZXR3ZWVuIGEgdG9waWMgKHJlcHJlc2VudGVkIGJ5IFQ6Okhhc2gpIGFuZCBhIHZlY3RvciBvZiBpbmRleGVzlCBvZiBldmVudHMgaW4gdGhlIGA8RXZlbnRzPFQ+PmAgbGlzdC4AUQEgQWxsIHRvcGljIHZlY3RvcnMgaGF2ZSBkZXRlcm1pbmlzdGljIHN0b3JhZ2UgbG9jYXRpb25zIGRlcGVuZGluZyBvbiB0aGUgdG9waWMuIFRoaXNFASBhbGxvd3MgbGlnaHQtY2xpZW50cyB0byBsZXZlcmFnZSB0aGUgY2hhbmdlcyB0cmllIHN0b3JhZ2UgdHJhY2tpbmcgbWVjaGFuaXNtIGFuZOQgaW4gY2FzZSBvZiBjaGFuZ2VzIGZldGNoIHRoZSBsaXN0IG9mIGV2ZW50cyBvZiBpbnRlcmVzdC4AWQEgVGhlIHZhbHVlIGhhcyB0aGUgdHlwZSBgKEJsb2NrTnVtYmVyRm9yPFQ+LCBFdmVudEluZGV4KWAgYmVjYXVzZSBpZiB3ZSB1c2VkIG9ubHkganVzdE0BIHRoZSBgRXZlbnRJbmRleGAgdGhlbiBpbiBjYXNlIGlmIHRoZSB0b3BpYyBoYXMgdGhlIHNhbWUgY29udGVudHMgb24gdGhlIG5leHQgYmxvY2sBASBubyBub3RpZmljYXRpb24gd2lsbCBiZSB0cmlnZ2VyZWQgdGh1cyB0aGUgZXZlbnQgbWlnaHQgYmUgbG9zdC5ITGFzdFJ1bnRpbWVVcGdyYWRlAADNBwQABFUBIFN0b3JlcyB0aGUgYHNwZWNfdmVyc2lvbmAgYW5kIGBzcGVjX25hbWVgIG9mIHdoZW4gdGhlIGxhc3QgcnVudGltZSB1cGdyYWRlIGhhcHBlbmVkLlRVcGdyYWRlZFRvVTMyUmVmQ291bnQBACAEAARNASBUcnVlIGlmIHdlIGhhdmUgdXBncmFkZWQgc28gdGhhdCBgdHlwZSBSZWZDb3VudGAgaXMgYHUzMmAuIEZhbHNlIChkZWZhdWx0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AXwINE1heGltdW1XZWlnaHQoQAsAgG6HdAETzMzMzMzMzMwEKQEgVGhlIG1heGltdW0gd2VpZ2h0IHRoYXQgbWF5IGJlIHNjaGVkdWxlZCBwZXIgYmxvY2sgZm9yIGFueSBkaXNwYXRjaGFibGVzLlBNYXhTY2hlZHVsZWRQZXJCbG9jaxAQMgAAABQdASBUaGUgbWF4aW11bSBudW1iZXIgb2Ygc2NoZWR1bGVkIGNhbGxzIGluIHRoZSBxdWV1ZSBmb3IgYSBzaW5nbGUgYmxvY2suABggTk9URTpRASArIERlcGVuZGVudCBwYWxsZXRzJyBiZW5jaG1hcmtzIG1pZ2h0IHJlcXVpcmUgYSBoaWdoZXIgbGltaXQgZm9yIHRoZSBzZXR0aW5nLiBTZXQgYcQgaGlnaGVyIGxpbWl0IHVuZGVyIGBydW50aW1lLWJlbmNobWFya3NgIGZlYXR1cmUuARkIAQAgUHJlaW1hZ2UBIFByZWltYWdlDCRTdGF0dXNGb3IAAQQGNB0IBAAEkCBUaGUgcmVxdWVzdCBzdGF0dXMgb2YgYSBnaXZlbiBoYXNoLkBSZXF1ZXN0U3RhdHVzRm9yAAEEBjQlCAQABJAgVGhlIHJlcXVlc3Qgc3RhdHVzIG9mIGEgZ2l2ZW4gaGFzaC4sUHJlaW1hZ2VGb3IAAQQGNQg5CAQAAAGRAQGQAAE9CAoAEEJhYmUBEEJhYmVEKEVwb2NoSW5kZXgBADAgAAAAAAAAAAAEVCBDdXJyZW50IGVwb2NoIGluZGV4LixBdXRob3JpdGllcwEAQQgEAARsIEN1cnJlbnQgZXBvY2ggYXV0aG9yaXRpZXMuLEdlbmVzaXNTbG90AQCpASAAAAAAAAAAAAj4IFRoZSBzbG90IGF0IHdoaWNoIHRoZSBmaXJzdCBlcG9jaCBhY3R1YWxseSBzdGFydGVkLiBUaGlzIGlzIDCQIHVudGlsIHRoZSBmaXJzdCBibG9jayBvZiB0aGUgY2hhaW4uLEN1cnJlbnRTbG90AQCpASAAAAAAAAAAAARUIEN1cnJlbnQgc2xvdCBudW1iZXIuKFJhbmRvbW5lc3MBAASAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAouCBUaGUgZXBvY2ggcmFuZG9tbmVzcyBmb3IgdGhlICpjdXJyZW50KiBlcG9jaC4ALCAjIFNlY3VyaXR5AAUBIFRoaXMgTVVTVCBOT1QgYmUgdXNlZCBmb3IgZ2FtYmxpbmcsIGFzIGl0IGNhbiBiZSBpbmZsdWVuY2VkIGJ5IGH4IG1hbGljaW91cyB2YWxpZGF0b3IgaW4gdGhlIHNob3J0IHRlcm0uIEl0IE1BWSBiZSB1c2VkIGluIG1hbnkVASBjcnlwdG9ncmFwaGljIHByb3RvY29scywgaG93ZXZlciwgc28gbG9uZyBhcyBvbmUgcmVtZW1iZXJzIHRoYXQgdGhpcxUBIChsaWtlIGV2ZXJ5dGhpbmcgZWxzZSBvbi1jaGFpbikgaXQgaXMgcHVibGljLiBGb3IgZXhhbXBsZSwgaXQgY2FuIGJlBQEgdXNlZCB3aGVyZSBhIG51bWJlciBpcyBuZWVkZWQgdGhhdCBjYW5ub3QgaGF2ZSBiZWVuIGNob3NlbiBieSBhbg0BIGFkdmVyc2FyeSwgZm9yIHB1cnBvc2VzIHN1Y2ggYXMgcHVibGljLWNvaW4gemVyby1rbm93bGVkZ2UgcHJvb2ZzLmBQZW5kaW5nRXBvY2hDb25maWdDaGFuZ2UAALEBBAAEYQEgUGVuZGluZyBlcG9jaCBjb25maWd1cmF0aW9uIGNoYW5nZSB0aGF0IHdpbGwgYmUgYXBwbGllZCB3aGVuIHRoZSBuZXh0IGVwb2NoIGlzIGVuYWN0ZWQuOE5leHRSYW5kb21uZXNzAQAEgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFwgTmV4dCBlcG9jaCByYW5kb21uZXNzLjxOZXh0QXV0aG9yaXRpZXMBAEEIBAAEYCBOZXh0IGVwb2NoIGF1dGhvcml0aWVzLjBTZWdtZW50SW5kZXgBABAQAAAAACR8IFJhbmRvbW5lc3MgdW5kZXIgY29uc3RydWN0aW9uLgD4IFdlIG1ha2UgYSB0cmFkZS1vZmYgYmV0d2VlbiBzdG9yYWdlIGFjY2Vzc2VzIGFuZCBsaXN0IGxlbmd0aC4BASBXZSBzdG9yZSB0aGUgdW5kZXItY29uc3RydWN0aW9uIHJhbmRvbW5lc3MgaW4gc2VnbWVudHMgb2YgdXAgdG+UIGBVTkRFUl9DT05TVFJVQ1RJT05fU0VHTUVOVF9MRU5HVEhgLgDsIE9uY2UgYSBzZWdtZW50IHJlYWNoZXMgdGhpcyBsZW5ndGgsIHdlIGJlZ2luIHRoZSBuZXh0IG9uZS4JASBXZSByZXNldCBhbGwgc2VnbWVudHMgYW5kIHJldHVybiB0byBgMGAgYXQgdGhlIGJlZ2lubmluZyBvZiBldmVyeRwgZXBvY2guRFVuZGVyQ29uc3RydWN0aW9uAQEEBRBNCAQABBUBIFRXT1gtTk9URTogYFNlZ21lbnRJbmRleGAgaXMgYW4gaW5jcmVhc2luZyBpbnRlZ2VyLCBzbyB0aGlzIGlzIG9rYXkuLEluaXRpYWxpemVkAABVCAQACAEBIFRlbXBvcmFyeSB2YWx1ZSAoY2xlYXJlZCBhdCBibG9jayBmaW5hbGl6YXRpb24pIHdoaWNoIGlzIGBTb21lYB0BIGlmIHBlci1ibG9jayBpbml0aWFsaXphdGlvbiBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZCBmb3IgY3VycmVudCBibG9jay5MQXV0aG9yVnJmUmFuZG9tbmVzcwEAhAQAEBUBIFRoaXMgZmllbGQgc2hvdWxkIGFsd2F5cyBiZSBwb3B1bGF0ZWQgZHVyaW5nIGJsb2NrIHByb2Nlc3NpbmcgdW5sZXNzGQEgc2Vjb25kYXJ5IHBsYWluIHNsb3RzIGFyZSBlbmFibGVkICh3aGljaCBkb24ndCBjb250YWluIGEgVlJGIG91dHB1dCkuAEkBIEl0IGlzIHNldCBpbiBgb25fZmluYWxpemVgLCBiZWZvcmUgaXQgd2lsbCBjb250YWluIHRoZSB2YWx1ZSBmcm9tIHRoZSBsYXN0IGJsb2NrLihFcG9jaFN0YXJ0AQCAIAAAAAAAAAAAFF0BIFRoZSBibG9jayBudW1iZXJzIHdoZW4gdGhlIGxhc3QgYW5kIGN1cnJlbnQgZXBvY2ggaGF2ZSBzdGFydGVkLCByZXNwZWN0aXZlbHkgYE4tMWAgYW5kFCBgTmAuSQEgTk9URTogV2UgdHJhY2sgdGhpcyBpcyBpbiBvcmRlciB0byBhbm5vdGF0ZSB0aGUgYmxvY2sgbnVtYmVyIHdoZW4gYSBnaXZlbiBwb29sIG9mWQEgZW50cm9weSB3YXMgZml4ZWQgKGkuZS4gaXQgd2FzIGtub3duIHRvIGNoYWluIG9ic2VydmVycykuIFNpbmNlIGVwb2NocyBhcmUgZGVmaW5lZCBpblkBIHNsb3RzLCB3aGljaCBtYXkgYmUgc2tpcHBlZCwgdGhlIGJsb2NrIG51bWJlcnMgbWF5IG5vdCBsaW5lIHVwIHdpdGggdGhlIHNsb3QgbnVtYmVycy4gTGF0ZW5lc3MBABAQAAAAABTYIEhvdyBsYXRlIHRoZSBjdXJyZW50IGJsb2NrIGlzIGNvbXBhcmVkIHRvIGl0cyBwYXJlbnQuABUBIFRoaXMgZW50cnkgaXMgcG9wdWxhdGVkIGFzIHBhcnQgb2YgYmxvY2sgZXhlY3V0aW9uIGFuZCBpcyBjbGVhbmVkIHVwEQEgb24gYmxvY2sgZmluYWxpemF0aW9uLiBRdWVyeWluZyB0aGlzIHN0b3JhZ2UgZW50cnkgb3V0c2lkZSBvZiBibG9ja7AgZXhlY3V0aW9uIGNvbnRleHQgc2hvdWxkIGFsd2F5cyB5aWVsZCB6ZXJvLixFcG9jaENvbmZpZwAAbQgEAAhhASBUaGUgY29uZmlndXJhdGlvbiBmb3IgdGhlIGN1cnJlbnQgZXBvY2guIFNob3VsZCBuZXZlciBiZSBgTm9uZWAgYXMgaXQgaXMgaW5pdGlhbGl6ZWQgaW4kIGdlbmVzaXMuPE5leHRFcG9jaENvbmZpZwAAbQgEAAgtASBUaGUgY29uZmlndXJhdGlvbiBmb3IgdGhlIG5leHQgZXBvY2gsIGBOb25lYCBpZiB0aGUgY29uZmlnIHdpbGwgbm90IGNoYW5nZeggKHlvdSBjYW4gZmFsbGJhY2sgdG8gYEVwb2NoQ29uZmlnYCBpbnN0ZWFkIGluIHRoYXQgY2FzZSkuNFNraXBwZWRFcG9jaHMBAHEIBAAgKQEgQSBsaXN0IG9mIHRoZSBsYXN0IDEwMCBza2lwcGVkIGVwb2NocyBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgc2Vzc2lvbiBpbmRleHAgd2hlbiB0aGUgZXBvY2ggd2FzIHNraXBwZWQuADEBIFRoaXMgaXMgb25seSB1c2VkIGZvciB2YWxpZGF0aW5nIGVxdWl2b2NhdGlvbiBwcm9vZnMuIEFuIGVxdWl2b2NhdGlvbiBwcm9vZjUBIG11c3QgY29udGFpbnMgYSBrZXktb3duZXJzaGlwIHByb29mIGZvciBhIGdpdmVuIHNlc3Npb24sIHRoZXJlZm9yZSB3ZSBuZWVkIGE5ASB3YXkgdG8gdGllIHRvZ2V0aGVyIHNlc3Npb25zIGFuZCBlcG9jaCBpbmRpY2VzLCBpLmUuIHdlIG5lZWQgdG8gdmFsaWRhdGUgdGhhdCkBIGEgdmFsaWRhdG9yIHdhcyB0aGUgb3duZXIgb2YgYSBnaXZlbiBrZXkgb24gYSBnaXZlbiBzZXNzaW9uLCBhbmQgd2hhdCB0aGWwIGFjdGl2ZSBlcG9jaCBpbmRleCB3YXMgZHVyaW5nIHRoYXQgc2Vzc2lvbi4BmQEAEDRFcG9jaER1cmF0aW9uMCBgCQAAAAAAAAzsIFRoZSBhbW91bnQgb2YgdGltZSwgaW4gc2xvdHMsIHRoYXQgZWFjaCBlcG9jaCBzaG91bGQgbGFzdC4ZASBOT1RFOiBDdXJyZW50bHkgaXQgaXMgbm90IHBvc3NpYmxlIHRvIGNoYW5nZSB0aGUgZXBvY2ggZHVyYXRpb24gYWZ0ZXIhASB0aGUgY2hhaW4gaGFzIHN0YXJ0ZWQuIEF0dGVtcHRpbmcgdG8gZG8gc28gd2lsbCBicmljayBibG9jayBwcm9kdWN0aW9uLkRFeHBlY3RlZEJsb2NrVGltZTAgcBcAAAAAAAAUBQEgVGhlIGV4cGVjdGVkIGF2ZXJhZ2UgYmxvY2sgdGltZSBhdCB3aGljaCBCQUJFIHNob3VsZCBiZSBjcmVhdGluZxEBIGJsb2Nrcy4gU2luY2UgQkFCRSBpcyBwcm9iYWJpbGlzdGljIGl0IGlzIG5vdCB0cml2aWFsIHRvIGZpZ3VyZSBvdXQFASB3aGF0IHRoZSBleHBlY3RlZCBhdmVyYWdlIGJsb2NrIHRpbWUgc2hvdWxkIGJlIGJhc2VkIG9uIHRoZSBzbG90CQEgZHVyYXRpb24gYW5kIHRoZSBzZWN1cml0eSBwYXJhbWV0ZXIgYGNgICh3aGVyZSBgMSAtIGNgIHJlcHJlc2VudHOgIHRoZSBwcm9iYWJpbGl0eSBvZiBhIHNsb3QgYmVpbmcgZW1wdHkpLjhNYXhBdXRob3JpdGllcxAQoIYBAASIIE1heCBudW1iZXIgb2YgYXV0aG9yaXRpZXMgYWxsb3dlZDRNYXhOb21pbmF0b3JzEBAAAgAABNQgVGhlIG1heGltdW0gbnVtYmVyIG9mIG5vbWluYXRvcnMgZm9yIGVhY2ggdmFsaWRhdG9yLgF9CAIAJFRpbWVzdGFtcAEkVGltZXN0YW1wCAxOb3cBADAgAAAAAAAAAAAEoCBUaGUgY3VycmVudCB0aW1lIGZvciB0aGUgY3VycmVudCBibG9jay4kRGlkVXBkYXRlAQAgBAAQ2CBXaGV0aGVyIHRoZSB0aW1lc3RhbXAgaGFzIGJlZW4gdXBkYXRlZCBpbiB0aGlzIGJsb2NrLgBVASBUaGlzIHZhbHVlIGlzIHVwZGF0ZWQgdG8gYHRydWVgIHVwb24gc3VjY2Vzc2Z1bCBzdWJtaXNzaW9uIG9mIGEgdGltZXN0YW1wIGJ5IGEgbm9kZS5FASBJdCBpcyB0aGVuIGNoZWNrZWQgYXQgdGhlIGVuZCBvZiBlYWNoIGJsb2NrIGV4ZWN1dGlvbiBpbiB0aGUgYG9uX2ZpbmFsaXplYCBob29rLgG9AQAENE1pbmltdW1QZXJpb2QwILgLAAAAAAAAGIwgVGhlIG1pbmltdW0gcGVyaW9kIGJldHdlZW4gYmxvY2tzLgBNASBCZSBhd2FyZSB0aGF0IHRoaXMgaXMgZGlmZmVyZW50IHRvIHRoZSAqZXhwZWN0ZWQqIHBlcmlvZCB0aGF0IHRoZSBibG9jayBwcm9kdWN0aW9uSQEgYXBwYXJhdHVzIHByb3ZpZGVzLiBZb3VyIGNob3NlbiBjb25zZW5zdXMgc3lzdGVtIHdpbGwgZ2VuZXJhbGx5IHdvcmsgd2l0aCB0aGlzIHRvYQEgZGV0ZXJtaW5lIGEgc2Vuc2libGUgYmxvY2sgdGltZS4gRm9yIGV4YW1wbGUsIGluIHRoZSBBdXJhIHBhbGxldCBpdCB3aWxsIGJlIGRvdWJsZSB0aGlzcCBwZXJpb2Qgb24gZGVmYXVsdCBzZXR0aW5ncy4AAwAcSW5kaWNlcwEcSW5kaWNlcwQgQWNjb3VudHMAAQQCEIEIBAAEiCBUaGUgbG9va3VwIGZyb20gaW5kZXggdG8gYWNjb3VudC4BwQEBlAQcRGVwb3NpdBhAAOh2SBcAAAAAAAAAAAAAAASsIFRoZSBkZXBvc2l0IG5lZWRlZCBmb3IgcmVzZXJ2aW5nIGFuIGluZGV4LgGFCAQAIEJhbGFuY2VzASBCYWxhbmNlcxw0VG90YWxJc3N1YW5jZQEAGEAAAAAAAAAAAAAAAAAAAAAABJggVGhlIHRvdGFsIHVuaXRzIGlzc3VlZCBpbiB0aGUgc3lzdGVtLkBJbmFjdGl2ZUlzc3VhbmNlAQAYQAAAAAAAAAAAAAAAAAAAAAAECQEgVGhlIHRvdGFsIHVuaXRzIG9mIG91dHN0YW5kaW5nIGRlYWN0aXZhdGVkIGJhbGFuY2UgaW4gdGhlIHN5c3RlbS4cQWNjb3VudAEBBAIAFAEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgGAJASBUaGUgQmFsYW5jZXMgcGFsbGV0IGV4YW1wbGUgb2Ygc3RvcmluZyB0aGUgYmFsYW5jZSBvZiBhbiBhY2NvdW50LgAoICMgRXhhbXBsZQA0IGBgYG5vY29tcGlsZbAgIGltcGwgcGFsbGV0X2JhbGFuY2VzOjpDb25maWcgZm9yIFJ1bnRpbWUgexkCICAgIHR5cGUgQWNjb3VudFN0b3JlID0gU3RvcmFnZU1hcFNoaW08U2VsZjo6QWNjb3VudDxSdW50aW1lPiwgZnJhbWVfc3lzdGVtOjpQcm92aWRlcjxSdW50aW1lPiwgQWNjb3VudElkLCBTZWxmOjpBY2NvdW50RGF0YTxCYWxhbmNlPj4MICB9ECBgYGAAFQEgWW91IGNhbiBhbHNvIHN0b3JlIHRoZSBiYWxhbmNlIG9mIGFuIGFjY291bnQgaW4gdGhlIGBTeXN0ZW1gIHBhbGxldC4AKCAjIEV4YW1wbGUANCBgYGBub2NvbXBpbGWwICBpbXBsIHBhbGxldF9iYWxhbmNlczo6Q29uZmlnIGZvciBSdW50aW1lIHt0ICAgdHlwZSBBY2NvdW50U3RvcmUgPSBTeXN0ZW0MICB9ECBgYGAAUQEgQnV0IHRoaXMgY29tZXMgd2l0aCB0cmFkZW9mZnMsIHN0b3JpbmcgYWNjb3VudCBiYWxhbmNlcyBpbiB0aGUgc3lzdGVtIHBhbGxldCBzdG9yZXNtASBgZnJhbWVfc3lzdGVtYCBkYXRhIGFsb25nc2lkZSB0aGUgYWNjb3VudCBkYXRhIGNvbnRyYXJ5IHRvIHN0b3JpbmcgYWNjb3VudCBiYWxhbmNlcyBpbiB0aGUpASBgQmFsYW5jZXNgIHBhbGxldCwgd2hpY2ggdXNlcyBhIGBTdG9yYWdlTWFwYCB0byBzdG9yZSBiYWxhbmNlcyBkYXRhIG9ubHkuQQEgTk9URTogVGhpcyBpcyBvbmx5IHVzZWQgaW4gdGhlIGNhc2UgdGhhdCB0aGlzIHBhbGxldCBpcyB1c2VkIHRvIHN0b3JlIGJhbGFuY2VzLhRMb2NrcwEBBAIAiQgEABC4IEFueSBsaXF1aWRpdHkgbG9ja3Mgb24gc29tZSBhY2NvdW50IGJhbGFuY2VzLiUBIE5PVEU6IFNob3VsZCBvbmx5IGJlIGFjY2Vzc2VkIHdoZW4gc2V0dGluZywgY2hhbmdpbmcgYW5kIGZyZWVpbmcgYSBsb2NrLgCtASBVc2Ugb2YgbG9ja3MgaXMgZGVwcmVjYXRlZCBpbiBmYXZvdXIgb2YgZnJlZXplcy4gU2VlIGBodHRwczovL2dpdGh1Yi5jb20vcGFyaXR5dGVjaC9zdWJzdHJhdGUvcHVsbC8xMjk1MS9gIFJlc2VydmVzAQEEAgCZCAQADKQgTmFtZWQgcmVzZXJ2ZXMgb24gc29tZSBhY2NvdW50IGJhbGFuY2VzLgCxASBVc2Ugb2YgcmVzZXJ2ZXMgaXMgZGVwcmVjYXRlZCBpbiBmYXZvdXIgb2YgaG9sZHMuIFNlZSBgaHR0cHM6Ly9naXRodWIuY29tL3Bhcml0eXRlY2gvc3Vic3RyYXRlL3B1bGwvMTI5NTEvYBRIb2xkcwEBBAIApQgEAARsIEhvbGRzIG9uIGFjY291bnQgYmFsYW5jZXMuHEZyZWV6ZXMBAQQCAL0IBAAEiCBGcmVlemUgbG9ja3Mgb24gYWNjb3VudCBiYWxhbmNlcy4BzQEBmBBIRXhpc3RlbnRpYWxEZXBvc2l0GEAA5AtUAgAAAAAAAAAAAAAAIEEBIFRoZSBtaW5pbXVtIGFtb3VudCByZXF1aXJlZCB0byBrZWVwIGFuIGFjY291bnQgb3Blbi4gTVVTVCBCRSBHUkVBVEVSIFRIQU4gWkVSTyEAWQEgSWYgeW91ICpyZWFsbHkqIG5lZWQgaXQgdG8gYmUgemVybywgeW91IGNhbiBlbmFibGUgdGhlIGZlYXR1cmUgYGluc2VjdXJlX3plcm9fZWRgIGZvcmEBIHRoaXMgcGFsbGV0LiBIb3dldmVyLCB5b3UgZG8gc28gYXQgeW91ciBvd24gcmlzazogdGhpcyB3aWxsIG9wZW4gdXAgYSBtYWpvciBEb1MgdmVjdG9yLlkBIEluIGNhc2UgeW91IGhhdmUgbXVsdGlwbGUgc291cmNlcyBvZiBwcm92aWRlciByZWZlcmVuY2VzLCB5b3UgbWF5IGFsc28gZ2V0IHVuZXhwZWN0ZWSMIGJlaGF2aW91ciBpZiB5b3Ugc2V0IHRoaXMgdG8gemVyby4A8CBCb3R0b20gbGluZTogRG8geW91cnNlbGYgYSBmYXZvdXIgYW5kIG1ha2UgaXQgYXQgbGVhc3Qgb25lISBNYXhMb2NrcxAQMgAAABD0IFRoZSBtYXhpbXVtIG51bWJlciBvZiBsb2NrcyB0aGF0IHNob3VsZCBleGlzdCBvbiBhbiBhY2NvdW50LtwgTm90IHN0cmljdGx5IGVuZm9yY2VkLCBidXQgdXNlZCBmb3Igd2VpZ2h0IGVzdGltYXRpb24uAK0BIFVzZSBvZiBsb2NrcyBpcyBkZXByZWNhdGVkIGluIGZhdm91ciBvZiBmcmVlemVzLiBTZWUgYGh0dHBzOi8vZ2l0aHViLmNvbS9wYXJpdHl0ZWNoL3N1YnN0cmF0ZS9wdWxsLzEyOTUxL2AsTWF4UmVzZXJ2ZXMQEDIAAAAMDQEgVGhlIG1heGltdW0gbnVtYmVyIG9mIG5hbWVkIHJlc2VydmVzIHRoYXQgY2FuIGV4aXN0IG9uIGFuIGFjY291bnQuALEBIFVzZSBvZiByZXNlcnZlcyBpcyBkZXByZWNhdGVkIGluIGZhdm91ciBvZiBob2xkcy4gU2VlIGBodHRwczovL2dpdGh1Yi5jb20vcGFyaXR5dGVjaC9zdWJzdHJhdGUvcHVsbC8xMjk1MS9gKE1heEZyZWV6ZXMQEAgAAAAEYQEgVGhlIG1heGltdW0gbnVtYmVyIG9mIGluZGl2aWR1YWwgZnJlZXplIGxvY2tzIHRoYXQgY2FuIGV4aXN0IG9uIGFuIGFjY291bnQgYXQgYW55IHRpbWUuAdEIBQBIVHJhbnNhY3Rpb25QYXltZW50AUhUcmFuc2FjdGlvblBheW1lbnQIRE5leHRGZWVNdWx0aXBsaWVyAQDRBkAAAGSns7bgDQAAAAAAAAAAADhTdG9yYWdlVmVyc2lvbgEA1QgEAAAAAaAEYE9wZXJhdGlvbmFsRmVlTXVsdGlwbGllcggEBVRZASBBIGZlZSBtdWx0aXBsaWVyIGZvciBgT3BlcmF0aW9uYWxgIGV4dHJpbnNpY3MgdG8gY29tcHV0ZSAidmlydHVhbCB0aXAiIHRvIGJvb3N0IHRoZWlyLCBgcHJpb3JpdHlgAFEBIFRoaXMgdmFsdWUgaXMgbXVsdGlwbGllZCBieSB0aGUgYGZpbmFsX2ZlZWAgdG8gb2J0YWluIGEgInZpcnR1YWwgdGlwIiB0aGF0IGlzIGxhdGVy9CBhZGRlZCB0byBhIHRpcCBjb21wb25lbnQgaW4gcmVndWxhciBgcHJpb3JpdHlgIGNhbGN1bGF0aW9ucy5NASBJdCBtZWFucyB0aGF0IGEgYE5vcm1hbGAgdHJhbnNhY3Rpb24gY2FuIGZyb250LXJ1biBhIHNpbWlsYXJseS1zaXplZCBgT3BlcmF0aW9uYWxgQQEgZXh0cmluc2ljICh3aXRoIG5vIHRpcCksIGJ5IGluY2x1ZGluZyBhIHRpcCB2YWx1ZSBncmVhdGVyIHRoYW4gdGhlIHZpcnR1YWwgdGlwLgA8IGBgYHJ1c3QsaWdub3JlQCAvLyBGb3IgYE5vcm1hbGCMIGxldCBwcmlvcml0eSA9IHByaW9yaXR5X2NhbGModGlwKTsAVCAvLyBGb3IgYE9wZXJhdGlvbmFsYBEBIGxldCB2aXJ0dWFsX3RpcCA9IChpbmNsdXNpb25fZmVlICsgdGlwKSAqIE9wZXJhdGlvbmFsRmVlTXVsdGlwbGllcjvEIGxldCBwcmlvcml0eSA9IHByaW9yaXR5X2NhbGModGlwICsgdmlydHVhbF90aXApOxAgYGBgAFEBIE5vdGUgdGhhdCBzaW5jZSB3ZSB1c2UgYGZpbmFsX2ZlZWAgdGhlIG11bHRpcGxpZXIgYXBwbGllcyBhbHNvIHRvIHRoZSByZWd1bGFyIGB0aXBgXQEgc2VudCB3aXRoIHRoZSB0cmFuc2FjdGlvbi4gU28sIG5vdCBvbmx5IGRvZXMgdGhlIHRyYW5zYWN0aW9uIGdldCBhIHByaW9yaXR5IGJ1bXAgYmFzZWRhASBvbiB0aGUgYGluY2x1c2lvbl9mZWVgLCBidXQgd2UgYWxzbyBhbXBsaWZ5IHRoZSBpbXBhY3Qgb2YgdGlwcyBhcHBsaWVkIHRvIGBPcGVyYXRpb25hbGA4IHRyYW5zYWN0aW9ucy4AIAAoQXV0aG9yc2hpcAEoQXV0aG9yc2hpcAQYQXV0aG9yAAAABAAEZCBBdXRob3Igb2YgY3VycmVudCBibG9jay4AAAAABgAcU3Rha2luZwEcU3Rha2luZ6w4VmFsaWRhdG9yQ291bnQBABAQAAAAAAScIFRoZSBpZGVhbCBudW1iZXIgb2YgYWN0aXZlIHZhbGlkYXRvcnMuVE1pbmltdW1WYWxpZGF0b3JDb3VudAEAEBAAAAAABEEBIE1pbmltdW0gbnVtYmVyIG9mIHN0YWtpbmcgcGFydGljaXBhbnRzIGJlZm9yZSBlbWVyZ2VuY3kgY29uZGl0aW9ucyBhcmUgaW1wb3NlZC40SW52dWxuZXJhYmxlcwEA0QEEAAxZASBBbnkgdmFsaWRhdG9ycyB0aGF0IG1heSBuZXZlciBiZSBzbGFzaGVkIG9yIGZvcmNpYmx5IGtpY2tlZC4gSXQncyBhIFZlYyBzaW5jZSB0aGV5J3JlTQEgZWFzeSB0byBpbml0aWFsaXplIGFuZCB0aGUgcGVyZm9ybWFuY2UgaGl0IGlzIG1pbmltYWwgKHdlIGV4cGVjdCBubyBtb3JlIHRoYW4gZm91cqwgaW52dWxuZXJhYmxlcykgYW5kIHJlc3RyaWN0ZWQgdG8gdGVzdG5ldHMuGEJvbmRlZAABBAUAAAQADAEBIE1hcCBmcm9tIGFsbCBsb2NrZWQgInN0YXNoIiBhY2NvdW50cyB0byB0aGUgY29udHJvbGxlciBhY2NvdW50LgDQIFRXT1gtTk9URTogU0FGRSBzaW5jZSBgQWNjb3VudElkYCBpcyBhIHNlY3VyZSBoYXNoLkBNaW5Ob21pbmF0b3JCb25kAQAYQAAAAAAAAAAAAAAAAAAAAAAEIQEgVGhlIG1pbmltdW0gYWN0aXZlIGJvbmQgdG8gYmVjb21lIGFuZCBtYWludGFpbiB0aGUgcm9sZSBvZiBhIG5vbWluYXRvci5ATWluVmFsaWRhdG9yQm9uZAEAGEAAAAAAAAAAAAAAAAAAAAAABCEBIFRoZSBtaW5pbXVtIGFjdGl2ZSBib25kIHRvIGJlY29tZSBhbmQgbWFpbnRhaW4gdGhlIHJvbGUgb2YgYSB2YWxpZGF0b3IuSE1pbmltdW1BY3RpdmVTdGFrZQEAGEAAAAAAAAAAAAAAAAAAAAAABBEBIFRoZSBtaW5pbXVtIGFjdGl2ZSBub21pbmF0b3Igc3Rha2Ugb2YgdGhlIGxhc3Qgc3VjY2Vzc2Z1bCBlbGVjdGlvbi40TWluQ29tbWlzc2lvbgEArBAAAAAADOggVGhlIG1pbmltdW0gYW1vdW50IG9mIGNvbW1pc3Npb24gdGhhdCB2YWxpZGF0b3JzIGNhbiBzZXQuAIAgSWYgc2V0IHRvIGAwYCwgbm8gbGltaXQgZXhpc3RzLhhMZWRnZXIAAQQCANkIBAAQRQEgTWFwIGZyb20gYWxsICh1bmxvY2tlZCkgImNvbnRyb2xsZXIiIGFjY291bnRzIHRvIHRoZSBpbmZvIHJlZ2FyZGluZyB0aGUgc3Rha2luZy4AdQEgTm90ZTogQWxsIHRoZSByZWFkcyBhbmQgbXV0YXRpb25zIHRvIHRoaXMgc3RvcmFnZSAqTVVTVCogYmUgZG9uZSB0aHJvdWdoIHRoZSBtZXRob2RzIGV4cG9zZWToIGJ5IFtgU3Rha2luZ0xlZGdlcmBdIHRvIGVuc3VyZSBkYXRhIGFuZCBsb2NrIGNvbnNpc3RlbmN5LhRQYXllZQABBAUAqAQADOQgV2hlcmUgdGhlIHJld2FyZCBwYXltZW50IHNob3VsZCBiZSBtYWRlLiBLZXllZCBieSBzdGFzaC4A0CBUV09YLU5PVEU6IFNBRkUgc2luY2UgYEFjY291bnRJZGAgaXMgYSBzZWN1cmUgaGFzaC4oVmFsaWRhdG9ycwEBBAUAsAgAAAxFASBUaGUgbWFwIGZyb20gKHdhbm5hYmUpIHZhbGlkYXRvciBzdGFzaCBrZXkgdG8gdGhlIHByZWZlcmVuY2VzIG9mIHRoYXQgdmFsaWRhdG9yLgDQIFRXT1gtTk9URTogU0FGRSBzaW5jZSBgQWNjb3VudElkYCBpcyBhIHNlY3VyZSBoYXNoLlBDb3VudGVyRm9yVmFsaWRhdG9ycwEAEBAAAAAABKxDb3VudGVyIGZvciB0aGUgcmVsYXRlZCBjb3VudGVkIHN0b3JhZ2UgbWFwSE1heFZhbGlkYXRvcnNDb3VudAAAEAQADDEBIFRoZSBtYXhpbXVtIHZhbGlkYXRvciBjb3VudCBiZWZvcmUgd2Ugc3RvcCBhbGxvd2luZyBuZXcgdmFsaWRhdG9ycyB0byBqb2luLgDQIFdoZW4gdGhpcyB2YWx1ZSBpcyBub3Qgc2V0LCBubyBsaW1pdHMgYXJlIGVuZm9yY2VkLihOb21pbmF0b3JzAAEEBQDhCAQATHUBIFRoZSBtYXAgZnJvbSBub21pbmF0b3Igc3Rhc2gga2V5IHRvIHRoZWlyIG5vbWluYXRpb24gcHJlZmVyZW5jZXMsIG5hbWVseSB0aGUgdmFsaWRhdG9ycyB0aGF0WCB0aGV5IHdpc2ggdG8gc3VwcG9ydC4AOQEgTm90ZSB0aGF0IHRoZSBrZXlzIG9mIHRoaXMgc3RvcmFnZSBtYXAgbWlnaHQgYmVjb21lIG5vbi1kZWNvZGFibGUgaW4gY2FzZSB0aGUtASBhY2NvdW50J3MgW2BOb21pbmF0aW9uc1F1b3RhOjpNYXhOb21pbmF0aW9uc2BdIGNvbmZpZ3VyYXRpb24gaXMgZGVjcmVhc2VkLpAgSW4gdGhpcyByYXJlIGNhc2UsIHRoZXNlIG5vbWluYXRvcnNlASBhcmUgc3RpbGwgZXhpc3RlbnQgaW4gc3RvcmFnZSwgdGhlaXIga2V5IGlzIGNvcnJlY3QgYW5kIHJldHJpZXZhYmxlIChpLmUuIGBjb250YWluc19rZXlgcQEgaW5kaWNhdGVzIHRoYXQgdGhleSBleGlzdCksIGJ1dCB0aGVpciB2YWx1ZSBjYW5ub3QgYmUgZGVjb2RlZC4gVGhlcmVmb3JlLCB0aGUgbm9uLWRlY29kYWJsZW0BIG5vbWluYXRvcnMgd2lsbCBlZmZlY3RpdmVseSBub3QtZXhpc3QsIHVudGlsIHRoZXkgcmUtc3VibWl0IHRoZWlyIHByZWZlcmVuY2VzIHN1Y2ggdGhhdCBpdAEBIGlzIHdpdGhpbiB0aGUgYm91bmRzIG9mIHRoZSBuZXdseSBzZXQgYENvbmZpZzo6TWF4Tm9taW5hdGlvbnNgLgBhASBUaGlzIGltcGxpZXMgdGhhdCBgOjppdGVyX2tleXMoKS5jb3VudCgpYCBhbmQgYDo6aXRlcigpLmNvdW50KClgIG1pZ2h0IHJldHVybiBkaWZmZXJlbnRtASB2YWx1ZXMgZm9yIHRoaXMgbWFwLiBNb3Jlb3ZlciwgdGhlIG1haW4gYDo6Y291bnQoKWAgaXMgYWxpZ25lZCB3aXRoIHRoZSBmb3JtZXIsIG5hbWVseSB0aGVsIG51bWJlciBvZiBrZXlzIHRoYXQgZXhpc3QuAG0BIExhc3RseSwgaWYgYW55IG9mIHRoZSBub21pbmF0b3JzIGJlY29tZSBub24tZGVjb2RhYmxlLCB0aGV5IGNhbiBiZSBjaGlsbGVkIGltbWVkaWF0ZWx5IHZpYbggW2BDYWxsOjpjaGlsbF9vdGhlcmBdIGRpc3BhdGNoYWJsZSBieSBhbnlvbmUuANAgVFdPWC1OT1RFOiBTQUZFIHNpbmNlIGBBY2NvdW50SWRgIGlzIGEgc2VjdXJlIGhhc2guUENvdW50ZXJGb3JOb21pbmF0b3JzAQAQEAAAAAAErENvdW50ZXIgZm9yIHRoZSByZWxhdGVkIGNvdW50ZWQgc3RvcmFnZSBtYXA4VmlydHVhbFN0YWtlcnMAAQQFAIwEABjIIFN0YWtlcnMgd2hvc2UgZnVuZHMgYXJlIG1hbmFnZWQgYnkgb3RoZXIgcGFsbGV0cy4AdQEgVGhpcyBwYWxsZXQgZG9lcyBub3QgYXBwbHkgYW55IGxvY2tzIG9uIHRoZW0sIHRoZXJlZm9yZSB0aGV5IGFyZSBvbmx5IHZpcnR1YWxseSBib25kZWQuIFRoZXltASBhcmUgZXhwZWN0ZWQgdG8gYmUga2V5bGVzcyBhY2NvdW50cyBhbmQgaGVuY2Ugc2hvdWxkIG5vdCBiZSBhbGxvd2VkIHRvIG11dGF0ZSB0aGVpciBsZWRnZXJxASBkaXJlY3RseSB2aWEgdGhpcyBwYWxsZXQuIEluc3RlYWQsIHRoZXNlIGFjY291bnRzIGFyZSBtYW5hZ2VkIGJ5IG90aGVyIHBhbGxldHMgYW5kIGFjY2Vzc2VkKQEgdmlhIGxvdyBsZXZlbCBhcGlzLiBXZSBrZWVwIHRyYWNrIG9mIHRoZW0gdG8gZG8gbWluaW1hbCBpbnRlZ3JpdHkgY2hlY2tzLmBDb3VudGVyRm9yVmlydHVhbFN0YWtlcnMBABAQAAAAAASsQ291bnRlciBmb3IgdGhlIHJlbGF0ZWQgY291bnRlZCBzdG9yYWdlIG1hcEhNYXhOb21pbmF0b3JzQ291bnQAABAEAAwxASBUaGUgbWF4aW11bSBub21pbmF0b3IgY291bnQgYmVmb3JlIHdlIHN0b3AgYWxsb3dpbmcgbmV3IHZhbGlkYXRvcnMgdG8gam9pbi4A0CBXaGVuIHRoaXMgdmFsdWUgaXMgbm90IHNldCwgbm8gbGltaXRzIGFyZSBlbmZvcmNlZC4oQ3VycmVudEVyYQAAEAQAEFwgVGhlIGN1cnJlbnQgZXJhIGluZGV4LgBlASBUaGlzIGlzIHRoZSBsYXRlc3QgcGxhbm5lZCBlcmEsIGRlcGVuZGluZyBvbiBob3cgdGhlIFNlc3Npb24gcGFsbGV0IHF1ZXVlcyB0aGUgdmFsaWRhdG9ygCBzZXQsIGl0IG1pZ2h0IGJlIGFjdGl2ZSBvciBub3QuJEFjdGl2ZUVyYQAA6QgEABDYIFRoZSBhY3RpdmUgZXJhIGluZm9ybWF0aW9uLCBpdCBob2xkcyBpbmRleCBhbmQgc3RhcnQuAFkBIFRoZSBhY3RpdmUgZXJhIGlzIHRoZSBlcmEgYmVpbmcgY3VycmVudGx5IHJld2FyZGVkLiBWYWxpZGF0b3Igc2V0IG9mIHRoaXMgZXJhIG11c3QgYmWsIGVxdWFsIHRvIFtgU2Vzc2lvbkludGVyZmFjZTo6dmFsaWRhdG9yc2BdLlRFcmFzU3RhcnRTZXNzaW9uSW5kZXgAAQQFEBAEABBVASBUaGUgc2Vzc2lvbiBpbmRleCBhdCB3aGljaCB0aGUgZXJhIHN0YXJ0IGZvciB0aGUgbGFzdCBbYENvbmZpZzo6SGlzdG9yeURlcHRoYF0gZXJhcy4AYQEgTm90ZTogVGhpcyB0cmFja3MgdGhlIHN0YXJ0aW5nIHNlc3Npb24gKGkuZS4gc2Vzc2lvbiBpbmRleCB3aGVuIGVyYSBzdGFydCBiZWluZyBhY3RpdmUp8CBmb3IgdGhlIGVyYXMgaW4gYFtDdXJyZW50RXJhIC0gSElTVE9SWV9ERVBUSCwgQ3VycmVudEVyYV1gLixFcmFzU3Rha2VycwEBCAUF8Qj1CAwAAAAgeCBFeHBvc3VyZSBvZiB2YWxpZGF0b3IgYXQgZXJhLgBhASBUaGlzIGlzIGtleWVkIGZpcnN0IGJ5IHRoZSBlcmEgaW5kZXggdG8gYWxsb3cgYnVsayBkZWxldGlvbiBhbmQgdGhlbiB0aGUgc3Rhc2ggYWNjb3VudC4AzCBJcyBpdCByZW1vdmVkIGFmdGVyIFtgQ29uZmlnOjpIaXN0b3J5RGVwdGhgXSBlcmFzLkEBIElmIHN0YWtlcnMgaGFzbid0IGJlZW4gc2V0IG9yIGhhcyBiZWVuIHJlbW92ZWQgdGhlbiBlbXB0eSBleHBvc3VyZSBpcyByZXR1cm5lZC4AKQEgTm90ZTogRGVwcmVjYXRlZCBzaW5jZSB2MTQuIFVzZSBgRXJhSW5mb2AgaW5zdGVhZCB0byB3b3JrIHdpdGggZXhwb3N1cmVzLkxFcmFzU3Rha2Vyc092ZXJ2aWV3AAEIBQXxCAEJBAAwuCBTdW1tYXJ5IG9mIHZhbGlkYXRvciBleHBvc3VyZSBhdCBhIGdpdmVuIGVyYS4AcQEgVGhpcyBjb250YWlucyB0aGUgdG90YWwgc3Rha2UgaW4gc3VwcG9ydCBvZiB0aGUgdmFsaWRhdG9yIGFuZCB0aGVpciBvd24gc3Rha2UuIEluIGFkZGl0aW9uLHUBIGl0IGNhbiBhbHNvIGJlIHVzZWQgdG8gZ2V0IHRoZSBudW1iZXIgb2Ygbm9taW5hdG9ycyBiYWNraW5nIHRoaXMgdmFsaWRhdG9yIGFuZCB0aGUgbnVtYmVyIG9maQEgZXhwb3N1cmUgcGFnZXMgdGhleSBhcmUgZGl2aWRlZCBpbnRvLiBUaGUgcGFnZSBjb3VudCBpcyB1c2VmdWwgdG8gZGV0ZXJtaW5lIHRoZSBudW1iZXIgb2asIHBhZ2VzIG9mIHJld2FyZHMgdGhhdCBuZWVkcyB0byBiZSBjbGFpbWVkLgBhASBUaGlzIGlzIGtleWVkIGZpcnN0IGJ5IHRoZSBlcmEgaW5kZXggdG8gYWxsb3cgYnVsayBkZWxldGlvbiBhbmQgdGhlbiB0aGUgc3Rhc2ggYWNjb3VudC6sIFNob3VsZCBvbmx5IGJlIGFjY2Vzc2VkIHRocm91Z2ggYEVyYUluZm9gLgDMIElzIGl0IHJlbW92ZWQgYWZ0ZXIgW2BDb25maWc6Okhpc3RvcnlEZXB0aGBdIGVyYXMuQQEgSWYgc3Rha2VycyBoYXNuJ3QgYmVlbiBzZXQgb3IgaGFzIGJlZW4gcmVtb3ZlZCB0aGVuIGVtcHR5IG92ZXJ2aWV3IGlzIHJldHVybmVkLkhFcmFzU3Rha2Vyc0NsaXBwZWQBAQgFBfEI9QgMAAAAQJggQ2xpcHBlZCBFeHBvc3VyZSBvZiB2YWxpZGF0b3IgYXQgZXJhLgBlASBOb3RlOiBUaGlzIGlzIGRlcHJlY2F0ZWQsIHNob3VsZCBiZSB1c2VkIGFzIHJlYWQtb25seSBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUuMQEgTmV3IGBFeHBvc3VyZWBzIGFyZSBzdG9yZWQgaW4gYSBwYWdlZCBtYW5uZXIgaW4gYEVyYXNTdGFrZXJzUGFnZWRgIGluc3RlYWQuAFkBIFRoaXMgaXMgc2ltaWxhciB0byBbYEVyYXNTdGFrZXJzYF0gYnV0IG51bWJlciBvZiBub21pbmF0b3JzIGV4cG9zZWQgaXMgcmVkdWNlZCB0byB0aGWoIGBUOjpNYXhFeHBvc3VyZVBhZ2VTaXplYCBiaWdnZXN0IHN0YWtlcnMuHQEgKE5vdGU6IHRoZSBmaWVsZCBgdG90YWxgIGFuZCBgb3duYCBvZiB0aGUgZXhwb3N1cmUgcmVtYWlucyB1bmNoYW5nZWQpLvQgVGhpcyBpcyB1c2VkIHRvIGxpbWl0IHRoZSBpL28gY29zdCBmb3IgdGhlIG5vbWluYXRvciBwYXlvdXQuAF0BIFRoaXMgaXMga2V5ZWQgZmlzdCBieSB0aGUgZXJhIGluZGV4IHRvIGFsbG93IGJ1bGsgZGVsZXRpb24gYW5kIHRoZW4gdGhlIHN0YXNoIGFjY291bnQuAMwgSXQgaXMgcmVtb3ZlZCBhZnRlciBbYENvbmZpZzo6SGlzdG9yeURlcHRoYF0gZXJhcy5BASBJZiBzdGFrZXJzIGhhc24ndCBiZWVuIHNldCBvciBoYXMgYmVlbiByZW1vdmVkIHRoZW4gZW1wdHkgZXhwb3N1cmUgaXMgcmV0dXJuZWQuACkBIE5vdGU6IERlcHJlY2F0ZWQgc2luY2UgdjE0LiBVc2UgYEVyYUluZm9gIGluc3RlYWQgdG8gd29yayB3aXRoIGV4cG9zdXJlcy5ARXJhc1N0YWtlcnNQYWdlZAABDAUFBQUJCQkEABjAIFBhZ2luYXRlZCBleHBvc3VyZSBvZiBhIHZhbGlkYXRvciBhdCBnaXZlbiBlcmEuAHEBIFRoaXMgaXMga2V5ZWQgZmlyc3QgYnkgdGhlIGVyYSBpbmRleCB0byBhbGxvdyBidWxrIGRlbGV0aW9uLCB0aGVuIHN0YXNoIGFjY291bnQgYW5kIGZpbmFsbHnUIHRoZSBwYWdlLiBTaG91bGQgb25seSBiZSBhY2Nlc3NlZCB0aHJvdWdoIGBFcmFJbmZvYC4A1CBUaGlzIGlzIGNsZWFyZWQgYWZ0ZXIgW2BDb25maWc6Okhpc3RvcnlEZXB0aGBdIGVyYXMuOENsYWltZWRSZXdhcmRzAQEIBQXxCOUBBAAY3CBIaXN0b3J5IG9mIGNsYWltZWQgcGFnZWQgcmV3YXJkcyBieSBlcmEgYW5kIHZhbGlkYXRvci4AaQEgVGhpcyBpcyBrZXllZCBieSBlcmEgYW5kIHZhbGlkYXRvciBzdGFzaCB3aGljaCBtYXBzIHRvIHRoZSBzZXQgb2YgcGFnZSBpbmRleGVzIHdoaWNoIGhhdmU4IGJlZW4gY2xhaW1lZC4AzCBJdCBpcyByZW1vdmVkIGFmdGVyIFtgQ29uZmlnOjpIaXN0b3J5RGVwdGhgXSBlcmFzLkhFcmFzVmFsaWRhdG9yUHJlZnMBAQgFBfEIsAgAABQRASBTaW1pbGFyIHRvIGBFcmFzU3Rha2Vyc2AsIHRoaXMgaG9sZHMgdGhlIHByZWZlcmVuY2VzIG9mIHZhbGlkYXRvcnMuAGEBIFRoaXMgaXMga2V5ZWQgZmlyc3QgYnkgdGhlIGVyYSBpbmRleCB0byBhbGxvdyBidWxrIGRlbGV0aW9uIGFuZCB0aGVuIHRoZSBzdGFzaCBhY2NvdW50LgDMIElzIGl0IHJlbW92ZWQgYWZ0ZXIgW2BDb25maWc6Okhpc3RvcnlEZXB0aGBdIGVyYXMuTEVyYXNWYWxpZGF0b3JSZXdhcmQAAQQFEBgEAAwtASBUaGUgdG90YWwgdmFsaWRhdG9yIGVyYSBwYXlvdXQgZm9yIHRoZSBsYXN0IFtgQ29uZmlnOjpIaXN0b3J5RGVwdGhgXSBlcmFzLgAhASBFcmFzIHRoYXQgaGF2ZW4ndCBmaW5pc2hlZCB5ZXQgb3IgaGFzIGJlZW4gcmVtb3ZlZCBkb2Vzbid0IGhhdmUgcmV3YXJkLkBFcmFzUmV3YXJkUG9pbnRzAQEEBRANCRQAAAAAAAjQIFJld2FyZHMgZm9yIHRoZSBsYXN0IFtgQ29uZmlnOjpIaXN0b3J5RGVwdGhgXSBlcmFzLiUBIElmIHJld2FyZCBoYXNuJ3QgYmVlbiBzZXQgb3IgaGFzIGJlZW4gcmVtb3ZlZCB0aGVuIDAgcmV3YXJkIGlzIHJldHVybmVkLjhFcmFzVG90YWxTdGFrZQEBBAUQGEAAAAAAAAAAAAAAAAAAAAAACBEBIFRoZSB0b3RhbCBhbW91bnQgc3Rha2VkIGZvciB0aGUgbGFzdCBbYENvbmZpZzo6SGlzdG9yeURlcHRoYF0gZXJhcy4dASBJZiB0b3RhbCBoYXNuJ3QgYmVlbiBzZXQgb3IgaGFzIGJlZW4gcmVtb3ZlZCB0aGVuIDAgc3Rha2UgaXMgcmV0dXJuZWQuIEZvcmNlRXJhAQC4BAAEVCBNb2RlIG9mIGVyYSBmb3JjaW5nLkBNYXhTdGFrZWRSZXdhcmRzAADhAQQADBkBIE1heGltdW0gc3Rha2VkIHJld2FyZHMsIGkuZS4gdGhlIHBlcmNlbnRhZ2Ugb2YgdGhlIGVyYSBpbmZsYXRpb24gdGhhdGwgaXMgdXNlZCBmb3Igc3Rha2UgcmV3YXJkcy6sIFNlZSBbRXJhIHBheW91dF0oLi9pbmRleC5odG1sI2VyYS1wYXlvdXQpLkxTbGFzaFJld2FyZEZyYWN0aW9uAQCsEAAAAAAM+CBUaGUgcGVyY2VudGFnZSBvZiB0aGUgc2xhc2ggdGhhdCBpcyBkaXN0cmlidXRlZCB0byByZXBvcnRlcnMuAOQgVGhlIHJlc3Qgb2YgdGhlIHNsYXNoZWQgdmFsdWUgaXMgaGFuZGxlZCBieSB0aGUgYFNsYXNoYC5MQ2FuY2VsZWRTbGFzaFBheW91dAEAGEAAAAAAAAAAAAAAAAAAAAAACBUBIFRoZSBhbW91bnQgb2YgY3VycmVuY3kgZ2l2ZW4gdG8gcmVwb3J0ZXJzIG9mIGEgc2xhc2ggZXZlbnQgd2hpY2ggd2Fz7CBjYW5jZWxlZCBieSBleHRyYW9yZGluYXJ5IGNpcmN1bXN0YW5jZXMgKGUuZy4gZ292ZXJuYW5jZSkuQFVuYXBwbGllZFNsYXNoZXMBAQQFEB0JBAAExCBBbGwgdW5hcHBsaWVkIHNsYXNoZXMgdGhhdCBhcmUgcXVldWVkIGZvciBsYXRlci4oQm9uZGVkRXJhcwEAyQcEABAlASBBIG1hcHBpbmcgZnJvbSBzdGlsbC1ib25kZWQgZXJhcyB0byB0aGUgZmlyc3Qgc2Vzc2lvbiBpbmRleCBvZiB0aGF0IGVyYS4AyCBNdXN0IGNvbnRhaW5zIGluZm9ybWF0aW9uIGZvciBlcmFzIGZvciB0aGUgcmFuZ2U6vCBgW2FjdGl2ZV9lcmEgLSBib3VuZGluZ19kdXJhdGlvbjsgYWN0aXZlX2VyYV1gTFZhbGlkYXRvclNsYXNoSW5FcmEAAQgFBfEIJQkEAAhFASBBbGwgc2xhc2hpbmcgZXZlbnRzIG9uIHZhbGlkYXRvcnMsIG1hcHBlZCBieSBlcmEgdG8gdGhlIGhpZ2hlc3Qgc2xhc2ggcHJvcG9ydGlvbnAgYW5kIHNsYXNoIHZhbHVlIG9mIHRoZSBlcmEuTE5vbWluYXRvclNsYXNoSW5FcmEAAQgFBfEIGAQABGEBIEFsbCBzbGFzaGluZyBldmVudHMgb24gbm9taW5hdG9ycywgbWFwcGVkIGJ5IGVyYSB0byB0aGUgaGlnaGVzdCBzbGFzaCB2YWx1ZSBvZiB0aGUgZXJhLjRTbGFzaGluZ1NwYW5zAAEEBQApCQQABIwgU2xhc2hpbmcgc3BhbnMgZm9yIHN0YXNoIGFjY291bnRzLiRTcGFuU2xhc2gBAQQFGQktCYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAg9ASBSZWNvcmRzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBtYXhpbXVtIHNsYXNoIG9mIGEgc3Rhc2ggd2l0aGluIGEgc2xhc2hpbmcgc3Bhbiy4IGFzIHdlbGwgYXMgaG93IG11Y2ggcmV3YXJkIGhhcyBiZWVuIHBhaWQgb3V0LlRDdXJyZW50UGxhbm5lZFNlc3Npb24BABAQAAAAAAzoIFRoZSBsYXN0IHBsYW5uZWQgc2Vzc2lvbiBzY2hlZHVsZWQgYnkgdGhlIHNlc3Npb24gcGFsbGV0LgBxASBUaGlzIGlzIGJhc2ljYWxseSBpbiBzeW5jIHdpdGggdGhlIGNhbGwgdG8gW2BwYWxsZXRfc2Vzc2lvbjo6U2Vzc2lvbk1hbmFnZXI6Om5ld19zZXNzaW9uYF0uSERpc2FibGVkVmFsaWRhdG9ycwEA5QEEABx1ASBJbmRpY2VzIG9mIHZhbGlkYXRvcnMgdGhhdCBoYXZlIG9mZmVuZGVkIGluIHRoZSBhY3RpdmUgZXJhLiBUaGUgb2ZmZW5kZXJzIGFyZSBkaXNhYmxlZCBmb3IgYWkBIHdob2xlIGVyYS4gRm9yIHRoaXMgcmVhc29uIHRoZXkgYXJlIGtlcHQgaGVyZSAtIG9ubHkgc3Rha2luZyBwYWxsZXQga25vd3MgYWJvdXQgZXJhcy4gVGhlVQEgaW1wbGVtZW50b3Igb2YgW2BEaXNhYmxpbmdTdHJhdGVneWBdIGRlZmluZXMgaWYgYSB2YWxpZGF0b3Igc2hvdWxkIGJlIGRpc2FibGVkIHdoaWNobQEgaW1wbGljaXRseSBtZWFucyB0aGF0IHRoZSBpbXBsZW1lbnRvciBhbHNvIGNvbnRyb2xzIHRoZSBtYXggbnVtYmVyIG9mIGRpc2FibGVkIHZhbGlkYXRvcnMuAG0BIFRoZSB2ZWMgaXMgYWx3YXlzIGtlcHQgc29ydGVkIHNvIHRoYXQgd2UgY2FuIGZpbmQgd2hldGhlciBhIGdpdmVuIHZhbGlkYXRvciBoYXMgcHJldmlvdXNseXggb2ZmZW5kZWQgdXNpbmcgYmluYXJ5IHNlYXJjaC44Q2hpbGxUaHJlc2hvbGQAAOEBBAAMUQEgVGhlIHRocmVzaG9sZCBmb3Igd2hlbiB1c2VycyBjYW4gc3RhcnQgY2FsbGluZyBgY2hpbGxfb3RoZXJgIGZvciBvdGhlciB2YWxpZGF0b3JzIC9ZASBub21pbmF0b3JzLiBUaGUgdGhyZXNob2xkIGlzIGNvbXBhcmVkIHRvIHRoZSBhY3R1YWwgbnVtYmVyIG9mIHZhbGlkYXRvcnMgLyBub21pbmF0b3JzKQEgKGBDb3VudEZvcipgKSBpbiB0aGUgc3lzdGVtIGNvbXBhcmVkIHRvIHRoZSBjb25maWd1cmVkIG1heCAoYE1heCpDb3VudGApLgHZAQGkGDBIaXN0b3J5RGVwdGgQEFQAAABQjCBOdW1iZXIgb2YgZXJhcyB0byBrZWVwIGluIGhpc3RvcnkuAOggRm9sbG93aW5nIGluZm9ybWF0aW9uIGlzIGtlcHQgZm9yIGVyYXMgaW4gYFtjdXJyZW50X2VyYSAtCQEgSGlzdG9yeURlcHRoLCBjdXJyZW50X2VyYV1gOiBgRXJhc1N0YWtlcnNgLCBgRXJhc1N0YWtlcnNDbGlwcGVkYCwFASBgRXJhc1ZhbGlkYXRvclByZWZzYCwgYEVyYXNWYWxpZGF0b3JSZXdhcmRgLCBgRXJhc1Jld2FyZFBvaW50c2AsRQEgYEVyYXNUb3RhbFN0YWtlYCwgYEVyYXNTdGFydFNlc3Npb25JbmRleGAsIGBDbGFpbWVkUmV3YXJkc2AsIGBFcmFzU3Rha2Vyc1BhZ2VkYCxcIGBFcmFzU3Rha2Vyc092ZXJ2aWV3YC4A5CBNdXN0IGJlIG1vcmUgdGhhbiB0aGUgbnVtYmVyIG9mIGVyYXMgZGVsYXllZCBieSBzZXNzaW9uLvggSS5lLiBhY3RpdmUgZXJhIG11c3QgYWx3YXlzIGJlIGluIGhpc3RvcnkuIEkuZS4gYGFjdGl2ZV9lcmEgPsQgY3VycmVudF9lcmEgLSBoaXN0b3J5X2RlcHRoYCBtdXN0IGJlIGd1YXJhbnRlZWQuABEBIElmIG1pZ3JhdGluZyBhbiBleGlzdGluZyBwYWxsZXQgZnJvbSBzdG9yYWdlIHZhbHVlIHRvIGNvbmZpZyB2YWx1ZSzsIHRoaXMgc2hvdWxkIGJlIHNldCB0byBzYW1lIHZhbHVlIG9yIGdyZWF0ZXIgYXMgaW4gc3RvcmFnZS4AFQEgTm90ZTogYEhpc3RvcnlEZXB0aGAgaXMgdXNlZCBhcyB0aGUgdXBwZXIgYm91bmQgZm9yIHRoZSBgQm91bmRlZFZlY2AtASBpdGVtIGBTdGFraW5nTGVkZ2VyLmxlZ2FjeV9jbGFpbWVkX3Jld2FyZHNgLiBTZXR0aW5nIHRoaXMgdmFsdWUgbG93ZXIgdGhhbtggdGhlIGV4aXN0aW5nIHZhbHVlIGNhbiBsZWFkIHRvIGluY29uc2lzdGVuY2llcyBpbiB0aGUVASBgU3Rha2luZ0xlZGdlcmAgYW5kIHdpbGwgbmVlZCB0byBiZSBoYW5kbGVkIHByb3Blcmx5IGluIGEgbWlncmF0aW9uLvAgVGhlIHRlc3QgYHJlZHVjaW5nX2hpc3RvcnlfZGVwdGhfYWJydXB0YCBzaG93cyB0aGlzIGVmZmVjdC44U2Vzc2lvbnNQZXJFcmEQEAYAAAAEcCBOdW1iZXIgb2Ygc2Vzc2lvbnMgcGVyIGVyYS48Qm9uZGluZ0R1cmF0aW9uEBAcAAAABOQgTnVtYmVyIG9mIGVyYXMgdGhhdCBzdGFrZWQgZnVuZHMgbXVzdCByZW1haW4gYm9uZGVkIGZvci5IU2xhc2hEZWZlckR1cmF0aW9uEBAbAAAAEAEBIE51bWJlciBvZiBlcmFzIHRoYXQgc2xhc2hlcyBhcmUgZGVmZXJyZWQgYnksIGFmdGVyIGNvbXB1dGF0aW9uLgANASBUaGlzIHNob3VsZCBiZSBsZXNzIHRoYW4gdGhlIGJvbmRpbmcgZHVyYXRpb24uIFNldCB0byAwIGlmIHNsYXNoZXMVASBzaG91bGQgYmUgYXBwbGllZCBpbW1lZGlhdGVseSwgd2l0aG91dCBvcHBvcnR1bml0eSBmb3IgaW50ZXJ2ZW50aW9uLkxNYXhFeHBvc3VyZVBhZ2VTaXplEBAAAgAALLAgVGhlIG1heGltdW0gc2l6ZSBvZiBlYWNoIGBUOjpFeHBvc3VyZVBhZ2VgLgApASBBbiBgRXhwb3N1cmVQYWdlYCBpcyB3ZWFrbHkgYm91bmRlZCB0byBhIG1heGltdW0gb2YgYE1heEV4cG9zdXJlUGFnZVNpemVgMCBub21pbmF0b3JzLgAhASBGb3Igb2xkZXIgbm9uLXBhZ2VkIGV4cG9zdXJlLCBhIHJld2FyZCBwYXlvdXQgd2FzIHJlc3RyaWN0ZWQgdG8gdGhlIHRvcCEBIGBNYXhFeHBvc3VyZVBhZ2VTaXplYCBub21pbmF0b3JzLiBUaGlzIGlzIHRvIGxpbWl0IHRoZSBpL28gY29zdCBmb3IgdGhlSCBub21pbmF0b3IgcGF5b3V0LgBZASBOb3RlOiBgTWF4RXhwb3N1cmVQYWdlU2l6ZWAgaXMgdXNlZCB0byBib3VuZCBgQ2xhaW1lZFJld2FyZHNgIGFuZCBpcyB1bnNhZmUgdG8gcmVkdWNlkCB3aXRob3V0IGhhbmRsaW5nIGl0IGluIGEgbWlncmF0aW9uLkhNYXhVbmxvY2tpbmdDaHVua3MQECAAAAAoBQEgVGhlIG1heGltdW0gbnVtYmVyIG9mIGB1bmxvY2tpbmdgIGNodW5rcyBhIFtgU3Rha2luZ0xlZGdlcmBdIGNhbgkBIGhhdmUuIEVmZmVjdGl2ZWx5IGRldGVybWluZXMgaG93IG1hbnkgdW5pcXVlIGVyYXMgYSBzdGFrZXIgbWF5IGJlOCB1bmJvbmRpbmcgaW4uAPggTm90ZTogYE1heFVubG9ja2luZ0NodW5rc2AgaXMgdXNlZCBhcyB0aGUgdXBwZXIgYm91bmQgZm9yIHRoZQEBIGBCb3VuZGVkVmVjYCBpdGVtIGBTdGFraW5nTGVkZ2VyLnVubG9ja2luZ2AuIFNldHRpbmcgdGhpcyB2YWx1ZQUBIGxvd2VyIHRoYW4gdGhlIGV4aXN0aW5nIHZhbHVlIGNhbiBsZWFkIHRvIGluY29uc2lzdGVuY2llcyBpbiB0aGUJASBgU3Rha2luZ0xlZGdlcmAgYW5kIHdpbGwgbmVlZCB0byBiZSBoYW5kbGVkIHByb3Blcmx5IGluIGEgcnVudGltZQUBIG1pZ3JhdGlvbi4gVGhlIHRlc3QgYHJlZHVjaW5nX21heF91bmxvY2tpbmdfY2h1bmtzX2FicnVwdGAgc2hvd3M0IHRoaXMgZWZmZWN0LgExCQcAIE9mZmVuY2VzASBPZmZlbmNlcwgcUmVwb3J0cwABBAU0NQkEAARJASBUaGUgcHJpbWFyeSBzdHJ1Y3R1cmUgdGhhdCBob2xkcyBhbGwgb2ZmZW5jZSByZWNvcmRzIGtleWVkIGJ5IHJlcG9ydCBpZGVudGlmaWVycy5YQ29uY3VycmVudFJlcG9ydHNJbmRleAEBCAUFPQmVAQQABCkBIEEgdmVjdG9yIG9mIHJlcG9ydHMgb2YgdGhlIHNhbWUga2luZCB0aGF0IGhhcHBlbmVkIGF0IHRoZSBzYW1lIHRpbWUgc2xvdC4AAbwAAAgAKEhpc3RvcmljYWwBKEhpc3RvcmljYWwISEhpc3RvcmljYWxTZXNzaW9ucwABBAUQNQgEAARdASBNYXBwaW5nIGZyb20gaGlzdG9yaWNhbCBzZXNzaW9uIGluZGljZXMgdG8gc2Vzc2lvbi1kYXRhIHJvb3QgaGFzaCBhbmQgdmFsaWRhdG9yIGNvdW50LixTdG9yZWRSYW5nZQAAgAQABOQgVGhlIHJhbmdlIG9mIGhpc3RvcmljYWwgc2Vzc2lvbnMgd2Ugc3RvcmUuIFtmaXJzdCwgbGFzdCkAAAAAIQAcU2Vzc2lvbgEcU2Vzc2lvbhwoVmFsaWRhdG9ycwEA0QEEAAR8IFRoZSBjdXJyZW50IHNldCBvZiB2YWxpZGF0b3JzLjBDdXJyZW50SW5kZXgBABAQAAAAAAR4IEN1cnJlbnQgaW5kZXggb2YgdGhlIHNlc3Npb24uNFF1ZXVlZENoYW5nZWQBACAEAAg5ASBUcnVlIGlmIHRoZSB1bmRlcmx5aW5nIGVjb25vbWljIGlkZW50aXRpZXMgb3Igd2VpZ2h0aW5nIGJlaGluZCB0aGUgdmFsaWRhdG9yc6QgaGFzIGNoYW5nZWQgaW4gdGhlIHF1ZXVlZCB2YWxpZGF0b3Igc2V0LihRdWV1ZWRLZXlzAQBBCQQACD0BIFRoZSBxdWV1ZWQga2V5cyBmb3IgdGhlIG5leHQgc2Vzc2lvbi4gV2hlbiB0aGUgbmV4dCBzZXNzaW9uIGJlZ2lucywgdGhlc2Uga2V5c+Agd2lsbCBiZSB1c2VkIHRvIGRldGVybWluZSB0aGUgdmFsaWRhdG9yJ3Mgc2Vzc2lvbiBrZXlzLkhEaXNhYmxlZFZhbGlkYXRvcnMBAOUBBAAUgCBJbmRpY2VzIG9mIGRpc2FibGVkIHZhbGlkYXRvcnMuAD0BIFRoZSB2ZWMgaXMgYWx3YXlzIGtlcHQgc29ydGVkIHNvIHRoYXQgd2UgY2FuIGZpbmQgd2hldGhlciBhIGdpdmVuIHZhbGlkYXRvciBpcz0BIGRpc2FibGVkIHVzaW5nIGJpbmFyeSBzZWFyY2guIEl0IGdldHMgY2xlYXJlZCB3aGVuIGBvbl9zZXNzaW9uX2VuZGluZ2AgcmV0dXJuc2QgYSBuZXcgc2V0IG9mIGlkZW50aXRpZXMuIE5leHRLZXlzAAEEBQAZAgQABJwgVGhlIG5leHQgc2Vzc2lvbiBrZXlzIGZvciBhIHZhbGlkYXRvci4gS2V5T3duZXIAAQQFSQkABAAECQEgVGhlIG93bmVyIG9mIGEga2V5LiBUaGUga2V5IGlzIHRoZSBgS2V5VHlwZUlkYCArIHRoZSBlbmNvZGVkIGtleS4BFQIBxAABUQkJABxHcmFuZHBhARxHcmFuZHBhHBRTdGF0ZQEAVQkEAASQIFN0YXRlIG9mIHRoZSBjdXJyZW50IGF1dGhvcml0eSBzZXQuNFBlbmRpbmdDaGFuZ2UAAFkJBAAExCBQZW5kaW5nIGNoYW5nZTogKHNpZ25hbGVkIGF0LCBzY2hlZHVsZWQgY2hhbmdlKS4oTmV4dEZvcmNlZAAAEAQABLwgbmV4dCBibG9jayBudW1iZXIgd2hlcmUgd2UgY2FuIGZvcmNlIGEgY2hhbmdlLhxTdGFsbGVkAACABAAEkCBgdHJ1ZWAgaWYgd2UgYXJlIGN1cnJlbnRseSBzdGFsbGVkLjBDdXJyZW50U2V0SWQBADAgAAAAAAAAAAAIXQEgVGhlIG51bWJlciBvZiBjaGFuZ2VzIChib3RoIGluIHRlcm1zIG9mIGtleXMgYW5kIHVuZGVybHlpbmcgZWNvbm9taWMgcmVzcG9uc2liaWxpdGllcynEIGluIHRoZSAic2V0IiBvZiBHcmFuZHBhIHZhbGlkYXRvcnMgZnJvbSBnZW5lc2lzLjBTZXRJZFNlc3Npb24AAQQFMBAEAChZASBBIG1hcHBpbmcgZnJvbSBncmFuZHBhIHNldCBJRCB0byB0aGUgaW5kZXggb2YgdGhlICptb3N0IHJlY2VudCogc2Vzc2lvbiBmb3Igd2hpY2ggaXRzaCBtZW1iZXJzIHdlcmUgcmVzcG9uc2libGUuAEUBIFRoaXMgaXMgb25seSB1c2VkIGZvciB2YWxpZGF0aW5nIGVxdWl2b2NhdGlvbiBwcm9vZnMuIEFuIGVxdWl2b2NhdGlvbiBwcm9vZiBtdXN0TQEgY29udGFpbnMgYSBrZXktb3duZXJzaGlwIHByb29mIGZvciBhIGdpdmVuIHNlc3Npb24sIHRoZXJlZm9yZSB3ZSBuZWVkIGEgd2F5IHRvIHRpZUUBIHRvZ2V0aGVyIHNlc3Npb25zIGFuZCBHUkFORFBBIHNldCBpZHMsIGkuZS4gd2UgbmVlZCB0byB2YWxpZGF0ZSB0aGF0IGEgdmFsaWRhdG9yQQEgd2FzIHRoZSBvd25lciBvZiBhIGdpdmVuIGtleSBvbiBhIGdpdmVuIHNlc3Npb24sIGFuZCB3aGF0IHRoZSBhY3RpdmUgc2V0IElEIHdhc1QgZHVyaW5nIHRoYXQgc2Vzc2lvbi4AuCBUV09YLU5PVEU6IGBTZXRJZGAgaXMgbm90IHVuZGVyIHVzZXIgY29udHJvbC4sQXV0aG9yaXRpZXMBAF0JBAAEhCBUaGUgY3VycmVudCBsaXN0IG9mIGF1dGhvcml0aWVzLgExAgHIDDhNYXhBdXRob3JpdGllcxAQoIYBAARcIE1heCBBdXRob3JpdGllcyBpbiB1c2U0TWF4Tm9taW5hdG9ycxAQAAIAAATUIFRoZSBtYXhpbXVtIG51bWJlciBvZiBub21pbmF0b3JzIGZvciBlYWNoIHZhbGlkYXRvci5YTWF4U2V0SWRTZXNzaW9uRW50cmllczAgqAAAAAAAAAAYOQEgVGhlIG1heGltdW0gbnVtYmVyIG9mIGVudHJpZXMgdG8ga2VlcCBpbiB0aGUgc2V0IGlkIHRvIHNlc3Npb24gaW5kZXggbWFwcGluZy4AMQEgU2luY2UgdGhlIGBTZXRJZFNlc3Npb25gIG1hcCBpcyBvbmx5IHVzZWQgZm9yIHZhbGlkYXRpbmcgZXF1aXZvY2F0aW9ucyB0aGlzKQEgdmFsdWUgc2hvdWxkIHJlbGF0ZSB0byB0aGUgYm9uZGluZyBkdXJhdGlvbiBvZiB3aGF0ZXZlciBzdGFraW5nIHN5c3RlbSBpczUBIGJlaW5nIHVzZWQgKGlmIGFueSkuIElmIGVxdWl2b2NhdGlvbiBoYW5kbGluZyBpcyBub3QgZW5hYmxlZCB0aGVuIHRoaXMgdmFsdWU0IGNhbiBiZSB6ZXJvLgFhCQsASEF1dGhvcml0eURpc2NvdmVyeQFIQXV0aG9yaXR5RGlzY292ZXJ5CBBLZXlzAQBlCQQABIwgS2V5cyBvZiB0aGUgY3VycmVudCBhdXRob3JpdHkgc2V0LiBOZXh0S2V5cwEAZQkEAASAIEtleXMgb2YgdGhlIG5leHQgYXV0aG9yaXR5IHNldC4AAAAADQAgVHJlYXN1cnkBIFRyZWFzdXJ5GDRQcm9wb3NhbENvdW50AQAQEAAAAAAEpCBOdW1iZXIgb2YgcHJvcG9zYWxzIHRoYXQgaGF2ZSBiZWVuIG1hZGUuJFByb3Bvc2FscwABBAUQbQkEAAR8IFByb3Bvc2FscyB0aGF0IGhhdmUgYmVlbiBtYWRlLixEZWFjdGl2YXRlZAEAGEAAAAAAAAAAAAAAAAAAAAAABPAgVGhlIGFtb3VudCB3aGljaCBoYXMgYmVlbiByZXBvcnRlZCBhcyBpbmFjdGl2ZSB0byBDdXJyZW5jeS4kQXBwcm92YWxzAQBxCQQABPggUHJvcG9zYWwgaW5kaWNlcyB0aGF0IGhhdmUgYmVlbiBhcHByb3ZlZCBidXQgbm90IHlldCBhd2FyZGVkLihTcGVuZENvdW50AQAQEAAAAAAEpCBUaGUgY291bnQgb2Ygc3BlbmRzIHRoYXQgaGF2ZSBiZWVuIG1hZGUuGFNwZW5kcwABBAUQdQkEAATQIFNwZW5kcyB0aGF0IGhhdmUgYmVlbiBhcHByb3ZlZCBhbmQgYmVpbmcgcHJvY2Vzc2VkLgFdAgHYFCxTcGVuZFBlcmlvZBAQAEYFAASIIFBlcmlvZCBiZXR3ZWVuIHN1Y2Nlc3NpdmUgc3BlbmRzLhBCdXJufQkQECcAAAQRASBQZXJjZW50YWdlIG9mIHNwYXJlIGZ1bmRzIChpZiBhbnkpIHRoYXQgYXJlIGJ1cm50IHBlciBzcGVuZCBwZXJpb2QuIFBhbGxldElkgQkgcHkvdHJzcnkEGQEgVGhlIHRyZWFzdXJ5J3MgcGFsbGV0IGlkLCB1c2VkIGZvciBkZXJpdmluZyBpdHMgc292ZXJlaWduIGFjY291bnQgSUQuME1heEFwcHJvdmFscxAQZAAAAAwVASBUaGUgbWF4aW11bSBudW1iZXIgb2YgYXBwcm92YWxzIHRoYXQgY2FuIHdhaXQgaW4gdGhlIHNwZW5kaW5nIHF1ZXVlLgBNASBOT1RFOiBUaGlzIHBhcmFtZXRlciBpcyBhbHNvIHVzZWQgd2l0aGluIHRoZSBCb3VudGllcyBQYWxsZXQgZXh0ZW5zaW9uIGlmIGVuYWJsZWQuMFBheW91dFBlcmlvZBAQgJcGAAQZASBUaGUgcGVyaW9kIGR1cmluZyB3aGljaCBhbiBhcHByb3ZlZCB0cmVhc3VyeSBzcGVuZCBoYXMgdG8gYmUgY2xhaW1lZC4BhQkTAEBDb252aWN0aW9uVm90aW5nAUBDb252aWN0aW9uVm90aW5nCCRWb3RpbmdGb3IBAQgFBYkJjQnYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACHUBIEFsbCB2b3RpbmcgZm9yIGEgcGFydGljdWxhciB2b3RlciBpbiBhIHBhcnRpY3VsYXIgdm90aW5nIGNsYXNzLiBXZSBzdG9yZSB0aGUgYmFsYW5jZSBmb3IgdGhlnCBudW1iZXIgb2Ygdm90ZXMgdGhhdCB3ZSBoYXZlIHJlY29yZGVkLjRDbGFzc0xvY2tzRm9yAQEEBQCtCQQADGkBIFRoZSB2b3RpbmcgY2xhc3NlcyB3aGljaCBoYXZlIGEgbm9uLXplcm8gbG9jayByZXF1aXJlbWVudCBhbmQgdGhlIGxvY2sgYW1vdW50cyB3aGljaCB0aGV5bQEgcmVxdWlyZS4gVGhlIGFjdHVhbCBhbW91bnQgbG9ja2VkIG9uIGJlaGFsZiBvZiB0aGlzIHBhbGxldCBzaG91bGQgYWx3YXlzIGJlIHRoZSBtYXhpbXVtIG9mLCB0aGlzIGxpc3QuAWUCAWUBCCBNYXhWb3RlcxAQAAIAABDwIFRoZSBtYXhpbXVtIG51bWJlciBvZiBjb25jdXJyZW50IHZvdGVzIGFuIGFjY291bnQgbWF5IGhhdmUuAFUBIEFsc28gdXNlZCB0byBjb21wdXRlIHdlaWdodCwgYW4gb3Zlcmx5IGxhcmdlIHZhbHVlIGNhbiBsZWFkIHRvIGV4dHJpbnNpY3Mgd2l0aCBsYXJnZcAgd2VpZ2h0IGVzdGltYXRpb246IHNlZSBgZGVsZWdhdGVgIGZvciBpbnN0YW5jZS5EVm90ZUxvY2tpbmdQZXJpb2QQEMCJAQAQkCBUaGUgbWluaW11bSBwZXJpb2Qgb2Ygdm90ZSBsb2NraW5nLgBlASBJdCBzaG91bGQgYmUgbm8gc2hvcnRlciB0aGFuIGVuYWN0bWVudCBwZXJpb2QgdG8gZW5zdXJlIHRoYXQgaW4gdGhlIGNhc2Ugb2YgYW4gYXBwcm92YWwsSQEgdGhvc2Ugc3VjY2Vzc2Z1bCB2b3RlcnMgYXJlIGxvY2tlZCBpbnRvIHRoZSBjb25zZXF1ZW5jZXMgdGhhdCB0aGVpciB2b3RlcyBlbnRhaWwuAbkJFAAkUmVmZXJlbmRhASRSZWZlcmVuZGEUPFJlZmVyZW5kdW1Db3VudAEAEBAAAAAABDEBIFRoZSBuZXh0IGZyZWUgcmVmZXJlbmR1bSBpbmRleCwgYWthIHRoZSBudW1iZXIgb2YgcmVmZXJlbmRhIHN0YXJ0ZWQgc28gZmFyLkRSZWZlcmVuZHVtSW5mb0ZvcgABBAIQvQkEAAS0IEluZm9ybWF0aW9uIGNvbmNlcm5pbmcgYW55IGdpdmVuIHJlZmVyZW5kdW0uKFRyYWNrUXVldWUBAQQFbQHdCQQAEF0BIFRoZSBzb3J0ZWQgbGlzdCBvZiByZWZlcmVuZGEgcmVhZHkgdG8gYmUgZGVjaWRlZCBidXQgbm90IHlldCBiZWluZyBkZWNpZGVkLCBvcmRlcmVkIGJ5fCBjb252aWN0aW9uLXdlaWdodGVkIGFwcHJvdmFscy4AQQEgVGhpcyBzaG91bGQgYmUgZW1wdHkgaWYgYERlY2lkaW5nQ291bnRgIGlzIGxlc3MgdGhhbiBgVHJhY2tJbmZvOjptYXhfZGVjaWRpbmdgLjREZWNpZGluZ0NvdW50AQEEBW0BEBAAAAAABMQgVGhlIG51bWJlciBvZiByZWZlcmVuZGEgYmVpbmcgZGVjaWRlZCBjdXJyZW50bHkuKE1ldGFkYXRhT2YAAQQCEDQEABgFASBUaGUgbWV0YWRhdGEgaXMgYSBnZW5lcmFsIGluZm9ybWF0aW9uIGNvbmNlcm5pbmcgdGhlIHJlZmVyZW5kdW0uSQEgVGhlIGBIYXNoYCByZWZlcnMgdG8gdGhlIHByZWltYWdlIG9mIHRoZSBgUHJlaW1hZ2VzYCBwcm92aWRlciB3aGljaCBjYW4gYmUgYSBKU09OiCBkdW1wIG9yIElQRlMgaGFzaCBvZiBhIEpTT04gZmlsZS4AdQEgQ29uc2lkZXIgYSBnYXJiYWdlIGNvbGxlY3Rpb24gZm9yIGEgbWV0YWRhdGEgb2YgZmluaXNoZWQgcmVmZXJlbmR1bXMgdG8gYHVucmVxdWVzdGAgKHJlbW92ZSlEIGxhcmdlIHByZWltYWdlcy4BeQIBaQEURFN1Ym1pc3Npb25EZXBvc2l0GEAA5AtUAgAAAAAAAAAAAAAABDUBIFRoZSBtaW5pbXVtIGFtb3VudCB0byBiZSB1c2VkIGFzIGEgZGVwb3NpdCBmb3IgYSBwdWJsaWMgcmVmZXJlbmR1bSBwcm9wb3NhbC4kTWF4UXVldWVkEBBkAAAABOQgTWF4aW11bSBzaXplIG9mIHRoZSByZWZlcmVuZHVtIHF1ZXVlIGZvciBhIHNpbmdsZSB0cmFjay5EVW5kZWNpZGluZ1RpbWVvdXQQEIATAwAIVQEgVGhlIG51bWJlciBvZiBibG9ja3MgYWZ0ZXIgc3VibWlzc2lvbiB0aGF0IGEgcmVmZXJlbmR1bSBtdXN0IGJlZ2luIGJlaW5nIGRlY2lkZWQgYnku5CBPbmNlIHRoaXMgcGFzc2VzLCB0aGVuIGFueW9uZSBtYXkgY2FuY2VsIHRoZSByZWZlcmVuZHVtLjRBbGFybUludGVydmFsEBABAAAADF0BIFF1YW50aXphdGlvbiBsZXZlbCBmb3IgdGhlIHJlZmVyZW5kdW0gd2FrZXVwIHNjaGVkdWxlci4gQSBoaWdoZXIgbnVtYmVyIHdpbGwgcmVzdWx0IGluXQEgZmV3ZXIgc3RvcmFnZSByZWFkcy93cml0ZXMgbmVlZGVkIGZvciBzbWFsbGVyIHZvdGVycywgYnV0IGFsc28gcmVzdWx0IGluIGRlbGF5cyB0byB0aGVVASBhdXRvbWF0aWMgcmVmZXJlbmR1bSBzdGF0dXMgY2hhbmdlcy4gRXhwbGljaXQgc2VydmljaW5nIGluc3RydWN0aW9ucyBhcmUgdW5hZmZlY3RlZC4YVHJhY2tz6QkZF0AAABByb290AQAAAACAxqR+jQMAAAAAAAAAAACwBAAAACcGAEA4AABAOAAAApDXPg0AAAAAV0PeEwAAAABUQ94TAAAAAAAAypo7AAAAAABlzR0BAEh3aGl0ZWxpc3RlZF9jYWxsZXJkAAAAAEB6EPNaAAAAAAAAAAAAACwBAAAAJwYAZAAAAGQAAAAC7JclEAAAAAB7VzwXAAAAAEI5LxIAAAAAAg4AhAAAAAAA1uYfAQAAAAA5YnkCAAAAAAIAPHdpc2hfZm9yX2NoYW5nZQoAAAAAgPQg5rUAAAAAAAAAAAAAsAQAAAAnBgBAOAAAZAAAAAKQ1z4NAAAAAFdD3hMAAAAAVEPeEwAAAAAAAMqaOwAAAAAAZc0dCgA0c3Rha2luZ19hZG1pbgoAAAAAID2IeS0AAAAAAAAAAAAAsAQAAAAnBgAIBwAAZAAAAADJQzAkAGXNHQDKmjsCXW94AAAAAADoLu0AAAAAAIxoif//////CwAkdHJlYXN1cmVyCgAAAACgck4YCQAAAAAAAAAAAACwBAAAACcGAMCJAQBAOAAAApDXPg0AAAAAV0PeEwAAAABUQ94TAAAAAAAAypo7AAAAAABlzR0MACxsZWFzZV9hZG1pbgoAAAAAID2IeS0AAAAAAAAAAAAAsAQAAAAnBgAIBwAAZAAAAADJQzAkAGXNHQDKmjsCXW94AAAAAADoLu0AAAAAAIxoif//////DQBAZmVsbG93c2hpcF9hZG1pbgoAAAAAID2IeS0AAAAAAAAAAAAAsAQAAAAnBgAIBwAAZAAAAADJQzAkAGXNHQDKmjsCXW94AAAAAADoLu0AAAAAAIxoif//////DgA0Z2VuZXJhbF9hZG1pbgoAAAAAID2IeS0AAAAAAAAAAAAAsAQAAAAnBgAIBwAAZAAAAAKQ1z4NAAAAAFdD3hMAAAAAVEPeEwAAAAACWaL0AgAAAACjKWsFAAAAAC5rSv3/////DwA0YXVjdGlvbl9hZG1pbgoAAAAAID2IeS0AAAAAAAAAAAAAsAQAAAAnBgAIBwAAZAAAAAKQ1z4NAAAAAFdD3hMAAAAAVEPeEwAAAAACWaL0AgAAAACjKWsFAAAAAC5rSv3/////FABQcmVmZXJlbmR1bV9jYW5jZWxsZXLoAwAAAEB6EPNaAAAAAAAAAAAAALAEAADAiQEACAcAAGQAAAAAyUMwJABlzR0Aypo7Al1veAAAAAAA6C7tAAAAAACMaIn//////xUARHJlZmVyZW5kdW1fa2lsbGVy6AMAAABAY1K/xgEAAAAAAAAAAACwBAAAACcGAAgHAABkAAAAAMlDMCQAZc0dAMqaOwJdb3gAAAAAAOgu7QAAAAAAjGiJ//////8eADBzbWFsbF90aXBwZXLIAAAAAOQLVAIAAAAAAAAAAAAAAAoAAADAiQEAZAAAAAoAAAAASZFJFQBlzR0Aypo7Avm6GAAAAAAAKk0xAAAAAABrWef//////x8AKGJpZ190aXBwZXJkAAAAAOh2SBcAAAAAAAAAAAAAAGQAAADAiQEAWAIAAGQAAAAASZFJFQBlzR0Aypo7AmlPPwAAAAAANZZ9AAAAAADlNMH//////yAANHNtYWxsX3NwZW5kZXIyAAAAABCl1OgAAAAAAAAAAAAAAGAJAAAAJwYAgHAAAEA4AAAAyUMwJABlzR0Aypo7Al1veAAAAAAA6C7tAAAAAACMaIn//////yEAOG1lZGl1bV9zcGVuZGVyMgAAAAAgSqnRAQAAAAAAAAAAAABgCQAAACcGAADhAABAOAAAAFsB9jAAZc0dAMqaOwIRYdsAAAAAAL/RqgEAAAAAIJcq//////8iACxiaWdfc3BlbmRlcjIAAAAAQJRSowMAAAAAAAAAAAAAYAkAAAAnBgDAiQEAQDgAAAAAypo7AGXNHQDKmjsCQTywAQAAAAB1XTQDAAAAAEXRZf7/////BOAgSW5mb3JtYXRpb24gY29uY2VybmluZyB0aGUgZGlmZmVyZW50IHJlZmVyZW5kdW0gdHJhY2tzLgEBChUAHE9yaWdpbnMAAAAAABYAJFdoaXRlbGlzdAEkV2hpdGVsaXN0BDxXaGl0ZWxpc3RlZENhbGwAAQQFNIwEAAABoQIBBQcAAQUKFwAoUGFyYW1ldGVycwEoUGFyYW1ldGVycwQoUGFyYW1ldGVycwABBAIdBykHBAAETCBTdG9yZWQgcGFyYW1ldGVycy4BpQIBGQcAABsAGENsYWltcwEYQ2xhaW1zFBhDbGFpbXMAAQQG3QIYBAAAFFRvdGFsAQAYQAAAAAAAAAAAAAAAAAAAAAAAHFZlc3RpbmcAAQQG3QLlAgQAEHggVmVzdGluZyBzY2hlZHVsZSBmb3IgYSBjbGFpbS4NASBGaXJzdCBiYWxhbmNlIGlzIHRoZSB0b3RhbCBhbW91bnQgdGhhdCBzaG91bGQgYmUgaGVsZCBmb3IgdmVzdGluZy7kIFNlY29uZCBiYWxhbmNlIGlzIGhvdyBtdWNoIHNob3VsZCBiZSB1bmxvY2tlZCBwZXIgYmxvY2suzCBUaGUgYmxvY2sgbnVtYmVyIGlzIHdoZW4gdGhlIHZlc3Rpbmcgc2hvdWxkIHN0YXJ0LhxTaWduaW5nAAEEBt0C7QIEAATAIFRoZSBzdGF0ZW1lbnQga2luZCB0aGF0IG11c3QgYmUgc2lnbmVkLCBpZiBhbnkuJFByZWNsYWltcwABBAYA3QIEAAQtASBQcmUtY2xhaW1lZCBFdGhlcmV1bSBhY2NvdW50cywgYnkgdGhlIEFjY291bnQgSUQgdGhhdCB0aGV5IGFyZSBjbGFpbWVkIHRvLgHRAgExBwQYUHJlZml4OIiEUGF5IERPVHMgdG8gdGhlIFBvbGthZG90IGFjY291bnQ6AAEJChgAHFZlc3RpbmcBHFZlc3RpbmcIHFZlc3RpbmcAAQQCAA0KBAAE2CBJbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhlIHZlc3Rpbmcgb2YgYSBnaXZlbiBhY2NvdW50LjhTdG9yYWdlVmVyc2lvbgEAFQoEAAx8IFN0b3JhZ2UgdmVyc2lvbiBvZiB0aGUgcGFsbGV0LgAxASBOZXcgbmV0d29ya3Mgc3RhcnQgd2l0aCBsYXRlc3QgdmVyc2lvbiwgYXMgZGV0ZXJtaW5lZCBieSB0aGUgZ2VuZXNpcyBidWlsZC4B8QIBNQcIRE1pblZlc3RlZFRyYW5zZmVyGEAA5AtUAgAAAAAAAAAAAAAABOggVGhlIG1pbmltdW0gYW1vdW50IHRyYW5zZmVycmVkIHRvIGNhbGwgYHZlc3RlZF90cmFuc2ZlcmAuTE1heFZlc3RpbmdTY2hlZHVsZXMQEBwAAAAAARkKGQAcVXRpbGl0eQAB+QIBOQcETGJhdGNoZWRfY2FsbHNfbGltaXQQEKoqAAAEqCBUaGUgbGltaXQgb24gdGhlIG51bWJlciBvZiBiYXRjaGVkIGNhbGxzLgEdChoAFFByb3h5ARRQcm94eQgcUHJveGllcwEBBAUAIQpEAAAAAAAAAAAAAAAAAAAAAAAIRQEgVGhlIHNldCBvZiBhY2NvdW50IHByb3hpZXMuIE1hcHMgdGhlIGFjY291bnQgd2hpY2ggaGFzIGRlbGVnYXRlZCB0byB0aGUgYWNjb3VudHMhASB3aGljaCBhcmUgYmVpbmcgZGVsZWdhdGVkIHRvLCB0b2dldGhlciB3aXRoIHRoZSBhbW91bnQgaGVsZCBvbiBkZXBvc2l0LjRBbm5vdW5jZW1lbnRzAQEEBQAxCkQAAAAAAAAAAAAAAAAAAAAAAASsIFRoZSBhbm5vdW5jZW1lbnRzIG1hZGUgYnkgdGhlIHByb3h5IChrZXkpLgEBAwE9BxhAUHJveHlEZXBvc2l0QmFzZRhAAISylS4AAAAAAAAAAAAAABARASBUaGUgYmFzZSBhbW91bnQgb2YgY3VycmVuY3kgbmVlZGVkIHRvIHJlc2VydmUgZm9yIGNyZWF0aW5nIGEgcHJveHkuAAEBIFRoaXMgaXMgaGVsZCBmb3IgYW4gYWRkaXRpb25hbCBzdG9yYWdlIGl0ZW0gd2hvc2UgdmFsdWUgc2l6ZSBpcyUBIGBzaXplb2YoQmFsYW5jZSlgIGJ5dGVzIGFuZCB3aG9zZSBrZXkgc2l6ZSBpcyBgc2l6ZW9mKEFjY291bnRJZClgIGJ5dGVzLkhQcm94eURlcG9zaXRGYWN0b3IYQIBmqxMAAAAAAAAAAAAAAAAUvCBUaGUgYW1vdW50IG9mIGN1cnJlbmN5IG5lZWRlZCBwZXIgcHJveHkgYWRkZWQuADUBIFRoaXMgaXMgaGVsZCBmb3IgYWRkaW5nIDMyIGJ5dGVzIHBsdXMgYW4gaW5zdGFuY2Ugb2YgYFByb3h5VHlwZWAgbW9yZSBpbnRvIGFhASBwcmUtZXhpc3Rpbmcgc3RvcmFnZSB2YWx1ZS4gVGh1cywgd2hlbiBjb25maWd1cmluZyBgUHJveHlEZXBvc2l0RmFjdG9yYCBvbmUgc2hvdWxkIHRha2X0IGludG8gYWNjb3VudCBgMzIgKyBwcm94eV90eXBlLmVuY29kZSgpLmxlbigpYCBieXRlcyBvZiBkYXRhLihNYXhQcm94aWVzEBAgAAAABPAgVGhlIG1heGltdW0gYW1vdW50IG9mIHByb3hpZXMgYWxsb3dlZCBmb3IgYSBzaW5nbGUgYWNjb3VudC4oTWF4UGVuZGluZxAQIAAAAARFASBUaGUgbWF4aW11bSBhbW91bnQgb2YgdGltZS1kZWxheWVkIGFubm91bmNlbWVudHMgdGhhdCBhcmUgYWxsb3dlZCB0byBiZSBwZW5kaW5nLlxBbm5vdW5jZW1lbnREZXBvc2l0QmFzZRhAAISylS4AAAAAAAAAAAAAABAxASBUaGUgYmFzZSBhbW91bnQgb2YgY3VycmVuY3kgbmVlZGVkIHRvIHJlc2VydmUgZm9yIGNyZWF0aW5nIGFuIGFubm91bmNlbWVudC4ASQEgVGhpcyBpcyBoZWxkIHdoZW4gYSBuZXcgc3RvcmFnZSBpdGVtIGhvbGRpbmcgYSBgQmFsYW5jZWAgaXMgY3JlYXRlZCAodHlwaWNhbGx5IDE2ICBieXRlcykuZEFubm91bmNlbWVudERlcG9zaXRGYWN0b3IYQADNVicAAAAAAAAAAAAAAAAQ1CBUaGUgYW1vdW50IG9mIGN1cnJlbmN5IG5lZWRlZCBwZXIgYW5ub3VuY2VtZW50IG1hZGUuAFkBIFRoaXMgaXMgaGVsZCBmb3IgYWRkaW5nIGFuIGBBY2NvdW50SWRgLCBgSGFzaGAgYW5kIGBCbG9ja051bWJlcmAgKHR5cGljYWxseSA2OCBieXRlcymMIGludG8gYSBwcmUtZXhpc3Rpbmcgc3RvcmFnZSB2YWx1ZS4BQQodACBNdWx0aXNpZwEgTXVsdGlzaWcEJE11bHRpc2lncwABCAUCRQpJCgQABJQgVGhlIHNldCBvZiBvcGVuIG11bHRpc2lnIG9wZXJhdGlvbnMuAQ0DAUEHDCxEZXBvc2l0QmFzZRhAAIxhxS4AAAAAAAAAAAAAABhZASBUaGUgYmFzZSBhbW91bnQgb2YgY3VycmVuY3kgbmVlZGVkIHRvIHJlc2VydmUgZm9yIGNyZWF0aW5nIGEgbXVsdGlzaWcgZXhlY3V0aW9uIG9yIHRvhCBzdG9yZSBhIGRpc3BhdGNoIGNhbGwgZm9yIGxhdGVyLgABASBUaGlzIGlzIGhlbGQgZm9yIGFuIGFkZGl0aW9uYWwgc3RvcmFnZSBpdGVtIHdob3NlIHZhbHVlIHNpemUgaXMxASBgNCArIHNpemVvZigoQmxvY2tOdW1iZXIsIEJhbGFuY2UsIEFjY291bnRJZCkpYCBieXRlcyBhbmQgd2hvc2Uga2V5IHNpemUgaXOAIGAzMiArIHNpemVvZihBY2NvdW50SWQpYCBieXRlcy40RGVwb3NpdEZhY3RvchhAANASEwAAAAAAAAAAAAAAAAxVASBUaGUgYW1vdW50IG9mIGN1cnJlbmN5IG5lZWRlZCBwZXIgdW5pdCB0aHJlc2hvbGQgd2hlbiBjcmVhdGluZyBhIG11bHRpc2lnIGV4ZWN1dGlvbi4AJQEgVGhpcyBpcyBoZWxkIGZvciBhZGRpbmcgMzIgYnl0ZXMgbW9yZSBpbnRvIGEgcHJlLWV4aXN0aW5nIHN0b3JhZ2UgdmFsdWUuOE1heFNpZ25hdG9yaWVzEBBkAAAABOwgVGhlIG1heGltdW0gYW1vdW50IG9mIHNpZ25hdG9yaWVzIGFsbG93ZWQgaW4gdGhlIG11bHRpc2lnLgFRCh4AIEJvdW50aWVzASBCb3VudGllcxAsQm91bnR5Q291bnQBABAQAAAAAATAIE51bWJlciBvZiBib3VudHkgcHJvcG9zYWxzIHRoYXQgaGF2ZSBiZWVuIG1hZGUuIEJvdW50aWVzAAEEBRBVCgQABHggQm91bnRpZXMgdGhhdCBoYXZlIGJlZW4gbWFkZS5IQm91bnR5RGVzY3JpcHRpb25zAAEEBRBdCgQABIAgVGhlIGRlc2NyaXB0aW9uIG9mIGVhY2ggYm91bnR5LjxCb3VudHlBcHByb3ZhbHMBAHEJBAAE7CBCb3VudHkgaW5kaWNlcyB0aGF0IGhhdmUgYmVlbiBhcHByb3ZlZCBidXQgbm90IHlldCBmdW5kZWQuARkDAUUHJERCb3VudHlEZXBvc2l0QmFzZRhAAOQLVAIAAAAAAAAAAAAAAAToIFRoZSBhbW91bnQgaGVsZCBvbiBkZXBvc2l0IGZvciBwbGFjaW5nIGEgYm91bnR5IHByb3Bvc2FsLmBCb3VudHlEZXBvc2l0UGF5b3V0RGVsYXkQEAAAAAAEWQEgVGhlIGRlbGF5IHBlcmlvZCBmb3Igd2hpY2ggYSBib3VudHkgYmVuZWZpY2lhcnkgbmVlZCB0byB3YWl0IGJlZm9yZSBjbGFpbSB0aGUgcGF5b3V0LkhCb3VudHlVcGRhdGVQZXJpb2QQEIDGEwAEbCBCb3VudHkgZHVyYXRpb24gaW4gYmxvY2tzLmBDdXJhdG9yRGVwb3NpdE11bHRpcGxpZXJ9CRAgoQcAEBkBIFRoZSBjdXJhdG9yIGRlcG9zaXQgaXMgY2FsY3VsYXRlZCBhcyBhIHBlcmNlbnRhZ2Ugb2YgdGhlIGN1cmF0b3IgZmVlLgA5ASBUaGlzIGRlcG9zaXQgaGFzIG9wdGlvbmFsIHVwcGVyIGFuZCBsb3dlciBib3VuZHMgd2l0aCBgQ3VyYXRvckRlcG9zaXRNYXhgIGFuZFQgYEN1cmF0b3JEZXBvc2l0TWluYC5EQ3VyYXRvckRlcG9zaXRNYXgBAkQBACBKqdEBAAAAAAAAAAAAAARJASBNYXhpbXVtIGFtb3VudCBvZiBmdW5kcyB0aGF0IHNob3VsZCBiZSBwbGFjZWQgaW4gYSBkZXBvc2l0IGZvciBtYWtpbmcgYSBwcm9wb3NhbC5EQ3VyYXRvckRlcG9zaXRNaW4BAkQBAOh2SBcAAAAAAAAAAAAAAARJASBNaW5pbXVtIGFtb3VudCBvZiBmdW5kcyB0aGF0IHNob3VsZCBiZSBwbGFjZWQgaW4gYSBkZXBvc2l0IGZvciBtYWtpbmcgYSBwcm9wb3NhbC5IQm91bnR5VmFsdWVNaW5pbXVtGEAA6HZIFwAAAAAAAAAAAAAABHAgTWluaW11bSB2YWx1ZSBmb3IgYSBib3VudHkuSERhdGFEZXBvc2l0UGVyQnl0ZRhAAOH1BQAAAAAAAAAAAAAAAARhASBUaGUgYW1vdW50IGhlbGQgb24gZGVwb3NpdCBwZXIgYnl0ZSB3aXRoaW4gdGhlIHRpcCByZXBvcnQgcmVhc29uIG9yIGJvdW50eSBkZXNjcmlwdGlvbi5MTWF4aW11bVJlYXNvbkxlbmd0aBAQAEAAAAyIIE1heGltdW0gYWNjZXB0YWJsZSByZWFzb24gbGVuZ3RoLgBlASBCZW5jaG1hcmtzIGRlcGVuZCBvbiB0aGlzIHZhbHVlLCBiZSBzdXJlIHRvIHVwZGF0ZSB3ZWlnaHRzIGZpbGUgd2hlbiBjaGFuZ2luZyB0aGlzIHZhbHVlAWEKIgA0Q2hpbGRCb3VudGllcwE0Q2hpbGRCb3VudGllcxRAQ2hpbGRCb3VudHlDb3VudAEAEBAAAAAABIAgTnVtYmVyIG9mIHRvdGFsIGNoaWxkIGJvdW50aWVzLkxQYXJlbnRDaGlsZEJvdW50aWVzAQEEBRAQEAAAAAAIsCBOdW1iZXIgb2YgY2hpbGQgYm91bnRpZXMgcGVyIHBhcmVudCBib3VudHku4CBNYXAgb2YgcGFyZW50IGJvdW50eSBpbmRleCB0byBudW1iZXIgb2YgY2hpbGQgYm91bnRpZXMuNENoaWxkQm91bnRpZXMAAQgFBYBlCgQABJQgQ2hpbGQgYm91bnRpZXMgdGhhdCBoYXZlIGJlZW4gYWRkZWQuXENoaWxkQm91bnR5RGVzY3JpcHRpb25zAAEEBRBdCgQABJggVGhlIGRlc2NyaXB0aW9uIG9mIGVhY2ggY2hpbGQtYm91bnR5LkxDaGlsZHJlbkN1cmF0b3JGZWVzAQEEBRAYQAAAAAAAAAAAAAAAAAAAAAAEAQEgVGhlIGN1bXVsYXRpdmUgY2hpbGQtYm91bnR5IGN1cmF0b3IgZmVlIGZvciBlYWNoIHBhcmVudCBib3VudHkuAR0DAUkHCGRNYXhBY3RpdmVDaGlsZEJvdW50eUNvdW50EBBkAAAABB0BIE1heGltdW0gbnVtYmVyIG9mIGNoaWxkIGJvdW50aWVzIHRoYXQgY2FuIGJlIGFkZGVkIHRvIGEgcGFyZW50IGJvdW50eS5cQ2hpbGRCb3VudHlWYWx1ZU1pbmltdW0YQADkC1QCAAAAAAAAAAAAAAAEiCBNaW5pbXVtIHZhbHVlIGZvciBhIGNoaWxkLWJvdW50eS4BbQomAGhFbGVjdGlvblByb3ZpZGVyTXVsdGlQaGFzZQFoRWxlY3Rpb25Qcm92aWRlck11bHRpUGhhc2UoFFJvdW5kAQAQEAEAAAAYrCBJbnRlcm5hbCBjb3VudGVyIGZvciB0aGUgbnVtYmVyIG9mIHJvdW5kcy4AVQEgVGhpcyBpcyB1c2VmdWwgZm9yIGRlLWR1cGxpY2F0aW9uIG9mIHRyYW5zYWN0aW9ucyBzdWJtaXR0ZWQgdG8gdGhlIHBvb2wsIGFuZCBnZW5lcmFsbCBkaWFnbm9zdGljcyBvZiB0aGUgcGFsbGV0LgBNASBUaGlzIGlzIG1lcmVseSBpbmNyZW1lbnRlZCBvbmNlIHBlciBldmVyeSB0aW1lIHRoYXQgYW4gdXBzdHJlYW0gYGVsZWN0YCBpcyBjYWxsZWQuMEN1cnJlbnRQaGFzZQEAVQcEAAQ8IEN1cnJlbnQgcGhhc2UuOFF1ZXVlZFNvbHV0aW9uAABxCgQADD0BIEN1cnJlbnQgYmVzdCBzb2x1dGlvbiwgc2lnbmVkIG9yIHVuc2lnbmVkLCBxdWV1ZWQgdG8gYmUgcmV0dXJuZWQgdXBvbiBgZWxlY3RgLgBgIEFsd2F5cyBzb3J0ZWQgYnkgc2NvcmUuIFNuYXBzaG90AAB5CgQAEHAgU25hcHNob3QgZGF0YSBvZiB0aGUgcm91bmQuAF0BIFRoaXMgaXMgY3JlYXRlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzaWduZWQgcGhhc2UgYW5kIGNsZWFyZWQgdXBvbiBjYWxsaW5nIGBlbGVjdGAuKQEgTm90ZTogVGhpcyBzdG9yYWdlIHR5cGUgbXVzdCBvbmx5IGJlIG11dGF0ZWQgdGhyb3VnaCBbYFNuYXBzaG90V3JhcHBlcmBdLjhEZXNpcmVkVGFyZ2V0cwAAEAQAEMwgRGVzaXJlZCBudW1iZXIgb2YgdGFyZ2V0cyB0byBlbGVjdCBmb3IgdGhpcyByb3VuZC4AqCBPbmx5IGV4aXN0cyB3aGVuIFtgU25hcHNob3RgXSBpcyBwcmVzZW50LikBIE5vdGU6IFRoaXMgc3RvcmFnZSB0eXBlIG11c3Qgb25seSBiZSBtdXRhdGVkIHRocm91Z2ggW2BTbmFwc2hvdFdyYXBwZXJgXS5AU25hcHNob3RNZXRhZGF0YQAA+QMEABCYIFRoZSBtZXRhZGF0YSBvZiB0aGUgW2BSb3VuZFNuYXBzaG90YF0AqCBPbmx5IGV4aXN0cyB3aGVuIFtgU25hcHNob3RgXSBpcyBwcmVzZW50LikBIE5vdGU6IFRoaXMgc3RvcmFnZSB0eXBlIG11c3Qgb25seSBiZSBtdXRhdGVkIHRocm91Z2ggW2BTbmFwc2hvdFdyYXBwZXJgXS5kU2lnbmVkU3VibWlzc2lvbk5leHRJbmRleAEAEBAAAAAAJAEBIFRoZSBuZXh0IGluZGV4IHRvIGJlIGFzc2lnbmVkIHRvIGFuIGluY29taW5nIHNpZ25lZCBzdWJtaXNzaW9uLgB1ASBFdmVyeSBhY2NlcHRlZCBzdWJtaXNzaW9uIGlzIGFzc2lnbmVkIGEgdW5pcXVlIGluZGV4OyB0aGF0IGluZGV4IGlzIGJvdW5kIHRvIHRoYXQgcGFydGljdWxhcmUBIHN1Ym1pc3Npb24gZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgZWxlY3Rpb24uIE9uIGVsZWN0aW9uIGZpbmFsaXphdGlvbiwgdGhlIG5leHQgaW5kZXggaXMwIHJlc2V0IHRvIDAuAGkBIFdlIGNhbid0IGp1c3QgdXNlIGBTaWduZWRTdWJtaXNzaW9uSW5kaWNlcy5sZW4oKWAsIGJlY2F1c2UgdGhhdCdzIGEgYm91bmRlZCBzZXQ7IHBhc3QgaXRzWQEgY2FwYWNpdHksIGl0IHdpbGwgc2ltcGx5IHNhdHVyYXRlLiBXZSBjYW4ndCBqdXN0IGl0ZXJhdGUgb3ZlciBgU2lnbmVkU3VibWlzc2lvbnNNYXBgLPQgYmVjYXVzZSBpdGVyYXRpb24gaXMgc2xvdy4gSW5zdGVhZCwgd2Ugc3RvcmUgdGhlIHZhbHVlIGhlcmUuXFNpZ25lZFN1Ym1pc3Npb25JbmRpY2VzAQCFCgQAGG0BIEEgc29ydGVkLCBib3VuZGVkIHZlY3RvciBvZiBgKHNjb3JlLCBibG9ja19udW1iZXIsIGluZGV4KWAsIHdoZXJlIGVhY2ggYGluZGV4YCBwb2ludHMgdG8gYXggdmFsdWUgaW4gYFNpZ25lZFN1Ym1pc3Npb25zYC4AcQEgV2UgbmV2ZXIgbmVlZCB0byBwcm9jZXNzIG1vcmUgdGhhbiBhIHNpbmdsZSBzaWduZWQgc3VibWlzc2lvbiBhdCBhIHRpbWUuIFNpZ25lZCBzdWJtaXNzaW9uc3UBIGNhbiBiZSBxdWl0ZSBsYXJnZSwgc28gd2UncmUgd2lsbGluZyB0byBwYXkgdGhlIGNvc3Qgb2YgbXVsdGlwbGUgZGF0YWJhc2UgYWNjZXNzZXMgdG8gYWNjZXNzIQEgdGhlbSBvbmUgYXQgYSB0aW1lIGluc3RlYWQgb2YgcmVhZGluZyBhbmQgZGVjb2RpbmcgYWxsIG9mIHRoZW0gYXQgb25jZS5QU2lnbmVkU3VibWlzc2lvbnNNYXAAAQQFEJEKBAAcdCBVbmNoZWNrZWQsIHNpZ25lZCBzb2x1dGlvbnMuAGkBIFRvZ2V0aGVyIHdpdGggYFN1Ym1pc3Npb25JbmRpY2VzYCwgdGhpcyBzdG9yZXMgYSBib3VuZGVkIHNldCBvZiBgU2lnbmVkU3VibWlzc2lvbnNgIHdoaWxl7CBhbGxvd2luZyB1cyB0byBrZWVwIG9ubHkgYSBzaW5nbGUgb25lIGluIG1lbW9yeSBhdCBhIHRpbWUuAGkBIFR3b3ggbm90ZTogdGhlIGtleSBvZiB0aGUgbWFwIGlzIGFuIGF1dG8taW5jcmVtZW50aW5nIGluZGV4IHdoaWNoIHVzZXJzIGNhbm5vdCBpbnNwZWN0IG9y9CBhZmZlY3Q7IHdlIHNob3VsZG4ndCBuZWVkIGEgY3J5cHRvZ3JhcGhpY2FsbHkgc2VjdXJlIGhhc2hlci5UTWluaW11bVVudHJ1c3RlZFNjb3JlAAD1AwQAEF0BIFRoZSBtaW5pbXVtIHNjb3JlIHRoYXQgZWFjaCAndW50cnVzdGVkJyBzb2x1dGlvbiBtdXN0IGF0dGFpbiBpbiBvcmRlciB0byBiZSBjb25zaWRlcmVkKCBmZWFzaWJsZS4AuCBDYW4gYmUgc2V0IHZpYSBgc2V0X21pbmltdW1fdW50cnVzdGVkX3Njb3JlYC4BIQMBTQc4VEJldHRlclNpZ25lZFRocmVzaG9sZKwQAAAAAAhNASBUaGUgbWluaW11bSBhbW91bnQgb2YgaW1wcm92ZW1lbnQgdG8gdGhlIHNvbHV0aW9uIHNjb3JlIHRoYXQgZGVmaW5lcyBhIHNvbHV0aW9uIGFzeCAiYmV0dGVyIiBpbiB0aGUgU2lnbmVkIHBoYXNlLjhPZmZjaGFpblJlcGVhdBAQEgAAABC0IFRoZSByZXBlYXQgdGhyZXNob2xkIG9mIHRoZSBvZmZjaGFpbiB3b3JrZXIuAGEBIEZvciBleGFtcGxlLCBpZiBpdCBpcyA1LCB0aGF0IG1lYW5zIHRoYXQgYXQgbGVhc3QgNSBibG9ja3Mgd2lsbCBlbGFwc2UgYmV0d2VlbiBhdHRlbXB0c4QgdG8gc3VibWl0IHRoZSB3b3JrZXIncyBzb2x1dGlvbi48TWluZXJUeFByaW9yaXR5MCBlZmZmZmZm5gQlASBUaGUgcHJpb3JpdHkgb2YgdGhlIHVuc2lnbmVkIHRyYW5zYWN0aW9uIHN1Ym1pdHRlZCBpbiB0aGUgdW5zaWduZWQtcGhhc2VQU2lnbmVkTWF4U3VibWlzc2lvbnMQEBAAAAAc5CBNYXhpbXVtIG51bWJlciBvZiBzaWduZWQgc3VibWlzc2lvbnMgdGhhdCBjYW4gYmUgcXVldWVkLgBVASBJdCBpcyBiZXN0IHRvIGF2b2lkIGFkanVzdGluZyB0aGlzIGR1cmluZyBhbiBlbGVjdGlvbiwgYXMgaXQgaW1wYWN0cyBkb3duc3RyZWFtIGRhdGFlASBzdHJ1Y3R1cmVzLiBJbiBwYXJ0aWN1bGFyLCBgU2lnbmVkU3VibWlzc2lvbkluZGljZXM8VD5gIGlzIGJvdW5kZWQgb24gdGhpcyB2YWx1ZS4gSWYgeW919CB1cGRhdGUgdGhpcyB2YWx1ZSBkdXJpbmcgYW4gZWxlY3Rpb24sIHlvdSBfbXVzdF8gZW5zdXJlIHRoYXRNASBgU2lnbmVkU3VibWlzc2lvbkluZGljZXMubGVuKClgIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgbmV3IHZhbHVlLiBPdGhlcndpc2Us8CBhdHRlbXB0cyB0byBzdWJtaXQgbmV3IHNvbHV0aW9ucyBtYXkgY2F1c2UgYSBydW50aW1lIHBhbmljLjxTaWduZWRNYXhXZWlnaHQoQAsIx3JYVQETo3A9CtejcL0UlCBNYXhpbXVtIHdlaWdodCBvZiBhIHNpZ25lZCBzb2x1dGlvbi4AXQEgSWYgW2BDb25maWc6Ok1pbmVyQ29uZmlnYF0gaXMgYmVpbmcgaW1wbGVtZW50ZWQgdG8gc3VibWl0IHNpZ25lZCBzb2x1dGlvbnMgKG91dHNpZGUgb2Y9ASB0aGlzIHBhbGxldCksIHRoZW4gW2BNaW5lckNvbmZpZzo6c29sdXRpb25fd2VpZ2h0YF0gaXMgdXNlZCB0byBjb21wYXJlIGFnYWluc3QwIHRoaXMgdmFsdWUuQFNpZ25lZE1heFJlZnVuZHMQEAQAAAAEGQEgVGhlIG1heGltdW0gYW1vdW50IG9mIHVuY2hlY2tlZCBzb2x1dGlvbnMgdG8gcmVmdW5kIHRoZSBjYWxsIGZlZSBmb3IuQFNpZ25lZFJld2FyZEJhc2UYQADkC1QCAAAAAAAAAAAAAAAEiCBCYXNlIHJld2FyZCBmb3IgYSBzaWduZWQgc29sdXRpb25EU2lnbmVkRGVwb3NpdEJ5dGUYQHh9AQAAAAAAAAAAAAAAAAAEoCBQZXItYnl0ZSBkZXBvc2l0IGZvciBhIHNpZ25lZCBzb2x1dGlvbi5MU2lnbmVkRGVwb3NpdFdlaWdodBhAAAAAAAAAAAAAAAAAAAAAAASoIFBlci13ZWlnaHQgZGVwb3NpdCBmb3IgYSBzaWduZWQgc29sdXRpb24uKE1heFdpbm5lcnMQELAEAAAQNQEgVGhlIG1heGltdW0gbnVtYmVyIG9mIHdpbm5lcnMgdGhhdCBjYW4gYmUgZWxlY3RlZCBieSB0aGlzIGBFbGVjdGlvblByb3ZpZGVyYEAgaW1wbGVtZW50YXRpb24uAFEBIE5vdGU6IFRoaXMgbXVzdCBhbHdheXMgYmUgZ3JlYXRlciBvciBlcXVhbCB0byBgVDo6RGF0YVByb3ZpZGVyOjpkZXNpcmVkX3RhcmdldHMoKWAuOE1pbmVyTWF4TGVuZ3RoEBAAADYAADhNaW5lck1heFdl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AEEBIFRoZXJlIGlzIGFuIGltcGxpZWQgdXBwZXIgbGltaXQgb2YgYFNjb3JlOjpNQVhgOyB0aGF0IHZhbHVlIGRvZXMgbm90IG5lZWQgdG8gYmUhASBzcGVjaWZpZWQgd2l0aGluIHRoZSBiYWcuIEZvciBhbnkgdHdvIHRocmVzaG9sZCBsaXN0cywgaWYgb25lIGVuZHMgd2l0aDEBIGBTY29yZTo6TUFYYCwgdGhlIG90aGVyIG9uZSBkb2VzIG5vdCwgYW5kIHRoZXkgYXJlIG90aGVyd2lzZSBlcXVhbCwgdGhlIHR3b3wgbGlzdHMgd2lsbCBiZWhhdmUgaWRlbnRpY2FsbHkuADggIyBDYWxjdWxhdGlvbgBVASBJdCBpcyByZWNvbW1lbmRlZCB0byBnZW5lcmF0ZSB0aGUgc2V0IG9mIHRocmVzaG9sZHMgaW4gYSBnZW9tZXRyaWMgc2VyaWVzLCBzdWNoIHRoYXRBASB0aGVyZSBleGlzdHMgc29tZSBjb25zdGFudCByYXRpbyBzdWNoIHRoYXQgYHRocmVzaG9sZFtrICsgMV0gPT0gKHRocmVzaG9sZFtrXSAq0CBjb25zdGFudF9yYXRpbykubWF4KHRocmVzaG9sZFtrXSArIDEpYCBmb3IgYWxsIGBrYC4AWQEgVGhlIGhlbHBlcnMgaW4gdGhlIGAvdXRpbHMvZnJhbWUvZ2VuZXJhdGUtYmFnc2AgbW9kdWxlIGNhbiBzaW1wbGlmeSB0aGlzIGNhbGN1bGF0aW9uLgAsICMgRXhhbXBsZXMAUQEgLSBJZiBgQmFnVGhyZXNob2xkczo6Z2V0KCkuaXNfZW1wdHkoKWAsIHRoZW4gYWxsIGlkcyBhcmUgcHV0IGludG8gdGhlIHNhbWUgYmFnLCBhbmSwICAgaXRlcmF0aW9uIGlzIHN0cmljdGx5IGluIGluc2VydGlvbiBvcmRlci5hASAtIElmIGBCYWdUaHJlc2hvbGRzOjpnZXQoKS5sZW4oKSA9PSA2NGAsIGFuZCB0aGUgdGhyZXNob2xkcyBhcmUgZGV0ZXJtaW5lZCBhY2NvcmRpbmcgdG8RASAgIHRoZSBwcm9jZWR1cmUgZ2l2ZW4gYWJvdmUsIHRoZW4gdGhlIGNvbnN0YW50IHJhdGlvIGlzIGVxdWFsIHRvIDIuZQEgLSBJZiBgQmFnVGhyZXNob2xkczo6Z2V0KCkubGVuKCkgPT0gMjAwYCwgYW5kIHRoZSB0aHJlc2hvbGRzIGFyZSBkZXRlcm1pbmVkIGFjY29yZGluZyB0b1kBICAgdGhlIHByb2NlZHVyZSBnaXZlbiBhYm92ZSwgdGhlbiB0aGUgY29uc3RhbnQgcmF0aW8gaXMgYXBwcm94aW1hdGVseSBlcXVhbCB0byAxLjI0OC5hASAtIElmIHRoZSB0aHJlc2hvbGQgbGlzdCBiZWdpbnMgYFsxLCAyLCAzLCAuLi5dYCwgdGhlbiBhbiBpZCB3aXRoIHNjb3JlIDAgb3IgMSB3aWxsIGZhbGzwICAgaW50byBiYWcgMCwgYW4gaWQgd2l0aCBzY29yZSAyIHdpbGwgZmFsbCBpbnRvIGJhZyAxLCBldGMuADAgIyBNaWdyYXRpb24AYQEgSW4gdGhlIGV2ZW50IHRoYXQgdGhpcyBsaXN0IGV2ZXIgY2hhbmdlcywgYSBjb3B5IG9mIHRoZSBvbGQgYmFncyBsaXN0IG11c3QgYmUgcmV0YWluZWQuXQEgV2l0aCB0aGF0IGBMaXN0OjptaWdyYXRlYCBjYW4gYmUgY2FsbGVkLCB3aGljaCB3aWxsIHBlcmZvcm0gdGhlIGFwcHJvcHJpYXRlIG1pZ3JhdGlvbi4BpQolADxOb21pbmF0aW9uUG9vbHMBPE5vbWluYXRpb25Qb29sc1RAVG90YWxWYWx1ZUxvY2tlZAEAGEAAAAAAAAAAAAAAAAAAAAAAFIwgVGhlIHN1bSBvZiBmdW5kcyBhY3Jvc3MgYWxsIHBvb2xzLgBxASBUaGlzIG1pZ2h0IGJlIGxvd2VyIGJ1dCBuZXZlciBoaWdoZXIgdGhhbiB0aGUgc3VtIG9mIGB0b3RhbF9iYWxhbmNlYCBvZiBhbGwgW2BQb29sTWVtYmVyc2BdWQEgYmVjYXVzZSBjYWxsaW5nIGBwb29sX3dpdGhkcmF3X3VuYm9uZGVkYCBtaWdodCBkZWNyZWFzZSB0aGUgdG90YWwgc3Rha2Ugb2YgdGhlIHBvb2wncykBIGBib25kZWRfYWNjb3VudGAgd2l0aG91dCBhZGp1c3RpbmcgdGhlIHBhbGxldC1pbnRlcm5hbCBgVW5ib25kaW5nUG9vbGAncy4sTWluSm9pbkJvbmQBABhAAAAAAAAAAAAAAAAAAAAAAAScIE1pbmltdW0gYW1vdW50IHRvIGJvbmQgdG8gam9pbiBhIHBvb2wuNE1pbkNyZWF0ZUJvbmQBABhAAAAAAAAAAAAAAAAAAAAAABygIE1pbmltdW0gYm9uZCByZXF1aXJlZCB0byBjcmVhdGUgYSBwb29sLgBlASBUaGlzIGlzIHRoZSBhbW91bnQgdGhhdCB0aGUgZGVwb3NpdG9yIG11c3QgcHV0IGFzIHRoZWlyIGluaXRpYWwgc3Rha2UgaW4gdGhlIHBvb2wsIGFzIGFuiCBpbmRpY2F0aW9uIG9mICJza2luIGluIHRoZSBnYW1lIi4AaQEgVGhpcyBpcyB0aGUgdmFsdWUgdGhhdCB3aWxsIGFsd2F5cyBleGlzdCBpbiB0aGUgc3Rha2luZyBsZWRnZXIgb2YgdGhlIHBvb2wgYm9uZGVkIGFjY291bnSAIHdoaWxlIGFsbCBvdGhlciBhY2NvdW50cyBsZWF2ZS4gTWF4UG9vbHMAABAEAAhpASBNYXhpbXVtIG51bWJlciBvZiBub21pbmF0aW9uIHBvb2xzIHRoYXQgY2FuIGV4aXN0LiBJZiBgTm9uZWAsIHRoZW4gYW4gdW5ib3VuZGVkIG51bWJlciBvZkQgcG9vbHMgY2FuIGV4aXN0LjhNYXhQb29sTWVtYmVycwAAEAQACEkBIE1heGltdW0gbnVtYmVyIG9mIG1lbWJlcnMgdGhhdCBjYW4gZXhpc3QgaW4gdGhlIHN5c3RlbS4gSWYgYE5vbmVgLCB0aGVuIHRoZSBjb3VudLggbWVtYmVycyBhcmUgbm90IGJvdW5kIG9uIGEgc3lzdGVtIHdpZGUgYmFzaXMuVE1heFBvb2xNZW1iZXJzUGVyUG9vbAAAEAQACEEBIE1heGltdW0gbnVtYmVyIG9mIG1lbWJlcnMgdGhhdCBtYXkgYmVsb25nIHRvIHBvb2wuIElmIGBOb25lYCwgdGhlbiB0aGUgY291bnQgb2aoIG1lbWJlcnMgaXMgbm90IGJvdW5kIG9uIGEgcGVyIHBvb2wgYmFzaXMuTEdsb2JhbE1heENvbW1pc3Npb24AAKwEAAxpASBUaGUgbWF4aW11bSBjb21taXNzaW9uIHRoYXQgY2FuIGJlIGNoYXJnZWQgYnkgYSBwb29sLiBVc2VkIG9uIGNvbW1pc3Npb24gcGF5b3V0cyB0byBib3VuZCUBIHBvb2wgY29tbWlzc2lvbnMgdGhhdCBhcmUgPiBgR2xvYmFsTWF4Q29tbWlzc2lvbmAsIG5lY2Vzc2FyeSBpZiBhIGZ1dHVyZQ0BIGBHbG9iYWxNYXhDb21taXNzaW9uYCBpcyBsb3dlciB0aGFuIHNvbWUgY3VycmVudCBwb29sIGNvbW1pc3Npb25zLixQb29sTWVtYmVycwABBAUArQoEAAxAIEFjdGl2ZSBtZW1iZXJzLgDQIFRXT1gtTk9URTogU0FGRSBzaW5jZSBgQWNjb3VudElkYCBpcyBhIHNlY3VyZSBoYXNoLlRDb3VudGVyRm9yUG9vbE1lbWJlcnMBABAQAAAAAASsQ291bnRlciBmb3IgdGhlIHJlbGF0ZWQgY291bnRlZCBzdG9yYWdlIG1hcCxCb25kZWRQb29scwABBAUQuQoEAARoIFN0b3JhZ2UgZm9yIGJvbmRlZCBwb29scy5UQ291bnRlckZvckJvbmRlZFBvb2xzAQAQEAAAAAAErENvdW50ZXIgZm9yIHRoZSByZWxhdGVkIGNvdW50ZWQgc3RvcmFnZSBtYXAsUmV3YXJkUG9vbHMAAQQFEM0KBAAIdQEgUmV3YXJkIHBvb2xzLiBUaGlzIGlzIHdoZXJlIHRoZXJlIHJld2FyZHMgZm9yIGVhY2ggcG9vbCBhY2N1bXVsYXRlLiBXaGVuIGEgbWVtYmVycyBwYXlvdXQgaXNZASBjbGFpbWVkLCB0aGUgYmFsYW5jZSBjb21lcyBvdXQgb2YgdGhlIHJld2FyZCBwb29sLiBLZXllZCBieSB0aGUgYm9uZGVkIHBvb2xzIGFjY291bnQuVENvdW50ZXJGb3JSZXdhcmRQb29scwEAEBAAAAAABKxDb3VudGVyIGZvciB0aGUgcmVsYXRlZCBjb3VudGVkIHN0b3JhZ2UgbWFwPFN1YlBvb2xzU3RvcmFnZQABBAUQ0QoEAAgZASBHcm91cHMgb2YgdW5ib25kaW5nIHBvb2xzLiBFYWNoIGdyb3VwIG9mIHVuYm9uZGluZyBwb29scyBiZWxvbmdzIHRvIGEpASBib25kZWQgcG9vbCwgaGVuY2UgdGhlIG5hbWUgc3ViLXBvb2xzLiBLZXllZCBieSB0aGUgYm9uZGVkIHBvb2xzIGFjY291bnQuZENvdW50ZXJGb3JTdWJQb29sc1N0b3JhZ2UBABAQAAAAAASsQ291bnRlciBmb3IgdGhlIHJlbGF0ZWQgY291bnRlZCBzdG9yYWdlIG1hcCBNZXRhZGF0YQEBBAUQ6QoEAARcIE1ldGFkYXRhIGZvciB0aGUgcG9vbC5IQ291bnRlckZvck1ldGFkYXRhAQAQEAAAAAAErENvdW50ZXIgZm9yIHRoZSByZWxhdGVkIGNvdW50ZWQgc3RvcmFnZSBtYXAoTGFzdFBvb2xJZAEAEBAAAAAABNAgRXZlciBpbmNyZWFzaW5nIG51bWJlciBvZiBhbGwgcG9vbHMgY3JlYXRlZCBzbyBmYXIuTFJldmVyc2VQb29sSWRMb29rdXAAAQQFABAEABDcIEEgcmV2ZXJzZSBsb29rdXAgZnJvbSB0aGUgcG9vbCdzIGFjY291bnQgaWQgdG8gaXRzIGlkLgB1ASBUaGlzIGlzIG9ubHkgdXNlZCBmb3Igc2xhc2hpbmcgYW5kIG9uIGF1dG9tYXRpYyB3aXRoZHJhdyB1cGRhdGUuIEluIGFsbCBvdGhlciBpbnN0YW5jZXMsIHRoZSUBIHBvb2wgaWQgaXMgdXNlZCwgYW5kIHRoZSBhY2NvdW50cyBhcmUgZGV0ZXJtaW5pc3RpY2FsbHkgZGVyaXZlZCBmcm9tIGl0LnRDb3VudGVyRm9yUmV2ZXJzZVBvb2xJZExvb2t1cAEAEBAAAAAABKxDb3VudGVyIGZvciB0aGUgcmVsYXRlZCBjb3VudGVkIHN0b3JhZ2UgbWFwQENsYWltUGVybWlzc2lvbnMBAQQFADUEBAIEAQEgTWFwIGZyb20gYSBwb29sIG1lbWJlciBhY2NvdW50IHRvIHRoZWlyIG9wdGVkIGNsYWltIHBlcm1pc3Npb24uARkEAWEHDCBQYWxsZXRJZIEJIHB5L25vcGxzBIQgVGhlIG5vbWluYXRpb24gcG9vbCdzIHBhbGxldCBpZC5ITWF4UG9pbnRzVG9CYWxhbmNlCAQKMB0BIFRoZSBtYXhpbXVtIHBvb2wgcG9pbnRzLXRvLWJhbGFuY2UgcmF0aW8gdGhhdCBhbiBgb3BlbmAgcG9vbCBjYW4gaGF2ZS4AVQEgVGhpcyBpcyBpbXBvcnRhbnQgaW4gdGhlIGV2ZW50IHNsYXNoaW5nIHRha2VzIHBsYWNlIGFuZCB0aGUgcG9vbCdzIHBvaW50cy10by1iYWxhbmNlfCByYXRpbyBiZWNvbWVzIGRpc3Byb3BvcnRpb25hbC4AZQEgTW9yZW92ZXIsIHRoaXMgcmVsYXRlcyB0byB0aGUgYFJld2FyZENvdW50ZXJgIHR5cGUgYXMgd2VsbCwgYXMgdGhlIGFyaXRobWV0aWMgb3BlcmF0aW9uc1UBIGFyZSBhIGZ1bmN0aW9uIG9mIG51bWJlciBvZiBwb2ludHMsIGFuZCBieSBzZXR0aW5nIHRoaXMgdmFsdWUgdG8gZS5nLiAxMCwgeW91IGVuc3VyZWUBIHRoYXQgdGhlIHRvdGFsIG51bWJlciBvZiBwb2ludHMgaW4gdGhlIHN5c3RlbSBhcmUgYXQgbW9zdCAxMCB0aW1lcyB0aGUgdG90YWxfaXNzdWFuY2Ugb2acIHRoZSBjaGFpbiwgaW4gdGhlIGFic29sdXRlIHdvcnNlIGNhc2UuAEkBIEZvciBhIHZhbHVlIG9mIDEwLCB0aGUgdGhyZXNob2xkIHdvdWxkIGJlIGEgcG9vbCBwb2ludHMtdG8tYmFsYW5jZSByYXRpbyBvZiAxMDoxLjEBIFN1Y2ggYSBzY2VuYXJpbyB3b3VsZCBhbHNvIGJlIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBwb29sIGJlaW5nIDkwJSBzbGFzaGVkLjBNYXhVbmJvbmRpbmcQECAAAAAEPQEgVGhlIG1heGltdW0gbnVtYmVyIG9mIHNpbXVsdGFuZW91cyB1bmJvbmRpbmcgY2h1bmtzIHRoYXQgY2FuIGV4aXN0IHBlciBtZW1iZXIuAe0KJwAsRmFzdFVuc3Rha2UBLEZhc3RVbnN0YWtlEBBIZWFkAAD1CgQADMAgVGhlIGN1cnJlbnQgImhlYWQgb2YgdGhlIHF1ZXVlIiBiZWluZyB1bnN0YWtlZC4AKQEgVGhlIGhlYWQgaW4gaXRzZWxmIGNhbiBiZSBhIGJhdGNoIG9mIHVwIHRvIFtgQ29uZmlnOjpCYXRjaFNpemVgXSBzdGFrZXJzLhRRdWV1ZQABBAUAGAQADMAgVGhlIG1hcCBvZiBhbGwgYWNjb3VudHMgd2lzaGluZyB0byBiZSB1bnN0YWtlZC4AOQEgS2VlcHMgdHJhY2sgb2YgYEFjY291bnRJZGAgd2lzaGluZyB0byB1bnN0YWtlIGFuZCBpdCdzIGNvcnJlc3BvbmRpbmcgZGVwb3NpdC48Q291bnRlckZvclF1ZXVlAQAQEAAAAAAErENvdW50ZXIgZm9yIHRoZSByZWxhdGVkIGNvdW50ZWQgc3RvcmFnZSBtYXBMRXJhc1RvQ2hlY2tQZXJCbG9jawEAEBAAAAAAIIwgTnVtYmVyIG9mIGVyYXMgdG8gY2hlY2sgcGVyIGJsb2NrLgA1ASBJZiBzZXQgdG8gMCwgdGhpcyBwYWxsZXQgZG9lcyBhYnNvbHV0ZWx5IG5vdGhpbmcuIENhbm5vdCBiZSBzZXQgdG8gbW9yZSB0aGFukCBbYENvbmZpZzo6TWF4RXJhc1RvQ2hlY2tQZXJCbG9ja2BdLgBlASBCYXNlZCBvbiB0aGUgYW1vdW50IG9mIHdlaWdodCBhdmFpbGFibGUgYXQgW2BQYWxsZXQ6Om9uX2lkbGVgXSwgdXAgdG8gdGhpcyBtYW55IGVyYXMgYXJlXQEgY2hlY2tlZC4gVGhlIGNoZWNraW5nIGlzIHJlcHJlc2VudGVkIGJ5IHVwZGF0aW5nIFtgVW5zdGFrZVJlcXVlc3Q6OmNoZWNrZWRgXSwgd2hpY2ggaXNQIHN0b3JlZCBpbiBbYEhlYWRgXS4BTQQBZQcEHERlcG9zaXQYQADkC1QCAAAAAAAAAAAAAAAIZQEgRGVwb3NpdCB0byB0YWtlIGZvciB1bnN0YWtpbmcsIHRvIG1ha2Ugc3VyZSB3ZSdyZSBhYmxlIHRvIHNsYXNoIHRoZSBpdCBpbiBvcmRlciB0byBjb3ZlcsAgdGhlIGNvc3RzIG9mIHJlc291cmNlcyBvbiB1bnN1Y2Nlc3NmdWwgdW5zdGFrZS4BAQsoAEBQYXJhY2hhaW5zT3JpZ2luAAAAAAAyEHkBIFRoZXJlIGlzIG5vIHdheSB0byByZWdpc3RlciBhbiBvcmlnaW4gdHlwZSBpbiBgY29uc3RydWN0X3J1bnRpbWVgIHdpdGhvdXQgYSBwYWxsZXQgdGhlIG9yaWdpbjAgYmVsb25ncyB0by4AdQEgVGhpcyBtb2R1bGUgZnVsZmlsbHMgb25seSB0aGUgc2luZ2xlIHB1cnBvc2Ugb2YgaG91c2luZyB0aGUgYE9yaWdpbmAgaW4gYGNvbnN0cnVjdF9ydW50aW1lYC40Q29uZmlndXJhdGlvbgE0Q29uZmlndXJhdGlvbgwwQWN0aXZlQ29uZmlnAQAFC0EDAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAZAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAgAAAAIAAAACAAAAAAEAAAABAAAAAQAAAAABAAAAAAAAAAAAAAAQJwAAgLLmDoDDyQGAlpgAAAAAAAAAAAAAAAAABQAAAATIIFRoZSBhY3RpdmUgY29uZmlndXJhdGlvbiBmb3IgdGhlIGN1cnJlbnQgc2Vzc2lvbi44UGVuZGluZ0NvbmZpZ3MBAAkLBAAcfCBQZW5kaW5nIGNvbmZpZ3VyYXRpb24gY2hhbmdlcy4AWQEgVGhpcyBpcyBhIGxpc3Qgb2YgY29uZmlndXJhdGlvbiBjaGFuZ2VzLCBlYWNoIHdpdGggYSBzZXNzaW9uIGluZGV4IGF0IHdoaWNoIGl0IHNob3VsZDAgYmUgYXBwbGllZC4AYQEgVGhlIGxpc3QgaXMgc29ydGVkIGFzY2VuZGluZyBieSBzZXNzaW9uIGluZGV4LiBBbHNvLCB0aGlzIGxpc3QgY2FuIG9ubHkgY29udGFpbiBhdCBtb3N0/CAyIGl0ZW1zOiBmb3IgdGhlIG5leHQgc2Vzc2lvbiBhbmQgZm9yIHRoZSBgc2NoZWR1bGVkX3Nlc3Npb25gLlhCeXBhc3NDb25zaXN0ZW5jeUNoZWNrAQAgBAAIYQEgSWYgdGhpcyBpcyBzZXQsIHRoZW4gdGhlIGNvbmZpZ3VyYXRpb24gc2V0dGVycyB3aWxsIGJ5cGFzcyB0aGUgY29uc2lzdGVuY3kgY2hlY2tzLiBUaGlztCBpcyBtZWFudCB0byBiZSB1c2VkIG9ubHkgYXMgdGhlIGxhc3QgcmVzb3J0LgFRBAAAARELMwAsUGFyYXNTaGFyZWQBLFBhcmFzU2hhcmVkEExDdXJyZW50U2Vzc2lvbkluZGV4AQAQEAAAAAAEbCBUaGUgY3VycmVudCBzZXNzaW9uIGluZGV4LlhBY3RpdmVWYWxpZGF0b3JJbmRpY2VzAQAVCwQACAkBIEFsbCB0aGUgdmFsaWRhdG9ycyBhY3RpdmVseSBwYXJ0aWNpcGF0aW5nIGluIHBhcmFjaGFpbiBjb25zZW5zdXMusCBJbmRpY2VzIGFyZSBpbnRvIHRoZSBicm9hZGVyIHZhbGlkYXRvciBzZXQuTEFjdGl2ZVZhbGlkYXRvcktleXMBABkLBAAIVQEgVGhlIHBhcmFjaGFpbiBhdHRlc3RhdGlvbiBrZXlzIG9mIHRoZSB2YWxpZGF0b3JzIGFjdGl2ZWx5IHBhcnRpY2lwYXRpbmcgaW4gcGFyYWNoYWluHQEgY29uc2Vuc3VzLiBUaGlzIHNob3VsZCBiZSB0aGUgc2FtZSBsZW5ndGggYXMgYEFjdGl2ZVZhbGlkYXRvckluZGljZXNgLkxBbGxvd2VkUmVsYXlQYXJlbnRzAQAdCxQAAAAAAARsIEFsbCBhbGxvd2VkIHJlbGF5LXBhcmVudHMuAXUEAAAANAA0UGFyYUluY2x1c2lvbgE0UGFyYUluY2x1c2lvbgQIVjEAAQQFjQIpCwQAFGEBIENhbmRpZGF0ZXMgcGVuZGluZyBhdmFpbGFiaWxpdHkgYnkgYFBhcmFJZGAuIFRoZXkgZm9ybSBhIGNoYWluIHN0YXJ0aW5nIGZyb20gdGhlIGxhdGVzdGwgaW5jbHVkZWQgaGVhZCBvZiB0aGUgcGFyYS5hASBVc2UgYSBkaWZmZXJlbnQgcHJlZml4IHBvc3QtbWlncmF0aW9uIHRvIHYxLCBzaW5jZSB0aGUgdjAgYFBlbmRpbmdBdmFpbGFiaWxpdHlgIHN0b3JhZ2VxASB3b3VsZCBvdGhlcndpc2UgaGF2ZSB0aGUgZXhhY3Qgc2FtZSBwcmVmaXggd2hpY2ggY291bGQgY2F1c2UgdW5kZWZpbmVkIGJlaGF2aW91ciB3aGVuIGRvaW5nPCB0aGUgbWlncmF0aW9uLgF5BAFpBwABMQs1ADBQYXJhSW5oZXJlbnQBMFBhcmFJbmhlcmVudAggSW5jbHVkZWQAAIwEABjsIFdoZXRoZXIgdGhlIHBhcmFzIGluaGVyZW50IHdhcyBpbmNsdWRlZCB3aXRoaW4gdGhpcyBibG9jay4AaQEgVGhlIGBPcHRpb248KCk+YCBpcyBlZmZlY3RpdmVseSBhIGBib29sYCwgYnV0IGl0IG5ldmVyIGhpdHMgc3RvcmFnZSBpbiB0aGUgYE5vbmVgIHZhcmlhbnS8IGR1ZSB0byB0aGUgZ3VhcmFudGVlcyBvZiBGUkFNRSdzIHN0b3JhZ2UgQVBJcy4ASQEgSWYgdGhpcyBpcyBgTm9uZWAgYXQgdGhlIGVuZCBvZiB0aGUgYmxvY2ssIHdlIHBhbmljIGFuZCByZW5kZXIgdGhlIGJsb2NrIGludmFsaWQuME9uQ2hhaW5Wb3RlcwAANQsEAARFASBTY3JhcGVkIG9uIGNoYWluIGRhdGEgZm9yIGV4dHJhY3RpbmcgcmVzb2x2ZWQgZGlzcHV0ZXMgYXMgd2VsbCBhcyBiYWNraW5nIHZvdGVzLgF9BAAAAUkLNgA0UGFyYVNjaGVkdWxlcgE0UGFyYVNjaGVkdWxlchA8VmFsaWRhdG9yR3JvdXBzAQBNCwQAHG0BIEFsbCB0aGUgdmFsaWRhdG9yIGdyb3Vwcy4gT25lIGZvciBlYWNoIGNvcmUuIEluZGljZXMgYXJlIGludG8gYEFjdGl2ZVZhbGlkYXRvcnNgIC0gbm90IHRoZW0BIGJyb2FkZXIgc2V0IG9mIFBvbGthZG90IHZhbGlkYXRvcnMsIGJ1dCBpbnN0ZWFkIGp1c3QgdGhlIHN1YnNldCB1c2VkIGZvciBwYXJhY2hhaW5zIGR1cmluZzggdGhpcyBzZXNzaW9uLgBJASBCb3VuZDogVGhlIG51bWJlciBvZiBjb3JlcyBpcyB0aGUgc3VtIG9mIHRoZSBudW1iZXJzIG9mIHBhcmFjaGFpbnMgYW5kIHBhcmF0aHJlYWRpASBtdWx0aXBsZXhlcnMuIFJlYXNvbmFibHksIDEwMC0xMDAwLiBUaGUgZG9taW5hbnQgZmFjdG9yIGlzIHRoZSBudW1iZXIgb2YgdmFsaWRhdG9yczogc2FmZVAgdXBwZXIgYm91bmQgYXQgMTBrLkRBdmFpbGFiaWxpdHlDb3JlcwEAUQsEABhxASBPbmUgZW50cnkgZm9yIGVhY2ggYXZhaWxhYmlsaXR5IGNvcmUuIFRoZSBpJ3RoIHBhcmFjaGFpbiBiZWxvbmdzIHRvIHRoZSBpJ3RoIGNvcmUsIHdpdGggdGhl8CByZW1haW5pbmcgY29yZXMgYWxsIGJlaW5nIG9uIGRlbWFuZCBwYXJhY2hhaW4gbXVsdGlwbGV4ZXJzLgDYIEJvdW5kZWQgYnkgdGhlIG1heGltdW0gb2YgZWl0aGVyIG9mIHRoZXNlIHR3byB2YWx1ZXM65CAgICogVGhlIG51bWJlciBvZiBwYXJhY2hhaW5zIGFuZCBwYXJhdGhyZWFkIG11bHRpcGxleGVyc0UBICAgKiBUaGUgbnVtYmVyIG9mIHZhbGlkYXRvcnMgZGl2aWRlZCBieSBgY29uZmlndXJhdGlvbi5tYXhfdmFsaWRhdG9yc19wZXJfY29yZWAuRFNlc3Npb25TdGFydEJsb2NrAQAQEAAAAAAcaQEgVGhlIGJsb2NrIG51bWJlciB3aGVyZSB0aGUgc2Vzc2lvbiBzdGFydCBvY2N1cnJlZC4gVXNlZCB0byB0cmFjayBob3cgbWFueSBncm91cCByb3RhdGlvbnM8IGhhdmUgb2NjdXJyZWQuAFUBIE5vdGUgdGhhdCBpbiB0aGUgY29udGV4dCBvZiBwYXJhY2hhaW5zIG1vZHVsZXMgdGhlIHNlc3Npb24gY2hhbmdlIGlzIHNpZ25hbGVkIGR1cmluZ2EBIHRoZSBibG9jayBhbmQgZW5hY3RlZCBhdCB0aGUgZW5kIG9mIHRoZSBibG9jayAoYXQgdGhlIGZpbmFsaXphdGlvbiBzdGFnZSwgdG8gYmUgZXhhY3QpLlkBIFRodXMgZm9yIGFsbCBpbnRlbnRzIGFuZCBwdXJwb3NlcyB0aGUgZWZmZWN0IG9mIHRoZSBzZXNzaW9uIGNoYW5nZSBpcyBvYnNlcnZlZCBhdCB0aGVlASBibG9jayBmb2xsb3dpbmcgdGhlIHNlc3Npb24gY2hhbmdlLCBibG9jayBudW1iZXIgb2Ygd2hpY2ggd2Ugc2F2ZSBpbiB0aGlzIHN0b3JhZ2UgdmFsdWUuKENsYWltUXVldWUBAGELBAAMWQEgT25lIGVudHJ5IGZvciBlYWNoIGF2YWlsYWJpbGl0eSBjb3JlLiBUaGUgYFZlY0RlcXVlYCByZXByZXNlbnRzIHRoZSBhc3NpZ25tZW50cyB0byBiZVEBIHNjaGVkdWxlZCBvbiB0aGF0IGNvcmUuIFRoZSB2YWx1ZSBjb250YWluZWQgaGVyZSB3aWxsIG5vdCBiZSB2YWxpZCBhZnRlciB0aGUgZW5kIG9maQEgYSBibG9jay4gUnVudGltZSBBUElzIHNob3VsZCBiZSB1c2VkIHRvIGRldGVybWluZSBzY2hlZHVsZWQgY29yZXMgZm9yIHRoZSB1cGNvbWluZyBibG9jay4AAAAANwAUUGFyYXMBFFBhcmFzVEBQdmZBY3RpdmVWb3RlTWFwAAEEBbkEcQsEABC0IEFsbCBjdXJyZW50bHkgYWN0aXZlIFBWRiBwcmUtY2hlY2tpbmcgdm90ZXMuACwgSW52YXJpYW50OnUBIC0gVGhlcmUgYXJlIG5vIFBWRiBwcmUtY2hlY2tpbmcgdm90ZXMgdGhhdCBleGlzdHMgaW4gbGlzdCBidXQgbm90IGluIHRoZSBzZXQgYW5kIHZpY2UgdmVyc2EuRFB2ZkFjdGl2ZVZvdGVMaXN0AQCBCwQABDUBIFRoZSBsaXN0IG9mIGFsbCBjdXJyZW50bHkgYWN0aXZlIFBWRiB2b3Rlcy4gQXV4aWxpYXJ5IHRvIGBQdmZBY3RpdmVWb3RlTWFwYC4oUGFyYWNoYWlucwEAhQsEABBpASBBbGwgbGVhc2UgaG9sZGluZyBwYXJhY2hhaW5zLiBPcmRlcmVkIGFzY2VuZGluZyBieSBgUGFyYUlkYC4gT24gZGVtYW5kIHBhcmFjaGFpbnMgYXJlIG5vdCggaW5jbHVkZWQuAOggQ29uc2lkZXIgdXNpbmcgdGhlIFtgUGFyYWNoYWluc0NhY2hlYF0gdHlwZSBvZiBtb2RpZnlpbmcuOFBhcmFMaWZlY3ljbGVzAAEEBY0CiQsEAAS8IFRoZSBjdXJyZW50IGxpZmVjeWNsZSBvZiBhIGFsbCBrbm93biBQYXJhIElEcy4USGVhZHMAAQQFjQLZBAQABKAgVGhlIGhlYWQtZGF0YSBvZiBldmVyeSByZWdpc3RlcmVkIHBhcmEuRE1vc3RSZWNlbnRDb250ZXh0AAEEBY0CEAQABCkBIFRoZSBjb250ZXh0IChyZWxheS1jaGFpbiBibG9jayBudW1iZXIpIG9mIHRoZSBtb3N0IHJlY2VudCBwYXJhY2hhaW4gaGVhZC48Q3VycmVudENvZGVIYXNoAAEEBY0CuQQEAAy0IFRoZSB2YWxpZGF0aW9uIGNvZGUgaGFzaCBvZiBldmVyeSBsaXZlIHBhcmEuAOQgQ29ycmVzcG9uZGluZyBjb2RlIGNhbiBiZSByZXRyaWV2ZWQgd2l0aCBbYENvZGVCeUhhc2hgXS4wUGFzdENvZGVIYXNoAAEEBY0LuQQEABBhASBBY3R1YWwgcGFzdCBjb2RlIGhhc2gsIGluZGljYXRlZCBieSB0aGUgcGFyYSBpZCBhcyB3ZWxsIGFzIHRoZSBibG9jayBudW1iZXIgYXQgd2hpY2ggaXREIGJlY2FtZSBvdXRkYXRlZC4A5CBDb3JyZXNwb25kaW5nIGNvZGUgY2FuIGJlIHJldHJpZXZlZCB3aXRoIFtgQ29kZUJ5SGFzaGBdLjBQYXN0Q29kZU1ldGEBAQQFjQKRCwgAAAxJASBQYXN0IGNvZGUgb2YgcGFyYWNoYWlucy4gVGhlIHBhcmFjaGFpbnMgdGhlbXNlbHZlcyBtYXkgbm90IGJlIHJlZ2lzdGVyZWQgYW55bW9yZSxJASBidXQgd2UgYWxzbyBrZWVwIHRoZWlyIGNvZGUgb24tY2hhaW4gZm9yIHRoZSBzYW1lIGFtb3VudCBvZiB0aW1lIGFzIG91dGRhdGVkIGNvZGWwIHRvIGtlZXAgaXQgYXZhaWxhYmxlIGZvciBhcHByb3ZhbCBjaGVja2Vycy48UGFzdENvZGVQcnVuaW5nAQCdCwQAGGkBIFdoaWNoIHBhcmFzIGhhdmUgcGFzdCBjb2RlIHRoYXQgbmVlZHMgcHJ1bmluZyBhbmQgdGhlIHJlbGF5LWNoYWluIGJsb2NrIGF0IHdoaWNoIHRoZSBjb2RlaQEgd2FzIHJlcGxhY2VkLiBOb3RlIHRoYXQgdGhpcyBpcyB0aGUgYWN0dWFsIGhlaWdodCBvZiB0aGUgaW5jbHVkZWQgYmxvY2ssIG5vdCB0aGUgZXhwZWN0ZWQ9ASBoZWlnaHQgYXQgd2hpY2ggdGhlIGNvZGUgdXBncmFkZSB3b3VsZCBiZSBhcHBsaWVkLCBhbHRob3VnaCB0aGV5IG1heSBiZSBlcXVhbC5tASBUaGlzIGlzIHRvIGVuc3VyZSB0aGUgZW50aXJlIGFjY2VwdGFuY2UgcGVyaW9kIGlzIGNvdmVyZWQsIG5vdCBhbiBvZmZzZXQgYWNjZXB0YW5jZSBwZXJpb2RtASBzdGFydGluZyBmcm9tIHRoZSB0aW1lIGF0IHdoaWNoIHRoZSBwYXJhY2hhaW4gcGVyY2VpdmVzIGEgY29kZSB1cGdyYWRlIGFzIGhhdmluZyBvY2N1cnJlZC5VASBNdWx0aXBsZSBlbnRyaWVzIGZvciBhIHNpbmdsZSBwYXJhIGFyZSBwZXJtaXR0ZWQuIE9yZGVyZWQgYXNjZW5kaW5nIGJ5IGJsb2NrIG51bWJlci5IRnV0dXJlQ29kZVVwZ3JhZGVzAAEEBY0CEAQAED0BIFRoZSBibG9jayBudW1iZXIgYXQgd2hpY2ggdGhlIHBsYW5uZWQgY29kZSBjaGFuZ2UgaXMgZXhwZWN0ZWQgZm9yIGEgcGFyYWNoYWluLgBlASBUaGUgY2hhbmdlIHdpbGwgYmUgYXBwbGllZCBhZnRlciB0aGUgZmlyc3QgcGFyYWJsb2NrIGZvciB0aGlzIElEIGluY2x1ZGVkIHdoaWNoIGV4ZWN1dGVzGQEgaW4gdGhlIGNvbnRleHQgb2YgYSByZWxheSBjaGFpbiBibG9jayB3aXRoIGEgbnVtYmVyID49IGBleHBlY3RlZF9hdGAuUEZ1dHVyZUNvZGVVcGdyYWRlc0F0AQCdCwQAIKwgVGhlIGxpc3Qgb2YgdXBjb21pbmcgZnV0dXJlIGNvZGUgdXBncmFkZXMuAG0BIEVhY2ggaXRlbSBpcyBhIHBhaXIgb2YgdGhlIHBhcmFjaGFpbiBhbmQgdGhlIGV4cGVjdGVkIGJsb2NrIGF0IHdoaWNoIHRoZSB1cGdyYWRlIHNob3VsZCBiZVEBIGFwcGxpZWQuIFRoZSB1cGdyYWRlIHdpbGwgYmUgYXBwbGllZCBhdCB0aGUgZ2l2ZW4gcmVsYXkgY2hhaW4gYmxvY2suIEluIGNvbnRyYXN0IHRvdQEgW2BGdXR1cmVDb2RlVXBncmFkZXNgXSB0aGlzIGNvZGUgdXBncmFkZSB3aWxsIGJlIGFwcGxpZWQgcmVnYXJkbGVzcyB0aGUgcGFyYWNoYWluIG1ha2luZyBhbnlEIHByb2dyZXNzIG9yIG5vdC4AjCBPcmRlcmVkIGFzY2VuZGluZyBieSBibG9jayBudW1iZXIuOEZ1dHVyZUNvZGVIYXNoAAEEBY0CuQQEAAycIFRoZSBhY3R1YWwgZnV0dXJlIGNvZGUgaGFzaCBvZiBhIHBhcmEuAOQgQ29ycmVzcG9uZGluZyBjb2RlIGNhbiBiZSByZXRyaWV2ZWQgd2l0aCBbYENvZGVCeUhhc2hgXS5QVXBncmFkZUdvQWhlYWRTaWduYWwAAQQFjQKhCwQAKHUBIFRoaXMgaXMgdXNlZCBieSB0aGUgcmVsYXktY2hhaW4gdG8gY29tbXVuaWNhdGUgdG8gYSBwYXJhY2hhaW4gYSBnby1haGVhZCB3aXRoIGluIHRoZSB1cGdyYWRlLCBwcm9jZWR1cmUuAHUBIFRoaXMgdmFsdWUgaXMgYWJzZW50IHdoZW4gdGhlcmUgYXJlIG5vIHVwZ3JhZGVzIHNjaGVkdWxlZCBvciBkdXJpbmcgdGhlIHRpbWUgdGhlIHJlbGF5IGNoYWluVQEgcGVyZm9ybXMgdGhlIGNoZWNrcy4gSXQgaXMgc2V0IGF0IHRoZSBmaXJzdCByZWxheS1jaGFpbiBibG9jayB3aGVuIHRoZSBjb3JyZXNwb25kaW5ndQEgcGFyYWNoYWluIGNhbiBzd2l0Y2ggaXRzIHVwZ3JhZGUgZnVuY3Rpb24uIEFzIHNvb24gYXMgdGhlIHBhcmFjaGFpbidzIGJsb2NrIGlzIGluY2x1ZGVkLCB0aGVwIHZhbHVlIGdldHMgcmVzZXQgdG8gYE5vbmVgLgBlASBOT1RFIHRoYXQgdGhpcyBmaWVsZCBpcyB1c2VkIGJ5IHBhcmFjaGFpbnMgdmlhIG1lcmtsZSBzdG9yYWdlIHByb29mcywgdGhlcmVmb3JlIGNoYW5naW5nxCB0aGUgZm9ybWF0IHdpbGwgcmVxdWlyZSBtaWdyYXRpb24gb2YgcGFyYWNoYWlucy5gVXBncmFkZVJlc3RyaWN0aW9uU2lnbmFsAAEEBY0CpQsEACRpASBUaGlzIGlzIHVzZWQgYnkgdGhlIHJlbGF5LWNoYWluIHRvIGNvbW11bmljYXRlIHRoYXQgdGhlcmUgYXJlIHJlc3RyaWN0aW9ucyBmb3IgcGVyZm9ybWluZ3wgYW4gdXBncmFkZSBmb3IgdGhpcyBwYXJhY2hhaW4uAFkBIFRoaXMgbWF5IGJlIGEgYmVjYXVzZSB0aGUgcGFyYWNoYWluIHdhaXRzIGZvciB0aGUgdXBncmFkZSBjb29sZG93biB0byBleHBpcmUuIEFub3RoZXJtASBwb3RlbnRpYWwgdXNlIGNhc2UgaXMgd2hlbiB3ZSB3YW50IHRvIHBlcmZvcm0gc29tZSBtYWludGVuYW5jZSAoc3VjaCBhcyBzdG9yYWdlIG1pZ3JhdGlvbingIHdlIGNvdWxkIHJlc3RyaWN0IHVwZ3JhZGVzIHRvIG1ha2UgdGhlIHByb2Nlc3Mgc2ltcGxlci4AZQEgTk9URSB0aGF0IHRoaXMgZmllbGQgaXMgdXNlZCBieSBwYXJhY2hhaW5zIHZpYSBtZXJrbGUgc3RvcmFnZSBwcm9vZnMsIHRoZXJlZm9yZSBjaGFuZ2luZ8QgdGhlIGZvcm1hdCB3aWxsIHJlcXVpcmUgbWlncmF0aW9uIG9mIHBhcmFjaGFpbnMuQFVwZ3JhZGVDb29sZG93bnMBAJ0LBAAMUQEgVGhlIGxpc3Qgb2YgcGFyYWNoYWlucyB0aGF0IGFyZSBhd2FpdGluZyBmb3IgdGhlaXIgdXBncmFkZSByZXN0cmljdGlvbiB0byBjb29sZG93bi4AjCBPcmRlcmVkIGFzY2VuZGluZyBieSBibG9jayBudW1iZXIuQFVwY29taW5nVXBncmFkZXMBAJ0LBAAYkCBUaGUgbGlzdCBvZiB1cGNvbWluZyBjb2RlIHVwZ3JhZGVzLgBxASBFYWNoIGl0ZW0gaXMgYSBwYWlyIG9mIHdoaWNoIHBhcmEgcGVyZm9ybXMgYSBjb2RlIHVwZ3JhZGUgYW5kIGF0IHdoaWNoIHJlbGF5LWNoYWluIGJsb2NrIGl0QCBpcyBleHBlY3RlZCBhdC4AjCBPcmRlcmVkIGFzY2VuZGluZyBieSBibG9jayBudW1iZXIuMEFjdGlvbnNRdWV1ZQEBBAUQhQsEAAQVASBUaGUgYWN0aW9ucyB0byBwZXJmb3JtIGR1cmluZyB0aGUgc3RhcnQgb2YgYSBzcGVjaWZpYyBzZXNzaW9uIGluZGV4LlBVcGNvbWluZ1BhcmFzR2VuZXNpcwABBAWNAqkLBAAQoCBVcGNvbWluZyBwYXJhcyBpbnN0YW50aWF0aW9uIGFyZ3VtZW50cy4AZQEgTk9URSB0aGF0IGFmdGVyIFBWRiBwcmUtY2hlY2tpbmcgaXMgZW5hYmxlZCB0aGUgcGFyYSBnZW5lc2lzIGFyZyB3aWxsIGhhdmUgaXQncyBjb2RlIHNldGEBIHRvIGVtcHR5LiBJbnN0ZWFkLCB0aGUgY29kZSB3aWxsIGJlIHNhdmVkIGludG8gdGhlIHN0b3JhZ2UgcmlnaHQgYXdheSB2aWEgYENvZGVCeUhhc2hgLjhDb2RlQnlIYXNoUmVmcwEBBAa5BBAQAAAAAAQpASBUaGUgbnVtYmVyIG9mIHJlZmVyZW5jZSBvbiB0aGUgdmFsaWRhdGlvbiBjb2RlIGluIFtgQ29kZUJ5SGFzaGBdIHN0b3JhZ2UuKENvZGVCeUhhc2gAAQQGuQTVBAQAEJAgVmFsaWRhdGlvbiBjb2RlIHN0b3JlZCBieSBpdHMgaGFzaC4AMQEgVGhpcyBzdG9yYWdlIGlzIGNvbnNpc3RlbnQgd2l0aCBbYEZ1dHVyZUNvZGVIYXNoYF0sIFtgQ3VycmVudENvZGVIYXNoYF0gYW5kSCBbYFBhc3RDb2RlSGFzaGBdLgEJBQF5BwRAVW5zaWduZWRQcmlvcml0eTAg//////////8AAa0LOAAsSW5pdGlhbGl6ZXIBLEluaXRpYWxpemVyCDhIYXNJbml0aWFsaXplZAAAjAQAICEBIFdoZXRoZXIgdGhlIHBhcmFjaGFpbnMgbW9kdWxlcyBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQgd2l0aGluIHRoaXMgYmxvY2suACUBIFNlbWFudGljYWxseSBhIGBib29sYCwgYnV0IHRoaXMgZ3VhcmFudGVlcyBpdCBzaG91bGQgbmV2ZXIgaGl0IHRoZSB0cmllLGkBIGFzIHRoaXMgaXMgY2xlYXJlZCBpbiBgb25fZmluYWxpemVgIGFuZCBGcmFtZSBvcHRpbWl6ZXMgYE5vbmVgIHZhbHVlcyB0byBiZSBlbXB0eSB2YWx1ZXMuAHEBIEFzIGEgYGJvb2xgLCBgc2V0KGZhbHNlKWAgYW5kIGByZW1vdmUoKWAgYm90aCBsZWFkIHRvIHRoZSBuZXh0IGBnZXQoKWAgYmVpbmcgZmFsc2UsIGJ1dCBvbmV1ASBvZiB0aGVtIHdyaXRlcyB0byB0aGUgdHJpZSBhbmQgb25lIGRvZXMgbm90LiBUaGlzIGNvbmZ1c2lvbiBtYWtlcyBgT3B0aW9uPCgpPmAgbW9yZSBzdWl0YWJsZZAgZm9yIHRoZSBzZW1hbnRpY3Mgb2YgdGhpcyB2YXJpYWJsZS5YQnVmZmVyZWRTZXNzaW9uQ2hhbmdlcwEAsQsEABxZASBCdWZmZXJlZCBzZXNzaW9uIGNoYW5nZXMgYWxvbmcgd2l0aCB0aGUgYmxvY2sgbnVtYmVyIGF0IHdoaWNoIHRoZXkgc2hvdWxkIGJlIGFwcGxpZWQuAF0BIFR5cGljYWxseSB0aGlzIHdpbGwgYmUgZW1wdHkgb3Igb25lIGVsZW1lbnQgbG9uZy4gQXBhcnQgZnJvbSB0aGF0IHRoaXMgaXRlbSBuZXZlciBoaXRzNCB0aGUgc3RvcmFnZS4AaQEgSG93ZXZlciB0aGlzIGlzIGEgYFZlY2AgcmVnYXJkbGVzcyB0byBoYW5kbGUgdmFyaW91cyBlZGdlIGNhc2VzIHRoYXQgbWF5IG9jY3VyIGF0IHJ1bnRpbWXAIHVwZ3JhZGUgYm91bmRhcmllcyBvciBpZiBnb3Zlcm5hbmNlIGludGVydmVuZXMuAREFAAAAOQAMRG1wAQxEbXAMVERvd253YXJkTWVzc2FnZVF1ZXVlcwEBBAWNArkLBAAE0CBUaGUgZG93bndhcmQgbWVzc2FnZXMgYWRkcmVzc2VkIGZvciBhIGNlcnRhaW4gcGFyYS5kRG93bndhcmRNZXNzYWdlUXVldWVIZWFkcwEBBAWNAjSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcJQEgQSBtYXBwaW5nIHRoYXQgc3RvcmVzIHRoZSBkb3dud2FyZCBtZXNzYWdlIHF1ZXVlIE1RQyBoZWFkIGZvciBlYWNoIHBhcmEuAJAgRWFjaCBsaW5rIGluIHRoaXMgY2hhaW4gaGFzIGEgZm9ybTp4IGAocHJldl9oZWFkLCBCLCBIKE0pKWAsIHdoZXJl6CAtIGBwcmV2X2hlYWRgOiBpcyB0aGUgcHJldmlvdXMgaGVhZCBoYXNoIG9yIHplcm8gaWYgbm9uZS4hASAtIGBCYDogaXMgdGhlIHJlbGF5LWNoYWluIGJsb2NrIG51bWJlciBpbiB3aGljaCBhIG1lc3NhZ2Ugd2FzIGFwcGVuZGVkLtQgLSBgSChNKWA6IGlzIHRoZSBoYXNoIG9mIHRoZSBtZXNzYWdlIGJlaW5nIGFwcGVuZGVkLkREZWxpdmVyeUZlZUZhY3RvcgEBBAWNAtEGQAAAZKeztuANAAAAAAAAAAAExCBUaGUgZmFjdG9yIHRvIG11bHRpcGx5IHRoZSBiYXNlIGRlbGl2ZXJ5IGZlZSBieS4AAAAAOgAQSHJtcAEQSHJtcDBcSHJtcE9wZW5DaGFubmVsUmVxdWVzdHMAAQQFGQXBCwQAGLwgVGhlIHNldCBvZiBwZW5kaW5nIEhSTVAgb3BlbiBjaGFubmVsIHJlcXVlc3RzLgDAIFRoZSBzZXQgaXMgYWNjb21wYW5pZWQgYnkgYSBsaXN0IGZvciBpdGVyYXRpb24uACwgSW52YXJpYW50Oj0BIC0gVGhlcmUgYXJlIG5vIGNoYW5uZWxzIHRoYXQgZXhpc3RzIGluIGxpc3QgYnV0IG5vdCBpbiB0aGUgc2V0IGFuZCB2aWNlIHZlcnNhLmxIcm1wT3BlbkNoYW5uZWxSZXF1ZXN0c0xpc3QBAMULBAAAbEhybXBPcGVuQ2hhbm5lbFJlcXVlc3RDb3VudAEBBAWNAhAQAAAAAAxlASBUaGlzIG1hcHBpbmcgdHJhY2tzIGhvdyBtYW55IG9wZW4gY2hhbm5lbCByZXF1ZXN0cyBhcmUgaW5pdGlhdGVkIGJ5IGEgZ2l2ZW4gc2VuZGVyIHBhcmEuWQEgSW52YXJpYW50OiBgSHJtcE9wZW5DaGFubmVsUmVxdWVzdHNgIHNob3VsZCBjb250YWluIHRoZSBzYW1lIG51bWJlciBvZiBpdGVtcyB0aGF0IGhhcwUBIGAoWCwgXylgIGFzIHRoZSBudW1iZXIgb2YgYEhybXBPcGVuQ2hhbm5lbFJlcXVlc3RDb3VudGAgZm9yIGBYYC58SHJtcEFjY2VwdGVkQ2hhbm5lbFJlcXVlc3RDb3VudAEBBAWNAhAQAAAAAAxxASBUaGlzIG1hcHBpbmcgdHJhY2tzIGhvdyBtYW55IG9wZW4gY2hhbm5lbCByZXF1ZXN0cyB3ZXJlIGFjY2VwdGVkIGJ5IGEgZ2l2ZW4gcmVjaXBpZW50IHBhcmEubQEgSW52YXJpYW50OiBgSHJtcE9wZW5DaGFubmVsUmVxdWVzdHNgIHNob3VsZCBjb250YWluIHRoZSBzYW1lIG51bWJlciBvZiBpdGVtcyBgKF8sIFgpYCB3aXRoVQEgYGNvbmZpcm1lZGAgc2V0IHRvIHRydWUsIGFzIHRoZSBudW1iZXIgb2YgYEhybXBBY2NlcHRlZENoYW5uZWxSZXF1ZXN0Q291bnRgIGZvciBgWGAuYEhybXBDbG9zZUNoYW5uZWxSZXF1ZXN0cwABBAUZBYwEABxxASBBIHNldCBvZiBwZW5kaW5nIEhSTVAgY2xvc2UgY2hhbm5lbCByZXF1ZXN0cyB0aGF0IGFyZSBnb2luZyB0byBiZSBjbG9zZWQgZHVyaW5nIHRoZSBzZXNzaW9uIQEgY2hhbmdlLiBVc2VkIGZvciBjaGVja2luZyBpZiBhIGdpdmVuIGNoYW5uZWwgaXMgcmVnaXN0ZXJlZCBmb3IgY2xvc3VyZS4AwCBUaGUgc2V0IGlzIGFjY29tcGFuaWVkIGJ5IGEgbGlzdCBmb3IgaXRlcmF0aW9uLgAsIEludmFyaWFudDo9ASAtIFRoZXJlIGFyZSBubyBjaGFubmVscyB0aGF0IGV4aXN0cyBpbiBsaXN0IGJ1dCBub3QgaW4gdGhlIHNldCBhbmQgdmljZSB2ZXJzYS5wSHJtcENsb3NlQ2hhbm5lbFJlcXVlc3RzTGlzdAEAxQsEAAA4SHJtcFdhdGVybWFya3MAAQQFjQIQBAAQuCBUaGUgSFJNUCB3YXRlcm1hcmsgYXNzb2NpYXRlZCB3aXRoIGVhY2ggcGFyYS4sIEludmFyaWFudDpVASAtIGVhY2ggcGFyYSBgUGAgdXNlZCBoZXJlIGFzIGEga2V5IHNob3VsZCBzYXRpc2Z5IGBQYXJhczo6aXNfdmFsaWRfcGFyYShQKWAgd2l0aGluIGEsICAgc2Vzc2lvbi4wSHJtcENoYW5uZWxzAAEEBRkFyQsEAAy0IEhSTVAgY2hhbm5lbCBkYXRhIGFzc29jaWF0ZWQgd2l0aCBlYWNoIHBhcmEuLCBJbnZhcmlhbnQ6dQEgLSBlYWNoIHBhcnRpY2lwYW50IGluIHRoZSBjaGFubmVsIHNob3VsZCBzYXRpc2Z5IGBQYXJhczo6aXNfdmFsaWRfcGFyYShQKWAgd2l0aGluIGEgc2Vzc2lvbi5gSHJtcEluZ3Jlc3NDaGFubmVsc0luZGV4AQEEBY0ChQsEADRxASBJbmdyZXNzL2VncmVzcyBpbmRleGVzIGFsbG93IHRvIGZpbmQgYWxsIHRoZSBzZW5kZXJzIGFuZCByZWNlaXZlcnMgZ2l2ZW4gdGhlIG9wcG9zaXRlIHNpZGUuFCBJLmUuACEBIChhKSBpbmdyZXNzIGluZGV4IGFsbG93cyB0byBmaW5kIGFsbCB0aGUgc2VuZGVycyBmb3IgYSBnaXZlbiByZWNpcGllbnQuHQEgKGIpIGVncmVzcyBpbmRleCBhbGxvd3MgdG8gZmluZCBhbGwgdGhlIHJlY2lwaWVudHMgZm9yIGEgZ2l2ZW4gc2VuZGVyLgAwIEludmFyaWFudHM6UQEgLSBmb3IgZWFjaCBpbmdyZXNzIGluZGV4IGVudHJ5IGZvciBgUGAgZWFjaCBpdGVtIGBJYCBpbiB0aGUgaW5kZXggc2hvdWxkIHByZXNlbnQgaW54ICAgYEhybXBDaGFubmVsc2AgYXMgYChJLCBQKWAuTQEgLSBmb3IgZWFjaCBlZ3Jlc3MgaW5kZXggZW50cnkgZm9yIGBQYCBlYWNoIGl0ZW0gYEVgIGluIHRoZSBpbmRleCBzaG91bGQgcHJlc2VudCBpbnggICBgSHJtcENoYW5uZWxzYCBhcyBgKFAsIEUpYC4BASAtIHRoZXJlIHNob3VsZCBiZSBubyBvdGhlciBkYW5nbGluZyBjaGFubmVscyBpbiBgSHJtcENoYW5uZWxzYC5oIC0gdGhlIHZlY3RvcnMgYXJlIHNvcnRlZC5cSHJtcEVncmVzc0NoYW5uZWxzSW5kZXgBAQQFjQKFCwQAAExIcm1wQ2hhbm5lbENvbnRlbnRzAQEEBRkFzQsEAAisIFN0b3JhZ2UgZm9yIHRoZSBtZXNzYWdlcyBmb3IgZWFjaCBjaGFubmVsLmUBIEludmFyaWFudDogY2Fubm90IGJlIG5vbi1lbXB0eSBpZiB0aGUgY29ycmVzcG9uZGluZyBjaGFubmVsIGluIGBIcm1wQ2hhbm5lbHNgIGlzIGBOb25lYC5ISHJtcENoYW5uZWxEaWdlc3RzAQEEBY0C1QsEABhpASBNYWludGFpbnMgYSBtYXBwaW5nIHRoYXQgY2FuIGJlIHVzZWQgdG8gYW5zd2VyIHRoZSBxdWVzdGlvbjogV2hhdCBwYXJhcyBzZW50IGEgbWVzc2FnZSBhdOQgdGhlIGdpdmVuIGJsb2NrIG51bWJlciBmb3IgYSBnaXZlbiByZWNlaXZlci4gSW52YXJpYW50czqoIC0gVGhlIGlubmVyIGBWZWM8UGFyYUlkPmAgaXMgbmV2ZXIgZW1wdHku6CAtIFRoZSBpbm5lciBgVmVjPFBhcmFJZD5gIGNhbm5vdCBzdG9yZSB0d28gc2FtZSBgUGFyYUlkYC5tASAtIFRoZSBvdXRlciB2ZWN0b3IgaXMgc29ydGVkIGFzY2VuZGluZyBieSBibG9jayBudW1iZXIgYW5kIGNhbm5vdCBzdG9yZSB0d28gaXRlbXMgd2l0aCB0aGVUICAgc2FtZSBibG9jayBudW1iZXIuARUFAX0HAAHdCzwAPFBhcmFTZXNzaW9uSW5mbwE8UGFyYVNlc3Npb25JbmZvFFBBc3NpZ25tZW50S2V5c1Vuc2FmZQEA4QsEAAykIEFzc2lnbm1lbnQga2V5cyBmb3IgdGhlIGN1cnJlbnQgc2Vzc2lvbi5tASBOb3RlIHRoYXQgdGhpcyBBUEkgaXMgcHJpdmF0ZSBkdWUgdG8gaXQgYmVpbmcgcHJvbmUgdG8gJ29mZi1ieS1vbmUnIGF0IHNlc3Npb24gYm91bmRhcmllcy6sIFdoZW4gaW4gZG91YnQsIHVzZSBgU2Vzc2lvbnNgIEFQSSBpbnN0ZWFkLlRFYXJsaWVzdFN0b3JlZFNlc3Npb24BABAQAAAAAAQBASBUaGUgZWFybGllc3Qgc2Vzc2lvbiBmb3Igd2hpY2ggcHJldmlvdXMgc2Vzc2lvbiBpbmZvIGlzIHN0b3JlZC4gU2Vzc2lvbnMAAQQGEOULBAAMpCBTZXNzaW9uIGluZm9ybWF0aW9uIGluIGEgcm9sbGluZyB3aW5kb3cuNQEgU2hvdWxkIGhhdmUgYW4gZW50cnkgaW4gcmFuZ2UgYEVhcmxpZXN0U3RvcmVkU2Vzc2lvbi4uPUN1cnJlbnRTZXNzaW9uSW5kZXhgLnUBIERvZXMgbm90IGhhdmUgYW55IGVudHJpZXMgYmVmb3JlIHRoZSBzZXNzaW9uIGluZGV4IGluIHRoZSBmaXJzdCBzZXNzaW9uIGNoYW5nZSBub3RpZmljYXRpb24uLEFjY291bnRLZXlzAAEEBhDRAQQABHEBIFRoZSB2YWxpZGF0b3IgYWNjb3VudCBrZXlzIG9mIHRoZSB2YWxpZGF0b3JzIGFjdGl2ZWx5IHBhcnRpY2lwYXRpbmcgaW4gcGFyYWNoYWluIGNvbnNlbnN1cy5UU2Vzc2lvbkV4ZWN1dG9yUGFyYW1zAAEEBhBZBAQABMQgRXhlY3V0b3IgcGFyYW1ldGVyIHNldCBmb3IgYSBnaXZlbiBzZXNzaW9uIGluZGV4AAAAAD0ANFBhcmFzRGlzcHV0ZXMBNFBhcmFzRGlzcHV0ZXMURExhc3RQcnVuZWRTZXNzaW9uAAAQBAAIAQEgVGhlIGxhc3QgcHJ1bmVkIHNlc3Npb24sIGlmIGFueS4gQWxsIGRhdGEgc3RvcmVkIGJ5IHRoaXMgbW9kdWxlVCByZWZlcmVuY2VzIHNlc3Npb25zLiBEaXNwdXRlcwABCAUC8Qv1CwQABAUBIEFsbCBvbmdvaW5nIG9yIGNvbmNsdWRlZCBkaXNwdXRlcyBmb3IgdGhlIGxhc3Qgc2V2ZXJhbCBzZXNzaW9ucy5EQmFja2Vyc09uRGlzcHV0ZXMAAQgFAvEL+QsEAAicIEJhY2tpbmcgdm90ZXMgc3RvcmVkIGZvciBlYWNoIGRpc3B1dGUujCBUaGlzIHN0b3JhZ2UgaXMgdXNlZCBmb3Igc2xhc2hpbmcuIEluY2x1ZGVkAAEIBQLxCxAEAAhFASBBbGwgaW5jbHVkZWQgYmxvY2tzIG9uIHRoZSBjaGFpbiwgYXMgd2VsbCBhcyB0aGUgYmxvY2sgbnVtYmVyIGluIHRoaXMgY2hhaW4gdGhhdFkBIHNob3VsZCBiZSByZXZlcnRlZCBiYWNrIHRvIGlmIHRoZSBjYW5kaWRhdGUgaXMgZGlzcHV0ZWQgYW5kIGRldGVybWluZWQgdG8gYmUgaW52YWxpZC4YRnJvemVuAQBhAgQAEBEBIFdoZXRoZXIgdGhlIGNoYWluIGlzIGZyb3plbi4gU3RhcnRzIGFzIGBOb25lYC4gV2hlbiB0aGlzIGlzIGBTb21lYCw1ASB0aGUgY2hhaW4gd2lsbCBub3QgYWNjZXB0IGFueSBuZXcgcGFyYWNoYWluIGJsb2NrcyBmb3IgYmFja2luZyBvciBpbmNsdXNpb24sCQEgYW5kIGl0cyB2YWx1ZSBpbmRpY2F0ZXMgdGhlIGxhc3QgdmFsaWQgYmxvY2sgbnVtYmVyIGluIHRoZSBjaGFpbi74IEl0IGNhbiBvbmx5IGJlIHNldCBiYWNrIHRvIGBOb25lYCBieSBnb3Zlcm5hbmNlIGludGVydmVudGlvbi4BHQUBgQcAAf0LPgA0UGFyYXNTbGFzaGluZwE0UGFyYXNTbGFzaGluZwhAVW5hcHBsaWVkU2xhc2hlcwABCAUC8QsBDAQABJAgVmFsaWRhdG9ycyBwZW5kaW5nIGRpc3B1dGUgc2xhc2hlcy5IVmFsaWRhdG9yU2V0Q291bnRzAAEEBRAQBAAEhCBgVmFsaWRhdG9yU2V0Q291bnRgIHBlciBzZXNzaW9uLgEhBQAAAREMPwAgT25EZW1hbmQBIE9uRGVtYW5kFDhQYXJhSWRBZmZpbml0eQABBAWNAhUMBAAMcQEgTWFwcyBhIGBQYXJhSWRgIHRvIGBDb3JlSW5kZXhgIGFuZCBrZWVwcyB0cmFjayBvZiBob3cgbWFueSBhc3NpZ25tZW50cyB0aGUgc2NoZWR1bGVyIGhhcyBpbl0BIGl0J3MgbG9va2FoZWFkLiBLZWVwaW5nIHRyYWNrIG9mIHRoaXMgYWZmaW5pdHkgcHJldmVudHMgcGFyYWxsZWwgZXhlY3V0aW9uIG9mIHRoZSBzYW1lnCBgUGFyYUlkYCBvbiB0d28gb3IgbW9yZSBgQ29yZUluZGV4YGVzLixRdWV1ZVN0YXR1cwEAGQxkAABkp7O24A0AAAAAAAAAAAAAAAAAAAAAAATcIE92ZXJhbGwgc3RhdHVzIG9mIHF1ZXVlIChib3RoIGZyZWUgKyBhZmZpbml0eSBlbnRyaWVzKSxGcmVlRW50cmllcwEALQwEAARhASBQcmlvcml0eSBxdWV1ZSBmb3IgYWxsIG9yZGVycyB3aGljaCBkb24ndCB5ZXQgKG9yIG5vdCBhbnkgbW9yZSkgaGF2ZSBhbnkgY29yZSBhZmZpbml0eS48QWZmaW5pdHlFbnRyaWVzAQEEBXEHLQwEAARJASBRdWV1ZSBlbnRyaWVzIHRoYXQgYXJlIGN1cnJlbnRseSBib3VuZCB0byBhIHBhcnRpY3VsYXIgY29yZSBkdWUgdG8gY29yZSBhZmZpbml0eS4cUmV2ZW51ZQEAOQwEAAT8IEtlZXBzIHRyYWNrIG9mIGFjY3VtdWxhdGVkIHJldmVudWUgZnJvbSBvbiBkZW1hbmQgb3JkZXIgc2FsZXMuATEFAY0HDExUcmFmZmljRGVmYXVsdFZhbHVl0QZAAABkp7O24A0AAAAAAAAAAATMIFRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgc3BvdCB0cmFmZmljIG11bHRpcGxpZXIuUE1heEhpc3RvcmljYWxSZXZlbnVlEBCgAAAACNQgVGhlIG1heGltdW0gbnVtYmVyIG9mIGJsb2NrcyBzb21lIGhpc3RvcmljYWwgcmV2ZW51ZWAgaW5mb3JtYXRpb24gc3RvcmVkIGZvci4gUGFsbGV0SWSBCSBweS9vbmRtZAS0IElkZW50aWZpZXIgZm9yIHRoZSBpbnRlcm5hbCByZXZlbnVlIGJhbGFuY2UuAUEMQABoQ29yZXRpbWVBc3NpZ25tZW50UHJvdmlkZXIBaENvcmV0aW1lQXNzaWdubWVudFByb3ZpZGVyCDRDb3JlU2NoZWR1bGVzAAEEBEUMSQwEABBsIFNjaGVkdWxlZCBhc3NpZ25tZW50IHNldHMuAG0BIEFzc2lnbm1lbnRzIGFzIG9mIHRoZSBnaXZlbiBibG9jayBudW1iZXIuIFRoZXkgd2lsbCBnbyBpbnRvIHN0YXRlIG9uY2UgdGhlIGJsb2NrIG51bWJlciBpc9AgcmVhY2hlZCAoYW5kIHJlcGxhY2Ugd2hhdGV2ZXIgd2FzIGluIHRoZXJlIGJlZm9yZSkuPENvcmVEZXNjcmlwdG9ycwEBBARxB00MCAAAEKAgQXNzaWdubWVudHMgd2hpY2ggYXJlIGN1cnJlbnRseSBhY3RpdmUuAGkBIFRoZXkgd2lsbCBiZSBwaWNrZWQgZnJvbSBgUGVuZGluZ0Fzc2lnbm1lbnRzYCBvbmNlIHdlIHJlYWNoIHRoZSBzY2hlZHVsZWQgYmxvY2sgbnVtYmVyIGluWCBgUGVuZGluZ0Fzc2lnbm1lbnRzYC4AAAABbQxBACRSZWdpc3RyYXIBJFJlZ2lzdHJhcgwsUGVuZGluZ1N3YXAAAQQFjQKNAgQABGQgUGVuZGluZyBzd2FwIG9wZXJhdGlvbnMuFFBhcmFzAAEEBY0CcQwEABAFASBBbW91bnQgaGVsZCBvbiBkZXBvc2l0IGZvciBlYWNoIHBhcmEgYW5kIHRoZSBvcmlnaW5hbCBkZXBvc2l0b3IuAHEBIFRoZSBnaXZlbiBhY2NvdW50IElEIGlzIHJlc3BvbnNpYmxlIGZvciByZWdpc3RlcmluZyB0aGUgY29kZSBhbmQgaW5pdGlhbCBoZWFkIGRhdGEsIGJ1dCBtYXlVASBvbmx5IGRvIHNvIGlmIGl0IGlzbid0IHlldCByZWdpc3RlcmVkLiAoQWZ0ZXIgdGhhdCwgaXQncyB1cCB0byBnb3Zlcm5hbmNlIHRvIGRvIHNvLik4TmV4dEZyZWVQYXJhSWQBAI0CEAAAAAAEYCBUaGUgbmV4dCBmcmVlIGBQYXJhSWRgLgE1BQGRBwgsUGFyYURlcG9zaXQYQAAQpdToAAAAAAAAAAAAAAAI1CBUaGUgZGVwb3NpdCB0byBiZSBwYWlkIHRvIHJ1biBhIG9uLWRlbWFuZCBwYXJhY2hhaW4uPQEgVGhpcyBzaG91bGQgaW5jbHVkZSB0aGUgY29zdCBmb3Igc3RvcmluZyB0aGUgZ2VuZXNpcyBoZWFkIGFuZCB2YWxpZGF0aW9uIGNvZGUuSERhdGFEZXBvc2l0UGVyQnl0ZRhAgJaYAAAAAAAAAAAAAAAAAATEIFRoZSBkZXBvc2l0IHRvIGJlIHBhaWQgcGVyIGJ5dGUgc3RvcmVkIG9uIGNoYWluLgF1DEYAFFNsb3RzARRTbG90cwQYTGVhc2VzAQEEBY0CeQwEAEAVASBBbW91bnRzIGhlbGQgb24gZGVwb3NpdCBmb3IgZWFjaCAocG9zc2libHkgZnV0dXJlKSBsZWFzZWQgcGFyYWNoYWluLgBhASBUaGUgYWN0dWFsIGFtb3VudCBsb2NrZWQgb24gaXRzIGJlaGFsZiBieSBhbnkgYWNjb3VudCBhdCBhbnkgdGltZSBpcyB0aGUgbWF4aW11bSBvZiB0aGUpASBzZWNvbmQgdmFsdWVzIG9mIHRoZSBpdGVtcyBpbiB0aGlzIGxpc3Qgd2hvc2UgZmlyc3QgdmFsdWUgaXMgdGhlIGFjY291bnQuAGEBIFRoZSBmaXJzdCBpdGVtIGluIHRoZSBsaXN0IGlzIHRoZSBhbW91bnQgbG9ja2VkIGZvciB0aGUgY3VycmVudCBMZWFzZSBQZXJpb2QuIEZvbGxvd2luZ7AgaXRlbXMgYXJlIGZvciB0aGUgc3Vic2VxdWVudCBsZWFzZSBwZXJpb2RzLgBhASBUaGUgZGVmYXVsdCB2YWx1ZSAoYW4gZW1wdHkgbGlzdCkgaW1wbGllcyB0aGF0IHRoZSBwYXJhY2hhaW4gbm8gbG9uZ2VyIGV4aXN0cyAob3IgbmV2ZXK0IGV4aXN0ZWQpIGFzIGZhciBhcyB0aGlzIHBhbGxldCBpcyBjb25jZXJuZWQuAFEBIElmIGEgcGFyYWNoYWluIGRvZXNuJ3QgZXhpc3QgKnlldCogYnV0IGlzIHNjaGVkdWxlZCB0byBleGlzdCBpbiB0aGUgZnV0dXJlLCB0aGVuIGl0YQEgd2lsbCBiZSBsZWZ0LXBhZGRlZCB3aXRoIG9uZSBvciBtb3JlIGBOb25lYHMgdG8gZGVub3RlIHRoZSBmYWN0IHRoYXQgbm90aGluZyBpcyBoZWxkIG9uXQEgZGVwb3NpdCBmb3IgdGhlIG5vbi1leGlzdGVudCBjaGFpbiBjdXJyZW50bHksIGJ1dCBpcyBoZWxkIGF0IHNvbWUgcG9pbnQgaW4gdGhlIGZ1dHVyZS4A3CBJdCBpcyBpbGxlZ2FsIGZvciBhIGBOb25lYCB2YWx1ZSB0byB0cmFpbCBpbiB0aGUgbGlzdC4BOQUBlQcILExlYXNlUGVyaW9kEBAAdRIABNwgVGhlIG51bWJlciBvZiBibG9ja3Mgb3ZlciB3aGljaCBhIHNpbmdsZSBwZXJpb2QgbGFzdHMuLExlYXNlT2Zmc2V0EBAAEA4ABNQgVGhlIG51bWJlciBvZiBibG9ja3MgdG8gb2Zmc2V0IGVhY2ggbGVhc2UgcGVyaW9kIGJ5LgF9DEcAIEF1Y3Rpb25zASBBdWN0aW9ucxA4QXVjdGlvbkNvdW50ZXIBABAQAAAAAASMIE51bWJlciBvZiBhdWN0aW9ucyBzdGFydGVkIHNvIGZhci4sQXVjdGlvbkluZm8AAIAEABT4IEluZm9ybWF0aW9uIHJlbGF0aW5nIHRvIHRoZSBjdXJyZW50IGF1Y3Rpb24sIGlmIHRoZXJlIGlzIG9uZS4ARQEgVGhlIGZpcnN0IGl0ZW0gaW4gdGhlIHR1cGxlIGlzIHRoZSBsZWFzZSBwZXJpb2QgaW5kZXggdGhhdCB0aGUgZmlyc3Qgb2YgdGhlIGZvdXJRASBjb250aWd1b3VzIGxlYXNlIHBlcmlvZHMgb24gYXVjdGlvbiBpcyBmb3IuIFRoZSBzZWNvbmQgaXMgdGhlIGJsb2NrIG51bWJlciB3aGVuIHRoZV0BIGF1Y3Rpb24gd2lsbCAiYmVnaW4gdG8gZW5kIiwgaS5lLiB0aGUgZmlyc3QgYmxvY2sgb2YgdGhlIEVuZGluZyBQZXJpb2Qgb2YgdGhlIGF1Y3Rpb24uPFJlc2VydmVkQW1vdW50cwABBAWBDBgEAAgxASBBbW91bnRzIGN1cnJlbnRseSByZXNlcnZlZCBpbiB0aGUgYWNjb3VudHMgb2YgdGhlIGJpZGRlcnMgY3VycmVudGx5IHdpbm5pbmc4IChzdWItKXJhbmdlcy4cV2lubmluZwABBAUQhQwEAAxhASBUaGUgd2lubmluZyBiaWRzIGZvciBlYWNoIG9mIHRoZSAxMCByYW5nZXMgYXQgZWFjaCBzYW1wbGUgaW4gdGhlIGZpbmFsIEVuZGluZyBQZXJpb2Qgb2ZJASB0aGUgY3VycmVudCBhdWN0aW9uLiBUaGUgbWFwJ3Mga2V5IGlzIHRoZSAwLWJhc2VkIGluZGV4IGludG8gdGhlIFNhbXBsZSBTaXplLiBUaGUdASBmaXJzdCBzYW1wbGUgb2YgdGhlIGVuZGluZyBwZXJpb2QgaXMgMDsgdGhlIGxhc3QgaXMgYFNhbXBsZSBTaXplIC0gMWAuAT0FAZkHEDBFbmRpbmdQZXJpb2QQEEAZAQAEHQEgVGhlIG51bWJlciBvZiBibG9ja3Mgb3ZlciB3aGljaCBhbiBhdWN0aW9uIG1heSBiZSByZXRyb2FjdGl2ZWx5IGVuZGVkLjBTYW1wbGVMZW5ndGgQEBQAAAAM8CBUaGUgbGVuZ3RoIG9mIGVhY2ggc2FtcGxlIHRvIHRha2UgZHVyaW5nIHRoZSBlbmRpbmcgcGVyaW9kLgDUIGBFbmRpbmdQZXJpb2RgIC8gYFNhbXBsZUxlbmd0aGAgPSBUb3RhbCAjIG9mIFNhbXBsZXM4U2xvdFJhbmdlQ291bnQQECQAAAAATExlYXNlUGVyaW9kc1BlclNsb3QQEAgAAAAAAZEMSAAkQ3Jvd2Rsb2FuASRDcm93ZGxvYW4QFEZ1bmRzAAEEBY0ClQwEAARoIEluZm8gb24gYWxsIG9mIHRoZSBmdW5kcy4gTmV3UmFpc2UBAIULBAAIVQEgVGhlIGZ1bmRzIHRoYXQgaGF2ZSBoYWQgYWRkaXRpb25hbCBjb250cmlidXRpb25zIGR1cmluZyB0aGUgbGFzdCBibG9jay4gVGhpcyBpcyB1c2VkFQEgaW4gb3JkZXIgdG8gZGV0ZXJtaW5lIHdoaWNoIGZ1bmRzIHNob3VsZCBzdWJtaXQgbmV3IG9yIHVwZGF0ZWQgYmlkcy4wRW5kaW5nc0NvdW50AQAQEAAAAAAEKQEgVGhlIG51bWJlciBvZiBhdWN0aW9ucyB0aGF0IGhhdmUgZW50ZXJlZCBpbnRvIHRoZWlyIGVuZGluZyBwZXJpb2Qgc28gZmFyLjROZXh0RnVuZEluZGV4AQAQEAAAAAAEqCBUcmFja2VyIGZvciB0aGUgbmV4dCBhdmFpbGFibGUgZnVuZCBpbmRleAFFBQGdBwwgUGFsbGV0SWSBCSBweS9jZnVuZAgNASBgUGFsbGV0SWRgIGZvciB0aGUgY3Jvd2Rsb2FuIHBhbGxldC4gQW4gYXBwcm9wcmlhdGUgdmFsdWUgY291bGQgYmVkIGBQYWxsZXRJZCgqYiJweS9jZnVuZCIpYDxNaW5Db250cmlidXRpb24YQAB0O6QLAAAAAAAAAAAAAAAIYQEgVGhlIG1pbmltdW0gYW1vdW50IHRoYXQgbWF5IGJlIGNvbnRyaWJ1dGVkIGludG8gYSBjcm93ZGxvYW4uIFNob3VsZCBhbG1vc3QgY2VydGFpbmx5IGJlfCBhdCBsZWFzdCBgRXhpc3RlbnRpYWxEZXBvc2l0YC48UmVtb3ZlS2V5c0xpbWl0EBDoAwAABOQgTWF4IG51bWJlciBvZiBzdG9yYWdlIGtleXMgdG8gcmVtb3ZlIHBlciBleHRyaW5zaWMgY2FsbC4BnQxJACBDb3JldGltZQABWQUBoQcIIEJyb2tlcklkEBDtAwAABIggVGhlIFBhcmFJZCBvZiB0aGUgY29yZXRpbWUgY2hhaW4uREJyb2tlclBvdExvY2F0aW9uEQGMAQEAbW9kbHB5L2Jyb2tlAAAAAAAAAAAAAAAAAAAAAAAAAAAEhCBUaGUgY29yZXRpbWUgY2hhaW4gcG90IGxvY2F0aW9uLgGhDEoASFN0YXRlVHJpZU1pZ3JhdGlvbgFIU3RhdGVUcmllTWlncmF0aW9uDEBNaWdyYXRpb25Qcm9jZXNzAQB5BTgAAAAAAAAAAAAAAAAAABBQIE1pZ3JhdGlvbiBwcm9ncmVzcy4AXQEgVGhpcyBzdG9yZXMgdGhlIHNuYXBzaG90IG9mIHRoZSBsYXN0IG1pZ3JhdGVkIGtleXMuIEl0IGNhbiBiZSBzZXQgaW50byBtb3Rpb24gYW5kIG1vdmXUIGZvcndhcmQgYnkgYW55IG9mIHRoZSBtZWFucyBwcm92aWRlZCBieSB0aGlzIHBhbGxldC4oQXV0b0xpbWl0cwEAcQUEAAzUIFRoZSBsaW1pdHMgdGhhdCBhcmUgaW1wb3NlZCBvbiBhdXRvbWF0aWMgbWlncmF0aW9ucy4A1CBJZiBzZXQgdG8gTm9uZSwgdGhlbiBubyBhdXRvbWF0aWMgbWlncmF0aW9uIGhhcHBlbnMuYFNpZ25lZE1pZ3JhdGlvbk1heExpbWl0cwAAdQUEAAzgIFRoZSBtYXhpbXVtIGxpbWl0cyB0aGF0IHRoZSBzaWduZWQgbWlncmF0aW9uIGNvdWxkIHVzZS4AtCBJZiBub3Qgc2V0LCBubyBzaWduZWQgc3VibWlzc2lvbiBpcyBhbGxvd2VkLgFtBQGlBwQkTWF4S2V5TGVuEBAAAgAAVLQgTWF4aW1hbCBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGtleSBjYW4gaGF2ZS4AsCBGUkFNRSBpdHNlbGYgZG9lcyBub3QgbGltaXQgdGhlIGtleSBsZW5ndGguAQEgVGhlIGNvbmNyZXRlIHZhbHVlIG11c3QgdGhlcmVmb3JlIGRlcGVuZCBvbiB5b3VyIHN0b3JhZ2UgdXNhZ2UuWQEgQSBbYGZyYW1lX3N1cHBvcnQ6OnN0b3JhZ2U6OlN0b3JhZ2VOTWFwYF0gZm9yIGV4YW1wbGUgY2FuIGhhdmUgYW4gYXJiaXRyYXJ5IG51bWJlciBvZkUBIGtleXMgd2hpY2ggYXJlIHRoZW4gaGFzaGVkIGFuZCBjb25jYXRlbmF0ZWQsIHJlc3VsdGluZyBpbiBhcmJpdHJhcmlseSBsb25nIGtleXMuAEEBIFVzZSB0aGUgKnN0YXRlIG1pZ3JhdGlvbiBSUEMqIHRvIHJldHJpZXZlIHRoZSBsZW5ndGggb2YgdGhlIGxvbmdlc3Qga2V5IGluIHlvdXIBASBzdG9yYWdlOiA8aHR0cHM6Ly9naXRodWIuY29tL3Bhcml0eXRlY2gvc3Vic3RyYXRlL2lzc3Vlcy8xMTY0Mj4AKQEgVGhlIG1pZ3JhdGlvbiB3aWxsIGhhbHQgd2l0aCBhIGBIYWx0ZWRgIGV2ZW50IGlmIHRoaXMgdmFsdWUgaXMgdG9vIHNtYWxsLkkBIFNpbmNlIHRoZXJlIGlzIG5vIHJlYWwgcGVuYWx0eSBmcm9tIG92ZXItZXN0aW1hdGluZywgaXQgaXMgYWR2aXNlZCB0byB1c2UgYSBsYXJnZYAgdmFsdWUuIFRoZSBkZWZhdWx0IGlzIDUxMiBieXRlLgCAIFNvbWUga2V5IGxlbmd0aHMgZm9yIHJlZmVyZW5jZTrQIC0gW2BmcmFtZV9zdXBwb3J0OjpzdG9yYWdlOjpTdG9yYWdlVmFsdWVgXTogMzIgYnl0ZcggLSBbYGZyYW1lX3N1cHBvcnQ6OnN0b3JhZ2U6OlN0b3JhZ2VNYXBgXTogNjQgYnl0ZeAgLSBbYGZyYW1lX3N1cHBvcnQ6OnN0b3JhZ2U6OlN0b3JhZ2VEb3VibGVNYXBgXTogOTYgYnl0ZQBIIEZvciBtb3JlIGluZm8gc2VlSQEgPGh0dHBzOi8vd3d3LnNoYXdudGFicml6aS5jb20vYmxvZy9zdWJzdHJhdGUvcXVlcnlpbmctc3Vic3RyYXRlLXN0b3JhZ2UtdmlhLXJwYy8+Aa0HYgAkWGNtUGFsbGV0ASRYY21QYWxsZXQ4MFF1ZXJ5Q291bnRlcgEAMCAAAAAAAAAAAASIIFRoZSBsYXRlc3QgYXZhaWxhYmxlIHF1ZXJ5IGluZGV4LhxRdWVyaWVzAAEEAjClDAQABFQgVGhlIG9uZ29pbmcgcXVlcmllcy4oQXNzZXRUcmFwcwEBBAY0EBAAAAAAEGggVGhlIGV4aXN0aW5nIGFzc2V0IHRyYXBzLgBhASBLZXkgaXMgdGhlIGJsYWtlMiAyNTYgaGFzaCBvZiAob3JpZ2luLCB2ZXJzaW9uZWQgYEFzc2V0c2ApIHBhaXIuIFZhbHVlIGlzIHRoZSBudW1iZXIgb2YdASB0aW1lcyB0aGlzIHBhaXIgaGFzIGJlZW4gdHJhcHBlZCAodXN1YWxseSBqdXN0IDEgaWYgaXQgZXhpc3RzIGF0IGFsbCkuOFNhZmVYY21WZXJzaW9uAAAQBAAIYQEgRGVmYXVsdCB2ZXJzaW9uIHRvIGVuY29kZSBYQ00gd2hlbiBsYXRlc3QgdmVyc2lvbiBvZiBkZXN0aW5hdGlvbiBpcyB1bmtub3duLiBJZiBgTm9uZWAsPQEgdGhlbiB0aGUgZGVzdGluYXRpb25zIHdob3NlIFhDTSB2ZXJzaW9uIGlzIHVua25vd24gYXJlIGNvbnNpZGVyZWQgdW5yZWFjaGFibGUuQFN1cHBvcnRlZFZlcnNpb24AAQgFArkMEAQABPAgVGhlIExhdGVzdCB2ZXJzaW9ucyB0aGF0IHdlIGtub3cgdmFyaW91cyBsb2NhdGlvbnMgc3VwcG9ydC5AVmVyc2lvbk5vdGlmaWVycwABCAUCuQwwBAAEBQEgQWxsIGxvY2F0aW9ucyB0aGF0IHdlIGhhdmUgcmVxdWVzdGVkIHZlcnNpb24gbm90aWZpY2F0aW9ucyBmcm9tLlBWZXJzaW9uTm90aWZ5VGFyZ2V0cwABCAUCuQy9DAQACHEBIFRoZSB0YXJnZXQgbG9jYXRpb25zIHRoYXQgYXJlIHN1YnNjcmliZWQgdG8gb3VyIHZlcnNpb24gY2hhbmdlcywgYXMgd2VsbCBhcyB0aGUgbW9zdCByZWNlbnSUIG9mIG91ciB2ZXJzaW9ucyB3ZSBpbmZvcm1lZCB0aGVtIG9mLlRWZXJzaW9uRGlzY292ZXJ5UXVldWUBAMEMBAAMZQEgRGVzdGluYXRpb25zIHdob3NlIGxhdGVzdCBYQ00gdmVyc2lvbiB3ZSB3b3VsZCBsaWtlIHRvIGtub3cuIER1cGxpY2F0ZXMgbm90IGFsbG93ZWQsIGFuZHEBIHRoZSBgdTMyYCBjb3VudGVyIGlzIHRoZSBudW1iZXIgb2YgdGltZXMgdGhhdCBhIHNlbmQgdG8gdGhlIGRlc3RpbmF0aW9uIGhhcyBiZWVuIGF0dGVtcHRlZCyMIHdoaWNoIGlzIHVzZWQgYXMgYSBwcmlvcml0aXphdGlvbi5AQ3VycmVudE1pZ3JhdGlvbgAAzQwEAAScIFRoZSBjdXJyZW50IG1pZ3JhdGlvbidzIHN0YWdlLCBpZiBhbnkuVFJlbW90ZUxvY2tlZEZ1bmdpYmxlcwABDAUCAtUM2QwEAATwIEZ1bmdpYmxlIGFzc2V0cyB3aGljaCB3ZSBrbm93IGFyZSBsb2NrZWQgb24gYSByZW1vdGUgY2hhaW4uPExvY2tlZEZ1bmdpYmxlcwABBAIA6QwEAATgIEZ1bmdpYmxlIGFzc2V0cyB3aGljaCB3ZSBrbm93IGFyZSBsb2NrZWQgb24gdGhpcyBjaGFpbi5UWGNtRXhlY3V0aW9uU3VzcGVuZGVkAQAgBAAEtCBHbG9iYWwgc3VzcGVuc2lvbiBzdGF0ZSBvZiB0aGUgWENNIGV4ZWN1dG9yLjxTaG91bGRSZWNvcmRYY20BACAEABxZASBXaGV0aGVyIG9yIG5vdCBpbmNvbWluZyBYQ01zIChib3RoIGV4ZWN1dGVkIGxvY2FsbHkgYW5kIHJlY2VpdmVkKSBzaG91bGQgYmUgcmVjb3JkZWQuxCBPbmx5IG9uZSBYQ00gcHJvZ3JhbSB3aWxsIGJlIHJlY29yZGVkIGF0IGEgdGltZS4pASBUaGlzIGlzIG1lYW50IHRvIGJlIHVzZWQgaW4gcnVudGltZSBBUElzLCBhbmQgaXQncyBhZHZpc2VkIGl0IHN0YXlzIGZhbHNlDQEgZm9yIGFsbCBvdGhlciB1c2UgY2FzZXMsIHNvIGFzIHRvIG5vdCBkZWdyYWRlIHJlZ3VsYXIgcGVyZm9ybWFuY2UuAFkBIE9ubHkgcmVsZXZhbnQgaWYgdGhpcyBwYWxsZXQgaXMgYmVpbmcgdXNlZCBhcyB0aGUgW2B4Y21fZXhlY3V0b3I6OnRyYWl0czo6UmVjb3JkWGNtYF3IIGltcGxlbWVudGF0aW9uIGluIHRoZSBYQ00gZXhlY3V0b3IgY29uZmlndXJhdGlvbi4sUmVjb3JkZWRYY20AAEEGBAAYSQEgSWYgW2BTaG91bGRSZWNvcmRYY21gXSBpcyBzZXQgdG8gdHJ1ZSwgdGhlbiB0aGUgbGFzdCBYQ00gcHJvZ3JhbSBleGVjdXRlZCBsb2NhbGx5VCB3aWxsIGJlIHN0b3JlZCBoZXJlLikBIFJ1bnRpbWUgQVBJcyBjYW4gZmV0Y2ggdGhlIFhDTSB0aGF0IHdhcyBleGVjdXRlZCBieSBhY2Nlc3NpbmcgdGhpcyB2YWx1ZS4AWQEgT25seSByZWxldmFudCBpZiB0aGlzIHBhbGxldCBpcyBiZWluZyB1c2VkIGFzIHRoZSBbYHhjbV9leGVjdXRvcjo6dHJhaXRzOjpSZWNvcmRYY21gXcggaW1wbGVtZW50YXRpb24gaW4gdGhlIFhDTSBleGVjdXRvciBjb25maWd1cmF0aW9uLgGFBQGxBwAB9QxjADBNZXNzYWdlUXVldWUBME1lc3NhZ2VRdWV1ZQwwQm9va1N0YXRlRm9yAQEEBcUG+Qx0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEzCBUaGUgaW5kZXggb2YgdGhlIGZpcnN0IGFuZCBsYXN0IChub24tZW1wdHkpIHBhZ2VzLixTZXJ2aWNlSGVhZAAAxQYEAAS8IFRoZSBvcmlnaW4gYXQgd2hpY2ggd2Ugc2hvdWxkIGJlZ2luIHNlcnZpY2luZy4UUGFnZXMAAQgFBQUNCQ0EAASIIFRoZSBtYXAgb2YgcGFnZSBpbmRpY2VzIHRvIHBhZ2VzLgHBBgG5BxAgSGVhcFNpemUQEAAAAQAUPQEgVGhlIHNpemUgb2YgdGhlIHBhZ2U7IHRoaXMgaW1wbGllcyB0aGUgbWF4aW11bSBtZXNzYWdlIHNpemUgd2hpY2ggY2FuIGJlIHNlbnQuAFkBIEEgZ29vZCB2YWx1ZSBkZXBlbmRzIG9uIHRoZSBleHBlY3RlZCBtZXNzYWdlIHNpemVzLCB0aGVpciB3ZWlnaHRzLCB0aGUgd2VpZ2h0IHRoYXQgaXNdASBhdmFpbGFibGUgZm9yIHByb2Nlc3NpbmcgdGhlbSBhbmQgdGhlIG1heGltYWwgbmVlZGVkIG1lc3NhZ2Ugc2l6ZS4gVGhlIG1heGltYWwgbWVzc2FnZREBIHNpemUgaXMgc2xpZ2h0bHkgbG93ZXIgdGhhbiB0aGlzIGFzIGRlZmluZWQgYnkgW2BNYXhNZXNzYWdlTGVuT2ZgXS4gTWF4U3RhbGUQEAgAAAAMXQEgVGhlIG1heGltdW0gbnVtYmVyIG9mIHN0YWxlIHBhZ2VzIChpLmUuIG9mIG92ZXJ3ZWlnaHQgbWVzc2FnZXMpIGFsbG93ZWQgYmVmb3JlIGN1bGxpbmdRASBjYW4gaGFwcGVuLiBPbmNlIHRoZXJlIGFyZSBtb3JlIHN0YWxlIHBhZ2VzIHRoYW4gdGhpcywgdGhlbiBoaXN0b3JpY2FsIHBhZ2VzIG1heSBiZfwgZHJvcHBlZCwgZXZlbiBpZiB0aGV5IGNvbnRhaW4gdW5wcm9jZXNzZWQgb3ZlcndlaWdodCBtZXNzYWdlcy40U2VydmljZVdlaWdodBEHQAEHAKDbIV0TMzMzMzMzMzMYQQEgVGhlIGFtb3VudCBvZiB3ZWlnaHQgKGlmIGFueSkgd2hpY2ggc2hvdWxkIGJlIHByb3ZpZGVkIHRvIHRoZSBtZXNzYWdlIHF1ZXVlIGZvcqggc2VydmljaW5nIGVucXVldWVkIGl0ZW1zIGBvbl9pbml0aWFsaXplYC4A/CBUaGlzIG1heSBiZSBsZWdpdGltYXRlbHkgYE5vbmVgIGluIHRoZSBjYXNlIHRoYXQgeW91IHdpbGwgY2FsbF0BIGBTZXJ2aWNlUXVldWVzOjpzZXJ2aWNlX3F1ZXVlc2AgbWFudWFsbHkgb3Igc2V0IFtgU2VsZjo6SWRsZU1heFNlcnZpY2VXZWlnaHRgXSB0byBoYXZlVCBpdCBydW4gaW4gYG9uX2lkbGVgLlBJZGxlTWF4U2VydmljZVdlaWdodBEHQAEHAKDbIV0TMzMzMzMzMzMUXQEgVGhlIG1heGltdW0gYW1vdW50IG9mIHdlaWdodCAoaWYgYW55KSB0byBiZSB1c2VkIGZyb20gcmVtYWluaW5nIHdlaWdodCBgb25faWRsZWAgd2hpY2hBASBzaG91bGQgYmUgcHJvdmlkZWQgdG8gdGhlIG1lc3NhZ2UgcXVldWUgZm9yIHNlcnZpY2luZyBlbnF1ZXVlZCBpdGVtcyBgb25faWRsZWAuPQEgVXNlZnVsIGZvciBwYXJhY2hhaW5zIHRvIHByb2Nlc3MgbWVzc2FnZXMgYXQgdGhlIHNhbWUgYmxvY2sgdGhleSBhcmUgcmVjZWl2ZWQuACkBIElmIGBOb25lYCwgaXQgd2lsbCBub3QgY2FsbCBgU2VydmljZVF1ZXVlczo6c2VydmljZV9xdWV1ZXNgIGluIGBvbl9pZGxlYC4BEQ1kACRBc3NldFJhdGUBJEFzc2V0UmF0ZQRYQ29udmVyc2lvblJhdGVUb05hdGl2ZQABBALc0QYEAAwdASBNYXBzIGFuIGFzc2V0IHRvIGl0cyBmaXhlZCBwb2ludCByZXByZXNlbnRhdGlvbiBpbiB0aGUgbmF0aXZlIGJhbGFuY2UuAE0BIEUuZy4gYG5hdGl2ZV9hbW91bnQgPSBhc3NldF9hbW91bnQgKiBDb252ZXJzaW9uUmF0ZVRvTmF0aXZlOjo8VD46OmdldChhc3NldF9raW5kKWABzQYBwQcAARUNZQAUQmVlZnkBFEJlZWZ5FCxBdXRob3JpdGllcwEAGQ0EAARwIFRoZSBjdXJyZW50IGF1dGhvcml0aWVzIHNldDhWYWxpZGF0b3JTZXRJZAEAMCAAAAAAAAAAAAR0IFRoZSBjdXJyZW50IHZhbGlkYXRvciBzZXQgaWQ8TmV4dEF1dGhvcml0aWVzAQAZDQQABOwgQXV0aG9yaXRpZXMgc2V0IHNjaGVkdWxlZCB0byBiZSB1c2VkIHdpdGggdGhlIG5leHQgc2Vzc2lvbjBTZXRJZFNlc3Npb24AAQQFMBAEAChRASBBIG1hcHBpbmcgZnJvbSBCRUVGWSBzZXQgSUQgdG8gdGhlIGluZGV4IG9mIHRoZSAqbW9zdCByZWNlbnQqIHNlc3Npb24gZm9yIHdoaWNoIGl0c2ggbWVtYmVycyB3ZXJlIHJlc3BvbnNpYmxlLgBFASBUaGlzIGlzIG9ubHkgdXNlZCBmb3IgdmFsaWRhdGluZyBlcXVpdm9jYXRpb24gcHJvb2ZzLiBBbiBlcXVpdm9jYXRpb24gcHJvb2YgbXVzdE0BIGNvbnRhaW5zIGEga2V5LW93bmVyc2hpcCBwcm9vZiBmb3IgYSBnaXZlbiBzZXNzaW9uLCB0aGVyZWZvcmUgd2UgbmVlZCBhIHdheSB0byB0aWU9ASB0b2dldGhlciBzZXNzaW9ucyBhbmQgQkVFRlkgc2V0IGlkcywgaS5lLiB3ZSBuZWVkIHRvIHZhbGlkYXRlIHRoYXQgYSB2YWxpZGF0b3JBASB3YXMgdGhlIG93bmVyIG9mIGEgZ2l2ZW4ga2V5IG9uIGEgZ2l2ZW4gc2Vzc2lvbiwgYW5kIHdoYXQgdGhlIGFjdGl2ZSBzZXQgSUQgd2FzVCBkdXJpbmcgdGhhdCBzZXNzaW9uLgDcIFRXT1gtTk9URTogYFZhbGlkYXRvclNldElkYCBpcyBub3QgdW5kZXIgdXNlciBjb250cm9sLjBHZW5lc2lzQmxvY2sBAGECBAAM3CBCbG9jayBudW1iZXIgd2hlcmUgQkVFRlkgY29uc2Vuc3VzIGlzIGVuYWJsZWQvc3RhcnRlZC5pASBCeSBjaGFuZ2luZyB0aGlzICh0aHJvdWdoIHByaXZpbGVnZWQgYHNldF9uZXdfZ2VuZXNpcygpYCksIEJFRUZZIGNvbnNlbnN1cyBpcyBlZmZlY3RpdmVseawgcmVzdGFydGVkIGZyb20gdGhlIG5ld2x5IHNldCBibG9jayBudW1iZXIuAdUGAAw4TWF4QXV0aG9yaXRpZXMQEKCGAQAE1CBUaGUgbWF4aW11bSBudW1iZXIgb2YgYXV0aG9yaXRpZXMgdGhhdCBjYW4gYmUgYWRkZWQuNE1heE5vbWluYXRvcnMQEAACAAAE1CBUaGUgbWF4aW11bSBudW1iZXIgb2Ygbm9taW5hdG9ycyBmb3IgZWFjaCB2YWxpZGF0b3IuWE1heFNldElkU2Vzc2lvbkVudHJpZXMwIKgAAAAAAAAAGDkBIFRoZSBtYXhpbXVtIG51bWJlciBvZiBlbnRyaWVzIHRvIGtlZXAgaW4gdGhlIHNldCBpZCB0byBzZXNzaW9uIGluZGV4IG1hcHBpbmcuADEBIFNpbmNlIHRoZSBgU2V0SWRTZXNzaW9uYCBtYXAgaXMgb25seSB1c2VkIGZvciB2YWxpZGF0aW5nIGVxdWl2b2NhdGlvbnMgdGhpcykBIHZhbHVlIHNob3VsZCByZWxhdGUgdG8gdGhlIGJvbmRpbmcgZHVyYXRpb24gb2Ygd2hhdGV2ZXIgc3Rha2luZyBzeXN0ZW0gaXM1ASBiZWluZyB1c2VkIChpZiBhbnkpLiBJZiBlcXVpdm9jYXRpb24gaGFuZGxpbmcgaXMgbm90IGVuYWJsZWQgdGhlbiB0aGlzIHZhbHVlNCBjYW4gYmUgemVyby4BIQ3IAAxNbXIBDE1tcgwgUm9vdEhhc2gBADSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEWCBMYXRlc3QgTU1SIFJvb3QgaGFzaC44TnVtYmVyT2ZMZWF2ZXMBADAgAAAAAAAAAAAEsCBDdXJyZW50IHNpemUgb2YgdGhlIE1NUiAobnVtYmVyIG9mIGxlYXZlcykuFE5vZGVzAAEEBjA0BAAQgCBIYXNoZXMgb2YgdGhlIG5vZGVzIGluIHRoZSBNTVIuAC0BIE5vdGUgdGhpcyBjb2xsZWN0aW9uIG9ubHkgY29udGFpbnMgTU1SIHBlYWtzLCB0aGUgaW5uZXIgbm9kZXMgKGFuZCBsZWF2ZXMpvCBhcmUgcHJ1bmVkIGFuZCBvbmx5IHN0b3JlZCBpbiB0aGUgT2ZmY2hhaW4gREIuAAAAAMkAMEJlZWZ5TW1yTGVhZgEwQmVlZnlNbXJMZWFmCEBCZWVmeUF1dGhvcml0aWVzAQAlDbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASgIERldGFpbHMgb2YgY3VycmVudCBCRUVGWSBhdXRob3JpdHkgc2V0LlBCZWVmeU5leHRBdXRob3JpdGllcwEAJQ2wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMlCBEZXRhaWxzIG9mIG5leHQgQkVFRlkgYXV0aG9yaXR5IHNldC4AUQEgVGhpcyBzdG9yYWdlIGVudHJ5IGlzIHVzZWQgYXMgY2FjaGUgZm9yIGNhbGxzIHRvIGB1cGRhdGVfYmVlZnlfbmV4dF9hdXRob3JpdHlfc2V0YC4AAAAAygAExQF1AVUFKQ0oSENoZWNrTm9uWmVyb1NlbmRlci0NjEBDaGVja1NwZWNWZXJzaW9uMQ0QOENoZWNrVHhWZXJzaW9uNQ0QMENoZWNrR2VuZXNpczkNNDhDaGVja01vcnRhbGl0eT0NNChDaGVja05vbmNlRQ2MLENoZWNrV2VpZ2h0SQ2MYENoYXJnZVRyYW5zYWN0aW9uUGF5bWVudE0NjEhQcmV2YWxpZGF0ZUF0dGVzdHNRDYxEQ2hlY2tNZXRhZGF0YUhhc2hVDYRdDVwkSW5mbGF0aW9uBJhleHBlcmltZW50YWxfaW5mbGF0aW9uX3ByZWRpY3Rpb25faW5mbwBhDRDYIFJldHVybiB0aGUgY3VycmVudCBlc3RpbWF0ZXMgb2YgdGhlIGluZmxhdGlvbiBhbW91bnQuAFEBIFRoaXMgaXMgbWFya2VkIGFzIGV4cGVyaW1lbnRhbCBpbiBsaWdodCBvZiBSRkMjODkuIE5vbmV0aGVsZXNzLCBpdHMgdXNhZ2UgaXMgaGlnaGx5JQEgcmVjb21tZW5kZWQgb3ZlciB0cnlpbmcgdG8gcmVhZC1zdG9yYWdlLCBvciByZS1jcmVhdGUgdGhlIG9uY2hhaW4gbG9naWMuABBDb3JlDBx2ZXJzaW9uAPEHBJAgUmV0dXJucyB0aGUgdmVyc2lvbiBvZiB0aGUgcnVudGltZS40ZXhlY3V0ZV9ibG9jawQUYmxvY2tpDYwEZCBFeGVjdXRlIHRoZSBnaXZlbiBibG9jay5AaW5pdGlhbGl6ZV9ibG9jawQYaGVhZGVyoQF1DQRBASBJbml0aWFsaXplIGEgYmxvY2sgd2l0aCB0aGUgZ2l2ZW4gaGVhZGVyIGFuZCByZXR1cm4gdGhlIHJ1bnRpbWUgZXhlY3V0aXZlIG1vZGUuBCEBIFRoZSBgQ29yZWAgcnVudGltZSBhcGkgdGhhdCBldmVyeSBTdWJzdHJhdGUgcnVudGltZSBuZWVkcyB0byBpbXBsZW1lbnQuIE1ldGFkYXRhDCBtZXRhZGF0YQB5DQSMIFJldHVybnMgdGhlIG1ldGFkYXRhIG9mIGEgcnVudGltZS5MbWV0YWRhdGFfYXRfdmVyc2lvbgQcdmVyc2lvbhB9DRCkIFJldHVybnMgdGhlIG1ldGFkYXRhIGF0IGEgZ2l2ZW4gdmVyc2lvbi4ABQEgSWYgdGhlIGdpdmVuIGB2ZXJzaW9uYCBpc24ndCBzdXBwb3J0ZWQsIHRoaXMgd2lsbCByZXR1cm4gYE5vbmVgLnUBIFVzZSBbYFNlbGY6Om1ldGFkYXRhX3ZlcnNpb25zYF0gdG8gZmluZCBvdXQgYWJvdXQgc3VwcG9ydGVkIG1ldGFkYXRhIHZlcnNpb24gb2YgdGhlIHJ1bnRpbWUuRG1ldGFkYXRhX3ZlcnNpb25zAOUBDKQgUmV0dXJucyB0aGUgc3VwcG9ydGVkIG1ldGFkYXRhIHZlcnNpb25zLgDAIFRoaXMgY2FuIGJlIHVzZWQgdG8gY2FsbCBgbWV0YWRhdGFfYXRfdmVyc2lvbmAuBAEBIFRoZSBgTWV0YWRhdGFgIGFwaSB0cmFpdCB0aGF0IHJldHVybnMgbWV0YWRhdGEgZm9yIHRoZSBydW50aW1lLjBCbG9ja0J1aWxkZXIQPGFwcGx5X2V4dHJpbnNpYwQkZXh0cmluc2ljbQ2BDRBsIEFwcGx5IHRoZSBnaXZlbiBleHRyaW5zaWMuADkBIFJldHVybnMgYW4gaW5jbHVzaW9uIG91dGNvbWUgd2hpY2ggc3BlY2lmaWVzIGlmIHRoaXMgZXh0cmluc2ljIGlzIGluY2x1ZGVkIGluTCB0aGlzIGJsb2NrIG9yIG5vdC44ZmluYWxpemVfYmxvY2sAoQEEaCBGaW5pc2ggdGhlIGN1cnJlbnQgYmxvY2suTGluaGVyZW50X2V4dHJpbnNpY3MEIGluaGVyZW50kQ1xDQQ9ASBHZW5lcmF0ZSBpbmhlcmVudCBleHRyaW5zaWNzLiBUaGUgaW5oZXJlbnQgZGF0YSB3aWxsIHZhcnkgZnJvbSBjaGFpbiB0byBjaGFpbi48Y2hlY2tfaW5oZXJlbnRzCBRibG9ja2kNEGRhdGGRDaENBFUBIENoZWNrIHRoYXQgdGhlIGluaGVyZW50cyBhcmUgdmFsaWQuIFRoZSBpbmhlcmVudCBkYXRhIHdpbGwgdmFyeSBmcm9tIGNoYWluIHRvIGNoYWluLgRxASBUaGUgYEJsb2NrQnVpbGRlcmAgYXBpIHRyYWl0IHRoYXQgcHJvdmlkZXMgdGhlIHJlcXVpcmVkIGZ1bmN0aW9uYWxpdHkgZm9yIGJ1aWxkaW5nIGEgYmxvY2suSE5vbWluYXRpb25Qb29sc0FwaRw8cGVuZGluZ19yZXdhcmRzBAx3aG8AGAQ1ASBSZXR1cm5zIHRoZSBwZW5kaW5nIHJld2FyZHMgZm9yIHRoZSBtZW1iZXIgdGhhdCB0aGUgQWNjb3VudElkIHdhcyBnaXZlbiBmb3IuRHBvaW50c190b19iYWxhbmNlCBxwb29sX2lkEBhwb2ludHMYGAT0IFJldHVybnMgdGhlIGVxdWl2YWxlbnQgYmFsYW5jZSBvZiBgcG9pbnRzYCBmb3IgYSBnaXZlbiBwb29sLkRiYWxhbmNlX3RvX3BvaW50cwgccG9vbF9pZBAkbmV3X2Z1bmRzGBgE/CBSZXR1cm5zIHRoZSBlcXVpdmFsZW50IHBvaW50cyBvZiBgbmV3X2Z1bmRzYCBmb3IgYSBnaXZlbiBwb29sLkhwb29sX3BlbmRpbmdfc2xhc2gEHHBvb2xfaWQQGASwIFJldHVybnMgdGhlIHBlbmRpbmcgc2xhc2ggZm9yIGEgZ2l2ZW4gcG9vbC5QbWVtYmVyX3BlbmRpbmdfc2xhc2gEGG1lbWJlcgAYBMwgUmV0dXJucyB0aGUgcGVuZGluZyBzbGFzaCBmb3IgYSBnaXZlbiBwb29sIG1lbWJlci50cG9vbF9uZWVkc19kZWxlZ2F0ZV9taWdyYXRpb24EHHBvb2xfaWQQICDkIFJldHVybnMgdHJ1ZSBpZiB0aGUgcG9vbCB3aXRoIGBwb29sX2lkYCBuZWVkcyBtaWdyYXRpb24uAEkBIFRoaXMgY2FuIGhhcHBlbiB3aGVuIHRoZSBgcGFsbGV0LW5vbWluYXRpb24tcG9vbHNgIGhhcyBzd2l0Y2hlZCB0byB1c2luZyBzdHJhdGVneUEBIFtgRGVsZWdhdGVTdGFrZWBdKHBhbGxldF9ub21pbmF0aW9uX3Bvb2xzOjphZGFwdGVyOjpEZWxlZ2F0ZVN0YWtlKSBidXQgdGhlIHBvb2zoIHN0aWxsIGhhcyBmdW5kcyB0aGF0IHdlcmUgc3Rha2VkIHVzaW5nIHRoZSBvbGRlciBzdHJhdGVneRkBIFtUcmFuc2ZlclN0YWtlXShwYWxsZXRfbm9taW5hdGlvbl9wb29sczo6YWRhcHRlcjo6VHJhbnNmZXJTdGFrZSkuIFVzZYkBIFtgbWlncmF0ZV9wb29sX3RvX2RlbGVnYXRlX3N0YWtlYF0ocGFsbGV0X25vbWluYXRpb25fcG9vbHM6OkNhbGw6Om1pZ3JhdGVfcG9vbF90b19kZWxlZ2F0ZV9zdGFrZSlUIHRvIG1pZ3JhdGUgdGhlIHBvb2wufG1lbWJlcl9uZWVkc19kZWxlZ2F0ZV9taWdyYXRpb24EGG1lbWJlcgAgHCkBIFJldHVybnMgdHJ1ZSBpZiB0aGUgZGVsZWdhdGVkIGZ1bmRzIG9mIHRoZSBwb29sIGBtZW1iZXJgIG5lZWRzIG1pZ3JhdGlvbi4A2CBPbmNlIGEgcG9vbCBoYXMgc3VjY2Vzc2Z1bGx5IG1pZ3JhdGVkIHRvIHRoZSBzdHJhdGVneVUBIFtgRGVsZWdhdGVTdGFrZWBdKHBhbGxldF9ub21pbmF0aW9uX3Bvb2xzOjphZGFwdGVyOjpEZWxlZ2F0ZVN0YWtlKSwgdGhlIGZ1bmRzIG9mIHRoZRkBIG1lbWJlciBjYW4gYmUgbWlncmF0ZWQgZnJvbSBwb29sIGFjY291bnQgdG8gdGhlIG1lbWJlcidzIGFjY291bnQuIFVzZSkBIFtgbWlncmF0ZV9kZWxlZ2F0aW9uYF0ocGFsbGV0X25vbWluYXRpb25fcG9vbHM6OkNhbGw6Om1pZ3JhdGVfZGVsZWdhdGlvbimkIHRvIG1pZ3JhdGUgdGhlIGZ1bmRzIG9mIHRoZSBwb29sIG1lbWJlci4E+CBSdW50aW1lIGFwaSBmb3IgYWNjZXNzaW5nIGluZm9ybWF0aW9uIGFib3V0IG5vbWluYXRpb24gcG9vbHMuKFN0YWtpbmdBcGkMRG5vbWluYXRpb25zX3F1b3RhBBxiYWxhbmNlGBAEEQEgUmV0dXJucyB0aGUgbm9taW5hdGlvbnMgcXVvdGEgZm9yIGEgbm9taW5hdG9yIHdpdGggYSBnaXZlbiBiYWxhbmNlLlxlcmFzX3N0YWtlcnNfcGFnZV9jb3VudAgMZXJhEBxhY2NvdW50ABAEOQEgUmV0dXJucyB0aGUgcGFnZSBjb3VudCBvZiBleHBvc3VyZXMgZm9yIGEgdmFsaWRhdG9yIGBhY2NvdW50YCBpbiBhIGdpdmVuIGVyYS48cGVuZGluZ19yZXdhcmRzCAxlcmEQHGFjY291bnQAIAQ9ASBSZXR1cm5zIHRydWUgaWYgdmFsaWRhdG9yIGBhY2NvdW50YCBoYXMgcGFnZXMgdG8gYmUgY2xhaW1lZCBmb3IgdGhlIGdpdmVuIGVyYS4AWFRhZ2dlZFRyYW5zYWN0aW9uUXVldWUEUHZhbGlkYXRlX3RyYW5zYWN0aW9uDBhzb3VyY2WlDQh0eG0NKGJsb2NrX2hhc2g0qQ0kaCBWYWxpZGF0ZSB0aGUgdHJhbnNhY3Rpb24uAGUBIFRoaXMgbWV0aG9kIGlzIGludm9rZWQgYnkgdGhlIHRyYW5zYWN0aW9uIHBvb2wgdG8gbGVhcm4gZGV0YWlscyBhYm91dCBnaXZlbiB0cmFuc2FjdGlvbi5FASBUaGUgaW1wbGVtZW50YXRpb24gc2hvdWxkIG1ha2Ugc3VyZSB0byB2ZXJpZnkgdGhlIGNvcnJlY3RuZXNzIG9mIHRoZSB0cmFuc2FjdGlvbk0BIGFnYWluc3QgY3VycmVudCBzdGF0ZS4gVGhlIGdpdmVuIGBibG9ja19oYXNoYCBjb3JyZXNwb25kcyB0byB0aGUgaGFzaCBvZiB0aGUgYmxvY2t8IHRoYXQgaXMgdXNlZCBhcyBjdXJyZW50IHN0YXRlLgBFASBOb3RlIHRoYXQgdGhpcyBjYWxsIG1heSBiZSBwZXJmb3JtZWQgYnkgdGhlIHBvb2wgbXVsdGlwbGUgdGltZXMgYW5kIHRyYW5zYWN0aW9uc6QgbWlnaHQgYmUgdmVyaWZpZWQgaW4gYW55IHBvc3NpYmxlIG9yZGVyLgRNASBUaGUgYFRhZ2dlZFRyYW5zYWN0aW9uUXVldWVgIGFwaSB0cmFpdCBmb3IgaW50ZXJmZXJpbmcgd2l0aCB0aGUgdHJhbnNhY3Rpb24gcXVldWUuRE9mZmNoYWluV29ya2VyQXBpBDxvZmZjaGFpbl93b3JrZXIEGGhlYWRlcqEBjATIIFN0YXJ0cyB0aGUgb2ZmLWNoYWluIHRhc2sgZm9yIGdpdmVuIGJsb2NrIGhlYWRlci4EZCBUaGUgb2ZmY2hhaW4gd29ya2VyIGFwaS40UGFyYWNoYWluSG9zdHwodmFsaWRhdG9ycwAZCwRwIEdldCB0aGUgY3VycmVudCB2YWxpZGF0b3JzLkB2YWxpZGF0b3JfZ3JvdXBzALENDGUBIFJldHVybnMgdGhlIHZhbGlkYXRvciBncm91cHMgYW5kIHJvdGF0aW9uIGluZm8gbG9jYWxpemVkIGJhc2VkIG9uIHRoZSBoeXBvdGhldGljYWwgY2hpbGRhASAgb2YgYSBibG9jayB3aG9zZSBzdGF0ZSAgdGhpcyBpcyBpbnZva2VkIG9uLiBOb3RlIHRoYXQgYG5vd2AgaW4gdGhlIGBHcm91cFJvdGF0aW9uSW5mb2DQIHNob3VsZCBiZSB0aGUgc3VjY2Vzc29yIG9mIHRoZSBudW1iZXIgb2YgdGhlIGJsb2NrLkhhdmFpbGFiaWxpdHlfY29yZXMAuQ0INQEgWWllbGRzIGluZm9ybWF0aW9uIG9uIGFsbCBhdmFpbGFiaWxpdHkgY29yZXMgYXMgcmVsZXZhbnQgdG8gdGhlIGNoaWxkIGJsb2NrLj0BIENvcmVzIGFyZSBlaXRoZXIgZnJlZSBvciBvY2N1cGllZC4gRnJlZSBjb3JlcyBjYW4gaGF2ZSBwYXJhcyBhc3NpZ25lZCB0byB0aGVtLmRwZXJzaXN0ZWRfdmFsaWRhdGlvbl9kYXRhCBxwYXJhX2lkjQIoYXNzdW1wdGlvbtEN1Q0UaQEgWWllbGRzIHRoZSBwZXJzaXN0ZWQgdmFsaWRhdGlvbiBkYXRhIGZvciB0aGUgZ2l2ZW4gYFBhcmFJZGAgYWxvbmcgd2l0aCBhbiBhc3N1bXB0aW9uIHRoYXTYIHNob3VsZCBiZSB1c2VkIGlmIHRoZSBwYXJhIGN1cnJlbnRseSBvY2N1cGllcyBhIGNvcmUuAEUBIFJldHVybnMgYE5vbmVgIGlmIGVpdGhlciB0aGUgcGFyYSBpcyBub3QgcmVnaXN0ZXJlZCBvciB0aGUgYXNzdW1wdGlvbiBpcyBgRnJlZWRgmCBhbmQgdGhlIHBhcmEgYWxyZWFkeSBvY2N1cGllcyBhIGNvcmUuXGFzc3VtZWRfdmFsaWRhdGlvbl9kYXRhCBxwYXJhX2lkjQKcZXhwZWN0ZWRfcGVyc2lzdGVkX3ZhbGlkYXRpb25fZGF0YV9oYXNoNN0NDGkBIFJldHVybnMgdGhlIHBlcnNpc3RlZCB2YWxpZGF0aW9uIGRhdGEgZm9yIHRoZSBnaXZlbiBgUGFyYUlkYCBhbG9uZyB3aXRoIHRoZSBjb3JyZXNwb25kaW5ndQEgdmFsaWRhdGlvbiBjb2RlIGhhc2guIEluc3RlYWQgb2YgYWNjZXB0aW5nIGFzc3VtcHRpb24gYWJvdXQgdGhlIHBhcmEsIG1hdGNoZXMgdGhlIHZhbGlkYXRpb24pASBkYXRhIGhhc2ggYWdhaW5zdCBhbiBleHBlY3RlZCBvbmUgYW5kIHlpZWxkcyBgTm9uZWAgaWYgdGhleSdyZSBub3QgZXF1YWwuYGNoZWNrX3ZhbGlkYXRpb25fb3V0cHV0cwgccGFyYV9pZI0CHG91dHB1dHO9BCAEFQEgQ2hlY2tzIGlmIHRoZSBnaXZlbiB2YWxpZGF0aW9uIG91dHB1dHMgcGFzcyB0aGUgYWNjZXB0YW5jZSBjcml0ZXJpYS5cc2Vzc2lvbl9pbmRleF9mb3JfY2hpbGQAEAzwIFJldHVybnMgdGhlIHNlc3Npb24gaW5kZXggZXhwZWN0ZWQgYXQgYSBjaGlsZCBvZiB0aGUgYmxvY2suANAgVGhpcyBjYW4gYmUgdXNlZCB0byBpbnN0YW50aWF0ZSBhIGBTaWduaW5nQ29udGV4dGAuPHZhbGlkYXRpb25fY29kZQgccGFyYV9pZI0CKGFzc3VtcHRpb27RDdEEEFUBIEZldGNoIHRoZSB2YWxpZGF0aW9uIGNvZGUgdXNlZCBieSBhIHBhcmEsIG1ha2luZyB0aGUgZ2l2ZW4gYE9jY3VwaWVkQ29yZUFzc3VtcHRpb25gLgBFASBSZXR1cm5zIGBOb25lYCBpZiBlaXRoZXIgdGhlIHBhcmEgaXMgbm90IHJlZ2lzdGVyZWQgb3IgdGhlIGFzc3VtcHRpb24gaXMgYEZyZWVkYJggYW5kIHRoZSBwYXJhIGFscmVhZHkgb2NjdXBpZXMgYSBjb3JlLnhjYW5kaWRhdGVfcGVuZGluZ19hdmFpbGFiaWxpdHkEHHBhcmFfaWSNAuUNCF0BIEdldCB0aGUgcmVjZWlwdCBvZiBhIGNhbmRpZGF0ZSBwZW5kaW5nIGF2YWlsYWJpbGl0eS4gVGhpcyByZXR1cm5zIGBTb21lYCBmb3IgYW55IHBhcmFzJQEgYXNzaWduZWQgdG8gb2NjdXBpZWQgY29yZXMgaW4gYGF2YWlsYWJpbGl0eV9jb3Jlc2AgYW5kIGBOb25lYCBvdGhlcndpc2UuQGNhbmRpZGF0ZV9ldmVudHMA6Q0ELQEgR2V0IGEgdmVjdG9yIG9mIGV2ZW50cyBjb25jZXJuaW5nIGNhbmRpZGF0ZXMgdGhhdCBvY2N1cnJlZCB3aXRoaW4gYSBibG9jay4wZG1xX2NvbnRlbnRzBCRyZWNpcGllbnSNArkLBD0BIEdldCBhbGwgdGhlIHBlbmRpbmcgaW5ib3VuZCBtZXNzYWdlcyBpbiB0aGUgZG93bndhcmQgbWVzc2FnZSBxdWV1ZSBmb3IgYSBwYXJhLnhpbmJvdW5kX2hybXBfY2hhbm5lbHNfY29udGVudHMEJHJlY2lwaWVudI0C8Q0IZQEgR2V0IHRoZSBjb250ZW50cyBvZiBhbGwgY2hhbm5lbHMgYWRkcmVzc2VkIHRvIHRoZSBnaXZlbiByZWNpcGllbnQuIENoYW5uZWxzIHRoYXQgaGF2ZSBub5AgbWVzc2FnZXMgaW4gdGhlbSBhcmUgYWxzbyBpbmNsdWRlZC5cdmFsaWRhdGlvbl9jb2RlX2J5X2hhc2gEEGhhc2i5BNEEBJwgR2V0IHRoZSB2YWxpZGF0aW9uIGNvZGUgZnJvbSBpdHMgaGFzaC44b25fY2hhaW5fdm90ZXMA/Q0EMQEgU2NyYXBlIGRpc3B1dGUgcmVsZXZhbnQgZnJvbSBvbi1jaGFpbiwgYmFja2luZyB2b3RlcyBhbmQgcmVzb2x2ZWQgZGlzcHV0ZXMuMHNlc3Npb25faW5mbwQUaW5kZXgQAQ4M3CBHZXQgdGhlIHNlc3Npb24gaW5mbyBmb3IgdGhlIGdpdmVuIHNlc3Npb24sIGlmIHN0b3JlZC4AGQEgTk9URTogVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGF2YWlsYWJsZSBzaW5jZSBwYXJhY2hhaW4gaG9zdCB2ZXJzaW9uIDIuaHN1Ym1pdF9wdmZfY2hlY2tfc3RhdGVtZW50CBBzdG10DQUkc2lnbmF0dXJlnQSMDAEBIFN1Ym1pdHMgYSBQVkYgcHJlLWNoZWNraW5nIHN0YXRlbWVudCBpbnRvIHRoZSB0cmFuc2FjdGlvbiBwb29sLgAZASBOT1RFOiBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgYXZhaWxhYmxlIHNpbmNlIHBhcmFjaGFpbiBob3N0IHZlcnNpb24gMi5UcHZmc19yZXF1aXJlX3ByZWNoZWNrAIELDF0BIFJldHVybnMgY29kZSBoYXNoZXMgb2YgUFZGcyB0aGF0IHJlcXVpcmUgcHJlLWNoZWNraW5nIGJ5IHZhbGlkYXRvcnMgaW4gdGhlIGFjdGl2ZSBzZXQuABkBIE5PVEU6IFRoaXMgZnVuY3Rpb24gaXMgb25seSBhdmFpbGFibGUgc2luY2UgcGFyYWNoYWluIGhvc3QgdmVyc2lvbiAyLlB2YWxpZGF0aW9uX2NvZGVfaGFzaAgccGFyYV9pZI0CKGFzc3VtcHRpb27RDQUODIUBIEZldGNoIHRoZSBoYXNoIG9mIHRoZSB2YWxpZGF0aW9uIGNvZGUgdXNlZCBieSBhIHBhcmEsIG1ha2luZyB0aGUgZ2l2ZW4gYE9jY3VwaWVkQ29yZUFzc3VtcHRpb25gLgAZASBOT1RFOiBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgYXZhaWxhYmxlIHNpbmNlIHBhcmFjaGFpbiBob3N0IHZlcnNpb24gMi4gZGlzcHV0ZXMACQ4EeCBSZXR1cm5zIGFsbCBvbmNoYWluIGRpc3B1dGVzLlxzZXNzaW9uX2V4ZWN1dG9yX3BhcmFtcwQ0c2Vzc2lvbl9pbmRleBARDgS4IFJldHVybnMgZXhlY3V0aW9uIHBhcmFtZXRlcnMgZm9yIHRoZSBzZXNzaW9uLkR1bmFwcGxpZWRfc2xhc2hlcwAVDghZASBSZXR1cm5zIGEgbGlzdCBvZiB2YWxpZGF0b3JzIHRoYXQgbG9zdCBhIHBhc3Qgc2Vzc2lvbiBkaXNwdXRlIGFuZCBuZWVkIHRvIGJlIHNsYXNoZWQuGQEgTk9URTogVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGF2YWlsYWJsZSBzaW5jZSBwYXJhY2hhaW4gaG9zdCB2ZXJzaW9uIDUuTGtleV9vd25lcnNoaXBfcHJvb2YEMHZhbGlkYXRvcl9pZB0CHQ4IzCBSZXR1cm5zIGEgbWVya2xlIHByb29mIG9mIGEgdmFsaWRhdG9yIHNlc3Npb24ga2V5LhkBIE5PVEU6IFRoaXMgZnVuY3Rpb24gaXMgb25seSBhdmFpbGFibGUgc2luY2UgcGFyYWNoYWluIGhvc3QgdmVyc2lvbiA1LmhzdWJtaXRfcmVwb3J0X2Rpc3B1dGVfbG9zdAg0ZGlzcHV0ZV9wcm9vZiUFTGtleV9vd25lcnNoaXBfcHJvb2YhDiUODCkBIFN1Ym1pdCBhbiB1bnNpZ25lZCBleHRyaW5zaWMgdG8gc2xhc2ggdmFsaWRhdG9ycyB3aG8gbG9zdCBhIGRpc3B1dGUgYWJvdXR8IGEgY2FuZGlkYXRlIG9mIGEgcGFzdCBzZXNzaW9uLhkBIE5PVEU6IFRoaXMgZnVuY3Rpb24gaXMgb25seSBhdmFpbGFibGUgc2luY2UgcGFyYWNoYWluIGhvc3QgdmVyc2lvbiA1LlRtaW5pbXVtX2JhY2tpbmdfdm90ZXMAEAgNASBHZXQgdGhlIG1pbmltdW0gbnVtYmVyIG9mIGJhY2tpbmcgdm90ZXMgZm9yIGEgcGFyYWNoYWluIGNhbmRpZGF0ZS70IFRoaXMgaXMgYSBzdGFnaW5nIG1ldGhvZCEgRG8gbm90IHVzZSBvbiBwcm9kdWN0aW9uIHJ1bnRpbWVzIUhwYXJhX2JhY2tpbmdfc3RhdGUEBF+NAikOBOQgUmV0dXJucyB0aGUgc3RhdGUgb2YgcGFyYWNoYWluIGJhY2tpbmcgZm9yIGEgZ2l2ZW4gcGFyYS5QYXN5bmNfYmFja2luZ19wYXJhbXMAVQQEYQEgUmV0dXJucyBjYW5kaWRhdGUncyBhY2NlcHRhbmNlIGxpbWl0YXRpb25zIGZvciBhc3luY2hyb25vdXMgYmFja2luZyBmb3IgYSByZWxheSBwYXJlbnQuTGRpc2FibGVkX3ZhbGlkYXRvcnMAFQsE+CBSZXR1cm5zIGEgbGlzdCBvZiBhbGwgZGlzYWJsZWQgdmFsaWRhdG9ycyBhdCB0aGUgZ2l2ZW4gYmxvY2suNG5vZGVfZmVhdHVyZXMAkQQITCBHZXQgbm9kZSBmZWF0dXJlcy70IFRoaXMgaXMgYSBzdGFnaW5nIG1ldGhvZCEgRG8gbm90IHVzZSBvbiBwcm9kdWN0aW9uIHJ1bnRpbWVzIVhhcHByb3ZhbF92b3RpbmdfcGFyYW1zAG0EBKQgQXBwcm92YWwgdm90aW5nIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyxjbGFpbV9xdWV1ZQBZDgQwIENsYWltIHF1ZXVlfGNhbmRpZGF0ZXNfcGVuZGluZ19hdmFpbGFiaWxpdHkEHHBhcmFfaWSNAmUOBGAgRWxhc3RpYyBzY2FsaW5nIHN1cHBvcnQE3CBUaGUgQVBJIGZvciBxdWVyeWluZyB0aGUgc3RhdGUgb2YgcGFyYWNoYWlucyBvbi1jaGFpbi4gQmVlZnlBcGkQNGJlZWZ5X2dlbmVzaXMAYQIEBQEgUmV0dXJuIHRoZSBibG9jayBudW1iZXIgd2hlcmUgQkVFRlkgY29uc2Vuc3VzIGlzIGVuYWJsZWQvc3RhcnRlZDR2YWxpZGF0b3Jfc2V0AGkOBLggUmV0dXJuIHRoZSBjdXJyZW50IGFjdGl2ZSBCRUVGWSB2YWxpZGF0b3Igc2V0tHN1Ym1pdF9yZXBvcnRfZXF1aXZvY2F0aW9uX3Vuc2lnbmVkX2V4dHJpbnNpYwhIZXF1aXZvY2F0aW9uX3Byb29m2QY8a2V5X293bmVyX3Byb29mcQ4lDiARASBTdWJtaXRzIGFuIHVuc2lnbmVkIGV4dHJpbnNpYyB0byByZXBvcnQgYW4gZXF1aXZvY2F0aW9uLiBUaGUgY2FsbGVy+CBtdXN0IHByb3ZpZGUgdGhlIGVxdWl2b2NhdGlvbiBwcm9vZiBhbmQgYSBrZXkgb3duZXJzaGlwIHByb29m/CAoc2hvdWxkIGJlIG9idGFpbmVkIHVzaW5nIGBnZW5lcmF0ZV9rZXlfb3duZXJzaGlwX3Byb29mYCkuIFRoZQUBIGV4dHJpbnNpYyB3aWxsIGJlIHVuc2lnbmVkIGFuZCBzaG91bGQgb25seSBiZSBhY2NlcHRlZCBmb3IgbG9jYWwVASBhdXRob3JzaGlwIChub3QgdG8gYmUgYnJvYWRjYXN0IHRvIHRoZSBuZXR3b3JrKS4gVGhpcyBtZXRob2QgcmV0dXJucwkBIGBOb25lYCB3aGVuIGNyZWF0aW9uIG9mIHRoZSBleHRyaW5zaWMgZmFpbHMsIGUuZy4gaWYgZXF1aXZvY2F0aW9uBQEgcmVwb3J0aW5nIGlzIGRpc2FibGVkIGZvciB0aGUgZ2l2ZW4gcnVudGltZSAoaS5lLiB0aGlzIG1ldGhvZCBpcwUBIGhhcmRjb2RlZCB0byByZXR1cm4gYE5vbmVgKS4gT25seSB1c2VmdWwgaW4gYW4gb2ZmY2hhaW4gY29udGV4dC5wZ2VuZXJhdGVfa2V5X293bmVyc2hpcF9wcm9vZggYc2V0X2lkMDBhdXRob3JpdHlfaWQpAnUOLAkBIEdlbmVyYXRlcyBhIHByb29mIG9mIGtleSBvd25lcnNoaXAgZm9yIHRoZSBnaXZlbiBhdXRob3JpdHkgaW4gdGhl/CBnaXZlbiBzZXQuIEFuIGV4YW1wbGUgdXNhZ2Ugb2YgdGhpcyBtb2R1bGUgaXMgY291cGxlZCB3aXRoIHRoZQUBIHNlc3Npb24gaGlzdG9yaWNhbCBtb2R1bGUgdG8gcHJvdmUgdGhhdCBhIGdpdmVuIGF1dGhvcml0eSBrZXkgaXMNASB0aWVkIHRvIGEgZ2l2ZW4gc3Rha2luZyBpZGVudGl0eSBkdXJpbmcgYSBzcGVjaWZpYyBzZXNzaW9uLiBQcm9vZnMRASBvZiBrZXkgb3duZXJzaGlwIGFyZSBuZWNlc3NhcnkgZm9yIHN1Ym1pdHRpbmcgZXF1aXZvY2F0aW9uIHJlcG9ydHMuEQEgTk9URTogZXZlbiB0aG91Z2ggdGhlIEFQSSB0YWtlcyBhIGBzZXRfaWRgIGFzIHBhcmFtZXRlciB0aGUgY3VycmVudAkBIGltcGxlbWVudGF0aW9ucyBpZ25vcmVzIHRoaXMgcGFyYW1ldGVyIGFuZCBpbnN0ZWFkIHJlbGllcyBvbiB0aGlzDQEgbWV0aG9kIGJlaW5nIGNhbGxlZCBhdCB0aGUgY29ycmVjdCBibG9jayBoZWlnaHQsIGkuZS4gYW55IHBvaW50IGF0FQEgd2hpY2ggdGhlIGdpdmVuIHNldCBpZCBpcyBsaXZlIG9uLWNoYWluLiBGdXR1cmUgaW1wbGVtZW50YXRpb25zIHdpbGwNASBpbnN0ZWFkIHVzZSBpbmRleGVkIGRhdGEgdGhyb3VnaCBhbiBvZmZjaGFpbiB3b3JrZXIsIG5vdCByZXF1aXJpbmd4IG9sZGVyIHN0YXRlcyB0byBiZSBhdmFpbGFibGUuBIAgQVBJIG5lY2Vzc2FyeSBmb3IgQkVFRlkgdm90ZXJzLhhNbXJBcGkUIG1tcl9yb290AHkOBIwgUmV0dXJuIHRoZSBvbi1jaGFpbiBNTVIgcm9vdCBoYXNoLjhtbXJfbGVhZl9jb3VudACBDgS4IFJldHVybiB0aGUgbnVtYmVyIG9mIE1NUiBibG9ja3MgaW4gdGhlIGNoYWluLjhnZW5lcmF0ZV9wcm9vZgg0YmxvY2tfbnVtYmVyc+UBXGJlc3Rfa25vd25fYmxvY2tfbnVtYmVyYQKFDghpASBHZW5lcmF0ZSBNTVIgcHJvb2YgZm9yIGEgc2VyaWVzIG9mIGJsb2NrIG51bWJlcnMuIElmIGBiZXN0X2tub3duX2Jsb2NrX251bWJlciA9IFNvbWUobilgLEUBIHVzZSBoaXN0b3JpY2FsIE1NUiBzdGF0ZSBhdCBnaXZlbiBibG9jayBoZWlnaHQgYG5gLiBFbHNlLCB1c2UgY3VycmVudCBNTVIgc3RhdGUuMHZlcmlmeV9wcm9vZggYbGVhdmVzjQ4UcHJvb2aVDpkOFPQgVmVyaWZ5IE1NUiBwcm9vZiBhZ2FpbnN0IG9uLWNoYWluIE1NUiBmb3IgYSBiYXRjaCBvZiBsZWF2ZXMuAHEBIE5vdGUgdGhpcyBmdW5jdGlvbiB3aWxsIHVzZSBvbi1jaGFpbiBNTVIgcm9vdCBoYXNoIGFuZCBjaGVjayBpZiB0aGUgcHJvb2YgbWF0Y2hlcyB0aGUgaGFzaC5tASBOb3RlLCB0aGUgbGVhdmVzIHNob3VsZCBiZSBzb3J0ZWQgc3VjaCB0aGF0IGNvcnJlc3BvbmRpbmcgbGVhdmVzIGFuZCBsZWFmIGluZGljZXMgaGF2ZSB0aGWVASBzYW1lIHBvc2l0aW9uIGluIGJvdGggdGhlIGBsZWF2ZXNgIHZlY3RvciBhbmQgdGhlIGBsZWFmX2luZGljZXNgIHZlY3RvciBjb250YWluZWQgaW4gdGhlIFtMZWFmUHJvb2ZdWHZlcmlmeV9wcm9vZl9zdGF0ZWxlc3MMEHJvb3Q0GGxlYXZlc40OFHByb29mlQ6ZDhwBASBWZXJpZnkgTU1SIHByb29mIGFnYWluc3QgZ2l2ZW4gcm9vdCBoYXNoIGZvciBhIGJhdGNoIG9mIGxlYXZlcy4A/CBOb3RlIHRoaXMgZnVuY3Rpb24gZG9lcyBub3QgcmVxdWlyZSBhbnkgb24tY2hhaW4gc3RvcmFnZSAtIHRoZbwgcHJvb2YgaXMgdmVyaWZpZWQgYWdhaW5zdCBnaXZlbiBNTVIgcm9vdCBoYXNoLgBtASBOb3RlLCB0aGUgbGVhdmVzIHNob3VsZCBiZSBzb3J0ZWQgc3VjaCB0aGF0IGNvcnJlc3BvbmRpbmcgbGVhdmVzIGFuZCBsZWFmIGluZGljZXMgaGF2ZSB0aGWVASBzYW1lIHBvc2l0aW9uIGluIGJvdGggdGhlIGBsZWF2ZXNgIHZlY3RvciBhbmQgdGhlIGBsZWFmX2luZGljZXNgIHZlY3RvciBjb250YWluZWQgaW4gdGhlIFtMZWFmUHJvb2ZdBIQgQVBJIHRvIGludGVyYWN0IHdpdGggTU1SIHBhbGxldC4sQmVlZnlNbXJBcGkITGF1dGhvcml0eV9zZXRfcHJvb2YAJQ0E3CBSZXR1cm4gdGhlIGN1cnJlbnRseSBhY3RpdmUgQkVFRlkgYXV0aG9yaXR5IHNldCBwcm9vZi5gbmV4dF9hdXRob3JpdHlfc2V0X3Byb29mACUNBMggUmV0dXJuIHRoZSBuZXh0L3F1ZXVlZCBCRUVGWSBhdXRob3JpdHkgc2V0IHByb29mLgSQIEFQSSB1c2VmdWwgZm9yIEJFRUZZIGxpZ2h0IGNsaWVudHMuKEdyYW5kcGFBcGkQTGdyYW5kcGFfYXV0aG9yaXRpZXMAzBg9ASBHZXQgdGhlIGN1cnJlbnQgR1JBTkRQQSBhdXRob3JpdGllcyBhbmQgd2VpZ2h0cy4gVGhpcyBzaG91bGQgbm90IGNoYW5nZSBleGNlcHQdASBmb3Igd2hlbiBjaGFuZ2VzIGFyZSBzY2hlZHVsZWQgYW5kIHRoZSBjb3JyZXNwb25kaW5nIGRlbGF5IGhhcyBwYXNzZWQuADUBIFdoZW4gY2FsbGVkIGF0IGJsb2NrIEIsIGl0IHdpbGwgcmV0dXJuIHRoZSBzZXQgb2YgYXV0aG9yaXRpZXMgdGhhdCBzaG91bGQgYmU9ASB1c2VkIHRvIGZpbmFsaXplIGRlc2NlbmRhbnRzIG9mIHRoaXMgYmxvY2sgKEIrMSwgQisyLCAuLi4pLiBUaGUgYmxvY2sgQiBpdHNlbGbAIGlzIGZpbmFsaXplZCBieSB0aGUgYXV0aG9yaXRpZXMgZnJvbSBibG9jayBCLTEutHN1Ym1pdF9yZXBvcnRfZXF1aXZvY2F0aW9uX3Vuc2lnbmVkX2V4dHJpbnNpYwhIZXF1aXZvY2F0aW9uX3Byb29mNQI8a2V5X293bmVyX3Byb29mcQ4lDiARASBTdWJtaXRzIGFuIHVuc2lnbmVkIGV4dHJpbnNpYyB0byByZXBvcnQgYW4gZXF1aXZvY2F0aW9uLiBUaGUgY2FsbGVy+CBtdXN0IHByb3ZpZGUgdGhlIGVxdWl2b2NhdGlvbiBwcm9vZiBhbmQgYSBrZXkgb3duZXJzaGlwIHByb29m/CAoc2hvdWxkIGJlIG9idGFpbmVkIHVzaW5nIGBnZW5lcmF0ZV9rZXlfb3duZXJzaGlwX3Byb29mYCkuIFRoZQUBIGV4dHJpbnNpYyB3aWxsIGJlIHVuc2lnbmVkIGFuZCBzaG91bGQgb25seSBiZSBhY2NlcHRlZCBmb3IgbG9jYWwVASBhdXRob3JzaGlwIChub3QgdG8gYmUgYnJvYWRjYXN0IHRvIHRoZSBuZXR3b3JrKS4gVGhpcyBtZXRob2QgcmV0dXJucwkBIGBOb25lYCB3aGVuIGNyZWF0aW9uIG9mIHRoZSBleHRyaW5zaWMgZmFpbHMsIGUuZy4gaWYgZXF1aXZvY2F0aW9uBQEgcmVwb3J0aW5nIGlzIGRpc2FibGVkIGZvciB0aGUgZ2l2ZW4gcnVudGltZSAoaS5lLiB0aGlzIG1ldGhvZCBpcwUBIGhhcmRjb2RlZCB0byByZXR1cm4gYE5vbmVgKS4gT25seSB1c2VmdWwgaW4gYW4gb2ZmY2hhaW4gY29udGV4dC5wZ2VuZXJhdGVfa2V5X293bmVyc2hpcF9wcm9vZggYc2V0X2lkMDBhdXRob3JpdHlfaWTUdQ4sCQEgR2VuZXJhdGVzIGEgcHJvb2Ygb2Yga2V5IG93bmVyc2hpcCBmb3IgdGhlIGdpdmVuIGF1dGhvcml0eSBpbiB0aGX8IGdpdmVuIHNldC4gQW4gZXhhbXBsZSB1c2FnZSBvZiB0aGlzIG1vZHVsZSBpcyBjb3VwbGVkIHdpdGggdGhlBQEgc2Vzc2lvbiBoaXN0b3JpY2FsIG1vZHVsZSB0byBwcm92ZSB0aGF0IGEgZ2l2ZW4gYXV0aG9yaXR5IGtleSBpcw0BIHRpZWQgdG8gYSBnaXZlbiBzdGFraW5nIGlkZW50aXR5IGR1cmluZyBhIHNwZWNpZmljIHNlc3Npb24uIFByb29mcxEBIG9mIGtleSBvd25lcnNoaXAgYXJlIG5lY2Vzc2FyeSBmb3Igc3VibWl0dGluZyBlcXVpdm9jYXRpb24gcmVwb3J0cy4RASBOT1RFOiBldmVuIHRob3VnaCB0aGUgQVBJIHRha2VzIGEgYHNldF9pZGAgYXMgcGFyYW1ldGVyIHRoZSBjdXJyZW50/CBpbXBsZW1lbnRhdGlvbnMgaWdub3JlIHRoaXMgcGFyYW1ldGVyIGFuZCBpbnN0ZWFkIHJlbHkgb24gdGhpcw0BIG1ldGhvZCBiZWluZyBjYWxsZWQgYXQgdGhlIGNvcnJlY3QgYmxvY2sgaGVpZ2h0LCBpLmUuIGFueSBwb2ludCBhdBUBIHdoaWNoIHRoZSBnaXZlbiBzZXQgaWQgaXMgbGl2ZSBvbi1jaGFpbi4gRnV0dXJlIGltcGxlbWVudGF0aW9ucyB3aWxsDQEgaW5zdGVhZCB1c2UgaW5kZXhlZCBkYXRhIHRocm91Z2ggYW4gb2ZmY2hhaW4gd29ya2VyLCBub3QgcmVxdWlyaW5neCBvbGRlciBzdGF0ZXMgdG8gYmUgYXZhaWxhYmxlLjhjdXJyZW50X3NldF9pZAAwBJggR2V0IGN1cnJlbnQgR1JBTkRQQSBhdXRob3JpdHkgc2V0IGlkLiQBASBBUElzIGZvciBpbnRlZ3JhdGluZyB0aGUgR1JBTkRQQSBmaW5hbGl0eSBnYWRnZXQgaW50byBydW50aW1lcy7AIFRoaXMgc2hvdWxkIGJlIGltcGxlbWVudGVkIG9uIHRoZSBydW50aW1lIHNpZGUuABUBIFRoaXMgaXMgcHJpbWFyaWx5IHVzZWQgZm9yIG5lZ290aWF0aW5nIGF1dGhvcml0eS1zZXQgY2hhbmdlcyBmb3IgdGhlDQEgZ2FkZ2V0LiBHUkFORFBBIHVzZXMgYSBzaWduYWxpbmcgbW9kZWwgb2YgY2hhbmdpbmcgYXV0aG9yaXR5IHNldHM6MQEgY2hhbmdlcyBzaG91bGQgYmUgc2lnbmFsZWQgd2l0aCBhIGRlbGF5IG9mIE4gYmxvY2tzLCBhbmQgdGhlbiBhdXRvbWF0aWNhbGx55CBhcHBsaWVkIGluIHRoZSBydW50aW1lIGFmdGVyIHRob3NlIE4gYmxvY2tzIGhhdmUgcGFzc2VkLgD8IFRoZSBjb25zZW5zdXMgcHJvdG9jb2wgd2lsbCBjb29yZGluYXRlIHRoZSBoYW5kb2ZmIGV4dGVybmFsbHkuHEJhYmVBcGkYNGNvbmZpZ3VyYXRpb24AnQ4EjCBSZXR1cm4gdGhlIGNvbmZpZ3VyYXRpb24gZm9yIEJBQkUuTGN1cnJlbnRfZXBvY2hfc3RhcnQAqQEExCBSZXR1cm5zIHRoZSBzbG90IHRoYXQgc3RhcnRlZCB0aGUgY3VycmVudCBlcG9jaC40Y3VycmVudF9lcG9jaAChDgTEIFJldHVybnMgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoZSBjdXJyZW50IGVwb2NoLihuZXh0X2Vwb2NoAKEOCAEBIFJldHVybnMgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoZSBuZXh0IGVwb2NoICh3aGljaCB3YXMgYWxyZWFkeVwgcHJldmlvdXNseSBhbm5vdW5jZWQpLnBnZW5lcmF0ZV9rZXlfb3duZXJzaGlwX3Byb29mCBBzbG90qQEwYXV0aG9yaXR5X2lkpQGlDiwJASBHZW5lcmF0ZXMgYSBwcm9vZiBvZiBrZXkgb3duZXJzaGlwIGZvciB0aGUgZ2l2ZW4gYXV0aG9yaXR5IGluIHRoZQ0BIGN1cnJlbnQgZXBvY2guIEFuIGV4YW1wbGUgdXNhZ2Ugb2YgdGhpcyBtb2R1bGUgaXMgY291cGxlZCB3aXRoIHRoZQUBIHNlc3Npb24gaGlzdG9yaWNhbCBtb2R1bGUgdG8gcHJvdmUgdGhhdCBhIGdpdmVuIGF1dGhvcml0eSBrZXkgaXMNASB0aWVkIHRvIGEgZ2l2ZW4gc3Rha2luZyBpZGVudGl0eSBkdXJpbmcgYSBzcGVjaWZpYyBzZXNzaW9uLiBQcm9vZnMRASBvZiBrZXkgb3duZXJzaGlwIGFyZSBuZWNlc3NhcnkgZm9yIHN1Ym1pdHRpbmcgZXF1aXZvY2F0aW9uIHJlcG9ydHMuCQEgTk9URTogZXZlbiB0aG91Z2ggdGhlIEFQSSB0YWtlcyBhIGBzbG90YCBhcyBwYXJhbWV0ZXIgdGhlIGN1cnJlbnQJASBpbXBsZW1lbnRhdGlvbnMgaWdub3JlcyB0aGlzIHBhcmFtZXRlciBhbmQgaW5zdGVhZCByZWxpZXMgb24gdGhpcw0BIG1ldGhvZCBiZWluZyBjYWxsZWQgYXQgdGhlIGNvcnJlY3QgYmxvY2sgaGVpZ2h0LCBpLmUuIGFueSBwb2ludCBhdPAgd2hpY2ggdGhlIGVwb2NoIGZvciB0aGUgZ2l2ZW4gc2xvdCBpcyBsaXZlIG9uLWNoYWluLiBGdXR1cmUJASBpbXBsZW1lbnRhdGlvbnMgd2lsbCBpbnN0ZWFkIHVzZSBpbmRleGVkIGRhdGEgdGhyb3VnaCBhbiBvZmZjaGFpbtAgd29ya2VyLCBub3QgcmVxdWlyaW5nIG9sZGVyIHN0YXRlcyB0byBiZSBhdmFpbGFibGUutHN1Ym1pdF9yZXBvcnRfZXF1aXZvY2F0aW9uX3Vuc2lnbmVkX2V4dHJpbnNpYwhIZXF1aXZvY2F0aW9uX3Byb29mnQE8a2V5X293bmVyX3Byb29mqQ4lDiARASBTdWJtaXRzIGFuIHVuc2lnbmVkIGV4dHJpbnNpYyB0byByZXBvcnQgYW4gZXF1aXZvY2F0aW9uLiBUaGUgY2FsbGVy+CBtdXN0IHByb3ZpZGUgdGhlIGVxdWl2b2NhdGlvbiBwcm9vZiBhbmQgYSBrZXkgb3duZXJzaGlwIHByb29m/CAoc2hvdWxkIGJlIG9idGFpbmVkIHVzaW5nIGBnZW5lcmF0ZV9rZXlfb3duZXJzaGlwX3Byb29mYCkuIFRoZQUBIGV4dHJpbnNpYyB3aWxsIGJlIHVuc2lnbmVkIGFuZCBzaG91bGQgb25seSBiZSBhY2NlcHRlZCBmb3IgbG9jYWwVASBhdXRob3JzaGlwIChub3QgdG8gYmUgYnJvYWRjYXN0IHRvIHRoZSBuZXR3b3JrKS4gVGhpcyBtZXRob2QgcmV0dXJucwkBIGBOb25lYCB3aGVuIGNyZWF0aW9uIG9mIHRoZSBleHRyaW5zaWMgZmFpbHMsIGUuZy4gaWYgZXF1aXZvY2F0aW9uBQEgcmVwb3J0aW5nIGlzIGRpc2FibGVkIGZvciB0aGUgZ2l2ZW4gcnVudGltZSAoaS5lLiB0aGlzIG1ldGhvZCBpcwUBIGhhcmRjb2RlZCB0byByZXR1cm4gYE5vbmVgKS4gT25seSB1c2VmdWwgaW4gYW4gb2ZmY2hhaW4gY29udGV4dC4EuCBBUEkgbmVjZXNzYXJ5IGZvciBibG9jayBhdXRob3JzaGlwIHdpdGggQkFCRS5UQXV0aG9yaXR5RGlzY292ZXJ5QXBpBCxhdXRob3JpdGllcwBpCQQZASBSZXRyaWV2ZSBhdXRob3JpdHkgaWRlbnRpZmllcnMgb2YgdGhlIGN1cnJlbnQgYW5kIG5leHQgYXV0aG9yaXR5IHNldC4QdCBUaGUgYXV0aG9yaXR5IGRpc2NvdmVyeSBhcGkuAFEBIFRoaXMgYXBpIGlzIHVzZWQgYnkgdGhlIGBjbGllbnQvYXV0aG9yaXR5LWRpc2NvdmVyeWAgbW9kdWxlIHRvIHJldHJpZXZlIGlkZW50aWZpZXJznCBvZiB0aGUgY3VycmVudCBhbmQgbmV4dCBhdXRob3JpdHkgc2V0LixTZXNzaW9uS2V5cwhUZ2VuZXJhdGVfc2Vzc2lvbl9rZXlzBBBzZWVk0Qw4HBUBIEdlbmVyYXRlIGEgc2V0IG9mIHNlc3Npb24ga2V5cyB3aXRoIG9wdGlvbmFsbHkgdXNpbmcgdGhlIGdpdmVuIHNlZWQuCQEgVGhlIGtleXMgc2hvdWxkIGJlIHN0b3JlZCB3aXRoaW4gdGhlIGtleXN0b3JlIGV4cG9zZWQgdmlhIHJ1bnRpbWU8IGV4dGVybmFsaXRpZXMuALAgVGhlIHNlZWQgbmVlZHMgdG8gYmUgYSB2YWxpZCBgdXRmOGAgc3RyaW5nLgDQIFJldHVybnMgdGhlIGNvbmNhdGVuYXRlZCBTQ0FMRSBlbmNvZGVkIHB1YmxpYyBrZXlzLkxkZWNvZGVfc2Vzc2lvbl9rZXlzBBxlbmNvZGVkOK0ODJggRGVjb2RlIHRoZSBnaXZlbiBwdWJsaWMgc2Vzc2lvbiBrZXlzLgDcIFJldHVybnMgdGhlIGxpc3Qgb2YgcHVibGljIHJhdyBwdWJsaWMga2V5cyArIGtleSB0eXBlLgRoIFNlc3Npb24ga2V5cyBydW50aW1lIGFwaS48QWNjb3VudE5vbmNlQXBpBDRhY2NvdW50X25vbmNlBBxhY2NvdW50ABAEwCBHZXQgY3VycmVudCBhY2NvdW50IG5vbmNlIG9mIGdpdmVuIGBBY2NvdW50SWRgLgSAIFRoZSBBUEkgdG8gcXVlcnkgYWNjb3VudCBub25jZS5UVHJhbnNhY3Rpb25QYXltZW50QXBpEChxdWVyeV9pbmZvCAx1eHRtDQxsZW4QuQ4ARHF1ZXJ5X2ZlZV9kZXRhaWxzCAx1eHRtDQxsZW4QvQ4ATHF1ZXJ5X3dlaWdodF90b19mZWUEGHdlaWdodCgYAExxdWVyeV9sZW5ndGhfdG9fZmVlBBhsZW5ndGgQGAAAZFRyYW5zYWN0aW9uUGF5bWVudENhbGxBcGkQPHF1ZXJ5X2NhbGxfaW5mbwgQY2FsbHUBDGxlbhC5DgRJASBRdWVyeSBpbmZvcm1hdGlvbiBvZiBhIGRpc3BhdGNoIGNsYXNzLCB3ZWlnaHQsIGFuZCBmZWUgb2YgYSBnaXZlbiBlbmNvZGVkIGBDYWxsYC5YcXVlcnlfY2FsbF9mZWVfZGV0YWlscwgQY2FsbHUBDGxlbhC9DgS0IFF1ZXJ5IGZlZSBkZXRhaWxzIG9mIGEgZ2l2ZW4gZW5jb2RlZCBgQ2FsbGAuTHF1ZXJ5X3dlaWdodF90b19mZWUEGHdlaWdodCgYBAEBIFF1ZXJ5IHRoZSBvdXRwdXQgb2YgdGhlIGN1cnJlbnQgYFdlaWdodFRvRmVlYCBnaXZlbiBzb21lIGlucHV0LkxxdWVyeV9sZW5ndGhfdG9fZmVlBBhsZW5ndGgQGAQBASBRdWVyeSB0aGUgb3V0cHV0IG9mIHRoZSBjdXJyZW50IGBMZW5ndGhUb0ZlZWAgZ2l2ZW4gc29tZSBpbnB1dC4ANFhjbVBheW1lbnRBcGkQfHF1ZXJ5X2FjY2VwdGFibGVfcGF5bWVudF9hc3NldHMELHhjbV92ZXJzaW9uEMkOFLQgUmV0dXJucyBhIGxpc3Qgb2YgYWNjZXB0YWJsZSBwYXltZW50IGFzc2V0cy4AMCAjIEFyZ3VtZW50cwBoICogYHhjbV92ZXJzaW9uYDogVmVyc2lvbi5AcXVlcnlfeGNtX3dlaWdodAQcbWVzc2FnZYkF1Q4UqCBSZXR1cm5zIGEgd2VpZ2h0IG5lZWRlZCB0byBleGVjdXRlIGEgWENNLgAwICMgQXJndW1lbnRzAHQgKiBgbWVzc2FnZWA6IGBWZXJzaW9uZWRYY21gLmRxdWVyeV93ZWlnaHRfdG9fYXNzZXRfZmVlCBh3ZWlnaHQoFGFzc2V0vQbZDhjoIENvbnZlcnRzIGEgd2VpZ2h0IGludG8gYSBmZWUgZm9yIHRoZSBzcGVjaWZpZWQgYEFzc2V0SWRgLgAwICMgQXJndW1lbnRzAIggKiBgd2VpZ2h0YDogY29udmVydGlibGUgYFdlaWdodGAufCAqIGBhc3NldGA6IGBWZXJzaW9uZWRBc3NldElkYC5McXVlcnlfZGVsaXZlcnlfZmVlcwgsZGVzdGluYXRpb25FARxtZXNzYWdliQXdDiAdASBHZXQgZGVsaXZlcnkgZmVlcyBmb3Igc2VuZGluZyBhIHNwZWNpZmljIGBtZXNzYWdlYCB0byBhIGBkZXN0aW5hdGlvbmAu9CBUaGVzZSBhbHdheXMgY29tZSBpbiBhIHNwZWNpZmljIGFzc2V0LCBkZWZpbmVkIGJ5IHRoZSBjaGFpbi4AMCAjIEFyZ3VtZW50c4EBICogYG1lc3NhZ2VgOiBUaGUgbWVzc2FnZSB0aGF0J2xsIGJlIHNlbnQsIG5lY2Vzc2FyeSBiZWNhdXNlIG1vc3QgZGVsaXZlcnkgZmVlcyBhcmUgYmFzZWQgb24gdGhlXCAgIHNpemUgb2YgdGhlIG1lc3NhZ2UuYQEgKiBgZGVzdGluYXRpb25gOiBUaGUgZGVzdGluYXRpb24gdG8gc2VuZCB0aGUgbWVzc2FnZSB0by4gRGlmZmVyZW50IGRlc3RpbmF0aW9ucyBtYXkgdXNlwCAgIGRpZmZlcmVudCBzZW5kZXJzIHRoYXQgY2hhcmdlIGRpZmZlcmVudCBmZWVzLixwIEEgdHJhaXQgb2YgWENNIHBheW1lbnQgQVBJLgCoIEFQSSBwcm92aWRlcyBmdW5jdGlvbmFsaXR5IGZvciBvYnRhaW5pbmc6AMQgKiB0aGUgd2VpZ2h0IHJlcXVpcmVkIHRvIGV4ZWN1dGUgYW4gWENNIG1lc3NhZ2UsBQEgKiBhIGxpc3Qgb2YgYWNjZXB0YWJsZSBgQXNzZXRJZGBzIGZvciBtZXNzYWdlIGV4ZWN1dGlvbiBwYXltZW50LAEBICogdGhlIGNvc3Qgb2YgdGhlIHdlaWdodCBpbiB0aGUgc3BlY2lmaWVkIGFjY2VwdGFibGUgYEFzc2V0SWRgLqAgKiB0aGUgZmVlcyBmb3IgYW4gWENNIG1lc3NhZ2UgZGVsaXZlcnkuAPAgVG8gZGV0ZXJtaW5lIHRoZSBleGVjdXRpb24gd2VpZ2h0IG9mIHRoZSBjYWxscyByZXF1aXJlZCBmb3J1ASBbYHhjbTo6bGF0ZXN0OjpJbnN0cnVjdGlvbjo6VHJhbnNhY3RgXSBpbnN0cnVjdGlvbiwgYFRyYW5zYWN0aW9uUGF5bWVudENhbGxBcGlgIGNhbiBiZSB1c2VkLiREcnlSdW5BcGkIMGRyeV9ydW5fY2FsbAgYb3JpZ2lufQIQY2FsbHUB4Q4EOCBEcnkgcnVuIGNhbGwuLGRyeV9ydW5feGNtCDxvcmlnaW5fbG9jYXRpb25FAQx4Y22NBgEPBFAgRHJ5IHJ1biBYQ00gcHJvZ3JhbSSxASBBUEkgZm9yIGRyeS1ydW5uaW5nIGV4dHJpbnNpY3MgYW5kIFhDTSBwcm9ncmFtcyB0byBnZXQgdGhlIHByb2dyYW1zIHRoYXQgbmVlZCB0byBiZSBwYXNzZWQgdG8gdGhlIGZlZXMgQVBJLgCBASBBbGwgY2FsbHMgcmV0dXJuIGEgdmVjdG9yIG9mIHR1cGxlcyAobG9jYXRpb24sIHhjbSkgd2hlcmUgZWFjaCAieGNtIiBpcyBleGVjdXRlZCBpbiAibG9jYXRpb24iLuQgSWYgdGhlcmUncyBsb2NhbCBleGVjdXRpb24sIHRoZSBsb2NhdGlvbiB3aWxsIGJlICJIZXJlIi4dASBUaGlzIHZlY3RvciBjYW4gYmUgdXNlZCB0byBjYWxjdWxhdGUgYm90aCBleGVjdXRpb24gYW5kIGRlbGl2ZXJ5IGZlZXMuAJkBIENhbGxzIG9yIFhDTXMgbWlnaHQgZmFpbCB3aGVuIGV4ZWN1dGVkLCB0aGlzIGRvZXNuJ3QgbWVhbiB0aGUgcmVzdWx0IG9mIHRoZXNlIGNhbGxzIHdpbGwgYmUgYW4gYEVycmAuZQEgSW4gdGhvc2UgY2FzZXMsIHRoZXJlIG1pZ2h0IHN0aWxsIGJlIGEgdmFsaWQgcmVzdWx0LCB3aXRoIHRoZSBleGVjdXRpb24gZXJyb3IgaW5zaWRlIGl0LmUBIFRoZSBvbmx5IHJlYXNvbnMgd2h5IHRoZXNlIGNhbGxzIG1pZ2h0IHJldHVybiBhbiBlcnJvciBhcmUgbGlzdGVkIGluIHRoZSBbYEVycm9yYF0gZW51bS5QTG9jYXRpb25Ub0FjY291bnRBcGkEQGNvbnZlcnRfbG9jYXRpb24EIGxvY2F0aW9uRQEJDwSQIENvbnZlcnRzIGBMb2NhdGlvbmAgdG8gYEFjY291bnRJZGAuBA0BIEFQSSBmb3IgdXNlZnVsIGNvbnZlcnNpb25zIGJldHdlZW4gWENNIGBMb2NhdGlvbmAgYW5kIGBBY2NvdW50SWRgLjhHZW5lc2lzQnVpbGRlcgwsYnVpbGRfc3RhdGUEEGpzb244EQ8kZQEgQnVpbGQgYFJ1bnRpbWVHZW5lc2lzQ29uZmlnYCBmcm9tIGEgSlNPTiBibG9iIG5vdCB1c2luZyBhbnkgZGVmYXVsdHMgYW5kIHN0b3JlIGl0IGluIHRoZSQgc3RvcmFnZS4A+QEgSW4gdGhlIGNhc2Ugb2YgYSBGUkFNRS1iYXNlZCBydW50aW1lLCB0aGlzIGZ1bmN0aW9uIGRlc2VyaWFsaXplcyB0aGUgZnVsbCBgUnVudGltZUdlbmVzaXNDb25maWdgIGZyb20gdGhlIGdpdmVuIEpTT04gYmxvYiBhbmRZASBwdXRzIGl0IGludG8gdGhlIHN0b3JhZ2UuIElmIHRoZSBwcm92aWRlZCBKU09OIGJsb2IgaXMgaW5jb3JyZWN0IG9yIGluY29tcGxldGUgb3IgdGhltCBkZXNlcmlhbGl6YXRpb24gZmFpbHMsIGFuIGVycm9yIGlzIHJldHVybmVkLgBdASBQbGVhc2Ugbm90ZSB0aGF0IHByb3ZpZGVkIEpTT04gYmxvYiBtdXN0IGNvbnRhaW4gYWxsIGBSdW50aW1lR2VuZXNpc0NvbmZpZ2AgZmllbGRzLCBub1wgZGVmYXVsdHMgd2lsbCBiZSB1c2VkLihnZXRfcHJlc2V0BAhpZBUP0Qw4YQEgUmV0dXJucyBhIEpTT04gYmxvYiByZXByZXNlbnRhdGlvbiBvZiB0aGUgYnVpbHQtaW4gYFJ1bnRpbWVHZW5lc2lzQ29uZmlnYCBpZGVudGlmaWVkIGJ5GCBgaWRgLgA9ASBJZiBgaWRgIGlzIGBOb25lYCB0aGUgZnVuY3Rpb24gcmV0dXJucyBKU09OIGJsb2IgcmVwcmVzZW50YXRpb24gb2YgdGhlIGRlZmF1bHRJASBgUnVudGltZUdlbmVzaXNDb25maWdgIHN0cnVjdCBvZiB0aGUgcnVudGltZS4gSW1wbGVtZW50YXRpb24gbXVzdCBwcm92aWRlIGRlZmF1bHRgIGBSdW50aW1lR2VuZXNpc0NvbmZpZ2AuACEBIE90aGVyd2lzZSBmdW5jdGlvbiByZXR1cm5zIGEgSlNPTiByZXByZXNlbnRhdGlvbiBvZiB0aGUgYnVpbHQtaW4sIG5hbWVkUQEgYFJ1bnRpbWVHZW5lc2lzQ29uZmlnYCBwcmVzZXQgaWRlbnRpZmllZCBieSBgaWRgLCBvciBgTm9uZWAgaWYgc3VjaCBwcmVzZXQgZG9lcyBub3RlASBleGlzdHMuIFJldHVybmVkIGBWZWM8dTg+YCBjb250YWlucyBieXRlcyBvZiBKU09OIGJsb2IgKHBhdGNoKSB3aGljaCBjb21wcmlzZXMgYSBsaXN0IG9mTQEgKHBvdGVudGlhbGx5IG5lc3RlZCkga2V5LXZhbHVlIHBhaXJzIHRoYXQgYXJlIGludGVuZGVkIGZvciBjdXN0b21pemluZyB0aGUgZGVmYXVsdGUBIHJ1bnRpbWUgZ2VuZXNpcyBjb25maWcuIFRoZSBwYXRjaCBzaGFsbCBiZSBtZXJnZWQgKHJmYzczODYpIHdpdGggdGhlIEpTT04gcmVwcmVzZW50YXRpb25hASBvZiB0aGUgZGVmYXVsdCBgUnVudGltZUdlbmVzaXNDb25maWdgIHRvIGNyZWF0ZSBhIGNvbXByZWhlbnNpdmUgZ2VuZXNpcyBjb25maWcgdGhhdCBjYW6EIGJlIHVzZWQgaW4gYGJ1aWxkX3N0YXRlYCBtZXRob2QuMHByZXNldF9uYW1lcwAZDxBRASBSZXR1cm5zIGEgbGlzdCBvZiBpZGVudGlmaWVycyBmb3IgYXZhaWxhYmxlIGJ1aWx0aW4gYFJ1bnRpbWVHZW5lc2lzQ29uZmlnYCBwcmVzZXRzLgBhASBUaGUgcHJlc2V0cyBmcm9tIHRoZSBsaXN0IGNhbiBiZSBxdWVyaWVkIHdpdGggW2BHZW5lc2lzQnVpbGRlcjo6Z2V0X3ByZXNldGBdIG1ldGhvZC4gSWYBASBubyBuYW1lZCBwcmVzZXRzIGFyZSBwcm92aWRlZCBieSB0aGUgcnVudGltZSB0aGUgbGlzdCBpcyBlbXB0eS4E6CBBUEkgdG8gaW50ZXJhY3Qgd2l0aCBSdW50aW1lR2VuZXNpc0NvbmZpZyBmb3IgdGhlIHJ1bnRpbWV1AVQdDwA="; + dot_metadata_default = binMeta; + } +}); + +// .papi/descriptors/src/ksm_metadata.ts +var ksm_metadata_exports = {}; +__export(ksm_metadata_exports, { + default: () => ksm_metadata_default +}); +var binMeta2, ksm_metadata_default; +var init_ksm_metadata = __esm({ + ".papi/descriptors/src/ksm_metadata.ts"() { + binMeta2 = "bWV0YQ9FEAAMHHNwX2NvcmUYY3J5cHRvLEFjY291bnRJZDMyAAAEAAQBIFt1ODsgMzJdAAAEAAADIAAAAAgACAAABQMADAgwZnJhbWVfc3lzdGVtLEFjY291bnRJbmZvCBROb25jZQEQLEFjY291bnREYXRhARQAFAEUbm9uY2UQARROb25jZQABJGNvbnN1bWVycxABIFJlZkNvdW50AAEkcHJvdmlkZXJzEAEgUmVmQ291bnQAASxzdWZmaWNpZW50cxABIFJlZkNvdW50AAEQZGF0YRQBLEFjY291bnREYXRhAAAQAAAFBQAUDDxwYWxsZXRfYmFsYW5jZXMUdHlwZXMsQWNjb3VudERhdGEEHEJhbGFuY2UBGAAQARBmcmVlGAEcQmFsYW5jZQABIHJlc2VydmVkGAEcQmFsYW5jZQABGGZyb3plbhgBHEJhbGFuY2UAARRmbGFncxwBKEV4dHJhRmxhZ3MAABgAAAUHABwMPHBhbGxldF9iYWxhbmNlcxR0eXBlcyhFeHRyYUZsYWdzAAAEABgBEHUxMjgAACAAAAUAACQMNGZyYW1lX3N1cHBvcnQgZGlzcGF0Y2hAUGVyRGlzcGF0Y2hDbGFzcwQEVAEoAAwBGG5vcm1hbCgBBFQAASxvcGVyYXRpb25hbCgBBFQAASRtYW5kYXRvcnkoAQRUAAAoDChzcF93ZWlnaHRzJHdlaWdodF92MhhXZWlnaHQAAAgBIHJlZl90aW1lLAEMdTY0AAEocHJvb2Zfc2l6ZSwBDHU2NAAALAAABjAAMAAABQYANAg8cHJpbWl0aXZlX3R5cGVzEEgyNTYAAAQABAEgW3U4OyAzMl0AADgAAAIIADwQKHNwX3J1bnRpbWUcZ2VuZXJpYxhkaWdlc3QYRGlnZXN0AAAEARBsb2dzQAE8VmVjPERpZ2VzdEl0ZW0+AABAAAACRABEEChzcF9ydW50aW1lHGdlbmVyaWMYZGlnZXN0KERpZ2VzdEl0ZW0AARQoUHJlUnVudGltZQgASAFEQ29uc2Vuc3VzRW5naW5lSWQAADgBHFZlYzx1OD4ABgAkQ29uc2Vuc3VzCABIAURDb25zZW5zdXNFbmdpbmVJZAAAOAEcVmVjPHU4PgAEABBTZWFsCABIAURDb25zZW5zdXNFbmdpbmVJZAAAOAEcVmVjPHU4PgAFABRPdGhlcgQAOAEcVmVjPHU4PgAAAGRSdW50aW1lRW52aXJvbm1lbnRVcGRhdGVkAAgAAEgAAAMEAAAACABMAAACUABQCDBmcmFtZV9zeXN0ZW0sRXZlbnRSZWNvcmQIBEUBVARUATQADAEUcGhhc2U9CAEUUGhhc2UAARRldmVudFQBBEUAARh0b3BpY3MVAwEYVmVjPFQ+AABUCFhzdGFnaW5nX2t1c2FtYV9ydW50aW1lMFJ1bnRpbWVFdmVudAABtBhTeXN0ZW0EAFgBcGZyYW1lX3N5c3RlbTo6RXZlbnQ8UnVudGltZT4AAAAcSW5kaWNlcwQAfAF4cGFsbGV0X2luZGljZXM6OkV2ZW50PFJ1bnRpbWU+AAMAIEJhbGFuY2VzBACAAXxwYWxsZXRfYmFsYW5jZXM6OkV2ZW50PFJ1bnRpbWU+AAQASFRyYW5zYWN0aW9uUGF5bWVudAQAiAGocGFsbGV0X3RyYW5zYWN0aW9uX3BheW1lbnQ6OkV2ZW50PFJ1bnRpbWU+ACEAHFN0YWtpbmcEAIwBeHBhbGxldF9zdGFraW5nOjpFdmVudDxSdW50aW1lPgAGACBPZmZlbmNlcwQApAFYcGFsbGV0X29mZmVuY2VzOjpFdmVudAAHABxTZXNzaW9uBACsAVRwYWxsZXRfc2Vzc2lvbjo6RXZlbnQACAAcR3JhbmRwYQQAsAFUcGFsbGV0X2dyYW5kcGE6OkV2ZW50AAoAIFRyZWFzdXJ5BADAAXxwYWxsZXRfdHJlYXN1cnk6OkV2ZW50PFJ1bnRpbWU+ABIAQENvbnZpY3Rpb25Wb3RpbmcEAE0BAaBwYWxsZXRfY29udmljdGlvbl92b3Rpbmc6OkV2ZW50PFJ1bnRpbWU+ABQAJFJlZmVyZW5kYQQAUQEBgHBhbGxldF9yZWZlcmVuZGE6OkV2ZW50PFJ1bnRpbWU+ABUAUEZlbGxvd3NoaXBDb2xsZWN0aXZlBABVBwE5AXBhbGxldF9yYW5rZWRfY29sbGVjdGl2ZTo6RXZlbnQ8UnVudGltZSwgcGFsbGV0X3JhbmtlZF9jb2xsZWN0aXZlOjoKSW5zdGFuY2UxPgAWAExGZWxsb3dzaGlwUmVmZXJlbmRhBABhBwH0cGFsbGV0X3JlZmVyZW5kYTo6RXZlbnQ8UnVudGltZSwgcGFsbGV0X3JlZmVyZW5kYTo6SW5zdGFuY2UyPgAXACRXaGl0ZWxpc3QEAGUHAYBwYWxsZXRfd2hpdGVsaXN0OjpFdmVudDxSdW50aW1lPgAsAChQYXJhbWV0ZXJzBAB5BwGEcGFsbGV0X3BhcmFtZXRlcnM6OkV2ZW50PFJ1bnRpbWU+AC4AGENsYWltcwQAkQcBWGNsYWltczo6RXZlbnQ8UnVudGltZT4AEwAcVXRpbGl0eQQAlQcBVHBhbGxldF91dGlsaXR5OjpFdmVudAAYABxTb2NpZXR5BACdBwF4cGFsbGV0X3NvY2lldHk6OkV2ZW50PFJ1bnRpbWU+ABoAIFJlY292ZXJ5BAClBwF8cGFsbGV0X3JlY292ZXJ5OjpFdmVudDxSdW50aW1lPgAbABxWZXN0aW5nBACpBwF4cGFsbGV0X3Zlc3Rpbmc6OkV2ZW50PFJ1bnRpbWU+ABwAJFNjaGVkdWxlcgQArQcBgHBhbGxldF9zY2hlZHVsZXI6OkV2ZW50PFJ1bnRpbWU+AB0AFFByb3h5BAC1BwFwcGFsbGV0X3Byb3h5OjpFdmVudDxSdW50aW1lPgAeACBNdWx0aXNpZwQAuQcBfHBhbGxldF9tdWx0aXNpZzo6RXZlbnQ8UnVudGltZT4AHwAgUHJlaW1hZ2UEAL0HAXxwYWxsZXRfcHJlaW1hZ2U6OkV2ZW50PFJ1bnRpbWU+ACAAIEJvdW50aWVzBADBBwF8cGFsbGV0X2JvdW50aWVzOjpFdmVudDxSdW50aW1lPgAjADRDaGlsZEJvdW50aWVzBADFBwGUcGFsbGV0X2NoaWxkX2JvdW50aWVzOjpFdmVudDxSdW50aW1lPgAoAGhFbGVjdGlvblByb3ZpZGVyTXVsdGlQaGFzZQQAyQcB0HBhbGxldF9lbGVjdGlvbl9wcm92aWRlcl9tdWx0aV9waGFzZTo6RXZlbnQ8UnVudGltZT4AJQAMTmlzBADZBwFocGFsbGV0X25pczo6RXZlbnQ8UnVudGltZT4AJgBYTmlzQ291bnRlcnBhcnRCYWxhbmNlcwQA3QcB7HBhbGxldF9iYWxhbmNlczo6RXZlbnQ8UnVudGltZSwgcGFsbGV0X2JhbGFuY2VzOjpJbnN0YW5jZTI+AC0AJFZvdGVyTGlzdAQA4QcB9HBhbGxldF9iYWdzX2xpc3Q6OkV2ZW50PFJ1bnRpbWUsIHBhbGxldF9iYWdzX2xpc3Q6Okluc3RhbmNlMT4AJwA8Tm9taW5hdGlvblBvb2xzBADlBwGccGFsbGV0X25vbWluYXRpb25fcG9vbHM6OkV2ZW50PFJ1bnRpbWU+ACkALEZhc3RVbnN0YWtlBADpBwGMcGFsbGV0X2Zhc3RfdW5zdGFrZTo6RXZlbnQ8UnVudGltZT4AKgA0UGFyYUluY2x1c2lvbgQA7QcBkHBhcmFjaGFpbnNfaW5jbHVzaW9uOjpFdmVudDxSdW50aW1lPgA1ABRQYXJhcwQA/QcBXHBhcmFjaGFpbnNfcGFyYXM6OkV2ZW50ADgAEEhybXAEAAEIAXxwYXJhY2hhaW5zX2hybXA6OkV2ZW50PFJ1bnRpbWU+ADwANFBhcmFzRGlzcHV0ZXMEAAUIAYxwYXJhY2hhaW5zX2Rpc3B1dGVzOjpFdmVudDxSdW50aW1lPgA+AGhPbkRlbWFuZEFzc2lnbm1lbnRQcm92aWRlcgQAEQgBtHBhcmFjaGFpbnNfYXNzaWduZXJfb25fZGVtYW5kOjpFdmVudDxSdW50aW1lPgBAACRSZWdpc3RyYXIEABUIAXxwYXJhc19yZWdpc3RyYXI6OkV2ZW50PFJ1bnRpbWU+AEYAFFNsb3RzBAAZCAFUc2xvdHM6OkV2ZW50PFJ1bnRpbWU+AEcAIEF1Y3Rpb25zBAAdCAFgYXVjdGlvbnM6OkV2ZW50PFJ1bnRpbWU+AEgAJENyb3dkbG9hbgQAIQgBZGNyb3dkbG9hbjo6RXZlbnQ8UnVudGltZT4ASQAgQ29yZXRpbWUEACUIAWBjb3JldGltZTo6RXZlbnQ8UnVudGltZT4ASgAkWGNtUGFsbGV0BAApCAFocGFsbGV0X3hjbTo6RXZlbnQ8UnVudGltZT4AYwAwTWVzc2FnZVF1ZXVlBAAxCAGQcGFsbGV0X21lc3NhZ2VfcXVldWU6OkV2ZW50PFJ1bnRpbWU+AGQAJEFzc2V0UmF0ZQQAOQgBhHBhbGxldF9hc3NldF9yYXRlOjpFdmVudDxSdW50aW1lPgBlAABYDDBmcmFtZV9zeXN0ZW0YcGFsbGV0FEV2ZW50BARUAAEcQEV4dHJpbnNpY1N1Y2Nlc3MEATRkaXNwYXRjaF9pbmZvXAEwRGlzcGF0Y2hJbmZvAAAEkEFuIGV4dHJpbnNpYyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LjxFeHRyaW5zaWNGYWlsZWQIAThkaXNwYXRjaF9lcnJvcmgBNERpc3BhdGNoRXJyb3IAATRkaXNwYXRjaF9pbmZvXAEwRGlzcGF0Y2hJbmZvAAEEUEFuIGV4dHJpbnNpYyBmYWlsZWQuLENvZGVVcGRhdGVkAAIEUGA6Y29kZWAgd2FzIHVwZGF0ZWQuKE5ld0FjY291bnQEARxhY2NvdW50AAEwVDo6QWNjb3VudElkAAMEaEEgbmV3IGFjY291bnQgd2FzIGNyZWF0ZWQuNEtpbGxlZEFjY291bnQEARxhY2NvdW50AAEwVDo6QWNjb3VudElkAAQEWEFuIGFjY291bnQgd2FzIHJlYXBlZC4gUmVtYXJrZWQIARhzZW5kZXIAATBUOjpBY2NvdW50SWQAARBoYXNoNAEcVDo6SGFzaAAFBHBPbiBvbi1jaGFpbiByZW1hcmsgaGFwcGVuZWQuRFVwZ3JhZGVBdXRob3JpemVkCAEkY29kZV9oYXNoNAEcVDo6SGFzaAABNGNoZWNrX3ZlcnNpb24gARBib29sAAYEaEFuIHVwZ3JhZGUgd2FzIGF1dGhvcml6ZWQuBHBFdmVudCBmb3IgdGhlIFN5c3RlbSBwYWxsZXQuXAw0ZnJhbWVfc3VwcG9ydCBkaXNwYXRjaDBEaXNwYXRjaEluZm8AAAwBGHdlaWdodCgBGFdlaWdodAABFGNsYXNzYAE0RGlzcGF0Y2hDbGFzcwABIHBheXNfZmVlZAEQUGF5cwAAYAw0ZnJhbWVfc3VwcG9ydCBkaXNwYXRjaDREaXNwYXRjaENsYXNzAAEMGE5vcm1hbAAAACxPcGVyYXRpb25hbAABACRNYW5kYXRvcnkAAgAAZAw0ZnJhbWVfc3VwcG9ydCBkaXNwYXRjaBBQYXlzAAEIDFllcwAAAAhObwABAABoCChzcF9ydW50aW1lNERpc3BhdGNoRXJyb3IAATgUT3RoZXIAAAAwQ2Fubm90TG9va3VwAAEAJEJhZE9yaWdpbgACABhNb2R1bGUEAGwBLE1vZHVsZUVycm9yAAMARENvbnN1bWVyUmVtYWluaW5nAAQALE5vUHJvdmlkZXJzAAUAQFRvb01hbnlDb25zdW1lcnMABgAUVG9rZW4EAHABKFRva2VuRXJyb3IABwAoQXJpdGhtZXRpYwQAdAE8QXJpdGhtZXRpY0Vycm9yAAgANFRyYW5zYWN0aW9uYWwEAHgBSFRyYW5zYWN0aW9uYWxFcnJvcgAJACRFeGhhdXN0ZWQACgAoQ29ycnVwdGlvbgALACxVbmF2YWlsYWJsZQAMADhSb290Tm90QWxsb3dlZAANAABsCChzcF9ydW50aW1lLE1vZHVsZUVycm9yAAAIARRpbmRleAgBCHU4AAEUZXJyb3JIAYxbdTg7IE1BWF9NT0RVTEVfRVJST1JfRU5DT0RFRF9TSVpFXQAAcAgoc3BfcnVudGltZShUb2tlbkVycm9yAAEoQEZ1bmRzVW5hdmFpbGFibGUAAAAwT25seVByb3ZpZGVyAAEAMEJlbG93TWluaW11bQACADBDYW5ub3RDcmVhdGUAAwAwVW5rbm93bkFzc2V0AAQAGEZyb3plbgAFACxVbnN1cHBvcnRlZAAGAEBDYW5ub3RDcmVhdGVIb2xkAAcANE5vdEV4cGVuZGFibGUACAAcQmxvY2tlZAAJAAB0CDRzcF9hcml0aG1ldGljPEFyaXRobWV0aWNFcnJvcgABDCRVbmRlcmZsb3cAAAAgT3ZlcmZsb3cAAQA4RGl2aXNpb25CeVplcm8AAgAAeAgoc3BfcnVudGltZUhUcmFuc2FjdGlvbmFsRXJyb3IAAQgwTGltaXRSZWFjaGVkAAAAHE5vTGF5ZXIAAQAAfAw4cGFsbGV0X2luZGljZXMYcGFsbGV0FEV2ZW50BARUAAEMNEluZGV4QXNzaWduZWQIAQx3aG8AATBUOjpBY2NvdW50SWQAARRpbmRleBABPFQ6OkFjY291bnRJbmRleAAABHRBIGFjY291bnQgaW5kZXggd2FzIGFzc2lnbmVkLihJbmRleEZyZWVkBAEUaW5kZXgQATxUOjpBY2NvdW50SW5kZXgAAQS8QSBhY2NvdW50IGluZGV4IGhhcyBiZWVuIGZyZWVkIHVwICh1bmFzc2lnbmVkKS4sSW5kZXhGcm96ZW4IARRpbmRleBABPFQ6OkFjY291bnRJbmRleAABDHdobwABMFQ6OkFjY291bnRJZAACBOhBIGFjY291bnQgaW5kZXggaGFzIGJlZW4gZnJvemVuIHRvIGl0cyBjdXJyZW50IGFjY291bnQgSUQuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0gAw8cGFsbGV0X2JhbGFuY2VzGHBhbGxldBRFdmVudAgEVAAESQABWBxFbmRvd2VkCAEcYWNjb3VudAABMFQ6OkFjY291bnRJZAABMGZyZWVfYmFsYW5jZRgBKFQ6OkJhbGFuY2UAAAS4QW4gYWNjb3VudCB3YXMgY3JlYXRlZCB3aXRoIHNvbWUgZnJlZSBiYWxhbmNlLiBEdXN0TG9zdAgBHGFjY291bnQAATBUOjpBY2NvdW50SWQAARhhbW91bnQYAShUOjpCYWxhbmNlAAEIPQFBbiBhY2NvdW50IHdhcyByZW1vdmVkIHdob3NlIGJhbGFuY2Ugd2FzIG5vbi16ZXJvIGJ1dCBiZWxvdyBFeGlzdGVudGlhbERlcG9zaXQseHJlc3VsdGluZyBpbiBhbiBvdXRyaWdodCBsb3NzLiBUcmFuc2ZlcgwBEGZyb20AATBUOjpBY2NvdW50SWQAAQh0bwABMFQ6OkFjY291bnRJZAABGGFtb3VudBgBKFQ6OkJhbGFuY2UAAgRMVHJhbnNmZXIgc3VjY2VlZGVkLihCYWxhbmNlU2V0CAEMd2hvAAEwVDo6QWNjb3VudElkAAEQZnJlZRgBKFQ6OkJhbGFuY2UAAwRoQSBiYWxhbmNlIHdhcyBzZXQgYnkgcm9vdC4gUmVzZXJ2ZWQIAQx3aG8AATBUOjpBY2NvdW50SWQAARhhbW91bnQYAShUOjpCYWxhbmNlAAQE4FNvbWUgYmFsYW5jZSB3YXMgcmVzZXJ2ZWQgKG1vdmVkIGZyb20gZnJlZSB0byByZXNlcnZlZCkuKFVucmVzZXJ2ZWQIAQx3aG8AATBUOjpBY2NvdW50SWQAARhhbW91bnQYAShUOjpCYWxhbmNlAAUE6FNvbWUgYmFsYW5jZSB3YXMgdW5yZXNlcnZlZCAobW92ZWQgZnJvbSByZXNlcnZlZCB0byBmcmVlKS5IUmVzZXJ2ZVJlcGF0cmlhdGVkEAEQZnJvbQABMFQ6OkFjY291bnRJZAABCHRvAAEwVDo6QWNjb3VudElkAAEYYW1vdW50GAEoVDo6QmFsYW5jZQABSGRlc3RpbmF0aW9uX3N0YXR1c4QBGFN0YXR1cwAGCE0BU29tZSBiYWxhbmNlIHdhcyBtb3ZlZCBmcm9tIHRoZSByZXNlcnZlIG9mIHRoZSBmaXJzdCBhY2NvdW50IHRvIHRoZSBzZWNvbmQgYWNjb3VudC7YRmluYWwgYXJndW1lbnQgaW5kaWNhdGVzIHRoZSBkZXN0aW5hdGlvbiBiYWxhbmNlIHR5cGUuHERlcG9zaXQIAQx3aG8AATBUOjpBY2NvdW50SWQAARhhbW91bnQYAShUOjpCYWxhbmNlAAcE2FNvbWUgYW1vdW50IHdhcyBkZXBvc2l0ZWQgKGUuZy4gZm9yIHRyYW5zYWN0aW9uIGZlZXMpLiBXaXRoZHJhdwgBDHdobwABMFQ6OkFjY291bnRJZAABGGFtb3VudBgBKFQ6OkJhbGFuY2UACAQdAVNvbWUgYW1vdW50IHdhcyB3aXRoZHJhd24gZnJvbSB0aGUgYWNjb3VudCAoZS5nLiBmb3IgdHJhbnNhY3Rpb24gZmVlcykuHFNsYXNoZWQIAQx3aG8AATBUOjpBY2NvdW50SWQAARhhbW91bnQYAShUOjpCYWxhbmNlAAkEAQFTb21lIGFtb3VudCB3YXMgcmVtb3ZlZCBmcm9tIHRoZSBhY2NvdW50IChlLmcuIGZvciBtaXNiZWhhdmlvcikuGE1pbnRlZAgBDHdobwABMFQ6OkFjY291bnRJZAABGGFtb3VudBgBKFQ6OkJhbGFuY2UACgScU29tZSBhbW91bnQgd2FzIG1pbnRlZCBpbnRvIGFuIGFjY291bnQuGEJ1cm5lZAgBDHdobwABMFQ6OkFjY291bnRJZAABGGFtb3VudBgBKFQ6OkJhbGFuY2UACwScU29tZSBhbW91bnQgd2FzIGJ1cm5lZCBmcm9tIGFuIGFjY291bnQuJFN1c3BlbmRlZAgBDHdobwABMFQ6OkFjY291bnRJZAABGGFtb3VudBgBKFQ6OkJhbGFuY2UADAQVAVNvbWUgYW1vdW50IHdhcyBzdXNwZW5kZWQgZnJvbSBhbiBhY2NvdW50IChpdCBjYW4gYmUgcmVzdG9yZWQgbGF0ZXIpLiBSZXN0b3JlZAgBDHdobwABMFQ6OkFjY291bnRJZAABGGFtb3VudBgBKFQ6OkJhbGFuY2UADQSkU29tZSBhbW91bnQgd2FzIHJlc3RvcmVkIGludG8gYW4gYWNjb3VudC4gVXBncmFkZWQEAQx3aG8AATBUOjpBY2NvdW50SWQADgRgQW4gYWNjb3VudCB3YXMgdXBncmFkZWQuGElzc3VlZAQBGGFtb3VudBgBKFQ6OkJhbGFuY2UADwQtAVRvdGFsIGlzc3VhbmNlIHdhcyBpbmNyZWFzZWQgYnkgYGFtb3VudGAsIGNyZWF0aW5nIGEgY3JlZGl0IHRvIGJlIGJhbGFuY2VkLiRSZXNjaW5kZWQEARhhbW91bnQYAShUOjpCYWxhbmNlABAEJQFUb3RhbCBpc3N1YW5jZSB3YXMgZGVjcmVhc2VkIGJ5IGBhbW91bnRgLCBjcmVhdGluZyBhIGRlYnQgdG8gYmUgYmFsYW5jZWQuGExvY2tlZAgBDHdobwABMFQ6OkFjY291bnRJZAABGGFtb3VudBgBKFQ6OkJhbGFuY2UAEQRgU29tZSBiYWxhbmNlIHdhcyBsb2NrZWQuIFVubG9ja2VkCAEMd2hvAAEwVDo6QWNjb3VudElkAAEYYW1vdW50GAEoVDo6QmFsYW5jZQASBGhTb21lIGJhbGFuY2Ugd2FzIHVubG9ja2VkLhhGcm96ZW4IAQx3aG8AATBUOjpBY2NvdW50SWQAARhhbW91bnQYAShUOjpCYWxhbmNlABMEYFNvbWUgYmFsYW5jZSB3YXMgZnJvemVuLhhUaGF3ZWQIAQx3aG8AATBUOjpBY2NvdW50SWQAARhhbW91bnQYAShUOjpCYWxhbmNlABQEYFNvbWUgYmFsYW5jZSB3YXMgdGhhd2VkLkxUb3RhbElzc3VhbmNlRm9yY2VkCAEMb2xkGAEoVDo6QmFsYW5jZQABDG5ldxgBKFQ6OkJhbGFuY2UAFQSsVGhlIGBUb3RhbElzc3VhbmNlYCB3YXMgZm9yY2VmdWxseSBjaGFuZ2VkLgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldIQUNGZyYW1lX3N1cHBvcnQYdHJhaXRzGHRva2VucxBtaXNjNEJhbGFuY2VTdGF0dXMAAQgQRnJlZQAAACBSZXNlcnZlZAABAACIDGhwYWxsZXRfdHJhbnNhY3Rpb25fcGF5bWVudBhwYWxsZXQURXZlbnQEBFQAAQRIVHJhbnNhY3Rpb25GZWVQYWlkDAEMd2hvAAEwVDo6QWNjb3VudElkAAEoYWN0dWFsX2ZlZRgBMEJhbGFuY2VPZjxUPgABDHRpcBgBMEJhbGFuY2VPZjxUPgAACFkBQSB0cmFuc2FjdGlvbiBmZWUgYGFjdHVhbF9mZWVgLCBvZiB3aGljaCBgdGlwYCB3YXMgYWRkZWQgdG8gdGhlIG1pbmltdW0gaW5jbHVzaW9uIGZlZSxcaGFzIGJlZW4gcGFpZCBieSBgd2hvYC4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXSMEDhwYWxsZXRfc3Rha2luZxhwYWxsZXQYcGFsbGV0FEV2ZW50BARUAAFIHEVyYVBhaWQMASRlcmFfaW5kZXgQASBFcmFJbmRleAABQHZhbGlkYXRvcl9wYXlvdXQYATBCYWxhbmNlT2Y8VD4AASRyZW1haW5kZXIYATBCYWxhbmNlT2Y8VD4AAAhVAVRoZSBlcmEgcGF5b3V0IGhhcyBiZWVuIHNldDsgdGhlIGZpcnN0IGJhbGFuY2UgaXMgdGhlIHZhbGlkYXRvci1wYXlvdXQ7IHRoZSBzZWNvbmQgaXPAdGhlIHJlbWFpbmRlciBmcm9tIHRoZSBtYXhpbXVtIGFtb3VudCBvZiByZXdhcmQuIFJld2FyZGVkDAEUc3Rhc2gAATBUOjpBY2NvdW50SWQAARBkZXN0kAF8UmV3YXJkRGVzdGluYXRpb248VDo6QWNjb3VudElkPgABGGFtb3VudBgBMEJhbGFuY2VPZjxUPgABBA0BVGhlIG5vbWluYXRvciBoYXMgYmVlbiByZXdhcmRlZCBieSB0aGlzIGFtb3VudCB0byB0aGlzIGRlc3RpbmF0aW9uLhxTbGFzaGVkCAEYc3Rha2VyAAEwVDo6QWNjb3VudElkAAEYYW1vdW50GAEwQmFsYW5jZU9mPFQ+AAIEHQFBIHN0YWtlciAodmFsaWRhdG9yIG9yIG5vbWluYXRvcikgaGFzIGJlZW4gc2xhc2hlZCBieSB0aGUgZ2l2ZW4gYW1vdW50LjRTbGFzaFJlcG9ydGVkDAEkdmFsaWRhdG9yAAEwVDo6QWNjb3VudElkAAEgZnJhY3Rpb26UARxQZXJiaWxsAAEkc2xhc2hfZXJhEAEgRXJhSW5kZXgAAwhZAUEgc2xhc2ggZm9yIHRoZSBnaXZlbiB2YWxpZGF0b3IsIGZvciB0aGUgZ2l2ZW4gcGVyY2VudGFnZSBvZiB0aGVpciBzdGFrZSwgYXQgdGhlIGdpdmVuVGVyYSBhcyBiZWVuIHJlcG9ydGVkLmhPbGRTbGFzaGluZ1JlcG9ydERpc2NhcmRlZAQBNHNlc3Npb25faW5kZXgQATBTZXNzaW9uSW5kZXgABAgZAUFuIG9sZCBzbGFzaGluZyByZXBvcnQgZnJvbSBhIHByaW9yIGVyYSB3YXMgZGlzY2FyZGVkIGJlY2F1c2UgaXQgY291bGREbm90IGJlIHByb2Nlc3NlZC44U3Rha2Vyc0VsZWN0ZWQABQSEQSBuZXcgc2V0IG9mIHN0YWtlcnMgd2FzIGVsZWN0ZWQuGEJvbmRlZAgBFHN0YXNoAAEwVDo6QWNjb3VudElkAAEYYW1vdW50GAEwQmFsYW5jZU9mPFQ+AAYQ0EFuIGFjY291bnQgaGFzIGJvbmRlZCB0aGlzIGFtb3VudC4gXFtzdGFzaCwgYW1vdW50XF0ATQFOT1RFOiBUaGlzIGV2ZW50IGlzIG9ubHkgZW1pdHRlZCB3aGVuIGZ1bmRzIGFyZSBib25kZWQgdmlhIGEgZGlzcGF0Y2hhYmxlLiBOb3RhYmx5LCEBaXQgd2lsbCBub3QgYmUgZW1pdHRlZCBmb3Igc3Rha2luZyByZXdhcmRzIHdoZW4gdGhleSBhcmUgYWRkZWQgdG8gc3Rha2UuIFVuYm9uZGVkCAEUc3Rhc2gAATBUOjpBY2NvdW50SWQAARhhbW91bnQYATBCYWxhbmNlT2Y8VD4ABwSQQW4gYWNjb3VudCBoYXMgdW5ib25kZWQgdGhpcyBhbW91bnQuJFdpdGhkcmF3bggBFHN0YXNoAAEwVDo6QWNjb3VudElkAAEYYW1vdW50GAEwQmFsYW5jZU9mPFQ+AAgIWQFBbiBhY2NvdW50IGhhcyBjYWxsZWQgYHdpdGhkcmF3X3VuYm9uZGVkYCBhbmQgcmVtb3ZlZCB1bmJvbmRpbmcgY2h1bmtzIHdvcnRoIGBCYWxhbmNlYGRmcm9tIHRoZSB1bmxvY2tpbmcgcXVldWUuGEtpY2tlZAgBJG5vbWluYXRvcgABMFQ6OkFjY291bnRJZAABFHN0YXNoAAEwVDo6QWNjb3VudElkAAkEtEEgbm9taW5hdG9yIGhhcyBiZWVuIGtpY2tlZCBmcm9tIGEgdmFsaWRhdG9yLlRTdGFraW5nRWxlY3Rpb25GYWlsZWQACgSsVGhlIGVsZWN0aW9uIGZhaWxlZC4gTm8gbmV3IGVyYSBpcyBwbGFubmVkLhxDaGlsbGVkBAEUc3Rhc2gAATBUOjpBY2NvdW50SWQACwQhAUFuIGFjY291bnQgaGFzIHN0b3BwZWQgcGFydGljaXBhdGluZyBhcyBlaXRoZXIgYSB2YWxpZGF0b3Igb3Igbm9taW5hdG9yLjRQYXlvdXRTdGFydGVkCAEkZXJhX2luZGV4EAEgRXJhSW5kZXgAATx2YWxpZGF0b3Jfc3Rhc2gAATBUOjpBY2NvdW50SWQADASYVGhlIHN0YWtlcnMnIHJld2FyZHMgYXJlIGdldHRpbmcgcGFpZC5EVmFsaWRhdG9yUHJlZnNTZXQIARRzdGFzaAABMFQ6OkFjY291bnRJZAABFHByZWZzmAE4VmFsaWRhdG9yUHJlZnMADQSYQSB2YWxpZGF0b3IgaGFzIHNldCB0aGVpciBwcmVmZXJlbmNlcy5oU25hcHNob3RWb3RlcnNTaXplRXhjZWVkZWQEARBzaXplEAEMdTMyAA4EaFZvdGVycyBzaXplIGxpbWl0IHJlYWNoZWQubFNuYXBzaG90VGFyZ2V0c1NpemVFeGNlZWRlZAQBEHNpemUQAQx1MzIADwRsVGFyZ2V0cyBzaXplIGxpbWl0IHJlYWNoZWQuIEZvcmNlRXJhBAEQbW9kZaABHEZvcmNpbmcAEAR0QSBuZXcgZm9yY2UgZXJhIG1vZGUgd2FzIHNldC5kQ29udHJvbGxlckJhdGNoRGVwcmVjYXRlZAQBIGZhaWx1cmVzEAEMdTMyABEEpFJlcG9ydCBvZiBhIGNvbnRyb2xsZXIgYmF0Y2ggZGVwcmVjYXRpb24uBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0kAg4cGFsbGV0X3N0YWtpbmdEUmV3YXJkRGVzdGluYXRpb24EJEFjY291bnRJZAEAARQYU3Rha2VkAAAAFFN0YXNoAAEAKENvbnRyb2xsZXIAAgAcQWNjb3VudAQAAAEkQWNjb3VudElkAAMAEE5vbmUABAAAlAw0c3BfYXJpdGhtZXRpYyhwZXJfdGhpbmdzHFBlcmJpbGwAAAQAEAEMdTMyAACYCDhwYWxsZXRfc3Rha2luZzhWYWxpZGF0b3JQcmVmcwAACAEoY29tbWlzc2lvbpwBHFBlcmJpbGwAARxibG9ja2VkIAEQYm9vbAAAnAAABpQAoAg4cGFsbGV0X3N0YWtpbmccRm9yY2luZwABEChOb3RGb3JjaW5nAAAAIEZvcmNlTmV3AAEAJEZvcmNlTm9uZQACACxGb3JjZUFsd2F5cwADAACkDDxwYWxsZXRfb2ZmZW5jZXMYcGFsbGV0FEV2ZW50AAEEHE9mZmVuY2UIARBraW5kqAEQS2luZAABIHRpbWVzbG90OAE4T3BhcXVlVGltZVNsb3QAAAxRAVRoZXJlIGlzIGFuIG9mZmVuY2UgcmVwb3J0ZWQgb2YgdGhlIGdpdmVuIGBraW5kYCBoYXBwZW5lZCBhdCB0aGUgYHNlc3Npb25faW5kZXhgIGFuZDUBKGtpbmQtc3BlY2lmaWMpIHRpbWUgc2xvdC4gVGhpcyBldmVudCBpcyBub3QgZGVwb3NpdGVkIGZvciBkdXBsaWNhdGUgc2xhc2hlcy5MXFtraW5kLCB0aW1lc2xvdFxdLgQwRXZlbnRzIHR5cGUuqAAAAxAAAAAIAKwMOHBhbGxldF9zZXNzaW9uGHBhbGxldBRFdmVudAABBChOZXdTZXNzaW9uBAE0c2Vzc2lvbl9pbmRleBABMFNlc3Npb25JbmRleAAACDkBTmV3IHNlc3Npb24gaGFzIGhhcHBlbmVkLiBOb3RlIHRoYXQgdGhlIGFyZ3VtZW50IGlzIHRoZSBzZXNzaW9uIGluZGV4LCBub3QgdGhlnGJsb2NrIG51bWJlciBhcyB0aGUgdHlwZSBtaWdodCBzdWdnZXN0LgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldLAMOHBhbGxldF9ncmFuZHBhGHBhbGxldBRFdmVudAABDDhOZXdBdXRob3JpdGllcwQBNGF1dGhvcml0eV9zZXS0ATRBdXRob3JpdHlMaXN0AAAEjE5ldyBhdXRob3JpdHkgc2V0IGhhcyBiZWVuIGFwcGxpZWQuGFBhdXNlZAABBJhDdXJyZW50IGF1dGhvcml0eSBzZXQgaGFzIGJlZW4gcGF1c2VkLhxSZXN1bWVkAAIEnEN1cnJlbnQgYXV0aG9yaXR5IHNldCBoYXMgYmVlbiByZXN1bWVkLgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldLQAAAK4ALgAAAQIvDAAvAxQc3BfY29uc2Vuc3VzX2dyYW5kcGEMYXBwGFB1YmxpYwAABAAEATxlZDI1NTE5OjpQdWJsaWMAAMAMPHBhbGxldF90cmVhc3VyeRhwYWxsZXQURXZlbnQIBFQABEkAATAgU3BlbmRpbmcEAUBidWRnZXRfcmVtYWluaW5nGAE8QmFsYW5jZU9mPFQsIEk+AAAE5FdlIGhhdmUgZW5kZWQgYSBzcGVuZCBwZXJpb2QgYW5kIHdpbGwgbm93IGFsbG9jYXRlIGZ1bmRzLhxBd2FyZGVkDAE4cHJvcG9zYWxfaW5kZXgQATRQcm9wb3NhbEluZGV4AAEUYXdhcmQYATxCYWxhbmNlT2Y8VCwgST4AARxhY2NvdW50AAEwVDo6QWNjb3VudElkAAEEfFNvbWUgZnVuZHMgaGF2ZSBiZWVuIGFsbG9jYXRlZC4UQnVybnQEASxidXJudF9mdW5kcxgBPEJhbGFuY2VPZjxULCBJPgACBIhTb21lIG9mIG91ciBmdW5kcyBoYXZlIGJlZW4gYnVybnQuIFJvbGxvdmVyBAFAcm9sbG92ZXJfYmFsYW5jZRgBPEJhbGFuY2VPZjxULCBJPgADBC0BU3BlbmRpbmcgaGFzIGZpbmlzaGVkOyB0aGlzIGlzIHRoZSBhbW91bnQgdGhhdCByb2xscyBvdmVyIHVudGlsIG5leHQgc3BlbmQuHERlcG9zaXQEARR2YWx1ZRgBPEJhbGFuY2VPZjxULCBJPgAEBHxTb21lIGZ1bmRzIGhhdmUgYmVlbiBkZXBvc2l0ZWQuNFNwZW5kQXBwcm92ZWQMAThwcm9wb3NhbF9pbmRleBABNFByb3Bvc2FsSW5kZXgAARhhbW91bnQYATxCYWxhbmNlT2Y8VCwgST4AASxiZW5lZmljaWFyeQABMFQ6OkFjY291bnRJZAAFBJxBIG5ldyBzcGVuZCBwcm9wb3NhbCBoYXMgYmVlbiBhcHByb3ZlZC48VXBkYXRlZEluYWN0aXZlCAEscmVhY3RpdmF0ZWQYATxCYWxhbmNlT2Y8VCwgST4AASxkZWFjdGl2YXRlZBgBPEJhbGFuY2VPZjxULCBJPgAGBMxUaGUgaW5hY3RpdmUgZnVuZHMgb2YgdGhlIHBhbGxldCBoYXZlIGJlZW4gdXBkYXRlZC5IQXNzZXRTcGVuZEFwcHJvdmVkGAEUaW5kZXgQAShTcGVuZEluZGV4AAEoYXNzZXRfa2luZMQBMFQ6OkFzc2V0S2luZAABGGFtb3VudBgBUEFzc2V0QmFsYW5jZU9mPFQsIEk+AAEsYmVuZWZpY2lhcnktAQE4VDo6QmVuZWZpY2lhcnkAASh2YWxpZF9mcm9tEAFEQmxvY2tOdW1iZXJGb3I8VD4AASRleHBpcmVfYXQQAURCbG9ja051bWJlckZvcjxUPgAHBLRBIG5ldyBhc3NldCBzcGVuZCBwcm9wb3NhbCBoYXMgYmVlbiBhcHByb3ZlZC5AQXNzZXRTcGVuZFZvaWRlZAQBFGluZGV4EAEoU3BlbmRJbmRleAAIBHRBbiBhcHByb3ZlZCBzcGVuZCB3YXMgdm9pZGVkLhBQYWlkCAEUaW5kZXgQAShTcGVuZEluZGV4AAEocGF5bWVudF9pZDABZDxUOjpQYXltYXN0ZXIgYXMgUGF5Pjo6SWQACQRMQSBwYXltZW50IGhhcHBlbmVkLjRQYXltZW50RmFpbGVkCAEUaW5kZXgQAShTcGVuZEluZGV4AAEocGF5bWVudF9pZDABZDxUOjpQYXltYXN0ZXIgYXMgUGF5Pjo6SWQACgSQQSBwYXltZW50IGZhaWxlZCBhbmQgY2FuIGJlIHJldHJpZWQuOFNwZW5kUHJvY2Vzc2VkBAEUaW5kZXgQAShTcGVuZEluZGV4AAsITQFBIHNwZW5kIHdhcyBwcm9jZXNzZWQgYW5kIHJlbW92ZWQgZnJvbSB0aGUgc3RvcmFnZS4gSXQgbWlnaHQgaGF2ZSBiZWVuIHN1Y2Nlc3NmdWxseXBwYWlkIG9yIGl0IG1heSBoYXZlIGV4cGlyZWQuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0xAxccG9sa2Fkb3RfcnVudGltZV9jb21tb24UaW1wbHNcVmVyc2lvbmVkTG9jYXRhYmxlQXNzZXQAAQgIVjMIASBsb2NhdGlvbsgBRHhjbTo6djM6OkxvY2F0aW9uAAEgYXNzZXRfaWTwAUB4Y206OnYzOjpBc3NldElkAAMACFY0CAEgbG9jYXRpb270AUR4Y206OnY0OjpMb2NhdGlvbgABIGFzc2V0X2lkKQEBQHhjbTo6djQ6OkFzc2V0SWQABAAAyBAsc3RhZ2luZ194Y20IdjM0bXVsdGlsb2NhdGlvbjRNdWx0aUxvY2F0aW9uAAAIARxwYXJlbnRzCAEIdTgAASBpbnRlcmlvcswBJEp1bmN0aW9ucwAAzBAMeGNtCHYzJGp1bmN0aW9ucyRKdW5jdGlvbnMAASQQSGVyZQAAAAhYMQQA0AEgSnVuY3Rpb24AAQAIWDIIANABIEp1bmN0aW9uAADQASBKdW5jdGlvbgACAAhYMwwA0AEgSnVuY3Rpb24AANABIEp1bmN0aW9uAADQASBKdW5jdGlvbgADAAhYNBAA0AEgSnVuY3Rpb24AANABIEp1bmN0aW9uAADQASBKdW5jdGlvbgAA0AEgSnVuY3Rpb24ABAAIWDUUANABIEp1bmN0aW9uAADQASBKdW5jdGlvbgAA0AEgSnVuY3Rpb24AANABIEp1bmN0aW9uAADQASBKdW5jdGlvbgAFAAhYNhgA0AEgSnVuY3Rpb24AANABIEp1bmN0aW9uAADQASBKdW5jdGlvbgAA0AEgSnVuY3Rpb24AANABIEp1bmN0aW9uAADQASBKdW5jdGlvbgAGAAhYNxwA0AEgSnVuY3Rpb24AANABIEp1bmN0aW9uAADQASBKdW5jdGlvbgAA0AEgSnVuY3Rpb24AANABIEp1bmN0aW9uAADQASBKdW5jdGlvbgAA0AEgSnVuY3Rpb24ABwAIWDggANABIEp1bmN0aW9uAADQASBKdW5jdGlvbgAA0AEgSnVuY3Rpb24AANABIEp1bmN0aW9uAADQASBKdW5jdGlvbgAA0AEgSnVuY3Rpb24AANABIEp1bmN0aW9uAADQASBKdW5jdGlvbgAIAADQEAx4Y20IdjMganVuY3Rpb24gSnVuY3Rpb24AASgkUGFyYWNoYWluBADUAQx1MzIAAAAsQWNjb3VudElkMzIIARxuZXR3b3Jr2AFET3B0aW9uPE5ldHdvcmtJZD4AAQhpZAQBIFt1ODsgMzJdAAEAOEFjY291bnRJbmRleDY0CAEcbmV0d29ya9gBRE9wdGlvbjxOZXR3b3JrSWQ+AAEUaW5kZXgsAQx1NjQAAgAwQWNjb3VudEtleTIwCAEcbmV0d29ya9gBRE9wdGlvbjxOZXR3b3JrSWQ+AAEMa2V54AEgW3U4OyAyMF0AAwA4UGFsbGV0SW5zdGFuY2UEAAgBCHU4AAQAMEdlbmVyYWxJbmRleAQA5AEQdTEyOAAFAChHZW5lcmFsS2V5CAEYbGVuZ3RoCAEIdTgAARBkYXRhBAEgW3U4OyAzMl0ABgAkT25seUNoaWxkAAcAJFBsdXJhbGl0eQgBCGlk6AEYQm9keUlkAAEQcGFydOwBIEJvZHlQYXJ0AAgAPEdsb2JhbENvbnNlbnN1cwQA3AEkTmV0d29ya0lkAAkAANQAAAYQANgEGE9wdGlvbgQEVAHcAQgQTm9uZQAAABBTb21lBADcAAABAADcEAx4Y20IdjMganVuY3Rpb24kTmV0d29ya0lkAAEsJEJ5R2VuZXNpcwQABAEgW3U4OyAzMl0AAAAYQnlGb3JrCAEwYmxvY2tfbnVtYmVyMAEMdTY0AAEoYmxvY2tfaGFzaAQBIFt1ODsgMzJdAAEAIFBvbGthZG90AAIAGEt1c2FtYQADABxXZXN0ZW5kAAQAGFJvY29jbwAFABhXb2NvY28ABgAgRXRoZXJldW0EASBjaGFpbl9pZCwBDHU2NAAHACxCaXRjb2luQ29yZQAIACxCaXRjb2luQ2FzaAAJAEBQb2xrYWRvdEJ1bGxldGluAAoAAOAAAAMUAAAACADkAAAGGADoEAx4Y20IdjMganVuY3Rpb24YQm9keUlkAAEoEFVuaXQAAAAcTW9uaWtlcgQASAEcW3U4OyA0XQABABRJbmRleAQA1AEMdTMyAAIAJEV4ZWN1dGl2ZQADACRUZWNobmljYWwABAAsTGVnaXNsYXRpdmUABQAgSnVkaWNpYWwABgAcRGVmZW5zZQAHADhBZG1pbmlzdHJhdGlvbgAIACBUcmVhc3VyeQAJAADsEAx4Y20IdjMganVuY3Rpb24gQm9keVBhcnQAARQUVm9pY2UAAAAcTWVtYmVycwQBFGNvdW501AEMdTMyAAEAIEZyYWN0aW9uCAEMbm9t1AEMdTMyAAEUZGVub23UAQx1MzIAAgBEQXRMZWFzdFByb3BvcnRpb24IAQxub23UAQx1MzIAARRkZW5vbdQBDHUzMgADAEhNb3JlVGhhblByb3BvcnRpb24IAQxub23UAQx1MzIAARRkZW5vbdQBDHUzMgAEAADwEAx4Y20IdjMobXVsdGlhc3NldBxBc3NldElkAAEIIENvbmNyZXRlBADIATRNdWx0aUxvY2F0aW9uAAAAIEFic3RyYWN0BAAEASBbdTg7IDMyXQABAAD0ECxzdGFnaW5nX3hjbQh2NCBsb2NhdGlvbiBMb2NhdGlvbgAACAEccGFyZW50cwgBCHU4AAEgaW50ZXJpb3L4ASRKdW5jdGlvbnMAAPgQLHN0YWdpbmdfeGNtCHY0JGp1bmN0aW9ucyRKdW5jdGlvbnMAASQQSGVyZQAAAAhYMQQA/AFIQXJjPFtKdW5jdGlvbjsgMV0+AAEACFgyBAANAQFIQXJjPFtKdW5jdGlvbjsgMl0+AAIACFgzBAARAQFIQXJjPFtKdW5jdGlvbjsgM10+AAMACFg0BAAVAQFIQXJjPFtKdW5jdGlvbjsgNF0+AAQACFg1BAAZAQFIQXJjPFtKdW5jdGlvbjsgNV0+AAUACFg2BAAdAQFIQXJjPFtKdW5jdGlvbjsgNl0+AAYACFg3BAAhAQFIQXJjPFtKdW5jdGlvbjsgN10+AAcACFg4BAAlAQFIQXJjPFtKdW5jdGlvbjsgOF0+AAgAAPwAAAMBAAAAAQEAAQEQLHN0YWdpbmdfeGNtCHY0IGp1bmN0aW9uIEp1bmN0aW9uAAEoJFBhcmFjaGFpbgQA1AEMdTMyAAAALEFjY291bnRJZDMyCAEcbmV0d29yawUBAURPcHRpb248TmV0d29ya0lkPgABCGlkBAEgW3U4OyAzMl0AAQA4QWNjb3VudEluZGV4NjQIARxuZXR3b3JrBQEBRE9wdGlvbjxOZXR3b3JrSWQ+AAEUaW5kZXgsAQx1NjQAAgAwQWNjb3VudEtleTIwCAEcbmV0d29yawUBAURPcHRpb248TmV0d29ya0lkPgABDGtleeABIFt1ODsgMjBdAAMAOFBhbGxldEluc3RhbmNlBAAIAQh1OAAEADBHZW5lcmFsSW5kZXgEAOQBEHUxMjgABQAoR2VuZXJhbEtleQgBGGxlbmd0aAgBCHU4AAEQZGF0YQQBIFt1ODsgMzJdAAYAJE9ubHlDaGlsZAAHACRQbHVyYWxpdHkIAQhpZOgBGEJvZHlJZAABEHBhcnTsASBCb2R5UGFydAAIADxHbG9iYWxDb25zZW5zdXMEAAkBASROZXR3b3JrSWQACQAABQEEGE9wdGlvbgQEVAEJAQEIEE5vbmUAAAAQU29tZQQACQEAAAEAAAkBECxzdGFnaW5nX3hjbQh2NCBqdW5jdGlvbiROZXR3b3JrSWQAASwkQnlHZW5lc2lzBAAEASBbdTg7IDMyXQAAABhCeUZvcmsIATBibG9ja19udW1iZXIwAQx1NjQAAShibG9ja19oYXNoBAEgW3U4OyAzMl0AAQAgUG9sa2Fkb3QAAgAYS3VzYW1hAAMAHFdlc3RlbmQABAAYUm9jb2NvAAUAGFdvY29jbwAGACBFdGhlcmV1bQQBIGNoYWluX2lkLAEMdTY0AAcALEJpdGNvaW5Db3JlAAgALEJpdGNvaW5DYXNoAAkAQFBvbGthZG90QnVsbGV0aW4ACgAADQEAAAMCAAAAAQEAEQEAAAMDAAAAAQEAFQEAAAMEAAAAAQEAGQEAAAMFAAAAAQEAHQEAAAMGAAAAAQEAIQEAAAMHAAAAAQEAJQEAAAMIAAAAAQEAKQEQLHN0YWdpbmdfeGNtCHY0FGFzc2V0HEFzc2V0SWQAAAQA9AEgTG9jYXRpb24AAC0BCAx4Y21EVmVyc2lvbmVkTG9jYXRpb24AAQwIVjIEADEBAUR2Mjo6TXVsdGlMb2NhdGlvbgABAAhWMwQAyAFEdjM6Ok11bHRpTG9jYXRpb24AAwAIVjQEAPQBMHY0OjpMb2NhdGlvbgAEAAAxARAMeGNtCHYyNG11bHRpbG9jYXRpb240TXVsdGlMb2NhdGlvbgAACAEccGFyZW50cwgBCHU4AAEgaW50ZXJpb3I1AQEkSnVuY3Rpb25zAAA1ARAMeGNtCHYyNG11bHRpbG9jYXRpb24kSnVuY3Rpb25zAAEkEEhlcmUAAAAIWDEEADkBASBKdW5jdGlvbgABAAhYMggAOQEBIEp1bmN0aW9uAAA5AQEgSnVuY3Rpb24AAgAIWDMMADkBASBKdW5jdGlvbgAAOQEBIEp1bmN0aW9uAAA5AQEgSnVuY3Rpb24AAwAIWDQQADkBASBKdW5jdGlvbgAAOQEBIEp1bmN0aW9uAAA5AQEgSnVuY3Rpb24AADkBASBKdW5jdGlvbgAEAAhYNRQAOQEBIEp1bmN0aW9uAAA5AQEgSnVuY3Rpb24AADkBASBKdW5jdGlvbgAAOQEBIEp1bmN0aW9uAAA5AQEgSnVuY3Rpb24ABQAIWDYYADkBASBKdW5jdGlvbgAAOQEBIEp1bmN0aW9uAAA5AQEgSnVuY3Rpb24AADkBASBKdW5jdGlvbgAAOQEBIEp1bmN0aW9uAAA5AQEgSnVuY3Rpb24ABgAIWDccADkBASBKdW5jdGlvbgAAOQEBIEp1bmN0aW9uAAA5AQEgSnVuY3Rpb24AADkBASBKdW5jdGlvbgAAOQEBIEp1bmN0aW9uAAA5AQEgSnVuY3Rpb24AADkBASBKdW5jdGlvbgAHAAhYOCAAOQEBIEp1bmN0aW9uAAA5AQEgSnVuY3Rpb24AADkBASBKdW5jdGlvbgAAOQEBIEp1bmN0aW9uAAA5AQEgSnVuY3Rpb24AADkBASBKdW5jdGlvbgAAOQEBIEp1bmN0aW9uAAA5AQEgSnVuY3Rpb24ACAAAOQEQDHhjbQh2MiBqdW5jdGlvbiBKdW5jdGlvbgABJCRQYXJhY2hhaW4EANQBDHUzMgAAACxBY2NvdW50SWQzMggBHG5ldHdvcms9AQEkTmV0d29ya0lkAAEIaWQEASBbdTg7IDMyXQABADhBY2NvdW50SW5kZXg2NAgBHG5ldHdvcms9AQEkTmV0d29ya0lkAAEUaW5kZXgsAQx1NjQAAgAwQWNjb3VudEtleTIwCAEcbmV0d29yaz0BASROZXR3b3JrSWQAAQxrZXngASBbdTg7IDIwXQADADhQYWxsZXRJbnN0YW5jZQQACAEIdTgABAAwR2VuZXJhbEluZGV4BADkARB1MTI4AAUAKEdlbmVyYWxLZXkEAEEBAYBXZWFrQm91bmRlZFZlYzx1OCwgQ29uc3RVMzI8MzI+PgAGACRPbmx5Q2hpbGQABwAkUGx1cmFsaXR5CAEIaWRFAQEYQm9keUlkAAEQcGFydEkBASBCb2R5UGFydAAIAAA9AQwMeGNtCHYyJE5ldHdvcmtJZAABEAxBbnkAAAAUTmFtZWQEAEEBAYBXZWFrQm91bmRlZFZlYzx1OCwgQ29uc3RVMzI8MzI+PgABACBQb2xrYWRvdAACABhLdXNhbWEAAwAAQQEMTGJvdW5kZWRfY29sbGVjdGlvbnNAd2Vha19ib3VuZGVkX3ZlYzhXZWFrQm91bmRlZFZlYwgEVAEIBFMAAAQAOAEYVmVjPFQ+AABFAQwMeGNtCHYyGEJvZHlJZAABKBBVbml0AAAAFE5hbWVkBABBAQGAV2Vha0JvdW5kZWRWZWM8dTgsIENvbnN0VTMyPDMyPj4AAQAUSW5kZXgEANQBDHUzMgACACRFeGVjdXRpdmUAAwAkVGVjaG5pY2FsAAQALExlZ2lzbGF0aXZlAAUAIEp1ZGljaWFsAAYAHERlZmVuc2UABwA4QWRtaW5pc3RyYXRpb24ACAAgVHJlYXN1cnkACQAASQEMDHhjbQh2MiBCb2R5UGFydAABFBRWb2ljZQAAABxNZW1iZXJzBAEUY291bnTUAQx1MzIAAQAgRnJhY3Rpb24IAQxub23UAQx1MzIAARRkZW5vbdQBDHUzMgACAERBdExlYXN0UHJvcG9ydGlvbggBDG5vbdQBDHUzMgABFGRlbm9t1AEMdTMyAAMASE1vcmVUaGFuUHJvcG9ydGlvbggBDG5vbdQBDHUzMgABFGRlbm9t1AEMdTMyAAQAAE0BDGBwYWxsZXRfY29udmljdGlvbl92b3RpbmcYcGFsbGV0FEV2ZW50CARUAARJAAEIJERlbGVnYXRlZAgAAAEwVDo6QWNjb3VudElkAAAAATBUOjpBY2NvdW50SWQAAAQdAUFuIGFjY291bnQgaGFzIGRlbGVnYXRlZCB0aGVpciB2b3RlIHRvIGFub3RoZXIgYWNjb3VudC4gXFt3aG8sIHRhcmdldFxdLFVuZGVsZWdhdGVkBAAAATBUOjpBY2NvdW50SWQAAQT0QW4gXFthY2NvdW50XF0gaGFzIGNhbmNlbGxlZCBhIHByZXZpb3VzIGRlbGVnYXRpb24gb3BlcmF0aW9uLgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldFEBDEBwYWxsZXRfcmVmZXJlbmRhGHBhbGxldBRFdmVudAgEVAAESQABQCRTdWJtaXR0ZWQMARRpbmRleBABPFJlZmVyZW5kdW1JbmRleARgSW5kZXggb2YgdGhlIHJlZmVyZW5kdW0uARR0cmFja1UBATxUcmFja0lkT2Y8VCwgST4EJQFUaGUgdHJhY2sgKGFuZCBieSBleHRlbnNpb24gcHJvcG9zYWwgZGlzcGF0Y2ggb3JpZ2luKSBvZiB0aGlzIHJlZmVyZW5kdW0uASBwcm9wb3NhbFkBAUxCb3VuZGVkQ2FsbE9mPFQsIEk+BIBUaGUgcHJvcG9zYWwgZm9yIHRoZSByZWZlcmVuZHVtLgAEgEEgcmVmZXJlbmR1bSBoYXMgYmVlbiBzdWJtaXR0ZWQuVERlY2lzaW9uRGVwb3NpdFBsYWNlZAwBFGluZGV4EAE8UmVmZXJlbmR1bUluZGV4BGBJbmRleCBvZiB0aGUgcmVmZXJlbmR1bS4BDHdobwABMFQ6OkFjY291bnRJZASMVGhlIGFjY291bnQgd2hvIHBsYWNlZCB0aGUgZGVwb3NpdC4BGGFtb3VudBgBPEJhbGFuY2VPZjxULCBJPgSEVGhlIGFtb3VudCBwbGFjZWQgYnkgdGhlIGFjY291bnQuAQSUVGhlIGRlY2lzaW9uIGRlcG9zaXQgaGFzIGJlZW4gcGxhY2VkLlxEZWNpc2lvbkRlcG9zaXRSZWZ1bmRlZAwBFGluZGV4EAE8UmVmZXJlbmR1bUluZGV4BGBJbmRleCBvZiB0aGUgcmVmZXJlbmR1bS4BDHdobwABMFQ6OkFjY291bnRJZASMVGhlIGFjY291bnQgd2hvIHBsYWNlZCB0aGUgZGVwb3NpdC4BGGFtb3VudBgBPEJhbGFuY2VPZjxULCBJPgSEVGhlIGFtb3VudCBwbGFjZWQgYnkgdGhlIGFjY291bnQuAgScVGhlIGRlY2lzaW9uIGRlcG9zaXQgaGFzIGJlZW4gcmVmdW5kZWQuOERlcG9zaXRTbGFzaGVkCAEMd2hvAAEwVDo6QWNjb3VudElkBIxUaGUgYWNjb3VudCB3aG8gcGxhY2VkIHRoZSBkZXBvc2l0LgEYYW1vdW50GAE8QmFsYW5jZU9mPFQsIEk+BIRUaGUgYW1vdW50IHBsYWNlZCBieSB0aGUgYWNjb3VudC4DBGxBIGRlcG9zaXQgaGFzIGJlZW4gc2xhc2hlZC48RGVjaXNpb25TdGFydGVkEAEUaW5kZXgQATxSZWZlcmVuZHVtSW5kZXgEYEluZGV4IG9mIHRoZSByZWZlcmVuZHVtLgEUdHJhY2tVAQE8VHJhY2tJZE9mPFQsIEk+BCUBVGhlIHRyYWNrIChhbmQgYnkgZXh0ZW5zaW9uIHByb3Bvc2FsIGRpc3BhdGNoIG9yaWdpbikgb2YgdGhpcyByZWZlcmVuZHVtLgEgcHJvcG9zYWxZAQFMQm91bmRlZENhbGxPZjxULCBJPgSAVGhlIHByb3Bvc2FsIGZvciB0aGUgcmVmZXJlbmR1bS4BFHRhbGx5UQcBIFQ6OlRhbGx5BLhUaGUgY3VycmVudCB0YWxseSBvZiB2b3RlcyBpbiB0aGlzIHJlZmVyZW5kdW0uBAS8QSByZWZlcmVuZHVtIGhhcyBtb3ZlZCBpbnRvIHRoZSBkZWNpZGluZyBwaGFzZS44Q29uZmlybVN0YXJ0ZWQEARRpbmRleBABPFJlZmVyZW5kdW1JbmRleARgSW5kZXggb2YgdGhlIHJlZmVyZW5kdW0uBQA4Q29uZmlybUFib3J0ZWQEARRpbmRleBABPFJlZmVyZW5kdW1JbmRleARgSW5kZXggb2YgdGhlIHJlZmVyZW5kdW0uBgAkQ29uZmlybWVkCAEUaW5kZXgQATxSZWZlcmVuZHVtSW5kZXgEYEluZGV4IG9mIHRoZSByZWZlcmVuZHVtLgEUdGFsbHlRBwEgVDo6VGFsbHkEsFRoZSBmaW5hbCB0YWxseSBvZiB2b3RlcyBpbiB0aGlzIHJlZmVyZW5kdW0uBwQhAUEgcmVmZXJlbmR1bSBoYXMgZW5kZWQgaXRzIGNvbmZpcm1hdGlvbiBwaGFzZSBhbmQgaXMgcmVhZHkgZm9yIGFwcHJvdmFsLiBBcHByb3ZlZAQBFGluZGV4EAE8UmVmZXJlbmR1bUluZGV4BGBJbmRleCBvZiB0aGUgcmVmZXJlbmR1bS4IBA0BQSByZWZlcmVuZHVtIGhhcyBiZWVuIGFwcHJvdmVkIGFuZCBpdHMgcHJvcG9zYWwgaGFzIGJlZW4gc2NoZWR1bGVkLiBSZWplY3RlZAgBFGluZGV4EAE8UmVmZXJlbmR1bUluZGV4BGBJbmRleCBvZiB0aGUgcmVmZXJlbmR1bS4BFHRhbGx5UQcBIFQ6OlRhbGx5BLBUaGUgZmluYWwgdGFsbHkgb2Ygdm90ZXMgaW4gdGhpcyByZWZlcmVuZHVtLgkErEEgcHJvcG9zYWwgaGFzIGJlZW4gcmVqZWN0ZWQgYnkgcmVmZXJlbmR1bS4gVGltZWRPdXQIARRpbmRleBABPFJlZmVyZW5kdW1JbmRleARgSW5kZXggb2YgdGhlIHJlZmVyZW5kdW0uARR0YWxseVEHASBUOjpUYWxseQSwVGhlIGZpbmFsIHRhbGx5IG9mIHZvdGVzIGluIHRoaXMgcmVmZXJlbmR1bS4KBNhBIHJlZmVyZW5kdW0gaGFzIGJlZW4gdGltZWQgb3V0IHdpdGhvdXQgYmVpbmcgZGVjaWRlZC4kQ2FuY2VsbGVkCAEUaW5kZXgQATxSZWZlcmVuZHVtSW5kZXgEYEluZGV4IG9mIHRoZSByZWZlcmVuZHVtLgEUdGFsbHlRBwEgVDo6VGFsbHkEsFRoZSBmaW5hbCB0YWxseSBvZiB2b3RlcyBpbiB0aGlzIHJlZmVyZW5kdW0uCwSAQSByZWZlcmVuZHVtIGhhcyBiZWVuIGNhbmNlbGxlZC4YS2lsbGVkCAEUaW5kZXgQATxSZWZlcmVuZHVtSW5kZXgEYEluZGV4IG9mIHRoZSByZWZlcmVuZHVtLgEUdGFsbHlRBwEgVDo6VGFsbHkEsFRoZSBmaW5hbCB0YWxseSBvZiB2b3RlcyBpbiB0aGlzIHJlZmVyZW5kdW0uDAR0QSByZWZlcmVuZHVtIGhhcyBiZWVuIGtpbGxlZC5kU3VibWlzc2lvbkRlcG9zaXRSZWZ1bmRlZAwBFGluZGV4EAE8UmVmZXJlbmR1bUluZGV4BGBJbmRleCBvZiB0aGUgcmVmZXJlbmR1bS4BDHdobwABMFQ6OkFjY291bnRJZASMVGhlIGFjY291bnQgd2hvIHBsYWNlZCB0aGUgZGVwb3NpdC4BGGFtb3VudBgBPEJhbGFuY2VPZjxULCBJPgSEVGhlIGFtb3VudCBwbGFjZWQgYnkgdGhlIGFjY291bnQuDQSkVGhlIHN1Ym1pc3Npb24gZGVwb3NpdCBoYXMgYmVlbiByZWZ1bmRlZC4sTWV0YWRhdGFTZXQIARRpbmRleBABPFJlZmVyZW5kdW1JbmRleARgSW5kZXggb2YgdGhlIHJlZmVyZW5kdW0uARBoYXNoNAEcVDo6SGFzaAQ4UHJlaW1hZ2UgaGFzaC4OBJxNZXRhZGF0YSBmb3IgYSByZWZlcmVuZHVtIGhhcyBiZWVuIHNldC48TWV0YWRhdGFDbGVhcmVkCAEUaW5kZXgQATxSZWZlcmVuZHVtSW5kZXgEYEluZGV4IG9mIHRoZSByZWZlcmVuZHVtLgEQaGFzaDQBHFQ6Okhhc2gEOFByZWltYWdlIGhhc2guDwSsTWV0YWRhdGEgZm9yIGEgcmVmZXJlbmR1bSBoYXMgYmVlbiBjbGVhcmVkLgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldFUBAAAFBABZARA0ZnJhbWVfc3VwcG9ydBh0cmFpdHMkcHJlaW1hZ2VzHEJvdW5kZWQIBFQBXQEESAFJBwEMGExlZ2FjeQQBEGhhc2g0ASRIOjpPdXRwdXQAAAAYSW5saW5lBABNBwE0Qm91bmRlZElubGluZQABABhMb29rdXAIARBoYXNoNAEkSDo6T3V0cHV0AAEMbGVuEAEMdTMyAAIAAF0BCFhzdGFnaW5nX2t1c2FtYV9ydW50aW1lLFJ1bnRpbWVDYWxsAAHMGFN5c3RlbQQAYQEBrQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8U3lzdGVtLCBSdW50aW1lPgAAABBCYWJlBABxAQGlAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxCYWJlLCBSdW50aW1lPgABACRUaW1lc3RhbXAEAJUBAbkBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPFRpbWVzdGFtcCwgUnVudGltZT4AAgAcSW5kaWNlcwQAmQEBsQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8SW5kaWNlcywgUnVudGltZT4AAwAgQmFsYW5jZXMEAKkBAbUBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPEJhbGFuY2VzLCBSdW50aW1lPgAEABxTdGFraW5nBAC1AQGxAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxTdGFraW5nLCBSdW50aW1lPgAGABxTZXNzaW9uBADxAQGxAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxTZXNzaW9uLCBSdW50aW1lPgAIABxHcmFuZHBhBAANAgGxAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxHcmFuZHBhLCBSdW50aW1lPgAKACBUcmVhc3VyeQQAOQIBtQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8VHJlYXN1cnksIFJ1bnRpbWU+ABIAQENvbnZpY3Rpb25Wb3RpbmcEAEECAdUBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPENvbnZpY3Rpb25Wb3RpbmcsIFJ1bnRpbWU+ABQAJFJlZmVyZW5kYQQAVQIBuQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8UmVmZXJlbmRhLCBSdW50aW1lPgAVAFBGZWxsb3dzaGlwQ29sbGVjdGl2ZQQAfQIB5QFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8RmVsbG93c2hpcENvbGxlY3RpdmUsIFJ1bnRpbWU+ABYATEZlbGxvd3NoaXBSZWZlcmVuZGEEAIECAeEBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPEZlbGxvd3NoaXBSZWZlcmVuZGEsIFJ1bnRpbWU+ABcAJFdoaXRlbGlzdAQAhQIBuQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8V2hpdGVsaXN0LCBSdW50aW1lPgAsAChQYXJhbWV0ZXJzBACJAgG9AXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxQYXJhbWV0ZXJzLCBSdW50aW1lPgAuABhDbGFpbXMEALUCAa0Bc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPENsYWltcywgUnVudGltZT4AEwAcVXRpbGl0eQQA1QIBsQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8VXRpbGl0eSwgUnVudGltZT4AGAAcU29jaWV0eQQA3QIBsQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8U29jaWV0eSwgUnVudGltZT4AGgAgUmVjb3ZlcnkEAOECAbUBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPFJlY292ZXJ5LCBSdW50aW1lPgAbABxWZXN0aW5nBADlAgGxAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxWZXN0aW5nLCBSdW50aW1lPgAcACRTY2hlZHVsZXIEAO0CAbkBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPFNjaGVkdWxlciwgUnVudGltZT4AHQAUUHJveHkEAPkCAakBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPFByb3h5LCBSdW50aW1lPgAeACBNdWx0aXNpZwQABQMBtQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8TXVsdGlzaWcsIFJ1bnRpbWU+AB8AIFByZWltYWdlBAARAwG1AXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxQcmVpbWFnZSwgUnVudGltZT4AIAAgQm91bnRpZXMEABkDAbUBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPEJvdW50aWVzLCBSdW50aW1lPgAjADRDaGlsZEJvdW50aWVzBAAdAwHJAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxDaGlsZEJvdW50aWVzLCBSdW50aW1lPgAoAGhFbGVjdGlvblByb3ZpZGVyTXVsdGlQaGFzZQQAIQMB/QFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8RWxlY3Rpb25Qcm92aWRlck11bHRpUGhhc2UsIFJ1bnRpbWU+ACUADE5pcwQAdQQBoQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8TmlzLCBSdW50aW1lPgAmAFhOaXNDb3VudGVycGFydEJhbGFuY2VzBAB5BAHtAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxOaXNDb3VudGVycGFydEJhbGFuY2VzLCBSdW50aW1lPgAtACRWb3Rlckxpc3QEAH0EAbkBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPFZvdGVyTGlzdCwgUnVudGltZT4AJwA8Tm9taW5hdGlvblBvb2xzBACBBAHRAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxOb21pbmF0aW9uUG9vbHMsIFJ1bnRpbWU+ACkALEZhc3RVbnN0YWtlBAC1BAHBAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxGYXN0VW5zdGFrZSwgUnVudGltZT4AKgA0Q29uZmlndXJhdGlvbgQAuQQByQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8Q29uZmlndXJhdGlvbiwgUnVudGltZT4AMwAsUGFyYXNTaGFyZWQEAN0EAcEBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPFBhcmFzU2hhcmVkLCBSdW50aW1lPgA0ADRQYXJhSW5jbHVzaW9uBADhBAHJAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxQYXJhSW5jbHVzaW9uLCBSdW50aW1lPgA1ADBQYXJhSW5oZXJlbnQEAOUEAcUBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPFBhcmFJbmhlcmVudCwgUnVudGltZT4ANgAUUGFyYXMEAHEFAakBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPFBhcmFzLCBSdW50aW1lPgA4ACxJbml0aWFsaXplcgQAeQUBwQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8SW5pdGlhbGl6ZXIsIFJ1bnRpbWU+ADkAEEhybXAEAH0FAaUBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPEhybXAsIFJ1bnRpbWU+ADwANFBhcmFzRGlzcHV0ZXMEAIUFAckBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPFBhcmFzRGlzcHV0ZXMsIFJ1bnRpbWU+AD4ANFBhcmFzU2xhc2hpbmcEAIkFAckBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPFBhcmFzU2xhc2hpbmcsIFJ1bnRpbWU+AD8AaE9uRGVtYW5kQXNzaWdubWVudFByb3ZpZGVyBACZBQH9AXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxPbkRlbWFuZEFzc2lnbm1lbnRQcm92aWRlciwgUnVudGltZT4AQAAkUmVnaXN0cmFyBACdBQG5AXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxSZWdpc3RyYXIsIFJ1bnRpbWU+AEYAFFNsb3RzBAChBQGpAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxTbG90cywgUnVudGltZT4ARwAgQXVjdGlvbnMEAKUFAbUBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPEF1Y3Rpb25zLCBSdW50aW1lPgBIACRDcm93ZGxvYW4EAK0FAbkBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPENyb3dkbG9hbiwgUnVudGltZT4ASQAgQ29yZXRpbWUEAMEFAbUBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPENvcmV0aW1lLCBSdW50aW1lPgBKACRYY21QYWxsZXQEANUFAbkBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPFhjbVBhbGxldCwgUnVudGltZT4AYwAwTWVzc2FnZVF1ZXVlBAARBwHFAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxNZXNzYWdlUXVldWUsIFJ1bnRpbWU+AGQAJEFzc2V0UmF0ZQQAHQcBuQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8QXNzZXRSYXRlLCBSdW50aW1lPgBlABRCZWVmeQQAJQcBqQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8QmVlZnksIFJ1bnRpbWU+AMgAAGEBDDBmcmFtZV9zeXN0ZW0YcGFsbGV0EENhbGwEBFQAASwYcmVtYXJrBAEYcmVtYXJrOAEcVmVjPHU4PgAADGhNYWtlIHNvbWUgb24tY2hhaW4gcmVtYXJrLgCIQ2FuIGJlIGV4ZWN1dGVkIGJ5IGV2ZXJ5IGBvcmlnaW5gLjhzZXRfaGVhcF9wYWdlcwQBFHBhZ2VzMAEMdTY0AAEE+FNldCB0aGUgbnVtYmVyIG9mIHBhZ2VzIGluIHRoZSBXZWJBc3NlbWJseSBlbnZpcm9ubWVudCdzIGhlYXAuIHNldF9jb2RlBAEQY29kZTgBHFZlYzx1OD4AAgRkU2V0IHRoZSBuZXcgcnVudGltZSBjb2RlLlxzZXRfY29kZV93aXRob3V0X2NoZWNrcwQBEGNvZGU4ARxWZWM8dTg+AAMQGQFTZXQgdGhlIG5ldyBydW50aW1lIGNvZGUgd2l0aG91dCBkb2luZyBhbnkgY2hlY2tzIG9mIHRoZSBnaXZlbiBgY29kZWAuAFEBTm90ZSB0aGF0IHJ1bnRpbWUgdXBncmFkZXMgd2lsbCBub3QgcnVuIGlmIHRoaXMgaXMgY2FsbGVkIHdpdGggYSBub3QtaW5jcmVhc2luZyBzcGVjIHZlcnNpb24hLHNldF9zdG9yYWdlBAEUaXRlbXNlAQE0VmVjPEtleVZhbHVlPgAEBGhTZXQgc29tZSBpdGVtcyBvZiBzdG9yYWdlLjBraWxsX3N0b3JhZ2UEARBrZXlzbQEBIFZlYzxLZXk+AAUEdEtpbGwgc29tZSBpdGVtcyBmcm9tIHN0b3JhZ2UuLGtpbGxfcHJlZml4CAEYcHJlZml4OAEMS2V5AAEcc3Via2V5cxABDHUzMgAGEBEBS2lsbCBhbGwgc3RvcmFnZSBpdGVtcyB3aXRoIGEga2V5IHRoYXQgc3RhcnRzIHdpdGggdGhlIGdpdmVuIHByZWZpeC4AOQEqKk5PVEU6KiogV2UgcmVseSBvbiB0aGUgUm9vdCBvcmlnaW4gdG8gcHJvdmlkZSB1cyB0aGUgbnVtYmVyIG9mIHN1YmtleXMgdW5kZXI9AXRoZSBwcmVmaXggd2UgYXJlIHJlbW92aW5nIHRvIGFjY3VyYXRlbHkgY2FsY3VsYXRlIHRoZSB3ZWlnaHQgb2YgdGhpcyBmdW5jdGlvbi5EcmVtYXJrX3dpdGhfZXZlbnQEARhyZW1hcms4ARxWZWM8dTg+AAcEpE1ha2Ugc29tZSBvbi1jaGFpbiByZW1hcmsgYW5kIGVtaXQgZXZlbnQuRGF1dGhvcml6ZV91cGdyYWRlBAEkY29kZV9oYXNoNAEcVDo6SGFzaAAJEGEBQXV0aG9yaXplIGFuIHVwZ3JhZGUgdG8gYSBnaXZlbiBgY29kZV9oYXNoYCBmb3IgdGhlIHJ1bnRpbWUuIFRoZSBydW50aW1lIGNhbiBiZSBzdXBwbGllZBhsYXRlci4AfFRoaXMgY2FsbCByZXF1aXJlcyBSb290IG9yaWdpbi6AYXV0aG9yaXplX3VwZ3JhZGVfd2l0aG91dF9jaGVja3MEASRjb2RlX2hhc2g0ARxUOjpIYXNoAAogYQFBdXRob3JpemUgYW4gdXBncmFkZSB0byBhIGdpdmVuIGBjb2RlX2hhc2hgIGZvciB0aGUgcnVudGltZS4gVGhlIHJ1bnRpbWUgY2FuIGJlIHN1cHBsaWVkGGxhdGVyLgBdAVdBUk5JTkc6IFRoaXMgYXV0aG9yaXplcyBhbiB1cGdyYWRlIHRoYXQgd2lsbCB0YWtlIHBsYWNlIHdpdGhvdXQgYW55IHNhZmV0eSBjaGVja3MsIGZvclkBZXhhbXBsZSB0aGF0IHRoZSBzcGVjIG5hbWUgcmVtYWlucyB0aGUgc2FtZSBhbmQgdGhhdCB0aGUgdmVyc2lvbiBudW1iZXIgaW5jcmVhc2VzLiBOb3TwcmVjb21tZW5kZWQgZm9yIG5vcm1hbCB1c2UuIFVzZSBgYXV0aG9yaXplX3VwZ3JhZGVgIGluc3RlYWQuAHxUaGlzIGNhbGwgcmVxdWlyZXMgUm9vdCBvcmlnaW4uYGFwcGx5X2F1dGhvcml6ZWRfdXBncmFkZQQBEGNvZGU4ARxWZWM8dTg+AAskVQFQcm92aWRlIHRoZSBwcmVpbWFnZSAocnVudGltZSBiaW5hcnkpIGBjb2RlYCBmb3IgYW4gdXBncmFkZSB0aGF0IGhhcyBiZWVuIGF1dGhvcml6ZWQuAEkBSWYgdGhlIGF1dGhvcml6YXRpb24gcmVxdWlyZWQgYSB2ZXJzaW9uIGNoZWNrLCB0aGlzIGNhbGwgd2lsbCBlbnN1cmUgdGhlIHNwZWMgbmFtZehyZW1haW5zIHVuY2hhbmdlZCBhbmQgdGhhdCB0aGUgc3BlYyB2ZXJzaW9uIGhhcyBpbmNyZWFzZWQuAFkBRGVwZW5kaW5nIG9uIHRoZSBydW50aW1lJ3MgYE9uU2V0Q29kZWAgY29uZmlndXJhdGlvbiwgdGhpcyBmdW5jdGlvbiBtYXkgZGlyZWN0bHkgYXBwbHkRAXRoZSBuZXcgYGNvZGVgIGluIHRoZSBzYW1lIGJsb2NrIG9yIGF0dGVtcHQgdG8gc2NoZWR1bGUgdGhlIHVwZ3JhZGUuAGBBbGwgb3JpZ2lucyBhcmUgYWxsb3dlZC4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMuZQEAAAJpAQBpAQAABAg4OABtAQAAAjgAcQEMLHBhbGxldF9iYWJlGHBhbGxldBBDYWxsBARUAAEMTHJlcG9ydF9lcXVpdm9jYXRpb24IAUhlcXVpdm9jYXRpb25fcHJvb2Z1AQGQQm94PEVxdWl2b2NhdGlvblByb29mPEhlYWRlckZvcjxUPj4+AAE8a2V5X293bmVyX3Byb29mhQEBQFQ6OktleU93bmVyUHJvb2YAABAJAVJlcG9ydCBhdXRob3JpdHkgZXF1aXZvY2F0aW9uL21pc2JlaGF2aW9yLiBUaGlzIG1ldGhvZCB3aWxsIHZlcmlmeQUBdGhlIGVxdWl2b2NhdGlvbiBwcm9vZiBhbmQgdmFsaWRhdGUgdGhlIGdpdmVuIGtleSBvd25lcnNoaXAgcHJvb2YNAWFnYWluc3QgdGhlIGV4dHJhY3RlZCBvZmZlbmRlci4gSWYgYm90aCBhcmUgdmFsaWQsIHRoZSBvZmZlbmNlIHdpbGwwYmUgcmVwb3J0ZWQucHJlcG9ydF9lcXVpdm9jYXRpb25fdW5zaWduZWQIAUhlcXVpdm9jYXRpb25fcHJvb2Z1AQGQQm94PEVxdWl2b2NhdGlvblByb29mPEhlYWRlckZvcjxUPj4+AAE8a2V5X293bmVyX3Byb29mhQEBQFQ6OktleU93bmVyUHJvb2YAASAJAVJlcG9ydCBhdXRob3JpdHkgZXF1aXZvY2F0aW9uL21pc2JlaGF2aW9yLiBUaGlzIG1ldGhvZCB3aWxsIHZlcmlmeQUBdGhlIGVxdWl2b2NhdGlvbiBwcm9vZiBhbmQgdmFsaWRhdGUgdGhlIGdpdmVuIGtleSBvd25lcnNoaXAgcHJvb2YNAWFnYWluc3QgdGhlIGV4dHJhY3RlZCBvZmZlbmRlci4gSWYgYm90aCBhcmUgdmFsaWQsIHRoZSBvZmZlbmNlIHdpbGwwYmUgcmVwb3J0ZWQuDQFUaGlzIGV4dHJpbnNpYyBtdXN0IGJlIGNhbGxlZCB1bnNpZ25lZCBhbmQgaXQgaXMgZXhwZWN0ZWQgdGhhdCBvbmx5FQFibG9jayBhdXRob3JzIHdpbGwgY2FsbCBpdCAodmFsaWRhdGVkIGluIGBWYWxpZGF0ZVVuc2lnbmVkYCksIGFzIHN1Y2gVAWlmIHRoZSBibG9jayBhdXRob3IgaXMgZGVmaW5lZCBpdCB3aWxsIGJlIGRlZmluZWQgYXMgdGhlIGVxdWl2b2NhdGlvbiRyZXBvcnRlci5IcGxhbl9jb25maWdfY2hhbmdlBAEYY29uZmlniQEBUE5leHRDb25maWdEZXNjcmlwdG9yAAIQXQFQbGFuIGFuIGVwb2NoIGNvbmZpZyBjaGFuZ2UuIFRoZSBlcG9jaCBjb25maWcgY2hhbmdlIGlzIHJlY29yZGVkIGFuZCB3aWxsIGJlIGVuYWN0ZWQgb25RAXRoZSBuZXh0IGNhbGwgdG8gYGVuYWN0X2Vwb2NoX2NoYW5nZWAuIFRoZSBjb25maWcgd2lsbCBiZSBhY3RpdmF0ZWQgb25lIGVwb2NoIGFmdGVyLlkBTXVsdGlwbGUgY2FsbHMgdG8gdGhpcyBtZXRob2Qgd2lsbCByZXBsYWNlIGFueSBleGlzdGluZyBwbGFubmVkIGNvbmZpZyBjaGFuZ2UgdGhhdCBoYWRUbm90IGJlZW4gZW5hY3RlZCB5ZXQuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLnUBCEhzcF9jb25zZW5zdXNfc2xvdHNERXF1aXZvY2F0aW9uUHJvb2YIGEhlYWRlcgF5AQhJZAF9AQAQASBvZmZlbmRlcn0BAQhJZAABEHNsb3SBAQEQU2xvdAABMGZpcnN0X2hlYWRlcnkBARhIZWFkZXIAATRzZWNvbmRfaGVhZGVyeQEBGEhlYWRlcgAAeQEQKHNwX3J1bnRpbWUcZ2VuZXJpYxhoZWFkZXIYSGVhZGVyCBhOdW1iZXIBEBBIYXNoAAAUASxwYXJlbnRfaGFzaDQBMEhhc2g6Ok91dHB1dAABGG51bWJlctQBGE51bWJlcgABKHN0YXRlX3Jvb3Q0ATBIYXNoOjpPdXRwdXQAATxleHRyaW5zaWNzX3Jvb3Q0ATBIYXNoOjpPdXRwdXQAARhkaWdlc3Q8ARhEaWdlc3QAAH0BDERzcF9jb25zZW5zdXNfYmFiZQxhcHAYUHVibGljAAAEAAQBPHNyMjU1MTk6OlB1YmxpYwAAgQEISHNwX2NvbnNlbnN1c19zbG90cxBTbG90AAAEADABDHU2NAAAhQEIKHNwX3Nlc3Npb248TWVtYmVyc2hpcFByb29mAAAMARxzZXNzaW9uEAEwU2Vzc2lvbkluZGV4AAEodHJpZV9ub2Rlc20BATBWZWM8VmVjPHU4Pj4AATx2YWxpZGF0b3JfY291bnQQAThWYWxpZGF0b3JDb3VudAAAiQEMRHNwX2NvbnNlbnN1c19iYWJlHGRpZ2VzdHNQTmV4dENvbmZpZ0Rlc2NyaXB0b3IAAQQIVjEIAQRjjQEBKCh1NjQsIHU2NCkAATRhbGxvd2VkX3Nsb3RzkQEBMEFsbG93ZWRTbG90cwABAACNAQAABAgwMACRAQhEc3BfY29uc2Vuc3VzX2JhYmUwQWxsb3dlZFNsb3RzAAEMMFByaW1hcnlTbG90cwAAAHRQcmltYXJ5QW5kU2Vjb25kYXJ5UGxhaW5TbG90cwABAGxQcmltYXJ5QW5kU2Vjb25kYXJ5VlJGU2xvdHMAAgAAlQEMQHBhbGxldF90aW1lc3RhbXAYcGFsbGV0EENhbGwEBFQAAQQMc2V0BAEMbm93LAEkVDo6TW9tZW50AABMVFNldCB0aGUgY3VycmVudCB0aW1lLgBVAVRoaXMgY2FsbCBzaG91bGQgYmUgaW52b2tlZCBleGFjdGx5IG9uY2UgcGVyIGJsb2NrLiBJdCB3aWxsIHBhbmljIGF0IHRoZSBmaW5hbGl6YXRpb27UcGhhc2UsIGlmIHRoaXMgY2FsbCBoYXNuJ3QgYmVlbiBpbnZva2VkIGJ5IHRoYXQgdGltZS4AQQFUaGUgdGltZXN0YW1wIHNob3VsZCBiZSBncmVhdGVyIHRoYW4gdGhlIHByZXZpb3VzIG9uZSBieSB0aGUgYW1vdW50IHNwZWNpZmllZCBieWhbYENvbmZpZzo6TWluaW11bVBlcmlvZGBdLgDEVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX05vbmVfLgBRAVRoaXMgZGlzcGF0Y2ggY2xhc3MgaXMgX01hbmRhdG9yeV8gdG8gZW5zdXJlIGl0IGdldHMgZXhlY3V0ZWQgaW4gdGhlIGJsb2NrLiBCZSBhd2FyZVEBdGhhdCBjaGFuZ2luZyB0aGUgY29tcGxleGl0eSBvZiB0aGlzIGNhbGwgY291bGQgcmVzdWx0IGV4aGF1c3RpbmcgdGhlIHJlc291cmNlcyBpbiBhhGJsb2NrIHRvIGV4ZWN1dGUgYW55IG90aGVyIGNhbGxzLgA0IyMgQ29tcGxleGl0eTEBLSBgTygxKWAgKE5vdGUgdGhhdCBpbXBsZW1lbnRhdGlvbnMgb2YgYE9uVGltZXN0YW1wU2V0YCBtdXN0IGFsc28gYmUgYE8oMSlgKVUBLSAxIHN0b3JhZ2UgcmVhZCBhbmQgMSBzdG9yYWdlIG11dGF0aW9uIChjb2RlYyBgTygxKWAgYmVjYXVzZSBvZiBgRGlkVXBkYXRlOjp0YWtlYCBpbkAgIGBvbl9maW5hbGl6ZWAp1C0gMSBldmVudCBoYW5kbGVyIGBvbl90aW1lc3RhbXBfc2V0YC4gTXVzdCBiZSBgTygxKWAuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLpkBDDhwYWxsZXRfaW5kaWNlcxhwYWxsZXQQQ2FsbAQEVAABFBRjbGFpbQQBFGluZGV4EAE8VDo6QWNjb3VudEluZGV4AAAwmEFzc2lnbiBhbiBwcmV2aW91c2x5IHVuYXNzaWduZWQgaW5kZXguANxQYXltZW50OiBgRGVwb3NpdGAgaXMgcmVzZXJ2ZWQgZnJvbSB0aGUgc2VuZGVyIGFjY291bnQuAMxUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXy4A8C0gYGluZGV4YDogdGhlIGluZGV4IHRvIGJlIGNsYWltZWQuIFRoaXMgbXVzdCBub3QgYmUgaW4gdXNlLgCQRW1pdHMgYEluZGV4QXNzaWduZWRgIGlmIHN1Y2Nlc3NmdWwuADQjIyBDb21wbGV4aXR5JC0gYE8oMSlgLiB0cmFuc2ZlcggBDG5ld50BAVBBY2NvdW50SWRMb29rdXBPZjxUPgABFGluZGV4EAE8VDo6QWNjb3VudEluZGV4AAEwXQFBc3NpZ24gYW4gaW5kZXggYWxyZWFkeSBvd25lZCBieSB0aGUgc2VuZGVyIHRvIGFub3RoZXIgYWNjb3VudC4gVGhlIGJhbGFuY2UgcmVzZXJ2YXRpb264aXMgZWZmZWN0aXZlbHkgdHJhbnNmZXJyZWQgdG8gdGhlIG5ldyBhY2NvdW50LgDMVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uACUBLSBgaW5kZXhgOiB0aGUgaW5kZXggdG8gYmUgcmUtYXNzaWduZWQuIFRoaXMgbXVzdCBiZSBvd25lZCBieSB0aGUgc2VuZGVyLl0BLSBgbmV3YDogdGhlIG5ldyBvd25lciBvZiB0aGUgaW5kZXguIFRoaXMgZnVuY3Rpb24gaXMgYSBuby1vcCBpZiBpdCBpcyBlcXVhbCB0byBzZW5kZXIuAJBFbWl0cyBgSW5kZXhBc3NpZ25lZGAgaWYgc3VjY2Vzc2Z1bC4ANCMjIENvbXBsZXhpdHkkLSBgTygxKWAuEGZyZWUEARRpbmRleBABPFQ6OkFjY291bnRJbmRleAACMJRGcmVlIHVwIGFuIGluZGV4IG93bmVkIGJ5IHRoZSBzZW5kZXIuAF0BUGF5bWVudDogQW55IHByZXZpb3VzIGRlcG9zaXQgcGxhY2VkIGZvciB0aGUgaW5kZXggaXMgdW5yZXNlcnZlZCBpbiB0aGUgc2VuZGVyIGFjY291bnQuAFUBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8gYW5kIHRoZSBzZW5kZXIgbXVzdCBvd24gdGhlIGluZGV4LgANAS0gYGluZGV4YDogdGhlIGluZGV4IHRvIGJlIGZyZWVkLiBUaGlzIG11c3QgYmUgb3duZWQgYnkgdGhlIHNlbmRlci4AhEVtaXRzIGBJbmRleEZyZWVkYCBpZiBzdWNjZXNzZnVsLgA0IyMgQ29tcGxleGl0eSQtIGBPKDEpYC44Zm9yY2VfdHJhbnNmZXIMAQxuZXedAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AARRpbmRleBABPFQ6OkFjY291bnRJbmRleAABGGZyZWV6ZSABEGJvb2wAAzRVAUZvcmNlIGFuIGluZGV4IHRvIGFuIGFjY291bnQuIFRoaXMgZG9lc24ndCByZXF1aXJlIGEgZGVwb3NpdC4gSWYgdGhlIGluZGV4IGlzIGFscmVhZHnoaGVsZCwgdGhlbiBhbnkgZGVwb3NpdCBpcyByZWltYnVyc2VkIHRvIGl0cyBjdXJyZW50IG93bmVyLgDEVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1Jvb3RfLgCkLSBgaW5kZXhgOiB0aGUgaW5kZXggdG8gYmUgKHJlLSlhc3NpZ25lZC5dAS0gYG5ld2A6IHRoZSBuZXcgb3duZXIgb2YgdGhlIGluZGV4LiBUaGlzIGZ1bmN0aW9uIGlzIGEgbm8tb3AgaWYgaXQgaXMgZXF1YWwgdG8gc2VuZGVyLkEBLSBgZnJlZXplYDogaWYgc2V0IHRvIGB0cnVlYCwgd2lsbCBmcmVlemUgdGhlIGluZGV4IHNvIGl0IGNhbm5vdCBiZSB0cmFuc2ZlcnJlZC4AkEVtaXRzIGBJbmRleEFzc2lnbmVkYCBpZiBzdWNjZXNzZnVsLgA0IyMgQ29tcGxleGl0eSQtIGBPKDEpYC4YZnJlZXplBAEUaW5kZXgQATxUOjpBY2NvdW50SW5kZXgABDBBAUZyZWV6ZSBhbiBpbmRleCBzbyBpdCB3aWxsIGFsd2F5cyBwb2ludCB0byB0aGUgc2VuZGVyIGFjY291bnQuIFRoaXMgY29uc3VtZXMgdGhlIGRlcG9zaXQuAFkBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8gYW5kIHRoZSBzaWduaW5nIGFjY291bnQgbXVzdCBoYXZlIGFsbm9uLWZyb3plbiBhY2NvdW50IGBpbmRleGAuAKwtIGBpbmRleGA6IHRoZSBpbmRleCB0byBiZSBmcm96ZW4gaW4gcGxhY2UuAIhFbWl0cyBgSW5kZXhGcm96ZW5gIGlmIHN1Y2Nlc3NmdWwuADQjIyBDb21wbGV4aXR5JC0gYE8oMSlgLgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy6dAQwoc3BfcnVudGltZTBtdWx0aWFkZHJlc3MwTXVsdGlBZGRyZXNzCCRBY2NvdW50SWQBADBBY2NvdW50SW5kZXgBoQEBFAhJZAQAAAEkQWNjb3VudElkAAAAFEluZGV4BAClAQEwQWNjb3VudEluZGV4AAEADFJhdwQAOAEcVmVjPHU4PgACACRBZGRyZXNzMzIEAAQBIFt1ODsgMzJdAAMAJEFkZHJlc3MyMAQA4AEgW3U4OyAyMF0ABAAAoQEAAAQAAKUBAAAGoQEAqQEMPHBhbGxldF9iYWxhbmNlcxhwYWxsZXQQQ2FsbAgEVAAESQABJFB0cmFuc2Zlcl9hbGxvd19kZWF0aAgBEGRlc3SdAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AARR2YWx1ZeQBKFQ6OkJhbGFuY2UAABzUVHJhbnNmZXIgc29tZSBsaXF1aWQgZnJlZSBiYWxhbmNlIHRvIGFub3RoZXIgYWNjb3VudC4ANQFgdHJhbnNmZXJfYWxsb3dfZGVhdGhgIHdpbGwgc2V0IHRoZSBgRnJlZUJhbGFuY2VgIG9mIHRoZSBzZW5kZXIgYW5kIHJlY2VpdmVyLhEBSWYgdGhlIHNlbmRlcidzIGFjY291bnQgaXMgYmVsb3cgdGhlIGV4aXN0ZW50aWFsIGRlcG9zaXQgYXMgYSByZXN1bHSwb2YgdGhlIHRyYW5zZmVyLCB0aGUgYWNjb3VudCB3aWxsIGJlIHJlYXBlZC4AFQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBgU2lnbmVkYCBieSB0aGUgdHJhbnNhY3Rvci44Zm9yY2VfdHJhbnNmZXIMARhzb3VyY2WdAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AARBkZXN0nQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEUdmFsdWXkAShUOjpCYWxhbmNlAAIIYQFFeGFjdGx5IGFzIGB0cmFuc2Zlcl9hbGxvd19kZWF0aGAsIGV4Y2VwdCB0aGUgb3JpZ2luIG11c3QgYmUgcm9vdCBhbmQgdGhlIHNvdXJjZSBhY2NvdW50RG1heSBiZSBzcGVjaWZpZWQuTHRyYW5zZmVyX2tlZXBfYWxpdmUIARBkZXN0nQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEUdmFsdWXkAShUOjpCYWxhbmNlAAMYWQFTYW1lIGFzIHRoZSBbYHRyYW5zZmVyX2FsbG93X2RlYXRoYF0gY2FsbCwgYnV0IHdpdGggYSBjaGVjayB0aGF0IHRoZSB0cmFuc2ZlciB3aWxsIG5vdGBraWxsIHRoZSBvcmlnaW4gYWNjb3VudC4A6Dk5JSBvZiB0aGUgdGltZSB5b3Ugd2FudCBbYHRyYW5zZmVyX2FsbG93X2RlYXRoYF0gaW5zdGVhZC4A8FtgdHJhbnNmZXJfYWxsb3dfZGVhdGhgXTogc3RydWN0LlBhbGxldC5odG1sI21ldGhvZC50cmFuc2ZlcjB0cmFuc2Zlcl9hbGwIARBkZXN0nQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEoa2VlcF9hbGl2ZSABEGJvb2wABDwFAVRyYW5zZmVyIHRoZSBlbnRpcmUgdHJhbnNmZXJhYmxlIGJhbGFuY2UgZnJvbSB0aGUgY2FsbGVyIGFjY291bnQuAFkBTk9URTogVGhpcyBmdW5jdGlvbiBvbmx5IGF0dGVtcHRzIHRvIHRyYW5zZmVyIF90cmFuc2ZlcmFibGVfIGJhbGFuY2VzLiBUaGlzIG1lYW5zIHRoYXRhAWFueSBsb2NrZWQsIHJlc2VydmVkLCBvciBleGlzdGVudGlhbCBkZXBvc2l0cyAod2hlbiBga2VlcF9hbGl2ZWAgaXMgYHRydWVgKSwgd2lsbCBub3QgYmVdAXRyYW5zZmVycmVkIGJ5IHRoaXMgZnVuY3Rpb24uIFRvIGVuc3VyZSB0aGF0IHRoaXMgZnVuY3Rpb24gcmVzdWx0cyBpbiBhIGtpbGxlZCBhY2NvdW50LEUBeW91IG1pZ2h0IG5lZWQgdG8gcHJlcGFyZSB0aGUgYWNjb3VudCBieSByZW1vdmluZyBhbnkgcmVmZXJlbmNlIGNvdW50ZXJzLCBzdG9yYWdlQGRlcG9zaXRzLCBldGMuLi4AwFRoZSBkaXNwYXRjaCBvcmlnaW4gb2YgdGhpcyBjYWxsIG11c3QgYmUgU2lnbmVkLgCgLSBgZGVzdGA6IFRoZSByZWNpcGllbnQgb2YgdGhlIHRyYW5zZmVyLlkBLSBga2VlcF9hbGl2ZWA6IEEgYm9vbGVhbiB0byBkZXRlcm1pbmUgaWYgdGhlIGB0cmFuc2Zlcl9hbGxgIG9wZXJhdGlvbiBzaG91bGQgc2VuZCBhbGxNASAgb2YgdGhlIGZ1bmRzIHRoZSBhY2NvdW50IGhhcywgY2F1c2luZyB0aGUgc2VuZGVyIGFjY291bnQgdG8gYmUga2lsbGVkIChmYWxzZSksIG9yWQEgIHRyYW5zZmVyIGV2ZXJ5dGhpbmcgZXhjZXB0IGF0IGxlYXN0IHRoZSBleGlzdGVudGlhbCBkZXBvc2l0LCB3aGljaCB3aWxsIGd1YXJhbnRlZSB0b5wgIGtlZXAgdGhlIHNlbmRlciBhY2NvdW50IGFsaXZlICh0cnVlKS48Zm9yY2VfdW5yZXNlcnZlCAEMd2hvnQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEYYW1vdW50GAEoVDo6QmFsYW5jZQAFDLBVbnJlc2VydmUgc29tZSBiYWxhbmNlIGZyb20gYSB1c2VyIGJ5IGZvcmNlLgBsQ2FuIG9ubHkgYmUgY2FsbGVkIGJ5IFJPT1QuQHVwZ3JhZGVfYWNjb3VudHMEAQx3aG+tAQFEVmVjPFQ6OkFjY291bnRJZD4ABiBwVXBncmFkZSBhIHNwZWNpZmllZCBhY2NvdW50LgB0LSBgb3JpZ2luYDogTXVzdCBiZSBgU2lnbmVkYC6QLSBgd2hvYDogVGhlIGFjY291bnQgdG8gYmUgdXBncmFkZWQuAFUBVGhpcyB3aWxsIHdhaXZlIHRoZSB0cmFuc2FjdGlvbiBmZWUgaWYgYXQgbGVhc3QgYWxsIGJ1dCAxMCUgb2YgdGhlIGFjY291bnRzIG5lZWRlZCB0b0EBYmUgdXBncmFkZWQuIChXZSBsZXQgc29tZSBub3QgaGF2ZSB0byBiZSB1cGdyYWRlZCBqdXN0IGluIG9yZGVyIHRvIGFsbG93IGZvciB0aGVYcG9zc2liaWxpdHkgb2YgY2h1cm4pLkRmb3JjZV9zZXRfYmFsYW5jZQgBDHdob50BAVBBY2NvdW50SWRMb29rdXBPZjxUPgABIG5ld19mcmVl5AEoVDo6QmFsYW5jZQAIDKxTZXQgdGhlIHJlZ3VsYXIgYmFsYW5jZSBvZiBhIGdpdmVuIGFjY291bnQuALBUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgaXMgYHJvb3RgLmxmb3JjZV9hZGp1c3RfdG90YWxfaXNzdWFuY2UIASRkaXJlY3Rpb26xAQFMQWRqdXN0bWVudERpcmVjdGlvbgABFGRlbHRh5AEoVDo6QmFsYW5jZQAJFLhBZGp1c3QgdGhlIHRvdGFsIGlzc3VhbmNlIGluIGEgc2F0dXJhdGluZyB3YXkuAPxDYW4gb25seSBiZSBjYWxsZWQgYnkgcm9vdCBhbmQgYWx3YXlzIG5lZWRzIGEgcG9zaXRpdmUgYGRlbHRhYC4AJCMgRXhhbXBsZRBidXJuCAEUdmFsdWXkAShUOjpCYWxhbmNlAAEoa2VlcF9hbGl2ZSABEGJvb2wAChz8QnVybiB0aGUgc3BlY2lmaWVkIGxpcXVpZCBmcmVlIGJhbGFuY2UgZnJvbSB0aGUgb3JpZ2luIGFjY291bnQuACUBSWYgdGhlIG9yaWdpbidzIGFjY291bnQgZW5kcyB1cCBiZWxvdyB0aGUgZXhpc3RlbnRpYWwgZGVwb3NpdCBhcyBhIHJlc3VsdAkBb2YgdGhlIGJ1cm4gYW5kIGBrZWVwX2FsaXZlYCBpcyBmYWxzZSwgdGhlIGFjY291bnQgd2lsbCBiZSByZWFwZWQuAFEBVW5saWtlIHNlbmRpbmcgZnVuZHMgdG8gYSBfYnVybl8gYWRkcmVzcywgd2hpY2ggbWVyZWx5IG1ha2VzIHRoZSBmdW5kcyBpbmFjY2Vzc2libGUsIQF0aGlzIGBidXJuYCBvcGVyYXRpb24gd2lsbCByZWR1Y2UgdG90YWwgaXNzdWFuY2UgYnkgdGhlIGFtb3VudCBfYnVybmVkXy4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMurQEAAAIAALEBDDxwYWxsZXRfYmFsYW5jZXMUdHlwZXNMQWRqdXN0bWVudERpcmVjdGlvbgABCCBJbmNyZWFzZQAAACBEZWNyZWFzZQABAAC1ARA4cGFsbGV0X3N0YWtpbmcYcGFsbGV0GHBhbGxldBBDYWxsBARUAAF4EGJvbmQIARR2YWx1ZeQBMEJhbGFuY2VPZjxUPgABFHBheWVlkAF8UmV3YXJkRGVzdGluYXRpb248VDo6QWNjb3VudElkPgAAQGEBVGFrZSB0aGUgb3JpZ2luIGFjY291bnQgYXMgYSBzdGFzaCBhbmQgbG9jayB1cCBgdmFsdWVgIG9mIGl0cyBiYWxhbmNlLiBgY29udHJvbGxlcmAgd2lsbIBiZSB0aGUgYWNjb3VudCB0aGF0IGNvbnRyb2xzIGl0LgAtAWB2YWx1ZWAgbXVzdCBiZSBtb3JlIHRoYW4gdGhlIGBtaW5pbXVtX2JhbGFuY2VgIHNwZWNpZmllZCBieSBgVDo6Q3VycmVuY3lgLgAhAVRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfIGJ5IHRoZSBzdGFzaCBhY2NvdW50LgA8RW1pdHMgYEJvbmRlZGAuNCMjIENvbXBsZXhpdHnQLSBJbmRlcGVuZGVudCBvZiB0aGUgYXJndW1lbnRzLiBNb2RlcmF0ZSBjb21wbGV4aXR5LhwtIE8oMSkuZC0gVGhyZWUgZXh0cmEgREIgZW50cmllcy4ATQFOT1RFOiBUd28gb2YgdGhlIHN0b3JhZ2Ugd3JpdGVzIChgU2VsZjo6Ym9uZGVkYCwgYFNlbGY6OnBheWVlYCkgYXJlIF9uZXZlcl8gY2xlYW5lZFkBdW5sZXNzIHRoZSBgb3JpZ2luYCBmYWxscyBiZWxvdyBfZXhpc3RlbnRpYWwgZGVwb3NpdF8gKG9yIGVxdWFsIHRvIDApIGFuZCBnZXRzIHJlbW92ZWQgYXMgZHVzdC4oYm9uZF9leHRyYQQBOG1heF9hZGRpdGlvbmFs5AEwQmFsYW5jZU9mPFQ+AAE4YQFBZGQgc29tZSBleHRyYSBhbW91bnQgdGhhdCBoYXZlIGFwcGVhcmVkIGluIHRoZSBzdGFzaCBgZnJlZV9iYWxhbmNlYCBpbnRvIHRoZSBiYWxhbmNlIHVwMGZvciBzdGFraW5nLgBRAVRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfIGJ5IHRoZSBzdGFzaCwgbm90IHRoZSBjb250cm9sbGVyLgBNAVVzZSB0aGlzIGlmIHRoZXJlIGFyZSBhZGRpdGlvbmFsIGZ1bmRzIGluIHlvdXIgc3Rhc2ggYWNjb3VudCB0aGF0IHlvdSB3aXNoIHRvIGJvbmQuVQFVbmxpa2UgW2Bib25kYF0oU2VsZjo6Ym9uZCkgb3IgW2B1bmJvbmRgXShTZWxmOjp1bmJvbmQpIHRoaXMgZnVuY3Rpb24gZG9lcyBub3QgaW1wb3NlvGFueSBsaW1pdGF0aW9uIG9uIHRoZSBhbW91bnQgdGhhdCBjYW4gYmUgYWRkZWQuADxFbWl0cyBgQm9uZGVkYC4ANCMjIENvbXBsZXhpdHnkLSBJbmRlcGVuZGVudCBvZiB0aGUgYXJndW1lbnRzLiBJbnNpZ25pZmljYW50IGNvbXBsZXhpdHkuHC0gTygxKS4YdW5ib25kBAEUdmFsdWXkATBCYWxhbmNlT2Y8VD4AAkxRAVNjaGVkdWxlIGEgcG9ydGlvbiBvZiB0aGUgc3Rhc2ggdG8gYmUgdW5sb2NrZWQgcmVhZHkgZm9yIHRyYW5zZmVyIG91dCBhZnRlciB0aGUgYm9uZPxwZXJpb2QgZW5kcy4gSWYgdGhpcyBsZWF2ZXMgYW4gYW1vdW50IGFjdGl2ZWx5IGJvbmRlZCBsZXNzIHRoYW4hAVQ6OkN1cnJlbmN5OjptaW5pbXVtX2JhbGFuY2UoKSwgdGhlbiBpdCBpcyBpbmNyZWFzZWQgdG8gdGhlIGZ1bGwgYW1vdW50LgBRAVRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfIGJ5IHRoZSBjb250cm9sbGVyLCBub3QgdGhlIHN0YXNoLgBFAU9uY2UgdGhlIHVubG9jayBwZXJpb2QgaXMgZG9uZSwgeW91IGNhbiBjYWxsIGB3aXRoZHJhd191bmJvbmRlZGAgdG8gYWN0dWFsbHkgbW92Zbx0aGUgZnVuZHMgb3V0IG9mIG1hbmFnZW1lbnQgcmVhZHkgZm9yIHRyYW5zZmVyLgAxAU5vIG1vcmUgdGhhbiBhIGxpbWl0ZWQgbnVtYmVyIG9mIHVubG9ja2luZyBjaHVua3MgKHNlZSBgTWF4VW5sb2NraW5nQ2h1bmtzYClBAWNhbiBjby1leGlzdHMgYXQgdGhlIHNhbWUgdGltZS4gSWYgdGhlcmUgYXJlIG5vIHVubG9ja2luZyBjaHVua3Mgc2xvdHMgYXZhaWxhYmxlRQFbYENhbGw6OndpdGhkcmF3X3VuYm9uZGVkYF0gaXMgY2FsbGVkIHRvIHJlbW92ZSBzb21lIG9mIHRoZSBjaHVua3MgKGlmIHBvc3NpYmxlKS4AOQFJZiBhIHVzZXIgZW5jb3VudGVycyB0aGUgYEluc3VmZmljaWVudEJvbmRgIGVycm9yIHdoZW4gY2FsbGluZyB0aGlzIGV4dHJpbnNpYywZAXRoZXkgc2hvdWxkIGNhbGwgYGNoaWxsYCBmaXJzdCBpbiBvcmRlciB0byBmcmVlIHVwIHRoZWlyIGJvbmRlZCBmdW5kcy4AREVtaXRzIGBVbmJvbmRlZGAuAJRTZWUgYWxzbyBbYENhbGw6OndpdGhkcmF3X3VuYm9uZGVkYF0uRHdpdGhkcmF3X3VuYm9uZGVkBAFIbnVtX3NsYXNoaW5nX3NwYW5zEAEMdTMyAANcKQFSZW1vdmUgYW55IHVubG9ja2VkIGNodW5rcyBmcm9tIHRoZSBgdW5sb2NraW5nYCBxdWV1ZSBmcm9tIG91ciBtYW5hZ2VtZW50LgBVAVRoaXMgZXNzZW50aWFsbHkgZnJlZXMgdXAgdGhhdCBiYWxhbmNlIHRvIGJlIHVzZWQgYnkgdGhlIHN0YXNoIGFjY291bnQgdG8gZG8gd2hhdGV2ZXIkaXQgd2FudHMuABUBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8gYnkgdGhlIGNvbnRyb2xsZXIuAEhFbWl0cyBgV2l0aGRyYXduYC4AaFNlZSBhbHNvIFtgQ2FsbDo6dW5ib25kYF0uADQjIyBQYXJhbWV0ZXJzAFEBLSBgbnVtX3NsYXNoaW5nX3NwYW5zYCBpbmRpY2F0ZXMgdGhlIG51bWJlciBvZiBtZXRhZGF0YSBzbGFzaGluZyBzcGFucyB0byBjbGVhciB3aGVuVQF0aGlzIGNhbGwgcmVzdWx0cyBpbiBhIGNvbXBsZXRlIHJlbW92YWwgb2YgYWxsIHRoZSBkYXRhIHJlbGF0ZWQgdG8gdGhlIHN0YXNoIGFjY291bnQuPQFJbiB0aGlzIGNhc2UsIHRoZSBgbnVtX3NsYXNoaW5nX3NwYW5zYCBtdXN0IGJlIGxhcmdlciBvciBlcXVhbCB0byB0aGUgbnVtYmVyIG9mXQFzbGFzaGluZyBzcGFucyBhc3NvY2lhdGVkIHdpdGggdGhlIHN0YXNoIGFjY291bnQgaW4gdGhlIFtgU2xhc2hpbmdTcGFuc2BdIHN0b3JhZ2UgdHlwZSwlAW90aGVyd2lzZSB0aGUgY2FsbCB3aWxsIGZhaWwuIFRoZSBjYWxsIHdlaWdodCBpcyBkaXJlY3RseSBwcm9wb3J0aW9uYWwgdG9UYG51bV9zbGFzaGluZ19zcGFuc2AuADQjIyBDb21wbGV4aXR52E8oUykgd2hlcmUgUyBpcyB0aGUgbnVtYmVyIG9mIHNsYXNoaW5nIHNwYW5zIHRvIHJlbW92ZQkBTk9URTogV2VpZ2h0IGFubm90YXRpb24gaXMgdGhlIGtpbGwgc2NlbmFyaW8sIHdlIHJlZnVuZCBvdGhlcndpc2UuIHZhbGlkYXRlBAEUcHJlZnOYAThWYWxpZGF0b3JQcmVmcwAEFOREZWNsYXJlIHRoZSBkZXNpcmUgdG8gdmFsaWRhdGUgZm9yIHRoZSBvcmlnaW4gY29udHJvbGxlci4A2EVmZmVjdHMgd2lsbCBiZSBmZWx0IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIG5leHQgZXJhLgBRAVRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfIGJ5IHRoZSBjb250cm9sbGVyLCBub3QgdGhlIHN0YXNoLiBub21pbmF0ZQQBHHRhcmdldHO5AQFkVmVjPEFjY291bnRJZExvb2t1cE9mPFQ+PgAFKA0BRGVjbGFyZSB0aGUgZGVzaXJlIHRvIG5vbWluYXRlIGB0YXJnZXRzYCBmb3IgdGhlIG9yaWdpbiBjb250cm9sbGVyLgDYRWZmZWN0cyB3aWxsIGJlIGZlbHQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbmV4dCBlcmEuAFEBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8gYnkgdGhlIGNvbnRyb2xsZXIsIG5vdCB0aGUgc3Rhc2guADQjIyBDb21wbGV4aXR5LQEtIFRoZSB0cmFuc2FjdGlvbidzIGNvbXBsZXhpdHkgaXMgcHJvcG9ydGlvbmFsIHRvIHRoZSBzaXplIG9mIGB0YXJnZXRzYCAoTikFAXdoaWNoIGlzIGNhcHBlZCBhdCBDb21wYWN0QXNzaWdubWVudHM6OkxJTUlUIChUOjpNYXhOb21pbmF0aW9ucyku1C0gQm90aCB0aGUgcmVhZHMgYW5kIHdyaXRlcyBmb2xsb3cgYSBzaW1pbGFyIHBhdHRlcm4uFGNoaWxsAAYoxERlY2xhcmUgbm8gZGVzaXJlIHRvIGVpdGhlciB2YWxpZGF0ZSBvciBub21pbmF0ZS4A2EVmZmVjdHMgd2lsbCBiZSBmZWx0IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIG5leHQgZXJhLgBRAVRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfIGJ5IHRoZSBjb250cm9sbGVyLCBub3QgdGhlIHN0YXNoLgA0IyMgQ29tcGxleGl0eeQtIEluZGVwZW5kZW50IG9mIHRoZSBhcmd1bWVudHMuIEluc2lnbmlmaWNhbnQgY29tcGxleGl0eS5QLSBDb250YWlucyBvbmUgcmVhZC7ELSBXcml0ZXMgYXJlIGxpbWl0ZWQgdG8gdGhlIGBvcmlnaW5gIGFjY291bnQga2V5LiRzZXRfcGF5ZWUEARRwYXllZZABfFJld2FyZERlc3RpbmF0aW9uPFQ6OkFjY291bnRJZD4ABzC0KFJlLSlzZXQgdGhlIHBheW1lbnQgdGFyZ2V0IGZvciBhIGNvbnRyb2xsZXIuAFEBRWZmZWN0cyB3aWxsIGJlIGZlbHQgaW5zdGFudGx5IChhcyBzb29uIGFzIHRoaXMgZnVuY3Rpb24gaXMgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSkuAFEBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8gYnkgdGhlIGNvbnRyb2xsZXIsIG5vdCB0aGUgc3Rhc2guADQjIyBDb21wbGV4aXR5GC0gTygxKeQtIEluZGVwZW5kZW50IG9mIHRoZSBhcmd1bWVudHMuIEluc2lnbmlmaWNhbnQgY29tcGxleGl0eS6ULSBDb250YWlucyBhIGxpbWl0ZWQgbnVtYmVyIG9mIHJlYWRzLsQtIFdyaXRlcyBhcmUgbGltaXRlZCB0byB0aGUgYG9yaWdpbmAgYWNjb3VudCBrZXkuJC0tLS0tLS0tLThzZXRfY29udHJvbGxlcgAIOEUBKFJlLSlzZXRzIHRoZSBjb250cm9sbGVyIG9mIGEgc3Rhc2ggdG8gdGhlIHN0YXNoIGl0c2VsZi4gVGhpcyBmdW5jdGlvbiBwcmV2aW91c2x5TQFhY2NlcHRlZCBhIGBjb250cm9sbGVyYCBhcmd1bWVudCB0byBzZXQgdGhlIGNvbnRyb2xsZXIgdG8gYW4gYWNjb3VudCBvdGhlciB0aGFuIHRoZVkBc3Rhc2ggaXRzZWxmLiBUaGlzIGZ1bmN0aW9uYWxpdHkgaGFzIG5vdyBiZWVuIHJlbW92ZWQsIG5vdyBvbmx5IHNldHRpbmcgdGhlIGNvbnRyb2xsZXKMdG8gdGhlIHN0YXNoLCBpZiBpdCBpcyBub3QgYWxyZWFkeS4AUQFFZmZlY3RzIHdpbGwgYmUgZmVsdCBpbnN0YW50bHkgKGFzIHNvb24gYXMgdGhpcyBmdW5jdGlvbiBpcyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5KS4AUQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXyBieSB0aGUgc3Rhc2gsIG5vdCB0aGUgY29udHJvbGxlci4ANCMjIENvbXBsZXhpdHkQTygxKeQtIEluZGVwZW5kZW50IG9mIHRoZSBhcmd1bWVudHMuIEluc2lnbmlmaWNhbnQgY29tcGxleGl0eS6ULSBDb250YWlucyBhIGxpbWl0ZWQgbnVtYmVyIG9mIHJlYWRzLsQtIFdyaXRlcyBhcmUgbGltaXRlZCB0byB0aGUgYG9yaWdpbmAgYWNjb3VudCBrZXkuTHNldF92YWxpZGF0b3JfY291bnQEAQxuZXfUAQx1MzIACRiQU2V0cyB0aGUgaWRlYWwgbnVtYmVyIG9mIHZhbGlkYXRvcnMuAIRUaGUgZGlzcGF0Y2ggb3JpZ2luIG11c3QgYmUgUm9vdC4ANCMjIENvbXBsZXhpdHkQTygxKWBpbmNyZWFzZV92YWxpZGF0b3JfY291bnQEAShhZGRpdGlvbmFs1AEMdTMyAAoc6EluY3JlbWVudHMgdGhlIGlkZWFsIG51bWJlciBvZiB2YWxpZGF0b3JzIHVwIHRvIG1heGltdW0gb2aMYEVsZWN0aW9uUHJvdmlkZXJCYXNlOjpNYXhXaW5uZXJzYC4AhFRoZSBkaXNwYXRjaCBvcmlnaW4gbXVzdCBiZSBSb290LgA0IyMgQ29tcGxleGl0eZhTYW1lIGFzIFtgU2VsZjo6c2V0X3ZhbGlkYXRvcl9jb3VudGBdLlRzY2FsZV92YWxpZGF0b3JfY291bnQEARhmYWN0b3K9AQEcUGVyY2VudAALHBEBU2NhbGUgdXAgdGhlIGlkZWFsIG51bWJlciBvZiB2YWxpZGF0b3JzIGJ5IGEgZmFjdG9yIHVwIHRvIG1heGltdW0gb2aMYEVsZWN0aW9uUHJvdmlkZXJCYXNlOjpNYXhXaW5uZXJzYC4AhFRoZSBkaXNwYXRjaCBvcmlnaW4gbXVzdCBiZSBSb290LgA0IyMgQ29tcGxleGl0eZhTYW1lIGFzIFtgU2VsZjo6c2V0X3ZhbGlkYXRvcl9jb3VudGBdLjRmb3JjZV9ub19lcmFzAAw0rEZvcmNlIHRoZXJlIHRvIGJlIG5vIG5ldyBlcmFzIGluZGVmaW5pdGVseS4AhFRoZSBkaXNwYXRjaCBvcmlnaW4gbXVzdCBiZSBSb290LgAkIyBXYXJuaW5nABkBVGhlIGVsZWN0aW9uIHByb2Nlc3Mgc3RhcnRzIG11bHRpcGxlIGJsb2NrcyBiZWZvcmUgdGhlIGVuZCBvZiB0aGUgZXJhLjkBVGh1cyB0aGUgZWxlY3Rpb24gcHJvY2VzcyBtYXkgYmUgb25nb2luZyB3aGVuIHRoaXMgaXMgY2FsbGVkLiBJbiB0aGlzIGNhc2UgdGhl3GVsZWN0aW9uIHdpbGwgY29udGludWUgdW50aWwgdGhlIG5leHQgZXJhIGlzIHRyaWdnZXJlZC4ANCMjIENvbXBsZXhpdHk8LSBObyBhcmd1bWVudHMuOC0gV2VpZ2h0OiBPKDEpNGZvcmNlX25ld19lcmEADThJAUZvcmNlIHRoZXJlIHRvIGJlIGEgbmV3IGVyYSBhdCB0aGUgZW5kIG9mIHRoZSBuZXh0IHNlc3Npb24uIEFmdGVyIHRoaXMsIGl0IHdpbGwgYmWccmVzZXQgdG8gbm9ybWFsIChub24tZm9yY2VkKSBiZWhhdmlvdXIuAIRUaGUgZGlzcGF0Y2ggb3JpZ2luIG11c3QgYmUgUm9vdC4AJCMgV2FybmluZwAZAVRoZSBlbGVjdGlvbiBwcm9jZXNzIHN0YXJ0cyBtdWx0aXBsZSBibG9ja3MgYmVmb3JlIHRoZSBlbmQgb2YgdGhlIGVyYS5JAUlmIHRoaXMgaXMgY2FsbGVkIGp1c3QgYmVmb3JlIGEgbmV3IGVyYSBpcyB0cmlnZ2VyZWQsIHRoZSBlbGVjdGlvbiBwcm9jZXNzIG1heSBub3SMaGF2ZSBlbm91Z2ggYmxvY2tzIHRvIGdldCBhIHJlc3VsdC4ANCMjIENvbXBsZXhpdHk8LSBObyBhcmd1bWVudHMuOC0gV2VpZ2h0OiBPKDEpRHNldF9pbnZ1bG5lcmFibGVzBAE0aW52dWxuZXJhYmxlc60BAURWZWM8VDo6QWNjb3VudElkPgAODMhTZXQgdGhlIHZhbGlkYXRvcnMgd2hvIGNhbm5vdCBiZSBzbGFzaGVkIChpZiBhbnkpLgCEVGhlIGRpc3BhdGNoIG9yaWdpbiBtdXN0IGJlIFJvb3QuNGZvcmNlX3Vuc3Rha2UIARRzdGFzaAABMFQ6OkFjY291bnRJZAABSG51bV9zbGFzaGluZ19zcGFucxABDHUzMgAPIAkBRm9yY2UgYSBjdXJyZW50IHN0YWtlciB0byBiZWNvbWUgY29tcGxldGVseSB1bnN0YWtlZCwgaW1tZWRpYXRlbHkuAIRUaGUgZGlzcGF0Y2ggb3JpZ2luIG11c3QgYmUgUm9vdC4ANCMjIFBhcmFtZXRlcnMARQEtIGBudW1fc2xhc2hpbmdfc3BhbnNgOiBSZWZlciB0byBjb21tZW50cyBvbiBbYENhbGw6OndpdGhkcmF3X3VuYm9uZGVkYF0gZm9yIG1vcmUgZGV0YWlscy5QZm9yY2VfbmV3X2VyYV9hbHdheXMAECQBAUZvcmNlIHRoZXJlIHRvIGJlIGEgbmV3IGVyYSBhdCB0aGUgZW5kIG9mIHNlc3Npb25zIGluZGVmaW5pdGVseS4AhFRoZSBkaXNwYXRjaCBvcmlnaW4gbXVzdCBiZSBSb290LgAkIyBXYXJuaW5nABkBVGhlIGVsZWN0aW9uIHByb2Nlc3Mgc3RhcnRzIG11bHRpcGxlIGJsb2NrcyBiZWZvcmUgdGhlIGVuZCBvZiB0aGUgZXJhLkkBSWYgdGhpcyBpcyBjYWxsZWQganVzdCBiZWZvcmUgYSBuZXcgZXJhIGlzIHRyaWdnZXJlZCwgdGhlIGVsZWN0aW9uIHByb2Nlc3MgbWF5IG5vdIxoYXZlIGVub3VnaCBibG9ja3MgdG8gZ2V0IGEgcmVzdWx0LlRjYW5jZWxfZGVmZXJyZWRfc2xhc2gIAQxlcmEQASBFcmFJbmRleAABNHNsYXNoX2luZGljZXPBAQEgVmVjPHUzMj4AERSUQ2FuY2VsIGVuYWN0bWVudCBvZiBhIGRlZmVycmVkIHNsYXNoLgCYQ2FuIGJlIGNhbGxlZCBieSB0aGUgYFQ6OkFkbWluT3JpZ2luYC4AAQFQYXJhbWV0ZXJzOiBlcmEgYW5kIGluZGljZXMgb2YgdGhlIHNsYXNoZXMgZm9yIHRoYXQgZXJhIHRvIGtpbGwuOHBheW91dF9zdGFrZXJzCAE8dmFsaWRhdG9yX3N0YXNoAAEwVDo6QWNjb3VudElkAAEMZXJhEAEgRXJhSW5kZXgAEjQZAVBheSBvdXQgbmV4dCBwYWdlIG9mIHRoZSBzdGFrZXJzIGJlaGluZCBhIHZhbGlkYXRvciBmb3IgdGhlIGdpdmVuIGVyYS4A6C0gYHZhbGlkYXRvcl9zdGFzaGAgaXMgdGhlIHN0YXNoIGFjY291bnQgb2YgdGhlIHZhbGlkYXRvci4xAS0gYGVyYWAgbWF5IGJlIGFueSBlcmEgYmV0d2VlbiBgW2N1cnJlbnRfZXJhIC0gaGlzdG9yeV9kZXB0aDsgY3VycmVudF9lcmFdYC4AVQFUaGUgb3JpZ2luIG9mIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfLiBBbnkgYWNjb3VudCBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uLCBldmVuIGlmdGl0IGlzIG5vdCBvbmUgb2YgdGhlIHN0YWtlcnMuAEkBVGhlIHJld2FyZCBwYXlvdXQgY291bGQgYmUgcGFnZWQgaW4gY2FzZSB0aGVyZSBhcmUgdG9vIG1hbnkgbm9taW5hdG9ycyBiYWNraW5nIHRoZV0BYHZhbGlkYXRvcl9zdGFzaGAuIFRoaXMgY2FsbCB3aWxsIHBheW91dCB1bnBhaWQgcGFnZXMgaW4gYW4gYXNjZW5kaW5nIG9yZGVyLiBUbyBjbGFpbSBhtHNwZWNpZmljIHBhZ2UsIHVzZSBgcGF5b3V0X3N0YWtlcnNfYnlfcGFnZWAuYADwSWYgYWxsIHBhZ2VzIGFyZSBjbGFpbWVkLCBpdCByZXR1cm5zIGFuIGVycm9yIGBJbnZhbGlkUGFnZWAuGHJlYm9uZAQBFHZhbHVl5AEwQmFsYW5jZU9mPFQ+ABMc3FJlYm9uZCBhIHBvcnRpb24gb2YgdGhlIHN0YXNoIHNjaGVkdWxlZCB0byBiZSB1bmxvY2tlZC4A1FRoZSBkaXNwYXRjaCBvcmlnaW4gbXVzdCBiZSBzaWduZWQgYnkgdGhlIGNvbnRyb2xsZXIuADQjIyBDb21wbGV4aXR50C0gVGltZSBjb21wbGV4aXR5OiBPKEwpLCB3aGVyZSBMIGlzIHVubG9ja2luZyBjaHVua3OILSBCb3VuZGVkIGJ5IGBNYXhVbmxvY2tpbmdDaHVua3NgLihyZWFwX3N0YXNoCAEUc3Rhc2gAATBUOjpBY2NvdW50SWQAAUhudW1fc2xhc2hpbmdfc3BhbnMQAQx1MzIAFEhdAVJlbW92ZSBhbGwgZGF0YSBzdHJ1Y3R1cmVzIGNvbmNlcm5pbmcgYSBzdGFrZXIvc3Rhc2ggb25jZSBpdCBpcyBhdCBhIHN0YXRlIHdoZXJlIGl0IGNhbgUBYmUgY29uc2lkZXJlZCBgZHVzdGAgaW4gdGhlIHN0YWtpbmcgc3lzdGVtLiBUaGUgcmVxdWlyZW1lbnRzIGFyZToABQExLiB0aGUgYHRvdGFsX2JhbGFuY2VgIG9mIHRoZSBzdGFzaCBpcyBiZWxvdyBleGlzdGVudGlhbCBkZXBvc2l0LhEBMi4gb3IsIHRoZSBgbGVkZ2VyLnRvdGFsYCBvZiB0aGUgc3Rhc2ggaXMgYmVsb3cgZXhpc3RlbnRpYWwgZGVwb3NpdC5hATMuIG9yLCBleGlzdGVudGlhbCBkZXBvc2l0IGlzIHplcm8gYW5kIGVpdGhlciBgdG90YWxfYmFsYW5jZWAgb3IgYGxlZGdlci50b3RhbGAgaXMgemVyby4AVQFUaGUgZm9ybWVyIGNhbiBoYXBwZW4gaW4gY2FzZXMgbGlrZSBhIHNsYXNoOyB0aGUgbGF0dGVyIHdoZW4gYSBmdWxseSB1bmJvbmRlZCBhY2NvdW50CQFpcyBzdGlsbCByZWNlaXZpbmcgc3Rha2luZyByZXdhcmRzIGluIGBSZXdhcmREZXN0aW5hdGlvbjo6U3Rha2VkYC4AMQFJdCBjYW4gYmUgY2FsbGVkIGJ5IGFueW9uZSwgYXMgbG9uZyBhcyBgc3Rhc2hgIG1lZXRzIHRoZSBhYm92ZSByZXF1aXJlbWVudHMuANxSZWZ1bmRzIHRoZSB0cmFuc2FjdGlvbiBmZWVzIHVwb24gc3VjY2Vzc2Z1bCBleGVjdXRpb24uADQjIyBQYXJhbWV0ZXJzAEUBLSBgbnVtX3NsYXNoaW5nX3NwYW5zYDogUmVmZXIgdG8gY29tbWVudHMgb24gW2BDYWxsOjp3aXRoZHJhd191bmJvbmRlZGBdIGZvciBtb3JlIGRldGFpbHMuEGtpY2sEAQx3aG+5AQFkVmVjPEFjY291bnRJZExvb2t1cE9mPFQ+PgAVLOBSZW1vdmUgdGhlIGdpdmVuIG5vbWluYXRpb25zIGZyb20gdGhlIGNhbGxpbmcgdmFsaWRhdG9yLgDYRWZmZWN0cyB3aWxsIGJlIGZlbHQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbmV4dCBlcmEuAFEBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8gYnkgdGhlIGNvbnRyb2xsZXIsIG5vdCB0aGUgc3Rhc2guAE0BLSBgd2hvYDogQSBsaXN0IG9mIG5vbWluYXRvciBzdGFzaCBhY2NvdW50cyB3aG8gYXJlIG5vbWluYXRpbmcgdGhpcyB2YWxpZGF0b3Igd2hpY2jAICBzaG91bGQgbm8gbG9uZ2VyIGJlIG5vbWluYXRpbmcgdGhpcyB2YWxpZGF0b3IuAFUBTm90ZTogTWFraW5nIHRoaXMgY2FsbCBvbmx5IG1ha2VzIHNlbnNlIGlmIHlvdSBmaXJzdCBzZXQgdGhlIHZhbGlkYXRvciBwcmVmZXJlbmNlcyB0b3hibG9jayBhbnkgZnVydGhlciBub21pbmF0aW9ucy5Mc2V0X3N0YWtpbmdfY29uZmlncxwBSG1pbl9ub21pbmF0b3JfYm9uZMUBAVhDb25maWdPcDxCYWxhbmNlT2Y8VD4+AAFIbWluX3ZhbGlkYXRvcl9ib25kxQEBWENvbmZpZ09wPEJhbGFuY2VPZjxUPj4AAUxtYXhfbm9taW5hdG9yX2NvdW50yQEBNENvbmZpZ09wPHUzMj4AAUxtYXhfdmFsaWRhdG9yX2NvdW50yQEBNENvbmZpZ09wPHUzMj4AATxjaGlsbF90aHJlc2hvbGTNAQFEQ29uZmlnT3A8UGVyY2VudD4AAThtaW5fY29tbWlzc2lvbtEBAURDb25maWdPcDxQZXJiaWxsPgABSG1heF9zdGFrZWRfcmV3YXJkc80BAURDb25maWdPcDxQZXJjZW50PgAWRKxVcGRhdGUgdGhlIHZhcmlvdXMgc3Rha2luZyBjb25maWd1cmF0aW9ucyAuACUBKiBgbWluX25vbWluYXRvcl9ib25kYDogVGhlIG1pbmltdW0gYWN0aXZlIGJvbmQgbmVlZGVkIHRvIGJlIGEgbm9taW5hdG9yLiUBKiBgbWluX3ZhbGlkYXRvcl9ib25kYDogVGhlIG1pbmltdW0gYWN0aXZlIGJvbmQgbmVlZGVkIHRvIGJlIGEgdmFsaWRhdG9yLlUBKiBgbWF4X25vbWluYXRvcl9jb3VudGA6IFRoZSBtYXggbnVtYmVyIG9mIHVzZXJzIHdobyBjYW4gYmUgYSBub21pbmF0b3IgYXQgb25jZS4gV2hlbpggIHNldCB0byBgTm9uZWAsIG5vIGxpbWl0IGlzIGVuZm9yY2VkLlUBKiBgbWF4X3ZhbGlkYXRvcl9jb3VudGA6IFRoZSBtYXggbnVtYmVyIG9mIHVzZXJzIHdobyBjYW4gYmUgYSB2YWxpZGF0b3IgYXQgb25jZS4gV2hlbpggIHNldCB0byBgTm9uZWAsIG5vIGxpbWl0IGlzIGVuZm9yY2VkLlkBKiBgY2hpbGxfdGhyZXNob2xkYDogVGhlIHJhdGlvIG9mIGBtYXhfbm9taW5hdG9yX2NvdW50YCBvciBgbWF4X3ZhbGlkYXRvcl9jb3VudGAgd2hpY2gZASAgc2hvdWxkIGJlIGZpbGxlZCBpbiBvcmRlciBmb3IgdGhlIGBjaGlsbF9vdGhlcmAgdHJhbnNhY3Rpb24gdG8gd29yay5hASogYG1pbl9jb21taXNzaW9uYDogVGhlIG1pbmltdW0gYW1vdW50IG9mIGNvbW1pc3Npb24gdGhhdCBlYWNoIHZhbGlkYXRvcnMgbXVzdCBtYWludGFpbi5VASAgVGhpcyBpcyBjaGVja2VkIG9ubHkgdXBvbiBjYWxsaW5nIGB2YWxpZGF0ZWAuIEV4aXN0aW5nIHZhbGlkYXRvcnMgYXJlIG5vdCBhZmZlY3RlZC4AxFJ1bnRpbWVPcmlnaW4gbXVzdCBiZSBSb290IHRvIGNhbGwgdGhpcyBmdW5jdGlvbi4ANQFOT1RFOiBFeGlzdGluZyBub21pbmF0b3JzIGFuZCB2YWxpZGF0b3JzIHdpbGwgbm90IGJlIGFmZmVjdGVkIGJ5IHRoaXMgdXBkYXRlLhEBdG8ga2ljayBwZW9wbGUgdW5kZXIgdGhlIG5ldyBsaW1pdHMsIGBjaGlsbF9vdGhlcmAgc2hvdWxkIGJlIGNhbGxlZC4sY2hpbGxfb3RoZXIEARRzdGFzaAABMFQ6OkFjY291bnRJZAAXaEEBRGVjbGFyZSBhIGBjb250cm9sbGVyYCB0byBzdG9wIHBhcnRpY2lwYXRpbmcgYXMgZWl0aGVyIGEgdmFsaWRhdG9yIG9yIG5vbWluYXRvci4A2EVmZmVjdHMgd2lsbCBiZSBmZWx0IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIG5leHQgZXJhLgBBAVRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfLCBidXQgY2FuIGJlIGNhbGxlZCBieSBhbnlvbmUuAFkBSWYgdGhlIGNhbGxlciBpcyB0aGUgc2FtZSBhcyB0aGUgY29udHJvbGxlciBiZWluZyB0YXJnZXRlZCwgdGhlbiBubyBmdXJ0aGVyIGNoZWNrcyBhcmXYZW5mb3JjZWQsIGFuZCB0aGlzIGZ1bmN0aW9uIGJlaGF2ZXMganVzdCBsaWtlIGBjaGlsbGAuAF0BSWYgdGhlIGNhbGxlciBpcyBkaWZmZXJlbnQgdGhhbiB0aGUgY29udHJvbGxlciBiZWluZyB0YXJnZXRlZCwgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zMG11c3QgYmUgbWV0OgAdASogYGNvbnRyb2xsZXJgIG11c3QgYmVsb25nIHRvIGEgbm9taW5hdG9yIHdobyBoYXMgYmVjb21lIG5vbi1kZWNvZGFibGUsAAxPcjoAPQEqIEEgYENoaWxsVGhyZXNob2xkYCBtdXN0IGJlIHNldCBhbmQgY2hlY2tlZCB3aGljaCBkZWZpbmVzIGhvdyBjbG9zZSB0byB0aGUgbWF4VQEgIG5vbWluYXRvcnMgb3IgdmFsaWRhdG9ycyB3ZSBtdXN0IHJlYWNoIGJlZm9yZSB1c2VycyBjYW4gc3RhcnQgY2hpbGxpbmcgb25lLWFub3RoZXIuWQEqIEEgYE1heE5vbWluYXRvckNvdW50YCBhbmQgYE1heFZhbGlkYXRvckNvdW50YCBtdXN0IGJlIHNldCB3aGljaCBpcyB1c2VkIHRvIGRldGVybWluZZAgIGhvdyBjbG9zZSB3ZSBhcmUgdG8gdGhlIHRocmVzaG9sZC5dASogQSBgTWluTm9taW5hdG9yQm9uZGAgYW5kIGBNaW5WYWxpZGF0b3JCb25kYCBtdXN0IGJlIHNldCBhbmQgY2hlY2tlZCwgd2hpY2ggZGV0ZXJtaW5lc1EBICBpZiB0aGlzIGlzIGEgcGVyc29uIHRoYXQgc2hvdWxkIGJlIGNoaWxsZWQgYmVjYXVzZSB0aGV5IGhhdmUgbm90IG1ldCB0aGUgdGhyZXNob2xkQCAgYm9uZCByZXF1aXJlZC4AVQFUaGlzIGNhbiBiZSBoZWxwZnVsIGlmIGJvbmQgcmVxdWlyZW1lbnRzIGFyZSB1cGRhdGVkLCBhbmQgd2UgbmVlZCB0byByZW1vdmUgb2xkIHVzZXJzmHdobyBkbyBub3Qgc2F0aXNmeSB0aGVzZSByZXF1aXJlbWVudHMuaGZvcmNlX2FwcGx5X21pbl9jb21taXNzaW9uBAE8dmFsaWRhdG9yX3N0YXNoAAEwVDo6QWNjb3VudElkABgMRQFGb3JjZSBhIHZhbGlkYXRvciB0byBoYXZlIGF0IGxlYXN0IHRoZSBtaW5pbXVtIGNvbW1pc3Npb24uIFRoaXMgd2lsbCBub3QgYWZmZWN0IGFhAXZhbGlkYXRvciB3aG8gYWxyZWFkeSBoYXMgYSBjb21taXNzaW9uIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgbWluaW11bS4gQW55IGFjY291bnQ4Y2FuIGNhbGwgdGhpcy5Ic2V0X21pbl9jb21taXNzaW9uBAEMbmV3lAEcUGVyYmlsbAAZECUBU2V0cyB0aGUgbWluaW11bSBhbW91bnQgb2YgY29tbWlzc2lvbiB0aGF0IGVhY2ggdmFsaWRhdG9ycyBtdXN0IG1haW50YWluLgBZAVRoaXMgY2FsbCBoYXMgbG93ZXIgcHJpdmlsZWdlIHJlcXVpcmVtZW50cyB0aGFuIGBzZXRfc3Rha2luZ19jb25maWdgIGFuZCBjYW4gYmUgY2FsbGVkzGJ5IHRoZSBgVDo6QWRtaW5PcmlnaW5gLiBSb290IGNhbiBhbHdheXMgY2FsbCB0aGlzLlhwYXlvdXRfc3Rha2Vyc19ieV9wYWdlDAE8dmFsaWRhdG9yX3N0YXNoAAEwVDo6QWNjb3VudElkAAEMZXJhEAEgRXJhSW5kZXgAARBwYWdlEAEQUGFnZQAaRDEBUGF5IG91dCBhIHBhZ2Ugb2YgdGhlIHN0YWtlcnMgYmVoaW5kIGEgdmFsaWRhdG9yIGZvciB0aGUgZ2l2ZW4gZXJhIGFuZCBwYWdlLgDoLSBgdmFsaWRhdG9yX3N0YXNoYCBpcyB0aGUgc3Rhc2ggYWNjb3VudCBvZiB0aGUgdmFsaWRhdG9yLjEBLSBgZXJhYCBtYXkgYmUgYW55IGVyYSBiZXR3ZWVuIGBbY3VycmVudF9lcmEgLSBoaXN0b3J5X2RlcHRoOyBjdXJyZW50X2VyYV1gLjEBLSBgcGFnZWAgaXMgdGhlIHBhZ2UgaW5kZXggb2Ygbm9taW5hdG9ycyB0byBwYXkgb3V0IHdpdGggdmFsdWUgYmV0d2VlbiAwIGFuZLAgIGBudW1fbm9taW5hdG9ycyAvIFQ6Ok1heEV4cG9zdXJlUGFnZVNpemVgLgBVAVRoZSBvcmlnaW4gb2YgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uIEFueSBhY2NvdW50IGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24sIGV2ZW4gaWZ0aXQgaXMgbm90IG9uZSBvZiB0aGUgc3Rha2Vycy4APQFJZiBhIHZhbGlkYXRvciBoYXMgbW9yZSB0aGFuIFtgQ29uZmlnOjpNYXhFeHBvc3VyZVBhZ2VTaXplYF0gbm9taW5hdG9ycyBiYWNraW5nKQF0aGVtLCB0aGVuIHRoZSBsaXN0IG9mIG5vbWluYXRvcnMgaXMgcGFnZWQsIHdpdGggZWFjaCBwYWdlIGJlaW5nIGNhcHBlZCBhdFUBW2BDb25maWc6Ok1heEV4cG9zdXJlUGFnZVNpemVgLl0gSWYgYSB2YWxpZGF0b3IgaGFzIG1vcmUgdGhhbiBvbmUgcGFnZSBvZiBub21pbmF0b3JzLEkBdGhlIGNhbGwgbmVlZHMgdG8gYmUgbWFkZSBmb3IgZWFjaCBwYWdlIHNlcGFyYXRlbHkgaW4gb3JkZXIgZm9yIGFsbCB0aGUgbm9taW5hdG9yc1UBYmFja2luZyBhIHZhbGlkYXRvciB0byByZWNlaXZlIHRoZSByZXdhcmQuIFRoZSBub21pbmF0b3JzIGFyZSBub3Qgc29ydGVkIGFjcm9zcyBwYWdlc2EBYW5kIHNvIGl0IHNob3VsZCBub3QgYmUgYXNzdW1lZCB0aGUgaGlnaGVzdCBzdGFrZXIgd291bGQgYmUgb24gdGhlIHRvcG1vc3QgcGFnZSBhbmQgdmljZUkBdmVyc2EuIElmIHJld2FyZHMgYXJlIG5vdCBjbGFpbWVkIGluIFtgQ29uZmlnOjpIaXN0b3J5RGVwdGhgXSBlcmFzLCB0aGV5IGFyZSBsb3N0LjB1cGRhdGVfcGF5ZWUEAShjb250cm9sbGVyAAEwVDo6QWNjb3VudElkABsY4E1pZ3JhdGVzIGFuIGFjY291bnQncyBgUmV3YXJkRGVzdGluYXRpb246OkNvbnRyb2xsZXJgIHRvpGBSZXdhcmREZXN0aW5hdGlvbjo6QWNjb3VudChjb250cm9sbGVyKWAuAFEBRWZmZWN0cyB3aWxsIGJlIGZlbHQgaW5zdGFudGx5IChhcyBzb29uIGFzIHRoaXMgZnVuY3Rpb24gaXMgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSkuADEBVGhpcyB3aWxsIHdhaXZlIHRoZSB0cmFuc2FjdGlvbiBmZWUgaWYgdGhlIGBwYXllZWAgaXMgc3VjY2Vzc2Z1bGx5IG1pZ3JhdGVkLmhkZXByZWNhdGVfY29udHJvbGxlcl9iYXRjaAQBLGNvbnRyb2xsZXJz1QEB9EJvdW5kZWRWZWM8VDo6QWNjb3VudElkLCBUOjpNYXhDb250cm9sbGVyc0luRGVwcmVjYXRpb25CYXRjaD4AHBxdAVVwZGF0ZXMgYSBiYXRjaCBvZiBjb250cm9sbGVyIGFjY291bnRzIHRvIHRoZWlyIGNvcnJlc3BvbmRpbmcgc3Rhc2ggYWNjb3VudCBpZiB0aGV5IGFyZWEBbm90IHRoZSBzYW1lLiBJZ25vcmVzIGFueSBjb250cm9sbGVyIGFjY291bnRzIHRoYXQgZG8gbm90IGV4aXN0LCBhbmQgZG9lcyBub3Qgb3BlcmF0ZSBpZrh0aGUgc3Rhc2ggYW5kIGNvbnRyb2xsZXIgYXJlIGFscmVhZHkgdGhlIHNhbWUuAFEBRWZmZWN0cyB3aWxsIGJlIGZlbHQgaW5zdGFudGx5IChhcyBzb29uIGFzIHRoaXMgZnVuY3Rpb24gaXMgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSkuALRUaGUgZGlzcGF0Y2ggb3JpZ2luIG11c3QgYmUgYFQ6OkFkbWluT3JpZ2luYC44cmVzdG9yZV9sZWRnZXIQARRzdGFzaAABMFQ6OkFjY291bnRJZAABQG1heWJlX2NvbnRyb2xsZXLZAQFQT3B0aW9uPFQ6OkFjY291bnRJZD4AASxtYXliZV90b3RhbN0BAVBPcHRpb248QmFsYW5jZU9mPFQ+PgABPG1heWJlX3VubG9ja2luZ+EBARUBT3B0aW9uPEJvdW5kZWRWZWM8VW5sb2NrQ2h1bms8QmFsYW5jZU9mPFQ+PiwgVDo6Ck1heFVubG9ja2luZ0NodW5rcz4+AB0sBQFSZXN0b3JlcyB0aGUgc3RhdGUgb2YgYSBsZWRnZXIgd2hpY2ggaXMgaW4gYW4gaW5jb25zaXN0ZW50IHN0YXRlLgDcVGhlIHJlcXVpcmVtZW50cyB0byByZXN0b3JlIGEgbGVkZ2VyIGFyZSB0aGUgZm9sbG93aW5nOmQqIFRoZSBzdGFzaCBpcyBib25kZWQ7IG9yDQEqIFRoZSBzdGFzaCBpcyBub3QgYm9uZGVkIGJ1dCBpdCBoYXMgYSBzdGFraW5nIGxvY2sgbGVmdCBiZWhpbmQ7IG9yJQEqIElmIHRoZSBzdGFzaCBoYXMgYW4gYXNzb2NpYXRlZCBsZWRnZXIgYW5kIGl0cyBzdGF0ZSBpcyBpbmNvbnNpc3RlbnQ7IG9yHQEqIElmIHRoZSBsZWRnZXIgaXMgbm90IGNvcnJ1cHRlZCAqYnV0KiBpdHMgc3Rha2luZyBsb2NrIGlzIG91dCBvZiBzeW5jLgBhAVRoZSBgbWF5YmVfKmAgaW5wdXQgcGFyYW1ldGVycyB3aWxsIG92ZXJ3cml0ZSB0aGUgY29ycmVzcG9uZGluZyBkYXRhIGFuZCBtZXRhZGF0YSBvZiB0aGVZAWxlZGdlciBhc3NvY2lhdGVkIHdpdGggdGhlIHN0YXNoLiBJZiB0aGUgaW5wdXQgcGFyYW1ldGVycyBhcmUgbm90IHNldCwgdGhlIGxlZGdlciB3aWxskGJlIHJlc2V0IHZhbHVlcyBmcm9tIG9uLWNoYWluIHN0YXRlLgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy65AQAAAp0BAL0BDDRzcF9hcml0aG1ldGljKHBlcl90aGluZ3McUGVyY2VudAAABAAIAQh1OAAAwQEAAAIQAMUBEDhwYWxsZXRfc3Rha2luZxhwYWxsZXQYcGFsbGV0IENvbmZpZ09wBARUARgBDBBOb29wAAAADFNldAQAGAEEVAABABhSZW1vdmUAAgAAyQEQOHBhbGxldF9zdGFraW5nGHBhbGxldBhwYWxsZXQgQ29uZmlnT3AEBFQBEAEMEE5vb3AAAAAMU2V0BAAQAQRUAAEAGFJlbW92ZQACAADNARA4cGFsbGV0X3N0YWtpbmcYcGFsbGV0GHBhbGxldCBDb25maWdPcAQEVAG9AQEMEE5vb3AAAAAMU2V0BAC9AQEEVAABABhSZW1vdmUAAgAA0QEQOHBhbGxldF9zdGFraW5nGHBhbGxldBhwYWxsZXQgQ29uZmlnT3AEBFQBlAEMEE5vb3AAAAAMU2V0BACUAQRUAAEAGFJlbW92ZQACAADVAQxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAQAEUwAABACtAQEYVmVjPFQ+AADZAQQYT3B0aW9uBARUAQABCBBOb25lAAAAEFNvbWUEAAAAAAEAAN0BBBhPcHRpb24EBFQBGAEIEE5vbmUAAAAQU29tZQQAGAAAAQAA4QEEGE9wdGlvbgQEVAHlAQEIEE5vbmUAAAAQU29tZQQA5QEAAAEAAOUBDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQB6QEEUwAABADtAQEYVmVjPFQ+AADpAQg4cGFsbGV0X3N0YWtpbmcsVW5sb2NrQ2h1bmsEHEJhbGFuY2UBGAAIARR2YWx1ZeQBHEJhbGFuY2UAAQxlcmHUASBFcmFJbmRleAAA7QEAAALpAQDxAQw4cGFsbGV0X3Nlc3Npb24YcGFsbGV0EENhbGwEBFQAAQggc2V0X2tleXMIARBrZXlz9QEBHFQ6OktleXMAARRwcm9vZjgBHFZlYzx1OD4AACTkU2V0cyB0aGUgc2Vzc2lvbiBrZXkocykgb2YgdGhlIGZ1bmN0aW9uIGNhbGxlciB0byBga2V5c2AuHQFBbGxvd3MgYW4gYWNjb3VudCB0byBzZXQgaXRzIHNlc3Npb24ga2V5IHByaW9yIHRvIGJlY29taW5nIGEgdmFsaWRhdG9yLsBUaGlzIGRvZXNuJ3QgdGFrZSBlZmZlY3QgdW50aWwgdGhlIG5leHQgc2Vzc2lvbi4A0FRoZSBkaXNwYXRjaCBvcmlnaW4gb2YgdGhpcyBmdW5jdGlvbiBtdXN0IGJlIHNpZ25lZC4ANCMjIENvbXBsZXhpdHlZAS0gYE8oMSlgLiBBY3R1YWwgY29zdCBkZXBlbmRzIG9uIHRoZSBudW1iZXIgb2YgbGVuZ3RoIG9mIGBUOjpLZXlzOjprZXlfaWRzKClgIHdoaWNoIGlzICAgZml4ZWQuKHB1cmdlX2tleXMAATDIUmVtb3ZlcyBhbnkgc2Vzc2lvbiBrZXkocykgb2YgdGhlIGZ1bmN0aW9uIGNhbGxlci4AwFRoaXMgZG9lc24ndCB0YWtlIGVmZmVjdCB1bnRpbCB0aGUgbmV4dCBzZXNzaW9uLgBVAVRoZSBkaXNwYXRjaCBvcmlnaW4gb2YgdGhpcyBmdW5jdGlvbiBtdXN0IGJlIFNpZ25lZCBhbmQgdGhlIGFjY291bnQgbXVzdCBiZSBlaXRoZXIgYmVdAWNvbnZlcnRpYmxlIHRvIGEgdmFsaWRhdG9yIElEIHVzaW5nIHRoZSBjaGFpbidzIHR5cGljYWwgYWRkcmVzc2luZyBzeXN0ZW0gKHRoaXMgdXN1YWxseVEBbWVhbnMgYmVpbmcgYSBjb250cm9sbGVyIGFjY291bnQpIG9yIGRpcmVjdGx5IGNvbnZlcnRpYmxlIGludG8gYSB2YWxpZGF0b3IgSUQgKHdoaWNolHVzdWFsbHkgbWVhbnMgYmVpbmcgYSBzdGFzaCBhY2NvdW50KS4ANCMjIENvbXBsZXhpdHk9AS0gYE8oMSlgIGluIG51bWJlciBvZiBrZXkgdHlwZXMuIEFjdHVhbCBjb3N0IGRlcGVuZHMgb24gdGhlIG51bWJlciBvZiBsZW5ndGggb2aYICBgVDo6S2V5czo6a2V5X2lkcygpYCB3aGljaCBpcyBmaXhlZC4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMu9QEIWHN0YWdpbmdfa3VzYW1hX3J1bnRpbWUsU2Vzc2lvbktleXMAABgBHGdyYW5kcGG8AdA8R3JhbmRwYSBhcyAkY3JhdGU6OkJvdW5kVG9SdW50aW1lQXBwUHVibGljPjo6UHVibGljAAEQYmFiZX0BAcQ8QmFiZSBhcyAkY3JhdGU6OkJvdW5kVG9SdW50aW1lQXBwUHVibGljPjo6UHVibGljAAE4cGFyYV92YWxpZGF0b3L5AQHgPEluaXRpYWxpemVyIGFzICRjcmF0ZTo6Qm91bmRUb1J1bnRpbWVBcHBQdWJsaWM+OjpQdWJsaWMAATxwYXJhX2Fzc2lnbm1lbnT9AQHwPFBhcmFTZXNzaW9uSW5mbyBhcyAkY3JhdGU6OkJvdW5kVG9SdW50aW1lQXBwUHVibGljPjo6UHVibGljAAFMYXV0aG9yaXR5X2Rpc2NvdmVyeQECAfw8QXV0aG9yaXR5RGlzY292ZXJ5IGFzICRjcmF0ZTo6Qm91bmRUb1J1bnRpbWVBcHBQdWJsaWM+OjpQdWJsaWMAARRiZWVmeQUCAcg8QmVlZnkgYXMgJGNyYXRlOjpCb3VuZFRvUnVudGltZUFwcFB1YmxpYz46OlB1YmxpYwAA+QEQTHBvbGthZG90X3ByaW1pdGl2ZXMIdjc0dmFsaWRhdG9yX2FwcBhQdWJsaWMAAAQABAE8c3IyNTUxOTo6UHVibGljAAD9ARBMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2Nzhhc3NpZ25tZW50X2FwcBhQdWJsaWMAAAQABAE8c3IyNTUxOTo6UHVibGljAAABAgxYc3BfYXV0aG9yaXR5X2Rpc2NvdmVyeQxhcHAYUHVibGljAAAEAAQBPHNyMjU1MTk6OlB1YmxpYwAABQIMSHNwX2NvbnNlbnN1c19iZWVmeTBlY2RzYV9jcnlwdG8YUHVibGljAAAEAAkCATRlY2RzYTo6UHVibGljAAAJAgAAAyEAAAAIAA0CDDhwYWxsZXRfZ3JhbmRwYRhwYWxsZXQQQ2FsbAQEVAABDExyZXBvcnRfZXF1aXZvY2F0aW9uCAFIZXF1aXZvY2F0aW9uX3Byb29mEQIByEJveDxFcXVpdm9jYXRpb25Qcm9vZjxUOjpIYXNoLCBCbG9ja051bWJlckZvcjxUPj4+AAE8a2V5X293bmVyX3Byb29mhQEBQFQ6OktleU93bmVyUHJvb2YAABAJAVJlcG9ydCB2b3RlciBlcXVpdm9jYXRpb24vbWlzYmVoYXZpb3IuIFRoaXMgbWV0aG9kIHdpbGwgdmVyaWZ5IHRoZfRlcXVpdm9jYXRpb24gcHJvb2YgYW5kIHZhbGlkYXRlIHRoZSBnaXZlbiBrZXkgb3duZXJzaGlwIHByb29m+GFnYWluc3QgdGhlIGV4dHJhY3RlZCBvZmZlbmRlci4gSWYgYm90aCBhcmUgdmFsaWQsIHRoZSBvZmZlbmNlRHdpbGwgYmUgcmVwb3J0ZWQucHJlcG9ydF9lcXVpdm9jYXRpb25fdW5zaWduZWQIAUhlcXVpdm9jYXRpb25fcHJvb2YRAgHIQm94PEVxdWl2b2NhdGlvblByb29mPFQ6Okhhc2gsIEJsb2NrTnVtYmVyRm9yPFQ+Pj4AATxrZXlfb3duZXJfcHJvb2aFAQFAVDo6S2V5T3duZXJQcm9vZgABJAkBUmVwb3J0IHZvdGVyIGVxdWl2b2NhdGlvbi9taXNiZWhhdmlvci4gVGhpcyBtZXRob2Qgd2lsbCB2ZXJpZnkgdGhl9GVxdWl2b2NhdGlvbiBwcm9vZiBhbmQgdmFsaWRhdGUgdGhlIGdpdmVuIGtleSBvd25lcnNoaXAgcHJvb2b4YWdhaW5zdCB0aGUgZXh0cmFjdGVkIG9mZmVuZGVyLiBJZiBib3RoIGFyZSB2YWxpZCwgdGhlIG9mZmVuY2VEd2lsbCBiZSByZXBvcnRlZC4ADQFUaGlzIGV4dHJpbnNpYyBtdXN0IGJlIGNhbGxlZCB1bnNpZ25lZCBhbmQgaXQgaXMgZXhwZWN0ZWQgdGhhdCBvbmx5FQFibG9jayBhdXRob3JzIHdpbGwgY2FsbCBpdCAodmFsaWRhdGVkIGluIGBWYWxpZGF0ZVVuc2lnbmVkYCksIGFzIHN1Y2gVAWlmIHRoZSBibG9jayBhdXRob3IgaXMgZGVmaW5lZCBpdCB3aWxsIGJlIGRlZmluZWQgYXMgdGhlIGVxdWl2b2NhdGlvbiRyZXBvcnRlci4wbm90ZV9zdGFsbGVkCAEUZGVsYXkQAURCbG9ja051bWJlckZvcjxUPgABbGJlc3RfZmluYWxpemVkX2Jsb2NrX251bWJlchABREJsb2NrTnVtYmVyRm9yPFQ+AAIwPQFOb3RlIHRoYXQgdGhlIGN1cnJlbnQgYXV0aG9yaXR5IHNldCBvZiB0aGUgR1JBTkRQQSBmaW5hbGl0eSBnYWRnZXQgaGFzIHN0YWxsZWQuAGEBVGhpcyB3aWxsIHRyaWdnZXIgYSBmb3JjZWQgYXV0aG9yaXR5IHNldCBjaGFuZ2UgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbmV4dCBzZXNzaW9uLCB0b2EBYmUgZW5hY3RlZCBgZGVsYXlgIGJsb2NrcyBhZnRlciB0aGF0LiBUaGUgYGRlbGF5YCBzaG91bGQgYmUgaGlnaCBlbm91Z2ggdG8gc2FmZWx5IGFzc3VtZUkBdGhhdCB0aGUgYmxvY2sgc2lnbmFsbGluZyB0aGUgZm9yY2VkIGNoYW5nZSB3aWxsIG5vdCBiZSByZS1vcmdlZCBlLmcuIDEwMDAgYmxvY2tzLl0BVGhlIGJsb2NrIHByb2R1Y3Rpb24gcmF0ZSAod2hpY2ggbWF5IGJlIHNsb3dlZCBkb3duIGJlY2F1c2Ugb2YgZmluYWxpdHkgbGFnZ2luZykgc2hvdWxkUQFiZSB0YWtlbiBpbnRvIGFjY291bnQgd2hlbiBjaG9vc2luZyB0aGUgYGRlbGF5YC4gVGhlIEdSQU5EUEEgdm90ZXJzIGJhc2VkIG9uIHRoZSBuZXdVAWF1dGhvcml0eSB3aWxsIHN0YXJ0IHZvdGluZyBvbiB0b3Agb2YgYGJlc3RfZmluYWxpemVkX2Jsb2NrX251bWJlcmAgZm9yIG5ldyBmaW5hbGl6ZWRNAWJsb2Nrcy4gYGJlc3RfZmluYWxpemVkX2Jsb2NrX251bWJlcmAgc2hvdWxkIGJlIHRoZSBoaWdoZXN0IG9mIHRoZSBsYXRlc3QgZmluYWxpemVkxGJsb2NrIG9mIGFsbCB2YWxpZGF0b3JzIG9mIHRoZSBuZXcgYXV0aG9yaXR5IHNldC4AWE9ubHkgY2FsbGFibGUgYnkgcm9vdC4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMuEQIIUHNwX2NvbnNlbnN1c19ncmFuZHBhREVxdWl2b2NhdGlvblByb29mCARIATQETgEQAAgBGHNldF9pZDABFFNldElkAAEwZXF1aXZvY2F0aW9uFQIBSEVxdWl2b2NhdGlvbjxILCBOPgAAFQIIUHNwX2NvbnNlbnN1c19ncmFuZHBhMEVxdWl2b2NhdGlvbggESAE0BE4BEAEIHFByZXZvdGUEABkCAYkBZmluYWxpdHlfZ3JhbmRwYTo6RXF1aXZvY2F0aW9uPEF1dGhvcml0eUlkLCBmaW5hbGl0eV9ncmFuZHBhOjpQcmV2b3RlPApILCBOPiwgQXV0aG9yaXR5U2lnbmF0dXJlLD4AAAAkUHJlY29tbWl0BAAtAgGRAWZpbmFsaXR5X2dyYW5kcGE6OkVxdWl2b2NhdGlvbjxBdXRob3JpdHlJZCwgZmluYWxpdHlfZ3JhbmRwYTo6UHJlY29tbWl0CjxILCBOPiwgQXV0aG9yaXR5U2lnbmF0dXJlLD4AAQAAGQIIQGZpbmFsaXR5X2dyYW5kcGEwRXF1aXZvY2F0aW9uDAhJZAG8BFYBHQIEUwEhAgAQATByb3VuZF9udW1iZXIwAQx1NjQAASBpZGVudGl0ebwBCElkAAEUZmlyc3QpAgEYKFYsIFMpAAEYc2Vjb25kKQIBGChWLCBTKQAAHQIIQGZpbmFsaXR5X2dyYW5kcGEcUHJldm90ZQgESAE0BE4BEAAIASx0YXJnZXRfaGFzaDQBBEgAATR0YXJnZXRfbnVtYmVyEAEETgAAIQIMUHNwX2NvbnNlbnN1c19ncmFuZHBhDGFwcCRTaWduYXR1cmUAAAQAJQIBSGVkMjU1MTk6OlNpZ25hdHVyZQAAJQIAAANAAAAACAApAgAABAgdAiECAC0CCEBmaW5hbGl0eV9ncmFuZHBhMEVxdWl2b2NhdGlvbgwISWQBvARWATECBFMBIQIAEAEwcm91bmRfbnVtYmVyMAEMdTY0AAEgaWRlbnRpdHm8AQhJZAABFGZpcnN0NQIBGChWLCBTKQABGHNlY29uZDUCARgoViwgUykAADECCEBmaW5hbGl0eV9ncmFuZHBhJFByZWNvbW1pdAgESAE0BE4BEAAIASx0YXJnZXRfaGFzaDQBBEgAATR0YXJnZXRfbnVtYmVyEAEETgAANQIAAAQIMQIhAgA5Agw8cGFsbGV0X3RyZWFzdXJ5GHBhbGxldBBDYWxsCARUAARJAAEYLHNwZW5kX2xvY2FsCAEYYW1vdW505AE8QmFsYW5jZU9mPFQsIEk+AAEsYmVuZWZpY2lhcnmdAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AA0S4UHJvcG9zZSBhbmQgYXBwcm92ZSBhIHNwZW5kIG9mIHRyZWFzdXJ5IGZ1bmRzLgBIIyMgRGlzcGF0Y2ggT3JpZ2luAEUBTXVzdCBiZSBbYENvbmZpZzo6U3BlbmRPcmlnaW5gXSB3aXRoIHRoZSBgU3VjY2Vzc2AgdmFsdWUgYmVpbmcgYXQgbGVhc3QgYGFtb3VudGAuACwjIyMgRGV0YWlsc0UBTk9URTogRm9yIHJlY29yZC1rZWVwaW5nIHB1cnBvc2VzLCB0aGUgcHJvcG9zZXIgaXMgZGVlbWVkIHRvIGJlIGVxdWl2YWxlbnQgdG8gdGhlMGJlbmVmaWNpYXJ5LgA4IyMjIFBhcmFtZXRlcnNBAS0gYGFtb3VudGA6IFRoZSBhbW91bnQgdG8gYmUgdHJhbnNmZXJyZWQgZnJvbSB0aGUgdHJlYXN1cnkgdG8gdGhlIGBiZW5lZmljaWFyeWAu6C0gYGJlbmVmaWNpYXJ5YDogVGhlIGRlc3RpbmF0aW9uIGFjY291bnQgZm9yIHRoZSB0cmFuc2Zlci4AJCMjIEV2ZW50cwC0RW1pdHMgW2BFdmVudDo6U3BlbmRBcHByb3ZlZGBdIGlmIHN1Y2Nlc3NmdWwuPHJlbW92ZV9hcHByb3ZhbAQBLHByb3Bvc2FsX2lk1AE0UHJvcG9zYWxJbmRleAAEVC0BRm9yY2UgYSBwcmV2aW91c2x5IGFwcHJvdmVkIHByb3Bvc2FsIHRvIGJlIHJlbW92ZWQgZnJvbSB0aGUgYXBwcm92YWwgcXVldWUuAEgjIyBEaXNwYXRjaCBPcmlnaW4AhE11c3QgYmUgW2BDb25maWc6OlJlamVjdE9yaWdpbmBdLgAoIyMgRGV0YWlscwDAVGhlIG9yaWdpbmFsIGRlcG9zaXQgd2lsbCBubyBsb25nZXIgYmUgcmV0dXJuZWQuADgjIyMgUGFyYW1ldGVyc6AtIGBwcm9wb3NhbF9pZGA6IFRoZSBpbmRleCBvZiBhIHByb3Bvc2FsADgjIyMgQ29tcGxleGl0eawtIE8oQSkgd2hlcmUgYEFgIGlzIHRoZSBudW1iZXIgb2YgYXBwcm92YWxzACgjIyMgRXJyb3JzRQEtIFtgRXJyb3I6OlByb3Bvc2FsTm90QXBwcm92ZWRgXTogVGhlIGBwcm9wb3NhbF9pZGAgc3VwcGxpZWQgd2FzIG5vdCBmb3VuZCBpbiB0aGVRASAgYXBwcm92YWwgcXVldWUsIGkuZS4sIHRoZSBwcm9wb3NhbCBoYXMgbm90IGJlZW4gYXBwcm92ZWQuIFRoaXMgY291bGQgYWxzbyBtZWFuIHRoZVkBICBwcm9wb3NhbCBkb2VzIG5vdCBleGlzdCBhbHRvZ2V0aGVyLCB0aHVzIHRoZXJlIGlzIG5vIHdheSBpdCB3b3VsZCBoYXZlIGJlZW4gYXBwcm92ZWRUICBpbiB0aGUgZmlyc3QgcGxhY2UuFHNwZW5kEAEoYXNzZXRfa2luZMQBREJveDxUOjpBc3NldEtpbmQ+AAEYYW1vdW505AFQQXNzZXRCYWxhbmNlT2Y8VCwgST4AASxiZW5lZmljaWFyeS0BAXhCb3g8QmVuZWZpY2lhcnlMb29rdXBPZjxULCBJPj4AASh2YWxpZF9mcm9tPQIBZE9wdGlvbjxCbG9ja051bWJlckZvcjxUPj4ABWi4UHJvcG9zZSBhbmQgYXBwcm92ZSBhIHNwZW5kIG9mIHRyZWFzdXJ5IGZ1bmRzLgBIIyMgRGlzcGF0Y2ggT3JpZ2luAB0BTXVzdCBiZSBbYENvbmZpZzo6U3BlbmRPcmlnaW5gXSB3aXRoIHRoZSBgU3VjY2Vzc2AgdmFsdWUgYmVpbmcgYXQgbGVhc3RVAWBhbW91bnRgIG9mIGBhc3NldF9raW5kYCBpbiB0aGUgbmF0aXZlIGFzc2V0LiBUaGUgYW1vdW50IG9mIGBhc3NldF9raW5kYCBpcyBjb252ZXJ0ZWTUZm9yIGFzc2VydGlvbiB1c2luZyB0aGUgW2BDb25maWc6OkJhbGFuY2VDb252ZXJ0ZXJgXS4AKCMjIERldGFpbHMASQFDcmVhdGUgYW4gYXBwcm92ZWQgc3BlbmQgZm9yIHRyYW5zZmVycmluZyBhIHNwZWNpZmljIGBhbW91bnRgIG9mIGBhc3NldF9raW5kYCB0byBhYQFkZXNpZ25hdGVkIGJlbmVmaWNpYXJ5LiBUaGUgc3BlbmQgbXVzdCBiZSBjbGFpbWVkIHVzaW5nIHRoZSBgcGF5b3V0YCBkaXNwYXRjaGFibGUgd2l0aGludHRoZSBbYENvbmZpZzo6UGF5b3V0UGVyaW9kYF0uADgjIyMgUGFyYW1ldGVycxUBLSBgYXNzZXRfa2luZGA6IEFuIGluZGljYXRvciBvZiB0aGUgc3BlY2lmaWMgYXNzZXQgY2xhc3MgdG8gYmUgc3BlbnQuQQEtIGBhbW91bnRgOiBUaGUgYW1vdW50IHRvIGJlIHRyYW5zZmVycmVkIGZyb20gdGhlIHRyZWFzdXJ5IHRvIHRoZSBgYmVuZWZpY2lhcnlgLrgtIGBiZW5lZmljaWFyeWA6IFRoZSBiZW5lZmljaWFyeSBvZiB0aGUgc3BlbmQuVQEtIGB2YWxpZF9mcm9tYDogVGhlIGJsb2NrIG51bWJlciBmcm9tIHdoaWNoIHRoZSBzcGVuZCBjYW4gYmUgY2xhaW1lZC4gSXQgY2FuIHJlZmVyIHRvGQEgIHRoZSBwYXN0IGlmIHRoZSByZXN1bHRpbmcgc3BlbmQgaGFzIG5vdCB5ZXQgZXhwaXJlZCBhY2NvcmRpbmcgdG8gdGhlRQEgIFtgQ29uZmlnOjpQYXlvdXRQZXJpb2RgXS4gSWYgYE5vbmVgLCB0aGUgc3BlbmQgY2FuIGJlIGNsYWltZWQgaW1tZWRpYXRlbHkgYWZ0ZXIsICBhcHByb3ZhbC4AJCMjIEV2ZW50cwDIRW1pdHMgW2BFdmVudDo6QXNzZXRTcGVuZEFwcHJvdmVkYF0gaWYgc3VjY2Vzc2Z1bC4YcGF5b3V0BAEUaW5kZXgQAShTcGVuZEluZGV4AAZMOENsYWltIGEgc3BlbmQuAEgjIyBEaXNwYXRjaCBPcmlnaW4AOE11c3QgYmUgc2lnbmVkACgjIyBEZXRhaWxzAFUBU3BlbmRzIG11c3QgYmUgY2xhaW1lZCB3aXRoaW4gc29tZSB0ZW1wb3JhbCBib3VuZHMuIEEgc3BlbmQgbWF5IGJlIGNsYWltZWQgd2l0aGluIG9uZdRbYENvbmZpZzo6UGF5b3V0UGVyaW9kYF0gZnJvbSB0aGUgYHZhbGlkX2Zyb21gIGJsb2NrLlUBSW4gY2FzZSBvZiBhIHBheW91dCBmYWlsdXJlLCB0aGUgc3BlbmQgc3RhdHVzIG11c3QgYmUgdXBkYXRlZCB3aXRoIHRoZSBgY2hlY2tfc3RhdHVzYNxkaXNwYXRjaGFibGUgYmVmb3JlIHJldHJ5aW5nIHdpdGggdGhlIGN1cnJlbnQgZnVuY3Rpb24uADgjIyMgUGFyYW1ldGVyc2wtIGBpbmRleGA6IFRoZSBzcGVuZCBpbmRleC4AJCMjIEV2ZW50cwCQRW1pdHMgW2BFdmVudDo6UGFpZGBdIGlmIHN1Y2Nlc3NmdWwuMGNoZWNrX3N0YXR1cwQBFGluZGV4EAEoU3BlbmRJbmRleAAHTCkBQ2hlY2sgdGhlIHN0YXR1cyBvZiB0aGUgc3BlbmQgYW5kIHJlbW92ZSBpdCBmcm9tIHRoZSBzdG9yYWdlIGlmIHByb2Nlc3NlZC4ASCMjIERpc3BhdGNoIE9yaWdpbgA8TXVzdCBiZSBzaWduZWQuACgjIyBEZXRhaWxzAAEBVGhlIHN0YXR1cyBjaGVjayBpcyBhIHByZXJlcXVpc2l0ZSBmb3IgcmV0cnlpbmcgYSBmYWlsZWQgcGF5b3V0LkkBSWYgYSBzcGVuZCBoYXMgZWl0aGVyIHN1Y2NlZWRlZCBvciBleHBpcmVkLCBpdCBpcyByZW1vdmVkIGZyb20gdGhlIHN0b3JhZ2UgYnkgdGhpc+xmdW5jdGlvbi4gSW4gc3VjaCBpbnN0YW5jZXMsIHRyYW5zYWN0aW9uIGZlZXMgYXJlIHJlZnVuZGVkLgA4IyMjIFBhcmFtZXRlcnNsLSBgaW5kZXhgOiBUaGUgc3BlbmQgaW5kZXguACQjIyBFdmVudHMA+EVtaXRzIFtgRXZlbnQ6OlBheW1lbnRGYWlsZWRgXSBpZiB0aGUgc3BlbmQgcGF5b3V0IGhhcyBmYWlsZWQuAQFFbWl0cyBbYEV2ZW50OjpTcGVuZFByb2Nlc3NlZGBdIGlmIHRoZSBzcGVuZCBwYXlvdXQgaGFzIHN1Y2NlZWQuKHZvaWRfc3BlbmQEARRpbmRleBABKFNwZW5kSW5kZXgACEB8Vm9pZCBwcmV2aW91c2x5IGFwcHJvdmVkIHNwZW5kLgBIIyMgRGlzcGF0Y2ggT3JpZ2luAIRNdXN0IGJlIFtgQ29uZmlnOjpSZWplY3RPcmlnaW5gXS4AKCMjIERldGFpbHMAHQFBIHNwZW5kIHZvaWQgaXMgb25seSBwb3NzaWJsZSBpZiB0aGUgcGF5b3V0IGhhcyBub3QgYmVlbiBhdHRlbXB0ZWQgeWV0LgA4IyMjIFBhcmFtZXRlcnNsLSBgaW5kZXhgOiBUaGUgc3BlbmQgaW5kZXguACQjIyBFdmVudHMAwEVtaXRzIFtgRXZlbnQ6OkFzc2V0U3BlbmRWb2lkZWRgXSBpZiBzdWNjZXNzZnVsLgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy49AgQYT3B0aW9uBARUARABCBBOb25lAAAAEFNvbWUEABAAAAEAAEECDGBwYWxsZXRfY29udmljdGlvbl92b3RpbmcYcGFsbGV0EENhbGwIBFQABEkAARgQdm90ZQgBKHBvbGxfaW5kZXjUAURQb2xsSW5kZXhPZjxULCBJPgABEHZvdGVFAgFwQWNjb3VudFZvdGU8QmFsYW5jZU9mPFQsIEk+PgAAJBkBVm90ZSBpbiBhIHBvbGwuIElmIGB2b3RlLmlzX2F5ZSgpYCwgdGhlIHZvdGUgaXMgdG8gZW5hY3QgdGhlIHByb3Bvc2FsO7hvdGhlcndpc2UgaXQgaXMgYSB2b3RlIHRvIGtlZXAgdGhlIHN0YXR1cyBxdW8uAMhUaGUgZGlzcGF0Y2ggb3JpZ2luIG9mIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfLgDILSBgcG9sbF9pbmRleGA6IFRoZSBpbmRleCBvZiB0aGUgcG9sbCB0byB2b3RlIGZvci6ELSBgdm90ZWA6IFRoZSB2b3RlIGNvbmZpZ3VyYXRpb24uABUBV2VpZ2h0OiBgTyhSKWAgd2hlcmUgUiBpcyB0aGUgbnVtYmVyIG9mIHBvbGxzIHRoZSB2b3RlciBoYXMgdm90ZWQgb24uIGRlbGVnYXRlEAEUY2xhc3NVAQE0Q2xhc3NPZjxULCBJPgABCHRvnQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEoY29udmljdGlvbk0CAShDb252aWN0aW9uAAEcYmFsYW5jZRgBPEJhbGFuY2VPZjxULCBJPgABXE0BRGVsZWdhdGUgdGhlIHZvdGluZyBwb3dlciAod2l0aCBzb21lIGdpdmVuIGNvbnZpY3Rpb24pIG9mIHRoZSBzZW5kaW5nIGFjY291bnQgZm9yIGFocGFydGljdWxhciBjbGFzcyBvZiBwb2xscy4AVQFUaGUgYmFsYW5jZSBkZWxlZ2F0ZWQgaXMgbG9ja2VkIGZvciBhcyBsb25nIGFzIGl0J3MgZGVsZWdhdGVkLCBhbmQgdGhlcmVhZnRlciBmb3IgdGhlyHRpbWUgYXBwcm9wcmlhdGUgZm9yIHRoZSBjb252aWN0aW9uJ3MgbG9jayBwZXJpb2QuAF0BVGhlIGRpc3BhdGNoIG9yaWdpbiBvZiB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXywgYW5kIHRoZSBzaWduaW5nIGFjY291bnQgbXVzdCBlaXRoZXI6dCAgLSBiZSBkZWxlZ2F0aW5nIGFscmVhZHk7IG9yRQEgIC0gaGF2ZSBubyB2b3RpbmcgYWN0aXZpdHkgKGlmIHRoZXJlIGlzLCB0aGVuIGl0IHdpbGwgbmVlZCB0byBiZSByZW1vdmVkIHRocm91Z2hMICAgIGByZW1vdmVfdm90ZWApLgBFAS0gYHRvYDogVGhlIGFjY291bnQgd2hvc2Ugdm90aW5nIHRoZSBgdGFyZ2V0YCBhY2NvdW50J3Mgdm90aW5nIHBvd2VyIHdpbGwgZm9sbG93Ll0BLSBgY2xhc3NgOiBUaGUgY2xhc3Mgb2YgcG9sbHMgdG8gZGVsZWdhdGUuIFRvIGRlbGVnYXRlIG11bHRpcGxlIGNsYXNzZXMsIG11bHRpcGxlIGNhbGxzgCAgdG8gdGhpcyBmdW5jdGlvbiBhcmUgcmVxdWlyZWQuVQEtIGBjb252aWN0aW9uYDogVGhlIGNvbnZpY3Rpb24gdGhhdCB3aWxsIGJlIGF0dGFjaGVkIHRvIHRoZSBkZWxlZ2F0ZWQgdm90ZXMuIFdoZW4gdGhlQQEgIGFjY291bnQgaXMgdW5kZWxlZ2F0ZWQsIHRoZSBmdW5kcyB3aWxsIGJlIGxvY2tlZCBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgcGVyaW9kLmEBLSBgYmFsYW5jZWA6IFRoZSBhbW91bnQgb2YgdGhlIGFjY291bnQncyBiYWxhbmNlIHRvIGJlIHVzZWQgaW4gZGVsZWdhdGluZy4gVGhpcyBtdXN0IG5vdLQgIGJlIG1vcmUgdGhhbiB0aGUgYWNjb3VudCdzIGN1cnJlbnQgYmFsYW5jZS4ASEVtaXRzIGBEZWxlZ2F0ZWRgLgAlAVdlaWdodDogYE8oUilgIHdoZXJlIFIgaXMgdGhlIG51bWJlciBvZiBwb2xscyB0aGUgdm90ZXIgZGVsZWdhdGluZyB0byBoYXNNASAgdm90ZWQgb24uIFdlaWdodCBpcyBpbml0aWFsbHkgY2hhcmdlZCBhcyBpZiBtYXhpbXVtIHZvdGVzLCBidXQgaXMgcmVmdW5kZWQgbGF0ZXIuKHVuZGVsZWdhdGUEARRjbGFzc1UBATRDbGFzc09mPFQsIEk+AAI4TQFVbmRlbGVnYXRlIHRoZSB2b3RpbmcgcG93ZXIgb2YgdGhlIHNlbmRpbmcgYWNjb3VudCBmb3IgYSBwYXJ0aWN1bGFyIGNsYXNzIG9mIHBvbGxzLgBdAVRva2VucyBtYXkgYmUgdW5sb2NrZWQgZm9sbG93aW5nIG9uY2UgYW4gYW1vdW50IG9mIHRpbWUgY29uc2lzdGVudCB3aXRoIHRoZSBsb2NrIHBlcmlvZAkBb2YgdGhlIGNvbnZpY3Rpb24gd2l0aCB3aGljaCB0aGUgZGVsZWdhdGlvbiB3YXMgaXNzdWVkIGhhcyBwYXNzZWQuAEUBVGhlIGRpc3BhdGNoIG9yaWdpbiBvZiB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXyBhbmQgdGhlIHNpZ25pbmcgYWNjb3VudCBtdXN0IGJlVGN1cnJlbnRseSBkZWxlZ2F0aW5nLgDwLSBgY2xhc3NgOiBUaGUgY2xhc3Mgb2YgcG9sbHMgdG8gcmVtb3ZlIHRoZSBkZWxlZ2F0aW9uIGZyb20uAFBFbWl0cyBgVW5kZWxlZ2F0ZWRgLgAlAVdlaWdodDogYE8oUilgIHdoZXJlIFIgaXMgdGhlIG51bWJlciBvZiBwb2xscyB0aGUgdm90ZXIgZGVsZWdhdGluZyB0byBoYXNNASAgdm90ZWQgb24uIFdlaWdodCBpcyBpbml0aWFsbHkgY2hhcmdlZCBhcyBpZiBtYXhpbXVtIHZvdGVzLCBidXQgaXMgcmVmdW5kZWQgbGF0ZXIuGHVubG9jawgBFGNsYXNzVQEBNENsYXNzT2Y8VCwgST4AARh0YXJnZXSdAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AAyRdAVJlbW92ZSB0aGUgbG9jayBjYXVzZWQgYnkgcHJpb3Igdm90aW5nL2RlbGVnYXRpbmcgd2hpY2ggaGFzIGV4cGlyZWQgd2l0aGluIGEgcGFydGljdWxhchhjbGFzcy4AyFRoZSBkaXNwYXRjaCBvcmlnaW4gb2YgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uAKAtIGBjbGFzc2A6IFRoZSBjbGFzcyBvZiBwb2xscyB0byB1bmxvY2suuC0gYHRhcmdldGA6IFRoZSBhY2NvdW50IHRvIHJlbW92ZSB0aGUgbG9jayBvbi4AvFdlaWdodDogYE8oUilgIHdpdGggUiBudW1iZXIgb2Ygdm90ZSBvZiB0YXJnZXQuLHJlbW92ZV92b3RlCAEUY2xhc3NRAgFUT3B0aW9uPENsYXNzT2Y8VCwgST4+AAEUaW5kZXgQAURQb2xsSW5kZXhPZjxULCBJPgAEdGRSZW1vdmUgYSB2b3RlIGZvciBhIHBvbGwuAAxJZjpwLSB0aGUgcG9sbCB3YXMgY2FuY2VsbGVkLCBvcmQtIHRoZSBwb2xsIGlzIG9uZ29pbmcsIG9yeC0gdGhlIHBvbGwgaGFzIGVuZGVkIHN1Y2ggdGhhdPwgIC0gdGhlIHZvdGUgb2YgdGhlIGFjY291bnQgd2FzIGluIG9wcG9zaXRpb24gdG8gdGhlIHJlc3VsdDsgb3LUICAtIHRoZXJlIHdhcyBubyBjb252aWN0aW9uIHRvIHRoZSBhY2NvdW50J3Mgdm90ZTsgb3KEICAtIHRoZSBhY2NvdW50IG1hZGUgYSBzcGxpdCB2b3RlXQEuLi50aGVuIHRoZSB2b3RlIGlzIHJlbW92ZWQgY2xlYW5seSBhbmQgYSBmb2xsb3dpbmcgY2FsbCB0byBgdW5sb2NrYCBtYXkgcmVzdWx0IGluIG1vcmVYZnVuZHMgYmVpbmcgYXZhaWxhYmxlLgCQSWYsIGhvd2V2ZXIsIHRoZSBwb2xsIGhhcyBlbmRlZCBhbmQ67C0gaXQgZmluaXNoZWQgY29ycmVzcG9uZGluZyB0byB0aGUgdm90ZSBvZiB0aGUgYWNjb3VudCwgYW5k3C0gdGhlIGFjY291bnQgbWFkZSBhIHN0YW5kYXJkIHZvdGUgd2l0aCBjb252aWN0aW9uLCBhbmS8LSB0aGUgbG9jayBwZXJpb2Qgb2YgdGhlIGNvbnZpY3Rpb24gaXMgbm90IG92ZXJZAS4uLnRoZW4gdGhlIGxvY2sgd2lsbCBiZSBhZ2dyZWdhdGVkIGludG8gdGhlIG92ZXJhbGwgYWNjb3VudCdzIGxvY2ssIHdoaWNoIG1heSBpbnZvbHZlWQEqb3ZlcmxvY2tpbmcqICh3aGVyZSB0aGUgdHdvIGxvY2tzIGFyZSBjb21iaW5lZCBpbnRvIGEgc2luZ2xlIGxvY2sgdGhhdCBpcyB0aGUgbWF4aW11beRvZiBib3RoIHRoZSBhbW91bnQgbG9ja2VkIGFuZCB0aGUgdGltZSBpcyBpdCBsb2NrZWQgZm9yKS4ASQFUaGUgZGlzcGF0Y2ggb3JpZ2luIG9mIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfLCBhbmQgdGhlIHNpZ25lciBtdXN0IGhhdmUgYSB2b3RlcHJlZ2lzdGVyZWQgZm9yIHBvbGwgYGluZGV4YC4A3C0gYGluZGV4YDogVGhlIGluZGV4IG9mIHBvbGwgb2YgdGhlIHZvdGUgdG8gYmUgcmVtb3ZlZC5VAS0gYGNsYXNzYDogT3B0aW9uYWwgcGFyYW1ldGVyLCBpZiBnaXZlbiBpdCBpbmRpY2F0ZXMgdGhlIGNsYXNzIG9mIHRoZSBwb2xsLiBGb3IgcG9sbHPwICB3aGljaCBoYXZlIGZpbmlzaGVkIG9yIGFyZSBjYW5jZWxsZWQsIHRoaXMgbXVzdCBiZSBgU29tZWAuAEUBV2VpZ2h0OiBgTyhSICsgbG9nIFIpYCB3aGVyZSBSIGlzIHRoZSBudW1iZXIgb2YgcG9sbHMgdGhhdCBgdGFyZ2V0YCBoYXMgdm90ZWQgb24u2CAgV2VpZ2h0IGlzIGNhbGN1bGF0ZWQgZm9yIHRoZSBtYXhpbXVtIG51bWJlciBvZiB2b3RlLkRyZW1vdmVfb3RoZXJfdm90ZQwBGHRhcmdldJ0BAVBBY2NvdW50SWRMb29rdXBPZjxUPgABFGNsYXNzVQEBNENsYXNzT2Y8VCwgST4AARRpbmRleBABRFBvbGxJbmRleE9mPFQsIEk+AAVAZFJlbW92ZSBhIHZvdGUgZm9yIGEgcG9sbC4ATQFJZiB0aGUgYHRhcmdldGAgaXMgZXF1YWwgdG8gdGhlIHNpZ25lciwgdGhlbiB0aGlzIGZ1bmN0aW9uIGlzIGV4YWN0bHkgZXF1aXZhbGVudCB0by0BYHJlbW92ZV92b3RlYC4gSWYgbm90IGVxdWFsIHRvIHRoZSBzaWduZXIsIHRoZW4gdGhlIHZvdGUgbXVzdCBoYXZlIGV4cGlyZWQsJQFlaXRoZXIgYmVjYXVzZSB0aGUgcG9sbCB3YXMgY2FuY2VsbGVkLCBiZWNhdXNlIHRoZSB2b3RlciBsb3N0IHRoZSBwb2xsIG9ymGJlY2F1c2UgdGhlIGNvbnZpY3Rpb24gcGVyaW9kIGlzIG92ZXIuAMhUaGUgZGlzcGF0Y2ggb3JpZ2luIG9mIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfLgBhAS0gYHRhcmdldGA6IFRoZSBhY2NvdW50IG9mIHRoZSB2b3RlIHRvIGJlIHJlbW92ZWQ7IHRoaXMgYWNjb3VudCBtdXN0IGhhdmUgdm90ZWQgZm9yIHBvbGwoICBgaW5kZXhgLtwtIGBpbmRleGA6IFRoZSBpbmRleCBvZiBwb2xsIG9mIHRoZSB2b3RlIHRvIGJlIHJlbW92ZWQuhC0gYGNsYXNzYDogVGhlIGNsYXNzIG9mIHRoZSBwb2xsLgBFAVdlaWdodDogYE8oUiArIGxvZyBSKWAgd2hlcmUgUiBpcyB0aGUgbnVtYmVyIG9mIHBvbGxzIHRoYXQgYHRhcmdldGAgaGFzIHZvdGVkIG9uLtggIFdlaWdodCBpcyBjYWxjdWxhdGVkIGZvciB0aGUgbWF4aW11bSBudW1iZXIgb2Ygdm90ZS4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMuRQIMYHBhbGxldF9jb252aWN0aW9uX3ZvdGluZxB2b3RlLEFjY291bnRWb3RlBBxCYWxhbmNlARgBDCBTdGFuZGFyZAgBEHZvdGVJAgEQVm90ZQABHGJhbGFuY2UYARxCYWxhbmNlAAAAFFNwbGl0CAEMYXllGAEcQmFsYW5jZQABDG5heRgBHEJhbGFuY2UAAQAwU3BsaXRBYnN0YWluDAEMYXllGAEcQmFsYW5jZQABDG5heRgBHEJhbGFuY2UAARxhYnN0YWluGAEcQmFsYW5jZQACAABJAgxgcGFsbGV0X2NvbnZpY3Rpb25fdm90aW5nEHZvdGUQVm90ZQAABAAIAAAATQIMYHBhbGxldF9jb252aWN0aW9uX3ZvdGluZyhjb252aWN0aW9uKENvbnZpY3Rpb24AARwQTm9uZQAAACBMb2NrZWQxeAABACBMb2NrZWQyeAACACBMb2NrZWQzeAADACBMb2NrZWQ0eAAEACBMb2NrZWQ1eAAFACBMb2NrZWQ2eAAGAABRAgQYT3B0aW9uBARUAVUBAQgQTm9uZQAAABBTb21lBABVAQAAAQAAVQIMQHBhbGxldF9yZWZlcmVuZGEYcGFsbGV0EENhbGwIBFQABEkAASQYc3VibWl0DAE8cHJvcG9zYWxfb3JpZ2luWQIBXEJveDxQYWxsZXRzT3JpZ2luT2Y8VD4+AAEgcHJvcG9zYWxZAQFMQm91bmRlZENhbGxPZjxULCBJPgABQGVuYWN0bWVudF9tb21lbnR1AgF8RGlzcGF0Y2hUaW1lPEJsb2NrTnVtYmVyRm9yPFQ+PgAAJLBQcm9wb3NlIGEgcmVmZXJlbmR1bSBvbiBhIHByaXZpbGVnZWQgYWN0aW9uLgBZAS0gYG9yaWdpbmA6IG11c3QgYmUgYFN1Ym1pdE9yaWdpbmAgYW5kIHRoZSBhY2NvdW50IG11c3QgaGF2ZSBgU3VibWlzc2lvbkRlcG9zaXRgIGZ1bmRzMCAgYXZhaWxhYmxlLi0BLSBgcHJvcG9zYWxfb3JpZ2luYDogVGhlIG9yaWdpbiBmcm9tIHdoaWNoIHRoZSBwcm9wb3NhbCBzaG91bGQgYmUgZXhlY3V0ZWQubC0gYHByb3Bvc2FsYDogVGhlIHByb3Bvc2FsLhUBLSBgZW5hY3RtZW50X21vbWVudGA6IFRoZSBtb21lbnQgdGhhdCB0aGUgcHJvcG9zYWwgc2hvdWxkIGJlIGVuYWN0ZWQuAEhFbWl0cyBgU3VibWl0dGVkYC5YcGxhY2VfZGVjaXNpb25fZGVwb3NpdAQBFGluZGV4EAE8UmVmZXJlbmR1bUluZGV4AAEgrFBvc3QgdGhlIERlY2lzaW9uIERlcG9zaXQgZm9yIGEgcmVmZXJlbmR1bS4AOQEtIGBvcmlnaW5gOiBtdXN0IGJlIGBTaWduZWRgIGFuZCB0aGUgYWNjb3VudCBtdXN0IGhhdmUgZnVuZHMgYXZhaWxhYmxlIGZvciB0aGWgICByZWZlcmVuZHVtJ3MgdHJhY2sncyBEZWNpc2lvbiBEZXBvc2l0LlEBLSBgaW5kZXhgOiBUaGUgaW5kZXggb2YgdGhlIHN1Ym1pdHRlZCByZWZlcmVuZHVtIHdob3NlIERlY2lzaW9uIERlcG9zaXQgaXMgeWV0IHRvIGJlJCAgcG9zdGVkLgB4RW1pdHMgYERlY2lzaW9uRGVwb3NpdFBsYWNlZGAuXHJlZnVuZF9kZWNpc2lvbl9kZXBvc2l0BAEUaW5kZXgQATxSZWZlcmVuZHVtSW5kZXgAAhwpAVJlZnVuZCB0aGUgRGVjaXNpb24gRGVwb3NpdCBmb3IgYSBjbG9zZWQgcmVmZXJlbmR1bSBiYWNrIHRvIHRoZSBkZXBvc2l0b3IuAJwtIGBvcmlnaW5gOiBtdXN0IGJlIGBTaWduZWRgIG9yIGBSb290YC5NAS0gYGluZGV4YDogVGhlIGluZGV4IG9mIGEgY2xvc2VkIHJlZmVyZW5kdW0gd2hvc2UgRGVjaXNpb24gRGVwb3NpdCBoYXMgbm90IHlldCBiZWVuLCAgcmVmdW5kZWQuAIBFbWl0cyBgRGVjaXNpb25EZXBvc2l0UmVmdW5kZWRgLhhjYW5jZWwEARRpbmRleBABPFJlZmVyZW5kdW1JbmRleAADGHRDYW5jZWwgYW4gb25nb2luZyByZWZlcmVuZHVtLgCcLSBgb3JpZ2luYDogbXVzdCBiZSB0aGUgYENhbmNlbE9yaWdpbmAu3C0gYGluZGV4YDogVGhlIGluZGV4IG9mIHRoZSByZWZlcmVuZHVtIHRvIGJlIGNhbmNlbGxlZC4ASEVtaXRzIGBDYW5jZWxsZWRgLhBraWxsBAEUaW5kZXgQATxSZWZlcmVuZHVtSW5kZXgABBjQQ2FuY2VsIGFuIG9uZ29pbmcgcmVmZXJlbmR1bSBhbmQgc2xhc2ggdGhlIGRlcG9zaXRzLgCULSBgb3JpZ2luYDogbXVzdCBiZSB0aGUgYEtpbGxPcmlnaW5gLtwtIGBpbmRleGA6IFRoZSBpbmRleCBvZiB0aGUgcmVmZXJlbmR1bSB0byBiZSBjYW5jZWxsZWQuAJBFbWl0cyBgS2lsbGVkYCBhbmQgYERlcG9zaXRTbGFzaGVkYC5AbnVkZ2VfcmVmZXJlbmR1bQQBFGluZGV4EAE8UmVmZXJlbmR1bUluZGV4AAUQHQFBZHZhbmNlIGEgcmVmZXJlbmR1bSBvbnRvIGl0cyBuZXh0IGxvZ2ljYWwgc3RhdGUuIE9ubHkgdXNlZCBpbnRlcm5hbGx5LgBsLSBgb3JpZ2luYDogbXVzdCBiZSBgUm9vdGAupC0gYGluZGV4YDogdGhlIHJlZmVyZW5kdW0gdG8gYmUgYWR2YW5jZWQuSG9uZV9mZXdlcl9kZWNpZGluZwQBFHRyYWNrVQEBPFRyYWNrSWRPZjxULCBJPgAGJAkBQWR2YW5jZSBhIHRyYWNrIG9udG8gaXRzIG5leHQgbG9naWNhbCBzdGF0ZS4gT25seSB1c2VkIGludGVybmFsbHkuAGwtIGBvcmlnaW5gOiBtdXN0IGJlIGBSb290YC6QLSBgdHJhY2tgOiB0aGUgdHJhY2sgdG8gYmUgYWR2YW5jZWQuAFEBQWN0aW9uIGl0ZW0gZm9yIHdoZW4gdGhlcmUgaXMgbm93IG9uZSBmZXdlciByZWZlcmVuZHVtIGluIHRoZSBkZWNpZGluZyBwaGFzZSBhbmQgdGhlFQFgRGVjaWRpbmdDb3VudGAgaXMgbm90IHlldCB1cGRhdGVkLiBUaGlzIG1lYW5zIHRoYXQgd2Ugc2hvdWxkIGVpdGhlcjolAS0gYmVnaW4gZGVjaWRpbmcgYW5vdGhlciByZWZlcmVuZHVtIChhbmQgbGVhdmUgYERlY2lkaW5nQ291bnRgIGFsb25lKTsgb3JwLSBkZWNyZW1lbnQgYERlY2lkaW5nQ291bnRgLmRyZWZ1bmRfc3VibWlzc2lvbl9kZXBvc2l0BAEUaW5kZXgQATxSZWZlcmVuZHVtSW5kZXgABxwxAVJlZnVuZCB0aGUgU3VibWlzc2lvbiBEZXBvc2l0IGZvciBhIGNsb3NlZCByZWZlcmVuZHVtIGJhY2sgdG8gdGhlIGRlcG9zaXRvci4AnC0gYG9yaWdpbmA6IG11c3QgYmUgYFNpZ25lZGAgb3IgYFJvb3RgLlUBLSBgaW5kZXhgOiBUaGUgaW5kZXggb2YgYSBjbG9zZWQgcmVmZXJlbmR1bSB3aG9zZSBTdWJtaXNzaW9uIERlcG9zaXQgaGFzIG5vdCB5ZXQgYmVlbiwgIHJlZnVuZGVkLgCIRW1pdHMgYFN1Ym1pc3Npb25EZXBvc2l0UmVmdW5kZWRgLjBzZXRfbWV0YWRhdGEIARRpbmRleBABPFJlZmVyZW5kdW1JbmRleAABKG1heWJlX2hhc2h5AgE8T3B0aW9uPFQ6Okhhc2g+AAgcmFNldCBvciBjbGVhciBtZXRhZGF0YSBvZiBhIHJlZmVyZW5kdW0uACxQYXJhbWV0ZXJzOkUBLSBgb3JpZ2luYDogTXVzdCBiZSBgU2lnbmVkYCBieSBhIGNyZWF0b3Igb2YgYSByZWZlcmVuZHVtIG9yIGJ5IGFueW9uZSB0byBjbGVhciBhkCAgbWV0YWRhdGEgb2YgYSBmaW5pc2hlZCByZWZlcmVuZHVtLg0BLSBgaW5kZXhgOiAgVGhlIGluZGV4IG9mIGEgcmVmZXJlbmR1bSB0byBzZXQgb3IgY2xlYXIgbWV0YWRhdGEgZm9yLlEBLSBgbWF5YmVfaGFzaGA6IFRoZSBoYXNoIG9mIGFuIG9uLWNoYWluIHN0b3JlZCBwcmVpbWFnZS4gYE5vbmVgIHRvIGNsZWFyIGEgbWV0YWRhdGEuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLlkCCFhzdGFnaW5nX2t1c2FtYV9ydW50aW1lME9yaWdpbkNhbGxlcgABFBhzeXN0ZW0EAF0CAXRmcmFtZV9zeXN0ZW06Ok9yaWdpbjxSdW50aW1lPgAAABxPcmlnaW5zBABhAgF0cGFsbGV0X2N1c3RvbV9vcmlnaW5zOjpPcmlnaW4AKwBAUGFyYWNoYWluc09yaWdpbgQAZQIBZHBhcmFjaGFpbnNfb3JpZ2luOjpPcmlnaW4AMgAkWGNtUGFsbGV0BABtAgFIcGFsbGV0X3hjbTo6T3JpZ2luAGMAEFZvaWQEAHECAUEBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OgpfX3ByaXZhdGU6OlZvaWQABAAAXQIMNGZyYW1lX3N1cHBvcnQgZGlzcGF0Y2gkUmF3T3JpZ2luBCRBY2NvdW50SWQBAAEMEFJvb3QAAAAYU2lnbmVkBAAAASRBY2NvdW50SWQAAQAQTm9uZQACAABhAhRYc3RhZ2luZ19rdXNhbWFfcnVudGltZShnb3Zlcm5hbmNlHG9yaWdpbnNUcGFsbGV0X2N1c3RvbV9vcmlnaW5zGE9yaWdpbgABcDBTdGFraW5nQWRtaW4AAAAkVHJlYXN1cmVyAAEAPEZlbGxvd3NoaXBBZG1pbgACADBHZW5lcmFsQWRtaW4AAwAwQXVjdGlvbkFkbWluAAQAKExlYXNlQWRtaW4ABQBMUmVmZXJlbmR1bUNhbmNlbGxlcgAGAEBSZWZlcmVuZHVtS2lsbGVyAAcALFNtYWxsVGlwcGVyAAgAJEJpZ1RpcHBlcgAJADBTbWFsbFNwZW5kZXIACgA0TWVkaXVtU3BlbmRlcgALAChCaWdTcGVuZGVyAAwARFdoaXRlbGlzdGVkQ2FsbGVyAA0ATEZlbGxvd3NoaXBJbml0aWF0ZXMADgAcRmVsbG93cwAPAERGZWxsb3dzaGlwRXhwZXJ0cwAQAERGZWxsb3dzaGlwTWFzdGVycwARADhGZWxsb3dzaGlwMURhbgASADhGZWxsb3dzaGlwMkRhbgATADhGZWxsb3dzaGlwM0RhbgAUADhGZWxsb3dzaGlwNERhbgAVADhGZWxsb3dzaGlwNURhbgAWADhGZWxsb3dzaGlwNkRhbgAXADhGZWxsb3dzaGlwN0RhbgAYADhGZWxsb3dzaGlwOERhbgAZADhGZWxsb3dzaGlwOURhbgAaADRXaXNoRm9yQ2hhbmdlABsAAGUCEGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMYb3JpZ2luGHBhbGxldBhPcmlnaW4AAQQkUGFyYWNoYWluBABpAgEYUGFyYUlkAAAAAGkCDHRwb2xrYWRvdF9wYXJhY2hhaW5fcHJpbWl0aXZlcyhwcmltaXRpdmVzCElkAAAEABABDHUzMgAAbQIMKHBhbGxldF94Y20YcGFsbGV0GE9yaWdpbgABCAxYY20EAPQBIExvY2F0aW9uAAAAIFJlc3BvbnNlBAD0ASBMb2NhdGlvbgABAABxAggcc3BfY29yZRBWb2lkAAEAAHUCEDRmcmFtZV9zdXBwb3J0GHRyYWl0cyBzY2hlZHVsZTBEaXNwYXRjaFRpbWUELEJsb2NrTnVtYmVyARABCAhBdAQAEAEsQmxvY2tOdW1iZXIAAAAUQWZ0ZXIEABABLEJsb2NrTnVtYmVyAAEAAHkCBBhPcHRpb24EBFQBNAEIEE5vbmUAAAAQU29tZQQANAAAAQAAfQIMYHBhbGxldF9yYW5rZWRfY29sbGVjdGl2ZRhwYWxsZXQQQ2FsbAgEVAAESQABHChhZGRfbWVtYmVyBAEMd2hvnQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAAYXEludHJvZHVjZSBhIG5ldyBtZW1iZXIuAJAtIGBvcmlnaW5gOiBNdXN0IGJlIHRoZSBgQWRkT3JpZ2luYC7oLSBgd2hvYDogQWNjb3VudCBvZiBub24tbWVtYmVyIHdoaWNoIHdpbGwgYmVjb21lIGEgbWVtYmVyLgA4V2VpZ2h0OiBgTygxKWA4cHJvbW90ZV9tZW1iZXIEAQx3aG+dAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AARjASW5jcmVtZW50IHRoZSByYW5rIG9mIGFuIGV4aXN0aW5nIG1lbWJlciBieSBvbmUuAKAtIGBvcmlnaW5gOiBNdXN0IGJlIHRoZSBgUHJvbW90ZU9yaWdpbmAukC0gYHdob2A6IEFjY291bnQgb2YgZXhpc3RpbmcgbWVtYmVyLgA4V2VpZ2h0OiBgTygxKWA0ZGVtb3RlX21lbWJlcgQBDHdob50BAVBBY2NvdW50SWRMb29rdXBPZjxUPgACHF0BRGVjcmVtZW50IHRoZSByYW5rIG9mIGFuIGV4aXN0aW5nIG1lbWJlciBieSBvbmUuIElmIHRoZSBtZW1iZXIgaXMgYWxyZWFkeSBhdCByYW5rIHplcm8sfHRoZW4gdGhleSBhcmUgcmVtb3ZlZCBlbnRpcmVseS4AnC0gYG9yaWdpbmA6IE11c3QgYmUgdGhlIGBEZW1vdGVPcmlnaW5gLvgtIGB3aG9gOiBBY2NvdW50IG9mIGV4aXN0aW5nIG1lbWJlciBvZiByYW5rIGdyZWF0ZXIgdGhhbiB6ZXJvLgAJAVdlaWdodDogYE8oMSlgLCBsZXNzIGlmIHRoZSBtZW1iZXIncyBpbmRleCBpcyBoaWdoZXN0IGluIGl0cyByYW5rLjRyZW1vdmVfbWVtYmVyCAEMd2hvnQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEgbWluX3JhbmtVAQEQUmFuawADHGxSZW1vdmUgdGhlIG1lbWJlciBlbnRpcmVseS4AnC0gYG9yaWdpbmA6IE11c3QgYmUgdGhlIGBSZW1vdmVPcmlnaW5gLvgtIGB3aG9gOiBBY2NvdW50IG9mIGV4aXN0aW5nIG1lbWJlciBvZiByYW5rIGdyZWF0ZXIgdGhhbiB6ZXJvLsAtIGBtaW5fcmFua2A6IFRoZSByYW5rIG9mIHRoZSBtZW1iZXIgb3IgZ3JlYXRlci4AWFdlaWdodDogYE8obWluX3JhbmspYC4Qdm90ZQgBEHBvbGwQAURQb2xsSW5kZXhPZjxULCBJPgABDGF5ZSABEGJvb2wABCzwQWRkIGFuIGF5ZSBvciBuYXkgdm90ZSBmb3IgdGhlIHNlbmRlciB0byB0aGUgZ2l2ZW4gcHJvcG9zYWwuAMQtIGBvcmlnaW5gOiBNdXN0IGJlIGBTaWduZWRgIGJ5IGEgbWVtYmVyIGFjY291bnQurC0gYHBvbGxgOiBJbmRleCBvZiBhIHBvbGwgd2hpY2ggaXMgb25nb2luZy4pAS0gYGF5ZWA6IGB0cnVlYCBpZiB0aGUgdm90ZSBpcyB0byBhcHByb3ZlIHRoZSBwcm9wb3NhbCwgYGZhbHNlYCBvdGhlcndpc2UuAEUBVHJhbnNhY3Rpb24gZmVlcyBhcmUgYmUgd2FpdmVkIGlmIHRoZSBtZW1iZXIgaXMgdm90aW5nIG9uIGFueSBwYXJ0aWN1bGFyIHByb3Bvc2FsUQFmb3IgdGhlIGZpcnN0IHRpbWUgYW5kIHRoZSBjYWxsIGlzIHN1Y2Nlc3NmdWwuIFN1YnNlcXVlbnQgdm90ZSBjaGFuZ2VzIHdpbGwgY2hhcmdlIGEQZmVlLgA1AVdlaWdodDogYE8oMSlgLCBsZXNzIGlmIHRoZXJlIHdhcyBubyBwcmV2aW91cyB2b3RlIG9uIHRoZSBwb2xsIGJ5IHRoZSBtZW1iZXIuMGNsZWFudXBfcG9sbAgBKHBvbGxfaW5kZXgQAURQb2xsSW5kZXhPZjxULCBJPgABDG1heBABDHUzMgAFKNRSZW1vdmUgdm90ZXMgZnJvbSB0aGUgZ2l2ZW4gcG9sbC4gSXQgbXVzdCBoYXZlIGVuZGVkLgCwLSBgb3JpZ2luYDogTXVzdCBiZSBgU2lnbmVkYCBieSBhbnkgYWNjb3VudC5JAS0gYHBvbGxfaW5kZXhgOiBJbmRleCBvZiBhIHBvbGwgd2hpY2ggaXMgY29tcGxldGVkIGFuZCBmb3Igd2hpY2ggdm90ZXMgY29udGludWUgdG8gICBleGlzdC78LSBgbWF4YDogTWF4aW11bSBudW1iZXIgb2Ygdm90ZSBpdGVtcyBmcm9tIHJlbW92ZSBpbiB0aGlzIGNhbGwuAOxUcmFuc2FjdGlvbiBmZWVzIGFyZSB3YWl2ZWQgaWYgdGhlIG9wZXJhdGlvbiBpcyBzdWNjZXNzZnVsLgAVAVdlaWdodCBgTyhtYXgpYCAobGVzcyBpZiB0aGVyZSBhcmUgZmV3ZXIgaXRlbXMgdG8gcmVtb3ZlIHRoYW4gYG1heGApLjxleGNoYW5nZV9tZW1iZXIIAQx3aG+dAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AARxuZXdfd2hvnQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAYUBQFFeGNoYW5nZXMgYSBtZW1iZXIgd2l0aCBhIG5ldyBhY2NvdW50IGFuZCB0aGUgc2FtZSBleGlzdGluZyByYW5rLgCkLSBgb3JpZ2luYDogTXVzdCBiZSB0aGUgYEV4Y2hhbmdlT3JpZ2luYC45AS0gYHdob2A6IEFjY291bnQgb2YgZXhpc3RpbmcgbWVtYmVyIG9mIHJhbmsgZ3JlYXRlciB0aGFuIHplcm8gdG8gYmUgZXhjaGFuZ2VkLlkBLSBgbmV3X3dob2A6IE5ldyBBY2NvdW50IG9mIGV4aXN0aW5nIG1lbWJlciBvZiByYW5rIGdyZWF0ZXIgdGhhbiB6ZXJvIHRvIGV4Y2hhbmdlZCB0by4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMugQIMQHBhbGxldF9yZWZlcmVuZGEYcGFsbGV0EENhbGwIBFQABEkAASQYc3VibWl0DAE8cHJvcG9zYWxfb3JpZ2luWQIBXEJveDxQYWxsZXRzT3JpZ2luT2Y8VD4+AAEgcHJvcG9zYWxZAQFMQm91bmRlZENhbGxPZjxULCBJPgABQGVuYWN0bWVudF9tb21lbnR1AgF8RGlzcGF0Y2hUaW1lPEJsb2NrTnVtYmVyRm9yPFQ+PgAAJLBQcm9wb3NlIGEgcmVmZXJlbmR1bSBvbiBhIHByaXZpbGVnZWQgYWN0aW9uLgBZAS0gYG9yaWdpbmA6IG11c3QgYmUgYFN1Ym1pdE9yaWdpbmAgYW5kIHRoZSBhY2NvdW50IG11c3QgaGF2ZSBgU3VibWlzc2lvbkRlcG9zaXRgIGZ1bmRzMCAgYXZhaWxhYmxlLi0BLSBgcHJvcG9zYWxfb3JpZ2luYDogVGhlIG9yaWdpbiBmcm9tIHdoaWNoIHRoZSBwcm9wb3NhbCBzaG91bGQgYmUgZXhlY3V0ZWQubC0gYHByb3Bvc2FsYDogVGhlIHByb3Bvc2FsLhUBLSBgZW5hY3RtZW50X21vbWVudGA6IFRoZSBtb21lbnQgdGhhdCB0aGUgcHJvcG9zYWwgc2hvdWxkIGJlIGVuYWN0ZWQuAEhFbWl0cyBgU3VibWl0dGVkYC5YcGxhY2VfZGVjaXNpb25fZGVwb3NpdAQBFGluZGV4EAE8UmVmZXJlbmR1bUluZGV4AAEgrFBvc3QgdGhlIERlY2lzaW9uIERlcG9zaXQgZm9yIGEgcmVmZXJlbmR1bS4AOQEtIGBvcmlnaW5gOiBtdXN0IGJlIGBTaWduZWRgIGFuZCB0aGUgYWNjb3VudCBtdXN0IGhhdmUgZnVuZHMgYXZhaWxhYmxlIGZvciB0aGWgICByZWZlcmVuZHVtJ3MgdHJhY2sncyBEZWNpc2lvbiBEZXBvc2l0LlEBLSBgaW5kZXhgOiBUaGUgaW5kZXggb2YgdGhlIHN1Ym1pdHRlZCByZWZlcmVuZHVtIHdob3NlIERlY2lzaW9uIERlcG9zaXQgaXMgeWV0IHRvIGJlJCAgcG9zdGVkLgB4RW1pdHMgYERlY2lzaW9uRGVwb3NpdFBsYWNlZGAuXHJlZnVuZF9kZWNpc2lvbl9kZXBvc2l0BAEUaW5kZXgQATxSZWZlcmVuZHVtSW5kZXgAAhwpAVJlZnVuZCB0aGUgRGVjaXNpb24gRGVwb3NpdCBmb3IgYSBjbG9zZWQgcmVmZXJlbmR1bSBiYWNrIHRvIHRoZSBkZXBvc2l0b3IuAJwtIGBvcmlnaW5gOiBtdXN0IGJlIGBTaWduZWRgIG9yIGBSb290YC5NAS0gYGluZGV4YDogVGhlIGluZGV4IG9mIGEgY2xvc2VkIHJlZmVyZW5kdW0gd2hvc2UgRGVjaXNpb24gRGVwb3NpdCBoYXMgbm90IHlldCBiZWVuLCAgcmVmdW5kZWQuAIBFbWl0cyBgRGVjaXNpb25EZXBvc2l0UmVmdW5kZWRgLhhjYW5jZWwEARRpbmRleBABPFJlZmVyZW5kdW1JbmRleAADGHRDYW5jZWwgYW4gb25nb2luZyByZWZlcmVuZHVtLgCcLSBgb3JpZ2luYDogbXVzdCBiZSB0aGUgYENhbmNlbE9yaWdpbmAu3C0gYGluZGV4YDogVGhlIGluZGV4IG9mIHRoZSByZWZlcmVuZHVtIHRvIGJlIGNhbmNlbGxlZC4ASEVtaXRzIGBDYW5jZWxsZWRgLhBraWxsBAEUaW5kZXgQATxSZWZlcmVuZHVtSW5kZXgABBjQQ2FuY2VsIGFuIG9uZ29pbmcgcmVmZXJlbmR1bSBhbmQgc2xhc2ggdGhlIGRlcG9zaXRzLgCULSBgb3JpZ2luYDogbXVzdCBiZSB0aGUgYEtpbGxPcmlnaW5gLtwtIGBpbmRleGA6IFRoZSBpbmRleCBvZiB0aGUgcmVmZXJlbmR1bSB0byBiZSBjYW5jZWxsZWQuAJBFbWl0cyBgS2lsbGVkYCBhbmQgYERlcG9zaXRTbGFzaGVkYC5AbnVkZ2VfcmVmZXJlbmR1bQQBFGluZGV4EAE8UmVmZXJlbmR1bUluZGV4AAUQHQFBZHZhbmNlIGEgcmVmZXJlbmR1bSBvbnRvIGl0cyBuZXh0IGxvZ2ljYWwgc3RhdGUuIE9ubHkgdXNlZCBpbnRlcm5hbGx5LgBsLSBgb3JpZ2luYDogbXVzdCBiZSBgUm9vdGAupC0gYGluZGV4YDogdGhlIHJlZmVyZW5kdW0gdG8gYmUgYWR2YW5jZWQuSG9uZV9mZXdlcl9kZWNpZGluZwQBFHRyYWNrVQEBPFRyYWNrSWRPZjxULCBJPgAGJAkBQWR2YW5jZSBhIHRyYWNrIG9udG8gaXRzIG5leHQgbG9naWNhbCBzdGF0ZS4gT25seSB1c2VkIGludGVybmFsbHkuAGwtIGBvcmlnaW5gOiBtdXN0IGJlIGBSb290YC6QLSBgdHJhY2tgOiB0aGUgdHJhY2sgdG8gYmUgYWR2YW5jZWQuAFEBQWN0aW9uIGl0ZW0gZm9yIHdoZW4gdGhlcmUgaXMgbm93IG9uZSBmZXdlciByZWZlcmVuZHVtIGluIHRoZSBkZWNpZGluZyBwaGFzZSBhbmQgdGhlFQFgRGVjaWRpbmdDb3VudGAgaXMgbm90IHlldCB1cGRhdGVkLiBUaGlzIG1lYW5zIHRoYXQgd2Ugc2hvdWxkIGVpdGhlcjolAS0gYmVnaW4gZGVjaWRpbmcgYW5vdGhlciByZWZlcmVuZHVtIChhbmQgbGVhdmUgYERlY2lkaW5nQ291bnRgIGFsb25lKTsgb3JwLSBkZWNyZW1lbnQgYERlY2lkaW5nQ291bnRgLmRyZWZ1bmRfc3VibWlzc2lvbl9kZXBvc2l0BAEUaW5kZXgQATxSZWZlcmVuZHVtSW5kZXgABxwxAVJlZnVuZCB0aGUgU3VibWlzc2lvbiBEZXBvc2l0IGZvciBhIGNsb3NlZCByZWZlcmVuZHVtIGJhY2sgdG8gdGhlIGRlcG9zaXRvci4AnC0gYG9yaWdpbmA6IG11c3QgYmUgYFNpZ25lZGAgb3IgYFJvb3RgLlUBLSBgaW5kZXhgOiBUaGUgaW5kZXggb2YgYSBjbG9zZWQgcmVmZXJlbmR1bSB3aG9zZSBTdWJtaXNzaW9uIERlcG9zaXQgaGFzIG5vdCB5ZXQgYmVlbiwgIHJlZnVuZGVkLgCIRW1pdHMgYFN1Ym1pc3Npb25EZXBvc2l0UmVmdW5kZWRgLjBzZXRfbWV0YWRhdGEIARRpbmRleBABPFJlZmVyZW5kdW1JbmRleAABKG1heWJlX2hhc2h5AgE8T3B0aW9uPFQ6Okhhc2g+AAgcmFNldCBvciBjbGVhciBtZXRhZGF0YSBvZiBhIHJlZmVyZW5kdW0uACxQYXJhbWV0ZXJzOkUBLSBgb3JpZ2luYDogTXVzdCBiZSBgU2lnbmVkYCBieSBhIGNyZWF0b3Igb2YgYSByZWZlcmVuZHVtIG9yIGJ5IGFueW9uZSB0byBjbGVhciBhkCAgbWV0YWRhdGEgb2YgYSBmaW5pc2hlZCByZWZlcmVuZHVtLg0BLSBgaW5kZXhgOiAgVGhlIGluZGV4IG9mIGEgcmVmZXJlbmR1bSB0byBzZXQgb3IgY2xlYXIgbWV0YWRhdGEgZm9yLlEBLSBgbWF5YmVfaGFzaGA6IFRoZSBoYXNoIG9mIGFuIG9uLWNoYWluIHN0b3JlZCBwcmVpbWFnZS4gYE5vbmVgIHRvIGNsZWFyIGEgbWV0YWRhdGEuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLoUCDEBwYWxsZXRfd2hpdGVsaXN0GHBhbGxldBBDYWxsBARUAAEQOHdoaXRlbGlzdF9jYWxsBAEkY2FsbF9oYXNoNAEcVDo6SGFzaAAAAFxyZW1vdmVfd2hpdGVsaXN0ZWRfY2FsbAQBJGNhbGxfaGFzaDQBHFQ6Okhhc2gAAQBkZGlzcGF0Y2hfd2hpdGVsaXN0ZWRfY2FsbAwBJGNhbGxfaGFzaDQBHFQ6Okhhc2gAAUBjYWxsX2VuY29kZWRfbGVuEAEMdTMyAAFMY2FsbF93ZWlnaHRfd2l0bmVzcygBGFdlaWdodAACAJxkaXNwYXRjaF93aGl0ZWxpc3RlZF9jYWxsX3dpdGhfcHJlaW1hZ2UEARBjYWxsXQEBfEJveDw8VCBhcyBDb25maWc+OjpSdW50aW1lQ2FsbD4AAwAEDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMuiQIMRHBhbGxldF9wYXJhbWV0ZXJzGHBhbGxldBBDYWxsBARUAAEENHNldF9wYXJhbWV0ZXIEASRrZXlfdmFsdWWNAgFQVDo6UnVudGltZVBhcmFtZXRlcnMAABB0U2V0IHRoZSB2YWx1ZSBvZiBhIHBhcmFtZXRlci4AVQFUaGUgZGlzcGF0Y2ggb3JpZ2luIG9mIHRoaXMgY2FsbCBtdXN0IGJlIGBBZG1pbk9yaWdpbmAgZm9yIHRoZSBnaXZlbiBga2V5YC4gVmFsdWVzIGJliGRlbGV0ZWQgYnkgc2V0dGluZyB0aGVtIHRvIGBOb25lYC4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMujQIIWHN0YWdpbmdfa3VzYW1hX3J1bnRpbWVEUnVudGltZVBhcmFtZXRlcnMAAQQkSW5mbGF0aW9uBACRAgGUZHluYW1pY19wYXJhbXM6OmluZmxhdGlvbjo6UGFyYW1ldGVycwAAAACRAhBYc3RhZ2luZ19rdXNhbWFfcnVudGltZThkeW5hbWljX3BhcmFtcyRpbmZsYXRpb24oUGFyYW1ldGVycwABFDBNaW5JbmZsYXRpb24IAJUCATBNaW5JbmZsYXRpb24AAJkCAUxPcHRpb248UGVycXVpbnRpbGw+AAAAME1heEluZmxhdGlvbggAoQIBME1heEluZmxhdGlvbgAAmQIBTE9wdGlvbjxQZXJxdWludGlsbD4AAQAoSWRlYWxTdGFrZQgApQIBKElkZWFsU3Rha2UAAJkCAUxPcHRpb248UGVycXVpbnRpbGw+AAIAHEZhbGxvZmYIAKkCARxGYWxsb2ZmAACZAgFMT3B0aW9uPFBlcnF1aW50aWxsPgADADxVc2VBdWN0aW9uU2xvdHMIAK0CATxVc2VBdWN0aW9uU2xvdHMAALECATBPcHRpb248Ym9vbD4ABAAAlQIQWHN0YWdpbmdfa3VzYW1hX3J1bnRpbWU4ZHluYW1pY19wYXJhbXMkaW5mbGF0aW9uME1pbkluZmxhdGlvbgAAAACZAgQYT3B0aW9uBARUAZ0CAQgQTm9uZQAAABBTb21lBACdAgAAAQAAnQIMNHNwX2FyaXRobWV0aWMocGVyX3RoaW5ncyxQZXJxdWludGlsbAAABAAwAQx1NjQAAKECEFhzdGFnaW5nX2t1c2FtYV9ydW50aW1lOGR5bmFtaWNfcGFyYW1zJGluZmxhdGlvbjBNYXhJbmZsYXRpb24AAAAApQIQWHN0YWdpbmdfa3VzYW1hX3J1bnRpbWU4ZHluYW1pY19wYXJhbXMkaW5mbGF0aW9uKElkZWFsU3Rha2UAAAAAqQIQWHN0YWdpbmdfa3VzYW1hX3J1bnRpbWU4ZHluYW1pY19wYXJhbXMkaW5mbGF0aW9uHEZhbGxvZmYAAAAArQIQWHN0YWdpbmdfa3VzYW1hX3J1bnRpbWU4ZHluYW1pY19wYXJhbXMkaW5mbGF0aW9uPFVzZUF1Y3Rpb25TbG90cwAAAACxAgQYT3B0aW9uBARUASABCBBOb25lAAAAEFNvbWUEACAAAAEAALUCEFxwb2xrYWRvdF9ydW50aW1lX2NvbW1vbhhjbGFpbXMYcGFsbGV0EENhbGwEBFQAARQUY2xhaW0IARBkZXN0AAEwVDo6QWNjb3VudElkAAFIZXRoZXJldW1fc2lnbmF0dXJluQIBOEVjZHNhU2lnbmF0dXJlAABgiE1ha2UgYSBjbGFpbSB0byBjb2xsZWN0IHlvdXIgRE9Ucy4AxFRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9Ob25lXy4AUFVuc2lnbmVkIFZhbGlkYXRpb246BQFBIGNhbGwgdG8gY2xhaW0gaXMgZGVlbWVkIHZhbGlkIGlmIHRoZSBzaWduYXR1cmUgcHJvdmlkZWQgbWF0Y2hlc3x0aGUgZXhwZWN0ZWQgc2lnbmVkIG1lc3NhZ2Ugb2Y6AGg+IEV0aGVyZXVtIFNpZ25lZCBNZXNzYWdlOpQ+IChjb25maWd1cmVkIHByZWZpeCBzdHJpbmcpKGFkZHJlc3MpAKRhbmQgYGFkZHJlc3NgIG1hdGNoZXMgdGhlIGBkZXN0YCBhY2NvdW50LgAsUGFyYW1ldGVyczrYLSBgZGVzdGA6IFRoZSBkZXN0aW5hdGlvbiBhY2NvdW50IHRvIHBheW91dCB0aGUgY2xhaW0uXQEtIGBldGhlcmV1bV9zaWduYXR1cmVgOiBUaGUgc2lnbmF0dXJlIG9mIGFuIGV0aGVyZXVtIHNpZ25lZCBtZXNzYWdlIG1hdGNoaW5nIHRoZSBmb3JtYXRIICBkZXNjcmliZWQgYWJvdmUuACA8d2VpZ2h0PvxUaGUgd2VpZ2h0IG9mIHRoaXMgY2FsbCBpcyBpbnZhcmlhbnQgb3ZlciB0aGUgaW5wdXQgcGFyYW1ldGVycy7gV2VpZ2h0IGluY2x1ZGVzIGxvZ2ljIHRvIHZhbGlkYXRlIHVuc2lnbmVkIGBjbGFpbWAgY2FsbC4AWFRvdGFsIENvbXBsZXhpdHk6IE8oMSkkPC93ZWlnaHQ+KG1pbnRfY2xhaW0QAQx3aG/BAgE8RXRoZXJldW1BZGRyZXNzAAEUdmFsdWUYATBCYWxhbmNlT2Y8VD4AAUB2ZXN0aW5nX3NjaGVkdWxlxQIB3E9wdGlvbjwoQmFsYW5jZU9mPFQ+LCBCYWxhbmNlT2Y8VD4sIEJsb2NrTnVtYmVyRm9yPFQ+KT4AASRzdGF0ZW1lbnTNAgFUT3B0aW9uPFN0YXRlbWVudEtpbmQ+AAE8hE1pbnQgYSBuZXcgY2xhaW0gdG8gY29sbGVjdCBET1RzLgDEVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1Jvb3RfLgAsUGFyYW1ldGVyczrwLSBgd2hvYDogVGhlIEV0aGVyZXVtIGFkZHJlc3MgYWxsb3dlZCB0byBjb2xsZWN0IHRoaXMgY2xhaW0uzC0gYHZhbHVlYDogVGhlIG51bWJlciBvZiBET1RzIHRoYXQgd2lsbCBiZSBjbGFpbWVkLgkBLSBgdmVzdGluZ19zY2hlZHVsZWA6IEFuIG9wdGlvbmFsIHZlc3Rpbmcgc2NoZWR1bGUgZm9yIHRoZXNlIERPVHMuACA8d2VpZ2h0PvxUaGUgd2VpZ2h0IG9mIHRoaXMgY2FsbCBpcyBpbnZhcmlhbnQgb3ZlciB0aGUgaW5wdXQgcGFyYW1ldGVycy4dAVdlIGFzc3VtZSB3b3JzdCBjYXNlIHRoYXQgYm90aCB2ZXN0aW5nIGFuZCBzdGF0ZW1lbnQgaXMgYmVpbmcgaW5zZXJ0ZWQuAFhUb3RhbCBDb21wbGV4aXR5OiBPKDEpJDwvd2VpZ2h0PjBjbGFpbV9hdHRlc3QMARBkZXN0AAEwVDo6QWNjb3VudElkAAFIZXRoZXJldW1fc2lnbmF0dXJluQIBOEVjZHNhU2lnbmF0dXJlAAEkc3RhdGVtZW50OAEcVmVjPHU4PgACbORNYWtlIGEgY2xhaW0gdG8gY29sbGVjdCB5b3VyIERPVHMgYnkgc2lnbmluZyBhIHN0YXRlbWVudC4AxFRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9Ob25lXy4AUFVuc2lnbmVkIFZhbGlkYXRpb246KQFBIGNhbGwgdG8gYGNsYWltX2F0dGVzdGAgaXMgZGVlbWVkIHZhbGlkIGlmIHRoZSBzaWduYXR1cmUgcHJvdmlkZWQgbWF0Y2hlc3x0aGUgZXhwZWN0ZWQgc2lnbmVkIG1lc3NhZ2Ugb2Y6AGg+IEV0aGVyZXVtIFNpZ25lZCBNZXNzYWdlOsA+IChjb25maWd1cmVkIHByZWZpeCBzdHJpbmcpKGFkZHJlc3MpKHN0YXRlbWVudCkASQFhbmQgYGFkZHJlc3NgIG1hdGNoZXMgdGhlIGBkZXN0YCBhY2NvdW50OyB0aGUgYHN0YXRlbWVudGAgbXVzdCBtYXRjaCB0aGF0IHdoaWNoIGlzwGV4cGVjdGVkIGFjY29yZGluZyB0byB5b3VyIHB1cmNoYXNlIGFycmFuZ2VtZW50LgAsUGFyYW1ldGVyczrYLSBgZGVzdGA6IFRoZSBkZXN0aW5hdGlvbiBhY2NvdW50IHRvIHBheW91dCB0aGUgY2xhaW0uXQEtIGBldGhlcmV1bV9zaWduYXR1cmVgOiBUaGUgc2lnbmF0dXJlIG9mIGFuIGV0aGVyZXVtIHNpZ25lZCBtZXNzYWdlIG1hdGNoaW5nIHRoZSBmb3JtYXRIICBkZXNjcmliZWQgYWJvdmUuOQEtIGBzdGF0ZW1lbnRgOiBUaGUgaWRlbnRpdHkgb2YgdGhlIHN0YXRlbWVudCB3aGljaCBpcyBiZWluZyBhdHRlc3RlZCB0byBpbiB0aGUwICBzaWduYXR1cmUuACA8d2VpZ2h0PvxUaGUgd2VpZ2h0IG9mIHRoaXMgY2FsbCBpcyBpbnZhcmlhbnQgb3ZlciB0aGUgaW5wdXQgcGFyYW1ldGVycy78V2VpZ2h0IGluY2x1ZGVzIGxvZ2ljIHRvIHZhbGlkYXRlIHVuc2lnbmVkIGBjbGFpbV9hdHRlc3RgIGNhbGwuAFhUb3RhbCBDb21wbGV4aXR5OiBPKDEpJDwvd2VpZ2h0PhhhdHRlc3QEASRzdGF0ZW1lbnQ4ARxWZWM8dTg+AANM9EF0dGVzdCB0byBhIHN0YXRlbWVudCwgbmVlZGVkIHRvIGZpbmFsaXplIHRoZSBjbGFpbXMgcHJvY2Vzcy4AGQFXQVJOSU5HOiBJbnNlY3VyZSB1bmxlc3MgeW91ciBjaGFpbiBpbmNsdWRlcyBgUHJldmFsaWRhdGVBdHRlc3RzYCBhcyBhSGBTaWduZWRFeHRlbnNpb25gLgBQVW5zaWduZWQgVmFsaWRhdGlvbjopAUEgY2FsbCB0byBhdHRlc3QgaXMgZGVlbWVkIHZhbGlkIGlmIHRoZSBzZW5kZXIgaGFzIGEgYFByZWNsYWltYCByZWdpc3RlcmVk9GFuZCBwcm92aWRlcyBhIGBzdGF0ZW1lbnRgIHdoaWNoIGlzIGV4cGVjdGVkIGZvciB0aGUgYWNjb3VudC4ALFBhcmFtZXRlcnM6OQEtIGBzdGF0ZW1lbnRgOiBUaGUgaWRlbnRpdHkgb2YgdGhlIHN0YXRlbWVudCB3aGljaCBpcyBiZWluZyBhdHRlc3RlZCB0byBpbiB0aGUwICBzaWduYXR1cmUuACA8d2VpZ2h0PvxUaGUgd2VpZ2h0IG9mIHRoaXMgY2FsbCBpcyBpbnZhcmlhbnQgb3ZlciB0aGUgaW5wdXQgcGFyYW1ldGVycy7wV2VpZ2h0IGluY2x1ZGVzIGxvZ2ljIHRvIGRvIHByZS12YWxpZGF0aW9uIG9uIGBhdHRlc3RgIGNhbGwuAFhUb3RhbCBDb21wbGV4aXR5OiBPKDEpJDwvd2VpZ2h0Pihtb3ZlX2NsYWltDAEMb2xkwQIBPEV0aGVyZXVtQWRkcmVzcwABDG5ld8ECATxFdGhlcmV1bUFkZHJlc3MAAThtYXliZV9wcmVjbGFpbdkBAVBPcHRpb248VDo6QWNjb3VudElkPgAEAAQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy65AgxccG9sa2Fkb3RfcnVudGltZV9jb21tb24YY2xhaW1zOEVjZHNhU2lnbmF0dXJlAAAEAL0CASBbdTg7IDY1XQAAvQIAAANBAAAACADBAgxccG9sa2Fkb3RfcnVudGltZV9jb21tb24YY2xhaW1zPEV0aGVyZXVtQWRkcmVzcwAABADgASBbdTg7IDIwXQAAxQIEGE9wdGlvbgQEVAHJAgEIEE5vbmUAAAAQU29tZQQAyQIAAAEAAMkCAAAEDBgYEADNAgQYT3B0aW9uBARUAdECAQgQTm9uZQAAABBTb21lBADRAgAAAQAA0QIMXHBvbGthZG90X3J1bnRpbWVfY29tbW9uGGNsYWltczRTdGF0ZW1lbnRLaW5kAAEIHFJlZ3VsYXIAAAAQU2FmdAABAADVAgw4cGFsbGV0X3V0aWxpdHkYcGFsbGV0EENhbGwEBFQAARgUYmF0Y2gEARRjYWxsc9kCAXxWZWM8PFQgYXMgQ29uZmlnPjo6UnVudGltZUNhbGw+AABIfFNlbmQgYSBiYXRjaCBvZiBkaXNwYXRjaCBjYWxscy4AsE1heSBiZSBjYWxsZWQgZnJvbSBhbnkgb3JpZ2luIGV4Y2VwdCBgTm9uZWAuAF0BLSBgY2FsbHNgOiBUaGUgY2FsbHMgdG8gYmUgZGlzcGF0Y2hlZCBmcm9tIHRoZSBzYW1lIG9yaWdpbi4gVGhlIG51bWJlciBvZiBjYWxsIG11c3Qgbm90OQEgIGV4Y2VlZCB0aGUgY29uc3RhbnQ6IGBiYXRjaGVkX2NhbGxzX2xpbWl0YCAoYXZhaWxhYmxlIGluIGNvbnN0YW50IG1ldGFkYXRhKS4AVQFJZiBvcmlnaW4gaXMgcm9vdCB0aGVuIHRoZSBjYWxscyBhcmUgZGlzcGF0Y2hlZCB3aXRob3V0IGNoZWNraW5nIG9yaWdpbiBmaWx0ZXIuIChUaGlz7GluY2x1ZGVzIGJ5cGFzc2luZyBgZnJhbWVfc3lzdGVtOjpDb25maWc6OkJhc2VDYWxsRmlsdGVyYCkuADQjIyBDb21wbGV4aXR50C0gTyhDKSB3aGVyZSBDIGlzIHRoZSBudW1iZXIgb2YgY2FsbHMgdG8gYmUgYmF0Y2hlZC4AVQFUaGlzIHdpbGwgcmV0dXJuIGBPa2AgaW4gYWxsIGNpcmN1bXN0YW5jZXMuIFRvIGRldGVybWluZSB0aGUgc3VjY2VzcyBvZiB0aGUgYmF0Y2gsIGFuMQFldmVudCBpcyBkZXBvc2l0ZWQuIElmIGEgY2FsbCBmYWlsZWQgYW5kIHRoZSBiYXRjaCB3YXMgaW50ZXJydXB0ZWQsIHRoZW4gdGhlVQFgQmF0Y2hJbnRlcnJ1cHRlZGAgZXZlbnQgaXMgZGVwb3NpdGVkLCBhbG9uZyB3aXRoIHRoZSBudW1iZXIgb2Ygc3VjY2Vzc2Z1bCBjYWxscyBtYWRlTQFhbmQgdGhlIGVycm9yIG9mIHRoZSBmYWlsZWQgY2FsbC4gSWYgYWxsIHdlcmUgc3VjY2Vzc2Z1bCwgdGhlbiB0aGUgYEJhdGNoQ29tcGxldGVkYExldmVudCBpcyBkZXBvc2l0ZWQuNGFzX2Rlcml2YXRpdmUIARRpbmRleFUBAQx1MTYAARBjYWxsXQEBfEJveDw8VCBhcyBDb25maWc+OjpSdW50aW1lQ2FsbD4AATTcU2VuZCBhIGNhbGwgdGhyb3VnaCBhbiBpbmRleGVkIHBzZXVkb255bSBvZiB0aGUgc2VuZGVyLgBVAUZpbHRlciBmcm9tIG9yaWdpbiBhcmUgcGFzc2VkIGFsb25nLiBUaGUgY2FsbCB3aWxsIGJlIGRpc3BhdGNoZWQgd2l0aCBhbiBvcmlnaW4gd2hpY2i8dXNlIHRoZSBzYW1lIGZpbHRlciBhcyB0aGUgb3JpZ2luIG9mIHRoaXMgY2FsbC4ARQFOT1RFOiBJZiB5b3UgbmVlZCB0byBlbnN1cmUgdGhhdCBhbnkgYWNjb3VudC1iYXNlZCBmaWx0ZXJpbmcgaXMgbm90IGhvbm9yZWQgKGkuZS5hAWJlY2F1c2UgeW91IGV4cGVjdCBgcHJveHlgIHRvIGhhdmUgYmVlbiB1c2VkIHByaW9yIGluIHRoZSBjYWxsIHN0YWNrIGFuZCB5b3UgZG8gbm90IHdhbnRRAXRoZSBjYWxsIHJlc3RyaWN0aW9ucyB0byBhcHBseSB0byBhbnkgc3ViLWFjY291bnRzKSwgdGhlbiB1c2UgYGFzX211bHRpX3RocmVzaG9sZF8xYHxpbiB0aGUgTXVsdGlzaWcgcGFsbGV0IGluc3RlYWQuAPROT1RFOiBQcmlvciB0byB2ZXJzaW9uICoxMiwgdGhpcyB3YXMgY2FsbGVkIGBhc19saW1pdGVkX3N1YmAuAMxUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXy4kYmF0Y2hfYWxsBAEUY2FsbHPZAgF8VmVjPDxUIGFzIENvbmZpZz46OlJ1bnRpbWVDYWxsPgACNOxTZW5kIGEgYmF0Y2ggb2YgZGlzcGF0Y2ggY2FsbHMgYW5kIGF0b21pY2FsbHkgZXhlY3V0ZSB0aGVtLiEBVGhlIHdob2xlIHRyYW5zYWN0aW9uIHdpbGwgcm9sbGJhY2sgYW5kIGZhaWwgaWYgYW55IG9mIHRoZSBjYWxscyBmYWlsZWQuALBNYXkgYmUgY2FsbGVkIGZyb20gYW55IG9yaWdpbiBleGNlcHQgYE5vbmVgLgBdAS0gYGNhbGxzYDogVGhlIGNhbGxzIHRvIGJlIGRpc3BhdGNoZWQgZnJvbSB0aGUgc2FtZSBvcmlnaW4uIFRoZSBudW1iZXIgb2YgY2FsbCBtdXN0IG5vdDkBICBleGNlZWQgdGhlIGNvbnN0YW50OiBgYmF0Y2hlZF9jYWxsc19saW1pdGAgKGF2YWlsYWJsZSBpbiBjb25zdGFudCBtZXRhZGF0YSkuAFUBSWYgb3JpZ2luIGlzIHJvb3QgdGhlbiB0aGUgY2FsbHMgYXJlIGRpc3BhdGNoZWQgd2l0aG91dCBjaGVja2luZyBvcmlnaW4gZmlsdGVyLiAoVGhpc+xpbmNsdWRlcyBieXBhc3NpbmcgYGZyYW1lX3N5c3RlbTo6Q29uZmlnOjpCYXNlQ2FsbEZpbHRlcmApLgA0IyMgQ29tcGxleGl0edAtIE8oQykgd2hlcmUgQyBpcyB0aGUgbnVtYmVyIG9mIGNhbGxzIHRvIGJlIGJhdGNoZWQuLGRpc3BhdGNoX2FzCAEkYXNfb3JpZ2luWQIBVEJveDxUOjpQYWxsZXRzT3JpZ2luPgABEGNhbGxdAQF8Qm94PDxUIGFzIENvbmZpZz46OlJ1bnRpbWVDYWxsPgADGMhEaXNwYXRjaGVzIGEgZnVuY3Rpb24gY2FsbCB3aXRoIGEgcHJvdmlkZWQgb3JpZ2luLgDEVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1Jvb3RfLgA0IyMgQ29tcGxleGl0eRwtIE8oMSkuLGZvcmNlX2JhdGNoBAEUY2FsbHPZAgF8VmVjPDxUIGFzIENvbmZpZz46OlJ1bnRpbWVDYWxsPgAENHxTZW5kIGEgYmF0Y2ggb2YgZGlzcGF0Y2ggY2FsbHMu1FVubGlrZSBgYmF0Y2hgLCBpdCBhbGxvd3MgZXJyb3JzIGFuZCB3b24ndCBpbnRlcnJ1cHQuALBNYXkgYmUgY2FsbGVkIGZyb20gYW55IG9yaWdpbiBleGNlcHQgYE5vbmVgLgBdAS0gYGNhbGxzYDogVGhlIGNhbGxzIHRvIGJlIGRpc3BhdGNoZWQgZnJvbSB0aGUgc2FtZSBvcmlnaW4uIFRoZSBudW1iZXIgb2YgY2FsbCBtdXN0IG5vdDkBICBleGNlZWQgdGhlIGNvbnN0YW50OiBgYmF0Y2hlZF9jYWxsc19saW1pdGAgKGF2YWlsYWJsZSBpbiBjb25zdGFudCBtZXRhZGF0YSkuAE0BSWYgb3JpZ2luIGlzIHJvb3QgdGhlbiB0aGUgY2FsbHMgYXJlIGRpc3BhdGNoIHdpdGhvdXQgY2hlY2tpbmcgb3JpZ2luIGZpbHRlci4gKFRoaXPsaW5jbHVkZXMgYnlwYXNzaW5nIGBmcmFtZV9zeXN0ZW06OkNvbmZpZzo6QmFzZUNhbGxGaWx0ZXJgKS4ANCMjIENvbXBsZXhpdHnQLSBPKEMpIHdoZXJlIEMgaXMgdGhlIG51bWJlciBvZiBjYWxscyB0byBiZSBiYXRjaGVkLix3aXRoX3dlaWdodAgBEGNhbGxdAQF8Qm94PDxUIGFzIENvbmZpZz46OlJ1bnRpbWVDYWxsPgABGHdlaWdodCgBGFdlaWdodAAFGMREaXNwYXRjaCBhIGZ1bmN0aW9uIGNhbGwgd2l0aCBhIHNwZWNpZmllZCB3ZWlnaHQuAC0BVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBjaGVjayB0aGUgd2VpZ2h0IG9mIHRoZSBjYWxsLCBhbmQgaW5zdGVhZCBhbGxvd3MgdGhluFJvb3Qgb3JpZ2luIHRvIHNwZWNpZnkgdGhlIHdlaWdodCBvZiB0aGUgY2FsbC4AxFRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9Sb290Xy4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMu2QIAAAJdAQDdAgw4cGFsbGV0X3NvY2lldHkYcGFsbGV0EENhbGwIBFQABEkAAVAMYmlkBAEUdmFsdWUYATxCYWxhbmNlT2Y8VCwgST4AACTcQSB1c2VyIG91dHNpZGUgb2YgdGhlIHNvY2lldHkgY2FuIG1ha2UgYSBiaWQgZm9yIGVudHJ5LgBhAVBheW1lbnQ6IFRoZSBncm91cCdzIENhbmRpZGF0ZSBEZXBvc2l0IHdpbGwgYmUgcmVzZXJ2ZWQgZm9yIG1ha2luZyBhIGJpZC4gSXQgaXMgcmV0dXJuZWTsd2hlbiB0aGUgYmlkIGJlY29tZXMgYSBtZW1iZXIsIG9yIGlmIHRoZSBiaWQgY2FsbHMgYHVuYmlkYC4AzFRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfLgAsUGFyYW1ldGVyczpVAS0gYHZhbHVlYDogQSBvbmUgdGltZSBwYXltZW50IHRoZSBiaWQgd291bGQgbGlrZSB0byByZWNlaXZlIHdoZW4gam9pbmluZyB0aGUgc29jaWV0eS4UdW5iaWQAARzUQSBiaWRkZXIgY2FuIHJlbW92ZSB0aGVpciBiaWQgZm9yIGVudHJ5IGludG8gc29jaWV0eS78QnkgZG9pbmcgc28sIHRoZXkgd2lsbCBoYXZlIHRoZWlyIGNhbmRpZGF0ZSBkZXBvc2l0IHJldHVybmVkIG9ygHRoZXkgd2lsbCB1bnZvdWNoIHRoZWlyIHZvdWNoZXIuAPhQYXltZW50OiBUaGUgYmlkIGRlcG9zaXQgaXMgdW5yZXNlcnZlZCBpZiB0aGUgdXNlciBtYWRlIGEgYmlkLgABAVRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfIGFuZCBhIGJpZGRlci4Udm91Y2gMAQx3aG+dAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AARR2YWx1ZRgBPEJhbGFuY2VPZjxULCBJPgABDHRpcBgBPEJhbGFuY2VPZjxULCBJPgACREEBQXMgYSBtZW1iZXIsIHZvdWNoIGZvciBzb21lb25lIHRvIGpvaW4gc29jaWV0eSBieSBwbGFjaW5nIGEgYmlkIG9uIHRoZWlyIGJlaGFsZi4AUQFUaGVyZSBpcyBubyBkZXBvc2l0IHJlcXVpcmVkIHRvIHZvdWNoIGZvciBhIG5ldyBiaWQsIGJ1dCBhIG1lbWJlciBjYW4gb25seSB2b3VjaCBmb3JZAW9uZSBiaWQgYXQgYSB0aW1lLiBJZiB0aGUgYmlkIGJlY29tZXMgYSBzdXNwZW5kZWQgY2FuZGlkYXRlIGFuZCB1bHRpbWF0ZWx5IHJlamVjdGVkIGJ5PQF0aGUgc3VzcGVuc2lvbiBqdWRnZW1lbnQgb3JpZ2luLCB0aGUgbWVtYmVyIHdpbGwgYmUgYmFubmVkIGZyb20gdm91Y2hpbmcgYWdhaW4uAFUBQXMgYSB2b3VjaGluZyBtZW1iZXIsIHlvdSBjYW4gY2xhaW0gYSB0aXAgaWYgdGhlIGNhbmRpZGF0ZSBpcyBhY2NlcHRlZC4gVGhpcyB0aXAgd2lsbE0BYmUgcGFpZCBhcyBhIHBvcnRpb24gb2YgdGhlIHJld2FyZCB0aGUgbWVtYmVyIHdpbGwgcmVjZWl2ZSBmb3Igam9pbmluZyB0aGUgc29jaWV0eS4AAQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXyBhbmQgYSBtZW1iZXIuACxQYXJhbWV0ZXJzOsgtIGB3aG9gOiBUaGUgdXNlciB3aG8geW91IHdvdWxkIGxpa2UgdG8gdm91Y2ggZm9yLk0BLSBgdmFsdWVgOiBUaGUgdG90YWwgcmV3YXJkIHRvIGJlIHBhaWQgYmV0d2VlbiB5b3UgYW5kIHRoZSBjYW5kaWRhdGUgaWYgdGhleSBiZWNvbWVgYSBtZW1iZXIgaW4gdGhlIHNvY2lldHkuRQEtIGB0aXBgOiBZb3VyIGN1dCBvZiB0aGUgdG90YWwgYHZhbHVlYCBwYXlvdXQgd2hlbiB0aGUgY2FuZGlkYXRlIGlzIGluZHVjdGVkIGludG8RAXRoZSBzb2NpZXR5LiBUaXBzIGxhcmdlciB0aGFuIGB2YWx1ZWAgd2lsbCBiZSBzYXR1cmF0ZWQgdXBvbiBwYXlvdXQuHHVudm91Y2gAAxwpAUFzIGEgdm91Y2hpbmcgbWVtYmVyLCB1bnZvdWNoIGEgYmlkLiBUaGlzIG9ubHkgd29ya3Mgd2hpbGUgdm91Y2hlZCB1c2VyIGlzkG9ubHkgYSBiaWRkZXIgKGFuZCBub3QgYSBjYW5kaWRhdGUpLgAlAVRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfIGFuZCBhIHZvdWNoaW5nIG1lbWJlci4ALFBhcmFtZXRlcnM6KQEtIGBwb3NgOiBQb3NpdGlvbiBpbiB0aGUgYEJpZHNgIHZlY3RvciBvZiB0aGUgYmlkIHdobyBzaG91bGQgYmUgdW52b3VjaGVkLhB2b3RlCAEkY2FuZGlkYXRlnQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEcYXBwcm92ZSABEGJvb2wABCCEQXMgYSBtZW1iZXIsIHZvdGUgb24gYSBjYW5kaWRhdGUuAAEBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8gYW5kIGEgbWVtYmVyLgAsUGFyYW1ldGVyczoJAS0gYGNhbmRpZGF0ZWA6IFRoZSBjYW5kaWRhdGUgdGhhdCB0aGUgbWVtYmVyIHdvdWxkIGxpa2UgdG8gYmlkIG9uLkUBLSBgYXBwcm92ZWA6IEEgYm9vbGVhbiB3aGljaCBzYXlzIGlmIHRoZSBjYW5kaWRhdGUgc2hvdWxkIGJlIGFwcHJvdmVkIChgdHJ1ZWApIG9yVCAgcmVqZWN0ZWQgKGBmYWxzZWApLjRkZWZlbmRlcl92b3RlBAEcYXBwcm92ZSABEGJvb2wABRyIQXMgYSBtZW1iZXIsIHZvdGUgb24gdGhlIGRlZmVuZGVyLgABAVRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfIGFuZCBhIG1lbWJlci4ALFBhcmFtZXRlcnM68C0gYGFwcHJvdmVgOiBBIGJvb2xlYW4gd2hpY2ggc2F5cyBpZiB0aGUgY2FuZGlkYXRlIHNob3VsZCBiZaBhcHByb3ZlZCAoYHRydWVgKSBvciByZWplY3RlZCAoYGZhbHNlYCkuGHBheW91dAAGKEEBVHJhbnNmZXIgdGhlIGZpcnN0IG1hdHVyZWQgcGF5b3V0IGZvciB0aGUgc2VuZGVyIGFuZCByZW1vdmUgaXQgZnJvbSB0aGUgcmVjb3Jkcy4AQQFOT1RFOiBUaGlzIGV4dHJpbnNpYyBuZWVkcyB0byBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgdG8gY2xhaW0gbXVsdGlwbGUgbWF0dXJlZCBwYXlvdXRzLgAdAVBheW1lbnQ6IFRoZSBtZW1iZXIgd2lsbCByZWNlaXZlIGEgcGF5bWVudCBlcXVhbCB0byB0aGVpciBmaXJzdCBtYXR1cmVkdHBheW91dCB0byB0aGVpciBmcmVlIGJhbGFuY2UuABEBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8gYW5kIGEgbWVtYmVyIHdpdGhIcGF5b3V0cyByZW1haW5pbmcuLHdhaXZlX3JlcGF5BAEYYW1vdW50GAE8QmFsYW5jZU9mPFQsIEk+AAcITQFSZXBheSB0aGUgcGF5bWVudCBwcmV2aW91c2x5IGdpdmVuIHRvIHRoZSBtZW1iZXIgd2l0aCB0aGUgc2lnbmVkIG9yaWdpbiwgcmVtb3ZlIGFueeRwZW5kaW5nIHBheW1lbnRzLCBhbmQgZWxldmF0ZSB0aGVtIGZyb20gcmFuayAwIHRvIHJhbmsgMS40Zm91bmRfc29jaWV0eRgBHGZvdW5kZXKdAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AASxtYXhfbWVtYmVycxABDHUzMgABKG1heF9pbnRha2UQAQx1MzIAASxtYXhfc3RyaWtlcxABDHUzMgABRGNhbmRpZGF0ZV9kZXBvc2l0GAE8QmFsYW5jZU9mPFQsIEk+AAEUcnVsZXM4ARxWZWM8dTg+AAhESEZvdW5kIHRoZSBzb2NpZXR5LgDsVGhpcyBpcyBkb25lIGFzIGEgZGlzY3JldGUgYWN0aW9uIGluIG9yZGVyIHRvIGFsbG93IGZvciB0aGUVAXBhbGxldCB0byBiZSBpbmNsdWRlZCBpbnRvIGEgcnVubmluZyBjaGFpbiBhbmQgY2FuIG9ubHkgYmUgZG9uZSBvbmNlLgAZAVRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIGZyb20gdGhlIF9Gb3VuZGVyU2V0T3JpZ2luXy4ALFBhcmFtZXRlcnM6FQEtIGBmb3VuZGVyYCAtIFRoZSBmaXJzdCBtZW1iZXIgYW5kIGhlYWQgb2YgdGhlIG5ld2x5IGZvdW5kZWQgc29jaWV0eS4RAS0gYG1heF9tZW1iZXJzYCAtIFRoZSBpbml0aWFsIG1heCBudW1iZXIgb2YgbWVtYmVycyBmb3IgdGhlIHNvY2lldHkuEQEtIGBtYXhfaW50YWtlYCAtIFRoZSBtYXhpbXVtIG51bWJlciBvZiBjYW5kaWRhdGVzIHBlciBpbnRha2UgcGVyaW9kLkkBLSBgbWF4X3N0cmlrZXNgOiBUaGUgbWF4aW11bSBudW1iZXIgb2Ygc3RyaWtlcyBhIG1lbWJlciBtYXkgZ2V0IGJlZm9yZSB0aGV5IGJlY29tZdggIHN1c3BlbmRlZCBhbmQgbWF5IG9ubHkgYmUgcmVpbnN0YXRlZCBieSB0aGUgZm91bmRlci5ZAS0gYGNhbmRpZGF0ZV9kZXBvc2l0YDogVGhlIGRlcG9zaXQgcmVxdWlyZWQgdG8gbWFrZSBhIGJpZCBmb3IgbWVtYmVyc2hpcCBvZiB0aGUgZ3JvdXAu8C0gYHJ1bGVzYCAtIFRoZSBydWxlcyBvZiB0aGlzIHNvY2lldHkgY29uY2VybmluZyBtZW1iZXJzaGlwLgBAQ29tcGxleGl0eTogTygxKSBkaXNzb2x2ZQAJFLBEaXNzb2x2ZSB0aGUgc29jaWV0eSBhbmQgcmVtb3ZlIGFsbCBtZW1iZXJzLgBZAVRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIFNpZ25lZCwgYW5kIHRoZSBzaWduaW5nIGFjY291bnQgbXVzdCBiZSBib3RoVQF0aGUgYEZvdW5kZXJgIGFuZCB0aGUgYEhlYWRgLiBUaGlzIGltcGxpZXMgdGhhdCBpdCBtYXkgb25seSBiZSBkb25lIHdoZW4gdGhlcmUgaXMgb25lHG1lbWJlci5YanVkZ2Vfc3VzcGVuZGVkX21lbWJlcggBDHdob50BAVBBY2NvdW50SWRMb29rdXBPZjxUPgABHGZvcmdpdmUgARBib29sAAo4KQFBbGxvdyBzdXNwZW5zaW9uIGp1ZGdlbWVudCBvcmlnaW4gdG8gbWFrZSBqdWRnZW1lbnQgb24gYSBzdXNwZW5kZWQgbWVtYmVyLgBVAUlmIGEgc3VzcGVuZGVkIG1lbWJlciBpcyBmb3JnaXZlbiwgd2Ugc2ltcGx5IGFkZCB0aGVtIGJhY2sgYXMgYSBtZW1iZXIsIG5vdCBhZmZlY3RpbmfIYW55IG9mIHRoZSBleGlzdGluZyBzdG9yYWdlIGl0ZW1zIGZvciB0aGF0IG1lbWJlci4ARQFJZiBhIHN1c3BlbmRlZCBtZW1iZXIgaXMgcmVqZWN0ZWQsIHJlbW92ZSBhbGwgYXNzb2NpYXRlZCBzdG9yYWdlIGl0ZW1zLCBpbmNsdWRpbmf8dGhlaXIgcGF5b3V0cywgYW5kIHJlbW92ZSBhbnkgdm91Y2hlZCBiaWRzIHRoZXkgY3VycmVudGx5IGhhdmUuAAkBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgU2lnbmVkIGZyb20gdGhlIEZvdW5kZXIuACxQYXJhbWV0ZXJzOrAtIGB3aG9gIC0gVGhlIHN1c3BlbmRlZCBtZW1iZXIgdG8gYmUganVkZ2VkLlUBLSBgZm9yZ2l2ZWAgLSBBIGJvb2xlYW4gcmVwcmVzZW50aW5nIHdoZXRoZXIgdGhlIHN1c3BlbnNpb24ganVkZ2VtZW50IG9yaWdpbiBmb3JnaXZlc8wgIChgdHJ1ZWApIG9yIHJlamVjdHMgKGBmYWxzZWApIGEgc3VzcGVuZGVkIG1lbWJlci44c2V0X3BhcmFtZXRlcnMQASxtYXhfbWVtYmVycxABDHUzMgABKG1heF9pbnRha2UQAQx1MzIAASxtYXhfc3RyaWtlcxABDHUzMgABRGNhbmRpZGF0ZV9kZXBvc2l0GAE8QmFsYW5jZU9mPFQsIEk+AAswYQFDaGFuZ2UgdGhlIG1heGltdW0gbnVtYmVyIG9mIG1lbWJlcnMgaW4gc29jaWV0eSBhbmQgdGhlIG1heGltdW0gbnVtYmVyIG9mIG5ldyBjYW5kaWRhdGVzaGluIGEgc2luZ2xlIGludGFrZSBwZXJpb2QuAAEBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgU2lnbmVkIGJ5IHRoZSBGb3VuZGVyLgAsUGFyYW1ldGVyczpVAS0gYG1heF9tZW1iZXJzYCAtIFRoZSBtYXhpbXVtIG51bWJlciBvZiBtZW1iZXJzIGZvciB0aGUgc29jaWV0eS4gVGhpcyBtdXN0IGJlIG5vIGxlc3OUICB0aGFuIHRoZSBjdXJyZW50IG51bWJlciBvZiBtZW1iZXJzLhEBLSBgbWF4X2ludGFrZWAgLSBUaGUgbWF4aW11bSBudW1iZXIgb2YgY2FuZGlkYXRlcyBwZXIgaW50YWtlIHBlcmlvZC5JAS0gYG1heF9zdHJpa2VzYDogVGhlIG1heGltdW0gbnVtYmVyIG9mIHN0cmlrZXMgYSBtZW1iZXIgbWF5IGdldCBiZWZvcmUgdGhleSBiZWNvbWXYICBzdXNwZW5kZWQgYW5kIG1heSBvbmx5IGJlIHJlaW5zdGF0ZWQgYnkgdGhlIGZvdW5kZXIuWQEtIGBjYW5kaWRhdGVfZGVwb3NpdGA6IFRoZSBkZXBvc2l0IHJlcXVpcmVkIHRvIG1ha2UgYSBiaWQgZm9yIG1lbWJlcnNoaXAgb2YgdGhlIGdyb3VwLjhwdW5pc2hfc2tlcHRpYwAMCFUBUHVuaXNoIHRoZSBza2VwdGljIHdpdGggYSBzdHJpa2UgaWYgdGhleSBkaWQgbm90IHZvdGUgb24gYSBjYW5kaWRhdGUuIENhbGxhYmxlIGJ5IHRoZShjYW5kaWRhdGUuQGNsYWltX21lbWJlcnNoaXAADQgNAVRyYW5zZm9ybSBhbiBhcHByb3ZlZCBjYW5kaWRhdGUgaW50byBhIG1lbWJlci4gQ2FsbGFibGUgb25seSBieSB0aGX4dGhlIGNhbmRpZGF0ZSwgYW5kIG9ubHkgYWZ0ZXIgdGhlIHBlcmlvZCBmb3Igdm90aW5nIGhhcyBlbmRlZC5EYmVzdG93X21lbWJlcnNoaXAEASRjYW5kaWRhdGUAATBUOjpBY2NvdW50SWQADgxhAVRyYW5zZm9ybSBhbiBhcHByb3ZlZCBjYW5kaWRhdGUgaW50byBhIG1lbWJlci4gQ2FsbGFibGUgb25seSBieSB0aGUgU2lnbmVkIG9yaWdpbiBvZiB0aGVZAUZvdW5kZXIsIG9ubHkgYWZ0ZXIgdGhlIHBlcmlvZCBmb3Igdm90aW5nIGhhcyBlbmRlZCBhbmQgb25seSB3aGVuIHRoZSBjYW5kaWRhdGUgaXMgbm90RGNsZWFybHkgcmVqZWN0ZWQuOGtpY2tfY2FuZGlkYXRlBAEkY2FuZGlkYXRlAAEwVDo6QWNjb3VudElkAA8UXQFSZW1vdmUgdGhlIGNhbmRpZGF0ZSdzIGFwcGxpY2F0aW9uIGZyb20gdGhlIHNvY2lldHkuIENhbGxhYmxlIG9ubHkgYnkgdGhlIFNpZ25lZCBvcmlnaW5VAW9mIHRoZSBGb3VuZGVyLCBvbmx5IGFmdGVyIHRoZSBwZXJpb2QgZm9yIHZvdGluZyBoYXMgZW5kZWQsIGFuZCBvbmx5IHdoZW4gdGhleSBkbyBub3RYaGF2ZSBhIGNsZWFyIGFwcHJvdmFsLgC4QW55IGJpZCBkZXBvc2l0IGlzIGxvc3QgYW5kIHZvdWNoZXIgaXMgYmFubmVkLkByZXNpZ25fY2FuZGlkYWN5ABAMUQFSZW1vdmUgdGhlIGNhbmRpZGF0ZSdzIGFwcGxpY2F0aW9uIGZyb20gdGhlIHNvY2lldHkuIENhbGxhYmxlIG9ubHkgYnkgdGhlIGNhbmRpZGF0ZS4AuEFueSBiaWQgZGVwb3NpdCBpcyBsb3N0IGFuZCB2b3VjaGVyIGlzIGJhbm5lZC44ZHJvcF9jYW5kaWRhdGUEASRjYW5kaWRhdGUAATBUOjpBY2NvdW50SWQAERQtAVJlbW92ZSBhIGBjYW5kaWRhdGVgJ3MgZmFpbGVkIGFwcGxpY2F0aW9uIGZyb20gdGhlIHNvY2lldHkuIENhbGxhYmxlIGJ5IGFueRkBc2lnbmVkIG9yaWdpbiBidXQgb25seSBhdCB0aGUgZW5kIG9mIHRoZSBzdWJzZXF1ZW50IHJvdW5kIGFuZCBvbmx5IGZvcsBhIGNhbmRpZGF0ZSB3aXRoIG1vcmUgcmVqZWN0aW9ucyB0aGFuIGFwcHJvdmFscy4AyFRoZSBiaWQgZGVwb3NpdCBpcyBsb3N0IGFuZCB0aGUgdm91Y2hlciBpcyBiYW5uZWQuRGNsZWFudXBfY2FuZGlkYWN5CAEkY2FuZGlkYXRlAAEwVDo6QWNjb3VudElkAAEMbWF4EAEMdTMyABIM5FJlbW92ZSB1cCB0byBgbWF4YCBzdGFsZSB2b3RlcyBmb3IgdGhlIGdpdmVuIGBjYW5kaWRhdGVgLgBZAU1heSBiZSBjYWxsZWQgYnkgYW55IFNpZ25lZCBvcmlnaW4sIGJ1dCBvbmx5IGFmdGVyIHRoZSBjYW5kaWRhdGUncyBjYW5kaWRhY3kgaXMgZW5kZWQuRGNsZWFudXBfY2hhbGxlbmdlCAE8Y2hhbGxlbmdlX3JvdW5kEAEoUm91bmRJbmRleAABDG1heBABDHUzMgATDD0BUmVtb3ZlIHVwIHRvIGBtYXhgIHN0YWxlIHZvdGVzIGZvciB0aGUgZGVmZW5kZXIgaW4gdGhlIGdpdmVuIGBjaGFsbGVuZ2Vfcm91bmRgLgBBAU1heSBiZSBjYWxsZWQgYnkgYW55IFNpZ25lZCBvcmlnaW4sIGJ1dCBvbmx5IGFmdGVyIHRoZSBjaGFsbGVuZ2Ugcm91bmQgaXMgZW5kZWQuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLuECDDxwYWxsZXRfcmVjb3ZlcnkYcGFsbGV0EENhbGwEBFQAASQwYXNfcmVjb3ZlcmVkCAEcYWNjb3VudJ0BAVBBY2NvdW50SWRMb29rdXBPZjxUPgABEGNhbGxdAQF8Qm94PDxUIGFzIENvbmZpZz46OlJ1bnRpbWVDYWxsPgAAIKBTZW5kIGEgY2FsbCB0aHJvdWdoIGEgcmVjb3ZlcmVkIGFjY291bnQuABEBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8gYW5kIHJlZ2lzdGVyZWQgdG/kYmUgYWJsZSB0byBtYWtlIGNhbGxzIG9uIGJlaGFsZiBvZiB0aGUgcmVjb3ZlcmVkIGFjY291bnQuACxQYXJhbWV0ZXJzOiEBLSBgYWNjb3VudGA6IFRoZSByZWNvdmVyZWQgYWNjb3VudCB5b3Ugd2FudCB0byBtYWtlIGEgY2FsbCBvbi1iZWhhbGYtb2Yu/C0gYGNhbGxgOiBUaGUgY2FsbCB5b3Ugd2FudCB0byBtYWtlIHdpdGggdGhlIHJlY292ZXJlZCBhY2NvdW50LjRzZXRfcmVjb3ZlcmVkCAEQbG9zdJ0BAVBBY2NvdW50SWRMb29rdXBPZjxUPgABHHJlc2N1ZXKdAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AASAZAUFsbG93IFJPT1QgdG8gYnlwYXNzIHRoZSByZWNvdmVyeSBwcm9jZXNzIGFuZCBzZXQgYW4gYSByZXNjdWVyIGFjY291bnRwZm9yIGEgbG9zdCBhY2NvdW50IGRpcmVjdGx5LgDEVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1JPT1RfLgAsUGFyYW1ldGVyczq0LSBgbG9zdGA6IFRoZSAibG9zdCBhY2NvdW50IiB0byBiZSByZWNvdmVyZWQuGQEtIGByZXNjdWVyYDogVGhlICJyZXNjdWVyIGFjY291bnQiIHdoaWNoIGNhbiBjYWxsIGFzIHRoZSBsb3N0IGFjY291bnQuPGNyZWF0ZV9yZWNvdmVyeQwBHGZyaWVuZHOtAQFEVmVjPFQ6OkFjY291bnRJZD4AASR0aHJlc2hvbGRVAQEMdTE2AAEwZGVsYXlfcGVyaW9kEAFEQmxvY2tOdW1iZXJGb3I8VD4AAkBZAUNyZWF0ZSBhIHJlY292ZXJ5IGNvbmZpZ3VyYXRpb24gZm9yIHlvdXIgYWNjb3VudC4gVGhpcyBtYWtlcyB5b3VyIGFjY291bnQgcmVjb3ZlcmFibGUuAC0BUGF5bWVudDogYENvbmZpZ0RlcG9zaXRCYXNlYCArIGBGcmllbmREZXBvc2l0RmFjdG9yYCAqICNfb2ZfZnJpZW5kcyBiYWxhbmNlRQF3aWxsIGJlIHJlc2VydmVkIGZvciBzdG9yaW5nIHRoZSByZWNvdmVyeSBjb25maWd1cmF0aW9uLiBUaGlzIGRlcG9zaXQgaXMgcmV0dXJuZWS4aW4gZnVsbCB3aGVuIHRoZSB1c2VyIGNhbGxzIGByZW1vdmVfcmVjb3ZlcnlgLgDMVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uACxQYXJhbWV0ZXJzOkkBLSBgZnJpZW5kc2A6IEEgbGlzdCBvZiBmcmllbmRzIHlvdSB0cnVzdCB0byB2b3VjaCBmb3IgcmVjb3ZlcnkgYXR0ZW1wdHMuIFNob3VsZCBiZaggIG9yZGVyZWQgYW5kIGNvbnRhaW4gbm8gZHVwbGljYXRlIHZhbHVlcy5ZAS0gYHRocmVzaG9sZGA6IFRoZSBudW1iZXIgb2YgZnJpZW5kcyB0aGF0IG11c3Qgdm91Y2ggZm9yIGEgcmVjb3ZlcnkgYXR0ZW1wdCBiZWZvcmUgdGhlVQEgIGFjY291bnQgY2FuIGJlIHJlY292ZXJlZC4gU2hvdWxkIGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgbGVuZ3RoIG9mIHRoZSBsaXN0IG9mKCAgZnJpZW5kcy5NAS0gYGRlbGF5X3BlcmlvZGA6IFRoZSBudW1iZXIgb2YgYmxvY2tzIGFmdGVyIGEgcmVjb3ZlcnkgYXR0ZW1wdCBpcyBpbml0aWFsaXplZCB0aGF00CAgbmVlZHMgdG8gcGFzcyBiZWZvcmUgdGhlIGFjY291bnQgY2FuIGJlIHJlY292ZXJlZC5EaW5pdGlhdGVfcmVjb3ZlcnkEARxhY2NvdW50nQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAMs6EluaXRpYXRlIHRoZSBwcm9jZXNzIGZvciByZWNvdmVyaW5nIGEgcmVjb3ZlcmFibGUgYWNjb3VudC4AGQFQYXltZW50OiBgUmVjb3ZlcnlEZXBvc2l0YCBiYWxhbmNlIHdpbGwgYmUgcmVzZXJ2ZWQgZm9yIGluaXRpYXRpbmcgdGhlIQFyZWNvdmVyeSBwcm9jZXNzLiBUaGlzIGRlcG9zaXQgd2lsbCBhbHdheXMgYmUgcmVwYXRyaWF0ZWQgdG8gdGhlIGFjY291bnS0dHJ5aW5nIHRvIGJlIHJlY292ZXJlZC4gU2VlIGBjbG9zZV9yZWNvdmVyeWAuAMxUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXy4ALFBhcmFtZXRlcnM6QQEtIGBhY2NvdW50YDogVGhlIGxvc3QgYWNjb3VudCB0aGF0IHlvdSB3YW50IHRvIHJlY292ZXIuIFRoaXMgYWNjb3VudCBuZWVkcyB0byBiZcwgIHJlY292ZXJhYmxlIChpLmUuIGhhdmUgYSByZWNvdmVyeSBjb25maWd1cmF0aW9uKS44dm91Y2hfcmVjb3ZlcnkIARBsb3N0nQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEccmVzY3Vlcp0BAVBBY2NvdW50SWRMb29rdXBPZjxUPgAEMCUBQWxsb3cgYSAiZnJpZW5kIiBvZiBhIHJlY292ZXJhYmxlIGFjY291bnQgdG8gdm91Y2ggZm9yIGFuIGFjdGl2ZSByZWNvdmVyeWRwcm9jZXNzIGZvciB0aGF0IGFjY291bnQuACUBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8gYW5kIG11c3QgYmUgYSAiZnJpZW5kInBmb3IgdGhlIHJlY292ZXJhYmxlIGFjY291bnQuACxQYXJhbWV0ZXJzOtAtIGBsb3N0YDogVGhlIGxvc3QgYWNjb3VudCB0aGF0IHlvdSB3YW50IHRvIHJlY292ZXIuWQEtIGByZXNjdWVyYDogVGhlIGFjY291bnQgdHJ5aW5nIHRvIHJlc2N1ZSB0aGUgbG9zdCBhY2NvdW50IHRoYXQgeW91IHdhbnQgdG8gdm91Y2ggZm9yLgAhAVRoZSBjb21iaW5hdGlvbiBvZiB0aGVzZSB0d28gcGFyYW1ldGVycyBtdXN0IHBvaW50IHRvIGFuIGFjdGl2ZSByZWNvdmVyeSBwcm9jZXNzLjhjbGFpbV9yZWNvdmVyeQQBHGFjY291bnSdAQFQQWNjb3VudElkTG9va3VwT2Y8VD4ABSTwQWxsb3cgYSBzdWNjZXNzZnVsIHJlc2N1ZXIgdG8gY2xhaW0gdGhlaXIgcmVjb3ZlcmVkIGFjY291bnQuACkBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8gYW5kIG11c3QgYmUgYSAicmVzY3VlciIZAXdobyBoYXMgc3VjY2Vzc2Z1bGx5IGNvbXBsZXRlZCB0aGUgYWNjb3VudCByZWNvdmVyeSBwcm9jZXNzOiBjb2xsZWN0ZWQtAWB0aHJlc2hvbGRgIG9yIG1vcmUgdm91Y2hlcywgd2FpdGVkIGBkZWxheV9wZXJpb2RgIGJsb2NrcyBzaW5jZSBpbml0aWF0aW9uLgAsUGFyYW1ldGVyczpdAS0gYGFjY291bnRgOiBUaGUgbG9zdCBhY2NvdW50IHRoYXQgeW91IHdhbnQgdG8gY2xhaW0gaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHJlY292ZXJlZCBieRggIHlvdS44Y2xvc2VfcmVjb3ZlcnkEARxyZXNjdWVynQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAYsEQFBcyB0aGUgY29udHJvbGxlciBvZiBhIHJlY292ZXJhYmxlIGFjY291bnQsIGNsb3NlIGFuIGFjdGl2ZSByZWNvdmVyeWRwcm9jZXNzIGZvciB5b3VyIGFjY291bnQuAB0BUGF5bWVudDogQnkgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLCB0aGUgcmVjb3ZlcmFibGUgYWNjb3VudCB3aWxsIHJlY2VpdmX0dGhlIHJlY292ZXJ5IGRlcG9zaXQgYFJlY292ZXJ5RGVwb3NpdGAgcGxhY2VkIGJ5IHRoZSByZXNjdWVyLgABAVRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfIGFuZCBtdXN0IGJlIGHscmVjb3ZlcmFibGUgYWNjb3VudCB3aXRoIGFuIGFjdGl2ZSByZWNvdmVyeSBwcm9jZXNzIGZvciBpdC4ALFBhcmFtZXRlcnM6DQEtIGByZXNjdWVyYDogVGhlIGFjY291bnQgdHJ5aW5nIHRvIHJlc2N1ZSB0aGlzIHJlY292ZXJhYmxlIGFjY291bnQuPHJlbW92ZV9yZWNvdmVyeQAHLFkBUmVtb3ZlIHRoZSByZWNvdmVyeSBwcm9jZXNzIGZvciB5b3VyIGFjY291bnQuIFJlY292ZXJlZCBhY2NvdW50cyBhcmUgc3RpbGwgYWNjZXNzaWJsZS4AEQFOT1RFOiBUaGUgdXNlciBtdXN0IG1ha2Ugc3VyZSB0byBjYWxsIGBjbG9zZV9yZWNvdmVyeWAgb24gYWxsIGFjdGl2ZQUBcmVjb3ZlcnkgYXR0ZW1wdHMgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiBlbHNlIGl0IHdpbGwgZmFpbC4AIQFQYXltZW50OiBCeSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gdGhlIHJlY292ZXJhYmxlIGFjY291bnQgd2lsbCB1bnJlc2VydmWUdGhlaXIgcmVjb3ZlcnkgY29uZmlndXJhdGlvbiBkZXBvc2l0LvAoYENvbmZpZ0RlcG9zaXRCYXNlYCArIGBGcmllbmREZXBvc2l0RmFjdG9yYCAqICNfb2ZfZnJpZW5kcykAAQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXyBhbmQgbXVzdCBiZSBh4HJlY292ZXJhYmxlIGFjY291bnQgKGkuZS4gaGFzIGEgcmVjb3ZlcnkgY29uZmlndXJhdGlvbikuQGNhbmNlbF9yZWNvdmVyZWQEARxhY2NvdW50nQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAgc3ENhbmNlbCB0aGUgYWJpbGl0eSB0byB1c2UgYGFzX3JlY292ZXJlZGAgZm9yIGBhY2NvdW50YC4AEQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXyBhbmQgcmVnaXN0ZXJlZCB0b+RiZSBhYmxlIHRvIG1ha2UgY2FsbHMgb24gYmVoYWxmIG9mIHRoZSByZWNvdmVyZWQgYWNjb3VudC4ALFBhcmFtZXRlcnM6FQEtIGBhY2NvdW50YDogVGhlIHJlY292ZXJlZCBhY2NvdW50IHlvdSBhcmUgYWJsZSB0byBjYWxsIG9uLWJlaGFsZi1vZi4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMu5QIMOHBhbGxldF92ZXN0aW5nGHBhbGxldBBDYWxsBARUAAEYEHZlc3QAACS4VW5sb2NrIGFueSB2ZXN0ZWQgZnVuZHMgb2YgdGhlIHNlbmRlciBhY2NvdW50LgBdAVRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfIGFuZCB0aGUgc2VuZGVyIG11c3QgaGF2ZSBmdW5kcyBzdGlsbGRsb2NrZWQgdW5kZXIgdGhpcyBwYWxsZXQuANBFbWl0cyBlaXRoZXIgYFZlc3RpbmdDb21wbGV0ZWRgIG9yIGBWZXN0aW5nVXBkYXRlZGAuADQjIyBDb21wbGV4aXR5JC0gYE8oMSlgLih2ZXN0X290aGVyBAEYdGFyZ2V0nQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEsuFVubG9jayBhbnkgdmVzdGVkIGZ1bmRzIG9mIGEgYHRhcmdldGAgYWNjb3VudC4AzFRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfLgBRAS0gYHRhcmdldGA6IFRoZSBhY2NvdW50IHdob3NlIHZlc3RlZCBmdW5kcyBzaG91bGQgYmUgdW5sb2NrZWQuIE11c3QgaGF2ZSBmdW5kcyBzdGlsbGRsb2NrZWQgdW5kZXIgdGhpcyBwYWxsZXQuANBFbWl0cyBlaXRoZXIgYFZlc3RpbmdDb21wbGV0ZWRgIG9yIGBWZXN0aW5nVXBkYXRlZGAuADQjIyBDb21wbGV4aXR5JC0gYE8oMSlgLjx2ZXN0ZWRfdHJhbnNmZXIIARh0YXJnZXSdAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AASBzY2hlZHVsZekCAbBWZXN0aW5nSW5mbzxCYWxhbmNlT2Y8VD4sIEJsb2NrTnVtYmVyRm9yPFQ+PgACNGRDcmVhdGUgYSB2ZXN0ZWQgdHJhbnNmZXIuAMxUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXy4AzC0gYHRhcmdldGA6IFRoZSBhY2NvdW50IHJlY2VpdmluZyB0aGUgdmVzdGVkIGZ1bmRzLvAtIGBzY2hlZHVsZWA6IFRoZSB2ZXN0aW5nIHNjaGVkdWxlIGF0dGFjaGVkIHRvIHRoZSB0cmFuc2Zlci4AXEVtaXRzIGBWZXN0aW5nQ3JlYXRlZGAuAPxOT1RFOiBUaGlzIHdpbGwgdW5sb2NrIGFsbCBzY2hlZHVsZXMgdGhyb3VnaCB0aGUgY3VycmVudCBibG9jay4ANCMjIENvbXBsZXhpdHkkLSBgTygxKWAuVGZvcmNlX3Zlc3RlZF90cmFuc2ZlcgwBGHNvdXJjZZ0BAVBBY2NvdW50SWRMb29rdXBPZjxUPgABGHRhcmdldJ0BAVBBY2NvdW50SWRMb29rdXBPZjxUPgABIHNjaGVkdWxl6QIBsFZlc3RpbmdJbmZvPEJhbGFuY2VPZjxUPiwgQmxvY2tOdW1iZXJGb3I8VD4+AAM4YEZvcmNlIGEgdmVzdGVkIHRyYW5zZmVyLgDEVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1Jvb3RfLgDoLSBgc291cmNlYDogVGhlIGFjY291bnQgd2hvc2UgZnVuZHMgc2hvdWxkIGJlIHRyYW5zZmVycmVkLhEBLSBgdGFyZ2V0YDogVGhlIGFjY291bnQgdGhhdCBzaG91bGQgYmUgdHJhbnNmZXJyZWQgdGhlIHZlc3RlZCBmdW5kcy7wLSBgc2NoZWR1bGVgOiBUaGUgdmVzdGluZyBzY2hlZHVsZSBhdHRhY2hlZCB0byB0aGUgdHJhbnNmZXIuAFxFbWl0cyBgVmVzdGluZ0NyZWF0ZWRgLgD8Tk9URTogVGhpcyB3aWxsIHVubG9jayBhbGwgc2NoZWR1bGVzIHRocm91Z2ggdGhlIGN1cnJlbnQgYmxvY2suADQjIyBDb21wbGV4aXR5JC0gYE8oMSlgLjxtZXJnZV9zY2hlZHVsZXMIATxzY2hlZHVsZTFfaW5kZXgQAQx1MzIAATxzY2hlZHVsZTJfaW5kZXgQAQx1MzIABFRdAU1lcmdlIHR3byB2ZXN0aW5nIHNjaGVkdWxlcyB0b2dldGhlciwgY3JlYXRpbmcgYSBuZXcgdmVzdGluZyBzY2hlZHVsZSB0aGF0IHVubG9ja3Mgb3ZlclUBdGhlIGhpZ2hlc3QgcG9zc2libGUgc3RhcnQgYW5kIGVuZCBibG9ja3MuIElmIGJvdGggc2NoZWR1bGVzIGhhdmUgYWxyZWFkeSBzdGFydGVkIHRoZVkBY3VycmVudCBibG9jayB3aWxsIGJlIHVzZWQgYXMgdGhlIHNjaGVkdWxlIHN0YXJ0OyB3aXRoIHRoZSBjYXZlYXQgdGhhdCBpZiBvbmUgc2NoZWR1bGVdAWlzIGZpbmlzaGVkIGJ5IHRoZSBjdXJyZW50IGJsb2NrLCB0aGUgb3RoZXIgd2lsbCBiZSB0cmVhdGVkIGFzIHRoZSBuZXcgbWVyZ2VkIHNjaGVkdWxlLCx1bm1vZGlmaWVkLgD4Tk9URTogSWYgYHNjaGVkdWxlMV9pbmRleCA9PSBzY2hlZHVsZTJfaW5kZXhgIHRoaXMgaXMgYSBuby1vcC5BAU5PVEU6IFRoaXMgd2lsbCB1bmxvY2sgYWxsIHNjaGVkdWxlcyB0aHJvdWdoIHRoZSBjdXJyZW50IGJsb2NrIHByaW9yIHRvIG1lcmdpbmcuYQFOT1RFOiBJZiBib3RoIHNjaGVkdWxlcyBoYXZlIGVuZGVkIGJ5IHRoZSBjdXJyZW50IGJsb2NrLCBubyBuZXcgc2NoZWR1bGUgd2lsbCBiZSBjcmVhdGVkZGFuZCBib3RoIHdpbGwgYmUgcmVtb3ZlZC4AbE1lcmdlZCBzY2hlZHVsZSBhdHRyaWJ1dGVzOjUBLSBgc3RhcnRpbmdfYmxvY2tgOiBgTUFYKHNjaGVkdWxlMS5zdGFydGluZ19ibG9jaywgc2NoZWR1bGVkMi5zdGFydGluZ19ibG9jayxIICBjdXJyZW50X2Jsb2NrKWAuIQEtIGBlbmRpbmdfYmxvY2tgOiBgTUFYKHNjaGVkdWxlMS5lbmRpbmdfYmxvY2ssIHNjaGVkdWxlMi5lbmRpbmdfYmxvY2spYC5ZAS0gYGxvY2tlZGA6IGBzY2hlZHVsZTEubG9ja2VkX2F0KGN1cnJlbnRfYmxvY2spICsgc2NoZWR1bGUyLmxvY2tlZF9hdChjdXJyZW50X2Jsb2NrKWAuAMxUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXy4A6C0gYHNjaGVkdWxlMV9pbmRleGA6IGluZGV4IG9mIHRoZSBmaXJzdCBzY2hlZHVsZSB0byBtZXJnZS7sLSBgc2NoZWR1bGUyX2luZGV4YDogaW5kZXggb2YgdGhlIHNlY29uZCBzY2hlZHVsZSB0byBtZXJnZS50Zm9yY2VfcmVtb3ZlX3Zlc3Rpbmdfc2NoZWR1bGUIARh0YXJnZXSdAQGMPFQ6Okxvb2t1cCBhcyBTdGF0aWNMb29rdXA+OjpTb3VyY2UAAThzY2hlZHVsZV9pbmRleBABDHUzMgAFGHxGb3JjZSByZW1vdmUgYSB2ZXN0aW5nIHNjaGVkdWxlAMRUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfUm9vdF8uAMgtIGB0YXJnZXRgOiBBbiBhY2NvdW50IHRoYXQgaGFzIGEgdmVzdGluZyBzY2hlZHVsZRUBLSBgc2NoZWR1bGVfaW5kZXhgOiBUaGUgdmVzdGluZyBzY2hlZHVsZSBpbmRleCB0aGF0IHNob3VsZCBiZSByZW1vdmVkBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLukCDDhwYWxsZXRfdmVzdGluZzB2ZXN0aW5nX2luZm8sVmVzdGluZ0luZm8IHEJhbGFuY2UBGCxCbG9ja051bWJlcgEQAAwBGGxvY2tlZBgBHEJhbGFuY2UAASRwZXJfYmxvY2sYARxCYWxhbmNlAAE4c3RhcnRpbmdfYmxvY2sQASxCbG9ja051bWJlcgAA7QIMQHBhbGxldF9zY2hlZHVsZXIYcGFsbGV0EENhbGwEBFQAASggc2NoZWR1bGUQARB3aGVuEAFEQmxvY2tOdW1iZXJGb3I8VD4AAThtYXliZV9wZXJpb2RpY/ECAaxPcHRpb248c2NoZWR1bGU6OlBlcmlvZDxCbG9ja051bWJlckZvcjxUPj4+AAEgcHJpb3JpdHkIAUhzY2hlZHVsZTo6UHJpb3JpdHkAARBjYWxsXQEBfEJveDw8VCBhcyBDb25maWc+OjpSdW50aW1lQ2FsbD4AAARwQW5vbnltb3VzbHkgc2NoZWR1bGUgYSB0YXNrLhhjYW5jZWwIARB3aGVuEAFEQmxvY2tOdW1iZXJGb3I8VD4AARRpbmRleBABDHUzMgABBJRDYW5jZWwgYW4gYW5vbnltb3VzbHkgc2NoZWR1bGVkIHRhc2suOHNjaGVkdWxlX25hbWVkFAEIaWQEASBUYXNrTmFtZQABEHdoZW4QAURCbG9ja051bWJlckZvcjxUPgABOG1heWJlX3BlcmlvZGlj8QIBrE9wdGlvbjxzY2hlZHVsZTo6UGVyaW9kPEJsb2NrTnVtYmVyRm9yPFQ+Pj4AASBwcmlvcml0eQgBSHNjaGVkdWxlOjpQcmlvcml0eQABEGNhbGxdAQF8Qm94PDxUIGFzIENvbmZpZz46OlJ1bnRpbWVDYWxsPgACBFhTY2hlZHVsZSBhIG5hbWVkIHRhc2suMGNhbmNlbF9uYW1lZAQBCGlkBAEgVGFza05hbWUAAwR4Q2FuY2VsIGEgbmFtZWQgc2NoZWR1bGVkIHRhc2suOHNjaGVkdWxlX2FmdGVyEAEUYWZ0ZXIQAURCbG9ja051bWJlckZvcjxUPgABOG1heWJlX3BlcmlvZGlj8QIBrE9wdGlvbjxzY2hlZHVsZTo6UGVyaW9kPEJsb2NrTnVtYmVyRm9yPFQ+Pj4AASBwcmlvcml0eQgBSHNjaGVkdWxlOjpQcmlvcml0eQABEGNhbGxdAQF8Qm94PDxUIGFzIENvbmZpZz46OlJ1bnRpbWVDYWxsPgAEBKhBbm9ueW1vdXNseSBzY2hlZHVsZSBhIHRhc2sgYWZ0ZXIgYSBkZWxheS5Qc2NoZWR1bGVfbmFtZWRfYWZ0ZXIUAQhpZAQBIFRhc2tOYW1lAAEUYWZ0ZXIQAURCbG9ja051bWJlckZvcjxUPgABOG1heWJlX3BlcmlvZGlj8QIBrE9wdGlvbjxzY2hlZHVsZTo6UGVyaW9kPEJsb2NrTnVtYmVyRm9yPFQ+Pj4AASBwcmlvcml0eQgBSHNjaGVkdWxlOjpQcmlvcml0eQABEGNhbGxdAQF8Qm94PDxUIGFzIENvbmZpZz46OlJ1bnRpbWVDYWxsPgAFBJBTY2hlZHVsZSBhIG5hbWVkIHRhc2sgYWZ0ZXIgYSBkZWxheS4kc2V0X3JldHJ5DAEQdGFza/UCAXhUYXNrQWRkcmVzczxCbG9ja051bWJlckZvcjxUPj4AARxyZXRyaWVzCAEIdTgAARhwZXJpb2QQAURCbG9ja051bWJlckZvcjxUPgAGMFkBU2V0IGEgcmV0cnkgY29uZmlndXJhdGlvbiBmb3IgYSB0YXNrIHNvIHRoYXQsIGluIGNhc2UgaXRzIHNjaGVkdWxlZCBydW4gZmFpbHMsIGl0IHdpbGxVAWJlIHJldHJpZWQgYWZ0ZXIgYHBlcmlvZGAgYmxvY2tzLCBmb3IgYSB0b3RhbCBhbW91bnQgb2YgYHJldHJpZXNgIHJldHJpZXMgb3IgdW50aWwgaXQkc3VjY2VlZHMuAFUBVGFza3Mgd2hpY2ggbmVlZCB0byBiZSBzY2hlZHVsZWQgZm9yIGEgcmV0cnkgYXJlIHN0aWxsIHN1YmplY3QgdG8gd2VpZ2h0IG1ldGVyaW5nIGFuZFEBYWdlbmRhIHNwYWNlLCBzYW1lIGFzIGEgcmVndWxhciB0YXNrLiBJZiBhIHBlcmlvZGljIHRhc2sgZmFpbHMsIGl0IHdpbGwgYmUgc2NoZWR1bGVkkG5vcm1hbGx5IHdoaWxlIHRoZSB0YXNrIGlzIHJldHJ5aW5nLgBRAVRhc2tzIHNjaGVkdWxlZCBhcyBhIHJlc3VsdCBvZiBhIHJldHJ5IGZvciBhIHBlcmlvZGljIHRhc2sgYXJlIHVubmFtZWQsIG5vbi1wZXJpb2RpYz0BY2xvbmVzIG9mIHRoZSBvcmlnaW5hbCB0YXNrLiBUaGVpciByZXRyeSBjb25maWd1cmF0aW9uIHdpbGwgYmUgZGVyaXZlZCBmcm9tIHRoZU0Bb3JpZ2luYWwgdGFzaydzIGNvbmZpZ3VyYXRpb24sIGJ1dCB3aWxsIGhhdmUgYSBsb3dlciB2YWx1ZSBmb3IgYHJlbWFpbmluZ2AgdGhhbiB0aGVkb3JpZ2luYWwgYHRvdGFsX3JldHJpZXNgLjxzZXRfcmV0cnlfbmFtZWQMAQhpZAQBIFRhc2tOYW1lAAEccmV0cmllcwgBCHU4AAEYcGVyaW9kEAFEQmxvY2tOdW1iZXJGb3I8VD4ABzBdAVNldCBhIHJldHJ5IGNvbmZpZ3VyYXRpb24gZm9yIGEgbmFtZWQgdGFzayBzbyB0aGF0LCBpbiBjYXNlIGl0cyBzY2hlZHVsZWQgcnVuIGZhaWxzLCBpdF0Bd2lsbCBiZSByZXRyaWVkIGFmdGVyIGBwZXJpb2RgIGJsb2NrcywgZm9yIGEgdG90YWwgYW1vdW50IG9mIGByZXRyaWVzYCByZXRyaWVzIG9yIHVudGlsMGl0IHN1Y2NlZWRzLgBVAVRhc2tzIHdoaWNoIG5lZWQgdG8gYmUgc2NoZWR1bGVkIGZvciBhIHJldHJ5IGFyZSBzdGlsbCBzdWJqZWN0IHRvIHdlaWdodCBtZXRlcmluZyBhbmRRAWFnZW5kYSBzcGFjZSwgc2FtZSBhcyBhIHJlZ3VsYXIgdGFzay4gSWYgYSBwZXJpb2RpYyB0YXNrIGZhaWxzLCBpdCB3aWxsIGJlIHNjaGVkdWxlZJBub3JtYWxseSB3aGlsZSB0aGUgdGFzayBpcyByZXRyeWluZy4AUQFUYXNrcyBzY2hlZHVsZWQgYXMgYSByZXN1bHQgb2YgYSByZXRyeSBmb3IgYSBwZXJpb2RpYyB0YXNrIGFyZSB1bm5hbWVkLCBub24tcGVyaW9kaWM9AWNsb25lcyBvZiB0aGUgb3JpZ2luYWwgdGFzay4gVGhlaXIgcmV0cnkgY29uZmlndXJhdGlvbiB3aWxsIGJlIGRlcml2ZWQgZnJvbSB0aGVNAW9yaWdpbmFsIHRhc2sncyBjb25maWd1cmF0aW9uLCBidXQgd2lsbCBoYXZlIGEgbG93ZXIgdmFsdWUgZm9yIGByZW1haW5pbmdgIHRoYW4gdGhlZG9yaWdpbmFsIGB0b3RhbF9yZXRyaWVzYC4wY2FuY2VsX3JldHJ5BAEQdGFza/UCAXhUYXNrQWRkcmVzczxCbG9ja051bWJlckZvcjxUPj4ACASoUmVtb3ZlcyB0aGUgcmV0cnkgY29uZmlndXJhdGlvbiBvZiBhIHRhc2suSGNhbmNlbF9yZXRyeV9uYW1lZAQBCGlkBAEgVGFza05hbWUACQS8Q2FuY2VsIHRoZSByZXRyeSBjb25maWd1cmF0aW9uIG9mIGEgbmFtZWQgdGFzay4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMu8QIEGE9wdGlvbgQEVAH1AgEIEE5vbmUAAAAQU29tZQQA9QIAAAEAAPUCAAAECBAQAPkCDDBwYWxsZXRfcHJveHkYcGFsbGV0EENhbGwEBFQAASgUcHJveHkMARByZWFsnQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAFAZm9yY2VfcHJveHlfdHlwZf0CAVBPcHRpb248VDo6UHJveHlUeXBlPgABEGNhbGxdAQF8Qm94PDxUIGFzIENvbmZpZz46OlJ1bnRpbWVDYWxsPgAAJE0BRGlzcGF0Y2ggdGhlIGdpdmVuIGBjYWxsYCBmcm9tIGFuIGFjY291bnQgdGhhdCB0aGUgc2VuZGVyIGlzIGF1dGhvcmlzZWQgZm9yIHRocm91Z2gwYGFkZF9wcm94eWAuAMxUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXy4ALFBhcmFtZXRlcnM6DQEtIGByZWFsYDogVGhlIGFjY291bnQgdGhhdCB0aGUgcHJveHkgd2lsbCBtYWtlIGEgY2FsbCBvbiBiZWhhbGYgb2YuYQEtIGBmb3JjZV9wcm94eV90eXBlYDogU3BlY2lmeSB0aGUgZXhhY3QgcHJveHkgdHlwZSB0byBiZSB1c2VkIGFuZCBjaGVja2VkIGZvciB0aGlzIGNhbGwu0C0gYGNhbGxgOiBUaGUgY2FsbCB0byBiZSBtYWRlIGJ5IHRoZSBgcmVhbGAgYWNjb3VudC4kYWRkX3Byb3h5DAEgZGVsZWdhdGWdAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AAShwcm94eV90eXBlAQMBMFQ6OlByb3h5VHlwZQABFGRlbGF5EAFEQmxvY2tOdW1iZXJGb3I8VD4AASRFAVJlZ2lzdGVyIGEgcHJveHkgYWNjb3VudCBmb3IgdGhlIHNlbmRlciB0aGF0IGlzIGFibGUgdG8gbWFrZSBjYWxscyBvbiBpdHMgYmVoYWxmLgDMVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uACxQYXJhbWV0ZXJzOhEBLSBgcHJveHlgOiBUaGUgYWNjb3VudCB0aGF0IHRoZSBgY2FsbGVyYCB3b3VsZCBsaWtlIHRvIG1ha2UgYSBwcm94eS78LSBgcHJveHlfdHlwZWA6IFRoZSBwZXJtaXNzaW9ucyBhbGxvd2VkIGZvciB0aGlzIHByb3h5IGFjY291bnQuTQEtIGBkZWxheWA6IFRoZSBhbm5vdW5jZW1lbnQgcGVyaW9kIHJlcXVpcmVkIG9mIHRoZSBpbml0aWFsIHByb3h5LiBXaWxsIGdlbmVyYWxseSBiZRR6ZXJvLjByZW1vdmVfcHJveHkMASBkZWxlZ2F0ZZ0BAVBBY2NvdW50SWRMb29rdXBPZjxUPgABKHByb3h5X3R5cGUBAwEwVDo6UHJveHlUeXBlAAEUZGVsYXkQAURCbG9ja051bWJlckZvcjxUPgACHKhVbnJlZ2lzdGVyIGEgcHJveHkgYWNjb3VudCBmb3IgdGhlIHNlbmRlci4AzFRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfLgAsUGFyYW1ldGVyczolAS0gYHByb3h5YDogVGhlIGFjY291bnQgdGhhdCB0aGUgYGNhbGxlcmAgd291bGQgbGlrZSB0byByZW1vdmUgYXMgYSBwcm94eS5BAS0gYHByb3h5X3R5cGVgOiBUaGUgcGVybWlzc2lvbnMgY3VycmVudGx5IGVuYWJsZWQgZm9yIHRoZSByZW1vdmVkIHByb3h5IGFjY291bnQuOHJlbW92ZV9wcm94aWVzAAMYtFVucmVnaXN0ZXIgYWxsIHByb3h5IGFjY291bnRzIGZvciB0aGUgc2VuZGVyLgDMVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uAEEBV0FSTklORzogVGhpcyBtYXkgYmUgY2FsbGVkIG9uIGFjY291bnRzIGNyZWF0ZWQgYnkgYHB1cmVgLCBob3dldmVyIGlmIGRvbmUsIHRoZW5ZAXRoZSB1bnJlc2VydmVkIGZlZXMgd2lsbCBiZSBpbmFjY2Vzc2libGUuICoqQWxsIGFjY2VzcyB0byB0aGlzIGFjY291bnQgd2lsbCBiZSBsb3N0LioqLGNyZWF0ZV9wdXJlDAEocHJveHlfdHlwZQEDATBUOjpQcm94eVR5cGUAARRkZWxheRABREJsb2NrTnVtYmVyRm9yPFQ+AAEUaW5kZXhVAQEMdTE2AARIOQFTcGF3biBhIGZyZXNoIG5ldyBhY2NvdW50IHRoYXQgaXMgZ3VhcmFudGVlZCB0byBiZSBvdGhlcndpc2UgaW5hY2Nlc3NpYmxlLCBhbmT8aW5pdGlhbGl6ZSBpdCB3aXRoIGEgcHJveHkgb2YgYHByb3h5X3R5cGVgIGZvciBgb3JpZ2luYCBzZW5kZXIuAGxSZXF1aXJlcyBhIGBTaWduZWRgIG9yaWdpbi4AUQEtIGBwcm94eV90eXBlYDogVGhlIHR5cGUgb2YgdGhlIHByb3h5IHRoYXQgdGhlIHNlbmRlciB3aWxsIGJlIHJlZ2lzdGVyZWQgYXMgb3ZlciB0aGVNAW5ldyBhY2NvdW50LiBUaGlzIHdpbGwgYWxtb3N0IGFsd2F5cyBiZSB0aGUgbW9zdCBwZXJtaXNzaXZlIGBQcm94eVR5cGVgIHBvc3NpYmxlIHRveGFsbG93IGZvciBtYXhpbXVtIGZsZXhpYmlsaXR5LlEBLSBgaW5kZXhgOiBBIGRpc2FtYmlndWF0aW9uIGluZGV4LCBpbiBjYXNlIHRoaXMgaXMgY2FsbGVkIG11bHRpcGxlIHRpbWVzIGluIHRoZSBzYW1lXQF0cmFuc2FjdGlvbiAoZS5nLiB3aXRoIGB1dGlsaXR5OjpiYXRjaGApLiBVbmxlc3MgeW91J3JlIHVzaW5nIGBiYXRjaGAgeW91IHByb2JhYmx5IGp1c3RAd2FudCB0byB1c2UgYDBgLk0BLSBgZGVsYXlgOiBUaGUgYW5ub3VuY2VtZW50IHBlcmlvZCByZXF1aXJlZCBvZiB0aGUgaW5pdGlhbCBwcm94eS4gV2lsbCBnZW5lcmFsbHkgYmUUemVyby4AUQFGYWlscyB3aXRoIGBEdXBsaWNhdGVgIGlmIHRoaXMgaGFzIGFscmVhZHkgYmVlbiBjYWxsZWQgaW4gdGhpcyB0cmFuc2FjdGlvbiwgZnJvbSB0aGWYc2FtZSBzZW5kZXIsIHdpdGggdGhlIHNhbWUgcGFyYW1ldGVycy4A5EZhaWxzIGlmIHRoZXJlIGFyZSBpbnN1ZmZpY2llbnQgZnVuZHMgdG8gcGF5IGZvciBkZXBvc2l0LiRraWxsX3B1cmUUARxzcGF3bmVynQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEocHJveHlfdHlwZQEDATBUOjpQcm94eVR5cGUAARRpbmRleFUBAQx1MTYAARhoZWlnaHTUAURCbG9ja051bWJlckZvcjxUPgABJGV4dF9pbmRleNQBDHUzMgAFQKBSZW1vdmVzIGEgcHJldmlvdXNseSBzcGF3bmVkIHB1cmUgcHJveHkuAEkBV0FSTklORzogKipBbGwgYWNjZXNzIHRvIHRoaXMgYWNjb3VudCB3aWxsIGJlIGxvc3QuKiogQW55IGZ1bmRzIGhlbGQgaW4gaXQgd2lsbCBiZTRpbmFjY2Vzc2libGUuAFkBUmVxdWlyZXMgYSBgU2lnbmVkYCBvcmlnaW4sIGFuZCB0aGUgc2VuZGVyIGFjY291bnQgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCBieSBhIGNhbGwgdG+UYHB1cmVgIHdpdGggY29ycmVzcG9uZGluZyBwYXJhbWV0ZXJzLgA5AS0gYHNwYXduZXJgOiBUaGUgYWNjb3VudCB0aGF0IG9yaWdpbmFsbHkgY2FsbGVkIGBwdXJlYCB0byBjcmVhdGUgdGhpcyBhY2NvdW50LjkBLSBgaW5kZXhgOiBUaGUgZGlzYW1iaWd1YXRpb24gaW5kZXggb3JpZ2luYWxseSBwYXNzZWQgdG8gYHB1cmVgLiBQcm9iYWJseSBgMGAu7C0gYHByb3h5X3R5cGVgOiBUaGUgcHJveHkgdHlwZSBvcmlnaW5hbGx5IHBhc3NlZCB0byBgcHVyZWAuKQEtIGBoZWlnaHRgOiBUaGUgaGVpZ2h0IG9mIHRoZSBjaGFpbiB3aGVuIHRoZSBjYWxsIHRvIGBwdXJlYCB3YXMgcHJvY2Vzc2VkLjUBLSBgZXh0X2luZGV4YDogVGhlIGV4dHJpbnNpYyBpbmRleCBpbiB3aGljaCB0aGUgY2FsbCB0byBgcHVyZWAgd2FzIHByb2Nlc3NlZC4ANQFGYWlscyB3aXRoIGBOb1Blcm1pc3Npb25gIGluIGNhc2UgdGhlIGNhbGxlciBpcyBub3QgYSBwcmV2aW91c2x5IGNyZWF0ZWQgcHVyZdxhY2NvdW50IHdob3NlIGBwdXJlYCBjYWxsIGhhcyBjb3JyZXNwb25kaW5nIHBhcmFtZXRlcnMuIGFubm91bmNlCAEQcmVhbJ0BAVBBY2NvdW50SWRMb29rdXBPZjxUPgABJGNhbGxfaGFzaDQBNENhbGxIYXNoT2Y8VD4ABjwFAVB1Ymxpc2ggdGhlIGhhc2ggb2YgYSBwcm94eS1jYWxsIHRoYXQgd2lsbCBiZSBtYWRlIGluIHRoZSBmdXR1cmUuAF0BVGhpcyBtdXN0IGJlIGNhbGxlZCBzb21lIG51bWJlciBvZiBibG9ja3MgYmVmb3JlIHRoZSBjb3JyZXNwb25kaW5nIGBwcm94eWAgaXMgYXR0ZW1wdGVkJQFpZiB0aGUgZGVsYXkgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm94eSByZWxhdGlvbnNoaXAgaXMgZ3JlYXRlciB0aGFuIHplcm8uABEBTm8gbW9yZSB0aGFuIGBNYXhQZW5kaW5nYCBhbm5vdW5jZW1lbnRzIG1heSBiZSBtYWRlIGF0IGFueSBvbmUgdGltZS4ACQFUaGlzIHdpbGwgdGFrZSBhIGRlcG9zaXQgb2YgYEFubm91bmNlbWVudERlcG9zaXRGYWN0b3JgIGFzIHdlbGwgYXMZAWBBbm5vdW5jZW1lbnREZXBvc2l0QmFzZWAgaWYgdGhlcmUgYXJlIG5vIG90aGVyIHBlbmRpbmcgYW5ub3VuY2VtZW50cy4AJQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXyBhbmQgYSBwcm94eSBvZiBgcmVhbGAuACxQYXJhbWV0ZXJzOg0BLSBgcmVhbGA6IFRoZSBhY2NvdW50IHRoYXQgdGhlIHByb3h5IHdpbGwgbWFrZSBhIGNhbGwgb24gYmVoYWxmIG9mLhUBLSBgY2FsbF9oYXNoYDogVGhlIGhhc2ggb2YgdGhlIGNhbGwgdG8gYmUgbWFkZSBieSB0aGUgYHJlYWxgIGFjY291bnQuTHJlbW92ZV9hbm5vdW5jZW1lbnQIARByZWFsnQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEkY2FsbF9oYXNoNAE0Q2FsbEhhc2hPZjxUPgAHKHBSZW1vdmUgYSBnaXZlbiBhbm5vdW5jZW1lbnQuAFkBTWF5IGJlIGNhbGxlZCBieSBhIHByb3h5IGFjY291bnQgdG8gcmVtb3ZlIGEgY2FsbCB0aGV5IHByZXZpb3VzbHkgYW5ub3VuY2VkIGFuZCByZXR1cm4wdGhlIGRlcG9zaXQuAMxUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXy4ALFBhcmFtZXRlcnM6DQEtIGByZWFsYDogVGhlIGFjY291bnQgdGhhdCB0aGUgcHJveHkgd2lsbCBtYWtlIGEgY2FsbCBvbiBiZWhhbGYgb2YuFQEtIGBjYWxsX2hhc2hgOiBUaGUgaGFzaCBvZiB0aGUgY2FsbCB0byBiZSBtYWRlIGJ5IHRoZSBgcmVhbGAgYWNjb3VudC5McmVqZWN0X2Fubm91bmNlbWVudAgBIGRlbGVnYXRlnQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEkY2FsbF9oYXNoNAE0Q2FsbEhhc2hPZjxUPgAIKLBSZW1vdmUgdGhlIGdpdmVuIGFubm91bmNlbWVudCBvZiBhIGRlbGVnYXRlLgBhAU1heSBiZSBjYWxsZWQgYnkgYSB0YXJnZXQgKHByb3hpZWQpIGFjY291bnQgdG8gcmVtb3ZlIGEgY2FsbCB0aGF0IG9uZSBvZiB0aGVpciBkZWxlZ2F0ZXMlAShgZGVsZWdhdGVgKSBoYXMgYW5ub3VuY2VkIHRoZXkgd2FudCB0byBleGVjdXRlLiBUaGUgZGVwb3NpdCBpcyByZXR1cm5lZC4AzFRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfLgAsUGFyYW1ldGVyczr0LSBgZGVsZWdhdGVgOiBUaGUgYWNjb3VudCB0aGF0IHByZXZpb3VzbHkgYW5ub3VuY2VkIHRoZSBjYWxsLrwtIGBjYWxsX2hhc2hgOiBUaGUgaGFzaCBvZiB0aGUgY2FsbCB0byBiZSBtYWRlLjxwcm94eV9hbm5vdW5jZWQQASBkZWxlZ2F0ZZ0BAVBBY2NvdW50SWRMb29rdXBPZjxUPgABEHJlYWydAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AAUBmb3JjZV9wcm94eV90eXBl/QIBUE9wdGlvbjxUOjpQcm94eVR5cGU+AAEQY2FsbF0BAXxCb3g8PFQgYXMgQ29uZmlnPjo6UnVudGltZUNhbGw+AAksTQFEaXNwYXRjaCB0aGUgZ2l2ZW4gYGNhbGxgIGZyb20gYW4gYWNjb3VudCB0aGF0IHRoZSBzZW5kZXIgaXMgYXV0aG9yaXplZCBmb3IgdGhyb3VnaDBgYWRkX3Byb3h5YC4AqFJlbW92ZXMgYW55IGNvcnJlc3BvbmRpbmcgYW5ub3VuY2VtZW50KHMpLgDMVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uACxQYXJhbWV0ZXJzOg0BLSBgcmVhbGA6IFRoZSBhY2NvdW50IHRoYXQgdGhlIHByb3h5IHdpbGwgbWFrZSBhIGNhbGwgb24gYmVoYWxmIG9mLmEBLSBgZm9yY2VfcHJveHlfdHlwZWA6IFNwZWNpZnkgdGhlIGV4YWN0IHByb3h5IHR5cGUgdG8gYmUgdXNlZCBhbmQgY2hlY2tlZCBmb3IgdGhpcyBjYWxsLtAtIGBjYWxsYDogVGhlIGNhbGwgdG8gYmUgbWFkZSBieSB0aGUgYHJlYWxgIGFjY291bnQuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLv0CBBhPcHRpb24EBFQBAQMBCBBOb25lAAAAEFNvbWUEAAEDAAABAAABAwhYc3RhZ2luZ19rdXNhbWFfcnVudGltZSRQcm94eVR5cGUAASQMQW55AAAALE5vblRyYW5zZmVyAAEAKEdvdmVybmFuY2UAAgAcU3Rha2luZwADACxDYW5jZWxQcm94eQAFABxBdWN0aW9uAAYAHFNvY2lldHkABwA8Tm9taW5hdGlvblBvb2xzAAgAMFNwb2tlc3BlcnNvbgAJAAAFAww8cGFsbGV0X211bHRpc2lnGHBhbGxldBBDYWxsBARUAAEQUGFzX211bHRpX3RocmVzaG9sZF8xCAFEb3RoZXJfc2lnbmF0b3JpZXOtAQFEVmVjPFQ6OkFjY291bnRJZD4AARBjYWxsXQEBfEJveDw8VCBhcyBDb25maWc+OjpSdW50aW1lQ2FsbD4AADBRAUltbWVkaWF0ZWx5IGRpc3BhdGNoIGEgbXVsdGktc2lnbmF0dXJlIGNhbGwgdXNpbmcgYSBzaW5nbGUgYXBwcm92YWwgZnJvbSB0aGUgY2FsbGVyLgDMVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uAD0BLSBgb3RoZXJfc2lnbmF0b3JpZXNgOiBUaGUgYWNjb3VudHMgKG90aGVyIHRoYW4gdGhlIHNlbmRlcikgd2hvIGFyZSBwYXJ0IG9mIHRoZQEBbXVsdGktc2lnbmF0dXJlLCBidXQgZG8gbm90IHBhcnRpY2lwYXRlIGluIHRoZSBhcHByb3ZhbCBwcm9jZXNzLogtIGBjYWxsYDogVGhlIGNhbGwgdG8gYmUgZXhlY3V0ZWQuALhSZXN1bHQgaXMgZXF1aXZhbGVudCB0byB0aGUgZGlzcGF0Y2hlZCByZXN1bHQuADQjIyBDb21wbGV4aXR5GQFPKFogKyBDKSB3aGVyZSBaIGlzIHRoZSBsZW5ndGggb2YgdGhlIGNhbGwgYW5kIEMgaXRzIGV4ZWN1dGlvbiB3ZWlnaHQuIGFzX211bHRpFAEkdGhyZXNob2xkVQEBDHUxNgABRG90aGVyX3NpZ25hdG9yaWVzrQEBRFZlYzxUOjpBY2NvdW50SWQ+AAE8bWF5YmVfdGltZXBvaW50CQMBkE9wdGlvbjxUaW1lcG9pbnQ8QmxvY2tOdW1iZXJGb3I8VD4+PgABEGNhbGxdAQF8Qm94PDxUIGFzIENvbmZpZz46OlJ1bnRpbWVDYWxsPgABKG1heF93ZWlnaHQoARhXZWlnaHQAAZxVAVJlZ2lzdGVyIGFwcHJvdmFsIGZvciBhIGRpc3BhdGNoIHRvIGJlIG1hZGUgZnJvbSBhIGRldGVybWluaXN0aWMgY29tcG9zaXRlIGFjY291bnQgaWb4YXBwcm92ZWQgYnkgYSB0b3RhbCBvZiBgdGhyZXNob2xkIC0gMWAgb2YgYG90aGVyX3NpZ25hdG9yaWVzYC4AsElmIHRoZXJlIGFyZSBlbm91Z2gsIHRoZW4gZGlzcGF0Y2ggdGhlIGNhbGwuAC0BUGF5bWVudDogYERlcG9zaXRCYXNlYCB3aWxsIGJlIHJlc2VydmVkIGlmIHRoaXMgaXMgdGhlIGZpcnN0IGFwcHJvdmFsLCBwbHVzPQFgdGhyZXNob2xkYCB0aW1lcyBgRGVwb3NpdEZhY3RvcmAuIEl0IGlzIHJldHVybmVkIG9uY2UgdGhpcyBkaXNwYXRjaCBoYXBwZW5zIG9yNGlzIGNhbmNlbGxlZC4AzFRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfLgBVAS0gYHRocmVzaG9sZGA6IFRoZSB0b3RhbCBudW1iZXIgb2YgYXBwcm92YWxzIGZvciB0aGlzIGRpc3BhdGNoIGJlZm9yZSBpdCBpcyBleGVjdXRlZC5BAS0gYG90aGVyX3NpZ25hdG9yaWVzYDogVGhlIGFjY291bnRzIChvdGhlciB0aGFuIHRoZSBzZW5kZXIpIHdobyBjYW4gYXBwcm92ZSB0aGlzbGRpc3BhdGNoLiBNYXkgbm90IGJlIGVtcHR5LlkBLSBgbWF5YmVfdGltZXBvaW50YDogSWYgdGhpcyBpcyB0aGUgZmlyc3QgYXBwcm92YWwsIHRoZW4gdGhpcyBtdXN0IGJlIGBOb25lYC4gSWYgaXQgaXNRAW5vdCB0aGUgZmlyc3QgYXBwcm92YWwsIHRoZW4gaXQgbXVzdCBiZSBgU29tZWAsIHdpdGggdGhlIHRpbWVwb2ludCAoYmxvY2sgbnVtYmVyIGFuZNR0cmFuc2FjdGlvbiBpbmRleCkgb2YgdGhlIGZpcnN0IGFwcHJvdmFsIHRyYW5zYWN0aW9uLogtIGBjYWxsYDogVGhlIGNhbGwgdG8gYmUgZXhlY3V0ZWQuAB0BTk9URTogVW5sZXNzIHRoaXMgaXMgdGhlIGZpbmFsIGFwcHJvdmFsLCB5b3Ugd2lsbCBnZW5lcmFsbHkgd2FudCB0byB1c2UZAWBhcHByb3ZlX2FzX211bHRpYCBpbnN0ZWFkLCBzaW5jZSBpdCBvbmx5IHJlcXVpcmVzIGEgaGFzaCBvZiB0aGUgY2FsbC4AWQFSZXN1bHQgaXMgZXF1aXZhbGVudCB0byB0aGUgZGlzcGF0Y2hlZCByZXN1bHQgaWYgYHRocmVzaG9sZGAgaXMgZXhhY3RseSBgMWAuIE90aGVyd2lzZVUBb24gc3VjY2VzcywgcmVzdWx0IGlzIGBPa2AgYW5kIHRoZSByZXN1bHQgZnJvbSB0aGUgaW50ZXJpb3IgY2FsbCwgaWYgaXQgd2FzIGV4ZWN1dGVkLNxtYXkgYmUgZm91bmQgaW4gdGhlIGRlcG9zaXRlZCBgTXVsdGlzaWdFeGVjdXRlZGAgZXZlbnQuADQjIyBDb21wbGV4aXR5UC0gYE8oUyArIFogKyBDYWxsKWAuzC0gVXAgdG8gb25lIGJhbGFuY2UtcmVzZXJ2ZSBvciB1bnJlc2VydmUgb3BlcmF0aW9uLj0BLSBPbmUgcGFzc3Rocm91Z2ggb3BlcmF0aW9uLCBvbmUgaW5zZXJ0LCBib3RoIGBPKFMpYCB3aGVyZSBgU2AgaXMgdGhlIG51bWJlciBvZkUBICBzaWduYXRvcmllcy4gYFNgIGlzIGNhcHBlZCBieSBgTWF4U2lnbmF0b3JpZXNgLCB3aXRoIHdlaWdodCBiZWluZyBwcm9wb3J0aW9uYWwuIQEtIE9uZSBjYWxsIGVuY29kZSAmIGhhc2gsIGJvdGggb2YgY29tcGxleGl0eSBgTyhaKWAgd2hlcmUgYFpgIGlzIHR4LWxlbi68LSBPbmUgZW5jb2RlICYgaGFzaCwgYm90aCBvZiBjb21wbGV4aXR5IGBPKFMpYC7ULSBVcCB0byBvbmUgYmluYXJ5IHNlYXJjaCBhbmQgaW5zZXJ0IChgTyhsb2dTICsgUylgKS74LSBJL086IDEgcmVhZCBgTyhTKWAsIHVwIHRvIDEgbXV0YXRlIGBPKFMpYC4gVXAgdG8gb25lIHJlbW92ZS4wLSBPbmUgZXZlbnQubC0gVGhlIHdlaWdodCBvZiB0aGUgYGNhbGxgLk0BLSBTdG9yYWdlOiBpbnNlcnRzIG9uZSBpdGVtLCB2YWx1ZSBzaXplIGJvdW5kZWQgYnkgYE1heFNpZ25hdG9yaWVzYCwgd2l0aCBhIGRlcG9zaXQZASAgdGFrZW4gZm9yIGl0cyBsaWZldGltZSBvZiBgRGVwb3NpdEJhc2UgKyB0aHJlc2hvbGQgKiBEZXBvc2l0RmFjdG9yYC5AYXBwcm92ZV9hc19tdWx0aRQBJHRocmVzaG9sZFUBAQx1MTYAAURvdGhlcl9zaWduYXRvcmllc60BAURWZWM8VDo6QWNjb3VudElkPgABPG1heWJlX3RpbWVwb2ludAkDAZBPcHRpb248VGltZXBvaW50PEJsb2NrTnVtYmVyRm9yPFQ+Pj4AASRjYWxsX2hhc2gEASBbdTg7IDMyXQABKG1heF93ZWlnaHQoARhXZWlnaHQAAnhVAVJlZ2lzdGVyIGFwcHJvdmFsIGZvciBhIGRpc3BhdGNoIHRvIGJlIG1hZGUgZnJvbSBhIGRldGVybWluaXN0aWMgY29tcG9zaXRlIGFjY291bnQgaWb4YXBwcm92ZWQgYnkgYSB0b3RhbCBvZiBgdGhyZXNob2xkIC0gMWAgb2YgYG90aGVyX3NpZ25hdG9yaWVzYC4ALQFQYXltZW50OiBgRGVwb3NpdEJhc2VgIHdpbGwgYmUgcmVzZXJ2ZWQgaWYgdGhpcyBpcyB0aGUgZmlyc3QgYXBwcm92YWwsIHBsdXM9AWB0aHJlc2hvbGRgIHRpbWVzIGBEZXBvc2l0RmFjdG9yYC4gSXQgaXMgcmV0dXJuZWQgb25jZSB0aGlzIGRpc3BhdGNoIGhhcHBlbnMgb3I0aXMgY2FuY2VsbGVkLgDMVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uAFUBLSBgdGhyZXNob2xkYDogVGhlIHRvdGFsIG51bWJlciBvZiBhcHByb3ZhbHMgZm9yIHRoaXMgZGlzcGF0Y2ggYmVmb3JlIGl0IGlzIGV4ZWN1dGVkLkEBLSBgb3RoZXJfc2lnbmF0b3JpZXNgOiBUaGUgYWNjb3VudHMgKG90aGVyIHRoYW4gdGhlIHNlbmRlcikgd2hvIGNhbiBhcHByb3ZlIHRoaXNsZGlzcGF0Y2guIE1heSBub3QgYmUgZW1wdHkuWQEtIGBtYXliZV90aW1lcG9pbnRgOiBJZiB0aGlzIGlzIHRoZSBmaXJzdCBhcHByb3ZhbCwgdGhlbiB0aGlzIG11c3QgYmUgYE5vbmVgLiBJZiBpdCBpc1EBbm90IHRoZSBmaXJzdCBhcHByb3ZhbCwgdGhlbiBpdCBtdXN0IGJlIGBTb21lYCwgd2l0aCB0aGUgdGltZXBvaW50IChibG9jayBudW1iZXIgYW5k1HRyYW5zYWN0aW9uIGluZGV4KSBvZiB0aGUgZmlyc3QgYXBwcm92YWwgdHJhbnNhY3Rpb24uzC0gYGNhbGxfaGFzaGA6IFRoZSBoYXNoIG9mIHRoZSBjYWxsIHRvIGJlIGV4ZWN1dGVkLgA1AU5PVEU6IElmIHRoaXMgaXMgdGhlIGZpbmFsIGFwcHJvdmFsLCB5b3Ugd2lsbCB3YW50IHRvIHVzZSBgYXNfbXVsdGlgIGluc3RlYWQuADQjIyBDb21wbGV4aXR5JC0gYE8oUylgLswtIFVwIHRvIG9uZSBiYWxhbmNlLXJlc2VydmUgb3IgdW5yZXNlcnZlIG9wZXJhdGlvbi49AS0gT25lIHBhc3N0aHJvdWdoIG9wZXJhdGlvbiwgb25lIGluc2VydCwgYm90aCBgTyhTKWAgd2hlcmUgYFNgIGlzIHRoZSBudW1iZXIgb2ZFASAgc2lnbmF0b3JpZXMuIGBTYCBpcyBjYXBwZWQgYnkgYE1heFNpZ25hdG9yaWVzYCwgd2l0aCB3ZWlnaHQgYmVpbmcgcHJvcG9ydGlvbmFsLrwtIE9uZSBlbmNvZGUgJiBoYXNoLCBib3RoIG9mIGNvbXBsZXhpdHkgYE8oUylgLtQtIFVwIHRvIG9uZSBiaW5hcnkgc2VhcmNoIGFuZCBpbnNlcnQgKGBPKGxvZ1MgKyBTKWApLvgtIEkvTzogMSByZWFkIGBPKFMpYCwgdXAgdG8gMSBtdXRhdGUgYE8oUylgLiBVcCB0byBvbmUgcmVtb3ZlLjAtIE9uZSBldmVudC5NAS0gU3RvcmFnZTogaW5zZXJ0cyBvbmUgaXRlbSwgdmFsdWUgc2l6ZSBib3VuZGVkIGJ5IGBNYXhTaWduYXRvcmllc2AsIHdpdGggYSBkZXBvc2l0GQEgIHRha2VuIGZvciBpdHMgbGlmZXRpbWUgb2YgYERlcG9zaXRCYXNlICsgdGhyZXNob2xkICogRGVwb3NpdEZhY3RvcmAuPGNhbmNlbF9hc19tdWx0aRABJHRocmVzaG9sZFUBAQx1MTYAAURvdGhlcl9zaWduYXRvcmllc60BAURWZWM8VDo6QWNjb3VudElkPgABJHRpbWVwb2ludA0DAXBUaW1lcG9pbnQ8QmxvY2tOdW1iZXJGb3I8VD4+AAEkY2FsbF9oYXNoBAEgW3U4OyAzMl0AA1RVAUNhbmNlbCBhIHByZS1leGlzdGluZywgb24tZ29pbmcgbXVsdGlzaWcgdHJhbnNhY3Rpb24uIEFueSBkZXBvc2l0IHJlc2VydmVkIHByZXZpb3VzbHnEZm9yIHRoaXMgb3BlcmF0aW9uIHdpbGwgYmUgdW5yZXNlcnZlZCBvbiBzdWNjZXNzLgDMVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uAFUBLSBgdGhyZXNob2xkYDogVGhlIHRvdGFsIG51bWJlciBvZiBhcHByb3ZhbHMgZm9yIHRoaXMgZGlzcGF0Y2ggYmVmb3JlIGl0IGlzIGV4ZWN1dGVkLkEBLSBgb3RoZXJfc2lnbmF0b3JpZXNgOiBUaGUgYWNjb3VudHMgKG90aGVyIHRoYW4gdGhlIHNlbmRlcikgd2hvIGNhbiBhcHByb3ZlIHRoaXNsZGlzcGF0Y2guIE1heSBub3QgYmUgZW1wdHkuXQEtIGB0aW1lcG9pbnRgOiBUaGUgdGltZXBvaW50IChibG9jayBudW1iZXIgYW5kIHRyYW5zYWN0aW9uIGluZGV4KSBvZiB0aGUgZmlyc3QgYXBwcm92YWx4dHJhbnNhY3Rpb24gZm9yIHRoaXMgZGlzcGF0Y2guzC0gYGNhbGxfaGFzaGA6IFRoZSBoYXNoIG9mIHRoZSBjYWxsIHRvIGJlIGV4ZWN1dGVkLgA0IyMgQ29tcGxleGl0eSQtIGBPKFMpYC7MLSBVcCB0byBvbmUgYmFsYW5jZS1yZXNlcnZlIG9yIHVucmVzZXJ2ZSBvcGVyYXRpb24uPQEtIE9uZSBwYXNzdGhyb3VnaCBvcGVyYXRpb24sIG9uZSBpbnNlcnQsIGJvdGggYE8oUylgIHdoZXJlIGBTYCBpcyB0aGUgbnVtYmVyIG9mRQEgIHNpZ25hdG9yaWVzLiBgU2AgaXMgY2FwcGVkIGJ5IGBNYXhTaWduYXRvcmllc2AsIHdpdGggd2VpZ2h0IGJlaW5nIHByb3BvcnRpb25hbC68LSBPbmUgZW5jb2RlICYgaGFzaCwgYm90aCBvZiBjb21wbGV4aXR5IGBPKFMpYC4wLSBPbmUgZXZlbnQuhC0gSS9POiAxIHJlYWQgYE8oUylgLCBvbmUgcmVtb3ZlLnAtIFN0b3JhZ2U6IHJlbW92ZXMgb25lIGl0ZW0uBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLgkDBBhPcHRpb24EBFQBDQMBCBBOb25lAAAAEFNvbWUEAA0DAAABAAANAwg8cGFsbGV0X211bHRpc2lnJFRpbWVwb2ludAQsQmxvY2tOdW1iZXIBEAAIARhoZWlnaHQQASxCbG9ja051bWJlcgABFGluZGV4EAEMdTMyAAARAww8cGFsbGV0X3ByZWltYWdlGHBhbGxldBBDYWxsBARUAAEUNG5vdGVfcHJlaW1hZ2UEARRieXRlczgBHFZlYzx1OD4AABB0UmVnaXN0ZXIgYSBwcmVpbWFnZSBvbi1jaGFpbi4AVQFJZiB0aGUgcHJlaW1hZ2Ugd2FzIHByZXZpb3VzbHkgcmVxdWVzdGVkLCBubyBmZWVzIG9yIGRlcG9zaXRzIGFyZSB0YWtlbiBmb3IgcHJvdmlkaW5nVQF0aGUgcHJlaW1hZ2UuIE90aGVyd2lzZSwgYSBkZXBvc2l0IGlzIHRha2VuIHByb3BvcnRpb25hbCB0byB0aGUgc2l6ZSBvZiB0aGUgcHJlaW1hZ2UuPHVubm90ZV9wcmVpbWFnZQQBEGhhc2g0ARxUOjpIYXNoAAEY3ENsZWFyIGFuIHVucmVxdWVzdGVkIHByZWltYWdlIGZyb20gdGhlIHJ1bnRpbWUgc3RvcmFnZS4A/ElmIGBsZW5gIGlzIHByb3ZpZGVkLCB0aGVuIGl0IHdpbGwgYmUgYSBtdWNoIGNoZWFwZXIgb3BlcmF0aW9uLgABAS0gYGhhc2hgOiBUaGUgaGFzaCBvZiB0aGUgcHJlaW1hZ2UgdG8gYmUgcmVtb3ZlZCBmcm9tIHRoZSBzdG9yZS64LSBgbGVuYDogVGhlIGxlbmd0aCBvZiB0aGUgcHJlaW1hZ2Ugb2YgYGhhc2hgLkByZXF1ZXN0X3ByZWltYWdlBAEQaGFzaDQBHFQ6Okhhc2gAAhBBAVJlcXVlc3QgYSBwcmVpbWFnZSBiZSB1cGxvYWRlZCB0byB0aGUgY2hhaW4gd2l0aG91dCBwYXlpbmcgYW55IGZlZXMgb3IgZGVwb3NpdHMuAFUBSWYgdGhlIHByZWltYWdlIHJlcXVlc3RzIGhhcyBhbHJlYWR5IGJlZW4gcHJvdmlkZWQgb24tY2hhaW4sIHdlIHVucmVzZXJ2ZSBhbnkgZGVwb3NpdDkBYSB1c2VyIG1heSBoYXZlIHBhaWQsIGFuZCB0YWtlIHRoZSBjb250cm9sIG9mIHRoZSBwcmVpbWFnZSBvdXQgb2YgdGhlaXIgaGFuZHMuSHVucmVxdWVzdF9wcmVpbWFnZQQBEGhhc2g0ARxUOjpIYXNoAAMMvENsZWFyIGEgcHJldmlvdXNseSBtYWRlIHJlcXVlc3QgZm9yIGEgcHJlaW1hZ2UuAC0BTk9URTogVEhJUyBNVVNUIE5PVCBCRSBDQUxMRUQgT04gYGhhc2hgIE1PUkUgVElNRVMgVEhBTiBgcmVxdWVzdF9wcmVpbWFnZWAuOGVuc3VyZV91cGRhdGVkBAEYaGFzaGVzFQMBMFZlYzxUOjpIYXNoPgAEDMRFbnN1cmUgdGhhdCB0aGUgYSBidWxrIG9mIHByZS1pbWFnZXMgaXMgdXBncmFkZWQuAD0BVGhlIGNhbGxlciBwYXlzIG5vIGZlZSBpZiBhdCBsZWFzdCA5MCUgb2YgcHJlLWltYWdlcyB3ZXJlIHN1Y2Nlc3NmdWxseSB1cGRhdGVkLgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy4VAwAAAjQAGQMMPHBhbGxldF9ib3VudGllcxhwYWxsZXQQQ2FsbAgEVAAESQABJDhwcm9wb3NlX2JvdW50eQgBFHZhbHVl5AE8QmFsYW5jZU9mPFQsIEk+AAEsZGVzY3JpcHRpb244ARxWZWM8dTg+AAAwVFByb3Bvc2UgYSBuZXcgYm91bnR5LgDMVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uAFEBUGF5bWVudDogYFRpcFJlcG9ydERlcG9zaXRCYXNlYCB3aWxsIGJlIHJlc2VydmVkIGZyb20gdGhlIG9yaWdpbiBhY2NvdW50LCBhcyB3ZWxsIGFzUQFgRGF0YURlcG9zaXRQZXJCeXRlYCBmb3IgZWFjaCBieXRlIGluIGByZWFzb25gLiBJdCB3aWxsIGJlIHVucmVzZXJ2ZWQgdXBvbiBhcHByb3ZhbCxkb3Igc2xhc2hlZCB3aGVuIHJlamVjdGVkLgD4LSBgY3VyYXRvcmA6IFRoZSBjdXJhdG9yIGFjY291bnQgd2hvbSB3aWxsIG1hbmFnZSB0aGlzIGJvdW50eS5kLSBgZmVlYDogVGhlIGN1cmF0b3IgZmVlLiUBLSBgdmFsdWVgOiBUaGUgdG90YWwgcGF5bWVudCBhbW91bnQgb2YgdGhpcyBib3VudHksIGN1cmF0b3IgZmVlIGluY2x1ZGVkLsAtIGBkZXNjcmlwdGlvbmA6IFRoZSBkZXNjcmlwdGlvbiBvZiB0aGlzIGJvdW50eS44YXBwcm92ZV9ib3VudHkEASRib3VudHlfaWTUASxCb3VudHlJbmRleAABHF0BQXBwcm92ZSBhIGJvdW50eSBwcm9wb3NhbC4gQXQgYSBsYXRlciB0aW1lLCB0aGUgYm91bnR5IHdpbGwgYmUgZnVuZGVkIGFuZCBiZWNvbWUgYWN0aXZlqGFuZCB0aGUgb3JpZ2luYWwgZGVwb3NpdCB3aWxsIGJlIHJldHVybmVkLgCkTWF5IG9ubHkgYmUgY2FsbGVkIGZyb20gYFQ6OlNwZW5kT3JpZ2luYC4ANCMjIENvbXBsZXhpdHkcLSBPKDEpLjxwcm9wb3NlX2N1cmF0b3IMASRib3VudHlfaWTUASxCb3VudHlJbmRleAABHGN1cmF0b3KdAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AAQxmZWXkATxCYWxhbmNlT2Y8VCwgST4AAhiUUHJvcG9zZSBhIGN1cmF0b3IgdG8gYSBmdW5kZWQgYm91bnR5LgCkTWF5IG9ubHkgYmUgY2FsbGVkIGZyb20gYFQ6OlNwZW5kT3JpZ2luYC4ANCMjIENvbXBsZXhpdHkcLSBPKDEpLkB1bmFzc2lnbl9jdXJhdG9yBAEkYm91bnR5X2lk1AEsQm91bnR5SW5kZXgAA0R8VW5hc3NpZ24gY3VyYXRvciBmcm9tIGEgYm91bnR5LgAdAVRoaXMgZnVuY3Rpb24gY2FuIG9ubHkgYmUgY2FsbGVkIGJ5IHRoZSBgUmVqZWN0T3JpZ2luYCBhIHNpZ25lZCBvcmlnaW4uAD0BSWYgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIGBSZWplY3RPcmlnaW5gLCB3ZSBhc3N1bWUgdGhhdCB0aGUgY3VyYXRvciBpczEBbWFsaWNpb3VzIG9yIGluYWN0aXZlLiBBcyBhIHJlc3VsdCwgd2Ugd2lsbCBzbGFzaCB0aGUgY3VyYXRvciB3aGVuIHBvc3NpYmxlLgBhAUlmIHRoZSBvcmlnaW4gaXMgdGhlIGN1cmF0b3IsIHdlIHRha2UgdGhpcyBhcyBhIHNpZ24gdGhleSBhcmUgdW5hYmxlIHRvIGRvIHRoZWlyIGpvYiBhbmRdAXRoZXkgd2lsbGluZ2x5IGdpdmUgdXAuIFdlIGNvdWxkIHNsYXNoIHRoZW0sIGJ1dCBmb3Igbm93IHdlIGFsbG93IHRoZW0gdG8gcmVjb3ZlciB0aGVpcjUBZGVwb3NpdCBhbmQgZXhpdCB3aXRob3V0IGlzc3VlLiAoV2UgbWF5IHdhbnQgdG8gY2hhbmdlIHRoaXMgaWYgaXQgaXMgYWJ1c2VkLikAXQFGaW5hbGx5LCB0aGUgb3JpZ2luIGNhbiBiZSBhbnlvbmUgaWYgYW5kIG9ubHkgaWYgdGhlIGN1cmF0b3IgaXMgImluYWN0aXZlIi4gVGhpcyBhbGxvd3NhAWFueW9uZSBpbiB0aGUgY29tbXVuaXR5IHRvIGNhbGwgb3V0IHRoYXQgYSBjdXJhdG9yIGlzIG5vdCBkb2luZyB0aGVpciBkdWUgZGlsaWdlbmNlLCBhbmQ5AXdlIHNob3VsZCBwaWNrIGEgbmV3IGN1cmF0b3IuIEluIHRoaXMgY2FzZSB0aGUgY3VyYXRvciBzaG91bGQgYWxzbyBiZSBzbGFzaGVkLgA0IyMgQ29tcGxleGl0eRwtIE8oMSkuOGFjY2VwdF9jdXJhdG9yBAEkYm91bnR5X2lk1AEsQm91bnR5SW5kZXgABByUQWNjZXB0IHRoZSBjdXJhdG9yIHJvbGUgZm9yIGEgYm91bnR5LikBQSBkZXBvc2l0IHdpbGwgYmUgcmVzZXJ2ZWQgZnJvbSBjdXJhdG9yIGFuZCByZWZ1bmQgdXBvbiBzdWNjZXNzZnVsIHBheW91dC4AkE1heSBvbmx5IGJlIGNhbGxlZCBmcm9tIHRoZSBjdXJhdG9yLgA0IyMgQ29tcGxleGl0eRwtIE8oMSkuMGF3YXJkX2JvdW50eQgBJGJvdW50eV9pZNQBLEJvdW50eUluZGV4AAEsYmVuZWZpY2lhcnmdAQFQQWNjb3VudElkTG9va3VwT2Y8VD4ABShZAUF3YXJkIGJvdW50eSB0byBhIGJlbmVmaWNpYXJ5IGFjY291bnQuIFRoZSBiZW5lZmljaWFyeSB3aWxsIGJlIGFibGUgdG8gY2xhaW0gdGhlIGZ1bmRzOGFmdGVyIGEgZGVsYXkuABUBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgdGhlIGN1cmF0b3Igb2YgdGhpcyBib3VudHkuAIgtIGBib3VudHlfaWRgOiBCb3VudHkgSUQgdG8gYXdhcmQuGQEtIGBiZW5lZmljaWFyeWA6IFRoZSBiZW5lZmljaWFyeSBhY2NvdW50IHdob20gd2lsbCByZWNlaXZlIHRoZSBwYXlvdXQuADQjIyBDb21wbGV4aXR5HC0gTygxKS4wY2xhaW1fYm91bnR5BAEkYm91bnR5X2lk1AEsQm91bnR5SW5kZXgABiDsQ2xhaW0gdGhlIHBheW91dCBmcm9tIGFuIGF3YXJkZWQgYm91bnR5IGFmdGVyIHBheW91dCBkZWxheS4AJQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSB0aGUgYmVuZWZpY2lhcnkgb2YgdGhpcyBib3VudHkuAIgtIGBib3VudHlfaWRgOiBCb3VudHkgSUQgdG8gY2xhaW0uADQjIyBDb21wbGV4aXR5HC0gTygxKS4wY2xvc2VfYm91bnR5BAEkYm91bnR5X2lk1AEsQm91bnR5SW5kZXgAByQ5AUNhbmNlbCBhIHByb3Bvc2VkIG9yIGFjdGl2ZSBib3VudHkuIEFsbCB0aGUgZnVuZHMgd2lsbCBiZSBzZW50IHRvIHRyZWFzdXJ5IGFuZMx0aGUgY3VyYXRvciBkZXBvc2l0IHdpbGwgYmUgdW5yZXNlcnZlZCBpZiBwb3NzaWJsZS4AyE9ubHkgYFQ6OlJlamVjdE9yaWdpbmAgaXMgYWJsZSB0byBjYW5jZWwgYSBib3VudHkuAIwtIGBib3VudHlfaWRgOiBCb3VudHkgSUQgdG8gY2FuY2VsLgA0IyMgQ29tcGxleGl0eRwtIE8oMSkuUGV4dGVuZF9ib3VudHlfZXhwaXJ5CAEkYm91bnR5X2lk1AEsQm91bnR5SW5kZXgAARhyZW1hcms4ARxWZWM8dTg+AAgkrEV4dGVuZCB0aGUgZXhwaXJ5IHRpbWUgb2YgYW4gYWN0aXZlIGJvdW50eS4AFQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSB0aGUgY3VyYXRvciBvZiB0aGlzIGJvdW50eS4AjC0gYGJvdW50eV9pZGA6IEJvdW50eSBJRCB0byBleHRlbmQujC0gYHJlbWFya2A6IGFkZGl0aW9uYWwgaW5mb3JtYXRpb24uADQjIyBDb21wbGV4aXR5HC0gTygxKS4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMuHQMMVHBhbGxldF9jaGlsZF9ib3VudGllcxhwYWxsZXQQQ2FsbAQEVAABHEBhZGRfY2hpbGRfYm91bnR5DAFAcGFyZW50X2JvdW50eV9pZNQBLEJvdW50eUluZGV4AAEUdmFsdWXkATBCYWxhbmNlT2Y8VD4AASxkZXNjcmlwdGlvbjgBHFZlYzx1OD4AAExcQWRkIGEgbmV3IGNoaWxkLWJvdW50eS4A/FRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIHRoZSBjdXJhdG9yIG9mIHBhcmVudNxib3VudHkgYW5kIHRoZSBwYXJlbnQgYm91bnR5IG11c3QgYmUgaW4gImFjdGl2ZSIgc3RhdGUuAAUBQ2hpbGQtYm91bnR5IGdldHMgYWRkZWQgc3VjY2Vzc2Z1bGx5ICYgZnVuZCBnZXRzIHRyYW5zZmVycmVkIGZyb20JAXBhcmVudCBib3VudHkgdG8gY2hpbGQtYm91bnR5IGFjY291bnQsIGlmIHBhcmVudCBib3VudHkgaGFzIGVub3VnaGxmdW5kcywgZWxzZSB0aGUgY2FsbCBmYWlscy4ADQFVcHBlciBib3VuZCB0byBtYXhpbXVtIG51bWJlciBvZiBhY3RpdmUgIGNoaWxkIGJvdW50aWVzIHRoYXQgY2FuIGJlqGFkZGVkIGFyZSBtYW5hZ2VkIHZpYSBydW50aW1lIHRyYWl0IGNvbmZpZ5hbYENvbmZpZzo6TWF4QWN0aXZlQ2hpbGRCb3VudHlDb3VudGBdLgABAUlmIHRoZSBjYWxsIGlzIHN1Y2Nlc3MsIHRoZSBzdGF0dXMgb2YgY2hpbGQtYm91bnR5IGlzIHVwZGF0ZWQgdG8gIkFkZGVkIi4ATQEtIGBwYXJlbnRfYm91bnR5X2lkYDogSW5kZXggb2YgcGFyZW50IGJvdW50eSBmb3Igd2hpY2ggY2hpbGQtYm91bnR5IGlzIGJlaW5nIGFkZGVkLrAtIGB2YWx1ZWA6IFZhbHVlIGZvciBleGVjdXRpbmcgdGhlIHByb3Bvc2FsLtwtIGBkZXNjcmlwdGlvbmA6IFRleHQgZGVzY3JpcHRpb24gZm9yIHRoZSBjaGlsZC1ib3VudHkuPHByb3Bvc2VfY3VyYXRvchABQHBhcmVudF9ib3VudHlfaWTUASxCb3VudHlJbmRleAABPGNoaWxkX2JvdW50eV9pZNQBLEJvdW50eUluZGV4AAEcY3VyYXRvcp0BAVBBY2NvdW50SWRMb29rdXBPZjxUPgABDGZlZeQBMEJhbGFuY2VPZjxUPgABPKBQcm9wb3NlIGN1cmF0b3IgZm9yIGZ1bmRlZCBjaGlsZC1ib3VudHkuAA0BVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgY3VyYXRvciBvZiBwYXJlbnQgYm91bnR5LgARAVBhcmVudCBib3VudHkgbXVzdCBiZSBpbiBhY3RpdmUgc3RhdGUsIGZvciB0aGlzIGNoaWxkLWJvdW50eSBjYWxsIHRvFHdvcmsuAA0BQ2hpbGQtYm91bnR5IG11c3QgYmUgaW4gIkFkZGVkIiBzdGF0ZSwgZm9yIHByb2Nlc3NpbmcgdGhlIGNhbGwuIEFuZAUBc3RhdGUgb2YgY2hpbGQtYm91bnR5IGlzIG1vdmVkIHRvICJDdXJhdG9yUHJvcG9zZWQiIG9uIHN1Y2Nlc3NmdWxAY2FsbCBjb21wbGV0aW9uLgC0LSBgcGFyZW50X2JvdW50eV9pZGA6IEluZGV4IG9mIHBhcmVudCBib3VudHkurC0gYGNoaWxkX2JvdW50eV9pZGA6IEluZGV4IG9mIGNoaWxkIGJvdW50eS60LSBgY3VyYXRvcmA6IEFkZHJlc3Mgb2YgY2hpbGQtYm91bnR5IGN1cmF0b3Iu7C0gYGZlZWA6IHBheW1lbnQgZmVlIHRvIGNoaWxkLWJvdW50eSBjdXJhdG9yIGZvciBleGVjdXRpb24uOGFjY2VwdF9jdXJhdG9yCAFAcGFyZW50X2JvdW50eV9pZNQBLEJvdW50eUluZGV4AAE8Y2hpbGRfYm91bnR5X2lk1AEsQm91bnR5SW5kZXgAAky0QWNjZXB0IHRoZSBjdXJhdG9yIHJvbGUgZm9yIHRoZSBjaGlsZC1ib3VudHkuAPRUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSB0aGUgY3VyYXRvciBvZiB0aGlzNGNoaWxkLWJvdW50eS4A7EEgZGVwb3NpdCB3aWxsIGJlIHJlc2VydmVkIGZyb20gdGhlIGN1cmF0b3IgYW5kIHJlZnVuZCB1cG9uiHN1Y2Nlc3NmdWwgcGF5b3V0IG9yIGNhbmNlbGxhdGlvbi4A+EZlZSBmb3IgY3VyYXRvciBpcyBkZWR1Y3RlZCBmcm9tIGN1cmF0b3IgZmVlIG9mIHBhcmVudCBib3VudHkuABEBUGFyZW50IGJvdW50eSBtdXN0IGJlIGluIGFjdGl2ZSBzdGF0ZSwgZm9yIHRoaXMgY2hpbGQtYm91bnR5IGNhbGwgdG8Ud29yay4ADQFDaGlsZC1ib3VudHkgbXVzdCBiZSBpbiAiQ3VyYXRvclByb3Bvc2VkIiBzdGF0ZSwgZm9yIHByb2Nlc3NpbmcgdGhlCQFjYWxsLiBBbmQgc3RhdGUgb2YgY2hpbGQtYm91bnR5IGlzIG1vdmVkIHRvICJBY3RpdmUiIG9uIHN1Y2Nlc3NmdWxAY2FsbCBjb21wbGV0aW9uLgC0LSBgcGFyZW50X2JvdW50eV9pZGA6IEluZGV4IG9mIHBhcmVudCBib3VudHkurC0gYGNoaWxkX2JvdW50eV9pZGA6IEluZGV4IG9mIGNoaWxkIGJvdW50eS5AdW5hc3NpZ25fY3VyYXRvcggBQHBhcmVudF9ib3VudHlfaWTUASxCb3VudHlJbmRleAABPGNoaWxkX2JvdW50eV9pZNQBLEJvdW50eUluZGV4AAOIlFVuYXNzaWduIGN1cmF0b3IgZnJvbSBhIGNoaWxkLWJvdW50eS4ACQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgY2FuIGJlIGVpdGhlciBgUmVqZWN0T3JpZ2luYCwgb3LcdGhlIGN1cmF0b3Igb2YgdGhlIHBhcmVudCBib3VudHksIG9yIGFueSBzaWduZWQgb3JpZ2luLgD4Rm9yIHRoZSBvcmlnaW4gb3RoZXIgdGhhbiBUOjpSZWplY3RPcmlnaW4gYW5kIHRoZSBjaGlsZC1ib3VudHkBAWN1cmF0b3IsIHBhcmVudCBib3VudHkgbXVzdCBiZSBpbiBhY3RpdmUgc3RhdGUsIGZvciB0aGlzIGNhbGwgdG8JAXdvcmsuIFdlIGFsbG93IGNoaWxkLWJvdW50eSBjdXJhdG9yIGFuZCBUOjpSZWplY3RPcmlnaW4gdG8gZXhlY3V0Zch0aGlzIGNhbGwgaXJyZXNwZWN0aXZlIG9mIHRoZSBwYXJlbnQgYm91bnR5IHN0YXRlLgDcSWYgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIGBSZWplY3RPcmlnaW5gIG9yIHRoZQUBcGFyZW50IGJvdW50eSBjdXJhdG9yLCB3ZSBhc3N1bWUgdGhhdCB0aGUgY2hpbGQtYm91bnR5IGN1cmF0b3IgaXMNAW1hbGljaW91cyBvciBpbmFjdGl2ZS4gQXMgYSByZXN1bHQsIGNoaWxkLWJvdW50eSBjdXJhdG9yIGRlcG9zaXQgaXMgc2xhc2hlZC4ABQFJZiB0aGUgb3JpZ2luIGlzIHRoZSBjaGlsZC1ib3VudHkgY3VyYXRvciwgd2UgdGFrZSB0aGlzIGFzIGEgc2lnbgkBdGhhdCB0aGV5IGFyZSB1bmFibGUgdG8gZG8gdGhlaXIgam9iLCBhbmQgYXJlIHdpbGxpbmdseSBnaXZpbmcgdXAuCQFXZSBjb3VsZCBzbGFzaCB0aGUgZGVwb3NpdCwgYnV0IGZvciBub3cgd2UgYWxsb3cgdGhlbSB0byB1bnJlc2VydmURAXRoZWlyIGRlcG9zaXQgYW5kIGV4aXQgd2l0aG91dCBpc3N1ZS4gKFdlIG1heSB3YW50IHRvIGNoYW5nZSB0aGlzIGlmOGl0IGlzIGFidXNlZC4pAAUBRmluYWxseSwgdGhlIG9yaWdpbiBjYW4gYmUgYW55b25lIGlmZiB0aGUgY2hpbGQtYm91bnR5IGN1cmF0b3IgaXMJASJpbmFjdGl2ZSIuIEV4cGlyeSB1cGRhdGUgZHVlIG9mIHBhcmVudCBib3VudHkgaXMgdXNlZCB0byBlc3RpbWF0ZZxpbmFjdGl2ZSBzdGF0ZSBvZiBjaGlsZC1ib3VudHkgY3VyYXRvci4ADQFUaGlzIGFsbG93cyBhbnlvbmUgaW4gdGhlIGNvbW11bml0eSB0byBjYWxsIG91dCB0aGF0IGEgY2hpbGQtYm91bnR5CQFjdXJhdG9yIGlzIG5vdCBkb2luZyB0aGVpciBkdWUgZGlsaWdlbmNlLCBhbmQgd2Ugc2hvdWxkIHBpY2sgYSBuZXf4b25lLiBJbiB0aGlzIGNhc2UgdGhlIGNoaWxkLWJvdW50eSBjdXJhdG9yIGRlcG9zaXQgaXMgc2xhc2hlZC4AAQFTdGF0ZSBvZiBjaGlsZC1ib3VudHkgaXMgbW92ZWQgdG8gQWRkZWQgc3RhdGUgb24gc3VjY2Vzc2Z1bCBjYWxsLGNvbXBsZXRpb24uALQtIGBwYXJlbnRfYm91bnR5X2lkYDogSW5kZXggb2YgcGFyZW50IGJvdW50eS6sLSBgY2hpbGRfYm91bnR5X2lkYDogSW5kZXggb2YgY2hpbGQgYm91bnR5Lkhhd2FyZF9jaGlsZF9ib3VudHkMAUBwYXJlbnRfYm91bnR5X2lk1AEsQm91bnR5SW5kZXgAATxjaGlsZF9ib3VudHlfaWTUASxCb3VudHlJbmRleAABLGJlbmVmaWNpYXJ5nQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAREkEF3YXJkIGNoaWxkLWJvdW50eSB0byBhIGJlbmVmaWNpYXJ5LgD4VGhlIGJlbmVmaWNpYXJ5IHdpbGwgYmUgYWJsZSB0byBjbGFpbSB0aGUgZnVuZHMgYWZ0ZXIgYSBkZWxheS4A/FRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIHRoZSBwYXJlbnQgY3VyYXRvciBvcnRjdXJhdG9yIG9mIHRoaXMgY2hpbGQtYm91bnR5LgARAVBhcmVudCBib3VudHkgbXVzdCBiZSBpbiBhY3RpdmUgc3RhdGUsIGZvciB0aGlzIGNoaWxkLWJvdW50eSBjYWxsIHRvFHdvcmsuAAkBQ2hpbGQtYm91bnR5IG11c3QgYmUgaW4gYWN0aXZlIHN0YXRlLCBmb3IgcHJvY2Vzc2luZyB0aGUgY2FsbC4gQW5kEQFzdGF0ZSBvZiBjaGlsZC1ib3VudHkgaXMgbW92ZWQgdG8gIlBlbmRpbmdQYXlvdXQiIG9uIHN1Y2Nlc3NmdWwgY2FsbCxjb21wbGV0aW9uLgC0LSBgcGFyZW50X2JvdW50eV9pZGA6IEluZGV4IG9mIHBhcmVudCBib3VudHkurC0gYGNoaWxkX2JvdW50eV9pZGA6IEluZGV4IG9mIGNoaWxkIGJvdW50eS6ULSBgYmVuZWZpY2lhcnlgOiBCZW5lZmljaWFyeSBhY2NvdW50LkhjbGFpbV9jaGlsZF9ib3VudHkIAUBwYXJlbnRfYm91bnR5X2lk1AEsQm91bnR5SW5kZXgAATxjaGlsZF9ib3VudHlfaWTUASxCb3VudHlJbmRleAAFQAUBQ2xhaW0gdGhlIHBheW91dCBmcm9tIGFuIGF3YXJkZWQgY2hpbGQtYm91bnR5IGFmdGVyIHBheW91dCBkZWxheS4A7FRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtYXkgYmUgYW55IHNpZ25lZCBvcmlnaW4uAAUBQ2FsbCB3b3JrcyBpbmRlcGVuZGVudCBvZiBwYXJlbnQgYm91bnR5IHN0YXRlLCBObyBuZWVkIGZvciBwYXJlbnR0Ym91bnR5IHRvIGJlIGluIGFjdGl2ZSBzdGF0ZS4AEQFUaGUgQmVuZWZpY2lhcnkgaXMgcGFpZCBvdXQgd2l0aCBhZ3JlZWQgYm91bnR5IHZhbHVlLiBDdXJhdG9yIGZlZSBpc5RwYWlkICYgY3VyYXRvciBkZXBvc2l0IGlzIHVucmVzZXJ2ZWQuAAUBQ2hpbGQtYm91bnR5IG11c3QgYmUgaW4gIlBlbmRpbmdQYXlvdXQiIHN0YXRlLCBmb3IgcHJvY2Vzc2luZyB0aGX8Y2FsbC4gQW5kIGluc3RhbmNlIG9mIGNoaWxkLWJvdW50eSBpcyByZW1vdmVkIGZyb20gdGhlIHN0YXRlIG9ubHN1Y2Nlc3NmdWwgY2FsbCBjb21wbGV0aW9uLgC0LSBgcGFyZW50X2JvdW50eV9pZGA6IEluZGV4IG9mIHBhcmVudCBib3VudHkurC0gYGNoaWxkX2JvdW50eV9pZGA6IEluZGV4IG9mIGNoaWxkIGJvdW50eS5IY2xvc2VfY2hpbGRfYm91bnR5CAFAcGFyZW50X2JvdW50eV9pZNQBLEJvdW50eUluZGV4AAE8Y2hpbGRfYm91bnR5X2lk1AEsQm91bnR5SW5kZXgABlgRAUNhbmNlbCBhIHByb3Bvc2VkIG9yIGFjdGl2ZSBjaGlsZC1ib3VudHkuIENoaWxkLWJvdW50eSBhY2NvdW50IGZ1bmRzCQFhcmUgdHJhbnNmZXJyZWQgdG8gcGFyZW50IGJvdW50eSBhY2NvdW50LiBUaGUgY2hpbGQtYm91bnR5IGN1cmF0b3KYZGVwb3NpdCBtYXkgYmUgdW5yZXNlcnZlZCBpZiBwb3NzaWJsZS4ACQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBlaXRoZXIgcGFyZW50IGN1cmF0b3Igb3JIYFQ6OlJlamVjdE9yaWdpbmAuAPBJZiB0aGUgc3RhdGUgb2YgY2hpbGQtYm91bnR5IGlzIGBBY3RpdmVgLCBjdXJhdG9yIGRlcG9zaXQgaXMsdW5yZXNlcnZlZC4A9ElmIHRoZSBzdGF0ZSBvZiBjaGlsZC1ib3VudHkgaXMgYFBlbmRpbmdQYXlvdXRgLCBjYWxsIGZhaWxzICZ4cmV0dXJucyBgUGVuZGluZ1BheW91dGAgZXJyb3IuAA0BRm9yIHRoZSBvcmlnaW4gb3RoZXIgdGhhbiBUOjpSZWplY3RPcmlnaW4sIHBhcmVudCBib3VudHkgbXVzdCBiZSBpbvBhY3RpdmUgc3RhdGUsIGZvciB0aGlzIGNoaWxkLWJvdW50eSBjYWxsIHRvIHdvcmsuIEZvciBvcmlnaW6QVDo6UmVqZWN0T3JpZ2luIGV4ZWN1dGlvbiBpcyBmb3JjZWQuAAEBSW5zdGFuY2Ugb2YgY2hpbGQtYm91bnR5IGlzIHJlbW92ZWQgZnJvbSB0aGUgc3RhdGUgb24gc3VjY2Vzc2Z1bEBjYWxsIGNvbXBsZXRpb24uALQtIGBwYXJlbnRfYm91bnR5X2lkYDogSW5kZXggb2YgcGFyZW50IGJvdW50eS6sLSBgY2hpbGRfYm91bnR5X2lkYDogSW5kZXggb2YgY2hpbGQgYm91bnR5LgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy4hAwyQcGFsbGV0X2VsZWN0aW9uX3Byb3ZpZGVyX211bHRpX3BoYXNlGHBhbGxldBBDYWxsBARUAAEUPHN1Ym1pdF91bnNpZ25lZAgBMHJhd19zb2x1dGlvbiUDAbBCb3g8UmF3U29sdXRpb248U29sdXRpb25PZjxUOjpNaW5lckNvbmZpZz4+PgABHHdpdG5lc3NZBAFYU29sdXRpb25PclNuYXBzaG90U2l6ZQAAOKRTdWJtaXQgYSBzb2x1dGlvbiBmb3IgdGhlIHVuc2lnbmVkIHBoYXNlLgDIVGhlIGRpc3BhdGNoIG9yaWdpbiBmbyB0aGlzIGNhbGwgbXVzdCBiZSBfX25vbmVfXy4APQFUaGlzIHN1Ym1pc3Npb24gaXMgY2hlY2tlZCBvbiB0aGUgZmx5LiBNb3Jlb3ZlciwgdGhpcyB1bnNpZ25lZCBzb2x1dGlvbiBpcyBvbmx5VQF2YWxpZGF0ZWQgd2hlbiBzdWJtaXR0ZWQgdG8gdGhlIHBvb2wgZnJvbSB0aGUgKipsb2NhbCoqIG5vZGUuIEVmZmVjdGl2ZWx5LCB0aGlzIG1lYW5zXQF0aGF0IG9ubHkgYWN0aXZlIHZhbGlkYXRvcnMgY2FuIHN1Ym1pdCB0aGlzIHRyYW5zYWN0aW9uIHdoZW4gYXV0aG9yaW5nIGEgYmxvY2sgKHNpbWlsYXJAdG8gYW4gaW5oZXJlbnQpLgBZAVRvIHByZXZlbnQgYW55IGluY29ycmVjdCBzb2x1dGlvbiAoYW5kIHRodXMgd2FzdGVkIHRpbWUvd2VpZ2h0KSwgdGhpcyB0cmFuc2FjdGlvbiB3aWxsTQFwYW5pYyBpZiB0aGUgc29sdXRpb24gc3VibWl0dGVkIGJ5IHRoZSB2YWxpZGF0b3IgaXMgaW52YWxpZCBpbiBhbnkgd2F5LCBlZmZlY3RpdmVseZxwdXR0aW5nIHRoZWlyIGF1dGhvcmluZyByZXdhcmQgYXQgcmlzay4A4E5vIGRlcG9zaXQgb3IgcmV3YXJkIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHN1Ym1pc3Npb24ubHNldF9taW5pbXVtX3VudHJ1c3RlZF9zY29yZQQBQG1heWJlX25leHRfc2NvcmVdBAFUT3B0aW9uPEVsZWN0aW9uU2NvcmU+AAEUsFNldCBhIG5ldyB2YWx1ZSBmb3IgYE1pbmltdW1VbnRydXN0ZWRTY29yZWAuANhEaXNwYXRjaCBvcmlnaW4gbXVzdCBiZSBhbGlnbmVkIHdpdGggYFQ6OkZvcmNlT3JpZ2luYC4A8FRoaXMgY2hlY2sgY2FuIGJlIHR1cm5lZCBvZmYgYnkgc2V0dGluZyB0aGUgdmFsdWUgdG8gYE5vbmVgLnRzZXRfZW1lcmdlbmN5X2VsZWN0aW9uX3Jlc3VsdAQBIHN1cHBvcnRzYQQBWFN1cHBvcnRzPFQ6OkFjY291bnRJZD4AAiBZAVNldCBhIHNvbHV0aW9uIGluIHRoZSBxdWV1ZSwgdG8gYmUgaGFuZGVkIG91dCB0byB0aGUgY2xpZW50IG9mIHRoaXMgcGFsbGV0IGluIHRoZSBuZXh0iGNhbGwgdG8gYEVsZWN0aW9uUHJvdmlkZXI6OmVsZWN0YC4ARQFUaGlzIGNhbiBvbmx5IGJlIHNldCBieSBgVDo6Rm9yY2VPcmlnaW5gLCBhbmQgb25seSB3aGVuIHRoZSBwaGFzZSBpcyBgRW1lcmdlbmN5YC4AYQFUaGUgc29sdXRpb24gaXMgbm90IGNoZWNrZWQgZm9yIGFueSBmZWFzaWJpbGl0eSBhbmQgaXMgYXNzdW1lZCB0byBiZSB0cnVzdHdvcnRoeSwgYXMgYW55UQFmZWFzaWJpbGl0eSBjaGVjayBpdHNlbGYgY2FuIGluIHByaW5jaXBsZSBjYXVzZSB0aGUgZWxlY3Rpb24gcHJvY2VzcyB0byBmYWlsIChkdWUgdG9obWVtb3J5L3dlaWdodCBjb25zdHJhaW5zKS4Yc3VibWl0BAEwcmF3X3NvbHV0aW9uJQMBsEJveDxSYXdTb2x1dGlvbjxTb2x1dGlvbk9mPFQ6Ok1pbmVyQ29uZmlnPj4+AAMknFN1Ym1pdCBhIHNvbHV0aW9uIGZvciB0aGUgc2lnbmVkIHBoYXNlLgDQVGhlIGRpc3BhdGNoIG9yaWdpbiBmbyB0aGlzIGNhbGwgbXVzdCBiZSBfX3NpZ25lZF9fLgBdAVRoZSBzb2x1dGlvbiBpcyBwb3RlbnRpYWxseSBxdWV1ZWQsIGJhc2VkIG9uIHRoZSBjbGFpbWVkIHNjb3JlIGFuZCBwcm9jZXNzZWQgYXQgdGhlIGVuZFBvZiB0aGUgc2lnbmVkIHBoYXNlLgBdAUEgZGVwb3NpdCBpcyByZXNlcnZlZCBhbmQgcmVjb3JkZWQgZm9yIHRoZSBzb2x1dGlvbi4gQmFzZWQgb24gdGhlIG91dGNvbWUsIHRoZSBzb2x1dGlvbhUBbWlnaHQgYmUgcmV3YXJkZWQsIHNsYXNoZWQsIG9yIGdldCBhbGwgb3IgYSBwYXJ0IG9mIHRoZSBkZXBvc2l0IGJhY2suTGdvdmVybmFuY2VfZmFsbGJhY2sIAUBtYXliZV9tYXhfdm90ZXJzPQIBLE9wdGlvbjx1MzI+AAFEbWF5YmVfbWF4X3RhcmdldHM9AgEsT3B0aW9uPHUzMj4ABBCAVHJpZ2dlciB0aGUgZ292ZXJuYW5jZSBmYWxsYmFjay4ASQFUaGlzIGNhbiBvbmx5IGJlIGNhbGxlZCB3aGVuIFtgUGhhc2U6OkVtZXJnZW5jeWBdIGlzIGVuYWJsZWQsIGFzIGFuIGFsdGVybmF0aXZlIHRvwGNhbGxpbmcgW2BDYWxsOjpzZXRfZW1lcmdlbmN5X2VsZWN0aW9uX3Jlc3VsdGBdLgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy4lAwiQcGFsbGV0X2VsZWN0aW9uX3Byb3ZpZGVyX211bHRpX3BoYXNlLFJhd1NvbHV0aW9uBARTASkDAAwBIHNvbHV0aW9uKQMBBFMAARRzY29yZVUEATRFbGVjdGlvblNjb3JlAAEUcm91bmQQAQx1MzIAACkDCFhzdGFnaW5nX2t1c2FtYV9ydW50aW1lVE5wb3NDb21wYWN0U29sdXRpb24yNAAAYAEYdm90ZXMxLQMAAAEYdm90ZXMyOQMAAAEYdm90ZXMzTQMAAAEYdm90ZXM0WQMAAAEYdm90ZXM1ZQMAAAEYdm90ZXM2cQMAAAEYdm90ZXM3fQMAAAEYdm90ZXM4iQMAAAEYdm90ZXM5lQMAAAEcdm90ZXMxMKEDAAABHHZvdGVzMTGtAwAAARx2b3RlczEyuQMAAAEcdm90ZXMxM8UDAAABHHZvdGVzMTTRAwAAARx2b3RlczE13QMAAAEcdm90ZXMxNukDAAABHHZvdGVzMTf1AwAAARx2b3RlczE4AQQAAAEcdm90ZXMxOQ0EAAABHHZvdGVzMjAZBAAAARx2b3RlczIxJQQAAAEcdm90ZXMyMjEEAAABHHZvdGVzMjM9BAAAARx2b3RlczI0SQQAAAAtAwAAAjEDADEDAAAECNQ1AwA1AwAABlUBADkDAAACPQMAPQMAAAQM1EEDNQMAQQMAAAQINQNFAwBFAwAABkkDAEkDDDRzcF9hcml0aG1ldGljKHBlcl90aGluZ3MYUGVyVTE2AAAEAFUBAQx1MTYAAE0DAAACUQMAUQMAAAQM1FUDNQMAVQMAAAMCAAAAQQMAWQMAAAJdAwBdAwAABAzUYQM1AwBhAwAAAwMAAABBAwBlAwAAAmkDAGkDAAAEDNRtAzUDAG0DAAADBAAAAEEDAHEDAAACdQMAdQMAAAQM1HkDNQMAeQMAAAMFAAAAQQMAfQMAAAKBAwCBAwAABAzUhQM1AwCFAwAAAwYAAABBAwCJAwAAAo0DAI0DAAAEDNSRAzUDAJEDAAADBwAAAEEDAJUDAAACmQMAmQMAAAQM1J0DNQMAnQMAAAMIAAAAQQMAoQMAAAKlAwClAwAABAzUqQM1AwCpAwAAAwkAAABBAwCtAwAAArEDALEDAAAEDNS1AzUDALUDAAADCgAAAEEDALkDAAACvQMAvQMAAAQM1MEDNQMAwQMAAAMLAAAAQQMAxQMAAALJAwDJAwAABAzUzQM1AwDNAwAAAwwAAABBAwDRAwAAAtUDANUDAAAEDNTZAzUDANkDAAADDQAAAEEDAN0DAAAC4QMA4QMAAAQM1OUDNQMA5QMAAAMOAAAAQQMA6QMAAALtAwDtAwAABAzU8QM1AwDxAwAAAw8AAABBAwD1AwAAAvkDAPkDAAAEDNT9AzUDAP0DAAADEAAAAEEDAAEEAAACBQQABQQAAAQM1AkENQMACQQAAAMRAAAAQQMADQQAAAIRBAARBAAABAzUFQQ1AwAVBAAAAxIAAABBAwAZBAAAAh0EAB0EAAAEDNQhBDUDACEEAAADEwAAAEEDACUEAAACKQQAKQQAAAQM1C0ENQMALQQAAAMUAAAAQQMAMQQAAAI1BAA1BAAABAzUOQQ1AwA5BAAAAxUAAABBAwA9BAAAAkEEAEEEAAAEDNRFBDUDAEUEAAADFgAAAEEDAEkEAAACTQQATQQAAAQM1FEENQMAUQQAAAMXAAAAQQMAVQQIRHNwX25wb3NfZWxlY3Rpb25zNEVsZWN0aW9uU2NvcmUAAAwBNG1pbmltYWxfc3Rha2UYATxFeHRlbmRlZEJhbGFuY2UAASRzdW1fc3Rha2UYATxFeHRlbmRlZEJhbGFuY2UAAURzdW1fc3Rha2Vfc3F1YXJlZBgBPEV4dGVuZGVkQmFsYW5jZQAAWQQIkHBhbGxldF9lbGVjdGlvbl9wcm92aWRlcl9tdWx0aV9waGFzZVhTb2x1dGlvbk9yU25hcHNob3RTaXplAAAIARh2b3RlcnPUAQx1MzIAARx0YXJnZXRz1AEMdTMyAABdBAQYT3B0aW9uBARUAVUEAQgQTm9uZQAAABBTb21lBABVBAAAAQAAYQQAAAJlBABlBAAABAgAaQQAaQQIRHNwX25wb3NfZWxlY3Rpb25zHFN1cHBvcnQEJEFjY291bnRJZAEAAAgBFHRvdGFsGAE8RXh0ZW5kZWRCYWxhbmNlAAEYdm90ZXJzbQQBhFZlYzwoQWNjb3VudElkLCBFeHRlbmRlZEJhbGFuY2UpPgAAbQQAAAJxBABxBAAABAgAGAB1BAwocGFsbGV0X25pcxhwYWxsZXQQQ2FsbAQEVAABHCRwbGFjZV9iaWQIARhhbW91bnTkATBCYWxhbmNlT2Y8VD4AASBkdXJhdGlvbhABDHUzMgAALDBQbGFjZSBhIGJpZC4APQFPcmlnaW4gbXVzdCBiZSBTaWduZWQsIGFuZCBhY2NvdW50IG11c3QgaGF2ZSBhdCBsZWFzdCBgYW1vdW50YCBpbiBmcmVlIGJhbGFuY2UuADEBLSBgYW1vdW50YDogVGhlIGFtb3VudCBvZiB0aGUgYmlkOyB0aGVzZSBmdW5kcyB3aWxsIGJlIHJlc2VydmVkLCBhbmQgaWYvd2hlbswgIGNvbnNvbGlkYXRlZCwgcmVtb3ZlZC4gTXVzdCBiZSBhdCBsZWFzdCBgTWluQmlkYC5JAS0gYGR1cmF0aW9uYDogVGhlIG51bWJlciBvZiBwZXJpb2RzIGJlZm9yZSB3aGljaCB0aGUgbmV3bHkgY29uc29saWRhdGVkIGJpZCBtYXkgYmX8ICB0aGF3ZWQuIE11c3QgYmUgZ3JlYXRlciB0aGFuIDEgYW5kIG5vIG1vcmUgdGhhbiBgUXVldWVDb3VudGAuADRDb21wbGV4aXRpZXM6rC0gYFF1ZXVlc1tkdXJhdGlvbl0ubGVuKClgIChqdXN0IHRha2UgbWF4KS4scmV0cmFjdF9iaWQIARhhbW91bnTkATBCYWxhbmNlT2Y8VD4AASBkdXJhdGlvbhABDHUzMgABHIBSZXRyYWN0IGEgcHJldmlvdXNseSBwbGFjZWQgYmlkLgBdAU9yaWdpbiBtdXN0IGJlIFNpZ25lZCwgYW5kIHRoZSBhY2NvdW50IHNob3VsZCBoYXZlIHByZXZpb3VzbHkgaXNzdWVkIGEgc3RpbGwtYWN0aXZlIGJpZGxvZiBgYW1vdW50YCBmb3IgYGR1cmF0aW9uYC4ArC0gYGFtb3VudGA6IFRoZSBhbW91bnQgb2YgdGhlIHByZXZpb3VzIGJpZC68LSBgZHVyYXRpb25gOiBUaGUgZHVyYXRpb24gb2YgdGhlIHByZXZpb3VzIGJpZC4wZnVuZF9kZWZpY2l0AAIM8EVuc3VyZSB3ZSBoYXZlIHN1ZmZpY2llbnQgZnVuZGluZyBmb3IgYWxsIHBvdGVudGlhbCBwYXlvdXRzLgC0LSBgb3JpZ2luYDogTXVzdCBiZSBhY2NlcHRlZCBieSBgRnVuZE9yaWdpbmAuMHRoYXdfcHJpdmF0ZQgBFGluZGV41AEwUmVjZWlwdEluZGV4AAFAbWF5YmVfcHJvcG9ydGlvbpkCAUxPcHRpb248UGVycXVpbnRpbGw+AAMgXQFSZWR1Y2Ugb3IgcmVtb3ZlIGFuIG91dHN0YW5kaW5nIHJlY2VpcHQsIHBsYWNpbmcgdGhlIGFjY29yZGluZyBwcm9wb3J0aW9uIG9mIGZ1bmRzIGludG9kdGhlIGFjY291bnQgb2YgdGhlIG93bmVyLgBZAS0gYG9yaWdpbmA6IE11c3QgYmUgU2lnbmVkIGFuZCB0aGUgYWNjb3VudCBtdXN0IGJlIHRoZSBvd25lciBvZiB0aGUgcmVjZWlwdCBgaW5kZXhgIGFzjCAgd2VsbCBhcyBhbnkgZnVuZ2libGUgY291bnRlcnBhcnQukC0gYGluZGV4YDogVGhlIGluZGV4IG9mIHRoZSByZWNlaXB0Ll0BLSBgcG9ydGlvbmA6IElmIGBTb21lYCwgdGhlbiBvbmx5IHRoZSBnaXZlbiBwb3J0aW9uIG9mIHRoZSByZWNlaXB0IHNob3VsZCBiZSB0aGF3ZWQuIElmjCAgYE5vbmVgLCB0aGVuIGFsbCBvZiBpdCBzaG91bGQgYmUuNHRoYXdfY29tbXVuYWwEARRpbmRleNQBMFJlY2VpcHRJbmRleAAEGF0BUmVkdWNlIG9yIHJlbW92ZSBhbiBvdXRzdGFuZGluZyByZWNlaXB0LCBwbGFjaW5nIHRoZSBhY2NvcmRpbmcgcHJvcG9ydGlvbiBvZiBmdW5kcyBpbnRvZHRoZSBhY2NvdW50IG9mIHRoZSBvd25lci4AYQEtIGBvcmlnaW5gOiBNdXN0IGJlIFNpZ25lZCBhbmQgdGhlIGFjY291bnQgbXVzdCBiZSB0aGUgb3duZXIgb2YgdGhlIGZ1bmdpYmxlIGNvdW50ZXJwYXJ0WCAgZm9yIHJlY2VpcHQgYGluZGV4YC6QLSBgaW5kZXhgOiBUaGUgaW5kZXggb2YgdGhlIHJlY2VpcHQuJGNvbW11bmlmeQQBFGluZGV41AEwUmVjZWlwdEluZGV4AAUEPQFNYWtlIGEgcHJpdmF0ZSByZWNlaXB0IGNvbW11bmFsIGFuZCBjcmVhdGUgZnVuZ2libGUgY291bnRlcnBhcnRzIGZvciBpdHMgb3duZXIuJHByaXZhdGl6ZQQBFGluZGV41AEwUmVjZWlwdEluZGV4AAYEOQFNYWtlIGEgY29tbXVuYWwgcmVjZWlwdCBwcml2YXRlIGFuZCBidXJuIGZ1bmdpYmxlIGNvdW50ZXJwYXJ0cyBmcm9tIGl0cyBvd25lci4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMueQQMPHBhbGxldF9iYWxhbmNlcxhwYWxsZXQQQ2FsbAgEVAAESQABJFB0cmFuc2Zlcl9hbGxvd19kZWF0aAgBEGRlc3SdAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AARR2YWx1ZeQBKFQ6OkJhbGFuY2UAABzUVHJhbnNmZXIgc29tZSBsaXF1aWQgZnJlZSBiYWxhbmNlIHRvIGFub3RoZXIgYWNjb3VudC4ANQFgdHJhbnNmZXJfYWxsb3dfZGVhdGhgIHdpbGwgc2V0IHRoZSBgRnJlZUJhbGFuY2VgIG9mIHRoZSBzZW5kZXIgYW5kIHJlY2VpdmVyLhEBSWYgdGhlIHNlbmRlcidzIGFjY291bnQgaXMgYmVsb3cgdGhlIGV4aXN0ZW50aWFsIGRlcG9zaXQgYXMgYSByZXN1bHSwb2YgdGhlIHRyYW5zZmVyLCB0aGUgYWNjb3VudCB3aWxsIGJlIHJlYXBlZC4AFQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBgU2lnbmVkYCBieSB0aGUgdHJhbnNhY3Rvci44Zm9yY2VfdHJhbnNmZXIMARhzb3VyY2WdAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AARBkZXN0nQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEUdmFsdWXkAShUOjpCYWxhbmNlAAIIYQFFeGFjdGx5IGFzIGB0cmFuc2Zlcl9hbGxvd19kZWF0aGAsIGV4Y2VwdCB0aGUgb3JpZ2luIG11c3QgYmUgcm9vdCBhbmQgdGhlIHNvdXJjZSBhY2NvdW50RG1heSBiZSBzcGVjaWZpZWQuTHRyYW5zZmVyX2tlZXBfYWxpdmUIARBkZXN0nQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEUdmFsdWXkAShUOjpCYWxhbmNlAAMYWQFTYW1lIGFzIHRoZSBbYHRyYW5zZmVyX2FsbG93X2RlYXRoYF0gY2FsbCwgYnV0IHdpdGggYSBjaGVjayB0aGF0IHRoZSB0cmFuc2ZlciB3aWxsIG5vdGBraWxsIHRoZSBvcmlnaW4gYWNjb3VudC4A6Dk5JSBvZiB0aGUgdGltZSB5b3Ugd2FudCBbYHRyYW5zZmVyX2FsbG93X2RlYXRoYF0gaW5zdGVhZC4A8FtgdHJhbnNmZXJfYWxsb3dfZGVhdGhgXTogc3RydWN0LlBhbGxldC5odG1sI21ldGhvZC50cmFuc2ZlcjB0cmFuc2Zlcl9hbGwIARBkZXN0nQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEoa2VlcF9hbGl2ZSABEGJvb2wABDwFAVRyYW5zZmVyIHRoZSBlbnRpcmUgdHJhbnNmZXJhYmxlIGJhbGFuY2UgZnJvbSB0aGUgY2FsbGVyIGFjY291bnQuAFkBTk9URTogVGhpcyBmdW5jdGlvbiBvbmx5IGF0dGVtcHRzIHRvIHRyYW5zZmVyIF90cmFuc2ZlcmFibGVfIGJhbGFuY2VzLiBUaGlzIG1lYW5zIHRoYXRhAWFueSBsb2NrZWQsIHJlc2VydmVkLCBvciBleGlzdGVudGlhbCBkZXBvc2l0cyAod2hlbiBga2VlcF9hbGl2ZWAgaXMgYHRydWVgKSwgd2lsbCBub3QgYmVdAXRyYW5zZmVycmVkIGJ5IHRoaXMgZnVuY3Rpb24uIFRvIGVuc3VyZSB0aGF0IHRoaXMgZnVuY3Rpb24gcmVzdWx0cyBpbiBhIGtpbGxlZCBhY2NvdW50LEUBeW91IG1pZ2h0IG5lZWQgdG8gcHJlcGFyZSB0aGUgYWNjb3VudCBieSByZW1vdmluZyBhbnkgcmVmZXJlbmNlIGNvdW50ZXJzLCBzdG9yYWdlQGRlcG9zaXRzLCBldGMuLi4AwFRoZSBkaXNwYXRjaCBvcmlnaW4gb2YgdGhpcyBjYWxsIG11c3QgYmUgU2lnbmVkLgCgLSBgZGVzdGA6IFRoZSByZWNpcGllbnQgb2YgdGhlIHRyYW5zZmVyLlkBLSBga2VlcF9hbGl2ZWA6IEEgYm9vbGVhbiB0byBkZXRlcm1pbmUgaWYgdGhlIGB0cmFuc2Zlcl9hbGxgIG9wZXJhdGlvbiBzaG91bGQgc2VuZCBhbGxNASAgb2YgdGhlIGZ1bmRzIHRoZSBhY2NvdW50IGhhcywgY2F1c2luZyB0aGUgc2VuZGVyIGFjY291bnQgdG8gYmUga2lsbGVkIChmYWxzZSksIG9yWQEgIHRyYW5zZmVyIGV2ZXJ5dGhpbmcgZXhjZXB0IGF0IGxlYXN0IHRoZSBleGlzdGVudGlhbCBkZXBvc2l0LCB3aGljaCB3aWxsIGd1YXJhbnRlZSB0b5wgIGtlZXAgdGhlIHNlbmRlciBhY2NvdW50IGFsaXZlICh0cnVlKS48Zm9yY2VfdW5yZXNlcnZlCAEMd2hvnQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEYYW1vdW50GAEoVDo6QmFsYW5jZQAFDLBVbnJlc2VydmUgc29tZSBiYWxhbmNlIGZyb20gYSB1c2VyIGJ5IGZvcmNlLgBsQ2FuIG9ubHkgYmUgY2FsbGVkIGJ5IFJPT1QuQHVwZ3JhZGVfYWNjb3VudHMEAQx3aG+tAQFEVmVjPFQ6OkFjY291bnRJZD4ABiBwVXBncmFkZSBhIHNwZWNpZmllZCBhY2NvdW50LgB0LSBgb3JpZ2luYDogTXVzdCBiZSBgU2lnbmVkYC6QLSBgd2hvYDogVGhlIGFjY291bnQgdG8gYmUgdXBncmFkZWQuAFUBVGhpcyB3aWxsIHdhaXZlIHRoZSB0cmFuc2FjdGlvbiBmZWUgaWYgYXQgbGVhc3QgYWxsIGJ1dCAxMCUgb2YgdGhlIGFjY291bnRzIG5lZWRlZCB0b0EBYmUgdXBncmFkZWQuIChXZSBsZXQgc29tZSBub3QgaGF2ZSB0byBiZSB1cGdyYWRlZCBqdXN0IGluIG9yZGVyIHRvIGFsbG93IGZvciB0aGVYcG9zc2liaWxpdHkgb2YgY2h1cm4pLkRmb3JjZV9zZXRfYmFsYW5jZQgBDHdob50BAVBBY2NvdW50SWRMb29rdXBPZjxUPgABIG5ld19mcmVl5AEoVDo6QmFsYW5jZQAIDKxTZXQgdGhlIHJlZ3VsYXIgYmFsYW5jZSBvZiBhIGdpdmVuIGFjY291bnQuALBUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgaXMgYHJvb3RgLmxmb3JjZV9hZGp1c3RfdG90YWxfaXNzdWFuY2UIASRkaXJlY3Rpb26xAQFMQWRqdXN0bWVudERpcmVjdGlvbgABFGRlbHRh5AEoVDo6QmFsYW5jZQAJFLhBZGp1c3QgdGhlIHRvdGFsIGlzc3VhbmNlIGluIGEgc2F0dXJhdGluZyB3YXkuAPxDYW4gb25seSBiZSBjYWxsZWQgYnkgcm9vdCBhbmQgYWx3YXlzIG5lZWRzIGEgcG9zaXRpdmUgYGRlbHRhYC4AJCMgRXhhbXBsZRBidXJuCAEUdmFsdWXkAShUOjpCYWxhbmNlAAEoa2VlcF9hbGl2ZSABEGJvb2wAChz8QnVybiB0aGUgc3BlY2lmaWVkIGxpcXVpZCBmcmVlIGJhbGFuY2UgZnJvbSB0aGUgb3JpZ2luIGFjY291bnQuACUBSWYgdGhlIG9yaWdpbidzIGFjY291bnQgZW5kcyB1cCBiZWxvdyB0aGUgZXhpc3RlbnRpYWwgZGVwb3NpdCBhcyBhIHJlc3VsdAkBb2YgdGhlIGJ1cm4gYW5kIGBrZWVwX2FsaXZlYCBpcyBmYWxzZSwgdGhlIGFjY291bnQgd2lsbCBiZSByZWFwZWQuAFEBVW5saWtlIHNlbmRpbmcgZnVuZHMgdG8gYSBfYnVybl8gYWRkcmVzcywgd2hpY2ggbWVyZWx5IG1ha2VzIHRoZSBmdW5kcyBpbmFjY2Vzc2libGUsIQF0aGlzIGBidXJuYCBvcGVyYXRpb24gd2lsbCByZWR1Y2UgdG90YWwgaXNzdWFuY2UgYnkgdGhlIGFtb3VudCBfYnVybmVkXy4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMufQQMQHBhbGxldF9iYWdzX2xpc3QYcGFsbGV0EENhbGwIBFQABEkAAQwUcmViYWcEAShkaXNsb2NhdGVknQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAAoWQFEZWNsYXJlIHRoYXQgc29tZSBgZGlzbG9jYXRlZGAgYWNjb3VudCBoYXMsIHRocm91Z2ggcmV3YXJkcyBvciBwZW5hbHRpZXMsIHN1ZmZpY2llbnRseVEBY2hhbmdlZCBpdHMgc2NvcmUgdGhhdCBpdCBzaG91bGQgcHJvcGVybHkgZmFsbCBpbnRvIGEgZGlmZmVyZW50IGJhZyB0aGFuIGl0cyBjdXJyZW50EG9uZS4AHQFBbnlvbmUgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbiBhYm91dCBhbnkgcG90ZW50aWFsbHkgZGlzbG9jYXRlZCBhY2NvdW50LgBJAVdpbGwgYWx3YXlzIHVwZGF0ZSB0aGUgc3RvcmVkIHNjb3JlIG9mIGBkaXNsb2NhdGVkYCB0byB0aGUgY29ycmVjdCBzY29yZSwgYmFzZWQgb25AYFNjb3JlUHJvdmlkZXJgLgDUSWYgYGRpc2xvY2F0ZWRgIGRvZXMgbm90IGV4aXN0cywgaXQgcmV0dXJucyBhbiBlcnJvci48cHV0X2luX2Zyb250X29mBAEcbGlnaHRlcp0BAVBBY2NvdW50SWRMb29rdXBPZjxUPgABKNBNb3ZlIHRoZSBjYWxsZXIncyBJZCBkaXJlY3RseSBpbiBmcm9udCBvZiBgbGlnaHRlcmAuAFkBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8gYW5kIGNhbiBvbmx5IGJlIGNhbGxlZCBieSB0aGUgSWQgb2Y1AXRoZSBhY2NvdW50IGdvaW5nIGluIGZyb250IG9mIGBsaWdodGVyYC4gRmVlIGlzIHBheWVkIGJ5IHRoZSBvcmlnaW4gdW5kZXIgYWxsOGNpcmN1bXN0YW5jZXMuADhPbmx5IHdvcmtzIGlmOgCULSBib3RoIG5vZGVzIGFyZSB3aXRoaW4gdGhlIHNhbWUgYmFnLNAtIGFuZCBgb3JpZ2luYCBoYXMgYSBncmVhdGVyIGBTY29yZWAgdGhhbiBgbGlnaHRlcmAuVHB1dF9pbl9mcm9udF9vZl9vdGhlcggBHGhlYXZpZXKdAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AARxsaWdodGVynQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAIMEQFTYW1lIGFzIFtgUGFsbGV0OjpwdXRfaW5fZnJvbnRfb2ZgXSwgYnV0IGl0IGNhbiBiZSBjYWxsZWQgYnkgYW55b25lLgDIRmVlIGlzIHBhaWQgYnkgdGhlIG9yaWdpbiB1bmRlciBhbGwgY2lyY3Vtc3RhbmNlcy4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMugQQMXHBhbGxldF9ub21pbmF0aW9uX3Bvb2xzGHBhbGxldBBDYWxsBARUAAFoEGpvaW4IARhhbW91bnTkATBCYWxhbmNlT2Y8VD4AARxwb29sX2lkEAEYUG9vbElkAAAoRQFTdGFrZSBmdW5kcyB3aXRoIGEgcG9vbC4gVGhlIGFtb3VudCB0byBib25kIGlzIHRyYW5zZmVycmVkIGZyb20gdGhlIG1lbWJlciB0byB0aGXccG9vbHMgYWNjb3VudCBhbmQgaW1tZWRpYXRlbHkgaW5jcmVhc2VzIHRoZSBwb29scyBib25kLgAYIyBOb3RlAMwqIEFuIGFjY291bnQgY2FuIG9ubHkgYmUgYSBtZW1iZXIgb2YgYSBzaW5nbGUgcG9vbC7YKiBBbiBhY2NvdW50IGNhbm5vdCBqb2luIHRoZSBzYW1lIHBvb2wgbXVsdGlwbGUgdGltZXMuQQEqIFRoaXMgY2FsbCB3aWxsICpub3QqIGR1c3QgdGhlIG1lbWJlciBhY2NvdW50LCBzbyB0aGUgbWVtYmVyIG11c3QgaGF2ZSBhdCBsZWFzdMggIGBleGlzdGVudGlhbCBkZXBvc2l0ICsgYW1vdW50YCBpbiB0aGVpciBhY2NvdW50LtAqIE9ubHkgYSBwb29sIHdpdGggW2BQb29sU3RhdGU6Ok9wZW5gXSBjYW4gYmUgam9pbmVkKGJvbmRfZXh0cmEEARRleHRyYYUEAVxCb25kRXh0cmE8QmFsYW5jZU9mPFQ+PgABHEUBQm9uZCBgZXh0cmFgIG1vcmUgZnVuZHMgZnJvbSBgb3JpZ2luYCBpbnRvIHRoZSBwb29sIHRvIHdoaWNoIHRoZXkgYWxyZWFkeSBiZWxvbmcuAEkBQWRkaXRpb25hbCBmdW5kcyBjYW4gY29tZSBmcm9tIGVpdGhlciB0aGUgZnJlZSBiYWxhbmNlIG9mIHRoZSBhY2NvdW50LCBvZiBmcm9tIHRoZZxhY2N1bXVsYXRlZCByZXdhcmRzLCBzZWUgW2BCb25kRXh0cmFgXS4APQFCb25kaW5nIGV4dHJhIGZ1bmRzIGltcGxpZXMgYW4gYXV0b21hdGljIHBheW91dCBvZiBhbGwgcGVuZGluZyByZXdhcmRzIGFzIHdlbGwuCQFTZWUgYGJvbmRfZXh0cmFfb3RoZXJgIHRvIGJvbmQgcGVuZGluZyByZXdhcmRzIG9mIGBvdGhlcmAgbWVtYmVycy4wY2xhaW1fcGF5b3V0AAIgVQFBIGJvbmRlZCBtZW1iZXIgY2FuIHVzZSB0aGlzIHRvIGNsYWltIHRoZWlyIHBheW91dCBiYXNlZCBvbiB0aGUgcmV3YXJkcyB0aGF0IHRoZSBwb29sYQFoYXMgYWNjdW11bGF0ZWQgc2luY2UgdGhlaXIgbGFzdCBjbGFpbWVkIHBheW91dCAoT1Igc2luY2Ugam9pbmluZyBpZiB0aGlzIGlzIHRoZWlyIGZpcnN0PQF0aW1lIGNsYWltaW5nIHJld2FyZHMpLiBUaGUgcGF5b3V0IHdpbGwgYmUgdHJhbnNmZXJyZWQgdG8gdGhlIG1lbWJlcidzIGFjY291bnQuAEkBVGhlIG1lbWJlciB3aWxsIGVhcm4gcmV3YXJkcyBwcm8gcmF0YSBiYXNlZCBvbiB0aGUgbWVtYmVycyBzdGFrZSB2cyB0aGUgc3VtIG9mIHRoZdBtZW1iZXJzIGluIHRoZSBwb29scyBzdGFrZS4gUmV3YXJkcyBkbyBub3QgImV4cGlyZSIuAEEBU2VlIGBjbGFpbV9wYXlvdXRfb3RoZXJgIHRvIGNsYWltIHJld2FyZHMgb24gYmVoYWxmIG9mIHNvbWUgYG90aGVyYCBwb29sIG1lbWJlci4YdW5ib25kCAE4bWVtYmVyX2FjY291bnSdAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AAUB1bmJvbmRpbmdfcG9pbnRz5AEwQmFsYW5jZU9mPFQ+AAN8RQFVbmJvbmQgdXAgdG8gYHVuYm9uZGluZ19wb2ludHNgIG9mIHRoZSBgbWVtYmVyX2FjY291bnRgJ3MgZnVuZHMgZnJvbSB0aGUgcG9vbC4gSXRFAWltcGxpY2l0bHkgY29sbGVjdHMgdGhlIHJld2FyZHMgb25lIGxhc3QgdGltZSwgc2luY2Ugbm90IGRvaW5nIHNvIHdvdWxkIG1lYW4gc29tZWxyZXdhcmRzIHdvdWxkIGJlIGZvcmZlaXRlZC4ATQFVbmRlciBjZXJ0YWluIGNvbmRpdGlvbnMsIHRoaXMgY2FsbCBjYW4gYmUgZGlzcGF0Y2hlZCBwZXJtaXNzaW9ubGVzc2x5IChpLmUuIGJ5IGFueSRhY2NvdW50KS4ArCMgQ29uZGl0aW9ucyBmb3IgYSBwZXJtaXNzaW9ubGVzcyBkaXNwYXRjaC4AXQEqIFRoZSBwb29sIGlzIGJsb2NrZWQgYW5kIHRoZSBjYWxsZXIgaXMgZWl0aGVyIHRoZSByb290IG9yIGJvdW5jZXIuIFRoaXMgaXMgcmVmZXJlZWQgdG8wICBhcyBhIGtpY2su9CogVGhlIHBvb2wgaXMgZGVzdHJveWluZyBhbmQgdGhlIG1lbWJlciBpcyBub3QgdGhlIGRlcG9zaXRvci5VASogVGhlIHBvb2wgaXMgZGVzdHJveWluZywgdGhlIG1lbWJlciBpcyB0aGUgZGVwb3NpdG9yIGFuZCBubyBvdGhlciBtZW1iZXJzIGFyZSBpbiB0aGUcICBwb29sLgARASMjIENvbmRpdGlvbnMgZm9yIHBlcm1pc3Npb25lZCBkaXNwYXRjaCAoaS5lLiB0aGUgY2FsbGVyIGlzIGFsc28gdGhlSGBtZW1iZXJfYWNjb3VudGApOgCIKiBUaGUgY2FsbGVyIGlzIG5vdCB0aGUgZGVwb3NpdG9yLlUBKiBUaGUgY2FsbGVyIGlzIHRoZSBkZXBvc2l0b3IsIHRoZSBwb29sIGlzIGRlc3Ryb3lpbmcgYW5kIG5vIG90aGVyIG1lbWJlcnMgYXJlIGluIHRoZRwgIHBvb2wuABgjIE5vdGUAHQFJZiB0aGVyZSBhcmUgdG9vIG1hbnkgdW5sb2NraW5nIGNodW5rcyB0byB1bmJvbmQgd2l0aCB0aGUgcG9vbCBhY2NvdW50LFEBW2BDYWxsOjpwb29sX3dpdGhkcmF3X3VuYm9uZGVkYF0gY2FuIGJlIGNhbGxlZCB0byB0cnkgYW5kIG1pbmltaXplIHVubG9ja2luZyBjaHVua3MuWQFUaGUgW2BTdGFraW5nSW50ZXJmYWNlOjp1bmJvbmRgXSB3aWxsIGltcGxpY2l0bHkgY2FsbCBbYENhbGw6OnBvb2xfd2l0aGRyYXdfdW5ib25kZWRgXVUBdG8gdHJ5IHRvIGZyZWUgY2h1bmtzIGlmIG5lY2Vzc2FyeSAoaWUuIGlmIHVuYm91bmQgd2FzIGNhbGxlZCBhbmQgbm8gdW5sb2NraW5nIGNodW5rc2EBYXJlIGF2YWlsYWJsZSkuIEhvd2V2ZXIsIGl0IG1heSBub3QgYmUgcG9zc2libGUgdG8gcmVsZWFzZSB0aGUgY3VycmVudCB1bmxvY2tpbmcgY2h1bmtzLF0BaW4gd2hpY2ggY2FzZSwgdGhlIHJlc3VsdCBvZiB0aGlzIGNhbGwgd2lsbCBsaWtlbHkgYmUgdGhlIGBOb01vcmVDaHVua3NgIGVycm9yIGZyb20gdGhlPHN0YWtpbmcgc3lzdGVtLlhwb29sX3dpdGhkcmF3X3VuYm9uZGVkCAEccG9vbF9pZBABGFBvb2xJZAABSG51bV9zbGFzaGluZ19zcGFucxABDHUzMgAEGFUBQ2FsbCBgd2l0aGRyYXdfdW5ib25kZWRgIGZvciB0aGUgcG9vbHMgYWNjb3VudC4gVGhpcyBjYWxsIGNhbiBiZSBtYWRlIGJ5IGFueSBhY2NvdW50LgBBAVRoaXMgaXMgdXNlZnVsIGlmIHRoZXJlIGFyZSB0b28gbWFueSB1bmxvY2tpbmcgY2h1bmtzIHRvIGNhbGwgYHVuYm9uZGAsIGFuZCBzb21lYQFjYW4gYmUgY2xlYXJlZCBieSB3aXRoZHJhd2luZy4gSW4gdGhlIGNhc2UgdGhlcmUgYXJlIHRvbyBtYW55IHVubG9ja2luZyBjaHVua3MsIHRoZSB1c2VyUQF3b3VsZCBwcm9iYWJseSBzZWUgYW4gZXJyb3IgbGlrZSBgTm9Nb3JlQ2h1bmtzYCBlbWl0dGVkIGZyb20gdGhlIHN0YWtpbmcgc3lzdGVtIHdoZW5cdGhleSBhdHRlbXB0IHRvIHVuYm9uZC5Ed2l0aGRyYXdfdW5ib25kZWQIAThtZW1iZXJfYWNjb3VudJ0BAVBBY2NvdW50SWRMb29rdXBPZjxUPgABSG51bV9zbGFzaGluZ19zcGFucxABDHUzMgAFWFUBV2l0aGRyYXcgdW5ib25kZWQgZnVuZHMgZnJvbSBgbWVtYmVyX2FjY291bnRgLiBJZiBubyBib25kZWQgZnVuZHMgY2FuIGJlIHVuYm9uZGVkLCBhbkhlcnJvciBpcyByZXR1cm5lZC4ATQFVbmRlciBjZXJ0YWluIGNvbmRpdGlvbnMsIHRoaXMgY2FsbCBjYW4gYmUgZGlzcGF0Y2hlZCBwZXJtaXNzaW9ubGVzc2x5IChpLmUuIGJ5IGFueSRhY2NvdW50KS4AqCMgQ29uZGl0aW9ucyBmb3IgYSBwZXJtaXNzaW9ubGVzcyBkaXNwYXRjaAAJASogVGhlIHBvb2wgaXMgaW4gZGVzdHJveSBtb2RlIGFuZCB0aGUgdGFyZ2V0IGlzIG5vdCB0aGUgZGVwb3NpdG9yLjEBKiBUaGUgdGFyZ2V0IGlzIHRoZSBkZXBvc2l0b3IgYW5kIHRoZXkgYXJlIHRoZSBvbmx5IG1lbWJlciBpbiB0aGUgc3ViIHBvb2xzLg0BKiBUaGUgcG9vbCBpcyBibG9ja2VkIGFuZCB0aGUgY2FsbGVyIGlzIGVpdGhlciB0aGUgcm9vdCBvciBib3VuY2VyLgCYIyBDb25kaXRpb25zIGZvciBwZXJtaXNzaW9uZWQgZGlzcGF0Y2gA6CogVGhlIGNhbGxlciBpcyB0aGUgdGFyZ2V0IGFuZCB0aGV5IGFyZSBub3QgdGhlIGRlcG9zaXRvci4AGCMgTm90ZQD0LSBJZiB0aGUgdGFyZ2V0IGlzIHRoZSBkZXBvc2l0b3IsIHRoZSBwb29sIHdpbGwgYmUgZGVzdHJveWVkLmEBLSBJZiB0aGUgcG9vbCBoYXMgYW55IHBlbmRpbmcgc2xhc2gsIHdlIGFsc28gdHJ5IHRvIHNsYXNoIHRoZSBtZW1iZXIgYmVmb3JlIGxldHRpbmcgdGhlbV0Bd2l0aGRyYXcuIFRoaXMgY2FsY3VsYXRpb24gYWRkcyBzb21lIHdlaWdodCBvdmVyaGVhZCBhbmQgaXMgb25seSBkZWZlbnNpdmUuIEluIHJlYWxpdHksVQFwb29sIHNsYXNoZXMgbXVzdCBoYXZlIGJlZW4gYWxyZWFkeSBhcHBsaWVkIHZpYSBwZXJtaXNzaW9ubGVzcyBbYENhbGw6OmFwcGx5X3NsYXNoYF0uGGNyZWF0ZRABGGFtb3VudOQBMEJhbGFuY2VPZjxUPgABEHJvb3SdAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AASRub21pbmF0b3KdAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AARxib3VuY2VynQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAZEdENyZWF0ZSBhIG5ldyBkZWxlZ2F0aW9uIHBvb2wuACwjIEFyZ3VtZW50cwBVASogYGFtb3VudGAgLSBUaGUgYW1vdW50IG9mIGZ1bmRzIHRvIGRlbGVnYXRlIHRvIHRoZSBwb29sLiBUaGlzIGFsc28gYWN0cyBvZiBhIHNvcnQgb2ZNASAgZGVwb3NpdCBzaW5jZSB0aGUgcG9vbHMgY3JlYXRvciBjYW5ub3QgZnVsbHkgdW5ib25kIGZ1bmRzIHVudGlsIHRoZSBwb29sIGlzIGJlaW5nMCAgZGVzdHJveWVkLlEBKiBgaW5kZXhgIC0gQSBkaXNhbWJpZ3VhdGlvbiBpbmRleCBmb3IgY3JlYXRpbmcgdGhlIGFjY291bnQuIExpa2VseSBvbmx5IHVzZWZ1bCB3aGVuwCAgY3JlYXRpbmcgbXVsdGlwbGUgcG9vbHMgaW4gdGhlIHNhbWUgZXh0cmluc2ljLtQqIGByb290YCAtIFRoZSBhY2NvdW50IHRvIHNldCBhcyBbYFBvb2xSb2xlczo6cm9vdGBdLg0BKiBgbm9taW5hdG9yYCAtIFRoZSBhY2NvdW50IHRvIHNldCBhcyB0aGUgW2BQb29sUm9sZXM6Om5vbWluYXRvcmBdLvwqIGBib3VuY2VyYCAtIFRoZSBhY2NvdW50IHRvIHNldCBhcyB0aGUgW2BQb29sUm9sZXM6OmJvdW5jZXJgXS4AGCMgTm90ZQBhAUluIGFkZGl0aW9uIHRvIGBhbW91bnRgLCB0aGUgY2FsbGVyIHdpbGwgdHJhbnNmZXIgdGhlIGV4aXN0ZW50aWFsIGRlcG9zaXQ7IHNvIHRoZSBjYWxsZXINAW5lZWRzIGF0IGhhdmUgYXQgbGVhc3QgYGFtb3VudCArIGV4aXN0ZW50aWFsX2RlcG9zaXRgIHRyYW5zZmVyYWJsZS5MY3JlYXRlX3dpdGhfcG9vbF9pZBQBGGFtb3VudOQBMEJhbGFuY2VPZjxUPgABEHJvb3SdAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AASRub21pbmF0b3KdAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AARxib3VuY2VynQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEccG9vbF9pZBABGFBvb2xJZAAHGOxDcmVhdGUgYSBuZXcgZGVsZWdhdGlvbiBwb29sIHdpdGggYSBwcmV2aW91c2x5IHVzZWQgcG9vbCBpZAAsIyBBcmd1bWVudHMAmHNhbWUgYXMgYGNyZWF0ZWAgd2l0aCB0aGUgaW5jbHVzaW9uIG9meCogYHBvb2xfaWRgIC0gYEEgdmFsaWQgUG9vbElkLiBub21pbmF0ZQgBHHBvb2xfaWQQARhQb29sSWQAASh2YWxpZGF0b3JzrQEBRFZlYzxUOjpBY2NvdW50SWQ+AAgwfE5vbWluYXRlIG9uIGJlaGFsZiBvZiB0aGUgcG9vbC4ARQFUaGUgZGlzcGF0Y2ggb3JpZ2luIG9mIHRoaXMgY2FsbCBtdXN0IGJlIHNpZ25lZCBieSB0aGUgcG9vbCBub21pbmF0b3Igb3IgdGhlIHBvb2wocm9vdCByb2xlLgBJAVRoaXMgZGlyZWN0bHkgZm9yd2FyZCB0aGUgY2FsbCB0byB0aGUgc3Rha2luZyBwYWxsZXQsIG9uIGJlaGFsZiBvZiB0aGUgcG9vbCBib25kZWQgYWNjb3VudC4AGCMgTm90ZQBdAUluIGFkZGl0aW9uIHRvIGEgYHJvb3RgIG9yIGBub21pbmF0b3JgIHJvbGUgb2YgYG9yaWdpbmAsIHBvb2wncyBkZXBvc2l0b3IgbmVlZHMgdG8gaGF2ZfhhdCBsZWFzdCBgZGVwb3NpdG9yX21pbl9ib25kYCBpbiB0aGUgcG9vbCB0byBzdGFydCBub21pbmF0aW5nLiRzZXRfc3RhdGUIARxwb29sX2lkEAEYUG9vbElkAAEUc3RhdGWJBAEkUG9vbFN0YXRlAAkodFNldCBhIG5ldyBzdGF0ZSBmb3IgdGhlIHBvb2wuAFUBSWYgYSBwb29sIGlzIGFscmVhZHkgaW4gdGhlIGBEZXN0cm95aW5nYCBzdGF0ZSwgdGhlbiB1bmRlciBubyBjb25kaXRpb24gY2FuIGl0cyBzdGF0ZTRjaGFuZ2UgYWdhaW4uAMBUaGUgZGlzcGF0Y2ggb3JpZ2luIG9mIHRoaXMgY2FsbCBtdXN0IGJlIGVpdGhlcjoA3DEuIHNpZ25lZCBieSB0aGUgYm91bmNlciwgb3IgdGhlIHJvb3Qgcm9sZSBvZiB0aGUgcG9vbCxdATIuIGlmIHRoZSBwb29sIGNvbmRpdGlvbnMgdG8gYmUgb3BlbiBhcmUgTk9UIG1ldCAoYXMgZGVzY3JpYmVkIGJ5IGBva190b19iZV9vcGVuYCksIGFuZDkBICAgdGhlbiB0aGUgc3RhdGUgb2YgdGhlIHBvb2wgY2FuIGJlIHBlcm1pc3Npb25sZXNzbHkgY2hhbmdlZCB0byBgRGVzdHJveWluZ2AuMHNldF9tZXRhZGF0YQgBHHBvb2xfaWQQARhQb29sSWQAASBtZXRhZGF0YTgBHFZlYzx1OD4AChCAU2V0IGEgbmV3IG1ldGFkYXRhIGZvciB0aGUgcG9vbC4AXQFUaGUgZGlzcGF0Y2ggb3JpZ2luIG9mIHRoaXMgY2FsbCBtdXN0IGJlIHNpZ25lZCBieSB0aGUgYm91bmNlciwgb3IgdGhlIHJvb3Qgcm9sZSBvZiB0aGUUcG9vbC4sc2V0X2NvbmZpZ3MYATRtaW5fam9pbl9ib25kjQQBWENvbmZpZ09wPEJhbGFuY2VPZjxUPj4AATxtaW5fY3JlYXRlX2JvbmSNBAFYQ29uZmlnT3A8QmFsYW5jZU9mPFQ+PgABJG1heF9wb29sc5EEATRDb25maWdPcDx1MzI+AAEsbWF4X21lbWJlcnORBAE0Q29uZmlnT3A8dTMyPgABUG1heF9tZW1iZXJzX3Blcl9wb29skQQBNENvbmZpZ09wPHUzMj4AAVRnbG9iYWxfbWF4X2NvbW1pc3Npb26VBAFEQ29uZmlnT3A8UGVyYmlsbD4ACyxBAVVwZGF0ZSBjb25maWd1cmF0aW9ucyBmb3IgdGhlIG5vbWluYXRpb24gcG9vbHMuIFRoZSBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlYFtgQ29uZmlnOjpBZG1pbk9yaWdpbmBdLgAsIyBBcmd1bWVudHMAoCogYG1pbl9qb2luX2JvbmRgIC0gU2V0IFtgTWluSm9pbkJvbmRgXS6wKiBgbWluX2NyZWF0ZV9ib25kYCAtIFNldCBbYE1pbkNyZWF0ZUJvbmRgXS6EKiBgbWF4X3Bvb2xzYCAtIFNldCBbYE1heFBvb2xzYF0upCogYG1heF9tZW1iZXJzYCAtIFNldCBbYE1heFBvb2xNZW1iZXJzYF0u5CogYG1heF9tZW1iZXJzX3Blcl9wb29sYCAtIFNldCBbYE1heFBvb2xNZW1iZXJzUGVyUG9vbGBdLuAqIGBnbG9iYWxfbWF4X2NvbW1pc3Npb25gIC0gU2V0IFtgR2xvYmFsTWF4Q29tbWlzc2lvbmBdLjB1cGRhdGVfcm9sZXMQARxwb29sX2lkEAEYUG9vbElkAAEgbmV3X3Jvb3SZBAFYQ29uZmlnT3A8VDo6QWNjb3VudElkPgABNG5ld19ub21pbmF0b3KZBAFYQ29uZmlnT3A8VDo6QWNjb3VudElkPgABLG5ld19ib3VuY2VymQQBWENvbmZpZ09wPFQ6OkFjY291bnRJZD4ADBx0VXBkYXRlIHRoZSByb2xlcyBvZiB0aGUgcG9vbC4APQFUaGUgcm9vdCBpcyB0aGUgb25seSBlbnRpdHkgdGhhdCBjYW4gY2hhbmdlIGFueSBvZiB0aGUgcm9sZXMsIGluY2x1ZGluZyBpdHNlbGYsuGV4Y2x1ZGluZyB0aGUgZGVwb3NpdG9yLCB3aG8gY2FuIG5ldmVyIGNoYW5nZS4AUQFJdCBlbWl0cyBhbiBldmVudCwgbm90aWZ5aW5nIFVJcyBvZiB0aGUgcm9sZSBjaGFuZ2UuIFRoaXMgZXZlbnQgaXMgcXVpdGUgcmVsZXZhbnQgdG8dAW1vc3QgcG9vbCBtZW1iZXJzIGFuZCB0aGV5IHNob3VsZCBiZSBpbmZvcm1lZCBvZiBjaGFuZ2VzIHRvIHBvb2wgcm9sZXMuFGNoaWxsBAEccG9vbF9pZBABGFBvb2xJZAANQHBDaGlsbCBvbiBiZWhhbGYgb2YgdGhlIHBvb2wuAEEBVGhlIGRpc3BhdGNoIG9yaWdpbiBvZiB0aGlzIGNhbGwgY2FuIGJlIHNpZ25lZCBieSB0aGUgcG9vbCBub21pbmF0b3Igb3IgdGhlIHBvb2ygcm9vdCByb2xlLCBzYW1lIGFzIFtgUGFsbGV0Ojpub21pbmF0ZWBdLgBNAVVuZGVyIGNlcnRhaW4gY29uZGl0aW9ucywgdGhpcyBjYWxsIGNhbiBiZSBkaXNwYXRjaGVkIHBlcm1pc3Npb25sZXNzbHkgKGkuZS4gYnkgYW55JGFjY291bnQpLgCsIyBDb25kaXRpb25zIGZvciBhIHBlcm1pc3Npb25sZXNzIGRpc3BhdGNoOlkBKiBXaGVuIHBvb2wgZGVwb3NpdG9yIGhhcyBsZXNzIHRoYW4gYE1pbk5vbWluYXRvckJvbmRgIHN0YWtlZCwgb3RoZXJ3aXNlICBwb29sIG1lbWJlcnNcICBhcmUgdW5hYmxlIHRvIHVuYm9uZC4AnCMgQ29uZGl0aW9ucyBmb3IgcGVybWlzc2lvbmVkIGRpc3BhdGNoOtgqIFRoZSBjYWxsZXIgaGFzIGEgbm9taW5hdG9yIG9yIHJvb3Qgcm9sZSBvZiB0aGUgcG9vbC5JAVRoaXMgZGlyZWN0bHkgZm9yd2FyZCB0aGUgY2FsbCB0byB0aGUgc3Rha2luZyBwYWxsZXQsIG9uIGJlaGFsZiBvZiB0aGUgcG9vbCBib25kZWQgYWNjb3VudC5AYm9uZF9leHRyYV9vdGhlcggBGG1lbWJlcp0BAVBBY2NvdW50SWRMb29rdXBPZjxUPgABFGV4dHJhhQQBXEJvbmRFeHRyYTxCYWxhbmNlT2Y8VD4+AA4kVQFgb3JpZ2luYCBib25kcyBmdW5kcyBmcm9tIGBleHRyYWAgZm9yIHNvbWUgcG9vbCBtZW1iZXIgYG1lbWJlcmAgaW50byB0aGVpciByZXNwZWN0aXZlGHBvb2xzLgBJAWBvcmlnaW5gIGNhbiBib25kIGV4dHJhIGZ1bmRzIGZyb20gZnJlZSBiYWxhbmNlIG9yIHBlbmRpbmcgcmV3YXJkcyB3aGVuIGBvcmlnaW4gPT0cb3RoZXJgLgBFAUluIHRoZSBjYXNlIG9mIGBvcmlnaW4gIT0gb3RoZXJgLCBgb3JpZ2luYCBjYW4gb25seSBib25kIGV4dHJhIHBlbmRpbmcgcmV3YXJkcyBvZhUBYG90aGVyYCBtZW1iZXJzIGFzc3VtaW5nIHNldF9jbGFpbV9wZXJtaXNzaW9uIGZvciB0aGUgZ2l2ZW4gbWVtYmVyIGlzwGBQZXJtaXNzaW9ubGVzc0NvbXBvdW5kYCBvciBgUGVybWlzc2lvbmxlc3NBbGxgLlBzZXRfY2xhaW1fcGVybWlzc2lvbgQBKHBlcm1pc3Npb26dBAE8Q2xhaW1QZXJtaXNzaW9uAA8cSQFBbGxvd3MgYSBwb29sIG1lbWJlciB0byBzZXQgYSBjbGFpbSBwZXJtaXNzaW9uIHRvIGFsbG93IG9yIGRpc2FsbG93IHBlcm1pc3Npb25sZXNzYGJvbmRpbmcgYW5kIHdpdGhkcmF3aW5nLgAsIyBBcmd1bWVudHMAeCogYG9yaWdpbmAgLSBNZW1iZXIgb2YgYSBwb29sLrgqIGBwZXJtaXNzaW9uYCAtIFRoZSBwZXJtaXNzaW9uIHRvIGJlIGFwcGxpZWQuSGNsYWltX3BheW91dF9vdGhlcgQBFG90aGVyAAEwVDo6QWNjb3VudElkABAQAQFgb3JpZ2luYCBjYW4gY2xhaW0gcGF5b3V0cyBvbiBzb21lIHBvb2wgbWVtYmVyIGBvdGhlcmAncyBiZWhhbGYuAFUBUG9vbCBtZW1iZXIgYG90aGVyYCBtdXN0IGhhdmUgYSBgUGVybWlzc2lvbmxlc3NXaXRoZHJhd2Agb3IgYFBlcm1pc3Npb25sZXNzQWxsYCBjbGFpbahwZXJtaXNzaW9uIGZvciB0aGlzIGNhbGwgdG8gYmUgc3VjY2Vzc2Z1bC44c2V0X2NvbW1pc3Npb24IARxwb29sX2lkEAEYUG9vbElkAAE4bmV3X2NvbW1pc3Npb26hBAF8T3B0aW9uPChQZXJiaWxsLCBUOjpBY2NvdW50SWQpPgARFHRTZXQgdGhlIGNvbW1pc3Npb24gb2YgYSBwb29sLlUBQm90aCBhIGNvbW1pc3Npb24gcGVyY2VudGFnZSBhbmQgYSBjb21taXNzaW9uIHBheWVlIG11c3QgYmUgcHJvdmlkZWQgaW4gdGhlIGBjdXJyZW50YF0BdHVwbGUuIFdoZXJlIGEgYGN1cnJlbnRgIG9mIGBOb25lYCBpcyBwcm92aWRlZCwgYW55IGN1cnJlbnQgY29tbWlzc2lvbiB3aWxsIGJlIHJlbW92ZWQuAE0BLSBJZiBhIGBOb25lYCBpcyBzdXBwbGllZCB0byBgbmV3X2NvbW1pc3Npb25gLCBleGlzdGluZyBjb21taXNzaW9uIHdpbGwgYmUgcmVtb3ZlZC5Ic2V0X2NvbW1pc3Npb25fbWF4CAEccG9vbF9pZBABGFBvb2xJZAABOG1heF9jb21taXNzaW9ulAEcUGVyYmlsbAASFJRTZXQgdGhlIG1heGltdW0gY29tbWlzc2lvbiBvZiBhIHBvb2wuADkBLSBJbml0aWFsIG1heCBjYW4gYmUgc2V0IHRvIGFueSBgUGVyYmlsbGAsIGFuZCBvbmx5IHNtYWxsZXIgdmFsdWVzIHRoZXJlYWZ0ZXIuNQEtIEN1cnJlbnQgY29tbWlzc2lvbiB3aWxsIGJlIGxvd2VyZWQgaW4gdGhlIGV2ZW50IGl0IGlzIGhpZ2hlciB0aGFuIGEgbmV3IG1heDQgIGNvbW1pc3Npb24uaHNldF9jb21taXNzaW9uX2NoYW5nZV9yYXRlCAEccG9vbF9pZBABGFBvb2xJZAABLGNoYW5nZV9yYXRlqQQBnENvbW1pc3Npb25DaGFuZ2VSYXRlPEJsb2NrTnVtYmVyRm9yPFQ+PgATEKhTZXQgdGhlIGNvbW1pc3Npb24gY2hhbmdlIHJhdGUgZm9yIGEgcG9vbC4APQFJbml0aWFsIGNoYW5nZSByYXRlIGlzIG5vdCBib3VuZGVkLCB3aGVyZWFzIHN1YnNlcXVlbnQgdXBkYXRlcyBjYW4gb25seSBiZSBtb3JldHJlc3RyaWN0aXZlIHRoYW4gdGhlIGN1cnJlbnQuQGNsYWltX2NvbW1pc3Npb24EARxwb29sX2lkEAEYUG9vbElkABQUZENsYWltIHBlbmRpbmcgY29tbWlzc2lvbi4AXQFUaGUgZGlzcGF0Y2ggb3JpZ2luIG9mIHRoaXMgY2FsbCBtdXN0IGJlIHNpZ25lZCBieSB0aGUgYHJvb3RgIHJvbGUgb2YgdGhlIHBvb2wuIFBlbmRpbmddAWNvbW1pc3Npb24gaXMgcGFpZCBvdXQgYW5kIGFkZGVkIHRvIHRvdGFsIGNsYWltZWQgY29tbWlzc2lvbmAuIFRvdGFsIHBlbmRpbmcgY29tbWlzc2lvbnhpcyByZXNldCB0byB6ZXJvLiB0aGUgY3VycmVudC5MYWRqdXN0X3Bvb2xfZGVwb3NpdAQBHHBvb2xfaWQQARhQb29sSWQAFRzsVG9wIHVwIHRoZSBkZWZpY2l0IG9yIHdpdGhkcmF3IHRoZSBleGNlc3MgRUQgZnJvbSB0aGUgcG9vbC4AUQFXaGVuIGEgcG9vbCBpcyBjcmVhdGVkLCB0aGUgcG9vbCBkZXBvc2l0b3IgdHJhbnNmZXJzIEVEIHRvIHRoZSByZXdhcmQgYWNjb3VudCBvZiB0aGVVAXBvb2wuIEVEIGlzIHN1YmplY3QgdG8gY2hhbmdlIGFuZCBvdmVyIHRpbWUsIHRoZSBkZXBvc2l0IGluIHRoZSByZXdhcmQgYWNjb3VudCBtYXkgYmVRAWluc3VmZmljaWVudCB0byBjb3ZlciB0aGUgRUQgZGVmaWNpdCBvZiB0aGUgcG9vbCBvciB2aWNlLXZlcnNhIHdoZXJlIHRoZXJlIGlzIGV4Y2VzczEBZGVwb3NpdCB0byB0aGUgcG9vbC4gVGhpcyBjYWxsIGFsbG93cyBhbnlvbmUgdG8gYWRqdXN0IHRoZSBFRCBkZXBvc2l0IG9mIHRoZfRwb29sIGJ5IGVpdGhlciB0b3BwaW5nIHVwIHRoZSBkZWZpY2l0IG9yIGNsYWltaW5nIHRoZSBleGNlc3MufHNldF9jb21taXNzaW9uX2NsYWltX3Blcm1pc3Npb24IARxwb29sX2lkEAEYUG9vbElkAAEocGVybWlzc2lvbq0EAbxPcHRpb248Q29tbWlzc2lvbkNsYWltUGVybWlzc2lvbjxUOjpBY2NvdW50SWQ+PgAWEMxTZXQgb3IgcmVtb3ZlIGEgcG9vbCdzIGNvbW1pc3Npb24gY2xhaW0gcGVybWlzc2lvbi4AYQFEZXRlcm1pbmVzIHdobyBjYW4gY2xhaW0gdGhlIHBvb2wncyBwZW5kaW5nIGNvbW1pc3Npb24uIE9ubHkgdGhlIGBSb290YCByb2xlIG9mIHRoZSBwb29syGlzIGFibGUgdG8gY29uZmlndXJlIGNvbW1pc3Npb24gY2xhaW0gcGVybWlzc2lvbnMuLGFwcGx5X3NsYXNoBAE4bWVtYmVyX2FjY291bnSdAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AFxyIQXBwbHkgYSBwZW5kaW5nIHNsYXNoIG9uIGEgbWVtYmVyLgAlAUZhaWxzIHVubGVzcyBbYGNyYXRlOjpwYWxsZXQ6OkNvbmZpZzo6U3Rha2VBZGFwdGVyYF0gaXMgb2Ygc3RyYXRlZ3kgdHlwZTqkW2BhZGFwdGVyOjpTdGFrZVN0cmF0ZWd5VHlwZTo6RGVsZWdhdGVgXS4AVQFUaGlzIGNhbGwgY2FuIGJlIGRpc3BhdGNoZWQgcGVybWlzc2lvbmxlc3NseSAoaS5lLiBieSBhbnkgYWNjb3VudCkuIElmIHRoZSBtZW1iZXIgaGFzHQFzbGFzaCB0byBiZSBhcHBsaWVkLCBjYWxsZXIgbWF5IGJlIHJld2FyZGVkIHdpdGggdGhlIHBhcnQgb2YgdGhlIHNsYXNoLkhtaWdyYXRlX2RlbGVnYXRpb24EAThtZW1iZXJfYWNjb3VudJ0BAVBBY2NvdW50SWRMb29rdXBPZjxUPgAYJB0BTWlncmF0ZXMgZGVsZWdhdGVkIGZ1bmRzIGZyb20gdGhlIHBvb2wgYWNjb3VudCB0byB0aGUgYG1lbWJlcl9hY2NvdW50YC4AJQFGYWlscyB1bmxlc3MgW2BjcmF0ZTo6cGFsbGV0OjpDb25maWc6OlN0YWtlQWRhcHRlcmBdIGlzIG9mIHN0cmF0ZWd5IHR5cGU6pFtgYWRhcHRlcjo6U3Rha2VTdHJhdGVneVR5cGU6OkRlbGVnYXRlYF0uACkBVGhpcyBpcyBhIHBlcm1pc3Npb24tbGVzcyBjYWxsIGFuZCByZWZ1bmRzIGFueSBmZWUgaWYgY2xhaW0gaXMgc3VjY2Vzc2Z1bC4AXQFJZiB0aGUgcG9vbCBoYXMgbWlncmF0ZWQgdG8gZGVsZWdhdGlvbiBiYXNlZCBzdGFraW5nLCB0aGUgc3Rha2VkIHRva2VucyBvZiBwb29sIG1lbWJlcnMpAWNhbiBiZSBtb3ZlZCBhbmQgaGVsZCBpbiB0aGVpciBvd24gYWNjb3VudC4gU2VlIFtgYWRhcHRlcjo6RGVsZWdhdGVTdGFrZWBdeG1pZ3JhdGVfcG9vbF90b19kZWxlZ2F0ZV9zdGFrZQQBHHBvb2xfaWQQARhQb29sSWQAGST0TWlncmF0ZSBwb29sIGZyb20gW2BhZGFwdGVyOjpTdGFrZVN0cmF0ZWd5VHlwZTo6VHJhbnNmZXJgXSB0b6RbYGFkYXB0ZXI6OlN0YWtlU3RyYXRlZ3lUeXBlOjpEZWxlZ2F0ZWBdLgAlAUZhaWxzIHVubGVzcyBbYGNyYXRlOjpwYWxsZXQ6OkNvbmZpZzo6U3Rha2VBZGFwdGVyYF0gaXMgb2Ygc3RyYXRlZ3kgdHlwZTqkW2BhZGFwdGVyOjpTdGFrZVN0cmF0ZWd5VHlwZTo6RGVsZWdhdGVgXS4AQQFUaGlzIGNhbGwgY2FuIGJlIGRpc3BhdGNoZWQgcGVybWlzc2lvbmxlc3NseSwgYW5kIHJlZnVuZHMgYW55IGZlZSBpZiBzdWNjZXNzZnVsLgBJAUlmIHRoZSBwb29sIGhhcyBhbHJlYWR5IG1pZ3JhdGVkIHRvIGRlbGVnYXRpb24gYmFzZWQgc3Rha2luZywgdGhpcyBjYWxsIHdpbGwgZmFpbC4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMuhQQIXHBhbGxldF9ub21pbmF0aW9uX3Bvb2xzJEJvbmRFeHRyYQQcQmFsYW5jZQEYAQgsRnJlZUJhbGFuY2UEABgBHEJhbGFuY2UAAAAcUmV3YXJkcwABAACJBAhccGFsbGV0X25vbWluYXRpb25fcG9vbHMkUG9vbFN0YXRlAAEMEE9wZW4AAAAcQmxvY2tlZAABAChEZXN0cm95aW5nAAIAAI0ECFxwYWxsZXRfbm9taW5hdGlvbl9wb29scyBDb25maWdPcAQEVAEYAQwQTm9vcAAAAAxTZXQEABgBBFQAAQAYUmVtb3ZlAAIAAJEECFxwYWxsZXRfbm9taW5hdGlvbl9wb29scyBDb25maWdPcAQEVAEQAQwQTm9vcAAAAAxTZXQEABABBFQAAQAYUmVtb3ZlAAIAAJUECFxwYWxsZXRfbm9taW5hdGlvbl9wb29scyBDb25maWdPcAQEVAGUAQwQTm9vcAAAAAxTZXQEAJQBBFQAAQAYUmVtb3ZlAAIAAJkECFxwYWxsZXRfbm9taW5hdGlvbl9wb29scyBDb25maWdPcAQEVAEAAQwQTm9vcAAAAAxTZXQEAAABBFQAAQAYUmVtb3ZlAAIAAJ0ECFxwYWxsZXRfbm9taW5hdGlvbl9wb29sczxDbGFpbVBlcm1pc3Npb24AARAwUGVybWlzc2lvbmVkAAAAWFBlcm1pc3Npb25sZXNzQ29tcG91bmQAAQBYUGVybWlzc2lvbmxlc3NXaXRoZHJhdwACAERQZXJtaXNzaW9ubGVzc0FsbAADAAChBAQYT3B0aW9uBARUAaUEAQgQTm9uZQAAABBTb21lBAClBAAAAQAApQQAAAQIlAAAqQQIXHBhbGxldF9ub21pbmF0aW9uX3Bvb2xzUENvbW1pc3Npb25DaGFuZ2VSYXRlBCxCbG9ja051bWJlcgEQAAgBMG1heF9pbmNyZWFzZZQBHFBlcmJpbGwAASRtaW5fZGVsYXkQASxCbG9ja051bWJlcgAArQQEGE9wdGlvbgQEVAGxBAEIEE5vbmUAAAAQU29tZQQAsQQAAAEAALEECFxwYWxsZXRfbm9taW5hdGlvbl9wb29sc2RDb21taXNzaW9uQ2xhaW1QZXJtaXNzaW9uBCRBY2NvdW50SWQBAAEIOFBlcm1pc3Npb25sZXNzAAAAHEFjY291bnQEAAABJEFjY291bnRJZAABAAC1BAxMcGFsbGV0X2Zhc3RfdW5zdGFrZRhwYWxsZXQQQ2FsbAQEVAABDFRyZWdpc3Rlcl9mYXN0X3Vuc3Rha2UAAGiIUmVnaXN0ZXIgb25lc2VsZiBmb3IgZmFzdC11bnN0YWtlLgBIIyMgRGlzcGF0Y2ggT3JpZ2luAEUBVGhlIGRpc3BhdGNoIG9yaWdpbiBvZiB0aGlzIGNhbGwgbXVzdCBiZSAqc2lnbmVkKiBieSB3aG9ldmVyIGlzIHBlcm1pdHRlZCB0byBjYWxs8HVuYm9uZCBmdW5kcyBieSB0aGUgc3Rha2luZyBzeXN0ZW0uIFNlZSBbYENvbmZpZzo6U3Rha2luZ2BdLgAoIyMgRGV0YWlscwA5AVRoZSBzdGFzaCBhc3NvY2lhdGVkIHdpdGggdGhlIG9yaWdpbiBtdXN0IGhhdmUgbm8gb25nb2luZyB1bmxvY2tpbmcgY2h1bmtzLiBJZl0Bc3VjY2Vzc2Z1bCwgdGhpcyB3aWxsIGZ1bGx5IHVuYm9uZCBhbmQgY2hpbGwgdGhlIHN0YXNoLiBUaGVuLCBpdCB3aWxsIGVucXVldWUgdGhlIHN0YXNogHRvIGJlIGNoZWNrZWQgaW4gZnVydGhlciBibG9ja3MuAFEBSWYgYnkgdGhlIHRpbWUgdGhpcyBpcyBjYWxsZWQsIHRoZSBzdGFzaCBpcyBhY3R1YWxseSBlbGlnaWJsZSBmb3IgZmFzdC11bnN0YWtlLCB0aGVuRQF0aGV5IGFyZSBndWFyYW50ZWVkIHRvIHJlbWFpbiBlbGlnaWJsZSwgYmVjYXVzZSB0aGUgY2FsbCB3aWxsIGNoaWxsIHRoZW0gYXMgd2VsbC4APQFJZiB0aGUgY2hlY2sgd29ya3MsIHRoZSBlbnRpcmUgc3Rha2luZyBkYXRhIGlzIHJlbW92ZWQsIGkuZS4gdGhlIHN0YXNoIGlzIGZ1bGx5JHVuc3Rha2VkLgBdAUlmIHRoZSBjaGVjayBmYWlscywgdGhlIHN0YXNoIHJlbWFpbnMgY2hpbGxlZCBhbmQgd2FpdGluZyBmb3IgYmVpbmcgdW5ib25kZWQgYXMgaW4gd2l0aGEBdGhlIG5vcm1hbCBzdGFraW5nIHN5c3RlbSwgYnV0IHRoZXkgbG9zZSBwYXJ0IG9mIHRoZWlyIHVuYm9uZGluZyBjaHVua3MgZHVlIHRvIGNvbnN1bWluZ1h0aGUgY2hhaW4ncyByZXNvdXJjZXMuACQjIyBFdmVudHMACQFTb21lIGV2ZW50cyBmcm9tIHRoZSBzdGFraW5nIGFuZCBjdXJyZW5jeSBzeXN0ZW0gbWlnaHQgYmUgZW1pdHRlZC4oZGVyZWdpc3RlcgABSKREZXJlZ2lzdGVyIG9uZXNlbGYgZnJvbSB0aGUgZmFzdC11bnN0YWtlLgBIIyMgRGlzcGF0Y2ggT3JpZ2luAEUBVGhlIGRpc3BhdGNoIG9yaWdpbiBvZiB0aGlzIGNhbGwgbXVzdCBiZSAqc2lnbmVkKiBieSB3aG9ldmVyIGlzIHBlcm1pdHRlZCB0byBjYWxs8HVuYm9uZCBmdW5kcyBieSB0aGUgc3Rha2luZyBzeXN0ZW0uIFNlZSBbYENvbmZpZzo6U3Rha2luZ2BdLgAoIyMgRGV0YWlscwBhAVRoaXMgaXMgdXNlZnVsIGlmIG9uZSBpcyByZWdpc3RlcmVkLCB0aGV5IGFyZSBzdGlsbCB3YWl0aW5nLCBhbmQgdGhleSBjaGFuZ2UgdGhlaXIgbWluZC4AWQFOb3RlIHRoYXQgdGhlIGFzc29jaWF0ZWQgc3Rhc2ggaXMgc3RpbGwgZnVsbHkgdW5ib25kZWQgYW5kIGNoaWxsZWQgYXMgYSBjb25zZXF1ZW5jZSBvZlkBY2FsbGluZyBbYFBhbGxldDo6cmVnaXN0ZXJfZmFzdF91bnN0YWtlYF0uIFRoZXJlZm9yZSwgdGhpcyBzaG91bGQgcHJvYmFibHkgYmUgZm9sbG93ZWSwYnkgYSBjYWxsIHRvIGByZWJvbmRgIGluIHRoZSBzdGFraW5nIHN5c3RlbS4AJCMjIEV2ZW50cwAJAVNvbWUgZXZlbnRzIGZyb20gdGhlIHN0YWtpbmcgYW5kIGN1cnJlbmN5IHN5c3RlbSBtaWdodCBiZSBlbWl0dGVkLhxjb250cm9sBAE0ZXJhc190b19jaGVjaxABIEVyYUluZGV4AAI0lENvbnRyb2wgdGhlIG9wZXJhdGlvbiBvZiB0aGlzIHBhbGxldC4ASCMjIERpc3BhdGNoIE9yaWdpbgANAVRoZSBkaXNwYXRjaCBvcmlnaW4gb2YgdGhpcyBjYWxsIG11c3QgYmUgW2BDb25maWc6OkNvbnRyb2xPcmlnaW5gXS4AKCMjIERldGFpbHMAQQFDYW4gc2V0IHRoZSBudW1iZXIgb2YgZXJhcyB0byBjaGVjayBwZXIgYmxvY2ssIGFuZCBwb3RlbnRpYWxseSBvdGhlciBhZG1pbiB3b3JrLgAkIyMgRXZlbnRzAKRObyBldmVudHMgYXJlIGVtaXR0ZWQgZnJvbSB0aGlzIGRpc3BhdGNoLgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy65BBBscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zNGNvbmZpZ3VyYXRpb24YcGFsbGV0EENhbGwEBFQAAcB8c2V0X3ZhbGlkYXRpb25fdXBncmFkZV9jb29sZG93bgQBDG5ldxABREJsb2NrTnVtYmVyRm9yPFQ+AAAEkFNldCB0aGUgdmFsaWRhdGlvbiB1cGdyYWRlIGNvb2xkb3duLnBzZXRfdmFsaWRhdGlvbl91cGdyYWRlX2RlbGF5BAEMbmV3EAFEQmxvY2tOdW1iZXJGb3I8VD4AAQSEU2V0IHRoZSB2YWxpZGF0aW9uIHVwZ3JhZGUgZGVsYXkuZHNldF9jb2RlX3JldGVudGlvbl9wZXJpb2QEAQxuZXcQAURCbG9ja051bWJlckZvcjxUPgACBNBTZXQgdGhlIGFjY2VwdGFuY2UgcGVyaW9kIGZvciBhbiBpbmNsdWRlZCBjYW5kaWRhdGUuRHNldF9tYXhfY29kZV9zaXplBAEMbmV3EAEMdTMyAAME3FNldCB0aGUgbWF4IHZhbGlkYXRpb24gY29kZSBzaXplIGZvciBpbmNvbWluZyB1cGdyYWRlcy5Ac2V0X21heF9wb3Zfc2l6ZQQBDG5ldxABDHUzMgAEBMRTZXQgdGhlIG1heCBQT1YgYmxvY2sgc2l6ZSBmb3IgaW5jb21pbmcgdXBncmFkZXMuWHNldF9tYXhfaGVhZF9kYXRhX3NpemUEAQxuZXcQAQx1MzIABQSUU2V0IHRoZSBtYXggaGVhZCBkYXRhIHNpemUgZm9yIHBhcmFzLkhzZXRfY29yZXRpbWVfY29yZXMEAQxuZXcQAQx1MzIABhCsU2V0IHRoZSBudW1iZXIgb2YgY29yZXRpbWUgZXhlY3V0aW9uIGNvcmVzLgBRAU5PVEU6IHRoYXQgdGhpcyBjb25maWd1cmF0aW9uIGlzIG1hbmFnZWQgYnkgdGhlIGNvcmV0aW1lIGNoYWluLiBPbmx5IG1hbnVhbGx5IGNoYW5nZbB0aGlzLCBpZiB5b3UgcmVhbGx5IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nIXRzZXRfbWF4X2F2YWlsYWJpbGl0eV90aW1lb3V0cwQBDG5ldxABDHUzMgAHBEEBU2V0IHRoZSBtYXggbnVtYmVyIG9mIHRpbWVzIGEgY2xhaW0gbWF5IHRpbWVvdXQgb24gYSBjb3JlIGJlZm9yZSBpdCBpcyBhYmFuZG9uZWRwc2V0X2dyb3VwX3JvdGF0aW9uX2ZyZXF1ZW5jeQQBDG5ldxABREJsb2NrTnVtYmVyRm9yPFQ+AAgE0FNldCB0aGUgcGFyYWNoYWluIHZhbGlkYXRvci1ncm91cCByb3RhdGlvbiBmcmVxdWVuY3l0c2V0X3BhcmFzX2F2YWlsYWJpbGl0eV9wZXJpb2QEAQxuZXcQAURCbG9ja051bWJlckZvcjxUPgAJBJhTZXQgdGhlIGF2YWlsYWJpbGl0eSBwZXJpb2QgZm9yIHBhcmFzLmBzZXRfc2NoZWR1bGluZ19sb29rYWhlYWQEAQxuZXcQAQx1MzIACwQ5AVNldCB0aGUgc2NoZWR1bGluZyBsb29rYWhlYWQsIGluIGV4cGVjdGVkIG51bWJlciBvZiBibG9ja3MgYXQgcGVhayB0aHJvdWdocHV0LmxzZXRfbWF4X3ZhbGlkYXRvcnNfcGVyX2NvcmUEAQxuZXc9AgEsT3B0aW9uPHUzMj4ADATsU2V0IHRoZSBtYXhpbXVtIG51bWJlciBvZiB2YWxpZGF0b3JzIHRvIGFzc2lnbiB0byBhbnkgY29yZS5Ic2V0X21heF92YWxpZGF0b3JzBAEMbmV3PQIBLE9wdGlvbjx1MzI+AA0EDQFTZXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIHZhbGlkYXRvcnMgdG8gdXNlIGluIHBhcmFjaGFpbiBjb25zZW5zdXMuSHNldF9kaXNwdXRlX3BlcmlvZAQBDG5ldxABMFNlc3Npb25JbmRleAAOBA0BU2V0IHRoZSBkaXNwdXRlIHBlcmlvZCwgaW4gbnVtYmVyIG9mIHNlc3Npb25zIHRvIGtlZXAgZm9yIGRpc3B1dGVzLrRzZXRfZGlzcHV0ZV9wb3N0X2NvbmNsdXNpb25fYWNjZXB0YW5jZV9wZXJpb2QEAQxuZXcQAURCbG9ja051bWJlckZvcjxUPgAPBMhTZXQgdGhlIGRpc3B1dGUgcG9zdCBjb25jbHVzaW9uIGFjY2VwdGFuY2UgcGVyaW9kLkRzZXRfbm9fc2hvd19zbG90cwQBDG5ldxABDHUzMgASCPhTZXQgdGhlIG5vIHNob3cgc2xvdHMsIGluIG51bWJlciBvZiBudW1iZXIgb2YgY29uc2Vuc3VzIHNsb3RzLkxNdXN0IGJlIGF0IGxlYXN0IDEuUHNldF9uX2RlbGF5X3RyYW5jaGVzBAEMbmV3EAEMdTMyABMEnFNldCB0aGUgdG90YWwgbnVtYmVyIG9mIGRlbGF5IHRyYW5jaGVzLnhzZXRfemVyb3RoX2RlbGF5X3RyYW5jaGVfd2lkdGgEAQxuZXcQAQx1MzIAFASMU2V0IHRoZSB6ZXJvdGggZGVsYXkgdHJhbmNoZSB3aWR0aC5Qc2V0X25lZWRlZF9hcHByb3ZhbHMEAQxuZXcQAQx1MzIAFQTcU2V0IHRoZSBudW1iZXIgb2YgdmFsaWRhdG9ycyBuZWVkZWQgdG8gYXBwcm92ZSBhIGJsb2NrLnBzZXRfcmVsYXlfdnJmX21vZHVsb19zYW1wbGVzBAEMbmV3EAEMdTMyABYEWQFTZXQgdGhlIG51bWJlciBvZiBzYW1wbGVzIHRvIGRvIG9mIHRoZSBgUmVsYXlWUkZNb2R1bG9gIGFwcHJvdmFsIGFzc2lnbm1lbnQgY3JpdGVyaW9uLmhzZXRfbWF4X3Vwd2FyZF9xdWV1ZV9jb3VudAQBDG5ldxABDHUzMgAXBC0BU2V0cyB0aGUgbWF4aW11bSBpdGVtcyB0aGF0IGNhbiBwcmVzZW50IGluIGEgdXB3YXJkIGRpc3BhdGNoIHF1ZXVlIGF0IG9uY2UuZHNldF9tYXhfdXB3YXJkX3F1ZXVlX3NpemUEAQxuZXcQAQx1MzIAGAhNAVNldHMgdGhlIG1heGltdW0gdG90YWwgc2l6ZSBvZiBpdGVtcyB0aGF0IGNhbiBwcmVzZW50IGluIGEgdXB3YXJkIGRpc3BhdGNoIHF1ZXVlIGF0FG9uY2UudHNldF9tYXhfZG93bndhcmRfbWVzc2FnZV9zaXplBAEMbmV3EAEMdTMyABkEnFNldCB0aGUgY3JpdGljYWwgZG93bndhcmQgbWVzc2FnZSBzaXplLmxzZXRfbWF4X3Vwd2FyZF9tZXNzYWdlX3NpemUEAQxuZXcQAQx1MzIAGwQtAVNldHMgdGhlIG1heGltdW0gc2l6ZSBvZiBhbiB1cHdhcmQgbWVzc2FnZSB0aGF0IGNhbiBiZSBzZW50IGJ5IGEgY2FuZGlkYXRlLqBzZXRfbWF4X3Vwd2FyZF9tZXNzYWdlX251bV9wZXJfY2FuZGlkYXRlBAEMbmV3EAEMdTMyABwEBQFTZXRzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBtZXNzYWdlcyB0aGF0IGEgY2FuZGlkYXRlIGNhbiBjb250YWluLmRzZXRfaHJtcF9vcGVuX3JlcXVlc3RfdHRsBAEMbmV3EAEMdTMyAB0ENQFTZXRzIHRoZSBudW1iZXIgb2Ygc2Vzc2lvbnMgYWZ0ZXIgd2hpY2ggYW4gSFJNUCBvcGVuIGNoYW5uZWwgcmVxdWVzdCBleHBpcmVzLlxzZXRfaHJtcF9zZW5kZXJfZGVwb3NpdAQBDG5ldxgBHEJhbGFuY2UAHgRRAVNldHMgdGhlIGFtb3VudCBvZiBmdW5kcyB0aGF0IHRoZSBzZW5kZXIgc2hvdWxkIHByb3ZpZGUgZm9yIG9wZW5pbmcgYW4gSFJNUCBjaGFubmVsLmhzZXRfaHJtcF9yZWNpcGllbnRfZGVwb3NpdAQBDG5ldxgBHEJhbGFuY2UAHwhhAVNldHMgdGhlIGFtb3VudCBvZiBmdW5kcyB0aGF0IHRoZSByZWNpcGllbnQgc2hvdWxkIHByb3ZpZGUgZm9yIGFjY2VwdGluZyBvcGVuaW5nIGFuIEhSTVAgY2hhbm5lbC50c2V0X2hybXBfY2hhbm5lbF9tYXhfY2FwYWNpdHkEAQxuZXcQAQx1MzIAIAQdAVNldHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIG1lc3NhZ2VzIGFsbG93ZWQgaW4gYW4gSFJNUCBjaGFubmVsIGF0IG9uY2UufHNldF9ocm1wX2NoYW5uZWxfbWF4X3RvdGFsX3NpemUEAQxuZXcQAQx1MzIAIQRRAVNldHMgdGhlIG1heGltdW0gdG90YWwgc2l6ZSBvZiBtZXNzYWdlcyBpbiBieXRlcyBhbGxvd2VkIGluIGFuIEhSTVAgY2hhbm5lbCBhdCBvbmNlLpxzZXRfaHJtcF9tYXhfcGFyYWNoYWluX2luYm91bmRfY2hhbm5lbHMEAQxuZXcQAQx1MzIAIgRJAVNldHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGluYm91bmQgSFJNUCBjaGFubmVscyBhIHBhcmFjaGFpbiBpcyBhbGxvd2VkIHRvIGFjY2VwdC6Ec2V0X2hybXBfY2hhbm5lbF9tYXhfbWVzc2FnZV9zaXplBAEMbmV3EAEMdTMyACQEPQFTZXRzIHRoZSBtYXhpbXVtIHNpemUgb2YgYSBtZXNzYWdlIHRoYXQgY291bGQgZXZlciBiZSBwdXQgaW50byBhbiBIUk1QIGNoYW5uZWwuoHNldF9ocm1wX21heF9wYXJhY2hhaW5fb3V0Ym91bmRfY2hhbm5lbHMEAQxuZXcQAQx1MzIAJQRFAVNldHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIG91dGJvdW5kIEhSTVAgY2hhbm5lbHMgYSBwYXJhY2hhaW4gaXMgYWxsb3dlZCB0byBvcGVuLphzZXRfaHJtcF9tYXhfbWVzc2FnZV9udW1fcGVyX2NhbmRpZGF0ZQQBDG5ldxABDHUzMgAnBDUBU2V0cyB0aGUgbWF4aW11bSBudW1iZXIgb2Ygb3V0Ym91bmQgSFJNUCBtZXNzYWdlcyBjYW4gYmUgc2VudCBieSBhIGNhbmRpZGF0ZS5Ic2V0X3B2Zl92b3RpbmdfdHRsBAEMbmV3EAEwU2Vzc2lvbkluZGV4ACoEUQFTZXQgdGhlIG51bWJlciBvZiBzZXNzaW9uIGNoYW5nZXMgYWZ0ZXIgd2hpY2ggYSBQVkYgcHJlLWNoZWNraW5nIHZvdGluZyBpcyByZWplY3RlZC6Qc2V0X21pbmltdW1fdmFsaWRhdGlvbl91cGdyYWRlX2RlbGF5BAEMbmV3EAFEQmxvY2tOdW1iZXJGb3I8VD4AKxBVAVNldHMgdGhlIG1pbmltdW0gZGVsYXkgYmV0d2VlbiBhbm5vdW5jaW5nIHRoZSB1cGdyYWRlIGJsb2NrIGZvciBhIHBhcmFjaGFpbiB1bnRpbCB0aGVUdXBncmFkZSB0YWtpbmcgcGxhY2UuADkBU2VlIHRoZSBmaWVsZCBkb2N1bWVudGF0aW9uIGZvciBpbmZvcm1hdGlvbiBhbmQgY29uc3RyYWludHMgZm9yIHRoZSBuZXcgdmFsdWUucHNldF9ieXBhc3NfY29uc2lzdGVuY3lfY2hlY2sEAQxuZXcgARBib29sACwITQFTZXR0aW5nIHRoaXMgdG8gdHJ1ZSB3aWxsIGRpc2FibGUgY29uc2lzdGVuY3kgY2hlY2tzIGZvciB0aGUgY29uZmlndXJhdGlvbiBzZXR0ZXJzLkRVc2Ugd2l0aCBjYXV0aW9uLmBzZXRfYXN5bmNfYmFja2luZ19wYXJhbXMEAQxuZXe9BAFIQXN5bmNCYWNraW5nUGFyYW1zAC0EoFNldCB0aGUgYXN5bmNocm9ub3VzIGJhY2tpbmcgcGFyYW1ldGVycy5Mc2V0X2V4ZWN1dG9yX3BhcmFtcwQBDG5ld8EEAThFeGVjdXRvclBhcmFtcwAuBHBTZXQgUFZGIGV4ZWN1dG9yIHBhcmFtZXRlcnMuWHNldF9vbl9kZW1hbmRfYmFzZV9mZWUEAQxuZXcYARxCYWxhbmNlAC8EpFNldCB0aGUgb24gZGVtYW5kIChwYXJhdGhyZWFkcykgYmFzZSBmZWUudHNldF9vbl9kZW1hbmRfZmVlX3ZhcmlhYmlsaXR5BAEMbmV3lAEcUGVyYmlsbAAwBMBTZXQgdGhlIG9uIGRlbWFuZCAocGFyYXRocmVhZHMpIGZlZSB2YXJpYWJpbGl0eS5wc2V0X29uX2RlbWFuZF9xdWV1ZV9tYXhfc2l6ZQQBDG5ldxABDHUzMgAxBLxTZXQgdGhlIG9uIGRlbWFuZCAocGFyYXRocmVhZHMpIHF1ZXVlIG1heCBzaXplLphzZXRfb25fZGVtYW5kX3RhcmdldF9xdWV1ZV91dGlsaXphdGlvbgQBDG5ld5QBHFBlcmJpbGwAMgTAU2V0IHRoZSBvbiBkZW1hbmQgKHBhcmF0aHJlYWRzKSBmZWUgdmFyaWFiaWxpdHkuRHNldF9vbl9kZW1hbmRfdHRsBAEMbmV3EAFEQmxvY2tOdW1iZXJGb3I8VD4AMwTYU2V0IHRoZSBvbiBkZW1hbmQgKHBhcmF0aHJlYWRzKSB0dGwgaW4gdGhlIGNsYWltcXVldWUuZHNldF9taW5pbXVtX2JhY2tpbmdfdm90ZXMEAQxuZXcQAQx1MzIANASgU2V0IHRoZSBtaW5pbXVtIGJhY2tpbmcgdm90ZXMgdGhyZXNob2xkLkBzZXRfbm9kZV9mZWF0dXJlCAEUaW5kZXgIAQh1OAABFHZhbHVlIAEQYm9vbAA1BGRTZXQvVW5zZXQgYSBub2RlIGZlYXR1cmUuaHNldF9hcHByb3ZhbF92b3RpbmdfcGFyYW1zBAEMbmV31QQBUEFwcHJvdmFsVm90aW5nUGFyYW1zADYEbFNldCBhcHByb3ZhbC12b3RpbmctcGFyYW1zLlBzZXRfc2NoZWR1bGVyX3BhcmFtcwQBDG5ld9kEAYhTY2hlZHVsZXJQYXJhbXM8QmxvY2tOdW1iZXJGb3I8VD4+ADcEVFNldCBzY2hlZHVsZXItcGFyYW1zLgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy69BBBMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2NzRhc3luY19iYWNraW5nSEFzeW5jQmFja2luZ1BhcmFtcwAACAFMbWF4X2NhbmRpZGF0ZV9kZXB0aBABDHUzMgABUGFsbG93ZWRfYW5jZXN0cnlfbGVuEAEMdTMyAADBBBBMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2NzxleGVjdXRvcl9wYXJhbXM4RXhlY3V0b3JQYXJhbXMAAAQAxQQBSFZlYzxFeGVjdXRvclBhcmFtPgAAxQQAAALJBADJBBBMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2NzxleGVjdXRvcl9wYXJhbXM0RXhlY3V0b3JQYXJhbQABHDhNYXhNZW1vcnlQYWdlcwQAEAEMdTMyAAEAPFN0YWNrTG9naWNhbE1heAQAEAEMdTMyAAIAOFN0YWNrTmF0aXZlTWF4BAAQAQx1MzIAAwBQUHJlY2hlY2tpbmdNYXhNZW1vcnkEADABDHU2NAAEADhQdmZQcmVwVGltZW91dAgAzQQBLFB2ZlByZXBLaW5kAAAwAQx1NjQABQA4UHZmRXhlY1RpbWVvdXQIANEEASxQdmZFeGVjS2luZAAAMAEMdTY0AAYARFdhc21FeHRCdWxrTWVtb3J5AAcAAM0EDExwb2xrYWRvdF9wcmltaXRpdmVzCHY3LFB2ZlByZXBLaW5kAAEIIFByZWNoZWNrAAAAHFByZXBhcmUAAQAA0QQMTHBvbGthZG90X3ByaW1pdGl2ZXMIdjcsUHZmRXhlY0tpbmQAAQgcQmFja2luZwAAACBBcHByb3ZhbAABAADVBAxMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2N1BBcHByb3ZhbFZvdGluZ1BhcmFtcwAABAFsbWF4X2FwcHJvdmFsX2NvYWxlc2NlX2NvdW50EAEMdTMyAADZBAxMcG9sa2Fkb3RfcHJpbWl0aXZlcyB2c3RhZ2luZzxTY2hlZHVsZXJQYXJhbXMELEJsb2NrTnVtYmVyARAALAFgZ3JvdXBfcm90YXRpb25fZnJlcXVlbmN5EAEsQmxvY2tOdW1iZXIAAWRwYXJhc19hdmFpbGFiaWxpdHlfcGVyaW9kEAEsQmxvY2tOdW1iZXIAAVxtYXhfdmFsaWRhdG9yc19wZXJfY29yZT0CASxPcHRpb248dTMyPgABJGxvb2thaGVhZBABDHUzMgABJG51bV9jb3JlcxABDHUzMgABZG1heF9hdmFpbGFiaWxpdHlfdGltZW91dHMQAQx1MzIAAWBvbl9kZW1hbmRfcXVldWVfbWF4X3NpemUQAQx1MzIAAYhvbl9kZW1hbmRfdGFyZ2V0X3F1ZXVlX3V0aWxpemF0aW9ulAEcUGVyYmlsbAABZG9uX2RlbWFuZF9mZWVfdmFyaWFiaWxpdHmUARxQZXJiaWxsAAFIb25fZGVtYW5kX2Jhc2VfZmVlGAEcQmFsYW5jZQABDHR0bBABLEJsb2NrTnVtYmVyAADdBBBscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zGHNoYXJlZBhwYWxsZXQQQ2FsbAQEVAABAAQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy7hBBBscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zJGluY2x1c2lvbhhwYWxsZXQQQ2FsbAQEVAABAAQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy7lBBBscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zOHBhcmFzX2luaGVyZW50GHBhbGxldBBDYWxsBARUAAEEFGVudGVyBAEQZGF0YekEAZBQYXJhY2hhaW5zSW5oZXJlbnREYXRhPEhlYWRlckZvcjxUPj4AAAQxAUVudGVyIHRoZSBwYXJhcyBpbmhlcmVudC4gVGhpcyB3aWxsIHByb2Nlc3MgYml0ZmllbGRzIGFuZCBiYWNrZWQgY2FuZGlkYXRlcy4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMu6QQMTHBvbGthZG90X3ByaW1pdGl2ZXMIdjcwSW5oZXJlbnREYXRhBAxIRFIBeQEAEAEkYml0ZmllbGRz7QQBkFVuY2hlY2tlZFNpZ25lZEF2YWlsYWJpbGl0eUJpdGZpZWxkcwABRGJhY2tlZF9jYW5kaWRhdGVzCQUBfFZlYzxCYWNrZWRDYW5kaWRhdGU8SERSOjpIYXNoPj4AASBkaXNwdXRlc00FAWBNdWx0aURpc3B1dGVTdGF0ZW1lbnRTZXQAATRwYXJlbnRfaGVhZGVyeQEBDEhEUgAA7QQAAALxBADxBBBMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2NxhzaWduZWQ8VW5jaGVja2VkU2lnbmVkCBxQYXlsb2FkAfUELFJlYWxQYXlsb2FkAfUEAAwBHHBheWxvYWT1BAEcUGF5bG9hZAABPHZhbGlkYXRvcl9pbmRleAEFAThWYWxpZGF0b3JJbmRleAABJHNpZ25hdHVyZQUFAUhWYWxpZGF0b3JTaWduYXR1cmUAAPUEDExwb2xrYWRvdF9wcmltaXRpdmVzCHY3UEF2YWlsYWJpbGl0eUJpdGZpZWxkAAAEAPkEAXxCaXRWZWM8dTgsIGJpdHZlYzo6b3JkZXI6OkxzYjA+AAD5BAAABwj9BAD9BAwYYml0dmVjFG9yZGVyEExzYjAAAAAAAQUMTHBvbGthZG90X3ByaW1pdGl2ZXMIdjc4VmFsaWRhdG9ySW5kZXgAAAQAEAEMdTMyAAAFBRBMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2NzR2YWxpZGF0b3JfYXBwJFNpZ25hdHVyZQAABAAlAgFIc3IyNTUxOTo6U2lnbmF0dXJlAAAJBQAAAg0FAA0FDExwb2xrYWRvdF9wcmltaXRpdmVzCHY3PEJhY2tlZENhbmRpZGF0ZQQESAE0AAwBJGNhbmRpZGF0ZREFAXBDb21taXR0ZWRDYW5kaWRhdGVSZWNlaXB0PEg+AAE4dmFsaWRpdHlfdm90ZXNFBQFgVmVjPFZhbGlkaXR5QXR0ZXN0YXRpb24+AAFEdmFsaWRhdG9yX2luZGljZXP5BAF8Qml0VmVjPHU4LCBiaXR2ZWM6Om9yZGVyOjpMc2IwPgAAEQUMTHBvbGthZG90X3ByaW1pdGl2ZXMIdjdkQ29tbWl0dGVkQ2FuZGlkYXRlUmVjZWlwdAQESAE0AAgBKGRlc2NyaXB0b3IVBQFYQ2FuZGlkYXRlRGVzY3JpcHRvcjxIPgABLGNvbW1pdG1lbnRzJQUBUENhbmRpZGF0ZUNvbW1pdG1lbnRzAAAVBQxMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2N0xDYW5kaWRhdGVEZXNjcmlwdG9yBARIATQAJAEccGFyYV9pZGkCAQhJZAABMHJlbGF5X3BhcmVudDQBBEgAASBjb2xsYXRvchkFAShDb2xsYXRvcklkAAF4cGVyc2lzdGVkX3ZhbGlkYXRpb25fZGF0YV9oYXNoNAEQSGFzaAABIHBvdl9oYXNoNAEQSGFzaAABMGVyYXN1cmVfcm9vdDQBEEhhc2gAASRzaWduYXR1cmUdBQFEQ29sbGF0b3JTaWduYXR1cmUAASRwYXJhX2hlYWQ0ARBIYXNoAAFQdmFsaWRhdGlvbl9jb2RlX2hhc2ghBQFIVmFsaWRhdGlvbkNvZGVIYXNoAAAZBRBMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2NzBjb2xsYXRvcl9hcHAYUHVibGljAAAEAAQBPHNyMjU1MTk6OlB1YmxpYwAAHQUQTHBvbGthZG90X3ByaW1pdGl2ZXMIdjcwY29sbGF0b3JfYXBwJFNpZ25hdHVyZQAABAAlAgFIc3IyNTUxOTo6U2lnbmF0dXJlAAAhBQx0cG9sa2Fkb3RfcGFyYWNoYWluX3ByaW1pdGl2ZXMocHJpbWl0aXZlc0hWYWxpZGF0aW9uQ29kZUhhc2gAAAQANAEQSGFzaAAAJQUMTHBvbGthZG90X3ByaW1pdGl2ZXMIdjdQQ2FuZGlkYXRlQ29tbWl0bWVudHMEBE4BEAAYATx1cHdhcmRfbWVzc2FnZXMpBQE4VXB3YXJkTWVzc2FnZXMAAUxob3Jpem9udGFsX21lc3NhZ2VzLQUBSEhvcml6b250YWxNZXNzYWdlcwABTG5ld192YWxpZGF0aW9uX2NvZGU5BQFYT3B0aW9uPFZhbGlkYXRpb25Db2RlPgABJGhlYWRfZGF0YUEFASBIZWFkRGF0YQABbHByb2Nlc3NlZF9kb3dud2FyZF9tZXNzYWdlcxABDHUzMgABOGhybXBfd2F0ZXJtYXJrEAEETgAAKQUMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAE4BFMAAAQAbQEBGFZlYzxUPgAALQUMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAExBQRTAAAEADUFARhWZWM8VD4AADEFCGBwb2xrYWRvdF9jb3JlX3ByaW1pdGl2ZXNMT3V0Ym91bmRIcm1wTWVzc2FnZQQISWQBaQIACAEkcmVjaXBpZW50aQIBCElkAAEQZGF0YTgBUHNwX3N0ZDo6dmVjOjpWZWM8dTg+AAA1BQAAAjEFADkFBBhPcHRpb24EBFQBPQUBCBBOb25lAAAAEFNvbWUEAD0FAAABAAA9BQx0cG9sa2Fkb3RfcGFyYWNoYWluX3ByaW1pdGl2ZXMocHJpbWl0aXZlczhWYWxpZGF0aW9uQ29kZQAABAA4ARxWZWM8dTg+AABBBQx0cG9sa2Fkb3RfcGFyYWNoYWluX3ByaW1pdGl2ZXMocHJpbWl0aXZlcyBIZWFkRGF0YQAABAA4ARxWZWM8dTg+AABFBQAAAkkFAEkFDExwb2xrYWRvdF9wcmltaXRpdmVzCHY3TFZhbGlkaXR5QXR0ZXN0YXRpb24AAQggSW1wbGljaXQEAAUFAUhWYWxpZGF0b3JTaWduYXR1cmUAAQAgRXhwbGljaXQEAAUFAUhWYWxpZGF0b3JTaWduYXR1cmUAAgAATQUAAAJRBQBRBQxMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2N0xEaXNwdXRlU3RhdGVtZW50U2V0AAAMAThjYW5kaWRhdGVfaGFzaFUFATRDYW5kaWRhdGVIYXNoAAEcc2Vzc2lvbhABMFNlc3Npb25JbmRleAABKHN0YXRlbWVudHNZBQHsVmVjPChEaXNwdXRlU3RhdGVtZW50LCBWYWxpZGF0b3JJbmRleCwgVmFsaWRhdG9yU2lnbmF0dXJlKT4AAFUFCGBwb2xrYWRvdF9jb3JlX3ByaW1pdGl2ZXM0Q2FuZGlkYXRlSGFzaAAABAA0ARBIYXNoAABZBQAAAl0FAF0FAAAEDGEFAQUFBQBhBQxMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2N0BEaXNwdXRlU3RhdGVtZW50AAEIFFZhbGlkBABlBQFkVmFsaWREaXNwdXRlU3RhdGVtZW50S2luZAAAABxJbnZhbGlkBABtBQFsSW52YWxpZERpc3B1dGVTdGF0ZW1lbnRLaW5kAAEAAGUFDExwb2xrYWRvdF9wcmltaXRpdmVzCHY3ZFZhbGlkRGlzcHV0ZVN0YXRlbWVudEtpbmQAARQgRXhwbGljaXQAAAA8QmFja2luZ1NlY29uZGVkBAA0ARBIYXNoAAEAMEJhY2tpbmdWYWxpZAQANAEQSGFzaAACAEBBcHByb3ZhbENoZWNraW5nAAMAiEFwcHJvdmFsQ2hlY2tpbmdNdWx0aXBsZUNhbmRpZGF0ZXMEAGkFAUhWZWM8Q2FuZGlkYXRlSGFzaD4ABAAAaQUAAAJVBQBtBQxMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2N2xJbnZhbGlkRGlzcHV0ZVN0YXRlbWVudEtpbmQAAQQgRXhwbGljaXQAAAAAcQUQbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucxRwYXJhcxhwYWxsZXQQQ2FsbAQEVAABJFhmb3JjZV9zZXRfY3VycmVudF9jb2RlCAEQcGFyYWkCARhQYXJhSWQAASBuZXdfY29kZT0FAThWYWxpZGF0aW9uQ29kZQAABPhTZXQgdGhlIHN0b3JhZ2UgZm9yIHRoZSBwYXJhY2hhaW4gdmFsaWRhdGlvbiBjb2RlIGltbWVkaWF0ZWx5Llhmb3JjZV9zZXRfY3VycmVudF9oZWFkCAEQcGFyYWkCARhQYXJhSWQAASBuZXdfaGVhZEEFASBIZWFkRGF0YQABBAEBU2V0IHRoZSBzdG9yYWdlIGZvciB0aGUgY3VycmVudCBwYXJhY2hhaW4gaGVhZCBkYXRhIGltbWVkaWF0ZWx5Lmxmb3JjZV9zY2hlZHVsZV9jb2RlX3VwZ3JhZGUMARBwYXJhaQIBGFBhcmFJZAABIG5ld19jb2RlPQUBOFZhbGlkYXRpb25Db2RlAAFMcmVsYXlfcGFyZW50X251bWJlchABREJsb2NrTnVtYmVyRm9yPFQ+AAIELQFTY2hlZHVsZSBhbiB1cGdyYWRlIGFzIGlmIGl0IHdhcyBzY2hlZHVsZWQgaW4gdGhlIGdpdmVuIHJlbGF5IHBhcmVudCBibG9jay5MZm9yY2Vfbm90ZV9uZXdfaGVhZAgBEHBhcmFpAgEYUGFyYUlkAAEgbmV3X2hlYWRBBQEgSGVhZERhdGEAAwQdAU5vdGUgYSBuZXcgYmxvY2sgaGVhZCBmb3IgcGFyYSB3aXRoaW4gdGhlIGNvbnRleHQgb2YgdGhlIGN1cnJlbnQgYmxvY2suSGZvcmNlX3F1ZXVlX2FjdGlvbgQBEHBhcmFpAgEYUGFyYUlkAAQM+FB1dCBhIHBhcmFjaGFpbiBkaXJlY3RseSBpbnRvIHRoZSBuZXh0IHNlc3Npb24ncyBhY3Rpb24gcXVldWUu9FdlIGNhbid0IHF1ZXVlIGl0IGFueSBzb29uZXIgdGhhbiB0aGlzIHdpdGhvdXQgZ29pbmcgaW50byB0aGU4aW5pdGlhbGl6ZXIuLi5sYWRkX3RydXN0ZWRfdmFsaWRhdGlvbl9jb2RlBAE8dmFsaWRhdGlvbl9jb2RlPQUBOFZhbGlkYXRpb25Db2RlAAU4oEFkZHMgdGhlIHZhbGlkYXRpb24gY29kZSB0byB0aGUgc3RvcmFnZS4AWQFUaGUgY29kZSB3aWxsIG5vdCBiZSBhZGRlZCBpZiBpdCBpcyBhbHJlYWR5IHByZXNlbnQuIEFkZGl0aW9uYWxseSwgaWYgUFZGIHByZS1jaGVja2luZ+BpcyBydW5uaW5nIGZvciB0aGF0IGNvZGUsIGl0IHdpbGwgYmUgaW5zdGFudGx5IGFjY2VwdGVkLgBRAU90aGVyd2lzZSwgdGhlIGNvZGUgd2lsbCBiZSBhZGRlZCBpbnRvIHRoZSBzdG9yYWdlLiBOb3RlIHRoYXQgdGhlIGNvZGUgd2lsbCBiZSBhZGRlZGEBaW50byBzdG9yYWdlIHdpdGggcmVmZXJlbmNlIGNvdW50IDAuIFRoaXMgaXMgdG8gYWNjb3VudCB0aGUgZmFjdCB0aGF0IHRoZXJlIGFyZSBubyB1c2Vyc00BZm9yIHRoaXMgY29kZSB5ZXQuIFRoZSBjYWxsZXIgd2lsbCBoYXZlIHRvIG1ha2Ugc3VyZSB0aGF0IHRoaXMgY29kZSBldmVudHVhbGx5IGdldHNJAXVzZWQgYnkgc29tZSBwYXJhY2hhaW4gb3IgcmVtb3ZlZCBmcm9tIHRoZSBzdG9yYWdlIHRvIGF2b2lkIHN0b3JhZ2UgbGVha3MuIEZvciB0aGVJAWxhdHRlciBwcmVmZXIgdG8gdXNlIHRoZSBgcG9rZV91bnVzZWRfdmFsaWRhdGlvbl9jb2RlYCBkaXNwYXRjaGFibGUgdG8gcmF3IHN0b3JhZ2U0bWFuaXB1bGF0aW9uLgBRAVRoaXMgZnVuY3Rpb24gaXMgbWFpbmx5IG1lYW50IHRvIGJlIHVzZWQgZm9yIHVwZ3JhZGluZyBwYXJhY2hhaW5zIHRoYXQgZG8gbm90IGZvbGxvdwkBdGhlIGdvLWFoZWFkIHNpZ25hbCB3aGlsZSB0aGUgUFZGIHByZS1jaGVja2luZyBmZWF0dXJlIGlzIGVuYWJsZWQubHBva2VfdW51c2VkX3ZhbGlkYXRpb25fY29kZQQBUHZhbGlkYXRpb25fY29kZV9oYXNoIQUBSFZhbGlkYXRpb25Db2RlSGFzaAAGFCUBUmVtb3ZlIHRoZSB2YWxpZGF0aW9uIGNvZGUgZnJvbSB0aGUgc3RvcmFnZSBpZmYgdGhlIHJlZmVyZW5jZSBjb3VudCBpcyAwLgBZAVRoaXMgaXMgYmV0dGVyIHRoYW4gcmVtb3ZpbmcgdGhlIHN0b3JhZ2UgZGlyZWN0bHksIGJlY2F1c2UgaXQgd2lsbCBub3QgcmVtb3ZlIHRoZSBjb2RlQQF0aGF0IHdhcyBzdWRkZW5seSBnb3QgdXNlZCBieSBzb21lIHBhcmFjaGFpbiB3aGlsZSB0aGlzIGRpc3BhdGNoYWJsZSB3YXMgcGVuZGluZzBkaXNwYXRjaGluZy5saW5jbHVkZV9wdmZfY2hlY2tfc3RhdGVtZW50CAEQc3RtdHUFAURQdmZDaGVja1N0YXRlbWVudAABJHNpZ25hdHVyZQUFAUhWYWxpZGF0b3JTaWduYXR1cmUABwhVAUluY2x1ZGVzIGEgc3RhdGVtZW50IGZvciBhIFBWRiBwcmUtY2hlY2tpbmcgdm90ZS4gUG90ZW50aWFsbHksIGZpbmFsaXplcyB0aGUgdm90ZSBhbmRBAWVuYWN0cyB0aGUgcmVzdWx0cyBpZiB0aGF0IHdhcyB0aGUgbGFzdCB2b3RlIGJlZm9yZSBhY2hpZXZpbmcgdGhlIHN1cGVybWFqb3JpdHkudGZvcmNlX3NldF9tb3N0X3JlY2VudF9jb250ZXh0CAEQcGFyYWkCARhQYXJhSWQAARxjb250ZXh0EAFEQmxvY2tOdW1iZXJGb3I8VD4ACAQBAVNldCB0aGUgc3RvcmFnZSBmb3IgdGhlIGN1cnJlbnQgcGFyYWNoYWluIGhlYWQgZGF0YSBpbW1lZGlhdGVseS4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMudQUMTHBvbGthZG90X3ByaW1pdGl2ZXMIdjdEUHZmQ2hlY2tTdGF0ZW1lbnQAABABGGFjY2VwdCABEGJvb2wAARxzdWJqZWN0IQUBSFZhbGlkYXRpb25Db2RlSGFzaAABNHNlc3Npb25faW5kZXgQATBTZXNzaW9uSW5kZXgAATx2YWxpZGF0b3JfaW5kZXgBBQE4VmFsaWRhdG9ySW5kZXgAAHkFEGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMsaW5pdGlhbGl6ZXIYcGFsbGV0EENhbGwEBFQAAQQ0Zm9yY2VfYXBwcm92ZQQBFHVwX3RvEAEsQmxvY2tOdW1iZXIAAAw5AUlzc3VlIGEgc2lnbmFsIHRvIHRoZSBjb25zZW5zdXMgZW5naW5lIHRvIGZvcmNpYmx5IGFjdCBhcyB0aG91Z2ggYWxsIHBhcmFjaGFpblEBYmxvY2tzIGluIGFsbCByZWxheSBjaGFpbiBibG9ja3MgdXAgdG8gYW5kIGluY2x1ZGluZyB0aGUgZ2l2ZW4gbnVtYmVyIGluIHRoZSBjdXJyZW50oGNoYWluIGFyZSB2YWxpZCBhbmQgc2hvdWxkIGJlIGZpbmFsaXplZC4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMufQUQbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucxBocm1wGHBhbGxldBBDYWxsBARUAAEsWGhybXBfaW5pdF9vcGVuX2NoYW5uZWwMASRyZWNpcGllbnRpAgEYUGFyYUlkAAFUcHJvcG9zZWRfbWF4X2NhcGFjaXR5EAEMdTMyAAFkcHJvcG9zZWRfbWF4X21lc3NhZ2Vfc2l6ZRABDHUzMgAAKE0BSW5pdGlhdGUgb3BlbmluZyBhIGNoYW5uZWwgZnJvbSBhIHBhcmFjaGFpbiB0byBhIGdpdmVuIHJlY2lwaWVudCB3aXRoIGdpdmVuIGNoYW5uZWwscGFyYW1ldGVycy4AWQEtIGBwcm9wb3NlZF9tYXhfY2FwYWNpdHlgIC0gc3BlY2lmaWVzIGhvdyBtYW55IG1lc3NhZ2VzIGNhbiBiZSBpbiB0aGUgY2hhbm5lbCBhdCBvbmNlLi0BLSBgcHJvcG9zZWRfbWF4X21lc3NhZ2Vfc2l6ZWAgLSBzcGVjaWZpZXMgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgbWVzc2FnZXMuABEBVGhlc2UgbnVtYmVycyBhcmUgYSBzdWJqZWN0IHRvIHRoZSByZWxheS1jaGFpbiBjb25maWd1cmF0aW9uIGxpbWl0cy4AUQFUaGUgY2hhbm5lbCBjYW4gYmUgb3BlbmVkIG9ubHkgYWZ0ZXIgdGhlIHJlY2lwaWVudCBjb25maXJtcyBpdCBhbmQgb25seSBvbiBhIHNlc3Npb24cY2hhbmdlLmBocm1wX2FjY2VwdF9vcGVuX2NoYW5uZWwEARhzZW5kZXJpAgEYUGFyYUlkAAEM8EFjY2VwdCBhIHBlbmRpbmcgb3BlbiBjaGFubmVsIHJlcXVlc3QgZnJvbSB0aGUgZ2l2ZW4gc2VuZGVyLgD0VGhlIGNoYW5uZWwgd2lsbCBiZSBvcGVuZWQgb25seSBvbiB0aGUgbmV4dCBzZXNzaW9uIGJvdW5kYXJ5Lkhocm1wX2Nsb3NlX2NoYW5uZWwEAShjaGFubmVsX2lkgQUBNEhybXBDaGFubmVsSWQAAhBVAUluaXRpYXRlIHVuaWxhdGVyYWwgY2xvc2luZyBvZiBhIGNoYW5uZWwuIFRoZSBvcmlnaW4gbXVzdCBiZSBlaXRoZXIgdGhlIHNlbmRlciBvciB0aGWYcmVjaXBpZW50IGluIHRoZSBjaGFubmVsIGJlaW5nIGNsb3NlZC4AwFRoZSBjbG9zdXJlIGNhbiBvbmx5IGhhcHBlbiBvbiBhIHNlc3Npb24gY2hhbmdlLkBmb3JjZV9jbGVhbl9ocm1wDAEQcGFyYWkCARhQYXJhSWQAASxudW1faW5ib3VuZBABDHUzMgABMG51bV9vdXRib3VuZBABDHUzMgADHF0BVGhpcyBleHRyaW5zaWMgdHJpZ2dlcnMgdGhlIGNsZWFudXAgb2YgYWxsIHRoZSBIUk1QIHN0b3JhZ2UgaXRlbXMgdGhhdCBhIHBhcmEgbWF5IGhhdmUuSQFOb3JtYWxseSB0aGlzIGhhcHBlbnMgb25jZSBwZXIgc2Vzc2lvbiwgYnV0IHRoaXMgYWxsb3dzIHlvdSB0byB0cmlnZ2VyIHRoZSBjbGVhbnVwlGltbWVkaWF0ZWx5IGZvciBhIHNwZWNpZmljIHBhcmFjaGFpbi4AUQFOdW1iZXIgb2YgaW5ib3VuZCBhbmQgb3V0Ym91bmQgY2hhbm5lbHMgZm9yIGBwYXJhYCBtdXN0IGJlIHByb3ZpZGVkIGFzIHdpdG5lc3MgZGF0YS4AkE9yaWdpbiBtdXN0IGJlIHRoZSBgQ2hhbm5lbE1hbmFnZXJgLlxmb3JjZV9wcm9jZXNzX2hybXBfb3BlbgQBIGNoYW5uZWxzEAEMdTMyAAQgpEZvcmNlIHByb2Nlc3MgSFJNUCBvcGVuIGNoYW5uZWwgcmVxdWVzdHMuAFUBSWYgdGhlcmUgYXJlIHBlbmRpbmcgSFJNUCBvcGVuIGNoYW5uZWwgcmVxdWVzdHMsIHlvdSBjYW4gdXNlIHRoaXMgZnVuY3Rpb24gdG8gcHJvY2Vzc4hhbGwgb2YgdGhvc2UgcmVxdWVzdHMgaW1tZWRpYXRlbHkuAAkBVG90YWwgbnVtYmVyIG9mIG9wZW5pbmcgY2hhbm5lbHMgbXVzdCBiZSBwcm92aWRlZCBhcyB3aXRuZXNzIGRhdGEuAJBPcmlnaW4gbXVzdCBiZSB0aGUgYENoYW5uZWxNYW5hZ2VyYC5gZm9yY2VfcHJvY2Vzc19ocm1wX2Nsb3NlBAEgY2hhbm5lbHMQAQx1MzIABSCoRm9yY2UgcHJvY2VzcyBIUk1QIGNsb3NlIGNoYW5uZWwgcmVxdWVzdHMuAFkBSWYgdGhlcmUgYXJlIHBlbmRpbmcgSFJNUCBjbG9zZSBjaGFubmVsIHJlcXVlc3RzLCB5b3UgY2FuIHVzZSB0aGlzIGZ1bmN0aW9uIHRvIHByb2Nlc3OIYWxsIG9mIHRob3NlIHJlcXVlc3RzIGltbWVkaWF0ZWx5LgAJAVRvdGFsIG51bWJlciBvZiBjbG9zaW5nIGNoYW5uZWxzIG11c3QgYmUgcHJvdmlkZWQgYXMgd2l0bmVzcyBkYXRhLgCQT3JpZ2luIG11c3QgYmUgdGhlIGBDaGFubmVsTWFuYWdlcmAuYGhybXBfY2FuY2VsX29wZW5fcmVxdWVzdAgBKGNoYW5uZWxfaWSBBQE0SHJtcENoYW5uZWxJZAABNG9wZW5fcmVxdWVzdHMQAQx1MzIABiBdAVRoaXMgY2FuY2VscyBhIHBlbmRpbmcgb3BlbiBjaGFubmVsIHJlcXVlc3QuIEl0IGNhbiBiZSBjYW5jZWxlZCBieSBlaXRoZXIgb2YgdGhlIHNlbmRlchkBb3IgdGhlIHJlY2lwaWVudCBmb3IgdGhhdCByZXF1ZXN0LiBUaGUgb3JpZ2luIG11c3QgYmUgZWl0aGVyIG9mIHRob3NlLgBdAVRoZSBjYW5jZWxsYXRpb24gaGFwcGVucyBpbW1lZGlhdGVseS4gSXQgaXMgbm90IHBvc3NpYmxlIHRvIGNhbmNlbCB0aGUgcmVxdWVzdCBpZiBpdCBpc0RhbHJlYWR5IGFjY2VwdGVkLgBZAVRvdGFsIG51bWJlciBvZiBvcGVuIHJlcXVlc3RzIChpLmUuIGBIcm1wT3BlbkNoYW5uZWxSZXF1ZXN0c0xpc3RgKSBtdXN0IGJlIHByb3ZpZGVkIGFzNHdpdG5lc3MgZGF0YS5cZm9yY2Vfb3Blbl9ocm1wX2NoYW5uZWwQARhzZW5kZXJpAgEYUGFyYUlkAAEkcmVjaXBpZW50aQIBGFBhcmFJZAABMG1heF9jYXBhY2l0eRABDHUzMgABQG1heF9tZXNzYWdlX3NpemUQAQx1MzIAByBhAU9wZW4gYSBjaGFubmVsIGZyb20gYSBgc2VuZGVyYCB0byBhIGByZWNpcGllbnRgIGBQYXJhSWRgLiBBbHRob3VnaCBvcGVuZWQgYnkgZ292ZXJuYW5jZSxBAXRoZSBgbWF4X2NhcGFjaXR5YCBhbmQgYG1heF9tZXNzYWdlX3NpemVgIGFyZSBzdGlsbCBzdWJqZWN0IHRvIHRoZSBSZWxheSBDaGFpbidzSGNvbmZpZ3VyZWQgbGltaXRzLgBNAUV4cGVjdGVkIHVzZSBpcyB3aGVuIG9uZSAoYW5kIG9ubHkgb25lKSBvZiB0aGUgYFBhcmFJZGBzIGludm9sdmVkIGluIHRoZSBjaGFubmVsIGlzwGdvdmVybmVkIGJ5IHRoZSBzeXN0ZW0sIGUuZy4gYSBzeXN0ZW0gcGFyYWNoYWluLgCQT3JpZ2luIG11c3QgYmUgdGhlIGBDaGFubmVsTWFuYWdlcmAuYGVzdGFibGlzaF9zeXN0ZW1fY2hhbm5lbAgBGHNlbmRlcmkCARhQYXJhSWQAASRyZWNpcGllbnRpAgEYUGFyYUlkAAgwUQFFc3RhYmxpc2ggYW4gSFJNUCBjaGFubmVsIGJldHdlZW4gdHdvIHN5c3RlbSBjaGFpbnMuIElmIHRoZSBjaGFubmVsIGRvZXMgbm90IGFscmVhZHlRAWV4aXN0LCB0aGUgdHJhbnNhY3Rpb24gZmVlcyB3aWxsIGJlIHJlZnVuZGVkIHRvIHRoZSBjYWxsZXIuIFRoZSBzeXN0ZW0gZG9lcyBub3QgdGFrZVkBZGVwb3NpdHMgZm9yIGNoYW5uZWxzIGJldHdlZW4gc3lzdGVtIGNoYWlucywgYW5kIGF1dG9tYXRpY2FsbHkgc2V0cyB0aGUgbWVzc2FnZSBudW1iZXIZAWFuZCBzaXplIGxpbWl0cyB0byB0aGUgbWF4aW11bSBhbGxvd2VkIGJ5IHRoZSBuZXR3b3JrJ3MgY29uZmlndXJhdGlvbi4AKEFyZ3VtZW50czoAlC0gYHNlbmRlcmA6IEEgc3lzdGVtIGNoYWluLCBgUGFyYUlkYC6gLSBgcmVjaXBpZW50YDogQSBzeXN0ZW0gY2hhaW4sIGBQYXJhSWRgLgBVAUFueSBzaWduZWQgb3JpZ2luIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24sIGJ1dCBfYm90aF8gaW5wdXRzIE1VU1QgYmUgc3lzdGVtIGNoYWlucy4gSWbAdGhlIGNoYW5uZWwgZG9lcyBub3QgZXhpc3QgeWV0LCB0aGVyZSBpcyBubyBmZWUuVHBva2VfY2hhbm5lbF9kZXBvc2l0cwgBGHNlbmRlcmkCARhQYXJhSWQAASRyZWNpcGllbnRpAgEYUGFyYUlkAAkkUQFVcGRhdGUgdGhlIGRlcG9zaXRzIGhlbGQgZm9yIGFuIEhSTVAgY2hhbm5lbCB0byB0aGUgbGF0ZXN0IGBDb25maWd1cmF0aW9uYC4gQ2hhbm5lbHOwd2l0aCBzeXN0ZW0gY2hhaW5zIGRvIG5vdCByZXF1aXJlIGEgZGVwb3NpdC4AKEFyZ3VtZW50czoAeC0gYHNlbmRlcmA6IEEgY2hhaW4sIGBQYXJhSWRgLoQtIGByZWNpcGllbnRgOiBBIGNoYWluLCBgUGFyYUlkYC4ApEFueSBzaWduZWQgb3JpZ2luIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24udGVzdGFibGlzaF9jaGFubmVsX3dpdGhfc3lzdGVtBAFMdGFyZ2V0X3N5c3RlbV9jaGFpbmkCARhQYXJhSWQAChw5AUVzdGFibGlzaCBhIGJpZGlyZWN0aW9uYWwgSFJNUCBjaGFubmVsIGJldHdlZW4gYSBwYXJhY2hhaW4gYW5kIGEgc3lzdGVtIGNoYWluLgAoQXJndW1lbnRzOgDILSBgdGFyZ2V0X3N5c3RlbV9jaGFpbmA6IEEgc3lzdGVtIGNoYWluLCBgUGFyYUlkYC4AsFRoZSBvcmlnaW4gbmVlZHMgdG8gYmUgdGhlIHBhcmFjaGFpbiBvcmlnaW4uBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLoEFDHRwb2xrYWRvdF9wYXJhY2hhaW5fcHJpbWl0aXZlcyhwcmltaXRpdmVzNEhybXBDaGFubmVsSWQAAAgBGHNlbmRlcmkCAQhJZAABJHJlY2lwaWVudGkCAQhJZAAAhQUQbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucyBkaXNwdXRlcxhwYWxsZXQQQ2FsbAQEVAABBDhmb3JjZV91bmZyZWV6ZQAAAAQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy6JBRRscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zIGRpc3B1dGVzIHNsYXNoaW5nGHBhbGxldBBDYWxsBARUAAEEcHJlcG9ydF9kaXNwdXRlX2xvc3RfdW5zaWduZWQIATRkaXNwdXRlX3Byb29mjQUBREJveDxEaXNwdXRlUHJvb2Y+AAE8a2V5X293bmVyX3Byb29mhQEBQFQ6OktleU93bmVyUHJvb2YAAAAEDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMujQUQTHBvbGthZG90X3ByaW1pdGl2ZXMIdjcgc2xhc2hpbmcwRGlzcHV0ZVByb29mAAAQASR0aW1lX3Nsb3SRBQFARGlzcHV0ZXNUaW1lU2xvdAABEGtpbmSVBQFMU2xhc2hpbmdPZmZlbmNlS2luZAABPHZhbGlkYXRvcl9pbmRleAEFAThWYWxpZGF0b3JJbmRleAABMHZhbGlkYXRvcl9pZPkBASxWYWxpZGF0b3JJZAAAkQUQTHBvbGthZG90X3ByaW1pdGl2ZXMIdjcgc2xhc2hpbmdARGlzcHV0ZXNUaW1lU2xvdAAACAE0c2Vzc2lvbl9pbmRleBABMFNlc3Npb25JbmRleAABOGNhbmRpZGF0ZV9oYXNoVQUBNENhbmRpZGF0ZUhhc2gAAJUFEExwb2xrYWRvdF9wcmltaXRpdmVzCHY3IHNsYXNoaW5nTFNsYXNoaW5nT2ZmZW5jZUtpbmQAAQgoRm9ySW52YWxpZAAAADBBZ2FpbnN0VmFsaWQAAQAAmQUQbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWluc0hhc3NpZ25lcl9vbl9kZW1hbmQYcGFsbGV0EENhbGwEBFQAAQhccGxhY2Vfb3JkZXJfYWxsb3dfZGVhdGgIAShtYXhfYW1vdW50GAEwQmFsYW5jZU9mPFQ+AAEccGFyYV9pZGkCARhQYXJhSWQAADyUQ3JlYXRlIGEgc2luZ2xlIG9uIGRlbWFuZCBjb3JlIG9yZGVyLkkBV2lsbCB1c2UgdGhlIHNwb3QgcHJpY2UgZm9yIHRoZSBjdXJyZW50IGJsb2NrIGFuZCB3aWxsIHJlYXAgdGhlIGFjY291bnQgaWYgbmVlZGVkLgAsUGFyYW1ldGVyczo5AS0gYG9yaWdpbmA6IFRoZSBzZW5kZXIgb2YgdGhlIGNhbGwsIGZ1bmRzIHdpbGwgYmUgd2l0aGRyYXduIGZyb20gdGhpcyBhY2NvdW50LkkBLSBgbWF4X2Ftb3VudGA6IFRoZSBtYXhpbXVtIGJhbGFuY2UgdG8gd2l0aGRyYXcgZnJvbSB0aGUgb3JpZ2luIHRvIHBsYWNlIGFuIG9yZGVyLg0BLSBgcGFyYV9pZGA6IEEgYFBhcmFJZGAgdGhlIG9yaWdpbiB3YW50cyB0byBwcm92aWRlIGJsb2Nrc3BhY2UgZm9yLgAcRXJyb3JzOuQtIGBJbnN1ZmZpY2llbnRCYWxhbmNlYDogZnJvbSB0aGUgQ3VycmVuY3kgaW1wbGVtZW50YXRpb240LSBgUXVldWVGdWxsYIAtIGBTcG90UHJpY2VIaWdoZXJUaGFuTWF4QW1vdW50YAAcRXZlbnRzOlwtIGBPbkRlbWFuZE9yZGVyUGxhY2VkYFhwbGFjZV9vcmRlcl9rZWVwX2FsaXZlCAEobWF4X2Ftb3VudBgBMEJhbGFuY2VPZjxUPgABHHBhcmFfaWRpAgEYUGFyYUlkAAE8YQFTYW1lIGFzIHRoZSBbYHBsYWNlX29yZGVyX2FsbG93X2RlYXRoYF0oU2VsZjo6cGxhY2Vfb3JkZXJfYWxsb3dfZGVhdGgpIGNhbGwgLCBidXQgd2l0aCBh3GNoZWNrIHRoYXQgcGxhY2luZyB0aGUgb3JkZXIgd2lsbCBub3QgcmVhcCB0aGUgYWNjb3VudC4ALFBhcmFtZXRlcnM6OQEtIGBvcmlnaW5gOiBUaGUgc2VuZGVyIG9mIHRoZSBjYWxsLCBmdW5kcyB3aWxsIGJlIHdpdGhkcmF3biBmcm9tIHRoaXMgYWNjb3VudC5JAS0gYG1heF9hbW91bnRgOiBUaGUgbWF4aW11bSBiYWxhbmNlIHRvIHdpdGhkcmF3IGZyb20gdGhlIG9yaWdpbiB0byBwbGFjZSBhbiBvcmRlci4NAS0gYHBhcmFfaWRgOiBBIGBQYXJhSWRgIHRoZSBvcmlnaW4gd2FudHMgdG8gcHJvdmlkZSBibG9ja3NwYWNlIGZvci4AHEVycm9yczrkLSBgSW5zdWZmaWNpZW50QmFsYW5jZWA6IGZyb20gdGhlIEN1cnJlbmN5IGltcGxlbWVudGF0aW9uNC0gYFF1ZXVlRnVsbGCALSBgU3BvdFByaWNlSGlnaGVyVGhhbk1heEFtb3VudGAAHEV2ZW50czpcLSBgT25EZW1hbmRPcmRlclBsYWNlZGAEDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMunQUQXHBvbGthZG90X3J1bnRpbWVfY29tbW9uPHBhcmFzX3JlZ2lzdHJhchhwYWxsZXQQQ2FsbAQEVAABJCByZWdpc3RlcgwBCGlkaQIBGFBhcmFJZAABMGdlbmVzaXNfaGVhZEEFASBIZWFkRGF0YQABPHZhbGlkYXRpb25fY29kZT0FAThWYWxpZGF0aW9uQ29kZQAAUPhSZWdpc3RlciBoZWFkIGRhdGEgYW5kIHZhbGlkYXRpb24gY29kZSBmb3IgYSByZXNlcnZlZCBQYXJhIElkLgAwIyMgQXJndW1lbnRzwC0gYG9yaWdpbmA6IE11c3QgYmUgY2FsbGVkIGJ5IGEgYFNpZ25lZGAgb3JpZ2luLi0BLSBgaWRgOiBUaGUgcGFyYSBJRC4gTXVzdCBiZSBvd25lZC9tYW5hZ2VkIGJ5IHRoZSBgb3JpZ2luYCBzaWduaW5nIGFjY291bnQuAQEtIGBnZW5lc2lzX2hlYWRgOiBUaGUgZ2VuZXNpcyBoZWFkIGRhdGEgb2YgdGhlIHBhcmFjaGFpbi90aHJlYWQuJQEtIGB2YWxpZGF0aW9uX2NvZGVgOiBUaGUgaW5pdGlhbCB2YWxpZGF0aW9uIGNvZGUgb2YgdGhlIHBhcmFjaGFpbi90aHJlYWQuAEAjIyBEZXBvc2l0cy9GZWVzCQFUaGUgYWNjb3VudCB3aXRoIHRoZSBvcmlnaW5hdGluZyBzaWduYXR1cmUgbXVzdCByZXNlcnZlIGEgZGVwb3NpdC4ATQFUaGUgZGVwb3NpdCBpcyByZXF1aXJlZCB0byBjb3ZlciB0aGUgY29zdHMgYXNzb2NpYXRlZCB3aXRoIHN0b3JpbmcgdGhlIGdlbmVzaXMgaGVhZHRkYXRhIGFuZCB0aGUgdmFsaWRhdGlvbiBjb2RlLjEBVGhpcyBhY2NvdW50cyBmb3IgdGhlIHBvdGVudGlhbCB0byBzdG9yZSB2YWxpZGF0aW9uIGNvZGUgb2YgYSBzaXplIHVwIHRvIHRoZdxgbWF4X2NvZGVfc2l6ZWAsIGFzIGRlZmluZWQgaW4gdGhlIGNvbmZpZ3VyYXRpb24gcGFsbGV0AB0BQW55dGhpbmcgYWxyZWFkeSByZXNlcnZlZCBwcmV2aW91c2x5IGZvciB0aGlzIHBhcmEgSUQgaXMgYWNjb3VudGVkIGZvci4AJCMjIEV2ZW50c9RUaGUgYFJlZ2lzdGVyZWRgIGV2ZW50IGlzIGVtaXR0ZWQgaW4gY2FzZSBvZiBzdWNjZXNzLjhmb3JjZV9yZWdpc3RlchQBDHdobwABMFQ6OkFjY291bnRJZAABHGRlcG9zaXQYATBCYWxhbmNlT2Y8VD4AAQhpZGkCARhQYXJhSWQAATBnZW5lc2lzX2hlYWRBBQEgSGVhZERhdGEAATx2YWxpZGF0aW9uX2NvZGU9BQE4VmFsaWRhdGlvbkNvZGUAARjcRm9yY2UgdGhlIHJlZ2lzdHJhdGlvbiBvZiBhIFBhcmEgSWQgb24gdGhlIHJlbGF5IGNoYWluLgC4VGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBieSBhIFJvb3Qgb3JpZ2luLgAZAVRoZSBkZXBvc2l0IHRha2VuIGNhbiBiZSBzcGVjaWZpZWQgZm9yIHRoaXMgcmVnaXN0cmF0aW9uLiBBbnkgYFBhcmFJZGAZAWNhbiBiZSByZWdpc3RlcmVkLCBpbmNsdWRpbmcgc3ViLTEwMDAgSURzIHdoaWNoIGFyZSBTeXN0ZW0gUGFyYWNoYWlucy4oZGVyZWdpc3RlcgQBCGlkaQIBGFBhcmFJZAACEAUBRGVyZWdpc3RlciBhIFBhcmEgSWQsIGZyZWVpbmcgYWxsIGRhdGEgYW5kIHJldHVybmluZyBhbnkgZGVwb3NpdC4AUQFUaGUgY2FsbGVyIG11c3QgYmUgUm9vdCwgdGhlIGBwYXJhYCBvd25lciwgb3IgdGhlIGBwYXJhYCBpdHNlbGYuIFRoZSBwYXJhIG11c3QgYmUgYW5Qb24tZGVtYW5kIHBhcmFjaGFpbi4Qc3dhcAgBCGlkaQIBGFBhcmFJZAABFG90aGVyaQIBGFBhcmFJZAADMEEBU3dhcCBhIGxlYXNlIGhvbGRpbmcgcGFyYWNoYWluIHdpdGggYW5vdGhlciBwYXJhY2hhaW4sIGVpdGhlciBvbi1kZW1hbmQgb3IgbGVhc2UgaG9sZGluZy4AAQFUaGUgb3JpZ2luIG11c3QgYmUgUm9vdCwgdGhlIGBwYXJhYCBvd25lciwgb3IgdGhlIGBwYXJhYCBpdHNlbGYuAGEBVGhlIHN3YXAgd2lsbCBoYXBwZW4gb25seSBpZiB0aGVyZSBpcyBhbHJlYWR5IGFuIG9wcG9zaXRlIHN3YXAgcGVuZGluZy4gSWYgdGhlcmUgaXMgbm90LFkBdGhlIHN3YXAgd2lsbCBiZSBzdG9yZWQgaW4gdGhlIHBlbmRpbmcgc3dhcHMgbWFwLCByZWFkeSBmb3IgYSBsYXRlciBjb25maXJtYXRvcnkgc3dhcC4AXQFUaGUgYFBhcmFJZGBzIHJlbWFpbiBtYXBwZWQgdG8gdGhlIHNhbWUgaGVhZCBkYXRhIGFuZCBjb2RlIHNvIGV4dGVybmFsIGNvZGUgY2FuIHJlbHkgb249AWBQYXJhSWRgIHRvIGJlIGEgbG9uZy10ZXJtIGlkZW50aWZpZXIgb2YgYSBub3Rpb25hbCAicGFyYWNoYWluIi4gSG93ZXZlciwgdGhlaXI1AXNjaGVkdWxpbmcgaW5mbyAoaS5lLiB3aGV0aGVyIHRoZXkncmUgYW4gb24tZGVtYW5kIHBhcmFjaGFpbiBvciBsZWFzZSBob2xkaW5nFQFwYXJhY2hhaW4pLCBhdWN0aW9uIGluZm9ybWF0aW9uIGFuZCB0aGUgYXVjdGlvbiBkZXBvc2l0IGFyZSBzd2l0Y2hlZC4scmVtb3ZlX2xvY2sEARBwYXJhaQIBGFBhcmFJZAAEEA0BUmVtb3ZlIGEgbWFuYWdlciBsb2NrIGZyb20gYSBwYXJhLiBUaGlzIHdpbGwgYWxsb3cgdGhlIG1hbmFnZXIgb2YgYTUBcHJldmlvdXNseSBsb2NrZWQgcGFyYSB0byBkZXJlZ2lzdGVyIG9yIHN3YXAgYSBwYXJhIHdpdGhvdXQgdXNpbmcgZ292ZXJuYW5jZS4A3ENhbiBvbmx5IGJlIGNhbGxlZCBieSB0aGUgUm9vdCBvcmlnaW4gb3IgdGhlIHBhcmFjaGFpbi4ccmVzZXJ2ZQAFRJRSZXNlcnZlIGEgUGFyYSBJZCBvbiB0aGUgcmVsYXkgY2hhaW4uAE0BVGhpcyBmdW5jdGlvbiB3aWxsIHJlc2VydmUgYSBuZXcgUGFyYSBJZCB0byBiZSBvd25lZC9tYW5hZ2VkIGJ5IHRoZSBvcmlnaW4gYWNjb3VudC5hAVRoZSBvcmlnaW4gYWNjb3VudCBpcyBhYmxlIHRvIHJlZ2lzdGVyIGhlYWQgZGF0YSBhbmQgdmFsaWRhdGlvbiBjb2RlIHVzaW5nIGByZWdpc3RlcmAgdG9ZAWNyZWF0ZSBhbiBvbi1kZW1hbmQgcGFyYWNoYWluLiBVc2luZyB0aGUgU2xvdHMgcGFsbGV0LCBhbiBvbi1kZW1hbmQgcGFyYWNoYWluIGNhbiB0aGVupGJlIHVwZ3JhZGVkIHRvIGEgbGVhc2UgaG9sZGluZyBwYXJhY2hhaW4uADAjIyBBcmd1bWVudHNVAS0gYG9yaWdpbmA6IE11c3QgYmUgY2FsbGVkIGJ5IGEgYFNpZ25lZGAgb3JpZ2luLiBCZWNvbWVzIHRoZSBtYW5hZ2VyL293bmVyIG9mIHRoZSBuZXcoICBwYXJhIElELgBAIyMgRGVwb3NpdHMvRmVlcyEBVGhlIG9yaWdpbiBtdXN0IHJlc2VydmUgYSBkZXBvc2l0IG9mIGBQYXJhRGVwb3NpdGAgZm9yIHRoZSByZWdpc3RyYXRpb24uACQjIyBFdmVudHNZAVRoZSBgUmVzZXJ2ZWRgIGV2ZW50IGlzIGVtaXR0ZWQgaW4gY2FzZSBvZiBzdWNjZXNzLCB3aGljaCBwcm92aWRlcyB0aGUgSUQgcmVzZXJ2ZWQgZm9yEHVzZS4gYWRkX2xvY2sEARBwYXJhaQIBGFBhcmFJZAAGFAkBQWRkIGEgbWFuYWdlciBsb2NrIGZyb20gYSBwYXJhLiBUaGlzIHdpbGwgcHJldmVudCB0aGUgbWFuYWdlciBvZiBhiHBhcmEgdG8gZGVyZWdpc3RlciBvciBzd2FwIGEgcGFyYS4ASQFDYW4gYmUgY2FsbGVkIGJ5IFJvb3QsIHRoZSBwYXJhY2hhaW4sIG9yIHRoZSBwYXJhY2hhaW4gbWFuYWdlciBpZiB0aGUgcGFyYWNoYWluIGlzJHVubG9ja2VkLlRzY2hlZHVsZV9jb2RlX3VwZ3JhZGUIARBwYXJhaQIBGFBhcmFJZAABIG5ld19jb2RlPQUBOFZhbGlkYXRpb25Db2RlAAcsdFNjaGVkdWxlIGEgcGFyYWNoYWluIHVwZ3JhZGUuAFUBVGhpcyB3aWxsIGtpY2sgb2ZmIGEgY2hlY2sgb2YgYG5ld19jb2RlYCBieSBhbGwgdmFsaWRhdG9ycy4gQWZ0ZXIgdGhlIG1ham9yaXR5IG9mIHRoZVUBdmFsaWRhdG9ycyBoYXZlIHJlcG9ydGVkIG9uIHRoZSB2YWxpZGl0eSBvZiB0aGUgY29kZSwgdGhlIGNvZGUgd2lsbCBlaXRoZXIgYmUgZW5hY3RlZFUBb3IgdGhlIHVwZ3JhZGUgd2lsbCBiZSByZWplY3RlZC4gSWYgdGhlIGNvZGUgd2lsbCBiZSBlbmFjdGVkLCB0aGUgY3VycmVudCBjb2RlIG9mIHRoZV0BcGFyYWNoYWluIHdpbGwgYmUgb3ZlcndyaXR0ZW4gZGlyZWN0bHkuIFRoaXMgbWVhbnMgdGhhdCBhbnkgUG9WIHdpbGwgYmUgY2hlY2tlZCBieSB0aGlzXQFuZXcgY29kZS4gVGhlIHBhcmFjaGFpbiBpdHNlbGYgd2lsbCBub3QgYmUgaW5mb3JtZWQgZXhwbGljaXRseSB0aGF0IHRoZSB2YWxpZGF0aW9uIGNvZGUwaGFzIGNoYW5nZWQuAEkBQ2FuIGJlIGNhbGxlZCBieSBSb290LCB0aGUgcGFyYWNoYWluLCBvciB0aGUgcGFyYWNoYWluIG1hbmFnZXIgaWYgdGhlIHBhcmFjaGFpbiBpcyR1bmxvY2tlZC5Ac2V0X2N1cnJlbnRfaGVhZAgBEHBhcmFpAgEYUGFyYUlkAAEgbmV3X2hlYWRBBQEgSGVhZERhdGEACBCEU2V0IHRoZSBwYXJhY2hhaW4ncyBjdXJyZW50IGhlYWQuAEkBQ2FuIGJlIGNhbGxlZCBieSBSb290LCB0aGUgcGFyYWNoYWluLCBvciB0aGUgcGFyYWNoYWluIG1hbmFnZXIgaWYgdGhlIHBhcmFjaGFpbiBpcyR1bmxvY2tlZC4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMuoQUQXHBvbGthZG90X3J1bnRpbWVfY29tbW9uFHNsb3RzGHBhbGxldBBDYWxsBARUAAEMLGZvcmNlX2xlYXNlFAEQcGFyYWkCARhQYXJhSWQAARhsZWFzZXIAATBUOjpBY2NvdW50SWQAARhhbW91bnQYATBCYWxhbmNlT2Y8VD4AATBwZXJpb2RfYmVnaW4QAUBMZWFzZVBlcmlvZE9mPFQ+AAEwcGVyaW9kX2NvdW50EAFATGVhc2VQZXJpb2RPZjxUPgAAEE0BSnVzdCBhIGNvbm5lY3QgaW50byB0aGUgYGxlYXNlX291dGAgY2FsbCwgaW4gY2FzZSBSb290IHdhbnRzIHRvIGZvcmNlIHNvbWUgbGVhc2UgdG/8aGFwcGVuIGluZGVwZW5kZW50bHkgb2YgYW55IG90aGVyIG9uLWNoYWluIG1lY2hhbmlzbSB0byB1c2UgaXQuAPhUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBtYXRjaCBgVDo6Rm9yY2VPcmlnaW5gLkBjbGVhcl9hbGxfbGVhc2VzBAEQcGFyYWkCARhQYXJhSWQAAQxNAUNsZWFyIGFsbCBsZWFzZXMgZm9yIGEgUGFyYSBJZCwgcmVmdW5kaW5nIGFueSBkZXBvc2l0cyBiYWNrIHRvIHRoZSBvcmlnaW5hbCBvd25lcnMuAPhUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBtYXRjaCBgVDo6Rm9yY2VPcmlnaW5gLjx0cmlnZ2VyX29uYm9hcmQEARBwYXJhaQIBGFBhcmFJZAACHCUBVHJ5IHRvIG9uYm9hcmQgYSBwYXJhY2hhaW4gdGhhdCBoYXMgYSBsZWFzZSBmb3IgdGhlIGN1cnJlbnQgbGVhc2UgcGVyaW9kLgBFAVRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWZ1bCBpZiB0aGVyZSB3YXMgc29tZSBzdGF0ZSBpc3N1ZSB3aXRoIGEgcGFyYSB0aGF0IHNob3VsZDkBaGF2ZSBvbmJvYXJkZWQsIGJ1dCB3YXMgdW5hYmxlIHRvLiBBcyBsb25nIGFzIHRoZXkgaGF2ZSBhIGxlYXNlIHBlcmlvZCwgd2UgY2FubGxldCB0aGVtIG9uYm9hcmQgZnJvbSBoZXJlLgDMT3JpZ2luIG11c3QgYmUgc2lnbmVkLCBidXQgY2FuIGJlIGNhbGxlZCBieSBhbnlvbmUuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLqUFEFxwb2xrYWRvdF9ydW50aW1lX2NvbW1vbiBhdWN0aW9ucxhwYWxsZXQQQ2FsbAQEVAABDCxuZXdfYXVjdGlvbggBIGR1cmF0aW9u1AFEQmxvY2tOdW1iZXJGb3I8VD4AAUhsZWFzZV9wZXJpb2RfaW5kZXjUAUBMZWFzZVBlcmlvZE9mPFQ+AAAUVENyZWF0ZSBhIG5ldyBhdWN0aW9uLgBRAVRoaXMgY2FuIG9ubHkgaGFwcGVuIHdoZW4gdGhlcmUgaXNuJ3QgYWxyZWFkeSBhbiBhdWN0aW9uIGluIHByb2dyZXNzIGFuZCBtYXkgb25seSBiZSUBY2FsbGVkIGJ5IHRoZSByb290IG9yaWdpbi4gQWNjZXB0cyB0aGUgYGR1cmF0aW9uYCBvZiB0aGlzIGF1Y3Rpb24gYW5kIHRoZVkBYGxlYXNlX3BlcmlvZF9pbmRleGAgb2YgdGhlIGluaXRpYWwgbGVhc2UgcGVyaW9kIG9mIHRoZSBmb3VyIHRoYXQgYXJlIHRvIGJlIGF1Y3Rpb25lZC4MYmlkFAEQcGFyYakFARhQYXJhSWQAATRhdWN0aW9uX2luZGV41AEwQXVjdGlvbkluZGV4AAEoZmlyc3Rfc2xvdNQBQExlYXNlUGVyaW9kT2Y8VD4AASRsYXN0X3Nsb3TUAUBMZWFzZVBlcmlvZE9mPFQ+AAEYYW1vdW505AEwQmFsYW5jZU9mPFQ+AAFASQFNYWtlIGEgbmV3IGJpZCBmcm9tIGFuIGFjY291bnQgKGluY2x1ZGluZyBhIHBhcmFjaGFpbiBhY2NvdW50KSBmb3IgZGVwbG95aW5nIGEgbmV3KHBhcmFjaGFpbi4AWQFNdWx0aXBsZSBzaW11bHRhbmVvdXMgYmlkcyBmcm9tIHRoZSBzYW1lIGJpZGRlciBhcmUgYWxsb3dlZCBvbmx5IGFzIGxvbmcgYXMgYWxsIGFjdGl2ZT0BYmlkcyBvdmVybGFwIGVhY2ggb3RoZXIgKGkuZS4gYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZSkuIEJpZHMgY2Fubm90IGJlIHJlZGFjdGVkLgBVAS0gYHN1YmAgaXMgdGhlIHN1Yi1iaWRkZXIgSUQsIGFsbG93aW5nIGZvciBtdWx0aXBsZSBjb21wZXRpbmcgYmlkcyB0byBiZSBtYWRlIGJ5IChhbmRwZnVuZGVkIGJ5KSB0aGUgc2FtZSBhY2NvdW50Lk0BLSBgYXVjdGlvbl9pbmRleGAgaXMgdGhlIGluZGV4IG9mIHRoZSBhdWN0aW9uIHRvIGJpZCBvbi4gU2hvdWxkIGp1c3QgYmUgdGhlIHByZXNlbnRodmFsdWUgb2YgYEF1Y3Rpb25Db3VudGVyYC5JAS0gYGZpcnN0X3Nsb3RgIGlzIHRoZSBmaXJzdCBsZWFzZSBwZXJpb2QgaW5kZXggb2YgdGhlIHJhbmdlIHRvIGJpZCBvbi4gVGhpcyBpcyB0aGUJAWFic29sdXRlIGxlYXNlIHBlcmlvZCBpbmRleCB2YWx1ZSwgbm90IGFuIGF1Y3Rpb24tc3BlY2lmaWMgb2Zmc2V0LkEBLSBgbGFzdF9zbG90YCBpcyB0aGUgbGFzdCBsZWFzZSBwZXJpb2QgaW5kZXggb2YgdGhlIHJhbmdlIHRvIGJpZCBvbi4gVGhpcyBpcyB0aGUJAWFic29sdXRlIGxlYXNlIHBlcmlvZCBpbmRleCB2YWx1ZSwgbm90IGFuIGF1Y3Rpb24tc3BlY2lmaWMgb2Zmc2V0LkkBLSBgYW1vdW50YCBpcyB0aGUgYW1vdW50IHRvIGJpZCB0byBiZSBoZWxkIGFzIGRlcG9zaXQgZm9yIHRoZSBwYXJhY2hhaW4gc2hvdWxkIHRoZchiaWQgd2luLiBUaGlzIGFtb3VudCBpcyBoZWxkIHRocm91Z2hvdXQgdGhlIHJhbmdlLjhjYW5jZWxfYXVjdGlvbgACDHhDYW5jZWwgYW4gaW4tcHJvZ3Jlc3MgYXVjdGlvbi4AiENhbiBvbmx5IGJlIGNhbGxlZCBieSBSb290IG9yaWdpbi4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMuqQUAAAZpAgCtBRBccG9sa2Fkb3RfcnVudGltZV9jb21tb24kY3Jvd2Rsb2FuGHBhbGxldBBDYWxsBARUAAEkGGNyZWF0ZRgBFGluZGV4qQUBGFBhcmFJZAABDGNhcOQBMEJhbGFuY2VPZjxUPgABMGZpcnN0X3BlcmlvZNQBQExlYXNlUGVyaW9kT2Y8VD4AASxsYXN0X3BlcmlvZNQBQExlYXNlUGVyaW9kT2Y8VD4AAQxlbmTUAURCbG9ja051bWJlckZvcjxUPgABIHZlcmlmaWVysQUBTE9wdGlvbjxNdWx0aVNpZ25lcj4AABRNAUNyZWF0ZSBhIG5ldyBjcm93ZGxvYW5pbmcgY2FtcGFpZ24gZm9yIGEgcGFyYWNoYWluIHNsb3Qgd2l0aCB0aGUgZ2l2ZW4gbGVhc2UgcGVyaW9kGHJhbmdlLgBdAVRoaXMgYXBwbGllcyBhIGxvY2sgdG8geW91ciBwYXJhY2hhaW4gY29uZmlndXJhdGlvbiwgZW5zdXJpbmcgdGhhdCBpdCBjYW5ub3QgYmUgY2hhbmdlZGRieSB0aGUgcGFyYWNoYWluIG1hbmFnZXIuKGNvbnRyaWJ1dGUMARRpbmRleKkFARhQYXJhSWQAARR2YWx1ZeQBMEJhbGFuY2VPZjxUPgABJHNpZ25hdHVyZbkFAVhPcHRpb248TXVsdGlTaWduYXR1cmU+AAEIUQFDb250cmlidXRlIHRvIGEgY3Jvd2Qgc2FsZS4gVGhpcyB3aWxsIHRyYW5zZmVyIHNvbWUgYmFsYW5jZSBvdmVyIHRvIGZ1bmQgYSBwYXJhY2hhaW5RAXNsb3QuIEl0IHdpbGwgYmUgd2l0aGRyYXdhYmxlIHdoZW4gdGhlIGNyb3dkbG9hbiBoYXMgZW5kZWQgYW5kIHRoZSBmdW5kcyBhcmUgdW51c2VkLiB3aXRoZHJhdwgBDHdobwABMFQ6OkFjY291bnRJZAABFGluZGV4qQUBGFBhcmFJZAACRMBXaXRoZHJhdyBmdWxsIGJhbGFuY2Ugb2YgYSBzcGVjaWZpYyBjb250cmlidXRvci4AwE9yaWdpbiBtdXN0IGJlIHNpZ25lZCwgYnV0IGNhbiBjb21lIGZyb20gYW55b25lLgBdAVRoZSBmdW5kIG11c3QgYmUgZWl0aGVyIGluLCBvciByZWFkeSBmb3IsIHJldGlyZW1lbnQuIEZvciBhIGZ1bmQgdG8gYmUgKmluKiByZXRpcmVtZW50LEkBdGhlbiB0aGUgcmV0aXJlbWVudCBmbGFnIG11c3QgYmUgc2V0LiBGb3IgYSBmdW5kIHRvIGJlIHJlYWR5IGZvciByZXRpcmVtZW50LCB0aGVuOpwtIGl0IG11c3Qgbm90IGFscmVhZHkgYmUgaW4gcmV0aXJlbWVudDtNAS0gdGhlIGFtb3VudCBvZiByYWlzZWQgZnVuZHMgbXVzdCBiZSBiaWdnZXIgdGhhbiB0aGUgX2ZyZWVfIGJhbGFuY2Ugb2YgdGhlIGFjY291bnQ7NC0gYW5kIGVpdGhlcjq8ICAtIHRoZSBibG9jayBudW1iZXIgbXVzdCBiZSBhdCBsZWFzdCBgZW5kYDsgb3ItASAgLSB0aGUgY3VycmVudCBsZWFzZSBwZXJpb2QgbXVzdCBiZSBncmVhdGVyIHRoYW4gdGhlIGZ1bmQncyBgbGFzdF9wZXJpb2RgLgBVAUluIHRoaXMgY2FzZSwgdGhlIGZ1bmQncyByZXRpcmVtZW50IGZsYWcgaXMgc2V0IGFuZCBpdHMgYGVuZGAgaXMgcmVzZXQgdG8gdGhlIGN1cnJlbnQ0YmxvY2sgbnVtYmVyLgDwLSBgd2hvYDogVGhlIGFjY291bnQgd2hvc2UgY29udHJpYnV0aW9uIHNob3VsZCBiZSB3aXRoZHJhd24uGQEtIGBpbmRleGA6IFRoZSBwYXJhY2hhaW4gdG8gd2hvc2UgY3Jvd2Rsb2FuIHRoZSBjb250cmlidXRpb24gd2FzIG1hZGUuGHJlZnVuZAQBFGluZGV4qQUBGFBhcmFJZAADFOBBdXRvbWF0aWNhbGx5IHJlZnVuZCBjb250cmlidXRvcnMgb2YgYW4gZW5kZWQgY3Jvd2Rsb2FuLiEBRHVlIHRvIHdlaWdodCByZXN0cmljdGlvbnMsIHRoaXMgZnVuY3Rpb24gbWF5IG5lZWQgdG8gYmUgY2FsbGVkIG11bHRpcGxlSQF0aW1lcyB0byBmdWxseSByZWZ1bmQgYWxsIHVzZXJzLiBXZSB3aWxsIHJlZnVuZCBgUmVtb3ZlS2V5c0xpbWl0YCB1c2VycyBhdCBhIHRpbWUuAMBPcmlnaW4gbXVzdCBiZSBzaWduZWQsIGJ1dCBjYW4gY29tZSBmcm9tIGFueW9uZS4gZGlzc29sdmUEARRpbmRleKkFARhQYXJhSWQABARVAVJlbW92ZSBhIGZ1bmQgYWZ0ZXIgdGhlIHJldGlyZW1lbnQgcGVyaW9kIGhhcyBlbmRlZCBhbmQgYWxsIGZ1bmRzIGhhdmUgYmVlbiByZXR1cm5lZC4QZWRpdBgBFGluZGV4qQUBGFBhcmFJZAABDGNhcOQBMEJhbGFuY2VPZjxUPgABMGZpcnN0X3BlcmlvZNQBQExlYXNlUGVyaW9kT2Y8VD4AASxsYXN0X3BlcmlvZNQBQExlYXNlUGVyaW9kT2Y8VD4AAQxlbmTUAURCbG9ja051bWJlckZvcjxUPgABIHZlcmlmaWVysQUBTE9wdGlvbjxNdWx0aVNpZ25lcj4ABQzQRWRpdCB0aGUgY29uZmlndXJhdGlvbiBmb3IgYW4gaW4tcHJvZ3Jlc3MgY3Jvd2Rsb2FuLgCIQ2FuIG9ubHkgYmUgY2FsbGVkIGJ5IFJvb3Qgb3JpZ2luLiBhZGRfbWVtbwgBFGluZGV4aQIBGFBhcmFJZAABEG1lbW84ARxWZWM8dTg+AAYM7EFkZCBhbiBvcHRpb25hbCBtZW1vIHRvIGFuIGV4aXN0aW5nIGNyb3dkbG9hbiBjb250cmlidXRpb24uAC0BT3JpZ2luIG11c3QgYmUgU2lnbmVkLCBhbmQgdGhlIHVzZXIgbXVzdCBoYXZlIGNvbnRyaWJ1dGVkIHRvIHRoZSBjcm93ZGxvYW4uEHBva2UEARRpbmRleGkCARhQYXJhSWQABwx0UG9rZSB0aGUgZnVuZCBpbnRvIGBOZXdSYWlzZWAA3E9yaWdpbiBtdXN0IGJlIFNpZ25lZCwgYW5kIHRoZSBmdW5kIGhhcyBub24temVybyByYWlzZS44Y29udHJpYnV0ZV9hbGwIARRpbmRleKkFARhQYXJhSWQAASRzaWduYXR1cmW5BQFYT3B0aW9uPE11bHRpU2lnbmF0dXJlPgAIDGEBQ29udHJpYnV0ZSB5b3VyIGVudGlyZSBiYWxhbmNlIHRvIGEgY3Jvd2Qgc2FsZS4gVGhpcyB3aWxsIHRyYW5zZmVyIHRoZSBlbnRpcmUgYmFsYW5jZSBvZlEBYSB1c2VyIG92ZXIgdG8gZnVuZCBhIHBhcmFjaGFpbiBzbG90LiBJdCB3aWxsIGJlIHdpdGhkcmF3YWJsZSB3aGVuIHRoZSBjcm93ZGxvYW4gaGFzfGVuZGVkIGFuZCB0aGUgZnVuZHMgYXJlIHVudXNlZC4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMusQUEGE9wdGlvbgQEVAG1BQEIEE5vbmUAAAAQU29tZQQAtQUAAAEAALUFCChzcF9ydW50aW1lLE11bHRpU2lnbmVyAAEMHEVkMjU1MTkEAAQBPGVkMjU1MTk6OlB1YmxpYwAAABxTcjI1NTE5BAAEATxzcjI1NTE5OjpQdWJsaWMAAQAURWNkc2EEAAkCATRlY2RzYTo6UHVibGljAAIAALkFBBhPcHRpb24EBFQBvQUBCBBOb25lAAAAEFNvbWUEAL0FAAABAAC9BQgoc3BfcnVudGltZThNdWx0aVNpZ25hdHVyZQABDBxFZDI1NTE5BAAlAgFIZWQyNTUxOTo6U2lnbmF0dXJlAAAAHFNyMjU1MTkEACUCAUhzcjI1NTE5OjpTaWduYXR1cmUAAQAURWNkc2EEAL0CAUBlY2RzYTo6U2lnbmF0dXJlAAIAAMEFEGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMgY29yZXRpbWUYcGFsbGV0EENhbGwEBFQAAQxIcmVxdWVzdF9jb3JlX2NvdW50BAEUY291bnRVAQEMdTE2AAEYUQFSZXF1ZXN0IHRoZSBjb25maWd1cmF0aW9uIHRvIGJlIHVwZGF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBjb3Jlcy4gV2FybmluZzpRAVNpbmNlIHRoaXMgb25seSBzY2hlZHVsZXMgYSBjb25maWd1cmF0aW9uIHVwZGF0ZSwgaXQgdGFrZXMgdHdvIHNlc3Npb25zIHRvIGNvbWUgaW50bxxlZmZlY3QuAJgtIGBvcmlnaW5gOiBSb290IG9yIHRoZSBDb3JldGltZSBDaGFpboAtIGBjb3VudGA6IHRvdGFsIG51bWJlciBvZiBjb3Jlc0hyZXF1ZXN0X3JldmVudWVfYXQEARB3aGVuEAEsQmxvY2tOdW1iZXIAAhBhAVJlcXVlc3QgdG8gY2xhaW0gdGhlIGluc3RhbnRhbmVvdXMgY29yZXRpbWUgc2FsZXMgcmV2ZW51ZSBzdGFydGluZyBmcm9tIHRoZSBibG9jayBpdCB3YXNdAWxhc3QgY2xhaW1lZCB1bnRpbCBhbmQgdXAgdG8gdGhlIGJsb2NrIHNwZWNpZmllZC4gVGhlIGNsYWltZWQgYW1vdW50IHZhbHVlIGlzIHNlbnQgYmFja1EBdG8gdGhlIENvcmV0aW1lIGNoYWluIGluIGEgYG5vdGlmeV9yZXZlbnVlYCBtZXNzYWdlLiBBdCB0aGUgc2FtZSB0aW1lLCB0aGUgYW1vdW50IGlzhHRlbGVwb3J0ZWQgdG8gdGhlIENvcmV0aW1lIGNoYWluLixhc3NpZ25fY29yZRABEGNvcmVVAQE8QnJva2VyQ29yZUluZGV4AAEUYmVnaW4QAURCbG9ja051bWJlckZvcjxUPgABKGFzc2lnbm1lbnTFBQGMVmVjPChDb3JlQXNzaWdubWVudCwgUGFydHNPZjU3NjAwKT4AASBlbmRfaGludD0CAWRPcHRpb248QmxvY2tOdW1iZXJGb3I8VD4+AAQkWQFSZWNlaXZlIGluc3RydWN0aW9ucyBmcm9tIHRoZSBgRXh0ZXJuYWxCcm9rZXJPcmlnaW5gLCBkZXRhaWxpbmcgaG93IGEgc3BlY2lmaWMgY29yZSBpcyx0byBiZSB1c2VkLgAsUGFyYW1ldGVyczohAS1gb3JpZ2luYDogVGhlIGBFeHRlcm5hbEJyb2tlck9yaWdpbmAsIGFzc3VtZWQgdG8gYmUgdGhlIGNvcmV0aW1lIGNoYWluLqwtYGNvcmVgOiBUaGUgY29yZSB0aGF0IHNob3VsZCBiZSBzY2hlZHVsZWQu2C1gYmVnaW5gOiBUaGUgc3RhcnRpbmcgYmxvY2toZWlnaHQgb2YgdGhlIGluc3RydWN0aW9uLtQtYGFzc2lnbm1lbnRgOiBIb3cgdGhlIGJsb2Nrc3BhY2Ugc2hvdWxkIGJlIHV0aWxpc2VkLlkBLWBlbmRfaGludGA6IEFuIG9wdGlvbmFsIGhpbnQgYXMgdG8gd2hlbiB0aGlzIHBhcnRpY3VsYXIgc2V0IG9mIGluc3RydWN0aW9ucyB3aWxsIGVuZC4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMuxQUAAALJBQDJBQAABAjNBdEFAM0FDDRwYWxsZXRfYnJva2VySGNvcmV0aW1lX2ludGVyZmFjZThDb3JlQXNzaWdubWVudAABDBBJZGxlAAAAEFBvb2wAAQAQVGFzawQAEAEYVGFza0lkAAIAANEFDGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnNEYXNzaWduZXJfY29yZXRpbWUwUGFydHNPZjU3NjAwAAAEAFUBAQx1MTYAANUFDChwYWxsZXRfeGNtGHBhbGxldBBDYWxsBARUAAE4EHNlbmQIARBkZXN0LQEBWEJveDxWZXJzaW9uZWRMb2NhdGlvbj4AARxtZXNzYWdl2QUBVEJveDxWZXJzaW9uZWRYY208KCk+PgAAADx0ZWxlcG9ydF9hc3NldHMQARBkZXN0LQEBWEJveDxWZXJzaW9uZWRMb2NhdGlvbj4AASxiZW5lZmljaWFyeS0BAVhCb3g8VmVyc2lvbmVkTG9jYXRpb24+AAEYYXNzZXRz2QYBUEJveDxWZXJzaW9uZWRBc3NldHM+AAE4ZmVlX2Fzc2V0X2l0ZW0QAQx1MzIAAUgRAVRlbGVwb3J0IHNvbWUgYXNzZXRzIGZyb20gdGhlIGxvY2FsIGNoYWluIHRvIHNvbWUgZGVzdGluYXRpb24gY2hhaW4uAB0BKipUaGlzIGZ1bmN0aW9uIGlzIGRlcHJlY2F0ZWQ6IFVzZSBgbGltaXRlZF90ZWxlcG9ydF9hc3NldHNgIGluc3RlYWQuKioAUQFGZWUgcGF5bWVudCBvbiB0aGUgZGVzdGluYXRpb24gc2lkZSBpcyBtYWRlIGZyb20gdGhlIGFzc2V0IGluIHRoZSBgYXNzZXRzYCB2ZWN0b3Igb2ZhAWluZGV4IGBmZWVfYXNzZXRfaXRlbWAuIFRoZSB3ZWlnaHQgbGltaXQgZm9yIGZlZXMgaXMgbm90IHByb3ZpZGVkIGFuZCB0aHVzIGlzIHVubGltaXRlZCy0d2l0aCBhbGwgZmVlcyB0YWtlbiBhcyBuZWVkZWQgZnJvbSB0aGUgYXNzZXQuACkBLSBgb3JpZ2luYDogTXVzdCBiZSBjYXBhYmxlIG9mIHdpdGhkcmF3aW5nIHRoZSBgYXNzZXRzYCBhbmQgZXhlY3V0aW5nIFhDTS4lAS0gYGRlc3RgOiBEZXN0aW5hdGlvbiBjb250ZXh0IGZvciB0aGUgYXNzZXRzLiBXaWxsIHR5cGljYWxseSBiZSBgW1BhcmVudCxhASAgUGFyYWNoYWluKC4uKV1gIHRvIHNlbmQgZnJvbSBwYXJhY2hhaW4gdG8gcGFyYWNoYWluLCBvciBgW1BhcmFjaGFpbiguLildYCB0byBzZW5kIGZyb21UICByZWxheSB0byBwYXJhY2hhaW4uVQEtIGBiZW5lZmljaWFyeWA6IEEgYmVuZWZpY2lhcnkgbG9jYXRpb24gZm9yIHRoZSBhc3NldHMgaW4gdGhlIGNvbnRleHQgb2YgYGRlc3RgLiBXaWxsmCAgZ2VuZXJhbGx5IGJlIGFuIGBBY2NvdW50SWQzMmAgdmFsdWUuWQEtIGBhc3NldHNgOiBUaGUgYXNzZXRzIHRvIGJlIHdpdGhkcmF3bi4gVGhpcyBzaG91bGQgaW5jbHVkZSB0aGUgYXNzZXRzIHVzZWQgdG8gcGF5IHRoZWggIGZlZSBvbiB0aGUgYGRlc3RgIGNoYWluLk0BLSBgZmVlX2Fzc2V0X2l0ZW1gOiBUaGUgaW5kZXggaW50byBgYXNzZXRzYCBvZiB0aGUgaXRlbSB3aGljaCBzaG91bGQgYmUgdXNlZCB0byBwYXkcICBmZWVzLlxyZXNlcnZlX3RyYW5zZmVyX2Fzc2V0cxABEGRlc3QtAQFYQm94PFZlcnNpb25lZExvY2F0aW9uPgABLGJlbmVmaWNpYXJ5LQEBWEJveDxWZXJzaW9uZWRMb2NhdGlvbj4AARhhc3NldHPZBgFQQm94PFZlcnNpb25lZEFzc2V0cz4AAThmZWVfYXNzZXRfaXRlbRABDHUzMgACeF0BVHJhbnNmZXIgc29tZSBhc3NldHMgZnJvbSB0aGUgbG9jYWwgY2hhaW4gdG8gdGhlIGRlc3RpbmF0aW9uIGNoYWluIHRocm91Z2ggdGhlaXIgbG9jYWwseGRlc3RpbmF0aW9uIG9yIHJlbW90ZSByZXNlcnZlLgA9AWBhc3NldHNgIG11c3QgaGF2ZSBzYW1lIHJlc2VydmUgbG9jYXRpb24gYW5kIG1heSBub3QgYmUgdGVsZXBvcnRhYmxlIHRvIGBkZXN0YC5NASAtIGBhc3NldHNgIGhhdmUgbG9jYWwgcmVzZXJ2ZTogdHJhbnNmZXIgYXNzZXRzIHRvIHNvdmVyZWlnbiBhY2NvdW50IG9mIGRlc3RpbmF0aW9uTQEgICBjaGFpbiBhbmQgZm9yd2FyZCBhIG5vdGlmaWNhdGlvbiBYQ00gdG8gYGRlc3RgIHRvIG1pbnQgYW5kIGRlcG9zaXQgcmVzZXJ2ZS1iYXNlZGwgICBhc3NldHMgdG8gYGJlbmVmaWNpYXJ5YC5VASAtIGBhc3NldHNgIGhhdmUgZGVzdGluYXRpb24gcmVzZXJ2ZTogYnVybiBsb2NhbCBhc3NldHMgYW5kIGZvcndhcmQgYSBub3RpZmljYXRpb24gdG9ZASAgIGBkZXN0YCBjaGFpbiB0byB3aXRoZHJhdyB0aGUgcmVzZXJ2ZSBhc3NldHMgZnJvbSB0aGlzIGNoYWluJ3Mgc292ZXJlaWduIGFjY291bnQgYW5khCAgIGRlcG9zaXQgdGhlbSB0byBgYmVuZWZpY2lhcnlgLmEBIC0gYGFzc2V0c2AgaGF2ZSByZW1vdGUgcmVzZXJ2ZTogYnVybiBsb2NhbCBhc3NldHMsIGZvcndhcmQgWENNIHRvIHJlc2VydmUgY2hhaW4gdG8gbW92ZWEBICAgcmVzZXJ2ZXMgZnJvbSB0aGlzIGNoYWluJ3MgU0EgdG8gYGRlc3RgIGNoYWluJ3MgU0EsIGFuZCBmb3J3YXJkIGFub3RoZXIgWENNIHRvIGBkZXN0YPQgICB0byBtaW50IGFuZCBkZXBvc2l0IHJlc2VydmUtYmFzZWQgYXNzZXRzIHRvIGBiZW5lZmljaWFyeWAuAD0BKipUaGlzIGZ1bmN0aW9uIGlzIGRlcHJlY2F0ZWQ6IFVzZSBgbGltaXRlZF9yZXNlcnZlX3RyYW5zZmVyX2Fzc2V0c2AgaW5zdGVhZC4qKgBRAUZlZSBwYXltZW50IG9uIHRoZSBkZXN0aW5hdGlvbiBzaWRlIGlzIG1hZGUgZnJvbSB0aGUgYXNzZXQgaW4gdGhlIGBhc3NldHNgIHZlY3RvciBvZmEBaW5kZXggYGZlZV9hc3NldF9pdGVtYC4gVGhlIHdlaWdodCBsaW1pdCBmb3IgZmVlcyBpcyBub3QgcHJvdmlkZWQgYW5kIHRodXMgaXMgdW5saW1pdGVkLLR3aXRoIGFsbCBmZWVzIHRha2VuIGFzIG5lZWRlZCBmcm9tIHRoZSBhc3NldC4AKQEtIGBvcmlnaW5gOiBNdXN0IGJlIGNhcGFibGUgb2Ygd2l0aGRyYXdpbmcgdGhlIGBhc3NldHNgIGFuZCBleGVjdXRpbmcgWENNLiUBLSBgZGVzdGA6IERlc3RpbmF0aW9uIGNvbnRleHQgZm9yIHRoZSBhc3NldHMuIFdpbGwgdHlwaWNhbGx5IGJlIGBbUGFyZW50LGEBICBQYXJhY2hhaW4oLi4pXWAgdG8gc2VuZCBmcm9tIHBhcmFjaGFpbiB0byBwYXJhY2hhaW4sIG9yIGBbUGFyYWNoYWluKC4uKV1gIHRvIHNlbmQgZnJvbVQgIHJlbGF5IHRvIHBhcmFjaGFpbi5VAS0gYGJlbmVmaWNpYXJ5YDogQSBiZW5lZmljaWFyeSBsb2NhdGlvbiBmb3IgdGhlIGFzc2V0cyBpbiB0aGUgY29udGV4dCBvZiBgZGVzdGAuIFdpbGyYICBnZW5lcmFsbHkgYmUgYW4gYEFjY291bnRJZDMyYCB2YWx1ZS5ZAS0gYGFzc2V0c2A6IFRoZSBhc3NldHMgdG8gYmUgd2l0aGRyYXduLiBUaGlzIHNob3VsZCBpbmNsdWRlIHRoZSBhc3NldHMgdXNlZCB0byBwYXkgdGhlyCAgZmVlIG9uIHRoZSBgZGVzdGAgKGFuZCBwb3NzaWJseSByZXNlcnZlKSBjaGFpbnMuTQEtIGBmZWVfYXNzZXRfaXRlbWA6IFRoZSBpbmRleCBpbnRvIGBhc3NldHNgIG9mIHRoZSBpdGVtIHdoaWNoIHNob3VsZCBiZSB1c2VkIHRvIHBheRwgIGZlZXMuHGV4ZWN1dGUIARxtZXNzYWdl3QYBtEJveDxWZXJzaW9uZWRYY208PFQgYXMgQ29uZmlnPjo6UnVudGltZUNhbGw+PgABKG1heF93ZWlnaHQoARhXZWlnaHQAAyDQRXhlY3V0ZSBhbiBYQ00gbWVzc2FnZSBmcm9tIGEgbG9jYWwsIHNpZ25lZCwgb3JpZ2luLgBNAUFuIGV2ZW50IGlzIGRlcG9zaXRlZCBpbmRpY2F0aW5nIHdoZXRoZXIgYG1zZ2AgY291bGQgYmUgZXhlY3V0ZWQgY29tcGxldGVseSBvciBvbmx5KHBhcnRpYWxseS4AXQFObyBtb3JlIHRoYW4gYG1heF93ZWlnaHRgIHdpbGwgYmUgdXNlZCBpbiBpdHMgYXR0ZW1wdGVkIGV4ZWN1dGlvbi4gSWYgdGhpcyBpcyBsZXNzIHRoYW5BAXRoZSBtYXhpbXVtIGFtb3VudCBvZiB3ZWlnaHQgdGhhdCB0aGUgbWVzc2FnZSBjb3VsZCB0YWtlIHRvIGJlIGV4ZWN1dGVkLCB0aGVuIG5vfGV4ZWN1dGlvbiBhdHRlbXB0IHdpbGwgYmUgbWFkZS5EZm9yY2VfeGNtX3ZlcnNpb24IASBsb2NhdGlvbvQBNEJveDxMb2NhdGlvbj4AARx2ZXJzaW9uEAEoWGNtVmVyc2lvbgAEGEkBRXh0b2xsIHRoYXQgYSBwYXJ0aWN1bGFyIGRlc3RpbmF0aW9uIGNhbiBiZSBjb21tdW5pY2F0ZWQgd2l0aCB0aHJvdWdoIGEgcGFydGljdWxhcjx2ZXJzaW9uIG9mIFhDTS4A3C0gYG9yaWdpbmA6IE11c3QgYmUgYW4gb3JpZ2luIHNwZWNpZmllZCBieSBBZG1pbk9yaWdpbi7YLSBgbG9jYXRpb25gOiBUaGUgZGVzdGluYXRpb24gdGhhdCBpcyBiZWluZyBkZXNjcmliZWQuEQEtIGB4Y21fdmVyc2lvbmA6IFRoZSBsYXRlc3QgdmVyc2lvbiBvZiBYQ00gdGhhdCBgbG9jYXRpb25gIHN1cHBvcnRzLmRmb3JjZV9kZWZhdWx0X3hjbV92ZXJzaW9uBAFEbWF5YmVfeGNtX3ZlcnNpb249AgFIT3B0aW9uPFhjbVZlcnNpb24+AAUUWQFTZXQgYSBzYWZlIFhDTSB2ZXJzaW9uICh0aGUgdmVyc2lvbiB0aGF0IFhDTSBzaG91bGQgYmUgZW5jb2RlZCB3aXRoIGlmIHRoZSBtb3N0IHJlY2VudLR2ZXJzaW9uIGEgZGVzdGluYXRpb24gY2FuIGFjY2VwdCBpcyB1bmtub3duKS4A3C0gYG9yaWdpbmA6IE11c3QgYmUgYW4gb3JpZ2luIHNwZWNpZmllZCBieSBBZG1pbk9yaWdpbi45AS0gYG1heWJlX3hjbV92ZXJzaW9uYDogVGhlIGRlZmF1bHQgWENNIGVuY29kaW5nIHZlcnNpb24sIG9yIGBOb25lYCB0byBkaXNhYmxlLnhmb3JjZV9zdWJzY3JpYmVfdmVyc2lvbl9ub3RpZnkEASBsb2NhdGlvbi0BAVhCb3g8VmVyc2lvbmVkTG9jYXRpb24+AAYQOQFBc2sgYSBsb2NhdGlvbiB0byBub3RpZnkgdXMgcmVnYXJkaW5nIHRoZWlyIFhDTSB2ZXJzaW9uIGFuZCBhbnkgY2hhbmdlcyB0byBpdC4A3C0gYG9yaWdpbmA6IE11c3QgYmUgYW4gb3JpZ2luIHNwZWNpZmllZCBieSBBZG1pbk9yaWdpbi5ZAS0gYGxvY2F0aW9uYDogVGhlIGxvY2F0aW9uIHRvIHdoaWNoIHdlIHNob3VsZCBzdWJzY3JpYmUgZm9yIFhDTSB2ZXJzaW9uIG5vdGlmaWNhdGlvbnMugGZvcmNlX3Vuc3Vic2NyaWJlX3ZlcnNpb25fbm90aWZ5BAEgbG9jYXRpb24tAQFYQm94PFZlcnNpb25lZExvY2F0aW9uPgAHGEkBUmVxdWlyZSB0aGF0IGEgcGFydGljdWxhciBkZXN0aW5hdGlvbiBzaG91bGQgbm8gbG9uZ2VyIG5vdGlmeSB1cyByZWdhcmRpbmcgYW55IFhDTUB2ZXJzaW9uIGNoYW5nZXMuANwtIGBvcmlnaW5gOiBNdXN0IGJlIGFuIG9yaWdpbiBzcGVjaWZpZWQgYnkgQWRtaW5PcmlnaW4uPQEtIGBsb2NhdGlvbmA6IFRoZSBsb2NhdGlvbiB0byB3aGljaCB3ZSBhcmUgY3VycmVudGx5IHN1YnNjcmliZWQgZm9yIFhDTSB2ZXJzaW9uqCAgbm90aWZpY2F0aW9ucyB3aGljaCB3ZSBubyBsb25nZXIgZGVzaXJlLnxsaW1pdGVkX3Jlc2VydmVfdHJhbnNmZXJfYXNzZXRzFAEQZGVzdC0BAVhCb3g8VmVyc2lvbmVkTG9jYXRpb24+AAEsYmVuZWZpY2lhcnktAQFYQm94PFZlcnNpb25lZExvY2F0aW9uPgABGGFzc2V0c9kGAVBCb3g8VmVyc2lvbmVkQXNzZXRzPgABOGZlZV9hc3NldF9pdGVtEAEMdTMyAAEwd2VpZ2h0X2xpbWl0jQYBLFdlaWdodExpbWl0AAh4XQFUcmFuc2ZlciBzb21lIGFzc2V0cyBmcm9tIHRoZSBsb2NhbCBjaGFpbiB0byB0aGUgZGVzdGluYXRpb24gY2hhaW4gdGhyb3VnaCB0aGVpciBsb2NhbCx4ZGVzdGluYXRpb24gb3IgcmVtb3RlIHJlc2VydmUuAD0BYGFzc2V0c2AgbXVzdCBoYXZlIHNhbWUgcmVzZXJ2ZSBsb2NhdGlvbiBhbmQgbWF5IG5vdCBiZSB0ZWxlcG9ydGFibGUgdG8gYGRlc3RgLk0BIC0gYGFzc2V0c2AgaGF2ZSBsb2NhbCByZXNlcnZlOiB0cmFuc2ZlciBhc3NldHMgdG8gc292ZXJlaWduIGFjY291bnQgb2YgZGVzdGluYXRpb25NASAgIGNoYWluIGFuZCBmb3J3YXJkIGEgbm90aWZpY2F0aW9uIFhDTSB0byBgZGVzdGAgdG8gbWludCBhbmQgZGVwb3NpdCByZXNlcnZlLWJhc2VkbCAgIGFzc2V0cyB0byBgYmVuZWZpY2lhcnlgLlUBIC0gYGFzc2V0c2AgaGF2ZSBkZXN0aW5hdGlvbiByZXNlcnZlOiBidXJuIGxvY2FsIGFzc2V0cyBhbmQgZm9yd2FyZCBhIG5vdGlmaWNhdGlvbiB0b1kBICAgYGRlc3RgIGNoYWluIHRvIHdpdGhkcmF3IHRoZSByZXNlcnZlIGFzc2V0cyBmcm9tIHRoaXMgY2hhaW4ncyBzb3ZlcmVpZ24gYWNjb3VudCBhbmSEICAgZGVwb3NpdCB0aGVtIHRvIGBiZW5lZmljaWFyeWAuYQEgLSBgYXNzZXRzYCBoYXZlIHJlbW90ZSByZXNlcnZlOiBidXJuIGxvY2FsIGFzc2V0cywgZm9yd2FyZCBYQ00gdG8gcmVzZXJ2ZSBjaGFpbiB0byBtb3ZlYQEgICByZXNlcnZlcyBmcm9tIHRoaXMgY2hhaW4ncyBTQSB0byBgZGVzdGAgY2hhaW4ncyBTQSwgYW5kIGZvcndhcmQgYW5vdGhlciBYQ00gdG8gYGRlc3Rg9CAgIHRvIG1pbnQgYW5kIGRlcG9zaXQgcmVzZXJ2ZS1iYXNlZCBhc3NldHMgdG8gYGJlbmVmaWNpYXJ5YC4AUQFGZWUgcGF5bWVudCBvbiB0aGUgZGVzdGluYXRpb24gc2lkZSBpcyBtYWRlIGZyb20gdGhlIGFzc2V0IGluIHRoZSBgYXNzZXRzYCB2ZWN0b3Igb2ZhAWluZGV4IGBmZWVfYXNzZXRfaXRlbWAsIHVwIHRvIGVub3VnaCB0byBwYXkgZm9yIGB3ZWlnaHRfbGltaXRgIG9mIHdlaWdodC4gSWYgbW9yZSB3ZWlnaHRZAWlzIG5lZWRlZCB0aGFuIGB3ZWlnaHRfbGltaXRgLCB0aGVuIHRoZSBvcGVyYXRpb24gd2lsbCBmYWlsIGFuZCB0aGUgc2VudCBhc3NldHMgbWF5IGJlIGF0IHJpc2suACkBLSBgb3JpZ2luYDogTXVzdCBiZSBjYXBhYmxlIG9mIHdpdGhkcmF3aW5nIHRoZSBgYXNzZXRzYCBhbmQgZXhlY3V0aW5nIFhDTS4lAS0gYGRlc3RgOiBEZXN0aW5hdGlvbiBjb250ZXh0IGZvciB0aGUgYXNzZXRzLiBXaWxsIHR5cGljYWxseSBiZSBgW1BhcmVudCxhASAgUGFyYWNoYWluKC4uKV1gIHRvIHNlbmQgZnJvbSBwYXJhY2hhaW4gdG8gcGFyYWNoYWluLCBvciBgW1BhcmFjaGFpbiguLildYCB0byBzZW5kIGZyb21UICByZWxheSB0byBwYXJhY2hhaW4uVQEtIGBiZW5lZmljaWFyeWA6IEEgYmVuZWZpY2lhcnkgbG9jYXRpb24gZm9yIHRoZSBhc3NldHMgaW4gdGhlIGNvbnRleHQgb2YgYGRlc3RgLiBXaWxsmCAgZ2VuZXJhbGx5IGJlIGFuIGBBY2NvdW50SWQzMmAgdmFsdWUuWQEtIGBhc3NldHNgOiBUaGUgYXNzZXRzIHRvIGJlIHdpdGhkcmF3bi4gVGhpcyBzaG91bGQgaW5jbHVkZSB0aGUgYXNzZXRzIHVzZWQgdG8gcGF5IHRoZcggIGZlZSBvbiB0aGUgYGRlc3RgIChhbmQgcG9zc2libHkgcmVzZXJ2ZSkgY2hhaW5zLk0BLSBgZmVlX2Fzc2V0X2l0ZW1gOiBUaGUgaW5kZXggaW50byBgYXNzZXRzYCBvZiB0aGUgaXRlbSB3aGljaCBzaG91bGQgYmUgdXNlZCB0byBwYXkcICBmZWVzLkUBLSBgd2VpZ2h0X2xpbWl0YDogVGhlIHJlbW90ZS1zaWRlIHdlaWdodCBsaW1pdCwgaWYgYW55LCBmb3IgdGhlIFhDTSBmZWUgcHVyY2hhc2UuXGxpbWl0ZWRfdGVsZXBvcnRfYXNzZXRzFAEQZGVzdC0BAVhCb3g8VmVyc2lvbmVkTG9jYXRpb24+AAEsYmVuZWZpY2lhcnktAQFYQm94PFZlcnNpb25lZExvY2F0aW9uPgABGGFzc2V0c9kGAVBCb3g8VmVyc2lvbmVkQXNzZXRzPgABOGZlZV9hc3NldF9pdGVtEAEMdTMyAAEwd2VpZ2h0X2xpbWl0jQYBLFdlaWdodExpbWl0AAlIEQFUZWxlcG9ydCBzb21lIGFzc2V0cyBmcm9tIHRoZSBsb2NhbCBjaGFpbiB0byBzb21lIGRlc3RpbmF0aW9uIGNoYWluLgBRAUZlZSBwYXltZW50IG9uIHRoZSBkZXN0aW5hdGlvbiBzaWRlIGlzIG1hZGUgZnJvbSB0aGUgYXNzZXQgaW4gdGhlIGBhc3NldHNgIHZlY3RvciBvZmEBaW5kZXggYGZlZV9hc3NldF9pdGVtYCwgdXAgdG8gZW5vdWdoIHRvIHBheSBmb3IgYHdlaWdodF9saW1pdGAgb2Ygd2VpZ2h0LiBJZiBtb3JlIHdlaWdodFkBaXMgbmVlZGVkIHRoYW4gYHdlaWdodF9saW1pdGAsIHRoZW4gdGhlIG9wZXJhdGlvbiB3aWxsIGZhaWwgYW5kIHRoZSBzZW50IGFzc2V0cyBtYXkgYmUgYXQgcmlzay4AKQEtIGBvcmlnaW5gOiBNdXN0IGJlIGNhcGFibGUgb2Ygd2l0aGRyYXdpbmcgdGhlIGBhc3NldHNgIGFuZCBleGVjdXRpbmcgWENNLiUBLSBgZGVzdGA6IERlc3RpbmF0aW9uIGNvbnRleHQgZm9yIHRoZSBhc3NldHMuIFdpbGwgdHlwaWNhbGx5IGJlIGBbUGFyZW50LGEBICBQYXJhY2hhaW4oLi4pXWAgdG8gc2VuZCBmcm9tIHBhcmFjaGFpbiB0byBwYXJhY2hhaW4sIG9yIGBbUGFyYWNoYWluKC4uKV1gIHRvIHNlbmQgZnJvbVQgIHJlbGF5IHRvIHBhcmFjaGFpbi5VAS0gYGJlbmVmaWNpYXJ5YDogQSBiZW5lZmljaWFyeSBsb2NhdGlvbiBmb3IgdGhlIGFzc2V0cyBpbiB0aGUgY29udGV4dCBvZiBgZGVzdGAuIFdpbGyYICBnZW5lcmFsbHkgYmUgYW4gYEFjY291bnRJZDMyYCB2YWx1ZS5ZAS0gYGFzc2V0c2A6IFRoZSBhc3NldHMgdG8gYmUgd2l0aGRyYXduLiBUaGlzIHNob3VsZCBpbmNsdWRlIHRoZSBhc3NldHMgdXNlZCB0byBwYXkgdGhlaCAgZmVlIG9uIHRoZSBgZGVzdGAgY2hhaW4uTQEtIGBmZWVfYXNzZXRfaXRlbWA6IFRoZSBpbmRleCBpbnRvIGBhc3NldHNgIG9mIHRoZSBpdGVtIHdoaWNoIHNob3VsZCBiZSB1c2VkIHRvIHBheRwgIGZlZXMuRQEtIGB3ZWlnaHRfbGltaXRgOiBUaGUgcmVtb3RlLXNpZGUgd2VpZ2h0IGxpbWl0LCBpZiBhbnksIGZvciB0aGUgWENNIGZlZSBwdXJjaGFzZS5AZm9yY2Vfc3VzcGVuc2lvbgQBJHN1c3BlbmRlZCABEGJvb2wAChD0U2V0IG9yIHVuc2V0IHRoZSBnbG9iYWwgc3VzcGVuc2lvbiBzdGF0ZSBvZiB0aGUgWENNIGV4ZWN1dG9yLgDcLSBgb3JpZ2luYDogTXVzdCBiZSBhbiBvcmlnaW4gc3BlY2lmaWVkIGJ5IEFkbWluT3JpZ2luLtAtIGBzdXNwZW5kZWRgOiBgdHJ1ZWAgdG8gc3VzcGVuZCwgYGZhbHNlYCB0byByZXN1bWUuPHRyYW5zZmVyX2Fzc2V0cxQBEGRlc3QtAQFYQm94PFZlcnNpb25lZExvY2F0aW9uPgABLGJlbmVmaWNpYXJ5LQEBWEJveDxWZXJzaW9uZWRMb2NhdGlvbj4AARhhc3NldHPZBgFQQm94PFZlcnNpb25lZEFzc2V0cz4AAThmZWVfYXNzZXRfaXRlbRABDHUzMgABMHdlaWdodF9saW1pdI0GASxXZWlnaHRMaW1pdAALhF0BVHJhbnNmZXIgc29tZSBhc3NldHMgZnJvbSB0aGUgbG9jYWwgY2hhaW4gdG8gdGhlIGRlc3RpbmF0aW9uIGNoYWluIHRocm91Z2ggdGhlaXIgbG9jYWws0GRlc3RpbmF0aW9uIG9yIHJlbW90ZSByZXNlcnZlLCBvciB0aHJvdWdoIHRlbGVwb3J0cy4AUQFGZWUgcGF5bWVudCBvbiB0aGUgZGVzdGluYXRpb24gc2lkZSBpcyBtYWRlIGZyb20gdGhlIGFzc2V0IGluIHRoZSBgYXNzZXRzYCB2ZWN0b3Igb2Y1AWluZGV4IGBmZWVfYXNzZXRfaXRlbWAgKGhlbmNlIHJlZmVycmVkIHRvIGFzIGBmZWVzYCksIHVwIHRvIGVub3VnaCB0byBwYXkgZm9yQQFgd2VpZ2h0X2xpbWl0YCBvZiB3ZWlnaHQuIElmIG1vcmUgd2VpZ2h0IGlzIG5lZWRlZCB0aGFuIGB3ZWlnaHRfbGltaXRgLCB0aGVuIHRoZdxvcGVyYXRpb24gd2lsbCBmYWlsIGFuZCB0aGUgc2VudCBhc3NldHMgbWF5IGJlIGF0IHJpc2suAGEBYGFzc2V0c2AgKGV4Y2x1ZGluZyBgZmVlc2ApIG11c3QgaGF2ZSBzYW1lIHJlc2VydmUgbG9jYXRpb24gb3Igb3RoZXJ3aXNlIGJlIHRlbGVwb3J0YWJsZbB0byBgZGVzdGAsIG5vIGxpbWl0YXRpb25zIGltcG9zZWQgb24gYGZlZXNgLk0BIC0gZm9yIGxvY2FsIHJlc2VydmU6IHRyYW5zZmVyIGFzc2V0cyB0byBzb3ZlcmVpZ24gYWNjb3VudCBvZiBkZXN0aW5hdGlvbiBjaGFpbiBhbmRNASAgIGZvcndhcmQgYSBub3RpZmljYXRpb24gWENNIHRvIGBkZXN0YCB0byBtaW50IGFuZCBkZXBvc2l0IHJlc2VydmUtYmFzZWQgYXNzZXRzIHRvRCAgIGBiZW5lZmljaWFyeWAuYQEgLSBmb3IgZGVzdGluYXRpb24gcmVzZXJ2ZTogYnVybiBsb2NhbCBhc3NldHMgYW5kIGZvcndhcmQgYSBub3RpZmljYXRpb24gdG8gYGRlc3RgIGNoYWluWQEgICB0byB3aXRoZHJhdyB0aGUgcmVzZXJ2ZSBhc3NldHMgZnJvbSB0aGlzIGNoYWluJ3Mgc292ZXJlaWduIGFjY291bnQgYW5kIGRlcG9zaXQgdGhlbVAgICB0byBgYmVuZWZpY2lhcnlgLl0BIC0gZm9yIHJlbW90ZSByZXNlcnZlOiBidXJuIGxvY2FsIGFzc2V0cywgZm9yd2FyZCBYQ00gdG8gcmVzZXJ2ZSBjaGFpbiB0byBtb3ZlIHJlc2VydmVzXQEgICBmcm9tIHRoaXMgY2hhaW4ncyBTQSB0byBgZGVzdGAgY2hhaW4ncyBTQSwgYW5kIGZvcndhcmQgYW5vdGhlciBYQ00gdG8gYGRlc3RgIHRvIG1pbnTUICAgYW5kIGRlcG9zaXQgcmVzZXJ2ZS1iYXNlZCBhc3NldHMgdG8gYGJlbmVmaWNpYXJ5YC5RASAtIGZvciB0ZWxlcG9ydHM6IGJ1cm4gbG9jYWwgYXNzZXRzIGFuZCBmb3J3YXJkIFhDTSB0byBgZGVzdGAgY2hhaW4gdG8gbWludC90ZWxlcG9ydLAgICBhc3NldHMgYW5kIGRlcG9zaXQgdGhlbSB0byBgYmVuZWZpY2lhcnlgLgApAS0gYG9yaWdpbmA6IE11c3QgYmUgY2FwYWJsZSBvZiB3aXRoZHJhd2luZyB0aGUgYGFzc2V0c2AgYW5kIGV4ZWN1dGluZyBYQ00uLQEtIGBkZXN0YDogRGVzdGluYXRpb24gY29udGV4dCBmb3IgdGhlIGFzc2V0cy4gV2lsbCB0eXBpY2FsbHkgYmUgYFgyKFBhcmVudCxVASAgUGFyYWNoYWluKC4uKSlgIHRvIHNlbmQgZnJvbSBwYXJhY2hhaW4gdG8gcGFyYWNoYWluLCBvciBgWDEoUGFyYWNoYWluKC4uKSlgIHRvIHNlbmRoICBmcm9tIHJlbGF5IHRvIHBhcmFjaGFpbi5VAS0gYGJlbmVmaWNpYXJ5YDogQSBiZW5lZmljaWFyeSBsb2NhdGlvbiBmb3IgdGhlIGFzc2V0cyBpbiB0aGUgY29udGV4dCBvZiBgZGVzdGAuIFdpbGyYICBnZW5lcmFsbHkgYmUgYW4gYEFjY291bnRJZDMyYCB2YWx1ZS5ZAS0gYGFzc2V0c2A6IFRoZSBhc3NldHMgdG8gYmUgd2l0aGRyYXduLiBUaGlzIHNob3VsZCBpbmNsdWRlIHRoZSBhc3NldHMgdXNlZCB0byBwYXkgdGhlyCAgZmVlIG9uIHRoZSBgZGVzdGAgKGFuZCBwb3NzaWJseSByZXNlcnZlKSBjaGFpbnMuTQEtIGBmZWVfYXNzZXRfaXRlbWA6IFRoZSBpbmRleCBpbnRvIGBhc3NldHNgIG9mIHRoZSBpdGVtIHdoaWNoIHNob3VsZCBiZSB1c2VkIHRvIHBheRwgIGZlZXMuRQEtIGB3ZWlnaHRfbGltaXRgOiBUaGUgcmVtb3RlLXNpZGUgd2VpZ2h0IGxpbWl0LCBpZiBhbnksIGZvciB0aGUgWENNIGZlZSBwdXJjaGFzZS4wY2xhaW1fYXNzZXRzCAEYYXNzZXRz2QYBUEJveDxWZXJzaW9uZWRBc3NldHM+AAEsYmVuZWZpY2lhcnktAQFYQm94PFZlcnNpb25lZExvY2F0aW9uPgAMGFUBQ2xhaW1zIGFzc2V0cyB0cmFwcGVkIG9uIHRoaXMgcGFsbGV0IGJlY2F1c2Ugb2YgbGVmdG92ZXIgYXNzZXRzIGR1cmluZyBYQ00gZXhlY3V0aW9uLgCsLSBgb3JpZ2luYDogQW55b25lIGNhbiBjYWxsIHRoaXMgZXh0cmluc2ljLl0BLSBgYXNzZXRzYDogVGhlIGV4YWN0IGFzc2V0cyB0aGF0IHdlcmUgdHJhcHBlZC4gVXNlIHRoZSB2ZXJzaW9uIHRvIHNwZWNpZnkgd2hhdCB2ZXJzaW9umHdhcyB0aGUgbGF0ZXN0IHdoZW4gdGhleSB3ZXJlIHRyYXBwZWQuRQEtIGBiZW5lZmljaWFyeWA6IFRoZSBsb2NhdGlvbi9hY2NvdW50IHdoZXJlIHRoZSBjbGFpbWVkIGFzc2V0cyB3aWxsIGJlIGRlcG9zaXRlZC6MdHJhbnNmZXJfYXNzZXRzX3VzaW5nX3R5cGVfYW5kX3RoZW4cARBkZXN0LQEBWEJveDxWZXJzaW9uZWRMb2NhdGlvbj4AARhhc3NldHPZBgFQQm94PFZlcnNpb25lZEFzc2V0cz4AAVBhc3NldHNfdHJhbnNmZXJfdHlwZQkHAURCb3g8VHJhbnNmZXJUeXBlPgABOHJlbW90ZV9mZWVzX2lkDQcBVEJveDxWZXJzaW9uZWRBc3NldElkPgABSGZlZXNfdHJhbnNmZXJfdHlwZQkHAURCb3g8VHJhbnNmZXJUeXBlPgABSGN1c3RvbV94Y21fb25fZGVzdNkFAVRCb3g8VmVyc2lvbmVkWGNtPCgpPj4AATB3ZWlnaHRfbGltaXSNBgEsV2VpZ2h0TGltaXQADcBVAVRyYW5zZmVyIGFzc2V0cyBmcm9tIHRoZSBsb2NhbCBjaGFpbiB0byB0aGUgZGVzdGluYXRpb24gY2hhaW4gdXNpbmcgZXhwbGljaXQgdHJhbnNmZXJodHlwZXMgZm9yIGFzc2V0cyBhbmQgZmVlcy4AWQFgYXNzZXRzYCBtdXN0IGhhdmUgc2FtZSByZXNlcnZlIGxvY2F0aW9uIG9yIG1heSBiZSB0ZWxlcG9ydGFibGUgdG8gYGRlc3RgLiBDYWxsZXIgbXVzdOxwcm92aWRlIHRoZSBgYXNzZXRzX3RyYW5zZmVyX3R5cGVgIHRvIGJlIHVzZWQgZm9yIGBhc3NldHNgOlEBIC0gYFRyYW5zZmVyVHlwZTo6TG9jYWxSZXNlcnZlYDogdHJhbnNmZXIgYXNzZXRzIHRvIHNvdmVyZWlnbiBhY2NvdW50IG9mIGRlc3RpbmF0aW9uTQEgICBjaGFpbiBhbmQgZm9yd2FyZCBhIG5vdGlmaWNhdGlvbiBYQ00gdG8gYGRlc3RgIHRvIG1pbnQgYW5kIGRlcG9zaXQgcmVzZXJ2ZS1iYXNlZGwgICBhc3NldHMgdG8gYGJlbmVmaWNpYXJ5YC5ZASAtIGBUcmFuc2ZlclR5cGU6OkRlc3RpbmF0aW9uUmVzZXJ2ZWA6IGJ1cm4gbG9jYWwgYXNzZXRzIGFuZCBmb3J3YXJkIGEgbm90aWZpY2F0aW9uIHRvWQEgICBgZGVzdGAgY2hhaW4gdG8gd2l0aGRyYXcgdGhlIHJlc2VydmUgYXNzZXRzIGZyb20gdGhpcyBjaGFpbidzIHNvdmVyZWlnbiBhY2NvdW50IGFuZIQgICBkZXBvc2l0IHRoZW0gdG8gYGJlbmVmaWNpYXJ5YC5ZASAtIGBUcmFuc2ZlclR5cGU6OlJlbW90ZVJlc2VydmUocmVzZXJ2ZSlgOiBidXJuIGxvY2FsIGFzc2V0cywgZm9yd2FyZCBYQ00gdG8gYHJlc2VydmVgYQEgICBjaGFpbiB0byBtb3ZlIHJlc2VydmVzIGZyb20gdGhpcyBjaGFpbidzIFNBIHRvIGBkZXN0YCBjaGFpbidzIFNBLCBhbmQgZm9yd2FyZCBhbm90aGVyVQEgICBYQ00gdG8gYGRlc3RgIHRvIG1pbnQgYW5kIGRlcG9zaXQgcmVzZXJ2ZS1iYXNlZCBhc3NldHMgdG8gYGJlbmVmaWNpYXJ5YC4gVHlwaWNhbGx5lCAgIHRoZSByZW1vdGUgYHJlc2VydmVgIGlzIEFzc2V0IEh1Yi5FASAtIGBUcmFuc2ZlclR5cGU6OlRlbGVwb3J0YDogYnVybiBsb2NhbCBhc3NldHMgYW5kIGZvcndhcmQgWENNIHRvIGBkZXN0YCBjaGFpbiB0b+ggICBtaW50L3RlbGVwb3J0IGFzc2V0cyBhbmQgZGVwb3NpdCB0aGVtIHRvIGBiZW5lZmljaWFyeWAuAFUBT24gdGhlIGRlc3RpbmF0aW9uIGNoYWluLCBhcyB3ZWxsIGFzIGFueSBpbnRlcm1lZGlhcnkgaG9wcywgYEJ1eUV4ZWN1dGlvbmAgaXMgdXNlZCB0byEBYnV5IGV4ZWN1dGlvbiB1c2luZyB0cmFuc2ZlcnJlZCBgYXNzZXRzYCBpZGVudGlmaWVkIGJ5IGByZW1vdGVfZmVlc19pZGAuWQFNYWtlIHN1cmUgZW5vdWdoIG9mIHRoZSBzcGVjaWZpZWQgYHJlbW90ZV9mZWVzX2lkYCBhc3NldCBpcyBpbmNsdWRlZCBpbiB0aGUgZ2l2ZW4gbGlzdGEBb2YgYGFzc2V0c2AuIGByZW1vdGVfZmVlc19pZGAgc2hvdWxkIGJlIGVub3VnaCB0byBwYXkgZm9yIGB3ZWlnaHRfbGltaXRgLiBJZiBtb3JlIHdlaWdodFkBaXMgbmVlZGVkIHRoYW4gYHdlaWdodF9saW1pdGAsIHRoZW4gdGhlIG9wZXJhdGlvbiB3aWxsIGZhaWwgYW5kIHRoZSBzZW50IGFzc2V0cyBtYXkgYmUgYXQgcmlzay4ARQFgcmVtb3RlX2ZlZXNfaWRgIG1heSB1c2UgZGlmZmVyZW50IHRyYW5zZmVyIHR5cGUgdGhhbiByZXN0IG9mIGBhc3NldHNgIGFuZCBjYW4gYmWcc3BlY2lmaWVkIHRocm91Z2ggYGZlZXNfdHJhbnNmZXJfdHlwZWAuAGEBVGhlIGNhbGxlciBuZWVkcyB0byBzcGVjaWZ5IHdoYXQgc2hvdWxkIGhhcHBlbiB0byB0aGUgdHJhbnNmZXJyZWQgYXNzZXRzIG9uY2UgdGhleSByZWFjaEEBdGhlIGBkZXN0YCBjaGFpbi4gVGhpcyBpcyBkb25lIHRocm91Z2ggdGhlIGBjdXN0b21feGNtX29uX2Rlc3RgIHBhcmFtZXRlciwgd2hpY2j8Y29udGFpbnMgdGhlIGluc3RydWN0aW9ucyB0byBleGVjdXRlIG9uIGBkZXN0YCBhcyBhIGZpbmFsIHN0ZXAufCAgVGhpcyBpcyB1c3VhbGx5IGFzIHNpbXBsZSBhczpRASAgYFhjbSh2ZWMhW0RlcG9zaXRBc3NldCB7IGFzc2V0czogV2lsZChBbGxDb3VudGVkKGFzc2V0cy5sZW4oKSkpLCBiZW5lZmljaWFyeSB9XSlgLDEBICBidXQgY291bGQgYmUgc29tZXRoaW5nIG1vcmUgZXhvdGljIGxpa2Ugc2VuZGluZyB0aGUgYGFzc2V0c2AgZXZlbiBmdXJ0aGVyLgApAS0gYG9yaWdpbmA6IE11c3QgYmUgY2FwYWJsZSBvZiB3aXRoZHJhd2luZyB0aGUgYGFzc2V0c2AgYW5kIGV4ZWN1dGluZyBYQ00uJQEtIGBkZXN0YDogRGVzdGluYXRpb24gY29udGV4dCBmb3IgdGhlIGFzc2V0cy4gV2lsbCB0eXBpY2FsbHkgYmUgYFtQYXJlbnQsYQEgIFBhcmFjaGFpbiguLildYCB0byBzZW5kIGZyb20gcGFyYWNoYWluIHRvIHBhcmFjaGFpbiwgb3IgYFtQYXJhY2hhaW4oLi4pXWAgdG8gc2VuZCBmcm9tPQEgIHJlbGF5IHRvIHBhcmFjaGFpbiwgb3IgYChwYXJlbnRzOiAyLCAoR2xvYmFsQ29uc2Vuc3VzKC4uKSwgLi4pKWAgdG8gc2VuZCBmcm9t9CAgcGFyYWNoYWluIGFjcm9zcyBhIGJyaWRnZSB0byBhbm90aGVyIGVjb3N5c3RlbSBkZXN0aW5hdGlvbi5ZAS0gYGFzc2V0c2A6IFRoZSBhc3NldHMgdG8gYmUgd2l0aGRyYXduLiBUaGlzIHNob3VsZCBpbmNsdWRlIHRoZSBhc3NldHMgdXNlZCB0byBwYXkgdGhlyCAgZmVlIG9uIHRoZSBgZGVzdGAgKGFuZCBwb3NzaWJseSByZXNlcnZlKSBjaGFpbnMuPQEtIGBhc3NldHNfdHJhbnNmZXJfdHlwZWA6IFRoZSBYQ00gYFRyYW5zZmVyVHlwZWAgdXNlZCB0byB0cmFuc2ZlciB0aGUgYGFzc2V0c2AuIQEtIGByZW1vdGVfZmVlc19pZGA6IE9uZSBvZiB0aGUgaW5jbHVkZWQgYGFzc2V0c2AgdG8gYmUgdXNlZCB0byBwYXkgZmVlcy5JAS0gYGZlZXNfdHJhbnNmZXJfdHlwZWA6IFRoZSBYQ00gYFRyYW5zZmVyVHlwZWAgdXNlZCB0byB0cmFuc2ZlciB0aGUgYGZlZXNgIGFzc2V0cy5ZAS0gYGN1c3RvbV94Y21fb25fZGVzdGA6IFRoZSBYQ00gdG8gYmUgZXhlY3V0ZWQgb24gYGRlc3RgIGNoYWluIGFzIHRoZSBsYXN0IHN0ZXAgb2YgdGhlWQEgIHRyYW5zZmVyLCB3aGljaCBhbHNvIGRldGVybWluZXMgd2hhdCBoYXBwZW5zIHRvIHRoZSBhc3NldHMgb24gdGhlIGRlc3RpbmF0aW9uIGNoYWluLkUBLSBgd2VpZ2h0X2xpbWl0YDogVGhlIHJlbW90ZS1zaWRlIHdlaWdodCBsaW1pdCwgaWYgYW55LCBmb3IgdGhlIFhDTSBmZWUgcHVyY2hhc2UuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLtkFCAx4Y20wVmVyc2lvbmVkWGNtBCxSdW50aW1lQ2FsbAABDAhWMgQA3QUBUHYyOjpYY208UnVudGltZUNhbGw+AAIACFYzBAAtBgFQdjM6OlhjbTxSdW50aW1lQ2FsbD4AAwAIVjQEAJEGAVB2NDo6WGNtPFJ1bnRpbWVDYWxsPgAEAADdBQwMeGNtCHYyDFhjbQQsUnVudGltZUNhbGwAAAQA4QUBdFZlYzxJbnN0cnVjdGlvbjxSdW50aW1lQ2FsbD4+AADhBQAAAuUFAOUFDAx4Y20IdjIsSW5zdHJ1Y3Rpb24ELFJ1bnRpbWVDYWxsAAFwNFdpdGhkcmF3QXNzZXQEAOkFASxNdWx0aUFzc2V0cwAAAFRSZXNlcnZlQXNzZXREZXBvc2l0ZWQEAOkFASxNdWx0aUFzc2V0cwABAFhSZWNlaXZlVGVsZXBvcnRlZEFzc2V0BADpBQEsTXVsdGlBc3NldHMAAgA0UXVlcnlSZXNwb25zZQwBIHF1ZXJ5X2lkLAEcUXVlcnlJZAABIHJlc3BvbnNlBQYBIFJlc3BvbnNlAAEobWF4X3dlaWdodCwBDHU2NAADADRUcmFuc2ZlckFzc2V0CAEYYXNzZXRz6QUBLE11bHRpQXNzZXRzAAEsYmVuZWZpY2lhcnkxAQE0TXVsdGlMb2NhdGlvbgAEAFBUcmFuc2ZlclJlc2VydmVBc3NldAwBGGFzc2V0c+kFASxNdWx0aUFzc2V0cwABEGRlc3QxAQE0TXVsdGlMb2NhdGlvbgABDHhjbd0FARxYY208KCk+AAUAIFRyYW5zYWN0DAEsb3JpZ2luX3R5cGUVBgEoT3JpZ2luS2luZAABWHJlcXVpcmVfd2VpZ2h0X2F0X21vc3QsAQx1NjQAARBjYWxsGQYBaERvdWJsZUVuY29kZWQ8UnVudGltZUNhbGw+AAYAZEhybXBOZXdDaGFubmVsT3BlblJlcXVlc3QMARhzZW5kZXLUAQx1MzIAAUBtYXhfbWVzc2FnZV9zaXpl1AEMdTMyAAEwbWF4X2NhcGFjaXR51AEMdTMyAAcATEhybXBDaGFubmVsQWNjZXB0ZWQEASRyZWNpcGllbnTUAQx1MzIACABISHJtcENoYW5uZWxDbG9zaW5nDAEkaW5pdGlhdG9y1AEMdTMyAAEYc2VuZGVy1AEMdTMyAAEkcmVjaXBpZW501AEMdTMyAAkALENsZWFyT3JpZ2luAAoANERlc2NlbmRPcmlnaW4EADUBAVRJbnRlcmlvck11bHRpTG9jYXRpb24ACwAsUmVwb3J0RXJyb3IMASBxdWVyeV9pZCwBHFF1ZXJ5SWQAARBkZXN0MQEBNE11bHRpTG9jYXRpb24AAUxtYXhfcmVzcG9uc2Vfd2VpZ2h0LAEMdTY0AAwAMERlcG9zaXRBc3NldAwBGGFzc2V0cx0GAUBNdWx0aUFzc2V0RmlsdGVyAAEobWF4X2Fzc2V0c9QBDHUzMgABLGJlbmVmaWNpYXJ5MQEBNE11bHRpTG9jYXRpb24ADQBMRGVwb3NpdFJlc2VydmVBc3NldBABGGFzc2V0cx0GAUBNdWx0aUFzc2V0RmlsdGVyAAEobWF4X2Fzc2V0c9QBDHUzMgABEGRlc3QxAQE0TXVsdGlMb2NhdGlvbgABDHhjbd0FARxYY208KCk+AA4ANEV4Y2hhbmdlQXNzZXQIARBnaXZlHQYBQE11bHRpQXNzZXRGaWx0ZXIAARxyZWNlaXZl6QUBLE11bHRpQXNzZXRzAA8AXEluaXRpYXRlUmVzZXJ2ZVdpdGhkcmF3DAEYYXNzZXRzHQYBQE11bHRpQXNzZXRGaWx0ZXIAARxyZXNlcnZlMQEBNE11bHRpTG9jYXRpb24AAQx4Y23dBQEcWGNtPCgpPgAQAEBJbml0aWF0ZVRlbGVwb3J0DAEYYXNzZXRzHQYBQE11bHRpQXNzZXRGaWx0ZXIAARBkZXN0MQEBNE11bHRpTG9jYXRpb24AAQx4Y23dBQEcWGNtPCgpPgARADBRdWVyeUhvbGRpbmcQASBxdWVyeV9pZCwBHFF1ZXJ5SWQAARBkZXN0MQEBNE11bHRpTG9jYXRpb24AARhhc3NldHMdBgFATXVsdGlBc3NldEZpbHRlcgABTG1heF9yZXNwb25zZV93ZWlnaHQsAQx1NjQAEgAwQnV5RXhlY3V0aW9uCAEQZmVlc/EFAShNdWx0aUFzc2V0AAEwd2VpZ2h0X2xpbWl0KQYBLFdlaWdodExpbWl0ABMANFJlZnVuZFN1cnBsdXMAFAA8U2V0RXJyb3JIYW5kbGVyBADdBQFAWGNtPFJ1bnRpbWVDYWxsPgAVACxTZXRBcHBlbmRpeAQA3QUBQFhjbTxSdW50aW1lQ2FsbD4AFgAoQ2xlYXJFcnJvcgAXAChDbGFpbUFzc2V0CAEYYXNzZXRz6QUBLE11bHRpQXNzZXRzAAEYdGlja2V0MQEBNE11bHRpTG9jYXRpb24AGAAQVHJhcAQALAEMdTY0ABkAQFN1YnNjcmliZVZlcnNpb24IASBxdWVyeV9pZCwBHFF1ZXJ5SWQAAUxtYXhfcmVzcG9uc2Vfd2VpZ2h0LAEMdTY0ABoASFVuc3Vic2NyaWJlVmVyc2lvbgAbAADpBRAMeGNtCHYyKG11bHRpYXNzZXQsTXVsdGlBc3NldHMAAAQA7QUBPFZlYzxNdWx0aUFzc2V0PgAA7QUAAALxBQDxBRAMeGNtCHYyKG11bHRpYXNzZXQoTXVsdGlBc3NldAAACAEIaWT1BQEcQXNzZXRJZAABDGZ1bvkFASxGdW5naWJpbGl0eQAA9QUQDHhjbQh2MihtdWx0aWFzc2V0HEFzc2V0SWQAAQggQ29uY3JldGUEADEBATRNdWx0aUxvY2F0aW9uAAAAIEFic3RyYWN0BAA4ARxWZWM8dTg+AAEAAPkFEAx4Y20IdjIobXVsdGlhc3NldCxGdW5naWJpbGl0eQABCCBGdW5naWJsZQQA5AEQdTEyOAAAACxOb25GdW5naWJsZQQA/QUBNEFzc2V0SW5zdGFuY2UAAQAA/QUQDHhjbQh2MihtdWx0aWFzc2V0NEFzc2V0SW5zdGFuY2UAARwkVW5kZWZpbmVkAAAAFEluZGV4BADkARB1MTI4AAEAGEFycmF5NAQASAEcW3U4OyA0XQACABhBcnJheTgEAAEGARxbdTg7IDhdAAMAHEFycmF5MTYEAKgBIFt1ODsgMTZdAAQAHEFycmF5MzIEAAQBIFt1ODsgMzJdAAUAEEJsb2IEADgBHFZlYzx1OD4ABgAAAQYAAAMIAAAACAAFBgwMeGNtCHYyIFJlc3BvbnNlAAEQEE51bGwAAAAYQXNzZXRzBADpBQEsTXVsdGlBc3NldHMAAQA8RXhlY3V0aW9uUmVzdWx0BAAJBgFQT3B0aW9uPCh1MzIsIEVycm9yKT4AAgAcVmVyc2lvbgQAEAE4c3VwZXI6OlZlcnNpb24AAwAACQYEGE9wdGlvbgQEVAENBgEIEE5vbmUAAAAQU29tZQQADQYAAAEAAA0GAAAECBARBgARBhAMeGNtCHYyGHRyYWl0cxRFcnJvcgABaCBPdmVyZmxvdwAAADRVbmltcGxlbWVudGVkAAEAYFVudHJ1c3RlZFJlc2VydmVMb2NhdGlvbgACAGRVbnRydXN0ZWRUZWxlcG9ydExvY2F0aW9uAAMARE11bHRpTG9jYXRpb25GdWxsAAQAaE11bHRpTG9jYXRpb25Ob3RJbnZlcnRpYmxlAAUAJEJhZE9yaWdpbgAGADxJbnZhbGlkTG9jYXRpb24ABwA0QXNzZXROb3RGb3VuZAAIAFRGYWlsZWRUb1RyYW5zYWN0QXNzZXQACQA8Tm90V2l0aGRyYXdhYmxlAAoASExvY2F0aW9uQ2Fubm90SG9sZAALAFRFeGNlZWRzTWF4TWVzc2FnZVNpemUADABYRGVzdGluYXRpb25VbnN1cHBvcnRlZAANACRUcmFuc3BvcnQADgAoVW5yb3V0YWJsZQAPADBVbmtub3duQ2xhaW0AEAA4RmFpbGVkVG9EZWNvZGUAEQBATWF4V2VpZ2h0SW52YWxpZAASADhOb3RIb2xkaW5nRmVlcwATADBUb29FeHBlbnNpdmUAFAAQVHJhcAQAMAEMdTY0ABUATFVuaGFuZGxlZFhjbVZlcnNpb24AFgBIV2VpZ2h0TGltaXRSZWFjaGVkBAAwARhXZWlnaHQAFwAcQmFycmllcgAYAExXZWlnaHROb3RDb21wdXRhYmxlABkAABUGDAx4Y20IdjIoT3JpZ2luS2luZAABEBhOYXRpdmUAAABAU292ZXJlaWduQWNjb3VudAABACRTdXBlcnVzZXIAAgAMWGNtAAMAABkGDAx4Y204ZG91YmxlX2VuY29kZWQ0RG91YmxlRW5jb2RlZAQEVAAABAEcZW5jb2RlZDgBHFZlYzx1OD4AAB0GEAx4Y20IdjIobXVsdGlhc3NldEBNdWx0aUFzc2V0RmlsdGVyAAEIIERlZmluaXRlBADpBQEsTXVsdGlBc3NldHMAAAAQV2lsZAQAIQYBOFdpbGRNdWx0aUFzc2V0AAEAACEGEAx4Y20IdjIobXVsdGlhc3NldDhXaWxkTXVsdGlBc3NldAABCAxBbGwAAAAUQWxsT2YIAQhpZPUFARxBc3NldElkAAEMZnVuJQYBPFdpbGRGdW5naWJpbGl0eQABAAAlBhAMeGNtCHYyKG11bHRpYXNzZXQ8V2lsZEZ1bmdpYmlsaXR5AAEIIEZ1bmdpYmxlAAAALE5vbkZ1bmdpYmxlAAEAACkGDAx4Y20IdjIsV2VpZ2h0TGltaXQAAQgkVW5saW1pdGVkAAAAHExpbWl0ZWQEACwBDHU2NAABAAAtBgwMeGNtCHYzDFhjbQQQQ2FsbAAABAAxBgFYVmVjPEluc3RydWN0aW9uPENhbGw+PgAAMQYAAAI1BgA1BgwMeGNtCHYzLEluc3RydWN0aW9uBBBDYWxsAAHANFdpdGhkcmF3QXNzZXQEADkGASxNdWx0aUFzc2V0cwAAAFRSZXNlcnZlQXNzZXREZXBvc2l0ZWQEADkGASxNdWx0aUFzc2V0cwABAFhSZWNlaXZlVGVsZXBvcnRlZEFzc2V0BAA5BgEsTXVsdGlBc3NldHMAAgA0UXVlcnlSZXNwb25zZRABIHF1ZXJ5X2lkLAEcUXVlcnlJZAABIHJlc3BvbnNlTQYBIFJlc3BvbnNlAAEobWF4X3dlaWdodCgBGFdlaWdodAABHHF1ZXJpZXJ1BgFUT3B0aW9uPE11bHRpTG9jYXRpb24+AAMANFRyYW5zZmVyQXNzZXQIARhhc3NldHM5BgEsTXVsdGlBc3NldHMAASxiZW5lZmljaWFyecgBNE11bHRpTG9jYXRpb24ABABQVHJhbnNmZXJSZXNlcnZlQXNzZXQMARhhc3NldHM5BgEsTXVsdGlBc3NldHMAARBkZXN0yAE0TXVsdGlMb2NhdGlvbgABDHhjbS0GARxYY208KCk+AAUAIFRyYW5zYWN0DAEsb3JpZ2luX2tpbmR5BgEoT3JpZ2luS2luZAABWHJlcXVpcmVfd2VpZ2h0X2F0X21vc3QoARhXZWlnaHQAARBjYWxsGQYBTERvdWJsZUVuY29kZWQ8Q2FsbD4ABgBkSHJtcE5ld0NoYW5uZWxPcGVuUmVxdWVzdAwBGHNlbmRlctQBDHUzMgABQG1heF9tZXNzYWdlX3NpemXUAQx1MzIAATBtYXhfY2FwYWNpdHnUAQx1MzIABwBMSHJtcENoYW5uZWxBY2NlcHRlZAQBJHJlY2lwaWVudNQBDHUzMgAIAEhIcm1wQ2hhbm5lbENsb3NpbmcMASRpbml0aWF0b3LUAQx1MzIAARhzZW5kZXLUAQx1MzIAASRyZWNpcGllbnTUAQx1MzIACQAsQ2xlYXJPcmlnaW4ACgA0RGVzY2VuZE9yaWdpbgQAzAFUSW50ZXJpb3JNdWx0aUxvY2F0aW9uAAsALFJlcG9ydEVycm9yBAB9BgFEUXVlcnlSZXNwb25zZUluZm8ADAAwRGVwb3NpdEFzc2V0CAEYYXNzZXRzgQYBQE11bHRpQXNzZXRGaWx0ZXIAASxiZW5lZmljaWFyecgBNE11bHRpTG9jYXRpb24ADQBMRGVwb3NpdFJlc2VydmVBc3NldAwBGGFzc2V0c4EGAUBNdWx0aUFzc2V0RmlsdGVyAAEQZGVzdMgBNE11bHRpTG9jYXRpb24AAQx4Y20tBgEcWGNtPCgpPgAOADRFeGNoYW5nZUFzc2V0DAEQZ2l2ZYEGAUBNdWx0aUFzc2V0RmlsdGVyAAEQd2FudDkGASxNdWx0aUFzc2V0cwABHG1heGltYWwgARBib29sAA8AXEluaXRpYXRlUmVzZXJ2ZVdpdGhkcmF3DAEYYXNzZXRzgQYBQE11bHRpQXNzZXRGaWx0ZXIAARxyZXNlcnZlyAE0TXVsdGlMb2NhdGlvbgABDHhjbS0GARxYY208KCk+ABAAQEluaXRpYXRlVGVsZXBvcnQMARhhc3NldHOBBgFATXVsdGlBc3NldEZpbHRlcgABEGRlc3TIATRNdWx0aUxvY2F0aW9uAAEMeGNtLQYBHFhjbTwoKT4AEQA0UmVwb3J0SG9sZGluZwgBNHJlc3BvbnNlX2luZm99BgFEUXVlcnlSZXNwb25zZUluZm8AARhhc3NldHOBBgFATXVsdGlBc3NldEZpbHRlcgASADBCdXlFeGVjdXRpb24IARBmZWVzQQYBKE11bHRpQXNzZXQAATB3ZWlnaHRfbGltaXSNBgEsV2VpZ2h0TGltaXQAEwA0UmVmdW5kU3VycGx1cwAUADxTZXRFcnJvckhhbmRsZXIEAC0GASRYY208Q2FsbD4AFQAsU2V0QXBwZW5kaXgEAC0GASRYY208Q2FsbD4AFgAoQ2xlYXJFcnJvcgAXAChDbGFpbUFzc2V0CAEYYXNzZXRzOQYBLE11bHRpQXNzZXRzAAEYdGlja2V0yAE0TXVsdGlMb2NhdGlvbgAYABBUcmFwBAAsAQx1NjQAGQBAU3Vic2NyaWJlVmVyc2lvbggBIHF1ZXJ5X2lkLAEcUXVlcnlJZAABTG1heF9yZXNwb25zZV93ZWlnaHQoARhXZWlnaHQAGgBIVW5zdWJzY3JpYmVWZXJzaW9uABsAJEJ1cm5Bc3NldAQAOQYBLE11bHRpQXNzZXRzABwALEV4cGVjdEFzc2V0BAA5BgEsTXVsdGlBc3NldHMAHQAwRXhwZWN0T3JpZ2luBAB1BgFUT3B0aW9uPE11bHRpTG9jYXRpb24+AB4ALEV4cGVjdEVycm9yBABRBgFQT3B0aW9uPCh1MzIsIEVycm9yKT4AHwBQRXhwZWN0VHJhbnNhY3RTdGF0dXMEAG0GAThNYXliZUVycm9yQ29kZQAgACxRdWVyeVBhbGxldAgBLG1vZHVsZV9uYW1lOAEcVmVjPHU4PgABNHJlc3BvbnNlX2luZm99BgFEUXVlcnlSZXNwb25zZUluZm8AIQAwRXhwZWN0UGFsbGV0FAEUaW5kZXjUAQx1MzIAARBuYW1lOAEcVmVjPHU4PgABLG1vZHVsZV9uYW1lOAEcVmVjPHU4PgABLGNyYXRlX21ham9y1AEMdTMyAAE8bWluX2NyYXRlX21pbm9y1AEMdTMyACIAUFJlcG9ydFRyYW5zYWN0U3RhdHVzBAB9BgFEUXVlcnlSZXNwb25zZUluZm8AIwBMQ2xlYXJUcmFuc2FjdFN0YXR1cwAkADxVbml2ZXJzYWxPcmlnaW4EANABIEp1bmN0aW9uACUANEV4cG9ydE1lc3NhZ2UMARxuZXR3b3Jr3AEkTmV0d29ya0lkAAEsZGVzdGluYXRpb27MAVRJbnRlcmlvck11bHRpTG9jYXRpb24AAQx4Y20tBgEcWGNtPCgpPgAmACRMb2NrQXNzZXQIARRhc3NldEEGAShNdWx0aUFzc2V0AAEgdW5sb2NrZXLIATRNdWx0aUxvY2F0aW9uACcALFVubG9ja0Fzc2V0CAEUYXNzZXRBBgEoTXVsdGlBc3NldAABGHRhcmdldMgBNE11bHRpTG9jYXRpb24AKAA4Tm90ZVVubG9ja2FibGUIARRhc3NldEEGAShNdWx0aUFzc2V0AAEUb3duZXLIATRNdWx0aUxvY2F0aW9uACkANFJlcXVlc3RVbmxvY2sIARRhc3NldEEGAShNdWx0aUFzc2V0AAEYbG9ja2VyyAE0TXVsdGlMb2NhdGlvbgAqACxTZXRGZWVzTW9kZQQBMGppdF93aXRoZHJhdyABEGJvb2wAKwAgU2V0VG9waWMEAAQBIFt1ODsgMzJdACwAKENsZWFyVG9waWMALQAsQWxpYXNPcmlnaW4EAMgBNE11bHRpTG9jYXRpb24ALgA8VW5wYWlkRXhlY3V0aW9uCAEwd2VpZ2h0X2xpbWl0jQYBLFdlaWdodExpbWl0AAEwY2hlY2tfb3JpZ2ludQYBVE9wdGlvbjxNdWx0aUxvY2F0aW9uPgAvAAA5BhAMeGNtCHYzKG11bHRpYXNzZXQsTXVsdGlBc3NldHMAAAQAPQYBPFZlYzxNdWx0aUFzc2V0PgAAPQYAAAJBBgBBBhAMeGNtCHYzKG11bHRpYXNzZXQoTXVsdGlBc3NldAAACAEIaWTwARxBc3NldElkAAEMZnVuRQYBLEZ1bmdpYmlsaXR5AABFBhAMeGNtCHYzKG11bHRpYXNzZXQsRnVuZ2liaWxpdHkAAQggRnVuZ2libGUEAOQBEHUxMjgAAAAsTm9uRnVuZ2libGUEAEkGATRBc3NldEluc3RhbmNlAAEAAEkGEAx4Y20IdjMobXVsdGlhc3NldDRBc3NldEluc3RhbmNlAAEYJFVuZGVmaW5lZAAAABRJbmRleAQA5AEQdTEyOAABABhBcnJheTQEAEgBHFt1ODsgNF0AAgAYQXJyYXk4BAABBgEcW3U4OyA4XQADABxBcnJheTE2BACoASBbdTg7IDE2XQAEABxBcnJheTMyBAAEASBbdTg7IDMyXQAFAABNBgwMeGNtCHYzIFJlc3BvbnNlAAEYEE51bGwAAAAYQXNzZXRzBAA5BgEsTXVsdGlBc3NldHMAAQA8RXhlY3V0aW9uUmVzdWx0BABRBgFQT3B0aW9uPCh1MzIsIEVycm9yKT4AAgAcVmVyc2lvbgQAEAE4c3VwZXI6OlZlcnNpb24AAwAsUGFsbGV0c0luZm8EAF0GAZhCb3VuZGVkVmVjPFBhbGxldEluZm8sIE1heFBhbGxldHNJbmZvPgAEADhEaXNwYXRjaFJlc3VsdAQAbQYBOE1heWJlRXJyb3JDb2RlAAUAAFEGBBhPcHRpb24EBFQBVQYBCBBOb25lAAAAEFNvbWUEAFUGAAABAABVBgAABAgQWQYAWQYQDHhjbQh2Mxh0cmFpdHMURXJyb3IAAaAgT3ZlcmZsb3cAAAA0VW5pbXBsZW1lbnRlZAABAGBVbnRydXN0ZWRSZXNlcnZlTG9jYXRpb24AAgBkVW50cnVzdGVkVGVsZXBvcnRMb2NhdGlvbgADADBMb2NhdGlvbkZ1bGwABABUTG9jYXRpb25Ob3RJbnZlcnRpYmxlAAUAJEJhZE9yaWdpbgAGADxJbnZhbGlkTG9jYXRpb24ABwA0QXNzZXROb3RGb3VuZAAIAFRGYWlsZWRUb1RyYW5zYWN0QXNzZXQACQA8Tm90V2l0aGRyYXdhYmxlAAoASExvY2F0aW9uQ2Fubm90SG9sZAALAFRFeGNlZWRzTWF4TWVzc2FnZVNpemUADABYRGVzdGluYXRpb25VbnN1cHBvcnRlZAANACRUcmFuc3BvcnQADgAoVW5yb3V0YWJsZQAPADBVbmtub3duQ2xhaW0AEAA4RmFpbGVkVG9EZWNvZGUAEQBATWF4V2VpZ2h0SW52YWxpZAASADhOb3RIb2xkaW5nRmVlcwATADBUb29FeHBlbnNpdmUAFAAQVHJhcAQAMAEMdTY0ABUAQEV4cGVjdGF0aW9uRmFsc2UAFgA4UGFsbGV0Tm90Rm91bmQAFwAwTmFtZU1pc21hdGNoABgATFZlcnNpb25JbmNvbXBhdGlibGUAGQBQSG9sZGluZ1dvdWxkT3ZlcmZsb3cAGgAsRXhwb3J0RXJyb3IAGwA4UmVhbmNob3JGYWlsZWQAHAAYTm9EZWFsAB0AKEZlZXNOb3RNZXQAHgAkTG9ja0Vycm9yAB8AME5vUGVybWlzc2lvbgAgAChVbmFuY2hvcmVkACEAOE5vdERlcG9zaXRhYmxlACIATFVuaGFuZGxlZFhjbVZlcnNpb24AIwBIV2VpZ2h0TGltaXRSZWFjaGVkBAAoARhXZWlnaHQAJAAcQmFycmllcgAlAExXZWlnaHROb3RDb21wdXRhYmxlACYAREV4Y2VlZHNTdGFja0xpbWl0ACcAAF0GDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBYQYEUwAABABpBgEYVmVjPFQ+AABhBgwMeGNtCHYzKFBhbGxldEluZm8AABgBFGluZGV41AEMdTMyAAEQbmFtZWUGAYBCb3VuZGVkVmVjPHU4LCBNYXhQYWxsZXROYW1lTGVuPgABLG1vZHVsZV9uYW1lZQYBgEJvdW5kZWRWZWM8dTgsIE1heFBhbGxldE5hbWVMZW4+AAEUbWFqb3LUAQx1MzIAARRtaW5vctQBDHUzMgABFHBhdGNo1AEMdTMyAABlBgxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAQgEUwAABAA4ARhWZWM8VD4AAGkGAAACYQYAbQYMDHhjbQh2MzhNYXliZUVycm9yQ29kZQABDBxTdWNjZXNzAAAAFEVycm9yBABxBgGMQm91bmRlZFZlYzx1OCwgTWF4RGlzcGF0Y2hFcnJvckxlbj4AAQA4VHJ1bmNhdGVkRXJyb3IEAHEGAYxCb3VuZGVkVmVjPHU4LCBNYXhEaXNwYXRjaEVycm9yTGVuPgACAABxBgxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAQgEUwAABAA4ARhWZWM8VD4AAHUGBBhPcHRpb24EBFQByAEIEE5vbmUAAAAQU29tZQQAyAAAAQAAeQYMDHhjbQh2MyhPcmlnaW5LaW5kAAEQGE5hdGl2ZQAAAEBTb3ZlcmVpZ25BY2NvdW50AAEAJFN1cGVydXNlcgACAAxYY20AAwAAfQYMDHhjbQh2M0RRdWVyeVJlc3BvbnNlSW5mbwAADAEsZGVzdGluYXRpb27IATRNdWx0aUxvY2F0aW9uAAEgcXVlcnlfaWQsARxRdWVyeUlkAAEobWF4X3dlaWdodCgBGFdlaWdodAAAgQYQDHhjbQh2MyhtdWx0aWFzc2V0QE11bHRpQXNzZXRGaWx0ZXIAAQggRGVmaW5pdGUEADkGASxNdWx0aUFzc2V0cwAAABBXaWxkBACFBgE4V2lsZE11bHRpQXNzZXQAAQAAhQYQDHhjbQh2MyhtdWx0aWFzc2V0OFdpbGRNdWx0aUFzc2V0AAEQDEFsbAAAABRBbGxPZggBCGlk8AEcQXNzZXRJZAABDGZ1bokGATxXaWxkRnVuZ2liaWxpdHkAAQAoQWxsQ291bnRlZAQA1AEMdTMyAAIAMEFsbE9mQ291bnRlZAwBCGlk8AEcQXNzZXRJZAABDGZ1bokGATxXaWxkRnVuZ2liaWxpdHkAARRjb3VudNQBDHUzMgADAACJBhAMeGNtCHYzKG11bHRpYXNzZXQ8V2lsZEZ1bmdpYmlsaXR5AAEIIEZ1bmdpYmxlAAAALE5vbkZ1bmdpYmxlAAEAAI0GDAx4Y20IdjMsV2VpZ2h0TGltaXQAAQgkVW5saW1pdGVkAAAAHExpbWl0ZWQEACgBGFdlaWdodAABAACRBgwsc3RhZ2luZ194Y20IdjQMWGNtBBBDYWxsAAAEAJUGAVhWZWM8SW5zdHJ1Y3Rpb248Q2FsbD4+AACVBgAAApkGAJkGDCxzdGFnaW5nX3hjbQh2NCxJbnN0cnVjdGlvbgQQQ2FsbAABwDRXaXRoZHJhd0Fzc2V0BACdBgEYQXNzZXRzAAAAVFJlc2VydmVBc3NldERlcG9zaXRlZAQAnQYBGEFzc2V0cwABAFhSZWNlaXZlVGVsZXBvcnRlZEFzc2V0BACdBgEYQXNzZXRzAAIANFF1ZXJ5UmVzcG9uc2UQASBxdWVyeV9pZCwBHFF1ZXJ5SWQAASByZXNwb25zZbEGASBSZXNwb25zZQABKG1heF93ZWlnaHQoARhXZWlnaHQAARxxdWVyaWVyxQYBQE9wdGlvbjxMb2NhdGlvbj4AAwA0VHJhbnNmZXJBc3NldAgBGGFzc2V0c50GARhBc3NldHMAASxiZW5lZmljaWFyefQBIExvY2F0aW9uAAQAUFRyYW5zZmVyUmVzZXJ2ZUFzc2V0DAEYYXNzZXRznQYBGEFzc2V0cwABEGRlc3T0ASBMb2NhdGlvbgABDHhjbZEGARxYY208KCk+AAUAIFRyYW5zYWN0DAEsb3JpZ2luX2tpbmR5BgEoT3JpZ2luS2luZAABWHJlcXVpcmVfd2VpZ2h0X2F0X21vc3QoARhXZWlnaHQAARBjYWxsGQYBTERvdWJsZUVuY29kZWQ8Q2FsbD4ABgBkSHJtcE5ld0NoYW5uZWxPcGVuUmVxdWVzdAwBGHNlbmRlctQBDHUzMgABQG1heF9tZXNzYWdlX3NpemXUAQx1MzIAATBtYXhfY2FwYWNpdHnUAQx1MzIABwBMSHJtcENoYW5uZWxBY2NlcHRlZAQBJHJlY2lwaWVudNQBDHUzMgAIAEhIcm1wQ2hhbm5lbENsb3NpbmcMASRpbml0aWF0b3LUAQx1MzIAARhzZW5kZXLUAQx1MzIAASRyZWNpcGllbnTUAQx1MzIACQAsQ2xlYXJPcmlnaW4ACgA0RGVzY2VuZE9yaWdpbgQA+AFASW50ZXJpb3JMb2NhdGlvbgALACxSZXBvcnRFcnJvcgQAyQYBRFF1ZXJ5UmVzcG9uc2VJbmZvAAwAMERlcG9zaXRBc3NldAgBGGFzc2V0c80GASxBc3NldEZpbHRlcgABLGJlbmVmaWNpYXJ59AEgTG9jYXRpb24ADQBMRGVwb3NpdFJlc2VydmVBc3NldAwBGGFzc2V0c80GASxBc3NldEZpbHRlcgABEGRlc3T0ASBMb2NhdGlvbgABDHhjbZEGARxYY208KCk+AA4ANEV4Y2hhbmdlQXNzZXQMARBnaXZlzQYBLEFzc2V0RmlsdGVyAAEQd2FudJ0GARhBc3NldHMAARxtYXhpbWFsIAEQYm9vbAAPAFxJbml0aWF0ZVJlc2VydmVXaXRoZHJhdwwBGGFzc2V0c80GASxBc3NldEZpbHRlcgABHHJlc2VydmX0ASBMb2NhdGlvbgABDHhjbZEGARxYY208KCk+ABAAQEluaXRpYXRlVGVsZXBvcnQMARhhc3NldHPNBgEsQXNzZXRGaWx0ZXIAARBkZXN09AEgTG9jYXRpb24AAQx4Y22RBgEcWGNtPCgpPgARADRSZXBvcnRIb2xkaW5nCAE0cmVzcG9uc2VfaW5mb8kGAURRdWVyeVJlc3BvbnNlSW5mbwABGGFzc2V0c80GASxBc3NldEZpbHRlcgASADBCdXlFeGVjdXRpb24IARBmZWVzpQYBFEFzc2V0AAEwd2VpZ2h0X2xpbWl0jQYBLFdlaWdodExpbWl0ABMANFJlZnVuZFN1cnBsdXMAFAA8U2V0RXJyb3JIYW5kbGVyBACRBgEkWGNtPENhbGw+ABUALFNldEFwcGVuZGl4BACRBgEkWGNtPENhbGw+ABYAKENsZWFyRXJyb3IAFwAoQ2xhaW1Bc3NldAgBGGFzc2V0c50GARhBc3NldHMAARh0aWNrZXT0ASBMb2NhdGlvbgAYABBUcmFwBAAsAQx1NjQAGQBAU3Vic2NyaWJlVmVyc2lvbggBIHF1ZXJ5X2lkLAEcUXVlcnlJZAABTG1heF9yZXNwb25zZV93ZWlnaHQoARhXZWlnaHQAGgBIVW5zdWJzY3JpYmVWZXJzaW9uABsAJEJ1cm5Bc3NldAQAnQYBGEFzc2V0cwAcACxFeHBlY3RBc3NldAQAnQYBGEFzc2V0cwAdADBFeHBlY3RPcmlnaW4EAMUGAUBPcHRpb248TG9jYXRpb24+AB4ALEV4cGVjdEVycm9yBABRBgFQT3B0aW9uPCh1MzIsIEVycm9yKT4AHwBQRXhwZWN0VHJhbnNhY3RTdGF0dXMEAG0GAThNYXliZUVycm9yQ29kZQAgACxRdWVyeVBhbGxldAgBLG1vZHVsZV9uYW1lOAEcVmVjPHU4PgABNHJlc3BvbnNlX2luZm/JBgFEUXVlcnlSZXNwb25zZUluZm8AIQAwRXhwZWN0UGFsbGV0FAEUaW5kZXjUAQx1MzIAARBuYW1lOAEcVmVjPHU4PgABLG1vZHVsZV9uYW1lOAEcVmVjPHU4PgABLGNyYXRlX21ham9y1AEMdTMyAAE8bWluX2NyYXRlX21pbm9y1AEMdTMyACIAUFJlcG9ydFRyYW5zYWN0U3RhdHVzBADJBgFEUXVlcnlSZXNwb25zZUluZm8AIwBMQ2xlYXJUcmFuc2FjdFN0YXR1cwAkADxVbml2ZXJzYWxPcmlnaW4EAAEBASBKdW5jdGlvbgAlADRFeHBvcnRNZXNzYWdlDAEcbmV0d29yawkBASROZXR3b3JrSWQAASxkZXN0aW5hdGlvbvgBQEludGVyaW9yTG9jYXRpb24AAQx4Y22RBgEcWGNtPCgpPgAmACRMb2NrQXNzZXQIARRhc3NldKUGARRBc3NldAABIHVubG9ja2Vy9AEgTG9jYXRpb24AJwAsVW5sb2NrQXNzZXQIARRhc3NldKUGARRBc3NldAABGHRhcmdldPQBIExvY2F0aW9uACgAOE5vdGVVbmxvY2thYmxlCAEUYXNzZXSlBgEUQXNzZXQAARRvd25lcvQBIExvY2F0aW9uACkANFJlcXVlc3RVbmxvY2sIARRhc3NldKUGARRBc3NldAABGGxvY2tlcvQBIExvY2F0aW9uACoALFNldEZlZXNNb2RlBAEwaml0X3dpdGhkcmF3IAEQYm9vbAArACBTZXRUb3BpYwQABAEgW3U4OyAzMl0ALAAoQ2xlYXJUb3BpYwAtACxBbGlhc09yaWdpbgQA9AEgTG9jYXRpb24ALgA8VW5wYWlkRXhlY3V0aW9uCAEwd2VpZ2h0X2xpbWl0jQYBLFdlaWdodExpbWl0AAEwY2hlY2tfb3JpZ2luxQYBQE9wdGlvbjxMb2NhdGlvbj4ALwAAnQYQLHN0YWdpbmdfeGNtCHY0FGFzc2V0GEFzc2V0cwAABAChBgEoVmVjPEFzc2V0PgAAoQYAAAKlBgClBhAsc3RhZ2luZ194Y20IdjQUYXNzZXQUQXNzZXQAAAgBCGlkKQEBHEFzc2V0SWQAAQxmdW6pBgEsRnVuZ2liaWxpdHkAAKkGECxzdGFnaW5nX3hjbQh2NBRhc3NldCxGdW5naWJpbGl0eQABCCBGdW5naWJsZQQA5AEQdTEyOAAAACxOb25GdW5naWJsZQQArQYBNEFzc2V0SW5zdGFuY2UAAQAArQYQLHN0YWdpbmdfeGNtCHY0FGFzc2V0NEFzc2V0SW5zdGFuY2UAARgkVW5kZWZpbmVkAAAAFEluZGV4BADkARB1MTI4AAEAGEFycmF5NAQASAEcW3U4OyA0XQACABhBcnJheTgEAAEGARxbdTg7IDhdAAMAHEFycmF5MTYEAKgBIFt1ODsgMTZdAAQAHEFycmF5MzIEAAQBIFt1ODsgMzJdAAUAALEGDCxzdGFnaW5nX3hjbQh2NCBSZXNwb25zZQABGBBOdWxsAAAAGEFzc2V0cwQAnQYBGEFzc2V0cwABADxFeGVjdXRpb25SZXN1bHQEAFEGAVBPcHRpb248KHUzMiwgRXJyb3IpPgACABxWZXJzaW9uBAAQAThzdXBlcjo6VmVyc2lvbgADACxQYWxsZXRzSW5mbwQAtQYBmEJvdW5kZWRWZWM8UGFsbGV0SW5mbywgTWF4UGFsbGV0c0luZm8+AAQAOERpc3BhdGNoUmVzdWx0BABtBgE4TWF5YmVFcnJvckNvZGUABQAAtQYMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAG5BgRTAAAEAMEGARhWZWM8VD4AALkGDCxzdGFnaW5nX3hjbQh2NChQYWxsZXRJbmZvAAAYARRpbmRleNQBDHUzMgABEG5hbWW9BgGAQm91bmRlZFZlYzx1OCwgTWF4UGFsbGV0TmFtZUxlbj4AASxtb2R1bGVfbmFtZb0GAYBCb3VuZGVkVmVjPHU4LCBNYXhQYWxsZXROYW1lTGVuPgABFG1ham9y1AEMdTMyAAEUbWlub3LUAQx1MzIAARRwYXRjaNQBDHUzMgAAvQYMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAEIBFMAAAQAOAEYVmVjPFQ+AADBBgAAArkGAMUGBBhPcHRpb24EBFQB9AEIEE5vbmUAAAAQU29tZQQA9AAAAQAAyQYMLHN0YWdpbmdfeGNtCHY0RFF1ZXJ5UmVzcG9uc2VJbmZvAAAMASxkZXN0aW5hdGlvbvQBIExvY2F0aW9uAAEgcXVlcnlfaWQsARxRdWVyeUlkAAEobWF4X3dlaWdodCgBGFdlaWdodAAAzQYQLHN0YWdpbmdfeGNtCHY0FGFzc2V0LEFzc2V0RmlsdGVyAAEIIERlZmluaXRlBACdBgEYQXNzZXRzAAAAEFdpbGQEANEGASRXaWxkQXNzZXQAAQAA0QYQLHN0YWdpbmdfeGNtCHY0FGFzc2V0JFdpbGRBc3NldAABEAxBbGwAAAAUQWxsT2YIAQhpZCkBARxBc3NldElkAAEMZnVu1QYBPFdpbGRGdW5naWJpbGl0eQABAChBbGxDb3VudGVkBADUAQx1MzIAAgAwQWxsT2ZDb3VudGVkDAEIaWQpAQEcQXNzZXRJZAABDGZ1btUGATxXaWxkRnVuZ2liaWxpdHkAARRjb3VudNQBDHUzMgADAADVBhAsc3RhZ2luZ194Y20IdjQUYXNzZXQ8V2lsZEZ1bmdpYmlsaXR5AAEIIEZ1bmdpYmxlAAAALE5vbkZ1bmdpYmxlAAEAANkGCAx4Y208VmVyc2lvbmVkQXNzZXRzAAEMCFYyBADpBQE8djI6Ok11bHRpQXNzZXRzAAEACFYzBAA5BgE8djM6Ok11bHRpQXNzZXRzAAMACFY0BACdBgEodjQ6OkFzc2V0cwAEAADdBggMeGNtMFZlcnNpb25lZFhjbQQsUnVudGltZUNhbGwAAQwIVjIEAOEGAVB2Mjo6WGNtPFJ1bnRpbWVDYWxsPgACAAhWMwQA8QYBUHYzOjpYY208UnVudGltZUNhbGw+AAMACFY0BAD9BgFQdjQ6OlhjbTxSdW50aW1lQ2FsbD4ABAAA4QYMDHhjbQh2MgxYY20ELFJ1bnRpbWVDYWxsAAAEAOUGAXRWZWM8SW5zdHJ1Y3Rpb248UnVudGltZUNhbGw+PgAA5QYAAALpBgDpBgwMeGNtCHYyLEluc3RydWN0aW9uBCxSdW50aW1lQ2FsbAABcDRXaXRoZHJhd0Fzc2V0BADpBQEsTXVsdGlBc3NldHMAAABUUmVzZXJ2ZUFzc2V0RGVwb3NpdGVkBADpBQEsTXVsdGlBc3NldHMAAQBYUmVjZWl2ZVRlbGVwb3J0ZWRBc3NldAQA6QUBLE11bHRpQXNzZXRzAAIANFF1ZXJ5UmVzcG9uc2UMASBxdWVyeV9pZCwBHFF1ZXJ5SWQAASByZXNwb25zZQUGASBSZXNwb25zZQABKG1heF93ZWlnaHQsAQx1NjQAAwA0VHJhbnNmZXJBc3NldAgBGGFzc2V0c+kFASxNdWx0aUFzc2V0cwABLGJlbmVmaWNpYXJ5MQEBNE11bHRpTG9jYXRpb24ABABQVHJhbnNmZXJSZXNlcnZlQXNzZXQMARhhc3NldHPpBQEsTXVsdGlBc3NldHMAARBkZXN0MQEBNE11bHRpTG9jYXRpb24AAQx4Y23dBQEcWGNtPCgpPgAFACBUcmFuc2FjdAwBLG9yaWdpbl90eXBlFQYBKE9yaWdpbktpbmQAAVhyZXF1aXJlX3dlaWdodF9hdF9tb3N0LAEMdTY0AAEQY2FsbO0GAWhEb3VibGVFbmNvZGVkPFJ1bnRpbWVDYWxsPgAGAGRIcm1wTmV3Q2hhbm5lbE9wZW5SZXF1ZXN0DAEYc2VuZGVy1AEMdTMyAAFAbWF4X21lc3NhZ2Vfc2l6ZdQBDHUzMgABMG1heF9jYXBhY2l0edQBDHUzMgAHAExIcm1wQ2hhbm5lbEFjY2VwdGVkBAEkcmVjaXBpZW501AEMdTMyAAgASEhybXBDaGFubmVsQ2xvc2luZwwBJGluaXRpYXRvctQBDHUzMgABGHNlbmRlctQBDHUzMgABJHJlY2lwaWVudNQBDHUzMgAJACxDbGVhck9yaWdpbgAKADREZXNjZW5kT3JpZ2luBAA1AQFUSW50ZXJpb3JNdWx0aUxvY2F0aW9uAAsALFJlcG9ydEVycm9yDAEgcXVlcnlfaWQsARxRdWVyeUlkAAEQZGVzdDEBATRNdWx0aUxvY2F0aW9uAAFMbWF4X3Jlc3BvbnNlX3dlaWdodCwBDHU2NAAMADBEZXBvc2l0QXNzZXQMARhhc3NldHMdBgFATXVsdGlBc3NldEZpbHRlcgABKG1heF9hc3NldHPUAQx1MzIAASxiZW5lZmljaWFyeTEBATRNdWx0aUxvY2F0aW9uAA0ATERlcG9zaXRSZXNlcnZlQXNzZXQQARhhc3NldHMdBgFATXVsdGlBc3NldEZpbHRlcgABKG1heF9hc3NldHPUAQx1MzIAARBkZXN0MQEBNE11bHRpTG9jYXRpb24AAQx4Y23dBQEcWGNtPCgpPgAOADRFeGNoYW5nZUFzc2V0CAEQZ2l2ZR0GAUBNdWx0aUFzc2V0RmlsdGVyAAEccmVjZWl2ZekFASxNdWx0aUFzc2V0cwAPAFxJbml0aWF0ZVJlc2VydmVXaXRoZHJhdwwBGGFzc2V0cx0GAUBNdWx0aUFzc2V0RmlsdGVyAAEccmVzZXJ2ZTEBATRNdWx0aUxvY2F0aW9uAAEMeGNt3QUBHFhjbTwoKT4AEABASW5pdGlhdGVUZWxlcG9ydAwBGGFzc2V0cx0GAUBNdWx0aUFzc2V0RmlsdGVyAAEQZGVzdDEBATRNdWx0aUxvY2F0aW9uAAEMeGNt3QUBHFhjbTwoKT4AEQAwUXVlcnlIb2xkaW5nEAEgcXVlcnlfaWQsARxRdWVyeUlkAAEQZGVzdDEBATRNdWx0aUxvY2F0aW9uAAEYYXNzZXRzHQYBQE11bHRpQXNzZXRGaWx0ZXIAAUxtYXhfcmVzcG9uc2Vfd2VpZ2h0LAEMdTY0ABIAMEJ1eUV4ZWN1dGlvbggBEGZlZXPxBQEoTXVsdGlBc3NldAABMHdlaWdodF9saW1pdCkGASxXZWlnaHRMaW1pdAATADRSZWZ1bmRTdXJwbHVzABQAPFNldEVycm9ySGFuZGxlcgQA4QYBQFhjbTxSdW50aW1lQ2FsbD4AFQAsU2V0QXBwZW5kaXgEAOEGAUBYY208UnVudGltZUNhbGw+ABYAKENsZWFyRXJyb3IAFwAoQ2xhaW1Bc3NldAgBGGFzc2V0c+kFASxNdWx0aUFzc2V0cwABGHRpY2tldDEBATRNdWx0aUxvY2F0aW9uABgAEFRyYXAEACwBDHU2NAAZAEBTdWJzY3JpYmVWZXJzaW9uCAEgcXVlcnlfaWQsARxRdWVyeUlkAAFMbWF4X3Jlc3BvbnNlX3dlaWdodCwBDHU2NAAaAEhVbnN1YnNjcmliZVZlcnNpb24AGwAA7QYMDHhjbThkb3VibGVfZW5jb2RlZDREb3VibGVFbmNvZGVkBARUAAAEARxlbmNvZGVkOAEcVmVjPHU4PgAA8QYMDHhjbQh2MwxYY20EEENhbGwAAAQA9QYBWFZlYzxJbnN0cnVjdGlvbjxDYWxsPj4AAPUGAAAC+QYA+QYMDHhjbQh2MyxJbnN0cnVjdGlvbgQQQ2FsbAABwDRXaXRoZHJhd0Fzc2V0BAA5BgEsTXVsdGlBc3NldHMAAABUUmVzZXJ2ZUFzc2V0RGVwb3NpdGVkBAA5BgEsTXVsdGlBc3NldHMAAQBYUmVjZWl2ZVRlbGVwb3J0ZWRBc3NldAQAOQYBLE11bHRpQXNzZXRzAAIANFF1ZXJ5UmVzcG9uc2UQASBxdWVyeV9pZCwBHFF1ZXJ5SWQAASByZXNwb25zZU0GASBSZXNwb25zZQABKG1heF93ZWlnaHQoARhXZWlnaHQAARxxdWVyaWVydQYBVE9wdGlvbjxNdWx0aUxvY2F0aW9uPgADADRUcmFuc2ZlckFzc2V0CAEYYXNzZXRzOQYBLE11bHRpQXNzZXRzAAEsYmVuZWZpY2lhcnnIATRNdWx0aUxvY2F0aW9uAAQAUFRyYW5zZmVyUmVzZXJ2ZUFzc2V0DAEYYXNzZXRzOQYBLE11bHRpQXNzZXRzAAEQZGVzdMgBNE11bHRpTG9jYXRpb24AAQx4Y20tBgEcWGNtPCgpPgAFACBUcmFuc2FjdAwBLG9yaWdpbl9raW5keQYBKE9yaWdpbktpbmQAAVhyZXF1aXJlX3dlaWdodF9hdF9tb3N0KAEYV2VpZ2h0AAEQY2FsbO0GAUxEb3VibGVFbmNvZGVkPENhbGw+AAYAZEhybXBOZXdDaGFubmVsT3BlblJlcXVlc3QMARhzZW5kZXLUAQx1MzIAAUBtYXhfbWVzc2FnZV9zaXpl1AEMdTMyAAEwbWF4X2NhcGFjaXR51AEMdTMyAAcATEhybXBDaGFubmVsQWNjZXB0ZWQEASRyZWNpcGllbnTUAQx1MzIACABISHJtcENoYW5uZWxDbG9zaW5nDAEkaW5pdGlhdG9y1AEMdTMyAAEYc2VuZGVy1AEMdTMyAAEkcmVjaXBpZW501AEMdTMyAAkALENsZWFyT3JpZ2luAAoANERlc2NlbmRPcmlnaW4EAMwBVEludGVyaW9yTXVsdGlMb2NhdGlvbgALACxSZXBvcnRFcnJvcgQAfQYBRFF1ZXJ5UmVzcG9uc2VJbmZvAAwAMERlcG9zaXRBc3NldAgBGGFzc2V0c4EGAUBNdWx0aUFzc2V0RmlsdGVyAAEsYmVuZWZpY2lhcnnIATRNdWx0aUxvY2F0aW9uAA0ATERlcG9zaXRSZXNlcnZlQXNzZXQMARhhc3NldHOBBgFATXVsdGlBc3NldEZpbHRlcgABEGRlc3TIATRNdWx0aUxvY2F0aW9uAAEMeGNtLQYBHFhjbTwoKT4ADgA0RXhjaGFuZ2VBc3NldAwBEGdpdmWBBgFATXVsdGlBc3NldEZpbHRlcgABEHdhbnQ5BgEsTXVsdGlBc3NldHMAARxtYXhpbWFsIAEQYm9vbAAPAFxJbml0aWF0ZVJlc2VydmVXaXRoZHJhdwwBGGFzc2V0c4EGAUBNdWx0aUFzc2V0RmlsdGVyAAEccmVzZXJ2ZcgBNE11bHRpTG9jYXRpb24AAQx4Y20tBgEcWGNtPCgpPgAQAEBJbml0aWF0ZVRlbGVwb3J0DAEYYXNzZXRzgQYBQE11bHRpQXNzZXRGaWx0ZXIAARBkZXN0yAE0TXVsdGlMb2NhdGlvbgABDHhjbS0GARxYY208KCk+ABEANFJlcG9ydEhvbGRpbmcIATRyZXNwb25zZV9pbmZvfQYBRFF1ZXJ5UmVzcG9uc2VJbmZvAAEYYXNzZXRzgQYBQE11bHRpQXNzZXRGaWx0ZXIAEgAwQnV5RXhlY3V0aW9uCAEQZmVlc0EGAShNdWx0aUFzc2V0AAEwd2VpZ2h0X2xpbWl0jQYBLFdlaWdodExpbWl0ABMANFJlZnVuZFN1cnBsdXMAFAA8U2V0RXJyb3JIYW5kbGVyBADxBgEkWGNtPENhbGw+ABUALFNldEFwcGVuZGl4BADxBgEkWGNtPENhbGw+ABYAKENsZWFyRXJyb3IAFwAoQ2xhaW1Bc3NldAgBGGFzc2V0czkGASxNdWx0aUFzc2V0cwABGHRpY2tldMgBNE11bHRpTG9jYXRpb24AGAAQVHJhcAQALAEMdTY0ABkAQFN1YnNjcmliZVZlcnNpb24IASBxdWVyeV9pZCwBHFF1ZXJ5SWQAAUxtYXhfcmVzcG9uc2Vfd2VpZ2h0KAEYV2VpZ2h0ABoASFVuc3Vic2NyaWJlVmVyc2lvbgAbACRCdXJuQXNzZXQEADkGASxNdWx0aUFzc2V0cwAcACxFeHBlY3RBc3NldAQAOQYBLE11bHRpQXNzZXRzAB0AMEV4cGVjdE9yaWdpbgQAdQYBVE9wdGlvbjxNdWx0aUxvY2F0aW9uPgAeACxFeHBlY3RFcnJvcgQAUQYBUE9wdGlvbjwodTMyLCBFcnJvcik+AB8AUEV4cGVjdFRyYW5zYWN0U3RhdHVzBABtBgE4TWF5YmVFcnJvckNvZGUAIAAsUXVlcnlQYWxsZXQIASxtb2R1bGVfbmFtZTgBHFZlYzx1OD4AATRyZXNwb25zZV9pbmZvfQYBRFF1ZXJ5UmVzcG9uc2VJbmZvACEAMEV4cGVjdFBhbGxldBQBFGluZGV41AEMdTMyAAEQbmFtZTgBHFZlYzx1OD4AASxtb2R1bGVfbmFtZTgBHFZlYzx1OD4AASxjcmF0ZV9tYWpvctQBDHUzMgABPG1pbl9jcmF0ZV9taW5vctQBDHUzMgAiAFBSZXBvcnRUcmFuc2FjdFN0YXR1cwQAfQYBRFF1ZXJ5UmVzcG9uc2VJbmZvACMATENsZWFyVHJhbnNhY3RTdGF0dXMAJAA8VW5pdmVyc2FsT3JpZ2luBADQASBKdW5jdGlvbgAlADRFeHBvcnRNZXNzYWdlDAEcbmV0d29ya9wBJE5ldHdvcmtJZAABLGRlc3RpbmF0aW9uzAFUSW50ZXJpb3JNdWx0aUxvY2F0aW9uAAEMeGNtLQYBHFhjbTwoKT4AJgAkTG9ja0Fzc2V0CAEUYXNzZXRBBgEoTXVsdGlBc3NldAABIHVubG9ja2VyyAE0TXVsdGlMb2NhdGlvbgAnACxVbmxvY2tBc3NldAgBFGFzc2V0QQYBKE11bHRpQXNzZXQAARh0YXJnZXTIATRNdWx0aUxvY2F0aW9uACgAOE5vdGVVbmxvY2thYmxlCAEUYXNzZXRBBgEoTXVsdGlBc3NldAABFG93bmVyyAE0TXVsdGlMb2NhdGlvbgApADRSZXF1ZXN0VW5sb2NrCAEUYXNzZXRBBgEoTXVsdGlBc3NldAABGGxvY2tlcsgBNE11bHRpTG9jYXRpb24AKgAsU2V0RmVlc01vZGUEATBqaXRfd2l0aGRyYXcgARBib29sACsAIFNldFRvcGljBAAEASBbdTg7IDMyXQAsAChDbGVhclRvcGljAC0ALEFsaWFzT3JpZ2luBADIATRNdWx0aUxvY2F0aW9uAC4APFVucGFpZEV4ZWN1dGlvbggBMHdlaWdodF9saW1pdI0GASxXZWlnaHRMaW1pdAABMGNoZWNrX29yaWdpbnUGAVRPcHRpb248TXVsdGlMb2NhdGlvbj4ALwAA/QYMLHN0YWdpbmdfeGNtCHY0DFhjbQQQQ2FsbAAABAABBwFYVmVjPEluc3RydWN0aW9uPENhbGw+PgAAAQcAAAIFBwAFBwwsc3RhZ2luZ194Y20IdjQsSW5zdHJ1Y3Rpb24EEENhbGwAAcA0V2l0aGRyYXdBc3NldAQAnQYBGEFzc2V0cwAAAFRSZXNlcnZlQXNzZXREZXBvc2l0ZWQEAJ0GARhBc3NldHMAAQBYUmVjZWl2ZVRlbGVwb3J0ZWRBc3NldAQAnQYBGEFzc2V0cwACADRRdWVyeVJlc3BvbnNlEAEgcXVlcnlfaWQsARxRdWVyeUlkAAEgcmVzcG9uc2WxBgEgUmVzcG9uc2UAAShtYXhfd2VpZ2h0KAEYV2VpZ2h0AAEccXVlcmllcsUGAUBPcHRpb248TG9jYXRpb24+AAMANFRyYW5zZmVyQXNzZXQIARhhc3NldHOdBgEYQXNzZXRzAAEsYmVuZWZpY2lhcnn0ASBMb2NhdGlvbgAEAFBUcmFuc2ZlclJlc2VydmVBc3NldAwBGGFzc2V0c50GARhBc3NldHMAARBkZXN09AEgTG9jYXRpb24AAQx4Y22RBgEcWGNtPCgpPgAFACBUcmFuc2FjdAwBLG9yaWdpbl9raW5keQYBKE9yaWdpbktpbmQAAVhyZXF1aXJlX3dlaWdodF9hdF9tb3N0KAEYV2VpZ2h0AAEQY2FsbO0GAUxEb3VibGVFbmNvZGVkPENhbGw+AAYAZEhybXBOZXdDaGFubmVsT3BlblJlcXVlc3QMARhzZW5kZXLUAQx1MzIAAUBtYXhfbWVzc2FnZV9zaXpl1AEMdTMyAAEwbWF4X2NhcGFjaXR51AEMdTMyAAcATEhybXBDaGFubmVsQWNjZXB0ZWQEASRyZWNpcGllbnTUAQx1MzIACABISHJtcENoYW5uZWxDbG9zaW5nDAEkaW5pdGlhdG9y1AEMdTMyAAEYc2VuZGVy1AEMdTMyAAEkcmVjaXBpZW501AEMdTMyAAkALENsZWFyT3JpZ2luAAoANERlc2NlbmRPcmlnaW4EAPgBQEludGVyaW9yTG9jYXRpb24ACwAsUmVwb3J0RXJyb3IEAMkGAURRdWVyeVJlc3BvbnNlSW5mbwAMADBEZXBvc2l0QXNzZXQIARhhc3NldHPNBgEsQXNzZXRGaWx0ZXIAASxiZW5lZmljaWFyefQBIExvY2F0aW9uAA0ATERlcG9zaXRSZXNlcnZlQXNzZXQMARhhc3NldHPNBgEsQXNzZXRGaWx0ZXIAARBkZXN09AEgTG9jYXRpb24AAQx4Y22RBgEcWGNtPCgpPgAOADRFeGNoYW5nZUFzc2V0DAEQZ2l2Zc0GASxBc3NldEZpbHRlcgABEHdhbnSdBgEYQXNzZXRzAAEcbWF4aW1hbCABEGJvb2wADwBcSW5pdGlhdGVSZXNlcnZlV2l0aGRyYXcMARhhc3NldHPNBgEsQXNzZXRGaWx0ZXIAARxyZXNlcnZl9AEgTG9jYXRpb24AAQx4Y22RBgEcWGNtPCgpPgAQAEBJbml0aWF0ZVRlbGVwb3J0DAEYYXNzZXRzzQYBLEFzc2V0RmlsdGVyAAEQZGVzdPQBIExvY2F0aW9uAAEMeGNtkQYBHFhjbTwoKT4AEQA0UmVwb3J0SG9sZGluZwgBNHJlc3BvbnNlX2luZm/JBgFEUXVlcnlSZXNwb25zZUluZm8AARhhc3NldHPNBgEsQXNzZXRGaWx0ZXIAEgAwQnV5RXhlY3V0aW9uCAEQZmVlc6UGARRBc3NldAABMHdlaWdodF9saW1pdI0GASxXZWlnaHRMaW1pdAATADRSZWZ1bmRTdXJwbHVzABQAPFNldEVycm9ySGFuZGxlcgQA/QYBJFhjbTxDYWxsPgAVACxTZXRBcHBlbmRpeAQA/QYBJFhjbTxDYWxsPgAWAChDbGVhckVycm9yABcAKENsYWltQXNzZXQIARhhc3NldHOdBgEYQXNzZXRzAAEYdGlja2V09AEgTG9jYXRpb24AGAAQVHJhcAQALAEMdTY0ABkAQFN1YnNjcmliZVZlcnNpb24IASBxdWVyeV9pZCwBHFF1ZXJ5SWQAAUxtYXhfcmVzcG9uc2Vfd2VpZ2h0KAEYV2VpZ2h0ABoASFVuc3Vic2NyaWJlVmVyc2lvbgAbACRCdXJuQXNzZXQEAJ0GARhBc3NldHMAHAAsRXhwZWN0QXNzZXQEAJ0GARhBc3NldHMAHQAwRXhwZWN0T3JpZ2luBADFBgFAT3B0aW9uPExvY2F0aW9uPgAeACxFeHBlY3RFcnJvcgQAUQYBUE9wdGlvbjwodTMyLCBFcnJvcik+AB8AUEV4cGVjdFRyYW5zYWN0U3RhdHVzBABtBgE4TWF5YmVFcnJvckNvZGUAIAAsUXVlcnlQYWxsZXQIASxtb2R1bGVfbmFtZTgBHFZlYzx1OD4AATRyZXNwb25zZV9pbmZvyQYBRFF1ZXJ5UmVzcG9uc2VJbmZvACEAMEV4cGVjdFBhbGxldBQBFGluZGV41AEMdTMyAAEQbmFtZTgBHFZlYzx1OD4AASxtb2R1bGVfbmFtZTgBHFZlYzx1OD4AASxjcmF0ZV9tYWpvctQBDHUzMgABPG1pbl9jcmF0ZV9taW5vctQBDHUzMgAiAFBSZXBvcnRUcmFuc2FjdFN0YXR1cwQAyQYBRFF1ZXJ5UmVzcG9uc2VJbmZvACMATENsZWFyVHJhbnNhY3RTdGF0dXMAJAA8VW5pdmVyc2FsT3JpZ2luBAABAQEgSnVuY3Rpb24AJQA0RXhwb3J0TWVzc2FnZQwBHG5ldHdvcmsJAQEkTmV0d29ya0lkAAEsZGVzdGluYXRpb274AUBJbnRlcmlvckxvY2F0aW9uAAEMeGNtkQYBHFhjbTwoKT4AJgAkTG9ja0Fzc2V0CAEUYXNzZXSlBgEUQXNzZXQAASB1bmxvY2tlcvQBIExvY2F0aW9uACcALFVubG9ja0Fzc2V0CAEUYXNzZXSlBgEUQXNzZXQAARh0YXJnZXT0ASBMb2NhdGlvbgAoADhOb3RlVW5sb2NrYWJsZQgBFGFzc2V0pQYBFEFzc2V0AAEUb3duZXL0ASBMb2NhdGlvbgApADRSZXF1ZXN0VW5sb2NrCAEUYXNzZXSlBgEUQXNzZXQAARhsb2NrZXL0ASBMb2NhdGlvbgAqACxTZXRGZWVzTW9kZQQBMGppdF93aXRoZHJhdyABEGJvb2wAKwAgU2V0VG9waWMEAAQBIFt1ODsgMzJdACwAKENsZWFyVG9waWMALQAsQWxpYXNPcmlnaW4EAPQBIExvY2F0aW9uAC4APFVucGFpZEV4ZWN1dGlvbggBMHdlaWdodF9saW1pdI0GASxXZWlnaHRMaW1pdAABMGNoZWNrX29yaWdpbsUGAUBPcHRpb248TG9jYXRpb24+AC8AAAkHEFBzdGFnaW5nX3hjbV9leGVjdXRvchh0cmFpdHM4YXNzZXRfdHJhbnNmZXIwVHJhbnNmZXJUeXBlAAEQIFRlbGVwb3J0AAAAMExvY2FsUmVzZXJ2ZQABAEhEZXN0aW5hdGlvblJlc2VydmUAAgA0UmVtb3RlUmVzZXJ2ZQQALQEBRFZlcnNpb25lZExvY2F0aW9uAAMAAA0HCAx4Y21AVmVyc2lvbmVkQXNzZXRJZAABCAhWMwQA8AEsdjM6OkFzc2V0SWQAAwAIVjQEACkBASx2NDo6QXNzZXRJZAAEAAARBwxQcGFsbGV0X21lc3NhZ2VfcXVldWUYcGFsbGV0EENhbGwEBFQAAQgkcmVhcF9wYWdlCAE4bWVzc2FnZV9vcmlnaW4VBwFITWVzc2FnZU9yaWdpbk9mPFQ+AAEocGFnZV9pbmRleBABJFBhZ2VJbmRleAAABD0BUmVtb3ZlIGEgcGFnZSB3aGljaCBoYXMgbm8gbW9yZSBtZXNzYWdlcyByZW1haW5pbmcgdG8gYmUgcHJvY2Vzc2VkIG9yIGlzIHN0YWxlLkhleGVjdXRlX292ZXJ3ZWlnaHQQAThtZXNzYWdlX29yaWdpbhUHAUhNZXNzYWdlT3JpZ2luT2Y8VD4AARBwYWdlEAEkUGFnZUluZGV4AAEUaW5kZXgQARxUOjpTaXplAAEwd2VpZ2h0X2xpbWl0KAEYV2VpZ2h0AAE0eEV4ZWN1dGUgYW4gb3ZlcndlaWdodCBtZXNzYWdlLgBNAVRlbXBvcmFyeSBwcm9jZXNzaW5nIGVycm9ycyB3aWxsIGJlIHByb3BhZ2F0ZWQgd2hlcmVhcyBwZXJtYW5lbnQgZXJyb3JzIGFyZSB0cmVhdGVkVGFzIHN1Y2Nlc3MgY29uZGl0aW9uLgB0LSBgb3JpZ2luYDogTXVzdCBiZSBgU2lnbmVkYC41AS0gYG1lc3NhZ2Vfb3JpZ2luYDogVGhlIG9yaWdpbiBmcm9tIHdoaWNoIHRoZSBtZXNzYWdlIHRvIGJlIGV4ZWN1dGVkIGFycml2ZWQuPQEtIGBwYWdlYDogVGhlIHBhZ2UgaW4gdGhlIHF1ZXVlIGluIHdoaWNoIHRoZSBtZXNzYWdlIHRvIGJlIGV4ZWN1dGVkIGlzIHNpdHRpbmcuCQEtIGBpbmRleGA6IFRoZSBpbmRleCBpbnRvIHRoZSBxdWV1ZSBvZiB0aGUgbWVzc2FnZSB0byBiZSBleGVjdXRlZC5ZAS0gYHdlaWdodF9saW1pdGA6IFRoZSBtYXhpbXVtIGFtb3VudCBvZiB3ZWlnaHQgYWxsb3dlZCB0byBiZSBjb25zdW1lZCBpbiB0aGUgZXhlY3V0aW9uRCAgb2YgdGhlIG1lc3NhZ2UuAPRCZW5jaG1hcmsgY29tcGxleGl0eSBjb25zaWRlcmF0aW9uczogTyhpbmRleCArIHdlaWdodF9saW1pdCkuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLhUHDGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMkaW5jbHVzaW9uWEFnZ3JlZ2F0ZU1lc3NhZ2VPcmlnaW4AAQQMVW1wBAAZBwEoVW1wUXVldWVJZAAAAAAZBwxscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zJGluY2x1c2lvbihVbXBRdWV1ZUlkAAEEEFBhcmEEAGkCARhQYXJhSWQAAAAAHQcMRHBhbGxldF9hc3NldF9yYXRlGHBhbGxldBBDYWxsBARUAAEMGGNyZWF0ZQgBKGFzc2V0X2tpbmTEAURCb3g8VDo6QXNzZXRLaW5kPgABEHJhdGUhBwEkRml4ZWRVMTI4AAAQDQFJbml0aWFsaXplIGEgY29udmVyc2lvbiByYXRlIHRvIG5hdGl2ZSBiYWxhbmNlIGZvciB0aGUgZ2l2ZW4gYXNzZXQuADQjIyBDb21wbGV4aXR5GC0gTygxKRh1cGRhdGUIAShhc3NldF9raW5kxAFEQm94PFQ6OkFzc2V0S2luZD4AARByYXRlIQcBJEZpeGVkVTEyOAABEAUBVXBkYXRlIHRoZSBjb252ZXJzaW9uIHJhdGUgdG8gbmF0aXZlIGJhbGFuY2UgZm9yIHRoZSBnaXZlbiBhc3NldC4ANCMjIENvbXBsZXhpdHkYLSBPKDEpGHJlbW92ZQQBKGFzc2V0X2tpbmTEAURCb3g8VDo6QXNzZXRLaW5kPgACECUBUmVtb3ZlIGFuIGV4aXN0aW5nIGNvbnZlcnNpb24gcmF0ZSB0byBuYXRpdmUgYmFsYW5jZSBmb3IgdGhlIGdpdmVuIGFzc2V0LgA0IyMgQ29tcGxleGl0eRgtIE8oMSkEDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMuIQcMNHNwX2FyaXRobWV0aWMsZml4ZWRfcG9pbnQkRml4ZWRVMTI4AAAEABgBEHUxMjgAACUHDDBwYWxsZXRfYmVlZnkYcGFsbGV0EENhbGwEBFQAAQxMcmVwb3J0X2VxdWl2b2NhdGlvbggBSGVxdWl2b2NhdGlvbl9wcm9vZikHAY0BQm94PERvdWJsZVZvdGluZ1Byb29mPEJsb2NrTnVtYmVyRm9yPFQ+LCBUOjpCZWVmeUlkLDxUOjpCZWVmeUlkCmFzIFJ1bnRpbWVBcHBQdWJsaWM+OjpTaWduYXR1cmUsPiw+AAE8a2V5X293bmVyX3Byb29mhQEBQFQ6OktleU93bmVyUHJvb2YAABAJAVJlcG9ydCB2b3RlciBlcXVpdm9jYXRpb24vbWlzYmVoYXZpb3IuIFRoaXMgbWV0aG9kIHdpbGwgdmVyaWZ5IHRoZfRlcXVpdm9jYXRpb24gcHJvb2YgYW5kIHZhbGlkYXRlIHRoZSBnaXZlbiBrZXkgb3duZXJzaGlwIHByb29m+GFnYWluc3QgdGhlIGV4dHJhY3RlZCBvZmZlbmRlci4gSWYgYm90aCBhcmUgdmFsaWQsIHRoZSBvZmZlbmNlRHdpbGwgYmUgcmVwb3J0ZWQucHJlcG9ydF9lcXVpdm9jYXRpb25fdW5zaWduZWQIAUhlcXVpdm9jYXRpb25fcHJvb2YpBwGNAUJveDxEb3VibGVWb3RpbmdQcm9vZjxCbG9ja051bWJlckZvcjxUPiwgVDo6QmVlZnlJZCw8VDo6QmVlZnlJZAphcyBSdW50aW1lQXBwUHVibGljPjo6U2lnbmF0dXJlLD4sPgABPGtleV9vd25lcl9wcm9vZoUBAUBUOjpLZXlPd25lclByb29mAAEkCQFSZXBvcnQgdm90ZXIgZXF1aXZvY2F0aW9uL21pc2JlaGF2aW9yLiBUaGlzIG1ldGhvZCB3aWxsIHZlcmlmeSB0aGX0ZXF1aXZvY2F0aW9uIHByb29mIGFuZCB2YWxpZGF0ZSB0aGUgZ2l2ZW4ga2V5IG93bmVyc2hpcCBwcm9vZvhhZ2FpbnN0IHRoZSBleHRyYWN0ZWQgb2ZmZW5kZXIuIElmIGJvdGggYXJlIHZhbGlkLCB0aGUgb2ZmZW5jZUR3aWxsIGJlIHJlcG9ydGVkLgANAVRoaXMgZXh0cmluc2ljIG11c3QgYmUgY2FsbGVkIHVuc2lnbmVkIGFuZCBpdCBpcyBleHBlY3RlZCB0aGF0IG9ubHkVAWJsb2NrIGF1dGhvcnMgd2lsbCBjYWxsIGl0ICh2YWxpZGF0ZWQgaW4gYFZhbGlkYXRlVW5zaWduZWRgKSwgYXMgc3VjaBUBaWYgdGhlIGJsb2NrIGF1dGhvciBpcyBkZWZpbmVkIGl0IHdpbGwgYmUgZGVmaW5lZCBhcyB0aGUgZXF1aXZvY2F0aW9uJHJlcG9ydGVyLjxzZXRfbmV3X2dlbmVzaXMEATxkZWxheV9pbl9ibG9ja3MQAURCbG9ja051bWJlckZvcjxUPgACEF0BUmVzZXQgQkVFRlkgY29uc2Vuc3VzIGJ5IHNldHRpbmcgYSBuZXcgQkVFRlkgZ2VuZXNpcyBhdCBgZGVsYXlfaW5fYmxvY2tzYCBibG9ja3MgaW4gdGhlHGZ1dHVyZS4AtE5vdGU6IGBkZWxheV9pbl9ibG9ja3NgIGhhcyB0byBiZSBhdCBsZWFzdCAxLgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy4pBwhIc3BfY29uc2Vuc3VzX2JlZWZ5RERvdWJsZVZvdGluZ1Byb29mDBhOdW1iZXIBEAhJZAEFAiRTaWduYXR1cmUBLQcACAEUZmlyc3QxBwGIVm90ZU1lc3NhZ2U8TnVtYmVyLCBJZCwgU2lnbmF0dXJlPgABGHNlY29uZDEHAYhWb3RlTWVzc2FnZTxOdW1iZXIsIElkLCBTaWduYXR1cmU+AAAtBwxIc3BfY29uc2Vuc3VzX2JlZWZ5MGVjZHNhX2NyeXB0byRTaWduYXR1cmUAAAQAvQIBQGVjZHNhOjpTaWduYXR1cmUAADEHCEhzcF9jb25zZW5zdXNfYmVlZnksVm90ZU1lc3NhZ2UMGE51bWJlcgEQCElkAQUCJFNpZ25hdHVyZQEtBwAMAShjb21taXRtZW50NQcBSENvbW1pdG1lbnQ8TnVtYmVyPgABCGlkBQIBCElkAAEkc2lnbmF0dXJlLQcBJFNpZ25hdHVyZQAANQcMSHNwX2NvbnNlbnN1c19iZWVmeShjb21taXRtZW50KENvbW1pdG1lbnQEMFRCbG9ja051bWJlcgEQAAwBHHBheWxvYWQ5BwEcUGF5bG9hZAABMGJsb2NrX251bWJlchABMFRCbG9ja051bWJlcgABQHZhbGlkYXRvcl9zZXRfaWQwAThWYWxpZGF0b3JTZXRJZAAAOQcMSHNwX2NvbnNlbnN1c19iZWVmeRxwYXlsb2FkHFBheWxvYWQAAAQAPQcBeFZlYzwoQmVlZnlQYXlsb2FkSWQsIFZlYzx1OD4pPgAAPQcAAAJBBwBBBwAABAhFBzgARQcAAAMCAAAACABJBwwoc3BfcnVudGltZRh0cmFpdHMsQmxha2VUd28yNTYAAAAATQcMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAEIBFMAAAQAOAEYVmVjPFQ+AABRBwxgcGFsbGV0X2NvbnZpY3Rpb25fdm90aW5nFHR5cGVzFFRhbGx5CBRWb3RlcwEYFFRvdGFsAAAMARBheWVzGAEUVm90ZXMAARBuYXlzGAEUVm90ZXMAARxzdXBwb3J0GAEUVm90ZXMAAFUHDGBwYWxsZXRfcmFua2VkX2NvbGxlY3RpdmUYcGFsbGV0FEV2ZW50CARUAARJAAEULE1lbWJlckFkZGVkBAEMd2hvAAEwVDo6QWNjb3VudElkAAAEeEEgbWVtYmVyIGB3aG9gIGhhcyBiZWVuIGFkZGVkLixSYW5rQ2hhbmdlZAgBDHdobwABMFQ6OkFjY291bnRJZAABEHJhbmtVAQEQUmFuawABBPRUaGUgbWVtYmVyIGB3aG9gc2UgcmFuayBoYXMgYmVlbiBjaGFuZ2VkIHRvIHRoZSBnaXZlbiBgcmFua2AuNE1lbWJlclJlbW92ZWQIAQx3aG8AATBUOjpBY2NvdW50SWQAARByYW5rVQEBEFJhbmsAAgQZAVRoZSBtZW1iZXIgYHdob2Agb2YgZ2l2ZW4gYHJhbmtgIGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgY29sbGVjdGl2ZS4UVm90ZWQQAQx3aG8AATBUOjpBY2NvdW50SWQAARBwb2xsEAFEUG9sbEluZGV4T2Y8VCwgST4AARB2b3RlWQcBKFZvdGVSZWNvcmQAARR0YWxseV0HATRUYWxseU9mPFQsIEk+AAMIVQFUaGUgbWVtYmVyIGB3aG9gIGhhcyB2b3RlZCBmb3IgdGhlIGBwb2xsYCB3aXRoIHRoZSBnaXZlbiBgdm90ZWAgbGVhZGluZyB0byBhbiB1cGRhdGVkIGB0YWxseWAuPE1lbWJlckV4Y2hhbmdlZAgBDHdobwABMFQ6OkFjY291bnRJZAABHG5ld193aG8AATBUOjpBY2NvdW50SWQABATwVGhlIG1lbWJlciBgd2hvYCBoYWQgdGhlaXIgYEFjY291bnRJZGAgY2hhbmdlZCB0byBgbmV3X3dob2AuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0WQcIYHBhbGxldF9yYW5rZWRfY29sbGVjdGl2ZShWb3RlUmVjb3JkAAEIDEF5ZQQAEAEUVm90ZXMAAAAMTmF5BAAQARRWb3RlcwABAABdBwhgcGFsbGV0X3JhbmtlZF9jb2xsZWN0aXZlFFRhbGx5DARUAARJAARNAAAMASRiYXJlX2F5ZXMQASxNZW1iZXJJbmRleAABEGF5ZXMQARRWb3RlcwABEG5heXMQARRWb3RlcwAAYQcMQHBhbGxldF9yZWZlcmVuZGEYcGFsbGV0FEV2ZW50CARUAARJAAFAJFN1Ym1pdHRlZAwBFGluZGV4EAE8UmVmZXJlbmR1bUluZGV4BGBJbmRleCBvZiB0aGUgcmVmZXJlbmR1bS4BFHRyYWNrVQEBPFRyYWNrSWRPZjxULCBJPgQlAVRoZSB0cmFjayAoYW5kIGJ5IGV4dGVuc2lvbiBwcm9wb3NhbCBkaXNwYXRjaCBvcmlnaW4pIG9mIHRoaXMgcmVmZXJlbmR1bS4BIHByb3Bvc2FsWQEBTEJvdW5kZWRDYWxsT2Y8VCwgST4EgFRoZSBwcm9wb3NhbCBmb3IgdGhlIHJlZmVyZW5kdW0uAASAQSByZWZlcmVuZHVtIGhhcyBiZWVuIHN1Ym1pdHRlZC5URGVjaXNpb25EZXBvc2l0UGxhY2VkDAEUaW5kZXgQATxSZWZlcmVuZHVtSW5kZXgEYEluZGV4IG9mIHRoZSByZWZlcmVuZHVtLgEMd2hvAAEwVDo6QWNjb3VudElkBIxUaGUgYWNjb3VudCB3aG8gcGxhY2VkIHRoZSBkZXBvc2l0LgEYYW1vdW50GAE8QmFsYW5jZU9mPFQsIEk+BIRUaGUgYW1vdW50IHBsYWNlZCBieSB0aGUgYWNjb3VudC4BBJRUaGUgZGVjaXNpb24gZGVwb3NpdCBoYXMgYmVlbiBwbGFjZWQuXERlY2lzaW9uRGVwb3NpdFJlZnVuZGVkDAEUaW5kZXgQATxSZWZlcmVuZHVtSW5kZXgEYEluZGV4IG9mIHRoZSByZWZlcmVuZHVtLgEMd2hvAAEwVDo6QWNjb3VudElkBIxUaGUgYWNjb3VudCB3aG8gcGxhY2VkIHRoZSBkZXBvc2l0LgEYYW1vdW50GAE8QmFsYW5jZU9mPFQsIEk+BIRUaGUgYW1vdW50IHBsYWNlZCBieSB0aGUgYWNjb3VudC4CBJxUaGUgZGVjaXNpb24gZGVwb3NpdCBoYXMgYmVlbiByZWZ1bmRlZC44RGVwb3NpdFNsYXNoZWQIAQx3aG8AATBUOjpBY2NvdW50SWQEjFRoZSBhY2NvdW50IHdobyBwbGFjZWQgdGhlIGRlcG9zaXQuARhhbW91bnQYATxCYWxhbmNlT2Y8VCwgST4EhFRoZSBhbW91bnQgcGxhY2VkIGJ5IHRoZSBhY2NvdW50LgMEbEEgZGVwb3NpdCBoYXMgYmVlbiBzbGFzaGVkLjxEZWNpc2lvblN0YXJ0ZWQQARRpbmRleBABPFJlZmVyZW5kdW1JbmRleARgSW5kZXggb2YgdGhlIHJlZmVyZW5kdW0uARR0cmFja1UBATxUcmFja0lkT2Y8VCwgST4EJQFUaGUgdHJhY2sgKGFuZCBieSBleHRlbnNpb24gcHJvcG9zYWwgZGlzcGF0Y2ggb3JpZ2luKSBvZiB0aGlzIHJlZmVyZW5kdW0uASBwcm9wb3NhbFkBAUxCb3VuZGVkQ2FsbE9mPFQsIEk+BIBUaGUgcHJvcG9zYWwgZm9yIHRoZSByZWZlcmVuZHVtLgEUdGFsbHldBwEgVDo6VGFsbHkEuFRoZSBjdXJyZW50IHRhbGx5IG9mIHZvdGVzIGluIHRoaXMgcmVmZXJlbmR1bS4EBLxBIHJlZmVyZW5kdW0gaGFzIG1vdmVkIGludG8gdGhlIGRlY2lkaW5nIHBoYXNlLjhDb25maXJtU3RhcnRlZAQBFGluZGV4EAE8UmVmZXJlbmR1bUluZGV4BGBJbmRleCBvZiB0aGUgcmVmZXJlbmR1bS4FADhDb25maXJtQWJvcnRlZAQBFGluZGV4EAE8UmVmZXJlbmR1bUluZGV4BGBJbmRleCBvZiB0aGUgcmVmZXJlbmR1bS4GACRDb25maXJtZWQIARRpbmRleBABPFJlZmVyZW5kdW1JbmRleARgSW5kZXggb2YgdGhlIHJlZmVyZW5kdW0uARR0YWxseV0HASBUOjpUYWxseQSwVGhlIGZpbmFsIHRhbGx5IG9mIHZvdGVzIGluIHRoaXMgcmVmZXJlbmR1bS4HBCEBQSByZWZlcmVuZHVtIGhhcyBlbmRlZCBpdHMgY29uZmlybWF0aW9uIHBoYXNlIGFuZCBpcyByZWFkeSBmb3IgYXBwcm92YWwuIEFwcHJvdmVkBAEUaW5kZXgQATxSZWZlcmVuZHVtSW5kZXgEYEluZGV4IG9mIHRoZSByZWZlcmVuZHVtLggEDQFBIHJlZmVyZW5kdW0gaGFzIGJlZW4gYXBwcm92ZWQgYW5kIGl0cyBwcm9wb3NhbCBoYXMgYmVlbiBzY2hlZHVsZWQuIFJlamVjdGVkCAEUaW5kZXgQATxSZWZlcmVuZHVtSW5kZXgEYEluZGV4IG9mIHRoZSByZWZlcmVuZHVtLgEUdGFsbHldBwEgVDo6VGFsbHkEsFRoZSBmaW5hbCB0YWxseSBvZiB2b3RlcyBpbiB0aGlzIHJlZmVyZW5kdW0uCQSsQSBwcm9wb3NhbCBoYXMgYmVlbiByZWplY3RlZCBieSByZWZlcmVuZHVtLiBUaW1lZE91dAgBFGluZGV4EAE8UmVmZXJlbmR1bUluZGV4BGBJbmRleCBvZiB0aGUgcmVmZXJlbmR1bS4BFHRhbGx5XQcBIFQ6OlRhbGx5BLBUaGUgZmluYWwgdGFsbHkgb2Ygdm90ZXMgaW4gdGhpcyByZWZlcmVuZHVtLgoE2EEgcmVmZXJlbmR1bSBoYXMgYmVlbiB0aW1lZCBvdXQgd2l0aG91dCBiZWluZyBkZWNpZGVkLiRDYW5jZWxsZWQIARRpbmRleBABPFJlZmVyZW5kdW1JbmRleARgSW5kZXggb2YgdGhlIHJlZmVyZW5kdW0uARR0YWxseV0HASBUOjpUYWxseQSwVGhlIGZpbmFsIHRhbGx5IG9mIHZvdGVzIGluIHRoaXMgcmVmZXJlbmR1bS4LBIBBIHJlZmVyZW5kdW0gaGFzIGJlZW4gY2FuY2VsbGVkLhhLaWxsZWQIARRpbmRleBABPFJlZmVyZW5kdW1JbmRleARgSW5kZXggb2YgdGhlIHJlZmVyZW5kdW0uARR0YWxseV0HASBUOjpUYWxseQSwVGhlIGZpbmFsIHRhbGx5IG9mIHZvdGVzIGluIHRoaXMgcmVmZXJlbmR1bS4MBHRBIHJlZmVyZW5kdW0gaGFzIGJlZW4ga2lsbGVkLmRTdWJtaXNzaW9uRGVwb3NpdFJlZnVuZGVkDAEUaW5kZXgQATxSZWZlcmVuZHVtSW5kZXgEYEluZGV4IG9mIHRoZSByZWZlcmVuZHVtLgEMd2hvAAEwVDo6QWNjb3VudElkBIxUaGUgYWNjb3VudCB3aG8gcGxhY2VkIHRoZSBkZXBvc2l0LgEYYW1vdW50GAE8QmFsYW5jZU9mPFQsIEk+BIRUaGUgYW1vdW50IHBsYWNlZCBieSB0aGUgYWNjb3VudC4NBKRUaGUgc3VibWlzc2lvbiBkZXBvc2l0IGhhcyBiZWVuIHJlZnVuZGVkLixNZXRhZGF0YVNldAgBFGluZGV4EAE8UmVmZXJlbmR1bUluZGV4BGBJbmRleCBvZiB0aGUgcmVmZXJlbmR1bS4BEGhhc2g0ARxUOjpIYXNoBDhQcmVpbWFnZSBoYXNoLg4EnE1ldGFkYXRhIGZvciBhIHJlZmVyZW5kdW0gaGFzIGJlZW4gc2V0LjxNZXRhZGF0YUNsZWFyZWQIARRpbmRleBABPFJlZmVyZW5kdW1JbmRleARgSW5kZXggb2YgdGhlIHJlZmVyZW5kdW0uARBoYXNoNAEcVDo6SGFzaAQ4UHJlaW1hZ2UgaGFzaC4PBKxNZXRhZGF0YSBmb3IgYSByZWZlcmVuZHVtIGhhcyBiZWVuIGNsZWFyZWQuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0ZQcMQHBhbGxldF93aGl0ZWxpc3QYcGFsbGV0FEV2ZW50BARUAAEMPENhbGxXaGl0ZWxpc3RlZAQBJGNhbGxfaGFzaDQBHFQ6Okhhc2gAAABYV2hpdGVsaXN0ZWRDYWxsUmVtb3ZlZAQBJGNhbGxfaGFzaDQBHFQ6Okhhc2gAAQBkV2hpdGVsaXN0ZWRDYWxsRGlzcGF0Y2hlZAgBJGNhbGxfaGFzaDQBHFQ6Okhhc2gAARhyZXN1bHRpBwFoRGlzcGF0Y2hSZXN1bHRXaXRoUG9zdEluZm8AAgAEfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXRpBwQYUmVzdWx0CARUAW0HBEUBdQcBCAhPawQAbQcAAAAADEVycgQAdQcAAAEAAG0HDDRmcmFtZV9zdXBwb3J0IGRpc3BhdGNoQFBvc3REaXNwYXRjaEluZm8AAAgBNGFjdHVhbF93ZWlnaHRxBwE4T3B0aW9uPFdlaWdodD4AASBwYXlzX2ZlZWQBEFBheXMAAHEHBBhPcHRpb24EBFQBKAEIEE5vbmUAAAAQU29tZQQAKAAAAQAAdQcIKHNwX3J1bnRpbWVkRGlzcGF0Y2hFcnJvcldpdGhQb3N0SW5mbwQQSW5mbwFtBwAIASRwb3N0X2luZm9tBwEQSW5mbwABFGVycm9yaAE0RGlzcGF0Y2hFcnJvcgAAeQcMRHBhbGxldF9wYXJhbWV0ZXJzGHBhbGxldBRFdmVudAQEVAABBBxVcGRhdGVkDAEMa2V5fQcBxDxUOjpSdW50aW1lUGFyYW1ldGVycyBhcyBBZ2dyZWdhdGVkS2V5VmFsdWU+OjpLZXkEZFRoZSBrZXkgdGhhdCB3YXMgdXBkYXRlZC4BJG9sZF92YWx1ZYUHAexPcHRpb248PFQ6OlJ1bnRpbWVQYXJhbWV0ZXJzIGFzIEFnZ3JlZ2F0ZWRLZXlWYWx1ZT46OlZhbHVlPgR8VGhlIG9sZCB2YWx1ZSBiZWZvcmUgdGhpcyBjYWxsLgEkbmV3X3ZhbHVlhQcB7E9wdGlvbjw8VDo6UnVudGltZVBhcmFtZXRlcnMgYXMgQWdncmVnYXRlZEtleVZhbHVlPjo6VmFsdWU+BHhUaGUgbmV3IHZhbHVlIGFmdGVyIHRoaXMgY2FsbC4ADFBBIFBhcmFtZXRlciB3YXMgc2V0LgC8SXMgYWxzbyBlbWl0dGVkIHdoZW4gdGhlIHZhbHVlIHdhcyBub3QgY2hhbmdlZC4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXR9BwhYc3RhZ2luZ19rdXNhbWFfcnVudGltZVBSdW50aW1lUGFyYW1ldGVyc0tleQABBCRJbmZsYXRpb24EAIEHAakBPGR5bmFtaWNfcGFyYW1zOjppbmZsYXRpb246OlBhcmFtZXRlcnMgYXMgZnJhbWVfc3VwcG9ydDo6dHJhaXRzOjoKZHluYW1pY19wYXJhbXM6OkFnZ3JlZ2F0ZWRLZXlWYWx1ZT46OktleQAAAACBBxBYc3RhZ2luZ19rdXNhbWFfcnVudGltZThkeW5hbWljX3BhcmFtcyRpbmZsYXRpb240UGFyYW1ldGVyc0tleQABFDBNaW5JbmZsYXRpb24EAJUCATBNaW5JbmZsYXRpb24AAAAwTWF4SW5mbGF0aW9uBAChAgEwTWF4SW5mbGF0aW9uAAEAKElkZWFsU3Rha2UEAKUCAShJZGVhbFN0YWtlAAIAHEZhbGxvZmYEAKkCARxGYWxsb2ZmAAMAPFVzZUF1Y3Rpb25TbG90cwQArQIBPFVzZUF1Y3Rpb25TbG90cwAEAACFBwQYT3B0aW9uBARUAYkHAQgQTm9uZQAAABBTb21lBACJBwAAAQAAiQcIWHN0YWdpbmdfa3VzYW1hX3J1bnRpbWVYUnVudGltZVBhcmFtZXRlcnNWYWx1ZQABBCRJbmZsYXRpb24EAI0HAbEBPGR5bmFtaWNfcGFyYW1zOjppbmZsYXRpb246OlBhcmFtZXRlcnMgYXMgZnJhbWVfc3VwcG9ydDo6dHJhaXRzOjoKZHluYW1pY19wYXJhbXM6OkFnZ3JlZ2F0ZWRLZXlWYWx1ZT46OlZhbHVlAAAAAI0HEFhzdGFnaW5nX2t1c2FtYV9ydW50aW1lOGR5bmFtaWNfcGFyYW1zJGluZmxhdGlvbjxQYXJhbWV0ZXJzVmFsdWUAARQwTWluSW5mbGF0aW9uBACdAgEsUGVycXVpbnRpbGwAAAAwTWF4SW5mbGF0aW9uBACdAgEsUGVycXVpbnRpbGwAAQAoSWRlYWxTdGFrZQQAnQIBLFBlcnF1aW50aWxsAAIAHEZhbGxvZmYEAJ0CASxQZXJxdWludGlsbAADADxVc2VBdWN0aW9uU2xvdHMEACABEGJvb2wABAAAkQcQXHBvbGthZG90X3J1bnRpbWVfY29tbW9uGGNsYWltcxhwYWxsZXQURXZlbnQEBFQAAQQcQ2xhaW1lZAwBDHdobwABMFQ6OkFjY291bnRJZAABQGV0aGVyZXVtX2FkZHJlc3PBAgE8RXRoZXJldW1BZGRyZXNzAAEYYW1vdW50GAEwQmFsYW5jZU9mPFQ+AAAEaFNvbWVvbmUgY2xhaW1lZCBzb21lIERPVHMuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0lQcMOHBhbGxldF91dGlsaXR5GHBhbGxldBRFdmVudAABGEBCYXRjaEludGVycnVwdGVkCAEUaW5kZXgQAQx1MzIAARRlcnJvcmgBNERpc3BhdGNoRXJyb3IAAAhVAUJhdGNoIG9mIGRpc3BhdGNoZXMgZGlkIG5vdCBjb21wbGV0ZSBmdWxseS4gSW5kZXggb2YgZmlyc3QgZmFpbGluZyBkaXNwYXRjaCBnaXZlbiwgYXNId2VsbCBhcyB0aGUgZXJyb3IuOEJhdGNoQ29tcGxldGVkAAEEyEJhdGNoIG9mIGRpc3BhdGNoZXMgY29tcGxldGVkIGZ1bGx5IHdpdGggbm8gZXJyb3IuYEJhdGNoQ29tcGxldGVkV2l0aEVycm9ycwACBLRCYXRjaCBvZiBkaXNwYXRjaGVzIGNvbXBsZXRlZCBidXQgaGFzIGVycm9ycy40SXRlbUNvbXBsZXRlZAADBB0BQSBzaW5nbGUgaXRlbSB3aXRoaW4gYSBCYXRjaCBvZiBkaXNwYXRjaGVzIGhhcyBjb21wbGV0ZWQgd2l0aCBubyBlcnJvci4oSXRlbUZhaWxlZAQBFGVycm9yaAE0RGlzcGF0Y2hFcnJvcgAEBBEBQSBzaW5nbGUgaXRlbSB3aXRoaW4gYSBCYXRjaCBvZiBkaXNwYXRjaGVzIGhhcyBjb21wbGV0ZWQgd2l0aCBlcnJvci4wRGlzcGF0Y2hlZEFzBAEYcmVzdWx0mQcBOERpc3BhdGNoUmVzdWx0AAUEWEEgY2FsbCB3YXMgZGlzcGF0Y2hlZC4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXSZBwQYUmVzdWx0CARUAaEBBEUBaAEICE9rBAChAQAAAAAMRXJyBABoAAABAACdBww4cGFsbGV0X3NvY2lldHkYcGFsbGV0FEV2ZW50CARUAARJAAFEHEZvdW5kZWQEARxmb3VuZGVyAAEwVDo6QWNjb3VudElkAAAEtFRoZSBzb2NpZXR5IGlzIGZvdW5kZWQgYnkgdGhlIGdpdmVuIGlkZW50aXR5LgxCaWQIATBjYW5kaWRhdGVfaWQAATBUOjpBY2NvdW50SWQAARRvZmZlchgBPEJhbGFuY2VPZjxULCBJPgABCF0BQSBtZW1iZXJzaGlwIGJpZCBqdXN0IGhhcHBlbmVkLiBUaGUgZ2l2ZW4gYWNjb3VudCBpcyB0aGUgY2FuZGlkYXRlJ3MgSUQgYW5kIHRoZWlyIG9mZmVyOGlzIHRoZSBzZWNvbmQuFFZvdWNoDAEwY2FuZGlkYXRlX2lkAAEwVDo6QWNjb3VudElkAAEUb2ZmZXIYATxCYWxhbmNlT2Y8VCwgST4AASB2b3VjaGluZwABMFQ6OkFjY291bnRJZAACCF0BQSBtZW1iZXJzaGlwIGJpZCBqdXN0IGhhcHBlbmVkIGJ5IHZvdWNoaW5nLiBUaGUgZ2l2ZW4gYWNjb3VudCBpcyB0aGUgY2FuZGlkYXRlJ3MgSUQgYW5k7HRoZWlyIG9mZmVyIGlzIHRoZSBzZWNvbmQuIFRoZSB2b3VjaGluZyBwYXJ0eSBpcyB0aGUgdGhpcmQuJEF1dG9VbmJpZAQBJGNhbmRpZGF0ZQABMFQ6OkFjY291bnRJZAADBAUBQSBjYW5kaWRhdGUgd2FzIGRyb3BwZWQgKGR1ZSB0byBhbiBleGNlc3Mgb2YgYmlkcyBpbiB0aGUgc3lzdGVtKS4UVW5iaWQEASRjYW5kaWRhdGUAATBUOjpBY2NvdW50SWQABASsQSBjYW5kaWRhdGUgd2FzIGRyb3BwZWQgKGJ5IHRoZWlyIHJlcXVlc3QpLhxVbnZvdWNoBAEkY2FuZGlkYXRlAAEwVDo6QWNjb3VudElkAAUE9EEgY2FuZGlkYXRlIHdhcyBkcm9wcGVkIChieSByZXF1ZXN0IG9mIHdobyB2b3VjaGVkIGZvciB0aGVtKS4gSW5kdWN0ZWQIARxwcmltYXJ5AAEwVDo6QWNjb3VudElkAAEoY2FuZGlkYXRlc60BAURWZWM8VDo6QWNjb3VudElkPgAGCFUBQSBncm91cCBvZiBjYW5kaWRhdGVzIGhhdmUgYmVlbiBpbmR1Y3RlZC4gVGhlIGJhdGNoJ3MgcHJpbWFyeSBpcyB0aGUgZmlyc3QgdmFsdWUsIHRoZXBiYXRjaCBpbiBmdWxsIGlzIHRoZSBzZWNvbmQuYFN1c3BlbmRlZE1lbWJlckp1ZGdlbWVudAgBDHdobwABMFQ6OkFjY291bnRJZAABGGp1ZGdlZCABEGJvb2wABwSMQSBzdXNwZW5kZWQgbWVtYmVyIGhhcyBiZWVuIGp1ZGdlZC5IQ2FuZGlkYXRlU3VzcGVuZGVkBAEkY2FuZGlkYXRlAAEwVDo6QWNjb3VudElkAAgEeEEgY2FuZGlkYXRlIGhhcyBiZWVuIHN1c3BlbmRlZDxNZW1iZXJTdXNwZW5kZWQEARhtZW1iZXIAATBUOjpBY2NvdW50SWQACQRsQSBtZW1iZXIgaGFzIGJlZW4gc3VzcGVuZGVkKENoYWxsZW5nZWQEARhtZW1iZXIAATBUOjpBY2NvdW50SWQACgRwQSBtZW1iZXIgaGFzIGJlZW4gY2hhbGxlbmdlZBBWb3RlDAEkY2FuZGlkYXRlAAEwVDo6QWNjb3VudElkAAEUdm90ZXIAATBUOjpBY2NvdW50SWQAARB2b3RlIAEQYm9vbAALBFhBIHZvdGUgaGFzIGJlZW4gcGxhY2VkMERlZmVuZGVyVm90ZQgBFHZvdGVyAAEwVDo6QWNjb3VudElkAAEQdm90ZSABEGJvb2wADAS0QSB2b3RlIGhhcyBiZWVuIHBsYWNlZCBmb3IgYSBkZWZlbmRpbmcgbWVtYmVyJE5ld1BhcmFtcwQBGHBhcmFtc6EHAVBHcm91cFBhcmFtc0ZvcjxULCBJPgANBMxBIG5ldyBzZXQgb2YgXFtwYXJhbXNcXSBoYXMgYmVlbiBzZXQgZm9yIHRoZSBncm91cC4kVW5mb3VuZGVkBAEcZm91bmRlcgABMFQ6OkFjY291bnRJZAAOBFRTb2NpZXR5IGlzIHVuZm91bmRlZC4cRGVwb3NpdAQBFHZhbHVlGAE8QmFsYW5jZU9mPFQsIEk+AA8EzFNvbWUgZnVuZHMgd2VyZSBkZXBvc2l0ZWQgaW50byB0aGUgc29jaWV0eSBhY2NvdW50LiBFbGV2YXRlZAgBGG1lbWJlcgABMFQ6OkFjY291bnRJZAABEHJhbmsQARBSYW5rABAEmEEgXFttZW1iZXJcXSBnb3QgZWxldmF0ZWQgdG8gXFtyYW5rXF0uBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0oQcIOHBhbGxldF9zb2NpZXR5LEdyb3VwUGFyYW1zBBxCYWxhbmNlARgAEAEsbWF4X21lbWJlcnMQAQx1MzIAAShtYXhfaW50YWtlEAEMdTMyAAEsbWF4X3N0cmlrZXMQAQx1MzIAAURjYW5kaWRhdGVfZGVwb3NpdBgBHEJhbGFuY2UAAKUHDDxwYWxsZXRfcmVjb3ZlcnkYcGFsbGV0FEV2ZW50BARUAAEYPFJlY292ZXJ5Q3JlYXRlZAQBHGFjY291bnQAATBUOjpBY2NvdW50SWQAAATIQSByZWNvdmVyeSBwcm9jZXNzIGhhcyBiZWVuIHNldCB1cCBmb3IgYW4gYWNjb3VudC5EUmVjb3ZlcnlJbml0aWF0ZWQIATBsb3N0X2FjY291bnQAATBUOjpBY2NvdW50SWQAATxyZXNjdWVyX2FjY291bnQAATBUOjpBY2NvdW50SWQAAQQpAUEgcmVjb3ZlcnkgcHJvY2VzcyBoYXMgYmVlbiBpbml0aWF0ZWQgZm9yIGxvc3QgYWNjb3VudCBieSByZXNjdWVyIGFjY291bnQuPFJlY292ZXJ5Vm91Y2hlZAwBMGxvc3RfYWNjb3VudAABMFQ6OkFjY291bnRJZAABPHJlc2N1ZXJfYWNjb3VudAABMFQ6OkFjY291bnRJZAABGHNlbmRlcgABMFQ6OkFjY291bnRJZAACBFkBQSByZWNvdmVyeSBwcm9jZXNzIGZvciBsb3N0IGFjY291bnQgYnkgcmVzY3VlciBhY2NvdW50IGhhcyBiZWVuIHZvdWNoZWQgZm9yIGJ5IHNlbmRlci44UmVjb3ZlcnlDbG9zZWQIATBsb3N0X2FjY291bnQAATBUOjpBY2NvdW50SWQAATxyZXNjdWVyX2FjY291bnQAATBUOjpBY2NvdW50SWQAAwQdAUEgcmVjb3ZlcnkgcHJvY2VzcyBmb3IgbG9zdCBhY2NvdW50IGJ5IHJlc2N1ZXIgYWNjb3VudCBoYXMgYmVlbiBjbG9zZWQuQEFjY291bnRSZWNvdmVyZWQIATBsb3N0X2FjY291bnQAATBUOjpBY2NvdW50SWQAATxyZXNjdWVyX2FjY291bnQAATBUOjpBY2NvdW50SWQABAQBAUxvc3QgYWNjb3VudCBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgcmVjb3ZlcmVkIGJ5IHJlc2N1ZXIgYWNjb3VudC48UmVjb3ZlcnlSZW1vdmVkBAEwbG9zdF9hY2NvdW50AAEwVDo6QWNjb3VudElkAAUEzEEgcmVjb3ZlcnkgcHJvY2VzcyBoYXMgYmVlbiByZW1vdmVkIGZvciBhbiBhY2NvdW50LgQwRXZlbnRzIHR5cGUuqQcMOHBhbGxldF92ZXN0aW5nGHBhbGxldBRFdmVudAQEVAABCDhWZXN0aW5nVXBkYXRlZAgBHGFjY291bnQAATBUOjpBY2NvdW50SWQAASB1bnZlc3RlZBgBMEJhbGFuY2VPZjxUPgAACFEBVGhlIGFtb3VudCB2ZXN0ZWQgaGFzIGJlZW4gdXBkYXRlZC4gVGhpcyBjb3VsZCBpbmRpY2F0ZSBhIGNoYW5nZSBpbiBmdW5kcyBhdmFpbGFibGUuJQFUaGUgYmFsYW5jZSBnaXZlbiBpcyB0aGUgYW1vdW50IHdoaWNoIGlzIGxlZnQgdW52ZXN0ZWQgKGFuZCB0aHVzIGxvY2tlZCkuQFZlc3RpbmdDb21wbGV0ZWQEARxhY2NvdW50AAEwVDo6QWNjb3VudElkAAEEnEFuIFxbYWNjb3VudFxdIGhhcyBiZWNvbWUgZnVsbHkgdmVzdGVkLgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldK0HDEBwYWxsZXRfc2NoZWR1bGVyGHBhbGxldBRFdmVudAQEVAABJCRTY2hlZHVsZWQIARB3aGVuEAFEQmxvY2tOdW1iZXJGb3I8VD4AARRpbmRleBABDHUzMgAABFBTY2hlZHVsZWQgc29tZSB0YXNrLiBDYW5jZWxlZAgBEHdoZW4QAURCbG9ja051bWJlckZvcjxUPgABFGluZGV4EAEMdTMyAAEETENhbmNlbGVkIHNvbWUgdGFzay4oRGlzcGF0Y2hlZAwBEHRhc2v1AgF4VGFza0FkZHJlc3M8QmxvY2tOdW1iZXJGb3I8VD4+AAEIaWSxBwFAT3B0aW9uPFRhc2tOYW1lPgABGHJlc3VsdJkHAThEaXNwYXRjaFJlc3VsdAACBFREaXNwYXRjaGVkIHNvbWUgdGFzay4gUmV0cnlTZXQQARB0YXNr9QIBeFRhc2tBZGRyZXNzPEJsb2NrTnVtYmVyRm9yPFQ+PgABCGlksQcBQE9wdGlvbjxUYXNrTmFtZT4AARhwZXJpb2QQAURCbG9ja051bWJlckZvcjxUPgABHHJldHJpZXMIAQh1OAADBKBTZXQgYSByZXRyeSBjb25maWd1cmF0aW9uIGZvciBzb21lIHRhc2suOFJldHJ5Q2FuY2VsbGVkCAEQdGFza/UCAXhUYXNrQWRkcmVzczxCbG9ja051bWJlckZvcjxUPj4AAQhpZLEHAUBPcHRpb248VGFza05hbWU+AAQErENhbmNlbCBhIHJldHJ5IGNvbmZpZ3VyYXRpb24gZm9yIHNvbWUgdGFzay48Q2FsbFVuYXZhaWxhYmxlCAEQdGFza/UCAXhUYXNrQWRkcmVzczxCbG9ja051bWJlckZvcjxUPj4AAQhpZLEHAUBPcHRpb248VGFza05hbWU+AAUEKQFUaGUgY2FsbCBmb3IgdGhlIHByb3ZpZGVkIGhhc2ggd2FzIG5vdCBmb3VuZCBzbyB0aGUgdGFzayBoYXMgYmVlbiBhYm9ydGVkLjhQZXJpb2RpY0ZhaWxlZAgBEHRhc2v1AgF4VGFza0FkZHJlc3M8QmxvY2tOdW1iZXJGb3I8VD4+AAEIaWSxBwFAT3B0aW9uPFRhc2tOYW1lPgAGBD0BVGhlIGdpdmVuIHRhc2sgd2FzIHVuYWJsZSB0byBiZSByZW5ld2VkIHNpbmNlIHRoZSBhZ2VuZGEgaXMgZnVsbCBhdCB0aGF0IGJsb2NrLixSZXRyeUZhaWxlZAgBEHRhc2v1AgF4VGFza0FkZHJlc3M8QmxvY2tOdW1iZXJGb3I8VD4+AAEIaWSxBwFAT3B0aW9uPFRhc2tOYW1lPgAHCF0BVGhlIGdpdmVuIHRhc2sgd2FzIHVuYWJsZSB0byBiZSByZXRyaWVkIHNpbmNlIHRoZSBhZ2VuZGEgaXMgZnVsbCBhdCB0aGF0IGJsb2NrIG9yIHRoZXJlnHdhcyBub3QgZW5vdWdoIHdlaWdodCB0byByZXNjaGVkdWxlIGl0LlRQZXJtYW5lbnRseU92ZXJ3ZWlnaHQIARB0YXNr9QIBeFRhc2tBZGRyZXNzPEJsb2NrTnVtYmVyRm9yPFQ+PgABCGlksQcBQE9wdGlvbjxUYXNrTmFtZT4ACATwVGhlIGdpdmVuIHRhc2sgY2FuIG5ldmVyIGJlIGV4ZWN1dGVkIHNpbmNlIGl0IGlzIG92ZXJ3ZWlnaHQuBDBFdmVudHMgdHlwZS6xBwQYT3B0aW9uBARUAQQBCBBOb25lAAAAEFNvbWUEAAQAAAEAALUHDDBwYWxsZXRfcHJveHkYcGFsbGV0FEV2ZW50BARUAAEUNFByb3h5RXhlY3V0ZWQEARhyZXN1bHSZBwE4RGlzcGF0Y2hSZXN1bHQAAAS8QSBwcm94eSB3YXMgZXhlY3V0ZWQgY29ycmVjdGx5LCB3aXRoIHRoZSBnaXZlbi4sUHVyZUNyZWF0ZWQQARBwdXJlAAEwVDo6QWNjb3VudElkAAEMd2hvAAEwVDo6QWNjb3VudElkAAEocHJveHlfdHlwZQEDATBUOjpQcm94eVR5cGUAAVBkaXNhbWJpZ3VhdGlvbl9pbmRleFUBAQx1MTYAAQjcQSBwdXJlIGFjY291bnQgaGFzIGJlZW4gY3JlYXRlZCBieSBuZXcgcHJveHkgd2l0aCBnaXZlbpBkaXNhbWJpZ3VhdGlvbiBpbmRleCBhbmQgcHJveHkgdHlwZS4kQW5ub3VuY2VkDAEQcmVhbAABMFQ6OkFjY291bnRJZAABFHByb3h5AAEwVDo6QWNjb3VudElkAAEkY2FsbF9oYXNoNAE0Q2FsbEhhc2hPZjxUPgACBOBBbiBhbm5vdW5jZW1lbnQgd2FzIHBsYWNlZCB0byBtYWtlIGEgY2FsbCBpbiB0aGUgZnV0dXJlLihQcm94eUFkZGVkEAEkZGVsZWdhdG9yAAEwVDo6QWNjb3VudElkAAEkZGVsZWdhdGVlAAEwVDo6QWNjb3VudElkAAEocHJveHlfdHlwZQEDATBUOjpQcm94eVR5cGUAARRkZWxheRABREJsb2NrTnVtYmVyRm9yPFQ+AAMESEEgcHJveHkgd2FzIGFkZGVkLjBQcm94eVJlbW92ZWQQASRkZWxlZ2F0b3IAATBUOjpBY2NvdW50SWQAASRkZWxlZ2F0ZWUAATBUOjpBY2NvdW50SWQAAShwcm94eV90eXBlAQMBMFQ6OlByb3h5VHlwZQABFGRlbGF5EAFEQmxvY2tOdW1iZXJGb3I8VD4ABARQQSBwcm94eSB3YXMgcmVtb3ZlZC4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXS5Bww8cGFsbGV0X211bHRpc2lnGHBhbGxldBRFdmVudAQEVAABECxOZXdNdWx0aXNpZwwBJGFwcHJvdmluZwABMFQ6OkFjY291bnRJZAABIG11bHRpc2lnAAEwVDo6QWNjb3VudElkAAEkY2FsbF9oYXNoBAEgQ2FsbEhhc2gAAASMQSBuZXcgbXVsdGlzaWcgb3BlcmF0aW9uIGhhcyBiZWd1bi5ATXVsdGlzaWdBcHByb3ZhbBABJGFwcHJvdmluZwABMFQ6OkFjY291bnRJZAABJHRpbWVwb2ludA0DAXBUaW1lcG9pbnQ8QmxvY2tOdW1iZXJGb3I8VD4+AAEgbXVsdGlzaWcAATBUOjpBY2NvdW50SWQAASRjYWxsX2hhc2gEASBDYWxsSGFzaAABBMhBIG11bHRpc2lnIG9wZXJhdGlvbiBoYXMgYmVlbiBhcHByb3ZlZCBieSBzb21lb25lLkBNdWx0aXNpZ0V4ZWN1dGVkFAEkYXBwcm92aW5nAAEwVDo6QWNjb3VudElkAAEkdGltZXBvaW50DQMBcFRpbWVwb2ludDxCbG9ja051bWJlckZvcjxUPj4AASBtdWx0aXNpZwABMFQ6OkFjY291bnRJZAABJGNhbGxfaGFzaAQBIENhbGxIYXNoAAEYcmVzdWx0mQcBOERpc3BhdGNoUmVzdWx0AAIEnEEgbXVsdGlzaWcgb3BlcmF0aW9uIGhhcyBiZWVuIGV4ZWN1dGVkLkRNdWx0aXNpZ0NhbmNlbGxlZBABKGNhbmNlbGxpbmcAATBUOjpBY2NvdW50SWQAASR0aW1lcG9pbnQNAwFwVGltZXBvaW50PEJsb2NrTnVtYmVyRm9yPFQ+PgABIG11bHRpc2lnAAEwVDo6QWNjb3VudElkAAEkY2FsbF9oYXNoBAEgQ2FsbEhhc2gAAwSgQSBtdWx0aXNpZyBvcGVyYXRpb24gaGFzIGJlZW4gY2FuY2VsbGVkLgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldL0HDDxwYWxsZXRfcHJlaW1hZ2UYcGFsbGV0FEV2ZW50BARUAAEMFE5vdGVkBAEQaGFzaDQBHFQ6Okhhc2gAAARoQSBwcmVpbWFnZSBoYXMgYmVlbiBub3RlZC4kUmVxdWVzdGVkBAEQaGFzaDQBHFQ6Okhhc2gAAQR4QSBwcmVpbWFnZSBoYXMgYmVlbiByZXF1ZXN0ZWQuHENsZWFyZWQEARBoYXNoNAEcVDo6SGFzaAACBGxBIHByZWltYWdlIGhhcyBiZW4gY2xlYXJlZC4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXTBBww8cGFsbGV0X2JvdW50aWVzGHBhbGxldBRFdmVudAgEVAAESQABLDhCb3VudHlQcm9wb3NlZAQBFGluZGV4EAEsQm91bnR5SW5kZXgAAARQTmV3IGJvdW50eSBwcm9wb3NhbC44Qm91bnR5UmVqZWN0ZWQIARRpbmRleBABLEJvdW50eUluZGV4AAEQYm9uZBgBPEJhbGFuY2VPZjxULCBJPgABBMxBIGJvdW50eSBwcm9wb3NhbCB3YXMgcmVqZWN0ZWQ7IGZ1bmRzIHdlcmUgc2xhc2hlZC5IQm91bnR5QmVjYW1lQWN0aXZlBAEUaW5kZXgQASxCb3VudHlJbmRleAACBLhBIGJvdW50eSBwcm9wb3NhbCBpcyBmdW5kZWQgYW5kIGJlY2FtZSBhY3RpdmUuNEJvdW50eUF3YXJkZWQIARRpbmRleBABLEJvdW50eUluZGV4AAEsYmVuZWZpY2lhcnkAATBUOjpBY2NvdW50SWQAAwSUQSBib3VudHkgaXMgYXdhcmRlZCB0byBhIGJlbmVmaWNpYXJ5LjRCb3VudHlDbGFpbWVkDAEUaW5kZXgQASxCb3VudHlJbmRleAABGHBheW91dBgBPEJhbGFuY2VPZjxULCBJPgABLGJlbmVmaWNpYXJ5AAEwVDo6QWNjb3VudElkAAQEjEEgYm91bnR5IGlzIGNsYWltZWQgYnkgYmVuZWZpY2lhcnkuOEJvdW50eUNhbmNlbGVkBAEUaW5kZXgQASxCb3VudHlJbmRleAAFBFhBIGJvdW50eSBpcyBjYW5jZWxsZWQuOEJvdW50eUV4dGVuZGVkBAEUaW5kZXgQASxCb3VudHlJbmRleAAGBHBBIGJvdW50eSBleHBpcnkgaXMgZXh0ZW5kZWQuOEJvdW50eUFwcHJvdmVkBAEUaW5kZXgQASxCb3VudHlJbmRleAAHBFRBIGJvdW50eSBpcyBhcHByb3ZlZC48Q3VyYXRvclByb3Bvc2VkCAEkYm91bnR5X2lkEAEsQm91bnR5SW5kZXgAARxjdXJhdG9yAAEwVDo6QWNjb3VudElkAAgEdEEgYm91bnR5IGN1cmF0b3IgaXMgcHJvcG9zZWQuREN1cmF0b3JVbmFzc2lnbmVkBAEkYm91bnR5X2lkEAEsQm91bnR5SW5kZXgACQR8QSBib3VudHkgY3VyYXRvciBpcyB1bmFzc2lnbmVkLjxDdXJhdG9yQWNjZXB0ZWQIASRib3VudHlfaWQQASxCb3VudHlJbmRleAABHGN1cmF0b3IAATBUOjpBY2NvdW50SWQACgR0QSBib3VudHkgY3VyYXRvciBpcyBhY2NlcHRlZC4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXTFBwxUcGFsbGV0X2NoaWxkX2JvdW50aWVzGHBhbGxldBRFdmVudAQEVAABEBRBZGRlZAgBFGluZGV4EAEsQm91bnR5SW5kZXgAASxjaGlsZF9pbmRleBABLEJvdW50eUluZGV4AAAEYEEgY2hpbGQtYm91bnR5IGlzIGFkZGVkLhxBd2FyZGVkDAEUaW5kZXgQASxCb3VudHlJbmRleAABLGNoaWxkX2luZGV4EAEsQm91bnR5SW5kZXgAASxiZW5lZmljaWFyeQABMFQ6OkFjY291bnRJZAABBKxBIGNoaWxkLWJvdW50eSBpcyBhd2FyZGVkIHRvIGEgYmVuZWZpY2lhcnkuHENsYWltZWQQARRpbmRleBABLEJvdW50eUluZGV4AAEsY2hpbGRfaW5kZXgQASxCb3VudHlJbmRleAABGHBheW91dBgBMEJhbGFuY2VPZjxUPgABLGJlbmVmaWNpYXJ5AAEwVDo6QWNjb3VudElkAAIEpEEgY2hpbGQtYm91bnR5IGlzIGNsYWltZWQgYnkgYmVuZWZpY2lhcnkuIENhbmNlbGVkCAEUaW5kZXgQASxCb3VudHlJbmRleAABLGNoaWxkX2luZGV4EAEsQm91bnR5SW5kZXgAAwRwQSBjaGlsZC1ib3VudHkgaXMgY2FuY2VsbGVkLgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldMkHDJBwYWxsZXRfZWxlY3Rpb25fcHJvdmlkZXJfbXVsdGlfcGhhc2UYcGFsbGV0FEV2ZW50BARUAAEYOFNvbHV0aW9uU3RvcmVkDAEcY29tcHV0Zc0HATxFbGVjdGlvbkNvbXB1dGUAARhvcmlnaW7ZAQFQT3B0aW9uPFQ6OkFjY291bnRJZD4AATBwcmV2X2VqZWN0ZWQgARBib29sAAActEEgc29sdXRpb24gd2FzIHN0b3JlZCB3aXRoIHRoZSBnaXZlbiBjb21wdXRlLgBRAVRoZSBgb3JpZ2luYCBpbmRpY2F0ZXMgdGhlIG9yaWdpbiBvZiB0aGUgc29sdXRpb24uIElmIGBvcmlnaW5gIGlzIGBTb21lKEFjY291bnRJZClgLFkBdGhlIHN0b3JlZCBzb2x1dGlvbiB3YXMgc3VibWl0dGVkIGluIHRoZSBzaWduZWQgcGhhc2UgYnkgYSBtaW5lciB3aXRoIHRoZSBgQWNjb3VudElkYC4lAU90aGVyd2lzZSwgdGhlIHNvbHV0aW9uIHdhcyBzdG9yZWQgZWl0aGVyIGR1cmluZyB0aGUgdW5zaWduZWQgcGhhc2Ugb3IgYnlNAWBUOjpGb3JjZU9yaWdpbmAuIFRoZSBgYm9vbGAgaXMgYHRydWVgIHdoZW4gYSBwcmV2aW91cyBzb2x1dGlvbiB3YXMgZWplY3RlZCB0byBtYWtlSHJvb20gZm9yIHRoaXMgb25lLkRFbGVjdGlvbkZpbmFsaXplZAgBHGNvbXB1dGXNBwE8RWxlY3Rpb25Db21wdXRlAAEUc2NvcmVVBAE0RWxlY3Rpb25TY29yZQABBBkBVGhlIGVsZWN0aW9uIGhhcyBiZWVuIGZpbmFsaXplZCwgd2l0aCB0aGUgZ2l2ZW4gY29tcHV0YXRpb24gYW5kIHNjb3JlLjhFbGVjdGlvbkZhaWxlZAACDExBbiBlbGVjdGlvbiBmYWlsZWQuAAEBTm90IG11Y2ggY2FuIGJlIHNhaWQgYWJvdXQgd2hpY2ggY29tcHV0ZXMgZmFpbGVkIGluIHRoZSBwcm9jZXNzLiBSZXdhcmRlZAgBHGFjY291bnQAAZg8VCBhcyBmcmFtZV9zeXN0ZW06OkNvbmZpZz46OkFjY291bnRJZAABFHZhbHVlGAEwQmFsYW5jZU9mPFQ+AAMEJQFBbiBhY2NvdW50IGhhcyBiZWVuIHJld2FyZGVkIGZvciB0aGVpciBzaWduZWQgc3VibWlzc2lvbiBiZWluZyBmaW5hbGl6ZWQuHFNsYXNoZWQIARxhY2NvdW50AAGYPFQgYXMgZnJhbWVfc3lzdGVtOjpDb25maWc+OjpBY2NvdW50SWQAARR2YWx1ZRgBMEJhbGFuY2VPZjxUPgAEBCEBQW4gYWNjb3VudCBoYXMgYmVlbiBzbGFzaGVkIGZvciBzdWJtaXR0aW5nIGFuIGludmFsaWQgc2lnbmVkIHN1Ym1pc3Npb24uRFBoYXNlVHJhbnNpdGlvbmVkDAEQZnJvbdEHAWBQaGFzZTxCbG9ja051bWJlckZvcjxUPj4AAQh0b9EHAWBQaGFzZTxCbG9ja051bWJlckZvcjxUPj4AARRyb3VuZBABDHUzMgAFBLhUaGVyZSB3YXMgYSBwaGFzZSB0cmFuc2l0aW9uIGluIGEgZ2l2ZW4gcm91bmQuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0zQcIkHBhbGxldF9lbGVjdGlvbl9wcm92aWRlcl9tdWx0aV9waGFzZTxFbGVjdGlvbkNvbXB1dGUAARQcT25DaGFpbgAAABhTaWduZWQAAQAgVW5zaWduZWQAAgAgRmFsbGJhY2sAAwAkRW1lcmdlbmN5AAQAANEHCJBwYWxsZXRfZWxlY3Rpb25fcHJvdmlkZXJfbXVsdGlfcGhhc2UUUGhhc2UECEJuARABEAxPZmYAAAAYU2lnbmVkAAEAIFVuc2lnbmVkBADVBwEoKGJvb2wsIEJuKQACACRFbWVyZ2VuY3kAAwAA1QcAAAQIIBAA2QcMKHBhbGxldF9uaXMYcGFsbGV0FEV2ZW50BARUAAEcJEJpZFBsYWNlZAwBDHdobwABMFQ6OkFjY291bnRJZAABGGFtb3VudBgBMEJhbGFuY2VPZjxUPgABIGR1cmF0aW9uEAEMdTMyAAAEeEEgYmlkIHdhcyBzdWNjZXNzZnVsbHkgcGxhY2VkLjBCaWRSZXRyYWN0ZWQMAQx3aG8AATBUOjpBY2NvdW50SWQAARhhbW91bnQYATBCYWxhbmNlT2Y8VD4AASBkdXJhdGlvbhABDHUzMgABBNxBIGJpZCB3YXMgc3VjY2Vzc2Z1bGx5IHJlbW92ZWQgKGJlZm9yZSBiZWluZyBhY2NlcHRlZCkuKEJpZERyb3BwZWQMAQx3aG8AATBUOjpBY2NvdW50SWQAARhhbW91bnQYATBCYWxhbmNlT2Y8VD4AASBkdXJhdGlvbhABDHUzMgACBFUBQSBiaWQgd2FzIGRyb3BwZWQgZnJvbSBhIHF1ZXVlIGJlY2F1c2Ugb2YgYW5vdGhlciwgbW9yZSBzdWJzdGFudGlhbCwgYmlkIHdhcyBwcmVzZW50LhhJc3N1ZWQUARRpbmRleBABMFJlY2VpcHRJbmRleARwVGhlIGlkZW50aXR5IG9mIHRoZSByZWNlaXB0LgEYZXhwaXJ5EAFEQmxvY2tOdW1iZXJGb3I8VD4E0FRoZSBibG9jayBudW1iZXIgYXQgd2hpY2ggdGhlIHJlY2VpcHQgbWF5IGJlIHRoYXdlZC4BDHdobwABMFQ6OkFjY291bnRJZARkVGhlIG93bmVyIG9mIHRoZSByZWNlaXB0LgEocHJvcG9ydGlvbp0CASxQZXJxdWludGlsbAQxAVRoZSBwcm9wb3J0aW9uIG9mIHRoZSBlZmZlY3RpdmUgdG90YWwgaXNzdWFuY2Ugd2hpY2ggdGhlIHJlY2VpcHQgcmVwcmVzZW50cy4BGGFtb3VudBgBMEJhbGFuY2VPZjxUPgTYVGhlIGFtb3VudCBvZiBmdW5kcyB3aGljaCB3ZXJlIGRlYml0ZWQgZnJvbSB0aGUgb3duZXIuAwQFAUEgYmlkIHdhcyBhY2NlcHRlZC4gVGhlIGJhbGFuY2UgbWF5IG5vdCBiZSByZWxlYXNlZCB1bnRpbCBleHBpcnkuGFRoYXdlZBQBFGluZGV4EAEwUmVjZWlwdEluZGV4BHBUaGUgaWRlbnRpdHkgb2YgdGhlIHJlY2VpcHQuAQx3aG8AATBUOjpBY2NvdW50SWQEKFRoZSBvd25lci4BKHByb3BvcnRpb26dAgEsUGVycXVpbnRpbGwEOQFUaGUgcHJvcG9ydGlvbiBvZiB0aGUgZWZmZWN0aXZlIHRvdGFsIGlzc3VhbmNlIGJ5IHdoaWNoIHRoZSBvd25lciB3YXMgZGViaXRlZC4BGGFtb3VudBgBMEJhbGFuY2VPZjxUPgSsVGhlIGFtb3VudCBieSB3aGljaCB0aGUgb3duZXIgd2FzIGNyZWRpdGVkLgEcZHJvcHBlZCABEGJvb2wEjElmIGB0cnVlYCB0aGVuIHRoZSByZWNlaXB0IGlzIGRvbmUuBATAQW4gcmVjZWlwdCBoYXMgYmVlbiAoYXQgbGVhc3QgcGFydGlhbGx5KSB0aGF3ZWQuGEZ1bmRlZAQBHGRlZmljaXQYATBCYWxhbmNlT2Y8VD4ABQS0QW4gYXV0b21hdGljIGZ1bmRpbmcgb2YgdGhlIGRlZmljaXQgd2FzIG1hZGUuLFRyYW5zZmVycmVkDAEQZnJvbQABMFQ6OkFjY291bnRJZAABCHRvAAEwVDo6QWNjb3VudElkAAEUaW5kZXgQATBSZWNlaXB0SW5kZXgABgRoQSByZWNlaXB0IHdhcyB0cmFuc2ZlcnJlZC4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXTdBww8cGFsbGV0X2JhbGFuY2VzGHBhbGxldBRFdmVudAgEVAAESQABWBxFbmRvd2VkCAEcYWNjb3VudAABMFQ6OkFjY291bnRJZAABMGZyZWVfYmFsYW5jZRgBKFQ6OkJhbGFuY2UAAAS4QW4gYWNjb3VudCB3YXMgY3JlYXRlZCB3aXRoIHNvbWUgZnJlZSBiYWxhbmNlLiBEdXN0TG9zdAgBHGFjY291bnQAATBUOjpBY2NvdW50SWQAARhhbW91bnQYAShUOjpCYWxhbmNlAAEIPQFBbiBhY2NvdW50IHdhcyByZW1vdmVkIHdob3NlIGJhbGFuY2Ugd2FzIG5vbi16ZXJvIGJ1dCBiZWxvdyBFeGlzdGVudGlhbERlcG9zaXQseHJlc3VsdGluZyBpbiBhbiBvdXRyaWdodCBsb3NzLiBUcmFuc2ZlcgwBEGZyb20AATBUOjpBY2NvdW50SWQAAQh0bwABMFQ6OkFjY291bnRJZAABGGFtb3VudBgBKFQ6OkJhbGFuY2UAAgRMVHJhbnNmZXIgc3VjY2VlZGVkLihCYWxhbmNlU2V0CAEMd2hvAAEwVDo6QWNjb3VudElkAAEQZnJlZRgBKFQ6OkJhbGFuY2UAAwRoQSBiYWxhbmNlIHdhcyBzZXQgYnkgcm9vdC4gUmVzZXJ2ZWQIAQx3aG8AATBUOjpBY2NvdW50SWQAARhhbW91bnQYAShUOjpCYWxhbmNlAAQE4FNvbWUgYmFsYW5jZSB3YXMgcmVzZXJ2ZWQgKG1vdmVkIGZyb20gZnJlZSB0byByZXNlcnZlZCkuKFVucmVzZXJ2ZWQIAQx3aG8AATBUOjpBY2NvdW50SWQAARhhbW91bnQYAShUOjpCYWxhbmNlAAUE6FNvbWUgYmFsYW5jZSB3YXMgdW5yZXNlcnZlZCAobW92ZWQgZnJvbSByZXNlcnZlZCB0byBmcmVlKS5IUmVzZXJ2ZVJlcGF0cmlhdGVkEAEQZnJvbQABMFQ6OkFjY291bnRJZAABCHRvAAEwVDo6QWNjb3VudElkAAEYYW1vdW50GAEoVDo6QmFsYW5jZQABSGRlc3RpbmF0aW9uX3N0YXR1c4QBGFN0YXR1cwAGCE0BU29tZSBiYWxhbmNlIHdhcyBtb3ZlZCBmcm9tIHRoZSByZXNlcnZlIG9mIHRoZSBmaXJzdCBhY2NvdW50IHRvIHRoZSBzZWNvbmQgYWNjb3VudC7YRmluYWwgYXJndW1lbnQgaW5kaWNhdGVzIHRoZSBkZXN0aW5hdGlvbiBiYWxhbmNlIHR5cGUuHERlcG9zaXQIAQx3aG8AATBUOjpBY2NvdW50SWQAARhhbW91bnQYAShUOjpCYWxhbmNlAAcE2FNvbWUgYW1vdW50IHdhcyBkZXBvc2l0ZWQgKGUuZy4gZm9yIHRyYW5zYWN0aW9uIGZlZXMpLiBXaXRoZHJhdwgBDHdobwABMFQ6OkFjY291bnRJZAABGGFtb3VudBgBKFQ6OkJhbGFuY2UACAQdAVNvbWUgYW1vdW50IHdhcyB3aXRoZHJhd24gZnJvbSB0aGUgYWNjb3VudCAoZS5nLiBmb3IgdHJhbnNhY3Rpb24gZmVlcykuHFNsYXNoZWQIAQx3aG8AATBUOjpBY2NvdW50SWQAARhhbW91bnQYAShUOjpCYWxhbmNlAAkEAQFTb21lIGFtb3VudCB3YXMgcmVtb3ZlZCBmcm9tIHRoZSBhY2NvdW50IChlLmcuIGZvciBtaXNiZWhhdmlvcikuGE1pbnRlZAgBDHdobwABMFQ6OkFjY291bnRJZAABGGFtb3VudBgBKFQ6OkJhbGFuY2UACgScU29tZSBhbW91bnQgd2FzIG1pbnRlZCBpbnRvIGFuIGFjY291bnQuGEJ1cm5lZAgBDHdobwABMFQ6OkFjY291bnRJZAABGGFtb3VudBgBKFQ6OkJhbGFuY2UACwScU29tZSBhbW91bnQgd2FzIGJ1cm5lZCBmcm9tIGFuIGFjY291bnQuJFN1c3BlbmRlZAgBDHdobwABMFQ6OkFjY291bnRJZAABGGFtb3VudBgBKFQ6OkJhbGFuY2UADAQVAVNvbWUgYW1vdW50IHdhcyBzdXNwZW5kZWQgZnJvbSBhbiBhY2NvdW50IChpdCBjYW4gYmUgcmVzdG9yZWQgbGF0ZXIpLiBSZXN0b3JlZAgBDHdobwABMFQ6OkFjY291bnRJZAABGGFtb3VudBgBKFQ6OkJhbGFuY2UADQSkU29tZSBhbW91bnQgd2FzIHJlc3RvcmVkIGludG8gYW4gYWNjb3VudC4gVXBncmFkZWQEAQx3aG8AATBUOjpBY2NvdW50SWQADgRgQW4gYWNjb3VudCB3YXMgdXBncmFkZWQuGElzc3VlZAQBGGFtb3VudBgBKFQ6OkJhbGFuY2UADwQtAVRvdGFsIGlzc3VhbmNlIHdhcyBpbmNyZWFzZWQgYnkgYGFtb3VudGAsIGNyZWF0aW5nIGEgY3JlZGl0IHRvIGJlIGJhbGFuY2VkLiRSZXNjaW5kZWQEARhhbW91bnQYAShUOjpCYWxhbmNlABAEJQFUb3RhbCBpc3N1YW5jZSB3YXMgZGVjcmVhc2VkIGJ5IGBhbW91bnRgLCBjcmVhdGluZyBhIGRlYnQgdG8gYmUgYmFsYW5jZWQuGExvY2tlZAgBDHdobwABMFQ6OkFjY291bnRJZAABGGFtb3VudBgBKFQ6OkJhbGFuY2UAEQRgU29tZSBiYWxhbmNlIHdhcyBsb2NrZWQuIFVubG9ja2VkCAEMd2hvAAEwVDo6QWNjb3VudElkAAEYYW1vdW50GAEoVDo6QmFsYW5jZQASBGhTb21lIGJhbGFuY2Ugd2FzIHVubG9ja2VkLhhGcm96ZW4IAQx3aG8AATBUOjpBY2NvdW50SWQAARhhbW91bnQYAShUOjpCYWxhbmNlABMEYFNvbWUgYmFsYW5jZSB3YXMgZnJvemVuLhhUaGF3ZWQIAQx3aG8AATBUOjpBY2NvdW50SWQAARhhbW91bnQYAShUOjpCYWxhbmNlABQEYFNvbWUgYmFsYW5jZSB3YXMgdGhhd2VkLkxUb3RhbElzc3VhbmNlRm9yY2VkCAEMb2xkGAEoVDo6QmFsYW5jZQABDG5ldxgBKFQ6OkJhbGFuY2UAFQSsVGhlIGBUb3RhbElzc3VhbmNlYCB3YXMgZm9yY2VmdWxseSBjaGFuZ2VkLgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldOEHDEBwYWxsZXRfYmFnc19saXN0GHBhbGxldBRFdmVudAgEVAAESQABCCBSZWJhZ2dlZAwBDHdobwABMFQ6OkFjY291bnRJZAABEGZyb20wASBUOjpTY29yZQABCHRvMAEgVDo6U2NvcmUAAASkTW92ZWQgYW4gYWNjb3VudCBmcm9tIG9uZSBiYWcgdG8gYW5vdGhlci4wU2NvcmVVcGRhdGVkCAEMd2hvAAEwVDo6QWNjb3VudElkAAEkbmV3X3Njb3JlMAEgVDo6U2NvcmUAAQTYVXBkYXRlZCB0aGUgc2NvcmUgb2Ygc29tZSBhY2NvdW50IHRvIHRoZSBnaXZlbiBhbW91bnQuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV05QcMXHBhbGxldF9ub21pbmF0aW9uX3Bvb2xzGHBhbGxldBRFdmVudAQEVAABSBxDcmVhdGVkCAEkZGVwb3NpdG9yAAEwVDo6QWNjb3VudElkAAEccG9vbF9pZBABGFBvb2xJZAAABGBBIHBvb2wgaGFzIGJlZW4gY3JlYXRlZC4YQm9uZGVkEAEYbWVtYmVyAAEwVDo6QWNjb3VudElkAAEccG9vbF9pZBABGFBvb2xJZAABGGJvbmRlZBgBMEJhbGFuY2VPZjxUPgABGGpvaW5lZCABEGJvb2wAAQSUQSBtZW1iZXIgaGFzIGJlY2FtZSBib25kZWQgaW4gYSBwb29sLhxQYWlkT3V0DAEYbWVtYmVyAAEwVDo6QWNjb3VudElkAAEccG9vbF9pZBABGFBvb2xJZAABGHBheW91dBgBMEJhbGFuY2VPZjxUPgACBIxBIHBheW91dCBoYXMgYmVlbiBtYWRlIHRvIGEgbWVtYmVyLiBVbmJvbmRlZBQBGG1lbWJlcgABMFQ6OkFjY291bnRJZAABHHBvb2xfaWQQARhQb29sSWQAARxiYWxhbmNlGAEwQmFsYW5jZU9mPFQ+AAEYcG9pbnRzGAEwQmFsYW5jZU9mPFQ+AAEMZXJhEAEgRXJhSW5kZXgAAyyYQSBtZW1iZXIgaGFzIHVuYm9uZGVkIGZyb20gdGhlaXIgcG9vbC4AOQEtIGBiYWxhbmNlYCBpcyB0aGUgY29ycmVzcG9uZGluZyBiYWxhbmNlIG9mIHRoZSBudW1iZXIgb2YgcG9pbnRzIHRoYXQgaGFzIGJlZW5VASAgcmVxdWVzdGVkIHRvIGJlIHVuYm9uZGVkICh0aGUgYXJndW1lbnQgb2YgdGhlIGB1bmJvbmRgIHRyYW5zYWN0aW9uKSBmcm9tIHRoZSBib25kZWQcICBwb29sLkUBLSBgcG9pbnRzYCBpcyB0aGUgbnVtYmVyIG9mIHBvaW50cyB0aGF0IGFyZSBpc3N1ZWQgYXMgYSByZXN1bHQgb2YgYGJhbGFuY2VgIGJlaW5nwGRpc3NvbHZlZCBpbnRvIHRoZSBjb3JyZXNwb25kaW5nIHVuYm9uZGluZyBwb29sLuQtIGBlcmFgIGlzIHRoZSBlcmEgaW4gd2hpY2ggdGhlIGJhbGFuY2Ugd2lsbCBiZSB1bmJvbmRlZC5VAUluIHRoZSBhYnNlbmNlIG9mIHNsYXNoaW5nLCB0aGVzZSB2YWx1ZXMgd2lsbCBtYXRjaC4gSW4gdGhlIHByZXNlbmNlIG9mIHNsYXNoaW5nLCB0aGVNAW51bWJlciBvZiBwb2ludHMgdGhhdCBhcmUgaXNzdWVkIGluIHRoZSB1bmJvbmRpbmcgcG9vbCB3aWxsIGJlIGxlc3MgdGhhbiB0aGUgYW1vdW50ZHJlcXVlc3RlZCB0byBiZSB1bmJvbmRlZC4kV2l0aGRyYXduEAEYbWVtYmVyAAEwVDo6QWNjb3VudElkAAEccG9vbF9pZBABGFBvb2xJZAABHGJhbGFuY2UYATBCYWxhbmNlT2Y8VD4AARhwb2ludHMYATBCYWxhbmNlT2Y8VD4ABBicQSBtZW1iZXIgaGFzIHdpdGhkcmF3biBmcm9tIHRoZWlyIHBvb2wuACEBVGhlIGdpdmVuIG51bWJlciBvZiBgcG9pbnRzYCBoYXZlIGJlZW4gZGlzc29sdmVkIGluIHJldHVybiBvZiBgYmFsYW5jZWAuAFkBU2ltaWxhciB0byBgVW5ib25kZWRgIGV2ZW50LCBpbiB0aGUgYWJzZW5jZSBvZiBzbGFzaGluZywgdGhlIHJhdGlvIG9mIHBvaW50IHRvIGJhbGFuY2Uod2lsbCBiZSAxLiREZXN0cm95ZWQEARxwb29sX2lkEAEYUG9vbElkAAUEaEEgcG9vbCBoYXMgYmVlbiBkZXN0cm95ZWQuMFN0YXRlQ2hhbmdlZAgBHHBvb2xfaWQQARhQb29sSWQAASRuZXdfc3RhdGWJBAEkUG9vbFN0YXRlAAYEfFRoZSBzdGF0ZSBvZiBhIHBvb2wgaGFzIGNoYW5nZWQ0TWVtYmVyUmVtb3ZlZAgBHHBvb2xfaWQQARhQb29sSWQAARhtZW1iZXIAATBUOjpBY2NvdW50SWQABwyYQSBtZW1iZXIgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIGEgcG9vbC4AUQFUaGUgcmVtb3ZhbCBjYW4gYmUgdm9sdW50YXJ5ICh3aXRoZHJhd24gYWxsIHVuYm9uZGVkIGZ1bmRzKSBvciBpbnZvbHVudGFyeSAoa2lja2VkKS4wUm9sZXNVcGRhdGVkDAEQcm9vdNkBAVBPcHRpb248VDo6QWNjb3VudElkPgABHGJvdW5jZXLZAQFQT3B0aW9uPFQ6OkFjY291bnRJZD4AASRub21pbmF0b3LZAQFQT3B0aW9uPFQ6OkFjY291bnRJZD4ACAhVAVRoZSByb2xlcyBvZiBhIHBvb2wgaGF2ZSBiZWVuIHVwZGF0ZWQgdG8gdGhlIGdpdmVuIG5ldyByb2xlcy4gTm90ZSB0aGF0IHRoZSBkZXBvc2l0b3JEY2FuIG5ldmVyIGNoYW5nZS4sUG9vbFNsYXNoZWQIARxwb29sX2lkEAEYUG9vbElkAAEcYmFsYW5jZRgBMEJhbGFuY2VPZjxUPgAJBA0BVGhlIGFjdGl2ZSBiYWxhbmNlIG9mIHBvb2wgYHBvb2xfaWRgIGhhcyBiZWVuIHNsYXNoZWQgdG8gYGJhbGFuY2VgLlBVbmJvbmRpbmdQb29sU2xhc2hlZAwBHHBvb2xfaWQQARhQb29sSWQAAQxlcmEQASBFcmFJbmRleAABHGJhbGFuY2UYATBCYWxhbmNlT2Y8VD4ACgQlAVRoZSB1bmJvbmQgcG9vbCBhdCBgZXJhYCBvZiBwb29sIGBwb29sX2lkYCBoYXMgYmVlbiBzbGFzaGVkIHRvIGBiYWxhbmNlYC5UUG9vbENvbW1pc3Npb25VcGRhdGVkCAEccG9vbF9pZBABGFBvb2xJZAABHGN1cnJlbnShBAF8T3B0aW9uPChQZXJiaWxsLCBUOjpBY2NvdW50SWQpPgALBLRBIHBvb2wncyBjb21taXNzaW9uIHNldHRpbmcgaGFzIGJlZW4gY2hhbmdlZC5gUG9vbE1heENvbW1pc3Npb25VcGRhdGVkCAEccG9vbF9pZBABGFBvb2xJZAABOG1heF9jb21taXNzaW9ulAEcUGVyYmlsbAAMBNRBIHBvb2wncyBtYXhpbXVtIGNvbW1pc3Npb24gc2V0dGluZyBoYXMgYmVlbiBjaGFuZ2VkLnxQb29sQ29tbWlzc2lvbkNoYW5nZVJhdGVVcGRhdGVkCAEccG9vbF9pZBABGFBvb2xJZAABLGNoYW5nZV9yYXRlqQQBnENvbW1pc3Npb25DaGFuZ2VSYXRlPEJsb2NrTnVtYmVyRm9yPFQ+PgANBMxBIHBvb2wncyBjb21taXNzaW9uIGBjaGFuZ2VfcmF0ZWAgaGFzIGJlZW4gY2hhbmdlZC6QUG9vbENvbW1pc3Npb25DbGFpbVBlcm1pc3Npb25VcGRhdGVkCAEccG9vbF9pZBABGFBvb2xJZAABKHBlcm1pc3Npb26tBAG8T3B0aW9uPENvbW1pc3Npb25DbGFpbVBlcm1pc3Npb248VDo6QWNjb3VudElkPj4ADgTIUG9vbCBjb21taXNzaW9uIGNsYWltIHBlcm1pc3Npb24gaGFzIGJlZW4gdXBkYXRlZC5UUG9vbENvbW1pc3Npb25DbGFpbWVkCAEccG9vbF9pZBABGFBvb2xJZAABKGNvbW1pc3Npb24YATBCYWxhbmNlT2Y8VD4ADwSEUG9vbCBjb21taXNzaW9uIGhhcyBiZWVuIGNsYWltZWQuZE1pbkJhbGFuY2VEZWZpY2l0QWRqdXN0ZWQIARxwb29sX2lkEAEYUG9vbElkAAEYYW1vdW50GAEwQmFsYW5jZU9mPFQ+ABAEyFRvcHBlZCB1cCBkZWZpY2l0IGluIGZyb3plbiBFRCBvZiB0aGUgcmV3YXJkIHBvb2wuYE1pbkJhbGFuY2VFeGNlc3NBZGp1c3RlZAgBHHBvb2xfaWQQARhQb29sSWQAARhhbW91bnQYATBCYWxhbmNlT2Y8VD4AEQS8Q2xhaW1lZCBleGNlc3MgZnJvemVuIEVEIG9mIGFmIHRoZSByZXdhcmQgcG9vbC4EWEV2ZW50cyBvZiB0aGlzIHBhbGxldC7pBwxMcGFsbGV0X2Zhc3RfdW5zdGFrZRhwYWxsZXQURXZlbnQEBFQAARQgVW5zdGFrZWQIARRzdGFzaAABMFQ6OkFjY291bnRJZAABGHJlc3VsdJkHAThEaXNwYXRjaFJlc3VsdAAABFhBIHN0YWtlciB3YXMgdW5zdGFrZWQuHFNsYXNoZWQIARRzdGFzaAABMFQ6OkFjY291bnRJZAABGGFtb3VudBgBMEJhbGFuY2VPZjxUPgABBBkBQSBzdGFrZXIgd2FzIHNsYXNoZWQgZm9yIHJlcXVlc3RpbmcgZmFzdC11bnN0YWtlIHdoaWxzdCBiZWluZyBleHBvc2VkLjBCYXRjaENoZWNrZWQEARBlcmFzwQEBNFZlYzxFcmFJbmRleD4AAgRFAUEgYmF0Y2ggd2FzIHBhcnRpYWxseSBjaGVja2VkIGZvciB0aGUgZ2l2ZW4gZXJhcywgYnV0IHRoZSBwcm9jZXNzIGRpZCBub3QgZmluaXNoLjRCYXRjaEZpbmlzaGVkBAEQc2l6ZRABDHUzMgADEJxBIGJhdGNoIG9mIGEgZ2l2ZW4gc2l6ZSB3YXMgdGVybWluYXRlZC4AVQFUaGlzIGlzIGFsd2F5cyBmb2xsb3dzIGJ5IGEgbnVtYmVyIG9mIGBVbnN0YWtlZGAgb3IgYFNsYXNoZWRgIGV2ZW50cywgbWFya2luZyB0aGUgZW5k6G9mIHRoZSBiYXRjaC4gQSBuZXcgYmF0Y2ggd2lsbCBiZSBjcmVhdGVkIHVwb24gbmV4dCBibG9jay40SW50ZXJuYWxFcnJvcgAEBOhBbiBpbnRlcm5hbCBlcnJvciBoYXBwZW5lZC4gT3BlcmF0aW9ucyB3aWxsIGJlIHBhdXNlZCBub3cuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV07QcQbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucyRpbmNsdXNpb24YcGFsbGV0FEV2ZW50BARUAAEQPENhbmRpZGF0ZUJhY2tlZBAA8QcBZENhbmRpZGF0ZVJlY2VpcHQ8VDo6SGFzaD4AAEEFASBIZWFkRGF0YQAA9QcBJENvcmVJbmRleAAA+QcBKEdyb3VwSW5kZXgAAATAQSBjYW5kaWRhdGUgd2FzIGJhY2tlZC4gYFtjYW5kaWRhdGUsIGhlYWRfZGF0YV1gRENhbmRpZGF0ZUluY2x1ZGVkEADxBwFkQ2FuZGlkYXRlUmVjZWlwdDxUOjpIYXNoPgAAQQUBIEhlYWREYXRhAAD1BwEkQ29yZUluZGV4AAD5BwEoR3JvdXBJbmRleAABBMhBIGNhbmRpZGF0ZSB3YXMgaW5jbHVkZWQuIGBbY2FuZGlkYXRlLCBoZWFkX2RhdGFdYERDYW5kaWRhdGVUaW1lZE91dAwA8QcBZENhbmRpZGF0ZVJlY2VpcHQ8VDo6SGFzaD4AAEEFASBIZWFkRGF0YQAA9QcBJENvcmVJbmRleAACBLxBIGNhbmRpZGF0ZSB0aW1lZCBvdXQuIGBbY2FuZGlkYXRlLCBoZWFkX2RhdGFdYFhVcHdhcmRNZXNzYWdlc1JlY2VpdmVkCAEQZnJvbWkCARhQYXJhSWQAARRjb3VudBABDHUzMgADBPhTb21lIHVwd2FyZCBtZXNzYWdlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgYW5kIHdpbGwgYmUgcHJvY2Vzc2VkLgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldPEHDExwb2xrYWRvdF9wcmltaXRpdmVzCHY3QENhbmRpZGF0ZVJlY2VpcHQEBEgBNAAIAShkZXNjcmlwdG9yFQUBWENhbmRpZGF0ZURlc2NyaXB0b3I8SD4AAUBjb21taXRtZW50c19oYXNoNAEQSGFzaAAA9QcMTHBvbGthZG90X3ByaW1pdGl2ZXMIdjckQ29yZUluZGV4AAAEABABDHUzMgAA+QcMTHBvbGthZG90X3ByaW1pdGl2ZXMIdjcoR3JvdXBJbmRleAAABAAQAQx1MzIAAP0HEGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMUcGFyYXMYcGFsbGV0FEV2ZW50AAEgSEN1cnJlbnRDb2RlVXBkYXRlZAQAaQIBGFBhcmFJZAAABMxDdXJyZW50IGNvZGUgaGFzIGJlZW4gdXBkYXRlZCBmb3IgYSBQYXJhLiBgcGFyYV9pZGBIQ3VycmVudEhlYWRVcGRhdGVkBABpAgEYUGFyYUlkAAEEzEN1cnJlbnQgaGVhZCBoYXMgYmVlbiB1cGRhdGVkIGZvciBhIFBhcmEuIGBwYXJhX2lkYFBDb2RlVXBncmFkZVNjaGVkdWxlZAQAaQIBGFBhcmFJZAACBNxBIGNvZGUgdXBncmFkZSBoYXMgYmVlbiBzY2hlZHVsZWQgZm9yIGEgUGFyYS4gYHBhcmFfaWRgME5ld0hlYWROb3RlZAQAaQIBGFBhcmFJZAADBLxBIG5ldyBoZWFkIGhhcyBiZWVuIG5vdGVkIGZvciBhIFBhcmEuIGBwYXJhX2lkYDBBY3Rpb25RdWV1ZWQIAGkCARhQYXJhSWQAABABMFNlc3Npb25JbmRleAAEBPBBIHBhcmEgaGFzIGJlZW4gcXVldWVkIHRvIGV4ZWN1dGUgcGVuZGluZyBhY3Rpb25zLiBgcGFyYV9pZGA8UHZmQ2hlY2tTdGFydGVkCAAhBQFIVmFsaWRhdGlvbkNvZGVIYXNoAABpAgEYUGFyYUlkAAUIVQFUaGUgZ2l2ZW4gcGFyYSBlaXRoZXIgaW5pdGlhdGVkIG9yIHN1YnNjcmliZWQgdG8gYSBQVkYgY2hlY2sgZm9yIHRoZSBnaXZlbiB2YWxpZGF0aW9ubGNvZGUuIGBjb2RlX2hhc2hgIGBwYXJhX2lkYEBQdmZDaGVja0FjY2VwdGVkCAAhBQFIVmFsaWRhdGlvbkNvZGVIYXNoAABpAgEYUGFyYUlkAAYIEQFUaGUgZ2l2ZW4gdmFsaWRhdGlvbiBjb2RlIHdhcyBhY2NlcHRlZCBieSB0aGUgUFZGIHByZS1jaGVja2luZyB2b3RlLlRgY29kZV9oYXNoYCBgcGFyYV9pZGBAUHZmQ2hlY2tSZWplY3RlZAgAIQUBSFZhbGlkYXRpb25Db2RlSGFzaAAAaQIBGFBhcmFJZAAHCBEBVGhlIGdpdmVuIHZhbGlkYXRpb24gY29kZSB3YXMgcmVqZWN0ZWQgYnkgdGhlIFBWRiBwcmUtY2hlY2tpbmcgdm90ZS5UYGNvZGVfaGFzaGAgYHBhcmFfaWRgBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0AQgQbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucxBocm1wGHBhbGxldBRFdmVudAQEVAABHFBPcGVuQ2hhbm5lbFJlcXVlc3RlZBABGHNlbmRlcmkCARhQYXJhSWQAASRyZWNpcGllbnRpAgEYUGFyYUlkAAFUcHJvcG9zZWRfbWF4X2NhcGFjaXR5EAEMdTMyAAFkcHJvcG9zZWRfbWF4X21lc3NhZ2Vfc2l6ZRABDHUzMgAABHBPcGVuIEhSTVAgY2hhbm5lbCByZXF1ZXN0ZWQuTE9wZW5DaGFubmVsQ2FuY2VsZWQIATBieV9wYXJhY2hhaW5pAgEYUGFyYUlkAAEoY2hhbm5lbF9pZIEFATRIcm1wQ2hhbm5lbElkAAEEKQFBbiBIUk1QIGNoYW5uZWwgcmVxdWVzdCBzZW50IGJ5IHRoZSByZWNlaXZlciB3YXMgY2FuY2VsZWQgYnkgZWl0aGVyIHBhcnR5LkxPcGVuQ2hhbm5lbEFjY2VwdGVkCAEYc2VuZGVyaQIBGFBhcmFJZAABJHJlY2lwaWVudGkCARhQYXJhSWQAAgRsT3BlbiBIUk1QIGNoYW5uZWwgYWNjZXB0ZWQuNENoYW5uZWxDbG9zZWQIATBieV9wYXJhY2hhaW5pAgEYUGFyYUlkAAEoY2hhbm5lbF9pZIEFATRIcm1wQ2hhbm5lbElkAAMEUEhSTVAgY2hhbm5lbCBjbG9zZWQuWEhybXBDaGFubmVsRm9yY2VPcGVuZWQQARhzZW5kZXJpAgEYUGFyYUlkAAEkcmVjaXBpZW50aQIBGFBhcmFJZAABVHByb3Bvc2VkX21heF9jYXBhY2l0eRABDHUzMgABZHByb3Bvc2VkX21heF9tZXNzYWdlX3NpemUQAQx1MzIABASsQW4gSFJNUCBjaGFubmVsIHdhcyBvcGVuZWQgdmlhIFJvb3Qgb3JpZ2luLlxIcm1wU3lzdGVtQ2hhbm5lbE9wZW5lZBABGHNlbmRlcmkCARhQYXJhSWQAASRyZWNpcGllbnRpAgEYUGFyYUlkAAFUcHJvcG9zZWRfbWF4X2NhcGFjaXR5EAEMdTMyAAFkcHJvcG9zZWRfbWF4X21lc3NhZ2Vfc2l6ZRABDHUzMgAFBLxBbiBIUk1QIGNoYW5uZWwgd2FzIG9wZW5lZCB3aXRoIGEgc3lzdGVtIGNoYWluLmhPcGVuQ2hhbm5lbERlcG9zaXRzVXBkYXRlZAgBGHNlbmRlcmkCARhQYXJhSWQAASRyZWNpcGllbnRpAgEYUGFyYUlkAAYEoEFuIEhSTVAgY2hhbm5lbCdzIGRlcG9zaXRzIHdlcmUgdXBkYXRlZC4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXQFCBBscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zIGRpc3B1dGVzGHBhbGxldBRFdmVudAQEVAABDEBEaXNwdXRlSW5pdGlhdGVkCABVBQE0Q2FuZGlkYXRlSGFzaAAACQgBPERpc3B1dGVMb2NhdGlvbgAABAkBQSBkaXNwdXRlIGhhcyBiZWVuIGluaXRpYXRlZC4gXFtjYW5kaWRhdGUgaGFzaCwgZGlzcHV0ZSBsb2NhdGlvblxdQERpc3B1dGVDb25jbHVkZWQIAFUFATRDYW5kaWRhdGVIYXNoAAANCAE0RGlzcHV0ZVJlc3VsdAABCMxBIGRpc3B1dGUgaGFzIGNvbmNsdWRlZCBmb3Igb3IgYWdhaW5zdCBhIGNhbmRpZGF0ZS60YFxbcGFyYSBpZCwgY2FuZGlkYXRlIGhhc2gsIGRpc3B1dGUgcmVzdWx0XF1gGFJldmVydAQAEAFEQmxvY2tOdW1iZXJGb3I8VD4AAhD8QSBkaXNwdXRlIGhhcyBjb25jbHVkZWQgd2l0aCBzdXBlcm1ham9yaXR5IGFnYWluc3QgYSBjYW5kaWRhdGUuDQFCbG9jayBhdXRob3JzIHNob3VsZCBubyBsb25nZXIgYnVpbGQgb24gdG9wIG9mIHRoaXMgaGVhZCBhbmQgc2hvdWxkAQFpbnN0ZWFkIHJldmVydCB0aGUgYmxvY2sgYXQgdGhlIGdpdmVuIGhlaWdodC4gVGhpcyBzaG91bGQgYmUgdGhl/G51bWJlciBvZiB0aGUgY2hpbGQgb2YgdGhlIGxhc3Qga25vd24gdmFsaWQgYmxvY2sgaW4gdGhlIGNoYWluLgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldAkIDGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMgZGlzcHV0ZXM8RGlzcHV0ZUxvY2F0aW9uAAEIFExvY2FsAAAAGFJlbW90ZQABAAANCAxscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zIGRpc3B1dGVzNERpc3B1dGVSZXN1bHQAAQgUVmFsaWQAAAAcSW52YWxpZAABAAARCBBscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zSGFzc2lnbmVyX29uX2RlbWFuZBhwYWxsZXQURXZlbnQEBFQAAQhMT25EZW1hbmRPcmRlclBsYWNlZAwBHHBhcmFfaWRpAgEYUGFyYUlkAAEoc3BvdF9wcmljZRgBMEJhbGFuY2VPZjxUPgABKG9yZGVyZWRfYnkAATBUOjpBY2NvdW50SWQAAAQNAUFuIG9yZGVyIHdhcyBwbGFjZWQgYXQgc29tZSBzcG90IHByaWNlIGFtb3VudCBieSBvcmRlcmVyIG9yZGVyZWRfYnkwU3BvdFByaWNlU2V0BAEoc3BvdF9wcmljZRgBMEJhbGFuY2VPZjxUPgABBLhUaGUgdmFsdWUgb2YgdGhlIHNwb3QgcHJpY2UgaGFzIGxpa2VseSBjaGFuZ2VkBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0FQgQXHBvbGthZG90X3J1bnRpbWVfY29tbW9uPHBhcmFzX3JlZ2lzdHJhchhwYWxsZXQURXZlbnQEBFQAARAoUmVnaXN0ZXJlZAgBHHBhcmFfaWRpAgEYUGFyYUlkAAEcbWFuYWdlcgABMFQ6OkFjY291bnRJZAAAADBEZXJlZ2lzdGVyZWQEARxwYXJhX2lkaQIBGFBhcmFJZAABACBSZXNlcnZlZAgBHHBhcmFfaWRpAgEYUGFyYUlkAAEMd2hvAAEwVDo6QWNjb3VudElkAAIAHFN3YXBwZWQIARxwYXJhX2lkaQIBGFBhcmFJZAABIG90aGVyX2lkaQIBGFBhcmFJZAADAAR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldBkIEFxwb2xrYWRvdF9ydW50aW1lX2NvbW1vbhRzbG90cxhwYWxsZXQURXZlbnQEBFQAAQg4TmV3TGVhc2VQZXJpb2QEATBsZWFzZV9wZXJpb2QQAUBMZWFzZVBlcmlvZE9mPFQ+AAAEkEEgbmV3IGBbbGVhc2VfcGVyaW9kXWAgaXMgYmVnaW5uaW5nLhhMZWFzZWQYARxwYXJhX2lkaQIBGFBhcmFJZAABGGxlYXNlcgABMFQ6OkFjY291bnRJZAABMHBlcmlvZF9iZWdpbhABQExlYXNlUGVyaW9kT2Y8VD4AATBwZXJpb2RfY291bnQQAUBMZWFzZVBlcmlvZE9mPFQ+AAE4ZXh0cmFfcmVzZXJ2ZWQYATBCYWxhbmNlT2Y8VD4AATB0b3RhbF9hbW91bnQYATBCYWxhbmNlT2Y8VD4AAQw1AUEgcGFyYSBoYXMgd29uIHRoZSByaWdodCB0byBhIGNvbnRpbnVvdXMgc2V0IG9mIGxlYXNlIHBlcmlvZHMgYXMgYSBwYXJhY2hhaW4uRQFGaXJzdCBiYWxhbmNlIGlzIGFueSBleHRyYSBhbW91bnQgcmVzZXJ2ZWQgb24gdG9wIG9mIHRoZSBwYXJhJ3MgZXhpc3RpbmcgZGVwb3NpdC6wU2Vjb25kIGJhbGFuY2UgaXMgdGhlIHRvdGFsIGFtb3VudCByZXNlcnZlZC4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXQdCBBccG9sa2Fkb3RfcnVudGltZV9jb21tb24gYXVjdGlvbnMYcGFsbGV0FEV2ZW50BARUAAEcOEF1Y3Rpb25TdGFydGVkDAE0YXVjdGlvbl9pbmRleBABMEF1Y3Rpb25JbmRleAABMGxlYXNlX3BlcmlvZBABQExlYXNlUGVyaW9kT2Y8VD4AARhlbmRpbmcQAURCbG9ja051bWJlckZvcjxUPgAACEkBQW4gYXVjdGlvbiBzdGFydGVkLiBQcm92aWRlcyBpdHMgaW5kZXggYW5kIHRoZSBibG9jayBudW1iZXIgd2hlcmUgaXQgd2lsbCBiZWdpbiB0bxUBY2xvc2UgYW5kIHRoZSBmaXJzdCBsZWFzZSBwZXJpb2Qgb2YgdGhlIHF1YWRydXBsZXQgdGhhdCBpcyBhdWN0aW9uZWQuNEF1Y3Rpb25DbG9zZWQEATRhdWN0aW9uX2luZGV4EAEwQXVjdGlvbkluZGV4AAEEuEFuIGF1Y3Rpb24gZW5kZWQuIEFsbCBmdW5kcyBiZWNvbWUgdW5yZXNlcnZlZC4gUmVzZXJ2ZWQMARhiaWRkZXIAATBUOjpBY2NvdW50SWQAAThleHRyYV9yZXNlcnZlZBgBMEJhbGFuY2VPZjxUPgABMHRvdGFsX2Ftb3VudBgBMEJhbGFuY2VPZjxUPgACCEkBRnVuZHMgd2VyZSByZXNlcnZlZCBmb3IgYSB3aW5uaW5nIGJpZC4gRmlyc3QgYmFsYW5jZSBpcyB0aGUgZXh0cmEgYW1vdW50IHJlc2VydmVkLlBTZWNvbmQgaXMgdGhlIHRvdGFsLihVbnJlc2VydmVkCAEYYmlkZGVyAAEwVDo6QWNjb3VudElkAAEYYW1vdW50GAEwQmFsYW5jZU9mPFQ+AAMEKQFGdW5kcyB3ZXJlIHVucmVzZXJ2ZWQgc2luY2UgYmlkZGVyIGlzIG5vIGxvbmdlciBhY3RpdmUuIGBbYmlkZGVyLCBhbW91bnRdYEhSZXNlcnZlQ29uZmlzY2F0ZWQMARxwYXJhX2lkaQIBGFBhcmFJZAABGGxlYXNlcgABMFQ6OkFjY291bnRJZAABGGFtb3VudBgBMEJhbGFuY2VPZjxUPgAECFUBU29tZW9uZSBhdHRlbXB0ZWQgdG8gbGVhc2UgdGhlIHNhbWUgc2xvdCB0d2ljZSBmb3IgYSBwYXJhY2hhaW4uIFRoZSBhbW91bnQgaXMgaGVsZCBpbrhyZXNlcnZlIGJ1dCBubyBwYXJhY2hhaW4gc2xvdCBoYXMgYmVlbiBsZWFzZWQuLEJpZEFjY2VwdGVkFAEYYmlkZGVyAAEwVDo6QWNjb3VudElkAAEccGFyYV9pZGkCARhQYXJhSWQAARhhbW91bnQYATBCYWxhbmNlT2Y8VD4AAShmaXJzdF9zbG90EAFATGVhc2VQZXJpb2RPZjxUPgABJGxhc3Rfc2xvdBABQExlYXNlUGVyaW9kT2Y8VD4ABQTIQSBuZXcgYmlkIGhhcyBiZWVuIGFjY2VwdGVkIGFzIHRoZSBjdXJyZW50IHdpbm5lci40V2lubmluZ09mZnNldAgBNGF1Y3Rpb25faW5kZXgQATBBdWN0aW9uSW5kZXgAATBibG9ja19udW1iZXIQAURCbG9ja051bWJlckZvcjxUPgAGCFkBVGhlIHdpbm5pbmcgb2Zmc2V0IHdhcyBjaG9zZW4gZm9yIGFuIGF1Y3Rpb24uIFRoaXMgd2lsbCBtYXAgaW50byB0aGUgYFdpbm5pbmdgIHN0b3JhZ2UQbWFwLgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldCEIEFxwb2xrYWRvdF9ydW50aW1lX2NvbW1vbiRjcm93ZGxvYW4YcGFsbGV0FEV2ZW50BARUAAEoHENyZWF0ZWQEARxwYXJhX2lkaQIBGFBhcmFJZAAABIxDcmVhdGUgYSBuZXcgY3Jvd2Rsb2FuaW5nIGNhbXBhaWduLixDb250cmlidXRlZAwBDHdobwABMFQ6OkFjY291bnRJZAABKGZ1bmRfaW5kZXhpAgEYUGFyYUlkAAEYYW1vdW50GAEwQmFsYW5jZU9mPFQ+AAEEcENvbnRyaWJ1dGVkIHRvIGEgY3Jvd2Qgc2FsZS4gV2l0aGRyZXcMAQx3aG8AATBUOjpBY2NvdW50SWQAAShmdW5kX2luZGV4aQIBGFBhcmFJZAABGGFtb3VudBgBMEJhbGFuY2VPZjxUPgACBJxXaXRoZHJldyBmdWxsIGJhbGFuY2Ugb2YgYSBjb250cmlidXRvci5EUGFydGlhbGx5UmVmdW5kZWQEARxwYXJhX2lkaQIBGFBhcmFJZAADCC0BVGhlIGxvYW5zIGluIGEgZnVuZCBoYXZlIGJlZW4gcGFydGlhbGx5IGRpc3NvbHZlZCwgaS5lLiB0aGVyZSBhcmUgc29tZSBsZWZ0tG92ZXIgY2hpbGQga2V5cyB0aGF0IHN0aWxsIG5lZWQgdG8gYmUga2lsbGVkLixBbGxSZWZ1bmRlZAQBHHBhcmFfaWRpAgEYUGFyYUlkAAQEnEFsbCBsb2FucyBpbiBhIGZ1bmQgaGF2ZSBiZWVuIHJlZnVuZGVkLiREaXNzb2x2ZWQEARxwYXJhX2lkaQIBGFBhcmFJZAAFBEhGdW5kIGlzIGRpc3NvbHZlZC48SGFuZGxlQmlkUmVzdWx0CAEccGFyYV9pZGkCARhQYXJhSWQAARhyZXN1bHSZBwE4RGlzcGF0Y2hSZXN1bHQABgT0VGhlIHJlc3VsdCBvZiB0cnlpbmcgdG8gc3VibWl0IGEgbmV3IGJpZCB0byB0aGUgU2xvdHMgcGFsbGV0LhhFZGl0ZWQEARxwYXJhX2lkaQIBGFBhcmFJZAAHBMRUaGUgY29uZmlndXJhdGlvbiB0byBhIGNyb3dkbG9hbiBoYXMgYmVlbiBlZGl0ZWQuLE1lbW9VcGRhdGVkDAEMd2hvAAEwVDo6QWNjb3VudElkAAEccGFyYV9pZGkCARhQYXJhSWQAARBtZW1vOAEcVmVjPHU4PgAIBGBBIG1lbW8gaGFzIGJlZW4gdXBkYXRlZC48QWRkZWRUb05ld1JhaXNlBAEccGFyYV9pZGkCARhQYXJhSWQACQSgQSBwYXJhY2hhaW4gaGFzIGJlZW4gbW92ZWQgdG8gYE5ld1JhaXNlYAR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldCUIEGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMgY29yZXRpbWUYcGFsbGV0FEV2ZW50BARUAAEIUFJldmVudWVJbmZvUmVxdWVzdGVkBAEQd2hlbhABREJsb2NrTnVtYmVyRm9yPFQ+AAAEIQFUaGUgYnJva2VyIGNoYWluIGhhcyBhc2tlZCBmb3IgcmV2ZW51ZSBpbmZvcm1hdGlvbiBmb3IgYSBzcGVjaWZpYyBibG9jay4wQ29yZUFzc2lnbmVkBAEQY29yZfUHASRDb3JlSW5kZXgAAQTsQSBjb3JlIGhhcyByZWNlaXZlZCBhIG5ldyBhc3NpZ25tZW50IGZyb20gdGhlIGJyb2tlciBjaGFpbi4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXQpCAwocGFsbGV0X3hjbRhwYWxsZXQURXZlbnQEBFQAAWAkQXR0ZW1wdGVkBAEcb3V0Y29tZS0IAVB4Y206OmxhdGVzdDo6T3V0Y29tZQAABKhFeGVjdXRpb24gb2YgYW4gWENNIG1lc3NhZ2Ugd2FzIGF0dGVtcHRlZC4QU2VudBABGG9yaWdpbvQBIExvY2F0aW9uAAEsZGVzdGluYXRpb270ASBMb2NhdGlvbgABHG1lc3NhZ2WRBgEcWGNtPCgpPgABKG1lc3NhZ2VfaWQEARxYY21IYXNoAAEEXEEgWENNIG1lc3NhZ2Ugd2FzIHNlbnQuSFVuZXhwZWN0ZWRSZXNwb25zZQgBGG9yaWdpbvQBIExvY2F0aW9uAAEgcXVlcnlfaWQwARxRdWVyeUlkAAIMWQFRdWVyeSByZXNwb25zZSByZWNlaXZlZCB3aGljaCBkb2VzIG5vdCBtYXRjaCBhIHJlZ2lzdGVyZWQgcXVlcnkuIFRoaXMgbWF5IGJlIGJlY2F1c2UgYVUBbWF0Y2hpbmcgcXVlcnkgd2FzIG5ldmVyIHJlZ2lzdGVyZWQsIGl0IG1heSBiZSBiZWNhdXNlIGl0IGlzIGEgZHVwbGljYXRlIHJlc3BvbnNlLCBvcnBiZWNhdXNlIHRoZSBxdWVyeSB0aW1lZCBvdXQuNFJlc3BvbnNlUmVhZHkIASBxdWVyeV9pZDABHFF1ZXJ5SWQAASByZXNwb25zZbEGASBSZXNwb25zZQADCF0BUXVlcnkgcmVzcG9uc2UgaGFzIGJlZW4gcmVjZWl2ZWQgYW5kIGlzIHJlYWR5IGZvciB0YWtpbmcgd2l0aCBgdGFrZV9yZXNwb25zZWAuIFRoZXJlIGlzgG5vIHJlZ2lzdGVyZWQgbm90aWZpY2F0aW9uIGNhbGwuIE5vdGlmaWVkDAEgcXVlcnlfaWQwARxRdWVyeUlkAAEwcGFsbGV0X2luZGV4CAEIdTgAAShjYWxsX2luZGV4CAEIdTgABAhZAVF1ZXJ5IHJlc3BvbnNlIGhhcyBiZWVuIHJlY2VpdmVkIGFuZCBxdWVyeSBpcyByZW1vdmVkLiBUaGUgcmVnaXN0ZXJlZCBub3RpZmljYXRpb24gaGFzqGJlZW4gZGlzcGF0Y2hlZCBhbmQgZXhlY3V0ZWQgc3VjY2Vzc2Z1bGx5LkBOb3RpZnlPdmVyd2VpZ2h0FAEgcXVlcnlfaWQwARxRdWVyeUlkAAEwcGFsbGV0X2luZGV4CAEIdTgAAShjYWxsX2luZGV4CAEIdTgAATRhY3R1YWxfd2VpZ2h0KAEYV2VpZ2h0AAFMbWF4X2J1ZGdldGVkX3dlaWdodCgBGFdlaWdodAAFDEkBUXVlcnkgcmVzcG9uc2UgaGFzIGJlZW4gcmVjZWl2ZWQgYW5kIHF1ZXJ5IGlzIHJlbW92ZWQuIFRoZSByZWdpc3RlcmVkIG5vdGlmaWNhdGlvblkBY291bGQgbm90IGJlIGRpc3BhdGNoZWQgYmVjYXVzZSB0aGUgZGlzcGF0Y2ggd2VpZ2h0IGlzIGdyZWF0ZXIgdGhhbiB0aGUgbWF4aW11bSB3ZWlnaHTkb3JpZ2luYWxseSBidWRnZXRlZCBieSB0aGlzIHJ1bnRpbWUgZm9yIHRoZSBxdWVyeSByZXN1bHQuTE5vdGlmeURpc3BhdGNoRXJyb3IMASBxdWVyeV9pZDABHFF1ZXJ5SWQAATBwYWxsZXRfaW5kZXgIAQh1OAABKGNhbGxfaW5kZXgIAQh1OAAGCFUBUXVlcnkgcmVzcG9uc2UgaGFzIGJlZW4gcmVjZWl2ZWQgYW5kIHF1ZXJ5IGlzIHJlbW92ZWQuIFRoZXJlIHdhcyBhIGdlbmVyYWwgZXJyb3Igd2l0aIhkaXNwYXRjaGluZyB0aGUgbm90aWZpY2F0aW9uIGNhbGwuSE5vdGlmeURlY29kZUZhaWxlZAwBIHF1ZXJ5X2lkMAEcUXVlcnlJZAABMHBhbGxldF9pbmRleAgBCHU4AAEoY2FsbF9pbmRleAgBCHU4AAcMUQFRdWVyeSByZXNwb25zZSBoYXMgYmVlbiByZWNlaXZlZCBhbmQgcXVlcnkgaXMgcmVtb3ZlZC4gVGhlIGRpc3BhdGNoIHdhcyB1bmFibGUgdG8gYmVZAWRlY29kZWQgaW50byBhIGBDYWxsYDsgdGhpcyBtaWdodCBiZSBkdWUgdG8gZGlzcGF0Y2ggZnVuY3Rpb24gaGF2aW5nIGEgc2lnbmF0dXJlIHdoaWNolGlzIG5vdCBgKG9yaWdpbiwgUXVlcnlJZCwgUmVzcG9uc2UpYC5ASW52YWxpZFJlc3BvbmRlcgwBGG9yaWdpbvQBIExvY2F0aW9uAAEgcXVlcnlfaWQwARxRdWVyeUlkAAFEZXhwZWN0ZWRfbG9jYXRpb27FBgFAT3B0aW9uPExvY2F0aW9uPgAIDFkBRXhwZWN0ZWQgcXVlcnkgcmVzcG9uc2UgaGFzIGJlZW4gcmVjZWl2ZWQgYnV0IHRoZSBvcmlnaW4gbG9jYXRpb24gb2YgdGhlIHJlc3BvbnNlIGRvZXNVAW5vdCBtYXRjaCB0aGF0IGV4cGVjdGVkLiBUaGUgcXVlcnkgcmVtYWlucyByZWdpc3RlcmVkIGZvciBhIGxhdGVyLCB2YWxpZCwgcmVzcG9uc2UgdG9sYmUgcmVjZWl2ZWQgYW5kIGFjdGVkIHVwb24uXEludmFsaWRSZXNwb25kZXJWZXJzaW9uCAEYb3JpZ2lu9AEgTG9jYXRpb24AASBxdWVyeV9pZDABHFF1ZXJ5SWQACRxRAUV4cGVjdGVkIHF1ZXJ5IHJlc3BvbnNlIGhhcyBiZWVuIHJlY2VpdmVkIGJ1dCB0aGUgZXhwZWN0ZWQgb3JpZ2luIGxvY2F0aW9uIHBsYWNlZCBpbk0Bc3RvcmFnZSBieSB0aGlzIHJ1bnRpbWUgcHJldmlvdXNseSBjYW5ub3QgYmUgZGVjb2RlZC4gVGhlIHF1ZXJ5IHJlbWFpbnMgcmVnaXN0ZXJlZC4AQQFUaGlzIGlzIHVuZXhwZWN0ZWQgKHNpbmNlIGEgbG9jYXRpb24gcGxhY2VkIGluIHN0b3JhZ2UgaW4gYSBwcmV2aW91c2x5IGV4ZWN1dGluZ00BcnVudGltZSBzaG91bGQgYmUgcmVhZGFibGUgcHJpb3IgdG8gcXVlcnkgdGltZW91dCkgYW5kIGRhbmdlcm91cyBzaW5jZSB0aGUgcG9zc2libHlZAXZhbGlkIHJlc3BvbnNlIHdpbGwgYmUgZHJvcHBlZC4gTWFudWFsIGdvdmVybmFuY2UgaW50ZXJ2ZW50aW9uIGlzIHByb2JhYmx5IGdvaW5nIHRvIGJlHG5lZWRlZC40UmVzcG9uc2VUYWtlbgQBIHF1ZXJ5X2lkMAEcUXVlcnlJZAAKBMhSZWNlaXZlZCBxdWVyeSByZXNwb25zZSBoYXMgYmVlbiByZWFkIGFuZCByZW1vdmVkLjRBc3NldHNUcmFwcGVkDAEQaGFzaDQBEEgyNTYAARhvcmlnaW70ASBMb2NhdGlvbgABGGFzc2V0c9kGATxWZXJzaW9uZWRBc3NldHMACwS4U29tZSBhc3NldHMgaGF2ZSBiZWVuIHBsYWNlZCBpbiBhbiBhc3NldCB0cmFwLlRWZXJzaW9uQ2hhbmdlTm90aWZpZWQQASxkZXN0aW5hdGlvbvQBIExvY2F0aW9uAAEYcmVzdWx0EAEoWGNtVmVyc2lvbgABEGNvc3SdBgEYQXNzZXRzAAEobWVzc2FnZV9pZAQBHFhjbUhhc2gADAwlAUFuIFhDTSB2ZXJzaW9uIGNoYW5nZSBub3RpZmljYXRpb24gbWVzc2FnZSBoYXMgYmVlbiBhdHRlbXB0ZWQgdG8gYmUgc2VudC4A4FRoZSBjb3N0IG9mIHNlbmRpbmcgaXQgKGJvcm5lIGJ5IHRoZSBjaGFpbikgaXMgaW5jbHVkZWQuXFN1cHBvcnRlZFZlcnNpb25DaGFuZ2VkCAEgbG9jYXRpb270ASBMb2NhdGlvbgABHHZlcnNpb24QAShYY21WZXJzaW9uAA0IOQFUaGUgc3VwcG9ydGVkIHZlcnNpb24gb2YgYSBsb2NhdGlvbiBoYXMgYmVlbiBjaGFuZ2VkLiBUaGlzIG1pZ2h0IGJlIHRocm91Z2ggYW7AYXV0b21hdGljIG5vdGlmaWNhdGlvbiBvciBhIG1hbnVhbCBpbnRlcnZlbnRpb24uUE5vdGlmeVRhcmdldFNlbmRGYWlsDAEgbG9jYXRpb270ASBMb2NhdGlvbgABIHF1ZXJ5X2lkMAEcUXVlcnlJZAABFGVycm9yWQYBIFhjbUVycm9yAA4IWQFBIGdpdmVuIGxvY2F0aW9uIHdoaWNoIGhhZCBhIHZlcnNpb24gY2hhbmdlIHN1YnNjcmlwdGlvbiB3YXMgZHJvcHBlZCBvd2luZyB0byBhbiBlcnJvcnxzZW5kaW5nIHRoZSBub3RpZmljYXRpb24gdG8gaXQuZE5vdGlmeVRhcmdldE1pZ3JhdGlvbkZhaWwIASBsb2NhdGlvbi0BAURWZXJzaW9uZWRMb2NhdGlvbgABIHF1ZXJ5X2lkMAEcUXVlcnlJZAAPCFkBQSBnaXZlbiBsb2NhdGlvbiB3aGljaCBoYWQgYSB2ZXJzaW9uIGNoYW5nZSBzdWJzY3JpcHRpb24gd2FzIGRyb3BwZWQgb3dpbmcgdG8gYW4gZXJyb3K0bWlncmF0aW5nIHRoZSBsb2NhdGlvbiB0byBvdXIgbmV3IFhDTSBmb3JtYXQuVEludmFsaWRRdWVyaWVyVmVyc2lvbggBGG9yaWdpbvQBIExvY2F0aW9uAAEgcXVlcnlfaWQwARxRdWVyeUlkABAcVQFFeHBlY3RlZCBxdWVyeSByZXNwb25zZSBoYXMgYmVlbiByZWNlaXZlZCBidXQgdGhlIGV4cGVjdGVkIHF1ZXJpZXIgbG9jYXRpb24gcGxhY2VkIGluTQFzdG9yYWdlIGJ5IHRoaXMgcnVudGltZSBwcmV2aW91c2x5IGNhbm5vdCBiZSBkZWNvZGVkLiBUaGUgcXVlcnkgcmVtYWlucyByZWdpc3RlcmVkLgBBAVRoaXMgaXMgdW5leHBlY3RlZCAoc2luY2UgYSBsb2NhdGlvbiBwbGFjZWQgaW4gc3RvcmFnZSBpbiBhIHByZXZpb3VzbHkgZXhlY3V0aW5nTQFydW50aW1lIHNob3VsZCBiZSByZWFkYWJsZSBwcmlvciB0byBxdWVyeSB0aW1lb3V0KSBhbmQgZGFuZ2Vyb3VzIHNpbmNlIHRoZSBwb3NzaWJseVkBdmFsaWQgcmVzcG9uc2Ugd2lsbCBiZSBkcm9wcGVkLiBNYW51YWwgZ292ZXJuYW5jZSBpbnRlcnZlbnRpb24gaXMgcHJvYmFibHkgZ29pbmcgdG8gYmUcbmVlZGVkLjhJbnZhbGlkUXVlcmllchABGG9yaWdpbvQBIExvY2F0aW9uAAEgcXVlcnlfaWQwARxRdWVyeUlkAAFAZXhwZWN0ZWRfcXVlcmllcvQBIExvY2F0aW9uAAFQbWF5YmVfYWN0dWFsX3F1ZXJpZXLFBgFAT3B0aW9uPExvY2F0aW9uPgARDF0BRXhwZWN0ZWQgcXVlcnkgcmVzcG9uc2UgaGFzIGJlZW4gcmVjZWl2ZWQgYnV0IHRoZSBxdWVyaWVyIGxvY2F0aW9uIG9mIHRoZSByZXNwb25zZSBkb2VzUQFub3QgbWF0Y2ggdGhlIGV4cGVjdGVkLiBUaGUgcXVlcnkgcmVtYWlucyByZWdpc3RlcmVkIGZvciBhIGxhdGVyLCB2YWxpZCwgcmVzcG9uc2UgdG9sYmUgcmVjZWl2ZWQgYW5kIGFjdGVkIHVwb24uUFZlcnNpb25Ob3RpZnlTdGFydGVkDAEsZGVzdGluYXRpb270ASBMb2NhdGlvbgABEGNvc3SdBgEYQXNzZXRzAAEobWVzc2FnZV9pZAQBHFhjbUhhc2gAEghZAUEgcmVtb3RlIGhhcyByZXF1ZXN0ZWQgWENNIHZlcnNpb24gY2hhbmdlIG5vdGlmaWNhdGlvbiBmcm9tIHVzIGFuZCB3ZSBoYXZlIGhvbm9yZWQgaXQuHQFBIHZlcnNpb24gaW5mb3JtYXRpb24gbWVzc2FnZSBpcyBzZW50IHRvIHRoZW0gYW5kIGl0cyBjb3N0IGlzIGluY2x1ZGVkLlhWZXJzaW9uTm90aWZ5UmVxdWVzdGVkDAEsZGVzdGluYXRpb270ASBMb2NhdGlvbgABEGNvc3SdBgEYQXNzZXRzAAEobWVzc2FnZV9pZAQBHFhjbUhhc2gAEwQ9AVdlIGhhdmUgcmVxdWVzdGVkIHRoYXQgYSByZW1vdGUgY2hhaW4gc2VuZCB1cyBYQ00gdmVyc2lvbiBjaGFuZ2Ugbm90aWZpY2F0aW9ucy5gVmVyc2lvbk5vdGlmeVVucmVxdWVzdGVkDAEsZGVzdGluYXRpb270ASBMb2NhdGlvbgABEGNvc3SdBgEYQXNzZXRzAAEobWVzc2FnZV9pZAQBHFhjbUhhc2gAFAglAVdlIGhhdmUgcmVxdWVzdGVkIHRoYXQgYSByZW1vdGUgY2hhaW4gc3RvcHMgc2VuZGluZyB1cyBYQ00gdmVyc2lvbiBjaGFuZ2U4bm90aWZpY2F0aW9ucy4gRmVlc1BhaWQIARhwYXlpbmf0ASBMb2NhdGlvbgABEGZlZXOdBgEYQXNzZXRzABUEMQFGZWVzIHdlcmUgcGFpZCBmcm9tIGEgbG9jYXRpb24gZm9yIGFuIG9wZXJhdGlvbiAob2Z0ZW4gZm9yIHVzaW5nIGBTZW5kWGNtYCkuNEFzc2V0c0NsYWltZWQMARBoYXNoNAEQSDI1NgABGG9yaWdpbvQBIExvY2F0aW9uAAEYYXNzZXRz2QYBPFZlcnNpb25lZEFzc2V0cwAWBMBTb21lIGFzc2V0cyBoYXZlIGJlZW4gY2xhaW1lZCBmcm9tIGFuIGFzc2V0IHRyYXBgVmVyc2lvbk1pZ3JhdGlvbkZpbmlzaGVkBAEcdmVyc2lvbhABKFhjbVZlcnNpb24AFwSEQSBYQ00gdmVyc2lvbiBtaWdyYXRpb24gZmluaXNoZWQuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0LQgQLHN0YWdpbmdfeGNtCHY0GHRyYWl0cxxPdXRjb21lAAEMIENvbXBsZXRlBAEQdXNlZCgBGFdlaWdodAAAAChJbmNvbXBsZXRlCAEQdXNlZCgBGFdlaWdodAABFGVycm9yWQYBFEVycm9yAAEAFEVycm9yBAEUZXJyb3JZBgEURXJyb3IAAgAAMQgMUHBhbGxldF9tZXNzYWdlX3F1ZXVlGHBhbGxldBRFdmVudAQEVAABEEBQcm9jZXNzaW5nRmFpbGVkDAEIaWQ0ARBIMjU2BJRUaGUgYGJsYWtlMl8yNTZgIGhhc2ggb2YgdGhlIG1lc3NhZ2UuARhvcmlnaW4VBwFITWVzc2FnZU9yaWdpbk9mPFQ+BGRUaGUgcXVldWUgb2YgdGhlIG1lc3NhZ2UuARRlcnJvcjUIAUxQcm9jZXNzTWVzc2FnZUVycm9yEGBUaGUgZXJyb3IgdGhhdCBvY2N1cnJlZC4ASQFUaGlzIGVycm9yIGlzIHByZXR0eSBvcGFxdWUuIE1vcmUgZmluZS1ncmFpbmVkIGVycm9ycyBuZWVkIHRvIGJlIGVtaXR0ZWQgYXMgZXZlbnRzaGJ5IHRoZSBgTWVzc2FnZVByb2Nlc3NvcmAuAARVAU1lc3NhZ2UgZGlzY2FyZGVkIGR1ZSB0byBhbiBlcnJvciBpbiB0aGUgYE1lc3NhZ2VQcm9jZXNzb3JgICh1c3VhbGx5IGEgZm9ybWF0IGVycm9yKS4kUHJvY2Vzc2VkEAEIaWQ0ARBIMjU2BJRUaGUgYGJsYWtlMl8yNTZgIGhhc2ggb2YgdGhlIG1lc3NhZ2UuARhvcmlnaW4VBwFITWVzc2FnZU9yaWdpbk9mPFQ+BGRUaGUgcXVldWUgb2YgdGhlIG1lc3NhZ2UuASx3ZWlnaHRfdXNlZCgBGFdlaWdodATASG93IG11Y2ggd2VpZ2h0IHdhcyB1c2VkIHRvIHByb2Nlc3MgdGhlIG1lc3NhZ2UuARxzdWNjZXNzIAEQYm9vbBiIV2hldGhlciB0aGUgbWVzc2FnZSB3YXMgcHJvY2Vzc2VkLgBJAU5vdGUgdGhhdCB0aGlzIGRvZXMgbm90IG1lYW4gdGhhdCB0aGUgdW5kZXJseWluZyBgTWVzc2FnZVByb2Nlc3NvcmAgd2FzIGludGVybmFsbHk1AXN1Y2Nlc3NmdWwuIEl0ICpzb2xlbHkqIG1lYW5zIHRoYXQgdGhlIE1RIHBhbGxldCB3aWxsIHRyZWF0IHRoaXMgYXMgYSBzdWNjZXNzTQFjb25kaXRpb24gYW5kIGRpc2NhcmQgdGhlIG1lc3NhZ2UuIEFueSBpbnRlcm5hbCBlcnJvciBuZWVkcyB0byBiZSBlbWl0dGVkIGFzIGV2ZW50c2hieSB0aGUgYE1lc3NhZ2VQcm9jZXNzb3JgLgEEVE1lc3NhZ2UgaXMgcHJvY2Vzc2VkLkhPdmVyd2VpZ2h0RW5xdWV1ZWQQAQhpZAQBIFt1ODsgMzJdBJRUaGUgYGJsYWtlMl8yNTZgIGhhc2ggb2YgdGhlIG1lc3NhZ2UuARhvcmlnaW4VBwFITWVzc2FnZU9yaWdpbk9mPFQ+BGRUaGUgcXVldWUgb2YgdGhlIG1lc3NhZ2UuAShwYWdlX2luZGV4EAEkUGFnZUluZGV4BGBUaGUgcGFnZSBvZiB0aGUgbWVzc2FnZS4BNG1lc3NhZ2VfaW5kZXgQARxUOjpTaXplBKRUaGUgaW5kZXggb2YgdGhlIG1lc3NhZ2Ugd2l0aGluIHRoZSBwYWdlLgIEjE1lc3NhZ2UgcGxhY2VkIGluIG92ZXJ3ZWlnaHQgcXVldWUuKFBhZ2VSZWFwZWQIARhvcmlnaW4VBwFITWVzc2FnZU9yaWdpbk9mPFQ+BFhUaGUgcXVldWUgb2YgdGhlIHBhZ2UuARRpbmRleBABJFBhZ2VJbmRleARYVGhlIGluZGV4IG9mIHRoZSBwYWdlLgMEVFRoaXMgcGFnZSB3YXMgcmVhcGVkLgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldDUIEDRmcmFtZV9zdXBwb3J0GHRyYWl0cyBtZXNzYWdlc0xQcm9jZXNzTWVzc2FnZUVycm9yAAEYJEJhZEZvcm1hdAAAABxDb3JydXB0AAEALFVuc3VwcG9ydGVkAAIAKE92ZXJ3ZWlnaHQEACgBGFdlaWdodAADABRZaWVsZAAEAERTdGFja0xpbWl0UmVhY2hlZAAFAAA5CAxEcGFsbGV0X2Fzc2V0X3JhdGUYcGFsbGV0FEV2ZW50BARUAAEMQEFzc2V0UmF0ZUNyZWF0ZWQIAShhc3NldF9raW5kxAEwVDo6QXNzZXRLaW5kAAEQcmF0ZSEHASRGaXhlZFUxMjgAAABAQXNzZXRSYXRlUmVtb3ZlZAQBKGFzc2V0X2tpbmTEATBUOjpBc3NldEtpbmQAAQBAQXNzZXRSYXRlVXBkYXRlZAwBKGFzc2V0X2tpbmTEATBUOjpBc3NldEtpbmQAAQxvbGQhBwEkRml4ZWRVMTI4AAEMbmV3IQcBJEZpeGVkVTEyOAACAAR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldD0ICDBmcmFtZV9zeXN0ZW0UUGhhc2UAAQw4QXBwbHlFeHRyaW5zaWMEABABDHUzMgAAADBGaW5hbGl6YXRpb24AAQA4SW5pdGlhbGl6YXRpb24AAgAAQQgAAAL1AgBFCAgwZnJhbWVfc3lzdGVtWExhc3RSdW50aW1lVXBncmFkZUluZm8AAAgBMHNwZWNfdmVyc2lvbtQBTGNvZGVjOjpDb21wYWN0PHUzMj4AASRzcGVjX25hbWVJCAFkc3BfcnVudGltZTo6UnVudGltZVN0cmluZwAASQgAAAUCAE0ICDBmcmFtZV9zeXN0ZW1gQ29kZVVwZ3JhZGVBdXRob3JpemF0aW9uBARUAAAIASRjb2RlX2hhc2g0ARxUOjpIYXNoAAE0Y2hlY2tfdmVyc2lvbiABEGJvb2wAAFEIDDBmcmFtZV9zeXN0ZW0YbGltaXRzMEJsb2NrV2VpZ2h0cwAADAEoYmFzZV9ibG9jaygBGFdlaWdodAABJG1heF9ibG9jaygBGFdlaWdodAABJHBlcl9jbGFzc1UIAYRQZXJEaXNwYXRjaENsYXNzPFdlaWdodHNQZXJDbGFzcz4AAFUIDDRmcmFtZV9zdXBwb3J0IGRpc3BhdGNoQFBlckRpc3BhdGNoQ2xhc3MEBFQBWQgADAEYbm9ybWFsWQgBBFQAASxvcGVyYXRpb25hbFkIAQRUAAEkbWFuZGF0b3J5WQgBBFQAAFkIDDBmcmFtZV9zeXN0ZW0YbGltaXRzPFdlaWdodHNQZXJDbGFzcwAAEAE4YmFzZV9leHRyaW5zaWMoARhXZWlnaHQAATRtYXhfZXh0cmluc2ljcQcBOE9wdGlvbjxXZWlnaHQ+AAEkbWF4X3RvdGFscQcBOE9wdGlvbjxXZWlnaHQ+AAEgcmVzZXJ2ZWRxBwE4T3B0aW9uPFdlaWdodD4AAF0IDDBmcmFtZV9zeXN0ZW0YbGltaXRzLEJsb2NrTGVuZ3RoAAAEAQxtYXhhCAFUUGVyRGlzcGF0Y2hDbGFzczx1MzI+AABhCAw0ZnJhbWVfc3VwcG9ydCBkaXNwYXRjaEBQZXJEaXNwYXRjaENsYXNzBARUARAADAEYbm9ybWFsEAEEVAABLG9wZXJhdGlvbmFsEAEEVAABJG1hbmRhdG9yeRABBFQAAGUICChzcF93ZWlnaHRzPFJ1bnRpbWVEYldlaWdodAAACAEQcmVhZDABDHU2NAABFHdyaXRlMAEMdTY0AABpCAgoc3BfdmVyc2lvbjhSdW50aW1lVmVyc2lvbgAAIAEkc3BlY19uYW1lSQgBNFJ1bnRpbWVTdHJpbmcAASRpbXBsX25hbWVJCAE0UnVudGltZVN0cmluZwABRGF1dGhvcmluZ192ZXJzaW9uEAEMdTMyAAEwc3BlY192ZXJzaW9uEAEMdTMyAAEwaW1wbF92ZXJzaW9uEAEMdTMyAAEQYXBpc20IARxBcGlzVmVjAAFMdHJhbnNhY3Rpb25fdmVyc2lvbhABDHUzMgABNHN0YXRlX3ZlcnNpb24IAQh1OAAAbQgEDENvdwQEVAFxCAAEAHEIAAAAcQgAAAJ1CAB1CAAABAgBBhAAeQgMMGZyYW1lX3N5c3RlbRhwYWxsZXQURXJyb3IEBFQAASQ8SW52YWxpZFNwZWNOYW1lAAAIEQFUaGUgbmFtZSBvZiBzcGVjaWZpY2F0aW9uIGRvZXMgbm90IG1hdGNoIGJldHdlZW4gdGhlIGN1cnJlbnQgcnVudGltZVBhbmQgdGhlIG5ldyBydW50aW1lLmhTcGVjVmVyc2lvbk5lZWRzVG9JbmNyZWFzZQABCEEBVGhlIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpcyBub3QgYWxsb3dlZCB0byBkZWNyZWFzZSBiZXR3ZWVuIHRoZSBjdXJyZW50IHJ1bnRpbWVQYW5kIHRoZSBuZXcgcnVudGltZS50RmFpbGVkVG9FeHRyYWN0UnVudGltZVZlcnNpb24AAgzsRmFpbGVkIHRvIGV4dHJhY3QgdGhlIHJ1bnRpbWUgdmVyc2lvbiBmcm9tIHRoZSBuZXcgcnVudGltZS4ACQFFaXRoZXIgY2FsbGluZyBgQ29yZV92ZXJzaW9uYCBvciBkZWNvZGluZyBgUnVudGltZVZlcnNpb25gIGZhaWxlZC5MTm9uRGVmYXVsdENvbXBvc2l0ZQADBPxTdWljaWRlIGNhbGxlZCB3aGVuIHRoZSBhY2NvdW50IGhhcyBub24tZGVmYXVsdCBjb21wb3NpdGUgZGF0YS48Tm9uWmVyb1JlZkNvdW50AAQENQFUaGVyZSBpcyBhIG5vbi16ZXJvIHJlZmVyZW5jZSBjb3VudCBwcmV2ZW50aW5nIHRoZSBhY2NvdW50IGZyb20gYmVpbmcgcHVyZ2VkLjBDYWxsRmlsdGVyZWQABQTQVGhlIG9yaWdpbiBmaWx0ZXIgcHJldmVudCB0aGUgY2FsbCB0byBiZSBkaXNwYXRjaGVkLmxNdWx0aUJsb2NrTWlncmF0aW9uc09uZ29pbmcABgRVAUEgbXVsdGktYmxvY2sgbWlncmF0aW9uIGlzIG9uZ29pbmcgYW5kIHByZXZlbnRzIHRoZSBjdXJyZW50IGNvZGUgZnJvbSBiZWluZyByZXBsYWNlZC5ETm90aGluZ0F1dGhvcml6ZWQABwRYTm8gdXBncmFkZSBhdXRob3JpemVkLjBVbmF1dGhvcml6ZWQACASUVGhlIHN1Ym1pdHRlZCBjb2RlIGlzIG5vdCBhdXRob3JpemVkLgRsRXJyb3IgZm9yIHRoZSBTeXN0ZW0gcGFsbGV0fQgMTGJvdW5kZWRfY29sbGVjdGlvbnNAd2Vha19ib3VuZGVkX3ZlYzhXZWFrQm91bmRlZFZlYwgEVAGBCARTAAAEAIUIARhWZWM8VD4AAIEIAAAECH0BMACFCAAAAoEIAIkIDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBBARTAAAEAI0IARhWZWM8VD4AAI0IAAACBACRCAQYT3B0aW9uBARUAZUIAQgQTm9uZQAAABBTb21lBACVCAAAAQAAlQgMRHNwX2NvbnNlbnN1c19iYWJlHGRpZ2VzdHMkUHJlRGlnZXN0AAEMHFByaW1hcnkEAJkIAUBQcmltYXJ5UHJlRGlnZXN0AAEAOFNlY29uZGFyeVBsYWluBAChCAFcU2Vjb25kYXJ5UGxhaW5QcmVEaWdlc3QAAgAwU2Vjb25kYXJ5VlJGBAClCAFUU2Vjb25kYXJ5VlJGUHJlRGlnZXN0AAMAAJkIDERzcF9jb25zZW5zdXNfYmFiZRxkaWdlc3RzQFByaW1hcnlQcmVEaWdlc3QAAAwBPGF1dGhvcml0eV9pbmRleBABVHN1cGVyOjpBdXRob3JpdHlJbmRleAABEHNsb3SBAQEQU2xvdAABNHZyZl9zaWduYXR1cmWdCAEwVnJmU2lnbmF0dXJlAACdCBAcc3BfY29yZRxzcjI1NTE5DHZyZjBWcmZTaWduYXR1cmUAAAgBKHByZV9vdXRwdXQEATBWcmZQcmVPdXRwdXQAARRwcm9vZiUCASBWcmZQcm9vZgAAoQgMRHNwX2NvbnNlbnN1c19iYWJlHGRpZ2VzdHNcU2Vjb25kYXJ5UGxhaW5QcmVEaWdlc3QAAAgBPGF1dGhvcml0eV9pbmRleBABVHN1cGVyOjpBdXRob3JpdHlJbmRleAABEHNsb3SBAQEQU2xvdAAApQgMRHNwX2NvbnNlbnN1c19iYWJlHGRpZ2VzdHNUU2Vjb25kYXJ5VlJGUHJlRGlnZXN0AAAMATxhdXRob3JpdHlfaW5kZXgQAVRzdXBlcjo6QXV0aG9yaXR5SW5kZXgAARBzbG90gQEBEFNsb3QAATR2cmZfc2lnbmF0dXJlnQgBMFZyZlNpZ25hdHVyZQAAqQgIRHNwX2NvbnNlbnN1c19iYWJlWEJhYmVFcG9jaENvbmZpZ3VyYXRpb24AAAgBBGONAQEoKHU2NCwgdTY0KQABNGFsbG93ZWRfc2xvdHORAQEwQWxsb3dlZFNsb3RzAACtCAxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAbEIBFMAAAQAtQgBGFZlYzxUPgAAsQgAAAQIMBAAtQgAAAKxCAC5CAwscGFsbGV0X2JhYmUYcGFsbGV0FEVycm9yBARUAAEQYEludmFsaWRFcXVpdm9jYXRpb25Qcm9vZgAABDEBQW4gZXF1aXZvY2F0aW9uIHByb29mIHByb3ZpZGVkIGFzIHBhcnQgb2YgYW4gZXF1aXZvY2F0aW9uIHJlcG9ydCBpcyBpbnZhbGlkLmBJbnZhbGlkS2V5T3duZXJzaGlwUHJvb2YAAQQxAUEga2V5IG93bmVyc2hpcCBwcm9vZiBwcm92aWRlZCBhcyBwYXJ0IG9mIGFuIGVxdWl2b2NhdGlvbiByZXBvcnQgaXMgaW52YWxpZC5YRHVwbGljYXRlT2ZmZW5jZVJlcG9ydAACBBUBQSBnaXZlbiBlcXVpdm9jYXRpb24gcmVwb3J0IGlzIHZhbGlkIGJ1dCBhbHJlYWR5IHByZXZpb3VzbHkgcmVwb3J0ZWQuUEludmFsaWRDb25maWd1cmF0aW9uAAMEjFN1Ym1pdHRlZCBjb25maWd1cmF0aW9uIGlzIGludmFsaWQuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0Lr0IAAAEDAAYIADBCAw4cGFsbGV0X2luZGljZXMYcGFsbGV0FEVycm9yBARUAAEULE5vdEFzc2lnbmVkAAAEjFRoZSBpbmRleCB3YXMgbm90IGFscmVhZHkgYXNzaWduZWQuIE5vdE93bmVyAAEEpFRoZSBpbmRleCBpcyBhc3NpZ25lZCB0byBhbm90aGVyIGFjY291bnQuFEluVXNlAAIEcFRoZSBpbmRleCB3YXMgbm90IGF2YWlsYWJsZS4sTm90VHJhbnNmZXIAAwTIVGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gYWNjb3VudHMgYXJlIGlkZW50aWNhbC4kUGVybWFuZW50AAQE0FRoZSBpbmRleCBpcyBwZXJtYW5lbnQgYW5kIG1heSBub3QgYmUgZnJlZWQvY2hhbmdlZC4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQuxQgMTGJvdW5kZWRfY29sbGVjdGlvbnNAd2Vha19ib3VuZGVkX3ZlYzhXZWFrQm91bmRlZFZlYwgEVAHJCARTAAAEANEIARhWZWM8VD4AAMkIDDxwYWxsZXRfYmFsYW5jZXMUdHlwZXMsQmFsYW5jZUxvY2sEHEJhbGFuY2UBGAAMAQhpZAEGAThMb2NrSWRlbnRpZmllcgABGGFtb3VudBgBHEJhbGFuY2UAARxyZWFzb25zzQgBHFJlYXNvbnMAAM0IDDxwYWxsZXRfYmFsYW5jZXMUdHlwZXMcUmVhc29ucwABDAxGZWUAAAAQTWlzYwABAAxBbGwAAgAA0QgAAALJCADVCAxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAdkIBFMAAAQA3QgBGFZlYzxUPgAA2QgMPHBhbGxldF9iYWxhbmNlcxR0eXBlcyxSZXNlcnZlRGF0YQhEUmVzZXJ2ZUlkZW50aWZpZXIBAQYcQmFsYW5jZQEYAAgBCGlkAQYBRFJlc2VydmVJZGVudGlmaWVyAAEYYW1vdW50GAEcQmFsYW5jZQAA3QgAAALZCADhCAxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAeUIBFMAAAQA9QgBGFZlYzxUPgAA5QgUNGZyYW1lX3N1cHBvcnQYdHJhaXRzGHRva2VucxBtaXNjIElkQW1vdW50CAhJZAHpCBxCYWxhbmNlARgACAEIaWTpCAEISWQAARhhbW91bnQYARxCYWxhbmNlAADpCAhYc3RhZ2luZ19rdXNhbWFfcnVudGltZURSdW50aW1lSG9sZFJlYXNvbgABCCBQcmVpbWFnZQQA7QgBbHBhbGxldF9wcmVpbWFnZTo6SG9sZFJlYXNvbgAgAAxOaXMEAPEIAVhwYWxsZXRfbmlzOjpIb2xkUmVhc29uACYAAO0IDDxwYWxsZXRfcHJlaW1hZ2UYcGFsbGV0KEhvbGRSZWFzb24AAQQgUHJlaW1hZ2UAAAAA8QgMKHBhbGxldF9uaXMYcGFsbGV0KEhvbGRSZWFzb24AAQQoTmZ0UmVjZWlwdAAAAAD1CAAAAuUIAPkIDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQB/QgEUwAABAAJCQEYVmVjPFQ+AAD9CBQ0ZnJhbWVfc3VwcG9ydBh0cmFpdHMYdG9rZW5zEG1pc2MgSWRBbW91bnQICElkAQEJHEJhbGFuY2UBGAAIAQhpZAEJAQhJZAABGGFtb3VudBgBHEJhbGFuY2UAAAEJCFhzdGFnaW5nX2t1c2FtYV9ydW50aW1lTFJ1bnRpbWVGcmVlemVSZWFzb24AAQQ8Tm9taW5hdGlvblBvb2xzBAAFCQGUcGFsbGV0X25vbWluYXRpb25fcG9vbHM6OkZyZWV6ZVJlYXNvbgApAAAFCQxccGFsbGV0X25vbWluYXRpb25fcG9vbHMYcGFsbGV0MEZyZWV6ZVJlYXNvbgABBDhQb29sTWluQmFsYW5jZQAAAAAJCQAAAv0IAA0JDDxwYWxsZXRfYmFsYW5jZXMYcGFsbGV0FEVycm9yCARUAARJAAEwOFZlc3RpbmdCYWxhbmNlAAAEnFZlc3RpbmcgYmFsYW5jZSB0b28gaGlnaCB0byBzZW5kIHZhbHVlLlRMaXF1aWRpdHlSZXN0cmljdGlvbnMAAQTIQWNjb3VudCBsaXF1aWRpdHkgcmVzdHJpY3Rpb25zIHByZXZlbnQgd2l0aGRyYXdhbC5MSW5zdWZmaWNpZW50QmFsYW5jZQACBHhCYWxhbmNlIHRvbyBsb3cgdG8gc2VuZCB2YWx1ZS5IRXhpc3RlbnRpYWxEZXBvc2l0AAME7FZhbHVlIHRvbyBsb3cgdG8gY3JlYXRlIGFjY291bnQgZHVlIHRvIGV4aXN0ZW50aWFsIGRlcG9zaXQuNEV4cGVuZGFiaWxpdHkABASQVHJhbnNmZXIvcGF5bWVudCB3b3VsZCBraWxsIGFjY291bnQuXEV4aXN0aW5nVmVzdGluZ1NjaGVkdWxlAAUEzEEgdmVzdGluZyBzY2hlZHVsZSBhbHJlYWR5IGV4aXN0cyBmb3IgdGhpcyBhY2NvdW50LixEZWFkQWNjb3VudAAGBIxCZW5lZmljaWFyeSBhY2NvdW50IG11c3QgcHJlLWV4aXN0LjxUb29NYW55UmVzZXJ2ZXMABwS4TnVtYmVyIG9mIG5hbWVkIHJlc2VydmVzIGV4Y2VlZCBgTWF4UmVzZXJ2ZXNgLjBUb29NYW55SG9sZHMACAT4TnVtYmVyIG9mIGhvbGRzIGV4Y2VlZCBgVmFyaWFudENvdW50T2Y8VDo6UnVudGltZUhvbGRSZWFzb24+YC44VG9vTWFueUZyZWV6ZXMACQSYTnVtYmVyIG9mIGZyZWV6ZXMgZXhjZWVkIGBNYXhGcmVlemVzYC5MSXNzdWFuY2VEZWFjdGl2YXRlZAAKBAEBVGhlIGlzc3VhbmNlIGNhbm5vdCBiZSBtb2RpZmllZCBzaW5jZSBpdCBpcyBhbHJlYWR5IGRlYWN0aXZhdGVkLiREZWx0YVplcm8ACwRkVGhlIGRlbHRhIGNhbm5vdCBiZSB6ZXJvLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC4RCQhocGFsbGV0X3RyYW5zYWN0aW9uX3BheW1lbnQgUmVsZWFzZXMAAQgkVjFBbmNpZW50AAAACFYyAAEAABUJCDhwYWxsZXRfc3Rha2luZzRTdGFraW5nTGVkZ2VyBARUAAAUARRzdGFzaAABMFQ6OkFjY291bnRJZAABFHRvdGFs5AEwQmFsYW5jZU9mPFQ+AAEYYWN0aXZl5AEwQmFsYW5jZU9mPFQ+AAEkdW5sb2NraW5n5QEB8EJvdW5kZWRWZWM8VW5sb2NrQ2h1bms8QmFsYW5jZU9mPFQ+PiwgVDo6TWF4VW5sb2NraW5nQ2h1bmtzPgABWGxlZ2FjeV9jbGFpbWVkX3Jld2FyZHMZCQGUQm91bmRlZFZlYzxFcmFJbmRleCwgVDo6SGlzdG9yeURlcHRoPgAAGQkMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAEQBFMAAAQAwQEBGFZlYzxUPgAAHQkIOHBhbGxldF9zdGFraW5nLE5vbWluYXRpb25zBARUAAAMARx0YXJnZXRzIQkBtEJvdW5kZWRWZWM8VDo6QWNjb3VudElkLCBNYXhOb21pbmF0aW9uc09mPFQ+PgABMHN1Ym1pdHRlZF9pbhABIEVyYUluZGV4AAEoc3VwcHJlc3NlZCABEGJvb2wAACEJDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBAARTAAAEAK0BARhWZWM8VD4AACUJCDhwYWxsZXRfc3Rha2luZzRBY3RpdmVFcmFJbmZvAAAIARRpbmRleBABIEVyYUluZGV4AAEUc3RhcnQpCQEsT3B0aW9uPHU2ND4AACkJBBhPcHRpb24EBFQBMAEIEE5vbmUAAAAQU29tZQQAMAAAAQAALQkAAAQIEAAAMQkIKHNwX3N0YWtpbmcgRXhwb3N1cmUIJEFjY291bnRJZAEAHEJhbGFuY2UBGAAMARR0b3RhbOQBHEJhbGFuY2UAAQxvd27kARxCYWxhbmNlAAEYb3RoZXJzNQkBrFZlYzxJbmRpdmlkdWFsRXhwb3N1cmU8QWNjb3VudElkLCBCYWxhbmNlPj4AADUJAAACOQkAOQkIKHNwX3N0YWtpbmdISW5kaXZpZHVhbEV4cG9zdXJlCCRBY2NvdW50SWQBABxCYWxhbmNlARgACAEMd2hvAAEkQWNjb3VudElkAAEUdmFsdWXkARxCYWxhbmNlAAA9CQgoc3Bfc3Rha2luZ1RQYWdlZEV4cG9zdXJlTWV0YWRhdGEEHEJhbGFuY2UBGAAQARR0b3RhbOQBHEJhbGFuY2UAAQxvd27kARxCYWxhbmNlAAE8bm9taW5hdG9yX2NvdW50EAEMdTMyAAEocGFnZV9jb3VudBABEFBhZ2UAAEEJAAAEDBAAEABFCQgoc3Bfc3Rha2luZzBFeHBvc3VyZVBhZ2UIJEFjY291bnRJZAEAHEJhbGFuY2UBGAAIAShwYWdlX3RvdGFs5AEcQmFsYW5jZQABGG90aGVyczUJAaxWZWM8SW5kaXZpZHVhbEV4cG9zdXJlPEFjY291bnRJZCwgQmFsYW5jZT4+AABJCQg4cGFsbGV0X3N0YWtpbmc8RXJhUmV3YXJkUG9pbnRzBCRBY2NvdW50SWQBAAAIARR0b3RhbBABLFJld2FyZFBvaW50AAEoaW5kaXZpZHVhbE0JAYBCVHJlZU1hcDxBY2NvdW50SWQsIFJld2FyZFBvaW50PgAATQkEIEJUcmVlTWFwCARLAQAEVgEQAAQAUQkAAABRCQAAAlUJAFUJAAAECAAQAFkJAAACXQkAXQkIOHBhbGxldF9zdGFraW5nOFVuYXBwbGllZFNsYXNoCCRBY2NvdW50SWQBABxCYWxhbmNlARgAFAEkdmFsaWRhdG9yAAEkQWNjb3VudElkAAEMb3duGAEcQmFsYW5jZQABGG90aGVyc20EAWRWZWM8KEFjY291bnRJZCwgQmFsYW5jZSk+AAEkcmVwb3J0ZXJzrQEBOFZlYzxBY2NvdW50SWQ+AAEYcGF5b3V0GAEcQmFsYW5jZQAAYQkAAAQIlBgAZQkMOHBhbGxldF9zdGFraW5nIHNsYXNoaW5nNFNsYXNoaW5nU3BhbnMAABABKHNwYW5faW5kZXgQASRTcGFuSW5kZXgAAShsYXN0X3N0YXJ0EAEgRXJhSW5kZXgAAUhsYXN0X25vbnplcm9fc2xhc2gQASBFcmFJbmRleAABFHByaW9ywQEBNFZlYzxFcmFJbmRleD4AAGkJDDhwYWxsZXRfc3Rha2luZyBzbGFzaGluZyhTcGFuUmVjb3JkBBxCYWxhbmNlARgACAEcc2xhc2hlZBgBHEJhbGFuY2UAASBwYWlkX291dBgBHEJhbGFuY2UAAG0JEDhwYWxsZXRfc3Rha2luZxhwYWxsZXQYcGFsbGV0FEVycm9yBARUAAF8NE5vdENvbnRyb2xsZXIAAARkTm90IGEgY29udHJvbGxlciBhY2NvdW50LiBOb3RTdGFzaAABBFBOb3QgYSBzdGFzaCBhY2NvdW50LjRBbHJlYWR5Qm9uZGVkAAIEYFN0YXNoIGlzIGFscmVhZHkgYm9uZGVkLjRBbHJlYWR5UGFpcmVkAAMEdENvbnRyb2xsZXIgaXMgYWxyZWFkeSBwYWlyZWQuMEVtcHR5VGFyZ2V0cwAEBGBUYXJnZXRzIGNhbm5vdCBiZSBlbXB0eS44RHVwbGljYXRlSW5kZXgABQRARHVwbGljYXRlIGluZGV4LkRJbnZhbGlkU2xhc2hJbmRleAAGBIRTbGFzaCByZWNvcmQgaW5kZXggb3V0IG9mIGJvdW5kcy5ASW5zdWZmaWNpZW50Qm9uZAAHDFkBQ2Fubm90IGhhdmUgYSB2YWxpZGF0b3Igb3Igbm9taW5hdG9yIHJvbGUsIHdpdGggdmFsdWUgbGVzcyB0aGFuIHRoZSBtaW5pbXVtIGRlZmluZWQgYnk9AWdvdmVybmFuY2UgKHNlZSBgTWluVmFsaWRhdG9yQm9uZGAgYW5kIGBNaW5Ob21pbmF0b3JCb25kYCkuIElmIHVuYm9uZGluZyBpcyB0aGUVAWludGVudGlvbiwgYGNoaWxsYCBmaXJzdCB0byByZW1vdmUgb25lJ3Mgcm9sZSBhcyB2YWxpZGF0b3Ivbm9taW5hdG9yLjBOb01vcmVDaHVua3MACASQQ2FuIG5vdCBzY2hlZHVsZSBtb3JlIHVubG9jayBjaHVua3MuNE5vVW5sb2NrQ2h1bmsACQSgQ2FuIG5vdCByZWJvbmQgd2l0aG91dCB1bmxvY2tpbmcgY2h1bmtzLjBGdW5kZWRUYXJnZXQACgTIQXR0ZW1wdGluZyB0byB0YXJnZXQgYSBzdGFzaCB0aGF0IHN0aWxsIGhhcyBmdW5kcy5ISW52YWxpZEVyYVRvUmV3YXJkAAsEWEludmFsaWQgZXJhIHRvIHJld2FyZC5oSW52YWxpZE51bWJlck9mTm9taW5hdGlvbnMADAR4SW52YWxpZCBudW1iZXIgb2Ygbm9taW5hdGlvbnMuSE5vdFNvcnRlZEFuZFVuaXF1ZQANBIBJdGVtcyBhcmUgbm90IHNvcnRlZCBhbmQgdW5pcXVlLjhBbHJlYWR5Q2xhaW1lZAAOBAkBUmV3YXJkcyBmb3IgdGhpcyBlcmEgaGF2ZSBhbHJlYWR5IGJlZW4gY2xhaW1lZCBmb3IgdGhpcyB2YWxpZGF0b3IuLEludmFsaWRQYWdlAA8EhE5vIG5vbWluYXRvcnMgZXhpc3Qgb24gdGhpcyBwYWdlLlRJbmNvcnJlY3RIaXN0b3J5RGVwdGgAEATASW5jb3JyZWN0IHByZXZpb3VzIGhpc3RvcnkgZGVwdGggaW5wdXQgcHJvdmlkZWQuWEluY29ycmVjdFNsYXNoaW5nU3BhbnMAEQSwSW5jb3JyZWN0IG51bWJlciBvZiBzbGFzaGluZyBzcGFucyBwcm92aWRlZC4gQmFkU3RhdGUAEgQ5AUludGVybmFsIHN0YXRlIGhhcyBiZWNvbWUgc29tZWhvdyBjb3JydXB0ZWQgYW5kIHRoZSBvcGVyYXRpb24gY2Fubm90IGNvbnRpbnVlLjhUb29NYW55VGFyZ2V0cwATBJRUb28gbWFueSBub21pbmF0aW9uIHRhcmdldHMgc3VwcGxpZWQuJEJhZFRhcmdldAAUBD0BQSBub21pbmF0aW9uIHRhcmdldCB3YXMgc3VwcGxpZWQgdGhhdCB3YXMgYmxvY2tlZCBvciBvdGhlcndpc2Ugbm90IGEgdmFsaWRhdG9yLkBDYW5ub3RDaGlsbE90aGVyABUEVQFUaGUgdXNlciBoYXMgZW5vdWdoIGJvbmQgYW5kIHRodXMgY2Fubm90IGJlIGNoaWxsZWQgZm9yY2VmdWxseSBieSBhbiBleHRlcm5hbCBwZXJzb24uRFRvb01hbnlOb21pbmF0b3JzABYITQFUaGVyZSBhcmUgdG9vIG1hbnkgbm9taW5hdG9ycyBpbiB0aGUgc3lzdGVtLiBHb3Zlcm5hbmNlIG5lZWRzIHRvIGFkanVzdCB0aGUgc3Rha2luZ7RzZXR0aW5ncyB0byBrZWVwIHRoaW5ncyBzYWZlIGZvciB0aGUgcnVudGltZS5EVG9vTWFueVZhbGlkYXRvcnMAFwhVAVRoZXJlIGFyZSB0b28gbWFueSB2YWxpZGF0b3IgY2FuZGlkYXRlcyBpbiB0aGUgc3lzdGVtLiBHb3Zlcm5hbmNlIG5lZWRzIHRvIGFkanVzdCB0aGXUc3Rha2luZyBzZXR0aW5ncyB0byBrZWVwIHRoaW5ncyBzYWZlIGZvciB0aGUgcnVudGltZS5AQ29tbWlzc2lvblRvb0xvdwAYBOBDb21taXNzaW9uIGlzIHRvbyBsb3cuIE11c3QgYmUgYXQgbGVhc3QgYE1pbkNvbW1pc3Npb25gLixCb3VuZE5vdE1ldAAZBFhTb21lIGJvdW5kIGlzIG5vdCBtZXQuUENvbnRyb2xsZXJEZXByZWNhdGVkABoEAQFVc2VkIHdoZW4gYXR0ZW1wdGluZyB0byB1c2UgZGVwcmVjYXRlZCBjb250cm9sbGVyIGFjY291bnQgbG9naWMuTENhbm5vdFJlc3RvcmVMZWRnZXIAGwRYQ2Fubm90IHJlc2V0IGEgbGVkZ2VyLmxSZXdhcmREZXN0aW5hdGlvblJlc3RyaWN0ZWQAHASsUHJvdmlkZWQgcmV3YXJkIGRlc3RpbmF0aW9uIGlzIG5vdCBhbGxvd2VkLjhOb3RFbm91Z2hGdW5kcwAdBJxOb3QgZW5vdWdoIGZ1bmRzIGF2YWlsYWJsZSB0byB3aXRoZHJhdy5cVmlydHVhbFN0YWtlck5vdEFsbG93ZWQAHgSoT3BlcmF0aW9uIG5vdCBhbGxvd2VkIGZvciB2aXJ0dWFsIHN0YWtlcnMuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LnEJDChzcF9zdGFraW5nHG9mZmVuY2U4T2ZmZW5jZURldGFpbHMIIFJlcG9ydGVyAQAgT2ZmZW5kZXIBdQkACAEgb2ZmZW5kZXJ1CQEgT2ZmZW5kZXIAASRyZXBvcnRlcnOtAQE0VmVjPFJlcG9ydGVyPgAAdQkAAAQIADEJAHkJAAAECKg4AH0JAAAECDQQAIEJAAAChQkAhQkAAAQIAPUBAIkJAAAECI0JOACNCQwcc3BfY29yZRhjcnlwdG8kS2V5VHlwZUlkAAAEAEgBHFt1ODsgNF0AAJEJDDhwYWxsZXRfc2Vzc2lvbhhwYWxsZXQURXJyb3IEBFQAARQwSW52YWxpZFByb29mAAAEYEludmFsaWQgb3duZXJzaGlwIHByb29mLlxOb0Fzc29jaWF0ZWRWYWxpZGF0b3JJZAABBJxObyBhc3NvY2lhdGVkIHZhbGlkYXRvciBJRCBmb3IgYWNjb3VudC40RHVwbGljYXRlZEtleQACBGRSZWdpc3RlcmVkIGR1cGxpY2F0ZSBrZXkuGE5vS2V5cwADBKRObyBrZXlzIGFyZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBhY2NvdW50LiROb0FjY291bnQABAQZAUtleSBzZXR0aW5nIGFjY291bnQgaXMgbm90IGxpdmUsIHNvIGl0J3MgaW1wb3NzaWJsZSB0byBhc3NvY2lhdGUga2V5cy4EdEVycm9yIGZvciB0aGUgc2Vzc2lvbiBwYWxsZXQulQkIOHBhbGxldF9ncmFuZHBhLFN0b3JlZFN0YXRlBAROARABEBBMaXZlAAAAMFBlbmRpbmdQYXVzZQgBMHNjaGVkdWxlZF9hdBABBE4AARRkZWxheRABBE4AAQAYUGF1c2VkAAIANFBlbmRpbmdSZXN1bWUIATBzY2hlZHVsZWRfYXQQAQROAAEUZGVsYXkQAQROAAMAAJkJCDhwYWxsZXRfZ3JhbmRwYUxTdG9yZWRQZW5kaW5nQ2hhbmdlCAROARAUTGltaXQAABABMHNjaGVkdWxlZF9hdBABBE4AARRkZWxheRABBE4AAUBuZXh0X2F1dGhvcml0aWVznQkBbEJvdW5kZWRBdXRob3JpdHlMaXN0PExpbWl0PgABGGZvcmNlZD0CASRPcHRpb248Tj4AAJ0JDExib3VuZGVkX2NvbGxlY3Rpb25zQHdlYWtfYm91bmRlZF92ZWM4V2Vha0JvdW5kZWRWZWMIBFQBuARTAAAEALQBGFZlYzxUPgAAoQkMOHBhbGxldF9ncmFuZHBhGHBhbGxldBRFcnJvcgQEVAABHCxQYXVzZUZhaWxlZAAACAUBQXR0ZW1wdCB0byBzaWduYWwgR1JBTkRQQSBwYXVzZSB3aGVuIHRoZSBhdXRob3JpdHkgc2V0IGlzbid0IGxpdmWkKGVpdGhlciBwYXVzZWQgb3IgYWxyZWFkeSBwZW5kaW5nIHBhdXNlKS4wUmVzdW1lRmFpbGVkAAEIEQFBdHRlbXB0IHRvIHNpZ25hbCBHUkFORFBBIHJlc3VtZSB3aGVuIHRoZSBhdXRob3JpdHkgc2V0IGlzbid0IHBhdXNlZKAoZWl0aGVyIGxpdmUgb3IgYWxyZWFkeSBwZW5kaW5nIHJlc3VtZSkuNENoYW5nZVBlbmRpbmcAAgToQXR0ZW1wdCB0byBzaWduYWwgR1JBTkRQQSBjaGFuZ2Ugd2l0aCBvbmUgYWxyZWFkeSBwZW5kaW5nLhxUb29Tb29uAAMEvENhbm5vdCBzaWduYWwgZm9yY2VkIGNoYW5nZSBzbyBzb29uIGFmdGVyIGxhc3QuYEludmFsaWRLZXlPd25lcnNoaXBQcm9vZgAEBDEBQSBrZXkgb3duZXJzaGlwIHByb29mIHByb3ZpZGVkIGFzIHBhcnQgb2YgYW4gZXF1aXZvY2F0aW9uIHJlcG9ydCBpcyBpbnZhbGlkLmBJbnZhbGlkRXF1aXZvY2F0aW9uUHJvb2YABQQxAUFuIGVxdWl2b2NhdGlvbiBwcm9vZiBwcm92aWRlZCBhcyBwYXJ0IG9mIGFuIGVxdWl2b2NhdGlvbiByZXBvcnQgaXMgaW52YWxpZC5YRHVwbGljYXRlT2ZmZW5jZVJlcG9ydAAGBBUBQSBnaXZlbiBlcXVpdm9jYXRpb24gcmVwb3J0IGlzIHZhbGlkIGJ1dCBhbHJlYWR5IHByZXZpb3VzbHkgcmVwb3J0ZWQuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LqUJDExib3VuZGVkX2NvbGxlY3Rpb25zQHdlYWtfYm91bmRlZF92ZWM4V2Vha0JvdW5kZWRWZWMIBFQBAQIEUwAABACpCQEYVmVjPFQ+AACpCQAAAgECAK0JCDxwYWxsZXRfdHJlYXN1cnkgUHJvcG9zYWwIJEFjY291bnRJZAEAHEJhbGFuY2UBGAAQASBwcm9wb3NlcgABJEFjY291bnRJZAABFHZhbHVlGAEcQmFsYW5jZQABLGJlbmVmaWNpYXJ5AAEkQWNjb3VudElkAAEQYm9uZBgBHEJhbGFuY2UAALEJDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBEARTAAAEAMEBARhWZWM8VD4AALUJCDxwYWxsZXRfdHJlYXN1cnksU3BlbmRTdGF0dXMUJEFzc2V0S2luZAHEMEFzc2V0QmFsYW5jZQEYLEJlbmVmaWNpYXJ5AS0BLEJsb2NrTnVtYmVyARAkUGF5bWVudElkATAAGAEoYXNzZXRfa2luZMQBJEFzc2V0S2luZAABGGFtb3VudBgBMEFzc2V0QmFsYW5jZQABLGJlbmVmaWNpYXJ5LQEBLEJlbmVmaWNpYXJ5AAEodmFsaWRfZnJvbRABLEJsb2NrTnVtYmVyAAEkZXhwaXJlX2F0EAEsQmxvY2tOdW1iZXIAARhzdGF0dXO5CQFcUGF5bWVudFN0YXRlPFBheW1lbnRJZD4AALkJCDxwYWxsZXRfdHJlYXN1cnkwUGF5bWVudFN0YXRlBAhJZAEwAQwcUGVuZGluZwAAACRBdHRlbXB0ZWQEAQhpZDABCElkAAEAGEZhaWxlZAACAAC9CQw0c3BfYXJpdGhtZXRpYyhwZXJfdGhpbmdzHFBlcm1pbGwAAAQAEAEMdTMyAADBCQg0ZnJhbWVfc3VwcG9ydCBQYWxsZXRJZAAABAABBgEcW3U4OyA4XQAAxQkMPHBhbGxldF90cmVhc3VyeRhwYWxsZXQURXJyb3IIBFQABEkAASwwSW52YWxpZEluZGV4AAAErE5vIHByb3Bvc2FsLCBib3VudHkgb3Igc3BlbmQgYXQgdGhhdCBpbmRleC5AVG9vTWFueUFwcHJvdmFscwABBIBUb28gbWFueSBhcHByb3ZhbHMgaW4gdGhlIHF1ZXVlLlhJbnN1ZmZpY2llbnRQZXJtaXNzaW9uAAIIRQFUaGUgc3BlbmQgb3JpZ2luIGlzIHZhbGlkIGJ1dCB0aGUgYW1vdW50IGl0IGlzIGFsbG93ZWQgdG8gc3BlbmQgaXMgbG93ZXIgdGhhbiB0aGVMYW1vdW50IHRvIGJlIHNwZW50LkxQcm9wb3NhbE5vdEFwcHJvdmVkAAMEfFByb3Bvc2FsIGhhcyBub3QgYmVlbiBhcHByb3ZlZC5YRmFpbGVkVG9Db252ZXJ0QmFsYW5jZQAEBFEBVGhlIGJhbGFuY2Ugb2YgdGhlIGFzc2V0IGtpbmQgaXMgbm90IGNvbnZlcnRpYmxlIHRvIHRoZSBiYWxhbmNlIG9mIHRoZSBuYXRpdmUgYXNzZXQuMFNwZW5kRXhwaXJlZAAFBLBUaGUgc3BlbmQgaGFzIGV4cGlyZWQgYW5kIGNhbm5vdCBiZSBjbGFpbWVkLixFYXJseVBheW91dAAGBKRUaGUgc3BlbmQgaXMgbm90IHlldCBlbGlnaWJsZSBmb3IgcGF5b3V0LkBBbHJlYWR5QXR0ZW1wdGVkAAcEnFRoZSBwYXltZW50IGhhcyBhbHJlYWR5IGJlZW4gYXR0ZW1wdGVkLixQYXlvdXRFcnJvcgAIBMxUaGVyZSB3YXMgc29tZSBpc3N1ZSB3aXRoIHRoZSBtZWNoYW5pc20gb2YgcGF5bWVudC4wTm90QXR0ZW1wdGVkAAkEpFRoZSBwYXlvdXQgd2FzIG5vdCB5ZXQgYXR0ZW1wdGVkL2NsYWltZWQuMEluY29uY2x1c2l2ZQAKBMRUaGUgcGF5bWVudCBoYXMgbmVpdGhlciBmYWlsZWQgbm9yIHN1Y2NlZWRlZCB5ZXQuBHhFcnJvciBmb3IgdGhlIHRyZWFzdXJ5IHBhbGxldC7JCQAABAgAVQEAzQkMYHBhbGxldF9jb252aWN0aW9uX3ZvdGluZxB2b3RlGFZvdGluZxQcQmFsYW5jZQEYJEFjY291bnRJZAEALEJsb2NrTnVtYmVyARAkUG9sbEluZGV4ARAgTWF4Vm90ZXMAAQgcQ2FzdGluZwQA0QkByENhc3Rpbmc8QmFsYW5jZSwgQmxvY2tOdW1iZXIsIFBvbGxJbmRleCwgTWF4Vm90ZXM+AAAAKERlbGVnYXRpbmcEAOkJAaxEZWxlZ2F0aW5nPEJhbGFuY2UsIEFjY291bnRJZCwgQmxvY2tOdW1iZXI+AAEAANEJDGBwYWxsZXRfY29udmljdGlvbl92b3RpbmcQdm90ZRxDYXN0aW5nEBxCYWxhbmNlARgsQmxvY2tOdW1iZXIBECRQb2xsSW5kZXgBECBNYXhWb3RlcwAADAEUdm90ZXPVCQHcQm91bmRlZFZlYzwoUG9sbEluZGV4LCBBY2NvdW50Vm90ZTxCYWxhbmNlPiksIE1heFZvdGVzPgABLGRlbGVnYXRpb25z4QkBUERlbGVnYXRpb25zPEJhbGFuY2U+AAEUcHJpb3LlCQF8UHJpb3JMb2NrPEJsb2NrTnVtYmVyLCBCYWxhbmNlPgAA1QkMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAHZCQRTAAAEAN0JARhWZWM8VD4AANkJAAAECBBFAgDdCQAAAtkJAOEJDGBwYWxsZXRfY29udmljdGlvbl92b3RpbmcUdHlwZXMsRGVsZWdhdGlvbnMEHEJhbGFuY2UBGAAIARR2b3RlcxgBHEJhbGFuY2UAARxjYXBpdGFsGAEcQmFsYW5jZQAA5QkMYHBhbGxldF9jb252aWN0aW9uX3ZvdGluZxB2b3RlJFByaW9yTG9jawgsQmxvY2tOdW1iZXIBEBxCYWxhbmNlARgACAAQASxCbG9ja051bWJlcgAAGAEcQmFsYW5jZQAA6QkMYHBhbGxldF9jb252aWN0aW9uX3ZvdGluZxB2b3RlKERlbGVnYXRpbmcMHEJhbGFuY2UBGCRBY2NvdW50SWQBACxCbG9ja051bWJlcgEQABQBHGJhbGFuY2UYARxCYWxhbmNlAAEYdGFyZ2V0AAEkQWNjb3VudElkAAEoY29udmljdGlvbk0CAShDb252aWN0aW9uAAEsZGVsZWdhdGlvbnPhCQFQRGVsZWdhdGlvbnM8QmFsYW5jZT4AARRwcmlvcuUJAXxQcmlvckxvY2s8QmxvY2tOdW1iZXIsIEJhbGFuY2U+AADtCQxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAfEJBFMAAAQA9QkBGFZlYzxUPgAA8QkAAAQIVQEYAPUJAAAC8QkA+QkMYHBhbGxldF9jb252aWN0aW9uX3ZvdGluZxhwYWxsZXQURXJyb3IIBFQABEkAATAoTm90T25nb2luZwAABFBQb2xsIGlzIG5vdCBvbmdvaW5nLiBOb3RWb3RlcgABBKxUaGUgZ2l2ZW4gYWNjb3VudCBkaWQgbm90IHZvdGUgb24gdGhlIHBvbGwuME5vUGVybWlzc2lvbgACBMhUaGUgYWN0b3IgaGFzIG5vIHBlcm1pc3Npb24gdG8gY29uZHVjdCB0aGUgYWN0aW9uLjxOb1Blcm1pc3Npb25ZZXQAAwRZAVRoZSBhY3RvciBoYXMgbm8gcGVybWlzc2lvbiB0byBjb25kdWN0IHRoZSBhY3Rpb24gcmlnaHQgbm93IGJ1dCB3aWxsIGRvIGluIHRoZSBmdXR1cmUuREFscmVhZHlEZWxlZ2F0aW5nAAQEiFRoZSBhY2NvdW50IGlzIGFscmVhZHkgZGVsZWdhdGluZy40QWxyZWFkeVZvdGluZwAFCFUBVGhlIGFjY291bnQgY3VycmVudGx5IGhhcyB2b3RlcyBhdHRhY2hlZCB0byBpdCBhbmQgdGhlIG9wZXJhdGlvbiBjYW5ub3Qgc3VjY2VlZCB1bnRpbKB0aGVzZSBhcmUgcmVtb3ZlZCB0aHJvdWdoIGByZW1vdmVfdm90ZWAuREluc3VmZmljaWVudEZ1bmRzAAYE/FRvbyBoaWdoIGEgYmFsYW5jZSB3YXMgcHJvdmlkZWQgdGhhdCB0aGUgYWNjb3VudCBjYW5ub3QgYWZmb3JkLjROb3REZWxlZ2F0aW5nAAcEoFRoZSBhY2NvdW50IGlzIG5vdCBjdXJyZW50bHkgZGVsZWdhdGluZy4gTm9uc2Vuc2UACASURGVsZWdhdGlvbiB0byBvbmVzZWxmIG1ha2VzIG5vIHNlbnNlLjxNYXhWb3Rlc1JlYWNoZWQACQSATWF4aW11bSBudW1iZXIgb2Ygdm90ZXMgcmVhY2hlZC4sQ2xhc3NOZWVkZWQACgQ5AVRoZSBjbGFzcyBtdXN0IGJlIHN1cHBsaWVkIHNpbmNlIGl0IGlzIG5vdCBlYXNpbHkgZGV0ZXJtaW5hYmxlIGZyb20gdGhlIHN0YXRlLiBCYWRDbGFzcwALBIRUaGUgY2xhc3MgSUQgc3VwcGxpZWQgaXMgaW52YWxpZC4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQu/QkMQHBhbGxldF9yZWZlcmVuZGEUdHlwZXM4UmVmZXJlbmR1bUluZm8gHFRyYWNrSWQBVQE0UnVudGltZU9yaWdpbgFZAhhNb21lbnQBEBBDYWxsAVkBHEJhbGFuY2UBGBRUYWxseQFRByRBY2NvdW50SWQBADxTY2hlZHVsZUFkZHJlc3MB9QIBGBxPbmdvaW5nBAABCgGNAVJlZmVyZW5kdW1TdGF0dXM8VHJhY2tJZCwgUnVudGltZU9yaWdpbiwgTW9tZW50LCBDYWxsLCBCYWxhbmNlLCBUYWxseSwKQWNjb3VudElkLCBTY2hlZHVsZUFkZHJlc3MsPgAAACBBcHByb3ZlZAwAEAEYTW9tZW50AAAJCgGMT3B0aW9uPERlcG9zaXQ8QWNjb3VudElkLCBCYWxhbmNlPj4AAAkKAYxPcHRpb248RGVwb3NpdDxBY2NvdW50SWQsIEJhbGFuY2U+PgABACBSZWplY3RlZAwAEAEYTW9tZW50AAAJCgGMT3B0aW9uPERlcG9zaXQ8QWNjb3VudElkLCBCYWxhbmNlPj4AAAkKAYxPcHRpb248RGVwb3NpdDxBY2NvdW50SWQsIEJhbGFuY2U+PgACACRDYW5jZWxsZWQMABABGE1vbWVudAAACQoBjE9wdGlvbjxEZXBvc2l0PEFjY291bnRJZCwgQmFsYW5jZT4+AAAJCgGMT3B0aW9uPERlcG9zaXQ8QWNjb3VudElkLCBCYWxhbmNlPj4AAwAgVGltZWRPdXQMABABGE1vbWVudAAACQoBjE9wdGlvbjxEZXBvc2l0PEFjY291bnRJZCwgQmFsYW5jZT4+AAAJCgGMT3B0aW9uPERlcG9zaXQ8QWNjb3VudElkLCBCYWxhbmNlPj4ABAAYS2lsbGVkBAAQARhNb21lbnQABQAAAQoMQHBhbGxldF9yZWZlcmVuZGEUdHlwZXNAUmVmZXJlbmR1bVN0YXR1cyAcVHJhY2tJZAFVATRSdW50aW1lT3JpZ2luAVkCGE1vbWVudAEQEENhbGwBWQEcQmFsYW5jZQEYFFRhbGx5AVEHJEFjY291bnRJZAEAPFNjaGVkdWxlQWRkcmVzcwH1AgAsARR0cmFja1UBARxUcmFja0lkAAEYb3JpZ2luWQIBNFJ1bnRpbWVPcmlnaW4AASBwcm9wb3NhbFkBARBDYWxsAAEkZW5hY3RtZW50dQIBUERpc3BhdGNoVGltZTxNb21lbnQ+AAEkc3VibWl0dGVkEAEYTW9tZW50AAFIc3VibWlzc2lvbl9kZXBvc2l0BQoBbERlcG9zaXQ8QWNjb3VudElkLCBCYWxhbmNlPgABQGRlY2lzaW9uX2RlcG9zaXQJCgGMT3B0aW9uPERlcG9zaXQ8QWNjb3VudElkLCBCYWxhbmNlPj4AASBkZWNpZGluZw0KAXhPcHRpb248RGVjaWRpbmdTdGF0dXM8TW9tZW50Pj4AARR0YWxseVEHARRUYWxseQABIGluX3F1ZXVlIAEQYm9vbAABFGFsYXJtFQoBhE9wdGlvbjwoTW9tZW50LCBTY2hlZHVsZUFkZHJlc3MpPgAABQoMQHBhbGxldF9yZWZlcmVuZGEUdHlwZXMcRGVwb3NpdAgkQWNjb3VudElkAQAcQmFsYW5jZQEYAAgBDHdobwABJEFjY291bnRJZAABGGFtb3VudBgBHEJhbGFuY2UAAAkKBBhPcHRpb24EBFQBBQoBCBBOb25lAAAAEFNvbWUEAAUKAAABAAANCgQYT3B0aW9uBARUAREKAQgQTm9uZQAAABBTb21lBAARCgAAAQAAEQoMQHBhbGxldF9yZWZlcmVuZGEUdHlwZXM4RGVjaWRpbmdTdGF0dXMELEJsb2NrTnVtYmVyARAACAEUc2luY2UQASxCbG9ja051bWJlcgABKGNvbmZpcm1pbmc9AgFMT3B0aW9uPEJsb2NrTnVtYmVyPgAAFQoEGE9wdGlvbgQEVAEZCgEIEE5vbmUAAAAQU29tZQQAGQoAAAEAABkKAAAECBD1AgAdCgxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUASEKBFMAAAQAJQoBGFZlYzxUPgAAIQoAAAQIEBgAJQoAAAIhCgApCgAAAi0KAC0KAAAECFUBMQoAMQoMQHBhbGxldF9yZWZlcmVuZGEUdHlwZXMkVHJhY2tJbmZvCBxCYWxhbmNlARgYTW9tZW50ARAAJAEQbmFtZUkIATAmJ3N0YXRpYyBzdHIAATBtYXhfZGVjaWRpbmcQAQx1MzIAAUBkZWNpc2lvbl9kZXBvc2l0GAEcQmFsYW5jZQABOHByZXBhcmVfcGVyaW9kEAEYTW9tZW50AAE8ZGVjaXNpb25fcGVyaW9kEAEYTW9tZW50AAE4Y29uZmlybV9wZXJpb2QQARhNb21lbnQAAVBtaW5fZW5hY3RtZW50X3BlcmlvZBABGE1vbWVudAABMG1pbl9hcHByb3ZhbDUKARRDdXJ2ZQABLG1pbl9zdXBwb3J0NQoBFEN1cnZlAAA1CgxAcGFsbGV0X3JlZmVyZW5kYRR0eXBlcxRDdXJ2ZQABDEBMaW5lYXJEZWNyZWFzaW5nDAEYbGVuZ3RolAEcUGVyYmlsbAABFGZsb29ylAEcUGVyYmlsbAABEGNlaWyUARxQZXJiaWxsAAAARFN0ZXBwZWREZWNyZWFzaW5nEAEUYmVnaW6UARxQZXJiaWxsAAEMZW5klAEcUGVyYmlsbAABEHN0ZXCUARxQZXJiaWxsAAEYcGVyaW9klAEcUGVyYmlsbAABAChSZWNpcHJvY2FsDAEYZmFjdG9yOQoBIEZpeGVkSTY0AAEgeF9vZmZzZXQ5CgEgRml4ZWRJNjQAASB5X29mZnNldDkKASBGaXhlZEk2NAACAAA5Cgw0c3BfYXJpdGhtZXRpYyxmaXhlZF9wb2ludCBGaXhlZEk2NAAABAA9CgEMaTY0AAA9CgAABQwAQQoMQHBhbGxldF9yZWZlcmVuZGEYcGFsbGV0FEVycm9yCARUAARJAAE4KE5vdE9uZ29pbmcAAARoUmVmZXJlbmR1bSBpcyBub3Qgb25nb2luZy4oSGFzRGVwb3NpdAABBLhSZWZlcmVuZHVtJ3MgZGVjaXNpb24gZGVwb3NpdCBpcyBhbHJlYWR5IHBhaWQuIEJhZFRyYWNrAAIEnFRoZSB0cmFjayBpZGVudGlmaWVyIGdpdmVuIHdhcyBpbnZhbGlkLhBGdWxsAAMEMQFUaGVyZSBhcmUgYWxyZWFkeSBhIGZ1bGwgY29tcGxlbWVudCBvZiByZWZlcmVuZGEgaW4gcHJvZ3Jlc3MgZm9yIHRoaXMgdHJhY2suKFF1ZXVlRW1wdHkABASAVGhlIHF1ZXVlIG9mIHRoZSB0cmFjayBpcyBlbXB0eS40QmFkUmVmZXJlbmR1bQAFBORUaGUgcmVmZXJlbmR1bSBpbmRleCBwcm92aWRlZCBpcyBpbnZhbGlkIGluIHRoaXMgY29udGV4dC4sTm90aGluZ1RvRG8ABgSsVGhlcmUgd2FzIG5vdGhpbmcgdG8gZG8gaW4gdGhlIGFkdmFuY2VtZW50LhxOb1RyYWNrAAcEoE5vIHRyYWNrIGV4aXN0cyBmb3IgdGhlIHByb3Bvc2FsIG9yaWdpbi4oVW5maW5pc2hlZAAIBAEBQW55IGRlcG9zaXQgY2Fubm90IGJlIHJlZnVuZGVkIHVudGlsIGFmdGVyIHRoZSBkZWNpc2lvbiBpcyBvdmVyLjBOb1Blcm1pc3Npb24ACQSoVGhlIGRlcG9zaXQgcmVmdW5kZXIgaXMgbm90IHRoZSBkZXBvc2l0b3IuJE5vRGVwb3NpdAAKBMxUaGUgZGVwb3NpdCBjYW5ub3QgYmUgcmVmdW5kZWQgc2luY2Ugbm9uZSB3YXMgbWFkZS4kQmFkU3RhdHVzAAsE0FRoZSByZWZlcmVuZHVtIHN0YXR1cyBpcyBpbnZhbGlkIGZvciB0aGlzIG9wZXJhdGlvbi5AUHJlaW1hZ2VOb3RFeGlzdAAMBHBUaGUgcHJlaW1hZ2UgZG9lcyBub3QgZXhpc3QuhFByZWltYWdlU3RvcmVkV2l0aERpZmZlcmVudExlbmd0aAANBBUBVGhlIHByZWltYWdlIGlzIHN0b3JlZCB3aXRoIGEgZGlmZmVyZW50IGxlbmd0aCB0aGFuIHRoZSBvbmUgcHJvdmlkZWQuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LkUKCGBwYWxsZXRfcmFua2VkX2NvbGxlY3RpdmUwTWVtYmVyUmVjb3JkAAAEARByYW5rVQEBEFJhbmsAAEkKAAAECFUBAABNCgAABAhVARAAUQoMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAEIBFMAAAQAOAEYVmVjPFQ+AABVCgxgcGFsbGV0X3JhbmtlZF9jb2xsZWN0aXZlGHBhbGxldBRFcnJvcggEVAAESQABLDRBbHJlYWR5TWVtYmVyAAAEcEFjY291bnQgaXMgYWxyZWFkeSBhIG1lbWJlci4kTm90TWVtYmVyAAEEYEFjY291bnQgaXMgbm90IGEgbWVtYmVyLihOb3RQb2xsaW5nAAIEuFRoZSBnaXZlbiBwb2xsIGluZGV4IGlzIHVua25vd24gb3IgaGFzIGNsb3NlZC4cT25nb2luZwADBIBUaGUgZ2l2ZW4gcG9sbCBpcyBzdGlsbCBvbmdvaW5nLjROb25lUmVtYWluaW5nAAQErFRoZXJlIGFyZSBubyBmdXJ0aGVyIHJlY29yZHMgdG8gYmUgcmVtb3ZlZC4oQ29ycnVwdGlvbgAFBGhVbmV4cGVjdGVkIGVycm9yIGluIHN0YXRlLihSYW5rVG9vTG93AAYElFRoZSBtZW1iZXIncyByYW5rIGlzIHRvbyBsb3cgdG8gdm90ZS44SW52YWxpZFdpdG5lc3MABwSYVGhlIGluZm9ybWF0aW9uIHByb3ZpZGVkIGlzIGluY29ycmVjdC4wTm9QZXJtaXNzaW9uAAgE+FRoZSBvcmlnaW4gaXMgbm90IHN1ZmZpY2llbnRseSBwcml2aWxlZ2VkIHRvIGRvIHRoZSBvcGVyYXRpb24uKFNhbWVNZW1iZXIACQTgVGhlIG5ldyBtZW1iZXIgdG8gZXhjaGFuZ2UgaXMgdGhlIHNhbWUgYXMgdGhlIG9sZCBtZW1iZXI4VG9vTWFueU1lbWJlcnMACgTMVGhlIG1heCBtZW1iZXIgY291bnQgZm9yIHRoZSByYW5rIGhhcyBiZWVuIHJlYWNoZWQuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LlkKDEBwYWxsZXRfcmVmZXJlbmRhFHR5cGVzOFJlZmVyZW5kdW1JbmZvIBxUcmFja0lkAVUBNFJ1bnRpbWVPcmlnaW4BWQIYTW9tZW50ARAQQ2FsbAFZARxCYWxhbmNlARgUVGFsbHkBXQckQWNjb3VudElkAQA8U2NoZWR1bGVBZGRyZXNzAfUCARgcT25nb2luZwQAXQoBjQFSZWZlcmVuZHVtU3RhdHVzPFRyYWNrSWQsIFJ1bnRpbWVPcmlnaW4sIE1vbWVudCwgQ2FsbCwgQmFsYW5jZSwgVGFsbHksCkFjY291bnRJZCwgU2NoZWR1bGVBZGRyZXNzLD4AAAAgQXBwcm92ZWQMABABGE1vbWVudAAACQoBjE9wdGlvbjxEZXBvc2l0PEFjY291bnRJZCwgQmFsYW5jZT4+AAAJCgGMT3B0aW9uPERlcG9zaXQ8QWNjb3VudElkLCBCYWxhbmNlPj4AAQAgUmVqZWN0ZWQMABABGE1vbWVudAAACQoBjE9wdGlvbjxEZXBvc2l0PEFjY291bnRJZCwgQmFsYW5jZT4+AAAJCgGMT3B0aW9uPERlcG9zaXQ8QWNjb3VudElkLCBCYWxhbmNlPj4AAgAkQ2FuY2VsbGVkDAAQARhNb21lbnQAAAkKAYxPcHRpb248RGVwb3NpdDxBY2NvdW50SWQsIEJhbGFuY2U+PgAACQoBjE9wdGlvbjxEZXBvc2l0PEFjY291bnRJZCwgQmFsYW5jZT4+AAMAIFRpbWVkT3V0DAAQARhNb21lbnQAAAkKAYxPcHRpb248RGVwb3NpdDxBY2NvdW50SWQsIEJhbGFuY2U+PgAACQoBjE9wdGlvbjxEZXBvc2l0PEFjY291bnRJZCwgQmFsYW5jZT4+AAQAGEtpbGxlZAQAEAEYTW9tZW50AAUAAF0KDEBwYWxsZXRfcmVmZXJlbmRhFHR5cGVzQFJlZmVyZW5kdW1TdGF0dXMgHFRyYWNrSWQBVQE0UnVudGltZU9yaWdpbgFZAhhNb21lbnQBEBBDYWxsAVkBHEJhbGFuY2UBGBRUYWxseQFdByRBY2NvdW50SWQBADxTY2hlZHVsZUFkZHJlc3MB9QIALAEUdHJhY2tVAQEcVHJhY2tJZAABGG9yaWdpblkCATRSdW50aW1lT3JpZ2luAAEgcHJvcG9zYWxZAQEQQ2FsbAABJGVuYWN0bWVudHUCAVBEaXNwYXRjaFRpbWU8TW9tZW50PgABJHN1Ym1pdHRlZBABGE1vbWVudAABSHN1Ym1pc3Npb25fZGVwb3NpdAUKAWxEZXBvc2l0PEFjY291bnRJZCwgQmFsYW5jZT4AAUBkZWNpc2lvbl9kZXBvc2l0CQoBjE9wdGlvbjxEZXBvc2l0PEFjY291bnRJZCwgQmFsYW5jZT4+AAEgZGVjaWRpbmcNCgF4T3B0aW9uPERlY2lkaW5nU3RhdHVzPE1vbWVudD4+AAEUdGFsbHldBwEUVGFsbHkAASBpbl9xdWV1ZSABEGJvb2wAARRhbGFybRUKAYRPcHRpb248KE1vbWVudCwgU2NoZWR1bGVBZGRyZXNzKT4AAGEKDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQB9QIEUwAABABBCAEYVmVjPFQ+AABlCgxAcGFsbGV0X3JlZmVyZW5kYRhwYWxsZXQURXJyb3IIBFQABEkAATgoTm90T25nb2luZwAABGhSZWZlcmVuZHVtIGlzIG5vdCBvbmdvaW5nLihIYXNEZXBvc2l0AAEEuFJlZmVyZW5kdW0ncyBkZWNpc2lvbiBkZXBvc2l0IGlzIGFscmVhZHkgcGFpZC4gQmFkVHJhY2sAAgScVGhlIHRyYWNrIGlkZW50aWZpZXIgZ2l2ZW4gd2FzIGludmFsaWQuEEZ1bGwAAwQxAVRoZXJlIGFyZSBhbHJlYWR5IGEgZnVsbCBjb21wbGVtZW50IG9mIHJlZmVyZW5kYSBpbiBwcm9ncmVzcyBmb3IgdGhpcyB0cmFjay4oUXVldWVFbXB0eQAEBIBUaGUgcXVldWUgb2YgdGhlIHRyYWNrIGlzIGVtcHR5LjRCYWRSZWZlcmVuZHVtAAUE5FRoZSByZWZlcmVuZHVtIGluZGV4IHByb3ZpZGVkIGlzIGludmFsaWQgaW4gdGhpcyBjb250ZXh0LixOb3RoaW5nVG9EbwAGBKxUaGVyZSB3YXMgbm90aGluZyB0byBkbyBpbiB0aGUgYWR2YW5jZW1lbnQuHE5vVHJhY2sABwSgTm8gdHJhY2sgZXhpc3RzIGZvciB0aGUgcHJvcG9zYWwgb3JpZ2luLihVbmZpbmlzaGVkAAgEAQFBbnkgZGVwb3NpdCBjYW5ub3QgYmUgcmVmdW5kZWQgdW50aWwgYWZ0ZXIgdGhlIGRlY2lzaW9uIGlzIG92ZXIuME5vUGVybWlzc2lvbgAJBKhUaGUgZGVwb3NpdCByZWZ1bmRlciBpcyBub3QgdGhlIGRlcG9zaXRvci4kTm9EZXBvc2l0AAoEzFRoZSBkZXBvc2l0IGNhbm5vdCBiZSByZWZ1bmRlZCBzaW5jZSBub25lIHdhcyBtYWRlLiRCYWRTdGF0dXMACwTQVGhlIHJlZmVyZW5kdW0gc3RhdHVzIGlzIGludmFsaWQgZm9yIHRoaXMgb3BlcmF0aW9uLkBQcmVpbWFnZU5vdEV4aXN0AAwEcFRoZSBwcmVpbWFnZSBkb2VzIG5vdCBleGlzdC6EUHJlaW1hZ2VTdG9yZWRXaXRoRGlmZmVyZW50TGVuZ3RoAA0EFQFUaGUgcHJlaW1hZ2UgaXMgc3RvcmVkIHdpdGggYSBkaWZmZXJlbnQgbGVuZ3RoIHRoYW4gdGhlIG9uZSBwcm92aWRlZC4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQuaQoMQHBhbGxldF93aGl0ZWxpc3QYcGFsbGV0FEVycm9yBARUAAEUTFVuYXZhaWxhYmxlUHJlSW1hZ2UAAATIVGhlIHByZWltYWdlIG9mIHRoZSBjYWxsIGhhc2ggY291bGQgbm90IGJlIGxvYWRlZC48VW5kZWNvZGFibGVDYWxsAAEEeFRoZSBjYWxsIGNvdWxkIG5vdCBiZSBkZWNvZGVkLmBJbnZhbGlkQ2FsbFdlaWdodFdpdG5lc3MAAgTsVGhlIHdlaWdodCBvZiB0aGUgZGVjb2RlZCBjYWxsIHdhcyBoaWdoZXIgdGhhbiB0aGUgd2l0bmVzcy5QQ2FsbElzTm90V2hpdGVsaXN0ZWQAAwR0VGhlIGNhbGwgd2FzIG5vdCB3aGl0ZWxpc3RlZC5YQ2FsbEFscmVhZHlXaGl0ZWxpc3RlZAAEBKBUaGUgY2FsbCB3YXMgYWxyZWFkeSB3aGl0ZWxpc3RlZDsgTm8tT3AuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0Lm0KEFxwb2xrYWRvdF9ydW50aW1lX2NvbW1vbhhjbGFpbXMYcGFsbGV0FEVycm9yBARUAAEYYEludmFsaWRFdGhlcmV1bVNpZ25hdHVyZQAABGxJbnZhbGlkIEV0aGVyZXVtIHNpZ25hdHVyZS5AU2lnbmVySGFzTm9DbGFpbQABBHhFdGhlcmV1bSBhZGRyZXNzIGhhcyBubyBjbGFpbS5AU2VuZGVySGFzTm9DbGFpbQACBLBBY2NvdW50IElEIHNlbmRpbmcgdHJhbnNhY3Rpb24gaGFzIG5vIGNsYWltLjBQb3RVbmRlcmZsb3cAAwhJAVRoZXJlJ3Mgbm90IGVub3VnaCBpbiB0aGUgcG90IHRvIHBheSBvdXQgc29tZSB1bnZlc3RlZCBhbW91bnQuIEdlbmVyYWxseSBpbXBsaWVzIGEwbG9naWMgZXJyb3IuQEludmFsaWRTdGF0ZW1lbnQABASQQSBuZWVkZWQgc3RhdGVtZW50IHdhcyBub3QgaW5jbHVkZWQuTFZlc3RlZEJhbGFuY2VFeGlzdHMABQSkVGhlIGFjY291bnQgYWxyZWFkeSBoYXMgYSB2ZXN0ZWQgYmFsYW5jZS4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQucQoMOHBhbGxldF91dGlsaXR5GHBhbGxldBRFcnJvcgQEVAABBDBUb29NYW55Q2FsbHMAAARcVG9vIG1hbnkgY2FsbHMgYmF0Y2hlZC4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQudQoIOHBhbGxldF9zb2NpZXR5ME1lbWJlclJlY29yZAAAEAEQcmFuaxABEFJhbmsAARxzdHJpa2VzEAEsU3RyaWtlQ291bnQAASB2b3VjaGluZ3kKAVhPcHRpb248Vm91Y2hpbmdTdGF0dXM+AAEUaW5kZXgQAQx1MzIAAHkKBBhPcHRpb24EBFQBfQoBCBBOb25lAAAAEFNvbWUEAH0KAAABAAB9Cgg4cGFsbGV0X3NvY2lldHk4Vm91Y2hpbmdTdGF0dXMAAQggVm91Y2hpbmcAAAAYQmFubmVkAAEAAIEKCDhwYWxsZXRfc29jaWV0eTBQYXlvdXRSZWNvcmQIHEJhbGFuY2UBGChQYXlvdXRzVmVjAYUKAAgBEHBhaWQYARxCYWxhbmNlAAEccGF5b3V0c4UKAShQYXlvdXRzVmVjAACFCgxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUASEKBFMAAAQAJQoBGFZlYzxUPgAAiQoMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAGNCgRTAAAEAJUKARhWZWM8VD4AAI0KCDhwYWxsZXRfc29jaWV0eQxCaWQIJEFjY291bnRJZAEAHEJhbGFuY2UBGAAMAQx3aG8AASRBY2NvdW50SWQAARBraW5kkQoBbEJpZEtpbmQ8QWNjb3VudElkLCBCYWxhbmNlPgABFHZhbHVlGAEcQmFsYW5jZQAAkQoIOHBhbGxldF9zb2NpZXR5HEJpZEtpbmQIJEFjY291bnRJZAEAHEJhbGFuY2UBGAEIHERlcG9zaXQEABgBHEJhbGFuY2UAAAAUVm91Y2gIAAABJEFjY291bnRJZAAAGAEcQmFsYW5jZQABAACVCgAAAo0KAJkKCDhwYWxsZXRfc29jaWV0eSRDYW5kaWRhY3kIJEFjY291bnRJZAEAHEJhbGFuY2UBGAAUARRyb3VuZBABKFJvdW5kSW5kZXgAARBraW5kkQoBbEJpZEtpbmQ8QWNjb3VudElkLCBCYWxhbmNlPgABDGJpZBgBHEJhbGFuY2UAARR0YWxseZ0KARRUYWxseQABOHNrZXB0aWNfc3RydWNrIAEQYm9vbAAAnQoIOHBhbGxldF9zb2NpZXR5FFRhbGx5AAAIASRhcHByb3ZhbHMQASRWb3RlQ291bnQAAShyZWplY3Rpb25zEAEkVm90ZUNvdW50AAChCgAABAgAAAClCgg4cGFsbGV0X3NvY2lldHkQVm90ZQAACAEcYXBwcm92ZSABEGJvb2wAARh3ZWlnaHQQAQx1MzIAAKkKDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBCARTAAAEADgBGFZlYzxUPgAArQoIOHBhbGxldF9zb2NpZXR5MEludGFrZVJlY29yZAgkQWNjb3VudElkAQAcQmFsYW5jZQEYAAwBDHdobwABJEFjY291bnRJZAABDGJpZBgBHEJhbGFuY2UAARRyb3VuZBABKFJvdW5kSW5kZXgAALEKAAAEDAAAnQoAtQoMOHBhbGxldF9zb2NpZXR5GHBhbGxldBRFcnJvcggEVAAESQABgCROb3RNZW1iZXIAAARUVXNlciBpcyBub3QgYSBtZW1iZXIuNEFscmVhZHlNZW1iZXIAAQRkVXNlciBpcyBhbHJlYWR5IGEgbWVtYmVyLiRTdXNwZW5kZWQAAgRIVXNlciBpcyBzdXNwZW5kZWQuME5vdFN1c3BlbmRlZAADBFhVc2VyIGlzIG5vdCBzdXNwZW5kZWQuIE5vUGF5b3V0AAQESE5vdGhpbmcgdG8gcGF5b3V0LjhBbHJlYWR5Rm91bmRlZAAFBGBTb2NpZXR5IGFscmVhZHkgZm91bmRlZC48SW5zdWZmaWNpZW50UG90AAYEmE5vdCBlbm91Z2ggaW4gcG90IHRvIGFjY2VwdCBjYW5kaWRhdGUuPEFscmVhZHlWb3VjaGluZwAHBORNZW1iZXIgaXMgYWxyZWFkeSB2b3VjaGluZyBvciBiYW5uZWQgZnJvbSB2b3VjaGluZyBhZ2Fpbi5MTm90Vm91Y2hpbmdPbkJpZGRlcgAIBFxNZW1iZXIgaXMgbm90IHZvdWNoaW5nLhBIZWFkAAkEkENhbm5vdCByZW1vdmUgdGhlIGhlYWQgb2YgdGhlIGNoYWluLhxGb3VuZGVyAAoEaENhbm5vdCByZW1vdmUgdGhlIGZvdW5kZXIuKEFscmVhZHlCaWQACwRwVXNlciBoYXMgYWxyZWFkeSBtYWRlIGEgYmlkLkBBbHJlYWR5Q2FuZGlkYXRlAAwEcFVzZXIgaXMgYWxyZWFkeSBhIGNhbmRpZGF0ZS4wTm90Q2FuZGlkYXRlAA0EYFVzZXIgaXMgbm90IGEgY2FuZGlkYXRlLihNYXhNZW1iZXJzAA4EgFRvbyBtYW55IG1lbWJlcnMgaW4gdGhlIHNvY2lldHkuKE5vdEZvdW5kZXIADwR4VGhlIGNhbGxlciBpcyBub3QgdGhlIGZvdW5kZXIuHE5vdEhlYWQAEARsVGhlIGNhbGxlciBpcyBub3QgdGhlIGhlYWQuLE5vdEFwcHJvdmVkABEELQFUaGUgbWVtYmVyc2hpcCBjYW5ub3QgYmUgY2xhaW1lZCBhcyB0aGUgY2FuZGlkYXRlIHdhcyBub3QgY2xlYXJseSBhcHByb3ZlZC4sTm90UmVqZWN0ZWQAEgQlAVRoZSBjYW5kaWRhdGUgY2Fubm90IGJlIGtpY2tlZCBhcyB0aGUgY2FuZGlkYXRlIHdhcyBub3QgY2xlYXJseSByZWplY3RlZC4gQXBwcm92ZWQAEwQZAVRoZSBjYW5kaWRhY3kgY2Fubm90IGJlIGRyb3BwZWQgYXMgdGhlIGNhbmRpZGF0ZSB3YXMgY2xlYXJseSBhcHByb3ZlZC4gUmVqZWN0ZWQAFAQdAVRoZSBjYW5kaWRhY3kgY2Fubm90IGJlIGJlc3Rvd2VkIGFzIHRoZSBjYW5kaWRhdGUgd2FzIGNsZWFybHkgcmVqZWN0ZWQuKEluUHJvZ3Jlc3MAFQQVAVRoZSBjYW5kaWRhY3kgY2Fubm90IGJlIGNvbmNsdWRlZCBhcyB0aGUgdm90aW5nIGlzIHN0aWxsIGluIHByb2dyZXNzLiBUb29FYXJseQAWBEEBVGhlIGNhbmRpZGFjeSBjYW5ub3QgYmUgcHJ1bmVkIHVudGlsIGEgZnVsbCBhZGRpdGlvbmFsIGludGFrZSBwZXJpb2QgaGFzIHBhc3NlZC4UVm90ZWQAFwRoVGhlIHNrZXB0aWMgYWxyZWFkeSB2b3RlZC4cRXhwaXJlZAAYBPBUaGUgc2tlcHRpYyBuZWVkIG5vdCB2b3RlIG9uIGNhbmRpZGF0ZXMgZnJvbSBleHBpcmVkIHJvdW5kcy4kTm90QmlkZGVyABkEVFVzZXIgaXMgbm90IGEgYmlkZGVyLihOb0RlZmVuZGVyABoEfFRoZXJlIGlzIG5vIGRlZmVuZGVyIGN1cnJlbnRseS4gTm90R3JvdXAAGwRQR3JvdXAgZG9lc24ndCBleGlzdC48QWxyZWFkeUVsZXZhdGVkABwEsFRoZSBtZW1iZXIgaXMgYWxyZWFkeSBlbGV2YXRlZCB0byB0aGlzIHJhbmsuPEFscmVhZHlQdW5pc2hlZAAdBNxUaGUgc2tlcHRpYyBoYXMgYWxyZWFkeSBiZWVuIHB1bmlzaGVkIGZvciB0aGlzIG9mZmVuY2UuREluc3VmZmljaWVudEZ1bmRzAB4EwEZ1bmRzIGFyZSBpbnN1ZmZpY2llbnQgdG8gcGF5IG9mZiBzb2NpZXR5IGRlYnRzLhxOb1ZvdGVzAB8E0FRoZSBjYW5kaWRhdGUvZGVmZW5kZXIgaGFzIG5vIHN0YWxlIHZvdGVzIHRvIHJlbW92ZS4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQuuQoIPHBhbGxldF9yZWNvdmVyeThSZWNvdmVyeUNvbmZpZwwsQmxvY2tOdW1iZXIBEBxCYWxhbmNlARgcRnJpZW5kcwG9CgAQATBkZWxheV9wZXJpb2QQASxCbG9ja051bWJlcgABHGRlcG9zaXQYARxCYWxhbmNlAAEcZnJpZW5kc70KARxGcmllbmRzAAEkdGhyZXNob2xkVQEBDHUxNgAAvQoMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAEABFMAAAQArQEBGFZlYzxUPgAAwQoIPHBhbGxldF9yZWNvdmVyeThBY3RpdmVSZWNvdmVyeQwsQmxvY2tOdW1iZXIBEBxCYWxhbmNlARgcRnJpZW5kcwG9CgAMARxjcmVhdGVkEAEsQmxvY2tOdW1iZXIAARxkZXBvc2l0GAEcQmFsYW5jZQABHGZyaWVuZHO9CgEcRnJpZW5kcwAAxQoMPHBhbGxldF9yZWNvdmVyeRhwYWxsZXQURXJyb3IEBFQAAUAoTm90QWxsb3dlZAAABPBVc2VyIGlzIG5vdCBhbGxvd2VkIHRvIG1ha2UgYSBjYWxsIG9uIGJlaGFsZiBvZiB0aGlzIGFjY291bnQ0WmVyb1RocmVzaG9sZAABBIxUaHJlc2hvbGQgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVyb0BOb3RFbm91Z2hGcmllbmRzAAIE0EZyaWVuZHMgbGlzdCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvIGFuZCB0aHJlc2hvbGQoTWF4RnJpZW5kcwADBKhGcmllbmRzIGxpc3QgbXVzdCBiZSBsZXNzIHRoYW4gbWF4IGZyaWVuZHMkTm90U29ydGVkAAQEyEZyaWVuZHMgbGlzdCBtdXN0IGJlIHNvcnRlZCBhbmQgZnJlZSBvZiBkdXBsaWNhdGVzOE5vdFJlY292ZXJhYmxlAAUEnFRoaXMgYWNjb3VudCBpcyBub3Qgc2V0IHVwIGZvciByZWNvdmVyeUhBbHJlYWR5UmVjb3ZlcmFibGUABgSsVGhpcyBhY2NvdW50IGlzIGFscmVhZHkgc2V0IHVwIGZvciByZWNvdmVyeThBbHJlYWR5U3RhcnRlZAAHBNxBIHJlY292ZXJ5IHByb2Nlc3MgaGFzIGFscmVhZHkgc3RhcnRlZCBmb3IgdGhpcyBhY2NvdW50KE5vdFN0YXJ0ZWQACATMQSByZWNvdmVyeSBwcm9jZXNzIGhhcyBub3Qgc3RhcnRlZCBmb3IgdGhpcyByZXNjdWVyJE5vdEZyaWVuZAAJBKhUaGlzIGFjY291bnQgaXMgbm90IGEgZnJpZW5kIHdobyBjYW4gdm91Y2gsRGVsYXlQZXJpb2QACgQZAVRoZSBmcmllbmQgbXVzdCB3YWl0IHVudGlsIHRoZSBkZWxheSBwZXJpb2QgdG8gdm91Y2ggZm9yIHRoaXMgcmVjb3Zlcnk4QWxyZWFkeVZvdWNoZWQACwS8VGhpcyB1c2VyIGhhcyBhbHJlYWR5IHZvdWNoZWQgZm9yIHRoaXMgcmVjb3ZlcnkkVGhyZXNob2xkAAwE6FRoZSB0aHJlc2hvbGQgZm9yIHJlY292ZXJpbmcgdGhpcyBhY2NvdW50IGhhcyBub3QgYmVlbiBtZXQsU3RpbGxBY3RpdmUADQT8VGhlcmUgYXJlIHN0aWxsIGFjdGl2ZSByZWNvdmVyeSBhdHRlbXB0cyB0aGF0IG5lZWQgdG8gYmUgY2xvc2VkMEFscmVhZHlQcm94eQAOBKxUaGlzIGFjY291bnQgaXMgYWxyZWFkeSBzZXQgdXAgZm9yIHJlY292ZXJ5IEJhZFN0YXRlAA8EeFNvbWUgaW50ZXJuYWwgc3RhdGUgaXMgYnJva2VuLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC7JCgxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAekCBFMAAAQAzQoBGFZlYzxUPgAAzQoAAALpAgDRCgg4cGFsbGV0X3Zlc3RpbmcgUmVsZWFzZXMAAQgIVjAAAAAIVjEAAQAA1QoMOHBhbGxldF92ZXN0aW5nGHBhbGxldBRFcnJvcgQEVAABFChOb3RWZXN0aW5nAAAEhFRoZSBhY2NvdW50IGdpdmVuIGlzIG5vdCB2ZXN0aW5nLlRBdE1heFZlc3RpbmdTY2hlZHVsZXMAAQglAVRoZSBhY2NvdW50IGFscmVhZHkgaGFzIGBNYXhWZXN0aW5nU2NoZWR1bGVzYCBjb3VudCBvZiBzY2hlZHVsZXMgYW5kIHRodXNRAWNhbm5vdCBhZGQgYW5vdGhlciBvbmUuIENvbnNpZGVyIG1lcmdpbmcgZXhpc3Rpbmcgc2NoZWR1bGVzIGluIG9yZGVyIHRvIGFkZCBhbm90aGVyLiRBbW91bnRMb3cAAgQFAUFtb3VudCBiZWluZyB0cmFuc2ZlcnJlZCBpcyB0b28gbG93IHRvIGNyZWF0ZSBhIHZlc3Rpbmcgc2NoZWR1bGUuYFNjaGVkdWxlSW5kZXhPdXRPZkJvdW5kcwADBNBBbiBpbmRleCB3YXMgb3V0IG9mIGJvdW5kcyBvZiB0aGUgdmVzdGluZyBzY2hlZHVsZXMuVEludmFsaWRTY2hlZHVsZVBhcmFtcwAEBA0BRmFpbGVkIHRvIGNyZWF0ZSBhIG5ldyBzY2hlZHVsZSBiZWNhdXNlIHNvbWUgcGFyYW1ldGVyIHdhcyBpbnZhbGlkLgR0RXJyb3IgZm9yIHRoZSB2ZXN0aW5nIHBhbGxldC7ZCgxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAd0KBFMAAAQA5QoBGFZlYzxUPgAA3QoEGE9wdGlvbgQEVAHhCgEIEE5vbmUAAAAQU29tZQQA4QoAAAEAAOEKCEBwYWxsZXRfc2NoZWR1bGVyJFNjaGVkdWxlZBQQTmFtZQEEEENhbGwBWQEsQmxvY2tOdW1iZXIBEDRQYWxsZXRzT3JpZ2luAVkCJEFjY291bnRJZAEAABQBIG1heWJlX2lksQcBME9wdGlvbjxOYW1lPgABIHByaW9yaXR5CAFIc2NoZWR1bGU6OlByaW9yaXR5AAEQY2FsbFkBARBDYWxsAAE4bWF5YmVfcGVyaW9kaWPxAgGUT3B0aW9uPHNjaGVkdWxlOjpQZXJpb2Q8QmxvY2tOdW1iZXI+PgABGG9yaWdpblkCATRQYWxsZXRzT3JpZ2luAADlCgAAAt0KAOkKCEBwYWxsZXRfc2NoZWR1bGVyLFJldHJ5Q29uZmlnBBhQZXJpb2QBEAAMATR0b3RhbF9yZXRyaWVzCAEIdTgAASRyZW1haW5pbmcIAQh1OAABGHBlcmlvZBABGFBlcmlvZAAA7QoMQHBhbGxldF9zY2hlZHVsZXIYcGFsbGV0FEVycm9yBARUAAEUQEZhaWxlZFRvU2NoZWR1bGUAAARkRmFpbGVkIHRvIHNjaGVkdWxlIGEgY2FsbCBOb3RGb3VuZAABBHxDYW5ub3QgZmluZCB0aGUgc2NoZWR1bGVkIGNhbGwuXFRhcmdldEJsb2NrTnVtYmVySW5QYXN0AAIEpEdpdmVuIHRhcmdldCBibG9jayBudW1iZXIgaXMgaW4gdGhlIHBhc3QuSFJlc2NoZWR1bGVOb0NoYW5nZQADBPBSZXNjaGVkdWxlIGZhaWxlZCBiZWNhdXNlIGl0IGRvZXMgbm90IGNoYW5nZSBzY2hlZHVsZWQgdGltZS4UTmFtZWQABATQQXR0ZW1wdCB0byB1c2UgYSBub24tbmFtZWQgZnVuY3Rpb24gb24gYSBuYW1lZCB0YXNrLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC7xCgAABAj1ChgA9QoMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAH5CgRTAAAEAP0KARhWZWM8VD4AAPkKCDBwYWxsZXRfcHJveHk8UHJveHlEZWZpbml0aW9uDCRBY2NvdW50SWQBACRQcm94eVR5cGUBAQMsQmxvY2tOdW1iZXIBEAAMASBkZWxlZ2F0ZQABJEFjY291bnRJZAABKHByb3h5X3R5cGUBAwEkUHJveHlUeXBlAAEUZGVsYXkQASxCbG9ja051bWJlcgAA/QoAAAL5CgABCwAABAgFCxgABQsMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAEJCwRTAAAEAA0LARhWZWM8VD4AAAkLCDBwYWxsZXRfcHJveHkwQW5ub3VuY2VtZW50DCRBY2NvdW50SWQBABBIYXNoATQsQmxvY2tOdW1iZXIBEAAMARByZWFsAAEkQWNjb3VudElkAAEkY2FsbF9oYXNoNAEQSGFzaAABGGhlaWdodBABLEJsb2NrTnVtYmVyAAANCwAAAgkLABELDDBwYWxsZXRfcHJveHkYcGFsbGV0FEVycm9yBARUAAEgHFRvb01hbnkAAAQhAVRoZXJlIGFyZSB0b28gbWFueSBwcm94aWVzIHJlZ2lzdGVyZWQgb3IgdG9vIG1hbnkgYW5ub3VuY2VtZW50cyBwZW5kaW5nLiBOb3RGb3VuZAABBHRQcm94eSByZWdpc3RyYXRpb24gbm90IGZvdW5kLiBOb3RQcm94eQACBMxTZW5kZXIgaXMgbm90IGEgcHJveHkgb2YgdGhlIGFjY291bnQgdG8gYmUgcHJveGllZC4sVW5wcm94eWFibGUAAwQhAUEgY2FsbCB3aGljaCBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgcHJveHkgdHlwZSdzIGZpbHRlciB3YXMgYXR0ZW1wdGVkLiREdXBsaWNhdGUABARsQWNjb3VudCBpcyBhbHJlYWR5IGEgcHJveHkuME5vUGVybWlzc2lvbgAFBBUBQ2FsbCBtYXkgbm90IGJlIG1hZGUgYnkgcHJveHkgYmVjYXVzZSBpdCBtYXkgZXNjYWxhdGUgaXRzIHByaXZpbGVnZXMuLFVuYW5ub3VuY2VkAAYE0EFubm91bmNlbWVudCwgaWYgbWFkZSBhdCBhbGwsIHdhcyBtYWRlIHRvbyByZWNlbnRseS4sTm9TZWxmUHJveHkABwRkQ2Fubm90IGFkZCBzZWxmIGFzIHByb3h5LgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC4VCwAABAgABAAZCwg8cGFsbGV0X211bHRpc2lnIE11bHRpc2lnECxCbG9ja051bWJlcgEQHEJhbGFuY2UBGCRBY2NvdW50SWQBADBNYXhBcHByb3ZhbHMAABABEHdoZW4NAwFYVGltZXBvaW50PEJsb2NrTnVtYmVyPgABHGRlcG9zaXQYARxCYWxhbmNlAAEkZGVwb3NpdG9yAAEkQWNjb3VudElkAAEkYXBwcm92YWxzHQsBjEJvdW5kZWRWZWM8QWNjb3VudElkLCBNYXhBcHByb3ZhbHM+AAAdCwxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAQAEUwAABACtAQEYVmVjPFQ+AAAhCww8cGFsbGV0X211bHRpc2lnGHBhbGxldBRFcnJvcgQEVAABOEBNaW5pbXVtVGhyZXNob2xkAAAEfFRocmVzaG9sZCBtdXN0IGJlIDIgb3IgZ3JlYXRlci48QWxyZWFkeUFwcHJvdmVkAAEErENhbGwgaXMgYWxyZWFkeSBhcHByb3ZlZCBieSB0aGlzIHNpZ25hdG9yeS5ETm9BcHByb3ZhbHNOZWVkZWQAAgScQ2FsbCBkb2Vzbid0IG5lZWQgYW55IChtb3JlKSBhcHByb3ZhbHMuRFRvb0Zld1NpZ25hdG9yaWVzAAMEqFRoZXJlIGFyZSB0b28gZmV3IHNpZ25hdG9yaWVzIGluIHRoZSBsaXN0LkhUb29NYW55U2lnbmF0b3JpZXMABASsVGhlcmUgYXJlIHRvbyBtYW55IHNpZ25hdG9yaWVzIGluIHRoZSBsaXN0LlRTaWduYXRvcmllc091dE9mT3JkZXIABQQNAVRoZSBzaWduYXRvcmllcyB3ZXJlIHByb3ZpZGVkIG91dCBvZiBvcmRlcjsgdGhleSBzaG91bGQgYmUgb3JkZXJlZC5MU2VuZGVySW5TaWduYXRvcmllcwAGBA0BVGhlIHNlbmRlciB3YXMgY29udGFpbmVkIGluIHRoZSBvdGhlciBzaWduYXRvcmllczsgaXQgc2hvdWxkbid0IGJlLiBOb3RGb3VuZAAHBNxNdWx0aXNpZyBvcGVyYXRpb24gbm90IGZvdW5kIHdoZW4gYXR0ZW1wdGluZyB0byBjYW5jZWwuIE5vdE93bmVyAAgELQFPbmx5IHRoZSBhY2NvdW50IHRoYXQgb3JpZ2luYWxseSBjcmVhdGVkIHRoZSBtdWx0aXNpZyBpcyBhYmxlIHRvIGNhbmNlbCBpdC4sTm9UaW1lcG9pbnQACQQdAU5vIHRpbWVwb2ludCB3YXMgZ2l2ZW4sIHlldCB0aGUgbXVsdGlzaWcgb3BlcmF0aW9uIGlzIGFscmVhZHkgdW5kZXJ3YXkuOFdyb25nVGltZXBvaW50AAoELQFBIGRpZmZlcmVudCB0aW1lcG9pbnQgd2FzIGdpdmVuIHRvIHRoZSBtdWx0aXNpZyBvcGVyYXRpb24gdGhhdCBpcyB1bmRlcndheS5MVW5leHBlY3RlZFRpbWVwb2ludAALBPRBIHRpbWVwb2ludCB3YXMgZ2l2ZW4sIHlldCBubyBtdWx0aXNpZyBvcGVyYXRpb24gaXMgdW5kZXJ3YXkuPE1heFdlaWdodFRvb0xvdwAMBNBUaGUgbWF4aW11bSB3ZWlnaHQgaW5mb3JtYXRpb24gcHJvdmlkZWQgd2FzIHRvbyBsb3cuNEFscmVhZHlTdG9yZWQADQSgVGhlIGRhdGEgdG8gYmUgc3RvcmVkIGlzIGFscmVhZHkgc3RvcmVkLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC4lCwg8cGFsbGV0X3ByZWltYWdlQE9sZFJlcXVlc3RTdGF0dXMIJEFjY291bnRJZAEAHEJhbGFuY2UBGAEILFVucmVxdWVzdGVkCAEcZGVwb3NpdHEEAVAoQWNjb3VudElkLCBCYWxhbmNlKQABDGxlbhABDHUzMgAAACRSZXF1ZXN0ZWQMARxkZXBvc2l0KQsBcE9wdGlvbjwoQWNjb3VudElkLCBCYWxhbmNlKT4AARRjb3VudBABDHUzMgABDGxlbj0CASxPcHRpb248dTMyPgABAAApCwQYT3B0aW9uBARUAXEEAQgQTm9uZQAAABBTb21lBABxBAAAAQAALQsIPHBhbGxldF9wcmVpbWFnZTRSZXF1ZXN0U3RhdHVzCCRBY2NvdW50SWQBABhUaWNrZXQBMQsBCCxVbnJlcXVlc3RlZAgBGHRpY2tldDULAUwoQWNjb3VudElkLCBUaWNrZXQpAAEMbGVuEAEMdTMyAAAAJFJlcXVlc3RlZAwBMG1heWJlX3RpY2tldDkLAWxPcHRpb248KEFjY291bnRJZCwgVGlja2V0KT4AARRjb3VudBABDHUzMgABJG1heWJlX2xlbj0CASxPcHRpb248dTMyPgABAAAxCxQ0ZnJhbWVfc3VwcG9ydBh0cmFpdHMYdG9rZW5zIGZ1bmdpYmxlREhvbGRDb25zaWRlcmF0aW9uFARBAARGAARSAAREAAhGcAAABAAYAShGOjpCYWxhbmNlAAA1CwAABAgAMQsAOQsEGE9wdGlvbgQEVAE1CwEIEE5vbmUAAAAQU29tZQQANQsAAAEAAD0LDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBCARTAAAEADgBGFZlYzxUPgAAQQsMPHBhbGxldF9wcmVpbWFnZRhwYWxsZXQURXJyb3IEBFQAASQYVG9vQmlnAAAEoFByZWltYWdlIGlzIHRvbyBsYXJnZSB0byBzdG9yZSBvbi1jaGFpbi4wQWxyZWFkeU5vdGVkAAEEpFByZWltYWdlIGhhcyBhbHJlYWR5IGJlZW4gbm90ZWQgb24tY2hhaW4uNE5vdEF1dGhvcml6ZWQAAgTIVGhlIHVzZXIgaXMgbm90IGF1dGhvcml6ZWQgdG8gcGVyZm9ybSB0aGlzIGFjdGlvbi4gTm90Tm90ZWQAAwT8VGhlIHByZWltYWdlIGNhbm5vdCBiZSByZW1vdmVkIHNpbmNlIGl0IGhhcyBub3QgeWV0IGJlZW4gbm90ZWQuJFJlcXVlc3RlZAAEBAkBQSBwcmVpbWFnZSBtYXkgbm90IGJlIHJlbW92ZWQgd2hlbiB0aGVyZSBhcmUgb3V0c3RhbmRpbmcgcmVxdWVzdHMuME5vdFJlcXVlc3RlZAAFBC0BVGhlIHByZWltYWdlIHJlcXVlc3QgY2Fubm90IGJlIHJlbW92ZWQgc2luY2Ugbm8gb3V0c3RhbmRpbmcgcmVxdWVzdHMgZXhpc3QuHFRvb01hbnkABgRVAU1vcmUgdGhhbiBgTUFYX0hBU0hfVVBHUkFERV9CVUxLX0NPVU5UYCBoYXNoZXMgd2VyZSByZXF1ZXN0ZWQgdG8gYmUgdXBncmFkZWQgYXQgb25jZS4YVG9vRmV3AAcE5FRvbyBmZXcgaGFzaGVzIHdlcmUgcmVxdWVzdGVkIHRvIGJlIHVwZ3JhZGVkIChpLmUuIHplcm8pLhhOb0Nvc3QACARZAU5vIHRpY2tldCB3aXRoIGEgY29zdCB3YXMgcmV0dXJuZWQgYnkgW2BDb25maWc6OkNvbnNpZGVyYXRpb25gXSB0byBzdG9yZSB0aGUgcHJlaW1hZ2UuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LkULCDxwYWxsZXRfYm91bnRpZXMYQm91bnR5DCRBY2NvdW50SWQBABxCYWxhbmNlARgsQmxvY2tOdW1iZXIBEAAYASBwcm9wb3NlcgABJEFjY291bnRJZAABFHZhbHVlGAEcQmFsYW5jZQABDGZlZRgBHEJhbGFuY2UAATxjdXJhdG9yX2RlcG9zaXQYARxCYWxhbmNlAAEQYm9uZBgBHEJhbGFuY2UAARhzdGF0dXNJCwGQQm91bnR5U3RhdHVzPEFjY291bnRJZCwgQmxvY2tOdW1iZXI+AABJCwg8cGFsbGV0X2JvdW50aWVzMEJvdW50eVN0YXR1cwgkQWNjb3VudElkAQAsQmxvY2tOdW1iZXIBEAEYIFByb3Bvc2VkAAAAIEFwcHJvdmVkAAEAGEZ1bmRlZAACADxDdXJhdG9yUHJvcG9zZWQEARxjdXJhdG9yAAEkQWNjb3VudElkAAMAGEFjdGl2ZQgBHGN1cmF0b3IAASRBY2NvdW50SWQAASh1cGRhdGVfZHVlEAEsQmxvY2tOdW1iZXIABAA0UGVuZGluZ1BheW91dAwBHGN1cmF0b3IAASRBY2NvdW50SWQAASxiZW5lZmljaWFyeQABJEFjY291bnRJZAABJHVubG9ja19hdBABLEJsb2NrTnVtYmVyAAUAAE0LDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBCARTAAAEADgBGFZlYzxUPgAAUQsMPHBhbGxldF9ib3VudGllcxhwYWxsZXQURXJyb3IIBFQABEkAASxwSW5zdWZmaWNpZW50UHJvcG9zZXJzQmFsYW5jZQAABHhQcm9wb3NlcidzIGJhbGFuY2UgaXMgdG9vIGxvdy4wSW52YWxpZEluZGV4AAEEkE5vIHByb3Bvc2FsIG9yIGJvdW50eSBhdCB0aGF0IGluZGV4LjBSZWFzb25Ub29CaWcAAgSEVGhlIHJlYXNvbiBnaXZlbiBpcyBqdXN0IHRvbyBiaWcuQFVuZXhwZWN0ZWRTdGF0dXMAAwSAVGhlIGJvdW50eSBzdGF0dXMgaXMgdW5leHBlY3RlZC44UmVxdWlyZUN1cmF0b3IABARcUmVxdWlyZSBib3VudHkgY3VyYXRvci4wSW52YWxpZFZhbHVlAAUEVEludmFsaWQgYm91bnR5IHZhbHVlLihJbnZhbGlkRmVlAAYETEludmFsaWQgYm91bnR5IGZlZS40UGVuZGluZ1BheW91dAAHCGxBIGJvdW50eSBwYXlvdXQgaXMgcGVuZGluZy74VG8gY2FuY2VsIHRoZSBib3VudHksIHlvdSBtdXN0IHVuYXNzaWduIGFuZCBzbGFzaCB0aGUgY3VyYXRvci4kUHJlbWF0dXJlAAgERQFUaGUgYm91bnRpZXMgY2Fubm90IGJlIGNsYWltZWQvY2xvc2VkIGJlY2F1c2UgaXQncyBzdGlsbCBpbiB0aGUgY291bnRkb3duIHBlcmlvZC5QSGFzQWN0aXZlQ2hpbGRCb3VudHkACQQFAVRoZSBib3VudHkgY2Fubm90IGJlIGNsb3NlZCBiZWNhdXNlIGl0IGhhcyBhY3RpdmUgY2hpbGQgYm91bnRpZXMuNFRvb01hbnlRdWV1ZWQACgSYVG9vIG1hbnkgYXBwcm92YWxzIGFyZSBhbHJlYWR5IHF1ZXVlZC4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQuVQsIVHBhbGxldF9jaGlsZF9ib3VudGllcyxDaGlsZEJvdW50eQwkQWNjb3VudElkAQAcQmFsYW5jZQEYLEJsb2NrTnVtYmVyARAAFAE0cGFyZW50X2JvdW50eRABLEJvdW50eUluZGV4AAEUdmFsdWUYARxCYWxhbmNlAAEMZmVlGAEcQmFsYW5jZQABPGN1cmF0b3JfZGVwb3NpdBgBHEJhbGFuY2UAARhzdGF0dXNZCwGkQ2hpbGRCb3VudHlTdGF0dXM8QWNjb3VudElkLCBCbG9ja051bWJlcj4AAFkLCFRwYWxsZXRfY2hpbGRfYm91bnRpZXNEQ2hpbGRCb3VudHlTdGF0dXMIJEFjY291bnRJZAEALEJsb2NrTnVtYmVyARABEBRBZGRlZAAAADxDdXJhdG9yUHJvcG9zZWQEARxjdXJhdG9yAAEkQWNjb3VudElkAAEAGEFjdGl2ZQQBHGN1cmF0b3IAASRBY2NvdW50SWQAAgA0UGVuZGluZ1BheW91dAwBHGN1cmF0b3IAASRBY2NvdW50SWQAASxiZW5lZmljaWFyeQABJEFjY291bnRJZAABJHVubG9ja19hdBABLEJsb2NrTnVtYmVyAAMAAF0LDFRwYWxsZXRfY2hpbGRfYm91bnRpZXMYcGFsbGV0FEVycm9yBARUAAEMVFBhcmVudEJvdW50eU5vdEFjdGl2ZQAABKRUaGUgcGFyZW50IGJvdW50eSBpcyBub3QgaW4gYWN0aXZlIHN0YXRlLmRJbnN1ZmZpY2llbnRCb3VudHlCYWxhbmNlAAEE5FRoZSBib3VudHkgYmFsYW5jZSBpcyBub3QgZW5vdWdoIHRvIGFkZCBuZXcgY2hpbGQtYm91bnR5LlBUb29NYW55Q2hpbGRCb3VudGllcwACBA0BTnVtYmVyIG9mIGNoaWxkIGJvdW50aWVzIGV4Y2VlZHMgbGltaXQgYE1heEFjdGl2ZUNoaWxkQm91bnR5Q291bnRgLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC5hCwiQcGFsbGV0X2VsZWN0aW9uX3Byb3ZpZGVyX211bHRpX3BoYXNlNFJlYWR5U29sdXRpb24IJEFjY291bnRJZAAoTWF4V2lubmVycwAADAEgc3VwcG9ydHNlCwGYQm91bmRlZFN1cHBvcnRzPEFjY291bnRJZCwgTWF4V2lubmVycz4AARRzY29yZVUEATRFbGVjdGlvblNjb3JlAAEcY29tcHV0Zc0HATxFbGVjdGlvbkNvbXB1dGUAAGULDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBZQQEUwAABABhBAEYVmVjPFQ+AABpCwiQcGFsbGV0X2VsZWN0aW9uX3Byb3ZpZGVyX211bHRpX3BoYXNlNFJvdW5kU25hcHNob3QIJEFjY291bnRJZAEAMERhdGFQcm92aWRlcgFtCwAIARh2b3RlcnNxCwFEVmVjPERhdGFQcm92aWRlcj4AARx0YXJnZXRzrQEBOFZlYzxBY2NvdW50SWQ+AABtCwAABAwAMCEJAHELAAACbQsAdQsMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAF5CwRTAAAEAH0LARhWZWM8VD4AAHkLAAAEDFUEEBAAfQsAAAJ5CwCBCwyQcGFsbGV0X2VsZWN0aW9uX3Byb3ZpZGVyX211bHRpX3BoYXNlGHNpZ25lZEBTaWduZWRTdWJtaXNzaW9uDCRBY2NvdW50SWQBABxCYWxhbmNlARggU29sdXRpb24BKQMAEAEMd2hvAAEkQWNjb3VudElkAAEcZGVwb3NpdBgBHEJhbGFuY2UAATByYXdfc29sdXRpb24lAwFUUmF3U29sdXRpb248U29sdXRpb24+AAEgY2FsbF9mZWUYARxCYWxhbmNlAACFCwyQcGFsbGV0X2VsZWN0aW9uX3Byb3ZpZGVyX211bHRpX3BoYXNlGHBhbGxldBRFcnJvcgQEVAABPGhQcmVEaXNwYXRjaEVhcmx5U3VibWlzc2lvbgAABGRTdWJtaXNzaW9uIHdhcyB0b28gZWFybHkubFByZURpc3BhdGNoV3JvbmdXaW5uZXJDb3VudAABBIhXcm9uZyBudW1iZXIgb2Ygd2lubmVycyBwcmVzZW50ZWQuZFByZURpc3BhdGNoV2Vha1N1Ym1pc3Npb24AAgSQU3VibWlzc2lvbiB3YXMgdG9vIHdlYWssIHNjb3JlLXdpc2UuPFNpZ25lZFF1ZXVlRnVsbAADBEkBVGhlIHF1ZXVlIHdhcyBmdWxsLCBhbmQgdGhlIHNvbHV0aW9uIHdhcyBub3QgYmV0dGVyIHRoYW4gYW55IG9mIHRoZSBleGlzdGluZyBvbmVzLlhTaWduZWRDYW5ub3RQYXlEZXBvc2l0AAQElFRoZSBvcmlnaW4gZmFpbGVkIHRvIHBheSB0aGUgZGVwb3NpdC5QU2lnbmVkSW52YWxpZFdpdG5lc3MABQSgV2l0bmVzcyBkYXRhIHRvIGRpc3BhdGNoYWJsZSBpcyBpbnZhbGlkLkxTaWduZWRUb29NdWNoV2VpZ2h0AAYEuFRoZSBzaWduZWQgc3VibWlzc2lvbiBjb25zdW1lcyB0b28gbXVjaCB3ZWlnaHQ8T2N3Q2FsbFdyb25nRXJhAAcEmE9DVyBzdWJtaXR0ZWQgc29sdXRpb24gZm9yIHdyb25nIHJvdW5kXE1pc3NpbmdTbmFwc2hvdE1ldGFkYXRhAAgEqFNuYXBzaG90IG1ldGFkYXRhIHNob3VsZCBleGlzdCBidXQgZGlkbid0LlhJbnZhbGlkU3VibWlzc2lvbkluZGV4AAkE0GBTZWxmOjppbnNlcnRfc3VibWlzc2lvbmAgcmV0dXJuZWQgYW4gaW52YWxpZCBpbmRleC44Q2FsbE5vdEFsbG93ZWQACgSYVGhlIGNhbGwgaXMgbm90IGFsbG93ZWQgYXQgdGhpcyBwb2ludC44RmFsbGJhY2tGYWlsZWQACwRMVGhlIGZhbGxiYWNrIGZhaWxlZCxCb3VuZE5vdE1ldAAMBEhTb21lIGJvdW5kIG5vdCBtZXQ4VG9vTWFueVdpbm5lcnMADQScU3VibWl0dGVkIHNvbHV0aW9uIGhhcyB0b28gbWFueSB3aW5uZXJzZFByZURpc3BhdGNoRGlmZmVyZW50Um91bmQADgS4U3VibWlzc2lvbiB3YXMgcHJlcGFyZWQgZm9yIGEgZGlmZmVyZW50IHJvdW5kLgQNAUVycm9yIG9mIHRoZSBwYWxsZXQgdGhhdCBjYW4gYmUgcmV0dXJuZWQgaW4gcmVzcG9uc2UgdG8gZGlzcGF0Y2hlcy6JCwxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUASEKBFMAAAQAJQoBGFZlYzxUPgAAjQsMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAGRCwRTAAAEAJULARhWZWM8VD4AAJELDChwYWxsZXRfbmlzGHBhbGxldAxCaWQIHEJhbGFuY2UBGCRBY2NvdW50SWQBAAAIARhhbW91bnQYARxCYWxhbmNlAAEMd2hvAAEkQWNjb3VudElkAACVCwAAApELAJkLDChwYWxsZXRfbmlzGHBhbGxldDRTdW1tYXJ5UmVjb3JkCCxCbG9ja051bWJlcgEQHEJhbGFuY2UBGAAUATxwcm9wb3J0aW9uX293ZWSdAgEsUGVycXVpbnRpbGwAARRpbmRleBABMFJlY2VpcHRJbmRleAABGHRoYXdlZJ0CASxQZXJxdWludGlsbAABLGxhc3RfcGVyaW9kEAEsQmxvY2tOdW1iZXIAAUByZWNlaXB0c19vbl9ob2xkGAEcQmFsYW5jZQAAnQsMKHBhbGxldF9uaXMYcGFsbGV0NFJlY2VpcHRSZWNvcmQMJEFjY291bnRJZAEALEJsb2NrTnVtYmVyARAcQmFsYW5jZQEYAAwBKHByb3BvcnRpb26dAgEsUGVycXVpbnRpbGwAARRvd25lcikLAXBPcHRpb248KEFjY291bnRJZCwgQmFsYW5jZSk+AAEYZXhwaXJ5EAEsQmxvY2tOdW1iZXIAAKELAAAECJ0CEAClCwwocGFsbGV0X25pcxhwYWxsZXQURXJyb3IEBFQAATxARHVyYXRpb25Ub29TbWFsbAAABKRUaGUgZHVyYXRpb24gb2YgdGhlIGJpZCBpcyBsZXNzIHRoYW4gb25lLjhEdXJhdGlvblRvb0JpZwABBPRUaGUgZHVyYXRpb24gaXMgdGhlIGJpZCBpcyBncmVhdGVyIHRoYW4gdGhlIG51bWJlciBvZiBxdWV1ZXMuOEFtb3VudFRvb1NtYWxsAAIE3FRoZSBhbW91bnQgb2YgdGhlIGJpZCBpcyBsZXNzIHRoYW4gdGhlIG1pbmltdW0gYWxsb3dlZC4kQmlkVG9vTG93AAMIQQFUaGUgcXVldWUgZm9yIHRoZSBiaWQncyBkdXJhdGlvbiBpcyBmdWxsIGFuZCB0aGUgYW1vdW50IGJpZCBpcyB0b28gbG93IHRvIGdldCBpboh0aHJvdWdoIHJlcGxhY2luZyBhbiBleGlzdGluZyBiaWQuOFVua25vd25SZWNlaXB0AAQEZFJlY2VpcHQgaW5kZXggaXMgdW5rbm93bi4gTm90T3duZXIABQR0Tm90IHRoZSBvd25lciBvZiB0aGUgcmVjZWlwdC4oTm90RXhwaXJlZAAGBHBCb25kIG5vdCB5ZXQgYXQgZXhwaXJ5IGRhdGUuKFVua25vd25CaWQABwSoVGhlIGdpdmVuIGJpZCBmb3IgcmV0cmFjdGlvbiBpcyBub3QgZm91bmQuNFBvcnRpb25Ub29CaWcACATgVGhlIHBvcnRpb24gc3VwcGxpZWQgaXMgYmV5b25kIHRoZSB2YWx1ZSBvZiB0aGUgcmVjZWlwdC4gVW5mdW5kZWQACQSUTm90IGVub3VnaCBmdW5kcyBhcmUgaGVsZCB0byBwYXkgb3V0LjRBbHJlYWR5RnVuZGVkAAoEsFRoZXJlIGFyZSBlbm91Z2ggZnVuZHMgZm9yIHdoYXQgaXMgcmVxdWlyZWQuJFRocm90dGxlZAALBMxUaGUgdGhhdyB0aHJvdHRsZSBoYXMgYmVlbiByZWFjaGVkIGZvciB0aGlzIHBlcmlvZC4kTWFrZXNEdXN0AAwEFQFUaGUgb3BlcmF0aW9uIHdvdWxkIHJlc3VsdCBpbiBhIHJlY2VpcHQgd29ydGggYW4gaW5zaWduaWZpY2FudCB2YWx1ZS48QWxyZWFkeUNvbW11bmFsAA0EgFRoZSByZWNlaXB0IGlzIGFscmVhZHkgY29tbXVuYWwuOEFscmVhZHlQcml2YXRlAA4EfFRoZSByZWNlaXB0IGlzIGFscmVhZHkgcHJpdmF0ZS4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQuqQsMTGJvdW5kZWRfY29sbGVjdGlvbnNAd2Vha19ib3VuZGVkX3ZlYzhXZWFrQm91bmRlZFZlYwgEVAHJCARTAAAEANEIARhWZWM8VD4AAK0LDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQB2QgEUwAABADdCAEYVmVjPFQ+AACxCwxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAbULBFMAAAQAuQsBGFZlYzxUPgAAtQsUNGZyYW1lX3N1cHBvcnQYdHJhaXRzGHRva2VucxBtaXNjIElkQW1vdW50CAhJZAGhARxCYWxhbmNlARgACAEIaWShAQEISWQAARhhbW91bnQYARxCYWxhbmNlAAC5CwAAArULAL0LDDxwYWxsZXRfYmFsYW5jZXMYcGFsbGV0FEVycm9yCARUAARJAAEwOFZlc3RpbmdCYWxhbmNlAAAEnFZlc3RpbmcgYmFsYW5jZSB0b28gaGlnaCB0byBzZW5kIHZhbHVlLlRMaXF1aWRpdHlSZXN0cmljdGlvbnMAAQTIQWNjb3VudCBsaXF1aWRpdHkgcmVzdHJpY3Rpb25zIHByZXZlbnQgd2l0aGRyYXdhbC5MSW5zdWZmaWNpZW50QmFsYW5jZQACBHhCYWxhbmNlIHRvbyBsb3cgdG8gc2VuZCB2YWx1ZS5IRXhpc3RlbnRpYWxEZXBvc2l0AAME7FZhbHVlIHRvbyBsb3cgdG8gY3JlYXRlIGFjY291bnQgZHVlIHRvIGV4aXN0ZW50aWFsIGRlcG9zaXQuNEV4cGVuZGFiaWxpdHkABASQVHJhbnNmZXIvcGF5bWVudCB3b3VsZCBraWxsIGFjY291bnQuXEV4aXN0aW5nVmVzdGluZ1NjaGVkdWxlAAUEzEEgdmVzdGluZyBzY2hlZHVsZSBhbHJlYWR5IGV4aXN0cyBmb3IgdGhpcyBhY2NvdW50LixEZWFkQWNjb3VudAAGBIxCZW5lZmljaWFyeSBhY2NvdW50IG11c3QgcHJlLWV4aXN0LjxUb29NYW55UmVzZXJ2ZXMABwS4TnVtYmVyIG9mIG5hbWVkIHJlc2VydmVzIGV4Y2VlZCBgTWF4UmVzZXJ2ZXNgLjBUb29NYW55SG9sZHMACAT4TnVtYmVyIG9mIGhvbGRzIGV4Y2VlZCBgVmFyaWFudENvdW50T2Y8VDo6UnVudGltZUhvbGRSZWFzb24+YC44VG9vTWFueUZyZWV6ZXMACQSYTnVtYmVyIG9mIGZyZWV6ZXMgZXhjZWVkIGBNYXhGcmVlemVzYC5MSXNzdWFuY2VEZWFjdGl2YXRlZAAKBAEBVGhlIGlzc3VhbmNlIGNhbm5vdCBiZSBtb2RpZmllZCBzaW5jZSBpdCBpcyBhbHJlYWR5IGRlYWN0aXZhdGVkLiREZWx0YVplcm8ACwRkVGhlIGRlbHRhIGNhbm5vdCBiZSB6ZXJvLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC7BCwxAcGFsbGV0X2JhZ3NfbGlzdBBsaXN0EE5vZGUIBFQABEkAABQBCGlkAAEwVDo6QWNjb3VudElkAAEQcHJldtkBAVBPcHRpb248VDo6QWNjb3VudElkPgABEG5leHTZAQFQT3B0aW9uPFQ6OkFjY291bnRJZD4AASRiYWdfdXBwZXIwASBUOjpTY29yZQABFHNjb3JlMAEgVDo6U2NvcmUAAMULDEBwYWxsZXRfYmFnc19saXN0EGxpc3QMQmFnCARUAARJAAAIARBoZWFk2QEBUE9wdGlvbjxUOjpBY2NvdW50SWQ+AAEQdGFpbNkBAVBPcHRpb248VDo6QWNjb3VudElkPgAAyQsAAAIwAM0LDEBwYWxsZXRfYmFnc19saXN0GHBhbGxldBRFcnJvcggEVAAESQABBBBMaXN0BADRCwEkTGlzdEVycm9yAAAEtEEgZXJyb3IgaW4gdGhlIGxpc3QgaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC7RCwxAcGFsbGV0X2JhZ3NfbGlzdBBsaXN0JExpc3RFcnJvcgABECREdXBsaWNhdGUAAAAoTm90SGVhdmllcgABADBOb3RJblNhbWVCYWcAAgAwTm9kZU5vdEZvdW5kAAMAANULCFxwYWxsZXRfbm9taW5hdGlvbl9wb29scyhQb29sTWVtYmVyBARUAAAQARxwb29sX2lkEAEYUG9vbElkAAEYcG9pbnRzGAEwQmFsYW5jZU9mPFQ+AAFwbGFzdF9yZWNvcmRlZF9yZXdhcmRfY291bnRlciEHAUBUOjpSZXdhcmRDb3VudGVyAAE4dW5ib25kaW5nX2VyYXPZCwHgQm91bmRlZEJUcmVlTWFwPEVyYUluZGV4LCBCYWxhbmNlT2Y8VD4sIFQ6Ok1heFVuYm9uZGluZz4AANkLDExib3VuZGVkX2NvbGxlY3Rpb25zRGJvdW5kZWRfYnRyZWVfbWFwPEJvdW5kZWRCVHJlZU1hcAwESwEQBFYBGARTAAAEAN0LAThCVHJlZU1hcDxLLCBWPgAA3QsEIEJUcmVlTWFwCARLARAEVgEYAAQAJQoAAADhCwhccGFsbGV0X25vbWluYXRpb25fcG9vbHM8Qm9uZGVkUG9vbElubmVyBARUAAAUAShjb21taXNzaW9u5QsBNENvbW1pc3Npb248VD4AAThtZW1iZXJfY291bnRlchABDHUzMgABGHBvaW50cxgBMEJhbGFuY2VPZjxUPgABFHJvbGVz8QsBXFBvb2xSb2xlczxUOjpBY2NvdW50SWQ+AAEUc3RhdGWJBAEkUG9vbFN0YXRlAADlCwhccGFsbGV0X25vbWluYXRpb25fcG9vbHMoQ29tbWlzc2lvbgQEVAAAFAEcY3VycmVudKEEAXxPcHRpb248KFBlcmJpbGwsIFQ6OkFjY291bnRJZCk+AAEMbWF46QsBPE9wdGlvbjxQZXJiaWxsPgABLGNoYW5nZV9yYXRl7QsBvE9wdGlvbjxDb21taXNzaW9uQ2hhbmdlUmF0ZTxCbG9ja051bWJlckZvcjxUPj4+AAE0dGhyb3R0bGVfZnJvbT0CAWRPcHRpb248QmxvY2tOdW1iZXJGb3I8VD4+AAFAY2xhaW1fcGVybWlzc2lvbq0EAbxPcHRpb248Q29tbWlzc2lvbkNsYWltUGVybWlzc2lvbjxUOjpBY2NvdW50SWQ+PgAA6QsEGE9wdGlvbgQEVAGUAQgQTm9uZQAAABBTb21lBACUAAABAADtCwQYT3B0aW9uBARUAakEAQgQTm9uZQAAABBTb21lBACpBAAAAQAA8QsIXHBhbGxldF9ub21pbmF0aW9uX3Bvb2xzJFBvb2xSb2xlcwQkQWNjb3VudElkAQAAEAEkZGVwb3NpdG9yAAEkQWNjb3VudElkAAEQcm9vdNkBAURPcHRpb248QWNjb3VudElkPgABJG5vbWluYXRvctkBAURPcHRpb248QWNjb3VudElkPgABHGJvdW5jZXLZAQFET3B0aW9uPEFjY291bnRJZD4AAPULCFxwYWxsZXRfbm9taW5hdGlvbl9wb29scyhSZXdhcmRQb29sBARUAAAUAXBsYXN0X3JlY29yZGVkX3Jld2FyZF9jb3VudGVyIQcBQFQ6OlJld2FyZENvdW50ZXIAAWxsYXN0X3JlY29yZGVkX3RvdGFsX3BheW91dHMYATBCYWxhbmNlT2Y8VD4AAVR0b3RhbF9yZXdhcmRzX2NsYWltZWQYATBCYWxhbmNlT2Y8VD4AAWB0b3RhbF9jb21taXNzaW9uX3BlbmRpbmcYATBCYWxhbmNlT2Y8VD4AAWB0b3RhbF9jb21taXNzaW9uX2NsYWltZWQYATBCYWxhbmNlT2Y8VD4AAPkLCFxwYWxsZXRfbm9taW5hdGlvbl9wb29scyBTdWJQb29scwQEVAAACAEYbm9fZXJh/QsBNFVuYm9uZFBvb2w8VD4AASB3aXRoX2VyYQEMAQEBQm91bmRlZEJUcmVlTWFwPEVyYUluZGV4LCBVbmJvbmRQb29sPFQ+LCBUb3RhbFVuYm9uZGluZ1Bvb2xzPFQ+PgAA/QsIXHBhbGxldF9ub21pbmF0aW9uX3Bvb2xzKFVuYm9uZFBvb2wEBFQAAAgBGHBvaW50cxgBMEJhbGFuY2VPZjxUPgABHGJhbGFuY2UYATBCYWxhbmNlT2Y8VD4AAAEMDExib3VuZGVkX2NvbGxlY3Rpb25zRGJvdW5kZWRfYnRyZWVfbWFwPEJvdW5kZWRCVHJlZU1hcAwESwEQBFYB/QsEUwAABAAFDAE4QlRyZWVNYXA8SywgVj4AAAUMBCBCVHJlZU1hcAgESwEQBFYB/QsABAAJDAAAAAkMAAACDQwADQwAAAQIEP0LABEMDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBCARTAAAEADgBGFZlYzxUPgAAFQwMXHBhbGxldF9ub21pbmF0aW9uX3Bvb2xzGHBhbGxldBRFcnJvcgQEVAABkDBQb29sTm90Rm91bmQAAASIQSAoYm9uZGVkKSBwb29sIGlkIGRvZXMgbm90IGV4aXN0LkhQb29sTWVtYmVyTm90Rm91bmQAAQRsQW4gYWNjb3VudCBpcyBub3QgYSBtZW1iZXIuSFJld2FyZFBvb2xOb3RGb3VuZAACBCEBQSByZXdhcmQgcG9vbCBkb2VzIG5vdCBleGlzdC4gSW4gYWxsIGNhc2VzIHRoaXMgaXMgYSBzeXN0ZW0gbG9naWMgZXJyb3IuQFN1YlBvb2xzTm90Rm91bmQAAwRoQSBzdWIgcG9vbCBkb2VzIG5vdCBleGlzdC5kQWNjb3VudEJlbG9uZ3NUb090aGVyUG9vbAAECE0BQW4gYWNjb3VudCBpcyBhbHJlYWR5IGRlbGVnYXRpbmcgaW4gYW5vdGhlciBwb29sLiBBbiBhY2NvdW50IG1heSBvbmx5IGJlbG9uZyB0byBvbmU8cG9vbCBhdCBhIHRpbWUuOEZ1bGx5VW5ib25kaW5nAAUIPQFUaGUgbWVtYmVyIGlzIGZ1bGx5IHVuYm9uZGVkIChhbmQgdGh1cyBjYW5ub3QgYWNjZXNzIHRoZSBib25kZWQgYW5kIHJld2FyZCBwb29sqGFueW1vcmUgdG8sIGZvciBleGFtcGxlLCBjb2xsZWN0IHJld2FyZHMpLkRNYXhVbmJvbmRpbmdMaW1pdAAGBAkBVGhlIG1lbWJlciBjYW5ub3QgdW5ib25kIGZ1cnRoZXIgY2h1bmtzIGR1ZSB0byByZWFjaGluZyB0aGUgbGltaXQuRENhbm5vdFdpdGhkcmF3QW55AAcETQFOb25lIG9mIHRoZSBmdW5kcyBjYW4gYmUgd2l0aGRyYXduIHlldCBiZWNhdXNlIHRoZSBib25kaW5nIGR1cmF0aW9uIGhhcyBub3QgcGFzc2VkLkRNaW5pbXVtQm9uZE5vdE1ldAAIFCkBVGhlIGFtb3VudCBkb2VzIG5vdCBtZWV0IHRoZSBtaW5pbXVtIGJvbmQgdG8gZWl0aGVyIGpvaW4gb3IgY3JlYXRlIGEgcG9vbC4AVQFUaGUgZGVwb3NpdG9yIGNhbiBuZXZlciB1bmJvbmQgdG8gYSB2YWx1ZSBsZXNzIHRoYW4gYFBhbGxldDo6ZGVwb3NpdG9yX21pbl9ib25kYC4gVGhlXQFjYWxsZXIgZG9lcyBub3QgaGF2ZSBub21pbmF0aW5nIHBlcm1pc3Npb25zIGZvciB0aGUgcG9vbC4gTWVtYmVycyBjYW4gbmV2ZXIgdW5ib25kIHRvIGFodmFsdWUgYmVsb3cgYE1pbkpvaW5Cb25kYC4wT3ZlcmZsb3dSaXNrAAkEIQFUaGUgdHJhbnNhY3Rpb24gY291bGQgbm90IGJlIGV4ZWN1dGVkIGR1ZSB0byBvdmVyZmxvdyByaXNrIGZvciB0aGUgcG9vbC40Tm90RGVzdHJveWluZwAKCF0BQSBwb29sIG11c3QgYmUgaW4gW2BQb29sU3RhdGU6OkRlc3Ryb3lpbmdgXSBpbiBvcmRlciBmb3IgdGhlIGRlcG9zaXRvciB0byB1bmJvbmQgb3IgZm9yuG90aGVyIG1lbWJlcnMgdG8gYmUgcGVybWlzc2lvbmxlc3NseSB1bmJvbmRlZC4wTm90Tm9taW5hdG9yAAsE9FRoZSBjYWxsZXIgZG9lcyBub3QgaGF2ZSBub21pbmF0aW5nIHBlcm1pc3Npb25zIGZvciB0aGUgcG9vbC5UTm90S2lja2VyT3JEZXN0cm95aW5nAAwEPQFFaXRoZXIgYSkgdGhlIGNhbGxlciBjYW5ub3QgbWFrZSBhIHZhbGlkIGtpY2sgb3IgYikgdGhlIHBvb2wgaXMgbm90IGRlc3Ryb3lpbmcuHE5vdE9wZW4ADQRwVGhlIHBvb2wgaXMgbm90IG9wZW4gdG8gam9pbiBNYXhQb29scwAOBIRUaGUgc3lzdGVtIGlzIG1heGVkIG91dCBvbiBwb29scy44TWF4UG9vbE1lbWJlcnMADwScVG9vIG1hbnkgbWVtYmVycyBpbiB0aGUgcG9vbCBvciBzeXN0ZW0uRENhbk5vdENoYW5nZVN0YXRlABAEiFRoZSBwb29scyBzdGF0ZSBjYW5ub3QgYmUgY2hhbmdlZC5URG9lc05vdEhhdmVQZXJtaXNzaW9uABEEuFRoZSBjYWxsZXIgZG9lcyBub3QgaGF2ZSBhZGVxdWF0ZSBwZXJtaXNzaW9ucy5UTWV0YWRhdGFFeGNlZWRzTWF4TGVuABIErE1ldGFkYXRhIGV4Y2VlZHMgW2BDb25maWc6Ok1heE1ldGFkYXRhTGVuYF0kRGVmZW5zaXZlBAAZDAE4RGVmZW5zaXZlRXJyb3IAEwgxAVNvbWUgZXJyb3Igb2NjdXJyZWQgdGhhdCBzaG91bGQgbmV2ZXIgaGFwcGVuLiBUaGlzIHNob3VsZCBiZSByZXBvcnRlZCB0byB0aGUwbWFpbnRhaW5lcnMunFBhcnRpYWxVbmJvbmROb3RBbGxvd2VkUGVybWlzc2lvbmxlc3NseQAUBLxQYXJ0aWFsIHVuYm9uZGluZyBub3cgYWxsb3dlZCBwZXJtaXNzaW9ubGVzc2x5LlxNYXhDb21taXNzaW9uUmVzdHJpY3RlZAAVBB0BVGhlIHBvb2wncyBtYXggY29tbWlzc2lvbiBjYW5ub3QgYmUgc2V0IGhpZ2hlciB0aGFuIHRoZSBleGlzdGluZyB2YWx1ZS5gQ29tbWlzc2lvbkV4Y2VlZHNNYXhpbXVtABYE7FRoZSBzdXBwbGllZCBjb21taXNzaW9uIGV4Y2VlZHMgdGhlIG1heCBhbGxvd2VkIGNvbW1pc3Npb24ueENvbW1pc3Npb25FeGNlZWRzR2xvYmFsTWF4aW11bQAXBOhUaGUgc3VwcGxpZWQgY29tbWlzc2lvbiBleGNlZWRzIGdsb2JhbCBtYXhpbXVtIGNvbW1pc3Npb24uZENvbW1pc3Npb25DaGFuZ2VUaHJvdHRsZWQAGAQJAU5vdCBlbm91Z2ggYmxvY2tzIGhhdmUgc3VycGFzc2VkIHNpbmNlIHRoZSBsYXN0IGNvbW1pc3Npb24gdXBkYXRlLnhDb21taXNzaW9uQ2hhbmdlUmF0ZU5vdEFsbG93ZWQAGQQBAVRoZSBzdWJtaXR0ZWQgY2hhbmdlcyB0byBjb21taXNzaW9uIGNoYW5nZSByYXRlIGFyZSBub3QgYWxsb3dlZC5MTm9QZW5kaW5nQ29tbWlzc2lvbgAaBKBUaGVyZSBpcyBubyBwZW5kaW5nIGNvbW1pc3Npb24gdG8gY2xhaW0uWE5vQ29tbWlzc2lvbkN1cnJlbnRTZXQAGwSMTm8gY29tbWlzc2lvbiBjdXJyZW50IGhhcyBiZWVuIHNldC4sUG9vbElkSW5Vc2UAHARkUG9vbCBpZCBjdXJyZW50bHkgaW4gdXNlLjRJbnZhbGlkUG9vbElkAB0EnFBvb2wgaWQgcHJvdmlkZWQgaXMgbm90IGNvcnJlY3QvdXNhYmxlLkxCb25kRXh0cmFSZXN0cmljdGVkAB4E/EJvbmRpbmcgZXh0cmEgaXMgcmVzdHJpY3RlZCB0byB0aGUgZXhhY3QgcGVuZGluZyByZXdhcmQgYW1vdW50LjxOb3RoaW5nVG9BZGp1c3QAHwSwTm8gaW1iYWxhbmNlIGluIHRoZSBFRCBkZXBvc2l0IGZvciB0aGUgcG9vbC44Tm90aGluZ1RvU2xhc2gAIATMTm8gc2xhc2ggcGVuZGluZyB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIHRoZSBtZW1iZXIuPEFscmVhZHlNaWdyYXRlZAAhBBUBVGhlIHBvb2wgb3IgbWVtYmVyIGRlbGVnYXRpb24gaGFzIGFscmVhZHkgbWlncmF0ZWQgdG8gZGVsZWdhdGUgc3Rha2UuLE5vdE1pZ3JhdGVkACIEFQFUaGUgcG9vbCBvciBtZW1iZXIgZGVsZWdhdGlvbiBoYXMgbm90IG1pZ3JhdGVkIHlldCB0byBkZWxlZ2F0ZSBzdGFrZS4wTm90U3VwcG9ydGVkACME8FRoaXMgY2FsbCBpcyBub3QgYWxsb3dlZCBpbiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgcGFsbGV0LgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC4ZDAxccGFsbGV0X25vbWluYXRpb25fcG9vbHMYcGFsbGV0OERlZmVuc2l2ZUVycm9yAAEcaE5vdEVub3VnaFNwYWNlSW5VbmJvbmRQb29sAAAAMFBvb2xOb3RGb3VuZAABAEhSZXdhcmRQb29sTm90Rm91bmQAAgBAU3ViUG9vbHNOb3RGb3VuZAADAHBCb25kZWRTdGFzaEtpbGxlZFByZW1hdHVyZWx5AAQAVERlbGVnYXRpb25VbnN1cHBvcnRlZAAFADxTbGFzaE5vdEFwcGxpZWQABgAAHQwMTHBhbGxldF9mYXN0X3Vuc3Rha2UUdHlwZXM4VW5zdGFrZVJlcXVlc3QEBFQAAAgBHHN0YXNoZXMhDAHYQm91bmRlZFZlYzwoVDo6QWNjb3VudElkLCBCYWxhbmNlT2Y8VD4pLCBUOjpCYXRjaFNpemU+AAEcY2hlY2tlZCUMAZBCb3VuZGVkVmVjPEVyYUluZGV4LCBNYXhDaGVja2luZzxUPj4AACEMDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBcQQEUwAABABtBAEYVmVjPFQ+AAAlDAxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUARAEUwAABADBAQEYVmVjPFQ+AAApDAxMcGFsbGV0X2Zhc3RfdW5zdGFrZRhwYWxsZXQURXJyb3IEBFQAARg0Tm90Q29udHJvbGxlcgAADLhUaGUgcHJvdmlkZWQgQ29udHJvbGxlciBhY2NvdW50IHdhcyBub3QgZm91bmQuAMBUaGlzIG1lYW5zIHRoYXQgdGhlIGdpdmVuIGFjY291bnQgaXMgbm90IGJvbmRlZC40QWxyZWFkeVF1ZXVlZAABBKxUaGUgYm9uZGVkIGFjY291bnQgaGFzIGFscmVhZHkgYmVlbiBxdWV1ZWQuOE5vdEZ1bGx5Qm9uZGVkAAIEvFRoZSBib25kZWQgYWNjb3VudCBoYXMgYWN0aXZlIHVubG9ja2luZyBjaHVua3MuJE5vdFF1ZXVlZAADBLRUaGUgcHJvdmlkZWQgdW4tc3Rha2VyIGlzIG5vdCBpbiB0aGUgYFF1ZXVlYC4sQWxyZWFkeUhlYWQABAQFAVRoZSBwcm92aWRlZCB1bi1zdGFrZXIgaXMgYWxyZWFkeSBpbiBIZWFkLCBhbmQgY2Fubm90IGRlcmVnaXN0ZXIuOENhbGxOb3RBbGxvd2VkAAUEHQFUaGUgY2FsbCBpcyBub3QgYWxsb3dlZCBhdCB0aGlzIHBvaW50IGJlY2F1c2UgdGhlIHBhbGxldCBpcyBub3QgYWN0aXZlLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC4tDAxscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zNGNvbmZpZ3VyYXRpb25ESG9zdENvbmZpZ3VyYXRpb24ELEJsb2NrTnVtYmVyARAAjAE0bWF4X2NvZGVfc2l6ZRABDHUzMgABSG1heF9oZWFkX2RhdGFfc2l6ZRABDHUzMgABWG1heF91cHdhcmRfcXVldWVfY291bnQQAQx1MzIAAVRtYXhfdXB3YXJkX3F1ZXVlX3NpemUQAQx1MzIAAVxtYXhfdXB3YXJkX21lc3NhZ2Vfc2l6ZRABDHUzMgABkG1heF91cHdhcmRfbWVzc2FnZV9udW1fcGVyX2NhbmRpZGF0ZRABDHUzMgABiGhybXBfbWF4X21lc3NhZ2VfbnVtX3Blcl9jYW5kaWRhdGUQAQx1MzIAAWx2YWxpZGF0aW9uX3VwZ3JhZGVfY29vbGRvd24QASxCbG9ja051bWJlcgABYHZhbGlkYXRpb25fdXBncmFkZV9kZWxheRABLEJsb2NrTnVtYmVyAAFQYXN5bmNfYmFja2luZ19wYXJhbXO9BAFIQXN5bmNCYWNraW5nUGFyYW1zAAEwbWF4X3Bvdl9zaXplEAEMdTMyAAFkbWF4X2Rvd253YXJkX21lc3NhZ2Vfc2l6ZRABDHUzMgABkGhybXBfbWF4X3BhcmFjaGFpbl9vdXRib3VuZF9jaGFubmVscxABDHUzMgABTGhybXBfc2VuZGVyX2RlcG9zaXQYARxCYWxhbmNlAAFYaHJtcF9yZWNpcGllbnRfZGVwb3NpdBgBHEJhbGFuY2UAAWRocm1wX2NoYW5uZWxfbWF4X2NhcGFjaXR5EAEMdTMyAAFsaHJtcF9jaGFubmVsX21heF90b3RhbF9zaXplEAEMdTMyAAGMaHJtcF9tYXhfcGFyYWNoYWluX2luYm91bmRfY2hhbm5lbHMQAQx1MzIAAXRocm1wX2NoYW5uZWxfbWF4X21lc3NhZ2Vfc2l6ZRABDHUzMgABPGV4ZWN1dG9yX3BhcmFtc8EEAThFeGVjdXRvclBhcmFtcwABVGNvZGVfcmV0ZW50aW9uX3BlcmlvZBABLEJsb2NrTnVtYmVyAAE4bWF4X3ZhbGlkYXRvcnM9AgEsT3B0aW9uPHUzMj4AAThkaXNwdXRlX3BlcmlvZBABMFNlc3Npb25JbmRleAABpGRpc3B1dGVfcG9zdF9jb25jbHVzaW9uX2FjY2VwdGFuY2VfcGVyaW9kEAEsQmxvY2tOdW1iZXIAATRub19zaG93X3Nsb3RzEAEMdTMyAAFAbl9kZWxheV90cmFuY2hlcxABDHUzMgABaHplcm90aF9kZWxheV90cmFuY2hlX3dpZHRoEAEMdTMyAAFAbmVlZGVkX2FwcHJvdmFscxABDHUzMgABYHJlbGF5X3ZyZl9tb2R1bG9fc2FtcGxlcxABDHUzMgABOHB2Zl92b3RpbmdfdHRsEAEwU2Vzc2lvbkluZGV4AAGAbWluaW11bV92YWxpZGF0aW9uX3VwZ3JhZGVfZGVsYXkQASxCbG9ja051bWJlcgABVG1pbmltdW1fYmFja2luZ192b3RlcxABDHUzMgABNG5vZGVfZmVhdHVyZXP5BAEwTm9kZUZlYXR1cmVzAAFYYXBwcm92YWxfdm90aW5nX3BhcmFtc9UEAVBBcHByb3ZhbFZvdGluZ1BhcmFtcwABQHNjaGVkdWxlcl9wYXJhbXPZBAFwU2NoZWR1bGVyUGFyYW1zPEJsb2NrTnVtYmVyPgAAMQwAAAI1DAA1DAAABAgQLQwAOQwQbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWluczRjb25maWd1cmF0aW9uGHBhbGxldBRFcnJvcgQEVAABBDxJbnZhbGlkTmV3VmFsdWUAAATcVGhlIG5ldyB2YWx1ZSBmb3IgYSBjb25maWd1cmF0aW9uIHBhcmFtZXRlciBpcyBpbnZhbGlkLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC49DAAAAgEFAEEMAAAC+QEARQwMbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucxhzaGFyZWRoQWxsb3dlZFJlbGF5UGFyZW50c1RyYWNrZXIIEEhhc2gBNCxCbG9ja051bWJlcgEQAAgBGGJ1ZmZlckkMAVhWZWNEZXF1ZTwoSGFzaCwgSGFzaCk+AAE0bGF0ZXN0X251bWJlchABLEJsb2NrTnVtYmVyAABJDAAAAk0MAE0MAAAECDQ0AFEMAAACVQwAVQwMbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucyRpbmNsdXNpb25wQ2FuZGlkYXRlUGVuZGluZ0F2YWlsYWJpbGl0eQgESAE0BE4BEAAkARBjb3Jl9QcBJENvcmVJbmRleAABEGhhc2hVBQE0Q2FuZGlkYXRlSGFzaAABKGRlc2NyaXB0b3IVBQFYQ2FuZGlkYXRlRGVzY3JpcHRvcjxIPgABLGNvbW1pdG1lbnRzJQUBUENhbmRpZGF0ZUNvbW1pdG1lbnRzAAFIYXZhaWxhYmlsaXR5X3ZvdGVz+QQBYEJpdFZlYzx1OCwgQml0T3JkZXJMc2IwPgABHGJhY2tlcnP5BAFgQml0VmVjPHU4LCBCaXRPcmRlckxzYjA+AAFMcmVsYXlfcGFyZW50X251bWJlchABBE4AAUBiYWNrZWRfaW5fbnVtYmVyEAEETgABNGJhY2tpbmdfZ3JvdXD5BwEoR3JvdXBJbmRleAAAWQwQbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucyRpbmNsdXNpb24YcGFsbGV0FEVycm9yBARUAAFIZFZhbGlkYXRvckluZGV4T3V0T2ZCb3VuZHMAAAR4VmFsaWRhdG9yIGluZGV4IG91dCBvZiBib3VuZHMuUFVuc2NoZWR1bGVkQ2FuZGlkYXRlAAEErENhbmRpZGF0ZSBzdWJtaXR0ZWQgYnV0IHBhcmEgbm90IHNjaGVkdWxlZC5ASGVhZERhdGFUb29MYXJnZQACBKRIZWFkIGRhdGEgZXhjZWVkcyB0aGUgY29uZmlndXJlZCBtYXhpbXVtLlBQcmVtYXR1cmVDb2RlVXBncmFkZQADBGRDb2RlIHVwZ3JhZGUgcHJlbWF0dXJlbHkuPE5ld0NvZGVUb29MYXJnZQAEBGBPdXRwdXQgY29kZSBpcyB0b28gbGFyZ2VURGlzYWxsb3dlZFJlbGF5UGFyZW50AAUI7FRoZSBjYW5kaWRhdGUncyByZWxheS1wYXJlbnQgd2FzIG5vdCBhbGxvd2VkLiBFaXRoZXIgaXQgd2FzJQFub3QgcmVjZW50IGVub3VnaCBvciBpdCBkaWRuJ3QgYWR2YW5jZSBiYXNlZCBvbiB0aGUgbGFzdCBwYXJhY2hhaW4gYmxvY2suREludmFsaWRBc3NpZ25tZW50AAYIFQFGYWlsZWQgdG8gY29tcHV0ZSBncm91cCBpbmRleCBmb3IgdGhlIGNvcmU6IGVpdGhlciBpdCdzIG91dCBvZiBib3VuZHPob3IgdGhlIHJlbGF5IHBhcmVudCBkb2Vzbid0IGJlbG9uZyB0byB0aGUgY3VycmVudCBzZXNzaW9uLkRJbnZhbGlkR3JvdXBJbmRleAAHBJxJbnZhbGlkIGdyb3VwIGluZGV4IGluIGNvcmUgYXNzaWdubWVudC5MSW5zdWZmaWNpZW50QmFja2luZwAIBJBJbnN1ZmZpY2llbnQgKG5vbi1tYWpvcml0eSkgYmFja2luZy44SW52YWxpZEJhY2tpbmcACQTkSW52YWxpZCAoYmFkIHNpZ25hdHVyZSwgdW5rbm93biB2YWxpZGF0b3IsIGV0Yy4pIGJhY2tpbmcuRE5vdENvbGxhdG9yU2lnbmVkAAoEaENvbGxhdG9yIGRpZCBub3Qgc2lnbiBQb1YuaFZhbGlkYXRpb25EYXRhSGFzaE1pc21hdGNoAAsExFRoZSB2YWxpZGF0aW9uIGRhdGEgaGFzaCBkb2VzIG5vdCBtYXRjaCBleHBlY3RlZC6ASW5jb3JyZWN0RG93bndhcmRNZXNzYWdlSGFuZGxpbmcADATYVGhlIGRvd253YXJkIG1lc3NhZ2UgcXVldWUgaXMgbm90IHByb2Nlc3NlZCBjb3JyZWN0bHkuVEludmFsaWRVcHdhcmRNZXNzYWdlcwANBB0BQXQgbGVhc3Qgb25lIHVwd2FyZCBtZXNzYWdlIHNlbnQgZG9lcyBub3QgcGFzcyB0aGUgYWNjZXB0YW5jZSBjcml0ZXJpYS5gSHJtcFdhdGVybWFya01pc2hhbmRsaW5nAA4EEQFUaGUgY2FuZGlkYXRlIGRpZG4ndCBmb2xsb3cgdGhlIHJ1bGVzIG9mIEhSTVAgd2F0ZXJtYXJrIGFkdmFuY2VtZW50LkxJbnZhbGlkT3V0Ym91bmRIcm1wAA8E1FRoZSBIUk1QIG1lc3NhZ2VzIHNlbnQgYnkgdGhlIGNhbmRpZGF0ZSBpcyBub3QgdmFsaWQuZEludmFsaWRWYWxpZGF0aW9uQ29kZUhhc2gAEATcVGhlIHZhbGlkYXRpb24gY29kZSBoYXNoIG9mIHRoZSBjYW5kaWRhdGUgaXMgbm90IHZhbGlkLkBQYXJhSGVhZE1pc21hdGNoABEIVQFUaGUgYHBhcmFfaGVhZGAgaGFzaCBpbiB0aGUgY2FuZGlkYXRlIGRlc2NyaXB0b3IgZG9lc24ndCBtYXRjaCB0aGUgaGFzaCBvZiB0aGUgYWN0dWFsdHBhcmEgaGVhZCBpbiB0aGUgY29tbWl0bWVudHMuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0Ll0MDExwb2xrYWRvdF9wcmltaXRpdmVzCHY3TFNjcmFwZWRPbkNoYWluVm90ZXMEBEgBNAAMARxzZXNzaW9uEAEwU2Vzc2lvbkluZGV4AAGAYmFja2luZ192YWxpZGF0b3JzX3Blcl9jYW5kaWRhdGVhDAEdAVZlYzwoQ2FuZGlkYXRlUmVjZWlwdDxIPiwgVmVjPChWYWxpZGF0b3JJbmRleCwgVmFsaWRpdHlBdHRlc3RhdGlvbik+KQo+AAEgZGlzcHV0ZXNNBQFgTXVsdGlEaXNwdXRlU3RhdGVtZW50U2V0AABhDAAAAmUMAGUMAAAECPEHaQwAaQwAAAJtDABtDAAABAgBBUkFAHEMEGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnM4cGFyYXNfaW5oZXJlbnQYcGFsbGV0FEVycm9yBARUAAEUZFRvb01hbnlJbmNsdXNpb25JbmhlcmVudHMAAATMSW5jbHVzaW9uIGluaGVyZW50IGNhbGxlZCBtb3JlIHRoYW4gb25jZSBwZXIgYmxvY2suTEludmFsaWRQYXJlbnRIZWFkZXIAAQhVAVRoZSBoYXNoIG9mIHRoZSBzdWJtaXR0ZWQgcGFyZW50IGhlYWRlciBkb2Vzbid0IGNvcnJlc3BvbmQgdG8gdGhlIHNhdmVkIGJsb2NrIGhhc2ggb2YsdGhlIHBhcmVudC5ISW5oZXJlbnRPdmVyd2VpZ2h0AAIECQFUaGUgZGF0YSBnaXZlbiB0byB0aGUgaW5oZXJlbnQgd2lsbCByZXN1bHQgaW4gYW4gb3ZlcndlaWdodCBibG9jay6EQ2FuZGlkYXRlc0ZpbHRlcmVkRHVyaW5nRXhlY3V0aW9uAAMITQFBIGNhbmRpZGF0ZSB3YXMgZmlsdGVyZWQgZHVyaW5nIGluaGVyZW50IGV4ZWN1dGlvbi4gVGhpcyBzaG91bGQgaGF2ZSBvbmx5IGJlZW4gZG9uZUBkdXJpbmcgY3JlYXRpb24uUFVuc2NoZWR1bGVkQ2FuZGlkYXRlAAQEdFRvbyBtYW55IGNhbmRpZGF0ZXMgc3VwcGxpZWQuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LnUMAAACPQwAeQwAAAJ9DAB9DBBscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zJHNjaGVkdWxlchhwYWxsZXQwQ29yZU9jY3VwaWVkBAROARABCBBGcmVlAAAAFFBhcmFzBACBDAE0UGFyYXNFbnRyeTxOPgABAACBDBBscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zJHNjaGVkdWxlchhwYWxsZXQoUGFyYXNFbnRyeQQETgEQAAwBKGFzc2lnbm1lbnSFDAEoQXNzaWdubWVudAABVGF2YWlsYWJpbGl0eV90aW1lb3V0cxABDHUzMgABDHR0bBABBE4AAIUMEGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMkc2NoZWR1bGVyGGNvbW1vbihBc3NpZ25tZW50AAEIEFBvb2wIARxwYXJhX2lkaQIBGFBhcmFJZAABKGNvcmVfaW5kZXj1BwEkQ29yZUluZGV4AAAAEEJ1bGsEAGkCARhQYXJhSWQAAQAAiQwEIEJUcmVlTWFwCARLAfUHBFYBjQwABACRDAAAAI0MAAACgQwAkQwAAAKVDACVDAAABAj1B40MAJkMDGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMUcGFyYXNcUHZmQ2hlY2tBY3RpdmVWb3RlU3RhdGUELEJsb2NrTnVtYmVyARAAFAEwdm90ZXNfYWNjZXB0+QQBYEJpdFZlYzx1OCwgQml0T3JkZXJMc2IwPgABMHZvdGVzX3JlamVjdPkEAWBCaXRWZWM8dTgsIEJpdE9yZGVyTHNiMD4AAQxhZ2UQATBTZXNzaW9uSW5kZXgAAShjcmVhdGVkX2F0EAEsQmxvY2tOdW1iZXIAARhjYXVzZXOdDAF8VmVjPFB2ZkNoZWNrQ2F1c2U8QmxvY2tOdW1iZXI+PgAAnQwAAAKhDAChDAxscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zFHBhcmFzNFB2ZkNoZWNrQ2F1c2UELEJsb2NrTnVtYmVyARABCChPbmJvYXJkaW5nBABpAgEYUGFyYUlkAAAAHFVwZ3JhZGUMAQhpZGkCARhQYXJhSWQAASxpbmNsdWRlZF9hdBABLEJsb2NrTnVtYmVyAAFAdXBncmFkZV9zdHJhdGVneaUMATxVcGdyYWRlU3RyYXRlZ3kAAQAApQwMbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucxRwYXJhczxVcGdyYWRlU3RyYXRlZ3kAAQhAU2V0R29BaGVhZFNpZ25hbAAAAFBBcHBseUF0RXhwZWN0ZWRCbG9jawABAACpDAAAAiEFAK0MAAACaQIAsQwMbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucxRwYXJhczRQYXJhTGlmZWN5Y2xlAAEcKE9uYm9hcmRpbmcAAAAoUGFyYXRocmVhZAABACRQYXJhY2hhaW4AAgBMVXBncmFkaW5nUGFyYXRocmVhZAADAFBEb3duZ3JhZGluZ1BhcmFjaGFpbgAEAFRPZmZib2FyZGluZ1BhcmF0aHJlYWQABQBQT2ZmYm9hcmRpbmdQYXJhY2hhaW4ABgAAtQwAAAQIaQIQALkMDGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMUcGFyYXNAUGFyYVBhc3RDb2RlTWV0YQQETgEQAAgBNHVwZ3JhZGVfdGltZXO9DAFgVmVjPFJlcGxhY2VtZW50VGltZXM8Tj4+AAEsbGFzdF9wcnVuZWQ9AgEkT3B0aW9uPE4+AAC9DAAAAsEMAMEMDGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMUcGFyYXNAUmVwbGFjZW1lbnRUaW1lcwQETgEQAAgBLGV4cGVjdGVkX2F0EAEETgABMGFjdGl2YXRlZF9hdBABBE4AAMUMAAACtQwAyQwMTHBvbGthZG90X3ByaW1pdGl2ZXMIdjc4VXBncmFkZUdvQWhlYWQAAQgUQWJvcnQAAAAcR29BaGVhZAABAADNDAxMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2N0hVcGdyYWRlUmVzdHJpY3Rpb24AAQQcUHJlc2VudAAAAADRDAxscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zFHBhcmFzPFBhcmFHZW5lc2lzQXJncwAADAEwZ2VuZXNpc19oZWFkQQUBIEhlYWREYXRhAAE8dmFsaWRhdGlvbl9jb2RlPQUBOFZhbGlkYXRpb25Db2RlAAEkcGFyYV9raW5kIAEgUGFyYUtpbmQAANUMEGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMUcGFyYXMYcGFsbGV0FEVycm9yBARUAAE0NE5vdFJlZ2lzdGVyZWQAAASUUGFyYSBpcyBub3QgcmVnaXN0ZXJlZCBpbiBvdXIgc3lzdGVtLjRDYW5ub3RPbmJvYXJkAAEEFQFQYXJhIGNhbm5vdCBiZSBvbmJvYXJkZWQgYmVjYXVzZSBpdCBpcyBhbHJlYWR5IHRyYWNrZWQgYnkgb3VyIHN5c3RlbS44Q2Fubm90T2ZmYm9hcmQAAgScUGFyYSBjYW5ub3QgYmUgb2ZmYm9hcmRlZCBhdCB0aGlzIHRpbWUuNENhbm5vdFVwZ3JhZGUAAwTUUGFyYSBjYW5ub3QgYmUgdXBncmFkZWQgdG8gYSBsZWFzZSBob2xkaW5nIHBhcmFjaGFpbi48Q2Fubm90RG93bmdyYWRlAAQE0FBhcmEgY2Fubm90IGJlIGRvd25ncmFkZWQgdG8gYW4gb24tZGVtYW5kIHBhcmFjaGFpbi5YUHZmQ2hlY2tTdGF0ZW1lbnRTdGFsZQAFBLBUaGUgc3RhdGVtZW50IGZvciBQVkYgcHJlLWNoZWNraW5nIGlzIHN0YWxlLlxQdmZDaGVja1N0YXRlbWVudEZ1dHVyZQAGBOxUaGUgc3RhdGVtZW50IGZvciBQVkYgcHJlLWNoZWNraW5nIGlzIGZvciBhIGZ1dHVyZSBzZXNzaW9uLoRQdmZDaGVja1ZhbGlkYXRvckluZGV4T3V0T2ZCb3VuZHMABwSkQ2xhaW1lZCB2YWxpZGF0b3IgaW5kZXggaXMgb3V0IG9mIGJvdW5kcy5gUHZmQ2hlY2tJbnZhbGlkU2lnbmF0dXJlAAgEyFRoZSBzaWduYXR1cmUgZm9yIHRoZSBQVkYgcHJlLWNoZWNraW5nIGlzIGludmFsaWQuSFB2ZkNoZWNrRG91YmxlVm90ZQAJBLBUaGUgZ2l2ZW4gdmFsaWRhdG9yIGFscmVhZHkgaGFzIGNhc3QgYSB2b3RlLlhQdmZDaGVja1N1YmplY3RJbnZhbGlkAAoE9FRoZSBnaXZlbiBQVkYgZG9lcyBub3QgZXhpc3QgYXQgdGhlIG1vbWVudCBvZiBwcm9jZXNzIGEgdm90ZS5EQ2Fubm90VXBncmFkZUNvZGUACwTMUGFyYWNoYWluIGNhbm5vdCBjdXJyZW50bHkgc2NoZWR1bGUgYSBjb2RlIHVwZ3JhZGUuLEludmFsaWRDb2RlAAwEdEludmFsaWQgdmFsaWRhdGlvbiBjb2RlIHNpemUuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LtkMAAAC3QwA3QwMbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucyxpbml0aWFsaXplclRCdWZmZXJlZFNlc3Npb25DaGFuZ2UAAAwBKHZhbGlkYXRvcnNBDAFAVmVjPFZhbGlkYXRvcklkPgABGHF1ZXVlZEEMAUBWZWM8VmFsaWRhdG9ySWQ+AAE0c2Vzc2lvbl9pbmRleBABMFNlc3Npb25JbmRleAAA4QwAAALlDADlDAhgcG9sa2Fkb3RfY29yZV9wcmltaXRpdmVzWEluYm91bmREb3dud2FyZE1lc3NhZ2UELEJsb2NrTnVtYmVyARAACAEcc2VudF9hdBABLEJsb2NrTnVtYmVyAAEMbXNnOAE8RG93bndhcmRNZXNzYWdlAADpDAxscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zEGhybXBYSHJtcE9wZW5DaGFubmVsUmVxdWVzdAAAGAEkY29uZmlybWVkIAEQYm9vbAABEF9hZ2UQATBTZXNzaW9uSW5kZXgAAThzZW5kZXJfZGVwb3NpdBgBHEJhbGFuY2UAAUBtYXhfbWVzc2FnZV9zaXplEAEMdTMyAAEwbWF4X2NhcGFjaXR5EAEMdTMyAAE4bWF4X3RvdGFsX3NpemUQAQx1MzIAAO0MAAACgQUA8QwMbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucxBocm1wLEhybXBDaGFubmVsAAAgATBtYXhfY2FwYWNpdHkQAQx1MzIAAThtYXhfdG90YWxfc2l6ZRABDHUzMgABQG1heF9tZXNzYWdlX3NpemUQAQx1MzIAASRtc2dfY291bnQQAQx1MzIAASh0b3RhbF9zaXplEAEMdTMyAAEgbXFjX2hlYWR5AgEwT3B0aW9uPEhhc2g+AAE4c2VuZGVyX2RlcG9zaXQYARxCYWxhbmNlAAFEcmVjaXBpZW50X2RlcG9zaXQYARxCYWxhbmNlAAD1DAAAAvkMAPkMCGBwb2xrYWRvdF9jb3JlX3ByaW1pdGl2ZXNISW5ib3VuZEhybXBNZXNzYWdlBCxCbG9ja051bWJlcgEQAAgBHHNlbnRfYXQQASxCbG9ja051bWJlcgABEGRhdGE4AVBzcF9zdGQ6OnZlYzo6VmVjPHU4PgAA/QwAAAIBDQABDQAABAgQrQwABQ0QbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucxBocm1wGHBhbGxldBRFcnJvcgQEVAABUFRPcGVuSHJtcENoYW5uZWxUb1NlbGYAAATEVGhlIHNlbmRlciB0cmllZCB0byBvcGVuIGEgY2hhbm5lbCB0byB0aGVtc2VsdmVzLnxPcGVuSHJtcENoYW5uZWxJbnZhbGlkUmVjaXBpZW50AAEEiFRoZSByZWNpcGllbnQgaXMgbm90IGEgdmFsaWQgcGFyYS5sT3BlbkhybXBDaGFubmVsWmVyb0NhcGFjaXR5AAIEfFRoZSByZXF1ZXN0ZWQgY2FwYWNpdHkgaXMgemVyby6MT3BlbkhybXBDaGFubmVsQ2FwYWNpdHlFeGNlZWRzTGltaXQAAwTAVGhlIHJlcXVlc3RlZCBjYXBhY2l0eSBleGNlZWRzIHRoZSBnbG9iYWwgbGltaXQueE9wZW5Icm1wQ2hhbm5lbFplcm9NZXNzYWdlU2l6ZQAEBKBUaGUgcmVxdWVzdGVkIG1heGltdW0gbWVzc2FnZSBzaXplIGlzIDAumE9wZW5Icm1wQ2hhbm5lbE1lc3NhZ2VTaXplRXhjZWVkc0xpbWl0AAUEKQFUaGUgb3BlbiByZXF1ZXN0IHJlcXVlc3RlZCB0aGUgbWVzc2FnZSBzaXplIHRoYXQgZXhjZWVkcyB0aGUgZ2xvYmFsIGxpbWl0LnBPcGVuSHJtcENoYW5uZWxBbHJlYWR5RXhpc3RzAAYEaFRoZSBjaGFubmVsIGFscmVhZHkgZXhpc3RzfE9wZW5Icm1wQ2hhbm5lbEFscmVhZHlSZXF1ZXN0ZWQABwTQVGhlcmUgaXMgYWxyZWFkeSBhIHJlcXVlc3QgdG8gb3BlbiB0aGUgc2FtZSBjaGFubmVsLnBPcGVuSHJtcENoYW5uZWxMaW1pdEV4Y2VlZGVkAAgEHQFUaGUgc2VuZGVyIGFscmVhZHkgaGFzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBhbGxvd2VkIG91dGJvdW5kIGNoYW5uZWxzLnBBY2NlcHRIcm1wQ2hhbm5lbERvZXNudEV4aXN0AAkE4FRoZSBjaGFubmVsIGZyb20gdGhlIHNlbmRlciB0byB0aGUgb3JpZ2luIGRvZXNuJ3QgZXhpc3QuhEFjY2VwdEhybXBDaGFubmVsQWxyZWFkeUNvbmZpcm1lZAAKBIRUaGUgY2hhbm5lbCBpcyBhbHJlYWR5IGNvbmZpcm1lZC54QWNjZXB0SHJtcENoYW5uZWxMaW1pdEV4Y2VlZGVkAAsEJQFUaGUgcmVjaXBpZW50IGFscmVhZHkgaGFzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBhbGxvd2VkIGluYm91bmQgY2hhbm5lbHMucENsb3NlSHJtcENoYW5uZWxVbmF1dGhvcml6ZWQADARVAVRoZSBvcmlnaW4gdHJpZXMgdG8gY2xvc2UgYSBjaGFubmVsIHdoZXJlIGl0IGlzIG5laXRoZXIgdGhlIHNlbmRlciBub3IgdGhlIHJlY2lwaWVudC5sQ2xvc2VIcm1wQ2hhbm5lbERvZXNudEV4aXN0AA0EnFRoZSBjaGFubmVsIHRvIGJlIGNsb3NlZCBkb2Vzbid0IGV4aXN0LnxDbG9zZUhybXBDaGFubmVsQWxyZWFkeVVuZGVyd2F5AA4EvFRoZSBjaGFubmVsIGNsb3NlIHJlcXVlc3QgaXMgYWxyZWFkeSByZXF1ZXN0ZWQuhENhbmNlbEhybXBPcGVuQ2hhbm5lbFVuYXV0aG9yaXplZAAPBF0BQ2FuY2VsaW5nIGlzIHJlcXVlc3RlZCBieSBuZWl0aGVyIHRoZSBzZW5kZXIgbm9yIHJlY2lwaWVudCBvZiB0aGUgb3BlbiBjaGFubmVsIHJlcXVlc3QuaE9wZW5Icm1wQ2hhbm5lbERvZXNudEV4aXN0ABAEfFRoZSBvcGVuIHJlcXVlc3QgZG9lc24ndCBleGlzdC58T3BlbkhybXBDaGFubmVsQWxyZWFkeUNvbmZpcm1lZAARBC0BQ2Fubm90IGNhbmNlbCBhbiBIUk1QIG9wZW4gY2hhbm5lbCByZXF1ZXN0IGJlY2F1c2UgaXQgaXMgYWxyZWFkeSBjb25maXJtZWQuMFdyb25nV2l0bmVzcwASBIxUaGUgcHJvdmlkZWQgd2l0bmVzcyBkYXRhIGlzIHdyb25nLnBDaGFubmVsQ3JlYXRpb25Ob3RBdXRob3JpemVkABME6FRoZSBjaGFubmVsIGJldHdlZW4gdGhlc2UgdHdvIGNoYWlucyBjYW5ub3QgYmUgYXV0aG9yaXplZC4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQuCQ0AAAL9AQANDQxMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2NyxTZXNzaW9uSW5mbwAANAFgYWN0aXZlX3ZhbGlkYXRvcl9pbmRpY2VzPQwBTFZlYzxWYWxpZGF0b3JJbmRleD4AASxyYW5kb21fc2VlZAQBIFt1ODsgMzJdAAE4ZGlzcHV0ZV9wZXJpb2QQATBTZXNzaW9uSW5kZXgAASh2YWxpZGF0b3JzEQ0BnEluZGV4ZWRWZWM8VmFsaWRhdG9ySW5kZXgsIFZhbGlkYXRvcklkPgABOGRpc2NvdmVyeV9rZXlzqQkBZFZlYzxBdXRob3JpdHlEaXNjb3ZlcnlJZD4AATxhc3NpZ25tZW50X2tleXMJDQFEVmVjPEFzc2lnbm1lbnRJZD4AAUB2YWxpZGF0b3JfZ3JvdXBzFQ0BrEluZGV4ZWRWZWM8R3JvdXBJbmRleCwgVmVjPFZhbGlkYXRvckluZGV4Pj4AARxuX2NvcmVzEAEMdTMyAAFoemVyb3RoX2RlbGF5X3RyYW5jaGVfd2lkdGgQAQx1MzIAAWByZWxheV92cmZfbW9kdWxvX3NhbXBsZXMQAQx1MzIAAUBuX2RlbGF5X3RyYW5jaGVzEAEMdTMyAAE0bm9fc2hvd19zbG90cxABDHUzMgABQG5lZWRlZF9hcHByb3ZhbHMQAQx1MzIAABENDExwb2xrYWRvdF9wcmltaXRpdmVzCHY3KEluZGV4ZWRWZWMIBEsBAQUEVgH5AQAEAEEMARhWZWM8Vj4AABUNDExwb2xrYWRvdF9wcmltaXRpdmVzCHY3KEluZGV4ZWRWZWMIBEsB+QcEVgE9DAAEAHUMARhWZWM8Vj4AABkNAAAECBBVBQAdDQxMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2NzBEaXNwdXRlU3RhdGUEBE4BEAAQATh2YWxpZGF0b3JzX2ZvcvkEAXxCaXRWZWM8dTgsIGJpdHZlYzo6b3JkZXI6OkxzYjA+AAFIdmFsaWRhdG9yc19hZ2FpbnN0+QQBfEJpdFZlYzx1OCwgYml0dmVjOjpvcmRlcjo6THNiMD4AARRzdGFydBABBE4AATBjb25jbHVkZWRfYXQ9AgEkT3B0aW9uPE4+AAAhDQQgQlRyZWVTZXQEBFQBAQUABAA9DAAAACUNEGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMgZGlzcHV0ZXMYcGFsbGV0FEVycm9yBARUAAEkdER1cGxpY2F0ZURpc3B1dGVTdGF0ZW1lbnRTZXRzAAAEqER1cGxpY2F0ZSBkaXNwdXRlIHN0YXRlbWVudCBzZXRzIHByb3ZpZGVkLlxBbmNpZW50RGlzcHV0ZVN0YXRlbWVudAABBIxBbmNpZW50IGRpc3B1dGUgc3RhdGVtZW50IHByb3ZpZGVkLmRWYWxpZGF0b3JJbmRleE91dE9mQm91bmRzAAIE6FZhbGlkYXRvciBpbmRleCBvbiBzdGF0ZW1lbnQgaXMgb3V0IG9mIGJvdW5kcyBmb3Igc2Vzc2lvbi5ASW52YWxpZFNpZ25hdHVyZQADBHxJbnZhbGlkIHNpZ25hdHVyZSBvbiBzdGF0ZW1lbnQuSER1cGxpY2F0ZVN0YXRlbWVudAAEBMxWYWxpZGF0b3Igdm90ZSBzdWJtaXR0ZWQgbW9yZSB0aGFuIG9uY2UgdG8gZGlzcHV0ZS5IU2luZ2xlU2lkZWREaXNwdXRlAAUExEEgZGlzcHV0ZSB3aGVyZSB0aGVyZSBhcmUgb25seSB2b3RlcyBvbiBvbmUgc2lkZS48TWFsaWNpb3VzQmFja2VyAAYEnEEgZGlzcHV0ZSB2b3RlIGZyb20gYSBtYWxpY2lvdXMgYmFja2VyLkxNaXNzaW5nQmFja2luZ1ZvdGVzAAcE4E5vIGJhY2tpbmcgdm90ZXMgd2VyZSBwcm92aWRlcyBhbG9uZyBkaXNwdXRlIHN0YXRlbWVudHMuSFVuY29uZmlybWVkRGlzcHV0ZQAIBLBVbmNvbmZpcm1lZCBkaXNwdXRlIHN0YXRlbWVudCBzZXRzIHByb3ZpZGVkLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC4pDRBMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2NyBzbGFzaGluZzhQZW5kaW5nU2xhc2hlcwAACAEQa2V5cy0NAZRCVHJlZU1hcDxWYWxpZGF0b3JJbmRleCwgVmFsaWRhdG9ySWQ+AAEQa2luZJUFAUxTbGFzaGluZ09mZmVuY2VLaW5kAAAtDQQgQlRyZWVNYXAIBEsBAQUEVgH5AQAEADENAAAAMQ0AAAI1DQA1DQAABAgBBfkBADkNFGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMgZGlzcHV0ZXMgc2xhc2hpbmcYcGFsbGV0FEVycm9yBARUAAEYYEludmFsaWRLZXlPd25lcnNoaXBQcm9vZgAABIxUaGUga2V5IG93bmVyc2hpcCBwcm9vZiBpcyBpbnZhbGlkLkxJbnZhbGlkU2Vzc2lvbkluZGV4AAEEoFRoZSBzZXNzaW9uIGluZGV4IGlzIHRvbyBvbGQgb3IgaW52YWxpZC5QSW52YWxpZENhbmRpZGF0ZUhhc2gAAgR4VGhlIGNhbmRpZGF0ZSBoYXNoIGlzIGludmFsaWQuVEludmFsaWRWYWxpZGF0b3JJbmRleAADCAEBVGhlcmUgaXMgbm8gcGVuZGluZyBzbGFzaCBmb3IgdGhlIGdpdmVuIHZhbGlkYXRvciBpbmRleCBhbmQgdGltZRRzbG90LmBWYWxpZGF0b3JJbmRleElkTWlzbWF0Y2gABATQVGhlIHZhbGlkYXRvciBpbmRleCBkb2VzIG5vdCBtYXRjaCB0aGUgdmFsaWRhdG9yIGlkLlxEdXBsaWNhdGVTbGFzaGluZ1JlcG9ydAAFBA0BVGhlIGdpdmVuIHNsYXNoaW5nIHJlcG9ydCBpcyB2YWxpZCBidXQgYWxyZWFkeSBwcmV2aW91c2x5IHJlcG9ydGVkLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC49DRBscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zSGFzc2lnbmVyX29uX2RlbWFuZBR0eXBlc0RDb3JlQWZmaW5pdHlDb3VudAAACAEoY29yZV9pbmRlePUHASRDb3JlSW5kZXgAARRjb3VudBABDHUzMgAAQQ0QbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWluc0hhc3NpZ25lcl9vbl9kZW1hbmQUdHlwZXM8UXVldWVTdGF0dXNUeXBlAAAQARx0cmFmZmljIQcBJEZpeGVkVTEyOAABKG5leHRfaW5kZXhFDQEoUXVldWVJbmRleAABOHNtYWxsZXN0X2luZGV4RQ0BKFF1ZXVlSW5kZXgAATRmcmVlZF9pbmRpY2VzSQ0BdEJpbmFyeUhlYXA8UmV2ZXJzZVF1ZXVlSW5kZXg+AABFDRBscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zSGFzc2lnbmVyX29uX2RlbWFuZBR0eXBlcyhRdWV1ZUluZGV4AAAEABABDHUzMgAASQ0EKEJpbmFyeUhlYXAEBFQBTQ0ABABRDQAAAE0NEGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnNIYXNzaWduZXJfb25fZGVtYW5kFHR5cGVzRFJldmVyc2VRdWV1ZUluZGV4AAAEABABDHUzMgAAUQ0AAAJNDQBVDQQoQmluYXJ5SGVhcAQEVAFZDQAEAF0NAAAAWQ0QbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWluc0hhc3NpZ25lcl9vbl9kZW1hbmQUdHlwZXM0RW5xdWV1ZWRPcmRlcgAACAEccGFyYV9pZGkCARhQYXJhSWQAAQxpZHhFDQEoUXVldWVJbmRleAAAXQ0AAAJZDQBhDQxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUARgEUwAABABlDQEYVmVjPFQ+AABlDQAAAhgAaQ0QbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWluc0hhc3NpZ25lcl9vbl9kZW1hbmQYcGFsbGV0FEVycm9yBARUAAEIJFF1ZXVlRnVsbAAABORUaGUgb3JkZXIgcXVldWUgaXMgZnVsbCwgYHBsYWNlX29yZGVyYCB3aWxsIG5vdCBjb250aW51ZS5wU3BvdFByaWNlSGlnaGVyVGhhbk1heEFtb3VudAABCE0BVGhlIGN1cnJlbnQgc3BvdCBwcmljZSBpcyBoaWdoZXIgdGhhbiB0aGUgbWF4IGFtb3VudCBzcGVjaWZpZWQgaW4gdGhlIGBwbGFjZV9vcmRlcmBgY2FsbCwgbWFraW5nIGl0IGludmFsaWQuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0Lm0NAAAECBD1BwBxDQxscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zRGFzc2lnbmVyX2NvcmV0aW1lIFNjaGVkdWxlBAROARAADAEsYXNzaWdubWVudHPFBQGMVmVjPChDb3JlQXNzaWdubWVudCwgUGFydHNPZjU3NjAwKT4AASBlbmRfaGludD0CASRPcHRpb248Tj4AATRuZXh0X3NjaGVkdWxlPQIBJE9wdGlvbjxOPgAAdQ0MbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWluc0Rhc3NpZ25lcl9jb3JldGltZThDb3JlRGVzY3JpcHRvcgQETgEQAAgBFHF1ZXVleQ0BaE9wdGlvbjxRdWV1ZURlc2NyaXB0b3I8Tj4+AAEwY3VycmVudF93b3JrgQ0BUE9wdGlvbjxXb3JrU3RhdGU8Tj4+AAB5DQQYT3B0aW9uBARUAX0NAQgQTm9uZQAAABBTb21lBAB9DQAAAQAAfQ0MbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWluc0Rhc3NpZ25lcl9jb3JldGltZTxRdWV1ZURlc2NyaXB0b3IEBE4BEAAIARRmaXJzdBABBE4AARBsYXN0EAEETgAAgQ0EGE9wdGlvbgQEVAGFDQEIEE5vbmUAAAAQU29tZQQAhQ0AAAEAAIUNDGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnNEYXNzaWduZXJfY29yZXRpbWUkV29ya1N0YXRlBAROARAAEAEsYXNzaWdubWVudHOJDQGYVmVjPChDb3JlQXNzaWdubWVudCwgQXNzaWdubWVudFN0YXRlKT4AASBlbmRfaGludD0CASRPcHRpb248Tj4AAQxwb3NVAQEMdTE2AAEQc3RlcNEFATBQYXJ0c09mNTc2MDAAAIkNAAACjQ0AjQ0AAAQIzQWRDQCRDQxscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zRGFzc2lnbmVyX2NvcmV0aW1lPEFzc2lnbm1lbnRTdGF0ZQAACAEUcmF0aW/RBQEwUGFydHNPZjU3NjAwAAEkcmVtYWluaW5n0QUBMFBhcnRzT2Y1NzYwMAAAlQ0QbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWluc0Rhc3NpZ25lcl9jb3JldGltZRhwYWxsZXQURXJyb3IEBFQAARhAQXNzaWdubWVudHNFbXB0eQAAADRPdmVyU2NoZWR1bGVkAAEEkEFzc2lnbm1lbnRzIHRvZ2V0aGVyIGV4Y2VlZGVkIDU3NjAwLjhVbmRlclNjaGVkdWxlZAACBJBBc3NpZ25tZW50cyB0b2dldGhlciBsZXNzIHRoYW4gNTc2MDBARGlzYWxsb3dlZEluc2VydAADCFEBYXNzaWduX2NvcmUgaXMgb25seSBhbGxvd2VkIHRvIGFwcGVuZCBuZXcgYXNzaWdubWVudHMgYXQgdGhlIGVuZCBvZiBhbHJlYWR5IGV4aXN0aW5nFG9uZXMuPER1cGxpY2F0ZUluc2VydAAEBFUBVHJpZWQgdG8gaW5zZXJ0IGEgc2NoZWR1bGUgZm9yIHRoZSBzYW1lIGNvcmUgYW5kIGJsb2NrIG51bWJlciBhcyBhbiBleGlzdGluZyBzY2hlZHVsZVBBc3NpZ25tZW50c05vdFNvcnRlZAAFBKxUcmllZCB0byBhZGQgYW4gdW5zb3J0ZWQgc2V0IG9mIGFzc2lnbm1lbnRzBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LpkNDFxwb2xrYWRvdF9ydW50aW1lX2NvbW1vbjxwYXJhc19yZWdpc3RyYXIgUGFyYUluZm8IHEFjY291bnQBABxCYWxhbmNlARgADAEcbWFuYWdlcgABHEFjY291bnQAARxkZXBvc2l0GAEcQmFsYW5jZQABGGxvY2tlZLECATBPcHRpb248Ym9vbD4AAJ0NEFxwb2xrYWRvdF9ydW50aW1lX2NvbW1vbjxwYXJhc19yZWdpc3RyYXIYcGFsbGV0FEVycm9yBARUAAE4NE5vdFJlZ2lzdGVyZWQAAARkVGhlIElEIGlzIG5vdCByZWdpc3RlcmVkLkRBbHJlYWR5UmVnaXN0ZXJlZAABBHRUaGUgSUQgaXMgYWxyZWFkeSByZWdpc3RlcmVkLiBOb3RPd25lcgACBJxUaGUgY2FsbGVyIGlzIG5vdCB0aGUgb3duZXIgb2YgdGhpcyBJZC4wQ29kZVRvb0xhcmdlAAMEXEludmFsaWQgcGFyYSBjb2RlIHNpemUuQEhlYWREYXRhVG9vTGFyZ2UABARwSW52YWxpZCBwYXJhIGhlYWQgZGF0YSBzaXplLjBOb3RQYXJhY2hhaW4ABQRgUGFyYSBpcyBub3QgYSBQYXJhY2hhaW4uNE5vdFBhcmF0aHJlYWQABgS8UGFyYSBpcyBub3QgYSBQYXJhdGhyZWFkIChvbi1kZW1hbmQgcGFyYWNoYWluKS5AQ2Fubm90RGVyZWdpc3RlcgAHBFhDYW5ub3QgZGVyZWdpc3RlciBwYXJhPENhbm5vdERvd25ncmFkZQAIBC0BQ2Fubm90IHNjaGVkdWxlIGRvd25ncmFkZSBvZiBsZWFzZSBob2xkaW5nIHBhcmFjaGFpbiB0byBvbi1kZW1hbmQgcGFyYWNoYWluNENhbm5vdFVwZ3JhZGUACQQlAUNhbm5vdCBzY2hlZHVsZSB1cGdyYWRlIG9mIG9uLWRlbWFuZCBwYXJhY2hhaW4gdG8gbGVhc2UgaG9sZGluZyBwYXJhY2hhaW4oUGFyYUxvY2tlZAAKCEkBUGFyYSBpcyBsb2NrZWQgZnJvbSBtYW5pcHVsYXRpb24gYnkgdGhlIG1hbmFnZXIuIE11c3QgdXNlIHBhcmFjaGFpbiBvciByZWxheSBjaGFpbixnb3Zlcm5hbmNlLixOb3RSZXNlcnZlZAALBNBUaGUgSUQgZ2l2ZW4gZm9yIHJlZ2lzdHJhdGlvbiBoYXMgbm90IGJlZW4gcmVzZXJ2ZWQuLEludmFsaWRDb2RlAAwEfFRoZSB2YWxpZGF0aW9uIGNvZGUgaXMgaW52YWxpZC4oQ2Fubm90U3dhcAANCFEBQ2Fubm90IHBlcmZvcm0gYSBwYXJhY2hhaW4gc2xvdCAvIGxpZmVjeWNsZSBzd2FwLiBDaGVjayB0aGF0IHRoZSBzdGF0ZSBvZiBib3RoIHBhcmFzhGFyZSBjb3JyZWN0IGZvciB0aGUgc3dhcCB0byB3b3JrLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC6hDQAAAikLAKUNEFxwb2xrYWRvdF9ydW50aW1lX2NvbW1vbhRzbG90cxhwYWxsZXQURXJyb3IEBFQAAQhEUGFyYU5vdE9uYm9hcmRpbmcAAASMVGhlIHBhcmFjaGFpbiBJRCBpcyBub3Qgb25ib2FyZGluZy4oTGVhc2VFcnJvcgABBIhUaGVyZSB3YXMgYW4gZXJyb3Igd2l0aCB0aGUgbGVhc2UuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LqkNAAAECABpAgCtDQAAAyQAAACxDQCxDQQYT3B0aW9uBARUAbUNAQgQTm9uZQAAABBTb21lBAC1DQAAAQAAtQ0AAAQMAGkCGAC5DRBccG9sa2Fkb3RfcnVudGltZV9jb21tb24gYXVjdGlvbnMYcGFsbGV0FEVycm9yBARUAAEcREF1Y3Rpb25JblByb2dyZXNzAAAEkFRoaXMgYXVjdGlvbiBpcyBhbHJlYWR5IGluIHByb2dyZXNzLkRMZWFzZVBlcmlvZEluUGFzdAABBIBUaGUgbGVhc2UgcGVyaW9kIGlzIGluIHRoZSBwYXN0LkRQYXJhTm90UmVnaXN0ZXJlZAACBFhQYXJhIGlzIG5vdCByZWdpc3RlcmVkRE5vdEN1cnJlbnRBdWN0aW9uAAMEWE5vdCBhIGN1cnJlbnQgYXVjdGlvbi4oTm90QXVjdGlvbgAEBDxOb3QgYW4gYXVjdGlvbi4wQXVjdGlvbkVuZGVkAAUEaEF1Y3Rpb24gaGFzIGFscmVhZHkgZW5kZWQuQEFscmVhZHlMZWFzZWRPdXQABgTYVGhlIHBhcmEgaXMgYWxyZWFkeSBsZWFzZWQgb3V0IGZvciBwYXJ0IG9mIHRoaXMgcmFuZ2UuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0Lr0NDFxwb2xrYWRvdF9ydW50aW1lX2NvbW1vbiRjcm93ZGxvYW4gRnVuZEluZm8QJEFjY291bnRJZAEAHEJhbGFuY2UBGCxCbG9ja051bWJlcgEQLExlYXNlUGVyaW9kARAAKAEkZGVwb3NpdG9yAAEkQWNjb3VudElkAAEgdmVyaWZpZXKxBQFMT3B0aW9uPE11bHRpU2lnbmVyPgABHGRlcG9zaXQYARxCYWxhbmNlAAEYcmFpc2VkGAEcQmFsYW5jZQABDGVuZBABLEJsb2NrTnVtYmVyAAEMY2FwGAEcQmFsYW5jZQABRGxhc3RfY29udHJpYnV0aW9uwQ0BdExhc3RDb250cmlidXRpb248QmxvY2tOdW1iZXI+AAEwZmlyc3RfcGVyaW9kEAEsTGVhc2VQZXJpb2QAASxsYXN0X3BlcmlvZBABLExlYXNlUGVyaW9kAAEoZnVuZF9pbmRleBABJEZ1bmRJbmRleAAAwQ0MXHBvbGthZG90X3J1bnRpbWVfY29tbW9uJGNyb3dkbG9hbkBMYXN0Q29udHJpYnV0aW9uBCxCbG9ja051bWJlcgEQAQwUTmV2ZXIAAAAkUHJlRW5kaW5nBAAQAQx1MzIAAQAYRW5kaW5nBAAQASxCbG9ja051bWJlcgACAADFDRBccG9sa2Fkb3RfcnVudGltZV9jb21tb24kY3Jvd2Rsb2FuGHBhbGxldBRFcnJvcgQEVAABXERGaXJzdFBlcmlvZEluUGFzdAAABPRUaGUgY3VycmVudCBsZWFzZSBwZXJpb2QgaXMgbW9yZSB0aGFuIHRoZSBmaXJzdCBsZWFzZSBwZXJpb2QuZEZpcnN0UGVyaW9kVG9vRmFySW5GdXR1cmUAAQQRAVRoZSBmaXJzdCBsZWFzZSBwZXJpb2QgbmVlZHMgdG8gYXQgbGVhc3QgYmUgbGVzcyB0aGFuIDMgYG1heF92YWx1ZWAubExhc3RQZXJpb2RCZWZvcmVGaXJzdFBlcmlvZAACBOhMYXN0IGxlYXNlIHBlcmlvZCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBmaXJzdCBsZWFzZSBwZXJpb2QuYExhc3RQZXJpb2RUb29GYXJJbkZ1dHVyZQADBC0BVGhlIGxhc3QgbGVhc2UgcGVyaW9kIGNhbm5vdCBiZSBtb3JlIHRoYW4gMyBwZXJpb2RzIGFmdGVyIHRoZSBmaXJzdCBwZXJpb2QuPENhbm5vdEVuZEluUGFzdAAEBEUBVGhlIGNhbXBhaWduIGVuZHMgYmVmb3JlIHRoZSBjdXJyZW50IGJsb2NrIG51bWJlci4gVGhlIGVuZCBtdXN0IGJlIGluIHRoZSBmdXR1cmUuREVuZFRvb0ZhckluRnV0dXJlAAUEwFRoZSBlbmQgZGF0ZSBmb3IgdGhpcyBjcm93ZGxvYW4gaXMgbm90IHNlbnNpYmxlLiBPdmVyZmxvdwAGBFhUaGVyZSB3YXMgYW4gb3ZlcmZsb3cuUENvbnRyaWJ1dGlvblRvb1NtYWxsAAcE6FRoZSBjb250cmlidXRpb24gd2FzIGJlbG93IHRoZSBtaW5pbXVtLCBgTWluQ29udHJpYnV0aW9uYC40SW52YWxpZFBhcmFJZAAIBExJbnZhbGlkIGZ1bmQgaW5kZXguLENhcEV4Y2VlZGVkAAkEkENvbnRyaWJ1dGlvbnMgZXhjZWVkIG1heGltdW0gYW1vdW50LlhDb250cmlidXRpb25QZXJpb2RPdmVyAAoEqFRoZSBjb250cmlidXRpb24gcGVyaW9kIGhhcyBhbHJlYWR5IGVuZGVkLjRJbnZhbGlkT3JpZ2luAAsEjFRoZSBvcmlnaW4gb2YgdGhpcyBjYWxsIGlzIGludmFsaWQuME5vdFBhcmFjaGFpbgAMBMhUaGlzIGNyb3dkbG9hbiBkb2VzIG5vdCBjb3JyZXNwb25kIHRvIGEgcGFyYWNoYWluLixMZWFzZUFjdGl2ZQANBBUBVGhpcyBwYXJhY2hhaW4gbGVhc2UgaXMgc3RpbGwgYWN0aXZlIGFuZCByZXRpcmVtZW50IGNhbm5vdCB5ZXQgYmVnaW4uQEJpZE9yTGVhc2VBY3RpdmUADgQxAVRoaXMgcGFyYWNoYWluJ3MgYmlkIG9yIGxlYXNlIGlzIHN0aWxsIGFjdGl2ZSBhbmQgd2l0aGRyYXcgY2Fubm90IHlldCBiZWdpbi4wRnVuZE5vdEVuZGVkAA8EgFRoZSBjcm93ZGxvYW4gaGFzIG5vdCB5ZXQgZW5kZWQuPE5vQ29udHJpYnV0aW9ucwAQBNBUaGVyZSBhcmUgbm8gY29udHJpYnV0aW9ucyBzdG9yZWQgaW4gdGhpcyBjcm93ZGxvYW4uSE5vdFJlYWR5VG9EaXNzb2x2ZQARCFUBVGhlIGNyb3dkbG9hbiBpcyBub3QgcmVhZHkgdG8gZGlzc29sdmUuIFBvdGVudGlhbGx5IHN0aWxsIGhhcyBhIHNsb3Qgb3IgaW4gcmV0aXJlbWVudBxwZXJpb2QuQEludmFsaWRTaWduYXR1cmUAEgRISW52YWxpZCBzaWduYXR1cmUuME1lbW9Ub29MYXJnZQATBHxUaGUgcHJvdmlkZWQgbWVtbyBpcyB0b28gbGFyZ2UuREFscmVhZHlJbk5ld1JhaXNlABQEhFRoZSBmdW5kIGlzIGFscmVhZHkgaW4gYE5ld1JhaXNlYEhWcmZEZWxheUluUHJvZ3Jlc3MAFQS0Tm8gY29udHJpYnV0aW9ucyBhbGxvd2VkIGR1cmluZyB0aGUgVlJGIGRlbGF5NE5vTGVhc2VQZXJpb2QAFgQtAUEgbGVhc2UgcGVyaW9kIGhhcyBub3Qgc3RhcnRlZCB5ZXQsIGR1ZSB0byBhbiBvZmZzZXQgaW4gdGhlIHN0YXJ0aW5nIGJsb2NrLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC7JDRBscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zIGNvcmV0aW1lGHBhbGxldBRFcnJvcgQEVAABDCROb3RCcm9rZXIAAAQpAVRoZSBwYXJhaWQgbWFraW5nIHRoZSBjYWxsIGlzIG5vdCB0aGUgY29yZXRpbWUgYnJva2VyYWdlIHN5c3RlbSBwYXJhY2hhaW4uWFJlcXVlc3RlZEZ1dHVyZVJldmVudWUAAQhFAVJlcXVlc3RlZCByZXZlbnVlIGluZm9ybWF0aW9uIGB3aGVuYCBwYXJhbWV0ZXIgd2FzIGluIHRoZSBmdXR1cmUgZnJvbSB0aGUgY3VycmVudDRibG9jayBoZWlnaHQuTEFzc2V0VHJhbnNmZXJGYWlsZWQAAgS8RmFpbGVkIHRvIHRyYW5zZmVyIGFzc2V0cyB0byB0aGUgY29yZXRpbWUgY2hhaW4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQuzQ0MKHBhbGxldF94Y20YcGFsbGV0LFF1ZXJ5U3RhdHVzBCxCbG9ja051bWJlcgEQAQwcUGVuZGluZxABJHJlc3BvbmRlci0BAURWZXJzaW9uZWRMb2NhdGlvbgABTG1heWJlX21hdGNoX3F1ZXJpZXLRDQFkT3B0aW9uPFZlcnNpb25lZExvY2F0aW9uPgABMG1heWJlX25vdGlmedUNAUBPcHRpb248KHU4LCB1OCk+AAEcdGltZW91dBABLEJsb2NrTnVtYmVyAAAAPFZlcnNpb25Ob3RpZmllcggBGG9yaWdpbi0BAURWZXJzaW9uZWRMb2NhdGlvbgABJGlzX2FjdGl2ZSABEGJvb2wAAQAUUmVhZHkIASByZXNwb25zZd0NAURWZXJzaW9uZWRSZXNwb25zZQABCGF0EAEsQmxvY2tOdW1iZXIAAgAA0Q0EGE9wdGlvbgQEVAEtAQEIEE5vbmUAAAAQU29tZQQALQEAAAEAANUNBBhPcHRpb24EBFQB2Q0BCBBOb25lAAAAEFNvbWUEANkNAAABAADZDQAABAgICADdDQgMeGNtRFZlcnNpb25lZFJlc3BvbnNlAAEMCFYyBAAFBgEwdjI6OlJlc3BvbnNlAAIACFYzBABNBgEwdjM6OlJlc3BvbnNlAAMACFY0BACxBgEwdjQ6OlJlc3BvbnNlAAQAAOENAAAECBAtAQDlDQAABAwwKBAA6Q0MTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAHtDQRTAAAEAPENARhWZWM8VD4AAO0NAAAECC0BEADxDQAAAu0NAPUNDChwYWxsZXRfeGNtGHBhbGxldFRWZXJzaW9uTWlncmF0aW9uU3RhZ2UAARBcTWlncmF0ZVN1cHBvcnRlZFZlcnNpb24AAABcTWlncmF0ZVZlcnNpb25Ob3RpZmllcnMAAQBQTm90aWZ5Q3VycmVudFRhcmdldHMEAPkNATxPcHRpb248VmVjPHU4Pj4AAgBoTWlncmF0ZUFuZE5vdGlmeU9sZFRhcmdldHMAAwAA+Q0EGE9wdGlvbgQEVAE4AQgQTm9uZQAAABBTb21lBAA4AAABAAD9DQAABAwQAA0HAAEODChwYWxsZXRfeGNtGHBhbGxldGhSZW1vdGVMb2NrZWRGdW5naWJsZVJlY29yZAhIQ29uc3VtZXJJZGVudGlmaWVyAaEBME1heENvbnN1bWVycwAAEAEYYW1vdW50GAEQdTEyOAABFG93bmVyLQEBRFZlcnNpb25lZExvY2F0aW9uAAEYbG9ja2VyLQEBRFZlcnNpb25lZExvY2F0aW9uAAEkY29uc3VtZXJzBQ4B0EJvdW5kZWRWZWM8KENvbnN1bWVySWRlbnRpZmllciwgdTEyOCksIE1heENvbnN1bWVycz4AAAUODExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBCQ4EUwAABAANDgEYVmVjPFQ+AAAJDgAABAihARgADQ4AAAIJDgARDgxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUARUOBFMAAAQAGQ4BGFZlYzxUPgAAFQ4AAAQIGC0BABkOAAACFQ4AHQ4MKHBhbGxldF94Y20YcGFsbGV0FEVycm9yBARUAAFgLFVucmVhY2hhYmxlAAAIXQFUaGUgZGVzaXJlZCBkZXN0aW5hdGlvbiB3YXMgdW5yZWFjaGFibGUsIGdlbmVyYWxseSBiZWNhdXNlIHRoZXJlIGlzIGEgbm8gd2F5IG9mIHJvdXRpbmcYdG8gaXQuLFNlbmRGYWlsdXJlAAEIQQFUaGVyZSB3YXMgc29tZSBvdGhlciBpc3N1ZSAoaS5lLiBub3QgdG8gZG8gd2l0aCByb3V0aW5nKSBpbiBzZW5kaW5nIHRoZSBtZXNzYWdlLshQZXJoYXBzIGEgbGFjayBvZiBzcGFjZSBmb3IgYnVmZmVyaW5nIHRoZSBtZXNzYWdlLiBGaWx0ZXJlZAACBJxUaGUgbWVzc2FnZSBleGVjdXRpb24gZmFpbHMgdGhlIGZpbHRlci5IVW53ZWlnaGFibGVNZXNzYWdlAAMEtFRoZSBtZXNzYWdlJ3Mgd2VpZ2h0IGNvdWxkIG5vdCBiZSBkZXRlcm1pbmVkLmBEZXN0aW5hdGlvbk5vdEludmVydGlibGUABATcVGhlIGRlc3RpbmF0aW9uIGBMb2NhdGlvbmAgcHJvdmlkZWQgY2Fubm90IGJlIGludmVydGVkLhRFbXB0eQAFBIBUaGUgYXNzZXRzIHRvIGJlIHNlbnQgYXJlIGVtcHR5LjhDYW5ub3RSZWFuY2hvcgAGBDUBQ291bGQgbm90IHJlLWFuY2hvciB0aGUgYXNzZXRzIHRvIGRlY2xhcmUgdGhlIGZlZXMgZm9yIHRoZSBkZXN0aW5hdGlvbiBjaGFpbi40VG9vTWFueUFzc2V0cwAHBMRUb28gbWFueSBhc3NldHMgaGF2ZSBiZWVuIGF0dGVtcHRlZCBmb3IgdHJhbnNmZXIuNEludmFsaWRPcmlnaW4ACAR4T3JpZ2luIGlzIGludmFsaWQgZm9yIHNlbmRpbmcuKEJhZFZlcnNpb24ACQQhAVRoZSB2ZXJzaW9uIG9mIHRoZSBgVmVyc2lvbmVkYCB2YWx1ZSB1c2VkIGlzIG5vdCBhYmxlIHRvIGJlIGludGVycHJldGVkLixCYWRMb2NhdGlvbgAKCEEBVGhlIGdpdmVuIGxvY2F0aW9uIGNvdWxkIG5vdCBiZSB1c2VkIChlLmcuIGJlY2F1c2UgaXQgY2Fubm90IGJlIGV4cHJlc3NlZCBpbiB0aGVgZGVzaXJlZCB2ZXJzaW9uIG9mIFhDTSkuOE5vU3Vic2NyaXB0aW9uAAsEvFRoZSByZWZlcmVuY2VkIHN1YnNjcmlwdGlvbiBjb3VsZCBub3QgYmUgZm91bmQuREFscmVhZHlTdWJzY3JpYmVkAAwEEQFUaGUgbG9jYXRpb24gaXMgaW52YWxpZCBzaW5jZSBpdCBhbHJlYWR5IGhhcyBhIHN1YnNjcmlwdGlvbiBmcm9tIHVzLlhDYW5ub3RDaGVja091dFRlbGVwb3J0AA0EKQFDb3VsZCBub3QgY2hlY2stb3V0IHRoZSBhc3NldHMgZm9yIHRlbGVwb3J0YXRpb24gdG8gdGhlIGRlc3RpbmF0aW9uIGNoYWluLihMb3dCYWxhbmNlAA4EQQFUaGUgb3duZXIgZG9lcyBub3Qgb3duIChhbGwpIG9mIHRoZSBhc3NldCB0aGF0IHRoZXkgd2lzaCB0byBkbyB0aGUgb3BlcmF0aW9uIG9uLjBUb29NYW55TG9ja3MADwTAVGhlIGFzc2V0IG93bmVyIGhhcyB0b28gbWFueSBsb2NrcyBvbiB0aGUgYXNzZXQuTEFjY291bnROb3RTb3ZlcmVpZ24AEAQxAVRoZSBnaXZlbiBhY2NvdW50IGlzIG5vdCBhbiBpZGVudGlmaWFibGUgc292ZXJlaWduIGFjY291bnQgZm9yIGFueSBsb2NhdGlvbi4oRmVlc05vdE1ldAARBCkBVGhlIG9wZXJhdGlvbiByZXF1aXJlZCBmZWVzIHRvIGJlIHBhaWQgd2hpY2ggdGhlIGluaXRpYXRvciBjb3VsZCBub3QgbWVldC4wTG9ja05vdEZvdW5kABIE9EEgcmVtb3RlIGxvY2sgd2l0aCB0aGUgY29ycmVzcG9uZGluZyBkYXRhIGNvdWxkIG5vdCBiZSBmb3VuZC4USW5Vc2UAEwRJAVRoZSB1bmxvY2sgb3BlcmF0aW9uIGNhbm5vdCBzdWNjZWVkIGJlY2F1c2UgdGhlcmUgYXJlIHN0aWxsIGNvbnN1bWVycyBvZiB0aGUgbG9jay5oSW52YWxpZEFzc2V0VW5rbm93blJlc2VydmUAFQTwSW52YWxpZCBhc3NldCwgcmVzZXJ2ZSBjaGFpbiBjb3VsZCBub3QgYmUgZGV0ZXJtaW5lZCBmb3IgaXQueEludmFsaWRBc3NldFVuc3VwcG9ydGVkUmVzZXJ2ZQAWBEUBSW52YWxpZCBhc3NldCwgZG8gbm90IHN1cHBvcnQgcmVtb3RlIGFzc2V0IHJlc2VydmVzIHdpdGggZGlmZmVyZW50IGZlZXMgcmVzZXJ2ZXMuPFRvb01hbnlSZXNlcnZlcwAXBEkBVG9vIG1hbnkgYXNzZXRzIHdpdGggZGlmZmVyZW50IHJlc2VydmUgbG9jYXRpb25zIGhhdmUgYmVlbiBhdHRlbXB0ZWQgZm9yIHRyYW5zZmVyLmBMb2NhbEV4ZWN1dGlvbkluY29tcGxldGUAGAR8TG9jYWwgWENNIGV4ZWN1dGlvbiBpbmNvbXBsZXRlLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC4hDghQcGFsbGV0X21lc3NhZ2VfcXVldWUkQm9va1N0YXRlBDRNZXNzYWdlT3JpZ2luARUHABgBFGJlZ2luEAEkUGFnZUluZGV4AAEMZW5kEAEkUGFnZUluZGV4AAEUY291bnQQASRQYWdlSW5kZXgAAUByZWFkeV9uZWlnaGJvdXJzJQ4BhE9wdGlvbjxOZWlnaGJvdXJzPE1lc3NhZ2VPcmlnaW4+PgABNG1lc3NhZ2VfY291bnQwAQx1NjQAARBzaXplMAEMdTY0AAAlDgQYT3B0aW9uBARUASkOAQgQTm9uZQAAABBTb21lBAApDgAAAQAAKQ4IUHBhbGxldF9tZXNzYWdlX3F1ZXVlKE5laWdoYm91cnMENE1lc3NhZ2VPcmlnaW4BFQcACAEQcHJldhUHATRNZXNzYWdlT3JpZ2luAAEQbmV4dBUHATRNZXNzYWdlT3JpZ2luAAAtDgAABAgVBxAAMQ4IUHBhbGxldF9tZXNzYWdlX3F1ZXVlEFBhZ2UIEFNpemUBECBIZWFwU2l6ZQAAGAEkcmVtYWluaW5nEAEQU2l6ZQABOHJlbWFpbmluZ19zaXplEAEQU2l6ZQABLGZpcnN0X2luZGV4EAEQU2l6ZQABFGZpcnN0EAEQU2l6ZQABEGxhc3QQARBTaXplAAEQaGVhcDUOAZxCb3VuZGVkVmVjPHU4LCBJbnRvVTMyPEhlYXBTaXplLCBTaXplPj4AADUODExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBCARTAAAEADgBGFZlYzxUPgAAOQ4MUHBhbGxldF9tZXNzYWdlX3F1ZXVlGHBhbGxldBRFcnJvcgQEVAABJCxOb3RSZWFwYWJsZQAACEkBUGFnZSBpcyBub3QgcmVhcGFibGUgYmVjYXVzZSBpdCBoYXMgaXRlbXMgcmVtYWluaW5nIHRvIGJlIHByb2Nlc3NlZCBhbmQgaXMgbm90IG9sZBxlbm91Z2guGE5vUGFnZQABBIRQYWdlIHRvIGJlIHJlYXBlZCBkb2VzIG5vdCBleGlzdC4kTm9NZXNzYWdlAAIEqFRoZSByZWZlcmVuY2VkIG1lc3NhZ2UgY291bGQgbm90IGJlIGZvdW5kLkBBbHJlYWR5UHJvY2Vzc2VkAAMEAQFUaGUgbWVzc2FnZSB3YXMgYWxyZWFkeSBwcm9jZXNzZWQgYW5kIGNhbm5vdCBiZSBwcm9jZXNzZWQgYWdhaW4uGFF1ZXVlZAAEBKxUaGUgbWVzc2FnZSBpcyBxdWV1ZWQgZm9yIGZ1dHVyZSBleGVjdXRpb24uSEluc3VmZmljaWVudFdlaWdodAAFBBkBVGhlcmUgaXMgdGVtcG9yYXJpbHkgbm90IGVub3VnaCB3ZWlnaHQgdG8gY29udGludWUgc2VydmljaW5nIG1lc3NhZ2VzLmBUZW1wb3JhcmlseVVucHJvY2Vzc2FibGUABhCoVGhpcyBtZXNzYWdlIGlzIHRlbXBvcmFyaWx5IHVucHJvY2Vzc2FibGUuAFkBU3VjaCBlcnJvcnMgYXJlIGV4cGVjdGVkLCBidXQgbm90IGd1YXJhbnRlZWQsIHRvIHJlc29sdmUgdGhlbXNlbHZlcyBldmVudHVhbGx5IHRocm91Z2gkcmV0cnlpbmcuLFF1ZXVlUGF1c2VkAAcM7FRoZSBxdWV1ZSBpcyBwYXVzZWQgYW5kIG5vIG1lc3NhZ2UgY2FuIGJlIGV4ZWN1dGVkIGZyb20gaXQuAB0BVGhpcyBjYW4gY2hhbmdlIGF0IGFueSB0aW1lIGFuZCBtYXkgcmVzb2x2ZSBpbiB0aGUgZnV0dXJlIGJ5IHJlLXRyeWluZy5MUmVjdXJzaXZlRGlzYWxsb3dlZAAIBDEBQW5vdGhlciBjYWxsIGlzIGluIHByb2dyZXNzIGFuZCBuZWVkcyB0byBmaW5pc2ggYmVmb3JlIHRoaXMgY2FsbCBjYW4gaGFwcGVuLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC49DgxEcGFsbGV0X2Fzc2V0X3JhdGUYcGFsbGV0FEVycm9yBARUAAEMQFVua25vd25Bc3NldEtpbmQAAAR4VGhlIGdpdmVuIGFzc2V0IElEIGlzIHVua25vd24uNEFscmVhZHlFeGlzdHMAAQRRAVRoZSBnaXZlbiBhc3NldCBJRCBhbHJlYWR5IGhhcyBhbiBhc3NpZ25lZCBjb252ZXJzaW9uIHJhdGUgYW5kIGNhbm5vdCBiZSByZS1jcmVhdGVkLiBPdmVyZmxvdwACBMxPdmVyZmxvdyBvY3VycmVkIHdoZW4gY2FsY3VsYXRpbmcgdGhlIGludmVyc2UgcmF0ZS4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQuQQ4MTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAEFAgRTAAAEAEUOARhWZWM8VD4AAEUOAAACBQIASQ4MMHBhbGxldF9iZWVmeRhwYWxsZXQURXJyb3IEBFQAARBgSW52YWxpZEtleU93bmVyc2hpcFByb29mAAAEMQFBIGtleSBvd25lcnNoaXAgcHJvb2YgcHJvdmlkZWQgYXMgcGFydCBvZiBhbiBlcXVpdm9jYXRpb24gcmVwb3J0IGlzIGludmFsaWQuYEludmFsaWRFcXVpdm9jYXRpb25Qcm9vZgABBDEBQW4gZXF1aXZvY2F0aW9uIHByb29mIHByb3ZpZGVkIGFzIHBhcnQgb2YgYW4gZXF1aXZvY2F0aW9uIHJlcG9ydCBpcyBpbnZhbGlkLlhEdXBsaWNhdGVPZmZlbmNlUmVwb3J0AAIEFQFBIGdpdmVuIGVxdWl2b2NhdGlvbiByZXBvcnQgaXMgdmFsaWQgYnV0IGFscmVhZHkgcHJldmlvdXNseSByZXBvcnRlZC5QSW52YWxpZENvbmZpZ3VyYXRpb24AAwSMU3VibWl0dGVkIGNvbmZpZ3VyYXRpb24gaXMgaW52YWxpZC4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQuTQ4MSHNwX2NvbnNlbnN1c19iZWVmeQxtbXJEQmVlZnlBdXRob3JpdHlTZXQEWEF1dGhvcml0eVNldENvbW1pdG1lbnQBNAAMAQhpZDABVGNyYXRlOjpWYWxpZGF0b3JTZXRJZAABDGxlbhABDHUzMgABRGtleXNldF9jb21taXRtZW50NAFYQXV0aG9yaXR5U2V0Q29tbWl0bWVudAAAUQ4AAAQkVQ5ZDl0OYQ5lDm0OcQ51DnkOAFUOEDBmcmFtZV9zeXN0ZW0oZXh0ZW5zaW9uc1RjaGVja19ub25femVyb19zZW5kZXJIQ2hlY2tOb25aZXJvU2VuZGVyBARUAAAAAFkOEDBmcmFtZV9zeXN0ZW0oZXh0ZW5zaW9uc0hjaGVja19zcGVjX3ZlcnNpb25AQ2hlY2tTcGVjVmVyc2lvbgQEVAAAAABdDhAwZnJhbWVfc3lzdGVtKGV4dGVuc2lvbnNAY2hlY2tfdHhfdmVyc2lvbjhDaGVja1R4VmVyc2lvbgQEVAAAAABhDhAwZnJhbWVfc3lzdGVtKGV4dGVuc2lvbnM0Y2hlY2tfZ2VuZXNpczBDaGVja0dlbmVzaXMEBFQAAAAAZQ4QMGZyYW1lX3N5c3RlbShleHRlbnNpb25zPGNoZWNrX21vcnRhbGl0eThDaGVja01vcnRhbGl0eQQEVAAABABpDgEMRXJhAABpDhAoc3BfcnVudGltZRxnZW5lcmljDGVyYQxFcmEAAQEEIEltbW9ydGFsAAAAHE1vcnRhbDEEAAgAAAEAHE1vcnRhbDIEAAgAAAIAHE1vcnRhbDMEAAgAAAMAHE1vcnRhbDQEAAgAAAQAHE1vcnRhbDUEAAgAAAUAHE1vcnRhbDYEAAgAAAYAHE1vcnRhbDcEAAgAAAcAHE1vcnRhbDgEAAgAAAgAHE1vcnRhbDkEAAgAAAkAIE1vcnRhbDEwBAAIAAAKACBNb3J0YWwxMQQACAAACwAgTW9ydGFsMTIEAAgAAAwAIE1vcnRhbDEzBAAIAAANACBNb3J0YWwxNAQACAAADgAgTW9ydGFsMTUEAAgAAA8AIE1vcnRhbDE2BAAIAAAQACBNb3J0YWwxNwQACAAAEQAgTW9ydGFsMTgEAAgAABIAIE1vcnRhbDE5BAAIAAATACBNb3J0YWwyMAQACAAAFAAgTW9ydGFsMjEEAAgAABUAIE1vcnRhbDIyBAAIAAAWACBNb3J0YWwyMwQACAAAFwAgTW9ydGFsMjQEAAgAABgAIE1vcnRhbDI1BAAIAAAZACBNb3J0YWwyNgQACAAAGgAgTW9ydGFsMjcEAAgAABsAIE1vcnRhbDI4BAAIAAAcACBNb3J0YWwyOQQACAAAHQAgTW9ydGFsMzAEAAgAAB4AIE1vcnRhbDMxBAAIAAAfACBNb3J0YWwzMgQACAAAIAAgTW9ydGFsMzMEAAgAACEAIE1vcnRhbDM0BAAIAAAiACBNb3J0YWwzNQQACAAAIwAgTW9ydGFsMzYEAAgAACQAIE1vcnRhbDM3BAAIAAAlACBNb3J0YWwzOAQACAAAJgAgTW9ydGFsMzkEAAgAACcAIE1vcnRhbDQwBAAIAAAoACBNb3J0YWw0MQQACAAAKQAgTW9ydGFsNDIEAAgAACoAIE1vcnRhbDQzBAAIAAArACBNb3J0YWw0NAQACAAALAAgTW9ydGFsNDUEAAgAAC0AIE1vcnRhbDQ2BAAIAAAuACBNb3J0YWw0NwQACAAALwAgTW9ydGFsNDgEAAgAADAAIE1vcnRhbDQ5BAAIAAAxACBNb3J0YWw1MAQACAAAMgAgTW9ydGFsNTEEAAgAADMAIE1vcnRhbDUyBAAIAAA0ACBNb3J0YWw1MwQACAAANQAgTW9ydGFsNTQEAAgAADYAIE1vcnRhbDU1BAAIAAA3ACBNb3J0YWw1NgQACAAAOAAgTW9ydGFsNTcEAAgAADkAIE1vcnRhbDU4BAAIAAA6ACBNb3J0YWw1OQQACAAAOwAgTW9ydGFsNjAEAAgAADwAIE1vcnRhbDYxBAAIAAA9ACBNb3J0YWw2MgQACAAAPgAgTW9ydGFsNjMEAAgAAD8AIE1vcnRhbDY0BAAIAABAACBNb3J0YWw2NQQACAAAQQAgTW9ydGFsNjYEAAgAAEIAIE1vcnRhbDY3BAAIAABDACBNb3J0YWw2OAQACAAARAAgTW9ydGFsNjkEAAgAAEUAIE1vcnRhbDcwBAAIAABGACBNb3J0YWw3MQQACAAARwAgTW9ydGFsNzIEAAgAAEgAIE1vcnRhbDczBAAIAABJACBNb3J0YWw3NAQACAAASgAgTW9ydGFsNzUEAAgAAEsAIE1vcnRhbDc2BAAIAABMACBNb3J0YWw3NwQACAAATQAgTW9ydGFsNzgEAAgAAE4AIE1vcnRhbDc5BAAIAABPACBNb3J0YWw4MAQACAAAUAAgTW9ydGFsODEEAAgAAFEAIE1vcnRhbDgyBAAIAABSACBNb3J0YWw4MwQACAAAUwAgTW9ydGFsODQEAAgAAFQAIE1vcnRhbDg1BAAIAABVACBNb3J0YWw4NgQACAAAVgAgTW9ydGFsODcEAAgAAFcAIE1vcnRhbDg4BAAIAABYACBNb3J0YWw4OQQACAAAWQAgTW9ydGFsOTAEAAgAAFoAIE1vcnRhbDkxBAAIAABbACBNb3J0YWw5MgQACAAAXAAgTW9ydGFsOTMEAAgAAF0AIE1vcnRhbDk0BAAIAABeACBNb3J0YWw5NQQACAAAXwAgTW9ydGFsOTYEAAgAAGAAIE1vcnRhbDk3BAAIAABhACBNb3J0YWw5OAQACAAAYgAgTW9ydGFsOTkEAAgAAGMAJE1vcnRhbDEwMAQACAAAZAAkTW9ydGFsMTAxBAAIAABlACRNb3J0YWwxMDIEAAgAAGYAJE1vcnRhbDEwMwQACAAAZwAkTW9ydGFsMTA0BAAIAABoACRNb3J0YWwxMDUEAAgAAGkAJE1vcnRhbDEwNgQACAAAagAkTW9ydGFsMTA3BAAIAABrACRNb3J0YWwxMDgEAAgAAGwAJE1vcnRhbDEwOQQACAAAbQAkTW9ydGFsMTEwBAAIAABuACRNb3J0YWwxMTEEAAgAAG8AJE1vcnRhbDExMgQACAAAcAAkTW9ydGFsMTEzBAAIAABxACRNb3J0YWwxMTQEAAgAAHIAJE1vcnRhbDExNQQACAAAcwAkTW9ydGFsMTE2BAAIAAB0ACRNb3J0YWwxMTcEAAgAAHUAJE1vcnRhbDExOAQACAAAdgAkTW9ydGFsMTE5BAAIAAB3ACRNb3J0YWwxMjAEAAgAAHgAJE1vcnRhbDEyMQQACAAAeQAkTW9ydGFsMTIyBAAIAAB6ACRNb3J0YWwxMjMEAAgAAHsAJE1vcnRhbDEyNAQACAAAfAAkTW9ydGFsMTI1BAAIAAB9ACRNb3J0YWwxMjYEAAgAAH4AJE1vcnRhbDEyNwQACAAAfwAkTW9ydGFsMTI4BAAIAACAACRNb3J0YWwxMjkEAAgAAIEAJE1vcnRhbDEzMAQACAAAggAkTW9ydGFsMTMxBAAIAACDACRNb3J0YWwxMzIEAAgAAIQAJE1vcnRhbDEzMwQACAAAhQAkTW9ydGFsMTM0BAAIAACGACRNb3J0YWwxMzUEAAgAAIcAJE1vcnRhbDEzNgQACAAAiAAkTW9ydGFsMTM3BAAIAACJACRNb3J0YWwxMzgEAAgAAIoAJE1vcnRhbDEzOQQACAAAiwAkTW9ydGFsMTQwBAAIAACMACRNb3J0YWwxNDEEAAgAAI0AJE1vcnRhbDE0MgQACAAAjgAkTW9ydGFsMTQzBAAIAACPACRNb3J0YWwxNDQEAAgAAJAAJE1vcnRhbDE0NQQACAAAkQAkTW9ydGFsMTQ2BAAIAACSACRNb3J0YWwxNDcEAAgAAJMAJE1vcnRhbDE0OAQACAAAlAAkTW9ydGFsMTQ5BAAIAACVACRNb3J0YWwxNTAEAAgAAJYAJE1vcnRhbDE1MQQACAAAlwAkTW9ydGFsMTUyBAAIAACYACRNb3J0YWwxNTMEAAgAAJkAJE1vcnRhbDE1NAQACAAAmgAkTW9ydGFsMTU1BAAIAACbACRNb3J0YWwxNTYEAAgAAJwAJE1vcnRhbDE1NwQACAAAnQAkTW9ydGFsMTU4BAAIAACeACRNb3J0YWwxNTkEAAgAAJ8AJE1vcnRhbDE2MAQACAAAoAAkTW9ydGFsMTYxBAAIAAChACRNb3J0YWwxNjIEAAgAAKIAJE1vcnRhbDE2MwQACAAAowAkTW9ydGFsMTY0BAAIAACkACRNb3J0YWwxNjUEAAgAAKUAJE1vcnRhbDE2NgQACAAApgAkTW9ydGFsMTY3BAAIAACnACRNb3J0YWwxNjgEAAgAAKgAJE1vcnRhbDE2OQQACAAAqQAkTW9ydGFsMTcwBAAIAACqACRNb3J0YWwxNzEEAAgAAKsAJE1vcnRhbDE3MgQACAAArAAkTW9ydGFsMTczBAAIAACtACRNb3J0YWwxNzQEAAgAAK4AJE1vcnRhbDE3NQQACAAArwAkTW9ydGFsMTc2BAAIAACwACRNb3J0YWwxNzcEAAgAALEAJE1vcnRhbDE3OAQACAAAsgAkTW9ydGFsMTc5BAAIAACzACRNb3J0YWwxODAEAAgAALQAJE1vcnRhbDE4MQQACAAAtQAkTW9ydGFsMTgyBAAIAAC2ACRNb3J0YWwxODMEAAgAALcAJE1vcnRhbDE4NAQACAAAuAAkTW9ydGFsMTg1BAAIAAC5ACRNb3J0YWwxODYEAAgAALoAJE1vcnRhbDE4NwQACAAAuwAkTW9ydGFsMTg4BAAIAAC8ACRNb3J0YWwxODkEAAgAAL0AJE1vcnRhbDE5MAQACAAAvgAkTW9ydGFsMTkxBAAIAAC/ACRNb3J0YWwxOTIEAAgAAMAAJE1vcnRhbDE5MwQACAAAwQAkTW9ydGFsMTk0BAAIAADCACRNb3J0YWwxOTUEAAgAAMMAJE1vcnRhbDE5NgQACAAAxAAkTW9ydGFsMTk3BAAIAADFACRNb3J0YWwxOTgEAAgAAMYAJE1vcnRhbDE5OQQACAAAxwAkTW9ydGFsMjAwBAAIAADIACRNb3J0YWwyMDEEAAgAAMkAJE1vcnRhbDIwMgQACAAAygAkTW9ydGFsMjAzBAAIAADLACRNb3J0YWwyMDQEAAgAAMwAJE1vcnRhbDIwNQQACAAAzQAkTW9ydGFsMjA2BAAIAADOACRNb3J0YWwyMDcEAAgAAM8AJE1vcnRhbDIwOAQACAAA0AAkTW9ydGFsMjA5BAAIAADRACRNb3J0YWwyMTAEAAgAANIAJE1vcnRhbDIxMQQACAAA0wAkTW9ydGFsMjEyBAAIAADUACRNb3J0YWwyMTMEAAgAANUAJE1vcnRhbDIxNAQACAAA1gAkTW9ydGFsMjE1BAAIAADXACRNb3J0YWwyMTYEAAgAANgAJE1vcnRhbDIxNwQACAAA2QAkTW9ydGFsMjE4BAAIAADaACRNb3J0YWwyMTkEAAgAANsAJE1vcnRhbDIyMAQACAAA3AAkTW9ydGFsMjIxBAAIAADdACRNb3J0YWwyMjIEAAgAAN4AJE1vcnRhbDIyMwQACAAA3wAkTW9ydGFsMjI0BAAIAADgACRNb3J0YWwyMjUEAAgAAOEAJE1vcnRhbDIyNgQACAAA4gAkTW9ydGFsMjI3BAAIAADjACRNb3J0YWwyMjgEAAgAAOQAJE1vcnRhbDIyOQQACAAA5QAkTW9ydGFsMjMwBAAIAADmACRNb3J0YWwyMzEEAAgAAOcAJE1vcnRhbDIzMgQACAAA6AAkTW9ydGFsMjMzBAAIAADpACRNb3J0YWwyMzQEAAgAAOoAJE1vcnRhbDIzNQQACAAA6wAkTW9ydGFsMjM2BAAIAADsACRNb3J0YWwyMzcEAAgAAO0AJE1vcnRhbDIzOAQACAAA7gAkTW9ydGFsMjM5BAAIAADvACRNb3J0YWwyNDAEAAgAAPAAJE1vcnRhbDI0MQQACAAA8QAkTW9ydGFsMjQyBAAIAADyACRNb3J0YWwyNDMEAAgAAPMAJE1vcnRhbDI0NAQACAAA9AAkTW9ydGFsMjQ1BAAIAAD1ACRNb3J0YWwyNDYEAAgAAPYAJE1vcnRhbDI0NwQACAAA9wAkTW9ydGFsMjQ4BAAIAAD4ACRNb3J0YWwyNDkEAAgAAPkAJE1vcnRhbDI1MAQACAAA+gAkTW9ydGFsMjUxBAAIAAD7ACRNb3J0YWwyNTIEAAgAAPwAJE1vcnRhbDI1MwQACAAA/QAkTW9ydGFsMjU0BAAIAAD+ACRNb3J0YWwyNTUEAAgAAP8AAG0OEDBmcmFtZV9zeXN0ZW0oZXh0ZW5zaW9ucyxjaGVja19ub25jZShDaGVja05vbmNlBARUAAAEANQBIFQ6Ok5vbmNlAABxDhAwZnJhbWVfc3lzdGVtKGV4dGVuc2lvbnMwY2hlY2tfd2VpZ2h0LENoZWNrV2VpZ2h0BARUAAAAAHUOCGhwYWxsZXRfdHJhbnNhY3Rpb25fcGF5bWVudGBDaGFyZ2VUcmFuc2FjdGlvblBheW1lbnQEBFQAAAQA5AEwQmFsYW5jZU9mPFQ+AAB5Dgh0ZnJhbWVfbWV0YWRhdGFfaGFzaF9leHRlbnNpb25EQ2hlY2tNZXRhZGF0YUhhc2gEBFQAAAQBEG1vZGV9DgEQTW9kZQAAfQ4IdGZyYW1lX21ldGFkYXRhX2hhc2hfZXh0ZW5zaW9uEE1vZGUAAQggRGlzYWJsZWQAAAAcRW5hYmxlZAABAACBDghYc3RhZ2luZ19rdXNhbWFfcnVudGltZRxSdW50aW1lAAAAAIUODDByZWxheV9jb21tb24QYXBpczRJbmZsYXRpb25JbmZvAAAIASRpbmZsYXRpb26dAgFcc3BfcnVudGltZTo6UGVycXVpbnRpbGwAASRuZXh0X21pbnSJDgHwKHBvbGthZG90X3ByaW1pdGl2ZXM6OkJhbGFuY2UsIHBvbGthZG90X3ByaW1pdGl2ZXM6OkJhbGFuY2UpAACJDgAABAgYGACNDhAoc3BfcnVudGltZRxnZW5lcmljFGJsb2NrFEJsb2NrCBhIZWFkZXIBeQEkRXh0cmluc2ljAZEOAAgBGGhlYWRlcnkBARhIZWFkZXIAAShleHRyaW5zaWNzlQ4BOFZlYzxFeHRyaW5zaWM+AACRDhAoc3BfcnVudGltZRxnZW5lcmljTHVuY2hlY2tlZF9leHRyaW5zaWNIVW5jaGVja2VkRXh0cmluc2ljEBxBZGRyZXNzAZ0BEENhbGwBXQEkU2lnbmF0dXJlAb0FFEV4dHJhAVEOAAQAOAAAAJUOAAACkQ4AmQ4IKHNwX3J1bnRpbWVYRXh0cmluc2ljSW5jbHVzaW9uTW9kZQABCDRBbGxFeHRyaW5zaWNzAAAANE9ubHlJbmhlcmVudHMAAQAAnQ4IHHNwX2NvcmU4T3BhcXVlTWV0YWRhdGEAAAQAOAEcVmVjPHU4PgAAoQ4EGE9wdGlvbgQEVAGdDgEIEE5vbmUAAAAQU29tZQQAnQ4AAAEAAKUOBBhSZXN1bHQIBFQBmQcERQGpDgEICE9rBACZBwAAAAAMRXJyBACpDgAAAQAAqQ4MKHNwX3J1bnRpbWVQdHJhbnNhY3Rpb25fdmFsaWRpdHlgVHJhbnNhY3Rpb25WYWxpZGl0eUVycm9yAAEIHEludmFsaWQEAK0OAUhJbnZhbGlkVHJhbnNhY3Rpb24AAAAcVW5rbm93bgQAsQ4BSFVua25vd25UcmFuc2FjdGlvbgABAACtDgwoc3BfcnVudGltZVB0cmFuc2FjdGlvbl92YWxpZGl0eUhJbnZhbGlkVHJhbnNhY3Rpb24AASwQQ2FsbAAAABxQYXltZW50AAEAGEZ1dHVyZQACABRTdGFsZQADACBCYWRQcm9vZgAEAERBbmNpZW50QmlydGhCbG9jawAFAERFeGhhdXN0c1Jlc291cmNlcwAGABhDdXN0b20EAAgBCHU4AAcAMEJhZE1hbmRhdG9yeQAIAExNYW5kYXRvcnlWYWxpZGF0aW9uAAkAJEJhZFNpZ25lcgAKAACxDgwoc3BfcnVudGltZVB0cmFuc2FjdGlvbl92YWxpZGl0eUhVbmtub3duVHJhbnNhY3Rpb24AAQwwQ2Fubm90TG9va3VwAAAATE5vVW5zaWduZWRWYWxpZGF0b3IAAQAYQ3VzdG9tBAAIAQh1OAACAAC1Dggwc3BfaW5oZXJlbnRzMEluaGVyZW50RGF0YQAABAEQZGF0YbkOAZRCVHJlZU1hcDxJbmhlcmVudElkZW50aWZpZXIsIFZlYzx1OD4+AAC5DgQgQlRyZWVNYXAIBEsBAQYEVgE4AAQAvQ4AAAC9DgAAAsEOAMEOAAAECAEGOADFDggwc3BfaW5oZXJlbnRzUENoZWNrSW5oZXJlbnRzUmVzdWx0AAAMARBva2F5IAEQYm9vbAABLGZhdGFsX2Vycm9yIAEQYm9vbAABGGVycm9yc7UOATBJbmhlcmVudERhdGEAAMkODChzcF9ydW50aW1lUHRyYW5zYWN0aW9uX3ZhbGlkaXR5RFRyYW5zYWN0aW9uU291cmNlAAEMHEluQmxvY2sAAAAUTG9jYWwAAQAgRXh0ZXJuYWwAAgAAzQ4EGFJlc3VsdAgEVAHRDgRFAakOAQgIT2sEANEOAAAAAAxFcnIEAKkOAAABAADRDgwoc3BfcnVudGltZVB0cmFuc2FjdGlvbl92YWxpZGl0eUBWYWxpZFRyYW5zYWN0aW9uAAAUASBwcmlvcml0eTABTFRyYW5zYWN0aW9uUHJpb3JpdHkAASByZXF1aXJlc20BAUxWZWM8VHJhbnNhY3Rpb25UYWc+AAEgcHJvdmlkZXNtAQFMVmVjPFRyYW5zYWN0aW9uVGFnPgABJGxvbmdldml0eTABUFRyYW5zYWN0aW9uTG9uZ2V2aXR5AAEkcHJvcGFnYXRlIAEQYm9vbAAA1Q4AAAQIdQzZDgDZDgxMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2N0RHcm91cFJvdGF0aW9uSW5mbwQETgEQAAwBTHNlc3Npb25fc3RhcnRfYmxvY2sQAQROAAFgZ3JvdXBfcm90YXRpb25fZnJlcXVlbmN5EAEETgABDG5vdxABBE4AAN0OAAAC4Q4A4Q4MTHBvbGthZG90X3ByaW1pdGl2ZXMIdjckQ29yZVN0YXRlCARIATQETgEQAQwgT2NjdXBpZWQEAOUOAUhPY2N1cGllZENvcmU8SCwgTj4AAAAkU2NoZWR1bGVkBADtDgE0U2NoZWR1bGVkQ29yZQABABBGcmVlAAIAAOUODExwb2xrYWRvdF9wcmltaXRpdmVzCHY3ME9jY3VwaWVkQ29yZQgESAE0BE4BEAAgAVBuZXh0X3VwX29uX2F2YWlsYWJsZekOAVRPcHRpb248U2NoZWR1bGVkQ29yZT4AAThvY2N1cGllZF9zaW5jZRABBE4AASx0aW1lX291dF9hdBABBE4AAUxuZXh0X3VwX29uX3RpbWVfb3V06Q4BVE9wdGlvbjxTY2hlZHVsZWRDb3JlPgABMGF2YWlsYWJpbGl0efkEAXxCaXRWZWM8dTgsIGJpdHZlYzo6b3JkZXI6OkxzYjA+AAFEZ3JvdXBfcmVzcG9uc2libGX5BwEoR3JvdXBJbmRleAABOGNhbmRpZGF0ZV9oYXNoVQUBNENhbmRpZGF0ZUhhc2gAAVBjYW5kaWRhdGVfZGVzY3JpcHRvchUFAVhDYW5kaWRhdGVEZXNjcmlwdG9yPEg+AADpDgQYT3B0aW9uBARUAe0OAQgQTm9uZQAAABBTb21lBADtDgAAAQAA7Q4MTHBvbGthZG90X3ByaW1pdGl2ZXMIdjc0U2NoZWR1bGVkQ29yZQAACAEccGFyYV9pZGkCAQhJZAABIGNvbGxhdG9y8Q4BSE9wdGlvbjxDb2xsYXRvcklkPgAA8Q4EGE9wdGlvbgQEVAEZBQEIEE5vbmUAAAAQU29tZQQAGQUAAAEAAPUODExwb2xrYWRvdF9wcmltaXRpdmVzCHY3WE9jY3VwaWVkQ29yZUFzc3VtcHRpb24AAQwgSW5jbHVkZWQAAAAgVGltZWRPdXQAAQAQRnJlZQACAAD5DgQYT3B0aW9uBARUAf0OAQgQTm9uZQAAABBTb21lBAD9DgAAAQAA/Q4MTHBvbGthZG90X3ByaW1pdGl2ZXMIdjdcUGVyc2lzdGVkVmFsaWRhdGlvbkRhdGEIBEgBNAROARAAEAEscGFyZW50X2hlYWRBBQEgSGVhZERhdGEAAUxyZWxheV9wYXJlbnRfbnVtYmVyEAEETgABZHJlbGF5X3BhcmVudF9zdG9yYWdlX3Jvb3Q0AQRIAAEwbWF4X3Bvdl9zaXplEAEMdTMyAAABDwQYT3B0aW9uBARUAQUPAQgQTm9uZQAAABBTb21lBAAFDwAAAQAABQ8AAAQI/Q4hBQAJDwQYT3B0aW9uBARUAREFAQgQTm9uZQAAABBTb21lBAARBQAAAQAADQ8AAAIRDwARDwxMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2NzhDYW5kaWRhdGVFdmVudAQESAE0AQw8Q2FuZGlkYXRlQmFja2VkEADxBwFMQ2FuZGlkYXRlUmVjZWlwdDxIPgAAQQUBIEhlYWREYXRhAAD1BwEkQ29yZUluZGV4AAD5BwEoR3JvdXBJbmRleAAAAERDYW5kaWRhdGVJbmNsdWRlZBAA8QcBTENhbmRpZGF0ZVJlY2VpcHQ8SD4AAEEFASBIZWFkRGF0YQAA9QcBJENvcmVJbmRleAAA+QcBKEdyb3VwSW5kZXgAAQBEQ2FuZGlkYXRlVGltZWRPdXQMAPEHAUxDYW5kaWRhdGVSZWNlaXB0PEg+AABBBQEgSGVhZERhdGEAAPUHASRDb3JlSW5kZXgAAgAAFQ8EIEJUcmVlTWFwCARLAWkCBFYB9QwABAAZDwAAABkPAAACHQ8AHQ8AAAQIaQL1DAAhDwQYT3B0aW9uBARUAV0MAQgQTm9uZQAAABBTb21lBABdDAAAAQAAJQ8EGE9wdGlvbgQEVAENDQEIEE5vbmUAAAAQU29tZQQADQ0AAAEAACkPBBhPcHRpb24EBFQBIQUBCBBOb25lAAAAEFNvbWUEACEFAAABAAAtDwAAAjEPADEPAAAEDBBVBR0NADUPBBhPcHRpb24EBFQBwQQBCBBOb25lAAAAEFNvbWUEAMEEAAABAAA5DwAAAj0PAD0PAAAEDBBVBSkNAEEPBBhPcHRpb24EBFQBRQ8BCBBOb25lAAAAEFNvbWUEAEUPAAABAABFDxBMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2NyBzbGFzaGluZ1xPcGFxdWVLZXlPd25lcnNoaXBQcm9vZgAABAA4ARxWZWM8dTg+AABJDwQYT3B0aW9uBARUAaEBAQgQTm9uZQAAABBTb21lBAChAQAAAQAATQ8EGE9wdGlvbgQEVAFRDwEIEE5vbmUAAAAQU29tZQQAUQ8AAAEAAFEPEExwb2xrYWRvdF9wcmltaXRpdmVzCHY3NGFzeW5jX2JhY2tpbmcwQmFja2luZ1N0YXRlCARIATQETgEQAAgBLGNvbnN0cmFpbnRzVQ8BOENvbnN0cmFpbnRzPE4+AAFQcGVuZGluZ19hdmFpbGFiaWxpdHl1DwGcVmVjPENhbmRpZGF0ZVBlbmRpbmdBdmFpbGFiaWxpdHk8SCwgTj4+AABVDxBMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2NzRhc3luY19iYWNraW5nLENvbnN0cmFpbnRzBAROARAAOAFcbWluX3JlbGF5X3BhcmVudF9udW1iZXIQAQROAAEwbWF4X3Bvdl9zaXplEAEMdTMyAAE0bWF4X2NvZGVfc2l6ZRABDHUzMgABNHVtcF9yZW1haW5pbmcQAQx1MzIAAUx1bXBfcmVtYWluaW5nX2J5dGVzEAEMdTMyAAFkbWF4X3VtcF9udW1fcGVyX2NhbmRpZGF0ZRABDHUzMgABWGRtcF9yZW1haW5pbmdfbWVzc2FnZXPBAQEYVmVjPE4+AAEwaHJtcF9pbmJvdW5kWQ8BZEluYm91bmRIcm1wTGltaXRhdGlvbnM8Tj4AAURocm1wX2NoYW5uZWxzX291dF0PAaRWZWM8KElkLCBPdXRib3VuZEhybXBDaGFubmVsTGltaXRhdGlvbnMpPgABaG1heF9ocm1wX251bV9wZXJfY2FuZGlkYXRlEAEMdTMyAAE8cmVxdWlyZWRfcGFyZW50QQUBIEhlYWREYXRhAAFQdmFsaWRhdGlvbl9jb2RlX2hhc2ghBQFIVmFsaWRhdGlvbkNvZGVIYXNoAAFMdXBncmFkZV9yZXN0cmljdGlvbmkPAWhPcHRpb248VXBncmFkZVJlc3RyaWN0aW9uPgABWGZ1dHVyZV92YWxpZGF0aW9uX2NvZGVtDwF8T3B0aW9uPChOLCBWYWxpZGF0aW9uQ29kZUhhc2gpPgAAWQ8QTHBvbGthZG90X3ByaW1pdGl2ZXMIdjc0YXN5bmNfYmFja2luZ1hJbmJvdW5kSHJtcExpbWl0YXRpb25zBAROARAABAFAdmFsaWRfd2F0ZXJtYXJrc8EBARhWZWM8Tj4AAF0PAAACYQ8AYQ8AAAQIaQJlDwBlDxBMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2NzRhc3luY19iYWNraW5neE91dGJvdW5kSHJtcENoYW5uZWxMaW1pdGF0aW9ucwAACAE8Ynl0ZXNfcmVtYWluaW5nEAEMdTMyAAFIbWVzc2FnZXNfcmVtYWluaW5nEAEMdTMyAABpDwQYT3B0aW9uBARUAc0MAQgQTm9uZQAAABBTb21lBADNDAAAAQAAbQ8EGE9wdGlvbgQEVAFxDwEIEE5vbmUAAAAQU29tZQQAcQ8AAAEAAHEPAAAECBAhBQB1DwAAAnkPAHkPEExwb2xrYWRvdF9wcmltaXRpdmVzCHY3NGFzeW5jX2JhY2tpbmdwQ2FuZGlkYXRlUGVuZGluZ0F2YWlsYWJpbGl0eQgESAE0BE4BEAAUAThjYW5kaWRhdGVfaGFzaFUFATRDYW5kaWRhdGVIYXNoAAEoZGVzY3JpcHRvchUFAVhDYW5kaWRhdGVEZXNjcmlwdG9yPEg+AAEsY29tbWl0bWVudHMlBQFQQ2FuZGlkYXRlQ29tbWl0bWVudHMAAUxyZWxheV9wYXJlbnRfbnVtYmVyEAEETgABMG1heF9wb3Zfc2l6ZRABDHUzMgAAfQ8EIEJUcmVlTWFwCARLAfUHBFYBrQwABACBDwAAAIEPAAAChQ8AhQ8AAAQI9QetDACJDwAAAhEFAI0PBBhPcHRpb24EBFQBkQ8BCBBOb25lAAAAEFNvbWUEAJEPAAABAACRDwhIc3BfY29uc2Vuc3VzX2JlZWZ5MFZhbGlkYXRvclNldAQsQXV0aG9yaXR5SWQBBQIACAEodmFsaWRhdG9yc0UOAUBWZWM8QXV0aG9yaXR5SWQ+AAEIaWQwAThWYWxpZGF0b3JTZXRJZAAAlQ8IKHNwX3J1bnRpbWUsT3BhcXVlVmFsdWUAAAQAOAEcVmVjPHU4PgAAmQ8EGE9wdGlvbgQEVAGVDwEIEE5vbmUAAAAQU29tZQQAlQ8AAAEAAJ0PBBhSZXN1bHQIBFQBNARFAaEPAQgIT2sEADQAAAAADEVycgQAoQ8AAAEAAKEPCERzcF9tbXJfcHJpbWl0aXZlcxRFcnJvcgABKEBJbnZhbGlkTnVtZXJpY09wAAAAEFB1c2gAAQAcR2V0Um9vdAACABhDb21taXQAAwA0R2VuZXJhdGVQcm9vZgAEABhWZXJpZnkABQAwTGVhZk5vdEZvdW5kAAYARFBhbGxldE5vdEluY2x1ZGVkAAcAQEludmFsaWRMZWFmSW5kZXgACABUSW52YWxpZEJlc3RLbm93bkJsb2NrAAkAAKUPBBhSZXN1bHQIBFQBMARFAaEPAQgIT2sEADAAAAAADEVycgQAoQ8AAAEAAKkPBBhSZXN1bHQIBFQBrQ8ERQGhDwEICE9rBACtDwAAAAAMRXJyBAChDwAAAQAArQ8AAAQIsQ+5DwCxDwAAArUPALUPCERzcF9tbXJfcHJpbWl0aXZlc0xFbmNvZGFibGVPcGFxdWVMZWFmAAAEADgBHFZlYzx1OD4AALkPCERzcF9tbXJfcHJpbWl0aXZlcyRMZWFmUHJvb2YEEEhhc2gBNAAMATBsZWFmX2luZGljZXPJCwE4VmVjPExlYWZJbmRleD4AAShsZWFmX2NvdW50MAEkTm9kZUluZGV4AAEUaXRlbXMVAwEkVmVjPEhhc2g+AAC9DwQYUmVzdWx0CARUAaEBBEUBoQ8BCAhPawQAoQEAAAAADEVycgQAoQ8AAAEAAMEPCERzcF9jb25zZW5zdXNfYmFiZURCYWJlQ29uZmlndXJhdGlvbgAAGAE0c2xvdF9kdXJhdGlvbjABDHU2NAABMGVwb2NoX2xlbmd0aDABDHU2NAABBGONAQEoKHU2NCwgdTY0KQABLGF1dGhvcml0aWVzhQgBnFZlYzwoQXV0aG9yaXR5SWQsIEJhYmVBdXRob3JpdHlXZWlnaHQpPgABKHJhbmRvbW5lc3MEAShSYW5kb21uZXNzAAE0YWxsb3dlZF9zbG90c5EBATBBbGxvd2VkU2xvdHMAAMUPCERzcF9jb25zZW5zdXNfYmFiZRRFcG9jaAAAGAEsZXBvY2hfaW5kZXgwAQx1NjQAAShzdGFydF9zbG90gQEBEFNsb3QAASBkdXJhdGlvbjABDHU2NAABLGF1dGhvcml0aWVzhQgBnFZlYzwoQXV0aG9yaXR5SWQsIEJhYmVBdXRob3JpdHlXZWlnaHQpPgABKHJhbmRvbW5lc3MEAShSYW5kb21uZXNzAAEYY29uZmlnqQgBWEJhYmVFcG9jaENvbmZpZ3VyYXRpb24AAMkPBBhPcHRpb24EBFQBzQ8BCBBOb25lAAAAEFNvbWUEAM0PAAABAADNDwhEc3BfY29uc2Vuc3VzX2JhYmVcT3BhcXVlS2V5T3duZXJzaGlwUHJvb2YAAAQAOAEcVmVjPHU4PgAA0Q8EGE9wdGlvbgQEVAHVDwEIEE5vbmUAAAAQU29tZQQA1Q8AAAEAANUPAAAC2Q8A2Q8AAAQIOI0JAN0PDGhwYWxsZXRfdHJhbnNhY3Rpb25fcGF5bWVudBR0eXBlc0xSdW50aW1lRGlzcGF0Y2hJbmZvCBxCYWxhbmNlARgYV2VpZ2h0ASgADAEYd2VpZ2h0KAEYV2VpZ2h0AAEUY2xhc3NgATREaXNwYXRjaENsYXNzAAEscGFydGlhbF9mZWUYARxCYWxhbmNlAADhDwxocGFsbGV0X3RyYW5zYWN0aW9uX3BheW1lbnQUdHlwZXMoRmVlRGV0YWlscwQcQmFsYW5jZQEYAAgBNGluY2x1c2lvbl9mZWXlDwF0T3B0aW9uPEluY2x1c2lvbkZlZTxCYWxhbmNlPj4AAQx0aXAYARxCYWxhbmNlAADlDwQYT3B0aW9uBARUAekPAQgQTm9uZQAAABBTb21lBADpDwAAAQAA6Q8MaHBhbGxldF90cmFuc2FjdGlvbl9wYXltZW50FHR5cGVzMEluY2x1c2lvbkZlZQQcQmFsYW5jZQEYAAwBIGJhc2VfZmVlGAEcQmFsYW5jZQABHGxlbl9mZWUYARxCYWxhbmNlAAFMYWRqdXN0ZWRfd2VpZ2h0X2ZlZRgBHEJhbGFuY2UAAO0PBBhSZXN1bHQIBFQB8Q8ERQH1DwEICE9rBADxDwAAAAAMRXJyBAD1DwAAAQAA8Q8AAAINBwD1DwxAeGNtX3J1bnRpbWVfYXBpcxBmZWVzFEVycm9yAAEYNFVuaW1wbGVtZW50ZWQAAABkVmVyc2lvbmVkQ29udmVyc2lvbkZhaWxlZAABAExXZWlnaHROb3RDb21wdXRhYmxlAAIATFVuaGFuZGxlZFhjbVZlcnNpb24AAwA0QXNzZXROb3RGb3VuZAAEAChVbnJvdXRhYmxlAAUAAPkPBBhSZXN1bHQIBFQBKARFAfUPAQgIT2sEACgAAAAADEVycgQA9Q8AAAEAAP0PBBhSZXN1bHQIBFQBGARFAfUPAQgIT2sEABgAAAAADEVycgQA9Q8AAAEAAAEQBBhSZXN1bHQIBFQB2QYERQH1DwEICE9rBADZBgAAAAAMRXJyBAD1DwAAAQAABRAEGFJlc3VsdAgEVAEJEARFASEQAQgIT2sEAAkQAAAAAAxFcnIEACEQAAABAAAJEAxAeGNtX3J1bnRpbWVfYXBpcxxkcnlfcnVuRENhbGxEcnlSdW5FZmZlY3RzBBRFdmVudAFUABABQGV4ZWN1dGlvbl9yZXN1bHRpBwFoRGlzcGF0Y2hSZXN1bHRXaXRoUG9zdEluZm8AAThlbWl0dGVkX2V2ZW50cw0QAShWZWM8RXZlbnQ+AAEkbG9jYWxfeGNtERABYE9wdGlvbjxWZXJzaW9uZWRYY208KCk+PgABOGZvcndhcmRlZF94Y21zFRABvFZlYzwoVmVyc2lvbmVkTG9jYXRpb24sIFZlYzxWZXJzaW9uZWRYY208KCk+Pik+AAANEAAAAlQAERAEGE9wdGlvbgQEVAHZBQEIEE5vbmUAAAAQU29tZQQA2QUAAAEAABUQAAACGRAAGRAAAAQILQEdEAAdEAAAAtkFACEQDEB4Y21fcnVudGltZV9hcGlzHGRyeV9ydW4URXJyb3IAAQg0VW5pbXBsZW1lbnRlZAAAAGRWZXJzaW9uZWRDb252ZXJzaW9uRmFpbGVkAAEAACUQBBhSZXN1bHQIBFQBKRAERQEhEAEICE9rBAApEAAAAAAMRXJyBAAhEAAAAQAAKRAMQHhjbV9ydW50aW1lX2FwaXMcZHJ5X3J1bkBYY21EcnlSdW5FZmZlY3RzBBRFdmVudAFUAAwBQGV4ZWN1dGlvbl9yZXN1bHQtCAEcT3V0Y29tZQABOGVtaXR0ZWRfZXZlbnRzDRABKFZlYzxFdmVudD4AAThmb3J3YXJkZWRfeGNtcxUQAbxWZWM8KFZlcnNpb25lZExvY2F0aW9uLCBWZWM8VmVyc2lvbmVkWGNtPCgpPj4pPgAALRAEGFJlc3VsdAgEVAEABEUBMRABCAhPawQAAAAAAAAMRXJyBAAxEAAAAQAAMRAMQHhjbV9ydW50aW1lX2FwaXMsY29udmVyc2lvbnMURXJyb3IAAQgsVW5zdXBwb3J0ZWQAAABkVmVyc2lvbmVkQ29udmVyc2lvbkZhaWxlZAABAAA1EAQYUmVzdWx0CARUAaEBBEUBSQgBCAhPawQAoQEAAAAADEVycgQASQgAAAEAADkQBBhPcHRpb24EBFQBSQgBCBBOb25lAAAAEFNvbWUEAEkIAAABAAA9EAAAAkkIAEEQCFhzdGFnaW5nX2t1c2FtYV9ydW50aW1lMFJ1bnRpbWVFcnJvcgABwBhTeXN0ZW0EAHkIAXBmcmFtZV9zeXN0ZW06OkVycm9yPFJ1bnRpbWU+AAAAEEJhYmUEALkIAWxwYWxsZXRfYmFiZTo6RXJyb3I8UnVudGltZT4AAQAcSW5kaWNlcwQAwQgBeHBhbGxldF9pbmRpY2VzOjpFcnJvcjxSdW50aW1lPgADACBCYWxhbmNlcwQADQkBfHBhbGxldF9iYWxhbmNlczo6RXJyb3I8UnVudGltZT4ABAAcU3Rha2luZwQAbQkBeHBhbGxldF9zdGFraW5nOjpFcnJvcjxSdW50aW1lPgAGABxTZXNzaW9uBACRCQF4cGFsbGV0X3Nlc3Npb246OkVycm9yPFJ1bnRpbWU+AAgAHEdyYW5kcGEEAKEJAXhwYWxsZXRfZ3JhbmRwYTo6RXJyb3I8UnVudGltZT4ACgAgVHJlYXN1cnkEAMUJAXxwYWxsZXRfdHJlYXN1cnk6OkVycm9yPFJ1bnRpbWU+ABIAQENvbnZpY3Rpb25Wb3RpbmcEAPkJAaBwYWxsZXRfY29udmljdGlvbl92b3Rpbmc6OkVycm9yPFJ1bnRpbWU+ABQAJFJlZmVyZW5kYQQAQQoBgHBhbGxldF9yZWZlcmVuZGE6OkVycm9yPFJ1bnRpbWU+ABUAUEZlbGxvd3NoaXBDb2xsZWN0aXZlBABVCgE5AXBhbGxldF9yYW5rZWRfY29sbGVjdGl2ZTo6RXJyb3I8UnVudGltZSwgcGFsbGV0X3JhbmtlZF9jb2xsZWN0aXZlOjoKSW5zdGFuY2UxPgAWAExGZWxsb3dzaGlwUmVmZXJlbmRhBABlCgH0cGFsbGV0X3JlZmVyZW5kYTo6RXJyb3I8UnVudGltZSwgcGFsbGV0X3JlZmVyZW5kYTo6SW5zdGFuY2UyPgAXACRXaGl0ZWxpc3QEAGkKAYBwYWxsZXRfd2hpdGVsaXN0OjpFcnJvcjxSdW50aW1lPgAsABhDbGFpbXMEAG0KAVhjbGFpbXM6OkVycm9yPFJ1bnRpbWU+ABMAHFV0aWxpdHkEAHEKAXhwYWxsZXRfdXRpbGl0eTo6RXJyb3I8UnVudGltZT4AGAAcU29jaWV0eQQAtQoBeHBhbGxldF9zb2NpZXR5OjpFcnJvcjxSdW50aW1lPgAaACBSZWNvdmVyeQQAxQoBfHBhbGxldF9yZWNvdmVyeTo6RXJyb3I8UnVudGltZT4AGwAcVmVzdGluZwQA1QoBeHBhbGxldF92ZXN0aW5nOjpFcnJvcjxSdW50aW1lPgAcACRTY2hlZHVsZXIEAO0KAYBwYWxsZXRfc2NoZWR1bGVyOjpFcnJvcjxSdW50aW1lPgAdABRQcm94eQQAEQsBcHBhbGxldF9wcm94eTo6RXJyb3I8UnVudGltZT4AHgAgTXVsdGlzaWcEACELAXxwYWxsZXRfbXVsdGlzaWc6OkVycm9yPFJ1bnRpbWU+AB8AIFByZWltYWdlBABBCwF8cGFsbGV0X3ByZWltYWdlOjpFcnJvcjxSdW50aW1lPgAgACBCb3VudGllcwQAUQsBfHBhbGxldF9ib3VudGllczo6RXJyb3I8UnVudGltZT4AIwA0Q2hpbGRCb3VudGllcwQAXQsBlHBhbGxldF9jaGlsZF9ib3VudGllczo6RXJyb3I8UnVudGltZT4AKABoRWxlY3Rpb25Qcm92aWRlck11bHRpUGhhc2UEAIULAdBwYWxsZXRfZWxlY3Rpb25fcHJvdmlkZXJfbXVsdGlfcGhhc2U6OkVycm9yPFJ1bnRpbWU+ACUADE5pcwQApQsBaHBhbGxldF9uaXM6OkVycm9yPFJ1bnRpbWU+ACYAWE5pc0NvdW50ZXJwYXJ0QmFsYW5jZXMEAL0LAexwYWxsZXRfYmFsYW5jZXM6OkVycm9yPFJ1bnRpbWUsIHBhbGxldF9iYWxhbmNlczo6SW5zdGFuY2UyPgAtACRWb3Rlckxpc3QEAM0LAfRwYWxsZXRfYmFnc19saXN0OjpFcnJvcjxSdW50aW1lLCBwYWxsZXRfYmFnc19saXN0OjpJbnN0YW5jZTE+ACcAPE5vbWluYXRpb25Qb29scwQAFQwBnHBhbGxldF9ub21pbmF0aW9uX3Bvb2xzOjpFcnJvcjxSdW50aW1lPgApACxGYXN0VW5zdGFrZQQAKQwBjHBhbGxldF9mYXN0X3Vuc3Rha2U6OkVycm9yPFJ1bnRpbWU+ACoANENvbmZpZ3VyYXRpb24EADkMAaBwYXJhY2hhaW5zX2NvbmZpZ3VyYXRpb246OkVycm9yPFJ1bnRpbWU+ADMANFBhcmFJbmNsdXNpb24EAFkMAZBwYXJhY2hhaW5zX2luY2x1c2lvbjo6RXJyb3I8UnVudGltZT4ANQAwUGFyYUluaGVyZW50BABxDAGkcGFyYWNoYWluc19wYXJhc19pbmhlcmVudDo6RXJyb3I8UnVudGltZT4ANgAUUGFyYXMEANUMAYBwYXJhY2hhaW5zX3BhcmFzOjpFcnJvcjxSdW50aW1lPgA4ABBIcm1wBAAFDQF8cGFyYWNoYWluc19ocm1wOjpFcnJvcjxSdW50aW1lPgA8ADRQYXJhc0Rpc3B1dGVzBAAlDQGMcGFyYWNoYWluc19kaXNwdXRlczo6RXJyb3I8UnVudGltZT4APgA0UGFyYXNTbGFzaGluZwQAOQ0BjHBhcmFjaGFpbnNfc2xhc2hpbmc6OkVycm9yPFJ1bnRpbWU+AD8AaE9uRGVtYW5kQXNzaWdubWVudFByb3ZpZGVyBABpDQG0cGFyYWNoYWluc19hc3NpZ25lcl9vbl9kZW1hbmQ6OkVycm9yPFJ1bnRpbWU+AEAAaENvcmV0aW1lQXNzaWdubWVudFByb3ZpZGVyBACVDQGwcGFyYWNoYWluc19hc3NpZ25lcl9jb3JldGltZTo6RXJyb3I8UnVudGltZT4AQQAkUmVnaXN0cmFyBACdDQF8cGFyYXNfcmVnaXN0cmFyOjpFcnJvcjxSdW50aW1lPgBGABRTbG90cwQApQ0BVHNsb3RzOjpFcnJvcjxSdW50aW1lPgBHACBBdWN0aW9ucwQAuQ0BYGF1Y3Rpb25zOjpFcnJvcjxSdW50aW1lPgBIACRDcm93ZGxvYW4EAMUNAWRjcm93ZGxvYW46OkVycm9yPFJ1bnRpbWU+AEkAIENvcmV0aW1lBADJDQFgY29yZXRpbWU6OkVycm9yPFJ1bnRpbWU+AEoAJFhjbVBhbGxldAQAHQ4BaHBhbGxldF94Y206OkVycm9yPFJ1bnRpbWU+AGMAME1lc3NhZ2VRdWV1ZQQAOQ4BkHBhbGxldF9tZXNzYWdlX3F1ZXVlOjpFcnJvcjxSdW50aW1lPgBkACRBc3NldFJhdGUEAD0OAYRwYWxsZXRfYXNzZXRfcmF0ZTo6RXJyb3I8UnVudGltZT4AZQAUQmVlZnkEAEkOAXBwYWxsZXRfYmVlZnk6OkVycm9yPFJ1bnRpbWU+AMgAAAEBGFN5c3RlbQEYU3lzdGVtSBxBY2NvdW50AQEEAgAMQQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAToIFRoZSBmdWxsIGFjY291bnQgaW5mb3JtYXRpb24gZm9yIGEgcGFydGljdWxhciBhY2NvdW50IElELjhFeHRyaW5zaWNDb3VudAAAEAQABLggVG90YWwgZXh0cmluc2ljcyBjb3VudCBmb3IgdGhlIGN1cnJlbnQgYmxvY2suQEluaGVyZW50c0FwcGxpZWQBACAEAASkIFdoZXRoZXIgYWxsIGluaGVyZW50cyBoYXZlIGJlZW4gYXBwbGllZC4sQmxvY2tXZWlnaHQBACQYAAAAAAAABIggVGhlIGN1cnJlbnQgd2VpZ2h0IGZvciB0aGUgYmxvY2suQEFsbEV4dHJpbnNpY3NMZW4AABAEAARBASBUb3RhbCBsZW5ndGggKGluIGJ5dGVzKSBmb3IgYWxsIGV4dHJpbnNpY3MgcHV0IHRvZ2V0aGVyLCBmb3IgdGhlIGN1cnJlbnQgYmxvY2suJEJsb2NrSGFzaAEBBAUQNIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASYIE1hcCBvZiBibG9jayBudW1iZXJzIHRvIGJsb2NrIGhhc2hlcy40RXh0cmluc2ljRGF0YQEBBAUQOAQABD0BIEV4dHJpbnNpY3MgZGF0YSBmb3IgdGhlIGN1cnJlbnQgYmxvY2sgKG1hcHMgYW4gZXh0cmluc2ljJ3MgaW5kZXggdG8gaXRzIGRhdGEpLhhOdW1iZXIBABAQAAAAAAQJASBUaGUgY3VycmVudCBibG9jayBudW1iZXIgYmVpbmcgcHJvY2Vzc2VkLiBTZXQgYnkgYGV4ZWN1dGVfYmxvY2tgLihQYXJlbnRIYXNoAQA0gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHAgSGFzaCBvZiB0aGUgcHJldmlvdXMgYmxvY2suGERpZ2VzdAEAPAQABPAgRGlnZXN0IG9mIHRoZSBjdXJyZW50IGJsb2NrLCBhbHNvIHBhcnQgb2YgdGhlIGJsb2NrIGhlYWRlci4YRXZlbnRzAQBMBAAcoCBFdmVudHMgZGVwb3NpdGVkIGZvciB0aGUgY3VycmVudCBibG9jay4AHQEgTk9URTogVGhlIGl0ZW0gaXMgdW5ib3VuZCBhbmQgc2hvdWxkIHRoZXJlZm9yZSBuZXZlciBiZSByZWFkIG9uIGNoYWluLtAgSXQgY291bGQgb3RoZXJ3aXNlIGluZmxhdGUgdGhlIFBvViBzaXplIG9mIGEgYmxvY2suAC0BIEV2ZW50cyBoYXZlIGEgbGFyZ2UgaW4tbWVtb3J5IHNpemUuIEJveCB0aGUgZXZlbnRzIHRvIG5vdCBnbyBvdXQtb2YtbWVtb3J5/CBqdXN0IGluIGNhc2Ugc29tZW9uZSBzdGlsbCByZWFkcyB0aGVtIGZyb20gd2l0aGluIHRoZSBydW50aW1lLihFdmVudENvdW50AQAQEAAAAAAEuCBUaGUgbnVtYmVyIG9mIGV2ZW50cyBpbiB0aGUgYEV2ZW50czxUPmAgbGlzdC4sRXZlbnRUb3BpY3MBAQQCNEEIBAAoJQEgTWFwcGluZyBiZXR3ZWVuIGEgdG9waWMgKHJlcHJlc2VudGVkIGJ5IFQ6Okhhc2gpIGFuZCBhIHZlY3RvciBvZiBpbmRleGVzlCBvZiBldmVudHMgaW4gdGhlIGA8RXZlbnRzPFQ+PmAgbGlzdC4AUQEgQWxsIHRvcGljIHZlY3RvcnMgaGF2ZSBkZXRlcm1pbmlzdGljIHN0b3JhZ2UgbG9jYXRpb25zIGRlcGVuZGluZyBvbiB0aGUgdG9waWMuIFRoaXNFASBhbGxvd3MgbGlnaHQtY2xpZW50cyB0byBsZXZlcmFnZSB0aGUgY2hhbmdlcyB0cmllIHN0b3JhZ2UgdHJhY2tpbmcgbWVjaGFuaXNtIGFuZOQgaW4gY2FzZSBvZiBjaGFuZ2VzIGZldGNoIHRoZSBsaXN0IG9mIGV2ZW50cyBvZiBpbnRlcmVzdC4AWQEgVGhlIHZhbHVlIGhhcyB0aGUgdHlwZSBgKEJsb2NrTnVtYmVyRm9yPFQ+LCBFdmVudEluZGV4KWAgYmVjYXVzZSBpZiB3ZSB1c2VkIG9ubHkganVzdE0BIHRoZSBgRXZlbnRJbmRleGAgdGhlbiBpbiBjYXNlIGlmIHRoZSB0b3BpYyBoYXMgdGhlIHNhbWUgY29udGVudHMgb24gdGhlIG5leHQgYmxvY2sBASBubyBub3RpZmljYXRpb24gd2lsbCBiZSB0cmlnZ2VyZWQgdGh1cyB0aGUgZXZlbnQgbWlnaHQgYmUgbG9zdC5ITGFzdFJ1bnRpbWVVcGdyYWRlAABFCAQABFUBIFN0b3JlcyB0aGUgYHNwZWNfdmVyc2lvbmAgYW5kIGBzcGVjX25hbWVgIG9mIHdoZW4gdGhlIGxhc3QgcnVudGltZSB1cGdyYWRlIGhhcHBlbmVkLlRVcGdyYWRlZFRvVTMyUmVmQ291bnQBACAEAARNASBUcnVlIGlmIHdlIGhhdmUgdXBncmFkZWQgc28gdGhhdCBgdHlwZSBSZWZDb3VudGAgaXMgYHUzMmAuIEZhbHNlIChkZWZhdWx0KSBpZiBub3QuYFVwZ3JhZGVkVG9UcmlwbGVSZWZDb3VudAEAIAQACF0BIFRydWUgaWYgd2UgaGF2ZSB1cGdyYWRlZCBzbyB0aGF0IEFjY291bnRJbmZvIGNvbnRhaW5zIHRocmVlIHR5cGVzIG9mIGBSZWZDb3VudGAuIEZhbHNlSCAoZGVmYXVsdCkgaWYgbm90LjhFeGVjdXRpb25QaGFzZQAAPQgEAASIIFRoZSBleGVjdXRpb24gcGhhc2Ugb2YgdGhlIGJsb2NrLkRBdXRob3JpemVkVXBncmFkZQAATQgEAAS4IGBTb21lYCBpZiBhIGNvZGUgdXBncmFkZSBoYXMgYmVlbiBhdXRob3JpemVkLgFhAQFYGDBCbG9ja1dlaWdodHNRCAECB6gaClMDAAsAIEqp0QET//////////9Cc7sdAAELMPNwj1gBE6NwPQrXo3C9AQsAmPc+XQET/////////78BAABCc7sdAAELMHvD+cwBE6NwPQrXo3D9AQsAIEqp0QET//////////8BBwCIUmp0EwAAAAAAAABAQnO7HQAAAAAE0CBCbG9jayAmIGV4dHJpbnNpY3Mgd2VpZ2h0czogYmFzZSB2YWx1ZXMgYW5kIGxpbWl0cy4sQmxvY2tMZW5ndGhdCDAAADwAAABQAAAAUAAEqCBUaGUgbWF4aW11bSBsZW5ndGggb2YgYSBibG9jayAoaW4gYnl0ZXMpLjhCbG9ja0hhc2hDb3VudBAQABAAAARVASBNYXhpbXVtIG51bWJlciBvZiBibG9jayBudW1iZXIgdG8gYmxvY2sgaGFzaCBtYXBwaW5ncyB0byBrZWVwIChvbGRlc3QgcHJ1bmVkIGZpcnN0KS4gRGJXZWlnaHRlCEBAeH0BAAAAAADh9QUAAAAABAkBIFRoZSB3ZWlnaHQgb2YgcnVudGltZSBkYXRhYmFzZSBvcGVyYXRpb25zIHRoZSBydW50aW1lIGNhbiBpbnZva2UuHFZlcnNpb25pCO0EGGt1c2FtYTRwYXJpdHkta3VzYW1hAgAAAPtNDwAAAAAAXMUf8fo/XQzKAQAAAN9qy2iZB2CbBQAAADfjl/x8kfXkAgAAAED+OtQB+JWaBgAAANK8mJfu0I8VAwAAAPeLJ4vlP0VMAgAAAK8sApeiPm09CwAAAEnqrxtUigywAwAAAJHV3xiw0s9YAgAAACpekkZVOZ5gAQAAAO2ZxayyXu31AwAAAMvKJeOfFCOHAgAAAGh61ErTfwPCAQAAAKs8BXIpH+uLAQAAALydiZBPW5I/AQAAADfIuxNQqaKoBAAAAPP/FNWrUnBZAwAAAG/1LuhY5sW9AQAAAJGxyLFjKOuSAQAAAJ/7UFqnONacAQAAABemvA0AYq6zAQAAABjvWKO2e6dwAQAAAPvFd7nXR+/WAQAAABoAAAABBIQgR2V0IHRoZSBjaGFpbidzIGluLWNvZGUgdmVyc2lvbi4oU1M1OFByZWZpeFUBCAIAFKggVGhlIGRlc2lnbmF0ZWQgU1M1OCBwcmVmaXggb2YgdGhpcyBjaGFpbi4AOQEgVGhpcyByZXBsYWNlcyB0aGUgInNzNThGb3JtYXQiIHByb3BlcnR5IGRlY2xhcmVkIGluIHRoZSBjaGFpbiBzcGVjLiBSZWFzb24gaXMxASB0aGF0IHRoZSBydW50aW1lIHNob3VsZCBrbm93IGFib3V0IHRoZSBwcmVmaXggaW4gb3JkZXIgdG8gbWFrZSB1c2Ugb2YgaXQgYXNwIGFuIGlkZW50aWZpZXIgb2YgdGhlIGNoYWluLgF5CAAAEEJhYmUBEEJhYmVEKEVwb2NoSW5kZXgBADAgAAAAAAAAAAAEVCBDdXJyZW50IGVwb2NoIGluZGV4LixBdXRob3JpdGllcwEAfQgEAARsIEN1cnJlbnQgZXBvY2ggYXV0aG9yaXRpZXMuLEdlbmVzaXNTbG90AQCBASAAAAAAAAAAAAj4IFRoZSBzbG90IGF0IHdoaWNoIHRoZSBmaXJzdCBlcG9jaCBhY3R1YWxseSBzdGFydGVkLiBUaGlzIGlzIDCQIHVudGlsIHRoZSBmaXJzdCBibG9jayBvZiB0aGUgY2hhaW4uLEN1cnJlbnRTbG90AQCBASAAAAAAAAAAAARUIEN1cnJlbnQgc2xvdCBudW1iZXIuKFJhbmRvbW5lc3MBAASAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAouCBUaGUgZXBvY2ggcmFuZG9tbmVzcyBmb3IgdGhlICpjdXJyZW50KiBlcG9jaC4ALCAjIFNlY3VyaXR5AAUBIFRoaXMgTVVTVCBOT1QgYmUgdXNlZCBmb3IgZ2FtYmxpbmcsIGFzIGl0IGNhbiBiZSBpbmZsdWVuY2VkIGJ5IGH4IG1hbGljaW91cyB2YWxpZGF0b3IgaW4gdGhlIHNob3J0IHRlcm0uIEl0IE1BWSBiZSB1c2VkIGluIG1hbnkVASBjcnlwdG9ncmFwaGljIHByb3RvY29scywgaG93ZXZlciwgc28gbG9uZyBhcyBvbmUgcmVtZW1iZXJzIHRoYXQgdGhpcxUBIChsaWtlIGV2ZXJ5dGhpbmcgZWxzZSBvbi1jaGFpbikgaXQgaXMgcHVibGljLiBGb3IgZXhhbXBsZSwgaXQgY2FuIGJlBQEgdXNlZCB3aGVyZSBhIG51bWJlciBpcyBuZWVkZWQgdGhhdCBjYW5ub3QgaGF2ZSBiZWVuIGNob3NlbiBieSBhbg0BIGFkdmVyc2FyeSwgZm9yIHB1cnBvc2VzIHN1Y2ggYXMgcHVibGljLWNvaW4gemVyby1rbm93bGVkZ2UgcHJvb2ZzLmBQZW5kaW5nRXBvY2hDb25maWdDaGFuZ2UAAIkBBAAEYQEgUGVuZGluZyBlcG9jaCBjb25maWd1cmF0aW9uIGNoYW5nZSB0aGF0IHdpbGwgYmUgYXBwbGllZCB3aGVuIHRoZSBuZXh0IGVwb2NoIGlzIGVuYWN0ZWQuOE5leHRSYW5kb21uZXNzAQAEgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFwgTmV4dCBlcG9jaCByYW5kb21uZXNzLjxOZXh0QXV0aG9yaXRpZXMBAH0IBAAEYCBOZXh0IGVwb2NoIGF1dGhvcml0aWVzLjBTZWdtZW50SW5kZXgBABAQAAAAACR8IFJhbmRvbW5lc3MgdW5kZXIgY29uc3RydWN0aW9uLgD4IFdlIG1ha2UgYSB0cmFkZS1vZmYgYmV0d2VlbiBzdG9yYWdlIGFjY2Vzc2VzIGFuZCBsaXN0IGxlbmd0aC4BASBXZSBzdG9yZSB0aGUgdW5kZXItY29uc3RydWN0aW9uIHJhbmRvbW5lc3MgaW4gc2VnbWVudHMgb2YgdXAgdG+UIGBVTkRFUl9DT05TVFJVQ1RJT05fU0VHTUVOVF9MRU5HVEhgLgDsIE9uY2UgYSBzZWdtZW50IHJlYWNoZXMgdGhpcyBsZW5ndGgsIHdlIGJlZ2luIHRoZSBuZXh0IG9uZS4JASBXZSByZXNldCBhbGwgc2VnbWVudHMgYW5kIHJldHVybiB0byBgMGAgYXQgdGhlIGJlZ2lubmluZyBvZiBldmVyeRwgZXBvY2guRFVuZGVyQ29uc3RydWN0aW9uAQEEBRCJCAQABBUBIFRXT1gtTk9URTogYFNlZ21lbnRJbmRleGAgaXMgYW4gaW5jcmVhc2luZyBpbnRlZ2VyLCBzbyB0aGlzIGlzIG9rYXkuLEluaXRpYWxpemVkAACRCAQACAEBIFRlbXBvcmFyeSB2YWx1ZSAoY2xlYXJlZCBhdCBibG9jayBmaW5hbGl6YXRpb24pIHdoaWNoIGlzIGBTb21lYB0BIGlmIHBlci1ibG9jayBpbml0aWFsaXphdGlvbiBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZCBmb3IgY3VycmVudCBibG9jay5MQXV0aG9yVnJmUmFuZG9tbmVzcwEAsQcEABAVASBUaGlzIGZpZWxkIHNob3VsZCBhbHdheXMgYmUgcG9wdWxhdGVkIGR1cmluZyBibG9jayBwcm9jZXNzaW5nIHVubGVzcxkBIHNlY29uZGFyeSBwbGFpbiBzbG90cyBhcmUgZW5hYmxlZCAod2hpY2ggZG9uJ3QgY29udGFpbiBhIFZSRiBvdXRwdXQpLgBJASBJdCBpcyBzZXQgaW4gYG9uX2ZpbmFsaXplYCwgYmVmb3JlIGl0IHdpbGwgY29udGFpbiB0aGUgdmFsdWUgZnJvbSB0aGUgbGFzdCBibG9jay4oRXBvY2hTdGFydAEA9QIgAAAAAAAAAAAUXQEgVGhlIGJsb2NrIG51bWJlcnMgd2hlbiB0aGUgbGFzdCBhbmQgY3VycmVudCBlcG9jaCBoYXZlIHN0YXJ0ZWQsIHJlc3BlY3RpdmVseSBgTi0xYCBhbmQUIGBOYC5JASBOT1RFOiBXZSB0cmFjayB0aGlzIGlzIGluIG9yZGVyIHRvIGFubm90YXRlIHRoZSBibG9jayBudW1iZXIgd2hlbiBhIGdpdmVuIHBvb2wgb2ZZASBlbnRyb3B5IHdhcyBmaXhlZCAoaS5lLiBpdCB3YXMga25vd24gdG8gY2hhaW4gb2JzZXJ2ZXJzKS4gU2luY2UgZXBvY2hzIGFyZSBkZWZpbmVkIGluWQEgc2xvdHMsIHdoaWNoIG1heSBiZSBza2lwcGVkLCB0aGUgYmxvY2sgbnVtYmVycyBtYXkgbm90IGxpbmUgdXAgd2l0aCB0aGUgc2xvdCBudW1iZXJzLiBMYXRlbmVzcwEAEBAAAAAAFNggSG93IGxhdGUgdGhlIGN1cnJlbnQgYmxvY2sgaXMgY29tcGFyZWQgdG8gaXRzIHBhcmVudC4AFQEgVGhpcyBlbnRyeSBpcyBwb3B1bGF0ZWQgYXMgcGFydCBvZiBibG9jayBleGVjdXRpb24gYW5kIGlzIGNsZWFuZWQgdXARASBvbiBibG9jayBmaW5hbGl6YXRpb24uIFF1ZXJ5aW5nIHRoaXMgc3RvcmFnZSBlbnRyeSBvdXRzaWRlIG9mIGJsb2NrsCBleGVjdXRpb24gY29udGV4dCBzaG91bGQgYWx3YXlzIHlpZWxkIHplcm8uLEVwb2NoQ29uZmlnAACpCAQACGEBIFRoZSBjb25maWd1cmF0aW9uIGZvciB0aGUgY3VycmVudCBlcG9jaC4gU2hvdWxkIG5ldmVyIGJlIGBOb25lYCBhcyBpdCBpcyBpbml0aWFsaXplZCBpbiQgZ2VuZXNpcy48TmV4dEVwb2NoQ29uZmlnAACpCAQACC0BIFRoZSBjb25maWd1cmF0aW9uIGZvciB0aGUgbmV4dCBlcG9jaCwgYE5vbmVgIGlmIHRoZSBjb25maWcgd2lsbCBub3QgY2hhbmdl6CAoeW91IGNhbiBmYWxsYmFjayB0byBgRXBvY2hDb25maWdgIGluc3RlYWQgaW4gdGhhdCBjYXNlKS40U2tpcHBlZEVwb2NocwEArQgEACApASBBIGxpc3Qgb2YgdGhlIGxhc3QgMTAwIHNraXBwZWQgZXBvY2hzIGFuZCB0aGUgY29ycmVzcG9uZGluZyBzZXNzaW9uIGluZGV4cCB3aGVuIHRoZSBlcG9jaCB3YXMgc2tpcHBlZC4AMQEgVGhpcyBpcyBvbmx5IHVzZWQgZm9yIHZhbGlkYXRpbmcgZXF1aXZvY2F0aW9uIHByb29mcy4gQW4gZXF1aXZvY2F0aW9uIHByb29mNQEgbXVzdCBjb250YWlucyBhIGtleS1vd25lcnNoaXAgcHJvb2YgZm9yIGEgZ2l2ZW4gc2Vzc2lvbiwgdGhlcmVmb3JlIHdlIG5lZWQgYTkBIHdheSB0byB0aWUgdG9nZXRoZXIgc2Vzc2lvbnMgYW5kIGVwb2NoIGluZGljZXMsIGkuZS4gd2UgbmVlZCB0byB2YWxpZGF0ZSB0aGF0KQEgYSB2YWxpZGF0b3Igd2FzIHRoZSBvd25lciBvZiBhIGdpdmVuIGtleSBvbiBhIGdpdmVuIHNlc3Npb24sIGFuZCB3aGF0IHRoZbAgYWN0aXZlIGVwb2NoIGluZGV4IHdhcyBkdXJpbmcgdGhhdCBzZXNzaW9uLgFxAQAQNEVwb2NoRHVyYXRpb24wIFgCAAAAAAAADOwgVGhlIGFtb3VudCBvZiB0aW1lLCBpbiBzbG90cywgdGhhdCBlYWNoIGVwb2NoIHNob3VsZCBsYXN0LhkBIE5PVEU6IEN1cnJlbnRseSBpdCBpcyBub3QgcG9zc2libGUgdG8gY2hhbmdlIHRoZSBlcG9jaCBkdXJhdGlvbiBhZnRlciEBIHRoZSBjaGFpbiBoYXMgc3RhcnRlZC4gQXR0ZW1wdGluZyB0byBkbyBzbyB3aWxsIGJyaWNrIGJsb2NrIHByb2R1Y3Rpb24uREV4cGVjdGVkQmxvY2tUaW1lMCBwFwAAAAAAABQFASBUaGUgZXhwZWN0ZWQgYXZlcmFnZSBibG9jayB0aW1lIGF0IHdoaWNoIEJBQkUgc2hvdWxkIGJlIGNyZWF0aW5nEQEgYmxvY2tzLiBTaW5jZSBCQUJFIGlzIHByb2JhYmlsaXN0aWMgaXQgaXMgbm90IHRyaXZpYWwgdG8gZmlndXJlIG91dAUBIHdoYXQgdGhlIGV4cGVjdGVkIGF2ZXJhZ2UgYmxvY2sgdGltZSBzaG91bGQgYmUgYmFzZWQgb24gdGhlIHNsb3QJASBkdXJhdGlvbiBhbmQgdGhlIHNlY3VyaXR5IHBhcmFtZXRlciBgY2AgKHdoZXJlIGAxIC0gY2AgcmVwcmVzZW50c6AgdGhlIHByb2JhYmlsaXR5IG9mIGEgc2xvdCBiZWluZyBlbXB0eSkuOE1heEF1dGhvcml0aWVzEBCghgEABIggTWF4IG51bWJlciBvZiBhdXRob3JpdGllcyBhbGxvd2VkNE1heE5vbWluYXRvcnMQEAACAAAE1CBUaGUgbWF4aW11bSBudW1iZXIgb2Ygbm9taW5hdG9ycyBmb3IgZWFjaCB2YWxpZGF0b3IuAbkIAQAkVGltZXN0YW1wASRUaW1lc3RhbXAIDE5vdwEAMCAAAAAAAAAAAASgIFRoZSBjdXJyZW50IHRpbWUgZm9yIHRoZSBjdXJyZW50IGJsb2NrLiREaWRVcGRhdGUBACAEABDYIFdoZXRoZXIgdGhlIHRpbWVzdGFtcCBoYXMgYmVlbiB1cGRhdGVkIGluIHRoaXMgYmxvY2suAFUBIFRoaXMgdmFsdWUgaXMgdXBkYXRlZCB0byBgdHJ1ZWAgdXBvbiBzdWNjZXNzZnVsIHN1Ym1pc3Npb24gb2YgYSB0aW1lc3RhbXAgYnkgYSBub2RlLkUBIEl0IGlzIHRoZW4gY2hlY2tlZCBhdCB0aGUgZW5kIG9mIGVhY2ggYmxvY2sgZXhlY3V0aW9uIGluIHRoZSBgb25fZmluYWxpemVgIGhvb2suAZUBAAQ0TWluaW11bVBlcmlvZDAguAsAAAAAAAAYjCBUaGUgbWluaW11bSBwZXJpb2QgYmV0d2VlbiBibG9ja3MuAE0BIEJlIGF3YXJlIHRoYXQgdGhpcyBpcyBkaWZmZXJlbnQgdG8gdGhlICpleHBlY3RlZCogcGVyaW9kIHRoYXQgdGhlIGJsb2NrIHByb2R1Y3Rpb25JASBhcHBhcmF0dXMgcHJvdmlkZXMuIFlvdXIgY2hvc2VuIGNvbnNlbnN1cyBzeXN0ZW0gd2lsbCBnZW5lcmFsbHkgd29yayB3aXRoIHRoaXMgdG9hASBkZXRlcm1pbmUgYSBzZW5zaWJsZSBibG9jayB0aW1lLiBGb3IgZXhhbXBsZSwgaW4gdGhlIEF1cmEgcGFsbGV0IGl0IHdpbGwgYmUgZG91YmxlIHRoaXNwIHBlcmlvZCBvbiBkZWZhdWx0IHNldHRpbmdzLgACABxJbmRpY2VzARxJbmRpY2VzBCBBY2NvdW50cwABBAIQvQgEAASIIFRoZSBsb29rdXAgZnJvbSBpbmRleCB0byBhY2NvdW50LgGZAQF8BBxEZXBvc2l0GEA0TdLCBwAAAAAAAAAAAAAABKwgVGhlIGRlcG9zaXQgbmVlZGVkIGZvciByZXNlcnZpbmcgYW4gaW5kZXguAcEIAwAgQmFsYW5jZXMBIEJhbGFuY2VzHDRUb3RhbElzc3VhbmNlAQAYQAAAAAAAAAAAAAAAAAAAAAAEmCBUaGUgdG90YWwgdW5pdHMgaXNzdWVkIGluIHRoZSBzeXN0ZW0uQEluYWN0aXZlSXNzdWFuY2UBABhAAAAAAAAAAAAAAAAAAAAAAAQJASBUaGUgdG90YWwgdW5pdHMgb2Ygb3V0c3RhbmRpbmcgZGVhY3RpdmF0ZWQgYmFsYW5jZSBpbiB0aGUgc3lzdGVtLhxBY2NvdW50AQEEAgAUAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAYAkBIFRoZSBCYWxhbmNlcyBwYWxsZXQgZXhhbXBsZSBvZiBzdG9yaW5nIHRoZSBiYWxhbmNlIG9mIGFuIGFjY291bnQuACggIyBFeGFtcGxlADQgYGBgbm9jb21waWxlsCAgaW1wbCBwYWxsZXRfYmFsYW5jZXM6OkNvbmZpZyBmb3IgUnVudGltZSB7GQIgICAgdHlwZSBBY2NvdW50U3RvcmUgPSBTdG9yYWdlTWFwU2hpbTxTZWxmOjpBY2NvdW50PFJ1bnRpbWU+LCBmcmFtZV9zeXN0ZW06OlByb3ZpZGVyPFJ1bnRpbWU+LCBBY2NvdW50SWQsIFNlbGY6OkFjY291bnREYXRhPEJhbGFuY2U+PgwgIH0QIGBgYAAVASBZb3UgY2FuIGFsc28gc3RvcmUgdGhlIGJhbGFuY2Ugb2YgYW4gYWNjb3VudCBpbiB0aGUgYFN5c3RlbWAgcGFsbGV0LgAoICMgRXhhbXBsZQA0IGBgYG5vY29tcGlsZbAgIGltcGwgcGFsbGV0X2JhbGFuY2VzOjpDb25maWcgZm9yIFJ1bnRpbWUge3QgICB0eXBlIEFjY291bnRTdG9yZSA9IFN5c3RlbQwgIH0QIGBgYABRASBCdXQgdGhpcyBjb21lcyB3aXRoIHRyYWRlb2Zmcywgc3RvcmluZyBhY2NvdW50IGJhbGFuY2VzIGluIHRoZSBzeXN0ZW0gcGFsbGV0IHN0b3Jlc20BIGBmcmFtZV9zeXN0ZW1gIGRhdGEgYWxvbmdzaWRlIHRoZSBhY2NvdW50IGRhdGEgY29udHJhcnkgdG8gc3RvcmluZyBhY2NvdW50IGJhbGFuY2VzIGluIHRoZSkBIGBCYWxhbmNlc2AgcGFsbGV0LCB3aGljaCB1c2VzIGEgYFN0b3JhZ2VNYXBgIHRvIHN0b3JlIGJhbGFuY2VzIGRhdGEgb25seS5BASBOT1RFOiBUaGlzIGlzIG9ubHkgdXNlZCBpbiB0aGUgY2FzZSB0aGF0IHRoaXMgcGFsbGV0IGlzIHVzZWQgdG8gc3RvcmUgYmFsYW5jZXMuFExvY2tzAQEEAgDFCAQAELggQW55IGxpcXVpZGl0eSBsb2NrcyBvbiBzb21lIGFjY291bnQgYmFsYW5jZXMuJQEgTk9URTogU2hvdWxkIG9ubHkgYmUgYWNjZXNzZWQgd2hlbiBzZXR0aW5nLCBjaGFuZ2luZyBhbmQgZnJlZWluZyBhIGxvY2suAK0BIFVzZSBvZiBsb2NrcyBpcyBkZXByZWNhdGVkIGluIGZhdm91ciBvZiBmcmVlemVzLiBTZWUgYGh0dHBzOi8vZ2l0aHViLmNvbS9wYXJpdHl0ZWNoL3N1YnN0cmF0ZS9wdWxsLzEyOTUxL2AgUmVzZXJ2ZXMBAQQCANUIBAAMpCBOYW1lZCByZXNlcnZlcyBvbiBzb21lIGFjY291bnQgYmFsYW5jZXMuALEBIFVzZSBvZiByZXNlcnZlcyBpcyBkZXByZWNhdGVkIGluIGZhdm91ciBvZiBob2xkcy4gU2VlIGBodHRwczovL2dpdGh1Yi5jb20vcGFyaXR5dGVjaC9zdWJzdHJhdGUvcHVsbC8xMjk1MS9gFEhvbGRzAQEEAgDhCAQABGwgSG9sZHMgb24gYWNjb3VudCBiYWxhbmNlcy4cRnJlZXplcwEBBAIA+QgEAASIIEZyZWV6ZSBsb2NrcyBvbiBhY2NvdW50IGJhbGFuY2VzLgGpAQGAEEhFeGlzdGVudGlhbERlcG9zaXQYQFVD3hMAAAAAAAAAAAAAAAAgQQEgVGhlIG1pbmltdW0gYW1vdW50IHJlcXVpcmVkIHRvIGtlZXAgYW4gYWNjb3VudCBvcGVuLiBNVVNUIEJFIEdSRUFURVIgVEhBTiBaRVJPIQBZASBJZiB5b3UgKnJlYWxseSogbmVlZCBpdCB0byBiZSB6ZXJvLCB5b3UgY2FuIGVuYWJsZSB0aGUgZmVhdHVyZSBgaW5zZWN1cmVfemVyb19lZGAgZm9yYQEgdGhpcyBwYWxsZXQuIEhvd2V2ZXIsIHlvdSBkbyBzbyBhdCB5b3VyIG93biByaXNrOiB0aGlzIHdpbGwgb3BlbiB1cCBhIG1ham9yIERvUyB2ZWN0b3IuWQEgSW4gY2FzZSB5b3UgaGF2ZSBtdWx0aXBsZSBzb3VyY2VzIG9mIHByb3ZpZGVyIHJlZmVyZW5jZXMsIHlvdSBtYXkgYWxzbyBnZXQgdW5leHBlY3RlZIwgYmVoYXZpb3VyIGlmIHlvdSBzZXQgdGhpcyB0byB6ZXJvLgDwIEJvdHRvbSBsaW5lOiBEbyB5b3Vyc2VsZiBhIGZhdm91ciBhbmQgbWFrZSBpdCBhdCBsZWFzdCBvbmUhIE1heExvY2tzEBAyAAAAEPQgVGhlIG1heGltdW0gbnVtYmVyIG9mIGxvY2tzIHRoYXQgc2hvdWxkIGV4aXN0IG9uIGFuIGFjY291bnQu3CBOb3Qgc3RyaWN0bHkgZW5mb3JjZWQsIGJ1dCB1c2VkIGZvciB3ZWlnaHQgZXN0aW1hdGlvbi4ArQEgVXNlIG9mIGxvY2tzIGlzIGRlcHJlY2F0ZWQgaW4gZmF2b3VyIG9mIGZyZWV6ZXMuIFNlZSBgaHR0cHM6Ly9naXRodWIuY29tL3Bhcml0eXRlY2gvc3Vic3RyYXRlL3B1bGwvMTI5NTEvYCxNYXhSZXNlcnZlcxAQMgAAAAwNASBUaGUgbWF4aW11bSBudW1iZXIgb2YgbmFtZWQgcmVzZXJ2ZXMgdGhhdCBjYW4gZXhpc3Qgb24gYW4gYWNjb3VudC4AsQEgVXNlIG9mIHJlc2VydmVzIGlzIGRlcHJlY2F0ZWQgaW4gZmF2b3VyIG9mIGhvbGRzLiBTZWUgYGh0dHBzOi8vZ2l0aHViLmNvbS9wYXJpdHl0ZWNoL3N1YnN0cmF0ZS9wdWxsLzEyOTUxL2AoTWF4RnJlZXplcxAQCAAAAARhASBUaGUgbWF4aW11bSBudW1iZXIgb2YgaW5kaXZpZHVhbCBmcmVlemUgbG9ja3MgdGhhdCBjYW4gZXhpc3Qgb24gYW4gYWNjb3VudCBhdCBhbnkgdGltZS4BDQkEAEhUcmFuc2FjdGlvblBheW1lbnQBSFRyYW5zYWN0aW9uUGF5bWVudAhETmV4dEZlZU11bHRpcGxpZXIBACEHQAAAZKeztuANAAAAAAAAAAAAOFN0b3JhZ2VWZXJzaW9uAQARCQQAAAABiARgT3BlcmF0aW9uYWxGZWVNdWx0aXBsaWVyCAQFVFkBIEEgZmVlIG11bHRpcGxpZXIgZm9yIGBPcGVyYXRpb25hbGAgZXh0cmluc2ljcyB0byBjb21wdXRlICJ2aXJ0dWFsIHRpcCIgdG8gYm9vc3QgdGhlaXIsIGBwcmlvcml0eWAAUQEgVGhpcyB2YWx1ZSBpcyBtdWx0aXBsaWVkIGJ5IHRoZSBgZmluYWxfZmVlYCB0byBvYnRhaW4gYSAidmlydHVhbCB0aXAiIHRoYXQgaXMgbGF0ZXL0IGFkZGVkIHRvIGEgdGlwIGNvbXBvbmVudCBpbiByZWd1bGFyIGBwcmlvcml0eWAgY2FsY3VsYXRpb25zLk0BIEl0IG1lYW5zIHRoYXQgYSBgTm9ybWFsYCB0cmFuc2FjdGlvbiBjYW4gZnJvbnQtcnVuIGEgc2ltaWxhcmx5LXNpemVkIGBPcGVyYXRpb25hbGBBASBleHRyaW5zaWMgKHdpdGggbm8gdGlwKSwgYnkgaW5jbHVkaW5nIGEgdGlwIHZhbHVlIGdyZWF0ZXIgdGhhbiB0aGUgdmlydHVhbCB0aXAuADwgYGBgcnVzdCxpZ25vcmVAIC8vIEZvciBgTm9ybWFsYIwgbGV0IHByaW9yaXR5ID0gcHJpb3JpdHlfY2FsYyh0aXApOwBUIC8vIEZvciBgT3BlcmF0aW9uYWxgEQEgbGV0IHZpcnR1YWxfdGlwID0gKGluY2x1c2lvbl9mZWUgKyB0aXApICogT3BlcmF0aW9uYWxGZWVNdWx0aXBsaWVyO8QgbGV0IHByaW9yaXR5ID0gcHJpb3JpdHlfY2FsYyh0aXAgKyB2aXJ0dWFsX3RpcCk7ECBgYGAAUQEgTm90ZSB0aGF0IHNpbmNlIHdlIHVzZSBgZmluYWxfZmVlYCB0aGUgbXVsdGlwbGllciBhcHBsaWVzIGFsc28gdG8gdGhlIHJlZ3VsYXIgYHRpcGBdASBzZW50IHdpdGggdGhlIHRyYW5zYWN0aW9uLiBTbywgbm90IG9ubHkgZG9lcyB0aGUgdHJhbnNhY3Rpb24gZ2V0IGEgcHJpb3JpdHkgYnVtcCBiYXNlZGEBIG9uIHRoZSBgaW5jbHVzaW9uX2ZlZWAsIGJ1dCB3ZSBhbHNvIGFtcGxpZnkgdGhlIGltcGFjdCBvZiB0aXBzIGFwcGxpZWQgdG8gYE9wZXJhdGlvbmFsYDggdHJhbnNhY3Rpb25zLgAhAChBdXRob3JzaGlwAShBdXRob3JzaGlwBBhBdXRob3IAAAAEAARkIEF1dGhvciBvZiBjdXJyZW50IGJsb2NrLgAAAAAFABxTdGFraW5nARxTdGFraW5nrDhWYWxpZGF0b3JDb3VudAEAEBAAAAAABJwgVGhlIGlkZWFsIG51bWJlciBvZiBhY3RpdmUgdmFsaWRhdG9ycy5UTWluaW11bVZhbGlkYXRvckNvdW50AQAQEAAAAAAEQQEgTWluaW11bSBudW1iZXIgb2Ygc3Rha2luZyBwYXJ0aWNpcGFudHMgYmVmb3JlIGVtZXJnZW5jeSBjb25kaXRpb25zIGFyZSBpbXBvc2VkLjRJbnZ1bG5lcmFibGVzAQCtAQQADFkBIEFueSB2YWxpZGF0b3JzIHRoYXQgbWF5IG5ldmVyIGJlIHNsYXNoZWQgb3IgZm9yY2libHkga2lja2VkLiBJdCdzIGEgVmVjIHNpbmNlIHRoZXkncmVNASBlYXN5IHRvIGluaXRpYWxpemUgYW5kIHRoZSBwZXJmb3JtYW5jZSBoaXQgaXMgbWluaW1hbCAod2UgZXhwZWN0IG5vIG1vcmUgdGhhbiBmb3VyrCBpbnZ1bG5lcmFibGVzKSBhbmQgcmVzdHJpY3RlZCB0byB0ZXN0bmV0cy4YQm9uZGVkAAEEBQAABAAMAQEgTWFwIGZyb20gYWxsIGxvY2tlZCAic3Rhc2giIGFjY291bnRzIHRvIHRoZSBjb250cm9sbGVyIGFjY291bnQuANAgVFdPWC1OT1RFOiBTQUZFIHNpbmNlIGBBY2NvdW50SWRgIGlzIGEgc2VjdXJlIGhhc2guQE1pbk5vbWluYXRvckJvbmQBABhAAAAAAAAAAAAAAAAAAAAAAAQhASBUaGUgbWluaW11bSBhY3RpdmUgYm9uZCB0byBiZWNvbWUgYW5kIG1haW50YWluIHRoZSByb2xlIG9mIGEgbm9taW5hdG9yLkBNaW5WYWxpZGF0b3JCb25kAQAYQAAAAAAAAAAAAAAAAAAAAAAEIQEgVGhlIG1pbmltdW0gYWN0aXZlIGJvbmQgdG8gYmVjb21lIGFuZCBtYWludGFpbiB0aGUgcm9sZSBvZiBhIHZhbGlkYXRvci5ITWluaW11bUFjdGl2ZVN0YWtlAQAYQAAAAAAAAAAAAAAAAAAAAAAEEQEgVGhlIG1pbmltdW0gYWN0aXZlIG5vbWluYXRvciBzdGFrZSBvZiB0aGUgbGFzdCBzdWNjZXNzZnVsIGVsZWN0aW9uLjRNaW5Db21taXNzaW9uAQCUEAAAAAAM6CBUaGUgbWluaW11bSBhbW91bnQgb2YgY29tbWlzc2lvbiB0aGF0IHZhbGlkYXRvcnMgY2FuIHNldC4AgCBJZiBzZXQgdG8gYDBgLCBubyBsaW1pdCBleGlzdHMuGExlZGdlcgABBAIAFQkEABBFASBNYXAgZnJvbSBhbGwgKHVubG9ja2VkKSAiY29udHJvbGxlciIgYWNjb3VudHMgdG8gdGhlIGluZm8gcmVnYXJkaW5nIHRoZSBzdGFraW5nLgB1ASBOb3RlOiBBbGwgdGhlIHJlYWRzIGFuZCBtdXRhdGlvbnMgdG8gdGhpcyBzdG9yYWdlICpNVVNUKiBiZSBkb25lIHRocm91Z2ggdGhlIG1ldGhvZHMgZXhwb3NlZOggYnkgW2BTdGFraW5nTGVkZ2VyYF0gdG8gZW5zdXJlIGRhdGEgYW5kIGxvY2sgY29uc2lzdGVuY3kuFFBheWVlAAEEBQCQBAAM5CBXaGVyZSB0aGUgcmV3YXJkIHBheW1lbnQgc2hvdWxkIGJlIG1hZGUuIEtleWVkIGJ5IHN0YXNoLgDQIFRXT1gtTk9URTogU0FGRSBzaW5jZSBgQWNjb3VudElkYCBpcyBhIHNlY3VyZSBoYXNoLihWYWxpZGF0b3JzAQEEBQCYCAAADEUBIFRoZSBtYXAgZnJvbSAod2FubmFiZSkgdmFsaWRhdG9yIHN0YXNoIGtleSB0byB0aGUgcHJlZmVyZW5jZXMgb2YgdGhhdCB2YWxpZGF0b3IuANAgVFdPWC1OT1RFOiBTQUZFIHNpbmNlIGBBY2NvdW50SWRgIGlzIGEgc2VjdXJlIGhhc2guUENvdW50ZXJGb3JWYWxpZGF0b3JzAQAQEAAAAAAErENvdW50ZXIgZm9yIHRoZSByZWxhdGVkIGNvdW50ZWQgc3RvcmFnZSBtYXBITWF4VmFsaWRhdG9yc0NvdW50AAAQBAAMMQEgVGhlIG1heGltdW0gdmFsaWRhdG9yIGNvdW50IGJlZm9yZSB3ZSBzdG9wIGFsbG93aW5nIG5ldyB2YWxpZGF0b3JzIHRvIGpvaW4uANAgV2hlbiB0aGlzIHZhbHVlIGlzIG5vdCBzZXQsIG5vIGxpbWl0cyBhcmUgZW5mb3JjZWQuKE5vbWluYXRvcnMAAQQFAB0JBABMdQEgVGhlIG1hcCBmcm9tIG5vbWluYXRvciBzdGFzaCBrZXkgdG8gdGhlaXIgbm9taW5hdGlvbiBwcmVmZXJlbmNlcywgbmFtZWx5IHRoZSB2YWxpZGF0b3JzIHRoYXRYIHRoZXkgd2lzaCB0byBzdXBwb3J0LgA5ASBOb3RlIHRoYXQgdGhlIGtleXMgb2YgdGhpcyBzdG9yYWdlIG1hcCBtaWdodCBiZWNvbWUgbm9uLWRlY29kYWJsZSBpbiBjYXNlIHRoZS0BIGFjY291bnQncyBbYE5vbWluYXRpb25zUXVvdGE6Ok1heE5vbWluYXRpb25zYF0gY29uZmlndXJhdGlvbiBpcyBkZWNyZWFzZWQukCBJbiB0aGlzIHJhcmUgY2FzZSwgdGhlc2Ugbm9taW5hdG9yc2UBIGFyZSBzdGlsbCBleGlzdGVudCBpbiBzdG9yYWdlLCB0aGVpciBrZXkgaXMgY29ycmVjdCBhbmQgcmV0cmlldmFibGUgKGkuZS4gYGNvbnRhaW5zX2tleWBxASBpbmRpY2F0ZXMgdGhhdCB0aGV5IGV4aXN0KSwgYnV0IHRoZWlyIHZhbHVlIGNhbm5vdCBiZSBkZWNvZGVkLiBUaGVyZWZvcmUsIHRoZSBub24tZGVjb2RhYmxlbQEgbm9taW5hdG9ycyB3aWxsIGVmZmVjdGl2ZWx5IG5vdC1leGlzdCwgdW50aWwgdGhleSByZS1zdWJtaXQgdGhlaXIgcHJlZmVyZW5jZXMgc3VjaCB0aGF0IGl0AQEgaXMgd2l0aGluIHRoZSBib3VuZHMgb2YgdGhlIG5ld2x5IHNldCBgQ29uZmlnOjpNYXhOb21pbmF0aW9uc2AuAGEBIFRoaXMgaW1wbGllcyB0aGF0IGA6Oml0ZXJfa2V5cygpLmNvdW50KClgIGFuZCBgOjppdGVyKCkuY291bnQoKWAgbWlnaHQgcmV0dXJuIGRpZmZlcmVudG0BIHZhbHVlcyBmb3IgdGhpcyBtYXAuIE1vcmVvdmVyLCB0aGUgbWFpbiBgOjpjb3VudCgpYCBpcyBhbGlnbmVkIHdpdGggdGhlIGZvcm1lciwgbmFtZWx5IHRoZWwgbnVtYmVyIG9mIGtleXMgdGhhdCBleGlzdC4AbQEgTGFzdGx5LCBpZiBhbnkgb2YgdGhlIG5vbWluYXRvcnMgYmVjb21lIG5vbi1kZWNvZGFibGUsIHRoZXkgY2FuIGJlIGNoaWxsZWQgaW1tZWRpYXRlbHkgdmlhuCBbYENhbGw6OmNoaWxsX290aGVyYF0gZGlzcGF0Y2hhYmxlIGJ5IGFueW9uZS4A0CBUV09YLU5PVEU6IFNBRkUgc2luY2UgYEFjY291bnRJZGAgaXMgYSBzZWN1cmUgaGFzaC5QQ291bnRlckZvck5vbWluYXRvcnMBABAQAAAAAASsQ291bnRlciBmb3IgdGhlIHJlbGF0ZWQgY291bnRlZCBzdG9yYWdlIG1hcDhWaXJ0dWFsU3Rha2VycwABBAUAoQEEABjIIFN0YWtlcnMgd2hvc2UgZnVuZHMgYXJlIG1hbmFnZWQgYnkgb3RoZXIgcGFsbGV0cy4AdQEgVGhpcyBwYWxsZXQgZG9lcyBub3QgYXBwbHkgYW55IGxvY2tzIG9uIHRoZW0sIHRoZXJlZm9yZSB0aGV5IGFyZSBvbmx5IHZpcnR1YWxseSBib25kZWQuIFRoZXltASBhcmUgZXhwZWN0ZWQgdG8gYmUga2V5bGVzcyBhY2NvdW50cyBhbmQgaGVuY2Ugc2hvdWxkIG5vdCBiZSBhbGxvd2VkIHRvIG11dGF0ZSB0aGVpciBsZWRnZXJxASBkaXJlY3RseSB2aWEgdGhpcyBwYWxsZXQuIEluc3RlYWQsIHRoZXNlIGFjY291bnRzIGFyZSBtYW5hZ2VkIGJ5IG90aGVyIHBhbGxldHMgYW5kIGFjY2Vzc2VkKQEgdmlhIGxvdyBsZXZlbCBhcGlzLiBXZSBrZWVwIHRyYWNrIG9mIHRoZW0gdG8gZG8gbWluaW1hbCBpbnRlZ3JpdHkgY2hlY2tzLmBDb3VudGVyRm9yVmlydHVhbFN0YWtlcnMBABAQAAAAAASsQ291bnRlciBmb3IgdGhlIHJlbGF0ZWQgY291bnRlZCBzdG9yYWdlIG1hcEhNYXhOb21pbmF0b3JzQ291bnQAABAEAAwxASBUaGUgbWF4aW11bSBub21pbmF0b3IgY291bnQgYmVmb3JlIHdlIHN0b3AgYWxsb3dpbmcgbmV3IHZhbGlkYXRvcnMgdG8gam9pbi4A0CBXaGVuIHRoaXMgdmFsdWUgaXMgbm90IHNldCwgbm8gbGltaXRzIGFyZSBlbmZvcmNlZC4oQ3VycmVudEVyYQAAEAQAEFwgVGhlIGN1cnJlbnQgZXJhIGluZGV4LgBlASBUaGlzIGlzIHRoZSBsYXRlc3QgcGxhbm5lZCBlcmEsIGRlcGVuZGluZyBvbiBob3cgdGhlIFNlc3Npb24gcGFsbGV0IHF1ZXVlcyB0aGUgdmFsaWRhdG9ygCBzZXQsIGl0IG1pZ2h0IGJlIGFjdGl2ZSBvciBub3QuJEFjdGl2ZUVyYQAAJQkEABDYIFRoZSBhY3RpdmUgZXJhIGluZm9ybWF0aW9uLCBpdCBob2xkcyBpbmRleCBhbmQgc3RhcnQuAFkBIFRoZSBhY3RpdmUgZXJhIGlzIHRoZSBlcmEgYmVpbmcgY3VycmVudGx5IHJld2FyZGVkLiBWYWxpZGF0b3Igc2V0IG9mIHRoaXMgZXJhIG11c3QgYmWsIGVxdWFsIHRvIFtgU2Vzc2lvbkludGVyZmFjZTo6dmFsaWRhdG9yc2BdLlRFcmFzU3RhcnRTZXNzaW9uSW5kZXgAAQQFEBAEABBVASBUaGUgc2Vzc2lvbiBpbmRleCBhdCB3aGljaCB0aGUgZXJhIHN0YXJ0IGZvciB0aGUgbGFzdCBbYENvbmZpZzo6SGlzdG9yeURlcHRoYF0gZXJhcy4AYQEgTm90ZTogVGhpcyB0cmFja3MgdGhlIHN0YXJ0aW5nIHNlc3Npb24gKGkuZS4gc2Vzc2lvbiBpbmRleCB3aGVuIGVyYSBzdGFydCBiZWluZyBhY3RpdmUp8CBmb3IgdGhlIGVyYXMgaW4gYFtDdXJyZW50RXJhIC0gSElTVE9SWV9ERVBUSCwgQ3VycmVudEVyYV1gLixFcmFzU3Rha2VycwEBCAUFLQkxCQwAAAAgeCBFeHBvc3VyZSBvZiB2YWxpZGF0b3IgYXQgZXJhLgBhASBUaGlzIGlzIGtleWVkIGZpcnN0IGJ5IHRoZSBlcmEgaW5kZXggdG8gYWxsb3cgYnVsayBkZWxldGlvbiBhbmQgdGhlbiB0aGUgc3Rhc2ggYWNjb3VudC4AzCBJcyBpdCByZW1vdmVkIGFmdGVyIFtgQ29uZmlnOjpIaXN0b3J5RGVwdGhgXSBlcmFzLkEBIElmIHN0YWtlcnMgaGFzbid0IGJlZW4gc2V0IG9yIGhhcyBiZWVuIHJlbW92ZWQgdGhlbiBlbXB0eSBleHBvc3VyZSBpcyByZXR1cm5lZC4AKQEgTm90ZTogRGVwcmVjYXRlZCBzaW5jZSB2MTQuIFVzZSBgRXJhSW5mb2AgaW5zdGVhZCB0byB3b3JrIHdpdGggZXhwb3N1cmVzLkxFcmFzU3Rha2Vyc092ZXJ2aWV3AAEIBQUtCT0JBAAwuCBTdW1tYXJ5IG9mIHZhbGlkYXRvciBleHBvc3VyZSBhdCBhIGdpdmVuIGVyYS4AcQEgVGhpcyBjb250YWlucyB0aGUgdG90YWwgc3Rha2UgaW4gc3VwcG9ydCBvZiB0aGUgdmFsaWRhdG9yIGFuZCB0aGVpciBvd24gc3Rha2UuIEluIGFkZGl0aW9uLHUBIGl0IGNhbiBhbHNvIGJlIHVzZWQgdG8gZ2V0IHRoZSBudW1iZXIgb2Ygbm9taW5hdG9ycyBiYWNraW5nIHRoaXMgdmFsaWRhdG9yIGFuZCB0aGUgbnVtYmVyIG9maQEgZXhwb3N1cmUgcGFnZXMgdGhleSBhcmUgZGl2aWRlZCBpbnRvLiBUaGUgcGFnZSBjb3VudCBpcyB1c2VmdWwgdG8gZGV0ZXJtaW5lIHRoZSBudW1iZXIgb2asIHBhZ2VzIG9mIHJld2FyZHMgdGhhdCBuZWVkcyB0byBiZSBjbGFpbWVkLgBhASBUaGlzIGlzIGtleWVkIGZpcnN0IGJ5IHRoZSBlcmEgaW5kZXggdG8gYWxsb3cgYnVsayBkZWxldGlvbiBhbmQgdGhlbiB0aGUgc3Rhc2ggYWNjb3VudC6sIFNob3VsZCBvbmx5IGJlIGFjY2Vzc2VkIHRocm91Z2ggYEVyYUluZm9gLgDMIElzIGl0IHJlbW92ZWQgYWZ0ZXIgW2BDb25maWc6Okhpc3RvcnlEZXB0aGBdIGVyYXMuQQEgSWYgc3Rha2VycyBoYXNuJ3QgYmVlbiBzZXQgb3IgaGFzIGJlZW4gcmVtb3ZlZCB0aGVuIGVtcHR5IG92ZXJ2aWV3IGlzIHJldHVybmVkLkhFcmFzU3Rha2Vyc0NsaXBwZWQBAQgFBS0JMQkMAAAAQJggQ2xpcHBlZCBFeHBvc3VyZSBvZiB2YWxpZGF0b3IgYXQgZXJhLgBlASBOb3RlOiBUaGlzIGlzIGRlcHJlY2F0ZWQsIHNob3VsZCBiZSB1c2VkIGFzIHJlYWQtb25seSBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUuMQEgTmV3IGBFeHBvc3VyZWBzIGFyZSBzdG9yZWQgaW4gYSBwYWdlZCBtYW5uZXIgaW4gYEVyYXNTdGFrZXJzUGFnZWRgIGluc3RlYWQuAFkBIFRoaXMgaXMgc2ltaWxhciB0byBbYEVyYXNTdGFrZXJzYF0gYnV0IG51bWJlciBvZiBub21pbmF0b3JzIGV4cG9zZWQgaXMgcmVkdWNlZCB0byB0aGWoIGBUOjpNYXhFeHBvc3VyZVBhZ2VTaXplYCBiaWdnZXN0IHN0YWtlcnMuHQEgKE5vdGU6IHRoZSBmaWVsZCBgdG90YWxgIGFuZCBgb3duYCBvZiB0aGUgZXhwb3N1cmUgcmVtYWlucyB1bmNoYW5nZWQpLvQgVGhpcyBpcyB1c2VkIHRvIGxpbWl0IHRoZSBpL28gY29zdCBmb3IgdGhlIG5vbWluYXRvciBwYXlvdXQuAF0BIFRoaXMgaXMga2V5ZWQgZmlzdCBieSB0aGUgZXJhIGluZGV4IHRvIGFsbG93IGJ1bGsgZGVsZXRpb24gYW5kIHRoZW4gdGhlIHN0YXNoIGFjY291bnQuAMwgSXQgaXMgcmVtb3ZlZCBhZnRlciBbYENvbmZpZzo6SGlzdG9yeURlcHRoYF0gZXJhcy5BASBJZiBzdGFrZXJzIGhhc24ndCBiZWVuIHNldCBvciBoYXMgYmVlbiByZW1vdmVkIHRoZW4gZW1wdHkgZXhwb3N1cmUgaXMgcmV0dXJuZWQuACkBIE5vdGU6IERlcHJlY2F0ZWQgc2luY2UgdjE0LiBVc2UgYEVyYUluZm9gIGluc3RlYWQgdG8gd29yayB3aXRoIGV4cG9zdXJlcy5ARXJhc1N0YWtlcnNQYWdlZAABDAUFBUEJRQkEABjAIFBhZ2luYXRlZCBleHBvc3VyZSBvZiBhIHZhbGlkYXRvciBhdCBnaXZlbiBlcmEuAHEBIFRoaXMgaXMga2V5ZWQgZmlyc3QgYnkgdGhlIGVyYSBpbmRleCB0byBhbGxvdyBidWxrIGRlbGV0aW9uLCB0aGVuIHN0YXNoIGFjY291bnQgYW5kIGZpbmFsbHnUIHRoZSBwYWdlLiBTaG91bGQgb25seSBiZSBhY2Nlc3NlZCB0aHJvdWdoIGBFcmFJbmZvYC4A1CBUaGlzIGlzIGNsZWFyZWQgYWZ0ZXIgW2BDb25maWc6Okhpc3RvcnlEZXB0aGBdIGVyYXMuOENsYWltZWRSZXdhcmRzAQEIBQUtCcEBBAAY3CBIaXN0b3J5IG9mIGNsYWltZWQgcGFnZWQgcmV3YXJkcyBieSBlcmEgYW5kIHZhbGlkYXRvci4AaQEgVGhpcyBpcyBrZXllZCBieSBlcmEgYW5kIHZhbGlkYXRvciBzdGFzaCB3aGljaCBtYXBzIHRvIHRoZSBzZXQgb2YgcGFnZSBpbmRleGVzIHdoaWNoIGhhdmU4IGJlZW4gY2xhaW1lZC4AzCBJdCBpcyByZW1vdmVkIGFmdGVyIFtgQ29uZmlnOjpIaXN0b3J5RGVwdGhgXSBlcmFzLkhFcmFzVmFsaWRhdG9yUHJlZnMBAQgFBS0JmAgAABQRASBTaW1pbGFyIHRvIGBFcmFzU3Rha2Vyc2AsIHRoaXMgaG9sZHMgdGhlIHByZWZlcmVuY2VzIG9mIHZhbGlkYXRvcnMuAGEBIFRoaXMgaXMga2V5ZWQgZmlyc3QgYnkgdGhlIGVyYSBpbmRleCB0byBhbGxvdyBidWxrIGRlbGV0aW9uIGFuZCB0aGVuIHRoZSBzdGFzaCBhY2NvdW50LgDMIElzIGl0IHJlbW92ZWQgYWZ0ZXIgW2BDb25maWc6Okhpc3RvcnlEZXB0aGBdIGVyYXMuTEVyYXNWYWxpZGF0b3JSZXdhcmQAAQQFEBgEAAwtASBUaGUgdG90YWwgdmFsaWRhdG9yIGVyYSBwYXlvdXQgZm9yIHRoZSBsYXN0IFtgQ29uZmlnOjpIaXN0b3J5RGVwdGhgXSBlcmFzLgAhASBFcmFzIHRoYXQgaGF2ZW4ndCBmaW5pc2hlZCB5ZXQgb3IgaGFzIGJlZW4gcmVtb3ZlZCBkb2Vzbid0IGhhdmUgcmV3YXJkLkBFcmFzUmV3YXJkUG9pbnRzAQEEBRBJCRQAAAAAAAjQIFJld2FyZHMgZm9yIHRoZSBsYXN0IFtgQ29uZmlnOjpIaXN0b3J5RGVwdGhgXSBlcmFzLiUBIElmIHJld2FyZCBoYXNuJ3QgYmVlbiBzZXQgb3IgaGFzIGJlZW4gcmVtb3ZlZCB0aGVuIDAgcmV3YXJkIGlzIHJldHVybmVkLjhFcmFzVG90YWxTdGFrZQEBBAUQGEAAAAAAAAAAAAAAAAAAAAAACBEBIFRoZSB0b3RhbCBhbW91bnQgc3Rha2VkIGZvciB0aGUgbGFzdCBbYENvbmZpZzo6SGlzdG9yeURlcHRoYF0gZXJhcy4dASBJZiB0b3RhbCBoYXNuJ3QgYmVlbiBzZXQgb3IgaGFzIGJlZW4gcmVtb3ZlZCB0aGVuIDAgc3Rha2UgaXMgcmV0dXJuZWQuIEZvcmNlRXJhAQCgBAAEVCBNb2RlIG9mIGVyYSBmb3JjaW5nLkBNYXhTdGFrZWRSZXdhcmRzAAC9AQQADBkBIE1heGltdW0gc3Rha2VkIHJld2FyZHMsIGkuZS4gdGhlIHBlcmNlbnRhZ2Ugb2YgdGhlIGVyYSBpbmZsYXRpb24gdGhhdGwgaXMgdXNlZCBmb3Igc3Rha2UgcmV3YXJkcy6sIFNlZSBbRXJhIHBheW91dF0oLi9pbmRleC5odG1sI2VyYS1wYXlvdXQpLkxTbGFzaFJld2FyZEZyYWN0aW9uAQCUEAAAAAAM+CBUaGUgcGVyY2VudGFnZSBvZiB0aGUgc2xhc2ggdGhhdCBpcyBkaXN0cmlidXRlZCB0byByZXBvcnRlcnMuAOQgVGhlIHJlc3Qgb2YgdGhlIHNsYXNoZWQgdmFsdWUgaXMgaGFuZGxlZCBieSB0aGUgYFNsYXNoYC5MQ2FuY2VsZWRTbGFzaFBheW91dAEAGEAAAAAAAAAAAAAAAAAAAAAACBUBIFRoZSBhbW91bnQgb2YgY3VycmVuY3kgZ2l2ZW4gdG8gcmVwb3J0ZXJzIG9mIGEgc2xhc2ggZXZlbnQgd2hpY2ggd2Fz7CBjYW5jZWxlZCBieSBleHRyYW9yZGluYXJ5IGNpcmN1bXN0YW5jZXMgKGUuZy4gZ292ZXJuYW5jZSkuQFVuYXBwbGllZFNsYXNoZXMBAQQFEFkJBAAExCBBbGwgdW5hcHBsaWVkIHNsYXNoZXMgdGhhdCBhcmUgcXVldWVkIGZvciBsYXRlci4oQm9uZGVkRXJhcwEAQQgEABAlASBBIG1hcHBpbmcgZnJvbSBzdGlsbC1ib25kZWQgZXJhcyB0byB0aGUgZmlyc3Qgc2Vzc2lvbiBpbmRleCBvZiB0aGF0IGVyYS4AyCBNdXN0IGNvbnRhaW5zIGluZm9ybWF0aW9uIGZvciBlcmFzIGZvciB0aGUgcmFuZ2U6vCBgW2FjdGl2ZV9lcmEgLSBib3VuZGluZ19kdXJhdGlvbjsgYWN0aXZlX2VyYV1gTFZhbGlkYXRvclNsYXNoSW5FcmEAAQgFBS0JYQkEAAhFASBBbGwgc2xhc2hpbmcgZXZlbnRzIG9uIHZhbGlkYXRvcnMsIG1hcHBlZCBieSBlcmEgdG8gdGhlIGhpZ2hlc3Qgc2xhc2ggcHJvcG9ydGlvbnAgYW5kIHNsYXNoIHZhbHVlIG9mIHRoZSBlcmEuTE5vbWluYXRvclNsYXNoSW5FcmEAAQgFBS0JGAQABGEBIEFsbCBzbGFzaGluZyBldmVudHMgb24gbm9taW5hdG9ycywgbWFwcGVkIGJ5IGVyYSB0byB0aGUgaGlnaGVzdCBzbGFzaCB2YWx1ZSBvZiB0aGUgZXJhLjRTbGFzaGluZ1NwYW5zAAEEBQBlCQQABIwgU2xhc2hpbmcgc3BhbnMgZm9yIHN0YXNoIGFjY291bnRzLiRTcGFuU2xhc2gBAQQFVQlpCYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAg9ASBSZWNvcmRzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBtYXhpbXVtIHNsYXNoIG9mIGEgc3Rhc2ggd2l0aGluIGEgc2xhc2hpbmcgc3Bhbiy4IGFzIHdlbGwgYXMgaG93IG11Y2ggcmV3YXJkIGhhcyBiZWVuIHBhaWQgb3V0LlRDdXJyZW50UGxhbm5lZFNlc3Npb24BABAQAAAAAAzoIFRoZSBsYXN0IHBsYW5uZWQgc2Vzc2lvbiBzY2hlZHVsZWQgYnkgdGhlIHNlc3Npb24gcGFsbGV0LgBxASBUaGlzIGlzIGJhc2ljYWxseSBpbiBzeW5jIHdpdGggdGhlIGNhbGwgdG8gW2BwYWxsZXRfc2Vzc2lvbjo6U2Vzc2lvbk1hbmFnZXI6Om5ld19zZXNzaW9uYF0uSERpc2FibGVkVmFsaWRhdG9ycwEAwQEEABx1ASBJbmRpY2VzIG9mIHZhbGlkYXRvcnMgdGhhdCBoYXZlIG9mZmVuZGVkIGluIHRoZSBhY3RpdmUgZXJhLiBUaGUgb2ZmZW5kZXJzIGFyZSBkaXNhYmxlZCBmb3IgYWkBIHdob2xlIGVyYS4gRm9yIHRoaXMgcmVhc29uIHRoZXkgYXJlIGtlcHQgaGVyZSAtIG9ubHkgc3Rha2luZyBwYWxsZXQga25vd3MgYWJvdXQgZXJhcy4gVGhlVQEgaW1wbGVtZW50b3Igb2YgW2BEaXNhYmxpbmdTdHJhdGVneWBdIGRlZmluZXMgaWYgYSB2YWxpZGF0b3Igc2hvdWxkIGJlIGRpc2FibGVkIHdoaWNobQEgaW1wbGljaXRseSBtZWFucyB0aGF0IHRoZSBpbXBsZW1lbnRvciBhbHNvIGNvbnRyb2xzIHRoZSBtYXggbnVtYmVyIG9mIGRpc2FibGVkIHZhbGlkYXRvcnMuAG0BIFRoZSB2ZWMgaXMgYWx3YXlzIGtlcHQgc29ydGVkIHNvIHRoYXQgd2UgY2FuIGZpbmQgd2hldGhlciBhIGdpdmVuIHZhbGlkYXRvciBoYXMgcHJldmlvdXNseXggb2ZmZW5kZWQgdXNpbmcgYmluYXJ5IHNlYXJjaC44Q2hpbGxUaHJlc2hvbGQAAL0BBAAMUQEgVGhlIHRocmVzaG9sZCBmb3Igd2hlbiB1c2VycyBjYW4gc3RhcnQgY2FsbGluZyBgY2hpbGxfb3RoZXJgIGZvciBvdGhlciB2YWxpZGF0b3JzIC9ZASBub21pbmF0b3JzLiBUaGUgdGhyZXNob2xkIGlzIGNvbXBhcmVkIHRvIHRoZSBhY3R1YWwgbnVtYmVyIG9mIHZhbGlkYXRvcnMgLyBub21pbmF0b3JzKQEgKGBDb3VudEZvcipgKSBpbiB0aGUgc3lzdGVtIGNvbXBhcmVkIHRvIHRoZSBjb25maWd1cmVkIG1heCAoYE1heCpDb3VudGApLgG1AQGMGDBIaXN0b3J5RGVwdGgQEFQAAABQjCBOdW1iZXIgb2YgZXJhcyB0byBrZWVwIGluIGhpc3RvcnkuAOggRm9sbG93aW5nIGluZm9ybWF0aW9uIGlzIGtlcHQgZm9yIGVyYXMgaW4gYFtjdXJyZW50X2VyYSAtCQEgSGlzdG9yeURlcHRoLCBjdXJyZW50X2VyYV1gOiBgRXJhc1N0YWtlcnNgLCBgRXJhc1N0YWtlcnNDbGlwcGVkYCwFASBgRXJhc1ZhbGlkYXRvclByZWZzYCwgYEVyYXNWYWxpZGF0b3JSZXdhcmRgLCBgRXJhc1Jld2FyZFBvaW50c2AsRQEgYEVyYXNUb3RhbFN0YWtlYCwgYEVyYXNTdGFydFNlc3Npb25JbmRleGAsIGBDbGFpbWVkUmV3YXJkc2AsIGBFcmFzU3Rha2Vyc1BhZ2VkYCxcIGBFcmFzU3Rha2Vyc092ZXJ2aWV3YC4A5CBNdXN0IGJlIG1vcmUgdGhhbiB0aGUgbnVtYmVyIG9mIGVyYXMgZGVsYXllZCBieSBzZXNzaW9uLvggSS5lLiBhY3RpdmUgZXJhIG11c3QgYWx3YXlzIGJlIGluIGhpc3RvcnkuIEkuZS4gYGFjdGl2ZV9lcmEgPsQgY3VycmVudF9lcmEgLSBoaXN0b3J5X2RlcHRoYCBtdXN0IGJlIGd1YXJhbnRlZWQuABEBIElmIG1pZ3JhdGluZyBhbiBleGlzdGluZyBwYWxsZXQgZnJvbSBzdG9yYWdlIHZhbHVlIHRvIGNvbmZpZyB2YWx1ZSzsIHRoaXMgc2hvdWxkIGJlIHNldCB0byBzYW1lIHZhbHVlIG9yIGdyZWF0ZXIgYXMgaW4gc3RvcmFnZS4AFQEgTm90ZTogYEhpc3RvcnlEZXB0aGAgaXMgdXNlZCBhcyB0aGUgdXBwZXIgYm91bmQgZm9yIHRoZSBgQm91bmRlZFZlY2AtASBpdGVtIGBTdGFraW5nTGVkZ2VyLmxlZ2FjeV9jbGFpbWVkX3Jld2FyZHNgLiBTZXR0aW5nIHRoaXMgdmFsdWUgbG93ZXIgdGhhbtggdGhlIGV4aXN0aW5nIHZhbHVlIGNhbiBsZWFkIHRvIGluY29uc2lzdGVuY2llcyBpbiB0aGUVASBgU3Rha2luZ0xlZGdlcmAgYW5kIHdpbGwgbmVlZCB0byBiZSBoYW5kbGVkIHByb3Blcmx5IGluIGEgbWlncmF0aW9uLvAgVGhlIHRlc3QgYHJlZHVjaW5nX2hpc3RvcnlfZGVwdGhfYWJydXB0YCBzaG93cyB0aGlzIGVmZmVjdC44U2Vzc2lvbnNQZXJFcmEQEAYAAAAEcCBOdW1iZXIgb2Ygc2Vzc2lvbnMgcGVyIGVyYS48Qm9uZGluZ0R1cmF0aW9uEBAcAAAABOQgTnVtYmVyIG9mIGVyYXMgdGhhdCBzdGFrZWQgZnVuZHMgbXVzdCByZW1haW4gYm9uZGVkIGZvci5IU2xhc2hEZWZlckR1cmF0aW9uEBAbAAAAEAEBIE51bWJlciBvZiBlcmFzIHRoYXQgc2xhc2hlcyBhcmUgZGVmZXJyZWQgYnksIGFmdGVyIGNvbXB1dGF0aW9uLgANASBUaGlzIHNob3VsZCBiZSBsZXNzIHRoYW4gdGhlIGJvbmRpbmcgZHVyYXRpb24uIFNldCB0byAwIGlmIHNsYXNoZXMVASBzaG91bGQgYmUgYXBwbGllZCBpbW1lZGlhdGVseSwgd2l0aG91dCBvcHBvcnR1bml0eSBmb3IgaW50ZXJ2ZW50aW9uLkxNYXhFeHBvc3VyZVBhZ2VTaXplEBAAAgAALLAgVGhlIG1heGltdW0gc2l6ZSBvZiBlYWNoIGBUOjpFeHBvc3VyZVBhZ2VgLgApASBBbiBgRXhwb3N1cmVQYWdlYCBpcyB3ZWFrbHkgYm91bmRlZCB0byBhIG1heGltdW0gb2YgYE1heEV4cG9zdXJlUGFnZVNpemVgMCBub21pbmF0b3JzLgAhASBGb3Igb2xkZXIgbm9uLXBhZ2VkIGV4cG9zdXJlLCBhIHJld2FyZCBwYXlvdXQgd2FzIHJlc3RyaWN0ZWQgdG8gdGhlIHRvcCEBIGBNYXhFeHBvc3VyZVBhZ2VTaXplYCBub21pbmF0b3JzLiBUaGlzIGlzIHRvIGxpbWl0IHRoZSBpL28gY29zdCBmb3IgdGhlSCBub21pbmF0b3IgcGF5b3V0LgBZASBOb3RlOiBgTWF4RXhwb3N1cmVQYWdlU2l6ZWAgaXMgdXNlZCB0byBib3VuZCBgQ2xhaW1lZFJld2FyZHNgIGFuZCBpcyB1bnNhZmUgdG8gcmVkdWNlkCB3aXRob3V0IGhhbmRsaW5nIGl0IGluIGEgbWlncmF0aW9uLkhNYXhVbmxvY2tpbmdDaHVua3MQECAAAAAoBQEgVGhlIG1heGltdW0gbnVtYmVyIG9mIGB1bmxvY2tpbmdgIGNodW5rcyBhIFtgU3Rha2luZ0xlZGdlcmBdIGNhbgkBIGhhdmUuIEVmZmVjdGl2ZWx5IGRldGVybWluZXMgaG93IG1hbnkgdW5pcXVlIGVyYXMgYSBzdGFrZXIgbWF5IGJlOCB1bmJvbmRpbmcgaW4uAPggTm90ZTogYE1heFVubG9ja2luZ0NodW5rc2AgaXMgdXNlZCBhcyB0aGUgdXBwZXIgYm91bmQgZm9yIHRoZQEBIGBCb3VuZGVkVmVjYCBpdGVtIGBTdGFraW5nTGVkZ2VyLnVubG9ja2luZ2AuIFNldHRpbmcgdGhpcyB2YWx1ZQUBIGxvd2VyIHRoYW4gdGhlIGV4aXN0aW5nIHZhbHVlIGNhbiBsZWFkIHRvIGluY29uc2lzdGVuY2llcyBpbiB0aGUJASBgU3Rha2luZ0xlZGdlcmAgYW5kIHdpbGwgbmVlZCB0byBiZSBoYW5kbGVkIHByb3Blcmx5IGluIGEgcnVudGltZQUBIG1pZ3JhdGlvbi4gVGhlIHRlc3QgYHJlZHVjaW5nX21heF91bmxvY2tpbmdfY2h1bmtzX2FicnVwdGAgc2hvd3M0IHRoaXMgZWZmZWN0LgFtCQYAIE9mZmVuY2VzASBPZmZlbmNlcwgcUmVwb3J0cwABBAU0cQkEAARJASBUaGUgcHJpbWFyeSBzdHJ1Y3R1cmUgdGhhdCBob2xkcyBhbGwgb2ZmZW5jZSByZWNvcmRzIGtleWVkIGJ5IHJlcG9ydCBpZGVudGlmaWVycy5YQ29uY3VycmVudFJlcG9ydHNJbmRleAEBCAUFeQkVAwQABCkBIEEgdmVjdG9yIG9mIHJlcG9ydHMgb2YgdGhlIHNhbWUga2luZCB0aGF0IGhhcHBlbmVkIGF0IHRoZSBzYW1lIHRpbWUgc2xvdC4AAaQAAAcAKEhpc3RvcmljYWwBKEhpc3RvcmljYWwISEhpc3RvcmljYWxTZXNzaW9ucwABBAUQfQkEAARdASBNYXBwaW5nIGZyb20gaGlzdG9yaWNhbCBzZXNzaW9uIGluZGljZXMgdG8gc2Vzc2lvbi1kYXRhIHJvb3QgaGFzaCBhbmQgdmFsaWRhdG9yIGNvdW50LixTdG9yZWRSYW5nZQAA9QIEAATkIFRoZSByYW5nZSBvZiBoaXN0b3JpY2FsIHNlc3Npb25zIHdlIHN0b3JlLiBbZmlyc3QsIGxhc3QpAAAAACIAHFNlc3Npb24BHFNlc3Npb24cKFZhbGlkYXRvcnMBAK0BBAAEfCBUaGUgY3VycmVudCBzZXQgb2YgdmFsaWRhdG9ycy4wQ3VycmVudEluZGV4AQAQEAAAAAAEeCBDdXJyZW50IGluZGV4IG9mIHRoZSBzZXNzaW9uLjRRdWV1ZWRDaGFuZ2VkAQAgBAAIOQEgVHJ1ZSBpZiB0aGUgdW5kZXJseWluZyBlY29ub21pYyBpZGVudGl0aWVzIG9yIHdlaWdodGluZyBiZWhpbmQgdGhlIHZhbGlkYXRvcnOkIGhhcyBjaGFuZ2VkIGluIHRoZSBxdWV1ZWQgdmFsaWRhdG9yIHNldC4oUXVldWVkS2V5cwEAgQkEAAg9ASBUaGUgcXVldWVkIGtleXMgZm9yIHRoZSBuZXh0IHNlc3Npb24uIFdoZW4gdGhlIG5leHQgc2Vzc2lvbiBiZWdpbnMsIHRoZXNlIGtleXPgIHdpbGwgYmUgdXNlZCB0byBkZXRlcm1pbmUgdGhlIHZhbGlkYXRvcidzIHNlc3Npb24ga2V5cy5IRGlzYWJsZWRWYWxpZGF0b3JzAQDBAQQAFIAgSW5kaWNlcyBvZiBkaXNhYmxlZCB2YWxpZGF0b3JzLgA9ASBUaGUgdmVjIGlzIGFsd2F5cyBrZXB0IHNvcnRlZCBzbyB0aGF0IHdlIGNhbiBmaW5kIHdoZXRoZXIgYSBnaXZlbiB2YWxpZGF0b3IgaXM9ASBkaXNhYmxlZCB1c2luZyBiaW5hcnkgc2VhcmNoLiBJdCBnZXRzIGNsZWFyZWQgd2hlbiBgb25fc2Vzc2lvbl9lbmRpbmdgIHJldHVybnNkIGEgbmV3IHNldCBvZiBpZGVudGl0aWVzLiBOZXh0S2V5cwABBAUA9QEEAAScIFRoZSBuZXh0IHNlc3Npb24ga2V5cyBmb3IgYSB2YWxpZGF0b3IuIEtleU93bmVyAAEEBYkJAAQABAkBIFRoZSBvd25lciBvZiBhIGtleS4gVGhlIGtleSBpcyB0aGUgYEtleVR5cGVJZGAgKyB0aGUgZW5jb2RlZCBrZXkuAfEBAawAAZEJCAAcR3JhbmRwYQEcR3JhbmRwYRwUU3RhdGUBAJUJBAAEkCBTdGF0ZSBvZiB0aGUgY3VycmVudCBhdXRob3JpdHkgc2V0LjRQZW5kaW5nQ2hhbmdlAACZCQQABMQgUGVuZGluZyBjaGFuZ2U6IChzaWduYWxlZCBhdCwgc2NoZWR1bGVkIGNoYW5nZSkuKE5leHRGb3JjZWQAABAEAAS8IG5leHQgYmxvY2sgbnVtYmVyIHdoZXJlIHdlIGNhbiBmb3JjZSBhIGNoYW5nZS4cU3RhbGxlZAAA9QIEAASQIGB0cnVlYCBpZiB3ZSBhcmUgY3VycmVudGx5IHN0YWxsZWQuMEN1cnJlbnRTZXRJZAEAMCAAAAAAAAAAAAhdASBUaGUgbnVtYmVyIG9mIGNoYW5nZXMgKGJvdGggaW4gdGVybXMgb2Yga2V5cyBhbmQgdW5kZXJseWluZyBlY29ub21pYyByZXNwb25zaWJpbGl0aWVzKcQgaW4gdGhlICJzZXQiIG9mIEdyYW5kcGEgdmFsaWRhdG9ycyBmcm9tIGdlbmVzaXMuMFNldElkU2Vzc2lvbgABBAUwEAQAKFkBIEEgbWFwcGluZyBmcm9tIGdyYW5kcGEgc2V0IElEIHRvIHRoZSBpbmRleCBvZiB0aGUgKm1vc3QgcmVjZW50KiBzZXNzaW9uIGZvciB3aGljaCBpdHNoIG1lbWJlcnMgd2VyZSByZXNwb25zaWJsZS4ARQEgVGhpcyBpcyBvbmx5IHVzZWQgZm9yIHZhbGlkYXRpbmcgZXF1aXZvY2F0aW9uIHByb29mcy4gQW4gZXF1aXZvY2F0aW9uIHByb29mIG11c3RNASBjb250YWlucyBhIGtleS1vd25lcnNoaXAgcHJvb2YgZm9yIGEgZ2l2ZW4gc2Vzc2lvbiwgdGhlcmVmb3JlIHdlIG5lZWQgYSB3YXkgdG8gdGllRQEgdG9nZXRoZXIgc2Vzc2lvbnMgYW5kIEdSQU5EUEEgc2V0IGlkcywgaS5lLiB3ZSBuZWVkIHRvIHZhbGlkYXRlIHRoYXQgYSB2YWxpZGF0b3JBASB3YXMgdGhlIG93bmVyIG9mIGEgZ2l2ZW4ga2V5IG9uIGEgZ2l2ZW4gc2Vzc2lvbiwgYW5kIHdoYXQgdGhlIGFjdGl2ZSBzZXQgSUQgd2FzVCBkdXJpbmcgdGhhdCBzZXNzaW9uLgC4IFRXT1gtTk9URTogYFNldElkYCBpcyBub3QgdW5kZXIgdXNlciBjb250cm9sLixBdXRob3JpdGllcwEAnQkEAASEIFRoZSBjdXJyZW50IGxpc3Qgb2YgYXV0aG9yaXRpZXMuAQ0CAbAMOE1heEF1dGhvcml0aWVzEBCghgEABFwgTWF4IEF1dGhvcml0aWVzIGluIHVzZTRNYXhOb21pbmF0b3JzEBAAAgAABNQgVGhlIG1heGltdW0gbnVtYmVyIG9mIG5vbWluYXRvcnMgZm9yIGVhY2ggdmFsaWRhdG9yLlhNYXhTZXRJZFNlc3Npb25FbnRyaWVzMCCoAAAAAAAAABg5ASBUaGUgbWF4aW11bSBudW1iZXIgb2YgZW50cmllcyB0byBrZWVwIGluIHRoZSBzZXQgaWQgdG8gc2Vzc2lvbiBpbmRleCBtYXBwaW5nLgAxASBTaW5jZSB0aGUgYFNldElkU2Vzc2lvbmAgbWFwIGlzIG9ubHkgdXNlZCBmb3IgdmFsaWRhdGluZyBlcXVpdm9jYXRpb25zIHRoaXMpASB2YWx1ZSBzaG91bGQgcmVsYXRlIHRvIHRoZSBib25kaW5nIGR1cmF0aW9uIG9mIHdoYXRldmVyIHN0YWtpbmcgc3lzdGVtIGlzNQEgYmVpbmcgdXNlZCAoaWYgYW55KS4gSWYgZXF1aXZvY2F0aW9uIGhhbmRsaW5nIGlzIG5vdCBlbmFibGVkIHRoZW4gdGhpcyB2YWx1ZTQgY2FuIGJlIHplcm8uAaEJCgBIQXV0aG9yaXR5RGlzY292ZXJ5AUhBdXRob3JpdHlEaXNjb3ZlcnkIEEtleXMBAKUJBAAEjCBLZXlzIG9mIHRoZSBjdXJyZW50IGF1dGhvcml0eSBzZXQuIE5leHRLZXlzAQClCQQABIAgS2V5cyBvZiB0aGUgbmV4dCBhdXRob3JpdHkgc2V0LgAAAAAMACBUcmVhc3VyeQEgVHJlYXN1cnkYNFByb3Bvc2FsQ291bnQBABAQAAAAAASkIE51bWJlciBvZiBwcm9wb3NhbHMgdGhhdCBoYXZlIGJlZW4gbWFkZS4kUHJvcG9zYWxzAAEEBRCtCQQABHwgUHJvcG9zYWxzIHRoYXQgaGF2ZSBiZWVuIG1hZGUuLERlYWN0aXZhdGVkAQAYQAAAAAAAAAAAAAAAAAAAAAAE8CBUaGUgYW1vdW50IHdoaWNoIGhhcyBiZWVuIHJlcG9ydGVkIGFzIGluYWN0aXZlIHRvIEN1cnJlbmN5LiRBcHByb3ZhbHMBALEJBAAE+CBQcm9wb3NhbCBpbmRpY2VzIHRoYXQgaGF2ZSBiZWVuIGFwcHJvdmVkIGJ1dCBub3QgeWV0IGF3YXJkZWQuKFNwZW5kQ291bnQBABAQAAAAAASkIFRoZSBjb3VudCBvZiBzcGVuZHMgdGhhdCBoYXZlIGJlZW4gbWFkZS4YU3BlbmRzAAEEBRC1CQQABNAgU3BlbmRzIHRoYXQgaGF2ZSBiZWVuIGFwcHJvdmVkIGFuZCBiZWluZyBwcm9jZXNzZWQuATkCAcAULFNwZW5kUGVyaW9kEBCAUQEABIggUGVyaW9kIGJldHdlZW4gc3VjY2Vzc2l2ZSBzcGVuZHMuEEJ1cm69CRDQBwAABBEBIFBlcmNlbnRhZ2Ugb2Ygc3BhcmUgZnVuZHMgKGlmIGFueSkgdGhhdCBhcmUgYnVybnQgcGVyIHNwZW5kIHBlcmlvZC4gUGFsbGV0SWTBCSBweS90cnNyeQQZASBUaGUgdHJlYXN1cnkncyBwYWxsZXQgaWQsIHVzZWQgZm9yIGRlcml2aW5nIGl0cyBzb3ZlcmVpZ24gYWNjb3VudCBJRC4wTWF4QXBwcm92YWxzEBBkAAAADBUBIFRoZSBtYXhpbXVtIG51bWJlciBvZiBhcHByb3ZhbHMgdGhhdCBjYW4gd2FpdCBpbiB0aGUgc3BlbmRpbmcgcXVldWUuAE0BIE5PVEU6IFRoaXMgcGFyYW1ldGVyIGlzIGFsc28gdXNlZCB3aXRoaW4gdGhlIEJvdW50aWVzIFBhbGxldCBleHRlbnNpb24gaWYgZW5hYmxlZC4wUGF5b3V0UGVyaW9kEBCAlwYABBkBIFRoZSBwZXJpb2QgZHVyaW5nIHdoaWNoIGFuIGFwcHJvdmVkIHRyZWFzdXJ5IHNwZW5kIGhhcyB0byBiZSBjbGFpbWVkLgHFCRIAQENvbnZpY3Rpb25Wb3RpbmcBQENvbnZpY3Rpb25Wb3RpbmcIJFZvdGluZ0ZvcgEBCAUFyQnNCdgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIdQEgQWxsIHZvdGluZyBmb3IgYSBwYXJ0aWN1bGFyIHZvdGVyIGluIGEgcGFydGljdWxhciB2b3RpbmcgY2xhc3MuIFdlIHN0b3JlIHRoZSBiYWxhbmNlIGZvciB0aGWcIG51bWJlciBvZiB2b3RlcyB0aGF0IHdlIGhhdmUgcmVjb3JkZWQuNENsYXNzTG9ja3NGb3IBAQQFAO0JBAAMaQEgVGhlIHZvdGluZyBjbGFzc2VzIHdoaWNoIGhhdmUgYSBub24temVybyBsb2NrIHJlcXVpcmVtZW50IGFuZCB0aGUgbG9jayBhbW91bnRzIHdoaWNoIHRoZXltASByZXF1aXJlLiBUaGUgYWN0dWFsIGFtb3VudCBsb2NrZWQgb24gYmVoYWxmIG9mIHRoaXMgcGFsbGV0IHNob3VsZCBhbHdheXMgYmUgdGhlIG1heGltdW0gb2YsIHRoaXMgbGlzdC4BQQIBTQEIIE1heFZvdGVzEBAAAgAAEPAgVGhlIG1heGltdW0gbnVtYmVyIG9mIGNvbmN1cnJlbnQgdm90ZXMgYW4gYWNjb3VudCBtYXkgaGF2ZS4AVQEgQWxzbyB1c2VkIHRvIGNvbXB1dGUgd2VpZ2h0LCBhbiBvdmVybHkgbGFyZ2UgdmFsdWUgY2FuIGxlYWQgdG8gZXh0cmluc2ljcyB3aXRoIGxhcmdlwCB3ZWlnaHQgZXN0aW1hdGlvbjogc2VlIGBkZWxlZ2F0ZWAgZm9yIGluc3RhbmNlLkRWb3RlTG9ja2luZ1BlcmlvZBAQwIkBABCQIFRoZSBtaW5pbXVtIHBlcmlvZCBvZiB2b3RlIGxvY2tpbmcuAGUBIEl0IHNob3VsZCBiZSBubyBzaG9ydGVyIHRoYW4gZW5hY3RtZW50IHBlcmlvZCB0byBlbnN1cmUgdGhhdCBpbiB0aGUgY2FzZSBvZiBhbiBhcHByb3ZhbCxJASB0aG9zZSBzdWNjZXNzZnVsIHZvdGVycyBhcmUgbG9ja2VkIGludG8gdGhlIGNvbnNlcXVlbmNlcyB0aGF0IHRoZWlyIHZvdGVzIGVudGFpbC4B+QkUACRSZWZlcmVuZGEBJFJlZmVyZW5kYRQ8UmVmZXJlbmR1bUNvdW50AQAQEAAAAAAEMQEgVGhlIG5leHQgZnJlZSByZWZlcmVuZHVtIGluZGV4LCBha2EgdGhlIG51bWJlciBvZiByZWZlcmVuZGEgc3RhcnRlZCBzbyBmYXIuRFJlZmVyZW5kdW1JbmZvRm9yAAEEAhD9CQQABLQgSW5mb3JtYXRpb24gY29uY2VybmluZyBhbnkgZ2l2ZW4gcmVmZXJlbmR1bS4oVHJhY2tRdWV1ZQEBBAVVAR0KBAAQXQEgVGhlIHNvcnRlZCBsaXN0IG9mIHJlZmVyZW5kYSByZWFkeSB0byBiZSBkZWNpZGVkIGJ1dCBub3QgeWV0IGJlaW5nIGRlY2lkZWQsIG9yZGVyZWQgYnl8IGNvbnZpY3Rpb24td2VpZ2h0ZWQgYXBwcm92YWxzLgBBASBUaGlzIHNob3VsZCBiZSBlbXB0eSBpZiBgRGVjaWRpbmdDb3VudGAgaXMgbGVzcyB0aGFuIGBUcmFja0luZm86Om1heF9kZWNpZGluZ2AuNERlY2lkaW5nQ291bnQBAQQFVQEQEAAAAAAExCBUaGUgbnVtYmVyIG9mIHJlZmVyZW5kYSBiZWluZyBkZWNpZGVkIGN1cnJlbnRseS4oTWV0YWRhdGFPZgABBAIQNAQAGAUBIFRoZSBtZXRhZGF0YSBpcyBhIGdlbmVyYWwgaW5mb3JtYXRpb24gY29uY2VybmluZyB0aGUgcmVmZXJlbmR1bS5JASBUaGUgYEhhc2hgIHJlZmVycyB0byB0aGUgcHJlaW1hZ2Ugb2YgdGhlIGBQcmVpbWFnZXNgIHByb3ZpZGVyIHdoaWNoIGNhbiBiZSBhIEpTT06IIGR1bXAgb3IgSVBGUyBoYXNoIG9mIGEgSlNPTiBmaWxlLgB1ASBDb25zaWRlciBhIGdhcmJhZ2UgY29sbGVjdGlvbiBmb3IgYSBtZXRhZGF0YSBvZiBmaW5pc2hlZCByZWZlcmVuZHVtcyB0byBgdW5yZXF1ZXN0YCAocmVtb3ZlKUQgbGFyZ2UgcHJlaW1hZ2VzLgFVAgFRARREU3VibWlzc2lvbkRlcG9zaXQYQFVN0sIHAAAAAAAAAAAAAAAENQEgVGhlIG1pbmltdW0gYW1vdW50IHRvIGJlIHVzZWQgYXMgYSBkZXBvc2l0IGZvciBhIHB1YmxpYyByZWZlcmVuZHVtIHByb3Bvc2FsLiRNYXhRdWV1ZWQQEGQAAAAE5CBNYXhpbXVtIHNpemUg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AIxoif//////IQA4bWVkaXVtX3NwZW5kZXIyAAAAaGpMNBAGAAAAAAAAAAAAAGAJAACAEwMAQDgAAEA4AAAAWwH2MABlzR0Aypo7AhFh2wAAAAAAv9GqAQAAAAAglyr//////yIALGJpZ19zcGVuZGVyMgAAANDUmGggDAAAAAAAAAAAAABgCQAAgBMDAIBwAABAOAAAAADKmjsAZc0dAMqaOwJBPLABAAAAAHVdNAMAAAAARdFl/v////8E4CBJbmZvcm1hdGlvbiBjb25jZXJuaW5nIHRoZSBkaWZmZXJlbnQgcmVmZXJlbmR1bSB0cmFja3MuAUEKFQBQRmVsbG93c2hpcENvbGxlY3RpdmUBUEZlbGxvd3NoaXBDb2xsZWN0aXZlGCxNZW1iZXJDb3VudAEBBAVVARAQAAAAAAhpASBUaGUgbnVtYmVyIG9mIG1lbWJlcnMgaW4gdGhlIGNvbGxlY3RpdmUgd2hvIGhhdmUgYXQgbGVhc3QgdGhlIHJhbmsgYWNjb3JkaW5nIHRvIHRoZSBpbmRleDAgb2YgdGhlIHZlYy4cTWVtYmVycwABBAUARQoEAAScIFRoZSBjdXJyZW50IG1lbWJlcnMgb2YgdGhlIGNvbGxlY3RpdmUuJElkVG9JbmRleAABCAUFSQoQBAAEYQEgVGhlIGluZGV4IG9mIGVhY2ggcmFua3MncyBtZW1iZXIgaW50byB0aGUgZ3JvdXAgb2YgbWVtYmVycyB3aG8gaGF2ZSBhdCBsZWFzdCB0aGF0IHJhbmsuJEluZGV4VG9JZAABCAUFTQoABAAIXQEgVGhlIG1lbWJlcnMgaW4gdGhlIGNvbGxlY3RpdmUgYnkgaW5kZXguIEFsbCBpbmRpY2VzIGluIHRoZSByYW5nZSBgMC4uTWVtYmVyQ291bnRgIHdpbGxlASByZXR1cm4gYFNvbWVgLCBob3dldmVyIGEgbWVtYmVyJ3MgaW5kZXggaXMgbm90IGd1YXJhbnRlZWQgdG8gcmVtYWluIHVuY2hhbmdlZCBvdmVyIHRpbWUuGFZvdGluZwABCAIFLQlZBwQABLQgVm90ZXMgb24gYSBnaXZlbiBwcm9wb3NhbCwgaWYgaXQgaXMgb25nb2luZy40Vm90aW5nQ2xlYW51cAABBAIQUQoEAAABfQIBVQcAAVUKFgBMRmVsbG93c2hpcFJlZmVyZW5kYQFMRmVsbG93c2hpcFJlZmVyZW5kYRQ8UmVmZXJlbmR1bUNvdW50AQAQEAAAAAAEMQEgVGhlIG5leHQgZnJlZSByZWZlcmVuZHVtIGluZGV4LCBha2EgdGhlIG51bWJlciBvZiByZWZlcmVuZGEgc3RhcnRlZCBzbyBmYXIuRFJlZmVyZW5kdW1JbmZvRm9yAAEEAhBZCgQABLQgSW5mb3JtYXRpb24gY29uY2VybmluZyBhbnkgZ2l2ZW4gcmVmZXJlbmR1bS4oVHJhY2tRdWV1ZQEBBAVVAWEKBAAQXQEgVGhlIHNvcnRlZCBsaXN0IG9mIHJlZmVyZW5kYSByZWFkeSB0byBiZSBkZWNpZGVkIGJ1dCBub3QgeWV0IGJlaW5nIGRlY2lkZWQsIG9yZGVyZWQgYnl8IGNvbnZpY3Rpb24td2VpZ2h0ZWQgYXBwcm92YWxzLgBBASBUaGlzIHNob3VsZCBiZSBlbXB0eSBpZiBgRGVjaWRpbmdDb3VudGAgaXMgbGVzcyB0aGFuIGBUcmFja0luZm86Om1heF9kZWNpZGluZ2AuNERlY2lkaW5nQ291bnQBAQQFVQEQEAAAAAAExCBUaGUgbnVtYmVyIG9mIHJlZmVyZW5kYSBiZWluZyBkZWNpZGVkIGN1cnJlbnRseS4oTWV0YWRhdGFPZgABBAIQNAQAGAUBIFRoZSBtZXRhZGF0YSBpcyBhIGdlbmVyYWwgaW5mb3JtYXRpb24gY29uY2VybmluZyB0aGUgcmVmZXJlbmR1bS5JASBUaGUgYEhhc2hgIHJlZmVycyB0byB0aGUgcHJlaW1hZ2Ugb2YgdGhlIGBQcmVpbWFnZXNgIHByb3ZpZGVyIHdoaWNoIGNhbiBiZSBhIEpTT06IIGR1bXAgb3IgSVBGUyBoYXNoIG9mIGEgSlNPTiBmaWxlLgB1ASBDb25zaWRlciBhIGdhcmJhZ2UgY29sbGVjdGlvbiBmb3IgYSBtZXRhZGF0YSBvZiBmaW5pc2hlZCByZWZlcmVuZHVtcyB0byBgdW5yZXF1ZXN0YCAocmVtb3ZlKUQgbGFyZ2UgcHJlaW1hZ2VzLgGBAgFhBxREU3VibWlzc2lvbkRlcG9zaXQYQAAAAAAAAAAAAAAAAAAAAAAENQEgVGhlIG1pbmltdW0gYW1vdW50IHRvIGJlIHVzZWQgYXMgYSBkZXBvc2l0IGZvciBhIHB1YmxpYyByZWZlcmVuZHVtIHByb3Bvc2FsLiRNYXhRdWV1ZWQQEGQAAAAE5CBNYXhpbXVtIHNpemUgb2YgdGhlIHJlZmVyZW5kdW0gcXVldWUgZm9yIGEgc2luZ2xlIHRyYWNrLkRVbmRlY2lkaW5nVGltZW91dBAQwIkBAAhVASBUaGUgbnVtYmVyIG9mIGJsb2NrcyBhZnRlciBzdWJtaXNzaW9uIHRoYXQgYSByZWZlcmVuZHVtIG11c3QgYmVnaW4gYmVpbmcgZGVjaWRlZCBieS7kIE9uY2UgdGhpcyBwYXNzZXMsIHRoZW4gYW55b25lIG1heSBjYW5jZWwgdGhlIHJlZmVyZW5kdW0uNEFsYXJtSW50ZXJ2YWwQEAEAAAAMXQEgUXVhbnRpemF0aW9uIGxldmVsIGZvciB0aGUgcmVmZXJlbmR1bSB3YWtldXAgc2NoZWR1bGVyLiBBIGhpZ2hlciBudW1iZXIgd2lsbCByZXN1bHQgaW5dASBmZXdlciBzdG9yYWdlIHJlYWRzL3dyaXRlcyBuZWVkZWQgZm9yIHNtYWxsZXIgdm90ZXJzLCBidXQgYWxzbyByZXN1bHQgaW4gZGVsYXlzIHRvIHRoZVUBIGF1dG9tYXRpYyByZWZlcmVuZHVtIHN0YXR1cyBjaGFuZ2VzLiBFeHBsaWNpdCBzZXJ2aWNpbmcgaW5zdHJ1Y3Rpb25zIGFyZSB1bmFmZmVjdGVkLhhUcmFja3MpCs0LKAAAKGNhbmRpZGF0ZXMKAAAANDUmGggDAAAAAAAAAAAAACwBAADAiQEALAEAAAoAAAAAAMqaOwBlzR0Aypo7AADKmjsAAAAAAGXNHQEAHG1lbWJlcnMKAAAAUgU3nE0AAAAAAAAAAAAAACwBAADAiQEALAEAAAoAAAAAAMqaOwBlzR0Aypo7AADKmjsAAAAAAGXNHQIALHByb2ZpY2llbnRzCgAAAFIFN5xNAAAAAAAAAAAAAAAsAQAAwIkBACwBAAAKAAAAAADKmjsAZc0dAMqaOwAAypo7AAAAAABlzR0DABxmZWxsb3dzCgAAAFIFN5xNAAAAAAAAAAAAAAAsAQAAwIkBACwBAAAKAAAAAADKmjsAZc0dAMqaOwAAypo7AAAAAABlzR0EADhzZW5pb3IgZmVsbG93cwoAAABSBTecTQAAAAAAAAAAAAAALAEAAMCJAQAsAQAACgAAAAAAypo7AGXNHQDKmjsAAMqaOwAAAAAAZc0dBQAcZXhwZXJ0cwoAAABVTdLCBwAAAAAAAAAAAAAALAEAAMCJAQAsAQAACgAAAAAAypo7AGXNHQDKmjsAAMqaOwAAAAAAZc0dBgA4c2VuaW9yIGV4cGVydHMKAAAAVU3SwgcAAAAAAAAAAAAAACwBAADAiQEALAEAAAoAAAAAAMqaOwBlzR0Aypo7AADKmjsAAAAAAGXNHQcAHG1hc3RlcnMKAAAAVU3SwgcAAAAAAAAAAAAAACwBAADAiQEALAEAAAoAAAAAAMqaOwBlzR0Aypo7AADKmjsAAAAAAGXNHQgAOHNlbmlvciBtYXN0ZXJzCgAAAFVN0sIHAAAAAAAAAAAAAAAsAQAAwIkBACwBAAAKAAAAAADKmjsAZc0dAMqaOwAAypo7AAAAAABlzR0JADRncmFuZCBtYXN0ZXJzCgAAAFVN0sIHAAAAAAAAAAAAAAAsAQAAwIkBACwBAAAKAAAAAADKmjsAZc0dAMqaOwAAypo7AAAAAABlzR0E4CBJbmZvcm1hdGlvbiBjb25jZXJuaW5nIHRoZSBkaWZmZXJlbnQgcmVmZXJlbmR1bSB0cmFja3MuAWUKFwAcT3JpZ2lucwAAAAAAKwAkV2hpdGVsaXN0ASRXaGl0ZWxpc3QEPFdoaXRlbGlzdGVkQ2FsbAABBAU0oQEEAAABhQIBZQcAAWkKLAAoUGFyYW1ldGVycwEoUGFyYW1ldGVycwQoUGFyYW1ldGVycwABBAJ9B4kHBAAETCBTdG9yZWQgcGFyYW1ldGVycy4BiQIBeQcAAC4AGENsYWltcwEYQ2xhaW1zFBhDbGFpbXMAAQQGwQIYBAAAFFRvdGFsAQAYQAAAAAAAAAAAAAAAAAAAAAAAHFZlc3RpbmcAAQQGwQLJAgQAEHggVmVzdGluZyBzY2hlZHVsZSBmb3IgYSBjbGFpbS4NASBGaXJzdCBiYWxhbmNlIGlzIHRoZSB0b3RhbCBhbW91bnQgdGhhdCBzaG91bGQgYmUgaGVsZCBmb3IgdmVzdGluZy7kIFNlY29uZCBiYWxhbmNlIGlzIGhvdyBtdWNoIHNob3VsZCBiZSB1bmxvY2tlZCBwZXIgYmxvY2suzCBUaGUgYmxvY2sgbnVtYmVyIGlzIHdoZW4gdGhlIHZlc3Rpbmcgc2hvdWxkIHN0YXJ0LhxTaWduaW5nAAEEBsEC0QIEAATAIFRoZSBzdGF0ZW1lbnQga2luZCB0aGF0IG11c3QgYmUgc2lnbmVkLCBpZiBhbnkuJFByZWNsYWltcwABBAYAwQIEAAQtASBQcmUtY2xhaW1lZCBFdGhlcmV1bSBhY2NvdW50cywgYnkgdGhlIEFjY291bnQgSUQgdGhhdCB0aGV5IGFyZSBjbGFpbWVkIHRvLgG1AgGRBwQYUHJlZml4OIB8UGF5IEtTTXMgdG8gdGhlIEt1c2FtYSBhY2NvdW50OgABbQoTABxVdGlsaXR5AAHVAgGVBwRMYmF0Y2hlZF9jYWxsc19saW1pdBAQqioAAASoIFRoZSBsaW1pdCBvbiB0aGUgbnVtYmVyIG9mIGJhdGNoZWQgY2FsbHMuAXEKGAAcU29jaWV0eQEcU29jaWV0eVAoUGFyYW1ldGVycwAAoQcEAATcIFRoZSBtYXggbnVtYmVyIG9mIG1lbWJlcnMgZm9yIHRoZSBzb2NpZXR5IGF0IG9uZSB0aW1lLgxQb3QBABhAAAAAAAAAAAAAAAAAAAAAAARBASBBbW91bnQgb2Ygb3VyIGFjY291bnQgYmFsYW5jZSB0aGF0IGlzIHNwZWNpZmljYWxseSBmb3IgdGhlIG5leHQgcm91bmQncyBiaWQocykuHEZvdW5kZXIAAAAEAARIIFRoZSBmaXJzdCBtZW1iZXIuEEhlYWQAAAAEAARBASBUaGUgbW9zdCBwcmltYXJ5IGZyb20gdGhlIG1vc3QgcmVjZW50bHkgYXBwcm92ZWQgcmFuayAwIG1lbWJlcnMgaW4gdGhlIHNvY2lldHkuFFJ1bGVzAAA0BAAIUQEgQSBoYXNoIG9mIHRoZSBydWxlcyBvZiB0aGlzIHNvY2lldHkgY29uY2VybmluZyBtZW1iZXJzaGlwLiBDYW4gb25seSBiZSBzZXQgb25jZSBhbmRUIG9ubHkgYnkgdGhlIGZvdW5kZXIuHE1lbWJlcnMAAQQFAHUKBAAEIQEgVGhlIGN1cnJlbnQgbWVtYmVycyBhbmQgdGhlaXIgcmFuay4gRG9lc24ndCBpbmNsdWRlIGBTdXNwZW5kZWRNZW1iZXJzYC4cUGF5b3V0cwEBBAUAgQpEAAAAAAAAAAAAAAAAAAAAAAAE3CBJbmZvcm1hdGlvbiByZWdhcmRpbmcgcmFuay0wIHBheW91dHMsIHBhc3QgYW5kIGZ1dHVyZS4sTWVtYmVyQ291bnQBABAQAAAAAARJASBUaGUgbnVtYmVyIG9mIGl0ZW1zIGluIGBNZW1iZXJzYCBjdXJyZW50bHkuIChEb2Vzbid0IGluY2x1ZGUgYFN1c3BlbmRlZE1lbWJlcnNgLik0TWVtYmVyQnlJbmRleAABBAUQAAQACF0BIFRoZSBjdXJyZW50IGl0ZW1zIGluIGBNZW1iZXJzYCBrZXllZCBieSB0aGVpciB1bmlxdWUgaW5kZXguIEtleXMgYXJlIGRlbnNlbHkgcG9wdWxhdGVkzCBgMC4uTWVtYmVyQ291bnRgIChkb2VzIG5vdCBpbmNsdWRlIGBNZW1iZXJDb3VudGApLkBTdXNwZW5kZWRNZW1iZXJzAAEEBQB1CgQABAEBIFRoZSBzZXQgb2Ygc3VzcGVuZGVkIG1lbWJlcnMsIHdpdGggdGhlaXIgb2xkIG1lbWJlcnNoaXAgcmVjb3JkLihSb3VuZENvdW50AQAQEAAAAAAEoCBUaGUgbnVtYmVyIG9mIHJvdW5kcyB3aGljaCBoYXZlIHBhc3NlZC4QQmlkcwEAiQoEAAToIFRoZSBjdXJyZW50IGJpZHMsIHN0b3JlZCBvcmRlcmVkIGJ5IHRoZSB2YWx1ZSBvZiB0aGUgYmlkLihDYW5kaWRhdGVzAAEEAgCZCgQAABxTa2VwdGljAAAABAAEVCBUaGUgY3VycmVudCBza2VwdGljLhRWb3RlcwABCAUFoQqlCgQABNAgRG91YmxlIG1hcCBmcm9tIENhbmRpZGF0ZSAtPiBWb3RlciAtPiAoTWF5YmUpIFZvdGUuPFZvdGVDbGVhckN1cnNvcgABBAUAqQoEAAT0IENsZWFyLWN1cnNvciBmb3IgVm90ZSwgbWFwIGZyb20gQ2FuZGlkYXRlIC0+IChNYXliZSkgQ3Vyc29yLiBOZXh0SGVhZAAArQoEAAx1ASBBdCB0aGUgZW5kIG9mIHRoZSBjbGFpbSBwZXJpb2QsIHRoaXMgY29udGFpbnMgdGhlIG1vc3QgcmVjZW50bHkgYXBwcm92ZWQgbWVtYmVycyAoYWxvbmcgd2l0aGUBIHRoZWlyIGJpZCBhbmQgcm91bmQgSUQpIHdobyBpcyBmcm9tIHRoZSBtb3N0IHJlY2VudCByb3VuZCB3aXRoIHRoZSBsb3dlc3QgYmlkLiBUaGV5IHdpbGxcIGJlY29tZSB0aGUgbmV3IGBIZWFkYC5MQ2hhbGxlbmdlUm91bmRDb3VudAEAEBAAAAAABFkBIFRoZSBudW1iZXIgb2YgY2hhbGxlbmdlIHJvdW5kcyB0aGVyZSBoYXZlIGJlZW4uIFVzZWQgdG8gaWRlbnRpZnkgc3RhbGUgRGVmZW5kZXJWb3Rlcy4kRGVmZW5kaW5nAACxCgQABFkBIFRoZSBkZWZlbmRpbmcgbWVtYmVyIGN1cnJlbnRseSBiZWluZyBjaGFsbGVuZ2VkLCBhbG9uZyB3aXRoIGEgcnVubmluZyB0YWxseSBvZiB2b3Rlcy40RGVmZW5kZXJWb3RlcwABCAUFLQmlCgQABMggVm90ZXMgZm9yIHRoZSBkZWZlbmRlciwga2V5ZWQgYnkgY2hhbGxlbmdlIHJvdW5kLgHdAgGdByQgUGFsbGV0SWTBCSBweS9zb2NpZQRoIFRoZSBzb2NpZXRpZXMncyBwYWxsZXQgaWQwR3JhY2VTdHJpa2VzEBAKAAAABAkBIFRoZSBtYXhpbXVtIG51bWJlciBvZiBzdHJpa2VzIGJlZm9yZSBhIG1lbWJlciBnZXRzIGZ1bmRzIHNsYXNoZWQuLFBlcmlvZFNwZW5kGEAECr+CKA8AAAAAAAAAAAAABC0BIFRoZSBhbW91bnQgb2YgaW5jZW50aXZlIHBhaWQgd2l0aGluIGVhY2ggcGVyaW9kLiBEb2Vzbid0IGluY2x1ZGUgVm90ZXJUaXAuMFZvdGluZ1BlcmlvZBAQQBkBAAg9ASBUaGUgbnVtYmVyIG9mIGJsb2NrcyBvbiB3aGljaCBuZXcgY2FuZGlkYXRlcyBzaG91bGQgYmUgdm90ZWQgb24uIFRvZ2V0aGVyIHdpdGhNASBgQ2xhaW1QZXJpb2RgLCB0aGlzIHN1bXMgdG8gdGhlIG51bWJlciBvZiBibG9ja3MgYmV0d2VlbiBjYW5kaWRhdGUgaW50YWtlIHBlcmlvZHMuLENsYWltUGVyaW9kEBCAcAAACE0BIFRoZSBudW1iZXIgb2YgYmxvY2tzIG9uIHdoaWNoIG5ldyBjYW5kaWRhdGVzIGNhbiBjbGFpbSB0aGVpciBtZW1iZXJzaGlwIGFuZCBiZSB0aGUwIG5hbWVkIGhlYWQuPE1heExvY2tEdXJhdGlvbhAQAE7tAASkIFRoZSBtYXhpbXVtIGR1cmF0aW9uIG9mIHRoZSBwYXlvdXQgbG9jay48Q2hhbGxlbmdlUGVyaW9kEBDAiQEABNAgVGhlIG51bWJlciBvZiBibG9ja3MgYmV0d2VlbiBtZW1iZXJzaGlwIGNoYWxsZW5nZXMuKE1heFBheW91dHMQEAgAAAAEDQEgVGhlIG1heGltdW0gbnVtYmVyIG9mIHBheW91dHMgYSBtZW1iZXIgbWF5IGhhdmUgd2FpdGluZyB1bmNsYWltZWQuHE1heEJpZHMQEAACAAAEkCBUaGUgbWF4aW11bSBudW1iZXIgb2YgYmlkcyBhdCBvbmNlLgG1ChoAIFJlY292ZXJ5ASBSZWNvdmVyeQwsUmVjb3ZlcmFibGUAAQQFALkKBAAECQEgVGhlIHNldCBvZiByZWNvdmVyYWJsZSBhY2NvdW50cyBhbmQgdGhlaXIgcmVjb3ZlcnkgY29uZmlndXJhdGlvbi5AQWN0aXZlUmVjb3ZlcmllcwABCAUFoQrBCgQAEGggQWN0aXZlIHJlY292ZXJ5IGF0dGVtcHRzLgAVASBGaXJzdCBhY2NvdW50IGlzIHRoZSBhY2NvdW50IHRvIGJlIHJlY292ZXJlZCwgYW5kIHRoZSBzZWNvbmQgYWNjb3VudKwgaXMgdGhlIHVzZXIgdHJ5aW5nIHRvIHJlY292ZXIgdGhlIGFjY291bnQuFFByb3h5AAEEAgAABAAMkCBUaGUgbGlzdCBvZiBhbGxvd2VkIHByb3h5IGFjY291bnRzLgD4IE1hcCBmcm9tIHRoZSB1c2VyIHdobyBjYW4gYWNjZXNzIGl0IHRvIHRoZSByZWNvdmVyZWQgYWNjb3VudC4B4QIBpQcQRENvbmZpZ0RlcG9zaXRCYXNlGEAEghvOJgAAAAAAAAAAAAAAEFUBIFRoZSBiYXNlIGFtb3VudCBvZiBjdXJyZW5jeSBuZWVkZWQgdG8gcmVzZXJ2ZSBmb3IgY3JlYXRpbmcgYSByZWNvdmVyeSBjb25maWd1cmF0aW9uLgABASBUaGlzIGlzIGhlbGQgZm9yIGFuIGFkZGl0aW9uYWwgc3RvcmFnZSBpdGVtIHdob3NlIHZhbHVlIHNpemUgaXOoIGAyICsgc2l6ZW9mKEJsb2NrTnVtYmVyLCBCYWxhbmNlKWAgYnl0ZXMuTEZyaWVuZERlcG9zaXRGYWN0b3IYQJomaeEDAAAAAAAAAAAAAAAULQEgVGhlIGFtb3VudCBvZiBjdXJyZW5jeSBuZWVkZWQgcGVyIGFkZGl0aW9uYWwgdXNlciB3aGVuIGNyZWF0aW5nIGEgcmVjb3Zlcnk8IGNvbmZpZ3VyYXRpb24uAE0BIFRoaXMgaXMgaGVsZCBmb3IgYWRkaW5nIGBzaXplb2YoQWNjb3VudElkKWAgYnl0ZXMgbW9yZSBpbnRvIGEgcHJlLWV4aXN0aW5nIHN0b3JhZ2UcIHZhbHVlLihNYXhGcmllbmRzEBAJAAAAGA0BIFRoZSBtYXhpbXVtIGFtb3VudCBvZiBmcmllbmRzIGFsbG93ZWQgaW4gYSByZWNvdmVyeSBjb25maWd1cmF0aW9uLgANASBOT1RFOiBUaGUgdGhyZXNob2xkIHByb2dyYW1tZWQgaW4gdGhpcyBQYWxsZXQgdXNlcyB1MTYsIHNvIGl0IGRvZXMJASBub3QgcmVhbGx5IG1ha2Ugc2Vuc2UgdG8gaGF2ZSBhIGxpbWl0IGhlcmUgZ3JlYXRlciB0aGFuIHUxNjo6TUFYLhUBIEJ1dCBhbHNvLCB0aGF0IGlzIGEgbG90IG1vcmUgdGhhbiB5b3Ugc2hvdWxkIHByb2JhYmx5IHNldCB0aGlzIHZhbHVlNCB0byBhbnl3YXkuLi48UmVjb3ZlcnlEZXBvc2l0GEAEghvOJgAAAAAAAAAAAAAAHB0BIFRoZSBiYXNlIGFtb3VudCBvZiBjdXJyZW5jeSBuZWVkZWQgdG8gcmVzZXJ2ZSBmb3Igc3RhcnRpbmcgYSByZWNvdmVyeS4ANQEgVGhpcyBpcyBwcmltYXJpbHkgaGVsZCBmb3IgZGV0ZXJyaW5nIG1hbGljaW91cyByZWNvdmVyeSBhdHRlbXB0cywgYW5kIHNob3VsZCkBIGhhdmUgYSB2YWx1ZSBsYXJnZSBlbm91Z2ggdGhhdCBhIGJhZCBhY3RvciB3b3VsZCBjaG9vc2Ugbm90IHRvIHBsYWNlIHRoaXMpASBkZXBvc2l0LiBJdCBhbHNvIGFjdHMgdG8gZnVuZCBhZGRpdGlvbmFsIHN0b3JhZ2UgaXRlbSB3aG9zZSB2YWx1ZSBzaXplIGlzQQEgYHNpemVvZihCbG9ja051bWJlciwgQmFsYW5jZSArIFQgKiBBY2NvdW50SWQpYCBieXRlcy4gV2hlcmUgVCBpcyBhIGNvbmZpZ3VyYWJsZSwgdGhyZXNob2xkLgHFChsAHFZlc3RpbmcBHFZlc3RpbmcIHFZlc3RpbmcAAQQCAMkKBAAE2CBJbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhlIHZlc3Rpbmcgb2YgYSBnaXZlbiBhY2NvdW50LjhTdG9yYWdlVmVyc2lvbgEA0QoEAAx8IFN0b3JhZ2UgdmVyc2lvbiBvZiB0aGUgcGFsbGV0LgAxASBOZXcgbmV0d29ya3Mgc3RhcnQgd2l0aCBsYXRlc3QgdmVyc2lvbiwgYXMgZGV0ZXJtaW5lZCBieSB0aGUgZ2VuZXNpcyBidWlsZC4B5QIBqQcIRE1pblZlc3RlZFRyYW5zZmVyGEA0TdLCBwAAAAAAAAAAAAAABOggVGhlIG1pbmltdW0gYW1vdW50IHRyYW5zZmVycmVkIHRvIGNhbGwgYHZlc3RlZF90cmFuc2ZlcmAuTE1heFZlc3RpbmdTY2hlZHVsZXMQEBwAAAAAAdUKHAAkU2NoZWR1bGVyASRTY2hlZHVsZXIQPEluY29tcGxldGVTaW5jZQAAEAQAABhBZ2VuZGEBAQQFENkKBAAETQEgSXRlbXMgdG8gYmUgZXhlY3V0ZWQsIGluZGV4ZWQgYnkgdGhlIGJsb2NrIG51bWJlciB0aGF0IHRoZXkgc2hvdWxkIGJlIGV4ZWN1dGVkIG9uLhxSZXRyaWVzAAEEAvUC6QoEAAQhASBSZXRyeSBjb25maWd1cmF0aW9ucyBmb3IgaXRlbXMgdG8gYmUgZXhlY3V0ZWQsIGluZGV4ZWQgYnkgdGFzayBhZGRyZXNzLhhMb29rdXAAAQQFBPUCBAAQ+CBMb29rdXAgZnJvbSBhIG5hbWUgdG8gdGhlIGJsb2NrIG51bWJlciBhbmQgaW5kZXggb2YgdGhlIHRhc2suAFkBIEZvciB2MyAtPiB2NCB0aGUgcHJldmlvdXNseSB1bmJvdW5kZWQgaWRlbnRpdGllcyBhcmUgQmxha2UyLTI1NiBoYXNoZWQgdG8gZm9ybSB0aGUgdjQwIGlkZW50aXRpZXMuAe0CAa0HCDRNYXhpbXVtV2VpZ2h0KEALAIBuh3QBE8zMzMzMzMzMBCkBIFRoZSBtYXhpbXVtIHdlaWdodCB0aGF0IG1heSBiZSBzY2hlZHVsZWQgcGVyIGJsb2NrIGZvciBhbnkgZGlzcGF0Y2hhYmxlcy5QTWF4U2NoZWR1bGVkUGVyQmxvY2sQEDIAAAAUHQEgVGhlIG1heGltdW0gbnVtYmVyIG9mIHNjaGVkdWxlZCBjYWxscyBpbiB0aGUgcXVldWUgZm9yIGEgc2luZ2xlIGJsb2NrLgAYIE5PVEU6UQEgKyBEZXBlbmRlbnQgcGFsbGV0cycgYmVuY2htYXJrcyBtaWdodCByZXF1aXJlIGEgaGlnaGVyIGxpbWl0IGZvciB0aGUgc2V0dGluZy4gU2V0IGHEIGhpZ2hlciBsaW1pdCB1bmRlciBgcnVudGltZS1iZW5jaG1hcmtzYCBmZWF0dXJlLgHtCh0AFFByb3h5ARRQcm94eQgcUHJveGllcwEBBAUA8QpEAAAAAAAAAAAAAAAAAAAAAAAIRQEgVGhlIHNldCBvZiBhY2NvdW50IHByb3hpZXMuIE1hcHMgdGhlIGFjY291bnQgd2hpY2ggaGFzIGRlbGVnYXRlZCB0byB0aGUgYWNjb3VudHMhASB3aGljaCBhcmUgYmVpbmcgZGVsZWdhdGVkIHRvLCB0b2dldGhlciB3aXRoIHRoZSBhbW91bnQgaGVsZCBvbiBkZXBvc2l0LjRBbm5vdW5jZW1lbnRzAQEEBQABC0QAAAAAAAAAAAAAAAAAAAAAAASsIFRoZSBhbm5vdW5jZW1lbnRzIG1hZGUgYnkgdGhlIHByb3h5IChrZXkpLgH5AgG1BxhAUHJveHlEZXBvc2l0QmFzZRhAsAlTSJsAAAAAAAAAAAAAABARASBUaGUgYmFzZSBhbW91bnQgb2YgY3VycmVuY3kgbmVlZGVkIHRvIHJlc2VydmUgZm9yIGNyZWF0aW5nIGEgcHJveHkuAAEBIFRoaXMgaXMgaGVsZCBmb3IgYW4gYWRkaXRpb25hbCBzdG9yYWdlIGl0ZW0gd2hvc2UgdmFsdWUgc2l6ZSBpcyUBIGBzaXplb2YoQmFsYW5jZSlgIGJ5dGVzIGFuZCB3aG9zZSBrZXkgc2l6ZSBpcyBgc2l6ZW9mKEFjY291bnRJZClgIGJ5dGVzLkhQcm94eURlcG9zaXRGYWN0b3IYQLSmkEEAAAAAAAAAAAAAAAAUvCBUaGUgYW1vdW50IG9mIGN1cnJlbmN5IG5lZWRlZCBwZXIgcHJveHkgYWRkZWQuADUBIFRoaXMgaXMgaGVsZCBmb3IgYWRkaW5nIDMyIGJ5dGVzIHBsdXMgYW4gaW5zdGFuY2Ugb2YgYFByb3h5VHlwZWAgbW9yZSBpbnRvIGFhASBwcmUtZXhpc3Rpbmcgc3RvcmFnZSB2YWx1ZS4gVGh1cywgd2hlbiBjb25maWd1cmluZyBgUHJveHlEZXBvc2l0RmFjdG9yYCBvbmUgc2hvdWxkIHRha2X0IGludG8gYWNjb3VudCBgMzIgKyBwcm94eV90eXBlLmVuY29kZSgpLmxlbigpYCBieXRlcyBvZiBkYXRhLihNYXhQcm94aWVzEBAgAAAABPAgVGhlIG1heGltdW0gYW1vdW50IG9mIHByb3hpZXMgYWxsb3dlZCBmb3IgYSBzaW5nbGUgYWNjb3VudC4oTWF4UGVuZGluZxAQIAAAAARFASBUaGUgbWF4aW11bSBhbW91bnQgb2YgdGltZS1kZWxheWVkIGFubm91bmNlbWVudHMgdGhhdCBhcmUgYWxsb3dlZCB0byBiZSBwZW5kaW5nLlxBbm5vdW5jZW1lbnREZXBvc2l0QmFzZRhAsAlTSJsAAAAAAAAAAAAAABAxASBUaGUgYmFzZSBhbW91bnQgb2YgY3VycmVuY3kgbmVlZGVkIHRvIHJlc2VydmUgZm9yIGNyZWF0aW5nIGFuIGFubm91bmNlbWVudC4ASQEgVGhpcyBpcyBoZWxkIHdoZW4gYSBuZXcgc3RvcmFnZSBpdGVtIGhvbGRpbmcgYSBgQmFsYW5jZWAgaXMgY3JlYXRlZCAodHlwaWNhbGx5IDE2ICBieXRlcykuZEFubm91bmNlbWVudERlcG9zaXRGYWN0b3IYQGhNIYMAAAAAAAAAAAAAAAAQ1CBUaGUgYW1vdW50IG9mIGN1cnJlbmN5IG5lZWRlZCBwZXIgYW5ub3VuY2VtZW50IG1hZGUuAFkBIFRoaXMgaXMgaGVsZCBmb3IgYWRkaW5nIGFuIGBBY2NvdW50SWRgLCBgSGFzaGAgYW5kIGBCbG9ja051bWJlcmAgKHR5cGljYWxseSA2OCBieXRlcymMIGludG8gYSBwcmUtZXhpc3Rpbmcgc3RvcmFnZSB2YWx1ZS4BEQseACBNdWx0aXNpZwEgTXVsdGlzaWcEJE11bHRpc2lncwABCAUCFQsZCwQABJQgVGhlIHNldCBvZiBvcGVuIG11bHRpc2lnIG9wZXJhdGlvbnMuAQUDAbkHDCxEZXBvc2l0QmFzZRhA8BlF55sAAAAAAAAAAAAAABhZASBUaGUgYmFzZSBhbW91bnQgb2YgY3VycmVuY3kgbmVlZGVkIHRvIHJlc2VydmUgZm9yIGNyZWF0aW5nIGEgbXVsdGlzaWcgZXhlY3V0aW9uIG9yIHRvhCBzdG9yZSBhIGRpc3BhdGNoIGNhbGwgZm9yIGxhdGVyLgABASBUaGlzIGlzIGhlbGQgZm9yIGFuIGFkZGl0aW9uYWwgc3RvcmFnZSBpdGVtIHdob3NlIHZhbHVlIHNpemUgaXMxASBgNCArIHNpemVvZigoQmxvY2tOdW1iZXIsIEJhbGFuY2UsIEFjY291bnRJZCkpYCBieXRlcyBhbmQgd2hvc2Uga2V5IHNpemUgaXOAIGAzMiArIHNpemVvZihBY2NvdW50SWQpYCBieXRlcy40RGVwb3NpdEZhY3RvchhAgAaUPwAAAAAAAAAAAAAAAAxVASBUaGUgYW1vdW50IG9mIGN1cnJlbmN5IG5lZWRlZCBwZXIgdW5pdCB0aHJlc2hvbGQgd2hlbiBjcmVhdGluZyBhIG11bHRpc2lnIGV4ZWN1dGlvbi4AJQEgVGhpcyBpcyBoZWxkIGZvciBhZGRpbmcgMzIgYnl0ZXMgbW9yZSBpbnRvIGEgcHJlLWV4aXN0aW5nIHN0b3JhZ2UgdmFsdWUuOE1heFNpZ25hdG9yaWVzEBBkAAAABOwgVGhlIG1heGltdW0gYW1vdW50IG9mIHNpZ25hdG9yaWVzIGFsbG93ZWQgaW4gdGhlIG11bHRpc2lnLgEhCx8AIFByZWltYWdlASBQcmVpbWFnZQwkU3RhdHVzRm9yAAEEBjQlCwQABJAgVGhlIHJlcXVlc3Qgc3RhdHVzIG9mIGEgZ2l2ZW4gaGFzaC5AUmVxdWVzdFN0YXR1c0ZvcgABBAY0LQsEAASQIFRoZSByZXF1ZXN0IHN0YXR1cyBvZiBhIGdpdmVuIGhhc2guLFByZWltYWdlRm9yAAEEBn0JPQsEAAABEQMBvQcAAUELIAAgQm91bnRpZXMBIEJvdW50aWVzECxCb3VudHlDb3VudAEAEBAAAAAABMAgTnVtYmVyIG9mIGJvdW50eSBwcm9wb3NhbHMgdGhhdCBoYXZlIGJlZW4gbWFkZS4gQm91bnRpZXMAAQQFEEULBAAEeCBCb3VudGllcyB0aGF0IGhhdmUgYmVlbiBtYWRlLkhCb3VudHlEZXNjcmlwdGlvbnMAAQQFEE0LBAAEgCBUaGUgZGVzY3JpcHRpb24gb2YgZWFjaCBib3VudHkuPEJvdW50eUFwcHJvdmFscwEAsQkEAATsIEJvdW50eSBpbmRpY2VzIHRoYXQgaGF2ZSBiZWVuIGFwcHJvdmVkIGJ1dCBub3QgeWV0IGZ1bmRlZC4BGQMBwQckREJvdW50eURlcG9zaXRCYXNlGEA0TdLCBwAAAAAAAAAAAAAABOggVGhlIGFtb3VudCBoZWxkIG9uIGRlcG9zaXQgZm9yIHBsYWNpbmcgYSBib3VudHkgcHJvcG9zYWwuYEJvdW50eURlcG9zaXRQYXlvdXREZWxheRAQAAAAAARZASBUaGUgZGVsYXkgcGVyaW9kIGZvciB3aGljaCBhIGJvdW50eSBiZW5lZmljaWFyeSBuZWVkIHRvIHdhaXQgYmVmb3JlIGNsYWltIHRoZSBwYXlvdXQuSEJvdW50eVVwZGF0ZVBlcmlvZBAQgMYTAARsIEJvdW50eSBkdXJhdGlvbiBpbiBibG9ja3MuYEN1cmF0b3JEZXBvc2l0TXVsdGlwbGllcr0JECChBwAQGQEgVGhlIGN1cmF0b3IgZGVwb3NpdCBpcyBjYWxjdWxhdGVkIGFzIGEgcGVyY2VudGFnZSBvZiB0aGUgY3VyYXRvciBmZWUuADkBIFRoaXMgZGVwb3NpdCBoYXMgb3B0aW9uYWwgdXBwZXIgYW5kIGxvd2VyIGJvdW5kcyB3aXRoIGBDdXJhdG9yRGVwb3NpdE1heGAgYW5kVCBgQ3VyYXRvckRlcG9zaXRNaW5gLkRDdXJhdG9yRGVwb3NpdE1heN0BRAEEghvOJgAAAAAAAAAAAAAABEkBIE1heGltdW0gYW1vdW50IG9mIGZ1bmRzIHRoYXQgc2hvdWxkIGJlIHBsYWNlZCBpbiBhIGRlcG9zaXQgZm9yIG1ha2luZyBhIHByb3Bvc2FsLkRDdXJhdG9yRGVwb3NpdE1pbt0BRAFSoa7GAAAAAAAAAAAAAAAABEkBIE1pbmltdW0gYW1vdW50IG9mIGZ1bmRzIHRoYXQgc2hvdWxkIGJlIHBsYWNlZCBpbiBhIGRlcG9zaXQgZm9yIG1ha2luZyBhIHByb3Bvc2FsLkhCb3VudHlWYWx1ZU1pbmltdW0YQGiapIUPAAAAAAAAAAAAAAAEcCBNaW5pbXVtIHZhbHVlIGZvciBhIGJvdW50eS5IRGF0YURlcG9zaXRQZXJCeXRlGEBVQ94TAAAAAAAAAAAAAAAABGEBIFRoZSBhbW91bnQgaGVsZCBvbiBkZXBvc2l0IHBlciBieXRlIHdpdGhpbiB0aGUgdGlwIHJlcG9ydCByZWFzb24gb3IgYm91bnR5IGRlc2NyaXB0aW9uLkxNYXhpbXVtUmVhc29uTGVuZ3RoEBAAQAAADIggTWF4aW11bSBhY2NlcHRhYmxlIHJlYXNvbiBsZW5ndGguAGUBIEJlbmNobWFya3MgZGVwZW5kIG9uIHRoaXMgdmFsdWUsIGJlIHN1cmUgdG8gdXBkYXRlIHdlaWdodHMgZmlsZSB3aGVuIGNoYW5naW5nIHRoaXMgdmFsdWUBUQsjADRDaGlsZEJvdW50aWVzATRDaGlsZEJvdW50aWVzFEBDaGlsZEJvdW50eUNvdW50AQAQEAAAAAAEgCBOdW1iZXIgb2YgdG90YWwgY2hpbGQgYm91bnRpZXMuTFBhcmVudENoaWxkQm91bnRpZXMBAQQFEBAQAAAAAAiwIE51bWJlciBvZiBjaGlsZCBib3VudGllcyBwZXIgcGFyZW50IGJvdW50eS7gIE1hcCBvZiBwYXJlbnQgYm91bnR5IGluZGV4IHRvIG51bWJlciBvZiBjaGlsZCBib3VudGllcy40Q2hpbGRCb3VudGllcwABCAUF9QJVCwQABJQgQ2hpbGQgYm91bnRpZXMgdGhhdCBoYXZlIGJlZW4gYWRkZWQuXENoaWxkQm91bnR5RGVzY3JpcHRpb25zAAEEBRBNCwQABJggVGhlIGRlc2NyaXB0aW9uIG9mIGVhY2ggY2hpbGQtYm91bnR5LkxDaGlsZHJlbkN1cmF0b3JGZWVzAQEEBRAYQAAAAAAAAAAAAAAAAAAAAAAEAQEgVGhlIGN1bXVsYXRpdmUgY2hpbGQtYm91bnR5IGN1cmF0b3IgZmVlIGZvciBlYWNoIHBhcmVudCBib3VudHkuAR0DAcUHCGRNYXhBY3RpdmVDaGlsZEJvdW50eUNvdW50EBBkAAAABB0BIE1heGltdW0gbnVtYmVyIG9mIGNoaWxkIGJvdW50aWVzIHRoYXQgY2FuIGJlIGFkZGVkIHRvIGEgcGFyZW50IGJvdW50eS5cQ2hpbGRCb3VudHlWYWx1ZU1pbmltdW0YQKRCXY0BAAAAAAAAAAAAAAAEiCBNaW5pbXVtIHZhbHVlIGZvciBhIGNoaWxkLWJvdW50eS4BXQsoAGhFbGVjdGlvblByb3ZpZGVyTXVsdGlQaGFzZQFoRWxlY3Rpb25Qcm92aWRlck11bHRpUGhhc2UoFFJvdW5kAQAQEAEAAAAYrCBJbnRlcm5hbCBjb3VudGVyIGZvciB0aGUgbnVtYmVyIG9mIHJvdW5kcy4AVQEgVGhpcyBpcyB1c2VmdWwgZm9yIGRlLWR1cGxpY2F0aW9uIG9mIHRyYW5zYWN0aW9ucyBzdWJtaXR0ZWQgdG8gdGhlIHBvb2wsIGFuZCBnZW5lcmFsbCBkaWFnbm9zdGljcyBvZiB0aGUgcGFsbGV0LgBNASBUaGlzIGlzIG1lcmVseSBpbmNyZW1lbnRlZCBvbmNlIHBlciBldmVyeSB0aW1lIHRoYXQgYW4gdXBzdHJlYW0gYGVsZWN0YCBpcyBjYWxsZWQuMEN1cnJlbnRQaGFzZQEA0QcEAAQ8IEN1cnJlbnQgcGhhc2UuOFF1ZXVlZFNvbHV0aW9uAABhCwQADD0BIEN1cnJlbnQgYmVzdCBzb2x1dGlvbiwgc2lnbmVkIG9yIHVuc2lnbmVkLCBxdWV1ZWQgdG8gYmUgcmV0dXJuZWQgdXBvbiBgZWxlY3RgLgBgIEFsd2F5cyBzb3J0ZWQgYnkgc2NvcmUuIFNuYXBzaG90AABpCwQAEHAgU25hcHNob3QgZGF0YSBvZiB0aGUgcm91bmQuAF0BIFRoaXMgaXMgY3JlYXRlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzaWduZWQgcGhhc2UgYW5kIGNsZWFyZWQgdXBvbiBjYWxsaW5nIGBlbGVjdGAuKQEgTm90ZTogVGhpcyBzdG9yYWdlIHR5cGUgbXVzdCBvbmx5IGJlIG11dGF0ZWQgdGhyb3VnaCBbYFNuYXBzaG90V3JhcHBlcmBdLjhEZXNpcmVkVGFyZ2V0cwAAEAQAEMwgRGVzaXJlZCBudW1iZXIgb2YgdGFyZ2V0cyB0byBlbGVjdCBmb3IgdGhpcyByb3VuZC4AqCBPbmx5IGV4aXN0cyB3aGVuIFtgU25hcHNob3RgXSBpcyBwcmVzZW50LikBIE5vdGU6IFRoaXMgc3RvcmFnZSB0eXBlIG11c3Qgb25seSBiZSBtdXRhdGVkIHRocm91Z2ggW2BTbmFwc2hvdFdyYXBwZXJgXS5AU25hcHNob3RNZXRhZGF0YQAAWQQEABCYIFRoZSBtZXRhZGF0YSBvZiB0aGUgW2BSb3VuZFNuYXBzaG90YF0AqCBPbmx5IGV4aXN0cyB3aGVuIFtgU25hcHNob3RgXSBpcyBwcmVzZW50LikBIE5vdGU6IFRoaXMgc3RvcmFnZSB0eXBlIG11c3Qgb25seSBiZSBtdXRhdGVkIHRocm91Z2ggW2BTbmFwc2hvdFdyYXBwZXJgXS5kU2lnbmVkU3VibWlzc2lvbk5leHRJbmRleAEAEBAAAAAAJAEBIFRoZSBuZXh0IGluZGV4IHRvIGJlIGFzc2lnbmVkIHRvIGFuIGluY29taW5nIHNpZ25lZCBzdWJtaXNzaW9uLgB1ASBFdmVyeSBhY2NlcHRlZCBzdWJtaXNzaW9uIGlzIGFzc2lnbmVkIGEgdW5pcXVlIGluZGV4OyB0aGF0IGluZGV4IGlzIGJvdW5kIHRvIHRoYXQgcGFydGljdWxhcmUBIHN1Ym1pc3Npb24gZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgZWxlY3Rpb24uIE9uIGVsZWN0aW9uIGZpbmFsaXphdGlvbiwgdGhlIG5leHQgaW5kZXggaXMwIHJlc2V0IHRvIDAuAGkBIFdlIGNhbid0IGp1c3QgdXNlIGBTaWduZWRTdWJtaXNzaW9uSW5kaWNlcy5sZW4oKWAsIGJlY2F1c2UgdGhhdCdzIGEgYm91bmRlZCBzZXQ7IHBhc3QgaXRzWQEgY2FwYWNpdHksIGl0IHdpbGwgc2ltcGx5IHNhdHVyYXRlLiBXZSBjYW4ndCBqdXN0IGl0ZXJhdGUgb3ZlciBgU2lnbmVkU3VibWlzc2lvbnNNYXBgLPQgYmVjYXVzZSBpdGVyYXRpb24gaXMgc2xvdy4gSW5zdGVhZCwgd2Ugc3RvcmUgdGhlIHZhbHVlIGhlcmUuXFNpZ25lZFN1Ym1pc3Npb25JbmRpY2VzAQB1CwQAGG0BIEEgc29ydGVkLCBib3VuZGVkIHZlY3RvciBvZiBgKHNjb3JlLCBibG9ja19udW1iZXIsIGluZGV4KWAsIHdoZXJlIGVhY2ggYGluZGV4YCBwb2ludHMgdG8gYXggdmFsdWUgaW4gYFNpZ25lZFN1Ym1pc3Npb25zYC4AcQEgV2UgbmV2ZXIgbmVlZCB0byBwcm9jZXNzIG1vcmUgdGhhbiBhIHNpbmdsZSBzaWduZWQgc3VibWlzc2lvbiBhdCBhIHRpbWUuIFNpZ25lZCBzdWJtaXNzaW9uc3UBIGNhbiBiZSBxdWl0ZSBsYXJnZSwgc28gd2UncmUgd2lsbGluZyB0byBwYXkgdGhlIGNvc3Qgb2YgbXVsdGlwbGUgZGF0YWJhc2UgYWNjZXNzZXMgdG8gYWNjZXNzIQEgdGhlbSBvbmUgYXQgYSB0aW1lIGluc3RlYWQgb2YgcmVhZGluZyBhbmQgZGVjb2RpbmcgYWxsIG9mIHRoZW0gYXQgb25jZS5QU2lnbmVkU3VibWlzc2lvbnNNYXAAAQQFEIELBAAcdCBVbmNoZWNrZWQsIHNpZ25lZCBzb2x1dGlvbnMuAGkBIFRvZ2V0aGVyIHdpdGggYFN1Ym1pc3Npb25JbmRpY2VzYCwgdGhpcyBzdG9yZXMgYSBib3VuZGVkIHNldCBvZiBgU2lnbmVkU3VibWlzc2lvbnNgIHdoaWxl7CBhbGxvd2luZyB1cyB0byBrZWVwIG9ubHkgYSBzaW5nbGUgb25lIGluIG1lbW9yeSBhdCBhIHRpbWUuAGkBIFR3b3ggbm90ZTogdGhlIGtleSBvZiB0aGUgbWFwIGlzIGFuIGF1dG8taW5jcmVtZW50aW5nIGluZGV4IHdoaWNoIHVzZXJzIGNhbm5vdCBpbnNwZWN0IG9y9CBhZmZlY3Q7IHdlIHNob3VsZG4ndCBuZWVkIGEgY3J5cHRvZ3JhcGhpY2FsbHkgc2VjdXJlIGhhc2hlci5UTWluaW11bVVudHJ1c3RlZFNjb3JlAABVBAQAEF0BIFRoZSBtaW5pbXVtIHNjb3JlIHRoYXQgZWFjaCAndW50cnVzdGVkJyBzb2x1dGlvbiBtdXN0IGF0dGFpbiBpbiBvcmRlciB0byBiZSBjb25zaWRlcmVkKCBmZWFzaWJsZS4AuCBDYW4gYmUgc2V0IHZpYSBgc2V0X21pbmltdW1fdW50cnVzdGVkX3Njb3JlYC4BIQMByQc4VEJldHRlclNpZ25lZFRocmVzaG9sZJQQAAAAAAhNASBUaGUgbWluaW11bSBhbW91bnQgb2YgaW1wcm92ZW1lbnQgdG8gdGhlIHNvbHV0aW9uIHNjb3JlIHRoYXQgZGVmaW5lcyBhIHNvbHV0aW9uIGFzeCAiYmV0dGVyIiBpbiB0aGUgU2lnbmVkIHBoYXNlLjhPZmZjaGFpblJlcGVhdBAQEgAAABC0IFRoZSByZXBlYXQgdGhyZXNob2xkIG9mIHRoZSBvZmZjaGFpbiB3b3JrZXIuAGEBIEZvciBleGFtcGxlLCBpZiBpdCBpcyA1LCB0aGF0IG1lYW5zIHRoYXQgYXQgbGVhc3QgNSBibG9ja3Mgd2lsbCBlbGFwc2UgYmV0d2VlbiBhdHRlbXB0c4QgdG8gc3VibWl0IHRoZSB3b3JrZXIncyBzb2x1dGlvbi48TWluZXJUeFByaW9yaXR5MCBlZmZmZmZm5gQlASBUaGUgcHJpb3JpdHkgb2YgdGhlIHVuc2lnbmVkIHRyYW5zYWN0aW9uIHN1Ym1pdHRlZCBpbiB0aGUgdW5zaWduZWQtcGhhc2VQU2lnbmVkTWF4U3VibWlzc2lvbnMQEBAAAAAc5CBNYXhpbXVtIG51bWJlciBvZiBzaWduZWQgc3VibWlzc2lvbnMgdGhhdCBjYW4gYmUgcXVldWVkLgBVASBJdCBpcyBiZXN0IHRvIGF2b2lkIGFkanVzdGluZyB0aGlzIGR1cmluZyBhbiBlbGVjdGlvbiwgYXMgaXQgaW1wYWN0cyBkb3duc3RyZWFtIGRhdGFlASBzdHJ1Y3R1cmVzLiBJbiBwYXJ0aWN1bGFyLCBgU2lnbmVkU3VibWlzc2lvbkluZGljZXM8VD5gIGlzIGJvdW5kZWQgb24gdGhpcyB2YWx1ZS4gSWYgeW919CB1cGRhdGUgdGhpcyB2YWx1ZSBkdXJpbmcgYW4gZWxlY3Rpb24sIHlvdSBfbXVzdF8gZW5zdXJlIHRoYXRNASBgU2lnbmVkU3VibWlzc2lvbkluZGljZXMubGVuKClgIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgbmV3IHZhbHVlLiBPdGhlcndpc2Us8CBhdHRlbXB0cyB0byBzdWJtaXQgbmV3IHNvbHV0aW9ucyBtYXkgY2F1c2UgYSBydW50aW1lIHBhbmljLjxTaWduZWRNYXhXZWlnaHQoQAuI2GY8VQETo3A9CtejcL0UlCBNYXhpbXVtIHdlaWdodCBvZiBhIHNpZ25lZCBzb2x1dGlvbi4AXQEgSWYgW2BDb25maWc6Ok1pbmVyQ29uZmlnYF0gaXMgYmVpbmcgaW1wbGVtZW50ZWQgdG8gc3VibWl0IHNpZ25lZCBzb2x1dGlvbnMgKG91dHNpZGUgb2Y9ASB0aGlzIHBhbGxldCksIHRoZW4gW2BNaW5lckNvbmZpZzo6c29sdXRpb25fd2VpZ2h0YF0gaXMgdXNlZCB0byBjb21wYXJlIGFnYWluc3QwIHRoaXMgdmFsdWUuQFNpZ25lZE1heFJlZnVuZHMQEAQAAAAEGQEgVGhlIG1heGltdW0gYW1vdW50IG9mIHVuY2hlY2tlZCBzb2x1dGlvbnMgdG8gcmVmdW5kIHRoZSBjYWxsIGZlZSBmb3IuQFNpZ25lZFJld2FyZEJhc2UYQADodkgXAAAAAAAAAAAAAAAEiCBCYXNlIHJld2FyZCBmb3IgYSBzaWduZWQgc29sdXRpb25EU2lnbmVkRGVwb3NpdEJ5dGUYQJD3BAAAAAAAAAAAAAAAAAAEoCBQZXItYnl0ZSBkZXBvc2l0IGZvciBhIHNpZ25lZCBzb2x1dGlvbi5MU2lnbmVkRGVwb3NpdFdlaWdodBhAAAAAAAAAAAAAAAAAAAAAAASoIFBlci13ZWlnaHQgZGVwb3NpdCBmb3IgYSBzaWduZWQgc29sdXRpb24uKE1heFdpbm5lcnMQENAHAAAQNQEgVGhlIG1heGltdW0gbnVtYmVyIG9mIHdpbm5lcnMgdGhhdCBjYW4gYmUgZWxlY3RlZCBieSB0aGlzIGBFbGVjdGlvblByb3ZpZGVyYEAgaW1wbGVtZW50YXRpb24uAFEBIE5vdGU6IFRoaXMgbXVzdCBhbHdheXMgYmUgZ3JlYXRlciBvciBlcXVhbCB0byBgVDo6RGF0YVByb3ZpZGVyOjpkZXNpcmVkX3RhcmdldHMoKWAuOE1pbmVyTWF4TGVuZ3RoEBAAADYAADhNaW5lck1heFdlaWdodChAC4jYZjxVAROjcD0K16NwvQBUTWluZXJNYXhWb3Rlc1BlclZvdGVyEBAYAAAAADxNaW5lck1heFdpbm5lcnMQENAHAAAAAYULJQAMTmlzAQxOaXMQLFF1ZXVlVG90YWxzAQCJC0mc0QcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFGEBIFRoZSB0b3RhbHMgb2YgaXRlbXMgYW5kIGJhbGFuY2VzIHdpdGhpbiBlYWNoIHF1ZXVlLiBTYXZlcyBhIGxvdCBvZiBzdG9yYWdlIHJlYWRzIGluIHRoZYAgY2FzZSBvZiBzcGFyc2VseSBwYWNrZWQgcXVldWVzLgBtASBUaGUgdmVjdG9yIGlzIGluZGV4ZWQgYnkgZHVyYXRpb24gaW4gYFBlcmlvZGBzLCBvZmZzZXQgYnkgb25lLCBzbyBpbmZvcm1hdGlvbiBvbiB0aGUgcXVldWXUIHdob3NlIGR1cmF0aW9uIGlzIG9uZSBgUGVyaW9kYCB3b3VsZCBiZSBzdG9yYWdlIGAwYC4YUXVldWVzAQEEAhCNCwQABOAgVGhlIHF1ZXVlcyBvZiBiaWRzLiBJbmRleGVkIGJ5IGR1cmF0aW9uIChpbiBgUGVyaW9kYHMpLhxTdW1tYXJ5AQCZC6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABLAgU3VtbWFyeSBpbmZvcm1hdGlvbiBvdmVyIHRoZSBnZW5lcmFsIHN0YXRlLiBSZWNlaXB0cwABBAIQnQsEAARBASBUaGUgY3VycmVudGx5IG91dHN0YW5kaW5nIHJlY2VpcHRzLCBpbmRleGVkIGFjY29yZGluZyB0byB0aGUgb3JkZXIgb2YgY3JlYXRpb24uAXUEAdkHKCBQYWxsZXRJZMEJIHB5L25pcyAgBBkBIFRoZSB0cmVhc3VyeSdzIHBhbGxldCBpZCwgdXNlZCBmb3IgZGVyaXZpbmcgaXRzIHNvdmVyZWlnbiBhY2NvdW50IElELihRdWV1ZUNvdW50EBD0AQAACF0BIE51bWJlciBvZiBkdXJhdGlvbiBxdWV1ZXMgaW4gdG90YWwuIFRoaXMgc2V0cyB0aGUgbWF4aW11bSBkdXJhdGlvbiBzdXBwb3J0ZWQsIHdoaWNoIGlzjCB0aGlzIHZhbHVlIG11bHRpcGxpZWQgYnkgYFBlcmlvZGAuLE1heFF1ZXVlTGVuEBDoAwAADPAgTWF4aW11bSBudW1iZXIgb2YgaXRlbXMgdGhhdCBtYXkgYmUgaW4gZWFjaCBkdXJhdGlvbiBxdWV1ZS4AaCBNdXN0IGJlIGxhcmdlciB0aGFuIHplcm8uMEZpZm9RdWV1ZUxlbhAQ+gAAAAwJASBQb3J0aW9uIG9mIHRoZSBxdWV1ZSB3aGljaCBpcyBmcmVlIGZyb20gb3JkZXJpbmcgYW5kIGp1c3QgYSBGSUZPLgCcIE11c3QgYmUgbm8gZ3JlYXRlciB0aGFuIGBNYXhRdWV1ZUxlbmAuKEJhc2VQZXJpb2QQEMCJAQAIQQEgVGhlIGJhc2UgcGVyaW9kIGZvciB0aGUgZHVyYXRpb24gcXVldWVzLiBUaGlzIGlzIHRoZSBjb21tb24gbXVsdGlwbGUgYWNyb3NzIGFsbMwgc3VwcG9ydGVkIGZyZWV6aW5nIGR1cmF0aW9ucyB0aGF0IGNhbiBiZSBiaWQgdXBvbi4YTWluQmlkGEA0NSYaCAMAAAAAAAAAAAAAGCEBIFRoZSBtaW5pbXVtIGFtb3VudCBvZiBmdW5kcyB0aGF0IG1heSBiZSBwbGFjZWQgaW4gYSBiaWQuIE5vdGUgdGhhdCB0aGlzYQEgZG9lcyBub3QgYWN0dWFsbHkgbGltaXQgdGhlIGFtb3VudCB3aGljaCBtYXkgYmUgcmVwcmVzZW50ZWQgaW4gYSByZWNlaXB0IHNpbmNlIGJpZHMgbWF5bCBiZSBzcGxpdCB1cCBieSB0aGUgc3lzdGVtLgBlASBJdCBzaG91bGQgYmUgYXQgbGVhc3QgYmlnIGVub3VnaCB0byBlbnN1cmUgdGhhdCB0aGVyZSBpcyBubyBwb3NzaWJsZSBzdG9yYWdlIHNwYW0gYXR0YWNrZCBvciBxdWV1ZS1maWxsaW5nIGF0dGFjay4oTWluUmVjZWlwdJ0CIADodkgXAAAACFUBIFRoZSBtaW5pbXVtIGFtb3VudCBvZiBmdW5kcyB3aGljaCBtYXkgaW50ZW50aW9uYWxseSBiZSBsZWZ0IHJlbWFpbmluZyB1bmRlciBhIHNpbmdsZSQgcmVjZWlwdC4wSW50YWtlUGVyaW9kEBAyAAAAEF0BIFRoZSBudW1iZXIgb2YgYmxvY2tzIGJldHdlZW4gY29uc2VjdXRpdmUgYXR0ZW1wdHMgdG8gZGVxdWV1ZSBiaWRzIGFuZCBjcmVhdGUgcmVjZWlwdHMuAF0BIEEgbGFyZ2VyIHZhbHVlIHJlc3VsdHMgaW4gZmV3ZXIgc3RvcmFnZSBoaXRzIGVhY2ggYmxvY2ssIGJ1dCBhIHNsb3dlciBwZXJpb2QgdG8gZ2V0IHRvMCB0aGUgdGFyZ2V0LjxNYXhJbnRha2VXZWlnaHQoPAcA0O2QLhOZmZmZmZmZGQxVASBUaGUgbWF4aW11bSBhbW91bnQgb2YgYmlkcyB0aGF0IGNhbiBjb25zb2xpZGF0ZWQgaW50byByZWNlaXB0cyBpbiBhIHNpbmdsZSBpbnRha2UuIEFdASBsYXJnZXIgdmFsdWUgaGVyZSBtZWFucyBsZXNzIG9mIHRoZSBibG9jayBhdmFpbGFibGUgZm9yIHRyYW5zYWN0aW9ucyBzaG91bGQgdGhlcmUgYmUgYTggZ2x1dCBvZiBiaWRzLjBUaGF3VGhyb3R0bGWhCzAAANnprC14AwUAAAAESQEgVGhlIG1heGltdW0gcHJvcG9ydGlvbiB3aGljaCBtYXkgYmUgdGhhd2VkIGFuZCB0aGUgcGVyaW9kIG92ZXIgd2hpY2ggaXQgaXMgcmVzZXQuAaULJgBYTmlzQ291bnRlcnBhcnRCYWxhbmNlcwFYTmlzQ291bnRlcnBhcnRCYWxhbmNlcxw0VG90YWxJc3N1YW5jZQEAGEAAAAAAAAAAAAAAAAAAAAAABJggVGhlIHRvdGFsIHVuaXRzIGlzc3VlZCBpbiB0aGUgc3lzdGVtLkBJbmFjdGl2ZUlzc3VhbmNlAQAYQAAAAAAAAAAAAAAAAAAAAAAECQEgVGhlIHRvdGFsIHVuaXRzIG9mIG91dHN0YW5kaW5nIGRlYWN0aXZhdGVkIGJhbGFuY2UgaW4gdGhlIHN5c3RlbS4cQWNjb3VudAEBBAIAFAEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgGAJASBUaGUgQmFsYW5jZXMgcGFsbGV0IGV4YW1wbGUgb2Ygc3RvcmluZyB0aGUgYmFsYW5jZSBvZiBhbiBhY2NvdW50LgAoICMgRXhhbXBsZQA0IGBgYG5vY29tcGlsZbAgIGltcGwgcGFsbGV0X2JhbGFuY2VzOjpDb25maWcgZm9yIFJ1bnRpbWUgexkCICAgIHR5cGUgQWNjb3VudFN0b3JlID0gU3RvcmFnZU1hcFNoaW08U2VsZjo6QWNjb3VudDxSdW50aW1lPiwgZnJhbWVfc3lzdGVtOjpQcm92aWRlcjxSdW50aW1lPiwgQWNjb3VudElkLCBTZWxmOjpBY2NvdW50RGF0YTxCYWxhbmNlPj4MICB9ECBgYGAAFQEgWW91IGNhbiBhbHNvIHN0b3JlIHRoZSBiYWxhbmNlIG9mIGFuIGFjY291bnQgaW4gdGhlIGBTeXN0ZW1gIHBhbGxldC4AKCAjIEV4YW1wbGUANCBgYGBub2NvbXBpbGWwICBpbXBsIHBhbGxldF9iYWxhbmNlczo6Q29uZmlnIGZvciBSdW50aW1lIHt0ICAgdHlwZSBBY2NvdW50U3RvcmUgPSBTeXN0ZW0MICB9ECBgYGAAUQEgQnV0IHRoaXMgY29tZXMgd2l0aCB0cmFkZW9mZnMsIHN0b3JpbmcgYWNjb3VudCBiYWxhbmNlcyBpbiB0aGUgc3lzdGVtIHBhbGxldCBzdG9yZXNtASBgZnJhbWVfc3lzdGVtYCBkYXRhIGFsb25nc2lkZSB0aGUgYWNjb3VudCBkYXRhIGNvbnRyYXJ5IHRvIHN0b3JpbmcgYWNjb3VudCBiYWxhbmNlcyBpbiB0aGUpASBgQmFsYW5jZXNgIHBhbGxldCwgd2hpY2ggdXNlcyBhIGBTdG9yYWdlTWFwYCB0byBzdG9yZSBiYWxhbmNlcyBkYXRhIG9ubHkuQQEgTk9URTogVGhpcyBpcyBvbmx5IHVzZWQgaW4gdGhlIGNhc2UgdGhhdCB0aGlzIHBhbGxldCBpcyB1c2VkIHRvIHN0b3JlIGJhbGFuY2VzLhRMb2NrcwEBBAIAqQsEABC4IEFueSBsaXF1aWRpdHkgbG9ja3Mgb24gc29tZSBhY2NvdW50IGJhbGFuY2VzLiUBIE5PVEU6IFNob3VsZCBvbmx5IGJlIGFjY2Vzc2VkIHdoZW4gc2V0dGluZywgY2hhbmdpbmcgYW5kIGZyZWVpbmcgYSBsb2NrLgCtASBVc2Ugb2YgbG9ja3MgaXMgZGVwcmVjYXRlZCBpbiBmYXZvdXIgb2YgZnJlZXplcy4gU2VlIGBodHRwczovL2dpdGh1Yi5jb20vcGFyaXR5dGVjaC9zdWJzdHJhdGUvcHVsbC8xMjk1MS9gIFJlc2VydmVzAQEEAgCtCwQADKQgTmFtZWQgcmVzZXJ2ZXMgb24gc29tZSBhY2NvdW50IGJhbGFuY2VzLgCxASBVc2Ugb2YgcmVzZXJ2ZXMgaXMgZGVwcmVjYXRlZCBpbiBmYXZvdXIgb2YgaG9sZHMuIFNlZSBgaHR0cHM6Ly9naXRodWIuY29tL3Bhcml0eXRlY2gvc3Vic3RyYXRlL3B1bGwvMTI5NTEvYBRIb2xkcwEBBAIA4QgEAARsIEhvbGRzIG9uIGFjY291bnQgYmFsYW5jZXMuHEZyZWV6ZXMBAQQCALELBAAEiCBGcmVlemUgbG9ja3Mgb24gYWNjb3VudCBiYWxhbmNlcy4BeQQB3QcQSEV4aXN0ZW50aWFsRGVwb3NpdBhAAOQLVAIAAAAAAAAAAAAAACBBASBUaGUgbWluaW11bSBhbW91bnQgcmVxdWlyZWQgdG8ga2VlcCBhbiBhY2NvdW50IG9wZW4uIE1VU1QgQkUgR1JFQVRFUiBUSEFOIFpFUk8hAFkBIElmIHlvdSAqcmVhbGx5KiBuZWVkIGl0IHRvIGJlIHplcm8sIHlvdSBjYW4gZW5hYmxlIHRoZSBmZWF0dXJlIGBpbnNlY3VyZV96ZXJvX2VkYCBmb3JhASB0aGlzIHBhbGxldC4gSG93ZXZlciwgeW91IGRvIHNvIGF0IHlvdXIgb3duIHJpc2s6IHRoaXMgd2lsbCBvcGVuIHVwIGEgbWFqb3IgRG9TIHZlY3Rvci5ZASBJbiBjYXNlIHlvdSBoYXZlIG11bHRpcGxlIHNvdXJjZXMgb2YgcHJvdmlkZXIgcmVmZXJlbmNlcywgeW91IG1heSBhbHNvIGdldCB1bmV4cGVjdGVkjCBiZWhhdmlvdXIgaWYgeW91IHNldCB0aGlzIHRvIHplcm8uAPAgQm90dG9tIGxpbmU6IERvIHlvdXJzZWxmIGEgZmF2b3VyIGFuZCBtYWtlIGl0IGF0IGxlYXN0IG9uZSEgTWF4TG9ja3MQEAQAAAAQ9CBUaGUgbWF4aW11bSBudW1iZXIgb2YgbG9ja3MgdGhhdCBzaG91bGQgZXhpc3Qgb24gYW4gYWNjb3VudC7cIE5vdCBzdHJpY3RseSBlbmZvcmNlZCwgYnV0IHVzZWQgZm9yIHdlaWdodCBlc3RpbWF0aW9uLgCtASBVc2Ugb2YgbG9ja3MgaXMgZGVwcmVjYXRlZCBpbiBmYXZvdXIgb2YgZnJlZXplcy4gU2VlIGBodHRwczovL2dpdGh1Yi5jb20vcGFyaXR5dGVjaC9zdWJzdHJhdGUvcHVsbC8xMjk1MS9gLE1heFJlc2VydmVzEBAEAAAADA0BIFRoZSBtYXhpbXVtIG51bWJlciBvZiBuYW1lZCByZXNlcnZlcyB0aGF0IGNhbiBleGlzdCBvbiBhbiBhY2NvdW50LgCxASBVc2Ugb2YgcmVzZXJ2ZXMgaXMgZGVwcmVjYXRlZCBpbiBmYXZvdXIgb2YgaG9sZHMuIFNlZSBgaHR0cHM6Ly9naXRodWIuY29tL3Bhcml0eXRlY2gvc3Vic3RyYXRlL3B1bGwvMTI5NTEvYChNYXhGcmVlemVzEBABAAAABGEBIFRoZSBtYXhpbXVtIG51bWJlciBvZiBpbmRpdmlkdWFsIGZyZWV6ZSBsb2NrcyB0aGF0IGNhbiBleGlzdCBvbiBhbiBhY2NvdW50IGF0IGFueSB0aW1lLgG9Cy0AJFZvdGVyTGlzdAEkVm90ZXJMaXN0DCRMaXN0Tm9kZXMAAQQFAMELBAAMgCBBIHNpbmdsZSBub2RlLCB3aXRoaW4gc29tZSBiYWcuAAUBIE5vZGVzIHN0b3JlIGxpbmtzIGZvcndhcmQgYW5kIGJhY2sgd2l0aGluIHRoZWlyIHJlc3BlY3RpdmUgYmFncy5MQ291bnRlckZvckxpc3ROb2RlcwEAEBAAAAAABKxD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ZiB0aHJlc2hvbGRzIHNlcGFyYXRpbmcgdGhlIHZhcmlvdXMgYmFncy4ASQEgSWRzIGFyZSBzZXBhcmF0ZWQgaW50byB1bnNvcnRlZCBiYWdzIGFjY29yZGluZyB0byB0aGVpciBzY29yZS4gVGhpcyBzcGVjaWZpZXMgdGhlYQEgdGhyZXNob2xkcyBzZXBhcmF0aW5nIHRoZSBiYWdzLiBBbiBpZCdzIGJhZyBpcyB0aGUgbGFyZ2VzdCBiYWcgZm9yIHdoaWNoIHRoZSBpZCdzIHNjb3JluCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gaXRzIHVwcGVyIHRocmVzaG9sZC4AZQEgV2hlbiBpZHMgYXJlIGl0ZXJhdGVkLCBoaWdoZXIgYmFncyBhcmUgaXRlcmF0ZWQgY29tcGxldGVseSBiZWZvcmUgbG93ZXIgYmFncy4gVGhpcyBtZWFuc1kBIHRoYXQgaXRlcmF0aW9uIGlzIF9zZW1pLXNvcnRlZF86IGlkcyBvZiBoaWdoZXIgc2NvcmUgdGVuZCB0byBjb21lIGJlZm9yZSBpZHMgb2YgbG93ZXItASBzY29yZSwgYnV0IHBlZXIgaWRzIHdpdGhpbiBhIHBhcnRpY3VsYXIgYmFnIGFyZSBzb3J0ZWQgaW4gaW5zZXJ0aW9uIG9yZGVyLgBoICMgRXhwcmVzc2luZyB0aGUgY29uc3RhbnQATQEgVGhpcyBjb25zdGFudCBtdXN0IGJlIHNvcnRlZCBpbiBzdHJpY3RseSBpbmNyZWFzaW5nIG9yZGVyLiBEdXBsaWNhdGUgaXRlbXMgYXJlIG5vdCwgcGVybWl0dGVkLgBBASBUaGVyZSBpcyBhbiBpbXBsaWVkIHVwcGVyIGxpbWl0IG9mIGBTY29yZTo6TUFYYDsgdGhhdCB2YWx1ZSBkb2VzIG5vdCBuZWVkIHRvIGJlIQEgc3BlY2lmaWVkIHdpdGhpbiB0aGUgYmFnLiBGb3IgYW55IHR3byB0aHJlc2hvbGQgbGlzdHMsIGlmIG9uZSBlbmRzIHdpdGgxASBgU2NvcmU6Ok1BWGAsIHRoZSBvdGhlciBvbmUgZG9lcyBub3QsIGFuZCB0aGV5IGFyZSBvdGhlcndpc2UgZXF1YWwsIHRoZSB0d298IGxpc3RzIHdpbGwgYmVoYXZlIGlkZW50aWNhbGx5LgA4ICMgQ2FsY3VsYXRpb24AVQEgSXQgaXMgcmVjb21tZW5kZWQgdG8gZ2VuZXJhdGUgdGhlIHNldCBvZiB0aHJlc2hvbGRzIGluIGEgZ2VvbWV0cmljIHNlcmllcywgc3VjaCB0aGF0QQEgdGhlcmUgZXhpc3RzIHNvbWUgY29uc3RhbnQgcmF0aW8gc3VjaCB0aGF0IGB0aHJlc2hvbGRbayArIDFdID09ICh0aHJlc2hvbGRba10gKtAgY29uc3RhbnRfcmF0aW8pLm1heCh0aHJlc2hvbGRba10gKyAxKWAgZm9yIGFsbCBga2AuAFkBIFRoZSBoZWxwZXJzIGluIHRoZSBgL3V0aWxzL2ZyYW1lL2dlbmVyYXRlLWJhZ3NgIG1vZHVsZSBjYW4gc2ltcGxpZnkgdGhpcyBjYWxjdWxhdGlvbi4ALCAjIEV4YW1wbGVzAFEBIC0gSWYgYEJhZ1RocmVzaG9sZHM6OmdldCgpLmlzX2VtcHR5KClgLCB0aGVuIGFsbCBpZHMgYXJlIHB1dCBpbnRvIHRoZSBzYW1lIGJhZywgYW5ksCAgIGl0ZXJhdGlvbiBpcyBzdHJpY3RseSBpbiBpbnNlcnRpb24gb3JkZXIuYQEgLSBJZiBgQmFnVGhyZXNob2xkczo6Z2V0KCkubGVuKCkgPT0gNjRgLCBhbmQgdGhlIHRocmVzaG9sZHMgYXJlIGRldGVybWluZWQgYWNjb3JkaW5nIHRvEQEgICB0aGUgcHJvY2VkdXJlIGdpdmVuIGFib3ZlLCB0aGVuIHRoZSBjb25zdGFudCByYXRpbyBpcyBlcXVhbCB0byAyLmUBIC0gSWYgYEJhZ1RocmVzaG9sZHM6OmdldCgpLmxlbigpID09IDIwMGAsIGFuZCB0aGUgdGhyZXNob2xkcyBhcmUgZGV0ZXJtaW5lZCBhY2NvcmRpbmcgdG9ZASAgIHRoZSBwcm9jZWR1cmUgZ2l2ZW4gYWJvdmUsIHRoZW4gdGhlIGNvbnN0YW50IHJhdGlvIGlzIGFwcHJveGltYXRlbHkgZXF1YWwgdG8gMS4yNDguYQEgLSBJZiB0aGUgdGhyZXNob2xkIGxpc3QgYmVnaW5zIGBbMSwgMiwgMywgLi4uXWAsIHRoZW4gYW4gaWQgd2l0aCBzY29yZSAwIG9yIDEgd2lsbCBmYWxs8CAgIGludG8gYmFnIDAsIGFuIGlkIHdpdGggc2NvcmUgMiB3aWxsIGZhbGwgaW50byBiYWcgMSwgZXRjLgAwICMgTWlncmF0aW9uAGEBIEluIHRoZSBldmVudCB0aGF0IHRoaXMgbGlzdCBldmVyIGNoYW5nZXMsIGEgY29weSBvZiB0aGUgb2xkIGJhZ3MgbGlzdCBtdXN0IGJlIHJldGFpbmVkLl0BIFdpdGggdGhhdCBgTGlzdDo6bWlncmF0ZWAgY2FuIGJlIGNhbGxlZCwgd2hpY2ggd2lsbCBwZXJmb3JtIHRoZSBhcHByb3ByaWF0ZSBtaWdyYXRpb24uAc0LJwA8Tm9taW5hdGlvblBvb2xzATxOb21pbmF0aW9uUG9vbHNUQFRvdGFsVmFsdWVMb2NrZWQBABhAAAAAAAAAAAAAAAAAAAAAABSMIFRoZSBzdW0gb2YgZnVuZHMgYWNyb3NzIGFsbCBwb29scy4AcQEgVGhpcyBtaWdodCBiZSBsb3dlciBidXQgbmV2ZXIgaGlnaGVyIHRoYW4gdGhlIHN1bSBvZiBgdG90YWxfYmFsYW5jZWAgb2YgYWxsIFtgUG9vbE1lbWJlcnNgXVkBIGJlY2F1c2UgY2FsbGluZyBgcG9vbF93aXRoZHJhd191bmJvbmRlZGAgbWlnaHQgZGVjcmVhc2UgdGhlIHRvdGFsIHN0YWtlIG9mIHRoZSBwb29sJ3MpASBgYm9uZGVkX2FjY291bnRgIHdpdGhvdXQgYWRqdXN0aW5nIHRoZSBwYWxsZXQtaW50ZXJuYWwgYFVuYm9uZGluZ1Bvb2xgJ3MuLE1pbkpvaW5Cb25kAQAYQAAAAAAAAAAAAAAAAAAAAAAEnCBNaW5pbXVtIGFtb3VudCB0byBib25kIHRvIGpvaW4gYSBwb29sLjRNaW5DcmVhdGVCb25kAQAYQAAAAAAAAAAAAAAAAAAAAAAcoCBNaW5pbXVtIGJvbmQgcmVxdWlyZWQgdG8gY3JlYXRlIGEgcG9vbC4AZQEgVGhpcyBpcyB0aGUgYW1vdW50IHRoYXQgdGhlIGRlcG9zaXRvciBtdXN0IHB1dCBhcyB0aGVpciBpbml0aWFsIHN0YWtlIGluIHRoZSBwb29sLCBhcyBhboggaW5kaWNhdGlvbiBvZiAic2tpbiBpbiB0aGUgZ2FtZSIuAGkBIFRoaXMgaXMgdGhlIHZhbHVlIHRoYXQgd2lsbCBhbHdheXMgZXhpc3QgaW4gdGhlIHN0YWtpbmcgbGVkZ2VyIG9mIHRoZSBwb29sIGJvbmRlZCBhY2NvdW50gCB3aGlsZSBhbGwgb3RoZXIgYWNjb3VudHMgbGVhdmUuIE1heFBvb2xzAAAQBAAIaQEgTWF4aW11bSBudW1iZXIgb2Ygbm9taW5hdGlvbiBwb29scyB0aGF0IGNhbiBleGlzdC4gSWYgYE5vbmVgLCB0aGVuIGFuIHVuYm91bmRlZCBudW1iZXIgb2ZEIHBvb2xzIGNhbiBleGlzdC44TWF4UG9vbE1lbWJlcnMAABAEAAhJASBNYXhpbXVtIG51bWJlciBvZiBtZW1iZXJzIHRoYXQgY2FuIGV4aXN0IGluIHRoZSBzeXN0ZW0uIElmIGBOb25lYCwgdGhlbiB0aGUgY291bnS4IG1lbWJlcnMgYXJlIG5vdCBib3VuZCBvbiBhIHN5c3RlbSB3aWRlIGJhc2lzLlRNYXhQb29sTWVtYmVyc1BlclBvb2wAABAEAAhBASBNYXhpbXVtIG51bWJlciBvZiBtZW1iZXJzIHRoYXQgbWF5IGJlbG9uZyB0byBwb29sLiBJZiBgTm9uZWAsIHRoZW4gdGhlIGNvdW50IG9mqCBtZW1iZXJzIGlzIG5vdCBib3VuZCBvbiBhIHBlciBwb29sIGJhc2lzLkxHbG9iYWxNYXhDb21taXNzaW9uAACUBAAMaQEgVGhlIG1heGltdW0gY29tbWlzc2lvbiB0aGF0IGNhbiBiZSBjaGFyZ2VkIGJ5IGEgcG9vbC4gVXNlZCBvbiBjb21taXNzaW9uIHBheW91dHMgdG8gYm91bmQlASBwb29sIGNvbW1pc3Npb25zIHRoYXQgYXJlID4gYEdsb2JhbE1heENvbW1pc3Npb25gLCBuZWNlc3NhcnkgaWYgYSBmdXR1cmUNASBgR2xvYmFsTWF4Q29tbWlzc2lvbmAgaXMgbG93ZXIgdGhhbiBzb21lIGN1cnJlbnQgcG9vbCBjb21taXNzaW9ucy4sUG9vbE1lbWJlcnMAAQQFANULBAAMQCBBY3RpdmUgbWVtYmVycy4A0CBUV09YLU5PVEU6IFNBRkUgc2luY2UgYEFjY291bnRJZGAgaXMgYSBzZWN1cmUgaGFzaC5UQ291bnRlckZvclBvb2xNZW1iZXJzAQAQEAAAAAAErENvdW50ZXIgZm9yIHRoZSByZWxhdGVkIGNvdW50ZWQgc3RvcmFnZSBtYXAsQm9uZGVkUG9vbHMAAQQFEOELBAAEaCBTdG9yYWdlIGZvciBib25kZWQgcG9vbHMuVENvdW50ZXJGb3JCb25kZWRQb29scwEAEBAAAAAABKxDb3VudGVyIGZvciB0aGUgcmVsYXRlZCBjb3VudGVkIHN0b3JhZ2UgbWFwLFJld2FyZFBvb2xzAAEEBRD1CwQACHUBIFJld2FyZCBwb29scy4gVGhpcyBpcyB3aGVyZSB0aGVyZSByZXdhcmRzIGZvciBlYWNoIHBvb2wgYWNjdW11bGF0ZS4gV2hlbiBhIG1lbWJlcnMgcGF5b3V0IGlzWQEgY2xhaW1lZCwgdGhlIGJhbGFuY2UgY29tZXMgb3V0IG9mIHRoZSByZXdhcmQgcG9vbC4gS2V5ZWQgYnkgdGhlIGJvbmRlZCBwb29scyBhY2NvdW50LlRDb3VudGVyRm9yUmV3YXJkUG9vbHMBABAQAAAAAASsQ291bnRlciBmb3IgdGhlIHJlbGF0ZWQgY291bnRlZCBzdG9yYWdlIG1hcDxTdWJQb29sc1N0b3JhZ2UAAQQFEPkLBAAIGQEgR3JvdXBzIG9mIHVuYm9uZGluZyBwb29scy4gRWFjaCBncm91cCBvZiB1bmJvbmRpbmcgcG9vbHMgYmVsb25ncyB0byBhKQEgYm9uZGVkIHBvb2wsIGhlbmNlIHRoZSBuYW1lIHN1Yi1wb29scy4gS2V5ZWQgYnkgdGhlIGJvbmRlZCBwb29scyBhY2NvdW50LmRDb3VudGVyRm9yU3ViUG9vbHNTdG9yYWdlAQAQEAAAAAAErENvdW50ZXIgZm9yIHRoZSByZWxhdGVkIGNvdW50ZWQgc3RvcmFnZSBtYXAgTWV0YWRhdGEBAQQFEBEMBAAEXCBNZXRhZGF0YSBmb3IgdGhlIHBvb2wuSENvdW50ZXJGb3JNZXRhZGF0YQEAEBAAAAAABKxDb3VudGVyIGZvciB0aGUgcmVsYXRlZCBjb3VudGVkIHN0b3JhZ2UgbWFwKExhc3RQb29sSWQBABAQAAAAAATQIEV2ZXIgaW5jcmVhc2luZyBudW1iZXIgb2YgYWxsIHBvb2xzIGNyZWF0ZWQgc28gZmFyLkxSZXZlcnNlUG9vbElkTG9va3VwAAEEBQAQBAAQ3CBBIHJldmVyc2UgbG9va3VwIGZyb20gdGhlIHBvb2wncyBhY2NvdW50IGlkIHRvIGl0cyBpZC4AdQEgVGhpcyBpcyBvbmx5IHVzZWQgZm9yIHNsYXNoaW5nIGFuZCBvbiBhdXRvbWF0aWMgd2l0aGRyYXcgdXBkYXRlLiBJbiBhbGwgb3RoZXIgaW5zdGFuY2VzLCB0aGUlASBwb29sIGlkIGlzIHVzZWQsIGFuZCB0aGUgYWNjb3VudHMgYXJlIGRldGVybWluaXN0aWNhbGx5IGRlcml2ZWQgZnJvbSBpdC50Q291bnRlckZvclJldmVyc2VQb29sSWRMb29rdXABABAQAAAAAASsQ291bnRlciBmb3IgdGhlIHJlbGF0ZWQgY291bnRlZCBzdG9yYWdlIG1hcEBDbGFpbVBlcm1pc3Npb25zAQEEBQCdBAQCBAEBIE1hcCBmcm9tIGEgcG9vbCBtZW1iZXIgYWNjb3VudCB0byB0aGVpciBvcHRlZCBjbGFpbSBwZXJtaXNzaW9uLgGBBAHlBwwgUGFsbGV0SWTBCSBweS9ub3BscwSEIFRoZSBub21pbmF0aW9uIHBvb2wncyBwYWxsZXQgaWQuSE1heFBvaW50c1RvQmFsYW5jZQgECjAdASBUaGUgbWF4aW11bSBwb29sIHBvaW50cy10by1iYWxhbmNlIHJhdGlvIHRoYXQgYW4gYG9wZW5gIHBvb2wgY2FuIGhhdmUuAFUBIFRoaXMgaXMgaW1wb3J0YW50IGluIHRoZSBldmVudCBzbGFzaGluZyB0YWtlcyBwbGFjZSBhbmQgdGhlIHBvb2wncyBwb2ludHMtdG8tYmFsYW5jZXwgcmF0aW8gYmVjb21lcyBkaXNwcm9wb3J0aW9uYWwuAGUBIE1vcmVvdmVyLCB0aGlzIHJlbGF0ZXMgdG8gdGhlIGBSZXdhcmRDb3VudGVyYCB0eXBlIGFzIHdlbGwsIGFzIHRoZSBhcml0aG1ldGljIG9wZXJhdGlvbnNVASBhcmUgYSBmdW5jdGlvbiBvZiBudW1iZXIgb2YgcG9pbnRzLCBhbmQgYnkgc2V0dGluZyB0aGlzIHZhbHVlIHRvIGUuZy4gMTAsIHlvdSBlbnN1cmVlASB0aGF0IHRoZSB0b3RhbCBudW1iZXIgb2YgcG9pbnRzIGluIHRoZSBzeXN0ZW0gYXJlIGF0IG1vc3QgMTAgdGltZXMgdGhlIHRvdGFsX2lzc3VhbmNlIG9mnCB0aGUgY2hhaW4sIGluIHRoZSBhYnNvbHV0ZSB3b3JzZSBjYXNlLgBJASBGb3IgYSB2YWx1ZSBvZiAxMCwgdGhlIHRocmVzaG9sZCB3b3VsZCBiZSBhIHBvb2wgcG9pbnRzLXRvLWJhbGFuY2UgcmF0aW8gb2YgMTA6MS4xASBTdWNoIGEgc2NlbmFyaW8gd291bGQgYWxzbyBiZSB0aGUgZXF1aXZhbGVudCBvZiB0aGUgcG9vbCBiZWluZyA5MCUgc2xhc2hlZC4wTWF4VW5ib25kaW5nEBAgAAAABD0BIFRoZSBtYXhpbXVtIG51bWJlciBvZiBzaW11bHRhbmVvdXMgdW5ib25kaW5nIGNodW5rcyB0aGF0IGNhbiBleGlzdCBwZXIgbWVtYmVyLgEVDCkALEZhc3RVbnN0YWtlASxGYXN0VW5zdGFrZRAQSGVhZAAAHQwEAAzAIFRoZSBjdXJyZW50ICJoZWFkIG9mIHRoZSBxdWV1ZSIgYmVpbmcgdW5zdGFrZWQuACkBIFRoZSBoZWFkIGluIGl0c2VsZiBjYW4gYmUgYSBiYXRjaCBvZiB1cCB0byBbYENvbmZpZzo6QmF0Y2hTaXplYF0gc3Rha2Vycy4UUXVldWUAAQQFABgEAAzAIFRoZSBtYXAgb2YgYWxsIGFjY291bnRzIHdpc2hpbmcgdG8gYmUgdW5zdGFrZWQuADkBIEtlZXBzIHRyYWNrIG9mIGBBY2NvdW50SWRgIHdpc2hpbmcgdG8gdW5zdGFrZSBhbmQgaXQncyBjb3JyZXNwb25kaW5nIGRlcG9zaXQuPENvdW50ZXJGb3JRdWV1ZQEAEBAAAAAABKxDb3VudGVyIGZvciB0aGUgcmVsYXRlZCBjb3VudGVkIHN0b3JhZ2UgbWFwTEVyYXNUb0NoZWNrUGVyQmxvY2sBABAQAAAAACCMIE51bWJlciBvZiBlcmFzIHRvIGNoZWNrIHBlciBibG9jay4ANQEgSWYgc2V0IHRvIDAsIHRoaXMgcGFsbGV0IGRvZXMgYWJzb2x1dGVseSBub3RoaW5nLiBDYW5ub3QgYmUgc2V0IHRvIG1vcmUgdGhhbpAgW2BDb25maWc6Ok1heEVyYXNUb0NoZWNrUGVyQmxvY2tgXS4AZQEgQmFzZWQgb24gdGhlIGFtb3VudCBvZiB3ZWlnaHQgYXZhaWxhYmxlIGF0IFtgUGFsbGV0Ojpvbl9pZGxlYF0sIHVwIHRvIHRoaXMgbWFueSBlcmFzIGFyZV0BIGNoZWNrZWQuIFRoZSBjaGVja2luZyBpcyByZXByZXNlbnRlZCBieSB1cGRhdGluZyBbYFVuc3Rha2VSZXF1ZXN0OjpjaGVja2VkYF0sIHdoaWNoIGlzUCBzdG9yZWQgaW4gW2BIZWFkYF0uAbUEAekHBBxEZXBvc2l0GEA0TdLCBwAAAAAAAAAAAAAACGUBIERlcG9zaXQgdG8gdGFrZSBmb3IgdW5zdGFraW5nLCB0byBtYWtlIHN1cmUgd2UncmUgYWJsZSB0byBzbGFzaCB0aGUgaXQgaW4gb3JkZXIgdG8gY292ZXLAIHRoZSBjb3N0cyBvZiByZXNvdXJjZXMgb24gdW5zdWNjZXNzZnVsIHVuc3Rha2UuASkMKgBAUGFyYWNoYWluc09yaWdpbgAAAAAAMhB5ASBUaGVyZSBpcyBubyB3YXkgdG8gcmVnaXN0ZXIgYW4gb3JpZ2luIHR5cGUgaW4gYGNvbnN0cnVjdF9ydW50aW1lYCB3aXRob3V0IGEgcGFsbGV0IHRoZSBvcmlnaW4wIGJlbG9uZ3MgdG8uAHUBIFRoaXMgbW9kdWxlIGZ1bGZpbGxzIG9ubHkgdGhlIHNpbmdsZSBwdXJwb3NlIG9mIGhvdXNpbmcgdGhlIGBPcmlnaW5gIGluIGBjb25zdHJ1Y3RfcnVudGltZWAuNENvbmZpZ3VyYXRpb24BNENvbmZpZ3VyYXRpb24MMEFjdGl2ZUNvbmZpZwEALQxBAwAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAGQAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAIAAAACAAAAAgAAAAABAAAAAQAAAAEAAAAAAQAAAAAAAAAAAAAAECcAAICy5g6Aw8kBgJaYAAAAAAAAAAAAAAAAAAUAAAAEyCBUaGUgYWN0aXZlIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBjdXJyZW50IHNlc3Npb24uOFBlbmRpbmdDb25maWdzAQAxDAQAHHwgUGVuZGluZyBjb25maWd1cmF0aW9uIGNoYW5nZXMuAFkBIFRoaXMgaXMgYSBsaXN0IG9mIGNvbmZpZ3VyYXRpb24gY2hhbmdlcywgZWFjaCB3aXRoIGEgc2Vzc2lvbiBpbmRleCBhdCB3aGljaCBpdCBzaG91bGQwIGJlIGFwcGxpZWQuAGEBIFRoZSBsaXN0IGlzIHNvcnRlZCBhc2NlbmRpbmcgYnkgc2Vzc2lvbiBpbmRleC4gQWxzbywgdGhpcyBsaXN0IGNhbiBvbmx5IGNvbnRhaW4gYXQgbW9zdPwgMiBpdGVtczogZm9yIHRoZSBuZXh0IHNlc3Npb24gYW5kIGZvciB0aGUgYHNjaGVkdWxlZF9zZXNzaW9uYC5YQnlwYXNzQ29uc2lzdGVuY3lDaGVjawEAIAQACGEBIElmIHRoaXMgaXMgc2V0LCB0aGVuIHRoZSBjb25maWd1cmF0aW9uIHNldHRlcnMgd2lsbCBieXBhc3MgdGhlIGNvbnNpc3RlbmN5IGNoZWNrcy4gVGhpc7QgaXMgbWVhbnQgdG8gYmUgdXNlZCBvbmx5IGFzIHRoZSBsYXN0IHJlc29ydC4BuQQAAAE5DDMALFBhcmFzU2hhcmVkASxQYXJhc1NoYXJlZBBMQ3VycmVudFNlc3Npb25JbmRleAEAEBAAAAAABGwgVGhlIGN1cnJlbnQgc2Vzc2lvbiBpbmRleC5YQWN0aXZlVmFsaWRhdG9ySW5kaWNlcwEAPQwEAAgJASBBbGwgdGhlIHZhbGlkYXRvcnMgYWN0aXZlbHkgcGFydGljaXBhdGluZyBpbiBwYXJhY2hhaW4gY29uc2Vuc3VzLrAgSW5kaWNlcyBhcmUgaW50byB0aGUgYnJvYWRlciB2YWxpZGF0b3Igc2V0LkxBY3RpdmVWYWxpZGF0b3JLZXlzAQBBDAQACFUBIFRoZSBwYXJhY2hhaW4gYXR0ZXN0YXRpb24ga2V5cyBvZiB0aGUgdmFsaWRhdG9ycyBhY3RpdmVseSBwYXJ0aWNpcGF0aW5nIGluIHBhcmFjaGFpbh0BIGNvbnNlbnN1cy4gVGhpcyBzaG91bGQgYmUgdGhlIHNhbWUgbGVuZ3RoIGFzIGBBY3RpdmVWYWxpZGF0b3JJbmRpY2VzYC5MQWxsb3dlZFJlbGF5UGFyZW50cwEARQwUAAAAAAAEbCBBbGwgYWxsb3dlZCByZWxheS1wYXJlbnRzLgHdBAAAADQANFBhcmFJbmNsdXNpb24BNFBhcmFJbmNsdXNpb24ECFYxAAEEBWkCUQwEABRhASBDYW5kaWRhdGVzIHBlbmRpbmcgYXZhaWxhYmlsaXR5IGJ5IGBQYXJhSWRgLiBUaGV5IGZvcm0gYSBjaGFpbiBzdGFydGluZyBmcm9tIHRoZSBsYXRlc3RsIGluY2x1ZGVkIGhlYWQgb2YgdGhlIHBhcmEuYQEgVXNlIGEgZGlmZmVyZW50IHByZWZpeCBwb3N0LW1pZ3JhdGlvbiB0byB2MSwgc2luY2UgdGhlIHYwIGBQZW5kaW5nQXZhaWxhYmlsaXR5YCBzdG9yYWdlcQEgd291bGQgb3RoZXJ3aXNlIGhhdmUgdGhlIGV4YWN0IHNhbWUgcHJlZml4IHdoaWNoIGNvdWxkIGNhdXNlIHVuZGVmaW5lZCBiZWhhdmlvdXIgd2hlbiBkb2luZzwgdGhlIG1pZ3JhdGlvbi4B4QQB7QcAAVkMNQAwUGFyYUluaGVyZW50ATBQYXJhSW5oZXJlbnQIIEluY2x1ZGVkAAChAQQAGOwgV2hldGhlciB0aGUgcGFyYXMgaW5oZXJlbnQgd2FzIGluY2x1ZGVkIHdpdGhpbiB0aGlzIGJsb2NrLgBpASBUaGUgYE9wdGlvbjwoKT5gIGlzIGVmZmVjdGl2ZWx5IGEgYGJvb2xgLCBidXQgaXQgbmV2ZXIgaGl0cyBzdG9yYWdlIGluIHRoZSBgTm9uZWAgdmFyaWFudLwgZHVlIHRvIHRoZSBndWFyYW50ZWVzIG9mIEZSQU1FJ3Mgc3RvcmFnZSBBUElzLgBJASBJZiB0aGlzIGlzIGBOb25lYCBhdCB0aGUgZW5kIG9mIHRoZSBibG9jaywgd2UgcGFuaWMgYW5kIHJlbmRlciB0aGUgYmxvY2sgaW52YWxpZC4wT25DaGFpblZvdGVzAABdDAQABEUBIFNjcmFwZWQgb24gY2hhaW4gZGF0YSBmb3IgZXh0cmFjdGluZyByZXNvbHZlZCBkaXNwdXRlcyBhcyB3ZWxsIGFzIGJhY2tpbmcgdm90ZXMuAeUEAAABcQw2ADRQYXJhU2NoZWR1bGVyATRQYXJhU2NoZWR1bGVyEDxWYWxpZGF0b3JHcm91cHMBAHUMBAAcbQEgQWxsIHRoZSB2YWxpZGF0b3IgZ3JvdXBzLiBPbmUgZm9yIGVhY2ggY29yZS4gSW5kaWNlcyBhcmUgaW50byBgQWN0aXZlVmFsaWRhdG9yc2AgLSBub3QgdGhlbQEgYnJvYWRlciBzZXQgb2YgUG9sa2Fkb3QgdmFsaWRhdG9ycywgYnV0IGluc3RlYWQganVzdCB0aGUgc3Vic2V0IHVzZWQgZm9yIHBhcmFjaGFpbnMgZHVyaW5nOCB0aGlzIHNlc3Npb24uAEkBIEJvdW5kOiBUaGUgbnVtYmVyIG9mIGNvcmVzIGlzIHRoZSBzdW0gb2YgdGhlIG51bWJlcnMgb2YgcGFyYWNoYWlucyBhbmQgcGFyYXRocmVhZGkBIG11bHRpcGxleGVycy4gUmVhc29uYWJseSwgMTAwLTEwMDAuIFRoZSBkb21pbmFudCBmYWN0b3IgaXMgdGhlIG51bWJlciBvZiB2YWxpZGF0b3JzOiBzYWZlUCB1cHBlciBib3VuZCBhdCAxMGsuREF2YWlsYWJpbGl0eUNvcmVzAQB5DAQAGHEBIE9uZSBlbnRyeSBmb3IgZWFjaCBhdmFpbGFiaWxpdHkgY29yZS4gVGhlIGkndGggcGFyYWNoYWluIGJlbG9uZ3MgdG8gdGhlIGkndGggY29yZSwgd2l0aCB0aGXwIHJlbWFpbmluZyBjb3JlcyBhbGwgYmVpbmcgb24gZGVtYW5kIHBhcmFjaGFpbiBtdWx0aXBsZXhlcnMuANggQm91bmRlZCBieSB0aGUgbWF4aW11bSBvZiBlaXRoZXIgb2YgdGhlc2UgdHdvIHZhbHVlczrkICAgKiBUaGUgbnVtYmVyIG9mIHBhcmFjaGFpbnMgYW5kIHBhcmF0aHJlYWQgbXVsdGlwbGV4ZXJzRQEgICAqIFRoZSBudW1iZXIgb2YgdmFsaWRhdG9ycyBkaXZpZGVkIGJ5IGBjb25maWd1cmF0aW9uLm1heF92YWxpZGF0b3JzX3Blcl9jb3JlYC5EU2Vzc2lvblN0YXJ0QmxvY2sBABAQAAAAABxpASBUaGUgYmxvY2sgbnVtYmVyIHdoZXJlIHRoZSBzZXNzaW9uIHN0YXJ0IG9jY3VycmVkLiBVc2VkIHRvIHRyYWNrIGhvdyBtYW55IGdyb3VwIHJvdGF0aW9uczwgaGF2ZSBvY2N1cnJlZC4AVQEgTm90ZSB0aGF0IGluIHRoZSBjb250ZXh0IG9mIHBhcmFjaGFpbnMgbW9kdWxlcyB0aGUgc2Vzc2lvbiBjaGFuZ2UgaXMgc2lnbmFsZWQgZHVyaW5nYQEgdGhlIGJsb2NrIGFuZCBlbmFjdGVkIGF0IHRoZSBlbmQgb2YgdGhlIGJsb2NrIChhdCB0aGUgZmluYWxpemF0aW9uIHN0YWdlLCB0byBiZSBleGFjdCkuWQEgVGh1cyBmb3IgYWxsIGludGVudHMgYW5kIHB1cnBvc2VzIHRoZSBlZmZlY3Qgb2YgdGhlIHNlc3Npb24gY2hhbmdlIGlzIG9ic2VydmVkIGF0IHRoZWUBIGJsb2NrIGZvbGxvd2luZyB0aGUgc2Vzc2lvbiBjaGFuZ2UsIGJsb2NrIG51bWJlciBvZiB3aGljaCB3ZSBzYXZlIGluIHRoaXMgc3RvcmFnZSB2YWx1ZS4oQ2xhaW1RdWV1ZQEAiQwEAAxZASBPbmUgZW50cnkgZm9yIGVhY2ggYXZhaWxhYmlsaXR5IGNvcmUuIFRoZSBgVmVjRGVxdWVgIHJlcHJlc2VudHMgdGhlIGFzc2lnbm1lbnRzIHRvIGJlUQEgc2NoZWR1bGVkIG9uIHRoYXQgY29yZS4gVGhlIHZhbHVlIGNvbnRhaW5lZCBoZXJlIHdpbGwgbm90IGJlIHZhbGlkIGFmdGVyIHRoZSBlbmQgb2ZpASBhIGJsb2NrLiBSdW50aW1lIEFQSXMgc2hvdWxkIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHNjaGVkdWxlZCBjb3JlcyBmb3IgdGhlIHVwY29taW5nIGJsb2NrLgAAAAA3ABRQYXJhcwEUUGFyYXNUQFB2ZkFjdGl2ZVZvdGVNYXAAAQQFIQWZDAQAELQgQWxsIGN1cnJlbnRseSBhY3RpdmUgUFZGIHByZS1jaGVja2luZyB2b3Rlcy4ALCBJbnZhcmlhbnQ6dQEgLSBUaGVyZSBhcmUgbm8gUFZGIHByZS1jaGVja2luZyB2b3RlcyB0aGF0IGV4aXN0cyBpbiBsaXN0IGJ1dCBub3QgaW4gdGhlIHNldCBhbmQgdmljZSB2ZXJzYS5EUHZmQWN0aXZlVm90ZUxpc3QBAKkMBAAENQEgVGhlIGxpc3Qgb2YgYWxsIGN1cnJlbnRseSBhY3RpdmUgUFZGIHZvdGVzLiBBdXhpbGlhcnkgdG8gYFB2ZkFjdGl2ZVZvdGVNYXBgLihQYXJhY2hhaW5zAQCtDAQAEGkBIEFsbCBsZWFzZSBob2xkaW5nIHBhcmFjaGFpbnMuIE9yZGVyZWQgYXNjZW5kaW5nIGJ5IGBQYXJhSWRgLiBPbiBkZW1hbmQgcGFyYWNoYWlucyBhcmUgbm90KCBpbmNsdWRlZC4A6CBDb25zaWRlciB1c2luZyB0aGUgW2BQYXJhY2hhaW5zQ2FjaGVgXSB0eXBlIG9mIG1vZGlmeWluZy44UGFyYUxpZmVjeWNsZXMAAQQFaQKxDAQABLwgVGhlIGN1cnJlbnQgbGlmZWN5Y2xlIG9mIGEgYWxsIGtub3duIFBhcmEgSURzLhRIZWFkcwABBAVpAkEFBAAEoCBUaGUgaGVhZC1kYXRhIG9mIGV2ZXJ5IHJlZ2lzdGVyZWQgcGFyYS5ETW9zdFJlY2VudENvbnRleHQAAQQFaQIQBAAEKQEgVGhlIGNvbnRleHQgKHJlbGF5LWNoYWluIGJsb2NrIG51bWJlcikgb2YgdGhlIG1vc3QgcmVjZW50IHBhcmFjaGFpbiBoZWFkLjxDdXJyZW50Q29kZUhhc2gAAQQFaQIhBQQADLQgVGhlIHZhbGlkYXRpb24gY29kZSBoYXNoIG9mIGV2ZXJ5IGxpdmUgcGFyYS4A5CBDb3JyZXNwb25kaW5nIGNvZGUgY2FuIGJlIHJldHJpZXZlZCB3aXRoIFtgQ29kZUJ5SGFzaGBdLjBQYXN0Q29kZUhhc2gAAQQFtQwhBQQAEGEBIEFjdHVhbCBwYXN0IGNvZGUgaGFzaCwgaW5kaWNhdGVkIGJ5IHRoZSBwYXJhIGlkIGFzIHdlbGwgYXMgdGhlIGJsb2NrIG51bWJlciBhdCB3aGljaCBpdEQgYmVjYW1lIG91dGRhdGVkLgDkIENvcnJlc3BvbmRpbmcgY29kZSBjYW4gYmUgcmV0cmlldmVkIHdpdGggW2BDb2RlQnlIYXNoYF0uMFBhc3RDb2RlTWV0YQEBBAVpArkMCAAADEkBIFBhc3QgY29kZSBvZiBwYXJhY2hhaW5zLiBUaGUgcGFyYWNoYWlucyB0aGVtc2VsdmVzIG1heSBub3QgYmUgcmVnaXN0ZXJlZCBhbnltb3JlLEkBIGJ1dCB3ZSBhbHNvIGtlZXAgdGhlaXIgY29kZSBvbi1jaGFpbiBmb3IgdGhlIHNhbWUgYW1vdW50IG9mIHRpbWUgYXMgb3V0ZGF0ZWQgY29kZbAgdG8ga2VlcCBpdCBhdmFpbGFibGUgZm9yIGFwcHJvdmFsIGNoZWNrZXJzLjxQYXN0Q29kZVBydW5pbmcBAMUMBAAYaQEgV2hpY2ggcGFyYXMgaGF2ZSBwYXN0IGNvZGUgdGhhdCBuZWVkcyBwcnVuaW5nIGFuZCB0aGUgcmVsYXktY2hhaW4gYmxvY2sgYXQgd2hpY2ggdGhlIGNvZGVpASB3YXMgcmVwbGFjZWQuIE5vdGUgdGhhdCB0aGlzIGlzIHRoZSBhY3R1YWwgaGVpZ2h0IG9mIHRoZSBpbmNsdWRlZCBibG9jaywgbm90IHRoZSBleHBlY3RlZD0BIGhlaWdodCBhdCB3aGljaCB0aGUgY29kZSB1cGdyYWRlIHdvdWxkIGJlIGFwcGxpZWQsIGFsdGhvdWdoIHRoZXkgbWF5IGJlIGVxdWFsLm0BIFRoaXMgaXMgdG8gZW5zdXJlIHRoZSBlbnRpcmUgYWNjZXB0YW5jZSBwZXJpb2QgaXMgY292ZXJlZCwgbm90IGFuIG9mZnNldCBhY2NlcHRhbmNlIHBlcmlvZG0BIHN0YXJ0aW5nIGZyb20gdGhlIHRpbWUgYXQgd2hpY2ggdGhlIHBhcmFjaGFpbiBwZXJjZWl2ZXMgYSBjb2RlIHVwZ3JhZGUgYXMgaGF2aW5nIG9jY3VycmVkLlUBIE11bHRpcGxlIGVudHJpZXMgZm9yIGEgc2luZ2xlIHBhcmEgYXJlIHBlcm1pdHRlZC4gT3JkZXJlZCBhc2NlbmRpbmcgYnkgYmxvY2sgbnVtYmVyLkhGdXR1cmVDb2RlVXBncmFkZXMAAQQFaQIQBAAQPQEgVGhlIGJsb2NrIG51bWJlciBhdCB3aGljaCB0aGUgcGxhbm5lZCBjb2RlIGNoYW5nZSBpcyBleHBlY3RlZCBmb3IgYSBwYXJhY2hhaW4uAGUBIFRoZSBjaGFuZ2Ugd2lsbCBiZSBhcHBsaWVkIGFmdGVyIHRoZSBmaXJzdCBwYXJhYmxvY2sgZm9yIHRoaXMgSUQgaW5jbHVkZWQgd2hpY2ggZXhlY3V0ZXMZASBpbiB0aGUgY29udGV4dCBvZiBhIHJlbGF5IGNoYWluIGJsb2NrIHdpdGggYSBudW1iZXIgPj0gYGV4cGVjdGVkX2F0YC5QRnV0dXJlQ29kZVVwZ3JhZGVzQXQBAMUMBAAgrCBUaGUgbGlzdCBvZiB1cGNvbWluZyBmdXR1cmUgY29kZSB1cGdyYWRlcy4AbQEgRWFjaCBpdGVtIGlzIGEgcGFpciBvZiB0aGUgcGFyYWNoYWluIGFuZCB0aGUgZXhwZWN0ZWQgYmxvY2sgYXQgd2hpY2ggdGhlIHVwZ3JhZGUgc2hvdWxkIGJlUQEgYXBwbGllZC4gVGhlIHVwZ3JhZGUgd2lsbCBiZSBhcHBsaWVkIGF0IHRoZSBnaXZlbiByZWxheSBjaGFpbiBibG9jay4gSW4gY29udHJhc3QgdG91ASBbYEZ1dHVyZUNvZGVVcGdyYWRlc2BdIHRoaXMgY29kZSB1cGdyYWRlIHdpbGwgYmUgYXBwbGllZCByZWdhcmRsZXNzIHRoZSBwYXJhY2hhaW4gbWFraW5nIGFueUQgcHJvZ3Jlc3Mgb3Igbm90LgCMIE9yZGVyZWQgYXNjZW5kaW5nIGJ5IGJsb2NrIG51bWJlci44RnV0dXJlQ29kZUhhc2gAAQQFaQIhBQQADJwgVGhlIGFjdHVhbCBmdXR1cmUgY29kZSBoYXNoIG9mIGEgcGFyYS4A5CBDb3JyZXNwb25kaW5nIGNvZGUgY2FuIGJlIHJldHJpZXZlZCB3aXRoIFtgQ29kZUJ5SGFzaGBdLlBVcGdyYWRlR29BaGVhZFNpZ25hbAABBAVpAskMBAAodQEgVGhpcyBpcyB1c2VkIGJ5IHRoZSByZWxheS1jaGFpbiB0byBjb21tdW5pY2F0ZSB0byBhIHBhcmFjaGFpbiBhIGdvLWFoZWFkIHdpdGggaW4gdGhlIHVwZ3JhZGUsIHByb2NlZHVyZS4AdQEgVGhpcyB2YWx1ZSBpcyBhYnNlbnQgd2hlbiB0aGVyZSBhcmUgbm8gdXBncmFkZXMgc2NoZWR1bGVkIG9yIGR1cmluZyB0aGUgdGltZSB0aGUgcmVsYXkgY2hhaW5VASBwZXJmb3JtcyB0aGUgY2hlY2tzLiBJdCBpcyBzZXQgYXQgdGhlIGZpcnN0IHJlbGF5LWNoYWluIGJsb2NrIHdoZW4gdGhlIGNvcnJlc3BvbmRpbmd1ASBwYXJhY2hhaW4gY2FuIHN3aXRjaCBpdHMgdXBncmFkZSBmdW5jdGlvbi4gQXMgc29vbiBhcyB0aGUgcGFyYWNoYWluJ3MgYmxvY2sgaXMgaW5jbHVkZWQsIHRoZXAgdmFsdWUgZ2V0cyByZXNldCB0byBgTm9uZWAuAGUBIE5PVEUgdGhhdCB0aGlzIGZpZWxkIGlzIHVzZWQgYnkgcGFyYWNoYWlucyB2aWEgbWVya2xlIHN0b3JhZ2UgcHJvb2ZzLCB0aGVyZWZvcmUgY2hhbmdpbmfEIHRoZSBmb3JtYXQgd2lsbCByZXF1aXJlIG1pZ3JhdGlvbiBvZiBwYXJhY2hhaW5zLmBVcGdyYWRlUmVzdHJpY3Rpb25TaWduYWwAAQQFaQLNDAQAJGkBIFRoaXMgaXMgdXNlZCBieSB0aGUgcmVsYXktY2hhaW4gdG8gY29tbXVuaWNhdGUgdGhhdCB0aGVyZSBhcmUgcmVzdHJpY3Rpb25zIGZvciBwZXJmb3JtaW5nfCBhbiB1cGdyYWRlIGZvciB0aGlzIHBhcmFjaGFpbi4AWQEgVGhpcyBtYXkgYmUgYSBiZWNhdXNlIHRoZSBwYXJhY2hhaW4gd2FpdHMgZm9yIHRoZSB1cGdyYWRlIGNvb2xkb3duIHRvIGV4cGlyZS4gQW5vdGhlcm0BIHBvdGVudGlhbCB1c2UgY2FzZSBpcyB3aGVuIHdlIHdhbnQgdG8gcGVyZm9ybSBzb21lIG1haW50ZW5hbmNlIChzdWNoIGFzIHN0b3JhZ2UgbWlncmF0aW9uKeAgd2UgY291bGQgcmVzdHJpY3QgdXBncmFkZXMgdG8gbWFrZSB0aGUgcHJvY2VzcyBzaW1wbGVyLgBlASBOT1RFIHRoYXQgdGhpcyBmaWVsZCBpcyB1c2VkIGJ5IHBhcmFjaGFpbnMgdmlhIG1lcmtsZSBzdG9yYWdlIHByb29mcywgdGhlcmVmb3JlIGNoYW5naW5nxCB0aGUgZm9ybWF0IHdpbGwgcmVxdWlyZSBtaWdyYXRpb24gb2YgcGFyYWNoYWlucy5AVXBncmFkZUNvb2xkb3ducwEAxQwEAAxRASBUaGUgbGlzdCBvZiBwYXJhY2hhaW5zIHRoYXQgYXJlIGF3YWl0aW5nIGZvciB0aGVpciB1cGdyYWRlIHJlc3RyaWN0aW9uIHRvIGNvb2xkb3duLgCMIE9yZGVyZWQgYXNjZW5kaW5nIGJ5IGJsb2NrIG51bWJlci5AVXBjb21pbmdVcGdyYWRlcwEAxQwEABiQIFRoZSBsaXN0IG9mIHVwY29taW5nIGNvZGUgdXBncmFkZXMuAHEBIEVhY2ggaXRlbSBpcyBhIHBhaXIgb2Ygd2hpY2ggcGFyYSBwZXJmb3JtcyBhIGNvZGUgdXBncmFkZSBhbmQgYXQgd2hpY2ggcmVsYXktY2hhaW4gYmxvY2sgaXRAIGlzIGV4cGVjdGVkIGF0LgCMIE9yZGVyZWQgYXNjZW5kaW5nIGJ5IGJsb2NrIG51bWJlci4wQWN0aW9uc1F1ZXVlAQEEBRCtDAQABBUBIFRoZSBhY3Rpb25zIHRvIHBlcmZvcm0gZHVyaW5nIHRoZSBzdGFydCBvZiBhIHNwZWNpZmljIHNlc3Npb24gaW5kZXguUFVwY29taW5nUGFyYXNHZW5lc2lzAAEEBWkC0QwEABCgIFVwY29taW5nIHBhcmFzIGluc3RhbnRpYXRpb24gYXJndW1lbnRzLgBlASBOT1RFIHRoYXQgYWZ0ZXIgUFZGIHByZS1jaGVja2luZyBpcyBlbmFibGVkIHRoZSBwYXJhIGdlbmVzaXMgYXJnIHdpbGwgaGF2ZSBpdCdzIGNvZGUgc2V0YQEgdG8gZW1wdHkuIEluc3RlYWQsIHRoZSBjb2RlIHdpbGwgYmUgc2F2ZWQgaW50byB0aGUgc3RvcmFnZSByaWdodCBhd2F5IHZpYSBgQ29kZUJ5SGFzaGAuOENvZGVCeUhhc2hSZWZzAQEEBiEFEBAAAAAABCkBIFRoZSBudW1iZXIgb2YgcmVmZXJlbmNlIG9uIHRoZSB2YWxpZGF0aW9uIGNvZGUgaW4gW2BDb2RlQnlIYXNoYF0gc3RvcmFnZS4oQ29kZUJ5SGFzaAABBAYhBT0FBAAQkCBWYWxpZGF0aW9uIGNvZGUgc3RvcmVkIGJ5IGl0cyBoYXNoLgAxASBUaGlzIHN0b3JhZ2UgaXMgY29uc2lzdGVudCB3aXRoIFtgRnV0dXJlQ29kZUhhc2hgXSwgW2BDdXJyZW50Q29kZUhhc2hgXSBhbmRIIFtgUGFzdENvZGVIYXNoYF0uAXEFAf0HBEBVbnNpZ25lZFByaW9yaXR5MCD//////////wAB1Qw4ACxJbml0aWFsaXplcgEsSW5pdGlhbGl6ZXIIOEhhc0luaXRpYWxpemVkAAChAQQAICEBIFdoZXRoZXIgdGhlIHBhcmFjaGFpbnMgbW9kdWxlcyBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQgd2l0aGluIHRoaXMgYmxvY2suACUBIFNlbWFudGljYWxseSBhIGBib29sYCwgYnV0IHRoaXMgZ3VhcmFudGVlcyBpdCBzaG91bGQgbmV2ZXIgaGl0IHRoZSB0cmllLGkBIGFzIHRoaXMgaXMgY2xlYXJlZCBpbiBgb25fZmluYWxpemVgIGFuZCBGcmFtZSBvcHRpbWl6ZXMgYE5vbmVgIHZhbHVlcyB0byBiZSBlbXB0eSB2YWx1ZXMuAHEBIEFzIGEgYGJvb2xgLCBgc2V0KGZhbHNlKWAgYW5kIGByZW1vdmUoKWAgYm90aCBsZWFkIHRvIHRoZSBuZXh0IGBnZXQoKWAgYmVpbmcgZmFsc2UsIGJ1dCBvbmV1ASBvZiB0aGVtIHdyaXRlcyB0byB0aGUgdHJpZSBhbmQgb25lIGRvZXMgbm90LiBUaGlzIGNvbmZ1c2lvbiBtYWtlcyBgT3B0aW9uPCgpPmAgbW9yZSBzdWl0YWJsZZAgZm9yIHRoZSBzZW1hbnRpY3Mgb2YgdGhpcyB2YXJpYWJsZS5YQnVmZmVyZWRTZXNzaW9uQ2hhbmdlcwEA2QwEABxZASBCdWZmZXJlZCBzZXNzaW9uIGNoYW5nZXMgYWxvbmcgd2l0aCB0aGUgYmxvY2sgbnVtYmVyIGF0IHdoaWNoIHRoZXkgc2hvdWxkIGJlIGFwcGxpZWQuAF0BIFR5cGljYWxseSB0aGlzIHdpbGwgYmUgZW1wdHkgb3Igb25lIGVsZW1lbnQgbG9uZy4gQXBhcnQgZnJvbSB0aGF0IHRoaXMgaXRlbSBuZXZlciBoaXRzNCB0aGUgc3RvcmFnZS4AaQEgSG93ZXZlciB0aGlzIGlzIGEgYFZlY2AgcmVnYXJkbGVzcyB0byBoYW5kbGUgdmFyaW91cyBlZGdlIGNhc2VzIHRoYXQgbWF5IG9jY3VyIGF0IHJ1bnRpbWXAIHVwZ3JhZGUgYm91bmRhcmllcyBvciBpZiBnb3Zlcm5hbmNlIGludGVydmVuZXMuAXkFAAAAOQAMRG1wAQxEbXAMVERvd253YXJkTWVzc2FnZVF1ZXVlcwEBBAVpAuEMBAAE0CBUaGUgZG93bndhcmQgbWVzc2FnZXMgYWRkcmVzc2VkIGZvciBhIGNlcnRhaW4gcGFyYS5kRG93bndhcmRNZXNzYWdlUXVldWVIZWFkcwEBBAVpAjSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcJQEgQSBtYXBwaW5nIHRoYXQgc3RvcmVzIHRoZSBkb3dud2FyZCBtZXNzYWdlIHF1ZXVlIE1RQyBoZWFkIGZvciBlYWNoIHBhcmEuAJAgRWFjaCBsaW5rIGluIHRoaXMgY2hhaW4gaGFzIGEgZm9ybTp4IGAocHJldl9oZWFkLCBCLCBIKE0pKWAsIHdoZXJl6CAtIGBwcmV2X2hlYWRgOiBpcyB0aGUgcHJldmlvdXMgaGVhZCBoYXNoIG9yIHplcm8gaWYgbm9uZS4hASAtIGBCYDogaXMgdGhlIHJlbGF5LWNoYWluIGJsb2NrIG51bWJlciBpbiB3aGljaCBhIG1lc3NhZ2Ugd2FzIGFwcGVuZGVkLtQgLSBgSChNKWA6IGlzIHRoZSBoYXNoIG9mIHRoZSBtZXNzYWdlIGJlaW5nIGFwcGVuZGVkLkREZWxpdmVyeUZlZUZhY3RvcgEBBAVpAiEHQAAAZKeztuANAAAAAAAAAAAExCBUaGUgZmFjdG9yIHRvIG11bHRpcGx5IHRoZSBiYXNlIGRlbGl2ZXJ5IGZlZSBieS4AAAAAOgAQSHJtcAEQSHJtcDBcSHJtcE9wZW5DaGFubmVsUmVxdWVzdHMAAQQFgQXpDAQAGLwgVGhlIHNldCBvZiBwZW5kaW5nIEhSTVAgb3BlbiBjaGFubmVsIHJlcXVlc3RzLgDAIFRoZSBzZXQgaXMgYWNjb21wYW5pZWQgYnkgYSBsaXN0IGZvciBpdGVyYXRpb24uACwgSW52YXJpYW50Oj0BIC0gVGhlcmUgYXJlIG5vIGNoYW5uZWxzIHRoYXQgZXhpc3RzIGluIGxpc3QgYnV0IG5vdCBpbiB0aGUgc2V0IGFuZCB2aWNlIHZlcnNhLmxIcm1wT3BlbkNoYW5uZWxSZXF1ZXN0c0xpc3QBAO0MBAAAbEhybXBPcGVuQ2hhbm5lbFJlcXVlc3RDb3VudAEBBAVpAhAQAAAAAAxlASBUaGlzIG1hcHBpbmcgdHJhY2tzIGhvdyBtYW55IG9wZW4gY2hhbm5lbCByZXF1ZXN0cyBhcmUgaW5pdGlhdGVkIGJ5IGEgZ2l2ZW4gc2VuZGVyIHBhcmEuWQEgSW52YXJpYW50OiBgSHJtcE9wZW5DaGFubmVsUmVxdWVzdHNgIHNob3VsZCBjb250YWluIHRoZSBzYW1lIG51bWJlciBvZiBpdGVtcyB0aGF0IGhhcwUBIGAoWCwgXylgIGFzIHRoZSBudW1iZXIgb2YgYEhybXBPcGVuQ2hhbm5lbFJlcXVlc3RDb3VudGAgZm9yIGBYYC58SHJtcEFjY2VwdGVkQ2hhbm5lbFJlcXVlc3RDb3VudAEBBAVpAhAQAAAAAAxxASBUaGlzIG1hcHBpbmcgdHJhY2tzIGhvdyBtYW55IG9wZW4gY2hhbm5lbCByZXF1ZXN0cyB3ZXJlIGFjY2VwdGVkIGJ5IGEgZ2l2ZW4gcmVjaXBpZW50IHBhcmEubQEgSW52YXJpYW50OiBgSHJtcE9wZW5DaGFubmVsUmVxdWVzdHNgIHNob3VsZCBjb250YWluIHRoZSBzYW1lIG51bWJlciBvZiBpdGVtcyBgKF8sIFgpYCB3aXRoVQEgYGNvbmZpcm1lZGAgc2V0IHRvIHRydWUsIGFzIHRoZSBudW1iZXIgb2YgYEhybXBBY2NlcHRlZENoYW5uZWxSZXF1ZXN0Q291bnRgIGZvciBgWGAuYEhybXBDbG9zZUNoYW5uZWxSZXF1ZXN0cwABBAWBBaEBBAAccQEgQSBzZXQgb2YgcGVuZGluZyBIUk1QIGNsb3NlIGNoYW5uZWwgcmVxdWVzdHMgdGhhdCBhcmUgZ29pbmcgdG8gYmUgY2xvc2VkIGR1cmluZyB0aGUgc2Vzc2lvbiEBIGNoYW5nZS4gVXNlZCBmb3IgY2hlY2tpbmcgaWYgYSBnaXZlbiBjaGFubmVsIGlzIHJlZ2lzdGVyZWQgZm9yIGNsb3N1cmUuAMAgVGhlIHNldCBpcyBhY2NvbXBhbmllZCBieSBhIGxpc3QgZm9yIGl0ZXJhdGlvbi4ALCBJbnZhcmlhbnQ6PQEgLSBUaGVyZSBhcmUgbm8gY2hhbm5lbHMgdGhhdCBleGlzdHMgaW4gbGlzdCBidXQgbm90IGluIHRoZSBzZXQgYW5kIHZpY2UgdmVyc2EucEhybXBDbG9zZUNoYW5uZWxSZXF1ZXN0c0xpc3QBAO0MBAAAOEhybXBXYXRlcm1hcmtzAAEEBWkCEAQAELggVGhlIEhSTVAgd2F0ZXJtYXJrIGFzc29jaWF0ZWQgd2l0aCBlYWNoIHBhcmEuLCBJbnZhcmlhbnQ6VQEgLSBlYWNoIHBhcmEgYFBgIHVzZWQgaGVyZSBhcyBhIGtleSBzaG91bGQgc2F0aXNmeSBgUGFyYXM6OmlzX3ZhbGlkX3BhcmEoUClgIHdpdGhpbiBhLCAgIHNlc3Npb24uMEhybXBDaGFubmVscwABBAWBBfEMBAAMtCBIUk1QIGNoYW5uZWwgZGF0YSBhc3NvY2lhdGVkIHdpdGggZWFjaCBwYXJhLiwgSW52YXJpYW50OnUBIC0gZWFjaCBwYXJ0aWNpcGFudCBpbiB0aGUgY2hhbm5lbCBzaG91bGQgc2F0aXNmeSBgUGFyYXM6OmlzX3ZhbGlkX3BhcmEoUClgIHdpdGhpbiBhIHNlc3Npb24uYEhybXBJbmdyZXNzQ2hhbm5lbHNJbmRleAEBBAVpAq0MBAA0cQEgSW5ncmVzcy9lZ3Jlc3MgaW5kZXhlcyBhbGxvdyB0byBmaW5kIGFsbCB0aGUgc2VuZGVycyBhbmQgcmVjZWl2ZXJzIGdpdmVuIHRoZSBvcHBvc2l0ZSBzaWRlLhQgSS5lLgAhASAoYSkgaW5ncmVzcyBpbmRleCBhbGxvd3MgdG8gZmluZCBhbGwgdGhlIHNlbmRlcnMgZm9yIGEgZ2l2ZW4gcmVjaXBpZW50Lh0BIChiKSBlZ3Jlc3MgaW5kZXggYWxsb3dzIHRvIGZpbmQgYWxsIHRoZSByZWNpcGllbnRzIGZvciBhIGdpdmVuIHNlbmRlci4AMCBJbnZhcmlhbnRzOlEBIC0gZm9yIGVhY2ggaW5ncmVzcyBpbmRleCBlbnRyeSBmb3IgYFBgIGVhY2ggaXRlbSBgSWAgaW4gdGhlIGluZGV4IHNob3VsZCBwcmVzZW50IGlueCAgIGBIcm1wQ2hhbm5lbHNgIGFzIGAoSSwgUClgLk0BIC0gZm9yIGVhY2ggZWdyZXNzIGluZGV4IGVudHJ5IGZvciBgUGAgZWFjaCBpdGVtIGBFYCBpbiB0aGUgaW5kZXggc2hvdWxkIHByZXNlbnQgaW54ICAgYEhybXBDaGFubmVsc2AgYXMgYChQLCBFKWAuAQEgLSB0aGVyZSBzaG91bGQgYmUgbm8gb3RoZXIgZGFuZ2xpbmcgY2hhbm5lbHMgaW4gYEhybXBDaGFubmVsc2AuaCAtIHRoZSB2ZWN0b3JzIGFyZSBzb3J0ZWQuXEhybXBFZ3Jlc3NDaGFubmVsc0luZGV4AQEEBWkCrQwEAABMSHJtcENoYW5uZWxDb250ZW50cwEBBAWBBfUMBAAIrCBTdG9yYWdlIGZvciB0aGUgbWVzc2FnZXMgZm9yIGVhY2ggY2hhbm5lbC5lASBJbnZhcmlhbnQ6IGNhbm5vdCBiZSBub24tZW1wdHkgaWYgdGhlIGNvcnJlc3BvbmRpbmcgY2hhbm5lbCBpbiBgSHJtcENoYW5uZWxzYCBpcyBgTm9uZWAuSEhybXBDaGFubmVsRGlnZXN0cwEBBAVpAv0MBAAYaQEgTWFpbnRhaW5zIGEgbWFwcGluZyB0aGF0IGNhbiBiZSB1c2VkIHRvIGFuc3dlciB0aGUgcXVlc3Rpb246IFdoYXQgcGFyYXMgc2VudCBhIG1lc3NhZ2UgYXTkIHRoZSBnaXZlbiBibG9jayBudW1iZXIgZm9yIGEgZ2l2ZW4gcmVjZWl2ZXIuIEludmFyaWFudHM6qCAtIFRoZSBpbm5lciBgVmVjPFBhcmFJZD5gIGlzIG5ldmVyIGVtcHR5LuggLSBUaGUgaW5uZXIgYFZlYzxQYXJhSWQ+YCBjYW5ub3Qgc3RvcmUgdHdvIHNhbWUgYFBhcmFJZGAubQEgLSBUaGUgb3V0ZXIgdmVjdG9yIGlzIHNvcnRlZCBhc2NlbmRpbmcgYnkgYmxvY2sgbnVtYmVyIGFuZCBjYW5ub3Qgc3RvcmUgdHdvIGl0ZW1zIHdpdGggdGhlVCAgIHNhbWUgYmxvY2sgbnVtYmVyLgF9BQEBCAABBQ08ADxQYXJhU2Vzc2lvbkluZm8BPFBhcmFTZXNzaW9uSW5mbxRQQXNzaWdubWVudEtleXNVbnNhZmUBAAkNBAAMpCBBc3NpZ25tZW50IGtleXMgZm9yIHRoZSBjdXJyZW50IHNlc3Npb24ubQEgTm90ZSB0aGF0IHRoaXMgQVBJIGlzIHByaXZhdGUgZHVlIHRvIGl0IGJlaW5nIHByb25lIHRvICdvZmYtYnktb25lJyBhdCBzZXNzaW9uIGJvdW5kYXJpZXMurCBXaGVuIGluIGRvdWJ0LCB1c2UgYFNlc3Npb25zYCBBUEkgaW5zdGVhZC5URWFybGllc3RTdG9yZWRTZXNzaW9uAQAQEAAAAAAEAQEgVGhlIGVhcmxpZXN0IHNlc3Npb24gZm9yIHdoaWNoIHByZXZpb3VzIHNlc3Npb24gaW5mbyBpcyBzdG9yZWQuIFNlc3Npb25zAAEEBhANDQQADKQgU2Vzc2lvbiBpbmZvcm1hdGlvbiBpbiBhIHJvbGxpbmcgd2luZG93LjUBIFNob3VsZCBoYXZlIGFuIGVudHJ5IGluIHJhbmdlIGBFYXJsaWVzdFN0b3JlZFNlc3Npb24uLj1DdXJyZW50U2Vzc2lvbkluZGV4YC51ASBEb2VzIG5vdCBoYXZlIGFueSBlbnRyaWVzIGJlZm9yZSB0aGUgc2Vzc2lvbiBpbmRleCBpbiB0aGUgZmlyc3Qgc2Vzc2lvbiBjaGFuZ2Ugbm90aWZpY2F0aW9uLixBY2NvdW50S2V5cwABBAYQrQEEAARxASBUaGUgdmFsaWRhdG9yIGFjY291bnQga2V5cyBvZiB0aGUgdmFsaWRhdG9ycyBhY3RpdmVseSBwYXJ0aWNpcGF0aW5nIGluIHBhcmFjaGFpbiBjb25zZW5zdXMuVFNlc3Npb25FeGVjdXRvclBhcmFtcwABBAYQwQQEAATEIEV4ZWN1dG9yIHBhcmFtZXRlciBzZXQgZm9yIGEgZ2l2ZW4gc2Vzc2lvbiBpbmRleAAAAAA9ADRQYXJhc0Rpc3B1dGVzATRQYXJhc0Rpc3B1dGVzFERMYXN0UHJ1bmVkU2Vzc2lvbgAAEAQACAEBIFRoZSBsYXN0IHBydW5lZCBzZXNzaW9uLCBpZiBhbnkuIEFsbCBkYXRhIHN0b3JlZCBieSB0aGlzIG1vZHVsZVQgcmVmZXJlbmNlcyBzZXNzaW9ucy4gRGlzcHV0ZXMAAQgFAhkNHQ0EAAQFASBBbGwgb25nb2luZyBvciBjb25jbHVkZWQgZGlzcHV0ZXMgZm9yIHRoZSBsYXN0IHNldmVyYWwgc2Vzc2lvbnMuREJhY2tlcnNPbkRpc3B1dGVzAAEIBQIZDSENBAAInCBCYWNraW5nIHZvdGVzIHN0b3JlZCBmb3IgZWFjaCBkaXNwdXRlLowgVGhpcyBzdG9yYWdlIGlzIHVzZWQgZm9yIHNsYXNoaW5nLiBJbmNsdWRlZAABCAUCGQ0QBAAIRQEgQWxsIGluY2x1ZGVkIGJsb2NrcyBvbiB0aGUgY2hhaW4sIGFzIHdlbGwgYXMgdGhlIGJsb2NrIG51bWJlciBpbiB0aGlzIGNoYWluIHRoYXRZASBzaG91bGQgYmUgcmV2ZXJ0ZWQgYmFjayB0byBpZiB0aGUgY2FuZGlkYXRlIGlzIGRpc3B1dGVkIGFuZCBkZXRlcm1pbmVkIHRvIGJlIGludmFsaWQuGEZyb3plbgEAPQIEABARASBXaGV0aGVyIHRoZSBjaGFpbiBpcyBmcm96ZW4uIFN0YXJ0cyBhcyBgTm9uZWAuIFdoZW4gdGhpcyBpcyBgU29tZWAsNQEgdGhlIGNoYWluIHdpbGwgbm90IGFjY2VwdCBhbnkgbmV3IHBhcmFjaGFpbiBibG9ja3MgZm9yIGJhY2tpbmcgb3IgaW5jbHVzaW9uLAkBIGFuZCBpdHMgdmFsdWUgaW5kaWNhdGVzIHRoZSBsYXN0IHZhbGlkIGJsb2NrIG51bWJlciBpbiB0aGUgY2hhaW4u+CBJdCBjYW4gb25seSBiZSBzZXQgYmFjayB0byBgTm9uZWAgYnkgZ292ZXJuYW5jZSBpbnRlcnZlbnRpb24uAYUFAQUIAAElDT4ANFBhcmFzU2xhc2hpbmcBNFBhcmFzU2xhc2hpbmcIQFVuYXBwbGllZFNsYXNoZXMAAQgFAhkNKQ0EAASQIFZhbGlkYXRvcnMgcGVuZGluZyBkaXNwdXRlIHNsYXNoZXMuSFZhbGlkYXRvclNldENvdW50cwABBAUQEAQABIQgYFZhbGlkYXRvclNldENvdW50YCBwZXIgc2Vzc2lvbi4BiQUAAAE5DT8AaE9uRGVtYW5kQXNzaWdubWVudFByb3ZpZGVyAWhPbkRlbWFuZEFzc2lnbm1lbnRQcm92aWRlchQ4UGFyYUlkQWZmaW5pdHkAAQQFaQI9DQQADHEBIE1hcHMgYSBgUGFyYUlkYCB0byBgQ29yZUluZGV4YCBhbmQga2VlcHMgdHJhY2sgb2YgaG93IG1hbnkgYXNzaWdubWVudHMgdGhlIHNjaGVkdWxlciBoYXMgaW5dASBpdCdzIGxvb2thaGVhZC4gS2VlcGluZyB0cmFjayBvZiB0aGlzIGFmZmluaXR5IHByZXZlbnRzIHBhcmFsbGVsIGV4ZWN1dGlvbiBvZiB0aGUgc2FtZZwgYFBhcmFJZGAgb24gdHdvIG9yIG1vcmUgYENvcmVJbmRleGBlcy4sUXVldWVTdGF0dXMBAEENZAAAZKeztuANAAAAAAAAAAAAAAAAAAAAAAAE3CBPdmVyYWxsIHN0YXR1cyBvZiBxdWV1ZSAoYm90aCBmcmVlICsgYWZmaW5pdHkgZW50cmllcyksRnJlZUVudHJpZXMBAFUNBAAEYQEgUHJpb3JpdHkgcXVldWUgZm9yIGFsbCBvcmRlcnMgd2hpY2ggZG9uJ3QgeWV0IChvciBub3QgYW55IG1vcmUpIGhhdmUgYW55IGNvcmUgYWZmaW5pdHkuPEFmZmluaXR5RW50cmllcwEBBAX1B1UNBAAESQEgUXVldWUgZW50cmllcyB0aGF0IGFyZSBjdXJyZW50bHkgYm91bmQgdG8gYSBwYXJ0aWN1bGFyIGNvcmUgZHVlIHRvIGNvcmUgYWZmaW5pdHkuHFJldmVudWUBAGENBAAE/CBLZWVwcyB0cmFjayBvZiBhY2N1bXVsYXRlZCByZXZlbnVlIGZyb20gb24gZGVtYW5kIG9yZGVyIHNhbGVzLgGZBQERCAxMVHJhZmZpY0RlZmF1bHRWYWx1ZSEHQAAAZKeztuANAAAAAAAAAAAEzCBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIHNwb3QgdHJhZmZpYyBtdWx0aXBsaWVyLlBNYXhIaXN0b3JpY2FsUmV2ZW51ZRAQoAAAAAjUIFRoZSBtYXhpbXVtIG51bWJlciBvZiBibG9ja3Mgc29tZSBoaXN0b3JpY2FsIHJldmVudWVgIGluZm9ybWF0aW9uIHN0b3JlZCBmb3IuIFBhbGxldElkwQkgcHkvb25kbWQEtCBJZGVudGlmaWVyIGZvciB0aGUgaW50ZXJuYWwgcmV2ZW51ZSBiYWxhbmNlLgFpDUAAaENvcmV0aW1lQXNzaWdubWVudFByb3ZpZGVyAWhDb3JldGltZUFzc2lnbm1lbnRQcm92aWRlcgg0Q29yZVNjaGVkdWxlcwABBARtDXENBAAQbCBTY2hlZHVsZWQgYXNzaWdubWVudCBzZXRzLgBtASBBc3NpZ25tZW50cyBhcyBvZiB0aGUgZ2l2ZW4gYmxvY2sgbnVtYmVyLiBUaGV5IHdpbGwgZ28gaW50byBzdGF0ZSBvbmNlIHRoZSBibG9jayBudW1iZXIgaXPQIHJlYWNoZWQgKGFuZCByZXBsYWNlIHdoYXRldmVyIHdhcyBpbiB0aGVyZSBiZWZvcmUpLjxDb3JlRGVzY3JpcHRvcnMBAQQE9Qd1DQgAABCgIEFzc2lnbm1lbnRzIHdoaWNoIGFyZSBjdXJyZW50bHkgYWN0aXZlLgBpASBUaGV5IHdpbGwgYmUgcGlja2VkIGZyb20gYFBlbmRpbmdBc3NpZ25tZW50c2Agb25jZSB3ZSByZWFjaCB0aGUgc2NoZWR1bGVkIGJsb2NrIG51bWJlciBpblggYFBlbmRpbmdBc3NpZ25tZW50c2AuAAAAAZUNQQAkUmVnaXN0cmFyASRSZWdpc3RyYXIMLFBlbmRpbmdTd2FwAAEEBWkCaQIEAARkIFBlbmRpbmcgc3dhcCBvcGVyYXRpb25zLhRQYXJhcwABBAVpApkNBAAQBQEgQW1vdW50IGhlbGQgb24gZGVwb3NpdCBmb3IgZWFjaCBwYXJhIGFuZCB0aGUgb3JpZ2luYWwgZGVwb3NpdG9yLgBxASBUaGUgZ2l2ZW4gYWNjb3VudCBJRCBpcyByZXNwb25zaWJsZSBmb3IgcmVnaXN0ZXJpbmcgdGhlIGNvZGUgYW5kIGluaXRpYWwgaGVhZCBkYXRhLCBidXQgbWF5VQEgb25seSBkbyBzbyBpZiBpdCBpc24ndCB5ZXQgcmVnaXN0ZXJlZC4gKEFmdGVyIHRoYXQsIGl0J3MgdXAgdG8gZ292ZXJuYW5jZSB0byBkbyBzby4pOE5leHRGcmVlUGFyYUlkAQBpAhAAAAAABGAgVGhlIG5leHQgZnJlZSBgUGFyYUlkYC4BnQUBFQgILFBhcmFEZXBvc2l0GEAAgMo5YSQAAAAAAAAAAAAACNQgVGhlIGRlcG9zaXQgdG8gYmUgcGFpZCB0byBydW4gYSBvbi1kZW1hbmQgcGFyYWNoYWluLj0BIFRoaXMgc2hvdWxkIGluY2x1ZGUgdGhlIGNvc3QgZm9yIHN0b3JpbmcgdGhlIGdlbmVzaXMgaGVhZCBhbmQgdmFsaWRhdGlvbiBjb2RlLkhEYXRhRGVwb3NpdFBlckJ5dGUYQFVD3hMAAAAAAAAAAAAAAAAExCBUaGUgZGVwb3NpdCB0byBiZSBwYWlkIHBlciBieXRlIHN0b3JlZCBvbiBjaGFpbi4BnQ1GABRTbG90cwEUU2xvdHMEGExlYXNlcwEBBAVpAqENBABAFQEgQW1vdW50cyBoZWxkIG9uIGRlcG9zaXQgZm9yIGVhY2ggKHBvc3NpYmx5IGZ1dHVyZSkgbGVhc2VkIHBhcmFjaGFpbi4AYQEgVGhlIGFjdHVhbCBhbW91bnQgbG9ja2VkIG9uIGl0cyBiZWhhbGYgYnkgYW55IGFjY291bnQgYXQgYW55IHRpbWUgaXMgdGhlIG1heGltdW0gb2YgdGhlKQEgc2Vjb25kIHZhbHVlcyBvZiB0aGUgaXRlbXMgaW4gdGhpcyBsaXN0IHdob3NlIGZpcnN0IHZhbHVlIGlzIHRoZSBhY2NvdW50LgBhASBUaGUgZmlyc3QgaXRlbSBpbiB0aGUgbGlzdCBpcyB0aGUgYW1vdW50IGxvY2tlZCBmb3IgdGhlIGN1cnJlbnQgTGVhc2UgUGVyaW9kLiBGb2xsb3dpbmewIGl0ZW1zIGFyZSBmb3IgdGhlIHN1YnNlcXVlbnQgbGVhc2UgcGVyaW9kcy4AYQEgVGhlIGRlZmF1bHQgdmFsdWUgKGFuIGVtcHR5IGxpc3QpIGltcGxpZXMgdGhhdCB0aGUgcGFyYWNoYWluIG5vIGxvbmdlciBleGlzdHMgKG9yIG5ldmVytCBleGlzdGVkKSBhcyBmYXIgYXMgdGhpcyBwYWxsZXQgaXMgY29uY2VybmVkLgBRASBJZiBhIHBhcmFjaGFpbiBkb2Vzbid0IGV4aXN0ICp5ZXQqIGJ1dCBpcyBzY2hlZHVsZWQgdG8gZXhpc3QgaW4gdGhlIGZ1dHVyZSwgdGhlbiBpdGEBIHdpbGwgYmUgbGVmdC1wYWRkZWQgd2l0aCBvbmUgb3IgbW9yZSBgTm9uZWBzIHRvIGRlbm90ZSB0aGUgZmFjdCB0aGF0IG5vdGhpbmcgaXMgaGVsZCBvbl0BIGRlcG9zaXQgZm9yIHRoZSBub24tZXhpc3RlbnQgY2hhaW4gY3VycmVudGx5LCBidXQgaXMgaGVsZCBhdCBzb21lIHBvaW50IGluIHRoZSBmdXR1cmUuANwgSXQgaXMgaWxsZWdhbCBmb3IgYSBgTm9uZWAgdmFsdWUgdG8gdHJhaWwgaW4gdGhlIGxpc3QuAaEFARkICCxMZWFzZVBlcmlvZBAQgDoJAATcIFRoZSBudW1iZXIgb2YgYmxvY2tzIG92ZXIgd2hpY2ggYSBzaW5nbGUgcGVyaW9kIGxhc3RzLixMZWFzZU9mZnNldBAQAAAAAATUIFRoZSBudW1iZXIgb2YgYmxvY2tzIHRvIG9mZnNldCBlYWNoIGxlYXNlIHBlcmlvZCBieS4BpQ1HACBBdWN0aW9ucwEgQXVjdGlvbnMQOEF1Y3Rpb25Db3VudGVyAQAQEAAAAAAEjCBOdW1iZXIgb2YgYXVjdGlvbnMgc3RhcnRlZCBzbyBmYXIuLEF1Y3Rpb25JbmZvAAD1AgQAFPggSW5mb3JtYXRpb24gcmVsYXRpbmcgdG8gdGhlIGN1cnJlbnQgYXVjdGlvbiwgaWYgdGhlcmUgaXMgb25lLgBFASBUaGUgZmlyc3QgaXRlbSBpbiB0aGUgdHVwbGUgaXMgdGhlIGxlYXNlIHBlcmlvZCBpbmRleCB0aGF0IHRoZSBmaXJzdCBvZiB0aGUgZm91clEBIGNvbnRpZ3VvdXMgbGVhc2UgcGVyaW9kcyBvbiBhdWN0aW9uIGlzIGZvci4gVGhlIHNlY29uZCBpcyB0aGUgYmxvY2sgbnVtYmVyIHdoZW4gdGhlXQEgYXVjdGlvbiB3aWxsICJiZWdpbiB0byBlbmQiLCBpLmUuIHRoZSBmaXJzdCBibG9jayBvZiB0aGUgRW5kaW5nIFBlcmlvZCBvZiB0aGUgYXVjdGlvbi48UmVzZXJ2ZWRBbW91bnRzAAEEBakNGAQACDEBIEFtb3VudHMgY3VycmVudGx5IHJlc2VydmVkIGluIHRoZSBhY2NvdW50cyBvZiB0aGUgYmlkZGVycyBjdXJyZW50bHkgd2lubmluZzggKHN1Yi0pcmFuZ2VzLhxXaW5uaW5nAAEEBRCtDQQADGEBIFRoZSB3aW5uaW5nIGJpZHMgZm9yIGVhY2ggb2YgdGhlIDEwIHJhbmdlcyBhdCBlYWNoIHNhbXBsZSBpbiB0aGUgZmluYWwgRW5kaW5nIFBlcmlvZCBvZkkBIHRoZSBjdXJyZW50IGF1Y3Rpb24uIFRoZSBtYXAncyBrZXkgaXMgdGhlIDAtYmFzZWQgaW5kZXggaW50byB0aGUgU2FtcGxlIFNpemUuIFRoZR0BIGZpcnN0IHNhbXBsZSBvZiB0aGUgZW5kaW5nIHBlcmlvZCBpcyAwOyB0aGUgbGFzdCBpcyBgU2FtcGxlIFNpemUgLSAxYC4BpQUBHQgQMEVuZGluZ1BlcmlvZBAQQBkBAAQdASBUaGUgbnVtYmVyIG9mIGJsb2NrcyBvdmVyIHdoaWNoIGFuIGF1Y3Rpb24gbWF5IGJlIHJldHJvYWN0aXZlbHkgZW5kZWQuMFNhbXBsZUxlbmd0aBAQFAAAAAzwIFRoZSBsZW5ndGggb2YgZWFjaCBzYW1wbGUgdG8gdGFrZSBkdXJpbmcgdGhlIGVuZGluZyBwZXJpb2QuANQgYEVuZGluZ1BlcmlvZGAgLyBgU2FtcGxlTGVuZ3RoYCA9IFRvdGFsICMgb2YgU2FtcGxlczhTbG90UmFuZ2VDb3VudBAQJAAAAABMTGVhc2VQZXJpb2RzUGVyU2xvdBAQCAAAAAABuQ1IACRDcm93ZGxvYW4BJENyb3dkbG9hbhAURnVuZHMAAQQFaQK9DQQABGggSW5mbyBvbiBhbGwgb2YgdGhlIGZ1bmRzLiBOZXdSYWlzZQEArQwEAAhVASBUaGUgZnVuZHMgdGhhdCBoYXZlIGhhZCBhZGRpdGlvbmFsIGNvbnRyaWJ1dGlvbnMgZHVyaW5nIHRoZSBsYXN0IGJsb2NrLiBUaGlzIGlzIHVzZWQVASBpbiBvcmRlciB0byBkZXRlcm1pbmUgd2hpY2ggZnVuZHMgc2hvdWxkIHN1Ym1pdCBuZXcgb3IgdXBkYXRlZCBiaWRzLjBFbmRpbmdzQ291bnQBABAQAAAAAAQpASBUaGUgbnVtYmVyIG9mIGF1Y3Rpb25zIHRoYXQgaGF2ZSBlbnRlcmVkIGludG8gdGhlaXIgZW5kaW5nIHBlcmlvZCBzbyBmYXIuNE5leHRGdW5kSW5kZXgBABAQAAAAAASoIFRyYWNrZXIgZm9yIHRoZSBuZXh0IGF2YWlsYWJsZSBmdW5kIGluZGV4Aa0FASEIDCBQYWxsZXRJZMEJIHB5L2NmdW5kCA0BIGBQYWxsZXRJZGAgZm9yIHRoZSBjcm93ZGxvYW4gcGFsbGV0LiBBbiBhcHByb3ByaWF0ZSB2YWx1ZSBjb3VsZCBiZWQgYFBhbGxldElkKCpiInB5L2NmdW5kIilgPE1pbkNvbnRyaWJ1dGlvbhhAGAyl1OgAAAAAAAAAAAAAAAhhASBUaGUgbWluaW11bSBhbW91bnQgdGhhdCBtYXkgYmUgY29udHJpYnV0ZWQgaW50byBhIGNyb3dkbG9hbi4gU2hvdWxkIGFsbW9zdCBjZXJ0YWlubHkgYmV8IGF0IGxlYXN0IGBFeGlzdGVudGlhbERlcG9zaXRgLjxSZW1vdmVLZXlzTGltaXQQEOgDAAAE5CBNYXggbnVtYmVyIG9mIHN0b3JhZ2Uga2V5cyB0byByZW1vdmUgcGVyIGV4dHJpbnNpYyBjYWxsLgHFDUkAIENvcmV0aW1lAAHBBQElCAggQnJva2VySWQQEO0DAAAEiCBUaGUgUGFyYUlkIG9mIHRoZSBjb3JldGltZSBjaGFpbi5EQnJva2VyUG90TG9jYXRpb274jAEBAG1vZGxweS9icm9rZQAAAAAAAAAAAAAAAAAAAAAAAAAABIQgVGhlIGNvcmV0aW1lIGNoYWluIHBvdCBsb2NhdGlvbi4ByQ1KACRYY21QYWxsZXQBJFhjbVBhbGxldDgwUXVlcnlDb3VudGVyAQAwIAAAAAAAAAAABIggVGhlIGxhdGVzdCBhdmFpbGFibGUgcXVlcnkgaW5kZXguHFF1ZXJpZXMAAQQCMM0NBAAEVCBUaGUgb25nb2luZyBxdWVyaWVzLihBc3NldFRyYXBzAQEEBjQQEAAAAAAQaCBUaGUgZXhpc3RpbmcgYXNzZXQgdHJhcHMuAGEBIEtleSBpcyB0aGUgYmxha2UyIDI1NiBoYXNoIG9mIChvcmlnaW4sIHZlcnNpb25lZCBgQXNzZXRzYCkgcGFpci4gVmFsdWUgaXMgdGhlIG51bWJlciBvZh0BIHRpbWVzIHRoaXMgcGFpciBoYXMgYmVlbiB0cmFwcGVkICh1c3VhbGx5IGp1c3QgMSBpZiBpdCBleGlzdHMgYXQgYWxsKS44U2FmZVhjbVZlcnNpb24AABAEAAhhASBEZWZhdWx0IHZlcnNpb24gdG8gZW5jb2RlIFhDTSB3aGVuIGxhdGVzdCB2ZXJzaW9uIG9mIGRlc3RpbmF0aW9uIGlzIHVua25vd24uIElmIGBOb25lYCw9ASB0aGVuIHRoZSBkZXN0aW5hdGlvbnMgd2hvc2UgWENNIHZlcnNpb24gaXMgdW5rbm93biBhcmUgY29uc2lkZXJlZCB1bnJlYWNoYWJsZS5AU3VwcG9ydGVkVmVyc2lvbgABCAUC4Q0QBAAE8CBUaGUgTGF0ZXN0IHZlcnNpb25zIHRoYXQgd2Uga25vdyB2YXJpb3VzIGxvY2F0aW9ucyBzdXBwb3J0LkBWZXJzaW9uTm90aWZpZXJzAAEIBQLhDTAEAAQFASBBbGwgbG9jYXRpb25zIHRoYXQgd2UgaGF2ZSByZXF1ZXN0ZWQgdmVyc2lvbiBub3RpZmljYXRpb25zIGZyb20uUFZlcnNpb25Ob3RpZnlUYXJnZXRzAAEIBQLhDeUNBAAIcQEgVGhlIHRhcmdldCBsb2NhdGlvbnMgdGhhdCBhcmUgc3Vic2NyaWJlZCB0byBvdXIgdmVyc2lvbiBjaGFuZ2VzLCBhcyB3ZWxsIGFzIHRoZSBtb3N0IHJlY2VudJQgb2Ygb3VyIHZlcnNpb25zIHdlIGluZm9ybWVkIHRoZW0gb2YuVFZlcnNpb25EaXNjb3ZlcnlRdWV1ZQEA6Q0EAAxlASBEZXN0aW5hdGlvbnMgd2hvc2UgbGF0ZXN0IFhDTSB2ZXJzaW9uIHdlIHdvdWxkIGxpa2UgdG8ga25vdy4gRHVwbGljYXRlcyBub3QgYWxsb3dlZCwgYW5kcQEgdGhlIGB1MzJgIGNvdW50ZXIgaXMgdGhlIG51bWJlciBvZiB0aW1lcyB0aGF0IGEgc2VuZCB0byB0aGUgZGVzdGluYXRpb24gaGFzIGJlZW4gYXR0ZW1wdGVkLIwgd2hpY2ggaXMgdXNlZCBhcyBhIHByaW9yaXRpemF0aW9uLkBDdXJyZW50TWlncmF0aW9uAAD1DQQABJwgVGhlIGN1cnJlbnQgbWlncmF0aW9uJ3Mgc3RhZ2UsIGlmIGFueS5UUmVtb3RlTG9ja2VkRnVuZ2libGVzAAEMBQIC/Q0BDgQABPAgRnVuZ2libGUgYXNzZXRzIHdoaWNoIHdlIGtub3cgYXJlIGxvY2tlZCBvbiBhIHJlbW90ZSBjaGFpbi48TG9ja2VkRnVuZ2libGVzAAEEAgARDgQABOAgRnVuZ2libGUgYXNzZXRzIHdoaWNoIHdlIGtub3cgYXJlIGxvY2tlZCBvbiB0aGlzIGNoYWluLlRYY21FeGVjdXRpb25TdXNwZW5kZWQBACAEAAS0IEdsb2JhbCBzdXNwZW5zaW9uIHN0YXRlIG9mIHRoZSBYQ00gZXhlY3V0b3IuPFNob3VsZFJlY29yZFhjbQEAIAQAHFkBIFdoZXRoZXIgb3Igbm90IGluY29taW5nIFhDTXMgKGJvdGggZXhlY3V0ZWQgbG9jYWxseSBhbmQgcmVjZWl2ZWQpIHNob3VsZCBiZSByZWNvcmRlZC7EIE9ubHkgb25lIFhDTSBwcm9ncmFtIHdpbGwgYmUgcmVjb3JkZWQgYXQgYSB0aW1lLikBIFRoaXMgaXMgbWVhbnQgdG8gYmUgdXNlZCBpbiBydW50aW1lIEFQSXMsIGFuZCBpdCdzIGFkdmlzZWQgaXQgc3RheXMgZmFsc2UNASBmb3IgYWxsIG90aGVyIHVzZSBjYXNlcywgc28gYXMgdG8gbm90IGRlZ3JhZGUgcmVndWxhciBwZXJmb3JtYW5jZS4AWQEgT25seSByZWxldmFudCBpZiB0aGlzIHBhbGxldCBpcyBiZWluZyB1c2VkIGFzIHRoZSBbYHhjbV9leGVjdXRvcjo6dHJhaXRzOjpSZWNvcmRYY21gXcggaW1wbGVtZW50YXRpb24gaW4gdGhlIFhDTSBleGVjdXRvciBjb25maWd1cmF0aW9uLixSZWNvcmRlZFhjbQAAkQYEABhJASBJZiBbYFNob3VsZFJlY29yZFhjbWBdIGlzIHNldCB0byB0cnVlLCB0aGVuIHRoZSBsYXN0IFhDTSBwcm9ncmFtIGV4ZWN1dGVkIGxvY2FsbHlUIHdpbGwgYmUgc3RvcmVkIGhlcmUuKQEgUnVudGltZSBBUElzIGNhbiBmZXRjaCB0aGUgWENNIHRoYXQgd2FzIGV4ZWN1dGVkIGJ5IGFjY2Vzc2luZyB0aGlzIHZhbHVlLgBZASBPbmx5IHJlbGV2YW50IGlmIHRoaXMgcGFsbGV0IGlzIGJlaW5nIHVzZWQgYXMgdGhlIFtgeGNtX2V4ZWN1dG9yOjp0cmFpdHM6OlJlY29yZFhjbWBdyCBpbXBsZW1lbnRhdGlvbiBpbiB0aGUgWENNIGV4ZWN1dG9yIGNvbmZpZ3VyYXRpb24uAdUFASkIAAEdDmMAME1lc3NhZ2VRdWV1ZQEwTWVzc2FnZVF1ZXVlDDBCb29rU3RhdGVGb3IBAQQFFQchDnQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATMIFRoZSBpbmRleCBvZiB0aGUgZmlyc3QgYW5kIGxhc3QgKG5vbi1lbXB0eSkgcGFnZXMuLFNlcnZpY2VIZWFkAAAVBwQABLwgVGhlIG9yaWdpbiBhdCB3aGljaCB3ZSBzaG91bGQgYmVnaW4gc2VydmljaW5nLhRQYWdlcwABCAUFLQ4xDgQABIggVGhlIG1hcCBvZiBwYWdlIGluZGljZXMgdG8gcGFnZXMuAREHATEIECBIZWFwU2l6ZRAQAAABABQ9ASBUaGUgc2l6ZSBvZiB0aGUgcGFnZTsgdGhpcyBpbXBsaWVzIHRoZSBtYXhpbXVtIG1lc3NhZ2Ugc2l6ZSB3aGljaCBjYW4gYmUgc2VudC4AWQEgQSBnb29kIHZhbHVlIGRlcGVuZHMgb24gdGhlIGV4cGVjdGVkIG1lc3NhZ2Ugc2l6ZXMsIHRoZWlyIHdlaWdodHMsIHRoZSB3ZWlnaHQgdGhhdCBpc10BIGF2YWlsYWJsZSBmb3IgcHJvY2Vzc2luZyB0aGVtIGFuZCB0aGUgbWF4aW1hbCBuZWVkZWQgbWVzc2FnZSBzaXplLiBUaGUgbWF4aW1hbCBtZXNzYWdlEQEgc2l6ZSBpcyBzbGlnaHRseSBsb3dlciB0aGFuIHRoaXMgYXMgZGVmaW5lZCBieSBbYE1heE1lc3NhZ2VMZW5PZmBdLiBNYXhTdGFsZRAQEAAAAAxdASBUaGUgbWF4aW11bSBudW1iZXIgb2Ygc3RhbGUgcGFnZXMgKGkuZS4gb2Ygb3ZlcndlaWdodCBtZXNzYWdlcykgYWxsb3dlZCBiZWZvcmUgY3VsbGluZ1EBIGNhbiBoYXBwZW4uIE9uY2UgdGhlcmUgYXJlIG1vcmUgc3RhbGUgcGFnZXMgdGhhbiB0aGlzLCB0aGVuIGhpc3RvcmljYWwgcGFnZXMgbWF5IGJl/CBkcm9wcGVkLCBldmVuIGlmIHRoZXkgY29udGFpbiB1bnByb2Nlc3NlZCBvdmVyd2VpZ2h0IG1lc3NhZ2VzLjRTZXJ2aWNlV2VpZ2h0cQdAAQcAoNshXRMzMzMzMzMzMxhBASBUaGUgYW1vdW50IG9mIHdlaWdodCAoaWYgYW55KSB3aGljaCBzaG91bGQgYmUgcHJvdmlkZWQgdG8gdGhlIG1lc3NhZ2UgcXVldWUgZm9yqCBzZXJ2aWNpbmcgZW5xdWV1ZWQgaXRlbXMgYG9uX2luaXRpYWxpemVgLgD8IFRoaXMgbWF5IGJlIGxlZ2l0aW1hdGVseSBgTm9uZWAgaW4gdGhlIGNhc2UgdGhhdCB5b3Ugd2lsbCBjYWxsXQEgYFNlcnZpY2VRdWV1ZXM6OnNlcnZpY2VfcXVldWVzYCBtYW51YWxseSBvciBzZXQgW2BTZWxmOjpJZGxlTWF4U2VydmljZVdlaWdodGBdIHRvIGhhdmVUIGl0IHJ1biBpbiBgb25faWRsZWAuUElkbGVNYXhTZXJ2aWNlV2VpZ2h0cQdAAQcAoNshXRMzMzMzMzMzMxRdASBUaGUgbWF4aW11bSBhbW91bnQgb2Ygd2VpZ2h0IChpZiBhbnkpIHRvIGJlIHVzZWQgZnJvbSByZW1haW5pbmcgd2VpZ2h0IGBvbl9pZGxlYCB3aGljaEEBIHNob3VsZCBiZSBwcm92aWRlZCB0byB0aGUgbWVzc2FnZSBxdWV1ZSBmb3Igc2VydmljaW5nIGVucXVldWVkIGl0ZW1zIGBvbl9pZGxlYC49ASBVc2VmdWwgZm9yIHBhcmFjaGFpbnMgdG8gcHJvY2VzcyBtZXNzYWdlcyBhdCB0aGUgc2FtZSBibG9jayB0aGV5IGFyZSByZWNlaXZlZC4AKQEgSWYgYE5vbmVgLCBpdCB3aWxsIG5vdCBjYWxsIGBTZXJ2aWNlUXVldWVzOjpzZXJ2aWNlX3F1ZXVlc2AgaW4gYG9uX2lkbGVgLgE5DmQAJEFzc2V0UmF0ZQEkQXNzZXRSYXRlBFhDb252ZXJzaW9uUmF0ZVRvTmF0aXZlAAEEAsQhBwQADB0BIE1hcHMgYW4gYXNzZXQgdG8gaXRzIGZpeGVkIHBvaW50IHJlcHJlc2VudGF0aW9uIGluIHRoZSBuYXRpdmUgYmFsYW5jZS4ATQEgRS5nLiBgbmF0aXZlX2Ftb3VudCA9IGFzc2V0X2Ftb3VudCAqIENvbnZlcnNpb25SYXRlVG9OYXRpdmU6OjxUPjo6Z2V0KGFzc2V0X2tpbmQpYAEdBwE5CAABPQ5lABRCZWVmeQEUQmVlZnkULEF1dGhvcml0aWVzAQBBDgQABHAgVGhlIGN1cnJlbnQgYXV0aG9yaXRpZXMgc2V0OFZhbGlkYXRvclNldElkAQAwIAAAAAAAAAAABHQgVGhlIGN1cnJlbnQgdmFsaWRhdG9yIHNldCBpZDxOZXh0QXV0aG9yaXRpZXMBAEEOBAAE7CBBdXRob3JpdGllcyBzZXQgc2NoZWR1bGVkIHRvIGJlIHVzZWQgd2l0aCB0aGUgbmV4dCBzZXNzaW9uMFNldElkU2Vzc2lvbgABBAUwEAQAKFEBIEEgbWFwcGluZyBmcm9tIEJFRUZZIHNldCBJRCB0byB0aGUgaW5kZXggb2YgdGhlICptb3N0IHJlY2VudCogc2Vzc2lvbiBmb3Igd2hpY2ggaXRzaCBtZW1iZXJzIHdlcmUgcmVzcG9uc2libGUuAEUBIFRoaXMgaXMgb25seSB1c2VkIGZvciB2YWxpZGF0aW5nIGVxdWl2b2NhdGlvbiBwcm9vZnMuIEFuIGVxdWl2b2NhdGlvbiBwcm9vZiBtdXN0TQEgY29udGFpbnMgYSBrZXktb3duZXJzaGlwIHByb29mIGZvciBhIGdpdmVuIHNlc3Npb24sIHRoZXJlZm9yZSB3ZSBuZWVkIGEgd2F5IHRvIHRpZT0BIHRvZ2V0aGVyIHNlc3Npb25zIGFuZCBCRUVGWSBzZXQgaWRzLCBpLmUuIHdlIG5lZWQgdG8gdmFsaWRhdGUgdGhhdCBhIHZhbGlkYXRvckEBIHdhcyB0aGUgb3duZXIgb2YgYSBnaXZlbiBrZXkgb24gYSBnaXZlbiBzZXNzaW9uLCBhbmQgd2hhdCB0aGUgYWN0aXZlIHNldCBJRCB3YXNUIGR1cmluZyB0aGF0IHNlc3Npb24uANwgVFdPWC1OT1RFOiBgVmFsaWRhdG9yU2V0SWRgIGlzIG5vdCB1bmRlciB1c2VyIGNvbnRyb2wuMEdlbmVzaXNCbG9jawEAPQIEAAzcIEJsb2NrIG51bWJlciB3aGVyZSBCRUVGWSBjb25zZW5zdXMgaXMgZW5hYmxlZC9zdGFydGVkLmkBIEJ5IGNoYW5naW5nIHRoaXMgKHRocm91Z2ggcHJpdmlsZWdlZCBgc2V0X25ld19nZW5lc2lzKClgKSwgQkVFRlkgY29uc2Vuc3VzIGlzIGVmZmVjdGl2ZWx5rCByZXN0YXJ0ZWQgZnJvbSB0aGUgbmV3bHkgc2V0IGJsb2NrIG51bWJlci4BJQcADDhNYXhBdXRob3JpdGllcxAQoIYBAATUIFRoZSBtYXhpbXVtIG51bWJlciBvZiBhdXRob3JpdGllcyB0aGF0IGNhbiBiZSBhZGRlZC40TWF4Tm9taW5hdG9ycxAQAAIAAATUIFRoZSBtYXhpbXVtIG51bWJlciBvZiBub21pbmF0b3JzIGZvciBlYWNoIHZhbGlkYXRvci5YTWF4U2V0SWRTZXNzaW9uRW50cmllczAgqAAAAAAAAAAYOQEgVGhlIG1heGltdW0gbnVtYmVyIG9mIGVudHJpZXMgdG8ga2VlcCBpbiB0aGUgc2V0IGlkIHRvIHNlc3Npb24gaW5kZXggbWFwcGluZy4AMQEgU2luY2UgdGhlIGBTZXRJZFNlc3Npb25gIG1hcCBpcyBvbmx5IHVzZWQgZm9yIHZhbGlkYXRpbmcgZXF1aXZvY2F0aW9ucyB0aGlzKQEgdmFsdWUgc2hvdWxkIHJlbGF0ZSB0byB0aGUgYm9uZGluZyBkdXJhdGlvbiBvZiB3aGF0ZXZlciBzdGFraW5nIHN5c3RlbSBpczUBIGJlaW5nIHVzZWQgKGlmIGFueSkuIElmIGVxdWl2b2NhdGlvbiBoYW5kbGluZyBpcyBub3QgZW5hYmxlZCB0aGVuIHRoaXMgdmFsdWU0IGNhbiBiZSB6ZXJvLgFJDsgADE1tcgEMTW1yDCBSb290SGFzaAEANIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARYIExhdGVzdCBNTVIgUm9vdCBoYXNoLjhOdW1iZXJPZkxlYXZlcwEAMCAAAAAAAAAAAASwIEN1cnJlbnQgc2l6ZSBvZiB0aGUgTU1SIChudW1iZXIgb2YgbGVhdmVzKS4UTm9kZXMAAQQGMDQEABCAIEhhc2hlcyBvZiB0aGUgbm9kZXMgaW4gdGhlIE1NUi4ALQEgTm90ZSB0aGlzIGNvbGxlY3Rpb24gb25seSBjb250YWlucyBNTVIgcGVha3MsIHRoZSBpbm5lciBub2RlcyAoYW5kIGxlYXZlcym8IGFyZSBwcnVuZWQgYW5kIG9ubHkgc3RvcmVkIGluIHRoZSBPZmZjaGFpbiBEQi4AAAAAyQAwQmVlZnlNbXJMZWFmATBCZWVmeU1tckxlYWYIQEJlZWZ5QXV0aG9yaXRpZXMBAE0OsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABKAgRGV0YWlscyBvZiBjdXJyZW50IEJFRUZZIGF1dGhvcml0eSBzZXQuUEJlZWZ5TmV4dEF1dGhvcml0aWVzAQBNDrAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyUIERldGFpbHMgb2YgbmV4dCBCRUVGWSBhdXRob3JpdHkgc2V0LgBRASBUaGlzIHN0b3JhZ2UgZW50cnkgaXMgdXNlZCBhcyBjYWNoZSBmb3IgY2FsbHMgdG8gYHVwZGF0ZV9iZWVmeV9uZXh0X2F1dGhvcml0eV9zZXRgLgAAAADKAASdAV0BvQVRDiRIQ2hlY2tOb25aZXJvU2VuZGVyVQ6hAUBDaGVja1NwZWNWZXJzaW9uWQ4QOENoZWNrVHhWZXJzaW9uXQ4QMENoZWNrR2VuZXNpc2EONDhDaGVja01vcnRhbGl0eWUONChDaGVja05vbmNlbQ6hASxDaGVja1dlaWdodHEOoQFgQ2hhcmdlVHJhbnNhY3Rpb25QYXltZW50dQ6hAURDaGVja01ldGFkYXRhSGFzaHkOsQeBDlwkSW5mbGF0aW9uBJhleHBlcmltZW50YWxfaW5mbGF0aW9uX3ByZWRpY3Rpb25faW5mbwCFDhDYIFJldHVybiB0aGUgY3VycmVudCBlc3RpbWF0ZXMgb2YgdGhlIGluZmxhdGlvbiBhbW91bnQuAFEBIFRoaXMgaXMgbWFya2VkIGFzIGV4cGVyaW1lbnRhbCBpbiBsaWdodCBvZiBSRkMjODkuIE5vbmV0aGVsZXNzLCBpdHMgdXNhZ2UgaXMgaGlnaGx5JQEgcmVjb21tZW5kZWQgb3ZlciB0cnlpbmcgdG8gcmVhZC1zdG9yYWdlLCBvciByZS1jcmVhdGUgdGhlIG9uY2hhaW4gbG9naWMuABBDb3JlDBx2ZXJzaW9uAGkIBJAgUmV0dXJucyB0aGUgdmVyc2lvbiBvZiB0aGUgcnVudGltZS40ZXhlY3V0ZV9ibG9jawQUYmxvY2uNDqEBBGQgRXhlY3V0ZSB0aGUgZ2l2ZW4gYmxvY2suQGluaXRpYWxpemVfYmxvY2sEGGhlYWRlcnkBmQ4EQQEgSW5pdGlhbGl6ZSBhIGJsb2NrIHdpdGggdGhlIGdpdmVuIGhlYWRlciBhbmQgcmV0dXJuIHRoZSBydW50aW1lIGV4ZWN1dGl2ZSBtb2RlLgQhASBUaGUgYENvcmVgIHJ1bnRpbWUgYXBpIHRoYXQgZXZlcnkgU3Vic3RyYXRlIHJ1bnRpbWUgbmVlZHMgdG8gaW1wbGVtZW50LiBNZXRhZGF0YQwgbWV0YWRhdGEAnQ4EjCBSZXR1cm5zIHRoZSBtZXRhZGF0YSBvZiBhIHJ1bnRpbWUuTG1ldGFkYXRhX2F0X3ZlcnNpb24EHHZlcnNpb24QoQ4QpCBSZXR1cm5zIHRoZSBtZXRhZGF0YSBhdCBhIGdpdmVuIHZlcnNpb24uAAUBIElmIHRoZSBnaXZlbiBgdmVyc2lvbmAgaXNuJ3Qgc3VwcG9ydGVkLCB0aGlzIHdpbGwgcmV0dXJuIGBOb25lYC51ASBVc2UgW2BTZWxmOjptZXRhZGF0YV92ZXJzaW9uc2BdIHRvIGZpbmQgb3V0IGFib3V0IHN1cHBvcnRlZCBtZXRhZGF0YSB2ZXJzaW9uIG9mIHRoZSBydW50aW1lLkRtZXRhZGF0YV92ZXJzaW9ucwDBAQykIFJldHVybnMgdGhlIHN1cHBvcnRlZCBtZXRhZGF0YSB2ZXJzaW9ucy4AwCBUaGlzIGNhbiBiZSB1c2VkIHRvIGNhbGwgYG1ldGFkYXRhX2F0X3ZlcnNpb25gLgQBASBUaGUgYE1ldGFkYXRhYCBhcGkgdHJhaXQgdGhhdCByZXR1cm5zIG1ldGFkYXRhIGZvciB0aGUgcnVudGltZS4wQmxvY2tCdWlsZGVyEDxhcHBseV9leHRyaW5zaWMEJGV4dHJpbnNpY5EOpQ4QbCBBcHBseSB0aGUgZ2l2ZW4gZXh0cmluc2ljLgA5ASBSZXR1cm5zIGFuIGluY2x1c2lvbiBvdXRjb21lIHdoaWNoIHNwZWNpZmllcyBpZiB0aGlzIGV4dHJpbnNpYyBpcyBpbmNsdWRlZCBpbkwgdGhpcyBibG9jayBvciBub3QuOGZpbmFsaXplX2Jsb2NrAHkBBGggRmluaXNoIHRoZSBjdXJyZW50IGJsb2NrLkxpbmhlcmVudF9leHRyaW5zaWNzBCBpbmhlcmVudLUOlQ4EPQEgR2VuZXJhdGUgaW5oZXJlbnQgZXh0cmluc2ljcy4gVGhlIGluaGVyZW50IGRhdGEgd2lsbCB2YXJ5IGZyb20gY2hhaW4gdG8gY2hhaW4uPGNoZWNrX2luaGVyZW50cwgUYmxvY2uNDhBkYXRhtQ7FDgRVASBDaGVjayB0aGF0IHRoZSBpbmhlcmVudHMgYXJlIHZhbGlkLiBUaGUgaW5oZXJlbnQgZGF0YSB3aWxsIHZhcnkgZnJvbSBjaGFpbiB0byBjaGFpbi4EcQEgVGhlIGBCbG9ja0J1aWxkZXJgIGFwaSB0cmFpdCB0aGF0IHByb3ZpZGVzIHRoZSByZXF1aXJlZCBmdW5jdGlvbmFsaXR5IGZvciBidWlsZGluZyBhIGJsb2NrLlhUYWdnZWRUcmFuc2FjdGlvblF1ZXVlBFB2YWxpZGF0ZV90cmFuc2FjdGlvbgwYc291cmNlyQ4IdHiRDihibG9ja19oYXNoNM0OJGggVmFsaWRhdGUgdGhlIHRyYW5zYWN0aW9uLgBlASBUaGlzIG1ldGhvZCBpcyBpbnZva2VkIGJ5IHRoZSB0cmFuc2FjdGlvbiBwb29sIHRvIGxlYXJuIGRldGFpbHMgYWJvdXQgZ2l2ZW4gdHJhbnNhY3Rpb24uRQEgVGhlIGltcGxlbWVudGF0aW9uIHNob3VsZCBtYWtlIHN1cmUgdG8gdmVyaWZ5IHRoZSBjb3JyZWN0bmVzcyBvZiB0aGUgdHJhbnNhY3Rpb25NASBhZ2FpbnN0IGN1cnJlbnQgc3RhdGUuIFRoZSBnaXZlbiBgYmxvY2tfaGFzaGAgY29ycmVzcG9uZHMgdG8gdGhlIGhhc2ggb2YgdGhlIGJsb2NrfCB0aGF0IGlzIHVzZWQgYXMgY3VycmVudCBzdGF0ZS4ARQEgTm90ZSB0aGF0IHRoaXMgY2FsbCBtYXkgYmUgcGVyZm9ybWVkIGJ5IHRoZSBwb29sIG11bHRpcGxlIHRpbWVzIGFuZCB0cmFuc2FjdGlvbnOkIG1pZ2h0IGJlIHZlcmlmaWVkIGluIGFueSBwb3NzaWJsZSBvcmRlci4ETQEgVGhlIGBUYWdnZWRUcmFuc2FjdGlvblF1ZXVlYCBhcGkgdHJhaXQgZm9yIGludGVyZmVyaW5nIHdpdGggdGhlIHRyYW5zYWN0aW9uIHF1ZXVlLkRPZmZjaGFpbldvcmtlckFwaQQ8b2ZmY2hhaW5fd29ya2VyBBhoZWFkZXJ5AaEBBMggU3RhcnRzIHRoZSBvZmYtY2hhaW4gdGFzayBmb3IgZ2l2ZW4gYmxvY2sgaGVhZGVyLgRkIFRoZSBvZmZjaGFpbiB3b3JrZXIgYXBpLjRQYXJhY2hhaW5Ib3N0fCh2YWxpZGF0b3JzAEEMBHAgR2V0IHRoZSBjdXJyZW50IHZhbGlkYXRvcnMuQHZhbGlkYXRvcl9ncm91cHMA1Q4MZQEgUmV0dXJucyB0aGUgdmFsaWRhdG9yIGdyb3VwcyBhbmQgcm90YXRpb24gaW5mbyBsb2NhbGl6ZWQgYmFzZWQgb24gdGhlIGh5cG90aGV0aWNhbCBjaGlsZGEBICBvZiBhIGJsb2NrIHdob3NlIHN0YXRlICB0aGlzIGlzIGludm9rZWQgb24uIE5vdGUgdGhhdCBgbm93YCBpbiB0aGUgYEdyb3VwUm90YXRpb25JbmZvYNAgc2hvdWxkIGJlIHRoZSBzdWNjZXNzb3Igb2YgdGhlIG51bWJlciBvZiB0aGUgYmxvY2suSGF2YWlsYWJpbGl0eV9jb3JlcwDdDgg1ASBZaWVsZHMgaW5mb3JtYXRpb24gb24gYWxsIGF2YWlsYWJpbGl0eSBjb3JlcyBhcyByZWxldmFudCB0byB0aGUgY2hpbGQgYmxvY2suPQEgQ29yZXMgYXJlIGVpdGhlciBmcmVlIG9yIG9jY3VwaWVkLiBGcmVlIGNvcmVzIGNhbiBoYXZlIHBhcmFzIGFzc2lnbmVkIHRvIHRoZW0uZHBlcnNpc3RlZF92YWxpZGF0aW9uX2RhdGEIHHBhcmFfaWRpAihhc3N1bXB0aW9u9Q75DhRpASBZaWVsZHMgdGhlIHBlcnNpc3RlZCB2YWxpZGF0aW9uIGRhdGEgZm9yIHRoZSBnaXZlbiBgUGFyYUlkYCBhbG9uZyB3aXRoIGFuIGFzc3VtcHRpb24gdGhhdNggc2hvdWxkIGJlIHVzZWQgaWYgdGhlIHBhcmEgY3VycmVudGx5IG9jY3VwaWVzIGEgY29yZS4ARQEgUmV0dXJucyBgTm9uZWAgaWYgZWl0aGVyIHRoZSBwYXJhIGlzIG5vdCByZWdpc3RlcmVkIG9yIHRoZSBhc3N1bXB0aW9uIGlzIGBGcmVlZGCYIGFuZCB0aGUgcGFyYSBhbHJlYWR5IG9jY3VwaWVzIGEgY29yZS5cYXNzdW1lZF92YWxpZGF0aW9uX2RhdGEIHHBhcmFfaWRpApxleHBlY3RlZF9wZXJzaXN0ZWRfdmFsaWRhdGlvbl9kYXRhX2hhc2g0AQ8MaQEgUmV0dXJucyB0aGUgcGVyc2lzdGVkIHZhbGlkYXRpb24gZGF0YSBmb3IgdGhlIGdpdmVuIGBQYXJhSWRgIGFsb25nIHdpdGggdGhlIGNvcnJlc3BvbmRpbmd1ASB2YWxpZGF0aW9uIGNvZGUgaGFzaC4gSW5zdGVhZCBvZiBhY2NlcHRpbmcgYXNzdW1wdGlvbiBhYm91dCB0aGUgcGFyYSwgbWF0Y2hlcyB0aGUgdmFsaWRhdGlvbikBIGRhdGEgaGFzaCBhZ2FpbnN0IGFuIGV4cGVjdGVkIG9uZSBhbmQgeWllbGRzIGBOb25lYCBpZiB0aGV5J3JlIG5vdCBlcXVhbC5gY2hlY2tfdmFsaWRhdGlvbl9vdXRwdXRzCBxwYXJhX2lkaQIcb3V0cHV0cyUFIAQVASBDaGVja3MgaWYgdGhlIGdpdmVuIHZhbGlkYXRpb24gb3V0cHV0cyBwYXNzIHRoZSBhY2NlcHRhbmNlIGNyaXRlcmlhLlxzZXNzaW9uX2luZGV4X2Zvcl9jaGlsZAAQDPAgUmV0dXJucyB0aGUgc2Vzc2lvbiBpbmRleCBleHBlY3RlZCBhdCBhIGNoaWxkIG9mIHRoZSBibG9jay4A0CBUaGlzIGNhbiBiZSB1c2VkIHRvIGluc3RhbnRpYXRlIGEgYFNpZ25pbmdDb250ZXh0YC48dmFsaWRhdGlvbl9jb2RlCBxwYXJhX2lkaQIoYXNzdW1wdGlvbvUOOQUQVQEgRmV0Y2ggdGhlIHZhbGlkYXRpb24gY29kZSB1c2VkIGJ5IGEgcGFyYSwgbWFraW5nIHRoZSBnaXZlbiBgT2NjdXBpZWRDb3JlQXNzdW1wdGlvbmAuAEUBIFJldHVybnMgYE5vbmVgIGlmIGVpdGhlciB0aGUgcGFyYSBpcyBub3QgcmVnaXN0ZXJlZCBvciB0aGUgYXNzdW1wdGlvbiBpcyBgRnJlZWRgmCBhbmQgdGhlIHBhcmEgYWxyZWFkeSBvY2N1cGllcyBhIGNvcmUueGNhbmRpZGF0ZV9wZW5kaW5nX2F2YWlsYWJpbGl0eQQccGFyYV9pZGkCCQ8IXQEgR2V0IHRoZSByZWNlaXB0IG9mIGEgY2FuZGlkYXRlIHBlbmRpbmcgYXZhaWxhYmlsaXR5LiBUaGlzIHJldHVybnMgYFNvbWVgIGZvciBhbnkgcGFyYXMlASBhc3NpZ25lZCB0byBvY2N1cGllZCBjb3JlcyBpbiBgYXZhaWxhYmlsaXR5X2NvcmVzYCBhbmQgYE5vbmVgIG90aGVyd2lzZS5AY2FuZGlkYXRlX2V2ZW50cwANDwQtASBHZXQgYSB2ZWN0b3Igb2YgZXZlbnRzIGNvbmNlcm5pbmcgY2FuZGlkYXRlcyB0aGF0IG9jY3VycmVkIHdpdGhpbiBhIGJsb2NrLjBkbXFfY29udGVudHMEJHJlY2lwaWVudGkC4QwEPQEgR2V0IGFsbCB0aGUgcGVuZGluZyBpbmJvdW5kIG1lc3NhZ2VzIGluIHRoZSBkb3dud2FyZCBtZXNzYWdlIHF1ZXVlIGZvciBhIHBhcmEueGluYm91bmRfaHJtcF9jaGFubmVsc19jb250ZW50cwQkcmVjaXBpZW50aQIVDwhlASBHZXQgdGhlIGNvbnRlbnRzIG9mIGFsbCBjaGFubmVscyBhZGRyZXNzZWQgdG8gdGhlIGdpdmVuIHJlY2lwaWVudC4gQ2hhbm5lbHMgdGhhdCBoYXZlIG5vkCBtZXNzYWdlcyBpbiB0aGVtIGFyZSBhbHNvIGluY2x1ZGVkLlx2YWxpZGF0aW9uX2NvZGVfYnlfaGFzaAQQaGFzaCEFOQUEnCBHZXQgdGhlIHZhbGlkYXRpb24gY29kZSBmcm9tIGl0cyBoYXNoLjhvbl9jaGFpbl92b3RlcwAhDwQxASBTY3JhcGUgZGlzcHV0ZSByZWxldmFudCBmcm9tIG9uLWNoYWluLCBiYWNraW5nIHZvdGVzIGFuZCByZXNvbHZlZCBkaXNwdXRlcy4wc2Vzc2lvbl9pbmZvBBRpbmRleBAlDwzcIEdldCB0aGUgc2Vzc2lvbiBpbmZvIGZvciB0aGUgZ2l2ZW4gc2Vzc2lvbiwgaWYgc3RvcmVkLgAZASBOT1RFOiBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgYXZhaWxhYmxlIHNpbmNlIHBhcmFjaGFpbiBob3N0IHZlcnNpb24gMi5oc3VibWl0X3B2Zl9jaGVja19zdGF0ZW1lbnQIEHN0bXR1BSRzaWduYXR1cmUFBaEBDAEBIFN1Ym1pdHMgYSBQVkYgcHJlLWNoZWNraW5nIHN0YXRlbWVudCBpbnRvIHRoZSB0cmFuc2FjdGlvbiBwb29sLgAZASBOT1RFOiBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgYXZhaWxhYmxlIHNpbmNlIHBhcmFjaGFpbiBob3N0IHZlcnNpb24gMi5UcHZmc19yZXF1aXJlX3ByZWNoZWNrAKkMDF0BIFJldHVybnMgY29kZSBoYXNoZXMgb2YgUFZGcyB0aGF0IHJlcXVpcmUgcHJlLWNoZWNraW5nIGJ5IHZhbGlkYXRvcnMgaW4gdGhlIGFjdGl2ZSBzZXQuABkBIE5PVEU6IFRoaXMgZnVuY3Rpb24gaXMgb25seSBhdmFpbGFibGUgc2luY2UgcGFyYWNoYWluIGhvc3QgdmVyc2lvbiAyLlB2YWxpZGF0aW9uX2NvZGVfaGFzaAgccGFyYV9pZGkCKGFzc3VtcHRpb271DikPDIUBIEZldGNoIHRoZSBoYXNoIG9mIHRoZSB2YWxpZGF0aW9uIGNvZGUgdXNlZCBieSBhIHBhcmEsIG1ha2luZyB0aGUgZ2l2ZW4gYE9jY3VwaWVkQ29yZUFzc3VtcHRpb25gLgAZASBOT1RFOiBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgYXZhaWxhYmxlIHNpbmNlIHBhcmFjaGFpbiBob3N0IHZlcnNpb24gMi4gZGlzcHV0ZXMALQ8EeCBSZXR1cm5zIGFsbCBvbmNoYWluIGRpc3B1dGVzLlxzZXNzaW9uX2V4ZWN1dG9yX3BhcmFtcwQ0c2Vzc2lvbl9pbmRleBA1DwS4IFJldHVybnMgZXhlY3V0aW9uIHBhcmFtZXRlcnMgZm9yIHRoZSBzZXNzaW9uLkR1bmFwcGxpZWRfc2xhc2hlcwA5DwhZASBSZXR1cm5zIGEgbGlzdCBvZiB2YWxpZGF0b3JzIHRoYXQgbG9zdCBhIHBhc3Qgc2Vzc2lvbiBkaXNwdXRlIGFuZCBuZWVkIHRvIGJlIHNsYXNoZWQuGQEgTk9URTogVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGF2YWlsYWJsZSBzaW5jZSBwYXJhY2hhaW4gaG9zdCB2ZXJzaW9uIDUuTGtleV9vd25lcnNoaXBfcHJvb2YEMHZhbGlkYXRvcl9pZPkBQQ8IzCBSZXR1cm5zIGEgbWVya2xlIHByb29mIG9mIGEgdmFsaWRhdG9yIHNlc3Npb24ga2V5LhkBIE5PVEU6IFRoaXMgZnVuY3Rpb24gaXMgb25seSBhdmFpbGFibGUgc2luY2UgcGFyYWNoYWluIGhvc3QgdmVyc2lvbiA1LmhzdWJtaXRfcmVwb3J0X2Rpc3B1dGVfbG9zdAg0ZGlzcHV0ZV9wcm9vZo0FTGtleV9vd25lcnNoaXBfcHJvb2ZFD0kPDCkBIFN1Ym1pdCBhbiB1bnNpZ25lZCBleHRyaW5zaWMgdG8gc2xhc2ggdmFsaWRhdG9ycyB3aG8gbG9zdCBhIGRpc3B1dGUgYWJvdXR8IGEgY2FuZGlkYXRlIG9mIGEgcGFzdCBzZXNzaW9uLhkBIE5PVEU6IFRoaXMgZnVuY3Rpb24gaXMgb25seSBhdmFpbGFibGUgc2luY2UgcGFyYWNoYWluIGhvc3QgdmVyc2lvbiA1LlRtaW5pbXVtX2JhY2tpbmdfdm90ZXMAEAgNASBHZXQgdGhlIG1pbmltdW0gbnVtYmVyIG9mIGJhY2tpbmcgdm90ZXMgZm9yIGEgcGFyYWNoYWluIGNhbmRpZGF0ZS70IFRoaXMgaXMgYSBzdGFnaW5nIG1ldGhvZCEgRG8gbm90IHVzZSBvbiBwcm9kdWN0aW9uIHJ1bnRpbWVzIUhwYXJhX2JhY2tpbmdfc3RhdGUEBF9pAk0PBOQgUmV0dXJucyB0aGUgc3RhdGUgb2YgcGFyYWNoYWluIGJhY2tpbmcgZm9yIGEgZ2l2ZW4gcGFyYS5QYXN5bmNfYmFja2luZ19wYXJhbXMAvQQEYQEgUmV0dXJucyBjYW5kaWRhdGUncyBhY2NlcHRhbmNlIGxpbWl0YXRpb25zIGZvciBhc3luY2hyb25vdXMgYmFja2luZyBmb3IgYSByZWxheSBwYXJlbnQuTGRpc2FibGVkX3ZhbGlkYXRvcnMAPQwE+CBSZXR1cm5zIGEgbGlzdCBvZiBhbGwgZGlzYWJsZWQgdmFsaWRhdG9ycyBhdCB0aGUgZ2l2ZW4gYmxvY2suNG5vZGVfZmVhdHVyZXMA+QQITCBHZXQgbm9kZSBmZWF0dXJlcy70IFRoaXMgaXMgYSBzdGFnaW5nIG1ldGhvZCEgRG8gbm90IHVzZSBvbiBwcm9kdWN0aW9uIHJ1bnRpbWVzIVhhcHByb3ZhbF92b3RpbmdfcGFyYW1zANUEBKQgQXBwcm92YWwgdm90aW5nIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyxjbGFpbV9xdWV1ZQB9DwQwIENsYWltIHF1ZXVlfGNhbmRpZGF0ZXNfcGVuZGluZ19hdmFpbGFiaWxpdHkEHHBhcmFfaWRpAokPBGAgRWxhc3RpYyBzY2FsaW5nIHN1cHBvcnQE3CBUaGUgQVBJIGZvciBxdWVyeWluZyB0aGUgc3RhdGUgb2YgcGFyYWNoYWlucyBvbi1jaGFpbi4gQmVlZnlBcGkQNGJlZWZ5X2dlbmVzaXMAPQIEBQEgUmV0dXJuIHRoZSBibG9jayBudW1iZXIgd2hlcmUgQkVFRlkgY29uc2Vuc3VzIGlzIGVuYWJsZWQvc3RhcnRlZDR2YWxpZGF0b3Jfc2V0AI0PBLggUmV0dXJuIHRoZSBjdXJyZW50IGFjdGl2ZSBCRUVGWSB2YWxpZGF0b3Igc2V0tHN1Ym1pdF9yZXBvcnRfZXF1aXZvY2F0aW9uX3Vuc2lnbmVkX2V4dHJpbnNpYwhIZXF1aXZvY2F0aW9uX3Byb29mKQc8a2V5X293bmVyX3Byb29mlQ9JDyARASBTdWJtaXRzIGFuIHVuc2lnbmVkIGV4dHJpbnNpYyB0byByZXBvcnQgYW4gZXF1aXZvY2F0aW9uLiBUaGUgY2FsbGVy+CBtdXN0IHByb3ZpZGUgdGhlIGVxdWl2b2NhdGlvbiBwcm9vZiBhbmQgYSBrZXkgb3duZXJzaGlwIHByb29m/CAoc2hvdWxkIGJlIG9idGFpbmVkIHVzaW5nIGBnZW5lcmF0ZV9rZXlfb3duZXJzaGlwX3Byb29mYCkuIFRoZQUBIGV4dHJpbnNpYyB3aWxsIGJlIHVuc2lnbmVkIGFuZCBzaG91bGQgb25seSBiZSBhY2NlcHRlZCBmb3IgbG9jYWwVASBhdXRob3JzaGlwIChub3QgdG8gYmUgYnJvYWRjYXN0IHRvIHRoZSBuZXR3b3JrKS4gVGhpcyBtZXRob2QgcmV0dXJucwkBIGBOb25lYCB3aGVuIGNyZWF0aW9uIG9mIHRoZSBleHRyaW5zaWMgZmFpbHMsIGUuZy4gaWYgZXF1aXZvY2F0aW9uBQEgcmVwb3J0aW5nIGlzIGRpc2FibGVkIGZvciB0aGUgZ2l2ZW4gcnVudGltZSAoaS5lLiB0aGlzIG1ldGhvZCBpcwUBIGhhcmRjb2RlZCB0byByZXR1cm4gYE5vbmVgKS4gT25seSB1c2VmdWwgaW4gYW4gb2ZmY2hhaW4gY29udGV4dC5wZ2VuZXJhdGVfa2V5X293bmVyc2hpcF9wcm9vZggYc2V0X2lkMDBhdXRob3JpdHlfaWQFApkPLAkBIEdlbmVyYXRlcyBhIHByb29mIG9mIGtleSBvd25lcnNoaXAgZm9yIHRoZSBnaXZlbiBhdXRob3JpdHkgaW4gdGhl/CBnaXZlbiBzZXQuIEFuIGV4YW1wbGUgdXNhZ2Ugb2YgdGhpcyBtb2R1bGUgaXMgY291cGxlZCB3aXRoIHRoZQUBIHNlc3Npb24gaGlzdG9yaWNhbCBtb2R1bGUgdG8gcHJvdmUgdGhhdCBhIGdpdmVuIGF1dGhvcml0eSBrZXkgaXMNASB0aWVkIHRvIGEgZ2l2ZW4gc3Rha2luZyBpZGVudGl0eSBkdXJpbmcgYSBzcGVjaWZpYyBzZXNzaW9uLiBQcm9vZnMRASBvZiBrZXkgb3duZXJzaGlwIGFyZSBuZWNlc3NhcnkgZm9yIHN1Ym1pdHRpbmcgZXF1aXZvY2F0aW9uIHJlcG9ydHMuEQEgTk9URTogZXZlbiB0aG91Z2ggdGhlIEFQSSB0YWtlcyBhIGBzZXRfaWRgIGFzIHBhcmFtZXRlciB0aGUgY3VycmVudAkBIGltcGxlbWVudGF0aW9ucyBpZ25vcmVzIHRoaXMgcGFyYW1ldGVyIGFuZCBpbnN0ZWFkIHJlbGllcyBvbiB0aGlzDQEgbWV0aG9kIGJlaW5nIGNhbGxlZCBhdCB0aGUgY29ycmVjdCBibG9jayBoZWlnaHQsIGkuZS4gYW55IHBvaW50IGF0FQEgd2hpY2ggdGhlIGdpdmVuIHNldCBpZCBpcyBsaXZlIG9uLWNoYWluLiBGdXR1cmUgaW1wbGVtZW50YXRpb25zIHdpbGwNASBpbnN0ZWFkIHVzZSBpbmRleGVkIGRhdGEgdGhyb3VnaCBhbiBvZmZjaGFpbiB3b3JrZXIsIG5vdCByZXF1aXJpbmd4IG9sZGVyIHN0YXRlcyB0byBiZSBhdmFpbGFibGUuBIAgQVBJIG5lY2Vzc2FyeSBmb3IgQkVFRlkgdm90ZXJzLhhNbXJBcGkUIG1tcl9yb290AJ0PBIwgUmV0dXJuIHRoZSBvbi1jaGFpbiBNTVIgcm9vdCBoYXNoLjhtbXJfbGVhZl9jb3VudAClDwS4IFJldHVybiB0aGUgbnVtYmVyIG9mIE1NUiBibG9ja3MgaW4gdGhlIGNoYWluLjhnZW5lcmF0ZV9wcm9vZgg0YmxvY2tfbnVtYmVyc8EBXGJlc3Rfa25vd25fYmxvY2tfbnVtYmVyPQKpDwhpASBHZW5lcmF0ZSBNTVIgcHJvb2YgZm9yIGEgc2VyaWVzIG9mIGJsb2NrIG51bWJlcnMuIElmIGBiZXN0X2tub3duX2Jsb2NrX251bWJlciA9IFNvbWUobilgLEUBIHVzZSBoaXN0b3JpY2FsIE1NUiBzdGF0ZSBhdCBnaXZlbiBibG9jayBoZWlnaHQgYG5gLiBFbHNlLCB1c2UgY3VycmVudCBNTVIgc3RhdGUuMHZlcmlmeV9wcm9vZggYbGVhdmVzsQ8UcHJvb2a5D70PFPQgVmVyaWZ5IE1NUiBwcm9vZiBhZ2FpbnN0IG9uLWNoYWluIE1NUiBmb3IgYSBiYXRjaCBvZiBsZWF2ZXMuAHEBIE5vdGUgdGhpcyBmdW5jdGlvbiB3aWxsIHVzZSBvbi1jaGFpbiBNTVIgcm9vdCBoYXNoIGFuZCBjaGVjayBpZiB0aGUgcHJvb2YgbWF0Y2hlcyB0aGUgaGFzaC5tASBOb3RlLCB0aGUgbGVhdmVzIHNob3VsZCBiZSBzb3J0ZWQgc3VjaCB0aGF0IGNvcnJlc3BvbmRpbmcgbGVhdmVzIGFuZCBsZWFmIGluZGljZXMgaGF2ZSB0aGWVASBzYW1lIHBvc2l0aW9uIGluIGJvdGggdGhlIGBsZWF2ZXNgIHZlY3RvciBhbmQgdGhlIGBsZWFmX2luZGljZXNgIHZlY3RvciBjb250YWluZWQgaW4gdGhlIFtMZWFmUHJvb2ZdWHZlcmlmeV9wcm9vZl9zdGF0ZWxlc3MMEHJvb3Q0GGxlYXZlc7EPFHByb29muQ+9DxwBASBWZXJpZnkgTU1SIHByb29mIGFnYWluc3QgZ2l2ZW4gcm9vdCBoYXNoIGZvciBhIGJhdGNoIG9mIGxlYXZlcy4A/CBOb3RlIHRoaXMgZnVuY3Rpb24gZG9lcyBub3QgcmVxdWlyZSBhbnkgb24tY2hhaW4gc3RvcmFnZSAtIHRoZbwgcHJvb2YgaXMgdmVyaWZpZWQgYWdhaW5zdCBnaXZlbiBNTVIgcm9vdCBoYXNoLgBtASBOb3RlLCB0aGUgbGVhdmVzIHNob3VsZCBiZSBzb3J0ZWQgc3VjaCB0aGF0IGNvcnJlc3BvbmRpbmcgbGVhdmVzIGFuZCBsZWFmIGluZGljZXMgaGF2ZSB0aGWVASBzYW1lIHBvc2l0aW9uIGluIGJvdGggdGhlIGBsZWF2ZXNgIHZlY3RvciBhbmQgdGhlIGBsZWFmX2luZGljZXNgIHZlY3RvciBjb250YWluZWQgaW4gdGhlIFtMZWFmUHJvb2ZdBIQgQVBJIHRvIGludGVyYWN0IHdpdGggTU1SIHBhbGxldC4sQmVlZnlNbXJBcGkITGF1dGhvcml0eV9zZXRfcHJvb2YATQ4E3CBSZXR1cm4gdGhlIGN1cnJlbnRseSBhY3RpdmUgQkVFRlkgYXV0aG9yaXR5IHNldCBwcm9vZi5gbmV4dF9hdXRob3JpdHlfc2V0X3Byb29mAE0OBMggUmV0dXJuIHRoZSBuZXh0L3F1ZXVlZCBCRUVGWSBhdXRob3JpdHkgc2V0IHByb29mLgSQIEFQSSB1c2VmdWwgZm9yIEJFRUZZIGxpZ2h0IGNsaWVudHMuKEdyYW5kcGFBcGkQTGdyYW5kcGFfYXV0aG9yaXRpZXMAtBg9ASBHZXQgdGhlIGN1cnJlbnQgR1JBTkRQQSBhdXRob3JpdGllcyBhbmQgd2VpZ2h0cy4gVGhpcyBzaG91bGQgbm90IGNoYW5nZSBleGNlcHQdASBmb3Igd2hlbiBjaGFuZ2VzIGFyZSBzY2hlZHVsZWQgYW5kIHRoZSBjb3JyZXNwb25kaW5nIGRlbGF5IGhhcyBwYXNzZWQuADUBIFdoZW4gY2FsbGVkIGF0IGJsb2NrIEIsIGl0IHdpbGwgcmV0dXJuIHRoZSBzZXQgb2YgYXV0aG9yaXRpZXMgdGhhdCBzaG91bGQgYmU9ASB1c2VkIHRvIGZpbmFsaXplIGRlc2NlbmRhbnRzIG9mIHRoaXMgYmxvY2sgKEIrMSwgQisyLCAuLi4pLiBUaGUgYmxvY2sgQiBpdHNlbGbAIGlzIGZpbmFsaXplZCBieSB0aGUgYXV0aG9yaXRpZXMgZnJvbSBibG9jayBCLTEutHN1Ym1pdF9yZXBvcnRfZXF1aXZvY2F0aW9uX3Vuc2lnbmVkX2V4dHJpbnNpYwhIZXF1aXZvY2F0aW9uX3Byb29mEQI8a2V5X293bmVyX3Byb29mlQ9JDyARASBTdWJtaXRzIGFuIHVuc2lnbmVkIGV4dHJpbnNpYyB0byByZXBvcnQgYW4gZXF1aXZvY2F0aW9uLiBUaGUgY2FsbGVy+CBtdXN0IHByb3ZpZGUgdGhlIGVxdWl2b2NhdGlvbiBwcm9vZiBhbmQgYSBrZXkgb3duZXJzaGlwIHByb29m/CAoc2hvdWxkIGJlIG9idGFpbmVkIHVzaW5nIGBnZW5lcmF0ZV9rZXlfb3duZXJzaGlwX3Byb29mYCkuIFRoZQUBIGV4dHJpbnNpYyB3aWxsIGJlIHVuc2lnbmVkIGFuZCBzaG91bGQgb25seSBiZSBhY2NlcHRlZCBmb3IgbG9jYWwVASBhdXRob3JzaGlwIChub3QgdG8gYmUgYnJvYWRjYXN0IHRvIHRoZSBuZXR3b3JrKS4gVGhpcyBtZXRob2QgcmV0dXJucwkBIGBOb25lYCB3aGVuIGNyZWF0aW9uIG9mIHRoZSBleHRyaW5zaWMgZmFpbHMsIGUuZy4gaWYgZXF1aXZvY2F0aW9uBQEgcmVwb3J0aW5nIGlzIGRpc2FibGVkIGZvciB0aGUgZ2l2ZW4gcnVudGltZSAoaS5lLiB0aGlzIG1ldGhvZCBpcwUBIGhhcmRjb2RlZCB0byByZXR1cm4gYE5vbmVgKS4gT25seSB1c2VmdWwgaW4gYW4gb2ZmY2hhaW4gY29udGV4dC5wZ2VuZXJhdGVfa2V5X293bmVyc2hpcF9wcm9vZggYc2V0X2lkMDBhdXRob3JpdHlfaWS8mQ8sCQEgR2VuZXJhdGVzIGEgcHJvb2Ygb2Yga2V5IG93bmVyc2hpcCBmb3IgdGhlIGdpdmVuIGF1dGhvcml0eSBpbiB0aGX8IGdpdmVuIHNldC4gQW4gZXhhbXBsZSB1c2FnZSBvZiB0aGlzIG1vZHVsZSBpcyBjb3VwbGVkIHdpdGggdGhlBQEgc2Vzc2lvbiBoaXN0b3JpY2FsIG1vZHVsZSB0byBwcm92ZSB0aGF0IGEgZ2l2ZW4gYXV0aG9yaXR5IGtleSBpcw0BIHRpZWQgdG8gYSBnaXZlbiBzdGFraW5nIGlkZW50aXR5IGR1cmluZyBhIHNwZWNpZmljIHNlc3Npb24uIFByb29mcxEBIG9mIGtleSBvd25lcnNoaXAgYXJlIG5lY2Vzc2FyeSBmb3Igc3VibWl0dGluZyBlcXVpdm9jYXRpb24gcmVwb3J0cy4RASBOT1RFOiBldmVuIHRob3VnaCB0aGUgQVBJIHRha2VzIGEgYHNldF9pZGAgYXMgcGFyYW1ldGVyIHRoZSBjdXJyZW50/CBpbXBsZW1lbnRhdGlvbnMgaWdub3JlIHRoaXMgcGFyYW1ldGVyIGFuZCBpbnN0ZWFkIHJlbHkgb24gdGhpcw0BIG1ldGhvZCBiZWluZyBjYWxsZWQgYXQgdGhlIGNvcnJlY3QgYmxvY2sgaGVpZ2h0LCBpLmUuIGFueSBwb2ludCBhdBUBIHdoaWNoIHRoZSBnaXZlbiBzZXQgaWQgaXMgbGl2ZSBvbi1jaGFpbi4gRnV0dXJlIGltcGxlbWVudGF0aW9ucyB3aWxsDQEgaW5zdGVhZCB1c2UgaW5kZXhlZCBkYXRhIHRocm91Z2ggYW4gb2ZmY2hhaW4gd29ya2VyLCBub3QgcmVxdWlyaW5neCBvbGRlciBzdGF0ZXMgdG8gYmUgYXZhaWxhYmxlLjhjdXJyZW50X3NldF9pZAAwBJggR2V0IGN1cnJlbnQgR1JBTkRQQSBhdXRob3JpdHkgc2V0IGlkLiQBASBBUElzIGZvciBpbnRlZ3JhdGluZyB0aGUgR1JBTkRQQSBmaW5hbGl0eSBnYWRnZXQgaW50byBydW50aW1lcy7AIFRoaXMgc2hvdWxkIGJlIGltcGxlbWVudGVkIG9uIHRoZSBydW50aW1lIHNpZGUuABUBIFRoaXMgaXMgcHJpbWFyaWx5IHVzZWQgZm9yIG5lZ290aWF0aW5nIGF1dGhvcml0eS1zZXQgY2hhbmdlcyBmb3IgdGhlDQEgZ2FkZ2V0LiBHUkFORFBBIHVzZXMgYSBzaWduYWxpbmcgbW9kZWwgb2YgY2hhbmdpbmcgYXV0aG9yaXR5IHNldHM6MQEgY2hhbmdlcyBzaG91bGQgYmUgc2lnbmFsZWQgd2l0aCBhIGRlbGF5IG9mIE4gYmxvY2tzLCBhbmQgdGhlbiBhdXRvbWF0aWNhbGx55CBhcHBsaWVkIGluIHRoZSBydW50aW1lIGFmdGVyIHRob3NlIE4gYmxvY2tzIGhhdmUgcGFzc2VkLgD8IFRoZSBjb25zZW5zdXMgcHJvdG9jb2wgd2lsbCBjb29yZGluYXRlIHRoZSBoYW5kb2ZmIGV4dGVybmFsbHkuHEJhYmVBcGkYNGNvbmZpZ3VyYXRpb24AwQ8EjCBSZXR1cm4gdGhlIGNvbmZpZ3VyYXRpb24gZm9yIEJBQkUuTGN1cnJlbnRfZXBvY2hfc3RhcnQAgQEExCBSZXR1cm5zIHRoZSBzbG90IHRoYXQgc3RhcnRlZCB0aGUgY3VycmVudCBlcG9jaC40Y3VycmVudF9lcG9jaADFDwTEIFJldHVybnMgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoZSBjdXJyZW50IGVwb2NoLihuZXh0X2Vwb2NoAMUPCAEBIFJldHVybnMgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoZSBuZXh0IGVwb2NoICh3aGljaCB3YXMgYWxyZWFkeVwgcHJldmlvdXNseSBhbm5vdW5jZWQpLnBnZW5lcmF0ZV9rZXlfb3duZXJzaGlwX3Byb29mCBBzbG90gQEwYXV0aG9yaXR5X2lkfQHJDywJASBHZW5lcmF0ZXMgYSBwcm9vZiBvZiBrZXkgb3duZXJzaGlwIGZvciB0aGUgZ2l2ZW4gYXV0aG9yaXR5IGluIHRoZQ0BIGN1cnJlbnQgZXBvY2guIEFuIGV4YW1wbGUgdXNhZ2Ugb2YgdGhpcyBtb2R1bGUgaXMgY291cGxlZCB3aXRoIHRoZQUBIHNlc3Npb24gaGlzdG9yaWNhbCBtb2R1bGUgdG8gcHJvdmUgdGhhdCBhIGdpdmVuIGF1dGhvcml0eSBrZXkgaXMNASB0aWVkIHRvIGEgZ2l2ZW4gc3Rha2luZyBpZGVudGl0eSBkdXJpbmcgYSBzcGVjaWZpYyBzZXNzaW9uLiBQcm9vZnMRASBvZiBrZXkgb3duZXJzaGlwIGFyZSBuZWNlc3NhcnkgZm9yIHN1Ym1pdHRpbmcgZXF1aXZvY2F0aW9uIHJlcG9ydHMuCQEgTk9URTogZXZlbiB0aG91Z2ggdGhlIEFQSSB0YWtlcyBhIGBzbG90YCBhcyBwYXJhbWV0ZXIgdGhlIGN1cnJlbnQJASBpbXBsZW1lbnRhdGlvbnMgaWdub3JlcyB0aGlzIHBhcmFtZXRlciBhbmQgaW5zdGVhZCByZWxpZXMgb24gdGhpcw0BIG1ldGhvZCBiZWluZyBjYWxsZWQgYXQgdGhlIGNvcnJlY3QgYmxvY2sgaGVpZ2h0LCBpLmUuIGFueSBwb2ludCBhdPAgd2hpY2ggdGhlIGVwb2NoIGZvciB0aGUgZ2l2ZW4gc2xvdCBpcyBsaXZlIG9uLWNoYWluLiBGdXR1cmUJASBpbXBsZW1lbnRhdGlvbnMgd2lsbCBpbnN0ZWFkIHVzZSBpbmRleGVkIGRhdGEgdGhyb3VnaCBhbiBvZmZjaGFpbtAgd29ya2VyLCBub3QgcmVxdWlyaW5nIG9sZGVyIHN0YXRlcyB0byBiZSBhdmFpbGFibGUutHN1Ym1pdF9yZXBvcnRfZXF1aXZvY2F0aW9uX3Vuc2lnbmVkX2V4dHJpbnNpYwhIZXF1aXZvY2F0aW9uX3Byb29mdQE8a2V5X293bmVyX3Byb29mzQ9JDyARASBTdWJtaXRzIGFuIHVuc2lnbmVkIGV4dHJpbnNpYyB0byByZXBvcnQgYW4gZXF1aXZvY2F0aW9uLiBUaGUgY2FsbGVy+CBtdXN0IHByb3ZpZGUgdGhlIGVxdWl2b2NhdGlvbiBwcm9vZiBhbmQgYSBrZXkgb3duZXJzaGlwIHByb29m/CAoc2hvdWxkIGJlIG9idGFpbmVkIHVzaW5nIGBnZW5lcmF0ZV9rZXlfb3duZXJzaGlwX3Byb29mYCkuIFRoZQUBIGV4dHJpbnNpYyB3aWxsIGJlIHVuc2lnbmVkIGFuZCBzaG91bGQgb25seSBiZSBhY2NlcHRlZCBmb3IgbG9jYWwVASBhdXRob3JzaGlwIChub3QgdG8gYmUgYnJvYWRjYXN0IHRvIHRoZSBuZXR3b3JrKS4gVGhpcyBtZXRob2QgcmV0dXJucwkBIGBOb25lYCB3aGVuIGNyZWF0aW9uIG9mIHRoZSBleHRyaW5zaWMgZmFpbHMsIGUuZy4gaWYgZXF1aXZvY2F0aW9uBQEgcmVwb3J0aW5nIGlzIGRpc2FibGVkIGZvciB0aGUgZ2l2ZW4gcnVudGltZSAoaS5lLiB0aGlzIG1ldGhvZCBpcwUBIGhhcmRjb2RlZCB0byByZXR1cm4gYE5vbmVgKS4gT25seSB1c2VmdWwgaW4gYW4gb2ZmY2hhaW4gY29udGV4dC4EuCBBUEkgbmVjZXNzYXJ5IGZvciBibG9jayBhdXRob3JzaGlwIHdpdGggQkFCRS5UQXV0aG9yaXR5RGlzY292ZXJ5QXBpBCxhdXRob3JpdGllcwCpCQQZASBSZXRyaWV2ZSBhdXRob3JpdHkgaWRlbnRpZmllcnMgb2YgdGhlIGN1cnJlbnQgYW5kIG5leHQgYXV0aG9yaXR5IHNldC4QdCBUaGUgYXV0aG9yaXR5IGRpc2NvdmVyeSBhcGkuAFEBIFRoaXMgYXBpIGlzIHVzZWQgYnkgdGhlIGBjbGllbnQvYXV0aG9yaXR5LWRpc2NvdmVyeWAgbW9kdWxlIHRvIHJldHJpZXZlIGlkZW50aWZpZXJznCBvZiB0aGUgY3VycmVudCBhbmQgbmV4dCBhdXRob3JpdHkgc2V0LixTZXNzaW9uS2V5cwhUZ2VuZXJhdGVfc2Vzc2lvbl9rZXlzBBBzZWVk+Q04HBUBIEdlbmVyYXRlIGEgc2V0IG9mIHNlc3Npb24ga2V5cyB3aXRoIG9wdGlvbmFsbHkgdXNpbmcgdGhlIGdpdmVuIHNlZWQuCQEgVGhlIGtleXMgc2hvdWxkIGJlIHN0b3JlZCB3aXRoaW4gdGhlIGtleXN0b3JlIGV4cG9zZWQgdmlhIHJ1bnRpbWU8IGV4dGVybmFsaXRpZXMuALAgVGhlIHNlZWQgbmVlZHMgdG8gYmUgYSB2YWxpZCBgdXRmOGAgc3RyaW5nLgDQIFJldHVybnMgdGhlIGNvbmNhdGVuYXRlZCBTQ0FMRSBlbmNvZGVkIHB1YmxpYyBrZXlzLkxkZWNvZGVfc2Vzc2lvbl9rZXlzBBxlbmNvZGVkONEPDJggRGVjb2RlIHRoZSBnaXZlbiBwdWJsaWMgc2Vzc2lvbiBrZXlzLgDcIFJldHVybnMgdGhlIGxpc3Qgb2YgcHVibGljIHJhdyBwdWJsaWMga2V5cyArIGtleSB0eXBlLgRoIFNlc3Npb24ga2V5cyBydW50aW1lIGFwaS48QWNjb3VudE5vbmNlQXBpBDRhY2NvdW50X25vbmNlBBxhY2NvdW50ABAEwCBHZXQgY3VycmVudCBhY2NvdW50IG5vbmNlIG9mIGdpdmVuIGBBY2NvdW50SWRgLgSAIFRoZSBBUEkgdG8gcXVlcnkgYWNjb3VudCBub25jZS5UVHJhbnNhY3Rpb25QYXltZW50QXBpEChxdWVyeV9pbmZvCAx1eHSRDgxsZW4Q3Q8ARHF1ZXJ5X2ZlZV9kZXRhaWxzCAx1eHSRDgxsZW4Q4Q8ATHF1ZXJ5X3dlaWdodF90b19mZWUEGHdlaWdodCgYAExxdWVyeV9sZW5ndGhfdG9fZmVlBBhsZW5ndGgQGAAAZFRyYW5zYWN0aW9uUGF5bWVudENhbGxBcGkQPHF1ZXJ5X2NhbGxfaW5mbwgQY2FsbF0BDGxlbhDdDwRJASBRdWVyeSBpbmZvcm1hdGlvbiBvZiBhIGRpc3BhdGNoIGNsYXNzLCB3ZWlnaHQsIGFuZCBmZWUgb2YgYSBnaXZlbiBlbmNvZGVkIGBDYWxsYC5YcXVlcnlfY2FsbF9mZWVfZGV0YWlscwgQY2FsbF0BDGxlbhDhDwS0IFF1ZXJ5IGZlZSBkZXRhaWxzIG9mIGEgZ2l2ZW4gZW5jb2RlZCBgQ2FsbGAuTHF1ZXJ5X3dlaWdodF90b19mZWUEGHdlaWdodCgYBAEBIFF1ZXJ5IHRoZSBvdXRwdXQgb2YgdGhlIGN1cnJlbnQgYFdlaWdodFRvRmVlYCBnaXZlbiBzb21lIGlucHV0LkxxdWVyeV9sZW5ndGhfdG9fZmVlBBhsZW5ndGgQGAQBASBRdWVyeSB0aGUgb3V0cHV0IG9mIHRoZSBjdXJyZW50IGBMZW5ndGhUb0ZlZWAgZ2l2ZW4gc29tZSBpbnB1dC4ANFhjbVBheW1lbnRBcGkQfHF1ZXJ5X2FjY2VwdGFibGVfcGF5bWVudF9hc3NldHMELHhjbV92ZXJzaW9uEO0PFLQgUmV0dXJucyBhIGxpc3Qgb2YgYWNjZXB0YWJsZSBwYXltZW50IGFzc2V0cy4AMCAjIEFyZ3VtZW50cwBoICogYHhjbV92ZXJzaW9uYDogVmVyc2lvbi5AcXVlcnlfeGNtX3dlaWdodAQcbWVzc2FnZdkF+Q8UqCBSZXR1cm5zIGEgd2VpZ2h0IG5lZWRlZCB0byBleGVjdXRlIGEgWENNLgAwICMgQXJndW1lbnRzAHQgKiBgbWVzc2FnZWA6IGBWZXJzaW9uZWRYY21gLmRxdWVyeV93ZWlnaHRfdG9fYXNzZXRfZmVlCBh3ZWlnaHQoFGFzc2V0DQf9DxjoIENvbnZlcnRzIGEgd2VpZ2h0IGludG8gYSBmZWUgZm9yIHRoZSBzcGVjaWZpZWQgYEFzc2V0SWRgLgAwICMgQXJndW1lbnRzAIggKiBgd2VpZ2h0YDogY29udmVydGlibGUgYFdlaWdodGAufCAqIGBhc3NldGA6IGBWZXJzaW9uZWRBc3NldElkYC5McXVlcnlfZGVsaXZlcnlfZmVlcwgsZGVzdGluYXRpb24tARxtZXNzYWdl2QUBECAdASBHZXQgZGVsaXZlcnkgZmVlcyBmb3Igc2VuZGluZyBhIHNwZWNpZmljIGBtZXNzYWdlYCB0byBhIGBkZXN0aW5hdGlvbmAu9CBUaGVzZSBhbHdheXMgY29tZSBpbiBhIHNwZWNpZmljIGFzc2V0LCBkZWZpbmVkIGJ5IHRoZSBjaGFpbi4AMCAjIEFyZ3VtZW50c4EBICogYG1lc3NhZ2VgOiBUaGUgbWVzc2FnZSB0aGF0J2xsIGJlIHNlbnQsIG5lY2Vzc2FyeSBiZWNhdXNlIG1vc3QgZGVsaXZlcnkgZmVlcyBhcmUgYmFzZWQgb24gdGhlXCAgIHNpemUgb2YgdGhlIG1lc3NhZ2UuYQEgKiBgZGVzdGluYXRpb25gOiBUaGUgZGVzdGluYXRpb24gdG8gc2VuZCB0aGUgbWVzc2FnZSB0by4gRGlmZmVyZW50IGRlc3RpbmF0aW9ucyBtYXkgdXNlwCAgIGRpZmZlcmVudCBzZW5kZXJzIHRoYXQgY2hhcmdlIGRpZmZlcmVudCBmZWVzLixwIEEgdHJhaXQgb2YgWENNIHBheW1lbnQgQVBJLgCoIEFQSSBwcm92aWRlcyBmdW5jdGlvbmFsaXR5IGZvciBvYnRhaW5pbmc6AMQgKiB0aGUgd2VpZ2h0IHJlcXVpcmVkIHRvIGV4ZWN1dGUgYW4gWENNIG1lc3NhZ2UsBQEgKiBhIGxpc3Qgb2YgYWNjZXB0YWJsZSBgQXNzZXRJZGBzIGZvciBtZXNzYWdlIGV4ZWN1dGlvbiBwYXltZW50LAEBICogdGhlIGNvc3Qgb2YgdGhlIHdlaWdodCBpbiB0aGUgc3BlY2lmaWVkIGFjY2VwdGFibGUgYEFzc2V0SWRgLqAgKiB0aGUgZmVlcyBmb3IgYW4gWENNIG1lc3NhZ2UgZGVsaXZlcnkuAPAgVG8gZGV0ZXJtaW5lIHRoZSBleGVjdXRpb24gd2VpZ2h0IG9mIHRoZSBjYWxscyByZXF1aXJlZCBmb3J1ASBbYHhjbTo6bGF0ZXN0OjpJbnN0cnVjdGlvbjo6VHJhbnNhY3RgXSBpbnN0cnVjdGlvbiwgYFRyYW5zYWN0aW9uUGF5bWVudENhbGxBcGlgIGNhbiBiZSB1c2VkLiREcnlSdW5BcGkIMGRyeV9ydW5fY2FsbAgYb3JpZ2luWQIQY2FsbF0BBRAEOCBEcnkgcnVuIGNhbGwuLGRyeV9ydW5feGNtCDxvcmlnaW5fbG9jYXRpb24tAQx4Y23dBiUQBFAgRHJ5IHJ1biBYQ00gcHJvZ3JhbSSxASBBUEkgZm9yIGRyeS1ydW5uaW5nIGV4dHJpbnNpY3MgYW5kIFhDTSBwcm9ncmFtcyB0byBnZXQgdGhlIHByb2dyYW1zIHRoYXQgbmVlZCB0byBiZSBwYXNzZWQgdG8gdGhlIGZlZXMgQVBJLgCBASBBbGwgY2FsbHMgcmV0dXJuIGEgdmVjdG9yIG9mIHR1cGxlcyAobG9jYXRpb24sIHhjbSkgd2hlcmUgZWFjaCAieGNtIiBpcyBleGVjdXRlZCBpbiAibG9jYXRpb24iLuQgSWYgdGhlcmUncyBsb2NhbCBleGVjdXRpb24sIHRoZSBsb2NhdGlvbiB3aWxsIGJlICJIZXJlIi4dASBUaGlzIHZlY3RvciBjYW4gYmUgdXNlZCB0byBjYWxjdWxhdGUgYm90aCBleGVjdXRpb24gYW5kIGRlbGl2ZXJ5IGZlZXMuAJkBIENhbGxzIG9yIFhDTXMgbWlnaHQgZmFpbCB3aGVuIGV4ZWN1dGVkLCB0aGlzIGRvZXNuJ3QgbWVhbiB0aGUgcmVzdWx0IG9mIHRoZXNlIGNhbGxzIHdpbGwgYmUgYW4gYEVycmAuZQEgSW4gdGhvc2UgY2FzZXMsIHRoZXJlIG1pZ2h0IHN0aWxsIGJlIGEgdmFsaWQgcmVzdWx0LCB3aXRoIHRoZSBleGVjdXRpb24gZXJyb3IgaW5zaWRlIGl0LmUBIFRoZSBvbmx5IHJlYXNvbnMgd2h5IHRoZXNlIGNhbGxzIG1pZ2h0IHJldHVybiBhbiBlcnJvciBhcmUgbGlzdGVkIGluIHRoZSBbYEVycm9yYF0gZW51bS5QTG9jYXRpb25Ub0FjY291bnRBcGkEQGNvbnZlcnRfbG9jYXRpb24EIGxvY2F0aW9uLQEtEASQIENvbnZlcnRzIGBMb2NhdGlvbmAgdG8gYEFjY291bnRJZGAuBA0BIEFQSSBmb3IgdXNlZnVsIGNvbnZlcnNpb25zIGJldHdlZW4gWENNIGBMb2NhdGlvbmAgYW5kIGBBY2NvdW50SWRgLkhOb21pbmF0aW9uUG9vbHNBcGkcPHBlbmRpbmdfcmV3YXJkcwQMd2hvABgENQEgUmV0dXJucyB0aGUgcGVuZGluZyByZXdhcmRzIGZvciB0aGUgbWVtYmVyIHRoYXQgdGhlIEFjY291bnRJZCB3YXMgZ2l2ZW4gZm9yLkRwb2ludHNfdG9fYmFsYW5jZQgccG9vbF9pZBAYcG9pbnRzGBgE9CBSZXR1cm5zIHRoZSBlcXVpdmFsZW50IGJhbGFuY2Ugb2YgYHBvaW50c2AgZm9yIGEgZ2l2ZW4gcG9vbC5EYmFsYW5jZV90b19wb2ludHMIHHBvb2xfaWQQJG5ld19mdW5kcxgYBPwgUmV0dXJucyB0aGUgZXF1aXZhbGVudCBwb2ludHMgb2YgYG5ld19mdW5kc2AgZm9yIGEgZ2l2ZW4gcG9vbC5IcG9vbF9wZW5kaW5nX3NsYXNoBBxwb29sX2lkEBgEsCBSZXR1cm5zIHRoZSBwZW5kaW5nIHNsYXNoIGZvciBhIGdpdmVuIHBvb2wuUG1lbWJlcl9wZW5kaW5nX3NsYXNoBBhtZW1iZXIAGATMIFJldHVybnMgdGhlIHBlbmRpbmcgc2xhc2ggZm9yIGEgZ2l2ZW4gcG9vbCBtZW1iZXIudHBvb2xfbmVlZHNfZGVsZWdhdGVfbWlncmF0aW9uBBxwb29sX2lkECAg5CBSZXR1cm5zIHRydWUgaWYgdGhlIHBvb2wgd2l0aCBgcG9vbF9pZGAgbmVlZHMgbWlncmF0aW9uLgBJASBUaGlzIGNhbiBoYXBwZW4gd2hlbiB0aGUgYHBhbGxldC1ub21pbmF0aW9uLXBvb2xzYCBoYXMgc3dpdGNoZWQgdG8gdXNpbmcgc3RyYXRlZ3lBASBbYERlbGVnYXRlU3Rha2VgXShwYWxsZXRfbm9taW5hdGlvbl9wb29sczo6YWRhcHRlcjo6RGVsZWdhdGVTdGFrZSkgYnV0IHRoZSBwb29s6CBzdGlsbCBoYXMgZnVuZHMgdGhhdCB3ZXJlIHN0YWtlZCB1c2luZyB0aGUgb2xkZXIgc3RyYXRlZ3kZASBbVHJhbnNmZXJTdGFrZV0ocGFsbGV0X25vbWluYXRpb25fcG9vbHM6OmFkYXB0ZXI6OlRyYW5zZmVyU3Rha2UpLiBVc2WJASBbYG1pZ3JhdGVfcG9vbF90b19kZWxlZ2F0ZV9zdGFrZWBdKHBhbGxldF9ub21pbmF0aW9uX3Bvb2xzOjpDYWxsOjptaWdyYXRlX3Bvb2xfdG9fZGVsZWdhdGVfc3Rha2UpVCB0byBtaWdyYXRlIHRoZSBwb29sLnxtZW1iZXJfbmVlZHNfZGVsZWdhdGVfbWlncmF0aW9uBBhtZW1iZXIAIBwpASBSZXR1cm5zIHRydWUgaWYgdGhlIGRlbGVnYXRlZCBmdW5kcyBvZiB0aGUgcG9vbCBgbWVtYmVyYCBuZWVkcyBtaWdyYXRpb24uANggT25jZSBhIHBvb2wgaGFzIHN1Y2Nlc3NmdWxseSBtaWdyYXRlZCB0byB0aGUgc3RyYXRlZ3lVASBbYERlbGVnYXRlU3Rha2VgXShwYWxsZXRfbm9taW5hdGlvbl9wb29sczo6YWRhcHRlcjo6RGVsZWdhdGVTdGFrZSksIHRoZSBmdW5kcyBvZiB0aGUZASBtZW1iZXIgY2FuIGJlIG1pZ3JhdGVkIGZyb20gcG9vbCBhY2NvdW50IHRvIHRoZSBtZW1iZXIncyBhY2NvdW50LiBVc2UpASBbYG1pZ3JhdGVfZGVsZWdhdGlvbmBdKHBhbGxldF9ub21pbmF0aW9uX3Bvb2xzOjpDYWxsOjptaWdyYXRlX2RlbGVnYXRpb24ppCB0byBtaWdyYXRlIHRoZSBmdW5kcyBvZiB0aGUgcG9vbCBtZW1iZXIuBPggUnVudGltZSBhcGkgZm9yIGFjY2Vzc2luZyBpbmZvcm1hdGlvbiBhYm91dCBub21pbmF0aW9uIHBvb2xzLihTdGFraW5nQXBpDERub21pbmF0aW9uc19xdW90YQQcYmFsYW5jZRgQBBEBIFJldHVybnMgdGhlIG5vbWluYXRpb25zIHF1b3RhIGZvciBhIG5vbWluYXRvciB3aXRoIGEgZ2l2ZW4gYmFsYW5jZS5cZXJhc19zdGFrZXJzX3BhZ2VfY291bnQIDGVyYRAcYWNjb3VudAAQBDkBIFJldHVybnMgdGhlIHBhZ2UgY291bnQgb2YgZXhwb3N1cmVzIGZvciBhIHZhbGlkYXRvciBgYWNjb3VudGAgaW4gYSBnaXZlbiBlcmEuPHBlbmRpbmdfcmV3YXJkcwgMZXJhEBxhY2NvdW50ACAEPQEgUmV0dXJucyB0cnVlIGlmIHZhbGlkYXRvciBgYWNjb3VudGAgaGFzIHBhZ2VzIHRvIGJlIGNsYWltZWQgZm9yIHRoZSBnaXZlbiBlcmEuADhHZW5lc2lzQnVpbGRlcgwsYnVpbGRfc3RhdGUEEGpzb244NRAkZQEgQnVpbGQgYFJ1bnRpbWVHZW5lc2lzQ29uZmlnYCBmcm9tIGEgSlNPTiBibG9iIG5vdCB1c2luZyBhbnkgZGVmYXVsdHMgYW5kIHN0b3JlIGl0IGluIHRoZSQgc3RvcmFnZS4A+QEgSW4gdGhlIGNhc2Ugb2YgYSBGUkFNRS1iYXNlZCBydW50aW1lLCB0aGlzIGZ1bmN0aW9uIGRlc2VyaWFsaXplcyB0aGUgZnVsbCBgUnVudGltZUdlbmVzaXNDb25maWdgIGZyb20gdGhlIGdpdmVuIEpTT04gYmxvYiBhbmRZASBwdXRzIGl0IGludG8gdGhlIHN0b3JhZ2UuIElmIHRoZSBwcm92aWRlZCBKU09OIGJsb2IgaXMgaW5jb3JyZWN0IG9yIGluY29tcGxldGUgb3IgdGhltCBkZXNlcmlhbGl6YXRpb24gZmFpbHMsIGFuIGVycm9yIGlzIHJldHVybmVkLgBdASBQbGVhc2Ugbm90ZSB0aGF0IHByb3ZpZGVkIEpTT04gYmxvYiBtdXN0IGNvbnRhaW4gYWxsIGBSdW50aW1lR2VuZXNpc0NvbmZpZ2AgZmllbGRzLCBub1wgZGVmYXVsdHMgd2lsbCBiZSB1c2VkLihnZXRfcHJlc2V0BAhpZDkQ+Q04YQEgUmV0dXJucyBhIEpTT04gYmxvYiByZXByZXNlbnRhdGlvbiBvZiB0aGUgYnVpbHQtaW4gYFJ1bnRpbWVHZW5lc2lzQ29uZmlnYCBpZGVudGlmaWVkIGJ5GCBgaWRgLgA9ASBJZiBgaWRgIGlzIGBOb25lYCB0aGUgZnVuY3Rpb24gcmV0dXJucyBKU09OIGJsb2IgcmVwcmVzZW50YXRpb24gb2YgdGhlIGRlZmF1bHRJASBgUnVudGltZUdlbmVzaXNDb25maWdgIHN0cnVjdCBvZiB0aGUgcnVudGltZS4gSW1wbGVtZW50YXRpb24gbXVzdCBwcm92aWRlIGRlZmF1bHRgIGBSdW50aW1lR2VuZXNpc0NvbmZpZ2AuACEBIE90aGVyd2lzZSBmdW5jdGlvbiByZXR1cm5zIGEgSlNPTiByZXByZXNlbnRhdGlvbiBvZiB0aGUgYnVpbHQtaW4sIG5hbWVkUQEgYFJ1bnRpbWVHZW5lc2lzQ29uZmlnYCBwcmVzZXQgaWRlbnRpZmllZCBieSBgaWRgLCBvciBgTm9uZWAgaWYgc3VjaCBwcmVzZXQgZG9lcyBub3RlASBleGlzdHMuIFJldHVybmVkIGBWZWM8dTg+YCBjb250YWlucyBieXRlcyBvZiBKU09OIGJsb2IgKHBhdGNoKSB3aGljaCBjb21wcmlzZXMgYSBsaXN0IG9mTQEgKHBvdGVudGlhbGx5IG5lc3RlZCkga2V5LXZhbHVlIHBhaXJzIHRoYXQgYXJlIGludGVuZGVkIGZvciBjdXN0b21pemluZyB0aGUgZGVmYXVsdGUBIHJ1bnRpbWUgZ2VuZXNpcyBjb25maWcuIFRoZSBwYXRjaCBzaGFsbCBiZSBtZXJnZWQgKHJmYzczODYpIHdpdGggdGhlIEpTT04gcmVwcmVzZW50YXRpb25hASBvZiB0aGUgZGVmYXVsdCBgUnVudGltZUdlbmVzaXNDb25maWdgIHRvIGNyZWF0ZSBhIGNvbXByZWhlbnNpdmUgZ2VuZXNpcyBjb25maWcgdGhhdCBjYW6EIGJlIHVzZWQgaW4gYGJ1aWxkX3N0YXRlYCBtZXRob2QuMHByZXNldF9uYW1lcwA9EBBRASBSZXR1cm5zIGEgbGlzdCBvZiBpZGVudGlmaWVycyBmb3IgYXZhaWxhYmxlIGJ1aWx0aW4gYFJ1bnRpbWVHZW5lc2lzQ29uZmlnYCBwcmVzZXRzLgBhASBUaGUgcHJlc2V0cyBmcm9tIHRoZSBsaXN0IGNhbiBiZSBxdWVyaWVkIHdpdGggW2BHZW5lc2lzQnVpbGRlcjo6Z2V0X3ByZXNldGBdIG1ldGhvZC4gSWYBASBubyBuYW1lZCBwcmVzZXRzIGFyZSBwcm92aWRlZCBieSB0aGUgcnVudGltZSB0aGUgbGlzdCBpcyBlbXB0eS4E6CBBUEkgdG8gaW50ZXJhY3Qgd2l0aCBSdW50aW1lR2VuZXNpc0NvbmZpZyBmb3IgdGhlIHJ1bnRpbWVdAVRBEAA="; + ksm_metadata_default = binMeta2; + } +}); + +// .papi/descriptors/src/paseo_metadata.ts +var paseo_metadata_exports = {}; +__export(paseo_metadata_exports, { + default: () => paseo_metadata_default +}); +var binMeta3, paseo_metadata_default; +var init_paseo_metadata = __esm({ + ".papi/descriptors/src/paseo_metadata.ts"() { + binMeta3 = "bWV0YQ81DwAMHHNwX2NvcmUYY3J5cHRvLEFjY291bnRJZDMyAAAEAAQBIFt1ODsgMzJdAAAEAAADIAAAAAgACAAABQMADAgwZnJhbWVfc3lzdGVtLEFjY291bnRJbmZvCBROb25jZQEQLEFjY291bnREYXRhARQAFAEUbm9uY2UQARROb25jZQABJGNvbnN1bWVycxABIFJlZkNvdW50AAEkcHJvdmlkZXJzEAEgUmVmQ291bnQAASxzdWZmaWNpZW50cxABIFJlZkNvdW50AAEQZGF0YRQBLEFjY291bnREYXRhAAAQAAAFBQAUDDxwYWxsZXRfYmFsYW5jZXMUdHlwZXMsQWNjb3VudERhdGEEHEJhbGFuY2UBGAAQARBmcmVlGAEcQmFsYW5jZQABIHJlc2VydmVkGAEcQmFsYW5jZQABGGZyb3plbhgBHEJhbGFuY2UAARRmbGFncxwBKEV4dHJhRmxhZ3MAABgAAAUHABwMPHBhbGxldF9iYWxhbmNlcxR0eXBlcyhFeHRyYUZsYWdzAAAEABgBEHUxMjgAACAAAAUAACQMNGZyYW1lX3N1cHBvcnQgZGlzcGF0Y2hAUGVyRGlzcGF0Y2hDbGFzcwQEVAEoAAwBGG5vcm1hbCgBBFQAASxvcGVyYXRpb25hbCgBBFQAASRtYW5kYXRvcnkoAQRUAAAoDChzcF93ZWlnaHRzJHdlaWdodF92MhhXZWlnaHQAAAgBIHJlZl90aW1lLAEMdTY0AAEocHJvb2Zfc2l6ZSwBDHU2NAAALAAABjAAMAAABQYANAg8cHJpbWl0aXZlX3R5cGVzEEgyNTYAAAQABAEgW3U4OyAzMl0AADgAAAIIADwQKHNwX3J1bnRpbWUcZ2VuZXJpYxhkaWdlc3QYRGlnZXN0AAAEARBsb2dzQAE8VmVjPERpZ2VzdEl0ZW0+AABAAAACRABEEChzcF9ydW50aW1lHGdlbmVyaWMYZGlnZXN0KERpZ2VzdEl0ZW0AARQoUHJlUnVudGltZQgASAFEQ29uc2Vuc3VzRW5naW5lSWQAADgBHFZlYzx1OD4ABgAkQ29uc2Vuc3VzCABIAURDb25zZW5zdXNFbmdpbmVJZAAAOAEcVmVjPHU4PgAEABBTZWFsCABIAURDb25zZW5zdXNFbmdpbmVJZAAAOAEcVmVjPHU4PgAFABRPdGhlcgQAOAEcVmVjPHU4PgAAAGRSdW50aW1lRW52aXJvbm1lbnRVcGRhdGVkAAgAAEgAAAMEAAAACABMAAACUABQCDBmcmFtZV9zeXN0ZW0sRXZlbnRSZWNvcmQIBEUBVARUATQADAEUcGhhc2XVBwEUUGhhc2UAARRldmVudFQBBEUAARh0b3BpY3OVAQEYVmVjPFQ+AABUCDRwYXNlb19ydW50aW1lMFJ1bnRpbWVFdmVudAABpBhTeXN0ZW0EAFgBcGZyYW1lX3N5c3RlbTo6RXZlbnQ8UnVudGltZT4AAAAkU2NoZWR1bGVyBAB8AYBwYWxsZXRfc2NoZWR1bGVyOjpFdmVudDxSdW50aW1lPgABACBQcmVpbWFnZQQAkAF8cGFsbGV0X3ByZWltYWdlOjpFdmVudDxSdW50aW1lPgAKABxJbmRpY2VzBACUAXhwYWxsZXRfaW5kaWNlczo6RXZlbnQ8UnVudGltZT4ABAAgQmFsYW5jZXMEAJgBfHBhbGxldF9iYWxhbmNlczo6RXZlbnQ8UnVudGltZT4ABQBIVHJhbnNhY3Rpb25QYXltZW50BACgAahwYWxsZXRfdHJhbnNhY3Rpb25fcGF5bWVudDo6RXZlbnQ8UnVudGltZT4AIAAcU3Rha2luZwQApAF4cGFsbGV0X3N0YWtpbmc6OkV2ZW50PFJ1bnRpbWU+AAcAIE9mZmVuY2VzBAC8AVhwYWxsZXRfb2ZmZW5jZXM6OkV2ZW50AAgAHFNlc3Npb24EAMQBVHBhbGxldF9zZXNzaW9uOjpFdmVudAAJABxHcmFuZHBhBADIAVRwYWxsZXRfZ3JhbmRwYTo6RXZlbnQACwAgVHJlYXN1cnkEANgBfHBhbGxldF90cmVhc3VyeTo6RXZlbnQ8UnVudGltZT4AEwBAQ29udmljdGlvblZvdGluZwQAZQEBoHBhbGxldF9jb252aWN0aW9uX3ZvdGluZzo6RXZlbnQ8UnVudGltZT4AFAAkUmVmZXJlbmRhBABpAQGAcGFsbGV0X3JlZmVyZW5kYTo6RXZlbnQ8UnVudGltZT4AFQAkV2hpdGVsaXN0BAARBwGAcGFsbGV0X3doaXRlbGlzdDo6RXZlbnQ8UnVudGltZT4AFwAoUGFyYW1ldGVycwQAJQcBhHBhbGxldF9wYXJhbWV0ZXJzOjpFdmVudDxSdW50aW1lPgAbABhDbGFpbXMEAD0HAVhjbGFpbXM6OkV2ZW50PFJ1bnRpbWU+ABgAHFZlc3RpbmcEAEEHAXhwYWxsZXRfdmVzdGluZzo6RXZlbnQ8UnVudGltZT4AGQAcVXRpbGl0eQQARQcBVHBhbGxldF91dGlsaXR5OjpFdmVudAAaABRQcm94eQQASQcBcHBhbGxldF9wcm94eTo6RXZlbnQ8UnVudGltZT4AHQAgTXVsdGlzaWcEAE0HAXxwYWxsZXRfbXVsdGlzaWc6OkV2ZW50PFJ1bnRpbWU+AB4AIEJvdW50aWVzBABRBwF8cGFsbGV0X2JvdW50aWVzOjpFdmVudDxSdW50aW1lPgAiADRDaGlsZEJvdW50aWVzBABVBwGUcGFsbGV0X2NoaWxkX2JvdW50aWVzOjpFdmVudDxSdW50aW1lPgAmAGhFbGVjdGlvblByb3ZpZGVyTXVsdGlQaGFzZQQAWQcB0HBhbGxldF9lbGVjdGlvbl9wcm92aWRlcl9tdWx0aV9waGFzZTo6RXZlbnQ8UnVudGltZT4AJAAkVm90ZXJMaXN0BABpBwH0cGFsbGV0X2JhZ3NfbGlzdDo6RXZlbnQ8UnVudGltZSwgcGFsbGV0X2JhZ3NfbGlzdDo6SW5zdGFuY2UxPgAlADxOb21pbmF0aW9uUG9vbHMEAG0HAZxwYWxsZXRfbm9taW5hdGlvbl9wb29sczo6RXZlbnQ8UnVudGltZT4AJwAsRmFzdFVuc3Rha2UEAHEHAYxwYWxsZXRfZmFzdF91bnN0YWtlOjpFdmVudDxSdW50aW1lPgAoADRQYXJhSW5jbHVzaW9uBAB1BwGQcGFyYWNoYWluc19pbmNsdXNpb246OkV2ZW50PFJ1bnRpbWU+ADUAFFBhcmFzBACFBwFccGFyYWNoYWluc19wYXJhczo6RXZlbnQAOAAQSHJtcAQAiQcBfHBhcmFjaGFpbnNfaHJtcDo6RXZlbnQ8UnVudGltZT4APAA0UGFyYXNEaXNwdXRlcwQAjQcBjHBhcmFjaGFpbnNfZGlzcHV0ZXM6OkV2ZW50PFJ1bnRpbWU+AD4AIE9uRGVtYW5kBACZBwG0cGFyYWNoYWluc19hc3NpZ25lcl9vbl9kZW1hbmQ6OkV2ZW50PFJ1bnRpbWU+AEAAJFJlZ2lzdHJhcgQAnQcBfHBhcmFzX3JlZ2lzdHJhcjo6RXZlbnQ8UnVudGltZT4ARgAUU2xvdHMEAKEHAVRzbG90czo6RXZlbnQ8UnVudGltZT4ARwAgQXVjdGlvbnMEAKUHAWBhdWN0aW9uczo6RXZlbnQ8UnVudGltZT4ASAAkQ3Jvd2Rsb2FuBACpBwFkY3Jvd2Rsb2FuOjpFdmVudDxSdW50aW1lPgBJACBDb3JldGltZQQArQcBYGNvcmV0aW1lOjpFdmVudDxSdW50aW1lPgBKAEhTdGF0ZVRyaWVNaWdyYXRpb24EALEHAaxwYWxsZXRfc3RhdGVfdHJpZV9taWdyYXRpb246OkV2ZW50PFJ1bnRpbWU+AGIAJFhjbVBhbGxldAQAvQcBaHBhbGxldF94Y206OkV2ZW50PFJ1bnRpbWU+AGMAME1lc3NhZ2VRdWV1ZQQAxQcBkHBhbGxldF9tZXNzYWdlX3F1ZXVlOjpFdmVudDxSdW50aW1lPgBkACRBc3NldFJhdGUEAM0HAYRwYWxsZXRfYXNzZXRfcmF0ZTo6RXZlbnQ8UnVudGltZT4AZQAQU3VkbwQA0QcBbHBhbGxldF9zdWRvOjpFdmVudDxSdW50aW1lPgD/AABYDDBmcmFtZV9zeXN0ZW0YcGFsbGV0FEV2ZW50BARUAAEcQEV4dHJpbnNpY1N1Y2Nlc3MEATRkaXNwYXRjaF9pbmZvXAEwRGlzcGF0Y2hJbmZvAAAEkEFuIGV4dHJpbnNpYyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LjxFeHRyaW5zaWNGYWlsZWQIAThkaXNwYXRjaF9lcnJvcmgBNERpc3BhdGNoRXJyb3IAATRkaXNwYXRjaF9pbmZvXAEwRGlzcGF0Y2hJbmZvAAEEUEFuIGV4dHJpbnNpYyBmYWlsZWQuLENvZGVVcGRhdGVkAAIEUGA6Y29kZWAgd2FzIHVwZGF0ZWQuKE5ld0FjY291bnQEARxhY2NvdW50AAEwVDo6QWNjb3VudElkAAMEaEEgbmV3IGFjY291bnQgd2FzIGNyZWF0ZWQuNEtpbGxlZEFjY291bnQEARxhY2NvdW50AAEwVDo6QWNjb3VudElkAAQEWEFuIGFjY291bnQgd2FzIHJlYXBlZC4gUmVtYXJrZWQIARhzZW5kZXIAATBUOjpBY2NvdW50SWQAARBoYXNoNAEcVDo6SGFzaAAFBHBPbiBvbi1jaGFpbiByZW1hcmsgaGFwcGVuZWQuRFVwZ3JhZGVBdXRob3JpemVkCAEkY29kZV9oYXNoNAEcVDo6SGFzaAABNGNoZWNrX3ZlcnNpb24gARBib29sAAYEaEFuIHVwZ3JhZGUgd2FzIGF1dGhvcml6ZWQuBHBFdmVudCBmb3IgdGhlIFN5c3RlbSBwYWxsZXQuXAw0ZnJhbWVfc3VwcG9ydCBkaXNwYXRjaDBEaXNwYXRjaEluZm8AAAwBGHdlaWdodCgBGFdlaWdodAABFGNsYXNzYAE0RGlzcGF0Y2hDbGFzcwABIHBheXNfZmVlZAEQUGF5cwAAYAw0ZnJhbWVfc3VwcG9ydCBkaXNwYXRjaDREaXNwYXRjaENsYXNzAAEMGE5vcm1hbAAAACxPcGVyYXRpb25hbAABACRNYW5kYXRvcnkAAgAAZAw0ZnJhbWVfc3VwcG9ydCBkaXNwYXRjaBBQYXlzAAEIDFllcwAAAAhObwABAABoCChzcF9ydW50aW1lNERpc3BhdGNoRXJyb3IAATgUT3RoZXIAAAAwQ2Fubm90TG9va3VwAAEAJEJhZE9yaWdpbgACABhNb2R1bGUEAGwBLE1vZHVsZUVycm9yAAMARENvbnN1bWVyUmVtYWluaW5nAAQALE5vUHJvdmlkZXJzAAUAQFRvb01hbnlDb25zdW1lcnMABgAUVG9rZW4EAHABKFRva2VuRXJyb3IABwAoQXJpdGhtZXRpYwQAdAE8QXJpdGhtZXRpY0Vycm9yAAgANFRyYW5zYWN0aW9uYWwEAHgBSFRyYW5zYWN0aW9uYWxFcnJvcgAJACRFeGhhdXN0ZWQACgAoQ29ycnVwdGlvbgALACxVbmF2YWlsYWJsZQAMADhSb290Tm90QWxsb3dlZAANAABsCChzcF9ydW50aW1lLE1vZHVsZUVycm9yAAAIARRpbmRleAgBCHU4AAEUZXJyb3JIAYxbdTg7IE1BWF9NT0RVTEVfRVJST1JfRU5DT0RFRF9TSVpFXQAAcAgoc3BfcnVudGltZShUb2tlbkVycm9yAAEoQEZ1bmRzVW5hdmFpbGFibGUAAAAwT25seVByb3ZpZGVyAAEAMEJlbG93TWluaW11bQACADBDYW5ub3RDcmVhdGUAAwAwVW5rbm93bkFzc2V0AAQAGEZyb3plbgAFACxVbnN1cHBvcnRlZAAGAEBDYW5ub3RDcmVhdGVIb2xkAAcANE5vdEV4cGVuZGFibGUACAAcQmxvY2tlZAAJAAB0CDRzcF9hcml0aG1ldGljPEFyaXRobWV0aWNFcnJvcgABDCRVbmRlcmZsb3cAAAAgT3ZlcmZsb3cAAQA4RGl2aXNpb25CeVplcm8AAgAAeAgoc3BfcnVudGltZUhUcmFuc2FjdGlvbmFsRXJyb3IAAQgwTGltaXRSZWFjaGVkAAAAHE5vTGF5ZXIAAQAAfAxAcGFsbGV0X3NjaGVkdWxlchhwYWxsZXQURXZlbnQEBFQAASQkU2NoZWR1bGVkCAEQd2hlbhABREJsb2NrTnVtYmVyRm9yPFQ+AAEUaW5kZXgQAQx1MzIAAARQU2NoZWR1bGVkIHNvbWUgdGFzay4gQ2FuY2VsZWQIARB3aGVuEAFEQmxvY2tOdW1iZXJGb3I8VD4AARRpbmRleBABDHUzMgABBExDYW5jZWxlZCBzb21lIHRhc2suKERpc3BhdGNoZWQMARB0YXNrgAF4VGFza0FkZHJlc3M8QmxvY2tOdW1iZXJGb3I8VD4+AAEIaWSEAUBPcHRpb248VGFza05hbWU+AAEYcmVzdWx0iAE4RGlzcGF0Y2hSZXN1bHQAAgRURGlzcGF0Y2hlZCBzb21lIHRhc2suIFJldHJ5U2V0EAEQdGFza4ABeFRhc2tBZGRyZXNzPEJsb2NrTnVtYmVyRm9yPFQ+PgABCGlkhAFAT3B0aW9uPFRhc2tOYW1lPgABGHBlcmlvZBABREJsb2NrTnVtYmVyRm9yPFQ+AAEccmV0cmllcwgBCHU4AAMEoFNldCBhIHJldHJ5IGNvbmZpZ3VyYXRpb24gZm9yIHNvbWUgdGFzay44UmV0cnlDYW5jZWxsZWQIARB0YXNrgAF4VGFza0FkZHJlc3M8QmxvY2tOdW1iZXJGb3I8VD4+AAEIaWSEAUBPcHRpb248VGFza05hbWU+AAQErENhbmNlbCBhIHJldHJ5IGNvbmZpZ3VyYXRpb24gZm9yIHNvbWUgdGFzay48Q2FsbFVuYXZhaWxhYmxlCAEQdGFza4ABeFRhc2tBZGRyZXNzPEJsb2NrTnVtYmVyRm9yPFQ+PgABCGlkhAFAT3B0aW9uPFRhc2tOYW1lPgAFBCkBVGhlIGNhbGwgZm9yIHRoZSBwcm92aWRlZCBoYXNoIHdhcyBub3QgZm91bmQgc28gdGhlIHRhc2sgaGFzIGJlZW4gYWJvcnRlZC44UGVyaW9kaWNGYWlsZWQIARB0YXNrgAF4VGFza0FkZHJlc3M8QmxvY2tOdW1iZXJGb3I8VD4+AAEIaWSEAUBPcHRpb248VGFza05hbWU+AAYEPQFUaGUgZ2l2ZW4gdGFzayB3YXMgdW5hYmxlIHRvIGJlIHJlbmV3ZWQgc2luY2UgdGhlIGFnZW5kYSBpcyBmdWxsIGF0IHRoYXQgYmxvY2suLFJldHJ5RmFpbGVkCAEQdGFza4ABeFRhc2tBZGRyZXNzPEJsb2NrTnVtYmVyRm9yPFQ+PgABCGlkhAFAT3B0aW9uPFRhc2tOYW1lPgAHCF0BVGhlIGdpdmVuIHRhc2sgd2FzIHVuYWJsZSB0byBiZSByZXRyaWVkIHNpbmNlIHRoZSBhZ2VuZGEgaXMgZnVsbCBhdCB0aGF0IGJsb2NrIG9yIHRoZXJlnHdhcyBub3QgZW5vdWdoIHdlaWdodCB0byByZXNjaGVkdWxlIGl0LlRQZXJtYW5lbnRseU92ZXJ3ZWlnaHQIARB0YXNrgAF4VGFza0FkZHJlc3M8QmxvY2tOdW1iZXJGb3I8VD4+AAEIaWSEAUBPcHRpb248VGFza05hbWU+AAgE8FRoZSBnaXZlbiB0YXNrIGNhbiBuZXZlciBiZSBleGVjdXRlZCBzaW5jZSBpdCBpcyBvdmVyd2VpZ2h0LgQwRXZlbnRzIHR5cGUugAAABAgQEACEBBhPcHRpb24EBFQBBAEIEE5vbmUAAAAQU29tZQQABAAAAQAAiAQYUmVzdWx0CARUAYwERQFoAQgIT2sEAIwAAAAADEVycgQAaAAAAQAAjAAABAAAkAw8cGFsbGV0X3ByZWltYWdlGHBhbGxldBRFdmVudAQEVAABDBROb3RlZAQBEGhhc2g0ARxUOjpIYXNoAAAEaEEgcHJlaW1hZ2UgaGFzIGJlZW4gbm90ZWQuJFJlcXVlc3RlZAQBEGhhc2g0ARxUOjpIYXNoAAEEeEEgcHJlaW1hZ2UgaGFzIGJlZW4gcmVxdWVzdGVkLhxDbGVhcmVkBAEQaGFzaDQBHFQ6Okhhc2gAAgRsQSBwcmVpbWFnZSBoYXMgYmVuIGNsZWFyZWQuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0lAw4cGFsbGV0X2luZGljZXMYcGFsbGV0FEV2ZW50BARUAAEMNEluZGV4QXNzaWduZWQIAQx3aG8AATBUOjpBY2NvdW50SWQAARRpbmRleBABPFQ6OkFjY291bnRJbmRleAAABHRBIGFjY291bnQgaW5kZXggd2FzIGFzc2lnbmVkLihJbmRleEZyZWVkBAEUaW5kZXgQATxUOjpBY2NvdW50SW5kZXgAAQS8QSBhY2NvdW50IGluZGV4IGhhcyBiZWVuIGZyZWVkIHVwICh1bmFzc2lnbmVkKS4sSW5kZXhGcm96ZW4IARRpbmRleBABPFQ6OkFjY291bnRJbmRleAABDHdobwABMFQ6OkFjY291bnRJZAACBOhBIGFjY291bnQgaW5kZXggaGFzIGJlZW4gZnJvemVuIHRvIGl0cyBjdXJyZW50IGFjY291bnQgSUQuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0mAw8cGFsbGV0X2JhbGFuY2VzGHBhbGxldBRFdmVudAgEVAAESQABWBxFbmRvd2VkCAEcYWNjb3VudAABMFQ6OkFjY291bnRJZAABMGZyZWVfYmFsYW5jZRgBKFQ6OkJhbGFuY2UAAAS4QW4gYWNjb3VudCB3YXMgY3JlYXRlZCB3aXRoIHNvbWUgZnJlZSBiYWxhbmNlLiBEdXN0TG9zdAgBHGFjY291bnQAATBUOjpBY2NvdW50SWQAARhhbW91bnQYAShUOjpCYWxhbmNlAAEIPQFBbiBhY2NvdW50IHdhcyByZW1vdmVkIHdob3NlIGJhbGFuY2Ugd2FzIG5vbi16ZXJvIGJ1dCBiZWxvdyBFeGlzdGVudGlhbERlcG9zaXQseHJlc3VsdGluZyBpbiBhbiBvdXRyaWdodCBsb3NzLiBUcmFuc2ZlcgwBEGZyb20AATBUOjpBY2NvdW50SWQAAQh0bwABMFQ6OkFjY291bnRJZAABGGFtb3VudBgBKFQ6OkJhbGFuY2UAAgRMVHJhbnNmZXIgc3VjY2VlZGVkLihCYWxhbmNlU2V0CAEMd2hvAAEwVDo6QWNjb3VudElkAAEQZnJlZRgBKFQ6OkJhbGFuY2UAAwRoQSBiYWxhbmNlIHdhcyBzZXQgYnkgcm9vdC4gUmVzZXJ2ZWQIAQx3aG8AATBUOjpBY2NvdW50SWQAARhhbW91bnQYAShUOjpCYWxhbmNlAAQE4FNvbWUgYmFsYW5jZSB3YXMgcmVzZXJ2ZWQgKG1vdmVkIGZyb20gZnJlZSB0byByZXNlcnZlZCkuKFVucmVzZXJ2ZWQIAQx3aG8AATBUOjpBY2NvdW50SWQAARhhbW91bnQYAShUOjpCYWxhbmNlAAUE6FNvbWUgYmFsYW5jZSB3YXMgdW5yZXNlcnZlZCAobW92ZWQgZnJvbSByZXNlcnZlZCB0byBmcmVlKS5IUmVzZXJ2ZVJlcGF0cmlhdGVkEAEQZnJvbQABMFQ6OkFjY291bnRJZAABCHRvAAEwVDo6QWNjb3VudElkAAEYYW1vdW50GAEoVDo6QmFsYW5jZQABSGRlc3RpbmF0aW9uX3N0YXR1c5wBGFN0YXR1cwAGCE0BU29tZSBiYWxhbmNlIHdhcyBtb3ZlZCBmcm9tIHRoZSByZXNlcnZlIG9mIHRoZSBmaXJzdCBhY2NvdW50IHRvIHRoZSBzZWNvbmQgYWNjb3VudC7YRmluYWwgYXJndW1lbnQgaW5kaWNhdGVzIHRoZSBkZXN0aW5hdGlvbiBiYWxhbmNlIHR5cGUuHERlcG9zaXQIAQx3aG8AATBUOjpBY2NvdW50SWQAARhhbW91bnQYAShUOjpCYWxhbmNlAAcE2FNvbWUgYW1vdW50IHdhcyBkZXBvc2l0ZWQgKGUuZy4gZm9yIHRyYW5zYWN0aW9uIGZlZXMpLiBXaXRoZHJhdwgBDHdobwABMFQ6OkFjY291bnRJZAABGGFtb3VudBgBKFQ6OkJhbGFuY2UACAQdAVNvbWUgYW1vdW50IHdhcyB3aXRoZHJhd24gZnJvbSB0aGUgYWNjb3VudCAoZS5nLiBmb3IgdHJhbnNhY3Rpb24gZmVlcykuHFNsYXNoZWQIAQx3aG8AATBUOjpBY2NvdW50SWQAARhhbW91bnQYAShUOjpCYWxhbmNlAAkEAQFTb21lIGFtb3VudCB3YXMgcmVtb3ZlZCBmcm9tIHRoZSBhY2NvdW50IChlLmcuIGZvciBtaXNiZWhhdmlvcikuGE1pbnRlZAgBDHdobwABMFQ6OkFjY291bnRJZAABGGFtb3VudBgBKFQ6OkJhbGFuY2UACgScU29tZSBhbW91bnQgd2FzIG1pbnRlZCBpbnRvIGFuIGFjY291bnQuGEJ1cm5lZAgBDHdobwABMFQ6OkFjY291bnRJZAABGGFtb3VudBgBKFQ6OkJhbGFuY2UACwScU29tZSBhbW91bnQgd2FzIGJ1cm5lZCBmcm9tIGFuIGFjY291bnQuJFN1c3BlbmRlZAgBDHdobwABMFQ6OkFjY291bnRJZAABGGFtb3VudBgBKFQ6OkJhbGFuY2UADAQVAVNvbWUgYW1vdW50IHdhcyBzdXNwZW5kZWQgZnJvbSBhbiBhY2NvdW50IChpdCBjYW4gYmUgcmVzdG9yZWQgbGF0ZXIpLiBSZXN0b3JlZAgBDHdobwABMFQ6OkFjY291bnRJZAABGGFtb3VudBgBKFQ6OkJhbGFuY2UADQSkU29tZSBhbW91bnQgd2FzIHJlc3RvcmVkIGludG8gYW4gYWNjb3VudC4gVXBncmFkZWQEAQx3aG8AATBUOjpBY2NvdW50SWQADgRgQW4gYWNjb3VudCB3YXMgdXBncmFkZWQuGElzc3VlZAQBGGFtb3VudBgBKFQ6OkJhbGFuY2UADwQtAVRvdGFsIGlzc3VhbmNlIHdhcyBpbmNyZWFzZWQgYnkgYGFtb3VudGAsIGNyZWF0aW5nIGEgY3JlZGl0IHRvIGJlIGJhbGFuY2VkLiRSZXNjaW5kZWQEARhhbW91bnQYAShUOjpCYWxhbmNlABAEJQFUb3RhbCBpc3N1YW5jZSB3YXMgZGVjcmVhc2VkIGJ5IGBhbW91bnRgLCBjcmVhdGluZyBhIGRlYnQgdG8gYmUgYmFsYW5jZWQuGExvY2tlZAgBDHdobwABMFQ6OkFjY291bnRJZAABGGFtb3VudBgBKFQ6OkJhbGFuY2UAEQRgU29tZSBiYWxhbmNlIHdhcyBsb2NrZWQuIFVubG9ja2VkCAEMd2hvAAEwVDo6QWNjb3VudElkAAEYYW1vdW50GAEoVDo6QmFsYW5jZQASBGhTb21lIGJhbGFuY2Ugd2FzIHVubG9ja2VkLhhGcm96ZW4IAQx3aG8AATBUOjpBY2NvdW50SWQAARhhbW91bnQYAShUOjpCYWxhbmNlABMEYFNvbWUgYmFsYW5jZSB3YXMgZnJvemVuLhhUaGF3ZWQIAQx3aG8AATBUOjpBY2NvdW50SWQAARhhbW91bnQYAShUOjpCYWxhbmNlABQEYFNvbWUgYmFsYW5jZSB3YXMgdGhhd2VkLkxUb3RhbElzc3VhbmNlRm9yY2VkCAEMb2xkGAEoVDo6QmFsYW5jZQABDG5ldxgBKFQ6OkJhbGFuY2UAFQSsVGhlIGBUb3RhbElzc3VhbmNlYCB3YXMgZm9yY2VmdWxseSBjaGFuZ2VkLgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldJwUNGZyYW1lX3N1cHBvcnQYdHJhaXRzGHRva2VucxBtaXNjNEJhbGFuY2VTdGF0dXMAAQgQRnJlZQAAACBSZXNlcnZlZAABAACgDGhwYWxsZXRfdHJhbnNhY3Rpb25fcGF5bWVudBhwYWxsZXQURXZlbnQEBFQAAQRIVHJhbnNhY3Rpb25GZWVQYWlkDAEMd2hvAAEwVDo6QWNjb3VudElkAAEoYWN0dWFsX2ZlZRgBMEJhbGFuY2VPZjxUPgABDHRpcBgBMEJhbGFuY2VPZjxUPgAACFkBQSB0cmFuc2FjdGlvbiBmZWUgYGFjdHVhbF9mZWVgLCBvZiB3aGljaCBgdGlwYCB3YXMgYWRkZWQgdG8gdGhlIG1pbmltdW0gaW5jbHVzaW9uIGZlZSxcaGFzIGJlZW4gcGFpZCBieSBgd2hvYC4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXSkEDhwYWxsZXRfc3Rha2luZxhwYWxsZXQYcGFsbGV0FEV2ZW50BARUAAFIHEVyYVBhaWQMASRlcmFfaW5kZXgQASBFcmFJbmRleAABQHZhbGlkYXRvcl9wYXlvdXQYATBCYWxhbmNlT2Y8VD4AASRyZW1haW5kZXIYATBCYWxhbmNlT2Y8VD4AAAhVAVRoZSBlcmEgcGF5b3V0IGhhcyBiZWVuIHNldDsgdGhlIGZpcnN0IGJhbGFuY2UgaXMgdGhlIHZhbGlkYXRvci1wYXlvdXQ7IHRoZSBzZWNvbmQgaXPAdGhlIHJlbWFpbmRlciBmcm9tIHRoZSBtYXhpbXVtIGFtb3VudCBvZiByZXdhcmQuIFJld2FyZGVkDAEUc3Rhc2gAATBUOjpBY2NvdW50SWQAARBkZXN0qAF8UmV3YXJkRGVzdGluYXRpb248VDo6QWNjb3VudElkPgABGGFtb3VudBgBMEJhbGFuY2VPZjxUPgABBA0BVGhlIG5vbWluYXRvciBoYXMgYmVlbiByZXdhcmRlZCBieSB0aGlzIGFtb3VudCB0byB0aGlzIGRlc3RpbmF0aW9uLhxTbGFzaGVkCAEYc3Rha2VyAAEwVDo6QWNjb3VudElkAAEYYW1vdW50GAEwQmFsYW5jZU9mPFQ+AAIEHQFBIHN0YWtlciAodmFsaWRhdG9yIG9yIG5vbWluYXRvcikgaGFzIGJlZW4gc2xhc2hlZCBieSB0aGUgZ2l2ZW4gYW1vdW50LjRTbGFzaFJlcG9ydGVkDAEkdmFsaWRhdG9yAAEwVDo6QWNjb3VudElkAAEgZnJhY3Rpb26sARxQZXJiaWxsAAEkc2xhc2hfZXJhEAEgRXJhSW5kZXgAAwhZAUEgc2xhc2ggZm9yIHRoZSBnaXZlbiB2YWxpZGF0b3IsIGZvciB0aGUgZ2l2ZW4gcGVyY2VudGFnZSBvZiB0aGVpciBzdGFrZSwgYXQgdGhlIGdpdmVuVGVyYSBhcyBiZWVuIHJlcG9ydGVkLmhPbGRTbGFzaGluZ1JlcG9ydERpc2NhcmRlZAQBNHNlc3Npb25faW5kZXgQATBTZXNzaW9uSW5kZXgABAgZAUFuIG9sZCBzbGFzaGluZyByZXBvcnQgZnJvbSBhIHByaW9yIGVyYSB3YXMgZGlzY2FyZGVkIGJlY2F1c2UgaXQgY291bGREbm90IGJlIHByb2Nlc3NlZC44U3Rha2Vyc0VsZWN0ZWQABQSEQSBuZXcgc2V0IG9mIHN0YWtlcnMgd2FzIGVsZWN0ZWQuGEJvbmRlZAgBFHN0YXNoAAEwVDo6QWNjb3VudElkAAEYYW1vdW50GAEwQmFsYW5jZU9mPFQ+AAYQ0EFuIGFjY291bnQgaGFzIGJvbmRlZCB0aGlzIGFtb3VudC4gXFtzdGFzaCwgYW1vdW50XF0ATQFOT1RFOiBUaGlzIGV2ZW50IGlzIG9ubHkgZW1pdHRlZCB3aGVuIGZ1bmRzIGFyZSBib25kZWQgdmlhIGEgZGlzcGF0Y2hhYmxlLiBOb3RhYmx5LCEBaXQgd2lsbCBub3QgYmUgZW1pdHRlZCBmb3Igc3Rha2luZyByZXdhcmRzIHdoZW4gdGhleSBhcmUgYWRkZWQgdG8gc3Rha2UuIFVuYm9uZGVkCAEUc3Rhc2gAATBUOjpBY2NvdW50SWQAARhhbW91bnQYATBCYWxhbmNlT2Y8VD4ABwSQQW4gYWNjb3VudCBoYXMgdW5ib25kZWQgdGhpcyBhbW91bnQuJFdpdGhkcmF3bggBFHN0YXNoAAEwVDo6QWNjb3VudElkAAEYYW1vdW50GAEwQmFsYW5jZU9mPFQ+AAgIWQFBbiBhY2NvdW50IGhhcyBjYWxsZWQgYHdpdGhkcmF3X3VuYm9uZGVkYCBhbmQgcmVtb3ZlZCB1bmJvbmRpbmcgY2h1bmtzIHdvcnRoIGBCYWxhbmNlYGRmcm9tIHRoZSB1bmxvY2tpbmcgcXVldWUuGEtpY2tlZAgBJG5vbWluYXRvcgABMFQ6OkFjY291bnRJZAABFHN0YXNoAAEwVDo6QWNjb3VudElkAAkEtEEgbm9taW5hdG9yIGhhcyBiZWVuIGtpY2tlZCBmcm9tIGEgdmFsaWRhdG9yLlRTdGFraW5nRWxlY3Rpb25GYWlsZWQACgSsVGhlIGVsZWN0aW9uIGZhaWxlZC4gTm8gbmV3IGVyYSBpcyBwbGFubmVkLhxDaGlsbGVkBAEUc3Rhc2gAATBUOjpBY2NvdW50SWQACwQhAUFuIGFjY291bnQgaGFzIHN0b3BwZWQgcGFydGljaXBhdGluZyBhcyBlaXRoZXIgYSB2YWxpZGF0b3Igb3Igbm9taW5hdG9yLjRQYXlvdXRTdGFydGVkCAEkZXJhX2luZGV4EAEgRXJhSW5kZXgAATx2YWxpZGF0b3Jfc3Rhc2gAATBUOjpBY2NvdW50SWQADASYVGhlIHN0YWtlcnMnIHJld2FyZHMgYXJlIGdldHRpbmcgcGFpZC5EVmFsaWRhdG9yUHJlZnNTZXQIARRzdGFzaAABMFQ6OkFjY291bnRJZAABFHByZWZzsAE4VmFsaWRhdG9yUHJlZnMADQSYQSB2YWxpZGF0b3IgaGFzIHNldCB0aGVpciBwcmVmZXJlbmNlcy5oU25hcHNob3RWb3RlcnNTaXplRXhjZWVkZWQEARBzaXplEAEMdTMyAA4EaFZvdGVycyBzaXplIGxpbWl0IHJlYWNoZWQubFNuYXBzaG90VGFyZ2V0c1NpemVFeGNlZWRlZAQBEHNpemUQAQx1MzIADwRsVGFyZ2V0cyBzaXplIGxpbWl0IHJlYWNoZWQuIEZvcmNlRXJhBAEQbW9kZbgBHEZvcmNpbmcAEAR0QSBuZXcgZm9yY2UgZXJhIG1vZGUgd2FzIHNldC5kQ29udHJvbGxlckJhdGNoRGVwcmVjYXRlZAQBIGZhaWx1cmVzEAEMdTMyABEEpFJlcG9ydCBvZiBhIGNvbnRyb2xsZXIgYmF0Y2ggZGVwcmVjYXRpb24uBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0qAg4cGFsbGV0X3N0YWtpbmdEUmV3YXJkRGVzdGluYXRpb24EJEFjY291bnRJZAEAARQYU3Rha2VkAAAAFFN0YXNoAAEAKENvbnRyb2xsZXIAAgAcQWNjb3VudAQAAAEkQWNjb3VudElkAAMAEE5vbmUABAAArAw0c3BfYXJpdGhtZXRpYyhwZXJfdGhpbmdzHFBlcmJpbGwAAAQAEAEMdTMyAACwCDhwYWxsZXRfc3Rha2luZzhWYWxpZGF0b3JQcmVmcwAACAEoY29tbWlzc2lvbrQBHFBlcmJpbGwAARxibG9ja2VkIAEQYm9vbAAAtAAABqwAuAg4cGFsbGV0X3N0YWtpbmccRm9yY2luZwABEChOb3RGb3JjaW5nAAAAIEZvcmNlTmV3AAEAJEZvcmNlTm9uZQACACxGb3JjZUFsd2F5cwADAAC8DDxwYWxsZXRfb2ZmZW5jZXMYcGFsbGV0FEV2ZW50AAEEHE9mZmVuY2UIARBraW5kwAEQS2luZAABIHRpbWVzbG90OAE4T3BhcXVlVGltZVNsb3QAAAxRAVRoZXJlIGlzIGFuIG9mZmVuY2UgcmVwb3J0ZWQgb2YgdGhlIGdpdmVuIGBraW5kYCBoYXBwZW5lZCBhdCB0aGUgYHNlc3Npb25faW5kZXhgIGFuZDUBKGtpbmQtc3BlY2lmaWMpIHRpbWUgc2xvdC4gVGhpcyBldmVudCBpcyBub3QgZGVwb3NpdGVkIGZvciBkdXBsaWNhdGUgc2xhc2hlcy5MXFtraW5kLCB0aW1lc2xvdFxdLgQwRXZlbnRzIHR5cGUuwAAAAxAAAAAIAMQMOHBhbGxldF9zZXNzaW9uGHBhbGxldBRFdmVudAABBChOZXdTZXNzaW9uBAE0c2Vzc2lvbl9pbmRleBABMFNlc3Npb25JbmRleAAACDkBTmV3IHNlc3Npb24gaGFzIGhhcHBlbmVkLiBOb3RlIHRoYXQgdGhlIGFyZ3VtZW50IGlzIHRoZSBzZXNzaW9uIGluZGV4LCBub3QgdGhlnGJsb2NrIG51bWJlciBhcyB0aGUgdHlwZSBtaWdodCBzdWdnZXN0LgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldMgMOHBhbGxldF9ncmFuZHBhGHBhbGxldBRFdmVudAABDDhOZXdBdXRob3JpdGllcwQBNGF1dGhvcml0eV9zZXTMATRBdXRob3JpdHlMaXN0AAAEjE5ldyBhdXRob3JpdHkgc2V0IGhhcyBiZWVuIGFwcGxpZWQuGFBhdXNlZAABBJhDdXJyZW50IGF1dGhvcml0eSBzZXQgaGFzIGJlZW4gcGF1c2VkLhxSZXN1bWVkAAIEnEN1cnJlbnQgYXV0aG9yaXR5IHNldCBoYXMgYmVlbiByZXN1bWVkLgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldMwAAALQANAAAAQI1DAA1AxQc3BfY29uc2Vuc3VzX2dyYW5kcGEMYXBwGFB1YmxpYwAABAAEATxlZDI1NTE5OjpQdWJsaWMAANgMPHBhbGxldF90cmVhc3VyeRhwYWxsZXQURXZlbnQIBFQABEkAATAgU3BlbmRpbmcEAUBidWRnZXRfcmVtYWluaW5nGAE8QmFsYW5jZU9mPFQsIEk+AAAE5FdlIGhhdmUgZW5kZWQgYSBzcGVuZCBwZXJpb2QgYW5kIHdpbGwgbm93IGFsbG9jYXRlIGZ1bmRzLhxBd2FyZGVkDAE4cHJvcG9zYWxfaW5kZXgQATRQcm9wb3NhbEluZGV4AAEUYXdhcmQYATxCYWxhbmNlT2Y8VCwgST4AARxhY2NvdW50AAEwVDo6QWNjb3VudElkAAEEfFNvbWUgZnVuZHMgaGF2ZSBiZWVuIGFsbG9jYXRlZC4UQnVybnQEASxidXJudF9mdW5kcxgBPEJhbGFuY2VPZjxULCBJPgACBIhTb21lIG9mIG91ciBmdW5kcyBoYXZlIGJlZW4gYnVybnQuIFJvbGxvdmVyBAFAcm9sbG92ZXJfYmFsYW5jZRgBPEJhbGFuY2VPZjxULCBJPgADBC0BU3BlbmRpbmcgaGFzIGZpbmlzaGVkOyB0aGlzIGlzIHRoZSBhbW91bnQgdGhhdCByb2xscyBvdmVyIHVudGlsIG5leHQgc3BlbmQuHERlcG9zaXQEARR2YWx1ZRgBPEJhbGFuY2VPZjxULCBJPgAEBHxTb21lIGZ1bmRzIGhhdmUgYmVlbiBkZXBvc2l0ZWQuNFNwZW5kQXBwcm92ZWQMAThwcm9wb3NhbF9pbmRleBABNFByb3Bvc2FsSW5kZXgAARhhbW91bnQYATxCYWxhbmNlT2Y8VCwgST4AASxiZW5lZmljaWFyeQABMFQ6OkFjY291bnRJZAAFBJxBIG5ldyBzcGVuZCBwcm9wb3NhbCBoYXMgYmVlbiBhcHByb3ZlZC48VXBkYXRlZEluYWN0aXZlCAEscmVhY3RpdmF0ZWQYATxCYWxhbmNlT2Y8VCwgST4AASxkZWFjdGl2YXRlZBgBPEJhbGFuY2VPZjxULCBJPgAGBMxUaGUgaW5hY3RpdmUgZnVuZHMgb2YgdGhlIHBhbGxldCBoYXZlIGJlZW4gdXBkYXRlZC5IQXNzZXRTcGVuZEFwcHJvdmVkGAEUaW5kZXgQAShTcGVuZEluZGV4AAEoYXNzZXRfa2luZNwBMFQ6OkFzc2V0S2luZAABGGFtb3VudBgBUEFzc2V0QmFsYW5jZU9mPFQsIEk+AAEsYmVuZWZpY2lhcnlFAQE4VDo6QmVuZWZpY2lhcnkAASh2YWxpZF9mcm9tEAFEQmxvY2tOdW1iZXJGb3I8VD4AASRleHBpcmVfYXQQAURCbG9ja051bWJlckZvcjxUPgAHBLRBIG5ldyBhc3NldCBzcGVuZCBwcm9wb3NhbCBoYXMgYmVlbiBhcHByb3ZlZC5AQXNzZXRTcGVuZFZvaWRlZAQBFGluZGV4EAEoU3BlbmRJbmRleAAIBHRBbiBhcHByb3ZlZCBzcGVuZCB3YXMgdm9pZGVkLhBQYWlkCAEUaW5kZXgQAShTcGVuZEluZGV4AAEocGF5bWVudF9pZDABZDxUOjpQYXltYXN0ZXIgYXMgUGF5Pjo6SWQACQRMQSBwYXltZW50IGhhcHBlbmVkLjRQYXltZW50RmFpbGVkCAEUaW5kZXgQAShTcGVuZEluZGV4AAEocGF5bWVudF9pZDABZDxUOjpQYXltYXN0ZXIgYXMgUGF5Pjo6SWQACgSQQSBwYXltZW50IGZhaWxlZCBhbmQgY2FuIGJlIHJldHJpZWQuOFNwZW5kUHJvY2Vzc2VkBAEUaW5kZXgQAShTcGVuZEluZGV4AAsITQFBIHNwZW5kIHdhcyBwcm9jZXNzZWQgYW5kIHJlbW92ZWQgZnJvbSB0aGUgc3RvcmFnZS4gSXQgbWlnaHQgaGF2ZSBiZWVuIHN1Y2Nlc3NmdWxseXBwYWlkIG9yIGl0IG1heSBoYXZlIGV4cGlyZWQuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV03AxccG9sa2Fkb3RfcnVudGltZV9jb21tb24UaW1wbHNcVmVyc2lvbmVkTG9jYXRhYmxlQXNzZXQAAQgIVjMIASBsb2NhdGlvbuABRHhjbTo6djM6OkxvY2F0aW9uAAEgYXNzZXRfaWQJAQFAeGNtOjp2Mzo6QXNzZXRJZAADAAhWNAgBIGxvY2F0aW9uDQEBRHhjbTo6djQ6OkxvY2F0aW9uAAEgYXNzZXRfaWRBAQFAeGNtOjp2NDo6QXNzZXRJZAAEAADgECxzdGFnaW5nX3hjbQh2MzRtdWx0aWxvY2F0aW9uNE11bHRpTG9jYXRpb24AAAgBHHBhcmVudHMIAQh1OAABIGludGVyaW9y5AEkSnVuY3Rpb25zAADkEAx4Y20IdjMkanVuY3Rpb25zJEp1bmN0aW9ucwABJBBIZXJlAAAACFgxBADoASBKdW5jdGlvbgABAAhYMggA6AEgSnVuY3Rpb24AAOgBIEp1bmN0aW9uAAIACFgzDADoASBKdW5jdGlvbgAA6AEgSnVuY3Rpb24AAOgBIEp1bmN0aW9uAAMACFg0EADoASBKdW5jdGlvbgAA6AEgSnVuY3Rpb24AAOgBIEp1bmN0aW9uAADoASBKdW5jdGlvbgAEAAhYNRQA6AEgSnVuY3Rpb24AAOgBIEp1bmN0aW9uAADoASBKdW5jdGlvbgAA6AEgSnVuY3Rpb24AAOgBIEp1bmN0aW9uAAUACFg2GADoASBKdW5jdGlvbgAA6AEgSnVuY3Rpb24AAOgBIEp1bmN0aW9uAADoASBKdW5jdGlvbgAA6AEgSnVuY3Rpb24AAOgBIEp1bmN0aW9uAAYACFg3HADoASBKdW5jdGlvbgAA6AEgSnVuY3Rpb24AAOgBIEp1bmN0aW9uAADoASBKdW5jdGlvbgAA6AEgSnVuY3Rpb24AAOgBIEp1bmN0aW9uAADoASBKdW5jdGlvbgAHAAhYOCAA6AEgSnVuY3Rpb24AAOgBIEp1bmN0aW9uAADoASBKdW5jdGlvbgAA6AEgSnVuY3Rpb24AAOgBIEp1bmN0aW9uAADoASBKdW5jdGlvbgAA6AEgSnVuY3Rpb24AAOgBIEp1bmN0aW9uAAgAAOgQDHhjbQh2MyBqdW5jdGlvbiBKdW5jdGlvbgABKCRQYXJhY2hhaW4EAOwBDHUzMgAAACxBY2NvdW50SWQzMggBHG5ldHdvcmvwAURPcHRpb248TmV0d29ya0lkPgABCGlkBAEgW3U4OyAzMl0AAQA4QWNjb3VudEluZGV4NjQIARxuZXR3b3Jr8AFET3B0aW9uPE5ldHdvcmtJZD4AARRpbmRleCwBDHU2NAACADBBY2NvdW50S2V5MjAIARxuZXR3b3Jr8AFET3B0aW9uPE5ldHdvcmtJZD4AAQxrZXn4ASBbdTg7IDIwXQADADhQYWxsZXRJbnN0YW5jZQQACAEIdTgABAAwR2VuZXJhbEluZGV4BAD8ARB1MTI4AAUAKEdlbmVyYWxLZXkIARhsZW5ndGgIAQh1OAABEGRhdGEEASBbdTg7IDMyXQAGACRPbmx5Q2hpbGQABwAkUGx1cmFsaXR5CAEIaWQBAQEYQm9keUlkAAEQcGFydAUBASBCb2R5UGFydAAIADxHbG9iYWxDb25zZW5zdXMEAPQBJE5ldHdvcmtJZAAJAADsAAAGEADwBBhPcHRpb24EBFQB9AEIEE5vbmUAAAAQU29tZQQA9AAAAQAA9BAMeGNtCHYzIGp1bmN0aW9uJE5ldHdvcmtJZAABLCRCeUdlbmVzaXMEAAQBIFt1ODsgMzJdAAAAGEJ5Rm9yawgBMGJsb2NrX251bWJlcjABDHU2NAABKGJsb2NrX2hhc2gEASBbdTg7IDMyXQABACBQb2xrYWRvdAACABhLdXNhbWEAAwAcV2VzdGVuZAAEABhSb2NvY28ABQAYV29jb2NvAAYAIEV0aGVyZXVtBAEgY2hhaW5faWQsAQx1NjQABwAsQml0Y29pbkNvcmUACAAsQml0Y29pbkNhc2gACQBAUG9sa2Fkb3RCdWxsZXRpbgAKAAD4AAADFAAAAAgA/AAABhgAAQEQDHhjbQh2MyBqdW5jdGlvbhhCb2R5SWQAASgQVW5pdAAAABxNb25pa2VyBABIARxbdTg7IDRdAAEAFEluZGV4BADsAQx1MzIAAgAkRXhlY3V0aXZlAAMAJFRlY2huaWNhbAAEACxMZWdpc2xhdGl2ZQAFACBKdWRpY2lhbAAGABxEZWZlbnNlAAcAOEFkbWluaXN0cmF0aW9uAAgAIFRyZWFzdXJ5AAkAAAUBEAx4Y20IdjMganVuY3Rpb24gQm9keVBhcnQAARQUVm9pY2UAAAAcTWVtYmVycwQBFGNvdW507AEMdTMyAAEAIEZyYWN0aW9uCAEMbm9t7AEMdTMyAAEUZGVub23sAQx1MzIAAgBEQXRMZWFzdFByb3BvcnRpb24IAQxub23sAQx1MzIAARRkZW5vbewBDHUzMgADAEhNb3JlVGhhblByb3BvcnRpb24IAQxub23sAQx1MzIAARRkZW5vbewBDHUzMgAEAAAJARAMeGNtCHYzKG11bHRpYXNzZXQcQXNzZXRJZAABCCBDb25jcmV0ZQQA4AE0TXVsdGlMb2NhdGlvbgAAACBBYnN0cmFjdAQABAEgW3U4OyAzMl0AAQAADQEQLHN0YWdpbmdfeGNtCHY0IGxvY2F0aW9uIExvY2F0aW9uAAAIARxwYXJlbnRzCAEIdTgAASBpbnRlcmlvchEBASRKdW5jdGlvbnMAABEBECxzdGFnaW5nX3hjbQh2NCRqdW5jdGlvbnMkSnVuY3Rpb25zAAEkEEhlcmUAAAAIWDEEABUBAUhBcmM8W0p1bmN0aW9uOyAxXT4AAQAIWDIEACUBAUhBcmM8W0p1bmN0aW9uOyAyXT4AAgAIWDMEACkBAUhBcmM8W0p1bmN0aW9uOyAzXT4AAwAIWDQEAC0BAUhBcmM8W0p1bmN0aW9uOyA0XT4ABAAIWDUEADEBAUhBcmM8W0p1bmN0aW9uOyA1XT4ABQAIWDYEADUBAUhBcmM8W0p1bmN0aW9uOyA2XT4ABgAIWDcEADkBAUhBcmM8W0p1bmN0aW9uOyA3XT4ABwAIWDgEAD0BAUhBcmM8W0p1bmN0aW9uOyA4XT4ACAAAFQEAAAMBAAAAGQEAGQEQLHN0YWdpbmdfeGNtCHY0IGp1bmN0aW9uIEp1bmN0aW9uAAEoJFBhcmFjaGFpbgQA7AEMdTMyAAAALEFjY291bnRJZDMyCAEcbmV0d29yax0BAURPcHRpb248TmV0d29ya0lkPgABCGlkBAEgW3U4OyAzMl0AAQA4QWNjb3VudEluZGV4NjQIARxuZXR3b3JrHQEBRE9wdGlvbjxOZXR3b3JrSWQ+AAEUaW5kZXgsAQx1NjQAAgAwQWNjb3VudEtleTIwCAEcbmV0d29yax0BAURPcHRpb248TmV0d29ya0lkPgABDGtlefgBIFt1ODsgMjBdAAMAOFBhbGxldEluc3RhbmNlBAAIAQh1OAAEADBHZW5lcmFsSW5kZXgEAPwBEHUxMjgABQAoR2VuZXJhbEtleQgBGGxlbmd0aAgBCHU4AAEQZGF0YQQBIFt1ODsgMzJdAAYAJE9ubHlDaGlsZAAHACRQbHVyYWxpdHkIAQhpZAEBARhCb2R5SWQAARBwYXJ0BQEBIEJvZHlQYXJ0AAgAPEdsb2JhbENvbnNlbnN1cwQAIQEBJE5ldHdvcmtJZAAJAAAdAQQYT3B0aW9uBARUASEBAQgQTm9uZQAAABBTb21lBAAhAQAAAQAAIQEQLHN0YWdpbmdfeGNtCHY0IGp1bmN0aW9uJE5ldHdvcmtJZAABLCRCeUdlbmVzaXMEAAQBIFt1ODsgMzJdAAAAGEJ5Rm9yawgBMGJsb2NrX251bWJlcjABDHU2NAABKGJsb2NrX2hhc2gEASBbdTg7IDMyXQABACBQb2xrYWRvdAACABhLdXNhbWEAAwAcV2VzdGVuZAAEABhSb2NvY28ABQAYV29jb2NvAAYAIEV0aGVyZXVtBAEgY2hhaW5faWQsAQx1NjQABwAsQml0Y29pbkNvcmUACAAsQml0Y29pbkNhc2gACQBAUG9sa2Fkb3RCdWxsZXRpbgAKAAAlAQAAAwIAAAAZAQApAQAAAwMAAAAZAQAtAQAAAwQAAAAZAQAxAQAAAwUAAAAZAQA1AQAAAwYAAAAZAQA5AQAAAwcAAAAZAQA9AQAAAwgAAAAZAQBBARAsc3RhZ2luZ194Y20IdjQUYXNzZXQcQXNzZXRJZAAABAANAQEgTG9jYXRpb24AAEUBCAx4Y21EVmVyc2lvbmVkTG9jYXRpb24AAQwIVjIEAEkBAUR2Mjo6TXVsdGlMb2NhdGlvbgABAAhWMwQA4AFEdjM6Ok11bHRpTG9jYXRpb24AAwAIVjQEAA0BATB2NDo6TG9jYXRpb24ABAAASQEQDHhjbQh2MjRtdWx0aWxvY2F0aW9uNE11bHRpTG9jYXRpb24AAAgBHHBhcmVudHMIAQh1OAABIGludGVyaW9yTQEBJEp1bmN0aW9ucwAATQEQDHhjbQh2MjRtdWx0aWxvY2F0aW9uJEp1bmN0aW9ucwABJBBIZXJlAAAACFgxBABRAQEgSnVuY3Rpb24AAQAIWDIIAFEBASBKdW5jdGlvbgAAUQEBIEp1bmN0aW9uAAIACFgzDABRAQEgSnVuY3Rpb24AAFEBASBKdW5jdGlvbgAAUQEBIEp1bmN0aW9uAAMACFg0EABRAQEgSnVuY3Rpb24AAFEBASBKdW5jdGlvbgAAUQEBIEp1bmN0aW9uAABRAQEgSnVuY3Rpb24ABAAIWDUUAFEBASBKdW5jdGlvbgAAUQEBIEp1bmN0aW9uAABRAQEgSnVuY3Rpb24AAFEBASBKdW5jdGlvbgAAUQEBIEp1bmN0aW9uAAUACFg2GABRAQEgSnVuY3Rpb24AAFEBASBKdW5jdGlvbgAAUQEBIEp1bmN0aW9uAABRAQEgSnVuY3Rpb24AAFEBASBKdW5jdGlvbgAAUQEBIEp1bmN0aW9uAAYACFg3HABRAQEgSnVuY3Rpb24AAFEBASBKdW5jdGlvbgAAUQEBIEp1bmN0aW9uAABRAQEgSnVuY3Rpb24AAFEBASBKdW5jdGlvbgAAUQEBIEp1bmN0aW9uAABRAQEgSnVuY3Rpb24ABwAIWDggAFEBASBKdW5jdGlvbgAAUQEBIEp1bmN0aW9uAABRAQEgSnVuY3Rpb24AAFEBASBKdW5jdGlvbgAAUQEBIEp1bmN0aW9uAABRAQEgSnVuY3Rpb24AAFEBASBKdW5jdGlvbgAAUQEBIEp1bmN0aW9uAAgAAFEBEAx4Y20IdjIganVuY3Rpb24gSnVuY3Rpb24AASQkUGFyYWNoYWluBADsAQx1MzIAAAAsQWNjb3VudElkMzIIARxuZXR3b3JrVQEBJE5ldHdvcmtJZAABCGlkBAEgW3U4OyAzMl0AAQA4QWNjb3VudEluZGV4NjQIARxuZXR3b3JrVQEBJE5ldHdvcmtJZAABFGluZGV4LAEMdTY0AAIAMEFjY291bnRLZXkyMAgBHG5ldHdvcmtVAQEkTmV0d29ya0lkAAEMa2V5+AEgW3U4OyAyMF0AAwA4UGFsbGV0SW5zdGFuY2UEAAgBCHU4AAQAMEdlbmVyYWxJbmRleAQA/AEQdTEyOAAFAChHZW5lcmFsS2V5BABZAQGAV2Vha0JvdW5kZWRWZWM8dTgsIENvbnN0VTMyPDMyPj4ABgAkT25seUNoaWxkAAcAJFBsdXJhbGl0eQgBCGlkXQEBGEJvZHlJZAABEHBhcnRhAQEgQm9keVBhcnQACAAAVQEMDHhjbQh2MiROZXR3b3JrSWQAARAMQW55AAAAFE5hbWVkBABZAQGAV2Vha0JvdW5kZWRWZWM8dTgsIENvbnN0VTMyPDMyPj4AAQAgUG9sa2Fkb3QAAgAYS3VzYW1hAAMAAFkBDExib3VuZGVkX2NvbGxlY3Rpb25zQHdlYWtfYm91bmRlZF92ZWM4V2Vha0JvdW5kZWRWZWMIBFQBCARTAAAEADgBGFZlYzxUPgAAXQEMDHhjbQh2MhhCb2R5SWQAASgQVW5pdAAAABROYW1lZAQAWQEBgFdlYWtCb3VuZGVkVmVjPHU4LCBDb25zdFUzMjwzMj4+AAEAFEluZGV4BADsAQx1MzIAAgAkRXhlY3V0aXZlAAMAJFRlY2huaWNhbAAEACxMZWdpc2xhdGl2ZQAFACBKdWRpY2lhbAAGABxEZWZlbnNlAAcAOEFkbWluaXN0cmF0aW9uAAgAIFRyZWFzdXJ5AAkAAGEBDAx4Y20IdjIgQm9keVBhcnQAARQUVm9pY2UAAAAcTWVtYmVycwQBFGNvdW507AEMdTMyAAEAIEZyYWN0aW9uCAEMbm9t7AEMdTMyAAEUZGVub23sAQx1MzIAAgBEQXRMZWFzdFByb3BvcnRpb24IAQxub23sAQx1MzIAARRkZW5vbewBDHUzMgADAEhNb3JlVGhhblByb3BvcnRpb24IAQxub23sAQx1MzIAARRkZW5vbewBDHUzMgAEAABlAQxgcGFsbGV0X2NvbnZpY3Rpb25fdm90aW5nGHBhbGxldBRFdmVudAgEVAAESQABCCREZWxlZ2F0ZWQIAAABMFQ6OkFjY291bnRJZAAAAAEwVDo6QWNjb3VudElkAAAEHQFBbiBhY2NvdW50IGhhcyBkZWxlZ2F0ZWQgdGhlaXIgdm90ZSB0byBhbm90aGVyIGFjY291bnQuIFxbd2hvLCB0YXJnZXRcXSxVbmRlbGVnYXRlZAQAAAEwVDo6QWNjb3VudElkAAEE9EFuIFxbYWNjb3VudFxdIGhhcyBjYW5jZWxsZWQgYSBwcmV2aW91cyBkZWxlZ2F0aW9uIG9wZXJhdGlvbi4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXRpAQxAcGFsbGV0X3JlZmVyZW5kYRhwYWxsZXQURXZlbnQIBFQABEkAAUAkU3VibWl0dGVkDAEUaW5kZXgQATxSZWZlcmVuZHVtSW5kZXgEYEluZGV4IG9mIHRoZSByZWZlcmVuZHVtLgEUdHJhY2ttAQE8VHJhY2tJZE9mPFQsIEk+BCUBVGhlIHRyYWNrIChhbmQgYnkgZXh0ZW5zaW9uIHByb3Bvc2FsIGRpc3BhdGNoIG9yaWdpbikgb2YgdGhpcyByZWZlcmVuZHVtLgEgcHJvcG9zYWxxAQFMQm91bmRlZENhbGxPZjxULCBJPgSAVGhlIHByb3Bvc2FsIGZvciB0aGUgcmVmZXJlbmR1bS4ABIBBIHJlZmVyZW5kdW0gaGFzIGJlZW4gc3VibWl0dGVkLlREZWNpc2lvbkRlcG9zaXRQbGFjZWQMARRpbmRleBABPFJlZmVyZW5kdW1JbmRleARgSW5kZXggb2YgdGhlIHJlZmVyZW5kdW0uAQx3aG8AATBUOjpBY2NvdW50SWQEjFRoZSBhY2NvdW50IHdobyBwbGFjZWQgdGhlIGRlcG9zaXQuARhhbW91bnQYATxCYWxhbmNlT2Y8VCwgST4EhFRoZSBhbW91bnQgcGxhY2VkIGJ5IHRoZSBhY2NvdW50LgEElFRoZSBkZWNpc2lvbiBkZXBvc2l0IGhhcyBiZWVuIHBsYWNlZC5cRGVjaXNpb25EZXBvc2l0UmVmdW5kZWQMARRpbmRleBABPFJlZmVyZW5kdW1JbmRleARgSW5kZXggb2YgdGhlIHJlZmVyZW5kdW0uAQx3aG8AATBUOjpBY2NvdW50SWQEjFRoZSBhY2NvdW50IHdobyBwbGFjZWQgdGhlIGRlcG9zaXQuARhhbW91bnQYATxCYWxhbmNlT2Y8VCwgST4EhFRoZSBhbW91bnQgcGxhY2VkIGJ5IHRoZSBhY2NvdW50LgIEnFRoZSBkZWNpc2lvbiBkZXBvc2l0IGhhcyBiZWVuIHJlZnVuZGVkLjhEZXBvc2l0U2xhc2hlZAgBDHdobwABMFQ6OkFjY291bnRJZASMVGhlIGFjY291bnQgd2hvIHBsYWNlZCB0aGUgZGVwb3NpdC4BGGFtb3VudBgBPEJhbGFuY2VPZjxULCBJPgSEVGhlIGFtb3VudCBwbGFjZWQgYnkgdGhlIGFjY291bnQuAwRsQSBkZXBvc2l0IGhhcyBiZWVuIHNsYXNoZWQuPERlY2lzaW9uU3RhcnRlZBABFGluZGV4EAE8UmVmZXJlbmR1bUluZGV4BGBJbmRleCBvZiB0aGUgcmVmZXJlbmR1bS4BFHRyYWNrbQEBPFRyYWNrSWRPZjxULCBJPgQlAVRoZSB0cmFjayAoYW5kIGJ5IGV4dGVuc2lvbiBwcm9wb3NhbCBkaXNwYXRjaCBvcmlnaW4pIG9mIHRoaXMgcmVmZXJlbmR1bS4BIHByb3Bvc2FscQEBTEJvdW5kZWRDYWxsT2Y8VCwgST4EgFRoZSBwcm9wb3NhbCBmb3IgdGhlIHJlZmVyZW5kdW0uARR0YWxseQ0HASBUOjpUYWxseQS4VGhlIGN1cnJlbnQgdGFsbHkgb2Ygdm90ZXMgaW4gdGhpcyByZWZlcmVuZHVtLgQEvEEgcmVmZXJlbmR1bSBoYXMgbW92ZWQgaW50byB0aGUgZGVjaWRpbmcgcGhhc2UuOENvbmZpcm1TdGFydGVkBAEUaW5kZXgQATxSZWZlcmVuZHVtSW5kZXgEYEluZGV4IG9mIHRoZSByZWZlcmVuZHVtLgUAOENvbmZpcm1BYm9ydGVkBAEUaW5kZXgQATxSZWZlcmVuZHVtSW5kZXgEYEluZGV4IG9mIHRoZSByZWZlcmVuZHVtLgYAJENvbmZpcm1lZAgBFGluZGV4EAE8UmVmZXJlbmR1bUluZGV4BGBJbmRleCBvZiB0aGUgcmVmZXJlbmR1bS4BFHRhbGx5DQcBIFQ6OlRhbGx5BLBUaGUgZmluYWwgdGFsbHkgb2Ygdm90ZXMgaW4gdGhpcyByZWZlcmVuZHVtLgcEIQFBIHJlZmVyZW5kdW0gaGFzIGVuZGVkIGl0cyBjb25maXJtYXRpb24gcGhhc2UgYW5kIGlzIHJlYWR5IGZvciBhcHByb3ZhbC4gQXBwcm92ZWQEARRpbmRleBABPFJlZmVyZW5kdW1JbmRleARgSW5kZXggb2YgdGhlIHJlZmVyZW5kdW0uCAQNAUEgcmVmZXJlbmR1bSBoYXMgYmVlbiBhcHByb3ZlZCBhbmQgaXRzIHByb3Bvc2FsIGhhcyBiZWVuIHNjaGVkdWxlZC4gUmVqZWN0ZWQIARRpbmRleBABPFJlZmVyZW5kdW1JbmRleARgSW5kZXggb2YgdGhlIHJlZmVyZW5kdW0uARR0YWxseQ0HASBUOjpUYWxseQSwVGhlIGZpbmFsIHRhbGx5IG9mIHZvdGVzIGluIHRoaXMgcmVmZXJlbmR1bS4JBKxBIHByb3Bvc2FsIGhhcyBiZWVuIHJlamVjdGVkIGJ5IHJlZmVyZW5kdW0uIFRpbWVkT3V0CAEUaW5kZXgQATxSZWZlcmVuZHVtSW5kZXgEYEluZGV4IG9mIHRoZSByZWZlcmVuZHVtLgEUdGFsbHkNBwEgVDo6VGFsbHkEsFRoZSBmaW5hbCB0YWxseSBvZiB2b3RlcyBpbiB0aGlzIHJlZmVyZW5kdW0uCgTYQSByZWZlcmVuZHVtIGhhcyBiZWVuIHRpbWVkIG91dCB3aXRob3V0IGJlaW5nIGRlY2lkZWQuJENhbmNlbGxlZAgBFGluZGV4EAE8UmVmZXJlbmR1bUluZGV4BGBJbmRleCBvZiB0aGUgcmVmZXJlbmR1bS4BFHRhbGx5DQcBIFQ6OlRhbGx5BLBUaGUgZmluYWwgdGFsbHkgb2Ygdm90ZXMgaW4gdGhpcyByZWZlcmVuZHVtLgsEgEEgcmVmZXJlbmR1bSBoYXMgYmVlbiBjYW5jZWxsZWQuGEtpbGxlZAgBFGluZGV4EAE8UmVmZXJlbmR1bUluZGV4BGBJbmRleCBvZiB0aGUgcmVmZXJlbmR1bS4BFHRhbGx5DQcBIFQ6OlRhbGx5BLBUaGUgZmluYWwgdGFsbHkgb2Ygdm90ZXMgaW4gdGhpcyByZWZlcmVuZHVtLgwEdEEgcmVmZXJlbmR1bSBoYXMgYmVlbiBraWxsZWQuZFN1Ym1pc3Npb25EZXBvc2l0UmVmdW5kZWQMARRpbmRleBABPFJlZmVyZW5kdW1JbmRleARgSW5kZXggb2YgdGhlIHJlZmVyZW5kdW0uAQx3aG8AATBUOjpBY2NvdW50SWQEjFRoZSBhY2NvdW50IHdobyBwbGFjZWQgdGhlIGRlcG9zaXQuARhhbW91bnQYATxCYWxhbmNlT2Y8VCwgST4EhFRoZSBhbW91bnQgcGxhY2VkIGJ5IHRoZSBhY2NvdW50Lg0EpFRoZSBzdWJtaXNzaW9uIGRlcG9zaXQgaGFzIGJlZW4gcmVmdW5kZWQuLE1ldGFkYXRhU2V0CAEUaW5kZXgQATxSZWZlcmVuZHVtSW5kZXgEYEluZGV4IG9mIHRoZSByZWZlcmVuZHVtLgEQaGFzaDQBHFQ6Okhhc2gEOFByZWltYWdlIGhhc2guDgScTWV0YWRhdGEgZm9yIGEgcmVmZXJlbmR1bSBoYXMgYmVlbiBzZXQuPE1ldGFkYXRhQ2xlYXJlZAgBFGluZGV4EAE8UmVmZXJlbmR1bUluZGV4BGBJbmRleCBvZiB0aGUgcmVmZXJlbmR1bS4BEGhhc2g0ARxUOjpIYXNoBDhQcmVpbWFnZSBoYXNoLg8ErE1ldGFkYXRhIGZvciBhIHJlZmVyZW5kdW0gaGFzIGJlZW4gY2xlYXJlZC4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXRtAQAABQQAcQEQNGZyYW1lX3N1cHBvcnQYdHJhaXRzJHByZWltYWdlcxxCb3VuZGVkCARUAXUBBEgBBQcBDBhMZWdhY3kEARBoYXNoNAEkSDo6T3V0cHV0AAAAGElubGluZQQACQcBNEJvdW5kZWRJbmxpbmUAAQAYTG9va3VwCAEQaGFzaDQBJEg6Ok91dHB1dAABDGxlbhABDHUzMgACAAB1AQg0cGFzZW9fcnVudGltZSxSdW50aW1lQ2FsbAABwBhTeXN0ZW0EAHkBAa0Bc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPFN5c3RlbSwgUnVudGltZT4AAAAkU2NoZWR1bGVyBACJAQG5AXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxTY2hlZHVsZXIsIFJ1bnRpbWU+AAEAIFByZWltYWdlBACRAQG1AXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxQcmVpbWFnZSwgUnVudGltZT4ACgAQQmFiZQQAmQEBpQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8QmFiZSwgUnVudGltZT4AAgAkVGltZXN0YW1wBAC9AQG5AXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxUaW1lc3RhbXAsIFJ1bnRpbWU+AAMAHEluZGljZXMEAMEBAbEBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPEluZGljZXMsIFJ1bnRpbWU+AAQAIEJhbGFuY2VzBADNAQG1AXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxCYWxhbmNlcywgUnVudGltZT4ABQAcU3Rha2luZwQA2QEBsQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8U3Rha2luZywgUnVudGltZT4ABwAcU2Vzc2lvbgQAFQIBsQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8U2Vzc2lvbiwgUnVudGltZT4ACQAcR3JhbmRwYQQAMQIBsQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8R3JhbmRwYSwgUnVudGltZT4ACwAgVHJlYXN1cnkEAF0CAbUBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPFRyZWFzdXJ5LCBSdW50aW1lPgATAEBDb252aWN0aW9uVm90aW5nBABlAgHVAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxDb252aWN0aW9uVm90aW5nLCBSdW50aW1lPgAUACRSZWZlcmVuZGEEAHkCAbkBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPFJlZmVyZW5kYSwgUnVudGltZT4AFQAkV2hpdGVsaXN0BAChAgG5AXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxXaGl0ZWxpc3QsIFJ1bnRpbWU+ABcAKFBhcmFtZXRlcnMEAKUCAb0Bc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPFBhcmFtZXRlcnMsIFJ1bnRpbWU+ABsAGENsYWltcwQA0QIBrQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8Q2xhaW1zLCBSdW50aW1lPgAYABxWZXN0aW5nBADxAgGxAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxWZXN0aW5nLCBSdW50aW1lPgAZABxVdGlsaXR5BAD5AgGxAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxVdGlsaXR5LCBSdW50aW1lPgAaABRQcm94eQQAAQMBqQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8UHJveHksIFJ1bnRpbWU+AB0AIE11bHRpc2lnBAANAwG1AXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxNdWx0aXNpZywgUnVudGltZT4AHgAgQm91bnRpZXMEABkDAbUBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPEJvdW50aWVzLCBSdW50aW1lPgAiADRDaGlsZEJvdW50aWVzBAAdAwHJAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxDaGlsZEJvdW50aWVzLCBSdW50aW1lPgAmAGhFbGVjdGlvblByb3ZpZGVyTXVsdGlQaGFzZQQAIQMB/QFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8RWxlY3Rpb25Qcm92aWRlck11bHRpUGhhc2UsIFJ1bnRpbWU+ACQAJFZvdGVyTGlzdAQAFQQBuQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8Vm90ZXJMaXN0LCBSdW50aW1lPgAlADxOb21pbmF0aW9uUG9vbHMEABkEAdEBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPE5vbWluYXRpb25Qb29scywgUnVudGltZT4AJwAsRmFzdFVuc3Rha2UEAE0EAcEBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPEZhc3RVbnN0YWtlLCBSdW50aW1lPgAoADRDb25maWd1cmF0aW9uBABRBAHJAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxDb25maWd1cmF0aW9uLCBSdW50aW1lPgAzACxQYXJhc1NoYXJlZAQAdQQBwQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8UGFyYXNTaGFyZWQsIFJ1bnRpbWU+ADQANFBhcmFJbmNsdXNpb24EAHkEAckBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPFBhcmFJbmNsdXNpb24sIFJ1bnRpbWU+ADUAMFBhcmFJbmhlcmVudAQAfQQBxQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8UGFyYUluaGVyZW50LCBSdW50aW1lPgA2ABRQYXJhcwQACQUBqQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8UGFyYXMsIFJ1bnRpbWU+ADgALEluaXRpYWxpemVyBAARBQHBAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxJbml0aWFsaXplciwgUnVudGltZT4AOQAQSHJtcAQAFQUBpQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8SHJtcCwgUnVudGltZT4APAA0UGFyYXNEaXNwdXRlcwQAHQUByQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8UGFyYXNEaXNwdXRlcywgUnVudGltZT4APgA0UGFyYXNTbGFzaGluZwQAIQUByQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8UGFyYXNTbGFzaGluZywgUnVudGltZT4APwAgT25EZW1hbmQEADEFAbUBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPE9uRGVtYW5kLCBSdW50aW1lPgBAACRSZWdpc3RyYXIEADUFAbkBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPFJlZ2lzdHJhciwgUnVudGltZT4ARgAUU2xvdHMEADkFAakBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPFNsb3RzLCBSdW50aW1lPgBHACBBdWN0aW9ucwQAPQUBtQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8QXVjdGlvbnMsIFJ1bnRpbWU+AEgAJENyb3dkbG9hbgQARQUBuQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8Q3Jvd2Rsb2FuLCBSdW50aW1lPgBJACBDb3JldGltZQQAWQUBtQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8Q29yZXRpbWUsIFJ1bnRpbWU+AEoASFN0YXRlVHJpZU1pZ3JhdGlvbgQAbQUB3QFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8U3RhdGVUcmllTWlncmF0aW9uLCBSdW50aW1lPgBiACRYY21QYWxsZXQEAIUFAbkBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPFhjbVBhbGxldCwgUnVudGltZT4AYwAwTWVzc2FnZVF1ZXVlBADBBgHFAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxNZXNzYWdlUXVldWUsIFJ1bnRpbWU+AGQAJEFzc2V0UmF0ZQQAzQYBuQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8QXNzZXRSYXRlLCBSdW50aW1lPgBlABRCZWVmeQQA1QYBqQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8QmVlZnksIFJ1bnRpbWU+AMgAPFBhcmFTdWRvV3JhcHBlcgQA+QYB0QFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8UGFyYVN1ZG9XcmFwcGVyLCBSdW50aW1lPgD6ABBTdWRvBAABBwGlAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxTdWRvLCBSdW50aW1lPgD/AAB5AQwwZnJhbWVfc3lzdGVtGHBhbGxldBBDYWxsBARUAAEsGHJlbWFyawQBGHJlbWFyazgBHFZlYzx1OD4AAAxoTWFrZSBzb21lIG9uLWNoYWluIHJlbWFyay4AiENhbiBiZSBleGVjdXRlZCBieSBldmVyeSBgb3JpZ2luYC44c2V0X2hlYXBfcGFnZXMEARRwYWdlczABDHU2NAABBPhTZXQgdGhlIG51bWJlciBvZiBwYWdlcyBpbiB0aGUgV2ViQXNzZW1ibHkgZW52aXJvbm1lbnQncyBoZWFwLiBzZXRfY29kZQQBEGNvZGU4ARxWZWM8dTg+AAIEZFNldCB0aGUgbmV3IHJ1bnRpbWUgY29kZS5cc2V0X2NvZGVfd2l0aG91dF9jaGVja3MEARBjb2RlOAEcVmVjPHU4PgADEBkBU2V0IHRoZSBuZXcgcnVudGltZSBjb2RlIHdpdGhvdXQgZG9pbmcgYW55IGNoZWNrcyBvZiB0aGUgZ2l2ZW4gYGNvZGVgLgBRAU5vdGUgdGhhdCBydW50aW1lIHVwZ3JhZGVzIHdpbGwgbm90IHJ1biBpZiB0aGlzIGlzIGNhbGxlZCB3aXRoIGEgbm90LWluY3JlYXNpbmcgc3BlYyB2ZXJzaW9uISxzZXRfc3RvcmFnZQQBFGl0ZW1zfQEBNFZlYzxLZXlWYWx1ZT4ABARoU2V0IHNvbWUgaXRlbXMgb2Ygc3RvcmFnZS4wa2lsbF9zdG9yYWdlBAEQa2V5c4UBASBWZWM8S2V5PgAFBHRLaWxsIHNvbWUgaXRlbXMgZnJvbSBzdG9yYWdlLixraWxsX3ByZWZpeAgBGHByZWZpeDgBDEtleQABHHN1YmtleXMQAQx1MzIABhARAUtpbGwgYWxsIHN0b3JhZ2UgaXRlbXMgd2l0aCBhIGtleSB0aGF0IHN0YXJ0cyB3aXRoIHRoZSBnaXZlbiBwcmVmaXguADkBKipOT1RFOioqIFdlIHJlbHkgb24gdGhlIFJvb3Qgb3JpZ2luIHRvIHByb3ZpZGUgdXMgdGhlIG51bWJlciBvZiBzdWJrZXlzIHVuZGVyPQF0aGUgcHJlZml4IHdlIGFyZSByZW1vdmluZyB0byBhY2N1cmF0ZWx5IGNhbGN1bGF0ZSB0aGUgd2VpZ2h0IG9mIHRoaXMgZnVuY3Rpb24uRHJlbWFya193aXRoX2V2ZW50BAEYcmVtYXJrOAEcVmVjPHU4PgAHBKRNYWtlIHNvbWUgb24tY2hhaW4gcmVtYXJrIGFuZCBlbWl0IGV2ZW50LkRhdXRob3JpemVfdXBncmFkZQQBJGNvZGVfaGFzaDQBHFQ6Okhhc2gACRBhAUF1dGhvcml6ZSBhbiB1cGdyYWRlIHRvIGEgZ2l2ZW4gYGNvZGVfaGFzaGAgZm9yIHRoZSBydW50aW1lLiBUaGUgcnVudGltZSBjYW4gYmUgc3VwcGxpZWQYbGF0ZXIuAHxUaGlzIGNhbGwgcmVxdWlyZXMgUm9vdCBvcmlnaW4ugGF1dGhvcml6ZV91cGdyYWRlX3dpdGhvdXRfY2hlY2tzBAEkY29kZV9oYXNoNAEcVDo6SGFzaAAKIGEBQXV0aG9yaXplIGFuIHVwZ3JhZGUgdG8gYSBnaXZlbiBgY29kZV9oYXNoYCBmb3IgdGhlIHJ1bnRpbWUuIFRoZSBydW50aW1lIGNhbiBiZSBzdXBwbGllZBhsYXRlci4AXQFXQVJOSU5HOiBUaGlzIGF1dGhvcml6ZXMgYW4gdXBncmFkZSB0aGF0IHdpbGwgdGFrZSBwbGFjZSB3aXRob3V0IGFueSBzYWZldHkgY2hlY2tzLCBmb3JZAWV4YW1wbGUgdGhhdCB0aGUgc3BlYyBuYW1lIHJlbWFpbnMgdGhlIHNhbWUgYW5kIHRoYXQgdGhlIHZlcnNpb24gbnVtYmVyIGluY3JlYXNlcy4gTm908HJlY29tbWVuZGVkIGZvciBub3JtYWwgdXNlLiBVc2UgYGF1dGhvcml6ZV91cGdyYWRlYCBpbnN0ZWFkLgB8VGhpcyBjYWxsIHJlcXVpcmVzIFJvb3Qgb3JpZ2luLmBhcHBseV9hdXRob3JpemVkX3VwZ3JhZGUEARBjb2RlOAEcVmVjPHU4PgALJFUBUHJvdmlkZSB0aGUgcHJlaW1hZ2UgKHJ1bnRpbWUgYmluYXJ5KSBgY29kZWAgZm9yIGFuIHVwZ3JhZGUgdGhhdCBoYXMgYmVlbiBhdXRob3JpemVkLgBJAUlmIHRoZSBhdXRob3JpemF0aW9uIHJlcXVpcmVkIGEgdmVyc2lvbiBjaGVjaywgdGhpcyBjYWxsIHdpbGwgZW5zdXJlIHRoZSBzcGVjIG5hbWXocmVtYWlucyB1bmNoYW5nZWQgYW5kIHRoYXQgdGhlIHNwZWMgdmVyc2lvbiBoYXMgaW5jcmVhc2VkLgBZAURlcGVuZGluZyBvbiB0aGUgcnVudGltZSdzIGBPblNldENvZGVgIGNvbmZpZ3VyYXRpb24sIHRoaXMgZnVuY3Rpb24gbWF5IGRpcmVjdGx5IGFwcGx5EQF0aGUgbmV3IGBjb2RlYCBpbiB0aGUgc2FtZSBibG9jayBvciBhdHRlbXB0IHRvIHNjaGVkdWxlIHRoZSB1cGdyYWRlLgBgQWxsIG9yaWdpbnMgYXJlIGFsbG93ZWQuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLn0BAAACgQEAgQEAAAQIODgAhQEAAAI4AIkBDEBwYWxsZXRfc2NoZWR1bGVyGHBhbGxldBBDYWxsBARUAAEoIHNjaGVkdWxlEAEQd2hlbhABREJsb2NrTnVtYmVyRm9yPFQ+AAE4bWF5YmVfcGVyaW9kaWONAQGsT3B0aW9uPHNjaGVkdWxlOjpQZXJpb2Q8QmxvY2tOdW1iZXJGb3I8VD4+PgABIHByaW9yaXR5CAFIc2NoZWR1bGU6OlByaW9yaXR5AAEQY2FsbHUBAXxCb3g8PFQgYXMgQ29uZmlnPjo6UnVudGltZUNhbGw+AAAEcEFub255bW91c2x5IHNjaGVkdWxlIGEgdGFzay4YY2FuY2VsCAEQd2hlbhABREJsb2NrTnVtYmVyRm9yPFQ+AAEUaW5kZXgQAQx1MzIAAQSUQ2FuY2VsIGFuIGFub255bW91c2x5IHNjaGVkdWxlZCB0YXNrLjhzY2hlZHVsZV9uYW1lZBQBCGlkBAEgVGFza05hbWUAARB3aGVuEAFEQmxvY2tOdW1iZXJGb3I8VD4AAThtYXliZV9wZXJpb2RpY40BAaxPcHRpb248c2NoZWR1bGU6OlBlcmlvZDxCbG9ja051bWJlckZvcjxUPj4+AAEgcHJpb3JpdHkIAUhzY2hlZHVsZTo6UHJpb3JpdHkAARBjYWxsdQEBfEJveDw8VCBhcyBDb25maWc+OjpSdW50aW1lQ2FsbD4AAgRYU2NoZWR1bGUgYSBuYW1lZCB0YXNrLjBjYW5jZWxfbmFtZWQEAQhpZAQBIFRhc2tOYW1lAAMEeENhbmNlbCBhIG5hbWVkIHNjaGVkdWxlZCB0YXNrLjhzY2hlZHVsZV9hZnRlchABFGFmdGVyEAFEQmxvY2tOdW1iZXJGb3I8VD4AAThtYXliZV9wZXJpb2RpY40BAaxPcHRpb248c2NoZWR1bGU6OlBlcmlvZDxCbG9ja051bWJlckZvcjxUPj4+AAEgcHJpb3JpdHkIAUhzY2hlZHVsZTo6UHJpb3JpdHkAARBjYWxsdQEBfEJveDw8VCBhcyBDb25maWc+OjpSdW50aW1lQ2FsbD4ABASoQW5vbnltb3VzbHkgc2NoZWR1bGUgYSB0YXNrIGFmdGVyIGEgZGVsYXkuUHNjaGVkdWxlX25hbWVkX2FmdGVyFAEIaWQEASBUYXNrTmFtZQABFGFmdGVyEAFEQmxvY2tOdW1iZXJGb3I8VD4AAThtYXliZV9wZXJpb2RpY40BAaxPcHRpb248c2NoZWR1bGU6OlBlcmlvZDxCbG9ja051bWJlckZvcjxUPj4+AAEgcHJpb3JpdHkIAUhzY2hlZHVsZTo6UHJpb3JpdHkAARBjYWxsdQEBfEJveDw8VCBhcyBDb25maWc+OjpSdW50aW1lQ2FsbD4ABQSQU2NoZWR1bGUgYSBuYW1lZCB0YXNrIGFmdGVyIGEgZGVsYXkuJHNldF9yZXRyeQwBEHRhc2uAAXhUYXNrQWRkcmVzczxCbG9ja051bWJlckZvcjxUPj4AARxyZXRyaWVzCAEIdTgAARhwZXJpb2QQAURCbG9ja051bWJlckZvcjxUPgAGMFkBU2V0IGEgcmV0cnkgY29uZmlndXJhdGlvbiBmb3IgYSB0YXNrIHNvIHRoYXQsIGluIGNhc2UgaXRzIHNjaGVkdWxlZCBydW4gZmFpbHMsIGl0IHdpbGxVAWJlIHJldHJpZWQgYWZ0ZXIgYHBlcmlvZGAgYmxvY2tzLCBmb3IgYSB0b3RhbCBhbW91bnQgb2YgYHJldHJpZXNgIHJldHJpZXMgb3IgdW50aWwgaXQkc3VjY2VlZHMuAFUBVGFza3Mgd2hpY2ggbmVlZCB0byBiZSBzY2hlZHVsZWQgZm9yIGEgcmV0cnkgYXJlIHN0aWxsIHN1YmplY3QgdG8gd2VpZ2h0IG1ldGVyaW5nIGFuZFEBYWdlbmRhIHNwYWNlLCBzYW1lIGFzIGEgcmVndWxhciB0YXNrLiBJZiBhIHBlcmlvZGljIHRhc2sgZmFpbHMsIGl0IHdpbGwgYmUgc2NoZWR1bGVkkG5vcm1hbGx5IHdoaWxlIHRoZSB0YXNrIGlzIHJldHJ5aW5nLgBRAVRhc2tzIHNjaGVkdWxlZCBhcyBhIHJlc3VsdCBvZiBhIHJldHJ5IGZvciBhIHBlcmlvZGljIHRhc2sgYXJlIHVubmFtZWQsIG5vbi1wZXJpb2RpYz0BY2xvbmVzIG9mIHRoZSBvcmlnaW5hbCB0YXNrLiBUaGVpciByZXRyeSBjb25maWd1cmF0aW9uIHdpbGwgYmUgZGVyaXZlZCBmcm9tIHRoZU0Bb3JpZ2luYWwgdGFzaydzIGNvbmZpZ3VyYXRpb24sIGJ1dCB3aWxsIGhhdmUgYSBsb3dlciB2YWx1ZSBmb3IgYHJlbWFpbmluZ2AgdGhhbiB0aGVkb3JpZ2luYWwgYHRvdGFsX3JldHJpZXNgLjxzZXRfcmV0cnlfbmFtZWQMAQhpZAQBIFRhc2tOYW1lAAEccmV0cmllcwgBCHU4AAEYcGVyaW9kEAFEQmxvY2tOdW1iZXJGb3I8VD4ABzBdAVNldCBhIHJldHJ5IGNvbmZpZ3VyYXRpb24gZm9yIGEgbmFtZWQgdGFzayBzbyB0aGF0LCBpbiBjYXNlIGl0cyBzY2hlZHVsZWQgcnVuIGZhaWxzLCBpdF0Bd2lsbCBiZSByZXRyaWVkIGFmdGVyIGBwZXJpb2RgIGJsb2NrcywgZm9yIGEgdG90YWwgYW1vdW50IG9mIGByZXRyaWVzYCByZXRyaWVzIG9yIHVudGlsMGl0IHN1Y2NlZWRzLgBVAVRhc2tzIHdoaWNoIG5lZWQgdG8gYmUgc2NoZWR1bGVkIGZvciBhIHJldHJ5IGFyZSBzdGlsbCBzdWJqZWN0IHRvIHdlaWdodCBtZXRlcmluZyBhbmRRAWFnZW5kYSBzcGFjZSwgc2FtZSBhcyBhIHJlZ3VsYXIgdGFzay4gSWYgYSBwZXJpb2RpYyB0YXNrIGZhaWxzLCBpdCB3aWxsIGJlIHNjaGVkdWxlZJBub3JtYWxseSB3aGlsZSB0aGUgdGFzayBpcyByZXRyeWluZy4AUQFUYXNrcyBzY2hlZHVsZWQgYXMgYSByZXN1bHQgb2YgYSByZXRyeSBmb3IgYSBwZXJpb2RpYyB0YXNrIGFyZSB1bm5hbWVkLCBub24tcGVyaW9kaWM9AWNsb25lcyBvZiB0aGUgb3JpZ2luYWwgdGFzay4gVGhlaXIgcmV0cnkgY29uZmlndXJhdGlvbiB3aWxsIGJlIGRlcml2ZWQgZnJvbSB0aGVNAW9yaWdpbmFsIHRhc2sncyBjb25maWd1cmF0aW9uLCBidXQgd2lsbCBoYXZlIGEgbG93ZXIgdmFsdWUgZm9yIGByZW1haW5pbmdgIHRoYW4gdGhlZG9yaWdpbmFsIGB0b3RhbF9yZXRyaWVzYC4wY2FuY2VsX3JldHJ5BAEQdGFza4ABeFRhc2tBZGRyZXNzPEJsb2NrTnVtYmVyRm9yPFQ+PgAIBKhSZW1vdmVzIHRoZSByZXRyeSBjb25maWd1cmF0aW9uIG9mIGEgdGFzay5IY2FuY2VsX3JldHJ5X25hbWVkBAEIaWQEASBUYXNrTmFtZQAJBLxDYW5jZWwgdGhlIHJldHJ5IGNvbmZpZ3VyYXRpb24gb2YgYSBuYW1lZCB0YXNrLgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy6NAQQYT3B0aW9uBARUAYABCBBOb25lAAAAEFNvbWUEAIAAAAEAAJEBDDxwYWxsZXRfcHJlaW1hZ2UYcGFsbGV0EENhbGwEBFQAARQ0bm90ZV9wcmVpbWFnZQQBFGJ5dGVzOAEcVmVjPHU4PgAAEHRSZWdpc3RlciBhIHByZWltYWdlIG9uLWNoYWluLgBVAUlmIHRoZSBwcmVpbWFnZSB3YXMgcHJldmlvdXNseSByZXF1ZXN0ZWQsIG5vIGZlZXMgb3IgZGVwb3NpdHMgYXJlIHRha2VuIGZvciBwcm92aWRpbmdVAXRoZSBwcmVpbWFnZS4gT3RoZXJ3aXNlLCBhIGRlcG9zaXQgaXMgdGFrZW4gcHJvcG9ydGlvbmFsIHRvIHRoZSBzaXplIG9mIHRoZSBwcmVpbWFnZS48dW5ub3RlX3ByZWltYWdlBAEQaGFzaDQBHFQ6Okhhc2gAARjcQ2xlYXIgYW4gdW5yZXF1ZXN0ZWQgcHJlaW1hZ2UgZnJvbSB0aGUgcnVudGltZSBzdG9yYWdlLgD8SWYgYGxlbmAgaXMgcHJvdmlkZWQsIHRoZW4gaXQgd2lsbCBiZSBhIG11Y2ggY2hlYXBlciBvcGVyYXRpb24uAAEBLSBgaGFzaGA6IFRoZSBoYXNoIG9mIHRoZSBwcmVpbWFnZSB0byBiZSByZW1vdmVkIGZyb20gdGhlIHN0b3JlLrgtIGBsZW5gOiBUaGUgbGVuZ3RoIG9mIHRoZSBwcmVpbWFnZSBvZiBgaGFzaGAuQHJlcXVlc3RfcHJlaW1hZ2UEARBoYXNoNAEcVDo6SGFzaAACEEEBUmVxdWVzdCBhIHByZWltYWdlIGJlIHVwbG9hZGVkIHRvIHRoZSBjaGFpbiB3aXRob3V0IHBheWluZyBhbnkgZmVlcyBvciBkZXBvc2l0cy4AVQFJZiB0aGUgcHJlaW1hZ2UgcmVxdWVzdHMgaGFzIGFscmVhZHkgYmVlbiBwcm92aWRlZCBvbi1jaGFpbiwgd2UgdW5yZXNlcnZlIGFueSBkZXBvc2l0OQFhIHVzZXIgbWF5IGhhdmUgcGFpZCwgYW5kIHRha2UgdGhlIGNvbnRyb2wgb2YgdGhlIHByZWltYWdlIG91dCBvZiB0aGVpciBoYW5kcy5IdW5yZXF1ZXN0X3ByZWltYWdlBAEQaGFzaDQBHFQ6Okhhc2gAAwy8Q2xlYXIgYSBwcmV2aW91c2x5IG1hZGUgcmVxdWVzdCBmb3IgYSBwcmVpbWFnZS4ALQFOT1RFOiBUSElTIE1VU1QgTk9UIEJFIENBTExFRCBPTiBgaGFzaGAgTU9SRSBUSU1FUyBUSEFOIGByZXF1ZXN0X3ByZWltYWdlYC44ZW5zdXJlX3VwZGF0ZWQEARhoYXNoZXOVAQEwVmVjPFQ6Okhhc2g+AAQMxEVuc3VyZSB0aGF0IHRoZSBhIGJ1bGsgb2YgcHJlLWltYWdlcyBpcyB1cGdyYWRlZC4APQFUaGUgY2FsbGVyIHBheXMgbm8gZmVlIGlmIGF0IGxlYXN0IDkwJSBvZiBwcmUtaW1hZ2VzIHdlcmUgc3VjY2Vzc2Z1bGx5IHVwZGF0ZWQuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLpUBAAACNACZAQwscGFsbGV0X2JhYmUYcGFsbGV0EENhbGwEBFQAAQxMcmVwb3J0X2VxdWl2b2NhdGlvbggBSGVxdWl2b2NhdGlvbl9wcm9vZp0BAZBCb3g8RXF1aXZvY2F0aW9uUHJvb2Y8SGVhZGVyRm9yPFQ+Pj4AATxrZXlfb3duZXJfcHJvb2atAQFAVDo6S2V5T3duZXJQcm9vZgAAEAkBUmVwb3J0IGF1dGhvcml0eSBlcXVpdm9jYXRpb24vbWlzYmVoYXZpb3IuIFRoaXMgbWV0aG9kIHdpbGwgdmVyaWZ5BQF0aGUgZXF1aXZvY2F0aW9uIHByb29mIGFuZCB2YWxpZGF0ZSB0aGUgZ2l2ZW4ga2V5IG93bmVyc2hpcCBwcm9vZg0BYWdhaW5zdCB0aGUgZXh0cmFjdGVkIG9mZmVuZGVyLiBJZiBib3RoIGFyZSB2YWxpZCwgdGhlIG9mZmVuY2Ugd2lsbDBiZSByZXBvcnRlZC5wcmVwb3J0X2VxdWl2b2NhdGlvbl91bnNpZ25lZAgBSGVxdWl2b2NhdGlvbl9wcm9vZp0BAZBCb3g8RXF1aXZvY2F0aW9uUHJvb2Y8SGVhZGVyRm9yPFQ+Pj4AATxrZXlfb3duZXJfcHJvb2atAQFAVDo6S2V5T3duZXJQcm9vZgABIAkBUmVwb3J0IGF1dGhvcml0eSBlcXVpdm9jYXRpb24vbWlzYmVoYXZpb3IuIFRoaXMgbWV0aG9kIHdpbGwgdmVyaWZ5BQF0aGUgZXF1aXZvY2F0aW9uIHByb29mIGFuZCB2YWxpZGF0ZSB0aGUgZ2l2ZW4ga2V5IG93bmVyc2hpcCBwcm9vZg0BYWdhaW5zdCB0aGUgZXh0cmFjdGVkIG9mZmVuZGVyLiBJZiBib3RoIGFyZSB2YWxpZCwgdGhlIG9mZmVuY2Ugd2lsbDBiZSByZXBvcnRlZC4NAVRoaXMgZXh0cmluc2ljIG11c3QgYmUgY2FsbGVkIHVuc2lnbmVkIGFuZCBpdCBpcyBleHBlY3RlZCB0aGF0IG9ubHkVAWJsb2NrIGF1dGhvcnMgd2lsbCBjYWxsIGl0ICh2YWxpZGF0ZWQgaW4gYFZhbGlkYXRlVW5zaWduZWRgKSwgYXMgc3VjaBUBaWYgdGhlIGJsb2NrIGF1dGhvciBpcyBkZWZpbmVkIGl0IHdpbGwgYmUgZGVmaW5lZCBhcyB0aGUgZXF1aXZvY2F0aW9uJHJlcG9ydGVyLkhwbGFuX2NvbmZpZ19jaGFuZ2UEARhjb25maWexAQFQTmV4dENvbmZpZ0Rlc2NyaXB0b3IAAhBdAVBsYW4gYW4gZXBvY2ggY29uZmlnIGNoYW5nZS4gVGhlIGVwb2NoIGNvbmZpZyBjaGFuZ2UgaXMgcmVjb3JkZWQgYW5kIHdpbGwgYmUgZW5hY3RlZCBvblEBdGhlIG5leHQgY2FsbCB0byBgZW5hY3RfZXBvY2hfY2hhbmdlYC4gVGhlIGNvbmZpZyB3aWxsIGJlIGFjdGl2YXRlZCBvbmUgZXBvY2ggYWZ0ZXIuWQFNdWx0aXBsZSBjYWxscyB0byB0aGlzIG1ldGhvZCB3aWxsIHJlcGxhY2UgYW55IGV4aXN0aW5nIHBsYW5uZWQgY29uZmlnIGNoYW5nZSB0aGF0IGhhZFRub3QgYmVlbiBlbmFjdGVkIHlldC4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMunQEISHNwX2NvbnNlbnN1c19zbG90c0RFcXVpdm9jYXRpb25Qcm9vZggYSGVhZGVyAaEBCElkAaUBABABIG9mZmVuZGVypQEBCElkAAEQc2xvdKkBARBTbG90AAEwZmlyc3RfaGVhZGVyoQEBGEhlYWRlcgABNHNlY29uZF9oZWFkZXKhAQEYSGVhZGVyAAChARAoc3BfcnVudGltZRxnZW5lcmljGGhlYWRlchhIZWFkZXIIGE51bWJlcgEQEEhhc2gAABQBLHBhcmVudF9oYXNoNAEwSGFzaDo6T3V0cHV0AAEYbnVtYmVy7AEYTnVtYmVyAAEoc3RhdGVfcm9vdDQBMEhhc2g6Ok91dHB1dAABPGV4dHJpbnNpY3Nfcm9vdDQBMEhhc2g6Ok91dHB1dAABGGRpZ2VzdDwBGERpZ2VzdAAApQEMRHNwX2NvbnNlbnN1c19iYWJlDGFwcBhQdWJsaWMAAAQABAE8c3IyNTUxOTo6UHVibGljAACpAQhIc3BfY29uc2Vuc3VzX3Nsb3RzEFNsb3QAAAQAMAEMdTY0AACtAQgoc3Bfc2Vzc2lvbjxNZW1iZXJzaGlwUHJvb2YAAAwBHHNlc3Npb24QATBTZXNzaW9uSW5kZXgAASh0cmllX25vZGVzhQEBMFZlYzxWZWM8dTg+PgABPHZhbGlkYXRvcl9jb3VudBABOFZhbGlkYXRvckNvdW50AACxAQxEc3BfY29uc2Vuc3VzX2JhYmUcZGlnZXN0c1BOZXh0Q29uZmlnRGVzY3JpcHRvcgABBAhWMQgBBGO1AQEoKHU2NCwgdTY0KQABNGFsbG93ZWRfc2xvdHO5AQEwQWxsb3dlZFNsb3RzAAEAALUBAAAECDAwALkBCERzcF9jb25zZW5zdXNfYmFiZTBBbGxvd2VkU2xvdHMAAQwwUHJpbWFyeVNsb3RzAAAAdFByaW1hcnlBbmRTZWNvbmRhcnlQbGFpblNsb3RzAAEAbFByaW1hcnlBbmRTZWNvbmRhcnlWUkZTbG90cwACAAC9AQxAcGFsbGV0X3RpbWVzdGFtcBhwYWxsZXQQQ2FsbAQEVAABBAxzZXQEAQxub3csASRUOjpNb21lbnQAAExUU2V0IHRoZSBjdXJyZW50IHRpbWUuAFUBVGhpcyBjYWxsIHNob3VsZCBiZSBpbnZva2VkIGV4YWN0bHkgb25jZSBwZXIgYmxvY2suIEl0IHdpbGwgcGFuaWMgYXQgdGhlIGZpbmFsaXphdGlvbtRwaGFzZSwgaWYgdGhpcyBjYWxsIGhhc24ndCBiZWVuIGludm9rZWQgYnkgdGhhdCB0aW1lLgBBAVRoZSB0aW1lc3RhbXAgc2hvdWxkIGJlIGdyZWF0ZXIgdGhhbiB0aGUgcHJldmlvdXMgb25lIGJ5IHRoZSBhbW91bnQgc3BlY2lmaWVkIGJ5aFtgQ29uZmlnOjpNaW5pbXVtUGVyaW9kYF0uAMRUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfTm9uZV8uAFEBVGhpcyBkaXNwYXRjaCBjbGFzcyBpcyBfTWFuZGF0b3J5XyB0byBlbnN1cmUgaXQgZ2V0cyBleGVjdXRlZCBpbiB0aGUgYmxvY2suIEJlIGF3YXJlUQF0aGF0IGNoYW5naW5nIHRoZSBjb21wbGV4aXR5IG9mIHRoaXMgY2FsbCBjb3VsZCByZXN1bHQgZXhoYXVzdGluZyB0aGUgcmVzb3VyY2VzIGluIGGEYmxvY2sgdG8gZXhlY3V0ZSBhbnkgb3RoZXIgY2FsbHMuADQjIyBDb21wbGV4aXR5MQEtIGBPKDEpYCAoTm90ZSB0aGF0IGltcGxlbWVudGF0aW9ucyBvZiBgT25UaW1lc3RhbXBTZXRgIG11c3QgYWxzbyBiZSBgTygxKWApVQEtIDEgc3RvcmFnZSByZWFkIGFuZCAxIHN0b3JhZ2UgbXV0YXRpb24gKGNvZGVjIGBPKDEpYCBiZWNhdXNlIG9mIGBEaWRVcGRhdGU6OnRha2VgIGluQCAgYG9uX2ZpbmFsaXplYCnULSAxIGV2ZW50IGhhbmRsZXIgYG9uX3RpbWVzdGFtcF9zZXRgLiBNdXN0IGJlIGBPKDEpYC4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMuwQEMOHBhbGxldF9pbmRpY2VzGHBhbGxldBBDYWxsBARUAAEUFGNsYWltBAEUaW5kZXgQATxUOjpBY2NvdW50SW5kZXgAADCYQXNzaWduIGFuIHByZXZpb3VzbHkgdW5hc3NpZ25lZCBpbmRleC4A3FBheW1lbnQ6IGBEZXBvc2l0YCBpcyByZXNlcnZlZCBmcm9tIHRoZSBzZW5kZXIgYWNjb3VudC4AzFRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfLgDwLSBgaW5kZXhgOiB0aGUgaW5kZXggdG8gYmUgY2xhaW1lZC4gVGhpcyBtdXN0IG5vdCBiZSBpbiB1c2UuAJBFbWl0cyBgSW5kZXhBc3NpZ25lZGAgaWYgc3VjY2Vzc2Z1bC4ANCMjIENvbXBsZXhpdHkkLSBgTygxKWAuIHRyYW5zZmVyCAEMbmV3xQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEUaW5kZXgQATxUOjpBY2NvdW50SW5kZXgAATBdAUFzc2lnbiBhbiBpbmRleCBhbHJlYWR5IG93bmVkIGJ5IHRoZSBzZW5kZXIgdG8gYW5vdGhlciBhY2NvdW50LiBUaGUgYmFsYW5jZSByZXNlcnZhdGlvbrhpcyBlZmZlY3RpdmVseSB0cmFuc2ZlcnJlZCB0byB0aGUgbmV3IGFjY291bnQuAMxUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXy4AJQEtIGBpbmRleGA6IHRoZSBpbmRleCB0byBiZSByZS1hc3NpZ25lZC4gVGhpcyBtdXN0IGJlIG93bmVkIGJ5IHRoZSBzZW5kZXIuXQEtIGBuZXdgOiB0aGUgbmV3IG93bmVyIG9mIHRoZSBpbmRleC4gVGhpcyBmdW5jdGlvbiBpcyBhIG5vLW9wIGlmIGl0IGlzIGVxdWFsIHRvIHNlbmRlci4AkEVtaXRzIGBJbmRleEFzc2lnbmVkYCBpZiBzdWNjZXNzZnVsLgA0IyMgQ29tcGxleGl0eSQtIGBPKDEpYC4QZnJlZQQBFGluZGV4EAE8VDo6QWNjb3VudEluZGV4AAIwlEZyZWUgdXAgYW4gaW5kZXggb3duZWQgYnkgdGhlIHNlbmRlci4AXQFQYXltZW50OiBBbnkgcHJldmlvdXMgZGVwb3NpdCBwbGFjZWQgZm9yIHRoZSBpbmRleCBpcyB1bnJlc2VydmVkIGluIHRoZSBzZW5kZXIgYWNjb3VudC4AVQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXyBhbmQgdGhlIHNlbmRlciBtdXN0IG93biB0aGUgaW5kZXguAA0BLSBgaW5kZXhgOiB0aGUgaW5kZXggdG8gYmUgZnJlZWQuIFRoaXMgbXVzdCBiZSBvd25lZCBieSB0aGUgc2VuZGVyLgCERW1pdHMgYEluZGV4RnJlZWRgIGlmIHN1Y2Nlc3NmdWwuADQjIyBDb21wbGV4aXR5JC0gYE8oMSlgLjhmb3JjZV90cmFuc2ZlcgwBDG5ld8UBAVBBY2NvdW50SWRMb29rdXBPZjxUPgABFGluZGV4EAE8VDo6QWNjb3VudEluZGV4AAEYZnJlZXplIAEQYm9vbAADNFUBRm9yY2UgYW4gaW5kZXggdG8gYW4gYWNjb3VudC4gVGhpcyBkb2Vzbid0IHJlcXVpcmUgYSBkZXBvc2l0LiBJZiB0aGUgaW5kZXggaXMgYWxyZWFkeehoZWxkLCB0aGVuIGFueSBkZXBvc2l0IGlzIHJlaW1idXJzZWQgdG8gaXRzIGN1cnJlbnQgb3duZXIuAMRUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfUm9vdF8uAKQtIGBpbmRleGA6IHRoZSBpbmRleCB0byBiZSAocmUtKWFzc2lnbmVkLl0BLSBgbmV3YDogdGhlIG5ldyBvd25lciBvZiB0aGUgaW5kZXguIFRoaXMgZnVuY3Rpb24gaXMgYSBuby1vcCBpZiBpdCBpcyBlcXVhbCB0byBzZW5kZXIuQQEtIGBmcmVlemVgOiBpZiBzZXQgdG8gYHRydWVgLCB3aWxsIGZyZWV6ZSB0aGUgaW5kZXggc28gaXQgY2Fubm90IGJlIHRyYW5zZmVycmVkLgCQRW1pdHMgYEluZGV4QXNzaWduZWRgIGlmIHN1Y2Nlc3NmdWwuADQjIyBDb21wbGV4aXR5JC0gYE8oMSlgLhhmcmVlemUEARRpbmRleBABPFQ6OkFjY291bnRJbmRleAAEMEEBRnJlZXplIGFuIGluZGV4IHNvIGl0IHdpbGwgYWx3YXlzIHBvaW50IHRvIHRoZSBzZW5kZXIgYWNjb3VudC4gVGhpcyBjb25zdW1lcyB0aGUgZGVwb3NpdC4AWQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXyBhbmQgdGhlIHNpZ25pbmcgYWNjb3VudCBtdXN0IGhhdmUgYWxub24tZnJvemVuIGFjY291bnQgYGluZGV4YC4ArC0gYGluZGV4YDogdGhlIGluZGV4IHRvIGJlIGZyb3plbiBpbiBwbGFjZS4AiEVtaXRzIGBJbmRleEZyb3plbmAgaWYgc3VjY2Vzc2Z1bC4ANCMjIENvbXBsZXhpdHkkLSBgTygxKWAuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLsUBDChzcF9ydW50aW1lMG11bHRpYWRkcmVzczBNdWx0aUFkZHJlc3MIJEFjY291bnRJZAEAMEFjY291bnRJbmRleAGMARQISWQEAAABJEFjY291bnRJZAAAABRJbmRleAQAyQEBMEFjY291bnRJbmRleAABAAxSYXcEADgBHFZlYzx1OD4AAgAkQWRkcmVzczMyBAAEASBbdTg7IDMyXQADACRBZGRyZXNzMjAEAPgBIFt1ODsgMjBdAAQAAMkBAAAGjADNAQw8cGFsbGV0X2JhbGFuY2VzGHBhbGxldBBDYWxsCARUAARJAAEkUHRyYW5zZmVyX2FsbG93X2RlYXRoCAEQZGVzdMUBAVBBY2NvdW50SWRMb29rdXBPZjxUPgABFHZhbHVl/AEoVDo6QmFsYW5jZQAAHNRUcmFuc2ZlciBzb21lIGxpcXVpZCBmcmVlIGJhbGFuY2UgdG8gYW5vdGhlciBhY2NvdW50LgA1AWB0cmFuc2Zlcl9hbGxvd19kZWF0aGAgd2lsbCBzZXQgdGhlIGBGcmVlQmFsYW5jZWAgb2YgdGhlIHNlbmRlciBhbmQgcmVjZWl2ZXIuEQFJZiB0aGUgc2VuZGVyJ3MgYWNjb3VudCBpcyBiZWxvdyB0aGUgZXhpc3RlbnRpYWwgZGVwb3NpdCBhcyBhIHJlc3VsdLBvZiB0aGUgdHJhbnNmZXIsIHRoZSBhY2NvdW50IHdpbGwgYmUgcmVhcGVkLgAVAVRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIGBTaWduZWRgIGJ5IHRoZSB0cmFuc2FjdG9yLjhmb3JjZV90cmFuc2ZlcgwBGHNvdXJjZcUBAVBBY2NvdW50SWRMb29rdXBPZjxUPgABEGRlc3TFAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AARR2YWx1ZfwBKFQ6OkJhbGFuY2UAAghhAUV4YWN0bHkgYXMgYHRyYW5zZmVyX2FsbG93X2RlYXRoYCwgZXhjZXB0IHRoZSBvcmlnaW4gbXVzdCBiZSByb290IGFuZCB0aGUgc291cmNlIGFjY291bnREbWF5IGJlIHNwZWNpZmllZC5MdHJhbnNmZXJfa2VlcF9hbGl2ZQgBEGRlc3TFAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AARR2YWx1ZfwBKFQ6OkJhbGFuY2UAAxhZAVNhbWUgYXMgdGhlIFtgdHJhbnNmZXJfYWxsb3dfZGVhdGhgXSBjYWxsLCBidXQgd2l0aCBhIGNoZWNrIHRoYXQgdGhlIHRyYW5zZmVyIHdpbGwgbm90YGtpbGwgdGhlIG9yaWdpbiBhY2NvdW50LgDoOTklIG9mIHRoZSB0aW1lIHlvdSB3YW50IFtgdHJhbnNmZXJfYWxsb3dfZGVhdGhgXSBpbnN0ZWFkLgDwW2B0cmFuc2Zlcl9hbGxvd19kZWF0aGBdOiBzdHJ1Y3QuUGFsbGV0Lmh0bWwjbWV0aG9kLnRyYW5zZmVyMHRyYW5zZmVyX2FsbAgBEGRlc3TFAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AAShrZWVwX2FsaXZlIAEQYm9vbAAEPAUBVHJhbnNmZXIgdGhlIGVudGlyZSB0cmFuc2ZlcmFibGUgYmFsYW5jZSBmcm9tIHRoZSBjYWxsZXIgYWNjb3VudC4AWQFOT1RFOiBUaGlzIGZ1bmN0aW9uIG9ubHkgYXR0ZW1wdHMgdG8gdHJhbnNmZXIgX3RyYW5zZmVyYWJsZV8gYmFsYW5jZXMuIFRoaXMgbWVhbnMgdGhhdGEBYW55IGxvY2tlZCwgcmVzZXJ2ZWQsIG9yIGV4aXN0ZW50aWFsIGRlcG9zaXRzICh3aGVuIGBrZWVwX2FsaXZlYCBpcyBgdHJ1ZWApLCB3aWxsIG5vdCBiZV0BdHJhbnNmZXJyZWQgYnkgdGhpcyBmdW5jdGlvbi4gVG8gZW5zdXJlIHRoYXQgdGhpcyBmdW5jdGlvbiByZXN1bHRzIGluIGEga2lsbGVkIGFjY291bnQsRQF5b3UgbWlnaHQgbmVlZCB0byBwcmVwYXJlIHRoZSBhY2NvdW50IGJ5IHJlbW92aW5nIGFueSByZWZlcmVuY2UgY291bnRlcnMsIHN0b3JhZ2VAZGVwb3NpdHMsIGV0Yy4uLgDAVGhlIGRpc3BhdGNoIG9yaWdpbiBvZiB0aGlzIGNhbGwgbXVzdCBiZSBTaWduZWQuAKAtIGBkZXN0YDogVGhlIHJlY2lwaWVudCBvZiB0aGUgdHJhbnNmZXIuWQEtIGBrZWVwX2FsaXZlYDogQSBib29sZWFuIHRvIGRldGVybWluZSBpZiB0aGUgYHRyYW5zZmVyX2FsbGAgb3BlcmF0aW9uIHNob3VsZCBzZW5kIGFsbE0BICBvZiB0aGUgZnVuZHMgdGhlIGFjY291bnQgaGFzLCBjYXVzaW5nIHRoZSBzZW5kZXIgYWNjb3VudCB0byBiZSBraWxsZWQgKGZhbHNlKSwgb3JZASAgdHJhbnNmZXIgZXZlcnl0aGluZyBleGNlcHQgYXQgbGVhc3QgdGhlIGV4aXN0ZW50aWFsIGRlcG9zaXQsIHdoaWNoIHdpbGwgZ3VhcmFudGVlIHRvnCAga2VlcCB0aGUgc2VuZGVyIGFjY291bnQgYWxpdmUgKHRydWUpLjxmb3JjZV91bnJlc2VydmUIAQx3aG/FAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AARhhbW91bnQYAShUOjpCYWxhbmNlAAUMsFVucmVzZXJ2ZSBzb21lIGJhbGFuY2UgZnJvbSBhIHVzZXIgYnkgZm9yY2UuAGxDYW4gb25seSBiZSBjYWxsZWQgYnkgUk9PVC5AdXBncmFkZV9hY2NvdW50cwQBDHdob9EBAURWZWM8VDo6QWNjb3VudElkPgAGIHBVcGdyYWRlIGEgc3BlY2lmaWVkIGFjY291bnQuAHQtIGBvcmlnaW5gOiBNdXN0IGJlIGBTaWduZWRgLpAtIGB3aG9gOiBUaGUgYWNjb3VudCB0byBiZSB1cGdyYWRlZC4AVQFUaGlzIHdpbGwgd2FpdmUgdGhlIHRyYW5zYWN0aW9uIGZlZSBpZiBhdCBsZWFzdCBhbGwgYnV0IDEwJSBvZiB0aGUgYWNjb3VudHMgbmVlZGVkIHRvQQFiZSB1cGdyYWRlZC4gKFdlIGxldCBzb21lIG5vdCBoYXZlIHRvIGJlIHVwZ3JhZGVkIGp1c3QgaW4gb3JkZXIgdG8gYWxsb3cgZm9yIHRoZVhwb3NzaWJpbGl0eSBvZiBjaHVybikuRGZvcmNlX3NldF9iYWxhbmNlCAEMd2hvxQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEgbmV3X2ZyZWX8AShUOjpCYWxhbmNlAAgMrFNldCB0aGUgcmVndWxhciBiYWxhbmNlIG9mIGEgZ2l2ZW4gYWNjb3VudC4AsFRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBpcyBgcm9vdGAubGZvcmNlX2FkanVzdF90b3RhbF9pc3N1YW5jZQgBJGRpcmVjdGlvbtUBAUxBZGp1c3RtZW50RGlyZWN0aW9uAAEUZGVsdGH8AShUOjpCYWxhbmNlAAkUuEFkanVzdCB0aGUgdG90YWwgaXNzdWFuY2UgaW4gYSBzYXR1cmF0aW5nIHdheS4A/ENhbiBvbmx5IGJlIGNhbGxlZCBieSByb290IGFuZCBhbHdheXMgbmVlZHMgYSBwb3NpdGl2ZSBgZGVsdGFgLgAkIyBFeGFtcGxlEGJ1cm4IARR2YWx1ZfwBKFQ6OkJhbGFuY2UAAShrZWVwX2FsaXZlIAEQYm9vbAAKHPxCdXJuIHRoZSBzcGVjaWZpZWQgbGlxdWlkIGZyZWUgYmFsYW5jZSBmcm9tIHRoZSBvcmlnaW4gYWNjb3VudC4AJQFJZiB0aGUgb3JpZ2luJ3MgYWNjb3VudCBlbmRzIHVwIGJlbG93IHRoZSBleGlzdGVudGlhbCBkZXBvc2l0IGFzIGEgcmVzdWx0CQFvZiB0aGUgYnVybiBhbmQgYGtlZXBfYWxpdmVgIGlzIGZhbHNlLCB0aGUgYWNjb3VudCB3aWxsIGJlIHJlYXBlZC4AUQFVbmxpa2Ugc2VuZGluZyBmdW5kcyB0byBhIF9idXJuXyBhZGRyZXNzLCB3aGljaCBtZXJlbHkgbWFrZXMgdGhlIGZ1bmRzIGluYWNjZXNzaWJsZSwhAXRoaXMgYGJ1cm5gIG9wZXJhdGlvbiB3aWxsIHJlZHVjZSB0b3RhbCBpc3N1YW5jZSBieSB0aGUgYW1vdW50IF9idXJuZWRfLgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy7RAQAAAgAA1QEMPHBhbGxldF9iYWxhbmNlcxR0eXBlc0xBZGp1c3RtZW50RGlyZWN0aW9uAAEIIEluY3JlYXNlAAAAIERlY3JlYXNlAAEAANkBEDhwYWxsZXRfc3Rha2luZxhwYWxsZXQYcGFsbGV0EENhbGwEBFQAAXgQYm9uZAgBFHZhbHVl/AEwQmFsYW5jZU9mPFQ+AAEUcGF5ZWWoAXxSZXdhcmREZXN0aW5hdGlvbjxUOjpBY2NvdW50SWQ+AABAYQFUYWtlIHRoZSBvcmlnaW4gYWNjb3VudCBhcyBhIHN0YXNoIGFuZCBsb2NrIHVwIGB2YWx1ZWAgb2YgaXRzIGJhbGFuY2UuIGBjb250cm9sbGVyYCB3aWxsgGJlIHRoZSBhY2NvdW50IHRoYXQgY29udHJvbHMgaXQuAC0BYHZhbHVlYCBtdXN0IGJlIG1vcmUgdGhhbiB0aGUgYG1pbmltdW1fYmFsYW5jZWAgc3BlY2lmaWVkIGJ5IGBUOjpDdXJyZW5jeWAuACEBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8gYnkgdGhlIHN0YXNoIGFjY291bnQuADxFbWl0cyBgQm9uZGVkYC40IyMgQ29tcGxleGl0edAtIEluZGVwZW5kZW50IG9mIHRoZSBhcmd1bWVudHMuIE1vZGVyYXRlIGNvbXBsZXhpdHkuHC0gTygxKS5kLSBUaHJlZSBleHRyYSBEQiBlbnRyaWVzLgBNAU5PVEU6IFR3byBvZiB0aGUgc3RvcmFnZSB3cml0ZXMgKGBTZWxmOjpib25kZWRgLCBgU2VsZjo6cGF5ZWVgKSBhcmUgX25ldmVyXyBjbGVhbmVkWQF1bmxlc3MgdGhlIGBvcmlnaW5gIGZhbGxzIGJlbG93IF9leGlzdGVudGlhbCBkZXBvc2l0XyAob3IgZXF1YWwgdG8gMCkgYW5kIGdldHMgcmVtb3ZlZCBhcyBkdXN0Lihib25kX2V4dHJhBAE4bWF4X2FkZGl0aW9uYWz8ATBCYWxhbmNlT2Y8VD4AAThhAUFkZCBzb21lIGV4dHJhIGFtb3VudCB0aGF0IGhhdmUgYXBwZWFyZWQgaW4gdGhlIHN0YXNoIGBmcmVlX2JhbGFuY2VgIGludG8gdGhlIGJhbGFuY2UgdXAwZm9yIHN0YWtpbmcuAFEBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8gYnkgdGhlIHN0YXNoLCBub3QgdGhlIGNvbnRyb2xsZXIuAE0BVXNlIHRoaXMgaWYgdGhlcmUgYXJlIGFkZGl0aW9uYWwgZnVuZHMgaW4geW91ciBzdGFzaCBhY2NvdW50IHRoYXQgeW91IHdpc2ggdG8gYm9uZC5VAVVubGlrZSBbYGJvbmRgXShTZWxmOjpib25kKSBvciBbYHVuYm9uZGBdKFNlbGY6OnVuYm9uZCkgdGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBpbXBvc2W8YW55IGxpbWl0YXRpb24gb24gdGhlIGFtb3VudCB0aGF0IGNhbiBiZSBhZGRlZC4APEVtaXRzIGBCb25kZWRgLgA0IyMgQ29tcGxleGl0eeQtIEluZGVwZW5kZW50IG9mIHRoZSBhcmd1bWVudHMuIEluc2lnbmlmaWNhbnQgY29tcGxleGl0eS4cLSBPKDEpLhh1bmJvbmQEARR2YWx1ZfwBMEJhbGFuY2VPZjxUPgACTFEBU2NoZWR1bGUgYSBwb3J0aW9uIG9mIHRoZSBzdGFzaCB0byBiZSB1bmxvY2tlZCByZWFkeSBmb3IgdHJhbnNmZXIgb3V0IGFmdGVyIHRoZSBib25k/HBlcmlvZCBlbmRzLiBJZiB0aGlzIGxlYXZlcyBhbiBhbW91bnQgYWN0aXZlbHkgYm9uZGVkIGxlc3MgdGhhbiEBVDo6Q3VycmVuY3k6Om1pbmltdW1fYmFsYW5jZSgpLCB0aGVuIGl0IGlzIGluY3JlYXNlZCB0byB0aGUgZnVsbCBhbW91bnQuAFEBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8gYnkgdGhlIGNvbnRyb2xsZXIsIG5vdCB0aGUgc3Rhc2guAEUBT25jZSB0aGUgdW5sb2NrIHBlcmlvZCBpcyBkb25lLCB5b3UgY2FuIGNhbGwgYHdpdGhkcmF3X3VuYm9uZGVkYCB0byBhY3R1YWxseSBtb3ZlvHRoZSBmdW5kcyBvdXQgb2YgbWFuYWdlbWVudCByZWFkeSBmb3IgdHJhbnNmZXIuADEBTm8gbW9yZSB0aGFuIGEgbGltaXRlZCBudW1iZXIgb2YgdW5sb2NraW5nIGNodW5rcyAoc2VlIGBNYXhVbmxvY2tpbmdDaHVua3NgKUEBY2FuIGNvLWV4aXN0cyBhdCB0aGUgc2FtZSB0aW1lLiBJZiB0aGVyZSBhcmUgbm8gdW5sb2NraW5nIGNodW5rcyBzbG90cyBhdmFpbGFibGVFAVtgQ2FsbDo6d2l0aGRyYXdfdW5ib25kZWRgXSBpcyBjYWxsZWQgdG8gcmVtb3ZlIHNvbWUgb2YgdGhlIGNodW5rcyAoaWYgcG9zc2libGUpLgA5AUlmIGEgdXNlciBlbmNvdW50ZXJzIHRoZSBgSW5zdWZmaWNpZW50Qm9uZGAgZXJyb3Igd2hlbiBjYWxsaW5nIHRoaXMgZXh0cmluc2ljLBkBdGhleSBzaG91bGQgY2FsbCBgY2hpbGxgIGZpcnN0IGluIG9yZGVyIHRvIGZyZWUgdXAgdGhlaXIgYm9uZGVkIGZ1bmRzLgBERW1pdHMgYFVuYm9uZGVkYC4AlFNlZSBhbHNvIFtgQ2FsbDo6d2l0aGRyYXdfdW5ib25kZWRgXS5Ed2l0aGRyYXdfdW5ib25kZWQEAUhudW1fc2xhc2hpbmdfc3BhbnMQAQx1MzIAA1wpAVJlbW92ZSBhbnkgdW5sb2NrZWQgY2h1bmtzIGZyb20gdGhlIGB1bmxvY2tpbmdgIHF1ZXVlIGZyb20gb3VyIG1hbmFnZW1lbnQuAFUBVGhpcyBlc3NlbnRpYWxseSBmcmVlcyB1cCB0aGF0IGJhbGFuY2UgdG8gYmUgdXNlZCBieSB0aGUgc3Rhc2ggYWNjb3VudCB0byBkbyB3aGF0ZXZlciRpdCB3YW50cy4AFQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXyBieSB0aGUgY29udHJvbGxlci4ASEVtaXRzIGBXaXRoZHJhd25gLgBoU2VlIGFsc28gW2BDYWxsOjp1bmJvbmRgXS4ANCMjIFBhcmFtZXRlcnMAUQEtIGBudW1fc2xhc2hpbmdfc3BhbnNgIGluZGljYXRlcyB0aGUgbnVtYmVyIG9mIG1ldGFkYXRhIHNsYXNoaW5nIHNwYW5zIHRvIGNsZWFyIHdoZW5VAXRoaXMgY2FsbCByZXN1bHRzIGluIGEgY29tcGxldGUgcmVtb3ZhbCBvZiBhbGwgdGhlIGRhdGEgcmVsYXRlZCB0byB0aGUgc3Rhc2ggYWNjb3VudC49AUluIHRoaXMgY2FzZSwgdGhlIGBudW1fc2xhc2hpbmdfc3BhbnNgIG11c3QgYmUgbGFyZ2VyIG9yIGVxdWFsIHRvIHRoZSBudW1iZXIgb2ZdAXNsYXNoaW5nIHNwYW5zIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3Rhc2ggYWNjb3VudCBpbiB0aGUgW2BTbGFzaGluZ1NwYW5zYF0gc3RvcmFnZSB0eXBlLCUBb3RoZXJ3aXNlIHRoZSBjYWxsIHdpbGwgZmFpbC4gVGhlIGNhbGwgd2VpZ2h0IGlzIGRpcmVjdGx5IHByb3BvcnRpb25hbCB0b1RgbnVtX3NsYXNoaW5nX3NwYW5zYC4ANCMjIENvbXBsZXhpdHnYTyhTKSB3aGVyZSBTIGlzIHRoZSBudW1iZXIgb2Ygc2xhc2hpbmcgc3BhbnMgdG8gcmVtb3ZlCQFOT1RFOiBXZWlnaHQgYW5ub3RhdGlvbiBpcyB0aGUga2lsbCBzY2VuYXJpbywgd2UgcmVmdW5kIG90aGVyd2lzZS4gdmFsaWRhdGUEARRwcmVmc7ABOFZhbGlkYXRvclByZWZzAAQU5ERlY2xhcmUgdGhlIGRlc2lyZSB0byB2YWxpZGF0ZSBmb3IgdGhlIG9yaWdpbiBjb250cm9sbGVyLgDYRWZmZWN0cyB3aWxsIGJlIGZlbHQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbmV4dCBlcmEuAFEBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8gYnkgdGhlIGNvbnRyb2xsZXIsIG5vdCB0aGUgc3Rhc2guIG5vbWluYXRlBAEcdGFyZ2V0c90BAWRWZWM8QWNjb3VudElkTG9va3VwT2Y8VD4+AAUoDQFEZWNsYXJlIHRoZSBkZXNpcmUgdG8gbm9taW5hdGUgYHRhcmdldHNgIGZvciB0aGUgb3JpZ2luIGNvbnRyb2xsZXIuANhFZmZlY3RzIHdpbGwgYmUgZmVsdCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBuZXh0IGVyYS4AUQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXyBieSB0aGUgY29udHJvbGxlciwgbm90IHRoZSBzdGFzaC4ANCMjIENvbXBsZXhpdHktAS0gVGhlIHRyYW5zYWN0aW9uJ3MgY29tcGxleGl0eSBpcyBwcm9wb3J0aW9uYWwgdG8gdGhlIHNpemUgb2YgYHRhcmdldHNgIChOKQUBd2hpY2ggaXMgY2FwcGVkIGF0IENvbXBhY3RBc3NpZ25tZW50czo6TElNSVQgKFQ6Ok1heE5vbWluYXRpb25zKS7ULSBCb3RoIHRoZSByZWFkcyBhbmQgd3JpdGVzIGZvbGxvdyBhIHNpbWlsYXIgcGF0dGVybi4UY2hpbGwABijERGVjbGFyZSBubyBkZXNpcmUgdG8gZWl0aGVyIHZhbGlkYXRlIG9yIG5vbWluYXRlLgDYRWZmZWN0cyB3aWxsIGJlIGZlbHQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbmV4dCBlcmEuAFEBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8gYnkgdGhlIGNvbnRyb2xsZXIsIG5vdCB0aGUgc3Rhc2guADQjIyBDb21wbGV4aXR55C0gSW5kZXBlbmRlbnQgb2YgdGhlIGFyZ3VtZW50cy4gSW5zaWduaWZpY2FudCBjb21wbGV4aXR5LlAtIENvbnRhaW5zIG9uZSByZWFkLsQtIFdyaXRlcyBhcmUgbGltaXRlZCB0byB0aGUgYG9yaWdpbmAgYWNjb3VudCBrZXkuJHNldF9wYXllZQQBFHBheWVlqAF8UmV3YXJkRGVzdGluYXRpb248VDo6QWNjb3VudElkPgAHMLQoUmUtKXNldCB0aGUgcGF5bWVudCB0YXJnZXQgZm9yIGEgY29udHJvbGxlci4AUQFFZmZlY3RzIHdpbGwgYmUgZmVsdCBpbnN0YW50bHkgKGFzIHNvb24gYXMgdGhpcyBmdW5jdGlvbiBpcyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5KS4AUQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXyBieSB0aGUgY29udHJvbGxlciwgbm90IHRoZSBzdGFzaC4ANCMjIENvbXBsZXhpdHkYLSBPKDEp5C0gSW5kZXBlbmRlbnQgb2YgdGhlIGFyZ3VtZW50cy4gSW5zaWduaWZpY2FudCBjb21wbGV4aXR5LpQtIENvbnRhaW5zIGEgbGltaXRlZCBudW1iZXIgb2YgcmVhZHMuxC0gV3JpdGVzIGFyZSBsaW1pdGVkIHRvIHRoZSBgb3JpZ2luYCBhY2NvdW50IGtleS4kLS0tLS0tLS0tOHNldF9jb250cm9sbGVyAAg4RQEoUmUtKXNldHMgdGhlIGNvbnRyb2xsZXIgb2YgYSBzdGFzaCB0byB0aGUgc3Rhc2ggaXRzZWxmLiBUaGlzIGZ1bmN0aW9uIHByZXZpb3VzbHlNAWFjY2VwdGVkIGEgYGNvbnRyb2xsZXJgIGFyZ3VtZW50IHRvIHNldCB0aGUgY29udHJvbGxlciB0byBhbiBhY2NvdW50IG90aGVyIHRoYW4gdGhlWQFzdGFzaCBpdHNlbGYuIFRoaXMgZnVuY3Rpb25hbGl0eSBoYXMgbm93IGJlZW4gcmVtb3ZlZCwgbm93IG9ubHkgc2V0dGluZyB0aGUgY29udHJvbGxlcox0byB0aGUgc3Rhc2gsIGlmIGl0IGlzIG5vdCBhbHJlYWR5LgBRAUVmZmVjdHMgd2lsbCBiZSBmZWx0IGluc3RhbnRseSAoYXMgc29vbiBhcyB0aGlzIGZ1bmN0aW9uIGlzIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkpLgBRAVRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfIGJ5IHRoZSBzdGFzaCwgbm90IHRoZSBjb250cm9sbGVyLgA0IyMgQ29tcGxleGl0eRBPKDEp5C0gSW5kZXBlbmRlbnQgb2YgdGhlIGFyZ3VtZW50cy4gSW5zaWduaWZpY2FudCBjb21wbGV4aXR5LpQtIENvbnRhaW5zIGEgbGltaXRlZCBudW1iZXIgb2YgcmVhZHMuxC0gV3JpdGVzIGFyZSBsaW1pdGVkIHRvIHRoZSBgb3JpZ2luYCBhY2NvdW50IGtleS5Mc2V0X3ZhbGlkYXRvcl9jb3VudAQBDG5ld+wBDHUzMgAJGJBTZXRzIHRoZSBpZGVhbCBudW1iZXIgb2YgdmFsaWRhdG9ycy4AhFRoZSBkaXNwYXRjaCBvcmlnaW4gbXVzdCBiZSBSb290LgA0IyMgQ29tcGxleGl0eRBPKDEpYGluY3JlYXNlX3ZhbGlkYXRvcl9jb3VudAQBKGFkZGl0aW9uYWzsAQx1MzIAChzoSW5jcmVtZW50cyB0aGUgaWRlYWwgbnVtYmVyIG9mIHZhbGlkYXRvcnMgdXAgdG8gbWF4aW11bSBvZoxgRWxlY3Rpb25Qcm92aWRlckJhc2U6Ok1heFdpbm5lcnNgLgCEVGhlIGRpc3BhdGNoIG9yaWdpbiBtdXN0IGJlIFJvb3QuADQjIyBDb21wbGV4aXR5mFNhbWUgYXMgW2BTZWxmOjpzZXRfdmFsaWRhdG9yX2NvdW50YF0uVHNjYWxlX3ZhbGlkYXRvcl9jb3VudAQBGGZhY3RvcuEBARxQZXJjZW50AAscEQFTY2FsZSB1cCB0aGUgaWRlYWwgbnVtYmVyIG9mIHZhbGlkYXRvcnMgYnkgYSBmYWN0b3IgdXAgdG8gbWF4aW11bSBvZoxgRWxlY3Rpb25Qcm92aWRlckJhc2U6Ok1heFdpbm5lcnNgLgCEVGhlIGRpc3BhdGNoIG9yaWdpbiBtdXN0IGJlIFJvb3QuADQjIyBDb21wbGV4aXR5mFNhbWUgYXMgW2BTZWxmOjpzZXRfdmFsaWRhdG9yX2NvdW50YF0uNGZvcmNlX25vX2VyYXMADDSsRm9yY2UgdGhlcmUgdG8gYmUgbm8gbmV3IGVyYXMgaW5kZWZpbml0ZWx5LgCEVGhlIGRpc3BhdGNoIG9yaWdpbiBtdXN0IGJlIFJvb3QuACQjIFdhcm5pbmcAGQFUaGUgZWxlY3Rpb24gcHJvY2VzcyBzdGFydHMgbXVsdGlwbGUgYmxvY2tzIGJlZm9yZSB0aGUgZW5kIG9mIHRoZSBlcmEuOQFUaHVzIHRoZSBlbGVjdGlvbiBwcm9jZXNzIG1heSBiZSBvbmdvaW5nIHdoZW4gdGhpcyBpcyBjYWxsZWQuIEluIHRoaXMgY2FzZSB0aGXcZWxlY3Rpb24gd2lsbCBjb250aW51ZSB1bnRpbCB0aGUgbmV4dCBlcmEgaXMgdHJpZ2dlcmVkLgA0IyMgQ29tcGxleGl0eTwtIE5vIGFyZ3VtZW50cy44LSBXZWlnaHQ6IE8oMSk0Zm9yY2VfbmV3X2VyYQANOEkBRm9yY2UgdGhlcmUgdG8gYmUgYSBuZXcgZXJhIGF0IHRoZSBlbmQgb2YgdGhlIG5leHQgc2Vzc2lvbi4gQWZ0ZXIgdGhpcywgaXQgd2lsbCBiZZxyZXNldCB0byBub3JtYWwgKG5vbi1mb3JjZWQpIGJlaGF2aW91ci4AhFRoZSBkaXNwYXRjaCBvcmlnaW4gbXVzdCBiZSBSb290LgAkIyBXYXJuaW5nABkBVGhlIGVsZWN0aW9uIHByb2Nlc3Mgc3RhcnRzIG11bHRpcGxlIGJsb2NrcyBiZWZvcmUgdGhlIGVuZCBvZiB0aGUgZXJhLkkBSWYgdGhpcyBpcyBjYWxsZWQganVzdCBiZWZvcmUgYSBuZXcgZXJhIGlzIHRyaWdnZXJlZCwgdGhlIGVsZWN0aW9uIHByb2Nlc3MgbWF5IG5vdIxoYXZlIGVub3VnaCBibG9ja3MgdG8gZ2V0IGEgcmVzdWx0LgA0IyMgQ29tcGxleGl0eTwtIE5vIGFyZ3VtZW50cy44LSBXZWlnaHQ6IE8oMSlEc2V0X2ludnVsbmVyYWJsZXMEATRpbnZ1bG5lcmFibGVz0QEBRFZlYzxUOjpBY2NvdW50SWQ+AA4MyFNldCB0aGUgdmFsaWRhdG9ycyB3aG8gY2Fubm90IGJlIHNsYXNoZWQgKGlmIGFueSkuAIRUaGUgZGlzcGF0Y2ggb3JpZ2luIG11c3QgYmUgUm9vdC40Zm9yY2VfdW5zdGFrZQgBFHN0YXNoAAEwVDo6QWNjb3VudElkAAFIbnVtX3NsYXNoaW5nX3NwYW5zEAEMdTMyAA8gCQFGb3JjZSBhIGN1cnJlbnQgc3Rha2VyIHRvIGJlY29tZSBjb21wbGV0ZWx5IHVuc3Rha2VkLCBpbW1lZGlhdGVseS4AhFRoZSBkaXNwYXRjaCBvcmlnaW4gbXVzdCBiZSBSb290LgA0IyMgUGFyYW1ldGVycwBFAS0gYG51bV9zbGFzaGluZ19zcGFuc2A6IFJlZmVyIHRvIGNvbW1lbnRzIG9uIFtgQ2FsbDo6d2l0aGRyYXdfdW5ib25kZWRgXSBmb3IgbW9yZSBkZXRhaWxzLlBmb3JjZV9uZXdfZXJhX2Fsd2F5cwAQJAEBRm9yY2UgdGhlcmUgdG8gYmUgYSBuZXcgZXJhIGF0IHRoZSBlbmQgb2Ygc2Vzc2lvbnMgaW5kZWZpbml0ZWx5LgCEVGhlIGRpc3BhdGNoIG9yaWdpbiBtdXN0IGJlIFJvb3QuACQjIFdhcm5pbmcAGQFUaGUgZWxlY3Rpb24gcHJvY2VzcyBzdGFydHMgbXVsdGlwbGUgYmxvY2tzIGJlZm9yZSB0aGUgZW5kIG9mIHRoZSBlcmEuSQFJZiB0aGlzIGlzIGNhbGxlZCBqdXN0IGJlZm9yZSBhIG5ldyBlcmEgaXMgdHJpZ2dlcmVkLCB0aGUgZWxlY3Rpb24gcHJvY2VzcyBtYXkgbm90jGhhdmUgZW5vdWdoIGJsb2NrcyB0byBnZXQgYSByZXN1bHQuVGNhbmNlbF9kZWZlcnJlZF9zbGFzaAgBDGVyYRABIEVyYUluZGV4AAE0c2xhc2hfaW5kaWNlc+UBASBWZWM8dTMyPgARFJRDYW5jZWwgZW5hY3RtZW50IG9mIGEgZGVmZXJyZWQgc2xhc2guAJhDYW4gYmUgY2FsbGVkIGJ5IHRoZSBgVDo6QWRtaW5PcmlnaW5gLgABAVBhcmFtZXRlcnM6IGVyYSBhbmQgaW5kaWNlcyBvZiB0aGUgc2xhc2hlcyBmb3IgdGhhdCBlcmEgdG8ga2lsbC44cGF5b3V0X3N0YWtlcnMIATx2YWxpZGF0b3Jfc3Rhc2gAATBUOjpBY2NvdW50SWQAAQxlcmEQASBFcmFJbmRleAASNBkBUGF5IG91dCBuZXh0IHBhZ2Ugb2YgdGhlIHN0YWtlcnMgYmVoaW5kIGEgdmFsaWRhdG9yIGZvciB0aGUgZ2l2ZW4gZXJhLgDoLSBgdmFsaWRhdG9yX3N0YXNoYCBpcyB0aGUgc3Rhc2ggYWNjb3VudCBvZiB0aGUgdmFsaWRhdG9yLjEBLSBgZXJhYCBtYXkgYmUgYW55IGVyYSBiZXR3ZWVuIGBbY3VycmVudF9lcmEgLSBoaXN0b3J5X2RlcHRoOyBjdXJyZW50X2VyYV1gLgBVAVRoZSBvcmlnaW4gb2YgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uIEFueSBhY2NvdW50IGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24sIGV2ZW4gaWZ0aXQgaXMgbm90IG9uZSBvZiB0aGUgc3Rha2Vycy4ASQFUaGUgcmV3YXJkIHBheW91dCBjb3VsZCBiZSBwYWdlZCBpbiBjYXNlIHRoZXJlIGFyZSB0b28gbWFueSBub21pbmF0b3JzIGJhY2tpbmcgdGhlXQFgdmFsaWRhdG9yX3N0YXNoYC4gVGhpcyBjYWxsIHdpbGwgcGF5b3V0IHVucGFpZCBwYWdlcyBpbiBhbiBhc2NlbmRpbmcgb3JkZXIuIFRvIGNsYWltIGG0c3BlY2lmaWMgcGFnZSwgdXNlIGBwYXlvdXRfc3Rha2Vyc19ieV9wYWdlYC5gAPBJZiBhbGwgcGFnZXMgYXJlIGNsYWltZWQsIGl0IHJldHVybnMgYW4gZXJyb3IgYEludmFsaWRQYWdlYC4YcmVib25kBAEUdmFsdWX8ATBCYWxhbmNlT2Y8VD4AExzcUmVib25kIGEgcG9ydGlvbiBvZiB0aGUgc3Rhc2ggc2NoZWR1bGVkIHRvIGJlIHVubG9ja2VkLgDUVGhlIGRpc3BhdGNoIG9yaWdpbiBtdXN0IGJlIHNpZ25lZCBieSB0aGUgY29udHJvbGxlci4ANCMjIENvbXBsZXhpdHnQLSBUaW1lIGNvbXBsZXhpdHk6IE8oTCksIHdoZXJlIEwgaXMgdW5sb2NraW5nIGNodW5rc4gtIEJvdW5kZWQgYnkgYE1heFVubG9ja2luZ0NodW5rc2AuKHJlYXBfc3Rhc2gIARRzdGFzaAABMFQ6OkFjY291bnRJZAABSG51bV9zbGFzaGluZ19zcGFucxABDHUzMgAUSF0BUmVtb3ZlIGFsbCBkYXRhIHN0cnVjdHVyZXMgY29uY2VybmluZyBhIHN0YWtlci9zdGFzaCBvbmNlIGl0IGlzIGF0IGEgc3RhdGUgd2hlcmUgaXQgY2FuBQFiZSBjb25zaWRlcmVkIGBkdXN0YCBpbiB0aGUgc3Rha2luZyBzeXN0ZW0uIFRoZSByZXF1aXJlbWVudHMgYXJlOgAFATEuIHRoZSBgdG90YWxfYmFsYW5jZWAgb2YgdGhlIHN0YXNoIGlzIGJlbG93IGV4aXN0ZW50aWFsIGRlcG9zaXQuEQEyLiBvciwgdGhlIGBsZWRnZXIudG90YWxgIG9mIHRoZSBzdGFzaCBpcyBiZWxvdyBleGlzdGVudGlhbCBkZXBvc2l0LmEBMy4gb3IsIGV4aXN0ZW50aWFsIGRlcG9zaXQgaXMgemVybyBhbmQgZWl0aGVyIGB0b3RhbF9iYWxhbmNlYCBvciBgbGVkZ2VyLnRvdGFsYCBpcyB6ZXJvLgBVAVRoZSBmb3JtZXIgY2FuIGhhcHBlbiBpbiBjYXNlcyBsaWtlIGEgc2xhc2g7IHRoZSBsYXR0ZXIgd2hlbiBhIGZ1bGx5IHVuYm9uZGVkIGFjY291bnQJAWlzIHN0aWxsIHJlY2VpdmluZyBzdGFraW5nIHJld2FyZHMgaW4gYFJld2FyZERlc3RpbmF0aW9uOjpTdGFrZWRgLgAxAUl0IGNhbiBiZSBjYWxsZWQgYnkgYW55b25lLCBhcyBsb25nIGFzIGBzdGFzaGAgbWVldHMgdGhlIGFib3ZlIHJlcXVpcmVtZW50cy4A3FJlZnVuZHMgdGhlIHRyYW5zYWN0aW9uIGZlZXMgdXBvbiBzdWNjZXNzZnVsIGV4ZWN1dGlvbi4ANCMjIFBhcmFtZXRlcnMARQEtIGBudW1fc2xhc2hpbmdfc3BhbnNgOiBSZWZlciB0byBjb21tZW50cyBvbiBbYENhbGw6OndpdGhkcmF3X3VuYm9uZGVkYF0gZm9yIG1vcmUgZGV0YWlscy4Qa2ljawQBDHdob90BAWRWZWM8QWNjb3VudElkTG9va3VwT2Y8VD4+ABUs4FJlbW92ZSB0aGUgZ2l2ZW4gbm9taW5hdGlvbnMgZnJvbSB0aGUgY2FsbGluZyB2YWxpZGF0b3IuANhFZmZlY3RzIHdpbGwgYmUgZmVsdCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBuZXh0IGVyYS4AUQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXyBieSB0aGUgY29udHJvbGxlciwgbm90IHRoZSBzdGFzaC4ATQEtIGB3aG9gOiBBIGxpc3Qgb2Ygbm9taW5hdG9yIHN0YXNoIGFjY291bnRzIHdobyBhcmUgbm9taW5hdGluZyB0aGlzIHZhbGlkYXRvciB3aGljaMAgIHNob3VsZCBubyBsb25nZXIgYmUgbm9taW5hdGluZyB0aGlzIHZhbGlkYXRvci4AVQFOb3RlOiBNYWtpbmcgdGhpcyBjYWxsIG9ubHkgbWFrZXMgc2Vuc2UgaWYgeW91IGZpcnN0IHNldCB0aGUgdmFsaWRhdG9yIHByZWZlcmVuY2VzIHRveGJsb2NrIGFueSBmdXJ0aGVyIG5vbWluYXRpb25zLkxzZXRfc3Rha2luZ19jb25maWdzHAFIbWluX25vbWluYXRvcl9ib25k6QEBWENvbmZpZ09wPEJhbGFuY2VPZjxUPj4AAUhtaW5fdmFsaWRhdG9yX2JvbmTpAQFYQ29uZmlnT3A8QmFsYW5jZU9mPFQ+PgABTG1heF9ub21pbmF0b3JfY291bnTtAQE0Q29uZmlnT3A8dTMyPgABTG1heF92YWxpZGF0b3JfY291bnTtAQE0Q29uZmlnT3A8dTMyPgABPGNoaWxsX3RocmVzaG9sZPEBAURDb25maWdPcDxQZXJjZW50PgABOG1pbl9jb21taXNzaW9u9QEBRENvbmZpZ09wPFBlcmJpbGw+AAFIbWF4X3N0YWtlZF9yZXdhcmRz8QEBRENvbmZpZ09wPFBlcmNlbnQ+ABZErFVwZGF0ZSB0aGUgdmFyaW91cyBzdGFraW5nIGNvbmZpZ3VyYXRpb25zIC4AJQEqIGBtaW5fbm9taW5hdG9yX2JvbmRgOiBUaGUgbWluaW11bSBhY3RpdmUgYm9uZCBuZWVkZWQgdG8gYmUgYSBub21pbmF0b3IuJQEqIGBtaW5fdmFsaWRhdG9yX2JvbmRgOiBUaGUgbWluaW11bSBhY3RpdmUgYm9uZCBuZWVkZWQgdG8gYmUgYSB2YWxpZGF0b3IuVQEqIGBtYXhfbm9taW5hdG9yX2NvdW50YDogVGhlIG1heCBudW1iZXIgb2YgdXNlcnMgd2hvIGNhbiBiZSBhIG5vbWluYXRvciBhdCBvbmNlLiBXaGVumCAgc2V0IHRvIGBOb25lYCwgbm8gbGltaXQgaXMgZW5mb3JjZWQuVQEqIGBtYXhfdmFsaWRhdG9yX2NvdW50YDogVGhlIG1heCBudW1iZXIgb2YgdXNlcnMgd2hvIGNhbiBiZSBhIHZhbGlkYXRvciBhdCBvbmNlLiBXaGVumCAgc2V0IHRvIGBOb25lYCwgbm8gbGltaXQgaXMgZW5mb3JjZWQuWQEqIGBjaGlsbF90aHJlc2hvbGRgOiBUaGUgcmF0aW8gb2YgYG1heF9ub21pbmF0b3JfY291bnRgIG9yIGBtYXhfdmFsaWRhdG9yX2NvdW50YCB3aGljaBkBICBzaG91bGQgYmUgZmlsbGVkIGluIG9yZGVyIGZvciB0aGUgYGNoaWxsX290aGVyYCB0cmFuc2FjdGlvbiB0byB3b3JrLmEBKiBgbWluX2NvbW1pc3Npb25gOiBUaGUgbWluaW11bSBhbW91bnQgb2YgY29tbWlzc2lvbiB0aGF0IGVhY2ggdmFsaWRhdG9ycyBtdXN0IG1haW50YWluLlUBICBUaGlzIGlzIGNoZWNrZWQgb25seSB1cG9uIGNhbGxpbmcgYHZhbGlkYXRlYC4gRXhpc3RpbmcgdmFsaWRhdG9ycyBhcmUgbm90IGFmZmVjdGVkLgDEUnVudGltZU9yaWdpbiBtdXN0IGJlIFJvb3QgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uLgA1AU5PVEU6IEV4aXN0aW5nIG5vbWluYXRvcnMgYW5kIHZhbGlkYXRvcnMgd2lsbCBub3QgYmUgYWZmZWN0ZWQgYnkgdGhpcyB1cGRhdGUuEQF0byBraWNrIHBlb3BsZSB1bmRlciB0aGUgbmV3IGxpbWl0cywgYGNoaWxsX290aGVyYCBzaG91bGQgYmUgY2FsbGVkLixjaGlsbF9vdGhlcgQBFHN0YXNoAAEwVDo6QWNjb3VudElkABdoQQFEZWNsYXJlIGEgYGNvbnRyb2xsZXJgIHRvIHN0b3AgcGFydGljaXBhdGluZyBhcyBlaXRoZXIgYSB2YWxpZGF0b3Igb3Igbm9taW5hdG9yLgDYRWZmZWN0cyB3aWxsIGJlIGZlbHQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbmV4dCBlcmEuAEEBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8sIGJ1dCBjYW4gYmUgY2FsbGVkIGJ5IGFueW9uZS4AWQFJZiB0aGUgY2FsbGVyIGlzIHRoZSBzYW1lIGFzIHRoZSBjb250cm9sbGVyIGJlaW5nIHRhcmdldGVkLCB0aGVuIG5vIGZ1cnRoZXIgY2hlY2tzIGFyZdhlbmZvcmNlZCwgYW5kIHRoaXMgZnVuY3Rpb24gYmVoYXZlcyBqdXN0IGxpa2UgYGNoaWxsYC4AXQFJZiB0aGUgY2FsbGVyIGlzIGRpZmZlcmVudCB0aGFuIHRoZSBjb250cm9sbGVyIGJlaW5nIHRhcmdldGVkLCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMwbXVzdCBiZSBtZXQ6AB0BKiBgY29udHJvbGxlcmAgbXVzdCBiZWxvbmcgdG8gYSBub21pbmF0b3Igd2hvIGhhcyBiZWNvbWUgbm9uLWRlY29kYWJsZSwADE9yOgA9ASogQSBgQ2hpbGxUaHJlc2hvbGRgIG11c3QgYmUgc2V0IGFuZCBjaGVja2VkIHdoaWNoIGRlZmluZXMgaG93IGNsb3NlIHRvIHRoZSBtYXhVASAgbm9taW5hdG9ycyBvciB2YWxpZGF0b3JzIHdlIG11c3QgcmVhY2ggYmVmb3JlIHVzZXJzIGNhbiBzdGFydCBjaGlsbGluZyBvbmUtYW5vdGhlci5ZASogQSBgTWF4Tm9taW5hdG9yQ291bnRgIGFuZCBgTWF4VmFsaWRhdG9yQ291bnRgIG11c3QgYmUgc2V0IHdoaWNoIGlzIHVzZWQgdG8gZGV0ZXJtaW5lkCAgaG93IGNsb3NlIHdlIGFyZSB0byB0aGUgdGhyZXNob2xkLl0BKiBBIGBNaW5Ob21pbmF0b3JCb25kYCBhbmQgYE1pblZhbGlkYXRvckJvbmRgIG11c3QgYmUgc2V0IGFuZCBjaGVja2VkLCB3aGljaCBkZXRlcm1pbmVzUQEgIGlmIHRoaXMgaXMgYSBwZXJzb24gdGhhdCBzaG91bGQgYmUgY2hpbGxlZCBiZWNhdXNlIHRoZXkgaGF2ZSBub3QgbWV0IHRoZSB0aHJlc2hvbGRAICBib25kIHJlcXVpcmVkLgBVAVRoaXMgY2FuIGJlIGhlbHBmdWwgaWYgYm9uZCByZXF1aXJlbWVudHMgYXJlIHVwZGF0ZWQsIGFuZCB3ZSBuZWVkIHRvIHJlbW92ZSBvbGQgdXNlcnOYd2hvIGRvIG5vdCBzYXRpc2Z5IHRoZXNlIHJlcXVpcmVtZW50cy5oZm9yY2VfYXBwbHlfbWluX2NvbW1pc3Npb24EATx2YWxpZGF0b3Jfc3Rhc2gAATBUOjpBY2NvdW50SWQAGAxFAUZvcmNlIGEgdmFsaWRhdG9yIHRvIGhhdmUgYXQgbGVhc3QgdGhlIG1pbmltdW0gY29tbWlzc2lvbi4gVGhpcyB3aWxsIG5vdCBhZmZlY3QgYWEBdmFsaWRhdG9yIHdobyBhbHJlYWR5IGhhcyBhIGNvbW1pc3Npb24gZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBtaW5pbXVtLiBBbnkgYWNjb3VudDhjYW4gY2FsbCB0aGlzLkhzZXRfbWluX2NvbW1pc3Npb24EAQxuZXesARxQZXJiaWxsABkQJQFTZXRzIHRoZSBtaW5pbXVtIGFtb3VudCBvZiBjb21taXNzaW9uIHRoYXQgZWFjaCB2YWxpZGF0b3JzIG11c3QgbWFpbnRhaW4uAFkBVGhpcyBjYWxsIGhhcyBsb3dlciBwcml2aWxlZ2UgcmVxdWlyZW1lbnRzIHRoYW4gYHNldF9zdGFraW5nX2NvbmZpZ2AgYW5kIGNhbiBiZSBjYWxsZWTMYnkgdGhlIGBUOjpBZG1pbk9yaWdpbmAuIFJvb3QgY2FuIGFsd2F5cyBjYWxsIHRoaXMuWHBheW91dF9zdGFrZXJzX2J5X3BhZ2UMATx2YWxpZGF0b3Jfc3Rhc2gAATBUOjpBY2NvdW50SWQAAQxlcmEQASBFcmFJbmRleAABEHBhZ2UQARBQYWdlABpEMQFQYXkgb3V0IGEgcGFnZSBvZiB0aGUgc3Rha2VycyBiZWhpbmQgYSB2YWxpZGF0b3IgZm9yIHRoZSBnaXZlbiBlcmEgYW5kIHBhZ2UuAOgtIGB2YWxpZGF0b3Jfc3Rhc2hgIGlzIHRoZSBzdGFzaCBhY2NvdW50IG9mIHRoZSB2YWxpZGF0b3IuMQEtIGBlcmFgIG1heSBiZSBhbnkgZXJhIGJldHdlZW4gYFtjdXJyZW50X2VyYSAtIGhpc3RvcnlfZGVwdGg7IGN1cnJlbnRfZXJhXWAuMQEtIGBwYWdlYCBpcyB0aGUgcGFnZSBpbmRleCBvZiBub21pbmF0b3JzIHRvIHBheSBvdXQgd2l0aCB2YWx1ZSBiZXR3ZWVuIDAgYW5ksCAgYG51bV9ub21pbmF0b3JzIC8gVDo6TWF4RXhwb3N1cmVQYWdlU2l6ZWAuAFUBVGhlIG9yaWdpbiBvZiB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXy4gQW55IGFjY291bnQgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbiwgZXZlbiBpZnRpdCBpcyBub3Qgb25lIG9mIHRoZSBzdGFrZXJzLgA9AUlmIGEgdmFsaWRhdG9yIGhhcyBtb3JlIHRoYW4gW2BDb25maWc6Ok1heEV4cG9zdXJlUGFnZVNpemVgXSBub21pbmF0b3JzIGJhY2tpbmcpAXRoZW0sIHRoZW4gdGhlIGxpc3Qgb2Ygbm9taW5hdG9ycyBpcyBwYWdlZCwgd2l0aCBlYWNoIHBhZ2UgYmVpbmcgY2FwcGVkIGF0VQFbYENvbmZpZzo6TWF4RXhwb3N1cmVQYWdlU2l6ZWAuXSBJZiBhIHZhbGlkYXRvciBoYXMgbW9yZSB0aGFuIG9uZSBwYWdlIG9mIG5vbWluYXRvcnMsSQF0aGUgY2FsbCBuZWVkcyB0byBiZSBtYWRlIGZvciBlYWNoIHBhZ2Ugc2VwYXJhdGVseSBpbiBvcmRlciBmb3IgYWxsIHRoZSBub21pbmF0b3JzVQFiYWNraW5nIGEgdmFsaWRhdG9yIHRvIHJlY2VpdmUgdGhlIHJld2FyZC4gVGhlIG5vbWluYXRvcnMgYXJlIG5vdCBzb3J0ZWQgYWNyb3NzIHBhZ2VzYQFhbmQgc28gaXQgc2hvdWxkIG5vdCBiZSBhc3N1bWVkIHRoZSBoaWdoZXN0IHN0YWtlciB3b3VsZCBiZSBvbiB0aGUgdG9wbW9zdCBwYWdlIGFuZCB2aWNlSQF2ZXJzYS4gSWYgcmV3YXJkcyBhcmUgbm90IGNsYWltZWQgaW4gW2BDb25maWc6Okhpc3RvcnlEZXB0aGBdIGVyYXMsIHRoZXkgYXJlIGxvc3QuMHVwZGF0ZV9wYXllZQQBKGNvbnRyb2xsZXIAATBUOjpBY2NvdW50SWQAGxjgTWlncmF0ZXMgYW4gYWNjb3VudCdzIGBSZXdhcmREZXN0aW5hdGlvbjo6Q29udHJvbGxlcmAgdG+kYFJld2FyZERlc3RpbmF0aW9uOjpBY2NvdW50KGNvbnRyb2xsZXIpYC4AUQFFZmZlY3RzIHdpbGwgYmUgZmVsdCBpbnN0YW50bHkgKGFzIHNvb24gYXMgdGhpcyBmdW5jdGlvbiBpcyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5KS4AMQFUaGlzIHdpbGwgd2FpdmUgdGhlIHRyYW5zYWN0aW9uIGZlZSBpZiB0aGUgYHBheWVlYCBpcyBzdWNjZXNzZnVsbHkgbWlncmF0ZWQuaGRlcHJlY2F0ZV9jb250cm9sbGVyX2JhdGNoBAEsY29udHJvbGxlcnP5AQH0Qm91bmRlZFZlYzxUOjpBY2NvdW50SWQsIFQ6Ok1heENvbnRyb2xsZXJzSW5EZXByZWNhdGlvbkJhdGNoPgAcHF0BVXBkYXRlcyBhIGJhdGNoIG9mIGNvbnRyb2xsZXIgYWNjb3VudHMgdG8gdGhlaXIgY29ycmVzcG9uZGluZyBzdGFzaCBhY2NvdW50IGlmIHRoZXkgYXJlYQFub3QgdGhlIHNhbWUuIElnbm9yZXMgYW55IGNvbnRyb2xsZXIgYWNjb3VudHMgdGhhdCBkbyBub3QgZXhpc3QsIGFuZCBkb2VzIG5vdCBvcGVyYXRlIGlmuHRoZSBzdGFzaCBhbmQgY29udHJvbGxlciBhcmUgYWxyZWFkeSB0aGUgc2FtZS4AUQFFZmZlY3RzIHdpbGwgYmUgZmVsdCBpbnN0YW50bHkgKGFzIHNvb24gYXMgdGhpcyBmdW5jdGlvbiBpcyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5KS4AtFRoZSBkaXNwYXRjaCBvcmlnaW4gbXVzdCBiZSBgVDo6QWRtaW5PcmlnaW5gLjhyZXN0b3JlX2xlZGdlchABFHN0YXNoAAEwVDo6QWNjb3VudElkAAFAbWF5YmVfY29udHJvbGxlcv0BAVBPcHRpb248VDo6QWNjb3VudElkPgABLG1heWJlX3RvdGFsAQIBUE9wdGlvbjxCYWxhbmNlT2Y8VD4+AAE8bWF5YmVfdW5sb2NraW5nBQIBFQFPcHRpb248Qm91bmRlZFZlYzxVbmxvY2tDaHVuazxCYWxhbmNlT2Y8VD4+LCBUOjoKTWF4VW5sb2NraW5nQ2h1bmtzPj4AHSwFAVJlc3RvcmVzIHRoZSBzdGF0ZSBvZiBhIGxlZGdlciB3aGljaCBpcyBpbiBhbiBpbmNvbnNpc3RlbnQgc3RhdGUuANxUaGUgcmVxdWlyZW1lbnRzIHRvIHJlc3RvcmUgYSBsZWRnZXIgYXJlIHRoZSBmb2xsb3dpbmc6ZCogVGhlIHN0YXNoIGlzIGJvbmRlZDsgb3INASogVGhlIHN0YXNoIGlzIG5vdCBib25kZWQgYnV0IGl0IGhhcyBhIHN0YWtpbmcgbG9jayBsZWZ0IGJlaGluZDsgb3IlASogSWYgdGhlIHN0YXNoIGhhcyBhbiBhc3NvY2lhdGVkIGxlZGdlciBhbmQgaXRzIHN0YXRlIGlzIGluY29uc2lzdGVudDsgb3IdASogSWYgdGhlIGxlZGdlciBpcyBub3QgY29ycnVwdGVkICpidXQqIGl0cyBzdGFraW5nIGxvY2sgaXMgb3V0IG9mIHN5bmMuAGEBVGhlIGBtYXliZV8qYCBpbnB1dCBwYXJhbWV0ZXJzIHdpbGwgb3ZlcndyaXRlIHRoZSBjb3JyZXNwb25kaW5nIGRhdGEgYW5kIG1ldGFkYXRhIG9mIHRoZVkBbGVkZ2VyIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3Rhc2guIElmIHRoZSBpbnB1dCBwYXJhbWV0ZXJzIGFyZSBub3Qgc2V0LCB0aGUgbGVkZ2VyIHdpbGyQYmUgcmVzZXQgdmFsdWVzIGZyb20gb24tY2hhaW4gc3RhdGUuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLt0BAAACxQEA4QEMNHNwX2FyaXRobWV0aWMocGVyX3RoaW5ncxxQZXJjZW50AAAEAAgBCHU4AADlAQAAAhAA6QEQOHBhbGxldF9zdGFraW5nGHBhbGxldBhwYWxsZXQgQ29uZmlnT3AEBFQBGAEMEE5vb3AAAAAMU2V0BAAYAQRUAAEAGFJlbW92ZQACAADtARA4cGFsbGV0X3N0YWtpbmcYcGFsbGV0GHBhbGxldCBDb25maWdPcAQEVAEQAQwQTm9vcAAAAAxTZXQEABABBFQAAQAYUmVtb3ZlAAIAAPEBEDhwYWxsZXRfc3Rha2luZxhwYWxsZXQYcGFsbGV0IENvbmZpZ09wBARUAeEBAQwQTm9vcAAAAAxTZXQEAOEBAQRUAAEAGFJlbW92ZQACAAD1ARA4cGFsbGV0X3N0YWtpbmcYcGFsbGV0GHBhbGxldCBDb25maWdPcAQEVAGsAQwQTm9vcAAAAAxTZXQEAKwBBFQAAQAYUmVtb3ZlAAIAAPkBDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBAARTAAAEANEBARhWZWM8VD4AAP0BBBhPcHRpb24EBFQBAAEIEE5vbmUAAAAQU29tZQQAAAAAAQAAAQIEGE9wdGlvbgQEVAEYAQgQTm9uZQAAABBTb21lBAAYAAABAAAFAgQYT3B0aW9uBARUAQkCAQgQTm9uZQAAABBTb21lBAAJAgAAAQAACQIMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAENAgRTAAAEABECARhWZWM8VD4AAA0CCDhwYWxsZXRfc3Rha2luZyxVbmxvY2tDaHVuawQcQmFsYW5jZQEYAAgBFHZhbHVl/AEcQmFsYW5jZQABDGVyYewBIEVyYUluZGV4AAARAgAAAg0CABUCDDhwYWxsZXRfc2Vzc2lvbhhwYWxsZXQQQ2FsbAQEVAABCCBzZXRfa2V5cwgBEGtleXMZAgEcVDo6S2V5cwABFHByb29mOAEcVmVjPHU4PgAAJORTZXRzIHRoZSBzZXNzaW9uIGtleShzKSBvZiB0aGUgZnVuY3Rpb24gY2FsbGVyIHRvIGBrZXlzYC4dAUFsbG93cyBhbiBhY2NvdW50IHRvIHNldCBpdHMgc2Vzc2lvbiBrZXkgcHJpb3IgdG8gYmVjb21pbmcgYSB2YWxpZGF0b3IuwFRoaXMgZG9lc24ndCB0YWtlIGVmZmVjdCB1bnRpbCB0aGUgbmV4dCBzZXNzaW9uLgDQVGhlIGRpc3BhdGNoIG9yaWdpbiBvZiB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgc2lnbmVkLgA0IyMgQ29tcGxleGl0eVkBLSBgTygxKWAuIEFjdHVhbCBjb3N0IGRlcGVuZHMgb24gdGhlIG51bWJlciBvZiBsZW5ndGggb2YgYFQ6OktleXM6OmtleV9pZHMoKWAgd2hpY2ggaXMgICBmaXhlZC4ocHVyZ2Vfa2V5cwABMMhSZW1vdmVzIGFueSBzZXNzaW9uIGtleShzKSBvZiB0aGUgZnVuY3Rpb24gY2FsbGVyLgDAVGhpcyBkb2Vzbid0IHRha2UgZWZmZWN0IHVudGlsIHRoZSBuZXh0IHNlc3Npb24uAFUBVGhlIGRpc3BhdGNoIG9yaWdpbiBvZiB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgU2lnbmVkIGFuZCB0aGUgYWNjb3VudCBtdXN0IGJlIGVpdGhlciBiZV0BY29udmVydGlibGUgdG8gYSB2YWxpZGF0b3IgSUQgdXNpbmcgdGhlIGNoYWluJ3MgdHlwaWNhbCBhZGRyZXNzaW5nIHN5c3RlbSAodGhpcyB1c3VhbGx5UQFtZWFucyBiZWluZyBhIGNvbnRyb2xsZXIgYWNjb3VudCkgb3IgZGlyZWN0bHkgY29udmVydGlibGUgaW50byBhIHZhbGlkYXRvciBJRCAod2hpY2iUdXN1YWxseSBtZWFucyBiZWluZyBhIHN0YXNoIGFjY291bnQpLgA0IyMgQ29tcGxleGl0eT0BLSBgTygxKWAgaW4gbnVtYmVyIG9mIGtleSB0eXBlcy4gQWN0dWFsIGNvc3QgZGVwZW5kcyBvbiB0aGUgbnVtYmVyIG9mIGxlbmd0aCBvZpggIGBUOjpLZXlzOjprZXlfaWRzKClgIHdoaWNoIGlzIGZpeGVkLgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy4ZAgg0cGFzZW9fcnVudGltZSxTZXNzaW9uS2V5cwAAGAEcZ3JhbmRwYdQB0DxHcmFuZHBhIGFzICRjcmF0ZTo6Qm91bmRUb1J1bnRpbWVBcHBQdWJsaWM+OjpQdWJsaWMAARBiYWJlpQEBxDxCYWJlIGFzICRjcmF0ZTo6Qm91bmRUb1J1bnRpbWVBcHBQdWJsaWM+OjpQdWJsaWMAAThwYXJhX3ZhbGlkYXRvch0CAeA8SW5pdGlhbGl6ZXIgYXMgJGNyYXRlOjpCb3VuZFRvUnVudGltZUFwcFB1YmxpYz46OlB1YmxpYwABPHBhcmFfYXNzaWdubWVudCECAfA8UGFyYVNlc3Npb25JbmZvIGFzICRjcmF0ZTo6Qm91bmRUb1J1bnRpbWVBcHBQdWJsaWM+OjpQdWJsaWMAAUxhdXRob3JpdHlfZGlzY292ZXJ5JQIB/DxBdXRob3JpdHlEaXNjb3ZlcnkgYXMgJGNyYXRlOjpCb3VuZFRvUnVudGltZUFwcFB1YmxpYz46OlB1YmxpYwABFGJlZWZ5KQIByDxCZWVmeSBhcyAkY3JhdGU6OkJvdW5kVG9SdW50aW1lQXBwUHVibGljPjo6UHVibGljAAAdAhBMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2NzR2YWxpZGF0b3JfYXBwGFB1YmxpYwAABAAEATxzcjI1NTE5OjpQdWJsaWMAACECEExwb2xrYWRvdF9wcmltaXRpdmVzCHY3OGFzc2lnbm1lbnRfYXBwGFB1YmxpYwAABAAEATxzcjI1NTE5OjpQdWJsaWMAACUCDFhzcF9hdXRob3JpdHlfZGlzY292ZXJ5DGFwcBhQdWJsaWMAAAQABAE8c3IyNTUxOTo6UHVibGljAAApAgxIc3BfY29uc2Vuc3VzX2JlZWZ5MGVjZHNhX2NyeXB0bxhQdWJsaWMAAAQALQIBNGVjZHNhOjpQdWJsaWMAAC0CAAADIQAAAAgAMQIMOHBhbGxldF9ncmFuZHBhGHBhbGxldBBDYWxsBARUAAEMTHJlcG9ydF9lcXVpdm9jYXRpb24IAUhlcXVpdm9jYXRpb25fcHJvb2Y1AgHIQm94PEVxdWl2b2NhdGlvblByb29mPFQ6Okhhc2gsIEJsb2NrTnVtYmVyRm9yPFQ+Pj4AATxrZXlfb3duZXJfcHJvb2atAQFAVDo6S2V5T3duZXJQcm9vZgAAEAkBUmVwb3J0IHZvdGVyIGVxdWl2b2NhdGlvbi9taXNiZWhhdmlvci4gVGhpcyBtZXRob2Qgd2lsbCB2ZXJpZnkgdGhl9GVxdWl2b2NhdGlvbiBwcm9vZiBhbmQgdmFsaWRhdGUgdGhlIGdpdmVuIGtleSBvd25lcnNoaXAgcHJvb2b4YWdhaW5zdCB0aGUgZXh0cmFjdGVkIG9mZmVuZGVyLiBJZiBib3RoIGFyZSB2YWxpZCwgdGhlIG9mZmVuY2VEd2lsbCBiZSByZXBvcnRlZC5wcmVwb3J0X2VxdWl2b2NhdGlvbl91bnNpZ25lZAgBSGVxdWl2b2NhdGlvbl9wcm9vZjUCAchCb3g8RXF1aXZvY2F0aW9uUHJvb2Y8VDo6SGFzaCwgQmxvY2tOdW1iZXJGb3I8VD4+PgABPGtleV9vd25lcl9wcm9vZq0BAUBUOjpLZXlPd25lclByb29mAAEkCQFSZXBvcnQgdm90ZXIgZXF1aXZvY2F0aW9uL21pc2JlaGF2aW9yLiBUaGlzIG1ldGhvZCB3aWxsIHZlcmlmeSB0aGX0ZXF1aXZvY2F0aW9uIHByb29mIGFuZCB2YWxpZGF0ZSB0aGUgZ2l2ZW4ga2V5IG93bmVyc2hpcCBwcm9vZvhhZ2FpbnN0IHRoZSBleHRyYWN0ZWQgb2ZmZW5kZXIuIElmIGJvdGggYXJlIHZhbGlkLCB0aGUgb2ZmZW5jZUR3aWxsIGJlIHJlcG9ydGVkLgANAVRoaXMgZXh0cmluc2ljIG11c3QgYmUgY2FsbGVkIHVuc2lnbmVkIGFuZCBpdCBpcyBleHBlY3RlZCB0aGF0IG9ubHkVAWJsb2NrIGF1dGhvcnMgd2lsbCBjYWxsIGl0ICh2YWxpZGF0ZWQgaW4gYFZhbGlkYXRlVW5zaWduZWRgKSwgYXMgc3VjaBUBaWYgdGhlIGJsb2NrIGF1dGhvciBpcyBkZWZpbmVkIGl0IHdpbGwgYmUgZGVmaW5lZCBhcyB0aGUgZXF1aXZvY2F0aW9uJHJlcG9ydGVyLjBub3RlX3N0YWxsZWQIARRkZWxheRABREJsb2NrTnVtYmVyRm9yPFQ+AAFsYmVzdF9maW5hbGl6ZWRfYmxvY2tfbnVtYmVyEAFEQmxvY2tOdW1iZXJGb3I8VD4AAjA9AU5vdGUgdGhhdCB0aGUgY3VycmVudCBhdXRob3JpdHkgc2V0IG9mIHRoZSBHUkFORFBBIGZpbmFsaXR5IGdhZGdldCBoYXMgc3RhbGxlZC4AYQFUaGlzIHdpbGwgdHJpZ2dlciBhIGZvcmNlZCBhdXRob3JpdHkgc2V0IGNoYW5nZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBuZXh0IHNlc3Npb24sIHRvYQFiZSBlbmFjdGVkIGBkZWxheWAgYmxvY2tzIGFmdGVyIHRoYXQuIFRoZSBgZGVsYXlgIHNob3VsZCBiZSBoaWdoIGVub3VnaCB0byBzYWZlbHkgYXNzdW1lSQF0aGF0IHRoZSBibG9jayBzaWduYWxsaW5nIHRoZSBmb3JjZWQgY2hhbmdlIHdpbGwgbm90IGJlIHJlLW9yZ2VkIGUuZy4gMTAwMCBibG9ja3MuXQFUaGUgYmxvY2sgcHJvZHVjdGlvbiByYXRlICh3aGljaCBtYXkgYmUgc2xvd2VkIGRvd24gYmVjYXVzZSBvZiBmaW5hbGl0eSBsYWdnaW5nKSBzaG91bGRRAWJlIHRha2VuIGludG8gYWNjb3VudCB3aGVuIGNob29zaW5nIHRoZSBgZGVsYXlgLiBUaGUgR1JBTkRQQSB2b3RlcnMgYmFzZWQgb24gdGhlIG5ld1UBYXV0aG9yaXR5IHdpbGwgc3RhcnQgdm90aW5nIG9uIHRvcCBvZiBgYmVzdF9maW5hbGl6ZWRfYmxvY2tfbnVtYmVyYCBmb3IgbmV3IGZpbmFsaXplZE0BYmxvY2tzLiBgYmVzdF9maW5hbGl6ZWRfYmxvY2tfbnVtYmVyYCBzaG91bGQgYmUgdGhlIGhpZ2hlc3Qgb2YgdGhlIGxhdGVzdCBmaW5hbGl6ZWTEYmxvY2sgb2YgYWxsIHZhbGlkYXRvcnMgb2YgdGhlIG5ldyBhdXRob3JpdHkgc2V0LgBYT25seSBjYWxsYWJsZSBieSByb290LgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy41AghQc3BfY29uc2Vuc3VzX2dyYW5kcGFERXF1aXZvY2F0aW9uUHJvb2YIBEgBNAROARAACAEYc2V0X2lkMAEUU2V0SWQAATBlcXVpdm9jYXRpb245AgFIRXF1aXZvY2F0aW9uPEgsIE4+AAA5AghQc3BfY29uc2Vuc3VzX2dyYW5kcGEwRXF1aXZvY2F0aW9uCARIATQETgEQAQgcUHJldm90ZQQAPQIBiQFmaW5hbGl0eV9ncmFuZHBhOjpFcXVpdm9jYXRpb248QXV0aG9yaXR5SWQsIGZpbmFsaXR5X2dyYW5kcGE6OlByZXZvdGU8CkgsIE4+LCBBdXRob3JpdHlTaWduYXR1cmUsPgAAACRQcmVjb21taXQEAFECAZEBZmluYWxpdHlfZ3JhbmRwYTo6RXF1aXZvY2F0aW9uPEF1dGhvcml0eUlkLCBmaW5hbGl0eV9ncmFuZHBhOjpQcmVjb21taXQKPEgsIE4+LCBBdXRob3JpdHlTaWduYXR1cmUsPgABAAA9AghAZmluYWxpdHlfZ3JhbmRwYTBFcXVpdm9jYXRpb24MCElkAdQEVgFBAgRTAUUCABABMHJvdW5kX251bWJlcjABDHU2NAABIGlkZW50aXR51AEISWQAARRmaXJzdE0CARgoViwgUykAARhzZWNvbmRNAgEYKFYsIFMpAABBAghAZmluYWxpdHlfZ3JhbmRwYRxQcmV2b3RlCARIATQETgEQAAgBLHRhcmdldF9oYXNoNAEESAABNHRhcmdldF9udW1iZXIQAQROAABFAgxQc3BfY29uc2Vuc3VzX2dyYW5kcGEMYXBwJFNpZ25hdHVyZQAABABJAgFIZWQyNTUxOTo6U2lnbmF0dXJlAABJAgAAA0AAAAAIAE0CAAAECEECRQIAUQIIQGZpbmFsaXR5X2dyYW5kcGEwRXF1aXZvY2F0aW9uDAhJZAHUBFYBVQIEUwFFAgAQATByb3VuZF9udW1iZXIwAQx1NjQAASBpZGVudGl0edQBCElkAAEUZmlyc3RZAgEYKFYsIFMpAAEYc2Vjb25kWQIBGChWLCBTKQAAVQIIQGZpbmFsaXR5X2dyYW5kcGEkUHJlY29tbWl0CARIATQETgEQAAgBLHRhcmdldF9oYXNoNAEESAABNHRhcmdldF9udW1iZXIQAQROAABZAgAABAhVAkUCAF0CDDxwYWxsZXRfdHJlYXN1cnkYcGFsbGV0EENhbGwIBFQABEkAARgsc3BlbmRfbG9jYWwIARhhbW91bnT8ATxCYWxhbmNlT2Y8VCwgST4AASxiZW5lZmljaWFyecUBAVBBY2NvdW50SWRMb29rdXBPZjxUPgADRLhQcm9wb3NlIGFuZCBhcHByb3ZlIGEgc3BlbmQgb2YgdHJlYXN1cnkgZnVuZHMuAEgjIyBEaXNwYXRjaCBPcmlnaW4ARQFNdXN0IGJlIFtgQ29uZmlnOjpTcGVuZE9yaWdpbmBdIHdpdGggdGhlIGBTdWNjZXNzYCB2YWx1ZSBiZWluZyBhdCBsZWFzdCBgYW1vdW50YC4ALCMjIyBEZXRhaWxzRQFOT1RFOiBGb3IgcmVjb3JkLWtlZXBpbmcgcHVycG9zZXMsIHRoZSBwcm9wb3NlciBpcyBkZWVtZWQgdG8gYmUgZXF1aXZhbGVudCB0byB0aGUwYmVuZWZpY2lhcnkuADgjIyMgUGFyYW1ldGVyc0EBLSBgYW1vdW50YDogVGhlIGFtb3VudCB0byBiZSB0cmFuc2ZlcnJlZCBmcm9tIHRoZSB0cmVhc3VyeSB0byB0aGUgYGJlbmVmaWNpYXJ5YC7oLSBgYmVuZWZpY2lhcnlgOiBUaGUgZGVzdGluYXRpb24gYWNjb3VudCBmb3IgdGhlIHRyYW5zZmVyLgAkIyMgRXZlbnRzALRFbWl0cyBbYEV2ZW50OjpTcGVuZEFwcHJvdmVkYF0gaWYgc3VjY2Vzc2Z1bC48cmVtb3ZlX2FwcHJvdmFsBAEscHJvcG9zYWxfaWTsATRQcm9wb3NhbEluZGV4AARULQFGb3JjZSBhIHByZXZpb3VzbHkgYXBwcm92ZWQgcHJvcG9zYWwgdG8gYmUgcmVtb3ZlZCBmcm9tIHRoZSBhcHByb3ZhbCBxdWV1ZS4ASCMjIERpc3BhdGNoIE9yaWdpbgCETXVzdCBiZSBbYENvbmZpZzo6UmVqZWN0T3JpZ2luYF0uACgjIyBEZXRhaWxzAMBUaGUgb3JpZ2luYWwgZGVwb3NpdCB3aWxsIG5vIGxvbmdlciBiZSByZXR1cm5lZC4AOCMjIyBQYXJhbWV0ZXJzoC0gYHByb3Bvc2FsX2lkYDogVGhlIGluZGV4IG9mIGEgcHJvcG9zYWwAOCMjIyBDb21wbGV4aXR5rC0gTyhBKSB3aGVyZSBgQWAgaXMgdGhlIG51bWJlciBvZiBhcHByb3ZhbHMAKCMjIyBFcnJvcnNFAS0gW2BFcnJvcjo6UHJvcG9zYWxOb3RBcHByb3ZlZGBdOiBUaGUgYHByb3Bvc2FsX2lkYCBzdXBwbGllZCB3YXMgbm90IGZvdW5kIGluIHRoZVEBICBhcHByb3ZhbCBxdWV1ZSwgaS5lLiwgdGhlIHByb3Bvc2FsIGhhcyBub3QgYmVlbiBhcHByb3ZlZC4gVGhpcyBjb3VsZCBhbHNvIG1lYW4gdGhlWQEgIHByb3Bvc2FsIGRvZXMgbm90IGV4aXN0IGFsdG9nZXRoZXIsIHRodXMgdGhlcmUgaXMgbm8gd2F5IGl0IHdvdWxkIGhhdmUgYmVlbiBhcHByb3ZlZFQgIGluIHRoZSBmaXJzdCBwbGFjZS4Uc3BlbmQQAShhc3NldF9raW5k3AFEQm94PFQ6OkFzc2V0S2luZD4AARhhbW91bnT8AVBBc3NldEJhbGFuY2VPZjxULCBJPgABLGJlbmVmaWNpYXJ5RQEBeEJveDxCZW5lZmljaWFyeUxvb2t1cE9mPFQsIEk+PgABKHZhbGlkX2Zyb21hAgFkT3B0aW9uPEJsb2NrTnVtYmVyRm9yPFQ+PgAFaLhQcm9wb3NlIGFuZCBhcHByb3ZlIGEgc3BlbmQgb2YgdHJlYXN1cnkgZnVuZHMuAEgjIyBEaXNwYXRjaCBPcmlnaW4AHQFNdXN0IGJlIFtgQ29uZmlnOjpTcGVuZE9yaWdpbmBdIHdpdGggdGhlIGBTdWNjZXNzYCB2YWx1ZSBiZWluZyBhdCBsZWFzdFUBYGFtb3VudGAgb2YgYGFzc2V0X2tpbmRgIGluIHRoZSBuYXRpdmUgYXNzZXQuIFRoZSBhbW91bnQgb2YgYGFzc2V0X2tpbmRgIGlzIGNvbnZlcnRlZNRmb3IgYXNzZXJ0aW9uIHVzaW5nIHRoZSBbYENvbmZpZzo6QmFsYW5jZUNvbnZlcnRlcmBdLgAoIyMgRGV0YWlscwBJAUNyZWF0ZSBhbiBhcHByb3ZlZCBzcGVuZCBmb3IgdHJhbnNmZXJyaW5nIGEgc3BlY2lmaWMgYGFtb3VudGAgb2YgYGFzc2V0X2tpbmRgIHRvIGFhAWRlc2lnbmF0ZWQgYmVuZWZpY2lhcnkuIFRoZSBzcGVuZCBtdXN0IGJlIGNsYWltZWQgdXNpbmcgdGhlIGBwYXlvdXRgIGRpc3BhdGNoYWJsZSB3aXRoaW50dGhlIFtgQ29uZmlnOjpQYXlvdXRQZXJpb2RgXS4AOCMjIyBQYXJhbWV0ZXJzFQEtIGBhc3NldF9raW5kYDogQW4gaW5kaWNhdG9yIG9mIHRoZSBzcGVjaWZpYyBhc3NldCBjbGFzcyB0byBiZSBzcGVudC5BAS0gYGFtb3VudGA6IFRoZSBhbW91bnQgdG8gYmUgdHJhbnNmZXJyZWQgZnJvbSB0aGUgdHJlYXN1cnkgdG8gdGhlIGBiZW5lZmljaWFyeWAuuC0gYGJlbmVmaWNpYXJ5YDogVGhlIGJlbmVmaWNpYXJ5IG9mIHRoZSBzcGVuZC5VAS0gYHZhbGlkX2Zyb21gOiBUaGUgYmxvY2sgbnVtYmVyIGZyb20gd2hpY2ggdGhlIHNwZW5kIGNhbiBiZSBjbGFpbWVkLiBJdCBjYW4gcmVmZXIgdG8ZASAgdGhlIHBhc3QgaWYgdGhlIHJlc3VsdGluZyBzcGVuZCBoYXMgbm90IHlldCBleHBpcmVkIGFjY29yZGluZyB0byB0aGVFASAgW2BDb25maWc6OlBheW91dFBlcmlvZGBdLiBJZiBgTm9uZWAsIHRoZSBzcGVuZCBjYW4gYmUgY2xhaW1lZCBpbW1lZGlhdGVseSBhZnRlciwgIGFwcHJvdmFsLgAkIyMgRXZlbnRzAMhFbWl0cyBbYEV2ZW50OjpBc3NldFNwZW5kQXBwcm92ZWRgXSBpZiBzdWNjZXNzZnVsLhhwYXlvdXQEARRpbmRleBABKFNwZW5kSW5kZXgABkw4Q2xhaW0gYSBzcGVuZC4ASCMjIERpc3BhdGNoIE9yaWdpbgA4TXVzdCBiZSBzaWduZWQAKCMjIERldGFpbHMAVQFTcGVuZHMgbXVzdCBiZSBjbGFpbWVkIHdpdGhpbiBzb21lIHRlbXBvcmFsIGJvdW5kcy4gQSBzcGVuZCBtYXkgYmUgY2xhaW1lZCB3aXRoaW4gb25l1FtgQ29uZmlnOjpQYXlvdXRQZXJpb2RgXSBmcm9tIHRoZSBgdmFsaWRfZnJvbWAgYmxvY2suVQFJbiBjYXNlIG9mIGEgcGF5b3V0IGZhaWx1cmUsIHRoZSBzcGVuZCBzdGF0dXMgbXVzdCBiZSB1cGRhdGVkIHdpdGggdGhlIGBjaGVja19zdGF0dXNg3GRpc3BhdGNoYWJsZSBiZWZvcmUgcmV0cnlpbmcgd2l0aCB0aGUgY3VycmVudCBmdW5jdGlvbi4AOCMjIyBQYXJhbWV0ZXJzbC0gYGluZGV4YDogVGhlIHNwZW5kIGluZGV4LgAkIyMgRXZlbnRzAJBFbWl0cyBbYEV2ZW50OjpQYWlkYF0gaWYgc3VjY2Vzc2Z1bC4wY2hlY2tfc3RhdHVzBAEUaW5kZXgQAShTcGVuZEluZGV4AAdMKQFDaGVjayB0aGUgc3RhdHVzIG9mIHRoZSBzcGVuZCBhbmQgcmVtb3ZlIGl0IGZyb20gdGhlIHN0b3JhZ2UgaWYgcHJvY2Vzc2VkLgBIIyMgRGlzcGF0Y2ggT3JpZ2luADxNdXN0IGJlIHNpZ25lZC4AKCMjIERldGFpbHMAAQFUaGUgc3RhdHVzIGNoZWNrIGlzIGEgcHJlcmVxdWlzaXRlIGZvciByZXRyeWluZyBhIGZhaWxlZCBwYXlvdXQuSQFJZiBhIHNwZW5kIGhhcyBlaXRoZXIgc3VjY2VlZGVkIG9yIGV4cGlyZWQsIGl0IGlzIHJlbW92ZWQgZnJvbSB0aGUgc3RvcmFnZSBieSB0aGlz7GZ1bmN0aW9uLiBJbiBzdWNoIGluc3RhbmNlcywgdHJhbnNhY3Rpb24gZmVlcyBhcmUgcmVmdW5kZWQuADgjIyMgUGFyYW1ldGVyc2wtIGBpbmRleGA6IFRoZSBzcGVuZCBpbmRleC4AJCMjIEV2ZW50cwD4RW1pdHMgW2BFdmVudDo6UGF5bWVudEZhaWxlZGBdIGlmIHRoZSBzcGVuZCBwYXlvdXQgaGFzIGZhaWxlZC4BAUVtaXRzIFtgRXZlbnQ6OlNwZW5kUHJvY2Vzc2VkYF0gaWYgdGhlIHNwZW5kIHBheW91dCBoYXMgc3VjY2VlZC4odm9pZF9zcGVuZAQBFGluZGV4EAEoU3BlbmRJbmRleAAIQHxWb2lkIHByZXZpb3VzbHkgYXBwcm92ZWQgc3BlbmQuAEgjIyBEaXNwYXRjaCBPcmlnaW4AhE11c3QgYmUgW2BDb25maWc6OlJlamVjdE9yaWdpbmBdLgAoIyMgRGV0YWlscwAdAUEgc3BlbmQgdm9pZCBpcyBvbmx5IHBvc3NpYmxlIGlmIHRoZSBwYXlvdXQgaGFzIG5vdCBiZWVuIGF0dGVtcHRlZCB5ZXQuADgjIyMgUGFyYW1ldGVyc2wtIGBpbmRleGA6IFRoZSBzcGVuZCBpbmRleC4AJCMjIEV2ZW50cwDARW1pdHMgW2BFdmVudDo6QXNzZXRTcGVuZFZvaWRlZGBdIGlmIHN1Y2Nlc3NmdWwuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLmECBBhPcHRpb24EBFQBEAEIEE5vbmUAAAAQU29tZQQAEAAAAQAAZQIMYHBhbGxldF9jb252aWN0aW9uX3ZvdGluZxhwYWxsZXQQQ2FsbAgEVAAESQABGBB2b3RlCAEocG9sbF9pbmRleOwBRFBvbGxJbmRleE9mPFQsIEk+AAEQdm90ZWkCAXBBY2NvdW50Vm90ZTxCYWxhbmNlT2Y8VCwgST4+AAAkGQFWb3RlIGluIGEgcG9sbC4gSWYgYHZvdGUuaXNfYXllKClgLCB0aGUgdm90ZSBpcyB0byBlbmFjdCB0aGUgcHJvcG9zYWw7uG90aGVyd2lzZSBpdCBpcyBhIHZvdGUgdG8ga2VlcCB0aGUgc3RhdHVzIHF1by4AyFRoZSBkaXNwYXRjaCBvcmlnaW4gb2YgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uAMgtIGBwb2xsX2luZGV4YDogVGhlIGluZGV4IG9mIHRoZSBwb2xsIHRvIHZvdGUgZm9yLoQtIGB2b3RlYDogVGhlIHZvdGUgY29uZmlndXJhdGlvbi4AFQFXZWlnaHQ6IGBPKFIpYCB3aGVyZSBSIGlzIHRoZSBudW1iZXIgb2YgcG9sbHMgdGhlIHZvdGVyIGhhcyB2b3RlZCBvbi4gZGVsZWdhdGUQARRjbGFzc20BATRDbGFzc09mPFQsIEk+AAEIdG/FAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AAShjb252aWN0aW9ucQIBKENvbnZpY3Rpb24AARxiYWxhbmNlGAE8QmFsYW5jZU9mPFQsIEk+AAFcTQFEZWxlZ2F0ZSB0aGUgdm90aW5nIHBvd2VyICh3aXRoIHNvbWUgZ2l2ZW4gY29udmljdGlvbikgb2YgdGhlIHNlbmRpbmcgYWNjb3VudCBmb3IgYWhwYXJ0aWN1bGFyIGNsYXNzIG9mIHBvbGxzLgBVAVRoZSBiYWxhbmNlIGRlbGVnYXRlZCBpcyBsb2NrZWQgZm9yIGFzIGxvbmcgYXMgaXQncyBkZWxlZ2F0ZWQsIGFuZCB0aGVyZWFmdGVyIGZvciB0aGXIdGltZSBhcHByb3ByaWF0ZSBmb3IgdGhlIGNvbnZpY3Rpb24ncyBsb2NrIHBlcmlvZC4AXQFUaGUgZGlzcGF0Y2ggb3JpZ2luIG9mIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfLCBhbmQgdGhlIHNpZ25pbmcgYWNjb3VudCBtdXN0IGVpdGhlcjp0ICAtIGJlIGRlbGVnYXRpbmcgYWxyZWFkeTsgb3JFASAgLSBoYXZlIG5vIHZvdGluZyBhY3Rpdml0eSAoaWYgdGhlcmUgaXMsIHRoZW4gaXQgd2lsbCBuZWVkIHRvIGJlIHJlbW92ZWQgdGhyb3VnaEwgICAgYHJlbW92ZV92b3RlYCkuAEUBLSBgdG9gOiBUaGUgYWNjb3VudCB3aG9zZSB2b3RpbmcgdGhlIGB0YXJnZXRgIGFjY291bnQncyB2b3RpbmcgcG93ZXIgd2lsbCBmb2xsb3cuXQEtIGBjbGFzc2A6IFRoZSBjbGFzcyBvZiBwb2xscyB0byBkZWxlZ2F0ZS4gVG8gZGVsZWdhdGUgbXVsdGlwbGUgY2xhc3NlcywgbXVsdGlwbGUgY2FsbHOAICB0byB0aGlzIGZ1bmN0aW9uIGFyZSByZXF1aXJlZC5VAS0gYGNvbnZpY3Rpb25gOiBUaGUgY29udmljdGlvbiB0aGF0IHdpbGwgYmUgYXR0YWNoZWQgdG8gdGhlIGRlbGVnYXRlZCB2b3Rlcy4gV2hlbiB0aGVBASAgYWNjb3VudCBpcyB1bmRlbGVnYXRlZCwgdGhlIGZ1bmRzIHdpbGwgYmUgbG9ja2VkIGZvciB0aGUgY29ycmVzcG9uZGluZyBwZXJpb2QuYQEtIGBiYWxhbmNlYDogVGhlIGFtb3VudCBvZiB0aGUgYWNjb3VudCdzIGJhbGFuY2UgdG8gYmUgdXNlZCBpbiBkZWxlZ2F0aW5nLiBUaGlzIG11c3Qgbm90tCAgYmUgbW9yZSB0aGFuIHRoZSBhY2NvdW50J3MgY3VycmVudCBiYWxhbmNlLgBIRW1pdHMgYERlbGVnYXRlZGAuACUBV2VpZ2h0OiBgTyhSKWAgd2hlcmUgUiBpcyB0aGUgbnVtYmVyIG9mIHBvbGxzIHRoZSB2b3RlciBkZWxlZ2F0aW5nIHRvIGhhc00BICB2b3RlZCBvbi4gV2VpZ2h0IGlzIGluaXRpYWxseSBjaGFyZ2VkIGFzIGlmIG1heGltdW0gdm90ZXMsIGJ1dCBpcyByZWZ1bmRlZCBsYXRlci4odW5kZWxlZ2F0ZQQBFGNsYXNzbQEBNENsYXNzT2Y8VCwgST4AAjhNAVVuZGVsZWdhdGUgdGhlIHZvdGluZyBwb3dlciBvZiB0aGUgc2VuZGluZyBhY2NvdW50IGZvciBhIHBhcnRpY3VsYXIgY2xhc3Mgb2YgcG9sbHMuAF0BVG9rZW5zIG1heSBiZSB1bmxvY2tlZCBmb2xsb3dpbmcgb25jZSBhbiBhbW91bnQgb2YgdGltZSBjb25zaXN0ZW50IHdpdGggdGhlIGxvY2sgcGVyaW9kCQFvZiB0aGUgY29udmljdGlvbiB3aXRoIHdoaWNoIHRoZSBkZWxlZ2F0aW9uIHdhcyBpc3N1ZWQgaGFzIHBhc3NlZC4ARQFUaGUgZGlzcGF0Y2ggb3JpZ2luIG9mIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfIGFuZCB0aGUgc2lnbmluZyBhY2NvdW50IG11c3QgYmVUY3VycmVudGx5IGRlbGVnYXRpbmcuAPAtIGBjbGFzc2A6IFRoZSBjbGFzcyBvZiBwb2xscyB0byByZW1vdmUgdGhlIGRlbGVnYXRpb24gZnJvbS4AUEVtaXRzIGBVbmRlbGVnYXRlZGAuACUBV2VpZ2h0OiBgTyhSKWAgd2hlcmUgUiBpcyB0aGUgbnVtYmVyIG9mIHBvbGxzIHRoZSB2b3RlciBkZWxlZ2F0aW5nIHRvIGhhc00BICB2b3RlZCBvbi4gV2VpZ2h0IGlzIGluaXRpYWxseSBjaGFyZ2VkIGFzIGlmIG1heGltdW0gdm90ZXMsIGJ1dCBpcyByZWZ1bmRlZCBsYXRlci4YdW5sb2NrCAEUY2xhc3NtAQE0Q2xhc3NPZjxULCBJPgABGHRhcmdldMUBAVBBY2NvdW50SWRMb29rdXBPZjxUPgADJF0BUmVtb3ZlIHRoZSBsb2NrIGNhdXNlZCBieSBwcmlvciB2b3RpbmcvZGVsZWdhdGluZyB3aGljaCBoYXMgZXhwaXJlZCB3aXRoaW4gYSBwYXJ0aWN1bGFyGGNsYXNzLgDIVGhlIGRpc3BhdGNoIG9yaWdpbiBvZiB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXy4AoC0gYGNsYXNzYDogVGhlIGNsYXNzIG9mIHBvbGxzIHRvIHVubG9jay64LSBgdGFyZ2V0YDogVGhlIGFjY291bnQgdG8gcmVtb3ZlIHRoZSBsb2NrIG9uLgC8V2VpZ2h0OiBgTyhSKWAgd2l0aCBSIG51bWJlciBvZiB2b3RlIG9mIHRhcmdldC4scmVtb3ZlX3ZvdGUIARRjbGFzc3UCAVRPcHRpb248Q2xhc3NPZjxULCBJPj4AARRpbmRleBABRFBvbGxJbmRleE9mPFQsIEk+AAR0ZFJlbW92ZSBhIHZvdGUgZm9yIGEgcG9sbC4ADElmOnAtIHRoZSBwb2xsIHdhcyBjYW5jZWxsZWQsIG9yZC0gdGhlIHBvbGwgaXMgb25nb2luZywgb3J4LSB0aGUgcG9sbCBoYXMgZW5kZWQgc3VjaCB0aGF0/CAgLSB0aGUgdm90ZSBvZiB0aGUgYWNjb3VudCB3YXMgaW4gb3Bwb3NpdGlvbiB0byB0aGUgcmVzdWx0OyBvctQgIC0gdGhlcmUgd2FzIG5vIGNvbnZpY3Rpb24gdG8gdGhlIGFjY291bnQncyB2b3RlOyBvcoQgIC0gdGhlIGFjY291bnQgbWFkZSBhIHNwbGl0IHZvdGVdAS4uLnRoZW4gdGhlIHZvdGUgaXMgcmVtb3ZlZCBjbGVhbmx5IGFuZCBhIGZvbGxvd2luZyBjYWxsIHRvIGB1bmxvY2tgIG1heSByZXN1bHQgaW4gbW9yZVhmdW5kcyBiZWluZyBhdmFpbGFibGUuAJBJZiwgaG93ZXZlciwgdGhlIHBvbGwgaGFzIGVuZGVkIGFuZDrsLSBpdCBmaW5pc2hlZCBjb3JyZXNwb25kaW5nIHRvIHRoZSB2b3RlIG9mIHRoZSBhY2NvdW50LCBhbmTcLSB0aGUgYWNjb3VudCBtYWRlIGEgc3RhbmRhcmQgdm90ZSB3aXRoIGNvbnZpY3Rpb24sIGFuZLwtIHRoZSBsb2NrIHBlcmlvZCBvZiB0aGUgY29udmljdGlvbiBpcyBub3Qgb3ZlclkBLi4udGhlbiB0aGUgbG9jayB3aWxsIGJlIGFnZ3JlZ2F0ZWQgaW50byB0aGUgb3ZlcmFsbCBhY2NvdW50J3MgbG9jaywgd2hpY2ggbWF5IGludm9sdmVZASpvdmVybG9ja2luZyogKHdoZXJlIHRoZSB0d28gbG9ja3MgYXJlIGNvbWJpbmVkIGludG8gYSBzaW5nbGUgbG9jayB0aGF0IGlzIHRoZSBtYXhpbXVt5G9mIGJvdGggdGhlIGFtb3VudCBsb2NrZWQgYW5kIHRoZSB0aW1lIGlzIGl0IGxvY2tlZCBmb3IpLgBJAVRoZSBkaXNwYXRjaCBvcmlnaW4gb2YgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8sIGFuZCB0aGUgc2lnbmVyIG11c3QgaGF2ZSBhIHZvdGVwcmVnaXN0ZXJlZCBmb3IgcG9sbCBgaW5kZXhgLgDcLSBgaW5kZXhgOiBUaGUgaW5kZXggb2YgcG9sbCBvZiB0aGUgdm90ZSB0byBiZSByZW1vdmVkLlUBLSBgY2xhc3NgOiBPcHRpb25hbCBwYXJhbWV0ZXIsIGlmIGdpdmVuIGl0IGluZGljYXRlcyB0aGUgY2xhc3Mgb2YgdGhlIHBvbGwuIEZvciBwb2xsc/AgIHdoaWNoIGhhdmUgZmluaXNoZWQgb3IgYXJlIGNhbmNlbGxlZCwgdGhpcyBtdXN0IGJlIGBTb21lYC4ARQFXZWlnaHQ6IGBPKFIgKyBsb2cgUilgIHdoZXJlIFIgaXMgdGhlIG51bWJlciBvZiBwb2xscyB0aGF0IGB0YXJnZXRgIGhhcyB2b3RlZCBvbi7YICBXZWlnaHQgaXMgY2FsY3VsYXRlZCBmb3IgdGhlIG1heGltdW0gbnVtYmVyIG9mIHZvdGUuRHJlbW92ZV9vdGhlcl92b3RlDAEYdGFyZ2V0xQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEUY2xhc3NtAQE0Q2xhc3NPZjxULCBJPgABFGluZGV4EAFEUG9sbEluZGV4T2Y8VCwgST4ABUBkUmVtb3ZlIGEgdm90ZSBmb3IgYSBwb2xsLgBNAUlmIHRoZSBgdGFyZ2V0YCBpcyBlcXVhbCB0byB0aGUgc2lnbmVyLCB0aGVuIHRoaXMgZnVuY3Rpb24gaXMgZXhhY3RseSBlcXVpdmFsZW50IHRvLQFgcmVtb3ZlX3ZvdGVgLiBJZiBub3QgZXF1YWwgdG8gdGhlIHNpZ25lciwgdGhlbiB0aGUgdm90ZSBtdXN0IGhhdmUgZXhwaXJlZCwlAWVpdGhlciBiZWNhdXNlIHRoZSBwb2xsIHdhcyBjYW5jZWxsZWQsIGJlY2F1c2UgdGhlIHZvdGVyIGxvc3QgdGhlIHBvbGwgb3KYYmVjYXVzZSB0aGUgY29udmljdGlvbiBwZXJpb2QgaXMgb3Zlci4AyFRoZSBkaXNwYXRjaCBvcmlnaW4gb2YgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uAGEBLSBgdGFyZ2V0YDogVGhlIGFjY291bnQgb2YgdGhlIHZvdGUgdG8gYmUgcmVtb3ZlZDsgdGhpcyBhY2NvdW50IG11c3QgaGF2ZSB2b3RlZCBmb3IgcG9sbCggIGBpbmRleGAu3C0gYGluZGV4YDogVGhlIGluZGV4IG9mIHBvbGwgb2YgdGhlIHZvdGUgdG8gYmUgcmVtb3ZlZC6ELSBgY2xhc3NgOiBUaGUgY2xhc3Mgb2YgdGhlIHBvbGwuAEUBV2VpZ2h0OiBgTyhSICsgbG9nIFIpYCB3aGVyZSBSIGlzIHRoZSBudW1iZXIgb2YgcG9sbHMgdGhhdCBgdGFyZ2V0YCBoYXMgdm90ZWQgb24u2CAgV2VpZ2h0IGlzIGNhbGN1bGF0ZWQgZm9yIHRoZSBtYXhpbXVtIG51bWJlciBvZiB2b3RlLgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy5pAgxgcGFsbGV0X2NvbnZpY3Rpb25fdm90aW5nEHZvdGUsQWNjb3VudFZvdGUEHEJhbGFuY2UBGAEMIFN0YW5kYXJkCAEQdm90ZW0CARBWb3RlAAEcYmFsYW5jZRgBHEJhbGFuY2UAAAAUU3BsaXQIAQxheWUYARxCYWxhbmNlAAEMbmF5GAEcQmFsYW5jZQABADBTcGxpdEFic3RhaW4MAQxheWUYARxCYWxhbmNlAAEMbmF5GAEcQmFsYW5jZQABHGFic3RhaW4YARxCYWxhbmNlAAIAAG0CDGBwYWxsZXRfY29udmljdGlvbl92b3RpbmcQdm90ZRBWb3RlAAAEAAgAAABxAgxgcGFsbGV0X2NvbnZpY3Rpb25fdm90aW5nKGNvbnZpY3Rpb24oQ29udmljdGlvbgABHBBOb25lAAAAIExvY2tlZDF4AAEAIExvY2tlZDJ4AAIAIExvY2tlZDN4AAMAIExvY2tlZDR4AAQAIExvY2tlZDV4AAUAIExvY2tlZDZ4AAYAAHUCBBhPcHRpb24EBFQBbQEBCBBOb25lAAAAEFNvbWUEAG0BAAABAAB5AgxAcGFsbGV0X3JlZmVyZW5kYRhwYWxsZXQQQ2FsbAgEVAAESQABJBhzdWJtaXQMATxwcm9wb3NhbF9vcmlnaW59AgFcQm94PFBhbGxldHNPcmlnaW5PZjxUPj4AASBwcm9wb3NhbHEBAUxCb3VuZGVkQ2FsbE9mPFQsIEk+AAFAZW5hY3RtZW50X21vbWVudJkCAXxEaXNwYXRjaFRpbWU8QmxvY2tOdW1iZXJGb3I8VD4+AAAksFByb3Bvc2UgYSByZWZlcmVuZHVtIG9uIGEgcHJpdmlsZWdlZCBhY3Rpb24uAFkBLSBgb3JpZ2luYDogbXVzdCBiZSBgU3VibWl0T3JpZ2luYCBhbmQgdGhlIGFjY291bnQgbXVzdCBoYXZlIGBTdWJtaXNzaW9uRGVwb3NpdGAgZnVuZHMwICBhdmFpbGFibGUuLQEtIGBwcm9wb3NhbF9vcmlnaW5gOiBUaGUgb3JpZ2luIGZyb20gd2hpY2ggdGhlIHByb3Bvc2FsIHNob3VsZCBiZSBleGVjdXRlZC5sLSBgcHJvcG9zYWxgOiBUaGUgcHJvcG9zYWwuFQEtIGBlbmFjdG1lbnRfbW9tZW50YDogVGhlIG1vbWVudCB0aGF0IHRoZSBwcm9wb3NhbCBzaG91bGQgYmUgZW5hY3RlZC4ASEVtaXRzIGBTdWJtaXR0ZWRgLlhwbGFjZV9kZWNpc2lvbl9kZXBvc2l0BAEUaW5kZXgQATxSZWZlcmVuZHVtSW5kZXgAASCsUG9zdCB0aGUgRGVjaXNpb24gRGVwb3NpdCBmb3IgYSByZWZlcmVuZHVtLgA5AS0gYG9yaWdpbmA6IG11c3QgYmUgYFNpZ25lZGAgYW5kIHRoZSBhY2NvdW50IG11c3QgaGF2ZSBmdW5kcyBhdmFpbGFibGUgZm9yIHRoZaAgIHJlZmVyZW5kdW0ncyB0cmFjaydzIERlY2lzaW9uIERlcG9zaXQuUQEtIGBpbmRleGA6IFRoZSBpbmRleCBvZiB0aGUgc3VibWl0dGVkIHJlZmVyZW5kdW0gd2hvc2UgRGVjaXNpb24gRGVwb3NpdCBpcyB5ZXQgdG8gYmUkICBwb3N0ZWQuAHhFbWl0cyBgRGVjaXNpb25EZXBvc2l0UGxhY2VkYC5ccmVmdW5kX2RlY2lzaW9uX2RlcG9zaXQEARRpbmRleBABPFJlZmVyZW5kdW1JbmRleAACHCkBUmVmdW5kIHRoZSBEZWNpc2lvbiBEZXBvc2l0IGZvciBhIGNsb3NlZCByZWZlcmVuZHVtIGJhY2sgdG8gdGhlIGRlcG9zaXRvci4AnC0gYG9yaWdpbmA6IG11c3QgYmUgYFNpZ25lZGAgb3IgYFJvb3RgLk0BLSBgaW5kZXhgOiBUaGUgaW5kZXggb2YgYSBjbG9zZWQgcmVmZXJlbmR1bSB3aG9zZSBEZWNpc2lvbiBEZXBvc2l0IGhhcyBub3QgeWV0IGJlZW4sICByZWZ1bmRlZC4AgEVtaXRzIGBEZWNpc2lvbkRlcG9zaXRSZWZ1bmRlZGAuGGNhbmNlbAQBFGluZGV4EAE8UmVmZXJlbmR1bUluZGV4AAMYdENhbmNlbCBhbiBvbmdvaW5nIHJlZmVyZW5kdW0uAJwtIGBvcmlnaW5gOiBtdXN0IGJlIHRoZSBgQ2FuY2VsT3JpZ2luYC7cLSBgaW5kZXhgOiBUaGUgaW5kZXggb2YgdGhlIHJlZmVyZW5kdW0gdG8gYmUgY2FuY2VsbGVkLgBIRW1pdHMgYENhbmNlbGxlZGAuEGtpbGwEARRpbmRleBABPFJlZmVyZW5kdW1JbmRleAAEGNBDYW5jZWwgYW4gb25nb2luZyByZWZlcmVuZHVtIGFuZCBzbGFzaCB0aGUgZGVwb3NpdHMuAJQtIGBvcmlnaW5gOiBtdXN0IGJlIHRoZSBgS2lsbE9yaWdpbmAu3C0gYGluZGV4YDogVGhlIGluZGV4IG9mIHRoZSByZWZlcmVuZHVtIHRvIGJlIGNhbmNlbGxlZC4AkEVtaXRzIGBLaWxsZWRgIGFuZCBgRGVwb3NpdFNsYXNoZWRgLkBudWRnZV9yZWZlcmVuZHVtBAEUaW5kZXgQATxSZWZlcmVuZHVtSW5kZXgABRAdAUFkdmFuY2UgYSByZWZlcmVuZHVtIG9udG8gaXRzIG5leHQgbG9naWNhbCBzdGF0ZS4gT25seSB1c2VkIGludGVybmFsbHkuAGwtIGBvcmlnaW5gOiBtdXN0IGJlIGBSb290YC6kLSBgaW5kZXhgOiB0aGUgcmVmZXJlbmR1bSB0byBiZSBhZHZhbmNlZC5Ib25lX2Zld2VyX2RlY2lkaW5nBAEUdHJhY2ttAQE8VHJhY2tJZE9mPFQsIEk+AAYkCQFBZHZhbmNlIGEgdHJhY2sgb250byBpdHMgbmV4dCBsb2dpY2FsIHN0YXRlLiBPbmx5IHVzZWQgaW50ZXJuYWxseS4AbC0gYG9yaWdpbmA6IG11c3QgYmUgYFJvb3RgLpAtIGB0cmFja2A6IHRoZSB0cmFjayB0byBiZSBhZHZhbmNlZC4AUQFBY3Rpb24gaXRlbSBmb3Igd2hlbiB0aGVyZSBpcyBub3cgb25lIGZld2VyIHJlZmVyZW5kdW0gaW4gdGhlIGRlY2lkaW5nIHBoYXNlIGFuZCB0aGUVAWBEZWNpZGluZ0NvdW50YCBpcyBub3QgeWV0IHVwZGF0ZWQuIFRoaXMgbWVhbnMgdGhhdCB3ZSBzaG91bGQgZWl0aGVyOiUBLSBiZWdpbiBkZWNpZGluZyBhbm90aGVyIHJlZmVyZW5kdW0gKGFuZCBsZWF2ZSBgRGVjaWRpbmdDb3VudGAgYWxvbmUpOyBvcnAtIGRlY3JlbWVudCBgRGVjaWRpbmdDb3VudGAuZHJlZnVuZF9zdWJtaXNzaW9uX2RlcG9zaXQEARRpbmRleBABPFJlZmVyZW5kdW1JbmRleAAHHDEBUmVmdW5kIHRoZSBTdWJtaXNzaW9uIERlcG9zaXQgZm9yIGEgY2xvc2VkIHJlZmVyZW5kdW0gYmFjayB0byB0aGUgZGVwb3NpdG9yLgCcLSBgb3JpZ2luYDogbXVzdCBiZSBgU2lnbmVkYCBvciBgUm9vdGAuVQEtIGBpbmRleGA6IFRoZSBpbmRleCBvZiBhIGNsb3NlZCByZWZlcmVuZHVtIHdob3NlIFN1Ym1pc3Npb24gRGVwb3NpdCBoYXMgbm90IHlldCBiZWVuLCAgcmVmdW5kZWQuAIhFbWl0cyBgU3VibWlzc2lvbkRlcG9zaXRSZWZ1bmRlZGAuMHNldF9tZXRhZGF0YQgBFGluZGV4EAE8UmVmZXJlbmR1bUluZGV4AAEobWF5YmVfaGFzaJ0CATxPcHRpb248VDo6SGFzaD4ACByYU2V0IG9yIGNsZWFyIG1ldGFkYXRhIG9mIGEgcmVmZXJlbmR1bS4ALFBhcmFtZXRlcnM6RQEtIGBvcmlnaW5gOiBNdXN0IGJlIGBTaWduZWRgIGJ5IGEgY3JlYXRvciBvZiBhIHJlZmVyZW5kdW0gb3IgYnkgYW55b25lIHRvIGNsZWFyIGGQICBtZXRhZGF0YSBvZiBhIGZpbmlzaGVkIHJlZmVyZW5kdW0uDQEtIGBpbmRleGA6ICBUaGUgaW5kZXggb2YgYSByZWZlcmVuZHVtIHRvIHNldCBvciBjbGVhciBtZXRhZGF0YSBmb3IuUQEtIGBtYXliZV9oYXNoYDogVGhlIGhhc2ggb2YgYW4gb24tY2hhaW4gc3RvcmVkIHByZWltYWdlLiBgTm9uZWAgdG8gY2xlYXIgYSBtZXRhZGF0YS4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMufQIINHBhc2VvX3J1bnRpbWUwT3JpZ2luQ2FsbGVyAAEUGHN5c3RlbQQAgQIBdGZyYW1lX3N5c3RlbTo6T3JpZ2luPFJ1bnRpbWU+AAAAHE9yaWdpbnMEAIUCAXRwYWxsZXRfY3VzdG9tX29yaWdpbnM6Ok9yaWdpbgAWAEBQYXJhY2hhaW5zT3JpZ2luBACJAgFkcGFyYWNoYWluc19vcmlnaW46Ok9yaWdpbgAyACRYY21QYWxsZXQEAJECAUhwYWxsZXRfeGNtOjpPcmlnaW4AYwAQVm9pZAQAlQIBQQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6Cl9fcHJpdmF0ZTo6Vm9pZAAEAACBAgw0ZnJhbWVfc3VwcG9ydCBkaXNwYXRjaCRSYXdPcmlnaW4EJEFjY291bnRJZAEAAQwQUm9vdAAAABhTaWduZWQEAAABJEFjY291bnRJZAABABBOb25lAAIAAIUCFDRwYXNlb19ydW50aW1lKGdvdmVybmFuY2Ucb3JpZ2luc1RwYWxsZXRfY3VzdG9tX29yaWdpbnMYT3JpZ2luAAE8MFN0YWtpbmdBZG1pbgAAACRUcmVhc3VyZXIAAQA8RmVsbG93c2hpcEFkbWluAAIAMEdlbmVyYWxBZG1pbgADADBBdWN0aW9uQWRtaW4ABAAoTGVhc2VBZG1pbgAFAExSZWZlcmVuZHVtQ2FuY2VsbGVyAAYAQFJlZmVyZW5kdW1LaWxsZXIABwAsU21hbGxUaXBwZXIACAAkQmlnVGlwcGVyAAkAMFNtYWxsU3BlbmRlcgAKADRNZWRpdW1TcGVuZGVyAAsAKEJpZ1NwZW5kZXIADABEV2hpdGVsaXN0ZWRDYWxsZXIADQA0V2lzaEZvckNoYW5nZQAOAACJAhBscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zGG9yaWdpbhhwYWxsZXQYT3JpZ2luAAEEJFBhcmFjaGFpbgQAjQIBGFBhcmFJZAAAAACNAgx0cG9sa2Fkb3RfcGFyYWNoYWluX3ByaW1pdGl2ZXMocHJpbWl0aXZlcwhJZAAABAAQAQx1MzIAAJECDChwYWxsZXRfeGNtGHBhbGxldBhPcmlnaW4AAQgMWGNtBAANAQEgTG9jYXRpb24AAAAgUmVzcG9uc2UEAA0BASBMb2NhdGlvbgABAACVAggcc3BfY29yZRBWb2lkAAEAAJkCEDRmcmFtZV9zdXBwb3J0GHRyYWl0cyBzY2hlZHVsZTBEaXNwYXRjaFRpbWUELEJsb2NrTnVtYmVyARABCAhBdAQAEAEsQmxvY2tOdW1iZXIAAAAUQWZ0ZXIEABABLEJsb2NrTnVtYmVyAAEAAJ0CBBhPcHRpb24EBFQBNAEIEE5vbmUAAAAQU29tZQQANAAAAQAAoQIMQHBhbGxldF93aGl0ZWxpc3QYcGFsbGV0EENhbGwEBFQAARA4d2hpdGVsaXN0X2NhbGwEASRjYWxsX2hhc2g0ARxUOjpIYXNoAAAAXHJlbW92ZV93aGl0ZWxpc3RlZF9jYWxsBAEkY2FsbF9oYXNoNAEcVDo6SGFzaAABAGRkaXNwYXRjaF93aGl0ZWxpc3RlZF9jYWxsDAEkY2FsbF9oYXNoNAEcVDo6SGFzaAABQGNhbGxfZW5jb2RlZF9sZW4QAQx1MzIAAUxjYWxsX3dlaWdodF93aXRuZXNzKAEYV2VpZ2h0AAIAnGRpc3BhdGNoX3doaXRlbGlzdGVkX2NhbGxfd2l0aF9wcmVpbWFnZQQBEGNhbGx1AQF8Qm94PDxUIGFzIENvbmZpZz46OlJ1bnRpbWVDYWxsPgADAAQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy6lAgxEcGFsbGV0X3BhcmFtZXRlcnMYcGFsbGV0EENhbGwEBFQAAQQ0c2V0X3BhcmFtZXRlcgQBJGtleV92YWx1ZakCAVBUOjpSdW50aW1lUGFyYW1ldGVycwAAEHRTZXQgdGhlIHZhbHVlIG9mIGEgcGFyYW1ldGVyLgBVAVRoZSBkaXNwYXRjaCBvcmlnaW4gb2YgdGhpcyBjYWxsIG11c3QgYmUgYEFkbWluT3JpZ2luYCBmb3IgdGhlIGdpdmVuIGBrZXlgLiBWYWx1ZXMgYmWIZGVsZXRlZCBieSBzZXR0aW5nIHRoZW0gdG8gYE5vbmVgLgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy6pAgg0cGFzZW9fcnVudGltZURSdW50aW1lUGFyYW1ldGVycwABBCRJbmZsYXRpb24EAK0CAZRkeW5hbWljX3BhcmFtczo6aW5mbGF0aW9uOjpQYXJhbWV0ZXJzAAAAAK0CEDRwYXNlb19ydW50aW1lOGR5bmFtaWNfcGFyYW1zJGluZmxhdGlvbihQYXJhbWV0ZXJzAAEUME1pbkluZmxhdGlvbggAsQIBME1pbkluZmxhdGlvbgAAtQIBTE9wdGlvbjxQZXJxdWludGlsbD4AAAAwTWF4SW5mbGF0aW9uCAC9AgEwTWF4SW5mbGF0aW9uAAC1AgFMT3B0aW9uPFBlcnF1aW50aWxsPgABAChJZGVhbFN0YWtlCADBAgEoSWRlYWxTdGFrZQAAtQIBTE9wdGlvbjxQZXJxdWludGlsbD4AAgAcRmFsbG9mZggAxQIBHEZhbGxvZmYAALUCAUxPcHRpb248UGVycXVpbnRpbGw+AAMAPFVzZUF1Y3Rpb25TbG90cwgAyQIBPFVzZUF1Y3Rpb25TbG90cwAAzQIBME9wdGlvbjxib29sPgAEAACxAhA0cGFzZW9fcnVudGltZThkeW5hbWljX3BhcmFtcyRpbmZsYXRpb24wTWluSW5mbGF0aW9uAAAAALUCBBhPcHRpb24EBFQBuQIBCBBOb25lAAAAEFNvbWUEALkCAAABAAC5Agw0c3BfYXJpdGhtZXRpYyhwZXJfdGhpbmdzLFBlcnF1aW50aWxsAAAEADABDHU2NAAAvQIQNHBhc2VvX3J1bnRpbWU4ZHluYW1pY19wYXJhbXMkaW5mbGF0aW9uME1heEluZmxhdGlvbgAAAADBAhA0cGFzZW9fcnVudGltZThkeW5hbWljX3BhcmFtcyRpbmZsYXRpb24oSWRlYWxTdGFrZQAAAADFAhA0cGFzZW9fcnVudGltZThkeW5hbWljX3BhcmFtcyRpbmZsYXRpb24cRmFsbG9mZgAAAADJAhA0cGFzZW9fcnVudGltZThkeW5hbWljX3BhcmFtcyRpbmZsYXRpb248VXNlQXVjdGlvblNsb3RzAAAAAM0CBBhPcHRpb24EBFQBIAEIEE5vbmUAAAAQU29tZQQAIAAAAQAA0QIQXHBvbGthZG90X3J1bnRpbWVfY29tbW9uGGNsYWltcxhwYWxsZXQQQ2FsbAQEVAABFBRjbGFpbQgBEGRlc3QAATBUOjpBY2NvdW50SWQAAUhldGhlcmV1bV9zaWduYXR1cmXVAgE4RWNkc2FTaWduYXR1cmUAAGCITWFrZSBhIGNsYWltIHRvIGNvbGxlY3QgeW91ciBET1RzLgDEVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX05vbmVfLgBQVW5zaWduZWQgVmFsaWRhdGlvbjoFAUEgY2FsbCB0byBjbGFpbSBpcyBkZWVtZWQgdmFsaWQgaWYgdGhlIHNpZ25hdHVyZSBwcm92aWRlZCBtYXRjaGVzfHRoZSBleHBlY3RlZCBzaWduZWQgbWVzc2FnZSBvZjoAaD4gRXRoZXJldW0gU2lnbmVkIE1lc3NhZ2U6lD4gKGNvbmZpZ3VyZWQgcHJlZml4IHN0cmluZykoYWRkcmVzcykApGFuZCBgYWRkcmVzc2AgbWF0Y2hlcyB0aGUgYGRlc3RgIGFjY291bnQuACxQYXJhbWV0ZXJzOtgtIGBkZXN0YDogVGhlIGRlc3RpbmF0aW9uIGFjY291bnQgdG8gcGF5b3V0IHRoZSBjbGFpbS5dAS0gYGV0aGVyZXVtX3NpZ25hdHVyZWA6IFRoZSBzaWduYXR1cmUgb2YgYW4gZXRoZXJldW0gc2lnbmVkIG1lc3NhZ2UgbWF0Y2hpbmcgdGhlIGZvcm1hdEggIGRlc2NyaWJlZCBhYm92ZS4AIDx3ZWlnaHQ+/FRoZSB3ZWlnaHQgb2YgdGhpcyBjYWxsIGlzIGludmFyaWFudCBvdmVyIHRoZSBpbnB1dCBwYXJhbWV0ZXJzLuBXZWlnaHQgaW5jbHVkZXMgbG9naWMgdG8gdmFsaWRhdGUgdW5zaWduZWQgYGNsYWltYCBjYWxsLgBYVG90YWwgQ29tcGxleGl0eTogTygxKSQ8L3dlaWdodD4obWludF9jbGFpbRABDHdob90CATxFdGhlcmV1bUFkZHJlc3MAARR2YWx1ZRgBMEJhbGFuY2VPZjxUPgABQHZlc3Rpbmdfc2NoZWR1bGXhAgHcT3B0aW9uPChCYWxhbmNlT2Y8VD4sIEJhbGFuY2VPZjxUPiwgQmxvY2tOdW1iZXJGb3I8VD4pPgABJHN0YXRlbWVudOkCAVRPcHRpb248U3RhdGVtZW50S2luZD4AATyETWludCBhIG5ldyBjbGFpbSB0byBjb2xsZWN0IERPVHMuAMRUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfUm9vdF8uACxQYXJhbWV0ZXJzOvAtIGB3aG9gOiBUaGUgRXRoZXJldW0gYWRkcmVzcyBhbGxvd2VkIHRvIGNvbGxlY3QgdGhpcyBjbGFpbS7MLSBgdmFsdWVgOiBUaGUgbnVtYmVyIG9mIERPVHMgdGhhdCB3aWxsIGJlIGNsYWltZWQuCQEtIGB2ZXN0aW5nX3NjaGVkdWxlYDogQW4gb3B0aW9uYWwgdmVzdGluZyBzY2hlZHVsZSBmb3IgdGhlc2UgRE9Ucy4AIDx3ZWlnaHQ+/FRoZSB3ZWlnaHQgb2YgdGhpcyBjYWxsIGlzIGludmFyaWFudCBvdmVyIHRoZSBpbnB1dCBwYXJhbWV0ZXJzLh0BV2UgYXNzdW1lIHdvcnN0IGNhc2UgdGhhdCBib3RoIHZlc3RpbmcgYW5kIHN0YXRlbWVudCBpcyBiZWluZyBpbnNlcnRlZC4AWFRvdGFsIENvbXBsZXhpdHk6IE8oMSkkPC93ZWlnaHQ+MGNsYWltX2F0dGVzdAwBEGRlc3QAATBUOjpBY2NvdW50SWQAAUhldGhlcmV1bV9zaWduYXR1cmXVAgE4RWNkc2FTaWduYXR1cmUAASRzdGF0ZW1lbnQ4ARxWZWM8dTg+AAJs5E1ha2UgYSBjbGFpbSB0byBjb2xsZWN0IHlvdXIgRE9UcyBieSBzaWduaW5nIGEgc3RhdGVtZW50LgDEVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX05vbmVfLgBQVW5zaWduZWQgVmFsaWRhdGlvbjopAUEgY2FsbCB0byBgY2xhaW1fYXR0ZXN0YCBpcyBkZWVtZWQgdmFsaWQgaWYgdGhlIHNpZ25hdHVyZSBwcm92aWRlZCBtYXRjaGVzfHRoZSBleHBlY3RlZCBzaWduZWQgbWVzc2FnZSBvZjoAaD4gRXRoZXJldW0gU2lnbmVkIE1lc3NhZ2U6wD4gKGNvbmZpZ3VyZWQgcHJlZml4IHN0cmluZykoYWRkcmVzcykoc3RhdGVtZW50KQBJAWFuZCBgYWRkcmVzc2AgbWF0Y2hlcyB0aGUgYGRlc3RgIGFjY291bnQ7IHRoZSBgc3RhdGVtZW50YCBtdXN0IG1hdGNoIHRoYXQgd2hpY2ggaXPAZXhwZWN0ZWQgYWNjb3JkaW5nIHRvIHlvdXIgcHVyY2hhc2UgYXJyYW5nZW1lbnQuACxQYXJhbWV0ZXJzOtgtIGBkZXN0YDogVGhlIGRlc3RpbmF0aW9uIGFjY291bnQgdG8gcGF5b3V0IHRoZSBjbGFpbS5dAS0gYGV0aGVyZXVtX3NpZ25hdHVyZWA6IFRoZSBzaWduYXR1cmUgb2YgYW4gZXRoZXJldW0gc2lnbmVkIG1lc3NhZ2UgbWF0Y2hpbmcgdGhlIGZvcm1hdEggIGRlc2NyaWJlZCBhYm92ZS45AS0gYHN0YXRlbWVudGA6IFRoZSBpZGVudGl0eSBvZiB0aGUgc3RhdGVtZW50IHdoaWNoIGlzIGJlaW5nIGF0dGVzdGVkIHRvIGluIHRoZTAgIHNpZ25hdHVyZS4AIDx3ZWlnaHQ+/FRoZSB3ZWlnaHQgb2YgdGhpcyBjYWxsIGlzIGludmFyaWFudCBvdmVyIHRoZSBpbnB1dCBwYXJhbWV0ZXJzLvxXZWlnaHQgaW5jbHVkZXMgbG9naWMgdG8gdmFsaWRhdGUgdW5zaWduZWQgYGNsYWltX2F0dGVzdGAgY2FsbC4AWFRvdGFsIENvbXBsZXhpdHk6IE8oMSkkPC93ZWlnaHQ+GGF0dGVzdAQBJHN0YXRlbWVudDgBHFZlYzx1OD4AA0z0QXR0ZXN0IHRvIGEgc3RhdGVtZW50LCBuZWVkZWQgdG8gZmluYWxpemUgdGhlIGNsYWltcyBwcm9jZXNzLgAZAVdBUk5JTkc6IEluc2VjdXJlIHVubGVzcyB5b3VyIGNoYWluIGluY2x1ZGVzIGBQcmV2YWxpZGF0ZUF0dGVzdHNgIGFzIGFIYFNpZ25lZEV4dGVuc2lvbmAuAFBVbnNpZ25lZCBWYWxpZGF0aW9uOikBQSBjYWxsIHRvIGF0dGVzdCBpcyBkZWVtZWQgdmFsaWQgaWYgdGhlIHNlbmRlciBoYXMgYSBgUHJlY2xhaW1gIHJlZ2lzdGVyZWT0YW5kIHByb3ZpZGVzIGEgYHN0YXRlbWVudGAgd2hpY2ggaXMgZXhwZWN0ZWQgZm9yIHRoZSBhY2NvdW50LgAsUGFyYW1ldGVyczo5AS0gYHN0YXRlbWVudGA6IFRoZSBpZGVudGl0eSBvZiB0aGUgc3RhdGVtZW50IHdoaWNoIGlzIGJlaW5nIGF0dGVzdGVkIHRvIGluIHRoZTAgIHNpZ25hdHVyZS4AIDx3ZWlnaHQ+/FRoZSB3ZWlnaHQgb2YgdGhpcyBjYWxsIGlzIGludmFyaWFudCBvdmVyIHRoZSBpbnB1dCBwYXJhbWV0ZXJzLvBXZWlnaHQgaW5jbHVkZXMgbG9naWMgdG8gZG8gcHJlLXZhbGlkYXRpb24gb24gYGF0dGVzdGAgY2FsbC4AWFRvdGFsIENvbXBsZXhpdHk6IE8oMSkkPC93ZWlnaHQ+KG1vdmVfY2xhaW0MAQxvbGTdAgE8RXRoZXJldW1BZGRyZXNzAAEMbmV33QIBPEV0aGVyZXVtQWRkcmVzcwABOG1heWJlX3ByZWNsYWlt/QEBUE9wdGlvbjxUOjpBY2NvdW50SWQ+AAQABA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLtUCDFxwb2xrYWRvdF9ydW50aW1lX2NvbW1vbhhjbGFpbXM4RWNkc2FTaWduYXR1cmUAAAQA2QIBIFt1ODsgNjVdAADZAgAAA0EAAAAIAN0CDFxwb2xrYWRvdF9ydW50aW1lX2NvbW1vbhhjbGFpbXM8RXRoZXJldW1BZGRyZXNzAAAEAPgBIFt1ODsgMjBdAADhAgQYT3B0aW9uBARUAeUCAQgQTm9uZQAAABBTb21lBADlAgAAAQAA5QIAAAQMGBgQAOkCBBhPcHRpb24EBFQB7QIBCBBOb25lAAAAEFNvbWUEAO0CAAABAADtAgxccG9sa2Fkb3RfcnVudGltZV9jb21tb24YY2xhaW1zNFN0YXRlbWVudEtpbmQAAQgcUmVndWxhcgAAABBTYWZ0AAEAAPECDDhwYWxsZXRfdmVzdGluZxhwYWxsZXQQQ2FsbAQEVAABGBB2ZXN0AAAkuFVubG9jayBhbnkgdmVzdGVkIGZ1bmRzIG9mIHRoZSBzZW5kZXIgYWNjb3VudC4AXQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXyBhbmQgdGhlIHNlbmRlciBtdXN0IGhhdmUgZnVuZHMgc3RpbGxkbG9ja2VkIHVuZGVyIHRoaXMgcGFsbGV0LgDQRW1pdHMgZWl0aGVyIGBWZXN0aW5nQ29tcGxldGVkYCBvciBgVmVzdGluZ1VwZGF0ZWRgLgA0IyMgQ29tcGxleGl0eSQtIGBPKDEpYC4odmVzdF9vdGhlcgQBGHRhcmdldMUBAVBBY2NvdW50SWRMb29rdXBPZjxUPgABLLhVbmxvY2sgYW55IHZlc3RlZCBmdW5kcyBvZiBhIGB0YXJnZXRgIGFjY291bnQuAMxUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXy4AUQEtIGB0YXJnZXRgOiBUaGUgYWNjb3VudCB3aG9zZSB2ZXN0ZWQgZnVuZHMgc2hvdWxkIGJlIHVubG9ja2VkLiBNdXN0IGhhdmUgZnVuZHMgc3RpbGxkbG9ja2VkIHVuZGVyIHRoaXMgcGFsbGV0LgDQRW1pdHMgZWl0aGVyIGBWZXN0aW5nQ29tcGxldGVkYCBvciBgVmVzdGluZ1VwZGF0ZWRgLgA0IyMgQ29tcGxleGl0eSQtIGBPKDEpYC48dmVzdGVkX3RyYW5zZmVyCAEYdGFyZ2V0xQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEgc2NoZWR1bGX1AgGwVmVzdGluZ0luZm88QmFsYW5jZU9mPFQ+LCBCbG9ja051bWJlckZvcjxUPj4AAjRkQ3JlYXRlIGEgdmVzdGVkIHRyYW5zZmVyLgDMVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uAMwtIGB0YXJnZXRgOiBUaGUgYWNjb3VudCByZWNlaXZpbmcgdGhlIHZlc3RlZCBmdW5kcy7wLSBgc2NoZWR1bGVgOiBUaGUgdmVzdGluZyBzY2hlZHVsZSBhdHRhY2hlZCB0byB0aGUgdHJhbnNmZXIuAFxFbWl0cyBgVmVzdGluZ0NyZWF0ZWRgLgD8Tk9URTogVGhpcyB3aWxsIHVubG9jayBhbGwgc2NoZWR1bGVzIHRocm91Z2ggdGhlIGN1cnJlbnQgYmxvY2suADQjIyBDb21wbGV4aXR5JC0gYE8oMSlgLlRmb3JjZV92ZXN0ZWRfdHJhbnNmZXIMARhzb3VyY2XFAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AARh0YXJnZXTFAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AASBzY2hlZHVsZfUCAbBWZXN0aW5nSW5mbzxCYWxhbmNlT2Y8VD4sIEJsb2NrTnVtYmVyRm9yPFQ+PgADOGBGb3JjZSBhIHZlc3RlZCB0cmFuc2Zlci4AxFRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9Sb290Xy4A6C0gYHNvdXJjZWA6IFRoZSBhY2NvdW50IHdob3NlIGZ1bmRzIHNob3VsZCBiZSB0cmFuc2ZlcnJlZC4RAS0gYHRhcmdldGA6IFRoZSBhY2NvdW50IHRoYXQgc2hvdWxkIGJlIHRyYW5zZmVycmVkIHRoZSB2ZXN0ZWQgZnVuZHMu8C0gYHNjaGVkdWxlYDogVGhlIHZlc3Rpbmcgc2NoZWR1bGUgYXR0YWNoZWQgdG8gdGhlIHRyYW5zZmVyLgBcRW1pdHMgYFZlc3RpbmdDcmVhdGVkYC4A/E5PVEU6IFRoaXMgd2lsbCB1bmxvY2sgYWxsIHNjaGVkdWxlcyB0aHJvdWdoIHRoZSBjdXJyZW50IGJsb2NrLgA0IyMgQ29tcGxleGl0eSQtIGBPKDEpYC48bWVyZ2Vfc2NoZWR1bGVzCAE8c2NoZWR1bGUxX2luZGV4EAEMdTMyAAE8c2NoZWR1bGUyX2luZGV4EAEMdTMyAARUXQFNZXJnZSB0d28gdmVzdGluZyBzY2hlZHVsZXMgdG9nZXRoZXIsIGNyZWF0aW5nIGEgbmV3IHZlc3Rpbmcgc2NoZWR1bGUgdGhhdCB1bmxvY2tzIG92ZXJVAXRoZSBoaWdoZXN0IHBvc3NpYmxlIHN0YXJ0IGFuZCBlbmQgYmxvY2tzLiBJZiBib3RoIHNjaGVkdWxlcyBoYXZlIGFscmVhZHkgc3RhcnRlZCB0aGVZAWN1cnJlbnQgYmxvY2sgd2lsbCBiZSB1c2VkIGFzIHRoZSBzY2hlZHVsZSBzdGFydDsgd2l0aCB0aGUgY2F2ZWF0IHRoYXQgaWYgb25lIHNjaGVkdWxlXQFpcyBmaW5pc2hlZCBieSB0aGUgY3VycmVudCBibG9jaywgdGhlIG90aGVyIHdpbGwgYmUgdHJlYXRlZCBhcyB0aGUgbmV3IG1lcmdlZCBzY2hlZHVsZSwsdW5tb2RpZmllZC4A+E5PVEU6IElmIGBzY2hlZHVsZTFfaW5kZXggPT0gc2NoZWR1bGUyX2luZGV4YCB0aGlzIGlzIGEgbm8tb3AuQQFOT1RFOiBUaGlzIHdpbGwgdW5sb2NrIGFsbCBzY2hlZHVsZXMgdGhyb3VnaCB0aGUgY3VycmVudCBibG9jayBwcmlvciB0byBtZXJnaW5nLmEBTk9URTogSWYgYm90aCBzY2hlZHVsZXMgaGF2ZSBlbmRlZCBieSB0aGUgY3VycmVudCBibG9jaywgbm8gbmV3IHNjaGVkdWxlIHdpbGwgYmUgY3JlYXRlZGRhbmQgYm90aCB3aWxsIGJlIHJlbW92ZWQuAGxNZXJnZWQgc2NoZWR1bGUgYXR0cmlidXRlczo1AS0gYHN0YXJ0aW5nX2Jsb2NrYDogYE1BWChzY2hlZHVsZTEuc3RhcnRpbmdfYmxvY2ssIHNjaGVkdWxlZDIuc3RhcnRpbmdfYmxvY2ssSCAgY3VycmVudF9ibG9jaylgLiEBLSBgZW5kaW5nX2Jsb2NrYDogYE1BWChzY2hlZHVsZTEuZW5kaW5nX2Jsb2NrLCBzY2hlZHVsZTIuZW5kaW5nX2Jsb2NrKWAuWQEtIGBsb2NrZWRgOiBgc2NoZWR1bGUxLmxvY2tlZF9hdChjdXJyZW50X2Jsb2NrKSArIHNjaGVkdWxlMi5sb2NrZWRfYXQoY3VycmVudF9ibG9jaylgLgDMVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uAOgtIGBzY2hlZHVsZTFfaW5kZXhgOiBpbmRleCBvZiB0aGUgZmlyc3Qgc2NoZWR1bGUgdG8gbWVyZ2Uu7C0gYHNjaGVkdWxlMl9pbmRleGA6IGluZGV4IG9mIHRoZSBzZWNvbmQgc2NoZWR1bGUgdG8gbWVyZ2UudGZvcmNlX3JlbW92ZV92ZXN0aW5nX3NjaGVkdWxlCAEYdGFyZ2V0xQEBjDxUOjpMb29rdXAgYXMgU3RhdGljTG9va3VwPjo6U291cmNlAAE4c2NoZWR1bGVfaW5kZXgQAQx1MzIABRh8Rm9yY2UgcmVtb3ZlIGEgdmVzdGluZyBzY2hlZHVsZQDEVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1Jvb3RfLgDILSBgdGFyZ2V0YDogQW4gYWNjb3VudCB0aGF0IGhhcyBhIHZlc3Rpbmcgc2NoZWR1bGUVAS0gYHNjaGVkdWxlX2luZGV4YDogVGhlIHZlc3Rpbmcgc2NoZWR1bGUgaW5kZXggdGhhdCBzaG91bGQgYmUgcmVtb3ZlZAQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy71Agw4cGFsbGV0X3Zlc3RpbmcwdmVzdGluZ19pbmZvLFZlc3RpbmdJbmZvCBxCYWxhbmNlARgsQmxvY2tOdW1iZXIBEAAMARhsb2NrZWQYARxCYWxhbmNlAAEkcGVyX2Jsb2NrGAEcQmFsYW5jZQABOHN0YXJ0aW5nX2Jsb2NrEAEsQmxvY2tOdW1iZXIAAPkCDDhwYWxsZXRfdXRpbGl0eRhwYWxsZXQQQ2FsbAQEVAABGBRiYXRjaAQBFGNhbGxz/QIBfFZlYzw8VCBhcyBDb25maWc+OjpSdW50aW1lQ2FsbD4AAEh8U2VuZCBhIGJhdGNoIG9mIGRpc3BhdGNoIGNhbGxzLgCwTWF5IGJlIGNhbGxlZCBmcm9tIGFueSBvcmlnaW4gZXhjZXB0IGBOb25lYC4AXQEtIGBjYWxsc2A6IFRoZSBjYWxscyB0byBiZSBkaXNwYXRjaGVkIGZyb20gdGhlIHNhbWUgb3JpZ2luLiBUaGUgbnVtYmVyIG9mIGNhbGwgbXVzdCBub3Q5ASAgZXhjZWVkIHRoZSBjb25zdGFudDogYGJhdGNoZWRfY2FsbHNfbGltaXRgIChhdmFpbGFibGUgaW4gY29uc3RhbnQgbWV0YWRhdGEpLgBVAUlmIG9yaWdpbiBpcyByb290IHRoZW4gdGhlIGNhbGxzIGFyZSBkaXNwYXRjaGVkIHdpdGhvdXQgY2hlY2tpbmcgb3JpZ2luIGZpbHRlci4gKFRoaXPsaW5jbHVkZXMgYnlwYXNzaW5nIGBmcmFtZV9zeXN0ZW06OkNvbmZpZzo6QmFzZUNhbGxGaWx0ZXJgKS4ANCMjIENvbXBsZXhpdHnQLSBPKEMpIHdoZXJlIEMgaXMgdGhlIG51bWJlciBvZiBjYWxscyB0byBiZSBiYXRjaGVkLgBVAVRoaXMgd2lsbCByZXR1cm4gYE9rYCBpbiBhbGwgY2lyY3Vtc3RhbmNlcy4gVG8gZGV0ZXJtaW5lIHRoZSBzdWNjZXNzIG9mIHRoZSBiYXRjaCwgYW4xAWV2ZW50IGlzIGRlcG9zaXRlZC4gSWYgYSBjYWxsIGZhaWxlZCBhbmQgdGhlIGJhdGNoIHdhcyBpbnRlcnJ1cHRlZCwgdGhlbiB0aGVVAWBCYXRjaEludGVycnVwdGVkYCBldmVudCBpcyBkZXBvc2l0ZWQsIGFsb25nIHdpdGggdGhlIG51bWJlciBvZiBzdWNjZXNzZnVsIGNhbGxzIG1hZGVNAWFuZCB0aGUgZXJyb3Igb2YgdGhlIGZhaWxlZCBjYWxsLiBJZiBhbGwgd2VyZSBzdWNjZXNzZnVsLCB0aGVuIHRoZSBgQmF0Y2hDb21wbGV0ZWRgTGV2ZW50IGlzIGRlcG9zaXRlZC40YXNfZGVyaXZhdGl2ZQgBFGluZGV4bQEBDHUxNgABEGNhbGx1AQF8Qm94PDxUIGFzIENvbmZpZz46OlJ1bnRpbWVDYWxsPgABNNxTZW5kIGEgY2FsbCB0aHJvdWdoIGFuIGluZGV4ZWQgcHNldWRvbnltIG9mIHRoZSBzZW5kZXIuAFUBRmlsdGVyIGZyb20gb3JpZ2luIGFyZSBwYXNzZWQgYWxvbmcuIFRoZSBjYWxsIHdpbGwgYmUgZGlzcGF0Y2hlZCB3aXRoIGFuIG9yaWdpbiB3aGljaLx1c2UgdGhlIHNhbWUgZmlsdGVyIGFzIHRoZSBvcmlnaW4gb2YgdGhpcyBjYWxsLgBFAU5PVEU6IElmIHlvdSBuZWVkIHRvIGVuc3VyZSB0aGF0IGFueSBhY2NvdW50LWJhc2VkIGZpbHRlcmluZyBpcyBub3QgaG9ub3JlZCAoaS5lLmEBYmVjYXVzZSB5b3UgZXhwZWN0IGBwcm94eWAgdG8gaGF2ZSBiZWVuIHVzZWQgcHJpb3IgaW4gdGhlIGNhbGwgc3RhY2sgYW5kIHlvdSBkbyBub3Qgd2FudFEBdGhlIGNhbGwgcmVzdHJpY3Rpb25zIHRvIGFwcGx5IHRvIGFueSBzdWItYWNjb3VudHMpLCB0aGVuIHVzZSBgYXNfbXVsdGlfdGhyZXNob2xkXzFgfGluIHRoZSBNdWx0aXNpZyBwYWxsZXQgaW5zdGVhZC4A9E5PVEU6IFByaW9yIHRvIHZlcnNpb24gKjEyLCB0aGlzIHdhcyBjYWxsZWQgYGFzX2xpbWl0ZWRfc3ViYC4AzFRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfLiRiYXRjaF9hbGwEARRjYWxsc/0CAXxWZWM8PFQgYXMgQ29uZmlnPjo6UnVudGltZUNhbGw+AAI07FNlbmQgYSBiYXRjaCBvZiBkaXNwYXRjaCBjYWxscyBhbmQgYXRvbWljYWxseSBleGVjdXRlIHRoZW0uIQFUaGUgd2hvbGUgdHJhbnNhY3Rpb24gd2lsbCByb2xsYmFjayBhbmQgZmFpbCBpZiBhbnkgb2YgdGhlIGNhbGxzIGZhaWxlZC4AsE1heSBiZSBjYWxsZWQgZnJvbSBhbnkgb3JpZ2luIGV4Y2VwdCBgTm9uZWAuAF0BLSBgY2FsbHNgOiBUaGUgY2FsbHMgdG8gYmUgZGlzcGF0Y2hlZCBmcm9tIHRoZSBzYW1lIG9yaWdpbi4gVGhlIG51bWJlciBvZiBjYWxsIG11c3Qgbm90OQEgIGV4Y2VlZCB0aGUgY29uc3RhbnQ6IGBiYXRjaGVkX2NhbGxzX2xpbWl0YCAoYXZhaWxhYmxlIGluIGNvbnN0YW50IG1ldGFkYXRhKS4AVQFJZiBvcmlnaW4gaXMgcm9vdCB0aGVuIHRoZSBjYWxscyBhcmUgZGlzcGF0Y2hlZCB3aXRob3V0IGNoZWNraW5nIG9yaWdpbiBmaWx0ZXIuIChUaGlz7GluY2x1ZGVzIGJ5cGFzc2luZyBgZnJhbWVfc3lzdGVtOjpDb25maWc6OkJhc2VDYWxsRmlsdGVyYCkuADQjIyBDb21wbGV4aXR50C0gTyhDKSB3aGVyZSBDIGlzIHRoZSBudW1iZXIgb2YgY2FsbHMgdG8gYmUgYmF0Y2hlZC4sZGlzcGF0Y2hfYXMIASRhc19vcmlnaW59AgFUQm94PFQ6OlBhbGxldHNPcmlnaW4+AAEQY2FsbHUBAXxCb3g8PFQgYXMgQ29uZmlnPjo6UnVudGltZUNhbGw+AAMYyERpc3BhdGNoZXMgYSBmdW5jdGlvbiBjYWxsIHdpdGggYSBwcm92aWRlZCBvcmlnaW4uAMRUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfUm9vdF8uADQjIyBDb21wbGV4aXR5HC0gTygxKS4sZm9yY2VfYmF0Y2gEARRjYWxsc/0CAXxWZWM8PFQgYXMgQ29uZmlnPjo6UnVudGltZUNhbGw+AAQ0fFNlbmQgYSBiYXRjaCBvZiBkaXNwYXRjaCBjYWxscy7UVW5saWtlIGBiYXRjaGAsIGl0IGFsbG93cyBlcnJvcnMgYW5kIHdvbid0IGludGVycnVwdC4AsE1heSBiZSBjYWxsZWQgZnJvbSBhbnkgb3JpZ2luIGV4Y2VwdCBgTm9uZWAuAF0BLSBgY2FsbHNgOiBUaGUgY2FsbHMgdG8gYmUgZGlzcGF0Y2hlZCBmcm9tIHRoZSBzYW1lIG9yaWdpbi4gVGhlIG51bWJlciBvZiBjYWxsIG11c3Qgbm90OQEgIGV4Y2VlZCB0aGUgY29uc3RhbnQ6IGBiYXRjaGVkX2NhbGxzX2xpbWl0YCAoYXZhaWxhYmxlIGluIGNvbnN0YW50IG1ldGFkYXRhKS4ATQFJZiBvcmlnaW4gaXMgcm9vdCB0aGVuIHRoZSBjYWxscyBhcmUgZGlzcGF0Y2ggd2l0aG91dCBjaGVja2luZyBvcmlnaW4gZmlsdGVyLiAoVGhpc+xpbmNsdWRlcyBieXBhc3NpbmcgYGZyYW1lX3N5c3RlbTo6Q29uZmlnOjpCYXNlQ2FsbEZpbHRlcmApLgA0IyMgQ29tcGxleGl0edAtIE8oQykgd2hlcmUgQyBpcyB0aGUgbnVtYmVyIG9mIGNhbGxzIHRvIGJlIGJhdGNoZWQuLHdpdGhfd2VpZ2h0CAEQY2FsbHUBAXxCb3g8PFQgYXMgQ29uZmlnPjo6UnVudGltZUNhbGw+AAEYd2VpZ2h0KAEYV2VpZ2h0AAUYxERpc3BhdGNoIGEgZnVuY3Rpb24gY2FsbCB3aXRoIGEgc3BlY2lmaWVkIHdlaWdodC4ALQFUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IGNoZWNrIHRoZSB3ZWlnaHQgb2YgdGhlIGNhbGwsIGFuZCBpbnN0ZWFkIGFsbG93cyB0aGW4Um9vdCBvcmlnaW4gdG8gc3BlY2lmeSB0aGUgd2VpZ2h0IG9mIHRoZSBjYWxsLgDEVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1Jvb3RfLgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy79AgAAAnUBAAEDDDBwYWxsZXRfcHJveHkYcGFsbGV0EENhbGwEBFQAASgUcHJveHkMARByZWFsxQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAFAZm9yY2VfcHJveHlfdHlwZQUDAVBPcHRpb248VDo6UHJveHlUeXBlPgABEGNhbGx1AQF8Qm94PDxUIGFzIENvbmZpZz46OlJ1bnRpbWVDYWxsPgAAJE0BRGlzcGF0Y2ggdGhlIGdpdmVuIGBjYWxsYCBmcm9tIGFuIGFjY291bnQgdGhhdCB0aGUgc2VuZGVyIGlzIGF1dGhvcmlzZWQgZm9yIHRocm91Z2gwYGFkZF9wcm94eWAuAMxUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXy4ALFBhcmFtZXRlcnM6DQEtIGByZWFsYDogVGhlIGFjY291bnQgdGhhdCB0aGUgcHJveHkgd2lsbCBtYWtlIGEgY2FsbCBvbiBiZWhhbGYgb2YuYQEtIGBmb3JjZV9wcm94eV90eXBlYDogU3BlY2lmeSB0aGUgZXhhY3QgcHJveHkgdHlwZSB0byBiZSB1c2VkIGFuZCBjaGVja2VkIGZvciB0aGlzIGNhbGwu0C0gYGNhbGxgOiBUaGUgY2FsbCB0byBiZSBtYWRlIGJ5IHRoZSBgcmVhbGAgYWNjb3VudC4kYWRkX3Byb3h5DAEgZGVsZWdhdGXFAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AAShwcm94eV90eXBlCQMBMFQ6OlByb3h5VHlwZQABFGRlbGF5EAFEQmxvY2tOdW1iZXJGb3I8VD4AASRFAVJlZ2lzdGVyIGEgcHJveHkgYWNjb3VudCBmb3IgdGhlIHNlbmRlciB0aGF0IGlzIGFibGUgdG8gbWFrZSBjYWxscyBvbiBpdHMgYmVoYWxmLgDMVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uACxQYXJhbWV0ZXJzOhEBLSBgcHJveHlgOiBUaGUgYWNjb3VudCB0aGF0IHRoZSBgY2FsbGVyYCB3b3VsZCBsaWtlIHRvIG1ha2UgYSBwcm94eS78LSBgcHJveHlfdHlwZWA6IFRoZSBwZXJtaXNzaW9ucyBhbGxvd2VkIGZvciB0aGlzIHByb3h5IGFjY291bnQuTQEtIGBkZWxheWA6IFRoZSBhbm5vdW5jZW1lbnQgcGVyaW9kIHJlcXVpcmVkIG9mIHRoZSBpbml0aWFsIHByb3h5LiBXaWxsIGdlbmVyYWxseSBiZRR6ZXJvLjByZW1vdmVfcHJveHkMASBkZWxlZ2F0ZcUBAVBBY2NvdW50SWRMb29rdXBPZjxUPgABKHByb3h5X3R5cGUJAwEwVDo6UHJveHlUeXBlAAEUZGVsYXkQAURCbG9ja051bWJlckZvcjxUPgACHKhVbnJlZ2lzdGVyIGEgcHJveHkgYWNjb3VudCBmb3IgdGhlIHNlbmRlci4AzFRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfLgAsUGFyYW1ldGVyczolAS0gYHByb3h5YDogVGhlIGFjY291bnQgdGhhdCB0aGUgYGNhbGxlcmAgd291bGQgbGlrZSB0byByZW1vdmUgYXMgYSBwcm94eS5BAS0gYHByb3h5X3R5cGVgOiBUaGUgcGVybWlzc2lvbnMgY3VycmVudGx5IGVuYWJsZWQgZm9yIHRoZSByZW1vdmVkIHByb3h5IGFjY291bnQuOHJlbW92ZV9wcm94aWVzAAMYtFVucmVnaXN0ZXIgYWxsIHByb3h5IGFjY291bnRzIGZvciB0aGUgc2VuZGVyLgDMVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uAEEBV0FSTklORzogVGhpcyBtYXkgYmUgY2FsbGVkIG9uIGFjY291bnRzIGNyZWF0ZWQgYnkgYHB1cmVgLCBob3dldmVyIGlmIGRvbmUsIHRoZW5ZAXRoZSB1bnJlc2VydmVkIGZlZXMgd2lsbCBiZSBpbmFjY2Vzc2libGUuICoqQWxsIGFjY2VzcyB0byB0aGlzIGFjY291bnQgd2lsbCBiZSBsb3N0LioqLGNyZWF0ZV9wdXJlDAEocHJveHlfdHlwZQkDATBUOjpQcm94eVR5cGUAARRkZWxheRABREJsb2NrTnVtYmVyRm9yPFQ+AAEUaW5kZXhtAQEMdTE2AARIOQFTcGF3biBhIGZyZXNoIG5ldyBhY2NvdW50IHRoYXQgaXMgZ3VhcmFudGVlZCB0byBiZSBvdGhlcndpc2UgaW5hY2Nlc3NpYmxlLCBhbmT8aW5pdGlhbGl6ZSBpdCB3aXRoIGEgcHJveHkgb2YgYHByb3h5X3R5cGVgIGZvciBgb3JpZ2luYCBzZW5kZXIuAGxSZXF1aXJlcyBhIGBTaWduZWRgIG9yaWdpbi4AUQEtIGBwcm94eV90eXBlYDogVGhlIHR5cGUgb2YgdGhlIHByb3h5IHRoYXQgdGhlIHNlbmRlciB3aWxsIGJlIHJlZ2lzdGVyZWQgYXMgb3ZlciB0aGVNAW5ldyBhY2NvdW50LiBUaGlzIHdpbGwgYWxtb3N0IGFsd2F5cyBiZSB0aGUgbW9zdCBwZXJtaXNzaXZlIGBQcm94eVR5cGVgIHBvc3NpYmxlIHRveGFsbG93IGZvciBtYXhpbXVtIGZsZXhpYmlsaXR5LlEBLSBgaW5kZXhgOiBBIGRpc2FtYmlndWF0aW9uIGluZGV4LCBpbiBjYXNlIHRoaXMgaXMgY2FsbGVkIG11bHRpcGxlIHRpbWVzIGluIHRoZSBzYW1lXQF0cmFuc2FjdGlvbiAoZS5nLiB3aXRoIGB1dGlsaXR5OjpiYXRjaGApLiBVbmxlc3MgeW91J3JlIHVzaW5nIGBiYXRjaGAgeW91IHByb2JhYmx5IGp1c3RAd2FudCB0byB1c2UgYDBgLk0BLSBgZGVsYXlgOiBUaGUgYW5ub3VuY2VtZW50IHBlcmlvZCByZXF1aXJlZCBvZiB0aGUgaW5pdGlhbCBwcm94eS4gV2lsbCBnZW5lcmFsbHkgYmUUemVyby4AUQFGYWlscyB3aXRoIGBEdXBsaWNhdGVgIGlmIHRoaXMgaGFzIGFscmVhZHkgYmVlbiBjYWxsZWQgaW4gdGhpcyB0cmFuc2FjdGlvbiwgZnJvbSB0aGWYc2FtZSBzZW5kZXIsIHdpdGggdGhlIHNhbWUgcGFyYW1ldGVycy4A5EZhaWxzIGlmIHRoZXJlIGFyZSBpbnN1ZmZpY2llbnQgZnVuZHMgdG8gcGF5IGZvciBkZXBvc2l0LiRraWxsX3B1cmUUARxzcGF3bmVyxQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEocHJveHlfdHlwZQkDATBUOjpQcm94eVR5cGUAARRpbmRleG0BAQx1MTYAARhoZWlnaHTsAURCbG9ja051bWJlckZvcjxUPgABJGV4dF9pbmRleOwBDHUzMgAFQKBSZW1vdmVzIGEgcHJldmlvdXNseSBzcGF3bmVkIHB1cmUgcHJveHkuAEkBV0FSTklORzogKipBbGwgYWNjZXNzIHRvIHRoaXMgYWNjb3VudCB3aWxsIGJlIGxvc3QuKiogQW55IGZ1bmRzIGhlbGQgaW4gaXQgd2lsbCBiZTRpbmFjY2Vzc2libGUuAFkBUmVxdWlyZXMgYSBgU2lnbmVkYCBvcmlnaW4sIGFuZCB0aGUgc2VuZGVyIGFjY291bnQgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCBieSBhIGNhbGwgdG+UYHB1cmVgIHdpdGggY29ycmVzcG9uZGluZyBwYXJhbWV0ZXJzLgA5AS0gYHNwYXduZXJgOiBUaGUgYWNjb3VudCB0aGF0IG9yaWdpbmFsbHkgY2FsbGVkIGBwdXJlYCB0byBjcmVhdGUgdGhpcyBhY2NvdW50LjkBLSBgaW5kZXhgOiBUaGUgZGlzYW1iaWd1YXRpb24gaW5kZXggb3JpZ2luYWxseSBwYXNzZWQgdG8gYHB1cmVgLiBQcm9iYWJseSBgMGAu7C0gYHByb3h5X3R5cGVgOiBUaGUgcHJveHkgdHlwZSBvcmlnaW5hbGx5IHBhc3NlZCB0byBgcHVyZWAuKQEtIGBoZWlnaHRgOiBUaGUgaGVpZ2h0IG9mIHRoZSBjaGFpbiB3aGVuIHRoZSBjYWxsIHRvIGBwdXJlYCB3YXMgcHJvY2Vzc2VkLjUBLSBgZXh0X2luZGV4YDogVGhlIGV4dHJpbnNpYyBpbmRleCBpbiB3aGljaCB0aGUgY2FsbCB0byBgcHVyZWAgd2FzIHByb2Nlc3NlZC4ANQFGYWlscyB3aXRoIGBOb1Blcm1pc3Npb25gIGluIGNhc2UgdGhlIGNhbGxlciBpcyBub3QgYSBwcmV2aW91c2x5IGNyZWF0ZWQgcHVyZdxhY2NvdW50IHdob3NlIGBwdXJlYCBjYWxsIGhhcyBjb3JyZXNwb25kaW5nIHBhcmFtZXRlcnMuIGFubm91bmNlCAEQcmVhbMUBAVBBY2NvdW50SWRMb29rdXBPZjxUPgABJGNhbGxfaGFzaDQBNENhbGxIYXNoT2Y8VD4ABjwFAVB1Ymxpc2ggdGhlIGhhc2ggb2YgYSBwcm94eS1jYWxsIHRoYXQgd2lsbCBiZSBtYWRlIGluIHRoZSBmdXR1cmUuAF0BVGhpcyBtdXN0IGJlIGNhbGxlZCBzb21lIG51bWJlciBvZiBibG9ja3MgYmVmb3JlIHRoZSBjb3JyZXNwb25kaW5nIGBwcm94eWAgaXMgYXR0ZW1wdGVkJQFpZiB0aGUgZGVsYXkgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm94eSByZWxhdGlvbnNoaXAgaXMgZ3JlYXRlciB0aGFuIHplcm8uABEBTm8gbW9yZSB0aGFuIGBNYXhQZW5kaW5nYCBhbm5vdW5jZW1lbnRzIG1heSBiZSBtYWRlIGF0IGFueSBvbmUgdGltZS4ACQFUaGlzIHdpbGwgdGFrZSBhIGRlcG9zaXQgb2YgYEFubm91bmNlbWVudERlcG9zaXRGYWN0b3JgIGFzIHdlbGwgYXMZAWBBbm5vdW5jZW1lbnREZXBvc2l0QmFzZWAgaWYgdGhlcmUgYXJlIG5vIG90aGVyIHBlbmRpbmcgYW5ub3VuY2VtZW50cy4AJQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXyBhbmQgYSBwcm94eSBvZiBgcmVhbGAuACxQYXJhbWV0ZXJzOg0BLSBgcmVhbGA6IFRoZSBhY2NvdW50IHRoYXQgdGhlIHByb3h5IHdpbGwgbWFrZSBhIGNhbGwgb24gYmVoYWxmIG9mLhUBLSBgY2FsbF9oYXNoYDogVGhlIGhhc2ggb2YgdGhlIGNhbGwgdG8gYmUgbWFkZSBieSB0aGUgYHJlYWxgIGFjY291bnQuTHJlbW92ZV9hbm5vdW5jZW1lbnQIARByZWFsxQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEkY2FsbF9oYXNoNAE0Q2FsbEhhc2hPZjxUPgAHKHBSZW1vdmUgYSBnaXZlbiBhbm5vdW5jZW1lbnQuAFkBTWF5IGJlIGNhbGxlZCBieSBhIHByb3h5IGFjY291bnQgdG8gcmVtb3ZlIGEgY2FsbCB0aGV5IHByZXZpb3VzbHkgYW5ub3VuY2VkIGFuZCByZXR1cm4wdGhlIGRlcG9zaXQuAMxUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXy4ALFBhcmFtZXRlcnM6DQEtIGByZWFsYDogVGhlIGFjY291bnQgdGhhdCB0aGUgcHJveHkgd2lsbCBtYWtlIGEgY2FsbCBvbiBiZWhhbGYgb2YuFQEtIGBjYWxsX2hhc2hgOiBUaGUgaGFzaCBvZiB0aGUgY2FsbCB0byBiZSBtYWRlIGJ5IHRoZSBgcmVhbGAgYWNjb3VudC5McmVqZWN0X2Fubm91bmNlbWVudAgBIGRlbGVnYXRlxQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEkY2FsbF9oYXNoNAE0Q2FsbEhhc2hPZjxUPgAIKLBSZW1vdmUgdGhlIGdpdmVuIGFubm91bmNlbWVudCBvZiBhIGRlbGVnYXRlLgBhAU1heSBiZSBjYWxsZWQgYnkgYSB0YXJnZXQgKHByb3hpZWQpIGFjY291bnQgdG8gcmVtb3ZlIGEgY2FsbCB0aGF0IG9uZSBvZiB0aGVpciBkZWxlZ2F0ZXMlAShgZGVsZWdhdGVgKSBoYXMgYW5ub3VuY2VkIHRoZXkgd2FudCB0byBleGVjdXRlLiBUaGUgZGVwb3NpdCBpcyByZXR1cm5lZC4AzFRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfLgAsUGFyYW1ldGVyczr0LSBgZGVsZWdhdGVgOiBUaGUgYWNjb3VudCB0aGF0IHByZXZpb3VzbHkgYW5ub3VuY2VkIHRoZSBjYWxsLrwtIGBjYWxsX2hhc2hgOiBUaGUgaGFzaCBvZiB0aGUgY2FsbCB0byBiZSBtYWRlLjxwcm94eV9hbm5vdW5jZWQQASBkZWxlZ2F0ZcUBAVBBY2NvdW50SWRMb29rdXBPZjxUPgABEHJlYWzFAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AAUBmb3JjZV9wcm94eV90eXBlBQMBUE9wdGlvbjxUOjpQcm94eVR5cGU+AAEQY2FsbHUBAXxCb3g8PFQgYXMgQ29uZmlnPjo6UnVudGltZUNhbGw+AAksTQFEaXNwYXRjaCB0aGUgZ2l2ZW4gYGNhbGxgIGZyb20gYW4gYWNjb3VudCB0aGF0IHRoZSBzZW5kZXIgaXMgYXV0aG9yaXplZCBmb3IgdGhyb3VnaDBgYWRkX3Byb3h5YC4AqFJlbW92ZXMgYW55IGNvcnJlc3BvbmRpbmcgYW5ub3VuY2VtZW50KHMpLgDMVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uACxQYXJhbWV0ZXJzOg0BLSBgcmVhbGA6IFRoZSBhY2NvdW50IHRoYXQgdGhlIHByb3h5IHdpbGwgbWFrZSBhIGNhbGwgb24gYmVoYWxmIG9mLmEBLSBgZm9yY2VfcHJveHlfdHlwZWA6IFNwZWNpZnkgdGhlIGV4YWN0IHByb3h5IHR5cGUgdG8gYmUgdXNlZCBhbmQgY2hlY2tlZCBmb3IgdGhpcyBjYWxsLtAtIGBjYWxsYDogVGhlIGNhbGwgdG8gYmUgbWFkZSBieSB0aGUgYHJlYWxgIGFjY291bnQuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLgUDBBhPcHRpb24EBFQBCQMBCBBOb25lAAAAEFNvbWUEAAkDAAABAAAJAwg0cGFzZW9fcnVudGltZSRQcm94eVR5cGUAARwMQW55AAAALE5vblRyYW5zZmVyAAEAKEdvdmVybmFuY2UAAgAcU3Rha2luZwADACxDYW5jZWxQcm94eQAGABxBdWN0aW9uAAcAPE5vbWluYXRpb25Qb29scwAIAAANAww8cGFsbGV0X211bHRpc2lnGHBhbGxldBBDYWxsBARUAAEQUGFzX211bHRpX3RocmVzaG9sZF8xCAFEb3RoZXJfc2lnbmF0b3JpZXPRAQFEVmVjPFQ6OkFjY291bnRJZD4AARBjYWxsdQEBfEJveDw8VCBhcyBDb25maWc+OjpSdW50aW1lQ2FsbD4AADBRAUltbWVkaWF0ZWx5IGRpc3BhdGNoIGEgbXVsdGktc2lnbmF0dXJlIGNhbGwgdXNpbmcgYSBzaW5nbGUgYXBwcm92YWwgZnJvbSB0aGUgY2FsbGVyLgDMVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uAD0BLSBgb3RoZXJfc2lnbmF0b3JpZXNgOiBUaGUgYWNjb3VudHMgKG90aGVyIHRoYW4gdGhlIHNlbmRlcikgd2hvIGFyZSBwYXJ0IG9mIHRoZQEBbXVsdGktc2lnbmF0dXJlLCBidXQgZG8gbm90IHBhcnRpY2lwYXRlIGluIHRoZSBhcHByb3ZhbCBwcm9jZXNzLogtIGBjYWxsYDogVGhlIGNhbGwgdG8gYmUgZXhlY3V0ZWQuALhSZXN1bHQgaXMgZXF1aXZhbGVudCB0byB0aGUgZGlzcGF0Y2hlZCByZXN1bHQuADQjIyBDb21wbGV4aXR5GQFPKFogKyBDKSB3aGVyZSBaIGlzIHRoZSBsZW5ndGggb2YgdGhlIGNhbGwgYW5kIEMgaXRzIGV4ZWN1dGlvbiB3ZWlnaHQuIGFzX211bHRpFAEkdGhyZXNob2xkbQEBDHUxNgABRG90aGVyX3NpZ25hdG9yaWVz0QEBRFZlYzxUOjpBY2NvdW50SWQ+AAE8bWF5YmVfdGltZXBvaW50EQMBkE9wdGlvbjxUaW1lcG9pbnQ8QmxvY2tOdW1iZXJGb3I8VD4+PgABEGNhbGx1AQF8Qm94PDxUIGFzIENvbmZpZz46OlJ1bnRpbWVDYWxsPgABKG1heF93ZWlnaHQoARhXZWlnaHQAAZxVAVJlZ2lzdGVyIGFwcHJvdmFsIGZvciBhIGRpc3BhdGNoIHRvIGJlIG1hZGUgZnJvbSBhIGRldGVybWluaXN0aWMgY29tcG9zaXRlIGFjY291bnQgaWb4YXBwcm92ZWQgYnkgYSB0b3RhbCBvZiBgdGhyZXNob2xkIC0gMWAgb2YgYG90aGVyX3NpZ25hdG9yaWVzYC4AsElmIHRoZXJlIGFyZSBlbm91Z2gsIHRoZW4gZGlzcGF0Y2ggdGhlIGNhbGwuAC0BUGF5bWVudDogYERlcG9zaXRCYXNlYCB3aWxsIGJlIHJlc2VydmVkIGlmIHRoaXMgaXMgdGhlIGZpcnN0IGFwcHJvdmFsLCBwbHVzPQFgdGhyZXNob2xkYCB0aW1lcyBgRGVwb3NpdEZhY3RvcmAuIEl0IGlzIHJldHVybmVkIG9uY2UgdGhpcyBkaXNwYXRjaCBoYXBwZW5zIG9yNGlzIGNhbmNlbGxlZC4AzFRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfLgBVAS0gYHRocmVzaG9sZGA6IFRoZSB0b3RhbCBudW1iZXIgb2YgYXBwcm92YWxzIGZvciB0aGlzIGRpc3BhdGNoIGJlZm9yZSBpdCBpcyBleGVjdXRlZC5BAS0gYG90aGVyX3NpZ25hdG9yaWVzYDogVGhlIGFjY291bnRzIChvdGhlciB0aGFuIHRoZSBzZW5kZXIpIHdobyBjYW4gYXBwcm92ZSB0aGlzbGRpc3BhdGNoLiBNYXkgbm90IGJlIGVtcHR5LlkBLSBgbWF5YmVfdGltZXBvaW50YDogSWYgdGhpcyBpcyB0aGUgZmlyc3QgYXBwcm92YWwsIHRoZW4gdGhpcyBtdXN0IGJlIGBOb25lYC4gSWYgaXQgaXNRAW5vdCB0aGUgZmlyc3QgYXBwcm92YWwsIHRoZW4gaXQgbXVzdCBiZSBgU29tZWAsIHdpdGggdGhlIHRpbWVwb2ludCAoYmxvY2sgbnVtYmVyIGFuZNR0cmFuc2FjdGlvbiBpbmRleCkgb2YgdGhlIGZpcnN0IGFwcHJvdmFsIHRyYW5zYWN0aW9uLogtIGBjYWxsYDogVGhlIGNhbGwgdG8gYmUgZXhlY3V0ZWQuAB0BTk9URTogVW5sZXNzIHRoaXMgaXMgdGhlIGZpbmFsIGFwcHJvdmFsLCB5b3Ugd2lsbCBnZW5lcmFsbHkgd2FudCB0byB1c2UZAWBhcHByb3ZlX2FzX211bHRpYCBpbnN0ZWFkLCBzaW5jZSBpdCBvbmx5IHJlcXVpcmVzIGEgaGFzaCBvZiB0aGUgY2FsbC4AWQFSZXN1bHQgaXMgZXF1aXZhbGVudCB0byB0aGUgZGlzcGF0Y2hlZCByZXN1bHQgaWYgYHRocmVzaG9sZGAgaXMgZXhhY3RseSBgMWAuIE90aGVyd2lzZVUBb24gc3VjY2VzcywgcmVzdWx0IGlzIGBPa2AgYW5kIHRoZSByZXN1bHQgZnJvbSB0aGUgaW50ZXJpb3IgY2FsbCwgaWYgaXQgd2FzIGV4ZWN1dGVkLNxtYXkgYmUgZm91bmQgaW4gdGhlIGRlcG9zaXRlZCBgTXVsdGlzaWdFeGVjdXRlZGAgZXZlbnQuADQjIyBDb21wbGV4aXR5UC0gYE8oUyArIFogKyBDYWxsKWAuzC0gVXAgdG8gb25lIGJhbGFuY2UtcmVzZXJ2ZSBvciB1bnJlc2VydmUgb3BlcmF0aW9uLj0BLSBPbmUgcGFzc3Rocm91Z2ggb3BlcmF0aW9uLCBvbmUgaW5zZXJ0LCBib3RoIGBPKFMpYCB3aGVyZSBgU2AgaXMgdGhlIG51bWJlciBvZkUBICBzaWduYXRvcmllcy4gYFNgIGlzIGNhcHBlZCBieSBgTWF4U2lnbmF0b3JpZXNgLCB3aXRoIHdlaWdodCBiZWluZyBwcm9wb3J0aW9uYWwuIQEtIE9uZSBjYWxsIGVuY29kZSAmIGhhc2gsIGJvdGggb2YgY29tcGxleGl0eSBgTyhaKWAgd2hlcmUgYFpgIGlzIHR4LWxlbi68LSBPbmUgZW5jb2RlICYgaGFzaCwgYm90aCBvZiBjb21wbGV4aXR5IGBPKFMpYC7ULSBVcCB0byBvbmUgYmluYXJ5IHNlYXJjaCBhbmQgaW5zZXJ0IChgTyhsb2dTICsgUylgKS74LSBJL086IDEgcmVhZCBgTyhTKWAsIHVwIHRvIDEgbXV0YXRlIGBPKFMpYC4gVXAgdG8gb25lIHJlbW92ZS4wLSBPbmUgZXZlbnQubC0gVGhlIHdlaWdodCBvZiB0aGUgYGNhbGxgLk0BLSBTdG9yYWdlOiBpbnNlcnRzIG9uZSBpdGVtLCB2YWx1ZSBzaXplIGJvdW5kZWQgYnkgYE1heFNpZ25hdG9yaWVzYCwgd2l0aCBhIGRlcG9zaXQZASAgdGFrZW4gZm9yIGl0cyBsaWZldGltZSBvZiBgRGVwb3NpdEJhc2UgKyB0aHJlc2hvbGQgKiBEZXBvc2l0RmFjdG9yYC5AYXBwcm92ZV9hc19tdWx0aRQBJHRocmVzaG9sZG0BAQx1MTYAAURvdGhlcl9zaWduYXRvcmllc9EBAURWZWM8VDo6QWNjb3VudElkPgABPG1heWJlX3RpbWVwb2ludBEDAZBPcHRpb248VGltZXBvaW50PEJsb2NrTnVtYmVyRm9yPFQ+Pj4AASRjYWxsX2hhc2gEASBbdTg7IDMyXQABKG1heF93ZWlnaHQoARhXZWlnaHQAAnhVAVJlZ2lzdGVyIGFwcHJvdmFsIGZvciBhIGRpc3BhdGNoIHRvIGJlIG1hZGUgZnJvbSBhIGRldGVybWluaXN0aWMgY29tcG9zaXRlIGFjY291bnQgaWb4YXBwcm92ZWQgYnkgYSB0b3RhbCBvZiBgdGhyZXNob2xkIC0gMWAgb2YgYG90aGVyX3NpZ25hdG9yaWVzYC4ALQFQYXltZW50OiBgRGVwb3NpdEJhc2VgIHdpbGwgYmUgcmVzZXJ2ZWQgaWYgdGhpcyBpcyB0aGUgZmlyc3QgYXBwcm92YWwsIHBsdXM9AWB0aHJlc2hvbGRgIHRpbWVzIGBEZXBvc2l0RmFjdG9yYC4gSXQgaXMgcmV0dXJuZWQgb25jZSB0aGlzIGRpc3BhdGNoIGhhcHBlbnMgb3I0aXMgY2FuY2VsbGVkLgDMVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uAFUBLSBgdGhyZXNob2xkYDogVGhlIHRvdGFsIG51bWJlciBvZiBhcHByb3ZhbHMgZm9yIHRoaXMgZGlzcGF0Y2ggYmVmb3JlIGl0IGlzIGV4ZWN1dGVkLkEBLSBgb3RoZXJfc2lnbmF0b3JpZXNgOiBUaGUgYWNjb3VudHMgKG90aGVyIHRoYW4gdGhlIHNlbmRlcikgd2hvIGNhbiBhcHByb3ZlIHRoaXNsZGlzcGF0Y2guIE1heSBub3QgYmUgZW1wdHkuWQEtIGBtYXliZV90aW1lcG9pbnRgOiBJZiB0aGlzIGlzIHRoZSBmaXJzdCBhcHByb3ZhbCwgdGhlbiB0aGlzIG11c3QgYmUgYE5vbmVgLiBJZiBpdCBpc1EBbm90IHRoZSBmaXJzdCBhcHByb3ZhbCwgdGhlbiBpdCBtdXN0IGJlIGBTb21lYCwgd2l0aCB0aGUgdGltZXBvaW50IChibG9jayBudW1iZXIgYW5k1HRyYW5zYWN0aW9uIGluZGV4KSBvZiB0aGUgZmlyc3QgYXBwcm92YWwgdHJhbnNhY3Rpb24uzC0gYGNhbGxfaGFzaGA6IFRoZSBoYXNoIG9mIHRoZSBjYWxsIHRvIGJlIGV4ZWN1dGVkLgA1AU5PVEU6IElmIHRoaXMgaXMgdGhlIGZpbmFsIGFwcHJvdmFsLCB5b3Ugd2lsbCB3YW50IHRvIHVzZSBgYXNfbXVsdGlgIGluc3RlYWQuADQjIyBDb21wbGV4aXR5JC0gYE8oUylgLswtIFVwIHRvIG9uZSBiYWxhbmNlLXJlc2VydmUgb3IgdW5yZXNlcnZlIG9wZXJhdGlvbi49AS0gT25lIHBhc3N0aHJvdWdoIG9wZXJhdGlvbiwgb25lIGluc2VydCwgYm90aCBgTyhTKWAgd2hlcmUgYFNgIGlzIHRoZSBudW1iZXIgb2ZFASAgc2lnbmF0b3JpZXMuIGBTYCBpcyBjYXBwZWQgYnkgYE1heFNpZ25hdG9yaWVzYCwgd2l0aCB3ZWlnaHQgYmVpbmcgcHJvcG9ydGlvbmFsLrwtIE9uZSBlbmNvZGUgJiBoYXNoLCBib3RoIG9mIGNvbXBsZXhpdHkgYE8oUylgLtQtIFVwIHRvIG9uZSBiaW5hcnkgc2VhcmNoIGFuZCBpbnNlcnQgKGBPKGxvZ1MgKyBTKWApLvgtIEkvTzogMSByZWFkIGBPKFMpYCwgdXAgdG8gMSBtdXRhdGUgYE8oUylgLiBVcCB0byBvbmUgcmVtb3ZlLjAtIE9uZSBldmVudC5NAS0gU3RvcmFnZTogaW5zZXJ0cyBvbmUgaXRlbSwgdmFsdWUgc2l6ZSBib3VuZGVkIGJ5IGBNYXhTaWduYXRvcmllc2AsIHdpdGggYSBkZXBvc2l0GQEgIHRha2VuIGZvciBpdHMgbGlmZXRpbWUgb2YgYERlcG9zaXRCYXNlICsgdGhyZXNob2xkICogRGVwb3NpdEZhY3RvcmAuPGNhbmNlbF9hc19tdWx0aRABJHRocmVzaG9sZG0BAQx1MTYAAURvdGhlcl9zaWduYXRvcmllc9EBAURWZWM8VDo6QWNjb3VudElkPgABJHRpbWVwb2ludBUDAXBUaW1lcG9pbnQ8QmxvY2tOdW1iZXJGb3I8VD4+AAEkY2FsbF9oYXNoBAEgW3U4OyAzMl0AA1RVAUNhbmNlbCBhIHByZS1leGlzdGluZywgb24tZ29pbmcgbXVsdGlzaWcgdHJhbnNhY3Rpb24uIEFueSBkZXBvc2l0IHJlc2VydmVkIHByZXZpb3VzbHnEZm9yIHRoaXMgb3BlcmF0aW9uIHdpbGwgYmUgdW5yZXNlcnZlZCBvbiBzdWNjZXNzLgDMVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uAFUBLSBgdGhyZXNob2xkYDogVGhlIHRvdGFsIG51bWJlciBvZiBhcHByb3ZhbHMgZm9yIHRoaXMgZGlzcGF0Y2ggYmVmb3JlIGl0IGlzIGV4ZWN1dGVkLkEBLSBgb3RoZXJfc2lnbmF0b3JpZXNgOiBUaGUgYWNjb3VudHMgKG90aGVyIHRoYW4gdGhlIHNlbmRlcikgd2hvIGNhbiBhcHByb3ZlIHRoaXNsZGlzcGF0Y2guIE1heSBub3QgYmUgZW1wdHkuXQEtIGB0aW1lcG9pbnRgOiBUaGUgdGltZXBvaW50IChibG9jayBudW1iZXIgYW5kIHRyYW5zYWN0aW9uIGluZGV4KSBvZiB0aGUgZmlyc3QgYXBwcm92YWx4dHJhbnNhY3Rpb24gZm9yIHRoaXMgZGlzcGF0Y2guzC0gYGNhbGxfaGFzaGA6IFRoZSBoYXNoIG9mIHRoZSBjYWxsIHRvIGJlIGV4ZWN1dGVkLgA0IyMgQ29tcGxleGl0eSQtIGBPKFMpYC7MLSBVcCB0byBvbmUgYmFsYW5jZS1yZXNlcnZlIG9yIHVucmVzZXJ2ZSBvcGVyYXRpb24uPQEtIE9uZSBwYXNzdGhyb3VnaCBvcGVyYXRpb24sIG9uZSBpbnNlcnQsIGJvdGggYE8oUylgIHdoZXJlIGBTYCBpcyB0aGUgbnVtYmVyIG9mRQEgIHNpZ25hdG9yaWVzLiBgU2AgaXMgY2FwcGVkIGJ5IGBNYXhTaWduYXRvcmllc2AsIHdpdGggd2VpZ2h0IGJlaW5nIHByb3BvcnRpb25hbC68LSBPbmUgZW5jb2RlICYgaGFzaCwgYm90aCBvZiBjb21wbGV4aXR5IGBPKFMpYC4wLSBPbmUgZXZlbnQuhC0gSS9POiAxIHJlYWQgYE8oUylgLCBvbmUgcmVtb3ZlLnAtIFN0b3JhZ2U6IHJlbW92ZXMgb25lIGl0ZW0uBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLhEDBBhPcHRpb24EBFQBFQMBCBBOb25lAAAAEFNvbWUEABUDAAABAAAVAwg8cGFsbGV0X211bHRpc2lnJFRpbWVwb2ludAQsQmxvY2tOdW1iZXIBEAAIARhoZWlnaHQQASxCbG9ja051bWJlcgABFGluZGV4EAEMdTMyAAAZAww8cGFsbGV0X2JvdW50aWVzGHBhbGxldBBDYWxsCARUAARJAAEkOHByb3Bvc2VfYm91bnR5CAEUdmFsdWX8ATxCYWxhbmNlT2Y8VCwgST4AASxkZXNjcmlwdGlvbjgBHFZlYzx1OD4AADBUUHJvcG9zZSBhIG5ldyBib3VudHkuAMxUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXy4AUQFQYXltZW50OiBgVGlwUmVwb3J0RGVwb3NpdEJhc2VgIHdpbGwgYmUgcmVzZXJ2ZWQgZnJvbSB0aGUgb3JpZ2luIGFjY291bnQsIGFzIHdlbGwgYXNRAWBEYXRhRGVwb3NpdFBlckJ5dGVgIGZvciBlYWNoIGJ5dGUgaW4gYHJlYXNvbmAuIEl0IHdpbGwgYmUgdW5yZXNlcnZlZCB1cG9uIGFwcHJvdmFsLGRvciBzbGFzaGVkIHdoZW4gcmVqZWN0ZWQuAPgtIGBjdXJhdG9yYDogVGhlIGN1cmF0b3IgYWNjb3VudCB3aG9tIHdpbGwgbWFuYWdlIHRoaXMgYm91bnR5LmQtIGBmZWVgOiBUaGUgY3VyYXRvciBmZWUuJQEtIGB2YWx1ZWA6IFRoZSB0b3RhbCBwYXltZW50IGFtb3VudCBvZiB0aGlzIGJvdW50eSwgY3VyYXRvciBmZWUgaW5jbHVkZWQuwC0gYGRlc2NyaXB0aW9uYDogVGhlIGRlc2NyaXB0aW9uIG9mIHRoaXMgYm91bnR5LjhhcHByb3ZlX2JvdW50eQQBJGJvdW50eV9pZOwBLEJvdW50eUluZGV4AAEcXQFBcHByb3ZlIGEgYm91bnR5IHByb3Bvc2FsLiBBdCBhIGxhdGVyIHRpbWUsIHRoZSBib3VudHkgd2lsbCBiZSBmdW5kZWQgYW5kIGJlY29tZSBhY3RpdmWoYW5kIHRoZSBvcmlnaW5hbCBkZXBvc2l0IHdpbGwgYmUgcmV0dXJuZWQuAKRNYXkgb25seSBiZSBjYWxsZWQgZnJvbSBgVDo6U3BlbmRPcmlnaW5gLgA0IyMgQ29tcGxleGl0eRwtIE8oMSkuPHByb3Bvc2VfY3VyYXRvcgwBJGJvdW50eV9pZOwBLEJvdW50eUluZGV4AAEcY3VyYXRvcsUBAVBBY2NvdW50SWRMb29rdXBPZjxUPgABDGZlZfwBPEJhbGFuY2VPZjxULCBJPgACGJRQcm9wb3NlIGEgY3VyYXRvciB0byBhIGZ1bmRlZCBib3VudHkuAKRNYXkgb25seSBiZSBjYWxsZWQgZnJvbSBgVDo6U3BlbmRPcmlnaW5gLgA0IyMgQ29tcGxleGl0eRwtIE8oMSkuQHVuYXNzaWduX2N1cmF0b3IEASRib3VudHlfaWTsASxCb3VudHlJbmRleAADRHxVbmFzc2lnbiBjdXJhdG9yIGZyb20gYSBib3VudHkuAB0BVGhpcyBmdW5jdGlvbiBjYW4gb25seSBiZSBjYWxsZWQgYnkgdGhlIGBSZWplY3RPcmlnaW5gIGEgc2lnbmVkIG9yaWdpbi4APQFJZiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgYFJlamVjdE9yaWdpbmAsIHdlIGFzc3VtZSB0aGF0IHRoZSBjdXJhdG9yIGlzMQFtYWxpY2lvdXMgb3IgaW5hY3RpdmUuIEFzIGEgcmVzdWx0LCB3ZSB3aWxsIHNsYXNoIHRoZSBjdXJhdG9yIHdoZW4gcG9zc2libGUuAGEBSWYgdGhlIG9yaWdpbiBpcyB0aGUgY3VyYXRvciwgd2UgdGFrZSB0aGlzIGFzIGEgc2lnbiB0aGV5IGFyZSB1bmFibGUgdG8gZG8gdGhlaXIgam9iIGFuZF0BdGhleSB3aWxsaW5nbHkgZ2l2ZSB1cC4gV2UgY291bGQgc2xhc2ggdGhlbSwgYnV0IGZvciBub3cgd2UgYWxsb3cgdGhlbSB0byByZWNvdmVyIHRoZWlyNQFkZXBvc2l0IGFuZCBleGl0IHdpdGhvdXQgaXNzdWUuIChXZSBtYXkgd2FudCB0byBjaGFuZ2UgdGhpcyBpZiBpdCBpcyBhYnVzZWQuKQBdAUZpbmFsbHksIHRoZSBvcmlnaW4gY2FuIGJlIGFueW9uZSBpZiBhbmQgb25seSBpZiB0aGUgY3VyYXRvciBpcyAiaW5hY3RpdmUiLiBUaGlzIGFsbG93c2EBYW55b25lIGluIHRoZSBjb21tdW5pdHkgdG8gY2FsbCBvdXQgdGhhdCBhIGN1cmF0b3IgaXMgbm90IGRvaW5nIHRoZWlyIGR1ZSBkaWxpZ2VuY2UsIGFuZDkBd2Ugc2hvdWxkIHBpY2sgYSBuZXcgY3VyYXRvci4gSW4gdGhpcyBjYXNlIHRoZSBjdXJhdG9yIHNob3VsZCBhbHNvIGJlIHNsYXNoZWQuADQjIyBDb21wbGV4aXR5HC0gTygxKS44YWNjZXB0X2N1cmF0b3IEASRib3VudHlfaWTsASxCb3VudHlJbmRleAAEHJRBY2NlcHQgdGhlIGN1cmF0b3Igcm9sZSBmb3IgYSBib3VudHkuKQFBIGRlcG9zaXQgd2lsbCBiZSByZXNlcnZlZCBmcm9tIGN1cmF0b3IgYW5kIHJlZnVuZCB1cG9uIHN1Y2Nlc3NmdWwgcGF5b3V0LgCQTWF5IG9ubHkgYmUgY2FsbGVkIGZyb20gdGhlIGN1cmF0b3IuADQjIyBDb21wbGV4aXR5HC0gTygxKS4wYXdhcmRfYm91bnR5CAEkYm91bnR5X2lk7AEsQm91bnR5SW5kZXgAASxiZW5lZmljaWFyecUBAVBBY2NvdW50SWRMb29rdXBPZjxUPgAFKFkBQXdhcmQgYm91bnR5IHRvIGEgYmVuZWZpY2lhcnkgYWNjb3VudC4gVGhlIGJlbmVmaWNpYXJ5IHdpbGwgYmUgYWJsZSB0byBjbGFpbSB0aGUgZnVuZHM4YWZ0ZXIgYSBkZWxheS4AFQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSB0aGUgY3VyYXRvciBvZiB0aGlzIGJvdW50eS4AiC0gYGJvdW50eV9pZGA6IEJvdW50eSBJRCB0byBhd2FyZC4ZAS0gYGJlbmVmaWNpYXJ5YDogVGhlIGJlbmVmaWNpYXJ5IGFjY291bnQgd2hvbSB3aWxsIHJlY2VpdmUgdGhlIHBheW91dC4ANCMjIENvbXBsZXhpdHkcLSBPKDEpLjBjbGFpbV9ib3VudHkEASRib3VudHlfaWTsASxCb3VudHlJbmRleAAGIOxDbGFpbSB0aGUgcGF5b3V0IGZyb20gYW4gYXdhcmRlZCBib3VudHkgYWZ0ZXIgcGF5b3V0IGRlbGF5LgAlAVRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIHRoZSBiZW5lZmljaWFyeSBvZiB0aGlzIGJvdW50eS4AiC0gYGJvdW50eV9pZGA6IEJvdW50eSBJRCB0byBjbGFpbS4ANCMjIENvbXBsZXhpdHkcLSBPKDEpLjBjbG9zZV9ib3VudHkEASRib3VudHlfaWTsASxCb3VudHlJbmRleAAHJDkBQ2FuY2VsIGEgcHJvcG9zZWQgb3IgYWN0aXZlIGJvdW50eS4gQWxsIHRoZSBmdW5kcyB3aWxsIGJlIHNlbnQgdG8gdHJlYXN1cnkgYW5kzHRoZSBjdXJhdG9yIGRlcG9zaXQgd2lsbCBiZSB1bnJlc2VydmVkIGlmIHBvc3NpYmxlLgDIT25seSBgVDo6UmVqZWN0T3JpZ2luYCBpcyBhYmxlIHRvIGNhbmNlbCBhIGJvdW50eS4AjC0gYGJvdW50eV9pZGA6IEJvdW50eSBJRCB0byBjYW5jZWwuADQjIyBDb21wbGV4aXR5HC0gTygxKS5QZXh0ZW5kX2JvdW50eV9leHBpcnkIASRib3VudHlfaWTsASxCb3VudHlJbmRleAABGHJlbWFyazgBHFZlYzx1OD4ACCSsRXh0ZW5kIHRoZSBleHBpcnkgdGltZSBvZiBhbiBhY3RpdmUgYm91bnR5LgAVAVRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIHRoZSBjdXJhdG9yIG9mIHRoaXMgYm91bnR5LgCMLSBgYm91bnR5X2lkYDogQm91bnR5IElEIHRvIGV4dGVuZC6MLSBgcmVtYXJrYDogYWRkaXRpb25hbCBpbmZvcm1hdGlvbi4ANCMjIENvbXBsZXhpdHkcLSBPKDEpLgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy4dAwxUcGFsbGV0X2NoaWxkX2JvdW50aWVzGHBhbGxldBBDYWxsBARUAAEcQGFkZF9jaGlsZF9ib3VudHkMAUBwYXJlbnRfYm91bnR5X2lk7AEsQm91bnR5SW5kZXgAARR2YWx1ZfwBMEJhbGFuY2VPZjxUPgABLGRlc2NyaXB0aW9uOAEcVmVjPHU4PgAATFxBZGQgYSBuZXcgY2hpbGQtYm91bnR5LgD8VGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgdGhlIGN1cmF0b3Igb2YgcGFyZW503GJvdW50eSBhbmQgdGhlIHBhcmVudCBib3VudHkgbXVzdCBiZSBpbiAiYWN0aXZlIiBzdGF0ZS4ABQFDaGlsZC1ib3VudHkgZ2V0cyBhZGRlZCBzdWNjZXNzZnVsbHkgJiBmdW5kIGdldHMgdHJhbnNmZXJyZWQgZnJvbQkBcGFyZW50IGJvdW50eSB0byBjaGlsZC1ib3VudHkgYWNjb3VudCwgaWYgcGFyZW50IGJvdW50eSBoYXMgZW5vdWdobGZ1bmRzLCBlbHNlIHRoZSBjYWxsIGZhaWxzLgANAVVwcGVyIGJvdW5kIHRvIG1heGltdW0gbnVtYmVyIG9mIGFjdGl2ZSAgY2hpbGQgYm91bnRpZXMgdGhhdCBjYW4gYmWoYWRkZWQgYXJlIG1hbmFnZWQgdmlhIHJ1bnRpbWUgdHJhaXQgY29uZmlnmFtgQ29uZmlnOjpNYXhBY3RpdmVDaGlsZEJvdW50eUNvdW50YF0uAAEBSWYgdGhlIGNhbGwgaXMgc3VjY2VzcywgdGhlIHN0YXR1cyBvZiBjaGlsZC1ib3VudHkgaXMgdXBkYXRlZCB0byAiQWRkZWQiLgBNAS0gYHBhcmVudF9ib3VudHlfaWRgOiBJbmRleCBvZiBwYXJlbnQgYm91bnR5IGZvciB3aGljaCBjaGlsZC1ib3VudHkgaXMgYmVpbmcgYWRkZWQusC0gYHZhbHVlYDogVmFsdWUgZm9yIGV4ZWN1dGluZyB0aGUgcHJvcG9zYWwu3C0gYGRlc2NyaXB0aW9uYDogVGV4dCBkZXNjcmlwdGlvbiBmb3IgdGhlIGNoaWxkLWJvdW50eS48cHJvcG9zZV9jdXJhdG9yEAFAcGFyZW50X2JvdW50eV9pZOwBLEJvdW50eUluZGV4AAE8Y2hpbGRfYm91bnR5X2lk7AEsQm91bnR5SW5kZXgAARxjdXJhdG9yxQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEMZmVl/AEwQmFsYW5jZU9mPFQ+AAE8oFByb3Bvc2UgY3VyYXRvciBmb3IgZnVuZGVkIGNoaWxkLWJvdW50eS4ADQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBjdXJhdG9yIG9mIHBhcmVudCBib3VudHkuABEBUGFyZW50IGJvdW50eSBtdXN0IGJlIGluIGFjdGl2ZSBzdGF0ZSwgZm9yIHRoaXMgY2hpbGQtYm91bnR5IGNhbGwgdG8Ud29yay4ADQFDaGlsZC1ib3VudHkgbXVzdCBiZSBpbiAiQWRkZWQiIHN0YXRlLCBmb3IgcHJvY2Vzc2luZyB0aGUgY2FsbC4gQW5kBQFzdGF0ZSBvZiBjaGlsZC1ib3VudHkgaXMgbW92ZWQgdG8gIkN1cmF0b3JQcm9wb3NlZCIgb24gc3VjY2Vzc2Z1bEBjYWxsIGNvbXBsZXRpb24uALQtIGBwYXJlbnRfYm91bnR5X2lkYDogSW5kZXggb2YgcGFyZW50IGJvdW50eS6sLSBgY2hpbGRfYm91bnR5X2lkYDogSW5kZXggb2YgY2hpbGQgYm91bnR5LrQtIGBjdXJhdG9yYDogQWRkcmVzcyBvZiBjaGlsZC1ib3VudHkgY3VyYXRvci7sLSBgZmVlYDogcGF5bWVudCBmZWUgdG8gY2hpbGQtYm91bnR5IGN1cmF0b3IgZm9yIGV4ZWN1dGlvbi44YWNjZXB0X2N1cmF0b3IIAUBwYXJlbnRfYm91bnR5X2lk7AEsQm91bnR5SW5kZXgAATxjaGlsZF9ib3VudHlfaWTsASxCb3VudHlJbmRleAACTLRBY2NlcHQgdGhlIGN1cmF0b3Igcm9sZSBmb3IgdGhlIGNoaWxkLWJvdW50eS4A9FRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIHRoZSBjdXJhdG9yIG9mIHRoaXM0Y2hpbGQtYm91bnR5LgDsQSBkZXBvc2l0IHdpbGwgYmUgcmVzZXJ2ZWQgZnJvbSB0aGUgY3VyYXRvciBhbmQgcmVmdW5kIHVwb26Ic3VjY2Vzc2Z1bCBwYXlvdXQgb3IgY2FuY2VsbGF0aW9uLgD4RmVlIGZvciBjdXJhdG9yIGlzIGRlZHVjdGVkIGZyb20gY3VyYXRvciBmZWUgb2YgcGFyZW50IGJvdW50eS4AEQFQYXJlbnQgYm91bnR5IG11c3QgYmUgaW4gYWN0aXZlIHN0YXRlLCBmb3IgdGhpcyBjaGlsZC1ib3VudHkgY2FsbCB0bxR3b3JrLgANAUNoaWxkLWJvdW50eSBtdXN0IGJlIGluICJDdXJhdG9yUHJvcG9zZWQiIHN0YXRlLCBmb3IgcHJvY2Vzc2luZyB0aGUJAWNhbGwuIEFuZCBzdGF0ZSBvZiBjaGlsZC1ib3VudHkgaXMgbW92ZWQgdG8gIkFjdGl2ZSIgb24gc3VjY2Vzc2Z1bEBjYWxsIGNvbXBsZXRpb24uALQtIGBwYXJlbnRfYm91bnR5X2lkYDogSW5kZXggb2YgcGFyZW50IGJvdW50eS6sLSBgY2hpbGRfYm91bnR5X2lkYDogSW5kZXggb2YgY2hpbGQgYm91bnR5LkB1bmFzc2lnbl9jdXJhdG9yCAFAcGFyZW50X2JvdW50eV9pZOwBLEJvdW50eUluZGV4AAE8Y2hpbGRfYm91bnR5X2lk7AEsQm91bnR5SW5kZXgAA4iUVW5hc3NpZ24gY3VyYXRvciBmcm9tIGEgY2hpbGQtYm91bnR5LgAJAVRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBjYW4gYmUgZWl0aGVyIGBSZWplY3RPcmlnaW5gLCBvctx0aGUgY3VyYXRvciBvZiB0aGUgcGFyZW50IGJvdW50eSwgb3IgYW55IHNpZ25lZCBvcmlnaW4uAPhGb3IgdGhlIG9yaWdpbiBvdGhlciB0aGFuIFQ6OlJlamVjdE9yaWdpbiBhbmQgdGhlIGNoaWxkLWJvdW50eQEBY3VyYXRvciwgcGFyZW50IGJvdW50eSBtdXN0IGJlIGluIGFjdGl2ZSBzdGF0ZSwgZm9yIHRoaXMgY2FsbCB0bwkBd29yay4gV2UgYWxsb3cgY2hpbGQtYm91bnR5IGN1cmF0b3IgYW5kIFQ6OlJlamVjdE9yaWdpbiB0byBleGVjdXRlyHRoaXMgY2FsbCBpcnJlc3BlY3RpdmUgb2YgdGhlIHBhcmVudCBib3VudHkgc3RhdGUuANxJZiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgYFJlamVjdE9yaWdpbmAgb3IgdGhlBQFwYXJlbnQgYm91bnR5IGN1cmF0b3IsIHdlIGFzc3VtZSB0aGF0IHRoZSBjaGlsZC1ib3VudHkgY3VyYXRvciBpcw0BbWFsaWNpb3VzIG9yIGluYWN0aXZlLiBBcyBhIHJlc3VsdCwgY2hpbGQtYm91bnR5IGN1cmF0b3IgZGVwb3NpdCBpcyBzbGFzaGVkLgAFAUlmIHRoZSBvcmlnaW4gaXMgdGhlIGNoaWxkLWJvdW50eSBjdXJhdG9yLCB3ZSB0YWtlIHRoaXMgYXMgYSBzaWduCQF0aGF0IHRoZXkgYXJlIHVuYWJsZSB0byBkbyB0aGVpciBqb2IsIGFuZCBhcmUgd2lsbGluZ2x5IGdpdmluZyB1cC4JAVdlIGNvdWxkIHNsYXNoIHRoZSBkZXBvc2l0LCBidXQgZm9yIG5vdyB3ZSBhbGxvdyB0aGVtIHRvIHVucmVzZXJ2ZREBdGhlaXIgZGVwb3NpdCBhbmQgZXhpdCB3aXRob3V0IGlzc3VlLiAoV2UgbWF5IHdhbnQgdG8gY2hhbmdlIHRoaXMgaWY4aXQgaXMgYWJ1c2VkLikABQFGaW5hbGx5LCB0aGUgb3JpZ2luIGNhbiBiZSBhbnlvbmUgaWZmIHRoZSBjaGlsZC1ib3VudHkgY3VyYXRvciBpcwkBImluYWN0aXZlIi4gRXhwaXJ5IHVwZGF0ZSBkdWUgb2YgcGFyZW50IGJvdW50eSBpcyB1c2VkIHRvIGVzdGltYXRlnGluYWN0aXZlIHN0YXRlIG9mIGNoaWxkLWJvdW50eSBjdXJhdG9yLgANAVRoaXMgYWxsb3dzIGFueW9uZSBpbiB0aGUgY29tbXVuaXR5IHRvIGNhbGwgb3V0IHRoYXQgYSBjaGlsZC1ib3VudHkJAWN1cmF0b3IgaXMgbm90IGRvaW5nIHRoZWlyIGR1ZSBkaWxpZ2VuY2UsIGFuZCB3ZSBzaG91bGQgcGljayBhIG5ld/hvbmUuIEluIHRoaXMgY2FzZSB0aGUgY2hpbGQtYm91bnR5IGN1cmF0b3IgZGVwb3NpdCBpcyBzbGFzaGVkLgABAVN0YXRlIG9mIGNoaWxkLWJvdW50eSBpcyBtb3ZlZCB0byBBZGRlZCBzdGF0ZSBvbiBzdWNjZXNzZnVsIGNhbGwsY29tcGxldGlvbi4AtC0gYHBhcmVudF9ib3VudHlfaWRgOiBJbmRleCBvZiBwYXJlbnQgYm91bnR5LqwtIGBjaGlsZF9ib3VudHlfaWRgOiBJbmRleCBvZiBjaGlsZCBib3VudHkuSGF3YXJkX2NoaWxkX2JvdW50eQwBQHBhcmVudF9ib3VudHlfaWTsASxCb3VudHlJbmRleAABPGNoaWxkX2JvdW50eV9pZOwBLEJvdW50eUluZGV4AAEsYmVuZWZpY2lhcnnFAQFQQWNjb3VudElkTG9va3VwT2Y8VD4ABESQQXdhcmQgY2hpbGQtYm91bnR5IHRvIGEgYmVuZWZpY2lhcnkuAPhUaGUgYmVuZWZpY2lhcnkgd2lsbCBiZSBhYmxlIHRvIGNsYWltIHRoZSBmdW5kcyBhZnRlciBhIGRlbGF5LgD8VGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgdGhlIHBhcmVudCBjdXJhdG9yIG9ydGN1cmF0b3Igb2YgdGhpcyBjaGlsZC1ib3VudHkuABEBUGFyZW50IGJvdW50eSBtdXN0IGJlIGluIGFjdGl2ZSBzdGF0ZSwgZm9yIHRoaXMgY2hpbGQtYm91bnR5IGNhbGwgdG8Ud29yay4ACQFDaGlsZC1ib3VudHkgbXVzdCBiZSBpbiBhY3RpdmUgc3RhdGUsIGZvciBwcm9jZXNzaW5nIHRoZSBjYWxsLiBBbmQRAXN0YXRlIG9mIGNoaWxkLWJvdW50eSBpcyBtb3ZlZCB0byAiUGVuZGluZ1BheW91dCIgb24gc3VjY2Vzc2Z1bCBjYWxsLGNvbXBsZXRpb24uALQtIGBwYXJlbnRfYm91bnR5X2lkYDogSW5kZXggb2YgcGFyZW50IGJvdW50eS6sLSBgY2hpbGRfYm91bnR5X2lkYDogSW5kZXggb2YgY2hpbGQgYm91bnR5LpQtIGBiZW5lZmljaWFyeWA6IEJlbmVmaWNpYXJ5IGFjY291bnQuSGNsYWltX2NoaWxkX2JvdW50eQgBQHBhcmVudF9ib3VudHlfaWTsASxCb3VudHlJbmRleAABPGNoaWxkX2JvdW50eV9pZOwBLEJvdW50eUluZGV4AAVABQFDbGFpbSB0aGUgcGF5b3V0IGZyb20gYW4gYXdhcmRlZCBjaGlsZC1ib3VudHkgYWZ0ZXIgcGF5b3V0IGRlbGF5LgDsVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG1heSBiZSBhbnkgc2lnbmVkIG9yaWdpbi4ABQFDYWxsIHdvcmtzIGluZGVwZW5kZW50IG9mIHBhcmVudCBib3VudHkgc3RhdGUsIE5vIG5lZWQgZm9yIHBhcmVudHRib3VudHkgdG8gYmUgaW4gYWN0aXZlIHN0YXRlLgARAVRoZSBCZW5lZmljaWFyeSBpcyBwYWlkIG91dCB3aXRoIGFncmVlZCBib3VudHkgdmFsdWUuIEN1cmF0b3IgZmVlIGlzlHBhaWQgJiBjdXJhdG9yIGRlcG9zaXQgaXMgdW5yZXNlcnZlZC4ABQFDaGlsZC1ib3VudHkgbXVzdCBiZSBpbiAiUGVuZGluZ1BheW91dCIgc3RhdGUsIGZvciBwcm9jZXNzaW5nIHRoZfxjYWxsLiBBbmQgaW5zdGFuY2Ugb2YgY2hpbGQtYm91bnR5IGlzIHJlbW92ZWQgZnJvbSB0aGUgc3RhdGUgb25sc3VjY2Vzc2Z1bCBjYWxsIGNvbXBsZXRpb24uALQtIGBwYXJlbnRfYm91bnR5X2lkYDogSW5kZXggb2YgcGFyZW50IGJvdW50eS6sLSBgY2hpbGRfYm91bnR5X2lkYDogSW5kZXggb2YgY2hpbGQgYm91bnR5LkhjbG9zZV9jaGlsZF9ib3VudHkIAUBwYXJlbnRfYm91bnR5X2lk7AEsQm91bnR5SW5kZXgAATxjaGlsZF9ib3VudHlfaWTsASxCb3VudHlJbmRleAAGWBEBQ2FuY2VsIGEgcHJvcG9zZWQgb3IgYWN0aXZlIGNoaWxkLWJvdW50eS4gQ2hpbGQtYm91bnR5IGFjY291bnQgZnVuZHMJAWFyZSB0cmFuc2ZlcnJlZCB0byBwYXJlbnQgYm91bnR5IGFjY291bnQuIFRoZSBjaGlsZC1ib3VudHkgY3VyYXRvcphkZXBvc2l0IG1heSBiZSB1bnJlc2VydmVkIGlmIHBvc3NpYmxlLgAJAVRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIGVpdGhlciBwYXJlbnQgY3VyYXRvciBvckhgVDo6UmVqZWN0T3JpZ2luYC4A8ElmIHRoZSBzdGF0ZSBvZiBjaGlsZC1ib3VudHkgaXMgYEFjdGl2ZWAsIGN1cmF0b3IgZGVwb3NpdCBpcyx1bnJlc2VydmVkLgD0SWYgdGhlIHN0YXRlIG9mIGNoaWxkLWJvdW50eSBpcyBgUGVuZGluZ1BheW91dGAsIGNhbGwgZmFpbHMgJnhyZXR1cm5zIGBQZW5kaW5nUGF5b3V0YCBlcnJvci4ADQFGb3IgdGhlIG9yaWdpbiBvdGhlciB0aGFuIFQ6OlJlamVjdE9yaWdpbiwgcGFyZW50IGJvdW50eSBtdXN0IGJlIGlu8GFjdGl2ZSBzdGF0ZSwgZm9yIHRoaXMgY2hpbGQtYm91bnR5IGNhbGwgdG8gd29yay4gRm9yIG9yaWdpbpBUOjpSZWplY3RPcmlnaW4gZXhlY3V0aW9uIGlzIGZvcmNlZC4AAQFJbnN0YW5jZSBvZiBjaGlsZC1ib3VudHkgaXMgcmVtb3ZlZCBmcm9tIHRoZSBzdGF0ZSBvbiBzdWNjZXNzZnVsQGNhbGwgY29tcGxldGlvbi4AtC0gYHBhcmVudF9ib3VudHlfaWRgOiBJbmRleCBvZiBwYXJlbnQgYm91bnR5LqwtIGBjaGlsZF9ib3VudHlfaWRgOiBJbmRleCBvZiBjaGlsZCBib3VudHkuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLiEDDJBwYWxsZXRfZWxlY3Rpb25fcHJvdmlkZXJfbXVsdGlfcGhhc2UYcGFsbGV0EENhbGwEBFQAARQ8c3VibWl0X3Vuc2lnbmVkCAEwcmF3X3NvbHV0aW9uJQMBsEJveDxSYXdTb2x1dGlvbjxTb2x1dGlvbk9mPFQ6Ok1pbmVyQ29uZmlnPj4+AAEcd2l0bmVzc/kDAVhTb2x1dGlvbk9yU25hcHNob3RTaXplAAA4pFN1Ym1pdCBhIHNvbHV0aW9uIGZvciB0aGUgdW5zaWduZWQgcGhhc2UuAMhUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvIHRoaXMgY2FsbCBtdXN0IGJlIF9fbm9uZV9fLgA9AVRoaXMgc3VibWlzc2lvbiBpcyBjaGVja2VkIG9uIHRoZSBmbHkuIE1vcmVvdmVyLCB0aGlzIHVuc2lnbmVkIHNvbHV0aW9uIGlzIG9ubHlVAXZhbGlkYXRlZCB3aGVuIHN1Ym1pdHRlZCB0byB0aGUgcG9vbCBmcm9tIHRoZSAqKmxvY2FsKiogbm9kZS4gRWZmZWN0aXZlbHksIHRoaXMgbWVhbnNdAXRoYXQgb25seSBhY3RpdmUgdmFsaWRhdG9ycyBjYW4gc3VibWl0IHRoaXMgdHJhbnNhY3Rpb24gd2hlbiBhdXRob3JpbmcgYSBibG9jayAoc2ltaWxhckB0byBhbiBpbmhlcmVudCkuAFkBVG8gcHJldmVudCBhbnkgaW5jb3JyZWN0IHNvbHV0aW9uIChhbmQgdGh1cyB3YXN0ZWQgdGltZS93ZWlnaHQpLCB0aGlzIHRyYW5zYWN0aW9uIHdpbGxNAXBhbmljIGlmIHRoZSBzb2x1dGlvbiBzdWJtaXR0ZWQgYnkgdGhlIHZhbGlkYXRvciBpcyBpbnZhbGlkIGluIGFueSB3YXksIGVmZmVjdGl2ZWx5nHB1dHRpbmcgdGhlaXIgYXV0aG9yaW5nIHJld2FyZCBhdCByaXNrLgDgTm8gZGVwb3NpdCBvciByZXdhcmQgaXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc3VibWlzc2lvbi5sc2V0X21pbmltdW1fdW50cnVzdGVkX3Njb3JlBAFAbWF5YmVfbmV4dF9zY29yZf0DAVRPcHRpb248RWxlY3Rpb25TY29yZT4AARSwU2V0IGEgbmV3IHZhbHVlIGZvciBgTWluaW11bVVudHJ1c3RlZFNjb3JlYC4A2ERpc3BhdGNoIG9yaWdpbiBtdXN0IGJlIGFsaWduZWQgd2l0aCBgVDo6Rm9yY2VPcmlnaW5gLgDwVGhpcyBjaGVjayBjYW4gYmUgdHVybmVkIG9mZiBieSBzZXR0aW5nIHRoZSB2YWx1ZSB0byBgTm9uZWAudHNldF9lbWVyZ2VuY3lfZWxlY3Rpb25fcmVzdWx0BAEgc3VwcG9ydHMBBAFYU3VwcG9ydHM8VDo6QWNjb3VudElkPgACIFkBU2V0IGEgc29sdXRpb24gaW4gdGhlIHF1ZXVlLCB0byBiZSBoYW5kZWQgb3V0IHRvIHRoZSBjbGllbnQgb2YgdGhpcyBwYWxsZXQgaW4gdGhlIG5leHSIY2FsbCB0byBgRWxlY3Rpb25Qcm92aWRlcjo6ZWxlY3RgLgBFAVRoaXMgY2FuIG9ubHkgYmUgc2V0IGJ5IGBUOjpGb3JjZU9yaWdpbmAsIGFuZCBvbmx5IHdoZW4gdGhlIHBoYXNlIGlzIGBFbWVyZ2VuY3lgLgBhAVRoZSBzb2x1dGlvbiBpcyBub3QgY2hlY2tlZCBmb3IgYW55IGZlYXNpYmlsaXR5IGFuZCBpcyBhc3N1bWVkIHRvIGJlIHRydXN0d29ydGh5LCBhcyBhbnlRAWZlYXNpYmlsaXR5IGNoZWNrIGl0c2VsZiBjYW4gaW4gcHJpbmNpcGxlIGNhdXNlIHRoZSBlbGVjdGlvbiBwcm9jZXNzIHRvIGZhaWwgKGR1ZSB0b2htZW1vcnkvd2VpZ2h0IGNvbnN0cmFpbnMpLhhzdWJtaXQEATByYXdfc29sdXRpb24lAwGwQm94PFJhd1NvbHV0aW9uPFNvbHV0aW9uT2Y8VDo6TWluZXJDb25maWc+Pj4AAyScU3VibWl0IGEgc29sdXRpb24gZm9yIHRoZSBzaWduZWQgcGhhc2UuANBUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvIHRoaXMgY2FsbCBtdXN0IGJlIF9fc2lnbmVkX18uAF0BVGhlIHNvbHV0aW9uIGlzIHBvdGVudGlhbGx5IHF1ZXVlZCwgYmFzZWQgb24gdGhlIGNsYWltZWQgc2NvcmUgYW5kIHByb2Nlc3NlZCBhdCB0aGUgZW5kUG9mIHRoZSBzaWduZWQgcGhhc2UuAF0BQSBkZXBvc2l0IGlzIHJlc2VydmVkIGFuZCByZWNvcmRlZCBmb3IgdGhlIHNvbHV0aW9uLiBCYXNlZCBvbiB0aGUgb3V0Y29tZSwgdGhlIHNvbHV0aW9uFQFtaWdodCBiZSByZXdhcmRlZCwgc2xhc2hlZCwgb3IgZ2V0IGFsbCBvciBhIHBhcnQgb2YgdGhlIGRlcG9zaXQgYmFjay5MZ292ZXJuYW5jZV9mYWxsYmFjawgBQG1heWJlX21heF92b3RlcnNhAgEsT3B0aW9uPHUzMj4AAURtYXliZV9tYXhfdGFyZ2V0c2ECASxPcHRpb248dTMyPgAEEIBUcmlnZ2VyIHRoZSBnb3Zlcm5hbmNlIGZhbGxiYWNrLgBJAVRoaXMgY2FuIG9ubHkgYmUgY2FsbGVkIHdoZW4gW2BQaGFzZTo6RW1lcmdlbmN5YF0gaXMgZW5hYmxlZCwgYXMgYW4gYWx0ZXJuYXRpdmUgdG/AY2FsbGluZyBbYENhbGw6OnNldF9lbWVyZ2VuY3lfZWxlY3Rpb25fcmVzdWx0YF0uBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLiUDCJBwYWxsZXRfZWxlY3Rpb25fcHJvdmlkZXJfbXVsdGlfcGhhc2UsUmF3U29sdXRpb24EBFMBKQMADAEgc29sdXRpb24pAwEEUwABFHNjb3Jl9QMBNEVsZWN0aW9uU2NvcmUAARRyb3VuZBABDHUzMgAAKQMINHBhc2VvX3J1bnRpbWVUTnBvc0NvbXBhY3RTb2x1dGlvbjE2AABAARh2b3RlczEtAwAAARh2b3RlczI5AwAAARh2b3RlczNNAwAAARh2b3RlczRZAwAAARh2b3RlczVlAwAAARh2b3RlczZxAwAAARh2b3Rlczd9AwAAARh2b3RlcziJAwAAARh2b3RlczmVAwAAARx2b3RlczEwoQMAAAEcdm90ZXMxMa0DAAABHHZvdGVzMTK5AwAAARx2b3RlczEzxQMAAAEcdm90ZXMxNNEDAAABHHZvdGVzMTXdAwAAARx2b3RlczE26QMAAAAtAwAAAjEDADEDAAAECOw1AwA1AwAABm0BADkDAAACPQMAPQMAAAQM7EEDNQMAQQMAAAQINQNFAwBFAwAABkkDAEkDDDRzcF9hcml0aG1ldGljKHBlcl90aGluZ3MYUGVyVTE2AAAEAG0BAQx1MTYAAE0DAAACUQMAUQMAAAQM7FUDNQMAVQMAAAMCAAAAQQMAWQMAAAJdAwBdAwAABAzsYQM1AwBhAwAAAwMAAABBAwBlAwAAAmkDAGkDAAAEDOxtAzUDAG0DAAADBAAAAEEDAHEDAAACdQMAdQMAAAQM7HkDNQMAeQMAAAMFAAAAQQMAfQMAAAKBAwCBAwAABAzshQM1AwCFAwAAAwYAAABBAwCJAwAAAo0DAI0DAAAEDOyRAzUDAJEDAAADBwAAAEEDAJUDAAACmQMAmQMAAAQM7J0DNQMAnQMAAAMIAAAAQQMAoQMAAAKlAwClAwAABAzsqQM1AwCpAwAAAwkAAABBAwCtAwAAArEDALEDAAAEDOy1AzUDALUDAAADCgAAAEEDALkDAAACvQMAvQMAAAQM7MEDNQMAwQMAAAMLAAAAQQMAxQMAAALJAwDJAwAABAzszQM1AwDNAwAAAwwAAABBAwDRAwAAAtUDANUDAAAEDOzZAzUDANkDAAADDQAAAEEDAN0DAAAC4QMA4QMAAAQM7OUDNQMA5QMAAAMOAAAAQQMA6QMAAALtAwDtAwAABAzs8QM1AwDxAwAAAw8AAABBAwD1AwhEc3BfbnBvc19lbGVjdGlvbnM0RWxlY3Rpb25TY29yZQAADAE0bWluaW1hbF9zdGFrZRgBPEV4dGVuZGVkQmFsYW5jZQABJHN1bV9zdGFrZRgBPEV4dGVuZGVkQmFsYW5jZQABRHN1bV9zdGFrZV9zcXVhcmVkGAE8RXh0ZW5kZWRCYWxhbmNlAAD5AwiQcGFsbGV0X2VsZWN0aW9uX3Byb3ZpZGVyX211bHRpX3BoYXNlWFNvbHV0aW9uT3JTbmFwc2hvdFNpemUAAAgBGHZvdGVyc+wBDHUzMgABHHRhcmdldHPsAQx1MzIAAP0DBBhPcHRpb24EBFQB9QMBCBBOb25lAAAAEFNvbWUEAPUDAAABAAABBAAAAgUEAAUEAAAECAAJBAAJBAhEc3BfbnBvc19lbGVjdGlvbnMcU3VwcG9ydAQkQWNjb3VudElkAQAACAEUdG90YWwYATxFeHRlbmRlZEJhbGFuY2UAARh2b3RlcnMNBAGEVmVjPChBY2NvdW50SWQsIEV4dGVuZGVkQmFsYW5jZSk+AAANBAAAAhEEABEEAAAECAAYABUEDEBwYWxsZXRfYmFnc19saXN0GHBhbGxldBBDYWxsCARUAARJAAEMFHJlYmFnBAEoZGlzbG9jYXRlZMUBAVBBY2NvdW50SWRMb29rdXBPZjxUPgAAKFkBRGVjbGFyZSB0aGF0IHNvbWUgYGRpc2xvY2F0ZWRgIGFjY291bnQgaGFzLCB0aHJvdWdoIHJld2FyZHMgb3IgcGVuYWx0aWVzLCBzdWZmaWNpZW50bHlRAWNoYW5nZWQgaXRzIHNjb3JlIHRoYXQgaXQgc2hvdWxkIHByb3Blcmx5IGZhbGwgaW50byBhIGRpZmZlcmVudCBiYWcgdGhhbiBpdHMgY3VycmVudBBvbmUuAB0BQW55b25lIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24gYWJvdXQgYW55IHBvdGVudGlhbGx5IGRpc2xvY2F0ZWQgYWNjb3VudC4ASQFXaWxsIGFsd2F5cyB1cGRhdGUgdGhlIHN0b3JlZCBzY29yZSBvZiBgZGlzbG9jYXRlZGAgdG8gdGhlIGNvcnJlY3Qgc2NvcmUsIGJhc2VkIG9uQGBTY29yZVByb3ZpZGVyYC4A1ElmIGBkaXNsb2NhdGVkYCBkb2VzIG5vdCBleGlzdHMsIGl0IHJldHVybnMgYW4gZXJyb3IuPHB1dF9pbl9mcm9udF9vZgQBHGxpZ2h0ZXLFAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AASjQTW92ZSB0aGUgY2FsbGVyJ3MgSWQgZGlyZWN0bHkgaW4gZnJvbnQgb2YgYGxpZ2h0ZXJgLgBZAVRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfIGFuZCBjYW4gb25seSBiZSBjYWxsZWQgYnkgdGhlIElkIG9mNQF0aGUgYWNjb3VudCBnb2luZyBpbiBmcm9udCBvZiBgbGlnaHRlcmAuIEZlZSBpcyBwYXllZCBieSB0aGUgb3JpZ2luIHVuZGVyIGFsbDhjaXJjdW1zdGFuY2VzLgA4T25seSB3b3JrcyBpZjoAlC0gYm90aCBub2RlcyBhcmUgd2l0aGluIHRoZSBzYW1lIGJhZyzQLSBhbmQgYG9yaWdpbmAgaGFzIGEgZ3JlYXRlciBgU2NvcmVgIHRoYW4gYGxpZ2h0ZXJgLlRwdXRfaW5fZnJvbnRfb2Zfb3RoZXIIARxoZWF2aWVyxQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEcbGlnaHRlcsUBAVBBY2NvdW50SWRMb29rdXBPZjxUPgACDBEBU2FtZSBhcyBbYFBhbGxldDo6cHV0X2luX2Zyb250X29mYF0sIGJ1dCBpdCBjYW4gYmUgY2FsbGVkIGJ5IGFueW9uZS4AyEZlZSBpcyBwYWlkIGJ5IHRoZSBvcmlnaW4gdW5kZXIgYWxsIGNpcmN1bXN0YW5jZXMuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLhkEDFxwYWxsZXRfbm9taW5hdGlvbl9wb29scxhwYWxsZXQQQ2FsbAQEVAABaBBqb2luCAEYYW1vdW50/AEwQmFsYW5jZU9mPFQ+AAEccG9vbF9pZBABGFBvb2xJZAAAKEUBU3Rha2UgZnVuZHMgd2l0aCBhIHBvb2wuIFRoZSBhbW91bnQgdG8gYm9uZCBpcyB0cmFuc2ZlcnJlZCBmcm9tIHRoZSBtZW1iZXIgdG8gdGhl3HBvb2xzIGFjY291bnQgYW5kIGltbWVkaWF0ZWx5IGluY3JlYXNlcyB0aGUgcG9vbHMgYm9uZC4AGCMgTm90ZQDMKiBBbiBhY2NvdW50IGNhbiBvbmx5IGJlIGEgbWVtYmVyIG9mIGEgc2luZ2xlIHBvb2wu2CogQW4gYWNjb3VudCBjYW5ub3Qgam9pbiB0aGUgc2FtZSBwb29sIG11bHRpcGxlIHRpbWVzLkEBKiBUaGlzIGNhbGwgd2lsbCAqbm90KiBkdXN0IHRoZSBtZW1iZXIgYWNjb3VudCwgc28gdGhlIG1lbWJlciBtdXN0IGhhdmUgYXQgbGVhc3TIICBgZXhpc3RlbnRpYWwgZGVwb3NpdCArIGFtb3VudGAgaW4gdGhlaXIgYWNjb3VudC7QKiBPbmx5IGEgcG9vbCB3aXRoIFtgUG9vbFN0YXRlOjpPcGVuYF0gY2FuIGJlIGpvaW5lZChib25kX2V4dHJhBAEUZXh0cmEdBAFcQm9uZEV4dHJhPEJhbGFuY2VPZjxUPj4AARxFAUJvbmQgYGV4dHJhYCBtb3JlIGZ1bmRzIGZyb20gYG9yaWdpbmAgaW50byB0aGUgcG9vbCB0byB3aGljaCB0aGV5IGFscmVhZHkgYmVsb25nLgBJAUFkZGl0aW9uYWwgZnVuZHMgY2FuIGNvbWUgZnJvbSBlaXRoZXIgdGhlIGZyZWUgYmFsYW5jZSBvZiB0aGUgYWNjb3VudCwgb2YgZnJvbSB0aGWcYWNjdW11bGF0ZWQgcmV3YXJkcywgc2VlIFtgQm9uZEV4dHJhYF0uAD0BQm9uZGluZyBleHRyYSBmdW5kcyBpbXBsaWVzIGFuIGF1dG9tYXRpYyBwYXlvdXQgb2YgYWxsIHBlbmRpbmcgcmV3YXJkcyBhcyB3ZWxsLgkBU2VlIGBib25kX2V4dHJhX290aGVyYCB0byBib25kIHBlbmRpbmcgcmV3YXJkcyBvZiBgb3RoZXJgIG1lbWJlcnMuMGNsYWltX3BheW91dAACIFUBQSBib25kZWQgbWVtYmVyIGNhbiB1c2UgdGhpcyB0byBjbGFpbSB0aGVpciBwYXlvdXQgYmFzZWQgb24gdGhlIHJld2FyZHMgdGhhdCB0aGUgcG9vbGEBaGFzIGFjY3VtdWxhdGVkIHNpbmNlIHRoZWlyIGxhc3QgY2xhaW1lZCBwYXlvdXQgKE9SIHNpbmNlIGpvaW5pbmcgaWYgdGhpcyBpcyB0aGVpciBmaXJzdD0BdGltZSBjbGFpbWluZyByZXdhcmRzKS4gVGhlIHBheW91dCB3aWxsIGJlIHRyYW5zZmVycmVkIHRvIHRoZSBtZW1iZXIncyBhY2NvdW50LgBJAVRoZSBtZW1iZXIgd2lsbCBlYXJuIHJld2FyZHMgcHJvIHJhdGEgYmFzZWQgb24gdGhlIG1lbWJlcnMgc3Rha2UgdnMgdGhlIHN1bSBvZiB0aGXQbWVtYmVycyBpbiB0aGUgcG9vbHMgc3Rha2UuIFJld2FyZHMgZG8gbm90ICJleHBpcmUiLgBBAVNlZSBgY2xhaW1fcGF5b3V0X290aGVyYCB0byBjbGFpbSByZXdhcmRzIG9uIGJlaGFsZiBvZiBzb21lIGBvdGhlcmAgcG9vbCBtZW1iZXIuGHVuYm9uZAgBOG1lbWJlcl9hY2NvdW50xQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAFAdW5ib25kaW5nX3BvaW50c/wBMEJhbGFuY2VPZjxUPgADfEUBVW5ib25kIHVwIHRvIGB1bmJvbmRpbmdfcG9pbnRzYCBvZiB0aGUgYG1lbWJlcl9hY2NvdW50YCdzIGZ1bmRzIGZyb20gdGhlIHBvb2wuIEl0RQFpbXBsaWNpdGx5IGNvbGxlY3RzIHRoZSByZXdhcmRzIG9uZSBsYXN0IHRpbWUsIHNpbmNlIG5vdCBkb2luZyBzbyB3b3VsZCBtZWFuIHNvbWVscmV3YXJkcyB3b3VsZCBiZSBmb3JmZWl0ZWQuAE0BVW5kZXIgY2VydGFpbiBjb25kaXRpb25zLCB0aGlzIGNhbGwgY2FuIGJlIGRpc3BhdGNoZWQgcGVybWlzc2lvbmxlc3NseSAoaS5lLiBieSBhbnkkYWNjb3VudCkuAKwjIENvbmRpdGlvbnMgZm9yIGEgcGVybWlzc2lvbmxlc3MgZGlzcGF0Y2guAF0BKiBUaGUgcG9vbCBpcyBibG9ja2VkIGFuZCB0aGUgY2FsbGVyIGlzIGVpdGhlciB0aGUgcm9vdCBvciBib3VuY2VyLiBUaGlzIGlzIHJlZmVyZWVkIHRvMCAgYXMgYSBraWNrLvQqIFRoZSBwb29sIGlzIGRlc3Ryb3lpbmcgYW5kIHRoZSBtZW1iZXIgaXMgbm90IHRoZSBkZXBvc2l0b3IuVQEqIFRoZSBwb29sIGlzIGRlc3Ryb3lpbmcsIHRoZSBtZW1iZXIgaXMgdGhlIGRlcG9zaXRvciBhbmQgbm8gb3RoZXIgbWVtYmVycyBhcmUgaW4gdGhlHCAgcG9vbC4AEQEjIyBDb25kaXRpb25zIGZvciBwZXJtaXNzaW9uZWQgZGlzcGF0Y2ggKGkuZS4gdGhlIGNhbGxlciBpcyBhbHNvIHRoZUhgbWVtYmVyX2FjY291bnRgKToAiCogVGhlIGNhbGxlciBpcyBub3QgdGhlIGRlcG9zaXRvci5VASogVGhlIGNhbGxlciBpcyB0aGUgZGVwb3NpdG9yLCB0aGUgcG9vbCBpcyBkZXN0cm95aW5nIGFuZCBubyBvdGhlciBtZW1iZXJzIGFyZSBpbiB0aGUcICBwb29sLgAYIyBOb3RlAB0BSWYgdGhlcmUgYXJlIHRvbyBtYW55IHVubG9ja2luZyBjaHVua3MgdG8gdW5ib25kIHdpdGggdGhlIHBvb2wgYWNjb3VudCxRAVtgQ2FsbDo6cG9vbF93aXRoZHJhd191bmJvbmRlZGBdIGNhbiBiZSBjYWxsZWQgdG8gdHJ5IGFuZCBtaW5pbWl6ZSB1bmxvY2tpbmcgY2h1bmtzLlkBVGhlIFtgU3Rha2luZ0ludGVyZmFjZTo6dW5ib25kYF0gd2lsbCBpbXBsaWNpdGx5IGNhbGwgW2BDYWxsOjpwb29sX3dpdGhkcmF3X3VuYm9uZGVkYF1VAXRvIHRyeSB0byBmcmVlIGNodW5rcyBpZiBuZWNlc3NhcnkgKGllLiBpZiB1bmJvdW5kIHdhcyBjYWxsZWQgYW5kIG5vIHVubG9ja2luZyBjaHVua3NhAWFyZSBhdmFpbGFibGUpLiBIb3dldmVyLCBpdCBtYXkgbm90IGJlIHBvc3NpYmxlIHRvIHJlbGVhc2UgdGhlIGN1cnJlbnQgdW5sb2NraW5nIGNodW5rcyxdAWluIHdoaWNoIGNhc2UsIHRoZSByZXN1bHQgb2YgdGhpcyBjYWxsIHdpbGwgbGlrZWx5IGJlIHRoZSBgTm9Nb3JlQ2h1bmtzYCBlcnJvciBmcm9tIHRoZTxzdGFraW5nIHN5c3RlbS5YcG9vbF93aXRoZHJhd191bmJvbmRlZAgBHHBvb2xfaWQQARhQb29sSWQAAUhudW1fc2xhc2hpbmdfc3BhbnMQAQx1MzIABBhVAUNhbGwgYHdpdGhkcmF3X3VuYm9uZGVkYCBmb3IgdGhlIHBvb2xzIGFjY291bnQuIFRoaXMgY2FsbCBjYW4gYmUgbWFkZSBieSBhbnkgYWNjb3VudC4AQQFUaGlzIGlzIHVzZWZ1bCBpZiB0aGVyZSBhcmUgdG9vIG1hbnkgdW5sb2NraW5nIGNodW5rcyB0byBjYWxsIGB1bmJvbmRgLCBhbmQgc29tZWEBY2FuIGJlIGNsZWFyZWQgYnkgd2l0aGRyYXdpbmcuIEluIHRoZSBjYXNlIHRoZXJlIGFyZSB0b28gbWFueSB1bmxvY2tpbmcgY2h1bmtzLCB0aGUgdXNlclEBd291bGQgcHJvYmFibHkgc2VlIGFuIGVycm9yIGxpa2UgYE5vTW9yZUNodW5rc2AgZW1pdHRlZCBmcm9tIHRoZSBzdGFraW5nIHN5c3RlbSB3aGVuXHRoZXkgYXR0ZW1wdCB0byB1bmJvbmQuRHdpdGhkcmF3X3VuYm9uZGVkCAE4bWVtYmVyX2FjY291bnTFAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AAUhudW1fc2xhc2hpbmdfc3BhbnMQAQx1MzIABVhVAVdpdGhkcmF3IHVuYm9uZGVkIGZ1bmRzIGZyb20gYG1lbWJlcl9hY2NvdW50YC4gSWYgbm8gYm9uZGVkIGZ1bmRzIGNhbiBiZSB1bmJvbmRlZCwgYW5IZXJyb3IgaXMgcmV0dXJuZWQuAE0BVW5kZXIgY2VydGFpbiBjb25kaXRpb25zLCB0aGlzIGNhbGwgY2FuIGJlIGRpc3BhdGNoZWQgcGVybWlzc2lvbmxlc3NseSAoaS5lLiBieSBhbnkkYWNjb3VudCkuAKgjIENvbmRpdGlvbnMgZm9yIGEgcGVybWlzc2lvbmxlc3MgZGlzcGF0Y2gACQEqIFRoZSBwb29sIGlzIGluIGRlc3Ryb3kgbW9kZSBhbmQgdGhlIHRhcmdldCBpcyBub3QgdGhlIGRlcG9zaXRvci4xASogVGhlIHRhcmdldCBpcyB0aGUgZGVwb3NpdG9yIGFuZCB0aGV5IGFyZSB0aGUgb25seSBtZW1iZXIgaW4gdGhlIHN1YiBwb29scy4NASogVGhlIHBvb2wgaXMgYmxvY2tlZCBhbmQgdGhlIGNhbGxlciBpcyBlaXRoZXIgdGhlIHJvb3Qgb3IgYm91bmNlci4AmCMgQ29uZGl0aW9ucyBmb3IgcGVybWlzc2lvbmVkIGRpc3BhdGNoAOgqIFRoZSBjYWxsZXIgaXMgdGhlIHRhcmdldCBhbmQgdGhleSBhcmUgbm90IHRoZSBkZXBvc2l0b3IuABgjIE5vdGUA9C0gSWYgdGhlIHRhcmdldCBpcyB0aGUgZGVwb3NpdG9yLCB0aGUgcG9vbCB3aWxsIGJlIGRlc3Ryb3llZC5hAS0gSWYgdGhlIHBvb2wgaGFzIGFueSBwZW5kaW5nIHNsYXNoLCB3ZSBhbHNvIHRyeSB0byBzbGFzaCB0aGUgbWVtYmVyIGJlZm9yZSBsZXR0aW5nIHRoZW1dAXdpdGhkcmF3LiBUaGlzIGNhbGN1bGF0aW9uIGFkZHMgc29tZSB3ZWlnaHQgb3ZlcmhlYWQgYW5kIGlzIG9ubHkgZGVmZW5zaXZlLiBJbiByZWFsaXR5LFUBcG9vbCBzbGFzaGVzIG11c3QgaGF2ZSBiZWVuIGFscmVhZHkgYXBwbGllZCB2aWEgcGVybWlzc2lvbmxlc3MgW2BDYWxsOjphcHBseV9zbGFzaGBdLhhjcmVhdGUQARhhbW91bnT8ATBCYWxhbmNlT2Y8VD4AARByb290xQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEkbm9taW5hdG9yxQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEcYm91bmNlcsUBAVBBY2NvdW50SWRMb29rdXBPZjxUPgAGRHRDcmVhdGUgYSBuZXcgZGVsZWdhdGlvbiBwb29sLgAsIyBBcmd1bWVudHMAVQEqIGBhbW91bnRgIC0gVGhlIGFtb3VudCBvZiBmdW5kcyB0byBkZWxlZ2F0ZSB0byB0aGUgcG9vbC4gVGhpcyBhbHNvIGFjdHMgb2YgYSBzb3J0IG9mTQEgIGRlcG9zaXQgc2luY2UgdGhlIHBvb2xzIGNyZWF0b3IgY2Fubm90IGZ1bGx5IHVuYm9uZCBmdW5kcyB1bnRpbCB0aGUgcG9vbCBpcyBiZWluZzAgIGRlc3Ryb3llZC5RASogYGluZGV4YCAtIEEgZGlzYW1iaWd1YXRpb24gaW5kZXggZm9yIGNyZWF0aW5nIHRoZSBhY2NvdW50LiBMaWtlbHkgb25seSB1c2VmdWwgd2hlbsAgIGNyZWF0aW5nIG11bHRpcGxlIHBvb2xzIGluIHRoZSBzYW1lIGV4dHJpbnNpYy7UKiBgcm9vdGAgLSBUaGUgYWNjb3VudCB0byBzZXQgYXMgW2BQb29sUm9sZXM6OnJvb3RgXS4NASogYG5vbWluYXRvcmAgLSBUaGUgYWNjb3VudCB0byBzZXQgYXMgdGhlIFtgUG9vbFJvbGVzOjpub21pbmF0b3JgXS78KiBgYm91bmNlcmAgLSBUaGUgYWNjb3VudCB0byBzZXQgYXMgdGhlIFtgUG9vbFJvbGVzOjpib3VuY2VyYF0uABgjIE5vdGUAYQFJbiBhZGRpdGlvbiB0byBgYW1vdW50YCwgdGhlIGNhbGxlciB3aWxsIHRyYW5zZmVyIHRoZSBleGlzdGVudGlhbCBkZXBvc2l0OyBzbyB0aGUgY2FsbGVyDQFuZWVkcyBhdCBoYXZlIGF0IGxlYXN0IGBhbW91bnQgKyBleGlzdGVudGlhbF9kZXBvc2l0YCB0cmFuc2ZlcmFibGUuTGNyZWF0ZV93aXRoX3Bvb2xfaWQUARhhbW91bnT8ATBCYWxhbmNlT2Y8VD4AARByb290xQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEkbm9taW5hdG9yxQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEcYm91bmNlcsUBAVBBY2NvdW50SWRMb29rdXBPZjxUPgABHHBvb2xfaWQQARhQb29sSWQABxjsQ3JlYXRlIGEgbmV3IGRlbGVnYXRpb24gcG9vbCB3aXRoIGEgcHJldmlvdXNseSB1c2VkIHBvb2wgaWQALCMgQXJndW1lbnRzAJhzYW1lIGFzIGBjcmVhdGVgIHdpdGggdGhlIGluY2x1c2lvbiBvZngqIGBwb29sX2lkYCAtIGBBIHZhbGlkIFBvb2xJZC4gbm9taW5hdGUIARxwb29sX2lkEAEYUG9vbElkAAEodmFsaWRhdG9yc9EBAURWZWM8VDo6QWNjb3VudElkPgAIMHxOb21pbmF0ZSBvbiBiZWhhbGYgb2YgdGhlIHBvb2wuAEUBVGhlIGRpc3BhdGNoIG9yaWdpbiBvZiB0aGlzIGNhbGwgbXVzdCBiZSBzaWduZWQgYnkgdGhlIHBvb2wgbm9taW5hdG9yIG9yIHRoZSBwb29sKHJvb3Qgcm9sZS4ASQFUaGlzIGRpcmVjdGx5IGZvcndhcmQgdGhlIGNhbGwgdG8gdGhlIHN0YWtpbmcgcGFsbGV0LCBvbiBiZWhhbGYgb2YgdGhlIHBvb2wgYm9uZGVkIGFjY291bnQuABgjIE5vdGUAXQFJbiBhZGRpdGlvbiB0byBhIGByb290YCBvciBgbm9taW5hdG9yYCByb2xlIG9mIGBvcmlnaW5gLCBwb29sJ3MgZGVwb3NpdG9yIG5lZWRzIHRvIGhhdmX4YXQgbGVhc3QgYGRlcG9zaXRvcl9taW5fYm9uZGAgaW4gdGhlIHBvb2wgdG8gc3RhcnQgbm9taW5hdGluZy4kc2V0X3N0YXRlCAEccG9vbF9pZBABGFBvb2xJZAABFHN0YXRlIQQBJFBvb2xTdGF0ZQAJKHRTZXQgYSBuZXcgc3RhdGUgZm9yIHRoZSBwb29sLgBVAUlmIGEgcG9vbCBpcyBhbHJlYWR5IGluIHRoZSBgRGVzdHJveWluZ2Agc3RhdGUsIHRoZW4gdW5kZXIgbm8gY29uZGl0aW9uIGNhbiBpdHMgc3RhdGU0Y2hhbmdlIGFnYWluLgDAVGhlIGRpc3BhdGNoIG9yaWdpbiBvZiB0aGlzIGNhbGwgbXVzdCBiZSBlaXRoZXI6ANwxLiBzaWduZWQgYnkgdGhlIGJvdW5jZXIsIG9yIHRoZSByb290IHJvbGUgb2YgdGhlIHBvb2wsXQEyLiBpZiB0aGUgcG9vbCBjb25kaXRpb25zIHRvIGJlIG9wZW4gYXJlIE5PVCBtZXQgKGFzIGRlc2NyaWJlZCBieSBgb2tfdG9fYmVfb3BlbmApLCBhbmQ5ASAgIHRoZW4gdGhlIHN0YXRlIG9mIHRoZSBwb29sIGNhbiBiZSBwZXJtaXNzaW9ubGVzc2x5IGNoYW5nZWQgdG8gYERlc3Ryb3lpbmdgLjBzZXRfbWV0YWRhdGEIARxwb29sX2lkEAEYUG9vbElkAAEgbWV0YWRhdGE4ARxWZWM8dTg+AAoQgFNldCBhIG5ldyBtZXRhZGF0YSBmb3IgdGhlIHBvb2wuAF0BVGhlIGRpc3BhdGNoIG9yaWdpbiBvZiB0aGlzIGNhbGwgbXVzdCBiZSBzaWduZWQgYnkgdGhlIGJvdW5jZXIsIG9yIHRoZSByb290IHJvbGUgb2YgdGhlFHBvb2wuLHNldF9jb25maWdzGAE0bWluX2pvaW5fYm9uZCUEAVhDb25maWdPcDxCYWxhbmNlT2Y8VD4+AAE8bWluX2NyZWF0ZV9ib25kJQQBWENvbmZpZ09wPEJhbGFuY2VPZjxUPj4AASRtYXhfcG9vbHMpBAE0Q29uZmlnT3A8dTMyPgABLG1heF9tZW1iZXJzKQQBNENvbmZpZ09wPHUzMj4AAVBtYXhfbWVtYmVyc19wZXJfcG9vbCkEATRDb25maWdPcDx1MzI+AAFUZ2xvYmFsX21heF9jb21taXNzaW9uLQQBRENvbmZpZ09wPFBlcmJpbGw+AAssQQFVcGRhdGUgY29uZmlndXJhdGlvbnMgZm9yIHRoZSBub21pbmF0aW9uIHBvb2xzLiBUaGUgb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZWBbYENvbmZpZzo6QWRtaW5PcmlnaW5gXS4ALCMgQXJndW1lbnRzAKAqIGBtaW5fam9pbl9ib25kYCAtIFNldCBbYE1pbkpvaW5Cb25kYF0usCogYG1pbl9jcmVhdGVfYm9uZGAgLSBTZXQgW2BNaW5DcmVhdGVCb25kYF0uhCogYG1heF9wb29sc2AgLSBTZXQgW2BNYXhQb29sc2BdLqQqIGBtYXhfbWVtYmVyc2AgLSBTZXQgW2BNYXhQb29sTWVtYmVyc2BdLuQqIGBtYXhfbWVtYmVyc19wZXJfcG9vbGAgLSBTZXQgW2BNYXhQb29sTWVtYmVyc1BlclBvb2xgXS7gKiBgZ2xvYmFsX21heF9jb21taXNzaW9uYCAtIFNldCBbYEdsb2JhbE1heENvbW1pc3Npb25gXS4wdXBkYXRlX3JvbGVzEAEccG9vbF9pZBABGFBvb2xJZAABIG5ld19yb290MQQBWENvbmZpZ09wPFQ6OkFjY291bnRJZD4AATRuZXdfbm9taW5hdG9yMQQBWENvbmZpZ09wPFQ6OkFjY291bnRJZD4AASxuZXdfYm91bmNlcjEEAVhDb25maWdPcDxUOjpBY2NvdW50SWQ+AAwcdFVwZGF0ZSB0aGUgcm9sZXMgb2YgdGhlIHBvb2wuAD0BVGhlIHJvb3QgaXMgdGhlIG9ubHkgZW50aXR5IHRoYXQgY2FuIGNoYW5nZSBhbnkgb2YgdGhlIHJvbGVzLCBpbmNsdWRpbmcgaXRzZWxmLLhleGNsdWRpbmcgdGhlIGRlcG9zaXRvciwgd2hvIGNhbiBuZXZlciBjaGFuZ2UuAFEBSXQgZW1pdHMgYW4gZXZlbnQsIG5vdGlmeWluZyBVSXMgb2YgdGhlIHJvbGUgY2hhbmdlLiBUaGlzIGV2ZW50IGlzIHF1aXRlIHJlbGV2YW50IHRvHQFtb3N0IHBvb2wgbWVtYmVycyBhbmQgdGhleSBzaG91bGQgYmUgaW5mb3JtZWQgb2YgY2hhbmdlcyB0byBwb29sIHJvbGVzLhRjaGlsbAQBHHBvb2xfaWQQARhQb29sSWQADUBwQ2hpbGwgb24gYmVoYWxmIG9mIHRoZSBwb29sLgBBAVRoZSBkaXNwYXRjaCBvcmlnaW4gb2YgdGhpcyBjYWxsIGNhbiBiZSBzaWduZWQgYnkgdGhlIHBvb2wgbm9taW5hdG9yIG9yIHRoZSBwb29soHJvb3Qgcm9sZSwgc2FtZSBhcyBbYFBhbGxldDo6bm9taW5hdGVgXS4ATQFVbmRlciBjZXJ0YWluIGNvbmRpdGlvbnMsIHRoaXMgY2FsbCBjYW4gYmUgZGlzcGF0Y2hlZCBwZXJtaXNzaW9ubGVzc2x5IChpLmUuIGJ5IGFueSRhY2NvdW50KS4ArCMgQ29uZGl0aW9ucyBmb3IgYSBwZXJtaXNzaW9ubGVzcyBkaXNwYXRjaDpZASogV2hlbiBwb29sIGRlcG9zaXRvciBoYXMgbGVzcyB0aGFuIGBNaW5Ob21pbmF0b3JCb25kYCBzdGFrZWQsIG90aGVyd2lzZSAgcG9vbCBtZW1iZXJzXCAgYXJlIHVuYWJsZSB0byB1bmJvbmQuAJwjIENvbmRpdGlvbnMgZm9yIHBlcm1pc3Npb25lZCBkaXNwYXRjaDrYKiBUaGUgY2FsbGVyIGhhcyBhIG5vbWluYXRvciBvciByb290IHJvbGUgb2YgdGhlIHBvb2wuSQFUaGlzIGRpcmVjdGx5IGZvcndhcmQgdGhlIGNhbGwgdG8gdGhlIHN0YWtpbmcgcGFsbGV0LCBvbiBiZWhhbGYgb2YgdGhlIHBvb2wgYm9uZGVkIGFjY291bnQuQGJvbmRfZXh0cmFfb3RoZXIIARhtZW1iZXLFAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AARRleHRyYR0EAVxCb25kRXh0cmE8QmFsYW5jZU9mPFQ+PgAOJFUBYG9yaWdpbmAgYm9uZHMgZnVuZHMgZnJvbSBgZXh0cmFgIGZvciBzb21lIHBvb2wgbWVtYmVyIGBtZW1iZXJgIGludG8gdGhlaXIgcmVzcGVjdGl2ZRhwb29scy4ASQFgb3JpZ2luYCBjYW4gYm9uZCBleHRyYSBmdW5kcyBmcm9tIGZyZWUgYmFsYW5jZSBvciBwZW5kaW5nIHJld2FyZHMgd2hlbiBgb3JpZ2luID09HG90aGVyYC4ARQFJbiB0aGUgY2FzZSBvZiBgb3JpZ2luICE9IG90aGVyYCwgYG9yaWdpbmAgY2FuIG9ubHkgYm9uZCBleHRyYSBwZW5kaW5nIHJld2FyZHMgb2YVAWBvdGhlcmAgbWVtYmVycyBhc3N1bWluZyBzZXRfY2xhaW1fcGVybWlzc2lvbiBmb3IgdGhlIGdpdmVuIG1lbWJlciBpc8BgUGVybWlzc2lvbmxlc3NDb21wb3VuZGAgb3IgYFBlcm1pc3Npb25sZXNzQWxsYC5Qc2V0X2NsYWltX3Blcm1pc3Npb24EAShwZXJtaXNzaW9uNQQBPENsYWltUGVybWlzc2lvbgAPHEkBQWxsb3dzIGEgcG9vbCBtZW1iZXIgdG8gc2V0IGEgY2xhaW0gcGVybWlzc2lvbiB0byBhbGxvdyBvciBkaXNhbGxvdyBwZXJtaXNzaW9ubGVzc2Bib25kaW5nIGFuZCB3aXRoZHJhd2luZy4ALCMgQXJndW1lbnRzAHgqIGBvcmlnaW5gIC0gTWVtYmVyIG9mIGEgcG9vbC64KiBgcGVybWlzc2lvbmAgLSBUaGUgcGVybWlzc2lvbiB0byBiZSBhcHBsaWVkLkhjbGFpbV9wYXlvdXRfb3RoZXIEARRvdGhlcgABMFQ6OkFjY291bnRJZAAQEAEBYG9yaWdpbmAgY2FuIGNsYWltIHBheW91dHMgb24gc29tZSBwb29sIG1lbWJlciBgb3RoZXJgJ3MgYmVoYWxmLgBVAVBvb2wgbWVtYmVyIGBvdGhlcmAgbXVzdCBoYXZlIGEgYFBlcm1pc3Npb25sZXNzV2l0aGRyYXdgIG9yIGBQZXJtaXNzaW9ubGVzc0FsbGAgY2xhaW2ocGVybWlzc2lvbiBmb3IgdGhpcyBjYWxsIHRvIGJlIHN1Y2Nlc3NmdWwuOHNldF9jb21taXNzaW9uCAEccG9vbF9pZBABGFBvb2xJZAABOG5ld19jb21taXNzaW9uOQQBfE9wdGlvbjwoUGVyYmlsbCwgVDo6QWNjb3VudElkKT4AERR0U2V0IHRoZSBjb21taXNzaW9uIG9mIGEgcG9vbC5VAUJvdGggYSBjb21taXNzaW9uIHBlcmNlbnRhZ2UgYW5kIGEgY29tbWlzc2lvbiBwYXllZSBtdXN0IGJlIHByb3ZpZGVkIGluIHRoZSBgY3VycmVudGBdAXR1cGxlLiBXaGVyZSBhIGBjdXJyZW50YCBvZiBgTm9uZWAgaXMgcHJvdmlkZWQsIGFueSBjdXJyZW50IGNvbW1pc3Npb24gd2lsbCBiZSByZW1vdmVkLgBNAS0gSWYgYSBgTm9uZWAgaXMgc3VwcGxpZWQgdG8gYG5ld19jb21taXNzaW9uYCwgZXhpc3RpbmcgY29tbWlzc2lvbiB3aWxsIGJlIHJlbW92ZWQuSHNldF9jb21taXNzaW9uX21heAgBHHBvb2xfaWQQARhQb29sSWQAAThtYXhfY29tbWlzc2lvbqwBHFBlcmJpbGwAEhSUU2V0IHRoZSBtYXhpbXVtIGNvbW1pc3Npb24gb2YgYSBwb29sLgA5AS0gSW5pdGlhbCBtYXggY2FuIGJlIHNldCB0byBhbnkgYFBlcmJpbGxgLCBhbmQgb25seSBzbWFsbGVyIHZhbHVlcyB0aGVyZWFmdGVyLjUBLSBDdXJyZW50IGNvbW1pc3Npb24gd2lsbCBiZSBsb3dlcmVkIGluIHRoZSBldmVudCBpdCBpcyBoaWdoZXIgdGhhbiBhIG5ldyBtYXg0ICBjb21taXNzaW9uLmhzZXRfY29tbWlzc2lvbl9jaGFuZ2VfcmF0ZQgBHHBvb2xfaWQQARhQb29sSWQAASxjaGFuZ2VfcmF0ZUEEAZxDb21taXNzaW9uQ2hhbmdlUmF0ZTxCbG9ja051bWJlckZvcjxUPj4AExCoU2V0IHRoZSBjb21taXNzaW9uIGNoYW5nZSByYXRlIGZvciBhIHBvb2wuAD0BSW5pdGlhbCBjaGFuZ2UgcmF0ZSBpcyBub3QgYm91bmRlZCwgd2hlcmVhcyBzdWJzZXF1ZW50IHVwZGF0ZXMgY2FuIG9ubHkgYmUgbW9yZXRyZXN0cmljdGl2ZSB0aGFuIHRoZSBjdXJyZW50LkBjbGFpbV9jb21taXNzaW9uBAEccG9vbF9pZBABGFBvb2xJZAAUFGRDbGFpbSBwZW5kaW5nIGNvbW1pc3Npb24uAF0BVGhlIGRpc3BhdGNoIG9yaWdpbiBvZiB0aGlzIGNhbGwgbXVzdCBiZSBzaWduZWQgYnkgdGhlIGByb290YCByb2xlIG9mIHRoZSBwb29sLiBQZW5kaW5nXQFjb21taXNzaW9uIGlzIHBhaWQgb3V0IGFuZCBhZGRlZCB0byB0b3RhbCBjbGFpbWVkIGNvbW1pc3Npb25gLiBUb3RhbCBwZW5kaW5nIGNvbW1pc3Npb254aXMgcmVzZXQgdG8gemVyby4gdGhlIGN1cnJlbnQuTGFkanVzdF9wb29sX2RlcG9zaXQEARxwb29sX2lkEAEYUG9vbElkABUc7FRvcCB1cCB0aGUgZGVmaWNpdCBvciB3aXRoZHJhdyB0aGUgZXhjZXNzIEVEIGZyb20gdGhlIHBvb2wuAFEBV2hlbiBhIHBvb2wgaXMgY3JlYXRlZCwgdGhlIHBvb2wgZGVwb3NpdG9yIHRyYW5zZmVycyBFRCB0byB0aGUgcmV3YXJkIGFjY291bnQgb2YgdGhlVQFwb29sLiBFRCBpcyBzdWJqZWN0IHRvIGNoYW5nZSBhbmQgb3ZlciB0aW1lLCB0aGUgZGVwb3NpdCBpbiB0aGUgcmV3YXJkIGFjY291bnQgbWF5IGJlUQFpbnN1ZmZpY2llbnQgdG8gY292ZXIgdGhlIEVEIGRlZmljaXQgb2YgdGhlIHBvb2wgb3IgdmljZS12ZXJzYSB3aGVyZSB0aGVyZSBpcyBleGNlc3MxAWRlcG9zaXQgdG8gdGhlIHBvb2wuIFRoaXMgY2FsbCBhbGxvd3MgYW55b25lIHRvIGFkanVzdCB0aGUgRUQgZGVwb3NpdCBvZiB0aGX0cG9vbCBieSBlaXRoZXIgdG9wcGluZyB1cCB0aGUgZGVmaWNpdCBvciBjbGFpbWluZyB0aGUgZXhjZXNzLnxzZXRfY29tbWlzc2lvbl9jbGFpbV9wZXJtaXNzaW9uCAEccG9vbF9pZBABGFBvb2xJZAABKHBlcm1pc3Npb25FBAG8T3B0aW9uPENvbW1pc3Npb25DbGFpbVBlcm1pc3Npb248VDo6QWNjb3VudElkPj4AFhDMU2V0IG9yIHJlbW92ZSBhIHBvb2wncyBjb21taXNzaW9uIGNsYWltIHBlcm1pc3Npb24uAGEBRGV0ZXJtaW5lcyB3aG8gY2FuIGNsYWltIHRoZSBwb29sJ3MgcGVuZGluZyBjb21taXNzaW9uLiBPbmx5IHRoZSBgUm9vdGAgcm9sZSBvZiB0aGUgcG9vbMhpcyBhYmxlIHRvIGNvbmZpZ3VyZSBjb21taXNzaW9uIGNsYWltIHBlcm1pc3Npb25zLixhcHBseV9zbGFzaAQBOG1lbWJlcl9hY2NvdW50xQEBUEFjY291bnRJZExvb2t1cE9mPFQ+ABcciEFwcGx5IGEgcGVuZGluZyBzbGFzaCBvbiBhIG1lbWJlci4AJQFGYWlscyB1bmxlc3MgW2BjcmF0ZTo6cGFsbGV0OjpDb25maWc6OlN0YWtlQWRhcHRlcmBdIGlzIG9mIHN0cmF0ZWd5IHR5cGU6pFtgYWRhcHRlcjo6U3Rha2VTdHJhdGVneVR5cGU6OkRlbGVnYXRlYF0uAFUBVGhpcyBjYWxsIGNhbiBiZSBkaXNwYXRjaGVkIHBlcm1pc3Npb25sZXNzbHkgKGkuZS4gYnkgYW55IGFjY291bnQpLiBJZiB0aGUgbWVtYmVyIGhhcx0Bc2xhc2ggdG8gYmUgYXBwbGllZCwgY2FsbGVyIG1heSBiZSByZXdhcmRlZCB3aXRoIHRoZSBwYXJ0IG9mIHRoZSBzbGFzaC5IbWlncmF0ZV9kZWxlZ2F0aW9uBAE4bWVtYmVyX2FjY291bnTFAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AGCQdAU1pZ3JhdGVzIGRlbGVnYXRlZCBmdW5kcyBmcm9tIHRoZSBwb29sIGFjY291bnQgdG8gdGhlIGBtZW1iZXJfYWNjb3VudGAuACUBRmFpbHMgdW5sZXNzIFtgY3JhdGU6OnBhbGxldDo6Q29uZmlnOjpTdGFrZUFkYXB0ZXJgXSBpcyBvZiBzdHJhdGVneSB0eXBlOqRbYGFkYXB0ZXI6OlN0YWtlU3RyYXRlZ3lUeXBlOjpEZWxlZ2F0ZWBdLgApAVRoaXMgaXMgYSBwZXJtaXNzaW9uLWxlc3MgY2FsbCBhbmQgcmVmdW5kcyBhbnkgZmVlIGlmIGNsYWltIGlzIHN1Y2Nlc3NmdWwuAF0BSWYgdGhlIHBvb2wgaGFzIG1pZ3JhdGVkIHRvIGRlbGVnYXRpb24gYmFzZWQgc3Rha2luZywgdGhlIHN0YWtlZCB0b2tlbnMgb2YgcG9vbCBtZW1iZXJzKQFjYW4gYmUgbW92ZWQgYW5kIGhlbGQgaW4gdGhlaXIgb3duIGFjY291bnQuIFNlZSBbYGFkYXB0ZXI6OkRlbGVnYXRlU3Rha2VgXXhtaWdyYXRlX3Bvb2xfdG9fZGVsZWdhdGVfc3Rha2UEARxwb29sX2lkEAEYUG9vbElkABkk9E1pZ3JhdGUgcG9vbCBmcm9tIFtgYWRhcHRlcjo6U3Rha2VTdHJhdGVneVR5cGU6OlRyYW5zZmVyYF0gdG+kW2BhZGFwdGVyOjpTdGFrZVN0cmF0ZWd5VHlwZTo6RGVsZWdhdGVgXS4AJQFGYWlscyB1bmxlc3MgW2BjcmF0ZTo6cGFsbGV0OjpDb25maWc6OlN0YWtlQWRhcHRlcmBdIGlzIG9mIHN0cmF0ZWd5IHR5cGU6pFtgYWRhcHRlcjo6U3Rha2VTdHJhdGVneVR5cGU6OkRlbGVnYXRlYF0uAEEBVGhpcyBjYWxsIGNhbiBiZSBkaXNwYXRjaGVkIHBlcm1pc3Npb25sZXNzbHksIGFuZCByZWZ1bmRzIGFueSBmZWUgaWYgc3VjY2Vzc2Z1bC4ASQFJZiB0aGUgcG9vbCBoYXMgYWxyZWFkeSBtaWdyYXRlZCB0byBkZWxlZ2F0aW9uIGJhc2VkIHN0YWtpbmcsIHRoaXMgY2FsbCB3aWxsIGZhaWwuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLh0ECFxwYWxsZXRfbm9taW5hdGlvbl9wb29scyRCb25kRXh0cmEEHEJhbGFuY2UBGAEILEZyZWVCYWxhbmNlBAAYARxCYWxhbmNlAAAAHFJld2FyZHMAAQAAIQQIXHBhbGxldF9ub21pbmF0aW9uX3Bvb2xzJFBvb2xTdGF0ZQABDBBPcGVuAAAAHEJsb2NrZWQAAQAoRGVzdHJveWluZwACAAAlBAhccGFsbGV0X25vbWluYXRpb25fcG9vbHMgQ29uZmlnT3AEBFQBGAEMEE5vb3AAAAAMU2V0BAAYAQRUAAEAGFJlbW92ZQACAAApBAhccGFsbGV0X25vbWluYXRpb25fcG9vbHMgQ29uZmlnT3AEBFQBEAEMEE5vb3AAAAAMU2V0BAAQAQRUAAEAGFJlbW92ZQACAAAtBAhccGFsbGV0X25vbWluYXRpb25fcG9vbHMgQ29uZmlnT3AEBFQBrAEMEE5vb3AAAAAMU2V0BACsAQRUAAEAGFJlbW92ZQACAAAxBAhccGFsbGV0X25vbWluYXRpb25fcG9vbHMgQ29uZmlnT3AEBFQBAAEMEE5vb3AAAAAMU2V0BAAAAQRUAAEAGFJlbW92ZQACAAA1BAhccGFsbGV0X25vbWluYXRpb25fcG9vbHM8Q2xhaW1QZXJtaXNzaW9uAAEQMFBlcm1pc3Npb25lZAAAAFhQZXJtaXNzaW9ubGVzc0NvbXBvdW5kAAEAWFBlcm1pc3Npb25sZXNzV2l0aGRyYXcAAgBEUGVybWlzc2lvbmxlc3NBbGwAAwAAOQQEGE9wdGlvbgQEVAE9BAEIEE5vbmUAAAAQU29tZQQAPQQAAAEAAD0EAAAECKwAAEEECFxwYWxsZXRfbm9taW5hdGlvbl9wb29sc1BDb21taXNzaW9uQ2hhbmdlUmF0ZQQsQmxvY2tOdW1iZXIBEAAIATBtYXhfaW5jcmVhc2WsARxQZXJiaWxsAAEkbWluX2RlbGF5EAEsQmxvY2tOdW1iZXIAAEUEBBhPcHRpb24EBFQBSQQBCBBOb25lAAAAEFNvbWUEAEkEAAABAABJBAhccGFsbGV0X25vbWluYXRpb25fcG9vbHNkQ29tbWlzc2lvbkNsYWltUGVybWlzc2lvbgQkQWNjb3VudElkAQABCDhQZXJtaXNzaW9ubGVzcwAAABxBY2NvdW50BAAAASRBY2NvdW50SWQAAQAATQQMTHBhbGxldF9mYXN0X3Vuc3Rha2UYcGFsbGV0EENhbGwEBFQAAQxUcmVnaXN0ZXJfZmFzdF91bnN0YWtlAABoiFJlZ2lzdGVyIG9uZXNlbGYgZm9yIGZhc3QtdW5zdGFrZS4ASCMjIERpc3BhdGNoIE9yaWdpbgBFAVRoZSBkaXNwYXRjaCBvcmlnaW4gb2YgdGhpcyBjYWxsIG11c3QgYmUgKnNpZ25lZCogYnkgd2hvZXZlciBpcyBwZXJtaXR0ZWQgdG8gY2FsbPB1bmJvbmQgZnVuZHMgYnkgdGhlIHN0YWtpbmcgc3lzdGVtLiBTZWUgW2BDb25maWc6OlN0YWtpbmdgXS4AKCMjIERldGFpbHMAOQFUaGUgc3Rhc2ggYXNzb2NpYXRlZCB3aXRoIHRoZSBvcmlnaW4gbXVzdCBoYXZlIG5vIG9uZ29pbmcgdW5sb2NraW5nIGNodW5rcy4gSWZdAXN1Y2Nlc3NmdWwsIHRoaXMgd2lsbCBmdWxseSB1bmJvbmQgYW5kIGNoaWxsIHRoZSBzdGFzaC4gVGhlbiwgaXQgd2lsbCBlbnF1ZXVlIHRoZSBzdGFzaIB0byBiZSBjaGVja2VkIGluIGZ1cnRoZXIgYmxvY2tzLgBRAUlmIGJ5IHRoZSB0aW1lIHRoaXMgaXMgY2FsbGVkLCB0aGUgc3Rhc2ggaXMgYWN0dWFsbHkgZWxpZ2libGUgZm9yIGZhc3QtdW5zdGFrZSwgdGhlbkUBdGhleSBhcmUgZ3VhcmFudGVlZCB0byByZW1haW4gZWxpZ2libGUsIGJlY2F1c2UgdGhlIGNhbGwgd2lsbCBjaGlsbCB0aGVtIGFzIHdlbGwuAD0BSWYgdGhlIGNoZWNrIHdvcmtzLCB0aGUgZW50aXJlIHN0YWtpbmcgZGF0YSBpcyByZW1vdmVkLCBpLmUuIHRoZSBzdGFzaCBpcyBmdWxseSR1bnN0YWtlZC4AXQFJZiB0aGUgY2hlY2sgZmFpbHMsIHRoZSBzdGFzaCByZW1haW5zIGNoaWxsZWQgYW5kIHdhaXRpbmcgZm9yIGJlaW5nIHVuYm9uZGVkIGFzIGluIHdpdGhhAXRoZSBub3JtYWwgc3Rha2luZyBzeXN0ZW0sIGJ1dCB0aGV5IGxvc2UgcGFydCBvZiB0aGVpciB1bmJvbmRpbmcgY2h1bmtzIGR1ZSB0byBjb25zdW1pbmdYdGhlIGNoYWluJ3MgcmVzb3VyY2VzLgAkIyMgRXZlbnRzAAkBU29tZSBldmVudHMgZnJvbSB0aGUgc3Rha2luZyBhbmQgY3VycmVuY3kgc3lzdGVtIG1pZ2h0IGJlIGVtaXR0ZWQuKGRlcmVnaXN0ZXIAAUikRGVyZWdpc3RlciBvbmVzZWxmIGZyb20gdGhlIGZhc3QtdW5zdGFrZS4ASCMjIERpc3BhdGNoIE9yaWdpbgBFAVRoZSBkaXNwYXRjaCBvcmlnaW4gb2YgdGhpcyBjYWxsIG11c3QgYmUgKnNpZ25lZCogYnkgd2hvZXZlciBpcyBwZXJtaXR0ZWQgdG8gY2FsbPB1bmJvbmQgZnVuZHMgYnkgdGhlIHN0YWtpbmcgc3lzdGVtLiBTZWUgW2BDb25maWc6OlN0YWtpbmdgXS4AKCMjIERldGFpbHMAYQFUaGlzIGlzIHVzZWZ1bCBpZiBvbmUgaXMgcmVnaXN0ZXJlZCwgdGhleSBhcmUgc3RpbGwgd2FpdGluZywgYW5kIHRoZXkgY2hhbmdlIHRoZWlyIG1pbmQuAFkBTm90ZSB0aGF0IHRoZSBhc3NvY2lhdGVkIHN0YXNoIGlzIHN0aWxsIGZ1bGx5IHVuYm9uZGVkIGFuZCBjaGlsbGVkIGFzIGEgY29uc2VxdWVuY2Ugb2ZZAWNhbGxpbmcgW2BQYWxsZXQ6OnJlZ2lzdGVyX2Zhc3RfdW5zdGFrZWBdLiBUaGVyZWZvcmUsIHRoaXMgc2hvdWxkIHByb2JhYmx5IGJlIGZvbGxvd2VksGJ5IGEgY2FsbCB0byBgcmVib25kYCBpbiB0aGUgc3Rha2luZyBzeXN0ZW0uACQjIyBFdmVudHMACQFTb21lIGV2ZW50cyBmcm9tIHRoZSBzdGFraW5nIGFuZCBjdXJyZW5jeSBzeXN0ZW0gbWlnaHQgYmUgZW1pdHRlZC4cY29udHJvbAQBNGVyYXNfdG9fY2hlY2sQASBFcmFJbmRleAACNJRDb250cm9sIHRoZSBvcGVyYXRpb24gb2YgdGhpcyBwYWxsZXQuAEgjIyBEaXNwYXRjaCBPcmlnaW4ADQFUaGUgZGlzcGF0Y2ggb3JpZ2luIG9mIHRoaXMgY2FsbCBtdXN0IGJlIFtgQ29uZmlnOjpDb250cm9sT3JpZ2luYF0uACgjIyBEZXRhaWxzAEEBQ2FuIHNldCB0aGUgbnVtYmVyIG9mIGVyYXMgdG8gY2hlY2sgcGVyIGJsb2NrLCBhbmQgcG90ZW50aWFsbHkgb3RoZXIgYWRtaW4gd29yay4AJCMjIEV2ZW50cwCkTm8gZXZlbnRzIGFyZSBlbWl0dGVkIGZyb20gdGhpcyBkaXNwYXRjaC4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMuUQQQbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWluczRjb25maWd1cmF0aW9uGHBhbGxldBBDYWxsBARUAAHAfHNldF92YWxpZGF0aW9uX3VwZ3JhZGVfY29vbGRvd24EAQxuZXcQAURCbG9ja051bWJlckZvcjxUPgAABJBTZXQgdGhlIHZhbGlkYXRpb24gdXBncmFkZSBjb29sZG93bi5wc2V0X3ZhbGlkYXRpb25fdXBncmFkZV9kZWxheQQBDG5ldxABREJsb2NrTnVtYmVyRm9yPFQ+AAEEhFNldCB0aGUgdmFsaWRhdGlvbiB1cGdyYWRlIGRlbGF5LmRzZXRfY29kZV9yZXRlbnRpb25fcGVyaW9kBAEMbmV3EAFEQmxvY2tOdW1iZXJGb3I8VD4AAgTQU2V0IHRoZSBhY2NlcHRhbmNlIHBlcmlvZCBmb3IgYW4gaW5jbHVkZWQgY2FuZGlkYXRlLkRzZXRfbWF4X2NvZGVfc2l6ZQQBDG5ldxABDHUzMgADBNxTZXQgdGhlIG1heCB2YWxpZGF0aW9uIGNvZGUgc2l6ZSBmb3IgaW5jb21pbmcgdXBncmFkZXMuQHNldF9tYXhfcG92X3NpemUEAQxuZXcQAQx1MzIABATEU2V0IHRoZSBtYXggUE9WIGJsb2NrIHNpemUgZm9yIGluY29taW5nIHVwZ3JhZGVzLlhzZXRfbWF4X2hlYWRfZGF0YV9zaXplBAEMbmV3EAEMdTMyAAUElFNldCB0aGUgbWF4IGhlYWQgZGF0YSBzaXplIGZvciBwYXJhcy5Ic2V0X2NvcmV0aW1lX2NvcmVzBAEMbmV3EAEMdTMyAAYQrFNldCB0aGUgbnVtYmVyIG9mIGNvcmV0aW1lIGV4ZWN1dGlvbiBjb3Jlcy4AUQFOT1RFOiB0aGF0IHRoaXMgY29uZmlndXJhdGlvbiBpcyBtYW5hZ2VkIGJ5IHRoZSBjb3JldGltZSBjaGFpbi4gT25seSBtYW51YWxseSBjaGFuZ2WwdGhpcywgaWYgeW91IHJlYWxseSBrbm93IHdoYXQgeW91IGFyZSBkb2luZyF0c2V0X21heF9hdmFpbGFiaWxpdHlfdGltZW91dHMEAQxuZXcQAQx1MzIABwRBAVNldCB0aGUgbWF4IG51bWJlciBvZiB0aW1lcyBhIGNsYWltIG1heSB0aW1lb3V0IG9uIGEgY29yZSBiZWZvcmUgaXQgaXMgYWJhbmRvbmVkcHNldF9ncm91cF9yb3RhdGlvbl9mcmVxdWVuY3kEAQxuZXcQAURCbG9ja051bWJlckZvcjxUPgAIBNBTZXQgdGhlIHBhcmFjaGFpbiB2YWxpZGF0b3ItZ3JvdXAgcm90YXRpb24gZnJlcXVlbmN5dHNldF9wYXJhc19hdmFpbGFiaWxpdHlfcGVyaW9kBAEMbmV3EAFEQmxvY2tOdW1iZXJGb3I8VD4ACQSYU2V0IHRoZSBhdmFpbGFiaWxpdHkgcGVyaW9kIGZvciBwYXJhcy5gc2V0X3NjaGVkdWxpbmdfbG9va2FoZWFkBAEMbmV3EAEMdTMyAAsEOQFTZXQgdGhlIHNjaGVkdWxpbmcgbG9va2FoZWFkLCBpbiBleHBlY3RlZCBudW1iZXIgb2YgYmxvY2tzIGF0IHBlYWsgdGhyb3VnaHB1dC5sc2V0X21heF92YWxpZGF0b3JzX3Blcl9jb3JlBAEMbmV3YQIBLE9wdGlvbjx1MzI+AAwE7FNldCB0aGUgbWF4aW11bSBudW1iZXIgb2YgdmFsaWRhdG9ycyB0byBhc3NpZ24gdG8gYW55IGNvcmUuSHNldF9tYXhfdmFsaWRhdG9ycwQBDG5ld2ECASxPcHRpb248dTMyPgANBA0BU2V0IHRoZSBtYXhpbXVtIG51bWJlciBvZiB2YWxpZGF0b3JzIHRvIHVzZSBpbiBwYXJhY2hhaW4gY29uc2Vuc3VzLkhzZXRfZGlzcHV0ZV9wZXJpb2QEAQxuZXcQATBTZXNzaW9uSW5kZXgADgQNAVNldCB0aGUgZGlzcHV0ZSBwZXJpb2QsIGluIG51bWJlciBvZiBzZXNzaW9ucyB0byBrZWVwIGZvciBkaXNwdXRlcy60c2V0X2Rpc3B1dGVfcG9zdF9jb25jbHVzaW9uX2FjY2VwdGFuY2VfcGVyaW9kBAEMbmV3EAFEQmxvY2tOdW1iZXJGb3I8VD4ADwTIU2V0IHRoZSBkaXNwdXRlIHBvc3QgY29uY2x1c2lvbiBhY2NlcHRhbmNlIHBlcmlvZC5Ec2V0X25vX3Nob3dfc2xvdHMEAQxuZXcQAQx1MzIAEgj4U2V0IHRoZSBubyBzaG93IHNsb3RzLCBpbiBudW1iZXIgb2YgbnVtYmVyIG9mIGNvbnNlbnN1cyBzbG90cy5MTXVzdCBiZSBhdCBsZWFzdCAxLlBzZXRfbl9kZWxheV90cmFuY2hlcwQBDG5ldxABDHUzMgATBJxTZXQgdGhlIHRvdGFsIG51bWJlciBvZiBkZWxheSB0cmFuY2hlcy54c2V0X3plcm90aF9kZWxheV90cmFuY2hlX3dpZHRoBAEMbmV3EAEMdTMyABQEjFNldCB0aGUgemVyb3RoIGRlbGF5IHRyYW5jaGUgd2lkdGguUHNldF9uZWVkZWRfYXBwcm92YWxzBAEMbmV3EAEMdTMyABUE3FNldCB0aGUgbnVtYmVyIG9mIHZhbGlkYXRvcnMgbmVlZGVkIHRvIGFwcHJvdmUgYSBibG9jay5wc2V0X3JlbGF5X3ZyZl9tb2R1bG9fc2FtcGxlcwQBDG5ldxABDHUzMgAWBFkBU2V0IHRoZSBudW1iZXIgb2Ygc2FtcGxlcyB0byBkbyBvZiB0aGUgYFJlbGF5VlJGTW9kdWxvYCBhcHByb3ZhbCBhc3NpZ25tZW50IGNyaXRlcmlvbi5oc2V0X21heF91cHdhcmRfcXVldWVfY291bnQEAQxuZXcQAQx1MzIAFwQtAVNldHMgdGhlIG1heGltdW0gaXRlbXMgdGhhdCBjYW4gcHJlc2VudCBpbiBhIHVwd2FyZCBkaXNwYXRjaCBxdWV1ZSBhdCBvbmNlLmRzZXRfbWF4X3Vwd2FyZF9xdWV1ZV9zaXplBAEMbmV3EAEMdTMyABgITQFTZXRzIHRoZSBtYXhpbXVtIHRvdGFsIHNpemUgb2YgaXRlbXMgdGhhdCBjYW4gcHJlc2VudCBpbiBhIHVwd2FyZCBkaXNwYXRjaCBxdWV1ZSBhdBRvbmNlLnRzZXRfbWF4X2Rvd253YXJkX21lc3NhZ2Vfc2l6ZQQBDG5ldxABDHUzMgAZBJxTZXQgdGhlIGNyaXRpY2FsIGRvd253YXJkIG1lc3NhZ2Ugc2l6ZS5sc2V0X21heF91cHdhcmRfbWVzc2FnZV9zaXplBAEMbmV3EAEMdTMyABsELQFTZXRzIHRoZSBtYXhpbXVtIHNpemUgb2YgYW4gdXB3YXJkIG1lc3NhZ2UgdGhhdCBjYW4gYmUgc2VudCBieSBhIGNhbmRpZGF0ZS6gc2V0X21heF91cHdhcmRfbWVzc2FnZV9udW1fcGVyX2NhbmRpZGF0ZQQBDG5ldxABDHUzMgAcBAUBU2V0cyB0aGUgbWF4aW11bSBudW1iZXIgb2YgbWVzc2FnZXMgdGhhdCBhIGNhbmRpZGF0ZSBjYW4gY29udGFpbi5kc2V0X2hybXBfb3Blbl9yZXF1ZXN0X3R0bAQBDG5ldxABDHUzMgAdBDUBU2V0cyB0aGUgbnVtYmVyIG9mIHNlc3Npb25zIGFmdGVyIHdoaWNoIGFuIEhSTVAgb3BlbiBjaGFubmVsIHJlcXVlc3QgZXhwaXJlcy5cc2V0X2hybXBfc2VuZGVyX2RlcG9zaXQEAQxuZXcYARxCYWxhbmNlAB4EUQFTZXRzIHRoZSBhbW91bnQgb2YgZnVuZHMgdGhhdCB0aGUgc2VuZGVyIHNob3VsZCBwcm92aWRlIGZvciBvcGVuaW5nIGFuIEhSTVAgY2hhbm5lbC5oc2V0X2hybXBfcmVjaXBpZW50X2RlcG9zaXQEAQxuZXcYARxCYWxhbmNlAB8IYQFTZXRzIHRoZSBhbW91bnQgb2YgZnVuZHMgdGhhdCB0aGUgcmVjaXBpZW50IHNob3VsZCBwcm92aWRlIGZvciBhY2NlcHRpbmcgb3BlbmluZyBhbiBIUk1QIGNoYW5uZWwudHNldF9ocm1wX2NoYW5uZWxfbWF4X2NhcGFjaXR5BAEMbmV3EAEMdTMyACAEHQFTZXRzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBtZXNzYWdlcyBhbGxvd2VkIGluIGFuIEhSTVAgY2hhbm5lbCBhdCBvbmNlLnxzZXRfaHJtcF9jaGFubmVsX21heF90b3RhbF9zaXplBAEMbmV3EAEMdTMyACEEUQFTZXRzIHRoZSBtYXhpbXVtIHRvdGFsIHNpemUgb2YgbWVzc2FnZXMgaW4gYnl0ZXMgYWxsb3dlZCBpbiBhbiBIUk1QIGNoYW5uZWwgYXQgb25jZS6cc2V0X2hybXBfbWF4X3BhcmFjaGFpbl9pbmJvdW5kX2NoYW5uZWxzBAEMbmV3EAEMdTMyACIESQFTZXRzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBpbmJvdW5kIEhSTVAgY2hhbm5lbHMgYSBwYXJhY2hhaW4gaXMgYWxsb3dlZCB0byBhY2NlcHQuhHNldF9ocm1wX2NoYW5uZWxfbWF4X21lc3NhZ2Vfc2l6ZQQBDG5ldxABDHUzMgAkBD0BU2V0cyB0aGUgbWF4aW11bSBzaXplIG9mIGEgbWVzc2FnZSB0aGF0IGNvdWxkIGV2ZXIgYmUgcHV0IGludG8gYW4gSFJNUCBjaGFubmVsLqBzZXRfaHJtcF9tYXhfcGFyYWNoYWluX291dGJvdW5kX2NoYW5uZWxzBAEMbmV3EAEMdTMyACUERQFTZXRzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBvdXRib3VuZCBIUk1QIGNoYW5uZWxzIGEgcGFyYWNoYWluIGlzIGFsbG93ZWQgdG8gb3Blbi6Yc2V0X2hybXBfbWF4X21lc3NhZ2VfbnVtX3Blcl9jYW5kaWRhdGUEAQxuZXcQAQx1MzIAJwQ1AVNldHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIG91dGJvdW5kIEhSTVAgbWVzc2FnZXMgY2FuIGJlIHNlbnQgYnkgYSBjYW5kaWRhdGUuSHNldF9wdmZfdm90aW5nX3R0bAQBDG5ldxABMFNlc3Npb25JbmRleAAqBFEBU2V0IHRoZSBudW1iZXIgb2Ygc2Vzc2lvbiBjaGFuZ2VzIGFmdGVyIHdoaWNoIGEgUFZGIHByZS1jaGVja2luZyB2b3RpbmcgaXMgcmVqZWN0ZWQukHNldF9taW5pbXVtX3ZhbGlkYXRpb25fdXBncmFkZV9kZWxheQQBDG5ldxABREJsb2NrTnVtYmVyRm9yPFQ+ACsQVQFTZXRzIHRoZSBtaW5pbXVtIGRlbGF5IGJldHdlZW4gYW5ub3VuY2luZyB0aGUgdXBncmFkZSBibG9jayBmb3IgYSBwYXJhY2hhaW4gdW50aWwgdGhlVHVwZ3JhZGUgdGFraW5nIHBsYWNlLgA5AVNlZSB0aGUgZmllbGQgZG9jdW1lbnRhdGlvbiBmb3IgaW5mb3JtYXRpb24gYW5kIGNvbnN0cmFpbnRzIGZvciB0aGUgbmV3IHZhbHVlLnBzZXRfYnlwYXNzX2NvbnNpc3RlbmN5X2NoZWNrBAEMbmV3IAEQYm9vbAAsCE0BU2V0dGluZyB0aGlzIHRvIHRydWUgd2lsbCBkaXNhYmxlIGNvbnNpc3RlbmN5IGNoZWNrcyBmb3IgdGhlIGNvbmZpZ3VyYXRpb24gc2V0dGVycy5EVXNlIHdpdGggY2F1dGlvbi5gc2V0X2FzeW5jX2JhY2tpbmdfcGFyYW1zBAEMbmV3VQQBSEFzeW5jQmFja2luZ1BhcmFtcwAtBKBTZXQgdGhlIGFzeW5jaHJvbm91cyBiYWNraW5nIHBhcmFtZXRlcnMuTHNldF9leGVjdXRvcl9wYXJhbXMEAQxuZXdZBAE4RXhlY3V0b3JQYXJhbXMALgRwU2V0IFBWRiBleGVjdXRvciBwYXJhbWV0ZXJzLlhzZXRfb25fZGVtYW5kX2Jhc2VfZmVlBAEMbmV3GAEcQmFsYW5jZQAvBKRTZXQgdGhlIG9uIGRlbWFuZCAocGFyYXRocmVhZHMpIGJhc2UgZmVlLnRzZXRfb25fZGVtYW5kX2ZlZV92YXJpYWJpbGl0eQQBDG5ld6wBHFBlcmJpbGwAMATAU2V0IHRoZSBvbiBkZW1hbmQgKHBhcmF0aHJlYWRzKSBmZWUgdmFyaWFiaWxpdHkucHNldF9vbl9kZW1hbmRfcXVldWVfbWF4X3NpemUEAQxuZXcQAQx1MzIAMQS8U2V0IHRoZSBvbiBkZW1hbmQgKHBhcmF0aHJlYWRzKSBxdWV1ZSBtYXggc2l6ZS6Yc2V0X29uX2RlbWFuZF90YXJnZXRfcXVldWVfdXRpbGl6YXRpb24EAQxuZXesARxQZXJiaWxsADIEwFNldCB0aGUgb24gZGVtYW5kIChwYXJhdGhyZWFkcykgZmVlIHZhcmlhYmlsaXR5LkRzZXRfb25fZGVtYW5kX3R0bAQBDG5ldxABREJsb2NrTnVtYmVyRm9yPFQ+ADME2FNldCB0aGUgb24gZGVtYW5kIChwYXJhdGhyZWFkcykgdHRsIGluIHRoZSBjbGFpbXF1ZXVlLmRzZXRfbWluaW11bV9iYWNraW5nX3ZvdGVzBAEMbmV3EAEMdTMyADQEoFNldCB0aGUgbWluaW11bSBiYWNraW5nIHZvdGVzIHRocmVzaG9sZC5Ac2V0X25vZGVfZmVhdHVyZQgBFGluZGV4CAEIdTgAARR2YWx1ZSABEGJvb2wANQRkU2V0L1Vuc2V0IGEgbm9kZSBmZWF0dXJlLmhzZXRfYXBwcm92YWxfdm90aW5nX3BhcmFtcwQBDG5ld20EAVBBcHByb3ZhbFZvdGluZ1BhcmFtcwA2BGxTZXQgYXBwcm92YWwtdm90aW5nLXBhcmFtcy5Qc2V0X3NjaGVkdWxlcl9wYXJhbXMEAQxuZXdxBAGIU2NoZWR1bGVyUGFyYW1zPEJsb2NrTnVtYmVyRm9yPFQ+PgA3BFRTZXQgc2NoZWR1bGVyLXBhcmFtcy4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMuVQQQTHBvbGthZG90X3ByaW1pdGl2ZXMIdjc0YXN5bmNfYmFja2luZ0hBc3luY0JhY2tpbmdQYXJhbXMAAAgBTG1heF9jYW5kaWRhdGVfZGVwdGgQAQx1MzIAAVBhbGxvd2VkX2FuY2VzdHJ5X2xlbhABDHUzMgAAWQQQTHBvbGthZG90X3ByaW1pdGl2ZXMIdjc8ZXhlY3V0b3JfcGFyYW1zOEV4ZWN1dG9yUGFyYW1zAAAEAF0EAUhWZWM8RXhlY3V0b3JQYXJhbT4AAF0EAAACYQQAYQQQTHBvbGthZG90X3ByaW1pdGl2ZXMIdjc8ZXhlY3V0b3JfcGFyYW1zNEV4ZWN1dG9yUGFyYW0AARw4TWF4TWVtb3J5UGFnZXMEABABDHUzMgABADxTdGFja0xvZ2ljYWxNYXgEABABDHUzMgACADhTdGFja05hdGl2ZU1heAQAEAEMdTMyAAMAUFByZWNoZWNraW5nTWF4TWVtb3J5BAAwAQx1NjQABAA4UHZmUHJlcFRpbWVvdXQIAGUEASxQdmZQcmVwS2luZAAAMAEMdTY0AAUAOFB2ZkV4ZWNUaW1lb3V0CABpBAEsUHZmRXhlY0tpbmQAADABDHU2NAAGAERXYXNtRXh0QnVsa01lbW9yeQAHAABlBAxMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2NyxQdmZQcmVwS2luZAABCCBQcmVjaGVjawAAABxQcmVwYXJlAAEAAGkEDExwb2xrYWRvdF9wcmltaXRpdmVzCHY3LFB2ZkV4ZWNLaW5kAAEIHEJhY2tpbmcAAAAgQXBwcm92YWwAAQAAbQQMTHBvbGthZG90X3ByaW1pdGl2ZXMIdjdQQXBwcm92YWxWb3RpbmdQYXJhbXMAAAQBbG1heF9hcHByb3ZhbF9jb2FsZXNjZV9jb3VudBABDHUzMgAAcQQMTHBvbGthZG90X3ByaW1pdGl2ZXMgdnN0YWdpbmc8U2NoZWR1bGVyUGFyYW1zBCxCbG9ja051bWJlcgEQACwBYGdyb3VwX3JvdGF0aW9uX2ZyZXF1ZW5jeRABLEJsb2NrTnVtYmVyAAFkcGFyYXNfYXZhaWxhYmlsaXR5X3BlcmlvZBABLEJsb2NrTnVtYmVyAAFcbWF4X3ZhbGlkYXRvcnNfcGVyX2NvcmVhAgEsT3B0aW9uPHUzMj4AASRsb29rYWhlYWQQAQx1MzIAASRudW1fY29yZXMQAQx1MzIAAWRtYXhfYXZhaWxhYmlsaXR5X3RpbWVvdXRzEAEMdTMyAAFgb25fZGVtYW5kX3F1ZXVlX21heF9zaXplEAEMdTMyAAGIb25fZGVtYW5kX3RhcmdldF9xdWV1ZV91dGlsaXphdGlvbqwBHFBlcmJpbGwAAWRvbl9kZW1hbmRfZmVlX3ZhcmlhYmlsaXR5rAEcUGVyYmlsbAABSG9uX2RlbWFuZF9iYXNlX2ZlZRgBHEJhbGFuY2UAAQx0dGwQASxCbG9ja051bWJlcgAAdQQQbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucxhzaGFyZWQYcGFsbGV0EENhbGwEBFQAAQAEDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMueQQQbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucyRpbmNsdXNpb24YcGFsbGV0EENhbGwEBFQAAQAEDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMufQQQbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWluczhwYXJhc19pbmhlcmVudBhwYWxsZXQQQ2FsbAQEVAABBBRlbnRlcgQBEGRhdGGBBAGQUGFyYWNoYWluc0luaGVyZW50RGF0YTxIZWFkZXJGb3I8VD4+AAAEMQFFbnRlciB0aGUgcGFyYXMgaW5oZXJlbnQuIFRoaXMgd2lsbCBwcm9jZXNzIGJpdGZpZWxkcyBhbmQgYmFja2VkIGNhbmRpZGF0ZXMuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLoEEDExwb2xrYWRvdF9wcmltaXRpdmVzCHY3MEluaGVyZW50RGF0YQQMSERSAaEBABABJGJpdGZpZWxkc4UEAZBVbmNoZWNrZWRTaWduZWRBdmFpbGFiaWxpdHlCaXRmaWVsZHMAAURiYWNrZWRfY2FuZGlkYXRlc6EEAXxWZWM8QmFja2VkQ2FuZGlkYXRlPEhEUjo6SGFzaD4+AAEgZGlzcHV0ZXPlBAFgTXVsdGlEaXNwdXRlU3RhdGVtZW50U2V0AAE0cGFyZW50X2hlYWRlcqEBAQxIRFIAAIUEAAACiQQAiQQQTHBvbGthZG90X3ByaW1pdGl2ZXMIdjcYc2lnbmVkPFVuY2hlY2tlZFNpZ25lZAgcUGF5bG9hZAGNBCxSZWFsUGF5bG9hZAGNBAAMARxwYXlsb2FkjQQBHFBheWxvYWQAATx2YWxpZGF0b3JfaW5kZXiZBAE4VmFsaWRhdG9ySW5kZXgAASRzaWduYXR1cmWdBAFIVmFsaWRhdG9yU2lnbmF0dXJlAACNBAxMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2N1BBdmFpbGFiaWxpdHlCaXRmaWVsZAAABACRBAF8Qml0VmVjPHU4LCBiaXR2ZWM6Om9yZGVyOjpMc2IwPgAAkQQAAAcIlQQAlQQMGGJpdHZlYxRvcmRlchBMc2IwAAAAAJkEDExwb2xrYWRvdF9wcmltaXRpdmVzCHY3OFZhbGlkYXRvckluZGV4AAAEABABDHUzMgAAnQQQTHBvbGthZG90X3ByaW1pdGl2ZXMIdjc0dmFsaWRhdG9yX2FwcCRTaWduYXR1cmUAAAQASQIBSHNyMjU1MTk6OlNpZ25hdHVyZQAAoQQAAAKlBAClBAxMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2NzxCYWNrZWRDYW5kaWRhdGUEBEgBNAAMASRjYW5kaWRhdGWpBAFwQ29tbWl0dGVkQ2FuZGlkYXRlUmVjZWlwdDxIPgABOHZhbGlkaXR5X3ZvdGVz3QQBYFZlYzxWYWxpZGl0eUF0dGVzdGF0aW9uPgABRHZhbGlkYXRvcl9pbmRpY2VzkQQBfEJpdFZlYzx1OCwgYml0dmVjOjpvcmRlcjo6THNiMD4AAKkEDExwb2xrYWRvdF9wcmltaXRpdmVzCHY3ZENvbW1pdHRlZENhbmRpZGF0ZVJlY2VpcHQEBEgBNAAIAShkZXNjcmlwdG9yrQQBWENhbmRpZGF0ZURlc2NyaXB0b3I8SD4AASxjb21taXRtZW50c70EAVBDYW5kaWRhdGVDb21taXRtZW50cwAArQQMTHBvbGthZG90X3ByaW1pdGl2ZXMIdjdMQ2FuZGlkYXRlRGVzY3JpcHRvcgQESAE0ACQBHHBhcmFfaWSNAgEISWQAATByZWxheV9wYXJlbnQ0AQRIAAEgY29sbGF0b3KxBAEoQ29sbGF0b3JJZAABeHBlcnNpc3RlZF92YWxpZGF0aW9uX2RhdGFfaGFzaDQBEEhhc2gAASBwb3ZfaGFzaDQBEEhhc2gAATBlcmFzdXJlX3Jvb3Q0ARBIYXNoAAEkc2lnbmF0dXJltQQBRENvbGxhdG9yU2lnbmF0dXJlAAEkcGFyYV9oZWFkNAEQSGFzaAABUHZhbGlkYXRpb25fY29kZV9oYXNouQQBSFZhbGlkYXRpb25Db2RlSGFzaAAAsQQQTHBvbGthZG90X3ByaW1pdGl2ZXMIdjcwY29sbGF0b3JfYXBwGFB1YmxpYwAABAAEATxzcjI1NTE5OjpQdWJsaWMAALUEEExwb2xrYWRvdF9wcmltaXRpdmVzCHY3MGNvbGxhdG9yX2FwcCRTaWduYXR1cmUAAAQASQIBSHNyMjU1MTk6OlNpZ25hdHVyZQAAuQQMdHBvbGthZG90X3BhcmFjaGFpbl9wcmltaXRpdmVzKHByaW1pdGl2ZXNIVmFsaWRhdGlvbkNvZGVIYXNoAAAEADQBEEhhc2gAAL0EDExwb2xrYWRvdF9wcmltaXRpdmVzCHY3UENhbmRpZGF0ZUNvbW1pdG1lbnRzBAROARAAGAE8dXB3YXJkX21lc3NhZ2VzwQQBOFVwd2FyZE1lc3NhZ2VzAAFMaG9yaXpvbnRhbF9tZXNzYWdlc8UEAUhIb3Jpem9udGFsTWVzc2FnZXMAAUxuZXdfdmFsaWRhdGlvbl9jb2Rl0QQBWE9wdGlvbjxWYWxpZGF0aW9uQ29kZT4AASRoZWFkX2RhdGHZBAEgSGVhZERhdGEAAWxwcm9jZXNzZWRfZG93bndhcmRfbWVzc2FnZXMQAQx1MzIAAThocm1wX3dhdGVybWFyaxABBE4AAMEEDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBOARTAAAEAIUBARhWZWM8VD4AAMUEDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQByQQEUwAABADNBAEYVmVjPFQ+AADJBAhgcG9sa2Fkb3RfY29yZV9wcmltaXRpdmVzTE91dGJvdW5kSHJtcE1lc3NhZ2UECElkAY0CAAgBJHJlY2lwaWVudI0CAQhJZAABEGRhdGE4AVBzcF9zdGQ6OnZlYzo6VmVjPHU4PgAAzQQAAALJBADRBAQYT3B0aW9uBARUAdUEAQgQTm9uZQAAABBTb21lBADVBAAAAQAA1QQMdHBvbGthZG90X3BhcmFjaGFpbl9wcmltaXRpdmVzKHByaW1pdGl2ZXM4VmFsaWRhdGlvbkNvZGUAAAQAOAEcVmVjPHU4PgAA2QQMdHBvbGthZG90X3BhcmFjaGFpbl9wcmltaXRpdmVzKHByaW1pdGl2ZXMgSGVhZERhdGEAAAQAOAEcVmVjPHU4PgAA3QQAAALhBADhBAxMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2N0xWYWxpZGl0eUF0dGVzdGF0aW9uAAEIIEltcGxpY2l0BACdBAFIVmFsaWRhdG9yU2lnbmF0dXJlAAEAIEV4cGxpY2l0BACdBAFIVmFsaWRhdG9yU2lnbmF0dXJlAAIAAOUEAAAC6QQA6QQMTHBvbGthZG90X3ByaW1pdGl2ZXMIdjdMRGlzcHV0ZVN0YXRlbWVudFNldAAADAE4Y2FuZGlkYXRlX2hhc2jtBAE0Q2FuZGlkYXRlSGFzaAABHHNlc3Npb24QATBTZXNzaW9uSW5kZXgAAShzdGF0ZW1lbnRz8QQB7FZlYzwoRGlzcHV0ZVN0YXRlbWVudCwgVmFsaWRhdG9ySW5kZXgsIFZhbGlkYXRvclNpZ25hdHVyZSk+AADtBAhgcG9sa2Fkb3RfY29yZV9wcmltaXRpdmVzNENhbmRpZGF0ZUhhc2gAAAQANAEQSGFzaAAA8QQAAAL1BAD1BAAABAz5BJkEnQQA+QQMTHBvbGthZG90X3ByaW1pdGl2ZXMIdjdARGlzcHV0ZVN0YXRlbWVudAABCBRWYWxpZAQA/QQBZFZhbGlkRGlzcHV0ZVN0YXRlbWVudEtpbmQAAAAcSW52YWxpZAQABQUBbEludmFsaWREaXNwdXRlU3RhdGVtZW50S2luZAABAAD9BAxMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2N2RWYWxpZERpc3B1dGVTdGF0ZW1lbnRLaW5kAAEUIEV4cGxpY2l0AAAAPEJhY2tpbmdTZWNvbmRlZAQANAEQSGFzaAABADBCYWNraW5nVmFsaWQEADQBEEhhc2gAAgBAQXBwcm92YWxDaGVja2luZwADAIhBcHByb3ZhbENoZWNraW5nTXVsdGlwbGVDYW5kaWRhdGVzBAABBQFIVmVjPENhbmRpZGF0ZUhhc2g+AAQAAAEFAAAC7QQABQUMTHBvbGthZG90X3ByaW1pdGl2ZXMIdjdsSW52YWxpZERpc3B1dGVTdGF0ZW1lbnRLaW5kAAEEIEV4cGxpY2l0AAAAAAkFEGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMUcGFyYXMYcGFsbGV0EENhbGwEBFQAASRYZm9yY2Vfc2V0X2N1cnJlbnRfY29kZQgBEHBhcmGNAgEYUGFyYUlkAAEgbmV3X2NvZGXVBAE4VmFsaWRhdGlvbkNvZGUAAAT4U2V0IHRoZSBzdG9yYWdlIGZvciB0aGUgcGFyYWNoYWluIHZhbGlkYXRpb24gY29kZSBpbW1lZGlhdGVseS5YZm9yY2Vfc2V0X2N1cnJlbnRfaGVhZAgBEHBhcmGNAgEYUGFyYUlkAAEgbmV3X2hlYWTZBAEgSGVhZERhdGEAAQQBAVNldCB0aGUgc3RvcmFnZSBmb3IgdGhlIGN1cnJlbnQgcGFyYWNoYWluIGhlYWQgZGF0YSBpbW1lZGlhdGVseS5sZm9yY2Vfc2NoZWR1bGVfY29kZV91cGdyYWRlDAEQcGFyYY0CARhQYXJhSWQAASBuZXdfY29kZdUEAThWYWxpZGF0aW9uQ29kZQABTHJlbGF5X3BhcmVudF9udW1iZXIQAURCbG9ja051bWJlckZvcjxUPgACBC0BU2NoZWR1bGUgYW4gdXBncmFkZSBhcyBpZiBpdCB3YXMgc2NoZWR1bGVkIGluIHRoZSBnaXZlbiByZWxheSBwYXJlbnQgYmxvY2suTGZvcmNlX25vdGVfbmV3X2hlYWQIARBwYXJhjQIBGFBhcmFJZAABIG5ld19oZWFk2QQBIEhlYWREYXRhAAMEHQFOb3RlIGEgbmV3IGJsb2NrIGhlYWQgZm9yIHBhcmEgd2l0aGluIHRoZSBjb250ZXh0IG9mIHRoZSBjdXJyZW50IGJsb2NrLkhmb3JjZV9xdWV1ZV9hY3Rpb24EARBwYXJhjQIBGFBhcmFJZAAEDPhQdXQgYSBwYXJhY2hhaW4gZGlyZWN0bHkgaW50byB0aGUgbmV4dCBzZXNzaW9uJ3MgYWN0aW9uIHF1ZXVlLvRXZSBjYW4ndCBxdWV1ZSBpdCBhbnkgc29vbmVyIHRoYW4gdGhpcyB3aXRob3V0IGdvaW5nIGludG8gdGhlOGluaXRpYWxpemVyLi4ubGFkZF90cnVzdGVkX3ZhbGlkYXRpb25fY29kZQQBPHZhbGlkYXRpb25fY29kZdUEAThWYWxpZGF0aW9uQ29kZQAFOKBBZGRzIHRoZSB2YWxpZGF0aW9uIGNvZGUgdG8gdGhlIHN0b3JhZ2UuAFkBVGhlIGNvZGUgd2lsbCBub3QgYmUgYWRkZWQgaWYgaXQgaXMgYWxyZWFkeSBwcmVzZW50LiBBZGRpdGlvbmFsbHksIGlmIFBWRiBwcmUtY2hlY2tpbmfgaXMgcnVubmluZyBmb3IgdGhhdCBjb2RlLCBpdCB3aWxsIGJlIGluc3RhbnRseSBhY2NlcHRlZC4AUQFPdGhlcndpc2UsIHRoZSBjb2RlIHdpbGwgYmUgYWRkZWQgaW50byB0aGUgc3RvcmFnZS4gTm90ZSB0aGF0IHRoZSBjb2RlIHdpbGwgYmUgYWRkZWRhAWludG8gc3RvcmFnZSB3aXRoIHJlZmVyZW5jZSBjb3VudCAwLiBUaGlzIGlzIHRvIGFjY291bnQgdGhlIGZhY3QgdGhhdCB0aGVyZSBhcmUgbm8gdXNlcnNNAWZvciB0aGlzIGNvZGUgeWV0LiBUaGUgY2FsbGVyIHdpbGwgaGF2ZSB0byBtYWtlIHN1cmUgdGhhdCB0aGlzIGNvZGUgZXZlbnR1YWxseSBnZXRzSQF1c2VkIGJ5IHNvbWUgcGFyYWNoYWluIG9yIHJlbW92ZWQgZnJvbSB0aGUgc3RvcmFnZSB0byBhdm9pZCBzdG9yYWdlIGxlYWtzLiBGb3IgdGhlSQFsYXR0ZXIgcHJlZmVyIHRvIHVzZSB0aGUgYHBva2VfdW51c2VkX3ZhbGlkYXRpb25fY29kZWAgZGlzcGF0Y2hhYmxlIHRvIHJhdyBzdG9yYWdlNG1hbmlwdWxhdGlvbi4AUQFUaGlzIGZ1bmN0aW9uIGlzIG1haW5seSBtZWFudCB0byBiZSB1c2VkIGZvciB1cGdyYWRpbmcgcGFyYWNoYWlucyB0aGF0IGRvIG5vdCBmb2xsb3cJAXRoZSBnby1haGVhZCBzaWduYWwgd2hpbGUgdGhlIFBWRiBwcmUtY2hlY2tpbmcgZmVhdHVyZSBpcyBlbmFibGVkLmxwb2tlX3VudXNlZF92YWxpZGF0aW9uX2NvZGUEAVB2YWxpZGF0aW9uX2NvZGVfaGFzaLkEAUhWYWxpZGF0aW9uQ29kZUhhc2gABhQlAVJlbW92ZSB0aGUgdmFsaWRhdGlvbiBjb2RlIGZyb20gdGhlIHN0b3JhZ2UgaWZmIHRoZSByZWZlcmVuY2UgY291bnQgaXMgMC4AWQFUaGlzIGlzIGJldHRlciB0aGFuIHJlbW92aW5nIHRoZSBzdG9yYWdlIGRpcmVjdGx5LCBiZWNhdXNlIGl0IHdpbGwgbm90IHJlbW92ZSB0aGUgY29kZUEBdGhhdCB3YXMgc3VkZGVubHkgZ290IHVzZWQgYnkgc29tZSBwYXJhY2hhaW4gd2hpbGUgdGhpcyBkaXNwYXRjaGFibGUgd2FzIHBlbmRpbmcwZGlzcGF0Y2hpbmcubGluY2x1ZGVfcHZmX2NoZWNrX3N0YXRlbWVudAgBEHN0bXQNBQFEUHZmQ2hlY2tTdGF0ZW1lbnQAASRzaWduYXR1cmWdBAFIVmFsaWRhdG9yU2lnbmF0dXJlAAcIVQFJbmNsdWRlcyBhIHN0YXRlbWVudCBmb3IgYSBQVkYgcHJlLWNoZWNraW5nIHZvdGUuIFBvdGVudGlhbGx5LCBmaW5hbGl6ZXMgdGhlIHZvdGUgYW5kQQFlbmFjdHMgdGhlIHJlc3VsdHMgaWYgdGhhdCB3YXMgdGhlIGxhc3Qgdm90ZSBiZWZvcmUgYWNoaWV2aW5nIHRoZSBzdXBlcm1ham9yaXR5LnRmb3JjZV9zZXRfbW9zdF9yZWNlbnRfY29udGV4dAgBEHBhcmGNAgEYUGFyYUlkAAEcY29udGV4dBABREJsb2NrTnVtYmVyRm9yPFQ+AAgEAQFTZXQgdGhlIHN0b3JhZ2UgZm9yIHRoZSBjdXJyZW50IHBhcmFjaGFpbiBoZWFkIGRhdGEgaW1tZWRpYXRlbHkuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLg0FDExwb2xrYWRvdF9wcmltaXRpdmVzCHY3RFB2ZkNoZWNrU3RhdGVtZW50AAAQARhhY2NlcHQgARBib29sAAEcc3ViamVjdLkEAUhWYWxpZGF0aW9uQ29kZUhhc2gAATRzZXNzaW9uX2luZGV4EAEwU2Vzc2lvbkluZGV4AAE8dmFsaWRhdG9yX2luZGV4mQQBOFZhbGlkYXRvckluZGV4AAARBRBscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zLGluaXRpYWxpemVyGHBhbGxldBBDYWxsBARUAAEENGZvcmNlX2FwcHJvdmUEARR1cF90bxABLEJsb2NrTnVtYmVyAAAMOQFJc3N1ZSBhIHNpZ25hbCB0byB0aGUgY29uc2Vuc3VzIGVuZ2luZSB0byBmb3JjaWJseSBhY3QgYXMgdGhvdWdoIGFsbCBwYXJhY2hhaW5RAWJsb2NrcyBpbiBhbGwgcmVsYXkgY2hhaW4gYmxvY2tzIHVwIHRvIGFuZCBpbmNsdWRpbmcgdGhlIGdpdmVuIG51bWJlciBpbiB0aGUgY3VycmVudKBjaGFpbiBhcmUgdmFsaWQgYW5kIHNob3VsZCBiZSBmaW5hbGl6ZWQuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLhUFEGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMQaHJtcBhwYWxsZXQQQ2FsbAQEVAABLFhocm1wX2luaXRfb3Blbl9jaGFubmVsDAEkcmVjaXBpZW50jQIBGFBhcmFJZAABVHByb3Bvc2VkX21heF9jYXBhY2l0eRABDHUzMgABZHByb3Bvc2VkX21heF9tZXNzYWdlX3NpemUQAQx1MzIAAChNAUluaXRpYXRlIG9wZW5pbmcgYSBjaGFubmVsIGZyb20gYSBwYXJhY2hhaW4gdG8gYSBnaXZlbiByZWNpcGllbnQgd2l0aCBnaXZlbiBjaGFubmVsLHBhcmFtZXRlcnMuAFkBLSBgcHJvcG9zZWRfbWF4X2NhcGFjaXR5YCAtIHNwZWNpZmllcyBob3cgbWFueSBtZXNzYWdlcyBjYW4gYmUgaW4gdGhlIGNoYW5uZWwgYXQgb25jZS4tAS0gYHByb3Bvc2VkX21heF9tZXNzYWdlX3NpemVgIC0gc3BlY2lmaWVzIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIG1lc3NhZ2VzLgARAVRoZXNlIG51bWJlcnMgYXJlIGEgc3ViamVjdCB0byB0aGUgcmVsYXktY2hhaW4gY29uZmlndXJhdGlvbiBsaW1pdHMuAFEBVGhlIGNoYW5uZWwgY2FuIGJlIG9wZW5lZCBvbmx5IGFmdGVyIHRoZSByZWNpcGllbnQgY29uZmlybXMgaXQgYW5kIG9ubHkgb24gYSBzZXNzaW9uHGNoYW5nZS5gaHJtcF9hY2NlcHRfb3Blbl9jaGFubmVsBAEYc2VuZGVyjQIBGFBhcmFJZAABDPBBY2NlcHQgYSBwZW5kaW5nIG9wZW4gY2hhbm5lbCByZXF1ZXN0IGZyb20gdGhlIGdpdmVuIHNlbmRlci4A9FRoZSBjaGFubmVsIHdpbGwgYmUgb3BlbmVkIG9ubHkgb24gdGhlIG5leHQgc2Vzc2lvbiBib3VuZGFyeS5IaHJtcF9jbG9zZV9jaGFubmVsBAEoY2hhbm5lbF9pZBkFATRIcm1wQ2hhbm5lbElkAAIQVQFJbml0aWF0ZSB1bmlsYXRlcmFsIGNsb3Npbmcgb2YgYSBjaGFubmVsLiBUaGUgb3JpZ2luIG11c3QgYmUgZWl0aGVyIHRoZSBzZW5kZXIgb3IgdGhlmHJlY2lwaWVudCBpbiB0aGUgY2hhbm5lbCBiZWluZyBjbG9zZWQuAMBUaGUgY2xvc3VyZSBjYW4gb25seSBoYXBwZW4gb24gYSBzZXNzaW9uIGNoYW5nZS5AZm9yY2VfY2xlYW5faHJtcAwBEHBhcmGNAgEYUGFyYUlkAAEsbnVtX2luYm91bmQQAQx1MzIAATBudW1fb3V0Ym91bmQQAQx1MzIAAxxdAVRoaXMgZXh0cmluc2ljIHRyaWdnZXJzIHRoZSBjbGVhbnVwIG9mIGFsbCB0aGUgSFJNUCBzdG9yYWdlIGl0ZW1zIHRoYXQgYSBwYXJhIG1heSBoYXZlLkkBTm9ybWFsbHkgdGhpcyBoYXBwZW5zIG9uY2UgcGVyIHNlc3Npb24sIGJ1dCB0aGlzIGFsbG93cyB5b3UgdG8gdHJpZ2dlciB0aGUgY2xlYW51cJRpbW1lZGlhdGVseSBmb3IgYSBzcGVjaWZpYyBwYXJhY2hhaW4uAFEBTnVtYmVyIG9mIGluYm91bmQgYW5kIG91dGJvdW5kIGNoYW5uZWxzIGZvciBgcGFyYWAgbXVzdCBiZSBwcm92aWRlZCBhcyB3aXRuZXNzIGRhdGEuAJBPcmlnaW4gbXVzdCBiZSB0aGUgYENoYW5uZWxNYW5hZ2VyYC5cZm9yY2VfcHJvY2Vzc19ocm1wX29wZW4EASBjaGFubmVscxABDHUzMgAEIKRGb3JjZSBwcm9jZXNzIEhSTVAgb3BlbiBjaGFubmVsIHJlcXVlc3RzLgBVAUlmIHRoZXJlIGFyZSBwZW5kaW5nIEhSTVAgb3BlbiBjaGFubmVsIHJlcXVlc3RzLCB5b3UgY2FuIHVzZSB0aGlzIGZ1bmN0aW9uIHRvIHByb2Nlc3OIYWxsIG9mIHRob3NlIHJlcXVlc3RzIGltbWVkaWF0ZWx5LgAJAVRvdGFsIG51bWJlciBvZiBvcGVuaW5nIGNoYW5uZWxzIG11c3QgYmUgcHJvdmlkZWQgYXMgd2l0bmVzcyBkYXRhLgCQT3JpZ2luIG11c3QgYmUgdGhlIGBDaGFubmVsTWFuYWdlcmAuYGZvcmNlX3Byb2Nlc3NfaHJtcF9jbG9zZQQBIGNoYW5uZWxzEAEMdTMyAAUgqEZvcmNlIHByb2Nlc3MgSFJNUCBjbG9zZSBjaGFubmVsIHJlcXVlc3RzLgBZAUlmIHRoZXJlIGFyZSBwZW5kaW5nIEhSTVAgY2xvc2UgY2hhbm5lbCByZXF1ZXN0cywgeW91IGNhbiB1c2UgdGhpcyBmdW5jdGlvbiB0byBwcm9jZXNziGFsbCBvZiB0aG9zZSByZXF1ZXN0cyBpbW1lZGlhdGVseS4ACQFUb3RhbCBudW1iZXIgb2YgY2xvc2luZyBjaGFubmVscyBtdXN0IGJlIHByb3ZpZGVkIGFzIHdpdG5lc3MgZGF0YS4AkE9yaWdpbiBtdXN0IGJlIHRoZSBgQ2hhbm5lbE1hbmFnZXJgLmBocm1wX2NhbmNlbF9vcGVuX3JlcXVlc3QIAShjaGFubmVsX2lkGQUBNEhybXBDaGFubmVsSWQAATRvcGVuX3JlcXVlc3RzEAEMdTMyAAYgXQFUaGlzIGNhbmNlbHMgYSBwZW5kaW5nIG9wZW4gY2hhbm5lbCByZXF1ZXN0LiBJdCBjYW4gYmUgY2FuY2VsZWQgYnkgZWl0aGVyIG9mIHRoZSBzZW5kZXIZAW9yIHRoZSByZWNpcGllbnQgZm9yIHRoYXQgcmVxdWVzdC4gVGhlIG9yaWdpbiBtdXN0IGJlIGVpdGhlciBvZiB0aG9zZS4AXQFUaGUgY2FuY2VsbGF0aW9uIGhhcHBlbnMgaW1tZWRpYXRlbHkuIEl0IGlzIG5vdCBwb3NzaWJsZSB0byBjYW5jZWwgdGhlIHJlcXVlc3QgaWYgaXQgaXNEYWxyZWFkeSBhY2NlcHRlZC4AWQFUb3RhbCBudW1iZXIgb2Ygb3BlbiByZXF1ZXN0cyAoaS5lLiBgSHJtcE9wZW5DaGFubmVsUmVxdWVzdHNMaXN0YCkgbXVzdCBiZSBwcm92aWRlZCBhczR3aXRuZXNzIGRhdGEuXGZvcmNlX29wZW5faHJtcF9jaGFubmVsEAEYc2VuZGVyjQIBGFBhcmFJZAABJHJlY2lwaWVudI0CARhQYXJhSWQAATBtYXhfY2FwYWNpdHkQAQx1MzIAAUBtYXhfbWVzc2FnZV9zaXplEAEMdTMyAAcgYQFPcGVuIGEgY2hhbm5lbCBmcm9tIGEgYHNlbmRlcmAgdG8gYSBgcmVjaXBpZW50YCBgUGFyYUlkYC4gQWx0aG91Z2ggb3BlbmVkIGJ5IGdvdmVybmFuY2UsQQF0aGUgYG1heF9jYXBhY2l0eWAgYW5kIGBtYXhfbWVzc2FnZV9zaXplYCBhcmUgc3RpbGwgc3ViamVjdCB0byB0aGUgUmVsYXkgQ2hhaW4nc0hjb25maWd1cmVkIGxpbWl0cy4ATQFFeHBlY3RlZCB1c2UgaXMgd2hlbiBvbmUgKGFuZCBvbmx5IG9uZSkgb2YgdGhlIGBQYXJhSWRgcyBpbnZvbHZlZCBpbiB0aGUgY2hhbm5lbCBpc8Bnb3Zlcm5lZCBieSB0aGUgc3lzdGVtLCBlLmcuIGEgc3lzdGVtIHBhcmFjaGFpbi4AkE9yaWdpbiBtdXN0IGJlIHRoZSBgQ2hhbm5lbE1hbmFnZXJgLmBlc3RhYmxpc2hfc3lzdGVtX2NoYW5uZWwIARhzZW5kZXKNAgEYUGFyYUlkAAEkcmVjaXBpZW50jQIBGFBhcmFJZAAIMFEBRXN0YWJsaXNoIGFuIEhSTVAgY2hhbm5lbCBiZXR3ZWVuIHR3byBzeXN0ZW0gY2hhaW5zLiBJZiB0aGUgY2hhbm5lbCBkb2VzIG5vdCBhbHJlYWR5UQFleGlzdCwgdGhlIHRyYW5zYWN0aW9uIGZlZXMgd2lsbCBiZSByZWZ1bmRlZCB0byB0aGUgY2FsbGVyLiBUaGUgc3lzdGVtIGRvZXMgbm90IHRha2VZAWRlcG9zaXRzIGZvciBjaGFubmVscyBiZXR3ZWVuIHN5c3RlbSBjaGFpbnMsIGFuZCBhdXRvbWF0aWNhbGx5IHNldHMgdGhlIG1lc3NhZ2UgbnVtYmVyGQFhbmQgc2l6ZSBsaW1pdHMgdG8gdGhlIG1heGltdW0gYWxsb3dlZCBieSB0aGUgbmV0d29yaydzIGNvbmZpZ3VyYXRpb24uAChBcmd1bWVudHM6AJQtIGBzZW5kZXJgOiBBIHN5c3RlbSBjaGFpbiwgYFBhcmFJZGAuoC0gYHJlY2lwaWVudGA6IEEgc3lzdGVtIGNoYWluLCBgUGFyYUlkYC4AVQFBbnkgc2lnbmVkIG9yaWdpbiBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uLCBidXQgX2JvdGhfIGlucHV0cyBNVVNUIGJlIHN5c3RlbSBjaGFpbnMuIElmwHRoZSBjaGFubmVsIGRvZXMgbm90IGV4aXN0IHlldCwgdGhlcmUgaXMgbm8gZmVlLlRwb2tlX2NoYW5uZWxfZGVwb3NpdHMIARhzZW5kZXKNAgEYUGFyYUlkAAEkcmVjaXBpZW50jQIBGFBhcmFJZAAJJFEBVXBkYXRlIHRoZSBkZXBvc2l0cyBoZWxkIGZvciBhbiBIUk1QIGNoYW5uZWwgdG8gdGhlIGxhdGVzdCBgQ29uZmlndXJhdGlvbmAuIENoYW5uZWxzsHdpdGggc3lzdGVtIGNoYWlucyBkbyBub3QgcmVxdWlyZSBhIGRlcG9zaXQuAChBcmd1bWVudHM6AHgtIGBzZW5kZXJgOiBBIGNoYWluLCBgUGFyYUlkYC6ELSBgcmVjaXBpZW50YDogQSBjaGFpbiwgYFBhcmFJZGAuAKRBbnkgc2lnbmVkIG9yaWdpbiBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uLnRlc3RhYmxpc2hfY2hhbm5lbF93aXRoX3N5c3RlbQQBTHRhcmdldF9zeXN0ZW1fY2hhaW6NAgEYUGFyYUlkAAocOQFFc3RhYmxpc2ggYSBiaWRpcmVjdGlvbmFsIEhSTVAgY2hhbm5lbCBiZXR3ZWVuIGEgcGFyYWNoYWluIGFuZCBhIHN5c3RlbSBjaGFpbi4AKEFyZ3VtZW50czoAyC0gYHRhcmdldF9zeXN0ZW1fY2hhaW5gOiBBIHN5c3RlbSBjaGFpbiwgYFBhcmFJZGAuALBUaGUgb3JpZ2luIG5lZWRzIHRvIGJlIHRoZSBwYXJhY2hhaW4gb3JpZ2luLgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy4ZBQx0cG9sa2Fkb3RfcGFyYWNoYWluX3ByaW1pdGl2ZXMocHJpbWl0aXZlczRIcm1wQ2hhbm5lbElkAAAIARhzZW5kZXKNAgEISWQAASRyZWNpcGllbnSNAgEISWQAAB0FEGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMgZGlzcHV0ZXMYcGFsbGV0EENhbGwEBFQAAQQ4Zm9yY2VfdW5mcmVlemUAAAAEDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMuIQUUbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucyBkaXNwdXRlcyBzbGFzaGluZxhwYWxsZXQQQ2FsbAQEVAABBHByZXBvcnRfZGlzcHV0ZV9sb3N0X3Vuc2lnbmVkCAE0ZGlzcHV0ZV9wcm9vZiUFAURCb3g8RGlzcHV0ZVByb29mPgABPGtleV9vd25lcl9wcm9vZq0BAUBUOjpLZXlPd25lclByb29mAAAABA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLiUFEExwb2xrYWRvdF9wcmltaXRpdmVzCHY3IHNsYXNoaW5nMERpc3B1dGVQcm9vZgAAEAEkdGltZV9zbG90KQUBQERpc3B1dGVzVGltZVNsb3QAARBraW5kLQUBTFNsYXNoaW5nT2ZmZW5jZUtpbmQAATx2YWxpZGF0b3JfaW5kZXiZBAE4VmFsaWRhdG9ySW5kZXgAATB2YWxpZGF0b3JfaWQdAgEsVmFsaWRhdG9ySWQAACkFEExwb2xrYWRvdF9wcmltaXRpdmVzCHY3IHNsYXNoaW5nQERpc3B1dGVzVGltZVNsb3QAAAgBNHNlc3Npb25faW5kZXgQATBTZXNzaW9uSW5kZXgAAThjYW5kaWRhdGVfaGFzaO0EATRDYW5kaWRhdGVIYXNoAAAtBRBMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2NyBzbGFzaGluZ0xTbGFzaGluZ09mZmVuY2VLaW5kAAEIKEZvckludmFsaWQAAAAwQWdhaW5zdFZhbGlkAAEAADEFEGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnNIYXNzaWduZXJfb25fZGVtYW5kGHBhbGxldBBDYWxsBARUAAEIXHBsYWNlX29yZGVyX2FsbG93X2RlYXRoCAEobWF4X2Ftb3VudBgBMEJhbGFuY2VPZjxUPgABHHBhcmFfaWSNAgEYUGFyYUlkAAA8lENyZWF0ZSBhIHNpbmdsZSBvbiBkZW1hbmQgY29yZSBvcmRlci5JAVdpbGwgdXNlIHRoZSBzcG90IHByaWNlIGZvciB0aGUgY3VycmVudCBibG9jayBhbmQgd2lsbCByZWFwIHRoZSBhY2NvdW50IGlmIG5lZWRlZC4ALFBhcmFtZXRlcnM6OQEtIGBvcmlnaW5gOiBUaGUgc2VuZGVyIG9mIHRoZSBjYWxsLCBmdW5kcyB3aWxsIGJlIHdpdGhkcmF3biBmcm9tIHRoaXMgYWNjb3VudC5JAS0gYG1heF9hbW91bnRgOiBUaGUgbWF4aW11bSBiYWxhbmNlIHRvIHdpdGhkcmF3IGZyb20gdGhlIG9yaWdpbiB0byBwbGFjZSBhbiBvcmRlci4NAS0gYHBhcmFfaWRgOiBBIGBQYXJhSWRgIHRoZSBvcmlnaW4gd2FudHMgdG8gcHJvdmlkZSBibG9ja3NwYWNlIGZvci4AHEVycm9yczrkLSBgSW5zdWZmaWNpZW50QmFsYW5jZWA6IGZyb20gdGhlIEN1cnJlbmN5IGltcGxlbWVudGF0aW9uNC0gYFF1ZXVlRnVsbGCALSBgU3BvdFByaWNlSGlnaGVyVGhhbk1heEFtb3VudGAAHEV2ZW50czpcLSBgT25EZW1hbmRPcmRlclBsYWNlZGBYcGxhY2Vfb3JkZXJfa2VlcF9hbGl2ZQgBKG1heF9hbW91bnQYATBCYWxhbmNlT2Y8VD4AARxwYXJhX2lkjQIBGFBhcmFJZAABPGEBU2FtZSBhcyB0aGUgW2BwbGFjZV9vcmRlcl9hbGxvd19kZWF0aGBdKFNlbGY6OnBsYWNlX29yZGVyX2FsbG93X2RlYXRoKSBjYWxsICwgYnV0IHdpdGggYdxjaGVjayB0aGF0IHBsYWNpbmcgdGhlIG9yZGVyIHdpbGwgbm90IHJlYXAgdGhlIGFjY291bnQuACxQYXJhbWV0ZXJzOjkBLSBgb3JpZ2luYDogVGhlIHNlbmRlciBvZiB0aGUgY2FsbCwgZnVuZHMgd2lsbCBiZSB3aXRoZHJhd24gZnJvbSB0aGlzIGFjY291bnQuSQEtIGBtYXhfYW1vdW50YDogVGhlIG1heGltdW0gYmFsYW5jZSB0byB3aXRoZHJhdyBmcm9tIHRoZSBvcmlnaW4gdG8gcGxhY2UgYW4gb3JkZXIuDQEtIGBwYXJhX2lkYDogQSBgUGFyYUlkYCB0aGUgb3JpZ2luIHdhbnRzIHRvIHByb3ZpZGUgYmxvY2tzcGFjZSBmb3IuABxFcnJvcnM65C0gYEluc3VmZmljaWVudEJhbGFuY2VgOiBmcm9tIHRoZSBDdXJyZW5jeSBpbXBsZW1lbnRhdGlvbjQtIGBRdWV1ZUZ1bGxggC0gYFNwb3RQcmljZUhpZ2hlclRoYW5NYXhBbW91bnRgABxFdmVudHM6XC0gYE9uRGVtYW5kT3JkZXJQbGFjZWRgBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLjUFEFxwb2xrYWRvdF9ydW50aW1lX2NvbW1vbjxwYXJhc19yZWdpc3RyYXIYcGFsbGV0EENhbGwEBFQAASQgcmVnaXN0ZXIMAQhpZI0CARhQYXJhSWQAATBnZW5lc2lzX2hlYWTZBAEgSGVhZERhdGEAATx2YWxpZGF0aW9uX2NvZGXVBAE4VmFsaWRhdGlvbkNvZGUAAFD4UmVnaXN0ZXIgaGVhZCBkYXRhIGFuZCB2YWxpZGF0aW9uIGNvZGUgZm9yIGEgcmVzZXJ2ZWQgUGFyYSBJZC4AMCMjIEFyZ3VtZW50c8AtIGBvcmlnaW5gOiBNdXN0IGJlIGNhbGxlZCBieSBhIGBTaWduZWRgIG9yaWdpbi4tAS0gYGlkYDogVGhlIHBhcmEgSUQuIE11c3QgYmUgb3duZWQvbWFuYWdlZCBieSB0aGUgYG9yaWdpbmAgc2lnbmluZyBhY2NvdW50LgEBLSBgZ2VuZXNpc19oZWFkYDogVGhlIGdlbmVzaXMgaGVhZCBkYXRhIG9mIHRoZSBwYXJhY2hhaW4vdGhyZWFkLiUBLSBgdmFsaWRhdGlvbl9jb2RlYDogVGhlIGluaXRpYWwgdmFsaWRhdGlvbiBjb2RlIG9mIHRoZSBwYXJhY2hhaW4vdGhyZWFkLgBAIyMgRGVwb3NpdHMvRmVlcwkBVGhlIGFjY291bnQgd2l0aCB0aGUgb3JpZ2luYXRpbmcgc2lnbmF0dXJlIG11c3QgcmVzZXJ2ZSBhIGRlcG9zaXQuAE0BVGhlIGRlcG9zaXQgaXMgcmVxdWlyZWQgdG8gY292ZXIgdGhlIGNvc3RzIGFzc29jaWF0ZWQgd2l0aCBzdG9yaW5nIHRoZSBnZW5lc2lzIGhlYWR0ZGF0YSBhbmQgdGhlIHZhbGlkYXRpb24gY29kZS4xAVRoaXMgYWNjb3VudHMgZm9yIHRoZSBwb3RlbnRpYWwgdG8gc3RvcmUgdmFsaWRhdGlvbiBjb2RlIG9mIGEgc2l6ZSB1cCB0byB0aGXcYG1heF9jb2RlX3NpemVgLCBhcyBkZWZpbmVkIGluIHRoZSBjb25maWd1cmF0aW9uIHBhbGxldAAdAUFueXRoaW5nIGFscmVhZHkgcmVzZXJ2ZWQgcHJldmlvdXNseSBmb3IgdGhpcyBwYXJhIElEIGlzIGFjY291bnRlZCBmb3IuACQjIyBFdmVudHPUVGhlIGBSZWdpc3RlcmVkYCBldmVudCBpcyBlbWl0dGVkIGluIGNhc2Ugb2Ygc3VjY2Vzcy44Zm9yY2VfcmVnaXN0ZXIUAQx3aG8AATBUOjpBY2NvdW50SWQAARxkZXBvc2l0GAEwQmFsYW5jZU9mPFQ+AAEIaWSNAgEYUGFyYUlkAAEwZ2VuZXNpc19oZWFk2QQBIEhlYWREYXRhAAE8dmFsaWRhdGlvbl9jb2Rl1QQBOFZhbGlkYXRpb25Db2RlAAEY3EZvcmNlIHRoZSByZWdpc3RyYXRpb24gb2YgYSBQYXJhIElkIG9uIHRoZSByZWxheSBjaGFpbi4AuFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgYnkgYSBSb290IG9yaWdpbi4AGQFUaGUgZGVwb3NpdCB0YWtlbiBjYW4gYmUgc3BlY2lmaWVkIGZvciB0aGlzIHJlZ2lzdHJhdGlvbi4gQW55IGBQYXJhSWRgGQFjYW4gYmUgcmVnaXN0ZXJlZCwgaW5jbHVkaW5nIHN1Yi0xMDAwIElEcyB3aGljaCBhcmUgU3lzdGVtIFBhcmFjaGFpbnMuKGRlcmVnaXN0ZXIEAQhpZI0CARhQYXJhSWQAAhAFAURlcmVnaXN0ZXIgYSBQYXJhIElkLCBmcmVlaW5nIGFsbCBkYXRhIGFuZCByZXR1cm5pbmcgYW55IGRlcG9zaXQuAFEBVGhlIGNhbGxlciBtdXN0IGJlIFJvb3QsIHRoZSBgcGFyYWAgb3duZXIsIG9yIHRoZSBgcGFyYWAgaXRzZWxmLiBUaGUgcGFyYSBtdXN0IGJlIGFuUG9uLWRlbWFuZCBwYXJhY2hhaW4uEHN3YXAIAQhpZI0CARhQYXJhSWQAARRvdGhlco0CARhQYXJhSWQAAzBBAVN3YXAgYSBsZWFzZSBob2xkaW5nIHBhcmFjaGFpbiB3aXRoIGFub3RoZXIgcGFyYWNoYWluLCBlaXRoZXIgb24tZGVtYW5kIG9yIGxlYXNlIGhvbGRpbmcuAAEBVGhlIG9yaWdpbiBtdXN0IGJlIFJvb3QsIHRoZSBgcGFyYWAgb3duZXIsIG9yIHRoZSBgcGFyYWAgaXRzZWxmLgBhAVRoZSBzd2FwIHdpbGwgaGFwcGVuIG9ubHkgaWYgdGhlcmUgaXMgYWxyZWFkeSBhbiBvcHBvc2l0ZSBzd2FwIHBlbmRpbmcuIElmIHRoZXJlIGlzIG5vdCxZAXRoZSBzd2FwIHdpbGwgYmUgc3RvcmVkIGluIHRoZSBwZW5kaW5nIHN3YXBzIG1hcCwgcmVhZHkgZm9yIGEgbGF0ZXIgY29uZmlybWF0b3J5IHN3YXAuAF0BVGhlIGBQYXJhSWRgcyByZW1haW4gbWFwcGVkIHRvIHRoZSBzYW1lIGhlYWQgZGF0YSBhbmQgY29kZSBzbyBleHRlcm5hbCBjb2RlIGNhbiByZWx5IG9uPQFgUGFyYUlkYCB0byBiZSBhIGxvbmctdGVybSBpZGVudGlmaWVyIG9mIGEgbm90aW9uYWwgInBhcmFjaGFpbiIuIEhvd2V2ZXIsIHRoZWlyNQFzY2hlZHVsaW5nIGluZm8gKGkuZS4gd2hldGhlciB0aGV5J3JlIGFuIG9uLWRlbWFuZCBwYXJhY2hhaW4gb3IgbGVhc2UgaG9sZGluZxUBcGFyYWNoYWluKSwgYXVjdGlvbiBpbmZvcm1hdGlvbiBhbmQgdGhlIGF1Y3Rpb24gZGVwb3NpdCBhcmUgc3dpdGNoZWQuLHJlbW92ZV9sb2NrBAEQcGFyYY0CARhQYXJhSWQABBANAVJlbW92ZSBhIG1hbmFnZXIgbG9jayBmcm9tIGEgcGFyYS4gVGhpcyB3aWxsIGFsbG93IHRoZSBtYW5hZ2VyIG9mIGE1AXByZXZpb3VzbHkgbG9ja2VkIHBhcmEgdG8gZGVyZWdpc3RlciBvciBzd2FwIGEgcGFyYSB3aXRob3V0IHVzaW5nIGdvdmVybmFuY2UuANxDYW4gb25seSBiZSBjYWxsZWQgYnkgdGhlIFJvb3Qgb3JpZ2luIG9yIHRoZSBwYXJhY2hhaW4uHHJlc2VydmUABUSUUmVzZXJ2ZSBhIFBhcmEgSWQgb24gdGhlIHJlbGF5IGNoYWluLgBNAVRoaXMgZnVuY3Rpb24gd2lsbCByZXNlcnZlIGEgbmV3IFBhcmEgSWQgdG8gYmUgb3duZWQvbWFuYWdlZCBieSB0aGUgb3JpZ2luIGFjY291bnQuYQFUaGUgb3JpZ2luIGFjY291bnQgaXMgYWJsZSB0byByZWdpc3RlciBoZWFkIGRhdGEgYW5kIHZhbGlkYXRpb24gY29kZSB1c2luZyBgcmVnaXN0ZXJgIHRvWQFjcmVhdGUgYW4gb24tZGVtYW5kIHBhcmFjaGFpbi4gVXNpbmcgdGhlIFNsb3RzIHBhbGxldCwgYW4gb24tZGVtYW5kIHBhcmFjaGFpbiBjYW4gdGhlbqRiZSB1cGdyYWRlZCB0byBhIGxlYXNlIGhvbGRpbmcgcGFyYWNoYWluLgAwIyMgQXJndW1lbnRzVQEtIGBvcmlnaW5gOiBNdXN0IGJlIGNhbGxlZCBieSBhIGBTaWduZWRgIG9yaWdpbi4gQmVjb21lcyB0aGUgbWFuYWdlci9vd25lciBvZiB0aGUgbmV3KCAgcGFyYSBJRC4AQCMjIERlcG9zaXRzL0ZlZXMhAVRoZSBvcmlnaW4gbXVzdCByZXNlcnZlIGEgZGVwb3NpdCBvZiBgUGFyYURlcG9zaXRgIGZvciB0aGUgcmVnaXN0cmF0aW9uLgAkIyMgRXZlbnRzWQFUaGUgYFJlc2VydmVkYCBldmVudCBpcyBlbWl0dGVkIGluIGNhc2Ugb2Ygc3VjY2Vzcywgd2hpY2ggcHJvdmlkZXMgdGhlIElEIHJlc2VydmVkIGZvchB1c2UuIGFkZF9sb2NrBAEQcGFyYY0CARhQYXJhSWQABhQJAUFkZCBhIG1hbmFnZXIgbG9jayBmcm9tIGEgcGFyYS4gVGhpcyB3aWxsIHByZXZlbnQgdGhlIG1hbmFnZXIgb2YgYYhwYXJhIHRvIGRlcmVnaXN0ZXIgb3Igc3dhcCBhIHBhcmEuAEkBQ2FuIGJlIGNhbGxlZCBieSBSb290LCB0aGUgcGFyYWNoYWluLCBvciB0aGUgcGFyYWNoYWluIG1hbmFnZXIgaWYgdGhlIHBhcmFjaGFpbiBpcyR1bmxvY2tlZC5Uc2NoZWR1bGVfY29kZV91cGdyYWRlCAEQcGFyYY0CARhQYXJhSWQAASBuZXdfY29kZdUEAThWYWxpZGF0aW9uQ29kZQAHLHRTY2hlZHVsZSBhIHBhcmFjaGFpbiB1cGdyYWRlLgBVAVRoaXMgd2lsbCBraWNrIG9mZiBhIGNoZWNrIG9mIGBuZXdfY29kZWAgYnkgYWxsIHZhbGlkYXRvcnMuIEFmdGVyIHRoZSBtYWpvcml0eSBvZiB0aGVVAXZhbGlkYXRvcnMgaGF2ZSByZXBvcnRlZCBvbiB0aGUgdmFsaWRpdHkgb2YgdGhlIGNvZGUsIHRoZSBjb2RlIHdpbGwgZWl0aGVyIGJlIGVuYWN0ZWRVAW9yIHRoZSB1cGdyYWRlIHdpbGwgYmUgcmVqZWN0ZWQuIElmIHRoZSBjb2RlIHdpbGwgYmUgZW5hY3RlZCwgdGhlIGN1cnJlbnQgY29kZSBvZiB0aGVdAXBhcmFjaGFpbiB3aWxsIGJlIG92ZXJ3cml0dGVuIGRpcmVjdGx5LiBUaGlzIG1lYW5zIHRoYXQgYW55IFBvViB3aWxsIGJlIGNoZWNrZWQgYnkgdGhpc10BbmV3IGNvZGUuIFRoZSBwYXJhY2hhaW4gaXRzZWxmIHdpbGwgbm90IGJlIGluZm9ybWVkIGV4cGxpY2l0bHkgdGhhdCB0aGUgdmFsaWRhdGlvbiBjb2RlMGhhcyBjaGFuZ2VkLgBJAUNhbiBiZSBjYWxsZWQgYnkgUm9vdCwgdGhlIHBhcmFjaGFpbiwgb3IgdGhlIHBhcmFjaGFpbiBtYW5hZ2VyIGlmIHRoZSBwYXJhY2hhaW4gaXMkdW5sb2NrZWQuQHNldF9jdXJyZW50X2hlYWQIARBwYXJhjQIBGFBhcmFJZAABIG5ld19oZWFk2QQBIEhlYWREYXRhAAgQhFNldCB0aGUgcGFyYWNoYWluJ3MgY3VycmVudCBoZWFkLgBJAUNhbiBiZSBjYWxsZWQgYnkgUm9vdCwgdGhlIHBhcmFjaGFpbiwgb3IgdGhlIHBhcmFjaGFpbiBtYW5hZ2VyIGlmIHRoZSBwYXJhY2hhaW4gaXMkdW5sb2NrZWQuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLjkFEFxwb2xrYWRvdF9ydW50aW1lX2NvbW1vbhRzbG90cxhwYWxsZXQQQ2FsbAQEVAABDCxmb3JjZV9sZWFzZRQBEHBhcmGNAgEYUGFyYUlkAAEYbGVhc2VyAAEwVDo6QWNjb3VudElkAAEYYW1vdW50GAEwQmFsYW5jZU9mPFQ+AAEwcGVyaW9kX2JlZ2luEAFATGVhc2VQZXJpb2RPZjxUPgABMHBlcmlvZF9jb3VudBABQExlYXNlUGVyaW9kT2Y8VD4AABBNAUp1c3QgYSBjb25uZWN0IGludG8gdGhlIGBsZWFzZV9vdXRgIGNhbGwsIGluIGNhc2UgUm9vdCB3YW50cyB0byBmb3JjZSBzb21lIGxlYXNlIHRv/GhhcHBlbiBpbmRlcGVuZGVudGx5IG9mIGFueSBvdGhlciBvbi1jaGFpbiBtZWNoYW5pc20gdG8gdXNlIGl0LgD4VGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgbWF0Y2ggYFQ6OkZvcmNlT3JpZ2luYC5AY2xlYXJfYWxsX2xlYXNlcwQBEHBhcmGNAgEYUGFyYUlkAAEMTQFDbGVhciBhbGwgbGVhc2VzIGZvciBhIFBhcmEgSWQsIHJlZnVuZGluZyBhbnkgZGVwb3NpdHMgYmFjayB0byB0aGUgb3JpZ2luYWwgb3duZXJzLgD4VGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgbWF0Y2ggYFQ6OkZvcmNlT3JpZ2luYC48dHJpZ2dlcl9vbmJvYXJkBAEQcGFyYY0CARhQYXJhSWQAAhwlAVRyeSB0byBvbmJvYXJkIGEgcGFyYWNoYWluIHRoYXQgaGFzIGEgbGVhc2UgZm9yIHRoZSBjdXJyZW50IGxlYXNlIHBlcmlvZC4ARQFUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VmdWwgaWYgdGhlcmUgd2FzIHNvbWUgc3RhdGUgaXNzdWUgd2l0aCBhIHBhcmEgdGhhdCBzaG91bGQ5AWhhdmUgb25ib2FyZGVkLCBidXQgd2FzIHVuYWJsZSB0by4gQXMgbG9uZyBhcyB0aGV5IGhhdmUgYSBsZWFzZSBwZXJpb2QsIHdlIGNhbmxsZXQgdGhlbSBvbmJvYXJkIGZyb20gaGVyZS4AzE9yaWdpbiBtdXN0IGJlIHNpZ25lZCwgYnV0IGNhbiBiZSBjYWxsZWQgYnkgYW55b25lLgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy49BRBccG9sa2Fkb3RfcnVudGltZV9jb21tb24gYXVjdGlvbnMYcGFsbGV0EENhbGwEBFQAAQwsbmV3X2F1Y3Rpb24IASBkdXJhdGlvbuwBREJsb2NrTnVtYmVyRm9yPFQ+AAFIbGVhc2VfcGVyaW9kX2luZGV47AFATGVhc2VQZXJpb2RPZjxUPgAAFFRDcmVhdGUgYSBuZXcgYXVjdGlvbi4AUQFUaGlzIGNhbiBvbmx5IGhhcHBlbiB3aGVuIHRoZXJlIGlzbid0IGFscmVhZHkgYW4gYXVjdGlvbiBpbiBwcm9ncmVzcyBhbmQgbWF5IG9ubHkgYmUlAWNhbGxlZCBieSB0aGUgcm9vdCBvcmlnaW4uIEFjY2VwdHMgdGhlIGBkdXJhdGlvbmAgb2YgdGhpcyBhdWN0aW9uIGFuZCB0aGVZAWBsZWFzZV9wZXJpb2RfaW5kZXhgIG9mIHRoZSBpbml0aWFsIGxlYXNlIHBlcmlvZCBvZiB0aGUgZm91ciB0aGF0IGFyZSB0byBiZSBhdWN0aW9uZWQuDGJpZBQBEHBhcmFBBQEYUGFyYUlkAAE0YXVjdGlvbl9pbmRleOwBMEF1Y3Rpb25JbmRleAABKGZpcnN0X3Nsb3TsAUBMZWFzZVBlcmlvZE9mPFQ+AAEkbGFzdF9zbG907AFATGVhc2VQZXJpb2RPZjxUPgABGGFtb3VudPwBMEJhbGFuY2VPZjxUPgABQEkBTWFrZSBhIG5ldyBiaWQgZnJvbSBhbiBhY2NvdW50IChpbmNsdWRpbmcgYSBwYXJhY2hhaW4gYWNjb3VudCkgZm9yIGRlcGxveWluZyBhIG5ldyhwYXJhY2hhaW4uAFkBTXVsdGlwbGUgc2ltdWx0YW5lb3VzIGJpZHMgZnJvbSB0aGUgc2FtZSBiaWRkZXIgYXJlIGFsbG93ZWQgb25seSBhcyBsb25nIGFzIGFsbCBhY3RpdmU9AWJpZHMgb3ZlcmxhcCBlYWNoIG90aGVyIChpLmUuIGFyZSBtdXR1YWxseSBleGNsdXNpdmUpLiBCaWRzIGNhbm5vdCBiZSByZWRhY3RlZC4AVQEtIGBzdWJgIGlzIHRoZSBzdWItYmlkZGVyIElELCBhbGxvd2luZyBmb3IgbXVsdGlwbGUgY29tcGV0aW5nIGJpZHMgdG8gYmUgbWFkZSBieSAoYW5kcGZ1bmRlZCBieSkgdGhlIHNhbWUgYWNjb3VudC5NAS0gYGF1Y3Rpb25faW5kZXhgIGlzIHRoZSBpbmRleCBvZiB0aGUgYXVjdGlvbiB0byBiaWQgb24uIFNob3VsZCBqdXN0IGJlIHRoZSBwcmVzZW50aHZhbHVlIG9mIGBBdWN0aW9uQ291bnRlcmAuSQEtIGBmaXJzdF9zbG90YCBpcyB0aGUgZmlyc3QgbGVhc2UgcGVyaW9kIGluZGV4IG9mIHRoZSByYW5nZSB0byBiaWQgb24uIFRoaXMgaXMgdGhlCQFhYnNvbHV0ZSBsZWFzZSBwZXJpb2QgaW5kZXggdmFsdWUsIG5vdCBhbiBhdWN0aW9uLXNwZWNpZmljIG9mZnNldC5BAS0gYGxhc3Rfc2xvdGAgaXMgdGhlIGxhc3QgbGVhc2UgcGVyaW9kIGluZGV4IG9mIHRoZSByYW5nZSB0byBiaWQgb24uIFRoaXMgaXMgdGhlCQFhYnNvbHV0ZSBsZWFzZSBwZXJpb2QgaW5kZXggdmFsdWUsIG5vdCBhbiBhdWN0aW9uLXNwZWNpZmljIG9mZnNldC5JAS0gYGFtb3VudGAgaXMgdGhlIGFtb3VudCB0byBiaWQgdG8gYmUgaGVsZCBhcyBkZXBvc2l0IGZvciB0aGUgcGFyYWNoYWluIHNob3VsZCB0aGXIYmlkIHdpbi4gVGhpcyBhbW91bnQgaXMgaGVsZCB0aHJvdWdob3V0IHRoZSByYW5nZS44Y2FuY2VsX2F1Y3Rpb24AAgx4Q2FuY2VsIGFuIGluLXByb2dyZXNzIGF1Y3Rpb24uAIhDYW4gb25seSBiZSBjYWxsZWQgYnkgUm9vdCBvcmlnaW4uBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLkEFAAAGjQIARQUQXHBvbGthZG90X3J1bnRpbWVfY29tbW9uJGNyb3dkbG9hbhhwYWxsZXQQQ2FsbAQEVAABJBhjcmVhdGUYARRpbmRleEEFARhQYXJhSWQAAQxjYXD8ATBCYWxhbmNlT2Y8VD4AATBmaXJzdF9wZXJpb2TsAUBMZWFzZVBlcmlvZE9mPFQ+AAEsbGFzdF9wZXJpb2TsAUBMZWFzZVBlcmlvZE9mPFQ+AAEMZW5k7AFEQmxvY2tOdW1iZXJGb3I8VD4AASB2ZXJpZmllckkFAUxPcHRpb248TXVsdGlTaWduZXI+AAAUTQFDcmVhdGUgYSBuZXcgY3Jvd2Rsb2FuaW5nIGNhbXBhaWduIGZvciBhIHBhcmFjaGFpbiBzbG90IHdpdGggdGhlIGdpdmVuIGxlYXNlIHBlcmlvZBhyYW5nZS4AXQFUaGlzIGFwcGxpZXMgYSBsb2NrIHRvIHlvdXIgcGFyYWNoYWluIGNvbmZpZ3VyYXRpb24sIGVuc3VyaW5nIHRoYXQgaXQgY2Fubm90IGJlIGNoYW5nZWRkYnkgdGhlIHBhcmFjaGFpbiBtYW5hZ2VyLihjb250cmlidXRlDAEUaW5kZXhBBQEYUGFyYUlkAAEUdmFsdWX8ATBCYWxhbmNlT2Y8VD4AASRzaWduYXR1cmVRBQFYT3B0aW9uPE11bHRpU2lnbmF0dXJlPgABCFEBQ29udHJpYnV0ZSB0byBhIGNyb3dkIHNhbGUuIFRoaXMgd2lsbCB0cmFuc2ZlciBzb21lIGJhbGFuY2Ugb3ZlciB0byBmdW5kIGEgcGFyYWNoYWluUQFzbG90LiBJdCB3aWxsIGJlIHdpdGhkcmF3YWJsZSB3aGVuIHRoZSBjcm93ZGxvYW4gaGFzIGVuZGVkIGFuZCB0aGUgZnVuZHMgYXJlIHVudXNlZC4gd2l0aGRyYXcIAQx3aG8AATBUOjpBY2NvdW50SWQAARRpbmRleEEFARhQYXJhSWQAAkTAV2l0aGRyYXcgZnVsbCBiYWxhbmNlIG9mIGEgc3BlY2lmaWMgY29udHJpYnV0b3IuAMBPcmlnaW4gbXVzdCBiZSBzaWduZWQsIGJ1dCBjYW4gY29tZSBmcm9tIGFueW9uZS4AXQFUaGUgZnVuZCBtdXN0IGJlIGVpdGhlciBpbiwgb3IgcmVhZHkgZm9yLCByZXRpcmVtZW50LiBGb3IgYSBmdW5kIHRvIGJlICppbiogcmV0aXJlbWVudCxJAXRoZW4gdGhlIHJldGlyZW1lbnQgZmxhZyBtdXN0IGJlIHNldC4gRm9yIGEgZnVuZCB0byBiZSByZWFkeSBmb3IgcmV0aXJlbWVudCwgdGhlbjqcLSBpdCBtdXN0IG5vdCBhbHJlYWR5IGJlIGluIHJldGlyZW1lbnQ7TQEtIHRoZSBhbW91bnQgb2YgcmFpc2VkIGZ1bmRzIG11c3QgYmUgYmlnZ2VyIHRoYW4gdGhlIF9mcmVlXyBiYWxhbmNlIG9mIHRoZSBhY2NvdW50OzQtIGFuZCBlaXRoZXI6vCAgLSB0aGUgYmxvY2sgbnVtYmVyIG11c3QgYmUgYXQgbGVhc3QgYGVuZGA7IG9yLQEgIC0gdGhlIGN1cnJlbnQgbGVhc2UgcGVyaW9kIG11c3QgYmUgZ3JlYXRlciB0aGFuIHRoZSBmdW5kJ3MgYGxhc3RfcGVyaW9kYC4AVQFJbiB0aGlzIGNhc2UsIHRoZSBmdW5kJ3MgcmV0aXJlbWVudCBmbGFnIGlzIHNldCBhbmQgaXRzIGBlbmRgIGlzIHJlc2V0IHRvIHRoZSBjdXJyZW50NGJsb2NrIG51bWJlci4A8C0gYHdob2A6IFRoZSBhY2NvdW50IHdob3NlIGNvbnRyaWJ1dGlvbiBzaG91bGQgYmUgd2l0aGRyYXduLhkBLSBgaW5kZXhgOiBUaGUgcGFyYWNoYWluIHRvIHdob3NlIGNyb3dkbG9hbiB0aGUgY29udHJpYnV0aW9uIHdhcyBtYWRlLhhyZWZ1bmQEARRpbmRleEEFARhQYXJhSWQAAxTgQXV0b21hdGljYWxseSByZWZ1bmQgY29udHJpYnV0b3JzIG9mIGFuIGVuZGVkIGNyb3dkbG9hbi4hAUR1ZSB0byB3ZWlnaHQgcmVzdHJpY3Rpb25zLCB0aGlzIGZ1bmN0aW9uIG1heSBuZWVkIHRvIGJlIGNhbGxlZCBtdWx0aXBsZUkBdGltZXMgdG8gZnVsbHkgcmVmdW5kIGFsbCB1c2Vycy4gV2Ugd2lsbCByZWZ1bmQgYFJlbW92ZUtleXNMaW1pdGAgdXNlcnMgYXQgYSB0aW1lLgDAT3JpZ2luIG11c3QgYmUgc2lnbmVkLCBidXQgY2FuIGNvbWUgZnJvbSBhbnlvbmUuIGRpc3NvbHZlBAEUaW5kZXhBBQEYUGFyYUlkAAQEVQFSZW1vdmUgYSBmdW5kIGFmdGVyIHRoZSByZXRpcmVtZW50IHBlcmlvZCBoYXMgZW5kZWQgYW5kIGFsbCBmdW5kcyBoYXZlIGJlZW4gcmV0dXJuZWQuEGVkaXQYARRpbmRleEEFARhQYXJhSWQAAQxjYXD8ATBCYWxhbmNlT2Y8VD4AATBmaXJzdF9wZXJpb2TsAUBMZWFzZVBlcmlvZE9mPFQ+AAEsbGFzdF9wZXJpb2TsAUBMZWFzZVBlcmlvZE9mPFQ+AAEMZW5k7AFEQmxvY2tOdW1iZXJGb3I8VD4AASB2ZXJpZmllckkFAUxPcHRpb248TXVsdGlTaWduZXI+AAUM0EVkaXQgdGhlIGNvbmZpZ3VyYXRpb24gZm9yIGFuIGluLXByb2dyZXNzIGNyb3dkbG9hbi4AiENhbiBvbmx5IGJlIGNhbGxlZCBieSBSb290IG9yaWdpbi4gYWRkX21lbW8IARRpbmRleI0CARhQYXJhSWQAARBtZW1vOAEcVmVjPHU4PgAGDOxBZGQgYW4gb3B0aW9uYWwgbWVtbyB0byBhbiBleGlzdGluZyBjcm93ZGxvYW4gY29udHJpYnV0aW9uLgAtAU9yaWdpbiBtdXN0IGJlIFNpZ25lZCwgYW5kIHRoZSB1c2VyIG11c3QgaGF2ZSBjb250cmlidXRlZCB0byB0aGUgY3Jvd2Rsb2FuLhBwb2tlBAEUaW5kZXiNAgEYUGFyYUlkAAcMdFBva2UgdGhlIGZ1bmQgaW50byBgTmV3UmFpc2VgANxPcmlnaW4gbXVzdCBiZSBTaWduZWQsIGFuZCB0aGUgZnVuZCBoYXMgbm9uLXplcm8gcmFpc2UuOGNvbnRyaWJ1dGVfYWxsCAEUaW5kZXhBBQEYUGFyYUlkAAEkc2lnbmF0dXJlUQUBWE9wdGlvbjxNdWx0aVNpZ25hdHVyZT4ACAxhAUNvbnRyaWJ1dGUgeW91ciBlbnRpcmUgYmFsYW5jZSB0byBhIGNyb3dkIHNhbGUuIFRoaXMgd2lsbCB0cmFuc2ZlciB0aGUgZW50aXJlIGJhbGFuY2Ugb2ZRAWEgdXNlciBvdmVyIHRvIGZ1bmQgYSBwYXJhY2hhaW4gc2xvdC4gSXQgd2lsbCBiZSB3aXRoZHJhd2FibGUgd2hlbiB0aGUgY3Jvd2Rsb2FuIGhhc3xlbmRlZCBhbmQgdGhlIGZ1bmRzIGFyZSB1bnVzZWQuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLkkFBBhPcHRpb24EBFQBTQUBCBBOb25lAAAAEFNvbWUEAE0FAAABAABNBQgoc3BfcnVudGltZSxNdWx0aVNpZ25lcgABDBxFZDI1NTE5BAAEATxlZDI1NTE5OjpQdWJsaWMAAAAcU3IyNTUxOQQABAE8c3IyNTUxOTo6UHVibGljAAEAFEVjZHNhBAAtAgE0ZWNkc2E6OlB1YmxpYwACAABRBQQYT3B0aW9uBARUAVUFAQgQTm9uZQAAABBTb21lBABVBQAAAQAAVQUIKHNwX3J1bnRpbWU4TXVsdGlTaWduYXR1cmUAAQwcRWQyNTUxOQQASQIBSGVkMjU1MTk6OlNpZ25hdHVyZQAAABxTcjI1NTE5BABJAgFIc3IyNTUxOTo6U2lnbmF0dXJlAAEAFEVjZHNhBADZAgFAZWNkc2E6OlNpZ25hdHVyZQACAABZBRBscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zIGNvcmV0aW1lGHBhbGxldBBDYWxsBARUAAEMSHJlcXVlc3RfY29yZV9jb3VudAQBFGNvdW50bQEBDHUxNgABGFEBUmVxdWVzdCB0aGUgY29uZmlndXJhdGlvbiB0byBiZSB1cGRhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgY29yZXMuIFdhcm5pbmc6UQFTaW5jZSB0aGlzIG9ubHkgc2NoZWR1bGVzIGEgY29uZmlndXJhdGlvbiB1cGRhdGUsIGl0IHRha2VzIHR3byBzZXNzaW9ucyB0byBjb21lIGludG8cZWZmZWN0LgCYLSBgb3JpZ2luYDogUm9vdCBvciB0aGUgQ29yZXRpbWUgQ2hhaW6ALSBgY291bnRgOiB0b3RhbCBudW1iZXIgb2YgY29yZXNIcmVxdWVzdF9yZXZlbnVlX2F0BAEQd2hlbhABLEJsb2NrTnVtYmVyAAIQYQFSZXF1ZXN0IHRvIGNsYWltIHRoZSBpbnN0YW50YW5lb3VzIGNvcmV0aW1lIHNhbGVzIHJldmVudWUgc3RhcnRpbmcgZnJvbSB0aGUgYmxvY2sgaXQgd2FzXQFsYXN0IGNsYWltZWQgdW50aWwgYW5kIHVwIHRvIHRoZSBibG9jayBzcGVjaWZpZWQuIFRoZSBjbGFpbWVkIGFtb3VudCB2YWx1ZSBpcyBzZW50IGJhY2tRAXRvIHRoZSBDb3JldGltZSBjaGFpbiBpbiBhIGBub3RpZnlfcmV2ZW51ZWAgbWVzc2FnZS4gQXQgdGhlIHNhbWUgdGltZSwgdGhlIGFtb3VudCBpc4R0ZWxlcG9ydGVkIHRvIHRoZSBDb3JldGltZSBjaGFpbi4sYXNzaWduX2NvcmUQARBjb3JlbQEBPEJyb2tlckNvcmVJbmRleAABFGJlZ2luEAFEQmxvY2tOdW1iZXJGb3I8VD4AAShhc3NpZ25tZW50XQUBjFZlYzwoQ29yZUFzc2lnbm1lbnQsIFBhcnRzT2Y1NzYwMCk+AAEgZW5kX2hpbnRhAgFkT3B0aW9uPEJsb2NrTnVtYmVyRm9yPFQ+PgAEJFkBUmVjZWl2ZSBpbnN0cnVjdGlvbnMgZnJvbSB0aGUgYEV4dGVybmFsQnJva2VyT3JpZ2luYCwgZGV0YWlsaW5nIGhvdyBhIHNwZWNpZmljIGNvcmUgaXMsdG8gYmUgdXNlZC4ALFBhcmFtZXRlcnM6IQEtYG9yaWdpbmA6IFRoZSBgRXh0ZXJuYWxCcm9rZXJPcmlnaW5gLCBhc3N1bWVkIHRvIGJlIHRoZSBjb3JldGltZSBjaGFpbi6sLWBjb3JlYDogVGhlIGNvcmUgdGhhdCBzaG91bGQgYmUgc2NoZWR1bGVkLtgtYGJlZ2luYDogVGhlIHN0YXJ0aW5nIGJsb2NraGVpZ2h0IG9mIHRoZSBpbnN0cnVjdGlvbi7ULWBhc3NpZ25tZW50YDogSG93IHRoZSBibG9ja3NwYWNlIHNob3VsZCBiZSB1dGlsaXNlZC5ZAS1gZW5kX2hpbnRgOiBBbiBvcHRpb25hbCBoaW50IGFzIHRvIHdoZW4gdGhpcyBwYXJ0aWN1bGFyIHNldCBvZiBpbnN0cnVjdGlvbnMgd2lsbCBlbmQuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLl0FAAACYQUAYQUAAAQIZQVpBQBlBQw0cGFsbGV0X2Jyb2tlckhjb3JldGltZV9pbnRlcmZhY2U4Q29yZUFzc2lnbm1lbnQAAQwQSWRsZQAAABBQb29sAAEAEFRhc2sEABABGFRhc2tJZAACAABpBQxscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zRGFzc2lnbmVyX2NvcmV0aW1lMFBhcnRzT2Y1NzYwMAAABABtAQEMdTE2AABtBQxscGFsbGV0X3N0YXRlX3RyaWVfbWlncmF0aW9uGHBhbGxldBBDYWxsBARUAAEYWGNvbnRyb2xfYXV0b19taWdyYXRpb24EATBtYXliZV9jb25maWdxBQFcT3B0aW9uPE1pZ3JhdGlvbkxpbWl0cz4AAAyAQ29udHJvbCB0aGUgYXV0b21hdGljIG1pZ3JhdGlvbi4ADQFUaGUgZGlzcGF0Y2ggb3JpZ2luIG9mIHRoaXMgY2FsbCBtdXN0IGJlIFtgQ29uZmlnOjpDb250cm9sT3JpZ2luYF0uQGNvbnRpbnVlX21pZ3JhdGUMARhsaW1pdHN1BQE8TWlncmF0aW9uTGltaXRzAAE8cmVhbF9zaXplX3VwcGVyEAEMdTMyAAEwd2l0bmVzc190YXNreQUBQE1pZ3JhdGlvblRhc2s8VD4AAVS4Q29udGludWUgdGhlIG1pZ3JhdGlvbiBmb3IgdGhlIGdpdmVuIGBsaW1pdHNgLgDsVGhlIGRpc3BhdGNoIG9yaWdpbiBvZiB0aGlzIGNhbGwgY2FuIGJlIGFueSBzaWduZWQgYWNjb3VudC4AXQFUaGlzIHRyYW5zYWN0aW9uIGhhcyBOTyBNT05FVEFSWSBJTkNFTlRJVkVTLiBjYWxsaW5nIGl0IHdpbGwgbm90IHJld2FyZCBhbnlvbmUuIEFsYmVpdCzsVXBvbiBzdWNjZXNzZnVsIGV4ZWN1dGlvbiwgdGhlIHRyYW5zYWN0aW9uIGZlZSBpcyByZXR1cm5lZC4AQQFUaGUgKHBvdGVudGlhbGx5IG92ZXItZXN0aW1hdGVkKSBvZiB0aGUgYnl0ZSBsZW5ndGggb2YgYWxsIHRoZSBkYXRhIHJlYWQgbXVzdCBiZVkBcHJvdmlkZWQgZm9yIHVwLWZyb250IGZlZS1wYXltZW50IGFuZCB3ZWlnaGluZy4gSW4gZXNzZW5jZSwgdGhlIGNhbGxlciBpcyBndWFyYW50ZWVpbmdJAXRoYXQgZXhlY3V0aW5nIHRoZSBjdXJyZW50IGBNaWdyYXRpb25UYXNrYCB3aXRoIHRoZSBnaXZlbiBgbGltaXRzYCB3aWxsIG5vdCBleGNlZWSUYHJlYWxfc2l6ZV91cHBlcmAgYnl0ZXMgb2YgcmVhZCBkYXRhLgBFAVRoZSBgd2l0bmVzc190YXNrYCBpcyBtZXJlbHkgYSBoZWxwZXIgdG8gcHJldmVudCB0aGUgY2FsbGVyIGZyb20gYmVpbmcgc2xhc2hlZCBvcl0BZ2VuZXJhbGx5IHRyaWdnZXIgYSBtaWdyYXRpb24gdGhhdCB0aGV5IGRvIG5vdCBpbnRlbmQuIFRoaXMgcGFyYW1ldGVyIGlzIGp1c3QgYSBtZXNzYWdlPQFmcm9tIGNhbGxlciwgc2F5aW5nIHRoYXQgdGhleSBiZWxpZXZlZCBgd2l0bmVzc190YXNrYCB3YXMgdGhlIGxhc3Qgc3RhdGUgb2YgdGhlWQFtaWdyYXRpb24sIGFuZCB0aGV5IG9ubHkgd2lzaCBmb3IgdGhlaXIgdHJhbnNhY3Rpb24gdG8gZG8gYW55dGhpbmcsIGlmIHRoaXMgYXNzdW1wdGlvbhEBaG9sZHMuIEluIGNhc2UgYHdpdG5lc3NfdGFza2AgZG9lcyBub3QgbWF0Y2gsIHRoZSB0cmFuc2FjdGlvbiBmYWlscy4AOQFCYXNlZCBvbiB0aGUgZG9jdW1lbnRhdGlvbiBvZiBbYE1pZ3JhdGlvblRhc2s6Om1pZ3JhdGVfdW50aWxfZXhoYXVzdGlvbmBdLCB0aGVNAXJlY29tbWVuZGVkIHdheSBvZiBkb2luZyB0aGlzIGlzIHRvIHBhc3MgYSBgbGltaXRgIHRoYXQgb25seSBib3VuZHMgYGNvdW50YCwgYXMgdGhlnGBzaXplYCBsaW1pdCBjYW4gYWx3YXlzIGJlIG92ZXJ3cml0dGVuLkhtaWdyYXRlX2N1c3RvbV90b3AIARBrZXlzhQEBMFZlYzxWZWM8dTg+PgABMHdpdG5lc3Nfc2l6ZRABDHUzMgACEAkBTWlncmF0ZSB0aGUgbGlzdCBvZiB0b3Aga2V5cyBieSBpdGVyYXRpbmcgZWFjaCBvZiB0aGVtIG9uZSBieSBvbmUuAFUBVGhpcyBkb2VzIG5vdCBhZmZlY3QgdGhlIGdsb2JhbCBtaWdyYXRpb24gcHJvY2VzcyB0cmFja2VyIChbYE1pZ3JhdGlvblByb2Nlc3NgXSksIGFuZPxzaG91bGQgb25seSBiZSB1c2VkIGluIGNhc2UgYW55IGtleXMgYXJlIGxlZnRvdmVyIGR1ZSB0byBhIGJ1Zy5QbWlncmF0ZV9jdXN0b21fY2hpbGQMARByb290OAEcVmVjPHU4PgABKGNoaWxkX2tleXOFAQEwVmVjPFZlYzx1OD4+AAEodG90YWxfc2l6ZRABDHUzMgADGBEBTWlncmF0ZSB0aGUgbGlzdCBvZiBjaGlsZCBrZXlzIGJ5IGl0ZXJhdGluZyBlYWNoIG9mIHRoZW0gb25lIGJ5IG9uZS4ADQFBbGwgb2YgdGhlIGdpdmVuIGNoaWxkIGtleXMgbXVzdCBiZSBwcmVzZW50IHVuZGVyIG9uZSBgY2hpbGRfcm9vdGAuAFUBVGhpcyBkb2VzIG5vdCBhZmZlY3QgdGhlIGdsb2JhbCBtaWdyYXRpb24gcHJvY2VzcyB0cmFja2VyIChbYE1pZ3JhdGlvblByb2Nlc3NgXSksIGFuZPxzaG91bGQgb25seSBiZSB1c2VkIGluIGNhc2UgYW55IGtleXMgYXJlIGxlZnRvdmVyIGR1ZSB0byBhIGJ1Zy5Uc2V0X3NpZ25lZF9tYXhfbGltaXRzBAEYbGltaXRzdQUBPE1pZ3JhdGlvbkxpbWl0cwAEBLhTZXQgdGhlIG1heGltdW0gbGltaXQgb2YgdGhlIHNpZ25lZCBtaWdyYXRpb24uSGZvcmNlX3NldF9wcm9ncmVzcwgBMHByb2dyZXNzX3RvcH0FATRQcm9ncmVzc09mPFQ+AAE4cHJvZ3Jlc3NfY2hpbGR9BQE0UHJvZ3Jlc3NPZjxUPgAFJMhGb3JjZWZ1bGx5IHNldCB0aGUgcHJvZ3Jlc3MgdGhlIHJ1bm5pbmcgbWlncmF0aW9uLgBdAVRoaXMgaXMgb25seSB1c2VmdWwgaW4gb25lIGNhc2U6IHRoZSBuZXh0IGtleSB0byBtaWdyYXRlIGlzIHRvbyBiaWcgdG8gYmUgbWlncmF0ZWQgd2l0aFUBYSBzaWduZWQgYWNjb3VudCwgaW4gYSBwYXJhY2hhaW4gY29udGV4dCwgYW5kIHdlIHNpbXBseSB3YW50IHRvIHNraXAgaXQuIEEgcmVhc29uYWJsZWEBZXhhbXBsZSBvZiB0aGlzIHdvdWxkIGJlIGA6Y29kZTpgLCB3aGljaCBpcyBib3RoIHZlcnkgZXhwZW5zaXZlIHRvIG1pZ3JhdGUsIGFuZCBjb21tb25seaR1c2VkLCBzbyBwcm9iYWJseSBpdCBpcyBhbHJlYWR5IG1pZ3JhdGVkLgBdAUluIGNhc2UgeW91IG1lc3MgdGhpbmdzIHVwLCB5b3UgY2FuIGFsc28sIGluIHByaW5jaXBsZSwgdXNlIHRoaXMgdG8gcmVzZXQgdGhlIG1pZ3JhdGlvbiBwcm9jZXNzLgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy5xBQQYT3B0aW9uBARUAXUFAQgQTm9uZQAAABBTb21lBAB1BQAAAQAAdQUMbHBhbGxldF9zdGF0ZV90cmllX21pZ3JhdGlvbhhwYWxsZXQ8TWlncmF0aW9uTGltaXRzAAAIARBzaXplEAEMdTMyAAEQaXRlbRABDHUzMgAAeQUMbHBhbGxldF9zdGF0ZV90cmllX21pZ3JhdGlvbhhwYWxsZXQ0TWlncmF0aW9uVGFzawQEVAAAFAEwcHJvZ3Jlc3NfdG9wfQUBNFByb2dyZXNzT2Y8VD4AAThwcm9ncmVzc19jaGlsZH0FATRQcm9ncmVzc09mPFQ+AAEQc2l6ZRABDHUzMgABJHRvcF9pdGVtcxABDHUzMgABLGNoaWxkX2l0ZW1zEAEMdTMyAAB9BQxscGFsbGV0X3N0YXRlX3RyaWVfbWlncmF0aW9uGHBhbGxldCBQcm9ncmVzcwQkTWF4S2V5TGVuAAEMHFRvU3RhcnQAAAAcTGFzdEtleQQAgQUBZEJvdW5kZWRWZWM8dTgsIE1heEtleUxlbj4AAQAgQ29tcGxldGUAAgAAgQUMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAEIBFMAAAQAOAEYVmVjPFQ+AACFBQwocGFsbGV0X3hjbRhwYWxsZXQQQ2FsbAQEVAABOBBzZW5kCAEQZGVzdEUBAVhCb3g8VmVyc2lvbmVkTG9jYXRpb24+AAEcbWVzc2FnZYkFAVRCb3g8VmVyc2lvbmVkWGNtPCgpPj4AAAA8dGVsZXBvcnRfYXNzZXRzEAEQZGVzdEUBAVhCb3g8VmVyc2lvbmVkTG9jYXRpb24+AAEsYmVuZWZpY2lhcnlFAQFYQm94PFZlcnNpb25lZExvY2F0aW9uPgABGGFzc2V0c4kGAVBCb3g8VmVyc2lvbmVkQXNzZXRzPgABOGZlZV9hc3NldF9pdGVtEAEMdTMyAAFIEQFUZWxlcG9ydCBzb21lIGFzc2V0cyBmcm9tIHRoZSBsb2NhbCBjaGFpbiB0byBzb21lIGRlc3RpbmF0aW9uIGNoYWluLgAdASoqVGhpcyBmdW5jdGlvbiBpcyBkZXByZWNhdGVkOiBVc2UgYGxpbWl0ZWRfdGVsZXBvcnRfYXNzZXRzYCBpbnN0ZWFkLioqAFEBRmVlIHBheW1lbnQgb24gdGhlIGRlc3RpbmF0aW9uIHNpZGUgaXMgbWFkZSBmcm9tIHRoZSBhc3NldCBpbiB0aGUgYGFzc2V0c2AgdmVjdG9yIG9mYQFpbmRleCBgZmVlX2Fzc2V0X2l0ZW1gLiBUaGUgd2VpZ2h0IGxpbWl0IGZvciBmZWVzIGlzIG5vdCBwcm92aWRlZCBhbmQgdGh1cyBpcyB1bmxpbWl0ZWQstHdpdGggYWxsIGZlZXMgdGFrZW4gYXMgbmVlZGVkIGZyb20gdGhlIGFzc2V0LgApAS0gYG9yaWdpbmA6IE11c3QgYmUgY2FwYWJsZSBvZiB3aXRoZHJhd2luZyB0aGUgYGFzc2V0c2AgYW5kIGV4ZWN1dGluZyBYQ00uJQEtIGBkZXN0YDogRGVzdGluYXRpb24gY29udGV4dCBmb3IgdGhlIGFzc2V0cy4gV2lsbCB0eXBpY2FsbHkgYmUgYFtQYXJlbnQsYQEgIFBhcmFjaGFpbiguLildYCB0byBzZW5kIGZyb20gcGFyYWNoYWluIHRvIHBhcmFjaGFpbiwgb3IgYFtQYXJhY2hhaW4oLi4pXWAgdG8gc2VuZCBmcm9tVCAgcmVsYXkgdG8gcGFyYWNoYWluLlUBLSBgYmVuZWZpY2lhcnlgOiBBIGJlbmVmaWNpYXJ5IGxvY2F0aW9uIGZvciB0aGUgYXNzZXRzIGluIHRoZSBjb250ZXh0IG9mIGBkZXN0YC4gV2lsbJggIGdlbmVyYWxseSBiZSBhbiBgQWNjb3VudElkMzJgIHZhbHVlLlkBLSBgYXNzZXRzYDogVGhlIGFzc2V0cyB0byBiZSB3aXRoZHJhd24uIFRoaXMgc2hvdWxkIGluY2x1ZGUgdGhlIGFzc2V0cyB1c2VkIHRvIHBheSB0aGVoICBmZWUgb24gdGhlIGBkZXN0YCBjaGFpbi5NAS0gYGZlZV9hc3NldF9pdGVtYDogVGhlIGluZGV4IGludG8gYGFzc2V0c2Agb2YgdGhlIGl0ZW0gd2hpY2ggc2hvdWxkIGJlIHVzZWQgdG8gcGF5HCAgZmVlcy5ccmVzZXJ2ZV90cmFuc2Zlcl9hc3NldHMQARBkZXN0RQEBWEJveDxWZXJzaW9uZWRMb2NhdGlvbj4AASxiZW5lZmljaWFyeUUBAVhCb3g8VmVyc2lvbmVkTG9jYXRpb24+AAEYYXNzZXRziQYBUEJveDxWZXJzaW9uZWRBc3NldHM+AAE4ZmVlX2Fzc2V0X2l0ZW0QAQx1MzIAAnhdAVRyYW5zZmVyIHNvbWUgYXNzZXRzIGZyb20gdGhlIGxvY2FsIGNoYWluIHRvIHRoZSBkZXN0aW5hdGlvbiBjaGFpbiB0aHJvdWdoIHRoZWlyIGxvY2FsLHhkZXN0aW5hdGlvbiBvciByZW1vdGUgcmVzZXJ2ZS4APQFgYXNzZXRzYCBtdXN0IGhhdmUgc2FtZSByZXNlcnZlIGxvY2F0aW9uIGFuZCBtYXkgbm90IGJlIHRlbGVwb3J0YWJsZSB0byBgZGVzdGAuTQEgLSBgYXNzZXRzYCBoYXZlIGxvY2FsIHJlc2VydmU6IHRyYW5zZmVyIGFzc2V0cyB0byBzb3ZlcmVpZ24gYWNjb3VudCBvZiBkZXN0aW5hdGlvbk0BICAgY2hhaW4gYW5kIGZvcndhcmQgYSBub3RpZmljYXRpb24gWENNIHRvIGBkZXN0YCB0byBtaW50IGFuZCBkZXBvc2l0IHJlc2VydmUtYmFzZWRsICAgYXNzZXRzIHRvIGBiZW5lZmljaWFyeWAuVQEgLSBgYXNzZXRzYCBoYXZlIGRlc3RpbmF0aW9uIHJlc2VydmU6IGJ1cm4gbG9jYWwgYXNzZXRzIGFuZCBmb3J3YXJkIGEgbm90aWZpY2F0aW9uIHRvWQEgICBgZGVzdGAgY2hhaW4gdG8gd2l0aGRyYXcgdGhlIHJlc2VydmUgYXNzZXRzIGZyb20gdGhpcyBjaGFpbidzIHNvdmVyZWlnbiBhY2NvdW50IGFuZIQgICBkZXBvc2l0IHRoZW0gdG8gYGJlbmVmaWNpYXJ5YC5hASAtIGBhc3NldHNgIGhhdmUgcmVtb3RlIHJlc2VydmU6IGJ1cm4gbG9jYWwgYXNzZXRzLCBmb3J3YXJkIFhDTSB0byByZXNlcnZlIGNoYWluIHRvIG1vdmVhASAgIHJlc2VydmVzIGZyb20gdGhpcyBjaGFpbidzIFNBIHRvIGBkZXN0YCBjaGFpbidzIFNBLCBhbmQgZm9yd2FyZCBhbm90aGVyIFhDTSB0byBgZGVzdGD0ICAgdG8gbWludCBhbmQgZGVwb3NpdCByZXNlcnZlLWJhc2VkIGFzc2V0cyB0byBgYmVuZWZpY2lhcnlgLgA9ASoqVGhpcyBmdW5jdGlvbiBpcyBkZXByZWNhdGVkOiBVc2UgYGxpbWl0ZWRfcmVzZXJ2ZV90cmFuc2Zlcl9hc3NldHNgIGluc3RlYWQuKioAUQFGZWUgcGF5bWVudCBvbiB0aGUgZGVzdGluYXRpb24gc2lkZSBpcyBtYWRlIGZyb20gdGhlIGFzc2V0IGluIHRoZSBgYXNzZXRzYCB2ZWN0b3Igb2ZhAWluZGV4IGBmZWVfYXNzZXRfaXRlbWAuIFRoZSB3ZWlnaHQgbGltaXQgZm9yIGZlZXMgaXMgbm90IHByb3ZpZGVkIGFuZCB0aHVzIGlzIHVubGltaXRlZCy0d2l0aCBhbGwgZmVlcyB0YWtlbiBhcyBuZWVkZWQgZnJvbSB0aGUgYXNzZXQuACkBLSBgb3JpZ2luYDogTXVzdCBiZSBjYXBhYmxlIG9mIHdpdGhkcmF3aW5nIHRoZSBgYXNzZXRzYCBhbmQgZXhlY3V0aW5nIFhDTS4lAS0gYGRlc3RgOiBEZXN0aW5hdGlvbiBjb250ZXh0IGZvciB0aGUgYXNzZXRzLiBXaWxsIHR5cGljYWxseSBiZSBgW1BhcmVudCxhASAgUGFyYWNoYWluKC4uKV1gIHRvIHNlbmQgZnJvbSBwYXJhY2hhaW4gdG8gcGFyYWNoYWluLCBvciBgW1BhcmFjaGFpbiguLildYCB0byBzZW5kIGZyb21UICByZWxheSB0byBwYXJhY2hhaW4uVQEtIGBiZW5lZmljaWFyeWA6IEEgYmVuZWZpY2lhcnkgbG9jYXRpb24gZm9yIHRoZSBhc3NldHMgaW4gdGhlIGNvbnRleHQgb2YgYGRlc3RgLiBXaWxsmCAgZ2VuZXJhbGx5IGJlIGFuIGBBY2NvdW50SWQzMmAgdmFsdWUuWQEtIGBhc3NldHNgOiBUaGUgYXNzZXRzIHRvIGJlIHdpdGhkcmF3bi4gVGhpcyBzaG91bGQgaW5jbHVkZSB0aGUgYXNzZXRzIHVzZWQgdG8gcGF5IHRoZcggIGZlZSBvbiB0aGUgYGRlc3RgIChhbmQgcG9zc2libHkgcmVzZXJ2ZSkgY2hhaW5zLk0BLSBgZmVlX2Fzc2V0X2l0ZW1gOiBUaGUgaW5kZXggaW50byBgYXNzZXRzYCBvZiB0aGUgaXRlbSB3aGljaCBzaG91bGQgYmUgdXNlZCB0byBwYXkcICBmZWVzLhxleGVjdXRlCAEcbWVzc2FnZY0GAbRCb3g8VmVyc2lvbmVkWGNtPDxUIGFzIENvbmZpZz46OlJ1bnRpbWVDYWxsPj4AAShtYXhfd2VpZ2h0KAEYV2VpZ2h0AAMg0EV4ZWN1dGUgYW4gWENNIG1lc3NhZ2UgZnJvbSBhIGxvY2FsLCBzaWduZWQsIG9yaWdpbi4ATQFBbiBldmVudCBpcyBkZXBvc2l0ZWQgaW5kaWNhdGluZyB3aGV0aGVyIGBtc2dgIGNvdWxkIGJlIGV4ZWN1dGVkIGNvbXBsZXRlbHkgb3Igb25seShwYXJ0aWFsbHkuAF0BTm8gbW9yZSB0aGFuIGBtYXhfd2VpZ2h0YCB3aWxsIGJlIHVzZWQgaW4gaXRzIGF0dGVtcHRlZCBleGVjdXRpb24uIElmIHRoaXMgaXMgbGVzcyB0aGFuQQF0aGUgbWF4aW11bSBhbW91bnQgb2Ygd2VpZ2h0IHRoYXQgdGhlIG1lc3NhZ2UgY291bGQgdGFrZSB0byBiZSBleGVjdXRlZCwgdGhlbiBub3xleGVjdXRpb24gYXR0ZW1wdCB3aWxsIGJlIG1hZGUuRGZvcmNlX3hjbV92ZXJzaW9uCAEgbG9jYXRpb24NAQE0Qm94PExvY2F0aW9uPgABHHZlcnNpb24QAShYY21WZXJzaW9uAAQYSQFFeHRvbGwgdGhhdCBhIHBhcnRpY3VsYXIgZGVzdGluYXRpb24gY2FuIGJlIGNvbW11bmljYXRlZCB3aXRoIHRocm91Z2ggYSBwYXJ0aWN1bGFyPHZlcnNpb24gb2YgWENNLgDcLSBgb3JpZ2luYDogTXVzdCBiZSBhbiBvcmlnaW4gc3BlY2lmaWVkIGJ5IEFkbWluT3JpZ2luLtgtIGBsb2NhdGlvbmA6IFRoZSBkZXN0aW5hdGlvbiB0aGF0IGlzIGJlaW5nIGRlc2NyaWJlZC4RAS0gYHhjbV92ZXJzaW9uYDogVGhlIGxhdGVzdCB2ZXJzaW9uIG9mIFhDTSB0aGF0IGBsb2NhdGlvbmAgc3VwcG9ydHMuZGZvcmNlX2RlZmF1bHRfeGNtX3ZlcnNpb24EAURtYXliZV94Y21fdmVyc2lvbmECAUhPcHRpb248WGNtVmVyc2lvbj4ABRRZAVNldCBhIHNhZmUgWENNIHZlcnNpb24gKHRoZSB2ZXJzaW9uIHRoYXQgWENNIHNob3VsZCBiZSBlbmNvZGVkIHdpdGggaWYgdGhlIG1vc3QgcmVjZW50tHZlcnNpb24gYSBkZXN0aW5hdGlvbiBjYW4gYWNjZXB0IGlzIHVua25vd24pLgDcLSBgb3JpZ2luYDogTXVzdCBiZSBhbiBvcmlnaW4gc3BlY2lmaWVkIGJ5IEFkbWluT3JpZ2luLjkBLSBgbWF5YmVfeGNtX3ZlcnNpb25gOiBUaGUgZGVmYXVsdCBYQ00gZW5jb2RpbmcgdmVyc2lvbiwgb3IgYE5vbmVgIHRvIGRpc2FibGUueGZvcmNlX3N1YnNjcmliZV92ZXJzaW9uX25vdGlmeQQBIGxvY2F0aW9uRQEBWEJveDxWZXJzaW9uZWRMb2NhdGlvbj4ABhA5AUFzayBhIGxvY2F0aW9uIHRvIG5vdGlmeSB1cyByZWdhcmRpbmcgdGhlaXIgWENNIHZlcnNpb24gYW5kIGFueSBjaGFuZ2VzIHRvIGl0LgDcLSBgb3JpZ2luYDogTXVzdCBiZSBhbiBvcmlnaW4gc3BlY2lmaWVkIGJ5IEFkbWluT3JpZ2luLlkBLSBgbG9jYXRpb25gOiBUaGUgbG9jYXRpb24gdG8gd2hpY2ggd2Ugc2hvdWxkIHN1YnNjcmliZSBmb3IgWENNIHZlcnNpb24gbm90aWZpY2F0aW9ucy6AZm9yY2VfdW5zdWJzY3JpYmVfdmVyc2lvbl9ub3RpZnkEASBsb2NhdGlvbkUBAVhCb3g8VmVyc2lvbmVkTG9jYXRpb24+AAcYSQFSZXF1aXJlIHRoYXQgYSBwYXJ0aWN1bGFyIGRlc3RpbmF0aW9uIHNob3VsZCBubyBsb25nZXIgbm90aWZ5IHVzIHJlZ2FyZGluZyBhbnkgWENNQHZlcnNpb24gY2hhbmdlcy4A3C0gYG9yaWdpbmA6IE11c3QgYmUgYW4gb3JpZ2luIHNwZWNpZmllZCBieSBBZG1pbk9yaWdpbi49AS0gYGxvY2F0aW9uYDogVGhlIGxvY2F0aW9uIHRvIHdoaWNoIHdlIGFyZSBjdXJyZW50bHkgc3Vic2NyaWJlZCBmb3IgWENNIHZlcnNpb26oICBub3RpZmljYXRpb25zIHdoaWNoIHdlIG5vIGxvbmdlciBkZXNpcmUufGxpbWl0ZWRfcmVzZXJ2ZV90cmFuc2Zlcl9hc3NldHMUARBkZXN0RQEBWEJveDxWZXJzaW9uZWRMb2NhdGlvbj4AASxiZW5lZmljaWFyeUUBAVhCb3g8VmVyc2lvbmVkTG9jYXRpb24+AAEYYXNzZXRziQYBUEJveDxWZXJzaW9uZWRBc3NldHM+AAE4ZmVlX2Fzc2V0X2l0ZW0QAQx1MzIAATB3ZWlnaHRfbGltaXQ9BgEsV2VpZ2h0TGltaXQACHhdAVRyYW5zZmVyIHNvbWUgYXNzZXRzIGZyb20gdGhlIGxvY2FsIGNoYWluIHRvIHRoZSBkZXN0aW5hdGlvbiBjaGFpbiB0aHJvdWdoIHRoZWlyIGxvY2FsLHhkZXN0aW5hdGlvbiBvciByZW1vdGUgcmVzZXJ2ZS4APQFgYXNzZXRzYCBtdXN0IGhhdmUgc2FtZSByZXNlcnZlIGxvY2F0aW9uIGFuZCBtYXkgbm90IGJlIHRlbGVwb3J0YWJsZSB0byBgZGVzdGAuTQEgLSBgYXNzZXRzYCBoYXZlIGxvY2FsIHJlc2VydmU6IHRyYW5zZmVyIGFzc2V0cyB0byBzb3ZlcmVpZ24gYWNjb3VudCBvZiBkZXN0aW5hdGlvbk0BICAgY2hhaW4gYW5kIGZvcndhcmQgYSBub3RpZmljYXRpb24gWENNIHRvIGBkZXN0YCB0byBtaW50IGFuZCBkZXBvc2l0IHJlc2VydmUtYmFzZWRsICAgYXNzZXRzIHRvIGBiZW5lZmljaWFyeWAuVQEgLSBgYXNzZXRzYCBoYXZlIGRlc3RpbmF0aW9uIHJlc2VydmU6IGJ1cm4gbG9jYWwgYXNzZXRzIGFuZCBmb3J3YXJkIGEgbm90aWZpY2F0aW9uIHRvWQEgICBgZGVzdGAgY2hhaW4gdG8gd2l0aGRyYXcgdGhlIHJlc2VydmUgYXNzZXRzIGZyb20gdGhpcyBjaGFpbidzIHNvdmVyZWlnbiBhY2NvdW50IGFuZIQgICBkZXBvc2l0IHRoZW0gdG8gYGJlbmVmaWNpYXJ5YC5hASAtIGBhc3NldHNgIGhhdmUgcmVtb3RlIHJlc2VydmU6IGJ1cm4gbG9jYWwgYXNzZXRzLCBmb3J3YXJkIFhDTSB0byByZXNlcnZlIGNoYWluIHRvIG1vdmVhASAgIHJlc2VydmVzIGZyb20gdGhpcyBjaGFpbidzIFNBIHRvIGBkZXN0YCBjaGFpbidzIFNBLCBhbmQgZm9yd2FyZCBhbm90aGVyIFhDTSB0byBgZGVzdGD0ICAgdG8gbWludCBhbmQgZGVwb3NpdCByZXNlcnZlLWJhc2VkIGFzc2V0cyB0byBgYmVuZWZpY2lhcnlgLgBRAUZlZSBwYXltZW50IG9uIHRoZSBkZXN0aW5hdGlvbiBzaWRlIGlzIG1hZGUgZnJvbSB0aGUgYXNzZXQgaW4gdGhlIGBhc3NldHNgIHZlY3RvciBvZmEBaW5kZXggYGZlZV9hc3NldF9pdGVtYCwgdXAgdG8gZW5vdWdoIHRvIHBheSBmb3IgYHdlaWdodF9saW1pdGAgb2Ygd2VpZ2h0LiBJZiBtb3JlIHdlaWdodFkBaXMgbmVlZGVkIHRoYW4gYHdlaWdodF9saW1pdGAsIHRoZW4gdGhlIG9wZXJhdGlvbiB3aWxsIGZhaWwgYW5kIHRoZSBzZW50IGFzc2V0cyBtYXkgYmUgYXQgcmlzay4AKQEtIGBvcmlnaW5gOiBNdXN0IGJlIGNhcGFibGUgb2Ygd2l0aGRyYXdpbmcgdGhlIGBhc3NldHNgIGFuZCBleGVjdXRpbmcgWENNLiUBLSBgZGVzdGA6IERlc3RpbmF0aW9uIGNvbnRleHQgZm9yIHRoZSBhc3NldHMuIFdpbGwgdHlwaWNhbGx5IGJlIGBbUGFyZW50LGEBICBQYXJhY2hhaW4oLi4pXWAgdG8gc2VuZCBmcm9tIHBhcmFjaGFpbiB0byBwYXJhY2hhaW4sIG9yIGBbUGFyYWNoYWluKC4uKV1gIHRvIHNlbmQgZnJvbVQgIHJlbGF5IHRvIHBhcmFjaGFpbi5VAS0gYGJlbmVmaWNpYXJ5YDogQSBiZW5lZmljaWFyeSBsb2NhdGlvbiBmb3IgdGhlIGFzc2V0cyBpbiB0aGUgY29udGV4dCBvZiBgZGVzdGAuIFdpbGyYICBnZW5lcmFsbHkgYmUgYW4gYEFjY291bnRJZDMyYCB2YWx1ZS5ZAS0gYGFzc2V0c2A6IFRoZSBhc3NldHMgdG8gYmUgd2l0aGRyYXduLiBUaGlzIHNob3VsZCBpbmNsdWRlIHRoZSBhc3NldHMgdXNlZCB0byBwYXkgdGhlyCAgZmVlIG9uIHRoZSBgZGVzdGAgKGFuZCBwb3NzaWJseSByZXNlcnZlKSBjaGFpbnMuTQEtIGBmZWVfYXNzZXRfaXRlbWA6IFRoZSBpbmRleCBpbnRvIGBhc3NldHNgIG9mIHRoZSBpdGVtIHdoaWNoIHNob3VsZCBiZSB1c2VkIHRvIHBheRwgIGZlZXMuRQEtIGB3ZWlnaHRfbGltaXRgOiBUaGUgcmVtb3RlLXNpZGUgd2VpZ2h0IGxpbWl0LCBpZiBhbnksIGZvciB0aGUgWENNIGZlZSBwdXJjaGFzZS5cbGltaXRlZF90ZWxlcG9ydF9hc3NldHMUARBkZXN0RQEBWEJveDxWZXJzaW9uZWRMb2NhdGlvbj4AASxiZW5lZmljaWFyeUUBAVhCb3g8VmVyc2lvbmVkTG9jYXRpb24+AAEYYXNzZXRziQYBUEJveDxWZXJzaW9uZWRBc3NldHM+AAE4ZmVlX2Fzc2V0X2l0ZW0QAQx1MzIAATB3ZWlnaHRfbGltaXQ9BgEsV2VpZ2h0TGltaXQACUgRAVRlbGVwb3J0IHNvbWUgYXNzZXRzIGZyb20gdGhlIGxvY2FsIGNoYWluIHRvIHNvbWUgZGVzdGluYXRpb24gY2hhaW4uAFEBRmVlIHBheW1lbnQgb24gdGhlIGRlc3RpbmF0aW9uIHNpZGUgaXMgbWFkZSBmcm9tIHRoZSBhc3NldCBpbiB0aGUgYGFzc2V0c2AgdmVjdG9yIG9mYQFpbmRleCBgZmVlX2Fzc2V0X2l0ZW1gLCB1cCB0byBlbm91Z2ggdG8gcGF5IGZvciBgd2VpZ2h0X2xpbWl0YCBvZiB3ZWlnaHQuIElmIG1vcmUgd2VpZ2h0WQFpcyBuZWVkZWQgdGhhbiBgd2VpZ2h0X2xpbWl0YCwgdGhlbiB0aGUgb3BlcmF0aW9uIHdpbGwgZmFpbCBhbmQgdGhlIHNlbnQgYXNzZXRzIG1heSBiZSBhdCByaXNrLgApAS0gYG9yaWdpbmA6IE11c3QgYmUgY2FwYWJsZSBvZiB3aXRoZHJhd2luZyB0aGUgYGFzc2V0c2AgYW5kIGV4ZWN1dGluZyBYQ00uJQEtIGBkZXN0YDogRGVzdGluYXRpb24gY29udGV4dCBmb3IgdGhlIGFzc2V0cy4gV2lsbCB0eXBpY2FsbHkgYmUgYFtQYXJlbnQsYQEgIFBhcmFjaGFpbiguLildYCB0byBzZW5kIGZyb20gcGFyYWNoYWluIHRvIHBhcmFjaGFpbiwgb3IgYFtQYXJhY2hhaW4oLi4pXWAgdG8gc2VuZCBmcm9tVCAgcmVsYXkgdG8gcGFyYWNoYWluLlUBLSBgYmVuZWZpY2lhcnlgOiBBIGJlbmVmaWNpYXJ5IGxvY2F0aW9uIGZvciB0aGUgYXNzZXRzIGluIHRoZSBjb250ZXh0IG9mIGBkZXN0YC4gV2lsbJggIGdlbmVyYWxseSBiZSBhbiBgQWNjb3VudElkMzJgIHZhbHVlLlkBLSBgYXNzZXRzYDogVGhlIGFzc2V0cyB0byBiZSB3aXRoZHJhd24uIFRoaXMgc2hvdWxkIGluY2x1ZGUgdGhlIGFzc2V0cyB1c2VkIHRvIHBheSB0aGVoICBmZWUgb24gdGhlIGBkZXN0YCBjaGFpbi5NAS0gYGZlZV9hc3NldF9pdGVtYDogVGhlIGluZGV4IGludG8gYGFzc2V0c2Agb2YgdGhlIGl0ZW0gd2hpY2ggc2hvdWxkIGJlIHVzZWQgdG8gcGF5HCAgZmVlcy5FAS0gYHdlaWdodF9saW1pdGA6IFRoZSByZW1vdGUtc2lkZSB3ZWlnaHQgbGltaXQsIGlmIGFueSwgZm9yIHRoZSBYQ00gZmVlIHB1cmNoYXNlLkBmb3JjZV9zdXNwZW5zaW9uBAEkc3VzcGVuZGVkIAEQYm9vbAAKEPRTZXQgb3IgdW5zZXQgdGhlIGdsb2JhbCBzdXNwZW5zaW9uIHN0YXRlIG9mIHRoZSBYQ00gZXhlY3V0b3IuANwtIGBvcmlnaW5gOiBNdXN0IGJlIGFuIG9yaWdpbiBzcGVjaWZpZWQgYnkgQWRtaW5PcmlnaW4u0C0gYHN1c3BlbmRlZGA6IGB0cnVlYCB0byBzdXNwZW5kLCBgZmFsc2VgIHRvIHJlc3VtZS48dHJhbnNmZXJfYXNzZXRzFAEQZGVzdEUBAVhCb3g8VmVyc2lvbmVkTG9jYXRpb24+AAEsYmVuZWZpY2lhcnlFAQFYQm94PFZlcnNpb25lZExvY2F0aW9uPgABGGFzc2V0c4kGAVBCb3g8VmVyc2lvbmVkQXNzZXRzPgABOGZlZV9hc3NldF9pdGVtEAEMdTMyAAEwd2VpZ2h0X2xpbWl0PQYBLFdlaWdodExpbWl0AAuEXQFUcmFuc2ZlciBzb21lIGFzc2V0cyBmcm9tIHRoZSBsb2NhbCBjaGFpbiB0byB0aGUgZGVzdGluYXRpb24gY2hhaW4gdGhyb3VnaCB0aGVpciBsb2NhbCzQZGVzdGluYXRpb24gb3IgcmVtb3RlIHJlc2VydmUsIG9yIHRocm91Z2ggdGVsZXBvcnRzLgBRAUZlZSBwYXltZW50IG9uIHRoZSBkZXN0aW5hdGlvbiBzaWRlIGlzIG1hZGUgZnJvbSB0aGUgYXNzZXQgaW4gdGhlIGBhc3NldHNgIHZlY3RvciBvZjUBaW5kZXggYGZlZV9hc3NldF9pdGVtYCAoaGVuY2UgcmVmZXJyZWQgdG8gYXMgYGZlZXNgKSwgdXAgdG8gZW5vdWdoIHRvIHBheSBmb3JBAWB3ZWlnaHRfbGltaXRgIG9mIHdlaWdodC4gSWYgbW9yZSB3ZWlnaHQgaXMgbmVlZGVkIHRoYW4gYHdlaWdodF9saW1pdGAsIHRoZW4gdGhl3G9wZXJhdGlvbiB3aWxsIGZhaWwgYW5kIHRoZSBzZW50IGFzc2V0cyBtYXkgYmUgYXQgcmlzay4AYQFgYXNzZXRzYCAoZXhjbHVkaW5nIGBmZWVzYCkgbXVzdCBoYXZlIHNhbWUgcmVzZXJ2ZSBsb2NhdGlvbiBvciBvdGhlcndpc2UgYmUgdGVsZXBvcnRhYmxlsHRvIGBkZXN0YCwgbm8gbGltaXRhdGlvbnMgaW1wb3NlZCBvbiBgZmVlc2AuTQEgLSBmb3IgbG9jYWwgcmVzZXJ2ZTogdHJhbnNmZXIgYXNzZXRzIHRvIHNvdmVyZWlnbiBhY2NvdW50IG9mIGRlc3RpbmF0aW9uIGNoYWluIGFuZE0BICAgZm9yd2FyZCBhIG5vdGlmaWNhdGlvbiBYQ00gdG8gYGRlc3RgIHRvIG1pbnQgYW5kIGRlcG9zaXQgcmVzZXJ2ZS1iYXNlZCBhc3NldHMgdG9EICAgYGJlbmVmaWNpYXJ5YC5hASAtIGZvciBkZXN0aW5hdGlvbiByZXNlcnZlOiBidXJuIGxvY2FsIGFzc2V0cyBhbmQgZm9yd2FyZCBhIG5vdGlmaWNhdGlvbiB0byBgZGVzdGAgY2hhaW5ZASAgIHRvIHdpdGhkcmF3IHRoZSByZXNlcnZlIGFzc2V0cyBmcm9tIHRoaXMgY2hhaW4ncyBzb3ZlcmVpZ24gYWNjb3VudCBhbmQgZGVwb3NpdCB0aGVtUCAgIHRvIGBiZW5lZmljaWFyeWAuXQEgLSBmb3IgcmVtb3RlIHJlc2VydmU6IGJ1cm4gbG9jYWwgYXNzZXRzLCBmb3J3YXJkIFhDTSB0byByZXNlcnZlIGNoYWluIHRvIG1vdmUgcmVzZXJ2ZXNdASAgIGZyb20gdGhpcyBjaGFpbidzIFNBIHRvIGBkZXN0YCBjaGFpbidzIFNBLCBhbmQgZm9yd2FyZCBhbm90aGVyIFhDTSB0byBgZGVzdGAgdG8gbWludNQgICBhbmQgZGVwb3NpdCByZXNlcnZlLWJhc2VkIGFzc2V0cyB0byBgYmVuZWZpY2lhcnlgLlEBIC0gZm9yIHRlbGVwb3J0czogYnVybiBsb2NhbCBhc3NldHMgYW5kIGZvcndhcmQgWENNIHRvIGBkZXN0YCBjaGFpbiB0byBtaW50L3RlbGVwb3J0sCAgIGFzc2V0cyBhbmQgZGVwb3NpdCB0aGVtIHRvIGBiZW5lZmljaWFyeWAuACkBLSBgb3JpZ2luYDogTXVzdCBiZSBjYXBhYmxlIG9mIHdpdGhkcmF3aW5nIHRoZSBgYXNzZXRzYCBhbmQgZXhlY3V0aW5nIFhDTS4tAS0gYGRlc3RgOiBEZXN0aW5hdGlvbiBjb250ZXh0IGZvciB0aGUgYXNzZXRzLiBXaWxsIHR5cGljYWxseSBiZSBgWDIoUGFyZW50LFUBICBQYXJhY2hhaW4oLi4pKWAgdG8gc2VuZCBmcm9tIHBhcmFjaGFpbiB0byBwYXJhY2hhaW4sIG9yIGBYMShQYXJhY2hhaW4oLi4pKWAgdG8gc2VuZGggIGZyb20gcmVsYXkgdG8gcGFyYWNoYWluLlUBLSBgYmVuZWZpY2lhcnlgOiBBIGJlbmVmaWNpYXJ5IGxvY2F0aW9uIGZvciB0aGUgYXNzZXRzIGluIHRoZSBjb250ZXh0IG9mIGBkZXN0YC4gV2lsbJggIGdlbmVyYWxseSBiZSBhbiBgQWNjb3VudElkMzJgIHZhbHVlLlkBLSBgYXNzZXRzYDogVGhlIGFzc2V0cyB0byBiZSB3aXRoZHJhd24uIFRoaXMgc2hvdWxkIGluY2x1ZGUgdGhlIGFzc2V0cyB1c2VkIHRvIHBheSB0aGXIICBmZWUgb24gdGhlIGBkZXN0YCAoYW5kIHBvc3NpYmx5IHJlc2VydmUpIGNoYWlucy5NAS0gYGZlZV9hc3NldF9pdGVtYDogVGhlIGluZGV4IGludG8gYGFzc2V0c2Agb2YgdGhlIGl0ZW0gd2hpY2ggc2hvdWxkIGJlIHVzZWQgdG8gcGF5HCAgZmVlcy5FAS0gYHdlaWdodF9saW1pdGA6IFRoZSByZW1vdGUtc2lkZSB3ZWlnaHQgbGltaXQsIGlmIGFueSwgZm9yIHRoZSBYQ00gZmVlIHB1cmNoYXNlLjBjbGFpbV9hc3NldHMIARhhc3NldHOJBgFQQm94PFZlcnNpb25lZEFzc2V0cz4AASxiZW5lZmljaWFyeUUBAVhCb3g8VmVyc2lvbmVkTG9jYXRpb24+AAwYVQFDbGFpbXMgYXNzZXRzIHRyYXBwZWQgb24gdGhpcyBwYWxsZXQgYmVjYXVzZSBvZiBsZWZ0b3ZlciBhc3NldHMgZHVyaW5nIFhDTSBleGVjdXRpb24uAKwtIGBvcmlnaW5gOiBBbnlvbmUgY2FuIGNhbGwgdGhpcyBleHRyaW5zaWMuXQEtIGBhc3NldHNgOiBUaGUgZXhhY3QgYXNzZXRzIHRoYXQgd2VyZSB0cmFwcGVkLiBVc2UgdGhlIHZlcnNpb24gdG8gc3BlY2lmeSB3aGF0IHZlcnNpb26Yd2FzIHRoZSBsYXRlc3Qgd2hlbiB0aGV5IHdlcmUgdHJhcHBlZC5FAS0gYGJlbmVmaWNpYXJ5YDogVGhlIGxvY2F0aW9uL2FjY291bnQgd2hlcmUgdGhlIGNsYWltZWQgYXNzZXRzIHdpbGwgYmUgZGVwb3NpdGVkLox0cmFuc2Zlcl9hc3NldHNfdXNpbmdfdHlwZV9hbmRfdGhlbhwBEGRlc3RFAQFYQm94PFZlcnNpb25lZExvY2F0aW9uPgABGGFzc2V0c4kGAVBCb3g8VmVyc2lvbmVkQXNzZXRzPgABUGFzc2V0c190cmFuc2Zlcl90eXBluQYBREJveDxUcmFuc2ZlclR5cGU+AAE4cmVtb3RlX2ZlZXNfaWS9BgFUQm94PFZlcnNpb25lZEFzc2V0SWQ+AAFIZmVlc190cmFuc2Zlcl90eXBluQYBREJveDxUcmFuc2ZlclR5cGU+AAFIY3VzdG9tX3hjbV9vbl9kZXN0iQUBVEJveDxWZXJzaW9uZWRYY208KCk+PgABMHdlaWdodF9saW1pdD0GASxXZWlnaHRMaW1pdAANwFUBVHJhbnNmZXIgYXNzZXRzIGZyb20gdGhlIGxvY2FsIGNoYWluIHRvIHRoZSBkZXN0aW5hdGlvbiBjaGFpbiB1c2luZyBleHBsaWNpdCB0cmFuc2Zlcmh0eXBlcyBmb3IgYXNzZXRzIGFuZCBmZWVzLgBZAWBhc3NldHNgIG11c3QgaGF2ZSBzYW1lIHJlc2VydmUgbG9jYXRpb24gb3IgbWF5IGJlIHRlbGVwb3J0YWJsZSB0byBgZGVzdGAuIENhbGxlciBtdXN07HByb3ZpZGUgdGhlIGBhc3NldHNfdHJhbnNmZXJfdHlwZWAgdG8gYmUgdXNlZCBmb3IgYGFzc2V0c2A6UQEgLSBgVHJhbnNmZXJUeXBlOjpMb2NhbFJlc2VydmVgOiB0cmFuc2ZlciBhc3NldHMgdG8gc292ZXJlaWduIGFjY291bnQgb2YgZGVzdGluYXRpb25NASAgIGNoYWluIGFuZCBmb3J3YXJkIGEgbm90aWZpY2F0aW9uIFhDTSB0byBgZGVzdGAgdG8gbWludCBhbmQgZGVwb3NpdCByZXNlcnZlLWJhc2VkbCAgIGFzc2V0cyB0byBgYmVuZWZpY2lhcnlgLlkBIC0gYFRyYW5zZmVyVHlwZTo6RGVzdGluYXRpb25SZXNlcnZlYDogYnVybiBsb2NhbCBhc3NldHMgYW5kIGZvcndhcmQgYSBub3RpZmljYXRpb24gdG9ZASAgIGBkZXN0YCBjaGFpbiB0byB3aXRoZHJhdyB0aGUgcmVzZXJ2ZSBhc3NldHMgZnJvbSB0aGlzIGNoYWluJ3Mgc292ZXJlaWduIGFjY291bnQgYW5khCAgIGRlcG9zaXQgdGhlbSB0byBgYmVuZWZpY2lhcnlgLlkBIC0gYFRyYW5zZmVyVHlwZTo6UmVtb3RlUmVzZXJ2ZShyZXNlcnZlKWA6IGJ1cm4gbG9jYWwgYXNzZXRzLCBmb3J3YXJkIFhDTSB0byBgcmVzZXJ2ZWBhASAgIGNoYWluIHRvIG1vdmUgcmVzZXJ2ZXMgZnJvbSB0aGlzIGNoYWluJ3MgU0EgdG8gYGRlc3RgIGNoYWluJ3MgU0EsIGFuZCBmb3J3YXJkIGFub3RoZXJVASAgIFhDTSB0byBgZGVzdGAgdG8gbWludCBhbmQgZGVwb3NpdCByZXNlcnZlLWJhc2VkIGFzc2V0cyB0byBgYmVuZWZpY2lhcnlgLiBUeXBpY2FsbHmUICAgdGhlIHJlbW90ZSBgcmVzZXJ2ZWAgaXMgQXNzZXQgSHViLkUBIC0gYFRyYW5zZmVyVHlwZTo6VGVsZXBvcnRgOiBidXJuIGxvY2FsIGFzc2V0cyBhbmQgZm9yd2FyZCBYQ00gdG8gYGRlc3RgIGNoYWluIHRv6CAgIG1pbnQvdGVsZXBvcnQgYXNzZXRzIGFuZCBkZXBvc2l0IHRoZW0gdG8gYGJlbmVmaWNpYXJ5YC4AVQFPbiB0aGUgZGVzdGluYXRpb24gY2hhaW4sIGFzIHdlbGwgYXMgYW55IGludGVybWVkaWFyeSBob3BzLCBgQnV5RXhlY3V0aW9uYCBpcyB1c2VkIHRvIQFidXkgZXhlY3V0aW9uIHVzaW5nIHRyYW5zZmVycmVkIGBhc3NldHNgIGlkZW50aWZpZWQgYnkgYHJlbW90ZV9mZWVzX2lkYC5ZAU1ha2Ugc3VyZSBlbm91Z2ggb2YgdGhlIHNwZWNpZmllZCBgcmVtb3RlX2ZlZXNfaWRgIGFzc2V0IGlzIGluY2x1ZGVkIGluIHRoZSBnaXZlbiBsaXN0YQFvZiBgYXNzZXRzYC4gYHJlbW90ZV9mZWVzX2lkYCBzaG91bGQgYmUgZW5vdWdoIHRvIHBheSBmb3IgYHdlaWdodF9saW1pdGAuIElmIG1vcmUgd2VpZ2h0WQFpcyBuZWVkZWQgdGhhbiBgd2VpZ2h0X2xpbWl0YCwgdGhlbiB0aGUgb3BlcmF0aW9uIHdpbGwgZmFpbCBhbmQgdGhlIHNlbnQgYXNzZXRzIG1heSBiZSBhdCByaXNrLgBFAWByZW1vdGVfZmVlc19pZGAgbWF5IHVzZSBkaWZmZXJlbnQgdHJhbnNmZXIgdHlwZSB0aGFuIHJlc3Qgb2YgYGFzc2V0c2AgYW5kIGNhbiBiZZxzcGVjaWZpZWQgdGhyb3VnaCBgZmVlc190cmFuc2Zlcl90eXBlYC4AYQFUaGUgY2FsbGVyIG5lZWRzIHRvIHNwZWNpZnkgd2hhdCBzaG91bGQgaGFwcGVuIHRvIHRoZSB0cmFuc2ZlcnJlZCBhc3NldHMgb25jZSB0aGV5IHJlYWNoQQF0aGUgYGRlc3RgIGNoYWluLiBUaGlzIGlzIGRvbmUgdGhyb3VnaCB0aGUgYGN1c3RvbV94Y21fb25fZGVzdGAgcGFyYW1ldGVyLCB3aGljaPxjb250YWlucyB0aGUgaW5zdHJ1Y3Rpb25zIHRvIGV4ZWN1dGUgb24gYGRlc3RgIGFzIGEgZmluYWwgc3RlcC58ICBUaGlzIGlzIHVzdWFsbHkgYXMgc2ltcGxlIGFzOlEBICBgWGNtKHZlYyFbRGVwb3NpdEFzc2V0IHsgYXNzZXRzOiBXaWxkKEFsbENvdW50ZWQoYXNzZXRzLmxlbigpKSksIGJlbmVmaWNpYXJ5IH1dKWAsMQEgIGJ1dCBjb3VsZCBiZSBzb21ldGhpbmcgbW9yZSBleG90aWMgbGlrZSBzZW5kaW5nIHRoZSBgYXNzZXRzYCBldmVuIGZ1cnRoZXIuACkBLSBgb3JpZ2luYDogTXVzdCBiZSBjYXBhYmxlIG9mIHdpdGhkcmF3aW5nIHRoZSBgYXNzZXRzYCBhbmQgZXhlY3V0aW5nIFhDTS4lAS0gYGRlc3RgOiBEZXN0aW5hdGlvbiBjb250ZXh0IGZvciB0aGUgYXNzZXRzLiBXaWxsIHR5cGljYWxseSBiZSBgW1BhcmVudCxhASAgUGFyYWNoYWluKC4uKV1gIHRvIHNlbmQgZnJvbSBwYXJhY2hhaW4gdG8gcGFyYWNoYWluLCBvciBgW1BhcmFjaGFpbiguLildYCB0byBzZW5kIGZyb209ASAgcmVsYXkgdG8gcGFyYWNoYWluLCBvciBgKHBhcmVudHM6IDIsIChHbG9iYWxDb25zZW5zdXMoLi4pLCAuLikpYCB0byBzZW5kIGZyb230ICBwYXJhY2hhaW4gYWNyb3NzIGEgYnJpZGdlIHRvIGFub3RoZXIgZWNvc3lzdGVtIGRlc3RpbmF0aW9uLlkBLSBgYXNzZXRzYDogVGhlIGFzc2V0cyB0byBiZSB3aXRoZHJhd24uIFRoaXMgc2hvdWxkIGluY2x1ZGUgdGhlIGFzc2V0cyB1c2VkIHRvIHBheSB0aGXIICBmZWUgb24gdGhlIGBkZXN0YCAoYW5kIHBvc3NpYmx5IHJlc2VydmUpIGNoYWlucy49AS0gYGFzc2V0c190cmFuc2Zlcl90eXBlYDogVGhlIFhDTSBgVHJhbnNmZXJUeXBlYCB1c2VkIHRvIHRyYW5zZmVyIHRoZSBgYXNzZXRzYC4hAS0gYHJlbW90ZV9mZWVzX2lkYDogT25lIG9mIHRoZSBpbmNsdWRlZCBgYXNzZXRzYCB0byBiZSB1c2VkIHRvIHBheSBmZWVzLkkBLSBgZmVlc190cmFuc2Zlcl90eXBlYDogVGhlIFhDTSBgVHJhbnNmZXJUeXBlYCB1c2VkIHRvIHRyYW5zZmVyIHRoZSBgZmVlc2AgYXNzZXRzLlkBLSBgY3VzdG9tX3hjbV9vbl9kZXN0YDogVGhlIFhDTSB0byBiZSBleGVjdXRlZCBvbiBgZGVzdGAgY2hhaW4gYXMgdGhlIGxhc3Qgc3RlcCBvZiB0aGVZASAgdHJhbnNmZXIsIHdoaWNoIGFsc28gZGV0ZXJtaW5lcyB3aGF0IGhhcHBlbnMgdG8gdGhlIGFzc2V0cyBvbiB0aGUgZGVzdGluYXRpb24gY2hhaW4uRQEtIGB3ZWlnaHRfbGltaXRgOiBUaGUgcmVtb3RlLXNpZGUgd2VpZ2h0IGxpbWl0LCBpZiBhbnksIGZvciB0aGUgWENNIGZlZSBwdXJjaGFzZS4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMuiQUIDHhjbTBWZXJzaW9uZWRYY20ELFJ1bnRpbWVDYWxsAAEMCFYyBACNBQFQdjI6OlhjbTxSdW50aW1lQ2FsbD4AAgAIVjMEAN0FAVB2Mzo6WGNtPFJ1bnRpbWVDYWxsPgADAAhWNAQAQQYBUHY0OjpYY208UnVudGltZUNhbGw+AAQAAI0FDAx4Y20IdjIMWGNtBCxSdW50aW1lQ2FsbAAABACRBQF0VmVjPEluc3RydWN0aW9uPFJ1bnRpbWVDYWxsPj4AAJEFAAAClQUAlQUMDHhjbQh2MixJbnN0cnVjdGlvbgQsUnVudGltZUNhbGwAAXA0V2l0aGRyYXdBc3NldAQAmQUBLE11bHRpQXNzZXRzAAAAVFJlc2VydmVBc3NldERlcG9zaXRlZAQAmQUBLE11bHRpQXNzZXRzAAEAWFJlY2VpdmVUZWxlcG9ydGVkQXNzZXQEAJkFASxNdWx0aUFzc2V0cwACADRRdWVyeVJlc3BvbnNlDAEgcXVlcnlfaWQsARxRdWVyeUlkAAEgcmVzcG9uc2W1BQEgUmVzcG9uc2UAAShtYXhfd2VpZ2h0LAEMdTY0AAMANFRyYW5zZmVyQXNzZXQIARhhc3NldHOZBQEsTXVsdGlBc3NldHMAASxiZW5lZmljaWFyeUkBATRNdWx0aUxvY2F0aW9uAAQAUFRyYW5zZmVyUmVzZXJ2ZUFzc2V0DAEYYXNzZXRzmQUBLE11bHRpQXNzZXRzAAEQZGVzdEkBATRNdWx0aUxvY2F0aW9uAAEMeGNtjQUBHFhjbTwoKT4ABQAgVHJhbnNhY3QMASxvcmlnaW5fdHlwZcUFAShPcmlnaW5LaW5kAAFYcmVxdWlyZV93ZWlnaHRfYXRfbW9zdCwBDHU2NAABEGNhbGzJBQFoRG91YmxlRW5jb2RlZDxSdW50aW1lQ2FsbD4ABgBkSHJtcE5ld0NoYW5uZWxPcGVuUmVxdWVzdAwBGHNlbmRlcuwBDHUzMgABQG1heF9tZXNzYWdlX3NpemXsAQx1MzIAATBtYXhfY2FwYWNpdHnsAQx1MzIABwBMSHJtcENoYW5uZWxBY2NlcHRlZAQBJHJlY2lwaWVudOwBDHUzMgAIAEhIcm1wQ2hhbm5lbENsb3NpbmcMASRpbml0aWF0b3LsAQx1MzIAARhzZW5kZXLsAQx1MzIAASRyZWNpcGllbnTsAQx1MzIACQAsQ2xlYXJPcmlnaW4ACgA0RGVzY2VuZE9yaWdpbgQATQEBVEludGVyaW9yTXVsdGlMb2NhdGlvbgALACxSZXBvcnRFcnJvcgwBIHF1ZXJ5X2lkLAEcUXVlcnlJZAABEGRlc3RJAQE0TXVsdGlMb2NhdGlvbgABTG1heF9yZXNwb25zZV93ZWlnaHQsAQx1NjQADAAwRGVwb3NpdEFzc2V0DAEYYXNzZXRzzQUBQE11bHRpQXNzZXRGaWx0ZXIAAShtYXhfYXNzZXRz7AEMdTMyAAEsYmVuZWZpY2lhcnlJAQE0TXVsdGlMb2NhdGlvbgANAExEZXBvc2l0UmVzZXJ2ZUFzc2V0EAEYYXNzZXRzzQUBQE11bHRpQXNzZXRGaWx0ZXIAAShtYXhfYXNzZXRz7AEMdTMyAAEQZGVzdEkBATRNdWx0aUxvY2F0aW9uAAEMeGNtjQUBHFhjbTwoKT4ADgA0RXhjaGFuZ2VBc3NldAgBEGdpdmXNBQFATXVsdGlBc3NldEZpbHRlcgABHHJlY2VpdmWZBQEsTXVsdGlBc3NldHMADwBcSW5pdGlhdGVSZXNlcnZlV2l0aGRyYXcMARhhc3NldHPNBQFATXVsdGlBc3NldEZpbHRlcgABHHJlc2VydmVJAQE0TXVsdGlMb2NhdGlvbgABDHhjbY0FARxYY208KCk+ABAAQEluaXRpYXRlVGVsZXBvcnQMARhhc3NldHPNBQFATXVsdGlBc3NldEZpbHRlcgABEGRlc3RJAQE0TXVsdGlMb2NhdGlvbgABDHhjbY0FARxYY208KCk+ABEAMFF1ZXJ5SG9sZGluZxABIHF1ZXJ5X2lkLAEcUXVlcnlJZAABEGRlc3RJAQE0TXVsdGlMb2NhdGlvbgABGGFzc2V0c80FAUBNdWx0aUFzc2V0RmlsdGVyAAFMbWF4X3Jlc3BvbnNlX3dlaWdodCwBDHU2NAASADBCdXlFeGVjdXRpb24IARBmZWVzoQUBKE11bHRpQXNzZXQAATB3ZWlnaHRfbGltaXTZBQEsV2VpZ2h0TGltaXQAEwA0UmVmdW5kU3VycGx1cwAUADxTZXRFcnJvckhhbmRsZXIEAI0FAUBYY208UnVudGltZUNhbGw+ABUALFNldEFwcGVuZGl4BACNBQFAWGNtPFJ1bnRpbWVDYWxsPgAWAChDbGVhckVycm9yABcAKENsYWltQXNzZXQIARhhc3NldHOZBQEsTXVsdGlBc3NldHMAARh0aWNrZXRJAQE0TXVsdGlMb2NhdGlvbgAYABBUcmFwBAAsAQx1NjQAGQBAU3Vic2NyaWJlVmVyc2lvbggBIHF1ZXJ5X2lkLAEcUXVlcnlJZAABTG1heF9yZXNwb25zZV93ZWlnaHQsAQx1NjQAGgBIVW5zdWJzY3JpYmVWZXJzaW9uABsAAJkFEAx4Y20IdjIobXVsdGlhc3NldCxNdWx0aUFzc2V0cwAABACdBQE8VmVjPE11bHRpQXNzZXQ+AACdBQAAAqEFAKEFEAx4Y20IdjIobXVsdGlhc3NldChNdWx0aUFzc2V0AAAIAQhpZKUFARxBc3NldElkAAEMZnVuqQUBLEZ1bmdpYmlsaXR5AAClBRAMeGNtCHYyKG11bHRpYXNzZXQcQXNzZXRJZAABCCBDb25jcmV0ZQQASQEBNE11bHRpTG9jYXRpb24AAAAgQWJzdHJhY3QEADgBHFZlYzx1OD4AAQAAqQUQDHhjbQh2MihtdWx0aWFzc2V0LEZ1bmdpYmlsaXR5AAEIIEZ1bmdpYmxlBAD8ARB1MTI4AAAALE5vbkZ1bmdpYmxlBACtBQE0QXNzZXRJbnN0YW5jZQABAACtBRAMeGNtCHYyKG11bHRpYXNzZXQ0QXNzZXRJbnN0YW5jZQABHCRVbmRlZmluZWQAAAAUSW5kZXgEAPwBEHUxMjgAAQAYQXJyYXk0BABIARxbdTg7IDRdAAIAGEFycmF5OAQAsQUBHFt1ODsgOF0AAwAcQXJyYXkxNgQAwAEgW3U4OyAxNl0ABAAcQXJyYXkzMgQABAEgW3U4OyAzMl0ABQAQQmxvYgQAOAEcVmVjPHU4PgAGAACxBQAAAwgAAAAIALUFDAx4Y20IdjIgUmVzcG9uc2UAARAQTnVsbAAAABhBc3NldHMEAJkFASxNdWx0aUFzc2V0cwABADxFeGVjdXRpb25SZXN1bHQEALkFAVBPcHRpb248KHUzMiwgRXJyb3IpPgACABxWZXJzaW9uBAAQAThzdXBlcjo6VmVyc2lvbgADAAC5BQQYT3B0aW9uBARUAb0FAQgQTm9uZQAAABBTb21lBAC9BQAAAQAAvQUAAAQIEMEFAMEFEAx4Y20IdjIYdHJhaXRzFEVycm9yAAFoIE92ZXJmbG93AAAANFVuaW1wbGVtZW50ZWQAAQBgVW50cnVzdGVkUmVzZXJ2ZUxvY2F0aW9uAAIAZFVudHJ1c3RlZFRlbGVwb3J0TG9jYXRpb24AAwBETXVsdGlMb2NhdGlvbkZ1bGwABABoTXVsdGlMb2NhdGlvbk5vdEludmVydGlibGUABQAkQmFkT3JpZ2luAAYAPEludmFsaWRMb2NhdGlvbgAHADRBc3NldE5vdEZvdW5kAAgAVEZhaWxlZFRvVHJhbnNhY3RBc3NldAAJADxOb3RXaXRoZHJhd2FibGUACgBITG9jYXRpb25DYW5ub3RIb2xkAAsAVEV4Y2VlZHNNYXhNZXNzYWdlU2l6ZQAMAFhEZXN0aW5hdGlvblVuc3VwcG9ydGVkAA0AJFRyYW5zcG9ydAAOAChVbnJvdXRhYmxlAA8AMFVua25vd25DbGFpbQAQADhGYWlsZWRUb0RlY29kZQARAEBNYXhXZWlnaHRJbnZhbGlkABIAOE5vdEhvbGRpbmdGZWVzABMAMFRvb0V4cGVuc2l2ZQAUABBUcmFwBAAwAQx1NjQAFQBMVW5oYW5kbGVkWGNtVmVyc2lvbgAWAEhXZWlnaHRMaW1pdFJlYWNoZWQEADABGFdlaWdodAAXABxCYXJyaWVyABgATFdlaWdodE5vdENvbXB1dGFibGUAGQAAxQUMDHhjbQh2MihPcmlnaW5LaW5kAAEQGE5hdGl2ZQAAAEBTb3ZlcmVpZ25BY2NvdW50AAEAJFN1cGVydXNlcgACAAxYY20AAwAAyQUMDHhjbThkb3VibGVfZW5jb2RlZDREb3VibGVFbmNvZGVkBARUAAAEARxlbmNvZGVkOAEcVmVjPHU4PgAAzQUQDHhjbQh2MihtdWx0aWFzc2V0QE11bHRpQXNzZXRGaWx0ZXIAAQggRGVmaW5pdGUEAJkFASxNdWx0aUFzc2V0cwAAABBXaWxkBADRBQE4V2lsZE11bHRpQXNzZXQAAQAA0QUQDHhjbQh2MihtdWx0aWFzc2V0OFdpbGRNdWx0aUFzc2V0AAEIDEFsbAAAABRBbGxPZggBCGlkpQUBHEFzc2V0SWQAAQxmdW7VBQE8V2lsZEZ1bmdpYmlsaXR5AAEAANUFEAx4Y20IdjIobXVsdGlhc3NldDxXaWxkRnVuZ2liaWxpdHkAAQggRnVuZ2libGUAAAAsTm9uRnVuZ2libGUAAQAA2QUMDHhjbQh2MixXZWlnaHRMaW1pdAABCCRVbmxpbWl0ZWQAAAAcTGltaXRlZAQALAEMdTY0AAEAAN0FDAx4Y20IdjMMWGNtBBBDYWxsAAAEAOEFAVhWZWM8SW5zdHJ1Y3Rpb248Q2FsbD4+AADhBQAAAuUFAOUFDAx4Y20IdjMsSW5zdHJ1Y3Rpb24EEENhbGwAAcA0V2l0aGRyYXdBc3NldAQA6QUBLE11bHRpQXNzZXRzAAAAVFJlc2VydmVBc3NldERlcG9zaXRlZAQA6QUBLE11bHRpQXNzZXRzAAEAWFJlY2VpdmVUZWxlcG9ydGVkQXNzZXQEAOkFASxNdWx0aUFzc2V0cwACADRRdWVyeVJlc3BvbnNlEAEgcXVlcnlfaWQsARxRdWVyeUlkAAEgcmVzcG9uc2X9BQEgUmVzcG9uc2UAAShtYXhfd2VpZ2h0KAEYV2VpZ2h0AAEccXVlcmllciUGAVRPcHRpb248TXVsdGlMb2NhdGlvbj4AAwA0VHJhbnNmZXJBc3NldAgBGGFzc2V0c+kFASxNdWx0aUFzc2V0cwABLGJlbmVmaWNpYXJ54AE0TXVsdGlMb2NhdGlvbgAEAFBUcmFuc2ZlclJlc2VydmVBc3NldAwBGGFzc2V0c+kFASxNdWx0aUFzc2V0cwABEGRlc3TgATRNdWx0aUxvY2F0aW9uAAEMeGNt3QUBHFhjbTwoKT4ABQAgVHJhbnNhY3QMASxvcmlnaW5fa2luZCkGAShPcmlnaW5LaW5kAAFYcmVxdWlyZV93ZWlnaHRfYXRfbW9zdCgBGFdlaWdodAABEGNhbGzJBQFMRG91YmxlRW5jb2RlZDxDYWxsPgAGAGRIcm1wTmV3Q2hhbm5lbE9wZW5SZXF1ZXN0DAEYc2VuZGVy7AEMdTMyAAFAbWF4X21lc3NhZ2Vfc2l6ZewBDHUzMgABMG1heF9jYXBhY2l0eewBDHUzMgAHAExIcm1wQ2hhbm5lbEFjY2VwdGVkBAEkcmVjaXBpZW507AEMdTMyAAgASEhybXBDaGFubmVsQ2xvc2luZwwBJGluaXRpYXRvcuwBDHUzMgABGHNlbmRlcuwBDHUzMgABJHJlY2lwaWVudOwBDHUzMgAJACxDbGVhck9yaWdpbgAKADREZXNjZW5kT3JpZ2luBADkAVRJbnRlcmlvck11bHRpTG9jYXRpb24ACwAsUmVwb3J0RXJyb3IEAC0GAURRdWVyeVJlc3BvbnNlSW5mbwAMADBEZXBvc2l0QXNzZXQIARhhc3NldHMxBgFATXVsdGlBc3NldEZpbHRlcgABLGJlbmVmaWNpYXJ54AE0TXVsdGlMb2NhdGlvbgANAExEZXBvc2l0UmVzZXJ2ZUFzc2V0DAEYYXNzZXRzMQYBQE11bHRpQXNzZXRGaWx0ZXIAARBkZXN04AE0TXVsdGlMb2NhdGlvbgABDHhjbd0FARxYY208KCk+AA4ANEV4Y2hhbmdlQXNzZXQMARBnaXZlMQYBQE11bHRpQXNzZXRGaWx0ZXIAARB3YW506QUBLE11bHRpQXNzZXRzAAEcbWF4aW1hbCABEGJvb2wADwBcSW5pdGlhdGVSZXNlcnZlV2l0aGRyYXcMARhhc3NldHMxBgFATXVsdGlBc3NldEZpbHRlcgABHHJlc2VydmXgATRNdWx0aUxvY2F0aW9uAAEMeGNt3QUBHFhjbTwoKT4AEABASW5pdGlhdGVUZWxlcG9ydAwBGGFzc2V0czEGAUBNdWx0aUFzc2V0RmlsdGVyAAEQZGVzdOABNE11bHRpTG9jYXRpb24AAQx4Y23dBQEcWGNtPCgpPgARADRSZXBvcnRIb2xkaW5nCAE0cmVzcG9uc2VfaW5mby0GAURRdWVyeVJlc3BvbnNlSW5mbwABGGFzc2V0czEGAUBNdWx0aUFzc2V0RmlsdGVyABIAMEJ1eUV4ZWN1dGlvbggBEGZlZXPxBQEoTXVsdGlBc3NldAABMHdlaWdodF9saW1pdD0GASxXZWlnaHRMaW1pdAATADRSZWZ1bmRTdXJwbHVzABQAPFNldEVycm9ySGFuZGxlcgQA3QUBJFhjbTxDYWxsPgAVACxTZXRBcHBlbmRpeAQA3QUBJFhjbTxDYWxsPgAWAChDbGVhckVycm9yABcAKENsYWltQXNzZXQIARhhc3NldHPpBQEsTXVsdGlBc3NldHMAARh0aWNrZXTgATRNdWx0aUxvY2F0aW9uABgAEFRyYXAEACwBDHU2NAAZAEBTdWJzY3JpYmVWZXJzaW9uCAEgcXVlcnlfaWQsARxRdWVyeUlkAAFMbWF4X3Jlc3BvbnNlX3dlaWdodCgBGFdlaWdodAAaAEhVbnN1YnNjcmliZVZlcnNpb24AGwAkQnVybkFzc2V0BADpBQEsTXVsdGlBc3NldHMAHAAsRXhwZWN0QXNzZXQEAOkFASxNdWx0aUFzc2V0cwAdADBFeHBlY3RPcmlnaW4EACUGAVRPcHRpb248TXVsdGlMb2NhdGlvbj4AHgAsRXhwZWN0RXJyb3IEAAEGAVBPcHRpb248KHUzMiwgRXJyb3IpPgAfAFBFeHBlY3RUcmFuc2FjdFN0YXR1cwQAHQYBOE1heWJlRXJyb3JDb2RlACAALFF1ZXJ5UGFsbGV0CAEsbW9kdWxlX25hbWU4ARxWZWM8dTg+AAE0cmVzcG9uc2VfaW5mby0GAURRdWVyeVJlc3BvbnNlSW5mbwAhADBFeHBlY3RQYWxsZXQUARRpbmRleOwBDHUzMgABEG5hbWU4ARxWZWM8dTg+AAEsbW9kdWxlX25hbWU4ARxWZWM8dTg+AAEsY3JhdGVfbWFqb3LsAQx1MzIAATxtaW5fY3JhdGVfbWlub3LsAQx1MzIAIgBQUmVwb3J0VHJhbnNhY3RTdGF0dXMEAC0GAURRdWVyeVJlc3BvbnNlSW5mbwAjAExDbGVhclRyYW5zYWN0U3RhdHVzACQAPFVuaXZlcnNhbE9yaWdpbgQA6AEgSnVuY3Rpb24AJQA0RXhwb3J0TWVzc2FnZQwBHG5ldHdvcmv0ASROZXR3b3JrSWQAASxkZXN0aW5hdGlvbuQBVEludGVyaW9yTXVsdGlMb2NhdGlvbgABDHhjbd0FARxYY208KCk+ACYAJExvY2tBc3NldAgBFGFzc2V08QUBKE11bHRpQXNzZXQAASB1bmxvY2tlcuABNE11bHRpTG9jYXRpb24AJwAsVW5sb2NrQXNzZXQIARRhc3NldPEFAShNdWx0aUFzc2V0AAEYdGFyZ2V04AE0TXVsdGlMb2NhdGlvbgAoADhOb3RlVW5sb2NrYWJsZQgBFGFzc2V08QUBKE11bHRpQXNzZXQAARRvd25lcuABNE11bHRpTG9jYXRpb24AKQA0UmVxdWVzdFVubG9jawgBFGFzc2V08QUBKE11bHRpQXNzZXQAARhsb2NrZXLgATRNdWx0aUxvY2F0aW9uACoALFNldEZlZXNNb2RlBAEwaml0X3dpdGhkcmF3IAEQYm9vbAArACBTZXRUb3BpYwQABAEgW3U4OyAzMl0ALAAoQ2xlYXJUb3BpYwAtACxBbGlhc09yaWdpbgQA4AE0TXVsdGlMb2NhdGlvbgAuADxVbnBhaWRFeGVjdXRpb24IATB3ZWlnaHRfbGltaXQ9BgEsV2VpZ2h0TGltaXQAATBjaGVja19vcmlnaW4lBgFUT3B0aW9uPE11bHRpTG9jYXRpb24+AC8AAOkFEAx4Y20IdjMobXVsdGlhc3NldCxNdWx0aUFzc2V0cwAABADtBQE8VmVjPE11bHRpQXNzZXQ+AADtBQAAAvEFAPEFEAx4Y20IdjMobXVsdGlhc3NldChNdWx0aUFzc2V0AAAIAQhpZAkBARxBc3NldElkAAEMZnVu9QUBLEZ1bmdpYmlsaXR5AAD1BRAMeGNtCHYzKG11bHRpYXNzZXQsRnVuZ2liaWxpdHkAAQggRnVuZ2libGUEAPwBEHUxMjgAAAAsTm9uRnVuZ2libGUEAPkFATRBc3NldEluc3RhbmNlAAEAAPkFEAx4Y20IdjMobXVsdGlhc3NldDRBc3NldEluc3RhbmNlAAEYJFVuZGVmaW5lZAAAABRJbmRleAQA/AEQdTEyOAABABhBcnJheTQEAEgBHFt1ODsgNF0AAgAYQXJyYXk4BACxBQEcW3U4OyA4XQADABxBcnJheTE2BADAASBbdTg7IDE2XQAEABxBcnJheTMyBAAEASBbdTg7IDMyXQAFAAD9BQwMeGNtCHYzIFJlc3BvbnNlAAEYEE51bGwAAAAYQXNzZXRzBADpBQEsTXVsdGlBc3NldHMAAQA8RXhlY3V0aW9uUmVzdWx0BAABBgFQT3B0aW9uPCh1MzIsIEVycm9yKT4AAgAcVmVyc2lvbgQAEAE4c3VwZXI6OlZlcnNpb24AAwAsUGFsbGV0c0luZm8EAA0GAZhCb3VuZGVkVmVjPFBhbGxldEluZm8sIE1heFBhbGxldHNJbmZvPgAEADhEaXNwYXRjaFJlc3VsdAQAHQYBOE1heWJlRXJyb3JDb2RlAAUAAAEGBBhPcHRpb24EBFQBBQYBCBBOb25lAAAAEFNvbWUEAAUGAAABAAAFBgAABAgQCQYACQYQDHhjbQh2Mxh0cmFpdHMURXJyb3IAAaAgT3ZlcmZsb3cAAAA0VW5pbXBsZW1lbnRlZAABAGBVbnRydXN0ZWRSZXNlcnZlTG9jYXRpb24AAgBkVW50cnVzdGVkVGVsZXBvcnRMb2NhdGlvbgADADBMb2NhdGlvbkZ1bGwABABUTG9jYXRpb25Ob3RJbnZlcnRpYmxlAAUAJEJhZE9yaWdpbgAGADxJbnZhbGlkTG9jYXRpb24ABwA0QXNzZXROb3RGb3VuZAAIAFRGYWlsZWRUb1RyYW5zYWN0QXNzZXQACQA8Tm90V2l0aGRyYXdhYmxlAAoASExvY2F0aW9uQ2Fubm90SG9sZAALAFRFeGNlZWRzTWF4TWVzc2FnZVNpemUADABYRGVzdGluYXRpb25VbnN1cHBvcnRlZAANACRUcmFuc3BvcnQADgAoVW5yb3V0YWJsZQAPADBVbmtub3duQ2xhaW0AEAA4RmFpbGVkVG9EZWNvZGUAEQBATWF4V2VpZ2h0SW52YWxpZAASADhOb3RIb2xkaW5nRmVlcwATADBUb29FeHBlbnNpdmUAFAAQVHJhcAQAMAEMdTY0ABUAQEV4cGVjdGF0aW9uRmFsc2UAFgA4UGFsbGV0Tm90Rm91bmQAFwAwTmFtZU1pc21hdGNoABgATFZlcnNpb25JbmNvbXBhdGlibGUAGQBQSG9sZGluZ1dvdWxkT3ZlcmZsb3cAGgAsRXhwb3J0RXJyb3IAGwA4UmVhbmNob3JGYWlsZWQAHAAYTm9EZWFsAB0AKEZlZXNOb3RNZXQAHgAkTG9ja0Vycm9yAB8AME5vUGVybWlzc2lvbgAgAChVbmFuY2hvcmVkACEAOE5vdERlcG9zaXRhYmxlACIATFVuaGFuZGxlZFhjbVZlcnNpb24AIwBIV2VpZ2h0TGltaXRSZWFjaGVkBAAoARhXZWlnaHQAJAAcQmFycmllcgAlAExXZWlnaHROb3RDb21wdXRhYmxlACYAREV4Y2VlZHNTdGFja0xpbWl0ACcAAA0GDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBEQYEUwAABAAZBgEYVmVjPFQ+AAARBgwMeGNtCHYzKFBhbGxldEluZm8AABgBFGluZGV47AEMdTMyAAEQbmFtZRUGAYBCb3VuZGVkVmVjPHU4LCBNYXhQYWxsZXROYW1lTGVuPgABLG1vZHVsZV9uYW1lFQYBgEJvdW5kZWRWZWM8dTgsIE1heFBhbGxldE5hbWVMZW4+AAEUbWFqb3LsAQx1MzIAARRtaW5vcuwBDHUzMgABFHBhdGNo7AEMdTMyAAAVBgxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAQgEUwAABAA4ARhWZWM8VD4AABkGAAACEQYAHQYMDHhjbQh2MzhNYXliZUVycm9yQ29kZQABDBxTdWNjZXNzAAAAFEVycm9yBAAhBgGMQm91bmRlZFZlYzx1OCwgTWF4RGlzcGF0Y2hFcnJvckxlbj4AAQA4VHJ1bmNhdGVkRXJyb3IEACEGAYxCb3VuZGVkVmVjPHU4LCBNYXhEaXNwYXRjaEVycm9yTGVuPgACAAAhBgxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAQgEUwAABAA4ARhWZWM8VD4AACUGBBhPcHRpb24EBFQB4AEIEE5vbmUAAAAQU29tZQQA4AAAAQAAKQYMDHhjbQh2MyhPcmlnaW5LaW5kAAEQGE5hdGl2ZQAAAEBTb3ZlcmVpZ25BY2NvdW50AAEAJFN1cGVydXNlcgACAAxYY20AAwAALQYMDHhjbQh2M0RRdWVyeVJlc3BvbnNlSW5mbwAADAEsZGVzdGluYXRpb27gATRNdWx0aUxvY2F0aW9uAAEgcXVlcnlfaWQsARxRdWVyeUlkAAEobWF4X3dlaWdodCgBGFdlaWdodAAAMQYQDHhjbQh2MyhtdWx0aWFzc2V0QE11bHRpQXNzZXRGaWx0ZXIAAQggRGVmaW5pdGUEAOkFASxNdWx0aUFzc2V0cwAAABBXaWxkBAA1BgE4V2lsZE11bHRpQXNzZXQAAQAANQYQDHhjbQh2MyhtdWx0aWFzc2V0OFdpbGRNdWx0aUFzc2V0AAEQDEFsbAAAABRBbGxPZggBCGlkCQEBHEFzc2V0SWQAAQxmdW45BgE8V2lsZEZ1bmdpYmlsaXR5AAEAKEFsbENvdW50ZWQEAOwBDHUzMgACADBBbGxPZkNvdW50ZWQMAQhpZAkBARxBc3NldElkAAEMZnVuOQYBPFdpbGRGdW5naWJpbGl0eQABFGNvdW507AEMdTMyAAMAADkGEAx4Y20IdjMobXVsdGlhc3NldDxXaWxkRnVuZ2liaWxpdHkAAQggRnVuZ2libGUAAAAsTm9uRnVuZ2libGUAAQAAPQYMDHhjbQh2MyxXZWlnaHRMaW1pdAABCCRVbmxpbWl0ZWQAAAAcTGltaXRlZAQAKAEYV2VpZ2h0AAEAAEEGDCxzdGFnaW5nX3hjbQh2NAxYY20EEENhbGwAAAQARQYBWFZlYzxJbnN0cnVjdGlvbjxDYWxsPj4AAEUGAAACSQYASQYMLHN0YWdpbmdfeGNtCHY0LEluc3RydWN0aW9uBBBDYWxsAAHANFdpdGhkcmF3QXNzZXQEAE0GARhBc3NldHMAAABUUmVzZXJ2ZUFzc2V0RGVwb3NpdGVkBABNBgEYQXNzZXRzAAEAWFJlY2VpdmVUZWxlcG9ydGVkQXNzZXQEAE0GARhBc3NldHMAAgA0UXVlcnlSZXNwb25zZRABIHF1ZXJ5X2lkLAEcUXVlcnlJZAABIHJlc3BvbnNlYQYBIFJlc3BvbnNlAAEobWF4X3dlaWdodCgBGFdlaWdodAABHHF1ZXJpZXJ1BgFAT3B0aW9uPExvY2F0aW9uPgADADRUcmFuc2ZlckFzc2V0CAEYYXNzZXRzTQYBGEFzc2V0cwABLGJlbmVmaWNpYXJ5DQEBIExvY2F0aW9uAAQAUFRyYW5zZmVyUmVzZXJ2ZUFzc2V0DAEYYXNzZXRzTQYBGEFzc2V0cwABEGRlc3QNAQEgTG9jYXRpb24AAQx4Y21BBgEcWGNtPCgpPgAFACBUcmFuc2FjdAwBLG9yaWdpbl9raW5kKQYBKE9yaWdpbktpbmQAAVhyZXF1aXJlX3dlaWdodF9hdF9tb3N0KAEYV2VpZ2h0AAEQY2FsbMkFAUxEb3VibGVFbmNvZGVkPENhbGw+AAYAZEhybXBOZXdDaGFubmVsT3BlblJlcXVlc3QMARhzZW5kZXLsAQx1MzIAAUBtYXhfbWVzc2FnZV9zaXpl7AEMdTMyAAEwbWF4X2NhcGFjaXR57AEMdTMyAAcATEhybXBDaGFubmVsQWNjZXB0ZWQEASRyZWNpcGllbnTsAQx1MzIACABISHJtcENoYW5uZWxDbG9zaW5nDAEkaW5pdGlhdG9y7AEMdTMyAAEYc2VuZGVy7AEMdTMyAAEkcmVjaXBpZW507AEMdTMyAAkALENsZWFyT3JpZ2luAAoANERlc2NlbmRPcmlnaW4EABEBAUBJbnRlcmlvckxvY2F0aW9uAAsALFJlcG9ydEVycm9yBAB5BgFEUXVlcnlSZXNwb25zZUluZm8ADAAwRGVwb3NpdEFzc2V0CAEYYXNzZXRzfQYBLEFzc2V0RmlsdGVyAAEsYmVuZWZpY2lhcnkNAQEgTG9jYXRpb24ADQBMRGVwb3NpdFJlc2VydmVBc3NldAwBGGFzc2V0c30GASxBc3NldEZpbHRlcgABEGRlc3QNAQEgTG9jYXRpb24AAQx4Y21BBgEcWGNtPCgpPgAOADRFeGNoYW5nZUFzc2V0DAEQZ2l2ZX0GASxBc3NldEZpbHRlcgABEHdhbnRNBgEYQXNzZXRzAAEcbWF4aW1hbCABEGJvb2wADwBcSW5pdGlhdGVSZXNlcnZlV2l0aGRyYXcMARhhc3NldHN9BgEsQXNzZXRGaWx0ZXIAARxyZXNlcnZlDQEBIExvY2F0aW9uAAEMeGNtQQYBHFhjbTwoKT4AEABASW5pdGlhdGVUZWxlcG9ydAwBGGFzc2V0c30GASxBc3NldEZpbHRlcgABEGRlc3QNAQEgTG9jYXRpb24AAQx4Y21BBgEcWGNtPCgpPgARADRSZXBvcnRIb2xkaW5nCAE0cmVzcG9uc2VfaW5mb3kGAURRdWVyeVJlc3BvbnNlSW5mbwABGGFzc2V0c30GASxBc3NldEZpbHRlcgASADBCdXlFeGVjdXRpb24IARBmZWVzVQYBFEFzc2V0AAEwd2VpZ2h0X2xpbWl0PQYBLFdlaWdodExpbWl0ABMANFJlZnVuZFN1cnBsdXMAFAA8U2V0RXJyb3JIYW5kbGVyBABBBgEkWGNtPENhbGw+ABUALFNldEFwcGVuZGl4BABBBgEkWGNtPENhbGw+ABYAKENsZWFyRXJyb3IAFwAoQ2xhaW1Bc3NldAgBGGFzc2V0c00GARhBc3NldHMAARh0aWNrZXQNAQEgTG9jYXRpb24AGAAQVHJhcAQALAEMdTY0ABkAQFN1YnNjcmliZVZlcnNpb24IASBxdWVyeV9pZCwBHFF1ZXJ5SWQAAUxtYXhfcmVzcG9uc2Vfd2VpZ2h0KAEYV2VpZ2h0ABoASFVuc3Vic2NyaWJlVmVyc2lvbgAbACRCdXJuQXNzZXQEAE0GARhBc3NldHMAHAAsRXhwZWN0QXNzZXQEAE0GARhBc3NldHMAHQAwRXhwZWN0T3JpZ2luBAB1BgFAT3B0aW9uPExvY2F0aW9uPgAeACxFeHBlY3RFcnJvcgQAAQYBUE9wdGlvbjwodTMyLCBFcnJvcik+AB8AUEV4cGVjdFRyYW5zYWN0U3RhdHVzBAAdBgE4TWF5YmVFcnJvckNvZGUAIAAsUXVlcnlQYWxsZXQIASxtb2R1bGVfbmFtZTgBHFZlYzx1OD4AATRyZXNwb25zZV9pbmZveQYBRFF1ZXJ5UmVzcG9uc2VJbmZvACEAMEV4cGVjdFBhbGxldBQBFGluZGV47AEMdTMyAAEQbmFtZTgBHFZlYzx1OD4AASxtb2R1bGVfbmFtZTgBHFZlYzx1OD4AASxjcmF0ZV9tYWpvcuwBDHUzMgABPG1pbl9jcmF0ZV9taW5vcuwBDHUzMgAiAFBSZXBvcnRUcmFuc2FjdFN0YXR1cwQAeQYBRFF1ZXJ5UmVzcG9uc2VJbmZvACMATENsZWFyVHJhbnNhY3RTdGF0dXMAJAA8VW5pdmVyc2FsT3JpZ2luBAAZAQEgSnVuY3Rpb24AJQA0RXhwb3J0TWVzc2FnZQwBHG5ldHdvcmshAQEkTmV0d29ya0lkAAEsZGVzdGluYXRpb24RAQFASW50ZXJpb3JMb2NhdGlvbgABDHhjbUEGARxYY208KCk+ACYAJExvY2tBc3NldAgBFGFzc2V0VQYBFEFzc2V0AAEgdW5sb2NrZXINAQEgTG9jYXRpb24AJwAsVW5sb2NrQXNzZXQIARRhc3NldFUGARRBc3NldAABGHRhcmdldA0BASBMb2NhdGlvbgAoADhOb3RlVW5sb2NrYWJsZQgBFGFzc2V0VQYBFEFzc2V0AAEUb3duZXINAQEgTG9jYXRpb24AKQA0UmVxdWVzdFVubG9jawgBFGFzc2V0VQYBFEFzc2V0AAEYbG9ja2VyDQEBIExvY2F0aW9uACoALFNldEZlZXNNb2RlBAEwaml0X3dpdGhkcmF3IAEQYm9vbAArACBTZXRUb3BpYwQABAEgW3U4OyAzMl0ALAAoQ2xlYXJUb3BpYwAtACxBbGlhc09yaWdpbgQADQEBIExvY2F0aW9uAC4APFVucGFpZEV4ZWN1dGlvbggBMHdlaWdodF9saW1pdD0GASxXZWlnaHRMaW1pdAABMGNoZWNrX29yaWdpbnUGAUBPcHRpb248TG9jYXRpb24+AC8AAE0GECxzdGFnaW5nX3hjbQh2NBRhc3NldBhBc3NldHMAAAQAUQYBKFZlYzxBc3NldD4AAFEGAAACVQYAVQYQLHN0YWdpbmdfeGNtCHY0FGFzc2V0FEFzc2V0AAAIAQhpZEEBARxBc3NldElkAAEMZnVuWQYBLEZ1bmdpYmlsaXR5AABZBhAsc3RhZ2luZ194Y20IdjQUYXNzZXQsRnVuZ2liaWxpdHkAAQggRnVuZ2libGUEAPwBEHUxMjgAAAAsTm9uRnVuZ2libGUEAF0GATRBc3NldEluc3RhbmNlAAEAAF0GECxzdGFnaW5nX3hjbQh2NBRhc3NldDRBc3NldEluc3RhbmNlAAEYJFVuZGVmaW5lZAAAABRJbmRleAQA/AEQdTEyOAABABhBcnJheTQEAEgBHFt1ODsgNF0AAgAYQXJyYXk4BACxBQEcW3U4OyA4XQADABxBcnJheTE2BADAASBbdTg7IDE2XQAEABxBcnJheTMyBAAEASBbdTg7IDMyXQAFAABhBgwsc3RhZ2luZ194Y20IdjQgUmVzcG9uc2UAARgQTnVsbAAAABhBc3NldHMEAE0GARhBc3NldHMAAQA8RXhlY3V0aW9uUmVzdWx0BAABBgFQT3B0aW9uPCh1MzIsIEVycm9yKT4AAgAcVmVyc2lvbgQAEAE4c3VwZXI6OlZlcnNpb24AAwAsUGFsbGV0c0luZm8EAGUGAZhCb3VuZGVkVmVjPFBhbGxldEluZm8sIE1heFBhbGxldHNJbmZvPgAEADhEaXNwYXRjaFJlc3VsdAQAHQYBOE1heWJlRXJyb3JDb2RlAAUAAGUGDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBaQYEUwAABABxBgEYVmVjPFQ+AABpBgwsc3RhZ2luZ194Y20IdjQoUGFsbGV0SW5mbwAAGAEUaW5kZXjsAQx1MzIAARBuYW1lbQYBgEJvdW5kZWRWZWM8dTgsIE1heFBhbGxldE5hbWVMZW4+AAEsbW9kdWxlX25hbWVtBgGAQm91bmRlZFZlYzx1OCwgTWF4UGFsbGV0TmFtZUxlbj4AARRtYWpvcuwBDHUzMgABFG1pbm9y7AEMdTMyAAEUcGF0Y2jsAQx1MzIAAG0GDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBCARTAAAEADgBGFZlYzxUPgAAcQYAAAJpBgB1BgQYT3B0aW9uBARUAQ0BAQgQTm9uZQAAABBTb21lBAANAQAAAQAAeQYMLHN0YWdpbmdfeGNtCHY0RFF1ZXJ5UmVzcG9uc2VJbmZvAAAMASxkZXN0aW5hdGlvbg0BASBMb2NhdGlvbgABIHF1ZXJ5X2lkLAEcUXVlcnlJZAABKG1heF93ZWlnaHQoARhXZWlnaHQAAH0GECxzdGFnaW5nX3hjbQh2NBRhc3NldCxBc3NldEZpbHRlcgABCCBEZWZpbml0ZQQATQYBGEFzc2V0cwAAABBXaWxkBACBBgEkV2lsZEFzc2V0AAEAAIEGECxzdGFnaW5nX3hjbQh2NBRhc3NldCRXaWxkQXNzZXQAARAMQWxsAAAAFEFsbE9mCAEIaWRBAQEcQXNzZXRJZAABDGZ1boUGATxXaWxkRnVuZ2liaWxpdHkAAQAoQWxsQ291bnRlZAQA7AEMdTMyAAIAMEFsbE9mQ291bnRlZAwBCGlkQQEBHEFzc2V0SWQAAQxmdW6FBgE8V2lsZEZ1bmdpYmlsaXR5AAEUY291bnTsAQx1MzIAAwAAhQYQLHN0YWdpbmdfeGNtCHY0FGFzc2V0PFdpbGRGdW5naWJpbGl0eQABCCBGdW5naWJsZQAAACxOb25GdW5naWJsZQABAACJBggMeGNtPFZlcnNpb25lZEFzc2V0cwABDAhWMgQAmQUBPHYyOjpNdWx0aUFzc2V0cwABAAhWMwQA6QUBPHYzOjpNdWx0aUFzc2V0cwADAAhWNAQATQYBKHY0OjpBc3NldHMABAAAjQYIDHhjbTBWZXJzaW9uZWRYY20ELFJ1bnRpbWVDYWxsAAEMCFYyBACRBgFQdjI6OlhjbTxSdW50aW1lQ2FsbD4AAgAIVjMEAKEGAVB2Mzo6WGNtPFJ1bnRpbWVDYWxsPgADAAhWNAQArQYBUHY0OjpYY208UnVudGltZUNhbGw+AAQAAJEGDAx4Y20IdjIMWGNtBCxSdW50aW1lQ2FsbAAABACVBgF0VmVjPEluc3RydWN0aW9uPFJ1bnRpbWVDYWxsPj4AAJUGAAACmQYAmQYMDHhjbQh2MixJbnN0cnVjdGlvbgQsUnVudGltZUNhbGwAAXA0V2l0aGRyYXdBc3NldAQAmQUBLE11bHRpQXNzZXRzAAAAVFJlc2VydmVBc3NldERlcG9zaXRlZAQAmQUBLE11bHRpQXNzZXRzAAEAWFJlY2VpdmVUZWxlcG9ydGVkQXNzZXQEAJkFASxNdWx0aUFzc2V0cwACADRRdWVyeVJlc3BvbnNlDAEgcXVlcnlfaWQsARxRdWVyeUlkAAEgcmVzcG9uc2W1BQEgUmVzcG9uc2UAAShtYXhfd2VpZ2h0LAEMdTY0AAMANFRyYW5zZmVyQXNzZXQIARhhc3NldHOZBQEsTXVsdGlBc3NldHMAASxiZW5lZmljaWFyeUkBATRNdWx0aUxvY2F0aW9uAAQAUFRyYW5zZmVyUmVzZXJ2ZUFzc2V0DAEYYXNzZXRzmQUBLE11bHRpQXNzZXRzAAEQZGVzdEkBATRNdWx0aUxvY2F0aW9uAAEMeGNtjQUBHFhjbTwoKT4ABQAgVHJhbnNhY3QMASxvcmlnaW5fdHlwZcUFAShPcmlnaW5LaW5kAAFYcmVxdWlyZV93ZWlnaHRfYXRfbW9zdCwBDHU2NAABEGNhbGydBgFoRG91YmxlRW5jb2RlZDxSdW50aW1lQ2FsbD4ABgBkSHJtcE5ld0NoYW5uZWxPcGVuUmVxdWVzdAwBGHNlbmRlcuwBDHUzMgABQG1heF9tZXNzYWdlX3NpemXsAQx1MzIAATBtYXhfY2FwYWNpdHnsAQx1MzIABwBMSHJtcENoYW5uZWxBY2NlcHRlZAQBJHJlY2lwaWVudOwBDHUzMgAIAEhIcm1wQ2hhbm5lbENsb3NpbmcMASRpbml0aWF0b3LsAQx1MzIAARhzZW5kZXLsAQx1MzIAASRyZWNpcGllbnTsAQx1MzIACQAsQ2xlYXJPcmlnaW4ACgA0RGVzY2VuZE9yaWdpbgQATQEBVEludGVyaW9yTXVsdGlMb2NhdGlvbgALACxSZXBvcnRFcnJvcgwBIHF1ZXJ5X2lkLAEcUXVlcnlJZAABEGRlc3RJAQE0TXVsdGlMb2NhdGlvbgABTG1heF9yZXNwb25zZV93ZWlnaHQsAQx1NjQADAAwRGVwb3NpdEFzc2V0DAEYYXNzZXRzzQUBQE11bHRpQXNzZXRGaWx0ZXIAAShtYXhfYXNzZXRz7AEMdTMyAAEsYmVuZWZpY2lhcnlJAQE0TXVsdGlMb2NhdGlvbgANAExEZXBvc2l0UmVzZXJ2ZUFzc2V0EAEYYXNzZXRzzQUBQE11bHRpQXNzZXRGaWx0ZXIAAShtYXhfYXNzZXRz7AEMdTMyAAEQZGVzdEkBATRNdWx0aUxvY2F0aW9uAAEMeGNtjQUBHFhjbTwoKT4ADgA0RXhjaGFuZ2VBc3NldAgBEGdpdmXNBQFATXVsdGlBc3NldEZpbHRlcgABHHJlY2VpdmWZBQEsTXVsdGlBc3NldHMADwBcSW5pdGlhdGVSZXNlcnZlV2l0aGRyYXcMARhhc3NldHPNBQFATXVsdGlBc3NldEZpbHRlcgABHHJlc2VydmVJAQE0TXVsdGlMb2NhdGlvbgABDHhjbY0FARxYY208KCk+ABAAQEluaXRpYXRlVGVsZXBvcnQMARhhc3NldHPNBQFATXVsdGlBc3NldEZpbHRlcgABEGRlc3RJAQE0TXVsdGlMb2NhdGlvbgABDHhjbY0FARxYY208KCk+ABEAMFF1ZXJ5SG9sZGluZxABIHF1ZXJ5X2lkLAEcUXVlcnlJZAABEGRlc3RJAQE0TXVsdGlMb2NhdGlvbgABGGFzc2V0c80FAUBNdWx0aUFzc2V0RmlsdGVyAAFMbWF4X3Jlc3BvbnNlX3dlaWdodCwBDHU2NAASADBCdXlFeGVjdXRpb24IARBmZWVzoQUBKE11bHRpQXNzZXQAATB3ZWlnaHRfbGltaXTZBQEsV2VpZ2h0TGltaXQAEwA0UmVmdW5kU3VycGx1cwAUADxTZXRFcnJvckhhbmRsZXIEAJEGAUBYY208UnVudGltZUNhbGw+ABUALFNldEFwcGVuZGl4BACRBgFAWGNtPFJ1bnRpbWVDYWxsPgAWAChDbGVhckVycm9yABcAKENsYWltQXNzZXQIARhhc3NldHOZBQEsTXVsdGlBc3NldHMAARh0aWNrZXRJAQE0TXVsdGlMb2NhdGlvbgAYABBUcmFwBAAsAQx1NjQAGQBAU3Vic2NyaWJlVmVyc2lvbggBIHF1ZXJ5X2lkLAEcUXVlcnlJZAABTG1heF9yZXNwb25zZV93ZWlnaHQsAQx1NjQAGgBIVW5zdWJzY3JpYmVWZXJzaW9uABsAAJ0GDAx4Y204ZG91YmxlX2VuY29kZWQ0RG91YmxlRW5jb2RlZAQEVAAABAEcZW5jb2RlZDgBHFZlYzx1OD4AAKEGDAx4Y20IdjMMWGNtBBBDYWxsAAAEAKUGAVhWZWM8SW5zdHJ1Y3Rpb248Q2FsbD4+AAClBgAAAqkGAKkGDAx4Y20IdjMsSW5zdHJ1Y3Rpb24EEENhbGwAAcA0V2l0aGRyYXdBc3NldAQA6QUBLE11bHRpQXNzZXRzAAAAVFJlc2VydmVBc3NldERlcG9zaXRlZAQA6QUBLE11bHRpQXNzZXRzAAEAWFJlY2VpdmVUZWxlcG9ydGVkQXNzZXQEAOkFASxNdWx0aUFzc2V0cwACADRRdWVyeVJlc3BvbnNlEAEgcXVlcnlfaWQsARxRdWVyeUlkAAEgcmVzcG9uc2X9BQEgUmVzcG9uc2UAAShtYXhfd2VpZ2h0KAEYV2VpZ2h0AAEccXVlcmllciUGAVRPcHRpb248TXVsdGlMb2NhdGlvbj4AAwA0VHJhbnNmZXJBc3NldAgBGGFzc2V0c+kFASxNdWx0aUFzc2V0cwABLGJlbmVmaWNpYXJ54AE0TXVsdGlMb2NhdGlvbgAEAFBUcmFuc2ZlclJlc2VydmVBc3NldAwBGGFzc2V0c+kFASxNdWx0aUFzc2V0cwABEGRlc3TgATRNdWx0aUxvY2F0aW9uAAEMeGNt3QUBHFhjbTwoKT4ABQAgVHJhbnNhY3QMASxvcmlnaW5fa2luZCkGAShPcmlnaW5LaW5kAAFYcmVxdWlyZV93ZWlnaHRfYXRfbW9zdCgBGFdlaWdodAABEGNhbGydBgFMRG91YmxlRW5jb2RlZDxDYWxsPgAGAGRIcm1wTmV3Q2hhbm5lbE9wZW5SZXF1ZXN0DAEYc2VuZGVy7AEMdTMyAAFAbWF4X21lc3NhZ2Vfc2l6ZewBDHUzMgABMG1heF9jYXBhY2l0eewBDHUzMgAHAExIcm1wQ2hhbm5lbEFjY2VwdGVkBAEkcmVjaXBpZW507AEMdTMyAAgASEhybXBDaGFubmVsQ2xvc2luZwwBJGluaXRpYXRvcuwBDHUzMgABGHNlbmRlcuwBDHUzMgABJHJlY2lwaWVudOwBDHUzMgAJACxDbGVhck9yaWdpbgAKADREZXNjZW5kT3JpZ2luBADkAVRJbnRlcmlvck11bHRpTG9jYXRpb24ACwAsUmVwb3J0RXJyb3IEAC0GAURRdWVyeVJlc3BvbnNlSW5mbwAMADBEZXBvc2l0QXNzZXQIARhhc3NldHMxBgFATXVsdGlBc3NldEZpbHRlcgABLGJlbmVmaWNpYXJ54AE0TXVsdGlMb2NhdGlvbgANAExEZXBvc2l0UmVzZXJ2ZUFzc2V0DAEYYXNzZXRzMQYBQE11bHRpQXNzZXRGaWx0ZXIAARBkZXN04AE0TXVsdGlMb2NhdGlvbgABDHhjbd0FARxYY208KCk+AA4ANEV4Y2hhbmdlQXNzZXQMARBnaXZlMQYBQE11bHRpQXNzZXRGaWx0ZXIAARB3YW506QUBLE11bHRpQXNzZXRzAAEcbWF4aW1hbCABEGJvb2wADwBcSW5pdGlhdGVSZXNlcnZlV2l0aGRyYXcMARhhc3NldHMxBgFATXVsdGlBc3NldEZpbHRlcgABHHJlc2VydmXgATRNdWx0aUxvY2F0aW9uAAEMeGNt3QUBHFhjbTwoKT4AEABASW5pdGlhdGVUZWxlcG9ydAwBGGFzc2V0czEGAUBNdWx0aUFzc2V0RmlsdGVyAAEQZGVzdOABNE11bHRpTG9jYXRpb24AAQx4Y23dBQEcWGNtPCgpPgARADRSZXBvcnRIb2xkaW5nCAE0cmVzcG9uc2VfaW5mby0GAURRdWVyeVJlc3BvbnNlSW5mbwABGGFzc2V0czEGAUBNdWx0aUFzc2V0RmlsdGVyABIAMEJ1eUV4ZWN1dGlvbggBEGZlZXPxBQEoTXVsdGlBc3NldAABMHdlaWdodF9saW1pdD0GASxXZWlnaHRMaW1pdAATADRSZWZ1bmRTdXJwbHVzABQAPFNldEVycm9ySGFuZGxlcgQAoQYBJFhjbTxDYWxsPgAVACxTZXRBcHBlbmRpeAQAoQYBJFhjbTxDYWxsPgAWAChDbGVhckVycm9yABcAKENsYWltQXNzZXQIARhhc3NldHPpBQEsTXVsdGlBc3NldHMAARh0aWNrZXTgATRNdWx0aUxvY2F0aW9uABgAEFRyYXAEACwBDHU2NAAZAEBTdWJzY3JpYmVWZXJzaW9uCAEgcXVlcnlfaWQsARxRdWVyeUlkAAFMbWF4X3Jlc3BvbnNlX3dlaWdodCgBGFdlaWdodAAaAEhVbnN1YnNjcmliZVZlcnNpb24AGwAkQnVybkFzc2V0BADpBQEsTXVsdGlBc3NldHMAHAAsRXhwZWN0QXNzZXQEAOkFASxNdWx0aUFzc2V0cwAdADBFeHBlY3RPcmlnaW4EACUGAVRPcHRpb248TXVsdGlMb2NhdGlvbj4AHgAsRXhwZWN0RXJyb3IEAAEGAVBPcHRpb248KHUzMiwgRXJyb3IpPgAfAFBFeHBlY3RUcmFuc2FjdFN0YXR1cwQAHQYBOE1heWJlRXJyb3JDb2RlACAALFF1ZXJ5UGFsbGV0CAEsbW9kdWxlX25hbWU4ARxWZWM8dTg+AAE0cmVzcG9uc2VfaW5mby0GAURRdWVyeVJlc3BvbnNlSW5mbwAhADBFeHBlY3RQYWxsZXQUARRpbmRleOwBDHUzMgABEG5hbWU4ARxWZWM8dTg+AAEsbW9kdWxlX25hbWU4ARxWZWM8dTg+AAEsY3JhdGVfbWFqb3LsAQx1MzIAATxtaW5fY3JhdGVfbWlub3LsAQx1MzIAIgBQUmVwb3J0VHJhbnNhY3RTdGF0dXMEAC0GAURRdWVyeVJlc3BvbnNlSW5mbwAjAExDbGVhclRyYW5zYWN0U3RhdHVzACQAPFVuaXZlcnNhbE9yaWdpbgQA6AEgSnVuY3Rpb24AJQA0RXhwb3J0TWVzc2FnZQwBHG5ldHdvcmv0ASROZXR3b3JrSWQAASxkZXN0aW5hdGlvbuQBVEludGVyaW9yTXVsdGlMb2NhdGlvbgABDHhjbd0FARxYY208KCk+ACYAJExvY2tBc3NldAgBFGFzc2V08QUBKE11bHRpQXNzZXQAASB1bmxvY2tlcuABNE11bHRpTG9jYXRpb24AJwAsVW5sb2NrQXNzZXQIARRhc3NldPEFAShNdWx0aUFzc2V0AAEYdGFyZ2V04AE0TXVsdGlMb2NhdGlvbgAoADhOb3RlVW5sb2NrYWJsZQgBFGFzc2V08QUBKE11bHRpQXNzZXQAARRvd25lcuABNE11bHRpTG9jYXRpb24AKQA0UmVxdWVzdFVubG9jawgBFGFzc2V08QUBKE11bHRpQXNzZXQAARhsb2NrZXLgATRNdWx0aUxvY2F0aW9uACoALFNldEZlZXNNb2RlBAEwaml0X3dpdGhkcmF3IAEQYm9vbAArACBTZXRUb3BpYwQABAEgW3U4OyAzMl0ALAAoQ2xlYXJUb3BpYwAtACxBbGlhc09yaWdpbgQA4AE0TXVsdGlMb2NhdGlvbgAuADxVbnBhaWRFeGVjdXRpb24IATB3ZWlnaHRfbGltaXQ9BgEsV2VpZ2h0TGltaXQAATBjaGVja19vcmlnaW4lBgFUT3B0aW9uPE11bHRpTG9jYXRpb24+AC8AAK0GDCxzdGFnaW5nX3hjbQh2NAxYY20EEENhbGwAAAQAsQYBWFZlYzxJbnN0cnVjdGlvbjxDYWxsPj4AALEGAAACtQYAtQYMLHN0YWdpbmdfeGNtCHY0LEluc3RydWN0aW9uBBBDYWxsAAHANFdpdGhkcmF3QXNzZXQEAE0GARhBc3NldHMAAABUUmVzZXJ2ZUFzc2V0RGVwb3NpdGVkBABNBgEYQXNzZXRzAAEAWFJlY2VpdmVUZWxlcG9ydGVkQXNzZXQEAE0GARhBc3NldHMAAgA0UXVlcnlSZXNwb25zZRABIHF1ZXJ5X2lkLAEcUXVlcnlJZAABIHJlc3BvbnNlYQYBIFJlc3BvbnNlAAEobWF4X3dlaWdodCgBGFdlaWdodAABHHF1ZXJpZXJ1BgFAT3B0aW9uPExvY2F0aW9uPgADADRUcmFuc2ZlckFzc2V0CAEYYXNzZXRzTQYBGEFzc2V0cwABLGJlbmVmaWNpYXJ5DQEBIExvY2F0aW9uAAQAUFRyYW5zZmVyUmVzZXJ2ZUFzc2V0DAEYYXNzZXRzTQYBGEFzc2V0cwABEGRlc3QNAQEgTG9jYXRpb24AAQx4Y21BBgEcWGNtPCgpPgAFACBUcmFuc2FjdAwBLG9yaWdpbl9raW5kKQYBKE9yaWdpbktpbmQAAVhyZXF1aXJlX3dlaWdodF9hdF9tb3N0KAEYV2VpZ2h0AAEQY2FsbJ0GAUxEb3VibGVFbmNvZGVkPENhbGw+AAYAZEhybXBOZXdDaGFubmVsT3BlblJlcXVlc3QMARhzZW5kZXLsAQx1MzIAAUBtYXhfbWVzc2FnZV9zaXpl7AEMdTMyAAEwbWF4X2NhcGFjaXR57AEMdTMyAAcATEhybXBDaGFubmVsQWNjZXB0ZWQEASRyZWNpcGllbnTsAQx1MzIACABISHJtcENoYW5uZWxDbG9zaW5nDAEkaW5pdGlhdG9y7AEMdTMyAAEYc2VuZGVy7AEMdTMyAAEkcmVjaXBpZW507AEMdTMyAAkALENsZWFyT3JpZ2luAAoANERlc2NlbmRPcmlnaW4EABEBAUBJbnRlcmlvckxvY2F0aW9uAAsALFJlcG9ydEVycm9yBAB5BgFEUXVlcnlSZXNwb25zZUluZm8ADAAwRGVwb3NpdEFzc2V0CAEYYXNzZXRzfQYBLEFzc2V0RmlsdGVyAAEsYmVuZWZpY2lhcnkNAQEgTG9jYXRpb24ADQBMRGVwb3NpdFJlc2VydmVBc3NldAwBGGFzc2V0c30GASxBc3NldEZpbHRlcgABEGRlc3QNAQEgTG9jYXRpb24AAQx4Y21BBgEcWGNtPCgpPgAOADRFeGNoYW5nZUFzc2V0DAEQZ2l2ZX0GASxBc3NldEZpbHRlcgABEHdhbnRNBgEYQXNzZXRzAAEcbWF4aW1hbCABEGJvb2wADwBcSW5pdGlhdGVSZXNlcnZlV2l0aGRyYXcMARhhc3NldHN9BgEsQXNzZXRGaWx0ZXIAARxyZXNlcnZlDQEBIExvY2F0aW9uAAEMeGNtQQYBHFhjbTwoKT4AEABASW5pdGlhdGVUZWxlcG9ydAwBGGFzc2V0c30GASxBc3NldEZpbHRlcgABEGRlc3QNAQEgTG9jYXRpb24AAQx4Y21BBgEcWGNtPCgpPgARADRSZXBvcnRIb2xkaW5nCAE0cmVzcG9uc2VfaW5mb3kGAURRdWVyeVJlc3BvbnNlSW5mbwABGGFzc2V0c30GASxBc3NldEZpbHRlcgASADBCdXlFeGVjdXRpb24IARBmZWVzVQYBFEFzc2V0AAEwd2VpZ2h0X2xpbWl0PQYBLFdlaWdodExpbWl0ABMANFJlZnVuZFN1cnBsdXMAFAA8U2V0RXJyb3JIYW5kbGVyBACtBgEkWGNtPENhbGw+ABUALFNldEFwcGVuZGl4BACtBgEkWGNtPENhbGw+ABYAKENsZWFyRXJyb3IAFwAoQ2xhaW1Bc3NldAgBGGFzc2V0c00GARhBc3NldHMAARh0aWNrZXQNAQEgTG9jYXRpb24AGAAQVHJhcAQALAEMdTY0ABkAQFN1YnNjcmliZVZlcnNpb24IASBxdWVyeV9pZCwBHFF1ZXJ5SWQAAUxtYXhfcmVzcG9uc2Vfd2VpZ2h0KAEYV2VpZ2h0ABoASFVuc3Vic2NyaWJlVmVyc2lvbgAbACRCdXJuQXNzZXQEAE0GARhBc3NldHMAHAAsRXhwZWN0QXNzZXQEAE0GARhBc3NldHMAHQAwRXhwZWN0T3JpZ2luBAB1BgFAT3B0aW9uPExvY2F0aW9uPgAeACxFeHBlY3RFcnJvcgQAAQYBUE9wdGlvbjwodTMyLCBFcnJvcik+AB8AUEV4cGVjdFRyYW5zYWN0U3RhdHVzBAAdBgE4TWF5YmVFcnJvckNvZGUAIAAsUXVlcnlQYWxsZXQIASxtb2R1bGVfbmFtZTgBHFZlYzx1OD4AATRyZXNwb25zZV9pbmZveQYBRFF1ZXJ5UmVzcG9uc2VJbmZvACEAMEV4cGVjdFBhbGxldBQBFGluZGV47AEMdTMyAAEQbmFtZTgBHFZlYzx1OD4AASxtb2R1bGVfbmFtZTgBHFZlYzx1OD4AASxjcmF0ZV9tYWpvcuwBDHUzMgABPG1pbl9jcmF0ZV9taW5vcuwBDHUzMgAiAFBSZXBvcnRUcmFuc2FjdFN0YXR1cwQAeQYBRFF1ZXJ5UmVzcG9uc2VJbmZvACMATENsZWFyVHJhbnNhY3RTdGF0dXMAJAA8VW5pdmVyc2FsT3JpZ2luBAAZAQEgSnVuY3Rpb24AJQA0RXhwb3J0TWVzc2FnZQwBHG5ldHdvcmshAQEkTmV0d29ya0lkAAEsZGVzdGluYXRpb24RAQFASW50ZXJpb3JMb2NhdGlvbgABDHhjbUEGARxYY208KCk+ACYAJExvY2tBc3NldAgBFGFzc2V0VQYBFEFzc2V0AAEgdW5sb2NrZXINAQEgTG9jYXRpb24AJwAsVW5sb2NrQXNzZXQIARRhc3NldFUGARRBc3NldAABGHRhcmdldA0BASBMb2NhdGlvbgAoADhOb3RlVW5sb2NrYWJsZQgBFGFzc2V0VQYBFEFzc2V0AAEUb3duZXINAQEgTG9jYXRpb24AKQA0UmVxdWVzdFVubG9jawgBFGFzc2V0VQYBFEFzc2V0AAEYbG9ja2VyDQEBIExvY2F0aW9uACoALFNldEZlZXNNb2RlBAEwaml0X3dpdGhkcmF3IAEQYm9vbAArACBTZXRUb3BpYwQABAEgW3U4OyAzMl0ALAAoQ2xlYXJUb3BpYwAtACxBbGlhc09yaWdpbgQADQEBIExvY2F0aW9uAC4APFVucGFpZEV4ZWN1dGlvbggBMHdlaWdodF9saW1pdD0GASxXZWlnaHRMaW1pdAABMGNoZWNrX29yaWdpbnUGAUBPcHRpb248TG9jYXRpb24+AC8AALkGEFBzdGFnaW5nX3hjbV9leGVjdXRvchh0cmFpdHM4YXNzZXRfdHJhbnNmZXIwVHJhbnNmZXJUeXBlAAEQIFRlbGVwb3J0AAAAMExvY2FsUmVzZXJ2ZQABAEhEZXN0aW5hdGlvblJlc2VydmUAAgA0UmVtb3RlUmVzZXJ2ZQQARQEBRFZlcnNpb25lZExvY2F0aW9uAAMAAL0GCAx4Y21AVmVyc2lvbmVkQXNzZXRJZAABCAhWMwQACQEBLHYzOjpBc3NldElkAAMACFY0BABBAQEsdjQ6OkFzc2V0SWQABAAAwQYMUHBhbGxldF9tZXNzYWdlX3F1ZXVlGHBhbGxldBBDYWxsBARUAAEIJHJlYXBfcGFnZQgBOG1lc3NhZ2Vfb3JpZ2luxQYBSE1lc3NhZ2VPcmlnaW5PZjxUPgABKHBhZ2VfaW5kZXgQASRQYWdlSW5kZXgAAAQ9AVJlbW92ZSBhIHBhZ2Ugd2hpY2ggaGFzIG5vIG1vcmUgbWVzc2FnZXMgcmVtYWluaW5nIHRvIGJlIHByb2Nlc3NlZCBvciBpcyBzdGFsZS5IZXhlY3V0ZV9vdmVyd2VpZ2h0EAE4bWVzc2FnZV9vcmlnaW7FBgFITWVzc2FnZU9yaWdpbk9mPFQ+AAEQcGFnZRABJFBhZ2VJbmRleAABFGluZGV4EAEcVDo6U2l6ZQABMHdlaWdodF9saW1pdCgBGFdlaWdodAABNHhFeGVjdXRlIGFuIG92ZXJ3ZWlnaHQgbWVzc2FnZS4ATQFUZW1wb3JhcnkgcHJvY2Vzc2luZyBlcnJvcnMgd2lsbCBiZSBwcm9wYWdhdGVkIHdoZXJlYXMgcGVybWFuZW50IGVycm9ycyBhcmUgdHJlYXRlZFRhcyBzdWNjZXNzIGNvbmRpdGlvbi4AdC0gYG9yaWdpbmA6IE11c3QgYmUgYFNpZ25lZGAuNQEtIGBtZXNzYWdlX29yaWdpbmA6IFRoZSBvcmlnaW4gZnJvbSB3aGljaCB0aGUgbWVzc2FnZSB0byBiZSBleGVjdXRlZCBhcnJpdmVkLj0BLSBgcGFnZWA6IFRoZSBwYWdlIGluIHRoZSBxdWV1ZSBpbiB3aGljaCB0aGUgbWVzc2FnZSB0byBiZSBleGVjdXRlZCBpcyBzaXR0aW5nLgkBLSBgaW5kZXhgOiBUaGUgaW5kZXggaW50byB0aGUgcXVldWUgb2YgdGhlIG1lc3NhZ2UgdG8gYmUgZXhlY3V0ZWQuWQEtIGB3ZWlnaHRfbGltaXRgOiBUaGUgbWF4aW11bSBhbW91bnQgb2Ygd2VpZ2h0IGFsbG93ZWQgdG8gYmUgY29uc3VtZWQgaW4gdGhlIGV4ZWN1dGlvbkQgIG9mIHRoZSBtZXNzYWdlLgD0QmVuY2htYXJrIGNvbXBsZXhpdHkgY29uc2lkZXJhdGlvbnM6IE8oaW5kZXggKyB3ZWlnaHRfbGltaXQpLgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy7FBgxscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zJGluY2x1c2lvblhBZ2dyZWdhdGVNZXNzYWdlT3JpZ2luAAEEDFVtcAQAyQYBKFVtcFF1ZXVlSWQAAAAAyQYMbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucyRpbmNsdXNpb24oVW1wUXVldWVJZAABBBBQYXJhBACNAgEYUGFyYUlkAAAAAM0GDERwYWxsZXRfYXNzZXRfcmF0ZRhwYWxsZXQQQ2FsbAQEVAABDBhjcmVhdGUIAShhc3NldF9raW5k3AFEQm94PFQ6OkFzc2V0S2luZD4AARByYXRl0QYBJEZpeGVkVTEyOAAAEA0BSW5pdGlhbGl6ZSBhIGNvbnZlcnNpb24gcmF0ZSB0byBuYXRpdmUgYmFsYW5jZSBmb3IgdGhlIGdpdmVuIGFzc2V0LgA0IyMgQ29tcGxleGl0eRgtIE8oMSkYdXBkYXRlCAEoYXNzZXRfa2luZNwBREJveDxUOjpBc3NldEtpbmQ+AAEQcmF0ZdEGASRGaXhlZFUxMjgAARAFAVVwZGF0ZSB0aGUgY29udmVyc2lvbiByYXRlIHRvIG5hdGl2ZSBiYWxhbmNlIGZvciB0aGUgZ2l2ZW4gYXNzZXQuADQjIyBDb21wbGV4aXR5GC0gTygxKRhyZW1vdmUEAShhc3NldF9raW5k3AFEQm94PFQ6OkFzc2V0S2luZD4AAhAlAVJlbW92ZSBhbiBleGlzdGluZyBjb252ZXJzaW9uIHJhdGUgdG8gbmF0aXZlIGJhbGFuY2UgZm9yIHRoZSBnaXZlbiBhc3NldC4ANCMjIENvbXBsZXhpdHkYLSBPKDEpBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLtEGDDRzcF9hcml0aG1ldGljLGZpeGVkX3BvaW50JEZpeGVkVTEyOAAABAAYARB1MTI4AADVBgwwcGFsbGV0X2JlZWZ5GHBhbGxldBBDYWxsBARUAAEMTHJlcG9ydF9lcXVpdm9jYXRpb24IAUhlcXVpdm9jYXRpb25fcHJvb2bZBgGNAUJveDxEb3VibGVWb3RpbmdQcm9vZjxCbG9ja051bWJlckZvcjxUPiwgVDo6QmVlZnlJZCw8VDo6QmVlZnlJZAphcyBSdW50aW1lQXBwUHVibGljPjo6U2lnbmF0dXJlLD4sPgABPGtleV9vd25lcl9wcm9vZq0BAUBUOjpLZXlPd25lclByb29mAAAQCQFSZXBvcnQgdm90ZXIgZXF1aXZvY2F0aW9uL21pc2JlaGF2aW9yLiBUaGlzIG1ldGhvZCB3aWxsIHZlcmlmeSB0aGX0ZXF1aXZvY2F0aW9uIHByb29mIGFuZCB2YWxpZGF0ZSB0aGUgZ2l2ZW4ga2V5IG93bmVyc2hpcCBwcm9vZvhhZ2FpbnN0IHRoZSBleHRyYWN0ZWQgb2ZmZW5kZXIuIElmIGJvdGggYXJlIHZhbGlkLCB0aGUgb2ZmZW5jZUR3aWxsIGJlIHJlcG9ydGVkLnByZXBvcnRfZXF1aXZvY2F0aW9uX3Vuc2lnbmVkCAFIZXF1aXZvY2F0aW9uX3Byb29m2QYBjQFCb3g8RG91YmxlVm90aW5nUHJvb2Y8QmxvY2tOdW1iZXJGb3I8VD4sIFQ6OkJlZWZ5SWQsPFQ6OkJlZWZ5SWQKYXMgUnVudGltZUFwcFB1YmxpYz46OlNpZ25hdHVyZSw+LD4AATxrZXlfb3duZXJfcHJvb2atAQFAVDo6S2V5T3duZXJQcm9vZgABJAkBUmVwb3J0IHZvdGVyIGVxdWl2b2NhdGlvbi9taXNiZWhhdmlvci4gVGhpcyBtZXRob2Qgd2lsbCB2ZXJpZnkgdGhl9GVxdWl2b2NhdGlvbiBwcm9vZiBhbmQgdmFsaWRhdGUgdGhlIGdpdmVuIGtleSBvd25lcnNoaXAgcHJvb2b4YWdhaW5zdCB0aGUgZXh0cmFjdGVkIG9mZmVuZGVyLiBJZiBib3RoIGFyZSB2YWxpZCwgdGhlIG9mZmVuY2VEd2lsbCBiZSByZXBvcnRlZC4ADQFUaGlzIGV4dHJpbnNpYyBtdXN0IGJlIGNhbGxlZCB1bnNpZ25lZCBhbmQgaXQgaXMgZXhwZWN0ZWQgdGhhdCBvbmx5FQFibG9jayBhdXRob3JzIHdpbGwgY2FsbCBpdCAodmFsaWRhdGVkIGluIGBWYWxpZGF0ZVVuc2lnbmVkYCksIGFzIHN1Y2gVAWlmIHRoZSBibG9jayBhdXRob3IgaXMgZGVmaW5lZCBpdCB3aWxsIGJlIGRlZmluZWQgYXMgdGhlIGVxdWl2b2NhdGlvbiRyZXBvcnRlci48c2V0X25ld19nZW5lc2lzBAE8ZGVsYXlfaW5fYmxvY2tzEAFEQmxvY2tOdW1iZXJGb3I8VD4AAhBdAVJlc2V0IEJFRUZZIGNvbnNlbnN1cyBieSBzZXR0aW5nIGEgbmV3IEJFRUZZIGdlbmVzaXMgYXQgYGRlbGF5X2luX2Jsb2Nrc2AgYmxvY2tzIGluIHRoZRxmdXR1cmUuALROb3RlOiBgZGVsYXlfaW5fYmxvY2tzYCBoYXMgdG8gYmUgYXQgbGVhc3QgMS4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMu2QYISHNwX2NvbnNlbnN1c19iZWVmeUREb3VibGVWb3RpbmdQcm9vZgwYTnVtYmVyARAISWQBKQIkU2lnbmF0dXJlAd0GAAgBFGZpcnN04QYBiFZvdGVNZXNzYWdlPE51bWJlciwgSWQsIFNpZ25hdHVyZT4AARhzZWNvbmThBgGIVm90ZU1lc3NhZ2U8TnVtYmVyLCBJZCwgU2lnbmF0dXJlPgAA3QYMSHNwX2NvbnNlbnN1c19iZWVmeTBlY2RzYV9jcnlwdG8kU2lnbmF0dXJlAAAEANkCAUBlY2RzYTo6U2lnbmF0dXJlAADhBghIc3BfY29uc2Vuc3VzX2JlZWZ5LFZvdGVNZXNzYWdlDBhOdW1iZXIBEAhJZAEpAiRTaWduYXR1cmUB3QYADAEoY29tbWl0bWVudOUGAUhDb21taXRtZW50PE51bWJlcj4AAQhpZCkCAQhJZAABJHNpZ25hdHVyZd0GASRTaWduYXR1cmUAAOUGDEhzcF9jb25zZW5zdXNfYmVlZnkoY29tbWl0bWVudChDb21taXRtZW50BDBUQmxvY2tOdW1iZXIBEAAMARxwYXlsb2Fk6QYBHFBheWxvYWQAATBibG9ja19udW1iZXIQATBUQmxvY2tOdW1iZXIAAUB2YWxpZGF0b3Jfc2V0X2lkMAE4VmFsaWRhdG9yU2V0SWQAAOkGDEhzcF9jb25zZW5zdXNfYmVlZnkccGF5bG9hZBxQYXlsb2FkAAAEAO0GAXhWZWM8KEJlZWZ5UGF5bG9hZElkLCBWZWM8dTg+KT4AAO0GAAAC8QYA8QYAAAQI9QY4APUGAAADAgAAAAgA+QYQXHBvbGthZG90X3J1bnRpbWVfY29tbW9uSHBhcmFzX3N1ZG9fd3JhcHBlchhwYWxsZXQQQ2FsbAQEVAABGHRzdWRvX3NjaGVkdWxlX3BhcmFfaW5pdGlhbGl6ZQgBCGlkjQIBGFBhcmFJZAABHGdlbmVzaXP9BgE8UGFyYUdlbmVzaXNBcmdzAAAUDQFTY2hlZHVsZSBhIHBhcmEgdG8gYmUgaW5pdGlhbGl6ZWQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBuZXh0IHNlc3Npb24uAE0BVGhpcyBzaG91bGQgb25seSBiZSB1c2VkIGZvciBURVNUSU5HIGFuZCBub3Qgb24gUFJPRFVDVElPTiBjaGFpbnMuIEl0IGF1dG9tYXRpY2FsbHlJAWFzc2lnbnMgQ29yZXRpbWUgdG8gdGhlIGNoYWluIGFuZCBpbmNyZWFzZXMgdGhlIG51bWJlciBvZiBjb3Jlcy4gVGh1cywgdGhlcmUgaXMgbm+AcnVubmluZyBjb3JldGltZSBjaGFpbiByZXF1aXJlZC5oc3Vkb19zY2hlZHVsZV9wYXJhX2NsZWFudXAEAQhpZI0CARhQYXJhSWQAAQQJAVNjaGVkdWxlIGEgcGFyYSB0byBiZSBjbGVhbmVkIHVwIGF0IHRoZSBzdGFydCBvZiB0aGUgbmV4dCBzZXNzaW9uLoBzdWRvX3NjaGVkdWxlX3BhcmF0aHJlYWRfdXBncmFkZQQBCGlkjQIBGFBhcmFJZAACBB0BVXBncmFkZSBhIHBhcmF0aHJlYWQgKG9uLWRlbWFuZCBwYXJhY2hhaW4pIHRvIGEgbGVhc2UgaG9sZGluZyBwYXJhY2hhaW6Ec3Vkb19zY2hlZHVsZV9wYXJhY2hhaW5fZG93bmdyYWRlBAEIaWSNAgEYUGFyYUlkAAME9ERvd25ncmFkZSBhIGxlYXNlIGhvbGRpbmcgcGFyYWNoYWluIHRvIGFuIG9uLWRlbWFuZCBwYXJhY2hhaW5cc3Vkb19xdWV1ZV9kb3dud2FyZF94Y20IAQhpZI0CARhQYXJhSWQAAQx4Y22JBQF4Qm94PHhjbTo6b3BhcXVlOjpWZXJzaW9uZWRYY20+AAQQmFNlbmQgYSBkb3dud2FyZCBYQ00gdG8gdGhlIGdpdmVuIHBhcmEuAFEBVGhlIGdpdmVuIHBhcmFjaGFpbiBzaG91bGQgZXhpc3QgYW5kIHRoZSBwYXlsb2FkIHNob3VsZCBub3QgZXhjZWVkIHRoZSBwcmVjb25maWd1cmVkoHNpemUgYGNvbmZpZy5tYXhfZG93bndhcmRfbWVzc2FnZV9zaXplYC5sc3Vkb19lc3RhYmxpc2hfaHJtcF9jaGFubmVsEAEYc2VuZGVyjQIBGFBhcmFJZAABJHJlY2lwaWVudI0CARhQYXJhSWQAATBtYXhfY2FwYWNpdHkQAQx1MzIAAUBtYXhfbWVzc2FnZV9zaXplEAEMdTMyAAUQAQFGb3JjZWZ1bGx5IGVzdGFibGlzaCBhIGNoYW5uZWwgZnJvbSB0aGUgc2VuZGVyIHRvIHRoZSByZWNpcGllbnQuAFUBVGhpcyBpcyBlcXVpdmFsZW50IHRvIHNlbmRpbmcgYW4gYEhybXA6OmhybXBfaW5pdF9vcGVuX2NoYW5uZWxgIGV4dHJpbnNpYyBmb2xsb3dlZCBieYRgSHJtcDo6aHJtcF9hY2NlcHRfb3Blbl9jaGFubmVsYC4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMu/QYMbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucxRwYXJhczxQYXJhR2VuZXNpc0FyZ3MAAAwBMGdlbmVzaXNfaGVhZNkEASBIZWFkRGF0YQABPHZhbGlkYXRpb25fY29kZdUEAThWYWxpZGF0aW9uQ29kZQABJHBhcmFfa2luZCABIFBhcmFLaW5kAAABBwwscGFsbGV0X3N1ZG8YcGFsbGV0EENhbGwEBFQAARQQc3VkbwQBEGNhbGx1AQF8Qm94PDxUIGFzIENvbmZpZz46OlJ1bnRpbWVDYWxsPgAABDUBQXV0aGVudGljYXRlcyB0aGUgc3VkbyBrZXkgYW5kIGRpc3BhdGNoZXMgYSBmdW5jdGlvbiBjYWxsIHdpdGggYFJvb3RgIG9yaWdpbi5Uc3Vkb191bmNoZWNrZWRfd2VpZ2h0CAEQY2FsbHUBAXxCb3g8PFQgYXMgQ29uZmlnPjo6UnVudGltZUNhbGw+AAEYd2VpZ2h0KAEYV2VpZ2h0AAEUNQFBdXRoZW50aWNhdGVzIHRoZSBzdWRvIGtleSBhbmQgZGlzcGF0Y2hlcyBhIGZ1bmN0aW9uIGNhbGwgd2l0aCBgUm9vdGAgb3JpZ2luLi0BVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBjaGVjayB0aGUgd2VpZ2h0IG9mIHRoZSBjYWxsLCBhbmQgaW5zdGVhZCBhbGxvd3MgdGhlsFN1ZG8gdXNlciB0byBzcGVjaWZ5IHRoZSB3ZWlnaHQgb2YgdGhlIGNhbGwuAMxUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXy4cc2V0X2tleQQBDG5ld8UBAVBBY2NvdW50SWRMb29rdXBPZjxUPgACCF0BQXV0aGVudGljYXRlcyB0aGUgY3VycmVudCBzdWRvIGtleSBhbmQgc2V0cyB0aGUgZ2l2ZW4gQWNjb3VudElkIChgbmV3YCkgYXMgdGhlIG5ldyBzdWRvEGtleS4cc3Vkb19hcwgBDHdob8UBAVBBY2NvdW50SWRMb29rdXBPZjxUPgABEGNhbGx1AQF8Qm94PDxUIGFzIENvbmZpZz46OlJ1bnRpbWVDYWxsPgADEE0BQXV0aGVudGljYXRlcyB0aGUgc3VkbyBrZXkgYW5kIGRpc3BhdGNoZXMgYSBmdW5jdGlvbiBjYWxsIHdpdGggYFNpZ25lZGAgb3JpZ2luIGZyb21AYSBnaXZlbiBhY2NvdW50LgDMVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uKHJlbW92ZV9rZXkABAyEUGVybWFuZW50bHkgcmVtb3ZlcyB0aGUgc3VkbyBrZXkuAGwqKlRoaXMgY2Fubm90IGJlIHVuLWRvbmUuKioEDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMuBQcMKHNwX3J1bnRpbWUYdHJhaXRzLEJsYWtlVHdvMjU2AAAAAAkHDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBCARTAAAEADgBGFZlYzxUPgAADQcMYHBhbGxldF9jb252aWN0aW9uX3ZvdGluZxR0eXBlcxRUYWxseQgUVm90ZXMBGBRUb3RhbAAADAEQYXllcxgBFFZvdGVzAAEQbmF5cxgBFFZvdGVzAAEcc3VwcG9ydBgBFFZvdGVzAAARBwxAcGFsbGV0X3doaXRlbGlzdBhwYWxsZXQURXZlbnQEBFQAAQw8Q2FsbFdoaXRlbGlzdGVkBAEkY2FsbF9oYXNoNAEcVDo6SGFzaAAAAFhXaGl0ZWxpc3RlZENhbGxSZW1vdmVkBAEkY2FsbF9oYXNoNAEcVDo6SGFzaAABAGRXaGl0ZWxpc3RlZENhbGxEaXNwYXRjaGVkCAEkY2FsbF9oYXNoNAEcVDo6SGFzaAABGHJlc3VsdBUHAWhEaXNwYXRjaFJlc3VsdFdpdGhQb3N0SW5mbwACAAR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldBUHBBhSZXN1bHQIBFQBGQcERQEhBwEICE9rBAAZBwAAAAAMRXJyBAAhBwAAAQAAGQcMNGZyYW1lX3N1cHBvcnQgZGlzcGF0Y2hAUG9zdERpc3BhdGNoSW5mbwAACAE0YWN0dWFsX3dlaWdodB0HAThPcHRpb248V2VpZ2h0PgABIHBheXNfZmVlZAEQUGF5cwAAHQcEGE9wdGlvbgQEVAEoAQgQTm9uZQAAABBTb21lBAAoAAABAAAhBwgoc3BfcnVudGltZWREaXNwYXRjaEVycm9yV2l0aFBvc3RJbmZvBBBJbmZvARkHAAgBJHBvc3RfaW5mbxkHARBJbmZvAAEUZXJyb3JoATREaXNwYXRjaEVycm9yAAAlBwxEcGFsbGV0X3BhcmFtZXRlcnMYcGFsbGV0FEV2ZW50BARUAAEEHFVwZGF0ZWQMAQxrZXkpBwHEPFQ6OlJ1bnRpbWVQYXJhbWV0ZXJzIGFzIEFnZ3JlZ2F0ZWRLZXlWYWx1ZT46OktleQRkVGhlIGtleSB0aGF0IHdhcyB1cGRhdGVkLgEkb2xkX3ZhbHVlMQcB7E9wdGlvbjw8VDo6UnVudGltZVBhcmFtZXRlcnMgYXMgQWdncmVnYXRlZEtleVZhbHVlPjo6VmFsdWU+BHxUaGUgb2xkIHZhbHVlIGJlZm9yZSB0aGlzIGNhbGwuASRuZXdfdmFsdWUxBwHsT3B0aW9uPDxUOjpSdW50aW1lUGFyYW1ldGVycyBhcyBBZ2dyZWdhdGVkS2V5VmFsdWU+OjpWYWx1ZT4EeFRoZSBuZXcgdmFsdWUgYWZ0ZXIgdGhpcyBjYWxsLgAMUEEgUGFyYW1ldGVyIHdhcyBzZXQuALxJcyBhbHNvIGVtaXR0ZWQgd2hlbiB0aGUgdmFsdWUgd2FzIG5vdCBjaGFuZ2VkLgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldCkHCDRwYXNlb19ydW50aW1lUFJ1bnRpbWVQYXJhbWV0ZXJzS2V5AAEEJEluZmxhdGlvbgQALQcBqQE8ZHluYW1pY19wYXJhbXM6OmluZmxhdGlvbjo6UGFyYW1ldGVycyBhcyBmcmFtZV9zdXBwb3J0Ojp0cmFpdHM6OgpkeW5hbWljX3BhcmFtczo6QWdncmVnYXRlZEtleVZhbHVlPjo6S2V5AAAAAC0HEDRwYXNlb19ydW50aW1lOGR5bmFtaWNfcGFyYW1zJGluZmxhdGlvbjRQYXJhbWV0ZXJzS2V5AAEUME1pbkluZmxhdGlvbgQAsQIBME1pbkluZmxhdGlvbgAAADBNYXhJbmZsYXRpb24EAL0CATBNYXhJbmZsYXRpb24AAQAoSWRlYWxTdGFrZQQAwQIBKElkZWFsU3Rha2UAAgAcRmFsbG9mZgQAxQIBHEZhbGxvZmYAAwA8VXNlQXVjdGlvblNsb3RzBADJAgE8VXNlQXVjdGlvblNsb3RzAAQAADEHBBhPcHRpb24EBFQBNQcBCBBOb25lAAAAEFNvbWUEADUHAAABAAA1Bwg0cGFzZW9fcnVudGltZVhSdW50aW1lUGFyYW1ldGVyc1ZhbHVlAAEEJEluZmxhdGlvbgQAOQcBsQE8ZHluYW1pY19wYXJhbXM6OmluZmxhdGlvbjo6UGFyYW1ldGVycyBhcyBmcmFtZV9zdXBwb3J0Ojp0cmFpdHM6OgpkeW5hbWljX3BhcmFtczo6QWdncmVnYXRlZEtleVZhbHVlPjo6VmFsdWUAAAAAOQcQNHBhc2VvX3J1bnRpbWU4ZHluYW1pY19wYXJhbXMkaW5mbGF0aW9uPFBhcmFtZXRlcnNWYWx1ZQABFDBNaW5JbmZsYXRpb24EALkCASxQZXJxdWludGlsbAAAADBNYXhJbmZsYXRpb24EALkCASxQZXJxdWludGlsbAABAChJZGVhbFN0YWtlBAC5AgEsUGVycXVpbnRpbGwAAgAcRmFsbG9mZgQAuQIBLFBlcnF1aW50aWxsAAMAPFVzZUF1Y3Rpb25TbG90cwQAIAEQYm9vbAAEAAA9BxBccG9sa2Fkb3RfcnVudGltZV9jb21tb24YY2xhaW1zGHBhbGxldBRFdmVudAQEVAABBBxDbGFpbWVkDAEMd2hvAAEwVDo6QWNjb3VudElkAAFAZXRoZXJldW1fYWRkcmVzc90CATxFdGhlcmV1bUFkZHJlc3MAARhhbW91bnQYATBCYWxhbmNlT2Y8VD4AAARoU29tZW9uZSBjbGFpbWVkIHNvbWUgRE9Ucy4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXRBBww4cGFsbGV0X3Zlc3RpbmcYcGFsbGV0FEV2ZW50BARUAAEIOFZlc3RpbmdVcGRhdGVkCAEcYWNjb3VudAABMFQ6OkFjY291bnRJZAABIHVudmVzdGVkGAEwQmFsYW5jZU9mPFQ+AAAIUQFUaGUgYW1vdW50IHZlc3RlZCBoYXMgYmVlbiB1cGRhdGVkLiBUaGlzIGNvdWxkIGluZGljYXRlIGEgY2hhbmdlIGluIGZ1bmRzIGF2YWlsYWJsZS4lAVRoZSBiYWxhbmNlIGdpdmVuIGlzIHRoZSBhbW91bnQgd2hpY2ggaXMgbGVmdCB1bnZlc3RlZCAoYW5kIHRodXMgbG9ja2VkKS5AVmVzdGluZ0NvbXBsZXRlZAQBHGFjY291bnQAATBUOjpBY2NvdW50SWQAAQScQW4gXFthY2NvdW50XF0gaGFzIGJlY29tZSBmdWxseSB2ZXN0ZWQuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0RQcMOHBhbGxldF91dGlsaXR5GHBhbGxldBRFdmVudAABGEBCYXRjaEludGVycnVwdGVkCAEUaW5kZXgQAQx1MzIAARRlcnJvcmgBNERpc3BhdGNoRXJyb3IAAAhVAUJhdGNoIG9mIGRpc3BhdGNoZXMgZGlkIG5vdCBjb21wbGV0ZSBmdWxseS4gSW5kZXggb2YgZmlyc3QgZmFpbGluZyBkaXNwYXRjaCBnaXZlbiwgYXNId2VsbCBhcyB0aGUgZXJyb3IuOEJhdGNoQ29tcGxldGVkAAEEyEJhdGNoIG9mIGRpc3BhdGNoZXMgY29tcGxldGVkIGZ1bGx5IHdpdGggbm8gZXJyb3IuYEJhdGNoQ29tcGxldGVkV2l0aEVycm9ycwACBLRCYXRjaCBvZiBkaXNwYXRjaGVzIGNvbXBsZXRlZCBidXQgaGFzIGVycm9ycy40SXRlbUNvbXBsZXRlZAADBB0BQSBzaW5nbGUgaXRlbSB3aXRoaW4gYSBCYXRjaCBvZiBkaXNwYXRjaGVzIGhhcyBjb21wbGV0ZWQgd2l0aCBubyBlcnJvci4oSXRlbUZhaWxlZAQBFGVycm9yaAE0RGlzcGF0Y2hFcnJvcgAEBBEBQSBzaW5nbGUgaXRlbSB3aXRoaW4gYSBCYXRjaCBvZiBkaXNwYXRjaGVzIGhhcyBjb21wbGV0ZWQgd2l0aCBlcnJvci4wRGlzcGF0Y2hlZEFzBAEYcmVzdWx0iAE4RGlzcGF0Y2hSZXN1bHQABQRYQSBjYWxsIHdhcyBkaXNwYXRjaGVkLgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldEkHDDBwYWxsZXRfcHJveHkYcGFsbGV0FEV2ZW50BARUAAEUNFByb3h5RXhlY3V0ZWQEARhyZXN1bHSIAThEaXNwYXRjaFJlc3VsdAAABLxBIHByb3h5IHdhcyBleGVjdXRlZCBjb3JyZWN0bHksIHdpdGggdGhlIGdpdmVuLixQdXJlQ3JlYXRlZBABEHB1cmUAATBUOjpBY2NvdW50SWQAAQx3aG8AATBUOjpBY2NvdW50SWQAAShwcm94eV90eXBlCQMBMFQ6OlByb3h5VHlwZQABUGRpc2FtYmlndWF0aW9uX2luZGV4bQEBDHUxNgABCNxBIHB1cmUgYWNjb3VudCBoYXMgYmVlbiBjcmVhdGVkIGJ5IG5ldyBwcm94eSB3aXRoIGdpdmVukGRpc2FtYmlndWF0aW9uIGluZGV4IGFuZCBwcm94eSB0eXBlLiRBbm5vdW5jZWQMARByZWFsAAEwVDo6QWNjb3VudElkAAEUcHJveHkAATBUOjpBY2NvdW50SWQAASRjYWxsX2hhc2g0ATRDYWxsSGFzaE9mPFQ+AAIE4EFuIGFubm91bmNlbWVudCB3YXMgcGxhY2VkIHRvIG1ha2UgYSBjYWxsIGluIHRoZSBmdXR1cmUuKFByb3h5QWRkZWQQASRkZWxlZ2F0b3IAATBUOjpBY2NvdW50SWQAASRkZWxlZ2F0ZWUAATBUOjpBY2NvdW50SWQAAShwcm94eV90eXBlCQMBMFQ6OlByb3h5VHlwZQABFGRlbGF5EAFEQmxvY2tOdW1iZXJGb3I8VD4AAwRIQSBwcm94eSB3YXMgYWRkZWQuMFByb3h5UmVtb3ZlZBABJGRlbGVnYXRvcgABMFQ6OkFjY291bnRJZAABJGRlbGVnYXRlZQABMFQ6OkFjY291bnRJZAABKHByb3h5X3R5cGUJAwEwVDo6UHJveHlUeXBlAAEUZGVsYXkQAURCbG9ja051bWJlckZvcjxUPgAEBFBBIHByb3h5IHdhcyByZW1vdmVkLgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldE0HDDxwYWxsZXRfbXVsdGlzaWcYcGFsbGV0FEV2ZW50BARUAAEQLE5ld011bHRpc2lnDAEkYXBwcm92aW5nAAEwVDo6QWNjb3VudElkAAEgbXVsdGlzaWcAATBUOjpBY2NvdW50SWQAASRjYWxsX2hhc2gEASBDYWxsSGFzaAAABIxBIG5ldyBtdWx0aXNpZyBvcGVyYXRpb24gaGFzIGJlZ3VuLkBNdWx0aXNpZ0FwcHJvdmFsEAEkYXBwcm92aW5nAAEwVDo6QWNjb3VudElkAAEkdGltZXBvaW50FQMBcFRpbWVwb2ludDxCbG9ja051bWJlckZvcjxUPj4AASBtdWx0aXNpZwABMFQ6OkFjY291bnRJZAABJGNhbGxfaGFzaAQBIENhbGxIYXNoAAEEyEEgbXVsdGlzaWcgb3BlcmF0aW9uIGhhcyBiZWVuIGFwcHJvdmVkIGJ5IHNvbWVvbmUuQE11bHRpc2lnRXhlY3V0ZWQUASRhcHByb3ZpbmcAATBUOjpBY2NvdW50SWQAASR0aW1lcG9pbnQVAwFwVGltZXBvaW50PEJsb2NrTnVtYmVyRm9yPFQ+PgABIG11bHRpc2lnAAEwVDo6QWNjb3VudElkAAEkY2FsbF9oYXNoBAEgQ2FsbEhhc2gAARhyZXN1bHSIAThEaXNwYXRjaFJlc3VsdAACBJxBIG11bHRpc2lnIG9wZXJhdGlvbiBoYXMgYmVlbiBleGVjdXRlZC5ETXVsdGlzaWdDYW5jZWxsZWQQAShjYW5jZWxsaW5nAAEwVDo6QWNjb3VudElkAAEkdGltZXBvaW50FQMBcFRpbWVwb2ludDxCbG9ja051bWJlckZvcjxUPj4AASBtdWx0aXNpZwABMFQ6OkFjY291bnRJZAABJGNhbGxfaGFzaAQBIENhbGxIYXNoAAMEoEEgbXVsdGlzaWcgb3BlcmF0aW9uIGhhcyBiZWVuIGNhbmNlbGxlZC4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXRRBww8cGFsbGV0X2JvdW50aWVzGHBhbGxldBRFdmVudAgEVAAESQABLDhCb3VudHlQcm9wb3NlZAQBFGluZGV4EAEsQm91bnR5SW5kZXgAAARQTmV3IGJvdW50eSBwcm9wb3NhbC44Qm91bnR5UmVqZWN0ZWQIARRpbmRleBABLEJvdW50eUluZGV4AAEQYm9uZBgBPEJhbGFuY2VPZjxULCBJPgABBMxBIGJvdW50eSBwcm9wb3NhbCB3YXMgcmVqZWN0ZWQ7IGZ1bmRzIHdlcmUgc2xhc2hlZC5IQm91bnR5QmVjYW1lQWN0aXZlBAEUaW5kZXgQASxCb3VudHlJbmRleAACBLhBIGJvdW50eSBwcm9wb3NhbCBpcyBmdW5kZWQgYW5kIGJlY2FtZSBhY3RpdmUuNEJvdW50eUF3YXJkZWQIARRpbmRleBABLEJvdW50eUluZGV4AAEsYmVuZWZpY2lhcnkAATBUOjpBY2NvdW50SWQAAwSUQSBib3VudHkgaXMgYXdhcmRlZCB0byBhIGJlbmVmaWNpYXJ5LjRCb3VudHlDbGFpbWVkDAEUaW5kZXgQASxCb3VudHlJbmRleAABGHBheW91dBgBPEJhbGFuY2VPZjxULCBJPgABLGJlbmVmaWNpYXJ5AAEwVDo6QWNjb3VudElkAAQEjEEgYm91bnR5IGlzIGNsYWltZWQgYnkgYmVuZWZpY2lhcnkuOEJvdW50eUNhbmNlbGVkBAEUaW5kZXgQASxCb3VudHlJbmRleAAFBFhBIGJvdW50eSBpcyBjYW5jZWxsZWQuOEJvdW50eUV4dGVuZGVkBAEUaW5kZXgQASxCb3VudHlJbmRleAAGBHBBIGJvdW50eSBleHBpcnkgaXMgZXh0ZW5kZWQuOEJvdW50eUFwcHJvdmVkBAEUaW5kZXgQASxCb3VudHlJbmRleAAHBFRBIGJvdW50eSBpcyBhcHByb3ZlZC48Q3VyYXRvclByb3Bvc2VkCAEkYm91bnR5X2lkEAEsQm91bnR5SW5kZXgAARxjdXJhdG9yAAEwVDo6QWNjb3VudElkAAgEdEEgYm91bnR5IGN1cmF0b3IgaXMgcHJvcG9zZWQuREN1cmF0b3JVbmFzc2lnbmVkBAEkYm91bnR5X2lkEAEsQm91bnR5SW5kZXgACQR8QSBib3VudHkgY3VyYXRvciBpcyB1bmFzc2lnbmVkLjxDdXJhdG9yQWNjZXB0ZWQIASRib3VudHlfaWQQASxCb3VudHlJbmRleAABHGN1cmF0b3IAATBUOjpBY2NvdW50SWQACgR0QSBib3VudHkgY3VyYXRvciBpcyBhY2NlcHRlZC4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXRVBwxUcGFsbGV0X2NoaWxkX2JvdW50aWVzGHBhbGxldBRFdmVudAQEVAABEBRBZGRlZAgBFGluZGV4EAEsQm91bnR5SW5kZXgAASxjaGlsZF9pbmRleBABLEJvdW50eUluZGV4AAAEYEEgY2hpbGQtYm91bnR5IGlzIGFkZGVkLhxBd2FyZGVkDAEUaW5kZXgQASxCb3VudHlJbmRleAABLGNoaWxkX2luZGV4EAEsQm91bnR5SW5kZXgAASxiZW5lZmljaWFyeQABMFQ6OkFjY291bnRJZAABBKxBIGNoaWxkLWJvdW50eSBpcyBhd2FyZGVkIHRvIGEgYmVuZWZpY2lhcnkuHENsYWltZWQQARRpbmRleBABLEJvdW50eUluZGV4AAEsY2hpbGRfaW5kZXgQASxCb3VudHlJbmRleAABGHBheW91dBgBMEJhbGFuY2VPZjxUPgABLGJlbmVmaWNpYXJ5AAEwVDo6QWNjb3VudElkAAIEpEEgY2hpbGQtYm91bnR5IGlzIGNsYWltZWQgYnkgYmVuZWZpY2lhcnkuIENhbmNlbGVkCAEUaW5kZXgQASxCb3VudHlJbmRleAABLGNoaWxkX2luZGV4EAEsQm91bnR5SW5kZXgAAwRwQSBjaGlsZC1ib3VudHkgaXMgY2FuY2VsbGVkLgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldFkHDJBwYWxsZXRfZWxlY3Rpb25fcHJvdmlkZXJfbXVsdGlfcGhhc2UYcGFsbGV0FEV2ZW50BARUAAEYOFNvbHV0aW9uU3RvcmVkDAEcY29tcHV0ZV0HATxFbGVjdGlvbkNvbXB1dGUAARhvcmlnaW79AQFQT3B0aW9uPFQ6OkFjY291bnRJZD4AATBwcmV2X2VqZWN0ZWQgARBib29sAAActEEgc29sdXRpb24gd2FzIHN0b3JlZCB3aXRoIHRoZSBnaXZlbiBjb21wdXRlLgBRAVRoZSBgb3JpZ2luYCBpbmRpY2F0ZXMgdGhlIG9yaWdpbiBvZiB0aGUgc29sdXRpb24uIElmIGBvcmlnaW5gIGlzIGBTb21lKEFjY291bnRJZClgLFkBdGhlIHN0b3JlZCBzb2x1dGlvbiB3YXMgc3VibWl0dGVkIGluIHRoZSBzaWduZWQgcGhhc2UgYnkgYSBtaW5lciB3aXRoIHRoZSBgQWNjb3VudElkYC4lAU90aGVyd2lzZSwgdGhlIHNvbHV0aW9uIHdhcyBzdG9yZWQgZWl0aGVyIGR1cmluZyB0aGUgdW5zaWduZWQgcGhhc2Ugb3IgYnlNAWBUOjpGb3JjZU9yaWdpbmAuIFRoZSBgYm9vbGAgaXMgYHRydWVgIHdoZW4gYSBwcmV2aW91cyBzb2x1dGlvbiB3YXMgZWplY3RlZCB0byBtYWtlSHJvb20gZm9yIHRoaXMgb25lLkRFbGVjdGlvbkZpbmFsaXplZAgBHGNvbXB1dGVdBwE8RWxlY3Rpb25Db21wdXRlAAEUc2NvcmX1AwE0RWxlY3Rpb25TY29yZQABBBkBVGhlIGVsZWN0aW9uIGhhcyBiZWVuIGZpbmFsaXplZCwgd2l0aCB0aGUgZ2l2ZW4gY29tcHV0YXRpb24gYW5kIHNjb3JlLjhFbGVjdGlvbkZhaWxlZAACDExBbiBlbGVjdGlvbiBmYWlsZWQuAAEBTm90IG11Y2ggY2FuIGJlIHNhaWQgYWJvdXQgd2hpY2ggY29tcHV0ZXMgZmFpbGVkIGluIHRoZSBwcm9jZXNzLiBSZXdhcmRlZAgBHGFjY291bnQAAZg8VCBhcyBmcmFtZV9zeXN0ZW06OkNvbmZpZz46OkFjY291bnRJZAABFHZhbHVlGAEwQmFsYW5jZU9mPFQ+AAMEJQFBbiBhY2NvdW50IGhhcyBiZWVuIHJld2FyZGVkIGZvciB0aGVpciBzaWduZWQgc3VibWlzc2lvbiBiZWluZyBmaW5hbGl6ZWQuHFNsYXNoZWQIARxhY2NvdW50AAGYPFQgYXMgZnJhbWVfc3lzdGVtOjpDb25maWc+OjpBY2NvdW50SWQAARR2YWx1ZRgBMEJhbGFuY2VPZjxUPgAEBCEBQW4gYWNjb3VudCBoYXMgYmVlbiBzbGFzaGVkIGZvciBzdWJtaXR0aW5nIGFuIGludmFsaWQgc2lnbmVkIHN1Ym1pc3Npb24uRFBoYXNlVHJhbnNpdGlvbmVkDAEQZnJvbWEHAWBQaGFzZTxCbG9ja051bWJlckZvcjxUPj4AAQh0b2EHAWBQaGFzZTxCbG9ja051bWJlckZvcjxUPj4AARRyb3VuZBABDHUzMgAFBLhUaGVyZSB3YXMgYSBwaGFzZSB0cmFuc2l0aW9uIGluIGEgZ2l2ZW4gcm91bmQuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0XQcIkHBhbGxldF9lbGVjdGlvbl9wcm92aWRlcl9tdWx0aV9waGFzZTxFbGVjdGlvbkNvbXB1dGUAARQcT25DaGFpbgAAABhTaWduZWQAAQAgVW5zaWduZWQAAgAgRmFsbGJhY2sAAwAkRW1lcmdlbmN5AAQAAGEHCJBwYWxsZXRfZWxlY3Rpb25fcHJvdmlkZXJfbXVsdGlfcGhhc2UUUGhhc2UECEJuARABEAxPZmYAAAAYU2lnbmVkAAEAIFVuc2lnbmVkBABlBwEoKGJvb2wsIEJuKQACACRFbWVyZ2VuY3kAAwAAZQcAAAQIIBAAaQcMQHBhbGxldF9iYWdzX2xpc3QYcGFsbGV0FEV2ZW50CARUAARJAAEIIFJlYmFnZ2VkDAEMd2hvAAEwVDo6QWNjb3VudElkAAEQZnJvbTABIFQ6OlNjb3JlAAEIdG8wASBUOjpTY29yZQAABKRNb3ZlZCBhbiBhY2NvdW50IGZyb20gb25lIGJhZyB0byBhbm90aGVyLjBTY29yZVVwZGF0ZWQIAQx3aG8AATBUOjpBY2NvdW50SWQAASRuZXdfc2NvcmUwASBUOjpTY29yZQABBNhVcGRhdGVkIHRoZSBzY29yZSBvZiBzb21lIGFjY291bnQgdG8gdGhlIGdpdmVuIGFtb3VudC4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXRtBwxccGFsbGV0X25vbWluYXRpb25fcG9vbHMYcGFsbGV0FEV2ZW50BARUAAFIHENyZWF0ZWQIASRkZXBvc2l0b3IAATBUOjpBY2NvdW50SWQAARxwb29sX2lkEAEYUG9vbElkAAAEYEEgcG9vbCBoYXMgYmVlbiBjcmVhdGVkLhhCb25kZWQQARhtZW1iZXIAATBUOjpBY2NvdW50SWQAARxwb29sX2lkEAEYUG9vbElkAAEYYm9uZGVkGAEwQmFsYW5jZU9mPFQ+AAEYam9pbmVkIAEQYm9vbAABBJRBIG1lbWJlciBoYXMgYmVjYW1lIGJvbmRlZCBpbiBhIHBvb2wuHFBhaWRPdXQMARhtZW1iZXIAATBUOjpBY2NvdW50SWQAARxwb29sX2lkEAEYUG9vbElkAAEYcGF5b3V0GAEwQmFsYW5jZU9mPFQ+AAIEjEEgcGF5b3V0IGhhcyBiZWVuIG1hZGUgdG8gYSBtZW1iZXIuIFVuYm9uZGVkFAEYbWVtYmVyAAEwVDo6QWNjb3VudElkAAEccG9vbF9pZBABGFBvb2xJZAABHGJhbGFuY2UYATBCYWxhbmNlT2Y8VD4AARhwb2ludHMYATBCYWxhbmNlT2Y8VD4AAQxlcmEQASBFcmFJbmRleAADLJhBIG1lbWJlciBoYXMgdW5ib25kZWQgZnJvbSB0aGVpciBwb29sLgA5AS0gYGJhbGFuY2VgIGlzIHRoZSBjb3JyZXNwb25kaW5nIGJhbGFuY2Ugb2YgdGhlIG51bWJlciBvZiBwb2ludHMgdGhhdCBoYXMgYmVlblUBICByZXF1ZXN0ZWQgdG8gYmUgdW5ib25kZWQgKHRoZSBhcmd1bWVudCBvZiB0aGUgYHVuYm9uZGAgdHJhbnNhY3Rpb24pIGZyb20gdGhlIGJvbmRlZBwgIHBvb2wuRQEtIGBwb2ludHNgIGlzIHRoZSBudW1iZXIgb2YgcG9pbnRzIHRoYXQgYXJlIGlzc3VlZCBhcyBhIHJlc3VsdCBvZiBgYmFsYW5jZWAgYmVpbmfAZGlzc29sdmVkIGludG8gdGhlIGNvcnJlc3BvbmRpbmcgdW5ib25kaW5nIHBvb2wu5C0gYGVyYWAgaXMgdGhlIGVyYSBpbiB3aGljaCB0aGUgYmFsYW5jZSB3aWxsIGJlIHVuYm9uZGVkLlUBSW4gdGhlIGFic2VuY2Ugb2Ygc2xhc2hpbmcsIHRoZXNlIHZhbHVlcyB3aWxsIG1hdGNoLiBJbiB0aGUgcHJlc2VuY2Ugb2Ygc2xhc2hpbmcsIHRoZU0BbnVtYmVyIG9mIHBvaW50cyB0aGF0IGFyZSBpc3N1ZWQgaW4gdGhlIHVuYm9uZGluZyBwb29sIHdpbGwgYmUgbGVzcyB0aGFuIHRoZSBhbW91bnRkcmVxdWVzdGVkIHRvIGJlIHVuYm9uZGVkLiRXaXRoZHJhd24QARhtZW1iZXIAATBUOjpBY2NvdW50SWQAARxwb29sX2lkEAEYUG9vbElkAAEcYmFsYW5jZRgBMEJhbGFuY2VPZjxUPgABGHBvaW50cxgBMEJhbGFuY2VPZjxUPgAEGJxBIG1lbWJlciBoYXMgd2l0aGRyYXduIGZyb20gdGhlaXIgcG9vbC4AIQFUaGUgZ2l2ZW4gbnVtYmVyIG9mIGBwb2ludHNgIGhhdmUgYmVlbiBkaXNzb2x2ZWQgaW4gcmV0dXJuIG9mIGBiYWxhbmNlYC4AWQFTaW1pbGFyIHRvIGBVbmJvbmRlZGAgZXZlbnQsIGluIHRoZSBhYnNlbmNlIG9mIHNsYXNoaW5nLCB0aGUgcmF0aW8gb2YgcG9pbnQgdG8gYmFsYW5jZSh3aWxsIGJlIDEuJERlc3Ryb3llZAQBHHBvb2xfaWQQARhQb29sSWQABQRoQSBwb29sIGhhcyBiZWVuIGRlc3Ryb3llZC4wU3RhdGVDaGFuZ2VkCAEccG9vbF9pZBABGFBvb2xJZAABJG5ld19zdGF0ZSEEASRQb29sU3RhdGUABgR8VGhlIHN0YXRlIG9mIGEgcG9vbCBoYXMgY2hhbmdlZDRNZW1iZXJSZW1vdmVkCAEccG9vbF9pZBABGFBvb2xJZAABGG1lbWJlcgABMFQ6OkFjY291bnRJZAAHDJhBIG1lbWJlciBoYXMgYmVlbiByZW1vdmVkIGZyb20gYSBwb29sLgBRAVRoZSByZW1vdmFsIGNhbiBiZSB2b2x1bnRhcnkgKHdpdGhkcmF3biBhbGwgdW5ib25kZWQgZnVuZHMpIG9yIGludm9sdW50YXJ5IChraWNrZWQpLjBSb2xlc1VwZGF0ZWQMARByb290/QEBUE9wdGlvbjxUOjpBY2NvdW50SWQ+AAEcYm91bmNlcv0BAVBPcHRpb248VDo6QWNjb3VudElkPgABJG5vbWluYXRvcv0BAVBPcHRpb248VDo6QWNjb3VudElkPgAICFUBVGhlIHJvbGVzIG9mIGEgcG9vbCBoYXZlIGJlZW4gdXBkYXRlZCB0byB0aGUgZ2l2ZW4gbmV3IHJvbGVzLiBOb3RlIHRoYXQgdGhlIGRlcG9zaXRvckRjYW4gbmV2ZXIgY2hhbmdlLixQb29sU2xhc2hlZAgBHHBvb2xfaWQQARhQb29sSWQAARxiYWxhbmNlGAEwQmFsYW5jZU9mPFQ+AAkEDQFUaGUgYWN0aXZlIGJhbGFuY2Ugb2YgcG9vbCBgcG9vbF9pZGAgaGFzIGJlZW4gc2xhc2hlZCB0byBgYmFsYW5jZWAuUFVuYm9uZGluZ1Bvb2xTbGFzaGVkDAEccG9vbF9pZBABGFBvb2xJZAABDGVyYRABIEVyYUluZGV4AAEcYmFsYW5jZRgBMEJhbGFuY2VPZjxUPgAKBCUBVGhlIHVuYm9uZCBwb29sIGF0IGBlcmFgIG9mIHBvb2wgYHBvb2xfaWRgIGhhcyBiZWVuIHNsYXNoZWQgdG8gYGJhbGFuY2VgLlRQb29sQ29tbWlzc2lvblVwZGF0ZWQIARxwb29sX2lkEAEYUG9vbElkAAEcY3VycmVudDkEAXxPcHRpb248KFBlcmJpbGwsIFQ6OkFjY291bnRJZCk+AAsEtEEgcG9vbCdzIGNvbW1pc3Npb24gc2V0dGluZyBoYXMgYmVlbiBjaGFuZ2VkLmBQb29sTWF4Q29tbWlzc2lvblVwZGF0ZWQIARxwb29sX2lkEAEYUG9vbElkAAE4bWF4X2NvbW1pc3Npb26sARxQZXJiaWxsAAwE1EEgcG9vbCdzIG1heGltdW0gY29tbWlzc2lvbiBzZXR0aW5nIGhhcyBiZWVuIGNoYW5nZWQufFBvb2xDb21taXNzaW9uQ2hhbmdlUmF0ZVVwZGF0ZWQIARxwb29sX2lkEAEYUG9vbElkAAEsY2hhbmdlX3JhdGVBBAGcQ29tbWlzc2lvbkNoYW5nZVJhdGU8QmxvY2tOdW1iZXJGb3I8VD4+AA0EzEEgcG9vbCdzIGNvbW1pc3Npb24gYGNoYW5nZV9yYXRlYCBoYXMgYmVlbiBjaGFuZ2VkLpBQb29sQ29tbWlzc2lvbkNsYWltUGVybWlzc2lvblVwZGF0ZWQIARxwb29sX2lkEAEYUG9vbElkAAEocGVybWlzc2lvbkUEAbxPcHRpb248Q29tbWlzc2lvbkNsYWltUGVybWlzc2lvbjxUOjpBY2NvdW50SWQ+PgAOBMhQb29sIGNvbW1pc3Npb24gY2xhaW0gcGVybWlzc2lvbiBoYXMgYmVlbiB1cGRhdGVkLlRQb29sQ29tbWlzc2lvbkNsYWltZWQIARxwb29sX2lkEAEYUG9vbElkAAEoY29tbWlzc2lvbhgBMEJhbGFuY2VPZjxUPgAPBIRQb29sIGNvbW1pc3Npb24gaGFzIGJlZW4gY2xhaW1lZC5kTWluQmFsYW5jZURlZmljaXRBZGp1c3RlZAgBHHBvb2xfaWQQARhQb29sSWQAARhhbW91bnQYATBCYWxhbmNlT2Y8VD4AEATIVG9wcGVkIHVwIGRlZmljaXQgaW4gZnJvemVuIEVEIG9mIHRoZSByZXdhcmQgcG9vbC5gTWluQmFsYW5jZUV4Y2Vzc0FkanVzdGVkCAEccG9vbF9pZBABGFBvb2xJZAABGGFtb3VudBgBMEJhbGFuY2VPZjxUPgARBLxDbGFpbWVkIGV4Y2VzcyBmcm96ZW4gRUQgb2YgYWYgdGhlIHJld2FyZCBwb29sLgRYRXZlbnRzIG9mIHRoaXMgcGFsbGV0LnEHDExwYWxsZXRfZmFzdF91bnN0YWtlGHBhbGxldBRFdmVudAQEVAABFCBVbnN0YWtlZAgBFHN0YXNoAAEwVDo6QWNjb3VudElkAAEYcmVzdWx0iAE4RGlzcGF0Y2hSZXN1bHQAAARYQSBzdGFrZXIgd2FzIHVuc3Rha2VkLhxTbGFzaGVkCAEUc3Rhc2gAATBUOjpBY2NvdW50SWQAARhhbW91bnQYATBCYWxhbmNlT2Y8VD4AAQQZAUEgc3Rha2VyIHdhcyBzbGFzaGVkIGZvciByZXF1ZXN0aW5nIGZhc3QtdW5zdGFrZSB3aGlsc3QgYmVpbmcgZXhwb3NlZC4wQmF0Y2hDaGVja2VkBAEQZXJhc+UBATRWZWM8RXJhSW5kZXg+AAIERQFBIGJhdGNoIHdhcyBwYXJ0aWFsbHkgY2hlY2tlZCBmb3IgdGhlIGdpdmVuIGVyYXMsIGJ1dCB0aGUgcHJvY2VzcyBkaWQgbm90IGZpbmlzaC40QmF0Y2hGaW5pc2hlZAQBEHNpemUQAQx1MzIAAxCcQSBiYXRjaCBvZiBhIGdpdmVuIHNpemUgd2FzIHRlcm1pbmF0ZWQuAFUBVGhpcyBpcyBhbHdheXMgZm9sbG93cyBieSBhIG51bWJlciBvZiBgVW5zdGFrZWRgIG9yIGBTbGFzaGVkYCBldmVudHMsIG1hcmtpbmcgdGhlIGVuZOhvZiB0aGUgYmF0Y2guIEEgbmV3IGJhdGNoIHdpbGwgYmUgY3JlYXRlZCB1cG9uIG5leHQgYmxvY2suNEludGVybmFsRXJyb3IABAToQW4gaW50ZXJuYWwgZXJyb3IgaGFwcGVuZWQuIE9wZXJhdGlvbnMgd2lsbCBiZSBwYXVzZWQgbm93LgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldHUHEGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMkaW5jbHVzaW9uGHBhbGxldBRFdmVudAQEVAABEDxDYW5kaWRhdGVCYWNrZWQQAHkHAWRDYW5kaWRhdGVSZWNlaXB0PFQ6Okhhc2g+AADZBAEgSGVhZERhdGEAAH0HASRDb3JlSW5kZXgAAIEHAShHcm91cEluZGV4AAAEwEEgY2FuZGlkYXRlIHdhcyBiYWNrZWQuIGBbY2FuZGlkYXRlLCBoZWFkX2RhdGFdYERDYW5kaWRhdGVJbmNsdWRlZBAAeQcBZENhbmRpZGF0ZVJlY2VpcHQ8VDo6SGFzaD4AANkEASBIZWFkRGF0YQAAfQcBJENvcmVJbmRleAAAgQcBKEdyb3VwSW5kZXgAAQTIQSBjYW5kaWRhdGUgd2FzIGluY2x1ZGVkLiBgW2NhbmRpZGF0ZSwgaGVhZF9kYXRhXWBEQ2FuZGlkYXRlVGltZWRPdXQMAHkHAWRDYW5kaWRhdGVSZWNlaXB0PFQ6Okhhc2g+AADZBAEgSGVhZERhdGEAAH0HASRDb3JlSW5kZXgAAgS8QSBjYW5kaWRhdGUgdGltZWQgb3V0LiBgW2NhbmRpZGF0ZSwgaGVhZF9kYXRhXWBYVXB3YXJkTWVzc2FnZXNSZWNlaXZlZAgBEGZyb22NAgEYUGFyYUlkAAEUY291bnQQAQx1MzIAAwT4U29tZSB1cHdhcmQgbWVzc2FnZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIGFuZCB3aWxsIGJlIHByb2Nlc3NlZC4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXR5BwxMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2N0BDYW5kaWRhdGVSZWNlaXB0BARIATQACAEoZGVzY3JpcHRvcq0EAVhDYW5kaWRhdGVEZXNjcmlwdG9yPEg+AAFAY29tbWl0bWVudHNfaGFzaDQBEEhhc2gAAH0HDExwb2xrYWRvdF9wcmltaXRpdmVzCHY3JENvcmVJbmRleAAABAAQAQx1MzIAAIEHDExwb2xrYWRvdF9wcmltaXRpdmVzCHY3KEdyb3VwSW5kZXgAAAQAEAEMdTMyAACFBxBscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zFHBhcmFzGHBhbGxldBRFdmVudAABIEhDdXJyZW50Q29kZVVwZGF0ZWQEAI0CARhQYXJhSWQAAATMQ3VycmVudCBjb2RlIGhhcyBiZWVuIHVwZGF0ZWQgZm9yIGEgUGFyYS4gYHBhcmFfaWRgSEN1cnJlbnRIZWFkVXBkYXRlZAQAjQIBGFBhcmFJZAABBMxDdXJyZW50IGhlYWQgaGFzIGJlZW4gdXBkYXRlZCBmb3IgYSBQYXJhLiBgcGFyYV9pZGBQQ29kZVVwZ3JhZGVTY2hlZHVsZWQEAI0CARhQYXJhSWQAAgTcQSBjb2RlIHVwZ3JhZGUgaGFzIGJlZW4gc2NoZWR1bGVkIGZvciBhIFBhcmEuIGBwYXJhX2lkYDBOZXdIZWFkTm90ZWQEAI0CARhQYXJhSWQAAwS8QSBuZXcgaGVhZCBoYXMgYmVlbiBub3RlZCBmb3IgYSBQYXJhLiBgcGFyYV9pZGAwQWN0aW9uUXVldWVkCACNAgEYUGFyYUlkAAAQATBTZXNzaW9uSW5kZXgABATwQSBwYXJhIGhhcyBiZWVuIHF1ZXVlZCB0byBleGVjdXRlIHBlbmRpbmcgYWN0aW9ucy4gYHBhcmFfaWRgPFB2ZkNoZWNrU3RhcnRlZAgAuQQBSFZhbGlkYXRpb25Db2RlSGFzaAAAjQIBGFBhcmFJZAAFCFUBVGhlIGdpdmVuIHBhcmEgZWl0aGVyIGluaXRpYXRlZCBvciBzdWJzY3JpYmVkIHRvIGEgUFZGIGNoZWNrIGZvciB0aGUgZ2l2ZW4gdmFsaWRhdGlvbmxjb2RlLiBgY29kZV9oYXNoYCBgcGFyYV9pZGBAUHZmQ2hlY2tBY2NlcHRlZAgAuQQBSFZhbGlkYXRpb25Db2RlSGFzaAAAjQIBGFBhcmFJZAAGCBEBVGhlIGdpdmVuIHZhbGlkYXRpb24gY29kZSB3YXMgYWNjZXB0ZWQgYnkgdGhlIFBWRiBwcmUtY2hlY2tpbmcgdm90ZS5UYGNvZGVfaGFzaGAgYHBhcmFfaWRgQFB2ZkNoZWNrUmVqZWN0ZWQIALkEAUhWYWxpZGF0aW9uQ29kZUhhc2gAAI0CARhQYXJhSWQABwgRAVRoZSBnaXZlbiB2YWxpZGF0aW9uIGNvZGUgd2FzIHJlamVjdGVkIGJ5IHRoZSBQVkYgcHJlLWNoZWNraW5nIHZvdGUuVGBjb2RlX2hhc2hgIGBwYXJhX2lkYAR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldIkHEGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMQaHJtcBhwYWxsZXQURXZlbnQEBFQAARxQT3BlbkNoYW5uZWxSZXF1ZXN0ZWQQARhzZW5kZXKNAgEYUGFyYUlkAAEkcmVjaXBpZW50jQIBGFBhcmFJZAABVHByb3Bvc2VkX21heF9jYXBhY2l0eRABDHUzMgABZHByb3Bvc2VkX21heF9tZXNzYWdlX3NpemUQAQx1MzIAAARwT3BlbiBIUk1QIGNoYW5uZWwgcmVxdWVzdGVkLkxPcGVuQ2hhbm5lbENhbmNlbGVkCAEwYnlfcGFyYWNoYWlujQIBGFBhcmFJZAABKGNoYW5uZWxfaWQZBQE0SHJtcENoYW5uZWxJZAABBCkBQW4gSFJNUCBjaGFubmVsIHJlcXVlc3Qgc2VudCBieSB0aGUgcmVjZWl2ZXIgd2FzIGNhbmNlbGVkIGJ5IGVpdGhlciBwYXJ0eS5MT3BlbkNoYW5uZWxBY2NlcHRlZAgBGHNlbmRlco0CARhQYXJhSWQAASRyZWNpcGllbnSNAgEYUGFyYUlkAAIEbE9wZW4gSFJNUCBjaGFubmVsIGFjY2VwdGVkLjRDaGFubmVsQ2xvc2VkCAEwYnlfcGFyYWNoYWlujQIBGFBhcmFJZAABKGNoYW5uZWxfaWQZBQE0SHJtcENoYW5uZWxJZAADBFBIUk1QIGNoYW5uZWwgY2xvc2VkLlhIcm1wQ2hhbm5lbEZvcmNlT3BlbmVkEAEYc2VuZGVyjQIBGFBhcmFJZAABJHJlY2lwaWVudI0CARhQYXJhSWQAAVRwcm9wb3NlZF9tYXhfY2FwYWNpdHkQAQx1MzIAAWRwcm9wb3NlZF9tYXhfbWVzc2FnZV9zaXplEAEMdTMyAAQErEFuIEhSTVAgY2hhbm5lbCB3YXMgb3BlbmVkIHZpYSBSb290IG9yaWdpbi5cSHJtcFN5c3RlbUNoYW5uZWxPcGVuZWQQARhzZW5kZXKNAgEYUGFyYUlkAAEkcmVjaXBpZW50jQIBGFBhcmFJZAABVHByb3Bvc2VkX21heF9jYXBhY2l0eRABDHUzMgABZHByb3Bvc2VkX21heF9tZXNzYWdlX3NpemUQAQx1MzIABQS8QW4gSFJNUCBjaGFubmVsIHdhcyBvcGVuZWQgd2l0aCBhIHN5c3RlbSBjaGFpbi5oT3BlbkNoYW5uZWxEZXBvc2l0c1VwZGF0ZWQIARhzZW5kZXKNAgEYUGFyYUlkAAEkcmVjaXBpZW50jQIBGFBhcmFJZAAGBKBBbiBIUk1QIGNoYW5uZWwncyBkZXBvc2l0cyB3ZXJlIHVwZGF0ZWQuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0jQcQbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucyBkaXNwdXRlcxhwYWxsZXQURXZlbnQEBFQAAQxARGlzcHV0ZUluaXRpYXRlZAgA7QQBNENhbmRpZGF0ZUhhc2gAAJEHATxEaXNwdXRlTG9jYXRpb24AAAQJAUEgZGlzcHV0ZSBoYXMgYmVlbiBpbml0aWF0ZWQuIFxbY2FuZGlkYXRlIGhhc2gsIGRpc3B1dGUgbG9jYXRpb25cXUBEaXNwdXRlQ29uY2x1ZGVkCADtBAE0Q2FuZGlkYXRlSGFzaAAAlQcBNERpc3B1dGVSZXN1bHQAAQjMQSBkaXNwdXRlIGhhcyBjb25jbHVkZWQgZm9yIG9yIGFnYWluc3QgYSBjYW5kaWRhdGUutGBcW3BhcmEgaWQsIGNhbmRpZGF0ZSBoYXNoLCBkaXNwdXRlIHJlc3VsdFxdYBhSZXZlcnQEABABREJsb2NrTnVtYmVyRm9yPFQ+AAIQ/EEgZGlzcHV0ZSBoYXMgY29uY2x1ZGVkIHdpdGggc3VwZXJtYWpvcml0eSBhZ2FpbnN0IGEgY2FuZGlkYXRlLg0BQmxvY2sgYXV0aG9ycyBzaG91bGQgbm8gbG9uZ2VyIGJ1aWxkIG9uIHRvcCBvZiB0aGlzIGhlYWQgYW5kIHNob3VsZAEBaW5zdGVhZCByZXZlcnQgdGhlIGJsb2NrIGF0IHRoZSBnaXZlbiBoZWlnaHQuIFRoaXMgc2hvdWxkIGJlIHRoZfxudW1iZXIgb2YgdGhlIGNoaWxkIG9mIHRoZSBsYXN0IGtub3duIHZhbGlkIGJsb2NrIGluIHRoZSBjaGFpbi4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXSRBwxscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zIGRpc3B1dGVzPERpc3B1dGVMb2NhdGlvbgABCBRMb2NhbAAAABhSZW1vdGUAAQAAlQcMbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucyBkaXNwdXRlczREaXNwdXRlUmVzdWx0AAEIFFZhbGlkAAAAHEludmFsaWQAAQAAmQcQbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWluc0hhc3NpZ25lcl9vbl9kZW1hbmQYcGFsbGV0FEV2ZW50BARUAAEITE9uRGVtYW5kT3JkZXJQbGFjZWQMARxwYXJhX2lkjQIBGFBhcmFJZAABKHNwb3RfcHJpY2UYATBCYWxhbmNlT2Y8VD4AAShvcmRlcmVkX2J5AAEwVDo6QWNjb3VudElkAAAEDQFBbiBvcmRlciB3YXMgcGxhY2VkIGF0IHNvbWUgc3BvdCBwcmljZSBhbW91bnQgYnkgb3JkZXJlciBvcmRlcmVkX2J5MFNwb3RQcmljZVNldAQBKHNwb3RfcHJpY2UYATBCYWxhbmNlT2Y8VD4AAQS4VGhlIHZhbHVlIG9mIHRoZSBzcG90IHByaWNlIGhhcyBsaWtlbHkgY2hhbmdlZAR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldJ0HEFxwb2xrYWRvdF9ydW50aW1lX2NvbW1vbjxwYXJhc19yZWdpc3RyYXIYcGFsbGV0FEV2ZW50BARUAAEQKFJlZ2lzdGVyZWQIARxwYXJhX2lkjQIBGFBhcmFJZAABHG1hbmFnZXIAATBUOjpBY2NvdW50SWQAAAAwRGVyZWdpc3RlcmVkBAEccGFyYV9pZI0CARhQYXJhSWQAAQAgUmVzZXJ2ZWQIARxwYXJhX2lkjQIBGFBhcmFJZAABDHdobwABMFQ6OkFjY291bnRJZAACABxTd2FwcGVkCAEccGFyYV9pZI0CARhQYXJhSWQAASBvdGhlcl9pZI0CARhQYXJhSWQAAwAEfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXShBxBccG9sa2Fkb3RfcnVudGltZV9jb21tb24Uc2xvdHMYcGFsbGV0FEV2ZW50BARUAAEIOE5ld0xlYXNlUGVyaW9kBAEwbGVhc2VfcGVyaW9kEAFATGVhc2VQZXJpb2RPZjxUPgAABJBBIG5ldyBgW2xlYXNlX3BlcmlvZF1gIGlzIGJlZ2lubmluZy4YTGVhc2VkGAEccGFyYV9pZI0CARhQYXJhSWQAARhsZWFzZXIAATBUOjpBY2NvdW50SWQAATBwZXJpb2RfYmVnaW4QAUBMZWFzZVBlcmlvZE9mPFQ+AAEwcGVyaW9kX2NvdW50EAFATGVhc2VQZXJpb2RPZjxUPgABOGV4dHJhX3Jlc2VydmVkGAEwQmFsYW5jZU9mPFQ+AAEwdG90YWxfYW1vdW50GAEwQmFsYW5jZU9mPFQ+AAEMNQFBIHBhcmEgaGFzIHdvbiB0aGUgcmlnaHQgdG8gYSBjb250aW51b3VzIHNldCBvZiBsZWFzZSBwZXJpb2RzIGFzIGEgcGFyYWNoYWluLkUBRmlyc3QgYmFsYW5jZSBpcyBhbnkgZXh0cmEgYW1vdW50IHJlc2VydmVkIG9uIHRvcCBvZiB0aGUgcGFyYSdzIGV4aXN0aW5nIGRlcG9zaXQusFNlY29uZCBiYWxhbmNlIGlzIHRoZSB0b3RhbCBhbW91bnQgcmVzZXJ2ZWQuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0pQcQXHBvbGthZG90X3J1bnRpbWVfY29tbW9uIGF1Y3Rpb25zGHBhbGxldBRFdmVudAQEVAABHDhBdWN0aW9uU3RhcnRlZAwBNGF1Y3Rpb25faW5kZXgQATBBdWN0aW9uSW5kZXgAATBsZWFzZV9wZXJpb2QQAUBMZWFzZVBlcmlvZE9mPFQ+AAEYZW5kaW5nEAFEQmxvY2tOdW1iZXJGb3I8VD4AAAhJAUFuIGF1Y3Rpb24gc3RhcnRlZC4gUHJvdmlkZXMgaXRzIGluZGV4IGFuZCB0aGUgYmxvY2sgbnVtYmVyIHdoZXJlIGl0IHdpbGwgYmVnaW4gdG8VAWNsb3NlIGFuZCB0aGUgZmlyc3QgbGVhc2UgcGVyaW9kIG9mIHRoZSBxdWFkcnVwbGV0IHRoYXQgaXMgYXVjdGlvbmVkLjRBdWN0aW9uQ2xvc2VkBAE0YXVjdGlvbl9pbmRleBABMEF1Y3Rpb25JbmRleAABBLhBbiBhdWN0aW9uIGVuZGVkLiBBbGwgZnVuZHMgYmVjb21lIHVucmVzZXJ2ZWQuIFJlc2VydmVkDAEYYmlkZGVyAAEwVDo6QWNjb3VudElkAAE4ZXh0cmFfcmVzZXJ2ZWQYATBCYWxhbmNlT2Y8VD4AATB0b3RhbF9hbW91bnQYATBCYWxhbmNlT2Y8VD4AAghJAUZ1bmRzIHdlcmUgcmVzZXJ2ZWQgZm9yIGEgd2lubmluZyBiaWQuIEZpcnN0IGJhbGFuY2UgaXMgdGhlIGV4dHJhIGFtb3VudCByZXNlcnZlZC5QU2Vjb25kIGlzIHRoZSB0b3RhbC4oVW5yZXNlcnZlZAgBGGJpZGRlcgABMFQ6OkFjY291bnRJZAABGGFtb3VudBgBMEJhbGFuY2VPZjxUPgADBCkBRnVuZHMgd2VyZSB1bnJlc2VydmVkIHNpbmNlIGJpZGRlciBpcyBubyBsb25nZXIgYWN0aXZlLiBgW2JpZGRlciwgYW1vdW50XWBIUmVzZXJ2ZUNvbmZpc2NhdGVkDAEccGFyYV9pZI0CARhQYXJhSWQAARhsZWFzZXIAATBUOjpBY2NvdW50SWQAARhhbW91bnQYATBCYWxhbmNlT2Y8VD4ABAhVAVNvbWVvbmUgYXR0ZW1wdGVkIHRvIGxlYXNlIHRoZSBzYW1lIHNsb3QgdHdpY2UgZm9yIGEgcGFyYWNoYWluLiBUaGUgYW1vdW50IGlzIGhlbGQgaW64cmVzZXJ2ZSBidXQgbm8gcGFyYWNoYWluIHNsb3QgaGFzIGJlZW4gbGVhc2VkLixCaWRBY2NlcHRlZBQBGGJpZGRlcgABMFQ6OkFjY291bnRJZAABHHBhcmFfaWSNAgEYUGFyYUlkAAEYYW1vdW50GAEwQmFsYW5jZU9mPFQ+AAEoZmlyc3Rfc2xvdBABQExlYXNlUGVyaW9kT2Y8VD4AASRsYXN0X3Nsb3QQAUBMZWFzZVBlcmlvZE9mPFQ+AAUEyEEgbmV3IGJpZCBoYXMgYmVlbiBhY2NlcHRlZCBhcyB0aGUgY3VycmVudCB3aW5uZXIuNFdpbm5pbmdPZmZzZXQIATRhdWN0aW9uX2luZGV4EAEwQXVjdGlvbkluZGV4AAEwYmxvY2tfbnVtYmVyEAFEQmxvY2tOdW1iZXJGb3I8VD4ABghZAVRoZSB3aW5uaW5nIG9mZnNldCB3YXMgY2hvc2VuIGZvciBhbiBhdWN0aW9uLiBUaGlzIHdpbGwgbWFwIGludG8gdGhlIGBXaW5uaW5nYCBzdG9yYWdlEG1hcC4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXSpBxBccG9sa2Fkb3RfcnVudGltZV9jb21tb24kY3Jvd2Rsb2FuGHBhbGxldBRFdmVudAQEVAABKBxDcmVhdGVkBAEccGFyYV9pZI0CARhQYXJhSWQAAASMQ3JlYXRlIGEgbmV3IGNyb3dkbG9hbmluZyBjYW1wYWlnbi4sQ29udHJpYnV0ZWQMAQx3aG8AATBUOjpBY2NvdW50SWQAAShmdW5kX2luZGV4jQIBGFBhcmFJZAABGGFtb3VudBgBMEJhbGFuY2VPZjxUPgABBHBDb250cmlidXRlZCB0byBhIGNyb3dkIHNhbGUuIFdpdGhkcmV3DAEMd2hvAAEwVDo6QWNjb3VudElkAAEoZnVuZF9pbmRleI0CARhQYXJhSWQAARhhbW91bnQYATBCYWxhbmNlT2Y8VD4AAgScV2l0aGRyZXcgZnVsbCBiYWxhbmNlIG9mIGEgY29udHJpYnV0b3IuRFBhcnRpYWxseVJlZnVuZGVkBAEccGFyYV9pZI0CARhQYXJhSWQAAwgtAVRoZSBsb2FucyBpbiBhIGZ1bmQgaGF2ZSBiZWVuIHBhcnRpYWxseSBkaXNzb2x2ZWQsIGkuZS4gdGhlcmUgYXJlIHNvbWUgbGVmdLRvdmVyIGNoaWxkIGtleXMgdGhhdCBzdGlsbCBuZWVkIHRvIGJlIGtpbGxlZC4sQWxsUmVmdW5kZWQEARxwYXJhX2lkjQIBGFBhcmFJZAAEBJxBbGwgbG9hbnMgaW4gYSBmdW5kIGhhdmUgYmVlbiByZWZ1bmRlZC4kRGlzc29sdmVkBAEccGFyYV9pZI0CARhQYXJhSWQABQRIRnVuZCBpcyBkaXNzb2x2ZWQuPEhhbmRsZUJpZFJlc3VsdAgBHHBhcmFfaWSNAgEYUGFyYUlkAAEYcmVzdWx0iAE4RGlzcGF0Y2hSZXN1bHQABgT0VGhlIHJlc3VsdCBvZiB0cnlpbmcgdG8gc3VibWl0IGEgbmV3IGJpZCB0byB0aGUgU2xvdHMgcGFsbGV0LhhFZGl0ZWQEARxwYXJhX2lkjQIBGFBhcmFJZAAHBMRUaGUgY29uZmlndXJhdGlvbiB0byBhIGNyb3dkbG9hbiBoYXMgYmVlbiBlZGl0ZWQuLE1lbW9VcGRhdGVkDAEMd2hvAAEwVDo6QWNjb3VudElkAAEccGFyYV9pZI0CARhQYXJhSWQAARBtZW1vOAEcVmVjPHU4PgAIBGBBIG1lbW8gaGFzIGJlZW4gdXBkYXRlZC48QWRkZWRUb05ld1JhaXNlBAEccGFyYV9pZI0CARhQYXJhSWQACQSgQSBwYXJhY2hhaW4gaGFzIGJlZW4gbW92ZWQgdG8gYE5ld1JhaXNlYAR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldK0HEGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMgY29yZXRpbWUYcGFsbGV0FEV2ZW50BARUAAEIUFJldmVudWVJbmZvUmVxdWVzdGVkBAEQd2hlbhABREJsb2NrTnVtYmVyRm9yPFQ+AAAEIQFUaGUgYnJva2VyIGNoYWluIGhhcyBhc2tlZCBmb3IgcmV2ZW51ZSBpbmZvcm1hdGlvbiBmb3IgYSBzcGVjaWZpYyBibG9jay4wQ29yZUFzc2lnbmVkBAEQY29yZX0HASRDb3JlSW5kZXgAAQTsQSBjb3JlIGhhcyByZWNlaXZlZCBhIG5ldyBhc3NpZ25tZW50IGZyb20gdGhlIGJyb2tlciBjaGFpbi4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXSxBwxscGFsbGV0X3N0YXRlX3RyaWVfbWlncmF0aW9uGHBhbGxldBRFdmVudAQEVAABECBNaWdyYXRlZAwBDHRvcBABDHUzMgABFGNoaWxkEAEMdTMyAAEcY29tcHV0ZbUHAUBNaWdyYXRpb25Db21wdXRlAAAIOQFHaXZlbiBudW1iZXIgb2YgYCh0b3AsIGNoaWxkKWAga2V5cyB3ZXJlIG1pZ3JhdGVkIHJlc3BlY3RpdmVseSwgd2l0aCB0aGUgZ2l2ZW4oYGNvbXB1dGVgLhxTbGFzaGVkCAEMd2hvAAEwVDo6QWNjb3VudElkAAEYYW1vdW50GAEwQmFsYW5jZU9mPFQ+AAEEtFNvbWUgYWNjb3VudCBnb3Qgc2xhc2hlZCBieSB0aGUgZ2l2ZW4gYW1vdW50LlRBdXRvTWlncmF0aW9uRmluaXNoZWQAAgSEVGhlIGF1dG8gbWlncmF0aW9uIHRhc2sgZmluaXNoZWQuGEhhbHRlZAQBFGVycm9yuQcBIEVycm9yPFQ+AAME7E1pZ3JhdGlvbiBnb3QgaGFsdGVkIGR1ZSB0byBhbiBlcnJvciBvciBtaXNzLWNvbmZpZ3VyYXRpb24uBHBJbm5lciBldmVudHMgb2YgdGhpcyBwYWxsZXQutQcMbHBhbGxldF9zdGF0ZV90cmllX21pZ3JhdGlvbhhwYWxsZXRATWlncmF0aW9uQ29tcHV0ZQABCBhTaWduZWQAAAAQQXV0bwABAAC5BwxscGFsbGV0X3N0YXRlX3RyaWVfbWlncmF0aW9uGHBhbGxldBRFcnJvcgQEVAABGDxNYXhTaWduZWRMaW1pdHMAAASATWF4IHNpZ25lZCBsaW1pdHMgbm90IHJlc3BlY3RlZC4oS2V5VG9vTG9uZwABHLRBIGtleSB3YXMgbG9uZ2VyIHRoYW4gdGhlIGNvbmZpZ3VyZWQgbWF4aW11bS4AEQFUaGlzIG1lYW5zIHRoYXQgdGhlIG1pZ3JhdGlvbiBoYWx0ZWQgYXQgdGhlIGN1cnJlbnQgW2BQcm9ncmVzc2BdIGFuZAEBY2FuIGJlIHJlc3VtZWQgd2l0aCBhIGxhcmdlciBbYGNyYXRlOjpDb25maWc6Ok1heEtleUxlbmBdIHZhbHVlLiEBUmV0cnlpbmcgd2l0aCB0aGUgc2FtZSBbYGNyYXRlOjpDb25maWc6Ok1heEtleUxlbmBdIHZhbHVlIHdpbGwgbm90IHdvcmsuRQFUaGUgdmFsdWUgc2hvdWxkIG9ubHkgYmUgaW5jcmVhc2VkIHRvIGF2b2lkIGEgc3RvcmFnZSBtaWdyYXRpb24gZm9yIHRoZSBjdXJyZW50bHmQc3RvcmVkIFtgY3JhdGU6OlByb2dyZXNzOjpMYXN0S2V5YF0uOE5vdEVub3VnaEZ1bmRzAAIElHN1Ym1pdHRlciBkb2VzIG5vdCBoYXZlIGVub3VnaCBmdW5kcy4oQmFkV2l0bmVzcwADBGhCYWQgd2l0bmVzcyBkYXRhIHByb3ZpZGVkLmRTaWduZWRNaWdyYXRpb25Ob3RBbGxvd2VkAAQEJQFTaWduZWQgbWlncmF0aW9uIGlzIG5vdCBhbGxvd2VkIGJlY2F1c2UgdGhlIG1heGltdW0gbGltaXQgaXMgbm90IHNldCB5ZXQuMEJhZENoaWxkUm9vdAAFBGBCYWQgY2hpbGQgcm9vdCBwcm92aWRlZC4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQuvQcMKHBhbGxldF94Y20YcGFsbGV0FEV2ZW50BARUAAFgJEF0dGVtcHRlZAQBHG91dGNvbWXBBwFQeGNtOjpsYXRlc3Q6Ok91dGNvbWUAAASoRXhlY3V0aW9uIG9mIGFuIFhDTSBtZXNzYWdlIHdhcyBhdHRlbXB0ZWQuEFNlbnQQARhvcmlnaW4NAQEgTG9jYXRpb24AASxkZXN0aW5hdGlvbg0BASBMb2NhdGlvbgABHG1lc3NhZ2VBBgEcWGNtPCgpPgABKG1lc3NhZ2VfaWQEARxYY21IYXNoAAEEXEEgWENNIG1lc3NhZ2Ugd2FzIHNlbnQuSFVuZXhwZWN0ZWRSZXNwb25zZQgBGG9yaWdpbg0BASBMb2NhdGlvbgABIHF1ZXJ5X2lkMAEcUXVlcnlJZAACDFkBUXVlcnkgcmVzcG9uc2UgcmVjZWl2ZWQgd2hpY2ggZG9lcyBub3QgbWF0Y2ggYSByZWdpc3RlcmVkIHF1ZXJ5LiBUaGlzIG1heSBiZSBiZWNhdXNlIGFVAW1hdGNoaW5nIHF1ZXJ5IHdhcyBuZXZlciByZWdpc3RlcmVkLCBpdCBtYXkgYmUgYmVjYXVzZSBpdCBpcyBhIGR1cGxpY2F0ZSByZXNwb25zZSwgb3JwYmVjYXVzZSB0aGUgcXVlcnkgdGltZWQgb3V0LjRSZXNwb25zZVJlYWR5CAEgcXVlcnlfaWQwARxRdWVyeUlkAAEgcmVzcG9uc2VhBgEgUmVzcG9uc2UAAwhdAVF1ZXJ5IHJlc3BvbnNlIGhhcyBiZWVuIHJlY2VpdmVkIGFuZCBpcyByZWFkeSBmb3IgdGFraW5nIHdpdGggYHRha2VfcmVzcG9uc2VgLiBUaGVyZSBpc4BubyByZWdpc3RlcmVkIG5vdGlmaWNhdGlvbiBjYWxsLiBOb3RpZmllZAwBIHF1ZXJ5X2lkMAEcUXVlcnlJZAABMHBhbGxldF9pbmRleAgBCHU4AAEoY2FsbF9pbmRleAgBCHU4AAQIWQFRdWVyeSByZXNwb25zZSBoYXMgYmVlbiByZWNlaXZlZCBhbmQgcXVlcnkgaXMgcmVtb3ZlZC4gVGhlIHJlZ2lzdGVyZWQgbm90aWZpY2F0aW9uIGhhc6hiZWVuIGRpc3BhdGNoZWQgYW5kIGV4ZWN1dGVkIHN1Y2Nlc3NmdWxseS5ATm90aWZ5T3ZlcndlaWdodBQBIHF1ZXJ5X2lkMAEcUXVlcnlJZAABMHBhbGxldF9pbmRleAgBCHU4AAEoY2FsbF9pbmRleAgBCHU4AAE0YWN0dWFsX3dlaWdodCgBGFdlaWdodAABTG1heF9idWRnZXRlZF93ZWlnaHQoARhXZWlnaHQABQxJAVF1ZXJ5IHJlc3BvbnNlIGhhcyBiZWVuIHJlY2VpdmVkIGFuZCBxdWVyeSBpcyByZW1vdmVkLiBUaGUgcmVnaXN0ZXJlZCBub3RpZmljYXRpb25ZAWNvdWxkIG5vdCBiZSBkaXNwYXRjaGVkIGJlY2F1c2UgdGhlIGRpc3BhdGNoIHdlaWdodCBpcyBncmVhdGVyIHRoYW4gdGhlIG1heGltdW0gd2VpZ2h05G9yaWdpbmFsbHkgYnVkZ2V0ZWQgYnkgdGhpcyBydW50aW1lIGZvciB0aGUgcXVlcnkgcmVzdWx0LkxOb3RpZnlEaXNwYXRjaEVycm9yDAEgcXVlcnlfaWQwARxRdWVyeUlkAAEwcGFsbGV0X2luZGV4CAEIdTgAAShjYWxsX2luZGV4CAEIdTgABghVAVF1ZXJ5IHJlc3BvbnNlIGhhcyBiZWVuIHJlY2VpdmVkIGFuZCBxdWVyeSBpcyByZW1vdmVkLiBUaGVyZSB3YXMgYSBnZW5lcmFsIGVycm9yIHdpdGiIZGlzcGF0Y2hpbmcgdGhlIG5vdGlmaWNhdGlvbiBjYWxsLkhOb3RpZnlEZWNvZGVGYWlsZWQMASBxdWVyeV9pZDABHFF1ZXJ5SWQAATBwYWxsZXRfaW5kZXgIAQh1OAABKGNhbGxfaW5kZXgIAQh1OAAHDFEBUXVlcnkgcmVzcG9uc2UgaGFzIGJlZW4gcmVjZWl2ZWQgYW5kIHF1ZXJ5IGlzIHJlbW92ZWQuIFRoZSBkaXNwYXRjaCB3YXMgdW5hYmxlIHRvIGJlWQFkZWNvZGVkIGludG8gYSBgQ2FsbGA7IHRoaXMgbWlnaHQgYmUgZHVlIHRvIGRpc3BhdGNoIGZ1bmN0aW9uIGhhdmluZyBhIHNpZ25hdHVyZSB3aGljaJRpcyBub3QgYChvcmlnaW4sIFF1ZXJ5SWQsIFJlc3BvbnNlKWAuQEludmFsaWRSZXNwb25kZXIMARhvcmlnaW4NAQEgTG9jYXRpb24AASBxdWVyeV9pZDABHFF1ZXJ5SWQAAURleHBlY3RlZF9sb2NhdGlvbnUGAUBPcHRpb248TG9jYXRpb24+AAgMWQFFeHBlY3RlZCBxdWVyeSByZXNwb25zZSBoYXMgYmVlbiByZWNlaXZlZCBidXQgdGhlIG9yaWdpbiBsb2NhdGlvbiBvZiB0aGUgcmVzcG9uc2UgZG9lc1UBbm90IG1hdGNoIHRoYXQgZXhwZWN0ZWQuIFRoZSBxdWVyeSByZW1haW5zIHJlZ2lzdGVyZWQgZm9yIGEgbGF0ZXIsIHZhbGlkLCByZXNwb25zZSB0b2xiZSByZWNlaXZlZCBhbmQgYWN0ZWQgdXBvbi5cSW52YWxpZFJlc3BvbmRlclZlcnNpb24IARhvcmlnaW4NAQEgTG9jYXRpb24AASBxdWVyeV9pZDABHFF1ZXJ5SWQACRxRAUV4cGVjdGVkIHF1ZXJ5IHJlc3BvbnNlIGhhcyBiZWVuIHJlY2VpdmVkIGJ1dCB0aGUgZXhwZWN0ZWQgb3JpZ2luIGxvY2F0aW9uIHBsYWNlZCBpbk0Bc3RvcmFnZSBieSB0aGlzIHJ1bnRpbWUgcHJldmlvdXNseSBjYW5ub3QgYmUgZGVjb2RlZC4gVGhlIHF1ZXJ5IHJlbWFpbnMgcmVnaXN0ZXJlZC4AQQFUaGlzIGlzIHVuZXhwZWN0ZWQgKHNpbmNlIGEgbG9jYXRpb24gcGxhY2VkIGluIHN0b3JhZ2UgaW4gYSBwcmV2aW91c2x5IGV4ZWN1dGluZ00BcnVudGltZSBzaG91bGQgYmUgcmVhZGFibGUgcHJpb3IgdG8gcXVlcnkgdGltZW91dCkgYW5kIGRhbmdlcm91cyBzaW5jZSB0aGUgcG9zc2libHlZAXZhbGlkIHJlc3BvbnNlIHdpbGwgYmUgZHJvcHBlZC4gTWFudWFsIGdvdmVybmFuY2UgaW50ZXJ2ZW50aW9uIGlzIHByb2JhYmx5IGdvaW5nIHRvIGJlHG5lZWRlZC40UmVzcG9uc2VUYWtlbgQBIHF1ZXJ5X2lkMAEcUXVlcnlJZAAKBMhSZWNlaXZlZCBxdWVyeSByZXNwb25zZSBoYXMgYmVlbiByZWFkIGFuZCByZW1vdmVkLjRBc3NldHNUcmFwcGVkDAEQaGFzaDQBEEgyNTYAARhvcmlnaW4NAQEgTG9jYXRpb24AARhhc3NldHOJBgE8VmVyc2lvbmVkQXNzZXRzAAsEuFNvbWUgYXNzZXRzIGhhdmUgYmVlbiBwbGFjZWQgaW4gYW4gYXNzZXQgdHJhcC5UVmVyc2lvbkNoYW5nZU5vdGlmaWVkEAEsZGVzdGluYXRpb24NAQEgTG9jYXRpb24AARhyZXN1bHQQAShYY21WZXJzaW9uAAEQY29zdE0GARhBc3NldHMAAShtZXNzYWdlX2lkBAEcWGNtSGFzaAAMDCUBQW4gWENNIHZlcnNpb24gY2hhbmdlIG5vdGlmaWNhdGlvbiBtZXNzYWdlIGhhcyBiZWVuIGF0dGVtcHRlZCB0byBiZSBzZW50LgDgVGhlIGNvc3Qgb2Ygc2VuZGluZyBpdCAoYm9ybmUgYnkgdGhlIGNoYWluKSBpcyBpbmNsdWRlZC5cU3VwcG9ydGVkVmVyc2lvbkNoYW5nZWQIASBsb2NhdGlvbg0BASBMb2NhdGlvbgABHHZlcnNpb24QAShYY21WZXJzaW9uAA0IOQFUaGUgc3VwcG9ydGVkIHZlcnNpb24gb2YgYSBsb2NhdGlvbiBoYXMgYmVlbiBjaGFuZ2VkLiBUaGlzIG1pZ2h0IGJlIHRocm91Z2ggYW7AYXV0b21hdGljIG5vdGlmaWNhdGlvbiBvciBhIG1hbnVhbCBpbnRlcnZlbnRpb24uUE5vdGlmeVRhcmdldFNlbmRGYWlsDAEgbG9jYXRpb24NAQEgTG9jYXRpb24AASBxdWVyeV9pZDABHFF1ZXJ5SWQAARRlcnJvcgkGASBYY21FcnJvcgAOCFkBQSBnaXZlbiBsb2NhdGlvbiB3aGljaCBoYWQgYSB2ZXJzaW9uIGNoYW5nZSBzdWJzY3JpcHRpb24gd2FzIGRyb3BwZWQgb3dpbmcgdG8gYW4gZXJyb3J8c2VuZGluZyB0aGUgbm90aWZpY2F0aW9uIHRvIGl0LmROb3RpZnlUYXJnZXRNaWdyYXRpb25GYWlsCAEgbG9jYXRpb25FAQFEVmVyc2lvbmVkTG9jYXRpb24AASBxdWVyeV9pZDABHFF1ZXJ5SWQADwhZAUEgZ2l2ZW4gbG9jYXRpb24gd2hpY2ggaGFkIGEgdmVyc2lvbiBjaGFuZ2Ugc3Vic2NyaXB0aW9uIHdhcyBkcm9wcGVkIG93aW5nIHRvIGFuIGVycm9ytG1pZ3JhdGluZyB0aGUgbG9jYXRpb24gdG8gb3VyIG5ldyBYQ00gZm9ybWF0LlRJbnZhbGlkUXVlcmllclZlcnNpb24IARhvcmlnaW4NAQEgTG9jYXRpb24AASBxdWVyeV9pZDABHFF1ZXJ5SWQAEBxVAUV4cGVjdGVkIHF1ZXJ5IHJlc3BvbnNlIGhhcyBiZWVuIHJlY2VpdmVkIGJ1dCB0aGUgZXhwZWN0ZWQgcXVlcmllciBsb2NhdGlvbiBwbGFjZWQgaW5NAXN0b3JhZ2UgYnkgdGhpcyBydW50aW1lIHByZXZpb3VzbHkgY2Fubm90IGJlIGRlY29kZWQuIFRoZSBxdWVyeSByZW1haW5zIHJlZ2lzdGVyZWQuAEEBVGhpcyBpcyB1bmV4cGVjdGVkIChzaW5jZSBhIGxvY2F0aW9uIHBsYWNlZCBpbiBzdG9yYWdlIGluIGEgcHJldmlvdXNseSBleGVjdXRpbmdNAXJ1bnRpbWUgc2hvdWxkIGJlIHJlYWRhYmxlIHByaW9yIHRvIHF1ZXJ5IHRpbWVvdXQpIGFuZCBkYW5nZXJvdXMgc2luY2UgdGhlIHBvc3NpYmx5WQF2YWxpZCByZXNwb25zZSB3aWxsIGJlIGRyb3BwZWQuIE1hbnVhbCBnb3Zlcm5hbmNlIGludGVydmVudGlvbiBpcyBwcm9iYWJseSBnb2luZyB0byBiZRxuZWVkZWQuOEludmFsaWRRdWVyaWVyEAEYb3JpZ2luDQEBIExvY2F0aW9uAAEgcXVlcnlfaWQwARxRdWVyeUlkAAFAZXhwZWN0ZWRfcXVlcmllcg0BASBMb2NhdGlvbgABUG1heWJlX2FjdHVhbF9xdWVyaWVydQYBQE9wdGlvbjxMb2NhdGlvbj4AEQxdAUV4cGVjdGVkIHF1ZXJ5IHJlc3BvbnNlIGhhcyBiZWVuIHJlY2VpdmVkIGJ1dCB0aGUgcXVlcmllciBsb2NhdGlvbiBvZiB0aGUgcmVzcG9uc2UgZG9lc1EBbm90IG1hdGNoIHRoZSBleHBlY3RlZC4gVGhlIHF1ZXJ5IHJlbWFpbnMgcmVnaXN0ZXJlZCBmb3IgYSBsYXRlciwgdmFsaWQsIHJlc3BvbnNlIHRvbGJlIHJlY2VpdmVkIGFuZCBhY3RlZCB1cG9uLlBWZXJzaW9uTm90aWZ5U3RhcnRlZAwBLGRlc3RpbmF0aW9uDQEBIExvY2F0aW9uAAEQY29zdE0GARhBc3NldHMAAShtZXNzYWdlX2lkBAEcWGNtSGFzaAASCFkBQSByZW1vdGUgaGFzIHJlcXVlc3RlZCBYQ00gdmVyc2lvbiBjaGFuZ2Ugbm90aWZpY2F0aW9uIGZyb20gdXMgYW5kIHdlIGhhdmUgaG9ub3JlZCBpdC4dAUEgdmVyc2lvbiBpbmZvcm1hdGlvbiBtZXNzYWdlIGlzIHNlbnQgdG8gdGhlbSBhbmQgaXRzIGNvc3QgaXMgaW5jbHVkZWQuWFZlcnNpb25Ob3RpZnlSZXF1ZXN0ZWQMASxkZXN0aW5hdGlvbg0BASBMb2NhdGlvbgABEGNvc3RNBgEYQXNzZXRzAAEobWVzc2FnZV9pZAQBHFhjbUhhc2gAEwQ9AVdlIGhhdmUgcmVxdWVzdGVkIHRoYXQgYSByZW1vdGUgY2hhaW4gc2VuZCB1cyBYQ00gdmVyc2lvbiBjaGFuZ2Ugbm90aWZpY2F0aW9ucy5gVmVyc2lvbk5vdGlmeVVucmVxdWVzdGVkDAEsZGVzdGluYXRpb24NAQEgTG9jYXRpb24AARBjb3N0TQYBGEFzc2V0cwABKG1lc3NhZ2VfaWQEARxYY21IYXNoABQIJQFXZSBoYXZlIHJlcXVlc3RlZCB0aGF0IGEgcmVtb3RlIGNoYWluIHN0b3BzIHNlbmRpbmcgdXMgWENNIHZlcnNpb24gY2hhbmdlOG5vdGlmaWNhdGlvbnMuIEZlZXNQYWlkCAEYcGF5aW5nDQEBIExvY2F0aW9uAAEQZmVlc00GARhBc3NldHMAFQQxAUZlZXMgd2VyZSBwYWlkIGZyb20gYSBsb2NhdGlvbiBmb3IgYW4gb3BlcmF0aW9uIChvZnRlbiBmb3IgdXNpbmcgYFNlbmRYY21gKS40QXNzZXRzQ2xhaW1lZAwBEGhhc2g0ARBIMjU2AAEYb3JpZ2luDQEBIExvY2F0aW9uAAEYYXNzZXRziQYBPFZlcnNpb25lZEFzc2V0cwAWBMBTb21lIGFzc2V0cyBoYXZlIGJlZW4gY2xhaW1lZCBmcm9tIGFuIGFzc2V0IHRyYXBgVmVyc2lvbk1pZ3JhdGlvbkZpbmlzaGVkBAEcdmVyc2lvbhABKFhjbVZlcnNpb24AFwSEQSBYQ00gdmVyc2lvbiBtaWdyYXRpb24gZmluaXNoZWQuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0wQcQLHN0YWdpbmdfeGNtCHY0GHRyYWl0cxxPdXRjb21lAAEMIENvbXBsZXRlBAEQdXNlZCgBGFdlaWdodAAAAChJbmNvbXBsZXRlCAEQdXNlZCgBGFdlaWdodAABFGVycm9yCQYBFEVycm9yAAEAFEVycm9yBAEUZXJyb3IJBgEURXJyb3IAAgAAxQcMUHBhbGxldF9tZXNzYWdlX3F1ZXVlGHBhbGxldBRFdmVudAQEVAABEEBQcm9jZXNzaW5nRmFpbGVkDAEIaWQ0ARBIMjU2BJRUaGUgYGJsYWtlMl8yNTZgIGhhc2ggb2YgdGhlIG1lc3NhZ2UuARhvcmlnaW7FBgFITWVzc2FnZU9yaWdpbk9mPFQ+BGRUaGUgcXVldWUgb2YgdGhlIG1lc3NhZ2UuARRlcnJvcskHAUxQcm9jZXNzTWVzc2FnZUVycm9yEGBUaGUgZXJyb3IgdGhhdCBvY2N1cnJlZC4ASQFUaGlzIGVycm9yIGlzIHByZXR0eSBvcGFxdWUuIE1vcmUgZmluZS1ncmFpbmVkIGVycm9ycyBuZWVkIHRvIGJlIGVtaXR0ZWQgYXMgZXZlbnRzaGJ5IHRoZSBgTWVzc2FnZVByb2Nlc3NvcmAuAARVAU1lc3NhZ2UgZGlzY2FyZGVkIGR1ZSB0byBhbiBlcnJvciBpbiB0aGUgYE1lc3NhZ2VQcm9jZXNzb3JgICh1c3VhbGx5IGEgZm9ybWF0IGVycm9yKS4kUHJvY2Vzc2VkEAEIaWQ0ARBIMjU2BJRUaGUgYGJsYWtlMl8yNTZgIGhhc2ggb2YgdGhlIG1lc3NhZ2UuARhvcmlnaW7FBgFITWVzc2FnZU9yaWdpbk9mPFQ+BGRUaGUgcXVldWUgb2YgdGhlIG1lc3NhZ2UuASx3ZWlnaHRfdXNlZCgBGFdlaWdodATASG93IG11Y2ggd2VpZ2h0IHdhcyB1c2VkIHRvIHByb2Nlc3MgdGhlIG1lc3NhZ2UuARxzdWNjZXNzIAEQYm9vbBiIV2hldGhlciB0aGUgbWVzc2FnZSB3YXMgcHJvY2Vzc2VkLgBJAU5vdGUgdGhhdCB0aGlzIGRvZXMgbm90IG1lYW4gdGhhdCB0aGUgdW5kZXJseWluZyBgTWVzc2FnZVByb2Nlc3NvcmAgd2FzIGludGVybmFsbHk1AXN1Y2Nlc3NmdWwuIEl0ICpzb2xlbHkqIG1lYW5zIHRoYXQgdGhlIE1RIHBhbGxldCB3aWxsIHRyZWF0IHRoaXMgYXMgYSBzdWNjZXNzTQFjb25kaXRpb24gYW5kIGRpc2NhcmQgdGhlIG1lc3NhZ2UuIEFueSBpbnRlcm5hbCBlcnJvciBuZWVkcyB0byBiZSBlbWl0dGVkIGFzIGV2ZW50c2hieSB0aGUgYE1lc3NhZ2VQcm9jZXNzb3JgLgEEVE1lc3NhZ2UgaXMgcHJvY2Vzc2VkLkhPdmVyd2VpZ2h0RW5xdWV1ZWQQAQhpZAQBIFt1ODsgMzJdBJRUaGUgYGJsYWtlMl8yNTZgIGhhc2ggb2YgdGhlIG1lc3NhZ2UuARhvcmlnaW7FBgFITWVzc2FnZU9yaWdpbk9mPFQ+BGRUaGUgcXVldWUgb2YgdGhlIG1lc3NhZ2UuAShwYWdlX2luZGV4EAEkUGFnZUluZGV4BGBUaGUgcGFnZSBvZiB0aGUgbWVzc2FnZS4BNG1lc3NhZ2VfaW5kZXgQARxUOjpTaXplBKRUaGUgaW5kZXggb2YgdGhlIG1lc3NhZ2Ugd2l0aGluIHRoZSBwYWdlLgIEjE1lc3NhZ2UgcGxhY2VkIGluIG92ZXJ3ZWlnaHQgcXVldWUuKFBhZ2VSZWFwZWQIARhvcmlnaW7FBgFITWVzc2FnZU9yaWdpbk9mPFQ+BFhUaGUgcXVldWUgb2YgdGhlIHBhZ2UuARRpbmRleBABJFBhZ2VJbmRleARYVGhlIGluZGV4IG9mIHRoZSBwYWdlLgMEVFRoaXMgcGFnZSB3YXMgcmVhcGVkLgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldMkHEDRmcmFtZV9zdXBwb3J0GHRyYWl0cyBtZXNzYWdlc0xQcm9jZXNzTWVzc2FnZUVycm9yAAEYJEJhZEZvcm1hdAAAABxDb3JydXB0AAEALFVuc3VwcG9ydGVkAAIAKE92ZXJ3ZWlnaHQEACgBGFdlaWdodAADABRZaWVsZAAEAERTdGFja0xpbWl0UmVhY2hlZAAFAADNBwxEcGFsbGV0X2Fzc2V0X3JhdGUYcGFsbGV0FEV2ZW50BARUAAEMQEFzc2V0UmF0ZUNyZWF0ZWQIAShhc3NldF9raW5k3AEwVDo6QXNzZXRLaW5kAAEQcmF0ZdEGASRGaXhlZFUxMjgAAABAQXNzZXRSYXRlUmVtb3ZlZAQBKGFzc2V0X2tpbmTcATBUOjpBc3NldEtpbmQAAQBAQXNzZXRSYXRlVXBkYXRlZAwBKGFzc2V0X2tpbmTcATBUOjpBc3NldEtpbmQAAQxvbGTRBgEkRml4ZWRVMTI4AAEMbmV30QYBJEZpeGVkVTEyOAACAAR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldNEHDCxwYWxsZXRfc3VkbxhwYWxsZXQURXZlbnQEBFQAARAUU3VkaWQEASxzdWRvX3Jlc3VsdIgBOERpc3BhdGNoUmVzdWx0BLRUaGUgcmVzdWx0IG9mIHRoZSBjYWxsIG1hZGUgYnkgdGhlIHN1ZG8gdXNlci4ABHBBIHN1ZG8gY2FsbCBqdXN0IHRvb2sgcGxhY2UuKEtleUNoYW5nZWQIAQxvbGT9AQFQT3B0aW9uPFQ6OkFjY291bnRJZD4EtFRoZSBvbGQgc3VkbyBrZXkgKGlmIG9uZSB3YXMgcHJldmlvdXNseSBzZXQpLgEMbmV3AAEwVDo6QWNjb3VudElkBIhUaGUgbmV3IHN1ZG8ga2V5IChpZiBvbmUgd2FzIHNldCkuAQR4VGhlIHN1ZG8ga2V5IGhhcyBiZWVuIHVwZGF0ZWQuKEtleVJlbW92ZWQAAgSAVGhlIGtleSB3YXMgcGVybWFuZW50bHkgcmVtb3ZlZC4oU3Vkb0FzRG9uZQQBLHN1ZG9fcmVzdWx0iAE4RGlzcGF0Y2hSZXN1bHQEtFRoZSByZXN1bHQgb2YgdGhlIGNhbGwgbWFkZSBieSB0aGUgc3VkbyB1c2VyLgMEyEEgW3N1ZG9fYXNdKFBhbGxldDo6c3Vkb19hcykgY2FsbCBqdXN0IHRvb2sgcGxhY2UuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV01QcIMGZyYW1lX3N5c3RlbRRQaGFzZQABDDhBcHBseUV4dHJpbnNpYwQAEAEMdTMyAAAAMEZpbmFsaXphdGlvbgABADhJbml0aWFsaXphdGlvbgACAADZBwAAAoAA3QcIMGZyYW1lX3N5c3RlbVhMYXN0UnVudGltZVVwZ3JhZGVJbmZvAAAIATBzcGVjX3ZlcnNpb27sAUxjb2RlYzo6Q29tcGFjdDx1MzI+AAEkc3BlY19uYW1l4QcBZHNwX3J1bnRpbWU6OlJ1bnRpbWVTdHJpbmcAAOEHAAAFAgDlBwgwZnJhbWVfc3lzdGVtYENvZGVVcGdyYWRlQXV0aG9yaXphdGlvbgQEVAAACAEkY29kZV9oYXNoNAEcVDo6SGFzaAABNGNoZWNrX3ZlcnNpb24gARBib29sAADpBwwwZnJhbWVfc3lzdGVtGGxpbWl0czBCbG9ja1dlaWdodHMAAAwBKGJhc2VfYmxvY2soARhXZWlnaHQAASRtYXhfYmxvY2soARhXZWlnaHQAASRwZXJfY2xhc3PtBwGEUGVyRGlzcGF0Y2hDbGFzczxXZWlnaHRzUGVyQ2xhc3M+AADtBww0ZnJhbWVfc3VwcG9ydCBkaXNwYXRjaEBQZXJEaXNwYXRjaENsYXNzBARUAfEHAAwBGG5vcm1hbPEHAQRUAAEsb3BlcmF0aW9uYWzxBwEEVAABJG1hbmRhdG9yefEHAQRUAADxBwwwZnJhbWVfc3lzdGVtGGxpbWl0czxXZWlnaHRzUGVyQ2xhc3MAABABOGJhc2VfZXh0cmluc2ljKAEYV2VpZ2h0AAE0bWF4X2V4dHJpbnNpYx0HAThPcHRpb248V2VpZ2h0PgABJG1heF90b3RhbB0HAThPcHRpb248V2VpZ2h0PgABIHJlc2VydmVkHQcBOE9wdGlvbjxXZWlnaHQ+AAD1BwwwZnJhbWVfc3lzdGVtGGxpbWl0cyxCbG9ja0xlbmd0aAAABAEMbWF4+QcBVFBlckRpc3BhdGNoQ2xhc3M8dTMyPgAA+QcMNGZyYW1lX3N1cHBvcnQgZGlzcGF0Y2hAUGVyRGlzcGF0Y2hDbGFzcwQEVAEQAAwBGG5vcm1hbBABBFQAASxvcGVyYXRpb25hbBABBFQAASRtYW5kYXRvcnkQAQRUAAD9Bwgoc3Bfd2VpZ2h0czxSdW50aW1lRGJXZWlnaHQAAAgBEHJlYWQwAQx1NjQAARR3cml0ZTABDHU2NAAAAQgIKHNwX3ZlcnNpb244UnVudGltZVZlcnNpb24AACABJHNwZWNfbmFtZeEHATRSdW50aW1lU3RyaW5nAAEkaW1wbF9uYW1l4QcBNFJ1bnRpbWVTdHJpbmcAAURhdXRob3JpbmdfdmVyc2lvbhABDHUzMgABMHNwZWNfdmVyc2lvbhABDHUzMgABMGltcGxfdmVyc2lvbhABDHUzMgABEGFwaXMFCAEcQXBpc1ZlYwABTHRyYW5zYWN0aW9uX3ZlcnNpb24QAQx1MzIAATRzdGF0ZV92ZXJzaW9uCAEIdTgAAAUIBAxDb3cEBFQBCQgABAAJCAAAAAkIAAACDQgADQgAAAQIsQUQABEIDDBmcmFtZV9zeXN0ZW0YcGFsbGV0FEVycm9yBARUAAEkPEludmFsaWRTcGVjTmFtZQAACBEBVGhlIG5hbWUgb2Ygc3BlY2lmaWNhdGlvbiBkb2VzIG5vdCBtYXRjaCBiZXR3ZWVuIHRoZSBjdXJyZW50IHJ1bnRpbWVQYW5kIHRoZSBuZXcgcnVudGltZS5oU3BlY1ZlcnNpb25OZWVkc1RvSW5jcmVhc2UAAQhBAVRoZSBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaXMgbm90IGFsbG93ZWQgdG8gZGVjcmVhc2UgYmV0d2VlbiB0aGUgY3VycmVudCBydW50aW1lUGFuZCB0aGUgbmV3IHJ1bnRpbWUudEZhaWxlZFRvRXh0cmFjdFJ1bnRpbWVWZXJzaW9uAAIM7EZhaWxlZCB0byBleHRyYWN0IHRoZSBydW50aW1lIHZlcnNpb24gZnJvbSB0aGUgbmV3IHJ1bnRpbWUuAAkBRWl0aGVyIGNhbGxpbmcgYENvcmVfdmVyc2lvbmAgb3IgZGVjb2RpbmcgYFJ1bnRpbWVWZXJzaW9uYCBmYWlsZWQuTE5vbkRlZmF1bHRDb21wb3NpdGUAAwT8U3VpY2lkZSBjYWxsZWQgd2hlbiB0aGUgYWNjb3VudCBoYXMgbm9uLWRlZmF1bHQgY29tcG9zaXRlIGRhdGEuPE5vblplcm9SZWZDb3VudAAEBDUBVGhlcmUgaXMgYSBub24temVybyByZWZlcmVuY2UgY291bnQgcHJldmVudGluZyB0aGUgYWNjb3VudCBmcm9tIGJlaW5nIHB1cmdlZC4wQ2FsbEZpbHRlcmVkAAUE0FRoZSBvcmlnaW4gZmlsdGVyIHByZXZlbnQgdGhlIGNhbGwgdG8gYmUgZGlzcGF0Y2hlZC5sTXVsdGlCbG9ja01pZ3JhdGlvbnNPbmdvaW5nAAYEVQFBIG11bHRpLWJsb2NrIG1pZ3JhdGlvbiBpcyBvbmdvaW5nIGFuZCBwcmV2ZW50cyB0aGUgY3VycmVudCBjb2RlIGZyb20gYmVpbmcgcmVwbGFjZWQuRE5vdGhpbmdBdXRob3JpemVkAAcEWE5vIHVwZ3JhZGUgYXV0aG9yaXplZC4wVW5hdXRob3JpemVkAAgElFRoZSBzdWJtaXR0ZWQgY29kZSBpcyBub3QgYXV0aG9yaXplZC4EbEVycm9yIGZvciB0aGUgU3lzdGVtIHBhbGxldBUIDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBGQgEUwAABAAhCAEYVmVjPFQ+AAAZCAQYT3B0aW9uBARUAR0IAQgQTm9uZQAAABBTb21lBAAdCAAAAQAAHQgIQHBhbGxldF9zY2hlZHVsZXIkU2NoZWR1bGVkFBBOYW1lAQQQQ2FsbAFxASxCbG9ja051bWJlcgEQNFBhbGxldHNPcmlnaW4BfQIkQWNjb3VudElkAQAAFAEgbWF5YmVfaWSEATBPcHRpb248TmFtZT4AASBwcmlvcml0eQgBSHNjaGVkdWxlOjpQcmlvcml0eQABEGNhbGxxAQEQQ2FsbAABOG1heWJlX3BlcmlvZGljjQEBlE9wdGlvbjxzY2hlZHVsZTo6UGVyaW9kPEJsb2NrTnVtYmVyPj4AARhvcmlnaW59AgE0UGFsbGV0c09yaWdpbgAAIQgAAAIZCAAlCAhAcGFsbGV0X3NjaGVkdWxlcixSZXRyeUNvbmZpZwQYUGVyaW9kARAADAE0dG90YWxfcmV0cmllcwgBCHU4AAEkcmVtYWluaW5nCAEIdTgAARhwZXJpb2QQARhQZXJpb2QAACkIDEBwYWxsZXRfc2NoZWR1bGVyGHBhbGxldBRFcnJvcgQEVAABFEBGYWlsZWRUb1NjaGVkdWxlAAAEZEZhaWxlZCB0byBzY2hlZHVsZSBhIGNhbGwgTm90Rm91bmQAAQR8Q2Fubm90IGZpbmQgdGhlIHNjaGVkdWxlZCBjYWxsLlxUYXJnZXRCbG9ja051bWJlckluUGFzdAACBKRHaXZlbiB0YXJnZXQgYmxvY2sgbnVtYmVyIGlzIGluIHRoZSBwYXN0LkhSZXNjaGVkdWxlTm9DaGFuZ2UAAwTwUmVzY2hlZHVsZSBmYWlsZWQgYmVjYXVzZSBpdCBkb2VzIG5vdCBjaGFuZ2Ugc2NoZWR1bGVkIHRpbWUuFE5hbWVkAAQE0EF0dGVtcHQgdG8gdXNlIGEgbm9uLW5hbWVkIGZ1bmN0aW9uIG9uIGEgbmFtZWQgdGFzay4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQuLQgIPHBhbGxldF9wcmVpbWFnZUBPbGRSZXF1ZXN0U3RhdHVzCCRBY2NvdW50SWQBABxCYWxhbmNlARgBCCxVbnJlcXVlc3RlZAgBHGRlcG9zaXQRBAFQKEFjY291bnRJZCwgQmFsYW5jZSkAAQxsZW4QAQx1MzIAAAAkUmVxdWVzdGVkDAEcZGVwb3NpdDEIAXBPcHRpb248KEFjY291bnRJZCwgQmFsYW5jZSk+AAEUY291bnQQAQx1MzIAAQxsZW5hAgEsT3B0aW9uPHUzMj4AAQAAMQgEGE9wdGlvbgQEVAERBAEIEE5vbmUAAAAQU29tZQQAEQQAAAEAADUICDxwYWxsZXRfcHJlaW1hZ2U0UmVxdWVzdFN0YXR1cwgkQWNjb3VudElkAQAYVGlja2V0ATkIAQgsVW5yZXF1ZXN0ZWQIARh0aWNrZXQ9CAFMKEFjY291bnRJZCwgVGlja2V0KQABDGxlbhABDHUzMgAAACRSZXF1ZXN0ZWQMATBtYXliZV90aWNrZXRBCAFsT3B0aW9uPChBY2NvdW50SWQsIFRpY2tldCk+AAEUY291bnQQAQx1MzIAASRtYXliZV9sZW5hAgEsT3B0aW9uPHUzMj4AAQAAOQgUNGZyYW1lX3N1cHBvcnQYdHJhaXRzGHRva2VucyBmdW5naWJsZURIb2xkQ29uc2lkZXJhdGlvbhQEQQAERgAEUgAERAAIRnAAAAQAGAEoRjo6QmFsYW5jZQAAPQgAAAQIADkIAEEIBBhPcHRpb24EBFQBPQgBCBBOb25lAAAAEFNvbWUEAD0IAAABAABFCAAABAg0EABJCAxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAQgEUwAABAA4ARhWZWM8VD4AAE0IDDxwYWxsZXRfcHJlaW1hZ2UYcGFsbGV0FEVycm9yBARUAAEkGFRvb0JpZwAABKBQcmVpbWFnZSBpcyB0b28gbGFyZ2UgdG8gc3RvcmUgb24tY2hhaW4uMEFscmVhZHlOb3RlZAABBKRQcmVpbWFnZSBoYXMgYWxyZWFkeSBiZWVuIG5vdGVkIG9uLWNoYWluLjROb3RBdXRob3JpemVkAAIEyFRoZSB1c2VyIGlzIG5vdCBhdXRob3JpemVkIHRvIHBlcmZvcm0gdGhpcyBhY3Rpb24uIE5vdE5vdGVkAAME/FRoZSBwcmVpbWFnZSBjYW5ub3QgYmUgcmVtb3ZlZCBzaW5jZSBpdCBoYXMgbm90IHlldCBiZWVuIG5vdGVkLiRSZXF1ZXN0ZWQABAQJAUEgcHJlaW1hZ2UgbWF5IG5vdCBiZSByZW1vdmVkIHdoZW4gdGhlcmUgYXJlIG91dHN0YW5kaW5nIHJlcXVlc3RzLjBOb3RSZXF1ZXN0ZWQABQQtAVRoZSBwcmVpbWFnZSByZXF1ZXN0IGNhbm5vdCBiZSByZW1vdmVkIHNpbmNlIG5vIG91dHN0YW5kaW5nIHJlcXVlc3RzIGV4aXN0LhxUb29NYW55AAYEVQFNb3JlIHRoYW4gYE1BWF9IQVNIX1VQR1JBREVfQlVMS19DT1VOVGAgaGFzaGVzIHdlcmUgcmVxdWVzdGVkIHRvIGJlIHVwZ3JhZGVkIGF0IG9uY2UuGFRvb0ZldwAHBORUb28gZmV3IGhhc2hlcyB3ZXJlIHJlcXVlc3RlZCB0byBiZSB1cGdyYWRlZCAoaS5lLiB6ZXJvKS4YTm9Db3N0AAgEWQFObyB0aWNrZXQgd2l0aCBhIGNvc3Qgd2FzIHJldHVybmVkIGJ5IFtgQ29uZmlnOjpDb25zaWRlcmF0aW9uYF0gdG8gc3RvcmUgdGhlIHByZWltYWdlLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC5RCAxMYm91bmRlZF9jb2xsZWN0aW9uc0B3ZWFrX2JvdW5kZWRfdmVjOFdlYWtCb3VuZGVkVmVjCARUAVUIBFMAAAQAWQgBGFZlYzxUPgAAVQgAAAQIpQEwAFkIAAACVQgAXQgMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAEEBFMAAAQAYQgBGFZlYzxUPgAAYQgAAAIEAGUIBBhPcHRpb24EBFQBaQgBCBBOb25lAAAAEFNvbWUEAGkIAAABAABpCAxEc3BfY29uc2Vuc3VzX2JhYmUcZGlnZXN0cyRQcmVEaWdlc3QAAQwcUHJpbWFyeQQAbQgBQFByaW1hcnlQcmVEaWdlc3QAAQA4U2Vjb25kYXJ5UGxhaW4EAHUIAVxTZWNvbmRhcnlQbGFpblByZURpZ2VzdAACADBTZWNvbmRhcnlWUkYEAHkIAVRTZWNvbmRhcnlWUkZQcmVEaWdlc3QAAwAAbQgMRHNwX2NvbnNlbnN1c19iYWJlHGRpZ2VzdHNAUHJpbWFyeVByZURpZ2VzdAAADAE8YXV0aG9yaXR5X2luZGV4EAFUc3VwZXI6OkF1dGhvcml0eUluZGV4AAEQc2xvdKkBARBTbG90AAE0dnJmX3NpZ25hdHVyZXEIATBWcmZTaWduYXR1cmUAAHEIEBxzcF9jb3JlHHNyMjU1MTkMdnJmMFZyZlNpZ25hdHVyZQAACAEocHJlX291dHB1dAQBMFZyZlByZU91dHB1dAABFHByb29mSQIBIFZyZlByb29mAAB1CAxEc3BfY29uc2Vuc3VzX2JhYmUcZGlnZXN0c1xTZWNvbmRhcnlQbGFpblByZURpZ2VzdAAACAE8YXV0aG9yaXR5X2luZGV4EAFUc3VwZXI6OkF1dGhvcml0eUluZGV4AAEQc2xvdKkBARBTbG90AAB5CAxEc3BfY29uc2Vuc3VzX2JhYmUcZGlnZXN0c1RTZWNvbmRhcnlWUkZQcmVEaWdlc3QAAAwBPGF1dGhvcml0eV9pbmRleBABVHN1cGVyOjpBdXRob3JpdHlJbmRleAABEHNsb3SpAQEQU2xvdAABNHZyZl9zaWduYXR1cmVxCAEwVnJmU2lnbmF0dXJlAAB9CAhEc3BfY29uc2Vuc3VzX2JhYmVYQmFiZUVwb2NoQ29uZmlndXJhdGlvbgAACAEEY7UBASgodTY0LCB1NjQpAAE0YWxsb3dlZF9zbG90c7kBATBBbGxvd2VkU2xvdHMAAIEIDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBhQgEUwAABACJCAEYVmVjPFQ+AACFCAAABAgwEACJCAAAAoUIAI0IDCxwYWxsZXRfYmFiZRhwYWxsZXQURXJyb3IEBFQAARBgSW52YWxpZEVxdWl2b2NhdGlvblByb29mAAAEMQFBbiBlcXVpdm9jYXRpb24gcHJvb2YgcHJvdmlkZWQgYXMgcGFydCBvZiBhbiBlcXVpdm9jYXRpb24gcmVwb3J0IGlzIGludmFsaWQuYEludmFsaWRLZXlPd25lcnNoaXBQcm9vZgABBDEBQSBrZXkgb3duZXJzaGlwIHByb29mIHByb3ZpZGVkIGFzIHBhcnQgb2YgYW4gZXF1aXZvY2F0aW9uIHJlcG9ydCBpcyBpbnZhbGlkLlhEdXBsaWNhdGVPZmZlbmNlUmVwb3J0AAIEFQFBIGdpdmVuIGVxdWl2b2NhdGlvbiByZXBvcnQgaXMgdmFsaWQgYnV0IGFscmVhZHkgcHJldmlvdXNseSByZXBvcnRlZC5QSW52YWxpZENvbmZpZ3VyYXRpb24AAwSMU3VibWl0dGVkIGNvbmZpZ3VyYXRpb24gaXMgaW52YWxpZC4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQukQgAAAQMABggAJUIDDhwYWxsZXRfaW5kaWNlcxhwYWxsZXQURXJyb3IEBFQAARQsTm90QXNzaWduZWQAAASMVGhlIGluZGV4IHdhcyBub3QgYWxyZWFkeSBhc3NpZ25lZC4gTm90T3duZXIAAQSkVGhlIGluZGV4IGlzIGFzc2lnbmVkIHRvIGFub3RoZXIgYWNjb3VudC4USW5Vc2UAAgRwVGhlIGluZGV4IHdhcyBub3QgYXZhaWxhYmxlLixOb3RUcmFuc2ZlcgADBMhUaGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBhY2NvdW50cyBhcmUgaWRlbnRpY2FsLiRQZXJtYW5lbnQABATQVGhlIGluZGV4IGlzIHBlcm1hbmVudCBhbmQgbWF5IG5vdCBiZSBmcmVlZC9jaGFuZ2VkLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC6ZCAxMYm91bmRlZF9jb2xsZWN0aW9uc0B3ZWFrX2JvdW5kZWRfdmVjOFdlYWtCb3VuZGVkVmVjCARUAZ0IBFMAAAQApQgBGFZlYzxUPgAAnQgMPHBhbGxldF9iYWxhbmNlcxR0eXBlcyxCYWxhbmNlTG9jawQcQmFsYW5jZQEYAAwBCGlksQUBOExvY2tJZGVudGlmaWVyAAEYYW1vdW50GAEcQmFsYW5jZQABHHJlYXNvbnOhCAEcUmVhc29ucwAAoQgMPHBhbGxldF9iYWxhbmNlcxR0eXBlcxxSZWFzb25zAAEMDEZlZQAAABBNaXNjAAEADEFsbAACAAClCAAAAp0IAKkIDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBrQgEUwAABACxCAEYVmVjPFQ+AACtCAw8cGFsbGV0X2JhbGFuY2VzFHR5cGVzLFJlc2VydmVEYXRhCERSZXNlcnZlSWRlbnRpZmllcgGxBRxCYWxhbmNlARgACAEIaWSxBQFEUmVzZXJ2ZUlkZW50aWZpZXIAARhhbW91bnQYARxCYWxhbmNlAACxCAAAAq0IALUIDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBuQgEUwAABADJCAEYVmVjPFQ+AAC5CBQ0ZnJhbWVfc3VwcG9ydBh0cmFpdHMYdG9rZW5zEG1pc2MgSWRBbW91bnQICElkAb0IHEJhbGFuY2UBGAAIAQhpZL0IAQhJZAABGGFtb3VudBgBHEJhbGFuY2UAAL0ICDRwYXNlb19ydW50aW1lRFJ1bnRpbWVIb2xkUmVhc29uAAEIIFByZWltYWdlBADBCAFscGFsbGV0X3ByZWltYWdlOjpIb2xkUmVhc29uAAoASFN0YXRlVHJpZU1pZ3JhdGlvbgQAxQgBnHBhbGxldF9zdGF0ZV90cmllX21pZ3JhdGlvbjo6SG9sZFJlYXNvbgBiAADBCAw8cGFsbGV0X3ByZWltYWdlGHBhbGxldChIb2xkUmVhc29uAAEEIFByZWltYWdlAAAAAMUIDGxwYWxsZXRfc3RhdGVfdHJpZV9taWdyYXRpb24YcGFsbGV0KEhvbGRSZWFzb24AAQQ8U2xhc2hGb3JNaWdyYXRlAAAAAMkIAAACuQgAzQgMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAHRCARTAAAEAN0IARhWZWM8VD4AANEIFDRmcmFtZV9zdXBwb3J0GHRyYWl0cxh0b2tlbnMQbWlzYyBJZEFtb3VudAgISWQB1QgcQmFsYW5jZQEYAAgBCGlk1QgBCElkAAEYYW1vdW50GAEcQmFsYW5jZQAA1QgINHBhc2VvX3J1bnRpbWVMUnVudGltZUZyZWV6ZVJlYXNvbgABBDxOb21pbmF0aW9uUG9vbHMEANkIAZRwYWxsZXRfbm9taW5hdGlvbl9wb29sczo6RnJlZXplUmVhc29uACcAANkIDFxwYWxsZXRfbm9taW5hdGlvbl9wb29scxhwYWxsZXQwRnJlZXplUmVhc29uAAEEOFBvb2xNaW5CYWxhbmNlAAAAAN0IAAAC0QgA4QgMPHBhbGxldF9iYWxhbmNlcxhwYWxsZXQURXJyb3IIBFQABEkAATA4VmVzdGluZ0JhbGFuY2UAAAScVmVzdGluZyBiYWxhbmNlIHRvbyBoaWdoIHRvIHNlbmQgdmFsdWUuVExpcXVpZGl0eVJlc3RyaWN0aW9ucwABBMhBY2NvdW50IGxpcXVpZGl0eSByZXN0cmljdGlvbnMgcHJldmVudCB3aXRoZHJhd2FsLkxJbnN1ZmZpY2llbnRCYWxhbmNlAAIEeEJhbGFuY2UgdG9vIGxvdyB0byBzZW5kIHZhbHVlLkhFeGlzdGVudGlhbERlcG9zaXQAAwTsVmFsdWUgdG9vIGxvdyB0byBjcmVhdGUgYWNjb3VudCBkdWUgdG8gZXhpc3RlbnRpYWwgZGVwb3NpdC40RXhwZW5kYWJpbGl0eQAEBJBUcmFuc2Zlci9wYXltZW50IHdvdWxkIGtpbGwgYWNjb3VudC5cRXhpc3RpbmdWZXN0aW5nU2NoZWR1bGUABQTMQSB2ZXN0aW5nIHNjaGVkdWxlIGFscmVhZHkgZXhpc3RzIGZvciB0aGlzIGFjY291bnQuLERlYWRBY2NvdW50AAYEjEJlbmVmaWNpYXJ5IGFjY291bnQgbXVzdCBwcmUtZXhpc3QuPFRvb01hbnlSZXNlcnZlcwAHBLhOdW1iZXIgb2YgbmFtZWQgcmVzZXJ2ZXMgZXhjZWVkIGBNYXhSZXNlcnZlc2AuMFRvb01hbnlIb2xkcwAIBPhOdW1iZXIgb2YgaG9sZHMgZXhjZWVkIGBWYXJpYW50Q291bnRPZjxUOjpSdW50aW1lSG9sZFJlYXNvbj5gLjhUb29NYW55RnJlZXplcwAJBJhOdW1iZXIgb2YgZnJlZXplcyBleGNlZWQgYE1heEZyZWV6ZXNgLkxJc3N1YW5jZURlYWN0aXZhdGVkAAoEAQFUaGUgaXNzdWFuY2UgY2Fubm90IGJlIG1vZGlmaWVkIHNpbmNlIGl0IGlzIGFscmVhZHkgZGVhY3RpdmF0ZWQuJERlbHRhWmVybwALBGRUaGUgZGVsdGEgY2Fubm90IGJlIHplcm8uBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LuUICGhwYWxsZXRfdHJhbnNhY3Rpb25fcGF5bWVudCBSZWxlYXNlcwABCCRWMUFuY2llbnQAAAAIVjIAAQAA6QgIOHBhbGxldF9zdGFraW5nNFN0YWtpbmdMZWRnZXIEBFQAABQBFHN0YXNoAAEwVDo6QWNjb3VudElkAAEUdG90YWz8ATBCYWxhbmNlT2Y8VD4AARhhY3RpdmX8ATBCYWxhbmNlT2Y8VD4AASR1bmxvY2tpbmcJAgHwQm91bmRlZFZlYzxVbmxvY2tDaHVuazxCYWxhbmNlT2Y8VD4+LCBUOjpNYXhVbmxvY2tpbmdDaHVua3M+AAFYbGVnYWN5X2NsYWltZWRfcmV3YXJkc+0IAZRCb3VuZGVkVmVjPEVyYUluZGV4LCBUOjpIaXN0b3J5RGVwdGg+AADtCAxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUARAEUwAABADlAQEYVmVjPFQ+AADxCAg4cGFsbGV0X3N0YWtpbmcsTm9taW5hdGlvbnMEBFQAAAwBHHRhcmdldHP1CAG0Qm91bmRlZFZlYzxUOjpBY2NvdW50SWQsIE1heE5vbWluYXRpb25zT2Y8VD4+AAEwc3VibWl0dGVkX2luEAEgRXJhSW5kZXgAAShzdXBwcmVzc2VkIAEQYm9vbAAA9QgMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAEABFMAAAQA0QEBGFZlYzxUPgAA+QgIOHBhbGxldF9zdGFraW5nNEFjdGl2ZUVyYUluZm8AAAgBFGluZGV4EAEgRXJhSW5kZXgAARRzdGFydP0IASxPcHRpb248dTY0PgAA/QgEGE9wdGlvbgQEVAEwAQgQTm9uZQAAABBTb21lBAAwAAABAAABCQAABAgQAAAFCQgoc3Bfc3Rha2luZyBFeHBvc3VyZQgkQWNjb3VudElkAQAcQmFsYW5jZQEYAAwBFHRvdGFs/AEcQmFsYW5jZQABDG93bvwBHEJhbGFuY2UAARhvdGhlcnMJCQGsVmVjPEluZGl2aWR1YWxFeHBvc3VyZTxBY2NvdW50SWQsIEJhbGFuY2U+PgAACQkAAAINCQANCQgoc3Bfc3Rha2luZ0hJbmRpdmlkdWFsRXhwb3N1cmUIJEFjY291bnRJZAEAHEJhbGFuY2UBGAAIAQx3aG8AASRBY2NvdW50SWQAARR2YWx1ZfwBHEJhbGFuY2UAABEJCChzcF9zdGFraW5nVFBhZ2VkRXhwb3N1cmVNZXRhZGF0YQQcQmFsYW5jZQEYABABFHRvdGFs/AEcQmFsYW5jZQABDG93bvwBHEJhbGFuY2UAATxub21pbmF0b3JfY291bnQQAQx1MzIAAShwYWdlX2NvdW50EAEQUGFnZQAAFQkAAAQMEAAQABkJCChzcF9zdGFraW5nMEV4cG9zdXJlUGFnZQgkQWNjb3VudElkAQAcQmFsYW5jZQEYAAgBKHBhZ2VfdG90YWz8ARxCYWxhbmNlAAEYb3RoZXJzCQkBrFZlYzxJbmRpdmlkdWFsRXhwb3N1cmU8QWNjb3VudElkLCBCYWxhbmNlPj4AAB0JCDhwYWxsZXRfc3Rha2luZzxFcmFSZXdhcmRQb2ludHMEJEFjY291bnRJZAEAAAgBFHRvdGFsEAEsUmV3YXJkUG9pbnQAAShpbmRpdmlkdWFsIQkBgEJUcmVlTWFwPEFjY291bnRJZCwgUmV3YXJkUG9pbnQ+AAAhCQQgQlRyZWVNYXAIBEsBAARWARAABAAlCQAAACUJAAACKQkAKQkAAAQIABAALQkAAAIxCQAxCQg4cGFsbGV0X3N0YWtpbmc4VW5hcHBsaWVkU2xhc2gIJEFjY291bnRJZAEAHEJhbGFuY2UBGAAUASR2YWxpZGF0b3IAASRBY2NvdW50SWQAAQxvd24YARxCYWxhbmNlAAEYb3RoZXJzDQQBZFZlYzwoQWNjb3VudElkLCBCYWxhbmNlKT4AASRyZXBvcnRlcnPRAQE4VmVjPEFjY291bnRJZD4AARhwYXlvdXQYARxCYWxhbmNlAAA1CQAABAisGAA5CQw4cGFsbGV0X3N0YWtpbmcgc2xhc2hpbmc0U2xhc2hpbmdTcGFucwAAEAEoc3Bhbl9pbmRleBABJFNwYW5JbmRleAABKGxhc3Rfc3RhcnQQASBFcmFJbmRleAABSGxhc3Rfbm9uemVyb19zbGFzaBABIEVyYUluZGV4AAEUcHJpb3LlAQE0VmVjPEVyYUluZGV4PgAAPQkMOHBhbGxldF9zdGFraW5nIHNsYXNoaW5nKFNwYW5SZWNvcmQEHEJhbGFuY2UBGAAIARxzbGFzaGVkGAEcQmFsYW5jZQABIHBhaWRfb3V0GAEcQmFsYW5jZQAAQQkQOHBhbGxldF9zdGFraW5nGHBhbGxldBhwYWxsZXQURXJyb3IEBFQAAXw0Tm90Q29udHJvbGxlcgAABGROb3QgYSBjb250cm9sbGVyIGFjY291bnQuIE5vdFN0YXNoAAEEUE5vdCBhIHN0YXNoIGFjY291bnQuNEFscmVhZHlCb25kZWQAAgRgU3Rhc2ggaXMgYWxyZWFkeSBib25kZWQuNEFscmVhZHlQYWlyZWQAAwR0Q29udHJvbGxlciBpcyBhbHJlYWR5IHBhaXJlZC4wRW1wdHlUYXJnZXRzAAQEYFRhcmdldHMgY2Fubm90IGJlIGVtcHR5LjhEdXBsaWNhdGVJbmRleAAFBEBEdXBsaWNhdGUgaW5kZXguREludmFsaWRTbGFzaEluZGV4AAYEhFNsYXNoIHJlY29yZCBpbmRleCBvdXQgb2YgYm91bmRzLkBJbnN1ZmZpY2llbnRCb25kAAcMWQFDYW5ub3QgaGF2ZSBhIHZhbGlkYXRvciBvciBub21pbmF0b3Igcm9sZSwgd2l0aCB2YWx1ZSBsZXNzIHRoYW4gdGhlIG1pbmltdW0gZGVmaW5lZCBieT0BZ292ZXJuYW5jZSAoc2VlIGBNaW5WYWxpZGF0b3JCb25kYCBhbmQgYE1pbk5vbWluYXRvckJvbmRgKS4gSWYgdW5ib25kaW5nIGlzIHRoZRUBaW50ZW50aW9uLCBgY2hpbGxgIGZpcnN0IHRvIHJlbW92ZSBvbmUncyByb2xlIGFzIHZhbGlkYXRvci9ub21pbmF0b3IuME5vTW9yZUNodW5rcwAIBJBDYW4gbm90IHNjaGVkdWxlIG1vcmUgdW5sb2NrIGNodW5rcy40Tm9VbmxvY2tDaHVuawAJBKBDYW4gbm90IHJlYm9uZCB3aXRob3V0IHVubG9ja2luZyBjaHVua3MuMEZ1bmRlZFRhcmdldAAKBMhBdHRlbXB0aW5nIHRvIHRhcmdldCBhIHN0YXNoIHRoYXQgc3RpbGwgaGFzIGZ1bmRzLkhJbnZhbGlkRXJhVG9SZXdhcmQACwRYSW52YWxpZCBlcmEgdG8gcmV3YXJkLmhJbnZhbGlkTnVtYmVyT2ZOb21pbmF0aW9ucwAMBHhJbnZhbGlkIG51bWJlciBvZiBub21pbmF0aW9ucy5ITm90U29ydGVkQW5kVW5pcXVlAA0EgEl0ZW1zIGFyZSBub3Qgc29ydGVkIGFuZCB1bmlxdWUuOEFscmVhZHlDbGFpbWVkAA4ECQFSZXdhcmRzIGZvciB0aGlzIGVyYSBoYXZlIGFscmVhZHkgYmVlbiBjbGFpbWVkIGZvciB0aGlzIHZhbGlkYXRvci4sSW52YWxpZFBhZ2UADwSETm8gbm9taW5hdG9ycyBleGlzdCBvbiB0aGlzIHBhZ2UuVEluY29ycmVjdEhpc3RvcnlEZXB0aAAQBMBJbmNvcnJlY3QgcHJldmlvdXMgaGlzdG9yeSBkZXB0aCBpbnB1dCBwcm92aWRlZC5YSW5jb3JyZWN0U2xhc2hpbmdTcGFucwARBLBJbmNvcnJlY3QgbnVtYmVyIG9mIHNsYXNoaW5nIHNwYW5zIHByb3ZpZGVkLiBCYWRTdGF0ZQASBDkBSW50ZXJuYWwgc3RhdGUgaGFzIGJlY29tZSBzb21laG93IGNvcnJ1cHRlZCBhbmQgdGhlIG9wZXJhdGlvbiBjYW5ub3QgY29udGludWUuOFRvb01hbnlUYXJnZXRzABMElFRvbyBtYW55IG5vbWluYXRpb24gdGFyZ2V0cyBzdXBwbGllZC4kQmFkVGFyZ2V0ABQEPQFBIG5vbWluYXRpb24gdGFyZ2V0IHdhcyBzdXBwbGllZCB0aGF0IHdhcyBibG9ja2VkIG9yIG90aGVyd2lzZSBub3QgYSB2YWxpZGF0b3IuQENhbm5vdENoaWxsT3RoZXIAFQRVAVRoZSB1c2VyIGhhcyBlbm91Z2ggYm9uZCBhbmQgdGh1cyBjYW5ub3QgYmUgY2hpbGxlZCBmb3JjZWZ1bGx5IGJ5IGFuIGV4dGVybmFsIHBlcnNvbi5EVG9vTWFueU5vbWluYXRvcnMAFghNAVRoZXJlIGFyZSB0b28gbWFueSBub21pbmF0b3JzIGluIHRoZSBzeXN0ZW0uIEdvdmVybmFuY2UgbmVlZHMgdG8gYWRqdXN0IHRoZSBzdGFraW5ntHNldHRpbmdzIHRvIGtlZXAgdGhpbmdzIHNhZmUgZm9yIHRoZSBydW50aW1lLkRUb29NYW55VmFsaWRhdG9ycwAXCFUBVGhlcmUgYXJlIHRvbyBtYW55IHZhbGlkYXRvciBjYW5kaWRhdGVzIGluIHRoZSBzeXN0ZW0uIEdvdmVybmFuY2UgbmVlZHMgdG8gYWRqdXN0IHRoZdRzdGFraW5nIHNldHRpbmdzIHRvIGtlZXAgdGhpbmdzIHNhZmUgZm9yIHRoZSBydW50aW1lLkBDb21taXNzaW9uVG9vTG93ABgE4ENvbW1pc3Npb24gaXMgdG9vIGxvdy4gTXVzdCBiZSBhdCBsZWFzdCBgTWluQ29tbWlzc2lvbmAuLEJvdW5kTm90TWV0ABkEWFNvbWUgYm91bmQgaXMgbm90IG1ldC5QQ29udHJvbGxlckRlcHJlY2F0ZWQAGgQBAVVzZWQgd2hlbiBhdHRlbXB0aW5nIHRvIHVzZSBkZXByZWNhdGVkIGNvbnRyb2xsZXIgYWNjb3VudCBsb2dpYy5MQ2Fubm90UmVzdG9yZUxlZGdlcgAbBFhDYW5ub3QgcmVzZXQgYSBsZWRnZXIubFJld2FyZERlc3RpbmF0aW9uUmVzdHJpY3RlZAAcBKxQcm92aWRlZCByZXdhcmQgZGVzdGluYXRpb24gaXMgbm90IGFsbG93ZWQuOE5vdEVub3VnaEZ1bmRzAB0EnE5vdCBlbm91Z2ggZnVuZHMgYXZhaWxhYmxlIHRvIHdpdGhkcmF3LlxWaXJ0dWFsU3Rha2VyTm90QWxsb3dlZAAeBKhPcGVyYXRpb24gbm90IGFsbG93ZWQgZm9yIHZpcnR1YWwgc3Rha2Vycy4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQuRQkMKHNwX3N0YWtpbmccb2ZmZW5jZThPZmZlbmNlRGV0YWlscwggUmVwb3J0ZXIBACBPZmZlbmRlcgFJCQAIASBvZmZlbmRlckkJASBPZmZlbmRlcgABJHJlcG9ydGVyc9EBATRWZWM8UmVwb3J0ZXI+AABJCQAABAgABQkATQkAAAQIwDgAUQkAAAJVCQBVCQAABAgAGQIAWQkAAAQIXQk4AF0JDBxzcF9jb3JlGGNyeXB0byRLZXlUeXBlSWQAAAQASAEcW3U4OyA0XQAAYQkMOHBhbGxldF9zZXNzaW9uGHBhbGxldBRFcnJvcgQEVAABFDBJbnZhbGlkUHJvb2YAAARgSW52YWxpZCBvd25lcnNoaXAgcHJvb2YuXE5vQXNzb2NpYXRlZFZhbGlkYXRvcklkAAEEnE5vIGFzc29jaWF0ZWQgdmFsaWRhdG9yIElEIGZvciBhY2NvdW50LjREdXBsaWNhdGVkS2V5AAIEZFJlZ2lzdGVyZWQgZHVwbGljYXRlIGtleS4YTm9LZXlzAAMEpE5vIGtleXMgYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGFjY291bnQuJE5vQWNjb3VudAAEBBkBS2V5IHNldHRpbmcgYWNjb3VudCBpcyBub3QgbGl2ZSwgc28gaXQncyBpbXBvc3NpYmxlIHRvIGFzc29jaWF0ZSBrZXlzLgR0RXJyb3IgZm9yIHRoZSBzZXNzaW9uIHBhbGxldC5lCQg4cGFsbGV0X2dyYW5kcGEsU3RvcmVkU3RhdGUEBE4BEAEQEExpdmUAAAAwUGVuZGluZ1BhdXNlCAEwc2NoZWR1bGVkX2F0EAEETgABFGRlbGF5EAEETgABABhQYXVzZWQAAgA0UGVuZGluZ1Jlc3VtZQgBMHNjaGVkdWxlZF9hdBABBE4AARRkZWxheRABBE4AAwAAaQkIOHBhbGxldF9ncmFuZHBhTFN0b3JlZFBlbmRpbmdDaGFuZ2UIBE4BEBRMaW1pdAAAEAEwc2NoZWR1bGVkX2F0EAEETgABFGRlbGF5EAEETgABQG5leHRfYXV0aG9yaXRpZXNtCQFsQm91bmRlZEF1dGhvcml0eUxpc3Q8TGltaXQ+AAEYZm9yY2VkYQIBJE9wdGlvbjxOPgAAbQkMTGJvdW5kZWRfY29sbGVjdGlvbnNAd2Vha19ib3VuZGVkX3ZlYzhXZWFrQm91bmRlZFZlYwgEVAHQBFMAAAQAzAEYVmVjPFQ+AABxCQw4cGFsbGV0X2dyYW5kcGEYcGFsbGV0FEVycm9yBARUAAEcLFBhdXNlRmFpbGVkAAAIBQFBdHRlbXB0IHRvIHNpZ25hbCBHUkFORFBBIHBhdXNlIHdoZW4gdGhlIGF1dGhvcml0eSBzZXQgaXNuJ3QgbGl2ZaQoZWl0aGVyIHBhdXNlZCBvciBhbHJlYWR5IHBlbmRpbmcgcGF1c2UpLjBSZXN1bWVGYWlsZWQAAQgRAUF0dGVtcHQgdG8gc2lnbmFsIEdSQU5EUEEgcmVzdW1lIHdoZW4gdGhlIGF1dGhvcml0eSBzZXQgaXNuJ3QgcGF1c2VkoChlaXRoZXIgbGl2ZSBvciBhbHJlYWR5IHBlbmRpbmcgcmVzdW1lKS40Q2hhbmdlUGVuZGluZwACBOhBdHRlbXB0IHRvIHNpZ25hbCBHUkFORFBBIGNoYW5nZSB3aXRoIG9uZSBhbHJlYWR5IHBlbmRpbmcuHFRvb1Nvb24AAwS8Q2Fubm90IHNpZ25hbCBmb3JjZWQgY2hhbmdlIHNvIHNvb24gYWZ0ZXIgbGFzdC5gSW52YWxpZEtleU93bmVyc2hpcFByb29mAAQEMQFBIGtleSBvd25lcnNoaXAgcHJvb2YgcHJvdmlkZWQgYXMgcGFydCBvZiBhbiBlcXVpdm9jYXRpb24gcmVwb3J0IGlzIGludmFsaWQuYEludmFsaWRFcXVpdm9jYXRpb25Qcm9vZgAFBDEBQW4gZXF1aXZvY2F0aW9uIHByb29mIHByb3ZpZGVkIGFzIHBhcnQgb2YgYW4gZXF1aXZvY2F0aW9uIHJlcG9ydCBpcyBpbnZhbGlkLlhEdXBsaWNhdGVPZmZlbmNlUmVwb3J0AAYEFQFBIGdpdmVuIGVxdWl2b2NhdGlvbiByZXBvcnQgaXMgdmFsaWQgYnV0IGFscmVhZHkgcHJldmlvdXNseSByZXBvcnRlZC4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQudQkMTGJvdW5kZWRfY29sbGVjdGlvbnNAd2Vha19ib3VuZGVkX3ZlYzhXZWFrQm91bmRlZFZlYwgEVAElAgRTAAAEAHkJARhWZWM8VD4AAHkJAAACJQIAfQkIPHBhbGxldF90cmVhc3VyeSBQcm9wb3NhbAgkQWNjb3VudElkAQAcQmFsYW5jZQEYABABIHByb3Bvc2VyAAEkQWNjb3VudElkAAEUdmFsdWUYARxCYWxhbmNlAAEsYmVuZWZpY2lhcnkAASRBY2NvdW50SWQAARBib25kGAEcQmFsYW5jZQAAgQkMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAEQBFMAAAQA5QEBGFZlYzxUPgAAhQkIPHBhbGxldF90cmVhc3VyeSxTcGVuZFN0YXR1cxQkQXNzZXRLaW5kAdwwQXNzZXRCYWxhbmNlARgsQmVuZWZpY2lhcnkBRQEsQmxvY2tOdW1iZXIBECRQYXltZW50SWQBMAAYAShhc3NldF9raW5k3AEkQXNzZXRLaW5kAAEYYW1vdW50GAEwQXNzZXRCYWxhbmNlAAEsYmVuZWZpY2lhcnlFAQEsQmVuZWZpY2lhcnkAASh2YWxpZF9mcm9tEAEsQmxvY2tOdW1iZXIAASRleHBpcmVfYXQQASxCbG9ja051bWJlcgABGHN0YXR1c4kJAVxQYXltZW50U3RhdGU8UGF5bWVudElkPgAAiQkIPHBhbGxldF90cmVhc3VyeTBQYXltZW50U3RhdGUECElkATABDBxQZW5kaW5nAAAAJEF0dGVtcHRlZAQBCGlkMAEISWQAAQAYRmFpbGVkAAIAAI0JDDRzcF9hcml0aG1ldGljKHBlcl90aGluZ3McUGVybWlsbAAABAAQAQx1MzIAAJEJCDRmcmFtZV9zdXBwb3J0IFBhbGxldElkAAAEALEFARxbdTg7IDhdAACVCQw8cGFsbGV0X3RyZWFzdXJ5GHBhbGxldBRFcnJvcggEVAAESQABLDBJbnZhbGlkSW5kZXgAAASsTm8gcHJvcG9zYWwsIGJvdW50eSBvciBzcGVuZCBhdCB0aGF0IGluZGV4LkBUb29NYW55QXBwcm92YWxzAAEEgFRvbyBtYW55IGFwcHJvdmFscyBpbiB0aGUgcXVldWUuWEluc3VmZmljaWVudFBlcm1pc3Npb24AAghFAVRoZSBzcGVuZCBvcmlnaW4gaXMgdmFsaWQgYnV0IHRoZSBhbW91bnQgaXQgaXMgYWxsb3dlZCB0byBzcGVuZCBpcyBsb3dlciB0aGFuIHRoZUxhbW91bnQgdG8gYmUgc3BlbnQuTFByb3Bvc2FsTm90QXBwcm92ZWQAAwR8UHJvcG9zYWwgaGFzIG5vdCBiZWVuIGFwcHJvdmVkLlhGYWlsZWRUb0NvbnZlcnRCYWxhbmNlAAQEUQFUaGUgYmFsYW5jZSBvZiB0aGUgYXNzZXQga2luZCBpcyBub3QgY29udmVydGlibGUgdG8gdGhlIGJhbGFuY2Ugb2YgdGhlIG5hdGl2ZSBhc3NldC4wU3BlbmRFeHBpcmVkAAUEsFRoZSBzcGVuZCBoYXMgZXhwaXJlZCBhbmQgY2Fubm90IGJlIGNsYWltZWQuLEVhcmx5UGF5b3V0AAYEpFRoZSBzcGVuZCBpcyBub3QgeWV0IGVsaWdpYmxlIGZvciBwYXlvdXQuQEFscmVhZHlBdHRlbXB0ZWQABwScVGhlIHBheW1lbnQgaGFzIGFscmVhZHkgYmVlbiBhdHRlbXB0ZWQuLFBheW91dEVycm9yAAgEzFRoZXJlIHdhcyBzb21lIGlzc3VlIHdpdGggdGhlIG1lY2hhbmlzbSBvZiBwYXltZW50LjBOb3RBdHRlbXB0ZWQACQSkVGhlIHBheW91dCB3YXMgbm90IHlldCBhdHRlbXB0ZWQvY2xhaW1lZC4wSW5jb25jbHVzaXZlAAoExFRoZSBwYXltZW50IGhhcyBuZWl0aGVyIGZhaWxlZCBub3Igc3VjY2VlZGVkIHlldC4EeEVycm9yIGZvciB0aGUgdHJlYXN1cnkgcGFsbGV0LpkJAAAECABtAQCdCQxgcGFsbGV0X2NvbnZpY3Rpb25fdm90aW5nEHZvdGUYVm90aW5nFBxCYWxhbmNlARgkQWNjb3VudElkAQAsQmxvY2tOdW1iZXIBECRQb2xsSW5kZXgBECBNYXhWb3RlcwABCBxDYXN0aW5nBAChCQHIQ2FzdGluZzxCYWxhbmNlLCBCbG9ja051bWJlciwgUG9sbEluZGV4LCBNYXhWb3Rlcz4AAAAoRGVsZWdhdGluZwQAuQkBrERlbGVnYXRpbmc8QmFsYW5jZSwgQWNjb3VudElkLCBCbG9ja051bWJlcj4AAQAAoQkMYHBhbGxldF9jb252aWN0aW9uX3ZvdGluZxB2b3RlHENhc3RpbmcQHEJhbGFuY2UBGCxCbG9ja051bWJlcgEQJFBvbGxJbmRleAEQIE1heFZvdGVzAAAMARR2b3Rlc6UJAdxCb3VuZGVkVmVjPChQb2xsSW5kZXgsIEFjY291bnRWb3RlPEJhbGFuY2U+KSwgTWF4Vm90ZXM+AAEsZGVsZWdhdGlvbnOxCQFQRGVsZWdhdGlvbnM8QmFsYW5jZT4AARRwcmlvcrUJAXxQcmlvckxvY2s8QmxvY2tOdW1iZXIsIEJhbGFuY2U+AAClCQxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAakJBFMAAAQArQkBGFZlYzxUPgAAqQkAAAQIEGkCAK0JAAACqQkAsQkMYHBhbGxldF9jb252aWN0aW9uX3ZvdGluZxR0eXBlcyxEZWxlZ2F0aW9ucwQcQmFsYW5jZQEYAAgBFHZvdGVzGAEcQmFsYW5jZQABHGNhcGl0YWwYARxCYWxhbmNlAAC1CQxgcGFsbGV0X2NvbnZpY3Rpb25fdm90aW5nEHZvdGUkUHJpb3JMb2NrCCxCbG9ja051bWJlcgEQHEJhbGFuY2UBGAAIABABLEJsb2NrTnVtYmVyAAAYARxCYWxhbmNlAAC5CQxgcGFsbGV0X2NvbnZpY3Rpb25fdm90aW5nEHZvdGUoRGVsZWdhdGluZwwcQmFsYW5jZQEYJEFjY291bnRJZAEALEJsb2NrTnVtYmVyARAAFAEcYmFsYW5jZRgBHEJhbGFuY2UAARh0YXJnZXQAASRBY2NvdW50SWQAAShjb252aWN0aW9ucQIBKENvbnZpY3Rpb24AASxkZWxlZ2F0aW9uc7EJAVBEZWxlZ2F0aW9uczxCYWxhbmNlPgABFHByaW9ytQkBfFByaW9yTG9jazxCbG9ja051bWJlciwgQmFsYW5jZT4AAL0JDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBwQkEUwAABADFCQEYVmVjPFQ+AADBCQAABAhtARgAxQkAAALBCQDJCQxgcGFsbGV0X2NvbnZpY3Rpb25fdm90aW5nGHBhbGxldBRFcnJvcggEVAAESQABMChOb3RPbmdvaW5nAAAEUFBvbGwgaXMgbm90IG9uZ29pbmcuIE5vdFZvdGVyAAEErFRoZSBnaXZlbiBhY2NvdW50IGRpZCBub3Qgdm90ZSBvbiB0aGUgcG9sbC4wTm9QZXJtaXNzaW9uAAIEyFRoZSBhY3RvciBoYXMgbm8gcGVybWlzc2lvbiB0byBjb25kdWN0IHRoZSBhY3Rpb24uPE5vUGVybWlzc2lvbllldAADBFkBVGhlIGFjdG9yIGhhcyBubyBwZXJtaXNzaW9uIHRvIGNvbmR1Y3QgdGhlIGFjdGlvbiByaWdodCBub3cgYnV0IHdpbGwgZG8gaW4gdGhlIGZ1dHVyZS5EQWxyZWFkeURlbGVnYXRpbmcABASIVGhlIGFjY291bnQgaXMgYWxyZWFkeSBkZWxlZ2F0aW5nLjRBbHJlYWR5Vm90aW5nAAUIVQFUaGUgYWNjb3VudCBjdXJyZW50bHkgaGFzIHZvdGVzIGF0dGFjaGVkIHRvIGl0IGFuZCB0aGUgb3BlcmF0aW9uIGNhbm5vdCBzdWNjZWVkIHVudGlsoHRoZXNlIGFyZSByZW1vdmVkIHRocm91Z2ggYHJlbW92ZV92b3RlYC5ESW5zdWZmaWNpZW50RnVuZHMABgT8VG9vIGhpZ2ggYSBiYWxhbmNlIHdhcyBwcm92aWRlZCB0aGF0IHRoZSBhY2NvdW50IGNhbm5vdCBhZmZvcmQuNE5vdERlbGVnYXRpbmcABwSgVGhlIGFjY291bnQgaXMgbm90IGN1cnJlbnRseSBkZWxlZ2F0aW5nLiBOb25zZW5zZQAIBJREZWxlZ2F0aW9uIHRvIG9uZXNlbGYgbWFrZXMgbm8gc2Vuc2UuPE1heFZvdGVzUmVhY2hlZAAJBIBNYXhpbXVtIG51bWJlciBvZiB2b3RlcyByZWFjaGVkLixDbGFzc05lZWRlZAAKBDkBVGhlIGNsYXNzIG11c3QgYmUgc3VwcGxpZWQgc2luY2UgaXQgaXMgbm90IGVhc2lseSBkZXRlcm1pbmFibGUgZnJvbSB0aGUgc3RhdGUuIEJhZENsYXNzAAsEhFRoZSBjbGFzcyBJRCBzdXBwbGllZCBpcyBpbnZhbGlkLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC7NCQxAcGFsbGV0X3JlZmVyZW5kYRR0eXBlczhSZWZlcmVuZHVtSW5mbyAcVHJhY2tJZAFtATRSdW50aW1lT3JpZ2luAX0CGE1vbWVudAEQEENhbGwBcQEcQmFsYW5jZQEYFFRhbGx5AQ0HJEFjY291bnRJZAEAPFNjaGVkdWxlQWRkcmVzcwGAARgcT25nb2luZwQA0QkBjQFSZWZlcmVuZHVtU3RhdHVzPFRyYWNrSWQsIFJ1bnRpbWVPcmlnaW4sIE1vbWVudCwgQ2FsbCwgQmFsYW5jZSwgVGFsbHksCkFjY291bnRJZCwgU2NoZWR1bGVBZGRyZXNzLD4AAAAgQXBwcm92ZWQMABABGE1vbWVudAAA2QkBjE9wdGlvbjxEZXBvc2l0PEFjY291bnRJZCwgQmFsYW5jZT4+AADZCQGMT3B0aW9uPERlcG9zaXQ8QWNjb3VudElkLCBCYWxhbmNlPj4AAQAgUmVqZWN0ZWQMABABGE1vbWVudAAA2QkBjE9wdGlvbjxEZXBvc2l0PEFjY291bnRJZCwgQmFsYW5jZT4+AADZCQGMT3B0aW9uPERlcG9zaXQ8QWNjb3VudElkLCBCYWxhbmNlPj4AAgAkQ2FuY2VsbGVkDAAQARhNb21lbnQAANkJAYxPcHRpb248RGVwb3NpdDxBY2NvdW50SWQsIEJhbGFuY2U+PgAA2QkBjE9wdGlvbjxEZXBvc2l0PEFjY291bnRJZCwgQmFsYW5jZT4+AAMAIFRpbWVkT3V0DAAQARhNb21lbnQAANkJAYxPcHRpb248RGVwb3NpdDxBY2NvdW50SWQsIEJhbGFuY2U+PgAA2QkBjE9wdGlvbjxEZXBvc2l0PEFjY291bnRJZCwgQmFsYW5jZT4+AAQAGEtpbGxlZAQAEAEYTW9tZW50AAUAANEJDEBwYWxsZXRfcmVmZXJlbmRhFHR5cGVzQFJlZmVyZW5kdW1TdGF0dXMgHFRyYWNrSWQBbQE0UnVudGltZU9yaWdpbgF9AhhNb21lbnQBEBBDYWxsAXEBHEJhbGFuY2UBGBRUYWxseQENByRBY2NvdW50SWQBADxTY2hlZHVsZUFkZHJlc3MBgAAsARR0cmFja20BARxUcmFja0lkAAEYb3JpZ2lufQIBNFJ1bnRpbWVPcmlnaW4AASBwcm9wb3NhbHEBARBDYWxsAAEkZW5hY3RtZW50mQIBUERpc3BhdGNoVGltZTxNb21lbnQ+AAEkc3VibWl0dGVkEAEYTW9tZW50AAFIc3VibWlzc2lvbl9kZXBvc2l01QkBbERlcG9zaXQ8QWNjb3VudElkLCBCYWxhbmNlPgABQGRlY2lzaW9uX2RlcG9zaXTZCQGMT3B0aW9uPERlcG9zaXQ8QWNjb3VudElkLCBCYWxhbmNlPj4AASBkZWNpZGluZ90JAXhPcHRpb248RGVjaWRpbmdTdGF0dXM8TW9tZW50Pj4AARR0YWxseQ0HARRUYWxseQABIGluX3F1ZXVlIAEQYm9vbAABFGFsYXJt5QkBhE9wdGlvbjwoTW9tZW50LCBTY2hlZHVsZUFkZHJlc3MpPgAA1QkMQHBhbGxldF9yZWZlcmVuZGEUdHlwZXMcRGVwb3NpdAgkQWNjb3VudElkAQAcQmFsYW5jZQEYAAgBDHdobwABJEFjY291bnRJZAABGGFtb3VudBgBHEJhbGFuY2UAANkJBBhPcHRpb24EBFQB1QkBCBBOb25lAAAAEFNvbWUEANUJAAABAADdCQQYT3B0aW9uBARUAeEJAQgQTm9uZQAAABBTb21lBADhCQAAAQAA4QkMQHBhbGxldF9yZWZlcmVuZGEUdHlwZXM4RGVjaWRpbmdTdGF0dXMELEJsb2NrTnVtYmVyARAACAEUc2luY2UQASxCbG9ja051bWJlcgABKGNvbmZpcm1pbmdhAgFMT3B0aW9uPEJsb2NrTnVtYmVyPgAA5QkEGE9wdGlvbgQEVAHpCQEIEE5vbmUAAAAQU29tZQQA6QkAAAEAAOkJAAAECBCAAO0JDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQB8QkEUwAABAD1CQEYVmVjPFQ+AADxCQAABAgQGAD1CQAAAvEJAPkJAAAC/QkA/QkAAAQIbQEBCgABCgxAcGFsbGV0X3JlZmVyZW5kYRR0eXBlcyRUcmFja0luZm8IHEJhbGFuY2UBGBhNb21lbnQBEAAkARBuYW1l4QcBMCYnc3RhdGljIHN0cgABMG1heF9kZWNpZGluZxABDHUzMgABQGRlY2lzaW9uX2RlcG9zaXQYARxCYWxhbmNlAAE4cHJlcGFyZV9wZXJpb2QQARhNb21lbnQAATxkZWNpc2lvbl9wZXJpb2QQARhNb21lbnQAAThjb25maXJtX3BlcmlvZBABGE1vbWVudAABUG1pbl9lbmFjdG1lbnRfcGVyaW9kEAEYTW9tZW50AAEwbWluX2FwcHJvdmFsBQoBFEN1cnZlAAEsbWluX3N1cHBvcnQFCgEUQ3VydmUAAAUKDEBwYWxsZXRfcmVmZXJlbmRhFHR5cGVzFEN1cnZlAAEMQExpbmVhckRlY3JlYXNpbmcMARhsZW5ndGisARxQZXJiaWxsAAEUZmxvb3KsARxQZXJiaWxsAAEQY2VpbKwBHFBlcmJpbGwAAABEU3RlcHBlZERlY3JlYXNpbmcQARRiZWdpbqwBHFBlcmJpbGwAAQxlbmSsARxQZXJiaWxsAAEQc3RlcKwBHFBlcmJpbGwAARhwZXJpb2SsARxQZXJiaWxsAAEAKFJlY2lwcm9jYWwMARhmYWN0b3IJCgEgRml4ZWRJNjQAASB4X29mZnNldAkKASBGaXhlZEk2NAABIHlfb2Zmc2V0CQoBIEZpeGVkSTY0AAIAAAkKDDRzcF9hcml0aG1ldGljLGZpeGVkX3BvaW50IEZpeGVkSTY0AAAEAA0KAQxpNjQAAA0KAAAFDAARCgxAcGFsbGV0X3JlZmVyZW5kYRhwYWxsZXQURXJyb3IIBFQABEkAATgoTm90T25nb2luZwAABGhSZWZlcmVuZHVtIGlzIG5vdCBvbmdvaW5nLihIYXNEZXBvc2l0AAEEuFJlZmVyZW5kdW0ncyBkZWNpc2lvbiBkZXBvc2l0IGlzIGFscmVhZHkgcGFpZC4gQmFkVHJhY2sAAgScVGhlIHRyYWNrIGlkZW50aWZpZXIgZ2l2ZW4gd2FzIGludmFsaWQuEEZ1bGwAAwQxAVRoZXJlIGFyZSBhbHJlYWR5IGEgZnVsbCBjb21wbGVtZW50IG9mIHJlZmVyZW5kYSBpbiBwcm9ncmVzcyBmb3IgdGhpcyB0cmFjay4oUXVldWVFbXB0eQAEBIBUaGUgcXVldWUgb2YgdGhlIHRyYWNrIGlzIGVtcHR5LjRCYWRSZWZlcmVuZHVtAAUE5FRoZSByZWZlcmVuZHVtIGluZGV4IHByb3ZpZGVkIGlzIGludmFsaWQgaW4gdGhpcyBjb250ZXh0LixOb3RoaW5nVG9EbwAGBKxUaGVyZSB3YXMgbm90aGluZyB0byBkbyBpbiB0aGUgYWR2YW5jZW1lbnQuHE5vVHJhY2sABwSgTm8gdHJhY2sgZXhpc3RzIGZvciB0aGUgcHJvcG9zYWwgb3JpZ2luLihVbmZpbmlzaGVkAAgEAQFBbnkgZGVwb3NpdCBjYW5ub3QgYmUgcmVmdW5kZWQgdW50aWwgYWZ0ZXIgdGhlIGRlY2lzaW9uIGlzIG92ZXIuME5vUGVybWlzc2lvbgAJBKhUaGUgZGVwb3NpdCByZWZ1bmRlciBpcyBub3QgdGhlIGRlcG9zaXRvci4kTm9EZXBvc2l0AAoEzFRoZSBkZXBvc2l0IGNhbm5vdCBiZSByZWZ1bmRlZCBzaW5jZSBub25lIHdhcyBtYWRlLiRCYWRTdGF0dXMACwTQVGhlIHJlZmVyZW5kdW0gc3RhdHVzIGlzIGludmFsaWQgZm9yIHRoaXMgb3BlcmF0aW9uLkBQcmVpbWFnZU5vdEV4aXN0AAwEcFRoZSBwcmVpbWFnZSBkb2VzIG5vdCBleGlzdC6EUHJlaW1hZ2VTdG9yZWRXaXRoRGlmZmVyZW50TGVuZ3RoAA0EFQFUaGUgcHJlaW1hZ2UgaXMgc3RvcmVkIHdpdGggYSBkaWZmZXJlbnQgbGVuZ3RoIHRoYW4gdGhlIG9uZSBwcm92aWRlZC4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQuFQoMQHBhbGxldF93aGl0ZWxpc3QYcGFsbGV0FEVycm9yBARUAAEUTFVuYXZhaWxhYmxlUHJlSW1hZ2UAAATIVGhlIHByZWltYWdlIG9mIHRoZSBjYWxsIGhhc2ggY291bGQgbm90IGJlIGxvYWRlZC48VW5kZWNvZGFibGVDYWxsAAEEeFRoZSBjYWxsIGNvdWxkIG5vdCBiZSBkZWNvZGVkLmBJbnZhbGlkQ2FsbFdlaWdodFdpdG5lc3MAAgTsVGhlIHdlaWdodCBvZiB0aGUgZGVjb2RlZCBjYWxsIHdhcyBoaWdoZXIgdGhhbiB0aGUgd2l0bmVzcy5QQ2FsbElzTm90V2hpdGVsaXN0ZWQAAwR0VGhlIGNhbGwgd2FzIG5vdCB3aGl0ZWxpc3RlZC5YQ2FsbEFscmVhZHlXaGl0ZWxpc3RlZAAEBKBUaGUgY2FsbCB3YXMgYWxyZWFkeSB3aGl0ZWxpc3RlZDsgTm8tT3AuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LhkKEFxwb2xrYWRvdF9ydW50aW1lX2NvbW1vbhhjbGFpbXMYcGFsbGV0FEVycm9yBARUAAEYYEludmFsaWRFdGhlcmV1bVNpZ25hdHVyZQAABGxJbnZhbGlkIEV0aGVyZXVtIHNpZ25hdHVyZS5AU2lnbmVySGFzTm9DbGFpbQABBHhFdGhlcmV1bSBhZGRyZXNzIGhhcyBubyBjbGFpbS5AU2VuZGVySGFzTm9DbGFpbQACBLBBY2NvdW50IElEIHNlbmRpbmcgdHJhbnNhY3Rpb24gaGFzIG5vIGNsYWltLjBQb3RVbmRlcmZsb3cAAwhJAVRoZXJlJ3Mgbm90IGVub3VnaCBpbiB0aGUgcG90IHRvIHBheSBvdXQgc29tZSB1bnZlc3RlZCBhbW91bnQuIEdlbmVyYWxseSBpbXBsaWVzIGEwbG9naWMgZXJyb3IuQEludmFsaWRTdGF0ZW1lbnQABASQQSBuZWVkZWQgc3RhdGVtZW50IHdhcyBub3QgaW5jbHVkZWQuTFZlc3RlZEJhbGFuY2VFeGlzdHMABQSkVGhlIGFjY291bnQgYWxyZWFkeSBoYXMgYSB2ZXN0ZWQgYmFsYW5jZS4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQuHQoMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAH1AgRTAAAEACEKARhWZWM8VD4AACEKAAAC9QIAJQoIOHBhbGxldF92ZXN0aW5nIFJlbGVhc2VzAAEICFYwAAAACFYxAAEAACkKDDhwYWxsZXRfdmVzdGluZxhwYWxsZXQURXJyb3IEBFQAARQoTm90VmVzdGluZwAABIRUaGUgYWNjb3VudCBnaXZlbiBpcyBub3QgdmVzdGluZy5UQXRNYXhWZXN0aW5nU2NoZWR1bGVzAAEIJQFUaGUgYWNjb3VudCBhbHJlYWR5IGhhcyBgTWF4VmVzdGluZ1NjaGVkdWxlc2AgY291bnQgb2Ygc2NoZWR1bGVzIGFuZCB0aHVzUQFjYW5ub3QgYWRkIGFub3RoZXIgb25lLiBDb25zaWRlciBtZXJnaW5nIGV4aXN0aW5nIHNjaGVkdWxlcyBpbiBvcmRlciB0byBhZGQgYW5vdGhlci4kQW1vdW50TG93AAIEBQFBbW91bnQgYmVpbmcgdHJhbnNmZXJyZWQgaXMgdG9vIGxvdyB0byBjcmVhdGUgYSB2ZXN0aW5nIHNjaGVkdWxlLmBTY2hlZHVsZUluZGV4T3V0T2ZCb3VuZHMAAwTQQW4gaW5kZXggd2FzIG91dCBvZiBib3VuZHMgb2YgdGhlIHZlc3Rpbmcgc2NoZWR1bGVzLlRJbnZhbGlkU2NoZWR1bGVQYXJhbXMABAQNAUZhaWxlZCB0byBjcmVhdGUgYSBuZXcgc2NoZWR1bGUgYmVjYXVzZSBzb21lIHBhcmFtZXRlciB3YXMgaW52YWxpZC4EdEVycm9yIGZvciB0aGUgdmVzdGluZyBwYWxsZXQuLQoMOHBhbGxldF91dGlsaXR5GHBhbGxldBRFcnJvcgQEVAABBDBUb29NYW55Q2FsbHMAAARcVG9vIG1hbnkgY2FsbHMgYmF0Y2hlZC4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQuMQoAAAQINQoYADUKDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBOQoEUwAABAA9CgEYVmVjPFQ+AAA5CggwcGFsbGV0X3Byb3h5PFByb3h5RGVmaW5pdGlvbgwkQWNjb3VudElkAQAkUHJveHlUeXBlAQkDLEJsb2NrTnVtYmVyARAADAEgZGVsZWdhdGUAASRBY2NvdW50SWQAAShwcm94eV90eXBlCQMBJFByb3h5VHlwZQABFGRlbGF5EAEsQmxvY2tOdW1iZXIAAD0KAAACOQoAQQoAAAQIRQoYAEUKDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBSQoEUwAABABNCgEYVmVjPFQ+AABJCggwcGFsbGV0X3Byb3h5MEFubm91bmNlbWVudAwkQWNjb3VudElkAQAQSGFzaAE0LEJsb2NrTnVtYmVyARAADAEQcmVhbAABJEFjY291bnRJZAABJGNhbGxfaGFzaDQBEEhhc2gAARhoZWlnaHQQASxCbG9ja051bWJlcgAATQoAAAJJCgBRCgwwcGFsbGV0X3Byb3h5GHBhbGxldBRFcnJvcgQEVAABIBxUb29NYW55AAAEIQFUaGVyZSBhcmUgdG9vIG1hbnkgcHJveGllcyByZWdpc3RlcmVkIG9yIHRvbyBtYW55IGFubm91bmNlbWVudHMgcGVuZGluZy4gTm90Rm91bmQAAQR0UHJveHkgcmVnaXN0cmF0aW9uIG5vdCBmb3VuZC4gTm90UHJveHkAAgTMU2VuZGVyIGlzIG5vdCBhIHByb3h5IG9mIHRoZSBhY2NvdW50IHRvIGJlIHByb3hpZWQuLFVucHJveHlhYmxlAAMEIQFBIGNhbGwgd2hpY2ggaXMgaW5jb21wYXRpYmxlIHdpdGggdGhlIHByb3h5IHR5cGUncyBmaWx0ZXIgd2FzIGF0dGVtcHRlZC4kRHVwbGljYXRlAAQEbEFjY291bnQgaXMgYWxyZWFkeSBhIHByb3h5LjBOb1Blcm1pc3Npb24ABQQVAUNhbGwgbWF5IG5vdCBiZSBtYWRlIGJ5IHByb3h5IGJlY2F1c2UgaXQgbWF5IGVzY2FsYXRlIGl0cyBwcml2aWxlZ2VzLixVbmFubm91bmNlZAAGBNBBbm5vdW5jZW1lbnQsIGlmIG1hZGUgYXQgYWxsLCB3YXMgbWFkZSB0b28gcmVjZW50bHkuLE5vU2VsZlByb3h5AAcEZENhbm5vdCBhZGQgc2VsZiBhcyBwcm94eS4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQuVQoAAAQIAAQAWQoIPHBhbGxldF9tdWx0aXNpZyBNdWx0aXNpZxAsQmxvY2tOdW1iZXIBEBxCYWxhbmNlARgkQWNjb3VudElkAQAwTWF4QXBwcm92YWxzAAAQARB3aGVuFQMBWFRpbWVwb2ludDxCbG9ja051bWJlcj4AARxkZXBvc2l0GAEcQmFsYW5jZQABJGRlcG9zaXRvcgABJEFjY291bnRJZAABJGFwcHJvdmFsc10KAYxCb3VuZGVkVmVjPEFjY291bnRJZCwgTWF4QXBwcm92YWxzPgAAXQoMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAEABFMAAAQA0QEBGFZlYzxUPgAAYQoMPHBhbGxldF9tdWx0aXNpZxhwYWxsZXQURXJyb3IEBFQAAThATWluaW11bVRocmVzaG9sZAAABHxUaHJlc2hvbGQgbXVzdCBiZSAyIG9yIGdyZWF0ZXIuPEFscmVhZHlBcHByb3ZlZAABBKxDYWxsIGlzIGFscmVhZHkgYXBwcm92ZWQgYnkgdGhpcyBzaWduYXRvcnkuRE5vQXBwcm92YWxzTmVlZGVkAAIEnENhbGwgZG9lc24ndCBuZWVkIGFueSAobW9yZSkgYXBwcm92YWxzLkRUb29GZXdTaWduYXRvcmllcwADBKhUaGVyZSBhcmUgdG9vIGZldyBzaWduYXRvcmllcyBpbiB0aGUgbGlzdC5IVG9vTWFueVNpZ25hdG9yaWVzAAQErFRoZXJlIGFyZSB0b28gbWFueSBzaWduYXRvcmllcyBpbiB0aGUgbGlzdC5UU2lnbmF0b3JpZXNPdXRPZk9yZGVyAAUEDQFUaGUgc2lnbmF0b3JpZXMgd2VyZSBwcm92aWRlZCBvdXQgb2Ygb3JkZXI7IHRoZXkgc2hvdWxkIGJlIG9yZGVyZWQuTFNlbmRlckluU2lnbmF0b3JpZXMABgQNAVRoZSBzZW5kZXIgd2FzIGNvbnRhaW5lZCBpbiB0aGUgb3RoZXIgc2lnbmF0b3JpZXM7IGl0IHNob3VsZG4ndCBiZS4gTm90Rm91bmQABwTcTXVsdGlzaWcgb3BlcmF0aW9uIG5vdCBmb3VuZCB3aGVuIGF0dGVtcHRpbmcgdG8gY2FuY2VsLiBOb3RPd25lcgAIBC0BT25seSB0aGUgYWNjb3VudCB0aGF0IG9yaWdpbmFsbHkgY3JlYXRlZCB0aGUgbXVsdGlzaWcgaXMgYWJsZSB0byBjYW5jZWwgaXQuLE5vVGltZXBvaW50AAkEHQFObyB0aW1lcG9pbnQgd2FzIGdpdmVuLCB5ZXQgdGhlIG11bHRpc2lnIG9wZXJhdGlvbiBpcyBhbHJlYWR5IHVuZGVyd2F5LjhXcm9uZ1RpbWVwb2ludAAKBC0BQSBkaWZmZXJlbnQgdGltZXBvaW50IHdhcyBnaXZlbiB0byB0aGUgbXVsdGlzaWcgb3BlcmF0aW9uIHRoYXQgaXMgdW5kZXJ3YXkuTFVuZXhwZWN0ZWRUaW1lcG9pbnQACwT0QSB0aW1lcG9pbnQgd2FzIGdpdmVuLCB5ZXQgbm8gbXVsdGlzaWcgb3BlcmF0aW9uIGlzIHVuZGVyd2F5LjxNYXhXZWlnaHRUb29Mb3cADATQVGhlIG1heGltdW0gd2VpZ2h0IGluZm9ybWF0aW9uIHByb3ZpZGVkIHdhcyB0b28gbG93LjRBbHJlYWR5U3RvcmVkAA0EoFRoZSBkYXRhIHRvIGJlIHN0b3JlZCBpcyBhbHJlYWR5IHN0b3JlZC4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQuZQoIPHBhbGxldF9ib3VudGllcxhCb3VudHkMJEFjY291bnRJZAEAHEJhbGFuY2UBGCxCbG9ja051bWJlcgEQABgBIHByb3Bvc2VyAAEkQWNjb3VudElkAAEUdmFsdWUYARxCYWxhbmNlAAEMZmVlGAEcQmFsYW5jZQABPGN1cmF0b3JfZGVwb3NpdBgBHEJhbGFuY2UAARBib25kGAEcQmFsYW5jZQABGHN0YXR1c2kKAZBCb3VudHlTdGF0dXM8QWNjb3VudElkLCBCbG9ja051bWJlcj4AAGkKCDxwYWxsZXRfYm91bnRpZXMwQm91bnR5U3RhdHVzCCRBY2NvdW50SWQBACxCbG9ja051bWJlcgEQARggUHJvcG9zZWQAAAAgQXBwcm92ZWQAAQAYRnVuZGVkAAIAPEN1cmF0b3JQcm9wb3NlZAQBHGN1cmF0b3IAASRBY2NvdW50SWQAAwAYQWN0aXZlCAEcY3VyYXRvcgABJEFjY291bnRJZAABKHVwZGF0ZV9kdWUQASxCbG9ja051bWJlcgAEADRQZW5kaW5nUGF5b3V0DAEcY3VyYXRvcgABJEFjY291bnRJZAABLGJlbmVmaWNpYXJ5AAEkQWNjb3VudElkAAEkdW5sb2NrX2F0EAEsQmxvY2tOdW1iZXIABQAAbQoMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAEIBFMAAAQAOAEYVmVjPFQ+AABxCgw8cGFsbGV0X2JvdW50aWVzGHBhbGxldBRFcnJvcggEVAAESQABLHBJbnN1ZmZpY2llbnRQcm9wb3NlcnNCYWxhbmNlAAAEeFByb3Bvc2VyJ3MgYmFsYW5jZSBpcyB0b28gbG93LjBJbnZhbGlkSW5kZXgAAQSQTm8gcHJvcG9zYWwgb3IgYm91bnR5IGF0IHRoYXQgaW5kZXguMFJlYXNvblRvb0JpZwACBIRUaGUgcmVhc29uIGdpdmVuIGlzIGp1c3QgdG9vIGJpZy5AVW5leHBlY3RlZFN0YXR1cwADBIBUaGUgYm91bnR5IHN0YXR1cyBpcyB1bmV4cGVjdGVkLjhSZXF1aXJlQ3VyYXRvcgAEBFxSZXF1aXJlIGJvdW50eSBjdXJhdG9yLjBJbnZhbGlkVmFsdWUABQRUSW52YWxpZCBib3VudHkgdmFsdWUuKEludmFsaWRGZWUABgRMSW52YWxpZCBib3VudHkgZmVlLjRQZW5kaW5nUGF5b3V0AAcIbEEgYm91bnR5IHBheW91dCBpcyBwZW5kaW5nLvhUbyBjYW5jZWwgdGhlIGJvdW50eSwgeW91IG11c3QgdW5hc3NpZ24gYW5kIHNsYXNoIHRoZSBjdXJhdG9yLiRQcmVtYXR1cmUACARFAVRoZSBib3VudGllcyBjYW5ub3QgYmUgY2xhaW1lZC9jbG9zZWQgYmVjYXVzZSBpdCdzIHN0aWxsIGluIHRoZSBjb3VudGRvd24gcGVyaW9kLlBIYXNBY3RpdmVDaGlsZEJvdW50eQAJBAUBVGhlIGJvdW50eSBjYW5ub3QgYmUgY2xvc2VkIGJlY2F1c2UgaXQgaGFzIGFjdGl2ZSBjaGlsZCBib3VudGllcy40VG9vTWFueVF1ZXVlZAAKBJhUb28gbWFueSBhcHByb3ZhbHMgYXJlIGFscmVhZHkgcXVldWVkLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC51CghUcGFsbGV0X2NoaWxkX2JvdW50aWVzLENoaWxkQm91bnR5DCRBY2NvdW50SWQBABxCYWxhbmNlARgsQmxvY2tOdW1iZXIBEAAUATRwYXJlbnRfYm91bnR5EAEsQm91bnR5SW5kZXgAARR2YWx1ZRgBHEJhbGFuY2UAAQxmZWUYARxCYWxhbmNlAAE8Y3VyYXRvcl9kZXBvc2l0GAEcQmFsYW5jZQABGHN0YXR1c3kKAaRDaGlsZEJvdW50eVN0YXR1czxBY2NvdW50SWQsIEJsb2NrTnVtYmVyPgAAeQoIVHBhbGxldF9jaGlsZF9ib3VudGllc0RDaGlsZEJvdW50eVN0YXR1cwgkQWNjb3VudElkAQAsQmxvY2tOdW1iZXIBEAEQFEFkZGVkAAAAPEN1cmF0b3JQcm9wb3NlZAQBHGN1cmF0b3IAASRBY2NvdW50SWQAAQAYQWN0aXZlBAEcY3VyYXRvcgABJEFjY291bnRJZAACADRQZW5kaW5nUGF5b3V0DAEcY3VyYXRvcgABJEFjY291bnRJZAABLGJlbmVmaWNpYXJ5AAEkQWNjb3VudElkAAEkdW5sb2NrX2F0EAEsQmxvY2tOdW1iZXIAAwAAfQoMVHBhbGxldF9jaGlsZF9ib3VudGllcxhwYWxsZXQURXJyb3IEBFQAAQxUUGFyZW50Qm91bnR5Tm90QWN0aXZlAAAEpFRoZSBwYXJlbnQgYm91bnR5IGlzIG5vdCBpbiBhY3RpdmUgc3RhdGUuZEluc3VmZmljaWVudEJvdW50eUJhbGFuY2UAAQTkVGhlIGJvdW50eSBiYWxhbmNlIGlzIG5vdCBlbm91Z2ggdG8gYWRkIG5ldyBjaGlsZC1ib3VudHkuUFRvb01hbnlDaGlsZEJvdW50aWVzAAIEDQFOdW1iZXIgb2YgY2hpbGQgYm91bnRpZXMgZXhjZWVkcyBsaW1pdCBgTWF4QWN0aXZlQ2hpbGRCb3VudHlDb3VudGAuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LoEKCJBwYWxsZXRfZWxlY3Rpb25fcHJvdmlkZXJfbXVsdGlfcGhhc2U0UmVhZHlTb2x1dGlvbggkQWNjb3VudElkAChNYXhXaW5uZXJzAAAMASBzdXBwb3J0c4UKAZhCb3VuZGVkU3VwcG9ydHM8QWNjb3VudElkLCBNYXhXaW5uZXJzPgABFHNjb3Jl9QMBNEVsZWN0aW9uU2NvcmUAARxjb21wdXRlXQcBPEVsZWN0aW9uQ29tcHV0ZQAAhQoMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAEFBARTAAAEAAEEARhWZWM8VD4AAIkKCJBwYWxsZXRfZWxlY3Rpb25fcHJvdmlkZXJfbXVsdGlfcGhhc2U0Um91bmRTbmFwc2hvdAgkQWNjb3VudElkAQAwRGF0YVByb3ZpZGVyAY0KAAgBGHZvdGVyc5EKAURWZWM8RGF0YVByb3ZpZGVyPgABHHRhcmdldHPRAQE4VmVjPEFjY291bnRJZD4AAI0KAAAEDAAw9QgAkQoAAAKNCgCVCgxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAZkKBFMAAAQAnQoBGFZlYzxUPgAAmQoAAAQM9QMQEACdCgAAApkKAKEKDJBwYWxsZXRfZWxlY3Rpb25fcHJvdmlkZXJfbXVsdGlfcGhhc2UYc2lnbmVkQFNpZ25lZFN1Ym1pc3Npb24MJEFjY291bnRJZAEAHEJhbGFuY2UBGCBTb2x1dGlvbgEpAwAQAQx3aG8AASRBY2NvdW50SWQAARxkZXBvc2l0GAEcQmFsYW5jZQABMHJhd19zb2x1dGlvbiUDAVRSYXdTb2x1dGlvbjxTb2x1dGlvbj4AASBjYWxsX2ZlZRgBHEJhbGFuY2UAAKUKDJBwYWxsZXRfZWxlY3Rpb25fcHJvdmlkZXJfbXVsdGlfcGhhc2UYcGFsbGV0FEVycm9yBARUAAE8aFByZURpc3BhdGNoRWFybHlTdWJtaXNzaW9uAAAEZFN1Ym1pc3Npb24gd2FzIHRvbyBlYXJseS5sUHJlRGlzcGF0Y2hXcm9uZ1dpbm5lckNvdW50AAEEiFdyb25nIG51bWJlciBvZiB3aW5uZXJzIHByZXNlbnRlZC5kUHJlRGlzcGF0Y2hXZWFrU3VibWlzc2lvbgACBJBTdWJtaXNzaW9uIHdhcyB0b28gd2Vhaywgc2NvcmUtd2lzZS48U2lnbmVkUXVldWVGdWxsAAMESQFUaGUgcXVldWUgd2FzIGZ1bGwsIGFuZCB0aGUgc29sdXRpb24gd2FzIG5vdCBiZXR0ZXIgdGhhbiBhbnkgb2YgdGhlIGV4aXN0aW5nIG9uZXMuWFNpZ25lZENhbm5vdFBheURlcG9zaXQABASUVGhlIG9yaWdpbiBmYWlsZWQgdG8gcGF5IHRoZSBkZXBvc2l0LlBTaWduZWRJbnZhbGlkV2l0bmVzcwAFBKBXaXRuZXNzIGRhdGEgdG8gZGlzcGF0Y2hhYmxlIGlzIGludmFsaWQuTFNpZ25lZFRvb011Y2hXZWlnaHQABgS4VGhlIHNpZ25lZCBzdWJtaXNzaW9uIGNvbnN1bWVzIHRvbyBtdWNoIHdlaWdodDxPY3dDYWxsV3JvbmdFcmEABwSYT0NXIHN1Ym1pdHRlZCBzb2x1dGlvbiBmb3Igd3Jvbmcgcm91bmRcTWlzc2luZ1NuYXBzaG90TWV0YWRhdGEACASoU25hcHNob3QgbWV0YWRhdGEgc2hvdWxkIGV4aXN0IGJ1dCBkaWRuJ3QuWEludmFsaWRTdWJtaXNzaW9uSW5kZXgACQTQYFNlbGY6Omluc2VydF9zdWJtaXNzaW9uYCByZXR1cm5lZCBhbiBpbnZhbGlkIGluZGV4LjhDYWxsTm90QWxsb3dlZAAKBJhUaGUgY2FsbCBpcyBub3QgYWxsb3dlZCBhdCB0aGlzIHBvaW50LjhGYWxsYmFja0ZhaWxlZAALBExUaGUgZmFsbGJhY2sgZmFpbGVkLEJvdW5kTm90TWV0AAwESFNvbWUgYm91bmQgbm90IG1ldDhUb29NYW55V2lubmVycwANBJxTdWJtaXR0ZWQgc29sdXRpb24gaGFzIHRvbyBtYW55IHdpbm5lcnNkUHJlRGlzcGF0Y2hEaWZmZXJlbnRSb3VuZAAOBLhTdWJtaXNzaW9uIHdhcyBwcmVwYXJlZCBmb3IgYSBkaWZmZXJlbnQgcm91bmQuBA0BRXJyb3Igb2YgdGhlIHBhbGxldCB0aGF0IGNhbiBiZSByZXR1cm5lZCBpbiByZXNwb25zZSB0byBkaXNwYXRjaGVzLqkKDEBwYWxsZXRfYmFnc19saXN0EGxpc3QQTm9kZQgEVAAESQAAFAEIaWQAATBUOjpBY2NvdW50SWQAARBwcmV2/QEBUE9wdGlvbjxUOjpBY2NvdW50SWQ+AAEQbmV4dP0BAVBPcHRpb248VDo6QWNjb3VudElkPgABJGJhZ191cHBlcjABIFQ6OlNjb3JlAAEUc2NvcmUwASBUOjpTY29yZQAArQoMQHBhbGxldF9iYWdzX2xpc3QQbGlzdAxCYWcIBFQABEkAAAgBEGhlYWT9AQFQT3B0aW9uPFQ6OkFjY291bnRJZD4AARB0YWls/QEBUE9wdGlvbjxUOjpBY2NvdW50SWQ+AACxCgAAAjAAtQoMQHBhbGxldF9iYWdzX2xpc3QYcGFsbGV0FEVycm9yCARUAARJAAEEEExpc3QEALkKASRMaXN0RXJyb3IAAAS0QSBlcnJvciBpbiB0aGUgbGlzdCBpbnRlcmZhY2UgaW1wbGVtZW50YXRpb24uBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LrkKDEBwYWxsZXRfYmFnc19saXN0EGxpc3QkTGlzdEVycm9yAAEQJER1cGxpY2F0ZQAAAChOb3RIZWF2aWVyAAEAME5vdEluU2FtZUJhZwACADBOb2RlTm90Rm91bmQAAwAAvQoIXHBhbGxldF9ub21pbmF0aW9uX3Bvb2xzKFBvb2xNZW1iZXIEBFQAABABHHBvb2xfaWQQARhQb29sSWQAARhwb2ludHMYATBCYWxhbmNlT2Y8VD4AAXBsYXN0X3JlY29yZGVkX3Jld2FyZF9jb3VudGVy0QYBQFQ6OlJld2FyZENvdW50ZXIAATh1bmJvbmRpbmdfZXJhc8EKAeBCb3VuZGVkQlRyZWVNYXA8RXJhSW5kZXgsIEJhbGFuY2VPZjxUPiwgVDo6TWF4VW5ib25kaW5nPgAAwQoMTGJvdW5kZWRfY29sbGVjdGlvbnNEYm91bmRlZF9idHJlZV9tYXA8Qm91bmRlZEJUcmVlTWFwDARLARAEVgEYBFMAAAQAxQoBOEJUcmVlTWFwPEssIFY+AADFCgQgQlRyZWVNYXAIBEsBEARWARgABAD1CQAAAMkKCFxwYWxsZXRfbm9taW5hdGlvbl9wb29sczxCb25kZWRQb29sSW5uZXIEBFQAABQBKGNvbW1pc3Npb27NCgE0Q29tbWlzc2lvbjxUPgABOG1lbWJlcl9jb3VudGVyEAEMdTMyAAEYcG9pbnRzGAEwQmFsYW5jZU9mPFQ+AAEUcm9sZXPZCgFcUG9vbFJvbGVzPFQ6OkFjY291bnRJZD4AARRzdGF0ZSEEASRQb29sU3RhdGUAAM0KCFxwYWxsZXRfbm9taW5hdGlvbl9wb29scyhDb21taXNzaW9uBARUAAAUARxjdXJyZW50OQQBfE9wdGlvbjwoUGVyYmlsbCwgVDo6QWNjb3VudElkKT4AAQxtYXjRCgE8T3B0aW9uPFBlcmJpbGw+AAEsY2hhbmdlX3JhdGXVCgG8T3B0aW9uPENvbW1pc3Npb25DaGFuZ2VSYXRlPEJsb2NrTnVtYmVyRm9yPFQ+Pj4AATR0aHJvdHRsZV9mcm9tYQIBZE9wdGlvbjxCbG9ja051bWJlckZvcjxUPj4AAUBjbGFpbV9wZXJtaXNzaW9uRQQBvE9wdGlvbjxDb21taXNzaW9uQ2xhaW1QZXJtaXNzaW9uPFQ6OkFjY291bnRJZD4+AADRCgQYT3B0aW9uBARUAawBCBBOb25lAAAAEFNvbWUEAKwAAAEAANUKBBhPcHRpb24EBFQBQQQBCBBOb25lAAAAEFNvbWUEAEEEAAABAADZCghccGFsbGV0X25vbWluYXRpb25fcG9vbHMkUG9vbFJvbGVzBCRBY2NvdW50SWQBAAAQASRkZXBvc2l0b3IAASRBY2NvdW50SWQAARByb290/QEBRE9wdGlvbjxBY2NvdW50SWQ+AAEkbm9taW5hdG9y/QEBRE9wdGlvbjxBY2NvdW50SWQ+AAEcYm91bmNlcv0BAURPcHRpb248QWNjb3VudElkPgAA3QoIXHBhbGxldF9ub21pbmF0aW9uX3Bvb2xzKFJld2FyZFBvb2wEBFQAABQBcGxhc3RfcmVjb3JkZWRfcmV3YXJkX2NvdW50ZXLRBgFAVDo6UmV3YXJkQ291bnRlcgABbGxhc3RfcmVjb3JkZWRfdG90YWxfcGF5b3V0cxgBMEJhbGFuY2VPZjxUPgABVHRvdGFsX3Jld2FyZHNfY2xhaW1lZBgBMEJhbGFuY2VPZjxUPgABYHRvdGFsX2NvbW1pc3Npb25fcGVuZGluZxgBMEJhbGFuY2VPZjxUPgABYHRvdGFsX2NvbW1pc3Npb25fY2xhaW1lZBgBMEJhbGFuY2VPZjxUPgAA4QoIXHBhbGxldF9ub21pbmF0aW9uX3Bvb2xzIFN1YlBvb2xzBARUAAAIARhub19lcmHlCgE0VW5ib25kUG9vbDxUPgABIHdpdGhfZXJh6QoBAQFCb3VuZGVkQlRyZWVNYXA8RXJhSW5kZXgsIFVuYm9uZFBvb2w8VD4sIFRvdGFsVW5ib25kaW5nUG9vbHM8VD4+AADlCghccGFsbGV0X25vbWluYXRpb25fcG9vbHMoVW5ib25kUG9vbAQEVAAACAEYcG9pbnRzGAEwQmFsYW5jZU9mPFQ+AAEcYmFsYW5jZRgBMEJhbGFuY2VPZjxUPgAA6QoMTGJvdW5kZWRfY29sbGVjdGlvbnNEYm91bmRlZF9idHJlZV9tYXA8Qm91bmRlZEJUcmVlTWFwDARLARAEVgHlCgRTAAAEAO0KAThCVHJlZU1hcDxLLCBWPgAA7QoEIEJUcmVlTWFwCARLARAEVgHlCgAEAPEKAAAA8QoAAAL1CgD1CgAABAgQ5QoA+QoMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAEIBFMAAAQAOAEYVmVjPFQ+AAD9CgxccGFsbGV0X25vbWluYXRpb25fcG9vbHMYcGFsbGV0FEVycm9yBARUAAGQMFBvb2xOb3RGb3VuZAAABIhBIChib25kZWQpIHBvb2wgaWQgZG9lcyBub3QgZXhpc3QuSFBvb2xNZW1iZXJOb3RGb3VuZAABBGxBbiBhY2NvdW50IGlzIG5vdCBhIG1lbWJlci5IUmV3YXJkUG9vbE5vdEZvdW5kAAIEIQFBIHJld2FyZCBwb29sIGRvZXMgbm90IGV4aXN0LiBJbiBhbGwgY2FzZXMgdGhpcyBpcyBhIHN5c3RlbSBsb2dpYyBlcnJvci5AU3ViUG9vbHNOb3RGb3VuZAADBGhBIHN1YiBwb29sIGRvZXMgbm90IGV4aXN0LmRBY2NvdW50QmVsb25nc1RvT3RoZXJQb29sAAQITQFBbiBhY2NvdW50IGlzIGFscmVhZHkgZGVsZWdhdGluZyBpbiBhbm90aGVyIHBvb2wuIEFuIGFjY291bnQgbWF5IG9ubHkgYmVsb25nIHRvIG9uZTxwb29sIGF0IGEgdGltZS44RnVsbHlVbmJvbmRpbmcABQg9AVRoZSBtZW1iZXIgaXMgZnVsbHkgdW5ib25kZWQgKGFuZCB0aHVzIGNhbm5vdCBhY2Nlc3MgdGhlIGJvbmRlZCBhbmQgcmV3YXJkIHBvb2yoYW55bW9yZSB0bywgZm9yIGV4YW1wbGUsIGNvbGxlY3QgcmV3YXJkcykuRE1heFVuYm9uZGluZ0xpbWl0AAYECQFUaGUgbWVtYmVyIGNhbm5vdCB1bmJvbmQgZnVydGhlciBjaHVua3MgZHVlIHRvIHJlYWNoaW5nIHRoZSBsaW1pdC5EQ2Fubm90V2l0aGRyYXdBbnkABwRNAU5vbmUgb2YgdGhlIGZ1bmRzIGNhbiBiZSB3aXRoZHJhd24geWV0IGJlY2F1c2UgdGhlIGJvbmRpbmcgZHVyYXRpb24gaGFzIG5vdCBwYXNzZWQuRE1pbmltdW1Cb25kTm90TWV0AAgUKQFUaGUgYW1vdW50IGRvZXMgbm90IG1lZXQgdGhlIG1pbmltdW0gYm9uZCB0byBlaXRoZXIgam9pbiBvciBjcmVhdGUgYSBwb29sLgBVAVRoZSBkZXBvc2l0b3IgY2FuIG5ldmVyIHVuYm9uZCB0byBhIHZhbHVlIGxlc3MgdGhhbiBgUGFsbGV0OjpkZXBvc2l0b3JfbWluX2JvbmRgLiBUaGVdAWNhbGxlciBkb2VzIG5vdCBoYXZlIG5vbWluYXRpbmcgcGVybWlzc2lvbnMgZm9yIHRoZSBwb29sLiBNZW1iZXJzIGNhbiBuZXZlciB1bmJvbmQgdG8gYWh2YWx1ZSBiZWxvdyBgTWluSm9pbkJvbmRgLjBPdmVyZmxvd1Jpc2sACQQhAVRoZSB0cmFuc2FjdGlvbiBjb3VsZCBub3QgYmUgZXhlY3V0ZWQgZHVlIHRvIG92ZXJmbG93IHJpc2sgZm9yIHRoZSBwb29sLjROb3REZXN0cm95aW5nAAoIXQFBIHBvb2wgbXVzdCBiZSBpbiBbYFBvb2xTdGF0ZTo6RGVzdHJveWluZ2BdIGluIG9yZGVyIGZvciB0aGUgZGVwb3NpdG9yIHRvIHVuYm9uZCBvciBmb3K4b3RoZXIgbWVtYmVycyB0byBiZSBwZXJtaXNzaW9ubGVzc2x5IHVuYm9uZGVkLjBOb3ROb21pbmF0b3IACwT0VGhlIGNhbGxlciBkb2VzIG5vdCBoYXZlIG5vbWluYXRpbmcgcGVybWlzc2lvbnMgZm9yIHRoZSBwb29sLlROb3RLaWNrZXJPckRlc3Ryb3lpbmcADAQ9AUVpdGhlciBhKSB0aGUgY2FsbGVyIGNhbm5vdCBtYWtlIGEgdmFsaWQga2ljayBvciBiKSB0aGUgcG9vbCBpcyBub3QgZGVzdHJveWluZy4cTm90T3BlbgANBHBUaGUgcG9vbCBpcyBub3Qgb3BlbiB0byBqb2luIE1heFBvb2xzAA4EhFRoZSBzeXN0ZW0gaXMgbWF4ZWQgb3V0IG9uIHBvb2xzLjhNYXhQb29sTWVtYmVycwAPBJxUb28gbWFueSBtZW1iZXJzIGluIHRoZSBwb29sIG9yIHN5c3RlbS5EQ2FuTm90Q2hhbmdlU3RhdGUAEASIVGhlIHBvb2xzIHN0YXRlIGNhbm5vdCBiZSBjaGFuZ2VkLlREb2VzTm90SGF2ZVBlcm1pc3Npb24AEQS4VGhlIGNhbGxlciBkb2VzIG5vdCBoYXZlIGFkZXF1YXRlIHBlcm1pc3Npb25zLlRNZXRhZGF0YUV4Y2VlZHNNYXhMZW4AEgSsTWV0YWRhdGEgZXhjZWVkcyBbYENvbmZpZzo6TWF4TWV0YWRhdGFMZW5gXSREZWZlbnNpdmUEAAELAThEZWZlbnNpdmVFcnJvcgATCDEBU29tZSBlcnJvciBvY2N1cnJlZCB0aGF0IHNob3VsZCBuZXZlciBoYXBwZW4uIFRoaXMgc2hvdWxkIGJlIHJlcG9ydGVkIHRvIHRoZTBtYWludGFpbmVycy6cUGFydGlhbFVuYm9uZE5vdEFsbG93ZWRQZXJtaXNzaW9ubGVzc2x5ABQEvFBhcnRpYWwgdW5ib25kaW5nIG5vdyBhbGxvd2VkIHBlcm1pc3Npb25sZXNzbHkuXE1heENvbW1pc3Npb25SZXN0cmljdGVkABUEHQFUaGUgcG9vbCdzIG1heCBjb21taXNzaW9uIGNhbm5vdCBiZSBzZXQgaGlnaGVyIHRoYW4gdGhlIGV4aXN0aW5nIHZhbHVlLmBDb21taXNzaW9uRXhjZWVkc01heGltdW0AFgTsVGhlIHN1cHBsaWVkIGNvbW1pc3Npb24gZXhjZWVkcyB0aGUgbWF4IGFsbG93ZWQgY29tbWlzc2lvbi54Q29tbWlzc2lvbkV4Y2VlZHNHbG9iYWxNYXhpbXVtABcE6FRoZSBzdXBwbGllZCBjb21taXNzaW9uIGV4Y2VlZHMgZ2xvYmFsIG1heGltdW0gY29tbWlzc2lvbi5kQ29tbWlzc2lvbkNoYW5nZVRocm90dGxlZAAYBAkBTm90IGVub3VnaCBibG9ja3MgaGF2ZSBzdXJwYXNzZWQgc2luY2UgdGhlIGxhc3QgY29tbWlzc2lvbiB1cGRhdGUueENvbW1pc3Npb25DaGFuZ2VSYXRlTm90QWxsb3dlZAAZBAEBVGhlIHN1Ym1pdHRlZCBjaGFuZ2VzIHRvIGNvbW1pc3Npb24gY2hhbmdlIHJhdGUgYXJlIG5vdCBhbGxvd2VkLkxOb1BlbmRpbmdDb21taXNzaW9uABoEoFRoZXJlIGlzIG5vIHBlbmRpbmcgY29tbWlzc2lvbiB0byBjbGFpbS5YTm9Db21taXNzaW9uQ3VycmVudFNldAAbBIxObyBjb21taXNzaW9uIGN1cnJlbnQgaGFzIGJlZW4gc2V0LixQb29sSWRJblVzZQAcBGRQb29sIGlkIGN1cnJlbnRseSBpbiB1c2UuNEludmFsaWRQb29sSWQAHQScUG9vbCBpZCBwcm92aWRlZCBpcyBub3QgY29ycmVjdC91c2FibGUuTEJvbmRFeHRyYVJlc3RyaWN0ZWQAHgT8Qm9uZGluZyBleHRyYSBpcyByZXN0cmljdGVkIHRvIHRoZSBleGFjdCBwZW5kaW5nIHJld2FyZCBhbW91bnQuPE5vdGhpbmdUb0FkanVzdAAfBLBObyBpbWJhbGFuY2UgaW4gdGhlIEVEIGRlcG9zaXQgZm9yIHRoZSBwb29sLjhOb3RoaW5nVG9TbGFzaAAgBMxObyBzbGFzaCBwZW5kaW5nIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gdGhlIG1lbWJlci48QWxyZWFkeU1pZ3JhdGVkACEEFQFUaGUgcG9vbCBvciBtZW1iZXIgZGVsZWdhdGlvbiBoYXMgYWxyZWFkeSBtaWdyYXRlZCB0byBkZWxlZ2F0ZSBzdGFrZS4sTm90TWlncmF0ZWQAIgQVAVRoZSBwb29sIG9yIG1lbWJlciBkZWxlZ2F0aW9uIGhhcyBub3QgbWlncmF0ZWQgeWV0IHRvIGRlbGVnYXRlIHN0YWtlLjBOb3RTdXBwb3J0ZWQAIwTwVGhpcyBjYWxsIGlzIG5vdCBhbGxvd2VkIGluIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBwYWxsZXQuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LgELDFxwYWxsZXRfbm9taW5hdGlvbl9wb29scxhwYWxsZXQ4RGVmZW5zaXZlRXJyb3IAARxoTm90RW5vdWdoU3BhY2VJblVuYm9uZFBvb2wAAAAwUG9vbE5vdEZvdW5kAAEASFJld2FyZFBvb2xOb3RGb3VuZAACAEBTdWJQb29sc05vdEZvdW5kAAMAcEJvbmRlZFN0YXNoS2lsbGVkUHJlbWF0dXJlbHkABABURGVsZWdhdGlvblVuc3VwcG9ydGVkAAUAPFNsYXNoTm90QXBwbGllZAAGAAAFCwxMcGFsbGV0X2Zhc3RfdW5zdGFrZRR0eXBlczhVbnN0YWtlUmVxdWVzdAQEVAAACAEcc3Rhc2hlcwkLAdhCb3VuZGVkVmVjPChUOjpBY2NvdW50SWQsIEJhbGFuY2VPZjxUPiksIFQ6OkJhdGNoU2l6ZT4AARxjaGVja2VkDQsBkEJvdW5kZWRWZWM8RXJhSW5kZXgsIE1heENoZWNraW5nPFQ+PgAACQsMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAERBARTAAAEAA0EARhWZWM8VD4AAA0LDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBEARTAAAEAOUBARhWZWM8VD4AABELDExwYWxsZXRfZmFzdF91bnN0YWtlGHBhbGxldBRFcnJvcgQEVAABGDROb3RDb250cm9sbGVyAAAMuFRoZSBwcm92aWRlZCBDb250cm9sbGVyIGFjY291bnQgd2FzIG5vdCBmb3VuZC4AwFRoaXMgbWVhbnMgdGhhdCB0aGUgZ2l2ZW4gYWNjb3VudCBpcyBub3QgYm9uZGVkLjRBbHJlYWR5UXVldWVkAAEErFRoZSBib25kZWQgYWNjb3VudCBoYXMgYWxyZWFkeSBiZWVuIHF1ZXVlZC44Tm90RnVsbHlCb25kZWQAAgS8VGhlIGJvbmRlZCBhY2NvdW50IGhhcyBhY3RpdmUgdW5sb2NraW5nIGNodW5rcy4kTm90UXVldWVkAAMEtFRoZSBwcm92aWRlZCB1bi1zdGFrZXIgaXMgbm90IGluIHRoZSBgUXVldWVgLixBbHJlYWR5SGVhZAAEBAUBVGhlIHByb3ZpZGVkIHVuLXN0YWtlciBpcyBhbHJlYWR5IGluIEhlYWQsIGFuZCBjYW5ub3QgZGVyZWdpc3Rlci44Q2FsbE5vdEFsbG93ZWQABQQdAVRoZSBjYWxsIGlzIG5vdCBhbGxvd2VkIGF0IHRoaXMgcG9pbnQgYmVjYXVzZSB0aGUgcGFsbGV0IGlzIG5vdCBhY3RpdmUuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LhULDGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnM0Y29uZmlndXJhdGlvbkRIb3N0Q29uZmlndXJhdGlvbgQsQmxvY2tOdW1iZXIBEACMATRtYXhfY29kZV9zaXplEAEMdTMyAAFIbWF4X2hlYWRfZGF0YV9zaXplEAEMdTMyAAFYbWF4X3Vwd2FyZF9xdWV1ZV9jb3VudBABDHUzMgABVG1heF91cHdhcmRfcXVldWVfc2l6ZRABDHUzMgABXG1heF91cHdhcmRfbWVzc2FnZV9zaXplEAEMdTMyAAGQbWF4X3Vwd2FyZF9tZXNzYWdlX251bV9wZXJfY2FuZGlkYXRlEAEMdTMyAAGIaHJtcF9tYXhfbWVzc2FnZV9udW1fcGVyX2NhbmRpZGF0ZRABDHUzMgABbHZhbGlkYXRpb25fdXBncmFkZV9jb29sZG93bhABLEJsb2NrTnVtYmVyAAFgdmFsaWRhdGlvbl91cGdyYWRlX2RlbGF5EAEsQmxvY2tOdW1iZXIAAVBhc3luY19iYWNraW5nX3BhcmFtc1UEAUhBc3luY0JhY2tpbmdQYXJhbXMAATBtYXhfcG92X3NpemUQAQx1MzIAAWRtYXhfZG93bndhcmRfbWVzc2FnZV9zaXplEAEMdTMyAAGQaHJtcF9tYXhfcGFyYWNoYWluX291dGJvdW5kX2NoYW5uZWxzEAEMdTMyAAFMaHJtcF9zZW5kZXJfZGVwb3NpdBgBHEJhbGFuY2UAAVhocm1wX3JlY2lwaWVudF9kZXBvc2l0GAEcQmFsYW5jZQABZGhybXBfY2hhbm5lbF9tYXhfY2FwYWNpdHkQAQx1MzIAAWxocm1wX2NoYW5uZWxfbWF4X3RvdGFsX3NpemUQAQx1MzIAAYxocm1wX21heF9wYXJhY2hhaW5faW5ib3VuZF9jaGFubmVscxABDHUzMgABdGhybXBfY2hhbm5lbF9tYXhfbWVzc2FnZV9zaXplEAEMdTMyAAE8ZXhlY3V0b3JfcGFyYW1zWQQBOEV4ZWN1dG9yUGFyYW1zAAFUY29kZV9yZXRlbnRpb25fcGVyaW9kEAEsQmxvY2tOdW1iZXIAAThtYXhfdmFsaWRhdG9yc2ECASxPcHRpb248dTMyPgABOGRpc3B1dGVfcGVyaW9kEAEwU2Vzc2lvbkluZGV4AAGkZGlzcHV0ZV9wb3N0X2NvbmNsdXNpb25fYWNjZXB0YW5jZV9wZXJpb2QQASxCbG9ja051bWJlcgABNG5vX3Nob3dfc2xvdHMQAQx1MzIAAUBuX2RlbGF5X3RyYW5jaGVzEAEMdTMyAAFoemVyb3RoX2RlbGF5X3RyYW5jaGVfd2lkdGgQAQx1MzIAAUBuZWVkZWRfYXBwcm92YWxzEAEMdTMyAAFgcmVsYXlfdnJmX21vZHVsb19zYW1wbGVzEAEMdTMyAAE4cHZmX3ZvdGluZ190dGwQATBTZXNzaW9uSW5kZXgAAYBtaW5pbXVtX3ZhbGlkYXRpb25fdXBncmFkZV9kZWxheRABLEJsb2NrTnVtYmVyAAFUbWluaW11bV9iYWNraW5nX3ZvdGVzEAEMdTMyAAE0bm9kZV9mZWF0dXJlc5EEATBOb2RlRmVhdHVyZXMAAVhhcHByb3ZhbF92b3RpbmdfcGFyYW1zbQQBUEFwcHJvdmFsVm90aW5nUGFyYW1zAAFAc2NoZWR1bGVyX3BhcmFtc3EEAXBTY2hlZHVsZXJQYXJhbXM8QmxvY2tOdW1iZXI+AAAZCwAAAh0LAB0LAAAECBAVCwAhCxBscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zNGNvbmZpZ3VyYXRpb24YcGFsbGV0FEVycm9yBARUAAEEPEludmFsaWROZXdWYWx1ZQAABNxUaGUgbmV3IHZhbHVlIGZvciBhIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyIGlzIGludmFsaWQuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LiULAAACmQQAKQsAAAIdAgAtCwxscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zGHNoYXJlZGhBbGxvd2VkUmVsYXlQYXJlbnRzVHJhY2tlcggQSGFzaAE0LEJsb2NrTnVtYmVyARAACAEYYnVmZmVyMQsBWFZlY0RlcXVlPChIYXNoLCBIYXNoKT4AATRsYXRlc3RfbnVtYmVyEAEsQmxvY2tOdW1iZXIAADELAAACNQsANQsAAAQINDQAOQsAAAI9CwA9CwxscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zJGluY2x1c2lvbnBDYW5kaWRhdGVQZW5kaW5nQXZhaWxhYmlsaXR5CARIATQETgEQACQBEGNvcmV9BwEkQ29yZUluZGV4AAEQaGFzaO0EATRDYW5kaWRhdGVIYXNoAAEoZGVzY3JpcHRvcq0EAVhDYW5kaWRhdGVEZXNjcmlwdG9yPEg+AAEsY29tbWl0bWVudHO9BAFQQ2FuZGlkYXRlQ29tbWl0bWVudHMAAUhhdmFpbGFiaWxpdHlfdm90ZXORBAFgQml0VmVjPHU4LCBCaXRPcmRlckxzYjA+AAEcYmFja2Vyc5EEAWBCaXRWZWM8dTgsIEJpdE9yZGVyTHNiMD4AAUxyZWxheV9wYXJlbnRfbnVtYmVyEAEETgABQGJhY2tlZF9pbl9udW1iZXIQAQROAAE0YmFja2luZ19ncm91cIEHAShHcm91cEluZGV4AABBCxBscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zJGluY2x1c2lvbhhwYWxsZXQURXJyb3IEBFQAAUhkVmFsaWRhdG9ySW5kZXhPdXRPZkJvdW5kcwAABHhWYWxpZGF0b3IgaW5kZXggb3V0IG9mIGJvdW5kcy5QVW5zY2hlZHVsZWRDYW5kaWRhdGUAAQSsQ2FuZGlkYXRlIHN1Ym1pdHRlZCBidXQgcGFyYSBub3Qgc2NoZWR1bGVkLkBIZWFkRGF0YVRvb0xhcmdlAAIEpEhlYWQgZGF0YSBleGNlZWRzIHRoZSBjb25maWd1cmVkIG1heGltdW0uUFByZW1hdHVyZUNvZGVVcGdyYWRlAAMEZENvZGUgdXBncmFkZSBwcmVtYXR1cmVseS48TmV3Q29kZVRvb0xhcmdlAAQEYE91dHB1dCBjb2RlIGlzIHRvbyBsYXJnZVREaXNhbGxvd2VkUmVsYXlQYXJlbnQABQjsVGhlIGNhbmRpZGF0ZSdzIHJlbGF5LXBhcmVudCB3YXMgbm90IGFsbG93ZWQuIEVpdGhlciBpdCB3YXMlAW5vdCByZWNlbnQgZW5vdWdoIG9yIGl0IGRpZG4ndCBhZHZhbmNlIGJhc2VkIG9uIHRoZSBsYXN0IHBhcmFjaGFpbiBibG9jay5ESW52YWxpZEFzc2lnbm1lbnQABggVAUZhaWxlZCB0byBjb21wdXRlIGdyb3VwIGluZGV4IGZvciB0aGUgY29yZTogZWl0aGVyIGl0J3Mgb3V0IG9mIGJvdW5kc+hvciB0aGUgcmVsYXkgcGFyZW50IGRvZXNuJ3QgYmVsb25nIHRvIHRoZSBjdXJyZW50IHNlc3Npb24uREludmFsaWRHcm91cEluZGV4AAcEnEludmFsaWQgZ3JvdXAgaW5kZXggaW4gY29yZSBhc3NpZ25tZW50LkxJbnN1ZmZpY2llbnRCYWNraW5nAAgEkEluc3VmZmljaWVudCAobm9uLW1ham9yaXR5KSBiYWNraW5nLjhJbnZhbGlkQmFja2luZwAJBORJbnZhbGlkIChiYWQgc2lnbmF0dXJlLCB1bmtub3duIHZhbGlkYXRvciwgZXRjLikgYmFja2luZy5ETm90Q29sbGF0b3JTaWduZWQACgRoQ29sbGF0b3IgZGlkIG5vdCBzaWduIFBvVi5oVmFsaWRhdGlvbkRhdGFIYXNoTWlzbWF0Y2gACwTEVGhlIHZhbGlkYXRpb24gZGF0YSBoYXNoIGRvZXMgbm90IG1hdGNoIGV4cGVjdGVkLoBJbmNvcnJlY3REb3dud2FyZE1lc3NhZ2VIYW5kbGluZwAMBNhUaGUgZG93bndhcmQgbWVzc2FnZSBxdWV1ZSBpcyBub3QgcHJvY2Vzc2VkIGNvcnJlY3RseS5USW52YWxpZFVwd2FyZE1lc3NhZ2VzAA0EHQFBdCBsZWFzdCBvbmUgdXB3YXJkIG1lc3NhZ2Ugc2VudCBkb2VzIG5vdCBwYXNzIHRoZSBhY2NlcHRhbmNlIGNyaXRlcmlhLmBIcm1wV2F0ZXJtYXJrTWlzaGFuZGxpbmcADgQRAVRoZSBjYW5kaWRhdGUgZGlkbid0IGZvbGxvdyB0aGUgcnVsZXMgb2YgSFJNUCB3YXRlcm1hcmsgYWR2YW5jZW1lbnQuTEludmFsaWRPdXRib3VuZEhybXAADwTUVGhlIEhSTVAgbWVzc2FnZXMgc2VudCBieSB0aGUgY2FuZGlkYXRlIGlzIG5vdCB2YWxpZC5kSW52YWxpZFZhbGlkYXRpb25Db2RlSGFzaAAQBNxUaGUgdmFsaWRhdGlvbiBjb2RlIGhhc2ggb2YgdGhlIGNhbmRpZGF0ZSBpcyBub3QgdmFsaWQuQFBhcmFIZWFkTWlzbWF0Y2gAEQhVAVRoZSBgcGFyYV9oZWFkYCBoYXNoIGluIHRoZSBjYW5kaWRhdGUgZGVzY3JpcHRvciBkb2Vzbid0IG1hdGNoIHRoZSBoYXNoIG9mIHRoZSBhY3R1YWx0cGFyYSBoZWFkIGluIHRoZSBjb21taXRtZW50cy4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQuRQsMTHBvbGthZG90X3ByaW1pdGl2ZXMIdjdMU2NyYXBlZE9uQ2hhaW5Wb3RlcwQESAE0AAwBHHNlc3Npb24QATBTZXNzaW9uSW5kZXgAAYBiYWNraW5nX3ZhbGlkYXRvcnNfcGVyX2NhbmRpZGF0ZUkLAR0BVmVjPChDYW5kaWRhdGVSZWNlaXB0PEg+LCBWZWM8KFZhbGlkYXRvckluZGV4LCBWYWxpZGl0eUF0dGVzdGF0aW9uKT4pCj4AASBkaXNwdXRlc+UEAWBNdWx0aURpc3B1dGVTdGF0ZW1lbnRTZXQAAEkLAAACTQsATQsAAAQIeQdRCwBRCwAAAlULAFULAAAECJkE4QQAWQsQbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWluczhwYXJhc19pbmhlcmVudBhwYWxsZXQURXJyb3IEBFQAARRkVG9vTWFueUluY2x1c2lvbkluaGVyZW50cwAABMxJbmNsdXNpb24gaW5oZXJlbnQgY2FsbGVkIG1vcmUgdGhhbiBvbmNlIHBlciBibG9jay5MSW52YWxpZFBhcmVudEhlYWRlcgABCFUBVGhlIGhhc2ggb2YgdGhlIHN1Ym1pdHRlZCBwYXJlbnQgaGVhZGVyIGRvZXNuJ3QgY29ycmVzcG9uZCB0byB0aGUgc2F2ZWQgYmxvY2sgaGFzaCBvZix0aGUgcGFyZW50LkhJbmhlcmVudE92ZXJ3ZWlnaHQAAgQJAVRoZSBkYXRhIGdpdmVuIHRvIHRoZSBpbmhlcmVudCB3aWxsIHJlc3VsdCBpbiBhbiBvdmVyd2VpZ2h0IGJsb2NrLoRDYW5kaWRhdGVzRmlsdGVyZWREdXJpbmdFeGVjdXRpb24AAwhNAUEgY2FuZGlkYXRlIHdhcyBmaWx0ZXJlZCBkdXJpbmcgaW5oZXJlbnQgZXhlY3V0aW9uLiBUaGlzIHNob3VsZCBoYXZlIG9ubHkgYmVlbiBkb25lQGR1cmluZyBjcmVhdGlvbi5QVW5zY2hlZHVsZWRDYW5kaWRhdGUABAR0VG9vIG1hbnkgY2FuZGlkYXRlcyBzdXBwbGllZC4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQuXQsAAAIlCwBhCwAAAmULAGULEGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMkc2NoZWR1bGVyGHBhbGxldDBDb3JlT2NjdXBpZWQEBE4BEAEIEEZyZWUAAAAUUGFyYXMEAGkLATRQYXJhc0VudHJ5PE4+AAEAAGkLEGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMkc2NoZWR1bGVyGHBhbGxldChQYXJhc0VudHJ5BAROARAADAEoYXNzaWdubWVudG0LAShBc3NpZ25tZW50AAFUYXZhaWxhYmlsaXR5X3RpbWVvdXRzEAEMdTMyAAEMdHRsEAEETgAAbQsQbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucyRzY2hlZHVsZXIYY29tbW9uKEFzc2lnbm1lbnQAAQgQUG9vbAgBHHBhcmFfaWSNAgEYUGFyYUlkAAEoY29yZV9pbmRleH0HASRDb3JlSW5kZXgAAAAQQnVsawQAjQIBGFBhcmFJZAABAABxCwQgQlRyZWVNYXAIBEsBfQcEVgF1CwAEAHkLAAAAdQsAAAJpCwB5CwAAAn0LAH0LAAAECH0HdQsAgQsMbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucxRwYXJhc1xQdmZDaGVja0FjdGl2ZVZvdGVTdGF0ZQQsQmxvY2tOdW1iZXIBEAAUATB2b3Rlc19hY2NlcHSRBAFgQml0VmVjPHU4LCBCaXRPcmRlckxzYjA+AAEwdm90ZXNfcmVqZWN0kQQBYEJpdFZlYzx1OCwgQml0T3JkZXJMc2IwPgABDGFnZRABMFNlc3Npb25JbmRleAABKGNyZWF0ZWRfYXQQASxCbG9ja051bWJlcgABGGNhdXNlc4ULAXxWZWM8UHZmQ2hlY2tDYXVzZTxCbG9ja051bWJlcj4+AACFCwAAAokLAIkLDGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMUcGFyYXM0UHZmQ2hlY2tDYXVzZQQsQmxvY2tOdW1iZXIBEAEIKE9uYm9hcmRpbmcEAI0CARhQYXJhSWQAAAAcVXBncmFkZQwBCGlkjQIBGFBhcmFJZAABLGluY2x1ZGVkX2F0EAEsQmxvY2tOdW1iZXIAAUB1cGdyYWRlX3N0cmF0ZWd5jQsBPFVwZ3JhZGVTdHJhdGVneQABAACNCwxscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zFHBhcmFzPFVwZ3JhZGVTdHJhdGVneQABCEBTZXRHb0FoZWFkU2lnbmFsAAAAUEFwcGx5QXRFeHBlY3RlZEJsb2NrAAEAAJELAAACuQQAlQsAAAKNAgCZCwxscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zFHBhcmFzNFBhcmFMaWZlY3ljbGUAARwoT25ib2FyZGluZwAAAChQYXJhdGhyZWFkAAEAJFBhcmFjaGFpbgACAExVcGdyYWRpbmdQYXJhdGhyZWFkAAMAUERvd25ncmFkaW5nUGFyYWNoYWluAAQAVE9mZmJvYXJkaW5nUGFyYXRocmVhZAAFAFBPZmZib2FyZGluZ1BhcmFjaGFpbgAGAACdCwAABAiNAhAAoQsMbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucxRwYXJhc0BQYXJhUGFzdENvZGVNZXRhBAROARAACAE0dXBncmFkZV90aW1lc6ULAWBWZWM8UmVwbGFjZW1lbnRUaW1lczxOPj4AASxsYXN0X3BydW5lZGECASRPcHRpb248Tj4AAKULAAACqQsAqQsMbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucxRwYXJhc0BSZXBsYWNlbWVudFRpbWVzBAROARAACAEsZXhwZWN0ZWRfYXQQAQROAAEwYWN0aXZhdGVkX2F0EAEETgAArQsAAAKdCwCxCwxMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2NzhVcGdyYWRlR29BaGVhZAABCBRBYm9ydAAAABxHb0FoZWFkAAEAALULDExwb2xrYWRvdF9wcmltaXRpdmVzCHY3SFVwZ3JhZGVSZXN0cmljdGlvbgABBBxQcmVzZW50AAAAALkLEGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMUcGFyYXMYcGFsbGV0FEVycm9yBARUAAE0NE5vdFJlZ2lzdGVyZWQAAASUUGFyYSBpcyBub3QgcmVnaXN0ZXJlZCBpbiBvdXIgc3lzdGVtLjRDYW5ub3RPbmJvYXJkAAEEFQFQYXJhIGNhbm5vdCBiZSBvbmJvYXJkZWQgYmVjYXVzZSBpdCBpcyBhbHJlYWR5IHRyYWNrZWQgYnkgb3VyIHN5c3RlbS44Q2Fubm90T2ZmYm9hcmQAAgScUGFyYSBjYW5ub3QgYmUgb2ZmYm9hcmRlZCBhdCB0aGlzIHRpbWUuNENhbm5vdFVwZ3JhZGUAAwTUUGFyYSBjYW5ub3QgYmUgdXBncmFkZWQgdG8gYSBsZWFzZSBob2xkaW5nIHBhcmFjaGFpbi48Q2Fubm90RG93bmdyYWRlAAQE0FBhcmEgY2Fubm90IGJlIGRvd25ncmFkZWQgdG8gYW4gb24tZGVtYW5kIHBhcmFjaGFpbi5YUHZmQ2hlY2tTdGF0ZW1lbnRTdGFsZQAFBLBUaGUgc3RhdGVtZW50IGZvciBQVkYgcHJlLWNoZWNraW5nIGlzIHN0YWxlLlxQdmZDaGVja1N0YXRlbWVudEZ1dHVyZQAGBOxUaGUgc3RhdGVtZW50IGZvciBQVkYgcHJlLWNoZWNraW5nIGlzIGZvciBhIGZ1dHVyZSBzZXNzaW9uLoRQdmZDaGVja1ZhbGlkYXRvckluZGV4T3V0T2ZCb3VuZHMABwSkQ2xhaW1lZCB2YWxpZGF0b3IgaW5kZXggaXMgb3V0IG9mIGJvdW5kcy5gUHZmQ2hlY2tJbnZhbGlkU2lnbmF0dXJlAAgEyFRoZSBzaWduYXR1cmUgZm9yIHRoZSBQVkYgcHJlLWNoZWNraW5nIGlzIGludmFsaWQuSFB2ZkNoZWNrRG91YmxlVm90ZQAJBLBUaGUgZ2l2ZW4gdmFsaWRhdG9yIGFscmVhZHkgaGFzIGNhc3QgYSB2b3RlLlhQdmZDaGVja1N1YmplY3RJbnZhbGlkAAoE9FRoZSBnaXZlbiBQVkYgZG9lcyBub3QgZXhpc3QgYXQgdGhlIG1vbWVudCBvZiBwcm9jZXNzIGEgdm90ZS5EQ2Fubm90VXBncmFkZUNvZGUACwTMUGFyYWNoYWluIGNhbm5vdCBjdXJyZW50bHkgc2NoZWR1bGUgYSBjb2RlIHVwZ3JhZGUuLEludmFsaWRDb2RlAAwEdEludmFsaWQgdmFsaWRhdGlvbiBjb2RlIHNpemUuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0Lr0LAAACwQsAwQsMbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucyxpbml0aWFsaXplclRCdWZmZXJlZFNlc3Npb25DaGFuZ2UAAAwBKHZhbGlkYXRvcnMpCwFAVmVjPFZhbGlkYXRvcklkPgABGHF1ZXVlZCkLAUBWZWM8VmFsaWRhdG9ySWQ+AAE0c2Vzc2lvbl9pbmRleBABMFNlc3Npb25JbmRleAAAxQsAAALJCwDJCwhgcG9sa2Fkb3RfY29yZV9wcmltaXRpdmVzWEluYm91bmREb3dud2FyZE1lc3NhZ2UELEJsb2NrTnVtYmVyARAACAEcc2VudF9hdBABLEJsb2NrTnVtYmVyAAEMbXNnOAE8RG93bndhcmRNZXNzYWdlAADNCwxscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zEGhybXBYSHJtcE9wZW5DaGFubmVsUmVxdWVzdAAAGAEkY29uZmlybWVkIAEQYm9vbAABEF9hZ2UQATBTZXNzaW9uSW5kZXgAAThzZW5kZXJfZGVwb3NpdBgBHEJhbGFuY2UAAUBtYXhfbWVzc2FnZV9zaXplEAEMdTMyAAEwbWF4X2NhcGFjaXR5EAEMdTMyAAE4bWF4X3RvdGFsX3NpemUQAQx1MzIAANELAAACGQUA1QsMbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucxBocm1wLEhybXBDaGFubmVsAAAgATBtYXhfY2FwYWNpdHkQAQx1MzIAAThtYXhfdG90YWxfc2l6ZRABDHUzMgABQG1heF9tZXNzYWdlX3NpemUQAQx1MzIAASRtc2dfY291bnQQAQx1MzIAASh0b3RhbF9zaXplEAEMdTMyAAEgbXFjX2hlYWSdAgEwT3B0aW9uPEhhc2g+AAE4c2VuZGVyX2RlcG9zaXQYARxCYWxhbmNlAAFEcmVjaXBpZW50X2RlcG9zaXQYARxCYWxhbmNlAADZCwAAAt0LAN0LCGBwb2xrYWRvdF9jb3JlX3ByaW1pdGl2ZXNISW5ib3VuZEhybXBNZXNzYWdlBCxCbG9ja051bWJlcgEQAAgBHHNlbnRfYXQQASxCbG9ja051bWJlcgABEGRhdGE4AVBzcF9zdGQ6OnZlYzo6VmVjPHU4PgAA4QsAAALlCwDlCwAABAgQlQsA6QsQbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucxBocm1wGHBhbGxldBRFcnJvcgQEVAABUFRPcGVuSHJtcENoYW5uZWxUb1NlbGYAAATEVGhlIHNlbmRlciB0cmllZCB0byBvcGVuIGEgY2hhbm5lbCB0byB0aGVtc2VsdmVzLnxPcGVuSHJtcENoYW5uZWxJbnZhbGlkUmVjaXBpZW50AAEEiFRoZSByZWNpcGllbnQgaXMgbm90IGEgdmFsaWQgcGFyYS5sT3BlbkhybXBDaGFubmVsWmVyb0NhcGFjaXR5AAIEfFRoZSByZXF1ZXN0ZWQgY2FwYWNpdHkgaXMgemVyby6MT3BlbkhybXBDaGFubmVsQ2FwYWNpdHlFeGNlZWRzTGltaXQAAwTAVGhlIHJlcXVlc3RlZCBjYXBhY2l0eSBleGNlZWRzIHRoZSBnbG9iYWwgbGltaXQueE9wZW5Icm1wQ2hhbm5lbFplcm9NZXNzYWdlU2l6ZQAEBKBUaGUgcmVxdWVzdGVkIG1heGltdW0gbWVzc2FnZSBzaXplIGlzIDAumE9wZW5Icm1wQ2hhbm5lbE1lc3NhZ2VTaXplRXhjZWVkc0xpbWl0AAUEKQFUaGUgb3BlbiByZXF1ZXN0IHJlcXVlc3RlZCB0aGUgbWVzc2FnZSBzaXplIHRoYXQgZXhjZWVkcyB0aGUgZ2xvYmFsIGxpbWl0LnBPcGVuSHJtcENoYW5uZWxBbHJlYWR5RXhpc3RzAAYEaFRoZSBjaGFubmVsIGFscmVhZHkgZXhpc3RzfE9wZW5Icm1wQ2hhbm5lbEFscmVhZHlSZXF1ZXN0ZWQABwTQVGhlcmUgaXMgYWxyZWFkeSBhIHJlcXVlc3QgdG8gb3BlbiB0aGUgc2FtZSBjaGFubmVsLnBPcGVuSHJtcENoYW5uZWxMaW1pdEV4Y2VlZGVkAAgEHQFUaGUgc2VuZGVyIGFscmVhZHkgaGFzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBhbGxvd2VkIG91dGJvdW5kIGNoYW5uZWxzLnBBY2NlcHRIcm1wQ2hhbm5lbERvZXNudEV4aXN0AAkE4FRoZSBjaGFubmVsIGZyb20gdGhlIHNlbmRlciB0byB0aGUgb3JpZ2luIGRvZXNuJ3QgZXhpc3QuhEFjY2VwdEhybXBDaGFubmVsQWxyZWFkeUNvbmZpcm1lZAAKBIRUaGUgY2hhbm5lbCBpcyBhbHJlYWR5IGNvbmZpcm1lZC54QWNjZXB0SHJtcENoYW5uZWxMaW1pdEV4Y2VlZGVkAAsEJQFUaGUgcmVjaXBpZW50IGFscmVhZHkgaGFzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBhbGxvd2VkIGluYm91bmQgY2hhbm5lbHMucENsb3NlSHJtcENoYW5uZWxVbmF1dGhvcml6ZWQADARVAVRoZSBvcmlnaW4gdHJpZXMgdG8gY2xvc2UgYSBjaGFubmVsIHdoZXJlIGl0IGlzIG5laXRoZXIgdGhlIHNlbmRlciBub3IgdGhlIHJlY2lwaWVudC5sQ2xvc2VIcm1wQ2hhbm5lbERvZXNudEV4aXN0AA0EnFRoZSBjaGFubmVsIHRvIGJlIGNsb3NlZCBkb2Vzbid0IGV4aXN0LnxDbG9zZUhybXBDaGFubmVsQWxyZWFkeVVuZGVyd2F5AA4EvFRoZSBjaGFubmVsIGNsb3NlIHJlcXVlc3QgaXMgYWxyZWFkeSByZXF1ZXN0ZWQuhENhbmNlbEhybXBPcGVuQ2hhbm5lbFVuYXV0aG9yaXplZAAPBF0BQ2FuY2VsaW5nIGlzIHJlcXVlc3RlZCBieSBuZWl0aGVyIHRoZSBzZW5kZXIgbm9yIHJlY2lwaWVudCBvZiB0aGUgb3BlbiBjaGFubmVsIHJlcXVlc3QuaE9wZW5Icm1wQ2hhbm5lbERvZXNudEV4aXN0ABAEfFRoZSBvcGVuIHJlcXVlc3QgZG9lc24ndCBleGlzdC58T3BlbkhybXBDaGFubmVsQWxyZWFkeUNvbmZpcm1lZAARBC0BQ2Fubm90IGNhbmNlbCBhbiBIUk1QIG9wZW4gY2hhbm5lbCByZXF1ZXN0IGJlY2F1c2UgaXQgaXMgYWxyZWFkeSBjb25maXJtZWQuMFdyb25nV2l0bmVzcwASBIxUaGUgcHJvdmlkZWQgd2l0bmVzcyBkYXRhIGlzIHdyb25nLnBDaGFubmVsQ3JlYXRpb25Ob3RBdXRob3JpemVkABME6FRoZSBjaGFubmVsIGJldHdlZW4gdGhlc2UgdHdvIGNoYWlucyBjYW5ub3QgYmUgYXV0aG9yaXplZC4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQu7QsAAAIhAgDxCwxMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2NyxTZXNzaW9uSW5mbwAANAFgYWN0aXZlX3ZhbGlkYXRvcl9pbmRpY2VzJQsBTFZlYzxWYWxpZGF0b3JJbmRleD4AASxyYW5kb21fc2VlZAQBIFt1ODsgMzJdAAE4ZGlzcHV0ZV9wZXJpb2QQATBTZXNzaW9uSW5kZXgAASh2YWxpZGF0b3Jz9QsBnEluZGV4ZWRWZWM8VmFsaWRhdG9ySW5kZXgsIFZhbGlkYXRvcklkPgABOGRpc2NvdmVyeV9rZXlzeQkBZFZlYzxBdXRob3JpdHlEaXNjb3ZlcnlJZD4AATxhc3NpZ25tZW50X2tleXPtCwFEVmVjPEFzc2lnbm1lbnRJZD4AAUB2YWxpZGF0b3JfZ3JvdXBz+QsBrEluZGV4ZWRWZWM8R3JvdXBJbmRleCwgVmVjPFZhbGlkYXRvckluZGV4Pj4AARxuX2NvcmVzEAEMdTMyAAFoemVyb3RoX2RlbGF5X3RyYW5jaGVfd2lkdGgQAQx1MzIAAWByZWxheV92cmZfbW9kdWxvX3NhbXBsZXMQAQx1MzIAAUBuX2RlbGF5X3RyYW5jaGVzEAEMdTMyAAE0bm9fc2hvd19zbG90cxABDHUzMgABQG5lZWRlZF9hcHByb3ZhbHMQAQx1MzIAAPULDExwb2xrYWRvdF9wcmltaXRpdmVzCHY3KEluZGV4ZWRWZWMIBEsBmQQEVgEdAgAEACkLARhWZWM8Vj4AAPkLDExwb2xrYWRvdF9wcmltaXRpdmVzCHY3KEluZGV4ZWRWZWMIBEsBgQcEVgElCwAEAF0LARhWZWM8Vj4AAP0LAAAECBDtBAABDAxMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2NzBEaXNwdXRlU3RhdGUEBE4BEAAQATh2YWxpZGF0b3JzX2ZvcpEEAXxCaXRWZWM8dTgsIGJpdHZlYzo6b3JkZXI6OkxzYjA+AAFIdmFsaWRhdG9yc19hZ2FpbnN0kQQBfEJpdFZlYzx1OCwgYml0dmVjOjpvcmRlcjo6THNiMD4AARRzdGFydBABBE4AATBjb25jbHVkZWRfYXRhAgEkT3B0aW9uPE4+AAAFDAQgQlRyZWVTZXQEBFQBmQQABAAlCwAAAAkMEGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMgZGlzcHV0ZXMYcGFsbGV0FEVycm9yBARUAAEkdER1cGxpY2F0ZURpc3B1dGVTdGF0ZW1lbnRTZXRzAAAEqER1cGxpY2F0ZSBkaXNwdXRlIHN0YXRlbWVudCBzZXRzIHByb3ZpZGVkLlxBbmNpZW50RGlzcHV0ZVN0YXRlbWVudAABBIxBbmNpZW50IGRpc3B1dGUgc3RhdGVtZW50IHByb3ZpZGVkLmRWYWxpZGF0b3JJbmRleE91dE9mQm91bmRzAAIE6FZhbGlkYXRvciBpbmRleCBvbiBzdGF0ZW1lbnQgaXMgb3V0IG9mIGJvdW5kcyBmb3Igc2Vzc2lvbi5ASW52YWxpZFNpZ25hdHVyZQADBHxJbnZhbGlkIHNpZ25hdHVyZSBvbiBzdGF0ZW1lbnQuSER1cGxpY2F0ZVN0YXRlbWVudAAEBMxWYWxpZGF0b3Igdm90ZSBzdWJtaXR0ZWQgbW9yZSB0aGFuIG9uY2UgdG8gZGlzcHV0ZS5IU2luZ2xlU2lkZWREaXNwdXRlAAUExEEgZGlzcHV0ZSB3aGVyZSB0aGVyZSBhcmUgb25seSB2b3RlcyBvbiBvbmUgc2lkZS48TWFsaWNpb3VzQmFja2VyAAYEnEEgZGlzcHV0ZSB2b3RlIGZyb20gYSBtYWxpY2lvdXMgYmFja2VyLkxNaXNzaW5nQmFja2luZ1ZvdGVzAAcE4E5vIGJhY2tpbmcgdm90ZXMgd2VyZSBwcm92aWRlcyBhbG9uZyBkaXNwdXRlIHN0YXRlbWVudHMuSFVuY29uZmlybWVkRGlzcHV0ZQAIBLBVbmNvbmZpcm1lZCBkaXNwdXRlIHN0YXRlbWVudCBzZXRzIHByb3ZpZGVkLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC4NDBBMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2NyBzbGFzaGluZzhQZW5kaW5nU2xhc2hlcwAACAEQa2V5cxEMAZRCVHJlZU1hcDxWYWxpZGF0b3JJbmRleCwgVmFsaWRhdG9ySWQ+AAEQa2luZC0FAUxTbGFzaGluZ09mZmVuY2VLaW5kAAARDAQgQlRyZWVNYXAIBEsBmQQEVgEdAgAEABUMAAAAFQwAAAIZDAAZDAAABAiZBB0CAB0MFGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMgZGlzcHV0ZXMgc2xhc2hpbmcYcGFsbGV0FEVycm9yBARUAAEYYEludmFsaWRLZXlPd25lcnNoaXBQcm9vZgAABIxUaGUga2V5IG93bmVyc2hpcCBwcm9vZiBpcyBpbnZhbGlkLkxJbnZhbGlkU2Vzc2lvbkluZGV4AAEEoFRoZSBzZXNzaW9uIGluZGV4IGlzIHRvbyBvbGQgb3IgaW52YWxpZC5QSW52YWxpZENhbmRpZGF0ZUhhc2gAAgR4VGhlIGNhbmRpZGF0ZSBoYXNoIGlzIGludmFsaWQuVEludmFsaWRWYWxpZGF0b3JJbmRleAADCAEBVGhlcmUgaXMgbm8gcGVuZGluZyBzbGFzaCBmb3IgdGhlIGdpdmVuIHZhbGlkYXRvciBpbmRleCBhbmQgdGltZRRzbG90LmBWYWxpZGF0b3JJbmRleElkTWlzbWF0Y2gABATQVGhlIHZhbGlkYXRvciBpbmRleCBkb2VzIG5vdCBtYXRjaCB0aGUgdmFsaWRhdG9yIGlkLlxEdXBsaWNhdGVTbGFzaGluZ1JlcG9ydAAFBA0BVGhlIGdpdmVuIHNsYXNoaW5nIHJlcG9ydCBpcyB2YWxpZCBidXQgYWxyZWFkeSBwcmV2aW91c2x5IHJlcG9ydGVkLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC4hDBBscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zSGFzc2lnbmVyX29uX2RlbWFuZBR0eXBlc0RDb3JlQWZmaW5pdHlDb3VudAAACAEoY29yZV9pbmRleH0HASRDb3JlSW5kZXgAARRjb3VudBABDHUzMgAAJQwQbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWluc0hhc3NpZ25lcl9vbl9kZW1hbmQUdHlwZXM8UXVldWVTdGF0dXNUeXBlAAAQARx0cmFmZmlj0QYBJEZpeGVkVTEyOAABKG5leHRfaW5kZXgpDAEoUXVldWVJbmRleAABOHNtYWxsZXN0X2luZGV4KQwBKFF1ZXVlSW5kZXgAATRmcmVlZF9pbmRpY2VzLQwBdEJpbmFyeUhlYXA8UmV2ZXJzZVF1ZXVlSW5kZXg+AAApDBBscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zSGFzc2lnbmVyX29uX2RlbWFuZBR0eXBlcyhRdWV1ZUluZGV4AAAEABABDHUzMgAALQwEKEJpbmFyeUhlYXAEBFQBMQwABAA1DAAAADEMEGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnNIYXNzaWduZXJfb25fZGVtYW5kFHR5cGVzRFJldmVyc2VRdWV1ZUluZGV4AAAEABABDHUzMgAANQwAAAIxDAA5DAQoQmluYXJ5SGVhcAQEVAE9DAAEAEEMAAAAPQwQbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWluc0hhc3NpZ25lcl9vbl9kZW1hbmQUdHlwZXM0RW5xdWV1ZWRPcmRlcgAACAEccGFyYV9pZI0CARhQYXJhSWQAAQxpZHgpDAEoUXVldWVJbmRleAAAQQwAAAI9DABFDAxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUARgEUwAABABJDAEYVmVjPFQ+AABJDAAAAhgATQwQbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWluc0hhc3NpZ25lcl9vbl9kZW1hbmQYcGFsbGV0FEVycm9yBARUAAEIJFF1ZXVlRnVsbAAABORUaGUgb3JkZXIgcXVldWUgaXMgZnVsbCwgYHBsYWNlX29yZGVyYCB3aWxsIG5vdCBjb250aW51ZS5wU3BvdFByaWNlSGlnaGVyVGhhbk1heEFtb3VudAABCE0BVGhlIGN1cnJlbnQgc3BvdCBwcmljZSBpcyBoaWdoZXIgdGhhbiB0aGUgbWF4IGFtb3VudCBzcGVjaWZpZWQgaW4gdGhlIGBwbGFjZV9vcmRlcmBgY2FsbCwgbWFraW5nIGl0IGludmFsaWQuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LlEMAAAECBB9BwBVDAxscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zRGFzc2lnbmVyX2NvcmV0aW1lIFNjaGVkdWxlBAROARAADAEsYXNzaWdubWVudHNdBQGMVmVjPChDb3JlQXNzaWdubWVudCwgUGFydHNPZjU3NjAwKT4AASBlbmRfaGludGECASRPcHRpb248Tj4AATRuZXh0X3NjaGVkdWxlYQIBJE9wdGlvbjxOPgAAWQwMbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWluc0Rhc3NpZ25lcl9jb3JldGltZThDb3JlRGVzY3JpcHRvcgQETgEQAAgBFHF1ZXVlXQwBaE9wdGlvbjxRdWV1ZURlc2NyaXB0b3I8Tj4+AAEwY3VycmVudF93b3JrZQwBUE9wdGlvbjxXb3JrU3RhdGU8Tj4+AABdDAQYT3B0aW9uBARUAWEMAQgQTm9uZQAAABBTb21lBABhDAAAAQAAYQwMbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWluc0Rhc3NpZ25lcl9jb3JldGltZTxRdWV1ZURlc2NyaXB0b3IEBE4BEAAIARRmaXJzdBABBE4AARBsYXN0EAEETgAAZQwEGE9wdGlvbgQEVAFpDAEIEE5vbmUAAAAQU29tZQQAaQwAAAEAAGkMDGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnNEYXNzaWduZXJfY29yZXRpbWUkV29ya1N0YXRlBAROARAAEAEsYXNzaWdubWVudHNtDAGYVmVjPChDb3JlQXNzaWdubWVudCwgQXNzaWdubWVudFN0YXRlKT4AASBlbmRfaGludGECASRPcHRpb248Tj4AAQxwb3NtAQEMdTE2AAEQc3RlcGkFATBQYXJ0c09mNTc2MDAAAG0MAAACcQwAcQwAAAQIZQV1DAB1DAxscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zRGFzc2lnbmVyX2NvcmV0aW1lPEFzc2lnbm1lbnRTdGF0ZQAACAEUcmF0aW9pBQEwUGFydHNPZjU3NjAwAAEkcmVtYWluaW5naQUBMFBhcnRzT2Y1NzYwMAAAeQwQbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWluc0Rhc3NpZ25lcl9jb3JldGltZRhwYWxsZXQURXJyb3IEBFQAARhAQXNzaWdubWVudHNFbXB0eQAAADRPdmVyU2NoZWR1bGVkAAEEkEFzc2lnbm1lbnRzIHRvZ2V0aGVyIGV4Y2VlZGVkIDU3NjAwLjhVbmRlclNjaGVkdWxlZAACBJBBc3NpZ25tZW50cyB0b2dldGhlciBsZXNzIHRoYW4gNTc2MDBARGlzYWxsb3dlZEluc2VydAADCFEBYXNzaWduX2NvcmUgaXMgb25seSBhbGxvd2VkIHRvIGFwcGVuZCBuZXcgYXNzaWdubWVudHMgYXQgdGhlIGVuZCBvZiBhbHJlYWR5IGV4aXN0aW5nFG9uZXMuPER1cGxpY2F0ZUluc2VydAAEBFUBVHJpZWQgdG8gaW5zZXJ0IGEgc2NoZWR1bGUgZm9yIHRoZSBzYW1lIGNvcmUgYW5kIGJsb2NrIG51bWJlciBhcyBhbiBleGlzdGluZyBzY2hlZHVsZVBBc3NpZ25tZW50c05vdFNvcnRlZAAFBKxUcmllZCB0byBhZGQgYW4gdW5zb3J0ZWQgc2V0IG9mIGFzc2lnbm1lbnRzBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0Ln0MDFxwb2xrYWRvdF9ydW50aW1lX2NvbW1vbjxwYXJhc19yZWdpc3RyYXIgUGFyYUluZm8IHEFjY291bnQBABxCYWxhbmNlARgADAEcbWFuYWdlcgABHEFjY291bnQAARxkZXBvc2l0GAEcQmFsYW5jZQABGGxvY2tlZM0CATBPcHRpb248Ym9vbD4AAIEMEFxwb2xrYWRvdF9ydW50aW1lX2NvbW1vbjxwYXJhc19yZWdpc3RyYXIYcGFsbGV0FEVycm9yBARUAAE4NE5vdFJlZ2lzdGVyZWQAAARkVGhlIElEIGlzIG5vdCByZWdpc3RlcmVkLkRBbHJlYWR5UmVnaXN0ZXJlZAABBHRUaGUgSUQgaXMgYWxyZWFkeSByZWdpc3RlcmVkLiBOb3RPd25lcgACBJxUaGUgY2FsbGVyIGlzIG5vdCB0aGUgb3duZXIgb2YgdGhpcyBJZC4wQ29kZVRvb0xhcmdlAAMEXEludmFsaWQgcGFyYSBjb2RlIHNpemUuQEhlYWREYXRhVG9vTGFyZ2UABARwSW52YWxpZCBwYXJhIGhlYWQgZGF0YSBzaXplLjBOb3RQYXJhY2hhaW4ABQRgUGFyYSBpcyBub3QgYSBQYXJhY2hhaW4uNE5vdFBhcmF0aHJlYWQABgS8UGFyYSBpcyBub3QgYSBQYXJhdGhyZWFkIChvbi1kZW1hbmQgcGFyYWNoYWluKS5AQ2Fubm90RGVyZWdpc3RlcgAHBFhDYW5ub3QgZGVyZWdpc3RlciBwYXJhPENhbm5vdERvd25ncmFkZQAIBC0BQ2Fubm90IHNjaGVkdWxlIGRvd25ncmFkZSBvZiBsZWFzZSBob2xkaW5nIHBhcmFjaGFpbiB0byBvbi1kZW1hbmQgcGFyYWNoYWluNENhbm5vdFVwZ3JhZGUACQQlAUNhbm5vdCBzY2hlZHVsZSB1cGdyYWRlIG9mIG9uLWRlbWFuZCBwYXJhY2hhaW4gdG8gbGVhc2UgaG9sZGluZyBwYXJhY2hhaW4oUGFyYUxvY2tlZAAKCEkBUGFyYSBpcyBsb2NrZWQgZnJvbSBtYW5pcHVsYXRpb24gYnkgdGhlIG1hbmFnZXIuIE11c3QgdXNlIHBhcmFjaGFpbiBvciByZWxheSBjaGFpbixnb3Zlcm5hbmNlLixOb3RSZXNlcnZlZAALBNBUaGUgSUQgZ2l2ZW4gZm9yIHJlZ2lzdHJhdGlvbiBoYXMgbm90IGJlZW4gcmVzZXJ2ZWQuLEludmFsaWRDb2RlAAwEfFRoZSB2YWxpZGF0aW9uIGNvZGUgaXMgaW52YWxpZC4oQ2Fubm90U3dhcAANCFEBQ2Fubm90IHBlcmZvcm0gYSBwYXJhY2hhaW4gc2xvdCAvIGxpZmVjeWNsZSBzd2FwLiBDaGVjayB0aGF0IHRoZSBzdGF0ZSBvZiBib3RoIHBhcmFzhGFyZSBjb3JyZWN0IGZvciB0aGUgc3dhcCB0byB3b3JrLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC6FDAAAAjEIAIkMEFxwb2xrYWRvdF9ydW50aW1lX2NvbW1vbhRzbG90cxhwYWxsZXQURXJyb3IEBFQAAQhEUGFyYU5vdE9uYm9hcmRpbmcAAASMVGhlIHBhcmFjaGFpbiBJRCBpcyBub3Qgb25ib2FyZGluZy4oTGVhc2VFcnJvcgABBIhUaGVyZSB3YXMgYW4gZXJyb3Igd2l0aCB0aGUgbGVhc2UuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0Lo0MAAAECACNAgCRDAAAAyQAAACVDACVDAQYT3B0aW9uBARUAZkMAQgQTm9uZQAAABBTb21lBACZDAAAAQAAmQwAAAQMAI0CGACdDBBccG9sa2Fkb3RfcnVudGltZV9jb21tb24gYXVjdGlvbnMYcGFsbGV0FEVycm9yBARUAAEcREF1Y3Rpb25JblByb2dyZXNzAAAEkFRoaXMgYXVjdGlvbiBpcyBhbHJlYWR5IGluIHByb2dyZXNzLkRMZWFzZVBlcmlvZEluUGFzdAABBIBUaGUgbGVhc2UgcGVyaW9kIGlzIGluIHRoZSBwYXN0LkRQYXJhTm90UmVnaXN0ZXJlZAACBFhQYXJhIGlzIG5vdCByZWdpc3RlcmVkRE5vdEN1cnJlbnRBdWN0aW9uAAMEWE5vdCBhIGN1cnJlbnQgYXVjdGlvbi4oTm90QXVjdGlvbgAEBDxOb3QgYW4gYXVjdGlvbi4wQXVjdGlvbkVuZGVkAAUEaEF1Y3Rpb24gaGFzIGFscmVhZHkgZW5kZWQuQEFscmVhZHlMZWFzZWRPdXQABgTYVGhlIHBhcmEgaXMgYWxyZWFkeSBsZWFzZWQgb3V0IGZvciBwYXJ0IG9mIHRoaXMgcmFuZ2UuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LqEMDFxwb2xrYWRvdF9ydW50aW1lX2NvbW1vbiRjcm93ZGxvYW4gRnVuZEluZm8QJEFjY291bnRJZAEAHEJhbGFuY2UBGCxCbG9ja051bWJlcgEQLExlYXNlUGVyaW9kARAAKAEkZGVwb3NpdG9yAAEkQWNjb3VudElkAAEgdmVyaWZpZXJJBQFMT3B0aW9uPE11bHRpU2lnbmVyPgABHGRlcG9zaXQYARxCYWxhbmNlAAEYcmFpc2VkGAEcQmFsYW5jZQABDGVuZBABLEJsb2NrTnVtYmVyAAEMY2FwGAEcQmFsYW5jZQABRGxhc3RfY29udHJpYnV0aW9upQwBdExhc3RDb250cmlidXRpb248QmxvY2tOdW1iZXI+AAEwZmlyc3RfcGVyaW9kEAEsTGVhc2VQZXJpb2QAASxsYXN0X3BlcmlvZBABLExlYXNlUGVyaW9kAAEoZnVuZF9pbmRleBABJEZ1bmRJbmRleAAApQwMXHBvbGthZG90X3J1bnRpbWVfY29tbW9uJGNyb3dkbG9hbkBMYXN0Q29udHJpYnV0aW9uBCxCbG9ja051bWJlcgEQAQwUTmV2ZXIAAAAkUHJlRW5kaW5nBAAQAQx1MzIAAQAYRW5kaW5nBAAQASxCbG9ja051bWJlcgACAACpDBBccG9sa2Fkb3RfcnVudGltZV9jb21tb24kY3Jvd2Rsb2FuGHBhbGxldBRFcnJvcgQEVAABXERGaXJzdFBlcmlvZEluUGFzdAAABPRUaGUgY3VycmVudCBsZWFzZSBwZXJpb2QgaXMgbW9yZSB0aGFuIHRoZSBmaXJzdCBsZWFzZSBwZXJpb2QuZEZpcnN0UGVyaW9kVG9vRmFySW5GdXR1cmUAAQQRAVRoZSBmaXJzdCBsZWFzZSBwZXJpb2QgbmVlZHMgdG8gYXQgbGVhc3QgYmUgbGVzcyB0aGFuIDMgYG1heF92YWx1ZWAubExhc3RQZXJpb2RCZWZvcmVGaXJzdFBlcmlvZAACBOhMYXN0IGxlYXNlIHBlcmlvZCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBmaXJzdCBsZWFzZSBwZXJpb2QuYExhc3RQZXJpb2RUb29GYXJJbkZ1dHVyZQADBC0BVGhlIGxhc3QgbGVhc2UgcGVyaW9kIGNhbm5vdCBiZSBtb3JlIHRoYW4gMyBwZXJpb2RzIGFmdGVyIHRoZSBmaXJzdCBwZXJpb2QuPENhbm5vdEVuZEluUGFzdAAEBEUBVGhlIGNhbXBhaWduIGVuZHMgYmVmb3JlIHRoZSBjdXJyZW50IGJsb2NrIG51bWJlci4gVGhlIGVuZCBtdXN0IGJlIGluIHRoZSBmdXR1cmUuREVuZFRvb0ZhckluRnV0dXJlAAUEwFRoZSBlbmQgZGF0ZSBmb3IgdGhpcyBjcm93ZGxvYW4gaXMgbm90IHNlbnNpYmxlLiBPdmVyZmxvdwAGBFhUaGVyZSB3YXMgYW4gb3ZlcmZsb3cuUENvbnRyaWJ1dGlvblRvb1NtYWxsAAcE6FRoZSBjb250cmlidXRpb24gd2FzIGJlbG93IHRoZSBtaW5pbXVtLCBgTWluQ29udHJpYnV0aW9uYC40SW52YWxpZFBhcmFJZAAIBExJbnZhbGlkIGZ1bmQgaW5kZXguLENhcEV4Y2VlZGVkAAkEkENvbnRyaWJ1dGlvbnMgZXhjZWVkIG1heGltdW0gYW1vdW50LlhDb250cmlidXRpb25QZXJpb2RPdmVyAAoEqFRoZSBjb250cmlidXRpb24gcGVyaW9kIGhhcyBhbHJlYWR5IGVuZGVkLjRJbnZhbGlkT3JpZ2luAAsEjFRoZSBvcmlnaW4gb2YgdGhpcyBjYWxsIGlzIGludmFsaWQuME5vdFBhcmFjaGFpbgAMBMhUaGlzIGNyb3dkbG9hbiBkb2VzIG5vdCBjb3JyZXNwb25kIHRvIGEgcGFyYWNoYWluLixMZWFzZUFjdGl2ZQANBBUBVGhpcyBwYXJhY2hhaW4gbGVhc2UgaXMgc3RpbGwgYWN0aXZlIGFuZCByZXRpcmVtZW50IGNhbm5vdCB5ZXQgYmVnaW4uQEJpZE9yTGVhc2VBY3RpdmUADgQxAVRoaXMgcGFyYWNoYWluJ3MgYmlkIG9yIGxlYXNlIGlzIHN0aWxsIGFjdGl2ZSBhbmQgd2l0aGRyYXcgY2Fubm90IHlldCBiZWdpbi4wRnVuZE5vdEVuZGVkAA8EgFRoZSBjcm93ZGxvYW4gaGFzIG5vdCB5ZXQgZW5kZWQuPE5vQ29udHJpYnV0aW9ucwAQBNBUaGVyZSBhcmUgbm8gY29udHJpYnV0aW9ucyBzdG9yZWQgaW4gdGhpcyBjcm93ZGxvYW4uSE5vdFJlYWR5VG9EaXNzb2x2ZQARCFUBVGhlIGNyb3dkbG9hbiBpcyBub3QgcmVhZHkgdG8gZGlzc29sdmUuIFBvdGVudGlhbGx5IHN0aWxsIGhhcyBhIHNsb3Qgb3IgaW4gcmV0aXJlbWVudBxwZXJpb2QuQEludmFsaWRTaWduYXR1cmUAEgRISW52YWxpZCBzaWduYXR1cmUuME1lbW9Ub29MYXJnZQATBHxUaGUgcHJvdmlkZWQgbWVtbyBpcyB0b28gbGFyZ2UuREFscmVhZHlJbk5ld1JhaXNlABQEhFRoZSBmdW5kIGlzIGFscmVhZHkgaW4gYE5ld1JhaXNlYEhWcmZEZWxheUluUHJvZ3Jlc3MAFQS0Tm8gY29udHJpYnV0aW9ucyBhbGxvd2VkIGR1cmluZyB0aGUgVlJGIGRlbGF5NE5vTGVhc2VQZXJpb2QAFgQtAUEgbGVhc2UgcGVyaW9kIGhhcyBub3Qgc3RhcnRlZCB5ZXQsIGR1ZSB0byBhbiBvZmZzZXQgaW4gdGhlIHN0YXJ0aW5nIGJsb2NrLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC6tDBBscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zIGNvcmV0aW1lGHBhbGxldBRFcnJvcgQEVAABDCROb3RCcm9rZXIAAAQpAVRoZSBwYXJhaWQgbWFraW5nIHRoZSBjYWxsIGlzIG5vdCB0aGUgY29yZXRpbWUgYnJva2VyYWdlIHN5c3RlbSBwYXJhY2hhaW4uWFJlcXVlc3RlZEZ1dHVyZVJldmVudWUAAQhFAVJlcXVlc3RlZCByZXZlbnVlIGluZm9ybWF0aW9uIGB3aGVuYCBwYXJhbWV0ZXIgd2FzIGluIHRoZSBmdXR1cmUgZnJvbSB0aGUgY3VycmVudDRibG9jayBoZWlnaHQuTEFzc2V0VHJhbnNmZXJGYWlsZWQAAgS8RmFpbGVkIHRvIHRyYW5zZmVyIGFzc2V0cyB0byB0aGUgY29yZXRpbWUgY2hhaW4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQusQwMKHBhbGxldF94Y20YcGFsbGV0LFF1ZXJ5U3RhdHVzBCxCbG9ja051bWJlcgEQAQwcUGVuZGluZxABJHJlc3BvbmRlckUBAURWZXJzaW9uZWRMb2NhdGlvbgABTG1heWJlX21hdGNoX3F1ZXJpZXK1DAFkT3B0aW9uPFZlcnNpb25lZExvY2F0aW9uPgABMG1heWJlX25vdGlmebkMAUBPcHRpb248KHU4LCB1OCk+AAEcdGltZW91dBABLEJsb2NrTnVtYmVyAAAAPFZlcnNpb25Ob3RpZmllcggBGG9yaWdpbkUBAURWZXJzaW9uZWRMb2NhdGlvbgABJGlzX2FjdGl2ZSABEGJvb2wAAQAUUmVhZHkIASByZXNwb25zZcEMAURWZXJzaW9uZWRSZXNwb25zZQABCGF0EAEsQmxvY2tOdW1iZXIAAgAAtQwEGE9wdGlvbgQEVAFFAQEIEE5vbmUAAAAQU29tZQQARQEAAAEAALkMBBhPcHRpb24EBFQBvQwBCBBOb25lAAAAEFNvbWUEAL0MAAABAAC9DAAABAgICADBDAgMeGNtRFZlcnNpb25lZFJlc3BvbnNlAAEMCFYyBAC1BQEwdjI6OlJlc3BvbnNlAAIACFYzBAD9BQEwdjM6OlJlc3BvbnNlAAMACFY0BABhBgEwdjQ6OlJlc3BvbnNlAAQAAMUMAAAECBBFAQDJDAAABAwwKBAAzQwMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAHRDARTAAAEANUMARhWZWM8VD4AANEMAAAECEUBEADVDAAAAtEMANkMDChwYWxsZXRfeGNtGHBhbGxldFRWZXJzaW9uTWlncmF0aW9uU3RhZ2UAARBcTWlncmF0ZVN1cHBvcnRlZFZlcnNpb24AAABcTWlncmF0ZVZlcnNpb25Ob3RpZmllcnMAAQBQTm90aWZ5Q3VycmVudFRhcmdldHMEAN0MATxPcHRpb248VmVjPHU4Pj4AAgBoTWlncmF0ZUFuZE5vdGlmeU9sZFRhcmdldHMAAwAA3QwEGE9wdGlvbgQEVAE4AQgQTm9uZQAAABBTb21lBAA4AAABAADhDAAABAwQAL0GAOUMDChwYWxsZXRfeGNtGHBhbGxldGhSZW1vdGVMb2NrZWRGdW5naWJsZVJlY29yZAhIQ29uc3VtZXJJZGVudGlmaWVyAYwwTWF4Q29uc3VtZXJzAAAQARhhbW91bnQYARB1MTI4AAEUb3duZXJFAQFEVmVyc2lvbmVkTG9jYXRpb24AARhsb2NrZXJFAQFEVmVyc2lvbmVkTG9jYXRpb24AASRjb25zdW1lcnPpDAHQQm91bmRlZFZlYzwoQ29uc3VtZXJJZGVudGlmaWVyLCB1MTI4KSwgTWF4Q29uc3VtZXJzPgAA6QwMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAHtDARTAAAEAPEMARhWZWM8VD4AAO0MAAAECIwYAPEMAAAC7QwA9QwMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAH5DARTAAAEAP0MARhWZWM8VD4AAPkMAAAECBhFAQD9DAAAAvkMAAENDChwYWxsZXRfeGNtGHBhbGxldBRFcnJvcgQEVAABYCxVbnJlYWNoYWJsZQAACF0BVGhlIGRlc2lyZWQgZGVzdGluYXRpb24gd2FzIHVucmVhY2hhYmxlLCBnZW5lcmFsbHkgYmVjYXVzZSB0aGVyZSBpcyBhIG5vIHdheSBvZiByb3V0aW5nGHRvIGl0LixTZW5kRmFpbHVyZQABCEEBVGhlcmUgd2FzIHNvbWUgb3RoZXIgaXNzdWUgKGkuZS4gbm90IHRvIGRvIHdpdGggcm91dGluZykgaW4gc2VuZGluZyB0aGUgbWVzc2FnZS7IUGVyaGFwcyBhIGxhY2sgb2Ygc3BhY2UgZm9yIGJ1ZmZlcmluZyB0aGUgbWVzc2FnZS4gRmlsdGVyZWQAAgScVGhlIG1lc3NhZ2UgZXhlY3V0aW9uIGZhaWxzIHRoZSBmaWx0ZXIuSFVud2VpZ2hhYmxlTWVzc2FnZQADBLRUaGUgbWVzc2FnZSdzIHdlaWdodCBjb3VsZCBub3QgYmUgZGV0ZXJtaW5lZC5gRGVzdGluYXRpb25Ob3RJbnZlcnRpYmxlAAQE3FRoZSBkZXN0aW5hdGlvbiBgTG9jYXRpb25gIHByb3ZpZGVkIGNhbm5vdCBiZSBpbnZlcnRlZC4URW1wdHkABQSAVGhlIGFzc2V0cyB0byBiZSBzZW50IGFyZSBlbXB0eS44Q2Fubm90UmVhbmNob3IABgQ1AUNvdWxkIG5vdCByZS1hbmNob3IgdGhlIGFzc2V0cyB0byBkZWNsYXJlIHRoZSBmZWVzIGZvciB0aGUgZGVzdGluYXRpb24gY2hhaW4uNFRvb01hbnlBc3NldHMABwTEVG9vIG1hbnkgYXNzZXRzIGhhdmUgYmVlbiBhdHRlbXB0ZWQgZm9yIHRyYW5zZmVyLjRJbnZhbGlkT3JpZ2luAAgEeE9yaWdpbiBpcyBpbnZhbGlkIGZvciBzZW5kaW5nLihCYWRWZXJzaW9uAAkEIQFUaGUgdmVyc2lvbiBvZiB0aGUgYFZlcnNpb25lZGAgdmFsdWUgdXNlZCBpcyBub3QgYWJsZSB0byBiZSBpbnRlcnByZXRlZC4sQmFkTG9jYXRpb24ACghBAVRoZSBnaXZlbiBsb2NhdGlvbiBjb3VsZCBub3QgYmUgdXNlZCAoZS5nLiBiZWNhdXNlIGl0IGNhbm5vdCBiZSBleHByZXNzZWQgaW4gdGhlYGRlc2lyZWQgdmVyc2lvbiBvZiBYQ00pLjhOb1N1YnNjcmlwdGlvbgALBLxUaGUgcmVmZXJlbmNlZCBzdWJzY3JpcHRpb24gY291bGQgbm90IGJlIGZvdW5kLkRBbHJlYWR5U3Vic2NyaWJlZAAMBBEBVGhlIGxvY2F0aW9uIGlzIGludmFsaWQgc2luY2UgaXQgYWxyZWFkeSBoYXMgYSBzdWJzY3JpcHRpb24gZnJvbSB1cy5YQ2Fubm90Q2hlY2tPdXRUZWxlcG9ydAANBCkBQ291bGQgbm90IGNoZWNrLW91dCB0aGUgYXNzZXRzIGZvciB0ZWxlcG9ydGF0aW9uIHRvIHRoZSBkZXN0aW5hdGlvbiBjaGFpbi4oTG93QmFsYW5jZQAOBEEBVGhlIG93bmVyIGRvZXMgbm90IG93biAoYWxsKSBvZiB0aGUgYXNzZXQgdGhhdCB0aGV5IHdpc2ggdG8gZG8gdGhlIG9wZXJhdGlvbiBvbi4wVG9vTWFueUxvY2tzAA8EwFRoZSBhc3NldCBvd25lciBoYXMgdG9vIG1hbnkgbG9ja3Mgb24gdGhlIGFzc2V0LkxBY2NvdW50Tm90U292ZXJlaWduABAEMQFUaGUgZ2l2ZW4gYWNjb3VudCBpcyBub3QgYW4gaWRlbnRpZmlhYmxlIHNvdmVyZWlnbiBhY2NvdW50IGZvciBhbnkgbG9jYXRpb24uKEZlZXNOb3RNZXQAEQQpAVRoZSBvcGVyYXRpb24gcmVxdWlyZWQgZmVlcyB0byBiZSBwYWlkIHdoaWNoIHRoZSBpbml0aWF0b3IgY291bGQgbm90IG1lZXQuMExvY2tOb3RGb3VuZAASBPRBIHJlbW90ZSBsb2NrIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgZGF0YSBjb3VsZCBub3QgYmUgZm91bmQuFEluVXNlABMESQFUaGUgdW5sb2NrIG9wZXJhdGlvbiBjYW5ub3Qgc3VjY2VlZCBiZWNhdXNlIHRoZXJlIGFyZSBzdGlsbCBjb25zdW1lcnMgb2YgdGhlIGxvY2suaEludmFsaWRBc3NldFVua25vd25SZXNlcnZlABUE8EludmFsaWQgYXNzZXQsIHJlc2VydmUgY2hhaW4gY291bGQgbm90IGJlIGRldGVybWluZWQgZm9yIGl0LnhJbnZhbGlkQXNzZXRVbnN1cHBvcnRlZFJlc2VydmUAFgRFAUludmFsaWQgYXNzZXQsIGRvIG5vdCBzdXBwb3J0IHJlbW90ZSBhc3NldCByZXNlcnZlcyB3aXRoIGRpZmZlcmVudCBmZWVzIHJlc2VydmVzLjxUb29NYW55UmVzZXJ2ZXMAFwRJAVRvbyBtYW55IGFzc2V0cyB3aXRoIGRpZmZlcmVudCByZXNlcnZlIGxvY2F0aW9ucyBoYXZlIGJlZW4gYXR0ZW1wdGVkIGZvciB0cmFuc2Zlci5gTG9jYWxFeGVjdXRpb25JbmNvbXBsZXRlABgEfExvY2FsIFhDTSBleGVjdXRpb24gaW5jb21wbGV0ZS4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQuBQ0IUHBhbGxldF9tZXNzYWdlX3F1ZXVlJEJvb2tTdGF0ZQQ0TWVzc2FnZU9yaWdpbgHFBgAYARRiZWdpbhABJFBhZ2VJbmRleAABDGVuZBABJFBhZ2VJbmRleAABFGNvdW50EAEkUGFnZUluZGV4AAFAcmVhZHlfbmVpZ2hib3VycwkNAYRPcHRpb248TmVpZ2hib3VyczxNZXNzYWdlT3JpZ2luPj4AATRtZXNzYWdlX2NvdW50MAEMdTY0AAEQc2l6ZTABDHU2NAAACQ0EGE9wdGlvbgQEVAENDQEIEE5vbmUAAAAQU29tZQQADQ0AAAEAAA0NCFBwYWxsZXRfbWVzc2FnZV9xdWV1ZShOZWlnaGJvdXJzBDRNZXNzYWdlT3JpZ2luAcUGAAgBEHByZXbFBgE0TWVzc2FnZU9yaWdpbgABEG5leHTFBgE0TWVzc2FnZU9yaWdpbgAAEQ0AAAQIxQYQABUNCFBwYWxsZXRfbWVzc2FnZV9xdWV1ZRBQYWdlCBBTaXplARAgSGVhcFNpemUAABgBJHJlbWFpbmluZxABEFNpemUAAThyZW1haW5pbmdfc2l6ZRABEFNpemUAASxmaXJzdF9pbmRleBABEFNpemUAARRmaXJzdBABEFNpemUAARBsYXN0EAEQU2l6ZQABEGhlYXAZDQGcQm91bmRlZFZlYzx1OCwgSW50b1UzMjxIZWFwU2l6ZSwgU2l6ZT4+AAAZDQxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAQgEUwAABAA4ARhWZWM8VD4AAB0NDFBwYWxsZXRfbWVzc2FnZV9xdWV1ZRhwYWxsZXQURXJyb3IEBFQAASQsTm90UmVhcGFibGUAAAhJAVBhZ2UgaXMgbm90IHJlYXBhYmxlIGJlY2F1c2UgaXQgaGFzIGl0ZW1zIHJlbWFpbmluZyB0byBiZSBwcm9jZXNzZWQgYW5kIGlzIG5vdCBvbGQcZW5vdWdoLhhOb1BhZ2UAAQSEUGFnZSB0byBiZSByZWFwZWQgZG9lcyBub3QgZXhpc3QuJE5vTWVzc2FnZQACBKhUaGUgcmVmZXJlbmNlZCBtZXNzYWdlIGNvdWxkIG5vdCBiZSBmb3VuZC5AQWxyZWFkeVByb2Nlc3NlZAADBAEBVGhlIG1lc3NhZ2Ugd2FzIGFscmVhZHkgcHJvY2Vzc2VkIGFuZCBjYW5ub3QgYmUgcHJvY2Vzc2VkIGFnYWluLhhRdWV1ZWQABASsVGhlIG1lc3NhZ2UgaXMgcXVldWVkIGZvciBmdXR1cmUgZXhlY3V0aW9uLkhJbnN1ZmZpY2llbnRXZWlnaHQABQQZAVRoZXJlIGlzIHRlbXBvcmFyaWx5IG5vdCBlbm91Z2ggd2VpZ2h0IHRvIGNvbnRpbnVlIHNlcnZpY2luZyBtZXNzYWdlcy5gVGVtcG9yYXJpbHlVbnByb2Nlc3NhYmxlAAYQqFRoaXMgbWVzc2FnZSBpcyB0ZW1wb3JhcmlseSB1bnByb2Nlc3NhYmxlLgBZAVN1Y2ggZXJyb3JzIGFyZSBleHBlY3RlZCwgYnV0IG5vdCBndWFyYW50ZWVkLCB0byByZXNvbHZlIHRoZW1zZWx2ZXMgZXZlbnR1YWxseSB0aHJvdWdoJHJldHJ5aW5nLixRdWV1ZVBhdXNlZAAHDOxUaGUgcXVldWUgaXMgcGF1c2VkIGFuZCBubyBtZXNzYWdlIGNhbiBiZSBleGVjdXRlZCBmcm9tIGl0LgAdAVRoaXMgY2FuIGNoYW5nZSBhdCBhbnkgdGltZSBhbmQgbWF5IHJlc29sdmUgaW4gdGhlIGZ1dHVyZSBieSByZS10cnlpbmcuTFJlY3Vyc2l2ZURpc2FsbG93ZWQACAQxAUFub3RoZXIgY2FsbCBpcyBpbiBwcm9ncmVzcyBhbmQgbmVlZHMgdG8gZmluaXNoIGJlZm9yZSB0aGlzIGNhbGwgY2FuIGhhcHBlbi4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQuIQ0MRHBhbGxldF9hc3NldF9yYXRlGHBhbGxldBRFcnJvcgQEVAABDEBVbmtub3duQXNzZXRLaW5kAAAEeFRoZSBnaXZlbiBhc3NldCBJRCBpcyB1bmtub3duLjRBbHJlYWR5RXhpc3RzAAEEUQFUaGUgZ2l2ZW4gYXNzZXQgSUQgYWxyZWFkeSBoYXMgYW4gYXNzaWduZWQgY29udmVyc2lvbiByYXRlIGFuZCBjYW5ub3QgYmUgcmUtY3JlYXRlZC4gT3ZlcmZsb3cAAgTMT3ZlcmZsb3cgb2N1cnJlZCB3aGVuIGNhbGN1bGF0aW5nIHRoZSBpbnZlcnNlIHJhdGUuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LiUNDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBKQIEUwAABAApDQEYVmVjPFQ+AAApDQAAAikCAC0NDDBwYWxsZXRfYmVlZnkYcGFsbGV0FEVycm9yBARUAAEQYEludmFsaWRLZXlPd25lcnNoaXBQcm9vZgAABDEBQSBrZXkgb3duZXJzaGlwIHByb29mIHByb3ZpZGVkIGFzIHBhcnQgb2YgYW4gZXF1aXZvY2F0aW9uIHJlcG9ydCBpcyBpbnZhbGlkLmBJbnZhbGlkRXF1aXZvY2F0aW9uUHJvb2YAAQQxAUFuIGVxdWl2b2NhdGlvbiBwcm9vZiBwcm92aWRlZCBhcyBwYXJ0IG9mIGFuIGVxdWl2b2NhdGlvbiByZXBvcnQgaXMgaW52YWxpZC5YRHVwbGljYXRlT2ZmZW5jZVJlcG9ydAACBBUBQSBnaXZlbiBlcXVpdm9jYXRpb24gcmVwb3J0IGlzIHZhbGlkIGJ1dCBhbHJlYWR5IHByZXZpb3VzbHkgcmVwb3J0ZWQuUEludmFsaWRDb25maWd1cmF0aW9uAAMEjFN1Ym1pdHRlZCBjb25maWd1cmF0aW9uIGlzIGludmFsaWQuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LjENDEhzcF9jb25zZW5zdXNfYmVlZnkMbW1yREJlZWZ5QXV0aG9yaXR5U2V0BFhBdXRob3JpdHlTZXRDb21taXRtZW50ATQADAEIaWQwAVRjcmF0ZTo6VmFsaWRhdG9yU2V0SWQAAQxsZW4QAQx1MzIAAURrZXlzZXRfY29tbWl0bWVudDQBWEF1dGhvcml0eVNldENvbW1pdG1lbnQAADUNEFxwb2xrYWRvdF9ydW50aW1lX2NvbW1vbkhwYXJhc19zdWRvX3dyYXBwZXIYcGFsbGV0FEVycm9yBARUAAEkPFBhcmFEb2VzbnRFeGlzdAAABKhUaGUgc3BlY2lmaWVkIHBhcmFjaGFpbiBpcyBub3QgcmVnaXN0ZXJlZC5EUGFyYUFscmVhZHlFeGlzdHMAAQS4VGhlIHNwZWNpZmllZCBwYXJhY2hhaW4gaXMgYWxyZWFkeSByZWdpc3RlcmVkLlRFeGNlZWRzTWF4TWVzc2FnZVNpemUAAghBAUEgRE1QIG1lc3NhZ2UgY291bGRuJ3QgYmUgc2VudCBiZWNhdXNlIGl0IGV4Y2VlZHMgdGhlIG1heGltdW0gc2l6ZSBhbGxvd2VkIGZvciBhRGRvd253YXJkIG1lc3NhZ2UuOENvdWxkbnRDbGVhbnVwAAMEgENvdWxkIG5vdCBzY2hlZHVsZSBwYXJhIGNsZWFudXAuNE5vdFBhcmF0aHJlYWQABAScTm90IGEgcGFyYXRocmVhZCAob24tZGVtYW5kIHBhcmFjaGFpbikuME5vdFBhcmFjaGFpbgAFBHhOb3QgYSBsZWFzZSBob2xkaW5nIHBhcmFjaGFpbi40Q2Fubm90VXBncmFkZQAGBPhDYW5ub3QgdXBncmFkZSBvbi1kZW1hbmQgcGFyYWNoYWluIHRvIGxlYXNlIGhvbGRpbmcgcGFyYWNoYWluLjxDYW5ub3REb3duZ3JhZGUABwTYQ2Fubm90IGRvd25ncmFkZSBsZWFzZSBob2xkaW5nIHBhcmFjaGFpbiB0byBvbi1kZW1hbmQuMFRvb01hbnlDb3JlcwAIBMxUaGVyZSBhcmUgbW9yZSBjb3JlcyB0aGFuIHN1cHBvcnRlZCBieSB0aGUgcnVudGltZS4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQuOQ0MLHBhbGxldF9zdWRvGHBhbGxldBRFcnJvcgQEVAABBCxSZXF1aXJlU3VkbwAABIBTZW5kZXIgbXVzdCBiZSB0aGUgU3VkbyBhY2NvdW50LgRoRXJyb3IgZm9yIHRoZSBTdWRvIHBhbGxldC49DQAABChBDUUNSQ1NDVENWQ1dDWENZQ1pDQBBDRAwZnJhbWVfc3lzdGVtKGV4dGVuc2lvbnNUY2hlY2tfbm9uX3plcm9fc2VuZGVySENoZWNrTm9uWmVyb1NlbmRlcgQEVAAAAABFDRAwZnJhbWVfc3lzdGVtKGV4dGVuc2lvbnNIY2hlY2tfc3BlY192ZXJzaW9uQENoZWNrU3BlY1ZlcnNpb24EBFQAAAAASQ0QMGZyYW1lX3N5c3RlbShleHRlbnNpb25zQGNoZWNrX3R4X3ZlcnNpb244Q2hlY2tUeFZlcnNpb24EBFQAAAAATQ0QMGZyYW1lX3N5c3RlbShleHRlbnNpb25zNGNoZWNrX2dlbmVzaXMwQ2hlY2tHZW5lc2lzBARUAAAAAFENEDBmcmFtZV9zeXN0ZW0oZXh0ZW5zaW9uczxjaGVja19tb3J0YWxpdHk4Q2hlY2tNb3J0YWxpdHkEBFQAAAQAVQ0BDEVyYQAAVQ0QKHNwX3J1bnRpbWUcZ2VuZXJpYwxlcmEMRXJhAAEBBCBJbW1vcnRhbAAAABxNb3J0YWwxBAAIAAABABxNb3J0YWwyBAAIAAACABxNb3J0YWwzBAAIAAADABxNb3J0YWw0BAAIAAAEABxNb3J0YWw1BAAIAAAFABxNb3J0YWw2BAAIAAAGABxNb3J0YWw3BAAIAAAHABxNb3J0YWw4BAAIAAAIABxNb3J0YWw5BAAIAAAJACBNb3J0YWwxMAQACAAACgAgTW9ydGFsMTEEAAgAAAsAIE1vcnRhbDEyBAAIAAAMACBNb3J0YWwxMwQACAAADQAgTW9ydGFsMTQEAAgAAA4AIE1vcnRhbDE1BAAIAAAPACBNb3J0YWwxNgQACAAAEAAgTW9ydGFsMTcEAAgAABEAIE1vcnRhbDE4BAAIAAASACBNb3J0YWwxOQQACAAAEwAgTW9ydGFsMjAEAAgAABQAIE1vcnRhbDIxBAAIAAAVACBNb3J0YWwyMgQACAAAFgAgTW9ydGFsMjMEAAgAABcAIE1vcnRhbDI0BAAIAAAYACBNb3J0YWwyNQQACAAAGQAgTW9ydGFsMjYEAAgAABoAIE1vcnRhbDI3BAAIAAAbACBNb3J0YWwyOAQACAAAHAAgTW9ydGFsMjkEAAgAAB0AIE1vcnRhbDMwBAAIAAAeACBNb3J0YWwzMQQACAAAHwAgTW9ydGFsMzIEAAgAACAAIE1vcnRhbDMzBAAIAAAhACBNb3J0YWwzNAQACAAAIgAgTW9ydGFsMzUEAAgAACMAIE1vcnRhbDM2BAAIAAAkACBNb3J0YWwzNwQACAAAJQAgTW9ydGFsMzgEAAgAACYAIE1vcnRhbDM5BAAIAAAnACBNb3J0YWw0MAQACAAAKAAgTW9ydGFsNDEEAAgAACkAIE1vcnRhbDQyBAAIAAAqACBNb3J0YWw0MwQACAAAKwAgTW9ydGFsNDQEAAgAACwAIE1vcnRhbDQ1BAAIAAAtACBNb3J0YWw0NgQACAAALgAgTW9ydGFsNDcEAAgAAC8AIE1vcnRhbDQ4BAAIAAAwACBNb3J0YWw0OQQACAAAMQAgTW9ydGFsNTAEAAgAADIAIE1vcnRhbDUxBAAIAAAzACBNb3J0YWw1MgQACAAANAAgTW9ydGFsNTMEAAgAADUAIE1vcnRhbDU0BAAIAAA2ACBNb3J0YWw1NQQACAAANwAgTW9ydGFsNTYEAAgAADgAIE1vcnRhbDU3BAAIAAA5ACBNb3J0YWw1OAQACAAAOgAgTW9ydGFsNTkEAAgAADsAIE1vcnRhbDYwBAAIAAA8ACBNb3J0YWw2MQQACAAAPQAgTW9ydGFsNjIEAAgAAD4AIE1vcnRhbDYzBAAIAAA/ACBNb3J0YWw2NAQACAAAQAAgTW9ydGFsNjUEAAgAAEEAIE1vcnRhbDY2BAAIAABCACBNb3J0YWw2NwQACAAAQwAgTW9ydGFsNjgEAAgAAEQAIE1vcnRhbDY5BAAIAABFACBNb3J0YWw3MAQACAAARgAgTW9ydGFsNzEEAAgAAEcAIE1vcnRhbDcyBAAIAABIACBNb3J0YWw3MwQACAAASQAgTW9ydGFsNzQEAAgAAEoAIE1vcnRhbDc1BAAIAABLACBNb3J0YWw3NgQACAAATAAgTW9ydGFsNzcEAAgAAE0AIE1vcnRhbDc4BAAIAABOACBNb3J0YWw3OQQACAAATwAgTW9ydGFsODAEAAgAAFAAIE1vcnRhbDgxBAAIAABRACBNb3J0YWw4MgQACAAAUgAgTW9ydGFsODMEAAgAAFMAIE1vcnRhbDg0BAAIAABUACBNb3J0YWw4NQQACAAAVQAgTW9ydGFsODYEAAgAAFYAIE1vcnRhbDg3BAAIAABXACBNb3J0YWw4OAQACAAAWAAgTW9ydGFsODkEAAgAAFkAIE1vcnRhbDkwBAAIAABaACBNb3J0YWw5MQQACAAAWwAgTW9ydGFsOTIEAAgAAFwAIE1vcnRhbDkzBAAIAABdACBNb3J0YWw5NAQACAAAXgAgTW9ydGFsOTUEAAgAAF8AIE1vcnRhbDk2BAAIAABgACBNb3J0YWw5NwQACAAAYQAgTW9ydGFsOTgEAAgAAGIAIE1vcnRhbDk5BAAIAABjACRNb3J0YWwxMDAEAAgAAGQAJE1vcnRhbDEwMQQACAAAZQAkTW9ydGFsMTAyBAAIAABmACRNb3J0YWwxMDMEAAgAAGcAJE1vcnRhbDEwNAQACAAAaAAkTW9ydGFsMTA1BAAIAABpACRNb3J0YWwxMDYEAAgAAGoAJE1vcnRhbDEwNwQACAAAawAkTW9ydGFsMTA4BAAIAABsACRNb3J0YWwxMDkEAAgAAG0AJE1vcnRhbDExMAQACAAAbgAkTW9ydGFsMTExBAAIAABvACRNb3J0YWwxMTIEAAgAAHAAJE1vcnRhbDExMwQACAAAcQAkTW9ydGFsMTE0BAAIAAByACRNb3J0YWwxMTUEAAgAAHMAJE1vcnRhbDExNgQACAAAdAAkTW9ydGFsMTE3BAAIAAB1ACRNb3J0YWwxMTgEAAgAAHYAJE1vcnRhbDExOQQACAAAdwAkTW9ydGFsMTIwBAAIAAB4ACRNb3J0YWwxMjEEAAgAAHkAJE1vcnRhbDEyMgQACAAAegAkTW9ydGFsMTIzBAAIAAB7ACRNb3J0YWwxMjQEAAgAAHwAJE1vcnRhbDEyNQQACAAAfQAkTW9ydGFsMTI2BAAIAAB+ACRNb3J0YWwxMjcEAAgAAH8AJE1vcnRhbDEyOAQACAAAgAAkTW9ydGFsMTI5BAAIAACBACRNb3J0YWwxMzAEAAgAAIIAJE1vcnRhbDEzMQQACAAAgwAkTW9ydGFsMTMyBAAIAACEACRNb3J0YWwxMzMEAAgAAIUAJE1vcnRhbDEzNAQACAAAhgAkTW9ydGFsMTM1BAAIAACHACRNb3J0YWwxMzYEAAgAAIgAJE1vcnRhbDEzNwQACAAAiQAkTW9ydGFsMTM4BAAIAACKACRNb3J0YWwxMzkEAAgAAIsAJE1vcnRhbDE0MAQACAAAjAAkTW9ydGFsMTQxBAAIAACNACRNb3J0YWwxNDIEAAgAAI4AJE1vcnRhbDE0MwQACAAAjwAkTW9ydGFsMTQ0BAAIAACQACRNb3J0YWwxNDUEAAgAAJEAJE1vcnRhbDE0NgQACAAAkgAkTW9ydGFsMTQ3BAAIAACTACRNb3J0YWwxNDgEAAgAAJQAJE1vcnRhbDE0OQQACAAAlQAkTW9ydGFsMTUwBAAIAACWACRNb3J0YWwxNTEEAAgAAJcAJE1vcnRhbDE1MgQACAAAmAAkTW9ydGFsMTUzBAAIAACZACRNb3J0YWwxNTQEAAgAAJoAJE1vcnRhbDE1NQQACAAAmwAkTW9ydGFsMTU2BAAIAACcACRNb3J0YWwxNTcEAAgAAJ0AJE1vcnRhbDE1OAQACAAAngAkTW9ydGFsMTU5BAAIAACfACRNb3J0YWwxNjAEAAgAAKAAJE1vcnRhbDE2MQQACAAAoQAkTW9ydGFsMTYyBAAIAACiACRNb3J0YWwxNjMEAAgAAKMAJE1vcnRhbDE2NAQACAAApAAkTW9ydGFsMTY1BAAIAAClACRNb3J0YWwxNjYEAAgAAKYAJE1vcnRhbDE2NwQACAAApwAkTW9ydGFsMTY4BAAIAACoACRNb3J0YWwxNjkEAAgAAKkAJE1vcnRhbDE3MAQACAAAqgAkTW9ydGFsMTcxBAAIAACrACRNb3J0YWwxNzIEAAgAAKwAJE1vcnRhbDE3MwQACAAArQAkTW9ydGFsMTc0BAAIAACuACRNb3J0YWwxNzUEAAgAAK8AJE1vcnRhbDE3NgQACAAAsAAkTW9ydGFsMTc3BAAIAACxACRNb3J0YWwxNzgEAAgAALIAJE1vcnRhbDE3OQQACAAAswAkTW9ydGFsMTgwBAAIAAC0ACRNb3J0YWwxODEEAAgAALUAJE1vcnRhbDE4MgQACAAAtgAkTW9ydGFsMTgzBAAIAAC3ACRNb3J0YWwxODQEAAgAALgAJE1vcnRhbDE4NQQACAAAuQAkTW9ydGFsMTg2BAAIAAC6ACRNb3J0YWwxODcEAAgAALsAJE1vcnRhbDE4OAQACAAAvAAkTW9ydGFsMTg5BAAIAAC9ACRNb3J0YWwxOTAEAAgAAL4AJE1vcnRhbDE5MQQACAAAvwAkTW9ydGFsMTkyBAAIAADAACRNb3J0YWwxOTMEAAgAAMEAJE1vcnRhbDE5NAQACAAAwgAkTW9ydGFsMTk1BAAIAADDACRNb3J0YWwxOTYEAAgAAMQAJE1vcnRhbDE5NwQACAAAxQAkTW9ydGFsMTk4BAAIAADGACRNb3J0YWwxOTkEAAgAAMcAJE1vcnRhbDIwMAQACAAAyAAkTW9ydGFsMjAxBAAIAADJACRNb3J0YWwyMDIEAAgAAMoAJE1vcnRhbDIwMwQACAAAywAkTW9ydGFsMjA0BAAIAADMACRNb3J0YWwyMDUEAAgAAM0AJE1vcnRhbDIwNgQACAAAzgAkTW9ydGFsMjA3BAAIAADPACRNb3J0YWwyMDgEAAgAANAAJE1vcnRhbDIwOQQACAAA0QAkTW9ydGFsMjEwBAAIAADSACRNb3J0YWwyMTEEAAgAANMAJE1vcnRhbDIxMgQACAAA1AAkTW9ydGFsMjEzBAAIAADVACRNb3J0YWwyMTQEAAgAANYAJE1vcnRhbDIxNQQACAAA1wAkTW9ydGFsMjE2BAAIAADYACRNb3J0YWwyMTcEAAgAANkAJE1vcnRhbDIxOAQACAAA2gAkTW9ydGFsMjE5BAAIAADbACRNb3J0YWwyMjAEAAgAANwAJE1vcnRhbDIyMQQACAAA3QAkTW9ydGFsMjIyBAAIAADeACRNb3J0YWwyMjMEAAgAAN8AJE1vcnRhbDIyNAQACAAA4AAkTW9ydGFsMjI1BAAIAADhACRNb3J0YWwyMjYEAAgAAOIAJE1vcnRhbDIyNwQACAAA4wAkTW9ydGFsMjI4BAAIAADkACRNb3J0YWwyMjkEAAgAAOUAJE1vcnRhbDIzMAQACAAA5gAkTW9ydGFsMjMxBAAIAADnACRNb3J0YWwyMzIEAAgAAOgAJE1vcnRhbDIzMwQACAAA6QAkTW9ydGFsMjM0BAAIAADqACRNb3J0YWwyMzUEAAgAAOsAJE1vcnRhbDIzNgQACAAA7AAkTW9ydGFsMjM3BAAIAADtACRNb3J0YWwyMzgEAAgAAO4AJE1vcnRhbDIzOQQACAAA7wAkTW9ydGFsMjQwBAAIAADwACRNb3J0YWwyNDEEAAgAAPEAJE1vcnRhbDI0MgQACAAA8gAkTW9ydGFsMjQzBAAIAADzACRNb3J0YWwyNDQEAAgAAPQAJE1vcnRhbDI0NQQACAAA9QAkTW9ydGFsMjQ2BAAIAAD2ACRNb3J0YWwyNDcEAAgAAPcAJE1vcnRhbDI0OAQACAAA+AAkTW9ydGFsMjQ5BAAIAAD5ACRNb3J0YWwyNTAEAAgAAPoAJE1vcnRhbDI1MQQACAAA+wAkTW9ydGFsMjUyBAAIAAD8ACRNb3J0YWwyNTMEAAgAAP0AJE1vcnRhbDI1NAQACAAA/gAkTW9ydGFsMjU1BAAIAAD/AABZDRAwZnJhbWVfc3lzdGVtKGV4dGVuc2lvbnMsY2hlY2tfbm9uY2UoQ2hlY2tOb25jZQQEVAAABADsASBUOjpOb25jZQAAXQ0QMGZyYW1lX3N5c3RlbShleHRlbnNpb25zMGNoZWNrX3dlaWdodCxDaGVja1dlaWdodAQEVAAAAABhDQhocGFsbGV0X3RyYW5zYWN0aW9uX3BheW1lbnRgQ2hhcmdlVHJhbnNhY3Rpb25QYXltZW50BARUAAAEAPwBMEJhbGFuY2VPZjxUPgAAZQ0MXHBvbGthZG90X3J1bnRpbWVfY29tbW9uGGNsYWltc0hQcmV2YWxpZGF0ZUF0dGVzdHMEBFQAAAAAaQ0IdGZyYW1lX21ldGFkYXRhX2hhc2hfZXh0ZW5zaW9uRENoZWNrTWV0YWRhdGFIYXNoBARUAAAEARBtb2RlbQ0BEE1vZGUAAG0NCHRmcmFtZV9tZXRhZGF0YV9oYXNoX2V4dGVuc2lvbhBNb2RlAAEIIERpc2FibGVkAAAAHEVuYWJsZWQAAQAAcQ0INHBhc2VvX3J1bnRpbWUcUnVudGltZQAAAAB1DQwwcmVsYXlfY29tbW9uEGFwaXM0SW5mbGF0aW9uSW5mbwAACAEkaW5mbGF0aW9uuQIBXHNwX3J1bnRpbWU6OlBlcnF1aW50aWxsAAEkbmV4dF9taW50eQ0B8Chwb2xrYWRvdF9wcmltaXRpdmVzOjpCYWxhbmNlLCBwb2xrYWRvdF9wcmltaXRpdmVzOjpCYWxhbmNlKQAAeQ0AAAQIGBgAfQ0QKHNwX3J1bnRpbWUcZ2VuZXJpYxRibG9jaxRCbG9jawgYSGVhZGVyAaEBJEV4dHJpbnNpYwGBDQAIARhoZWFkZXKhAQEYSGVhZGVyAAEoZXh0cmluc2ljc4UNAThWZWM8RXh0cmluc2ljPgAAgQ0QKHNwX3J1bnRpbWUcZ2VuZXJpY0x1bmNoZWNrZWRfZXh0cmluc2ljSFVuY2hlY2tlZEV4dHJpbnNpYxAcQWRkcmVzcwHFARBDYWxsAXUBJFNpZ25hdHVyZQFVBRRFeHRyYQE9DQAEADgAAACFDQAAAoENAIkNCChzcF9ydW50aW1lWEV4dHJpbnNpY0luY2x1c2lvbk1vZGUAAQg0QWxsRXh0cmluc2ljcwAAADRPbmx5SW5oZXJlbnRzAAEAAI0NCBxzcF9jb3JlOE9wYXF1ZU1ldGFkYXRhAAAEADgBHFZlYzx1OD4AAJENBBhPcHRpb24EBFQBjQ0BCBBOb25lAAAAEFNvbWUEAI0NAAABAACVDQQYUmVzdWx0CARUAYgERQGZDQEICE9rBACIAAAAAAxFcnIEAJkNAAABAACZDQwoc3BfcnVudGltZVB0cmFuc2FjdGlvbl92YWxpZGl0eWBUcmFuc2FjdGlvblZhbGlkaXR5RXJyb3IAAQgcSW52YWxpZAQAnQ0BSEludmFsaWRUcmFuc2FjdGlvbgAAABxVbmtub3duBAChDQFIVW5rbm93blRyYW5zYWN0aW9uAAEAAJ0NDChzcF9ydW50aW1lUHRyYW5zYWN0aW9uX3ZhbGlkaXR5SEludmFsaWRUcmFuc2FjdGlvbgABLBBDYWxsAAAAHFBheW1lbnQAAQAYRnV0dXJlAAIAFFN0YWxlAAMAIEJhZFByb29mAAQAREFuY2llbnRCaXJ0aEJsb2NrAAUAREV4aGF1c3RzUmVzb3VyY2VzAAYAGEN1c3RvbQQACAEIdTgABwAwQmFkTWFuZGF0b3J5AAgATE1hbmRhdG9yeVZhbGlkYXRpb24ACQAkQmFkU2lnbmVyAAoAAKENDChzcF9ydW50aW1lUHRyYW5zYWN0aW9uX3ZhbGlkaXR5SFVua25vd25UcmFuc2FjdGlvbgABDDBDYW5ub3RMb29rdXAAAABMTm9VbnNpZ25lZFZhbGlkYXRvcgABABhDdXN0b20EAAgBCHU4AAIAAKUNCDBzcF9pbmhlcmVudHMwSW5oZXJlbnREYXRhAAAEARBkYXRhqQ0BlEJUcmVlTWFwPEluaGVyZW50SWRlbnRpZmllciwgVmVjPHU4Pj4AAKkNBCBCVHJlZU1hcAgESwGxBQRWATgABACtDQAAAK0NAAACsQ0AsQ0AAAQIsQU4ALUNCDBzcF9pbmhlcmVudHNQQ2hlY2tJbmhlcmVudHNSZXN1bHQAAAwBEG9rYXkgARBib29sAAEsZmF0YWxfZXJyb3IgARBib29sAAEYZXJyb3JzpQ0BMEluaGVyZW50RGF0YQAAuQ0MKHNwX3J1bnRpbWVQdHJhbnNhY3Rpb25fdmFsaWRpdHlEVHJhbnNhY3Rpb25Tb3VyY2UAAQwcSW5CbG9jawAAABRMb2NhbAABACBFeHRlcm5hbAACAAC9DQQYUmVzdWx0CARUAcENBEUBmQ0BCAhPawQAwQ0AAAAADEVycgQAmQ0AAAEAAMENDChzcF9ydW50aW1lUHRyYW5zYWN0aW9uX3ZhbGlkaXR5QFZhbGlkVHJhbnNhY3Rpb24AABQBIHByaW9yaXR5MAFMVHJhbnNhY3Rpb25Qcmlvcml0eQABIHJlcXVpcmVzhQEBTFZlYzxUcmFuc2FjdGlvblRhZz4AASBwcm92aWRlc4UBAUxWZWM8VHJhbnNhY3Rpb25UYWc+AAEkbG9uZ2V2aXR5MAFQVHJhbnNhY3Rpb25Mb25nZXZpdHkAASRwcm9wYWdhdGUgARBib29sAADFDQAABAhdC8kNAMkNDExwb2xrYWRvdF9wcmltaXRpdmVzCHY3REdyb3VwUm90YXRpb25JbmZvBAROARAADAFMc2Vzc2lvbl9zdGFydF9ibG9jaxABBE4AAWBncm91cF9yb3RhdGlvbl9mcmVxdWVuY3kQAQROAAEMbm93EAEETgAAzQ0AAALRDQDRDQxMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2NyRDb3JlU3RhdGUIBEgBNAROARABDCBPY2N1cGllZAQA1Q0BSE9jY3VwaWVkQ29yZTxILCBOPgAAACRTY2hlZHVsZWQEAN0NATRTY2hlZHVsZWRDb3JlAAEAEEZyZWUAAgAA1Q0MTHBvbGthZG90X3ByaW1pdGl2ZXMIdjcwT2NjdXBpZWRDb3JlCARIATQETgEQACABUG5leHRfdXBfb25fYXZhaWxhYmxl2Q0BVE9wdGlvbjxTY2hlZHVsZWRDb3JlPgABOG9jY3VwaWVkX3NpbmNlEAEETgABLHRpbWVfb3V0X2F0EAEETgABTG5leHRfdXBfb25fdGltZV9vdXTZDQFUT3B0aW9uPFNjaGVkdWxlZENvcmU+AAEwYXZhaWxhYmlsaXR5kQQBfEJpdFZlYzx1OCwgYml0dmVjOjpvcmRlcjo6THNiMD4AAURncm91cF9yZXNwb25zaWJsZYEHAShHcm91cEluZGV4AAE4Y2FuZGlkYXRlX2hhc2jtBAE0Q2FuZGlkYXRlSGFzaAABUGNhbmRpZGF0ZV9kZXNjcmlwdG9yrQQBWENhbmRpZGF0ZURlc2NyaXB0b3I8SD4AANkNBBhPcHRpb24EBFQB3Q0BCBBOb25lAAAAEFNvbWUEAN0NAAABAADdDQxMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2NzRTY2hlZHVsZWRDb3JlAAAIARxwYXJhX2lkjQIBCElkAAEgY29sbGF0b3LhDQFIT3B0aW9uPENvbGxhdG9ySWQ+AADhDQQYT3B0aW9uBARUAbEEAQgQTm9uZQAAABBTb21lBACxBAAAAQAA5Q0MTHBvbGthZG90X3ByaW1pdGl2ZXMIdjdYT2NjdXBpZWRDb3JlQXNzdW1wdGlvbgABDCBJbmNsdWRlZAAAACBUaW1lZE91dAABABBGcmVlAAIAAOkNBBhPcHRpb24EBFQB7Q0BCBBOb25lAAAAEFNvbWUEAO0NAAABAADtDQxMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2N1xQZXJzaXN0ZWRWYWxpZGF0aW9uRGF0YQgESAE0BE4BEAAQASxwYXJlbnRfaGVhZNkEASBIZWFkRGF0YQABTHJlbGF5X3BhcmVudF9udW1iZXIQAQROAAFkcmVsYXlfcGFyZW50X3N0b3JhZ2Vfcm9vdDQBBEgAATBtYXhfcG92X3NpemUQAQx1MzIAAPENBBhPcHRpb24EBFQB9Q0BCBBOb25lAAAAEFNvbWUEAPUNAAABAAD1DQAABAjtDbkEAPkNBBhPcHRpb24EBFQBqQQBCBBOb25lAAAAEFNvbWUEAKkEAAABAAD9DQAAAgEOAAEODExwb2xrYWRvdF9wcmltaXRpdmVzCHY3OENhbmRpZGF0ZUV2ZW50BARIATQBDDxDYW5kaWRhdGVCYWNrZWQQAHkHAUxDYW5kaWRhdGVSZWNlaXB0PEg+AADZBAEgSGVhZERhdGEAAH0HASRDb3JlSW5kZXgAAIEHAShHcm91cEluZGV4AAAARENhbmRpZGF0ZUluY2x1ZGVkEAB5BwFMQ2FuZGlkYXRlUmVjZWlwdDxIPgAA2QQBIEhlYWREYXRhAAB9BwEkQ29yZUluZGV4AACBBwEoR3JvdXBJbmRleAABAERDYW5kaWRhdGVUaW1lZE91dAwAeQcBTENhbmRpZGF0ZVJlY2VpcHQ8SD4AANkEASBIZWFkRGF0YQAAfQcBJENvcmVJbmRleAACAAAFDgQgQlRyZWVNYXAIBEsBjQIEVgHZCwAEAAkOAAAACQ4AAAINDgANDgAABAiNAtkLABEOBBhPcHRpb24EBFQBRQsBCBBOb25lAAAAEFNvbWUEAEULAAABAAAVDgQYT3B0aW9uBARUAfELAQgQTm9uZQAAABBTb21lBADxCwAAAQAAGQ4EGE9wdGlvbgQEVAG5BAEIEE5vbmUAAAAQU29tZQQAuQQAAAEAAB0OAAACIQ4AIQ4AAAQMEO0EAQwAJQ4EGE9wdGlvbgQEVAFZBAEIEE5vbmUAAAAQU29tZQQAWQQAAAEAACkOAAACLQ4ALQ4AAAQMEO0EDQwAMQ4EGE9wdGlvbgQEVAE1DgEIEE5vbmUAAAAQU29tZQQANQ4AAAEAADUOEExwb2xrYWRvdF9wcmltaXRpdmVzCHY3IHNsYXNoaW5nXE9wYXF1ZUtleU93bmVyc2hpcFByb29mAAAEADgBHFZlYzx1OD4AADkOBBhPcHRpb24EBFQBjAEIEE5vbmUAAAAQU29tZQQAjAAAAQAAPQ4EGE9wdGlvbgQEVAFBDgEIEE5vbmUAAAAQU29tZQQAQQ4AAAEAAEEOEExwb2xrYWRvdF9wcmltaXRpdmVzCHY3NGFzeW5jX2JhY2tpbmcwQmFja2luZ1N0YXRlCARIATQETgEQAAgBLGNvbnN0cmFpbnRzRQ4BOENvbnN0cmFpbnRzPE4+AAFQcGVuZGluZ19hdmFpbGFiaWxpdHllDgGcVmVjPENhbmRpZGF0ZVBlbmRpbmdBdmFpbGFiaWxpdHk8SCwgTj4+AABFDhBMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2NzRhc3luY19iYWNraW5nLENvbnN0cmFpbnRzBAROARAAOAFcbWluX3JlbGF5X3BhcmVudF9udW1iZXIQAQROAAEwbWF4X3Bvdl9zaXplEAEMdTMyAAE0bWF4X2NvZGVfc2l6ZRABDHUzMgABNHVtcF9yZW1haW5pbmcQAQx1MzIAAUx1bXBfcmVtYWluaW5nX2J5dGVzEAEMdTMyAAFkbWF4X3VtcF9udW1fcGVyX2NhbmRpZGF0ZRABDHUzMgABWGRtcF9yZW1haW5pbmdfbWVzc2FnZXPlAQEYVmVjPE4+AAEwaHJtcF9pbmJvdW5kSQ4BZEluYm91bmRIcm1wTGltaXRhdGlvbnM8Tj4AAURocm1wX2NoYW5uZWxzX291dE0OAaRWZWM8KElkLCBPdXRib3VuZEhybXBDaGFubmVsTGltaXRhdGlvbnMpPgABaG1heF9ocm1wX251bV9wZXJfY2FuZGlkYXRlEAEMdTMyAAE8cmVxdWlyZWRfcGFyZW502QQBIEhlYWREYXRhAAFQdmFsaWRhdGlvbl9jb2RlX2hhc2i5BAFIVmFsaWRhdGlvbkNvZGVIYXNoAAFMdXBncmFkZV9yZXN0cmljdGlvblkOAWhPcHRpb248VXBncmFkZVJlc3RyaWN0aW9uPgABWGZ1dHVyZV92YWxpZGF0aW9uX2NvZGVdDgF8T3B0aW9uPChOLCBWYWxpZGF0aW9uQ29kZUhhc2gpPgAASQ4QTHBvbGthZG90X3ByaW1pdGl2ZXMIdjc0YXN5bmNfYmFja2luZ1hJbmJvdW5kSHJtcExpbWl0YXRpb25zBAROARAABAFAdmFsaWRfd2F0ZXJtYXJrc+UBARhWZWM8Tj4AAE0OAAACUQ4AUQ4AAAQIjQJVDgBVDhBMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2NzRhc3luY19iYWNraW5neE91dGJvdW5kSHJtcENoYW5uZWxMaW1pdGF0aW9ucwAACAE8Ynl0ZXNfcmVtYWluaW5nEAEMdTMyAAFIbWVzc2FnZXNfcmVtYWluaW5nEAEMdTMyAABZDgQYT3B0aW9uBARUAbULAQgQTm9uZQAAABBTb21lBAC1CwAAAQAAXQ4EGE9wdGlvbgQEVAFhDgEIEE5vbmUAAAAQU29tZQQAYQ4AAAEAAGEOAAAECBC5BABlDgAAAmkOAGkOEExwb2xrYWRvdF9wcmltaXRpdmVzCHY3NGFzeW5jX2JhY2tpbmdwQ2FuZGlkYXRlUGVuZGluZ0F2YWlsYWJpbGl0eQgESAE0BE4BEAAUAThjYW5kaWRhdGVfaGFzaO0EATRDYW5kaWRhdGVIYXNoAAEoZGVzY3JpcHRvcq0EAVhDYW5kaWRhdGVEZXNjcmlwdG9yPEg+AAEsY29tbWl0bWVudHO9BAFQQ2FuZGlkYXRlQ29tbWl0bWVudHMAAUxyZWxheV9wYXJlbnRfbnVtYmVyEAEETgABMG1heF9wb3Zfc2l6ZRABDHUzMgAAbQ4EIEJUcmVlTWFwCARLAX0HBFYBlQsABABxDgAAAHEOAAACdQ4AdQ4AAAQIfQeVCwB5DgAAAqkEAH0OBBhPcHRpb24EBFQBgQ4BCBBOb25lAAAAEFNvbWUEAIEOAAABAACBDghIc3BfY29uc2Vuc3VzX2JlZWZ5MFZhbGlkYXRvclNldAQsQXV0aG9yaXR5SWQBKQIACAEodmFsaWRhdG9ycykNAUBWZWM8QXV0aG9yaXR5SWQ+AAEIaWQwAThWYWxpZGF0b3JTZXRJZAAAhQ4IKHNwX3J1bnRpbWUsT3BhcXVlVmFsdWUAAAQAOAEcVmVjPHU4PgAAiQ4EGE9wdGlvbgQEVAGFDgEIEE5vbmUAAAAQU29tZQQAhQ4AAAEAAI0OBBhSZXN1bHQIBFQBNARFAZEOAQgIT2sEADQAAAAADEVycgQAkQ4AAAEAAJEOCERzcF9tbXJfcHJpbWl0aXZlcxRFcnJvcgABKEBJbnZhbGlkTnVtZXJpY09wAAAAEFB1c2gAAQAcR2V0Um9vdAACABhDb21taXQAAwA0R2VuZXJhdGVQcm9vZgAEABhWZXJpZnkABQAwTGVhZk5vdEZvdW5kAAYARFBhbGxldE5vdEluY2x1ZGVkAAcAQEludmFsaWRMZWFmSW5kZXgACABUSW52YWxpZEJlc3RLbm93bkJsb2NrAAkAAJUOBBhSZXN1bHQIBFQBMARFAZEOAQgIT2sEADAAAAAADEVycgQAkQ4AAAEAAJkOBBhSZXN1bHQIBFQBnQ4ERQGRDgEICE9rBACdDgAAAAAMRXJyBACRDgAAAQAAnQ4AAAQIoQ6pDgChDgAAAqUOAKUOCERzcF9tbXJfcHJpbWl0aXZlc0xFbmNvZGFibGVPcGFxdWVMZWFmAAAEADgBHFZlYzx1OD4AAKkOCERzcF9tbXJfcHJpbWl0aXZlcyRMZWFmUHJvb2YEEEhhc2gBNAAMATBsZWFmX2luZGljZXOxCgE4VmVjPExlYWZJbmRleD4AAShsZWFmX2NvdW50MAEkTm9kZUluZGV4AAEUaXRlbXOVAQEkVmVjPEhhc2g+AACtDgQYUmVzdWx0CARUAYwERQGRDgEICE9rBACMAAAAAAxFcnIEAJEOAAABAACxDghEc3BfY29uc2Vuc3VzX2JhYmVEQmFiZUNvbmZpZ3VyYXRpb24AABgBNHNsb3RfZHVyYXRpb24wAQx1NjQAATBlcG9jaF9sZW5ndGgwAQx1NjQAAQRjtQEBKCh1NjQsIHU2NCkAASxhdXRob3JpdGllc1kIAZxWZWM8KEF1dGhvcml0eUlkLCBCYWJlQXV0aG9yaXR5V2VpZ2h0KT4AAShyYW5kb21uZXNzBAEoUmFuZG9tbmVzcwABNGFsbG93ZWRfc2xvdHO5AQEwQWxsb3dlZFNsb3RzAAC1DghEc3BfY29uc2Vuc3VzX2JhYmUURXBvY2gAABgBLGVwb2NoX2luZGV4MAEMdTY0AAEoc3RhcnRfc2xvdKkBARBTbG90AAEgZHVyYXRpb24wAQx1NjQAASxhdXRob3JpdGllc1kIAZxWZWM8KEF1dGhvcml0eUlkLCBCYWJlQXV0aG9yaXR5V2VpZ2h0KT4AAShyYW5kb21uZXNzBAEoUmFuZG9tbmVzcwABGGNvbmZpZ30IAVhCYWJlRXBvY2hDb25maWd1cmF0aW9uAAC5DgQYT3B0aW9uBARUAb0OAQgQTm9uZQAAABBTb21lBAC9DgAAAQAAvQ4IRHNwX2NvbnNlbnN1c19iYWJlXE9wYXF1ZUtleU93bmVyc2hpcFByb29mAAAEADgBHFZlYzx1OD4AAMEOBBhPcHRpb24EBFQBxQ4BCBBOb25lAAAAEFNvbWUEAMUOAAABAADFDgAAAskOAMkOAAAECDhdCQDNDgxocGFsbGV0X3RyYW5zYWN0aW9uX3BheW1lbnQUdHlwZXNMUnVudGltZURpc3BhdGNoSW5mbwgcQmFsYW5jZQEYGFdlaWdodAEoAAwBGHdlaWdodCgBGFdlaWdodAABFGNsYXNzYAE0RGlzcGF0Y2hDbGFzcwABLHBhcnRpYWxfZmVlGAEcQmFsYW5jZQAA0Q4MaHBhbGxldF90cmFuc2FjdGlvbl9wYXltZW50FHR5cGVzKEZlZURldGFpbHMEHEJhbGFuY2UBGAAIATRpbmNsdXNpb25fZmVl1Q4BdE9wdGlvbjxJbmNsdXNpb25GZWU8QmFsYW5jZT4+AAEMdGlwGAEcQmFsYW5jZQAA1Q4EGE9wdGlvbgQEVAHZDgEIEE5vbmUAAAAQU29tZQQA2Q4AAAEAANkODGhwYWxsZXRfdHJhbnNhY3Rpb25fcGF5bWVudBR0eXBlczBJbmNsdXNpb25GZWUEHEJhbGFuY2UBGAAMASBiYXNlX2ZlZRgBHEJhbGFuY2UAARxsZW5fZmVlGAEcQmFsYW5jZQABTGFkanVzdGVkX3dlaWdodF9mZWUYARxCYWxhbmNlAADdDgQYUmVzdWx0CARUAeEOBEUB5Q4BCAhPawQA4Q4AAAAADEVycgQA5Q4AAAEAAOEOAAACvQYA5Q4MQHhjbV9ydW50aW1lX2FwaXMQZmVlcxRFcnJvcgABGDRVbmltcGxlbWVudGVkAAAAZFZlcnNpb25lZENvbnZlcnNpb25GYWlsZWQAAQBMV2VpZ2h0Tm90Q29tcHV0YWJsZQACAExVbmhhbmRsZWRYY21WZXJzaW9uAAMANEFzc2V0Tm90Rm91bmQABAAoVW5yb3V0YWJsZQAFAADpDgQYUmVzdWx0CARUASgERQHlDgEICE9rBAAoAAAAAAxFcnIEAOUOAAABAADtDgQYUmVzdWx0CARUARgERQHlDgEICE9rBAAYAAAAAAxFcnIEAOUOAAABAADxDgQYUmVzdWx0CARUAYkGBEUB5Q4BCAhPawQAiQYAAAAADEVycgQA5Q4AAAEAAPUOBBhSZXN1bHQIBFQB+Q4ERQERDwEICE9rBAD5DgAAAAAMRXJyBAARDwAAAQAA+Q4MQHhjbV9ydW50aW1lX2FwaXMcZHJ5X3J1bkRDYWxsRHJ5UnVuRWZmZWN0cwQURXZlbnQBVAAQAUBleGVjdXRpb25fcmVzdWx0FQcBaERpc3BhdGNoUmVzdWx0V2l0aFBvc3RJbmZvAAE4ZW1pdHRlZF9ldmVudHP9DgEoVmVjPEV2ZW50PgABJGxvY2FsX3hjbQEPAWBPcHRpb248VmVyc2lvbmVkWGNtPCgpPj4AAThmb3J3YXJkZWRfeGNtcwUPAbxWZWM8KFZlcnNpb25lZExvY2F0aW9uLCBWZWM8VmVyc2lvbmVkWGNtPCgpPj4pPgAA/Q4AAAJUAAEPBBhPcHRpb24EBFQBiQUBCBBOb25lAAAAEFNvbWUEAIkFAAABAAAFDwAAAgkPAAkPAAAECEUBDQ8ADQ8AAAKJBQARDwxAeGNtX3J1bnRpbWVfYXBpcxxkcnlfcnVuFEVycm9yAAEINFVuaW1wbGVtZW50ZWQAAABkVmVyc2lvbmVkQ29udmVyc2lvbkZhaWxlZAABAAAVDwQYUmVzdWx0CARUARkPBEUBEQ8BCAhPawQAGQ8AAAAADEVycgQAEQ8AAAEAABkPDEB4Y21fcnVudGltZV9hcGlzHGRyeV9ydW5AWGNtRHJ5UnVuRWZmZWN0cwQURXZlbnQBVAAMAUBleGVjdXRpb25fcmVzdWx0wQcBHE91dGNvbWUAAThlbWl0dGVkX2V2ZW50c/0OAShWZWM8RXZlbnQ+AAE4Zm9yd2FyZGVkX3hjbXMFDwG8VmVjPChWZXJzaW9uZWRMb2NhdGlvbiwgVmVjPFZlcnNpb25lZFhjbTwoKT4+KT4AAB0PBBhSZXN1bHQIBFQBAARFASEPAQgIT2sEAAAAAAAADEVycgQAIQ8AAAEAACEPDEB4Y21fcnVudGltZV9hcGlzLGNvbnZlcnNpb25zFEVycm9yAAEILFVuc3VwcG9ydGVkAAAAZFZlcnNpb25lZENvbnZlcnNpb25GYWlsZWQAAQAAJQ8EGFJlc3VsdAgEVAGMBEUB4QcBCAhPawQAjAAAAAAMRXJyBADhBwAAAQAAKQ8EGE9wdGlvbgQEVAHhBwEIEE5vbmUAAAAQU29tZQQA4QcAAAEAAC0PAAAC4QcAMQ8INHBhc2VvX3J1bnRpbWUwUnVudGltZUVycm9yAAG0GFN5c3RlbQQAEQgBcGZyYW1lX3N5c3RlbTo6RXJyb3I8UnVudGltZT4AAAAkU2NoZWR1bGVyBAApCAGAcGFsbGV0X3NjaGVkdWxlcjo6RXJyb3I8UnVudGltZT4AAQAgUHJlaW1hZ2UEAE0IAXxwYWxsZXRfcHJlaW1hZ2U6OkVycm9yPFJ1bnRpbWU+AAoAEEJhYmUEAI0IAWxwYWxsZXRfYmFiZTo6RXJyb3I8UnVudGltZT4AAgAcSW5kaWNlcwQAlQgBeHBhbGxldF9pbmRpY2VzOjpFcnJvcjxSdW50aW1lPgAEACBCYWxhbmNlcwQA4QgBfHBhbGxldF9iYWxhbmNlczo6RXJyb3I8UnVudGltZT4ABQAcU3Rha2luZwQAQQkBeHBhbGxldF9zdGFraW5nOjpFcnJvcjxSdW50aW1lPgAHABxTZXNzaW9uBABhCQF4cGFsbGV0X3Nlc3Npb246OkVycm9yPFJ1bnRpbWU+AAkAHEdyYW5kcGEEAHEJAXhwYWxsZXRfZ3JhbmRwYTo6RXJyb3I8UnVudGltZT4ACwAgVHJlYXN1cnkEAJUJAXxwYWxsZXRfdHJlYXN1cnk6OkVycm9yPFJ1bnRpbWU+ABMAQENvbnZpY3Rpb25Wb3RpbmcEAMkJAaBwYWxsZXRfY29udmljdGlvbl92b3Rpbmc6OkVycm9yPFJ1bnRpbWU+ABQAJFJlZmVyZW5kYQQAEQoBgHBhbGxldF9yZWZlcmVuZGE6OkVycm9yPFJ1bnRpbWU+ABUAJFdoaXRlbGlzdAQAFQoBgHBhbGxldF93aGl0ZWxpc3Q6OkVycm9yPFJ1bnRpbWU+ABcAGENsYWltcwQAGQoBWGNsYWltczo6RXJyb3I8UnVudGltZT4AGAAcVmVzdGluZwQAKQoBeHBhbGxldF92ZXN0aW5nOjpFcnJvcjxSdW50aW1lPgAZABxVdGlsaXR5BAAtCgF4cGFsbGV0X3V0aWxpdHk6OkVycm9yPFJ1bnRpbWU+ABoAFFByb3h5BABRCgFwcGFsbGV0X3Byb3h5OjpFcnJvcjxSdW50aW1lPgAdACBNdWx0aXNpZwQAYQoBfHBhbGxldF9tdWx0aXNpZzo6RXJyb3I8UnVudGltZT4AHgAgQm91bnRpZXMEAHEKAXxwYWxsZXRfYm91bnRpZXM6OkVycm9yPFJ1bnRpbWU+ACIANENoaWxkQm91bnRpZXMEAH0KAZRwYWxsZXRfY2hpbGRfYm91bnRpZXM6OkVycm9yPFJ1bnRpbWU+ACYAaEVsZWN0aW9uUHJvdmlkZXJNdWx0aVBoYXNlBAClCgHQcGFsbGV0X2VsZWN0aW9uX3Byb3ZpZGVyX211bHRpX3BoYXNlOjpFcnJvcjxSdW50aW1lPgAkACRWb3Rlckxpc3QEALUKAfRwYWxsZXRfYmFnc19saXN0OjpFcnJvcjxSdW50aW1lLCBwYWxsZXRfYmFnc19saXN0OjpJbnN0YW5jZTE+ACUAPE5vbWluYXRpb25Qb29scwQA/QoBnHBhbGxldF9ub21pbmF0aW9uX3Bvb2xzOjpFcnJvcjxSdW50aW1lPgAnACxGYXN0VW5zdGFrZQQAEQsBjHBhbGxldF9mYXN0X3Vuc3Rha2U6OkVycm9yPFJ1bnRpbWU+ACgANENvbmZpZ3VyYXRpb24EACELAaBwYXJhY2hhaW5zX2NvbmZpZ3VyYXRpb246OkVycm9yPFJ1bnRpbWU+ADMANFBhcmFJbmNsdXNpb24EAEELAZBwYXJhY2hhaW5zX2luY2x1c2lvbjo6RXJyb3I8UnVudGltZT4ANQAwUGFyYUluaGVyZW50BABZCwGkcGFyYWNoYWluc19wYXJhc19pbmhlcmVudDo6RXJyb3I8UnVudGltZT4ANgAUUGFyYXMEALkLAYBwYXJhY2hhaW5zX3BhcmFzOjpFcnJvcjxSdW50aW1lPgA4ABBIcm1wBADpCwF8cGFyYWNoYWluc19ocm1wOjpFcnJvcjxSdW50aW1lPgA8ADRQYXJhc0Rpc3B1dGVzBAAJDAGMcGFyYWNoYWluc19kaXNwdXRlczo6RXJyb3I8UnVudGltZT4APgA0UGFyYXNTbGFzaGluZwQAHQwBjHBhcmFjaGFpbnNfc2xhc2hpbmc6OkVycm9yPFJ1bnRpbWU+AD8AIE9uRGVtYW5kBABNDAG0cGFyYWNoYWluc19hc3NpZ25lcl9vbl9kZW1hbmQ6OkVycm9yPFJ1bnRpbWU+AEAAaENvcmV0aW1lQXNzaWdubWVudFByb3ZpZGVyBAB5DAGwcGFyYWNoYWluc19hc3NpZ25lcl9jb3JldGltZTo6RXJyb3I8UnVudGltZT4AQQAkUmVnaXN0cmFyBACBDAF8cGFyYXNfcmVnaXN0cmFyOjpFcnJvcjxSdW50aW1lPgBGABRTbG90cwQAiQwBVHNsb3RzOjpFcnJvcjxSdW50aW1lPgBHACBBdWN0aW9ucwQAnQwBYGF1Y3Rpb25zOjpFcnJvcjxSdW50aW1lPgBIACRDcm93ZGxvYW4EAKkMAWRjcm93ZGxvYW46OkVycm9yPFJ1bnRpbWU+AEkAIENvcmV0aW1lBACtDAFgY29yZXRpbWU6OkVycm9yPFJ1bnRpbWU+AEoASFN0YXRlVHJpZU1pZ3JhdGlvbgQAuQcBrHBhbGxldF9zdGF0ZV90cmllX21pZ3JhdGlvbjo6RXJyb3I8UnVudGltZT4AYgAkWGNtUGFsbGV0BAABDQFocGFsbGV0X3hjbTo6RXJyb3I8UnVudGltZT4AYwAwTWVzc2FnZVF1ZXVlBAAdDQGQcGFsbGV0X21lc3NhZ2VfcXVldWU6OkVycm9yPFJ1bnRpbWU+AGQAJEFzc2V0UmF0ZQQAIQ0BhHBhbGxldF9hc3NldF9yYXRlOjpFcnJvcjxSdW50aW1lPgBlABRCZWVmeQQALQ0BcHBhbGxldF9iZWVmeTo6RXJyb3I8UnVudGltZT4AyAA8UGFyYVN1ZG9XcmFwcGVyBAA1DQGIcGFyYXNfc3Vkb193cmFwcGVyOjpFcnJvcjxSdW50aW1lPgD6ABBTdWRvBAA5DQFscGFsbGV0X3N1ZG86OkVycm9yPFJ1bnRpbWU+AP8AAPQYU3lzdGVtARhTeXN0ZW1IHEFjY291bnQBAQQCAAxBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACABOggVGhlIGZ1bGwgYWNjb3VudCBpbmZvcm1hdGlvbiBmb3IgYSBwYXJ0aWN1bGFyIGFjY291bnQgSUQuOEV4dHJpbnNpY0NvdW50AAAQBAAEuCBUb3RhbCBleHRyaW5zaWNzIGNvdW50IGZvciB0aGUgY3VycmVudCBibG9jay5ASW5oZXJlbnRzQXBwbGllZAEAIAQABKQgV2hldGhlciBhbGwgaW5oZXJlbnRzIGhhdmUgYmVlbiBhcHBsaWVkLixCbG9ja1dlaWdodAEAJBgAAAAAAAAEiCBUaGUgY3VycmVudCB3ZWlnaHQgZm9yIHRoZSBibG9jay5AQWxsRXh0cmluc2ljc0xlbgAAEAQABEEBIFRvdGFsIGxlbmd0aCAoaW4gYnl0ZXMpIGZvciBhbGwgZXh0cmluc2ljcyBwdXQgdG9nZXRoZXIsIGZvciB0aGUgY3VycmVudCBibG9jay4kQmxvY2tIYXNoAQEEBRA0gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABJggTWFwIG9mIGJsb2NrIG51bWJlcnMgdG8gYmxvY2sgaGFzaGVzLjRFeHRyaW5zaWNEYXRhAQEEBRA4BAAEPQEgRXh0cmluc2ljcyBkYXRhIGZvciB0aGUgY3VycmVudCBibG9jayAobWFwcyBhbiBleHRyaW5zaWMncyBpbmRleCB0byBpdHMgZGF0YSkuGE51bWJlcgEAEBAAAAAABAkBIFRoZSBjdXJyZW50IGJsb2NrIG51bWJlciBiZWluZyBwcm9jZXNzZWQuIFNldCBieSBgZXhlY3V0ZV9ibG9ja2AuKFBhcmVudEhhc2gBADSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEcCBIYXNoIG9mIHRoZSBwcmV2aW91cyBibG9jay4YRGlnZXN0AQA8BAAE8CBEaWdlc3Qgb2YgdGhlIGN1cnJlbnQgYmxvY2ssIGFsc28gcGFydCBvZiB0aGUgYmxvY2sgaGVhZGVyLhhFdmVudHMBAEwEABygIEV2ZW50cyBkZXBvc2l0ZWQgZm9yIHRoZSBjdXJyZW50IGJsb2NrLgAdASBOT1RFOiBUaGUgaXRlbSBpcyB1bmJvdW5kIGFuZCBzaG91bGQgdGhlcmVmb3JlIG5ldmVyIGJlIHJlYWQgb24gY2hhaW4u0CBJdCBjb3VsZCBvdGhlcndpc2UgaW5mbGF0ZSB0aGUgUG9WIHNpemUgb2YgYSBibG9jay4ALQEgRXZlbnRzIGhhdmUgYSBsYXJnZSBpbi1tZW1vcnkgc2l6ZS4gQm94IHRoZSBldmVudHMgdG8gbm90IGdvIG91dC1vZi1tZW1vcnn8IGp1c3QgaW4gY2FzZSBzb21lb25lIHN0aWxsIHJlYWRzIHRoZW0gZnJvbSB3aXRoaW4gdGhlIHJ1bnRpbWUuKEV2ZW50Q291bnQBABAQAAAAAAS4IFRoZSBudW1iZXIgb2YgZXZlbnRzIGluIHRoZSBgRXZlbnRzPFQ+YCBsaXN0LixFdmVudFRvcGljcwEBBAI02QcEACglASBNYXBwaW5nIGJldHdlZW4gYSB0b3BpYyAocmVwcmVzZW50ZWQgYnkgVDo6SGFzaCkgYW5kIGEgdmVjdG9yIG9mIGluZGV4ZXOUIG9mIGV2ZW50cyBpbiB0aGUgYDxFdmVudHM8VD4+YCBsaXN0LgBRASBBbGwgdG9waWMgdmVjdG9ycyBoYXZlIGRldGVybWluaXN0aWMgc3RvcmFnZSBsb2NhdGlvbnMgZGVwZW5kaW5nIG9uIHRoZSB0b3BpYy4gVGhpc0UBIGFsbG93cyBsaWdodC1jbGllbnRzIHRvIGxldmVyYWdlIHRoZSBjaGFuZ2VzIHRyaWUgc3RvcmFnZSB0cmFja2luZyBtZWNoYW5pc20gYW5k5CBpbiBjYXNlIG9mIGNoYW5nZXMgZmV0Y2ggdGhlIGxpc3Qgb2YgZXZlbnRzIG9mIGludGVyZXN0LgBZASBUaGUgdmFsdWUgaGFzIHRoZSB0eXBlIGAoQmxvY2tOdW1iZXJGb3I8VD4sIEV2ZW50SW5kZXgpYCBiZWNhdXNlIGlmIHdlIHVzZWQgb25seSBqdXN0TQEgdGhlIGBFdmVudEluZGV4YCB0aGVuIGluIGNhc2UgaWYgdGhlIHRvcGljIGhhcyB0aGUgc2FtZSBjb250ZW50cyBvbiB0aGUgbmV4dCBibG9jawEBIG5vIG5vdGlmaWNhdGlvbiB3aWxsIGJlIHRyaWdnZXJlZCB0aHVzIHRoZSBldmVudCBtaWdodCBiZSBsb3N0LkhMYXN0UnVudGltZVVwZ3JhZGUAAN0HBAAEVQEgU3RvcmVzIHRoZSBgc3BlY192ZXJzaW9uYCBhbmQgYHNwZWNfbmFtZWAgb2Ygd2hlbiB0aGUgbGFzdCBydW50aW1lIHVwZ3JhZGUgaGFwcGVuZWQuVFVwZ3JhZGVkVG9VMzJSZWZDb3VudAEAIAQABE0BIFRydWUgaWYgd2UgaGF2ZSB1cGdyYWRlZCBzbyB0aGF0IGB0eXBlIFJlZkNvdW50YCBpcyBgdTMyYC4gRmFsc2UgKGRlZmF1bHQpIGlmIG5vdC5gVXBncmFkZWRUb1RyaXBsZVJlZkNvdW50AQAgBAAIXQEgVHJ1ZSBpZiB3ZSBoYXZlIHVwZ3JhZGVkIHNvIHRoYXQgQWNjb3VudEluZm8gY29udGFpbnMgdGhyZWUgdHlwZXMgb2YgYFJlZkNvdW50YC4gRmFsc2VIIChkZWZhdWx0KSBpZiBub3QuOEV4ZWN1dGlvblBoYXNlAADVBwQABIggVGhlIGV4ZWN1dGlvbiBwaGFzZSBvZiB0aGUgYmxvY2suREF1dGhvcml6ZWRVcGdyYWRlAADlBwQABLggYFNvbWVgIGlmIGEgY29kZSB1cGdyYWRlIGhhcyBiZWVuIGF1dGhvcml6ZWQuAXkBAVgYMEJsb2NrV2VpZ2h0c+kHAQIHsL3pNgMACwAgSqnRARP//////////yItDR4AAQu4hFyPWAETo3A9CtejcL0BCwCY9z5dARP/////////vwEAACItDR4AAQu4DK/5zAETo3A9CtejcP0BCwAgSqnRARP//////////wEHAIhSanQTAAAAAAAAAEAiLQ0eAAAAAATQIEJsb2NrICYgZXh0cmluc2ljcyB3ZWlnaHRzOiBiYXNlIHZhbHVlcyBhbmQgbGltaXRzLixCbG9ja0xlbmd0aPUHMAAAPAAAAFAAAABQAASoIFRoZSBtYXhpbXVtIGxlbmd0aCBvZiBhIGJsb2NrIChpbiBieXRlcykuOEJsb2NrSGFzaENvdW50EBAAEAAABFUBIE1heGltdW0gbnVtYmVyIG9mIGJsb2NrIG51bWJlciB0byBibG9jayBoYXNoIG1hcHBpbmdzIHRvIGtlZXAgKG9sZGVzdCBwcnVuZWQgZmlyc3QpLiBEYldlaWdodP0HQDjKOAEAAAAAmKr5BAAAAAAECQEgVGhlIHdlaWdodCBvZiBydW50aW1lIGRhdGFiYXNlIG9wZXJhdGlvbnMgdGhlIHJ1bnRpbWUgY2FuIGludm9rZS4cVmVyc2lvbgEI6QQUcGFzZW80cGFzZW8tdGVzdG5ldAAAAAD8TQ8AAAAAAFzFH/H6P10MygEAAADfastomQdgmwUAAAA345f8fJH15AIAAABA/jrUAfiVmgYAAAAXprwNAGKuswEAAAAY71ijtnuncAEAAADSvJiX7tCPFQMAAAD3iyeL5T9FTAIAAACvLAKXoj5tPQsAAABJ6q8bVIoMsAMAAACR1d8YsNLPWAIAAAAqXpJGVTmeYAEAAADtmcWssl7t9QMAAADLyiXjnxQjhwIAAABoetRK038DwgEAAACrPAVyKR/riwEAAAC8nYmQT1uSPwEAAAA3yLsTUKmiqAQAAADz/xTVq1JwWQMAAABv9S7oWObFvQEAAACRscixYyjrkgEAAACf+1BapzjWnAEAAAD7xXe510fv1gEAAAAaAAAAAQSEIEdldCB0aGUgY2hhaW4ncyBpbi1jb2RlIHZlcnNpb24uKFNTNThQcmVmaXhtAQgAABSoIFRoZSBkZXNpZ25hdGVkIFNTNTggcHJlZml4IG9mIHRoaXMgY2hhaW4uADkBIFRoaXMgcmVwbGFjZXMgdGhlICJzczU4Rm9ybWF0IiBwcm9wZXJ0eSBkZWNsYXJlZCBpbiB0aGUgY2hhaW4gc3BlYy4gUmVhc29uIGlzMQEgdGhhdCB0aGUgcnVudGltZSBzaG91bGQga25vdyBhYm91dCB0aGUgcHJlZml4IGluIG9yZGVyIHRvIG1ha2UgdXNlIG9mIGl0IGFzcCBhbiBpZGVudGlmaWVyIG9mIHRoZSBjaGFpbi4BEQgAACRTY2hlZHVsZXIBJFNjaGVkdWxlchA8SW5jb21wbGV0ZVNpbmNlAAAQBAAAGEFnZW5kYQEBBAUQFQgEAARNASBJdGVtcyB0byBiZSBleGVjdXRlZCwgaW5kZXhlZCBieSB0aGUgYmxvY2sgbnVtYmVyIHRoYXQgdGhleSBzaG91bGQgYmUgZXhlY3V0ZWQgb24uHFJldHJpZXMAAQQCgCUIBAAEIQEgUmV0cnkgY29uZmlndXJhdGlvbnMgZm9yIGl0ZW1zIHRvIGJlIGV4ZWN1dGVkLCBpbmRleGVkIGJ5IHRhc2sgYWRkcmVzcy4YTG9va3VwAAEEBQSABAAQ+CBMb29rdXAgZnJvbSBhIG5hbWUgdG8gdGhlIGJsb2NrIG51bWJlciBhbmQgaW5kZXggb2YgdGhlIHRhc2suAFkBIEZvciB2MyAtPiB2NCB0aGUgcHJldmlvdXNseSB1bmJvdW5kZWQgaWRlbnRpdGllcyBhcmUgQmxha2UyLTI1NiBoYXNoZWQgdG8gZm9ybSB0aGUgdjQwIGlkZW50aXRpZXMuAYkBAXwINE1heGltdW1XZWlnaHQoQAsAgG6HdAETzMzMzMzMzMwEKQEgVGhlIG1heGltdW0gd2VpZ2h0IHRoYXQgbWF5IGJlIHNjaGVkdWxlZCBwZXIgYmxvY2sgZm9yIGFueSBkaXNwYXRjaGFibGVzLlBNYXhTY2hlZHVsZWRQZXJCbG9jaxAQMgAAABQdASBUaGUgbWF4aW11bSBudW1iZXIgb2Ygc2NoZWR1bGVkIGNhbGxzIGluIHRoZSBxdWV1ZSBmb3IgYSBzaW5nbGUgYmxvY2suABggTk9URTpRASArIERlcGVuZGVudCBwYWxsZXRzJyBiZW5jaG1hcmtzIG1pZ2h0IHJlcXVpcmUgYSBoaWdoZXIgbGltaXQgZm9yIHRoZSBzZXR0aW5nLiBTZXQgYcQgaGlnaGVyIGxpbWl0IHVuZGVyIGBydW50aW1lLWJlbmNobWFya3NgIGZlYXR1cmUuASkIAQAgUHJlaW1hZ2UBIFByZWltYWdlDCRTdGF0dXNGb3IAAQQGNC0IBAAEkCBUaGUgcmVxdWVzdCBzdGF0dXMgb2YgYSBnaXZlbiBoYXNoLkBSZXF1ZXN0U3RhdHVzRm9yAAEEBjQ1CAQABJAgVGhlIHJlcXVlc3Qgc3RhdHVzIG9mIGEgZ2l2ZW4gaGFzaC4sUHJlaW1hZ2VGb3IAAQQGRQhJCAQAAAGRAQGQAAFNCAoAEEJhYmUBEEJhYmVEKEVwb2NoSW5kZXgBADAgAAAAAAAAAAAEVCBDdXJyZW50IGVwb2NoIGluZGV4LixBdXRob3JpdGllcwEAUQgEAARsIEN1cnJlbnQgZXBvY2ggYXV0aG9yaXRpZXMuLEdlbmVzaXNTbG90AQCpASAAAAAAAAAAAAj4IFRoZSBzbG90IGF0IHdoaWNoIHRoZSBmaXJzdCBlcG9jaCBhY3R1YWxseSBzdGFydGVkLiBUaGlzIGlzIDCQIHVudGlsIHRoZSBmaXJzdCBibG9jayBvZiB0aGUgY2hhaW4uLEN1cnJlbnRTbG90AQCpASAAAAAAAAAAAARUIEN1cnJlbnQgc2xvdCBudW1iZXIuKFJhbmRvbW5lc3MBAASAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAouCBUaGUgZXBvY2ggcmFuZG9tbmVzcyBmb3IgdGhlICpjdXJyZW50KiBlcG9jaC4ALCAjIFNlY3VyaXR5AAUBIFRoaXMgTVVTVCBOT1QgYmUgdXNlZCBmb3IgZ2FtYmxpbmcsIGFzIGl0IGNhbiBiZSBpbmZsdWVuY2VkIGJ5IGH4IG1hbGljaW91cyB2YWxpZGF0b3IgaW4gdGhlIHNob3J0IHRlcm0uIEl0IE1BWSBiZSB1c2VkIGluIG1hbnkVASBjcnlwdG9ncmFwaGljIHByb3RvY29scywgaG93ZXZlciwgc28gbG9uZyBhcyBvbmUgcmVtZW1iZXJzIHRoYXQgdGhpcxUBIChsaWtlIGV2ZXJ5dGhpbmcgZWxzZSBvbi1jaGFpbikgaXQgaXMgcHVibGljLiBGb3IgZXhhbXBsZSwgaXQgY2FuIGJlBQEgdXNlZCB3aGVyZSBhIG51bWJlciBpcyBuZWVkZWQgdGhhdCBjYW5ub3QgaGF2ZSBiZWVuIGNob3NlbiBieSBhbg0BIGFkdmVyc2FyeSwgZm9yIHB1cnBvc2VzIHN1Y2ggYXMgcHVibGljLWNvaW4gemVyby1rbm93bGVkZ2UgcHJvb2ZzLmBQZW5kaW5nRXBvY2hDb25maWdDaGFuZ2UAALEBBAAEYQEgUGVuZGluZyBlcG9jaCBjb25maWd1cmF0aW9uIGNoYW5nZSB0aGF0IHdpbGwgYmUgYXBwbGllZCB3aGVuIHRoZSBuZXh0IGVwb2NoIGlzIGVuYWN0ZWQuOE5leHRSYW5kb21uZXNzAQAEgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFwgTmV4dCBlcG9jaCByYW5kb21uZXNzLjxOZXh0QXV0aG9yaXRpZXMBAFEIBAAEYCBOZXh0IGVwb2NoIGF1dGhvcml0aWVzLjBTZWdtZW50SW5kZXgBABAQAAAAACR8IFJhbmRvbW5lc3MgdW5kZXIgY29uc3RydWN0aW9uLgD4IFdlIG1ha2UgYSB0cmFkZS1vZmYgYmV0d2VlbiBzdG9yYWdlIGFjY2Vzc2VzIGFuZCBsaXN0IGxlbmd0aC4BASBXZSBzdG9yZSB0aGUgdW5kZXItY29uc3RydWN0aW9uIHJhbmRvbW5lc3MgaW4gc2VnbWVudHMgb2YgdXAgdG+UIGBVTkRFUl9DT05TVFJVQ1RJT05fU0VHTUVOVF9MRU5HVEhgLgDsIE9uY2UgYSBzZWdtZW50IHJlYWNoZXMgdGhpcyBsZW5ndGgsIHdlIGJlZ2luIHRoZSBuZXh0IG9uZS4JASBXZSByZXNldCBhbGwgc2VnbWVudHMgYW5kIHJldHVybiB0byBgMGAgYXQgdGhlIGJlZ2lubmluZyBvZiBldmVyeRwgZXBvY2guRFVuZGVyQ29uc3RydWN0aW9uAQEEBRBdCAQABBUBIFRXT1gtTk9URTogYFNlZ21lbnRJbmRleGAgaXMgYW4gaW5jcmVhc2luZyBpbnRlZ2VyLCBzbyB0aGlzIGlzIG9rYXkuLEluaXRpYWxpemVkAABlCAQACAEBIFRlbXBvcmFyeSB2YWx1ZSAoY2xlYXJlZCBhdCBibG9jayBmaW5hbGl6YXRpb24pIHdoaWNoIGlzIGBTb21lYB0BIGlmIHBlci1ibG9jayBpbml0aWFsaXphdGlvbiBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZCBmb3IgY3VycmVudCBibG9jay5MQXV0aG9yVnJmUmFuZG9tbmVzcwEAhAQAEBUBIFRoaXMgZmllbGQgc2hvdWxkIGFsd2F5cyBiZSBwb3B1bGF0ZWQgZHVyaW5nIGJsb2NrIHByb2Nlc3NpbmcgdW5sZXNzGQEgc2Vjb25kYXJ5IHBsYWluIHNsb3RzIGFyZSBlbmFibGVkICh3aGljaCBkb24ndCBjb250YWluIGEgVlJGIG91dHB1dCkuAEkBIEl0IGlzIHNldCBpbiBgb25fZmluYWxpemVgLCBiZWZvcmUgaXQgd2lsbCBjb250YWluIHRoZSB2YWx1ZSBmcm9tIHRoZSBsYXN0IGJsb2NrLihFcG9jaFN0YXJ0AQCAIAAAAAAAAAAAFF0BIFRoZSBibG9jayBudW1iZXJzIHdoZW4gdGhlIGxhc3QgYW5kIGN1cnJlbnQgZXBvY2ggaGF2ZSBzdGFydGVkLCByZXNwZWN0aXZlbHkgYE4tMWAgYW5kFCBgTmAuSQEgTk9URTogV2UgdHJhY2sgdGhpcyBpcyBpbiBvcmRlciB0byBhbm5vdGF0ZSB0aGUgYmxvY2sgbnVtYmVyIHdoZW4gYSBnaXZlbiBwb29sIG9mWQEgZW50cm9weSB3YXMgZml4ZWQgKGkuZS4gaXQgd2FzIGtub3duIHRvIGNoYWluIG9ic2VydmVycykuIFNpbmNlIGVwb2NocyBhcmUgZGVmaW5lZCBpblkBIHNsb3RzLCB3aGljaCBtYXkgYmUgc2tpcHBlZCwgdGhlIGJsb2NrIG51bWJlcnMgbWF5IG5vdCBsaW5lIHVwIHdpdGggdGhlIHNsb3QgbnVtYmVycy4gTGF0ZW5lc3MBABAQAAAAABTYIEhvdyBsYXRlIHRoZSBjdXJyZW50IGJsb2NrIGlzIGNvbXBhcmVkIHRvIGl0cyBwYXJlbnQuABUBIFRoaXMgZW50cnkgaXMgcG9wdWxhdGVkIGFzIHBhcnQgb2YgYmxvY2sgZXhlY3V0aW9uIGFuZCBpcyBjbGVhbmVkIHVwEQEgb24gYmxvY2sgZmluYWxpemF0aW9uLiBRdWVyeWluZyB0aGlzIHN0b3JhZ2UgZW50cnkgb3V0c2lkZSBvZiBibG9ja7AgZXhlY3V0aW9uIGNvbnRleHQgc2hvdWxkIGFsd2F5cyB5aWVsZCB6ZXJvLixFcG9jaENvbmZpZwAAfQgEAAhhASBUaGUgY29uZmlndXJhdGlvbiBmb3IgdGhlIGN1cnJlbnQgZXBvY2guIFNob3VsZCBuZXZlciBiZSBgTm9uZWAgYXMgaXQgaXMgaW5pdGlhbGl6ZWQgaW4kIGdlbmVzaXMuPE5leHRFcG9jaENvbmZpZwAAfQgEAAgtASBUaGUgY29uZmlndXJhdGlvbiBmb3IgdGhlIG5leHQgZXBvY2gsIGBOb25lYCBpZiB0aGUgY29uZmlnIHdpbGwgbm90IGNoYW5nZeggKHlvdSBjYW4gZmFsbGJhY2sgdG8gYEVwb2NoQ29uZmlnYCBpbnN0ZWFkIGluIHRoYXQgY2FzZSkuNFNraXBwZWRFcG9jaHMBAIEIBAAgKQEgQSBsaXN0IG9mIHRoZSBsYXN0IDEwMCBza2lwcGVkIGVwb2NocyBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgc2Vzc2lvbiBpbmRleHAgd2hlbiB0aGUgZXBvY2ggd2FzIHNraXBwZWQuADEBIFRoaXMgaXMgb25seSB1c2VkIGZvciB2YWxpZGF0aW5nIGVxdWl2b2NhdGlvbiBwcm9vZnMuIEFuIGVxdWl2b2NhdGlvbiBwcm9vZjUBIG11c3QgY29udGFpbnMgYSBrZXktb3duZXJzaGlwIHByb29mIGZvciBhIGdpdmVuIHNlc3Npb24sIHRoZXJlZm9yZSB3ZSBuZWVkIGE5ASB3YXkgdG8gdGllIHRvZ2V0aGVyIHNlc3Npb25zIGFuZCBlcG9jaCBpbmRpY2VzLCBpLmUuIHdlIG5lZWQgdG8gdmFsaWRhdGUgdGhhdCkBIGEgdmFsaWRhdG9yIHdhcyB0aGUgb3duZXIgb2YgYSBnaXZlbiBrZXkgb24gYSBnaXZlbiBzZXNzaW9uLCBhbmQgd2hhdCB0aGWwIGFjdGl2ZSBlcG9jaCBpbmRleCB3YXMgZHVyaW5nIHRoYXQgc2Vzc2lvbi4BmQEAEDRFcG9jaER1cmF0aW9uMCBYAgAAAAAAAAzsIFRoZSBhbW91bnQgb2YgdGltZSwgaW4gc2xvdHMsIHRoYXQgZWFjaCBlcG9jaCBzaG91bGQgbGFzdC4ZASBOT1RFOiBDdXJyZW50bHkgaXQgaXMgbm90IHBvc3NpYmxlIHRvIGNoYW5nZSB0aGUgZXBvY2ggZHVyYXRpb24gYWZ0ZXIhASB0aGUgY2hhaW4gaGFzIHN0YXJ0ZWQuIEF0dGVtcHRpbmcgdG8gZG8gc28gd2lsbCBicmljayBibG9jayBwcm9kdWN0aW9uLkRFeHBlY3RlZEJsb2NrVGltZTAgcBcAAAAAAAAUBQEgVGhlIGV4cGVjdGVkIGF2ZXJhZ2UgYmxvY2sgdGltZSBhdCB3aGljaCBCQUJFIHNob3VsZCBiZSBjcmVhdGluZxEBIGJsb2Nrcy4gU2luY2UgQkFCRSBpcyBwcm9iYWJpbGlzdGljIGl0IGlzIG5vdCB0cml2aWFsIHRvIGZpZ3VyZSBvdXQFASB3aGF0IHRoZSBleHBlY3RlZCBhdmVyYWdlIGJsb2NrIHRpbWUgc2hvdWxkIGJlIGJhc2VkIG9uIHRoZSBzbG90CQEgZHVyYXRpb24gYW5kIHRoZSBzZWN1cml0eSBwYXJhbWV0ZXIgYGNgICh3aGVyZSBgMSAtIGNgIHJlcHJlc2VudHOgIHRoZSBwcm9iYWJpbGl0eSBvZiBhIHNsb3QgYmVpbmcgZW1wdHkpLjhNYXhBdXRob3JpdGllcxAQoIYBAASIIE1heCBudW1iZXIgb2YgYXV0aG9yaXRpZXMgYWxsb3dlZDRNYXhOb21pbmF0b3JzEBAAAgAABNQgVGhlIG1heGltdW0gbnVtYmVyIG9mIG5vbWluYXRvcnMgZm9yIGVhY2ggdmFsaWRhdG9yLgGNCAIAJFRpbWVzdGFtcAEkVGltZXN0YW1wCAxOb3cBADAgAAAAAAAAAAAEoCBUaGUgY3VycmVudCB0aW1lIGZvciB0aGUgY3VycmVudCBibG9jay4kRGlkVXBkYXRlAQAgBAAQ2CBXaGV0aGVyIHRoZSB0aW1lc3RhbXAgaGFzIGJlZW4gdXBkYXRlZCBpbiB0aGlzIGJsb2NrLgBVASBUaGlzIHZhbHVlIGlzIHVwZGF0ZWQgdG8gYHRydWVgIHVwb24gc3VjY2Vzc2Z1bCBzdWJtaXNzaW9uIG9mIGEgdGltZXN0YW1wIGJ5IGEgbm9kZS5FASBJdCBpcyB0aGVuIGNoZWNrZWQgYXQgdGhlIGVuZCBvZiBlYWNoIGJsb2NrIGV4ZWN1dGlvbiBpbiB0aGUgYG9uX2ZpbmFsaXplYCBob29rLgG9AQAENE1pbmltdW1QZXJpb2QwILgLAAAAAAAAGIwgVGhlIG1pbmltdW0gcGVyaW9kIGJldHdlZW4gYmxvY2tzLgBNASBCZSBhd2FyZSB0aGF0IHRoaXMgaXMgZGlmZmVyZW50IHRvIHRoZSAqZXhwZWN0ZWQqIHBlcmlvZCB0aGF0IHRoZSBibG9jayBwcm9kdWN0aW9uSQEgYXBwYXJhdHVzIHByb3ZpZGVzLiBZb3VyIGNob3NlbiBjb25zZW5zdXMgc3lzdGVtIHdpbGwgZ2VuZXJhbGx5IHdvcmsgd2l0aCB0aGlzIHRvYQEgZGV0ZXJtaW5lIGEgc2Vuc2libGUgYmxvY2sgdGltZS4gRm9yIGV4YW1wbGUsIGluIHRoZSBBdXJhIHBhbGxldCBpdCB3aWxsIGJlIGRvdWJsZSB0aGlzcCBwZXJpb2Qgb24gZGVmYXVsdCBzZXR0aW5ncy4AAwAcSW5kaWNlcwEcSW5kaWNlcwQgQWNjb3VudHMAAQQCEJEIBAAEiCBUaGUgbG9va3VwIGZyb20gaW5kZXggdG8gYWNjb3VudC4BwQEBlAQcRGVwb3NpdBhAAOh2SBcAAAAAAAAAAAAAAASsIFRoZSBkZXBvc2l0IG5lZWRlZCBmb3IgcmVzZXJ2aW5nIGFuIGluZGV4LgGVCAQAIEJhbGFuY2VzASBCYWxhbmNlcxw0VG90YWxJc3N1YW5jZQEAGEAAAAAAAAAAAAAAAAAAAAAABJggVGhlIHRvdGFsIHVuaXRzIGlzc3VlZCBpbiB0aGUgc3lzdGVtLkBJbmFjdGl2ZUlzc3VhbmNlAQAYQAAAAAAAAAAAAAAAAAAAAAAECQEgVGhlIHRvdGFsIHVuaXRzIG9mIG91dHN0YW5kaW5nIGRlYWN0aXZhdGVkIGJhbGFuY2UgaW4gdGhlIHN5c3RlbS4cQWNjb3VudAEBBAIAFAEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgGAJASBUaGUgQmFsYW5jZXMgcGFsbGV0IGV4YW1wbGUgb2Ygc3RvcmluZyB0aGUgYmFsYW5jZSBvZiBhbiBhY2NvdW50LgAoICMgRXhhbXBsZQA0IGBgYG5vY29tcGlsZbAgIGltcGwgcGFsbGV0X2JhbGFuY2VzOjpDb25maWcgZm9yIFJ1bnRpbWUgexkCICAgIHR5cGUgQWNjb3VudFN0b3JlID0gU3RvcmFnZU1hcFNoaW08U2VsZjo6QWNjb3VudDxSdW50aW1lPiwgZnJhbWVfc3lzdGVtOjpQcm92aWRlcjxSdW50aW1lPiwgQWNjb3VudElkLCBTZWxmOjpBY2NvdW50RGF0YTxCYWxhbmNlPj4MICB9ECBgYGAAFQEgWW91IGNhbiBhbHNvIHN0b3JlIHRoZSBiYWxhbmNlIG9mIGFuIGFjY291bnQgaW4gdGhlIGBTeXN0ZW1gIHBhbGxldC4AKCAjIEV4YW1wbGUANCBgYGBub2NvbXBpbGWwICBpbXBsIHBhbGxldF9iYWxhbmNlczo6Q29uZmlnIGZvciBSdW50aW1lIHt0ICAgdHlwZSBBY2NvdW50U3RvcmUgPSBTeXN0ZW0MICB9ECBgYGAAUQEgQnV0IHRoaXMgY29tZXMgd2l0aCB0cmFkZW9mZnMsIHN0b3JpbmcgYWNjb3VudCBiYWxhbmNlcyBpbiB0aGUgc3lzdGVtIHBhbGxldCBzdG9yZXNtASBgZnJhbWVfc3lzdGVtYCBkYXRhIGFsb25nc2lkZSB0aGUgYWNjb3VudCBkYXRhIGNvbnRyYXJ5IHRvIHN0b3JpbmcgYWNjb3VudCBiYWxhbmNlcyBpbiB0aGUpASBgQmFsYW5jZXNgIHBhbGxldCwgd2hpY2ggdXNlcyBhIGBTdG9yYWdlTWFwYCB0byBzdG9yZSBiYWxhbmNlcyBkYXRhIG9ubHkuQQEgTk9URTogVGhpcyBpcyBvbmx5IHVzZWQgaW4gdGhlIGNhc2UgdGhhdCB0aGlzIHBhbGxldCBpcyB1c2VkIHRvIHN0b3JlIGJhbGFuY2VzLhRMb2NrcwEBBAIAmQgEABC4IEFueSBsaXF1aWRpdHkgbG9ja3Mgb24gc29tZSBhY2NvdW50IGJhbGFuY2VzLiUBIE5PVEU6IFNob3VsZCBvbmx5IGJlIGFjY2Vzc2VkIHdoZW4gc2V0dGluZywgY2hhbmdpbmcgYW5kIGZyZWVpbmcgYSBsb2NrLgCtASBVc2Ugb2YgbG9ja3MgaXMgZGVwcmVjYXRlZCBpbiBmYXZvdXIgb2YgZnJlZXplcy4gU2VlIGBodHRwczovL2dpdGh1Yi5jb20vcGFyaXR5dGVjaC9zdWJzdHJhdGUvcHVsbC8xMjk1MS9gIFJlc2VydmVzAQEEAgCpCAQADKQgTmFtZWQgcmVzZXJ2ZXMgb24gc29tZSBhY2NvdW50IGJhbGFuY2VzLgCxASBVc2Ugb2YgcmVzZXJ2ZXMgaXMgZGVwcmVjYXRlZCBpbiBmYXZvdXIgb2YgaG9sZHMuIFNlZSBgaHR0cHM6Ly9naXRodWIuY29tL3Bhcml0eXRlY2gvc3Vic3RyYXRlL3B1bGwvMTI5NTEvYBRIb2xkcwEBBAIAtQgEAARsIEhvbGRzIG9uIGFjY291bnQgYmFsYW5jZXMuHEZyZWV6ZXMBAQQCAM0IBAAEiCBGcmVlemUgbG9ja3Mgb24gYWNjb3VudCBiYWxhbmNlcy4BzQEBmBBIRXhpc3RlbnRpYWxEZXBvc2l0GEAA5AtUAgAAAAAAAAAAAAAAIEEBIFRoZSBtaW5pbXVtIGFtb3VudCByZXF1aXJlZCB0byBrZWVwIGFuIGFjY291bnQgb3Blbi4gTVVTVCBCRSBHUkVBVEVSIFRIQU4gWkVSTyEAWQEgSWYgeW91ICpyZWFsbHkqIG5lZWQgaXQgdG8gYmUgemVybywgeW91IGNhbiBlbmFibGUgdGhlIGZlYXR1cmUgYGluc2VjdXJlX3plcm9fZWRgIGZvcmEBIHRoaXMgcGFsbGV0LiBIb3dldmVyLCB5b3UgZG8gc28gYXQgeW91ciBvd24gcmlzazogdGhpcyB3aWxsIG9wZW4gdXAgYSBtYWpvciBEb1MgdmVjdG9yLlkBIEluIGNhc2UgeW91IGhhdmUgbXVsdGlwbGUgc291cmNlcyBvZiBwcm92aWRlciByZWZlcmVuY2VzLCB5b3UgbWF5IGFsc28gZ2V0IHVuZXhwZWN0ZWSMIGJlaGF2aW91ciBpZiB5b3Ugc2V0IHRoaXMgdG8gemVyby4A8CBCb3R0b20gbGluZTogRG8geW91cnNlbGYgYSBmYXZvdXIgYW5kIG1ha2UgaXQgYXQgbGVhc3Qgb25lISBNYXhMb2NrcxAQMgAAABD0IFRoZSBtYXhpbXVtIG51bWJlciBvZiBsb2NrcyB0aGF0IHNob3VsZCBleGlzdCBvbiBhbiBhY2NvdW50LtwgTm90IHN0cmljdGx5IGVuZm9yY2VkLCBidXQgdXNlZCBmb3Igd2VpZ2h0IGVzdGltYXRpb24uAK0BIFVzZSBvZiBsb2NrcyBpcyBkZXByZWNhdGVkIGluIGZhdm91ciBvZiBmcmVlemVzLiBTZWUgYGh0dHBzOi8vZ2l0aHViLmNvbS9wYXJpdHl0ZWNoL3N1YnN0cmF0ZS9wdWxsLzEyOTUxL2AsTWF4UmVzZXJ2ZXMQEDIAAAAMDQEgVGhlIG1heGltdW0gbnVtYmVyIG9mIG5hbWVkIHJlc2VydmVzIHRoYXQgY2FuIGV4aXN0IG9uIGFuIGFjY291bnQuALEBIFVzZSBvZiByZXNlcnZlcyBpcyBkZXByZWNhdGVkIGluIGZhdm91ciBvZiBob2xkcy4gU2VlIGBodHRwczovL2dpdGh1Yi5jb20vcGFyaXR5dGVjaC9zdWJzdHJhdGUvcHVsbC8xMjk1MS9gKE1heEZyZWV6ZXMQEAgAAAAEYQEgVGhlIG1heGltdW0gbnVtYmVyIG9mIGluZGl2aWR1YWwgZnJlZXplIGxvY2tzIHRoYXQgY2FuIGV4aXN0IG9uIGFuIGFjY291bnQgYXQgYW55IHRpbWUuAeEIBQBIVHJhbnNhY3Rpb25QYXltZW50AUhUcmFuc2FjdGlvblBheW1lbnQIRE5leHRGZWVNdWx0aXBsaWVyAQDRBkAAAGSns7bgDQAAAAAAAAAAADhTdG9yYWdlVmVyc2lvbgEA5QgEAAAAAaAEYE9wZXJhdGlvbmFsRmVlTXVsdGlwbGllcggEBVRZASBBIGZlZSBtdWx0aXBsaWVyIGZvciBgT3BlcmF0aW9uYWxgIGV4dHJpbnNpY3MgdG8gY29tcHV0ZSAidmlydHVhbCB0aXAiIHRvIGJvb3N0IHRoZWlyLCBgcHJpb3JpdHlgAFEBIFRoaXMgdmFsdWUgaXMgbXVsdGlwbGllZCBieSB0aGUgYGZpbmFsX2ZlZWAgdG8gb2J0YWluIGEgInZpcnR1YWwgdGlwIiB0aGF0IGlzIGxhdGVy9CBhZGRlZCB0byBhIHRpcCBjb21wb25lbnQgaW4gcmVndWxhciBgcHJpb3JpdHlgIGNhbGN1bGF0aW9ucy5NASBJdCBtZWFucyB0aGF0IGEgYE5vcm1hbGAgdHJhbnNhY3Rpb24gY2FuIGZyb250LXJ1biBhIHNpbWlsYXJseS1zaXplZCBgT3BlcmF0aW9uYWxgQQEgZXh0cmluc2ljICh3aXRoIG5vIHRpcCksIGJ5IGluY2x1ZGluZyBhIHRpcCB2YWx1ZSBncmVhdGVyIHRoYW4gdGhlIHZpcnR1YWwgdGlwLgA8IGBgYHJ1c3QsaWdub3JlQCAvLyBGb3IgYE5vcm1hbGCMIGxldCBwcmlvcml0eSA9IHByaW9yaXR5X2NhbGModGlwKTsAVCAvLyBGb3IgYE9wZXJhdGlvbmFsYBEBIGxldCB2aXJ0dWFsX3RpcCA9IChpbmNsdXNpb25fZmVlICsgdGlwKSAqIE9wZXJhdGlvbmFsRmVlTXVsdGlwbGllcjvEIGxldCBwcmlvcml0eSA9IHByaW9yaXR5X2NhbGModGlwICsgdmlydHVhbF90aXApOxAgYGBgAFEBIE5vdGUgdGhhdCBzaW5jZSB3ZSB1c2UgYGZpbmFsX2ZlZWAgdGhlIG11bHRpcGxpZXIgYXBwbGllcyBhbHNvIHRvIHRoZSByZWd1bGFyIGB0aXBgXQEgc2VudCB3aXRoIHRoZSB0cmFuc2FjdGlvbi4gU28sIG5vdCBvbmx5IGRvZXMgdGhlIHRyYW5zYWN0aW9uIGdldCBhIHByaW9yaXR5IGJ1bXAgYmFzZWRhASBvbiB0aGUgYGluY2x1c2lvbl9mZWVgLCBidXQgd2UgYWxzbyBhbXBsaWZ5IHRoZSBpbXBhY3Qgb2YgdGlwcyBhcHBsaWVkIHRvIGBPcGVyYXRpb25hbGA4IHRyYW5zYWN0aW9ucy4AIAAoQXV0aG9yc2hpcAEoQXV0aG9yc2hpcAQYQXV0aG9yAAAABAAEZCBBdXRob3Igb2YgY3VycmVudCBibG9jay4AAAAABgAcU3Rha2luZwEcU3Rha2luZ6w4VmFsaWRhdG9yQ291bnQBABAQAAAAAAScIFRoZSBpZGVhbCBudW1iZXIgb2YgYWN0aXZlIHZhbGlkYXRvcnMuVE1pbmltdW1WYWxpZGF0b3JDb3VudAEAEBAAAAAABEEBIE1pbmltdW0gbnVtYmVyIG9mIHN0YWtpbmcgcGFydGljaXBhbnRzIGJlZm9yZSBlbWVyZ2VuY3kgY29uZGl0aW9ucyBhcmUgaW1wb3NlZC40SW52dWxuZXJhYmxlcwEA0QEEAAxZASBBbnkgdmFsaWRhdG9ycyB0aGF0IG1heSBuZXZlciBiZSBzbGFzaGVkIG9yIGZvcmNpYmx5IGtpY2tlZC4gSXQncyBhIFZlYyBzaW5jZSB0aGV5J3JlTQEgZWFzeSB0byBpbml0aWFsaXplIGFuZCB0aGUgcGVyZm9ybWFuY2UgaGl0IGlzIG1pbmltYWwgKHdlIGV4cGVjdCBubyBtb3JlIHRoYW4gZm91cqwgaW52dWxuZXJhYmxlcykgYW5kIHJlc3RyaWN0ZWQgdG8gdGVzdG5ldHMuGEJvbmRlZAABBAUAAAQADAEBIE1hcCBmcm9tIGFsbCBsb2NrZWQgInN0YXNoIiBhY2NvdW50cyB0byB0aGUgY29udHJvbGxlciBhY2NvdW50LgDQIFRXT1gtTk9URTogU0FGRSBzaW5jZSBgQWNjb3VudElkYCBpcyBhIHNlY3VyZSBoYXNoLkBNaW5Ob21pbmF0b3JCb25kAQAYQAAAAAAAAAAAAAAAAAAAAAAEIQEgVGhlIG1pbmltdW0gYWN0aXZlIGJvbmQgdG8gYmVjb21lIGFuZCBtYWludGFpbiB0aGUgcm9sZSBvZiBhIG5vbWluYXRvci5ATWluVmFsaWRhdG9yQm9uZAEAGEAAAAAAAAAAAAAAAAAAAAAABCEBIFRoZSBtaW5pbXVtIGFjdGl2ZSBib25kIHRvIGJlY29tZSBhbmQgbWFpbnRhaW4gdGhlIHJvbGUgb2YgYSB2YWxpZGF0b3IuSE1pbmltdW1BY3RpdmVTdGFrZQEAGEAAAAAAAAAAAAAAAAAAAAAABBEBIFRoZSBtaW5pbXVtIGFjdGl2ZSBub21pbmF0b3Igc3Rha2Ugb2YgdGhlIGxhc3Qgc3VjY2Vzc2Z1bCBlbGVjdGlvbi40TWluQ29tbWlzc2lvbgEArBAAAAAADOggVGhlIG1pbmltdW0gYW1vdW50IG9mIGNvbW1pc3Npb24gdGhhdCB2YWxpZGF0b3JzIGNhbiBzZXQuAIAgSWYgc2V0IHRvIGAwYCwgbm8gbGltaXQgZXhpc3RzLhhMZWRnZXIAAQQCAOkIBAAQRQEgTWFwIGZyb20gYWxsICh1bmxvY2tlZCkgImNvbnRyb2xsZXIiIGFjY291bnRzIHRvIHRoZSBpbmZvIHJlZ2FyZGluZyB0aGUgc3Rha2luZy4AdQEgTm90ZTogQWxsIHRoZSByZWFkcyBhbmQgbXV0YXRpb25zIHRvIHRoaXMgc3RvcmFnZSAqTVVTVCogYmUgZG9uZSB0aHJvdWdoIHRoZSBtZXRob2RzIGV4cG9zZWToIGJ5IFtgU3Rha2luZ0xlZGdlcmBdIHRvIGVuc3VyZSBkYXRhIGFuZCBsb2NrIGNvbnNpc3RlbmN5LhRQYXllZQABBAUAqAQADOQgV2hlcmUgdGhlIHJld2FyZCBwYXltZW50IHNob3VsZCBiZSBtYWRlLiBLZXllZCBieSBzdGFzaC4A0CBUV09YLU5PVEU6IFNBRkUgc2luY2UgYEFjY291bnRJZGAgaXMgYSBzZWN1cmUgaGFzaC4oVmFsaWRhdG9ycwEBBAUAsAgAAAxFASBUaGUgbWFwIGZyb20gKHdhbm5hYmUpIHZhbGlkYXRvciBzdGFzaCBrZXkgdG8gdGhlIHByZWZlcmVuY2VzIG9mIHRoYXQgdmFsaWRhdG9yLgDQIFRXT1gtTk9URTogU0FGRSBzaW5jZSBgQWNjb3VudElkYCBpcyBhIHNlY3VyZSBoYXNoLlBDb3VudGVyRm9yVmFsaWRhdG9ycwEAEBAAAAAABKxDb3VudGVyIGZvciB0aGUgcmVsYXRlZCBjb3VudGVkIHN0b3JhZ2UgbWFwSE1heFZhbGlkYXRvcnNDb3VudAAAEAQADDEBIFRoZSBtYXhpbXVtIHZhbGlkYXRvciBjb3VudCBiZWZvcmUgd2Ugc3RvcCBhbGxvd2luZyBuZXcgdmFsaWRhdG9ycyB0byBqb2luLgDQIFdoZW4gdGhpcyB2YWx1ZSBpcyBub3Qgc2V0LCBubyBsaW1pdHMgYXJlIGVuZm9yY2VkLihOb21pbmF0b3JzAAEEBQDxCAQATHUBIFRoZSBtYXAgZnJvbSBub21pbmF0b3Igc3Rhc2gga2V5IHRvIHRoZWlyIG5vbWluYXRpb24gcHJlZmVyZW5jZXMsIG5hbWVseSB0aGUgdmFsaWRhdG9ycyB0aGF0WCB0aGV5IHdpc2ggdG8gc3VwcG9ydC4AOQEgTm90ZSB0aGF0IHRoZSBrZXlzIG9mIHRoaXMgc3RvcmFnZSBtYXAgbWlnaHQgYmVjb21lIG5vbi1kZWNvZGFibGUgaW4gY2FzZSB0aGUtASBhY2NvdW50J3MgW2BOb21pbmF0aW9uc1F1b3RhOjpNYXhOb21pbmF0aW9uc2BdIGNvbmZpZ3VyYXRpb24gaXMgZGVjcmVhc2VkLpAgSW4gdGhpcyByYXJlIGNhc2UsIHRoZXNlIG5vbWluYXRvcnNlASBhcmUgc3RpbGwgZXhpc3RlbnQgaW4gc3RvcmFnZSwgdGhlaXIga2V5IGlzIGNvcnJlY3QgYW5kIHJldHJpZXZhYmxlIChpLmUuIGBjb250YWluc19rZXlgcQEgaW5kaWNhdGVzIHRoYXQgdGhleSBleGlzdCksIGJ1dCB0aGVpciB2YWx1ZSBjYW5ub3QgYmUgZGVjb2RlZC4gVGhlcmVmb3JlLCB0aGUgbm9uLWRlY29kYWJsZW0BIG5vbWluYXRvcnMgd2lsbCBlZmZlY3RpdmVseSBub3QtZXhpc3QsIHVudGlsIHRoZXkgcmUtc3VibWl0IHRoZWlyIHByZWZlcmVuY2VzIHN1Y2ggdGhhdCBpdAEBIGlzIHdpdGhpbiB0aGUgYm91bmRzIG9mIHRoZSBuZXdseSBzZXQgYENvbmZpZzo6TWF4Tm9taW5hdGlvbnNgLgBhASBUaGlzIGltcGxpZXMgdGhhdCBgOjppdGVyX2tleXMoKS5jb3VudCgpYCBhbmQgYDo6aXRlcigpLmNvdW50KClgIG1pZ2h0IHJldHVybiBkaWZmZXJlbnRtASB2YWx1ZXMgZm9yIHRoaXMgbWFwLiBNb3Jlb3ZlciwgdGhlIG1haW4gYDo6Y291bnQoKWAgaXMgYWxpZ25lZCB3aXRoIHRoZSBmb3JtZXIsIG5hbWVseSB0aGVsIG51bWJlciBvZiBrZXlzIHRoYXQgZXhpc3QuAG0BIExhc3RseSwgaWYgYW55IG9mIHRoZSBub21pbmF0b3JzIGJlY29tZSBub24tZGVjb2RhYmxlLCB0aGV5IGNhbiBiZSBjaGlsbGVkIGltbWVkaWF0ZWx5IHZpYbggW2BDYWxsOjpjaGlsbF9vdGhlcmBdIGRpc3BhdGNoYWJsZSBieSBhbnlvbmUuANAgVFdPWC1OT1RFOiBTQUZFIHNpbmNlIGBBY2NvdW50SWRgIGlzIGEgc2VjdXJlIGhhc2guUENvdW50ZXJGb3JOb21pbmF0b3JzAQAQEAAAAAAErENvdW50ZXIgZm9yIHRoZSByZWxhdGVkIGNvdW50ZWQgc3RvcmFnZSBtYXA4VmlydHVhbFN0YWtlcnMAAQQFAIwEABjIIFN0YWtlcnMgd2hvc2UgZnVuZHMgYXJlIG1hbmFnZWQgYnkgb3RoZXIgcGFsbGV0cy4AdQEgVGhpcyBwYWxsZXQgZG9lcyBub3QgYXBwbHkgYW55IGxvY2tzIG9uIHRoZW0sIHRoZXJlZm9yZSB0aGV5IGFyZSBvbmx5IHZpcnR1YWxseSBib25kZWQuIFRoZXltASBhcmUgZXhwZWN0ZWQgdG8gYmUga2V5bGVzcyBhY2NvdW50cyBhbmQgaGVuY2Ugc2hvdWxkIG5vdCBiZSBhbGxvd2VkIHRvIG11dGF0ZSB0aGVpciBsZWRnZXJxASBkaXJlY3RseSB2aWEgdGhpcyBwYWxsZXQuIEluc3RlYWQsIHRoZXNlIGFjY291bnRzIGFyZSBtYW5hZ2VkIGJ5IG90aGVyIHBhbGxldHMgYW5kIGFjY2Vzc2VkKQEgdmlhIGxvdyBsZXZlbCBhcGlzLiBXZSBrZWVwIHRyYWNrIG9mIHRoZW0gdG8gZG8gbWluaW1hbCBpbnRlZ3JpdHkgY2hlY2tzLmBDb3VudGVyRm9yVmlydHVhbFN0YWtlcnMBABAQAAAAAASsQ291bnRlciBmb3IgdGhlIHJlbGF0ZWQgY291bnRlZCBzdG9yYWdlIG1hcEhNYXhOb21pbmF0b3JzQ291bnQAABAEAAwxASBUaGUgbWF4aW11bSBub21pbmF0b3IgY291bnQgYmVmb3JlIHdlIHN0b3AgYWxsb3dpbmcgbmV3IHZhbGlkYXRvcnMgdG8gam9pbi4A0CBXaGVuIHRoaXMgdmFsdWUgaXMgbm90IHNldCwgbm8gbGltaXRzIGFyZSBlbmZvcmNlZC4oQ3VycmVudEVyYQAAEAQAEFwgVGhlIGN1cnJlbnQgZXJhIGluZGV4LgBlASBUaGlzIGlzIHRoZSBsYXRlc3QgcGxhbm5lZCBlcmEsIGRlcGVuZGluZyBvbiBob3cgdGhlIFNlc3Npb24gcGFsbGV0IHF1ZXVlcyB0aGUgdmFsaWRhdG9ygCBzZXQsIGl0IG1pZ2h0IGJlIGFjdGl2ZSBvciBub3QuJEFjdGl2ZUVyYQAA+QgEABDYIFRoZSBhY3RpdmUgZXJhIGluZm9ybWF0aW9uLCBpdCBob2xkcyBpbmRleCBhbmQgc3RhcnQuAFkBIFRoZSBhY3RpdmUgZXJhIGlzIHRoZSBlcmEgYmVpbmcgY3VycmVudGx5IHJld2FyZGVkLiBWYWxpZGF0b3Igc2V0IG9mIHRoaXMgZXJhIG11c3QgYmWsIGVxdWFsIHRvIFtgU2Vzc2lvbkludGVyZmFjZTo6dmFsaWRhdG9yc2BdLlRFcmFzU3RhcnRTZXNzaW9uSW5kZXgAAQQFEBAEABBVASBUaGUgc2Vzc2lvbiBpbmRleCBhdCB3aGljaCB0aGUgZXJhIHN0YXJ0IGZvciB0aGUgbGFzdCBbYENvbmZpZzo6SGlzdG9yeURlcHRoYF0gZXJhcy4AYQEgTm90ZTogVGhpcyB0cmFja3MgdGhlIHN0YXJ0aW5nIHNlc3Npb24gKGkuZS4gc2Vzc2lvbiBpbmRleCB3aGVuIGVyYSBzdGFydCBiZWluZyBhY3RpdmUp8CBmb3IgdGhlIGVyYXMgaW4gYFtDdXJyZW50RXJhIC0gSElTVE9SWV9ERVBUSCwgQ3VycmVudEVyYV1gLixFcmFzU3Rha2VycwEBCAUFAQkFCQwAAAAgeCBFeHBvc3VyZSBvZiB2YWxpZGF0b3IgYXQgZXJhLgBhASBUaGlzIGlzIGtleWVkIGZpcnN0IGJ5IHRoZSBlcmEgaW5kZXggdG8gYWxsb3cgYnVsayBkZWxldGlvbiBhbmQgdGhlbiB0aGUgc3Rhc2ggYWNjb3VudC4AzCBJcyBpdCByZW1vdmVkIGFmdGVyIFtgQ29uZmlnOjpIaXN0b3J5RGVwdGhgXSBlcmFzLkEBIElmIHN0YWtlcnMgaGFzbid0IGJlZW4gc2V0IG9yIGhhcyBiZWVuIHJlbW92ZWQgdGhlbiBlbXB0eSBleHBvc3VyZSBpcyByZXR1cm5lZC4AKQEgTm90ZTogRGVwcmVjYXRlZCBzaW5jZSB2MTQuIFVzZSBgRXJhSW5mb2AgaW5zdGVhZCB0byB3b3JrIHdpdGggZXhwb3N1cmVzLkxFcmFzU3Rha2Vyc092ZXJ2aWV3AAEIBQUBCREJBAAwuCBTdW1tYXJ5IG9mIHZhbGlkYXRvciBleHBvc3VyZSBhdCBhIGdpdmVuIGVyYS4AcQEgVGhpcyBjb250YWlucyB0aGUgdG90YWwgc3Rha2UgaW4gc3VwcG9ydCBvZiB0aGUgdmFsaWRhdG9yIGFuZCB0aGVpciBvd24gc3Rha2UuIEluIGFkZGl0aW9uLHUBIGl0IGNhbiBhbHNvIGJlIHVzZWQgdG8gZ2V0IHRoZSBudW1iZXIgb2Ygbm9taW5hdG9ycyBiYWNraW5nIHRoaXMgdmFsaWRhdG9yIGFuZCB0aGUgbnVtYmVyIG9maQEgZXhwb3N1cmUgcGFnZXMgdGhleSBhcmUgZGl2aWRlZCBpbnRvLiBUaGUgcGFnZSBjb3VudCBpcyB1c2VmdWwgdG8gZGV0ZXJtaW5lIHRoZSBudW1iZXIgb2asIHBhZ2VzIG9mIHJld2FyZHMgdGhhdCBuZWVkcyB0byBiZSBjbGFpbWVkLgBhASBUaGlzIGlzIGtleWVkIGZpcnN0IGJ5IHRoZSBlcmEgaW5kZXggdG8gYWxsb3cgYnVsayBkZWxldGlvbiBhbmQgdGhlbiB0aGUgc3Rhc2ggYWNjb3VudC6sIFNob3VsZCBvbmx5IGJlIGFjY2Vzc2VkIHRocm91Z2ggYEVyYUluZm9gLgDMIElzIGl0IHJlbW92ZWQgYWZ0ZXIgW2BDb25maWc6Okhpc3RvcnlEZXB0aGBdIGVyYXMuQQEgSWYgc3Rha2VycyBoYXNuJ3QgYmVlbiBzZXQgb3IgaGFzIGJlZW4gcmVtb3ZlZCB0aGVuIGVtcHR5IG92ZXJ2aWV3IGlzIHJldHVybmVkLkhFcmFzU3Rha2Vyc0NsaXBwZWQBAQgFBQEJBQkMAAAAQJggQ2xpcHBlZCBFeHBvc3VyZSBvZiB2YWxpZGF0b3IgYXQgZXJhLgBlASBOb3RlOiBUaGlzIGlzIGRlcHJlY2F0ZWQsIHNob3VsZCBiZSB1c2VkIGFzIHJlYWQtb25seSBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUuMQEgTmV3IGBFeHBvc3VyZWBzIGFyZSBzdG9yZWQgaW4gYSBwYWdlZCBtYW5uZXIgaW4gYEVyYXNTdGFrZXJzUGFnZWRgIGluc3RlYWQuAFkBIFRoaXMgaXMgc2ltaWxhciB0byBbYEVyYXNTdGFrZXJzYF0gYnV0IG51bWJlciBvZiBub21pbmF0b3JzIGV4cG9zZWQgaXMgcmVkdWNlZCB0byB0aGWoIGBUOjpNYXhFeHBvc3VyZVBhZ2VTaXplYCBiaWdnZXN0IHN0YWtlcnMuHQEgKE5vdGU6IHRoZSBmaWVsZCBgdG90YWxgIGFuZCBgb3duYCBvZiB0aGUgZXhwb3N1cmUgcmVtYWlucyB1bmNoYW5nZWQpLvQgVGhpcyBpcyB1c2VkIHRvIGxpbWl0IHRoZSBpL28gY29zdCBmb3IgdGhlIG5vbWluYXRvciBwYXlvdXQuAF0BIFRoaXMgaXMga2V5ZWQgZmlzdCBieSB0aGUgZXJhIGluZGV4IHRvIGFsbG93IGJ1bGsgZGVsZXRpb24gYW5kIHRoZW4gdGhlIHN0YXNoIGFjY291bnQuAMwgSXQgaXMgcmVtb3ZlZCBhZnRlciBbYENvbmZpZzo6SGlzdG9yeURlcHRoYF0gZXJhcy5BASBJZiBzdGFrZXJzIGhhc24ndCBiZWVuIHNldCBvciBoYXMgYmVlbiByZW1vdmVkIHRoZW4gZW1wdHkgZXhwb3N1cmUgaXMgcmV0dXJuZWQuACkBIE5vdGU6IERlcHJlY2F0ZWQgc2luY2UgdjE0LiBVc2UgYEVyYUluZm9gIGluc3RlYWQgdG8gd29yayB3aXRoIGV4cG9zdXJlcy5ARXJhc1N0YWtlcnNQYWdlZAABDAUFBRUJGQkEABjAIFBhZ2luYXRlZCBleHBvc3VyZSBvZiBhIHZhbGlkYXRvciBhdCBnaXZlbiBlcmEuAHEBIFRoaXMgaXMga2V5ZWQgZmlyc3QgYnkgdGhlIGVyYSBpbmRleCB0byBhbGxvdyBidWxrIGRlbGV0aW9uLCB0aGVuIHN0YXNoIGFjY291bnQgYW5kIGZpbmFsbHnUIHRoZSBwYWdlLiBTaG91bGQgb25seSBiZSBhY2Nlc3NlZCB0aHJvdWdoIGBFcmFJbmZvYC4A1CBUaGlzIGlzIGNsZWFyZWQgYWZ0ZXIgW2BDb25maWc6Okhpc3RvcnlEZXB0aGBdIGVyYXMuOENsYWltZWRSZXdhcmRzAQEIBQUBCeUBBAAY3CBIaXN0b3J5IG9mIGNsYWltZWQgcGFnZWQgcmV3YXJkcyBieSBlcmEgYW5kIHZhbGlkYXRvci4AaQEgVGhpcyBpcyBrZXllZCBieSBlcmEgYW5kIHZhbGlkYXRvciBzdGFzaCB3aGljaCBtYXBzIHRvIHRoZSBzZXQgb2YgcGFnZSBpbmRleGVzIHdoaWNoIGhhdmU4IGJlZW4gY2xhaW1lZC4AzCBJdCBpcyByZW1vdmVkIGFmdGVyIFtgQ29uZmlnOjpIaXN0b3J5RGVwdGhgXSBlcmFzLkhFcmFzVmFsaWRhdG9yUHJlZnMBAQgFBQEJsAgAABQRASBTaW1pbGFyIHRvIGBFcmFzU3Rha2Vyc2AsIHRoaXMgaG9sZHMgdGhlIHByZWZlcmVuY2VzIG9mIHZhbGlkYXRvcnMuAGEBIFRoaXMgaXMga2V5ZWQgZmlyc3QgYnkgdGhlIGVyYSBpbmRleCB0byBhbGxvdyBidWxrIGRlbGV0aW9uIGFuZCB0aGVuIHRoZSBzdGFzaCBhY2NvdW50LgDMIElzIGl0IHJlbW92ZWQgYWZ0ZXIgW2BDb25maWc6Okhpc3RvcnlEZXB0aGBdIGVyYXMuTEVyYXNWYWxpZGF0b3JSZXdhcmQAAQQFEBgEAAwtASBUaGUgdG90YWwgdmFsaWRhdG9yIGVyYSBwYXlvdXQgZm9yIHRoZSBsYXN0IFtgQ29uZmlnOjpIaXN0b3J5RGVwdGhgXSBlcmFzLgAhASBFcmFzIHRoYXQgaGF2ZW4ndCBmaW5pc2hlZCB5ZXQgb3IgaGFzIGJlZW4gcmVtb3ZlZCBkb2Vzbid0IGhhdmUgcmV3YXJkLkBFcmFzUmV3YXJkUG9pbnRzAQEEBRAdCRQAAAAAAAjQIFJld2FyZHMgZm9yIHRoZSBsYXN0IFtgQ29uZmlnOjpIaXN0b3J5RGVwdGhgXSBlcmFzLiUBIElmIHJld2FyZCBoYXNuJ3QgYmVlbiBzZXQgb3IgaGFzIGJlZW4gcmVtb3ZlZCB0aGVuIDAgcmV3YXJkIGlzIHJldHVybmVkLjhFcmFzVG90YWxTdGFrZQEBBAUQGEAAAAAAAAAAAAAAAAAAAAAACBEBIFRoZSB0b3RhbCBhbW91bnQgc3Rha2VkIGZvciB0aGUgbGFzdCBbYENvbmZpZzo6SGlzdG9yeURlcHRoYF0gZXJhcy4dASBJZiB0b3RhbCBoYXNuJ3QgYmVlbiBzZXQgb3IgaGFzIGJlZW4gcmVtb3ZlZCB0aGVuIDAgc3Rha2UgaXMgcmV0dXJuZWQuIEZvcmNlRXJhAQC4BAAEVCBNb2RlIG9mIGVyYSBmb3JjaW5nLkBNYXhTdGFrZWRSZXdhcmRzAADhAQQADBkBIE1heGltdW0gc3Rha2VkIHJld2FyZHMsIGkuZS4gdGhlIHBlcmNlbnRhZ2Ugb2YgdGhlIGVyYSBpbmZsYXRpb24gdGhhdGwgaXMgdXNlZCBmb3Igc3Rha2UgcmV3YXJkcy6sIFNlZSBbRXJhIHBheW91dF0oLi9pbmRleC5odG1sI2VyYS1wYXlvdXQpLkxTbGFzaFJld2FyZEZyYWN0aW9uAQCsEAAAAAAM+CBUaGUgcGVyY2VudGFnZSBvZiB0aGUgc2xhc2ggdGhhdCBpcyBkaXN0cmlidXRlZCB0byByZXBvcnRlcnMuAOQgVGhlIHJlc3Qgb2YgdGhlIHNsYXNoZWQgdmFsdWUgaXMgaGFuZGxlZCBieSB0aGUgYFNsYXNoYC5MQ2FuY2VsZWRTbGFzaFBheW91dAEAGEAAAAAAAAAAAAAAAAAAAAAACBUBIFRoZSBhbW91bnQgb2YgY3VycmVuY3kgZ2l2ZW4gdG8gcmVwb3J0ZXJzIG9mIGEgc2xhc2ggZXZlbnQgd2hpY2ggd2Fz7CBjYW5jZWxlZCBieSBleHRyYW9yZGluYXJ5IGNpcmN1bXN0YW5jZXMgKGUuZy4gZ292ZXJuYW5jZSkuQFVuYXBwbGllZFNsYXNoZXMBAQQFEC0JBAAExCBBbGwgdW5hcHBsaWVkIHNsYXNoZXMgdGhhdCBhcmUgcXVldWVkIGZvciBsYXRlci4oQm9uZGVkRXJhcwEA2QcEABAlASBBIG1hcHBpbmcgZnJvbSBzdGlsbC1ib25kZWQgZXJhcyB0byB0aGUgZmlyc3Qgc2Vzc2lvbiBpbmRleCBvZiB0aGF0IGVyYS4AyCBNdXN0IGNvbnRhaW5zIGluZm9ybWF0aW9uIGZvciBlcmFzIGZvciB0aGUgcmFuZ2U6vCBgW2FjdGl2ZV9lcmEgLSBib3VuZGluZ19kdXJhdGlvbjsgYWN0aXZlX2VyYV1gTFZhbGlkYXRvclNsYXNoSW5FcmEAAQgFBQEJNQkEAAhFASBBbGwgc2xhc2hpbmcgZXZlbnRzIG9uIHZhbGlkYXRvcnMsIG1hcHBlZCBieSBlcmEgdG8gdGhlIGhpZ2hlc3Qgc2xhc2ggcHJvcG9ydGlvbnAgYW5kIHNsYXNoIHZhbHVlIG9mIHRoZSBlcmEuTE5vbWluYXRvclNsYXNoSW5FcmEAAQgFBQEJGAQABGEBIEFsbCBzbGFzaGluZyBldmVudHMgb24gbm9taW5hdG9ycywgbWFwcGVkIGJ5IGVyYSB0byB0aGUgaGlnaGVzdCBzbGFzaCB2YWx1ZSBvZiB0aGUgZXJhLjRTbGFzaGluZ1NwYW5zAAEEBQA5CQQABIwgU2xhc2hpbmcgc3BhbnMgZm9yIHN0YXNoIGFjY291bnRzLiRTcGFuU2xhc2gBAQQFKQk9CYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAg9ASBSZWNvcmRzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBtYXhpbXVtIHNsYXNoIG9mIGEgc3Rhc2ggd2l0aGluIGEgc2xhc2hpbmcgc3Bhbiy4IGFzIHdlbGwgYXMgaG93IG11Y2ggcmV3YXJkIGhhcyBiZWVuIHBhaWQgb3V0LlRDdXJyZW50UGxhbm5lZFNlc3Npb24BABAQAAAAAAzoIFRoZSBsYXN0IHBsYW5uZWQgc2Vzc2lvbiBzY2hlZHVsZWQgYnkgdGhlIHNlc3Npb24gcGFsbGV0LgBxASBUaGlzIGlzIGJhc2ljYWxseSBpbiBzeW5jIHdpdGggdGhlIGNhbGwgdG8gW2BwYWxsZXRfc2Vzc2lvbjo6U2Vzc2lvbk1hbmFnZXI6Om5ld19zZXNzaW9uYF0uSERpc2FibGVkVmFsaWRhdG9ycwEA5QEEABx1ASBJbmRpY2VzIG9mIHZhbGlkYXRvcnMgdGhhdCBoYXZlIG9mZmVuZGVkIGluIHRoZSBhY3RpdmUgZXJhLiBUaGUgb2ZmZW5kZXJzIGFyZSBkaXNhYmxlZCBmb3IgYWkBIHdob2xlIGVyYS4gRm9yIHRoaXMgcmVhc29uIHRoZXkgYXJlIGtlcHQgaGVyZSAtIG9ubHkgc3Rha2luZyBwYWxsZXQga25vd3MgYWJvdXQgZXJhcy4gVGhlVQEgaW1wbGVtZW50b3Igb2YgW2BEaXNhYmxpbmdTdHJhdGVneWBdIGRlZmluZXMgaWYgYSB2YWxpZGF0b3Igc2hvdWxkIGJlIGRpc2FibGVkIHdoaWNobQEgaW1wbGljaXRseSBtZWFucyB0aGF0IHRoZSBpbXBsZW1lbnRvciBhbHNvIGNvbnRyb2xzIHRoZSBtYXggbnVtYmVyIG9mIGRpc2FibGVkIHZhbGlkYXRvcnMuAG0BIFRoZSB2ZWMgaXMgYWx3YXlzIGtlcHQgc29ydGVkIHNvIHRoYXQgd2UgY2FuIGZpbmQgd2hldGhlciBhIGdpdmVuIHZhbGlkYXRvciBoYXMgcHJldmlvdXNseXggb2ZmZW5kZWQgdXNpbmcgYmluYXJ5IHNlYXJjaC44Q2hpbGxUaHJlc2hvbGQAAOEBBAAMUQEgVGhlIHRocmVzaG9sZCBmb3Igd2hlbiB1c2VycyBjYW4gc3RhcnQgY2FsbGluZyBgY2hpbGxfb3RoZXJgIGZvciBvdGhlciB2YWxpZGF0b3JzIC9ZASBub21pbmF0b3JzLiBUaGUgdGhyZXNob2xkIGlzIGNvbXBhcmVkIHRvIHRoZSBhY3R1YWwgbnVtYmVyIG9mIHZhbGlkYXRvcnMgLyBub21pbmF0b3JzKQEgKGBDb3VudEZvcipgKSBpbiB0aGUgc3lzdGVtIGNvbXBhcmVkIHRvIHRoZSBjb25maWd1cmVkIG1heCAoYE1heCpDb3VudGApLgHZAQGkGDBIaXN0b3J5RGVwdGgQEFQAAABQjCBOdW1iZXIgb2YgZXJhcyB0byBrZWVwIGluIGhpc3RvcnkuAOggRm9sbG93aW5nIGluZm9ybWF0aW9uIGlzIGtlcHQgZm9yIGVyYXMgaW4gYFtjdXJyZW50X2VyYSAtCQEgSGlzdG9yeURlcHRoLCBjdXJyZW50X2VyYV1gOiBgRXJhc1N0YWtlcnNgLCBgRXJhc1N0YWtlcnNDbGlwcGVkYCwFASBgRXJhc1ZhbGlkYXRvclByZWZzYCwgYEVyYXNWYWxpZGF0b3JSZXdhcmRgLCBgRXJhc1Jld2FyZFBvaW50c2AsRQEgYEVyYXNUb3RhbFN0YWtlYCwgYEVyYXNTdGFydFNlc3Npb25JbmRleGAsIGBDbGFpbWVkUmV3YXJkc2AsIGBFcmFzU3Rha2Vyc1BhZ2VkYCxcIGBFcmFzU3Rha2Vyc092ZXJ2aWV3YC4A5CBNdXN0IGJlIG1vcmUgdGhhbiB0aGUgbnVtYmVyIG9mIGVyYXMgZGVsYXllZCBieSBzZXNzaW9uLvggSS5lLiBhY3RpdmUgZXJhIG11c3QgYWx3YXlzIGJlIGluIGhpc3RvcnkuIEkuZS4gYGFjdGl2ZV9lcmEgPsQgY3VycmVudF9lcmEgLSBoaXN0b3J5X2RlcHRoYCBtdXN0IGJlIGd1YXJhbnRlZWQuABEBIElmIG1pZ3JhdGluZyBhbiBleGlzdGluZyBwYWxsZXQgZnJvbSBzdG9yYWdlIHZhbHVlIHRvIGNvbmZpZyB2YWx1ZSzsIHRoaXMgc2hvdWxkIGJlIHNldCB0byBzYW1lIHZhbHVlIG9yIGdyZWF0ZXIgYXMgaW4gc3RvcmFnZS4AFQEgTm90ZTogYEhpc3RvcnlEZXB0aGAgaXMgdXNlZCBhcyB0aGUgdXBwZXIgYm91bmQgZm9yIHRoZSBgQm91bmRlZFZlY2AtASBpdGVtIGBTdGFraW5nTGVkZ2VyLmxlZ2FjeV9jbGFpbWVkX3Jld2FyZHNgLiBTZXR0aW5nIHRoaXMgdmFsdWUgbG93ZXIgdGhhbtggdGhlIGV4aXN0aW5nIHZhbHVlIGNhbiBsZWFkIHRvIGluY29uc2lzdGVuY2llcyBpbiB0aGUVASBgU3Rha2luZ0xlZGdlcmAgYW5kIHdpbGwgbmVlZCB0byBiZSBoYW5kbGVkIHByb3Blcmx5IGluIGEgbWlncmF0aW9uLvAgVGhlIHRlc3QgYHJlZHVjaW5nX2hpc3RvcnlfZGVwdGhfYWJydXB0YCBzaG93cyB0aGlzIGVmZmVjdC44U2Vzc2lvbnNQZXJFcmEQEAYAAAAEcCBOdW1iZXIgb2Ygc2Vzc2lvbnMgcGVyIGVyYS48Qm9uZGluZ0R1cmF0aW9uEBAcAAAABOQgTnVtYmVyIG9mIGVyYXMgdGhhdCBzdGFrZWQgZnVuZHMgbXVzdCByZW1haW4gYm9uZGVkIGZvci5IU2xhc2hEZWZlckR1cmF0aW9uEBAbAAAAEAEBIE51bWJlciBvZiBlcmFzIHRoYXQgc2xhc2hlcyBhcmUgZGVmZXJyZWQgYnksIGFmdGVyIGNvbXB1dGF0aW9uLgANASBUaGlzIHNob3VsZCBiZSBsZXNzIHRoYW4gdGhlIGJvbmRpbmcgZHVyYXRpb24uIFNldCB0byAwIGlmIHNsYXNoZXMVASBzaG91bGQgYmUgYXBwbGllZCBpbW1lZGlhdGVseSwgd2l0aG91dCBvcHBvcnR1bml0eSBmb3IgaW50ZXJ2ZW50aW9uLkxNYXhFeHBvc3VyZVBhZ2VTaXplEBAAAgAALLAgVGhlIG1heGltdW0gc2l6ZSBvZiBlYWNoIGBUOjpFeHBvc3VyZVBhZ2VgLgApASBBbiBgRXhwb3N1cmVQYWdlYCBpcyB3ZWFrbHkgYm91bmRlZCB0byBhIG1heGltdW0gb2YgYE1heEV4cG9zdXJlUGFnZVNpemVgMCBub21pbmF0b3JzLgAhASBGb3Igb2xkZXIgbm9uLXBhZ2VkIGV4cG9zdXJlLCBhIHJld2FyZCBwYXlvdXQgd2FzIHJlc3RyaWN0ZWQgdG8gdGhlIHRvcCEBIGBNYXhFeHBvc3VyZVBhZ2VTaXplYCBub21pbmF0b3JzLiBUaGlzIGlzIHRvIGxpbWl0IHRoZSBpL28gY29zdCBmb3IgdGhlSCBub21pbmF0b3IgcGF5b3V0LgBZASBOb3RlOiBgTWF4RXhwb3N1cmVQYWdlU2l6ZWAgaXMgdXNlZCB0byBib3VuZCBgQ2xhaW1lZFJld2FyZHNgIGFuZCBpcyB1bnNhZmUgdG8gcmVkdWNlkCB3aXRob3V0IGhhbmRsaW5nIGl0IGluIGEgbWlncmF0aW9uLkhNYXhVbmxvY2tpbmdDaHVua3MQECAAAAAoBQEgVGhlIG1heGltdW0gbnVtYmVyIG9mIGB1bmxvY2tpbmdgIGNodW5rcyBhIFtgU3Rha2luZ0xlZGdlcmBdIGNhbgkBIGhhdmUuIEVmZmVjdGl2ZWx5IGRldGVybWluZXMgaG93IG1hbnkgdW5pcXVlIGVyYXMgYSBzdGFrZXIgbWF5IGJlOCB1bmJvbmRpbmcgaW4uAPggTm90ZTogYE1heFVubG9ja2luZ0NodW5rc2AgaXMgdXNlZCBhcyB0aGUgdXBwZXIgYm91bmQgZm9yIHRoZQEBIGBCb3VuZGVkVmVjYCBpdGVtIGBTdGFraW5nTGVkZ2VyLnVubG9ja2luZ2AuIFNldHRpbmcgdGhpcyB2YWx1ZQUBIGxvd2VyIHRoYW4gdGhlIGV4aXN0aW5nIHZhbHVlIGNhbiBsZWFkIHRvIGluY29uc2lzdGVuY2llcyBpbiB0aGUJASBgU3Rha2luZ0xlZGdlcmAgYW5kIHdpbGwgbmVlZCB0byBiZSBoYW5kbGVkIHByb3Blcmx5IGluIGEgcnVudGltZQUBIG1pZ3JhdGlvbi4gVGhlIHRlc3QgYHJlZHVjaW5nX21heF91bmxvY2tpbmdfY2h1bmtzX2FicnVwdGAgc2hvd3M0IHRoaXMgZWZmZWN0LgFBCQcAIE9mZmVuY2VzASBPZmZlbmNlcwgcUmVwb3J0cwABBAU0RQkEAARJASBUaGUgcHJpbWFyeSBzdHJ1Y3R1cmUgdGhhdCBob2xkcyBhbGwgb2ZmZW5jZSByZWNvcmRzIGtleWVkIGJ5IHJlcG9ydCBpZGVudGlmaWVycy5YQ29uY3VycmVudFJlcG9ydHNJbmRleAEBCAUFTQmVAQQABCkBIEEgdmVjdG9yIG9mIHJlcG9ydHMgb2YgdGhlIHNhbWUga2luZCB0aGF0IGhhcHBlbmVkIGF0IHRoZSBzYW1lIHRpbWUgc2xvdC4AAbwAAAgAKEhpc3RvcmljYWwBKEhpc3RvcmljYWwISEhpc3RvcmljYWxTZXNzaW9ucwABBAUQRQgEAARdASBNYXBwaW5nIGZyb20gaGlzdG9yaWNhbCBzZXNzaW9uIGluZGljZXMgdG8gc2Vzc2lvbi1kYXRhIHJvb3QgaGFzaCBhbmQgdmFsaWRhdG9yIGNvdW50LixTdG9yZWRSYW5nZQAAgAQABOQgVGhlIHJhbmdlIG9mIGhpc3RvcmljYWwgc2Vzc2lvbnMgd2Ugc3RvcmUuIFtmaXJzdCwgbGFzdCkAAAAAIQAcU2Vzc2lvbgEcU2Vzc2lvbhwoVmFsaWRhdG9ycwEA0QEEAAR8IFRoZSBjdXJyZW50IHNldCBvZiB2YWxpZGF0b3JzLjBDdXJyZW50SW5kZXgBABAQAAAAAAR4IEN1cnJlbnQgaW5kZXggb2YgdGhlIHNlc3Npb24uNFF1ZXVlZENoYW5nZWQBACAEAAg5ASBUcnVlIGlmIHRoZSB1bmRlcmx5aW5nIGVjb25vbWljIGlkZW50aXRpZXMgb3Igd2VpZ2h0aW5nIGJlaGluZCB0aGUgdmFsaWRhdG9yc6QgaGFzIGNoYW5nZWQgaW4gdGhlIHF1ZXVlZCB2YWxpZGF0b3Igc2V0LihRdWV1ZWRLZXlzAQBRCQQACD0BIFRoZSBxdWV1ZWQga2V5cyBmb3IgdGhlIG5leHQgc2Vzc2lvbi4gV2hlbiB0aGUgbmV4dCBzZXNzaW9uIGJlZ2lucywgdGhlc2Uga2V5c+Agd2lsbCBiZSB1c2VkIHRvIGRldGVybWluZSB0aGUgdmFsaWRhdG9yJ3Mgc2Vzc2lvbiBrZXlzLkhEaXNhYmxlZFZhbGlkYXRvcnMBAOUBBAAUgCBJbmRpY2VzIG9mIGRpc2FibGVkIHZhbGlkYXRvcnMuAD0BIFRoZSB2ZWMgaXMgYWx3YXlzIGtlcHQgc29ydGVkIHNvIHRoYXQgd2UgY2FuIGZpbmQgd2hldGhlciBhIGdpdmVuIHZhbGlkYXRvciBpcz0BIGRpc2FibGVkIHVzaW5nIGJpbmFyeSBzZWFyY2guIEl0IGdldHMgY2xlYXJlZCB3aGVuIGBvbl9zZXNzaW9uX2VuZGluZ2AgcmV0dXJuc2QgYSBuZXcgc2V0IG9mIGlkZW50aXRpZXMuIE5leHRLZXlzAAEEBQAZAgQABJwgVGhlIG5leHQgc2Vzc2lvbiBrZXlzIGZvciBhIHZhbGlkYXRvci4gS2V5T3duZXIAAQQFWQkABAAECQEgVGhlIG93bmVyIG9mIGEga2V5LiBUaGUga2V5IGlzIHRoZSBgS2V5VHlwZUlkYCArIHRoZSBlbmNvZGVkIGtleS4BFQIBxAABYQkJABxHcmFuZHBhARxHcmFuZHBhHBRTdGF0ZQEAZQkEAASQIFN0YXRlIG9mIHRoZSBjdXJyZW50IGF1dGhvcml0eSBzZXQuNFBlbmRpbmdDaGFuZ2UAAGkJBAAExCBQZW5kaW5nIGNoYW5nZTogKHNpZ25hbGVkIGF0LCBzY2hlZHVsZWQgY2hhbmdlKS4oTmV4dEZvcmNlZAAAEAQABLwgbmV4dCBibG9jayBudW1iZXIgd2hlcmUgd2UgY2FuIGZvcmNlIGEgY2hhbmdlLhxTdGFsbGVkAACABAAEkCBgdHJ1ZWAgaWYgd2UgYXJlIGN1cnJlbnRseSBzdGFsbGVkLjBDdXJyZW50U2V0SWQBADAgAAAAAAAAAAAIXQEgVGhlIG51bWJlciBvZiBjaGFuZ2VzIChib3RoIGluIHRlcm1zIG9mIGtleXMgYW5kIHVuZGVybHlpbmcgZWNvbm9taWMgcmVzcG9uc2liaWxpdGllcynEIGluIHRoZSAic2V0IiBvZiBHcmFuZHBhIHZhbGlkYXRvcnMgZnJvbSBnZW5lc2lzLjBTZXRJZFNlc3Npb24AAQQFMBAEAChZASBBIG1hcHBpbmcgZnJvbSBncmFuZHBhIHNldCBJRCB0byB0aGUgaW5kZXggb2YgdGhlICptb3N0IHJlY2VudCogc2Vzc2lvbiBmb3Igd2hpY2ggaXRzaCBtZW1iZXJzIHdlcmUgcmVzcG9uc2libGUuAEUBIFRoaXMgaXMgb25seSB1c2VkIGZvciB2YWxpZGF0aW5nIGVxdWl2b2NhdGlvbiBwcm9vZnMuIEFuIGVxdWl2b2NhdGlvbiBwcm9vZiBtdXN0TQEgY29udGFpbnMgYSBrZXktb3duZXJzaGlwIHByb29mIGZvciBhIGdpdmVuIHNlc3Npb24sIHRoZXJlZm9yZSB3ZSBuZWVkIGEgd2F5IHRvIHRpZUUBIHRvZ2V0aGVyIHNlc3Npb25zIGFuZCBHUkFORFBBIHNldCBpZHMsIGkuZS4gd2UgbmVlZCB0byB2YWxpZGF0ZSB0aGF0IGEgdmFsaWRhdG9yQQEgd2FzIHRoZSBvd25lciBvZiBhIGdpdmVuIGtleSBvbiBhIGdpdmVuIHNlc3Npb24sIGFuZCB3aGF0IHRoZSBhY3RpdmUgc2V0IElEIHdhc1QgZHVyaW5nIHRoYXQgc2Vzc2lvbi4AuCBUV09YLU5PVEU6IGBTZXRJZGAgaXMgbm90IHVuZGVyIHVzZXIgY29udHJvbC4sQXV0aG9yaXRpZXMBAG0JBAAEhCBUaGUgY3VycmVudCBsaXN0IG9mIGF1dGhvcml0aWVzLgExAgHIDDhNYXhBdXRob3JpdGllcxAQoIYBAARcIE1heCBBdXRob3JpdGllcyBpbiB1c2U0TWF4Tm9taW5hdG9ycxAQAAIAAATUIFRoZSBtYXhpbXVtIG51bWJlciBvZiBub21pbmF0b3JzIGZvciBlYWNoIHZhbGlkYXRvci5YTWF4U2V0SWRTZXNzaW9uRW50cmllczAgqAAAAAAAAAAYOQEgVGhlIG1heGltdW0gbnVtYmVyIG9mIGVudHJpZXMgdG8ga2VlcCBpbiB0aGUgc2V0IGlkIHRvIHNlc3Npb24gaW5kZXggbWFwcGluZy4AMQEgU2luY2UgdGhlIGBTZXRJZFNlc3Npb25gIG1hcCBpcyBvbmx5IHVzZWQgZm9yIHZhbGlkYXRpbmcgZXF1aXZvY2F0aW9ucyB0aGlzKQEgdmFsdWUgc2hvdWxkIHJlbGF0ZSB0byB0aGUgYm9uZGluZyBkdXJhdGlvbiBvZiB3aGF0ZXZlciBzdGFraW5nIHN5c3RlbSBpczUBIGJlaW5nIHVzZWQgKGlmIGFueSkuIElmIGVxdWl2b2NhdGlvbiBoYW5kbGluZyBpcyBub3QgZW5hYmxlZCB0aGVuIHRoaXMgdmFsdWU0IGNhbiBiZSB6ZXJvLgFxCQsASEF1dGhvcml0eURpc2NvdmVyeQFIQXV0aG9yaXR5RGlzY292ZXJ5CBBLZXlzAQB1CQQABIwgS2V5cyBvZiB0aGUgY3VycmVudCBhdXRob3JpdHkgc2V0LiBOZXh0S2V5cwEAdQkEAASAIEtleXMgb2YgdGhlIG5leHQgYXV0aG9yaXR5IHNldC4AAAAADQAgVHJlYXN1cnkBIFRyZWFzdXJ5GDRQcm9wb3NhbENvdW50AQAQEAAAAAAEpCBOdW1iZXIgb2YgcHJvcG9zYWxzIHRoYXQgaGF2ZSBiZWVuIG1hZGUuJFByb3Bvc2FscwABBAUQfQkEAAR8IFByb3Bvc2FscyB0aGF0IGhhdmUgYmVlbiBtYWRlLixEZWFjdGl2YXRlZAEAGEAAAAAAAAAAAAAAAAAAAAAABPAgVGhlIGFtb3VudCB3aGljaCBoYXMgYmVlbiByZXBvcnRlZCBhcyBpbmFjdGl2ZSB0byBDdXJyZW5jeS4kQXBwcm92YWxzAQCBCQQABPggUHJvcG9zYWwgaW5kaWNlcyB0aGF0IGhhdmUgYmVlbiBhcHByb3ZlZCBidXQgbm90IHlldCBhd2FyZGVkLihTcGVuZENvdW50AQAQEAAAAAAEpCBUaGUgY291bnQgb2Ygc3BlbmRzIHRoYXQgaGF2ZSBiZWVuIG1hZGUuGFNwZW5kcwABBAUQhQkEAATQIFNwZW5kcyB0aGF0IGhhdmUgYmVlbiBhcHByb3ZlZCBhbmQgYmVpbmcgcHJvY2Vzc2VkLgFdAgHYFCxTcGVuZFBlcmlvZBAQAEYFAASIIFBlcmlvZCBiZXR3ZWVuIHN1Y2Nlc3NpdmUgc3BlbmRzLhBCdXJujQkQECcAAAQRASBQZXJjZW50YWdlIG9mIHNwYXJlIGZ1bmRzIChpZiBhbnkpIHRoYXQgYXJlIGJ1cm50IHBlciBzcGVuZCBwZXJpb2QuIFBhbGxldElkkQkgcHkvdHJzcnkEGQEgVGhlIHRyZWFzdXJ5J3MgcGFsbGV0IGlkLCB1c2VkIGZvciBkZXJpdmluZyBpdHMgc292ZXJlaWduIGFjY291bnQgSUQuME1heEFwcHJvdmFscxAQZAAAAAwVASBUaGUgbWF4aW11bSBudW1iZXIgb2YgYXBwcm92YWxzIHRoYXQgY2FuIHdhaXQgaW4gdGhlIHNwZW5kaW5nIHF1ZXVlLgBNASBOT1RFOiBUaGlzIHBhcmFtZXRlciBpcyBhbHNvIHVzZWQgd2l0aGluIHRoZSBCb3VudGllcyBQYWxsZXQgZXh0ZW5zaW9uIGlmIGVuYWJsZWQuMFBheW91dFBlcmlvZBAQgJcGAAQZASBUaGUgcGVyaW9kIGR1cmluZyB3aGljaCBhbiBhcHByb3ZlZCB0cmVhc3VyeSBzcGVuZCBoYXMgdG8gYmUgY2xhaW1lZC4BlQkTAEBDb252aWN0aW9uVm90aW5nAUBDb252aWN0aW9uVm90aW5nCCRWb3RpbmdGb3IBAQgFBZkJnQnYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACHUBIEFsbCB2b3RpbmcgZm9yIGEgcGFydGljdWxhciB2b3RlciBpbiBhIHBhcnRpY3VsYXIgdm90aW5nIGNsYXNzLiBXZSBzdG9yZSB0aGUgYmFsYW5jZSBmb3IgdGhlnCBudW1iZXIgb2Ygdm90ZXMgdGhhdCB3ZSBoYXZlIHJlY29yZGVkLjRDbGFzc0xvY2tzRm9yAQEEBQC9CQQADGkBIFRoZSB2b3RpbmcgY2xhc3NlcyB3aGljaCBoYXZlIGEgbm9uLXplcm8gbG9jayByZXF1aXJlbWVudCBhbmQgdGhlIGxvY2sgYW1vdW50cyB3aGljaCB0aGV5bQEgcmVxdWlyZS4gVGhlIGFjdHVhbCBhbW91bnQgbG9ja2VkIG9uIGJlaGFsZiBvZiB0aGlzIHBhbGxldCBzaG91bGQgYWx3YXlzIGJlIHRoZSBtYXhpbXVtIG9mLCB0aGlzIGxpc3QuAWUCAWUBCCBNYXhWb3RlcxAQAAIAABDwIFRoZSBtYXhpbXVtIG51bWJlciBvZiBjb25jdXJyZW50IHZvdGVzIGFuIGFjY291bnQgbWF5IGhhdmUuAFUBIEFsc28gdXNlZCB0byBjb21wdXRlIHdlaWdodCwgYW4gb3Zlcmx5IGxhcmdlIHZhbHVlIGNhbiBsZWFkIHRvIGV4dHJpbnNpY3Mgd2l0aCBsYXJnZcAgd2VpZ2h0IGVzdGltYXRpb246IHNlZSBgZGVsZWdhdGVgIGZvciBpbnN0YW5jZS5EVm90ZUxvY2tpbmdQZXJpb2QQEMCJAQAQkCBUaGUgbWluaW11bSBwZXJpb2Qgb2Ygdm90ZSBsb2NraW5nLgBlASBJdCBzaG91bGQgYmUgbm8gc2hvcnRlciB0aGFuIGVuYWN0bWVudCBwZXJpb2QgdG8gZW5zdXJlIHRoYXQgaW4gdGhlIGNhc2Ugb2YgYW4gYXBwcm92YWwsSQEgdGhvc2Ugc3VjY2Vzc2Z1bCB2b3RlcnMgYXJlIGxvY2tlZCBpbnRvIHRoZSBjb25zZXF1ZW5jZXMgdGhhdCB0aGVpciB2b3RlcyBlbnRhaWwuAckJFAAkUmVmZXJlbmRhASRSZWZlcmVuZGEUPFJlZmVyZW5kdW1Db3VudAEAEBAAAAAABDEBIFRoZSBuZXh0IGZyZWUgcmVmZXJlbmR1bSBpbmRleCwgYWthIHRoZSBudW1iZXIgb2YgcmVmZXJlbmRhIHN0YXJ0ZWQgc28gZmFyLkRSZWZlcmVuZHVtSW5mb0ZvcgABBAIQzQkEAAS0IEluZm9ybWF0aW9uIGNvbmNlcm5pbmcgYW55IGdpdmVuIHJlZmVyZW5kdW0uKFRyYWNrUXVldWUBAQQFbQHtCQQAEF0BIFRoZSBzb3J0ZWQgbGlzdCBvZiByZWZlcmVuZGEgcmVhZHkgdG8gYmUgZGVjaWRlZCBidXQgbm90IHlldCBiZWluZyBkZWNpZGVkLCBvcmRlcmVkIGJ5fCBjb252aWN0aW9uLXdlaWdodGVkIGFwcHJvdmFscy4AQQEgVGhpcyBzaG91bGQgYmUgZW1wdHkgaWYgYERlY2lkaW5nQ291bnRgIGlzIGxlc3MgdGhhbiBgVHJhY2tJbmZvOjptYXhfZGVjaWRpbmdgLjREZWNpZGluZ0NvdW50AQEEBW0BEBAAAAAABMQgVGhlIG51bWJlciBvZiByZWZlcmVuZGEgYmVpbmcgZGVjaWRlZCBjdXJyZW50bHkuKE1ldGFkYXRhT2YAAQQCEDQEABgFASBUaGUgbWV0YWRhdGEgaXMgYSBnZW5lcmFsIGluZm9ybWF0aW9uIGNvbmNlcm5pbmcgdGhlIHJlZmVyZW5kdW0uSQEgVGhlIGBIYXNoYCByZWZlcnMgdG8gdGhlIHByZWltYWdlIG9mIHRoZSBgUHJlaW1hZ2VzYCBwcm92aWRlciB3aGljaCBjYW4gYmUgYSBKU09OiCBkdW1wIG9yIElQRlMgaGFzaCBvZiBhIEpTT04gZmlsZS4AdQEgQ29uc2lkZXIgYSBnYXJiYWdlIGNvbGxlY3Rpb24gZm9yIGEgbWV0YWRhdGEgb2YgZmluaXNoZWQgcmVmZXJlbmR1bXMgdG8gYHVucmVxdWVzdGAgKHJlbW92ZSlEIGxhcmdlIHByZWltYWdlcy4BeQIBaQEURFN1Ym1pc3Npb25EZXBvc2l0GEAA5AtUAgAAAAAAAAAAAAAABDUBIFRoZSBtaW5pbXVtIGFtb3VudCB0byBiZSB1c2VkIGFzIGEgZGVwb3NpdCBmb3IgYSBwdWJsaWMgcmVmZXJlbmR1bSBwcm9wb3NhbC4kTWF4UXVldWVkEBBkAAAABOQgTWF4aW11bSBzaXplIG9mIHRoZSByZWZlcmVuZHVtIHF1ZXVlIGZvciBhIHNpbmdsZSB0cmFjay5EVW5kZWNpZGluZ1RpbWVvdXQQEIATAwAIVQEgVGhlIG51bWJlciBvZiBibG9ja3MgYWZ0ZXIgc3VibWlzc2lvbiB0aGF0IGEgcmVmZXJlbmR1bSBtdXN0IGJlZ2luIGJlaW5nIGRlY2lkZWQgYnku5CBPbmNlIHRoaXMgcGFzc2VzLCB0aGVuIGFueW9uZSBtYXkgY2FuY2VsIHRoZSByZWZlcmVuZHVtLjRBbGFybUludGVydmFsEBABAAAADF0BIFF1YW50aXphdGlvbiBsZXZlbCBmb3IgdGhlIHJlZmVyZW5kdW0gd2FrZXVwIHNjaGVkdWxlci4gQSBoaWdoZXIgbnVtYmVyIHdpbGwgcmVzdWx0IGluXQEgZmV3ZXIgc3RvcmFnZSByZWFkcy93cml0ZXMgbmVlZGVkIGZvciBzbWFs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BAAETCBTdG9yZWQgcGFyYW1ldGVycy4BpQIBJQcAABsAGENsYWltcwEYQ2xhaW1zFBhDbGFpbXMAAQQG3QIYBAAAFFRvdGFsAQAYQAAAAAAAAAAAAAAAAAAAAAAAHFZlc3RpbmcAAQQG3QLlAgQAEHggVmVzdGluZyBzY2hlZHVsZSBmb3IgYSBjbGFpbS4NASBGaXJzdCBiYWxhbmNlIGlzIHRoZSB0b3RhbCBhbW91bnQgdGhhdCBzaG91bGQgYmUgaGVsZCBmb3IgdmVzdGluZy7kIFNlY29uZCBiYWxhbmNlIGlzIGhvdyBtdWNoIHNob3VsZCBiZSB1bmxvY2tlZCBwZXIgYmxvY2suzCBUaGUgYmxvY2sgbnVtYmVyIGlzIHdoZW4gdGhlIHZlc3Rpbmcgc2hvdWxkIHN0YXJ0LhxTaWduaW5nAAEEBt0C7QIEAATAIFRoZSBzdGF0ZW1lbnQga2luZCB0aGF0IG11c3QgYmUgc2lnbmVkLCBpZiBhbnkuJFByZWNsYWltcwABBAYA3QIEAAQtASBQcmUtY2xhaW1lZCBFdGhlcmV1bSBhY2NvdW50cywgYnkgdGhlIEFjY291bnQgSUQgdGhhdCB0aGV5IGFyZSBjbGFpbWVkIHRvLgHRAgE9BwQYUHJlZml4OHx4UGF5IFBBU3MgdG8gdGhlIFBhc2VvIGFjY291bnQ6AAEZChgAHFZlc3RpbmcBHFZlc3RpbmcIHFZlc3RpbmcAAQQCAB0KBAAE2CBJbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhlIHZlc3Rpbmcgb2YgYSBnaXZlbiBhY2NvdW50LjhTdG9yYWdlVmVyc2lvbgEAJQoEAAx8IFN0b3JhZ2UgdmVyc2lvbiBvZiB0aGUgcGFsbGV0LgAxASBOZXcgbmV0d29ya3Mgc3RhcnQgd2l0aCBsYXRlc3QgdmVyc2lvbiwgYXMgZGV0ZXJtaW5lZCBieSB0aGUgZ2VuZXNpcyBidWlsZC4B8QIBQQcIRE1pblZlc3RlZFRyYW5zZmVyGEAA5AtUAgAAAAAAAAAAAAAABOggVGhlIG1pbmltdW0gYW1vdW50IHRyYW5zZmVycmVkIHRvIGNhbGwgYHZlc3RlZF90cmFuc2ZlcmAuTE1heFZlc3RpbmdTY2hlZHVsZXMQEBwAAAAAASkKGQAcVXRpbGl0eQAB+QIBRQcETGJhdGNoZWRfY2FsbHNfbGltaXQQEKoqAAAEqCBUaGUgbGltaXQgb24gdGhlIG51bWJlciBvZiBiYXRjaGVkIGNhbGxzLgEtChoAFFByb3h5ARRQcm94eQgcUHJveGllcwEBBAUAMQpEAAAAAAAAAAAAAAAAAAAAAAAIRQEgVGhlIHNldCBvZiBhY2NvdW50IHByb3hpZXMuIE1hcHMgdGhlIGFjY291bnQgd2hpY2ggaGFzIGRlbGVnYXRlZCB0byB0aGUgYWNjb3VudHMhASB3aGljaCBhcmUgYmVpbmcgZGVsZWdhdGVkIHRvLCB0b2dldGhlciB3aXRoIHRoZSBhbW91bnQgaGVsZCBvbiBkZXBvc2l0LjRBbm5vdW5jZW1lbnRzAQEEBQBBCkQAAAAAAAAAAAAAAAAAAAAAAASsIFRoZSBhbm5vdW5jZW1lbnRzIG1hZGUgYnkgdGhlIHByb3h5IChrZXkpLgEBAwFJBxhAUHJveHlEZXBvc2l0QmFzZRhAAISylS4AAAAAAAAAAAAAABARASBUaGUgYmFzZSBhbW91bnQgb2YgY3VycmVuY3kgbmVlZGVkIHRvIHJlc2VydmUgZm9yIGNyZWF0aW5nIGEgcHJveHkuAAEBIFRoaXMgaXMgaGVsZCBmb3IgYW4gYWRkaXRpb25hbCBzdG9yYWdlIGl0ZW0gd2hvc2UgdmFsdWUgc2l6ZSBpcyUBIGBzaXplb2YoQmFsYW5jZSlgIGJ5dGVzIGFuZCB3aG9zZSBrZXkgc2l6ZSBpcyBgc2l6ZW9mKEFjY291bnRJZClgIGJ5dGVzLkhQcm94eURlcG9zaXRGYWN0b3IYQIBmqxMAAAAAAAAAAAAAAAAUvCBUaGUgYW1vdW50IG9mIGN1cnJlbmN5IG5lZWRlZCBwZXIgcHJveHkgYWRkZWQuADUBIFRoaXMgaXMgaGVsZCBmb3IgYWRkaW5nIDMyIGJ5dGVzIHBsdXMgYW4gaW5zdGFuY2Ugb2YgYFByb3h5VHlwZWAgbW9yZSBpbnRvIGFhASBwcmUtZXhpc3Rpbmcgc3RvcmFnZSB2YWx1ZS4gVGh1cywgd2hlbiBjb25maWd1cmluZyBgUHJveHlEZXBvc2l0RmFjdG9yYCBvbmUgc2hvdWxkIHRha2X0IGludG8gYWNjb3VudCBgMzIgKyBwcm94eV90eXBlLmVuY29kZSgpLmxlbigpYCBieXRlcyBvZiBkYXRhLihNYXhQcm94aWVzEBAgAAAABPAgVGhlIG1heGltdW0gYW1vdW50IG9mIHByb3hpZXMgYWxsb3dlZCBmb3IgYSBzaW5nbGUgYWNjb3VudC4oTWF4UGVuZGluZxAQIAAAAARFASBUaGUgbWF4aW11bSBhbW91bnQgb2YgdGltZS1kZWxheWVkIGFubm91bmNlbWVudHMgdGhhdCBhcmUgYWxsb3dlZCB0byBiZSBwZW5kaW5nLlxBbm5vdW5jZW1lbnREZXBvc2l0QmFzZRhAAISylS4AAAAAAAAAAAAAABAxASBUaGUgYmFzZSBhbW91bnQgb2YgY3VycmVuY3kgbmVlZGVkIHRvIHJlc2VydmUgZm9yIGNyZWF0aW5nIGFuIGFubm91bmNlbWVudC4ASQEgVGhpcyBpcyBoZWxkIHdoZW4gYSBuZXcgc3RvcmFnZSBpdGVtIGhvbGRpbmcgYSBgQmFsYW5jZWAgaXMgY3JlYXRlZCAodHlwaWNhbGx5IDE2ICBieXRlcykuZEFubm91bmNlbWVudERlcG9zaXRGYWN0b3IYQADNVicAAAAAAAAAAAAAAAAQ1CBUaGUgYW1vdW50IG9mIGN1cnJlbmN5IG5lZWRlZCBwZXIgYW5ub3VuY2VtZW50IG1hZGUuAFkBIFRoaXMgaXMgaGVsZCBmb3IgYWRkaW5nIGFuIGBBY2NvdW50SWRgLCBgSGFzaGAgYW5kIGBCbG9ja051bWJlcmAgKHR5cGljYWxseSA2OCBieXRlcymMIGludG8gYSBwcmUtZXhpc3Rpbmcgc3RvcmFnZSB2YWx1ZS4BUQodACBNdWx0aXNpZwEgTXVsdGlzaWcEJE11bHRpc2lncwABCAUCVQpZCgQABJQgVGhlIHNldCBvZiBvcGVuIG11bHRpc2lnIG9wZXJhdGlvbnMuAQ0DAU0HDCxEZXBvc2l0QmFzZRhAAIxhxS4AAAAAAAAAAAAAABhZASBUaGUgYmFzZSBhbW91bnQgb2YgY3VycmVuY3kgbmVlZGVkIHRvIHJlc2VydmUgZm9yIGNyZWF0aW5nIGEgbXVsdGlzaWcgZXhlY3V0aW9uIG9yIHRvhCBzdG9yZSBhIGRpc3BhdGNoIGNhbGwgZm9yIGxhdGVyLgABASBUaGlzIGlzIGhlbGQgZm9yIGFuIGFkZGl0aW9uYWwgc3RvcmFnZSBpdGVtIHdob3NlIHZhbHVlIHNpemUgaXMxASBgNCArIHNpemVvZigoQmxvY2tOdW1iZXIsIEJhbGFuY2UsIEFjY291bnRJZCkpYCBieXRlcyBhbmQgd2hvc2Uga2V5IHNpemUgaXOAIGAzMiArIHNpemVvZihBY2NvdW50SWQpYCBieXRlcy40RGVwb3NpdEZhY3RvchhAANASEwAAAAAAAAAAAAAAAAxVASBUaGUgYW1vdW50IG9mIGN1cnJlbmN5IG5lZWRlZCBwZXIgdW5pdCB0aHJlc2hvbGQgd2hlbiBjcmVhdGluZyBhIG11bHRpc2lnIGV4ZWN1dGlvbi4AJQEgVGhpcyBpcyBoZWxkIGZvciBhZGRpbmcgMzIgYnl0ZXMgbW9yZSBpbnRvIGEgcHJlLWV4aXN0aW5nIHN0b3JhZ2UgdmFsdWUuOE1heFNpZ25hdG9yaWVzEBBkAAAABOwgVGhlIG1heGltdW0gYW1vdW50IG9mIHNpZ25hdG9yaWVzIGFsbG93ZWQgaW4gdGhlIG11bHRpc2lnLgFhCh4AIEJvdW50aWVzASBCb3VudGllcxAsQm91bnR5Q291bnQBABAQAAAAAATAIE51bWJlciBvZiBib3VudHkgcHJvcG9zYWxzIHRoYXQgaGF2ZSBiZWVuIG1hZGUuIEJvdW50aWVzAAEEBRBlCgQABHggQm91bnRpZXMgdGhhdCBoYXZlIGJlZW4gbWFkZS5IQm91bnR5RGVzY3JpcHRpb25zAAEEBRBtCgQABIAgVGhlIGRlc2NyaXB0aW9uIG9mIGVhY2ggYm91bnR5LjxCb3VudHlBcHByb3ZhbHMBAIEJBAAE7CBCb3VudHkgaW5kaWNlcyB0aGF0IGhhdmUgYmVlbiBhcHByb3ZlZCBidXQgbm90IHlldCBmdW5kZWQuARkDAVEHJERCb3VudHlEZXBvc2l0QmFzZRhAAOQLVAIAAAAAAAAAAAAAAAToIFRoZSBhbW91bnQgaGVsZCBvbiBkZXBvc2l0IGZvciBwbGFjaW5nIGEgYm91bnR5IHByb3Bvc2FsLmBCb3VudHlEZXBvc2l0UGF5b3V0RGVsYXkQEAAAAAAEWQEgVGhlIGRlbGF5IHBlcmlvZCBmb3Igd2hpY2ggYSBib3VudHkgYmVuZWZpY2lhcnkgbmVlZCB0byB3YWl0IGJlZm9yZSBjbGFpbSB0aGUgcGF5b3V0LkhCb3VudHlVcGRhdGVQZXJpb2QQEIDGEwAEbCBCb3VudHkgZHVyYXRpb24gaW4gYmxvY2tzLmBDdXJhdG9yRGVwb3NpdE11bHRpcGxpZXKNCRAgoQcAEBkBIFRoZSBjdXJhdG9yIGRlcG9zaXQgaXMgY2FsY3VsYXRlZCBhcyBhIHBlcmNlbnRhZ2Ugb2YgdGhlIGN1cmF0b3IgZmVlLgA5ASBUaGlzIGRlcG9zaXQgaGFzIG9wdGlvbmFsIHVwcGVyIGFuZCBsb3dlciBib3VuZHMgd2l0aCBgQ3VyYXRvckRlcG9zaXRNYXhgIGFuZFQgYEN1cmF0b3JEZXBvc2l0TWluYC5EQ3VyYXRvckRlcG9zaXRNYXgBAkQBACBKqdEBAAAAAAAAAAAAAARJASBNYXhpbXVtIGFtb3VudCBvZiBmdW5kcyB0aGF0IHNob3VsZCBiZSBwbGFjZWQgaW4gYSBkZXBvc2l0IGZvciBtYWtpbmcgYSBwcm9wb3NhbC5EQ3VyYXRvckRlcG9zaXRNaW4BAkQBAOh2SBcAAAAAAAAAAAAAAARJASBNaW5pbXVtIGFtb3VudCBvZiBmdW5kcyB0aGF0IHNob3VsZCBiZSBwbGFjZWQgaW4gYSBkZXBvc2l0IGZvciBtYWtpbmcgYSBwcm9wb3NhbC5IQm91bnR5VmFsdWVNaW5pbXVtGEAA6HZIFwAAAAAAAAAAAAAABHAgTWluaW11bSB2YWx1ZSBmb3IgYSBib3VudHkuSERhdGFEZXBvc2l0UGVyQnl0ZRhAAOH1BQAAAAAAAAAAAAAAAARhASBUaGUgYW1vdW50IGhlbGQgb24gZGVwb3NpdCBwZXIgYnl0ZSB3aXRoaW4gdGhlIHRpcCByZXBvcnQgcmVhc29uIG9yIGJvdW50eSBkZXNjcmlwdGlvbi5MTWF4aW11bVJlYXNvbkxlbmd0aBAQAEAAAAyIIE1heGltdW0gYWNjZXB0YWJsZSByZWFzb24gbGVuZ3RoLgBlASBCZW5jaG1hcmtzIGRlcGVuZCBvbiB0aGlzIHZhbHVlLCBiZSBzdXJlIHRvIHVwZGF0ZSB3ZWlnaHRzIGZpbGUgd2hlbiBjaGFuZ2luZyB0aGlzIHZhbHVlAXEKIgA0Q2hpbGRCb3VudGllcwE0Q2hpbGRCb3VudGllcxRAQ2hpbGRCb3VudHlDb3VudAEAEBAAAAAABIAgTnVtYmVyIG9mIHRvdGFsIGNoaWxkIGJvdW50aWVzLkxQYXJlbnRDaGlsZEJvdW50aWVzAQEEBRAQEAAAAAAIsCBOdW1iZXIgb2YgY2hpbGQgYm91bnRpZXMgcGVyIHBhcmVudCBib3VudHku4CBNYXAgb2YgcGFyZW50IGJvdW50eSBpbmRleCB0byBudW1iZXIgb2YgY2hpbGQgYm91bnRpZXMuNENoaWxkQm91bnRpZXMAAQgFBYB1CgQABJQgQ2hpbGQgYm91bnRpZXMgdGhhdCBoYXZlIGJlZW4gYWRkZWQuXENoaWxkQm91bnR5RGVzY3JpcHRpb25zAAEEBRBtCgQABJggVGhlIGRlc2NyaXB0aW9uIG9mIGVhY2ggY2hpbGQtYm91bnR5LkxDaGlsZHJlbkN1cmF0b3JGZWVzAQEEBRAYQAAAAAAAAAAAAAAAAAAAAAAEAQEgVGhlIGN1bXVsYXRpdmUgY2hpbGQtYm91bnR5IGN1cmF0b3IgZmVlIGZvciBlYWNoIHBhcmVudCBib3VudHkuAR0DAVUHCGRNYXhBY3RpdmVDaGlsZEJvdW50eUNvdW50EBBkAAAABB0BIE1heGltdW0gbnVtYmVyIG9mIGNoaWxkIGJvdW50aWVzIHRoYXQgY2FuIGJlIGFkZGVkIHRvIGEgcGFyZW50IGJvdW50eS5cQ2hpbGRCb3VudHlWYWx1ZU1pbmltdW0YQADkC1QCAAAAAAAAAAAAAAAEiCBNaW5pbXVtIHZhbHVlIGZvciBhIGNoaWxkLWJvdW50eS4BfQomAGhFbGVjdGlvblByb3ZpZGVyTXVsdGlQaGFzZQFoRWxlY3Rpb25Qcm92aWRlck11bHRpUGhhc2UoFFJvdW5kAQAQEAEAAAAYrCBJbnRlcm5hbCBjb3VudGVyIGZvciB0aGUgbnVtYmVyIG9mIHJvdW5kcy4AVQEgVGhpcyBpcyB1c2VmdWwgZm9yIGRlLWR1cGxpY2F0aW9uIG9mIHRyYW5zYWN0aW9ucyBzdWJtaXR0ZWQgdG8gdGhlIHBvb2wsIGFuZCBnZW5lcmFsbCBkaWFnbm9zdGljcyBvZiB0aGUgcGFsbGV0LgBNASBUaGlzIGlzIG1lcmVseSBpbmNyZW1lbnRlZCBvbmNlIHBlciBldmVyeSB0aW1lIHRoYXQgYW4gdXBzdHJlYW0gYGVsZWN0YCBpcyBjYWxsZWQuMEN1cnJlbnRQaGFzZQEAYQcEAAQ8IEN1cnJlbnQgcGhhc2UuOFF1ZXVlZFNvbHV0aW9uAACBCgQADD0BIEN1cnJlbnQgYmVzdCBzb2x1dGlvbiwgc2lnbmVkIG9yIHVuc2lnbmVkLCBxdWV1ZWQgdG8gYmUgcmV0dXJuZWQgdXBvbiBgZWxlY3RgLgBgIEFsd2F5cyBzb3J0ZWQgYnkgc2NvcmUuIFNuYXBzaG90AACJCgQAEHAgU25hcHNob3QgZGF0YSBvZiB0aGUgcm91bmQuAF0BIFRoaXMgaXMgY3JlYXRlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzaWduZWQgcGhhc2UgYW5kIGNsZWFyZWQgdXBvbiBjYWxsaW5nIGBlbGVjdGAuKQEgTm90ZTogVGhpcyBzdG9yYWdlIHR5cGUgbXVzdCBvbmx5IGJlIG11dGF0ZWQgdGhyb3VnaCBbYFNuYXBzaG90V3JhcHBlcmBdLjhEZXNpcmVkVGFyZ2V0cwAAEAQAEMwgRGVzaXJlZCBudW1iZXIgb2YgdGFyZ2V0cyB0byBlbGVjdCBmb3IgdGhpcyByb3VuZC4AqCBPbmx5IGV4aXN0cyB3aGVuIFtgU25hcHNob3RgXSBpcyBwcmVzZW50LikBIE5vdGU6IFRoaXMgc3RvcmFnZSB0eXBlIG11c3Qgb25seSBiZSBtdXRhdGVkIHRocm91Z2ggW2BTbmFwc2hvdFdyYXBwZXJgXS5AU25hcHNob3RNZXRhZGF0YQAA+QMEABCYIFRoZSBtZXRhZGF0YSBvZiB0aGUgW2BSb3VuZFNuYXBzaG90YF0AqCBPbmx5IGV4aXN0cyB3aGVuIFtgU25hcHNob3RgXSBpcyBwcmVzZW50LikBIE5vdGU6IFRoaXMgc3RvcmFnZSB0eXBlIG11c3Qgb25seSBiZSBtdXRhdGVkIHRocm91Z2ggW2BTbmFwc2hvdFdyYXBwZXJgXS5kU2lnbmVkU3VibWlzc2lvbk5leHRJbmRleAEAEBAAAAAAJAEBIFRoZSBuZXh0IGluZGV4IHRvIGJlIGFzc2lnbmVkIHRvIGFuIGluY29taW5nIHNpZ25lZCBzdWJtaXNzaW9uLgB1ASBFdmVyeSBhY2NlcHRlZCBzdWJtaXNzaW9uIGlzIGFzc2lnbmVkIGEgdW5pcXVlIGluZGV4OyB0aGF0IGluZGV4IGlzIGJvdW5kIHRvIHRoYXQgcGFydGljdWxhcmUBIHN1Ym1pc3Npb24gZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgZWxlY3Rpb24uIE9uIGVsZWN0aW9uIGZpbmFsaXphdGlvbiwgdGhlIG5leHQgaW5kZXggaXMwIHJlc2V0IHRvIDAuAGkBIFdlIGNhbid0IGp1c3QgdXNlIGBTaWduZWRTdWJtaXNzaW9uSW5kaWNlcy5sZW4oKWAsIGJlY2F1c2UgdGhhdCdzIGEgYm91bmRlZCBzZXQ7IHBhc3QgaXRzWQEgY2FwYWNpdHksIGl0IHdpbGwgc2ltcGx5IHNhdHVyYXRlLiBXZSBjYW4ndCBqdXN0IGl0ZXJhdGUgb3ZlciBgU2lnbmVkU3VibWlzc2lvbnNNYXBgLPQgYmVjYXVzZSBpdGVyYXRpb24gaXMgc2xvdy4gSW5zdGVhZCwgd2Ugc3RvcmUgdGhlIHZhbHVlIGhlcmUuXFNpZ25lZFN1Ym1pc3Npb25JbmRpY2VzAQCVCgQAGG0BIEEgc29ydGVkLCBib3VuZGVkIHZlY3RvciBvZiBgKHNjb3JlLCBibG9ja19udW1iZXIsIGluZGV4KWAsIHdoZXJlIGVhY2ggYGluZGV4YCBwb2ludHMgdG8gYXggdmFsdWUgaW4gYFNpZ25lZFN1Ym1pc3Npb25zYC4AcQEgV2UgbmV2ZXIgbmVlZCB0byBwcm9jZXNzIG1vcmUgdGhhbiBhIHNpbmdsZSBzaWduZWQgc3VibWlzc2lvbiBhdCBhIHRpbWUuIFNpZ25lZCBzdWJtaXNzaW9uc3UBIGNhbiBiZSBxdWl0ZSBsYXJnZSwgc28gd2UncmUgd2lsbGluZyB0byBwYXkgdGhlIGNvc3Qgb2YgbXVsdGlwbGUgZGF0YWJhc2UgYWNjZXNzZXMgdG8gYWNjZXNzIQEgdGhlbSBvbmUgYXQgYSB0aW1lIGluc3RlYWQgb2YgcmVhZGluZyBhbmQgZGVjb2RpbmcgYWxsIG9mIHRoZW0gYXQgb25jZS5QU2lnbmVkU3VibWlzc2lvbnNNYXAAAQQFEKEKBAAcdCBVbmNoZWNrZWQsIHNpZ25lZCBzb2x1dGlvbnMuAGkBIFRvZ2V0aGVyIHdpdGggYFN1Ym1pc3Npb25JbmRpY2VzYCwgdGhpcyBzdG9yZXMgYSBib3VuZGVkIHNldCBvZiBgU2lnbmVkU3VibWlzc2lvbnNgIHdoaWxl7CBhbGxvd2luZyB1cyB0byBrZWVwIG9ubHkgYSBzaW5nbGUgb25lIGluIG1lbW9yeSBhdCBhIHRpbWUuAGkBIFR3b3ggbm90ZTogdGhlIGtleSBvZiB0aGUgbWFwIGlzIGFuIGF1dG8taW5jcmVtZW50aW5nIGluZGV4IHdoaWNoIHVzZXJzIGNhbm5vdCBpbnNwZWN0IG9y9CBhZmZlY3Q7IHdlIHNob3VsZG4ndCBuZWVkIGEgY3J5cHRvZ3JhcGhpY2FsbHkgc2VjdXJlIGhhc2hlci5UTWluaW11bVVudHJ1c3RlZFNjb3JlAAD1AwQAEF0BIFRoZSBtaW5pbXVtIHNjb3JlIHRoYXQgZWFjaCAndW50cnVzdGVkJyBzb2x1dGlvbiBtdXN0IGF0dGFpbiBpbiBvcmRlciB0byBiZSBjb25zaWRlcmVkKCBmZWFzaWJsZS4AuCBDYW4gYmUgc2V0IHZpYSBgc2V0X21pbmltdW1fdW50cnVzdGVkX3Njb3JlYC4BIQMBWQc4VEJldHRlclNpZ25lZFRocmVzaG9sZKwQAAAAAAhNASBUaGUgbWluaW11bSBhbW91bnQgb2YgaW1wcm92ZW1lbnQgdG8gdGhlIHNvbHV0aW9uIHNjb3JlIHRoYXQgZGVmaW5lcyBhIHNvbHV0aW9uIGFzeCAiYmV0dGVyIiBpbiB0aGUgU2lnbmVkIHBoYXNlLjhPZmZjaGFpblJlcGVhdBAQBAAAABC0IFRoZSByZXBlYXQgdGhyZXNob2xkIG9mIHRoZSBvZmZjaGFpbiB3b3JrZXIuAGEBIEZvciBleGFtcGxlLCBpZiBpdCBpcyA1LCB0aGF0IG1lYW5zIHRoYXQgYXQgbGVhc3QgNSBibG9ja3Mgd2lsbCBlbGFwc2UgYmV0d2VlbiBhdHRlbXB0c4QgdG8gc3VibWl0IHRoZSB3b3JrZXIncyBzb2x1dGlvbi48TWluZXJUeFByaW9yaXR5MCBlZmZmZmZm5gQlASBUaGUgcHJpb3JpdHkgb2YgdGhlIHVuc2lnbmVkIHRyYW5zYWN0aW9uIHN1Ym1pdHRlZCBpbiB0aGUgdW5zaWduZWQtcGhhc2VQU2lnbmVkTWF4U3VibWlzc2lvbnMQEBAAAAAc5CBNYXhpbXVtIG51bWJlciBvZiBzaWduZWQgc3VibWlzc2lvbnMgdGhhdCBjYW4gYmUgcXVldWVkLgBVASBJdCBpcyBiZXN0IHRvIGF2b2lkIGFkanVzdGluZyB0aGlzIGR1cmluZyBhbiBlbGVjdGlvbiwgYXMgaXQgaW1wYWN0cyBkb3duc3RyZWFtIGRhdGFlASBzdHJ1Y3R1cmVzLiBJbiBwYXJ0aWN1bGFyLCBgU2lnbmVkU3VibWlzc2lvbkluZGljZXM8VD5gIGlzIGJvdW5kZWQgb24gdGhpcyB2YWx1ZS4gSWYgeW919CB1cGRhdGUgdGhpcyB2YWx1ZSBkdXJpbmcgYW4gZWxlY3Rpb24sIHlvdSBfbXVzdF8gZW5zdXJlIHRoYXRNASBgU2lnbmVkU3VibWlzc2lvbkluZGljZXMubGVuKClgIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgbmV3IHZhbHVlLiBPdGhlcndpc2Us8CBhdHRlbXB0cyB0byBzdWJtaXQgbmV3IHNvbHV0aW9ucyBtYXkgY2F1c2UgYSBydW50aW1lIHBhbmljLjxTaWduZWRNYXhXZWlnaHQoQAsIx3JYVQETo3A9CtejcL0UlCBNYXhpbXVtIHdlaWdodCBvZiBhIHNpZ25lZCBzb2x1dGlvbi4AXQEgSWYgW2BDb25maWc6Ok1pbmVyQ29uZmlnYF0gaXMgYmVpbmcgaW1wbGVtZW50ZWQgdG8gc3VibWl0IHNpZ25lZCBzb2x1dGlvbnMgKG91dHNpZGUgb2Y9ASB0aGlzIHBhbGxldCksIHRoZW4gW2BNaW5lckNvbmZpZzo6c29sdXRpb25fd2VpZ2h0YF0gaXMgdXNlZCB0byBjb21wYXJlIGFnYWluc3QwIHRoaXMgdmFsdWUuQFNpZ25lZE1heFJlZnVuZHMQEAQAAAAEGQEgVGhlIG1heGltdW0gYW1vdW50IG9mIHVuY2hlY2tlZCBzb2x1dGlvbnMgdG8gcmVmdW5kIHRoZSBjYWxsIGZlZSBmb3IuQFNpZ25lZFJld2FyZEJhc2UYQADkC1QCAAAAAAAAAAAAAAAEiCBCYXNlIHJld2FyZCBmb3IgYSBzaWduZWQgc29sdXRpb25EU2lnbmVkRGVwb3NpdEJ5dGUYQHh9AQAAAAAAAAAAAAAAAAAEoCBQZXItYnl0ZSBkZXBvc2l0IGZvciBhIHNpZ25lZCBzb2x1dGlvbi5MU2lnbmVkRGVwb3NpdFdlaWdodBhAAAAAAAAAAAAAAAAAAAAAAASoIFBlci13ZWlnaHQgZGVwb3NpdCBmb3IgYSBzaWduZWQgc29sdXRpb24uKE1heFdpbm5lcnMQELAEAAAQNQEgVGhlIG1heGltdW0gbnVtYmVyIG9mIHdpbm5lcnMgdGhhdCBjYW4gYmUgZWxlY3RlZCBieSB0aGlzIGBFbGVjdGlvblByb3ZpZGVyYEAgaW1wbGVtZW50YXRpb24uAFEBIE5vdGU6IFRoaXMgbXVzdCBhbHdheXMgYmUgZ3JlYXRlciBvciBlcXVhbCB0byBgVDo6RGF0YVByb3ZpZGVyOjpkZXNpcmVkX3RhcmdldHMoKWAuOE1pbmVyTWF4TGVuZ3RoEBAAADYAADhNaW5lck1heFdlaWdodChACwjHclhVAROjcD0K16NwvQBUTWluZXJNYXhWb3Rlc1BlclZvdGVyEBAQAAAAADxNaW5lck1heFdpbm5lcnMQELAEAAAAAaUKJAAkVm90ZXJMaXN0ASRWb3Rlckxpc3QMJExpc3ROb2RlcwABBAUAqQoEAAyAIEEgc2luZ2xlIG5vZGUsIHdpdGhpbiBzb21lIGJhZy4ABQEgTm9kZXMgc3RvcmUgbGlua3MgZm9yd2FyZCBhbmQgYmFjayB3aXRoaW4gdGhlaXIgcmVzcGVjdGl2ZSBiYWdzLkxDb3VudGVyRm9yTGlzdE5vZGVzAQAQEAAAAAAErENvdW50ZXIgZm9yIHRoZSByZWxhdGVkIGNvdW50ZWQgc3RvcmFnZSBtYXAgTGlzdEJhZ3MAAQQFMK0KBAAMZCBBIGJhZyBzdG9yZWQgaW4gc3RvcmFnZS4AGQEgU3RvcmVzIGEgYEJhZ2Agc3RydWN0LCB3aGlj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ZmllcyB0aGVhASB0aHJlc2hvbGRzIHNlcGFyYXRpbmcgdGhlIGJhZ3MuIEFuIGlkJ3MgYmFnIGlzIHRoZSBsYXJnZXN0IGJhZyBmb3Igd2hpY2ggdGhlIGlkJ3Mgc2NvcmW4IGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byBpdHMgdXBwZXIgdGhyZXNob2xkLgBlASBXaGVuIGlkcyBhcmUgaXRlcmF0ZWQsIGhpZ2hlciBiYWdzIGFyZSBpdGVyYXRlZCBjb21wbGV0ZWx5IGJlZm9yZSBsb3dlciBiYWdzLiBUaGlzIG1lYW5zWQEgdGhhdCBpdGVyYXRpb24gaXMgX3NlbWktc29ydGVkXzogaWRzIG9mIGhpZ2hlciBzY29yZSB0ZW5kIHRvIGNvbWUgYmVmb3JlIGlkcyBvZiBsb3dlci0BIHNjb3JlLCBidXQgcGVlciBpZHMgd2l0aGluIGEgcGFydGljdWxhciBiYWcgYXJlIHNvcnRlZCBpbiBpbnNlcnRpb24gb3JkZXIuAGggIyBFeHByZXNzaW5nIHRoZSBjb25zdGFudABNASBUaGlzIGNvbnN0YW50IG11c3QgYmUgc29ydGVkIGluIHN0cmljdGx5IGluY3JlYXNpbmcgb3JkZXIuIER1cGxpY2F0ZSBpdGVtcyBhcmUgbm90LCBwZXJtaXR0ZWQuAEEBIFRoZXJlIGlzIGFuIGltcGxpZWQgdXBwZXIgbGltaXQgb2YgYFNjb3JlOjpNQVhgOyB0aGF0IHZhbHVlIGRvZXMgbm90IG5lZWQgdG8gYmUhASBzcGVjaWZpZWQgd2l0aGluIHRoZSBiYWcuIEZvciBhbnkgdHdvIHRocmVzaG9sZCBsaXN0cywgaWYgb25lIGVuZHMgd2l0aDEBIGBTY29yZTo6TUFYYCwgdGhlIG90aGVyIG9uZSBkb2VzIG5vdCwgYW5kIHRoZXkgYXJlIG90aGVyd2lzZSBlcXVhbCwgdGhlIHR3b3wgbGlzdHMgd2lsbCBiZWhhdmUgaWRlbnRpY2FsbHkuADggIyBDYWxjdWxhdGlvbgBVASBJdCBpcyByZWNvbW1lbmRlZCB0byBnZW5lcmF0ZSB0aGUgc2V0IG9mIHRocmVzaG9sZHMgaW4gYSBnZW9tZXRyaWMgc2VyaWVzLCBzdWNoIHRoYXRBASB0aGVyZSBleGlzdHMgc29tZSBjb25zdGFudCByYXRpbyBzdWNoIHRoYXQgYHRocmVzaG9sZFtrICsgMV0gPT0gKHRocmVzaG9sZFtrXSAq0CBjb25zdGFudF9yYXRpbykubWF4KHRocmVzaG9sZFtrXSArIDEpYCBmb3IgYWxsIGBrYC4AWQEgVGhlIGhlbHBlcnMgaW4gdGhlIGAvdXRpbHMvZnJhbWUvZ2VuZXJhdGUtYmFnc2AgbW9kdWxlIGNhbiBzaW1wbGlmeSB0aGlzIGNhbGN1bGF0aW9uLgAsICMgRXhhbXBsZXMAUQEgLSBJZiBgQmFnVGhyZXNob2xkczo6Z2V0KCkuaXNfZW1wdHkoKWAsIHRoZW4gYWxsIGlkcyBhcmUgcHV0IGludG8gdGhlIHNhbWUgYmFnLCBhbmSwICAgaXRlcmF0aW9uIGlzIHN0cmljdGx5IGluIGluc2VydGlvbiBvcmRlci5hASAtIElmIGBCYWdUaHJlc2hvbGRzOjpnZXQoKS5sZW4oKSA9PSA2NGAsIGFuZCB0aGUgdGhyZXNob2xkcyBhcmUgZGV0ZXJtaW5lZCBhY2NvcmRpbmcgdG8RASAgIHRoZSBwcm9jZWR1cmUgZ2l2ZW4gYWJvdmUsIHRoZW4gdGhlIGNvbnN0YW50IHJhdGlvIGlzIGVxdWFsIHRvIDIuZQEgLSBJZiBgQmFnVGhyZXNob2xkczo6Z2V0KCkubGVuKCkgPT0gMjAwYCwgYW5kIHRoZSB0aHJlc2hvbGRzIGFyZSBkZXRlcm1pbmVkIGFjY29yZGluZyB0b1kBICAgdGhlIHByb2NlZHVyZSBnaXZlbiBhYm92ZSwgdGhlbiB0aGUgY29uc3RhbnQgcmF0aW8gaXMgYXBwcm94aW1hdGVseSBlcXVhbCB0byAxLjI0OC5hASAtIElmIHRoZSB0aHJlc2hvbGQgbGlzdCBiZWdpbnMgYFsxLCAyLCAzLCAuLi5dYCwgdGhlbiBhbiBpZCB3aXRoIHNjb3JlIDAgb3IgMSB3aWxsIGZhbGzwICAgaW50byBiYWcgMCwgYW4gaWQgd2l0aCBzY29yZSAyIHdpbGwgZmFsbCBpbnRvIGJhZyAxLCBldGMuADAgIyBNaWdyYXRpb24AYQEgSW4gdGhlIGV2ZW50IHRoYXQgdGhpcyBsaXN0IGV2ZXIgY2hhbmdlcywgYSBjb3B5IG9mIHRoZSBvbGQgYmFncyBsaXN0IG11c3QgYmUgcmV0YWluZWQuXQEgV2l0aCB0aGF0IGBMaXN0OjptaWdyYXRlYCBjYW4gYmUgY2FsbGVkLCB3aGljaCB3aWxsIHBlcmZvcm0gdGhlIGFwcHJvcHJpYXRlIG1pZ3JhdGlvbi4BtQolADxOb21pbmF0aW9uUG9vbHMBPE5vbWluYXRpb25Qb29sc1RAVG90YWxWYWx1ZUxvY2tlZAEAGEAAAAAAAAAAAAAAAAAAAAAAFIwgVGhlIHN1bSBvZiBmdW5kcyBhY3Jvc3MgYWxsIHBvb2xzLgBxASBUaGlzIG1pZ2h0IGJlIGxvd2VyIGJ1dCBuZXZlciBoaWdoZXIgdGhhbiB0aGUgc3VtIG9mIGB0b3RhbF9iYWxhbmNlYCBvZiBhbGwgW2BQb29sTWVtYmVyc2BdWQEgYmVjYXVzZSBjYWxsaW5nIGBwb29sX3dpdGhkcmF3X3VuYm9uZGVkYCBtaWdodCBkZWNyZWFzZSB0aGUgdG90YWwgc3Rha2Ugb2YgdGhlIHBvb2wncykBIGBib25kZWRfYWNjb3VudGAgd2l0aG91dCBhZGp1c3RpbmcgdGhlIHBhbGxldC1pbnRlcm5hbCBgVW5ib25kaW5nUG9vbGAncy4sTWluSm9pbkJvbmQBABhAAAAAAAAAAAAAAAAAAAAAAAScIE1pbmltdW0gYW1vdW50IHRvIGJvbmQgdG8gam9pbiBhIHBvb2wuNE1pbkNyZWF0ZUJvbmQBABhAAAAAAAAAAAAAAAAAAAAAABygIE1pbmltdW0gYm9uZCByZXF1aXJlZCB0byBjcmVhdGUgYSBwb29sLgBlASBUaGlzIGlzIHRoZSBhbW91bnQgdGhhdCB0aGUgZGVwb3NpdG9yIG11c3QgcHV0IGFzIHRoZWlyIGluaXRpYWwgc3Rha2UgaW4gdGhlIHBvb2wsIGFzIGFuiCBpbmRpY2F0aW9uIG9mICJza2luIGluIHRoZSBnYW1lIi4AaQEgVGhpcyBpcyB0aGUgdmFsdWUgdGhhdCB3aWxsIGFsd2F5cyBleGlzdCBpbiB0aGUgc3Rha2luZyBsZWRnZXIgb2YgdGhlIHBvb2wgYm9uZGVkIGFjY291bnSAIHdoaWxlIGFsbCBvdGhlciBhY2NvdW50cyBsZWF2ZS4gTWF4UG9vbHMAABAEAAhpASBNYXhpbXVtIG51bWJlciBvZiBub21pbmF0aW9uIHBvb2xzIHRoYXQgY2FuIGV4aXN0LiBJZiBgTm9uZWAsIHRoZW4gYW4gdW5ib3VuZGVkIG51bWJlciBvZkQgcG9vbHMgY2FuIGV4aXN0LjhNYXhQb29sTWVtYmVycwAAEAQACEkBIE1heGltdW0gbnVtYmVyIG9mIG1lbWJlcnMgdGhhdCBjYW4gZXhpc3QgaW4gdGhlIHN5c3RlbS4gSWYgYE5vbmVgLCB0aGVuIHRoZSBjb3VudLggbWVtYmVycyBhcmUgbm90IGJvdW5kIG9uIGEgc3lzdGVtIHdpZGUgYmFzaXMuVE1heFBvb2xNZW1iZXJzUGVyUG9vbAAAEAQACEEBIE1heGltdW0gbnVtYmVyIG9mIG1lbWJlcnMgdGhhdCBtYXkgYmVsb25nIHRvIHBvb2wuIElmIGBOb25lYCwgdGhlbiB0aGUgY291bnQgb2aoIG1lbWJlcnMgaXMgbm90IGJvdW5kIG9uIGEgcGVyIHBvb2wgYmFzaXMuTEdsb2JhbE1heENvbW1pc3Npb24AAKwEAAxpASBUaGUgbWF4aW11bSBjb21taXNzaW9uIHRoYXQgY2FuIGJlIGNoYXJnZWQgYnkgYSBwb29sLiBVc2VkIG9uIGNvbW1pc3Npb24gcGF5b3V0cyB0byBib3VuZCUBIHBvb2wgY29tbWlzc2lvbnMgdGhhdCBhcmUgPiBgR2xvYmFsTWF4Q29tbWlzc2lvbmAsIG5lY2Vzc2FyeSBpZiBhIGZ1dHVyZQ0BIGBHbG9iYWxNYXhDb21taXNzaW9uYCBpcyBsb3dlciB0aGFuIHNvbWUgY3VycmVudCBwb29sIGNvbW1pc3Npb25zLixQb29sTWVtYmVycwABBAUAvQoEAAxAIEFjdGl2ZSBtZW1iZXJzLgDQIFRXT1gtTk9URTogU0FGRSBzaW5jZSBgQWNjb3VudElkYCBpcyBhIHNlY3VyZSBoYXNoLlRDb3VudGVyRm9yUG9vbE1lbWJlcnMBABAQAAAAAASsQ291bnRlciBmb3IgdGhlIHJlbGF0ZWQgY291bnRlZCBzdG9yYWdlIG1hcCxCb25kZWRQb29scwABBAUQyQoEAARoIFN0b3JhZ2UgZm9yIGJvbmRlZCBwb29scy5UQ291bnRlckZvckJvbmRlZFBvb2xzAQAQEAAAAAAErENvdW50ZXIgZm9yIHRoZSByZWxhdGVkIGNvdW50ZWQgc3RvcmFnZSBtYXAsUmV3YXJkUG9vbHMAAQQFEN0KBAAIdQEgUmV3YXJkIHBvb2xzLiBUaGlzIGlzIHdoZXJlIHRoZXJlIHJld2FyZHMgZm9yIGVhY2ggcG9vbCBhY2N1bXVsYXRlLiBXaGVuIGEgbWVtYmVycyBwYXlvdXQgaXNZASBjbGFpbWVkLCB0aGUgYmFsYW5jZSBjb21lcyBvdXQgb2YgdGhlIHJld2FyZCBwb29sLiBLZXllZCBieSB0aGUgYm9uZGVkIHBvb2xzIGFjY291bnQuVENvdW50ZXJGb3JSZXdhcmRQb29scwEAEBAAAAAABKxDb3VudGVyIGZvciB0aGUgcmVsYXRlZCBjb3VudGVkIHN0b3JhZ2UgbWFwPFN1YlBvb2xzU3RvcmFnZQABBAUQ4QoEAAgZASBHcm91cHMgb2YgdW5ib25kaW5nIHBvb2xzLiBFYWNoIGdyb3VwIG9mIHVuYm9uZGluZyBwb29scyBiZWxvbmdzIHRvIGEpASBib25kZWQgcG9vbCwgaGVuY2UgdGhlIG5hbWUgc3ViLXBvb2xzLiBLZXllZCBieSB0aGUgYm9uZGVkIHBvb2xzIGFjY291bnQuZENvdW50ZXJGb3JTdWJQb29sc1N0b3JhZ2UBABAQAAAAAASsQ291bnRlciBmb3IgdGhlIHJlbGF0ZWQgY291bnRlZCBzdG9yYWdlIG1hcCBNZXRhZGF0YQEBBAUQ+QoEAARcIE1ldGFkYXRhIGZvciB0aGUgcG9vbC5IQ291bnRlckZvck1ldGFkYXRhAQAQEAAAAAAErENvdW50ZXIgZm9yIHRoZSByZWxhdGVkIGNvdW50ZWQgc3RvcmFnZSBtYXAoTGFzdFBvb2xJZAEAEBAAAAAABNAgRXZlciBpbmNyZWFzaW5nIG51bWJlciBvZiBhbGwgcG9vbHMgY3JlYXRlZCBzbyBmYXIuTFJldmVyc2VQb29sSWRMb29rdXAAAQQFABAEABDcIEEgcmV2ZXJzZSBsb29rdXAgZnJvbSB0aGUgcG9vbCdzIGFjY291bnQgaWQgdG8gaXRzIGlkLgB1ASBUaGlzIGlzIG9ubHkgdXNlZCBmb3Igc2xhc2hpbmcgYW5kIG9uIGF1dG9tYXRpYyB3aXRoZHJhdyB1cGRhdGUuIEluIGFsbCBvdGhlciBpbnN0YW5jZXMsIHRoZSUBIHBvb2wgaWQgaXMgdXNlZCwgYW5kIHRoZSBhY2NvdW50cyBhcmUgZGV0ZXJtaW5pc3RpY2FsbHkgZGVyaXZlZCBmcm9tIGl0LnRDb3VudGVyRm9yUmV2ZXJzZVBvb2xJZExvb2t1cAEAEBAAAAAABKxDb3VudGVyIGZvciB0aGUgcmVsYXRlZCBjb3VudGVkIHN0b3JhZ2UgbWFwQENsYWltUGVybWlzc2lvbnMBAQQFADUEBAIEAQEgTWFwIGZyb20gYSBwb29sIG1lbWJlciBhY2NvdW50IHRvIHRoZWlyIG9wdGVkIGNsYWltIHBlcm1pc3Npb24uARkEAW0HDCBQYWxsZXRJZJEJIHB5L25vcGxzBIQgVGhlIG5vbWluYXRpb24gcG9vbCdzIHBhbGxldCBpZC5ITWF4UG9pbnRzVG9CYWxhbmNlCAQKMB0BIFRoZSBtYXhpbXVtIHBvb2wgcG9pbnRzLXRvLWJhbGFuY2UgcmF0aW8gdGhhdCBhbiBgb3BlbmAgcG9vbCBjYW4gaGF2ZS4AVQEgVGhpcyBpcyBpbXBvcnRhbnQgaW4gdGhlIGV2ZW50IHNsYXNoaW5nIHRha2VzIHBsYWNlIGFuZCB0aGUgcG9vbCdzIHBvaW50cy10by1iYWxhbmNlfCByYXRpbyBiZWNvbWVzIGRpc3Byb3BvcnRpb25hbC4AZQEgTW9yZW92ZXIsIHRoaXMgcmVsYXRlcyB0byB0aGUgYFJld2FyZENvdW50ZXJgIHR5cGUgYXMgd2VsbCwgYXMgdGhlIGFyaXRobWV0aWMgb3BlcmF0aW9uc1UBIGFyZSBhIGZ1bmN0aW9uIG9mIG51bWJlciBvZiBwb2ludHMsIGFuZCBieSBzZXR0aW5nIHRoaXMgdmFsdWUgdG8gZS5nLiAxMCwgeW91IGVuc3VyZWUBIHRoYXQgdGhlIHRvdGFsIG51bWJlciBvZiBwb2ludHMgaW4gdGhlIHN5c3RlbSBhcmUgYXQgbW9zdCAxMCB0aW1lcyB0aGUgdG90YWxfaXNzdWFuY2Ugb2acIHRoZSBjaGFpbiwgaW4gdGhlIGFic29sdXRlIHdvcnNlIGNhc2UuAEkBIEZvciBhIHZhbHVlIG9mIDEwLCB0aGUgdGhyZXNob2xkIHdvdWxkIGJlIGEgcG9vbCBwb2ludHMtdG8tYmFsYW5jZSByYXRpbyBvZiAxMDoxLjEBIFN1Y2ggYSBzY2VuYXJpbyB3b3VsZCBhbHNvIGJlIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBwb29sIGJlaW5nIDkwJSBzbGFzaGVkLjBNYXhVbmJvbmRpbmcQECAAAAAEPQEgVGhlIG1heGltdW0gbnVtYmVyIG9mIHNpbXVsdGFuZW91cyB1bmJvbmRpbmcgY2h1bmtzIHRoYXQgY2FuIGV4aXN0IHBlciBtZW1iZXIuAf0KJwAsRmFzdFVuc3Rha2UBLEZhc3RVbnN0YWtlEBBIZWFkAAAFCwQADMAgVGhlIGN1cnJlbnQgImhlYWQgb2YgdGhlIHF1ZXVlIiBiZWluZyB1bnN0YWtlZC4AKQEgVGhlIGhlYWQgaW4gaXRzZWxmIGNhbiBiZSBhIGJhdGNoIG9mIHVwIHRvIFtgQ29uZmlnOjpCYXRjaFNpemVgXSBzdGFrZXJzLhRRdWV1ZQABBAUAGAQADMAgVGhlIG1hcCBvZiBhbGwgYWNjb3VudHMgd2lzaGluZyB0byBiZSB1bnN0YWtlZC4AOQEgS2VlcHMgdHJhY2sgb2YgYEFjY291bnRJZGAgd2lzaGluZyB0byB1bnN0YWtlIGFuZCBpdCdzIGNvcnJlc3BvbmRpbmcgZGVwb3NpdC48Q291bnRlckZvclF1ZXVlAQAQEAAAAAAErENvdW50ZXIgZm9yIHRoZSByZWxhdGVkIGNvdW50ZWQgc3RvcmFnZSBtYXBMRXJhc1RvQ2hlY2tQZXJCbG9jawEAEBAAAAAAIIwgTnVtYmVyIG9mIGVyYXMgdG8gY2hlY2sgcGVyIGJsb2NrLgA1ASBJZiBzZXQgdG8gMCwgdGhpcyBwYWxsZXQgZG9lcyBhYnNvbHV0ZWx5IG5vdGhpbmcuIENhbm5vdCBiZSBzZXQgdG8gbW9yZSB0aGFukCBbYENvbmZpZzo6TWF4RXJhc1RvQ2hlY2tQZXJCbG9ja2BdLgBlASBCYXNlZCBvbiB0aGUgYW1vdW50IG9mIHdlaWdodCBhdmFpbGFibGUgYXQgW2BQYWxsZXQ6Om9uX2lkbGVgXSwgdXAgdG8gdGhpcyBtYW55IGVyYXMgYXJlXQEgY2hlY2tlZC4gVGhlIGNoZWNraW5nIGlzIHJlcHJlc2VudGVkIGJ5IHVwZGF0aW5nIFtgVW5zdGFrZVJlcXVlc3Q6OmNoZWNrZWRgXSwgd2hpY2ggaXNQIHN0b3JlZCBpbiBbYEhlYWRgXS4BTQQBcQcEHERlcG9zaXQYQADkC1QCAAAAAAAAAAAAAAAIZQEgRGVwb3NpdCB0byB0YWtlIGZvciB1bnN0YWtpbmcsIHRvIG1ha2Ugc3VyZSB3ZSdyZSBhYmxlIHRvIHNsYXNoIHRoZSBpdCBpbiBvcmRlciB0byBjb3ZlcsAgdGhlIGNvc3RzIG9mIHJlc291cmNlcyBvbiB1bnN1Y2Nlc3NmdWwgdW5zdGFrZS4BEQsoAEBQYXJhY2hhaW5zT3JpZ2luAAAAAAAyEHkBIFRoZXJlIGlzIG5vIHdheSB0byByZWdpc3RlciBhbiBvcmlnaW4gdHlwZSBpbiBgY29uc3RydWN0X3J1bnRpbWVgIHdpdGhvdXQgYSBwYWxsZXQgdGhlIG9yaWdpbjAgYmVsb25ncyB0by4AdQEgVGhpcyBtb2R1bGUgZnVsZmlsbHMgb25seSB0aGUgc2luZ2xlIHB1cnBvc2Ugb2YgaG91c2luZyB0aGUgYE9yaWdpbmAgaW4gYGNvbnN0cnVjdF9ydW50aW1lYC40Q29uZmlndXJhdGlvbgE0Q29uZmlndXJhdGlvbgwwQWN0aXZlQ29uZmlnAQAVC0EDAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAZAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAgAAAAIAAAACAAAAAAEAAAABAAAAAQAAAAABAAAAAAAAAAAAAAAQJwAAgLLmDoDDyQGAlpgAAAAAAAAAAAAAAAAABQAAAATIIFRoZSBhY3RpdmUgY29uZmlndXJhdGlvbiBmb3IgdGhlIGN1cnJlbnQgc2Vzc2lvbi44UGVuZGluZ0NvbmZpZ3MBABkLBAAcfCBQZW5kaW5nIGNvbmZpZ3VyYXRpb24gY2hhbmdlcy4AWQEgVGhpcyBpcyBhIGxpc3Qgb2YgY29uZmlndXJhdGlvbiBjaGFuZ2VzLCBlYWNoIHdpdGggYSBzZXNzaW9uIGluZGV4IGF0IHdoaWNoIGl0IHNob3VsZDAgYmUgYXBwbGllZC4AYQEgVGhlIGxpc3QgaXMgc29ydGVkIGFzY2VuZGluZyBieSBzZXNzaW9uIGluZGV4LiBBbHNvLCB0aGlzIGxpc3QgY2FuIG9ubHkgY29udGFpbiBhdCBtb3N0/CAyIGl0ZW1zOiBmb3IgdGhlIG5leHQgc2Vzc2lvbiBhbmQgZm9yIHRoZSBgc2NoZWR1bGVkX3Nlc3Npb25gLlhCeXBhc3NDb25zaXN0ZW5jeUNoZWNrAQAgBAAIYQEgSWYgdGhpcyBpcyBzZXQsIHRoZW4gdGhlIGNvbmZpZ3VyYXRpb24gc2V0dGVycyB3aWxsIGJ5cGFzcyB0aGUgY29uc2lzdGVuY3kgY2hlY2tzLiBUaGlztCBpcyBtZWFudCB0byBiZSB1c2VkIG9ubHkgYXMgdGhlIGxhc3QgcmVzb3J0LgFRBAAAASELMwAsUGFyYXNTaGFyZWQBLFBhcmFzU2hhcmVkEExDdXJyZW50U2Vzc2lvbkluZGV4AQAQEAAAAAAEbCBUaGUgY3VycmVudCBzZXNzaW9uIGluZGV4LlhBY3RpdmVWYWxpZGF0b3JJbmRpY2VzAQAlCwQACAkBIEFsbCB0aGUgdmFsaWRhdG9ycyBhY3RpdmVseSBwYXJ0aWNpcGF0aW5nIGluIHBhcmFjaGFpbiBjb25zZW5zdXMusCBJbmRpY2VzIGFyZSBpbnRvIHRoZSBicm9hZGVyIHZhbGlkYXRvciBzZXQuTEFjdGl2ZVZhbGlkYXRvcktleXMBACkLBAAIVQEgVGhlIHBhcmFjaGFpbiBhdHRlc3RhdGlvbiBrZXlzIG9mIHRoZSB2YWxpZGF0b3JzIGFjdGl2ZWx5IHBhcnRpY2lwYXRpbmcgaW4gcGFyYWNoYWluHQEgY29uc2Vuc3VzLiBUaGlzIHNob3VsZCBiZSB0aGUgc2FtZSBsZW5ndGggYXMgYEFjdGl2ZVZhbGlkYXRvckluZGljZXNgLkxBbGxvd2VkUmVsYXlQYXJlbnRzAQAtCxQAAAAAAARsIEFsbCBhbGxvd2VkIHJlbGF5LXBhcmVudHMuAXUEAAAANAA0UGFyYUluY2x1c2lvbgE0UGFyYUluY2x1c2lvbgQIVjEAAQQFjQI5CwQAFGEBIENhbmRpZGF0ZXMgcGVuZGluZyBhdmFpbGFiaWxpdHkgYnkgYFBhcmFJZGAuIFRoZXkgZm9ybSBhIGNoYWluIHN0YXJ0aW5nIGZyb20gdGhlIGxhdGVzdGwgaW5jbHVkZWQgaGVhZCBvZiB0aGUgcGFyYS5hASBVc2UgYSBkaWZmZXJlbnQgcHJlZml4IHBvc3QtbWlncmF0aW9uIHRvIHYxLCBzaW5jZSB0aGUgdjAgYFBlbmRpbmdBdmFpbGFiaWxpdHlgIHN0b3JhZ2VxASB3b3VsZCBvdGhlcndpc2UgaGF2ZSB0aGUgZXhhY3Qgc2FtZSBwcmVmaXggd2hpY2ggY291bGQgY2F1c2UgdW5kZWZpbmVkIGJlaGF2aW91ciB3aGVuIGRvaW5nPCB0aGUgbWlncmF0aW9uLgF5BAF1BwABQQs1ADBQYXJhSW5oZXJlbnQBMFBhcmFJbmhlcmVudAggSW5jbHVkZWQAAIwEABjsIFdoZXRoZXIgdGhlIHBhcmFzIGluaGVyZW50IHdhcyBpbmNsdWRlZCB3aXRoaW4gdGhpcyBibG9jay4AaQEgVGhlIGBPcHRpb248KCk+YCBpcyBlZmZlY3RpdmVseSBhIGBib29sYCwgYnV0IGl0IG5ldmVyIGhpdHMgc3RvcmFnZSBpbiB0aGUgYE5vbmVgIHZhcmlhbnS8IGR1ZSB0byB0aGUgZ3VhcmFudGVlcyBvZiBGUkFNRSdzIHN0b3JhZ2UgQVBJcy4ASQEgSWYgdGhpcyBpcyBgTm9uZWAgYXQgdGhlIGVuZCBvZiB0aGUgYmxvY2ssIHdlIHBhbmljIGFuZCByZW5kZXIgdGhlIGJsb2NrIGludmFsaWQuME9uQ2hhaW5Wb3RlcwAARQsEAARFASBTY3JhcGVkIG9uIGNoYWluIGRhdGEgZm9yIGV4dHJhY3RpbmcgcmVzb2x2ZWQgZGlzcHV0ZXMgYXMgd2VsbCBhcyBiYWNraW5nIHZvdGVzLgF9BAAAAVkLNgA0UGFyYVNjaGVkdWxlcgE0UGFyYVNjaGVkdWxlchA8VmFsaWRhdG9yR3JvdXBzAQBdCwQAHG0BIEFsbCB0aGUgdmFsaWRhdG9yIGdyb3Vwcy4gT25lIGZvciBlYWNoIGNvcmUuIEluZGljZXMgYXJlIGludG8gYEFjdGl2ZVZhbGlkYXRvcnNgIC0gbm90IHRoZW0BIGJyb2FkZXIgc2V0IG9mIFBvbGthZG90IHZhbGlkYXRvcnMsIGJ1dCBpbnN0ZWFkIGp1c3QgdGhlIHN1YnNldCB1c2VkIGZvciBwYXJhY2hhaW5zIGR1cmluZzggdGhpcyBzZXNzaW9uLgBJASBCb3VuZDogVGhlIG51bWJlciBvZiBjb3JlcyBpcyB0aGUgc3VtIG9mIHRoZSBudW1iZXJzIG9mIHBhcmFjaGFpbnMgYW5kIHBhcmF0aHJlYWRpASBtdWx0aXBsZXhlcnMuIFJlYXNvbmFibHksIDEwMC0xMDAwLiBUaGUgZG9taW5hbnQgZmFjdG9yIGlzIHRoZSBudW1iZXIgb2YgdmFsaWRhdG9yczogc2FmZVAgdXBwZXIgYm91bmQgYXQgMTBrLkRBdmFpbGFiaWxpdHlDb3JlcwEAYQsEABhxASBPbmUgZW50cnkgZm9yIGVhY2ggYXZhaWxhYmlsaXR5IGNvcmUuIFRoZSBpJ3RoIHBhcmFjaGFpbiBiZWxvbmdzIHRvIHRoZSBpJ3RoIGNvcmUsIHdpdGggdGhl8CByZW1haW5pbmcgY29yZXMgYWxsIGJlaW5nIG9uIGRlbWFuZCBwYXJhY2hhaW4gbXVsdGlwbGV4ZXJzLgDYIEJvdW5kZWQgYnkgdGhlIG1heGltdW0gb2YgZWl0aGVyIG9mIHRoZXNlIHR3byB2YWx1ZXM65CAgICogVGhlIG51bWJlciBvZiBwYXJhY2hhaW5zIGFuZCBwYXJhdGhyZWFkIG11bHRpcGxleGVyc0UBICAgKiBUaGUgbnVtYmVyIG9mIHZhbGlkYXRvcnMgZGl2aWRlZCBieSBgY29uZmlndXJhdGlvbi5tYXhfdmFsaWRhdG9yc19wZXJfY29yZWAuRFNlc3Npb25TdGFydEJsb2NrAQAQEAAAAAAcaQEgVGhlIGJsb2NrIG51bWJlciB3aGVyZSB0aGUgc2Vzc2lvbiBzdGFydCBvY2N1cnJlZC4gVXNlZCB0byB0cmFjayBob3cgbWFueSBncm91cCByb3RhdGlvbnM8IGhhdmUgb2NjdXJyZWQuAFUBIE5vdGUgdGhhdCBpbiB0aGUgY29udGV4dCBvZiBwYXJhY2hhaW5zIG1vZHVsZXMgdGhlIHNlc3Npb24gY2hhbmdlIGlzIHNpZ25hbGVkIGR1cmluZ2EBIHRoZSBibG9jayBhbmQgZW5hY3RlZCBhdCB0aGUgZW5kIG9mIHRoZSBibG9jayAoYXQgdGhlIGZpbmFsaXphdGlvbiBzdGFnZSwgdG8gYmUgZXhhY3QpLlkBIFRodXMgZm9yIGFsbCBpbnRlbnRzIGFuZCBwdXJwb3NlcyB0aGUgZWZmZWN0IG9mIHRoZSBzZXNzaW9uIGNoYW5nZSBpcyBvYnNlcnZlZCBhdCB0aGVlASBibG9jayBmb2xsb3dpbmcgdGhlIHNlc3Npb24gY2hhbmdlLCBibG9jayBudW1iZXIgb2Ygd2hpY2ggd2Ugc2F2ZSBpbiB0aGlzIHN0b3JhZ2UgdmFsdWUuKENsYWltUXVldWUBAHELBAAMWQEgT25lIGVudHJ5IGZvciBlYWNoIGF2YWlsYWJpbGl0eSBjb3JlLiBUaGUgYFZlY0RlcXVlYCByZXByZXNlbnRzIHRoZSBhc3NpZ25tZW50cyB0byBiZVEBIHNjaGVkdWxlZCBvbiB0aGF0IGNvcmUuIFRoZSB2YWx1ZSBjb250YWluZWQgaGVyZSB3aWxsIG5vdCBiZSB2YWxpZCBhZnRlciB0aGUgZW5kIG9maQEgYSBibG9jay4gUnVudGltZSBBUElzIHNob3VsZCBiZSB1c2VkIHRvIGRldGVybWluZSBzY2hlZHVsZWQgY29yZXMgZm9yIHRoZSB1cGNvbWluZyBibG9jay4AAAAANwAUUGFyYXMBFFBhcmFzVEBQdmZBY3RpdmVWb3RlTWFwAAEEBbkEgQsEABC0IEFsbCBjdXJyZW50bHkgYWN0aXZlIFBWRiBwcmUtY2hlY2tpbmcgdm90ZXMuACwgSW52YXJpYW50OnUBIC0gVGhlcmUgYXJlIG5vIFBWRiBwcmUtY2hlY2tpbmcgdm90ZXMgdGhhdCBleGlzdHMgaW4gbGlzdCBidXQgbm90IGluIHRoZSBzZXQgYW5kIHZpY2UgdmVyc2EuRFB2ZkFjdGl2ZVZvdGVMaXN0AQCRCwQABDUBIFRoZSBsaXN0IG9mIGFsbCBjdXJyZW50bHkgYWN0aXZlIFBWRiB2b3Rlcy4gQXV4aWxpYXJ5IHRvIGBQdmZBY3RpdmVWb3RlTWFwYC4oUGFyYWNoYWlucwEAlQsEABBpASBBbGwgbGVhc2UgaG9sZGluZyBwYXJhY2hhaW5zLiBPcmRlcmVkIGFzY2VuZGluZyBieSBgUGFyYUlkYC4gT24gZGVtYW5kIHBhcmFjaGFpbnMgYXJlIG5vdCggaW5jbHVkZWQuAOggQ29uc2lkZXIgdXNpbmcgdGhlIFtgUGFyYWNoYWluc0NhY2hlYF0gdHlwZSBvZiBtb2RpZnlpbmcuOFBhcmFMaWZlY3ljbGVzAAEEBY0CmQsEAAS8IFRoZSBjdXJyZW50IGxpZmVjeWNsZSBvZiBhIGFsbCBrbm93biBQYXJhIElEcy4USGVhZHMAAQQFjQLZBAQABKAgVGhlIGhlYWQtZGF0YSBvZiBldmVyeSByZWdpc3RlcmVkIHBhcmEuRE1vc3RSZWNlbnRDb250ZXh0AAEEBY0CEAQABCkBIFRoZSBjb250ZXh0IChyZWxheS1jaGFpbiBibG9jayBudW1iZXIpIG9mIHRoZSBtb3N0IHJlY2VudCBwYXJhY2hhaW4gaGVhZC48Q3VycmVudENvZGVIYXNoAAEEBY0CuQQEAAy0IFRoZSB2YWxpZGF0aW9uIGNvZGUgaGFzaCBvZiBldmVyeSBsaXZlIHBhcmEuAOQgQ29ycmVzcG9uZGluZyBjb2RlIGNhbiBiZSByZXRyaWV2ZWQgd2l0aCBbYENvZGVCeUhhc2hgXS4wUGFzdENvZGVIYXNoAAEEBZ0LuQQEABBhASBBY3R1YWwgcGFzdCBjb2RlIGhhc2gsIGluZGljYXRlZCBieSB0aGUgcGFyYSBpZCBhcyB3ZWxsIGFzIHRoZSBibG9jayBudW1iZXIgYXQgd2hpY2ggaXREIGJlY2FtZSBvdXRkYXRlZC4A5CBDb3JyZXNwb25kaW5nIGNvZGUgY2FuIGJlIHJldHJpZXZlZCB3aXRoIFtgQ29kZUJ5SGFzaGBdLjBQYXN0Q29kZU1ldGEBAQQFjQKhCwgAAAxJASBQYXN0IGNvZGUgb2YgcGFyYWNoYWlucy4gVGhlIHBhcmFjaGFpbnMgdGhlbXNlbHZlcyBtYXkgbm90IGJlIHJlZ2lzdGVyZWQgYW55bW9yZSxJASBidXQgd2UgYWxzbyBrZWVwIHRoZWlyIGNvZGUgb24tY2hhaW4gZm9yIHRoZSBzYW1lIGFtb3VudCBvZiB0aW1lIGFzIG91dGRhdGVkIGNvZGWwIHRvIGtlZXAgaXQgYXZhaWxhYmxlIGZvciBhcHByb3ZhbCBjaGVja2Vycy48UGFzdENvZGVQcnVuaW5nAQCtCwQAGGkBIFdoaWNoIHBhcmFzIGhhdmUgcGFzdCBjb2RlIHRoYXQgbmVlZHMgcHJ1bmluZyBhbmQgdGhlIHJlbGF5LWNoYWluIGJsb2NrIGF0IHdoaWNoIHRoZSBjb2RlaQEgd2FzIHJlcGxhY2VkLiBOb3RlIHRoYXQgdGhpcyBpcyB0aGUgYWN0dWFsIGhlaWdodCBvZiB0aGUgaW5jbHVkZWQgYmxvY2ssIG5vdCB0aGUgZXhwZWN0ZWQ9ASBoZWlnaHQgYXQgd2hpY2ggdGhlIGNvZGUgdXBncmFkZSB3b3VsZCBiZSBhcHBsaWVkLCBhbHRob3VnaCB0aGV5IG1heSBiZSBlcXVhbC5tASBUaGlzIGlzIHRvIGVuc3VyZSB0aGUgZW50aXJlIGFjY2VwdGFuY2UgcGVyaW9kIGlzIGNvdmVyZWQsIG5vdCBhbiBvZmZzZXQgYWNjZXB0YW5jZSBwZXJpb2RtASBzdGFydGluZyBmcm9tIHRoZSB0aW1lIGF0IHdoaWNoIHRoZSBwYXJhY2hhaW4gcGVyY2VpdmVzIGEgY29kZSB1cGdyYWRlIGFzIGhhdmluZyBvY2N1cnJlZC5VASBNdWx0aXBsZSBlbnRyaWVzIGZvciBhIHNpbmdsZSBwYXJhIGFyZSBwZXJtaXR0ZWQuIE9yZGVyZWQgYXNjZW5kaW5nIGJ5IGJsb2NrIG51bWJlci5IRnV0dXJlQ29kZVVwZ3JhZGVzAAEEBY0CEAQAED0BIFRoZSBibG9jayBudW1iZXIgYXQgd2hpY2ggdGhlIHBsYW5uZWQgY29kZSBjaGFuZ2UgaXMgZXhwZWN0ZWQgZm9yIGEgcGFyYWNoYWluLgBlASBUaGUgY2hhbmdlIHdpbGwgYmUgYXBwbGllZCBhZnRlciB0aGUgZmlyc3QgcGFyYWJsb2NrIGZvciB0aGlzIElEIGluY2x1ZGVkIHdoaWNoIGV4ZWN1dGVzGQEgaW4gdGhlIGNvbnRleHQgb2YgYSByZWxheSBjaGFpbiBibG9jayB3aXRoIGEgbnVtYmVyID49IGBleHBlY3RlZF9hdGAuUEZ1dHVyZUNvZGVVcGdyYWRlc0F0AQCtCwQAIKwgVGhlIGxpc3Qgb2YgdXBjb21pbmcgZnV0dXJlIGNvZGUgdXBncmFkZXMuAG0BIEVhY2ggaXRlbSBpcyBhIHBhaXIgb2YgdGhlIHBhcmFjaGFpbiBhbmQgdGhlIGV4cGVjdGVkIGJsb2NrIGF0IHdoaWNoIHRoZSB1cGdyYWRlIHNob3VsZCBiZVEBIGFwcGxpZWQuIFRoZSB1cGdyYWRlIHdpbGwgYmUgYXBwbGllZCBhdCB0aGUgZ2l2ZW4gcmVsYXkgY2hhaW4gYmxvY2suIEluIGNvbnRyYXN0IHRvdQEgW2BGdXR1cmVDb2RlVXBncmFkZXNgXSB0aGlzIGNvZGUgdXBncmFkZSB3aWxsIGJlIGFwcGxpZWQgcmVnYXJkbGVzcyB0aGUgcGFyYWNoYWluIG1ha2luZyBhbnlEIHByb2dyZXNzIG9yIG5vdC4AjCBPcmRlcmVkIGFzY2VuZGluZyBieSBibG9jayBudW1iZXIuOEZ1dHVyZUNvZGVIYXNoAAEEBY0CuQQEAAycIFRoZSBhY3R1YWwgZnV0dXJlIGNvZGUgaGFzaCBvZiBhIHBhcmEuAOQgQ29ycmVzcG9uZGluZyBjb2RlIGNhbiBiZSByZXRyaWV2ZWQgd2l0aCBbYENvZGVCeUhhc2hgXS5QVXBncmFkZUdvQWhlYWRTaWduYWwAAQQFjQKxCwQAKHUBIFRoaXMgaXMgdXNlZCBieSB0aGUgcmVsYXktY2hhaW4gdG8gY29tbXVuaWNhdGUgdG8gYSBwYXJhY2hhaW4gYSBnby1haGVhZCB3aXRoIGluIHRoZSB1cGdyYWRlLCBwcm9jZWR1cmUuAHUBIFRoaXMgdmFsdWUgaXMgYWJzZW50IHdoZW4gdGhlcmUgYXJlIG5vIHVwZ3JhZGVzIHNjaGVkdWxlZCBvciBkdXJpbmcgdGhlIHRpbWUgdGhlIHJlbGF5IGNoYWluVQEgcGVyZm9ybXMgdGhlIGNoZWNrcy4gSXQgaXMgc2V0IGF0IHRoZSBmaXJzdCByZWxheS1jaGFpbiBibG9jayB3aGVuIHRoZSBjb3JyZXNwb25kaW5ndQEgcGFyYWNoYWluIGNhbiBzd2l0Y2ggaXRzIHVwZ3JhZGUgZnVuY3Rpb24uIEFzIHNvb24gYXMgdGhlIHBhcmFjaGFpbidzIGJsb2NrIGlzIGluY2x1ZGVkLCB0aGVwIHZhbHVlIGdldHMgcmVzZXQgdG8gYE5vbmVgLgBlASBOT1RFIHRoYXQgdGhpcyBmaWVsZCBpcyB1c2VkIGJ5IHBhcmFjaGFpbnMgdmlhIG1lcmtsZSBzdG9yYWdlIHByb29mcywgdGhlcmVmb3JlIGNoYW5naW5nxCB0aGUgZm9ybWF0IHdpbGwgcmVxdWlyZSBtaWdyYXRpb24gb2YgcGFyYWNoYWlucy5gVXBncmFkZVJlc3RyaWN0aW9uU2lnbmFsAAEEBY0CtQsEACRpASBUaGlzIGlzIHVzZWQgYnkgdGhlIHJlbGF5LWNoYWluIHRvIGNvbW11bmljYXRlIHRoYXQgdGhlcmUgYXJlIHJlc3RyaWN0aW9ucyBmb3IgcGVyZm9ybWluZ3wgYW4gdXBncmFkZSBmb3IgdGhpcyBwYXJhY2hhaW4uAFkBIFRoaXMgbWF5IGJlIGEgYmVjYXVzZSB0aGUgcGFyYWNoYWluIHdhaXRzIGZvciB0aGUgdXBncmFkZSBjb29sZG93biB0byBleHBpcmUuIEFub3RoZXJtASBwb3RlbnRpYWwgdXNlIGNhc2UgaXMgd2hlbiB3ZSB3YW50IHRvIHBlcmZvcm0gc29tZSBtYWludGVuYW5jZSAoc3VjaCBhcyBzdG9yYWdlIG1pZ3JhdGlvbingIHdlIGNvdWxkIHJlc3RyaWN0IHVwZ3JhZGVzIHRvIG1ha2UgdGhlIHByb2Nlc3Mgc2ltcGxlci4AZQEgTk9URSB0aGF0IHRoaXMgZmllbGQgaXMgdXNlZCBieSBwYXJhY2hhaW5zIHZpYSBtZXJrbGUgc3RvcmFnZSBwcm9vZnMsIHRoZXJlZm9yZSBjaGFuZ2luZ8QgdGhlIGZvcm1hdCB3aWxsIHJlcXVpcmUgbWlncmF0aW9uIG9mIHBhcmFjaGFpbnMuQFVwZ3JhZGVDb29sZG93bnMBAK0LBAAMUQEgVGhlIGxpc3Qgb2YgcGFyYWNoYWlucyB0aGF0IGFyZSBhd2FpdGluZyBmb3IgdGhlaXIgdXBncmFkZSByZXN0cmljdGlvbiB0byBjb29sZG93bi4AjCBPcmRlcmVkIGFzY2VuZGluZyBieSBibG9jayBudW1iZXIuQFVwY29taW5nVXBncmFkZXMBAK0LBAAYkCBUaGUgbGlzdCBvZiB1cGNvbWluZyBjb2RlIHVwZ3JhZGVzLgBxASBFYWNoIGl0ZW0gaXMgYSBwYWlyIG9mIHdoaWNoIHBhcmEgcGVyZm9ybXMgYSBjb2RlIHVwZ3JhZGUgYW5kIGF0IHdoaWNoIHJlbGF5LWNoYWluIGJsb2NrIGl0QCBpcyBleHBlY3RlZCBhdC4AjCBPcmRlcmVkIGFzY2VuZGluZyBieSBibG9jayBudW1iZXIuMEFjdGlvbnNRdWV1ZQEBBAUQlQsEAAQVASBUaGUgYWN0aW9ucyB0byBwZXJmb3JtIGR1cmluZyB0aGUgc3RhcnQgb2YgYSBzcGVjaWZpYyBzZXNzaW9uIGluZGV4LlBVcGNvbWluZ1BhcmFzR2VuZXNpcwABBAWNAv0GBAAQoCBVcGNvbWluZyBwYXJhcyBpbnN0YW50aWF0aW9uIGFyZ3VtZW50cy4AZQEgTk9URSB0aGF0IGFmdGVyIFBWRiBwcmUtY2hlY2tpbmcgaXMgZW5hYmxlZCB0aGUgcGFyYSBnZW5lc2lzIGFyZyB3aWxsIGhhdmUgaXQncyBjb2RlIHNldGEBIHRvIGVtcHR5LiBJbnN0ZWFkLCB0aGUgY29kZSB3aWxsIGJlIHNhdmVkIGludG8gdGhlIHN0b3JhZ2UgcmlnaHQgYXdheSB2aWEgYENvZGVCeUhhc2hgLjhDb2RlQnlIYXNoUmVmcwEBBAa5BBAQAAAAAAQpASBUaGUgbnVtYmVyIG9mIHJlZmVyZW5jZSBvbiB0aGUgdmFsaWRhdGlvbiBjb2RlIGluIFtgQ29kZUJ5SGFzaGBdIHN0b3JhZ2UuKENvZGVCeUhhc2gAAQQGuQTVBAQAEJAgVmFsaWRhdGlvbiBjb2RlIHN0b3JlZCBieSBpdHMgaGFzaC4AMQEgVGhpcyBzdG9yYWdlIGlzIGNvbnNpc3RlbnQgd2l0aCBbYEZ1dHVyZUNvZGVIYXNoYF0sIFtgQ3VycmVudENvZGVIYXNoYF0gYW5kSCBbYFBhc3RDb2RlSGFzaGBdLgEJBQGFBwRAVW5zaWduZWRQcmlvcml0eTAg//////////8AAbkLOAAsSW5pdGlhbGl6ZXIBLEluaXRpYWxpemVyCDhIYXNJbml0aWFsaXplZAAAjAQAICEBIFdoZXRoZXIgdGhlIHBhcmFjaGFpbnMgbW9kdWxlcyBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQgd2l0aGluIHRoaXMgYmxvY2suACUBIFNlbWFudGljYWxseSBhIGBib29sYCwgYnV0IHRoaXMgZ3VhcmFudGVlcyBpdCBzaG91bGQgbmV2ZXIgaGl0IHRoZSB0cmllLGkBIGFzIHRoaXMgaXMgY2xlYXJlZCBpbiBgb25fZmluYWxpemVgIGFuZCBGcmFtZSBvcHRpbWl6ZXMgYE5vbmVgIHZhbHVlcyB0byBiZSBlbXB0eSB2YWx1ZXMuAHEBIEFzIGEgYGJvb2xgLCBgc2V0KGZhbHNlKWAgYW5kIGByZW1vdmUoKWAgYm90aCBsZWFkIHRvIHRoZSBuZXh0IGBnZXQoKWAgYmVpbmcgZmFsc2UsIGJ1dCBvbmV1ASBvZiB0aGVtIHdyaXRlcyB0byB0aGUgdHJpZSBhbmQgb25lIGRvZXMgbm90LiBUaGlzIGNvbmZ1c2lvbiBtYWtlcyBgT3B0aW9uPCgpPmAgbW9yZSBzdWl0YWJsZZAgZm9yIHRoZSBzZW1hbnRpY3Mgb2YgdGhpcyB2YXJpYWJsZS5YQnVmZmVyZWRTZXNzaW9uQ2hhbmdlcwEAvQsEABxZASBCdWZmZXJlZCBzZXNzaW9uIGNoYW5nZXMgYWxvbmcgd2l0aCB0aGUgYmxvY2sgbnVtYmVyIGF0IHdoaWNoIHRoZXkgc2hvdWxkIGJlIGFwcGxpZWQuAF0BIFR5cGljYWxseSB0aGlzIHdpbGwgYmUgZW1wdHkgb3Igb25lIGVsZW1lbnQgbG9uZy4gQXBhcnQgZnJvbSB0aGF0IHRoaXMgaXRlbSBuZXZlciBoaXRzNCB0aGUgc3RvcmFnZS4AaQEgSG93ZXZlciB0aGlzIGlzIGEgYFZlY2AgcmVnYXJkbGVzcyB0byBoYW5kbGUgdmFyaW91cyBlZGdlIGNhc2VzIHRoYXQgbWF5IG9jY3VyIGF0IHJ1bnRpbWXAIHVwZ3JhZGUgYm91bmRhcmllcyBvciBpZiBnb3Zlcm5hbmNlIGludGVydmVuZXMuAREFAAAAOQAMRG1wAQxEbXAMVERvd253YXJkTWVzc2FnZVF1ZXVlcwEBBAWNAsULBAAE0CBUaGUgZG93bndhcmQgbWVzc2FnZXMgYWRkcmVzc2VkIGZvciBhIGNlcnRhaW4gcGFyYS5kRG93bndhcmRNZXNzYWdlUXVldWVIZWFkcwEBBAWNAjSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcJQEgQSBtYXBwaW5nIHRoYXQgc3RvcmVzIHRoZSBkb3dud2FyZCBtZXNzYWdlIHF1ZXVlIE1RQyBoZWFkIGZvciBlYWNoIHBhcmEuAJAgRWFjaCBsaW5rIGluIHRoaXMgY2hhaW4gaGFzIGEgZm9ybTp4IGAocHJldl9oZWFkLCBCLCBIKE0pKWAsIHdoZXJl6CAtIGBwcmV2X2hlYWRgOiBpcyB0aGUgcHJldmlvdXMgaGVhZCBoYXNoIG9yIHplcm8gaWYgbm9uZS4hASAtIGBCYDogaXMgdGhlIHJlbGF5LWNoYWluIGJsb2NrIG51bWJlciBpbiB3aGljaCBhIG1lc3NhZ2Ugd2FzIGFwcGVuZGVkLtQgLSBgSChNKWA6IGlzIHRoZSBoYXNoIG9mIHRoZSBtZXNzYWdlIGJlaW5nIGFwcGVuZGVkLkREZWxpdmVyeUZlZUZhY3RvcgEBBAWNAtEGQAAAZKeztuANAAAAAAAAAAAExCBUaGUgZmFjdG9yIHRvIG11bHRpcGx5IHRoZSBiYXNlIGRlbGl2ZXJ5IGZlZSBieS4AAAAAOgAQSHJtcAEQSHJtcDBcSHJtcE9wZW5DaGFubmVsUmVxdWVzdHMAAQQFGQXNCwQAGLwgVGhlIHNldCBvZiBwZW5kaW5nIEhSTVAgb3BlbiBjaGFubmVsIHJlcXVlc3RzLgDAIFRoZSBzZXQgaXMgYWNjb21wYW5pZWQgYnkgYSBsaXN0IGZvciBpdGVyYXRpb24uACwgSW52YXJpYW50Oj0BIC0gVGhlcmUgYXJlIG5vIGNoYW5uZWxzIHRoYXQgZXhpc3RzIGluIGxpc3QgYnV0IG5vdCBpbiB0aGUgc2V0IGFuZCB2aWNlIHZlcnNhLmxIcm1wT3BlbkNoYW5uZWxSZXF1ZXN0c0xpc3QBANELBAAAbEhybXBPcGVuQ2hhbm5lbFJlcXVlc3RDb3VudAEBBAWNAhAQAAAAAAxlASBUaGlzIG1hcHBpbmcgdHJhY2tzIGhvdyBtYW55IG9wZW4gY2hhbm5lbCByZXF1ZXN0cyBhcmUgaW5pdGlhdGVkIGJ5IGEgZ2l2ZW4gc2VuZGVyIHBhcmEuWQEgSW52YXJpYW50OiBgSHJtcE9wZW5DaGFubmVsUmVxdWVzdHNgIHNob3VsZCBjb250YWluIHRoZSBzYW1lIG51bWJlciBvZiBpdGVtcyB0aGF0IGhhcwUBIGAoWCwgXylgIGFzIHRoZSBudW1iZXIgb2YgYEhybXBPcGVuQ2hhbm5lbFJlcXVlc3RDb3VudGAgZm9yIGBYYC58SHJtcEFjY2VwdGVkQ2hhbm5lbFJlcXVlc3RDb3VudAEBBAWNAhAQAAAAAAxxASBUaGlzIG1hcHBpbmcgdHJhY2tzIGhvdyBtYW55IG9wZW4gY2hhbm5lbCByZXF1ZXN0cyB3ZXJlIGFjY2VwdGVkIGJ5IGEgZ2l2ZW4gcmVjaXBpZW50IHBhcmEubQEgSW52YXJpYW50OiBgSHJtcE9wZW5DaGFubmVsUmVxdWVzdHNgIHNob3VsZCBjb250YWluIHRoZSBzYW1lIG51bWJlciBvZiBpdGVtcyBgKF8sIFgpYCB3aXRoVQEgYGNvbmZpcm1lZGAgc2V0IHRvIHRydWUsIGFzIHRoZSBudW1iZXIgb2YgYEhybXBBY2NlcHRlZENoYW5uZWxSZXF1ZXN0Q291bnRgIGZvciBgWGAuYEhybXBDbG9zZUNoYW5uZWxSZXF1ZXN0cwABBAUZBYwEABxxASBBIHNldCBvZiBwZW5kaW5nIEhSTVAgY2xvc2UgY2hhbm5lbCByZXF1ZXN0cyB0aGF0IGFyZSBnb2luZyB0byBiZSBjbG9zZWQgZHVyaW5nIHRoZSBzZXNzaW9uIQEgY2hhbmdlLiBVc2VkIGZvciBjaGVja2luZyBpZiBhIGdpdmVuIGNoYW5uZWwgaXMgcmVnaXN0ZXJlZCBmb3IgY2xvc3VyZS4AwCBUaGUgc2V0IGlzIGFjY29tcGFuaWVkIGJ5IGEgbGlzdCBmb3IgaXRlcmF0aW9uLgAsIEludmFyaWFudDo9ASAtIFRoZXJlIGFyZSBubyBjaGFubmVscyB0aGF0IGV4aXN0cyBpbiBsaXN0IGJ1dCBub3QgaW4gdGhlIHNldCBhbmQgdmljZSB2ZXJzYS5wSHJtcENsb3NlQ2hhbm5lbFJlcXVlc3RzTGlzdAEA0QsEAAA4SHJtcFdhdGVybWFya3MAAQQFjQIQBAAQuCBUaGUgSFJNUCB3YXRlcm1hcmsgYXNzb2NpYXRlZCB3aXRoIGVhY2ggcGFyYS4sIEludmFyaWFudDpVASAtIGVhY2ggcGFyYSBgUGAgdXNlZCBoZXJlIGFzIGEga2V5IHNob3VsZCBzYXRpc2Z5IGBQYXJhczo6aXNfdmFsaWRfcGFyYShQKWAgd2l0aGluIGEsICAgc2Vzc2lvbi4wSHJtcENoYW5uZWxzAAEEBRkF1QsEAAy0IEhSTVAgY2hhbm5lbCBkYXRhIGFzc29jaWF0ZWQgd2l0aCBlYWNoIHBhcmEuLCBJbnZhcmlhbnQ6dQEgLSBlYWNoIHBhcnRpY2lwYW50IGluIHRoZSBjaGFubmVsIHNob3VsZCBzYXRpc2Z5IGBQYXJhczo6aXNfdmFsaWRfcGFyYShQKWAgd2l0aGluIGEgc2Vzc2lvbi5gSHJtcEluZ3Jlc3NDaGFubmVsc0luZGV4AQEEBY0ClQsEADRxASBJbmdyZXNzL2VncmVzcyBpbmRleGVzIGFsbG93IHRvIGZpbmQgYWxsIHRoZSBzZW5kZXJzIGFuZCByZWNlaXZlcnMgZ2l2ZW4gdGhlIG9wcG9zaXRlIHNpZGUuFCBJLmUuACEBIChhKSBpbmdyZXNzIGluZGV4IGFsbG93cyB0byBmaW5kIGFsbCB0aGUgc2VuZGVycyBmb3IgYSBnaXZlbiByZWNpcGllbnQuHQEgKGIpIGVncmVzcyBpbmRleCBhbGxvd3MgdG8gZmluZCBhbGwgdGhlIHJlY2lwaWVudHMgZm9yIGEgZ2l2ZW4gc2VuZGVyLgAwIEludmFyaWFudHM6UQEgLSBmb3IgZWFjaCBpbmdyZXNzIGluZGV4IGVudHJ5IGZvciBgUGAgZWFjaCBpdGVtIGBJYCBpbiB0aGUgaW5kZXggc2hvdWxkIHByZXNlbnQgaW54ICAgYEhybXBDaGFubmVsc2AgYXMgYChJLCBQKWAuTQEgLSBmb3IgZWFjaCBlZ3Jlc3MgaW5kZXggZW50cnkgZm9yIGBQYCBlYWNoIGl0ZW0gYEVgIGluIHRoZSBpbmRleCBzaG91bGQgcHJlc2VudCBpbnggICBgSHJtcENoYW5uZWxzYCBhcyBgKFAsIEUpYC4BASAtIHRoZXJlIHNob3VsZCBiZSBubyBvdGhlciBkYW5nbGluZyBjaGFubmVscyBpbiBgSHJtcENoYW5uZWxzYC5oIC0gdGhlIHZlY3RvcnMgYXJlIHNvcnRlZC5cSHJtcEVncmVzc0NoYW5uZWxzSW5kZXgBAQQFjQKVCwQAAExIcm1wQ2hhbm5lbENvbnRlbnRzAQEEBRkF2QsEAAisIFN0b3JhZ2UgZm9yIHRoZSBtZXNzYWdlcyBmb3IgZWFjaCBjaGFubmVsLmUBIEludmFyaWFudDogY2Fubm90IGJlIG5vbi1lbXB0eSBpZiB0aGUgY29ycmVzcG9uZGluZyBjaGFubmVsIGluIGBIcm1wQ2hhbm5lbHNgIGlzIGBOb25lYC5ISHJtcENoYW5uZWxEaWdlc3RzAQEEBY0C4QsEABhpASBNYWludGFpbnMgYSBtYXBwaW5nIHRoYXQgY2FuIGJlIHVzZWQgdG8gYW5zd2VyIHRoZSBxdWVzdGlvbjogV2hhdCBwYXJhcyBzZW50IGEgbWVzc2FnZSBhdOQgdGhlIGdpdmVuIGJsb2NrIG51bWJlciBmb3IgYSBnaXZlbiByZWNlaXZlci4gSW52YXJpYW50czqoIC0gVGhlIGlubmVyIGBWZWM8UGFyYUlkPmAgaXMgbmV2ZXIgZW1wdHku6CAtIFRoZSBpbm5lciBgVmVjPFBhcmFJZD5gIGNhbm5vdCBzdG9yZSB0d28gc2FtZSBgUGFyYUlkYC5tASAtIFRoZSBvdXRlciB2ZWN0b3IgaXMgc29ydGVkIGFzY2VuZGluZyBieSBibG9jayBudW1iZXIgYW5kIGNhbm5vdCBzdG9yZSB0d28gaXRlbXMgd2l0aCB0aGVUICAgc2FtZSBibG9jayBudW1iZXIuARUFAYkHAAHpCzwAPFBhcmFTZXNzaW9uSW5mbwE8UGFyYVNlc3Npb25JbmZvFFBBc3NpZ25tZW50S2V5c1Vuc2FmZQEA7QsEAAykIEFzc2lnbm1lbnQga2V5cyBmb3IgdGhlIGN1cnJlbnQgc2Vzc2lvbi5tASBOb3RlIHRoYXQgdGhpcyBBUEkgaXMgcHJpdmF0ZSBkdWUgdG8gaXQgYmVpbmcgcHJvbmUgdG8gJ29mZi1ieS1vbmUnIGF0IHNlc3Npb24gYm91bmRhcmllcy6sIFdoZW4gaW4gZG91YnQsIHVzZSBgU2Vzc2lvbnNgIEFQSSBpbnN0ZWFkLlRFYXJsaWVzdFN0b3JlZFNlc3Npb24BABAQAAAAAAQBASBUaGUgZWFybGllc3Qgc2Vzc2lvbiBmb3Igd2hpY2ggcHJldmlvdXMgc2Vzc2lvbiBpbmZvIGlzIHN0b3JlZC4gU2Vzc2lvbnMAAQQGEPELBAAMpCBTZXNzaW9uIGluZm9ybWF0aW9uIGluIGEgcm9sbGluZyB3aW5kb3cuNQEgU2hvdWxkIGhhdmUgYW4gZW50cnkgaW4gcmFuZ2UgYEVhcmxpZXN0U3RvcmVkU2Vzc2lvbi4uPUN1cnJlbnRTZXNzaW9uSW5kZXhgLnUBIERvZXMgbm90IGhhdmUgYW55IGVudHJpZXMgYmVmb3JlIHRoZSBzZXNzaW9uIGluZGV4IGluIHRoZSBmaXJzdCBzZXNzaW9uIGNoYW5nZSBub3RpZmljYXRpb24uLEFjY291bnRLZXlzAAEEBhDRAQQABHEBIFRoZSB2YWxpZGF0b3IgYWNjb3VudCBrZXlzIG9mIHRoZSB2YWxpZGF0b3JzIGFjdGl2ZWx5IHBhcnRpY2lwYXRpbmcgaW4gcGFyYWNoYWluIGNvbnNlbnN1cy5UU2Vzc2lvbkV4ZWN1dG9yUGFyYW1zAAEEBhBZBAQABMQgRXhlY3V0b3IgcGFyYW1ldGVyIHNldCBmb3IgYSBnaXZlbiBzZXNzaW9uIGluZGV4AAAAAD0ANFBhcmFzRGlzcHV0ZXMBNFBhcmFzRGlzcHV0ZXMURExhc3RQcnVuZWRTZXNzaW9uAAAQBAAIAQEgVGhlIGxhc3QgcHJ1bmVkIHNlc3Npb24sIGlmIGFueS4gQWxsIGRhdGEgc3RvcmVkIGJ5IHRoaXMgbW9kdWxlVCByZWZlcmVuY2VzIHNlc3Npb25zLiBEaXNwdXRlcwABCAUC/QsBDAQABAUBIEFsbCBvbmdvaW5nIG9yIGNvbmNsdWRlZCBkaXNwdXRlcyBmb3IgdGhlIGxhc3Qgc2V2ZXJhbCBzZXNzaW9ucy5EQmFja2Vyc09uRGlzcHV0ZXMAAQgFAv0LBQwEAAicIEJhY2tpbmcgdm90ZXMgc3RvcmVkIGZvciBlYWNoIGRpc3B1dGUujCBUaGlzIHN0b3JhZ2UgaXMgdXNlZCBmb3Igc2xhc2hpbmcuIEluY2x1ZGVkAAEIBQL9CxAEAAhFASBBbGwgaW5jbHVkZWQgYmxvY2tzIG9uIHRoZSBjaGFpbiwgYXMgd2VsbCBhcyB0aGUgYmxvY2sgbnVtYmVyIGluIHRoaXMgY2hhaW4gdGhhdFkBIHNob3VsZCBiZSByZXZlcnRlZCBiYWNrIHRvIGlmIHRoZSBjYW5kaWRhdGUgaXMgZGlzcHV0ZWQgYW5kIGRldGVybWluZWQgdG8gYmUgaW52YWxpZC4YRnJvemVuAQBhAgQAEBEBIFdoZXRoZXIgdGhlIGNoYWluIGlzIGZyb3plbi4gU3RhcnRzIGFzIGBOb25lYC4gV2hlbiB0aGlzIGlzIGBTb21lYCw1ASB0aGUgY2hhaW4gd2lsbCBub3QgYWNjZXB0IGFueSBuZXcgcGFyYWNoYWluIGJsb2NrcyBmb3IgYmFja2luZyBvciBpbmNsdXNpb24sCQEgYW5kIGl0cyB2YWx1ZSBpbmRpY2F0ZXMgdGhlIGxhc3QgdmFsaWQgYmxvY2sgbnVtYmVyIGluIHRoZSBjaGFpbi74IEl0IGNhbiBvbmx5IGJlIHNldCBiYWNrIHRvIGBOb25lYCBieSBnb3Zlcm5hbmNlIGludGVydmVudGlvbi4BHQUBjQcAAQkMPgA0UGFyYXNTbGFzaGluZwE0UGFyYXNTbGFzaGluZwhAVW5hcHBsaWVkU2xhc2hlcwABCAUC/QsNDAQABJAgVmFsaWRhdG9ycyBwZW5kaW5nIGRpc3B1dGUgc2xhc2hlcy5IVmFsaWRhdG9yU2V0Q291bnRzAAEEBRAQBAAEhCBgVmFsaWRhdG9yU2V0Q291bnRgIHBlciBzZXNzaW9uLgEhBQAAAR0MPwAgT25EZW1hbmQBIE9uRGVtYW5kFDhQYXJhSWRBZmZpbml0eQABBAWNAiEMBAAMcQEgTWFwcyBhIGBQYXJhSWRgIHRvIGBDb3JlSW5kZXhgIGFuZCBrZWVwcyB0cmFjayBvZiBob3cgbWFueSBhc3NpZ25tZW50cyB0aGUgc2NoZWR1bGVyIGhhcyBpbl0BIGl0J3MgbG9va2FoZWFkLiBLZWVwaW5nIHRyYWNrIG9mIHRoaXMgYWZmaW5pdHkgcHJldmVudHMgcGFyYWxsZWwgZXhlY3V0aW9uIG9mIHRoZSBzYW1lnCBgUGFyYUlkYCBvbiB0d28gb3IgbW9yZSBgQ29yZUluZGV4YGVzLixRdWV1ZVN0YXR1cwEAJQxkAABkp7O24A0AAAAAAAAAAAAAAAAAAAAAAATcIE92ZXJhbGwgc3RhdHVzIG9mIHF1ZXVlIChib3RoIGZyZWUgKyBhZmZpbml0eSBlbnRyaWVzKSxGcmVlRW50cmllcwEAOQwEAARhASBQcmlvcml0eSBxdWV1ZSBmb3IgYWxsIG9yZGVycyB3aGljaCBkb24ndCB5ZXQgKG9yIG5vdCBhbnkgbW9yZSkgaGF2ZSBhbnkgY29yZSBhZmZpbml0eS48QWZmaW5pdHlFbnRyaWVzAQEEBX0HOQwEAARJASBRdWV1ZSBlbnRyaWVzIHRoYXQgYXJlIGN1cnJlbnRseSBib3VuZCB0byBhIHBhcnRpY3VsYXIgY29yZSBkdWUgdG8gY29yZSBhZmZpbml0eS4cUmV2ZW51ZQEARQwEAAT8IEtlZXBzIHRyYWNrIG9mIGFjY3VtdWxhdGVkIHJldmVudWUgZnJvbSBvbiBkZW1hbmQgb3JkZXIgc2FsZXMuATEFAZkHDExUcmFmZmljRGVmYXVsdFZhbHVl0QZAAABkp7O24A0AAAAAAAAAAATMIFRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgc3BvdCB0cmFmZmljIG11bHRpcGxpZXIuUE1heEhpc3RvcmljYWxSZXZlbnVlEBCgAAAACNQgVGhlIG1heGltdW0gbnVtYmVyIG9mIGJsb2NrcyBzb21lIGhpc3RvcmljYWwgcmV2ZW51ZWAgaW5mb3JtYXRpb24gc3RvcmVkIGZvci4gUGFsbGV0SWSRCSBweS9vbmRtZAS0IElkZW50aWZpZXIgZm9yIHRoZSBpbnRlcm5hbCByZXZlbnVlIGJhbGFuY2UuAU0MQABoQ29yZXRpbWVBc3NpZ25tZW50UHJvdmlkZXIBaENvcmV0aW1lQXNzaWdubWVudFByb3ZpZGVyCDRDb3JlU2NoZWR1bGVzAAEEBFEMVQwEABBsIFNjaGVkdWxlZCBhc3NpZ25tZW50IHNldHMuAG0BIEFzc2lnbm1lbnRzIGFzIG9mIHRoZSBnaXZlbiBibG9jayBudW1iZXIuIFRoZXkgd2lsbCBnbyBpbnRvIHN0YXRlIG9uY2UgdGhlIGJsb2NrIG51bWJlciBpc9AgcmVhY2hlZCAoYW5kIHJlcGxhY2Ugd2hhdGV2ZXIgd2FzIGluIHRoZXJlIGJlZm9yZSkuPENvcmVEZXNjcmlwdG9ycwEBBAR9B1kMCAAAEKAgQXNzaWdubWVudHMgd2hpY2ggYXJlIGN1cnJlbnRseSBhY3RpdmUuAGkBIFRoZXkgd2lsbCBiZSBwaWNrZWQgZnJvbSBgUGVuZGluZ0Fzc2lnbm1lbnRzYCBvbmNlIHdlIHJlYWNoIHRoZSBzY2hlZHVsZWQgYmxvY2sgbnVtYmVyIGluWCBgUGVuZGluZ0Fzc2lnbm1lbnRzYC4AAAABeQxBACRSZWdpc3RyYXIBJFJlZ2lzdHJhcgwsUGVuZGluZ1N3YXAAAQQFjQKNAgQABGQgUGVuZGluZyBzd2FwIG9wZXJhdGlvbnMuFFBhcmFzAAEEBY0CfQwEABAFASBBbW91bnQgaGVsZCBvbiBkZXBvc2l0IGZvciBlYWNoIHBhcmEgYW5kIHRoZSBvcmlnaW5hbCBkZXBvc2l0b3IuAHEBIFRoZSBnaXZlbiBhY2NvdW50IElEIGlzIHJlc3BvbnNpYmxlIGZvciByZWdpc3RlcmluZyB0aGUgY29kZSBhbmQgaW5pdGlhbCBoZWFkIGRhdGEsIGJ1dCBtYXlVASBvbmx5IGRvIHNvIGlmIGl0IGlzbid0IHlldCByZWdpc3RlcmVkLiAoQWZ0ZXIgdGhhdCwgaXQncyB1cCB0byBnb3Zlcm5hbmNlIHRvIGRvIHNvLik4TmV4dEZyZWVQYXJhSWQBAI0CEAAAAAAEYCBUaGUgbmV4dCBmcmVlIGBQYXJhSWRgLgE1BQGdBwgsUGFyYURlcG9zaXQYQAAQpdToAAAAAAAAAAAAAAAI1CBUaGUgZGVwb3NpdCB0byBiZSBwYWlkIHRvIHJ1biBhIG9uLWRlbWFuZCBwYXJhY2hhaW4uPQEgVGhpcyBzaG91bGQgaW5jbHVkZSB0aGUgY29zdCBmb3Igc3RvcmluZyB0aGUgZ2VuZXNpcyBoZWFkIGFuZCB2YWxpZGF0aW9uIGNvZGUuSERhdGFEZXBvc2l0UGVyQnl0ZRhAgJaYAAAAAAAAAAAAAAAAAATEIFRoZSBkZXBvc2l0IHRvIGJlIHBhaWQgcGVyIGJ5dGUgc3RvcmVkIG9uIGNoYWluLgGBDEYAFFNsb3RzARRTbG90cwQYTGVhc2VzAQEEBY0ChQwEAEAVASBBbW91bnRzIGhlbGQgb24gZGVwb3NpdCBmb3IgZWFjaCAocG9zc2libHkgZnV0dXJlKSBsZWFzZWQgcGFyYWNoYWluLgBhASBUaGUgYWN0dWFsIGFtb3VudCBsb2NrZWQgb24gaXRzIGJlaGFsZiBieSBhbnkgYWNjb3VudCBhdCBhbnkgdGltZSBpcyB0aGUgbWF4aW11bSBvZiB0aGUpASBzZWNvbmQgdmFsdWVzIG9mIHRoZSBpdGVtcyBpbiB0aGlzIGxpc3Qgd2hvc2UgZmlyc3QgdmFsdWUgaXMgdGhlIGFjY291bnQuAGEBIFRoZSBmaXJzdCBpdGVtIGluIHRoZSBsaXN0IGlzIHRoZSBhbW91bnQgbG9ja2VkIGZvciB0aGUgY3VycmVudCBMZWFzZSBQZXJpb2QuIEZvbGxvd2luZ7AgaXRlbXMgYXJlIGZvciB0aGUgc3Vic2VxdWVudCBsZWFzZSBwZXJpb2RzLgBhASBUaGUgZGVmYXVsdCB2YWx1ZSAoYW4gZW1wdHkgbGlzdCkgaW1wbGllcyB0aGF0IHRoZSBwYXJhY2hhaW4gbm8gbG9uZ2VyIGV4aXN0cyAob3IgbmV2ZXK0IGV4aXN0ZWQpIGFzIGZhciBhcyB0aGlzIHBhbGxldCBpcyBjb25jZXJuZWQuAFEBIElmIGEgcGFyYWNoYWluIGRvZXNuJ3QgZXhpc3QgKnlldCogYnV0IGlzIHNjaGVkdWxlZCB0byBleGlzdCBpbiB0aGUgZnV0dXJlLCB0aGVuIGl0YQEgd2lsbCBiZSBsZWZ0LXBhZGRlZCB3aXRoIG9uZSBvciBtb3JlIGBOb25lYHMgdG8gZGVub3RlIHRoZSBmYWN0IHRoYXQgbm90aGluZyBpcyBoZWxkIG9uXQEgZGVwb3NpdCBmb3IgdGhlIG5vbi1leGlzdGVudCBjaGFpbiBjdXJyZW50bHksIGJ1dCBpcyBoZWxkIGF0IHNvbWUgcG9pbnQgaW4gdGhlIGZ1dHVyZS4A3CBJdCBpcyBpbGxlZ2FsIGZvciBhIGBOb25lYCB2YWx1ZSB0byB0cmFpbCBpbiB0aGUgbGlzdC4BOQUBoQcILExlYXNlUGVyaW9kEBDAiQEABNwgVGhlIG51bWJlciBvZiBibG9ja3Mgb3ZlciB3aGljaCBhIHNpbmdsZSBwZXJpb2QgbGFzdHMuLExlYXNlT2Zmc2V0EBAAAAAABNQgVGhlIG51bWJlciBvZiBibG9ja3MgdG8gb2Zmc2V0IGVhY2ggbGVhc2UgcGVyaW9kIGJ5LgGJDEcAIEF1Y3Rpb25zASBBdWN0aW9ucxA4QXVjdGlvbkNvdW50ZXIBABAQAAAAAASMIE51bWJlciBvZiBhdWN0aW9ucyBzdGFydGVkIHNvIGZhci4sQXVjdGlvbkluZm8AAIAEABT4IEluZm9ybWF0aW9uIHJlbGF0aW5nIHRvIHRoZSBjdXJyZW50IGF1Y3Rpb24sIGlmIHRoZXJlIGlzIG9uZS4ARQEgVGhlIGZpcnN0IGl0ZW0gaW4gdGhlIHR1cGxlIGlzIHRoZSBsZWFzZSBwZXJpb2QgaW5kZXggdGhhdCB0aGUgZmlyc3Qgb2YgdGhlIGZvdXJRASBjb250aWd1b3VzIGxlYXNlIHBlcmlvZHMgb24gYXVjdGlvbiBpcyBmb3IuIFRoZSBzZWNvbmQgaXMgdGhlIGJsb2NrIG51bWJlciB3aGVuIHRoZV0BIGF1Y3Rpb24gd2lsbCAiYmVnaW4gdG8gZW5kIiwgaS5lLiB0aGUgZmlyc3QgYmxvY2sgb2YgdGhlIEVuZGluZyBQZXJpb2Qgb2YgdGhlIGF1Y3Rpb24uPFJlc2VydmVkQW1vdW50cwABBAWNDBgEAAgxASBBbW91bnRzIGN1cnJlbnRseSByZXNlcnZlZCBpbiB0aGUgYWNjb3VudHMgb2YgdGhlIGJpZGRlcnMgY3VycmVudGx5IHdpbm5pbmc4IChzdWItKXJhbmdlcy4cV2lubmluZwABBAUQkQwEAAxhASBUaGUgd2lubmluZyBiaWRzIGZvciBlYWNoIG9mIHRoZSAxMCByYW5nZXMgYXQgZWFjaCBzYW1wbGUgaW4gdGhlIGZpbmFsIEVuZGluZyBQZXJpb2Qgb2ZJASB0aGUgY3VycmVudCBhdWN0aW9uLiBUaGUgbWFwJ3Mga2V5IGlzIHRoZSAwLWJhc2VkIGluZGV4IGludG8gdGhlIFNhbXBsZSBTaXplLiBUaGUdASBmaXJzdCBzYW1wbGUgb2YgdGhlIGVuZGluZyBwZXJpb2QgaXMgMDsgdGhlIGxhc3QgaXMgYFNhbXBsZSBTaXplIC0gMWAuAT0FAaUHEDBFbmRpbmdQZXJpb2QQEEAZAQAEHQEgVGhlIG51bWJlciBvZiBibG9ja3Mgb3ZlciB3aGljaCBhbiBhdWN0aW9uIG1heSBiZSByZXRyb2FjdGl2ZWx5IGVuZGVkLjBTYW1wbGVMZW5ndGgQEBQAAAAM8CBUaGUgbGVuZ3RoIG9mIGVhY2ggc2FtcGxlIHRvIHRha2UgZHVyaW5nIHRoZSBlbmRpbmcgcGVyaW9kLgDUIGBFbmRpbmdQZXJpb2RgIC8gYFNhbXBsZUxlbmd0aGAgPSBUb3RhbCAjIG9mIFNhbXBsZXM4U2xvdFJhbmdlQ291bnQQECQAAAAATExlYXNlUGVyaW9kc1BlclNsb3QQEAgAAAAAAZ0MSAAkQ3Jvd2Rsb2FuASRDcm93ZGxvYW4QFEZ1bmRzAAEEBY0CoQwEAARoIEluZm8gb24gYWxsIG9mIHRoZSBmdW5kcy4gTmV3UmFpc2UBAJULBAAIVQEgVGhlIGZ1bmRzIHRoYXQgaGF2ZSBoYWQgYWRkaXRpb25hbCBjb250cmlidXRpb25zIGR1cmluZyB0aGUgbGFzdCBibG9jay4gVGhpcyBpcyB1c2VkFQEgaW4gb3JkZXIgdG8gZGV0ZXJtaW5lIHdoaWNoIGZ1bmRzIHNob3VsZCBzdWJtaXQgbmV3IG9yIHVwZGF0ZWQgYmlkcy4wRW5kaW5nc0NvdW50AQAQEAAAAAAEKQEgVGhlIG51bWJlciBvZiBhdWN0aW9ucyB0aGF0IGhhdmUgZW50ZXJlZCBpbnRvIHRoZWlyIGVuZGluZyBwZXJpb2Qgc28gZmFyLjROZXh0RnVuZEluZGV4AQAQEAAAAAAEqCBUcmFja2VyIGZvciB0aGUgbmV4dCBhdmFpbGFibGUgZnVuZCBpbmRleAFFBQGpBwwgUGFsbGV0SWSRCSBweS9jZnVuZAgNASBgUGFsbGV0SWRgIGZvciB0aGUgY3Jvd2Rsb2FuIHBhbGxldC4gQW4gYXBwcm9wcmlhdGUgdmFsdWUgY291bGQgYmVkIGBQYWxsZXRJZCgqYiJweS9jZnVuZCIpYDxNaW5Db250cmlidXRpb24YQAB0O6QLAAAAAAAAAAAAAAAIYQEgVGhlIG1pbmltdW0gYW1vdW50IHRoYXQgbWF5IGJlIGNvbnRyaWJ1dGVkIGludG8gYSBjcm93ZGxvYW4uIFNob3VsZCBhbG1vc3QgY2VydGFpbmx5IGJlfCBhdCBsZWFzdCBgRXhpc3RlbnRpYWxEZXBvc2l0YC48UmVtb3ZlS2V5c0xpbWl0EBDoAwAABOQgTWF4IG51bWJlciBvZiBzdG9yYWdlIGtleXMgdG8gcmVtb3ZlIHBlciBleHRyaW5zaWMgY2FsbC4BqQxJACBDb3JldGltZQABWQUBrQcIIEJyb2tlcklkEBDtAwAABIggVGhlIFBhcmFJZCBvZiB0aGUgY29yZXRpbWUgY2hhaW4uREJyb2tlclBvdExvY2F0aW9uEQGMAQEAbW9kbHB5L2Jyb2tlAAAAAAAAAAAAAAAAAAAAAAAAAAAEhCBUaGUgY29yZXRpbWUgY2hhaW4gcG90IGxvY2F0aW9uLgGtDEoASFN0YXRlVHJpZU1pZ3JhdGlvbgFIU3RhdGVUcmllTWlncmF0aW9uDEBNaWdyYXRpb25Qcm9jZXNzAQB5BTgAAAAAAAAAAAAAAAAAABBQIE1pZ3JhdGlvbiBwcm9ncmVzcy4AXQEgVGhpcyBzdG9yZXMgdGhlIHNuYXBzaG90IG9mIHRoZSBsYXN0IG1pZ3JhdGVkIGtleXMuIEl0IGNhbiBiZSBzZXQgaW50byBtb3Rpb24gYW5kIG1vdmXUIGZvcndhcmQgYnkgYW55IG9mIHRoZSBtZWFucyBwcm92aWRlZCBieSB0aGlzIHBhbGxldC4oQXV0b0xpbWl0cwEAcQUEAAzUIFRoZSBsaW1pdHMgdGhhdCBhcmUgaW1wb3NlZCBvbiBhdXRvbWF0aWMgbWlncmF0aW9ucy4A1CBJZiBzZXQgdG8gTm9uZSwgdGhlbiBubyBhdXRvbWF0aWMgbWlncmF0aW9uIGhhcHBlbnMuYFNpZ25lZE1pZ3JhdGlvbk1heExpbWl0cwAAdQUEAAzgIFRoZSBtYXhpbXVtIGxpbWl0cyB0aGF0IHRoZSBzaWduZWQgbWlncmF0aW9uIGNvdWxkIHVzZS4AtCBJZiBub3Qgc2V0LCBubyBzaWduZWQgc3VibWlzc2lvbiBpcyBhbGxvd2VkLgFtBQGxBwQkTWF4S2V5TGVuEBAAAgAAVLQgTWF4aW1hbCBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGtleSBjYW4gaGF2ZS4AsCBGUkFNRSBpdHNlbGYgZG9lcyBub3QgbGltaXQgdGhlIGtleSBsZW5ndGguAQEgVGhlIGNvbmNyZXRlIHZhbHVlIG11c3QgdGhlcmVmb3JlIGRlcGVuZCBvbiB5b3VyIHN0b3JhZ2UgdXNhZ2UuWQEgQSBbYGZyYW1lX3N1cHBvcnQ6OnN0b3JhZ2U6OlN0b3JhZ2VOTWFwYF0gZm9yIGV4YW1wbGUgY2FuIGhhdmUgYW4gYXJiaXRyYXJ5IG51bWJlciBvZkUBIGtleXMgd2hpY2ggYXJlIHRoZW4gaGFzaGVkIGFuZCBjb25jYXRlbmF0ZWQsIHJlc3VsdGluZyBpbiBhcmJpdHJhcmlseSBsb25nIGtleXMuAEEBIFVzZSB0aGUgKnN0YXRlIG1pZ3JhdGlvbiBSUEMqIHRvIHJldHJpZXZlIHRoZSBsZW5ndGggb2YgdGhlIGxvbmdlc3Qga2V5IGluIHlvdXIBASBzdG9yYWdlOiA8aHR0cHM6Ly9naXRodWIuY29tL3Bhcml0eXRlY2gvc3Vic3RyYXRlL2lzc3Vlcy8xMTY0Mj4AKQEgVGhlIG1pZ3JhdGlvbiB3aWxsIGhhbHQgd2l0aCBhIGBIYWx0ZWRgIGV2ZW50IGlmIHRoaXMgdmFsdWUgaXMgdG9vIHNtYWxsLkkBIFNpbmNlIHRoZXJlIGlzIG5vIHJlYWwgcGVuYWx0eSBmcm9tIG92ZXItZXN0aW1hdGluZywgaXQgaXMgYWR2aXNlZCB0byB1c2UgYSBsYXJnZYAgdmFsdWUuIFRoZSBkZWZhdWx0IGlzIDUxMiBieXRlLgCAIFNvbWUga2V5IGxlbmd0aHMgZm9yIHJlZmVyZW5jZTrQIC0gW2BmcmFtZV9zdXBwb3J0OjpzdG9yYWdlOjpTdG9yYWdlVmFsdWVgXTogMzIgYnl0ZcggLSBbYGZyYW1lX3N1cHBvcnQ6OnN0b3JhZ2U6OlN0b3JhZ2VNYXBgXTogNjQgYnl0ZeAgLSBbYGZyYW1lX3N1cHBvcnQ6OnN0b3JhZ2U6OlN0b3JhZ2VEb3VibGVNYXBgXTogOTYgYnl0ZQBIIEZvciBtb3JlIGluZm8gc2VlSQEgPGh0dHBzOi8vd3d3LnNoYXdudGFicml6aS5jb20vYmxvZy9zdWJzdHJhdGUvcXVlcnlpbmctc3Vic3RyYXRlLXN0b3JhZ2UtdmlhLXJwYy8+AbkHYgAkWGNtUGFsbGV0ASRYY21QYWxsZXQ4MFF1ZXJ5Q291bnRlcgEAMCAAAAAAAAAAAASIIFRoZSBsYXRlc3QgYXZhaWxhYmxlIHF1ZXJ5IGluZGV4LhxRdWVyaWVzAAEEAjCxDAQABFQgVGhlIG9uZ29pbmcgcXVlcmllcy4oQXNzZXRUcmFwcwEBBAY0EBAAAAAAEGggVGhlIGV4aXN0aW5nIGFzc2V0IHRyYXBzLgBhASBLZXkgaXMgdGhlIGJsYWtlMiAyNTYgaGFzaCBvZiAob3JpZ2luLCB2ZXJzaW9uZWQgYEFzc2V0c2ApIHBhaXIuIFZhbHVlIGlzIHRoZSBudW1iZXIgb2YdASB0aW1lcyB0aGlzIHBhaXIgaGFzIGJlZW4gdHJhcHBlZCAodXN1YWxseSBqdXN0IDEgaWYgaXQgZXhpc3RzIGF0IGFsbCkuOFNhZmVYY21WZXJzaW9uAAAQBAAIYQEgRGVmYXVsdCB2ZXJzaW9uIHRvIGVuY29kZSBYQ00gd2hlbiBsYXRlc3QgdmVyc2lvbiBvZiBkZXN0aW5hdGlvbiBpcyB1bmtub3duLiBJZiBgTm9uZWAsPQEgdGhlbiB0aGUgZGVzdGluYXRpb25zIHdob3NlIFhDTSB2ZXJzaW9uIGlzIHVua25vd24gYXJlIGNvbnNpZGVyZWQgdW5yZWFjaGFibGUuQFN1cHBvcnRlZFZlcnNpb24AAQgFAsUMEAQABPAgVGhlIExhdGVzdCB2ZXJzaW9ucyB0aGF0IHdlIGtub3cgdmFyaW91cyBsb2NhdGlvbnMgc3VwcG9ydC5AVmVyc2lvbk5vdGlmaWVycwABCAUCxQwwBAAEBQEgQWxsIGxvY2F0aW9ucyB0aGF0IHdlIGhhdmUgcmVxdWVzdGVkIHZlcnNpb24gbm90aWZpY2F0aW9ucyBmcm9tLlBWZXJzaW9uTm90aWZ5VGFyZ2V0cwABCAUCxQzJDAQACHEBIFRoZSB0YXJnZXQgbG9jYXRpb25zIHRoYXQgYXJlIHN1YnNjcmliZWQgdG8gb3VyIHZlcnNpb24gY2hhbmdlcywgYXMgd2VsbCBhcyB0aGUgbW9zdCByZWNlbnSUIG9mIG91ciB2ZXJzaW9ucyB3ZSBpbmZvcm1lZCB0aGVtIG9mLlRWZXJzaW9uRGlzY292ZXJ5UXVldWUBAM0MBAAMZQEgRGVzdGluYXRpb25zIHdob3NlIGxhdGVzdCBYQ00gdmVyc2lvbiB3ZSB3b3VsZCBsaWtlIHRvIGtub3cuIER1cGxpY2F0ZXMgbm90IGFsbG93ZWQsIGFuZHEBIHRoZSBgdTMyYCBjb3VudGVyIGlzIHRoZSBudW1iZXIgb2YgdGltZXMgdGhhdCBhIHNlbmQgdG8gdGhlIGRlc3RpbmF0aW9uIGhhcyBiZWVuIGF0dGVtcHRlZCyMIHdoaWNoIGlzIHVzZWQgYXMgYSBwcmlvcml0aXphdGlvbi5AQ3VycmVudE1pZ3JhdGlvbgAA2QwEAAScIFRoZSBjdXJyZW50IG1pZ3JhdGlvbidzIHN0YWdlLCBpZiBhbnkuVFJlbW90ZUxvY2tlZEZ1bmdpYmxlcwABDAUCAuEM5QwEAATwIEZ1bmdpYmxlIGFzc2V0cyB3aGljaCB3ZSBrbm93IGFyZSBsb2NrZWQgb24gYSByZW1vdGUgY2hhaW4uPExvY2tlZEZ1bmdpYmxlcwABBAIA9QwEAATgIEZ1bmdpYmxlIGFzc2V0cyB3aGljaCB3ZSBrbm93IGFyZSBsb2NrZWQgb24gdGhpcyBjaGFpbi5UWGNtRXhlY3V0aW9uU3VzcGVuZGVkAQAgBAAEtCBHbG9iYWwgc3VzcGVuc2lvbiBzdGF0ZSBvZiB0aGUgWENNIGV4ZWN1dG9yLjxTaG91bGRSZWNvcmRYY20BACAEABxZASBXaGV0aGVyIG9yIG5vdCBpbmNvbWluZyBYQ01zIChib3RoIGV4ZWN1dGVkIGxvY2FsbHkgYW5kIHJlY2VpdmVkKSBzaG91bGQgYmUgcmVjb3JkZWQuxCBPbmx5IG9uZSBYQ00gcHJvZ3JhbSB3aWxsIGJlIHJlY29yZGVkIGF0IGEgdGltZS4pASBUaGlzIGlzIG1lYW50IHRvIGJlIHVzZWQgaW4gcnVudGltZSBBUElzLCBhbmQgaXQncyBhZHZpc2VkIGl0IHN0YXlzIGZhbHNlDQEgZm9yIGFsbCBvdGhlciB1c2UgY2FzZXMsIHNvIGFzIHRvIG5vdCBkZWdyYWRlIHJlZ3VsYXIgcGVyZm9ybWFuY2UuAFkBIE9ubHkgcmVsZXZhbnQgaWYgdGhpcyBwYWxsZXQgaXMgYmVpbmcgdXNlZCBhcyB0aGUgW2B4Y21fZXhlY3V0b3I6OnRyYWl0czo6UmVjb3JkWGNtYF3IIGltcGxlbWVudGF0aW9uIGluIHRoZSBYQ00gZXhlY3V0b3IgY29uZmlndXJhdGlvbi4sUmVjb3JkZWRYY20AAEEGBAAYSQEgSWYgW2BTaG91bGRSZWNvcmRYY21gXSBpcyBzZXQgdG8gdHJ1ZSwgdGhlbiB0aGUgbGFzdCBYQ00gcHJvZ3JhbSBleGVjdXRlZCBsb2NhbGx5VCB3aWxsIGJlIHN0b3JlZCBoZXJlLikBIFJ1bnRpbWUgQVBJcyBjYW4gZmV0Y2ggdGhlIFhDTSB0aGF0IHdhcyBleGVjdXRlZCBieSBhY2Nlc3NpbmcgdGhpcyB2YWx1ZS4AWQEgT25seSByZWxldmFudCBpZiB0aGlzIHBhbGxldCBpcyBiZWluZyB1c2VkIGFzIHRoZSBbYHhjbV9leGVjdXRvcjo6dHJhaXRzOjpSZWNvcmRYY21gXcggaW1wbGVtZW50YXRpb24gaW4gdGhlIFhDTSBleGVjdXRvciBjb25maWd1cmF0aW9uLgGFBQG9BwABAQ1jADBNZXNzYWdlUXVldWUBME1lc3NhZ2VRdWV1ZQwwQm9va1N0YXRlRm9yAQEEBcUGBQ10AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEzCBUaGUgaW5kZXggb2YgdGhlIGZpcnN0IGFuZCBsYXN0IChub24tZW1wdHkpIHBhZ2VzLixTZXJ2aWNlSGVhZAAAxQYEAAS8IFRoZSBvcmlnaW4gYXQgd2hpY2ggd2Ugc2hvdWxkIGJlZ2luIHNlcnZpY2luZy4UUGFnZXMAAQgFBRENFQ0EAASIIFRoZSBtYXAgb2YgcGFnZSBpbmRpY2VzIHRvIHBhZ2VzLgHBBgHFBxAgSGVhcFNpemUQEAAAAQAUPQEgVGhlIHNpemUgb2YgdGhlIHBhZ2U7IHRoaXMgaW1wbGllcyB0aGUgbWF4aW11bSBtZXNzYWdlIHNpemUgd2hpY2ggY2FuIGJlIHNlbnQuAFkBIEEgZ29vZCB2YWx1ZSBkZXBlbmRzIG9uIHRoZSBleHBlY3RlZCBtZXNzYWdlIHNpemVzLCB0aGVpciB3ZWlnaHRzLCB0aGUgd2VpZ2h0IHRoYXQgaXNdASBhdmFpbGFibGUgZm9yIHByb2Nlc3NpbmcgdGhlbSBhbmQgdGhlIG1heGltYWwgbmVlZGVkIG1lc3NhZ2Ugc2l6ZS4gVGhlIG1heGltYWwgbWVzc2FnZREBIHNpemUgaXMgc2xpZ2h0bHkgbG93ZXIgdGhhbiB0aGlzIGFzIGRlZmluZWQgYnkgW2BNYXhNZXNzYWdlTGVuT2ZgXS4gTWF4U3RhbGUQEAgAAAAMXQEgVGhlIG1heGltdW0gbnVtYmVyIG9mIHN0YWxlIHBhZ2VzIChpLmUuIG9mIG92ZXJ3ZWlnaHQgbWVzc2FnZXMpIGFsbG93ZWQgYmVmb3JlIGN1bGxpbmdRASBjYW4gaGFwcGVuLiBPbmNlIHRoZXJlIGFyZSBtb3JlIHN0YWxlIHBhZ2VzIHRoYW4gdGhpcywgdGhlbiBoaXN0b3JpY2FsIHBhZ2VzIG1heSBiZfwgZHJvcHBlZCwgZXZlbiBpZiB0aGV5IGNvbnRhaW4gdW5wcm9jZXNzZWQgb3ZlcndlaWdodCBtZXNzYWdlcy40U2VydmljZVdlaWdodB0HQAEHAKDbIV0TMzMzMzMzMzMYQQEgVGhlIGFtb3VudCBvZiB3ZWlnaHQgKGlmIGFueSkgd2hpY2ggc2hvdWxkIGJlIHByb3ZpZGVkIHRvIHRoZSBtZXNzYWdlIHF1ZXVlIGZvcqggc2VydmljaW5nIGVucXVldWVkIGl0ZW1zIGBvbl9pbml0aWFsaXplYC4A/CBUaGlzIG1heSBiZSBsZWdpdGltYXRlbHkgYE5vbmVgIGluIHRoZSBjYXNlIHRoYXQgeW91IHdpbGwgY2FsbF0BIGBTZXJ2aWNlUXVldWVzOjpzZXJ2aWNlX3F1ZXVlc2AgbWFudWFsbHkgb3Igc2V0IFtgU2VsZjo6SWRsZU1heFNlcnZpY2VXZWlnaHRgXSB0byBoYXZlVCBpdCBydW4gaW4gYG9uX2lkbGVgLlBJZGxlTWF4U2VydmljZVdlaWdodB0HQAEHAKDbIV0TMzMzMzMzMzMUXQEgVGhlIG1heGltdW0gYW1vdW50IG9mIHdlaWdodCAoaWYgYW55KSB0byBiZSB1c2VkIGZyb20gcmVtYWluaW5nIHdlaWdodCBgb25faWRsZWAgd2hpY2hBASBzaG91bGQgYmUgcHJvdmlkZWQgdG8gdGhlIG1lc3NhZ2UgcXVldWUgZm9yIHNlcnZpY2luZyBlbnF1ZXVlZCBpdGVtcyBgb25faWRsZWAuPQEgVXNlZnVsIGZvciBwYXJhY2hhaW5zIHRvIHByb2Nlc3MgbWVzc2FnZXMgYXQgdGhlIHNhbWUgYmxvY2sgdGhleSBhcmUgcmVjZWl2ZWQuACkBIElmIGBOb25lYCwgaXQgd2lsbCBub3QgY2FsbCBgU2VydmljZVF1ZXVlczo6c2VydmljZV9xdWV1ZXNgIGluIGBvbl9pZGxlYC4BHQ1kACRBc3NldFJhdGUBJEFzc2V0UmF0ZQRYQ29udmVyc2lvblJhdGVUb05hdGl2ZQABBALc0QYEAAwdASBNYXBzIGFuIGFzc2V0IHRvIGl0cyBmaXhlZCBwb2ludCByZXByZXNlbnRhdGlvbiBpbiB0aGUgbmF0aXZlIGJhbGFuY2UuAE0BIEUuZy4gYG5hdGl2ZV9hbW91bnQgPSBhc3NldF9hbW91bnQgKiBDb252ZXJzaW9uUmF0ZVRvTmF0aXZlOjo8VD46OmdldChhc3NldF9raW5kKWABzQYBzQcAASENZQAUQmVlZnkBFEJlZWZ5FCxBdXRob3JpdGllcwEAJQ0EAARwIFRoZSBjdXJyZW50IGF1dGhvcml0aWVzIHNldDhWYWxpZGF0b3JTZXRJZAEAMCAAAAAAAAAAAAR0IFRoZSBjdXJyZW50IHZhbGlkYXRvciBzZXQgaWQ8TmV4dEF1dGhvcml0aWVzAQAlDQQABOwgQXV0aG9yaXRpZXMgc2V0IHNjaGVkdWxlZCB0byBiZSB1c2VkIHdpdGggdGhlIG5leHQgc2Vzc2lvbjBTZXRJZFNlc3Npb24AAQQFMBAEAChRASBBIG1hcHBpbmcgZnJvbSBCRUVGWSBzZXQgSUQgdG8gdGhlIGluZGV4IG9mIHRoZSAqbW9zdCByZWNlbnQqIHNlc3Npb24gZm9yIHdoaWNoIGl0c2ggbWVtYmVycyB3ZXJlIHJlc3BvbnNpYmxlLgBFASBUaGlzIGlzIG9ubHkgdXNlZCBmb3IgdmFsaWRhdGluZyBlcXVpdm9jYXRpb24gcHJvb2ZzLiBBbiBlcXVpdm9jYXRpb24gcHJvb2YgbXVzdE0BIGNvbnRhaW5zIGEga2V5LW93bmVyc2hpcCBwcm9vZiBmb3IgYSBnaXZlbiBzZXNzaW9uLCB0aGVyZWZvcmUgd2UgbmVlZCBhIHdheSB0byB0aWU9ASB0b2dldGhlciBzZXNzaW9ucyBhbmQgQkVFRlkgc2V0IGlkcywgaS5lLiB3ZSBuZWVkIHRvIHZhbGlkYXRlIHRoYXQgYSB2YWxpZGF0b3JBASB3YXMgdGhlIG93bmVyIG9mIGEgZ2l2ZW4ga2V5IG9uIGEgZ2l2ZW4gc2Vzc2lvbiwgYW5kIHdoYXQgdGhlIGFjdGl2ZSBzZXQgSUQgd2FzVCBkdXJpbmcgdGhhdCBzZXNzaW9uLgDcIFRXT1gtTk9URTogYFZhbGlkYXRvclNldElkYCBpcyBub3QgdW5kZXIgdXNlciBjb250cm9sLjBHZW5lc2lzQmxvY2sBAGECBAAM3CBCbG9jayBudW1iZXIgd2hlcmUgQkVFRlkgY29uc2Vuc3VzIGlzIGVuYWJsZWQvc3RhcnRlZC5pASBCeSBjaGFuZ2luZyB0aGlzICh0aHJvdWdoIHByaXZpbGVnZWQgYHNldF9uZXdfZ2VuZXNpcygpYCksIEJFRUZZIGNvbnNlbnN1cyBpcyBlZmZlY3RpdmVseawgcmVzdGFydGVkIGZyb20gdGhlIG5ld2x5IHNldCBibG9jayBudW1iZXIuAdUGAAw4TWF4QXV0aG9yaXRpZXMQEKCGAQAE1CBUaGUgbWF4aW11bSBudW1iZXIgb2YgYXV0aG9yaXRpZXMgdGhhdCBjYW4gYmUgYWRkZWQuNE1heE5vbWluYXRvcnMQEAACAAAE1CBUaGUgbWF4aW11bSBudW1iZXIgb2Ygbm9taW5hdG9ycyBmb3IgZWFjaCB2YWxpZGF0b3IuWE1heFNldElkU2Vzc2lvbkVudHJpZXMwIKgAAAAAAAAAGDkBIFRoZSBtYXhpbXVtIG51bWJlciBvZiBlbnRyaWVzIHRvIGtlZXAgaW4gdGhlIHNldCBpZCB0byBzZXNzaW9uIGluZGV4IG1hcHBpbmcuADEBIFNpbmNlIHRoZSBgU2V0SWRTZXNzaW9uYCBtYXAgaXMgb25seSB1c2VkIGZvciB2YWxpZGF0aW5nIGVxdWl2b2NhdGlvbnMgdGhpcykBIHZhbHVlIHNob3VsZCByZWxhdGUgdG8gdGhlIGJvbmRpbmcgZHVyYXRpb24gb2Ygd2hhdGV2ZXIgc3Rha2luZyBzeXN0ZW0gaXM1ASBiZWluZyB1c2VkIChpZiBhbnkpLiBJZiBlcXVpdm9jYXRpb24gaGFuZGxpbmcgaXMgbm90IGVuYWJsZWQgdGhlbiB0aGlzIHZhbHVlNCBjYW4gYmUgemVyby4BLQ3IAAxNbXIBDE1tcgwgUm9vdEhhc2gBADSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEWCBMYXRlc3QgTU1SIFJvb3QgaGFzaC44TnVtYmVyT2ZMZWF2ZXMBADAgAAAAAAAAAAAEsCBDdXJyZW50IHNpemUgb2YgdGhlIE1NUiAobnVtYmVyIG9mIGxlYXZlcykuFE5vZGVzAAEEBjA0BAAQgCBIYXNoZXMgb2YgdGhlIG5vZGVzIGluIHRoZSBNTVIuAC0BIE5vdGUgdGhpcyBjb2xsZWN0aW9uIG9ubHkgY29udGFpbnMgTU1SIHBlYWtzLCB0aGUgaW5uZXIgbm9kZXMgKGFuZCBsZWF2ZXMpvCBhcmUgcHJ1bmVkIGFuZCBvbmx5IHN0b3JlZCBpbiB0aGUgT2ZmY2hhaW4gREIuAAAAAMkAMEJlZWZ5TW1yTGVhZgEwQmVlZnlNbXJMZWFmCEBCZWVmeUF1dGhvcml0aWVzAQAxDbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASgIERldGFpbHMgb2YgY3VycmVudCBCRUVGWSBhdXRob3JpdHkgc2V0LlBCZWVmeU5leHRBdXRob3JpdGllcwEAMQ2wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMlCBEZXRhaWxzIG9mIG5leHQgQkVFRlkgYXV0aG9yaXR5IHNldC4AUQEgVGhpcyBzdG9yYWdlIGVudHJ5IGlzIHVzZWQgYXMgY2FjaGUgZm9yIGNhbGxzIHRvIGB1cGRhdGVfYmVlZnlfbmV4dF9hdXRob3JpdHlfc2V0YC4AAAAAygA8UGFyYVN1ZG9XcmFwcGVyAAH5BgAAATUN+gAQU3VkbwEQU3VkbwQMS2V5AAAABAAEhCBUaGUgYEFjY291bnRJZGAgb2YgdGhlIHN1ZG8ga2V5LgEBBwHRBwABOQ3/AATFAXUBVQU9DShIQ2hlY2tOb25aZXJvU2VuZGVyQQ2MQENoZWNrU3BlY1ZlcnNpb25FDRA4Q2hlY2tUeFZlcnNpb25JDRAwQ2hlY2tHZW5lc2lzTQ00OENoZWNrTW9ydGFsaXR5UQ00KENoZWNrTm9uY2VZDYwsQ2hlY2tXZWlnaHRdDYxgQ2hhcmdlVHJhbnNhY3Rpb25QYXltZW50YQ2MSFByZXZhbGlkYXRlQXR0ZXN0c2UNjERDaGVja01ldGFkYXRhSGFzaGkNhHENXCRJbmZsYXRpb24EmGV4cGVyaW1lbnRhbF9pbmZsYXRpb25fcHJlZGljdGlvbl9pbmZvAHUNENggUmV0dXJuIHRoZSBjdXJyZW50IGVzdGltYXRlcyBvZiB0aGUgaW5mbGF0aW9uIGFtb3VudC4AUQEgVGhpcyBpcyBtYXJrZWQgYXMgZXhwZXJpbWVudGFsIGluIGxpZ2h0IG9mIFJGQyM4OS4gTm9uZXRoZWxlc3MsIGl0cyB1c2FnZSBpcyBoaWdobHklASByZWNvbW1lbmRlZCBvdmVyIHRyeWluZyB0byByZWFkLXN0b3JhZ2UsIG9yIHJlLWNyZWF0ZSB0aGUgb25jaGFpbiBsb2dpYy4AEENvcmUMHHZlcnNpb24AAQgEkCBSZXR1cm5zIHRoZSB2ZXJzaW9uIG9mIHRoZSBydW50aW1lLjRleGVjdXRlX2Jsb2NrBBRibG9ja30NjARkIEV4ZWN1dGUgdGhlIGdpdmVuIGJsb2NrLkBpbml0aWFsaXplX2Jsb2NrBBhoZWFkZXKhAYkNBEEBIEluaXRpYWxpemUgYSBibG9jayB3aXRoIHRoZSBnaXZlbiBoZWFkZXIgYW5kIHJldHVybiB0aGUgcnVudGltZSBleGVjdXRpdmUgbW9kZS4EIQEgVGhlIGBDb3JlYCBydW50aW1lIGFwaSB0aGF0IGV2ZXJ5IFN1YnN0cmF0ZSBydW50aW1lIG5lZWRzIHRvIGltcGxlbWVudC4gTWV0YWRhdGEMIG1ldGFkYXRhAI0NBIwgUmV0dXJucyB0aGUgbWV0YWRhdGEgb2YgYSBydW50aW1lLkxtZXRhZGF0YV9hdF92ZXJzaW9uBBx2ZXJzaW9uEJENEKQgUmV0dXJucyB0aGUgbWV0YWRhdGEgYXQgYSBnaXZlbiB2ZXJzaW9uLgAFASBJZiB0aGUgZ2l2ZW4gYHZlcnNpb25gIGlzbid0IHN1cHBvcnRlZCwgdGhpcyB3aWxsIHJldHVybiBgTm9uZWAudQEgVXNlIFtgU2VsZjo6bWV0YWRhdGFfdmVyc2lvbnNgXSB0byBmaW5kIG91dCBhYm91dCBzdXBwb3J0ZWQgbWV0YWRhdGEgdmVyc2lvbiBvZiB0aGUgcnVudGltZS5EbWV0YWRhdGFfdmVyc2lvbnMA5QEMpCBSZXR1cm5zIHRoZSBzdXBwb3J0ZWQgbWV0YWRhdGEgdmVyc2lvbnMuAMAgVGhpcyBjYW4gYmUgdXNlZCB0byBjYWxsIGBtZXRhZGF0YV9hdF92ZXJzaW9uYC4EAQEgVGhlIGBNZXRhZGF0YWAgYXBpIHRyYWl0IHRoYXQgcmV0dXJucyBtZXRhZGF0YSBmb3IgdGhlIHJ1bnRpbWUuMEJsb2NrQnVpbGRlchA8YXBwbHlfZXh0cmluc2ljBCRleHRyaW5zaWOBDZUNEGwgQXBwbHkgdGhlIGdpdmVuIGV4dHJpbnNpYy4AOQEgUmV0dXJucyBhbiBpbmNsdXNpb24gb3V0Y29tZSB3aGljaCBzcGVjaWZpZXMgaWYgdGhpcyBleHRyaW5zaWMgaXMgaW5jbHVkZWQgaW5MIHRoaXMgYmxvY2sgb3Igbm90LjhmaW5hbGl6ZV9ibG9jawChAQRoIEZpbmlzaCB0aGUgY3VycmVudCBibG9jay5MaW5oZXJlbnRfZXh0cmluc2ljcwQgaW5oZXJlbnSlDYUNBD0BIEdlbmVyYXRlIGluaGVyZW50IGV4dHJpbnNpY3MuIFRoZSBpbmhlcmVudCBkYXRhIHdpbGwgdmFyeSBmcm9tIGNoYWluIHRvIGNoYWluLjxjaGVja19pbmhlcmVudHMIFGJsb2NrfQ0QZGF0YaUNtQ0EVQEgQ2hlY2sgdGhhdCB0aGUgaW5oZXJlbnRzIGFyZSB2YWxpZC4gVGhlIGluaGVyZW50IGRhdGEgd2lsbCB2YXJ5IGZyb20gY2hhaW4gdG8gY2hhaW4uBHEBIFRoZSBgQmxvY2tCdWlsZGVyYCBhcGkgdHJhaXQgdGhhdCBwcm92aWRlcyB0aGUgcmVxdWlyZWQgZnVuY3Rpb25hbGl0eSBmb3IgYnVpbGRpbmcgYSBibG9jay5ITm9taW5hdGlvblBvb2xzQXBpHDxwZW5kaW5nX3Jld2FyZHMEDHdobwAYBDUBIFJldHVybnMgdGhlIHBlbmRpbmcgcmV3YXJkcyBmb3IgdGhlIG1lbWJlciB0aGF0IHRoZSBBY2NvdW50SWQgd2FzIGdpdmVuIGZvci5EcG9pbnRzX3RvX2JhbGFuY2UIHHBvb2xfaWQQGHBvaW50cxgYBPQgUmV0dXJucyB0aGUgZXF1aXZhbGVudCBiYWxhbmNlIG9mIGBwb2ludHNgIGZvciBhIGdpdmVuIHBvb2wuRGJhbGFuY2VfdG9fcG9pbnRzCBxwb29sX2lkECRuZXdfZnVuZHMYGAT8IFJldHVybnMgdGhlIGVxdWl2YWxlbnQgcG9pbnRzIG9mIGBuZXdfZnVuZHNgIGZvciBhIGdpdmVuIHBvb2wuSHBvb2xfcGVuZGluZ19zbGFzaAQccG9vbF9pZBAYBLAgUmV0dXJucyB0aGUgcGVuZGluZyBzbGFzaCBmb3IgYSBnaXZlbiBwb29sLlBtZW1iZXJfcGVuZGluZ19zbGFzaAQYbWVtYmVyABgEzCBSZXR1cm5zIHRoZSBwZW5kaW5nIHNsYXNoIGZvciBhIGdpdmVuIHBvb2wgbWVtYmVyLnRwb29sX25lZWRzX2RlbGVnYXRlX21pZ3JhdGlvbgQccG9vbF9pZBAgIOQgUmV0dXJucyB0cnVlIGlmIHRoZSBwb29sIHdpdGggYHBvb2xfaWRgIG5lZWRzIG1pZ3JhdGlvbi4ASQEgVGhpcyBjYW4gaGFwcGVuIHdoZW4gdGhlIGBwYWxsZXQtbm9taW5hdGlvbi1wb29sc2AgaGFzIHN3aXRjaGVkIHRvIHVzaW5nIHN0cmF0ZWd5QQEgW2BEZWxlZ2F0ZVN0YWtlYF0ocGFsbGV0X25vbWluYXRpb25fcG9vbHM6OmFkYXB0ZXI6OkRlbGVnYXRlU3Rha2UpIGJ1dCB0aGUgcG9vbOggc3RpbGwgaGFzIGZ1bmRzIHRoYXQgd2VyZSBzdGFrZWQgdXNpbmcgdGhlIG9sZGVyIHN0cmF0ZWd5GQEgW1RyYW5zZmVyU3Rha2VdKHBhbGxldF9ub21pbmF0aW9uX3Bvb2xzOjphZGFwdGVyOjpUcmFuc2ZlclN0YWtlKS4gVXNliQEgW2BtaWdyYXRlX3Bvb2xfdG9fZGVsZWdhdGVfc3Rha2VgXShwYWxsZXRfbm9taW5hdGlvbl9wb29sczo6Q2FsbDo6bWlncmF0ZV9wb29sX3RvX2RlbGVnYXRlX3N0YWtlKVQgdG8gbWlncmF0ZSB0aGUgcG9vbC58bWVtYmVyX25lZWRzX2RlbGVnYXRlX21pZ3JhdGlvbgQYbWVtYmVyACAcKQEgUmV0dXJucyB0cnVlIGlmIHRoZSBkZWxlZ2F0ZWQgZnVuZHMgb2YgdGhlIHBvb2wgYG1lbWJlcmAgbmVlZHMgbWlncmF0aW9uLgDYIE9uY2UgYSBwb29sIGhhcyBzdWNjZXNzZnVsbHkgbWlncmF0ZWQgdG8gdGhlIHN0cmF0ZWd5VQEgW2BEZWxlZ2F0ZVN0YWtlYF0ocGFsbGV0X25vbWluYXRpb25fcG9vbHM6OmFkYXB0ZXI6OkRlbGVnYXRlU3Rha2UpLCB0aGUgZnVuZHMgb2YgdGhlGQEgbWVtYmVyIGNhbiBiZSBtaWdyYXRlZCBmcm9tIHBvb2wgYWNjb3VudCB0byB0aGUgbWVtYmVyJ3MgYWNjb3VudC4gVXNlKQEgW2BtaWdyYXRlX2RlbGVnYXRpb25gXShwYWxsZXRfbm9taW5hdGlvbl9wb29sczo6Q2FsbDo6bWlncmF0ZV9kZWxlZ2F0aW9uKaQgdG8gbWlncmF0ZSB0aGUgZnVuZHMgb2YgdGhlIHBvb2wgbWVtYmVyLgT4IFJ1bnRpbWUgYXBpIGZvciBhY2Nlc3NpbmcgaW5mb3JtYXRpb24gYWJvdXQgbm9taW5hdGlvbiBwb29scy4oU3Rha2luZ0FwaQxEbm9taW5hdGlvbnNfcXVvdGEEHGJhbGFuY2UYEAQRASBSZXR1cm5zIHRoZSBub21pbmF0aW9ucyBxdW90YSBmb3IgYSBub21pbmF0b3Igd2l0aCBhIGdpdmVuIGJhbGFuY2UuXGVyYXNfc3Rha2Vyc19wYWdlX2NvdW50CAxlcmEQHGFjY291bnQAEAQ5ASBSZXR1cm5zIHRoZSBwYWdlIGNvdW50IG9mIGV4cG9zdXJlcyBmb3IgYSB2YWxpZGF0b3IgYGFjY291bnRgIGluIGEgZ2l2ZW4gZXJhLjxwZW5kaW5nX3Jld2FyZHMIDGVyYRAcYWNjb3VudAAgBD0BIFJldHVybnMgdHJ1ZSBpZiB2YWxpZGF0b3IgYGFjY291bnRgIGhhcyBwYWdlcyB0byBiZSBjbGFpbWVkIGZvciB0aGUgZ2l2ZW4gZXJhLgBYVGFnZ2VkVHJhbnNhY3Rpb25RdWV1ZQRQdmFsaWRhdGVfdHJhbnNhY3Rpb24MGHNvdXJjZbkNCHR4gQ0oYmxvY2tfaGFzaDS9DSRoIFZhbGlkYXRlIHRoZSB0cmFuc2FjdGlvbi4AZQEgVGhpcyBtZXRob2QgaXMgaW52b2tlZCBieSB0aGUgdHJhbnNhY3Rpb24gcG9vbCB0byBsZWFybiBkZXRhaWxzIGFib3V0IGdpdmVuIHRyYW5zYWN0aW9uLkUBIFRoZSBpbXBsZW1lbnRhdGlvbiBzaG91bGQgbWFrZSBzdXJlIHRvIHZlcmlmeSB0aGUgY29ycmVjdG5lc3Mgb2YgdGhlIHRyYW5zYWN0aW9uTQEgYWdhaW5zdCBjdXJyZW50IHN0YXRlLiBUaGUgZ2l2ZW4gYGJsb2NrX2hhc2hgIGNvcnJlc3BvbmRzIHRvIHRoZSBoYXNoIG9mIHRoZSBibG9ja3wgdGhhdCBpcyB1c2VkIGFzIGN1cnJlbnQgc3RhdGUuAEUBIE5vdGUgdGhhdCB0aGlzIGNhbGwgbWF5IGJlIHBlcmZvcm1lZCBieSB0aGUgcG9vbCBtdWx0aXBsZSB0aW1lcyBhbmQgdHJhbnNhY3Rpb25zpCBtaWdodCBiZSB2ZXJpZmllZCBpbiBhbnkgcG9zc2libGUgb3JkZXIuBE0BIFRoZSBgVGFnZ2VkVHJhbnNhY3Rpb25RdWV1ZWAgYXBpIHRyYWl0IGZvciBpbnRlcmZlcmluZyB3aXRoIHRoZSB0cmFuc2FjdGlvbiBxdWV1ZS5ET2ZmY2hhaW5Xb3JrZXJBcGkEPG9mZmNoYWluX3dvcmtlcgQYaGVhZGVyoQGMBMggU3RhcnRzIHRoZSBvZmYtY2hhaW4gdGFzayBmb3IgZ2l2ZW4gYmxvY2sgaGVhZGVyLgRkIFRoZSBvZmZjaGFpbiB3b3JrZXIgYXBpLjRQYXJhY2hhaW5Ib3N0fCh2YWxpZGF0b3JzACkLBHAgR2V0IHRoZSBjdXJyZW50IHZhbGlkYXRvcnMuQHZhbGlkYXRvcl9ncm91cHMAxQ0MZQEgUmV0dXJucyB0aGUgdmFsaWRhdG9yIGdyb3VwcyBhbmQgcm90YXRpb24gaW5mbyBsb2NhbGl6ZWQgYmFzZWQgb24gdGhlIGh5cG90aGV0aWNhbCBjaGlsZGEBICBvZiBhIGJsb2NrIHdob3NlIHN0YXRlICB0aGlzIGlzIGludm9rZWQgb24uIE5vdGUgdGhhdCBgbm93YCBpbiB0aGUgYEdyb3VwUm90YXRpb25JbmZvYNAgc2hvdWxkIGJlIHRoZSBzdWNjZXNzb3Igb2YgdGhlIG51bWJlciBvZiB0aGUgYmxvY2suSGF2YWlsYWJpbGl0eV9jb3JlcwDNDQg1ASBZaWVsZHMgaW5mb3JtYXRpb24gb24gYWxsIGF2YWlsYWJpbGl0eSBjb3JlcyBhcyByZWxldmFudCB0byB0aGUgY2hpbGQgYmxvY2suPQEgQ29yZXMgYXJlIGVpdGhlciBmcmVlIG9yIG9jY3VwaWVkLiBGcmVlIGNvcmVzIGNhbiBoYXZlIHBhcmFzIGFzc2lnbmVkIHRvIHRoZW0uZHBlcnNpc3RlZF92YWxpZGF0aW9uX2RhdGEIHHBhcmFfaWSNAihhc3N1bXB0aW9u5Q3pDRRpASBZaWVsZHMgdGhlIHBlcnNpc3RlZCB2YWxpZGF0aW9uIGRhdGEgZm9yIHRoZSBnaXZlbiBgUGFyYUlkYCBhbG9uZyB3aXRoIGFuIGFzc3VtcHRpb24gdGhhdNggc2hvdWxkIGJlIHVzZWQgaWYgdGhlIHBhcmEgY3VycmVudGx5IG9jY3VwaWVzIGEgY29yZS4ARQEgUmV0dXJucyBgTm9uZWAgaWYgZWl0aGVyIHRoZSBwYXJhIGlzIG5vdCByZWdpc3RlcmVkIG9yIHRoZSBhc3N1bXB0aW9uIGlzIGBGcmVlZGCYIGFuZCB0aGUgcGFyYSBhbHJlYWR5IG9jY3VwaWVzIGEgY29yZS5cYXNzdW1lZF92YWxpZGF0aW9uX2RhdGEIHHBhcmFfaWSNApxleHBlY3RlZF9wZXJzaXN0ZWRfdmFsaWRhdGlvbl9kYXRhX2hhc2g08Q0MaQEgUmV0dXJucyB0aGUgcGVyc2lzdGVkIHZhbGlkYXRpb24gZGF0YSBmb3IgdGhlIGdpdmVuIGBQYXJhSWRgIGFsb25nIHdpdGggdGhlIGNvcnJlc3BvbmRpbmd1ASB2YWxpZGF0aW9uIGNvZGUgaGFzaC4gSW5zdGVhZCBvZiBhY2NlcHRpbmcgYXNzdW1wdGlvbiBhYm91dCB0aGUgcGFyYSwgbWF0Y2hlcyB0aGUgdmFsaWRhdGlvbikBIGRhdGEgaGFzaCBhZ2FpbnN0IGFuIGV4cGVjdGVkIG9uZSBhbmQgeWllbGRzIGBOb25lYCBpZiB0aGV5J3JlIG5vdCBlcXVhbC5gY2hlY2tfdmFsaWRhdGlvbl9vdXRwdXRzCBxwYXJhX2lkjQIcb3V0cHV0c70EIAQVASBDaGVja3MgaWYgdGhlIGdpdmVuIHZhbGlkYXRpb24gb3V0cHV0cyBwYXNzIHRoZSBhY2NlcHRhbmNlIGNyaXRlcmlhLlxzZXNzaW9uX2luZGV4X2Zvcl9jaGlsZAAQDPAgUmV0dXJucyB0aGUgc2Vzc2lvbiBpbmRleCBleHBlY3RlZCBhdCBhIGNoaWxkIG9mIHRoZSBibG9jay4A0CBUaGlzIGNhbiBiZSB1c2VkIHRvIGluc3RhbnRpYXRlIGEgYFNpZ25pbmdDb250ZXh0YC48dmFsaWRhdGlvbl9jb2RlCBxwYXJhX2lkjQIoYXNzdW1wdGlvbuUN0QQQVQEgRmV0Y2ggdGhlIHZhbGlkYXRpb24gY29kZSB1c2VkIGJ5IGEgcGFyYSwgbWFraW5nIHRoZSBnaXZlbiBgT2NjdXBpZWRDb3JlQXNzdW1wdGlvbmAuAEUBIFJldHVybnMgYE5vbmVgIGlmIGVpdGhlciB0aGUgcGFyYSBpcyBub3QgcmVnaXN0ZXJlZCBvciB0aGUgYXNzdW1wdGlvbiBpcyBgRnJlZWRgmCBhbmQgdGhlIHBhcmEgYWxyZWFkeSBvY2N1cGllcyBhIGNvcmUueGNhbmRpZGF0ZV9wZW5kaW5nX2F2YWlsYWJpbGl0eQQccGFyYV9pZI0C+Q0IXQEgR2V0IHRoZSByZWNlaXB0IG9mIGEgY2FuZGlkYXRlIHBlbmRpbmcgYXZhaWxhYmlsaXR5LiBUaGlzIHJldHVybnMgYFNvbWVgIGZvciBhbnkgcGFyYXMlASBhc3NpZ25lZCB0byBvY2N1cGllZCBjb3JlcyBpbiBgYXZhaWxhYmlsaXR5X2NvcmVzYCBhbmQgYE5vbmVgIG90aGVyd2lzZS5AY2FuZGlkYXRlX2V2ZW50cwD9DQQtASBHZXQgYSB2ZWN0b3Igb2YgZXZlbnRzIGNvbmNlcm5pbmcgY2FuZGlkYXRlcyB0aGF0IG9jY3VycmVkIHdpdGhpbiBhIGJsb2NrLjBkbXFfY29udGVudHMEJHJlY2lwaWVudI0CxQsEPQEgR2V0IGFsbCB0aGUgcGVuZGluZyBpbmJvdW5kIG1lc3NhZ2VzIGluIHRoZSBkb3dud2FyZCBtZXNzYWdlIHF1ZXVlIGZvciBhIHBhcmEueGluYm91bmRfaHJtcF9jaGFubmVsc19jb250ZW50cwQkcmVjaXBpZW50jQIFDghlASBHZXQgdGhlIGNvbnRlbnRzIG9mIGFsbCBjaGFubmVscyBhZGRyZXNzZWQgdG8gdGhlIGdpdmVuIHJlY2lwaWVudC4gQ2hhbm5lbHMgdGhhdCBoYXZlIG5vkCBtZXNzYWdlcyBpbiB0aGVtIGFyZSBhbHNvIGluY2x1ZGVkLlx2YWxpZGF0aW9uX2NvZGVfYnlfaGFzaAQQaGFzaLkE0QQEnCBHZXQgdGhlIHZhbGlkYXRpb24gY29kZSBmcm9tIGl0cyBoYXNoLjhvbl9jaGFpbl92b3RlcwARDgQxASBTY3JhcGUgZGlzcHV0ZSByZWxldmFudCBmcm9tIG9uLWNoYWluLCBiYWNraW5nIHZvdGVzIGFuZCByZXNvbHZlZCBkaXNwdXRlcy4wc2Vzc2lvbl9pbmZvBBRpbmRleBAVDgzcIEdldCB0aGUgc2Vzc2lvbiBpbmZvIGZvciB0aGUgZ2l2ZW4gc2Vzc2lvbiwgaWYgc3RvcmVkLgAZASBOT1RFOiBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgYXZhaWxhYmxlIHNpbmNlIHBhcmFjaGFpbiBob3N0IHZlcnNpb24gMi5oc3VibWl0X3B2Zl9jaGVja19zdGF0ZW1lbnQIEHN0bXQNBSRzaWduYXR1cmWdBIwMAQEgU3VibWl0cyBhIFBWRiBwcmUtY2hlY2tpbmcgc3RhdGVtZW50IGludG8gdGhlIHRyYW5zYWN0aW9uIHBvb2wuABkBIE5PVEU6IFRoaXMgZnVuY3Rpb24gaXMgb25seSBhdmFpbGFibGUgc2luY2UgcGFyYWNoYWluIGhvc3QgdmVyc2lvbiAyLlRwdmZzX3JlcXVpcmVfcHJlY2hlY2sAkQsMXQEgUmV0dXJucyBjb2RlIGhhc2hlcyBvZiBQVkZzIHRoYXQgcmVxdWlyZSBwcmUtY2hlY2tpbmcgYnkgdmFsaWRhdG9ycyBpbiB0aGUgYWN0aXZlIHNldC4AGQEgTk9URTogVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGF2YWlsYWJsZSBzaW5jZSBwYXJhY2hhaW4gaG9zdCB2ZXJzaW9uIDIuUHZhbGlkYXRpb25fY29kZV9oYXNoCBxwYXJhX2lkjQIoYXNzdW1wdGlvbuUNGQ4MhQEgRmV0Y2ggdGhlIGhhc2ggb2YgdGhlIHZhbGlkYXRpb24gY29kZSB1c2VkIGJ5IGEgcGFyYSwgbWFraW5nIHRoZSBnaXZlbiBgT2NjdXBpZWRDb3JlQXNzdW1wdGlvbmAuABkBIE5PVEU6IFRoaXMgZnVuY3Rpb24gaXMgb25seSBhdmFpbGFibGUgc2luY2UgcGFyYWNoYWluIGhvc3QgdmVyc2lvbiAyLiBkaXNwdXRlcwAdDgR4IFJldHVybnMgYWxsIG9uY2hhaW4gZGlzcHV0ZXMuXHNlc3Npb25fZXhlY3V0b3JfcGFyYW1zBDRzZXNzaW9uX2luZGV4ECUOBLggUmV0dXJucyBleGVjdXRpb24gcGFyYW1ldGVycyBmb3IgdGhlIHNlc3Npb24uRHVuYXBwbGllZF9zbGFzaGVzACkOCFkBIFJldHVybnMgYSBsaXN0IG9mIHZhbGlkYXRvcnMgdGhhdCBsb3N0IGEgcGFzdCBzZXNzaW9uIGRpc3B1dGUgYW5kIG5lZWQgdG8gYmUgc2xhc2hlZC4ZASBOT1RFOiBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgYXZhaWxhYmxlIHNpbmNlIHBhcmFjaGFpbiBob3N0IHZlcnNpb24gNS5Ma2V5X293bmVyc2hpcF9wcm9vZgQwdmFsaWRhdG9yX2lkHQIxDgjMIFJldHVybnMgYSBtZXJrbGUgcHJvb2Ygb2YgYSB2YWxpZGF0b3Igc2Vzc2lvbiBrZXkuGQEgTk9URTogVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGF2YWlsYWJsZSBzaW5jZSBwYXJhY2hhaW4gaG9zdCB2ZXJzaW9uIDUuaHN1Ym1pdF9yZXBvcnRfZGlzcHV0ZV9sb3N0CDRkaXNwdXRlX3Byb29mJQVMa2V5X293bmVyc2hpcF9wcm9vZjUOOQ4MKQEgU3VibWl0IGFuIHVuc2lnbmVkIGV4dHJpbnNpYyB0byBzbGFzaCB2YWxpZGF0b3JzIHdobyBsb3N0IGEgZGlzcHV0ZSBhYm91dHwgYSBjYW5kaWRhdGUgb2YgYSBwYXN0IHNlc3Npb24uGQEgTk9URTogVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGF2YWlsYWJsZSBzaW5jZSBwYXJhY2hhaW4gaG9zdCB2ZXJzaW9uIDUuVG1pbmltdW1fYmFja2luZ192b3RlcwAQCA0BIEdldCB0aGUgbWluaW11bSBudW1iZXIgb2YgYmFja2luZyB2b3RlcyBmb3IgYSBwYXJhY2hhaW4gY2FuZGlkYXRlLvQgVGhpcyBpcyBhIHN0YWdpbmcgbWV0aG9kISBEbyBub3QgdXNlIG9uIHByb2R1Y3Rpb24gcnVudGltZXMhSHBhcmFfYmFja2luZ19zdGF0ZQQEX40CPQ4E5CBSZXR1cm5zIHRoZSBzdGF0ZSBvZiBwYXJhY2hhaW4gYmFja2luZyBmb3IgYSBnaXZlbiBwYXJhLlBhc3luY19iYWNraW5nX3BhcmFtcwBVBARhASBSZXR1cm5zIGNhbmRpZGF0ZSdzIGFjY2VwdGFuY2UgbGltaXRhdGlvbnMgZm9yIGFzeW5jaHJvbm91cyBiYWNraW5nIGZvciBhIHJlbGF5IHBhcmVudC5MZGlzYWJsZWRfdmFsaWRhdG9ycwAlCwT4IFJldHVybnMgYSBsaXN0IG9mIGFsbCBkaXNhYmxlZCB2YWxpZGF0b3JzIGF0IHRoZSBnaXZlbiBibG9jay40bm9kZV9mZWF0dXJlcwCRBAhMIEdldCBub2RlIGZlYXR1cmVzLvQgVGhpcyBpcyBhIHN0YWdpbmcgbWV0aG9kISBEbyBub3QgdXNlIG9uIHByb2R1Y3Rpb24gcnVudGltZXMhWGFwcHJvdmFsX3ZvdGluZ19wYXJhbXMAbQQEpCBBcHByb3ZhbCB2b3RpbmcgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzLGNsYWltX3F1ZXVlAG0OBDAgQ2xhaW0gcXVldWV8Y2FuZGlkYXRlc19wZW5kaW5nX2F2YWlsYWJpbGl0eQQccGFyYV9pZI0CeQ4EYCBFbGFzdGljIHNjYWxpbmcgc3VwcG9ydATcIFRoZSBBUEkgZm9yIHF1ZXJ5aW5nIHRoZSBzdGF0ZSBvZiBwYXJhY2hhaW5zIG9uLWNoYWluLiBCZWVmeUFwaRA0YmVlZnlfZ2VuZXNpcwBhAgQFASBSZXR1cm4gdGhlIGJsb2NrIG51bWJlciB3aGVyZSBCRUVGWSBjb25zZW5zdXMgaXMgZW5hYmxlZC9zdGFydGVkNHZhbGlkYXRvcl9zZXQAfQ4EuCBSZXR1cm4gdGhlIGN1cnJlbnQgYWN0aXZlIEJFRUZZIHZhbGlkYXRvciBzZXS0c3VibWl0X3JlcG9ydF9lcXVpdm9jYXRpb25fdW5zaWduZWRfZXh0cmluc2ljCEhlcXVpdm9jYXRpb25fcHJvb2bZBjxrZXlfb3duZXJfcHJvb2aFDjkOIBEBIFN1Ym1pdHMgYW4gdW5zaWduZWQgZXh0cmluc2ljIHRvIHJlcG9ydCBhbiBlcXVpdm9jYXRpb24uIFRoZSBjYWxsZXL4IG11c3QgcHJvdmlkZSB0aGUgZXF1aXZvY2F0aW9uIHByb29mIGFuZCBhIGtleSBvd25lcnNoaXAgcHJvb2b8IChzaG91bGQgYmUgb2J0YWluZWQgdXNpbmcgYGdlbmVyYXRlX2tleV9vd25lcnNoaXBfcHJvb2ZgKS4gVGhlBQEgZXh0cmluc2ljIHdpbGwgYmUgdW5zaWduZWQgYW5kIHNob3VsZCBvbmx5IGJlIGFjY2VwdGVkIGZvciBsb2NhbBUBIGF1dGhvcnNoaXAgKG5vdCB0byBiZSBicm9hZGNhc3QgdG8gdGhlIG5ldHdvcmspLiBUaGlzIG1ldGhvZCByZXR1cm5zCQEgYE5vbmVgIHdoZW4gY3JlYXRpb24gb2YgdGhlIGV4dHJpbnNpYyBmYWlscywgZS5nLiBpZiBlcXVpdm9jYXRpb24FASByZXBvcnRpbmcgaXMgZGlzYWJsZWQgZm9yIHRoZSBnaXZlbiBydW50aW1lIChpLmUuIHRoaXMgbWV0aG9kIGlzBQEgaGFyZGNvZGVkIHRvIHJldHVybiBgTm9uZWApLiBPbmx5IHVzZWZ1bCBpbiBhbiBvZmZjaGFpbiBjb250ZXh0LnBnZW5lcmF0ZV9rZXlfb3duZXJzaGlwX3Byb29mCBhzZXRfaWQwMGF1dGhvcml0eV9pZCkCiQ4sCQEgR2VuZXJhdGVzIGEgcHJvb2Ygb2Yga2V5IG93bmVyc2hpcCBmb3IgdGhlIGdpdmVuIGF1dGhvcml0eSBpbiB0aGX8IGdpdmVuIHNldC4gQW4gZXhhbXBsZSB1c2FnZSBvZiB0aGlzIG1vZHVsZSBpcyBjb3VwbGVkIHdpdGggdGhlBQEgc2Vzc2lvbiBoaXN0b3JpY2FsIG1vZHVsZSB0byBwcm92ZSB0aGF0IGEgZ2l2ZW4gYXV0aG9yaXR5IGtleSBpcw0BIHRpZWQgdG8gYSBnaXZlbiBzdGFraW5nIGlkZW50aXR5IGR1cmluZyBhIHNwZWNpZmljIHNlc3Npb24uIFByb29mcxEBIG9mIGtleSBvd25lcnNoaXAgYXJlIG5lY2Vzc2FyeSBmb3Igc3VibWl0dGluZyBlcXVpdm9jYXRpb24gcmVwb3J0cy4RASBOT1RFOiBldmVuIHRob3VnaCB0aGUgQVBJIHRha2VzIGEgYHNldF9pZGAgYXMgcGFyYW1ldGVyIHRoZSBjdXJyZW50CQEgaW1wbGVtZW50YXRpb25zIGlnbm9yZXMgdGhpcyBwYXJhbWV0ZXIgYW5kIGluc3RlYWQgcmVsaWVzIG9uIHRoaXMNASBtZXRob2QgYmVpbmcgY2FsbGVkIGF0IHRoZSBjb3JyZWN0IGJsb2NrIGhlaWdodCwgaS5lLiBhbnkgcG9pbnQgYXQVASB3aGljaCB0aGUgZ2l2ZW4gc2V0IGlkIGlzIGxpdmUgb24tY2hhaW4uIEZ1dHVyZSBpbXBsZW1lbnRhdGlvbnMgd2lsbA0BIGluc3RlYWQgdXNlIGluZGV4ZWQgZGF0YSB0aHJvdWdoIGFuIG9mZmNoYWluIHdvcmtlciwgbm90IHJlcXVpcmluZ3ggb2xkZXIgc3RhdGVzIHRvIGJlIGF2YWlsYWJsZS4EgCBBUEkgbmVjZXNzYXJ5IGZvciBCRUVGWSB2b3RlcnMuGE1tckFwaRQgbW1yX3Jvb3QAjQ4EjCBSZXR1cm4gdGhlIG9uLWNoYWluIE1NUiByb290IGhhc2guOG1tcl9sZWFmX2NvdW50AJUOBLggUmV0dXJuIHRoZSBudW1iZXIgb2YgTU1SIGJsb2NrcyBpbiB0aGUgY2hhaW4uOGdlbmVyYXRlX3Byb29mCDRibG9ja19udW1iZXJz5QFcYmVzdF9rbm93bl9ibG9ja19udW1iZXJhApkOCGkBIEdlbmVyYXRlIE1NUiBwcm9vZiBmb3IgYSBzZXJpZXMgb2YgYmxvY2sgbnVtYmVycy4gSWYgYGJlc3Rfa25vd25fYmxvY2tfbnVtYmVyID0gU29tZShuKWAsRQEgdXNlIGhpc3RvcmljYWwgTU1SIHN0YXRlIGF0IGdpdmVuIGJsb2NrIGhlaWdodCBgbmAuIEVsc2UsIHVzZSBjdXJyZW50IE1NUiBzdGF0ZS4wdmVyaWZ5X3Byb29mCBhsZWF2ZXOhDhRwcm9vZqkOrQ4U9CBWZXJpZnkgTU1SIHByb29mIGFnYWluc3Qgb24tY2hhaW4gTU1SIGZvciBhIGJhdGNoIG9mIGxlYXZlcy4AcQEgTm90ZSB0aGlzIGZ1bmN0aW9uIHdpbGwgdXNlIG9uLWNoYWluIE1NUiByb290IGhhc2ggYW5kIGNoZWNrIGlmIHRoZSBwcm9vZiBtYXRjaGVzIHRoZSBoYXNoLm0BIE5vdGUsIHRoZSBsZWF2ZXMgc2hvdWxkIGJlIHNvcnRlZCBzdWNoIHRoYXQgY29ycmVzcG9uZGluZyBsZWF2ZXMgYW5kIGxlYWYgaW5kaWNlcyBoYXZlIHRoZZUBIHNhbWUgcG9zaXRpb24gaW4gYm90aCB0aGUgYGxlYXZlc2AgdmVjdG9yIGFuZCB0aGUgYGxlYWZfaW5kaWNlc2AgdmVjdG9yIGNvbnRhaW5lZCBpbiB0aGUgW0xlYWZQcm9vZl1YdmVyaWZ5X3Byb29mX3N0YXRlbGVzcwwQcm9vdDQYbGVhdmVzoQ4UcHJvb2apDq0OHAEBIFZlcmlmeSBNTVIgcHJvb2YgYWdhaW5zdCBnaXZlbiByb290IGhhc2ggZm9yIGEgYmF0Y2ggb2YgbGVhdmVzLgD8IE5vdGUgdGhpcyBmdW5jdGlvbiBkb2VzIG5vdCByZXF1aXJlIGFueSBvbi1jaGFpbiBzdG9yYWdlIC0gdGhlvCBwcm9vZiBpcyB2ZXJpZmllZCBhZ2FpbnN0IGdpdmVuIE1NUiByb290IGhhc2guAG0BIE5vdGUsIHRoZSBsZWF2ZXMgc2hvdWxkIGJlIHNvcnRlZCBzdWNoIHRoYXQgY29ycmVzcG9uZGluZyBsZWF2ZXMgYW5kIGxlYWYgaW5kaWNlcyBoYXZlIHRoZZUBIHNhbWUgcG9zaXRpb24gaW4gYm90aCB0aGUgYGxlYXZlc2AgdmVjdG9yIGFuZCB0aGUgYGxlYWZfaW5kaWNlc2AgdmVjdG9yIGNvbnRhaW5lZCBpbiB0aGUgW0xlYWZQcm9vZl0EhCBBUEkgdG8gaW50ZXJhY3Qgd2l0aCBNTVIgcGFsbGV0LixCZWVmeU1tckFwaQhMYXV0aG9yaXR5X3NldF9wcm9vZgAxDQTcIFJldHVybiB0aGUgY3VycmVudGx5IGFjdGl2ZSBCRUVGWSBhdXRob3JpdHkgc2V0IHByb29mLmBuZXh0X2F1dGhvcml0eV9zZXRfcHJvb2YAMQ0EyCBSZXR1cm4gdGhlIG5leHQvcXVldWVkIEJFRUZZIGF1dGhvcml0eSBzZXQgcHJvb2YuBJAgQVBJIHVzZWZ1bCBmb3IgQkVFRlkgbGlnaHQgY2xpZW50cy4oR3JhbmRwYUFwaRBMZ3JhbmRwYV9hdXRob3JpdGllcwDMGD0BIEdldCB0aGUgY3VycmVudCBHUkFORFBBIGF1dGhvcml0aWVzIGFuZCB3ZWlnaHRzLiBUaGlzIHNob3VsZCBub3QgY2hhbmdlIGV4Y2VwdB0BIGZvciB3aGVuIGNoYW5nZXMgYXJlIHNjaGVkdWxlZCBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgZGVsYXkgaGFzIHBhc3NlZC4ANQEgV2hlbiBjYWxsZWQgYXQgYmxvY2sgQiwgaXQgd2lsbCByZXR1cm4gdGhlIHNldCBvZiBhdXRob3JpdGllcyB0aGF0IHNob3VsZCBiZT0BIHVzZWQgdG8gZmluYWxpemUgZGVzY2VuZGFudHMgb2YgdGhpcyBibG9jayAoQisxLCBCKzIsIC4uLikuIFRoZSBibG9jayBCIGl0c2VsZsAgaXMgZmluYWxpemVkIGJ5IHRoZSBhdXRob3JpdGllcyBmcm9tIGJsb2NrIEItMS60c3VibWl0X3JlcG9ydF9lcXVpdm9jYXRpb25fdW5zaWduZWRfZXh0cmluc2ljCEhlcXVpdm9jYXRpb25fcHJvb2Y1AjxrZXlfb3duZXJfcHJvb2aFDjkOIBEBIFN1Ym1pdHMgYW4gdW5zaWduZWQgZXh0cmluc2ljIHRvIHJlcG9ydCBhbiBlcXVpdm9jYXRpb24uIFRoZSBjYWxsZXL4IG11c3QgcHJvdmlkZSB0aGUgZXF1aXZvY2F0aW9uIHByb29mIGFuZCBhIGtleSBvd25lcnNoaXAgcHJvb2b8IChzaG91bGQgYmUgb2J0YWluZWQgdXNpbmcgYGdlbmVyYXRlX2tleV9vd25lcnNoaXBfcHJvb2ZgKS4gVGhlBQEgZXh0cmluc2ljIHdpbGwgYmUgdW5zaWduZWQgYW5kIHNob3VsZCBvbmx5IGJlIGFjY2VwdGVkIGZvciBsb2NhbBUBIGF1dGhvcnNoaXAgKG5vdCB0byBiZSBicm9hZGNhc3QgdG8gdGhlIG5ldHdvcmspLiBUaGlzIG1ldGhvZCByZXR1cm5zCQEgYE5vbmVgIHdoZW4gY3JlYXRpb24gb2YgdGhlIGV4dHJpbnNpYyBmYWlscywgZS5nLiBpZiBlcXVpdm9jYXRpb24FASByZXBvcnRpbmcgaXMgZGlzYWJsZWQgZm9yIHRoZSBnaXZlbiBydW50aW1lIChpLmUuIHRoaXMgbWV0aG9kIGlzBQEgaGFyZGNvZGVkIHRvIHJldHVybiBgTm9uZWApLiBPbmx5IHVzZWZ1bCBpbiBhbiBvZmZjaGFpbiBjb250ZXh0LnBnZW5lcmF0ZV9rZXlfb3duZXJzaGlwX3Byb29mCBhzZXRfaWQwMGF1dGhvcml0eV9pZNSJDiwJASBHZW5lcmF0ZXMgYSBwcm9vZiBvZiBrZXkgb3duZXJzaGlwIGZvciB0aGUgZ2l2ZW4gYXV0aG9yaXR5IGluIHRoZfwgZ2l2ZW4gc2V0LiBBbiBleGFtcGxlIHVzYWdlIG9mIHRoaXMgbW9kdWxlIGlzIGNvdXBsZWQgd2l0aCB0aGUFASBzZXNzaW9uIGhpc3RvcmljYWwgbW9kdWxlIHRvIHByb3ZlIHRoYXQgYSBnaXZlbiBhdXRob3JpdHkga2V5IGlzDQEgdGllZCB0byBhIGdpdmVuIHN0YWtpbmcgaWRlbnRpdHkgZHVyaW5nIGEgc3BlY2lmaWMgc2Vzc2lvbi4gUHJvb2ZzEQEgb2Yga2V5IG93bmVyc2hpcCBhcmUgbmVjZXNzYXJ5IGZvciBzdWJtaXR0aW5nIGVxdWl2b2NhdGlvbiByZXBvcnRzLhEBIE5PVEU6IGV2ZW4gdGhvdWdoIHRoZSBBUEkgdGFrZXMgYSBgc2V0X2lkYCBhcyBwYXJhbWV0ZXIgdGhlIGN1cnJlbnT8IGltcGxlbWVudGF0aW9ucyBpZ25vcmUgdGhpcyBwYXJhbWV0ZXIgYW5kIGluc3RlYWQgcmVseSBvbiB0aGlzDQEgbWV0aG9kIGJlaW5nIGNhbGxlZCBhdCB0aGUgY29ycmVjdCBibG9jayBoZWlnaHQsIGkuZS4gYW55IHBvaW50IGF0FQEgd2hpY2ggdGhlIGdpdmVuIHNldCBpZCBpcyBsaXZlIG9uLWNoYWluLiBGdXR1cmUgaW1wbGVtZW50YXRpb25zIHdpbGwNASBpbnN0ZWFkIHVzZSBpbmRleGVkIGRhdGEgdGhyb3VnaCBhbiBvZmZjaGFpbiB3b3JrZXIsIG5vdCByZXF1aXJpbmd4IG9sZGVyIHN0YXRlcyB0byBiZSBhdmFpbGFibGUuOGN1cnJlbnRfc2V0X2lkADAEmCBHZXQgY3VycmVudCBHUkFORFBBIGF1dGhvcml0eSBzZXQgaWQuJAEBIEFQSXMgZm9yIGludGVncmF0aW5nIHRoZSBHUkFORFBBIGZpbmFsaXR5IGdhZGdldCBpbnRvIHJ1bnRpbWVzLsAgVGhpcyBzaG91bGQgYmUgaW1wbGVtZW50ZWQgb24gdGhlIHJ1bnRpbWUgc2lkZS4AFQEgVGhpcyBpcyBwcmltYXJpbHkgdXNlZCBmb3IgbmVnb3RpYXRpbmcgYXV0aG9yaXR5LXNldCBjaGFuZ2VzIGZvciB0aGUNASBnYWRnZXQuIEdSQU5EUEEgdXNlcyBhIHNpZ25hbGluZyBtb2RlbCBvZiBjaGFuZ2luZyBhdXRob3JpdHkgc2V0czoxASBjaGFuZ2VzIHNob3VsZCBiZSBzaWduYWxlZCB3aXRoIGEgZGVsYXkgb2YgTiBibG9ja3MsIGFuZCB0aGVuIGF1dG9tYXRpY2FsbHnkIGFwcGxpZWQgaW4gdGhlIHJ1bnRpbWUgYWZ0ZXIgdGhvc2UgTiBibG9ja3MgaGF2ZSBwYXNzZWQuAPwgVGhlIGNvbnNlbnN1cyBwcm90b2NvbCB3aWxsIGNvb3JkaW5hdGUgdGhlIGhhbmRvZmYgZXh0ZXJuYWxseS4cQmFiZUFwaRg0Y29uZmlndXJhdGlvbgCxDgSMIFJldHVybiB0aGUgY29uZmlndXJhdGlvbiBmb3IgQkFCRS5MY3VycmVudF9lcG9jaF9zdGFydACpAQTEIFJldHVybnMgdGhlIHNsb3QgdGhhdCBzdGFydGVkIHRoZSBjdXJyZW50IGVwb2NoLjRjdXJyZW50X2Vwb2NoALUOBMQgUmV0dXJucyBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhlIGN1cnJlbnQgZXBvY2guKG5leHRfZXBvY2gAtQ4IAQEgUmV0dXJucyBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhlIG5leHQgZXBvY2ggKHdoaWNoIHdhcyBhbHJlYWR5XCBwcmV2aW91c2x5IGFubm91bmNlZCkucGdlbmVyYXRlX2tleV9vd25lcnNoaXBfcHJvb2YIEHNsb3SpATBhdXRob3JpdHlfaWSlAbkOLAkBIEdlbmVyYXRlcyBhIHByb29mIG9mIGtleSBvd25lcnNoaXAgZm9yIHRoZSBnaXZlbiBhdXRob3JpdHkgaW4gdGhlDQEgY3VycmVudCBlcG9jaC4gQW4gZXhhbXBsZSB1c2FnZSBvZiB0aGlzIG1vZHVsZSBpcyBjb3VwbGVkIHdpdGggdGhlBQEgc2Vzc2lvbiBoaXN0b3JpY2FsIG1vZHVsZSB0byBwcm92ZSB0aGF0IGEgZ2l2ZW4gYXV0aG9yaXR5IGtleSBpcw0BIHRpZWQgdG8gYSBnaXZlbiBzdGFraW5nIGlkZW50aXR5IGR1cmluZyBhIHNwZWNpZmljIHNlc3Npb24uIFByb29mcxEBIG9mIGtleSBvd25lcnNoaXAgYXJlIG5lY2Vzc2FyeSBmb3Igc3VibWl0dGluZyBlcXVpdm9jYXRpb24gcmVwb3J0cy4JASBOT1RFOiBldmVuIHRob3VnaCB0aGUgQVBJIHRha2VzIGEgYHNsb3RgIGFzIHBhcmFtZXRlciB0aGUgY3VycmVudAkBIGltcGxlbWVudGF0aW9ucyBpZ25vcmVzIHRoaXMgcGFyYW1ldGVyIGFuZCBpbnN0ZWFkIHJlbGllcyBvbiB0aGlzDQEgbWV0aG9kIGJlaW5nIGNhbGxlZCBhdCB0aGUgY29ycmVjdCBibG9jayBoZWlnaHQsIGkuZS4gYW55IHBvaW50IGF08CB3aGljaCB0aGUgZXBvY2ggZm9yIHRoZSBnaXZlbiBzbG90IGlzIGxpdmUgb24tY2hhaW4uIEZ1dHVyZQkBIGltcGxlbWVudGF0aW9ucyB3aWxsIGluc3RlYWQgdXNlIGluZGV4ZWQgZGF0YSB0aHJvdWdoIGFuIG9mZmNoYWlu0CB3b3JrZXIsIG5vdCByZXF1aXJpbmcgb2xkZXIgc3RhdGVzIHRvIGJlIGF2YWlsYWJsZS60c3VibWl0X3JlcG9ydF9lcXVpdm9jYXRpb25fdW5zaWduZWRfZXh0cmluc2ljCEhlcXVpdm9jYXRpb25fcHJvb2adATxrZXlfb3duZXJfcHJvb2a9DjkOIBEBIFN1Ym1pdHMgYW4gdW5zaWduZWQgZXh0cmluc2ljIHRvIHJlcG9ydCBhbiBlcXVpdm9jYXRpb24uIFRoZSBjYWxsZXL4IG11c3QgcHJvdmlkZSB0aGUgZXF1aXZvY2F0aW9uIHByb29mIGFuZCBhIGtleSBvd25lcnNoaXAgcHJvb2b8IChzaG91bGQgYmUgb2J0YWluZWQgdXNpbmcgYGdlbmVyYXRlX2tleV9vd25lcnNoaXBfcHJvb2ZgKS4gVGhlBQEgZXh0cmluc2ljIHdpbGwgYmUgdW5zaWduZWQgYW5kIHNob3VsZCBvbmx5IGJlIGFjY2VwdGVkIGZvciBsb2NhbBUBIGF1dGhvcnNoaXAgKG5vdCB0byBiZSBicm9hZGNhc3QgdG8gdGhlIG5ldHdvcmspLiBUaGlzIG1ldGhvZCByZXR1cm5zCQEgYE5vbmVgIHdoZW4gY3JlYXRpb24gb2YgdGhlIGV4dHJpbnNpYyBmYWlscywgZS5nLiBpZiBlcXVpdm9jYXRpb24FASByZXBvcnRpbmcgaXMgZGlzYWJsZWQgZm9yIHRoZSBnaXZlbiBydW50aW1lIChpLmUuIHRoaXMgbWV0aG9kIGlzBQEgaGFyZGNvZGVkIHRvIHJldHVybiBgTm9uZWApLiBPbmx5IHVzZWZ1bCBpbiBhbiBvZmZjaGFpbiBjb250ZXh0LgS4IEFQSSBuZWNlc3NhcnkgZm9yIGJsb2NrIGF1dGhvcnNoaXAgd2l0aCBCQUJFLlRBdXRob3JpdHlEaXNjb3ZlcnlBcGkELGF1dGhvcml0aWVzAHkJBBkBIFJldHJpZXZlIGF1dGhvcml0eSBpZGVudGlmaWVycyBvZiB0aGUgY3VycmVudCBhbmQgbmV4dCBhdXRob3JpdHkgc2V0LhB0IFRoZSBhdXRob3JpdHkgZGlzY292ZXJ5IGFwaS4AUQEgVGhpcyBhcGkgaXMgdXNlZCBieSB0aGUgYGNsaWVudC9hdXRob3JpdHktZGlzY292ZXJ5YCBtb2R1bGUgdG8gcmV0cmlldmUgaWRlbnRpZmllcnOcIG9mIHRoZSBjdXJyZW50IGFuZCBuZXh0IGF1dGhvcml0eSBzZXQuLFNlc3Npb25LZXlzCFRnZW5lcmF0ZV9zZXNzaW9uX2tleXMEEHNlZWTdDDgcFQEgR2VuZXJhdGUgYSBzZXQgb2Ygc2Vzc2lvbiBrZXlzIHdpdGggb3B0aW9uYWxseSB1c2luZyB0aGUgZ2l2ZW4gc2VlZC4JASBUaGUga2V5cyBzaG91bGQgYmUgc3RvcmVkIHdpdGhpbiB0aGUga2V5c3RvcmUgZXhwb3NlZCB2aWEgcnVudGltZTwgZXh0ZXJuYWxpdGllcy4AsCBUaGUgc2VlZCBuZWVkcyB0byBiZSBhIHZhbGlkIGB1dGY4YCBzdHJpbmcuANAgUmV0dXJucyB0aGUgY29uY2F0ZW5hdGVkIFNDQUxFIGVuY29kZWQgcHVibGljIGtleXMuTGRlY29kZV9zZXNzaW9uX2tleXMEHGVuY29kZWQ4wQ4MmCBEZWNvZGUgdGhlIGdpdmVuIHB1YmxpYyBzZXNzaW9uIGtleXMuANwgUmV0dXJucyB0aGUgbGlzdCBvZiBwdWJsaWMgcmF3IHB1YmxpYyBrZXlzICsga2V5IHR5cGUuBGggU2Vzc2lvbiBrZXlzIHJ1bnRpbWUgYXBpLjxBY2NvdW50Tm9uY2VBcGkENGFjY291bnRfbm9uY2UEHGFjY291bnQAEATAIEdldCBjdXJyZW50IGFjY291bnQgbm9uY2Ugb2YgZ2l2ZW4gYEFjY291bnRJZGAuBIAgVGhlIEFQSSB0byBxdWVyeSBhY2NvdW50IG5vbmNlLlRUcmFuc2FjdGlvblBheW1lbnRBcGkQKHF1ZXJ5X2luZm8IDHV4dIENDGxlbhDNDgBEcXVlcnlfZmVlX2RldGFpbHMIDHV4dIENDGxlbhDRDgBMcXVlcnlfd2VpZ2h0X3RvX2ZlZQQYd2VpZ2h0KBgATHF1ZXJ5X2xlbmd0aF90b19mZWUEGGxlbmd0aBAYAABkVHJhbnNhY3Rpb25QYXltZW50Q2FsbEFwaRA8cXVlcnlfY2FsbF9pbmZvCBBjYWxsdQEMbGVuEM0OBEkBIFF1ZXJ5IGluZm9ybWF0aW9uIG9mIGEgZGlzcGF0Y2ggY2xhc3MsIHdlaWdodCwgYW5kIGZlZSBvZiBhIGdpdmVuIGVuY29kZWQgYENhbGxgLlhxdWVyeV9jYWxsX2ZlZV9kZXRhaWxzCBBjYWxsdQEMbGVuENEOBLQgUXVlcnkgZmVlIGRldGFpbHMgb2YgYSBnaXZlbiBlbmNvZGVkIGBDYWxsYC5McXVlcnlfd2VpZ2h0X3RvX2ZlZQQYd2VpZ2h0KBgEAQEgUXVlcnkgdGhlIG91dHB1dCBvZiB0aGUgY3VycmVudCBgV2VpZ2h0VG9GZWVgIGdpdmVuIHNvbWUgaW5wdXQuTHF1ZXJ5X2xlbmd0aF90b19mZWUEGGxlbmd0aBAYBAEBIFF1ZXJ5IHRoZSBvdXRwdXQgb2YgdGhlIGN1cnJlbnQgYExlbmd0aFRvRmVlYCBnaXZlbiBzb21lIGlucHV0LgA0WGNtUGF5bWVudEFwaRB8cXVlcnlfYWNjZXB0YWJsZV9wYXltZW50X2Fzc2V0cwQseGNtX3ZlcnNpb24Q3Q4UtCBSZXR1cm5zIGEgbGlzdCBvZiBhY2NlcHRhYmxlIHBheW1lbnQgYXNzZXRzLgAwICMgQXJndW1lbnRzAGggKiBgeGNtX3ZlcnNpb25gOiBWZXJzaW9uLkBxdWVyeV94Y21fd2VpZ2h0BBxtZXNzYWdliQXpDhSoIFJldHVybnMgYSB3ZWlnaHQgbmVlZGVkIHRvIGV4ZWN1dGUgYSBYQ00uADAgIyBBcmd1bWVudHMAdCAqIGBtZXNzYWdlYDogYFZlcnNpb25lZFhjbWAuZHF1ZXJ5X3dlaWdodF90b19hc3NldF9mZWUIGHdlaWdodCgUYXNzZXS9Bu0OGOggQ29udmVydHMgYSB3ZWlnaHQgaW50byBhIGZlZSBmb3IgdGhlIHNwZWNpZmllZCBgQXNzZXRJZGAuADAgIyBBcmd1bWVudHMAiCAqIGB3ZWlnaHRgOiBjb252ZXJ0aWJsZSBgV2VpZ2h0YC58ICogYGFzc2V0YDogYFZlcnNpb25lZEFzc2V0SWRgLkxxdWVyeV9kZWxpdmVyeV9mZWVzCCxkZXN0aW5hdGlvbkUBHG1lc3NhZ2WJBfEOIB0BIEdldCBkZWxpdmVyeSBmZWVzIGZvciBzZW5kaW5nIGEgc3BlY2lmaWMgYG1lc3NhZ2VgIHRvIGEgYGRlc3RpbmF0aW9uYC70IFRoZXNlIGFsd2F5cyBjb21lIGluIGEgc3BlY2lmaWMgYXNzZXQsIGRlZmluZWQgYnkgdGhlIGNoYWluLgAwICMgQXJndW1lbnRzgQEgKiBgbWVzc2FnZWA6IFRoZSBtZXNzYWdlIHRoYXQnbGwgYmUgc2VudCwgbmVjZXNzYXJ5IGJlY2F1c2UgbW9zdCBkZWxpdmVyeSBmZWVzIGFyZSBiYXNlZCBvbiB0aGVcICAgc2l6ZSBvZiB0aGUgbWVzc2FnZS5hASAqIGBkZXN0aW5hdGlvbmA6IFRoZSBkZXN0aW5hdGlvbiB0byBzZW5kIHRoZSBtZXNzYWdlIHRvLiBEaWZmZXJlbnQgZGVzdGluYXRpb25zIG1heSB1c2XAICAgZGlmZmVyZW50IHNlbmRlcnMgdGhhdCBjaGFyZ2UgZGlmZmVyZW50IGZlZXMuLHAgQSB0cmFpdCBvZiBYQ00gcGF5bWVudCBBUEkuAKggQVBJIHByb3ZpZGVzIGZ1bmN0aW9uYWxpdHkgZm9yIG9idGFpbmluZzoAxCAqIHRoZSB3ZWlnaHQgcmVxdWlyZWQgdG8gZXhlY3V0ZSBhbiBYQ00gbWVzc2FnZSwFASAqIGEgbGlzdCBvZiBhY2NlcHRhYmxlIGBBc3NldElkYHMgZm9yIG1lc3NhZ2UgZXhlY3V0aW9uIHBheW1lbnQsAQEgKiB0aGUgY29zdCBvZiB0aGUgd2VpZ2h0IGluIHRoZSBzcGVjaWZpZWQgYWNjZXB0YWJsZSBgQXNzZXRJZGAuoCAqIHRoZSBmZWVzIGZvciBhbiBYQ00gbWVzc2FnZSBkZWxpdmVyeS4A8CBUbyBkZXRlcm1pbmUgdGhlIGV4ZWN1dGlvbiB3ZWlnaHQgb2YgdGhlIGNhbGxzIHJlcXVpcmVkIGZvcnUBIFtgeGNtOjpsYXRlc3Q6Okluc3RydWN0aW9uOjpUcmFuc2FjdGBdIGluc3RydWN0aW9uLCBgVHJhbnNhY3Rpb25QYXltZW50Q2FsbEFwaWAgY2FuIGJlIHVzZWQuJERyeVJ1bkFwaQgwZHJ5X3J1bl9jYWxsCBhvcmlnaW59AhBjYWxsdQH1DgQ4IERyeSBydW4gY2FsbC4sZHJ5X3J1bl94Y20IPG9yaWdpbl9sb2NhdGlvbkUBDHhjbY0GFQ8EUCBEcnkgcnVuIFhDTSBwcm9ncmFtJLEBIEFQSSBmb3IgZHJ5LXJ1bm5pbmcgZXh0cmluc2ljcyBhbmQgWENNIHByb2dyYW1zIHRvIGdldCB0aGUgcHJvZ3JhbXMgdGhhdCBuZWVkIHRvIGJlIHBhc3NlZCB0byB0aGUgZmVlcyBBUEkuAIEBIEFsbCBjYWxscyByZXR1cm4gYSB2ZWN0b3Igb2YgdHVwbGVzIChsb2NhdGlvbiwgeGNtKSB3aGVyZSBlYWNoICJ4Y20iIGlzIGV4ZWN1dGVkIGluICJsb2NhdGlvbiIu5CBJZiB0aGVyZSdzIGxvY2FsIGV4ZWN1dGlvbiwgdGhlIGxvY2F0aW9uIHdpbGwgYmUgIkhlcmUiLh0BIFRoaXMgdmVjdG9yIGNhbiBiZSB1c2VkIHRvIGNhbGN1bGF0ZSBib3RoIGV4ZWN1dGlvbiBhbmQgZGVsaXZlcnkgZmVlcy4AmQEgQ2FsbHMgb3IgWENNcyBtaWdodCBmYWlsIHdoZW4gZXhlY3V0ZWQsIHRoaXMgZG9lc24ndCBtZWFuIHRoZSByZXN1bHQgb2YgdGhlc2UgY2FsbHMgd2lsbCBiZSBhbiBgRXJyYC5lASBJbiB0aG9zZSBjYXNlcywgdGhlcmUgbWlnaHQgc3RpbGwgYmUgYSB2YWxpZCByZXN1bHQsIHdpdGggdGhlIGV4ZWN1dGlvbiBlcnJvciBpbnNpZGUgaXQuZQEgVGhlIG9ubHkgcmVhc29ucyB3aHkgdGhlc2UgY2FsbHMgbWlnaHQgcmV0dXJuIGFuIGVycm9yIGFyZSBsaXN0ZWQgaW4gdGhlIFtgRXJyb3JgXSBlbnVtLlBMb2NhdGlvblRvQWNjb3VudEFwaQRAY29udmVydF9sb2NhdGlvbgQgbG9jYXRpb25FAR0PBJAgQ29udmVydHMgYExvY2F0aW9uYCB0byBgQWNjb3VudElkYC4EDQEgQVBJIGZvciB1c2VmdWwgY29udmVyc2lvbnMgYmV0d2VlbiBYQ00gYExvY2F0aW9uYCBhbmQgYEFjY291bnRJZGAuOEdlbmVzaXNCdWlsZGVyDCxidWlsZF9zdGF0ZQQQanNvbjglDyRlASBCdWlsZCBgUnVudGltZUdlbmVzaXNDb25maWdgIGZyb20gYSBKU09OIGJsb2Igbm90IHVzaW5nIGFueSBkZWZhdWx0cyBhbmQgc3RvcmUgaXQgaW4gdGhlJCBzdG9yYWdlLgD5ASBJbiB0aGUgY2FzZSBvZiBhIEZSQU1FLWJhc2VkIHJ1bnRpbWUsIHRoaXMgZnVuY3Rpb24gZGVzZXJpYWxpemVzIHRoZSBmdWxsIGBSdW50aW1lR2VuZXNpc0NvbmZpZ2AgZnJvbSB0aGUgZ2l2ZW4gSlNPTiBibG9iIGFuZFkBIHB1dHMgaXQgaW50byB0aGUgc3RvcmFnZS4gSWYgdGhlIHByb3ZpZGVkIEpTT04gYmxvYiBpcyBpbmNvcnJlY3Qgb3IgaW5jb21wbGV0ZSBvciB0aGW0IGRlc2VyaWFsaXphdGlvbiBmYWlscywgYW4gZXJyb3IgaXMgcmV0dXJuZWQuAF0BIFBsZWFzZSBub3RlIHRoYXQgcHJvdmlkZWQgSlNPTiBibG9iIG11c3QgY29udGFpbiBhbGwgYFJ1bnRpbWVHZW5lc2lzQ29uZmlnYCBmaWVsZHMsIG5vXCBkZWZhdWx0cyB3aWxsIGJlIHVzZWQuKGdldF9wcmVzZXQECGlkKQ/dDDhhASBSZXR1cm5zIGEgSlNPTiBibG9iIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBidWlsdC1pbiBgUnVudGltZUdlbmVzaXNDb25maWdgIGlkZW50aWZpZWQgYnkYIGBpZGAuAD0BIElmIGBpZGAgaXMgYE5vbmVgIHRoZSBmdW5jdGlvbiByZXR1cm5zIEpTT04gYmxvYiByZXByZXNlbnRhdGlvbiBvZiB0aGUgZGVmYXVsdEkBIGBSdW50aW1lR2VuZXNpc0NvbmZpZ2Agc3RydWN0IG9mIHRoZSBydW50aW1lLiBJbXBsZW1lbnRhdGlvbiBtdXN0IHByb3ZpZGUgZGVmYXVsdGAgYFJ1bnRpbWVHZW5lc2lzQ29uZmlnYC4AIQEgT3RoZXJ3aXNlIGZ1bmN0aW9uIHJldHVybnMgYSBKU09OIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBidWlsdC1pbiwgbmFtZWRRASBgUnVudGltZUdlbmVzaXNDb25maWdgIHByZXNldCBpZGVudGlmaWVkIGJ5IGBpZGAsIG9yIGBOb25lYCBpZiBzdWNoIHByZXNldCBkb2VzIG5vdGUBIGV4aXN0cy4gUmV0dXJuZWQgYFZlYzx1OD5gIGNvbnRhaW5zIGJ5dGVzIG9mIEpTT04gYmxvYiAocGF0Y2gpIHdoaWNoIGNvbXByaXNlcyBhIGxpc3Qgb2ZNASAocG90ZW50aWFsbHkgbmVzdGVkKSBrZXktdmFsdWUgcGFpcnMgdGhhdCBhcmUgaW50ZW5kZWQgZm9yIGN1c3RvbWl6aW5nIHRoZSBkZWZhdWx0ZQEgcnVudGltZSBnZW5lc2lzIGNvbmZpZy4gVGhlIHBhdGNoIHNoYWxsIGJlIG1lcmdlZCAocmZjNzM4Nikgd2l0aCB0aGUgSlNPTiByZXByZXNlbnRhdGlvbmEBIG9mIHRoZSBkZWZhdWx0IGBSdW50aW1lR2VuZXNpc0NvbmZpZ2AgdG8gY3JlYXRlIGEgY29tcHJlaGVuc2l2ZSBnZW5lc2lzIGNvbmZpZyB0aGF0IGNhboQgYmUgdXNlZCBpbiBgYnVpbGRfc3RhdGVgIG1ldGhvZC4wcHJlc2V0X25hbWVzAC0PEFEBIFJldHVybnMgYSBsaXN0IG9mIGlkZW50aWZpZXJzIGZvciBhdmFpbGFibGUgYnVpbHRpbiBgUnVudGltZUdlbmVzaXNDb25maWdgIHByZXNldHMuAGEBIFRoZSBwcmVzZXRzIGZyb20gdGhlIGxpc3QgY2FuIGJlIHF1ZXJpZWQgd2l0aCBbYEdlbmVzaXNCdWlsZGVyOjpnZXRfcHJlc2V0YF0gbWV0aG9kLiBJZgEBIG5vIG5hbWVkIHByZXNldHMgYXJlIHByb3ZpZGVkIGJ5IHRoZSBydW50aW1lIHRoZSBsaXN0IGlzIGVtcHR5LgToIEFQSSB0byBpbnRlcmFjdCB3aXRoIFJ1bnRpbWVHZW5lc2lzQ29uZmlnIGZvciB0aGUgcnVudGltZXUBVDEPAA=="; + paseo_metadata_default = binMeta3; + } +}); + +// .papi/descriptors/src/wnd_metadata.ts +var wnd_metadata_exports = {}; +__export(wnd_metadata_exports, { + default: () => wnd_metadata_default +}); +var binMeta4, wnd_metadata_default; +var init_wnd_metadata = __esm({ + ".papi/descriptors/src/wnd_metadata.ts"() { + binMeta4 = "bWV0YQ9tEQAMHHNwX2NvcmUYY3J5cHRvLEFjY291bnRJZDMyAAAEAAQBIFt1ODsgMzJdAAAEAAADIAAAAAgACAAABQMADAgwZnJhbWVfc3lzdGVtLEFjY291bnRJbmZvCBROb25jZQEQLEFjY291bnREYXRhARQAFAEUbm9uY2UQARROb25jZQABJGNvbnN1bWVycxABIFJlZkNvdW50AAEkcHJvdmlkZXJzEAEgUmVmQ291bnQAASxzdWZmaWNpZW50cxABIFJlZkNvdW50AAEQZGF0YRQBLEFjY291bnREYXRhAAAQAAAFBQAUDDxwYWxsZXRfYmFsYW5jZXMUdHlwZXMsQWNjb3VudERhdGEEHEJhbGFuY2UBGAAQARBmcmVlGAEcQmFsYW5jZQABIHJlc2VydmVkGAEcQmFsYW5jZQABGGZyb3plbhgBHEJhbGFuY2UAARRmbGFncxwBKEV4dHJhRmxhZ3MAABgAAAUHABwMPHBhbGxldF9iYWxhbmNlcxR0eXBlcyhFeHRyYUZsYWdzAAAEABgBEHUxMjgAACAAAAUAACQMNGZyYW1lX3N1cHBvcnQgZGlzcGF0Y2hAUGVyRGlzcGF0Y2hDbGFzcwQEVAEoAAwBGG5vcm1hbCgBBFQAASxvcGVyYXRpb25hbCgBBFQAASRtYW5kYXRvcnkoAQRUAAAoDChzcF93ZWlnaHRzJHdlaWdodF92MhhXZWlnaHQAAAgBIHJlZl90aW1lLAEMdTY0AAEocHJvb2Zfc2l6ZSwBDHU2NAAALAAABjAAMAAABQYANAg8cHJpbWl0aXZlX3R5cGVzEEgyNTYAAAQABAEgW3U4OyAzMl0AADgAAAIIADwQKHNwX3J1bnRpbWUcZ2VuZXJpYxhkaWdlc3QYRGlnZXN0AAAEARBsb2dzQAE8VmVjPERpZ2VzdEl0ZW0+AABAAAACRABEEChzcF9ydW50aW1lHGdlbmVyaWMYZGlnZXN0KERpZ2VzdEl0ZW0AARQoUHJlUnVudGltZQgASAFEQ29uc2Vuc3VzRW5naW5lSWQAADgBHFZlYzx1OD4ABgAkQ29uc2Vuc3VzCABIAURDb25zZW5zdXNFbmdpbmVJZAAAOAEcVmVjPHU4PgAEABBTZWFsCABIAURDb25zZW5zdXNFbmdpbmVJZAAAOAEcVmVjPHU4PgAFABRPdGhlcgQAOAEcVmVjPHU4PgAAAGRSdW50aW1lRW52aXJvbm1lbnRVcGRhdGVkAAgAAEgAAAMEAAAACABMAAACUABQCDBmcmFtZV9zeXN0ZW0sRXZlbnRSZWNvcmQIBEUBVARUATQADAEUcGhhc2U9CQEUUGhhc2UAARRldmVudFQBBEUAARh0b3BpY3O5AwEYVmVjPFQ+AABUCDx3ZXN0ZW5kX3J1bnRpbWUwUnVudGltZUV2ZW50AAG8GFN5c3RlbQQAWAFwZnJhbWVfc3lzdGVtOjpFdmVudDxSdW50aW1lPgAAABxJbmRpY2VzBACAAXhwYWxsZXRfaW5kaWNlczo6RXZlbnQ8UnVudGltZT4AAwAgQmFsYW5jZXMEAIQBfHBhbGxldF9iYWxhbmNlczo6RXZlbnQ8UnVudGltZT4ABABIVHJhbnNhY3Rpb25QYXltZW50BACMAahwYWxsZXRfdHJhbnNhY3Rpb25fcGF5bWVudDo6RXZlbnQ8UnVudGltZT4AGgAcU3Rha2luZwQAkAF4cGFsbGV0X3N0YWtpbmc6OkV2ZW50PFJ1bnRpbWU+AAYAIE9mZmVuY2VzBACsAVhwYWxsZXRfb2ZmZW5jZXM6OkV2ZW50AAcAKEhpc3RvcmljYWwEALQBiHNlc3Npb25faGlzdG9yaWNhbDo6RXZlbnQ8UnVudGltZT4AGwAoUGFyYW1ldGVycwQAuAGEcGFsbGV0X3BhcmFtZXRlcnM6OkV2ZW50PFJ1bnRpbWU+AEYAHFNlc3Npb24EAOgBeHBhbGxldF9zZXNzaW9uOjpFdmVudDxSdW50aW1lPgAIABxHcmFuZHBhBADsAVRwYWxsZXRfZ3JhbmRwYTo6RXZlbnQACgAcVXRpbGl0eQQA/AFUcGFsbGV0X3V0aWxpdHk6OkV2ZW50ABAAIElkZW50aXR5BAAJAQF8cGFsbGV0X2lkZW50aXR5OjpFdmVudDxSdW50aW1lPgARACBSZWNvdmVyeQQAEQEBfHBhbGxldF9yZWNvdmVyeTo6RXZlbnQ8UnVudGltZT4AEgAcVmVzdGluZwQAHQEBeHBhbGxldF92ZXN0aW5nOjpFdmVudDxSdW50aW1lPgATACRTY2hlZHVsZXIEACEBAYBwYWxsZXRfc2NoZWR1bGVyOjpFdmVudDxSdW50aW1lPgAUACBQcmVpbWFnZQQALQEBfHBhbGxldF9wcmVpbWFnZTo6RXZlbnQ8UnVudGltZT4AHAAQU3VkbwQAMQEBbHBhbGxldF9zdWRvOjpFdmVudDxSdW50aW1lPgAVABRQcm94eQQAOQEBcHBhbGxldF9wcm94eTo6RXZlbnQ8UnVudGltZT4AFgAgTXVsdGlzaWcEAEkBAXxwYWxsZXRfbXVsdGlzaWc6OkV2ZW50PFJ1bnRpbWU+ABcAaEVsZWN0aW9uUHJvdmlkZXJNdWx0aVBoYXNlBABRAQHQcGFsbGV0X2VsZWN0aW9uX3Byb3ZpZGVyX211bHRpX3BoYXNlOjpFdmVudDxSdW50aW1lPgAYACRWb3Rlckxpc3QEAGUBAfRwYWxsZXRfYmFnc19saXN0OjpFdmVudDxSdW50aW1lLCBwYWxsZXRfYmFnc19saXN0OjpJbnN0YW5jZTE+ABkAPE5vbWluYXRpb25Qb29scwQAaQEBnHBhbGxldF9ub21pbmF0aW9uX3Bvb2xzOjpFdmVudDxSdW50aW1lPgAdACxGYXN0VW5zdGFrZQQAjQEBjHBhbGxldF9mYXN0X3Vuc3Rha2U6OkV2ZW50PFJ1bnRpbWU+AB4AQENvbnZpY3Rpb25Wb3RpbmcEAJUBAaBwYWxsZXRfY29udmljdGlvbl92b3Rpbmc6OkV2ZW50PFJ1bnRpbWU+AB8AJFJlZmVyZW5kYQQAoQEBgHBhbGxldF9yZWZlcmVuZGE6OkV2ZW50PFJ1bnRpbWU+ACAAJFdoaXRlbGlzdAQAsQgBgHBhbGxldF93aGl0ZWxpc3Q6OkV2ZW50PFJ1bnRpbWU+ACQAIFRyZWFzdXJ5BADBCAF8cGFsbGV0X3RyZWFzdXJ5OjpFdmVudDxSdW50aW1lPgAlAEBEZWxlZ2F0ZWRTdGFraW5nBADFCAGgcGFsbGV0X2RlbGVnYXRlZF9zdGFraW5nOjpFdmVudDxSdW50aW1lPgAmADRQYXJhSW5jbHVzaW9uBADJCAGQcGFyYWNoYWluc19pbmNsdXNpb246OkV2ZW50PFJ1bnRpbWU+ACwAFFBhcmFzBADZCAGAcGFyYWNoYWluc19wYXJhczo6RXZlbnQ8UnVudGltZT4ALwAQSHJtcAQA3QgBfHBhcmFjaGFpbnNfaHJtcDo6RXZlbnQ8UnVudGltZT4AMwA0UGFyYXNEaXNwdXRlcwQA4QgBjHBhcmFjaGFpbnNfZGlzcHV0ZXM6OkV2ZW50PFJ1bnRpbWU+ADUAaE9uRGVtYW5kQXNzaWdubWVudFByb3ZpZGVyBADtCAGQcGFyYWNoYWluc19vbl9kZW1hbmQ6OkV2ZW50PFJ1bnRpbWU+ADgAJFJlZ2lzdHJhcgQA8QgBfHBhcmFzX3JlZ2lzdHJhcjo6RXZlbnQ8UnVudGltZT4APAAUU2xvdHMEAPUIAVRzbG90czo6RXZlbnQ8UnVudGltZT4APQAgQXVjdGlvbnMEAPkIAWBhdWN0aW9uczo6RXZlbnQ8UnVudGltZT4APwAkQ3Jvd2Rsb2FuBAD9CAFkY3Jvd2Rsb2FuOjpFdmVudDxSdW50aW1lPgBAADRBc3NpZ25lZFNsb3RzBAABCQF4YXNzaWduZWRfc2xvdHM6OkV2ZW50PFJ1bnRpbWU+AEEAIENvcmV0aW1lBAAFCQFgY29yZXRpbWU6OkV2ZW50PFJ1bnRpbWU+AEIAPFN0YWtpbmdBaENsaWVudAQACQkBuHBhbGxldF9zdGFraW5nX2FzeW5jX2FoX2NsaWVudDo6RXZlbnQ8UnVudGltZT4AQwBQTXVsdGlCbG9ja01pZ3JhdGlvbnMEABEJAYRwYWxsZXRfbWlncmF0aW9uczo6RXZlbnQ8UnVudGltZT4AYgAkWGNtUGFsbGV0BAAVCQFocGFsbGV0X3hjbTo6RXZlbnQ8UnVudGltZT4AYwAwTWVzc2FnZVF1ZXVlBAAlCQGQcGFsbGV0X21lc3NhZ2VfcXVldWU6OkV2ZW50PFJ1bnRpbWU+AGQAJEFzc2V0UmF0ZQQALQkBhHBhbGxldF9hc3NldF9yYXRlOjpFdmVudDxSdW50aW1lPgBlACxSb290VGVzdGluZwQAMQkBjHBhbGxldF9yb290X3Rlc3Rpbmc6OkV2ZW50PFJ1bnRpbWU+AGYAGE1ldGFUeAQANQkBeHBhbGxldF9tZXRhX3R4OjpFdmVudDxSdW50aW1lPgBnAEBJZGVudGl0eU1pZ3JhdG9yBAA5CQGEaWRlbnRpdHlfbWlncmF0b3I6OkV2ZW50PFJ1bnRpbWU+APgAAFgMMGZyYW1lX3N5c3RlbRhwYWxsZXQURXZlbnQEBFQAASBARXh0cmluc2ljU3VjY2VzcwQBNGRpc3BhdGNoX2luZm9cAUREaXNwYXRjaEV2ZW50SW5mbwAABJBBbiBleHRyaW5zaWMgY29tcGxldGVkIHN1Y2Nlc3NmdWxseS48RXh0cmluc2ljRmFpbGVkCAE4ZGlzcGF0Y2hfZXJyb3JoATREaXNwYXRjaEVycm9yAAE0ZGlzcGF0Y2hfaW5mb1wBRERpc3BhdGNoRXZlbnRJbmZvAAEEUEFuIGV4dHJpbnNpYyBmYWlsZWQuLENvZGVVcGRhdGVkAAIEUGA6Y29kZWAgd2FzIHVwZGF0ZWQuKE5ld0FjY291bnQEARxhY2NvdW50AAEwVDo6QWNjb3VudElkAAMEaEEgbmV3IGFjY291bnQgd2FzIGNyZWF0ZWQuNEtpbGxlZEFjY291bnQEARxhY2NvdW50AAEwVDo6QWNjb3VudElkAAQEWEFuIGFjY291bnQgd2FzIHJlYXBlZC4gUmVtYXJrZWQIARhzZW5kZXIAATBUOjpBY2NvdW50SWQAARBoYXNoNAEcVDo6SGFzaAAFBHBPbiBvbi1jaGFpbiByZW1hcmsgaGFwcGVuZWQuRFVwZ3JhZGVBdXRob3JpemVkCAEkY29kZV9oYXNoNAEcVDo6SGFzaAABNGNoZWNrX3ZlcnNpb24gARBib29sAAYEaEFuIHVwZ3JhZGUgd2FzIGF1dGhvcml6ZWQugFJlamVjdGVkSW52YWxpZEF1dGhvcml6ZWRVcGdyYWRlCAEkY29kZV9oYXNoNAEcVDo6SGFzaAABFGVycm9yaAE0RGlzcGF0Y2hFcnJvcgAHBBEBQW4gaW52YWxpZCBhdXRob3JpemVkIHVwZ3JhZGUgd2FzIHJlamVjdGVkIHdoaWxlIHRyeWluZyB0byBhcHBseSBpdC4EcEV2ZW50IGZvciB0aGUgU3lzdGVtIHBhbGxldC5cCDBmcmFtZV9zeXN0ZW1ERGlzcGF0Y2hFdmVudEluZm8AAAwBGHdlaWdodCgBGFdlaWdodAABFGNsYXNzYAE0RGlzcGF0Y2hDbGFzcwABIHBheXNfZmVlZAEQUGF5cwAAYAw0ZnJhbWVfc3VwcG9ydCBkaXNwYXRjaDREaXNwYXRjaENsYXNzAAEMGE5vcm1hbAAAACxPcGVyYXRpb25hbAABACRNYW5kYXRvcnkAAgAAZAw0ZnJhbWVfc3VwcG9ydCBkaXNwYXRjaBBQYXlzAAEIDFllcwAAAAhObwABAABoCChzcF9ydW50aW1lNERpc3BhdGNoRXJyb3IAATwUT3RoZXIAAAAwQ2Fubm90TG9va3VwAAEAJEJhZE9yaWdpbgACABhNb2R1bGUEAGwBLE1vZHVsZUVycm9yAAMARENvbnN1bWVyUmVtYWluaW5nAAQALE5vUHJvdmlkZXJzAAUAQFRvb01hbnlDb25zdW1lcnMABgAUVG9rZW4EAHABKFRva2VuRXJyb3IABwAoQXJpdGhtZXRpYwQAdAE8QXJpdGhtZXRpY0Vycm9yAAgANFRyYW5zYWN0aW9uYWwEAHgBSFRyYW5zYWN0aW9uYWxFcnJvcgAJACRFeGhhdXN0ZWQACgAoQ29ycnVwdGlvbgALACxVbmF2YWlsYWJsZQAMADhSb290Tm90QWxsb3dlZAANABBUcmllBAB8ASRUcmllRXJyb3IADgAAbAgoc3BfcnVudGltZSxNb2R1bGVFcnJvcgAACAEUaW5kZXgIAQh1OAABFGVycm9ySAGMW3U4OyBNQVhfTU9EVUxFX0VSUk9SX0VOQ09ERURfU0laRV0AAHAIKHNwX3J1bnRpbWUoVG9rZW5FcnJvcgABKEBGdW5kc1VuYXZhaWxhYmxlAAAAME9ubHlQcm92aWRlcgABADBCZWxvd01pbmltdW0AAgAwQ2Fubm90Q3JlYXRlAAMAMFVua25vd25Bc3NldAAEABhGcm96ZW4ABQAsVW5zdXBwb3J0ZWQABgBAQ2Fubm90Q3JlYXRlSG9sZAAHADROb3RFeHBlbmRhYmxlAAgAHEJsb2NrZWQACQAAdAg0c3BfYXJpdGhtZXRpYzxBcml0aG1ldGljRXJyb3IAAQwkVW5kZXJmbG93AAAAIE92ZXJmbG93AAEAOERpdmlzaW9uQnlaZXJvAAIAAHgIKHNwX3J1bnRpbWVIVHJhbnNhY3Rpb25hbEVycm9yAAEIMExpbWl0UmVhY2hlZAAAABxOb0xheWVyAAEAAHwMKHNwX3J1bnRpbWUwcHJvdmluZ190cmllJFRyaWVFcnJvcgABOEBJbnZhbGlkU3RhdGVSb290AAAASEluY29tcGxldGVEYXRhYmFzZQABAFBWYWx1ZUF0SW5jb21wbGV0ZUtleQACADBEZWNvZGVyRXJyb3IAAwAsSW52YWxpZEhhc2gABAAwRHVwbGljYXRlS2V5AAUAOEV4dHJhbmVvdXNOb2RlAAYAPEV4dHJhbmVvdXNWYWx1ZQAHAFxFeHRyYW5lb3VzSGFzaFJlZmVyZW5jZQAIAFRJbnZhbGlkQ2hpbGRSZWZlcmVuY2UACQA0VmFsdWVNaXNtYXRjaAAKADxJbmNvbXBsZXRlUHJvb2YACwAwUm9vdE1pc21hdGNoAAwALERlY29kZUVycm9yAA0AAIAMOHBhbGxldF9pbmRpY2VzGHBhbGxldBRFdmVudAQEVAABEDRJbmRleEFzc2lnbmVkCAEMd2hvAAEwVDo6QWNjb3VudElkAAEUaW5kZXgQATxUOjpBY2NvdW50SW5kZXgAAAR0QSBhY2NvdW50IGluZGV4IHdhcyBhc3NpZ25lZC4oSW5kZXhGcmVlZAQBFGluZGV4EAE8VDo6QWNjb3VudEluZGV4AAEEvEEgYWNjb3VudCBpbmRleCBoYXMgYmVlbiBmcmVlZCB1cCAodW5hc3NpZ25lZCkuLEluZGV4RnJvemVuCAEUaW5kZXgQATxUOjpBY2NvdW50SW5kZXgAAQx3aG8AATBUOjpBY2NvdW50SWQAAgToQSBhY2NvdW50IGluZGV4IGhhcyBiZWVuIGZyb3plbiB0byBpdHMgY3VycmVudCBhY2NvdW50IElELjBEZXBvc2l0UG9rZWQQAQx3aG8AATBUOjpBY2NvdW50SWQAARRpbmRleBABPFQ6OkFjY291bnRJbmRleAABLG9sZF9kZXBvc2l0GAEwQmFsYW5jZU9mPFQ+AAEsbmV3X2RlcG9zaXQYATBCYWxhbmNlT2Y8VD4AAwToQSBkZXBvc2l0IHRvIHJlc2VydmUgYW4gaW5kZXggaGFzIGJlZW4gcG9rZWQvcmVjb25zaWRlcmVkLgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldIQMPHBhbGxldF9iYWxhbmNlcxhwYWxsZXQURXZlbnQIBFQABEkAAVgcRW5kb3dlZAgBHGFjY291bnQAATBUOjpBY2NvdW50SWQAATBmcmVlX2JhbGFuY2UYAShUOjpCYWxhbmNlAAAEuEFuIGFjY291bnQgd2FzIGNyZWF0ZWQgd2l0aCBzb21lIGZyZWUgYmFsYW5jZS4gRHVzdExvc3QIARxhY2NvdW50AAEwVDo6QWNjb3VudElkAAEYYW1vdW50GAEoVDo6QmFsYW5jZQABCD0BQW4gYWNjb3VudCB3YXMgcmVtb3ZlZCB3aG9zZSBiYWxhbmNlIHdhcyBub24temVybyBidXQgYmVsb3cgRXhpc3RlbnRpYWxEZXBvc2l0LHhyZXN1bHRpbmcgaW4gYW4gb3V0cmlnaHQgbG9zcy4gVHJhbnNmZXIMARBmcm9tAAEwVDo6QWNjb3VudElkAAEIdG8AATBUOjpBY2NvdW50SWQAARhhbW91bnQYAShUOjpCYWxhbmNlAAIETFRyYW5zZmVyIHN1Y2NlZWRlZC4oQmFsYW5jZVNldAgBDHdobwABMFQ6OkFjY291bnRJZAABEGZyZWUYAShUOjpCYWxhbmNlAAMEaEEgYmFsYW5jZSB3YXMgc2V0IGJ5IHJvb3QuIFJlc2VydmVkCAEMd2hvAAEwVDo6QWNjb3VudElkAAEYYW1vdW50GAEoVDo6QmFsYW5jZQAEBOBTb21lIGJhbGFuY2Ugd2FzIHJlc2VydmVkIChtb3ZlZCBmcm9tIGZyZWUgdG8gcmVzZXJ2ZWQpLihVbnJlc2VydmVkCAEMd2hvAAEwVDo6QWNjb3VudElkAAEYYW1vdW50GAEoVDo6QmFsYW5jZQAFBOhTb21lIGJhbGFuY2Ugd2FzIHVucmVzZXJ2ZWQgKG1vdmVkIGZyb20gcmVzZXJ2ZWQgdG8gZnJlZSkuSFJlc2VydmVSZXBhdHJpYXRlZBABEGZyb20AATBUOjpBY2NvdW50SWQAAQh0bwABMFQ6OkFjY291bnRJZAABGGFtb3VudBgBKFQ6OkJhbGFuY2UAAUhkZXN0aW5hdGlvbl9zdGF0dXOIARhTdGF0dXMABghNAVNvbWUgYmFsYW5jZSB3YXMgbW92ZWQgZnJvbSB0aGUgcmVzZXJ2ZSBvZiB0aGUgZmlyc3QgYWNjb3VudCB0byB0aGUgc2Vjb25kIGFjY291bnQu2EZpbmFsIGFyZ3VtZW50IGluZGljYXRlcyB0aGUgZGVzdGluYXRpb24gYmFsYW5jZSB0eXBlLhxEZXBvc2l0CAEMd2hvAAEwVDo6QWNjb3VudElkAAEYYW1vdW50GAEoVDo6QmFsYW5jZQAHBNhTb21lIGFtb3VudCB3YXMgZGVwb3NpdGVkIChlLmcuIGZvciB0cmFuc2FjdGlvbiBmZWVzKS4gV2l0aGRyYXcIAQx3aG8AATBUOjpBY2NvdW50SWQAARhhbW91bnQYAShUOjpCYWxhbmNlAAgEHQFTb21lIGFtb3VudCB3YXMgd2l0aGRyYXduIGZyb20gdGhlIGFjY291bnQgKGUuZy4gZm9yIHRyYW5zYWN0aW9uIGZlZXMpLhxTbGFzaGVkCAEMd2hvAAEwVDo6QWNjb3VudElkAAEYYW1vdW50GAEoVDo6QmFsYW5jZQAJBAEBU29tZSBhbW91bnQgd2FzIHJlbW92ZWQgZnJvbSB0aGUgYWNjb3VudCAoZS5nLiBmb3IgbWlzYmVoYXZpb3IpLhhNaW50ZWQIAQx3aG8AATBUOjpBY2NvdW50SWQAARhhbW91bnQYAShUOjpCYWxhbmNlAAoEnFNvbWUgYW1vdW50IHdhcyBtaW50ZWQgaW50byBhbiBhY2NvdW50LhhCdXJuZWQIAQx3aG8AATBUOjpBY2NvdW50SWQAARhhbW91bnQYAShUOjpCYWxhbmNlAAsEnFNvbWUgYW1vdW50IHdhcyBidXJuZWQgZnJvbSBhbiBhY2NvdW50LiRTdXNwZW5kZWQIAQx3aG8AATBUOjpBY2NvdW50SWQAARhhbW91bnQYAShUOjpCYWxhbmNlAAwEFQFTb21lIGFtb3VudCB3YXMgc3VzcGVuZGVkIGZyb20gYW4gYWNjb3VudCAoaXQgY2FuIGJlIHJlc3RvcmVkIGxhdGVyKS4gUmVzdG9yZWQIAQx3aG8AATBUOjpBY2NvdW50SWQAARhhbW91bnQYAShUOjpCYWxhbmNlAA0EpFNvbWUgYW1vdW50IHdhcyByZXN0b3JlZCBpbnRvIGFuIGFjY291bnQuIFVwZ3JhZGVkBAEMd2hvAAEwVDo6QWNjb3VudElkAA4EYEFuIGFjY291bnQgd2FzIHVwZ3JhZGVkLhhJc3N1ZWQEARhhbW91bnQYAShUOjpCYWxhbmNlAA8ELQFUb3RhbCBpc3N1YW5jZSB3YXMgaW5jcmVhc2VkIGJ5IGBhbW91bnRgLCBjcmVhdGluZyBhIGNyZWRpdCB0byBiZSBiYWxhbmNlZC4kUmVzY2luZGVkBAEYYW1vdW50GAEoVDo6QmFsYW5jZQAQBCUBVG90YWwgaXNzdWFuY2Ugd2FzIGRlY3JlYXNlZCBieSBgYW1vdW50YCwgY3JlYXRpbmcgYSBkZWJ0IHRvIGJlIGJhbGFuY2VkLhhMb2NrZWQIAQx3aG8AATBUOjpBY2NvdW50SWQAARhhbW91bnQYAShUOjpCYWxhbmNlABEEYFNvbWUgYmFsYW5jZSB3YXMgbG9ja2VkLiBVbmxvY2tlZAgBDHdobwABMFQ6OkFjY291bnRJZAABGGFtb3VudBgBKFQ6OkJhbGFuY2UAEgRoU29tZSBiYWxhbmNlIHdhcyB1bmxvY2tlZC4YRnJvemVuCAEMd2hvAAEwVDo6QWNjb3VudElkAAEYYW1vdW50GAEoVDo6QmFsYW5jZQATBGBTb21lIGJhbGFuY2Ugd2FzIGZyb3plbi4YVGhhd2VkCAEMd2hvAAEwVDo6QWNjb3VudElkAAEYYW1vdW50GAEoVDo6QmFsYW5jZQAUBGBTb21lIGJhbGFuY2Ugd2FzIHRoYXdlZC5MVG90YWxJc3N1YW5jZUZvcmNlZAgBDG9sZBgBKFQ6OkJhbGFuY2UAAQxuZXcYAShUOjpCYWxhbmNlABUErFRoZSBgVG90YWxJc3N1YW5jZWAgd2FzIGZvcmNlZnVsbHkgY2hhbmdlZC4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXSIFDRmcmFtZV9zdXBwb3J0GHRyYWl0cxh0b2tlbnMQbWlzYzRCYWxhbmNlU3RhdHVzAAEIEEZyZWUAAAAgUmVzZXJ2ZWQAAQAAjAxocGFsbGV0X3RyYW5zYWN0aW9uX3BheW1lbnQYcGFsbGV0FEV2ZW50BARUAAEESFRyYW5zYWN0aW9uRmVlUGFpZAwBDHdobwABMFQ6OkFjY291bnRJZAABKGFjdHVhbF9mZWUYATBCYWxhbmNlT2Y8VD4AAQx0aXAYATBCYWxhbmNlT2Y8VD4AAAhZAUEgdHJhbnNhY3Rpb24gZmVlIGBhY3R1YWxfZmVlYCwgb2Ygd2hpY2ggYHRpcGAgd2FzIGFkZGVkIHRvIHRoZSBtaW5pbXVtIGluY2x1c2lvbiBmZWUsXGhhcyBiZWVuIHBhaWQgYnkgYHdob2AuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0kBA4cGFsbGV0X3N0YWtpbmcYcGFsbGV0GHBhbGxldBRFdmVudAQEVAABTBxFcmFQYWlkDAEkZXJhX2luZGV4EAEgRXJhSW5kZXgAAUB2YWxpZGF0b3JfcGF5b3V0GAEwQmFsYW5jZU9mPFQ+AAEkcmVtYWluZGVyGAEwQmFsYW5jZU9mPFQ+AAAIVQFUaGUgZXJhIHBheW91dCBoYXMgYmVlbiBzZXQ7IHRoZSBmaXJzdCBiYWxhbmNlIGlzIHRoZSB2YWxpZGF0b3ItcGF5b3V0OyB0aGUgc2Vjb25kIGlzwHRoZSByZW1haW5kZXIgZnJvbSB0aGUgbWF4aW11bSBhbW91bnQgb2YgcmV3YXJkLiBSZXdhcmRlZAwBFHN0YXNoAAEwVDo6QWNjb3VudElkAAEQZGVzdJQBfFJld2FyZERlc3RpbmF0aW9uPFQ6OkFjY291bnRJZD4AARhhbW91bnQYATBCYWxhbmNlT2Y8VD4AAQQNAVRoZSBub21pbmF0b3IgaGFzIGJlZW4gcmV3YXJkZWQgYnkgdGhpcyBhbW91bnQgdG8gdGhpcyBkZXN0aW5hdGlvbi4cU2xhc2hlZAgBGHN0YWtlcgABMFQ6OkFjY291bnRJZAABGGFtb3VudBgBMEJhbGFuY2VPZjxUPgACBB0BQSBzdGFrZXIgKHZhbGlkYXRvciBvciBub21pbmF0b3IpIGhhcyBiZWVuIHNsYXNoZWQgYnkgdGhlIGdpdmVuIGFtb3VudC40U2xhc2hSZXBvcnRlZAwBJHZhbGlkYXRvcgABMFQ6OkFjY291bnRJZAABIGZyYWN0aW9umAEcUGVyYmlsbAABJHNsYXNoX2VyYRABIEVyYUluZGV4AAMIWQFBIHNsYXNoIGZvciB0aGUgZ2l2ZW4gdmFsaWRhdG9yLCBmb3IgdGhlIGdpdmVuIHBlcmNlbnRhZ2Ugb2YgdGhlaXIgc3Rha2UsIGF0IHRoZSBnaXZlblRlcmEgYXMgYmVlbiByZXBvcnRlZC5oT2xkU2xhc2hpbmdSZXBvcnREaXNjYXJkZWQEATRzZXNzaW9uX2luZGV4EAEwU2Vzc2lvbkluZGV4AAQIGQFBbiBvbGQgc2xhc2hpbmcgcmVwb3J0IGZyb20gYSBwcmlvciBlcmEgd2FzIGRpc2NhcmRlZCBiZWNhdXNlIGl0IGNvdWxkRG5vdCBiZSBwcm9jZXNzZWQuOFN0YWtlcnNFbGVjdGVkAAUEhEEgbmV3IHNldCBvZiBzdGFrZXJzIHdhcyBlbGVjdGVkLhhCb25kZWQIARRzdGFzaAABMFQ6OkFjY291bnRJZAABGGFtb3VudBgBMEJhbGFuY2VPZjxUPgAGENBBbiBhY2NvdW50IGhhcyBib25kZWQgdGhpcyBhbW91bnQuIFxbc3Rhc2gsIGFtb3VudFxdAE0BTk9URTogVGhpcyBldmVudCBpcyBvbmx5IGVtaXR0ZWQgd2hlbiBmdW5kcyBhcmUgYm9uZGVkIHZpYSBhIGRpc3BhdGNoYWJsZS4gTm90YWJseSwhAWl0IHdpbGwgbm90IGJlIGVtaXR0ZWQgZm9yIHN0YWtpbmcgcmV3YXJkcyB3aGVuIHRoZXkgYXJlIGFkZGVkIHRvIHN0YWtlLiBVbmJvbmRlZAgBFHN0YXNoAAEwVDo6QWNjb3VudElkAAEYYW1vdW50GAEwQmFsYW5jZU9mPFQ+AAcEkEFuIGFjY291bnQgaGFzIHVuYm9uZGVkIHRoaXMgYW1vdW50LiRXaXRoZHJhd24IARRzdGFzaAABMFQ6OkFjY291bnRJZAABGGFtb3VudBgBMEJhbGFuY2VPZjxUPgAICFkBQW4gYWNjb3VudCBoYXMgY2FsbGVkIGB3aXRoZHJhd191bmJvbmRlZGAgYW5kIHJlbW92ZWQgdW5ib25kaW5nIGNodW5rcyB3b3J0aCBgQmFsYW5jZWBkZnJvbSB0aGUgdW5sb2NraW5nIHF1ZXVlLhhLaWNrZWQIASRub21pbmF0b3IAATBUOjpBY2NvdW50SWQAARRzdGFzaAABMFQ6OkFjY291bnRJZAAJBLRBIG5vbWluYXRvciBoYXMgYmVlbiBraWNrZWQgZnJvbSBhIHZhbGlkYXRvci5UU3Rha2luZ0VsZWN0aW9uRmFpbGVkAAoErFRoZSBlbGVjdGlvbiBmYWlsZWQuIE5vIG5ldyBlcmEgaXMgcGxhbm5lZC4cQ2hpbGxlZAQBFHN0YXNoAAEwVDo6QWNjb3VudElkAAsEIQFBbiBhY2NvdW50IGhhcyBzdG9wcGVkIHBhcnRpY2lwYXRpbmcgYXMgZWl0aGVyIGEgdmFsaWRhdG9yIG9yIG5vbWluYXRvci40UGF5b3V0U3RhcnRlZBABJGVyYV9pbmRleBABIEVyYUluZGV4AAE8dmFsaWRhdG9yX3N0YXNoAAEwVDo6QWNjb3VudElkAAEQcGFnZRABEFBhZ2UAARBuZXh0nAEwT3B0aW9uPFBhZ2U+AAwEWQFBIFBhZ2Ugb2Ygc3Rha2VycyByZXdhcmRzIGFyZSBnZXR0aW5nIHBhaWQuIGBuZXh0YCBpcyBgTm9uZWAgaWYgYWxsIHBhZ2VzIGFyZSBjbGFpbWVkLkRWYWxpZGF0b3JQcmVmc1NldAgBFHN0YXNoAAEwVDo6QWNjb3VudElkAAEUcHJlZnOgAThWYWxpZGF0b3JQcmVmcwANBJhBIHZhbGlkYXRvciBoYXMgc2V0IHRoZWlyIHByZWZlcmVuY2VzLmhTbmFwc2hvdFZvdGVyc1NpemVFeGNlZWRlZAQBEHNpemUQAQx1MzIADgRoVm90ZXJzIHNpemUgbGltaXQgcmVhY2hlZC5sU25hcHNob3RUYXJnZXRzU2l6ZUV4Y2VlZGVkBAEQc2l6ZRABDHUzMgAPBGxUYXJnZXRzIHNpemUgbGltaXQgcmVhY2hlZC4gRm9yY2VFcmEEARBtb2RlqAEcRm9yY2luZwAQBHRBIG5ldyBmb3JjZSBlcmEgbW9kZSB3YXMgc2V0LmRDb250cm9sbGVyQmF0Y2hEZXByZWNhdGVkBAEgZmFpbHVyZXMQAQx1MzIAEQSkUmVwb3J0IG9mIGEgY29udHJvbGxlciBiYXRjaCBkZXByZWNhdGlvbi5AQ3VycmVuY3lNaWdyYXRlZAgBFHN0YXNoAAEwVDo6QWNjb3VudElkAAE4Zm9yY2Vfd2l0aGRyYXcYATBCYWxhbmNlT2Y8VD4AEghVAVN0YWtpbmcgYmFsYW5jZSBtaWdyYXRlZCBmcm9tIGxvY2tzIHRvIGhvbGRzLCB3aXRoIGFueSBiYWxhbmNlIHRoYXQgY291bGQgbm90IGJlIGhlbGRMaXMgZm9yY2Ugd2l0aGRyYXduLgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldJQIOHBhbGxldF9zdGFraW5nRFJld2FyZERlc3RpbmF0aW9uBCRBY2NvdW50SWQBAAEUGFN0YWtlZAAAABRTdGFzaAABAChDb250cm9sbGVyAAIAHEFjY291bnQEAAABJEFjY291bnRJZAADABBOb25lAAQAAJgMNHNwX2FyaXRobWV0aWMocGVyX3RoaW5ncxxQZXJiaWxsAAAEABABDHUzMgAAnAQYT3B0aW9uBARUARABCBBOb25lAAAAEFNvbWUEABAAAAEAAKAIOHBhbGxldF9zdGFraW5nOFZhbGlkYXRvclByZWZzAAAIAShjb21taXNzaW9upAEcUGVyYmlsbAABHGJsb2NrZWQgARBib29sAACkAAAGmACoCDhwYWxsZXRfc3Rha2luZxxGb3JjaW5nAAEQKE5vdEZvcmNpbmcAAAAgRm9yY2VOZXcAAQAkRm9yY2VOb25lAAIALEZvcmNlQWx3YXlzAAMAAKwMPHBhbGxldF9vZmZlbmNlcxhwYWxsZXQURXZlbnQAAQQcT2ZmZW5jZQgBEGtpbmSwARBLaW5kAAEgdGltZXNsb3Q4AThPcGFxdWVUaW1lU2xvdAAADFEBVGhlcmUgaXMgYW4gb2ZmZW5jZSByZXBvcnRlZCBvZiB0aGUgZ2l2ZW4gYGtpbmRgIGhhcHBlbmVkIGF0IHRoZSBgc2Vzc2lvbl9pbmRleGAgYW5kNQEoa2luZC1zcGVjaWZpYykgdGltZSBzbG90LiBUaGlzIGV2ZW50IGlzIG5vdCBkZXBvc2l0ZWQgZm9yIGR1cGxpY2F0ZSBzbGFzaGVzLkxcW2tpbmQsIHRpbWVzbG90XF0uBDBFdmVudHMgdHlwZS6wAAADEAAAAAgAtBA4cGFsbGV0X3Nlc3Npb24oaGlzdG9yaWNhbBhwYWxsZXQURXZlbnQEBFQAAQgoUm9vdFN0b3JlZAQBFGluZGV4EAEwU2Vzc2lvbkluZGV4AAAEBQFUaGUgbWVya2xlIHJvb3Qgb2YgdGhlIHZhbGlkYXRvcnMgb2YgdGhlIHNhaWQgc2Vzc2lvbiB3ZXJlIHN0b3JlZCxSb290c1BydW5lZAQBFHVwX3RvEAEwU2Vzc2lvbkluZGV4AAEE4FRoZSBtZXJrbGUgcm9vdHMgb2YgdXAgdG8gdGhpcyBzZXNzaW9uIGluZGV4IHdlcmUgcHJ1bmVkBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0uAxEcGFsbGV0X3BhcmFtZXRlcnMYcGFsbGV0FEV2ZW50BARUAAEEHFVwZGF0ZWQMAQxrZXm8AcQ8VDo6UnVudGltZVBhcmFtZXRlcnMgYXMgQWdncmVnYXRlZEtleVZhbHVlPjo6S2V5BGRUaGUga2V5IHRoYXQgd2FzIHVwZGF0ZWQuASRvbGRfdmFsdWXYAexPcHRpb248PFQ6OlJ1bnRpbWVQYXJhbWV0ZXJzIGFzIEFnZ3JlZ2F0ZWRLZXlWYWx1ZT46OlZhbHVlPgR8VGhlIG9sZCB2YWx1ZSBiZWZvcmUgdGhpcyBjYWxsLgEkbmV3X3ZhbHVl2AHsT3B0aW9uPDxUOjpSdW50aW1lUGFyYW1ldGVycyBhcyBBZ2dyZWdhdGVkS2V5VmFsdWU+OjpWYWx1ZT4EeFRoZSBuZXcgdmFsdWUgYWZ0ZXIgdGhpcyBjYWxsLgAMUEEgUGFyYW1ldGVyIHdhcyBzZXQuALxJcyBhbHNvIGVtaXR0ZWQgd2hlbiB0aGUgdmFsdWUgd2FzIG5vdCBjaGFuZ2VkLgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldLwIPHdlc3RlbmRfcnVudGltZVBSdW50aW1lUGFyYW1ldGVyc0tleQABBCRJbmZsYXRpb24EAMABqQE8ZHluYW1pY19wYXJhbXM6OmluZmxhdGlvbjo6UGFyYW1ldGVycyBhcyBmcmFtZV9zdXBwb3J0Ojp0cmFpdHM6OgpkeW5hbWljX3BhcmFtczo6QWdncmVnYXRlZEtleVZhbHVlPjo6S2V5AAAAAMAQPHdlc3RlbmRfcnVudGltZThkeW5hbWljX3BhcmFtcyRpbmZsYXRpb240UGFyYW1ldGVyc0tleQABFDBNaW5JbmZsYXRpb24EAMQBME1pbkluZmxhdGlvbgAAADBNYXhJbmZsYXRpb24EAMgBME1heEluZmxhdGlvbgABAChJZGVhbFN0YWtlBADMAShJZGVhbFN0YWtlAAIAHEZhbGxvZmYEANABHEZhbGxvZmYAAwA8VXNlQXVjdGlvblNsb3RzBADUATxVc2VBdWN0aW9uU2xvdHMABAAAxBA8d2VzdGVuZF9ydW50aW1lOGR5bmFtaWNfcGFyYW1zJGluZmxhdGlvbjBNaW5JbmZsYXRpb24AAAAAyBA8d2VzdGVuZF9ydW50aW1lOGR5bmFtaWNfcGFyYW1zJGluZmxhdGlvbjBNYXhJbmZsYXRpb24AAAAAzBA8d2VzdGVuZF9ydW50aW1lOGR5bmFtaWNfcGFyYW1zJGluZmxhdGlvbihJZGVhbFN0YWtlAAAAANAQPHdlc3RlbmRfcnVudGltZThkeW5hbWljX3BhcmFtcyRpbmZsYXRpb24cRmFsbG9mZgAAAADUEDx3ZXN0ZW5kX3J1bnRpbWU4ZHluYW1pY19wYXJhbXMkaW5mbGF0aW9uPFVzZUF1Y3Rpb25TbG90cwAAAADYBBhPcHRpb24EBFQB3AEIEE5vbmUAAAAQU29tZQQA3AAAAQAA3Ag8d2VzdGVuZF9ydW50aW1lWFJ1bnRpbWVQYXJhbWV0ZXJzVmFsdWUAAQQkSW5mbGF0aW9uBADgAbEBPGR5bmFtaWNfcGFyYW1zOjppbmZsYXRpb246OlBhcmFtZXRlcnMgYXMgZnJhbWVfc3VwcG9ydDo6dHJhaXRzOjoKZHluYW1pY19wYXJhbXM6OkFnZ3JlZ2F0ZWRLZXlWYWx1ZT46OlZhbHVlAAAAAOAQPHdlc3RlbmRfcnVudGltZThkeW5hbWljX3BhcmFtcyRpbmZsYXRpb248UGFyYW1ldGVyc1ZhbHVlAAEUME1pbkluZmxhdGlvbgQA5AEsUGVycXVpbnRpbGwAAAAwTWF4SW5mbGF0aW9uBADkASxQZXJxdWludGlsbAABAChJZGVhbFN0YWtlBADkASxQZXJxdWludGlsbAACABxGYWxsb2ZmBADkASxQZXJxdWludGlsbAADADxVc2VBdWN0aW9uU2xvdHMEACABEGJvb2wABAAA5Aw0c3BfYXJpdGhtZXRpYyhwZXJfdGhpbmdzLFBlcnF1aW50aWxsAAAEADABDHU2NAAA6Aw4cGFsbGV0X3Nlc3Npb24YcGFsbGV0FEV2ZW50BARUAAEQKE5ld1Nlc3Npb24EATRzZXNzaW9uX2luZGV4EAEwU2Vzc2lvbkluZGV4AAAIOQFOZXcgc2Vzc2lvbiBoYXMgaGFwcGVuZWQuIE5vdGUgdGhhdCB0aGUgYXJndW1lbnQgaXMgdGhlIHNlc3Npb24gaW5kZXgsIG5vdCB0aGWcYmxvY2sgbnVtYmVyIGFzIHRoZSB0eXBlIG1pZ2h0IHN1Z2dlc3QuJE5ld1F1ZXVlZAABCEkBVGhlIGBOZXdTZXNzaW9uYCBldmVudCBpbiB0aGUgY3VycmVudCBibG9jayBhbHNvIGltcGxpZXMgYSBuZXcgdmFsaWRhdG9yIHNldCB0byBiZRxxdWV1ZWQuRFZhbGlkYXRvckRpc2FibGVkBAEkdmFsaWRhdG9yAAE4VDo6VmFsaWRhdG9ySWQAAgRwVmFsaWRhdG9yIGhhcyBiZWVuIGRpc2FibGVkLkhWYWxpZGF0b3JSZWVuYWJsZWQEASR2YWxpZGF0b3IAAThUOjpWYWxpZGF0b3JJZAADBHhWYWxpZGF0b3IgaGFzIGJlZW4gcmUtZW5hYmxlZC4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXTsDDhwYWxsZXRfZ3JhbmRwYRhwYWxsZXQURXZlbnQAAQw4TmV3QXV0aG9yaXRpZXMEATRhdXRob3JpdHlfc2V08AE0QXV0aG9yaXR5TGlzdAAABIxOZXcgYXV0aG9yaXR5IHNldCBoYXMgYmVlbiBhcHBsaWVkLhhQYXVzZWQAAQSYQ3VycmVudCBhdXRob3JpdHkgc2V0IGhhcyBiZWVuIHBhdXNlZC4cUmVzdW1lZAACBJxDdXJyZW50IGF1dGhvcml0eSBzZXQgaGFzIGJlZW4gcmVzdW1lZC4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXTwAAAC9AD0AAAECPgwAPgMUHNwX2NvbnNlbnN1c19ncmFuZHBhDGFwcBhQdWJsaWMAAAQABAE8ZWQyNTUxOTo6UHVibGljAAD8DDhwYWxsZXRfdXRpbGl0eRhwYWxsZXQURXZlbnQAASBAQmF0Y2hJbnRlcnJ1cHRlZAgBFGluZGV4EAEMdTMyAAEUZXJyb3JoATREaXNwYXRjaEVycm9yAAAIVQFCYXRjaCBvZiBkaXNwYXRjaGVzIGRpZCBub3QgY29tcGxldGUgZnVsbHkuIEluZGV4IG9mIGZpcnN0IGZhaWxpbmcgZGlzcGF0Y2ggZ2l2ZW4sIGFzSHdlbGwgYXMgdGhlIGVycm9yLjhCYXRjaENvbXBsZXRlZAABBMhCYXRjaCBvZiBkaXNwYXRjaGVzIGNvbXBsZXRlZCBmdWxseSB3aXRoIG5vIGVycm9yLmBCYXRjaENvbXBsZXRlZFdpdGhFcnJvcnMAAgS0QmF0Y2ggb2YgZGlzcGF0Y2hlcyBjb21wbGV0ZWQgYnV0IGhhcyBlcnJvcnMuNEl0ZW1Db21wbGV0ZWQAAwQdAUEgc2luZ2xlIGl0ZW0gd2l0aGluIGEgQmF0Y2ggb2YgZGlzcGF0Y2hlcyBoYXMgY29tcGxldGVkIHdpdGggbm8gZXJyb3IuKEl0ZW1GYWlsZWQEARRlcnJvcmgBNERpc3BhdGNoRXJyb3IABAQRAUEgc2luZ2xlIGl0ZW0gd2l0aGluIGEgQmF0Y2ggb2YgZGlzcGF0Y2hlcyBoYXMgY29tcGxldGVkIHdpdGggZXJyb3IuMERpc3BhdGNoZWRBcwQBGHJlc3VsdAEBAThEaXNwYXRjaFJlc3VsdAAFBFhBIGNhbGwgd2FzIGRpc3BhdGNoZWQuRElmRWxzZU1haW5TdWNjZXNzAAYEZE1haW4gY2FsbCB3YXMgZGlzcGF0Y2hlZC5QSWZFbHNlRmFsbGJhY2tDYWxsZWQEAShtYWluX2Vycm9yaAE0RGlzcGF0Y2hFcnJvcgAHBIRUaGUgZmFsbGJhY2sgY2FsbCB3YXMgZGlzcGF0Y2hlZC4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXQBAQQYUmVzdWx0CARUAQUBBEUBaAEICE9rBAAFAQAAAAAMRXJyBABoAAABAAAFAQAABAAACQEMPHBhbGxldF9pZGVudGl0eRhwYWxsZXQURXZlbnQEBFQAAVgsSWRlbnRpdHlTZXQEAQx3aG8AATBUOjpBY2NvdW50SWQAAATsQSBuYW1lIHdhcyBzZXQgb3IgcmVzZXQgKHdoaWNoIHdpbGwgcmVtb3ZlIGFsbCBqdWRnZW1lbnRzKS48SWRlbnRpdHlDbGVhcmVkCAEMd2hvAAEwVDo6QWNjb3VudElkAAEcZGVwb3NpdBgBMEJhbGFuY2VPZjxUPgABBMxBIG5hbWUgd2FzIGNsZWFyZWQsIGFuZCB0aGUgZ2l2ZW4gYmFsYW5jZSByZXR1cm5lZC44SWRlbnRpdHlLaWxsZWQIAQx3aG8AATBUOjpBY2NvdW50SWQAARxkZXBvc2l0GAEwQmFsYW5jZU9mPFQ+AAIExEEgbmFtZSB3YXMgcmVtb3ZlZCBhbmQgdGhlIGdpdmVuIGJhbGFuY2Ugc2xhc2hlZC5ISnVkZ2VtZW50UmVxdWVzdGVkCAEMd2hvAAEwVDo6QWNjb3VudElkAAE8cmVnaXN0cmFyX2luZGV4EAE4UmVnaXN0cmFySW5kZXgAAwScQSBqdWRnZW1lbnQgd2FzIGFza2VkIGZyb20gYSByZWdpc3RyYXIuUEp1ZGdlbWVudFVucmVxdWVzdGVkCAEMd2hvAAEwVDo6QWNjb3VudElkAAE8cmVnaXN0cmFyX2luZGV4EAE4UmVnaXN0cmFySW5kZXgABASIQSBqdWRnZW1lbnQgcmVxdWVzdCB3YXMgcmV0cmFjdGVkLjhKdWRnZW1lbnRHaXZlbggBGHRhcmdldAABMFQ6OkFjY291bnRJZAABPHJlZ2lzdHJhcl9pbmRleBABOFJlZ2lzdHJhckluZGV4AAUElEEganVkZ2VtZW50IHdhcyBnaXZlbiBieSBhIHJlZ2lzdHJhci44UmVnaXN0cmFyQWRkZWQEATxyZWdpc3RyYXJfaW5kZXgQAThSZWdpc3RyYXJJbmRleAAGBFhBIHJlZ2lzdHJhciB3YXMgYWRkZWQuQFN1YklkZW50aXR5QWRkZWQMAQxzdWIAATBUOjpBY2NvdW50SWQAARBtYWluAAEwVDo6QWNjb3VudElkAAEcZGVwb3NpdBgBMEJhbGFuY2VPZjxUPgAHBPRBIHN1Yi1pZGVudGl0eSB3YXMgYWRkZWQgdG8gYW4gaWRlbnRpdHkgYW5kIHRoZSBkZXBvc2l0IHBhaWQuQFN1YklkZW50aXRpZXNTZXQMARBtYWluAAEwVDo6QWNjb3VudElkAAE4bnVtYmVyX29mX3N1YnMQAQx1MzIAASxuZXdfZGVwb3NpdBgBMEJhbGFuY2VPZjxUPgAIBLxBbiBhY2NvdW50J3Mgc3ViLWlkZW50aXRpZXMgd2VyZSBzZXQgKGluIGJ1bGspLkhTdWJJZGVudGl0eVJlbmFtZWQIAQxzdWIAATBUOjpBY2NvdW50SWQAARBtYWluAAEwVDo6QWNjb3VudElkAAkEIQFBIGdpdmVuIHN1Yi1hY2NvdW50J3MgYXNzb2NpYXRlZCBuYW1lIHdhcyBjaGFuZ2VkIGJ5IGl0cyBzdXBlci1pZGVudGl0eS5IU3ViSWRlbnRpdHlSZW1vdmVkDAEMc3ViAAEwVDo6QWNjb3VudElkAAEQbWFpbgABMFQ6OkFjY291bnRJZAABHGRlcG9zaXQYATBCYWxhbmNlT2Y8VD4ACgQJAUEgc3ViLWlkZW50aXR5IHdhcyByZW1vdmVkIGZyb20gYW4gaWRlbnRpdHkgYW5kIHRoZSBkZXBvc2l0IGZyZWVkLkhTdWJJZGVudGl0eVJldm9rZWQMAQxzdWIAATBUOjpBY2NvdW50SWQAARBtYWluAAEwVDo6QWNjb3VudElkAAEcZGVwb3NpdBgBMEJhbGFuY2VPZjxUPgALCBkBQSBzdWItaWRlbnRpdHkgd2FzIGNsZWFyZWQsIGFuZCB0aGUgZ2l2ZW4gZGVwb3NpdCByZXBhdHJpYXRlZCBmcm9tIHRoZchtYWluIGlkZW50aXR5IGFjY291bnQgdG8gdGhlIHN1Yi1pZGVudGl0eSBhY2NvdW50LjhBdXRob3JpdHlBZGRlZAQBJGF1dGhvcml0eQABMFQ6OkFjY291bnRJZAAMBHxBIHVzZXJuYW1lIGF1dGhvcml0eSB3YXMgYWRkZWQuQEF1dGhvcml0eVJlbW92ZWQEASRhdXRob3JpdHkAATBUOjpBY2NvdW50SWQADQSEQSB1c2VybmFtZSBhdXRob3JpdHkgd2FzIHJlbW92ZWQuLFVzZXJuYW1lU2V0CAEMd2hvAAEwVDo6QWNjb3VudElkAAEgdXNlcm5hbWUNAQEsVXNlcm5hbWU8VD4ADgR0QSB1c2VybmFtZSB3YXMgc2V0IGZvciBgd2hvYC44VXNlcm5hbWVRdWV1ZWQMAQx3aG8AATBUOjpBY2NvdW50SWQAASB1c2VybmFtZQ0BASxVc2VybmFtZTxUPgABKGV4cGlyYXRpb24QAURCbG9ja051bWJlckZvcjxUPgAPBBkBQSB1c2VybmFtZSB3YXMgcXVldWVkLCBidXQgYHdob2AgbXVzdCBhY2NlcHQgaXQgcHJpb3IgdG8gYGV4cGlyYXRpb25gLkhQcmVhcHByb3ZhbEV4cGlyZWQEARR3aG9zZQABMFQ6OkFjY291bnRJZAAQBDkBQSBxdWV1ZWQgdXNlcm5hbWUgcGFzc2VkIGl0cyBleHBpcmF0aW9uIHdpdGhvdXQgYmVpbmcgY2xhaW1lZCBhbmQgd2FzIHJlbW92ZWQuSFByaW1hcnlVc2VybmFtZVNldAgBDHdobwABMFQ6OkFjY291bnRJZAABIHVzZXJuYW1lDQEBLFVzZXJuYW1lPFQ+ABEEAQFBIHVzZXJuYW1lIHdhcyBzZXQgYXMgYSBwcmltYXJ5IGFuZCBjYW4gYmUgbG9va2VkIHVwIGZyb20gYHdob2AuXERhbmdsaW5nVXNlcm5hbWVSZW1vdmVkCAEMd2hvAAEwVDo6QWNjb3VudElkAAEgdXNlcm5hbWUNAQEsVXNlcm5hbWU8VD4AEghdAUEgZGFuZ2xpbmcgdXNlcm5hbWUgKGFzIGluLCBhIHVzZXJuYW1lIGNvcnJlc3BvbmRpbmcgdG8gYW4gYWNjb3VudCB0aGF0IGhhcyByZW1vdmVkIGl0c2xpZGVudGl0eSkgaGFzIGJlZW4gcmVtb3ZlZC48VXNlcm5hbWVVbmJvdW5kBAEgdXNlcm5hbWUNAQEsVXNlcm5hbWU8VD4AEwRwQSB1c2VybmFtZSBoYXMgYmVlbiB1bmJvdW5kLjxVc2VybmFtZVJlbW92ZWQEASB1c2VybmFtZQ0BASxVc2VybmFtZTxUPgAUBHBBIHVzZXJuYW1lIGhhcyBiZWVuIHJlbW92ZWQuOFVzZXJuYW1lS2lsbGVkBAEgdXNlcm5hbWUNAQEsVXNlcm5hbWU8VD4AFQRsQSB1c2VybmFtZSBoYXMgYmVlbiBraWxsZWQuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0DQEMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAEIBFMAAAQAOAEYVmVjPFQ+AAARAQw8cGFsbGV0X3JlY292ZXJ5GHBhbGxldBRFdmVudAQEVAABHDxSZWNvdmVyeUNyZWF0ZWQEARxhY2NvdW50AAEwVDo6QWNjb3VudElkAAAEyEEgcmVjb3ZlcnkgcHJvY2VzcyBoYXMgYmVlbiBzZXQgdXAgZm9yIGFuIGFjY291bnQuRFJlY292ZXJ5SW5pdGlhdGVkCAEwbG9zdF9hY2NvdW50AAEwVDo6QWNjb3VudElkAAE8cmVzY3Vlcl9hY2NvdW50AAEwVDo6QWNjb3VudElkAAEEKQFBIHJlY292ZXJ5IHByb2Nlc3MgaGFzIGJlZW4gaW5pdGlhdGVkIGZvciBsb3N0IGFjY291bnQgYnkgcmVzY3VlciBhY2NvdW50LjxSZWNvdmVyeVZvdWNoZWQMATBsb3N0X2FjY291bnQAATBUOjpBY2NvdW50SWQAATxyZXNjdWVyX2FjY291bnQAATBUOjpBY2NvdW50SWQAARhzZW5kZXIAATBUOjpBY2NvdW50SWQAAgRZAUEgcmVjb3ZlcnkgcHJvY2VzcyBmb3IgbG9zdCBhY2NvdW50IGJ5IHJlc2N1ZXIgYWNjb3VudCBoYXMgYmVlbiB2b3VjaGVkIGZvciBieSBzZW5kZXIuOFJlY292ZXJ5Q2xvc2VkCAEwbG9zdF9hY2NvdW50AAEwVDo6QWNjb3VudElkAAE8cmVzY3Vlcl9hY2NvdW50AAEwVDo6QWNjb3VudElkAAMEHQFBIHJlY292ZXJ5IHByb2Nlc3MgZm9yIGxvc3QgYWNjb3VudCBieSByZXNjdWVyIGFjY291bnQgaGFzIGJlZW4gY2xvc2VkLkBBY2NvdW50UmVjb3ZlcmVkCAEwbG9zdF9hY2NvdW50AAEwVDo6QWNjb3VudElkAAE8cmVzY3Vlcl9hY2NvdW50AAEwVDo6QWNjb3VudElkAAQEAQFMb3N0IGFjY291bnQgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHJlY292ZXJlZCBieSByZXNjdWVyIGFjY291bnQuPFJlY292ZXJ5UmVtb3ZlZAQBMGxvc3RfYWNjb3VudAABMFQ6OkFjY291bnRJZAAFBMxBIHJlY292ZXJ5IHByb2Nlc3MgaGFzIGJlZW4gcmVtb3ZlZCBmb3IgYW4gYWNjb3VudC4wRGVwb3NpdFBva2VkEAEMd2hvAAEwVDo6QWNjb3VudElkAAEQa2luZBUBAThEZXBvc2l0S2luZDxUPgABLG9sZF9kZXBvc2l0GAEwQmFsYW5jZU9mPFQ+AAEsbmV3X2RlcG9zaXQYATBCYWxhbmNlT2Y8VD4ABgRsQSBkZXBvc2l0IGhhcyBiZWVuIHVwZGF0ZWQuBDBFdmVudHMgdHlwZS4VAQg8cGFsbGV0X3JlY292ZXJ5LERlcG9zaXRLaW5kBARUARkBAQg4UmVjb3ZlcnlDb25maWcAAABEQWN0aXZlUmVjb3ZlcnlGb3IEAAABmDxUIGFzIGZyYW1lX3N5c3RlbTo6Q29uZmlnPjo6QWNjb3VudElkAAEAABkBCDx3ZXN0ZW5kX3J1bnRpbWUcUnVudGltZQAAAAAdAQw4cGFsbGV0X3Zlc3RpbmcYcGFsbGV0FEV2ZW50BARUAAEMOFZlc3RpbmdDcmVhdGVkCAEcYWNjb3VudAABMFQ6OkFjY291bnRJZAABOHNjaGVkdWxlX2luZGV4EAEMdTMyAAAEkEEgdmVzdGluZyBzY2hlZHVsZSBoYXMgYmVlbiBjcmVhdGVkLjhWZXN0aW5nVXBkYXRlZAgBHGFjY291bnQAATBUOjpBY2NvdW50SWQAASB1bnZlc3RlZBgBMEJhbGFuY2VPZjxUPgABCFEBVGhlIGFtb3VudCB2ZXN0ZWQgaGFzIGJlZW4gdXBkYXRlZC4gVGhpcyBjb3VsZCBpbmRpY2F0ZSBhIGNoYW5nZSBpbiBmdW5kcyBhdmFpbGFibGUuJQFUaGUgYmFsYW5jZSBnaXZlbiBpcyB0aGUgYW1vdW50IHdoaWNoIGlzIGxlZnQgdW52ZXN0ZWQgKGFuZCB0aHVzIGxvY2tlZCkuQFZlc3RpbmdDb21wbGV0ZWQEARxhY2NvdW50AAEwVDo6QWNjb3VudElkAAIEnEFuIFxbYWNjb3VudFxdIGhhcyBiZWNvbWUgZnVsbHkgdmVzdGVkLgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldCEBDEBwYWxsZXRfc2NoZWR1bGVyGHBhbGxldBRFdmVudAQEVAABKCRTY2hlZHVsZWQIARB3aGVuEAFEQmxvY2tOdW1iZXJGb3I8VD4AARRpbmRleBABDHUzMgAABFBTY2hlZHVsZWQgc29tZSB0YXNrLiBDYW5jZWxlZAgBEHdoZW4QAURCbG9ja051bWJlckZvcjxUPgABFGluZGV4EAEMdTMyAAEETENhbmNlbGVkIHNvbWUgdGFzay4oRGlzcGF0Y2hlZAwBEHRhc2slAQF4VGFza0FkZHJlc3M8QmxvY2tOdW1iZXJGb3I8VD4+AAEIaWQpAQFAT3B0aW9uPFRhc2tOYW1lPgABGHJlc3VsdAEBAThEaXNwYXRjaFJlc3VsdAACBFREaXNwYXRjaGVkIHNvbWUgdGFzay4gUmV0cnlTZXQQARB0YXNrJQEBeFRhc2tBZGRyZXNzPEJsb2NrTnVtYmVyRm9yPFQ+PgABCGlkKQEBQE9wdGlvbjxUYXNrTmFtZT4AARhwZXJpb2QQAURCbG9ja051bWJlckZvcjxUPgABHHJldHJpZXMIAQh1OAADBKBTZXQgYSByZXRyeSBjb25maWd1cmF0aW9uIGZvciBzb21lIHRhc2suOFJldHJ5Q2FuY2VsbGVkCAEQdGFzayUBAXhUYXNrQWRkcmVzczxCbG9ja051bWJlckZvcjxUPj4AAQhpZCkBAUBPcHRpb248VGFza05hbWU+AAQErENhbmNlbCBhIHJldHJ5IGNvbmZpZ3VyYXRpb24gZm9yIHNvbWUgdGFzay48Q2FsbFVuYXZhaWxhYmxlCAEQdGFzayUBAXhUYXNrQWRkcmVzczxCbG9ja051bWJlckZvcjxUPj4AAQhpZCkBAUBPcHRpb248VGFza05hbWU+AAUEKQFUaGUgY2FsbCBmb3IgdGhlIHByb3ZpZGVkIGhhc2ggd2FzIG5vdCBmb3VuZCBzbyB0aGUgdGFzayBoYXMgYmVlbiBhYm9ydGVkLjhQZXJpb2RpY0ZhaWxlZAgBEHRhc2slAQF4VGFza0FkZHJlc3M8QmxvY2tOdW1iZXJGb3I8VD4+AAEIaWQpAQFAT3B0aW9uPFRhc2tOYW1lPgAGBD0BVGhlIGdpdmVuIHRhc2sgd2FzIHVuYWJsZSB0byBiZSByZW5ld2VkIHNpbmNlIHRoZSBhZ2VuZGEgaXMgZnVsbCBhdCB0aGF0IGJsb2NrLixSZXRyeUZhaWxlZAgBEHRhc2slAQF4VGFza0FkZHJlc3M8QmxvY2tOdW1iZXJGb3I8VD4+AAEIaWQpAQFAT3B0aW9uPFRhc2tOYW1lPgAHCF0BVGhlIGdpdmVuIHRhc2sgd2FzIHVuYWJsZSB0byBiZSByZXRyaWVkIHNpbmNlIHRoZSBhZ2VuZGEgaXMgZnVsbCBhdCB0aGF0IGJsb2NrIG9yIHRoZXJlnHdhcyBub3QgZW5vdWdoIHdlaWdodCB0byByZXNjaGVkdWxlIGl0LlRQZXJtYW5lbnRseU92ZXJ3ZWlnaHQIARB0YXNrJQEBeFRhc2tBZGRyZXNzPEJsb2NrTnVtYmVyRm9yPFQ+PgABCGlkKQEBQE9wdGlvbjxUYXNrTmFtZT4ACATwVGhlIGdpdmVuIHRhc2sgY2FuIG5ldmVyIGJlIGV4ZWN1dGVkIHNpbmNlIGl0IGlzIG92ZXJ3ZWlnaHQuQEFnZW5kYUluY29tcGxldGUEARB3aGVuEAFEQmxvY2tOdW1iZXJGb3I8VD4ACQSEQWdlbmRhIGlzIGluY29tcGxldGUgZnJvbSBgd2hlbmAuBDBFdmVudHMgdHlwZS4lAQAABAgQEAApAQQYT3B0aW9uBARUAQQBCBBOb25lAAAAEFNvbWUEAAQAAAEAAC0BDDxwYWxsZXRfcHJlaW1hZ2UYcGFsbGV0FEV2ZW50BARUAAEMFE5vdGVkBAEQaGFzaDQBHFQ6Okhhc2gAAARoQSBwcmVpbWFnZSBoYXMgYmVlbiBub3RlZC4kUmVxdWVzdGVkBAEQaGFzaDQBHFQ6Okhhc2gAAQR4QSBwcmVpbWFnZSBoYXMgYmVlbiByZXF1ZXN0ZWQuHENsZWFyZWQEARBoYXNoNAEcVDo6SGFzaAACBGxBIHByZWltYWdlIGhhcyBiZW4gY2xlYXJlZC4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXQxAQwscGFsbGV0X3N1ZG8YcGFsbGV0FEV2ZW50BARUAAEQFFN1ZGlkBAEsc3Vkb19yZXN1bHQBAQE4RGlzcGF0Y2hSZXN1bHQEtFRoZSByZXN1bHQgb2YgdGhlIGNhbGwgbWFkZSBieSB0aGUgc3VkbyB1c2VyLgAEcEEgc3VkbyBjYWxsIGp1c3QgdG9vayBwbGFjZS4oS2V5Q2hhbmdlZAgBDG9sZDUBAVBPcHRpb248VDo6QWNjb3VudElkPgS0VGhlIG9sZCBzdWRvIGtleSAoaWYgb25lIHdhcyBwcmV2aW91c2x5IHNldCkuAQxuZXcAATBUOjpBY2NvdW50SWQEiFRoZSBuZXcgc3VkbyBrZXkgKGlmIG9uZSB3YXMgc2V0KS4BBHhUaGUgc3VkbyBrZXkgaGFzIGJlZW4gdXBkYXRlZC4oS2V5UmVtb3ZlZAACBIBUaGUga2V5IHdhcyBwZXJtYW5lbnRseSByZW1vdmVkLihTdWRvQXNEb25lBAEsc3Vkb19yZXN1bHQBAQE4RGlzcGF0Y2hSZXN1bHQEtFRoZSByZXN1bHQgb2YgdGhlIGNhbGwgbWFkZSBieSB0aGUgc3VkbyB1c2VyLgMEyEEgW3N1ZG9fYXNdKFBhbGxldDo6c3Vkb19hcykgY2FsbCBqdXN0IHRvb2sgcGxhY2UuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0NQEEGE9wdGlvbgQEVAEAAQgQTm9uZQAAABBTb21lBAAAAAABAAA5AQwwcGFsbGV0X3Byb3h5GHBhbGxldBRFdmVudAQEVAABHDRQcm94eUV4ZWN1dGVkBAEYcmVzdWx0AQEBOERpc3BhdGNoUmVzdWx0AAAEvEEgcHJveHkgd2FzIGV4ZWN1dGVkIGNvcnJlY3RseSwgd2l0aCB0aGUgZ2l2ZW4uLFB1cmVDcmVhdGVkEAEQcHVyZQABMFQ6OkFjY291bnRJZAABDHdobwABMFQ6OkFjY291bnRJZAABKHByb3h5X3R5cGU9AQEwVDo6UHJveHlUeXBlAAFQZGlzYW1iaWd1YXRpb25faW5kZXhBAQEMdTE2AAEI3EEgcHVyZSBhY2NvdW50IGhhcyBiZWVuIGNyZWF0ZWQgYnkgbmV3IHByb3h5IHdpdGggZ2l2ZW6QZGlzYW1iaWd1YXRpb24gaW5kZXggYW5kIHByb3h5IHR5cGUuKFB1cmVLaWxsZWQQARBwdXJlAAEwVDo6QWNjb3VudElkAAEcc3Bhd25lcgABMFQ6OkFjY291bnRJZAABKHByb3h5X3R5cGU9AQEwVDo6UHJveHlUeXBlAAFQZGlzYW1iaWd1YXRpb25faW5kZXhBAQEMdTE2AAIEnEEgcHVyZSBwcm94eSB3YXMga2lsbGVkIGJ5IGl0cyBzcGF3bmVyLiRBbm5vdW5jZWQMARByZWFsAAEwVDo6QWNjb3VudElkAAEUcHJveHkAATBUOjpBY2NvdW50SWQAASRjYWxsX2hhc2g0ATRDYWxsSGFzaE9mPFQ+AAME4EFuIGFubm91bmNlbWVudCB3YXMgcGxhY2VkIHRvIG1ha2UgYSBjYWxsIGluIHRoZSBmdXR1cmUuKFByb3h5QWRkZWQQASRkZWxlZ2F0b3IAATBUOjpBY2NvdW50SWQAASRkZWxlZ2F0ZWUAATBUOjpBY2NvdW50SWQAAShwcm94eV90eXBlPQEBMFQ6OlByb3h5VHlwZQABFGRlbGF5EAFEQmxvY2tOdW1iZXJGb3I8VD4ABARIQSBwcm94eSB3YXMgYWRkZWQuMFByb3h5UmVtb3ZlZBABJGRlbGVnYXRvcgABMFQ6OkFjY291bnRJZAABJGRlbGVnYXRlZQABMFQ6OkFjY291bnRJZAABKHByb3h5X3R5cGU9AQEwVDo6UHJveHlUeXBlAAEUZGVsYXkQAURCbG9ja051bWJlckZvcjxUPgAFBFBBIHByb3h5IHdhcyByZW1vdmVkLjBEZXBvc2l0UG9rZWQQAQx3aG8AATBUOjpBY2NvdW50SWQAARBraW5kRQEBLERlcG9zaXRLaW5kAAEsb2xkX2RlcG9zaXQYATBCYWxhbmNlT2Y8VD4AASxuZXdfZGVwb3NpdBgBMEJhbGFuY2VPZjxUPgAGBAkBQSBkZXBvc2l0IHN0b3JlZCBmb3IgcHJveGllcyBvciBhbm5vdW5jZW1lbnRzIHdhcyBwb2tlZCAvIHVwZGF0ZWQuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0PQEIPHdlc3RlbmRfcnVudGltZSRQcm94eVR5cGUAASgMQW55AAAALE5vblRyYW5zZmVyAAEAKEdvdmVybmFuY2UAAgAcU3Rha2luZwADADBTdWRvQmFsYW5jZXMABABESWRlbnRpdHlKdWRnZW1lbnQABQAsQ2FuY2VsUHJveHkABgAcQXVjdGlvbgAHADxOb21pbmF0aW9uUG9vbHMACABAUGFyYVJlZ2lzdHJhdGlvbgAJAABBAQAABQQARQEIMHBhbGxldF9wcm94eSxEZXBvc2l0S2luZAABCBxQcm94aWVzAAAANEFubm91bmNlbWVudHMAAQAASQEMPHBhbGxldF9tdWx0aXNpZxhwYWxsZXQURXZlbnQEBFQAARQsTmV3TXVsdGlzaWcMASRhcHByb3ZpbmcAATBUOjpBY2NvdW50SWQAASBtdWx0aXNpZwABMFQ6OkFjY291bnRJZAABJGNhbGxfaGFzaAQBIENhbGxIYXNoAAAEjEEgbmV3IG11bHRpc2lnIG9wZXJhdGlvbiBoYXMgYmVndW4uQE11bHRpc2lnQXBwcm92YWwQASRhcHByb3ZpbmcAATBUOjpBY2NvdW50SWQAASR0aW1lcG9pbnRNAQFwVGltZXBvaW50PEJsb2NrTnVtYmVyRm9yPFQ+PgABIG11bHRpc2lnAAEwVDo6QWNjb3VudElkAAEkY2FsbF9oYXNoBAEgQ2FsbEhhc2gAAQTIQSBtdWx0aXNpZyBvcGVyYXRpb24gaGFzIGJlZW4gYXBwcm92ZWQgYnkgc29tZW9uZS5ATXVsdGlzaWdFeGVjdXRlZBQBJGFwcHJvdmluZwABMFQ6OkFjY291bnRJZAABJHRpbWVwb2ludE0BAXBUaW1lcG9pbnQ8QmxvY2tOdW1iZXJGb3I8VD4+AAEgbXVsdGlzaWcAATBUOjpBY2NvdW50SWQAASRjYWxsX2hhc2gEASBDYWxsSGFzaAABGHJlc3VsdAEBAThEaXNwYXRjaFJlc3VsdAACBJxBIG11bHRpc2lnIG9wZXJhdGlvbiBoYXMgYmVlbiBleGVjdXRlZC5ETXVsdGlzaWdDYW5jZWxsZWQQAShjYW5jZWxsaW5nAAEwVDo6QWNjb3VudElkAAEkdGltZXBvaW50TQEBcFRpbWVwb2ludDxCbG9ja051bWJlckZvcjxUPj4AASBtdWx0aXNpZwABMFQ6OkFjY291bnRJZAABJGNhbGxfaGFzaAQBIENhbGxIYXNoAAMEoEEgbXVsdGlzaWcgb3BlcmF0aW9uIGhhcyBiZWVuIGNhbmNlbGxlZC4wRGVwb3NpdFBva2VkEAEMd2hvAAEwVDo6QWNjb3VudElkAAEkY2FsbF9oYXNoBAEgQ2FsbEhhc2gAASxvbGRfZGVwb3NpdBgBMEJhbGFuY2VPZjxUPgABLG5ld19kZXBvc2l0GAEwQmFsYW5jZU9mPFQ+AAQE8FRoZSBkZXBvc2l0IGZvciBhIG11bHRpc2lnIG9wZXJhdGlvbiBoYXMgYmVlbiB1cGRhdGVkL3Bva2VkLgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldE0BCDxwYWxsZXRfbXVsdGlzaWckVGltZXBvaW50BCxCbG9ja051bWJlcgEQAAgBGGhlaWdodBABLEJsb2NrTnVtYmVyAAEUaW5kZXgQAQx1MzIAAFEBDJBwYWxsZXRfZWxlY3Rpb25fcHJvdmlkZXJfbXVsdGlfcGhhc2UYcGFsbGV0FEV2ZW50BARUAAEYOFNvbHV0aW9uU3RvcmVkDAEcY29tcHV0ZVUBATxFbGVjdGlvbkNvbXB1dGUAARhvcmlnaW41AQFQT3B0aW9uPFQ6OkFjY291bnRJZD4AATBwcmV2X2VqZWN0ZWQgARBib29sAAActEEgc29sdXRpb24gd2FzIHN0b3JlZCB3aXRoIHRoZSBnaXZlbiBjb21wdXRlLgBRAVRoZSBgb3JpZ2luYCBpbmRpY2F0ZXMgdGhlIG9yaWdpbiBvZiB0aGUgc29sdXRpb24uIElmIGBvcmlnaW5gIGlzIGBTb21lKEFjY291bnRJZClgLFkBdGhlIHN0b3JlZCBzb2x1dGlvbiB3YXMgc3VibWl0dGVkIGluIHRoZSBzaWduZWQgcGhhc2UgYnkgYSBtaW5lciB3aXRoIHRoZSBgQWNjb3VudElkYC4lAU90aGVyd2lzZSwgdGhlIHNvbHV0aW9uIHdhcyBzdG9yZWQgZWl0aGVyIGR1cmluZyB0aGUgdW5zaWduZWQgcGhhc2Ugb3IgYnlNAWBUOjpGb3JjZU9yaWdpbmAuIFRoZSBgYm9vbGAgaXMgYHRydWVgIHdoZW4gYSBwcmV2aW91cyBzb2x1dGlvbiB3YXMgZWplY3RlZCB0byBtYWtlSHJvb20gZm9yIHRoaXMgb25lLkRFbGVjdGlvbkZpbmFsaXplZAgBHGNvbXB1dGVVAQE8RWxlY3Rpb25Db21wdXRlAAEUc2NvcmVZAQE0RWxlY3Rpb25TY29yZQABBBkBVGhlIGVsZWN0aW9uIGhhcyBiZWVuIGZpbmFsaXplZCwgd2l0aCB0aGUgZ2l2ZW4gY29tcHV0YXRpb24gYW5kIHNjb3JlLjhFbGVjdGlvbkZhaWxlZAACDExBbiBlbGVjdGlvbiBmYWlsZWQuAAEBTm90IG11Y2ggY2FuIGJlIHNhaWQgYWJvdXQgd2hpY2ggY29tcHV0ZXMgZmFpbGVkIGluIHRoZSBwcm9jZXNzLiBSZXdhcmRlZAgBHGFjY291bnQAAZg8VCBhcyBmcmFtZV9zeXN0ZW06OkNvbmZpZz46OkFjY291bnRJZAABFHZhbHVlGAEwQmFsYW5jZU9mPFQ+AAMEJQFBbiBhY2NvdW50IGhhcyBiZWVuIHJld2FyZGVkIGZvciB0aGVpciBzaWduZWQgc3VibWlzc2lvbiBiZWluZyBmaW5hbGl6ZWQuHFNsYXNoZWQIARxhY2NvdW50AAGYPFQgYXMgZnJhbWVfc3lzdGVtOjpDb25maWc+OjpBY2NvdW50SWQAARR2YWx1ZRgBMEJhbGFuY2VPZjxUPgAEBCEBQW4gYWNjb3VudCBoYXMgYmVlbiBzbGFzaGVkIGZvciBzdWJtaXR0aW5nIGFuIGludmFsaWQgc2lnbmVkIHN1Ym1pc3Npb24uRFBoYXNlVHJhbnNpdGlvbmVkDAEQZnJvbV0BAWBQaGFzZTxCbG9ja051bWJlckZvcjxUPj4AAQh0b10BAWBQaGFzZTxCbG9ja051bWJlckZvcjxUPj4AARRyb3VuZBABDHUzMgAFBLhUaGVyZSB3YXMgYSBwaGFzZSB0cmFuc2l0aW9uIGluIGEgZ2l2ZW4gcm91bmQuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0VQEIkHBhbGxldF9lbGVjdGlvbl9wcm92aWRlcl9tdWx0aV9waGFzZTxFbGVjdGlvbkNvbXB1dGUAARQcT25DaGFpbgAAABhTaWduZWQAAQAgVW5zaWduZWQAAgAgRmFsbGJhY2sAAwAkRW1lcmdlbmN5AAQAAFkBCERzcF9ucG9zX2VsZWN0aW9uczRFbGVjdGlvblNjb3JlAAAMATRtaW5pbWFsX3N0YWtlGAE8RXh0ZW5kZWRCYWxhbmNlAAEkc3VtX3N0YWtlGAE8RXh0ZW5kZWRCYWxhbmNlAAFEc3VtX3N0YWtlX3NxdWFyZWQYATxFeHRlbmRlZEJhbGFuY2UAAF0BCJBwYWxsZXRfZWxlY3Rpb25fcHJvdmlkZXJfbXVsdGlfcGhhc2UUUGhhc2UECEJuARABEAxPZmYAAAAYU2lnbmVkAAEAIFVuc2lnbmVkBABhAQEoKGJvb2wsIEJuKQACACRFbWVyZ2VuY3kAAwAAYQEAAAQIIBAAZQEMQHBhbGxldF9iYWdzX2xpc3QYcGFsbGV0FEV2ZW50CARUAARJAAEIIFJlYmFnZ2VkDAEMd2hvAAEwVDo6QWNjb3VudElkAAEQZnJvbTABIFQ6OlNjb3JlAAEIdG8wASBUOjpTY29yZQAABKRNb3ZlZCBhbiBhY2NvdW50IGZyb20gb25lIGJhZyB0byBhbm90aGVyLjBTY29yZVVwZGF0ZWQIAQx3aG8AATBUOjpBY2NvdW50SWQAASRuZXdfc2NvcmUwASBUOjpTY29yZQABBNhVcGRhdGVkIHRoZSBzY29yZSBvZiBzb21lIGFjY291bnQgdG8gdGhlIGdpdmVuIGFtb3VudC4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXRpAQxccGFsbGV0X25vbWluYXRpb25fcG9vbHMYcGFsbGV0FEV2ZW50BARUAAFcHENyZWF0ZWQIASRkZXBvc2l0b3IAATBUOjpBY2NvdW50SWQAARxwb29sX2lkEAEYUG9vbElkAAAEYEEgcG9vbCBoYXMgYmVlbiBjcmVhdGVkLhhCb25kZWQQARhtZW1iZXIAATBUOjpBY2NvdW50SWQAARxwb29sX2lkEAEYUG9vbElkAAEYYm9uZGVkGAEwQmFsYW5jZU9mPFQ+AAEYam9pbmVkIAEQYm9vbAABBJRBIG1lbWJlciBoYXMgYmVjYW1lIGJvbmRlZCBpbiBhIHBvb2wuHFBhaWRPdXQMARhtZW1iZXIAATBUOjpBY2NvdW50SWQAARxwb29sX2lkEAEYUG9vbElkAAEYcGF5b3V0GAEwQmFsYW5jZU9mPFQ+AAIEjEEgcGF5b3V0IGhhcyBiZWVuIG1hZGUgdG8gYSBtZW1iZXIuIFVuYm9uZGVkFAEYbWVtYmVyAAEwVDo6QWNjb3VudElkAAEccG9vbF9pZBABGFBvb2xJZAABHGJhbGFuY2UYATBCYWxhbmNlT2Y8VD4AARhwb2ludHMYATBCYWxhbmNlT2Y8VD4AAQxlcmEQASBFcmFJbmRleAADLJhBIG1lbWJlciBoYXMgdW5ib25kZWQgZnJvbSB0aGVpciBwb29sLgA5AS0gYGJhbGFuY2VgIGlzIHRoZSBjb3JyZXNwb25kaW5nIGJhbGFuY2Ugb2YgdGhlIG51bWJlciBvZiBwb2ludHMgdGhhdCBoYXMgYmVlblUBICByZXF1ZXN0ZWQgdG8gYmUgdW5ib25kZWQgKHRoZSBhcmd1bWVudCBvZiB0aGUgYHVuYm9uZGAgdHJhbnNhY3Rpb24pIGZyb20gdGhlIGJvbmRlZBwgIHBvb2wuRQEtIGBwb2ludHNgIGlzIHRoZSBudW1iZXIgb2YgcG9pbnRzIHRoYXQgYXJlIGlzc3VlZCBhcyBhIHJlc3VsdCBvZiBgYmFsYW5jZWAgYmVpbmfAZGlzc29sdmVkIGludG8gdGhlIGNvcnJlc3BvbmRpbmcgdW5ib25kaW5nIHBvb2wu5C0gYGVyYWAgaXMgdGhlIGVyYSBpbiB3aGljaCB0aGUgYmFsYW5jZSB3aWxsIGJlIHVuYm9uZGVkLlUBSW4gdGhlIGFic2VuY2Ugb2Ygc2xhc2hpbmcsIHRoZXNlIHZhbHVlcyB3aWxsIG1hdGNoLiBJbiB0aGUgcHJlc2VuY2Ugb2Ygc2xhc2hpbmcsIHRoZU0BbnVtYmVyIG9mIHBvaW50cyB0aGF0IGFyZSBpc3N1ZWQgaW4gdGhlIHVuYm9uZGluZyBwb29sIHdpbGwgYmUgbGVzcyB0aGFuIHRoZSBhbW91bnRkcmVxdWVzdGVkIHRvIGJlIHVuYm9uZGVkLiRXaXRoZHJhd24QARhtZW1iZXIAATBUOjpBY2NvdW50SWQAARxwb29sX2lkEAEYUG9vbElkAAEcYmFsYW5jZRgBMEJhbGFuY2VPZjxUPgABGHBvaW50cxgBMEJhbGFuY2VPZjxUPgAEGJxBIG1lbWJlciBoYXMgd2l0aGRyYXduIGZyb20gdGhlaXIgcG9vbC4AIQFUaGUgZ2l2ZW4gbnVtYmVyIG9mIGBwb2ludHNgIGhhdmUgYmVlbiBkaXNzb2x2ZWQgaW4gcmV0dXJuIG9mIGBiYWxhbmNlYC4AWQFTaW1pbGFyIHRvIGBVbmJvbmRlZGAgZXZlbnQsIGluIHRoZSBhYnNlbmNlIG9mIHNsYXNoaW5nLCB0aGUgcmF0aW8gb2YgcG9pbnQgdG8gYmFsYW5jZSh3aWxsIGJlIDEuJERlc3Ryb3llZAQBHHBvb2xfaWQQARhQb29sSWQABQRoQSBwb29sIGhhcyBiZWVuIGRlc3Ryb3llZC4wU3RhdGVDaGFuZ2VkCAEccG9vbF9pZBABGFBvb2xJZAABJG5ld19zdGF0ZW0BASRQb29sU3RhdGUABgR8VGhlIHN0YXRlIG9mIGEgcG9vbCBoYXMgY2hhbmdlZDRNZW1iZXJSZW1vdmVkDAEccG9vbF9pZBABGFBvb2xJZAABGG1lbWJlcgABMFQ6OkFjY291bnRJZAABQHJlbGVhc2VkX2JhbGFuY2UYATBCYWxhbmNlT2Y8VD4ABxSYQSBtZW1iZXIgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIGEgcG9vbC4AUQFUaGUgcmVtb3ZhbCBjYW4gYmUgdm9sdW50YXJ5ICh3aXRoZHJhd24gYWxsIHVuYm9uZGVkIGZ1bmRzKSBvciBpbnZvbHVudGFyeSAoa2lja2VkKS5JAUFueSBmdW5kcyB0aGF0IGFyZSBzdGlsbCBkZWxlZ2F0ZWQgKGkuZS4gZGFuZ2xpbmcgZGVsZWdhdGlvbikgYXJlIHJlbGVhc2VkIGFuZCBhcmWIcmVwcmVzZW50ZWQgYnkgYHJlbGVhc2VkX2JhbGFuY2VgLjBSb2xlc1VwZGF0ZWQMARByb290NQEBUE9wdGlvbjxUOjpBY2NvdW50SWQ+AAEcYm91bmNlcjUBAVBPcHRpb248VDo6QWNjb3VudElkPgABJG5vbWluYXRvcjUBAVBPcHRpb248VDo6QWNjb3VudElkPgAICFUBVGhlIHJvbGVzIG9mIGEgcG9vbCBoYXZlIGJlZW4gdXBkYXRlZCB0byB0aGUgZ2l2ZW4gbmV3IHJvbGVzLiBOb3RlIHRoYXQgdGhlIGRlcG9zaXRvckRjYW4gbmV2ZXIgY2hhbmdlLixQb29sU2xhc2hlZAgBHHBvb2xfaWQQARhQb29sSWQAARxiYWxhbmNlGAEwQmFsYW5jZU9mPFQ+AAkEDQFUaGUgYWN0aXZlIGJhbGFuY2Ugb2YgcG9vbCBgcG9vbF9pZGAgaGFzIGJlZW4gc2xhc2hlZCB0byBgYmFsYW5jZWAuUFVuYm9uZGluZ1Bvb2xTbGFzaGVkDAEccG9vbF9pZBABGFBvb2xJZAABDGVyYRABIEVyYUluZGV4AAEcYmFsYW5jZRgBMEJhbGFuY2VPZjxUPgAKBCUBVGhlIHVuYm9uZCBwb29sIGF0IGBlcmFgIG9mIHBvb2wgYHBvb2xfaWRgIGhhcyBiZWVuIHNsYXNoZWQgdG8gYGJhbGFuY2VgLlRQb29sQ29tbWlzc2lvblVwZGF0ZWQIARxwb29sX2lkEAEYUG9vbElkAAEcY3VycmVudHEBAXxPcHRpb248KFBlcmJpbGwsIFQ6OkFjY291bnRJZCk+AAsEtEEgcG9vbCdzIGNvbW1pc3Npb24gc2V0dGluZyBoYXMgYmVlbiBjaGFuZ2VkLmBQb29sTWF4Q29tbWlzc2lvblVwZGF0ZWQIARxwb29sX2lkEAEYUG9vbElkAAE4bWF4X2NvbW1pc3Npb26YARxQZXJiaWxsAAwE1EEgcG9vbCdzIG1heGltdW0gY29tbWlzc2lvbiBzZXR0aW5nIGhhcyBiZWVuIGNoYW5nZWQufFBvb2xDb21taXNzaW9uQ2hhbmdlUmF0ZVVwZGF0ZWQIARxwb29sX2lkEAEYUG9vbElkAAEsY2hhbmdlX3JhdGV5AQGcQ29tbWlzc2lvbkNoYW5nZVJhdGU8QmxvY2tOdW1iZXJGb3I8VD4+AA0EzEEgcG9vbCdzIGNvbW1pc3Npb24gYGNoYW5nZV9yYXRlYCBoYXMgYmVlbiBjaGFuZ2VkLpBQb29sQ29tbWlzc2lvbkNsYWltUGVybWlzc2lvblVwZGF0ZWQIARxwb29sX2lkEAEYUG9vbElkAAEocGVybWlzc2lvbn0BAbxPcHRpb248Q29tbWlzc2lvbkNsYWltUGVybWlzc2lvbjxUOjpBY2NvdW50SWQ+PgAOBMhQb29sIGNvbW1pc3Npb24gY2xhaW0gcGVybWlzc2lvbiBoYXMgYmVlbiB1cGRhdGVkLlRQb29sQ29tbWlzc2lvbkNsYWltZWQIARxwb29sX2lkEAEYUG9vbElkAAEoY29tbWlzc2lvbhgBMEJhbGFuY2VPZjxUPgAPBIRQb29sIGNvbW1pc3Npb24gaGFzIGJlZW4gY2xhaW1lZC5kTWluQmFsYW5jZURlZmljaXRBZGp1c3RlZAgBHHBvb2xfaWQQARhQb29sSWQAARhhbW91bnQYATBCYWxhbmNlT2Y8VD4AEATIVG9wcGVkIHVwIGRlZmljaXQgaW4gZnJvemVuIEVEIG9mIHRoZSByZXdhcmQgcG9vbC5gTWluQmFsYW5jZUV4Y2Vzc0FkanVzdGVkCAEccG9vbF9pZBABGFBvb2xJZAABGGFtb3VudBgBMEJhbGFuY2VPZjxUPgARBLxDbGFpbWVkIGV4Y2VzcyBmcm96ZW4gRUQgb2YgYWYgdGhlIHJld2FyZCBwb29sLnBNZW1iZXJDbGFpbVBlcm1pc3Npb25VcGRhdGVkCAEYbWVtYmVyAAEwVDo6QWNjb3VudElkAAEocGVybWlzc2lvboUBATxDbGFpbVBlcm1pc3Npb24AEgTIQSBwb29sIG1lbWJlcidzIGNsYWltIHBlcm1pc3Npb24gaGFzIGJlZW4gdXBkYXRlZC48TWV0YWRhdGFVcGRhdGVkCAEccG9vbF9pZBABGFBvb2xJZAABGGNhbGxlcgABMFQ6OkFjY291bnRJZAATBHhBIHBvb2wncyBtZXRhZGF0YSB3YXMgdXBkYXRlZC5IUG9vbE5vbWluYXRpb25NYWRlCAEccG9vbF9pZBABGFBvb2xJZAABGGNhbGxlcgABMFQ6OkFjY291bnRJZAAUCFkBQSBwb29sJ3Mgbm9taW5hdGluZyBhY2NvdW50IChvciB0aGUgcG9vbCdzIHJvb3QgYWNjb3VudCkgaGFzIG5vbWluYXRlZCBhIHZhbGlkYXRvciBzZXRYb24gYmVoYWxmIG9mIHRoZSBwb29sLlBQb29sTm9taW5hdG9yQ2hpbGxlZAgBHHBvb2xfaWQQARhQb29sSWQAARhjYWxsZXIAATBUOjpBY2NvdW50SWQAFQS4VGhlIHBvb2wgaXMgY2hpbGxlZCBpLmUuIG5vIGxvbmdlciBub21pbmF0aW5nLkxHbG9iYWxQYXJhbXNVcGRhdGVkGAE0bWluX2pvaW5fYm9uZBgBMEJhbGFuY2VPZjxUPgABPG1pbl9jcmVhdGVfYm9uZBgBMEJhbGFuY2VPZjxUPgABJG1heF9wb29sc5wBLE9wdGlvbjx1MzI+AAEsbWF4X21lbWJlcnOcASxPcHRpb248dTMyPgABUG1heF9tZW1iZXJzX3Blcl9wb29snAEsT3B0aW9uPHUzMj4AAVRnbG9iYWxfbWF4X2NvbW1pc3Npb26JAQE8T3B0aW9uPFBlcmJpbGw+ABYEAQFHbG9iYWwgcGFyYW1ldGVycyByZWd1bGF0aW5nIG5vbWluYXRpb24gcG9vbHMgaGF2ZSBiZWVuIHVwZGF0ZWQuBFhFdmVudHMgb2YgdGhpcyBwYWxsZXQubQEIXHBhbGxldF9ub21pbmF0aW9uX3Bvb2xzJFBvb2xTdGF0ZQABDBBPcGVuAAAAHEJsb2NrZWQAAQAoRGVzdHJveWluZwACAABxAQQYT3B0aW9uBARUAXUBAQgQTm9uZQAAABBTb21lBAB1AQAAAQAAdQEAAAQImAAAeQEIXHBhbGxldF9ub21pbmF0aW9uX3Bvb2xzUENvbW1pc3Npb25DaGFuZ2VSYXRlBCxCbG9ja051bWJlcgEQAAgBMG1heF9pbmNyZWFzZZgBHFBlcmJpbGwAASRtaW5fZGVsYXkQASxCbG9ja051bWJlcgAAfQEEGE9wdGlvbgQEVAGBAQEIEE5vbmUAAAAQU29tZQQAgQEAAAEAAIEBCFxwYWxsZXRfbm9taW5hdGlvbl9wb29sc2RDb21taXNzaW9uQ2xhaW1QZXJtaXNzaW9uBCRBY2NvdW50SWQBAAEIOFBlcm1pc3Npb25sZXNzAAAAHEFjY291bnQEAAABJEFjY291bnRJZAABAACFAQhccGFsbGV0X25vbWluYXRpb25fcG9vbHM8Q2xhaW1QZXJtaXNzaW9uAAEQMFBlcm1pc3Npb25lZAAAAFhQZXJtaXNzaW9ubGVzc0NvbXBvdW5kAAEAWFBlcm1pc3Npb25sZXNzV2l0aGRyYXcAAgBEUGVybWlzc2lvbmxlc3NBbGwAAwAAiQEEGE9wdGlvbgQEVAGYAQgQTm9uZQAAABBTb21lBACYAAABAACNAQxMcGFsbGV0X2Zhc3RfdW5zdGFrZRhwYWxsZXQURXZlbnQEBFQAARQgVW5zdGFrZWQIARRzdGFzaAABMFQ6OkFjY291bnRJZAABGHJlc3VsdAEBAThEaXNwYXRjaFJlc3VsdAAABFhBIHN0YWtlciB3YXMgdW5zdGFrZWQuHFNsYXNoZWQIARRzdGFzaAABMFQ6OkFjY291bnRJZAABGGFtb3VudBgBMEJhbGFuY2VPZjxUPgABBBkBQSBzdGFrZXIgd2FzIHNsYXNoZWQgZm9yIHJlcXVlc3RpbmcgZmFzdC11bnN0YWtlIHdoaWxzdCBiZWluZyBleHBvc2VkLjBCYXRjaENoZWNrZWQEARBlcmFzkQEBNFZlYzxFcmFJbmRleD4AAgRFAUEgYmF0Y2ggd2FzIHBhcnRpYWxseSBjaGVja2VkIGZvciB0aGUgZ2l2ZW4gZXJhcywgYnV0IHRoZSBwcm9jZXNzIGRpZCBub3QgZmluaXNoLjRCYXRjaEZpbmlzaGVkBAEQc2l6ZRABDHUzMgADEJxBIGJhdGNoIG9mIGEgZ2l2ZW4gc2l6ZSB3YXMgdGVybWluYXRlZC4AVQFUaGlzIGlzIGFsd2F5cyBmb2xsb3dzIGJ5IGEgbnVtYmVyIG9mIGBVbnN0YWtlZGAgb3IgYFNsYXNoZWRgIGV2ZW50cywgbWFya2luZyB0aGUgZW5k6G9mIHRoZSBiYXRjaC4gQSBuZXcgYmF0Y2ggd2lsbCBiZSBjcmVhdGVkIHVwb24gbmV4dCBibG9jay40SW50ZXJuYWxFcnJvcgAEBOhBbiBpbnRlcm5hbCBlcnJvciBoYXBwZW5lZC4gT3BlcmF0aW9ucyB3aWxsIGJlIHBhdXNlZCBub3cuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0kQEAAAIQAJUBDGBwYWxsZXRfY29udmljdGlvbl92b3RpbmcYcGFsbGV0FEV2ZW50CARUAARJAAEUJERlbGVnYXRlZAgAAAEwVDo6QWNjb3VudElkAAAAATBUOjpBY2NvdW50SWQAAAQdAUFuIGFjY291bnQgaGFzIGRlbGVnYXRlZCB0aGVpciB2b3RlIHRvIGFub3RoZXIgYWNjb3VudC4gXFt3aG8sIHRhcmdldFxdLFVuZGVsZWdhdGVkBAAAATBUOjpBY2NvdW50SWQAAQT0QW4gXFthY2NvdW50XF0gaGFzIGNhbmNlbGxlZCBhIHByZXZpb3VzIGRlbGVnYXRpb24gb3BlcmF0aW9uLhRWb3RlZAgBDHdobwABMFQ6OkFjY291bnRJZAABEHZvdGWZAQFwQWNjb3VudFZvdGU8QmFsYW5jZU9mPFQsIEk+PgACBFBBbiBhY2NvdW50IGhhcyB2b3RlZCxWb3RlUmVtb3ZlZAgBDHdobwABMFQ6OkFjY291bnRJZAABEHZvdGWZAQFwQWNjb3VudFZvdGU8QmFsYW5jZU9mPFQsIEk+PgADBFxBIHZvdGUgaGFzIGJlZW4gcmVtb3ZlZDBWb3RlVW5sb2NrZWQIAQx3aG8AATBUOjpBY2NvdW50SWQAARRjbGFzc0EBATRDbGFzc09mPFQsIEk+AAQERQFUaGUgbG9ja3VwIHBlcmlvZCBvZiBhIGNvbnZpY3Rpb24gdm90ZSBleHBpcmVkLCBhbmQgdGhlIGZ1bmRzIGhhdmUgYmVlbiB1bmxvY2tlZC4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXSZAQxgcGFsbGV0X2NvbnZpY3Rpb25fdm90aW5nEHZvdGUsQWNjb3VudFZvdGUEHEJhbGFuY2UBGAEMIFN0YW5kYXJkCAEQdm90ZZ0BARBWb3RlAAEcYmFsYW5jZRgBHEJhbGFuY2UAAAAUU3BsaXQIAQxheWUYARxCYWxhbmNlAAEMbmF5GAEcQmFsYW5jZQABADBTcGxpdEFic3RhaW4MAQxheWUYARxCYWxhbmNlAAEMbmF5GAEcQmFsYW5jZQABHGFic3RhaW4YARxCYWxhbmNlAAIAAJ0BDGBwYWxsZXRfY29udmljdGlvbl92b3RpbmcQdm90ZRBWb3RlAAAEAAgAAAChAQxAcGFsbGV0X3JlZmVyZW5kYRhwYWxsZXQURXZlbnQIBFQABEkAAUAkU3VibWl0dGVkDAEUaW5kZXgQATxSZWZlcmVuZHVtSW5kZXgEYEluZGV4IG9mIHRoZSByZWZlcmVuZHVtLgEUdHJhY2tBAQE8VHJhY2tJZE9mPFQsIEk+BCUBVGhlIHRyYWNrIChhbmQgYnkgZXh0ZW5zaW9uIHByb3Bvc2FsIGRpc3BhdGNoIG9yaWdpbikgb2YgdGhpcyByZWZlcmVuZHVtLgEgcHJvcG9zYWylAQFMQm91bmRlZENhbGxPZjxULCBJPgSAVGhlIHByb3Bvc2FsIGZvciB0aGUgcmVmZXJlbmR1bS4ABIBBIHJlZmVyZW5kdW0gaGFzIGJlZW4gc3VibWl0dGVkLlREZWNpc2lvbkRlcG9zaXRQbGFjZWQMARRpbmRleBABPFJlZmVyZW5kdW1JbmRleARgSW5kZXggb2YgdGhlIHJlZmVyZW5kdW0uAQx3aG8AATBUOjpBY2NvdW50SWQEjFRoZSBhY2NvdW50IHdobyBwbGFjZWQgdGhlIGRlcG9zaXQuARhhbW91bnQYATxCYWxhbmNlT2Y8VCwgST4EhFRoZSBhbW91bnQgcGxhY2VkIGJ5IHRoZSBhY2NvdW50LgEElFRoZSBkZWNpc2lvbiBkZXBvc2l0IGhhcyBiZWVuIHBsYWNlZC5cRGVjaXNpb25EZXBvc2l0UmVmdW5kZWQMARRpbmRleBABPFJlZmVyZW5kdW1JbmRleARgSW5kZXggb2YgdGhlIHJlZmVyZW5kdW0uAQx3aG8AATBUOjpBY2NvdW50SWQEjFRoZSBhY2NvdW50IHdobyBwbGFjZWQgdGhlIGRlcG9zaXQuARhhbW91bnQYATxCYWxhbmNlT2Y8VCwgST4EhFRoZSBhbW91bnQgcGxhY2VkIGJ5IHRoZSBhY2NvdW50LgIEnFRoZSBkZWNpc2lvbiBkZXBvc2l0IGhhcyBiZWVuIHJlZnVuZGVkLjhEZXBvc2l0U2xhc2hlZAgBDHdobwABMFQ6OkFjY291bnRJZASMVGhlIGFjY291bnQgd2hvIHBsYWNlZCB0aGUgZGVwb3NpdC4BGGFtb3VudBgBPEJhbGFuY2VPZjxULCBJPgSEVGhlIGFtb3VudCBwbGFjZWQgYnkgdGhlIGFjY291bnQuAwRsQSBkZXBvc2l0IGhhcyBiZWVuIHNsYXNoZWQuPERlY2lzaW9uU3RhcnRlZBABFGluZGV4EAE8UmVmZXJlbmR1bUluZGV4BGBJbmRleCBvZiB0aGUgcmVmZXJlbmR1bS4BFHRyYWNrQQEBPFRyYWNrSWRPZjxULCBJPgQlAVRoZSB0cmFjayAoYW5kIGJ5IGV4dGVuc2lvbiBwcm9wb3NhbCBkaXNwYXRjaCBvcmlnaW4pIG9mIHRoaXMgcmVmZXJlbmR1bS4BIHByb3Bvc2FspQEBTEJvdW5kZWRDYWxsT2Y8VCwgST4EgFRoZSBwcm9wb3NhbCBmb3IgdGhlIHJlZmVyZW5kdW0uARR0YWxsea0IASBUOjpUYWxseQS4VGhlIGN1cnJlbnQgdGFsbHkgb2Ygdm90ZXMgaW4gdGhpcyByZWZlcmVuZHVtLgQEvEEgcmVmZXJlbmR1bSBoYXMgbW92ZWQgaW50byB0aGUgZGVjaWRpbmcgcGhhc2UuOENvbmZpcm1TdGFydGVkBAEUaW5kZXgQATxSZWZlcmVuZHVtSW5kZXgEYEluZGV4IG9mIHRoZSByZWZlcmVuZHVtLgUAOENvbmZpcm1BYm9ydGVkBAEUaW5kZXgQATxSZWZlcmVuZHVtSW5kZXgEYEluZGV4IG9mIHRoZSByZWZlcmVuZHVtLgYAJENvbmZpcm1lZAgBFGluZGV4EAE8UmVmZXJlbmR1bUluZGV4BGBJbmRleCBvZiB0aGUgcmVmZXJlbmR1bS4BFHRhbGx5rQgBIFQ6OlRhbGx5BLBUaGUgZmluYWwgdGFsbHkgb2Ygdm90ZXMgaW4gdGhpcyByZWZlcmVuZHVtLgcEIQFBIHJlZmVyZW5kdW0gaGFzIGVuZGVkIGl0cyBjb25maXJtYXRpb24gcGhhc2UgYW5kIGlzIHJlYWR5IGZvciBhcHByb3ZhbC4gQXBwcm92ZWQEARRpbmRleBABPFJlZmVyZW5kdW1JbmRleARgSW5kZXggb2YgdGhlIHJlZmVyZW5kdW0uCAQNAUEgcmVmZXJlbmR1bSBoYXMgYmVlbiBhcHByb3ZlZCBhbmQgaXRzIHByb3Bvc2FsIGhhcyBiZWVuIHNjaGVkdWxlZC4gUmVqZWN0ZWQIARRpbmRleBABPFJlZmVyZW5kdW1JbmRleARgSW5kZXggb2YgdGhlIHJlZmVyZW5kdW0uARR0YWxsea0IASBUOjpUYWxseQSwVGhlIGZpbmFsIHRhbGx5IG9mIHZvdGVzIGluIHRoaXMgcmVmZXJlbmR1bS4JBKxBIHByb3Bvc2FsIGhhcyBiZWVuIHJlamVjdGVkIGJ5IHJlZmVyZW5kdW0uIFRpbWVkT3V0CAEUaW5kZXgQATxSZWZlcmVuZHVtSW5kZXgEYEluZGV4IG9mIHRoZSByZWZlcmVuZHVtLgEUdGFsbHmtCAEgVDo6VGFsbHkEsFRoZSBmaW5hbCB0YWxseSBvZiB2b3RlcyBpbiB0aGlzIHJlZmVyZW5kdW0uCgTYQSByZWZlcmVuZHVtIGhhcyBiZWVuIHRpbWVkIG91dCB3aXRob3V0IGJlaW5nIGRlY2lkZWQuJENhbmNlbGxlZAgBFGluZGV4EAE8UmVmZXJlbmR1bUluZGV4BGBJbmRleCBvZiB0aGUgcmVmZXJlbmR1bS4BFHRhbGx5rQgBIFQ6OlRhbGx5BLBUaGUgZmluYWwgdGFsbHkgb2Ygdm90ZXMgaW4gdGhpcyByZWZlcmVuZHVtLgsEgEEgcmVmZXJlbmR1bSBoYXMgYmVlbiBjYW5jZWxsZWQuGEtpbGxlZAgBFGluZGV4EAE8UmVmZXJlbmR1bUluZGV4BGBJbmRleCBvZiB0aGUgcmVmZXJlbmR1bS4BFHRhbGx5rQgBIFQ6OlRhbGx5BLBUaGUgZmluYWwgdGFsbHkgb2Ygdm90ZXMgaW4gdGhpcyByZWZlcmVuZHVtLgwEdEEgcmVmZXJlbmR1bSBoYXMgYmVlbiBraWxsZWQuZFN1Ym1pc3Npb25EZXBvc2l0UmVmdW5kZWQMARRpbmRleBABPFJlZmVyZW5kdW1JbmRleARgSW5kZXggb2YgdGhlIHJlZmVyZW5kdW0uAQx3aG8AATBUOjpBY2NvdW50SWQEjFRoZSBhY2NvdW50IHdobyBwbGFjZWQgdGhlIGRlcG9zaXQuARhhbW91bnQYATxCYWxhbmNlT2Y8VCwgST4EhFRoZSBhbW91bnQgcGxhY2VkIGJ5IHRoZSBhY2NvdW50Lg0EpFRoZSBzdWJtaXNzaW9uIGRlcG9zaXQgaGFzIGJlZW4gcmVmdW5kZWQuLE1ldGFkYXRhU2V0CAEUaW5kZXgQATxSZWZlcmVuZHVtSW5kZXgEYEluZGV4IG9mIHRoZSByZWZlcmVuZHVtLgEQaGFzaDQBHFQ6Okhhc2gEOFByZWltYWdlIGhhc2guDgScTWV0YWRhdGEgZm9yIGEgcmVmZXJlbmR1bSBoYXMgYmVlbiBzZXQuPE1ldGFkYXRhQ2xlYXJlZAgBFGluZGV4EAE8UmVmZXJlbmR1bUluZGV4BGBJbmRleCBvZiB0aGUgcmVmZXJlbmR1bS4BEGhhc2g0ARxUOjpIYXNoBDhQcmVpbWFnZSBoYXNoLg8ErE1ldGFkYXRhIGZvciBhIHJlZmVyZW5kdW0gaGFzIGJlZW4gY2xlYXJlZC4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXSlARA0ZnJhbWVfc3VwcG9ydBh0cmFpdHMkcHJlaW1hZ2VzHEJvdW5kZWQIBFQBqQEESAGlCAEMGExlZ2FjeQQBEGhhc2g0ASRIOjpPdXRwdXQAAAAYSW5saW5lBACpCAE0Qm91bmRlZElubGluZQABABhMb29rdXAIARBoYXNoNAEkSDo6T3V0cHV0AAEMbGVuEAEMdTMyAAIAAKkBCDx3ZXN0ZW5kX3J1bnRpbWUsUnVudGltZUNhbGwAAdAYU3lzdGVtBACtAQGtAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxTeXN0ZW0sIFJ1bnRpbWU+AAAAEEJhYmUEAL0BAaUBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPEJhYmUsIFJ1bnRpbWU+AAEAJFRpbWVzdGFtcAQA5QEBuQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8VGltZXN0YW1wLCBSdW50aW1lPgACABxJbmRpY2VzBADpAQGxAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxJbmRpY2VzLCBSdW50aW1lPgADACBCYWxhbmNlcwQA+QEBtQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8QmFsYW5jZXMsIFJ1bnRpbWU+AAQAHFN0YWtpbmcEAAkCAbEBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPFN0YWtpbmcsIFJ1bnRpbWU+AAYAKFBhcmFtZXRlcnMEAD0CAb0Bc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPFBhcmFtZXRlcnMsIFJ1bnRpbWU+AEYAHFNlc3Npb24EAFECAbEBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPFNlc3Npb24sIFJ1bnRpbWU+AAgAHEdyYW5kcGEEAG0CAbEBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPEdyYW5kcGEsIFJ1bnRpbWU+AAoAHFV0aWxpdHkEAJkCAbEBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPFV0aWxpdHksIFJ1bnRpbWU+ABAAIElkZW50aXR5BAD1AgG1AXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxJZGVudGl0eSwgUnVudGltZT4AEQAgUmVjb3ZlcnkEAJ0DAbUBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPFJlY292ZXJ5LCBSdW50aW1lPgASABxWZXN0aW5nBAClAwGxAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxWZXN0aW5nLCBSdW50aW1lPgATACRTY2hlZHVsZXIEAK0DAbkBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPFNjaGVkdWxlciwgUnVudGltZT4AFAAgUHJlaW1hZ2UEALUDAbUBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPFByZWltYWdlLCBSdW50aW1lPgAcABBTdWRvBAC9AwGlAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxTdWRvLCBSdW50aW1lPgAVABRQcm94eQQAwQMBqQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8UHJveHksIFJ1bnRpbWU+ABYAIE11bHRpc2lnBADJAwG1AXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxNdWx0aXNpZywgUnVudGltZT4AFwBoRWxlY3Rpb25Qcm92aWRlck11bHRpUGhhc2UEANEDAf0Bc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPEVsZWN0aW9uUHJvdmlkZXJNdWx0aVBoYXNlLCBSdW50aW1lPgAYACRWb3Rlckxpc3QEAMEEAbkBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPFZvdGVyTGlzdCwgUnVudGltZT4AGQA8Tm9taW5hdGlvblBvb2xzBADFBAHRAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxOb21pbmF0aW9uUG9vbHMsIFJ1bnRpbWU+AB0ALEZhc3RVbnN0YWtlBADdBAHBAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxGYXN0VW5zdGFrZSwgUnVudGltZT4AHgBAQ29udmljdGlvblZvdGluZwQA4QQB1QFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8Q29udmljdGlvblZvdGluZywgUnVudGltZT4AHwAkUmVmZXJlbmRhBADtBAG5AXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxSZWZlcmVuZGEsIFJ1bnRpbWU+ACAAJFdoaXRlbGlzdAQA+QQBuQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8V2hpdGVsaXN0LCBSdW50aW1lPgAkACBUcmVhc3VyeQQA/QQBtQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8VHJlYXN1cnksIFJ1bnRpbWU+ACUANENvbmZpZ3VyYXRpb24EAF0FAckBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPENvbmZpZ3VyYXRpb24sIFJ1bnRpbWU+ACoALFBhcmFzU2hhcmVkBACBBQHBAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxQYXJhc1NoYXJlZCwgUnVudGltZT4AKwA0UGFyYUluY2x1c2lvbgQAhQUByQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8UGFyYUluY2x1c2lvbiwgUnVudGltZT4ALAAwUGFyYUluaGVyZW50BACJBQHFAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxQYXJhSW5oZXJlbnQsIFJ1bnRpbWU+AC0AFFBhcmFzBAARBgGpAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxQYXJhcywgUnVudGltZT4ALwAsSW5pdGlhbGl6ZXIEABkGAcEBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPEluaXRpYWxpemVyLCBSdW50aW1lPgAwABBIcm1wBAAdBgGlAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxIcm1wLCBSdW50aW1lPgAzADRQYXJhc0Rpc3B1dGVzBAAlBgHJAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxQYXJhc0Rpc3B1dGVzLCBSdW50aW1lPgA1ADRQYXJhc1NsYXNoaW5nBAApBgHJAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxQYXJhc1NsYXNoaW5nLCBSdW50aW1lPgA2AGhPbkRlbWFuZEFzc2lnbm1lbnRQcm92aWRlcgQAOQYB/QFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8T25EZW1hbmRBc3NpZ25tZW50UHJvdmlkZXIsIFJ1bnRpbWU+ADgAJFJlZ2lzdHJhcgQAPQYBuQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8UmVnaXN0cmFyLCBSdW50aW1lPgA8ABRTbG90cwQAQQYBqQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8U2xvdHMsIFJ1bnRpbWU+AD0AQFBhcmFzU3Vkb1dyYXBwZXIEAEUGAdUBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPFBhcmFzU3Vkb1dyYXBwZXIsIFJ1bnRpbWU+AD4AIEF1Y3Rpb25zBAB5BwG1AXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxBdWN0aW9ucywgUnVudGltZT4APwAkQ3Jvd2Rsb2FuBACBBwG5AXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxDcm93ZGxvYW4sIFJ1bnRpbWU+AEAANEFzc2lnbmVkU2xvdHMEAI0HAckBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPEFzc2lnbmVkU2xvdHMsIFJ1bnRpbWU+AEEAIENvcmV0aW1lBACVBwG1AXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxDb3JldGltZSwgUnVudGltZT4AQgA8U3Rha2luZ0FoQ2xpZW50BACpBwHRAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxTdGFraW5nQWhDbGllbnQsIFJ1bnRpbWU+AEMAUE11bHRpQmxvY2tNaWdyYXRpb25zBAC1BwHlAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxNdWx0aUJsb2NrTWlncmF0aW9ucywgUnVudGltZT4AYgAkWGNtUGFsbGV0BADdBwG5AXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxYY21QYWxsZXQsIFJ1bnRpbWU+AGMAME1lc3NhZ2VRdWV1ZQQAHQgBxQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8TWVzc2FnZVF1ZXVlLCBSdW50aW1lPgBkACRBc3NldFJhdGUEACkIAbkBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPEFzc2V0UmF0ZSwgUnVudGltZT4AZQAsUm9vdFRlc3RpbmcEADEIAcEBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPFJvb3RUZXN0aW5nLCBSdW50aW1lPgBmABhNZXRhVHgEADUIAa0Bc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPE1ldGFUeCwgUnVudGltZT4AZwAUQmVlZnkEAG0IAakBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPEJlZWZ5LCBSdW50aW1lPgDIAEBJZGVudGl0eU1pZ3JhdG9yBAChCAHVAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxJZGVudGl0eU1pZ3JhdG9yLCBSdW50aW1lPgD4AACtAQwwZnJhbWVfc3lzdGVtGHBhbGxldBBDYWxsBARUAAEsGHJlbWFyawQBGHJlbWFyazgBHFZlYzx1OD4AAAxoTWFrZSBzb21lIG9uLWNoYWluIHJlbWFyay4AiENhbiBiZSBleGVjdXRlZCBieSBldmVyeSBgb3JpZ2luYC44c2V0X2hlYXBfcGFnZXMEARRwYWdlczABDHU2NAABBPhTZXQgdGhlIG51bWJlciBvZiBwYWdlcyBpbiB0aGUgV2ViQXNzZW1ibHkgZW52aXJvbm1lbnQncyBoZWFwLiBzZXRfY29kZQQBEGNvZGU4ARxWZWM8dTg+AAIEZFNldCB0aGUgbmV3IHJ1bnRpbWUgY29kZS5cc2V0X2NvZGVfd2l0aG91dF9jaGVja3MEARBjb2RlOAEcVmVjPHU4PgADEBkBU2V0IHRoZSBuZXcgcnVudGltZSBjb2RlIHdpdGhvdXQgZG9pbmcgYW55IGNoZWNrcyBvZiB0aGUgZ2l2ZW4gYGNvZGVgLgBRAU5vdGUgdGhhdCBydW50aW1lIHVwZ3JhZGVzIHdpbGwgbm90IHJ1biBpZiB0aGlzIGlzIGNhbGxlZCB3aXRoIGEgbm90LWluY3JlYXNpbmcgc3BlYyB2ZXJzaW9uISxzZXRfc3RvcmFnZQQBFGl0ZW1zsQEBNFZlYzxLZXlWYWx1ZT4ABARoU2V0IHNvbWUgaXRlbXMgb2Ygc3RvcmFnZS4wa2lsbF9zdG9yYWdlBAEQa2V5c7kBASBWZWM8S2V5PgAFBHRLaWxsIHNvbWUgaXRlbXMgZnJvbSBzdG9yYWdlLixraWxsX3ByZWZpeAgBGHByZWZpeDgBDEtleQABHHN1YmtleXMQAQx1MzIABhARAUtpbGwgYWxsIHN0b3JhZ2UgaXRlbXMgd2l0aCBhIGtleSB0aGF0IHN0YXJ0cyB3aXRoIHRoZSBnaXZlbiBwcmVmaXguADkBKipOT1RFOioqIFdlIHJlbHkgb24gdGhlIFJvb3Qgb3JpZ2luIHRvIHByb3ZpZGUgdXMgdGhlIG51bWJlciBvZiBzdWJrZXlzIHVuZGVyPQF0aGUgcHJlZml4IHdlIGFyZSByZW1vdmluZyB0byBhY2N1cmF0ZWx5IGNhbGN1bGF0ZSB0aGUgd2VpZ2h0IG9mIHRoaXMgZnVuY3Rpb24uRHJlbWFya193aXRoX2V2ZW50BAEYcmVtYXJrOAEcVmVjPHU4PgAHBKRNYWtlIHNvbWUgb24tY2hhaW4gcmVtYXJrIGFuZCBlbWl0IGV2ZW50LkRhdXRob3JpemVfdXBncmFkZQQBJGNvZGVfaGFzaDQBHFQ6Okhhc2gACRBhAUF1dGhvcml6ZSBhbiB1cGdyYWRlIHRvIGEgZ2l2ZW4gYGNvZGVfaGFzaGAgZm9yIHRoZSBydW50aW1lLiBUaGUgcnVudGltZSBjYW4gYmUgc3VwcGxpZWQYbGF0ZXIuAHxUaGlzIGNhbGwgcmVxdWlyZXMgUm9vdCBvcmlnaW4ugGF1dGhvcml6ZV91cGdyYWRlX3dpdGhvdXRfY2hlY2tzBAEkY29kZV9oYXNoNAEcVDo6SGFzaAAKIGEBQXV0aG9yaXplIGFuIHVwZ3JhZGUgdG8gYSBnaXZlbiBgY29kZV9oYXNoYCBmb3IgdGhlIHJ1bnRpbWUuIFRoZSBydW50aW1lIGNhbiBiZSBzdXBwbGllZBhsYXRlci4AXQFXQVJOSU5HOiBUaGlzIGF1dGhvcml6ZXMgYW4gdXBncmFkZSB0aGF0IHdpbGwgdGFrZSBwbGFjZSB3aXRob3V0IGFueSBzYWZldHkgY2hlY2tzLCBmb3JZAWV4YW1wbGUgdGhhdCB0aGUgc3BlYyBuYW1lIHJlbWFpbnMgdGhlIHNhbWUgYW5kIHRoYXQgdGhlIHZlcnNpb24gbnVtYmVyIGluY3JlYXNlcy4gTm908HJlY29tbWVuZGVkIGZvciBub3JtYWwgdXNlLiBVc2UgYGF1dGhvcml6ZV91cGdyYWRlYCBpbnN0ZWFkLgB8VGhpcyBjYWxsIHJlcXVpcmVzIFJvb3Qgb3JpZ2luLmBhcHBseV9hdXRob3JpemVkX3VwZ3JhZGUEARBjb2RlOAEcVmVjPHU4PgALJFUBUHJvdmlkZSB0aGUgcHJlaW1hZ2UgKHJ1bnRpbWUgYmluYXJ5KSBgY29kZWAgZm9yIGFuIHVwZ3JhZGUgdGhhdCBoYXMgYmVlbiBhdXRob3JpemVkLgBJAUlmIHRoZSBhdXRob3JpemF0aW9uIHJlcXVpcmVkIGEgdmVyc2lvbiBjaGVjaywgdGhpcyBjYWxsIHdpbGwgZW5zdXJlIHRoZSBzcGVjIG5hbWXocmVtYWlucyB1bmNoYW5nZWQgYW5kIHRoYXQgdGhlIHNwZWMgdmVyc2lvbiBoYXMgaW5jcmVhc2VkLgBZAURlcGVuZGluZyBvbiB0aGUgcnVudGltZSdzIGBPblNldENvZGVgIGNvbmZpZ3VyYXRpb24sIHRoaXMgZnVuY3Rpb24gbWF5IGRpcmVjdGx5IGFwcGx5EQF0aGUgbmV3IGBjb2RlYCBpbiB0aGUgc2FtZSBibG9jayBvciBhdHRlbXB0IHRvIHNjaGVkdWxlIHRoZSB1cGdyYWRlLgBgQWxsIG9yaWdpbnMgYXJlIGFsbG93ZWQuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLrEBAAACtQEAtQEAAAQIODgAuQEAAAI4AL0BDCxwYWxsZXRfYmFiZRhwYWxsZXQQQ2FsbAQEVAABDExyZXBvcnRfZXF1aXZvY2F0aW9uCAFIZXF1aXZvY2F0aW9uX3Byb29mwQEBkEJveDxFcXVpdm9jYXRpb25Qcm9vZjxIZWFkZXJGb3I8VD4+PgABPGtleV9vd25lcl9wcm9vZtUBAUBUOjpLZXlPd25lclByb29mAAAQCQFSZXBvcnQgYXV0aG9yaXR5IGVxdWl2b2NhdGlvbi9taXNiZWhhdmlvci4gVGhpcyBtZXRob2Qgd2lsbCB2ZXJpZnkFAXRoZSBlcXVpdm9jYXRpb24gcHJvb2YgYW5kIHZhbGlkYXRlIHRoZSBnaXZlbiBrZXkgb3duZXJzaGlwIHByb29mDQFhZ2FpbnN0IHRoZSBleHRyYWN0ZWQgb2ZmZW5kZXIuIElmIGJvdGggYXJlIHZhbGlkLCB0aGUgb2ZmZW5jZSB3aWxsMGJlIHJlcG9ydGVkLnByZXBvcnRfZXF1aXZvY2F0aW9uX3Vuc2lnbmVkCAFIZXF1aXZvY2F0aW9uX3Byb29mwQEBkEJveDxFcXVpdm9jYXRpb25Qcm9vZjxIZWFkZXJGb3I8VD4+PgABPGtleV9vd25lcl9wcm9vZtUBAUBUOjpLZXlPd25lclByb29mAAEgCQFSZXBvcnQgYXV0aG9yaXR5IGVxdWl2b2NhdGlvbi9taXNiZWhhdmlvci4gVGhpcyBtZXRob2Qgd2lsbCB2ZXJpZnkFAXRoZSBlcXVpdm9jYXRpb24gcHJvb2YgYW5kIHZhbGlkYXRlIHRoZSBnaXZlbiBrZXkgb3duZXJzaGlwIHByb29mDQFhZ2FpbnN0IHRoZSBleHRyYWN0ZWQgb2ZmZW5kZXIuIElmIGJvdGggYXJlIHZhbGlkLCB0aGUgb2ZmZW5jZSB3aWxsMGJlIHJlcG9ydGVkLg0BVGhpcyBleHRyaW5zaWMgbXVzdCBiZSBjYWxsZWQgdW5zaWduZWQgYW5kIGl0IGlzIGV4cGVjdGVkIHRoYXQgb25seRUBYmxvY2sgYXV0aG9ycyB3aWxsIGNhbGwgaXQgKHZhbGlkYXRlZCBpbiBgVmFsaWRhdGVVbnNpZ25lZGApLCBhcyBzdWNoFQFpZiB0aGUgYmxvY2sgYXV0aG9yIGlzIGRlZmluZWQgaXQgd2lsbCBiZSBkZWZpbmVkIGFzIHRoZSBlcXVpdm9jYXRpb24kcmVwb3J0ZXIuSHBsYW5fY29uZmlnX2NoYW5nZQQBGGNvbmZpZ9kBAVBOZXh0Q29uZmlnRGVzY3JpcHRvcgACEF0BUGxhbiBhbiBlcG9jaCBjb25maWcgY2hhbmdlLiBUaGUgZXBvY2ggY29uZmlnIGNoYW5nZSBpcyByZWNvcmRlZCBhbmQgd2lsbCBiZSBlbmFjdGVkIG9uUQF0aGUgbmV4dCBjYWxsIHRvIGBlbmFjdF9lcG9jaF9jaGFuZ2VgLiBUaGUgY29uZmlnIHdpbGwgYmUgYWN0aXZhdGVkIG9uZSBlcG9jaCBhZnRlci5ZAU11bHRpcGxlIGNhbGxzIHRvIHRoaXMgbWV0aG9kIHdpbGwgcmVwbGFjZSBhbnkgZXhpc3RpbmcgcGxhbm5lZCBjb25maWcgY2hhbmdlIHRoYXQgaGFkVG5vdCBiZWVuIGVuYWN0ZWQgeWV0LgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy7BAQhIc3BfY29uc2Vuc3VzX3Nsb3RzREVxdWl2b2NhdGlvblByb29mCBhIZWFkZXIBxQEISWQBzQEAEAEgb2ZmZW5kZXLNAQEISWQAARBzbG900QEBEFNsb3QAATBmaXJzdF9oZWFkZXLFAQEYSGVhZGVyAAE0c2Vjb25kX2hlYWRlcsUBARhIZWFkZXIAAMUBEChzcF9ydW50aW1lHGdlbmVyaWMYaGVhZGVyGEhlYWRlcggYTnVtYmVyARAQSGFzaAAAFAEscGFyZW50X2hhc2g0ATBIYXNoOjpPdXRwdXQAARhudW1iZXLJAQEYTnVtYmVyAAEoc3RhdGVfcm9vdDQBMEhhc2g6Ok91dHB1dAABPGV4dHJpbnNpY3Nfcm9vdDQBMEhhc2g6Ok91dHB1dAABGGRpZ2VzdDwBGERpZ2VzdAAAyQEAAAYQAM0BDERzcF9jb25zZW5zdXNfYmFiZQxhcHAYUHVibGljAAAEAAQBPHNyMjU1MTk6OlB1YmxpYwAA0QEISHNwX2NvbnNlbnN1c19zbG90cxBTbG90AAAEADABDHU2NAAA1QEIKHNwX3Nlc3Npb248TWVtYmVyc2hpcFByb29mAAAMARxzZXNzaW9uEAEwU2Vzc2lvbkluZGV4AAEodHJpZV9ub2Rlc7kBATBWZWM8VmVjPHU4Pj4AATx2YWxpZGF0b3JfY291bnQQAThWYWxpZGF0b3JDb3VudAAA2QEMRHNwX2NvbnNlbnN1c19iYWJlHGRpZ2VzdHNQTmV4dENvbmZpZ0Rlc2NyaXB0b3IAAQQIVjEIAQRj3QEBKCh1NjQsIHU2NCkAATRhbGxvd2VkX3Nsb3Rz4QEBMEFsbG93ZWRTbG90cwABAADdAQAABAgwMADhAQhEc3BfY29uc2Vuc3VzX2JhYmUwQWxsb3dlZFNsb3RzAAEMMFByaW1hcnlTbG90cwAAAHRQcmltYXJ5QW5kU2Vjb25kYXJ5UGxhaW5TbG90cwABAGxQcmltYXJ5QW5kU2Vjb25kYXJ5VlJGU2xvdHMAAgAA5QEMQHBhbGxldF90aW1lc3RhbXAYcGFsbGV0EENhbGwEBFQAAQQMc2V0BAEMbm93LAEkVDo6TW9tZW50AABMVFNldCB0aGUgY3VycmVudCB0aW1lLgBVAVRoaXMgY2FsbCBzaG91bGQgYmUgaW52b2tlZCBleGFjdGx5IG9uY2UgcGVyIGJsb2NrLiBJdCB3aWxsIHBhbmljIGF0IHRoZSBmaW5hbGl6YXRpb27UcGhhc2UsIGlmIHRoaXMgY2FsbCBoYXNuJ3QgYmVlbiBpbnZva2VkIGJ5IHRoYXQgdGltZS4AQQFUaGUgdGltZXN0YW1wIHNob3VsZCBiZSBncmVhdGVyIHRoYW4gdGhlIHByZXZpb3VzIG9uZSBieSB0aGUgYW1vdW50IHNwZWNpZmllZCBieWhbYENvbmZpZzo6TWluaW11bVBlcmlvZGBdLgDEVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX05vbmVfLgBRAVRoaXMgZGlzcGF0Y2ggY2xhc3MgaXMgX01hbmRhdG9yeV8gdG8gZW5zdXJlIGl0IGdldHMgZXhlY3V0ZWQgaW4gdGhlIGJsb2NrLiBCZSBhd2FyZVEBdGhhdCBjaGFuZ2luZyB0aGUgY29tcGxleGl0eSBvZiB0aGlzIGNhbGwgY291bGQgcmVzdWx0IGV4aGF1c3RpbmcgdGhlIHJlc291cmNlcyBpbiBhhGJsb2NrIHRvIGV4ZWN1dGUgYW55IG90aGVyIGNhbGxzLgA0IyMgQ29tcGxleGl0eTEBLSBgTygxKWAgKE5vdGUgdGhhdCBpbXBsZW1lbnRhdGlvbnMgb2YgYE9uVGltZXN0YW1wU2V0YCBtdXN0IGFsc28gYmUgYE8oMSlgKVUBLSAxIHN0b3JhZ2UgcmVhZCBhbmQgMSBzdG9yYWdlIG11dGF0aW9uIChjb2RlYyBgTygxKWAgYmVjYXVzZSBvZiBgRGlkVXBkYXRlOjp0YWtlYCBpbkAgIGBvbl9maW5hbGl6ZWAp1C0gMSBldmVudCBoYW5kbGVyIGBvbl90aW1lc3RhbXBfc2V0YC4gTXVzdCBiZSBgTygxKWAuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLukBDDhwYWxsZXRfaW5kaWNlcxhwYWxsZXQQQ2FsbAQEVAABGBRjbGFpbQQBFGluZGV4EAE8VDo6QWNjb3VudEluZGV4AAAwmEFzc2lnbiBhbiBwcmV2aW91c2x5IHVuYXNzaWduZWQgaW5kZXguANxQYXltZW50OiBgRGVwb3NpdGAgaXMgcmVzZXJ2ZWQgZnJvbSB0aGUgc2VuZGVyIGFjY291bnQuAMxUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXy4A8C0gYGluZGV4YDogdGhlIGluZGV4IHRvIGJlIGNsYWltZWQuIFRoaXMgbXVzdCBub3QgYmUgaW4gdXNlLgCQRW1pdHMgYEluZGV4QXNzaWduZWRgIGlmIHN1Y2Nlc3NmdWwuADQjIyBDb21wbGV4aXR5JC0gYE8oMSlgLiB0cmFuc2ZlcggBDG5ld+0BAVBBY2NvdW50SWRMb29rdXBPZjxUPgABFGluZGV4EAE8VDo6QWNjb3VudEluZGV4AAEwXQFBc3NpZ24gYW4gaW5kZXggYWxyZWFkeSBvd25lZCBieSB0aGUgc2VuZGVyIHRvIGFub3RoZXIgYWNjb3VudC4gVGhlIGJhbGFuY2UgcmVzZXJ2YXRpb264aXMgZWZmZWN0aXZlbHkgdHJhbnNmZXJyZWQgdG8gdGhlIG5ldyBhY2NvdW50LgDMVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uACUBLSBgaW5kZXhgOiB0aGUgaW5kZXggdG8gYmUgcmUtYXNzaWduZWQuIFRoaXMgbXVzdCBiZSBvd25lZCBieSB0aGUgc2VuZGVyLl0BLSBgbmV3YDogdGhlIG5ldyBvd25lciBvZiB0aGUgaW5kZXguIFRoaXMgZnVuY3Rpb24gaXMgYSBuby1vcCBpZiBpdCBpcyBlcXVhbCB0byBzZW5kZXIuAJBFbWl0cyBgSW5kZXhBc3NpZ25lZGAgaWYgc3VjY2Vzc2Z1bC4ANCMjIENvbXBsZXhpdHkkLSBgTygxKWAuEGZyZWUEARRpbmRleBABPFQ6OkFjY291bnRJbmRleAACMJRGcmVlIHVwIGFuIGluZGV4IG93bmVkIGJ5IHRoZSBzZW5kZXIuAF0BUGF5bWVudDogQW55IHByZXZpb3VzIGRlcG9zaXQgcGxhY2VkIGZvciB0aGUgaW5kZXggaXMgdW5yZXNlcnZlZCBpbiB0aGUgc2VuZGVyIGFjY291bnQuAFUBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8gYW5kIHRoZSBzZW5kZXIgbXVzdCBvd24gdGhlIGluZGV4LgANAS0gYGluZGV4YDogdGhlIGluZGV4IHRvIGJlIGZyZWVkLiBUaGlzIG11c3QgYmUgb3duZWQgYnkgdGhlIHNlbmRlci4AhEVtaXRzIGBJbmRleEZyZWVkYCBpZiBzdWNjZXNzZnVsLgA0IyMgQ29tcGxleGl0eSQtIGBPKDEpYC44Zm9yY2VfdHJhbnNmZXIMAQxuZXftAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AARRpbmRleBABPFQ6OkFjY291bnRJbmRleAABGGZyZWV6ZSABEGJvb2wAAzRVAUZvcmNlIGFuIGluZGV4IHRvIGFuIGFjY291bnQuIFRoaXMgZG9lc24ndCByZXF1aXJlIGEgZGVwb3NpdC4gSWYgdGhlIGluZGV4IGlzIGFscmVhZHnoaGVsZCwgdGhlbiBhbnkgZGVwb3NpdCBpcyByZWltYnVyc2VkIHRvIGl0cyBjdXJyZW50IG93bmVyLgDEVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1Jvb3RfLgCkLSBgaW5kZXhgOiB0aGUgaW5kZXggdG8gYmUgKHJlLSlhc3NpZ25lZC5dAS0gYG5ld2A6IHRoZSBuZXcgb3duZXIgb2YgdGhlIGluZGV4LiBUaGlzIGZ1bmN0aW9uIGlzIGEgbm8tb3AgaWYgaXQgaXMgZXF1YWwgdG8gc2VuZGVyLkEBLSBgZnJlZXplYDogaWYgc2V0IHRvIGB0cnVlYCwgd2lsbCBmcmVlemUgdGhlIGluZGV4IHNvIGl0IGNhbm5vdCBiZSB0cmFuc2ZlcnJlZC4AkEVtaXRzIGBJbmRleEFzc2lnbmVkYCBpZiBzdWNjZXNzZnVsLgA0IyMgQ29tcGxleGl0eSQtIGBPKDEpYC4YZnJlZXplBAEUaW5kZXgQATxUOjpBY2NvdW50SW5kZXgABDBBAUZyZWV6ZSBhbiBpbmRleCBzbyBpdCB3aWxsIGFsd2F5cyBwb2ludCB0byB0aGUgc2VuZGVyIGFjY291bnQuIFRoaXMgY29uc3VtZXMgdGhlIGRlcG9zaXQuAFkBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8gYW5kIHRoZSBzaWduaW5nIGFjY291bnQgbXVzdCBoYXZlIGFsbm9uLWZyb3plbiBhY2NvdW50IGBpbmRleGAuAKwtIGBpbmRleGA6IHRoZSBpbmRleCB0byBiZSBmcm96ZW4gaW4gcGxhY2UuAIhFbWl0cyBgSW5kZXhGcm96ZW5gIGlmIHN1Y2Nlc3NmdWwuADQjIyBDb21wbGV4aXR5JC0gYE8oMSlgLjBwb2tlX2RlcG9zaXQEARRpbmRleBABPFQ6OkFjY291bnRJbmRleAAFKJxQb2tlIHRoZSBkZXBvc2l0IHJlc2VydmVkIGZvciBhbiBpbmRleC4AWQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXyBhbmQgdGhlIHNpZ25pbmcgYWNjb3VudCBtdXN0IGhhdmUgYWxub24tZnJvemVuIGFjY291bnQgYGluZGV4YC4AWQFUaGUgdHJhbnNhY3Rpb24gZmVlcyBpcyB3YWl2ZWQgaWYgdGhlIGRlcG9zaXQgaXMgY2hhbmdlZCBhZnRlciBwb2tpbmcvcmVjb25zaWRlcmF0aW9uLgD8LSBgaW5kZXhgOiB0aGUgaW5kZXggd2hvc2UgZGVwb3NpdCBpcyB0byBiZSBwb2tlZC9yZWNvbnNpZGVyZWQuAIxFbWl0cyBgRGVwb3NpdFBva2VkYCBpZiBzdWNjZXNzZnVsLgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy7tAQwoc3BfcnVudGltZTBtdWx0aWFkZHJlc3MwTXVsdGlBZGRyZXNzCCRBY2NvdW50SWQBADBBY2NvdW50SW5kZXgBBQEBFAhJZAQAAAEkQWNjb3VudElkAAAAFEluZGV4BADxAQEwQWNjb3VudEluZGV4AAEADFJhdwQAOAEcVmVjPHU4PgACACRBZGRyZXNzMzIEAAQBIFt1ODsgMzJdAAMAJEFkZHJlc3MyMAQA9QEBIFt1ODsgMjBdAAQAAPEBAAAGBQEA9QEAAAMUAAAACAD5AQw8cGFsbGV0X2JhbGFuY2VzGHBhbGxldBBDYWxsCARUAARJAAEkUHRyYW5zZmVyX2FsbG93X2RlYXRoCAEQZGVzdO0BAVBBY2NvdW50SWRMb29rdXBPZjxUPgABFHZhbHVl/QEBKFQ6OkJhbGFuY2UAABzUVHJhbnNmZXIgc29tZSBsaXF1aWQgZnJlZSBiYWxhbmNlIHRvIGFub3RoZXIgYWNjb3VudC4ANQFgdHJhbnNmZXJfYWxsb3dfZGVhdGhgIHdpbGwgc2V0IHRoZSBgRnJlZUJhbGFuY2VgIG9mIHRoZSBzZW5kZXIgYW5kIHJlY2VpdmVyLhEBSWYgdGhlIHNlbmRlcidzIGFjY291bnQgaXMgYmVsb3cgdGhlIGV4aXN0ZW50aWFsIGRlcG9zaXQgYXMgYSByZXN1bHSwb2YgdGhlIHRyYW5zZmVyLCB0aGUgYWNjb3VudCB3aWxsIGJlIHJlYXBlZC4AFQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBgU2lnbmVkYCBieSB0aGUgdHJhbnNhY3Rvci44Zm9yY2VfdHJhbnNmZXIMARhzb3VyY2XtAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AARBkZXN07QEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEUdmFsdWX9AQEoVDo6QmFsYW5jZQACCGEBRXhhY3RseSBhcyBgdHJhbnNmZXJfYWxsb3dfZGVhdGhgLCBleGNlcHQgdGhlIG9yaWdpbiBtdXN0IGJlIHJvb3QgYW5kIHRoZSBzb3VyY2UgYWNjb3VudERtYXkgYmUgc3BlY2lmaWVkLkx0cmFuc2Zlcl9rZWVwX2FsaXZlCAEQZGVzdO0BAVBBY2NvdW50SWRMb29rdXBPZjxUPgABFHZhbHVl/QEBKFQ6OkJhbGFuY2UAAxhZAVNhbWUgYXMgdGhlIFtgdHJhbnNmZXJfYWxsb3dfZGVhdGhgXSBjYWxsLCBidXQgd2l0aCBhIGNoZWNrIHRoYXQgdGhlIHRyYW5zZmVyIHdpbGwgbm90YGtpbGwgdGhlIG9yaWdpbiBhY2NvdW50LgDoOTklIG9mIHRoZSB0aW1lIHlvdSB3YW50IFtgdHJhbnNmZXJfYWxsb3dfZGVhdGhgXSBpbnN0ZWFkLgDwW2B0cmFuc2Zlcl9hbGxvd19kZWF0aGBdOiBzdHJ1Y3QuUGFsbGV0Lmh0bWwjbWV0aG9kLnRyYW5zZmVyMHRyYW5zZmVyX2FsbAgBEGRlc3TtAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AAShrZWVwX2FsaXZlIAEQYm9vbAAEPAUBVHJhbnNmZXIgdGhlIGVudGlyZSB0cmFuc2ZlcmFibGUgYmFsYW5jZSBmcm9tIHRoZSBjYWxsZXIgYWNjb3VudC4AWQFOT1RFOiBUaGlzIGZ1bmN0aW9uIG9ubHkgYXR0ZW1wdHMgdG8gdHJhbnNmZXIgX3RyYW5zZmVyYWJsZV8gYmFsYW5jZXMuIFRoaXMgbWVhbnMgdGhhdGEBYW55IGxvY2tlZCwgcmVzZXJ2ZWQsIG9yIGV4aXN0ZW50aWFsIGRlcG9zaXRzICh3aGVuIGBrZWVwX2FsaXZlYCBpcyBgdHJ1ZWApLCB3aWxsIG5vdCBiZV0BdHJhbnNmZXJyZWQgYnkgdGhpcyBmdW5jdGlvbi4gVG8gZW5zdXJlIHRoYXQgdGhpcyBmdW5jdGlvbiByZXN1bHRzIGluIGEga2lsbGVkIGFjY291bnQsRQF5b3UgbWlnaHQgbmVlZCB0byBwcmVwYXJlIHRoZSBhY2NvdW50IGJ5IHJlbW92aW5nIGFueSByZWZlcmVuY2UgY291bnRlcnMsIHN0b3JhZ2VAZGVwb3NpdHMsIGV0Yy4uLgDAVGhlIGRpc3BhdGNoIG9yaWdpbiBvZiB0aGlzIGNhbGwgbXVzdCBiZSBTaWduZWQuAKAtIGBkZXN0YDogVGhlIHJlY2lwaWVudCBvZiB0aGUgdHJhbnNmZXIuWQEtIGBrZWVwX2FsaXZlYDogQSBib29sZWFuIHRvIGRldGVybWluZSBpZiB0aGUgYHRyYW5zZmVyX2FsbGAgb3BlcmF0aW9uIHNob3VsZCBzZW5kIGFsbE0BICBvZiB0aGUgZnVuZHMgdGhlIGFjY291bnQgaGFzLCBjYXVzaW5nIHRoZSBzZW5kZXIgYWNjb3VudCB0byBiZSBraWxsZWQgKGZhbHNlKSwgb3JZASAgdHJhbnNmZXIgZXZlcnl0aGluZyBleGNlcHQgYXQgbGVhc3QgdGhlIGV4aXN0ZW50aWFsIGRlcG9zaXQsIHdoaWNoIHdpbGwgZ3VhcmFudGVlIHRvnCAga2VlcCB0aGUgc2VuZGVyIGFjY291bnQgYWxpdmUgKHRydWUpLjxmb3JjZV91bnJlc2VydmUIAQx3aG/tAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AARhhbW91bnQYAShUOjpCYWxhbmNlAAUMsFVucmVzZXJ2ZSBzb21lIGJhbGFuY2UgZnJvbSBhIHVzZXIgYnkgZm9yY2UuAGxDYW4gb25seSBiZSBjYWxsZWQgYnkgUk9PVC5AdXBncmFkZV9hY2NvdW50cwQBDHdobwECAURWZWM8VDo6QWNjb3VudElkPgAGIHBVcGdyYWRlIGEgc3BlY2lmaWVkIGFjY291bnQuAHQtIGBvcmlnaW5gOiBNdXN0IGJlIGBTaWduZWRgLpAtIGB3aG9gOiBUaGUgYWNjb3VudCB0byBiZSB1cGdyYWRlZC4AVQFUaGlzIHdpbGwgd2FpdmUgdGhlIHRyYW5zYWN0aW9uIGZlZSBpZiBhdCBsZWFzdCBhbGwgYnV0IDEwJSBvZiB0aGUgYWNjb3VudHMgbmVlZGVkIHRvQQFiZSB1cGdyYWRlZC4gKFdlIGxldCBzb21lIG5vdCBoYXZlIHRvIGJlIHVwZ3JhZGVkIGp1c3QgaW4gb3JkZXIgdG8gYWxsb3cgZm9yIHRoZVhwb3NzaWJpbGl0eSBvZiBjaHVybikuRGZvcmNlX3NldF9iYWxhbmNlCAEMd2hv7QEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEgbmV3X2ZyZWX9AQEoVDo6QmFsYW5jZQAIDKxTZXQgdGhlIHJlZ3VsYXIgYmFsYW5jZSBvZiBhIGdpdmVuIGFjY291bnQuALBUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgaXMgYHJvb3RgLmxmb3JjZV9hZGp1c3RfdG90YWxfaXNzdWFuY2UIASRkaXJlY3Rpb24FAgFMQWRqdXN0bWVudERpcmVjdGlvbgABFGRlbHRh/QEBKFQ6OkJhbGFuY2UACRS4QWRqdXN0IHRoZSB0b3RhbCBpc3N1YW5jZSBpbiBhIHNhdHVyYXRpbmcgd2F5LgD8Q2FuIG9ubHkgYmUgY2FsbGVkIGJ5IHJvb3QgYW5kIGFsd2F5cyBuZWVkcyBhIHBvc2l0aXZlIGBkZWx0YWAuACQjIEV4YW1wbGUQYnVybggBFHZhbHVl/QEBKFQ6OkJhbGFuY2UAAShrZWVwX2FsaXZlIAEQYm9vbAAKHPxCdXJuIHRoZSBzcGVjaWZpZWQgbGlxdWlkIGZyZWUgYmFsYW5jZSBmcm9tIHRoZSBvcmlnaW4gYWNjb3VudC4AJQFJZiB0aGUgb3JpZ2luJ3MgYWNjb3VudCBlbmRzIHVwIGJlbG93IHRoZSBleGlzdGVudGlhbCBkZXBvc2l0IGFzIGEgcmVzdWx0CQFvZiB0aGUgYnVybiBhbmQgYGtlZXBfYWxpdmVgIGlzIGZhbHNlLCB0aGUgYWNjb3VudCB3aWxsIGJlIHJlYXBlZC4AUQFVbmxpa2Ugc2VuZGluZyBmdW5kcyB0byBhIF9idXJuXyBhZGRyZXNzLCB3aGljaCBtZXJlbHkgbWFrZXMgdGhlIGZ1bmRzIGluYWNjZXNzaWJsZSwhAXRoaXMgYGJ1cm5gIG9wZXJhdGlvbiB3aWxsIHJlZHVjZSB0b3RhbCBpc3N1YW5jZSBieSB0aGUgYW1vdW50IF9idXJuZWRfLgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy79AQAABhgAAQIAAAIAAAUCDDxwYWxsZXRfYmFsYW5jZXMUdHlwZXNMQWRqdXN0bWVudERpcmVjdGlvbgABCCBJbmNyZWFzZQAAACBEZWNyZWFzZQABAAAJAhA4cGFsbGV0X3N0YWtpbmcYcGFsbGV0GHBhbGxldBBDYWxsBARUAAGAEGJvbmQIARR2YWx1Zf0BATBCYWxhbmNlT2Y8VD4AARRwYXllZZQBfFJld2FyZERlc3RpbmF0aW9uPFQ6OkFjY291bnRJZD4AAEBhAVRha2UgdGhlIG9yaWdpbiBhY2NvdW50IGFzIGEgc3Rhc2ggYW5kIGxvY2sgdXAgYHZhbHVlYCBvZiBpdHMgYmFsYW5jZS4gYGNvbnRyb2xsZXJgIHdpbGyAYmUgdGhlIGFjY291bnQgdGhhdCBjb250cm9scyBpdC4ALQFgdmFsdWVgIG11c3QgYmUgbW9yZSB0aGFuIHRoZSBgbWluaW11bV9iYWxhbmNlYCBzcGVjaWZpZWQgYnkgYFQ6OkN1cnJlbmN5YC4AIQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXyBieSB0aGUgc3Rhc2ggYWNjb3VudC4APEVtaXRzIGBCb25kZWRgLjQjIyBDb21wbGV4aXR50C0gSW5kZXBlbmRlbnQgb2YgdGhlIGFyZ3VtZW50cy4gTW9kZXJhdGUgY29tcGxleGl0eS4cLSBPKDEpLmQtIFRocmVlIGV4dHJhIERCIGVudHJpZXMuAE0BTk9URTogVHdvIG9mIHRoZSBzdG9yYWdlIHdyaXRlcyAoYFNlbGY6OmJvbmRlZGAsIGBTZWxmOjpwYXllZWApIGFyZSBfbmV2ZXJfIGNsZWFuZWRZAXVubGVzcyB0aGUgYG9yaWdpbmAgZmFsbHMgYmVsb3cgX2V4aXN0ZW50aWFsIGRlcG9zaXRfIChvciBlcXVhbCB0byAwKSBhbmQgZ2V0cyByZW1vdmVkIGFzIGR1c3QuKGJvbmRfZXh0cmEEAThtYXhfYWRkaXRpb25hbP0BATBCYWxhbmNlT2Y8VD4AAThhAUFkZCBzb21lIGV4dHJhIGFtb3VudCB0aGF0IGhhdmUgYXBwZWFyZWQgaW4gdGhlIHN0YXNoIGBmcmVlX2JhbGFuY2VgIGludG8gdGhlIGJhbGFuY2UgdXAwZm9yIHN0YWtpbmcuAFEBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8gYnkgdGhlIHN0YXNoLCBub3QgdGhlIGNvbnRyb2xsZXIuAE0BVXNlIHRoaXMgaWYgdGhlcmUgYXJlIGFkZGl0aW9uYWwgZnVuZHMgaW4geW91ciBzdGFzaCBhY2NvdW50IHRoYXQgeW91IHdpc2ggdG8gYm9uZC5VAVVubGlrZSBbYGJvbmRgXShTZWxmOjpib25kKSBvciBbYHVuYm9uZGBdKFNlbGY6OnVuYm9uZCkgdGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBpbXBvc2W8YW55IGxpbWl0YXRpb24gb24gdGhlIGFtb3VudCB0aGF0IGNhbiBiZSBhZGRlZC4APEVtaXRzIGBCb25kZWRgLgA0IyMgQ29tcGxleGl0eeQtIEluZGVwZW5kZW50IG9mIHRoZSBhcmd1bWVudHMuIEluc2lnbmlmaWNhbnQgY29tcGxleGl0eS4cLSBPKDEpLhh1bmJvbmQEARR2YWx1Zf0BATBCYWxhbmNlT2Y8VD4AAlRRAVNjaGVkdWxlIGEgcG9ydGlvbiBvZiB0aGUgc3Rhc2ggdG8gYmUgdW5sb2NrZWQgcmVhZHkgZm9yIHRyYW5zZmVyIG91dCBhZnRlciB0aGUgYm9uZPxwZXJpb2QgZW5kcy4gSWYgdGhpcyBsZWF2ZXMgYW4gYW1vdW50IGFjdGl2ZWx5IGJvbmRlZCBsZXNzIHRoYW4hAVtgYXNzZXQ6OmV4aXN0ZW50aWFsX2RlcG9zaXRgXSwgdGhlbiBpdCBpcyBpbmNyZWFzZWQgdG8gdGhlIGZ1bGwgYW1vdW50LgA9AVRoZSBzdGFzaCBtYXkgYmUgY2hpbGxlZCBpZiB0aGUgbGVkZ2VyIHRvdGFsIGFtb3VudCBmYWxscyB0byAwIGFmdGVyIHVuYm9uZGluZy4AUQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXyBieSB0aGUgY29udHJvbGxlciwgbm90IHRoZSBzdGFzaC4ARQFPbmNlIHRoZSB1bmxvY2sgcGVyaW9kIGlzIGRvbmUsIHlvdSBjYW4gY2FsbCBgd2l0aGRyYXdfdW5ib25kZWRgIHRvIGFjdHVhbGx5IG1vdmW8dGhlIGZ1bmRzIG91dCBvZiBtYW5hZ2VtZW50IHJlYWR5IGZvciB0cmFuc2Zlci4AMQFObyBtb3JlIHRoYW4gYSBsaW1pdGVkIG51bWJlciBvZiB1bmxvY2tpbmcgY2h1bmtzIChzZWUgYE1heFVubG9ja2luZ0NodW5rc2ApQQFjYW4gY28tZXhpc3RzIGF0IHRoZSBzYW1lIHRpbWUuIElmIHRoZXJlIGFyZSBubyB1bmxvY2tpbmcgY2h1bmtzIHNsb3RzIGF2YWlsYWJsZUUBW2BDYWxsOjp3aXRoZHJhd191bmJvbmRlZGBdIGlzIGNhbGxlZCB0byByZW1vdmUgc29tZSBvZiB0aGUgY2h1bmtzIChpZiBwb3NzaWJsZSkuADkBSWYgYSB1c2VyIGVuY291bnRlcnMgdGhlIGBJbnN1ZmZpY2llbnRCb25kYCBlcnJvciB3aGVuIGNhbGxpbmcgdGhpcyBleHRyaW5zaWMsGQF0aGV5IHNob3VsZCBjYWxsIGBjaGlsbGAgZmlyc3QgaW4gb3JkZXIgdG8gZnJlZSB1cCB0aGVpciBib25kZWQgZnVuZHMuAERFbWl0cyBgVW5ib25kZWRgLgCUU2VlIGFsc28gW2BDYWxsOjp3aXRoZHJhd191bmJvbmRlZGBdLkR3aXRoZHJhd191bmJvbmRlZAQBSG51bV9zbGFzaGluZ19zcGFucxABDHUzMgADXCkBUmVtb3ZlIGFueSB1bmxvY2tlZCBjaHVua3MgZnJvbSB0aGUgYHVubG9ja2luZ2AgcXVldWUgZnJvbSBvdXIgbWFuYWdlbWVudC4AVQFUaGlzIGVzc2VudGlhbGx5IGZyZWVzIHVwIHRoYXQgYmFsYW5jZSB0byBiZSB1c2VkIGJ5IHRoZSBzdGFzaCBhY2NvdW50IHRvIGRvIHdoYXRldmVyJGl0IHdhbnRzLgAVAVRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfIGJ5IHRoZSBjb250cm9sbGVyLgBIRW1pdHMgYFdpdGhkcmF3bmAuAGhTZWUgYWxzbyBbYENhbGw6OnVuYm9uZGBdLgA0IyMgUGFyYW1ldGVycwBRAS0gYG51bV9zbGFzaGluZ19zcGFuc2AgaW5kaWNhdGVzIHRoZSBudW1iZXIgb2YgbWV0YWRhdGEgc2xhc2hpbmcgc3BhbnMgdG8gY2xlYXIgd2hlblUBdGhpcyBjYWxsIHJlc3VsdHMgaW4gYSBjb21wbGV0ZSByZW1vdmFsIG9mIGFsbCB0aGUgZGF0YSByZWxhdGVkIHRvIHRoZSBzdGFzaCBhY2NvdW50Lj0BSW4gdGhpcyBjYXNlLCB0aGUgYG51bV9zbGFzaGluZ19zcGFuc2AgbXVzdCBiZSBsYXJnZXIgb3IgZXF1YWwgdG8gdGhlIG51bWJlciBvZl0Bc2xhc2hpbmcgc3BhbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzdGFzaCBhY2NvdW50IGluIHRoZSBbYFNsYXNoaW5nU3BhbnNgXSBzdG9yYWdlIHR5cGUsJQFvdGhlcndpc2UgdGhlIGNhbGwgd2lsbCBmYWlsLiBUaGUgY2FsbCB3ZWlnaHQgaXMgZGlyZWN0bHkgcHJvcG9ydGlvbmFsIHRvVGBudW1fc2xhc2hpbmdfc3BhbnNgLgA0IyMgQ29tcGxleGl0edhPKFMpIHdoZXJlIFMgaXMgdGhlIG51bWJlciBvZiBzbGFzaGluZyBzcGFucyB0byByZW1vdmUJAU5PVEU6IFdlaWdodCBhbm5vdGF0aW9uIGlzIHRoZSBraWxsIHNjZW5hcmlvLCB3ZSByZWZ1bmQgb3RoZXJ3aXNlLiB2YWxpZGF0ZQQBFHByZWZzoAE4VmFsaWRhdG9yUHJlZnMABBTkRGVjbGFyZSB0aGUgZGVzaXJlIHRvIHZhbGlkYXRlIGZvciB0aGUgb3JpZ2luIGNvbnRyb2xsZXIuANhFZmZlY3RzIHdpbGwgYmUgZmVsdCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBuZXh0IGVyYS4AUQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXyBieSB0aGUgY29udHJvbGxlciwgbm90IHRoZSBzdGFzaC4gbm9taW5hdGUEARx0YXJnZXRzDQIBZFZlYzxBY2NvdW50SWRMb29rdXBPZjxUPj4ABSgNAURlY2xhcmUgdGhlIGRlc2lyZSB0byBub21pbmF0ZSBgdGFyZ2V0c2AgZm9yIHRoZSBvcmlnaW4gY29udHJvbGxlci4A2EVmZmVjdHMgd2lsbCBiZSBmZWx0IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIG5leHQgZXJhLgBRAVRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfIGJ5IHRoZSBjb250cm9sbGVyLCBub3QgdGhlIHN0YXNoLgA0IyMgQ29tcGxleGl0eS0BLSBUaGUgdHJhbnNhY3Rpb24ncyBjb21wbGV4aXR5IGlzIHByb3BvcnRpb25hbCB0byB0aGUgc2l6ZSBvZiBgdGFyZ2V0c2AgKE4pBQF3aGljaCBpcyBjYXBwZWQgYXQgQ29tcGFjdEFzc2lnbm1lbnRzOjpMSU1JVCAoVDo6TWF4Tm9taW5hdGlvbnMpLtQtIEJvdGggdGhlIHJlYWRzIGFuZCB3cml0ZXMgZm9sbG93IGEgc2ltaWxhciBwYXR0ZXJuLhRjaGlsbAAGKMREZWNsYXJlIG5vIGRlc2lyZSB0byBlaXRoZXIgdmFsaWRhdGUgb3Igbm9taW5hdGUuANhFZmZlY3RzIHdpbGwgYmUgZmVsdCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBuZXh0IGVyYS4AUQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXyBieSB0aGUgY29udHJvbGxlciwgbm90IHRoZSBzdGFzaC4ANCMjIENvbXBsZXhpdHnkLSBJbmRlcGVuZGVudCBvZiB0aGUgYXJndW1lbnRzLiBJbnNpZ25pZmljYW50IGNvbXBsZXhpdHkuUC0gQ29udGFpbnMgb25lIHJlYWQuxC0gV3JpdGVzIGFyZSBsaW1pdGVkIHRvIHRoZSBgb3JpZ2luYCBhY2NvdW50IGtleS4kc2V0X3BheWVlBAEUcGF5ZWWUAXxSZXdhcmREZXN0aW5hdGlvbjxUOjpBY2NvdW50SWQ+AAcwtChSZS0pc2V0IHRoZSBwYXltZW50IHRhcmdldCBmb3IgYSBjb250cm9sbGVyLgBRAUVmZmVjdHMgd2lsbCBiZSBmZWx0IGluc3RhbnRseSAoYXMgc29vbiBhcyB0aGlzIGZ1bmN0aW9uIGlzIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkpLgBRAVRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfIGJ5IHRoZSBjb250cm9sbGVyLCBub3QgdGhlIHN0YXNoLgA0IyMgQ29tcGxleGl0eRgtIE8oMSnkLSBJbmRlcGVuZGVudCBvZiB0aGUgYXJndW1lbnRzLiBJbnNpZ25pZmljYW50IGNvbXBsZXhpdHkulC0gQ29udGFpbnMgYSBsaW1pdGVkIG51bWJlciBvZiByZWFkcy7ELSBXcml0ZXMgYXJlIGxpbWl0ZWQgdG8gdGhlIGBvcmlnaW5gIGFjY291bnQga2V5LiQtLS0tLS0tLS04c2V0X2NvbnRyb2xsZXIACDhFAShSZS0pc2V0cyB0aGUgY29udHJvbGxlciBvZiBhIHN0YXNoIHRvIHRoZSBzdGFzaCBpdHNlbGYuIFRoaXMgZnVuY3Rpb24gcHJldmlvdXNseU0BYWNjZXB0ZWQgYSBgY29udHJvbGxlcmAgYXJndW1lbnQgdG8gc2V0IHRoZSBjb250cm9sbGVyIHRvIGFuIGFjY291bnQgb3RoZXIgdGhhbiB0aGVZAXN0YXNoIGl0c2VsZi4gVGhpcyBmdW5jdGlvbmFsaXR5IGhhcyBub3cgYmVlbiByZW1vdmVkLCBub3cgb25seSBzZXR0aW5nIHRoZSBjb250cm9sbGVyjHRvIHRoZSBzdGFzaCwgaWYgaXQgaXMgbm90IGFscmVhZHkuAFEBRWZmZWN0cyB3aWxsIGJlIGZlbHQgaW5zdGFudGx5IChhcyBzb29uIGFzIHRoaXMgZnVuY3Rpb24gaXMgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSkuAFEBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8gYnkgdGhlIHN0YXNoLCBub3QgdGhlIGNvbnRyb2xsZXIuADQjIyBDb21wbGV4aXR5EE8oMSnkLSBJbmRlcGVuZGVudCBvZiB0aGUgYXJndW1lbnRzLiBJbnNpZ25pZmljYW50IGNvbXBsZXhpdHkulC0gQ29udGFpbnMgYSBsaW1pdGVkIG51bWJlciBvZiByZWFkcy7ELSBXcml0ZXMgYXJlIGxpbWl0ZWQgdG8gdGhlIGBvcmlnaW5gIGFjY291bnQga2V5LkxzZXRfdmFsaWRhdG9yX2NvdW50BAEMbmV3yQEBDHUzMgAJGJBTZXRzIHRoZSBpZGVhbCBudW1iZXIgb2YgdmFsaWRhdG9ycy4AhFRoZSBkaXNwYXRjaCBvcmlnaW4gbXVzdCBiZSBSb290LgA0IyMgQ29tcGxleGl0eRBPKDEpYGluY3JlYXNlX3ZhbGlkYXRvcl9jb3VudAQBKGFkZGl0aW9uYWzJAQEMdTMyAAoc6EluY3JlbWVudHMgdGhlIGlkZWFsIG51bWJlciBvZiB2YWxpZGF0b3JzIHVwIHRvIG1heGltdW0gb2aMYEVsZWN0aW9uUHJvdmlkZXJCYXNlOjpNYXhXaW5uZXJzYC4AhFRoZSBkaXNwYXRjaCBvcmlnaW4gbXVzdCBiZSBSb290LgA0IyMgQ29tcGxleGl0eZhTYW1lIGFzIFtgU2VsZjo6c2V0X3ZhbGlkYXRvcl9jb3VudGBdLlRzY2FsZV92YWxpZGF0b3JfY291bnQEARhmYWN0b3IRAgEcUGVyY2VudAALHBEBU2NhbGUgdXAgdGhlIGlkZWFsIG51bWJlciBvZiB2YWxpZGF0b3JzIGJ5IGEgZmFjdG9yIHVwIHRvIG1heGltdW0gb2aMYEVsZWN0aW9uUHJvdmlkZXJCYXNlOjpNYXhXaW5uZXJzYC4AhFRoZSBkaXNwYXRjaCBvcmlnaW4gbXVzdCBiZSBSb290LgA0IyMgQ29tcGxleGl0eZhTYW1lIGFzIFtgU2VsZjo6c2V0X3ZhbGlkYXRvcl9jb3VudGBdLjRmb3JjZV9ub19lcmFzAAw0rEZvcmNlIHRoZXJlIHRvIGJlIG5vIG5ldyBlcmFzIGluZGVmaW5pdGVseS4AhFRoZSBkaXNwYXRjaCBvcmlnaW4gbXVzdCBiZSBSb290LgAkIyBXYXJuaW5nABkBVGhlIGVsZWN0aW9uIHByb2Nlc3Mgc3RhcnRzIG11bHRpcGxlIGJsb2NrcyBiZWZvcmUgdGhlIGVuZCBvZiB0aGUgZXJhLjkBVGh1cyB0aGUgZWxlY3Rpb24gcHJvY2VzcyBtYXkgYmUgb25nb2luZyB3aGVuIHRoaXMgaXMgY2FsbGVkLiBJbiB0aGlzIGNhc2UgdGhl3GVsZWN0aW9uIHdpbGwgY29udGludWUgdW50aWwgdGhlIG5leHQgZXJhIGlzIHRyaWdnZXJlZC4ANCMjIENvbXBsZXhpdHk8LSBObyBhcmd1bWVudHMuOC0gV2VpZ2h0OiBPKDEpNGZvcmNlX25ld19lcmEADThJAUZvcmNlIHRoZXJlIHRvIGJlIGEgbmV3IGVyYSBhdCB0aGUgZW5kIG9mIHRoZSBuZXh0IHNlc3Npb24uIEFmdGVyIHRoaXMsIGl0IHdpbGwgYmWccmVzZXQgdG8gbm9ybWFsIChub24tZm9yY2VkKSBiZWhhdmlvdXIuAIRUaGUgZGlzcGF0Y2ggb3JpZ2luIG11c3QgYmUgUm9vdC4AJCMgV2FybmluZwAZAVRoZSBlbGVjdGlvbiBwcm9jZXNzIHN0YXJ0cyBtdWx0aXBsZSBibG9ja3MgYmVmb3JlIHRoZSBlbmQgb2YgdGhlIGVyYS5JAUlmIHRoaXMgaXMgY2FsbGVkIGp1c3QgYmVmb3JlIGEgbmV3IGVyYSBpcyB0cmlnZ2VyZWQsIHRoZSBlbGVjdGlvbiBwcm9jZXNzIG1heSBub3SMaGF2ZSBlbm91Z2ggYmxvY2tzIHRvIGdldCBhIHJlc3VsdC4ANCMjIENvbXBsZXhpdHk8LSBObyBhcmd1bWVudHMuOC0gV2VpZ2h0OiBPKDEpRHNldF9pbnZ1bG5lcmFibGVzBAE0aW52dWxuZXJhYmxlcwECAURWZWM8VDo6QWNjb3VudElkPgAODMhTZXQgdGhlIHZhbGlkYXRvcnMgd2hvIGNhbm5vdCBiZSBzbGFzaGVkIChpZiBhbnkpLgCEVGhlIGRpc3BhdGNoIG9yaWdpbiBtdXN0IGJlIFJvb3QuNGZvcmNlX3Vuc3Rha2UIARRzdGFzaAABMFQ6OkFjY291bnRJZAABSG51bV9zbGFzaGluZ19zcGFucxABDHUzMgAPIAkBRm9yY2UgYSBjdXJyZW50IHN0YWtlciB0byBiZWNvbWUgY29tcGxldGVseSB1bnN0YWtlZCwgaW1tZWRpYXRlbHkuAIRUaGUgZGlzcGF0Y2ggb3JpZ2luIG11c3QgYmUgUm9vdC4ANCMjIFBhcmFtZXRlcnMARQEtIGBudW1fc2xhc2hpbmdfc3BhbnNgOiBSZWZlciB0byBjb21tZW50cyBvbiBbYENhbGw6OndpdGhkcmF3X3VuYm9uZGVkYF0gZm9yIG1vcmUgZGV0YWlscy5QZm9yY2VfbmV3X2VyYV9hbHdheXMAECQBAUZvcmNlIHRoZXJlIHRvIGJlIGEgbmV3IGVyYSBhdCB0aGUgZW5kIG9mIHNlc3Npb25zIGluZGVmaW5pdGVseS4AhFRoZSBkaXNwYXRjaCBvcmlnaW4gbXVzdCBiZSBSb290LgAkIyBXYXJuaW5nABkBVGhlIGVsZWN0aW9uIHByb2Nlc3Mgc3RhcnRzIG11bHRpcGxlIGJsb2NrcyBiZWZvcmUgdGhlIGVuZCBvZiB0aGUgZXJhLkkBSWYgdGhpcyBpcyBjYWxsZWQganVzdCBiZWZvcmUgYSBuZXcgZXJhIGlzIHRyaWdnZXJlZCwgdGhlIGVsZWN0aW9uIHByb2Nlc3MgbWF5IG5vdIxoYXZlIGVub3VnaCBibG9ja3MgdG8gZ2V0IGEgcmVzdWx0LlRjYW5jZWxfZGVmZXJyZWRfc2xhc2gIAQxlcmEQASBFcmFJbmRleAABNHNsYXNoX2luZGljZXORAQEgVmVjPHUzMj4AERiUQ2FuY2VsIGVuYWN0bWVudCBvZiBhIGRlZmVycmVkIHNsYXNoLgCYQ2FuIGJlIGNhbGxlZCBieSB0aGUgYFQ6OkFkbWluT3JpZ2luYC4AAQFQYXJhbWV0ZXJzOiBlcmEgYW5kIGluZGljZXMgb2YgdGhlIHNsYXNoZXMgZm9yIHRoYXQgZXJhIHRvIGtpbGwu5FRoZXkgKiptdXN0KiogYmUgc29ydGVkIGluIGFzY2VuZGluZyBvcmRlciwgKmFuZCogdW5pcXVlLjhwYXlvdXRfc3Rha2VycwgBPHZhbGlkYXRvcl9zdGFzaAABMFQ6OkFjY291bnRJZAABDGVyYRABIEVyYUluZGV4ABI0GQFQYXkgb3V0IG5leHQgcGFnZSBvZiB0aGUgc3Rha2VycyBiZWhpbmQgYSB2YWxpZGF0b3IgZm9yIHRoZSBnaXZlbiBlcmEuAOgtIGB2YWxpZGF0b3Jfc3Rhc2hgIGlzIHRoZSBzdGFzaCBhY2NvdW50IG9mIHRoZSB2YWxpZGF0b3IuMQEtIGBlcmFgIG1heSBiZSBhbnkgZXJhIGJldHdlZW4gYFtjdXJyZW50X2VyYSAtIGhpc3RvcnlfZGVwdGg7IGN1cnJlbnRfZXJhXWAuAFUBVGhlIG9yaWdpbiBvZiB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXy4gQW55IGFjY291bnQgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbiwgZXZlbiBpZnRpdCBpcyBub3Qgb25lIG9mIHRoZSBzdGFrZXJzLgBJAVRoZSByZXdhcmQgcGF5b3V0IGNvdWxkIGJlIHBhZ2VkIGluIGNhc2UgdGhlcmUgYXJlIHRvbyBtYW55IG5vbWluYXRvcnMgYmFja2luZyB0aGVdAWB2YWxpZGF0b3Jfc3Rhc2hgLiBUaGlzIGNhbGwgd2lsbCBwYXlvdXQgdW5wYWlkIHBhZ2VzIGluIGFuIGFzY2VuZGluZyBvcmRlci4gVG8gY2xhaW0gYbRzcGVjaWZpYyBwYWdlLCB1c2UgYHBheW91dF9zdGFrZXJzX2J5X3BhZ2VgLmAA8ElmIGFsbCBwYWdlcyBhcmUgY2xhaW1lZCwgaXQgcmV0dXJucyBhbiBlcnJvciBgSW52YWxpZFBhZ2VgLhhyZWJvbmQEARR2YWx1Zf0BATBCYWxhbmNlT2Y8VD4AExzcUmVib25kIGEgcG9ydGlvbiBvZiB0aGUgc3Rhc2ggc2NoZWR1bGVkIHRvIGJlIHVubG9ja2VkLgDUVGhlIGRpc3BhdGNoIG9yaWdpbiBtdXN0IGJlIHNpZ25lZCBieSB0aGUgY29udHJvbGxlci4ANCMjIENvbXBsZXhpdHnQLSBUaW1lIGNvbXBsZXhpdHk6IE8oTCksIHdoZXJlIEwgaXMgdW5sb2NraW5nIGNodW5rc4gtIEJvdW5kZWQgYnkgYE1heFVubG9ja2luZ0NodW5rc2AuKHJlYXBfc3Rhc2gIARRzdGFzaAABMFQ6OkFjY291bnRJZAABSG51bV9zbGFzaGluZ19zcGFucxABDHUzMgAUSF0BUmVtb3ZlIGFsbCBkYXRhIHN0cnVjdHVyZXMgY29uY2VybmluZyBhIHN0YWtlci9zdGFzaCBvbmNlIGl0IGlzIGF0IGEgc3RhdGUgd2hlcmUgaXQgY2FuBQFiZSBjb25zaWRlcmVkIGBkdXN0YCBpbiB0aGUgc3Rha2luZyBzeXN0ZW0uIFRoZSByZXF1aXJlbWVudHMgYXJlOgAFATEuIHRoZSBgdG90YWxfYmFsYW5jZWAgb2YgdGhlIHN0YXNoIGlzIGJlbG93IGV4aXN0ZW50aWFsIGRlcG9zaXQuEQEyLiBvciwgdGhlIGBsZWRnZXIudG90YWxgIG9mIHRoZSBzdGFzaCBpcyBiZWxvdyBleGlzdGVudGlhbCBkZXBvc2l0LmEBMy4gb3IsIGV4aXN0ZW50aWFsIGRlcG9zaXQgaXMgemVybyBhbmQgZWl0aGVyIGB0b3RhbF9iYWxhbmNlYCBvciBgbGVkZ2VyLnRvdGFsYCBpcyB6ZXJvLgBVAVRoZSBmb3JtZXIgY2FuIGhhcHBlbiBpbiBjYXNlcyBsaWtlIGEgc2xhc2g7IHRoZSBsYXR0ZXIgd2hlbiBhIGZ1bGx5IHVuYm9uZGVkIGFjY291bnQJAWlzIHN0aWxsIHJlY2VpdmluZyBzdGFraW5nIHJld2FyZHMgaW4gYFJld2FyZERlc3RpbmF0aW9uOjpTdGFrZWRgLgAxAUl0IGNhbiBiZSBjYWxsZWQgYnkgYW55b25lLCBhcyBsb25nIGFzIGBzdGFzaGAgbWVldHMgdGhlIGFib3ZlIHJlcXVpcmVtZW50cy4A3FJlZnVuZHMgdGhlIHRyYW5zYWN0aW9uIGZlZXMgdXBvbiBzdWNjZXNzZnVsIGV4ZWN1dGlvbi4ANCMjIFBhcmFtZXRlcnMARQEtIGBudW1fc2xhc2hpbmdfc3BhbnNgOiBSZWZlciB0byBjb21tZW50cyBvbiBbYENhbGw6OndpdGhkcmF3X3VuYm9uZGVkYF0gZm9yIG1vcmUgZGV0YWlscy4Qa2ljawQBDHdobw0CAWRWZWM8QWNjb3VudElkTG9va3VwT2Y8VD4+ABUs4FJlbW92ZSB0aGUgZ2l2ZW4gbm9taW5hdGlvbnMgZnJvbSB0aGUgY2FsbGluZyB2YWxpZGF0b3IuANhFZmZlY3RzIHdpbGwgYmUgZmVsdCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBuZXh0IGVyYS4AUQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXyBieSB0aGUgY29udHJvbGxlciwgbm90IHRoZSBzdGFzaC4ATQEtIGB3aG9gOiBBIGxpc3Qgb2Ygbm9taW5hdG9yIHN0YXNoIGFjY291bnRzIHdobyBhcmUgbm9taW5hdGluZyB0aGlzIHZhbGlkYXRvciB3aGljaMAgIHNob3VsZCBubyBsb25nZXIgYmUgbm9taW5hdGluZyB0aGlzIHZhbGlkYXRvci4AVQFOb3RlOiBNYWtpbmcgdGhpcyBjYWxsIG9ubHkgbWFrZXMgc2Vuc2UgaWYgeW91IGZpcnN0IHNldCB0aGUgdmFsaWRhdG9yIHByZWZlcmVuY2VzIHRveGJsb2NrIGFueSBmdXJ0aGVyIG5vbWluYXRpb25zLkxzZXRfc3Rha2luZ19jb25maWdzHAFIbWluX25vbWluYXRvcl9ib25kFQIBWENvbmZpZ09wPEJhbGFuY2VPZjxUPj4AAUhtaW5fdmFsaWRhdG9yX2JvbmQVAgFYQ29uZmlnT3A8QmFsYW5jZU9mPFQ+PgABTG1heF9ub21pbmF0b3JfY291bnQZAgE0Q29uZmlnT3A8dTMyPgABTG1heF92YWxpZGF0b3JfY291bnQZAgE0Q29uZmlnT3A8dTMyPgABPGNoaWxsX3RocmVzaG9sZB0CAURDb25maWdPcDxQZXJjZW50PgABOG1pbl9jb21taXNzaW9uIQIBRENvbmZpZ09wPFBlcmJpbGw+AAFIbWF4X3N0YWtlZF9yZXdhcmRzHQIBRENvbmZpZ09wPFBlcmNlbnQ+ABZErFVwZGF0ZSB0aGUgdmFyaW91cyBzdGFraW5nIGNvbmZpZ3VyYXRpb25zIC4AJQEqIGBtaW5fbm9taW5hdG9yX2JvbmRgOiBUaGUgbWluaW11bSBhY3RpdmUgYm9uZCBuZWVkZWQgdG8gYmUgYSBub21pbmF0b3IuJQEqIGBtaW5fdmFsaWRhdG9yX2JvbmRgOiBUaGUgbWluaW11bSBhY3RpdmUgYm9uZCBuZWVkZWQgdG8gYmUgYSB2YWxpZGF0b3IuVQEqIGBtYXhfbm9taW5hdG9yX2NvdW50YDogVGhlIG1heCBudW1iZXIgb2YgdXNlcnMgd2hvIGNhbiBiZSBhIG5vbWluYXRvciBhdCBvbmNlLiBXaGVumCAgc2V0IHRvIGBOb25lYCwgbm8gbGltaXQgaXMgZW5mb3JjZWQuVQEqIGBtYXhfdmFsaWRhdG9yX2NvdW50YDogVGhlIG1heCBudW1iZXIgb2YgdXNlcnMgd2hvIGNhbiBiZSBhIHZhbGlkYXRvciBhdCBvbmNlLiBXaGVumCAgc2V0IHRvIGBOb25lYCwgbm8gbGltaXQgaXMgZW5mb3JjZWQuWQEqIGBjaGlsbF90aHJlc2hvbGRgOiBUaGUgcmF0aW8gb2YgYG1heF9ub21pbmF0b3JfY291bnRgIG9yIGBtYXhfdmFsaWRhdG9yX2NvdW50YCB3aGljaBkBICBzaG91bGQgYmUgZmlsbGVkIGluIG9yZGVyIGZvciB0aGUgYGNoaWxsX290aGVyYCB0cmFuc2FjdGlvbiB0byB3b3JrLmEBKiBgbWluX2NvbW1pc3Npb25gOiBUaGUgbWluaW11bSBhbW91bnQgb2YgY29tbWlzc2lvbiB0aGF0IGVhY2ggdmFsaWRhdG9ycyBtdXN0IG1haW50YWluLlUBICBUaGlzIGlzIGNoZWNrZWQgb25seSB1cG9uIGNhbGxpbmcgYHZhbGlkYXRlYC4gRXhpc3RpbmcgdmFsaWRhdG9ycyBhcmUgbm90IGFmZmVjdGVkLgDEUnVudGltZU9yaWdpbiBtdXN0IGJlIFJvb3QgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uLgA1AU5PVEU6IEV4aXN0aW5nIG5vbWluYXRvcnMgYW5kIHZhbGlkYXRvcnMgd2lsbCBub3QgYmUgYWZmZWN0ZWQgYnkgdGhpcyB1cGRhdGUuEQF0byBraWNrIHBlb3BsZSB1bmRlciB0aGUgbmV3IGxpbWl0cywgYGNoaWxsX290aGVyYCBzaG91bGQgYmUgY2FsbGVkLixjaGlsbF9vdGhlcgQBFHN0YXNoAAEwVDo6QWNjb3VudElkABdoQQFEZWNsYXJlIGEgYGNvbnRyb2xsZXJgIHRvIHN0b3AgcGFydGljaXBhdGluZyBhcyBlaXRoZXIgYSB2YWxpZGF0b3Igb3Igbm9taW5hdG9yLgDYRWZmZWN0cyB3aWxsIGJlIGZlbHQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbmV4dCBlcmEuAEEBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8sIGJ1dCBjYW4gYmUgY2FsbGVkIGJ5IGFueW9uZS4AWQFJZiB0aGUgY2FsbGVyIGlzIHRoZSBzYW1lIGFzIHRoZSBjb250cm9sbGVyIGJlaW5nIHRhcmdldGVkLCB0aGVuIG5vIGZ1cnRoZXIgY2hlY2tzIGFyZdhlbmZvcmNlZCwgYW5kIHRoaXMgZnVuY3Rpb24gYmVoYXZlcyBqdXN0IGxpa2UgYGNoaWxsYC4AXQFJZiB0aGUgY2FsbGVyIGlzIGRpZmZlcmVudCB0aGFuIHRoZSBjb250cm9sbGVyIGJlaW5nIHRhcmdldGVkLCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMwbXVzdCBiZSBtZXQ6AB0BKiBgY29udHJvbGxlcmAgbXVzdCBiZWxvbmcgdG8gYSBub21pbmF0b3Igd2hvIGhhcyBiZWNvbWUgbm9uLWRlY29kYWJsZSwADE9yOgA9ASogQSBgQ2hpbGxUaHJlc2hvbGRgIG11c3QgYmUgc2V0IGFuZCBjaGVja2VkIHdoaWNoIGRlZmluZXMgaG93IGNsb3NlIHRvIHRoZSBtYXhVASAgbm9taW5hdG9ycyBvciB2YWxpZGF0b3JzIHdlIG11c3QgcmVhY2ggYmVmb3JlIHVzZXJzIGNhbiBzdGFydCBjaGlsbGluZyBvbmUtYW5vdGhlci5ZASogQSBgTWF4Tm9taW5hdG9yQ291bnRgIGFuZCBgTWF4VmFsaWRhdG9yQ291bnRgIG11c3QgYmUgc2V0IHdoaWNoIGlzIHVzZWQgdG8gZGV0ZXJtaW5lkCAgaG93IGNsb3NlIHdlIGFyZSB0byB0aGUgdGhyZXNob2xkLl0BKiBBIGBNaW5Ob21pbmF0b3JCb25kYCBhbmQgYE1pblZhbGlkYXRvckJvbmRgIG11c3QgYmUgc2V0IGFuZCBjaGVja2VkLCB3aGljaCBkZXRlcm1pbmVzUQEgIGlmIHRoaXMgaXMgYSBwZXJzb24gdGhhdCBzaG91bGQgYmUgY2hpbGxlZCBiZWNhdXNlIHRoZXkgaGF2ZSBub3QgbWV0IHRoZSB0aHJlc2hvbGRAICBib25kIHJlcXVpcmVkLgBVAVRoaXMgY2FuIGJlIGhlbHBmdWwgaWYgYm9uZCByZXF1aXJlbWVudHMgYXJlIHVwZGF0ZWQsIGFuZCB3ZSBuZWVkIHRvIHJlbW92ZSBvbGQgdXNlcnOYd2hvIGRvIG5vdCBzYXRpc2Z5IHRoZXNlIHJlcXVpcmVtZW50cy5oZm9yY2VfYXBwbHlfbWluX2NvbW1pc3Npb24EATx2YWxpZGF0b3Jfc3Rhc2gAATBUOjpBY2NvdW50SWQAGAxFAUZvcmNlIGEgdmFsaWRhdG9yIHRvIGhhdmUgYXQgbGVhc3QgdGhlIG1pbmltdW0gY29tbWlzc2lvbi4gVGhpcyB3aWxsIG5vdCBhZmZlY3QgYWEBdmFsaWRhdG9yIHdobyBhbHJlYWR5IGhhcyBhIGNvbW1pc3Npb24gZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBtaW5pbXVtLiBBbnkgYWNjb3VudDhjYW4gY2FsbCB0aGlzLkhzZXRfbWluX2NvbW1pc3Npb24EAQxuZXeYARxQZXJiaWxsABkQJQFTZXRzIHRoZSBtaW5pbXVtIGFtb3VudCBvZiBjb21taXNzaW9uIHRoYXQgZWFjaCB2YWxpZGF0b3JzIG11c3QgbWFpbnRhaW4uAFkBVGhpcyBjYWxsIGhhcyBsb3dlciBwcml2aWxlZ2UgcmVxdWlyZW1lbnRzIHRoYW4gYHNldF9zdGFraW5nX2NvbmZpZ2AgYW5kIGNhbiBiZSBjYWxsZWTMYnkgdGhlIGBUOjpBZG1pbk9yaWdpbmAuIFJvb3QgY2FuIGFsd2F5cyBjYWxsIHRoaXMuWHBheW91dF9zdGFrZXJzX2J5X3BhZ2UMATx2YWxpZGF0b3Jfc3Rhc2gAATBUOjpBY2NvdW50SWQAAQxlcmEQASBFcmFJbmRleAABEHBhZ2UQARBQYWdlABpEMQFQYXkgb3V0IGEgcGFnZSBvZiB0aGUgc3Rha2VycyBiZWhpbmQgYSB2YWxpZGF0b3IgZm9yIHRoZSBnaXZlbiBlcmEgYW5kIHBhZ2UuAOgtIGB2YWxpZGF0b3Jfc3Rhc2hgIGlzIHRoZSBzdGFzaCBhY2NvdW50IG9mIHRoZSB2YWxpZGF0b3IuMQEtIGBlcmFgIG1heSBiZSBhbnkgZXJhIGJldHdlZW4gYFtjdXJyZW50X2VyYSAtIGhpc3RvcnlfZGVwdGg7IGN1cnJlbnRfZXJhXWAuMQEtIGBwYWdlYCBpcyB0aGUgcGFnZSBpbmRleCBvZiBub21pbmF0b3JzIHRvIHBheSBvdXQgd2l0aCB2YWx1ZSBiZXR3ZWVuIDAgYW5ksCAgYG51bV9ub21pbmF0b3JzIC8gVDo6TWF4RXhwb3N1cmVQYWdlU2l6ZWAuAFUBVGhlIG9yaWdpbiBvZiB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXy4gQW55IGFjY291bnQgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbiwgZXZlbiBpZnRpdCBpcyBub3Qgb25lIG9mIHRoZSBzdGFrZXJzLgA9AUlmIGEgdmFsaWRhdG9yIGhhcyBtb3JlIHRoYW4gW2BDb25maWc6Ok1heEV4cG9zdXJlUGFnZVNpemVgXSBub21pbmF0b3JzIGJhY2tpbmcpAXRoZW0sIHRoZW4gdGhlIGxpc3Qgb2Ygbm9taW5hdG9ycyBpcyBwYWdlZCwgd2l0aCBlYWNoIHBhZ2UgYmVpbmcgY2FwcGVkIGF0VQFbYENvbmZpZzo6TWF4RXhwb3N1cmVQYWdlU2l6ZWAuXSBJZiBhIHZhbGlkYXRvciBoYXMgbW9yZSB0aGFuIG9uZSBwYWdlIG9mIG5vbWluYXRvcnMsSQF0aGUgY2FsbCBuZWVkcyB0byBiZSBtYWRlIGZvciBlYWNoIHBhZ2Ugc2VwYXJhdGVseSBpbiBvcmRlciBmb3IgYWxsIHRoZSBub21pbmF0b3JzVQFiYWNraW5nIGEgdmFsaWRhdG9yIHRvIHJlY2VpdmUgdGhlIHJld2FyZC4gVGhlIG5vbWluYXRvcnMgYXJlIG5vdCBzb3J0ZWQgYWNyb3NzIHBhZ2VzYQFhbmQgc28gaXQgc2hvdWxkIG5vdCBiZSBhc3N1bWVkIHRoZSBoaWdoZXN0IHN0YWtlciB3b3VsZCBiZSBvbiB0aGUgdG9wbW9zdCBwYWdlIGFuZCB2aWNlSQF2ZXJzYS4gSWYgcmV3YXJkcyBhcmUgbm90IGNsYWltZWQgaW4gW2BDb25maWc6Okhpc3RvcnlEZXB0aGBdIGVyYXMsIHRoZXkgYXJlIGxvc3QuMHVwZGF0ZV9wYXllZQQBKGNvbnRyb2xsZXIAATBUOjpBY2NvdW50SWQAGxjgTWlncmF0ZXMgYW4gYWNjb3VudCdzIGBSZXdhcmREZXN0aW5hdGlvbjo6Q29udHJvbGxlcmAgdG+kYFJld2FyZERlc3RpbmF0aW9uOjpBY2NvdW50KGNvbnRyb2xsZXIpYC4AUQFFZmZlY3RzIHdpbGwgYmUgZmVsdCBpbnN0YW50bHkgKGFzIHNvb24gYXMgdGhpcyBmdW5jdGlvbiBpcyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5KS4AMQFUaGlzIHdpbGwgd2FpdmUgdGhlIHRyYW5zYWN0aW9uIGZlZSBpZiB0aGUgYHBheWVlYCBpcyBzdWNjZXNzZnVsbHkgbWlncmF0ZWQuaGRlcHJlY2F0ZV9jb250cm9sbGVyX2JhdGNoBAEsY29udHJvbGxlcnMlAgH0Qm91bmRlZFZlYzxUOjpBY2NvdW50SWQsIFQ6Ok1heENvbnRyb2xsZXJzSW5EZXByZWNhdGlvbkJhdGNoPgAcHF0BVXBkYXRlcyBhIGJhdGNoIG9mIGNvbnRyb2xsZXIgYWNjb3VudHMgdG8gdGhlaXIgY29ycmVzcG9uZGluZyBzdGFzaCBhY2NvdW50IGlmIHRoZXkgYXJlYQFub3QgdGhlIHNhbWUuIElnbm9yZXMgYW55IGNvbnRyb2xsZXIgYWNjb3VudHMgdGhhdCBkbyBub3QgZXhpc3QsIGFuZCBkb2VzIG5vdCBvcGVyYXRlIGlmuHRoZSBzdGFzaCBhbmQgY29udHJvbGxlciBhcmUgYWxyZWFkeSB0aGUgc2FtZS4AUQFFZmZlY3RzIHdpbGwgYmUgZmVsdCBpbnN0YW50bHkgKGFzIHNvb24gYXMgdGhpcyBmdW5jdGlvbiBpcyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5KS4AtFRoZSBkaXNwYXRjaCBvcmlnaW4gbXVzdCBiZSBgVDo6QWRtaW5PcmlnaW5gLjhyZXN0b3JlX2xlZGdlchABFHN0YXNoAAEwVDo6QWNjb3VudElkAAFAbWF5YmVfY29udHJvbGxlcjUBAVBPcHRpb248VDo6QWNjb3VudElkPgABLG1heWJlX3RvdGFsKQIBUE9wdGlvbjxCYWxhbmNlT2Y8VD4+AAE8bWF5YmVfdW5sb2NraW5nLQIBFQFPcHRpb248Qm91bmRlZFZlYzxVbmxvY2tDaHVuazxCYWxhbmNlT2Y8VD4+LCBUOjoKTWF4VW5sb2NraW5nQ2h1bmtzPj4AHSwFAVJlc3RvcmVzIHRoZSBzdGF0ZSBvZiBhIGxlZGdlciB3aGljaCBpcyBpbiBhbiBpbmNvbnNpc3RlbnQgc3RhdGUuANxUaGUgcmVxdWlyZW1lbnRzIHRvIHJlc3RvcmUgYSBsZWRnZXIgYXJlIHRoZSBmb2xsb3dpbmc6ZCogVGhlIHN0YXNoIGlzIGJvbmRlZDsgb3INASogVGhlIHN0YXNoIGlzIG5vdCBib25kZWQgYnV0IGl0IGhhcyBhIHN0YWtpbmcgbG9jayBsZWZ0IGJlaGluZDsgb3IlASogSWYgdGhlIHN0YXNoIGhhcyBhbiBhc3NvY2lhdGVkIGxlZGdlciBhbmQgaXRzIHN0YXRlIGlzIGluY29uc2lzdGVudDsgb3IdASogSWYgdGhlIGxlZGdlciBpcyBub3QgY29ycnVwdGVkICpidXQqIGl0cyBzdGFraW5nIGxvY2sgaXMgb3V0IG9mIHN5bmMuAGEBVGhlIGBtYXliZV8qYCBpbnB1dCBwYXJhbWV0ZXJzIHdpbGwgb3ZlcndyaXRlIHRoZSBjb3JyZXNwb25kaW5nIGRhdGEgYW5kIG1ldGFkYXRhIG9mIHRoZVkBbGVkZ2VyIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3Rhc2guIElmIHRoZSBpbnB1dCBwYXJhbWV0ZXJzIGFyZSBub3Qgc2V0LCB0aGUgbGVkZ2VyIHdpbGyQYmUgcmVzZXQgdmFsdWVzIGZyb20gb24tY2hhaW4gc3RhdGUuQG1pZ3JhdGVfY3VycmVuY3kEARRzdGFzaAABMFQ6OkFjY291bnRJZAAeHLxSZW1vdmVzIHRoZSBsZWdhY3kgU3Rha2luZyBsb2NrcyBpZiB0aGV5IGV4aXN0LgBRAVRoaXMgcmVtb3ZlcyB0aGUgbGVnYWN5IGxvY2sgb24gdGhlIHN0YWtlIHdpdGggW2BDb25maWc6Ok9sZEN1cnJlbmN5YF0gYW5kIGNyZWF0ZXMgYVUBaG9sZCBvbiBpdCBpZiBuZWVkZWQuIElmIGFsbCBzdGFrZSBjYW5ub3QgYmUgaGVsZCwgdGhlIGJlc3QgZWZmb3J0IGlzIG1hZGUgdG8gaG9sZCBhcykBbXVjaCBhcyBwb3NzaWJsZS4gVGhlIHJlbWFpbmluZyBzdGFrZSBpcyBmb3JjZWQgd2l0aGRyYXduIGZyb20gdGhlIGxlZGdlci4AxFRoZSBmZWUgaXMgd2FpdmVkIGlmIHRoZSBtaWdyYXRpb24gaXMgc3VjY2Vzc2Z1bC4wbWFudWFsX3NsYXNoDAE8dmFsaWRhdG9yX3N0YXNoAAEwVDo6QWNjb3VudElkAAEMZXJhEAEgRXJhSW5kZXgAAThzbGFzaF9mcmFjdGlvbpgBHFBlcmJpbGwAIVQZAVRoaXMgZnVuY3Rpb24gYWxsb3dzIGdvdmVybmFuY2UgdG8gbWFudWFsbHkgc2xhc2ggYSB2YWxpZGF0b3IgYW5kIGlzIGFcKipmYWxsYmFjayBtZWNoYW5pc20qKi4AtFRoZSBkaXNwYXRjaCBvcmlnaW4gbXVzdCBiZSBgVDo6QWRtaW5PcmlnaW5gLgA0IyMgUGFyYW1ldGVycwkBLSBgdmFsaWRhdG9yX3N0YXNoYCAtIFRoZSBzdGFzaCBhY2NvdW50IG9mIHRoZSB2YWxpZGF0b3IgdG8gc2xhc2gu/C0gYGVyYWAgLSBUaGUgZXJhIGluIHdoaWNoIHRoZSB2YWxpZGF0b3Igd2FzIGluIHRoZSBhY3RpdmUgc2V0LkkBLSBgc2xhc2hfZnJhY3Rpb25gIC0gVGhlIHBlcmNlbnRhZ2Ugb2YgdGhlIHN0YWtlIHRvIHNsYXNoLCBleHByZXNzZWQgYXMgYSBQZXJiaWxsLgAsIyMgQmVoYXZpb3IAPQFUaGUgc2xhc2ggd2lsbCBiZSBhcHBsaWVkIHVzaW5nIHRoZSBzdGFuZGFyZCBzbGFzaGluZyBtZWNoYW5pY3MsIHJlc3BlY3RpbmcgdGhlgGNvbmZpZ3VyZWQgYFNsYXNoRGVmZXJEdXJhdGlvbmAuACxUaGlzIG1lYW5zOlEBLSBJZiB0aGUgdmFsaWRhdG9yIHdhcyBhbHJlYWR5IHNsYXNoZWQgYnkgYSBoaWdoZXIgcGVyY2VudGFnZSBmb3IgdGhlIHNhbWUgZXJhLCB0aGlznCAgc2xhc2ggd2lsbCBoYXZlIG5vIGFkZGl0aW9uYWwgZWZmZWN0LlEBLSBJZiB0aGUgdmFsaWRhdG9yIHdhcyBwcmV2aW91c2x5IHNsYXNoZWQgYnkgYSBsb3dlciBwZXJjZW50YWdlLCBvbmx5IHRoZSBkaWZmZXJlbmNlSCAgd2lsbCBiZSBhcHBsaWVkLj0BLSBUaGUgc2xhc2ggd2lsbCBiZSBkZWZlcnJlZCBieSBgU2xhc2hEZWZlckR1cmF0aW9uYCBlcmFzIGJlZm9yZSBiZWluZyBlbmFjdGVkLgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy4NAgAAAu0BABECDDRzcF9hcml0aG1ldGljKHBlcl90aGluZ3McUGVyY2VudAAABAAIAQh1OAAAFQIQOHBhbGxldF9zdGFraW5nGHBhbGxldBhwYWxsZXQgQ29uZmlnT3AEBFQBGAEMEE5vb3AAAAAMU2V0BAAYAQRUAAEAGFJlbW92ZQACAAAZAhA4cGFsbGV0X3N0YWtpbmcYcGFsbGV0GHBhbGxldCBDb25maWdPcAQEVAEQAQwQTm9vcAAAAAxTZXQEABABBFQAAQAYUmVtb3ZlAAIAAB0CEDhwYWxsZXRfc3Rha2luZxhwYWxsZXQYcGFsbGV0IENvbmZpZ09wBARUARECAQwQTm9vcAAAAAxTZXQEABECAQRUAAEAGFJlbW92ZQACAAAhAhA4cGFsbGV0X3N0YWtpbmcYcGFsbGV0GHBhbGxldCBDb25maWdPcAQEVAGYAQwQTm9vcAAAAAxTZXQEAJgBBFQAAQAYUmVtb3ZlAAIAACUCDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBAARTAAAEAAECARhWZWM8VD4AACkCBBhPcHRpb24EBFQBGAEIEE5vbmUAAAAQU29tZQQAGAAAAQAALQIEGE9wdGlvbgQEVAExAgEIEE5vbmUAAAAQU29tZQQAMQIAAAEAADECDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBNQIEUwAABAA5AgEYVmVjPFQ+AAA1Agg4cGFsbGV0X3N0YWtpbmcsVW5sb2NrQ2h1bmsEHEJhbGFuY2UBGAAIARR2YWx1Zf0BARxCYWxhbmNlAAEMZXJhyQEBIEVyYUluZGV4AAA5AgAAAjUCAD0CDERwYWxsZXRfcGFyYW1ldGVycxhwYWxsZXQQQ2FsbAQEVAABBDRzZXRfcGFyYW1ldGVyBAEka2V5X3ZhbHVlQQIBUFQ6OlJ1bnRpbWVQYXJhbWV0ZXJzAAAQdFNldCB0aGUgdmFsdWUgb2YgYSBwYXJhbWV0ZXIuAFUBVGhlIGRpc3BhdGNoIG9yaWdpbiBvZiB0aGlzIGNhbGwgbXVzdCBiZSBgQWRtaW5PcmlnaW5gIGZvciB0aGUgZ2l2ZW4gYGtleWAuIFZhbHVlcyBiZYhkZWxldGVkIGJ5IHNldHRpbmcgdGhlbSB0byBgTm9uZWAuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLkECCDx3ZXN0ZW5kX3J1bnRpbWVEUnVudGltZVBhcmFtZXRlcnMAAQQkSW5mbGF0aW9uBABFAgGUZHluYW1pY19wYXJhbXM6OmluZmxhdGlvbjo6UGFyYW1ldGVycwAAAABFAhA8d2VzdGVuZF9ydW50aW1lOGR5bmFtaWNfcGFyYW1zJGluZmxhdGlvbihQYXJhbWV0ZXJzAAEUME1pbkluZmxhdGlvbggAxAEwTWluSW5mbGF0aW9uAABJAgFMT3B0aW9uPFBlcnF1aW50aWxsPgAAADBNYXhJbmZsYXRpb24IAMgBME1heEluZmxhdGlvbgAASQIBTE9wdGlvbjxQZXJxdWludGlsbD4AAQAoSWRlYWxTdGFrZQgAzAEoSWRlYWxTdGFrZQAASQIBTE9wdGlvbjxQZXJxdWludGlsbD4AAgAcRmFsbG9mZggA0AEcRmFsbG9mZgAASQIBTE9wdGlvbjxQZXJxdWludGlsbD4AAwA8VXNlQXVjdGlvblNsb3RzCADUATxVc2VBdWN0aW9uU2xvdHMAAE0CATBPcHRpb248Ym9vbD4ABAAASQIEGE9wdGlvbgQEVAHkAQgQTm9uZQAAABBTb21lBADkAAABAABNAgQYT3B0aW9uBARUASABCBBOb25lAAAAEFNvbWUEACAAAAEAAFECDDhwYWxsZXRfc2Vzc2lvbhhwYWxsZXQQQ2FsbAQEVAABCCBzZXRfa2V5cwgBEGtleXNVAgEcVDo6S2V5cwABFHByb29mOAEcVmVjPHU4PgAAJORTZXRzIHRoZSBzZXNzaW9uIGtleShzKSBvZiB0aGUgZnVuY3Rpb24gY2FsbGVyIHRvIGBrZXlzYC4dAUFsbG93cyBhbiBhY2NvdW50IHRvIHNldCBpdHMgc2Vzc2lvbiBrZXkgcHJpb3IgdG8gYmVjb21pbmcgYSB2YWxpZGF0b3IuwFRoaXMgZG9lc24ndCB0YWtlIGVmZmVjdCB1bnRpbCB0aGUgbmV4dCBzZXNzaW9uLgDQVGhlIGRpc3BhdGNoIG9yaWdpbiBvZiB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgc2lnbmVkLgA0IyMgQ29tcGxleGl0eVkBLSBgTygxKWAuIEFjdHVhbCBjb3N0IGRlcGVuZHMgb24gdGhlIG51bWJlciBvZiBsZW5ndGggb2YgYFQ6OktleXM6OmtleV9pZHMoKWAgd2hpY2ggaXMgICBmaXhlZC4ocHVyZ2Vfa2V5cwABMMhSZW1vdmVzIGFueSBzZXNzaW9uIGtleShzKSBvZiB0aGUgZnVuY3Rpb24gY2FsbGVyLgDAVGhpcyBkb2Vzbid0IHRha2UgZWZmZWN0IHVudGlsIHRoZSBuZXh0IHNlc3Npb24uAFUBVGhlIGRpc3BhdGNoIG9yaWdpbiBvZiB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgU2lnbmVkIGFuZCB0aGUgYWNjb3VudCBtdXN0IGJlIGVpdGhlciBiZV0BY29udmVydGlibGUgdG8gYSB2YWxpZGF0b3IgSUQgdXNpbmcgdGhlIGNoYWluJ3MgdHlwaWNhbCBhZGRyZXNzaW5nIHN5c3RlbSAodGhpcyB1c3VhbGx5UQFtZWFucyBiZWluZyBhIGNvbnRyb2xsZXIgYWNjb3VudCkgb3IgZGlyZWN0bHkgY29udmVydGlibGUgaW50byBhIHZhbGlkYXRvciBJRCAod2hpY2iUdXN1YWxseSBtZWFucyBiZWluZyBhIHN0YXNoIGFjY291bnQpLgA0IyMgQ29tcGxleGl0eT0BLSBgTygxKWAgaW4gbnVtYmVyIG9mIGtleSB0eXBlcy4gQWN0dWFsIGNvc3QgZGVwZW5kcyBvbiB0aGUgbnVtYmVyIG9mIGxlbmd0aCBvZpggIGBUOjpLZXlzOjprZXlfaWRzKClgIHdoaWNoIGlzIGZpeGVkLgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy5VAgg8d2VzdGVuZF9ydW50aW1lLFNlc3Npb25LZXlzAAAYARxncmFuZHBh+AHQPEdyYW5kcGEgYXMgJGNyYXRlOjpCb3VuZFRvUnVudGltZUFwcFB1YmxpYz46OlB1YmxpYwABEGJhYmXNAQHEPEJhYmUgYXMgJGNyYXRlOjpCb3VuZFRvUnVudGltZUFwcFB1YmxpYz46OlB1YmxpYwABOHBhcmFfdmFsaWRhdG9yWQIB4DxJbml0aWFsaXplciBhcyAkY3JhdGU6OkJvdW5kVG9SdW50aW1lQXBwUHVibGljPjo6UHVibGljAAE8cGFyYV9hc3NpZ25tZW50XQIB8DxQYXJhU2Vzc2lvbkluZm8gYXMgJGNyYXRlOjpCb3VuZFRvUnVudGltZUFwcFB1YmxpYz46OlB1YmxpYwABTGF1dGhvcml0eV9kaXNjb3ZlcnlhAgH8PEF1dGhvcml0eURpc2NvdmVyeSBhcyAkY3JhdGU6OkJvdW5kVG9SdW50aW1lQXBwUHVibGljPjo6UHVibGljAAEUYmVlZnllAgHIPEJlZWZ5IGFzICRjcmF0ZTo6Qm91bmRUb1J1bnRpbWVBcHBQdWJsaWM+OjpQdWJsaWMAAFkCEExwb2xrYWRvdF9wcmltaXRpdmVzCHY4NHZhbGlkYXRvcl9hcHAYUHVibGljAAAEAAQBPHNyMjU1MTk6OlB1YmxpYwAAXQIQTHBvbGthZG90X3ByaW1pdGl2ZXMIdjg4YXNzaWdubWVudF9hcHAYUHVibGljAAAEAAQBPHNyMjU1MTk6OlB1YmxpYwAAYQIMWHNwX2F1dGhvcml0eV9kaXNjb3ZlcnkMYXBwGFB1YmxpYwAABAAEATxzcjI1NTE5OjpQdWJsaWMAAGUCDEhzcF9jb25zZW5zdXNfYmVlZnkwZWNkc2FfY3J5cHRvGFB1YmxpYwAABABpAgE0ZWNkc2E6OlB1YmxpYwAAaQIAAAMhAAAACABtAgw4cGFsbGV0X2dyYW5kcGEYcGFsbGV0EENhbGwEBFQAAQxMcmVwb3J0X2VxdWl2b2NhdGlvbggBSGVxdWl2b2NhdGlvbl9wcm9vZnECAchCb3g8RXF1aXZvY2F0aW9uUHJvb2Y8VDo6SGFzaCwgQmxvY2tOdW1iZXJGb3I8VD4+PgABPGtleV9vd25lcl9wcm9vZtUBAUBUOjpLZXlPd25lclByb29mAAAQCQFSZXBvcnQgdm90ZXIgZXF1aXZvY2F0aW9uL21pc2JlaGF2aW9yLiBUaGlzIG1ldGhvZCB3aWxsIHZlcmlmeSB0aGX0ZXF1aXZvY2F0aW9uIHByb29mIGFuZCB2YWxpZGF0ZSB0aGUgZ2l2ZW4ga2V5IG93bmVyc2hpcCBwcm9vZvhhZ2FpbnN0IHRoZSBleHRyYWN0ZWQgb2ZmZW5kZXIuIElmIGJvdGggYXJlIHZhbGlkLCB0aGUgb2ZmZW5jZUR3aWxsIGJlIHJlcG9ydGVkLnByZXBvcnRfZXF1aXZvY2F0aW9uX3Vuc2lnbmVkCAFIZXF1aXZvY2F0aW9uX3Byb29mcQIByEJveDxFcXVpdm9jYXRpb25Qcm9vZjxUOjpIYXNoLCBCbG9ja051bWJlckZvcjxUPj4+AAE8a2V5X293bmVyX3Byb29m1QEBQFQ6OktleU93bmVyUHJvb2YAASQJAVJlcG9ydCB2b3RlciBlcXVpdm9jYXRpb24vbWlzYmVoYXZpb3IuIFRoaXMgbWV0aG9kIHdpbGwgdmVyaWZ5IHRoZfRlcXVpdm9jYXRpb24gcHJvb2YgYW5kIHZhbGlkYXRlIHRoZSBnaXZlbiBrZXkgb3duZXJzaGlwIHByb29m+GFnYWluc3QgdGhlIGV4dHJhY3RlZCBvZmZlbmRlci4gSWYgYm90aCBhcmUgdmFsaWQsIHRoZSBvZmZlbmNlRHdpbGwgYmUgcmVwb3J0ZWQuAA0BVGhpcyBleHRyaW5zaWMgbXVzdCBiZSBjYWxsZWQgdW5zaWduZWQgYW5kIGl0IGlzIGV4cGVjdGVkIHRoYXQgb25seRUBYmxvY2sgYXV0aG9ycyB3aWxsIGNhbGwgaXQgKHZhbGlkYXRlZCBpbiBgVmFsaWRhdGVVbnNpZ25lZGApLCBhcyBzdWNoFQFpZiB0aGUgYmxvY2sgYXV0aG9yIGlzIGRlZmluZWQgaXQgd2lsbCBiZSBkZWZpbmVkIGFzIHRoZSBlcXVpdm9jYXRpb24kcmVwb3J0ZXIuMG5vdGVfc3RhbGxlZAgBFGRlbGF5EAFEQmxvY2tOdW1iZXJGb3I8VD4AAWxiZXN0X2ZpbmFsaXplZF9ibG9ja19udW1iZXIQAURCbG9ja051bWJlckZvcjxUPgACMD0BTm90ZSB0aGF0IHRoZSBjdXJyZW50IGF1dGhvcml0eSBzZXQgb2YgdGhlIEdSQU5EUEEgZmluYWxpdHkgZ2FkZ2V0IGhhcyBzdGFsbGVkLgBhAVRoaXMgd2lsbCB0cmlnZ2VyIGEgZm9yY2VkIGF1dGhvcml0eSBzZXQgY2hhbmdlIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIG5leHQgc2Vzc2lvbiwgdG9hAWJlIGVuYWN0ZWQgYGRlbGF5YCBibG9ja3MgYWZ0ZXIgdGhhdC4gVGhlIGBkZWxheWAgc2hvdWxkIGJlIGhpZ2ggZW5vdWdoIHRvIHNhZmVseSBhc3N1bWVJAXRoYXQgdGhlIGJsb2NrIHNpZ25hbGxpbmcgdGhlIGZvcmNlZCBjaGFuZ2Ugd2lsbCBub3QgYmUgcmUtb3JnZWQgZS5nLiAxMDAwIGJsb2Nrcy5dAVRoZSBibG9jayBwcm9kdWN0aW9uIHJhdGUgKHdoaWNoIG1heSBiZSBzbG93ZWQgZG93biBiZWNhdXNlIG9mIGZpbmFsaXR5IGxhZ2dpbmcpIHNob3VsZFEBYmUgdGFrZW4gaW50byBhY2NvdW50IHdoZW4gY2hvb3NpbmcgdGhlIGBkZWxheWAuIFRoZSBHUkFORFBBIHZvdGVycyBiYXNlZCBvbiB0aGUgbmV3VQFhdXRob3JpdHkgd2lsbCBzdGFydCB2b3Rpbmcgb24gdG9wIG9mIGBiZXN0X2ZpbmFsaXplZF9ibG9ja19udW1iZXJgIGZvciBuZXcgZmluYWxpemVkTQFibG9ja3MuIGBiZXN0X2ZpbmFsaXplZF9ibG9ja19udW1iZXJgIHNob3VsZCBiZSB0aGUgaGlnaGVzdCBvZiB0aGUgbGF0ZXN0IGZpbmFsaXplZMRibG9jayBvZiBhbGwgdmFsaWRhdG9ycyBvZiB0aGUgbmV3IGF1dGhvcml0eSBzZXQuAFhPbmx5IGNhbGxhYmxlIGJ5IHJvb3QuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLnECCFBzcF9jb25zZW5zdXNfZ3JhbmRwYURFcXVpdm9jYXRpb25Qcm9vZggESAE0BE4BEAAIARhzZXRfaWQwARRTZXRJZAABMGVxdWl2b2NhdGlvbnUCAUhFcXVpdm9jYXRpb248SCwgTj4AAHUCCFBzcF9jb25zZW5zdXNfZ3JhbmRwYTBFcXVpdm9jYXRpb24IBEgBNAROARABCBxQcmV2b3RlBAB5AgGJAWZpbmFsaXR5X2dyYW5kcGE6OkVxdWl2b2NhdGlvbjxBdXRob3JpdHlJZCwgZmluYWxpdHlfZ3JhbmRwYTo6UHJldm90ZTwKSCwgTj4sIEF1dGhvcml0eVNpZ25hdHVyZSw+AAAAJFByZWNvbW1pdAQAjQIBkQFmaW5hbGl0eV9ncmFuZHBhOjpFcXVpdm9jYXRpb248QXV0aG9yaXR5SWQsIGZpbmFsaXR5X2dyYW5kcGE6OlByZWNvbW1pdAo8SCwgTj4sIEF1dGhvcml0eVNpZ25hdHVyZSw+AAEAAHkCCEBmaW5hbGl0eV9ncmFuZHBhMEVxdWl2b2NhdGlvbgwISWQB+ARWAX0CBFMBgQIAEAEwcm91bmRfbnVtYmVyMAEMdTY0AAEgaWRlbnRpdHn4AQhJZAABFGZpcnN0iQIBGChWLCBTKQABGHNlY29uZIkCARgoViwgUykAAH0CCEBmaW5hbGl0eV9ncmFuZHBhHFByZXZvdGUIBEgBNAROARAACAEsdGFyZ2V0X2hhc2g0AQRIAAE0dGFyZ2V0X251bWJlchABBE4AAIECDFBzcF9jb25zZW5zdXNfZ3JhbmRwYQxhcHAkU2lnbmF0dXJlAAAEAIUCAUhlZDI1NTE5OjpTaWduYXR1cmUAAIUCAAADQAAAAAgAiQIAAAQIfQKBAgCNAghAZmluYWxpdHlfZ3JhbmRwYTBFcXVpdm9jYXRpb24MCElkAfgEVgGRAgRTAYECABABMHJvdW5kX251bWJlcjABDHU2NAABIGlkZW50aXR5+AEISWQAARRmaXJzdJUCARgoViwgUykAARhzZWNvbmSVAgEYKFYsIFMpAACRAghAZmluYWxpdHlfZ3JhbmRwYSRQcmVjb21taXQIBEgBNAROARAACAEsdGFyZ2V0X2hhc2g0AQRIAAE0dGFyZ2V0X251bWJlchABBE4AAJUCAAAECJECgQIAmQIMOHBhbGxldF91dGlsaXR5GHBhbGxldBBDYWxsBARUAAEgFGJhdGNoBAEUY2FsbHOdAgF8VmVjPDxUIGFzIENvbmZpZz46OlJ1bnRpbWVDYWxsPgAASHxTZW5kIGEgYmF0Y2ggb2YgZGlzcGF0Y2ggY2FsbHMuALBNYXkgYmUgY2FsbGVkIGZyb20gYW55IG9yaWdpbiBleGNlcHQgYE5vbmVgLgBdAS0gYGNhbGxzYDogVGhlIGNhbGxzIHRvIGJlIGRpc3BhdGNoZWQgZnJvbSB0aGUgc2FtZSBvcmlnaW4uIFRoZSBudW1iZXIgb2YgY2FsbCBtdXN0IG5vdDkBICBleGNlZWQgdGhlIGNvbnN0YW50OiBgYmF0Y2hlZF9jYWxsc19saW1pdGAgKGF2YWlsYWJsZSBpbiBjb25zdGFudCBtZXRhZGF0YSkuAFUBSWYgb3JpZ2luIGlzIHJvb3QgdGhlbiB0aGUgY2FsbHMgYXJlIGRpc3BhdGNoZWQgd2l0aG91dCBjaGVja2luZyBvcmlnaW4gZmlsdGVyLiAoVGhpc+xpbmNsdWRlcyBieXBhc3NpbmcgYGZyYW1lX3N5c3RlbTo6Q29uZmlnOjpCYXNlQ2FsbEZpbHRlcmApLgA0IyMgQ29tcGxleGl0edAtIE8oQykgd2hlcmUgQyBpcyB0aGUgbnVtYmVyIG9mIGNhbGxzIHRvIGJlIGJhdGNoZWQuAFUBVGhpcyB3aWxsIHJldHVybiBgT2tgIGluIGFsbCBjaXJjdW1zdGFuY2VzLiBUbyBkZXRlcm1pbmUgdGhlIHN1Y2Nlc3Mgb2YgdGhlIGJhdGNoLCBhbjEBZXZlbnQgaXMgZGVwb3NpdGVkLiBJZiBhIGNhbGwgZmFpbGVkIGFuZCB0aGUgYmF0Y2ggd2FzIGludGVycnVwdGVkLCB0aGVuIHRoZVUBYEJhdGNoSW50ZXJydXB0ZWRgIGV2ZW50IGlzIGRlcG9zaXRlZCwgYWxvbmcgd2l0aCB0aGUgbnVtYmVyIG9mIHN1Y2Nlc3NmdWwgY2FsbHMgbWFkZU0BYW5kIHRoZSBlcnJvciBvZiB0aGUgZmFpbGVkIGNhbGwuIElmIGFsbCB3ZXJlIHN1Y2Nlc3NmdWwsIHRoZW4gdGhlIGBCYXRjaENvbXBsZXRlZGBMZXZlbnQgaXMgZGVwb3NpdGVkLjRhc19kZXJpdmF0aXZlCAEUaW5kZXhBAQEMdTE2AAEQY2FsbKkBAXxCb3g8PFQgYXMgQ29uZmlnPjo6UnVudGltZUNhbGw+AAE03FNlbmQgYSBjYWxsIHRocm91Z2ggYW4gaW5kZXhlZCBwc2V1ZG9ueW0gb2YgdGhlIHNlbmRlci4AVQFGaWx0ZXIgZnJvbSBvcmlnaW4gYXJlIHBhc3NlZCBhbG9uZy4gVGhlIGNhbGwgd2lsbCBiZSBkaXNwYXRjaGVkIHdpdGggYW4gb3JpZ2luIHdoaWNovHVzZSB0aGUgc2FtZSBmaWx0ZXIgYXMgdGhlIG9yaWdpbiBvZiB0aGlzIGNhbGwuAEUBTk9URTogSWYgeW91IG5lZWQgdG8gZW5zdXJlIHRoYXQgYW55IGFjY291bnQtYmFzZWQgZmlsdGVyaW5nIGlzIG5vdCBob25vcmVkIChpLmUuYQFiZWNhdXNlIHlvdSBleHBlY3QgYHByb3h5YCB0byBoYXZlIGJlZW4gdXNlZCBwcmlvciBpbiB0aGUgY2FsbCBzdGFjayBhbmQgeW91IGRvIG5vdCB3YW50UQF0aGUgY2FsbCByZXN0cmljdGlvbnMgdG8gYXBwbHkgdG8gYW55IHN1Yi1hY2NvdW50cyksIHRoZW4gdXNlIGBhc19tdWx0aV90aHJlc2hvbGRfMWB8aW4gdGhlIE11bHRpc2lnIHBhbGxldCBpbnN0ZWFkLgD0Tk9URTogUHJpb3IgdG8gdmVyc2lvbiAqMTIsIHRoaXMgd2FzIGNhbGxlZCBgYXNfbGltaXRlZF9zdWJgLgDMVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uJGJhdGNoX2FsbAQBFGNhbGxznQIBfFZlYzw8VCBhcyBDb25maWc+OjpSdW50aW1lQ2FsbD4AAjTsU2VuZCBhIGJhdGNoIG9mIGRpc3BhdGNoIGNhbGxzIGFuZCBhdG9taWNhbGx5IGV4ZWN1dGUgdGhlbS4hAVRoZSB3aG9sZSB0cmFuc2FjdGlvbiB3aWxsIHJvbGxiYWNrIGFuZCBmYWlsIGlmIGFueSBvZiB0aGUgY2FsbHMgZmFpbGVkLgCwTWF5IGJlIGNhbGxlZCBmcm9tIGFueSBvcmlnaW4gZXhjZXB0IGBOb25lYC4AXQEtIGBjYWxsc2A6IFRoZSBjYWxscyB0byBiZSBkaXNwYXRjaGVkIGZyb20gdGhlIHNhbWUgb3JpZ2luLiBUaGUgbnVtYmVyIG9mIGNhbGwgbXVzdCBub3Q5ASAgZXhjZWVkIHRoZSBjb25zdGFudDogYGJhdGNoZWRfY2FsbHNfbGltaXRgIChhdmFpbGFibGUgaW4gY29uc3RhbnQgbWV0YWRhdGEpLgBVAUlmIG9yaWdpbiBpcyByb290IHRoZW4gdGhlIGNhbGxzIGFyZSBkaXNwYXRjaGVkIHdpdGhvdXQgY2hlY2tpbmcgb3JpZ2luIGZpbHRlci4gKFRoaXPsaW5jbHVkZXMgYnlwYXNzaW5nIGBmcmFtZV9zeXN0ZW06OkNvbmZpZzo6QmFzZUNhbGxGaWx0ZXJgKS4ANCMjIENvbXBsZXhpdHnQLSBPKEMpIHdoZXJlIEMgaXMgdGhlIG51bWJlciBvZiBjYWxscyB0byBiZSBiYXRjaGVkLixkaXNwYXRjaF9hcwgBJGFzX29yaWdpbqECAVRCb3g8VDo6UGFsbGV0c09yaWdpbj4AARBjYWxsqQEBfEJveDw8VCBhcyBDb25maWc+OjpSdW50aW1lQ2FsbD4AAxjIRGlzcGF0Y2hlcyBhIGZ1bmN0aW9uIGNhbGwgd2l0aCBhIHByb3ZpZGVkIG9yaWdpbi4AxFRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9Sb290Xy4ANCMjIENvbXBsZXhpdHkcLSBPKDEpLixmb3JjZV9iYXRjaAQBFGNhbGxznQIBfFZlYzw8VCBhcyBDb25maWc+OjpSdW50aW1lQ2FsbD4ABDR8U2VuZCBhIGJhdGNoIG9mIGRpc3BhdGNoIGNhbGxzLtRVbmxpa2UgYGJhdGNoYCwgaXQgYWxsb3dzIGVycm9ycyBhbmQgd29uJ3QgaW50ZXJydXB0LgCwTWF5IGJlIGNhbGxlZCBmcm9tIGFueSBvcmlnaW4gZXhjZXB0IGBOb25lYC4AXQEtIGBjYWxsc2A6IFRoZSBjYWxscyB0byBiZSBkaXNwYXRjaGVkIGZyb20gdGhlIHNhbWUgb3JpZ2luLiBUaGUgbnVtYmVyIG9mIGNhbGwgbXVzdCBub3Q5ASAgZXhjZWVkIHRoZSBjb25zdGFudDogYGJhdGNoZWRfY2FsbHNfbGltaXRgIChhdmFpbGFibGUgaW4gY29uc3RhbnQgbWV0YWRhdGEpLgBNAUlmIG9yaWdpbiBpcyByb290IHRoZW4gdGhlIGNhbGxzIGFyZSBkaXNwYXRjaCB3aXRob3V0IGNoZWNraW5nIG9yaWdpbiBmaWx0ZXIuIChUaGlz7GluY2x1ZGVzIGJ5cGFzc2luZyBgZnJhbWVfc3lzdGVtOjpDb25maWc6OkJhc2VDYWxsRmlsdGVyYCkuADQjIyBDb21wbGV4aXR50C0gTyhDKSB3aGVyZSBDIGlzIHRoZSBudW1iZXIgb2YgY2FsbHMgdG8gYmUgYmF0Y2hlZC4sd2l0aF93ZWlnaHQIARBjYWxsqQEBfEJveDw8VCBhcyBDb25maWc+OjpSdW50aW1lQ2FsbD4AARh3ZWlnaHQoARhXZWlnaHQABRjERGlzcGF0Y2ggYSBmdW5jdGlvbiBjYWxsIHdpdGggYSBzcGVjaWZpZWQgd2VpZ2h0LgAtAVRoaXMgZnVuY3Rpb24gZG9lcyBub3QgY2hlY2sgdGhlIHdlaWdodCBvZiB0aGUgY2FsbCwgYW5kIGluc3RlYWQgYWxsb3dzIHRoZbhSb290IG9yaWdpbiB0byBzcGVjaWZ5IHRoZSB3ZWlnaHQgb2YgdGhlIGNhbGwuAMRUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfUm9vdF8uHGlmX2Vsc2UIARBtYWluqQEBfEJveDw8VCBhcyBDb25maWc+OjpSdW50aW1lQ2FsbD4AASBmYWxsYmFja6kBAXxCb3g8PFQgYXMgQ29uZmlnPjo6UnVudGltZUNhbGw+AAZcFQFEaXNwYXRjaCBhIGZhbGxiYWNrIGNhbGwgaW4gdGhlIGV2ZW50IHRoZSBtYWluIGNhbGwgZmFpbHMgdG8gZXhlY3V0ZS6wTWF5IGJlIGNhbGxlZCBmcm9tIGFueSBvcmlnaW4gZXhjZXB0IGBOb25lYC4A5FRoaXMgZnVuY3Rpb24gZmlyc3QgYXR0ZW1wdHMgdG8gZGlzcGF0Y2ggdGhlIGBtYWluYCBjYWxsLtRJZiB0aGUgYG1haW5gIGNhbGwgZmFpbHMsIHRoZSBgZmFsbGJhY2tgIGlzIGF0dGVtdGVkLhUBaWYgdGhlIGZhbGxiYWNrIGlzIHN1Y2Nlc3NmdWxseSBkaXNwYXRjaGVkLCB0aGUgd2VpZ2h0cyBvZiBib3RoIGNhbGxzJQFhcmUgYWNjdW11bGF0ZWQgYW5kIGFuIGV2ZW50IGNvbnRhaW5pbmcgdGhlIG1haW4gY2FsbCBlcnJvciBpcyBkZXBvc2l0ZWQuANxJbiB0aGUgZXZlbnQgb2YgYSBmYWxsYmFjayBmYWlsdXJlIHRoZSB3aG9sZSBjYWxsIGZhaWxzaHdpdGggdGhlIHdlaWdodHMgcmV0dXJuZWQuAEEBLSBgbWFpbmA6IFRoZSBtYWluIGNhbGwgdG8gYmUgZGlzcGF0Y2hlZC4gVGhpcyBpcyB0aGUgcHJpbWFyeSBhY3Rpb24gdG8gZXhlY3V0ZS49AS0gYGZhbGxiYWNrYDogVGhlIGZhbGxiYWNrIGNhbGwgdG8gYmUgZGlzcGF0Y2hlZCBpbiBjYXNlIHRoZSBgbWFpbmAgY2FsbCBmYWlscy4ARCMjIERpc3BhdGNoIExvZ2ljQQEtIElmIHRoZSBvcmlnaW4gaXMgYHJvb3RgLCBib3RoIHRoZSBtYWluIGFuZCBmYWxsYmFjayBjYWxscyBhcmUgZXhlY3V0ZWQgd2l0aG91dHggIGFwcGx5aW5nIGFueSBvcmlnaW4gZmlsdGVycy5JAS0gSWYgdGhlIG9yaWdpbiBpcyBub3QgYHJvb3RgLCB0aGUgb3JpZ2luIGZpbHRlciBpcyBhcHBsaWVkIHRvIGJvdGggdGhlIGBtYWluYCBhbmRMICBgZmFsbGJhY2tgIGNhbGxzLgAsIyMgVXNlIENhc2VZAS0gU29tZSB1c2UgY2FzZXMgbWlnaHQgaW52b2x2ZSBzdWJtaXR0aW5nIGEgYGJhdGNoYCB0eXBlIGNhbGwgaW4gZWl0aGVyIG1haW4sIGZhbGxiYWNrKCAgb3IgYm90aC5QZGlzcGF0Y2hfYXNfZmFsbGlibGUIASRhc19vcmlnaW6hAgFUQm94PFQ6OlBhbGxldHNPcmlnaW4+AAEQY2FsbKkBAXxCb3g8PFQgYXMgQ29uZmlnPjo6UnVudGltZUNhbGw+AAcUyERpc3BhdGNoZXMgYSBmdW5jdGlvbiBjYWxsIHdpdGggYSBwcm92aWRlZCBvcmlnaW4uAFEBQWxtb3N0IHRoZSBzYW1lIGFzIFtgUGFsbGV0OjpkaXNwYXRjaF9hc2BdIGJ1dCBmb3J3YXJkcyBhbnkgZXJyb3Igb2YgdGhlIGlubmVyIGNhbGwuAMRUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfUm9vdF8uBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLp0CAAACqQEAoQIIPHdlc3RlbmRfcnVudGltZTBPcmlnaW5DYWxsZXIAARAYc3lzdGVtBAClAgF0ZnJhbWVfc3lzdGVtOjpPcmlnaW48UnVudGltZT4AAAAcT3JpZ2lucwQAqQIBdHBhbGxldF9jdXN0b21fb3JpZ2luczo6T3JpZ2luACMAQFBhcmFjaGFpbnNPcmlnaW4EAK0CAWRwYXJhY2hhaW5zX29yaWdpbjo6T3JpZ2luACkAJFhjbVBhbGxldAQAtQIBSHBhbGxldF94Y206Ok9yaWdpbgBjAAClAgw0ZnJhbWVfc3VwcG9ydCBkaXNwYXRjaCRSYXdPcmlnaW4EJEFjY291bnRJZAEAARAQUm9vdAAAABhTaWduZWQEAAABJEFjY291bnRJZAABABBOb25lAAIAKEF1dGhvcml6ZWQAAwAAqQIUPHdlc3RlbmRfcnVudGltZShnb3Zlcm5hbmNlHG9yaWdpbnNUcGFsbGV0X2N1c3RvbV9vcmlnaW5zGE9yaWdpbgABbDBTdGFraW5nQWRtaW4AAAAkVHJlYXN1cmVyAAEAPEZlbGxvd3NoaXBBZG1pbgACADBHZW5lcmFsQWRtaW4AAwAwQXVjdGlvbkFkbWluAAQAKExlYXNlQWRtaW4ABQBMUmVmZXJlbmR1bUNhbmNlbGxlcgAGAEBSZWZlcmVuZHVtS2lsbGVyAAcALFNtYWxsVGlwcGVyAAgAJEJpZ1RpcHBlcgAJADBTbWFsbFNwZW5kZXIACgA0TWVkaXVtU3BlbmRlcgALAChCaWdTcGVuZGVyAAwARFdoaXRlbGlzdGVkQ2FsbGVyAA0ATEZlbGxvd3NoaXBJbml0aWF0ZXMADgAcRmVsbG93cwAPAERGZWxsb3dzaGlwRXhwZXJ0cwAQAERGZWxsb3dzaGlwTWFzdGVycwARADhGZWxsb3dzaGlwMURhbgASADhGZWxsb3dzaGlwMkRhbgATADhGZWxsb3dzaGlwM0RhbgAUADhGZWxsb3dzaGlwNERhbgAVADhGZWxsb3dzaGlwNURhbgAWADhGZWxsb3dzaGlwNkRhbgAXADhGZWxsb3dzaGlwN0RhbgAYADhGZWxsb3dzaGlwOERhbgAZADhGZWxsb3dzaGlwOURhbgAaAACtAhBscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zGG9yaWdpbhhwYWxsZXQYT3JpZ2luAAEEJFBhcmFjaGFpbgQAsQIBGFBhcmFJZAAAAACxAgx0cG9sa2Fkb3RfcGFyYWNoYWluX3ByaW1pdGl2ZXMocHJpbWl0aXZlcwhJZAAABAAQAQx1MzIAALUCDChwYWxsZXRfeGNtGHBhbGxldBhPcmlnaW4AAQgMWGNtBAC5AgEgTG9jYXRpb24AAAAgUmVzcG9uc2UEALkCASBMb2NhdGlvbgABAAC5AhAsc3RhZ2luZ194Y20IdjUgbG9jYXRpb24gTG9jYXRpb24AAAgBHHBhcmVudHMIAQh1OAABIGludGVyaW9yvQIBJEp1bmN0aW9ucwAAvQIQLHN0YWdpbmdfeGNtCHY1JGp1bmN0aW9ucyRKdW5jdGlvbnMAASQQSGVyZQAAAAhYMQQAwQIBSEFyYzxbSnVuY3Rpb247IDFdPgABAAhYMgQA2QIBSEFyYzxbSnVuY3Rpb247IDJdPgACAAhYMwQA3QIBSEFyYzxbSnVuY3Rpb247IDNdPgADAAhYNAQA4QIBSEFyYzxbSnVuY3Rpb247IDRdPgAEAAhYNQQA5QIBSEFyYzxbSnVuY3Rpb247IDVdPgAFAAhYNgQA6QIBSEFyYzxbSnVuY3Rpb247IDZdPgAGAAhYNwQA7QIBSEFyYzxbSnVuY3Rpb247IDddPgAHAAhYOAQA8QIBSEFyYzxbSnVuY3Rpb247IDhdPgAIAADBAgAAAwEAAADFAgDFAhAsc3RhZ2luZ194Y20IdjUganVuY3Rpb24gSnVuY3Rpb24AASgkUGFyYWNoYWluBADJAQEMdTMyAAAALEFjY291bnRJZDMyCAEcbmV0d29ya8kCAURPcHRpb248TmV0d29ya0lkPgABCGlkBAEgW3U4OyAzMl0AAQA4QWNjb3VudEluZGV4NjQIARxuZXR3b3JryQIBRE9wdGlvbjxOZXR3b3JrSWQ+AAEUaW5kZXgsAQx1NjQAAgAwQWNjb3VudEtleTIwCAEcbmV0d29ya8kCAURPcHRpb248TmV0d29ya0lkPgABDGtlefUBASBbdTg7IDIwXQADADhQYWxsZXRJbnN0YW5jZQQACAEIdTgABAAwR2VuZXJhbEluZGV4BAD9AQEQdTEyOAAFAChHZW5lcmFsS2V5CAEYbGVuZ3RoCAEIdTgAARBkYXRhBAEgW3U4OyAzMl0ABgAkT25seUNoaWxkAAcAJFBsdXJhbGl0eQgBCGlk0QIBGEJvZHlJZAABEHBhcnTVAgEgQm9keVBhcnQACAA8R2xvYmFsQ29uc2Vuc3VzBADNAgEkTmV0d29ya0lkAAkAAMkCBBhPcHRpb24EBFQBzQIBCBBOb25lAAAAEFNvbWUEAM0CAAABAADNAhAsc3RhZ2luZ194Y20IdjUganVuY3Rpb24kTmV0d29ya0lkAAEgJEJ5R2VuZXNpcwQABAEgW3U4OyAzMl0AAAAYQnlGb3JrCAEwYmxvY2tfbnVtYmVyMAEMdTY0AAEoYmxvY2tfaGFzaAQBIFt1ODsgMzJdAAEAIFBvbGthZG90AAIAGEt1c2FtYQADACBFdGhlcmV1bQQBIGNoYWluX2lkLAEMdTY0AAcALEJpdGNvaW5Db3JlAAgALEJpdGNvaW5DYXNoAAkAQFBvbGthZG90QnVsbGV0aW4ACgAA0QIQDHhjbQh2MyBqdW5jdGlvbhhCb2R5SWQAASgQVW5pdAAAABxNb25pa2VyBABIARxbdTg7IDRdAAEAFEluZGV4BADJAQEMdTMyAAIAJEV4ZWN1dGl2ZQADACRUZWNobmljYWwABAAsTGVnaXNsYXRpdmUABQAgSnVkaWNpYWwABgAcRGVmZW5zZQAHADhBZG1pbmlzdHJhdGlvbgAIACBUcmVhc3VyeQAJAADVAhAMeGNtCHYzIGp1bmN0aW9uIEJvZHlQYXJ0AAEUFFZvaWNlAAAAHE1lbWJlcnMEARRjb3VudMkBAQx1MzIAAQAgRnJhY3Rpb24IAQxub23JAQEMdTMyAAEUZGVub23JAQEMdTMyAAIAREF0TGVhc3RQcm9wb3J0aW9uCAEMbm9tyQEBDHUzMgABFGRlbm9tyQEBDHUzMgADAEhNb3JlVGhhblByb3BvcnRpb24IAQxub23JAQEMdTMyAAEUZGVub23JAQEMdTMyAAQAANkCAAADAgAAAMUCAN0CAAADAwAAAMUCAOECAAADBAAAAMUCAOUCAAADBQAAAMUCAOkCAAADBgAAAMUCAO0CAAADBwAAAMUCAPECAAADCAAAAMUCAPUCDDxwYWxsZXRfaWRlbnRpdHkYcGFsbGV0EENhbGwEBFQAAWA0YWRkX3JlZ2lzdHJhcgQBHGFjY291bnTtAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AABx4QWRkIGEgcmVnaXN0cmFyIHRvIHRoZSBzeXN0ZW0uAPxUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBgVDo6UmVnaXN0cmFyT3JpZ2luYC4AqC0gYGFjY291bnRgOiB0aGUgYWNjb3VudCBvZiB0aGUgcmVnaXN0cmFyLgCURW1pdHMgYFJlZ2lzdHJhckFkZGVkYCBpZiBzdWNjZXNzZnVsLjBzZXRfaWRlbnRpdHkEARBpbmZv+QIBbEJveDxUOjpJZGVudGl0eUluZm9ybWF0aW9uPgABKCkBU2V0IGFuIGFjY291bnQncyBpZGVudGl0eSBpbmZvcm1hdGlvbiBhbmQgcmVzZXJ2ZSB0aGUgYXBwcm9wcmlhdGUgZGVwb3NpdC4AVQFJZiB0aGUgYWNjb3VudCBhbHJlYWR5IGhhcyBpZGVudGl0eSBpbmZvcm1hdGlvbiwgdGhlIGRlcG9zaXQgaXMgdGFrZW4gYXMgcGFydCBwYXltZW50UGZvciB0aGUgbmV3IGRlcG9zaXQuAMxUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXy4AjC0gYGluZm9gOiBUaGUgaWRlbnRpdHkgaW5mb3JtYXRpb24uAIhFbWl0cyBgSWRlbnRpdHlTZXRgIGlmIHN1Y2Nlc3NmdWwuIHNldF9zdWJzBAEQc3Vic4UDAWRWZWM8KFQ6OkFjY291bnRJZCwgRGF0YSk+AAIkjFNldCB0aGUgc3ViLWFjY291bnRzIG9mIHRoZSBzZW5kZXIuAFUBUGF5bWVudDogQW55IGFnZ3JlZ2F0ZSBiYWxhbmNlIHJlc2VydmVkIGJ5IHByZXZpb3VzIGBzZXRfc3Vic2AgY2FsbHMgd2lsbCBiZSByZXR1cm5lZC0BYW5kIGFuIGFtb3VudCBgU3ViQWNjb3VudERlcG9zaXRgIHdpbGwgYmUgcmVzZXJ2ZWQgZm9yIGVhY2ggaXRlbSBpbiBgc3Vic2AuAGEBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8gYW5kIHRoZSBzZW5kZXIgbXVzdCBoYXZlIGEgcmVnaXN0ZXJlZCRpZGVudGl0eS4AsC0gYHN1YnNgOiBUaGUgaWRlbnRpdHkncyAobmV3KSBzdWItYWNjb3VudHMuOGNsZWFyX2lkZW50aXR5AAMgOQFDbGVhciBhbiBhY2NvdW50J3MgaWRlbnRpdHkgaW5mbyBhbmQgYWxsIHN1Yi1hY2NvdW50cyBhbmQgcmV0dXJuIGFsbCBkZXBvc2l0cy4A7FBheW1lbnQ6IEFsbCByZXNlcnZlZCBiYWxhbmNlcyBvbiB0aGUgYWNjb3VudCBhcmUgcmV0dXJuZWQuAGEBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8gYW5kIHRoZSBzZW5kZXIgbXVzdCBoYXZlIGEgcmVnaXN0ZXJlZCRpZGVudGl0eS4AmEVtaXRzIGBJZGVudGl0eUNsZWFyZWRgIGlmIHN1Y2Nlc3NmdWwuRHJlcXVlc3RfanVkZ2VtZW50CAEkcmVnX2luZGV4yQEBOFJlZ2lzdHJhckluZGV4AAEcbWF4X2ZlZf0BATBCYWxhbmNlT2Y8VD4ABECUUmVxdWVzdCBhIGp1ZGdlbWVudCBmcm9tIGEgcmVnaXN0cmFyLgBVAVBheW1lbnQ6IEF0IG1vc3QgYG1heF9mZWVgIHdpbGwgYmUgcmVzZXJ2ZWQgZm9yIHBheW1lbnQgdG8gdGhlIHJlZ2lzdHJhciBpZiBqdWRnZW1lbnQYZ2l2ZW4uADUBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8gYW5kIHRoZSBzZW5kZXIgbXVzdCBoYXZlIGFQcmVnaXN0ZXJlZCBpZGVudGl0eS4AHQEtIGByZWdfaW5kZXhgOiBUaGUgaW5kZXggb2YgdGhlIHJlZ2lzdHJhciB3aG9zZSBqdWRnZW1lbnQgaXMgcmVxdWVzdGVkLlUBLSBgbWF4X2ZlZWA6IFRoZSBtYXhpbXVtIGZlZSB0aGF0IG1heSBiZSBwYWlkLiBUaGlzIHNob3VsZCBqdXN0IGJlIGF1dG8tcG9wdWxhdGVkIGFzOgAwYGBgbm9jb21waWxlyFJlZ2lzdHJhcnM6OjxUPjo6Z2V0KCkuZ2V0KHJlZ19pbmRleCkudW53cmFwKCkuZmVlDGBgYACkRW1pdHMgYEp1ZGdlbWVudFJlcXVlc3RlZGAgaWYgc3VjY2Vzc2Z1bC44Y2FuY2VsX3JlcXVlc3QEASRyZWdfaW5kZXgQAThSZWdpc3RyYXJJbmRleAAFKGhDYW5jZWwgYSBwcmV2aW91cyByZXF1ZXN0LgD4UGF5bWVudDogQSBwcmV2aW91c2x5IHJlc2VydmVkIGRlcG9zaXQgaXMgcmV0dXJuZWQgb24gc3VjY2Vzcy4ANQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXyBhbmQgdGhlIHNlbmRlciBtdXN0IGhhdmUgYVByZWdpc3RlcmVkIGlkZW50aXR5LgBFAS0gYHJlZ19pbmRleGA6IFRoZSBpbmRleCBvZiB0aGUgcmVnaXN0cmFyIHdob3NlIGp1ZGdlbWVudCBpcyBubyBsb25nZXIgcmVxdWVzdGVkLgCsRW1pdHMgYEp1ZGdlbWVudFVucmVxdWVzdGVkYCBpZiBzdWNjZXNzZnVsLhxzZXRfZmVlCAEUaW5kZXjJAQE4UmVnaXN0cmFySW5kZXgAAQxmZWX9AQEwQmFsYW5jZU9mPFQ+AAYcGQFTZXQgdGhlIGZlZSByZXF1aXJlZCBmb3IgYSBqdWRnZW1lbnQgdG8gYmUgcmVxdWVzdGVkIGZyb20gYSByZWdpc3RyYXIuAFUBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8gYW5kIHRoZSBzZW5kZXIgbXVzdCBiZSB0aGUgYWNjb3VudKBvZiB0aGUgcmVnaXN0cmFyIHdob3NlIGluZGV4IGlzIGBpbmRleGAuAPQtIGBpbmRleGA6IHRoZSBpbmRleCBvZiB0aGUgcmVnaXN0cmFyIHdob3NlIGZlZSBpcyB0byBiZSBzZXQuVC0gYGZlZWA6IHRoZSBuZXcgZmVlLjhzZXRfYWNjb3VudF9pZAgBFGluZGV4yQEBOFJlZ2lzdHJhckluZGV4AAEMbmV37QEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAccvENoYW5nZSB0aGUgYWNjb3VudCBhc3NvY2lhdGVkIHdpdGggYSByZWdpc3RyYXIuAFUBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8gYW5kIHRoZSBzZW5kZXIgbXVzdCBiZSB0aGUgYWNjb3VudKBvZiB0aGUgcmVnaXN0cmFyIHdob3NlIGluZGV4IGlzIGBpbmRleGAuAPQtIGBpbmRleGA6IHRoZSBpbmRleCBvZiB0aGUgcmVnaXN0cmFyIHdob3NlIGZlZSBpcyB0byBiZSBzZXQucC0gYG5ld2A6IHRoZSBuZXcgYWNjb3VudCBJRC4oc2V0X2ZpZWxkcwgBFGluZGV4yQEBOFJlZ2lzdHJhckluZGV4AAEYZmllbGRzMAEpATxUOjpJZGVudGl0eUluZm9ybWF0aW9uIGFzIElkZW50aXR5SW5mb3JtYXRpb25Qcm92aWRlcj46OgpGaWVsZHNJZGVudGlmaWVyAAgcqFNldCB0aGUgZmllbGQgaW5mb3JtYXRpb24gZm9yIGEgcmVnaXN0cmFyLgBVAVRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfIGFuZCB0aGUgc2VuZGVyIG11c3QgYmUgdGhlIGFjY291bnSgb2YgdGhlIHJlZ2lzdHJhciB3aG9zZSBpbmRleCBpcyBgaW5kZXhgLgD0LSBgaW5kZXhgOiB0aGUgaW5kZXggb2YgdGhlIHJlZ2lzdHJhciB3aG9zZSBmZWUgaXMgdG8gYmUgc2V0Lg0BLSBgZmllbGRzYDogdGhlIGZpZWxkcyB0aGF0IHRoZSByZWdpc3RyYXIgY29uY2VybnMgdGhlbXNlbHZlcyB3aXRoLkRwcm92aWRlX2p1ZGdlbWVudBABJHJlZ19pbmRleMkBAThSZWdpc3RyYXJJbmRleAABGHRhcmdldO0BAVBBY2NvdW50SWRMb29rdXBPZjxUPgABJGp1ZGdlbWVudI0DAVxKdWRnZW1lbnQ8QmFsYW5jZU9mPFQ+PgABIGlkZW50aXR5NAEcVDo6SGFzaAAJPLhQcm92aWRlIGEganVkZ2VtZW50IGZvciBhbiBhY2NvdW50J3MgaWRlbnRpdHkuAFUBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8gYW5kIHRoZSBzZW5kZXIgbXVzdCBiZSB0aGUgYWNjb3VudLBvZiB0aGUgcmVnaXN0cmFyIHdob3NlIGluZGV4IGlzIGByZWdfaW5kZXhgLgAhAS0gYHJlZ19pbmRleGA6IHRoZSBpbmRleCBvZiB0aGUgcmVnaXN0cmFyIHdob3NlIGp1ZGdlbWVudCBpcyBiZWluZyBtYWRlLlUBLSBgdGFyZ2V0YDogdGhlIGFjY291bnQgd2hvc2UgaWRlbnRpdHkgdGhlIGp1ZGdlbWVudCBpcyB1cG9uLiBUaGlzIG11c3QgYmUgYW4gYWNjb3VudHQgIHdpdGggYSByZWdpc3RlcmVkIGlkZW50aXR5LkkBLSBganVkZ2VtZW50YDogdGhlIGp1ZGdlbWVudCBvZiB0aGUgcmVnaXN0cmFyIG9mIGluZGV4IGByZWdfaW5kZXhgIGFib3V0IGB0YXJnZXRgLl0BLSBgaWRlbnRpdHlgOiBUaGUgaGFzaCBvZiB0aGUgW2BJZGVudGl0eUluZm9ybWF0aW9uUHJvdmlkZXJgXSBmb3IgdGhhdCB0aGUganVkZ2VtZW50IGlzLCAgcHJvdmlkZWQuALBOb3RlOiBKdWRnZW1lbnRzIGRvIG5vdCBhcHBseSB0byBhIHVzZXJuYW1lLgCURW1pdHMgYEp1ZGdlbWVudEdpdmVuYCBpZiBzdWNjZXNzZnVsLjRraWxsX2lkZW50aXR5BAEYdGFyZ2V07QEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAowQQFSZW1vdmUgYW4gYWNjb3VudCdzIGlkZW50aXR5IGFuZCBzdWItYWNjb3VudCBpbmZvcm1hdGlvbiBhbmQgc2xhc2ggdGhlIGRlcG9zaXRzLgBhAVBheW1lbnQ6IFJlc2VydmVkIGJhbGFuY2VzIGZyb20gYHNldF9zdWJzYCBhbmQgYHNldF9pZGVudGl0eWAgYXJlIHNsYXNoZWQgYW5kIGhhbmRsZWQgYnlFAWBTbGFzaGAuIFZlcmlmaWNhdGlvbiByZXF1ZXN0IGRlcG9zaXRzIGFyZSBub3QgcmV0dXJuZWQ7IHRoZXkgc2hvdWxkIGJlIGNhbmNlbGxlZIBtYW51YWxseSB1c2luZyBgY2FuY2VsX3JlcXVlc3RgLgD4VGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgbWF0Y2ggYFQ6OkZvcmNlT3JpZ2luYC4AVQEtIGB0YXJnZXRgOiB0aGUgYWNjb3VudCB3aG9zZSBpZGVudGl0eSB0aGUganVkZ2VtZW50IGlzIHVwb24uIFRoaXMgbXVzdCBiZSBhbiBhY2NvdW50dCAgd2l0aCBhIHJlZ2lzdGVyZWQgaWRlbnRpdHkuAJRFbWl0cyBgSWRlbnRpdHlLaWxsZWRgIGlmIHN1Y2Nlc3NmdWwuHGFkZF9zdWIIAQxzdWLtAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AARBkYXRhBQMBEERhdGEACxysQWRkIHRoZSBnaXZlbiBhY2NvdW50IHRvIHRoZSBzZW5kZXIncyBzdWJzLgBdAVBheW1lbnQ6IEJhbGFuY2UgcmVzZXJ2ZWQgYnkgYSBwcmV2aW91cyBgc2V0X3N1YnNgIGNhbGwgZm9yIG9uZSBzdWIgd2lsbCBiZSByZXBhdHJpYXRlZDh0byB0aGUgc2VuZGVyLgBhAVRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfIGFuZCB0aGUgc2VuZGVyIG11c3QgaGF2ZSBhIHJlZ2lzdGVyZWRYc3ViIGlkZW50aXR5IG9mIGBzdWJgLihyZW5hbWVfc3ViCAEMc3Vi7QEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEQZGF0YQUDARBEYXRhAAwQzEFsdGVyIHRoZSBhc3NvY2lhdGVkIG5hbWUgb2YgdGhlIGdpdmVuIHN1Yi1hY2NvdW50LgBhAVRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfIGFuZCB0aGUgc2VuZGVyIG11c3QgaGF2ZSBhIHJlZ2lzdGVyZWRYc3ViIGlkZW50aXR5IG9mIGBzdWJgLihyZW1vdmVfc3ViBAEMc3Vi7QEBUEFjY291bnRJZExvb2t1cE9mPFQ+AA0cwFJlbW92ZSB0aGUgZ2l2ZW4gYWNjb3VudCBmcm9tIHRoZSBzZW5kZXIncyBzdWJzLgBdAVBheW1lbnQ6IEJhbGFuY2UgcmVzZXJ2ZWQgYnkgYSBwcmV2aW91cyBgc2V0X3N1YnNgIGNhbGwgZm9yIG9uZSBzdWIgd2lsbCBiZSByZXBhdHJpYXRlZDh0byB0aGUgc2VuZGVyLgBhAVRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfIGFuZCB0aGUgc2VuZGVyIG11c3QgaGF2ZSBhIHJlZ2lzdGVyZWRYc3ViIGlkZW50aXR5IG9mIGBzdWJgLiBxdWl0X3N1YgAOKIxSZW1vdmUgdGhlIHNlbmRlciBhcyBhIHN1Yi1hY2NvdW50LgBdAVBheW1lbnQ6IEJhbGFuY2UgcmVzZXJ2ZWQgYnkgYSBwcmV2aW91cyBgc2V0X3N1YnNgIGNhbGwgZm9yIG9uZSBzdWIgd2lsbCBiZSByZXBhdHJpYXRlZLR0byB0aGUgc2VuZGVyICgqbm90KiB0aGUgb3JpZ2luYWwgZGVwb3NpdG9yKS4AYQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXyBhbmQgdGhlIHNlbmRlciBtdXN0IGhhdmUgYSByZWdpc3RlcmVkPHN1cGVyLWlkZW50aXR5LgBFAU5PVEU6IFRoaXMgc2hvdWxkIG5vdCBub3JtYWxseSBiZSB1c2VkLCBidXQgaXMgcHJvdmlkZWQgaW4gdGhlIGNhc2UgdGhhdCB0aGUgbm9uLREBY29udHJvbGxlciBvZiBhbiBhY2NvdW50IGlzIG1hbGljaW91c2x5IHJlZ2lzdGVyZWQgYXMgYSBzdWItYWNjb3VudC5YYWRkX3VzZXJuYW1lX2F1dGhvcml0eQwBJGF1dGhvcml0ee0BAVBBY2NvdW50SWRMb29rdXBPZjxUPgABGHN1ZmZpeDgBHFZlYzx1OD4AAShhbGxvY2F0aW9uEAEMdTMyAA8UVQFBZGQgYW4gYEFjY291bnRJZGAgd2l0aCBwZXJtaXNzaW9uIHRvIGdyYW50IHVzZXJuYW1lcyB3aXRoIGEgZ2l2ZW4gYHN1ZmZpeGAgYXBwZW5kZWQuAEUBVGhlIGF1dGhvcml0eSBjYW4gZ3JhbnQgdXAgdG8gYGFsbG9jYXRpb25gIHVzZXJuYW1lcy4gVG8gdG9wIHVwIHRoZSBhbGxvY2F0aW9uIG9ySQFjaGFuZ2UgdGhlIGFjY291bnQgdXNlZCB0byBncmFudCB1c2VybmFtZXMsIHRoaXMgY2FsbCBjYW4gYmUgdXNlZCB3aXRoIHRoZSB1cGRhdGVkzHBhcmFtZXRlcnMgdG8gb3ZlcndyaXRlIHRoZSBleGlzdGluZyBjb25maWd1cmF0aW9uLmRyZW1vdmVfdXNlcm5hbWVfYXV0aG9yaXR5CAEYc3VmZml4OAEcVmVjPHU4PgABJGF1dGhvcml0ee0BAVBBY2NvdW50SWRMb29rdXBPZjxUPgAQBMRSZW1vdmUgYGF1dGhvcml0eWAgZnJvbSB0aGUgdXNlcm5hbWUgYXV0aG9yaXRpZXMuQHNldF91c2VybmFtZV9mb3IQAQx3aG/tAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AASB1c2VybmFtZTgBHFZlYzx1OD4AASRzaWduYXR1cmWRAwFwT3B0aW9uPFQ6Ok9mZmNoYWluU2lnbmF0dXJlPgABOHVzZV9hbGxvY2F0aW9uIAEQYm9vbAARNA0BU2V0IHRoZSB1c2VybmFtZSBmb3IgYHdob2AuIE11c3QgYmUgY2FsbGVkIGJ5IGEgdXNlcm5hbWUgYXV0aG9yaXR5LgBZAUlmIGB1c2VfYWxsb2NhdGlvbmAgaXMgc2V0LCB0aGUgYXV0aG9yaXR5IG11c3QgaGF2ZSBhIHVzZXJuYW1lIGFsbG9jYXRpb24gYXZhaWxhYmxlIHRvRQFzcGVuZC4gT3RoZXJ3aXNlLCB0aGUgYXV0aG9yaXR5IHdpbGwgbmVlZCB0byBwdXQgdXAgYSBkZXBvc2l0IGZvciByZWdpc3RlcmluZyB0aGUkdXNlcm5hbWUuALBVc2VycyBjYW4gZWl0aGVyIHByZS1zaWduIHRoZWlyIHVzZXJuYW1lcyBvckhhY2NlcHQgdGhlbSBsYXRlci4APFVzZXJuYW1lcyBtdXN0OtggIC0gT25seSBjb250YWluIGxvd2VyY2FzZSBBU0NJSSBjaGFyYWN0ZXJzIG9yIGRpZ2l0cy41ASAgLSBXaGVuIGNvbWJpbmVkIHdpdGggdGhlIHN1ZmZpeCBvZiB0aGUgaXNzdWluZyBhdXRob3JpdHkgYmUgX2xlc3MgdGhhbl8gdGhlYCAgICBgTWF4VXNlcm5hbWVMZW5ndGhgLjxhY2NlcHRfdXNlcm5hbWUEASB1c2VybmFtZQ0BASxVc2VybmFtZTxUPgASCE0BQWNjZXB0IGEgZ2l2ZW4gdXNlcm5hbWUgdGhhdCBhbiBgYXV0aG9yaXR5YCBncmFudGVkLiBUaGUgY2FsbCBtdXN0IGluY2x1ZGUgdGhlIGZ1bGyIdXNlcm5hbWUsIGFzIGluIGB1c2VybmFtZS5zdWZmaXhgLlxyZW1vdmVfZXhwaXJlZF9hcHByb3ZhbAQBIHVzZXJuYW1lDQEBLFVzZXJuYW1lPFQ+ABMMYQFSZW1vdmUgYW4gZXhwaXJlZCB1c2VybmFtZSBhcHByb3ZhbC4gVGhlIHVzZXJuYW1lIHdhcyBhcHByb3ZlZCBieSBhbiBhdXRob3JpdHkgYnV0IG5ldmVyVQFhY2NlcHRlZCBieSB0aGUgdXNlciBhbmQgbXVzdCBub3cgYmUgYmV5b25kIGl0cyBleHBpcmF0aW9uLiBUaGUgY2FsbCBtdXN0IGluY2x1ZGUgdGhlnGZ1bGwgdXNlcm5hbWUsIGFzIGluIGB1c2VybmFtZS5zdWZmaXhgLlBzZXRfcHJpbWFyeV91c2VybmFtZQQBIHVzZXJuYW1lDQEBLFVzZXJuYW1lPFQ+ABQEMQFTZXQgYSBnaXZlbiB1c2VybmFtZSBhcyB0aGUgcHJpbWFyeS4gVGhlIHVzZXJuYW1lIHNob3VsZCBpbmNsdWRlIHRoZSBzdWZmaXguPHVuYmluZF91c2VybmFtZQQBIHVzZXJuYW1lDQEBLFVzZXJuYW1lPFQ+ABUMWQFTdGFydCB0aGUgcHJvY2VzcyBvZiByZW1vdmluZyBhIHVzZXJuYW1lIGJ5IHBsYWNpbmcgaXQgaW4gdGhlIHVuYmluZGluZyB1c2VybmFtZXMgbWFwLiEBT25jZSB0aGUgZ3JhY2UgcGVyaW9kIGhhcyBwYXNzZWQsIHRoZSB1c2VybmFtZSBjYW4gYmUgZGVsZXRlZCBieSBjYWxsaW5nwFtyZW1vdmVfdXNlcm5hbWVdKGNyYXRlOjpDYWxsOjpyZW1vdmVfdXNlcm5hbWUpLjxyZW1vdmVfdXNlcm5hbWUEASB1c2VybmFtZQ0BASxVc2VybmFtZTxUPgAWCGEBUGVybWFuZW50bHkgZGVsZXRlIGEgdXNlcm5hbWUgd2hpY2ggaGFzIGJlZW4gdW5iaW5kaW5nIGZvciBsb25nZXIgdGhhbiB0aGUgZ3JhY2UgcGVyaW9kLkkBQ2FsbGVyIGlzIHJlZnVuZGVkIHRoZSBmZWUgaWYgdGhlIHVzZXJuYW1lIGV4cGlyZWQgYW5kIHRoZSByZW1vdmFsIHdhcyBzdWNjZXNzZnVsLjRraWxsX3VzZXJuYW1lBAEgdXNlcm5hbWUNAQEsVXNlcm5hbWU8VD4AFwhdAUNhbGwgd2l0aCBbRm9yY2VPcmlnaW5dKGNyYXRlOjpDb25maWc6OkZvcmNlT3JpZ2luKSBwcml2aWxlZ2VzIHdoaWNoIGRlbGV0ZXMgYSB1c2VybmFtZaxhbmQgc2xhc2hlcyBhbnkgZGVwb3NpdCBhc3NvY2lhdGVkIHdpdGggaXQuBHBJZGVudGl0eSBwYWxsZXQgZGVjbGFyYXRpb24u+QIMPHBhbGxldF9pZGVudGl0eRhsZWdhY3kwSWRlbnRpdHlJbmZvBChGaWVsZExpbWl0AAAkAShhZGRpdGlvbmFs/QIBkEJvdW5kZWRWZWM8KERhdGEsIERhdGEpLCBGaWVsZExpbWl0PgABHGRpc3BsYXkFAwEQRGF0YQABFGxlZ2FsBQMBEERhdGEAAQx3ZWIFAwEQRGF0YQABEHJpb3QFAwEQRGF0YQABFGVtYWlsBQMBEERhdGEAATxwZ3BfZmluZ2VycHJpbnSBAwFAT3B0aW9uPFt1ODsgMjBdPgABFGltYWdlBQMBEERhdGEAARx0d2l0dGVyBQMBEERhdGEAAP0CDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBAQMEUwAABAB9AwEYVmVjPFQ+AAABAwAABAgFAwUDAAUDDDxwYWxsZXRfaWRlbnRpdHkUdHlwZXMQRGF0YQABmBBOb25lAAAAEFJhdzAEAAkDAAABABBSYXcxBAANAwAAAgAQUmF3MgQAEQMAAAMAEFJhdzMEABUDAAAEABBSYXc0BABIAAAFABBSYXc1BAAZAwAABgAQUmF3NgQAHQMAAAcAEFJhdzcEACEDAAAIABBSYXc4BAAlAwAACQAQUmF3OQQAKQMAAAoAFFJhdzEwBAAtAwAACwAUUmF3MTEEADEDAAAMABRSYXcxMgQANQMAAA0AFFJhdzEzBAA5AwAADgAUUmF3MTQEAD0DAAAPABRSYXcxNQQAQQMAABAAFFJhdzE2BACwAAARABRSYXcxNwQARQMAABIAFFJhdzE4BABJAwAAEwAUUmF3MTkEAE0DAAAUABRSYXcyMAQA9QEAABUAFFJhdzIxBABRAwAAFgAUUmF3MjIEAFUDAAAXABRSYXcyMwQAWQMAABgAFFJhdzI0BABdAwAAGQAUUmF3MjUEAGEDAAAaABRSYXcyNgQAZQMAABsAFFJhdzI3BABpAwAAHAAUUmF3MjgEAG0DAAAdABRSYXcyOQQAcQMAAB4AFFJhdzMwBAB1AwAAHwAUUmF3MzEEAHkDAAAgABRSYXczMgQABAAAIQAsQmxha2VUd28yNTYEAAQAACIAGFNoYTI1NgQABAAAIwAkS2VjY2FrMjU2BAAEAAAkACxTaGFUaHJlZTI1NgQABAAAJQAACQMAAAMAAAAACAANAwAAAwEAAAAIABEDAAADAgAAAAgAFQMAAAMDAAAACAAZAwAAAwUAAAAIAB0DAAADBgAAAAgAIQMAAAMHAAAACAAlAwAAAwgAAAAIACkDAAADCQAAAAgALQMAAAMKAAAACAAxAwAAAwsAAAAIADUDAAADDAAAAAgAOQMAAAMNAAAACAA9AwAAAw4AAAAIAEEDAAADDwAAAAgARQMAAAMRAAAACABJAwAAAxIAAAAIAE0DAAADEwAAAAgAUQMAAAMVAAAACABVAwAAAxYAAAAIAFkDAAADFwAAAAgAXQMAAAMYAAAACABhAwAAAxkAAAAIAGUDAAADGgAAAAgAaQMAAAMbAAAACABtAwAAAxwAAAAIAHEDAAADHQAAAAgAdQMAAAMeAAAACAB5AwAAAx8AAAAIAH0DAAACAQMAgQMEGE9wdGlvbgQEVAH1AQEIEE5vbmUAAAAQU29tZQQA9QEAAAEAAIUDAAACiQMAiQMAAAQIAAUDAI0DDDxwYWxsZXRfaWRlbnRpdHkUdHlwZXMkSnVkZ2VtZW50BBxCYWxhbmNlARgBHBxVbmtub3duAAAAHEZlZVBhaWQEABgBHEJhbGFuY2UAAQAoUmVhc29uYWJsZQACACRLbm93bkdvb2QAAwAkT3V0T2ZEYXRlAAQAKExvd1F1YWxpdHkABQAkRXJyb25lb3VzAAYAAJEDBBhPcHRpb24EBFQBlQMBCBBOb25lAAAAEFNvbWUEAJUDAAABAACVAwgoc3BfcnVudGltZThNdWx0aVNpZ25hdHVyZQABDBxFZDI1NTE5BACFAgFIZWQyNTUxOTo6U2lnbmF0dXJlAAAAHFNyMjU1MTkEAIUCAUhzcjI1NTE5OjpTaWduYXR1cmUAAQAURWNkc2EEAJkDAUBlY2RzYTo6U2lnbmF0dXJlAAIAAJkDAAADQQAAAAgAnQMMPHBhbGxldF9yZWNvdmVyeRhwYWxsZXQQQ2FsbAQEVAABKDBhc19yZWNvdmVyZWQIARxhY2NvdW507QEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEQY2FsbKkBAXxCb3g8PFQgYXMgQ29uZmlnPjo6UnVudGltZUNhbGw+AAAgoFNlbmQgYSBjYWxsIHRocm91Z2ggYSByZWNvdmVyZWQgYWNjb3VudC4AEQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXyBhbmQgcmVnaXN0ZXJlZCB0b+RiZSBhYmxlIHRvIG1ha2UgY2FsbHMgb24gYmVoYWxmIG9mIHRoZSByZWNvdmVyZWQgYWNjb3VudC4ALFBhcmFtZXRlcnM6IQEtIGBhY2NvdW50YDogVGhlIHJlY292ZXJlZCBhY2NvdW50IHlvdSB3YW50IHRvIG1ha2UgYSBjYWxsIG9uLWJlaGFsZi1vZi78LSBgY2FsbGA6IFRoZSBjYWxsIHlvdSB3YW50IHRvIG1ha2Ugd2l0aCB0aGUgcmVjb3ZlcmVkIGFjY291bnQuNHNldF9yZWNvdmVyZWQIARBsb3N07QEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEccmVzY3Vlcu0BAVBBY2NvdW50SWRMb29rdXBPZjxUPgABIA0BQWxsb3cgUk9PVCB0byBieXBhc3MgdGhlIHJlY292ZXJ5IHByb2Nlc3MgYW5kIHNldCBhIHJlc2N1ZXIgYWNjb3VudHBmb3IgYSBsb3N0IGFjY291bnQgZGlyZWN0bHkuAMRUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfUk9PVF8uACxQYXJhbWV0ZXJzOrQtIGBsb3N0YDogVGhlICJsb3N0IGFjY291bnQiIHRvIGJlIHJlY292ZXJlZC4ZAS0gYHJlc2N1ZXJgOiBUaGUgInJlc2N1ZXIgYWNjb3VudCIgd2hpY2ggY2FuIGNhbGwgYXMgdGhlIGxvc3QgYWNjb3VudC48Y3JlYXRlX3JlY292ZXJ5DAEcZnJpZW5kcwECAURWZWM8VDo6QWNjb3VudElkPgABJHRocmVzaG9sZEEBAQx1MTYAATBkZWxheV9wZXJpb2QQAXBCbG9ja051bWJlckZyb21Qcm92aWRlck9mPFQ+AAJAWQFDcmVhdGUgYSByZWNvdmVyeSBjb25maWd1cmF0aW9uIGZvciB5b3VyIGFjY291bnQuIFRoaXMgbWFrZXMgeW91ciBhY2NvdW50IHJlY292ZXJhYmxlLgAtAVBheW1lbnQ6IGBDb25maWdEZXBvc2l0QmFzZWAgKyBgRnJpZW5kRGVwb3NpdEZhY3RvcmAgKiAjX29mX2ZyaWVuZHMgYmFsYW5jZUUBd2lsbCBiZSByZXNlcnZlZCBmb3Igc3RvcmluZyB0aGUgcmVjb3ZlcnkgY29uZmlndXJhdGlvbi4gVGhpcyBkZXBvc2l0IGlzIHJldHVybmVkuGluIGZ1bGwgd2hlbiB0aGUgdXNlciBjYWxscyBgcmVtb3ZlX3JlY292ZXJ5YC4AzFRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfLgAsUGFyYW1ldGVyczpJAS0gYGZyaWVuZHNgOiBBIGxpc3Qgb2YgZnJpZW5kcyB5b3UgdHJ1c3QgdG8gdm91Y2ggZm9yIHJlY292ZXJ5IGF0dGVtcHRzLiBTaG91bGQgYmWoICBvcmRlcmVkIGFuZCBjb250YWluIG5vIGR1cGxpY2F0ZSB2YWx1ZXMuWQEtIGB0aHJlc2hvbGRgOiBUaGUgbnVtYmVyIG9mIGZyaWVuZHMgdGhhdCBtdXN0IHZvdWNoIGZvciBhIHJlY292ZXJ5IGF0dGVtcHQgYmVmb3JlIHRoZVUBICBhY2NvdW50IGNhbiBiZSByZWNvdmVyZWQuIFNob3VsZCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGxlbmd0aCBvZiB0aGUgbGlzdCBvZiggIGZyaWVuZHMuTQEtIGBkZWxheV9wZXJpb2RgOiBUaGUgbnVtYmVyIG9mIGJsb2NrcyBhZnRlciBhIHJlY292ZXJ5IGF0dGVtcHQgaXMgaW5pdGlhbGl6ZWQgdGhhdNAgIG5lZWRzIHRvIHBhc3MgYmVmb3JlIHRoZSBhY2NvdW50IGNhbiBiZSByZWNvdmVyZWQuRGluaXRpYXRlX3JlY292ZXJ5BAEcYWNjb3VudO0BAVBBY2NvdW50SWRMb29rdXBPZjxUPgADLOhJbml0aWF0ZSB0aGUgcHJvY2VzcyBmb3IgcmVjb3ZlcmluZyBhIHJlY292ZXJhYmxlIGFjY291bnQuABkBUGF5bWVudDogYFJlY292ZXJ5RGVwb3NpdGAgYmFsYW5jZSB3aWxsIGJlIHJlc2VydmVkIGZvciBpbml0aWF0aW5nIHRoZSEBcmVjb3ZlcnkgcHJvY2Vzcy4gVGhpcyBkZXBvc2l0IHdpbGwgYWx3YXlzIGJlIHJlcGF0cmlhdGVkIHRvIHRoZSBhY2NvdW50tHRyeWluZyB0byBiZSByZWNvdmVyZWQuIFNlZSBgY2xvc2VfcmVjb3ZlcnlgLgDMVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uACxQYXJhbWV0ZXJzOkEBLSBgYWNjb3VudGA6IFRoZSBsb3N0IGFjY291bnQgdGhhdCB5b3Ugd2FudCB0byByZWNvdmVyLiBUaGlzIGFjY291bnQgbmVlZHMgdG8gYmXMICByZWNvdmVyYWJsZSAoaS5lLiBoYXZlIGEgcmVjb3ZlcnkgY29uZmlndXJhdGlvbikuOHZvdWNoX3JlY292ZXJ5CAEQbG9zdO0BAVBBY2NvdW50SWRMb29rdXBPZjxUPgABHHJlc2N1ZXLtAQFQQWNjb3VudElkTG9va3VwT2Y8VD4ABDAlAUFsbG93IGEgImZyaWVuZCIgb2YgYSByZWNvdmVyYWJsZSBhY2NvdW50IHRvIHZvdWNoIGZvciBhbiBhY3RpdmUgcmVjb3ZlcnlkcHJvY2VzcyBmb3IgdGhhdCBhY2NvdW50LgAlAVRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfIGFuZCBtdXN0IGJlIGEgImZyaWVuZCJwZm9yIHRoZSByZWNvdmVyYWJsZSBhY2NvdW50LgAsUGFyYW1ldGVyczrQLSBgbG9zdGA6IFRoZSBsb3N0IGFjY291bnQgdGhhdCB5b3Ugd2FudCB0byByZWNvdmVyLlkBLSBgcmVzY3VlcmA6IFRoZSBhY2NvdW50IHRyeWluZyB0byByZXNjdWUgdGhlIGxvc3QgYWNjb3VudCB0aGF0IHlvdSB3YW50IHRvIHZvdWNoIGZvci4AIQFUaGUgY29tYmluYXRpb24gb2YgdGhlc2UgdHdvIHBhcmFtZXRlcnMgbXVzdCBwb2ludCB0byBhbiBhY3RpdmUgcmVjb3ZlcnkgcHJvY2Vzcy44Y2xhaW1fcmVjb3ZlcnkEARxhY2NvdW507QEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAUk8EFsbG93IGEgc3VjY2Vzc2Z1bCByZXNjdWVyIHRvIGNsYWltIHRoZWlyIHJlY292ZXJlZCBhY2NvdW50LgApAVRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfIGFuZCBtdXN0IGJlIGEgInJlc2N1ZXIiGQF3aG8gaGFzIHN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQgdGhlIGFjY291bnQgcmVjb3ZlcnkgcHJvY2VzczogY29sbGVjdGVkLQFgdGhyZXNob2xkYCBvciBtb3JlIHZvdWNoZXMsIHdhaXRlZCBgZGVsYXlfcGVyaW9kYCBibG9ja3Mgc2luY2UgaW5pdGlhdGlvbi4ALFBhcmFtZXRlcnM6XQEtIGBhY2NvdW50YDogVGhlIGxvc3QgYWNjb3VudCB0aGF0IHlvdSB3YW50IHRvIGNsYWltIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSByZWNvdmVyZWQgYnkYICB5b3UuOGNsb3NlX3JlY292ZXJ5BAEccmVzY3Vlcu0BAVBBY2NvdW50SWRMb29rdXBPZjxUPgAGLBEBQXMgdGhlIGNvbnRyb2xsZXIgb2YgYSByZWNvdmVyYWJsZSBhY2NvdW50LCBjbG9zZSBhbiBhY3RpdmUgcmVjb3ZlcnlkcHJvY2VzcyBmb3IgeW91ciBhY2NvdW50LgAdAVBheW1lbnQ6IEJ5IGNhbGxpbmcgdGhpcyBmdW5jdGlvbiwgdGhlIHJlY292ZXJhYmxlIGFjY291bnQgd2lsbCByZWNlaXZl9HRoZSByZWNvdmVyeSBkZXBvc2l0IGBSZWNvdmVyeURlcG9zaXRgIHBsYWNlZCBieSB0aGUgcmVzY3Vlci4AAQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXyBhbmQgbXVzdCBiZSBh7HJlY292ZXJhYmxlIGFjY291bnQgd2l0aCBhbiBhY3RpdmUgcmVjb3ZlcnkgcHJvY2VzcyBmb3IgaXQuACxQYXJhbWV0ZXJzOg0BLSBgcmVzY3VlcmA6IFRoZSBhY2NvdW50IHRyeWluZyB0byByZXNjdWUgdGhpcyByZWNvdmVyYWJsZSBhY2NvdW50LjxyZW1vdmVfcmVjb3ZlcnkAByxZAVJlbW92ZSB0aGUgcmVjb3ZlcnkgcHJvY2VzcyBmb3IgeW91ciBhY2NvdW50LiBSZWNvdmVyZWQgYWNjb3VudHMgYXJlIHN0aWxsIGFjY2Vzc2libGUuABEBTk9URTogVGhlIHVzZXIgbXVzdCBtYWtlIHN1cmUgdG8gY2FsbCBgY2xvc2VfcmVjb3ZlcnlgIG9uIGFsbCBhY3RpdmUFAXJlY292ZXJ5IGF0dGVtcHRzIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gZWxzZSBpdCB3aWxsIGZhaWwuACEBUGF5bWVudDogQnkgY2FsbGluZyB0aGlzIGZ1bmN0aW9uIHRoZSByZWNvdmVyYWJsZSBhY2NvdW50IHdpbGwgdW5yZXNlcnZllHRoZWlyIHJlY292ZXJ5IGNvbmZpZ3VyYXRpb24gZGVwb3NpdC7wKGBDb25maWdEZXBvc2l0QmFzZWAgKyBgRnJpZW5kRGVwb3NpdEZhY3RvcmAgKiAjX29mX2ZyaWVuZHMpAAEBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8gYW5kIG11c3QgYmUgYeByZWNvdmVyYWJsZSBhY2NvdW50IChpLmUuIGhhcyBhIHJlY292ZXJ5IGNvbmZpZ3VyYXRpb24pLkBjYW5jZWxfcmVjb3ZlcmVkBAEcYWNjb3VudO0BAVBBY2NvdW50SWRMb29rdXBPZjxUPgAIHNxDYW5jZWwgdGhlIGFiaWxpdHkgdG8gdXNlIGBhc19yZWNvdmVyZWRgIGZvciBgYWNjb3VudGAuABEBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8gYW5kIHJlZ2lzdGVyZWQgdG/kYmUgYWJsZSB0byBtYWtlIGNhbGxzIG9uIGJlaGFsZiBvZiB0aGUgcmVjb3ZlcmVkIGFjY291bnQuACxQYXJhbWV0ZXJzOhUBLSBgYWNjb3VudGA6IFRoZSByZWNvdmVyZWQgYWNjb3VudCB5b3UgYXJlIGFibGUgdG8gY2FsbCBvbi1iZWhhbGYtb2YuMHBva2VfZGVwb3NpdAQBNG1heWJlX2FjY291bnShAwFwT3B0aW9uPEFjY291bnRJZExvb2t1cE9mPFQ+PgAJXBUBUG9rZSBkZXBvc2l0cyBmb3IgcmVjb3ZlcnkgY29uZmlndXJhdGlvbnMgYW5kIC8gb3IgYWN0aXZlIHJlY292ZXJpZXMuAA0BVGhpcyBjYW4gYmUgdXNlZCBieSBhY2NvdW50cyB0byBwb3NzaWJseSBsb3dlciB0aGVpciBsb2NrZWQgYW1vdW50LgDMVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uACxQYXJhbWV0ZXJzOlUBLSBgbWF5YmVfYWNjb3VudGA6IE9wdGlvbmFsIHJlY292ZXJhYmxlIGFjY291bnQgZm9yIHdoaWNoIHlvdSBoYXZlIGFuIGFjdGl2ZSByZWNvdmVyedxhbmQgd2FudCB0byBhZGp1c3QgdGhlIGRlcG9zaXQgZm9yIHRoZSBhY3RpdmUgcmVjb3ZlcnkuAFUBVGhpcyBmdW5jdGlvbiBjaGVja3MgYm90aCByZWNvdmVyeSBjb25maWd1cmF0aW9uIGRlcG9zaXQgYW5kIGFjdGl2ZSByZWNvdmVyeSBkZXBvc2l0czhvZiB0aGUgY2FsbGVyOlEBLSBJZiB0aGUgY2FsbGVyIGhhcyBjcmVhdGVkIGEgcmVjb3ZlcnkgY29uZmlndXJhdGlvbiwgY2hlY2tzIGFuZCBhZGp1c3RzIGl0cyBkZXBvc2l0QQEtIElmIHRoZSBjYWxsZXIgaGFzIGluaXRpYXRlZCBhbnkgYWN0aXZlIHJlY292ZXJpZXMsIGFuZCBwcm92aWRlcyB0aGUgYWNjb3VudCBpbshgbWF5YmVfYWNjb3VudGAsIGNoZWNrcyBhbmQgYWRqdXN0cyB0aG9zZSBkZXBvc2l0cwBdAUlmIGFueSBkZXBvc2l0IGlzIHVwZGF0ZWQsIHRoZSBkaWZmZXJlbmNlIHdpbGwgYmUgcmVzZXJ2ZWQvdW5yZXNlcnZlZCBmcm9tIHRoZSBjYWxsZXIncyBhY2NvdW50LgApAVRoZSB0cmFuc2FjdGlvbiBpcyBtYWRlIGZyZWUgaWYgYW55IGRlcG9zaXQgaXMgdXBkYXRlZCBhbmQgcGFpZCBvdGhlcndpc2UuALxFbWl0cyBgRGVwb3NpdFBva2VkYCBpZiBhbnkgZGVwb3NpdCBpcyB1cGRhdGVkLikBTXVsdGlwbGUgZXZlbnRzIG1heSBiZSBlbWl0dGVkIGluIGNhc2UgYm90aCB0eXBlcyBvZiBkZXBvc2l0cyBhcmUgdXBkYXRlZC4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMuoQMEGE9wdGlvbgQEVAHtAQEIEE5vbmUAAAAQU29tZQQA7QEAAAEAAKUDDDhwYWxsZXRfdmVzdGluZxhwYWxsZXQQQ2FsbAQEVAABGBB2ZXN0AAAkuFVubG9jayBhbnkgdmVzdGVkIGZ1bmRzIG9mIHRoZSBzZW5kZXIgYWNjb3VudC4AXQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXyBhbmQgdGhlIHNlbmRlciBtdXN0IGhhdmUgZnVuZHMgc3RpbGxkbG9ja2VkIHVuZGVyIHRoaXMgcGFsbGV0LgDQRW1pdHMgZWl0aGVyIGBWZXN0aW5nQ29tcGxldGVkYCBvciBgVmVzdGluZ1VwZGF0ZWRgLgA0IyMgQ29tcGxleGl0eSQtIGBPKDEpYC4odmVzdF9vdGhlcgQBGHRhcmdldO0BAVBBY2NvdW50SWRMb29rdXBPZjxUPgABLLhVbmxvY2sgYW55IHZlc3RlZCBmdW5kcyBvZiBhIGB0YXJnZXRgIGFjY291bnQuAMxUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXy4AUQEtIGB0YXJnZXRgOiBUaGUgYWNjb3VudCB3aG9zZSB2ZXN0ZWQgZnVuZHMgc2hvdWxkIGJlIHVubG9ja2VkLiBNdXN0IGhhdmUgZnVuZHMgc3RpbGxkbG9ja2VkIHVuZGVyIHRoaXMgcGFsbGV0LgDQRW1pdHMgZWl0aGVyIGBWZXN0aW5nQ29tcGxldGVkYCBvciBgVmVzdGluZ1VwZGF0ZWRgLgA0IyMgQ29tcGxleGl0eSQtIGBPKDEpYC48dmVzdGVkX3RyYW5zZmVyCAEYdGFyZ2V07QEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEgc2NoZWR1bGWpAwGwVmVzdGluZ0luZm88QmFsYW5jZU9mPFQ+LCBCbG9ja051bWJlckZvcjxUPj4AAjRkQ3JlYXRlIGEgdmVzdGVkIHRyYW5zZmVyLgDMVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uAMwtIGB0YXJnZXRgOiBUaGUgYWNjb3VudCByZWNlaXZpbmcgdGhlIHZlc3RlZCBmdW5kcy7wLSBgc2NoZWR1bGVgOiBUaGUgdmVzdGluZyBzY2hlZHVsZSBhdHRhY2hlZCB0byB0aGUgdHJhbnNmZXIuAFxFbWl0cyBgVmVzdGluZ0NyZWF0ZWRgLgD8Tk9URTogVGhpcyB3aWxsIHVubG9jayBhbGwgc2NoZWR1bGVzIHRocm91Z2ggdGhlIGN1cnJlbnQgYmxvY2suADQjIyBDb21wbGV4aXR5JC0gYE8oMSlgLlRmb3JjZV92ZXN0ZWRfdHJhbnNmZXIMARhzb3VyY2XtAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AARh0YXJnZXTtAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AASBzY2hlZHVsZakDAbBWZXN0aW5nSW5mbzxCYWxhbmNlT2Y8VD4sIEJsb2NrTnVtYmVyRm9yPFQ+PgADOGBGb3JjZSBhIHZlc3RlZCB0cmFuc2Zlci4AxFRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9Sb290Xy4A6C0gYHNvdXJjZWA6IFRoZSBhY2NvdW50IHdob3NlIGZ1bmRzIHNob3VsZCBiZSB0cmFuc2ZlcnJlZC4RAS0gYHRhcmdldGA6IFRoZSBhY2NvdW50IHRoYXQgc2hvdWxkIGJlIHRyYW5zZmVycmVkIHRoZSB2ZXN0ZWQgZnVuZHMu8C0gYHNjaGVkdWxlYDogVGhlIHZlc3Rpbmcgc2NoZWR1bGUgYXR0YWNoZWQgdG8gdGhlIHRyYW5zZmVyLgBcRW1pdHMgYFZlc3RpbmdDcmVhdGVkYC4A/E5PVEU6IFRoaXMgd2lsbCB1bmxvY2sgYWxsIHNjaGVkdWxlcyB0aHJvdWdoIHRoZSBjdXJyZW50IGJsb2NrLgA0IyMgQ29tcGxleGl0eSQtIGBPKDEpYC48bWVyZ2Vfc2NoZWR1bGVzCAE8c2NoZWR1bGUxX2luZGV4EAEMdTMyAAE8c2NoZWR1bGUyX2luZGV4EAEMdTMyAARUXQFNZXJnZSB0d28gdmVzdGluZyBzY2hlZHVsZXMgdG9nZXRoZXIsIGNyZWF0aW5nIGEgbmV3IHZlc3Rpbmcgc2NoZWR1bGUgdGhhdCB1bmxvY2tzIG92ZXJVAXRoZSBoaWdoZXN0IHBvc3NpYmxlIHN0YXJ0IGFuZCBlbmQgYmxvY2tzLiBJZiBib3RoIHNjaGVkdWxlcyBoYXZlIGFscmVhZHkgc3RhcnRlZCB0aGVZAWN1cnJlbnQgYmxvY2sgd2lsbCBiZSB1c2VkIGFzIHRoZSBzY2hlZHVsZSBzdGFydDsgd2l0aCB0aGUgY2F2ZWF0IHRoYXQgaWYgb25lIHNjaGVkdWxlXQFpcyBmaW5pc2hlZCBieSB0aGUgY3VycmVudCBibG9jaywgdGhlIG90aGVyIHdpbGwgYmUgdHJlYXRlZCBhcyB0aGUgbmV3IG1lcmdlZCBzY2hlZHVsZSwsdW5tb2RpZmllZC4A+E5PVEU6IElmIGBzY2hlZHVsZTFfaW5kZXggPT0gc2NoZWR1bGUyX2luZGV4YCB0aGlzIGlzIGEgbm8tb3AuQQFOT1RFOiBUaGlzIHdpbGwgdW5sb2NrIGFsbCBzY2hlZHVsZXMgdGhyb3VnaCB0aGUgY3VycmVudCBibG9jayBwcmlvciB0byBtZXJnaW5nLmEBTk9URTogSWYgYm90aCBzY2hlZHVsZXMgaGF2ZSBlbmRlZCBieSB0aGUgY3VycmVudCBibG9jaywgbm8gbmV3IHNjaGVkdWxlIHdpbGwgYmUgY3JlYXRlZGRhbmQgYm90aCB3aWxsIGJlIHJlbW92ZWQuAGxNZXJnZWQgc2NoZWR1bGUgYXR0cmlidXRlczo1AS0gYHN0YXJ0aW5nX2Jsb2NrYDogYE1BWChzY2hlZHVsZTEuc3RhcnRpbmdfYmxvY2ssIHNjaGVkdWxlZDIuc3RhcnRpbmdfYmxvY2ssSCAgY3VycmVudF9ibG9jaylgLiEBLSBgZW5kaW5nX2Jsb2NrYDogYE1BWChzY2hlZHVsZTEuZW5kaW5nX2Jsb2NrLCBzY2hlZHVsZTIuZW5kaW5nX2Jsb2NrKWAuWQEtIGBsb2NrZWRgOiBgc2NoZWR1bGUxLmxvY2tlZF9hdChjdXJyZW50X2Jsb2NrKSArIHNjaGVkdWxlMi5sb2NrZWRfYXQoY3VycmVudF9ibG9jaylgLgDMVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uAOgtIGBzY2hlZHVsZTFfaW5kZXhgOiBpbmRleCBvZiB0aGUgZmlyc3Qgc2NoZWR1bGUgdG8gbWVyZ2Uu7C0gYHNjaGVkdWxlMl9pbmRleGA6IGluZGV4IG9mIHRoZSBzZWNvbmQgc2NoZWR1bGUgdG8gbWVyZ2UudGZvcmNlX3JlbW92ZV92ZXN0aW5nX3NjaGVkdWxlCAEYdGFyZ2V07QEBjDxUOjpMb29rdXAgYXMgU3RhdGljTG9va3VwPjo6U291cmNlAAE4c2NoZWR1bGVfaW5kZXgQAQx1MzIABRh8Rm9yY2UgcmVtb3ZlIGEgdmVzdGluZyBzY2hlZHVsZQDEVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1Jvb3RfLgDILSBgdGFyZ2V0YDogQW4gYWNjb3VudCB0aGF0IGhhcyBhIHZlc3Rpbmcgc2NoZWR1bGUVAS0gYHNjaGVkdWxlX2luZGV4YDogVGhlIHZlc3Rpbmcgc2NoZWR1bGUgaW5kZXggdGhhdCBzaG91bGQgYmUgcmVtb3ZlZAQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy6pAww4cGFsbGV0X3Zlc3RpbmcwdmVzdGluZ19pbmZvLFZlc3RpbmdJbmZvCBxCYWxhbmNlARgsQmxvY2tOdW1iZXIBEAAMARhsb2NrZWQYARxCYWxhbmNlAAEkcGVyX2Jsb2NrGAEcQmFsYW5jZQABOHN0YXJ0aW5nX2Jsb2NrEAEsQmxvY2tOdW1iZXIAAK0DDEBwYWxsZXRfc2NoZWR1bGVyGHBhbGxldBBDYWxsBARUAAEoIHNjaGVkdWxlEAEQd2hlbhABREJsb2NrTnVtYmVyRm9yPFQ+AAE4bWF5YmVfcGVyaW9kaWOxAwGsT3B0aW9uPHNjaGVkdWxlOjpQZXJpb2Q8QmxvY2tOdW1iZXJGb3I8VD4+PgABIHByaW9yaXR5CAFIc2NoZWR1bGU6OlByaW9yaXR5AAEQY2FsbKkBAXxCb3g8PFQgYXMgQ29uZmlnPjo6UnVudGltZUNhbGw+AAAEcEFub255bW91c2x5IHNjaGVkdWxlIGEgdGFzay4YY2FuY2VsCAEQd2hlbhABREJsb2NrTnVtYmVyRm9yPFQ+AAEUaW5kZXgQAQx1MzIAAQSUQ2FuY2VsIGFuIGFub255bW91c2x5IHNjaGVkdWxlZCB0YXNrLjhzY2hlZHVsZV9uYW1lZBQBCGlkBAEgVGFza05hbWUAARB3aGVuEAFEQmxvY2tOdW1iZXJGb3I8VD4AAThtYXliZV9wZXJpb2RpY7EDAaxPcHRpb248c2NoZWR1bGU6OlBlcmlvZDxCbG9ja051bWJlckZvcjxUPj4+AAEgcHJpb3JpdHkIAUhzY2hlZHVsZTo6UHJpb3JpdHkAARBjYWxsqQEBfEJveDw8VCBhcyBDb25maWc+OjpSdW50aW1lQ2FsbD4AAgRYU2NoZWR1bGUgYSBuYW1lZCB0YXNrLjBjYW5jZWxfbmFtZWQEAQhpZAQBIFRhc2tOYW1lAAMEeENhbmNlbCBhIG5hbWVkIHNjaGVkdWxlZCB0YXNrLjhzY2hlZHVsZV9hZnRlchABFGFmdGVyEAFEQmxvY2tOdW1iZXJGb3I8VD4AAThtYXliZV9wZXJpb2RpY7EDAaxPcHRpb248c2NoZWR1bGU6OlBlcmlvZDxCbG9ja051bWJlckZvcjxUPj4+AAEgcHJpb3JpdHkIAUhzY2hlZHVsZTo6UHJpb3JpdHkAARBjYWxsqQEBfEJveDw8VCBhcyBDb25maWc+OjpSdW50aW1lQ2FsbD4ABASoQW5vbnltb3VzbHkgc2NoZWR1bGUgYSB0YXNrIGFmdGVyIGEgZGVsYXkuUHNjaGVkdWxlX25hbWVkX2FmdGVyFAEIaWQEASBUYXNrTmFtZQABFGFmdGVyEAFEQmxvY2tOdW1iZXJGb3I8VD4AAThtYXliZV9wZXJpb2RpY7EDAaxPcHRpb248c2NoZWR1bGU6OlBlcmlvZDxCbG9ja051bWJlckZvcjxUPj4+AAEgcHJpb3JpdHkIAUhzY2hlZHVsZTo6UHJpb3JpdHkAARBjYWxsqQEBfEJveDw8VCBhcyBDb25maWc+OjpSdW50aW1lQ2FsbD4ABQSQU2NoZWR1bGUgYSBuYW1lZCB0YXNrIGFmdGVyIGEgZGVsYXkuJHNldF9yZXRyeQwBEHRhc2slAQF4VGFza0FkZHJlc3M8QmxvY2tOdW1iZXJGb3I8VD4+AAEccmV0cmllcwgBCHU4AAEYcGVyaW9kEAFEQmxvY2tOdW1iZXJGb3I8VD4ABjBZAVNldCBhIHJldHJ5IGNvbmZpZ3VyYXRpb24gZm9yIGEgdGFzayBzbyB0aGF0LCBpbiBjYXNlIGl0cyBzY2hlZHVsZWQgcnVuIGZhaWxzLCBpdCB3aWxsVQFiZSByZXRyaWVkIGFmdGVyIGBwZXJpb2RgIGJsb2NrcywgZm9yIGEgdG90YWwgYW1vdW50IG9mIGByZXRyaWVzYCByZXRyaWVzIG9yIHVudGlsIGl0JHN1Y2NlZWRzLgBVAVRhc2tzIHdoaWNoIG5lZWQgdG8gYmUgc2NoZWR1bGVkIGZvciBhIHJldHJ5IGFyZSBzdGlsbCBzdWJqZWN0IHRvIHdlaWdodCBtZXRlcmluZyBhbmRRAWFnZW5kYSBzcGFjZSwgc2FtZSBhcyBhIHJlZ3VsYXIgdGFzay4gSWYgYSBwZXJpb2RpYyB0YXNrIGZhaWxzLCBpdCB3aWxsIGJlIHNjaGVkdWxlZJBub3JtYWxseSB3aGlsZSB0aGUgdGFzayBpcyByZXRyeWluZy4AUQFUYXNrcyBzY2hlZHVsZWQgYXMgYSByZXN1bHQgb2YgYSByZXRyeSBmb3IgYSBwZXJpb2RpYyB0YXNrIGFyZSB1bm5hbWVkLCBub24tcGVyaW9kaWM9AWNsb25lcyBvZiB0aGUgb3JpZ2luYWwgdGFzay4gVGhlaXIgcmV0cnkgY29uZmlndXJhdGlvbiB3aWxsIGJlIGRlcml2ZWQgZnJvbSB0aGVNAW9yaWdpbmFsIHRhc2sncyBjb25maWd1cmF0aW9uLCBidXQgd2lsbCBoYXZlIGEgbG93ZXIgdmFsdWUgZm9yIGByZW1haW5pbmdgIHRoYW4gdGhlZG9yaWdpbmFsIGB0b3RhbF9yZXRyaWVzYC48c2V0X3JldHJ5X25hbWVkDAEIaWQEASBUYXNrTmFtZQABHHJldHJpZXMIAQh1OAABGHBlcmlvZBABREJsb2NrTnVtYmVyRm9yPFQ+AAcwXQFTZXQgYSByZXRyeSBjb25maWd1cmF0aW9uIGZvciBhIG5hbWVkIHRhc2sgc28gdGhhdCwgaW4gY2FzZSBpdHMgc2NoZWR1bGVkIHJ1biBmYWlscywgaXRdAXdpbGwgYmUgcmV0cmllZCBhZnRlciBgcGVyaW9kYCBibG9ja3MsIGZvciBhIHRvdGFsIGFtb3VudCBvZiBgcmV0cmllc2AgcmV0cmllcyBvciB1bnRpbDBpdCBzdWNjZWVkcy4AVQFUYXNrcyB3aGljaCBuZWVkIHRvIGJlIHNjaGVkdWxlZCBmb3IgYSByZXRyeSBhcmUgc3RpbGwgc3ViamVjdCB0byB3ZWlnaHQgbWV0ZXJpbmcgYW5kUQFhZ2VuZGEgc3BhY2UsIHNhbWUgYXMgYSByZWd1bGFyIHRhc2suIElmIGEgcGVyaW9kaWMgdGFzayBmYWlscywgaXQgd2lsbCBiZSBzY2hlZHVsZWSQbm9ybWFsbHkgd2hpbGUgdGhlIHRhc2sgaXMgcmV0cnlpbmcuAFEBVGFza3Mgc2NoZWR1bGVkIGFzIGEgcmVzdWx0IG9mIGEgcmV0cnkgZm9yIGEgcGVyaW9kaWMgdGFzayBhcmUgdW5uYW1lZCwgbm9uLXBlcmlvZGljPQFjbG9uZXMgb2YgdGhlIG9yaWdpbmFsIHRhc2suIFRoZWlyIHJldHJ5IGNvbmZpZ3VyYXRpb24gd2lsbCBiZSBkZXJpdmVkIGZyb20gdGhlTQFvcmlnaW5hbCB0YXNrJ3MgY29uZmlndXJhdGlvbiwgYnV0IHdpbGwgaGF2ZSBhIGxvd2VyIHZhbHVlIGZvciBgcmVtYWluaW5nYCB0aGFuIHRoZWRvcmlnaW5hbCBgdG90YWxfcmV0cmllc2AuMGNhbmNlbF9yZXRyeQQBEHRhc2slAQF4VGFza0FkZHJlc3M8QmxvY2tOdW1iZXJGb3I8VD4+AAgEqFJlbW92ZXMgdGhlIHJldHJ5IGNvbmZpZ3VyYXRpb24gb2YgYSB0YXNrLkhjYW5jZWxfcmV0cnlfbmFtZWQEAQhpZAQBIFRhc2tOYW1lAAkEvENhbmNlbCB0aGUgcmV0cnkgY29uZmlndXJhdGlvbiBvZiBhIG5hbWVkIHRhc2suBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLrEDBBhPcHRpb24EBFQBJQEBCBBOb25lAAAAEFNvbWUEACUBAAABAAC1Aww8cGFsbGV0X3ByZWltYWdlGHBhbGxldBBDYWxsBARUAAEUNG5vdGVfcHJlaW1hZ2UEARRieXRlczgBHFZlYzx1OD4AABB0UmVnaXN0ZXIgYSBwcmVpbWFnZSBvbi1jaGFpbi4AVQFJZiB0aGUgcHJlaW1hZ2Ugd2FzIHByZXZpb3VzbHkgcmVxdWVzdGVkLCBubyBmZWVzIG9yIGRlcG9zaXRzIGFyZSB0YWtlbiBmb3IgcHJvdmlkaW5nVQF0aGUgcHJlaW1hZ2UuIE90aGVyd2lzZSwgYSBkZXBvc2l0IGlzIHRha2VuIHByb3BvcnRpb25hbCB0byB0aGUgc2l6ZSBvZiB0aGUgcHJlaW1hZ2UuPHVubm90ZV9wcmVpbWFnZQQBEGhhc2g0ARxUOjpIYXNoAAEY3ENsZWFyIGFuIHVucmVxdWVzdGVkIHByZWltYWdlIGZyb20gdGhlIHJ1bnRpbWUgc3RvcmFnZS4A/ElmIGBsZW5gIGlzIHByb3ZpZGVkLCB0aGVuIGl0IHdpbGwgYmUgYSBtdWNoIGNoZWFwZXIgb3BlcmF0aW9uLgABAS0gYGhhc2hgOiBUaGUgaGFzaCBvZiB0aGUgcHJlaW1hZ2UgdG8gYmUgcmVtb3ZlZCBmcm9tIHRoZSBzdG9yZS64LSBgbGVuYDogVGhlIGxlbmd0aCBvZiB0aGUgcHJlaW1hZ2Ugb2YgYGhhc2hgLkByZXF1ZXN0X3ByZWltYWdlBAEQaGFzaDQBHFQ6Okhhc2gAAhBBAVJlcXVlc3QgYSBwcmVpbWFnZSBiZSB1cGxvYWRlZCB0byB0aGUgY2hhaW4gd2l0aG91dCBwYXlpbmcgYW55IGZlZXMgb3IgZGVwb3NpdHMuAFUBSWYgdGhlIHByZWltYWdlIHJlcXVlc3RzIGhhcyBhbHJlYWR5IGJlZW4gcHJvdmlkZWQgb24tY2hhaW4sIHdlIHVucmVzZXJ2ZSBhbnkgZGVwb3NpdDkBYSB1c2VyIG1heSBoYXZlIHBhaWQsIGFuZCB0YWtlIHRoZSBjb250cm9sIG9mIHRoZSBwcmVpbWFnZSBvdXQgb2YgdGhlaXIgaGFuZHMuSHVucmVxdWVzdF9wcmVpbWFnZQQBEGhhc2g0ARxUOjpIYXNoAAMMvENsZWFyIGEgcHJldmlvdXNseSBtYWRlIHJlcXVlc3QgZm9yIGEgcHJlaW1hZ2UuAC0BTk9URTogVEhJUyBNVVNUIE5PVCBCRSBDQUxMRUQgT04gYGhhc2hgIE1PUkUgVElNRVMgVEhBTiBgcmVxdWVzdF9wcmVpbWFnZWAuOGVuc3VyZV91cGRhdGVkBAEYaGFzaGVzuQMBMFZlYzxUOjpIYXNoPgAEDLxFbnN1cmUgdGhhdCB0aGUgYnVsayBvZiBwcmUtaW1hZ2VzIGlzIHVwZ3JhZGVkLgA9AVRoZSBjYWxsZXIgcGF5cyBubyBmZWUgaWYgYXQgbGVhc3QgOTAlIG9mIHByZS1pbWFnZXMgd2VyZSBzdWNjZXNzZnVsbHkgdXBkYXRlZC4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMuuQMAAAI0AL0DDCxwYWxsZXRfc3VkbxhwYWxsZXQQQ2FsbAQEVAABFBBzdWRvBAEQY2FsbKkBAXxCb3g8PFQgYXMgQ29uZmlnPjo6UnVudGltZUNhbGw+AAAENQFBdXRoZW50aWNhdGVzIHRoZSBzdWRvIGtleSBhbmQgZGlzcGF0Y2hlcyBhIGZ1bmN0aW9uIGNhbGwgd2l0aCBgUm9vdGAgb3JpZ2luLlRzdWRvX3VuY2hlY2tlZF93ZWlnaHQIARBjYWxsqQEBfEJveDw8VCBhcyBDb25maWc+OjpSdW50aW1lQ2FsbD4AARh3ZWlnaHQoARhXZWlnaHQAARQ1AUF1dGhlbnRpY2F0ZXMgdGhlIHN1ZG8ga2V5IGFuZCBkaXNwYXRjaGVzIGEgZnVuY3Rpb24gY2FsbCB3aXRoIGBSb290YCBvcmlnaW4uLQFUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IGNoZWNrIHRoZSB3ZWlnaHQgb2YgdGhlIGNhbGwsIGFuZCBpbnN0ZWFkIGFsbG93cyB0aGWwU3VkbyB1c2VyIHRvIHNwZWNpZnkgdGhlIHdlaWdodCBvZiB0aGUgY2FsbC4AzFRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfLhxzZXRfa2V5BAEMbmV37QEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAIIXQFBdXRoZW50aWNhdGVzIHRoZSBjdXJyZW50IHN1ZG8ga2V5IGFuZCBzZXRzIHRoZSBnaXZlbiBBY2NvdW50SWQgKGBuZXdgKSBhcyB0aGUgbmV3IHN1ZG8Qa2V5LhxzdWRvX2FzCAEMd2hv7QEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEQY2FsbKkBAXxCb3g8PFQgYXMgQ29uZmlnPjo6UnVudGltZUNhbGw+AAMQTQFBdXRoZW50aWNhdGVzIHRoZSBzdWRvIGtleSBhbmQgZGlzcGF0Y2hlcyBhIGZ1bmN0aW9uIGNhbGwgd2l0aCBgU2lnbmVkYCBvcmlnaW4gZnJvbUBhIGdpdmVuIGFjY291bnQuAMxUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXy4ocmVtb3ZlX2tleQAEDIRQZXJtYW5lbnRseSByZW1vdmVzIHRoZSBzdWRvIGtleS4AbCoqVGhpcyBjYW5ub3QgYmUgdW4tZG9uZS4qKgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy7BAwwwcGFsbGV0X3Byb3h5GHBhbGxldBBDYWxsBARUAAEsFHByb3h5DAEQcmVhbO0BAVBBY2NvdW50SWRMb29rdXBPZjxUPgABQGZvcmNlX3Byb3h5X3R5cGXFAwFQT3B0aW9uPFQ6OlByb3h5VHlwZT4AARBjYWxsqQEBfEJveDw8VCBhcyBDb25maWc+OjpSdW50aW1lQ2FsbD4AACRNAURpc3BhdGNoIHRoZSBnaXZlbiBgY2FsbGAgZnJvbSBhbiBhY2NvdW50IHRoYXQgdGhlIHNlbmRlciBpcyBhdXRob3Jpc2VkIGZvciB0aHJvdWdoMGBhZGRfcHJveHlgLgDMVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uACxQYXJhbWV0ZXJzOg0BLSBgcmVhbGA6IFRoZSBhY2NvdW50IHRoYXQgdGhlIHByb3h5IHdpbGwgbWFrZSBhIGNhbGwgb24gYmVoYWxmIG9mLmEBLSBgZm9yY2VfcHJveHlfdHlwZWA6IFNwZWNpZnkgdGhlIGV4YWN0IHByb3h5IHR5cGUgdG8gYmUgdXNlZCBhbmQgY2hlY2tlZCBmb3IgdGhpcyBjYWxsLtAtIGBjYWxsYDogVGhlIGNhbGwgdG8gYmUgbWFkZSBieSB0aGUgYHJlYWxgIGFjY291bnQuJGFkZF9wcm94eQwBIGRlbGVnYXRl7QEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEocHJveHlfdHlwZT0BATBUOjpQcm94eVR5cGUAARRkZWxheRABREJsb2NrTnVtYmVyRm9yPFQ+AAEkRQFSZWdpc3RlciBhIHByb3h5IGFjY291bnQgZm9yIHRoZSBzZW5kZXIgdGhhdCBpcyBhYmxlIHRvIG1ha2UgY2FsbHMgb24gaXRzIGJlaGFsZi4AzFRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfLgAsUGFyYW1ldGVyczoRAS0gYHByb3h5YDogVGhlIGFjY291bnQgdGhhdCB0aGUgYGNhbGxlcmAgd291bGQgbGlrZSB0byBtYWtlIGEgcHJveHku/C0gYHByb3h5X3R5cGVgOiBUaGUgcGVybWlzc2lvbnMgYWxsb3dlZCBmb3IgdGhpcyBwcm94eSBhY2NvdW50Lk0BLSBgZGVsYXlgOiBUaGUgYW5ub3VuY2VtZW50IHBlcmlvZCByZXF1aXJlZCBvZiB0aGUgaW5pdGlhbCBwcm94eS4gV2lsbCBnZW5lcmFsbHkgYmUUemVyby4wcmVtb3ZlX3Byb3h5DAEgZGVsZWdhdGXtAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AAShwcm94eV90eXBlPQEBMFQ6OlByb3h5VHlwZQABFGRlbGF5EAFEQmxvY2tOdW1iZXJGb3I8VD4AAhyoVW5yZWdpc3RlciBhIHByb3h5IGFjY291bnQgZm9yIHRoZSBzZW5kZXIuAMxUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXy4ALFBhcmFtZXRlcnM6JQEtIGBwcm94eWA6IFRoZSBhY2NvdW50IHRoYXQgdGhlIGBjYWxsZXJgIHdvdWxkIGxpa2UgdG8gcmVtb3ZlIGFzIGEgcHJveHkuQQEtIGBwcm94eV90eXBlYDogVGhlIHBlcm1pc3Npb25zIGN1cnJlbnRseSBlbmFibGVkIGZvciB0aGUgcmVtb3ZlZCBwcm94eSBhY2NvdW50LjhyZW1vdmVfcHJveGllcwADGLRVbnJlZ2lzdGVyIGFsbCBwcm94eSBhY2NvdW50cyBmb3IgdGhlIHNlbmRlci4AzFRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfLgBdAVdBUk5JTkc6IFRoaXMgbWF5IGJlIGNhbGxlZCBvbiBhY2NvdW50cyBjcmVhdGVkIGJ5IGBjcmVhdGVfcHVyZWAsIGhvd2V2ZXIgaWYgZG9uZSwgdGhlblkBdGhlIHVucmVzZXJ2ZWQgZmVlcyB3aWxsIGJlIGluYWNjZXNzaWJsZS4gKipBbGwgYWNjZXNzIHRvIHRoaXMgYWNjb3VudCB3aWxsIGJlIGxvc3QuKiosY3JlYXRlX3B1cmUMAShwcm94eV90eXBlPQEBMFQ6OlByb3h5VHlwZQABFGRlbGF5EAFEQmxvY2tOdW1iZXJGb3I8VD4AARRpbmRleEEBAQx1MTYABEg5AVNwYXduIGEgZnJlc2ggbmV3IGFjY291bnQgdGhhdCBpcyBndWFyYW50ZWVkIHRvIGJlIG90aGVyd2lzZSBpbmFjY2Vzc2libGUsIGFuZPxpbml0aWFsaXplIGl0IHdpdGggYSBwcm94eSBvZiBgcHJveHlfdHlwZWAgZm9yIGBvcmlnaW5gIHNlbmRlci4AbFJlcXVpcmVzIGEgYFNpZ25lZGAgb3JpZ2luLgBRAS0gYHByb3h5X3R5cGVgOiBUaGUgdHlwZSBvZiB0aGUgcHJveHkgdGhhdCB0aGUgc2VuZGVyIHdpbGwgYmUgcmVnaXN0ZXJlZCBhcyBvdmVyIHRoZU0BbmV3IGFjY291bnQuIFRoaXMgd2lsbCBhbG1vc3QgYWx3YXlzIGJlIHRoZSBtb3N0IHBlcm1pc3NpdmUgYFByb3h5VHlwZWAgcG9zc2libGUgdG94YWxsb3cgZm9yIG1heGltdW0gZmxleGliaWxpdHkuUQEtIGBpbmRleGA6IEEgZGlzYW1iaWd1YXRpb24gaW5kZXgsIGluIGNhc2UgdGhpcyBpcyBjYWxsZWQgbXVsdGlwbGUgdGltZXMgaW4gdGhlIHNhbWVdAXRyYW5zYWN0aW9uIChlLmcuIHdpdGggYHV0aWxpdHk6OmJhdGNoYCkuIFVubGVzcyB5b3UncmUgdXNpbmcgYGJhdGNoYCB5b3UgcHJvYmFibHkganVzdEB3YW50IHRvIHVzZSBgMGAuTQEtIGBkZWxheWA6IFRoZSBhbm5vdW5jZW1lbnQgcGVyaW9kIHJlcXVpcmVkIG9mIHRoZSBpbml0aWFsIHByb3h5LiBXaWxsIGdlbmVyYWxseSBiZRR6ZXJvLgBRAUZhaWxzIHdpdGggYER1cGxpY2F0ZWAgaWYgdGhpcyBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZCBpbiB0aGlzIHRyYW5zYWN0aW9uLCBmcm9tIHRoZZhzYW1lIHNlbmRlciwgd2l0aCB0aGUgc2FtZSBwYXJhbWV0ZXJzLgDkRmFpbHMgaWYgdGhlcmUgYXJlIGluc3VmZmljaWVudCBmdW5kcyB0byBwYXkgZm9yIGRlcG9zaXQuJGtpbGxfcHVyZRQBHHNwYXduZXLtAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AAShwcm94eV90eXBlPQEBMFQ6OlByb3h5VHlwZQABFGluZGV4QQEBDHUxNgABGGhlaWdodMkBAURCbG9ja051bWJlckZvcjxUPgABJGV4dF9pbmRleMkBAQx1MzIABUCgUmVtb3ZlcyBhIHByZXZpb3VzbHkgc3Bhd25lZCBwdXJlIHByb3h5LgBJAVdBUk5JTkc6ICoqQWxsIGFjY2VzcyB0byB0aGlzIGFjY291bnQgd2lsbCBiZSBsb3N0LioqIEFueSBmdW5kcyBoZWxkIGluIGl0IHdpbGwgYmU0aW5hY2Nlc3NpYmxlLgBZAVJlcXVpcmVzIGEgYFNpZ25lZGAgb3JpZ2luLCBhbmQgdGhlIHNlbmRlciBhY2NvdW50IG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgYnkgYSBjYWxsIHRvsGBjcmVhdGVfcHVyZWAgd2l0aCBjb3JyZXNwb25kaW5nIHBhcmFtZXRlcnMuAFUBLSBgc3Bhd25lcmA6IFRoZSBhY2NvdW50IHRoYXQgb3JpZ2luYWxseSBjYWxsZWQgYGNyZWF0ZV9wdXJlYCB0byBjcmVhdGUgdGhpcyBhY2NvdW50LlUBLSBgaW5kZXhgOiBUaGUgZGlzYW1iaWd1YXRpb24gaW5kZXggb3JpZ2luYWxseSBwYXNzZWQgdG8gYGNyZWF0ZV9wdXJlYC4gUHJvYmFibHkgYDBgLgkBLSBgcHJveHlfdHlwZWA6IFRoZSBwcm94eSB0eXBlIG9yaWdpbmFsbHkgcGFzc2VkIHRvIGBjcmVhdGVfcHVyZWAuRQEtIGBoZWlnaHRgOiBUaGUgaGVpZ2h0IG9mIHRoZSBjaGFpbiB3aGVuIHRoZSBjYWxsIHRvIGBjcmVhdGVfcHVyZWAgd2FzIHByb2Nlc3NlZC5RAS0gYGV4dF9pbmRleGA6IFRoZSBleHRyaW5zaWMgaW5kZXggaW4gd2hpY2ggdGhlIGNhbGwgdG8gYGNyZWF0ZV9wdXJlYCB3YXMgcHJvY2Vzc2VkLgA1AUZhaWxzIHdpdGggYE5vUGVybWlzc2lvbmAgaW4gY2FzZSB0aGUgY2FsbGVyIGlzIG5vdCBhIHByZXZpb3VzbHkgY3JlYXRlZCBwdXJl+GFjY291bnQgd2hvc2UgYGNyZWF0ZV9wdXJlYCBjYWxsIGhhcyBjb3JyZXNwb25kaW5nIHBhcmFtZXRlcnMuIGFubm91bmNlCAEQcmVhbO0BAVBBY2NvdW50SWRMb29rdXBPZjxUPgABJGNhbGxfaGFzaDQBNENhbGxIYXNoT2Y8VD4ABjwFAVB1Ymxpc2ggdGhlIGhhc2ggb2YgYSBwcm94eS1jYWxsIHRoYXQgd2lsbCBiZSBtYWRlIGluIHRoZSBmdXR1cmUuAF0BVGhpcyBtdXN0IGJlIGNhbGxlZCBzb21lIG51bWJlciBvZiBibG9ja3MgYmVmb3JlIHRoZSBjb3JyZXNwb25kaW5nIGBwcm94eWAgaXMgYXR0ZW1wdGVkJQFpZiB0aGUgZGVsYXkgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm94eSByZWxhdGlvbnNoaXAgaXMgZ3JlYXRlciB0aGFuIHplcm8uABEBTm8gbW9yZSB0aGFuIGBNYXhQZW5kaW5nYCBhbm5vdW5jZW1lbnRzIG1heSBiZSBtYWRlIGF0IGFueSBvbmUgdGltZS4ACQFUaGlzIHdpbGwgdGFrZSBhIGRlcG9zaXQgb2YgYEFubm91bmNlbWVudERlcG9zaXRGYWN0b3JgIGFzIHdlbGwgYXMZAWBBbm5vdW5jZW1lbnREZXBvc2l0QmFzZWAgaWYgdGhlcmUgYXJlIG5vIG90aGVyIHBlbmRpbmcgYW5ub3VuY2VtZW50cy4AJQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXyBhbmQgYSBwcm94eSBvZiBgcmVhbGAuACxQYXJhbWV0ZXJzOg0BLSBgcmVhbGA6IFRoZSBhY2NvdW50IHRoYXQgdGhlIHByb3h5IHdpbGwgbWFrZSBhIGNhbGwgb24gYmVoYWxmIG9mLhUBLSBgY2FsbF9oYXNoYDogVGhlIGhhc2ggb2YgdGhlIGNhbGwgdG8gYmUgbWFkZSBieSB0aGUgYHJlYWxgIGFjY291bnQuTHJlbW92ZV9hbm5vdW5jZW1lbnQIARByZWFs7QEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEkY2FsbF9oYXNoNAE0Q2FsbEhhc2hPZjxUPgAHKHBSZW1vdmUgYSBnaXZlbiBhbm5vdW5jZW1lbnQuAFkBTWF5IGJlIGNhbGxlZCBieSBhIHByb3h5IGFjY291bnQgdG8gcmVtb3ZlIGEgY2FsbCB0aGV5IHByZXZpb3VzbHkgYW5ub3VuY2VkIGFuZCByZXR1cm4wdGhlIGRlcG9zaXQuAMxUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXy4ALFBhcmFtZXRlcnM6DQEtIGByZWFsYDogVGhlIGFjY291bnQgdGhhdCB0aGUgcHJveHkgd2lsbCBtYWtlIGEgY2FsbCBvbiBiZWhhbGYgb2YuFQEtIGBjYWxsX2hhc2hgOiBUaGUgaGFzaCBvZiB0aGUgY2FsbCB0byBiZSBtYWRlIGJ5IHRoZSBgcmVhbGAgYWNjb3VudC5McmVqZWN0X2Fubm91bmNlbWVudAgBIGRlbGVnYXRl7QEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEkY2FsbF9oYXNoNAE0Q2FsbEhhc2hPZjxUPgAIKLBSZW1vdmUgdGhlIGdpdmVuIGFubm91bmNlbWVudCBvZiBhIGRlbGVnYXRlLgBhAU1heSBiZSBjYWxsZWQgYnkgYSB0YXJnZXQgKHByb3hpZWQpIGFjY291bnQgdG8gcmVtb3ZlIGEgY2FsbCB0aGF0IG9uZSBvZiB0aGVpciBkZWxlZ2F0ZXMlAShgZGVsZWdhdGVgKSBoYXMgYW5ub3VuY2VkIHRoZXkgd2FudCB0byBleGVjdXRlLiBUaGUgZGVwb3NpdCBpcyByZXR1cm5lZC4AzFRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfLgAsUGFyYW1ldGVyczr0LSBgZGVsZWdhdGVgOiBUaGUgYWNjb3VudCB0aGF0IHByZXZpb3VzbHkgYW5ub3VuY2VkIHRoZSBjYWxsLrwtIGBjYWxsX2hhc2hgOiBUaGUgaGFzaCBvZiB0aGUgY2FsbCB0byBiZSBtYWRlLjxwcm94eV9hbm5vdW5jZWQQASBkZWxlZ2F0Ze0BAVBBY2NvdW50SWRMb29rdXBPZjxUPgABEHJlYWztAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AAUBmb3JjZV9wcm94eV90eXBlxQMBUE9wdGlvbjxUOjpQcm94eVR5cGU+AAEQY2FsbKkBAXxCb3g8PFQgYXMgQ29uZmlnPjo6UnVudGltZUNhbGw+AAksTQFEaXNwYXRjaCB0aGUgZ2l2ZW4gYGNhbGxgIGZyb20gYW4gYWNjb3VudCB0aGF0IHRoZSBzZW5kZXIgaXMgYXV0aG9yaXplZCBmb3IgdGhyb3VnaDBgYWRkX3Byb3h5YC4AqFJlbW92ZXMgYW55IGNvcnJlc3BvbmRpbmcgYW5ub3VuY2VtZW50KHMpLgDMVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uACxQYXJhbWV0ZXJzOg0BLSBgcmVhbGA6IFRoZSBhY2NvdW50IHRoYXQgdGhlIHByb3h5IHdpbGwgbWFrZSBhIGNhbGwgb24gYmVoYWxmIG9mLmEBLSBgZm9yY2VfcHJveHlfdHlwZWA6IFNwZWNpZnkgdGhlIGV4YWN0IHByb3h5IHR5cGUgdG8gYmUgdXNlZCBhbmQgY2hlY2tlZCBmb3IgdGhpcyBjYWxsLtAtIGBjYWxsYDogVGhlIGNhbGwgdG8gYmUgbWFkZSBieSB0aGUgYHJlYWxgIGFjY291bnQuMHBva2VfZGVwb3NpdAAKIEkBUG9rZSAvIEFkanVzdCBkZXBvc2l0cyBtYWRlIGZvciBwcm94aWVzIGFuZCBhbm5vdW5jZW1lbnRzIGJhc2VkIG9uIGN1cnJlbnQgdmFsdWVzLg0BVGhpcyBjYW4gYmUgdXNlZCBieSBhY2NvdW50cyB0byBwb3NzaWJseSBsb3dlciB0aGVpciBsb2NrZWQgYW1vdW50LgDMVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uAAEBVGhlIHRyYW5zYWN0aW9uIGZlZSBpcyB3YWl2ZWQgaWYgdGhlIGRlcG9zaXQgYW1vdW50IGhhcyBjaGFuZ2VkLgCMRW1pdHMgYERlcG9zaXRQb2tlZGAgaWYgc3VjY2Vzc2Z1bC4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMuxQMEGE9wdGlvbgQEVAE9AQEIEE5vbmUAAAAQU29tZQQAPQEAAAEAAMkDDDxwYWxsZXRfbXVsdGlzaWcYcGFsbGV0EENhbGwEBFQAARRQYXNfbXVsdGlfdGhyZXNob2xkXzEIAURvdGhlcl9zaWduYXRvcmllcwECAURWZWM8VDo6QWNjb3VudElkPgABEGNhbGypAQF8Qm94PDxUIGFzIENvbmZpZz46OlJ1bnRpbWVDYWxsPgAAMFEBSW1tZWRpYXRlbHkgZGlzcGF0Y2ggYSBtdWx0aS1zaWduYXR1cmUgY2FsbCB1c2luZyBhIHNpbmdsZSBhcHByb3ZhbCBmcm9tIHRoZSBjYWxsZXIuAMxUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXy4APQEtIGBvdGhlcl9zaWduYXRvcmllc2A6IFRoZSBhY2NvdW50cyAob3RoZXIgdGhhbiB0aGUgc2VuZGVyKSB3aG8gYXJlIHBhcnQgb2YgdGhlAQFtdWx0aS1zaWduYXR1cmUsIGJ1dCBkbyBub3QgcGFydGljaXBhdGUgaW4gdGhlIGFwcHJvdmFsIHByb2Nlc3MuiC0gYGNhbGxgOiBUaGUgY2FsbCB0byBiZSBleGVjdXRlZC4AuFJlc3VsdCBpcyBlcXVpdmFsZW50IHRvIHRoZSBkaXNwYXRjaGVkIHJlc3VsdC4ANCMjIENvbXBsZXhpdHkZAU8oWiArIEMpIHdoZXJlIFogaXMgdGhlIGxlbmd0aCBvZiB0aGUgY2FsbCBhbmQgQyBpdHMgZXhlY3V0aW9uIHdlaWdodC4gYXNfbXVsdGkUASR0aHJlc2hvbGRBAQEMdTE2AAFEb3RoZXJfc2lnbmF0b3JpZXMBAgFEVmVjPFQ6OkFjY291bnRJZD4AATxtYXliZV90aW1lcG9pbnTNAwGQT3B0aW9uPFRpbWVwb2ludDxCbG9ja051bWJlckZvcjxUPj4+AAEQY2FsbKkBAXxCb3g8PFQgYXMgQ29uZmlnPjo6UnVudGltZUNhbGw+AAEobWF4X3dlaWdodCgBGFdlaWdodAABnFUBUmVnaXN0ZXIgYXBwcm92YWwgZm9yIGEgZGlzcGF0Y2ggdG8gYmUgbWFkZSBmcm9tIGEgZGV0ZXJtaW5pc3RpYyBjb21wb3NpdGUgYWNjb3VudCBpZvhhcHByb3ZlZCBieSBhIHRvdGFsIG9mIGB0aHJlc2hvbGQgLSAxYCBvZiBgb3RoZXJfc2lnbmF0b3JpZXNgLgCwSWYgdGhlcmUgYXJlIGVub3VnaCwgdGhlbiBkaXNwYXRjaCB0aGUgY2FsbC4ALQFQYXltZW50OiBgRGVwb3NpdEJhc2VgIHdpbGwgYmUgcmVzZXJ2ZWQgaWYgdGhpcyBpcyB0aGUgZmlyc3QgYXBwcm92YWwsIHBsdXM9AWB0aHJlc2hvbGRgIHRpbWVzIGBEZXBvc2l0RmFjdG9yYC4gSXQgaXMgcmV0dXJuZWQgb25jZSB0aGlzIGRpc3BhdGNoIGhhcHBlbnMgb3I0aXMgY2FuY2VsbGVkLgDMVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uAFUBLSBgdGhyZXNob2xkYDogVGhlIHRvdGFsIG51bWJlciBvZiBhcHByb3ZhbHMgZm9yIHRoaXMgZGlzcGF0Y2ggYmVmb3JlIGl0IGlzIGV4ZWN1dGVkLkEBLSBgb3RoZXJfc2lnbmF0b3JpZXNgOiBUaGUgYWNjb3VudHMgKG90aGVyIHRoYW4gdGhlIHNlbmRlcikgd2hvIGNhbiBhcHByb3ZlIHRoaXNsZGlzcGF0Y2guIE1heSBub3QgYmUgZW1wdHkuWQEtIGBtYXliZV90aW1lcG9pbnRgOiBJZiB0aGlzIGlzIHRoZSBmaXJzdCBhcHByb3ZhbCwgdGhlbiB0aGlzIG11c3QgYmUgYE5vbmVgLiBJZiBpdCBpc1EBbm90IHRoZSBmaXJzdCBhcHByb3ZhbCwgdGhlbiBpdCBtdXN0IGJlIGBTb21lYCwgd2l0aCB0aGUgdGltZXBvaW50IChibG9jayBudW1iZXIgYW5k1HRyYW5zYWN0aW9uIGluZGV4KSBvZiB0aGUgZmlyc3QgYXBwcm92YWwgdHJhbnNhY3Rpb24uiC0gYGNhbGxgOiBUaGUgY2FsbCB0byBiZSBleGVjdXRlZC4AHQFOT1RFOiBVbmxlc3MgdGhpcyBpcyB0aGUgZmluYWwgYXBwcm92YWwsIHlvdSB3aWxsIGdlbmVyYWxseSB3YW50IHRvIHVzZRkBYGFwcHJvdmVfYXNfbXVsdGlgIGluc3RlYWQsIHNpbmNlIGl0IG9ubHkgcmVxdWlyZXMgYSBoYXNoIG9mIHRoZSBjYWxsLgBZAVJlc3VsdCBpcyBlcXVpdmFsZW50IHRvIHRoZSBkaXNwYXRjaGVkIHJlc3VsdCBpZiBgdGhyZXNob2xkYCBpcyBleGFjdGx5IGAxYC4gT3RoZXJ3aXNlVQFvbiBzdWNjZXNzLCByZXN1bHQgaXMgYE9rYCBhbmQgdGhlIHJlc3VsdCBmcm9tIHRoZSBpbnRlcmlvciBjYWxsLCBpZiBpdCB3YXMgZXhlY3V0ZWQs3G1heSBiZSBmb3VuZCBpbiB0aGUgZGVwb3NpdGVkIGBNdWx0aXNpZ0V4ZWN1dGVkYCBldmVudC4ANCMjIENvbXBsZXhpdHlQLSBgTyhTICsgWiArIENhbGwpYC7MLSBVcCB0byBvbmUgYmFsYW5jZS1yZXNlcnZlIG9yIHVucmVzZXJ2ZSBvcGVyYXRpb24uPQEtIE9uZSBwYXNzdGhyb3VnaCBvcGVyYXRpb24sIG9uZSBpbnNlcnQsIGJvdGggYE8oUylgIHdoZXJlIGBTYCBpcyB0aGUgbnVtYmVyIG9mRQEgIHNpZ25hdG9yaWVzLiBgU2AgaXMgY2FwcGVkIGJ5IGBNYXhTaWduYXRvcmllc2AsIHdpdGggd2VpZ2h0IGJlaW5nIHByb3BvcnRpb25hbC4hAS0gT25lIGNhbGwgZW5jb2RlICYgaGFzaCwgYm90aCBvZiBjb21wbGV4aXR5IGBPKFopYCB3aGVyZSBgWmAgaXMgdHgtbGVuLrwtIE9uZSBlbmNvZGUgJiBoYXNoLCBib3RoIG9mIGNvbXBsZXhpdHkgYE8oUylgLtQtIFVwIHRvIG9uZSBiaW5hcnkgc2VhcmNoIGFuZCBpbnNlcnQgKGBPKGxvZ1MgKyBTKWApLvgtIEkvTzogMSByZWFkIGBPKFMpYCwgdXAgdG8gMSBtdXRhdGUgYE8oUylgLiBVcCB0byBvbmUgcmVtb3ZlLjAtIE9uZSBldmVudC5sLSBUaGUgd2VpZ2h0IG9mIHRoZSBgY2FsbGAuTQEtIFN0b3JhZ2U6IGluc2VydHMgb25lIGl0ZW0sIHZhbHVlIHNpemUgYm91bmRlZCBieSBgTWF4U2lnbmF0b3JpZXNgLCB3aXRoIGEgZGVwb3NpdBkBICB0YWtlbiBmb3IgaXRzIGxpZmV0aW1lIG9mIGBEZXBvc2l0QmFzZSArIHRocmVzaG9sZCAqIERlcG9zaXRGYWN0b3JgLkBhcHByb3ZlX2FzX211bHRpFAEkdGhyZXNob2xkQQEBDHUxNgABRG90aGVyX3NpZ25hdG9yaWVzAQIBRFZlYzxUOjpBY2NvdW50SWQ+AAE8bWF5YmVfdGltZXBvaW50zQMBkE9wdGlvbjxUaW1lcG9pbnQ8QmxvY2tOdW1iZXJGb3I8VD4+PgABJGNhbGxfaGFzaAQBIFt1ODsgMzJdAAEobWF4X3dlaWdodCgBGFdlaWdodAACeFUBUmVnaXN0ZXIgYXBwcm92YWwgZm9yIGEgZGlzcGF0Y2ggdG8gYmUgbWFkZSBmcm9tIGEgZGV0ZXJtaW5pc3RpYyBjb21wb3NpdGUgYWNjb3VudCBpZvhhcHByb3ZlZCBieSBhIHRvdGFsIG9mIGB0aHJlc2hvbGQgLSAxYCBvZiBgb3RoZXJfc2lnbmF0b3JpZXNgLgAtAVBheW1lbnQ6IGBEZXBvc2l0QmFzZWAgd2lsbCBiZSByZXNlcnZlZCBpZiB0aGlzIGlzIHRoZSBmaXJzdCBhcHByb3ZhbCwgcGx1cz0BYHRocmVzaG9sZGAgdGltZXMgYERlcG9zaXRGYWN0b3JgLiBJdCBpcyByZXR1cm5lZCBvbmNlIHRoaXMgZGlzcGF0Y2ggaGFwcGVucyBvcjRpcyBjYW5jZWxsZWQuAMxUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXy4AVQEtIGB0aHJlc2hvbGRgOiBUaGUgdG90YWwgbnVtYmVyIG9mIGFwcHJvdmFscyBmb3IgdGhpcyBkaXNwYXRjaCBiZWZvcmUgaXQgaXMgZXhlY3V0ZWQuQQEtIGBvdGhlcl9zaWduYXRvcmllc2A6IFRoZSBhY2NvdW50cyAob3RoZXIgdGhhbiB0aGUgc2VuZGVyKSB3aG8gY2FuIGFwcHJvdmUgdGhpc2xkaXNwYXRjaC4gTWF5IG5vdCBiZSBlbXB0eS5ZAS0gYG1heWJlX3RpbWVwb2ludGA6IElmIHRoaXMgaXMgdGhlIGZpcnN0IGFwcHJvdmFsLCB0aGVuIHRoaXMgbXVzdCBiZSBgTm9uZWAuIElmIGl0IGlzUQFub3QgdGhlIGZpcnN0IGFwcHJvdmFsLCB0aGVuIGl0IG11c3QgYmUgYFNvbWVgLCB3aXRoIHRoZSB0aW1lcG9pbnQgKGJsb2NrIG51bWJlciBhbmTUdHJhbnNhY3Rpb24gaW5kZXgpIG9mIHRoZSBmaXJzdCBhcHByb3ZhbCB0cmFuc2FjdGlvbi7MLSBgY2FsbF9oYXNoYDogVGhlIGhhc2ggb2YgdGhlIGNhbGwgdG8gYmUgZXhlY3V0ZWQuADUBTk9URTogSWYgdGhpcyBpcyB0aGUgZmluYWwgYXBwcm92YWwsIHlvdSB3aWxsIHdhbnQgdG8gdXNlIGBhc19tdWx0aWAgaW5zdGVhZC4ANCMjIENvbXBsZXhpdHkkLSBgTyhTKWAuzC0gVXAgdG8gb25lIGJhbGFuY2UtcmVzZXJ2ZSBvciB1bnJlc2VydmUgb3BlcmF0aW9uLj0BLSBPbmUgcGFzc3Rocm91Z2ggb3BlcmF0aW9uLCBvbmUgaW5zZXJ0LCBib3RoIGBPKFMpYCB3aGVyZSBgU2AgaXMgdGhlIG51bWJlciBvZkUBICBzaWduYXRvcmllcy4gYFNgIGlzIGNhcHBlZCBieSBgTWF4U2lnbmF0b3JpZXNgLCB3aXRoIHdlaWdodCBiZWluZyBwcm9wb3J0aW9uYWwuvC0gT25lIGVuY29kZSAmIGhhc2gsIGJvdGggb2YgY29tcGxleGl0eSBgTyhTKWAu1C0gVXAgdG8gb25lIGJpbmFyeSBzZWFyY2ggYW5kIGluc2VydCAoYE8obG9nUyArIFMpYCku+C0gSS9POiAxIHJlYWQgYE8oUylgLCB1cCB0byAxIG11dGF0ZSBgTyhTKWAuIFVwIHRvIG9uZSByZW1vdmUuMC0gT25lIGV2ZW50Lk0BLSBTdG9yYWdlOiBpbnNlcnRzIG9uZSBpdGVtLCB2YWx1ZSBzaXplIGJvdW5kZWQgYnkgYE1heFNpZ25hdG9yaWVzYCwgd2l0aCBhIGRlcG9zaXQZASAgdGFrZW4gZm9yIGl0cyBsaWZldGltZSBvZiBgRGVwb3NpdEJhc2UgKyB0aHJlc2hvbGQgKiBEZXBvc2l0RmFjdG9yYC48Y2FuY2VsX2FzX211bHRpEAEkdGhyZXNob2xkQQEBDHUxNgABRG90aGVyX3NpZ25hdG9yaWVzAQIBRFZlYzxUOjpBY2NvdW50SWQ+AAEkdGltZXBvaW50TQEBcFRpbWVwb2ludDxCbG9ja051bWJlckZvcjxUPj4AASRjYWxsX2hhc2gEASBbdTg7IDMyXQADVFUBQ2FuY2VsIGEgcHJlLWV4aXN0aW5nLCBvbi1nb2luZyBtdWx0aXNpZyB0cmFuc2FjdGlvbi4gQW55IGRlcG9zaXQgcmVzZXJ2ZWQgcHJldmlvdXNsecRmb3IgdGhpcyBvcGVyYXRpb24gd2lsbCBiZSB1bnJlc2VydmVkIG9uIHN1Y2Nlc3MuAMxUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXy4AVQEtIGB0aHJlc2hvbGRgOiBUaGUgdG90YWwgbnVtYmVyIG9mIGFwcHJvdmFscyBmb3IgdGhpcyBkaXNwYXRjaCBiZWZvcmUgaXQgaXMgZXhlY3V0ZWQuQQEtIGBvdGhlcl9zaWduYXRvcmllc2A6IFRoZSBhY2NvdW50cyAob3RoZXIgdGhhbiB0aGUgc2VuZGVyKSB3aG8gY2FuIGFwcHJvdmUgdGhpc2xkaXNwYXRjaC4gTWF5IG5vdCBiZSBlbXB0eS5dAS0gYHRpbWVwb2ludGA6IFRoZSB0aW1lcG9pbnQgKGJsb2NrIG51bWJlciBhbmQgdHJhbnNhY3Rpb24gaW5kZXgpIG9mIHRoZSBmaXJzdCBhcHByb3ZhbHh0cmFuc2FjdGlvbiBmb3IgdGhpcyBkaXNwYXRjaC7MLSBgY2FsbF9oYXNoYDogVGhlIGhhc2ggb2YgdGhlIGNhbGwgdG8gYmUgZXhlY3V0ZWQuADQjIyBDb21wbGV4aXR5JC0gYE8oUylgLswtIFVwIHRvIG9uZSBiYWxhbmNlLXJlc2VydmUgb3IgdW5yZXNlcnZlIG9wZXJhdGlvbi49AS0gT25lIHBhc3N0aHJvdWdoIG9wZXJhdGlvbiwgb25lIGluc2VydCwgYm90aCBgTyhTKWAgd2hlcmUgYFNgIGlzIHRoZSBudW1iZXIgb2ZFASAgc2lnbmF0b3JpZXMuIGBTYCBpcyBjYXBwZWQgYnkgYE1heFNpZ25hdG9yaWVzYCwgd2l0aCB3ZWlnaHQgYmVpbmcgcHJvcG9ydGlvbmFsLrwtIE9uZSBlbmNvZGUgJiBoYXNoLCBib3RoIG9mIGNvbXBsZXhpdHkgYE8oUylgLjAtIE9uZSBldmVudC6ELSBJL086IDEgcmVhZCBgTyhTKWAsIG9uZSByZW1vdmUucC0gU3RvcmFnZTogcmVtb3ZlcyBvbmUgaXRlbS4wcG9rZV9kZXBvc2l0DAEkdGhyZXNob2xkQQEBDHUxNgABRG90aGVyX3NpZ25hdG9yaWVzAQIBRFZlYzxUOjpBY2NvdW50SWQ+AAEkY2FsbF9oYXNoBAEgW3U4OyAzMl0ABDT0UG9rZSB0aGUgZGVwb3NpdCByZXNlcnZlZCBmb3IgYW4gZXhpc3RpbmcgbXVsdGlzaWcgb3BlcmF0aW9uLgBhAVRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfIGFuZCBtdXN0IGJlIHRoZSBvcmlnaW5hbCBkZXBvc2l0b3Igb2ZcdGhlIG11bHRpc2lnIG9wZXJhdGlvbi4AAQFUaGUgdHJhbnNhY3Rpb24gZmVlIGlzIHdhaXZlZCBpZiB0aGUgZGVwb3NpdCBhbW91bnQgaGFzIGNoYW5nZWQuABkBLSBgdGhyZXNob2xkYDogVGhlIHRvdGFsIG51bWJlciBvZiBhcHByb3ZhbHMgbmVlZGVkIGZvciB0aGlzIG11bHRpc2lnLj0BLSBgb3RoZXJfc2lnbmF0b3JpZXNgOiBUaGUgYWNjb3VudHMgKG90aGVyIHRoYW4gdGhlIHNlbmRlcikgd2hvIGFyZSBwYXJ0IG9mIHRoZSwgIG11bHRpc2lnLgUBLSBgY2FsbF9oYXNoYDogVGhlIGhhc2ggb2YgdGhlIGNhbGwgdGhpcyBkZXBvc2l0IGlzIHJlc2VydmVkIGZvci4AjEVtaXRzIGBEZXBvc2l0UG9rZWRgIGlmIHN1Y2Nlc3NmdWwuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLs0DBBhPcHRpb24EBFQBTQEBCBBOb25lAAAAEFNvbWUEAE0BAAABAADRAwyQcGFsbGV0X2VsZWN0aW9uX3Byb3ZpZGVyX211bHRpX3BoYXNlGHBhbGxldBBDYWxsBARUAAEUPHN1Ym1pdF91bnNpZ25lZAgBMHJhd19zb2x1dGlvbtUDAbBCb3g8UmF3U29sdXRpb248U29sdXRpb25PZjxUOjpNaW5lckNvbmZpZz4+PgABHHdpdG5lc3OlBAFYU29sdXRpb25PclNuYXBzaG90U2l6ZQAAOKRTdWJtaXQgYSBzb2x1dGlvbiBmb3IgdGhlIHVuc2lnbmVkIHBoYXNlLgDIVGhlIGRpc3BhdGNoIG9yaWdpbiBmbyB0aGlzIGNhbGwgbXVzdCBiZSBfX25vbmVfXy4APQFUaGlzIHN1Ym1pc3Npb24gaXMgY2hlY2tlZCBvbiB0aGUgZmx5LiBNb3Jlb3ZlciwgdGhpcyB1bnNpZ25lZCBzb2x1dGlvbiBpcyBvbmx5VQF2YWxpZGF0ZWQgd2hlbiBzdWJtaXR0ZWQgdG8gdGhlIHBvb2wgZnJvbSB0aGUgKipsb2NhbCoqIG5vZGUuIEVmZmVjdGl2ZWx5LCB0aGlzIG1lYW5zXQF0aGF0IG9ubHkgYWN0aXZlIHZhbGlkYXRvcnMgY2FuIHN1Ym1pdCB0aGlzIHRyYW5zYWN0aW9uIHdoZW4gYXV0aG9yaW5nIGEgYmxvY2sgKHNpbWlsYXJAdG8gYW4gaW5oZXJlbnQpLgBZAVRvIHByZXZlbnQgYW55IGluY29ycmVjdCBzb2x1dGlvbiAoYW5kIHRodXMgd2FzdGVkIHRpbWUvd2VpZ2h0KSwgdGhpcyB0cmFuc2FjdGlvbiB3aWxsTQFwYW5pYyBpZiB0aGUgc29sdXRpb24gc3VibWl0dGVkIGJ5IHRoZSB2YWxpZGF0b3IgaXMgaW52YWxpZCBpbiBhbnkgd2F5LCBlZmZlY3RpdmVseZxwdXR0aW5nIHRoZWlyIGF1dGhvcmluZyByZXdhcmQgYXQgcmlzay4A4E5vIGRlcG9zaXQgb3IgcmV3YXJkIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHN1Ym1pc3Npb24ubHNldF9taW5pbXVtX3VudHJ1c3RlZF9zY29yZQQBQG1heWJlX25leHRfc2NvcmWpBAFUT3B0aW9uPEVsZWN0aW9uU2NvcmU+AAEUsFNldCBhIG5ldyB2YWx1ZSBmb3IgYE1pbmltdW1VbnRydXN0ZWRTY29yZWAuANhEaXNwYXRjaCBvcmlnaW4gbXVzdCBiZSBhbGlnbmVkIHdpdGggYFQ6OkZvcmNlT3JpZ2luYC4A8FRoaXMgY2hlY2sgY2FuIGJlIHR1cm5lZCBvZmYgYnkgc2V0dGluZyB0aGUgdmFsdWUgdG8gYE5vbmVgLnRzZXRfZW1lcmdlbmN5X2VsZWN0aW9uX3Jlc3VsdAQBIHN1cHBvcnRzrQQBWFN1cHBvcnRzPFQ6OkFjY291bnRJZD4AAiBZAVNldCBhIHNvbHV0aW9uIGluIHRoZSBxdWV1ZSwgdG8gYmUgaGFuZGVkIG91dCB0byB0aGUgY2xpZW50IG9mIHRoaXMgcGFsbGV0IGluIHRoZSBuZXh0iGNhbGwgdG8gYEVsZWN0aW9uUHJvdmlkZXI6OmVsZWN0YC4ARQFUaGlzIGNhbiBvbmx5IGJlIHNldCBieSBgVDo6Rm9yY2VPcmlnaW5gLCBhbmQgb25seSB3aGVuIHRoZSBwaGFzZSBpcyBgRW1lcmdlbmN5YC4AYQFUaGUgc29sdXRpb24gaXMgbm90IGNoZWNrZWQgZm9yIGFueSBmZWFzaWJpbGl0eSBhbmQgaXMgYXNzdW1lZCB0byBiZSB0cnVzdHdvcnRoeSwgYXMgYW55UQFmZWFzaWJpbGl0eSBjaGVjayBpdHNlbGYgY2FuIGluIHByaW5jaXBsZSBjYXVzZSB0aGUgZWxlY3Rpb24gcHJvY2VzcyB0byBmYWlsIChkdWUgdG9obWVtb3J5L3dlaWdodCBjb25zdHJhaW5zKS4Yc3VibWl0BAEwcmF3X3NvbHV0aW9u1QMBsEJveDxSYXdTb2x1dGlvbjxTb2x1dGlvbk9mPFQ6Ok1pbmVyQ29uZmlnPj4+AAMknFN1Ym1pdCBhIHNvbHV0aW9uIGZvciB0aGUgc2lnbmVkIHBoYXNlLgDQVGhlIGRpc3BhdGNoIG9yaWdpbiBmbyB0aGlzIGNhbGwgbXVzdCBiZSBfX3NpZ25lZF9fLgBdAVRoZSBzb2x1dGlvbiBpcyBwb3RlbnRpYWxseSBxdWV1ZWQsIGJhc2VkIG9uIHRoZSBjbGFpbWVkIHNjb3JlIGFuZCBwcm9jZXNzZWQgYXQgdGhlIGVuZFBvZiB0aGUgc2lnbmVkIHBoYXNlLgBdAUEgZGVwb3NpdCBpcyByZXNlcnZlZCBhbmQgcmVjb3JkZWQgZm9yIHRoZSBzb2x1dGlvbi4gQmFzZWQgb24gdGhlIG91dGNvbWUsIHRoZSBzb2x1dGlvbhUBbWlnaHQgYmUgcmV3YXJkZWQsIHNsYXNoZWQsIG9yIGdldCBhbGwgb3IgYSBwYXJ0IG9mIHRoZSBkZXBvc2l0IGJhY2suTGdvdmVybmFuY2VfZmFsbGJhY2sABBCAVHJpZ2dlciB0aGUgZ292ZXJuYW5jZSBmYWxsYmFjay4ASQFUaGlzIGNhbiBvbmx5IGJlIGNhbGxlZCB3aGVuIFtgUGhhc2U6OkVtZXJnZW5jeWBdIGlzIGVuYWJsZWQsIGFzIGFuIGFsdGVybmF0aXZlIHRvwGNhbGxpbmcgW2BDYWxsOjpzZXRfZW1lcmdlbmN5X2VsZWN0aW9uX3Jlc3VsdGBdLgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy7VAwiQcGFsbGV0X2VsZWN0aW9uX3Byb3ZpZGVyX211bHRpX3BoYXNlLFJhd1NvbHV0aW9uBARTAdkDAAwBIHNvbHV0aW9u2QMBBFMAARRzY29yZVkBATRFbGVjdGlvblNjb3JlAAEUcm91bmQQAQx1MzIAANkDCDx3ZXN0ZW5kX3J1bnRpbWVUTnBvc0NvbXBhY3RTb2x1dGlvbjE2AABAARh2b3RlczHdAwAAARh2b3RlczLpAwAAARh2b3RlczP9AwAAARh2b3RlczQJBAAAARh2b3RlczUVBAAAARh2b3RlczYhBAAAARh2b3RlczctBAAAARh2b3Rlczg5BAAAARh2b3RlczlFBAAAARx2b3RlczEwUQQAAAEcdm90ZXMxMV0EAAABHHZvdGVzMTJpBAAAARx2b3RlczEzdQQAAAEcdm90ZXMxNIEEAAABHHZvdGVzMTWNBAAAARx2b3RlczE2mQQAAADdAwAAAuEDAOEDAAAECMkB5QMA5QMAAAZBAQDpAwAAAu0DAO0DAAAEDMkB8QPlAwDxAwAABAjlA/UDAPUDAAAG+QMA+QMMNHNwX2FyaXRobWV0aWMocGVyX3RoaW5ncxhQZXJVMTYAAAQAQQEBDHUxNgAA/QMAAAIBBAABBAAABAzJAQUE5QMABQQAAAMCAAAA8QMACQQAAAINBAANBAAABAzJAREE5QMAEQQAAAMDAAAA8QMAFQQAAAIZBAAZBAAABAzJAR0E5QMAHQQAAAMEAAAA8QMAIQQAAAIlBAAlBAAABAzJASkE5QMAKQQAAAMFAAAA8QMALQQAAAIxBAAxBAAABAzJATUE5QMANQQAAAMGAAAA8QMAOQQAAAI9BAA9BAAABAzJAUEE5QMAQQQAAAMHAAAA8QMARQQAAAJJBABJBAAABAzJAU0E5QMATQQAAAMIAAAA8QMAUQQAAAJVBABVBAAABAzJAVkE5QMAWQQAAAMJAAAA8QMAXQQAAAJhBABhBAAABAzJAWUE5QMAZQQAAAMKAAAA8QMAaQQAAAJtBABtBAAABAzJAXEE5QMAcQQAAAMLAAAA8QMAdQQAAAJ5BAB5BAAABAzJAX0E5QMAfQQAAAMMAAAA8QMAgQQAAAKFBACFBAAABAzJAYkE5QMAiQQAAAMNAAAA8QMAjQQAAAKRBACRBAAABAzJAZUE5QMAlQQAAAMOAAAA8QMAmQQAAAKdBACdBAAABAzJAaEE5QMAoQQAAAMPAAAA8QMApQQIkHBhbGxldF9lbGVjdGlvbl9wcm92aWRlcl9tdWx0aV9waGFzZVhTb2x1dGlvbk9yU25hcHNob3RTaXplAAAIARh2b3RlcnPJAQEMdTMyAAEcdGFyZ2V0c8kBAQx1MzIAAKkEBBhPcHRpb24EBFQBWQEBCBBOb25lAAAAEFNvbWUEAFkBAAABAACtBAAAArEEALEEAAAECAC1BAC1BAhEc3BfbnBvc19lbGVjdGlvbnMcU3VwcG9ydAQkQWNjb3VudElkAQAACAEUdG90YWwYATxFeHRlbmRlZEJhbGFuY2UAARh2b3RlcnO5BAGEVmVjPChBY2NvdW50SWQsIEV4dGVuZGVkQmFsYW5jZSk+AAC5BAAAAr0EAL0EAAAECAAYAMEEDEBwYWxsZXRfYmFnc19saXN0GHBhbGxldBBDYWxsCARUAARJAAEMFHJlYmFnBAEoZGlzbG9jYXRlZO0BAVBBY2NvdW50SWRMb29rdXBPZjxUPgAAKFkBRGVjbGFyZSB0aGF0IHNvbWUgYGRpc2xvY2F0ZWRgIGFjY291bnQgaGFzLCB0aHJvdWdoIHJld2FyZHMgb3IgcGVuYWx0aWVzLCBzdWZmaWNpZW50bHlRAWNoYW5nZWQgaXRzIHNjb3JlIHRoYXQgaXQgc2hvdWxkIHByb3Blcmx5IGZhbGwgaW50byBhIGRpZmZlcmVudCBiYWcgdGhhbiBpdHMgY3VycmVudBBvbmUuAB0BQW55b25lIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24gYWJvdXQgYW55IHBvdGVudGlhbGx5IGRpc2xvY2F0ZWQgYWNjb3VudC4ASQFXaWxsIGFsd2F5cyB1cGRhdGUgdGhlIHN0b3JlZCBzY29yZSBvZiBgZGlzbG9jYXRlZGAgdG8gdGhlIGNvcnJlY3Qgc2NvcmUsIGJhc2VkIG9uQGBTY29yZVByb3ZpZGVyYC4A1ElmIGBkaXNsb2NhdGVkYCBkb2VzIG5vdCBleGlzdHMsIGl0IHJldHVybnMgYW4gZXJyb3IuPHB1dF9pbl9mcm9udF9vZgQBHGxpZ2h0ZXLtAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AASjQTW92ZSB0aGUgY2FsbGVyJ3MgSWQgZGlyZWN0bHkgaW4gZnJvbnQgb2YgYGxpZ2h0ZXJgLgBZAVRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfIGFuZCBjYW4gb25seSBiZSBjYWxsZWQgYnkgdGhlIElkIG9mNQF0aGUgYWNjb3VudCBnb2luZyBpbiBmcm9udCBvZiBgbGlnaHRlcmAuIEZlZSBpcyBwYXllZCBieSB0aGUgb3JpZ2luIHVuZGVyIGFsbDhjaXJjdW1zdGFuY2VzLgA4T25seSB3b3JrcyBpZjoAlC0gYm90aCBub2RlcyBhcmUgd2l0aGluIHRoZSBzYW1lIGJhZyzQLSBhbmQgYG9yaWdpbmAgaGFzIGEgZ3JlYXRlciBgU2NvcmVgIHRoYW4gYGxpZ2h0ZXJgLlRwdXRfaW5fZnJvbnRfb2Zfb3RoZXIIARxoZWF2aWVy7QEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEcbGlnaHRlcu0BAVBBY2NvdW50SWRMb29rdXBPZjxUPgACDBEBU2FtZSBhcyBbYFBhbGxldDo6cHV0X2luX2Zyb250X29mYF0sIGJ1dCBpdCBjYW4gYmUgY2FsbGVkIGJ5IGFueW9uZS4AyEZlZSBpcyBwYWlkIGJ5IHRoZSBvcmlnaW4gdW5kZXIgYWxsIGNpcmN1bXN0YW5jZXMuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLsUEDFxwYWxsZXRfbm9taW5hdGlvbl9wb29scxhwYWxsZXQQQ2FsbAQEVAABaBBqb2luCAEYYW1vdW50/QEBMEJhbGFuY2VPZjxUPgABHHBvb2xfaWQQARhQb29sSWQAAEBFAVN0YWtlIGZ1bmRzIHdpdGggYSBwb29sLiBUaGUgYW1vdW50IHRvIGJvbmQgaXMgZGVsZWdhdGVkIChvciB0cmFuc2ZlcnJlZCBiYXNlZCBvbk0BW2BhZGFwdGVyOjpTdGFrZVN0cmF0ZWd5VHlwZWBdKSBmcm9tIHRoZSBtZW1iZXIgdG8gdGhlIHBvb2wgYWNjb3VudCBhbmQgaW1tZWRpYXRlbHloaW5jcmVhc2VzIHRoZSBwb29sJ3MgYm9uZC4AKQFUaGUgbWV0aG9kIG9mIHRyYW5zZmVycmluZyB0aGUgYW1vdW50IHRvIHRoZSBwb29sIGFjY291bnQgaXMgZGV0ZXJtaW5lZCBieQEBW2BhZGFwdGVyOjpTdGFrZVN0cmF0ZWd5VHlwZWBdLiBJZiB0aGUgcG9vbCBpcyBjb25maWd1cmVkIHRvIHVzZTEBW2BhZGFwdGVyOjpTdGFrZVN0cmF0ZWd5VHlwZTo6RGVsZWdhdGVgXSwgdGhlIGZ1bmRzIHJlbWFpbiBpbiB0aGUgYWNjb3VudCBvZjEBdGhlIGBvcmlnaW5gLCB3aGlsZSB0aGUgcG9vbCBnYWlucyB0aGUgcmlnaHQgdG8gdXNlIHRoZXNlIGZ1bmRzIGZvciBzdGFraW5nLgAYIyBOb3RlAMwqIEFuIGFjY291bnQgY2FuIG9ubHkgYmUgYSBtZW1iZXIgb2YgYSBzaW5nbGUgcG9vbC7YKiBBbiBhY2NvdW50IGNhbm5vdCBqb2luIHRoZSBzYW1lIHBvb2wgbXVsdGlwbGUgdGltZXMuQQEqIFRoaXMgY2FsbCB3aWxsICpub3QqIGR1c3QgdGhlIG1lbWJlciBhY2NvdW50LCBzbyB0aGUgbWVtYmVyIG11c3QgaGF2ZSBhdCBsZWFzdMggIGBleGlzdGVudGlhbCBkZXBvc2l0ICsgYW1vdW50YCBpbiB0aGVpciBhY2NvdW50LtAqIE9ubHkgYSBwb29sIHdpdGggW2BQb29sU3RhdGU6Ok9wZW5gXSBjYW4gYmUgam9pbmVkKGJvbmRfZXh0cmEEARRleHRyYckEAVxCb25kRXh0cmE8QmFsYW5jZU9mPFQ+PgABHEUBQm9uZCBgZXh0cmFgIG1vcmUgZnVuZHMgZnJvbSBgb3JpZ2luYCBpbnRvIHRoZSBwb29sIHRvIHdoaWNoIHRoZXkgYWxyZWFkeSBiZWxvbmcuAEkBQWRkaXRpb25hbCBmdW5kcyBjYW4gY29tZSBmcm9tIGVpdGhlciB0aGUgZnJlZSBiYWxhbmNlIG9mIHRoZSBhY2NvdW50LCBvZiBmcm9tIHRoZZxhY2N1bXVsYXRlZCByZXdhcmRzLCBzZWUgW2BCb25kRXh0cmFgXS4APQFCb25kaW5nIGV4dHJhIGZ1bmRzIGltcGxpZXMgYW4gYXV0b21hdGljIHBheW91dCBvZiBhbGwgcGVuZGluZyByZXdhcmRzIGFzIHdlbGwuCQFTZWUgYGJvbmRfZXh0cmFfb3RoZXJgIHRvIGJvbmQgcGVuZGluZyByZXdhcmRzIG9mIGBvdGhlcmAgbWVtYmVycy4wY2xhaW1fcGF5b3V0AAIgVQFBIGJvbmRlZCBtZW1iZXIgY2FuIHVzZSB0aGlzIHRvIGNsYWltIHRoZWlyIHBheW91dCBiYXNlZCBvbiB0aGUgcmV3YXJkcyB0aGF0IHRoZSBwb29sYQFoYXMgYWNjdW11bGF0ZWQgc2luY2UgdGhlaXIgbGFzdCBjbGFpbWVkIHBheW91dCAoT1Igc2luY2Ugam9pbmluZyBpZiB0aGlzIGlzIHRoZWlyIGZpcnN0PQF0aW1lIGNsYWltaW5nIHJld2FyZHMpLiBUaGUgcGF5b3V0IHdpbGwgYmUgdHJhbnNmZXJyZWQgdG8gdGhlIG1lbWJlcidzIGFjY291bnQuAEkBVGhlIG1lbWJlciB3aWxsIGVhcm4gcmV3YXJkcyBwcm8gcmF0YSBiYXNlZCBvbiB0aGUgbWVtYmVycyBzdGFrZSB2cyB0aGUgc3VtIG9mIHRoZdBtZW1iZXJzIGluIHRoZSBwb29scyBzdGFrZS4gUmV3YXJkcyBkbyBub3QgImV4cGlyZSIuAEEBU2VlIGBjbGFpbV9wYXlvdXRfb3RoZXJgIHRvIGNsYWltIHJld2FyZHMgb24gYmVoYWxmIG9mIHNvbWUgYG90aGVyYCBwb29sIG1lbWJlci4YdW5ib25kCAE4bWVtYmVyX2FjY291bnTtAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AAUB1bmJvbmRpbmdfcG9pbnRz/QEBMEJhbGFuY2VPZjxUPgADfEUBVW5ib25kIHVwIHRvIGB1bmJvbmRpbmdfcG9pbnRzYCBvZiB0aGUgYG1lbWJlcl9hY2NvdW50YCdzIGZ1bmRzIGZyb20gdGhlIHBvb2wuIEl0RQFpbXBsaWNpdGx5IGNvbGxlY3RzIHRoZSByZXdhcmRzIG9uZSBsYXN0IHRpbWUsIHNpbmNlIG5vdCBkb2luZyBzbyB3b3VsZCBtZWFuIHNvbWVscmV3YXJkcyB3b3VsZCBiZSBmb3JmZWl0ZWQuAE0BVW5kZXIgY2VydGFpbiBjb25kaXRpb25zLCB0aGlzIGNhbGwgY2FuIGJlIGRpc3BhdGNoZWQgcGVybWlzc2lvbmxlc3NseSAoaS5lLiBieSBhbnkkYWNjb3VudCkuAKwjIENvbmRpdGlvbnMgZm9yIGEgcGVybWlzc2lvbmxlc3MgZGlzcGF0Y2guAF0BKiBUaGUgcG9vbCBpcyBibG9ja2VkIGFuZCB0aGUgY2FsbGVyIGlzIGVpdGhlciB0aGUgcm9vdCBvciBib3VuY2VyLiBUaGlzIGlzIHJlZmVyZWVkIHRvMCAgYXMgYSBraWNrLvQqIFRoZSBwb29sIGlzIGRlc3Ryb3lpbmcgYW5kIHRoZSBtZW1iZXIgaXMgbm90IHRoZSBkZXBvc2l0b3IuVQEqIFRoZSBwb29sIGlzIGRlc3Ryb3lpbmcsIHRoZSBtZW1iZXIgaXMgdGhlIGRlcG9zaXRvciBhbmQgbm8gb3RoZXIgbWVtYmVycyBhcmUgaW4gdGhlHCAgcG9vbC4AEQEjIyBDb25kaXRpb25zIGZvciBwZXJtaXNzaW9uZWQgZGlzcGF0Y2ggKGkuZS4gdGhlIGNhbGxlciBpcyBhbHNvIHRoZUhgbWVtYmVyX2FjY291bnRgKToAiCogVGhlIGNhbGxlciBpcyBub3QgdGhlIGRlcG9zaXRvci5VASogVGhlIGNhbGxlciBpcyB0aGUgZGVwb3NpdG9yLCB0aGUgcG9vbCBpcyBkZXN0cm95aW5nIGFuZCBubyBvdGhlciBtZW1iZXJzIGFyZSBpbiB0aGUcICBwb29sLgAYIyBOb3RlAB0BSWYgdGhlcmUgYXJlIHRvbyBtYW55IHVubG9ja2luZyBjaHVua3MgdG8gdW5ib25kIHdpdGggdGhlIHBvb2wgYWNjb3VudCxRAVtgQ2FsbDo6cG9vbF93aXRoZHJhd191bmJvbmRlZGBdIGNhbiBiZSBjYWxsZWQgdG8gdHJ5IGFuZCBtaW5pbWl6ZSB1bmxvY2tpbmcgY2h1bmtzLlkBVGhlIFtgU3Rha2luZ0ludGVyZmFjZTo6dW5ib25kYF0gd2lsbCBpbXBsaWNpdGx5IGNhbGwgW2BDYWxsOjpwb29sX3dpdGhkcmF3X3VuYm9uZGVkYF1VAXRvIHRyeSB0byBmcmVlIGNodW5rcyBpZiBuZWNlc3NhcnkgKGllLiBpZiB1bmJvdW5kIHdhcyBjYWxsZWQgYW5kIG5vIHVubG9ja2luZyBjaHVua3NhAWFyZSBhdmFpbGFibGUpLiBIb3dldmVyLCBpdCBtYXkgbm90IGJlIHBvc3NpYmxlIHRvIHJlbGVhc2UgdGhlIGN1cnJlbnQgdW5sb2NraW5nIGNodW5rcyxdAWluIHdoaWNoIGNhc2UsIHRoZSByZXN1bHQgb2YgdGhpcyBjYWxsIHdpbGwgbGlrZWx5IGJlIHRoZSBgTm9Nb3JlQ2h1bmtzYCBlcnJvciBmcm9tIHRoZTxzdGFraW5nIHN5c3RlbS5YcG9vbF93aXRoZHJhd191bmJvbmRlZAgBHHBvb2xfaWQQARhQb29sSWQAAUhudW1fc2xhc2hpbmdfc3BhbnMQAQx1MzIABBhVAUNhbGwgYHdpdGhkcmF3X3VuYm9uZGVkYCBmb3IgdGhlIHBvb2xzIGFjY291bnQuIFRoaXMgY2FsbCBjYW4gYmUgbWFkZSBieSBhbnkgYWNjb3VudC4AQQFUaGlzIGlzIHVzZWZ1bCBpZiB0aGVyZSBhcmUgdG9vIG1hbnkgdW5sb2NraW5nIGNodW5rcyB0byBjYWxsIGB1bmJvbmRgLCBhbmQgc29tZWEBY2FuIGJlIGNsZWFyZWQgYnkgd2l0aGRyYXdpbmcuIEluIHRoZSBjYXNlIHRoZXJlIGFyZSB0b28gbWFueSB1bmxvY2tpbmcgY2h1bmtzLCB0aGUgdXNlclEBd291bGQgcHJvYmFibHkgc2VlIGFuIGVycm9yIGxpa2UgYE5vTW9yZUNodW5rc2AgZW1pdHRlZCBmcm9tIHRoZSBzdGFraW5nIHN5c3RlbSB3aGVuXHRoZXkgYXR0ZW1wdCB0byB1bmJvbmQuRHdpdGhkcmF3X3VuYm9uZGVkCAE4bWVtYmVyX2FjY291bnTtAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AAUhudW1fc2xhc2hpbmdfc3BhbnMQAQx1MzIABVhVAVdpdGhkcmF3IHVuYm9uZGVkIGZ1bmRzIGZyb20gYG1lbWJlcl9hY2NvdW50YC4gSWYgbm8gYm9uZGVkIGZ1bmRzIGNhbiBiZSB1bmJvbmRlZCwgYW5IZXJyb3IgaXMgcmV0dXJuZWQuAE0BVW5kZXIgY2VydGFpbiBjb25kaXRpb25zLCB0aGlzIGNhbGwgY2FuIGJlIGRpc3BhdGNoZWQgcGVybWlzc2lvbmxlc3NseSAoaS5lLiBieSBhbnkkYWNjb3VudCkuAKgjIENvbmRpdGlvbnMgZm9yIGEgcGVybWlzc2lvbmxlc3MgZGlzcGF0Y2gACQEqIFRoZSBwb29sIGlzIGluIGRlc3Ryb3kgbW9kZSBhbmQgdGhlIHRhcmdldCBpcyBub3QgdGhlIGRlcG9zaXRvci4xASogVGhlIHRhcmdldCBpcyB0aGUgZGVwb3NpdG9yIGFuZCB0aGV5IGFyZSB0aGUgb25seSBtZW1iZXIgaW4gdGhlIHN1YiBwb29scy4NASogVGhlIHBvb2wgaXMgYmxvY2tlZCBhbmQgdGhlIGNhbGxlciBpcyBlaXRoZXIgdGhlIHJvb3Qgb3IgYm91bmNlci4AmCMgQ29uZGl0aW9ucyBmb3IgcGVybWlzc2lvbmVkIGRpc3BhdGNoAOgqIFRoZSBjYWxsZXIgaXMgdGhlIHRhcmdldCBhbmQgdGhleSBhcmUgbm90IHRoZSBkZXBvc2l0b3IuABgjIE5vdGUA9C0gSWYgdGhlIHRhcmdldCBpcyB0aGUgZGVwb3NpdG9yLCB0aGUgcG9vbCB3aWxsIGJlIGRlc3Ryb3llZC5hAS0gSWYgdGhlIHBvb2wgaGFzIGFueSBwZW5kaW5nIHNsYXNoLCB3ZSBhbHNvIHRyeSB0byBzbGFzaCB0aGUgbWVtYmVyIGJlZm9yZSBsZXR0aW5nIHRoZW1dAXdpdGhkcmF3LiBUaGlzIGNhbGN1bGF0aW9uIGFkZHMgc29tZSB3ZWlnaHQgb3ZlcmhlYWQgYW5kIGlzIG9ubHkgZGVmZW5zaXZlLiBJbiByZWFsaXR5LFUBcG9vbCBzbGFzaGVzIG11c3QgaGF2ZSBiZWVuIGFscmVhZHkgYXBwbGllZCB2aWEgcGVybWlzc2lvbmxlc3MgW2BDYWxsOjphcHBseV9zbGFzaGBdLhhjcmVhdGUQARhhbW91bnT9AQEwQmFsYW5jZU9mPFQ+AAEQcm9vdO0BAVBBY2NvdW50SWRMb29rdXBPZjxUPgABJG5vbWluYXRvcu0BAVBBY2NvdW50SWRMb29rdXBPZjxUPgABHGJvdW5jZXLtAQFQQWNjb3VudElkTG9va3VwT2Y8VD4ABkR0Q3JlYXRlIGEgbmV3IGRlbGVnYXRpb24gcG9vbC4ALCMgQXJndW1lbnRzAFUBKiBgYW1vdW50YCAtIFRoZSBhbW91bnQgb2YgZnVuZHMgdG8gZGVsZWdhdGUgdG8gdGhlIHBvb2wuIFRoaXMgYWxzbyBhY3RzIG9mIGEgc29ydCBvZk0BICBkZXBvc2l0IHNpbmNlIHRoZSBwb29scyBjcmVhdG9yIGNhbm5vdCBmdWxseSB1bmJvbmQgZnVuZHMgdW50aWwgdGhlIHBvb2wgaXMgYmVpbmcwICBkZXN0cm95ZWQuUQEqIGBpbmRleGAgLSBBIGRpc2FtYmlndWF0aW9uIGluZGV4IGZvciBjcmVhdGluZyB0aGUgYWNjb3VudC4gTGlrZWx5IG9ubHkgdXNlZnVsIHdoZW7AICBjcmVhdGluZyBtdWx0aXBsZSBwb29scyBpbiB0aGUgc2FtZSBleHRyaW5zaWMu1CogYHJvb3RgIC0gVGhlIGFjY291bnQgdG8gc2V0IGFzIFtgUG9vbFJvbGVzOjpyb290YF0uDQEqIGBub21pbmF0b3JgIC0gVGhlIGFjY291bnQgdG8gc2V0IGFzIHRoZSBbYFBvb2xSb2xlczo6bm9taW5hdG9yYF0u/CogYGJvdW5jZXJgIC0gVGhlIGFjY291bnQgdG8gc2V0IGFzIHRoZSBbYFBvb2xSb2xlczo6Ym91bmNlcmBdLgAYIyBOb3RlAGEBSW4gYWRkaXRpb24gdG8gYGFtb3VudGAsIHRoZSBjYWxsZXIgd2lsbCB0cmFuc2ZlciB0aGUgZXhpc3RlbnRpYWwgZGVwb3NpdDsgc28gdGhlIGNhbGxlcg0BbmVlZHMgYXQgaGF2ZSBhdCBsZWFzdCBgYW1vdW50ICsgZXhpc3RlbnRpYWxfZGVwb3NpdGAgdHJhbnNmZXJhYmxlLkxjcmVhdGVfd2l0aF9wb29sX2lkFAEYYW1vdW50/QEBMEJhbGFuY2VPZjxUPgABEHJvb3TtAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AASRub21pbmF0b3LtAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AARxib3VuY2Vy7QEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEccG9vbF9pZBABGFBvb2xJZAAHGOxDcmVhdGUgYSBuZXcgZGVsZWdhdGlvbiBwb29sIHdpdGggYSBwcmV2aW91c2x5IHVzZWQgcG9vbCBpZAAsIyBBcmd1bWVudHMAmHNhbWUgYXMgYGNyZWF0ZWAgd2l0aCB0aGUgaW5jbHVzaW9uIG9meCogYHBvb2xfaWRgIC0gYEEgdmFsaWQgUG9vbElkLiBub21pbmF0ZQgBHHBvb2xfaWQQARhQb29sSWQAASh2YWxpZGF0b3JzAQIBRFZlYzxUOjpBY2NvdW50SWQ+AAgwfE5vbWluYXRlIG9uIGJlaGFsZiBvZiB0aGUgcG9vbC4ARQFUaGUgZGlzcGF0Y2ggb3JpZ2luIG9mIHRoaXMgY2FsbCBtdXN0IGJlIHNpZ25lZCBieSB0aGUgcG9vbCBub21pbmF0b3Igb3IgdGhlIHBvb2wocm9vdCByb2xlLgBFAVRoaXMgZGlyZWN0bHkgZm9yd2FyZHMgdGhlIGNhbGwgdG8gYW4gaW1wbGVtZW50YXRpb24gb2YgYFN0YWtpbmdJbnRlcmZhY2VgIChlLmcuLEUBYHBhbGxldC1zdGFraW5nYCkgdGhyb3VnaCBbYENvbmZpZzo6U3Rha2VBZGFwdGVyYF0sIG9uIGJlaGFsZiBvZiB0aGUgYm9uZGVkIHBvb2wuABgjIE5vdGUAWQFJbiBhZGRpdGlvbiB0byBhIGByb290YCBvciBgbm9taW5hdG9yYCByb2xlIG9mIGBvcmlnaW5gLCB0aGUgcG9vbCdzIGRlcG9zaXRvciBuZWVkcyB0bw0BaGF2ZSBhdCBsZWFzdCBgZGVwb3NpdG9yX21pbl9ib25kYCBpbiB0aGUgcG9vbCB0byBzdGFydCBub21pbmF0aW5nLiRzZXRfc3RhdGUIARxwb29sX2lkEAEYUG9vbElkAAEUc3RhdGVtAQEkUG9vbFN0YXRlAAkodFNldCBhIG5ldyBzdGF0ZSBmb3IgdGhlIHBvb2wuAFUBSWYgYSBwb29sIGlzIGFscmVhZHkgaW4gdGhlIGBEZXN0cm95aW5nYCBzdGF0ZSwgdGhlbiB1bmRlciBubyBjb25kaXRpb24gY2FuIGl0cyBzdGF0ZTRjaGFuZ2UgYWdhaW4uAMBUaGUgZGlzcGF0Y2ggb3JpZ2luIG9mIHRoaXMgY2FsbCBtdXN0IGJlIGVpdGhlcjoA3DEuIHNpZ25lZCBieSB0aGUgYm91bmNlciwgb3IgdGhlIHJvb3Qgcm9sZSBvZiB0aGUgcG9vbCxdATIuIGlmIHRoZSBwb29sIGNvbmRpdGlvbnMgdG8gYmUgb3BlbiBhcmUgTk9UIG1ldCAoYXMgZGVzY3JpYmVkIGJ5IGBva190b19iZV9vcGVuYCksIGFuZDkBICAgdGhlbiB0aGUgc3RhdGUgb2YgdGhlIHBvb2wgY2FuIGJlIHBlcm1pc3Npb25sZXNzbHkgY2hhbmdlZCB0byBgRGVzdHJveWluZ2AuMHNldF9tZXRhZGF0YQgBHHBvb2xfaWQQARhQb29sSWQAASBtZXRhZGF0YTgBHFZlYzx1OD4AChCAU2V0IGEgbmV3IG1ldGFkYXRhIGZvciB0aGUgcG9vbC4AXQFUaGUgZGlzcGF0Y2ggb3JpZ2luIG9mIHRoaXMgY2FsbCBtdXN0IGJlIHNpZ25lZCBieSB0aGUgYm91bmNlciwgb3IgdGhlIHJvb3Qgcm9sZSBvZiB0aGUUcG9vbC4sc2V0X2NvbmZpZ3MYATRtaW5fam9pbl9ib25kzQQBWENvbmZpZ09wPEJhbGFuY2VPZjxUPj4AATxtaW5fY3JlYXRlX2JvbmTNBAFYQ29uZmlnT3A8QmFsYW5jZU9mPFQ+PgABJG1heF9wb29sc9EEATRDb25maWdPcDx1MzI+AAEsbWF4X21lbWJlcnPRBAE0Q29uZmlnT3A8dTMyPgABUG1heF9tZW1iZXJzX3Blcl9wb29s0QQBNENvbmZpZ09wPHUzMj4AAVRnbG9iYWxfbWF4X2NvbW1pc3Npb27VBAFEQ29uZmlnT3A8UGVyYmlsbD4ACyxBAVVwZGF0ZSBjb25maWd1cmF0aW9ucyBmb3IgdGhlIG5vbWluYXRpb24gcG9vbHMuIFRoZSBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlYFtgQ29uZmlnOjpBZG1pbk9yaWdpbmBdLgAsIyBBcmd1bWVudHMAoCogYG1pbl9qb2luX2JvbmRgIC0gU2V0IFtgTWluSm9pbkJvbmRgXS6wKiBgbWluX2NyZWF0ZV9ib25kYCAtIFNldCBbYE1pbkNyZWF0ZUJvbmRgXS6EKiBgbWF4X3Bvb2xzYCAtIFNldCBbYE1heFBvb2xzYF0upCogYG1heF9tZW1iZXJzYCAtIFNldCBbYE1heFBvb2xNZW1iZXJzYF0u5CogYG1heF9tZW1iZXJzX3Blcl9wb29sYCAtIFNldCBbYE1heFBvb2xNZW1iZXJzUGVyUG9vbGBdLuAqIGBnbG9iYWxfbWF4X2NvbW1pc3Npb25gIC0gU2V0IFtgR2xvYmFsTWF4Q29tbWlzc2lvbmBdLjB1cGRhdGVfcm9sZXMQARxwb29sX2lkEAEYUG9vbElkAAEgbmV3X3Jvb3TZBAFYQ29uZmlnT3A8VDo6QWNjb3VudElkPgABNG5ld19ub21pbmF0b3LZBAFYQ29uZmlnT3A8VDo6QWNjb3VudElkPgABLG5ld19ib3VuY2Vy2QQBWENvbmZpZ09wPFQ6OkFjY291bnRJZD4ADBx0VXBkYXRlIHRoZSByb2xlcyBvZiB0aGUgcG9vbC4APQFUaGUgcm9vdCBpcyB0aGUgb25seSBlbnRpdHkgdGhhdCBjYW4gY2hhbmdlIGFueSBvZiB0aGUgcm9sZXMsIGluY2x1ZGluZyBpdHNlbGYsuGV4Y2x1ZGluZyB0aGUgZGVwb3NpdG9yLCB3aG8gY2FuIG5ldmVyIGNoYW5nZS4AUQFJdCBlbWl0cyBhbiBldmVudCwgbm90aWZ5aW5nIFVJcyBvZiB0aGUgcm9sZSBjaGFuZ2UuIFRoaXMgZXZlbnQgaXMgcXVpdGUgcmVsZXZhbnQgdG8dAW1vc3QgcG9vbCBtZW1iZXJzIGFuZCB0aGV5IHNob3VsZCBiZSBpbmZvcm1lZCBvZiBjaGFuZ2VzIHRvIHBvb2wgcm9sZXMuFGNoaWxsBAEccG9vbF9pZBABGFBvb2xJZAANRHBDaGlsbCBvbiBiZWhhbGYgb2YgdGhlIHBvb2wuAEEBVGhlIGRpc3BhdGNoIG9yaWdpbiBvZiB0aGlzIGNhbGwgY2FuIGJlIHNpZ25lZCBieSB0aGUgcG9vbCBub21pbmF0b3Igb3IgdGhlIHBvb2ygcm9vdCByb2xlLCBzYW1lIGFzIFtgUGFsbGV0Ojpub21pbmF0ZWBdLgBFAVRoaXMgZGlyZWN0bHkgZm9yd2FyZHMgdGhlIGNhbGwgdG8gYW4gaW1wbGVtZW50YXRpb24gb2YgYFN0YWtpbmdJbnRlcmZhY2VgIChlLmcuLEUBYHBhbGxldC1zdGFraW5nYCkgdGhyb3VnaCBbYENvbmZpZzo6U3Rha2VBZGFwdGVyYF0sIG9uIGJlaGFsZiBvZiB0aGUgYm9uZGVkIHBvb2wuAE0BVW5kZXIgY2VydGFpbiBjb25kaXRpb25zLCB0aGlzIGNhbGwgY2FuIGJlIGRpc3BhdGNoZWQgcGVybWlzc2lvbmxlc3NseSAoaS5lLiBieSBhbnkkYWNjb3VudCkuAKwjIENvbmRpdGlvbnMgZm9yIGEgcGVybWlzc2lvbmxlc3MgZGlzcGF0Y2g6VQEqIFdoZW4gcG9vbCBkZXBvc2l0b3IgaGFzIGxlc3MgdGhhbiBgTWluTm9taW5hdG9yQm9uZGAgc3Rha2VkLCBvdGhlcndpc2UgcG9vbCBtZW1iZXJzXCAgYXJlIHVuYWJsZSB0byB1bmJvbmQuAJwjIENvbmRpdGlvbnMgZm9yIHBlcm1pc3Npb25lZCBkaXNwYXRjaDq0KiBUaGUgY2FsbGVyIGlzIHRoZSBwb29sJ3Mgbm9taW5hdG9yIG9yIHJvb3QuQGJvbmRfZXh0cmFfb3RoZXIIARhtZW1iZXLtAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AARRleHRyYckEAVxCb25kRXh0cmE8QmFsYW5jZU9mPFQ+PgAOJFUBYG9yaWdpbmAgYm9uZHMgZnVuZHMgZnJvbSBgZXh0cmFgIGZvciBzb21lIHBvb2wgbWVtYmVyIGBtZW1iZXJgIGludG8gdGhlaXIgcmVzcGVjdGl2ZRhwb29scy4ASQFgb3JpZ2luYCBjYW4gYm9uZCBleHRyYSBmdW5kcyBmcm9tIGZyZWUgYmFsYW5jZSBvciBwZW5kaW5nIHJld2FyZHMgd2hlbiBgb3JpZ2luID09HG90aGVyYC4ARQFJbiB0aGUgY2FzZSBvZiBgb3JpZ2luICE9IG90aGVyYCwgYG9yaWdpbmAgY2FuIG9ubHkgYm9uZCBleHRyYSBwZW5kaW5nIHJld2FyZHMgb2YVAWBvdGhlcmAgbWVtYmVycyBhc3N1bWluZyBzZXRfY2xhaW1fcGVybWlzc2lvbiBmb3IgdGhlIGdpdmVuIG1lbWJlciBpc8BgUGVybWlzc2lvbmxlc3NDb21wb3VuZGAgb3IgYFBlcm1pc3Npb25sZXNzQWxsYC5Qc2V0X2NsYWltX3Blcm1pc3Npb24EAShwZXJtaXNzaW9uhQEBPENsYWltUGVybWlzc2lvbgAPHEkBQWxsb3dzIGEgcG9vbCBtZW1iZXIgdG8gc2V0IGEgY2xhaW0gcGVybWlzc2lvbiB0byBhbGxvdyBvciBkaXNhbGxvdyBwZXJtaXNzaW9ubGVzc2Bib25kaW5nIGFuZCB3aXRoZHJhd2luZy4ALCMgQXJndW1lbnRzAHgqIGBvcmlnaW5gIC0gTWVtYmVyIG9mIGEgcG9vbC64KiBgcGVybWlzc2lvbmAgLSBUaGUgcGVybWlzc2lvbiB0byBiZSBhcHBsaWVkLkhjbGFpbV9wYXlvdXRfb3RoZXIEARRvdGhlcgABMFQ6OkFjY291bnRJZAAQEAEBYG9yaWdpbmAgY2FuIGNsYWltIHBheW91dHMgb24gc29tZSBwb29sIG1lbWJlciBgb3RoZXJgJ3MgYmVoYWxmLgBVAVBvb2wgbWVtYmVyIGBvdGhlcmAgbXVzdCBoYXZlIGEgYFBlcm1pc3Npb25sZXNzV2l0aGRyYXdgIG9yIGBQZXJtaXNzaW9ubGVzc0FsbGAgY2xhaW2ocGVybWlzc2lvbiBmb3IgdGhpcyBjYWxsIHRvIGJlIHN1Y2Nlc3NmdWwuOHNldF9jb21taXNzaW9uCAEccG9vbF9pZBABGFBvb2xJZAABOG5ld19jb21taXNzaW9ucQEBfE9wdGlvbjwoUGVyYmlsbCwgVDo6QWNjb3VudElkKT4AERR0U2V0IHRoZSBjb21taXNzaW9uIG9mIGEgcG9vbC5VAUJvdGggYSBjb21taXNzaW9uIHBlcmNlbnRhZ2UgYW5kIGEgY29tbWlzc2lvbiBwYXllZSBtdXN0IGJlIHByb3ZpZGVkIGluIHRoZSBgY3VycmVudGBdAXR1cGxlLiBXaGVyZSBhIGBjdXJyZW50YCBvZiBgTm9uZWAgaXMgcHJvdmlkZWQsIGFueSBjdXJyZW50IGNvbW1pc3Npb24gd2lsbCBiZSByZW1vdmVkLgBNAS0gSWYgYSBgTm9uZWAgaXMgc3VwcGxpZWQgdG8gYG5ld19jb21taXNzaW9uYCwgZXhpc3RpbmcgY29tbWlzc2lvbiB3aWxsIGJlIHJlbW92ZWQuSHNldF9jb21taXNzaW9uX21heAgBHHBvb2xfaWQQARhQb29sSWQAAThtYXhfY29tbWlzc2lvbpgBHFBlcmJpbGwAEhSUU2V0IHRoZSBtYXhpbXVtIGNvbW1pc3Npb24gb2YgYSBwb29sLgA5AS0gSW5pdGlhbCBtYXggY2FuIGJlIHNldCB0byBhbnkgYFBlcmJpbGxgLCBhbmQgb25seSBzbWFsbGVyIHZhbHVlcyB0aGVyZWFmdGVyLjUBLSBDdXJyZW50IGNvbW1pc3Npb24gd2lsbCBiZSBsb3dlcmVkIGluIHRoZSBldmVudCBpdCBpcyBoaWdoZXIgdGhhbiBhIG5ldyBtYXg0ICBjb21taXNzaW9uLmhzZXRfY29tbWlzc2lvbl9jaGFuZ2VfcmF0ZQgBHHBvb2xfaWQQARhQb29sSWQAASxjaGFuZ2VfcmF0ZXkBAZxDb21taXNzaW9uQ2hhbmdlUmF0ZTxCbG9ja051bWJlckZvcjxUPj4AExCoU2V0IHRoZSBjb21taXNzaW9uIGNoYW5nZSByYXRlIGZvciBhIHBvb2wuAD0BSW5pdGlhbCBjaGFuZ2UgcmF0ZSBpcyBub3QgYm91bmRlZCwgd2hlcmVhcyBzdWJzZXF1ZW50IHVwZGF0ZXMgY2FuIG9ubHkgYmUgbW9yZXRyZXN0cmljdGl2ZSB0aGFuIHRoZSBjdXJyZW50LkBjbGFpbV9jb21taXNzaW9uBAEccG9vbF9pZBABGFBvb2xJZAAUQGRDbGFpbSBwZW5kaW5nIGNvbW1pc3Npb24uAD0BVGhlIGByb290YCByb2xlIG9mIHRoZSBwb29sIGlzIF9hbHdheXNfIGFsbG93ZWQgdG8gY2xhaW0gdGhlIHBvb2wncyBjb21taXNzaW9uLgBVAUlmIHRoZSBwb29sIGhhcyBzZXQgYENvbW1pc3Npb25DbGFpbVBlcm1pc3Npb246OlBlcm1pc3Npb25sZXNzYCwgdGhlbiBhbnkgYWNjb3VudCBjYW7YdHJpZ2dlciB0aGUgcHJvY2VzcyBvZiBjbGFpbWluZyB0aGUgcG9vbCdzIGNvbW1pc3Npb24uAEEBSWYgdGhlIHBvb2wgaGFzIHNldCBpdHMgYENvbW1pc3Npb25DbGFpbVBlcm1pc3Npb25gIHRvIGBBY2NvdW50KGFjYylgLCB0aGVuIG9ubHkgYWNjb3VudHMwKiBgYWNjYCwgYW5kZCogdGhlIHBvb2wncyByb290IGFjY291bnQAuG1heSBjYWxsIHRoaXMgZXh0cmluc2ljIG9uIGJlaGFsZiBvZiB0aGUgcG9vbC4ALQFQZW5kaW5nIGNvbW1pc3Npb25zIGFyZSBwYWlkIG91dCBhbmQgYWRkZWQgdG8gdGhlIHRvdGFsIGNsYWltZWQgY29tbWlzc2lvbi64VGhlIHRvdGFsIHBlbmRpbmcgY29tbWlzc2lvbiBpcyByZXNldCB0byB6ZXJvLkxhZGp1c3RfcG9vbF9kZXBvc2l0BAEccG9vbF9pZBABGFBvb2xJZAAVHOxUb3AgdXAgdGhlIGRlZmljaXQgb3Igd2l0aGRyYXcgdGhlIGV4Y2VzcyBFRCBmcm9tIHRoZSBwb29sLgBRAVdoZW4gYSBwb29sIGlzIGNyZWF0ZWQsIHRoZSBwb29sIGRlcG9zaXRvciB0cmFuc2ZlcnMgRUQgdG8gdGhlIHJld2FyZCBhY2NvdW50IG9mIHRoZVUBcG9vbC4gRUQgaXMgc3ViamVjdCB0byBjaGFuZ2UgYW5kIG92ZXIgdGltZSwgdGhlIGRlcG9zaXQgaW4gdGhlIHJld2FyZCBhY2NvdW50IG1heSBiZVEBaW5zdWZmaWNpZW50IHRvIGNvdmVyIHRoZSBFRCBkZWZpY2l0IG9mIHRoZSBwb29sIG9yIHZpY2UtdmVyc2Egd2hlcmUgdGhlcmUgaXMgZXhjZXNzMQFkZXBvc2l0IHRvIHRoZSBwb29sLiBUaGlzIGNhbGwgYWxsb3dzIGFueW9uZSB0byBhZGp1c3QgdGhlIEVEIGRlcG9zaXQgb2YgdGhl9HBvb2wgYnkgZWl0aGVyIHRvcHBpbmcgdXAgdGhlIGRlZmljaXQgb3IgY2xhaW1pbmcgdGhlIGV4Y2Vzcy58c2V0X2NvbW1pc3Npb25fY2xhaW1fcGVybWlzc2lvbggBHHBvb2xfaWQQARhQb29sSWQAAShwZXJtaXNzaW9ufQEBvE9wdGlvbjxDb21taXNzaW9uQ2xhaW1QZXJtaXNzaW9uPFQ6OkFjY291bnRJZD4+ABYQzFNldCBvciByZW1vdmUgYSBwb29sJ3MgY29tbWlzc2lvbiBjbGFpbSBwZXJtaXNzaW9uLgBhAURldGVybWluZXMgd2hvIGNhbiBjbGFpbSB0aGUgcG9vbCdzIHBlbmRpbmcgY29tbWlzc2lvbi4gT25seSB0aGUgYFJvb3RgIHJvbGUgb2YgdGhlIHBvb2zIaXMgYWJsZSB0byBjb25maWd1cmUgY29tbWlzc2lvbiBjbGFpbSBwZXJtaXNzaW9ucy4sYXBwbHlfc2xhc2gEAThtZW1iZXJfYWNjb3VudO0BAVBBY2NvdW50SWRMb29rdXBPZjxUPgAXJIhBcHBseSBhIHBlbmRpbmcgc2xhc2ggb24gYSBtZW1iZXIuACUBRmFpbHMgdW5sZXNzIFtgY3JhdGU6OnBhbGxldDo6Q29uZmlnOjpTdGFrZUFkYXB0ZXJgXSBpcyBvZiBzdHJhdGVneSB0eXBlOqRbYGFkYXB0ZXI6OlN0YWtlU3RyYXRlZ3lUeXBlOjpEZWxlZ2F0ZWBdLgBdAVRoZSBwZW5kaW5nIHNsYXNoIGFtb3VudCBvZiB0aGUgbWVtYmVyIG11c3QgYmUgZXF1YWwgb3IgbW9yZSB0aGFuIGBFeGlzdGVudGlhbERlcG9zaXRgLlEBVGhpcyBjYWxsIGNhbiBiZSBkaXNwYXRjaGVkIHBlcm1pc3Npb25sZXNzbHkgKGkuZS4gYnkgYW55IGFjY291bnQpLiBJZiB0aGUgZXhlY3V0aW9uSQFpcyBzdWNjZXNzZnVsLCBmZWUgaXMgcmVmdW5kZWQgYW5kIGNhbGxlciBtYXkgYmUgcmV3YXJkZWQgd2l0aCBhIHBhcnQgb2YgdGhlIHNsYXNoDQFiYXNlZCBvbiB0aGUgW2BjcmF0ZTo6cGFsbGV0OjpDb25maWc6OlN0YWtlQWRhcHRlcmBdIGNvbmZpZ3VyYXRpb24uSG1pZ3JhdGVfZGVsZWdhdGlvbgQBOG1lbWJlcl9hY2NvdW507QEBUEFjY291bnRJZExvb2t1cE9mPFQ+ABgkHQFNaWdyYXRlcyBkZWxlZ2F0ZWQgZnVuZHMgZnJvbSB0aGUgcG9vbCBhY2NvdW50IHRvIHRoZSBgbWVtYmVyX2FjY291bnRgLgAlAUZhaWxzIHVubGVzcyBbYGNyYXRlOjpwYWxsZXQ6OkNvbmZpZzo6U3Rha2VBZGFwdGVyYF0gaXMgb2Ygc3RyYXRlZ3kgdHlwZTqkW2BhZGFwdGVyOjpTdGFrZVN0cmF0ZWd5VHlwZTo6RGVsZWdhdGVgXS4AKQFUaGlzIGlzIGEgcGVybWlzc2lvbi1sZXNzIGNhbGwgYW5kIHJlZnVuZHMgYW55IGZlZSBpZiBjbGFpbSBpcyBzdWNjZXNzZnVsLgBdAUlmIHRoZSBwb29sIGhhcyBtaWdyYXRlZCB0byBkZWxlZ2F0aW9uIGJhc2VkIHN0YWtpbmcsIHRoZSBzdGFrZWQgdG9rZW5zIG9mIHBvb2wgbWVtYmVycykBY2FuIGJlIG1vdmVkIGFuZCBoZWxkIGluIHRoZWlyIG93biBhY2NvdW50LiBTZWUgW2BhZGFwdGVyOjpEZWxlZ2F0ZVN0YWtlYF14bWlncmF0ZV9wb29sX3RvX2RlbGVnYXRlX3N0YWtlBAEccG9vbF9pZBABGFBvb2xJZAAZJPRNaWdyYXRlIHBvb2wgZnJvbSBbYGFkYXB0ZXI6OlN0YWtlU3RyYXRlZ3lUeXBlOjpUcmFuc2ZlcmBdIHRvpFtgYWRhcHRlcjo6U3Rha2VTdHJhdGVneVR5cGU6OkRlbGVnYXRlYF0uACUBRmFpbHMgdW5sZXNzIFtgY3JhdGU6OnBhbGxldDo6Q29uZmlnOjpTdGFrZUFkYXB0ZXJgXSBpcyBvZiBzdHJhdGVneSB0eXBlOqRbYGFkYXB0ZXI6OlN0YWtlU3RyYXRlZ3lUeXBlOjpEZWxlZ2F0ZWBdLgBBAVRoaXMgY2FsbCBjYW4gYmUgZGlzcGF0Y2hlZCBwZXJtaXNzaW9ubGVzc2x5LCBhbmQgcmVmdW5kcyBhbnkgZmVlIGlmIHN1Y2Nlc3NmdWwuAEkBSWYgdGhlIHBvb2wgaGFzIGFscmVhZHkgbWlncmF0ZWQgdG8gZGVsZWdhdGlvbiBiYXNlZCBzdGFraW5nLCB0aGlzIGNhbGwgd2lsbCBmYWlsLgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy7JBAhccGFsbGV0X25vbWluYXRpb25fcG9vbHMkQm9uZEV4dHJhBBxCYWxhbmNlARgBCCxGcmVlQmFsYW5jZQQAGAEcQmFsYW5jZQAAABxSZXdhcmRzAAEAAM0ECFxwYWxsZXRfbm9taW5hdGlvbl9wb29scyBDb25maWdPcAQEVAEYAQwQTm9vcAAAAAxTZXQEABgBBFQAAQAYUmVtb3ZlAAIAANEECFxwYWxsZXRfbm9taW5hdGlvbl9wb29scyBDb25maWdPcAQEVAEQAQwQTm9vcAAAAAxTZXQEABABBFQAAQAYUmVtb3ZlAAIAANUECFxwYWxsZXRfbm9taW5hdGlvbl9wb29scyBDb25maWdPcAQEVAGYAQwQTm9vcAAAAAxTZXQEAJgBBFQAAQAYUmVtb3ZlAAIAANkECFxwYWxsZXRfbm9taW5hdGlvbl9wb29scyBDb25maWdPcAQEVAEAAQwQTm9vcAAAAAxTZXQEAAABBFQAAQAYUmVtb3ZlAAIAAN0EDExwYWxsZXRfZmFzdF91bnN0YWtlGHBhbGxldBBDYWxsBARUAAEMVHJlZ2lzdGVyX2Zhc3RfdW5zdGFrZQAAaIhSZWdpc3RlciBvbmVzZWxmIGZvciBmYXN0LXVuc3Rha2UuAEgjIyBEaXNwYXRjaCBPcmlnaW4ARQFUaGUgZGlzcGF0Y2ggb3JpZ2luIG9mIHRoaXMgY2FsbCBtdXN0IGJlICpzaWduZWQqIGJ5IHdob2V2ZXIgaXMgcGVybWl0dGVkIHRvIGNhbGzwdW5ib25kIGZ1bmRzIGJ5IHRoZSBzdGFraW5nIHN5c3RlbS4gU2VlIFtgQ29uZmlnOjpTdGFraW5nYF0uACgjIyBEZXRhaWxzADkBVGhlIHN0YXNoIGFzc29jaWF0ZWQgd2l0aCB0aGUgb3JpZ2luIG11c3QgaGF2ZSBubyBvbmdvaW5nIHVubG9ja2luZyBjaHVua3MuIElmXQFzdWNjZXNzZnVsLCB0aGlzIHdpbGwgZnVsbHkgdW5ib25kIGFuZCBjaGlsbCB0aGUgc3Rhc2guIFRoZW4sIGl0IHdpbGwgZW5xdWV1ZSB0aGUgc3Rhc2iAdG8gYmUgY2hlY2tlZCBpbiBmdXJ0aGVyIGJsb2Nrcy4AUQFJZiBieSB0aGUgdGltZSB0aGlzIGlzIGNhbGxlZCwgdGhlIHN0YXNoIGlzIGFjdHVhbGx5IGVsaWdpYmxlIGZvciBmYXN0LXVuc3Rha2UsIHRoZW5FAXRoZXkgYXJlIGd1YXJhbnRlZWQgdG8gcmVtYWluIGVsaWdpYmxlLCBiZWNhdXNlIHRoZSBjYWxsIHdpbGwgY2hpbGwgdGhlbSBhcyB3ZWxsLgA9AUlmIHRoZSBjaGVjayB3b3JrcywgdGhlIGVudGlyZSBzdGFraW5nIGRhdGEgaXMgcmVtb3ZlZCwgaS5lLiB0aGUgc3Rhc2ggaXMgZnVsbHkkdW5zdGFrZWQuAF0BSWYgdGhlIGNoZWNrIGZhaWxzLCB0aGUgc3Rhc2ggcmVtYWlucyBjaGlsbGVkIGFuZCB3YWl0aW5nIGZvciBiZWluZyB1bmJvbmRlZCBhcyBpbiB3aXRoYQF0aGUgbm9ybWFsIHN0YWtpbmcgc3lzdGVtLCBidXQgdGhleSBsb3NlIHBhcnQgb2YgdGhlaXIgdW5ib25kaW5nIGNodW5rcyBkdWUgdG8gY29uc3VtaW5nWHRoZSBjaGFpbidzIHJlc291cmNlcy4AJCMjIEV2ZW50cwAJAVNvbWUgZXZlbnRzIGZyb20gdGhlIHN0YWtpbmcgYW5kIGN1cnJlbmN5IHN5c3RlbSBtaWdodCBiZSBlbWl0dGVkLihkZXJlZ2lzdGVyAAFIpERlcmVnaXN0ZXIgb25lc2VsZiBmcm9tIHRoZSBmYXN0LXVuc3Rha2UuAEgjIyBEaXNwYXRjaCBPcmlnaW4ARQFUaGUgZGlzcGF0Y2ggb3JpZ2luIG9mIHRoaXMgY2FsbCBtdXN0IGJlICpzaWduZWQqIGJ5IHdob2V2ZXIgaXMgcGVybWl0dGVkIHRvIGNhbGzwdW5ib25kIGZ1bmRzIGJ5IHRoZSBzdGFraW5nIHN5c3RlbS4gU2VlIFtgQ29uZmlnOjpTdGFraW5nYF0uACgjIyBEZXRhaWxzAGEBVGhpcyBpcyB1c2VmdWwgaWYgb25lIGlzIHJlZ2lzdGVyZWQsIHRoZXkgYXJlIHN0aWxsIHdhaXRpbmcsIGFuZCB0aGV5IGNoYW5nZSB0aGVpciBtaW5kLgBZAU5vdGUgdGhhdCB0aGUgYXNzb2NpYXRlZCBzdGFzaCBpcyBzdGlsbCBmdWxseSB1bmJvbmRlZCBhbmQgY2hpbGxlZCBhcyBhIGNvbnNlcXVlbmNlIG9mWQFjYWxsaW5nIFtgUGFsbGV0OjpyZWdpc3Rlcl9mYXN0X3Vuc3Rha2VgXS4gVGhlcmVmb3JlLCB0aGlzIHNob3VsZCBwcm9iYWJseSBiZSBmb2xsb3dlZLBieSBhIGNhbGwgdG8gYHJlYm9uZGAgaW4gdGhlIHN0YWtpbmcgc3lzdGVtLgAkIyMgRXZlbnRzAAkBU29tZSBldmVudHMgZnJvbSB0aGUgc3Rha2luZyBhbmQgY3VycmVuY3kgc3lzdGVtIG1pZ2h0IGJlIGVtaXR0ZWQuHGNvbnRyb2wEATRlcmFzX3RvX2NoZWNrEAEgRXJhSW5kZXgAAjSUQ29udHJvbCB0aGUgb3BlcmF0aW9uIG9mIHRoaXMgcGFsbGV0LgBIIyMgRGlzcGF0Y2ggT3JpZ2luAA0BVGhlIGRpc3BhdGNoIG9yaWdpbiBvZiB0aGlzIGNhbGwgbXVzdCBiZSBbYENvbmZpZzo6Q29udHJvbE9yaWdpbmBdLgAoIyMgRGV0YWlscwBBAUNhbiBzZXQgdGhlIG51bWJlciBvZiBlcmFzIHRvIGNoZWNrIHBlciBibG9jaywgYW5kIHBvdGVudGlhbGx5IG90aGVyIGFkbWluIHdvcmsuACQjIyBFdmVudHMApE5vIGV2ZW50cyBhcmUgZW1pdHRlZCBmcm9tIHRoaXMgZGlzcGF0Y2guBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLuEEDGBwYWxsZXRfY29udmljdGlvbl92b3RpbmcYcGFsbGV0EENhbGwIBFQABEkAARgQdm90ZQgBKHBvbGxfaW5kZXjJAQFEUG9sbEluZGV4T2Y8VCwgST4AARB2b3RlmQEBcEFjY291bnRWb3RlPEJhbGFuY2VPZjxULCBJPj4AACQZAVZvdGUgaW4gYSBwb2xsLiBJZiBgdm90ZS5pc19heWUoKWAsIHRoZSB2b3RlIGlzIHRvIGVuYWN0IHRoZSBwcm9wb3NhbDu4b3RoZXJ3aXNlIGl0IGlzIGEgdm90ZSB0byBrZWVwIHRoZSBzdGF0dXMgcXVvLgDIVGhlIGRpc3BhdGNoIG9yaWdpbiBvZiB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXy4AyC0gYHBvbGxfaW5kZXhgOiBUaGUgaW5kZXggb2YgdGhlIHBvbGwgdG8gdm90ZSBmb3IuhC0gYHZvdGVgOiBUaGUgdm90ZSBjb25maWd1cmF0aW9uLgAVAVdlaWdodDogYE8oUilgIHdoZXJlIFIgaXMgdGhlIG51bWJlciBvZiBwb2xscyB0aGUgdm90ZXIgaGFzIHZvdGVkIG9uLiBkZWxlZ2F0ZRABFGNsYXNzQQEBNENsYXNzT2Y8VCwgST4AAQh0b+0BAVBBY2NvdW50SWRMb29rdXBPZjxUPgABKGNvbnZpY3Rpb27lBAEoQ29udmljdGlvbgABHGJhbGFuY2UYATxCYWxhbmNlT2Y8VCwgST4AAVxNAURlbGVnYXRlIHRoZSB2b3RpbmcgcG93ZXIgKHdpdGggc29tZSBnaXZlbiBjb252aWN0aW9uKSBvZiB0aGUgc2VuZGluZyBhY2NvdW50IGZvciBhaHBhcnRpY3VsYXIgY2xhc3Mgb2YgcG9sbHMuAFUBVGhlIGJhbGFuY2UgZGVsZWdhdGVkIGlzIGxvY2tlZCBmb3IgYXMgbG9uZyBhcyBpdCdzIGRlbGVnYXRlZCwgYW5kIHRoZXJlYWZ0ZXIgZm9yIHRoZch0aW1lIGFwcHJvcHJpYXRlIGZvciB0aGUgY29udmljdGlvbidzIGxvY2sgcGVyaW9kLgBdAVRoZSBkaXNwYXRjaCBvcmlnaW4gb2YgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8sIGFuZCB0aGUgc2lnbmluZyBhY2NvdW50IG11c3QgZWl0aGVyOnQgIC0gYmUgZGVsZWdhdGluZyBhbHJlYWR5OyBvckUBICAtIGhhdmUgbm8gdm90aW5nIGFjdGl2aXR5IChpZiB0aGVyZSBpcywgdGhlbiBpdCB3aWxsIG5lZWQgdG8gYmUgcmVtb3ZlZCB0aHJvdWdoTCAgICBgcmVtb3ZlX3ZvdGVgKS4ARQEtIGB0b2A6IFRoZSBhY2NvdW50IHdob3NlIHZvdGluZyB0aGUgYHRhcmdldGAgYWNjb3VudCdzIHZvdGluZyBwb3dlciB3aWxsIGZvbGxvdy5dAS0gYGNsYXNzYDogVGhlIGNsYXNzIG9mIHBvbGxzIHRvIGRlbGVnYXRlLiBUbyBkZWxlZ2F0ZSBtdWx0aXBsZSBjbGFzc2VzLCBtdWx0aXBsZSBjYWxsc4AgIHRvIHRoaXMgZnVuY3Rpb24gYXJlIHJlcXVpcmVkLlUBLSBgY29udmljdGlvbmA6IFRoZSBjb252aWN0aW9uIHRoYXQgd2lsbCBiZSBhdHRhY2hlZCB0byB0aGUgZGVsZWdhdGVkIHZvdGVzLiBXaGVuIHRoZUEBICBhY2NvdW50IGlzIHVuZGVsZWdhdGVkLCB0aGUgZnVuZHMgd2lsbCBiZSBsb2NrZWQgZm9yIHRoZSBjb3JyZXNwb25kaW5nIHBlcmlvZC5hAS0gYGJhbGFuY2VgOiBUaGUgYW1vdW50IG9mIHRoZSBhY2NvdW50J3MgYmFsYW5jZSB0byBiZSB1c2VkIGluIGRlbGVnYXRpbmcuIFRoaXMgbXVzdCBub3S0ICBiZSBtb3JlIHRoYW4gdGhlIGFjY291bnQncyBjdXJyZW50IGJhbGFuY2UuAEhFbWl0cyBgRGVsZWdhdGVkYC4AJQFXZWlnaHQ6IGBPKFIpYCB3aGVyZSBSIGlzIHRoZSBudW1iZXIgb2YgcG9sbHMgdGhlIHZvdGVyIGRlbGVnYXRpbmcgdG8gaGFzTQEgIHZvdGVkIG9uLiBXZWlnaHQgaXMgaW5pdGlhbGx5IGNoYXJnZWQgYXMgaWYgbWF4aW11bSB2b3RlcywgYnV0IGlzIHJlZnVuZGVkIGxhdGVyLih1bmRlbGVnYXRlBAEUY2xhc3NBAQE0Q2xhc3NPZjxULCBJPgACOE0BVW5kZWxlZ2F0ZSB0aGUgdm90aW5nIHBvd2VyIG9mIHRoZSBzZW5kaW5nIGFjY291bnQgZm9yIGEgcGFydGljdWxhciBjbGFzcyBvZiBwb2xscy4AXQFUb2tlbnMgbWF5IGJlIHVubG9ja2VkIGZvbGxvd2luZyBvbmNlIGFuIGFtb3VudCBvZiB0aW1lIGNvbnNpc3RlbnQgd2l0aCB0aGUgbG9jayBwZXJpb2QJAW9mIHRoZSBjb252aWN0aW9uIHdpdGggd2hpY2ggdGhlIGRlbGVnYXRpb24gd2FzIGlzc3VlZCBoYXMgcGFzc2VkLgBFAVRoZSBkaXNwYXRjaCBvcmlnaW4gb2YgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8gYW5kIHRoZSBzaWduaW5nIGFjY291bnQgbXVzdCBiZVRjdXJyZW50bHkgZGVsZWdhdGluZy4A8C0gYGNsYXNzYDogVGhlIGNsYXNzIG9mIHBvbGxzIHRvIHJlbW92ZSB0aGUgZGVsZWdhdGlvbiBmcm9tLgBQRW1pdHMgYFVuZGVsZWdhdGVkYC4AJQFXZWlnaHQ6IGBPKFIpYCB3aGVyZSBSIGlzIHRoZSBudW1iZXIgb2YgcG9sbHMgdGhlIHZvdGVyIGRlbGVnYXRpbmcgdG8gaGFzTQEgIHZvdGVkIG9uLiBXZWlnaHQgaXMgaW5pdGlhbGx5IGNoYXJnZWQgYXMgaWYgbWF4aW11bSB2b3RlcywgYnV0IGlzIHJlZnVuZGVkIGxhdGVyLhh1bmxvY2sIARRjbGFzc0EBATRDbGFzc09mPFQsIEk+AAEYdGFyZ2V07QEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAMkXQFSZW1vdmUgdGhlIGxvY2sgY2F1c2VkIGJ5IHByaW9yIHZvdGluZy9kZWxlZ2F0aW5nIHdoaWNoIGhhcyBleHBpcmVkIHdpdGhpbiBhIHBhcnRpY3VsYXIYY2xhc3MuAMhUaGUgZGlzcGF0Y2ggb3JpZ2luIG9mIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfLgCgLSBgY2xhc3NgOiBUaGUgY2xhc3Mgb2YgcG9sbHMgdG8gdW5sb2NrLrgtIGB0YXJnZXRgOiBUaGUgYWNjb3VudCB0byByZW1vdmUgdGhlIGxvY2sgb24uALxXZWlnaHQ6IGBPKFIpYCB3aXRoIFIgbnVtYmVyIG9mIHZvdGUgb2YgdGFyZ2V0LixyZW1vdmVfdm90ZQgBFGNsYXNz6QQBVE9wdGlvbjxDbGFzc09mPFQsIEk+PgABFGluZGV4EAFEUG9sbEluZGV4T2Y8VCwgST4ABHRkUmVtb3ZlIGEgdm90ZSBmb3IgYSBwb2xsLgAMSWY6cC0gdGhlIHBvbGwgd2FzIGNhbmNlbGxlZCwgb3JkLSB0aGUgcG9sbCBpcyBvbmdvaW5nLCBvcngtIHRoZSBwb2xsIGhhcyBlbmRlZCBzdWNoIHRoYXT8ICAtIHRoZSB2b3RlIG9mIHRoZSBhY2NvdW50IHdhcyBpbiBvcHBvc2l0aW9uIHRvIHRoZSByZXN1bHQ7IG9y1CAgLSB0aGVyZSB3YXMgbm8gY29udmljdGlvbiB0byB0aGUgYWNjb3VudCdzIHZvdGU7IG9yhCAgLSB0aGUgYWNjb3VudCBtYWRlIGEgc3BsaXQgdm90ZV0BLi4udGhlbiB0aGUgdm90ZSBpcyByZW1vdmVkIGNsZWFubHkgYW5kIGEgZm9sbG93aW5nIGNhbGwgdG8gYHVubG9ja2AgbWF5IHJlc3VsdCBpbiBtb3JlWGZ1bmRzIGJlaW5nIGF2YWlsYWJsZS4AkElmLCBob3dldmVyLCB0aGUgcG9sbCBoYXMgZW5kZWQgYW5kOuwtIGl0IGZpbmlzaGVkIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHZvdGUgb2YgdGhlIGFjY291bnQsIGFuZNwtIHRoZSBhY2NvdW50IG1hZGUgYSBzdGFuZGFyZCB2b3RlIHdpdGggY29udmljdGlvbiwgYW5kvC0gdGhlIGxvY2sgcGVyaW9kIG9mIHRoZSBjb252aWN0aW9uIGlzIG5vdCBvdmVyWQEuLi50aGVuIHRoZSBsb2NrIHdpbGwgYmUgYWdncmVnYXRlZCBpbnRvIHRoZSBvdmVyYWxsIGFjY291bnQncyBsb2NrLCB3aGljaCBtYXkgaW52b2x2ZVkBKm92ZXJsb2NraW5nKiAod2hlcmUgdGhlIHR3byBsb2NrcyBhcmUgY29tYmluZWQgaW50byBhIHNpbmdsZSBsb2NrIHRoYXQgaXMgdGhlIG1heGltdW3kb2YgYm90aCB0aGUgYW1vdW50IGxvY2tlZCBhbmQgdGhlIHRpbWUgaXMgaXQgbG9ja2VkIGZvcikuAEkBVGhlIGRpc3BhdGNoIG9yaWdpbiBvZiB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXywgYW5kIHRoZSBzaWduZXIgbXVzdCBoYXZlIGEgdm90ZXByZWdpc3RlcmVkIGZvciBwb2xsIGBpbmRleGAuANwtIGBpbmRleGA6IFRoZSBpbmRleCBvZiBwb2xsIG9mIHRoZSB2b3RlIHRvIGJlIHJlbW92ZWQuVQEtIGBjbGFzc2A6IE9wdGlvbmFsIHBhcmFtZXRlciwgaWYgZ2l2ZW4gaXQgaW5kaWNhdGVzIHRoZSBjbGFzcyBvZiB0aGUgcG9sbC4gRm9yIHBvbGxz8CAgd2hpY2ggaGF2ZSBmaW5pc2hlZCBvciBhcmUgY2FuY2VsbGVkLCB0aGlzIG11c3QgYmUgYFNvbWVgLgBFAVdlaWdodDogYE8oUiArIGxvZyBSKWAgd2hlcmUgUiBpcyB0aGUgbnVtYmVyIG9mIHBvbGxzIHRoYXQgYHRhcmdldGAgaGFzIHZvdGVkIG9uLtggIFdlaWdodCBpcyBjYWxjdWxhdGVkIGZvciB0aGUgbWF4aW11bSBudW1iZXIgb2Ygdm90ZS5EcmVtb3ZlX290aGVyX3ZvdGUMARh0YXJnZXTtAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AARRjbGFzc0EBATRDbGFzc09mPFQsIEk+AAEUaW5kZXgQAURQb2xsSW5kZXhPZjxULCBJPgAFQGRSZW1vdmUgYSB2b3RlIGZvciBhIHBvbGwuAE0BSWYgdGhlIGB0YXJnZXRgIGlzIGVxdWFsIHRvIHRoZSBzaWduZXIsIHRoZW4gdGhpcyBmdW5jdGlvbiBpcyBleGFjdGx5IGVxdWl2YWxlbnQgdG8tAWByZW1vdmVfdm90ZWAuIElmIG5vdCBlcXVhbCB0byB0aGUgc2lnbmVyLCB0aGVuIHRoZSB2b3RlIG11c3QgaGF2ZSBleHBpcmVkLCUBZWl0aGVyIGJlY2F1c2UgdGhlIHBvbGwgd2FzIGNhbmNlbGxlZCwgYmVjYXVzZSB0aGUgdm90ZXIgbG9zdCB0aGUgcG9sbCBvcphiZWNhdXNlIHRoZSBjb252aWN0aW9uIHBlcmlvZCBpcyBvdmVyLgDIVGhlIGRpc3BhdGNoIG9yaWdpbiBvZiB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXy4AYQEtIGB0YXJnZXRgOiBUaGUgYWNjb3VudCBvZiB0aGUgdm90ZSB0byBiZSByZW1vdmVkOyB0aGlzIGFjY291bnQgbXVzdCBoYXZlIHZvdGVkIGZvciBwb2xsKCAgYGluZGV4YC7cLSBgaW5kZXhgOiBUaGUgaW5kZXggb2YgcG9sbCBvZiB0aGUgdm90ZSB0byBiZSByZW1vdmVkLoQtIGBjbGFzc2A6IFRoZSBjbGFzcyBvZiB0aGUgcG9sbC4ARQFXZWlnaHQ6IGBPKFIgKyBsb2cgUilgIHdoZXJlIFIgaXMgdGhlIG51bWJlciBvZiBwb2xscyB0aGF0IGB0YXJnZXRgIGhhcyB2b3RlZCBvbi7YICBXZWlnaHQgaXMgY2FsY3VsYXRlZCBmb3IgdGhlIG1heGltdW0gbnVtYmVyIG9mIHZvdGUuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLuUEDGBwYWxsZXRfY29udmljdGlvbl92b3RpbmcoY29udmljdGlvbihDb252aWN0aW9uAAEcEE5vbmUAAAAgTG9ja2VkMXgAAQAgTG9ja2VkMngAAgAgTG9ja2VkM3gAAwAgTG9ja2VkNHgABAAgTG9ja2VkNXgABQAgTG9ja2VkNngABgAA6QQEGE9wdGlvbgQEVAFBAQEIEE5vbmUAAAAQU29tZQQAQQEAAAEAAO0EDEBwYWxsZXRfcmVmZXJlbmRhGHBhbGxldBBDYWxsCARUAARJAAEkGHN1Ym1pdAwBPHByb3Bvc2FsX29yaWdpbqECAVxCb3g8UGFsbGV0c09yaWdpbk9mPFQ+PgABIHByb3Bvc2FspQEBTEJvdW5kZWRDYWxsT2Y8VCwgST4AAUBlbmFjdG1lbnRfbW9tZW508QQBiERpc3BhdGNoVGltZTxCbG9ja051bWJlckZvcjxULCBJPj4AACSwUHJvcG9zZSBhIHJlZmVyZW5kdW0gb24gYSBwcml2aWxlZ2VkIGFjdGlvbi4AWQEtIGBvcmlnaW5gOiBtdXN0IGJlIGBTdWJtaXRPcmlnaW5gIGFuZCB0aGUgYWNjb3VudCBtdXN0IGhhdmUgYFN1Ym1pc3Npb25EZXBvc2l0YCBmdW5kczAgIGF2YWlsYWJsZS4tAS0gYHByb3Bvc2FsX29yaWdpbmA6IFRoZSBvcmlnaW4gZnJvbSB3aGljaCB0aGUgcHJvcG9zYWwgc2hvdWxkIGJlIGV4ZWN1dGVkLmwtIGBwcm9wb3NhbGA6IFRoZSBwcm9wb3NhbC4VAS0gYGVuYWN0bWVudF9tb21lbnRgOiBUaGUgbW9tZW50IHRoYXQgdGhlIHByb3Bvc2FsIHNob3VsZCBiZSBlbmFjdGVkLgBIRW1pdHMgYFN1Ym1pdHRlZGAuWHBsYWNlX2RlY2lzaW9uX2RlcG9zaXQEARRpbmRleBABPFJlZmVyZW5kdW1JbmRleAABIKxQb3N0IHRoZSBEZWNpc2lvbiBEZXBvc2l0IGZvciBhIHJlZmVyZW5kdW0uADkBLSBgb3JpZ2luYDogbXVzdCBiZSBgU2lnbmVkYCBhbmQgdGhlIGFjY291bnQgbXVzdCBoYXZlIGZ1bmRzIGF2YWlsYWJsZSBmb3IgdGhloCAgcmVmZXJlbmR1bSdzIHRyYWNrJ3MgRGVjaXNpb24gRGVwb3NpdC5RAS0gYGluZGV4YDogVGhlIGluZGV4IG9mIHRoZSBzdWJtaXR0ZWQgcmVmZXJlbmR1bSB3aG9zZSBEZWNpc2lvbiBEZXBvc2l0IGlzIHlldCB0byBiZSQgIHBvc3RlZC4AeEVtaXRzIGBEZWNpc2lvbkRlcG9zaXRQbGFjZWRgLlxyZWZ1bmRfZGVjaXNpb25fZGVwb3NpdAQBFGluZGV4EAE8UmVmZXJlbmR1bUluZGV4AAIcKQFSZWZ1bmQgdGhlIERlY2lzaW9uIERlcG9zaXQgZm9yIGEgY2xvc2VkIHJlZmVyZW5kdW0gYmFjayB0byB0aGUgZGVwb3NpdG9yLgCcLSBgb3JpZ2luYDogbXVzdCBiZSBgU2lnbmVkYCBvciBgUm9vdGAuTQEtIGBpbmRleGA6IFRoZSBpbmRleCBvZiBhIGNsb3NlZCByZWZlcmVuZHVtIHdob3NlIERlY2lzaW9uIERlcG9zaXQgaGFzIG5vdCB5ZXQgYmVlbiwgIHJlZnVuZGVkLgCARW1pdHMgYERlY2lzaW9uRGVwb3NpdFJlZnVuZGVkYC4YY2FuY2VsBAEUaW5kZXgQATxSZWZlcmVuZHVtSW5kZXgAAxh0Q2FuY2VsIGFuIG9uZ29pbmcgcmVmZXJlbmR1bS4AnC0gYG9yaWdpbmA6IG11c3QgYmUgdGhlIGBDYW5jZWxPcmlnaW5gLtwtIGBpbmRleGA6IFRoZSBpbmRleCBvZiB0aGUgcmVmZXJlbmR1bSB0byBiZSBjYW5jZWxsZWQuAEhFbWl0cyBgQ2FuY2VsbGVkYC4Qa2lsbAQBFGluZGV4EAE8UmVmZXJlbmR1bUluZGV4AAQY0ENhbmNlbCBhbiBvbmdvaW5nIHJlZmVyZW5kdW0gYW5kIHNsYXNoIHRoZSBkZXBvc2l0cy4AlC0gYG9yaWdpbmA6IG11c3QgYmUgdGhlIGBLaWxsT3JpZ2luYC7cLSBgaW5kZXhgOiBUaGUgaW5kZXggb2YgdGhlIHJlZmVyZW5kdW0gdG8gYmUgY2FuY2VsbGVkLgCQRW1pdHMgYEtpbGxlZGAgYW5kIGBEZXBvc2l0U2xhc2hlZGAuQG51ZGdlX3JlZmVyZW5kdW0EARRpbmRleBABPFJlZmVyZW5kdW1JbmRleAAFEB0BQWR2YW5jZSBhIHJlZmVyZW5kdW0gb250byBpdHMgbmV4dCBsb2dpY2FsIHN0YXRlLiBPbmx5IHVzZWQgaW50ZXJuYWxseS4AbC0gYG9yaWdpbmA6IG11c3QgYmUgYFJvb3RgLqQtIGBpbmRleGA6IHRoZSByZWZlcmVuZHVtIHRvIGJlIGFkdmFuY2VkLkhvbmVfZmV3ZXJfZGVjaWRpbmcEARR0cmFja0EBATxUcmFja0lkT2Y8VCwgST4ABiQJAUFkdmFuY2UgYSB0cmFjayBvbnRvIGl0cyBuZXh0IGxvZ2ljYWwgc3RhdGUuIE9ubHkgdXNlZCBpbnRlcm5hbGx5LgBsLSBgb3JpZ2luYDogbXVzdCBiZSBgUm9vdGAukC0gYHRyYWNrYDogdGhlIHRyYWNrIHRvIGJlIGFkdmFuY2VkLgBRAUFjdGlvbiBpdGVtIGZvciB3aGVuIHRoZXJlIGlzIG5vdyBvbmUgZmV3ZXIgcmVmZXJlbmR1bSBpbiB0aGUgZGVjaWRpbmcgcGhhc2UgYW5kIHRoZRUBYERlY2lkaW5nQ291bnRgIGlzIG5vdCB5ZXQgdXBkYXRlZC4gVGhpcyBtZWFucyB0aGF0IHdlIHNob3VsZCBlaXRoZXI6JQEtIGJlZ2luIGRlY2lkaW5nIGFub3RoZXIgcmVmZXJlbmR1bSAoYW5kIGxlYXZlIGBEZWNpZGluZ0NvdW50YCBhbG9uZSk7IG9ycC0gZGVjcmVtZW50IGBEZWNpZGluZ0NvdW50YC5kcmVmdW5kX3N1Ym1pc3Npb25fZGVwb3NpdAQBFGluZGV4EAE8UmVmZXJlbmR1bUluZGV4AAccMQFSZWZ1bmQgdGhlIFN1Ym1pc3Npb24gRGVwb3NpdCBmb3IgYSBjbG9zZWQgcmVmZXJlbmR1bSBiYWNrIHRvIHRoZSBkZXBvc2l0b3IuAJwtIGBvcmlnaW5gOiBtdXN0IGJlIGBTaWduZWRgIG9yIGBSb290YC5VAS0gYGluZGV4YDogVGhlIGluZGV4IG9mIGEgY2xvc2VkIHJlZmVyZW5kdW0gd2hvc2UgU3VibWlzc2lvbiBEZXBvc2l0IGhhcyBub3QgeWV0IGJlZW4sICByZWZ1bmRlZC4AiEVtaXRzIGBTdWJtaXNzaW9uRGVwb3NpdFJlZnVuZGVkYC4wc2V0X21ldGFkYXRhCAEUaW5kZXgQATxSZWZlcmVuZHVtSW5kZXgAAShtYXliZV9oYXNo9QQBPE9wdGlvbjxUOjpIYXNoPgAIHJhTZXQgb3IgY2xlYXIgbWV0YWRhdGEgb2YgYSByZWZlcmVuZHVtLgAsUGFyYW1ldGVyczpFAS0gYG9yaWdpbmA6IE11c3QgYmUgYFNpZ25lZGAgYnkgYSBjcmVhdG9yIG9mIGEgcmVmZXJlbmR1bSBvciBieSBhbnlvbmUgdG8gY2xlYXIgYZAgIG1ldGFkYXRhIG9mIGEgZmluaXNoZWQgcmVmZXJlbmR1bS4NAS0gYGluZGV4YDogIFRoZSBpbmRleCBvZiBhIHJlZmVyZW5kdW0gdG8gc2V0IG9yIGNsZWFyIG1ldGFkYXRhIGZvci5RAS0gYG1heWJlX2hhc2hgOiBUaGUgaGFzaCBvZiBhbiBvbi1jaGFpbiBzdG9yZWQgcHJlaW1hZ2UuIGBOb25lYCB0byBjbGVhciBhIG1ldGFkYXRhLgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy7xBBA0ZnJhbWVfc3VwcG9ydBh0cmFpdHMgc2NoZWR1bGUwRGlzcGF0Y2hUaW1lBCxCbG9ja051bWJlcgEQAQgIQXQEABABLEJsb2NrTnVtYmVyAAAAFEFmdGVyBAAQASxCbG9ja051bWJlcgABAAD1BAQYT3B0aW9uBARUATQBCBBOb25lAAAAEFNvbWUEADQAAAEAAPkEDEBwYWxsZXRfd2hpdGVsaXN0GHBhbGxldBBDYWxsBARUAAEQOHdoaXRlbGlzdF9jYWxsBAEkY2FsbF9oYXNoNAEcVDo6SGFzaAAAAFxyZW1vdmVfd2hpdGVsaXN0ZWRfY2FsbAQBJGNhbGxfaGFzaDQBHFQ6Okhhc2gAAQBkZGlzcGF0Y2hfd2hpdGVsaXN0ZWRfY2FsbAwBJGNhbGxfaGFzaDQBHFQ6Okhhc2gAAUBjYWxsX2VuY29kZWRfbGVuEAEMdTMyAAFMY2FsbF93ZWlnaHRfd2l0bmVzcygBGFdlaWdodAACAJxkaXNwYXRjaF93aGl0ZWxpc3RlZF9jYWxsX3dpdGhfcHJlaW1hZ2UEARBjYWxsqQEBfEJveDw8VCBhcyBDb25maWc+OjpSdW50aW1lQ2FsbD4AAwAEDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMu/QQMPHBhbGxldF90cmVhc3VyeRhwYWxsZXQQQ2FsbAgEVAAESQABGCxzcGVuZF9sb2NhbAgBGGFtb3VudP0BATxCYWxhbmNlT2Y8VCwgST4AASxiZW5lZmljaWFyee0BAVBBY2NvdW50SWRMb29rdXBPZjxUPgADRLhQcm9wb3NlIGFuZCBhcHByb3ZlIGEgc3BlbmQgb2YgdHJlYXN1cnkgZnVuZHMuAEgjIyBEaXNwYXRjaCBPcmlnaW4ARQFNdXN0IGJlIFtgQ29uZmlnOjpTcGVuZE9yaWdpbmBdIHdpdGggdGhlIGBTdWNjZXNzYCB2YWx1ZSBiZWluZyBhdCBsZWFzdCBgYW1vdW50YC4ALCMjIyBEZXRhaWxzRQFOT1RFOiBGb3IgcmVjb3JkLWtlZXBpbmcgcHVycG9zZXMsIHRoZSBwcm9wb3NlciBpcyBkZWVtZWQgdG8gYmUgZXF1aXZhbGVudCB0byB0aGUwYmVuZWZpY2lhcnkuADgjIyMgUGFyYW1ldGVyc0EBLSBgYW1vdW50YDogVGhlIGFtb3VudCB0byBiZSB0cmFuc2ZlcnJlZCBmcm9tIHRoZSB0cmVhc3VyeSB0byB0aGUgYGJlbmVmaWNpYXJ5YC7oLSBgYmVuZWZpY2lhcnlgOiBUaGUgZGVzdGluYXRpb24gYWNjb3VudCBmb3IgdGhlIHRyYW5zZmVyLgAkIyMgRXZlbnRzALRFbWl0cyBbYEV2ZW50OjpTcGVuZEFwcHJvdmVkYF0gaWYgc3VjY2Vzc2Z1bC48cmVtb3ZlX2FwcHJvdmFsBAEscHJvcG9zYWxfaWTJAQE0UHJvcG9zYWxJbmRleAAEVC0BRm9yY2UgYSBwcmV2aW91c2x5IGFwcHJvdmVkIHByb3Bvc2FsIHRvIGJlIHJlbW92ZWQgZnJvbSB0aGUgYXBwcm92YWwgcXVldWUuAEgjIyBEaXNwYXRjaCBPcmlnaW4AhE11c3QgYmUgW2BDb25maWc6OlJlamVjdE9yaWdpbmBdLgAoIyMgRGV0YWlscwDAVGhlIG9yaWdpbmFsIGRlcG9zaXQgd2lsbCBubyBsb25nZXIgYmUgcmV0dXJuZWQuADgjIyMgUGFyYW1ldGVyc6AtIGBwcm9wb3NhbF9pZGA6IFRoZSBpbmRleCBvZiBhIHByb3Bvc2FsADgjIyMgQ29tcGxleGl0eawtIE8oQSkgd2hlcmUgYEFgIGlzIHRoZSBudW1iZXIgb2YgYXBwcm92YWxzACgjIyMgRXJyb3JzRQEtIFtgRXJyb3I6OlByb3Bvc2FsTm90QXBwcm92ZWRgXTogVGhlIGBwcm9wb3NhbF9pZGAgc3VwcGxpZWQgd2FzIG5vdCBmb3VuZCBpbiB0aGVRASAgYXBwcm92YWwgcXVldWUsIGkuZS4sIHRoZSBwcm9wb3NhbCBoYXMgbm90IGJlZW4gYXBwcm92ZWQuIFRoaXMgY291bGQgYWxzbyBtZWFuIHRoZVkBICBwcm9wb3NhbCBkb2VzIG5vdCBleGlzdCBhbHRvZ2V0aGVyLCB0aHVzIHRoZXJlIGlzIG5vIHdheSBpdCB3b3VsZCBoYXZlIGJlZW4gYXBwcm92ZWRUICBpbiB0aGUgZmlyc3QgcGxhY2UuFHNwZW5kEAEoYXNzZXRfa2luZAEFAURCb3g8VDo6QXNzZXRLaW5kPgABGGFtb3VudP0BAVBBc3NldEJhbGFuY2VPZjxULCBJPgABLGJlbmVmaWNpYXJ5WQUBeEJveDxCZW5lZmljaWFyeUxvb2t1cE9mPFQsIEk+PgABKHZhbGlkX2Zyb22cAXBPcHRpb248QmxvY2tOdW1iZXJGb3I8VCwgST4+AAVouFByb3Bvc2UgYW5kIGFwcHJvdmUgYSBzcGVuZCBvZiB0cmVhc3VyeSBmdW5kcy4ASCMjIERpc3BhdGNoIE9yaWdpbgAdAU11c3QgYmUgW2BDb25maWc6OlNwZW5kT3JpZ2luYF0gd2l0aCB0aGUgYFN1Y2Nlc3NgIHZhbHVlIGJlaW5nIGF0IGxlYXN0VQFgYW1vdW50YCBvZiBgYXNzZXRfa2luZGAgaW4gdGhlIG5hdGl2ZSBhc3NldC4gVGhlIGFtb3VudCBvZiBgYXNzZXRfa2luZGAgaXMgY29udmVydGVk1GZvciBhc3NlcnRpb24gdXNpbmcgdGhlIFtgQ29uZmlnOjpCYWxhbmNlQ29udmVydGVyYF0uACgjIyBEZXRhaWxzAEkBQ3JlYXRlIGFuIGFwcHJvdmVkIHNwZW5kIGZvciB0cmFuc2ZlcnJpbmcgYSBzcGVjaWZpYyBgYW1vdW50YCBvZiBgYXNzZXRfa2luZGAgdG8gYWEBZGVzaWduYXRlZCBiZW5lZmljaWFyeS4gVGhlIHNwZW5kIG11c3QgYmUgY2xhaW1lZCB1c2luZyB0aGUgYHBheW91dGAgZGlzcGF0Y2hhYmxlIHdpdGhpbnR0aGUgW2BDb25maWc6OlBheW91dFBlcmlvZGBdLgA4IyMjIFBhcmFtZXRlcnMVAS0gYGFzc2V0X2tpbmRgOiBBbiBpbmRpY2F0b3Igb2YgdGhlIHNwZWNpZmljIGFzc2V0IGNsYXNzIHRvIGJlIHNwZW50LkEBLSBgYW1vdW50YDogVGhlIGFtb3VudCB0byBiZSB0cmFuc2ZlcnJlZCBmcm9tIHRoZSB0cmVhc3VyeSB0byB0aGUgYGJlbmVmaWNpYXJ5YC64LSBgYmVuZWZpY2lhcnlgOiBUaGUgYmVuZWZpY2lhcnkgb2YgdGhlIHNwZW5kLlUBLSBgdmFsaWRfZnJvbWA6IFRoZSBibG9jayBudW1iZXIgZnJvbSB3aGljaCB0aGUgc3BlbmQgY2FuIGJlIGNsYWltZWQuIEl0IGNhbiByZWZlciB0bxkBICB0aGUgcGFzdCBpZiB0aGUgcmVzdWx0aW5nIHNwZW5kIGhhcyBub3QgeWV0IGV4cGlyZWQgYWNjb3JkaW5nIHRvIHRoZUUBICBbYENvbmZpZzo6UGF5b3V0UGVyaW9kYF0uIElmIGBOb25lYCwgdGhlIHNwZW5kIGNhbiBiZSBjbGFpbWVkIGltbWVkaWF0ZWx5IGFmdGVyLCAgYXBwcm92YWwuACQjIyBFdmVudHMAyEVtaXRzIFtgRXZlbnQ6OkFzc2V0U3BlbmRBcHByb3ZlZGBdIGlmIHN1Y2Nlc3NmdWwuGHBheW91dAQBFGluZGV4EAEoU3BlbmRJbmRleAAGTDhDbGFpbSBhIHNwZW5kLgBIIyMgRGlzcGF0Y2ggT3JpZ2luADhNdXN0IGJlIHNpZ25lZAAoIyMgRGV0YWlscwBVAVNwZW5kcyBtdXN0IGJlIGNsYWltZWQgd2l0aGluIHNvbWUgdGVtcG9yYWwgYm91bmRzLiBBIHNwZW5kIG1heSBiZSBjbGFpbWVkIHdpdGhpbiBvbmXUW2BDb25maWc6OlBheW91dFBlcmlvZGBdIGZyb20gdGhlIGB2YWxpZF9mcm9tYCBibG9jay5VAUluIGNhc2Ugb2YgYSBwYXlvdXQgZmFpbHVyZSwgdGhlIHNwZW5kIHN0YXR1cyBtdXN0IGJlIHVwZGF0ZWQgd2l0aCB0aGUgYGNoZWNrX3N0YXR1c2DcZGlzcGF0Y2hhYmxlIGJlZm9yZSByZXRyeWluZyB3aXRoIHRoZSBjdXJyZW50IGZ1bmN0aW9uLgA4IyMjIFBhcmFtZXRlcnNsLSBgaW5kZXhgOiBUaGUgc3BlbmQgaW5kZXguACQjIyBFdmVudHMAkEVtaXRzIFtgRXZlbnQ6OlBhaWRgXSBpZiBzdWNjZXNzZnVsLjBjaGVja19zdGF0dXMEARRpbmRleBABKFNwZW5kSW5kZXgAB0wpAUNoZWNrIHRoZSBzdGF0dXMgb2YgdGhlIHNwZW5kIGFuZCByZW1vdmUgaXQgZnJvbSB0aGUgc3RvcmFnZSBpZiBwcm9jZXNzZWQuAEgjIyBEaXNwYXRjaCBPcmlnaW4APE11c3QgYmUgc2lnbmVkLgAoIyMgRGV0YWlscwABAVRoZSBzdGF0dXMgY2hlY2sgaXMgYSBwcmVyZXF1aXNpdGUgZm9yIHJldHJ5aW5nIGEgZmFpbGVkIHBheW91dC5JAUlmIGEgc3BlbmQgaGFzIGVpdGhlciBzdWNjZWVkZWQgb3IgZXhwaXJlZCwgaXQgaXMgcmVtb3ZlZCBmcm9tIHRoZSBzdG9yYWdlIGJ5IHRoaXPsZnVuY3Rpb24uIEluIHN1Y2ggaW5zdGFuY2VzLCB0cmFuc2FjdGlvbiBmZWVzIGFyZSByZWZ1bmRlZC4AOCMjIyBQYXJhbWV0ZXJzbC0gYGluZGV4YDogVGhlIHNwZW5kIGluZGV4LgAkIyMgRXZlbnRzAPhFbWl0cyBbYEV2ZW50OjpQYXltZW50RmFpbGVkYF0gaWYgdGhlIHNwZW5kIHBheW91dCBoYXMgZmFpbGVkLgEBRW1pdHMgW2BFdmVudDo6U3BlbmRQcm9jZXNzZWRgXSBpZiB0aGUgc3BlbmQgcGF5b3V0IGhhcyBzdWNjZWVkLih2b2lkX3NwZW5kBAEUaW5kZXgQAShTcGVuZEluZGV4AAhAfFZvaWQgcHJldmlvdXNseSBhcHByb3ZlZCBzcGVuZC4ASCMjIERpc3BhdGNoIE9yaWdpbgCETXVzdCBiZSBbYENvbmZpZzo6UmVqZWN0T3JpZ2luYF0uACgjIyBEZXRhaWxzAB0BQSBzcGVuZCB2b2lkIGlzIG9ubHkgcG9zc2libGUgaWYgdGhlIHBheW91dCBoYXMgbm90IGJlZW4gYXR0ZW1wdGVkIHlldC4AOCMjIyBQYXJhbWV0ZXJzbC0gYGluZGV4YDogVGhlIHNwZW5kIGluZGV4LgAkIyMgRXZlbnRzAMBFbWl0cyBbYEV2ZW50OjpBc3NldFNwZW5kVm9pZGVkYF0gaWYgc3VjY2Vzc2Z1bC4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMuAQUMXHBvbGthZG90X3J1bnRpbWVfY29tbW9uFGltcGxzXFZlcnNpb25lZExvY2F0YWJsZUFzc2V0AAEMCFYzCAEgbG9jYXRpb24FBQFEeGNtOjp2Mzo6TG9jYXRpb24AASBhc3NldF9pZBkFAUB4Y206OnYzOjpBc3NldElkAAMACFY0CAEgbG9jYXRpb24dBQFEeGNtOjp2NDo6TG9jYXRpb24AASBhc3NldF9pZFEFAUB4Y206OnY0OjpBc3NldElkAAQACFY1CAEgbG9jYXRpb265AgFEeGNtOjp2NTo6TG9jYXRpb24AASBhc3NldF9pZFUFAUB4Y206OnY1OjpBc3NldElkAAUAAAUFECxzdGFnaW5nX3hjbQh2MzRtdWx0aWxvY2F0aW9uNE11bHRpTG9jYXRpb24AAAgBHHBhcmVudHMIAQh1OAABIGludGVyaW9yCQUBJEp1bmN0aW9ucwAACQUQDHhjbQh2MyRqdW5jdGlvbnMkSnVuY3Rpb25zAAEkEEhlcmUAAAAIWDEEAA0FASBKdW5jdGlvbgABAAhYMggADQUBIEp1bmN0aW9uAAANBQEgSnVuY3Rpb24AAgAIWDMMAA0FASBKdW5jdGlvbgAADQUBIEp1bmN0aW9uAAANBQEgSnVuY3Rpb24AAwAIWDQQAA0FASBKdW5jdGlvbgAADQUBIEp1bmN0aW9uAAANBQEgSnVuY3Rpb24AAA0FASBKdW5jdGlvbgAEAAhYNRQADQUBIEp1bmN0aW9uAAANBQEgSnVuY3Rpb24AAA0FASBKdW5jdGlvbgAADQUBIEp1bmN0aW9uAAANBQEgSnVuY3Rpb24ABQAIWDYYAA0FASBKdW5jdGlvbgAADQUBIEp1bmN0aW9uAAANBQEgSnVuY3Rpb24AAA0FASBKdW5jdGlvbgAADQUBIEp1bmN0aW9uAAANBQEgSnVuY3Rpb24ABgAIWDccAA0FASBKdW5jdGlvbgAADQUBIEp1bmN0aW9uAAANBQEgSnVuY3Rpb24AAA0FASBKdW5jdGlvbgAADQUBIEp1bmN0aW9uAAANBQEgSnVuY3Rpb24AAA0FASBKdW5jdGlvbgAHAAhYOCAADQUBIEp1bmN0aW9uAAANBQEgSnVuY3Rpb24AAA0FASBKdW5jdGlvbgAADQUBIEp1bmN0aW9uAAANBQEgSnVuY3Rpb24AAA0FASBKdW5jdGlvbgAADQUBIEp1bmN0aW9uAAANBQEgSnVuY3Rpb24ACAAADQUQDHhjbQh2MyBqdW5jdGlvbiBKdW5jdGlvbgABKCRQYXJhY2hhaW4EAMkBAQx1MzIAAAAsQWNjb3VudElkMzIIARxuZXR3b3JrEQUBRE9wdGlvbjxOZXR3b3JrSWQ+AAEIaWQEASBbdTg7IDMyXQABADhBY2NvdW50SW5kZXg2NAgBHG5ldHdvcmsRBQFET3B0aW9uPE5ldHdvcmtJZD4AARRpbmRleCwBDHU2NAACADBBY2NvdW50S2V5MjAIARxuZXR3b3JrEQUBRE9wdGlvbjxOZXR3b3JrSWQ+AAEMa2V59QEBIFt1ODsgMjBdAAMAOFBhbGxldEluc3RhbmNlBAAIAQh1OAAEADBHZW5lcmFsSW5kZXgEAP0BARB1MTI4AAUAKEdlbmVyYWxLZXkIARhsZW5ndGgIAQh1OAABEGRhdGEEASBbdTg7IDMyXQAGACRPbmx5Q2hpbGQABwAkUGx1cmFsaXR5CAEIaWTRAgEYQm9keUlkAAEQcGFydNUCASBCb2R5UGFydAAIADxHbG9iYWxDb25zZW5zdXMEABUFASROZXR3b3JrSWQACQAAEQUEGE9wdGlvbgQEVAEVBQEIEE5vbmUAAAAQU29tZQQAFQUAAAEAABUFEAx4Y20IdjMganVuY3Rpb24kTmV0d29ya0lkAAEsJEJ5R2VuZXNpcwQABAEgW3U4OyAzMl0AAAAYQnlGb3JrCAEwYmxvY2tfbnVtYmVyMAEMdTY0AAEoYmxvY2tfaGFzaAQBIFt1ODsgMzJdAAEAIFBvbGthZG90AAIAGEt1c2FtYQADABxXZXN0ZW5kAAQAGFJvY29jbwAFABhXb2NvY28ABgAgRXRoZXJldW0EASBjaGFpbl9pZCwBDHU2NAAHACxCaXRjb2luQ29yZQAIACxCaXRjb2luQ2FzaAAJAEBQb2xrYWRvdEJ1bGxldGluAAoAABkFEAx4Y20IdjMobXVsdGlhc3NldBxBc3NldElkAAEIIENvbmNyZXRlBAAFBQE0TXVsdGlMb2NhdGlvbgAAACBBYnN0cmFjdAQABAEgW3U4OyAzMl0AAQAAHQUQLHN0YWdpbmdfeGNtCHY0IGxvY2F0aW9uIExvY2F0aW9uAAAIARxwYXJlbnRzCAEIdTgAASBpbnRlcmlvciEFASRKdW5jdGlvbnMAACEFECxzdGFnaW5nX3hjbQh2NCRqdW5jdGlvbnMkSnVuY3Rpb25zAAEkEEhlcmUAAAAIWDEEACUFAUhBcmM8W0p1bmN0aW9uOyAxXT4AAQAIWDIEADUFAUhBcmM8W0p1bmN0aW9uOyAyXT4AAgAIWDMEADkFAUhBcmM8W0p1bmN0aW9uOyAzXT4AAwAIWDQEAD0FAUhBcmM8W0p1bmN0aW9uOyA0XT4ABAAIWDUEAEEFAUhBcmM8W0p1bmN0aW9uOyA1XT4ABQAIWDYEAEUFAUhBcmM8W0p1bmN0aW9uOyA2XT4ABgAIWDcEAEkFAUhBcmM8W0p1bmN0aW9uOyA3XT4ABwAIWDgEAE0FAUhBcmM8W0p1bmN0aW9uOyA4XT4ACAAAJQUAAAMBAAAAKQUAKQUQLHN0YWdpbmdfeGNtCHY0IGp1bmN0aW9uIEp1bmN0aW9uAAEoJFBhcmFjaGFpbgQAyQEBDHUzMgAAACxBY2NvdW50SWQzMggBHG5ldHdvcmstBQFET3B0aW9uPE5ldHdvcmtJZD4AAQhpZAQBIFt1ODsgMzJdAAEAOEFjY291bnRJbmRleDY0CAEcbmV0d29yay0FAURPcHRpb248TmV0d29ya0lkPgABFGluZGV4LAEMdTY0AAIAMEFjY291bnRLZXkyMAgBHG5ldHdvcmstBQFET3B0aW9uPE5ldHdvcmtJZD4AAQxrZXn1AQEgW3U4OyAyMF0AAwA4UGFsbGV0SW5zdGFuY2UEAAgBCHU4AAQAMEdlbmVyYWxJbmRleAQA/QEBEHUxMjgABQAoR2VuZXJhbEtleQgBGGxlbmd0aAgBCHU4AAEQZGF0YQQBIFt1ODsgMzJdAAYAJE9ubHlDaGlsZAAHACRQbHVyYWxpdHkIAQhpZNECARhCb2R5SWQAARBwYXJ01QIBIEJvZHlQYXJ0AAgAPEdsb2JhbENvbnNlbnN1cwQAMQUBJE5ldHdvcmtJZAAJAAAtBQQYT3B0aW9uBARUATEFAQgQTm9uZQAAABBTb21lBAAxBQAAAQAAMQUQLHN0YWdpbmdfeGNtCHY0IGp1bmN0aW9uJE5ldHdvcmtJZAABLCRCeUdlbmVzaXMEAAQBIFt1ODsgMzJdAAAAGEJ5Rm9yawgBMGJsb2NrX251bWJlcjABDHU2NAABKGJsb2NrX2hhc2gEASBbdTg7IDMyXQABACBQb2xrYWRvdAACABhLdXNhbWEAAwAcV2VzdGVuZAAEABhSb2NvY28ABQAYV29jb2NvAAYAIEV0aGVyZXVtBAEgY2hhaW5faWQsAQx1NjQABwAsQml0Y29pbkNvcmUACAAsQml0Y29pbkNhc2gACQBAUG9sa2Fkb3RCdWxsZXRpbgAKAAA1BQAAAwIAAAApBQA5BQAAAwMAAAApBQA9BQAAAwQAAAApBQBBBQAAAwUAAAApBQBFBQAAAwYAAAApBQBJBQAAAwcAAAApBQBNBQAAAwgAAAApBQBRBRAsc3RhZ2luZ194Y20IdjQUYXNzZXQcQXNzZXRJZAAABAAdBQEgTG9jYXRpb24AAFUFECxzdGFnaW5nX3hjbQh2NRRhc3NldBxBc3NldElkAAAEALkCASBMb2NhdGlvbgAAWQUIDHhjbURWZXJzaW9uZWRMb2NhdGlvbgABDAhWMwQABQUBRHYzOjpNdWx0aUxvY2F0aW9uAAMACFY0BAAdBQEwdjQ6OkxvY2F0aW9uAAQACFY1BAC5AgEwdjU6OkxvY2F0aW9uAAUAAF0FEGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnM0Y29uZmlndXJhdGlvbhhwYWxsZXQQQ2FsbAQEVAABuHxzZXRfdmFsaWRhdGlvbl91cGdyYWRlX2Nvb2xkb3duBAEMbmV3EAFEQmxvY2tOdW1iZXJGb3I8VD4AAASQU2V0IHRoZSB2YWxpZGF0aW9uIHVwZ3JhZGUgY29vbGRvd24ucHNldF92YWxpZGF0aW9uX3VwZ3JhZGVfZGVsYXkEAQxuZXcQAURCbG9ja051bWJlckZvcjxUPgABBIRTZXQgdGhlIHZhbGlkYXRpb24gdXBncmFkZSBkZWxheS5kc2V0X2NvZGVfcmV0ZW50aW9uX3BlcmlvZAQBDG5ldxABREJsb2NrTnVtYmVyRm9yPFQ+AAIE0FNldCB0aGUgYWNjZXB0YW5jZSBwZXJpb2QgZm9yIGFuIGluY2x1ZGVkIGNhbmRpZGF0ZS5Ec2V0X21heF9jb2RlX3NpemUEAQxuZXcQAQx1MzIAAwTcU2V0IHRoZSBtYXggdmFsaWRhdGlvbiBjb2RlIHNpemUgZm9yIGluY29taW5nIHVwZ3JhZGVzLkBzZXRfbWF4X3Bvdl9zaXplBAEMbmV3EAEMdTMyAAQExFNldCB0aGUgbWF4IFBPViBibG9jayBzaXplIGZvciBpbmNvbWluZyB1cGdyYWRlcy5Yc2V0X21heF9oZWFkX2RhdGFfc2l6ZQQBDG5ldxABDHUzMgAFBJRTZXQgdGhlIG1heCBoZWFkIGRhdGEgc2l6ZSBmb3IgcGFyYXMuSHNldF9jb3JldGltZV9jb3JlcwQBDG5ldxABDHUzMgAGEKxTZXQgdGhlIG51bWJlciBvZiBjb3JldGltZSBleGVjdXRpb24gY29yZXMuAFEBTk9URTogdGhhdCB0aGlzIGNvbmZpZ3VyYXRpb24gaXMgbWFuYWdlZCBieSB0aGUgY29yZXRpbWUgY2hhaW4uIE9ubHkgbWFudWFsbHkgY2hhbmdlsHRoaXMsIGlmIHlvdSByZWFsbHkga25vdyB3aGF0IHlvdSBhcmUgZG9pbmchcHNldF9ncm91cF9yb3RhdGlvbl9mcmVxdWVuY3kEAQxuZXcQAURCbG9ja051bWJlckZvcjxUPgAIBNBTZXQgdGhlIHBhcmFjaGFpbiB2YWxpZGF0b3ItZ3JvdXAgcm90YXRpb24gZnJlcXVlbmN5dHNldF9wYXJhc19hdmFpbGFiaWxpdHlfcGVyaW9kBAEMbmV3EAFEQmxvY2tOdW1iZXJGb3I8VD4ACQSYU2V0IHRoZSBhdmFpbGFiaWxpdHkgcGVyaW9kIGZvciBwYXJhcy5gc2V0X3NjaGVkdWxpbmdfbG9va2FoZWFkBAEMbmV3EAEMdTMyAAsEOQFTZXQgdGhlIHNjaGVkdWxpbmcgbG9va2FoZWFkLCBpbiBleHBlY3RlZCBudW1iZXIgb2YgYmxvY2tzIGF0IHBlYWsgdGhyb3VnaHB1dC5sc2V0X21heF92YWxpZGF0b3JzX3Blcl9jb3JlBAEMbmV3nAEsT3B0aW9uPHUzMj4ADATsU2V0IHRoZSBtYXhpbXVtIG51bWJlciBvZiB2YWxpZGF0b3JzIHRvIGFzc2lnbiB0byBhbnkgY29yZS5Ic2V0X21heF92YWxpZGF0b3JzBAEMbmV3nAEsT3B0aW9uPHUzMj4ADQQNAVNldCB0aGUgbWF4aW11bSBudW1iZXIgb2YgdmFsaWRhdG9ycyB0byB1c2UgaW4gcGFyYWNoYWluIGNvbnNlbnN1cy5Ic2V0X2Rpc3B1dGVfcGVyaW9kBAEMbmV3EAEwU2Vzc2lvbkluZGV4AA4EDQFTZXQgdGhlIGRpc3B1dGUgcGVyaW9kLCBpbiBudW1iZXIgb2Ygc2Vzc2lvbnMgdG8ga2VlcCBmb3IgZGlzcHV0ZXMutHNldF9kaXNwdXRlX3Bvc3RfY29uY2x1c2lvbl9hY2NlcHRhbmNlX3BlcmlvZAQBDG5ldxABREJsb2NrTnVtYmVyRm9yPFQ+AA8EyFNldCB0aGUgZGlzcHV0ZSBwb3N0IGNvbmNsdXNpb24gYWNjZXB0YW5jZSBwZXJpb2QuRHNldF9ub19zaG93X3Nsb3RzBAEMbmV3EAEMdTMyABII+FNldCB0aGUgbm8gc2hvdyBzbG90cywgaW4gbnVtYmVyIG9mIG51bWJlciBvZiBjb25zZW5zdXMgc2xvdHMuTE11c3QgYmUgYXQgbGVhc3QgMS5Qc2V0X25fZGVsYXlfdHJhbmNoZXMEAQxuZXcQAQx1MzIAEwScU2V0IHRoZSB0b3RhbCBudW1iZXIgb2YgZGVsYXkgdHJhbmNoZXMueHNldF96ZXJvdGhfZGVsYXlfdHJhbmNoZV93aWR0aAQBDG5ldxABDHUzMgAUBIxTZXQgdGhlIHplcm90aCBkZWxheSB0cmFuY2hlIHdpZHRoLlBzZXRfbmVlZGVkX2FwcHJvdmFscwQBDG5ldxABDHUzMgAVBNxTZXQgdGhlIG51bWJlciBvZiB2YWxpZGF0b3JzIG5lZWRlZCB0byBhcHByb3ZlIGEgYmxvY2sucHNldF9yZWxheV92cmZfbW9kdWxvX3NhbXBsZXMEAQxuZXcQAQx1MzIAFgRZAVNldCB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgdG8gZG8gb2YgdGhlIGBSZWxheVZSRk1vZHVsb2AgYXBwcm92YWwgYXNzaWdubWVudCBjcml0ZXJpb24uaHNldF9tYXhfdXB3YXJkX3F1ZXVlX2NvdW50BAEMbmV3EAEMdTMyABcELQFTZXRzIHRoZSBtYXhpbXVtIGl0ZW1zIHRoYXQgY2FuIHByZXNlbnQgaW4gYSB1cHdhcmQgZGlzcGF0Y2ggcXVldWUgYXQgb25jZS5kc2V0X21heF91cHdhcmRfcXVldWVfc2l6ZQQBDG5ldxABDHUzMgAYCE0BU2V0cyB0aGUgbWF4aW11bSB0b3RhbCBzaXplIG9mIGl0ZW1zIHRoYXQgY2FuIHByZXNlbnQgaW4gYSB1cHdhcmQgZGlzcGF0Y2ggcXVldWUgYXQUb25jZS50c2V0X21heF9kb3dud2FyZF9tZXNzYWdlX3NpemUEAQxuZXcQAQx1MzIAGQScU2V0IHRoZSBjcml0aWNhbCBkb3dud2FyZCBtZXNzYWdlIHNpemUubHNldF9tYXhfdXB3YXJkX21lc3NhZ2Vfc2l6ZQQBDG5ldxABDHUzMgAbBC0BU2V0cyB0aGUgbWF4aW11bSBzaXplIG9mIGFuIHVwd2FyZCBtZXNzYWdlIHRoYXQgY2FuIGJlIHNlbnQgYnkgYSBjYW5kaWRhdGUuoHNldF9tYXhfdXB3YXJkX21lc3NhZ2VfbnVtX3Blcl9jYW5kaWRhdGUEAQxuZXcQAQx1MzIAHAQFAVNldHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIG1lc3NhZ2VzIHRoYXQgYSBjYW5kaWRhdGUgY2FuIGNvbnRhaW4uZHNldF9ocm1wX29wZW5fcmVxdWVzdF90dGwEAQxuZXcQAQx1MzIAHQQ1AVNldHMgdGhlIG51bWJlciBvZiBzZXNzaW9ucyBhZnRlciB3aGljaCBhbiBIUk1QIG9wZW4gY2hhbm5lbCByZXF1ZXN0IGV4cGlyZXMuXHNldF9ocm1wX3NlbmRlcl9kZXBvc2l0BAEMbmV3GAEcQmFsYW5jZQAeBFEBU2V0cyB0aGUgYW1vdW50IG9mIGZ1bmRzIHRoYXQgdGhlIHNlbmRlciBzaG91bGQgcHJvdmlkZSBmb3Igb3BlbmluZyBhbiBIUk1QIGNoYW5uZWwuaHNldF9ocm1wX3JlY2lwaWVudF9kZXBvc2l0BAEMbmV3GAEcQmFsYW5jZQAfCGEBU2V0cyB0aGUgYW1vdW50IG9mIGZ1bmRzIHRoYXQgdGhlIHJlY2lwaWVudCBzaG91bGQgcHJvdmlkZSBmb3IgYWNjZXB0aW5nIG9wZW5pbmcgYW4gSFJNUCBjaGFubmVsLnRzZXRfaHJtcF9jaGFubmVsX21heF9jYXBhY2l0eQQBDG5ldxABDHUzMgAgBB0BU2V0cyB0aGUgbWF4aW11bSBudW1iZXIgb2YgbWVzc2FnZXMgYWxsb3dlZCBpbiBhbiBIUk1QIGNoYW5uZWwgYXQgb25jZS58c2V0X2hybXBfY2hhbm5lbF9tYXhfdG90YWxfc2l6ZQQBDG5ldxABDHUzMgAhBFEBU2V0cyB0aGUgbWF4aW11bSB0b3RhbCBzaXplIG9mIG1lc3NhZ2VzIGluIGJ5dGVzIGFsbG93ZWQgaW4gYW4gSFJNUCBjaGFubmVsIGF0IG9uY2UunHNldF9ocm1wX21heF9wYXJhY2hhaW5faW5ib3VuZF9jaGFubmVscwQBDG5ldxABDHUzMgAiBEkBU2V0cyB0aGUgbWF4aW11bSBudW1iZXIgb2YgaW5ib3VuZCBIUk1QIGNoYW5uZWxzIGEgcGFyYWNoYWluIGlzIGFsbG93ZWQgdG8gYWNjZXB0LoRzZXRfaHJtcF9jaGFubmVsX21heF9tZXNzYWdlX3NpemUEAQxuZXcQAQx1MzIAJAQ9AVNldHMgdGhlIG1heGltdW0gc2l6ZSBvZiBhIG1lc3NhZ2UgdGhhdCBjb3VsZCBldmVyIGJlIHB1dCBpbnRvIGFuIEhSTVAgY2hhbm5lbC6gc2V0X2hybXBfbWF4X3BhcmFjaGFpbl9vdXRib3VuZF9jaGFubmVscwQBDG5ldxABDHUzMgAlBEUBU2V0cyB0aGUgbWF4aW11bSBudW1iZXIgb2Ygb3V0Ym91bmQgSFJNUCBjaGFubmVscyBhIHBhcmFjaGFpbiBpcyBhbGxvd2VkIHRvIG9wZW4umHNldF9ocm1wX21heF9tZXNzYWdlX251bV9wZXJfY2FuZGlkYXRlBAEMbmV3EAEMdTMyACcENQFTZXRzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBvdXRib3VuZCBIUk1QIG1lc3NhZ2VzIGNhbiBiZSBzZW50IGJ5IGEgY2FuZGlkYXRlLkhzZXRfcHZmX3ZvdGluZ190dGwEAQxuZXcQATBTZXNzaW9uSW5kZXgAKgRRAVNldCB0aGUgbnVtYmVyIG9mIHNlc3Npb24gY2hhbmdlcyBhZnRlciB3aGljaCBhIFBWRiBwcmUtY2hlY2tpbmcgdm90aW5nIGlzIHJlamVjdGVkLpBzZXRfbWluaW11bV92YWxpZGF0aW9uX3VwZ3JhZGVfZGVsYXkEAQxuZXcQAURCbG9ja051bWJlckZvcjxUPgArEFUBU2V0cyB0aGUgbWluaW11bSBkZWxheSBiZXR3ZWVuIGFubm91bmNpbmcgdGhlIHVwZ3JhZGUgYmxvY2sgZm9yIGEgcGFyYWNoYWluIHVudGlsIHRoZVR1cGdyYWRlIHRha2luZyBwbGFjZS4AOQFTZWUgdGhlIGZpZWxkIGRvY3VtZW50YXRpb24gZm9yIGluZm9ybWF0aW9uIGFuZCBjb25zdHJhaW50cyBmb3IgdGhlIG5ldyB2YWx1ZS5wc2V0X2J5cGFzc19jb25zaXN0ZW5jeV9jaGVjawQBDG5ldyABEGJvb2wALAhNAVNldHRpbmcgdGhpcyB0byB0cnVlIHdpbGwgZGlzYWJsZSBjb25zaXN0ZW5jeSBjaGVja3MgZm9yIHRoZSBjb25maWd1cmF0aW9uIHNldHRlcnMuRFVzZSB3aXRoIGNhdXRpb24uYHNldF9hc3luY19iYWNraW5nX3BhcmFtcwQBDG5ld2EFAUhBc3luY0JhY2tpbmdQYXJhbXMALQSgU2V0IHRoZSBhc3luY2hyb25vdXMgYmFja2luZyBwYXJhbWV0ZXJzLkxzZXRfZXhlY3V0b3JfcGFyYW1zBAEMbmV3ZQUBOEV4ZWN1dG9yUGFyYW1zAC4EcFNldCBQVkYgZXhlY3V0b3IgcGFyYW1ldGVycy5Yc2V0X29uX2RlbWFuZF9iYXNlX2ZlZQQBDG5ldxgBHEJhbGFuY2UALwSkU2V0IHRoZSBvbiBkZW1hbmQgKHBhcmF0aHJlYWRzKSBiYXNlIGZlZS50c2V0X29uX2RlbWFuZF9mZWVfdmFyaWFiaWxpdHkEAQxuZXeYARxQZXJiaWxsADAEwFNldCB0aGUgb24gZGVtYW5kIChwYXJhdGhyZWFkcykgZmVlIHZhcmlhYmlsaXR5LnBzZXRfb25fZGVtYW5kX3F1ZXVlX21heF9zaXplBAEMbmV3EAEMdTMyADEEvFNldCB0aGUgb24gZGVtYW5kIChwYXJhdGhyZWFkcykgcXVldWUgbWF4IHNpemUumHNldF9vbl9kZW1hbmRfdGFyZ2V0X3F1ZXVlX3V0aWxpemF0aW9uBAEMbmV3mAEcUGVyYmlsbAAyBMBTZXQgdGhlIG9uIGRlbWFuZCAocGFyYXRocmVhZHMpIGZlZSB2YXJpYWJpbGl0eS5kc2V0X21pbmltdW1fYmFja2luZ192b3RlcwQBDG5ldxABDHUzMgA0BKBTZXQgdGhlIG1pbmltdW0gYmFja2luZyB2b3RlcyB0aHJlc2hvbGQuQHNldF9ub2RlX2ZlYXR1cmUIARRpbmRleAgBCHU4AAEUdmFsdWUgARBib29sADUEZFNldC9VbnNldCBhIG5vZGUgZmVhdHVyZS5oc2V0X2FwcHJvdmFsX3ZvdGluZ19wYXJhbXMEAQxuZXd5BQFQQXBwcm92YWxWb3RpbmdQYXJhbXMANgRsU2V0IGFwcHJvdmFsLXZvdGluZy1wYXJhbXMuUHNldF9zY2hlZHVsZXJfcGFyYW1zBAEMbmV3fQUBiFNjaGVkdWxlclBhcmFtczxCbG9ja051bWJlckZvcjxUPj4ANwRUU2V0IHNjaGVkdWxlci1wYXJhbXMuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLmEFEExwb2xrYWRvdF9wcmltaXRpdmVzCHY4NGFzeW5jX2JhY2tpbmdIQXN5bmNCYWNraW5nUGFyYW1zAAAIAUxtYXhfY2FuZGlkYXRlX2RlcHRoEAEMdTMyAAFQYWxsb3dlZF9hbmNlc3RyeV9sZW4QAQx1MzIAAGUFEExwb2xrYWRvdF9wcmltaXRpdmVzCHY4PGV4ZWN1dG9yX3BhcmFtczhFeGVjdXRvclBhcmFtcwAABABpBQFIVmVjPEV4ZWN1dG9yUGFyYW0+AABpBQAAAm0FAG0FEExwb2xrYWRvdF9wcmltaXRpdmVzCHY4PGV4ZWN1dG9yX3BhcmFtczRFeGVjdXRvclBhcmFtAAEcOE1heE1lbW9yeVBhZ2VzBAAQAQx1MzIAAQA8U3RhY2tMb2dpY2FsTWF4BAAQAQx1MzIAAgA4U3RhY2tOYXRpdmVNYXgEABABDHUzMgADAFBQcmVjaGVja2luZ01heE1lbW9yeQQAMAEMdTY0AAQAOFB2ZlByZXBUaW1lb3V0CABxBQEsUHZmUHJlcEtpbmQAADABDHU2NAAFADhQdmZFeGVjVGltZW91dAgAdQUBLFB2ZkV4ZWNLaW5kAAAwAQx1NjQABgBEV2FzbUV4dEJ1bGtNZW1vcnkABwAAcQUMTHBvbGthZG90X3ByaW1pdGl2ZXMIdjgsUHZmUHJlcEtpbmQAAQggUHJlY2hlY2sAAAAcUHJlcGFyZQABAAB1BQxMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2OCxQdmZFeGVjS2luZAABCBxCYWNraW5nAAAAIEFwcHJvdmFsAAEAAHkFDExwb2xrYWRvdF9wcmltaXRpdmVzCHY4UEFwcHJvdmFsVm90aW5nUGFyYW1zAAAEAWxtYXhfYXBwcm92YWxfY29hbGVzY2VfY291bnQQAQx1MzIAAH0FDExwb2xrYWRvdF9wcmltaXRpdmVzCHY4PFNjaGVkdWxlclBhcmFtcwQsQmxvY2tOdW1iZXIBEAAsAWBncm91cF9yb3RhdGlvbl9mcmVxdWVuY3kQASxCbG9ja051bWJlcgABZHBhcmFzX2F2YWlsYWJpbGl0eV9wZXJpb2QQASxCbG9ja051bWJlcgABXG1heF92YWxpZGF0b3JzX3Blcl9jb3JlnAEsT3B0aW9uPHUzMj4AASRsb29rYWhlYWQQAQx1MzIAASRudW1fY29yZXMQAQx1MzIAAWRtYXhfYXZhaWxhYmlsaXR5X3RpbWVvdXRzEAEMdTMyAAFgb25fZGVtYW5kX3F1ZXVlX21heF9zaXplEAEMdTMyAAGIb25fZGVtYW5kX3RhcmdldF9xdWV1ZV91dGlsaXphdGlvbpgBHFBlcmJpbGwAAWRvbl9kZW1hbmRfZmVlX3ZhcmlhYmlsaXR5mAEcUGVyYmlsbAABSG9uX2RlbWFuZF9iYXNlX2ZlZRgBHEJhbGFuY2UAAQx0dGwQASxCbG9ja051bWJlcgAAgQUQbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucxhzaGFyZWQYcGFsbGV0EENhbGwEBFQAAQAEDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMuhQUQbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucyRpbmNsdXNpb24YcGFsbGV0EENhbGwEBFQAAQAEDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMuiQUQbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWluczhwYXJhc19pbmhlcmVudBhwYWxsZXQQQ2FsbAQEVAABBBRlbnRlcgQBEGRhdGGNBQGQUGFyYWNoYWluc0luaGVyZW50RGF0YTxIZWFkZXJGb3I8VD4+AAAEMQFFbnRlciB0aGUgcGFyYXMgaW5oZXJlbnQuIFRoaXMgd2lsbCBwcm9jZXNzIGJpdGZpZWxkcyBhbmQgYmFja2VkIGNhbmRpZGF0ZXMuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLo0FDExwb2xrYWRvdF9wcmltaXRpdmVzIHZzdGFnaW5nMEluaGVyZW50RGF0YQQMSERSAcUBABABJGJpdGZpZWxkc5EFAZBVbmNoZWNrZWRTaWduZWRBdmFpbGFiaWxpdHlCaXRmaWVsZHMAAURiYWNrZWRfY2FuZGlkYXRlc60FAXxWZWM8QmFja2VkQ2FuZGlkYXRlPEhEUjo6SGFzaD4+AAEgZGlzcHV0ZXPtBQFgTXVsdGlEaXNwdXRlU3RhdGVtZW50U2V0AAE0cGFyZW50X2hlYWRlcsUBAQxIRFIAAJEFAAAClQUAlQUQTHBvbGthZG90X3ByaW1pdGl2ZXMIdjgYc2lnbmVkPFVuY2hlY2tlZFNpZ25lZAgcUGF5bG9hZAGZBSxSZWFsUGF5bG9hZAGZBQAMARxwYXlsb2FkmQUBHFBheWxvYWQAATx2YWxpZGF0b3JfaW5kZXilBQE4VmFsaWRhdG9ySW5kZXgAASRzaWduYXR1cmWpBQFIVmFsaWRhdG9yU2lnbmF0dXJlAACZBQxMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2OFBBdmFpbGFiaWxpdHlCaXRmaWVsZAAABACdBQF8Qml0VmVjPHU4LCBiaXR2ZWM6Om9yZGVyOjpMc2IwPgAAnQUAAAcIoQUAoQUMGGJpdHZlYxRvcmRlchBMc2IwAAAAAKUFDExwb2xrYWRvdF9wcmltaXRpdmVzCHY4OFZhbGlkYXRvckluZGV4AAAEABABDHUzMgAAqQUQTHBvbGthZG90X3ByaW1pdGl2ZXMIdjg0dmFsaWRhdG9yX2FwcCRTaWduYXR1cmUAAAQAhQIBSHNyMjU1MTk6OlNpZ25hdHVyZQAArQUAAAKxBQCxBQxMcG9sa2Fkb3RfcHJpbWl0aXZlcyB2c3RhZ2luZzxCYWNrZWRDYW5kaWRhdGUEBEgBNAAMASRjYW5kaWRhdGW1BQF4Q29tbWl0dGVkQ2FuZGlkYXRlUmVjZWlwdFYyPEg+AAE4dmFsaWRpdHlfdm90ZXPlBQFgVmVjPFZhbGlkaXR5QXR0ZXN0YXRpb24+AAFEdmFsaWRhdG9yX2luZGljZXOdBQF8Qml0VmVjPHU4LCBiaXR2ZWM6Om9yZGVyOjpMc2IwPgAAtQUMTHBvbGthZG90X3ByaW1pdGl2ZXMgdnN0YWdpbmdsQ29tbWl0dGVkQ2FuZGlkYXRlUmVjZWlwdFYyBARIATQACAEoZGVzY3JpcHRvcrkFAWBDYW5kaWRhdGVEZXNjcmlwdG9yVjI8SD4AASxjb21taXRtZW50c8UFAVBDYW5kaWRhdGVDb21taXRtZW50cwAAuQUMTHBvbGthZG90X3ByaW1pdGl2ZXMgdnN0YWdpbmdUQ2FuZGlkYXRlRGVzY3JpcHRvclYyBARIATQAMAEccGFyYV9pZLECARhQYXJhSWQAATByZWxheV9wYXJlbnQ0AQRIAAEcdmVyc2lvbr0FATxJbnRlcm5hbFZlcnNpb24AAShjb3JlX2luZGV4QQEBDHUxNgABNHNlc3Npb25faW5kZXgQATBTZXNzaW9uSW5kZXgAASRyZXNlcnZlZDFhAwEgW3U4OyAyNV0AAXhwZXJzaXN0ZWRfdmFsaWRhdGlvbl9kYXRhX2hhc2g0ARBIYXNoAAEgcG92X2hhc2g0ARBIYXNoAAEwZXJhc3VyZV9yb290NAEQSGFzaAABJHJlc2VydmVkMoUCASBbdTg7IDY0XQABJHBhcmFfaGVhZDQBEEhhc2gAAVB2YWxpZGF0aW9uX2NvZGVfaGFzaMEFAUhWYWxpZGF0aW9uQ29kZUhhc2gAAL0FDExwb2xrYWRvdF9wcmltaXRpdmVzIHZzdGFnaW5nPEludGVybmFsVmVyc2lvbgAABAAIAQh1OAAAwQUMdHBvbGthZG90X3BhcmFjaGFpbl9wcmltaXRpdmVzKHByaW1pdGl2ZXNIVmFsaWRhdGlvbkNvZGVIYXNoAAAEADQBEEhhc2gAAMUFDExwb2xrYWRvdF9wcmltaXRpdmVzCHY4UENhbmRpZGF0ZUNvbW1pdG1lbnRzBAROARAAGAE8dXB3YXJkX21lc3NhZ2VzyQUBOFVwd2FyZE1lc3NhZ2VzAAFMaG9yaXpvbnRhbF9tZXNzYWdlc80FAUhIb3Jpem9udGFsTWVzc2FnZXMAAUxuZXdfdmFsaWRhdGlvbl9jb2Rl2QUBWE9wdGlvbjxWYWxpZGF0aW9uQ29kZT4AASRoZWFkX2RhdGHhBQEgSGVhZERhdGEAAWxwcm9jZXNzZWRfZG93bndhcmRfbWVzc2FnZXMQAQx1MzIAAThocm1wX3dhdGVybWFyaxABBE4AAMkFDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBOARTAAAEALkBARhWZWM8VD4AAM0FDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQB0QUEUwAABADVBQEYVmVjPFQ+AADRBQhgcG9sa2Fkb3RfY29yZV9wcmltaXRpdmVzTE91dGJvdW5kSHJtcE1lc3NhZ2UECElkAbECAAgBJHJlY2lwaWVudLECAQhJZAABEGRhdGE4AUxhbGxvYzo6dmVjOjpWZWM8dTg+AADVBQAAAtEFANkFBBhPcHRpb24EBFQB3QUBCBBOb25lAAAAEFNvbWUEAN0FAAABAADdBQx0cG9sa2Fkb3RfcGFyYWNoYWluX3ByaW1pdGl2ZXMocHJpbWl0aXZlczhWYWxpZGF0aW9uQ29kZQAABAA4ARxWZWM8dTg+AADhBQx0cG9sa2Fkb3RfcGFyYWNoYWluX3ByaW1pdGl2ZXMocHJpbWl0aXZlcyBIZWFkRGF0YQAABAA4ARxWZWM8dTg+AADlBQAAAukFAOkFDExwb2xrYWRvdF9wcmltaXRpdmVzCHY4TFZhbGlkaXR5QXR0ZXN0YXRpb24AAQggSW1wbGljaXQEAKkFAUhWYWxpZGF0b3JTaWduYXR1cmUAAQAgRXhwbGljaXQEAKkFAUhWYWxpZGF0b3JTaWduYXR1cmUAAgAA7QUAAALxBQDxBQxMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2OExEaXNwdXRlU3RhdGVtZW50U2V0AAAMAThjYW5kaWRhdGVfaGFzaPUFATRDYW5kaWRhdGVIYXNoAAEcc2Vzc2lvbhABMFNlc3Npb25JbmRleAABKHN0YXRlbWVudHP5BQHsVmVjPChEaXNwdXRlU3RhdGVtZW50LCBWYWxpZGF0b3JJbmRleCwgVmFsaWRhdG9yU2lnbmF0dXJlKT4AAPUFCGBwb2xrYWRvdF9jb3JlX3ByaW1pdGl2ZXM0Q2FuZGlkYXRlSGFzaAAABAA0ARBIYXNoAAD5BQAAAv0FAP0FAAAEDAEGpQWpBQABBgxMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2OEBEaXNwdXRlU3RhdGVtZW50AAEIFFZhbGlkBAAFBgFkVmFsaWREaXNwdXRlU3RhdGVtZW50S2luZAAAABxJbnZhbGlkBAANBgFsSW52YWxpZERpc3B1dGVTdGF0ZW1lbnRLaW5kAAEAAAUGDExwb2xrYWRvdF9wcmltaXRpdmVzCHY4ZFZhbGlkRGlzcHV0ZVN0YXRlbWVudEtpbmQAARQgRXhwbGljaXQAAAA8QmFja2luZ1NlY29uZGVkBAA0ARBIYXNoAAEAMEJhY2tpbmdWYWxpZAQANAEQSGFzaAACAEBBcHByb3ZhbENoZWNraW5nAAMAiEFwcHJvdmFsQ2hlY2tpbmdNdWx0aXBsZUNhbmRpZGF0ZXMEAAkGAUhWZWM8Q2FuZGlkYXRlSGFzaD4ABAAACQYAAAL1BQANBgxMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2OGxJbnZhbGlkRGlzcHV0ZVN0YXRlbWVudEtpbmQAAQQgRXhwbGljaXQAAAAAEQYQbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucxRwYXJhcxhwYWxsZXQQQ2FsbAQEVAABMFhmb3JjZV9zZXRfY3VycmVudF9jb2RlCAEQcGFyYbECARhQYXJhSWQAASBuZXdfY29kZd0FAThWYWxpZGF0aW9uQ29kZQAABPhTZXQgdGhlIHN0b3JhZ2UgZm9yIHRoZSBwYXJhY2hhaW4gdmFsaWRhdGlvbiBjb2RlIGltbWVkaWF0ZWx5Llhmb3JjZV9zZXRfY3VycmVudF9oZWFkCAEQcGFyYbECARhQYXJhSWQAASBuZXdfaGVhZOEFASBIZWFkRGF0YQABBAEBU2V0IHRoZSBzdG9yYWdlIGZvciB0aGUgY3VycmVudCBwYXJhY2hhaW4gaGVhZCBkYXRhIGltbWVkaWF0ZWx5Lmxmb3JjZV9zY2hlZHVsZV9jb2RlX3VwZ3JhZGUMARBwYXJhsQIBGFBhcmFJZAABIG5ld19jb2Rl3QUBOFZhbGlkYXRpb25Db2RlAAFMcmVsYXlfcGFyZW50X251bWJlchABREJsb2NrTnVtYmVyRm9yPFQ+AAIELQFTY2hlZHVsZSBhbiB1cGdyYWRlIGFzIGlmIGl0IHdhcyBzY2hlZHVsZWQgaW4gdGhlIGdpdmVuIHJlbGF5IHBhcmVudCBibG9jay5MZm9yY2Vfbm90ZV9uZXdfaGVhZAgBEHBhcmGxAgEYUGFyYUlkAAEgbmV3X2hlYWThBQEgSGVhZERhdGEAAwQdAU5vdGUgYSBuZXcgYmxvY2sgaGVhZCBmb3IgcGFyYSB3aXRoaW4gdGhlIGNvbnRleHQgb2YgdGhlIGN1cnJlbnQgYmxvY2suSGZvcmNlX3F1ZXVlX2FjdGlvbgQBEHBhcmGxAgEYUGFyYUlkAAQM+FB1dCBhIHBhcmFjaGFpbiBkaXJlY3RseSBpbnRvIHRoZSBuZXh0IHNlc3Npb24ncyBhY3Rpb24gcXVldWUu9FdlIGNhbid0IHF1ZXVlIGl0IGFueSBzb29uZXIgdGhhbiB0aGlzIHdpdGhvdXQgZ29pbmcgaW50byB0aGU4aW5pdGlhbGl6ZXIuLi5sYWRkX3RydXN0ZWRfdmFsaWRhdGlvbl9jb2RlBAE8dmFsaWRhdGlvbl9jb2Rl3QUBOFZhbGlkYXRpb25Db2RlAAU4oEFkZHMgdGhlIHZhbGlkYXRpb24gY29kZSB0byB0aGUgc3RvcmFnZS4AWQFUaGUgY29kZSB3aWxsIG5vdCBiZSBhZGRlZCBpZiBpdCBpcyBhbHJlYWR5IHByZXNlbnQuIEFkZGl0aW9uYWxseSwgaWYgUFZGIHByZS1jaGVja2luZ+BpcyBydW5uaW5nIGZvciB0aGF0IGNvZGUsIGl0IHdpbGwgYmUgaW5zdGFudGx5IGFjY2VwdGVkLgBRAU90aGVyd2lzZSwgdGhlIGNvZGUgd2lsbCBiZSBhZGRlZCBpbnRvIHRoZSBzdG9yYWdlLiBOb3RlIHRoYXQgdGhlIGNvZGUgd2lsbCBiZSBhZGRlZGEBaW50byBzdG9yYWdlIHdpdGggcmVmZXJlbmNlIGNvdW50IDAuIFRoaXMgaXMgdG8gYWNjb3VudCB0aGUgZmFjdCB0aGF0IHRoZXJlIGFyZSBubyB1c2Vyc00BZm9yIHRoaXMgY29kZSB5ZXQuIFRoZSBjYWxsZXIgd2lsbCBoYXZlIHRvIG1ha2Ugc3VyZSB0aGF0IHRoaXMgY29kZSBldmVudHVhbGx5IGdldHNJAXVzZWQgYnkgc29tZSBwYXJhY2hhaW4gb3IgcmVtb3ZlZCBmcm9tIHRoZSBzdG9yYWdlIHRvIGF2b2lkIHN0b3JhZ2UgbGVha3MuIEZvciB0aGVJAWxhdHRlciBwcmVmZXIgdG8gdXNlIHRoZSBgcG9rZV91bnVzZWRfdmFsaWRhdGlvbl9jb2RlYCBkaXNwYXRjaGFibGUgdG8gcmF3IHN0b3JhZ2U0bWFuaXB1bGF0aW9uLgBRAVRoaXMgZnVuY3Rpb24gaXMgbWFpbmx5IG1lYW50IHRvIGJlIHVzZWQgZm9yIHVwZ3JhZGluZyBwYXJhY2hhaW5zIHRoYXQgZG8gbm90IGZvbGxvdwkBdGhlIGdvLWFoZWFkIHNpZ25hbCB3aGlsZSB0aGUgUFZGIHByZS1jaGVja2luZyBmZWF0dXJlIGlzIGVuYWJsZWQubHBva2VfdW51c2VkX3ZhbGlkYXRpb25fY29kZQQBUHZhbGlkYXRpb25fY29kZV9oYXNowQUBSFZhbGlkYXRpb25Db2RlSGFzaAAGFCUBUmVtb3ZlIHRoZSB2YWxpZGF0aW9uIGNvZGUgZnJvbSB0aGUgc3RvcmFnZSBpZmYgdGhlIHJlZmVyZW5jZSBjb3VudCBpcyAwLgBZAVRoaXMgaXMgYmV0dGVyIHRoYW4gcmVtb3ZpbmcgdGhlIHN0b3JhZ2UgZGlyZWN0bHksIGJlY2F1c2UgaXQgd2lsbCBub3QgcmVtb3ZlIHRoZSBjb2RlQQF0aGF0IHdhcyBzdWRkZW5seSBnb3QgdXNlZCBieSBzb21lIHBhcmFjaGFpbiB3aGlsZSB0aGlzIGRpc3BhdGNoYWJsZSB3YXMgcGVuZGluZzBkaXNwYXRjaGluZy5saW5jbHVkZV9wdmZfY2hlY2tfc3RhdGVtZW50CAEQc3RtdBUGAURQdmZDaGVja1N0YXRlbWVudAABJHNpZ25hdHVyZakFAUhWYWxpZGF0b3JTaWduYXR1cmUABwhVAUluY2x1ZGVzIGEgc3RhdGVtZW50IGZvciBhIFBWRiBwcmUtY2hlY2tpbmcgdm90ZS4gUG90ZW50aWFsbHksIGZpbmFsaXplcyB0aGUgdm90ZSBhbmRBAWVuYWN0cyB0aGUgcmVzdWx0cyBpZiB0aGF0IHdhcyB0aGUgbGFzdCB2b3RlIGJlZm9yZSBhY2hpZXZpbmcgdGhlIHN1cGVybWFqb3JpdHkudGZvcmNlX3NldF9tb3N0X3JlY2VudF9jb250ZXh0CAEQcGFyYbECARhQYXJhSWQAARxjb250ZXh0EAFEQmxvY2tOdW1iZXJGb3I8VD4ACAQBAVNldCB0aGUgc3RvcmFnZSBmb3IgdGhlIGN1cnJlbnQgcGFyYWNoYWluIGhlYWQgZGF0YSBpbW1lZGlhdGVseS5ccmVtb3ZlX3VwZ3JhZGVfY29vbGRvd24EARBwYXJhsQIBGFBhcmFJZAAJEKxSZW1vdmUgYW4gdXBncmFkZSBjb29sZG93biBmb3IgYSBwYXJhY2hhaW4uAFEBVGhlIGNvc3QgZm9yIHJlbW92aW5nIHRoZSBjb29sZG93biBlYXJsaWVyIGRlcGVuZHMgb24gdGhlIHRpbWUgbGVmdCBmb3IgdGhlIGNvb2xkb3duQQFtdWx0aXBsaWVkIGJ5IFtgQ29uZmlnOjpDb29sZG93blJlbW92YWxNdWx0aXBsaWVyYF0uIFRoZSBwYWlkIHRva2VucyBhcmUgYnVybmVkLpRhdXRob3JpemVfZm9yY2Vfc2V0X2N1cnJlbnRfY29kZV9oYXNoDAEQcGFyYbECARhQYXJhSWQAATRuZXdfY29kZV9oYXNowQUBSFZhbGlkYXRpb25Db2RlSGFzaAABMHZhbGlkX3BlcmlvZBABREJsb2NrTnVtYmVyRm9yPFQ+AAosHQFTZXRzIHRoZSBzdG9yYWdlIGZvciB0aGUgYXV0aG9yaXplZCBjdXJyZW50IGNvZGUgaGFzaCBvZiB0aGUgcGFyYWNoYWluLmEBSWYgbm90IGFwcGxpZWQsIGl0IHdpbGwgYmUgcmVtb3ZlZCBhdCB0aGUgYFN5c3RlbTo6YmxvY2tfbnVtYmVyKCkgKyB2YWxpZF9wZXJpb2RgIGJsb2NrLgA9AVRoaXMgY2FuIGJlIHVzZWZ1bCwgd2hlbiB0cmlnZ2VyaW5nIGBQYXJhczo6Zm9yY2Vfc2V0X2N1cnJlbnRfY29kZShwYXJhLCBjb2RlKWAlAWZyb20gYSBkaWZmZXJlbnQgY2hhaW4gdGhhbiB0aGUgb25lIHdoZXJlIHRoZSBgUGFyYXNgIHBhbGxldCBpcyBkZXBsb3llZC4AVQFUaGUgbWFpbiBwdXJwb3NlIGlzIHRvIGF2b2lkIHRyYW5zZmVycmluZyB0aGUgZW50aXJlIGBjb2RlYCBXYXNtIGJsb2IgYmV0d2VlbiBjaGFpbnMuMQFJbnN0ZWFkLCB3ZSBhdXRob3JpemUgYGNvZGVfaGFzaGAgd2l0aCBgcm9vdGAsIHdoaWNoIGNhbiBsYXRlciBiZSBhcHBsaWVkIGJ5HQFgUGFyYXM6OmFwcGx5X2F1dGhvcml6ZWRfZm9yY2Vfc2V0X2N1cnJlbnRfY29kZShwYXJhLCBjb2RlKWAgYnkgYW55b25lLgDcQXV0aG9yaXphdGlvbnMgYXJlIHN0b3JlZCBpbiBhbiAqKm92ZXJ3cml0aW5nIG1hbm5lcioqLpxhcHBseV9hdXRob3JpemVkX2ZvcmNlX3NldF9jdXJyZW50X2NvZGUIARBwYXJhsQIBGFBhcmFJZAABIG5ld19jb2Rl3QUBOFZhbGlkYXRpb25Db2RlAAsI+EFwcGxpZXMgdGhlIGFscmVhZHkgYXV0aG9yaXplZCBjdXJyZW50IGNvZGUgZm9yIHRoZSBwYXJhY2hhaW4s+HRyaWdnZXJpbmcgdGhlIHNhbWUgZnVuY3Rpb25hbGl0eSBhcyBgZm9yY2Vfc2V0X2N1cnJlbnRfY29kZWAuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLhUGDExwb2xrYWRvdF9wcmltaXRpdmVzCHY4RFB2ZkNoZWNrU3RhdGVtZW50AAAQARhhY2NlcHQgARBib29sAAEcc3ViamVjdMEFAUhWYWxpZGF0aW9uQ29kZUhhc2gAATRzZXNzaW9uX2luZGV4EAEwU2Vzc2lvbkluZGV4AAE8dmFsaWRhdG9yX2luZGV4pQUBOFZhbGlkYXRvckluZGV4AAAZBhBscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zLGluaXRpYWxpemVyGHBhbGxldBBDYWxsBARUAAEENGZvcmNlX2FwcHJvdmUEARR1cF90bxABLEJsb2NrTnVtYmVyAAAMOQFJc3N1ZSBhIHNpZ25hbCB0byB0aGUgY29uc2Vuc3VzIGVuZ2luZSB0byBmb3JjaWJseSBhY3QgYXMgdGhvdWdoIGFsbCBwYXJhY2hhaW5RAWJsb2NrcyBpbiBhbGwgcmVsYXkgY2hhaW4gYmxvY2tzIHVwIHRvIGFuZCBpbmNsdWRpbmcgdGhlIGdpdmVuIG51bWJlciBpbiB0aGUgY3VycmVudKBjaGFpbiBhcmUgdmFsaWQgYW5kIHNob3VsZCBiZSBmaW5hbGl6ZWQuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLh0GEGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMQaHJtcBhwYWxsZXQQQ2FsbAQEVAABLFhocm1wX2luaXRfb3Blbl9jaGFubmVsDAEkcmVjaXBpZW50sQIBGFBhcmFJZAABVHByb3Bvc2VkX21heF9jYXBhY2l0eRABDHUzMgABZHByb3Bvc2VkX21heF9tZXNzYWdlX3NpemUQAQx1MzIAAChNAUluaXRpYXRlIG9wZW5pbmcgYSBjaGFubmVsIGZyb20gYSBwYXJhY2hhaW4gdG8gYSBnaXZlbiByZWNpcGllbnQgd2l0aCBnaXZlbiBjaGFubmVsLHBhcmFtZXRlcnMuAFkBLSBgcHJvcG9zZWRfbWF4X2NhcGFjaXR5YCAtIHNwZWNpZmllcyBob3cgbWFueSBtZXNzYWdlcyBjYW4gYmUgaW4gdGhlIGNoYW5uZWwgYXQgb25jZS4tAS0gYHByb3Bvc2VkX21heF9tZXNzYWdlX3NpemVgIC0gc3BlY2lmaWVzIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIG1lc3NhZ2VzLgARAVRoZXNlIG51bWJlcnMgYXJlIGEgc3ViamVjdCB0byB0aGUgcmVsYXktY2hhaW4gY29uZmlndXJhdGlvbiBsaW1pdHMuAFEBVGhlIGNoYW5uZWwgY2FuIGJlIG9wZW5lZCBvbmx5IGFmdGVyIHRoZSByZWNpcGllbnQgY29uZmlybXMgaXQgYW5kIG9ubHkgb24gYSBzZXNzaW9uHGNoYW5nZS5gaHJtcF9hY2NlcHRfb3Blbl9jaGFubmVsBAEYc2VuZGVysQIBGFBhcmFJZAABDPBBY2NlcHQgYSBwZW5kaW5nIG9wZW4gY2hhbm5lbCByZXF1ZXN0IGZyb20gdGhlIGdpdmVuIHNlbmRlci4A9FRoZSBjaGFubmVsIHdpbGwgYmUgb3BlbmVkIG9ubHkgb24gdGhlIG5leHQgc2Vzc2lvbiBib3VuZGFyeS5IaHJtcF9jbG9zZV9jaGFubmVsBAEoY2hhbm5lbF9pZCEGATRIcm1wQ2hhbm5lbElkAAIQVQFJbml0aWF0ZSB1bmlsYXRlcmFsIGNsb3Npbmcgb2YgYSBjaGFubmVsLiBUaGUgb3JpZ2luIG11c3QgYmUgZWl0aGVyIHRoZSBzZW5kZXIgb3IgdGhlmHJlY2lwaWVudCBpbiB0aGUgY2hhbm5lbCBiZWluZyBjbG9zZWQuAMBUaGUgY2xvc3VyZSBjYW4gb25seSBoYXBwZW4gb24gYSBzZXNzaW9uIGNoYW5nZS5AZm9yY2VfY2xlYW5faHJtcAwBEHBhcmGxAgEYUGFyYUlkAAEsbnVtX2luYm91bmQQAQx1MzIAATBudW1fb3V0Ym91bmQQAQx1MzIAAxxdAVRoaXMgZXh0cmluc2ljIHRyaWdnZXJzIHRoZSBjbGVhbnVwIG9mIGFsbCB0aGUgSFJNUCBzdG9yYWdlIGl0ZW1zIHRoYXQgYSBwYXJhIG1heSBoYXZlLkkBTm9ybWFsbHkgdGhpcyBoYXBwZW5zIG9uY2UgcGVyIHNlc3Npb24sIGJ1dCB0aGlzIGFsbG93cyB5b3UgdG8gdHJpZ2dlciB0aGUgY2xlYW51cJRpbW1lZGlhdGVseSBmb3IgYSBzcGVjaWZpYyBwYXJhY2hhaW4uAFEBTnVtYmVyIG9mIGluYm91bmQgYW5kIG91dGJvdW5kIGNoYW5uZWxzIGZvciBgcGFyYWAgbXVzdCBiZSBwcm92aWRlZCBhcyB3aXRuZXNzIGRhdGEuAJBPcmlnaW4gbXVzdCBiZSB0aGUgYENoYW5uZWxNYW5hZ2VyYC5cZm9yY2VfcHJvY2Vzc19ocm1wX29wZW4EASBjaGFubmVscxABDHUzMgAEIKRGb3JjZSBwcm9jZXNzIEhSTVAgb3BlbiBjaGFubmVsIHJlcXVlc3RzLgBVAUlmIHRoZXJlIGFyZSBwZW5kaW5nIEhSTVAgb3BlbiBjaGFubmVsIHJlcXVlc3RzLCB5b3UgY2FuIHVzZSB0aGlzIGZ1bmN0aW9uIHRvIHByb2Nlc3OIYWxsIG9mIHRob3NlIHJlcXVlc3RzIGltbWVkaWF0ZWx5LgAJAVRvdGFsIG51bWJlciBvZiBvcGVuaW5nIGNoYW5uZWxzIG11c3QgYmUgcHJvdmlkZWQgYXMgd2l0bmVzcyBkYXRhLgCQT3JpZ2luIG11c3QgYmUgdGhlIGBDaGFubmVsTWFuYWdlcmAuYGZvcmNlX3Byb2Nlc3NfaHJtcF9jbG9zZQQBIGNoYW5uZWxzEAEMdTMyAAUgqEZvcmNlIHByb2Nlc3MgSFJNUCBjbG9zZSBjaGFubmVsIHJlcXVlc3RzLgBZAUlmIHRoZXJlIGFyZSBwZW5kaW5nIEhSTVAgY2xvc2UgY2hhbm5lbCByZXF1ZXN0cywgeW91IGNhbiB1c2UgdGhpcyBmdW5jdGlvbiB0byBwcm9jZXNziGFsbCBvZiB0aG9zZSByZXF1ZXN0cyBpbW1lZGlhdGVseS4ACQFUb3RhbCBudW1iZXIgb2YgY2xvc2luZyBjaGFubmVscyBtdXN0IGJlIHByb3ZpZGVkIGFzIHdpdG5lc3MgZGF0YS4AkE9yaWdpbiBtdXN0IGJlIHRoZSBgQ2hhbm5lbE1hbmFnZXJgLmBocm1wX2NhbmNlbF9vcGVuX3JlcXVlc3QIAShjaGFubmVsX2lkIQYBNEhybXBDaGFubmVsSWQAATRvcGVuX3JlcXVlc3RzEAEMdTMyAAYgXQFUaGlzIGNhbmNlbHMgYSBwZW5kaW5nIG9wZW4gY2hhbm5lbCByZXF1ZXN0LiBJdCBjYW4gYmUgY2FuY2VsZWQgYnkgZWl0aGVyIG9mIHRoZSBzZW5kZXIZAW9yIHRoZSByZWNpcGllbnQgZm9yIHRoYXQgcmVxdWVzdC4gVGhlIG9yaWdpbiBtdXN0IGJlIGVpdGhlciBvZiB0aG9zZS4AXQFUaGUgY2FuY2VsbGF0aW9uIGhhcHBlbnMgaW1tZWRpYXRlbHkuIEl0IGlzIG5vdCBwb3NzaWJsZSB0byBjYW5jZWwgdGhlIHJlcXVlc3QgaWYgaXQgaXNEYWxyZWFkeSBhY2NlcHRlZC4AWQFUb3RhbCBudW1iZXIgb2Ygb3BlbiByZXF1ZXN0cyAoaS5lLiBgSHJtcE9wZW5DaGFubmVsUmVxdWVzdHNMaXN0YCkgbXVzdCBiZSBwcm92aWRlZCBhczR3aXRuZXNzIGRhdGEuXGZvcmNlX29wZW5faHJtcF9jaGFubmVsEAEYc2VuZGVysQIBGFBhcmFJZAABJHJlY2lwaWVudLECARhQYXJhSWQAATBtYXhfY2FwYWNpdHkQAQx1MzIAAUBtYXhfbWVzc2FnZV9zaXplEAEMdTMyAAcgYQFPcGVuIGEgY2hhbm5lbCBmcm9tIGEgYHNlbmRlcmAgdG8gYSBgcmVjaXBpZW50YCBgUGFyYUlkYC4gQWx0aG91Z2ggb3BlbmVkIGJ5IGdvdmVybmFuY2UsQQF0aGUgYG1heF9jYXBhY2l0eWAgYW5kIGBtYXhfbWVzc2FnZV9zaXplYCBhcmUgc3RpbGwgc3ViamVjdCB0byB0aGUgUmVsYXkgQ2hhaW4nc0hjb25maWd1cmVkIGxpbWl0cy4ATQFFeHBlY3RlZCB1c2UgaXMgd2hlbiBvbmUgKGFuZCBvbmx5IG9uZSkgb2YgdGhlIGBQYXJhSWRgcyBpbnZvbHZlZCBpbiB0aGUgY2hhbm5lbCBpc8Bnb3Zlcm5lZCBieSB0aGUgc3lzdGVtLCBlLmcuIGEgc3lzdGVtIHBhcmFjaGFpbi4AkE9yaWdpbiBtdXN0IGJlIHRoZSBgQ2hhbm5lbE1hbmFnZXJgLmBlc3RhYmxpc2hfc3lzdGVtX2NoYW5uZWwIARhzZW5kZXKxAgEYUGFyYUlkAAEkcmVjaXBpZW50sQIBGFBhcmFJZAAIMFEBRXN0YWJsaXNoIGFuIEhSTVAgY2hhbm5lbCBiZXR3ZWVuIHR3byBzeXN0ZW0gY2hhaW5zLiBJZiB0aGUgY2hhbm5lbCBkb2VzIG5vdCBhbHJlYWR5UQFleGlzdCwgdGhlIHRyYW5zYWN0aW9uIGZlZXMgd2lsbCBiZSByZWZ1bmRlZCB0byB0aGUgY2FsbGVyLiBUaGUgc3lzdGVtIGRvZXMgbm90IHRha2VZAWRlcG9zaXRzIGZvciBjaGFubmVscyBiZXR3ZWVuIHN5c3RlbSBjaGFpbnMsIGFuZCBhdXRvbWF0aWNhbGx5IHNldHMgdGhlIG1lc3NhZ2UgbnVtYmVyGQFhbmQgc2l6ZSBsaW1pdHMgdG8gdGhlIG1heGltdW0gYWxsb3dlZCBieSB0aGUgbmV0d29yaydzIGNvbmZpZ3VyYXRpb24uAChBcmd1bWVudHM6AJQtIGBzZW5kZXJgOiBBIHN5c3RlbSBjaGFpbiwgYFBhcmFJZGAuoC0gYHJlY2lwaWVudGA6IEEgc3lzdGVtIGNoYWluLCBgUGFyYUlkYC4AVQFBbnkgc2lnbmVkIG9yaWdpbiBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uLCBidXQgX2JvdGhfIGlucHV0cyBNVVNUIGJlIHN5c3RlbSBjaGFpbnMuIElmwHRoZSBjaGFubmVsIGRvZXMgbm90IGV4aXN0IHlldCwgdGhlcmUgaXMgbm8gZmVlLlRwb2tlX2NoYW5uZWxfZGVwb3NpdHMIARhzZW5kZXKxAgEYUGFyYUlkAAEkcmVjaXBpZW50sQIBGFBhcmFJZAAJJFEBVXBkYXRlIHRoZSBkZXBvc2l0cyBoZWxkIGZvciBhbiBIUk1QIGNoYW5uZWwgdG8gdGhlIGxhdGVzdCBgQ29uZmlndXJhdGlvbmAuIENoYW5uZWxzsHdpdGggc3lzdGVtIGNoYWlucyBkbyBub3QgcmVxdWlyZSBhIGRlcG9zaXQuAChBcmd1bWVudHM6AHgtIGBzZW5kZXJgOiBBIGNoYWluLCBgUGFyYUlkYC6ELSBgcmVjaXBpZW50YDogQSBjaGFpbiwgYFBhcmFJZGAuAKRBbnkgc2lnbmVkIG9yaWdpbiBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uLnRlc3RhYmxpc2hfY2hhbm5lbF93aXRoX3N5c3RlbQQBTHRhcmdldF9zeXN0ZW1fY2hhaW6xAgEYUGFyYUlkAAocOQFFc3RhYmxpc2ggYSBiaWRpcmVjdGlvbmFsIEhSTVAgY2hhbm5lbCBiZXR3ZWVuIGEgcGFyYWNoYWluIGFuZCBhIHN5c3RlbSBjaGFpbi4AKEFyZ3VtZW50czoAyC0gYHRhcmdldF9zeXN0ZW1fY2hhaW5gOiBBIHN5c3RlbSBjaGFpbiwgYFBhcmFJZGAuALBUaGUgb3JpZ2luIG5lZWRzIHRvIGJlIHRoZSBwYXJhY2hhaW4gb3JpZ2luLgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy4hBgx0cG9sa2Fkb3RfcGFyYWNoYWluX3ByaW1pdGl2ZXMocHJpbWl0aXZlczRIcm1wQ2hhbm5lbElkAAAIARhzZW5kZXKxAgEISWQAASRyZWNpcGllbnSxAgEISWQAACUGEGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMgZGlzcHV0ZXMYcGFsbGV0EENhbGwEBFQAAQQ4Zm9yY2VfdW5mcmVlemUAAAAEDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMuKQYUbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucyBkaXNwdXRlcyBzbGFzaGluZxhwYWxsZXQQQ2FsbAQEVAABBHByZXBvcnRfZGlzcHV0ZV9sb3N0X3Vuc2lnbmVkCAE0ZGlzcHV0ZV9wcm9vZi0GAUxCb3g8RGlzcHV0ZVByb29mVjI+AAE8a2V5X293bmVyX3Byb29m1QEBQFQ6OktleU93bmVyUHJvb2YAAAAEDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMuLQYMTHBvbGthZG90X3ByaW1pdGl2ZXMgdnN0YWdpbmcwRGlzcHV0ZVByb29mAAAQASR0aW1lX3Nsb3QxBgFARGlzcHV0ZXNUaW1lU2xvdAABEGtpbmQ1BgFIRGlzcHV0ZU9mZmVuY2VLaW5kAAE8dmFsaWRhdG9yX2luZGV4pQUBOFZhbGlkYXRvckluZGV4AAEwdmFsaWRhdG9yX2lkWQIBLFZhbGlkYXRvcklkAAAxBhBMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2OCBzbGFzaGluZ0BEaXNwdXRlc1RpbWVTbG90AAAIATRzZXNzaW9uX2luZGV4EAEwU2Vzc2lvbkluZGV4AAE4Y2FuZGlkYXRlX2hhc2j1BQE0Q2FuZGlkYXRlSGFzaAAANQYMTHBvbGthZG90X3ByaW1pdGl2ZXMgdnN0YWdpbmdIRGlzcHV0ZU9mZmVuY2VLaW5kAAEMQEZvckludmFsaWRCYWNrZWQAAAAwQWdhaW5zdFZhbGlkAAEASEZvckludmFsaWRBcHByb3ZlZAACAAA5BhBscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zJG9uX2RlbWFuZBhwYWxsZXQQQ2FsbAQEVAABDFxwbGFjZV9vcmRlcl9hbGxvd19kZWF0aAgBKG1heF9hbW91bnQYATBCYWxhbmNlT2Y8VD4AARxwYXJhX2lksQIBGFBhcmFJZAAAPJRDcmVhdGUgYSBzaW5nbGUgb24gZGVtYW5kIGNvcmUgb3JkZXIuSQFXaWxsIHVzZSB0aGUgc3BvdCBwcmljZSBmb3IgdGhlIGN1cnJlbnQgYmxvY2sgYW5kIHdpbGwgcmVhcCB0aGUgYWNjb3VudCBpZiBuZWVkZWQuACxQYXJhbWV0ZXJzOjkBLSBgb3JpZ2luYDogVGhlIHNlbmRlciBvZiB0aGUgY2FsbCwgZnVuZHMgd2lsbCBiZSB3aXRoZHJhd24gZnJvbSB0aGlzIGFjY291bnQuSQEtIGBtYXhfYW1vdW50YDogVGhlIG1heGltdW0gYmFsYW5jZSB0byB3aXRoZHJhdyBmcm9tIHRoZSBvcmlnaW4gdG8gcGxhY2UgYW4gb3JkZXIuDQEtIGBwYXJhX2lkYDogQSBgUGFyYUlkYCB0aGUgb3JpZ2luIHdhbnRzIHRvIHByb3ZpZGUgYmxvY2tzcGFjZSBmb3IuABxFcnJvcnM65C0gYEluc3VmZmljaWVudEJhbGFuY2VgOiBmcm9tIHRoZSBDdXJyZW5jeSBpbXBsZW1lbnRhdGlvbjQtIGBRdWV1ZUZ1bGxggC0gYFNwb3RQcmljZUhpZ2hlclRoYW5NYXhBbW91bnRgABxFdmVudHM6XC0gYE9uRGVtYW5kT3JkZXJQbGFjZWRgWHBsYWNlX29yZGVyX2tlZXBfYWxpdmUIAShtYXhfYW1vdW50GAEwQmFsYW5jZU9mPFQ+AAEccGFyYV9pZLECARhQYXJhSWQAATxhAVNhbWUgYXMgdGhlIFtgcGxhY2Vfb3JkZXJfYWxsb3dfZGVhdGhgXShTZWxmOjpwbGFjZV9vcmRlcl9hbGxvd19kZWF0aCkgY2FsbCAsIGJ1dCB3aXRoIGHcY2hlY2sgdGhhdCBwbGFjaW5nIHRoZSBvcmRlciB3aWxsIG5vdCByZWFwIHRoZSBhY2NvdW50LgAsUGFyYW1ldGVyczo5AS0gYG9yaWdpbmA6IFRoZSBzZW5kZXIgb2YgdGhlIGNhbGwsIGZ1bmRzIHdpbGwgYmUgd2l0aGRyYXduIGZyb20gdGhpcyBhY2NvdW50LkkBLSBgbWF4X2Ftb3VudGA6IFRoZSBtYXhpbXVtIGJhbGFuY2UgdG8gd2l0aGRyYXcgZnJvbSB0aGUgb3JpZ2luIHRvIHBsYWNlIGFuIG9yZGVyLg0BLSBgcGFyYV9pZGA6IEEgYFBhcmFJZGAgdGhlIG9yaWdpbiB3YW50cyB0byBwcm92aWRlIGJsb2Nrc3BhY2UgZm9yLgAcRXJyb3JzOuQtIGBJbnN1ZmZpY2llbnRCYWxhbmNlYDogZnJvbSB0aGUgQ3VycmVuY3kgaW1wbGVtZW50YXRpb240LSBgUXVldWVGdWxsYIAtIGBTcG90UHJpY2VIaWdoZXJUaGFuTWF4QW1vdW50YAAcRXZlbnRzOlwtIGBPbkRlbWFuZE9yZGVyUGxhY2VkYGBwbGFjZV9vcmRlcl93aXRoX2NyZWRpdHMIAShtYXhfYW1vdW50GAEwQmFsYW5jZU9mPFQ+AAEccGFyYV9pZLECARhQYXJhSWQAAkTIQ3JlYXRlIGEgc2luZ2xlIG9uIGRlbWFuZCBjb3JlIG9yZGVyIHdpdGggY3JlZGl0cy5ZAVdpbGwgY2hhcmdlIHRoZSBvd25lcidzIG9uLWRlbWFuZCBjcmVkaXQgYWNjb3VudCB0aGUgc3BvdCBwcmljZSBmb3IgdGhlIGN1cnJlbnQgYmxvY2suACxQYXJhbWV0ZXJzOkUBLSBgb3JpZ2luYDogVGhlIHNlbmRlciBvZiB0aGUgY2FsbCwgb24tZGVtYW5kIGNyZWRpdHMgd2lsbCBiZSB3aXRoZHJhd24gZnJvbSB0aGlzKCAgYWNjb3VudC5JAS0gYG1heF9hbW91bnRgOiBUaGUgbWF4aW11bSBudW1iZXIgb2YgY3JlZGl0cyB0byBzcGVuZCBmcm9tIHRoZSBvcmlnaW4gdG8gcGxhY2UgYW4gICBvcmRlci4NAS0gYHBhcmFfaWRgOiBBIGBQYXJhSWRgIHRoZSBvcmlnaW4gd2FudHMgdG8gcHJvdmlkZSBibG9ja3NwYWNlIGZvci4AHEVycm9yczpcLSBgSW5zdWZmaWNpZW50Q3JlZGl0c2A0LSBgUXVldWVGdWxsYIAtIGBTcG90UHJpY2VIaWdoZXJUaGFuTWF4QW1vdW50YAAcRXZlbnRzOlwtIGBPbkRlbWFuZE9yZGVyUGxhY2VkYAQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy49BhBccG9sa2Fkb3RfcnVudGltZV9jb21tb248cGFyYXNfcmVnaXN0cmFyGHBhbGxldBBDYWxsBARUAAEkIHJlZ2lzdGVyDAEIaWSxAgEYUGFyYUlkAAEwZ2VuZXNpc19oZWFk4QUBIEhlYWREYXRhAAE8dmFsaWRhdGlvbl9jb2Rl3QUBOFZhbGlkYXRpb25Db2RlAABQ+FJlZ2lzdGVyIGhlYWQgZGF0YSBhbmQgdmFsaWRhdGlvbiBjb2RlIGZvciBhIHJlc2VydmVkIFBhcmEgSWQuADAjIyBBcmd1bWVudHPALSBgb3JpZ2luYDogTXVzdCBiZSBjYWxsZWQgYnkgYSBgU2lnbmVkYCBvcmlnaW4uLQEtIGBpZGA6IFRoZSBwYXJhIElELiBNdXN0IGJlIG93bmVkL21hbmFnZWQgYnkgdGhlIGBvcmlnaW5gIHNpZ25pbmcgYWNjb3VudC4BAS0gYGdlbmVzaXNfaGVhZGA6IFRoZSBnZW5lc2lzIGhlYWQgZGF0YSBvZiB0aGUgcGFyYWNoYWluL3RocmVhZC4lAS0gYHZhbGlkYXRpb25fY29kZWA6IFRoZSBpbml0aWFsIHZhbGlkYXRpb24gY29kZSBvZiB0aGUgcGFyYWNoYWluL3RocmVhZC4AQCMjIERlcG9zaXRzL0ZlZXMJAVRoZSBhY2NvdW50IHdpdGggdGhlIG9yaWdpbmF0aW5nIHNpZ25hdHVyZSBtdXN0IHJlc2VydmUgYSBkZXBvc2l0LgBNAVRoZSBkZXBvc2l0IGlzIHJlcXVpcmVkIHRvIGNvdmVyIHRoZSBjb3N0cyBhc3NvY2lhdGVkIHdpdGggc3RvcmluZyB0aGUgZ2VuZXNpcyBoZWFkdGRhdGEgYW5kIHRoZSB2YWxpZGF0aW9uIGNvZGUuMQFUaGlzIGFjY291bnRzIGZvciB0aGUgcG90ZW50aWFsIHRvIHN0b3JlIHZhbGlkYXRpb24gY29kZSBvZiBhIHNpemUgdXAgdG8gdGhl3GBtYXhfY29kZV9zaXplYCwgYXMgZGVmaW5lZCBpbiB0aGUgY29uZmlndXJhdGlvbiBwYWxsZXQAHQFBbnl0aGluZyBhbHJlYWR5IHJlc2VydmVkIHByZXZpb3VzbHkgZm9yIHRoaXMgcGFyYSBJRCBpcyBhY2NvdW50ZWQgZm9yLgAkIyMgRXZlbnRz1FRoZSBgUmVnaXN0ZXJlZGAgZXZlbnQgaXMgZW1pdHRlZCBpbiBjYXNlIG9mIHN1Y2Nlc3MuOGZvcmNlX3JlZ2lzdGVyFAEMd2hvAAEwVDo6QWNjb3VudElkAAEcZGVwb3NpdBgBMEJhbGFuY2VPZjxUPgABCGlksQIBGFBhcmFJZAABMGdlbmVzaXNfaGVhZOEFASBIZWFkRGF0YQABPHZhbGlkYXRpb25fY29kZd0FAThWYWxpZGF0aW9uQ29kZQABGNxGb3JjZSB0aGUgcmVnaXN0cmF0aW9uIG9mIGEgUGFyYSBJZCBvbiB0aGUgcmVsYXkgY2hhaW4uALhUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGJ5IGEgUm9vdCBvcmlnaW4uABkBVGhlIGRlcG9zaXQgdGFrZW4gY2FuIGJlIHNwZWNpZmllZCBmb3IgdGhpcyByZWdpc3RyYXRpb24uIEFueSBgUGFyYUlkYBkBY2FuIGJlIHJlZ2lzdGVyZWQsIGluY2x1ZGluZyBzdWItMTAwMCBJRHMgd2hpY2ggYXJlIFN5c3RlbSBQYXJhY2hhaW5zLihkZXJlZ2lzdGVyBAEIaWSxAgEYUGFyYUlkAAIQBQFEZXJlZ2lzdGVyIGEgUGFyYSBJZCwgZnJlZWluZyBhbGwgZGF0YSBhbmQgcmV0dXJuaW5nIGFueSBkZXBvc2l0LgBRAVRoZSBjYWxsZXIgbXVzdCBiZSBSb290LCB0aGUgYHBhcmFgIG93bmVyLCBvciB0aGUgYHBhcmFgIGl0c2VsZi4gVGhlIHBhcmEgbXVzdCBiZSBhblBvbi1kZW1hbmQgcGFyYWNoYWluLhBzd2FwCAEIaWSxAgEYUGFyYUlkAAEUb3RoZXKxAgEYUGFyYUlkAAMwQQFTd2FwIGEgbGVhc2UgaG9sZGluZyBwYXJhY2hhaW4gd2l0aCBhbm90aGVyIHBhcmFjaGFpbiwgZWl0aGVyIG9uLWRlbWFuZCBvciBsZWFzZSBob2xkaW5nLgABAVRoZSBvcmlnaW4gbXVzdCBiZSBSb290LCB0aGUgYHBhcmFgIG93bmVyLCBvciB0aGUgYHBhcmFgIGl0c2VsZi4AYQFUaGUgc3dhcCB3aWxsIGhhcHBlbiBvbmx5IGlmIHRoZXJlIGlzIGFscmVhZHkgYW4gb3Bwb3NpdGUgc3dhcCBwZW5kaW5nLiBJZiB0aGVyZSBpcyBub3QsWQF0aGUgc3dhcCB3aWxsIGJlIHN0b3JlZCBpbiB0aGUgcGVuZGluZyBzd2FwcyBtYXAsIHJlYWR5IGZvciBhIGxhdGVyIGNvbmZpcm1hdG9yeSBzd2FwLgBdAVRoZSBgUGFyYUlkYHMgcmVtYWluIG1hcHBlZCB0byB0aGUgc2FtZSBoZWFkIGRhdGEgYW5kIGNvZGUgc28gZXh0ZXJuYWwgY29kZSBjYW4gcmVseSBvbj0BYFBhcmFJZGAgdG8gYmUgYSBsb25nLXRlcm0gaWRlbnRpZmllciBvZiBhIG5vdGlvbmFsICJwYXJhY2hhaW4iLiBIb3dldmVyLCB0aGVpcjUBc2NoZWR1bGluZyBpbmZvIChpLmUuIHdoZXRoZXIgdGhleSdyZSBhbiBvbi1kZW1hbmQgcGFyYWNoYWluIG9yIGxlYXNlIGhvbGRpbmcVAXBhcmFjaGFpbiksIGF1Y3Rpb24gaW5mb3JtYXRpb24gYW5kIHRoZSBhdWN0aW9uIGRlcG9zaXQgYXJlIHN3aXRjaGVkLixyZW1vdmVfbG9jawQBEHBhcmGxAgEYUGFyYUlkAAQQDQFSZW1vdmUgYSBtYW5hZ2VyIGxvY2sgZnJvbSBhIHBhcmEuIFRoaXMgd2lsbCBhbGxvdyB0aGUgbWFuYWdlciBvZiBhNQFwcmV2aW91c2x5IGxvY2tlZCBwYXJhIHRvIGRlcmVnaXN0ZXIgb3Igc3dhcCBhIHBhcmEgd2l0aG91dCB1c2luZyBnb3Zlcm5hbmNlLgDcQ2FuIG9ubHkgYmUgY2FsbGVkIGJ5IHRoZSBSb290IG9yaWdpbiBvciB0aGUgcGFyYWNoYWluLhxyZXNlcnZlAAVElFJlc2VydmUgYSBQYXJhIElkIG9uIHRoZSByZWxheSBjaGFpbi4ATQFUaGlzIGZ1bmN0aW9uIHdpbGwgcmVzZXJ2ZSBhIG5ldyBQYXJhIElkIHRvIGJlIG93bmVkL21hbmFnZWQgYnkgdGhlIG9yaWdpbiBhY2NvdW50LmEBVGhlIG9yaWdpbiBhY2NvdW50IGlzIGFibGUgdG8gcmVnaXN0ZXIgaGVhZCBkYXRhIGFuZCB2YWxpZGF0aW9uIGNvZGUgdXNpbmcgYHJlZ2lzdGVyYCB0b1kBY3JlYXRlIGFuIG9uLWRlbWFuZCBwYXJhY2hhaW4uIFVzaW5nIHRoZSBTbG90cyBwYWxsZXQsIGFuIG9uLWRlbWFuZCBwYXJhY2hhaW4gY2FuIHRoZW6kYmUgdXBncmFkZWQgdG8gYSBsZWFzZSBob2xkaW5nIHBhcmFjaGFpbi4AMCMjIEFyZ3VtZW50c1UBLSBgb3JpZ2luYDogTXVzdCBiZSBjYWxsZWQgYnkgYSBgU2lnbmVkYCBvcmlnaW4uIEJlY29tZXMgdGhlIG1hbmFnZXIvb3duZXIgb2YgdGhlIG5ldyggIHBhcmEgSUQuAEAjIyBEZXBvc2l0cy9GZWVzIQFUaGUgb3JpZ2luIG11c3QgcmVzZXJ2ZSBhIGRlcG9zaXQgb2YgYFBhcmFEZXBvc2l0YCBmb3IgdGhlIHJlZ2lzdHJhdGlvbi4AJCMjIEV2ZW50c1kBVGhlIGBSZXNlcnZlZGAgZXZlbnQgaXMgZW1pdHRlZCBpbiBjYXNlIG9mIHN1Y2Nlc3MsIHdoaWNoIHByb3ZpZGVzIHRoZSBJRCByZXNlcnZlZCBmb3IQdXNlLiBhZGRfbG9jawQBEHBhcmGxAgEYUGFyYUlkAAYUCQFBZGQgYSBtYW5hZ2VyIGxvY2sgZnJvbSBhIHBhcmEuIFRoaXMgd2lsbCBwcmV2ZW50IHRoZSBtYW5hZ2VyIG9mIGGIcGFyYSB0byBkZXJlZ2lzdGVyIG9yIHN3YXAgYSBwYXJhLgBJAUNhbiBiZSBjYWxsZWQgYnkgUm9vdCwgdGhlIHBhcmFjaGFpbiwgb3IgdGhlIHBhcmFjaGFpbiBtYW5hZ2VyIGlmIHRoZSBwYXJhY2hhaW4gaXMkdW5sb2NrZWQuVHNjaGVkdWxlX2NvZGVfdXBncmFkZQgBEHBhcmGxAgEYUGFyYUlkAAEgbmV3X2NvZGXdBQE4VmFsaWRhdGlvbkNvZGUAByx0U2NoZWR1bGUgYSBwYXJhY2hhaW4gdXBncmFkZS4AVQFUaGlzIHdpbGwga2ljayBvZmYgYSBjaGVjayBvZiBgbmV3X2NvZGVgIGJ5IGFsbCB2YWxpZGF0b3JzLiBBZnRlciB0aGUgbWFqb3JpdHkgb2YgdGhlVQF2YWxpZGF0b3JzIGhhdmUgcmVwb3J0ZWQgb24gdGhlIHZhbGlkaXR5IG9mIHRoZSBjb2RlLCB0aGUgY29kZSB3aWxsIGVpdGhlciBiZSBlbmFjdGVkVQFvciB0aGUgdXBncmFkZSB3aWxsIGJlIHJlamVjdGVkLiBJZiB0aGUgY29kZSB3aWxsIGJlIGVuYWN0ZWQsIHRoZSBjdXJyZW50IGNvZGUgb2YgdGhlXQFwYXJhY2hhaW4gd2lsbCBiZSBvdmVyd3JpdHRlbiBkaXJlY3RseS4gVGhpcyBtZWFucyB0aGF0IGFueSBQb1Ygd2lsbCBiZSBjaGVja2VkIGJ5IHRoaXNdAW5ldyBjb2RlLiBUaGUgcGFyYWNoYWluIGl0c2VsZiB3aWxsIG5vdCBiZSBpbmZvcm1lZCBleHBsaWNpdGx5IHRoYXQgdGhlIHZhbGlkYXRpb24gY29kZTBoYXMgY2hhbmdlZC4ASQFDYW4gYmUgY2FsbGVkIGJ5IFJvb3QsIHRoZSBwYXJhY2hhaW4sIG9yIHRoZSBwYXJhY2hhaW4gbWFuYWdlciBpZiB0aGUgcGFyYWNoYWluIGlzJHVubG9ja2VkLkBzZXRfY3VycmVudF9oZWFkCAEQcGFyYbECARhQYXJhSWQAASBuZXdfaGVhZOEFASBIZWFkRGF0YQAIEIRTZXQgdGhlIHBhcmFjaGFpbidzIGN1cnJlbnQgaGVhZC4ASQFDYW4gYmUgY2FsbGVkIGJ5IFJvb3QsIHRoZSBwYXJhY2hhaW4sIG9yIHRoZSBwYXJhY2hhaW4gbWFuYWdlciBpZiB0aGUgcGFyYWNoYWluIGlzJHVubG9ja2VkLgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy5BBhBccG9sa2Fkb3RfcnVudGltZV9jb21tb24Uc2xvdHMYcGFsbGV0EENhbGwEBFQAAQwsZm9yY2VfbGVhc2UUARBwYXJhsQIBGFBhcmFJZAABGGxlYXNlcgABMFQ6OkFjY291bnRJZAABGGFtb3VudBgBMEJhbGFuY2VPZjxUPgABMHBlcmlvZF9iZWdpbhABQExlYXNlUGVyaW9kT2Y8VD4AATBwZXJpb2RfY291bnQQAUBMZWFzZVBlcmlvZE9mPFQ+AAAQTQFKdXN0IGEgY29ubmVjdCBpbnRvIHRoZSBgbGVhc2Vfb3V0YCBjYWxsLCBpbiBjYXNlIFJvb3Qgd2FudHMgdG8gZm9yY2Ugc29tZSBsZWFzZSB0b/xoYXBwZW4gaW5kZXBlbmRlbnRseSBvZiBhbnkgb3RoZXIgb24tY2hhaW4gbWVjaGFuaXNtIHRvIHVzZSBpdC4A+FRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IG1hdGNoIGBUOjpGb3JjZU9yaWdpbmAuQGNsZWFyX2FsbF9sZWFzZXMEARBwYXJhsQIBGFBhcmFJZAABDE0BQ2xlYXIgYWxsIGxlYXNlcyBmb3IgYSBQYXJhIElkLCByZWZ1bmRpbmcgYW55IGRlcG9zaXRzIGJhY2sgdG8gdGhlIG9yaWdpbmFsIG93bmVycy4A+FRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IG1hdGNoIGBUOjpGb3JjZU9yaWdpbmAuPHRyaWdnZXJfb25ib2FyZAQBEHBhcmGxAgEYUGFyYUlkAAIcJQFUcnkgdG8gb25ib2FyZCBhIHBhcmFjaGFpbiB0aGF0IGhhcyBhIGxlYXNlIGZvciB0aGUgY3VycmVudCBsZWFzZSBwZXJpb2QuAEUBVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZnVsIGlmIHRoZXJlIHdhcyBzb21lIHN0YXRlIGlzc3VlIHdpdGggYSBwYXJhIHRoYXQgc2hvdWxkOQFoYXZlIG9uYm9hcmRlZCwgYnV0IHdhcyB1bmFibGUgdG8uIEFzIGxvbmcgYXMgdGhleSBoYXZlIGEgbGVhc2UgcGVyaW9kLCB3ZSBjYW5sbGV0IHRoZW0gb25ib2FyZCBmcm9tIGhlcmUuAMxPcmlnaW4gbXVzdCBiZSBzaWduZWQsIGJ1dCBjYW4gYmUgY2FsbGVkIGJ5IGFueW9uZS4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMuRQYQXHBvbGthZG90X3J1bnRpbWVfY29tbW9uSHBhcmFzX3N1ZG9fd3JhcHBlchhwYWxsZXQQQ2FsbAQEVAABGHRzdWRvX3NjaGVkdWxlX3BhcmFfaW5pdGlhbGl6ZQgBCGlksQIBGFBhcmFJZAABHGdlbmVzaXNJBgE8UGFyYUdlbmVzaXNBcmdzAAAUDQFTY2hlZHVsZSBhIHBhcmEgdG8gYmUgaW5pdGlhbGl6ZWQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBuZXh0IHNlc3Npb24uAE0BVGhpcyBzaG91bGQgb25seSBiZSB1c2VkIGZvciBURVNUSU5HIGFuZCBub3Qgb24gUFJPRFVDVElPTiBjaGFpbnMuIEl0IGF1dG9tYXRpY2FsbHlJAWFzc2lnbnMgQ29yZXRpbWUgdG8gdGhlIGNoYWluIGFuZCBpbmNyZWFzZXMgdGhlIG51bWJlciBvZiBjb3Jlcy4gVGh1cywgdGhlcmUgaXMgbm+AcnVubmluZyBjb3JldGltZSBjaGFpbiByZXF1aXJlZC5oc3Vkb19zY2hlZHVsZV9wYXJhX2NsZWFudXAEAQhpZLECARhQYXJhSWQAAQQJAVNjaGVkdWxlIGEgcGFyYSB0byBiZSBjbGVhbmVkIHVwIGF0IHRoZSBzdGFydCBvZiB0aGUgbmV4dCBzZXNzaW9uLoBzdWRvX3NjaGVkdWxlX3BhcmF0aHJlYWRfdXBncmFkZQQBCGlksQIBGFBhcmFJZAACBB0BVXBncmFkZSBhIHBhcmF0aHJlYWQgKG9uLWRlbWFuZCBwYXJhY2hhaW4pIHRvIGEgbGVhc2UgaG9sZGluZyBwYXJhY2hhaW6Ec3Vkb19zY2hlZHVsZV9wYXJhY2hhaW5fZG93bmdyYWRlBAEIaWSxAgEYUGFyYUlkAAME9ERvd25ncmFkZSBhIGxlYXNlIGhvbGRpbmcgcGFyYWNoYWluIHRvIGFuIG9uLWRlbWFuZCBwYXJhY2hhaW5cc3Vkb19xdWV1ZV9kb3dud2FyZF94Y20IAQhpZLECARhQYXJhSWQAAQx4Y21NBgF4Qm94PHhjbTo6b3BhcXVlOjpWZXJzaW9uZWRYY20+AAQQmFNlbmQgYSBkb3dud2FyZCBYQ00gdG8gdGhlIGdpdmVuIHBhcmEuAFEBVGhlIGdpdmVuIHBhcmFjaGFpbiBzaG91bGQgZXhpc3QgYW5kIHRoZSBwYXlsb2FkIHNob3VsZCBub3QgZXhjZWVkIHRoZSBwcmVjb25maWd1cmVkoHNpemUgYGNvbmZpZy5tYXhfZG93bndhcmRfbWVzc2FnZV9zaXplYC5sc3Vkb19lc3RhYmxpc2hfaHJtcF9jaGFubmVsEAEYc2VuZGVysQIBGFBhcmFJZAABJHJlY2lwaWVudLECARhQYXJhSWQAATBtYXhfY2FwYWNpdHkQAQx1MzIAAUBtYXhfbWVzc2FnZV9zaXplEAEMdTMyAAUQAQFGb3JjZWZ1bGx5IGVzdGFibGlzaCBhIGNoYW5uZWwgZnJvbSB0aGUgc2VuZGVyIHRvIHRoZSByZWNpcGllbnQuAFUBVGhpcyBpcyBlcXVpdmFsZW50IHRvIHNlbmRpbmcgYW4gYEhybXA6OmhybXBfaW5pdF9vcGVuX2NoYW5uZWxgIGV4dHJpbnNpYyBmb2xsb3dlZCBieYRgSHJtcDo6aHJtcF9hY2NlcHRfb3Blbl9jaGFubmVsYC4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMuSQYMbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucxRwYXJhczxQYXJhR2VuZXNpc0FyZ3MAAAwBMGdlbmVzaXNfaGVhZOEFASBIZWFkRGF0YQABPHZhbGlkYXRpb25fY29kZd0FAThWYWxpZGF0aW9uQ29kZQABJHBhcmFfa2luZCABIFBhcmFLaW5kAABNBggMeGNtMFZlcnNpb25lZFhjbQQsUnVudGltZUNhbGwAAQwIVjMEAFEGAVB2Mzo6WGNtPFJ1bnRpbWVDYWxsPgADAAhWNAQAuQYBUHY0OjpYY208UnVudGltZUNhbGw+AAQACFY1BAABBwFQdjU6OlhjbTxSdW50aW1lQ2FsbD4ABQAAUQYMDHhjbQh2MwxYY20EEENhbGwAAAQAVQYBWFZlYzxJbnN0cnVjdGlvbjxDYWxsPj4AAFUGAAACWQYAWQYMDHhjbQh2MyxJbnN0cnVjdGlvbgQQQ2FsbAABwDRXaXRoZHJhd0Fzc2V0BABdBgEsTXVsdGlBc3NldHMAAABUUmVzZXJ2ZUFzc2V0RGVwb3NpdGVkBABdBgEsTXVsdGlBc3NldHMAAQBYUmVjZWl2ZVRlbGVwb3J0ZWRBc3NldAQAXQYBLE11bHRpQXNzZXRzAAIANFF1ZXJ5UmVzcG9uc2UQASBxdWVyeV9pZCwBHFF1ZXJ5SWQAASByZXNwb25zZXEGASBSZXNwb25zZQABKG1heF93ZWlnaHQoARhXZWlnaHQAARxxdWVyaWVymQYBVE9wdGlvbjxNdWx0aUxvY2F0aW9uPgADADRUcmFuc2ZlckFzc2V0CAEYYXNzZXRzXQYBLE11bHRpQXNzZXRzAAEsYmVuZWZpY2lhcnkFBQE0TXVsdGlMb2NhdGlvbgAEAFBUcmFuc2ZlclJlc2VydmVBc3NldAwBGGFzc2V0c10GASxNdWx0aUFzc2V0cwABEGRlc3QFBQE0TXVsdGlMb2NhdGlvbgABDHhjbVEGARxYY208KCk+AAUAIFRyYW5zYWN0DAEsb3JpZ2luX2tpbmSdBgEoT3JpZ2luS2luZAABWHJlcXVpcmVfd2VpZ2h0X2F0X21vc3QoARhXZWlnaHQAARBjYWxsoQYBTERvdWJsZUVuY29kZWQ8Q2FsbD4ABgBkSHJtcE5ld0NoYW5uZWxPcGVuUmVxdWVzdAwBGHNlbmRlcskBAQx1MzIAAUBtYXhfbWVzc2FnZV9zaXplyQEBDHUzMgABMG1heF9jYXBhY2l0eckBAQx1MzIABwBMSHJtcENoYW5uZWxBY2NlcHRlZAQBJHJlY2lwaWVudMkBAQx1MzIACABISHJtcENoYW5uZWxDbG9zaW5nDAEkaW5pdGlhdG9yyQEBDHUzMgABGHNlbmRlcskBAQx1MzIAASRyZWNpcGllbnTJAQEMdTMyAAkALENsZWFyT3JpZ2luAAoANERlc2NlbmRPcmlnaW4EAAkFAVRJbnRlcmlvck11bHRpTG9jYXRpb24ACwAsUmVwb3J0RXJyb3IEAKUGAURRdWVyeVJlc3BvbnNlSW5mbwAMADBEZXBvc2l0QXNzZXQIARhhc3NldHOpBgFATXVsdGlBc3NldEZpbHRlcgABLGJlbmVmaWNpYXJ5BQUBNE11bHRpTG9jYXRpb24ADQBMRGVwb3NpdFJlc2VydmVBc3NldAwBGGFzc2V0c6kGAUBNdWx0aUFzc2V0RmlsdGVyAAEQZGVzdAUFATRNdWx0aUxvY2F0aW9uAAEMeGNtUQYBHFhjbTwoKT4ADgA0RXhjaGFuZ2VBc3NldAwBEGdpdmWpBgFATXVsdGlBc3NldEZpbHRlcgABEHdhbnRdBgEsTXVsdGlBc3NldHMAARxtYXhpbWFsIAEQYm9vbAAPAFxJbml0aWF0ZVJlc2VydmVXaXRoZHJhdwwBGGFzc2V0c6kGAUBNdWx0aUFzc2V0RmlsdGVyAAEccmVzZXJ2ZQUFATRNdWx0aUxvY2F0aW9uAAEMeGNtUQYBHFhjbTwoKT4AEABASW5pdGlhdGVUZWxlcG9ydAwBGGFzc2V0c6kGAUBNdWx0aUFzc2V0RmlsdGVyAAEQZGVzdAUFATRNdWx0aUxvY2F0aW9uAAEMeGNtUQYBHFhjbTwoKT4AEQA0UmVwb3J0SG9sZGluZwgBNHJlc3BvbnNlX2luZm+lBgFEUXVlcnlSZXNwb25zZUluZm8AARhhc3NldHOpBgFATXVsdGlBc3NldEZpbHRlcgASADBCdXlFeGVjdXRpb24IARBmZWVzZQYBKE11bHRpQXNzZXQAATB3ZWlnaHRfbGltaXS1BgEsV2VpZ2h0TGltaXQAEwA0UmVmdW5kU3VycGx1cwAUADxTZXRFcnJvckhhbmRsZXIEAFEGASRYY208Q2FsbD4AFQAsU2V0QXBwZW5kaXgEAFEGASRYY208Q2FsbD4AFgAoQ2xlYXJFcnJvcgAXAChDbGFpbUFzc2V0CAEYYXNzZXRzXQYBLE11bHRpQXNzZXRzAAEYdGlja2V0BQUBNE11bHRpTG9jYXRpb24AGAAQVHJhcAQALAEMdTY0ABkAQFN1YnNjcmliZVZlcnNpb24IASBxdWVyeV9pZCwBHFF1ZXJ5SWQAAUxtYXhfcmVzcG9uc2Vfd2VpZ2h0KAEYV2VpZ2h0ABoASFVuc3Vic2NyaWJlVmVyc2lvbgAbACRCdXJuQXNzZXQEAF0GASxNdWx0aUFzc2V0cwAcACxFeHBlY3RBc3NldAQAXQYBLE11bHRpQXNzZXRzAB0AMEV4cGVjdE9yaWdpbgQAmQYBVE9wdGlvbjxNdWx0aUxvY2F0aW9uPgAeACxFeHBlY3RFcnJvcgQAdQYBUE9wdGlvbjwodTMyLCBFcnJvcik+AB8AUEV4cGVjdFRyYW5zYWN0U3RhdHVzBACRBgE4TWF5YmVFcnJvckNvZGUAIAAsUXVlcnlQYWxsZXQIASxtb2R1bGVfbmFtZTgBHFZlYzx1OD4AATRyZXNwb25zZV9pbmZvpQYBRFF1ZXJ5UmVzcG9uc2VJbmZvACEAMEV4cGVjdFBhbGxldBQBFGluZGV4yQEBDHUzMgABEG5hbWU4ARxWZWM8dTg+AAEsbW9kdWxlX25hbWU4ARxWZWM8dTg+AAEsY3JhdGVfbWFqb3LJAQEMdTMyAAE8bWluX2NyYXRlX21pbm9yyQEBDHUzMgAiAFBSZXBvcnRUcmFuc2FjdFN0YXR1cwQApQYBRFF1ZXJ5UmVzcG9uc2VJbmZvACMATENsZWFyVHJhbnNhY3RTdGF0dXMAJAA8VW5pdmVyc2FsT3JpZ2luBAANBQEgSnVuY3Rpb24AJQA0RXhwb3J0TWVzc2FnZQwBHG5ldHdvcmsVBQEkTmV0d29ya0lkAAEsZGVzdGluYXRpb24JBQFUSW50ZXJpb3JNdWx0aUxvY2F0aW9uAAEMeGNtUQYBHFhjbTwoKT4AJgAkTG9ja0Fzc2V0CAEUYXNzZXRlBgEoTXVsdGlBc3NldAABIHVubG9ja2VyBQUBNE11bHRpTG9jYXRpb24AJwAsVW5sb2NrQXNzZXQIARRhc3NldGUGAShNdWx0aUFzc2V0AAEYdGFyZ2V0BQUBNE11bHRpTG9jYXRpb24AKAA4Tm90ZVVubG9ja2FibGUIARRhc3NldGUGAShNdWx0aUFzc2V0AAEUb3duZXIFBQE0TXVsdGlMb2NhdGlvbgApADRSZXF1ZXN0VW5sb2NrCAEUYXNzZXRlBgEoTXVsdGlBc3NldAABGGxvY2tlcgUFATRNdWx0aUxvY2F0aW9uACoALFNldEZlZXNNb2RlBAEwaml0X3dpdGhkcmF3IAEQYm9vbAArACBTZXRUb3BpYwQABAEgW3U4OyAzMl0ALAAoQ2xlYXJUb3BpYwAtACxBbGlhc09yaWdpbgQABQUBNE11bHRpTG9jYXRpb24ALgA8VW5wYWlkRXhlY3V0aW9uCAEwd2VpZ2h0X2xpbWl0tQYBLFdlaWdodExpbWl0AAEwY2hlY2tfb3JpZ2lumQYBVE9wdGlvbjxNdWx0aUxvY2F0aW9uPgAvAABdBhAMeGNtCHYzKG11bHRpYXNzZXQsTXVsdGlBc3NldHMAAAQAYQYBPFZlYzxNdWx0aUFzc2V0PgAAYQYAAAJlBgBlBhAMeGNtCHYzKG11bHRpYXNzZXQoTXVsdGlBc3NldAAACAEIaWQZBQEcQXNzZXRJZAABDGZ1bmkGASxGdW5naWJpbGl0eQAAaQYQDHhjbQh2MyhtdWx0aWFzc2V0LEZ1bmdpYmlsaXR5AAEIIEZ1bmdpYmxlBAD9AQEQdTEyOAAAACxOb25GdW5naWJsZQQAbQYBNEFzc2V0SW5zdGFuY2UAAQAAbQYQDHhjbQh2MyhtdWx0aWFzc2V0NEFzc2V0SW5zdGFuY2UAARgkVW5kZWZpbmVkAAAAFEluZGV4BAD9AQEQdTEyOAABABhBcnJheTQEAEgBHFt1ODsgNF0AAgAYQXJyYXk4BAAlAwEcW3U4OyA4XQADABxBcnJheTE2BACwASBbdTg7IDE2XQAEABxBcnJheTMyBAAEASBbdTg7IDMyXQAFAABxBgwMeGNtCHYzIFJlc3BvbnNlAAEYEE51bGwAAAAYQXNzZXRzBABdBgEsTXVsdGlBc3NldHMAAQA8RXhlY3V0aW9uUmVzdWx0BAB1BgFQT3B0aW9uPCh1MzIsIEVycm9yKT4AAgAcVmVyc2lvbgQAEAE4c3VwZXI6OlZlcnNpb24AAwAsUGFsbGV0c0luZm8EAIEGAZhCb3VuZGVkVmVjPFBhbGxldEluZm8sIE1heFBhbGxldHNJbmZvPgAEADhEaXNwYXRjaFJlc3VsdAQAkQYBOE1heWJlRXJyb3JDb2RlAAUAAHUGBBhPcHRpb24EBFQBeQYBCBBOb25lAAAAEFNvbWUEAHkGAAABAAB5BgAABAgQfQYAfQYQDHhjbQh2Mxh0cmFpdHMURXJyb3IAAaAgT3ZlcmZsb3cAAAA0VW5pbXBsZW1lbnRlZAABAGBVbnRydXN0ZWRSZXNlcnZlTG9jYXRpb24AAgBkVW50cnVzdGVkVGVsZXBvcnRMb2NhdGlvbgADADBMb2NhdGlvbkZ1bGwABABUTG9jYXRpb25Ob3RJbnZlcnRpYmxlAAUAJEJhZE9yaWdpbgAGADxJbnZhbGlkTG9jYXRpb24ABwA0QXNzZXROb3RGb3VuZAAIAFRGYWlsZWRUb1RyYW5zYWN0QXNzZXQACQA8Tm90V2l0aGRyYXdhYmxlAAoASExvY2F0aW9uQ2Fubm90SG9sZAALAFRFeGNlZWRzTWF4TWVzc2FnZVNpemUADABYRGVzdGluYXRpb25VbnN1cHBvcnRlZAANACRUcmFuc3BvcnQADgAoVW5yb3V0YWJsZQAPADBVbmtub3duQ2xhaW0AEAA4RmFpbGVkVG9EZWNvZGUAEQBATWF4V2VpZ2h0SW52YWxpZAASADhOb3RIb2xkaW5nRmVlcwATADBUb29FeHBlbnNpdmUAFAAQVHJhcAQAMAEMdTY0ABUAQEV4cGVjdGF0aW9uRmFsc2UAFgA4UGFsbGV0Tm90Rm91bmQAFwAwTmFtZU1pc21hdGNoABgATFZlcnNpb25JbmNvbXBhdGlibGUAGQBQSG9sZGluZ1dvdWxkT3ZlcmZsb3cAGgAsRXhwb3J0RXJyb3IAGwA4UmVhbmNob3JGYWlsZWQAHAAYTm9EZWFsAB0AKEZlZXNOb3RNZXQAHgAkTG9ja0Vycm9yAB8AME5vUGVybWlzc2lvbgAgAChVbmFuY2hvcmVkACEAOE5vdERlcG9zaXRhYmxlACIATFVuaGFuZGxlZFhjbVZlcnNpb24AIwBIV2VpZ2h0TGltaXRSZWFjaGVkBAAoARhXZWlnaHQAJAAcQmFycmllcgAlAExXZWlnaHROb3RDb21wdXRhYmxlACYAREV4Y2VlZHNTdGFja0xpbWl0ACcAAIEGDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBhQYEUwAABACNBgEYVmVjPFQ+AACFBgwMeGNtCHYzKFBhbGxldEluZm8AABgBFGluZGV4yQEBDHUzMgABEG5hbWWJBgGAQm91bmRlZFZlYzx1OCwgTWF4UGFsbGV0TmFtZUxlbj4AASxtb2R1bGVfbmFtZYkGAYBCb3VuZGVkVmVjPHU4LCBNYXhQYWxsZXROYW1lTGVuPgABFG1ham9yyQEBDHUzMgABFG1pbm9yyQEBDHUzMgABFHBhdGNoyQEBDHUzMgAAiQYMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAEIBFMAAAQAOAEYVmVjPFQ+AACNBgAAAoUGAJEGDAx4Y20IdjM4TWF5YmVFcnJvckNvZGUAAQwcU3VjY2VzcwAAABRFcnJvcgQAlQYBjEJvdW5kZWRWZWM8dTgsIE1heERpc3BhdGNoRXJyb3JMZW4+AAEAOFRydW5jYXRlZEVycm9yBACVBgGMQm91bmRlZFZlYzx1OCwgTWF4RGlzcGF0Y2hFcnJvckxlbj4AAgAAlQYMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAEIBFMAAAQAOAEYVmVjPFQ+AACZBgQYT3B0aW9uBARUAQUFAQgQTm9uZQAAABBTb21lBAAFBQAAAQAAnQYMDHhjbQh2MyhPcmlnaW5LaW5kAAEQGE5hdGl2ZQAAAEBTb3ZlcmVpZ25BY2NvdW50AAEAJFN1cGVydXNlcgACAAxYY20AAwAAoQYMDHhjbThkb3VibGVfZW5jb2RlZDREb3VibGVFbmNvZGVkBARUAAAEARxlbmNvZGVkOAEcVmVjPHU4PgAApQYMDHhjbQh2M0RRdWVyeVJlc3BvbnNlSW5mbwAADAEsZGVzdGluYXRpb24FBQE0TXVsdGlMb2NhdGlvbgABIHF1ZXJ5X2lkLAEcUXVlcnlJZAABKG1heF93ZWlnaHQoARhXZWlnaHQAAKkGEAx4Y20IdjMobXVsdGlhc3NldEBNdWx0aUFzc2V0RmlsdGVyAAEIIERlZmluaXRlBABdBgEsTXVsdGlBc3NldHMAAAAQV2lsZAQArQYBOFdpbGRNdWx0aUFzc2V0AAEAAK0GEAx4Y20IdjMobXVsdGlhc3NldDhXaWxkTXVsdGlBc3NldAABEAxBbGwAAAAUQWxsT2YIAQhpZBkFARxBc3NldElkAAEMZnVusQYBPFdpbGRGdW5naWJpbGl0eQABAChBbGxDb3VudGVkBADJAQEMdTMyAAIAMEFsbE9mQ291bnRlZAwBCGlkGQUBHEFzc2V0SWQAAQxmdW6xBgE8V2lsZEZ1bmdpYmlsaXR5AAEUY291bnTJAQEMdTMyAAMAALEGEAx4Y20IdjMobXVsdGlhc3NldDxXaWxkRnVuZ2liaWxpdHkAAQggRnVuZ2libGUAAAAsTm9uRnVuZ2libGUAAQAAtQYMDHhjbQh2MyxXZWlnaHRMaW1pdAABCCRVbmxpbWl0ZWQAAAAcTGltaXRlZAQAKAEYV2VpZ2h0AAEAALkGDCxzdGFnaW5nX3hjbQh2NAxYY20EEENhbGwAAAQAvQYBWFZlYzxJbnN0cnVjdGlvbjxDYWxsPj4AAL0GAAACwQYAwQYMLHN0YWdpbmdfeGNtCHY0LEluc3RydWN0aW9uBBBDYWxsAAHANFdpdGhkcmF3QXNzZXQEAMUGARhBc3NldHMAAABUUmVzZXJ2ZUFzc2V0RGVwb3NpdGVkBADFBgEYQXNzZXRzAAEAWFJlY2VpdmVUZWxlcG9ydGVkQXNzZXQEAMUGARhBc3NldHMAAgA0UXVlcnlSZXNwb25zZRABIHF1ZXJ5X2lkLAEcUXVlcnlJZAABIHJlc3BvbnNl2QYBIFJlc3BvbnNlAAEobWF4X3dlaWdodCgBGFdlaWdodAABHHF1ZXJpZXLtBgFAT3B0aW9uPExvY2F0aW9uPgADADRUcmFuc2ZlckFzc2V0CAEYYXNzZXRzxQYBGEFzc2V0cwABLGJlbmVmaWNpYXJ5HQUBIExvY2F0aW9uAAQAUFRyYW5zZmVyUmVzZXJ2ZUFzc2V0DAEYYXNzZXRzxQYBGEFzc2V0cwABEGRlc3QdBQEgTG9jYXRpb24AAQx4Y225BgEcWGNtPCgpPgAFACBUcmFuc2FjdAwBLG9yaWdpbl9raW5knQYBKE9yaWdpbktpbmQAAVhyZXF1aXJlX3dlaWdodF9hdF9tb3N0KAEYV2VpZ2h0AAEQY2FsbKEGAUxEb3VibGVFbmNvZGVkPENhbGw+AAYAZEhybXBOZXdDaGFubmVsT3BlblJlcXVlc3QMARhzZW5kZXLJAQEMdTMyAAFAbWF4X21lc3NhZ2Vfc2l6ZckBAQx1MzIAATBtYXhfY2FwYWNpdHnJAQEMdTMyAAcATEhybXBDaGFubmVsQWNjZXB0ZWQEASRyZWNpcGllbnTJAQEMdTMyAAgASEhybXBDaGFubmVsQ2xvc2luZwwBJGluaXRpYXRvcskBAQx1MzIAARhzZW5kZXLJAQEMdTMyAAEkcmVjaXBpZW50yQEBDHUzMgAJACxDbGVhck9yaWdpbgAKADREZXNjZW5kT3JpZ2luBAAhBQFASW50ZXJpb3JMb2NhdGlvbgALACxSZXBvcnRFcnJvcgQA8QYBRFF1ZXJ5UmVzcG9uc2VJbmZvAAwAMERlcG9zaXRBc3NldAgBGGFzc2V0c/UGASxBc3NldEZpbHRlcgABLGJlbmVmaWNpYXJ5HQUBIExvY2F0aW9uAA0ATERlcG9zaXRSZXNlcnZlQXNzZXQMARhhc3NldHP1BgEsQXNzZXRGaWx0ZXIAARBkZXN0HQUBIExvY2F0aW9uAAEMeGNtuQYBHFhjbTwoKT4ADgA0RXhjaGFuZ2VBc3NldAwBEGdpdmX1BgEsQXNzZXRGaWx0ZXIAARB3YW50xQYBGEFzc2V0cwABHG1heGltYWwgARBib29sAA8AXEluaXRpYXRlUmVzZXJ2ZVdpdGhkcmF3DAEYYXNzZXRz9QYBLEFzc2V0RmlsdGVyAAEccmVzZXJ2ZR0FASBMb2NhdGlvbgABDHhjbbkGARxYY208KCk+ABAAQEluaXRpYXRlVGVsZXBvcnQMARhhc3NldHP1BgEsQXNzZXRGaWx0ZXIAARBkZXN0HQUBIExvY2F0aW9uAAEMeGNtuQYBHFhjbTwoKT4AEQA0UmVwb3J0SG9sZGluZwgBNHJlc3BvbnNlX2luZm/xBgFEUXVlcnlSZXNwb25zZUluZm8AARhhc3NldHP1BgEsQXNzZXRGaWx0ZXIAEgAwQnV5RXhlY3V0aW9uCAEQZmVlc80GARRBc3NldAABMHdlaWdodF9saW1pdLUGASxXZWlnaHRMaW1pdAATADRSZWZ1bmRTdXJwbHVzABQAPFNldEVycm9ySGFuZGxlcgQAuQYBJFhjbTxDYWxsPgAVACxTZXRBcHBlbmRpeAQAuQYBJFhjbTxDYWxsPgAWAChDbGVhckVycm9yABcAKENsYWltQXNzZXQIARhhc3NldHPFBgEYQXNzZXRzAAEYdGlja2V0HQUBIExvY2F0aW9uABgAEFRyYXAEACwBDHU2NAAZAEBTdWJzY3JpYmVWZXJzaW9uCAEgcXVlcnlfaWQsARxRdWVyeUlkAAFMbWF4X3Jlc3BvbnNlX3dlaWdodCgBGFdlaWdodAAaAEhVbnN1YnNjcmliZVZlcnNpb24AGwAkQnVybkFzc2V0BADFBgEYQXNzZXRzABwALEV4cGVjdEFzc2V0BADFBgEYQXNzZXRzAB0AMEV4cGVjdE9yaWdpbgQA7QYBQE9wdGlvbjxMb2NhdGlvbj4AHgAsRXhwZWN0RXJyb3IEAHUGAVBPcHRpb248KHUzMiwgRXJyb3IpPgAfAFBFeHBlY3RUcmFuc2FjdFN0YXR1cwQAkQYBOE1heWJlRXJyb3JDb2RlACAALFF1ZXJ5UGFsbGV0CAEsbW9kdWxlX25hbWU4ARxWZWM8dTg+AAE0cmVzcG9uc2VfaW5mb/EGAURRdWVyeVJlc3BvbnNlSW5mbwAhADBFeHBlY3RQYWxsZXQUARRpbmRleMkBAQx1MzIAARBuYW1lOAEcVmVjPHU4PgABLG1vZHVsZV9uYW1lOAEcVmVjPHU4PgABLGNyYXRlX21ham9yyQEBDHUzMgABPG1pbl9jcmF0ZV9taW5vcskBAQx1MzIAIgBQUmVwb3J0VHJhbnNhY3RTdGF0dXMEAPEGAURRdWVyeVJlc3BvbnNlSW5mbwAjAExDbGVhclRyYW5zYWN0U3RhdHVzACQAPFVuaXZlcnNhbE9yaWdpbgQAKQUBIEp1bmN0aW9uACUANEV4cG9ydE1lc3NhZ2UMARxuZXR3b3JrMQUBJE5ldHdvcmtJZAABLGRlc3RpbmF0aW9uIQUBQEludGVyaW9yTG9jYXRpb24AAQx4Y225BgEcWGNtPCgpPgAmACRMb2NrQXNzZXQIARRhc3NldM0GARRBc3NldAABIHVubG9ja2VyHQUBIExvY2F0aW9uACcALFVubG9ja0Fzc2V0CAEUYXNzZXTNBgEUQXNzZXQAARh0YXJnZXQdBQEgTG9jYXRpb24AKAA4Tm90ZVVubG9ja2FibGUIARRhc3NldM0GARRBc3NldAABFG93bmVyHQUBIExvY2F0aW9uACkANFJlcXVlc3RVbmxvY2sIARRhc3NldM0GARRBc3NldAABGGxvY2tlch0FASBMb2NhdGlvbgAqACxTZXRGZWVzTW9kZQQBMGppdF93aXRoZHJhdyABEGJvb2wAKwAgU2V0VG9waWMEAAQBIFt1ODsgMzJdACwAKENsZWFyVG9waWMALQAsQWxpYXNPcmlnaW4EAB0FASBMb2NhdGlvbgAuADxVbnBhaWRFeGVjdXRpb24IATB3ZWlnaHRfbGltaXS1BgEsV2VpZ2h0TGltaXQAATBjaGVja19vcmlnaW7tBgFAT3B0aW9uPExvY2F0aW9uPgAvAADFBhAsc3RhZ2luZ194Y20IdjQUYXNzZXQYQXNzZXRzAAAEAMkGAShWZWM8QXNzZXQ+AADJBgAAAs0GAM0GECxzdGFnaW5nX3hjbQh2NBRhc3NldBRBc3NldAAACAEIaWRRBQEcQXNzZXRJZAABDGZ1btEGASxGdW5naWJpbGl0eQAA0QYQLHN0YWdpbmdfeGNtCHY0FGFzc2V0LEZ1bmdpYmlsaXR5AAEIIEZ1bmdpYmxlBAD9AQEQdTEyOAAAACxOb25GdW5naWJsZQQA1QYBNEFzc2V0SW5zdGFuY2UAAQAA1QYQLHN0YWdpbmdfeGNtCHY0FGFzc2V0NEFzc2V0SW5zdGFuY2UAARgkVW5kZWZpbmVkAAAAFEluZGV4BAD9AQEQdTEyOAABABhBcnJheTQEAEgBHFt1ODsgNF0AAgAYQXJyYXk4BAAlAwEcW3U4OyA4XQADABxBcnJheTE2BACwASBbdTg7IDE2XQAEABxBcnJheTMyBAAEASBbdTg7IDMyXQAFAADZBgwsc3RhZ2luZ194Y20IdjQgUmVzcG9uc2UAARgQTnVsbAAAABhBc3NldHMEAMUGARhBc3NldHMAAQA8RXhlY3V0aW9uUmVzdWx0BAB1BgFQT3B0aW9uPCh1MzIsIEVycm9yKT4AAgAcVmVyc2lvbgQAEAE4c3VwZXI6OlZlcnNpb24AAwAsUGFsbGV0c0luZm8EAN0GAZhCb3VuZGVkVmVjPFBhbGxldEluZm8sIE1heFBhbGxldHNJbmZvPgAEADhEaXNwYXRjaFJlc3VsdAQAkQYBOE1heWJlRXJyb3JDb2RlAAUAAN0GDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQB4QYEUwAABADpBgEYVmVjPFQ+AADhBgwsc3RhZ2luZ194Y20IdjQoUGFsbGV0SW5mbwAAGAEUaW5kZXjJAQEMdTMyAAEQbmFtZeUGAYBCb3VuZGVkVmVjPHU4LCBNYXhQYWxsZXROYW1lTGVuPgABLG1vZHVsZV9uYW1l5QYBgEJvdW5kZWRWZWM8dTgsIE1heFBhbGxldE5hbWVMZW4+AAEUbWFqb3LJAQEMdTMyAAEUbWlub3LJAQEMdTMyAAEUcGF0Y2jJAQEMdTMyAADlBgxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAQgEUwAABAA4ARhWZWM8VD4AAOkGAAAC4QYA7QYEGE9wdGlvbgQEVAEdBQEIEE5vbmUAAAAQU29tZQQAHQUAAAEAAPEGDCxzdGFnaW5nX3hjbQh2NERRdWVyeVJlc3BvbnNlSW5mbwAADAEsZGVzdGluYXRpb24dBQEgTG9jYXRpb24AASBxdWVyeV9pZCwBHFF1ZXJ5SWQAAShtYXhfd2VpZ2h0KAEYV2VpZ2h0AAD1BhAsc3RhZ2luZ194Y20IdjQUYXNzZXQsQXNzZXRGaWx0ZXIAAQggRGVmaW5pdGUEAMUGARhBc3NldHMAAAAQV2lsZAQA+QYBJFdpbGRBc3NldAABAAD5BhAsc3RhZ2luZ194Y20IdjQUYXNzZXQkV2lsZEFzc2V0AAEQDEFsbAAAABRBbGxPZggBCGlkUQUBHEFzc2V0SWQAAQxmdW79BgE8V2lsZEZ1bmdpYmlsaXR5AAEAKEFsbENvdW50ZWQEAMkBAQx1MzIAAgAwQWxsT2ZDb3VudGVkDAEIaWRRBQEcQXNzZXRJZAABDGZ1bv0GATxXaWxkRnVuZ2liaWxpdHkAARRjb3VudMkBAQx1MzIAAwAA/QYQLHN0YWdpbmdfeGNtCHY0FGFzc2V0PFdpbGRGdW5naWJpbGl0eQABCCBGdW5naWJsZQAAACxOb25GdW5naWJsZQABAAABBwwsc3RhZ2luZ194Y20IdjUMWGNtBBBDYWxsAAAEAAUHAVhWZWM8SW5zdHJ1Y3Rpb248Q2FsbD4+AAAFBwAAAgkHAAkHDCxzdGFnaW5nX3hjbQh2NSxJbnN0cnVjdGlvbgQQQ2FsbAAB0DRXaXRoZHJhd0Fzc2V0BAANBwEYQXNzZXRzAAAAVFJlc2VydmVBc3NldERlcG9zaXRlZAQADQcBGEFzc2V0cwABAFhSZWNlaXZlVGVsZXBvcnRlZEFzc2V0BAANBwEYQXNzZXRzAAIANFF1ZXJ5UmVzcG9uc2UQASBxdWVyeV9pZCwBHFF1ZXJ5SWQAASByZXNwb25zZSEHASBSZXNwb25zZQABKG1heF93ZWlnaHQoARhXZWlnaHQAARxxdWVyaWVyQQcBQE9wdGlvbjxMb2NhdGlvbj4AAwA0VHJhbnNmZXJBc3NldAgBGGFzc2V0cw0HARhBc3NldHMAASxiZW5lZmljaWFyebkCASBMb2NhdGlvbgAEAFBUcmFuc2ZlclJlc2VydmVBc3NldAwBGGFzc2V0cw0HARhBc3NldHMAARBkZXN0uQIBIExvY2F0aW9uAAEMeGNtAQcBHFhjbTwoKT4ABQAgVHJhbnNhY3QMASxvcmlnaW5fa2luZJ0GAShPcmlnaW5LaW5kAAFMZmFsbGJhY2tfbWF4X3dlaWdodEUHAThPcHRpb248V2VpZ2h0PgABEGNhbGyhBgFMRG91YmxlRW5jb2RlZDxDYWxsPgAGAGRIcm1wTmV3Q2hhbm5lbE9wZW5SZXF1ZXN0DAEYc2VuZGVyyQEBDHUzMgABQG1heF9tZXNzYWdlX3NpemXJAQEMdTMyAAEwbWF4X2NhcGFjaXR5yQEBDHUzMgAHAExIcm1wQ2hhbm5lbEFjY2VwdGVkBAEkcmVjaXBpZW50yQEBDHUzMgAIAEhIcm1wQ2hhbm5lbENsb3NpbmcMASRpbml0aWF0b3LJAQEMdTMyAAEYc2VuZGVyyQEBDHUzMgABJHJlY2lwaWVudMkBAQx1MzIACQAsQ2xlYXJPcmlnaW4ACgA0RGVzY2VuZE9yaWdpbgQAvQIBQEludGVyaW9yTG9jYXRpb24ACwAsUmVwb3J0RXJyb3IEAEkHAURRdWVyeVJlc3BvbnNlSW5mbwAMADBEZXBvc2l0QXNzZXQIARhhc3NldHNNBwEsQXNzZXRGaWx0ZXIAASxiZW5lZmljaWFyebkCASBMb2NhdGlvbgANAExEZXBvc2l0UmVzZXJ2ZUFzc2V0DAEYYXNzZXRzTQcBLEFzc2V0RmlsdGVyAAEQZGVzdLkCASBMb2NhdGlvbgABDHhjbQEHARxYY208KCk+AA4ANEV4Y2hhbmdlQXNzZXQMARBnaXZlTQcBLEFzc2V0RmlsdGVyAAEQd2FudA0HARhBc3NldHMAARxtYXhpbWFsIAEQYm9vbAAPAFxJbml0aWF0ZVJlc2VydmVXaXRoZHJhdwwBGGFzc2V0c00HASxBc3NldEZpbHRlcgABHHJlc2VydmW5AgEgTG9jYXRpb24AAQx4Y20BBwEcWGNtPCgpPgAQAEBJbml0aWF0ZVRlbGVwb3J0DAEYYXNzZXRzTQcBLEFzc2V0RmlsdGVyAAEQZGVzdLkCASBMb2NhdGlvbgABDHhjbQEHARxYY208KCk+ABEANFJlcG9ydEhvbGRpbmcIATRyZXNwb25zZV9pbmZvSQcBRFF1ZXJ5UmVzcG9uc2VJbmZvAAEYYXNzZXRzTQcBLEFzc2V0RmlsdGVyABIAMEJ1eUV4ZWN1dGlvbggBEGZlZXMVBwEUQXNzZXQAATB3ZWlnaHRfbGltaXS1BgEsV2VpZ2h0TGltaXQAEwA0UmVmdW5kU3VycGx1cwAUADxTZXRFcnJvckhhbmRsZXIEAAEHASRYY208Q2FsbD4AFQAsU2V0QXBwZW5kaXgEAAEHASRYY208Q2FsbD4AFgAoQ2xlYXJFcnJvcgAXAChDbGFpbUFzc2V0CAEYYXNzZXRzDQcBGEFzc2V0cwABGHRpY2tldLkCASBMb2NhdGlvbgAYABBUcmFwBAAsAQx1NjQAGQBAU3Vic2NyaWJlVmVyc2lvbggBIHF1ZXJ5X2lkLAEcUXVlcnlJZAABTG1heF9yZXNwb25zZV93ZWlnaHQoARhXZWlnaHQAGgBIVW5zdWJzY3JpYmVWZXJzaW9uABsAJEJ1cm5Bc3NldAQADQcBGEFzc2V0cwAcACxFeHBlY3RBc3NldAQADQcBGEFzc2V0cwAdADBFeHBlY3RPcmlnaW4EAEEHAUBPcHRpb248TG9jYXRpb24+AB4ALEV4cGVjdEVycm9yBAAlBwFQT3B0aW9uPCh1MzIsIEVycm9yKT4AHwBQRXhwZWN0VHJhbnNhY3RTdGF0dXMEAJEGAThNYXliZUVycm9yQ29kZQAgACxRdWVyeVBhbGxldAgBLG1vZHVsZV9uYW1lOAEcVmVjPHU4PgABNHJlc3BvbnNlX2luZm9JBwFEUXVlcnlSZXNwb25zZUluZm8AIQAwRXhwZWN0UGFsbGV0FAEUaW5kZXjJAQEMdTMyAAEQbmFtZTgBHFZlYzx1OD4AASxtb2R1bGVfbmFtZTgBHFZlYzx1OD4AASxjcmF0ZV9tYWpvcskBAQx1MzIAATxtaW5fY3JhdGVfbWlub3LJAQEMdTMyACIAUFJlcG9ydFRyYW5zYWN0U3RhdHVzBABJBwFEUXVlcnlSZXNwb25zZUluZm8AIwBMQ2xlYXJUcmFuc2FjdFN0YXR1cwAkADxVbml2ZXJzYWxPcmlnaW4EAMUCASBKdW5jdGlvbgAlADRFeHBvcnRNZXNzYWdlDAEcbmV0d29ya80CASROZXR3b3JrSWQAASxkZXN0aW5hdGlvbr0CAUBJbnRlcmlvckxvY2F0aW9uAAEMeGNtAQcBHFhjbTwoKT4AJgAkTG9ja0Fzc2V0CAEUYXNzZXQVBwEUQXNzZXQAASB1bmxvY2tlcrkCASBMb2NhdGlvbgAnACxVbmxvY2tBc3NldAgBFGFzc2V0FQcBFEFzc2V0AAEYdGFyZ2V0uQIBIExvY2F0aW9uACgAOE5vdGVVbmxvY2thYmxlCAEUYXNzZXQVBwEUQXNzZXQAARRvd25lcrkCASBMb2NhdGlvbgApADRSZXF1ZXN0VW5sb2NrCAEUYXNzZXQVBwEUQXNzZXQAARhsb2NrZXK5AgEgTG9jYXRpb24AKgAsU2V0RmVlc01vZGUEATBqaXRfd2l0aGRyYXcgARBib29sACsAIFNldFRvcGljBAAEASBbdTg7IDMyXQAsAChDbGVhclRvcGljAC0ALEFsaWFzT3JpZ2luBAC5AgEgTG9jYXRpb24ALgA8VW5wYWlkRXhlY3V0aW9uCAEwd2VpZ2h0X2xpbWl0tQYBLFdlaWdodExpbWl0AAEwY2hlY2tfb3JpZ2luQQcBQE9wdGlvbjxMb2NhdGlvbj4ALwAcUGF5RmVlcwQBFGFzc2V0FQcBFEFzc2V0ADAAQEluaXRpYXRlVHJhbnNmZXIUASxkZXN0aW5hdGlvbrkCASBMb2NhdGlvbgABLHJlbW90ZV9mZWVzWQcBbE9wdGlvbjxBc3NldFRyYW5zZmVyRmlsdGVyPgABPHByZXNlcnZlX29yaWdpbiABEGJvb2wAARhhc3NldHNhBwHgQm91bmRlZFZlYzxBc3NldFRyYW5zZmVyRmlsdGVyLCBNYXhBc3NldFRyYW5zZmVyRmlsdGVycz4AAShyZW1vdGVfeGNtAQcBHFhjbTwoKT4AMQBERXhlY3V0ZVdpdGhPcmlnaW4IAURkZXNjZW5kYW50X29yaWdpbmkHAWBPcHRpb248SW50ZXJpb3JMb2NhdGlvbj4AAQx4Y20BBwEkWGNtPENhbGw+ADIAIFNldEhpbnRzBAEUaGludHNtBwGEQm91bmRlZFZlYzxIaW50LCBIaW50TnVtVmFyaWFudHM+ADMAAA0HECxzdGFnaW5nX3hjbQh2NRRhc3NldBhBc3NldHMAAAQAEQcBKFZlYzxBc3NldD4AABEHAAACFQcAFQcQLHN0YWdpbmdfeGNtCHY1FGFzc2V0FEFzc2V0AAAIAQhpZFUFARxBc3NldElkAAEMZnVuGQcBLEZ1bmdpYmlsaXR5AAAZBxAsc3RhZ2luZ194Y20IdjUUYXNzZXQsRnVuZ2liaWxpdHkAAQggRnVuZ2libGUEAP0BARB1MTI4AAAALE5vbkZ1bmdpYmxlBAAdBwE0QXNzZXRJbnN0YW5jZQABAAAdBxAsc3RhZ2luZ194Y20IdjUUYXNzZXQ0QXNzZXRJbnN0YW5jZQABGCRVbmRlZmluZWQAAAAUSW5kZXgEAP0BARB1MTI4AAEAGEFycmF5NAQASAEcW3U4OyA0XQACABhBcnJheTgEACUDARxbdTg7IDhdAAMAHEFycmF5MTYEALABIFt1ODsgMTZdAAQAHEFycmF5MzIEAAQBIFt1ODsgMzJdAAUAACEHDCxzdGFnaW5nX3hjbQh2NSBSZXNwb25zZQABGBBOdWxsAAAAGEFzc2V0cwQADQcBGEFzc2V0cwABADxFeGVjdXRpb25SZXN1bHQEACUHAVBPcHRpb248KHUzMiwgRXJyb3IpPgACABxWZXJzaW9uBAAQAThzdXBlcjo6VmVyc2lvbgADACxQYWxsZXRzSW5mbwQAMQcBmEJvdW5kZWRWZWM8UGFsbGV0SW5mbywgTWF4UGFsbGV0c0luZm8+AAQAOERpc3BhdGNoUmVzdWx0BACRBgE4TWF5YmVFcnJvckNvZGUABQAAJQcEGE9wdGlvbgQEVAEpBwEIEE5vbmUAAAAQU29tZQQAKQcAAAEAACkHAAAECBAtBwAtBxAMeGNtCHY1GHRyYWl0cxRFcnJvcgABpCBPdmVyZmxvdwAAADRVbmltcGxlbWVudGVkAAEAYFVudHJ1c3RlZFJlc2VydmVMb2NhdGlvbgACAGRVbnRydXN0ZWRUZWxlcG9ydExvY2F0aW9uAAMAMExvY2F0aW9uRnVsbAAEAFRMb2NhdGlvbk5vdEludmVydGlibGUABQAkQmFkT3JpZ2luAAYAPEludmFsaWRMb2NhdGlvbgAHADRBc3NldE5vdEZvdW5kAAgAVEZhaWxlZFRvVHJhbnNhY3RBc3NldAAJADxOb3RXaXRoZHJhd2FibGUACgBITG9jYXRpb25DYW5ub3RIb2xkAAsAVEV4Y2VlZHNNYXhNZXNzYWdlU2l6ZQAMAFhEZXN0aW5hdGlvblVuc3VwcG9ydGVkAA0AJFRyYW5zcG9ydAAOAChVbnJvdXRhYmxlAA8AMFVua25vd25DbGFpbQAQADhGYWlsZWRUb0RlY29kZQARAEBNYXhXZWlnaHRJbnZhbGlkABIAOE5vdEhvbGRpbmdGZWVzABMAMFRvb0V4cGVuc2l2ZQAUABBUcmFwBAAwAQx1NjQAFQBARXhwZWN0YXRpb25GYWxzZQAWADhQYWxsZXROb3RGb3VuZAAXADBOYW1lTWlzbWF0Y2gAGABMVmVyc2lvbkluY29tcGF0aWJsZQAZAFBIb2xkaW5nV291bGRPdmVyZmxvdwAaACxFeHBvcnRFcnJvcgAbADhSZWFuY2hvckZhaWxlZAAcABhOb0RlYWwAHQAoRmVlc05vdE1ldAAeACRMb2NrRXJyb3IAHwAwTm9QZXJtaXNzaW9uACAAKFVuYW5jaG9yZWQAIQA4Tm90RGVwb3NpdGFibGUAIgA0VG9vTWFueUFzc2V0cwAjAExVbmhhbmRsZWRYY21WZXJzaW9uACQASFdlaWdodExpbWl0UmVhY2hlZAQAKAEYV2VpZ2h0ACUAHEJhcnJpZXIAJgBMV2VpZ2h0Tm90Q29tcHV0YWJsZQAnAERFeGNlZWRzU3RhY2tMaW1pdAAoAAAxBwxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUATUHBFMAAAQAPQcBGFZlYzxUPgAANQcMLHN0YWdpbmdfeGNtCHY1KFBhbGxldEluZm8AABgBFGluZGV4yQEBDHUzMgABEG5hbWU5BwGAQm91bmRlZFZlYzx1OCwgTWF4UGFsbGV0TmFtZUxlbj4AASxtb2R1bGVfbmFtZTkHAYBCb3VuZGVkVmVjPHU4LCBNYXhQYWxsZXROYW1lTGVuPgABFG1ham9yyQEBDHUzMgABFG1pbm9yyQEBDHUzMgABFHBhdGNoyQEBDHUzMgAAOQcMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAEIBFMAAAQAOAEYVmVjPFQ+AAA9BwAAAjUHAEEHBBhPcHRpb24EBFQBuQIBCBBOb25lAAAAEFNvbWUEALkCAAABAABFBwQYT3B0aW9uBARUASgBCBBOb25lAAAAEFNvbWUEACgAAAEAAEkHDCxzdGFnaW5nX3hjbQh2NURRdWVyeVJlc3BvbnNlSW5mbwAADAEsZGVzdGluYXRpb265AgEgTG9jYXRpb24AASBxdWVyeV9pZCwBHFF1ZXJ5SWQAAShtYXhfd2VpZ2h0KAEYV2VpZ2h0AABNBxAsc3RhZ2luZ194Y20IdjUUYXNzZXQsQXNzZXRGaWx0ZXIAAQggRGVmaW5pdGUEAA0HARhBc3NldHMAAAAQV2lsZAQAUQcBJFdpbGRBc3NldAABAABRBxAsc3RhZ2luZ194Y20IdjUUYXNzZXQkV2lsZEFzc2V0AAEQDEFsbAAAABRBbGxPZggBCGlkVQUBHEFzc2V0SWQAAQxmdW5VBwE8V2lsZEZ1bmdpYmlsaXR5AAEAKEFsbENvdW50ZWQEAMkBAQx1MzIAAgAwQWxsT2ZDb3VudGVkDAEIaWRVBQEcQXNzZXRJZAABDGZ1blUHATxXaWxkRnVuZ2liaWxpdHkAARRjb3VudMkBAQx1MzIAAwAAVQcQLHN0YWdpbmdfeGNtCHY1FGFzc2V0PFdpbGRGdW5naWJpbGl0eQABCCBGdW5naWJsZQAAACxOb25GdW5naWJsZQABAABZBwQYT3B0aW9uBARUAV0HAQgQTm9uZQAAABBTb21lBABdBwAAAQAAXQcQLHN0YWdpbmdfeGNtCHY1FGFzc2V0TEFzc2V0VHJhbnNmZXJGaWx0ZXIAAQwgVGVsZXBvcnQEAE0HASxBc3NldEZpbHRlcgAAADhSZXNlcnZlRGVwb3NpdAQATQcBLEFzc2V0RmlsdGVyAAEAPFJlc2VydmVXaXRoZHJhdwQATQcBLEFzc2V0RmlsdGVyAAIAAGEHDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBXQcEUwAABABlBwEYVmVjPFQ+AABlBwAAAl0HAGkHBBhPcHRpb24EBFQBvQIBCBBOb25lAAAAEFNvbWUEAL0CAAABAABtBwxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAXEHBFMAAAQAdQcBGFZlYzxUPgAAcQcMLHN0YWdpbmdfeGNtCHY1EEhpbnQAAQQwQXNzZXRDbGFpbWVyBAEgbG9jYXRpb265AgEgTG9jYXRpb24AAAAAdQcAAAJxBwB5BxBccG9sa2Fkb3RfcnVudGltZV9jb21tb24gYXVjdGlvbnMYcGFsbGV0EENhbGwEBFQAAQwsbmV3X2F1Y3Rpb24IASBkdXJhdGlvbskBAURCbG9ja051bWJlckZvcjxUPgABSGxlYXNlX3BlcmlvZF9pbmRleMkBAUBMZWFzZVBlcmlvZE9mPFQ+AAAUVENyZWF0ZSBhIG5ldyBhdWN0aW9uLgBRAVRoaXMgY2FuIG9ubHkgaGFwcGVuIHdoZW4gdGhlcmUgaXNuJ3QgYWxyZWFkeSBhbiBhdWN0aW9uIGluIHByb2dyZXNzIGFuZCBtYXkgb25seSBiZSUBY2FsbGVkIGJ5IHRoZSByb290IG9yaWdpbi4gQWNjZXB0cyB0aGUgYGR1cmF0aW9uYCBvZiB0aGlzIGF1Y3Rpb24gYW5kIHRoZVkBYGxlYXNlX3BlcmlvZF9pbmRleGAgb2YgdGhlIGluaXRpYWwgbGVhc2UgcGVyaW9kIG9mIHRoZSBmb3VyIHRoYXQgYXJlIHRvIGJlIGF1Y3Rpb25lZC4MYmlkFAEQcGFyYX0HARhQYXJhSWQAATRhdWN0aW9uX2luZGV4yQEBMEF1Y3Rpb25JbmRleAABKGZpcnN0X3Nsb3TJAQFATGVhc2VQZXJpb2RPZjxUPgABJGxhc3Rfc2xvdMkBAUBMZWFzZVBlcmlvZE9mPFQ+AAEYYW1vdW50/QEBMEJhbGFuY2VPZjxUPgABQEkBTWFrZSBhIG5ldyBiaWQgZnJvbSBhbiBhY2NvdW50IChpbmNsdWRpbmcgYSBwYXJhY2hhaW4gYWNjb3VudCkgZm9yIGRlcGxveWluZyBhIG5ldyhwYXJhY2hhaW4uAFkBTXVsdGlwbGUgc2ltdWx0YW5lb3VzIGJpZHMgZnJvbSB0aGUgc2FtZSBiaWRkZXIgYXJlIGFsbG93ZWQgb25seSBhcyBsb25nIGFzIGFsbCBhY3RpdmU9AWJpZHMgb3ZlcmxhcCBlYWNoIG90aGVyIChpLmUuIGFyZSBtdXR1YWxseSBleGNsdXNpdmUpLiBCaWRzIGNhbm5vdCBiZSByZWRhY3RlZC4AVQEtIGBzdWJgIGlzIHRoZSBzdWItYmlkZGVyIElELCBhbGxvd2luZyBmb3IgbXVsdGlwbGUgY29tcGV0aW5nIGJpZHMgdG8gYmUgbWFkZSBieSAoYW5kcGZ1bmRlZCBieSkgdGhlIHNhbWUgYWNjb3VudC5NAS0gYGF1Y3Rpb25faW5kZXhgIGlzIHRoZSBpbmRleCBvZiB0aGUgYXVjdGlvbiB0byBiaWQgb24uIFNob3VsZCBqdXN0IGJlIHRoZSBwcmVzZW50aHZhbHVlIG9mIGBBdWN0aW9uQ291bnRlcmAuSQEtIGBmaXJzdF9zbG90YCBpcyB0aGUgZmlyc3QgbGVhc2UgcGVyaW9kIGluZGV4IG9mIHRoZSByYW5nZSB0byBiaWQgb24uIFRoaXMgaXMgdGhlCQFhYnNvbHV0ZSBsZWFzZSBwZXJpb2QgaW5kZXggdmFsdWUsIG5vdCBhbiBhdWN0aW9uLXNwZWNpZmljIG9mZnNldC5BAS0gYGxhc3Rfc2xvdGAgaXMgdGhlIGxhc3QgbGVhc2UgcGVyaW9kIGluZGV4IG9mIHRoZSByYW5nZSB0byBiaWQgb24uIFRoaXMgaXMgdGhlCQFhYnNvbHV0ZSBsZWFzZSBwZXJpb2QgaW5kZXggdmFsdWUsIG5vdCBhbiBhdWN0aW9uLXNwZWNpZmljIG9mZnNldC5JAS0gYGFtb3VudGAgaXMgdGhlIGFtb3VudCB0byBiaWQgdG8gYmUgaGVsZCBhcyBkZXBvc2l0IGZvciB0aGUgcGFyYWNoYWluIHNob3VsZCB0aGXIYmlkIHdpbi4gVGhpcyBhbW91bnQgaXMgaGVsZCB0aHJvdWdob3V0IHRoZSByYW5nZS44Y2FuY2VsX2F1Y3Rpb24AAgx4Q2FuY2VsIGFuIGluLXByb2dyZXNzIGF1Y3Rpb24uAIhDYW4gb25seSBiZSBjYWxsZWQgYnkgUm9vdCBvcmlnaW4uBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLn0HAAAGsQIAgQcQXHBvbGthZG90X3J1bnRpbWVfY29tbW9uJGNyb3dkbG9hbhhwYWxsZXQQQ2FsbAQEVAABJBhjcmVhdGUYARRpbmRleH0HARhQYXJhSWQAAQxjYXD9AQEwQmFsYW5jZU9mPFQ+AAEwZmlyc3RfcGVyaW9kyQEBQExlYXNlUGVyaW9kT2Y8VD4AASxsYXN0X3BlcmlvZMkBAUBMZWFzZVBlcmlvZE9mPFQ+AAEMZW5kyQEBREJsb2NrTnVtYmVyRm9yPFQ+AAEgdmVyaWZpZXKFBwFMT3B0aW9uPE11bHRpU2lnbmVyPgAAFE0BQ3JlYXRlIGEgbmV3IGNyb3dkbG9hbmluZyBjYW1wYWlnbiBmb3IgYSBwYXJhY2hhaW4gc2xvdCB3aXRoIHRoZSBnaXZlbiBsZWFzZSBwZXJpb2QYcmFuZ2UuAF0BVGhpcyBhcHBsaWVzIGEgbG9jayB0byB5b3VyIHBhcmFjaGFpbiBjb25maWd1cmF0aW9uLCBlbnN1cmluZyB0aGF0IGl0IGNhbm5vdCBiZSBjaGFuZ2VkZGJ5IHRoZSBwYXJhY2hhaW4gbWFuYWdlci4oY29udHJpYnV0ZQwBFGluZGV4fQcBGFBhcmFJZAABFHZhbHVl/QEBMEJhbGFuY2VPZjxUPgABJHNpZ25hdHVyZZEDAVhPcHRpb248TXVsdGlTaWduYXR1cmU+AAEIUQFDb250cmlidXRlIHRvIGEgY3Jvd2Qgc2FsZS4gVGhpcyB3aWxsIHRyYW5zZmVyIHNvbWUgYmFsYW5jZSBvdmVyIHRvIGZ1bmQgYSBwYXJhY2hhaW5RAXNsb3QuIEl0IHdpbGwgYmUgd2l0aGRyYXdhYmxlIHdoZW4gdGhlIGNyb3dkbG9hbiBoYXMgZW5kZWQgYW5kIHRoZSBmdW5kcyBhcmUgdW51c2VkLiB3aXRoZHJhdwgBDHdobwABMFQ6OkFjY291bnRJZAABFGluZGV4fQcBGFBhcmFJZAACRMBXaXRoZHJhdyBmdWxsIGJhbGFuY2Ugb2YgYSBzcGVjaWZpYyBjb250cmlidXRvci4AwE9yaWdpbiBtdXN0IGJlIHNpZ25lZCwgYnV0IGNhbiBjb21lIGZyb20gYW55b25lLgBdAVRoZSBmdW5kIG11c3QgYmUgZWl0aGVyIGluLCBvciByZWFkeSBmb3IsIHJldGlyZW1lbnQuIEZvciBhIGZ1bmQgdG8gYmUgKmluKiByZXRpcmVtZW50LEkBdGhlbiB0aGUgcmV0aXJlbWVudCBmbGFnIG11c3QgYmUgc2V0LiBGb3IgYSBmdW5kIHRvIGJlIHJlYWR5IGZvciByZXRpcmVtZW50LCB0aGVuOpwtIGl0IG11c3Qgbm90IGFscmVhZHkgYmUgaW4gcmV0aXJlbWVudDtNAS0gdGhlIGFtb3VudCBvZiByYWlzZWQgZnVuZHMgbXVzdCBiZSBiaWdnZXIgdGhhbiB0aGUgX2ZyZWVfIGJhbGFuY2Ugb2YgdGhlIGFjY291bnQ7NC0gYW5kIGVpdGhlcjq8ICAtIHRoZSBibG9jayBudW1iZXIgbXVzdCBiZSBhdCBsZWFzdCBgZW5kYDsgb3ItASAgLSB0aGUgY3VycmVudCBsZWFzZSBwZXJpb2QgbXVzdCBiZSBncmVhdGVyIHRoYW4gdGhlIGZ1bmQncyBgbGFzdF9wZXJpb2RgLgBVAUluIHRoaXMgY2FzZSwgdGhlIGZ1bmQncyByZXRpcmVtZW50IGZsYWcgaXMgc2V0IGFuZCBpdHMgYGVuZGAgaXMgcmVzZXQgdG8gdGhlIGN1cnJlbnQ0YmxvY2sgbnVtYmVyLgDwLSBgd2hvYDogVGhlIGFjY291bnQgd2hvc2UgY29udHJpYnV0aW9uIHNob3VsZCBiZSB3aXRoZHJhd24uGQEtIGBpbmRleGA6IFRoZSBwYXJhY2hhaW4gdG8gd2hvc2UgY3Jvd2Rsb2FuIHRoZSBjb250cmlidXRpb24gd2FzIG1hZGUuGHJlZnVuZAQBFGluZGV4fQcBGFBhcmFJZAADFOBBdXRvbWF0aWNhbGx5IHJlZnVuZCBjb250cmlidXRvcnMgb2YgYW4gZW5kZWQgY3Jvd2Rsb2FuLiEBRHVlIHRvIHdlaWdodCByZXN0cmljdGlvbnMsIHRoaXMgZnVuY3Rpb24gbWF5IG5lZWQgdG8gYmUgY2FsbGVkIG11bHRpcGxlSQF0aW1lcyB0byBmdWxseSByZWZ1bmQgYWxsIHVzZXJzLiBXZSB3aWxsIHJlZnVuZCBgUmVtb3ZlS2V5c0xpbWl0YCB1c2VycyBhdCBhIHRpbWUuAMBPcmlnaW4gbXVzdCBiZSBzaWduZWQsIGJ1dCBjYW4gY29tZSBmcm9tIGFueW9uZS4gZGlzc29sdmUEARRpbmRleH0HARhQYXJhSWQABARVAVJlbW92ZSBhIGZ1bmQgYWZ0ZXIgdGhlIHJldGlyZW1lbnQgcGVyaW9kIGhhcyBlbmRlZCBhbmQgYWxsIGZ1bmRzIGhhdmUgYmVlbiByZXR1cm5lZC4QZWRpdBgBFGluZGV4fQcBGFBhcmFJZAABDGNhcP0BATBCYWxhbmNlT2Y8VD4AATBmaXJzdF9wZXJpb2TJAQFATGVhc2VQZXJpb2RPZjxUPgABLGxhc3RfcGVyaW9kyQEBQExlYXNlUGVyaW9kT2Y8VD4AAQxlbmTJAQFEQmxvY2tOdW1iZXJGb3I8VD4AASB2ZXJpZmllcoUHAUxPcHRpb248TXVsdGlTaWduZXI+AAUM0EVkaXQgdGhlIGNvbmZpZ3VyYXRpb24gZm9yIGFuIGluLXByb2dyZXNzIGNyb3dkbG9hbi4AiENhbiBvbmx5IGJlIGNhbGxlZCBieSBSb290IG9yaWdpbi4gYWRkX21lbW8IARRpbmRleLECARhQYXJhSWQAARBtZW1vOAEcVmVjPHU4PgAGDOxBZGQgYW4gb3B0aW9uYWwgbWVtbyB0byBhbiBleGlzdGluZyBjcm93ZGxvYW4gY29udHJpYnV0aW9uLgAtAU9yaWdpbiBtdXN0IGJlIFNpZ25lZCwgYW5kIHRoZSB1c2VyIG11c3QgaGF2ZSBjb250cmlidXRlZCB0byB0aGUgY3Jvd2Rsb2FuLhBwb2tlBAEUaW5kZXixAgEYUGFyYUlkAAcMdFBva2UgdGhlIGZ1bmQgaW50byBgTmV3UmFpc2VgANxPcmlnaW4gbXVzdCBiZSBTaWduZWQsIGFuZCB0aGUgZnVuZCBoYXMgbm9uLXplcm8gcmFpc2UuOGNvbnRyaWJ1dGVfYWxsCAEUaW5kZXh9BwEYUGFyYUlkAAEkc2lnbmF0dXJlkQMBWE9wdGlvbjxNdWx0aVNpZ25hdHVyZT4ACAxhAUNvbnRyaWJ1dGUgeW91ciBlbnRpcmUgYmFsYW5jZSB0byBhIGNyb3dkIHNhbGUuIFRoaXMgd2lsbCB0cmFuc2ZlciB0aGUgZW50aXJlIGJhbGFuY2Ugb2ZRAWEgdXNlciBvdmVyIHRvIGZ1bmQgYSBwYXJhY2hhaW4gc2xvdC4gSXQgd2lsbCBiZSB3aXRoZHJhd2FibGUgd2hlbiB0aGUgY3Jvd2Rsb2FuIGhhc3xlbmRlZCBhbmQgdGhlIGZ1bmRzIGFyZSB1bnVzZWQuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLoUHBBhPcHRpb24EBFQBiQcBCBBOb25lAAAAEFNvbWUEAIkHAAABAACJBwgoc3BfcnVudGltZSxNdWx0aVNpZ25lcgABDBxFZDI1NTE5BAAEATxlZDI1NTE5OjpQdWJsaWMAAAAcU3IyNTUxOQQABAE8c3IyNTUxOTo6UHVibGljAAEAFEVjZHNhBABpAgE0ZWNkc2E6OlB1YmxpYwACAACNBxBccG9sa2Fkb3RfcnVudGltZV9jb21tb244YXNzaWduZWRfc2xvdHMYcGFsbGV0EENhbGwEBFQAARRoYXNzaWduX3Blcm1fcGFyYWNoYWluX3Nsb3QEAQhpZLECARhQYXJhSWQAAAQhAUFzc2lnbiBhIHBlcm1hbmVudCBwYXJhY2hhaW4gc2xvdCBhbmQgaW1tZWRpYXRlbHkgY3JlYXRlIGEgbGVhc2UgZm9yIGl0Lmhhc3NpZ25fdGVtcF9wYXJhY2hhaW5fc2xvdAgBCGlksQIBGFBhcmFJZAABSGxlYXNlX3BlcmlvZF9zdGFydJEHAVBTbG90TGVhc2VQZXJpb2RTdGFydAABDDkBQXNzaWduIGEgdGVtcG9yYXJ5IHBhcmFjaGFpbiBzbG90LiBUaGUgZnVuY3Rpb24gdHJpZXMgdG8gY3JlYXRlIGEgbGVhc2UgZm9yIGl0OQFpbW1lZGlhdGVseSBpZiBgU2xvdExlYXNlUGVyaW9kU3RhcnQ6OkN1cnJlbnRgIGlzIHNwZWNpZmllZCwgYW5kIGlmIHRoZSBudW1iZXI5AW9mIGN1cnJlbnRseSBhY3RpdmUgdGVtcG9yYXJ5IHNsb3RzIGlzIGJlbG93IGBNYXhUZW1wb3JhcnlTbG90UGVyTGVhc2VQZXJpb2RgLlx1bmFzc2lnbl9wYXJhY2hhaW5fc2xvdAQBCGlksQIBGFBhcmFJZAACBMBVbmFzc2lnbiBhIHBlcm1hbmVudCBvciB0ZW1wb3JhcnkgcGFyYWNoYWluIHNsb3Rcc2V0X21heF9wZXJtYW5lbnRfc2xvdHMEARRzbG90cxABDHUzMgADBLRTZXRzIHRoZSBzdG9yYWdlIHZhbHVlIFtgTWF4UGVybWFuZW50U2xvdHNgXS5cc2V0X21heF90ZW1wb3Jhcnlfc2xvdHMEARRzbG90cxABDHUzMgAEBLRTZXRzIHRoZSBzdG9yYWdlIHZhbHVlIFtgTWF4VGVtcG9yYXJ5U2xvdHNgXS4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMukQcMXHBvbGthZG90X3J1bnRpbWVfY29tbW9uOGFzc2lnbmVkX3Nsb3RzUFNsb3RMZWFzZVBlcmlvZFN0YXJ0AAEIHEN1cnJlbnQAAAAQTmV4dAABAACVBxBscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zIGNvcmV0aW1lGHBhbGxldBBDYWxsBARUAAEQSHJlcXVlc3RfY29yZV9jb3VudAQBFGNvdW50QQEBDHUxNgABGFEBUmVxdWVzdCB0aGUgY29uZmlndXJhdGlvbiB0byBiZSB1cGRhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgY29yZXMuIFdhcm5pbmc6UQFTaW5jZSB0aGlzIG9ubHkgc2NoZWR1bGVzIGEgY29uZmlndXJhdGlvbiB1cGRhdGUsIGl0IHRha2VzIHR3byBzZXNzaW9ucyB0byBjb21lIGludG8cZWZmZWN0LgCYLSBgb3JpZ2luYDogUm9vdCBvciB0aGUgQ29yZXRpbWUgQ2hhaW6ALSBgY291bnRgOiB0b3RhbCBudW1iZXIgb2YgY29yZXNIcmVxdWVzdF9yZXZlbnVlX2F0BAEQd2hlbhABLEJsb2NrTnVtYmVyAAIQYQFSZXF1ZXN0IHRvIGNsYWltIHRoZSBpbnN0YW50YW5lb3VzIGNvcmV0aW1lIHNhbGVzIHJldmVudWUgc3RhcnRpbmcgZnJvbSB0aGUgYmxvY2sgaXQgd2FzXQFsYXN0IGNsYWltZWQgdW50aWwgYW5kIHVwIHRvIHRoZSBibG9jayBzcGVjaWZpZWQuIFRoZSBjbGFpbWVkIGFtb3VudCB2YWx1ZSBpcyBzZW50IGJhY2tRAXRvIHRoZSBDb3JldGltZSBjaGFpbiBpbiBhIGBub3RpZnlfcmV2ZW51ZWAgbWVzc2FnZS4gQXQgdGhlIHNhbWUgdGltZSwgdGhlIGFtb3VudCBpc4R0ZWxlcG9ydGVkIHRvIHRoZSBDb3JldGltZSBjaGFpbi44Y3JlZGl0X2FjY291bnQIAQx3aG8AATBUOjpBY2NvdW50SWQAARhhbW91bnQYATBCYWxhbmNlT2Y8VD4AAwAsYXNzaWduX2NvcmUQARBjb3JlQQEBPEJyb2tlckNvcmVJbmRleAABFGJlZ2luEAFEQmxvY2tOdW1iZXJGb3I8VD4AAShhc3NpZ25tZW50mQcBjFZlYzwoQ29yZUFzc2lnbm1lbnQsIFBhcnRzT2Y1NzYwMCk+AAEgZW5kX2hpbnScAWRPcHRpb248QmxvY2tOdW1iZXJGb3I8VD4+AAQkWQFSZWNlaXZlIGluc3RydWN0aW9ucyBmcm9tIHRoZSBgRXh0ZXJuYWxCcm9rZXJPcmlnaW5gLCBkZXRhaWxpbmcgaG93IGEgc3BlY2lmaWMgY29yZSBpcyx0byBiZSB1c2VkLgAsUGFyYW1ldGVyczohAS1gb3JpZ2luYDogVGhlIGBFeHRlcm5hbEJyb2tlck9yaWdpbmAsIGFzc3VtZWQgdG8gYmUgdGhlIGNvcmV0aW1lIGNoYWluLqwtYGNvcmVgOiBUaGUgY29yZSB0aGF0IHNob3VsZCBiZSBzY2hlZHVsZWQu2C1gYmVnaW5gOiBUaGUgc3RhcnRpbmcgYmxvY2toZWlnaHQgb2YgdGhlIGluc3RydWN0aW9uLtQtYGFzc2lnbm1lbnRgOiBIb3cgdGhlIGJsb2Nrc3BhY2Ugc2hvdWxkIGJlIHV0aWxpc2VkLlkBLWBlbmRfaGludGA6IEFuIG9wdGlvbmFsIGhpbnQgYXMgdG8gd2hlbiB0aGlzIHBhcnRpY3VsYXIgc2V0IG9mIGluc3RydWN0aW9ucyB3aWxsIGVuZC4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMumQcAAAKdBwCdBwAABAihB6UHAKEHDDRwYWxsZXRfYnJva2VySGNvcmV0aW1lX2ludGVyZmFjZThDb3JlQXNzaWdubWVudAABDBBJZGxlAAAAEFBvb2wAAQAQVGFzawQAEAEYVGFza0lkAAIAAKUHDGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnNEYXNzaWduZXJfY29yZXRpbWUwUGFydHNPZjU3NjAwAAAEAEEBAQx1MTYAAKkHDHhwYWxsZXRfc3Rha2luZ19hc3luY19haF9jbGllbnQYcGFsbGV0EENhbGwEBFQAAQw0dmFsaWRhdG9yX3NldAQBGHJlcG9ydK0HAaxyY19jbGllbnQ6OlZhbGlkYXRvclNldFJlcG9ydDxUOjpBY2NvdW50SWQ+AAAAIHNldF9tb2RlBAEQbW9kZbEHATRPcGVyYXRpbmdNb2RlAAEEAQFBbGxvd3MgZ292ZXJuYW5jZSB0byBmb3JjZSBzZXQgdGhlIG9wZXJhdGluZyBtb2RlIG9mIHRoZSBwYWxsZXQuWGZvcmNlX29uX21pZ3JhdGlvbl9lbmQAAgQlAW1hbnVhbGx5IGRvIHdoYXQgdGhpcyBwYWxsZXQgd2FzIG1lYW50IHRvIGRvIGF0IHRoZSBlbmQgb2YgdGhlIG1pZ3JhdGlvbi4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMurQcIeHBhbGxldF9zdGFraW5nX2FzeW5jX3JjX2NsaWVudEhWYWxpZGF0b3JTZXRSZXBvcnQEJEFjY291bnRJZAEAABABRG5ld192YWxpZGF0b3Jfc2V0AQIBOFZlYzxBY2NvdW50SWQ+AAEIaWQQAQx1MzIAASxwcnVuZV91cF90b5wBUE9wdGlvbjxTZXNzaW9uSW5kZXg+AAEgbGVmdG92ZXIgARBib29sAACxBwh4cGFsbGV0X3N0YWtpbmdfYXN5bmNfYWhfY2xpZW50NE9wZXJhdGluZ01vZGUAAQwcUGFzc2l2ZQAAACBCdWZmZXJlZAABABhBY3RpdmUAAgAAtQcMRHBhbGxldF9taWdyYXRpb25zGHBhbGxldBBDYWxsBARUAAEQQGZvcmNlX3NldF9jdXJzb3IEARhjdXJzb3K5BwFMT3B0aW9uPEN1cnNvck9mPFQ+PgAAFF0BQWxsb3dzIHJvb3QgdG8gc2V0IGEgY3Vyc29yIHRvIGZvcmNlZnVsbHkgc3RhcnQsIHN0b3Agb3IgZm9yd2FyZCB0aGUgbWlncmF0aW9uIHByb2Nlc3MuAEkBU2hvdWxkIG5vcm1hbGx5IG5vdCBiZSBuZWVkZWQgYW5kIGlzIG9ubHkgaW4gcGxhY2UgYXMgZW1lcmdlbmN5IG1lYXN1cmUuIE5vdGUgdGhhdAUBcmVzdGFydGluZyB0aGUgbWlncmF0aW9uIHByb2Nlc3MgaW4gdGhpcyBtYW5uZXIgd2lsbCBub3QgY2FsbCB0aGUtAVtgTWlncmF0aW9uU3RhdHVzSGFuZGxlcjo6c3RhcnRlZGBdIGhvb2sgb3IgZW1pdCBhbiBgVXBncmFkZVN0YXJ0ZWRgIGV2ZW50Llxmb3JjZV9zZXRfYWN0aXZlX2N1cnNvcgwBFGluZGV4EAEMdTMyAAEwaW5uZXJfY3Vyc29yyQcBWE9wdGlvbjxSYXdDdXJzb3JPZjxUPj4AAShzdGFydGVkX2F0nAFkT3B0aW9uPEJsb2NrTnVtYmVyRm9yPFQ+PgABGFkBQWxsb3dzIHJvb3QgdG8gc2V0IGFuIGFjdGl2ZSBjdXJzb3IgdG8gZm9yY2VmdWxseSBzdGFydC9mb3J3YXJkIHRoZSBtaWdyYXRpb24gcHJvY2Vzcy4ARQFUaGlzIGlzIGFuIGVkZ2UtY2FzZSB2ZXJzaW9uIG9mIFtgU2VsZjo6Zm9yY2Vfc2V0X2N1cnNvcmBdIHRoYXQgYWxsb3dzIHRvIHNldCB0aGVhAWBzdGFydGVkX2F0YCB2YWx1ZSB0byB0aGUgbmV4dCBibG9jayBudW1iZXIuIE90aGVyd2lzZSB0aGlzIHdvdWxkIG5vdCBiZSBwb3NzaWJsZSwgc2luY2VFAWBmb3JjZV9zZXRfY3Vyc29yYCB0YWtlcyBhbiBhYnNvbHV0ZSBibG9jayBudW1iZXIuIFNldHRpbmcgYHN0YXJ0ZWRfYXRgIHRvIGBOb25lYAEBaW5kaWNhdGVzIHRoYXQgdGhlIGN1cnJlbnQgYmxvY2sgbnVtYmVyIHBsdXMgb25lIHNob3VsZCBiZSB1c2VkLkhmb3JjZV9vbmJvYXJkX21ibXMAAhCgRm9yY2VzIHRoZSBvbmJvYXJkaW5nIG9mIHRoZSBtaWdyYXRpb25zLgBdAVRoaXMgcHJvY2VzcyBoYXBwZW5zIGF1dG9tYXRpY2FsbHkgb24gYSBydW50aW1lIHVwZ3JhZGUuIEl0IGlzIGluIHBsYWNlIGFzIGFuIGVtZXJnZW5jefxtZWFzdXJlbWVudC4gVGhlIGN1cnNvciBuZWVkcyB0byBiZSBgTm9uZWAgZm9yIHRoaXMgdG8gc3VjY2VlZC44Y2xlYXJfaGlzdG9yaWMEASBzZWxlY3Rvcs0HAaBIaXN0b3JpY0NsZWFudXBTZWxlY3RvcjxJZGVudGlmaWVyT2Y8VD4+AAMUaENsZWFycyB0aGUgYEhpc3RvcmljYCBzZXQuAA0BYG1hcF9jdXJzb3JgIG11c3QgYmUgc2V0IHRvIHRoZSBsYXN0IHZhbHVlIHRoYXQgd2FzIHJldHVybmVkIGJ5IHRoZV0BYEhpc3RvcmljQ2xlYXJlZGAgZXZlbnQuIFRoZSBmaXJzdCB0aW1lIGBOb25lYCBjYW4gYmUgdXNlZC4gYGxpbWl0YCBtdXN0IGJlIGNob3NlbiBpbiBhqHdheSB0aGF0IHdpbGwgcmVzdWx0IGluIGEgc2Vuc2libGUgd2VpZ2h0LgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy65BwQYT3B0aW9uBARUAb0HAQgQTm9uZQAAABBTb21lBAC9BwAAAQAAvQcIRHBhbGxldF9taWdyYXRpb25zPE1pZ3JhdGlvbkN1cnNvcggYQ3Vyc29yAcEHLEJsb2NrTnVtYmVyARABCBhBY3RpdmUEAMUHAYRBY3RpdmVDdXJzb3I8Q3Vyc29yLCBCbG9ja051bWJlcj4AAAAUU3R1Y2sAAQAAwQcMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAEIBFMAAAQAOAEYVmVjPFQ+AADFBwhEcGFsbGV0X21pZ3JhdGlvbnMwQWN0aXZlQ3Vyc29yCBhDdXJzb3IBwQcsQmxvY2tOdW1iZXIBEAAMARRpbmRleBABDHUzMgABMGlubmVyX2N1cnNvcskHAThPcHRpb248Q3Vyc29yPgABKHN0YXJ0ZWRfYXQQASxCbG9ja051bWJlcgAAyQcEGE9wdGlvbgQEVAHBBwEIEE5vbmUAAAAQU29tZQQAwQcAAAEAAM0HCERwYWxsZXRfbWlncmF0aW9uc1xIaXN0b3JpY0NsZWFudXBTZWxlY3RvcgQISWQB0QcBCCBTcGVjaWZpYwQA1QcBHFZlYzxJZD4AAAAgV2lsZGNhcmQIARRsaW1pdJwBLE9wdGlvbjx1MzI+AAE8cHJldmlvdXNfY3Vyc29y2QcBPE9wdGlvbjxWZWM8dTg+PgABAADRBwxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAQgEUwAABAA4ARhWZWM8VD4AANUHAAAC0QcA2QcEGE9wdGlvbgQEVAE4AQgQTm9uZQAAABBTb21lBAA4AAABAADdBwwocGFsbGV0X3hjbRhwYWxsZXQQQ2FsbAQEVAABRBBzZW5kCAEQZGVzdFkFAVhCb3g8VmVyc2lvbmVkTG9jYXRpb24+AAEcbWVzc2FnZU0GAVRCb3g8VmVyc2lvbmVkWGNtPCgpPj4AAAA8dGVsZXBvcnRfYXNzZXRzEAEQZGVzdFkFAVhCb3g8VmVyc2lvbmVkTG9jYXRpb24+AAEsYmVuZWZpY2lhcnlZBQFYQm94PFZlcnNpb25lZExvY2F0aW9uPgABGGFzc2V0c+EHAVBCb3g8VmVyc2lvbmVkQXNzZXRzPgABOGZlZV9hc3NldF9pdGVtEAEMdTMyAAFIEQFUZWxlcG9ydCBzb21lIGFzc2V0cyBmcm9tIHRoZSBsb2NhbCBjaGFpbiB0byBzb21lIGRlc3RpbmF0aW9uIGNoYWluLgAdASoqVGhpcyBmdW5jdGlvbiBpcyBkZXByZWNhdGVkOiBVc2UgYGxpbWl0ZWRfdGVsZXBvcnRfYXNzZXRzYCBpbnN0ZWFkLioqAFEBRmVlIHBheW1lbnQgb24gdGhlIGRlc3RpbmF0aW9uIHNpZGUgaXMgbWFkZSBmcm9tIHRoZSBhc3NldCBpbiB0aGUgYGFzc2V0c2AgdmVjdG9yIG9mYQFpbmRleCBgZmVlX2Fzc2V0X2l0ZW1gLiBUaGUgd2VpZ2h0IGxpbWl0IGZvciBmZWVzIGlzIG5vdCBwcm92aWRlZCBhbmQgdGh1cyBpcyB1bmxpbWl0ZWQstHdpdGggYWxsIGZlZXMgdGFrZW4gYXMgbmVlZGVkIGZyb20gdGhlIGFzc2V0LgApAS0gYG9yaWdpbmA6IE11c3QgYmUgY2FwYWJsZSBvZiB3aXRoZHJhd2luZyB0aGUgYGFzc2V0c2AgYW5kIGV4ZWN1dGluZyBYQ00uJQEtIGBkZXN0YDogRGVzdGluYXRpb24gY29udGV4dCBmb3IgdGhlIGFzc2V0cy4gV2lsbCB0eXBpY2FsbHkgYmUgYFtQYXJlbnQsYQEgIFBhcmFjaGFpbiguLildYCB0byBzZW5kIGZyb20gcGFyYWNoYWluIHRvIHBhcmFjaGFpbiwgb3IgYFtQYXJhY2hhaW4oLi4pXWAgdG8gc2VuZCBmcm9tVCAgcmVsYXkgdG8gcGFyYWNoYWluLlUBLSBgYmVuZWZpY2lhcnlgOiBBIGJlbmVmaWNpYXJ5IGxvY2F0aW9uIGZvciB0aGUgYXNzZXRzIGluIHRoZSBjb250ZXh0IG9mIGBkZXN0YC4gV2lsbJggIGdlbmVyYWxseSBiZSBhbiBgQWNjb3VudElkMzJgIHZhbHVlLlkBLSBgYXNzZXRzYDogVGhlIGFzc2V0cyB0byBiZSB3aXRoZHJhd24uIFRoaXMgc2hvdWxkIGluY2x1ZGUgdGhlIGFzc2V0cyB1c2VkIHRvIHBheSB0aGVoICBmZWUgb24gdGhlIGBkZXN0YCBjaGFpbi5NAS0gYGZlZV9hc3NldF9pdGVtYDogVGhlIGluZGV4IGludG8gYGFzc2V0c2Agb2YgdGhlIGl0ZW0gd2hpY2ggc2hvdWxkIGJlIHVzZWQgdG8gcGF5HCAgZmVlcy5ccmVzZXJ2ZV90cmFuc2Zlcl9hc3NldHMQARBkZXN0WQUBWEJveDxWZXJzaW9uZWRMb2NhdGlvbj4AASxiZW5lZmljaWFyeVkFAVhCb3g8VmVyc2lvbmVkTG9jYXRpb24+AAEYYXNzZXRz4QcBUEJveDxWZXJzaW9uZWRBc3NldHM+AAE4ZmVlX2Fzc2V0X2l0ZW0QAQx1MzIAAnhdAVRyYW5zZmVyIHNvbWUgYXNzZXRzIGZyb20gdGhlIGxvY2FsIGNoYWluIHRvIHRoZSBkZXN0aW5hdGlvbiBjaGFpbiB0aHJvdWdoIHRoZWlyIGxvY2FsLHhkZXN0aW5hdGlvbiBvciByZW1vdGUgcmVzZXJ2ZS4APQFgYXNzZXRzYCBtdXN0IGhhdmUgc2FtZSByZXNlcnZlIGxvY2F0aW9uIGFuZCBtYXkgbm90IGJlIHRlbGVwb3J0YWJsZSB0byBgZGVzdGAuTQEgLSBgYXNzZXRzYCBoYXZlIGxvY2FsIHJlc2VydmU6IHRyYW5zZmVyIGFzc2V0cyB0byBzb3ZlcmVpZ24gYWNjb3VudCBvZiBkZXN0aW5hdGlvbk0BICAgY2hhaW4gYW5kIGZvcndhcmQgYSBub3RpZmljYXRpb24gWENNIHRvIGBkZXN0YCB0byBtaW50IGFuZCBkZXBvc2l0IHJlc2VydmUtYmFzZWRsICAgYXNzZXRzIHRvIGBiZW5lZmljaWFyeWAuVQEgLSBgYXNzZXRzYCBoYXZlIGRlc3RpbmF0aW9uIHJlc2VydmU6IGJ1cm4gbG9jYWwgYXNzZXRzIGFuZCBmb3J3YXJkIGEgbm90aWZpY2F0aW9uIHRvWQEgICBgZGVzdGAgY2hhaW4gdG8gd2l0aGRyYXcgdGhlIHJlc2VydmUgYXNzZXRzIGZyb20gdGhpcyBjaGFpbidzIHNvdmVyZWlnbiBhY2NvdW50IGFuZIQgICBkZXBvc2l0IHRoZW0gdG8gYGJlbmVmaWNpYXJ5YC5hASAtIGBhc3NldHNgIGhhdmUgcmVtb3RlIHJlc2VydmU6IGJ1cm4gbG9jYWwgYXNzZXRzLCBmb3J3YXJkIFhDTSB0byByZXNlcnZlIGNoYWluIHRvIG1vdmVhASAgIHJlc2VydmVzIGZyb20gdGhpcyBjaGFpbidzIFNBIHRvIGBkZXN0YCBjaGFpbidzIFNBLCBhbmQgZm9yd2FyZCBhbm90aGVyIFhDTSB0byBgZGVzdGD0ICAgdG8gbWludCBhbmQgZGVwb3NpdCByZXNlcnZlLWJhc2VkIGFzc2V0cyB0byBgYmVuZWZpY2lhcnlgLgA9ASoqVGhpcyBmdW5jdGlvbiBpcyBkZXByZWNhdGVkOiBVc2UgYGxpbWl0ZWRfcmVzZXJ2ZV90cmFuc2Zlcl9hc3NldHNgIGluc3RlYWQuKioAUQFGZWUgcGF5bWVudCBvbiB0aGUgZGVzdGluYXRpb24gc2lkZSBpcyBtYWRlIGZyb20gdGhlIGFzc2V0IGluIHRoZSBgYXNzZXRzYCB2ZWN0b3Igb2ZhAWluZGV4IGBmZWVfYXNzZXRfaXRlbWAuIFRoZSB3ZWlnaHQgbGltaXQgZm9yIGZlZXMgaXMgbm90IHByb3ZpZGVkIGFuZCB0aHVzIGlzIHVubGltaXRlZCy0d2l0aCBhbGwgZmVlcyB0YWtlbiBhcyBuZWVkZWQgZnJvbSB0aGUgYXNzZXQuACkBLSBgb3JpZ2luYDogTXVzdCBiZSBjYXBhYmxlIG9mIHdpdGhkcmF3aW5nIHRoZSBgYXNzZXRzYCBhbmQgZXhlY3V0aW5nIFhDTS4lAS0gYGRlc3RgOiBEZXN0aW5hdGlvbiBjb250ZXh0IGZvciB0aGUgYXNzZXRzLiBXaWxsIHR5cGljYWxseSBiZSBgW1BhcmVudCxhASAgUGFyYWNoYWluKC4uKV1gIHRvIHNlbmQgZnJvbSBwYXJhY2hhaW4gdG8gcGFyYWNoYWluLCBvciBgW1BhcmFjaGFpbiguLildYCB0byBzZW5kIGZyb21UICByZWxheSB0byBwYXJhY2hhaW4uVQEtIGBiZW5lZmljaWFyeWA6IEEgYmVuZWZpY2lhcnkgbG9jYXRpb24gZm9yIHRoZSBhc3NldHMgaW4gdGhlIGNvbnRleHQgb2YgYGRlc3RgLiBXaWxsmCAgZ2VuZXJhbGx5IGJlIGFuIGBBY2NvdW50SWQzMmAgdmFsdWUuWQEtIGBhc3NldHNgOiBUaGUgYXNzZXRzIHRvIGJlIHdpdGhkcmF3bi4gVGhpcyBzaG91bGQgaW5jbHVkZSB0aGUgYXNzZXRzIHVzZWQgdG8gcGF5IHRoZcggIGZlZSBvbiB0aGUgYGRlc3RgIChhbmQgcG9zc2libHkgcmVzZXJ2ZSkgY2hhaW5zLk0BLSBgZmVlX2Fzc2V0X2l0ZW1gOiBUaGUgaW5kZXggaW50byBgYXNzZXRzYCBvZiB0aGUgaXRlbSB3aGljaCBzaG91bGQgYmUgdXNlZCB0byBwYXkcICBmZWVzLhxleGVjdXRlCAEcbWVzc2FnZeUHAbRCb3g8VmVyc2lvbmVkWGNtPDxUIGFzIENvbmZpZz46OlJ1bnRpbWVDYWxsPj4AAShtYXhfd2VpZ2h0KAEYV2VpZ2h0AAMg0EV4ZWN1dGUgYW4gWENNIG1lc3NhZ2UgZnJvbSBhIGxvY2FsLCBzaWduZWQsIG9yaWdpbi4ATQFBbiBldmVudCBpcyBkZXBvc2l0ZWQgaW5kaWNhdGluZyB3aGV0aGVyIGBtc2dgIGNvdWxkIGJlIGV4ZWN1dGVkIGNvbXBsZXRlbHkgb3Igb25seShwYXJ0aWFsbHkuAF0BTm8gbW9yZSB0aGFuIGBtYXhfd2VpZ2h0YCB3aWxsIGJlIHVzZWQgaW4gaXRzIGF0dGVtcHRlZCBleGVjdXRpb24uIElmIHRoaXMgaXMgbGVzcyB0aGFuQQF0aGUgbWF4aW11bSBhbW91bnQgb2Ygd2VpZ2h0IHRoYXQgdGhlIG1lc3NhZ2UgY291bGQgdGFrZSB0byBiZSBleGVjdXRlZCwgdGhlbiBub3xleGVjdXRpb24gYXR0ZW1wdCB3aWxsIGJlIG1hZGUuRGZvcmNlX3hjbV92ZXJzaW9uCAEgbG9jYXRpb265AgE0Qm94PExvY2F0aW9uPgABHHZlcnNpb24QAShYY21WZXJzaW9uAAQYSQFFeHRvbGwgdGhhdCBhIHBhcnRpY3VsYXIgZGVzdGluYXRpb24gY2FuIGJlIGNvbW11bmljYXRlZCB3aXRoIHRocm91Z2ggYSBwYXJ0aWN1bGFyPHZlcnNpb24gb2YgWENNLgDcLSBgb3JpZ2luYDogTXVzdCBiZSBhbiBvcmlnaW4gc3BlY2lmaWVkIGJ5IEFkbWluT3JpZ2luLtgtIGBsb2NhdGlvbmA6IFRoZSBkZXN0aW5hdGlvbiB0aGF0IGlzIGJlaW5nIGRlc2NyaWJlZC4RAS0gYHhjbV92ZXJzaW9uYDogVGhlIGxhdGVzdCB2ZXJzaW9uIG9mIFhDTSB0aGF0IGBsb2NhdGlvbmAgc3VwcG9ydHMuZGZvcmNlX2RlZmF1bHRfeGNtX3ZlcnNpb24EAURtYXliZV94Y21fdmVyc2lvbpwBSE9wdGlvbjxYY21WZXJzaW9uPgAFFFkBU2V0IGEgc2FmZSBYQ00gdmVyc2lvbiAodGhlIHZlcnNpb24gdGhhdCBYQ00gc2hvdWxkIGJlIGVuY29kZWQgd2l0aCBpZiB0aGUgbW9zdCByZWNlbnS0dmVyc2lvbiBhIGRlc3RpbmF0aW9uIGNhbiBhY2NlcHQgaXMgdW5rbm93bikuANwtIGBvcmlnaW5gOiBNdXN0IGJlIGFuIG9yaWdpbiBzcGVjaWZpZWQgYnkgQWRtaW5PcmlnaW4uOQEtIGBtYXliZV94Y21fdmVyc2lvbmA6IFRoZSBkZWZhdWx0IFhDTSBlbmNvZGluZyB2ZXJzaW9uLCBvciBgTm9uZWAgdG8gZGlzYWJsZS54Zm9yY2Vfc3Vic2NyaWJlX3ZlcnNpb25fbm90aWZ5BAEgbG9jYXRpb25ZBQFYQm94PFZlcnNpb25lZExvY2F0aW9uPgAGEDkBQXNrIGEgbG9jYXRpb24gdG8gbm90aWZ5IHVzIHJlZ2FyZGluZyB0aGVpciBYQ00gdmVyc2lvbiBhbmQgYW55IGNoYW5nZXMgdG8gaXQuANwtIGBvcmlnaW5gOiBNdXN0IGJlIGFuIG9yaWdpbiBzcGVjaWZpZWQgYnkgQWRtaW5PcmlnaW4uWQEtIGBsb2NhdGlvbmA6IFRoZSBsb2NhdGlvbiB0byB3aGljaCB3ZSBzaG91bGQgc3Vic2NyaWJlIGZvciBYQ00gdmVyc2lvbiBub3RpZmljYXRpb25zLoBmb3JjZV91bnN1YnNjcmliZV92ZXJzaW9uX25vdGlmeQQBIGxvY2F0aW9uWQUBWEJveDxWZXJzaW9uZWRMb2NhdGlvbj4ABxhJAVJlcXVpcmUgdGhhdCBhIHBhcnRpY3VsYXIgZGVzdGluYXRpb24gc2hvdWxkIG5vIGxvbmdlciBub3RpZnkgdXMgcmVnYXJkaW5nIGFueSBYQ01AdmVyc2lvbiBjaGFuZ2VzLgDcLSBgb3JpZ2luYDogTXVzdCBiZSBhbiBvcmlnaW4gc3BlY2lmaWVkIGJ5IEFkbWluT3JpZ2luLj0BLSBgbG9jYXRpb25gOiBUaGUgbG9jYXRpb24gdG8gd2hpY2ggd2UgYXJlIGN1cnJlbnRseSBzdWJzY3JpYmVkIGZvciBYQ00gdmVyc2lvbqggIG5vdGlmaWNhdGlvbnMgd2hpY2ggd2Ugbm8gbG9uZ2VyIGRlc2lyZS58bGltaXRlZF9yZXNlcnZlX3RyYW5zZmVyX2Fzc2V0cxQBEGRlc3RZBQFYQm94PFZlcnNpb25lZExvY2F0aW9uPgABLGJlbmVmaWNpYXJ5WQUBWEJveDxWZXJzaW9uZWRMb2NhdGlvbj4AARhhc3NldHPhBwFQQm94PFZlcnNpb25lZEFzc2V0cz4AAThmZWVfYXNzZXRfaXRlbRABDHUzMgABMHdlaWdodF9saW1pdLUGASxXZWlnaHRMaW1pdAAIeF0BVHJhbnNmZXIgc29tZSBhc3NldHMgZnJvbSB0aGUgbG9jYWwgY2hhaW4gdG8gdGhlIGRlc3RpbmF0aW9uIGNoYWluIHRocm91Z2ggdGhlaXIgbG9jYWwseGRlc3RpbmF0aW9uIG9yIHJlbW90ZSByZXNlcnZlLgA9AWBhc3NldHNgIG11c3QgaGF2ZSBzYW1lIHJlc2VydmUgbG9jYXRpb24gYW5kIG1heSBub3QgYmUgdGVsZXBvcnRhYmxlIHRvIGBkZXN0YC5NASAtIGBhc3NldHNgIGhhdmUgbG9jYWwgcmVzZXJ2ZTogdHJhbnNmZXIgYXNzZXRzIHRvIHNvdmVyZWlnbiBhY2NvdW50IG9mIGRlc3RpbmF0aW9uTQEgICBjaGFpbiBhbmQgZm9yd2FyZCBhIG5vdGlmaWNhdGlvbiBYQ00gdG8gYGRlc3RgIHRvIG1pbnQgYW5kIGRlcG9zaXQgcmVzZXJ2ZS1iYXNlZGwgICBhc3NldHMgdG8gYGJlbmVmaWNpYXJ5YC5VASAtIGBhc3NldHNgIGhhdmUgZGVzdGluYXRpb24gcmVzZXJ2ZTogYnVybiBsb2NhbCBhc3NldHMgYW5kIGZvcndhcmQgYSBub3RpZmljYXRpb24gdG9ZASAgIGBkZXN0YCBjaGFpbiB0byB3aXRoZHJhdyB0aGUgcmVzZXJ2ZSBhc3NldHMgZnJvbSB0aGlzIGNoYWluJ3Mgc292ZXJlaWduIGFjY291bnQgYW5khCAgIGRlcG9zaXQgdGhlbSB0byBgYmVuZWZpY2lhcnlgLmEBIC0gYGFzc2V0c2AgaGF2ZSByZW1vdGUgcmVzZXJ2ZTogYnVybiBsb2NhbCBhc3NldHMsIGZvcndhcmQgWENNIHRvIHJlc2VydmUgY2hhaW4gdG8gbW92ZWEBICAgcmVzZXJ2ZXMgZnJvbSB0aGlzIGNoYWluJ3MgU0EgdG8gYGRlc3RgIGNoYWluJ3MgU0EsIGFuZCBmb3J3YXJkIGFub3RoZXIgWENNIHRvIGBkZXN0YPQgICB0byBtaW50IGFuZCBkZXBvc2l0IHJlc2VydmUtYmFzZWQgYXNzZXRzIHRvIGBiZW5lZmljaWFyeWAuAFEBRmVlIHBheW1lbnQgb24gdGhlIGRlc3RpbmF0aW9uIHNpZGUgaXMgbWFkZSBmcm9tIHRoZSBhc3NldCBpbiB0aGUgYGFzc2V0c2AgdmVjdG9yIG9mYQFpbmRleCBgZmVlX2Fzc2V0X2l0ZW1gLCB1cCB0byBlbm91Z2ggdG8gcGF5IGZvciBgd2VpZ2h0X2xpbWl0YCBvZiB3ZWlnaHQuIElmIG1vcmUgd2VpZ2h0WQFpcyBuZWVkZWQgdGhhbiBgd2VpZ2h0X2xpbWl0YCwgdGhlbiB0aGUgb3BlcmF0aW9uIHdpbGwgZmFpbCBhbmQgdGhlIHNlbnQgYXNzZXRzIG1heSBiZSBhdCByaXNrLgApAS0gYG9yaWdpbmA6IE11c3QgYmUgY2FwYWJsZSBvZiB3aXRoZHJhd2luZyB0aGUgYGFzc2V0c2AgYW5kIGV4ZWN1dGluZyBYQ00uJQEtIGBkZXN0YDogRGVzdGluYXRpb24gY29udGV4dCBmb3IgdGhlIGFzc2V0cy4gV2lsbCB0eXBpY2FsbHkgYmUgYFtQYXJlbnQsYQEgIFBhcmFjaGFpbiguLildYCB0byBzZW5kIGZyb20gcGFyYWNoYWluIHRvIHBhcmFjaGFpbiwgb3IgYFtQYXJhY2hhaW4oLi4pXWAgdG8gc2VuZCBmcm9tVCAgcmVsYXkgdG8gcGFyYWNoYWluLlUBLSBgYmVuZWZpY2lhcnlgOiBBIGJlbmVmaWNpYXJ5IGxvY2F0aW9uIGZvciB0aGUgYXNzZXRzIGluIHRoZSBjb250ZXh0IG9mIGBkZXN0YC4gV2lsbJggIGdlbmVyYWxseSBiZSBhbiBgQWNjb3VudElkMzJgIHZhbHVlLlkBLSBgYXNzZXRzYDogVGhlIGFzc2V0cyB0byBiZSB3aXRoZHJhd24uIFRoaXMgc2hvdWxkIGluY2x1ZGUgdGhlIGFzc2V0cyB1c2VkIHRvIHBheSB0aGXIICBmZWUgb24gdGhlIGBkZXN0YCAoYW5kIHBvc3NpYmx5IHJlc2VydmUpIGNoYWlucy5NAS0gYGZlZV9hc3NldF9pdGVtYDogVGhlIGluZGV4IGludG8gYGFzc2V0c2Agb2YgdGhlIGl0ZW0gd2hpY2ggc2hvdWxkIGJlIHVzZWQgdG8gcGF5HCAgZmVlcy5FAS0gYHdlaWdodF9saW1pdGA6IFRoZSByZW1vdGUtc2lkZSB3ZWlnaHQgbGltaXQsIGlmIGFueSwgZm9yIHRoZSBYQ00gZmVlIHB1cmNoYXNlLlxsaW1pdGVkX3RlbGVwb3J0X2Fzc2V0cxQBEGRlc3RZBQFYQm94PFZlcnNpb25lZExvY2F0aW9uPgABLGJlbmVmaWNpYXJ5WQUBWEJveDxWZXJzaW9uZWRMb2NhdGlvbj4AARhhc3NldHPhBwFQQm94PFZlcnNpb25lZEFzc2V0cz4AAThmZWVfYXNzZXRfaXRlbRABDHUzMgABMHdlaWdodF9saW1pdLUGASxXZWlnaHRMaW1pdAAJSBEBVGVsZXBvcnQgc29tZSBhc3NldHMgZnJvbSB0aGUgbG9jYWwgY2hhaW4gdG8gc29tZSBkZXN0aW5hdGlvbiBjaGFpbi4AUQFGZWUgcGF5bWVudCBvbiB0aGUgZGVzdGluYXRpb24gc2lkZSBpcyBtYWRlIGZyb20gdGhlIGFzc2V0IGluIHRoZSBgYXNzZXRzYCB2ZWN0b3Igb2ZhAWluZGV4IGBmZWVfYXNzZXRfaXRlbWAsIHVwIHRvIGVub3VnaCB0byBwYXkgZm9yIGB3ZWlnaHRfbGltaXRgIG9mIHdlaWdodC4gSWYgbW9yZSB3ZWlnaHRZAWlzIG5lZWRlZCB0aGFuIGB3ZWlnaHRfbGltaXRgLCB0aGVuIHRoZSBvcGVyYXRpb24gd2lsbCBmYWlsIGFuZCB0aGUgc2VudCBhc3NldHMgbWF5IGJlIGF0IHJpc2suACkBLSBgb3JpZ2luYDogTXVzdCBiZSBjYXBhYmxlIG9mIHdpdGhkcmF3aW5nIHRoZSBgYXNzZXRzYCBhbmQgZXhlY3V0aW5nIFhDTS4lAS0gYGRlc3RgOiBEZXN0aW5hdGlvbiBjb250ZXh0IGZvciB0aGUgYXNzZXRzLiBXaWxsIHR5cGljYWxseSBiZSBgW1BhcmVudCxhASAgUGFyYWNoYWluKC4uKV1gIHRvIHNlbmQgZnJvbSBwYXJhY2hhaW4gdG8gcGFyYWNoYWluLCBvciBgW1BhcmFjaGFpbiguLildYCB0byBzZW5kIGZyb21UICByZWxheSB0byBwYXJhY2hhaW4uVQEtIGBiZW5lZmljaWFyeWA6IEEgYmVuZWZpY2lhcnkgbG9jYXRpb24gZm9yIHRoZSBhc3NldHMgaW4gdGhlIGNvbnRleHQgb2YgYGRlc3RgLiBXaWxsmCAgZ2VuZXJhbGx5IGJlIGFuIGBBY2NvdW50SWQzMmAgdmFsdWUuWQEtIGBhc3NldHNgOiBUaGUgYXNzZXRzIHRvIGJlIHdpdGhkcmF3bi4gVGhpcyBzaG91bGQgaW5jbHVkZSB0aGUgYXNzZXRzIHVzZWQgdG8gcGF5IHRoZWggIGZlZSBvbiB0aGUgYGRlc3RgIGNoYWluLk0BLSBgZmVlX2Fzc2V0X2l0ZW1gOiBUaGUgaW5kZXggaW50byBgYXNzZXRzYCBvZiB0aGUgaXRlbSB3aGljaCBzaG91bGQgYmUgdXNlZCB0byBwYXkcICBmZWVzLkUBLSBgd2VpZ2h0X2xpbWl0YDogVGhlIHJlbW90ZS1zaWRlIHdlaWdodCBsaW1pdCwgaWYgYW55LCBmb3IgdGhlIFhDTSBmZWUgcHVyY2hhc2UuQGZvcmNlX3N1c3BlbnNpb24EASRzdXNwZW5kZWQgARBib29sAAoQ9FNldCBvciB1bnNldCB0aGUgZ2xvYmFsIHN1c3BlbnNpb24gc3RhdGUgb2YgdGhlIFhDTSBleGVjdXRvci4A3C0gYG9yaWdpbmA6IE11c3QgYmUgYW4gb3JpZ2luIHNwZWNpZmllZCBieSBBZG1pbk9yaWdpbi7QLSBgc3VzcGVuZGVkYDogYHRydWVgIHRvIHN1c3BlbmQsIGBmYWxzZWAgdG8gcmVzdW1lLjx0cmFuc2Zlcl9hc3NldHMUARBkZXN0WQUBWEJveDxWZXJzaW9uZWRMb2NhdGlvbj4AASxiZW5lZmljaWFyeVkFAVhCb3g8VmVyc2lvbmVkTG9jYXRpb24+AAEYYXNzZXRz4QcBUEJveDxWZXJzaW9uZWRBc3NldHM+AAE4ZmVlX2Fzc2V0X2l0ZW0QAQx1MzIAATB3ZWlnaHRfbGltaXS1BgEsV2VpZ2h0TGltaXQAC4RdAVRyYW5zZmVyIHNvbWUgYXNzZXRzIGZyb20gdGhlIGxvY2FsIGNoYWluIHRvIHRoZSBkZXN0aW5hdGlvbiBjaGFpbiB0aHJvdWdoIHRoZWlyIGxvY2FsLNBkZXN0aW5hdGlvbiBvciByZW1vdGUgcmVzZXJ2ZSwgb3IgdGhyb3VnaCB0ZWxlcG9ydHMuAFEBRmVlIHBheW1lbnQgb24gdGhlIGRlc3RpbmF0aW9uIHNpZGUgaXMgbWFkZSBmcm9tIHRoZSBhc3NldCBpbiB0aGUgYGFzc2V0c2AgdmVjdG9yIG9mNQFpbmRleCBgZmVlX2Fzc2V0X2l0ZW1gIChoZW5jZSByZWZlcnJlZCB0byBhcyBgZmVlc2ApLCB1cCB0byBlbm91Z2ggdG8gcGF5IGZvckEBYHdlaWdodF9saW1pdGAgb2Ygd2VpZ2h0LiBJZiBtb3JlIHdlaWdodCBpcyBuZWVkZWQgdGhhbiBgd2VpZ2h0X2xpbWl0YCwgdGhlbiB0aGXcb3BlcmF0aW9uIHdpbGwgZmFpbCBhbmQgdGhlIHNlbnQgYXNzZXRzIG1heSBiZSBhdCByaXNrLgBhAWBhc3NldHNgIChleGNsdWRpbmcgYGZlZXNgKSBtdXN0IGhhdmUgc2FtZSByZXNlcnZlIGxvY2F0aW9uIG9yIG90aGVyd2lzZSBiZSB0ZWxlcG9ydGFibGWwdG8gYGRlc3RgLCBubyBsaW1pdGF0aW9ucyBpbXBvc2VkIG9uIGBmZWVzYC5NASAtIGZvciBsb2NhbCByZXNlcnZlOiB0cmFuc2ZlciBhc3NldHMgdG8gc292ZXJlaWduIGFjY291bnQgb2YgZGVzdGluYXRpb24gY2hhaW4gYW5kTQEgICBmb3J3YXJkIGEgbm90aWZpY2F0aW9uIFhDTSB0byBgZGVzdGAgdG8gbWludCBhbmQgZGVwb3NpdCByZXNlcnZlLWJhc2VkIGFzc2V0cyB0b0QgICBgYmVuZWZpY2lhcnlgLmEBIC0gZm9yIGRlc3RpbmF0aW9uIHJlc2VydmU6IGJ1cm4gbG9jYWwgYXNzZXRzIGFuZCBmb3J3YXJkIGEgbm90aWZpY2F0aW9uIHRvIGBkZXN0YCBjaGFpblkBICAgdG8gd2l0aGRyYXcgdGhlIHJlc2VydmUgYXNzZXRzIGZyb20gdGhpcyBjaGFpbidzIHNvdmVyZWlnbiBhY2NvdW50IGFuZCBkZXBvc2l0IHRoZW1QICAgdG8gYGJlbmVmaWNpYXJ5YC5dASAtIGZvciByZW1vdGUgcmVzZXJ2ZTogYnVybiBsb2NhbCBhc3NldHMsIGZvcndhcmQgWENNIHRvIHJlc2VydmUgY2hhaW4gdG8gbW92ZSByZXNlcnZlc10BICAgZnJvbSB0aGlzIGNoYWluJ3MgU0EgdG8gYGRlc3RgIGNoYWluJ3MgU0EsIGFuZCBmb3J3YXJkIGFub3RoZXIgWENNIHRvIGBkZXN0YCB0byBtaW501CAgIGFuZCBkZXBvc2l0IHJlc2VydmUtYmFzZWQgYXNzZXRzIHRvIGBiZW5lZmljaWFyeWAuUQEgLSBmb3IgdGVsZXBvcnRzOiBidXJuIGxvY2FsIGFzc2V0cyBhbmQgZm9yd2FyZCBYQ00gdG8gYGRlc3RgIGNoYWluIHRvIG1pbnQvdGVsZXBvcnSwICAgYXNzZXRzIGFuZCBkZXBvc2l0IHRoZW0gdG8gYGJlbmVmaWNpYXJ5YC4AKQEtIGBvcmlnaW5gOiBNdXN0IGJlIGNhcGFibGUgb2Ygd2l0aGRyYXdpbmcgdGhlIGBhc3NldHNgIGFuZCBleGVjdXRpbmcgWENNLi0BLSBgZGVzdGA6IERlc3RpbmF0aW9uIGNvbnRleHQgZm9yIHRoZSBhc3NldHMuIFdpbGwgdHlwaWNhbGx5IGJlIGBYMihQYXJlbnQsVQEgIFBhcmFjaGFpbiguLikpYCB0byBzZW5kIGZyb20gcGFyYWNoYWluIHRvIHBhcmFjaGFpbiwgb3IgYFgxKFBhcmFjaGFpbiguLikpYCB0byBzZW5kaCAgZnJvbSByZWxheSB0byBwYXJhY2hhaW4uVQEtIGBiZW5lZmljaWFyeWA6IEEgYmVuZWZpY2lhcnkgbG9jYXRpb24gZm9yIHRoZSBhc3NldHMgaW4gdGhlIGNvbnRleHQgb2YgYGRlc3RgLiBXaWxsmCAgZ2VuZXJhbGx5IGJlIGFuIGBBY2NvdW50SWQzMmAgdmFsdWUuWQEtIGBhc3NldHNgOiBUaGUgYXNzZXRzIHRvIGJlIHdpdGhkcmF3bi4gVGhpcyBzaG91bGQgaW5jbHVkZSB0aGUgYXNzZXRzIHVzZWQgdG8gcGF5IHRoZcggIGZlZSBvbiB0aGUgYGRlc3RgIChhbmQgcG9zc2libHkgcmVzZXJ2ZSkgY2hhaW5zLk0BLSBgZmVlX2Fzc2V0X2l0ZW1gOiBUaGUgaW5kZXggaW50byBgYXNzZXRzYCBvZiB0aGUgaXRlbSB3aGljaCBzaG91bGQgYmUgdXNlZCB0byBwYXkcICBmZWVzLkUBLSBgd2VpZ2h0X2xpbWl0YDogVGhlIHJlbW90ZS1zaWRlIHdlaWdodCBsaW1pdCwgaWYgYW55LCBmb3IgdGhlIFhDTSBmZWUgcHVyY2hhc2UuMGNsYWltX2Fzc2V0cwgBGGFzc2V0c+EHAVBCb3g8VmVyc2lvbmVkQXNzZXRzPgABLGJlbmVmaWNpYXJ5WQUBWEJveDxWZXJzaW9uZWRMb2NhdGlvbj4ADBhVAUNsYWltcyBhc3NldHMgdHJhcHBlZCBvbiB0aGlzIHBhbGxldCBiZWNhdXNlIG9mIGxlZnRvdmVyIGFzc2V0cyBkdXJpbmcgWENNIGV4ZWN1dGlvbi4ArC0gYG9yaWdpbmA6IEFueW9uZSBjYW4gY2FsbCB0aGlzIGV4dHJpbnNpYy5dAS0gYGFzc2V0c2A6IFRoZSBleGFjdCBhc3NldHMgdGhhdCB3ZXJlIHRyYXBwZWQuIFVzZSB0aGUgdmVyc2lvbiB0byBzcGVjaWZ5IHdoYXQgdmVyc2lvbph3YXMgdGhlIGxhdGVzdCB3aGVuIHRoZXkgd2VyZSB0cmFwcGVkLkUBLSBgYmVuZWZpY2lhcnlgOiBUaGUgbG9jYXRpb24vYWNjb3VudCB3aGVyZSB0aGUgY2xhaW1lZCBhc3NldHMgd2lsbCBiZSBkZXBvc2l0ZWQujHRyYW5zZmVyX2Fzc2V0c191c2luZ190eXBlX2FuZF90aGVuHAEQZGVzdFkFAVhCb3g8VmVyc2lvbmVkTG9jYXRpb24+AAEYYXNzZXRz4QcBUEJveDxWZXJzaW9uZWRBc3NldHM+AAFQYXNzZXRzX3RyYW5zZmVyX3R5cGURCAFEQm94PFRyYW5zZmVyVHlwZT4AAThyZW1vdGVfZmVlc19pZBUIAVRCb3g8VmVyc2lvbmVkQXNzZXRJZD4AAUhmZWVzX3RyYW5zZmVyX3R5cGURCAFEQm94PFRyYW5zZmVyVHlwZT4AAUhjdXN0b21feGNtX29uX2Rlc3RNBgFUQm94PFZlcnNpb25lZFhjbTwoKT4+AAEwd2VpZ2h0X2xpbWl0tQYBLFdlaWdodExpbWl0AA3AVQFUcmFuc2ZlciBhc3NldHMgZnJvbSB0aGUgbG9jYWwgY2hhaW4gdG8gdGhlIGRlc3RpbmF0aW9uIGNoYWluIHVzaW5nIGV4cGxpY2l0IHRyYW5zZmVyaHR5cGVzIGZvciBhc3NldHMgYW5kIGZlZXMuAFkBYGFzc2V0c2AgbXVzdCBoYXZlIHNhbWUgcmVzZXJ2ZSBsb2NhdGlvbiBvciBtYXkgYmUgdGVsZXBvcnRhYmxlIHRvIGBkZXN0YC4gQ2FsbGVyIG11c3TscHJvdmlkZSB0aGUgYGFzc2V0c190cmFuc2Zlcl90eXBlYCB0byBiZSB1c2VkIGZvciBgYXNzZXRzYDpRASAtIGBUcmFuc2ZlclR5cGU6OkxvY2FsUmVzZXJ2ZWA6IHRyYW5zZmVyIGFzc2V0cyB0byBzb3ZlcmVpZ24gYWNjb3VudCBvZiBkZXN0aW5hdGlvbk0BICAgY2hhaW4gYW5kIGZvcndhcmQgYSBub3RpZmljYXRpb24gWENNIHRvIGBkZXN0YCB0byBtaW50IGFuZCBkZXBvc2l0IHJlc2VydmUtYmFzZWRsICAgYXNzZXRzIHRvIGBiZW5lZmljaWFyeWAuWQEgLSBgVHJhbnNmZXJUeXBlOjpEZXN0aW5hdGlvblJlc2VydmVgOiBidXJuIGxvY2FsIGFzc2V0cyBhbmQgZm9yd2FyZCBhIG5vdGlmaWNhdGlvbiB0b1kBICAgYGRlc3RgIGNoYWluIHRvIHdpdGhkcmF3IHRoZSByZXNlcnZlIGFzc2V0cyBmcm9tIHRoaXMgY2hhaW4ncyBzb3ZlcmVpZ24gYWNjb3VudCBhbmSEICAgZGVwb3NpdCB0aGVtIHRvIGBiZW5lZmljaWFyeWAuWQEgLSBgVHJhbnNmZXJUeXBlOjpSZW1vdGVSZXNlcnZlKHJlc2VydmUpYDogYnVybiBsb2NhbCBhc3NldHMsIGZvcndhcmQgWENNIHRvIGByZXNlcnZlYGEBICAgY2hhaW4gdG8gbW92ZSByZXNlcnZlcyBmcm9tIHRoaXMgY2hhaW4ncyBTQSB0byBgZGVzdGAgY2hhaW4ncyBTQSwgYW5kIGZvcndhcmQgYW5vdGhlclUBICAgWENNIHRvIGBkZXN0YCB0byBtaW50IGFuZCBkZXBvc2l0IHJlc2VydmUtYmFzZWQgYXNzZXRzIHRvIGBiZW5lZmljaWFyeWAuIFR5cGljYWxseZQgICB0aGUgcmVtb3RlIGByZXNlcnZlYCBpcyBBc3NldCBIdWIuRQEgLSBgVHJhbnNmZXJUeXBlOjpUZWxlcG9ydGA6IGJ1cm4gbG9jYWwgYXNzZXRzIGFuZCBmb3J3YXJkIFhDTSB0byBgZGVzdGAgY2hhaW4gdG/oICAgbWludC90ZWxlcG9ydCBhc3NldHMgYW5kIGRlcG9zaXQgdGhlbSB0byBgYmVuZWZpY2lhcnlgLgBVAU9uIHRoZSBkZXN0aW5hdGlvbiBjaGFpbiwgYXMgd2VsbCBhcyBhbnkgaW50ZXJtZWRpYXJ5IGhvcHMsIGBCdXlFeGVjdXRpb25gIGlzIHVzZWQgdG8hAWJ1eSBleGVjdXRpb24gdXNpbmcgdHJhbnNmZXJyZWQgYGFzc2V0c2AgaWRlbnRpZmllZCBieSBgcmVtb3RlX2ZlZXNfaWRgLlkBTWFrZSBzdXJlIGVub3VnaCBvZiB0aGUgc3BlY2lmaWVkIGByZW1vdGVfZmVlc19pZGAgYXNzZXQgaXMgaW5jbHVkZWQgaW4gdGhlIGdpdmVuIGxpc3RhAW9mIGBhc3NldHNgLiBgcmVtb3RlX2ZlZXNfaWRgIHNob3VsZCBiZSBlbm91Z2ggdG8gcGF5IGZvciBgd2VpZ2h0X2xpbWl0YC4gSWYgbW9yZSB3ZWlnaHRZAWlzIG5lZWRlZCB0aGFuIGB3ZWlnaHRfbGltaXRgLCB0aGVuIHRoZSBvcGVyYXRpb24gd2lsbCBmYWlsIGFuZCB0aGUgc2VudCBhc3NldHMgbWF5IGJlIGF0IHJpc2suAEUBYHJlbW90ZV9mZWVzX2lkYCBtYXkgdXNlIGRpZmZlcmVudCB0cmFuc2ZlciB0eXBlIHRoYW4gcmVzdCBvZiBgYXNzZXRzYCBhbmQgY2FuIGJlnHNwZWNpZmllZCB0aHJvdWdoIGBmZWVzX3RyYW5zZmVyX3R5cGVgLgBhAVRoZSBjYWxsZXIgbmVlZHMgdG8gc3BlY2lmeSB3aGF0IHNob3VsZCBoYXBwZW4gdG8gdGhlIHRyYW5zZmVycmVkIGFzc2V0cyBvbmNlIHRoZXkgcmVhY2hBAXRoZSBgZGVzdGAgY2hhaW4uIFRoaXMgaXMgZG9uZSB0aHJvdWdoIHRoZSBgY3VzdG9tX3hjbV9vbl9kZXN0YCBwYXJhbWV0ZXIsIHdoaWNo/GNvbnRhaW5zIHRoZSBpbnN0cnVjdGlvbnMgdG8gZXhlY3V0ZSBvbiBgZGVzdGAgYXMgYSBmaW5hbCBzdGVwLnwgIFRoaXMgaXMgdXN1YWxseSBhcyBzaW1wbGUgYXM6UQEgIGBYY20odmVjIVtEZXBvc2l0QXNzZXQgeyBhc3NldHM6IFdpbGQoQWxsQ291bnRlZChhc3NldHMubGVuKCkpKSwgYmVuZWZpY2lhcnkgfV0pYCwxASAgYnV0IGNvdWxkIGJlIHNvbWV0aGluZyBtb3JlIGV4b3RpYyBsaWtlIHNlbmRpbmcgdGhlIGBhc3NldHNgIGV2ZW4gZnVydGhlci4AKQEtIGBvcmlnaW5gOiBNdXN0IGJlIGNhcGFibGUgb2Ygd2l0aGRyYXdpbmcgdGhlIGBhc3NldHNgIGFuZCBleGVjdXRpbmcgWENNLiUBLSBgZGVzdGA6IERlc3RpbmF0aW9uIGNvbnRleHQgZm9yIHRoZSBhc3NldHMuIFdpbGwgdHlwaWNhbGx5IGJlIGBbUGFyZW50LGEBICBQYXJhY2hhaW4oLi4pXWAgdG8gc2VuZCBmcm9tIHBhcmFjaGFpbiB0byBwYXJhY2hhaW4sIG9yIGBbUGFyYWNoYWluKC4uKV1gIHRvIHNlbmQgZnJvbT0BICByZWxheSB0byBwYXJhY2hhaW4sIG9yIGAocGFyZW50czogMiwgKEdsb2JhbENvbnNlbnN1cyguLiksIC4uKSlgIHRvIHNlbmQgZnJvbfQgIHBhcmFjaGFpbiBhY3Jvc3MgYSBicmlkZ2UgdG8gYW5vdGhlciBlY29zeXN0ZW0gZGVzdGluYXRpb24uWQEtIGBhc3NldHNgOiBUaGUgYXNzZXRzIHRvIGJlIHdpdGhkcmF3bi4gVGhpcyBzaG91bGQgaW5jbHVkZSB0aGUgYXNzZXRzIHVzZWQgdG8gcGF5IHRoZcggIGZlZSBvbiB0aGUgYGRlc3RgIChhbmQgcG9zc2libHkgcmVzZXJ2ZSkgY2hhaW5zLj0BLSBgYXNzZXRzX3RyYW5zZmVyX3R5cGVgOiBUaGUgWENNIGBUcmFuc2ZlclR5cGVgIHVzZWQgdG8gdHJhbnNmZXIgdGhlIGBhc3NldHNgLiEBLSBgcmVtb3RlX2ZlZXNfaWRgOiBPbmUgb2YgdGhlIGluY2x1ZGVkIGBhc3NldHNgIHRvIGJlIHVzZWQgdG8gcGF5IGZlZXMuSQEtIGBmZWVzX3RyYW5zZmVyX3R5cGVgOiBUaGUgWENNIGBUcmFuc2ZlclR5cGVgIHVzZWQgdG8gdHJhbnNmZXIgdGhlIGBmZWVzYCBhc3NldHMuWQEtIGBjdXN0b21feGNtX29uX2Rlc3RgOiBUaGUgWENNIHRvIGJlIGV4ZWN1dGVkIG9uIGBkZXN0YCBjaGFpbiBhcyB0aGUgbGFzdCBzdGVwIG9mIHRoZVkBICB0cmFuc2Zlciwgd2hpY2ggYWxzbyBkZXRlcm1pbmVzIHdoYXQgaGFwcGVucyB0byB0aGUgYXNzZXRzIG9uIHRoZSBkZXN0aW5hdGlvbiBjaGFpbi5FAS0gYHdlaWdodF9saW1pdGA6IFRoZSByZW1vdGUtc2lkZSB3ZWlnaHQgbGltaXQsIGlmIGFueSwgZm9yIHRoZSBYQ00gZmVlIHB1cmNoYXNlLlBhZGRfYXV0aG9yaXplZF9hbGlhcwgBHGFsaWFzZXJZBQFYQm94PFZlcnNpb25lZExvY2F0aW9uPgABHGV4cGlyZXMZCAEsT3B0aW9uPHU2ND4ADixdAUF1dGhvcml6ZSBhbm90aGVyIGBhbGlhc2VyYCBsb2NhdGlvbiB0byBhbGlhcyBpbnRvIHRoZSBsb2NhbCBgb3JpZ2luYCBtYWtpbmcgdGhpcyBjYWxsLikBVGhlIGBhbGlhc2VyYCBpcyBvbmx5IGF1dGhvcml6ZWQgdW50aWwgdGhlIHByb3ZpZGVkIGBleHBpcnlgIGJsb2NrIG51bWJlci5JAVRoZSBjYWxsIGNhbiBhbHNvIGJlIHVzZWQgZm9yIGEgcHJldmlvdXNseSBhdXRob3JpemVkIGFsaWFzIGluIG9yZGVyIHRvIHVwZGF0ZSBpdHNYYGV4cGlyeWAgYmxvY2sgbnVtYmVyLgBRAVVzdWFsbHkgdXNlZnVsIHRvIGFsbG93IHlvdXIgbG9jYWwgYWNjb3VudCB0byBiZSBhbGlhc2VkIGludG8gZnJvbSBhIHJlbW90ZSBsb2NhdGlvbvRhbHNvIHVuZGVyIHlvdXIgY29udHJvbCAobGlrZSB5b3VyIGFjY291bnQgb24gYW5vdGhlciBjaGFpbikuAFEBV0FSTklORzogbWFrZSBzdXJlIHRoZSBjYWxsZXIgYG9yaWdpbmAgKHlvdSkgdHJ1c3RzIHRoZSBgYWxpYXNlcmAgbG9jYXRpb24gdG8gYWN0IGluWQF0aGVpci95b3VyIG5hbWUuIE9uY2UgYXV0aG9yaXplZCB1c2luZyB0aGlzIGNhbGwsIHRoZSBgYWxpYXNlcmAgY2FuIGZyZWVseSBpbXBlcnNvbmF0ZdRgb3JpZ2luYCBpbiBYQ00gcHJvZ3JhbXMgZXhlY3V0ZWQgb24gdGhlIGxvY2FsIGNoYWluLlxyZW1vdmVfYXV0aG9yaXplZF9hbGlhcwQBHGFsaWFzZXJZBQFYQm94PFZlcnNpb25lZExvY2F0aW9uPgAPCF0BUmVtb3ZlIGEgcHJldmlvdXNseSBhdXRob3JpemVkIGBhbGlhc2VyYCBmcm9tIHRoZSBsaXN0IG9mIGxvY2F0aW9ucyB0aGF0IGNhbiBhbGlhcyBpbnRvkHRoZSBsb2NhbCBgb3JpZ2luYCBtYWtpbmcgdGhpcyBjYWxsLnRyZW1vdmVfYWxsX2F1dGhvcml6ZWRfYWxpYXNlcwAQCEkBUmVtb3ZlIGFsbCBwcmV2aW91c2x5IGF1dGhvcml6ZWQgYGFsaWFzZXJgcyB0aGF0IGNhbiBhbGlhcyBpbnRvIHRoZSBsb2NhbCBgb3JpZ2luYERtYWtpbmcgdGhpcyBjYWxsLgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy7hBwgMeGNtPFZlcnNpb25lZEFzc2V0cwABDAhWMwQAXQYBPHYzOjpNdWx0aUFzc2V0cwADAAhWNAQAxQYBKHY0OjpBc3NldHMABAAIVjUEAA0HASh2NTo6QXNzZXRzAAUAAOUHCAx4Y20wVmVyc2lvbmVkWGNtBCxSdW50aW1lQ2FsbAABDAhWMwQA6QcBUHYzOjpYY208UnVudGltZUNhbGw+AAMACFY0BAD5BwFQdjQ6OlhjbTxSdW50aW1lQ2FsbD4ABAAIVjUEAAUIAVB2NTo6WGNtPFJ1bnRpbWVDYWxsPgAFAADpBwwMeGNtCHYzDFhjbQQQQ2FsbAAABADtBwFYVmVjPEluc3RydWN0aW9uPENhbGw+PgAA7QcAAALxBwDxBwwMeGNtCHYzLEluc3RydWN0aW9uBBBDYWxsAAHANFdpdGhkcmF3QXNzZXQEAF0GASxNdWx0aUFzc2V0cwAAAFRSZXNlcnZlQXNzZXREZXBvc2l0ZWQEAF0GASxNdWx0aUFzc2V0cwABAFhSZWNlaXZlVGVsZXBvcnRlZEFzc2V0BABdBgEsTXVsdGlBc3NldHMAAgA0UXVlcnlSZXNwb25zZRABIHF1ZXJ5X2lkLAEcUXVlcnlJZAABIHJlc3BvbnNlcQYBIFJlc3BvbnNlAAEobWF4X3dlaWdodCgBGFdlaWdodAABHHF1ZXJpZXKZBgFUT3B0aW9uPE11bHRpTG9jYXRpb24+AAMANFRyYW5zZmVyQXNzZXQIARhhc3NldHNdBgEsTXVsdGlBc3NldHMAASxiZW5lZmljaWFyeQUFATRNdWx0aUxvY2F0aW9uAAQAUFRyYW5zZmVyUmVzZXJ2ZUFzc2V0DAEYYXNzZXRzXQYBLE11bHRpQXNzZXRzAAEQZGVzdAUFATRNdWx0aUxvY2F0aW9uAAEMeGNtUQYBHFhjbTwoKT4ABQAgVHJhbnNhY3QMASxvcmlnaW5fa2luZJ0GAShPcmlnaW5LaW5kAAFYcmVxdWlyZV93ZWlnaHRfYXRfbW9zdCgBGFdlaWdodAABEGNhbGz1BwFMRG91YmxlRW5jb2RlZDxDYWxsPgAGAGRIcm1wTmV3Q2hhbm5lbE9wZW5SZXF1ZXN0DAEYc2VuZGVyyQEBDHUzMgABQG1heF9tZXNzYWdlX3NpemXJAQEMdTMyAAEwbWF4X2NhcGFjaXR5yQEBDHUzMgAHAExIcm1wQ2hhbm5lbEFjY2VwdGVkBAEkcmVjaXBpZW50yQEBDHUzMgAIAEhIcm1wQ2hhbm5lbENsb3NpbmcMASRpbml0aWF0b3LJAQEMdTMyAAEYc2VuZGVyyQEBDHUzMgABJHJlY2lwaWVudMkBAQx1MzIACQAsQ2xlYXJPcmlnaW4ACgA0RGVzY2VuZE9yaWdpbgQACQUBVEludGVyaW9yTXVsdGlMb2NhdGlvbgALACxSZXBvcnRFcnJvcgQApQYBRFF1ZXJ5UmVzcG9uc2VJbmZvAAwAMERlcG9zaXRBc3NldAgBGGFzc2V0c6kGAUBNdWx0aUFzc2V0RmlsdGVyAAEsYmVuZWZpY2lhcnkFBQE0TXVsdGlMb2NhdGlvbgANAExEZXBvc2l0UmVzZXJ2ZUFzc2V0DAEYYXNzZXRzqQYBQE11bHRpQXNzZXRGaWx0ZXIAARBkZXN0BQUBNE11bHRpTG9jYXRpb24AAQx4Y21RBgEcWGNtPCgpPgAOADRFeGNoYW5nZUFzc2V0DAEQZ2l2ZakGAUBNdWx0aUFzc2V0RmlsdGVyAAEQd2FudF0GASxNdWx0aUFzc2V0cwABHG1heGltYWwgARBib29sAA8AXEluaXRpYXRlUmVzZXJ2ZVdpdGhkcmF3DAEYYXNzZXRzqQYBQE11bHRpQXNzZXRGaWx0ZXIAARxyZXNlcnZlBQUBNE11bHRpTG9jYXRpb24AAQx4Y21RBgEcWGNtPCgpPgAQAEBJbml0aWF0ZVRlbGVwb3J0DAEYYXNzZXRzqQYBQE11bHRpQXNzZXRGaWx0ZXIAARBkZXN0BQUBNE11bHRpTG9jYXRpb24AAQx4Y21RBgEcWGNtPCgpPgARADRSZXBvcnRIb2xkaW5nCAE0cmVzcG9uc2VfaW5mb6UGAURRdWVyeVJlc3BvbnNlSW5mbwABGGFzc2V0c6kGAUBNdWx0aUFzc2V0RmlsdGVyABIAMEJ1eUV4ZWN1dGlvbggBEGZlZXNlBgEoTXVsdGlBc3NldAABMHdlaWdodF9saW1pdLUGASxXZWlnaHRMaW1pdAATADRSZWZ1bmRTdXJwbHVzABQAPFNldEVycm9ySGFuZGxlcgQA6QcBJFhjbTxDYWxsPgAVACxTZXRBcHBlbmRpeAQA6QcBJFhjbTxDYWxsPgAWAChDbGVhckVycm9yABcAKENsYWltQXNzZXQIARhhc3NldHNdBgEsTXVsdGlBc3NldHMAARh0aWNrZXQFBQE0TXVsdGlMb2NhdGlvbgAYABBUcmFwBAAsAQx1NjQAGQBAU3Vic2NyaWJlVmVyc2lvbggBIHF1ZXJ5X2lkLAEcUXVlcnlJZAABTG1heF9yZXNwb25zZV93ZWlnaHQoARhXZWlnaHQAGgBIVW5zdWJzY3JpYmVWZXJzaW9uABsAJEJ1cm5Bc3NldAQAXQYBLE11bHRpQXNzZXRzABwALEV4cGVjdEFzc2V0BABdBgEsTXVsdGlBc3NldHMAHQAwRXhwZWN0T3JpZ2luBACZBgFUT3B0aW9uPE11bHRpTG9jYXRpb24+AB4ALEV4cGVjdEVycm9yBAB1BgFQT3B0aW9uPCh1MzIsIEVycm9yKT4AHwBQRXhwZWN0VHJhbnNhY3RTdGF0dXMEAJEGAThNYXliZUVycm9yQ29kZQAgACxRdWVyeVBhbGxldAgBLG1vZHVsZV9uYW1lOAEcVmVjPHU4PgABNHJlc3BvbnNlX2luZm+lBgFEUXVlcnlSZXNwb25zZUluZm8AIQAwRXhwZWN0UGFsbGV0FAEUaW5kZXjJAQEMdTMyAAEQbmFtZTgBHFZlYzx1OD4AASxtb2R1bGVfbmFtZTgBHFZlYzx1OD4AASxjcmF0ZV9tYWpvcskBAQx1MzIAATxtaW5fY3JhdGVfbWlub3LJAQEMdTMyACIAUFJlcG9ydFRyYW5zYWN0U3RhdHVzBAClBgFEUXVlcnlSZXNwb25zZUluZm8AIwBMQ2xlYXJUcmFuc2FjdFN0YXR1cwAkADxVbml2ZXJzYWxPcmlnaW4EAA0FASBKdW5jdGlvbgAlADRFeHBvcnRNZXNzYWdlDAEcbmV0d29yaxUFASROZXR3b3JrSWQAASxkZXN0aW5hdGlvbgkFAVRJbnRlcmlvck11bHRpTG9jYXRpb24AAQx4Y21RBgEcWGNtPCgpPgAmACRMb2NrQXNzZXQIARRhc3NldGUGAShNdWx0aUFzc2V0AAEgdW5sb2NrZXIFBQE0TXVsdGlMb2NhdGlvbgAnACxVbmxvY2tBc3NldAgBFGFzc2V0ZQYBKE11bHRpQXNzZXQAARh0YXJnZXQFBQE0TXVsdGlMb2NhdGlvbgAoADhOb3RlVW5sb2NrYWJsZQgBFGFzc2V0ZQYBKE11bHRpQXNzZXQAARRvd25lcgUFATRNdWx0aUxvY2F0aW9uACkANFJlcXVlc3RVbmxvY2sIARRhc3NldGUGAShNdWx0aUFzc2V0AAEYbG9ja2VyBQUBNE11bHRpTG9jYXRpb24AKgAsU2V0RmVlc01vZGUEATBqaXRfd2l0aGRyYXcgARBib29sACsAIFNldFRvcGljBAAEASBbdTg7IDMyXQAsAChDbGVhclRvcGljAC0ALEFsaWFzT3JpZ2luBAAFBQE0TXVsdGlMb2NhdGlvbgAuADxVbnBhaWRFeGVjdXRpb24IATB3ZWlnaHRfbGltaXS1BgEsV2VpZ2h0TGltaXQAATBjaGVja19vcmlnaW6ZBgFUT3B0aW9uPE11bHRpTG9jYXRpb24+AC8AAPUHDAx4Y204ZG91YmxlX2VuY29kZWQ0RG91YmxlRW5jb2RlZAQEVAAABAEcZW5jb2RlZDgBHFZlYzx1OD4AAPkHDCxzdGFnaW5nX3hjbQh2NAxYY20EEENhbGwAAAQA/QcBWFZlYzxJbnN0cnVjdGlvbjxDYWxsPj4AAP0HAAACAQgAAQgMLHN0YWdpbmdfeGNtCHY0LEluc3RydWN0aW9uBBBDYWxsAAHANFdpdGhkcmF3QXNzZXQEAMUGARhBc3NldHMAAABUUmVzZXJ2ZUFzc2V0RGVwb3NpdGVkBADFBgEYQXNzZXRzAAEAWFJlY2VpdmVUZWxlcG9ydGVkQXNzZXQEAMUGARhBc3NldHMAAgA0UXVlcnlSZXNwb25zZRABIHF1ZXJ5X2lkLAEcUXVlcnlJZAABIHJlc3BvbnNl2QYBIFJlc3BvbnNlAAEobWF4X3dlaWdodCgBGFdlaWdodAABHHF1ZXJpZXLtBgFAT3B0aW9uPExvY2F0aW9uPgADADRUcmFuc2ZlckFzc2V0CAEYYXNzZXRzxQYBGEFzc2V0cwABLGJlbmVmaWNpYXJ5HQUBIExvY2F0aW9uAAQAUFRyYW5zZmVyUmVzZXJ2ZUFzc2V0DAEYYXNzZXRzxQYBGEFzc2V0cwABEGRlc3QdBQEgTG9jYXRpb24AAQx4Y225BgEcWGNtPCgpPgAFACBUcmFuc2FjdAwBLG9yaWdpbl9raW5knQYBKE9yaWdpbktpbmQAAVhyZXF1aXJlX3dlaWdodF9hdF9tb3N0KAEYV2VpZ2h0AAEQY2FsbPUHAUxEb3VibGVFbmNvZGVkPENhbGw+AAYAZEhybXBOZXdDaGFubmVsT3BlblJlcXVlc3QMARhzZW5kZXLJAQEMdTMyAAFAbWF4X21lc3NhZ2Vfc2l6ZckBAQx1MzIAATBtYXhfY2FwYWNpdHnJAQEMdTMyAAcATEhybXBDaGFubmVsQWNjZXB0ZWQEASRyZWNpcGllbnTJAQEMdTMyAAgASEhybXBDaGFubmVsQ2xvc2luZwwBJGluaXRpYXRvcskBAQx1MzIAARhzZW5kZXLJAQEMdTMyAAEkcmVjaXBpZW50yQEBDHUzMgAJACxDbGVhck9yaWdpbgAKADREZXNjZW5kT3JpZ2luBAAhBQFASW50ZXJpb3JMb2NhdGlvbgALACxSZXBvcnRFcnJvcgQA8QYBRFF1ZXJ5UmVzcG9uc2VJbmZvAAwAMERlcG9zaXRBc3NldAgBGGFzc2V0c/UGASxBc3NldEZpbHRlcgABLGJlbmVmaWNpYXJ5HQUBIExvY2F0aW9uAA0ATERlcG9zaXRSZXNlcnZlQXNzZXQMARhhc3NldHP1BgEsQXNzZXRGaWx0ZXIAARBkZXN0HQUBIExvY2F0aW9uAAEMeGNtuQYBHFhjbTwoKT4ADgA0RXhjaGFuZ2VBc3NldAwBEGdpdmX1BgEsQXNzZXRGaWx0ZXIAARB3YW50xQYBGEFzc2V0cwABHG1heGltYWwgARBib29sAA8AXEluaXRpYXRlUmVzZXJ2ZVdpdGhkcmF3DAEYYXNzZXRz9QYBLEFzc2V0RmlsdGVyAAEccmVzZXJ2ZR0FASBMb2NhdGlvbgABDHhjbbkGARxYY208KCk+ABAAQEluaXRpYXRlVGVsZXBvcnQMARhhc3NldHP1BgEsQXNzZXRGaWx0ZXIAARBkZXN0HQUBIExvY2F0aW9uAAEMeGNtuQYBHFhjbTwoKT4AEQA0UmVwb3J0SG9sZGluZwgBNHJlc3BvbnNlX2luZm/xBgFEUXVlcnlSZXNwb25zZUluZm8AARhhc3NldHP1BgEsQXNzZXRGaWx0ZXIAEgAwQnV5RXhlY3V0aW9uCAEQZmVlc80GARRBc3NldAABMHdlaWdodF9saW1pdLUGASxXZWlnaHRMaW1pdAATADRSZWZ1bmRTdXJwbHVzABQAPFNldEVycm9ySGFuZGxlcgQA+QcBJFhjbTxDYWxsPgAVACxTZXRBcHBlbmRpeAQA+QcBJFhjbTxDYWxsPgAWAChDbGVhckVycm9yABcAKENsYWltQXNzZXQIARhhc3NldHPFBgEYQXNzZXRzAAEYdGlja2V0HQUBIExvY2F0aW9uABgAEFRyYXAEACwBDHU2NAAZAEBTdWJzY3JpYmVWZXJzaW9uCAEgcXVlcnlfaWQsARxRdWVyeUlkAAFMbWF4X3Jlc3BvbnNlX3dlaWdodCgBGFdlaWdodAAaAEhVbnN1YnNjcmliZVZlcnNpb24AGwAkQnVybkFzc2V0BADFBgEYQXNzZXRzABwALEV4cGVjdEFzc2V0BADFBgEYQXNzZXRzAB0AMEV4cGVjdE9yaWdpbgQA7QYBQE9wdGlvbjxMb2NhdGlvbj4AHgAsRXhwZWN0RXJyb3IEAHUGAVBPcHRpb248KHUzMiwgRXJyb3IpPgAfAFBFeHBlY3RUcmFuc2FjdFN0YXR1cwQAkQYBOE1heWJlRXJyb3JDb2RlACAALFF1ZXJ5UGFsbGV0CAEsbW9kdWxlX25hbWU4ARxWZWM8dTg+AAE0cmVzcG9uc2VfaW5mb/EGAURRdWVyeVJlc3BvbnNlSW5mbwAhADBFeHBlY3RQYWxsZXQUARRpbmRleMkBAQx1MzIAARBuYW1lOAEcVmVjPHU4PgABLG1vZHVsZV9uYW1lOAEcVmVjPHU4PgABLGNyYXRlX21ham9yyQEBDHUzMgABPG1pbl9jcmF0ZV9taW5vcskBAQx1MzIAIgBQUmVwb3J0VHJhbnNhY3RTdGF0dXMEAPEGAURRdWVyeVJlc3BvbnNlSW5mbwAjAExDbGVhclRyYW5zYWN0U3RhdHVzACQAPFVuaXZlcnNhbE9yaWdpbgQAKQUBIEp1bmN0aW9uACUANEV4cG9ydE1lc3NhZ2UMARxuZXR3b3JrMQUBJE5ldHdvcmtJZAABLGRlc3RpbmF0aW9uIQUBQEludGVyaW9yTG9jYXRpb24AAQx4Y225BgEcWGNtPCgpPgAmACRMb2NrQXNzZXQIARRhc3NldM0GARRBc3NldAABIHVubG9ja2VyHQUBIExvY2F0aW9uACcALFVubG9ja0Fzc2V0CAEUYXNzZXTNBgEUQXNzZXQAARh0YXJnZXQdBQEgTG9jYXRpb24AKAA4Tm90ZVVubG9ja2FibGUIARRhc3NldM0GARRBc3NldAABFG93bmVyHQUBIExvY2F0aW9uACkANFJlcXVlc3RVbmxvY2sIARRhc3NldM0GARRBc3NldAABGGxvY2tlch0FASBMb2NhdGlvbgAqACxTZXRGZWVzTW9kZQQBMGppdF93aXRoZHJhdyABEGJvb2wAKwAgU2V0VG9waWMEAAQBIFt1ODsgMzJdACwAKENsZWFyVG9waWMALQAsQWxpYXNPcmlnaW4EAB0FASBMb2NhdGlvbgAuADxVbnBhaWRFeGVjdXRpb24IATB3ZWlnaHRfbGltaXS1BgEsV2VpZ2h0TGltaXQAATBjaGVja19vcmlnaW7tBgFAT3B0aW9uPExvY2F0aW9uPgAvAAAFCAwsc3RhZ2luZ194Y20IdjUMWGNtBBBDYWxsAAAEAAkIAVhWZWM8SW5zdHJ1Y3Rpb248Q2FsbD4+AAAJCAAAAg0IAA0IDCxzdGFnaW5nX3hjbQh2NSxJbnN0cnVjdGlvbgQQQ2FsbAAB0DRXaXRoZHJhd0Fzc2V0BAANBwEYQXNzZXRzAAAAVFJlc2VydmVBc3NldERlcG9zaXRlZAQADQcBGEFzc2V0cwABAFhSZWNlaXZlVGVsZXBvcnRlZEFzc2V0BAANBwEYQXNzZXRzAAIANFF1ZXJ5UmVzcG9uc2UQASBxdWVyeV9pZCwBHFF1ZXJ5SWQAASByZXNwb25zZSEHASBSZXNwb25zZQABKG1heF93ZWlnaHQoARhXZWlnaHQAARxxdWVyaWVyQQcBQE9wdGlvbjxMb2NhdGlvbj4AAwA0VHJhbnNmZXJBc3NldAgBGGFzc2V0cw0HARhBc3NldHMAASxiZW5lZmljaWFyebkCASBMb2NhdGlvbgAEAFBUcmFuc2ZlclJlc2VydmVBc3NldAwBGGFzc2V0cw0HARhBc3NldHMAARBkZXN0uQIBIExvY2F0aW9uAAEMeGNtAQcBHFhjbTwoKT4ABQAgVHJhbnNhY3QMASxvcmlnaW5fa2luZJ0GAShPcmlnaW5LaW5kAAFMZmFsbGJhY2tfbWF4X3dlaWdodEUHAThPcHRpb248V2VpZ2h0PgABEGNhbGz1BwFMRG91YmxlRW5jb2RlZDxDYWxsPgAGAGRIcm1wTmV3Q2hhbm5lbE9wZW5SZXF1ZXN0DAEYc2VuZGVyyQEBDHUzMgABQG1heF9tZXNzYWdlX3NpemXJAQEMdTMyAAEwbWF4X2NhcGFjaXR5yQEBDHUzMgAHAExIcm1wQ2hhbm5lbEFjY2VwdGVkBAEkcmVjaXBpZW50yQEBDHUzMgAIAEhIcm1wQ2hhbm5lbENsb3NpbmcMASRpbml0aWF0b3LJAQEMdTMyAAEYc2VuZGVyyQEBDHUzMgABJHJlY2lwaWVudMkBAQx1MzIACQAsQ2xlYXJPcmlnaW4ACgA0RGVzY2VuZE9yaWdpbgQAvQIBQEludGVyaW9yTG9jYXRpb24ACwAsUmVwb3J0RXJyb3IEAEkHAURRdWVyeVJlc3BvbnNlSW5mbwAMADBEZXBvc2l0QXNzZXQIARhhc3NldHNNBwEsQXNzZXRGaWx0ZXIAASxiZW5lZmljaWFyebkCASBMb2NhdGlvbgANAExEZXBvc2l0UmVzZXJ2ZUFzc2V0DAEYYXNzZXRzTQcBLEFzc2V0RmlsdGVyAAEQZGVzdLkCASBMb2NhdGlvbgABDHhjbQEHARxYY208KCk+AA4ANEV4Y2hhbmdlQXNzZXQMARBnaXZlTQcBLEFzc2V0RmlsdGVyAAEQd2FudA0HARhBc3NldHMAARxtYXhpbWFsIAEQYm9vbAAPAFxJbml0aWF0ZVJlc2VydmVXaXRoZHJhdwwBGGFzc2V0c00HASxBc3NldEZpbHRlcgABHHJlc2VydmW5AgEgTG9jYXRpb24AAQx4Y20BBwEcWGNtPCgpPgAQAEBJbml0aWF0ZVRlbGVwb3J0DAEYYXNzZXRzTQcBLEFzc2V0RmlsdGVyAAEQZGVzdLkCASBMb2NhdGlvbgABDHhjbQEHARxYY208KCk+ABEANFJlcG9ydEhvbGRpbmcIATRyZXNwb25zZV9pbmZvSQcBRFF1ZXJ5UmVzcG9uc2VJbmZvAAEYYXNzZXRzTQcBLEFzc2V0RmlsdGVyABIAMEJ1eUV4ZWN1dGlvbggBEGZlZXMVBwEUQXNzZXQAATB3ZWlnaHRfbGltaXS1BgEsV2VpZ2h0TGltaXQAEwA0UmVmdW5kU3VycGx1cwAUADxTZXRFcnJvckhhbmRsZXIEAAUIASRYY208Q2FsbD4AFQAsU2V0QXBwZW5kaXgEAAUIASRYY208Q2FsbD4AFgAoQ2xlYXJFcnJvcgAXAChDbGFpbUFzc2V0CAEYYXNzZXRzDQcBGEFzc2V0cwABGHRpY2tldLkCASBMb2NhdGlvbgAYABBUcmFwBAAsAQx1NjQAGQBAU3Vic2NyaWJlVmVyc2lvbggBIHF1ZXJ5X2lkLAEcUXVlcnlJZAABTG1heF9yZXNwb25zZV93ZWlnaHQoARhXZWlnaHQAGgBIVW5zdWJzY3JpYmVWZXJzaW9uABsAJEJ1cm5Bc3NldAQADQcBGEFzc2V0cwAcACxFeHBlY3RBc3NldAQADQcBGEFzc2V0cwAdADBFeHBlY3RPcmlnaW4EAEEHAUBPcHRpb248TG9jYXRpb24+AB4ALEV4cGVjdEVycm9yBAAlBwFQT3B0aW9uPCh1MzIsIEVycm9yKT4AHwBQRXhwZWN0VHJhbnNhY3RTdGF0dXMEAJEGAThNYXliZUVycm9yQ29kZQAgACxRdWVyeVBhbGxldAgBLG1vZHVsZV9uYW1lOAEcVmVjPHU4PgABNHJlc3BvbnNlX2luZm9JBwFEUXVlcnlSZXNwb25zZUluZm8AIQAwRXhwZWN0UGFsbGV0FAEUaW5kZXjJAQEMdTMyAAEQbmFtZTgBHFZlYzx1OD4AASxtb2R1bGVfbmFtZTgBHFZlYzx1OD4AASxjcmF0ZV9tYWpvcskBAQx1MzIAATxtaW5fY3JhdGVfbWlub3LJAQEMdTMyACIAUFJlcG9ydFRyYW5zYWN0U3RhdHVzBABJBwFEUXVlcnlSZXNwb25zZUluZm8AIwBMQ2xlYXJUcmFuc2FjdFN0YXR1cwAkADxVbml2ZXJzYWxPcmlnaW4EAMUCASBKdW5jdGlvbgAlADRFeHBvcnRNZXNzYWdlDAEcbmV0d29ya80CASROZXR3b3JrSWQAASxkZXN0aW5hdGlvbr0CAUBJbnRlcmlvckxvY2F0aW9uAAEMeGNtAQcBHFhjbTwoKT4AJgAkTG9ja0Fzc2V0CAEUYXNzZXQVBwEUQXNzZXQAASB1bmxvY2tlcrkCASBMb2NhdGlvbgAnACxVbmxvY2tBc3NldAgBFGFzc2V0FQcBFEFzc2V0AAEYdGFyZ2V0uQIBIExvY2F0aW9uACgAOE5vdGVVbmxvY2thYmxlCAEUYXNzZXQVBwEUQXNzZXQAARRvd25lcrkCASBMb2NhdGlvbgApADRSZXF1ZXN0VW5sb2NrCAEUYXNzZXQVBwEUQXNzZXQAARhsb2NrZXK5AgEgTG9jYXRpb24AKgAsU2V0RmVlc01vZGUEATBqaXRfd2l0aGRyYXcgARBib29sACsAIFNldFRvcGljBAAEASBbdTg7IDMyXQAsAChDbGVhclRvcGljAC0ALEFsaWFzT3JpZ2luBAC5AgEgTG9jYXRpb24ALgA8VW5wYWlkRXhlY3V0aW9uCAEwd2VpZ2h0X2xpbWl0tQYBLFdlaWdodExpbWl0AAEwY2hlY2tfb3JpZ2luQQcBQE9wdGlvbjxMb2NhdGlvbj4ALwAcUGF5RmVlcwQBFGFzc2V0FQcBFEFzc2V0ADAAQEluaXRpYXRlVHJhbnNmZXIUASxkZXN0aW5hdGlvbrkCASBMb2NhdGlvbgABLHJlbW90ZV9mZWVzWQcBbE9wdGlvbjxBc3NldFRyYW5zZmVyRmlsdGVyPgABPHByZXNlcnZlX29yaWdpbiABEGJvb2wAARhhc3NldHNhBwHgQm91bmRlZFZlYzxBc3NldFRyYW5zZmVyRmlsdGVyLCBNYXhBc3NldFRyYW5zZmVyRmlsdGVycz4AAShyZW1vdGVfeGNtAQcBHFhjbTwoKT4AMQBERXhlY3V0ZVdpdGhPcmlnaW4IAURkZXNjZW5kYW50X29yaWdpbmkHAWBPcHRpb248SW50ZXJpb3JMb2NhdGlvbj4AAQx4Y20FCAEkWGNtPENhbGw+ADIAIFNldEhpbnRzBAEUaGludHNtBwGEQm91bmRlZFZlYzxIaW50LCBIaW50TnVtVmFyaWFudHM+ADMAABEIEFBzdGFnaW5nX3hjbV9leGVjdXRvchh0cmFpdHM4YXNzZXRfdHJhbnNmZXIwVHJhbnNmZXJUeXBlAAEQIFRlbGVwb3J0AAAAMExvY2FsUmVzZXJ2ZQABAEhEZXN0aW5hdGlvblJlc2VydmUAAgA0UmVtb3RlUmVzZXJ2ZQQAWQUBRFZlcnNpb25lZExvY2F0aW9uAAMAABUICAx4Y21AVmVyc2lvbmVkQXNzZXRJZAABDAhWMwQAGQUBLHYzOjpBc3NldElkAAMACFY0BABRBQEsdjQ6OkFzc2V0SWQABAAIVjUEAFUFASx2NTo6QXNzZXRJZAAFAAAZCAQYT3B0aW9uBARUATABCBBOb25lAAAAEFNvbWUEADAAAAEAAB0IDFBwYWxsZXRfbWVzc2FnZV9xdWV1ZRhwYWxsZXQQQ2FsbAQEVAABCCRyZWFwX3BhZ2UIAThtZXNzYWdlX29yaWdpbiEIAUhNZXNzYWdlT3JpZ2luT2Y8VD4AAShwYWdlX2luZGV4EAEkUGFnZUluZGV4AAAEPQFSZW1vdmUgYSBwYWdlIHdoaWNoIGhhcyBubyBtb3JlIG1lc3NhZ2VzIHJlbWFpbmluZyB0byBiZSBwcm9jZXNzZWQgb3IgaXMgc3RhbGUuSGV4ZWN1dGVfb3ZlcndlaWdodBABOG1lc3NhZ2Vfb3JpZ2luIQgBSE1lc3NhZ2VPcmlnaW5PZjxUPgABEHBhZ2UQASRQYWdlSW5kZXgAARRpbmRleBABHFQ6OlNpemUAATB3ZWlnaHRfbGltaXQoARhXZWlnaHQAATR4RXhlY3V0ZSBhbiBvdmVyd2VpZ2h0IG1lc3NhZ2UuAE0BVGVtcG9yYXJ5IHByb2Nlc3NpbmcgZXJyb3JzIHdpbGwgYmUgcHJvcGFnYXRlZCB3aGVyZWFzIHBlcm1hbmVudCBlcnJvcnMgYXJlIHRyZWF0ZWRUYXMgc3VjY2VzcyBjb25kaXRpb24uAHQtIGBvcmlnaW5gOiBNdXN0IGJlIGBTaWduZWRgLjUBLSBgbWVzc2FnZV9vcmlnaW5gOiBUaGUgb3JpZ2luIGZyb20gd2hpY2ggdGhlIG1lc3NhZ2UgdG8gYmUgZXhlY3V0ZWQgYXJyaXZlZC49AS0gYHBhZ2VgOiBUaGUgcGFnZSBpbiB0aGUgcXVldWUgaW4gd2hpY2ggdGhlIG1lc3NhZ2UgdG8gYmUgZXhlY3V0ZWQgaXMgc2l0dGluZy4JAS0gYGluZGV4YDogVGhlIGluZGV4IGludG8gdGhlIHF1ZXVlIG9mIHRoZSBtZXNzYWdlIHRvIGJlIGV4ZWN1dGVkLlkBLSBgd2VpZ2h0X2xpbWl0YDogVGhlIG1heGltdW0gYW1vdW50IG9mIHdlaWdodCBhbGxvd2VkIHRvIGJlIGNvbnN1bWVkIGluIHRoZSBleGVjdXRpb25EICBvZiB0aGUgbWVzc2FnZS4A9EJlbmNobWFyayBjb21wbGV4aXR5IGNvbnNpZGVyYXRpb25zOiBPKGluZGV4ICsgd2VpZ2h0X2xpbWl0KS4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMuIQgMbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucyRpbmNsdXNpb25YQWdncmVnYXRlTWVzc2FnZU9yaWdpbgABBAxVbXAEACUIAShVbXBRdWV1ZUlkAAAAACUIDGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMkaW5jbHVzaW9uKFVtcFF1ZXVlSWQAAQQQUGFyYQQAsQIBGFBhcmFJZAAAAAApCAxEcGFsbGV0X2Fzc2V0X3JhdGUYcGFsbGV0EENhbGwEBFQAAQwYY3JlYXRlCAEoYXNzZXRfa2luZAEFAURCb3g8VDo6QXNzZXRLaW5kPgABEHJhdGUtCAEkRml4ZWRVMTI4AAAQDQFJbml0aWFsaXplIGEgY29udmVyc2lvbiByYXRlIHRvIG5hdGl2ZSBiYWxhbmNlIGZvciB0aGUgZ2l2ZW4gYXNzZXQuADQjIyBDb21wbGV4aXR5GC0gTygxKRh1cGRhdGUIAShhc3NldF9raW5kAQUBREJveDxUOjpBc3NldEtpbmQ+AAEQcmF0ZS0IASRGaXhlZFUxMjgAARAFAVVwZGF0ZSB0aGUgY29udmVyc2lvbiByYXRlIHRvIG5hdGl2ZSBiYWxhbmNlIGZvciB0aGUgZ2l2ZW4gYXNzZXQuADQjIyBDb21wbGV4aXR5GC0gTygxKRhyZW1vdmUEAShhc3NldF9raW5kAQUBREJveDxUOjpBc3NldEtpbmQ+AAIQJQFSZW1vdmUgYW4gZXhpc3RpbmcgY29udmVyc2lvbiByYXRlIHRvIG5hdGl2ZSBiYWxhbmNlIGZvciB0aGUgZ2l2ZW4gYXNzZXQuADQjIyBDb21wbGV4aXR5GC0gTygxKQQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy4tCAw0c3BfYXJpdGhtZXRpYyxmaXhlZF9wb2ludCRGaXhlZFUxMjgAAAQAGAEQdTEyOAAAMQgMTHBhbGxldF9yb290X3Rlc3RpbmcYcGFsbGV0EENhbGwEBFQAAQgoZmlsbF9ibG9jawQBFHJhdGlvmAEcUGVyYmlsbAAABAUBQSBkaXNwYXRjaCB0aGF0IHdpbGwgZmlsbCB0aGUgYmxvY2sgd2VpZ2h0IHVwIHRvIHRoZSBnaXZlbiByYXRpby5EdHJpZ2dlcl9kZWZlbnNpdmUAAQAEDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMuNQgMOHBhbGxldF9tZXRhX3R4GHBhbGxldBBDYWxsBARUAAEEIGRpc3BhdGNoBAEcbWV0YV90eDkIAURCb3g8TWV0YVR4Rm9yPFQ+PgAAEIhEaXNwYXRjaCBhIGdpdmVuIG1ldGEgdHJhbnNhY3Rpb24uAJwtIGBfb3JpZ2luYDogQ2FuIGJlIGFueSBraW5kIG9mIG9yaWdpbi4JAS0gYG1ldGFfdHhgOiBNZXRhIFRyYW5zYWN0aW9uIHdpdGggYSB0YXJnZXQgY2FsbCB0byBiZSBkaXNwYXRjaGVkLgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy45CAg4cGFsbGV0X21ldGFfdHgYTWV0YVR4CBBDYWxsAakBJEV4dGVuc2lvbgE9CAAMARBjYWxsqQEBEENhbGwAAURleHRlbnNpb25fdmVyc2lvbggBQEV4dGVuc2lvblZlcnNpb24AASRleHRlbnNpb249CAEkRXh0ZW5zaW9uAAA9CAAABCRBCEUISQhNCFEIVQhZCGEIZQgAQQgMXHBhbGxldF92ZXJpZnlfc2lnbmF0dXJlJGV4dGVuc2lvbjxWZXJpZnlTaWduYXR1cmUEBFQAAQgYU2lnbmVkCAEkc2lnbmF0dXJllQMBMFQ6OlNpZ25hdHVyZQABHGFjY291bnQAATBUOjpBY2NvdW50SWQAAAAgRGlzYWJsZWQAAQAARQgMOHBhbGxldF9tZXRhX3R4JGV4dGVuc2lvbjBNZXRhVHhNYXJrZXIEBFQAAAAASQgQMGZyYW1lX3N5c3RlbShleHRlbnNpb25zVGNoZWNrX25vbl96ZXJvX3NlbmRlckhDaGVja05vblplcm9TZW5kZXIEBFQAAAAATQgQMGZyYW1lX3N5c3RlbShleHRlbnNpb25zSGNoZWNrX3NwZWNfdmVyc2lvbkBDaGVja1NwZWNWZXJzaW9uBARUAAAAAFEIEDBmcmFtZV9zeXN0ZW0oZXh0ZW5zaW9uc0BjaGVja190eF92ZXJzaW9uOENoZWNrVHhWZXJzaW9uBARUAAAAAFUIEDBmcmFtZV9zeXN0ZW0oZXh0ZW5zaW9uczRjaGVja19nZW5lc2lzMENoZWNrR2VuZXNpcwQEVAAAAABZCBAwZnJhbWVfc3lzdGVtKGV4dGVuc2lvbnM8Y2hlY2tfbW9ydGFsaXR5OENoZWNrTW9ydGFsaXR5BARUAAAEAF0IAQxFcmEAAF0IEChzcF9ydW50aW1lHGdlbmVyaWMMZXJhDEVyYQABAQQgSW1tb3J0YWwAAAAcTW9ydGFsMQQACAAAAQAcTW9ydGFsMgQACAAAAgAcTW9ydGFsMwQACAAAAwAcTW9ydGFsNAQACAAABAAcTW9ydGFsNQQACAAABQAcTW9ydGFsNgQACAAABgAcTW9ydGFsNwQACAAABwAcTW9ydGFsOAQACAAACAAcTW9ydGFsOQQACAAACQAgTW9ydGFsMTAEAAgAAAoAIE1vcnRhbDExBAAIAAALACBNb3J0YWwxMgQACAAADAAgTW9ydGFsMTMEAAgAAA0AIE1vcnRhbDE0BAAIAAAOACBNb3J0YWwxNQQACAAADwAgTW9ydGFsMTYEAAgAABAAIE1vcnRhbDE3BAAIAAARACBNb3J0YWwxOAQACAAAEgAgTW9ydGFsMTkEAAgAABMAIE1vcnRhbDIwBAAIAAAUACBNb3J0YWwyMQQACAAAFQAgTW9ydGFsMjIEAAgAABYAIE1vcnRhbDIzBAAIAAAXACBNb3J0YWwyNAQACAAAGAAgTW9ydGFsMjUEAAgAABkAIE1vcnRhbDI2BAAIAAAaACBNb3J0YWwyNwQACAAAGwAgTW9ydGFsMjgEAAgAABwAIE1vcnRhbDI5BAAIAAAdACBNb3J0YWwzMAQACAAAHgAgTW9ydGFsMzEEAAgAAB8AIE1vcnRhbDMyBAAIAAAgACBNb3J0YWwzMwQACAAAIQAgTW9ydGFsMzQEAAgAACIAIE1vcnRhbDM1BAAIAAAjACBNb3J0YWwzNgQACAAAJAAgTW9ydGFsMzcEAAgAACUAIE1vcnRhbDM4BAAIAAAmACBNb3J0YWwzOQQACAAAJwAgTW9ydGFsNDAEAAgAACgAIE1vcnRhbDQxBAAIAAApACBNb3J0YWw0MgQACAAAKgAgTW9ydGFsNDMEAAgAACsAIE1vcnRhbDQ0BAAIAAAsACBNb3J0YWw0NQQACAAALQAgTW9ydGFsNDYEAAgAAC4AIE1vcnRhbDQ3BAAIAAAvACBNb3J0YWw0OAQACAAAMAAgTW9ydGFsNDkEAAgAADEAIE1vcnRhbDUwBAAIAAAyACBNb3J0YWw1MQQACAAAMwAgTW9ydGFsNTIEAAgAADQAIE1vcnRhbDUzBAAIAAA1ACBNb3J0YWw1NAQACAAANgAgTW9ydGFsNTUEAAgAADcAIE1vcnRhbDU2BAAIAAA4ACBNb3J0YWw1NwQACAAAOQAgTW9ydGFsNTgEAAgAADoAIE1vcnRhbDU5BAAIAAA7ACBNb3J0YWw2MAQACAAAPAAgTW9ydGFsNjEEAAgAAD0AIE1vcnRhbDYyBAAIAAA+ACBNb3J0YWw2MwQACAAAPwAgTW9ydGFsNjQEAAgAAEAAIE1vcnRhbDY1BAAIAABBACBNb3J0YWw2NgQACAAAQgAgTW9ydGFsNjcEAAgAAEMAIE1vcnRhbDY4BAAIAABEACBNb3J0YWw2OQQACAAARQAgTW9ydGFsNzAEAAgAAEYAIE1vcnRhbDcxBAAIAABHACBNb3J0YWw3MgQACAAASAAgTW9ydGFsNzMEAAgAAEkAIE1vcnRhbDc0BAAIAABKACBNb3J0YWw3NQQACAAASwAgTW9ydGFsNzYEAAgAAEwAIE1vcnRhbDc3BAAIAABNACBNb3J0YWw3OAQACAAATgAgTW9ydGFsNzkEAAgAAE8AIE1vcnRhbDgwBAAIAABQACBNb3J0YWw4MQQACAAAUQAgTW9ydGFsODIEAAgAAFIAIE1vcnRhbDgzBAAIAABTACBNb3J0YWw4NAQACAAAVAAgTW9ydGFsODUEAAgAAFUAIE1vcnRhbDg2BAAIAABWACBNb3J0YWw4NwQACAAAVwAgTW9ydGFsODgEAAgAAFgAIE1vcnRhbDg5BAAIAABZACBNb3J0YWw5MAQACAAAWgAgTW9ydGFsOTEEAAgAAFsAIE1vcnRhbDkyBAAIAABcACBNb3J0YWw5MwQACAAAXQAgTW9ydGFsOTQEAAgAAF4AIE1vcnRhbDk1BAAIAABfACBNb3J0YWw5NgQACAAAYAAgTW9ydGFsOTcEAAgAAGEAIE1vcnRhbDk4BAAIAABiACBNb3J0YWw5OQQACAAAYwAkTW9ydGFsMTAwBAAIAABkACRNb3J0YWwxMDEEAAgAAGUAJE1vcnRhbDEwMgQACAAAZgAkTW9ydGFsMTAzBAAIAABnACRNb3J0YWwxMDQEAAgAAGgAJE1vcnRhbDEwNQQACAAAaQAkTW9ydGFsMTA2BAAIAABqACRNb3J0YWwxMDcEAAgAAGsAJE1vcnRhbDEwOAQACAAAbAAkTW9ydGFsMTA5BAAIAABtACRNb3J0YWwxMTAEAAgAAG4AJE1vcnRhbDExMQQACAAAbwAkTW9ydGFsMTEyBAAIAABwACRNb3J0YWwxMTMEAAgAAHEAJE1vcnRhbDExNAQACAAAcgAkTW9ydGFsMTE1BAAIAABzACRNb3J0YWwxMTYEAAgAAHQAJE1vcnRhbDExNwQACAAAdQAkTW9ydGFsMTE4BAAIAAB2ACRNb3J0YWwxMTkEAAgAAHcAJE1vcnRhbDEyMAQACAAAeAAkTW9ydGFsMTIxBAAIAAB5ACRNb3J0YWwxMjIEAAgAAHoAJE1vcnRhbDEyMwQACAAAewAkTW9ydGFsMTI0BAAIAAB8ACRNb3J0YWwxMjUEAAgAAH0AJE1vcnRhbDEyNgQACAAAfgAkTW9ydGFsMTI3BAAIAAB/ACRNb3J0YWwxMjgEAAgAAIAAJE1vcnRhbDEyOQQACAAAgQAkTW9ydGFsMTMwBAAIAACCACRNb3J0YWwxMzEEAAgAAIMAJE1vcnRhbDEzMgQACAAAhAAkTW9ydGFsMTMzBAAIAACFACRNb3J0YWwxMzQEAAgAAIYAJE1vcnRhbDEzNQQACAAAhwAkTW9ydGFsMTM2BAAIAACIACRNb3J0YWwxMzcEAAgAAIkAJE1vcnRhbDEzOAQACAAAigAkTW9ydGFsMTM5BAAIAACLACRNb3J0YWwxNDAEAAgAAIwAJE1vcnRhbDE0MQQACAAAjQAkTW9ydGFsMTQyBAAIAACOACRNb3J0YWwxNDMEAAgAAI8AJE1vcnRhbDE0NAQACAAAkAAkTW9ydGFsMTQ1BAAIAACRACRNb3J0YWwxNDYEAAgAAJIAJE1vcnRhbDE0NwQACAAAkwAkTW9ydGFsMTQ4BAAIAACUACRNb3J0YWwxNDkEAAgAAJUAJE1vcnRhbDE1MAQACAAAlgAkTW9ydGFsMTUxBAAIAACXACRNb3J0YWwxNTIEAAgAAJgAJE1vcnRhbDE1MwQACAAAmQAkTW9ydGFsMTU0BAAIAACaACRNb3J0YWwxNTUEAAgAAJsAJE1vcnRhbDE1NgQACAAAnAAkTW9ydGFsMTU3BAAIAACdACRNb3J0YWwxNTgEAAgAAJ4AJE1vcnRhbDE1OQQACAAAnwAkTW9ydGFsMTYwBAAIAACgACRNb3J0YWwxNjEEAAgAAKEAJE1vcnRhbDE2MgQACAAAogAkTW9ydGFsMTYzBAAIAACjACRNb3J0YWwxNjQEAAgAAKQAJE1vcnRhbDE2NQQACAAApQAkTW9ydGFsMTY2BAAIAACmACRNb3J0YWwxNjcEAAgAAKcAJE1vcnRhbDE2OAQACAAAqAAkTW9ydGFsMTY5BAAIAACpACRNb3J0YWwxNzAEAAgAAKoAJE1vcnRhbDE3MQQACAAAqwAkTW9ydGFsMTcyBAAIAACsACRNb3J0YWwxNzMEAAgAAK0AJE1vcnRhbDE3NAQACAAArgAkTW9ydGFsMTc1BAAIAACvACRNb3J0YWwxNzYEAAgAALAAJE1vcnRhbDE3NwQACAAAsQAkTW9ydGFsMTc4BAAIAACyACRNb3J0YWwxNzkEAAgAALMAJE1vcnRhbDE4MAQACAAAtAAkTW9ydGFsMTgxBAAIAAC1ACRNb3J0YWwxODIEAAgAALYAJE1vcnRhbDE4MwQACAAAtwAkTW9ydGFsMTg0BAAIAAC4ACRNb3J0YWwxODUEAAgAALkAJE1vcnRhbDE4NgQACAAAugAkTW9ydGFsMTg3BAAIAAC7ACRNb3J0YWwxODgEAAgAALwAJE1vcnRhbDE4OQQACAAAvQAkTW9ydGFsMTkwBAAIAAC+ACRNb3J0YWwxOTEEAAgAAL8AJE1vcnRhbDE5MgQACAAAwAAkTW9ydGFsMTkzBAAIAADBACRNb3J0YWwxOTQEAAgAAMIAJE1vcnRhbDE5NQQACAAAwwAkTW9ydGFsMTk2BAAIAADEACRNb3J0YWwxOTcEAAgAAMUAJE1vcnRhbDE5OAQACAAAxgAkTW9ydGFsMTk5BAAIAADHACRNb3J0YWwyMDAEAAgAAMgAJE1vcnRhbDIwMQQACAAAyQAkTW9ydGFsMjAyBAAIAADKACRNb3J0YWwyMDMEAAgAAMsAJE1vcnRhbDIwNAQACAAAzAAkTW9ydGFsMjA1BAAIAADNACRNb3J0YWwyMDYEAAgAAM4AJE1vcnRhbDIwNwQACAAAzwAkTW9ydGFsMjA4BAAIAADQACRNb3J0YWwyMDkEAAgAANEAJE1vcnRhbDIxMAQACAAA0gAkTW9ydGFsMjExBAAIAADTACRNb3J0YWwyMTIEAAgAANQAJE1vcnRhbDIxMwQACAAA1QAkTW9ydGFsMjE0BAAIAADWACRNb3J0YWwyMTUEAAgAANcAJE1vcnRhbDIxNgQACAAA2AAkTW9ydGFsMjE3BAAIAADZACRNb3J0YWwyMTgEAAgAANoAJE1vcnRhbDIxOQQACAAA2wAkTW9ydGFsMjIwBAAIAADcACRNb3J0YWwyMjEEAAgAAN0AJE1vcnRhbDIyMgQACAAA3gAkTW9ydGFsMjIzBAAIAADfACRNb3J0YWwyMjQEAAgAAOAAJE1vcnRhbDIyNQQACAAA4QAkTW9ydGFsMjI2BAAIAADiACRNb3J0YWwyMjcEAAgAAOMAJE1vcnRhbDIyOAQACAAA5AAkTW9ydGFsMjI5BAAIAADlACRNb3J0YWwyMzAEAAgAAOYAJE1vcnRhbDIzMQQACAAA5wAkTW9ydGFsMjMyBAAIAADoACRNb3J0YWwyMzMEAAgAAOkAJE1vcnRhbDIzNAQACAAA6gAkTW9ydGFsMjM1BAAIAADrACRNb3J0YWwyMzYEAAgAAOwAJE1vcnRhbDIzNwQACAAA7QAkTW9ydGFsMjM4BAAIAADuACRNb3J0YWwyMzkEAAgAAO8AJE1vcnRhbDI0MAQACAAA8AAkTW9ydGFsMjQxBAAIAADxACRNb3J0YWwyNDIEAAgAAPIAJE1vcnRhbDI0MwQACAAA8wAkTW9ydGFsMjQ0BAAIAAD0ACRNb3J0YWwyNDUEAAgAAPUAJE1vcnRhbDI0NgQACAAA9gAkTW9ydGFsMjQ3BAAIAAD3ACRNb3J0YWwyNDgEAAgAAPgAJE1vcnRhbDI0OQQACAAA+QAkTW9ydGFsMjUwBAAIAAD6ACRNb3J0YWwyNTEEAAgAAPsAJE1vcnRhbDI1MgQACAAA/AAkTW9ydGFsMjUzBAAIAAD9ACRNb3J0YWwyNTQEAAgAAP4AJE1vcnRhbDI1NQQACAAA/wAAYQgQMGZyYW1lX3N5c3RlbShleHRlbnNpb25zLGNoZWNrX25vbmNlKENoZWNrTm9uY2UEBFQAAAQAyQEBIFQ6Ok5vbmNlAABlCAh0ZnJhbWVfbWV0YWRhdGFfaGFzaF9leHRlbnNpb25EQ2hlY2tNZXRhZGF0YUhhc2gEBFQAAAQBEG1vZGVpCAEQTW9kZQAAaQgIdGZyYW1lX21ldGFkYXRhX2hhc2hfZXh0ZW5zaW9uEE1vZGUAAQggRGlzYWJsZWQAAAAcRW5hYmxlZAABAABtCAwwcGFsbGV0X2JlZWZ5GHBhbGxldBBDYWxsBARUAAEcUHJlcG9ydF9kb3VibGVfdm90aW5nCAFIZXF1aXZvY2F0aW9uX3Byb29mcQgBjQFCb3g8RG91YmxlVm90aW5nUHJvb2Y8QmxvY2tOdW1iZXJGb3I8VD4sIFQ6OkJlZWZ5SWQsPFQ6OkJlZWZ5SWQKYXMgUnVudGltZUFwcFB1YmxpYz46OlNpZ25hdHVyZSw+LD4AATxrZXlfb3duZXJfcHJvb2bVAQFAVDo6S2V5T3duZXJQcm9vZgAAEAkBUmVwb3J0IHZvdGVyIGVxdWl2b2NhdGlvbi9taXNiZWhhdmlvci4gVGhpcyBtZXRob2Qgd2lsbCB2ZXJpZnkgdGhl9GVxdWl2b2NhdGlvbiBwcm9vZiBhbmQgdmFsaWRhdGUgdGhlIGdpdmVuIGtleSBvd25lcnNoaXAgcHJvb2b4YWdhaW5zdCB0aGUgZXh0cmFjdGVkIG9mZmVuZGVyLiBJZiBib3RoIGFyZSB2YWxpZCwgdGhlIG9mZmVuY2VEd2lsbCBiZSByZXBvcnRlZC50cmVwb3J0X2RvdWJsZV92b3RpbmdfdW5zaWduZWQIAUhlcXVpdm9jYXRpb25fcHJvb2ZxCAGNAUJveDxEb3VibGVWb3RpbmdQcm9vZjxCbG9ja051bWJlckZvcjxUPiwgVDo6QmVlZnlJZCw8VDo6QmVlZnlJZAphcyBSdW50aW1lQXBwUHVibGljPjo6U2lnbmF0dXJlLD4sPgABPGtleV9vd25lcl9wcm9vZtUBAUBUOjpLZXlPd25lclByb29mAAEkCQFSZXBvcnQgdm90ZXIgZXF1aXZvY2F0aW9uL21pc2JlaGF2aW9yLiBUaGlzIG1ldGhvZCB3aWxsIHZlcmlmeSB0aGX0ZXF1aXZvY2F0aW9uIHByb29mIGFuZCB2YWxpZGF0ZSB0aGUgZ2l2ZW4ga2V5IG93bmVyc2hpcCBwcm9vZvhhZ2FpbnN0IHRoZSBleHRyYWN0ZWQgb2ZmZW5kZXIuIElmIGJvdGggYXJlIHZhbGlkLCB0aGUgb2ZmZW5jZUR3aWxsIGJlIHJlcG9ydGVkLgANAVRoaXMgZXh0cmluc2ljIG11c3QgYmUgY2FsbGVkIHVuc2lnbmVkIGFuZCBpdCBpcyBleHBlY3RlZCB0aGF0IG9ubHkVAWJsb2NrIGF1dGhvcnMgd2lsbCBjYWxsIGl0ICh2YWxpZGF0ZWQgaW4gYFZhbGlkYXRlVW5zaWduZWRgKSwgYXMgc3VjaBUBaWYgdGhlIGJsb2NrIGF1dGhvciBpcyBkZWZpbmVkIGl0IHdpbGwgYmUgZGVmaW5lZCBhcyB0aGUgZXF1aXZvY2F0aW9uJHJlcG9ydGVyLjxzZXRfbmV3X2dlbmVzaXMEATxkZWxheV9pbl9ibG9ja3MQAURCbG9ja051bWJlckZvcjxUPgACEF0BUmVzZXQgQkVFRlkgY29uc2Vuc3VzIGJ5IHNldHRpbmcgYSBuZXcgQkVFRlkgZ2VuZXNpcyBhdCBgZGVsYXlfaW5fYmxvY2tzYCBibG9ja3MgaW4gdGhlHGZ1dHVyZS4AtE5vdGU6IGBkZWxheV9pbl9ibG9ja3NgIGhhcyB0byBiZSBhdCBsZWFzdCAxLkhyZXBvcnRfZm9ya192b3RpbmcIAUhlcXVpdm9jYXRpb25fcHJvb2aNCAGtAUJveDxGb3JrVm90aW5nUHJvb2Y8SGVhZGVyRm9yPFQ+LCBUOjpCZWVmeUlkLDxUOjpBbmNlc3RyeUhlbHBlcgphcyBBbmNlc3RyeUhlbHBlcjxIZWFkZXJGb3I8VD4+Pjo6UHJvb2YsPiw+AAE8a2V5X293bmVyX3Byb29m1QEBQFQ6OktleU93bmVyUHJvb2YAAww9AVJlcG9ydCBmb3JrIHZvdGluZyBlcXVpdm9jYXRpb24uIFRoaXMgbWV0aG9kIHdpbGwgdmVyaWZ5IHRoZSBlcXVpdm9jYXRpb24gcHJvb2YpAWFuZCB2YWxpZGF0ZSB0aGUgZ2l2ZW4ga2V5IG93bmVyc2hpcCBwcm9vZiBhZ2FpbnN0IHRoZSBleHRyYWN0ZWQgb2ZmZW5kZXIuwElmIGJvdGggYXJlIHZhbGlkLCB0aGUgb2ZmZW5jZSB3aWxsIGJlIHJlcG9ydGVkLmxyZXBvcnRfZm9ya192b3RpbmdfdW5zaWduZWQIAUhlcXVpdm9jYXRpb25fcHJvb2aNCAGtAUJveDxGb3JrVm90aW5nUHJvb2Y8SGVhZGVyRm9yPFQ+LCBUOjpCZWVmeUlkLDxUOjpBbmNlc3RyeUhlbHBlcgphcyBBbmNlc3RyeUhlbHBlcjxIZWFkZXJGb3I8VD4+Pjo6UHJvb2YsPiw+AAE8a2V5X293bmVyX3Byb29m1QEBQFQ6OktleU93bmVyUHJvb2YABCA9AVJlcG9ydCBmb3JrIHZvdGluZyBlcXVpdm9jYXRpb24uIFRoaXMgbWV0aG9kIHdpbGwgdmVyaWZ5IHRoZSBlcXVpdm9jYXRpb24gcHJvb2YpAWFuZCB2YWxpZGF0ZSB0aGUgZ2l2ZW4ga2V5IG93bmVyc2hpcCBwcm9vZiBhZ2FpbnN0IHRoZSBleHRyYWN0ZWQgb2ZmZW5kZXIuwElmIGJvdGggYXJlIHZhbGlkLCB0aGUgb2ZmZW5jZSB3aWxsIGJlIHJlcG9ydGVkLgANAVRoaXMgZXh0cmluc2ljIG11c3QgYmUgY2FsbGVkIHVuc2lnbmVkIGFuZCBpdCBpcyBleHBlY3RlZCB0aGF0IG9ubHkVAWJsb2NrIGF1dGhvcnMgd2lsbCBjYWxsIGl0ICh2YWxpZGF0ZWQgaW4gYFZhbGlkYXRlVW5zaWduZWRgKSwgYXMgc3VjaBUBaWYgdGhlIGJsb2NrIGF1dGhvciBpcyBkZWZpbmVkIGl0IHdpbGwgYmUgZGVmaW5lZCBhcyB0aGUgZXF1aXZvY2F0aW9uJHJlcG9ydGVyLmhyZXBvcnRfZnV0dXJlX2Jsb2NrX3ZvdGluZwgBSGVxdWl2b2NhdGlvbl9wcm9vZp0IAehCb3g8RnV0dXJlQmxvY2tWb3RpbmdQcm9vZjxCbG9ja051bWJlckZvcjxUPiwgVDo6QmVlZnlJZD4+AAE8a2V5X293bmVyX3Byb29m1QEBQFQ6OktleU93bmVyUHJvb2YABQxdAVJlcG9ydCBmdXR1cmUgYmxvY2sgdm90aW5nIGVxdWl2b2NhdGlvbi4gVGhpcyBtZXRob2Qgd2lsbCB2ZXJpZnkgdGhlIGVxdWl2b2NhdGlvbiBwcm9vZikBYW5kIHZhbGlkYXRlIHRoZSBnaXZlbiBrZXkgb3duZXJzaGlwIHByb29mIGFnYWluc3QgdGhlIGV4dHJhY3RlZCBvZmZlbmRlci7ASWYgYm90aCBhcmUgdmFsaWQsIHRoZSBvZmZlbmNlIHdpbGwgYmUgcmVwb3J0ZWQujHJlcG9ydF9mdXR1cmVfYmxvY2tfdm90aW5nX3Vuc2lnbmVkCAFIZXF1aXZvY2F0aW9uX3Byb29mnQgB6EJveDxGdXR1cmVCbG9ja1ZvdGluZ1Byb29mPEJsb2NrTnVtYmVyRm9yPFQ+LCBUOjpCZWVmeUlkPj4AATxrZXlfb3duZXJfcHJvb2bVAQFAVDo6S2V5T3duZXJQcm9vZgAGIF0BUmVwb3J0IGZ1dHVyZSBibG9jayB2b3RpbmcgZXF1aXZvY2F0aW9uLiBUaGlzIG1ldGhvZCB3aWxsIHZlcmlmeSB0aGUgZXF1aXZvY2F0aW9uIHByb29mKQFhbmQgdmFsaWRhdGUgdGhlIGdpdmVuIGtleSBvd25lcnNoaXAgcHJvb2YgYWdhaW5zdCB0aGUgZXh0cmFjdGVkIG9mZmVuZGVyLsBJZiBib3RoIGFyZSB2YWxpZCwgdGhlIG9mZmVuY2Ugd2lsbCBiZSByZXBvcnRlZC4ADQFUaGlzIGV4dHJpbnNpYyBtdXN0IGJlIGNhbGxlZCB1bnNpZ25lZCBhbmQgaXQgaXMgZXhwZWN0ZWQgdGhhdCBvbmx5FQFibG9jayBhdXRob3JzIHdpbGwgY2FsbCBpdCAodmFsaWRhdGVkIGluIGBWYWxpZGF0ZVVuc2lnbmVkYCksIGFzIHN1Y2gVAWlmIHRoZSBibG9jayBhdXRob3IgaXMgZGVmaW5lZCBpdCB3aWxsIGJlIGRlZmluZWQgYXMgdGhlIGVxdWl2b2NhdGlvbiRyZXBvcnRlci4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMucQgISHNwX2NvbnNlbnN1c19iZWVmeUREb3VibGVWb3RpbmdQcm9vZgwYTnVtYmVyARAISWQBZQIkU2lnbmF0dXJlAXUIAAgBFGZpcnN0eQgBiFZvdGVNZXNzYWdlPE51bWJlciwgSWQsIFNpZ25hdHVyZT4AARhzZWNvbmR5CAGIVm90ZU1lc3NhZ2U8TnVtYmVyLCBJZCwgU2lnbmF0dXJlPgAAdQgMSHNwX2NvbnNlbnN1c19iZWVmeTBlY2RzYV9jcnlwdG8kU2lnbmF0dXJlAAAEAJkDAUBlY2RzYTo6U2lnbmF0dXJlAAB5CAhIc3BfY29uc2Vuc3VzX2JlZWZ5LFZvdGVNZXNzYWdlDBhOdW1iZXIBEAhJZAFlAiRTaWduYXR1cmUBdQgADAEoY29tbWl0bWVudH0IAUhDb21taXRtZW50PE51bWJlcj4AAQhpZGUCAQhJZAABJHNpZ25hdHVyZXUIASRTaWduYXR1cmUAAH0IDEhzcF9jb25zZW5zdXNfYmVlZnkoY29tbWl0bWVudChDb21taXRtZW50BDBUQmxvY2tOdW1iZXIBEAAMARxwYXlsb2FkgQgBHFBheWxvYWQAATBibG9ja19udW1iZXIQATBUQmxvY2tOdW1iZXIAAUB2YWxpZGF0b3Jfc2V0X2lkMAE4VmFsaWRhdG9yU2V0SWQAAIEIDEhzcF9jb25zZW5zdXNfYmVlZnkccGF5bG9hZBxQYXlsb2FkAAAEAIUIAXhWZWM8KEJlZWZ5UGF5bG9hZElkLCBWZWM8dTg+KT4AAIUIAAACiQgAiQgAAAQIEQM4AI0ICEhzcF9jb25zZW5zdXNfYmVlZnk8Rm9ya1ZvdGluZ1Byb29mDBhIZWFkZXIBxQEISWQBZQI0QW5jZXN0cnlQcm9vZgGRCAAMARB2b3RleQgBuFZvdGVNZXNzYWdlPEhlYWRlcjo6TnVtYmVyLCBJZCwgSWQ6OlNpZ25hdHVyZT4AAThhbmNlc3RyeV9wcm9vZpEIATRBbmNlc3RyeVByb29mAAEYaGVhZGVyxQEBGEhlYWRlcgAAkQgIRHNwX21tcl9wcmltaXRpdmVzNEFuY2VzdHJ5UHJvb2YEEEhhc2gBNAAQAShwcmV2X3BlYWtzuQMBJFZlYzxIYXNoPgABPHByZXZfbGVhZl9jb3VudDABDHU2NAABKGxlYWZfY291bnQwASROb2RlSW5kZXgAARRpdGVtc5UIAUBWZWM8KHU2NCwgSGFzaCk+AACVCAAAApkIAJkIAAAECDA0AJ0ICEhzcF9jb25zZW5zdXNfYmVlZnlYRnV0dXJlQmxvY2tWb3RpbmdQcm9vZggYTnVtYmVyARAISWQBZQIABAEQdm90ZXkIAZhWb3RlTWVzc2FnZTxOdW1iZXIsIElkLCBJZDo6U2lnbmF0dXJlPgAAoQgQXHBvbGthZG90X3J1bnRpbWVfY29tbW9uRGlkZW50aXR5X21pZ3JhdG9yGHBhbGxldBBDYWxsBARUAAEINHJlYXBfaWRlbnRpdHkEAQx3aG8AATBUOjpBY2NvdW50SWQAAAhFAVJlYXAgdGhlIGBJZGVudGl0eUluZm9gIG9mIGB3aG9gIGZyb20gdGhlIElkZW50aXR5IHBhbGxldCBvZiBgVGAsIHVucmVzZXJ2aW5nIGFuefxkZXBvc2l0cyBoZWxkIGFuZCByZW1vdmluZyBzdG9yYWdlIGl0ZW1zIGFzc29jaWF0ZWQgd2l0aCBgd2hvYC4wcG9rZV9kZXBvc2l0BAEMd2hvAAEwVDo6QWNjb3VudElkAAEIUQFVcGRhdGUgdGhlIGRlcG9zaXQgb2YgYHdob2AuIE1lYW50IHRvIGJlIGNhbGxlZCBieSB0aGUgc3lzdGVtIHdpdGggYW4gWENNIGBUcmFuc2FjdGAwSW5zdHJ1Y3Rpb24uBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLqUIDChzcF9ydW50aW1lGHRyYWl0cyxCbGFrZVR3bzI1NgAAAACpCAxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAQgEUwAABAA4ARhWZWM8VD4AAK0IDGBwYWxsZXRfY29udmljdGlvbl92b3RpbmcUdHlwZXMUVGFsbHkIFFZvdGVzARgUVG90YWwAAAwBEGF5ZXMYARRWb3RlcwABEG5heXMYARRWb3RlcwABHHN1cHBvcnQYARRWb3RlcwAAsQgMQHBhbGxldF93aGl0ZWxpc3QYcGFsbGV0FEV2ZW50BARUAAEMPENhbGxXaGl0ZWxpc3RlZAQBJGNhbGxfaGFzaDQBHFQ6Okhhc2gAAABYV2hpdGVsaXN0ZWRDYWxsUmVtb3ZlZAQBJGNhbGxfaGFzaDQBHFQ6Okhhc2gAAQBkV2hpdGVsaXN0ZWRDYWxsRGlzcGF0Y2hlZAgBJGNhbGxfaGFzaDQBHFQ6Okhhc2gAARhyZXN1bHS1CAFoRGlzcGF0Y2hSZXN1bHRXaXRoUG9zdEluZm8AAgAEfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXS1CAQYUmVzdWx0CARUAbkIBEUBvQgBCAhPawQAuQgAAAAADEVycgQAvQgAAAEAALkIDDRmcmFtZV9zdXBwb3J0IGRpc3BhdGNoQFBvc3REaXNwYXRjaEluZm8AAAgBNGFjdHVhbF93ZWlnaHRFBwE4T3B0aW9uPFdlaWdodD4AASBwYXlzX2ZlZWQBEFBheXMAAL0ICChzcF9ydW50aW1lZERpc3BhdGNoRXJyb3JXaXRoUG9zdEluZm8EEEluZm8BuQgACAEkcG9zdF9pbmZvuQgBEEluZm8AARRlcnJvcmgBNERpc3BhdGNoRXJyb3IAAMEIDDxwYWxsZXRfdHJlYXN1cnkYcGFsbGV0FEV2ZW50CARUAARJAAEwIFNwZW5kaW5nBAFAYnVkZ2V0X3JlbWFpbmluZxgBPEJhbGFuY2VPZjxULCBJPgAABORXZSBoYXZlIGVuZGVkIGEgc3BlbmQgcGVyaW9kIGFuZCB3aWxsIG5vdyBhbGxvY2F0ZSBmdW5kcy4cQXdhcmRlZAwBOHByb3Bvc2FsX2luZGV4EAE0UHJvcG9zYWxJbmRleAABFGF3YXJkGAE8QmFsYW5jZU9mPFQsIEk+AAEcYWNjb3VudAABMFQ6OkFjY291bnRJZAABBHxTb21lIGZ1bmRzIGhhdmUgYmVlbiBhbGxvY2F0ZWQuFEJ1cm50BAEsYnVybnRfZnVuZHMYATxCYWxhbmNlT2Y8VCwgST4AAgSIU29tZSBvZiBvdXIgZnVuZHMgaGF2ZSBiZWVuIGJ1cm50LiBSb2xsb3ZlcgQBQHJvbGxvdmVyX2JhbGFuY2UYATxCYWxhbmNlT2Y8VCwgST4AAwQtAVNwZW5kaW5nIGhhcyBmaW5pc2hlZDsgdGhpcyBpcyB0aGUgYW1vdW50IHRoYXQgcm9sbHMgb3ZlciB1bnRpbCBuZXh0IHNwZW5kLhxEZXBvc2l0BAEUdmFsdWUYATxCYWxhbmNlT2Y8VCwgST4ABAR8U29tZSBmdW5kcyBoYXZlIGJlZW4gZGVwb3NpdGVkLjRTcGVuZEFwcHJvdmVkDAE4cHJvcG9zYWxfaW5kZXgQATRQcm9wb3NhbEluZGV4AAEYYW1vdW50GAE8QmFsYW5jZU9mPFQsIEk+AAEsYmVuZWZpY2lhcnkAATBUOjpBY2NvdW50SWQABQScQSBuZXcgc3BlbmQgcHJvcG9zYWwgaGFzIGJlZW4gYXBwcm92ZWQuPFVwZGF0ZWRJbmFjdGl2ZQgBLHJlYWN0aXZhdGVkGAE8QmFsYW5jZU9mPFQsIEk+AAEsZGVhY3RpdmF0ZWQYATxCYWxhbmNlT2Y8VCwgST4ABgTMVGhlIGluYWN0aXZlIGZ1bmRzIG9mIHRoZSBwYWxsZXQgaGF2ZSBiZWVuIHVwZGF0ZWQuSEFzc2V0U3BlbmRBcHByb3ZlZBgBFGluZGV4EAEoU3BlbmRJbmRleAABKGFzc2V0X2tpbmQBBQEwVDo6QXNzZXRLaW5kAAEYYW1vdW50GAFQQXNzZXRCYWxhbmNlT2Y8VCwgST4AASxiZW5lZmljaWFyeVkFAThUOjpCZW5lZmljaWFyeQABKHZhbGlkX2Zyb20QAVBCbG9ja051bWJlckZvcjxULCBJPgABJGV4cGlyZV9hdBABUEJsb2NrTnVtYmVyRm9yPFQsIEk+AAcEtEEgbmV3IGFzc2V0IHNwZW5kIHByb3Bvc2FsIGhhcyBiZWVuIGFwcHJvdmVkLkBBc3NldFNwZW5kVm9pZGVkBAEUaW5kZXgQAShTcGVuZEluZGV4AAgEdEFuIGFwcHJvdmVkIHNwZW5kIHdhcyB2b2lkZWQuEFBhaWQIARRpbmRleBABKFNwZW5kSW5kZXgAAShwYXltZW50X2lkMAFkPFQ6OlBheW1hc3RlciBhcyBQYXk+OjpJZAAJBExBIHBheW1lbnQgaGFwcGVuZWQuNFBheW1lbnRGYWlsZWQIARRpbmRleBABKFNwZW5kSW5kZXgAAShwYXltZW50X2lkMAFkPFQ6OlBheW1hc3RlciBhcyBQYXk+OjpJZAAKBJBBIHBheW1lbnQgZmFpbGVkIGFuZCBjYW4gYmUgcmV0cmllZC44U3BlbmRQcm9jZXNzZWQEARRpbmRleBABKFNwZW5kSW5kZXgACwhNAUEgc3BlbmQgd2FzIHByb2Nlc3NlZCBhbmQgcmVtb3ZlZCBmcm9tIHRoZSBzdG9yYWdlLiBJdCBtaWdodCBoYXZlIGJlZW4gc3VjY2Vzc2Z1bGx5cHBhaWQgb3IgaXQgbWF5IGhhdmUgZXhwaXJlZC4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXTFCAxgcGFsbGV0X2RlbGVnYXRlZF9zdGFraW5nGHBhbGxldBRFdmVudAQEVAABECREZWxlZ2F0ZWQMARRhZ2VudAABMFQ6OkFjY291bnRJZAABJGRlbGVnYXRvcgABMFQ6OkFjY291bnRJZAABGGFtb3VudBgBMEJhbGFuY2VPZjxUPgAABHxGdW5kcyBkZWxlZ2F0ZWQgYnkgYSBkZWxlZ2F0b3IuIFJlbGVhc2VkDAEUYWdlbnQAATBUOjpBY2NvdW50SWQAASRkZWxlZ2F0b3IAATBUOjpBY2NvdW50SWQAARhhbW91bnQYATBCYWxhbmNlT2Y8VD4AAQR4RnVuZHMgcmVsZWFzZWQgdG8gYSBkZWxlZ2F0b3IuHFNsYXNoZWQMARRhZ2VudAABMFQ6OkFjY291bnRJZAABJGRlbGVnYXRvcgABMFQ6OkFjY291bnRJZAABGGFtb3VudBgBMEJhbGFuY2VPZjxUPgACBHxGdW5kcyBzbGFzaGVkIGZyb20gYSBkZWxlZ2F0b3IuSE1pZ3JhdGVkRGVsZWdhdGlvbgwBFGFnZW50AAEwVDo6QWNjb3VudElkAAEkZGVsZWdhdG9yAAEwVDo6QWNjb3VudElkAAEYYW1vdW50GAEwQmFsYW5jZU9mPFQ+AAMExFVuY2xhaW1lZCBkZWxlZ2F0aW9uIGZ1bmRzIG1pZ3JhdGVkIHRvIGRlbGVnYXRvci4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXTJCBBscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zJGluY2x1c2lvbhhwYWxsZXQURXZlbnQEBFQAARA8Q2FuZGlkYXRlQmFja2VkEADNCAFkQ2FuZGlkYXRlUmVjZWlwdDxUOjpIYXNoPgAA4QUBIEhlYWREYXRhAADRCAEkQ29yZUluZGV4AADVCAEoR3JvdXBJbmRleAAABMBBIGNhbmRpZGF0ZSB3YXMgYmFja2VkLiBgW2NhbmRpZGF0ZSwgaGVhZF9kYXRhXWBEQ2FuZGlkYXRlSW5jbHVkZWQQAM0IAWRDYW5kaWRhdGVSZWNlaXB0PFQ6Okhhc2g+AADhBQEgSGVhZERhdGEAANEIASRDb3JlSW5kZXgAANUIAShHcm91cEluZGV4AAEEyEEgY2FuZGlkYXRlIHdhcyBpbmNsdWRlZC4gYFtjYW5kaWRhdGUsIGhlYWRfZGF0YV1gRENhbmRpZGF0ZVRpbWVkT3V0DADNCAFkQ2FuZGlkYXRlUmVjZWlwdDxUOjpIYXNoPgAA4QUBIEhlYWREYXRhAADRCAEkQ29yZUluZGV4AAIEvEEgY2FuZGlkYXRlIHRpbWVkIG91dC4gYFtjYW5kaWRhdGUsIGhlYWRfZGF0YV1gWFVwd2FyZE1lc3NhZ2VzUmVjZWl2ZWQIARBmcm9tsQIBGFBhcmFJZAABFGNvdW50EAEMdTMyAAME+FNvbWUgdXB3YXJkIG1lc3NhZ2VzIGhhdmUgYmVlbiByZWNlaXZlZCBhbmQgd2lsbCBiZSBwcm9jZXNzZWQuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0zQgMTHBvbGthZG90X3ByaW1pdGl2ZXMgdnN0YWdpbmdIQ2FuZGlkYXRlUmVjZWlwdFYyBARIATQACAEoZGVzY3JpcHRvcrkFAWBDYW5kaWRhdGVEZXNjcmlwdG9yVjI8SD4AAUBjb21taXRtZW50c19oYXNoNAEQSGFzaAAA0QgMTHBvbGthZG90X3ByaW1pdGl2ZXMIdjgkQ29yZUluZGV4AAAEABABDHUzMgAA1QgMTHBvbGthZG90X3ByaW1pdGl2ZXMIdjgoR3JvdXBJbmRleAAABAAQAQx1MzIAANkIEGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMUcGFyYXMYcGFsbGV0FEV2ZW50BARUAAEoSEN1cnJlbnRDb2RlVXBkYXRlZAQAsQIBGFBhcmFJZAAABMxDdXJyZW50IGNvZGUgaGFzIGJlZW4gdXBkYXRlZCBmb3IgYSBQYXJhLiBgcGFyYV9pZGBIQ3VycmVudEhlYWRVcGRhdGVkBACxAgEYUGFyYUlkAAEEzEN1cnJlbnQgaGVhZCBoYXMgYmVlbiB1cGRhdGVkIGZvciBhIFBhcmEuIGBwYXJhX2lkYFBDb2RlVXBncmFkZVNjaGVkdWxlZAQAsQIBGFBhcmFJZAACBNxBIGNvZGUgdXBncmFkZSBoYXMgYmVlbiBzY2hlZHVsZWQgZm9yIGEgUGFyYS4gYHBhcmFfaWRgME5ld0hlYWROb3RlZAQAsQIBGFBhcmFJZAADBLxBIG5ldyBoZWFkIGhhcyBiZWVuIG5vdGVkIGZvciBhIFBhcmEuIGBwYXJhX2lkYDBBY3Rpb25RdWV1ZWQIALECARhQYXJhSWQAABABMFNlc3Npb25JbmRleAAEBPBBIHBhcmEgaGFzIGJlZW4gcXVldWVkIHRvIGV4ZWN1dGUgcGVuZGluZyBhY3Rpb25zLiBgcGFyYV9pZGA8UHZmQ2hlY2tTdGFydGVkCADBBQFIVmFsaWRhdGlvbkNvZGVIYXNoAACxAgEYUGFyYUlkAAUIVQFUaGUgZ2l2ZW4gcGFyYSBlaXRoZXIgaW5pdGlhdGVkIG9yIHN1YnNjcmliZWQgdG8gYSBQVkYgY2hlY2sgZm9yIHRoZSBnaXZlbiB2YWxpZGF0aW9ubGNvZGUuIGBjb2RlX2hhc2hgIGBwYXJhX2lkYEBQdmZDaGVja0FjY2VwdGVkCADBBQFIVmFsaWRhdGlvbkNvZGVIYXNoAACxAgEYUGFyYUlkAAYIEQFUaGUgZ2l2ZW4gdmFsaWRhdGlvbiBjb2RlIHdhcyBhY2NlcHRlZCBieSB0aGUgUFZGIHByZS1jaGVja2luZyB2b3RlLlRgY29kZV9oYXNoYCBgcGFyYV9pZGBAUHZmQ2hlY2tSZWplY3RlZAgAwQUBSFZhbGlkYXRpb25Db2RlSGFzaAAAsQIBGFBhcmFJZAAHCBEBVGhlIGdpdmVuIHZhbGlkYXRpb24gY29kZSB3YXMgcmVqZWN0ZWQgYnkgdGhlIFBWRiBwcmUtY2hlY2tpbmcgdm90ZS5UYGNvZGVfaGFzaGAgYHBhcmFfaWRgWFVwZ3JhZGVDb29sZG93blJlbW92ZWQEARxwYXJhX2lksQIBGFBhcmFJZATEVGhlIHBhcmFjaGFpbiBmb3Igd2hpY2ggdGhlIGNvb2xkb3duIGdvdCByZW1vdmVkLggEhFRoZSB1cGdyYWRlIGNvb2xkb3duIHdhcyByZW1vdmVkLjhDb2RlQXV0aG9yaXplZAwBHHBhcmFfaWSxAgEYUGFyYUlkBBBQYXJhASRjb2RlX2hhc2jBBQFIVmFsaWRhdGlvbkNvZGVIYXNoBFRBdXRob3JpemVkIGNvZGUgaGFzaC4BJGV4cGlyZV9hdBABREJsb2NrTnVtYmVyRm9yPFQ+BORCbG9jayBhdCB3aGljaCBhdXRob3JpemF0aW9uIGV4cGlyZXMgYW5kIHdpbGwgYmUgcmVtb3ZlZC4JBLxBIG5ldyBjb2RlIGhhc2ggaGFzIGJlZW4gYXV0aG9yaXplZCBmb3IgYSBQYXJhLgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldN0IEGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMQaHJtcBhwYWxsZXQURXZlbnQEBFQAARxQT3BlbkNoYW5uZWxSZXF1ZXN0ZWQQARhzZW5kZXKxAgEYUGFyYUlkAAEkcmVjaXBpZW50sQIBGFBhcmFJZAABVHByb3Bvc2VkX21heF9jYXBhY2l0eRABDHUzMgABZHByb3Bvc2VkX21heF9tZXNzYWdlX3NpemUQAQx1MzIAAARwT3BlbiBIUk1QIGNoYW5uZWwgcmVxdWVzdGVkLkxPcGVuQ2hhbm5lbENhbmNlbGVkCAEwYnlfcGFyYWNoYWlusQIBGFBhcmFJZAABKGNoYW5uZWxfaWQhBgE0SHJtcENoYW5uZWxJZAABBCkBQW4gSFJNUCBjaGFubmVsIHJlcXVlc3Qgc2VudCBieSB0aGUgcmVjZWl2ZXIgd2FzIGNhbmNlbGVkIGJ5IGVpdGhlciBwYXJ0eS5MT3BlbkNoYW5uZWxBY2NlcHRlZAgBGHNlbmRlcrECARhQYXJhSWQAASRyZWNpcGllbnSxAgEYUGFyYUlkAAIEbE9wZW4gSFJNUCBjaGFubmVsIGFjY2VwdGVkLjRDaGFubmVsQ2xvc2VkCAEwYnlfcGFyYWNoYWlusQIBGFBhcmFJZAABKGNoYW5uZWxfaWQhBgE0SHJtcENoYW5uZWxJZAADBFBIUk1QIGNoYW5uZWwgY2xvc2VkLlhIcm1wQ2hhbm5lbEZvcmNlT3BlbmVkEAEYc2VuZGVysQIBGFBhcmFJZAABJHJlY2lwaWVudLECARhQYXJhSWQAAVRwcm9wb3NlZF9tYXhfY2FwYWNpdHkQAQx1MzIAAWRwcm9wb3NlZF9tYXhfbWVzc2FnZV9zaXplEAEMdTMyAAQErEFuIEhSTVAgY2hhbm5lbCB3YXMgb3BlbmVkIHZpYSBSb290IG9yaWdpbi5cSHJtcFN5c3RlbUNoYW5uZWxPcGVuZWQQARhzZW5kZXKxAgEYUGFyYUlkAAEkcmVjaXBpZW50sQIBGFBhcmFJZAABVHByb3Bvc2VkX21heF9jYXBhY2l0eRABDHUzMgABZHByb3Bvc2VkX21heF9tZXNzYWdlX3NpemUQAQx1MzIABQS8QW4gSFJNUCBjaGFubmVsIHdhcyBvcGVuZWQgd2l0aCBhIHN5c3RlbSBjaGFpbi5oT3BlbkNoYW5uZWxEZXBvc2l0c1VwZGF0ZWQIARhzZW5kZXKxAgEYUGFyYUlkAAEkcmVjaXBpZW50sQIBGFBhcmFJZAAGBKBBbiBIUk1QIGNoYW5uZWwncyBkZXBvc2l0cyB3ZXJlIHVwZGF0ZWQuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV04QgQbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucyBkaXNwdXRlcxhwYWxsZXQURXZlbnQEBFQAAQxARGlzcHV0ZUluaXRpYXRlZAgA9QUBNENhbmRpZGF0ZUhhc2gAAOUIATxEaXNwdXRlTG9jYXRpb24AAAQJAUEgZGlzcHV0ZSBoYXMgYmVlbiBpbml0aWF0ZWQuIFxbY2FuZGlkYXRlIGhhc2gsIGRpc3B1dGUgbG9jYXRpb25cXUBEaXNwdXRlQ29uY2x1ZGVkCAD1BQE0Q2FuZGlkYXRlSGFzaAAA6QgBNERpc3B1dGVSZXN1bHQAAQjMQSBkaXNwdXRlIGhhcyBjb25jbHVkZWQgZm9yIG9yIGFnYWluc3QgYSBjYW5kaWRhdGUutGBcW3BhcmEgaWQsIGNhbmRpZGF0ZSBoYXNoLCBkaXNwdXRlIHJlc3VsdFxdYBhSZXZlcnQEABABREJsb2NrTnVtYmVyRm9yPFQ+AAIQ/EEgZGlzcHV0ZSBoYXMgY29uY2x1ZGVkIHdpdGggc3VwZXJtYWpvcml0eSBhZ2FpbnN0IGEgY2FuZGlkYXRlLg0BQmxvY2sgYXV0aG9ycyBzaG91bGQgbm8gbG9uZ2VyIGJ1aWxkIG9uIHRvcCBvZiB0aGlzIGhlYWQgYW5kIHNob3VsZAEBaW5zdGVhZCByZXZlcnQgdGhlIGJsb2NrIGF0IHRoZSBnaXZlbiBoZWlnaHQuIFRoaXMgc2hvdWxkIGJlIHRoZfxudW1iZXIgb2YgdGhlIGNoaWxkIG9mIHRoZSBsYXN0IGtub3duIHZhbGlkIGJsb2NrIGluIHRoZSBjaGFpbi4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXTlCAxscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zIGRpc3B1dGVzPERpc3B1dGVMb2NhdGlvbgABCBRMb2NhbAAAABhSZW1vdGUAAQAA6QgMbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucyBkaXNwdXRlczREaXNwdXRlUmVzdWx0AAEIFFZhbGlkAAAAHEludmFsaWQAAQAA7QgQbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucyRvbl9kZW1hbmQYcGFsbGV0FEV2ZW50BARUAAEMTE9uRGVtYW5kT3JkZXJQbGFjZWQMARxwYXJhX2lksQIBGFBhcmFJZAABKHNwb3RfcHJpY2UYATBCYWxhbmNlT2Y8VD4AAShvcmRlcmVkX2J5AAEwVDo6QWNjb3VudElkAAAEDQFBbiBvcmRlciB3YXMgcGxhY2VkIGF0IHNvbWUgc3BvdCBwcmljZSBhbW91bnQgYnkgb3JkZXJlciBvcmRlcmVkX2J5MFNwb3RQcmljZVNldAQBKHNwb3RfcHJpY2UYATBCYWxhbmNlT2Y8VD4AAQS4VGhlIHZhbHVlIG9mIHRoZSBzcG90IHByaWNlIGhhcyBsaWtlbHkgY2hhbmdlZDxBY2NvdW50Q3JlZGl0ZWQIAQx3aG8AATBUOjpBY2NvdW50SWQAARhhbW91bnQYATBCYWxhbmNlT2Y8VD4AAgR0QW4gYWNjb3VudCB3YXMgZ2l2ZW4gY3JlZGl0cy4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXTxCBBccG9sa2Fkb3RfcnVudGltZV9jb21tb248cGFyYXNfcmVnaXN0cmFyGHBhbGxldBRFdmVudAQEVAABEChSZWdpc3RlcmVkCAEccGFyYV9pZLECARhQYXJhSWQAARxtYW5hZ2VyAAEwVDo6QWNjb3VudElkAAAAMERlcmVnaXN0ZXJlZAQBHHBhcmFfaWSxAgEYUGFyYUlkAAEAIFJlc2VydmVkCAEccGFyYV9pZLECARhQYXJhSWQAAQx3aG8AATBUOjpBY2NvdW50SWQAAgAcU3dhcHBlZAgBHHBhcmFfaWSxAgEYUGFyYUlkAAEgb3RoZXJfaWSxAgEYUGFyYUlkAAMABHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV09QgQXHBvbGthZG90X3J1bnRpbWVfY29tbW9uFHNsb3RzGHBhbGxldBRFdmVudAQEVAABCDhOZXdMZWFzZVBlcmlvZAQBMGxlYXNlX3BlcmlvZBABQExlYXNlUGVyaW9kT2Y8VD4AAASQQSBuZXcgYFtsZWFzZV9wZXJpb2RdYCBpcyBiZWdpbm5pbmcuGExlYXNlZBgBHHBhcmFfaWSxAgEYUGFyYUlkAAEYbGVhc2VyAAEwVDo6QWNjb3VudElkAAEwcGVyaW9kX2JlZ2luEAFATGVhc2VQZXJpb2RPZjxUPgABMHBlcmlvZF9jb3VudBABQExlYXNlUGVyaW9kT2Y8VD4AAThleHRyYV9yZXNlcnZlZBgBMEJhbGFuY2VPZjxUPgABMHRvdGFsX2Ftb3VudBgBMEJhbGFuY2VPZjxUPgABDDUBQSBwYXJhIGhhcyB3b24gdGhlIHJpZ2h0IHRvIGEgY29udGludW91cyBzZXQgb2YgbGVhc2UgcGVyaW9kcyBhcyBhIHBhcmFjaGFpbi5FAUZpcnN0IGJhbGFuY2UgaXMgYW55IGV4dHJhIGFtb3VudCByZXNlcnZlZCBvbiB0b3Agb2YgdGhlIHBhcmEncyBleGlzdGluZyBkZXBvc2l0LrBTZWNvbmQgYmFsYW5jZSBpcyB0aGUgdG90YWwgYW1vdW50IHJlc2VydmVkLgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldPkIEFxwb2xrYWRvdF9ydW50aW1lX2NvbW1vbiBhdWN0aW9ucxhwYWxsZXQURXZlbnQEBFQAARw4QXVjdGlvblN0YXJ0ZWQMATRhdWN0aW9uX2luZGV4EAEwQXVjdGlvbkluZGV4AAEwbGVhc2VfcGVyaW9kEAFATGVhc2VQZXJpb2RPZjxUPgABGGVuZGluZxABREJsb2NrTnVtYmVyRm9yPFQ+AAAISQFBbiBhdWN0aW9uIHN0YXJ0ZWQuIFByb3ZpZGVzIGl0cyBpbmRleCBhbmQgdGhlIGJsb2NrIG51bWJlciB3aGVyZSBpdCB3aWxsIGJlZ2luIHRvFQFjbG9zZSBhbmQgdGhlIGZpcnN0IGxlYXNlIHBlcmlvZCBvZiB0aGUgcXVhZHJ1cGxldCB0aGF0IGlzIGF1Y3Rpb25lZC40QXVjdGlvbkNsb3NlZAQBNGF1Y3Rpb25faW5kZXgQATBBdWN0aW9uSW5kZXgAAQS4QW4gYXVjdGlvbiBlbmRlZC4gQWxsIGZ1bmRzIGJlY29tZSB1bnJlc2VydmVkLiBSZXNlcnZlZAwBGGJpZGRlcgABMFQ6OkFjY291bnRJZAABOGV4dHJhX3Jlc2VydmVkGAEwQmFsYW5jZU9mPFQ+AAEwdG90YWxfYW1vdW50GAEwQmFsYW5jZU9mPFQ+AAIISQFGdW5kcyB3ZXJlIHJlc2VydmVkIGZvciBhIHdpbm5pbmcgYmlkLiBGaXJzdCBiYWxhbmNlIGlzIHRoZSBleHRyYSBhbW91bnQgcmVzZXJ2ZWQuUFNlY29uZCBpcyB0aGUgdG90YWwuKFVucmVzZXJ2ZWQIARhiaWRkZXIAATBUOjpBY2NvdW50SWQAARhhbW91bnQYATBCYWxhbmNlT2Y8VD4AAwQpAUZ1bmRzIHdlcmUgdW5yZXNlcnZlZCBzaW5jZSBiaWRkZXIgaXMgbm8gbG9uZ2VyIGFjdGl2ZS4gYFtiaWRkZXIsIGFtb3VudF1gSFJlc2VydmVDb25maXNjYXRlZAwBHHBhcmFfaWSxAgEYUGFyYUlkAAEYbGVhc2VyAAEwVDo6QWNjb3VudElkAAEYYW1vdW50GAEwQmFsYW5jZU9mPFQ+AAQIVQFTb21lb25lIGF0dGVtcHRlZCB0byBsZWFzZSB0aGUgc2FtZSBzbG90IHR3aWNlIGZvciBhIHBhcmFjaGFpbi4gVGhlIGFtb3VudCBpcyBoZWxkIGluuHJlc2VydmUgYnV0IG5vIHBhcmFjaGFpbiBzbG90IGhhcyBiZWVuIGxlYXNlZC4sQmlkQWNjZXB0ZWQUARhiaWRkZXIAATBUOjpBY2NvdW50SWQAARxwYXJhX2lksQIBGFBhcmFJZAABGGFtb3VudBgBMEJhbGFuY2VPZjxUPgABKGZpcnN0X3Nsb3QQAUBMZWFzZVBlcmlvZE9mPFQ+AAEkbGFzdF9zbG90EAFATGVhc2VQZXJpb2RPZjxUPgAFBMhBIG5ldyBiaWQgaGFzIGJlZW4gYWNjZXB0ZWQgYXMgdGhlIGN1cnJlbnQgd2lubmVyLjRXaW5uaW5nT2Zmc2V0CAE0YXVjdGlvbl9pbmRleBABMEF1Y3Rpb25JbmRleAABMGJsb2NrX251bWJlchABREJsb2NrTnVtYmVyRm9yPFQ+AAYIWQFUaGUgd2lubmluZyBvZmZzZXQgd2FzIGNob3NlbiBmb3IgYW4gYXVjdGlvbi4gVGhpcyB3aWxsIG1hcCBpbnRvIHRoZSBgV2lubmluZ2Agc3RvcmFnZRBtYXAuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0/QgQXHBvbGthZG90X3J1bnRpbWVfY29tbW9uJGNyb3dkbG9hbhhwYWxsZXQURXZlbnQEBFQAASgcQ3JlYXRlZAQBHHBhcmFfaWSxAgEYUGFyYUlkAAAEjENyZWF0ZSBhIG5ldyBjcm93ZGxvYW5pbmcgY2FtcGFpZ24uLENvbnRyaWJ1dGVkDAEMd2hvAAEwVDo6QWNjb3VudElkAAEoZnVuZF9pbmRleLECARhQYXJhSWQAARhhbW91bnQYATBCYWxhbmNlT2Y8VD4AAQRwQ29udHJpYnV0ZWQgdG8gYSBjcm93ZCBzYWxlLiBXaXRoZHJldwwBDHdobwABMFQ6OkFjY291bnRJZAABKGZ1bmRfaW5kZXixAgEYUGFyYUlkAAEYYW1vdW50GAEwQmFsYW5jZU9mPFQ+AAIEnFdpdGhkcmV3IGZ1bGwgYmFsYW5jZSBvZiBhIGNvbnRyaWJ1dG9yLkRQYXJ0aWFsbHlSZWZ1bmRlZAQBHHBhcmFfaWSxAgEYUGFyYUlkAAMILQFUaGUgbG9hbnMgaW4gYSBmdW5kIGhhdmUgYmVlbiBwYXJ0aWFsbHkgZGlzc29sdmVkLCBpLmUuIHRoZXJlIGFyZSBzb21lIGxlZnS0b3ZlciBjaGlsZCBrZXlzIHRoYXQgc3RpbGwgbmVlZCB0byBiZSBraWxsZWQuLEFsbFJlZnVuZGVkBAEccGFyYV9pZLECARhQYXJhSWQABAScQWxsIGxvYW5zIGluIGEgZnVuZCBoYXZlIGJlZW4gcmVmdW5kZWQuJERpc3NvbHZlZAQBHHBhcmFfaWSxAgEYUGFyYUlkAAUESEZ1bmQgaXMgZGlzc29sdmVkLjxIYW5kbGVCaWRSZXN1bHQIARxwYXJhX2lksQIBGFBhcmFJZAABGHJlc3VsdAEBAThEaXNwYXRjaFJlc3VsdAAGBPRUaGUgcmVzdWx0IG9mIHRyeWluZyB0byBzdWJtaXQgYSBuZXcgYmlkIHRvIHRoZSBTbG90cyBwYWxsZXQuGEVkaXRlZAQBHHBhcmFfaWSxAgEYUGFyYUlkAAcExFRoZSBjb25maWd1cmF0aW9uIHRvIGEgY3Jvd2Rsb2FuIGhhcyBiZWVuIGVkaXRlZC4sTWVtb1VwZGF0ZWQMAQx3aG8AATBUOjpBY2NvdW50SWQAARxwYXJhX2lksQIBGFBhcmFJZAABEG1lbW84ARxWZWM8dTg+AAgEYEEgbWVtbyBoYXMgYmVlbiB1cGRhdGVkLjxBZGRlZFRvTmV3UmFpc2UEARxwYXJhX2lksQIBGFBhcmFJZAAJBKBBIHBhcmFjaGFpbiBoYXMgYmVlbiBtb3ZlZCB0byBgTmV3UmFpc2VgBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0AQkQXHBvbGthZG90X3J1bnRpbWVfY29tbW9uOGFzc2lnbmVkX3Nsb3RzGHBhbGxldBRFdmVudAQEVAABEFRQZXJtYW5lbnRTbG90QXNzaWduZWQEALECARhQYXJhSWQAAATMQSBwYXJhY2hhaW4gd2FzIGFzc2lnbmVkIGEgcGVybWFuZW50IHBhcmFjaGFpbiBzbG90VFRlbXBvcmFyeVNsb3RBc3NpZ25lZAQAsQIBGFBhcmFJZAABBMxBIHBhcmFjaGFpbiB3YXMgYXNzaWduZWQgYSB0ZW1wb3JhcnkgcGFyYWNoYWluIHNsb3RgTWF4UGVybWFuZW50U2xvdHNDaGFuZ2VkBAEUc2xvdHMQAQx1MzIAAgTYVGhlIG1heGltdW0gbnVtYmVyIG9mIHBlcm1hbmVudCBzbG90cyBoYXMgYmVlbiBjaGFuZ2VkYE1heFRlbXBvcmFyeVNsb3RzQ2hhbmdlZAQBFHNsb3RzEAEMdTMyAAME2FRoZSBtYXhpbXVtIG51bWJlciBvZiB0ZW1wb3Jhcnkgc2xvdHMgaGFzIGJlZW4gY2hhbmdlZAR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldAUJEGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMgY29yZXRpbWUYcGFsbGV0FEV2ZW50BARUAAEIUFJldmVudWVJbmZvUmVxdWVzdGVkBAEQd2hlbhABREJsb2NrTnVtYmVyRm9yPFQ+AAAEIQFUaGUgYnJva2VyIGNoYWluIGhhcyBhc2tlZCBmb3IgcmV2ZW51ZSBpbmZvcm1hdGlvbiBmb3IgYSBzcGVjaWZpYyBibG9jay4wQ29yZUFzc2lnbmVkBAEQY29yZdEIASRDb3JlSW5kZXgAAQTsQSBjb3JlIGhhcyByZWNlaXZlZCBhIG5ldyBhc3NpZ25tZW50IGZyb20gdGhlIGJyb2tlciBjaGFpbi4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXQJCQx4cGFsbGV0X3N0YWtpbmdfYXN5bmNfYWhfY2xpZW50GHBhbGxldBRFdmVudAQEVAABEFBWYWxpZGF0b3JTZXRSZWNlaXZlZBABCGlkEAEMdTMyAAFcbmV3X3ZhbGlkYXRvcl9zZXRfY291bnQQAQx1MzIAASxwcnVuZV91cF90b5wBUE9wdGlvbjxTZXNzaW9uSW5kZXg+AAEgbGVmdG92ZXIgARBib29sAAAEmEEgbmV3IHZhbGlkYXRvciBzZXQgaGFzIGJlZW4gcmVjZWl2ZWQuXENvdWxkTm90TWVyZ2VBbmREcm9wcGVkAAEQ9FdlIGNvdWxkIG5vdCBtZXJnZSwgYW5kIHRoZXJlZm9yZSBkcm9wcGVkIGEgYnVmZmVyZWQgbWVzc2FnZS4AVQFOb3RlIHRoYXQgdGhpcyBldmVudCBpcyBtb3JlIHJlc2VtYmxpbmcgYW4gZXJyb3IsIGJ1dCB3ZSB1c2UgYW4gZXZlbnQgYmVjYXVzZSBpbiB0aGlz0HBhbGxldCB3ZSBuZWVkIHRvIG11dGF0ZSBzdG9yYWdlIHVwb24gc29tZSBmYWlsdXJlcy5UU2V0VG9vU21hbGxBbmREcm9wcGVkAAIIzFRoZSB2YWxpZGF0b3Igc2V0IHJlY2VpdmVkIGlzIHdheSB0b28gc21hbGwsIGFzIHBlcpBbYENvbmZpZzo6TWluaW11bVZhbGlkYXRvclNldFNpemVgXS4oVW5leHBlY3RlZAQADQkBOFVuZXhwZWN0ZWRLaW5kAAMIWQFTb21ldGhpbmcgb2NjdXJyZWQgdGhhdCBzaG91bGQgbmV2ZXIgaGFwcGVuIHVuZGVyIG5vcm1hbCBvcGVyYXRpb24uIExvZ2dlZCBhcyBhbiBldmVudHBmb3IgZmFpbC1zYWZlIG9ic2VydmFiaWxpdHkuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0DQkMeHBhbGxldF9zdGFraW5nX2FzeW5jX2FoX2NsaWVudBhwYWxsZXQ4VW5leHBlY3RlZEtpbmQAAQiAUmVjZWl2ZWRWYWxpZGF0b3JTZXRXaGlsZVBhc3NpdmUAAABgVW5leHBlY3RlZE1vZGVUcmFuc2l0aW9uAAEAABEJDERwYWxsZXRfbWlncmF0aW9ucxhwYWxsZXQURXZlbnQEBFQAASA4VXBncmFkZVN0YXJ0ZWQEAShtaWdyYXRpb25zEAEMdTMyENBUaGUgbnVtYmVyIG9mIG1pZ3JhdGlvbnMgdGhhdCB0aGlzIHVwZ3JhZGUgY29udGFpbnMuAEEBVGhpcyBjYW4gYmUgdXNlZCB0byBkZXNpZ24gYSBwcm9ncmVzcyBpbmRpY2F0b3IgaW4gY29tYmluYXRpb24gd2l0aCBjb3VudGluZyB0aGXMYE1pZ3JhdGlvbkNvbXBsZXRlZGAgYW5kIGBNaWdyYXRpb25Ta2lwcGVkYCBldmVudHMuAAxoQSBSdW50aW1lIHVwZ3JhZGUgc3RhcnRlZC4A+El0cyBlbmQgaXMgaW5kaWNhdGVkIGJ5IGBVcGdyYWRlQ29tcGxldGVkYCBvciBgVXBncmFkZUZhaWxlZGAuQFVwZ3JhZGVDb21wbGV0ZWQAAQyYVGhlIGN1cnJlbnQgcnVudGltZSB1cGdyYWRlIGNvbXBsZXRlZC4AHQFUaGlzIGltcGxpZXMgdGhhdCBhbGwgb2YgaXRzIG1pZ3JhdGlvbnMgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSBhcyB3ZWxsLjRVcGdyYWRlRmFpbGVkAAIMXFJ1bnRpbWUgdXBncmFkZSBmYWlsZWQuAOhUaGlzIGlzIHZlcnkgYmFkIGFuZCB3aWxsIHJlcXVpcmUgZ292ZXJuYW5jZSBpbnRlcnZlbnRpb24uQE1pZ3JhdGlvblNraXBwZWQEARRpbmRleBABDHUzMgQpAVRoZSBpbmRleCBvZiB0aGUgc2tpcHBlZCBtaWdyYXRpb24gd2l0aGluIHRoZSBbYENvbmZpZzo6TWlncmF0aW9uc2BdIGxpc3QuAwQJAUEgbWlncmF0aW9uIHdhcyBza2lwcGVkIHNpbmNlIGl0IHdhcyBhbHJlYWR5IGV4ZWN1dGVkIGluIHRoZSBwYXN0LkRNaWdyYXRpb25BZHZhbmNlZAgBFGluZGV4EAEMdTMyBAkBVGhlIGluZGV4IG9mIHRoZSBtaWdyYXRpb24gd2l0aGluIHRoZSBbYENvbmZpZzo6TWlncmF0aW9uc2BdIGxpc3QuARB0b29rEAFEQmxvY2tOdW1iZXJGb3I8VD4E1FRoZSBudW1iZXIgb2YgYmxvY2tzIHRoYXQgdGhpcyBtaWdyYXRpb24gdG9vayBzbyBmYXIuBARcQSBtaWdyYXRpb24gcHJvZ3Jlc3NlZC5ITWlncmF0aW9uQ29tcGxldGVkCAEUaW5kZXgQAQx1MzIECQFUaGUgaW5kZXggb2YgdGhlIG1pZ3JhdGlvbiB3aXRoaW4gdGhlIFtgQ29uZmlnOjpNaWdyYXRpb25zYF0gbGlzdC4BEHRvb2sQAURCbG9ja051bWJlckZvcjxUPgTUVGhlIG51bWJlciBvZiBibG9ja3MgdGhhdCB0aGlzIG1pZ3JhdGlvbiB0b29rIHNvIGZhci4FBFhBIE1pZ3JhdGlvbiBjb21wbGV0ZWQuPE1pZ3JhdGlvbkZhaWxlZAgBFGluZGV4EAEMdTMyBAkBVGhlIGluZGV4IG9mIHRoZSBtaWdyYXRpb24gd2l0aGluIHRoZSBbYENvbmZpZzo6TWlncmF0aW9uc2BdIGxpc3QuARB0b29rEAFEQmxvY2tOdW1iZXJGb3I8VD4E1FRoZSBudW1iZXIgb2YgYmxvY2tzIHRoYXQgdGhpcyBtaWdyYXRpb24gdG9vayBzbyBmYXIuBgxMQSBNaWdyYXRpb24gZmFpbGVkLgBNAVRoaXMgaW1wbGllcyB0aGF0IHRoZSB3aG9sZSB1cGdyYWRlIGZhaWxlZCBhbmQgZ292ZXJuYW5jZSBpbnRlcnZlbnRpb24gaXMgcmVxdWlyZWQuPEhpc3RvcmljQ2xlYXJlZAQBLG5leHRfY3Vyc29y2QcBPE9wdGlvbjxWZWM8dTg+PgToU2hvdWxkIGJlIHBhc3NlZCB0byBgY2xlYXJfaGlzdG9yaWNgIGluIGEgc3VjY2Vzc2l2ZSBjYWxsLgcEyFRoZSBzZXQgb2YgaGlzdG9yaWNhbCBtaWdyYXRpb25zIGhhcyBiZWVuIGNsZWFyZWQuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0FQkMKHBhbGxldF94Y20YcGFsbGV0FEV2ZW50BARUAAF0JEF0dGVtcHRlZAQBHG91dGNvbWUZCQFQeGNtOjpsYXRlc3Q6Ok91dGNvbWUAAASoRXhlY3V0aW9uIG9mIGFuIFhDTSBtZXNzYWdlIHdhcyBhdHRlbXB0ZWQuEFNlbnQQARhvcmlnaW65AgEgTG9jYXRpb24AASxkZXN0aW5hdGlvbrkCASBMb2NhdGlvbgABHG1lc3NhZ2UBBwEcWGNtPCgpPgABKG1lc3NhZ2VfaWQEARxYY21IYXNoAAEEYEFuIFhDTSBtZXNzYWdlIHdhcyBzZW50LihTZW5kRmFpbGVkEAEYb3JpZ2luuQIBIExvY2F0aW9uAAEsZGVzdGluYXRpb265AgEgTG9jYXRpb24AARRlcnJvciEJASRTZW5kRXJyb3IAAShtZXNzYWdlX2lkBAEcWGNtSGFzaAACBHhBbiBYQ00gbWVzc2FnZSBmYWlsZWQgdG8gc2VuZC48UHJvY2Vzc1hjbUVycm9yDAEYb3JpZ2luuQIBIExvY2F0aW9uAAEUZXJyb3ItBwEgWGNtRXJyb3IAAShtZXNzYWdlX2lkBAEcWGNtSGFzaAADBIRBbiBYQ00gbWVzc2FnZSBmYWlsZWQgdG8gcHJvY2Vzcy5IVW5leHBlY3RlZFJlc3BvbnNlCAEYb3JpZ2luuQIBIExvY2F0aW9uAAEgcXVlcnlfaWQwARxRdWVyeUlkAAQMWQFRdWVyeSByZXNwb25zZSByZWNlaXZlZCB3aGljaCBkb2VzIG5vdCBtYXRjaCBhIHJlZ2lzdGVyZWQgcXVlcnkuIFRoaXMgbWF5IGJlIGJlY2F1c2UgYVUBbWF0Y2hpbmcgcXVlcnkgd2FzIG5ldmVyIHJlZ2lzdGVyZWQsIGl0IG1heSBiZSBiZWNhdXNlIGl0IGlzIGEgZHVwbGljYXRlIHJlc3BvbnNlLCBvcnBiZWNhdXNlIHRoZSBxdWVyeSB0aW1lZCBvdXQuNFJlc3BvbnNlUmVhZHkIASBxdWVyeV9pZDABHFF1ZXJ5SWQAASByZXNwb25zZSEHASBSZXNwb25zZQAFCF0BUXVlcnkgcmVzcG9uc2UgaGFzIGJlZW4gcmVjZWl2ZWQgYW5kIGlzIHJlYWR5IGZvciB0YWtpbmcgd2l0aCBgdGFrZV9yZXNwb25zZWAuIFRoZXJlIGlzgG5vIHJlZ2lzdGVyZWQgbm90aWZpY2F0aW9uIGNhbGwuIE5vdGlmaWVkDAEgcXVlcnlfaWQwARxRdWVyeUlkAAEwcGFsbGV0X2luZGV4CAEIdTgAAShjYWxsX2luZGV4CAEIdTgABghZAVF1ZXJ5IHJlc3BvbnNlIGhhcyBiZWVuIHJlY2VpdmVkIGFuZCBxdWVyeSBpcyByZW1vdmVkLiBUaGUgcmVnaXN0ZXJlZCBub3RpZmljYXRpb24gaGFzqGJlZW4gZGlzcGF0Y2hlZCBhbmQgZXhlY3V0ZWQgc3VjY2Vzc2Z1bGx5LkBOb3RpZnlPdmVyd2VpZ2h0FAEgcXVlcnlfaWQwARxRdWVyeUlkAAEwcGFsbGV0X2luZGV4CAEIdTgAAShjYWxsX2luZGV4CAEIdTgAATRhY3R1YWxfd2VpZ2h0KAEYV2VpZ2h0AAFMbWF4X2J1ZGdldGVkX3dlaWdodCgBGFdlaWdodAAHDEkBUXVlcnkgcmVzcG9uc2UgaGFzIGJlZW4gcmVjZWl2ZWQgYW5kIHF1ZXJ5IGlzIHJlbW92ZWQuIFRoZSByZWdpc3RlcmVkIG5vdGlmaWNhdGlvblkBY291bGQgbm90IGJlIGRpc3BhdGNoZWQgYmVjYXVzZSB0aGUgZGlzcGF0Y2ggd2VpZ2h0IGlzIGdyZWF0ZXIgdGhhbiB0aGUgbWF4aW11bSB3ZWlnaHTkb3JpZ2luYWxseSBidWRnZXRlZCBieSB0aGlzIHJ1bnRpbWUgZm9yIHRoZSBxdWVyeSByZXN1bHQuTE5vdGlmeURpc3BhdGNoRXJyb3IMASBxdWVyeV9pZDABHFF1ZXJ5SWQAATBwYWxsZXRfaW5kZXgIAQh1OAABKGNhbGxfaW5kZXgIAQh1OAAICFUBUXVlcnkgcmVzcG9uc2UgaGFzIGJlZW4gcmVjZWl2ZWQgYW5kIHF1ZXJ5IGlzIHJlbW92ZWQuIFRoZXJlIHdhcyBhIGdlbmVyYWwgZXJyb3Igd2l0aIhkaXNwYXRjaGluZyB0aGUgbm90aWZpY2F0aW9uIGNhbGwuSE5vdGlmeURlY29kZUZhaWxlZAwBIHF1ZXJ5X2lkMAEcUXVlcnlJZAABMHBhbGxldF9pbmRleAgBCHU4AAEoY2FsbF9pbmRleAgBCHU4AAkMUQFRdWVyeSByZXNwb25zZSBoYXMgYmVlbiByZWNlaXZlZCBhbmQgcXVlcnkgaXMgcmVtb3ZlZC4gVGhlIGRpc3BhdGNoIHdhcyB1bmFibGUgdG8gYmVZAWRlY29kZWQgaW50byBhIGBDYWxsYDsgdGhpcyBtaWdodCBiZSBkdWUgdG8gZGlzcGF0Y2ggZnVuY3Rpb24gaGF2aW5nIGEgc2lnbmF0dXJlIHdoaWNolGlzIG5vdCBgKG9yaWdpbiwgUXVlcnlJZCwgUmVzcG9uc2UpYC5ASW52YWxpZFJlc3BvbmRlcgwBGG9yaWdpbrkCASBMb2NhdGlvbgABIHF1ZXJ5X2lkMAEcUXVlcnlJZAABRGV4cGVjdGVkX2xvY2F0aW9uQQcBQE9wdGlvbjxMb2NhdGlvbj4ACgxZAUV4cGVjdGVkIHF1ZXJ5IHJlc3BvbnNlIGhhcyBiZWVuIHJlY2VpdmVkIGJ1dCB0aGUgb3JpZ2luIGxvY2F0aW9uIG9mIHRoZSByZXNwb25zZSBkb2VzVQFub3QgbWF0Y2ggdGhhdCBleHBlY3RlZC4gVGhlIHF1ZXJ5IHJlbWFpbnMgcmVnaXN0ZXJlZCBmb3IgYSBsYXRlciwgdmFsaWQsIHJlc3BvbnNlIHRvbGJlIHJlY2VpdmVkIGFuZCBhY3RlZCB1cG9uLlxJbnZhbGlkUmVzcG9uZGVyVmVyc2lvbggBGG9yaWdpbrkCASBMb2NhdGlvbgABIHF1ZXJ5X2lkMAEcUXVlcnlJZAALHFEBRXhwZWN0ZWQgcXVlcnkgcmVzcG9uc2UgaGFzIGJlZW4gcmVjZWl2ZWQgYnV0IHRoZSBleHBlY3RlZCBvcmlnaW4gbG9jYXRpb24gcGxhY2VkIGluTQFzdG9yYWdlIGJ5IHRoaXMgcnVudGltZSBwcmV2aW91c2x5IGNhbm5vdCBiZSBkZWNvZGVkLiBUaGUgcXVlcnkgcmVtYWlucyByZWdpc3RlcmVkLgBBAVRoaXMgaXMgdW5leHBlY3RlZCAoc2luY2UgYSBsb2NhdGlvbiBwbGFjZWQgaW4gc3RvcmFnZSBpbiBhIHByZXZpb3VzbHkgZXhlY3V0aW5nTQFydW50aW1lIHNob3VsZCBiZSByZWFkYWJsZSBwcmlvciB0byBxdWVyeSB0aW1lb3V0KSBhbmQgZGFuZ2Vyb3VzIHNpbmNlIHRoZSBwb3NzaWJseVkBdmFsaWQgcmVzcG9uc2Ugd2lsbCBiZSBkcm9wcGVkLiBNYW51YWwgZ292ZXJuYW5jZSBpbnRlcnZlbnRpb24gaXMgcHJvYmFibHkgZ29pbmcgdG8gYmUcbmVlZGVkLjRSZXNwb25zZVRha2VuBAEgcXVlcnlfaWQwARxRdWVyeUlkAAwEyFJlY2VpdmVkIHF1ZXJ5IHJlc3BvbnNlIGhhcyBiZWVuIHJlYWQgYW5kIHJlbW92ZWQuNEFzc2V0c1RyYXBwZWQMARBoYXNoNAEQSDI1NgABGG9yaWdpbrkCASBMb2NhdGlvbgABGGFzc2V0c+EHATxWZXJzaW9uZWRBc3NldHMADQS4U29tZSBhc3NldHMgaGF2ZSBiZWVuIHBsYWNlZCBpbiBhbiBhc3NldCB0cmFwLlRWZXJzaW9uQ2hhbmdlTm90aWZpZWQQASxkZXN0aW5hdGlvbrkCASBMb2NhdGlvbgABGHJlc3VsdBABKFhjbVZlcnNpb24AARBjb3N0DQcBGEFzc2V0cwABKG1lc3NhZ2VfaWQEARxYY21IYXNoAA4MJQFBbiBYQ00gdmVyc2lvbiBjaGFuZ2Ugbm90aWZpY2F0aW9uIG1lc3NhZ2UgaGFzIGJlZW4gYXR0ZW1wdGVkIHRvIGJlIHNlbnQuAOBUaGUgY29zdCBvZiBzZW5kaW5nIGl0IChib3JuZSBieSB0aGUgY2hhaW4pIGlzIGluY2x1ZGVkLlxTdXBwb3J0ZWRWZXJzaW9uQ2hhbmdlZAgBIGxvY2F0aW9uuQIBIExvY2F0aW9uAAEcdmVyc2lvbhABKFhjbVZlcnNpb24ADwg5AVRoZSBzdXBwb3J0ZWQgdmVyc2lvbiBvZiBhIGxvY2F0aW9uIGhhcyBiZWVuIGNoYW5nZWQuIFRoaXMgbWlnaHQgYmUgdGhyb3VnaCBhbsBhdXRvbWF0aWMgbm90aWZpY2F0aW9uIG9yIGEgbWFudWFsIGludGVydmVudGlvbi5QTm90aWZ5VGFyZ2V0U2VuZEZhaWwMASBsb2NhdGlvbrkCASBMb2NhdGlvbgABIHF1ZXJ5X2lkMAEcUXVlcnlJZAABFGVycm9yLQcBIFhjbUVycm9yABAIWQFBIGdpdmVuIGxvY2F0aW9uIHdoaWNoIGhhZCBhIHZlcnNpb24gY2hhbmdlIHN1YnNjcmlwdGlvbiB3YXMgZHJvcHBlZCBvd2luZyB0byBhbiBlcnJvcnxzZW5kaW5nIHRoZSBub3RpZmljYXRpb24gdG8gaXQuZE5vdGlmeVRhcmdldE1pZ3JhdGlvbkZhaWwIASBsb2NhdGlvblkFAURWZXJzaW9uZWRMb2NhdGlvbgABIHF1ZXJ5X2lkMAEcUXVlcnlJZAARCFkBQSBnaXZlbiBsb2NhdGlvbiB3aGljaCBoYWQgYSB2ZXJzaW9uIGNoYW5nZSBzdWJzY3JpcHRpb24gd2FzIGRyb3BwZWQgb3dpbmcgdG8gYW4gZXJyb3K0bWlncmF0aW5nIHRoZSBsb2NhdGlvbiB0byBvdXIgbmV3IFhDTSBmb3JtYXQuVEludmFsaWRRdWVyaWVyVmVyc2lvbggBGG9yaWdpbrkCASBMb2NhdGlvbgABIHF1ZXJ5X2lkMAEcUXVlcnlJZAASHFUBRXhwZWN0ZWQgcXVlcnkgcmVzcG9uc2UgaGFzIGJlZW4gcmVjZWl2ZWQgYnV0IHRoZSBleHBlY3RlZCBxdWVyaWVyIGxvY2F0aW9uIHBsYWNlZCBpbk0Bc3RvcmFnZSBieSB0aGlzIHJ1bnRpbWUgcHJldmlvdXNseSBjYW5ub3QgYmUgZGVjb2RlZC4gVGhlIHF1ZXJ5IHJlbWFpbnMgcmVnaXN0ZXJlZC4AQQFUaGlzIGlzIHVuZXhwZWN0ZWQgKHNpbmNlIGEgbG9jYXRpb24gcGxhY2VkIGluIHN0b3JhZ2UgaW4gYSBwcmV2aW91c2x5IGV4ZWN1dGluZ00BcnVudGltZSBzaG91bGQgYmUgcmVhZGFibGUgcHJpb3IgdG8gcXVlcnkgdGltZW91dCkgYW5kIGRhbmdlcm91cyBzaW5jZSB0aGUgcG9zc2libHlZAXZhbGlkIHJlc3BvbnNlIHdpbGwgYmUgZHJvcHBlZC4gTWFudWFsIGdvdmVybmFuY2UgaW50ZXJ2ZW50aW9uIGlzIHByb2JhYmx5IGdvaW5nIHRvIGJlHG5lZWRlZC44SW52YWxpZFF1ZXJpZXIQARhvcmlnaW65AgEgTG9jYXRpb24AASBxdWVyeV9pZDABHFF1ZXJ5SWQAAUBleHBlY3RlZF9xdWVyaWVyuQIBIExvY2F0aW9uAAFQbWF5YmVfYWN0dWFsX3F1ZXJpZXJBBwFAT3B0aW9uPExvY2F0aW9uPgATDF0BRXhwZWN0ZWQgcXVlcnkgcmVzcG9uc2UgaGFzIGJlZW4gcmVjZWl2ZWQgYnV0IHRoZSBxdWVyaWVyIGxvY2F0aW9uIG9mIHRoZSByZXNwb25zZSBkb2VzUQFub3QgbWF0Y2ggdGhlIGV4cGVjdGVkLiBUaGUgcXVlcnkgcmVtYWlucyByZWdpc3RlcmVkIGZvciBhIGxhdGVyLCB2YWxpZCwgcmVzcG9uc2UgdG9sYmUgcmVjZWl2ZWQgYW5kIGFjdGVkIHVwb24uUFZlcnNpb25Ob3RpZnlTdGFydGVkDAEsZGVzdGluYXRpb265AgEgTG9jYXRpb24AARBjb3N0DQcBGEFzc2V0cwABKG1lc3NhZ2VfaWQEARxYY21IYXNoABQIWQFBIHJlbW90ZSBoYXMgcmVxdWVzdGVkIFhDTSB2ZXJzaW9uIGNoYW5nZSBub3RpZmljYXRpb24gZnJvbSB1cyBhbmQgd2UgaGF2ZSBob25vcmVkIGl0Lh0BQSB2ZXJzaW9uIGluZm9ybWF0aW9uIG1lc3NhZ2UgaXMgc2VudCB0byB0aGVtIGFuZCBpdHMgY29zdCBpcyBpbmNsdWRlZC5YVmVyc2lvbk5vdGlmeVJlcXVlc3RlZAwBLGRlc3RpbmF0aW9uuQIBIExvY2F0aW9uAAEQY29zdA0HARhBc3NldHMAAShtZXNzYWdlX2lkBAEcWGNtSGFzaAAVBD0BV2UgaGF2ZSByZXF1ZXN0ZWQgdGhhdCBhIHJlbW90ZSBjaGFpbiBzZW5kIHVzIFhDTSB2ZXJzaW9uIGNoYW5nZSBub3RpZmljYXRpb25zLmBWZXJzaW9uTm90aWZ5VW5yZXF1ZXN0ZWQMASxkZXN0aW5hdGlvbrkCASBMb2NhdGlvbgABEGNvc3QNBwEYQXNzZXRzAAEobWVzc2FnZV9pZAQBHFhjbUhhc2gAFgglAVdlIGhhdmUgcmVxdWVzdGVkIHRoYXQgYSByZW1vdGUgY2hhaW4gc3RvcHMgc2VuZGluZyB1cyBYQ00gdmVyc2lvbiBjaGFuZ2U4bm90aWZpY2F0aW9ucy4gRmVlc1BhaWQIARhwYXlpbme5AgEgTG9jYXRpb24AARBmZWVzDQcBGEFzc2V0cwAXBDEBRmVlcyB3ZXJlIHBhaWQgZnJvbSBhIGxvY2F0aW9uIGZvciBhbiBvcGVyYXRpb24gKG9mdGVuIGZvciB1c2luZyBgU2VuZFhjbWApLjRBc3NldHNDbGFpbWVkDAEQaGFzaDQBEEgyNTYAARhvcmlnaW65AgEgTG9jYXRpb24AARhhc3NldHPhBwE8VmVyc2lvbmVkQXNzZXRzABgEwFNvbWUgYXNzZXRzIGhhdmUgYmVlbiBjbGFpbWVkIGZyb20gYW4gYXNzZXQgdHJhcGBWZXJzaW9uTWlncmF0aW9uRmluaXNoZWQEARx2ZXJzaW9uEAEoWGNtVmVyc2lvbgAZBIRBIFhDTSB2ZXJzaW9uIG1pZ3JhdGlvbiBmaW5pc2hlZC48QWxpYXNBdXRob3JpemVkDAEcYWxpYXNlcrkCASBMb2NhdGlvbgABGHRhcmdldLkCASBMb2NhdGlvbgABGGV4cGlyeRkIASxPcHRpb248dTY0PgAaCF0BQW4gYGFsaWFzZXJgIGxvY2F0aW9uIHdhcyBhdXRob3JpemVkIGJ5IGB0YXJnZXRgIHRvIGFsaWFzIGl0LCBhdXRob3JpemF0aW9uIHZhbGlkIHVudGlsWGBleHBpcnlgIGJsb2NrIG51bWJlci5kQWxpYXNBdXRob3JpemF0aW9uUmVtb3ZlZAgBHGFsaWFzZXK5AgEgTG9jYXRpb24AARh0YXJnZXS5AgEgTG9jYXRpb24AGwTMYHRhcmdldGAgcmVtb3ZlZCBhbGlhcyBhdXRob3JpemF0aW9uIGZvciBgYWxpYXNlcmAucEFsaWFzZXNBdXRob3JpemF0aW9uc1JlbW92ZWQEARh0YXJnZXS5AgEgTG9jYXRpb24AHASoYHRhcmdldGAgcmVtb3ZlZCBhbGwgYWxpYXMgYXV0aG9yaXphdGlvbnMuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0GQkQLHN0YWdpbmdfeGNtCHY1GHRyYWl0cxxPdXRjb21lAAEMIENvbXBsZXRlBAEQdXNlZCgBGFdlaWdodAAAAChJbmNvbXBsZXRlCAEQdXNlZCgBGFdlaWdodAABFGVycm9yHQkBQEluc3RydWN0aW9uRXJyb3IAAQAURXJyb3IEAB0JAUBJbnN0cnVjdGlvbkVycm9yAAIAAB0JECxzdGFnaW5nX3hjbQh2NRh0cmFpdHNASW5zdHJ1Y3Rpb25FcnJvcgAACAEUaW5kZXgIAUBJbnN0cnVjdGlvbkluZGV4AAEUZXJyb3ItBwEURXJyb3IAACEJEAx4Y20IdjMYdHJhaXRzJFNlbmRFcnJvcgABHDROb3RBcHBsaWNhYmxlAAAAJFRyYW5zcG9ydAABAChVbnJvdXRhYmxlAAIAWERlc3RpbmF0aW9uVW5zdXBwb3J0ZWQAAwBURXhjZWVkc01heE1lc3NhZ2VTaXplAAQAPE1pc3NpbmdBcmd1bWVudAAFABBGZWVzAAYAACUJDFBwYWxsZXRfbWVzc2FnZV9xdWV1ZRhwYWxsZXQURXZlbnQEBFQAARBAUHJvY2Vzc2luZ0ZhaWxlZAwBCGlkNAEQSDI1NgSUVGhlIGBibGFrZTJfMjU2YCBoYXNoIG9mIHRoZSBtZXNzYWdlLgEYb3JpZ2luIQgBSE1lc3NhZ2VPcmlnaW5PZjxUPgRkVGhlIHF1ZXVlIG9mIHRoZSBtZXNzYWdlLgEUZXJyb3IpCQFMUHJvY2Vzc01lc3NhZ2VFcnJvchBgVGhlIGVycm9yIHRoYXQgb2NjdXJyZWQuAEkBVGhpcyBlcnJvciBpcyBwcmV0dHkgb3BhcXVlLiBNb3JlIGZpbmUtZ3JhaW5lZCBlcnJvcnMgbmVlZCB0byBiZSBlbWl0dGVkIGFzIGV2ZW50c2hieSB0aGUgYE1lc3NhZ2VQcm9jZXNzb3JgLgAEVQFNZXNzYWdlIGRpc2NhcmRlZCBkdWUgdG8gYW4gZXJyb3IgaW4gdGhlIGBNZXNzYWdlUHJvY2Vzc29yYCAodXN1YWxseSBhIGZvcm1hdCBlcnJvcikuJFByb2Nlc3NlZBABCGlkNAEQSDI1NgSUVGhlIGBibGFrZTJfMjU2YCBoYXNoIG9mIHRoZSBtZXNzYWdlLgEYb3JpZ2luIQgBSE1lc3NhZ2VPcmlnaW5PZjxUPgRkVGhlIHF1ZXVlIG9mIHRoZSBtZXNzYWdlLgEsd2VpZ2h0X3VzZWQoARhXZWlnaHQEwEhvdyBtdWNoIHdlaWdodCB3YXMgdXNlZCB0byBwcm9jZXNzIHRoZSBtZXNzYWdlLgEcc3VjY2VzcyABEGJvb2wYiFdoZXRoZXIgdGhlIG1lc3NhZ2Ugd2FzIHByb2Nlc3NlZC4ASQFOb3RlIHRoYXQgdGhpcyBkb2VzIG5vdCBtZWFuIHRoYXQgdGhlIHVuZGVybHlpbmcgYE1lc3NhZ2VQcm9jZXNzb3JgIHdhcyBpbnRlcm5hbGx5NQFzdWNjZXNzZnVsLiBJdCAqc29sZWx5KiBtZWFucyB0aGF0IHRoZSBNUSBwYWxsZXQgd2lsbCB0cmVhdCB0aGlzIGFzIGEgc3VjY2Vzc00BY29uZGl0aW9uIGFuZCBkaXNjYXJkIHRoZSBtZXNzYWdlLiBBbnkgaW50ZXJuYWwgZXJyb3IgbmVlZHMgdG8gYmUgZW1pdHRlZCBhcyBldmVudHNoYnkgdGhlIGBNZXNzYWdlUHJvY2Vzc29yYC4BBFRNZXNzYWdlIGlzIHByb2Nlc3NlZC5IT3ZlcndlaWdodEVucXVldWVkEAEIaWQEASBbdTg7IDMyXQSUVGhlIGBibGFrZTJfMjU2YCBoYXNoIG9mIHRoZSBtZXNzYWdlLgEYb3JpZ2luIQgBSE1lc3NhZ2VPcmlnaW5PZjxUPgRkVGhlIHF1ZXVlIG9mIHRoZSBtZXNzYWdlLgEocGFnZV9pbmRleBABJFBhZ2VJbmRleARgVGhlIHBhZ2Ugb2YgdGhlIG1lc3NhZ2UuATRtZXNzYWdlX2luZGV4EAEcVDo6U2l6ZQSkVGhlIGluZGV4IG9mIHRoZSBtZXNzYWdlIHdpdGhpbiB0aGUgcGFnZS4CBIxNZXNzYWdlIHBsYWNlZCBpbiBvdmVyd2VpZ2h0IHF1ZXVlLihQYWdlUmVhcGVkCAEYb3JpZ2luIQgBSE1lc3NhZ2VPcmlnaW5PZjxUPgRYVGhlIHF1ZXVlIG9mIHRoZSBwYWdlLgEUaW5kZXgQASRQYWdlSW5kZXgEWFRoZSBpbmRleCBvZiB0aGUgcGFnZS4DBFRUaGlzIHBhZ2Ugd2FzIHJlYXBlZC4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXQpCRA0ZnJhbWVfc3VwcG9ydBh0cmFpdHMgbWVzc2FnZXNMUHJvY2Vzc01lc3NhZ2VFcnJvcgABGCRCYWRGb3JtYXQAAAAcQ29ycnVwdAABACxVbnN1cHBvcnRlZAACAChPdmVyd2VpZ2h0BAAoARhXZWlnaHQAAwAUWWllbGQABABEU3RhY2tMaW1pdFJlYWNoZWQABQAALQkMRHBhbGxldF9hc3NldF9yYXRlGHBhbGxldBRFdmVudAQEVAABDEBBc3NldFJhdGVDcmVhdGVkCAEoYXNzZXRfa2luZAEFATBUOjpBc3NldEtpbmQAARByYXRlLQgBJEZpeGVkVTEyOAAAAEBBc3NldFJhdGVSZW1vdmVkBAEoYXNzZXRfa2luZAEFATBUOjpBc3NldEtpbmQAAQBAQXNzZXRSYXRlVXBkYXRlZAwBKGFzc2V0X2tpbmQBBQEwVDo6QXNzZXRLaW5kAAEMb2xkLQgBJEZpeGVkVTEyOAABDG5ldy0IASRGaXhlZFUxMjgAAgAEfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXQxCQxMcGFsbGV0X3Jvb3RfdGVzdGluZxhwYWxsZXQURXZlbnQEBFQAAQRERGVmZW5zaXZlVGVzdENhbGwAAAQBAUV2ZW50IGRpc3BhdGNoZWQgd2hlbiB0aGUgdHJpZ2dlcl9kZWZlbnNpdmUgZXh0cmluc2ljIGlzIGNhbGxlZC4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXQ1CQw4cGFsbGV0X21ldGFfdHgYcGFsbGV0FEV2ZW50BARUAAEEKERpc3BhdGNoZWQEARhyZXN1bHS1CAFoRGlzcGF0Y2hSZXN1bHRXaXRoUG9zdEluZm8AABCcQSBtZXRhIHRyYW5zYWN0aW9uIGhhcyBiZWVuIGRpc3BhdGNoZWQuADUBQ29udGFpbnMgdGhlIGRpc3BhdGNoIHJlc3VsdCBvZiB0aGUgbWV0YSB0cmFuc2FjdGlvbiBhbG9uZyB3aXRoIHBvc3QtZGlzcGF0Y2gwaW5mb3JtYXRpb24uBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0OQkQXHBvbGthZG90X3J1bnRpbWVfY29tbW9uRGlkZW50aXR5X21pZ3JhdG9yGHBhbGxldBRFdmVudAQEVAABCDhJZGVudGl0eVJlYXBlZAQBDHdobwABMFQ6OkFjY291bnRJZAAABOBUaGUgaWRlbnRpdHkgYW5kIGFsbCBzdWIgYWNjb3VudHMgd2VyZSByZWFwZWQgZm9yIGB3aG9gLjhEZXBvc2l0VXBkYXRlZAwBDHdobwABMFQ6OkFjY291bnRJZAABIGlkZW50aXR5GAEwQmFsYW5jZU9mPFQ+AAEQc3VicxgBMEJhbGFuY2VPZjxUPgABCEEBVGhlIGRlcG9zaXRzIGhlbGQgZm9yIGB3aG9gIHdlcmUgdXBkYXRlZC4gYGlkZW50aXR5YCBpcyB0aGUgbmV3IGRlcG9zaXQgaGVsZCBmb3IdAWlkZW50aXR5IGluZm8sIGFuZCBgc3Vic2AgaXMgdGhlIG5ldyBkZXBvc2l0IGhlbGQgZm9yIHRoZSBzdWItYWNjb3VudHMuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0PQkIMGZyYW1lX3N5c3RlbRRQaGFzZQABDDhBcHBseUV4dHJpbnNpYwQAEAEMdTMyAAAAMEZpbmFsaXphdGlvbgABADhJbml0aWFsaXphdGlvbgACAABBCQAAAiUBAEUJCDBmcmFtZV9zeXN0ZW1YTGFzdFJ1bnRpbWVVcGdyYWRlSW5mbwAACAEwc3BlY192ZXJzaW9uyQEBTGNvZGVjOjpDb21wYWN0PHUzMj4AASRzcGVjX25hbWVJCQFEQ293PCdzdGF0aWMsIHN0cj4AAEkJBAxDb3cEBFQBTQkABABNCQAAAE0JAAAFAgBRCQgwZnJhbWVfc3lzdGVtYENvZGVVcGdyYWRlQXV0aG9yaXphdGlvbgQEVAAACAEkY29kZV9oYXNoNAEcVDo6SGFzaAABNGNoZWNrX3ZlcnNpb24gARBib29sAABVCQwwZnJhbWVfc3lzdGVtGGxpbWl0czBCbG9ja1dlaWdodHMAAAwBKGJhc2VfYmxvY2soARhXZWlnaHQAASRtYXhfYmxvY2soARhXZWlnaHQAASRwZXJfY2xhc3NZCQGEUGVyRGlzcGF0Y2hDbGFzczxXZWlnaHRzUGVyQ2xhc3M+AABZCQw0ZnJhbWVfc3VwcG9ydCBkaXNwYXRjaEBQZXJEaXNwYXRjaENsYXNzBARUAV0JAAwBGG5vcm1hbF0JAQRUAAEsb3BlcmF0aW9uYWxdCQEEVAABJG1hbmRhdG9yeV0JAQRUAABdCQwwZnJhbWVfc3lzdGVtGGxpbWl0czxXZWlnaHRzUGVyQ2xhc3MAABABOGJhc2VfZXh0cmluc2ljKAEYV2VpZ2h0AAE0bWF4X2V4dHJpbnNpY0UHAThPcHRpb248V2VpZ2h0PgABJG1heF90b3RhbEUHAThPcHRpb248V2VpZ2h0PgABIHJlc2VydmVkRQcBOE9wdGlvbjxXZWlnaHQ+AABhCQwwZnJhbWVfc3lzdGVtGGxpbWl0cyxCbG9ja0xlbmd0aAAABAEMbWF4ZQkBVFBlckRpc3BhdGNoQ2xhc3M8dTMyPgAAZQkMNGZyYW1lX3N1cHBvcnQgZGlzcGF0Y2hAUGVyRGlzcGF0Y2hDbGFzcwQEVAEQAAwBGG5vcm1hbBABBFQAASxvcGVyYXRpb25hbBABBFQAASRtYW5kYXRvcnkQAQRUAABpCQgoc3Bfd2VpZ2h0czxSdW50aW1lRGJXZWlnaHQAAAgBEHJlYWQwAQx1NjQAARR3cml0ZTABDHU2NAAAbQkIKHNwX3ZlcnNpb244UnVudGltZVZlcnNpb24AACABJHNwZWNfbmFtZUkJAURDb3c8J3N0YXRpYywgc3RyPgABJGltcGxfbmFtZUkJAURDb3c8J3N0YXRpYywgc3RyPgABRGF1dGhvcmluZ192ZXJzaW9uEAEMdTMyAAEwc3BlY192ZXJzaW9uEAEMdTMyAAEwaW1wbF92ZXJzaW9uEAEMdTMyAAEQYXBpc3EJARxBcGlzVmVjAAFMdHJhbnNhY3Rpb25fdmVyc2lvbhABDHUzMgABOHN5c3RlbV92ZXJzaW9uCAEIdTgAAHEJBAxDb3cEBFQBdQkABAB1CQAAAHUJAAACeQkAeQkAAAQIJQMQAH0JDDBmcmFtZV9zeXN0ZW0YcGFsbGV0FEVycm9yBARUAAEkPEludmFsaWRTcGVjTmFtZQAACBEBVGhlIG5hbWUgb2Ygc3BlY2lmaWNhdGlvbiBkb2VzIG5vdCBtYXRjaCBiZXR3ZWVuIHRoZSBjdXJyZW50IHJ1bnRpbWVQYW5kIHRoZSBuZXcgcnVudGltZS5oU3BlY1ZlcnNpb25OZWVkc1RvSW5jcmVhc2UAAQhBAVRoZSBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaXMgbm90IGFsbG93ZWQgdG8gZGVjcmVhc2UgYmV0d2VlbiB0aGUgY3VycmVudCBydW50aW1lUGFuZCB0aGUgbmV3IHJ1bnRpbWUudEZhaWxlZFRvRXh0cmFjdFJ1bnRpbWVWZXJzaW9uAAIM7EZhaWxlZCB0byBleHRyYWN0IHRoZSBydW50aW1lIHZlcnNpb24gZnJvbSB0aGUgbmV3IHJ1bnRpbWUuAAkBRWl0aGVyIGNhbGxpbmcgYENvcmVfdmVyc2lvbmAgb3IgZGVjb2RpbmcgYFJ1bnRpbWVWZXJzaW9uYCBmYWlsZWQuTE5vbkRlZmF1bHRDb21wb3NpdGUAAwT8U3VpY2lkZSBjYWxsZWQgd2hlbiB0aGUgYWNjb3VudCBoYXMgbm9uLWRlZmF1bHQgY29tcG9zaXRlIGRhdGEuPE5vblplcm9SZWZDb3VudAAEBDUBVGhlcmUgaXMgYSBub24temVybyByZWZlcmVuY2UgY291bnQgcHJldmVudGluZyB0aGUgYWNjb3VudCBmcm9tIGJlaW5nIHB1cmdlZC4wQ2FsbEZpbHRlcmVkAAUE0FRoZSBvcmlnaW4gZmlsdGVyIHByZXZlbnQgdGhlIGNhbGwgdG8gYmUgZGlzcGF0Y2hlZC5sTXVsdGlCbG9ja01pZ3JhdGlvbnNPbmdvaW5nAAYEVQFBIG11bHRpLWJsb2NrIG1pZ3JhdGlvbiBpcyBvbmdvaW5nIGFuZCBwcmV2ZW50cyB0aGUgY3VycmVudCBjb2RlIGZyb20gYmVpbmcgcmVwbGFjZWQuRE5vdGhpbmdBdXRob3JpemVkAAcEWE5vIHVwZ3JhZGUgYXV0aG9yaXplZC4wVW5hdXRob3JpemVkAAgElFRoZSBzdWJtaXR0ZWQgY29kZSBpcyBub3QgYXV0aG9yaXplZC4EbEVycm9yIGZvciB0aGUgU3lzdGVtIHBhbGxldIEJDExib3VuZGVkX2NvbGxlY3Rpb25zQHdlYWtfYm91bmRlZF92ZWM4V2Vha0JvdW5kZWRWZWMIBFQBhQkEUwAABACJCQEYVmVjPFQ+AACFCQAABAjNATAAiQkAAAKFCQCNCQxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAQQEUwAABACRCQEYVmVjPFQ+AACRCQAAAgQAlQkEGE9wdGlvbgQEVAGZCQEIEE5vbmUAAAAQU29tZQQAmQkAAAEAAJkJDERzcF9jb25zZW5zdXNfYmFiZRxkaWdlc3RzJFByZURpZ2VzdAABDBxQcmltYXJ5BACdCQFAUHJpbWFyeVByZURpZ2VzdAABADhTZWNvbmRhcnlQbGFpbgQApQkBXFNlY29uZGFyeVBsYWluUHJlRGlnZXN0AAIAMFNlY29uZGFyeVZSRgQAqQkBVFNlY29uZGFyeVZSRlByZURpZ2VzdAADAACdCQxEc3BfY29uc2Vuc3VzX2JhYmUcZGlnZXN0c0BQcmltYXJ5UHJlRGlnZXN0AAAMATxhdXRob3JpdHlfaW5kZXgQAVRzdXBlcjo6QXV0aG9yaXR5SW5kZXgAARBzbG900QEBEFNsb3QAATR2cmZfc2lnbmF0dXJloQkBMFZyZlNpZ25hdHVyZQAAoQkQHHNwX2NvcmUcc3IyNTUxOQx2cmYwVnJmU2lnbmF0dXJlAAAIAShwcmVfb3V0cHV0BAEwVnJmUHJlT3V0cHV0AAEUcHJvb2aFAgEgVnJmUHJvb2YAAKUJDERzcF9jb25zZW5zdXNfYmFiZRxkaWdlc3RzXFNlY29uZGFyeVBsYWluUHJlRGlnZXN0AAAIATxhdXRob3JpdHlfaW5kZXgQAVRzdXBlcjo6QXV0aG9yaXR5SW5kZXgAARBzbG900QEBEFNsb3QAAKkJDERzcF9jb25zZW5zdXNfYmFiZRxkaWdlc3RzVFNlY29uZGFyeVZSRlByZURpZ2VzdAAADAE8YXV0aG9yaXR5X2luZGV4EAFUc3VwZXI6OkF1dGhvcml0eUluZGV4AAEQc2xvdNEBARBTbG90AAE0dnJmX3NpZ25hdHVyZaEJATBWcmZTaWduYXR1cmUAAK0JCERzcF9jb25zZW5zdXNfYmFiZVhCYWJlRXBvY2hDb25maWd1cmF0aW9uAAAIAQRj3QEBKCh1NjQsIHU2NCkAATRhbGxvd2VkX3Nsb3Rz4QEBMEFsbG93ZWRTbG90cwAAsQkMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAG1CQRTAAAEALkJARhWZWM8VD4AALUJAAAECDAQALkJAAACtQkAvQkMLHBhbGxldF9iYWJlGHBhbGxldBRFcnJvcgQEVAABEGBJbnZhbGlkRXF1aXZvY2F0aW9uUHJvb2YAAAQxAUFuIGVxdWl2b2NhdGlvbiBwcm9vZiBwcm92aWRlZCBhcyBwYXJ0IG9mIGFuIGVxdWl2b2NhdGlvbiByZXBvcnQgaXMgaW52YWxpZC5gSW52YWxpZEtleU93bmVyc2hpcFByb29mAAEEMQFBIGtleSBvd25lcnNoaXAgcHJvb2YgcHJvdmlkZWQgYXMgcGFydCBvZiBhbiBlcXVpdm9jYXRpb24gcmVwb3J0IGlzIGludmFsaWQuWER1cGxpY2F0ZU9mZmVuY2VSZXBvcnQAAgQVAUEgZ2l2ZW4gZXF1aXZvY2F0aW9uIHJlcG9ydCBpcyB2YWxpZCBidXQgYWxyZWFkeSBwcmV2aW91c2x5IHJlcG9ydGVkLlBJbnZhbGlkQ29uZmlndXJhdGlvbgADBIxTdWJtaXR0ZWQgY29uZmlndXJhdGlvbiBpcyBpbnZhbGlkLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC7BCQAABAwAGCAAxQkMOHBhbGxldF9pbmRpY2VzGHBhbGxldBRFcnJvcgQEVAABFCxOb3RBc3NpZ25lZAAABIxUaGUgaW5kZXggd2FzIG5vdCBhbHJlYWR5IGFzc2lnbmVkLiBOb3RPd25lcgABBKRUaGUgaW5kZXggaXMgYXNzaWduZWQgdG8gYW5vdGhlciBhY2NvdW50LhRJblVzZQACBHBUaGUgaW5kZXggd2FzIG5vdCBhdmFpbGFibGUuLE5vdFRyYW5zZmVyAAMEyFRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGFjY291bnRzIGFyZSBpZGVudGljYWwuJFBlcm1hbmVudAAEBNBUaGUgaW5kZXggaXMgcGVybWFuZW50IGFuZCBtYXkgbm90IGJlIGZyZWVkL2NoYW5nZWQuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LskJDExib3VuZGVkX2NvbGxlY3Rpb25zQHdlYWtfYm91bmRlZF92ZWM4V2Vha0JvdW5kZWRWZWMIBFQBzQkEUwAABADVCQEYVmVjPFQ+AADNCQw8cGFsbGV0X2JhbGFuY2VzFHR5cGVzLEJhbGFuY2VMb2NrBBxCYWxhbmNlARgADAEIaWQlAwE4TG9ja0lkZW50aWZpZXIAARhhbW91bnQYARxCYWxhbmNlAAEccmVhc29uc9EJARxSZWFzb25zAADRCQw8cGFsbGV0X2JhbGFuY2VzFHR5cGVzHFJlYXNvbnMAAQwMRmVlAAAAEE1pc2MAAQAMQWxsAAIAANUJAAACzQkA2QkMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAHdCQRTAAAEAOEJARhWZWM8VD4AAN0JDDxwYWxsZXRfYmFsYW5jZXMUdHlwZXMsUmVzZXJ2ZURhdGEIRFJlc2VydmVJZGVudGlmaWVyASUDHEJhbGFuY2UBGAAIAQhpZCUDAURSZXNlcnZlSWRlbnRpZmllcgABGGFtb3VudBgBHEJhbGFuY2UAAOEJAAAC3QkA5QkMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAHpCQRTAAAEAAUKARhWZWM8VD4AAOkJFDRmcmFtZV9zdXBwb3J0GHRyYWl0cxh0b2tlbnMQbWlzYyBJZEFtb3VudAgISWQB7QkcQmFsYW5jZQEYAAgBCGlk7QkBCElkAAEYYW1vdW50GAEcQmFsYW5jZQAA7QkIPHdlc3RlbmRfcnVudGltZURSdW50aW1lSG9sZFJlYXNvbgABFBxTdGFraW5nBADxCQFocGFsbGV0X3N0YWtpbmc6OkhvbGRSZWFzb24ABgAcU2Vzc2lvbgQA9QkBaHBhbGxldF9zZXNzaW9uOjpIb2xkUmVhc29uAAgAIFByZWltYWdlBAD5CQFscGFsbGV0X3ByZWltYWdlOjpIb2xkUmVhc29uABwAQERlbGVnYXRlZFN0YWtpbmcEAP0JAZBwYWxsZXRfZGVsZWdhdGVkX3N0YWtpbmc6OkhvbGRSZWFzb24AJgAkWGNtUGFsbGV0BAABCgFYcGFsbGV0X3hjbTo6SG9sZFJlYXNvbgBjAADxCRA4cGFsbGV0X3N0YWtpbmcYcGFsbGV0GHBhbGxldChIb2xkUmVhc29uAAEEHFN0YWtpbmcAAAAA9QkMOHBhbGxldF9zZXNzaW9uGHBhbGxldChIb2xkUmVhc29uAAEEEEtleXMAAAAA+QkMPHBhbGxldF9wcmVpbWFnZRhwYWxsZXQoSG9sZFJlYXNvbgABBCBQcmVpbWFnZQAAAAD9CQxgcGFsbGV0X2RlbGVnYXRlZF9zdGFraW5nGHBhbGxldChIb2xkUmVhc29uAAEERFN0YWtpbmdEZWxlZ2F0aW9uAAAAAAEKDChwYWxsZXRfeGNtGHBhbGxldChIb2xkUmVhc29uAAEEOEF1dGhvcml6ZUFsaWFzAAAAAAUKAAAC6QkACQoMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAENCgRTAAAEABkKARhWZWM8VD4AAA0KFDRmcmFtZV9zdXBwb3J0GHRyYWl0cxh0b2tlbnMQbWlzYyBJZEFtb3VudAgISWQBEQocQmFsYW5jZQEYAAgBCGlkEQoBCElkAAEYYW1vdW50GAEcQmFsYW5jZQAAEQoIPHdlc3RlbmRfcnVudGltZUxSdW50aW1lRnJlZXplUmVhc29uAAEEPE5vbWluYXRpb25Qb29scwQAFQoBlHBhbGxldF9ub21pbmF0aW9uX3Bvb2xzOjpGcmVlemVSZWFzb24AHQAAFQoMXHBhbGxldF9ub21pbmF0aW9uX3Bvb2xzGHBhbGxldDBGcmVlemVSZWFzb24AAQQ4UG9vbE1pbkJhbGFuY2UAAAAAGQoAAAINCgAdCgw8cGFsbGV0X2JhbGFuY2VzGHBhbGxldBRFcnJvcggEVAAESQABMDhWZXN0aW5nQmFsYW5jZQAABJxWZXN0aW5nIGJhbGFuY2UgdG9vIGhpZ2ggdG8gc2VuZCB2YWx1ZS5UTGlxdWlkaXR5UmVzdHJpY3Rpb25zAAEEyEFjY291bnQgbGlxdWlkaXR5IHJlc3RyaWN0aW9ucyBwcmV2ZW50IHdpdGhkcmF3YWwuTEluc3VmZmljaWVudEJhbGFuY2UAAgR4QmFsYW5jZSB0b28gbG93IHRvIHNlbmQgdmFsdWUuSEV4aXN0ZW50aWFsRGVwb3NpdAADBOxWYWx1ZSB0b28gbG93IHRvIGNyZWF0ZSBhY2NvdW50IGR1ZSB0byBleGlzdGVudGlhbCBkZXBvc2l0LjRFeHBlbmRhYmlsaXR5AAQEkFRyYW5zZmVyL3BheW1lbnQgd291bGQga2lsbCBhY2NvdW50LlxFeGlzdGluZ1Zlc3RpbmdTY2hlZHVsZQAFBMxBIHZlc3Rpbmcgc2NoZWR1bGUgYWxyZWFkeSBleGlzdHMgZm9yIHRoaXMgYWNjb3VudC4sRGVhZEFjY291bnQABgSMQmVuZWZpY2lhcnkgYWNjb3VudCBtdXN0IHByZS1leGlzdC48VG9vTWFueVJlc2VydmVzAAcEuE51bWJlciBvZiBuYW1lZCByZXNlcnZlcyBleGNlZWQgYE1heFJlc2VydmVzYC4wVG9vTWFueUhvbGRzAAgE+E51bWJlciBvZiBob2xkcyBleGNlZWQgYFZhcmlhbnRDb3VudE9mPFQ6OlJ1bnRpbWVIb2xkUmVhc29uPmAuOFRvb01hbnlGcmVlemVzAAkEmE51bWJlciBvZiBmcmVlemVzIGV4Y2VlZCBgTWF4RnJlZXplc2AuTElzc3VhbmNlRGVhY3RpdmF0ZWQACgQBAVRoZSBpc3N1YW5jZSBjYW5ub3QgYmUgbW9kaWZpZWQgc2luY2UgaXQgaXMgYWxyZWFkeSBkZWFjdGl2YXRlZC4kRGVsdGFaZXJvAAsEZFRoZSBkZWx0YSBjYW5ub3QgYmUgemVyby4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQuIQoIaHBhbGxldF90cmFuc2FjdGlvbl9wYXltZW50IFJlbGVhc2VzAAEIJFYxQW5jaWVudAAAAAhWMgABAAAlCgg4cGFsbGV0X3N0YWtpbmc0U3Rha2luZ0xlZGdlcgQEVAAAFAEUc3Rhc2gAATBUOjpBY2NvdW50SWQAARR0b3RhbP0BATBCYWxhbmNlT2Y8VD4AARhhY3RpdmX9AQEwQmFsYW5jZU9mPFQ+AAEkdW5sb2NraW5nMQIB8EJvdW5kZWRWZWM8VW5sb2NrQ2h1bms8QmFsYW5jZU9mPFQ+PiwgVDo6TWF4VW5sb2NraW5nQ2h1bmtzPgABWGxlZ2FjeV9jbGFpbWVkX3Jld2FyZHMpCgGUQm91bmRlZFZlYzxFcmFJbmRleCwgVDo6SGlzdG9yeURlcHRoPgAAKQoMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAEQBFMAAAQAkQEBGFZlYzxUPgAALQoIOHBhbGxldF9zdGFraW5nLE5vbWluYXRpb25zBARUAAAMARx0YXJnZXRzMQoBtEJvdW5kZWRWZWM8VDo6QWNjb3VudElkLCBNYXhOb21pbmF0aW9uc09mPFQ+PgABMHN1Ym1pdHRlZF9pbhABIEVyYUluZGV4AAEoc3VwcHJlc3NlZCABEGJvb2wAADEKDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBAARTAAAEAAECARhWZWM8VD4AADUKCDhwYWxsZXRfc3Rha2luZzRBY3RpdmVFcmFJbmZvAAAIARRpbmRleBABIEVyYUluZGV4AAEUc3RhcnQZCAEsT3B0aW9uPHU2ND4AADkKAAAECBAAAD0KCChzcF9zdGFraW5nIEV4cG9zdXJlCCRBY2NvdW50SWQBABxCYWxhbmNlARgADAEUdG90YWz9AQEcQmFsYW5jZQABDG93bv0BARxCYWxhbmNlAAEYb3RoZXJzQQoBrFZlYzxJbmRpdmlkdWFsRXhwb3N1cmU8QWNjb3VudElkLCBCYWxhbmNlPj4AAEEKAAACRQoARQoIKHNwX3N0YWtpbmdISW5kaXZpZHVhbEV4cG9zdXJlCCRBY2NvdW50SWQBABxCYWxhbmNlARgACAEMd2hvAAEkQWNjb3VudElkAAEUdmFsdWX9AQEcQmFsYW5jZQAASQoIKHNwX3N0YWtpbmdUUGFnZWRFeHBvc3VyZU1ldGFkYXRhBBxCYWxhbmNlARgAEAEUdG90YWz9AQEcQmFsYW5jZQABDG93bv0BARxCYWxhbmNlAAE8bm9taW5hdG9yX2NvdW50EAEMdTMyAAEocGFnZV9jb3VudBABEFBhZ2UAAE0KAAAEDBAAEABRCggoc3Bfc3Rha2luZzBFeHBvc3VyZVBhZ2UIJEFjY291bnRJZAEAHEJhbGFuY2UBGAAIAShwYWdlX3RvdGFs/QEBHEJhbGFuY2UAARhvdGhlcnNBCgGsVmVjPEluZGl2aWR1YWxFeHBvc3VyZTxBY2NvdW50SWQsIEJhbGFuY2U+PgAAVQoIOHBhbGxldF9zdGFraW5nPEVyYVJld2FyZFBvaW50cwQkQWNjb3VudElkAQAACAEUdG90YWwQASxSZXdhcmRQb2ludAABKGluZGl2aWR1YWxZCgGAQlRyZWVNYXA8QWNjb3VudElkLCBSZXdhcmRQb2ludD4AAFkKBCBCVHJlZU1hcAgESwEABFYBEAAEAF0KAAAAXQoAAAJhCgBhCgAABAgAEABlCgAAAmkKAGkKCDhwYWxsZXRfc3Rha2luZzhVbmFwcGxpZWRTbGFzaAgkQWNjb3VudElkAQAcQmFsYW5jZQEYABQBJHZhbGlkYXRvcgABJEFjY291bnRJZAABDG93bhgBHEJhbGFuY2UAARhvdGhlcnO5BAFkVmVjPChBY2NvdW50SWQsIEJhbGFuY2UpPgABJHJlcG9ydGVycwECAThWZWM8QWNjb3VudElkPgABGHBheW91dBgBHEJhbGFuY2UAAG0KAAAECJgYAHEKDDhwYWxsZXRfc3Rha2luZyBzbGFzaGluZzRTbGFzaGluZ1NwYW5zAAAQAShzcGFuX2luZGV4EAEkU3BhbkluZGV4AAEobGFzdF9zdGFydBABIEVyYUluZGV4AAFIbGFzdF9ub256ZXJvX3NsYXNoEAEgRXJhSW5kZXgAARRwcmlvcpEBATRWZWM8RXJhSW5kZXg+AAB1Cgw4cGFsbGV0X3N0YWtpbmcgc2xhc2hpbmcoU3BhblJlY29yZAQcQmFsYW5jZQEYAAgBHHNsYXNoZWQYARxCYWxhbmNlAAEgcGFpZF9vdXQYARxCYWxhbmNlAAB5ChA4cGFsbGV0X3N0YWtpbmcYcGFsbGV0GHBhbGxldBRFcnJvcgQEVAABiDROb3RDb250cm9sbGVyAAAEZE5vdCBhIGNvbnRyb2xsZXIgYWNjb3VudC4gTm90U3Rhc2gAAQRQTm90IGEgc3Rhc2ggYWNjb3VudC40QWxyZWFkeUJvbmRlZAACBGBTdGFzaCBpcyBhbHJlYWR5IGJvbmRlZC40QWxyZWFkeVBhaXJlZAADBHRDb250cm9sbGVyIGlzIGFscmVhZHkgcGFpcmVkLjBFbXB0eVRhcmdldHMABARgVGFyZ2V0cyBjYW5ub3QgYmUgZW1wdHkuOER1cGxpY2F0ZUluZGV4AAUEQER1cGxpY2F0ZSBpbmRleC5ESW52YWxpZFNsYXNoSW5kZXgABgSEU2xhc2ggcmVjb3JkIGluZGV4IG91dCBvZiBib3VuZHMuQEluc3VmZmljaWVudEJvbmQABwxZAUNhbm5vdCBoYXZlIGEgdmFsaWRhdG9yIG9yIG5vbWluYXRvciByb2xlLCB3aXRoIHZhbHVlIGxlc3MgdGhhbiB0aGUgbWluaW11bSBkZWZpbmVkIGJ5PQFnb3Zlcm5hbmNlIChzZWUgYE1pblZhbGlkYXRvckJvbmRgIGFuZCBgTWluTm9taW5hdG9yQm9uZGApLiBJZiB1bmJvbmRpbmcgaXMgdGhlFQFpbnRlbnRpb24sIGBjaGlsbGAgZmlyc3QgdG8gcmVtb3ZlIG9uZSdzIHJvbGUgYXMgdmFsaWRhdG9yL25vbWluYXRvci4wTm9Nb3JlQ2h1bmtzAAgEkENhbiBub3Qgc2NoZWR1bGUgbW9yZSB1bmxvY2sgY2h1bmtzLjROb1VubG9ja0NodW5rAAkEoENhbiBub3QgcmVib25kIHdpdGhvdXQgdW5sb2NraW5nIGNodW5rcy4wRnVuZGVkVGFyZ2V0AAoEyEF0dGVtcHRpbmcgdG8gdGFyZ2V0IGEgc3Rhc2ggdGhhdCBzdGlsbCBoYXMgZnVuZHMuSEludmFsaWRFcmFUb1Jld2FyZAALBFhJbnZhbGlkIGVyYSB0byByZXdhcmQuaEludmFsaWROdW1iZXJPZk5vbWluYXRpb25zAAwEeEludmFsaWQgbnVtYmVyIG9mIG5vbWluYXRpb25zLkhOb3RTb3J0ZWRBbmRVbmlxdWUADQSASXRlbXMgYXJlIG5vdCBzb3J0ZWQgYW5kIHVuaXF1ZS44QWxyZWFkeUNsYWltZWQADgQJAVJld2FyZHMgZm9yIHRoaXMgZXJhIGhhdmUgYWxyZWFkeSBiZWVuIGNsYWltZWQgZm9yIHRoaXMgdmFsaWRhdG9yLixJbnZhbGlkUGFnZQAPBIRObyBub21pbmF0b3JzIGV4aXN0IG9uIHRoaXMgcGFnZS5USW5jb3JyZWN0SGlzdG9yeURlcHRoABAEwEluY29ycmVjdCBwcmV2aW91cyBoaXN0b3J5IGRlcHRoIGlucHV0IHByb3ZpZGVkLlhJbmNvcnJlY3RTbGFzaGluZ1NwYW5zABEEsEluY29ycmVjdCBudW1iZXIgb2Ygc2xhc2hpbmcgc3BhbnMgcHJvdmlkZWQuIEJhZFN0YXRlABIEOQFJbnRlcm5hbCBzdGF0ZSBoYXMgYmVjb21lIHNvbWVob3cgY29ycnVwdGVkIGFuZCB0aGUgb3BlcmF0aW9uIGNhbm5vdCBjb250aW51ZS44VG9vTWFueVRhcmdldHMAEwSUVG9vIG1hbnkgbm9taW5hdGlvbiB0YXJnZXRzIHN1cHBsaWVkLiRCYWRUYXJnZXQAFAQ9AUEgbm9taW5hdGlvbiB0YXJnZXQgd2FzIHN1cHBsaWVkIHRoYXQgd2FzIGJsb2NrZWQgb3Igb3RoZXJ3aXNlIG5vdCBhIHZhbGlkYXRvci5AQ2Fubm90Q2hpbGxPdGhlcgAVBFUBVGhlIHVzZXIgaGFzIGVub3VnaCBib25kIGFuZCB0aHVzIGNhbm5vdCBiZSBjaGlsbGVkIGZvcmNlZnVsbHkgYnkgYW4gZXh0ZXJuYWwgcGVyc29uLkRUb29NYW55Tm9taW5hdG9ycwAWCE0BVGhlcmUgYXJlIHRvbyBtYW55IG5vbWluYXRvcnMgaW4gdGhlIHN5c3RlbS4gR292ZXJuYW5jZSBuZWVkcyB0byBhZGp1c3QgdGhlIHN0YWtpbme0c2V0dGluZ3MgdG8ga2VlcCB0aGluZ3Mgc2FmZSBmb3IgdGhlIHJ1bnRpbWUuRFRvb01hbnlWYWxpZGF0b3JzABcIVQFUaGVyZSBhcmUgdG9vIG1hbnkgdmFsaWRhdG9yIGNhbmRpZGF0ZXMgaW4gdGhlIHN5c3RlbS4gR292ZXJuYW5jZSBuZWVkcyB0byBhZGp1c3QgdGhl1HN0YWtpbmcgc2V0dGluZ3MgdG8ga2VlcCB0aGluZ3Mgc2FmZSBmb3IgdGhlIHJ1bnRpbWUuQENvbW1pc3Npb25Ub29Mb3cAGATgQ29tbWlzc2lvbiBpcyB0b28gbG93LiBNdXN0IGJlIGF0IGxlYXN0IGBNaW5Db21taXNzaW9uYC4sQm91bmROb3RNZXQAGQRYU29tZSBib3VuZCBpcyBub3QgbWV0LlBDb250cm9sbGVyRGVwcmVjYXRlZAAaBAEBVXNlZCB3aGVuIGF0dGVtcHRpbmcgdG8gdXNlIGRlcHJlY2F0ZWQgY29udHJvbGxlciBhY2NvdW50IGxvZ2ljLkxDYW5ub3RSZXN0b3JlTGVkZ2VyABsEWENhbm5vdCByZXNldCBhIGxlZGdlci5sUmV3YXJkRGVzdGluYXRpb25SZXN0cmljdGVkABwErFByb3ZpZGVkIHJld2FyZCBkZXN0aW5hdGlvbiBpcyBub3QgYWxsb3dlZC44Tm90RW5vdWdoRnVuZHMAHQScTm90IGVub3VnaCBmdW5kcyBhdmFpbGFibGUgdG8gd2l0aGRyYXcuXFZpcnR1YWxTdGFrZXJOb3RBbGxvd2VkAB4EqE9wZXJhdGlvbiBub3QgYWxsb3dlZCBmb3IgdmlydHVhbCBzdGFrZXJzLjxDYW5ub3RSZWFwU3Rhc2gAHwT0U3Rhc2ggY291bGQgbm90IGJlIHJlYXBlZCBhcyBvdGhlciBwYWxsZXQgbWlnaHQgZGVwZW5kIG9uIGl0LjxBbHJlYWR5TWlncmF0ZWQAIAQJAVRoZSBzdGFrZSBvZiB0aGlzIGFjY291bnQgaXMgYWxyZWFkeSBtaWdyYXRlZCB0byBgRnVuZ2libGVgIGhvbGRzLihSZXN0cmljdGVkACEIWQFBY2NvdW50IGlzIHJlc3RyaWN0ZWQgZnJvbSBwYXJ0aWNpcGF0aW9uIGluIHN0YWtpbmcuIFRoaXMgbWF5IGhhcHBlbiBpZiB0aGUgYWNjb3VudCBpc8RzdGFraW5nIGluIGFub3RoZXIgd2F5IGFscmVhZHksIHN1Y2ggYXMgdmlhIHBvb2wuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0Ln0KDChzcF9zdGFraW5nHG9mZmVuY2U4T2ZmZW5jZURldGFpbHMIIFJlcG9ydGVyAQAgT2ZmZW5kZXIBgQoACAEgb2ZmZW5kZXKBCgEgT2ZmZW5kZXIAASRyZXBvcnRlcnMBAgE0VmVjPFJlcG9ydGVyPgAAgQoAAAQIAD0KAIUKAAAECLA4AIkKAAAECDQQAI0KAAACkQoAkQoAAAQIAFUCAJUKAAACmQoAmQoAAAQIEJ0KAJ0KDChzcF9zdGFraW5nHG9mZmVuY2U8T2ZmZW5jZVNldmVyaXR5AAAEAJgBHFBlcmJpbGwAAKEKAAAECKUKOAClCgwcc3BfY29yZRhjcnlwdG8kS2V5VHlwZUlkAAAEAEgBHFt1ODsgNF0AAKkKDDhwYWxsZXRfc2Vzc2lvbhhwYWxsZXQURXJyb3IEBFQAARQwSW52YWxpZFByb29mAAAEYEludmFsaWQgb3duZXJzaGlwIHByb29mLlxOb0Fzc29jaWF0ZWRWYWxpZGF0b3JJZAABBJxObyBhc3NvY2lhdGVkIHZhbGlkYXRvciBJRCBmb3IgYWNjb3VudC40RHVwbGljYXRlZEtleQACBGRSZWdpc3RlcmVkIGR1cGxpY2F0ZSBrZXkuGE5vS2V5cwADBKRObyBrZXlzIGFyZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBhY2NvdW50LiROb0FjY291bnQABAQZAUtleSBzZXR0aW5nIGFjY291bnQgaXMgbm90IGxpdmUsIHNvIGl0J3MgaW1wb3NzaWJsZSB0byBhc3NvY2lhdGUga2V5cy4EdEVycm9yIGZvciB0aGUgc2Vzc2lvbiBwYWxsZXQurQoIOHBhbGxldF9ncmFuZHBhLFN0b3JlZFN0YXRlBAROARABEBBMaXZlAAAAMFBlbmRpbmdQYXVzZQgBMHNjaGVkdWxlZF9hdBABBE4AARRkZWxheRABBE4AAQAYUGF1c2VkAAIANFBlbmRpbmdSZXN1bWUIATBzY2hlZHVsZWRfYXQQAQROAAEUZGVsYXkQAQROAAMAALEKCDhwYWxsZXRfZ3JhbmRwYUxTdG9yZWRQZW5kaW5nQ2hhbmdlCAROARAUTGltaXQAABABMHNjaGVkdWxlZF9hdBABBE4AARRkZWxheRABBE4AAUBuZXh0X2F1dGhvcml0aWVztQoBbEJvdW5kZWRBdXRob3JpdHlMaXN0PExpbWl0PgABGGZvcmNlZJwBJE9wdGlvbjxOPgAAtQoMTGJvdW5kZWRfY29sbGVjdGlvbnNAd2Vha19ib3VuZGVkX3ZlYzhXZWFrQm91bmRlZFZlYwgEVAH0BFMAAAQA8AEYVmVjPFQ+AAC5Cgw4cGFsbGV0X2dyYW5kcGEYcGFsbGV0FEVycm9yBARUAAEcLFBhdXNlRmFpbGVkAAAIBQFBdHRlbXB0IHRvIHNpZ25hbCBHUkFORFBBIHBhdXNlIHdoZW4gdGhlIGF1dGhvcml0eSBzZXQgaXNuJ3QgbGl2ZaQoZWl0aGVyIHBhdXNlZCBvciBhbHJlYWR5IHBlbmRpbmcgcGF1c2UpLjBSZXN1bWVGYWlsZWQAAQgRAUF0dGVtcHQgdG8gc2lnbmFsIEdSQU5EUEEgcmVzdW1lIHdoZW4gdGhlIGF1dGhvcml0eSBzZXQgaXNuJ3QgcGF1c2VkoChlaXRoZXIgbGl2ZSBvciBhbHJlYWR5IHBlbmRpbmcgcmVzdW1lKS40Q2hhbmdlUGVuZGluZwACBOhBdHRlbXB0IHRvIHNpZ25hbCBHUkFORFBBIGNoYW5nZSB3aXRoIG9uZSBhbHJlYWR5IHBlbmRpbmcuHFRvb1Nvb24AAwS8Q2Fubm90IHNpZ25hbCBmb3JjZWQgY2hhbmdlIHNvIHNvb24gYWZ0ZXIgbGFzdC5gSW52YWxpZEtleU93bmVyc2hpcFByb29mAAQEMQFBIGtleSBvd25lcnNoaXAgcHJvb2YgcHJvdmlkZWQgYXMgcGFydCBvZiBhbiBlcXVpdm9jYXRpb24gcmVwb3J0IGlzIGludmFsaWQuYEludmFsaWRFcXVpdm9jYXRpb25Qcm9vZgAFBDEBQW4gZXF1aXZvY2F0aW9uIHByb29mIHByb3ZpZGVkIGFzIHBhcnQgb2YgYW4gZXF1aXZvY2F0aW9uIHJlcG9ydCBpcyBpbnZhbGlkLlhEdXBsaWNhdGVPZmZlbmNlUmVwb3J0AAYEFQFBIGdpdmVuIGVxdWl2b2NhdGlvbiByZXBvcnQgaXMgdmFsaWQgYnV0IGFscmVhZHkgcHJldmlvdXNseSByZXBvcnRlZC4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQuvQoMTGJvdW5kZWRfY29sbGVjdGlvbnNAd2Vha19ib3VuZGVkX3ZlYzhXZWFrQm91bmRlZFZlYwgEVAFhAgRTAAAEAMEKARhWZWM8VD4AAMEKAAACYQIAxQoMOHBhbGxldF91dGlsaXR5GHBhbGxldBRFcnJvcgQEVAABBDBUb29NYW55Q2FsbHMAAARcVG9vIG1hbnkgY2FsbHMgYmF0Y2hlZC4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQuyQoMPHBhbGxldF9pZGVudGl0eRR0eXBlczBSZWdpc3RyYXRpb24MHEJhbGFuY2UBGDRNYXhKdWRnZW1lbnRzADBJZGVudGl0eUluZm8B+QIADAEoanVkZ2VtZW50c80KAfxCb3VuZGVkVmVjPChSZWdpc3RyYXJJbmRleCwgSnVkZ2VtZW50PEJhbGFuY2U+KSwgTWF4SnVkZ2VtZW50cz4AARxkZXBvc2l0GAEcQmFsYW5jZQABEGluZm/5AgEwSWRlbnRpdHlJbmZvAADNCgxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAdEKBFMAAAQA1QoBGFZlYzxUPgAA0QoAAAQIEI0DANUKAAAC0QoA2QoAAAQIGN0KAN0KDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBAARTAAAEAAECARhWZWM8VD4AAOEKDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQB5QoEUwAABADtCgEYVmVjPFQ+AADlCgQYT3B0aW9uBARUAekKAQgQTm9uZQAAABBTb21lBADpCgAAAQAA6QoMPHBhbGxldF9pZGVudGl0eRR0eXBlczRSZWdpc3RyYXJJbmZvDBxCYWxhbmNlARgkQWNjb3VudElkAQAcSWRGaWVsZAEwAAwBHGFjY291bnQAASRBY2NvdW50SWQAAQxmZWUYARxCYWxhbmNlAAEYZmllbGRzMAEcSWRGaWVsZAAA7QoAAALlCgDxCgxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAQgEUwAABAA4ARhWZWM8VD4AAPUKDDxwYWxsZXRfaWRlbnRpdHkUdHlwZXNMQXV0aG9yaXR5UHJvcGVydGllcwQcQWNjb3VudAEAAAgBKGFjY291bnRfaWQAARxBY2NvdW50AAEoYWxsb2NhdGlvbhABKEFsbG9jYXRpb24AAPkKDDxwYWxsZXRfaWRlbnRpdHkUdHlwZXNMVXNlcm5hbWVJbmZvcm1hdGlvbggcQWNjb3VudAEAHEJhbGFuY2UBGAAIARRvd25lcgABHEFjY291bnQAASBwcm92aWRlcv0KAURQcm92aWRlcjxCYWxhbmNlPgAA/QoMPHBhbGxldF9pZGVudGl0eRR0eXBlcyBQcm92aWRlcgQcQmFsYW5jZQEYAQwoQWxsb2NhdGlvbgAAAEBBdXRob3JpdHlEZXBvc2l0BAAYARxCYWxhbmNlAAEAGFN5c3RlbQACAAABCwAABAwAEP0KAAULDDxwYWxsZXRfaWRlbnRpdHkYcGFsbGV0FEVycm9yBARUAAF4SFRvb01hbnlTdWJBY2NvdW50cwAABFxUb28gbWFueSBzdWJzLWFjY291bnRzLiBOb3RGb3VuZAABBFBBY2NvdW50IGlzbid0IGZvdW5kLiBOb3ROYW1lZAACBFBBY2NvdW50IGlzbid0IG5hbWVkLihFbXB0eUluZGV4AAMEMEVtcHR5IGluZGV4LihGZWVDaGFuZ2VkAAQEPEZlZSBpcyBjaGFuZ2VkLihOb0lkZW50aXR5AAUESE5vIGlkZW50aXR5IGZvdW5kLjxTdGlja3lKdWRnZW1lbnQABgREU3RpY2t5IGp1ZGdlbWVudC44SnVkZ2VtZW50R2l2ZW4ABwRASnVkZ2VtZW50IGdpdmVuLkBJbnZhbGlkSnVkZ2VtZW50AAgESEludmFsaWQganVkZ2VtZW50LjBJbnZhbGlkSW5kZXgACQRUVGhlIGluZGV4IGlzIGludmFsaWQuNEludmFsaWRUYXJnZXQACgRYVGhlIHRhcmdldCBpcyBpbnZhbGlkLkRUb29NYW55UmVnaXN0cmFycwALBOhNYXhpbXVtIGFtb3VudCBvZiByZWdpc3RyYXJzIHJlYWNoZWQuIENhbm5vdCBhZGQgYW55IG1vcmUuOEFscmVhZHlDbGFpbWVkAAwEcEFjY291bnQgSUQgaXMgYWxyZWFkeSBuYW1lZC4YTm90U3ViAA0EcFNlbmRlciBpcyBub3QgYSBzdWItYWNjb3VudC4gTm90T3duZWQADgSIU3ViLWFjY291bnQgaXNuJ3Qgb3duZWQgYnkgc2VuZGVyLnRKdWRnZW1lbnRGb3JEaWZmZXJlbnRJZGVudGl0eQAPBNBUaGUgcHJvdmlkZWQganVkZ2VtZW50IHdhcyBmb3IgYSBkaWZmZXJlbnQgaWRlbnRpdHkuWEp1ZGdlbWVudFBheW1lbnRGYWlsZWQAEAT4RXJyb3IgdGhhdCBvY2N1cnMgd2hlbiB0aGVyZSBpcyBhbiBpc3N1ZSBwYXlpbmcgZm9yIGp1ZGdlbWVudC40SW52YWxpZFN1ZmZpeAARBIBUaGUgcHJvdmlkZWQgc3VmZml4IGlzIHRvbyBsb25nLlBOb3RVc2VybmFtZUF1dGhvcml0eQASBOBUaGUgc2VuZGVyIGRvZXMgbm90IGhhdmUgcGVybWlzc2lvbiB0byBpc3N1ZSBhIHVzZXJuYW1lLjBOb0FsbG9jYXRpb24AEwTEVGhlIGF1dGhvcml0eSBjYW5ub3QgYWxsb2NhdGUgYW55IG1vcmUgdXNlcm5hbWVzLkBJbnZhbGlkU2lnbmF0dXJlABQEqFRoZSBzaWduYXR1cmUgb24gYSB1c2VybmFtZSB3YXMgbm90IHZhbGlkLkRSZXF1aXJlc1NpZ25hdHVyZQAVBAkBU2V0dGluZyB0aGlzIHVzZXJuYW1lIHJlcXVpcmVzIGEgc2lnbmF0dXJlLCBidXQgbm9uZSB3YXMgcHJvdmlkZWQuPEludmFsaWRVc2VybmFtZQAWBLBUaGUgdXNlcm5hbWUgZG9lcyBub3QgbWVldCB0aGUgcmVxdWlyZW1lbnRzLjRVc2VybmFtZVRha2VuABcEeFRoZSB1c2VybmFtZSBpcyBhbHJlYWR5IHRha2VuLihOb1VzZXJuYW1lABgEmFRoZSByZXF1ZXN0ZWQgdXNlcm5hbWUgZG9lcyBub3QgZXhpc3QuKE5vdEV4cGlyZWQAGQQtAVRoZSB1c2VybmFtZSBjYW5ub3QgYmUgZm9yY2VmdWxseSByZW1vdmVkIGJlY2F1c2UgaXQgY2FuIHN0aWxsIGJlIGFjY2VwdGVkLiBUb29FYXJseQAaBBkBVGhlIHVzZXJuYW1lIGNhbm5vdCBiZSByZW1vdmVkIGJlY2F1c2UgaXQncyBzdGlsbCBpbiB0aGUgZ3JhY2UgcGVyaW9kLjBOb3RVbmJpbmRpbmcAGwTsVGhlIHVzZXJuYW1lIGNhbm5vdCBiZSByZW1vdmVkIGJlY2F1c2UgaXQgaXMgbm90IHVuYmluZGluZy5AQWxyZWFkeVVuYmluZGluZwAcBPxUaGUgdXNlcm5hbWUgY2Fubm90IGJlIHVuYm91bmQgYmVjYXVzZSBpdCBpcyBhbHJlYWR5IHVuYmluZGluZy5YSW5zdWZmaWNpZW50UHJpdmlsZWdlcwAdCEUBVGhlIGFjdGlvbiBjYW5ub3QgYmUgcGVyZm9ybWVkIGJlY2F1c2Ugb2YgaW5zdWZmaWNpZW50IHByaXZpbGVnZXMgKGUuZy4gYXV0aG9yaXR50HRyeWluZyB0byB1bmJpbmQgYSB1c2VybmFtZSBwcm92aWRlZCBieSB0aGUgc3lzdGVtKS4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQuCQsIPHBhbGxldF9yZWNvdmVyeThSZWNvdmVyeUNvbmZpZwwsQmxvY2tOdW1iZXIBEBxCYWxhbmNlARgcRnJpZW5kcwENCwAQATBkZWxheV9wZXJpb2QQASxCbG9ja051bWJlcgABHGRlcG9zaXQYARxCYWxhbmNlAAEcZnJpZW5kcw0LARxGcmllbmRzAAEkdGhyZXNob2xkQQEBDHUxNgAADQsMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAEABFMAAAQAAQIBGFZlYzxUPgAAEQsAAAQIAAAAFQsIPHBhbGxldF9yZWNvdmVyeThBY3RpdmVSZWNvdmVyeQwsQmxvY2tOdW1iZXIBEBxCYWxhbmNlARgcRnJpZW5kcwENCwAMARxjcmVhdGVkEAEsQmxvY2tOdW1iZXIAARxkZXBvc2l0GAEcQmFsYW5jZQABHGZyaWVuZHMNCwEcRnJpZW5kcwAAGQsMPHBhbGxldF9yZWNvdmVyeRhwYWxsZXQURXJyb3IEBFQAAUAoTm90QWxsb3dlZAAABPBVc2VyIGlzIG5vdCBhbGxvd2VkIHRvIG1ha2UgYSBjYWxsIG9uIGJlaGFsZiBvZiB0aGlzIGFjY291bnQ0WmVyb1RocmVzaG9sZAABBIxUaHJlc2hvbGQgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVyb0BOb3RFbm91Z2hGcmllbmRzAAIE0EZyaWVuZHMgbGlzdCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvIGFuZCB0aHJlc2hvbGQoTWF4RnJpZW5kcwADBKhGcmllbmRzIGxpc3QgbXVzdCBiZSBsZXNzIHRoYW4gbWF4IGZyaWVuZHMkTm90U29ydGVkAAQEyEZyaWVuZHMgbGlzdCBtdXN0IGJlIHNvcnRlZCBhbmQgZnJlZSBvZiBkdXBsaWNhdGVzOE5vdFJlY292ZXJhYmxlAAUEnFRoaXMgYWNjb3VudCBpcyBub3Qgc2V0IHVwIGZvciByZWNvdmVyeUhBbHJlYWR5UmVjb3ZlcmFibGUABgSsVGhpcyBhY2NvdW50IGlzIGFscmVhZHkgc2V0IHVwIGZvciByZWNvdmVyeThBbHJlYWR5U3RhcnRlZAAHBNxBIHJlY292ZXJ5IHByb2Nlc3MgaGFzIGFscmVhZHkgc3RhcnRlZCBmb3IgdGhpcyBhY2NvdW50KE5vdFN0YXJ0ZWQACATMQSByZWNvdmVyeSBwcm9jZXNzIGhhcyBub3Qgc3RhcnRlZCBmb3IgdGhpcyByZXNjdWVyJE5vdEZyaWVuZAAJBKhUaGlzIGFjY291bnQgaXMgbm90IGEgZnJpZW5kIHdobyBjYW4gdm91Y2gsRGVsYXlQZXJpb2QACgQZAVRoZSBmcmllbmQgbXVzdCB3YWl0IHVudGlsIHRoZSBkZWxheSBwZXJpb2QgdG8gdm91Y2ggZm9yIHRoaXMgcmVjb3Zlcnk4QWxyZWFkeVZvdWNoZWQACwS8VGhpcyB1c2VyIGhhcyBhbHJlYWR5IHZvdWNoZWQgZm9yIHRoaXMgcmVjb3ZlcnkkVGhyZXNob2xkAAwE6FRoZSB0aHJlc2hvbGQgZm9yIHJlY292ZXJpbmcgdGhpcyBhY2NvdW50IGhhcyBub3QgYmVlbiBtZXQsU3RpbGxBY3RpdmUADQT8VGhlcmUgYXJlIHN0aWxsIGFjdGl2ZSByZWNvdmVyeSBhdHRlbXB0cyB0aGF0IG5lZWQgdG8gYmUgY2xvc2VkMEFscmVhZHlQcm94eQAOBKxUaGlzIGFjY291bnQgaXMgYWxyZWFkeSBzZXQgdXAgZm9yIHJlY292ZXJ5IEJhZFN0YXRlAA8EeFNvbWUgaW50ZXJuYWwgc3RhdGUgaXMgYnJva2VuLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC4dCwxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAakDBFMAAAQAIQsBGFZlYzxUPgAAIQsAAAKpAwAlCwg4cGFsbGV0X3Zlc3RpbmcgUmVsZWFzZXMAAQgIVjAAAAAIVjEAAQAAKQsMOHBhbGxldF92ZXN0aW5nGHBhbGxldBRFcnJvcgQEVAABFChOb3RWZXN0aW5nAAAEhFRoZSBhY2NvdW50IGdpdmVuIGlzIG5vdCB2ZXN0aW5nLlRBdE1heFZlc3RpbmdTY2hlZHVsZXMAAQglAVRoZSBhY2NvdW50IGFscmVhZHkgaGFzIGBNYXhWZXN0aW5nU2NoZWR1bGVzYCBjb3VudCBvZiBzY2hlZHVsZXMgYW5kIHRodXNRAWNhbm5vdCBhZGQgYW5vdGhlciBvbmUuIENvbnNpZGVyIG1lcmdpbmcgZXhpc3Rpbmcgc2NoZWR1bGVzIGluIG9yZGVyIHRvIGFkZCBhbm90aGVyLiRBbW91bnRMb3cAAgQFAUFtb3VudCBiZWluZyB0cmFuc2ZlcnJlZCBpcyB0b28gbG93IHRvIGNyZWF0ZSBhIHZlc3Rpbmcgc2NoZWR1bGUuYFNjaGVkdWxlSW5kZXhPdXRPZkJvdW5kcwADBNBBbiBpbmRleCB3YXMgb3V0IG9mIGJvdW5kcyBvZiB0aGUgdmVzdGluZyBzY2hlZHVsZXMuVEludmFsaWRTY2hlZHVsZVBhcmFtcwAEBA0BRmFpbGVkIHRvIGNyZWF0ZSBhIG5ldyBzY2hlZHVsZSBiZWNhdXNlIHNvbWUgcGFyYW1ldGVyIHdhcyBpbnZhbGlkLgR0RXJyb3IgZm9yIHRoZSB2ZXN0aW5nIHBhbGxldC4tCwxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUATELBFMAAAQAOQsBGFZlYzxUPgAAMQsEGE9wdGlvbgQEVAE1CwEIEE5vbmUAAAAQU29tZQQANQsAAAEAADULCEBwYWxsZXRfc2NoZWR1bGVyJFNjaGVkdWxlZBQQTmFtZQEEEENhbGwBpQEsQmxvY2tOdW1iZXIBEDRQYWxsZXRzT3JpZ2luAaECJEFjY291bnRJZAEAABQBIG1heWJlX2lkKQEBME9wdGlvbjxOYW1lPgABIHByaW9yaXR5CAFIc2NoZWR1bGU6OlByaW9yaXR5AAEQY2FsbKUBARBDYWxsAAE4bWF5YmVfcGVyaW9kaWOxAwGUT3B0aW9uPHNjaGVkdWxlOjpQZXJpb2Q8QmxvY2tOdW1iZXI+PgABGG9yaWdpbqECATRQYWxsZXRzT3JpZ2luAAA5CwAAAjELAD0LCEBwYWxsZXRfc2NoZWR1bGVyLFJldHJ5Q29uZmlnBBhQZXJpb2QBEAAMATR0b3RhbF9yZXRyaWVzCAEIdTgAASRyZW1haW5pbmcIAQh1OAABGHBlcmlvZBABGFBlcmlvZAAAQQsMQHBhbGxldF9zY2hlZHVsZXIYcGFsbGV0FEVycm9yBARUAAEUQEZhaWxlZFRvU2NoZWR1bGUAAARkRmFpbGVkIHRvIHNjaGVkdWxlIGEgY2FsbCBOb3RGb3VuZAABBHxDYW5ub3QgZmluZCB0aGUgc2NoZWR1bGVkIGNhbGwuXFRhcmdldEJsb2NrTnVtYmVySW5QYXN0AAIEpEdpdmVuIHRhcmdldCBibG9jayBudW1iZXIgaXMgaW4gdGhlIHBhc3QuSFJlc2NoZWR1bGVOb0NoYW5nZQADBPBSZXNjaGVkdWxlIGZhaWxlZCBiZWNhdXNlIGl0IGRvZXMgbm90IGNoYW5nZSBzY2hlZHVsZWQgdGltZS4UTmFtZWQABATQQXR0ZW1wdCB0byB1c2UgYSBub24tbmFtZWQgZnVuY3Rpb24gb24gYSBuYW1lZCB0YXNrLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC5FCwg8cGFsbGV0X3ByZWltYWdlQE9sZFJlcXVlc3RTdGF0dXMIJEFjY291bnRJZAEAHEJhbGFuY2UBGAEILFVucmVxdWVzdGVkCAEcZGVwb3NpdL0EAVAoQWNjb3VudElkLCBCYWxhbmNlKQABDGxlbhABDHUzMgAAACRSZXF1ZXN0ZWQMARxkZXBvc2l0SQsBcE9wdGlvbjwoQWNjb3VudElkLCBCYWxhbmNlKT4AARRjb3VudBABDHUzMgABDGxlbpwBLE9wdGlvbjx1MzI+AAEAAEkLBBhPcHRpb24EBFQBvQQBCBBOb25lAAAAEFNvbWUEAL0EAAABAABNCwg8cGFsbGV0X3ByZWltYWdlNFJlcXVlc3RTdGF0dXMIJEFjY291bnRJZAEAGFRpY2tldAFRCwEILFVucmVxdWVzdGVkCAEYdGlja2V0VQsBTChBY2NvdW50SWQsIFRpY2tldCkAAQxsZW4QAQx1MzIAAAAkUmVxdWVzdGVkDAEwbWF5YmVfdGlja2V0WQsBbE9wdGlvbjwoQWNjb3VudElkLCBUaWNrZXQpPgABFGNvdW50EAEMdTMyAAEkbWF5YmVfbGVunAEsT3B0aW9uPHUzMj4AAQAAUQsUNGZyYW1lX3N1cHBvcnQYdHJhaXRzGHRva2VucyBmdW5naWJsZURIb2xkQ29uc2lkZXJhdGlvbhQEQQAERgAEUgAERAAIRnAAAAQAGAEoRjo6QmFsYW5jZQAAVQsAAAQIAFELAFkLBBhPcHRpb24EBFQBVQsBCBBOb25lAAAAEFNvbWUEAFULAAABAABdCwxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAQgEUwAABAA4ARhWZWM8VD4AAGELDDxwYWxsZXRfcHJlaW1hZ2UYcGFsbGV0FEVycm9yBARUAAEgGFRvb0JpZwAABKBQcmVpbWFnZSBpcyB0b28gbGFyZ2UgdG8gc3RvcmUgb24tY2hhaW4uMEFscmVhZHlOb3RlZAABBKRQcmVpbWFnZSBoYXMgYWxyZWFkeSBiZWVuIG5vdGVkIG9uLWNoYWluLjROb3RBdXRob3JpemVkAAIEyFRoZSB1c2VyIGlzIG5vdCBhdXRob3JpemVkIHRvIHBlcmZvcm0gdGhpcyBhY3Rpb24uIE5vdE5vdGVkAAME/FRoZSBwcmVpbWFnZSBjYW5ub3QgYmUgcmVtb3ZlZCBzaW5jZSBpdCBoYXMgbm90IHlldCBiZWVuIG5vdGVkLiRSZXF1ZXN0ZWQABAQJAUEgcHJlaW1hZ2UgbWF5IG5vdCBiZSByZW1vdmVkIHdoZW4gdGhlcmUgYXJlIG91dHN0YW5kaW5nIHJlcXVlc3RzLjBOb3RSZXF1ZXN0ZWQABQQtAVRoZSBwcmVpbWFnZSByZXF1ZXN0IGNhbm5vdCBiZSByZW1vdmVkIHNpbmNlIG5vIG91dHN0YW5kaW5nIHJlcXVlc3RzIGV4aXN0LhxUb29NYW55AAYEVQFNb3JlIHRoYW4gYE1BWF9IQVNIX1VQR1JBREVfQlVMS19DT1VOVGAgaGFzaGVzIHdlcmUgcmVxdWVzdGVkIHRvIGJlIHVwZ3JhZGVkIGF0IG9uY2UuGFRvb0ZldwAHBORUb28gZmV3IGhhc2hlcyB3ZXJlIHJlcXVlc3RlZCB0byBiZSB1cGdyYWRlZCAoaS5lLiB6ZXJvKS4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQuZQsMLHBhbGxldF9zdWRvGHBhbGxldBRFcnJvcgQEVAABBCxSZXF1aXJlU3VkbwAABIBTZW5kZXIgbXVzdCBiZSB0aGUgU3VkbyBhY2NvdW50LgRoRXJyb3IgZm9yIHRoZSBTdWRvIHBhbGxldC5pCwAABAhtCxgAbQsMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAFxCwRTAAAEAHULARhWZWM8VD4AAHELCDBwYWxsZXRfcHJveHk8UHJveHlEZWZpbml0aW9uDCRBY2NvdW50SWQBACRQcm94eVR5cGUBPQEsQmxvY2tOdW1iZXIBEAAMASBkZWxlZ2F0ZQABJEFjY291bnRJZAABKHByb3h5X3R5cGU9AQEkUHJveHlUeXBlAAEUZGVsYXkQASxCbG9ja051bWJlcgAAdQsAAAJxCwB5CwAABAh9CxgAfQsMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAGBCwRTAAAEAIULARhWZWM8VD4AAIELCDBwYWxsZXRfcHJveHkwQW5ub3VuY2VtZW50DCRBY2NvdW50SWQBABBIYXNoATQsQmxvY2tOdW1iZXIBEAAMARByZWFsAAEkQWNjb3VudElkAAEkY2FsbF9oYXNoNAEQSGFzaAABGGhlaWdodBABLEJsb2NrTnVtYmVyAACFCwAAAoELAIkLDDBwYWxsZXRfcHJveHkYcGFsbGV0FEVycm9yBARUAAEgHFRvb01hbnkAAAQhAVRoZXJlIGFyZSB0b28gbWFueSBwcm94aWVzIHJlZ2lzdGVyZWQgb3IgdG9vIG1hbnkgYW5ub3VuY2VtZW50cyBwZW5kaW5nLiBOb3RGb3VuZAABBHRQcm94eSByZWdpc3RyYXRpb24gbm90IGZvdW5kLiBOb3RQcm94eQACBMxTZW5kZXIgaXMgbm90IGEgcHJveHkgb2YgdGhlIGFjY291bnQgdG8gYmUgcHJveGllZC4sVW5wcm94eWFibGUAAwQhAUEgY2FsbCB3aGljaCBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgcHJveHkgdHlwZSdzIGZpbHRlciB3YXMgYXR0ZW1wdGVkLiREdXBsaWNhdGUABARsQWNjb3VudCBpcyBhbHJlYWR5IGEgcHJveHkuME5vUGVybWlzc2lvbgAFBBUBQ2FsbCBtYXkgbm90IGJlIG1hZGUgYnkgcHJveHkgYmVjYXVzZSBpdCBtYXkgZXNjYWxhdGUgaXRzIHByaXZpbGVnZXMuLFVuYW5ub3VuY2VkAAYE0EFubm91bmNlbWVudCwgaWYgbWFkZSBhdCBhbGwsIHdhcyBtYWRlIHRvbyByZWNlbnRseS4sTm9TZWxmUHJveHkABwRkQ2Fubm90IGFkZCBzZWxmIGFzIHByb3h5LgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC6NCwAABAgABACRCwg8cGFsbGV0X211bHRpc2lnIE11bHRpc2lnECxCbG9ja051bWJlcgEQHEJhbGFuY2UBGCRBY2NvdW50SWQBADBNYXhBcHByb3ZhbHMAABABEHdoZW5NAQFYVGltZXBvaW50PEJsb2NrTnVtYmVyPgABHGRlcG9zaXQYARxCYWxhbmNlAAEkZGVwb3NpdG9yAAEkQWNjb3VudElkAAEkYXBwcm92YWxzlQsBjEJvdW5kZWRWZWM8QWNjb3VudElkLCBNYXhBcHByb3ZhbHM+AACVCwxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAQAEUwAABAABAgEYVmVjPFQ+AACZCww8cGFsbGV0X211bHRpc2lnGHBhbGxldBRFcnJvcgQEVAABOEBNaW5pbXVtVGhyZXNob2xkAAAEfFRocmVzaG9sZCBtdXN0IGJlIDIgb3IgZ3JlYXRlci48QWxyZWFkeUFwcHJvdmVkAAEErENhbGwgaXMgYWxyZWFkeSBhcHByb3ZlZCBieSB0aGlzIHNpZ25hdG9yeS5ETm9BcHByb3ZhbHNOZWVkZWQAAgScQ2FsbCBkb2Vzbid0IG5lZWQgYW55IChtb3JlKSBhcHByb3ZhbHMuRFRvb0Zld1NpZ25hdG9yaWVzAAMEqFRoZXJlIGFyZSB0b28gZmV3IHNpZ25hdG9yaWVzIGluIHRoZSBsaXN0LkhUb29NYW55U2lnbmF0b3JpZXMABASsVGhlcmUgYXJlIHRvbyBtYW55IHNpZ25hdG9yaWVzIGluIHRoZSBsaXN0LlRTaWduYXRvcmllc091dE9mT3JkZXIABQQNAVRoZSBzaWduYXRvcmllcyB3ZXJlIHByb3ZpZGVkIG91dCBvZiBvcmRlcjsgdGhleSBzaG91bGQgYmUgb3JkZXJlZC5MU2VuZGVySW5TaWduYXRvcmllcwAGBA0BVGhlIHNlbmRlciB3YXMgY29udGFpbmVkIGluIHRoZSBvdGhlciBzaWduYXRvcmllczsgaXQgc2hvdWxkbid0IGJlLiBOb3RGb3VuZAAHBKBNdWx0aXNpZyBvcGVyYXRpb24gbm90IGZvdW5kIGluIHN0b3JhZ2UuIE5vdE93bmVyAAgIUQFPbmx5IHRoZSBhY2NvdW50IHRoYXQgb3JpZ2luYWxseSBjcmVhdGVkIHRoZSBtdWx0aXNpZyBpcyBhYmxlIHRvIGNhbmNlbCBpdCBvciB1cGRhdGU0aXRzIGRlcG9zaXRzLixOb1RpbWVwb2ludAAJBB0BTm8gdGltZXBvaW50IHdhcyBnaXZlbiwgeWV0IHRoZSBtdWx0aXNpZyBvcGVyYXRpb24gaXMgYWxyZWFkeSB1bmRlcndheS44V3JvbmdUaW1lcG9pbnQACgQtAUEgZGlmZmVyZW50IHRpbWVwb2ludCB3YXMgZ2l2ZW4gdG8gdGhlIG11bHRpc2lnIG9wZXJhdGlvbiB0aGF0IGlzIHVuZGVyd2F5LkxVbmV4cGVjdGVkVGltZXBvaW50AAsE9EEgdGltZXBvaW50IHdhcyBnaXZlbiwgeWV0IG5vIG11bHRpc2lnIG9wZXJhdGlvbiBpcyB1bmRlcndheS48TWF4V2VpZ2h0VG9vTG93AAwE0FRoZSBtYXhpbXVtIHdlaWdodCBpbmZvcm1hdGlvbiBwcm92aWRlZCB3YXMgdG9vIGxvdy40QWxyZWFkeVN0b3JlZAANBKBUaGUgZGF0YSB0byBiZSBzdG9yZWQgaXMgYWxyZWFkeSBzdG9yZWQuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0Lp0LCJBwYWxsZXRfZWxlY3Rpb25fcHJvdmlkZXJfbXVsdGlfcGhhc2U0UmVhZHlTb2x1dGlvbgwkQWNjb3VudElkAChNYXhXaW5uZXJzAExNYXhCYWNrZXJzUGVyV2lubmVyAAAMASBzdXBwb3J0c6ELAexCb3VuZGVkU3VwcG9ydHM8QWNjb3VudElkLCBNYXhXaW5uZXJzLCBNYXhCYWNrZXJzUGVyV2lubmVyPgABFHNjb3JlWQEBNEVsZWN0aW9uU2NvcmUAARxjb21wdXRlVQEBPEVsZWN0aW9uQ29tcHV0ZQAAoQsIfGZyYW1lX2VsZWN0aW9uX3Byb3ZpZGVyX3N1cHBvcnQ8Qm91bmRlZFN1cHBvcnRzDCRBY2NvdW50SWQBABhCT3V0ZXIAGEJJbm5lcgAABAClCwEJAUJvdW5kZWRWZWM8KEFjY291bnRJZCwgQm91bmRlZFN1cHBvcnQ8QWNjb3VudElkLCBCSW5uZXI+KSwgQk91dGVyPgAApQsMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAGpCwRTAAAEALULARhWZWM8VD4AAKkLAAAECACtCwCtCwh8ZnJhbWVfZWxlY3Rpb25fcHJvdmlkZXJfc3VwcG9ydDhCb3VuZGVkU3VwcG9ydAgkQWNjb3VudElkAQAUQm91bmQAAAgBFHRvdGFsGAE8RXh0ZW5kZWRCYWxhbmNlAAEYdm90ZXJzsQsBvEJvdW5kZWRWZWM8KEFjY291bnRJZCwgRXh0ZW5kZWRCYWxhbmNlKSwgQm91bmQ+AACxCwxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAb0EBFMAAAQAuQQBGFZlYzxUPgAAtQsAAAKpCwC5CwiQcGFsbGV0X2VsZWN0aW9uX3Byb3ZpZGVyX211bHRpX3BoYXNlNFJvdW5kU25hcHNob3QIJEFjY291bnRJZAEAJFZvdGVyVHlwZQG9CwAIARh2b3RlcnPBCwE4VmVjPFZvdGVyVHlwZT4AARx0YXJnZXRzAQIBOFZlYzxBY2NvdW50SWQ+AAC9CwAABAwAMDEKAMELAAACvQsAxQsMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAHJCwRTAAAEAM0LARhWZWM8VD4AAMkLAAAEDFkBEBAAzQsAAALJCwDRCwyQcGFsbGV0X2VsZWN0aW9uX3Byb3ZpZGVyX211bHRpX3BoYXNlGHNpZ25lZEBTaWduZWRTdWJtaXNzaW9uDCRBY2NvdW50SWQBABxCYWxhbmNlARggU29sdXRpb24B2QMAEAEMd2hvAAEkQWNjb3VudElkAAEcZGVwb3NpdBgBHEJhbGFuY2UAATByYXdfc29sdXRpb27VAwFUUmF3U29sdXRpb248U29sdXRpb24+AAEgY2FsbF9mZWUYARxCYWxhbmNlAADVCwyQcGFsbGV0X2VsZWN0aW9uX3Byb3ZpZGVyX211bHRpX3BoYXNlGHBhbGxldBRFcnJvcgQEVAABPGhQcmVEaXNwYXRjaEVhcmx5U3VibWlzc2lvbgAABGRTdWJtaXNzaW9uIHdhcyB0b28gZWFybHkubFByZURpc3BhdGNoV3JvbmdXaW5uZXJDb3VudAABBIhXcm9uZyBudW1iZXIgb2Ygd2lubmVycyBwcmVzZW50ZWQuZFByZURpc3BhdGNoV2Vha1N1Ym1pc3Npb24AAgSQU3VibWlzc2lvbiB3YXMgdG9vIHdlYWssIHNjb3JlLXdpc2UuPFNpZ25lZFF1ZXVlRnVsbAADBEkBVGhlIHF1ZXVlIHdhcyBmdWxsLCBhbmQgdGhlIHNvbHV0aW9uIHdhcyBub3QgYmV0dGVyIHRoYW4gYW55IG9mIHRoZSBleGlzdGluZyBvbmVzLlhTaWduZWRDYW5ub3RQYXlEZXBvc2l0AAQElFRoZSBvcmlnaW4gZmFpbGVkIHRvIHBheSB0aGUgZGVwb3NpdC5QU2lnbmVkSW52YWxpZFdpdG5lc3MABQSgV2l0bmVzcyBkYXRhIHRvIGRpc3BhdGNoYWJsZSBpcyBpbnZhbGlkLkxTaWduZWRUb29NdWNoV2VpZ2h0AAYEuFRoZSBzaWduZWQgc3VibWlzc2lvbiBjb25zdW1lcyB0b28gbXVjaCB3ZWlnaHQ8T2N3Q2FsbFdyb25nRXJhAAcEmE9DVyBzdWJtaXR0ZWQgc29sdXRpb24gZm9yIHdyb25nIHJvdW5kXE1pc3NpbmdTbmFwc2hvdE1ldGFkYXRhAAgEqFNuYXBzaG90IG1ldGFkYXRhIHNob3VsZCBleGlzdCBidXQgZGlkbid0LlhJbnZhbGlkU3VibWlzc2lvbkluZGV4AAkE0GBTZWxmOjppbnNlcnRfc3VibWlzc2lvbmAgcmV0dXJuZWQgYW4gaW52YWxpZCBpbmRleC44Q2FsbE5vdEFsbG93ZWQACgSYVGhlIGNhbGwgaXMgbm90IGFsbG93ZWQgYXQgdGhpcyBwb2ludC44RmFsbGJhY2tGYWlsZWQACwRMVGhlIGZhbGxiYWNrIGZhaWxlZCxCb3VuZE5vdE1ldAAMBEhTb21lIGJvdW5kIG5vdCBtZXQ4VG9vTWFueVdpbm5lcnMADQScU3VibWl0dGVkIHNvbHV0aW9uIGhhcyB0b28gbWFueSB3aW5uZXJzZFByZURpc3BhdGNoRGlmZmVyZW50Um91bmQADgS4U3VibWlzc2lvbiB3YXMgcHJlcGFyZWQgZm9yIGEgZGlmZmVyZW50IHJvdW5kLgQNAUVycm9yIG9mIHRoZSBwYWxsZXQgdGhhdCBjYW4gYmUgcmV0dXJuZWQgaW4gcmVzcG9uc2UgdG8gZGlzcGF0Y2hlcy7ZCwxAcGFsbGV0X2JhZ3NfbGlzdBBsaXN0EE5vZGUIBFQABEkAABQBCGlkAAEwVDo6QWNjb3VudElkAAEQcHJldjUBAVBPcHRpb248VDo6QWNjb3VudElkPgABEG5leHQ1AQFQT3B0aW9uPFQ6OkFjY291bnRJZD4AASRiYWdfdXBwZXIwASBUOjpTY29yZQABFHNjb3JlMAEgVDo6U2NvcmUAAN0LDEBwYWxsZXRfYmFnc19saXN0EGxpc3QMQmFnCARUAARJAAAIARBoZWFkNQEBUE9wdGlvbjxUOjpBY2NvdW50SWQ+AAEQdGFpbDUBAVBPcHRpb248VDo6QWNjb3VudElkPgAA4QsAAAIwAOULDEBwYWxsZXRfYmFnc19saXN0GHBhbGxldBRFcnJvcggEVAAESQABCBBMaXN0BADpCwEkTGlzdEVycm9yAAAEtEEgZXJyb3IgaW4gdGhlIGxpc3QgaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uLhhMb2NrZWQAAQTYQ291bGQgbm90IHVwZGF0ZSBhIG5vZGUsIGJlY2F1c2UgdGhlIHBhbGxldCBpcyBsb2NrZWQuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LukLDEBwYWxsZXRfYmFnc19saXN0EGxpc3QkTGlzdEVycm9yAAEUJER1cGxpY2F0ZQAAAChOb3RIZWF2aWVyAAEAME5vdEluU2FtZUJhZwACADBOb2RlTm90Rm91bmQAAwAYTG9ja2VkAAQAAO0LCFxwYWxsZXRfbm9taW5hdGlvbl9wb29scyhQb29sTWVtYmVyBARUAAAQARxwb29sX2lkEAEYUG9vbElkAAEYcG9pbnRzGAEwQmFsYW5jZU9mPFQ+AAFwbGFzdF9yZWNvcmRlZF9yZXdhcmRfY291bnRlci0IAUBUOjpSZXdhcmRDb3VudGVyAAE4dW5ib25kaW5nX2VyYXPxCwHgQm91bmRlZEJUcmVlTWFwPEVyYUluZGV4LCBCYWxhbmNlT2Y8VD4sIFQ6Ok1heFVuYm9uZGluZz4AAPELDExib3VuZGVkX2NvbGxlY3Rpb25zRGJvdW5kZWRfYnRyZWVfbWFwPEJvdW5kZWRCVHJlZU1hcAwESwEQBFYBGARTAAAEAPULAThCVHJlZU1hcDxLLCBWPgAA9QsEIEJUcmVlTWFwCARLARAEVgEYAAQA+QsAAAD5CwAAAv0LAP0LAAAECBAYAAEMCFxwYWxsZXRfbm9taW5hdGlvbl9wb29sczxCb25kZWRQb29sSW5uZXIEBFQAABQBKGNvbW1pc3Npb24FDAE0Q29tbWlzc2lvbjxUPgABOG1lbWJlcl9jb3VudGVyEAEMdTMyAAEYcG9pbnRzGAEwQmFsYW5jZU9mPFQ+AAEUcm9sZXMNDAFcUG9vbFJvbGVzPFQ6OkFjY291bnRJZD4AARRzdGF0ZW0BASRQb29sU3RhdGUAAAUMCFxwYWxsZXRfbm9taW5hdGlvbl9wb29scyhDb21taXNzaW9uBARUAAAUARxjdXJyZW50cQEBfE9wdGlvbjwoUGVyYmlsbCwgVDo6QWNjb3VudElkKT4AAQxtYXiJAQE8T3B0aW9uPFBlcmJpbGw+AAEsY2hhbmdlX3JhdGUJDAG8T3B0aW9uPENvbW1pc3Npb25DaGFuZ2VSYXRlPEJsb2NrTnVtYmVyRm9yPFQ+Pj4AATR0aHJvdHRsZV9mcm9tnAFkT3B0aW9uPEJsb2NrTnVtYmVyRm9yPFQ+PgABQGNsYWltX3Blcm1pc3Npb259AQG8T3B0aW9uPENvbW1pc3Npb25DbGFpbVBlcm1pc3Npb248VDo6QWNjb3VudElkPj4AAAkMBBhPcHRpb24EBFQBeQEBCBBOb25lAAAAEFNvbWUEAHkBAAABAAANDAhccGFsbGV0X25vbWluYXRpb25fcG9vbHMkUG9vbFJvbGVzBCRBY2NvdW50SWQBAAAQASRkZXBvc2l0b3IAASRBY2NvdW50SWQAARByb290NQEBRE9wdGlvbjxBY2NvdW50SWQ+AAEkbm9taW5hdG9yNQEBRE9wdGlvbjxBY2NvdW50SWQ+AAEcYm91bmNlcjUBAURPcHRpb248QWNjb3VudElkPgAAEQwIXHBhbGxldF9ub21pbmF0aW9uX3Bvb2xzKFJld2FyZFBvb2wEBFQAABQBcGxhc3RfcmVjb3JkZWRfcmV3YXJkX2NvdW50ZXItCAFAVDo6UmV3YXJkQ291bnRlcgABbGxhc3RfcmVjb3JkZWRfdG90YWxfcGF5b3V0cxgBMEJhbGFuY2VPZjxUPgABVHRvdGFsX3Jld2FyZHNfY2xhaW1lZBgBMEJhbGFuY2VPZjxUPgABYHRvdGFsX2NvbW1pc3Npb25fcGVuZGluZxgBMEJhbGFuY2VPZjxUPgABYHRvdGFsX2NvbW1pc3Npb25fY2xhaW1lZBgBMEJhbGFuY2VPZjxUPgAAFQwIXHBhbGxldF9ub21pbmF0aW9uX3Bvb2xzIFN1YlBvb2xzBARUAAAIARhub19lcmEZDAE0VW5ib25kUG9vbDxUPgABIHdpdGhfZXJhHQwBAQFCb3VuZGVkQlRyZWVNYXA8RXJhSW5kZXgsIFVuYm9uZFBvb2w8VD4sIFRvdGFsVW5ib25kaW5nUG9vbHM8VD4+AAAZDAhccGFsbGV0X25vbWluYXRpb25fcG9vbHMoVW5ib25kUG9vbAQEVAAACAEYcG9pbnRzGAEwQmFsYW5jZU9mPFQ+AAEcYmFsYW5jZRgBMEJhbGFuY2VPZjxUPgAAHQwMTGJvdW5kZWRfY29sbGVjdGlvbnNEYm91bmRlZF9idHJlZV9tYXA8Qm91bmRlZEJUcmVlTWFwDARLARAEVgEZDARTAAAEACEMAThCVHJlZU1hcDxLLCBWPgAAIQwEIEJUcmVlTWFwCARLARAEVgEZDAAEACUMAAAAJQwAAAIpDAApDAAABAgQGQwALQwINGZyYW1lX3N1cHBvcnQgUGFsbGV0SWQAAAQAJQMBHFt1ODsgOF0AADEMDFxwYWxsZXRfbm9taW5hdGlvbl9wb29scxhwYWxsZXQURXJyb3IEBFQAAZgwUG9vbE5vdEZvdW5kAAAEiEEgKGJvbmRlZCkgcG9vbCBpZCBkb2VzIG5vdCBleGlzdC5IUG9vbE1lbWJlck5vdEZvdW5kAAEEbEFuIGFjY291bnQgaXMgbm90IGEgbWVtYmVyLkhSZXdhcmRQb29sTm90Rm91bmQAAgQhAUEgcmV3YXJkIHBvb2wgZG9lcyBub3QgZXhpc3QuIEluIGFsbCBjYXNlcyB0aGlzIGlzIGEgc3lzdGVtIGxvZ2ljIGVycm9yLkBTdWJQb29sc05vdEZvdW5kAAMEaEEgc3ViIHBvb2wgZG9lcyBub3QgZXhpc3QuZEFjY291bnRCZWxvbmdzVG9PdGhlclBvb2wABAhNAUFuIGFjY291bnQgaXMgYWxyZWFkeSBkZWxlZ2F0aW5nIGluIGFub3RoZXIgcG9vbC4gQW4gYWNjb3VudCBtYXkgb25seSBiZWxvbmcgdG8gb25lPHBvb2wgYXQgYSB0aW1lLjhGdWxseVVuYm9uZGluZwAFCD0BVGhlIG1lbWJlciBpcyBmdWxseSB1bmJvbmRlZCAoYW5kIHRodXMgY2Fubm90IGFjY2VzcyB0aGUgYm9uZGVkIGFuZCByZXdhcmQgcG9vbKhhbnltb3JlIHRvLCBmb3IgZXhhbXBsZSwgY29sbGVjdCByZXdhcmRzKS5ETWF4VW5ib25kaW5nTGltaXQABgQJAVRoZSBtZW1iZXIgY2Fubm90IHVuYm9uZCBmdXJ0aGVyIGNodW5rcyBkdWUgdG8gcmVhY2hpbmcgdGhlIGxpbWl0LkRDYW5ub3RXaXRoZHJhd0FueQAHBE0BTm9uZSBvZiB0aGUgZnVuZHMgY2FuIGJlIHdpdGhkcmF3biB5ZXQgYmVjYXVzZSB0aGUgYm9uZGluZyBkdXJhdGlvbiBoYXMgbm90IHBhc3NlZC5ETWluaW11bUJvbmROb3RNZXQACBQpAVRoZSBhbW91bnQgZG9lcyBub3QgbWVldCB0aGUgbWluaW11bSBib25kIHRvIGVpdGhlciBqb2luIG9yIGNyZWF0ZSBhIHBvb2wuAFUBVGhlIGRlcG9zaXRvciBjYW4gbmV2ZXIgdW5ib25kIHRvIGEgdmFsdWUgbGVzcyB0aGFuIGBQYWxsZXQ6OmRlcG9zaXRvcl9taW5fYm9uZGAuIFRoZV0BY2FsbGVyIGRvZXMgbm90IGhhdmUgbm9taW5hdGluZyBwZXJtaXNzaW9ucyBmb3IgdGhlIHBvb2wuIE1lbWJlcnMgY2FuIG5ldmVyIHVuYm9uZCB0byBhaHZhbHVlIGJlbG93IGBNaW5Kb2luQm9uZGAuME92ZXJmbG93UmlzawAJBCEBVGhlIHRyYW5zYWN0aW9uIGNvdWxkIG5vdCBiZSBleGVjdXRlZCBkdWUgdG8gb3ZlcmZsb3cgcmlzayBmb3IgdGhlIHBvb2wuNE5vdERlc3Ryb3lpbmcACghdAUEgcG9vbCBtdXN0IGJlIGluIFtgUG9vbFN0YXRlOjpEZXN0cm95aW5nYF0gaW4gb3JkZXIgZm9yIHRoZSBkZXBvc2l0b3IgdG8gdW5ib25kIG9yIGZvcrhvdGhlciBtZW1iZXJzIHRvIGJlIHBlcm1pc3Npb25sZXNzbHkgdW5ib25kZWQuME5vdE5vbWluYXRvcgALBPRUaGUgY2FsbGVyIGRvZXMgbm90IGhhdmUgbm9taW5hdGluZyBwZXJtaXNzaW9ucyBmb3IgdGhlIHBvb2wuVE5vdEtpY2tlck9yRGVzdHJveWluZwAMBD0BRWl0aGVyIGEpIHRoZSBjYWxsZXIgY2Fubm90IG1ha2UgYSB2YWxpZCBraWNrIG9yIGIpIHRoZSBwb29sIGlzIG5vdCBkZXN0cm95aW5nLhxOb3RPcGVuAA0EcFRoZSBwb29sIGlzIG5vdCBvcGVuIHRvIGpvaW4gTWF4UG9vbHMADgSEVGhlIHN5c3RlbSBpcyBtYXhlZCBvdXQgb24gcG9vbHMuOE1heFBvb2xNZW1iZXJzAA8EnFRvbyBtYW55IG1lbWJlcnMgaW4gdGhlIHBvb2wgb3Igc3lzdGVtLkRDYW5Ob3RDaGFuZ2VTdGF0ZQAQBIhUaGUgcG9vbHMgc3RhdGUgY2Fubm90IGJlIGNoYW5nZWQuVERvZXNOb3RIYXZlUGVybWlzc2lvbgARBLhUaGUgY2FsbGVyIGRvZXMgbm90IGhhdmUgYWRlcXVhdGUgcGVybWlzc2lvbnMuVE1ldGFkYXRhRXhjZWVkc01heExlbgASBKxNZXRhZGF0YSBleGNlZWRzIFtgQ29uZmlnOjpNYXhNZXRhZGF0YUxlbmBdJERlZmVuc2l2ZQQANQwBOERlZmVuc2l2ZUVycm9yABMIMQFTb21lIGVycm9yIG9jY3VycmVkIHRoYXQgc2hvdWxkIG5ldmVyIGhhcHBlbi4gVGhpcyBzaG91bGQgYmUgcmVwb3J0ZWQgdG8gdGhlMG1haW50YWluZXJzLpxQYXJ0aWFsVW5ib25kTm90QWxsb3dlZFBlcm1pc3Npb25sZXNzbHkAFAS8UGFydGlhbCB1bmJvbmRpbmcgbm93IGFsbG93ZWQgcGVybWlzc2lvbmxlc3NseS5cTWF4Q29tbWlzc2lvblJlc3RyaWN0ZWQAFQQdAVRoZSBwb29sJ3MgbWF4IGNvbW1pc3Npb24gY2Fubm90IGJlIHNldCBoaWdoZXIgdGhhbiB0aGUgZXhpc3RpbmcgdmFsdWUuYENvbW1pc3Npb25FeGNlZWRzTWF4aW11bQAWBOxUaGUgc3VwcGxpZWQgY29tbWlzc2lvbiBleGNlZWRzIHRoZSBtYXggYWxsb3dlZCBjb21taXNzaW9uLnhDb21taXNzaW9uRXhjZWVkc0dsb2JhbE1heGltdW0AFwToVGhlIHN1cHBsaWVkIGNvbW1pc3Npb24gZXhjZWVkcyBnbG9iYWwgbWF4aW11bSBjb21taXNzaW9uLmRDb21taXNzaW9uQ2hhbmdlVGhyb3R0bGVkABgECQFOb3QgZW5vdWdoIGJsb2NrcyBoYXZlIHN1cnBhc3NlZCBzaW5jZSB0aGUgbGFzdCBjb21taXNzaW9uIHVwZGF0ZS54Q29tbWlzc2lvbkNoYW5nZVJhdGVOb3RBbGxvd2VkABkEAQFUaGUgc3VibWl0dGVkIGNoYW5nZXMgdG8gY29tbWlzc2lvbiBjaGFuZ2UgcmF0ZSBhcmUgbm90IGFsbG93ZWQuTE5vUGVuZGluZ0NvbW1pc3Npb24AGgSgVGhlcmUgaXMgbm8gcGVuZGluZyBjb21taXNzaW9uIHRvIGNsYWltLlhOb0NvbW1pc3Npb25DdXJyZW50U2V0ABsEjE5vIGNvbW1pc3Npb24gY3VycmVudCBoYXMgYmVlbiBzZXQuLFBvb2xJZEluVXNlABwEZFBvb2wgaWQgY3VycmVudGx5IGluIHVzZS40SW52YWxpZFBvb2xJZAAdBJxQb29sIGlkIHByb3ZpZGVkIGlzIG5vdCBjb3JyZWN0L3VzYWJsZS5MQm9uZEV4dHJhUmVzdHJpY3RlZAAeBPxCb25kaW5nIGV4dHJhIGlzIHJlc3RyaWN0ZWQgdG8gdGhlIGV4YWN0IHBlbmRpbmcgcmV3YXJkIGFtb3VudC48Tm90aGluZ1RvQWRqdXN0AB8EsE5vIGltYmFsYW5jZSBpbiB0aGUgRUQgZGVwb3NpdCBmb3IgdGhlIHBvb2wuOE5vdGhpbmdUb1NsYXNoACAEzE5vIHNsYXNoIHBlbmRpbmcgdGhhdCBjYW4gYmUgYXBwbGllZCB0byB0aGUgbWVtYmVyLixTbGFzaFRvb0xvdwAhBKhUaGUgc2xhc2ggYW1vdW50IGlzIHRvbyBsb3cgdG8gYmUgYXBwbGllZC48QWxyZWFkeU1pZ3JhdGVkACIEFQFUaGUgcG9vbCBvciBtZW1iZXIgZGVsZWdhdGlvbiBoYXMgYWxyZWFkeSBtaWdyYXRlZCB0byBkZWxlZ2F0ZSBzdGFrZS4sTm90TWlncmF0ZWQAIwQVAVRoZSBwb29sIG9yIG1lbWJlciBkZWxlZ2F0aW9uIGhhcyBub3QgbWlncmF0ZWQgeWV0IHRvIGRlbGVnYXRlIHN0YWtlLjBOb3RTdXBwb3J0ZWQAJATwVGhpcyBjYWxsIGlzIG5vdCBhbGxvd2VkIGluIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBwYWxsZXQuKFJlc3RyaWN0ZWQAJQhRAUFjY291bnQgaXMgcmVzdHJpY3RlZCBmcm9tIHBhcnRpY2lwYXRpb24gaW4gcG9vbHMuIFRoaXMgbWF5IGhhcHBlbiBpZiB0aGUgYWNjb3VudCBpc3xzdGFraW5nIGluIGFub3RoZXIgd2F5IGFscmVhZHkuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LjUMDFxwYWxsZXRfbm9taW5hdGlvbl9wb29scxhwYWxsZXQ4RGVmZW5zaXZlRXJyb3IAARxoTm90RW5vdWdoU3BhY2VJblVuYm9uZFBvb2wAAAAwUG9vbE5vdEZvdW5kAAEASFJld2FyZFBvb2xOb3RGb3VuZAACAEBTdWJQb29sc05vdEZvdW5kAAMAcEJvbmRlZFN0YXNoS2lsbGVkUHJlbWF0dXJlbHkABABURGVsZWdhdGlvblVuc3VwcG9ydGVkAAUAPFNsYXNoTm90QXBwbGllZAAGAAA5DAxMcGFsbGV0X2Zhc3RfdW5zdGFrZRR0eXBlczhVbnN0YWtlUmVxdWVzdAQEVAAACAEcc3Rhc2hlcz0MAdhCb3VuZGVkVmVjPChUOjpBY2NvdW50SWQsIEJhbGFuY2VPZjxUPiksIFQ6OkJhdGNoU2l6ZT4AARxjaGVja2VkQQwBkEJvdW5kZWRWZWM8RXJhSW5kZXgsIE1heENoZWNraW5nPFQ+PgAAPQwMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAG9BARTAAAEALkEARhWZWM8VD4AAEEMDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBEARTAAAEAJEBARhWZWM8VD4AAEUMDExwYWxsZXRfZmFzdF91bnN0YWtlGHBhbGxldBRFcnJvcgQEVAABGDROb3RDb250cm9sbGVyAAAMuFRoZSBwcm92aWRlZCBDb250cm9sbGVyIGFjY291bnQgd2FzIG5vdCBmb3VuZC4AwFRoaXMgbWVhbnMgdGhhdCB0aGUgZ2l2ZW4gYWNjb3VudCBpcyBub3QgYm9uZGVkLjRBbHJlYWR5UXVldWVkAAEErFRoZSBib25kZWQgYWNjb3VudCBoYXMgYWxyZWFkeSBiZWVuIHF1ZXVlZC44Tm90RnVsbHlCb25kZWQAAgS8VGhlIGJvbmRlZCBhY2NvdW50IGhhcyBhY3RpdmUgdW5sb2NraW5nIGNodW5rcy4kTm90UXVldWVkAAMEtFRoZSBwcm92aWRlZCB1bi1zdGFrZXIgaXMgbm90IGluIHRoZSBgUXVldWVgLixBbHJlYWR5SGVhZAAEBAUBVGhlIHByb3ZpZGVkIHVuLXN0YWtlciBpcyBhbHJlYWR5IGluIEhlYWQsIGFuZCBjYW5ub3QgZGVyZWdpc3Rlci44Q2FsbE5vdEFsbG93ZWQABQQdAVRoZSBjYWxsIGlzIG5vdCBhbGxvd2VkIGF0IHRoaXMgcG9pbnQgYmVjYXVzZSB0aGUgcGFsbGV0IGlzIG5vdCBhY3RpdmUuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LkkMAAAECABBAQBNDAxgcGFsbGV0X2NvbnZpY3Rpb25fdm90aW5nEHZvdGUYVm90aW5nFBxCYWxhbmNlARgkQWNjb3VudElkAQAsQmxvY2tOdW1iZXIBECRQb2xsSW5kZXgBECBNYXhWb3RlcwABCBxDYXN0aW5nBABRDAHIQ2FzdGluZzxCYWxhbmNlLCBCbG9ja051bWJlciwgUG9sbEluZGV4LCBNYXhWb3Rlcz4AAAAoRGVsZWdhdGluZwQAaQwBrERlbGVnYXRpbmc8QmFsYW5jZSwgQWNjb3VudElkLCBCbG9ja051bWJlcj4AAQAAUQwMYHBhbGxldF9jb252aWN0aW9uX3ZvdGluZxB2b3RlHENhc3RpbmcQHEJhbGFuY2UBGCxCbG9ja051bWJlcgEQJFBvbGxJbmRleAEQIE1heFZvdGVzAAAMARR2b3Rlc1UMAdxCb3VuZGVkVmVjPChQb2xsSW5kZXgsIEFjY291bnRWb3RlPEJhbGFuY2U+KSwgTWF4Vm90ZXM+AAEsZGVsZWdhdGlvbnNhDAFQRGVsZWdhdGlvbnM8QmFsYW5jZT4AARRwcmlvcmUMAXxQcmlvckxvY2s8QmxvY2tOdW1iZXIsIEJhbGFuY2U+AABVDAxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAVkMBFMAAAQAXQwBGFZlYzxUPgAAWQwAAAQIEJkBAF0MAAACWQwAYQwMYHBhbGxldF9jb252aWN0aW9uX3ZvdGluZxR0eXBlcyxEZWxlZ2F0aW9ucwQcQmFsYW5jZQEYAAgBFHZvdGVzGAEcQmFsYW5jZQABHGNhcGl0YWwYARxCYWxhbmNlAABlDAxgcGFsbGV0X2NvbnZpY3Rpb25fdm90aW5nEHZvdGUkUHJpb3JMb2NrCCxCbG9ja051bWJlcgEQHEJhbGFuY2UBGAAIABABLEJsb2NrTnVtYmVyAAAYARxCYWxhbmNlAABpDAxgcGFsbGV0X2NvbnZpY3Rpb25fdm90aW5nEHZvdGUoRGVsZWdhdGluZwwcQmFsYW5jZQEYJEFjY291bnRJZAEALEJsb2NrTnVtYmVyARAAFAEcYmFsYW5jZRgBHEJhbGFuY2UAARh0YXJnZXQAASRBY2NvdW50SWQAAShjb252aWN0aW9u5QQBKENvbnZpY3Rpb24AASxkZWxlZ2F0aW9uc2EMAVBEZWxlZ2F0aW9uczxCYWxhbmNlPgABFHByaW9yZQwBfFByaW9yTG9jazxCbG9ja051bWJlciwgQmFsYW5jZT4AAG0MDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBcQwEUwAABAB1DAEYVmVjPFQ+AABxDAAABAhBARgAdQwAAAJxDAB5DAxgcGFsbGV0X2NvbnZpY3Rpb25fdm90aW5nGHBhbGxldBRFcnJvcggEVAAESQABMChOb3RPbmdvaW5nAAAEUFBvbGwgaXMgbm90IG9uZ29pbmcuIE5vdFZvdGVyAAEErFRoZSBnaXZlbiBhY2NvdW50IGRpZCBub3Qgdm90ZSBvbiB0aGUgcG9sbC4wTm9QZXJtaXNzaW9uAAIEyFRoZSBhY3RvciBoYXMgbm8gcGVybWlzc2lvbiB0byBjb25kdWN0IHRoZSBhY3Rpb24uPE5vUGVybWlzc2lvbllldAADBFkBVGhlIGFjdG9yIGhhcyBubyBwZXJtaXNzaW9uIHRvIGNvbmR1Y3QgdGhlIGFjdGlvbiByaWdodCBub3cgYnV0IHdpbGwgZG8gaW4gdGhlIGZ1dHVyZS5EQWxyZWFkeURlbGVnYXRpbmcABASIVGhlIGFjY291bnQgaXMgYWxyZWFkeSBkZWxlZ2F0aW5nLjRBbHJlYWR5Vm90aW5nAAUIVQFUaGUgYWNjb3VudCBjdXJyZW50bHkgaGFzIHZvdGVzIGF0dGFjaGVkIHRvIGl0IGFuZCB0aGUgb3BlcmF0aW9uIGNhbm5vdCBzdWNjZWVkIHVudGlsoHRoZXNlIGFyZSByZW1vdmVkIHRocm91Z2ggYHJlbW92ZV92b3RlYC5ESW5zdWZmaWNpZW50RnVuZHMABgT8VG9vIGhpZ2ggYSBiYWxhbmNlIHdhcyBwcm92aWRlZCB0aGF0IHRoZSBhY2NvdW50IGNhbm5vdCBhZmZvcmQuNE5vdERlbGVnYXRpbmcABwSgVGhlIGFjY291bnQgaXMgbm90IGN1cnJlbnRseSBkZWxlZ2F0aW5nLiBOb25zZW5zZQAIBJREZWxlZ2F0aW9uIHRvIG9uZXNlbGYgbWFrZXMgbm8gc2Vuc2UuPE1heFZvdGVzUmVhY2hlZAAJBIBNYXhpbXVtIG51bWJlciBvZiB2b3RlcyByZWFjaGVkLixDbGFzc05lZWRlZAAKBDkBVGhlIGNsYXNzIG11c3QgYmUgc3VwcGxpZWQgc2luY2UgaXQgaXMgbm90IGVhc2lseSBkZXRlcm1pbmFibGUgZnJvbSB0aGUgc3RhdGUuIEJhZENsYXNzAAsEhFRoZSBjbGFzcyBJRCBzdXBwbGllZCBpcyBpbnZhbGlkLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC59DAxAcGFsbGV0X3JlZmVyZW5kYRR0eXBlczhSZWZlcmVuZHVtSW5mbyAcVHJhY2tJZAFBATRSdW50aW1lT3JpZ2luAaECGE1vbWVudAEQEENhbGwBpQEcQmFsYW5jZQEYFFRhbGx5Aa0IJEFjY291bnRJZAEAPFNjaGVkdWxlQWRkcmVzcwElAQEYHE9uZ29pbmcEAIEMAY0BUmVmZXJlbmR1bVN0YXR1czxUcmFja0lkLCBSdW50aW1lT3JpZ2luLCBNb21lbnQsIENhbGwsIEJhbGFuY2UsIFRhbGx5LApBY2NvdW50SWQsIFNjaGVkdWxlQWRkcmVzcyw+AAAAIEFwcHJvdmVkDAAQARhNb21lbnQAAIkMAYxPcHRpb248RGVwb3NpdDxBY2NvdW50SWQsIEJhbGFuY2U+PgAAiQwBjE9wdGlvbjxEZXBvc2l0PEFjY291bnRJZCwgQmFsYW5jZT4+AAEAIFJlamVjdGVkDAAQARhNb21lbnQAAIkMAYxPcHRpb248RGVwb3NpdDxBY2NvdW50SWQsIEJhbGFuY2U+PgAAiQwBjE9wdGlvbjxEZXBvc2l0PEFjY291bnRJZCwgQmFsYW5jZT4+AAIAJENhbmNlbGxlZAwAEAEYTW9tZW50AACJDAGMT3B0aW9uPERlcG9zaXQ8QWNjb3VudElkLCBCYWxhbmNlPj4AAIkMAYxPcHRpb248RGVwb3NpdDxBY2NvdW50SWQsIEJhbGFuY2U+PgADACBUaW1lZE91dAwAEAEYTW9tZW50AACJDAGMT3B0aW9uPERlcG9zaXQ8QWNjb3VudElkLCBCYWxhbmNlPj4AAIkMAYxPcHRpb248RGVwb3NpdDxBY2NvdW50SWQsIEJhbGFuY2U+PgAEABhLaWxsZWQEABABGE1vbWVudAAFAACBDAxAcGFsbGV0X3JlZmVyZW5kYRR0eXBlc0BSZWZlcmVuZHVtU3RhdHVzIBxUcmFja0lkAUEBNFJ1bnRpbWVPcmlnaW4BoQIYTW9tZW50ARAQQ2FsbAGlARxCYWxhbmNlARgUVGFsbHkBrQgkQWNjb3VudElkAQA8U2NoZWR1bGVBZGRyZXNzASUBACwBFHRyYWNrQQEBHFRyYWNrSWQAARhvcmlnaW6hAgE0UnVudGltZU9yaWdpbgABIHByb3Bvc2FspQEBEENhbGwAASRlbmFjdG1lbnTxBAFQRGlzcGF0Y2hUaW1lPE1vbWVudD4AASRzdWJtaXR0ZWQQARhNb21lbnQAAUhzdWJtaXNzaW9uX2RlcG9zaXSFDAFsRGVwb3NpdDxBY2NvdW50SWQsIEJhbGFuY2U+AAFAZGVjaXNpb25fZGVwb3NpdIkMAYxPcHRpb248RGVwb3NpdDxBY2NvdW50SWQsIEJhbGFuY2U+PgABIGRlY2lkaW5njQwBeE9wdGlvbjxEZWNpZGluZ1N0YXR1czxNb21lbnQ+PgABFHRhbGx5rQgBFFRhbGx5AAEgaW5fcXVldWUgARBib29sAAEUYWxhcm2VDAGET3B0aW9uPChNb21lbnQsIFNjaGVkdWxlQWRkcmVzcyk+AACFDAxAcGFsbGV0X3JlZmVyZW5kYRR0eXBlcxxEZXBvc2l0CCRBY2NvdW50SWQBABxCYWxhbmNlARgACAEMd2hvAAEkQWNjb3VudElkAAEYYW1vdW50GAEcQmFsYW5jZQAAiQwEGE9wdGlvbgQEVAGFDAEIEE5vbmUAAAAQU29tZQQAhQwAAAEAAI0MBBhPcHRpb24EBFQBkQwBCBBOb25lAAAAEFNvbWUEAJEMAAABAACRDAxAcGFsbGV0X3JlZmVyZW5kYRR0eXBlczhEZWNpZGluZ1N0YXR1cwQsQmxvY2tOdW1iZXIBEAAIARRzaW5jZRABLEJsb2NrTnVtYmVyAAEoY29uZmlybWluZ5wBTE9wdGlvbjxCbG9ja051bWJlcj4AAJUMBBhPcHRpb24EBFQBmQwBCBBOb25lAAAAEFNvbWUEAJkMAAABAACZDAAABAgQJQEAnQwMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAH9CwRTAAAEAPkLARhWZWM8VD4AAKEMAAACpQwApQwAAAQIQQGpDACpDAxAcGFsbGV0X3JlZmVyZW5kYRR0eXBlczBUcmFja0RldGFpbHMMHEJhbGFuY2UBGBhNb21lbnQBEBBOYW1lAU0JACQBEG5hbWVNCQEQTmFtZQABMG1heF9kZWNpZGluZxABDHUzMgABQGRlY2lzaW9uX2RlcG9zaXQYARxCYWxhbmNlAAE4cHJlcGFyZV9wZXJpb2QQARhNb21lbnQAATxkZWNpc2lvbl9wZXJpb2QQARhNb21lbnQAAThjb25maXJtX3BlcmlvZBABGE1vbWVudAABUG1pbl9lbmFjdG1lbnRfcGVyaW9kEAEYTW9tZW50AAEwbWluX2FwcHJvdmFsrQwBFEN1cnZlAAEsbWluX3N1cHBvcnStDAEUQ3VydmUAAK0MDEBwYWxsZXRfcmVmZXJlbmRhFHR5cGVzFEN1cnZlAAEMQExpbmVhckRlY3JlYXNpbmcMARhsZW5ndGiYARxQZXJiaWxsAAEUZmxvb3KYARxQZXJiaWxsAAEQY2VpbJgBHFBlcmJpbGwAAABEU3RlcHBlZERlY3JlYXNpbmcQARRiZWdpbpgBHFBlcmJpbGwAAQxlbmSYARxQZXJiaWxsAAEQc3RlcJgBHFBlcmJpbGwAARhwZXJpb2SYARxQZXJiaWxsAAEAKFJlY2lwcm9jYWwMARhmYWN0b3KxDAEgRml4ZWRJNjQAASB4X29mZnNldLEMASBGaXhlZEk2NAABIHlfb2Zmc2V0sQwBIEZpeGVkSTY0AAIAALEMDDRzcF9hcml0aG1ldGljLGZpeGVkX3BvaW50IEZpeGVkSTY0AAAEALUMAQxpNjQAALUMAAAFDAC5DAxAcGFsbGV0X3JlZmVyZW5kYRhwYWxsZXQURXJyb3IIBFQABEkAATgoTm90T25nb2luZwAABGhSZWZlcmVuZHVtIGlzIG5vdCBvbmdvaW5nLihIYXNEZXBvc2l0AAEEuFJlZmVyZW5kdW0ncyBkZWNpc2lvbiBkZXBvc2l0IGlzIGFscmVhZHkgcGFpZC4gQmFkVHJhY2sAAgScVGhlIHRyYWNrIGlkZW50aWZpZXIgZ2l2ZW4gd2FzIGludmFsaWQuEEZ1bGwAAwQxAVRoZXJlIGFyZSBhbHJlYWR5IGEgZnVsbCBjb21wbGVtZW50IG9mIHJlZmVyZW5kYSBpbiBwcm9ncmVzcyBmb3IgdGhpcyB0cmFjay4oUXVldWVFbXB0eQAEBIBUaGUgcXVldWUgb2YgdGhlIHRyYWNrIGlzIGVtcHR5LjRCYWRSZWZlcmVuZHVtAAUE5FRoZSByZWZlcmVuZHVtIGluZGV4IHByb3ZpZGVkIGlzIGludmFsaWQgaW4gdGhpcyBjb250ZXh0LixOb3RoaW5nVG9EbwAGBKxUaGVyZSB3YXMgbm90aGluZyB0byBkbyBpbiB0aGUgYWR2YW5jZW1lbnQuHE5vVHJhY2sABwSgTm8gdHJhY2sgZXhpc3RzIGZvciB0aGUgcHJvcG9zYWwgb3JpZ2luLihVbmZpbmlzaGVkAAgEAQFBbnkgZGVwb3NpdCBjYW5ub3QgYmUgcmVmdW5kZWQgdW50aWwgYWZ0ZXIgdGhlIGRlY2lzaW9uIGlzIG92ZXIuME5vUGVybWlzc2lvbgAJBKhUaGUgZGVwb3NpdCByZWZ1bmRlciBpcyBub3QgdGhlIGRlcG9zaXRvci4kTm9EZXBvc2l0AAoEzFRoZSBkZXBvc2l0IGNhbm5vdCBiZSByZWZ1bmRlZCBzaW5jZSBub25lIHdhcyBtYWRlLiRCYWRTdGF0dXMACwTQVGhlIHJlZmVyZW5kdW0gc3RhdHVzIGlzIGludmFsaWQgZm9yIHRoaXMgb3BlcmF0aW9uLkBQcmVpbWFnZU5vdEV4aXN0AAwEcFRoZSBwcmVpbWFnZSBkb2VzIG5vdCBleGlzdC6EUHJlaW1hZ2VTdG9yZWRXaXRoRGlmZmVyZW50TGVuZ3RoAA0EFQFUaGUgcHJlaW1hZ2UgaXMgc3RvcmVkIHdpdGggYSBkaWZmZXJlbnQgbGVuZ3RoIHRoYW4gdGhlIG9uZSBwcm92aWRlZC4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQuvQwMQHBhbGxldF93aGl0ZWxpc3QYcGFsbGV0FEVycm9yBARUAAEUTFVuYXZhaWxhYmxlUHJlSW1hZ2UAAATIVGhlIHByZWltYWdlIG9mIHRoZSBjYWxsIGhhc2ggY291bGQgbm90IGJlIGxvYWRlZC48VW5kZWNvZGFibGVDYWxsAAEEeFRoZSBjYWxsIGNvdWxkIG5vdCBiZSBkZWNvZGVkLmBJbnZhbGlkQ2FsbFdlaWdodFdpdG5lc3MAAgTsVGhlIHdlaWdodCBvZiB0aGUgZGVjb2RlZCBjYWxsIHdhcyBoaWdoZXIgdGhhbiB0aGUgd2l0bmVzcy5QQ2FsbElzTm90V2hpdGVsaXN0ZWQAAwR0VGhlIGNhbGwgd2FzIG5vdCB3aGl0ZWxpc3RlZC5YQ2FsbEFscmVhZHlXaGl0ZWxpc3RlZAAEBKBUaGUgY2FsbCB3YXMgYWxyZWFkeSB3aGl0ZWxpc3RlZDsgTm8tT3AuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LsEMCDxwYWxsZXRfdHJlYXN1cnkgUHJvcG9zYWwIJEFjY291bnRJZAEAHEJhbGFuY2UBGAAQASBwcm9wb3NlcgABJEFjY291bnRJZAABFHZhbHVlGAEcQmFsYW5jZQABLGJlbmVmaWNpYXJ5AAEkQWNjb3VudElkAAEQYm9uZBgBHEJhbGFuY2UAAMUMDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBEARTAAAEAJEBARhWZWM8VD4AAMkMCDxwYWxsZXRfdHJlYXN1cnksU3BlbmRTdGF0dXMUJEFzc2V0S2luZAEBBTBBc3NldEJhbGFuY2UBGCxCZW5lZmljaWFyeQFZBSxCbG9ja051bWJlcgEQJFBheW1lbnRJZAEwABgBKGFzc2V0X2tpbmQBBQEkQXNzZXRLaW5kAAEYYW1vdW50GAEwQXNzZXRCYWxhbmNlAAEsYmVuZWZpY2lhcnlZBQEsQmVuZWZpY2lhcnkAASh2YWxpZF9mcm9tEAEsQmxvY2tOdW1iZXIAASRleHBpcmVfYXQQASxCbG9ja051bWJlcgABGHN0YXR1c80MAVxQYXltZW50U3RhdGU8UGF5bWVudElkPgAAzQwIPHBhbGxldF90cmVhc3VyeTBQYXltZW50U3RhdGUECElkATABDBxQZW5kaW5nAAAAJEF0dGVtcHRlZAQBCGlkMAEISWQAAQAYRmFpbGVkAAIAANEMDDRzcF9hcml0aG1ldGljKHBlcl90aGluZ3McUGVybWlsbAAABAAQAQx1MzIAANUMDDxwYWxsZXRfdHJlYXN1cnkYcGFsbGV0FEVycm9yCARUAARJAAEsMEludmFsaWRJbmRleAAABKxObyBwcm9wb3NhbCwgYm91bnR5IG9yIHNwZW5kIGF0IHRoYXQgaW5kZXguQFRvb01hbnlBcHByb3ZhbHMAAQSAVG9vIG1hbnkgYXBwcm92YWxzIGluIHRoZSBxdWV1ZS5YSW5zdWZmaWNpZW50UGVybWlzc2lvbgACCEUBVGhlIHNwZW5kIG9yaWdpbiBpcyB2YWxpZCBidXQgdGhlIGFtb3VudCBpdCBpcyBhbGxvd2VkIHRvIHNwZW5kIGlzIGxvd2VyIHRoYW4gdGhlTGFtb3VudCB0byBiZSBzcGVudC5MUHJvcG9zYWxOb3RBcHByb3ZlZAADBHxQcm9wb3NhbCBoYXMgbm90IGJlZW4gYXBwcm92ZWQuWEZhaWxlZFRvQ29udmVydEJhbGFuY2UABARRAVRoZSBiYWxhbmNlIG9mIHRoZSBhc3NldCBraW5kIGlzIG5vdCBjb252ZXJ0aWJsZSB0byB0aGUgYmFsYW5jZSBvZiB0aGUgbmF0aXZlIGFzc2V0LjBTcGVuZEV4cGlyZWQABQSwVGhlIHNwZW5kIGhhcyBleHBpcmVkIGFuZCBjYW5ub3QgYmUgY2xhaW1lZC4sRWFybHlQYXlvdXQABgSkVGhlIHNwZW5kIGlzIG5vdCB5ZXQgZWxpZ2libGUgZm9yIHBheW91dC5AQWxyZWFkeUF0dGVtcHRlZAAHBJxUaGUgcGF5bWVudCBoYXMgYWxyZWFkeSBiZWVuIGF0dGVtcHRlZC4sUGF5b3V0RXJyb3IACATMVGhlcmUgd2FzIHNvbWUgaXNzdWUgd2l0aCB0aGUgbWVjaGFuaXNtIG9mIHBheW1lbnQuME5vdEF0dGVtcHRlZAAJBKRUaGUgcGF5b3V0IHdhcyBub3QgeWV0IGF0dGVtcHRlZC9jbGFpbWVkLjBJbmNvbmNsdXNpdmUACgTEVGhlIHBheW1lbnQgaGFzIG5laXRoZXIgZmFpbGVkIG5vciBzdWNjZWVkZWQgeWV0LgR4RXJyb3IgZm9yIHRoZSB0cmVhc3VyeSBwYWxsZXQu2QwMYHBhbGxldF9kZWxlZ2F0ZWRfc3Rha2luZxR0eXBlcyhEZWxlZ2F0aW9uBARUAAAIARRhZ2VudAABMFQ6OkFjY291bnRJZAABGGFtb3VudBgBMEJhbGFuY2VPZjxUPgAA3QwMYHBhbGxldF9kZWxlZ2F0ZWRfc3Rha2luZxR0eXBlcyxBZ2VudExlZGdlcgQEVAAAEAEUcGF5ZWUAATBUOjpBY2NvdW50SWQAATx0b3RhbF9kZWxlZ2F0ZWT9AQEwQmFsYW5jZU9mPFQ+AAFUdW5jbGFpbWVkX3dpdGhkcmF3YWxz/QEBMEJhbGFuY2VPZjxUPgABNHBlbmRpbmdfc2xhc2j9AQEwQmFsYW5jZU9mPFQ+AADhDAxgcGFsbGV0X2RlbGVnYXRlZF9zdGFraW5nGHBhbGxldBRFcnJvcgQEVAABMChOb3RBbGxvd2VkAAAEqFRoZSBhY2NvdW50IGNhbm5vdCBwZXJmb3JtIHRoaXMgb3BlcmF0aW9uLjhBbHJlYWR5U3Rha2luZwABBLhBbiBleGlzdGluZyBzdGFrZXIgY2Fubm90IHBlcmZvcm0gdGhpcyBhY3Rpb24uYEludmFsaWRSZXdhcmREZXN0aW5hdGlvbgACBNRSZXdhcmQgRGVzdGluYXRpb24gY2Fubm90IGJlIHNhbWUgYXMgYEFnZW50YCBhY2NvdW50LkRJbnZhbGlkRGVsZWdhdGlvbgADFIhEZWxlZ2F0aW9uIGNvbmRpdGlvbnMgYXJlIG5vdCBtZXQuAExQb3NzaWJsZSBpc3N1ZXMgYXJlbDEpIENhbm5vdCBkZWxlZ2F0ZSB0byBzZWxmLKQyKSBDYW5ub3QgZGVsZWdhdGUgdG8gbXVsdGlwbGUgZGVsZWdhdGVzLjhOb3RFbm91Z2hGdW5kcwAEBAEBVGhlIGFjY291bnQgZG9lcyBub3QgaGF2ZSBlbm91Z2ggZnVuZHMgdG8gcGVyZm9ybSB0aGUgb3BlcmF0aW9uLiBOb3RBZ2VudAAFBIBOb3QgYW4gZXhpc3RpbmcgYEFnZW50YCBhY2NvdW50LjBOb3REZWxlZ2F0b3IABgRgTm90IGEgRGVsZWdhdG9yIGFjY291bnQuIEJhZFN0YXRlAAcEiFNvbWUgY29ycnVwdGlvbiBpbiBpbnRlcm5hbCBzdGF0ZS44VW5hcHBsaWVkU2xhc2gACATcVW5hcHBsaWVkIHBlbmRpbmcgc2xhc2ggcmVzdHJpY3RzIG9wZXJhdGlvbiBvbiBgQWdlbnRgLjhOb3RoaW5nVG9TbGFzaAAJBKxgQWdlbnRgIGhhcyBubyBwZW5kaW5nIHNsYXNoIHRvIGJlIGFwcGxpZWQuOFdpdGhkcmF3RmFpbGVkAAoEsEZhaWxlZCB0byB3aXRoZHJhdyBhbW91bnQgZnJvbSBDb3JlIFN0YWtpbmcuME5vdFN1cHBvcnRlZAALBJxPcGVyYXRpb24gbm90IHN1cHBvcnRlZCBieSB0aGlzIHBhbGxldC4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQu5QwMbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWluczRjb25maWd1cmF0aW9uREhvc3RDb25maWd1cmF0aW9uBCxCbG9ja051bWJlcgEQAIwBNG1heF9jb2RlX3NpemUQAQx1MzIAAUhtYXhfaGVhZF9kYXRhX3NpemUQAQx1MzIAAVhtYXhfdXB3YXJkX3F1ZXVlX2NvdW50EAEMdTMyAAFUbWF4X3Vwd2FyZF9xdWV1ZV9zaXplEAEMdTMyAAFcbWF4X3Vwd2FyZF9tZXNzYWdlX3NpemUQAQx1MzIAAZBtYXhfdXB3YXJkX21lc3NhZ2VfbnVtX3Blcl9jYW5kaWRhdGUQAQx1MzIAAYhocm1wX21heF9tZXNzYWdlX251bV9wZXJfY2FuZGlkYXRlEAEMdTMyAAFsdmFsaWRhdGlvbl91cGdyYWRlX2Nvb2xkb3duEAEsQmxvY2tOdW1iZXIAAWB2YWxpZGF0aW9uX3VwZ3JhZGVfZGVsYXkQASxCbG9ja051bWJlcgABUGFzeW5jX2JhY2tpbmdfcGFyYW1zYQUBSEFzeW5jQmFja2luZ1BhcmFtcwABMG1heF9wb3Zfc2l6ZRABDHUzMgABZG1heF9kb3dud2FyZF9tZXNzYWdlX3NpemUQAQx1MzIAAZBocm1wX21heF9wYXJhY2hhaW5fb3V0Ym91bmRfY2hhbm5lbHMQAQx1MzIAAUxocm1wX3NlbmRlcl9kZXBvc2l0GAEcQmFsYW5jZQABWGhybXBfcmVjaXBpZW50X2RlcG9zaXQYARxCYWxhbmNlAAFkaHJtcF9jaGFubmVsX21heF9jYXBhY2l0eRABDHUzMgABbGhybXBfY2hhbm5lbF9tYXhfdG90YWxfc2l6ZRABDHUzMgABjGhybXBfbWF4X3BhcmFjaGFpbl9pbmJvdW5kX2NoYW5uZWxzEAEMdTMyAAF0aHJtcF9jaGFubmVsX21heF9tZXNzYWdlX3NpemUQAQx1MzIAATxleGVjdXRvcl9wYXJhbXNlBQE4RXhlY3V0b3JQYXJhbXMAAVRjb2RlX3JldGVudGlvbl9wZXJpb2QQASxCbG9ja051bWJlcgABOG1heF92YWxpZGF0b3JznAEsT3B0aW9uPHUzMj4AAThkaXNwdXRlX3BlcmlvZBABMFNlc3Npb25JbmRleAABpGRpc3B1dGVfcG9zdF9jb25jbHVzaW9uX2FjY2VwdGFuY2VfcGVyaW9kEAEsQmxvY2tOdW1iZXIAATRub19zaG93X3Nsb3RzEAEMdTMyAAFAbl9kZWxheV90cmFuY2hlcxABDHUzMgABaHplcm90aF9kZWxheV90cmFuY2hlX3dpZHRoEAEMdTMyAAFAbmVlZGVkX2FwcHJvdmFscxABDHUzMgABYHJlbGF5X3ZyZl9tb2R1bG9fc2FtcGxlcxABDHUzMgABOHB2Zl92b3RpbmdfdHRsEAEwU2Vzc2lvbkluZGV4AAGAbWluaW11bV92YWxpZGF0aW9uX3VwZ3JhZGVfZGVsYXkQASxCbG9ja051bWJlcgABVG1pbmltdW1fYmFja2luZ192b3RlcxABDHUzMgABNG5vZGVfZmVhdHVyZXOdBQEwTm9kZUZlYXR1cmVzAAFYYXBwcm92YWxfdm90aW5nX3BhcmFtc3kFAVBBcHByb3ZhbFZvdGluZ1BhcmFtcwABQHNjaGVkdWxlcl9wYXJhbXN9BQFwU2NoZWR1bGVyUGFyYW1zPEJsb2NrTnVtYmVyPgAA6QwAAALtDADtDAAABAgQ5QwA8QwQbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWluczRjb25maWd1cmF0aW9uGHBhbGxldBRFcnJvcgQEVAABBDxJbnZhbGlkTmV3VmFsdWUAAATcVGhlIG5ldyB2YWx1ZSBmb3IgYSBjb25maWd1cmF0aW9uIHBhcmFtZXRlciBpcyBpbnZhbGlkLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC71DAAAAqUFAPkMAAACWQIA/QwMbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucxhzaGFyZWRoQWxsb3dlZFJlbGF5UGFyZW50c1RyYWNrZXIIEEhhc2gBNCxCbG9ja051bWJlcgEQAAgBGGJ1ZmZlcgENAXxWZWNEZXF1ZTxSZWxheVBhcmVudEluZm88SGFzaD4+AAE0bGF0ZXN0X251bWJlchABLEJsb2NrTnVtYmVyAAABDQAAAgUNAAUNDGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMYc2hhcmVkPFJlbGF5UGFyZW50SW5mbwQQSGFzaAE0AAwBMHJlbGF5X3BhcmVudDQBEEhhc2gAAShzdGF0ZV9yb290NAEQSGFzaAABLGNsYWltX3F1ZXVlCQ0BvEJUcmVlTWFwPElkLCBCVHJlZU1hcDx1OCwgQlRyZWVTZXQ8Q29yZUluZGV4Pj4+AAAJDQQgQlRyZWVNYXAIBEsBsQIEVgENDQAEACENAAAADQ0EIEJUcmVlTWFwCARLAQgEVgERDQAEABkNAAAAEQ0EIEJUcmVlU2V0BARUAdEIAAQAFQ0AAAAVDQAAAtEIABkNAAACHQ0AHQ0AAAQICBENACENAAACJQ0AJQ0AAAQIsQINDQApDQAAAi0NAC0NDGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMkaW5jbHVzaW9ucENhbmRpZGF0ZVBlbmRpbmdBdmFpbGFiaWxpdHkIBEgBNAROARAAJAEQY29yZdEIASRDb3JlSW5kZXgAARBoYXNo9QUBNENhbmRpZGF0ZUhhc2gAAShkZXNjcmlwdG9yuQUBWENhbmRpZGF0ZURlc2NyaXB0b3I8SD4AASxjb21taXRtZW50c8UFAVBDYW5kaWRhdGVDb21taXRtZW50cwABSGF2YWlsYWJpbGl0eV92b3Rlc50FAWBCaXRWZWM8dTgsIEJpdE9yZGVyTHNiMD4AARxiYWNrZXJznQUBYEJpdFZlYzx1OCwgQml0T3JkZXJMc2IwPgABTHJlbGF5X3BhcmVudF9udW1iZXIQAQROAAFAYmFja2VkX2luX251bWJlchABBE4AATRiYWNraW5nX2dyb3Vw1QgBKEdyb3VwSW5kZXgAADENEGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMkaW5jbHVzaW9uGHBhbGxldBRFcnJvcgQEVAABRGRWYWxpZGF0b3JJbmRleE91dE9mQm91bmRzAAAEeFZhbGlkYXRvciBpbmRleCBvdXQgb2YgYm91bmRzLlBVbnNjaGVkdWxlZENhbmRpZGF0ZQABBKxDYW5kaWRhdGUgc3VibWl0dGVkIGJ1dCBwYXJhIG5vdCBzY2hlZHVsZWQuQEhlYWREYXRhVG9vTGFyZ2UAAgSkSGVhZCBkYXRhIGV4Y2VlZHMgdGhlIGNvbmZpZ3VyZWQgbWF4aW11bS5QUHJlbWF0dXJlQ29kZVVwZ3JhZGUAAwRkQ29kZSB1cGdyYWRlIHByZW1hdHVyZWx5LjxOZXdDb2RlVG9vTGFyZ2UABARgT3V0cHV0IGNvZGUgaXMgdG9vIGxhcmdlVERpc2FsbG93ZWRSZWxheVBhcmVudAAFCOxUaGUgY2FuZGlkYXRlJ3MgcmVsYXktcGFyZW50IHdhcyBub3QgYWxsb3dlZC4gRWl0aGVyIGl0IHdhcyUBbm90IHJlY2VudCBlbm91Z2ggb3IgaXQgZGlkbid0IGFkdmFuY2UgYmFzZWQgb24gdGhlIGxhc3QgcGFyYWNoYWluIGJsb2NrLkRJbnZhbGlkQXNzaWdubWVudAAGCBUBRmFpbGVkIHRvIGNvbXB1dGUgZ3JvdXAgaW5kZXggZm9yIHRoZSBjb3JlOiBlaXRoZXIgaXQncyBvdXQgb2YgYm91bmRz6G9yIHRoZSByZWxheSBwYXJlbnQgZG9lc24ndCBiZWxvbmcgdG8gdGhlIGN1cnJlbnQgc2Vzc2lvbi5ESW52YWxpZEdyb3VwSW5kZXgABwScSW52YWxpZCBncm91cCBpbmRleCBpbiBjb3JlIGFzc2lnbm1lbnQuTEluc3VmZmljaWVudEJhY2tpbmcACASQSW5zdWZmaWNpZW50IChub24tbWFqb3JpdHkpIGJhY2tpbmcuOEludmFsaWRCYWNraW5nAAkE5EludmFsaWQgKGJhZCBzaWduYXR1cmUsIHVua25vd24gdmFsaWRhdG9yLCBldGMuKSBiYWNraW5nLmhWYWxpZGF0aW9uRGF0YUhhc2hNaXNtYXRjaAAKBMRUaGUgdmFsaWRhdGlvbiBkYXRhIGhhc2ggZG9lcyBub3QgbWF0Y2ggZXhwZWN0ZWQugEluY29ycmVjdERvd253YXJkTWVzc2FnZUhhbmRsaW5nAAsE2FRoZSBkb3dud2FyZCBtZXNzYWdlIHF1ZXVlIGlzIG5vdCBwcm9jZXNzZWQgY29ycmVjdGx5LlRJbnZhbGlkVXB3YXJkTWVzc2FnZXMADAQdAUF0IGxlYXN0IG9uZSB1cHdhcmQgbWVzc2FnZSBzZW50IGRvZXMgbm90IHBhc3MgdGhlIGFjY2VwdGFuY2UgY3JpdGVyaWEuYEhybXBXYXRlcm1hcmtNaXNoYW5kbGluZwANBBEBVGhlIGNhbmRpZGF0ZSBkaWRuJ3QgZm9sbG93IHRoZSBydWxlcyBvZiBIUk1QIHdhdGVybWFyayBhZHZhbmNlbWVudC5MSW52YWxpZE91dGJvdW5kSHJtcAAOBNRUaGUgSFJNUCBtZXNzYWdlcyBzZW50IGJ5IHRoZSBjYW5kaWRhdGUgaXMgbm90IHZhbGlkLmRJbnZhbGlkVmFsaWRhdGlvbkNvZGVIYXNoAA8E3FRoZSB2YWxpZGF0aW9uIGNvZGUgaGFzaCBvZiB0aGUgY2FuZGlkYXRlIGlzIG5vdCB2YWxpZC5AUGFyYUhlYWRNaXNtYXRjaAAQCFUBVGhlIGBwYXJhX2hlYWRgIGhhc2ggaW4gdGhlIGNhbmRpZGF0ZSBkZXNjcmlwdG9yIGRvZXNuJ3QgbWF0Y2ggdGhlIGhhc2ggb2YgdGhlIGFjdHVhbHRwYXJhIGhlYWQgaW4gdGhlIGNvbW1pdG1lbnRzLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC41DQxMcG9sa2Fkb3RfcHJpbWl0aXZlcyB2c3RhZ2luZ0xTY3JhcGVkT25DaGFpblZvdGVzBARIATQADAEcc2Vzc2lvbhABMFNlc3Npb25JbmRleAABgGJhY2tpbmdfdmFsaWRhdG9yc19wZXJfY2FuZGlkYXRlOQ0BJQFWZWM8CihDYW5kaWRhdGVSZWNlaXB0VjI8SD4sIFZlYzwoVmFsaWRhdG9ySW5kZXgsIFZhbGlkaXR5QXR0ZXN0YXRpb24pPik+AAEgZGlzcHV0ZXPtBQFgTXVsdGlEaXNwdXRlU3RhdGVtZW50U2V0AAA5DQAAAj0NAD0NAAAECM0IQQ0AQQ0AAAJFDQBFDQAABAilBekFAEkNEGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnM4cGFyYXNfaW5oZXJlbnQYcGFsbGV0FEVycm9yBARUAAEQZFRvb01hbnlJbmNsdXNpb25JbmhlcmVudHMAAATMSW5jbHVzaW9uIGluaGVyZW50IGNhbGxlZCBtb3JlIHRoYW4gb25jZSBwZXIgYmxvY2suTEludmFsaWRQYXJlbnRIZWFkZXIAAQhVAVRoZSBoYXNoIG9mIHRoZSBzdWJtaXR0ZWQgcGFyZW50IGhlYWRlciBkb2Vzbid0IGNvcnJlc3BvbmQgdG8gdGhlIHNhdmVkIGJsb2NrIGhhc2ggb2YsdGhlIHBhcmVudC6MSW5oZXJlbnREYXRhRmlsdGVyZWREdXJpbmdFeGVjdXRpb24AAggxAUluaGVyZW50IGRhdGEgd2FzIGZpbHRlcmVkIGR1cmluZyBleGVjdXRpb24uIFRoaXMgc2hvdWxkIGhhdmUgb25seSBiZWVuIGRvbmVAZHVyaW5nIGNyZWF0aW9uLlBVbnNjaGVkdWxlZENhbmRpZGF0ZQADBHRUb28gbWFueSBjYW5kaWRhdGVzIHN1cHBsaWVkLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC5NDQAAAvUMAFENBCBCVHJlZU1hcAgESwHRCARWAVUNAAQAXQ0AAABVDQAAAlkNAFkNEGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMkc2NoZWR1bGVyGGNvbW1vbihBc3NpZ25tZW50AAEIEFBvb2wIARxwYXJhX2lksQIBGFBhcmFJZAABKGNvcmVfaW5kZXjRCAEkQ29yZUluZGV4AAAAEEJ1bGsEALECARhQYXJhSWQAAQAAXQ0AAAJhDQBhDQAABAjRCFUNAGUNDGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMUcGFyYXNcUHZmQ2hlY2tBY3RpdmVWb3RlU3RhdGUELEJsb2NrTnVtYmVyARAAFAEwdm90ZXNfYWNjZXB0nQUBYEJpdFZlYzx1OCwgQml0T3JkZXJMc2IwPgABMHZvdGVzX3JlamVjdJ0FAWBCaXRWZWM8dTgsIEJpdE9yZGVyTHNiMD4AAQxhZ2UQATBTZXNzaW9uSW5kZXgAAShjcmVhdGVkX2F0EAEsQmxvY2tOdW1iZXIAARhjYXVzZXNpDQF8VmVjPFB2ZkNoZWNrQ2F1c2U8QmxvY2tOdW1iZXI+PgAAaQ0AAAJtDQBtDQxscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zFHBhcmFzNFB2ZkNoZWNrQ2F1c2UELEJsb2NrTnVtYmVyARABCChPbmJvYXJkaW5nBACxAgEYUGFyYUlkAAAAHFVwZ3JhZGUMAQhpZLECARhQYXJhSWQAASxpbmNsdWRlZF9hdBABLEJsb2NrTnVtYmVyAAFAdXBncmFkZV9zdHJhdGVneXENATxVcGdyYWRlU3RyYXRlZ3kAAQAAcQ0MbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucxRwYXJhczxVcGdyYWRlU3RyYXRlZ3kAAQhAU2V0R29BaGVhZFNpZ25hbAAAAFBBcHBseUF0RXhwZWN0ZWRCbG9jawABAAB1DQAAAsEFAHkNAAACsQIAfQ0MbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucxRwYXJhczRQYXJhTGlmZWN5Y2xlAAEcKE9uYm9hcmRpbmcAAAAoUGFyYXRocmVhZAABACRQYXJhY2hhaW4AAgBMVXBncmFkaW5nUGFyYXRocmVhZAADAFBEb3duZ3JhZGluZ1BhcmFjaGFpbgAEAFRPZmZib2FyZGluZ1BhcmF0aHJlYWQABQBQT2ZmYm9hcmRpbmdQYXJhY2hhaW4ABgAAgQ0AAAQIsQIQAIUNDGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMUcGFyYXNAUGFyYVBhc3RDb2RlTWV0YQQETgEQAAgBNHVwZ3JhZGVfdGltZXOJDQFgVmVjPFJlcGxhY2VtZW50VGltZXM8Tj4+AAEsbGFzdF9wcnVuZWScASRPcHRpb248Tj4AAIkNAAACjQ0AjQ0MbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucxRwYXJhc0BSZXBsYWNlbWVudFRpbWVzBAROARAACAEsZXhwZWN0ZWRfYXQQAQROAAEwYWN0aXZhdGVkX2F0EAEETgAAkQ0AAAKBDQCVDQxscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zFHBhcmFzbEF1dGhvcml6ZWRDb2RlSGFzaEFuZEV4cGlyeQQEVAEQAAgBJGNvZGVfaGFzaMEFAUhWYWxpZGF0aW9uQ29kZUhhc2gAASRleHBpcmVfYXQQAQRUAACZDQxMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2ODhVcGdyYWRlR29BaGVhZAABCBRBYm9ydAAAABxHb0FoZWFkAAEAAJ0NDExwb2xrYWRvdF9wcmltaXRpdmVzCHY4SFVwZ3JhZGVSZXN0cmljdGlvbgABBBxQcmVzZW50AAAAAKENEGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMUcGFyYXMYcGFsbGV0FEVycm9yBARUAAFANE5vdFJlZ2lzdGVyZWQAAASUUGFyYSBpcyBub3QgcmVnaXN0ZXJlZCBpbiBvdXIgc3lzdGVtLjRDYW5ub3RPbmJvYXJkAAEEFQFQYXJhIGNhbm5vdCBiZSBvbmJvYXJkZWQgYmVjYXVzZSBpdCBpcyBhbHJlYWR5IHRyYWNrZWQgYnkgb3VyIHN5c3RlbS44Q2Fubm90T2ZmYm9hcmQAAgScUGFyYSBjYW5ub3QgYmUgb2ZmYm9hcmRlZCBhdCB0aGlzIHRpbWUuNENhbm5vdFVwZ3JhZGUAAwTUUGFyYSBjYW5ub3QgYmUgdXBncmFkZWQgdG8gYSBsZWFzZSBob2xkaW5nIHBhcmFjaGFpbi48Q2Fubm90RG93bmdyYWRlAAQE0FBhcmEgY2Fubm90IGJlIGRvd25ncmFkZWQgdG8gYW4gb24tZGVtYW5kIHBhcmFjaGFpbi5YUHZmQ2hlY2tTdGF0ZW1lbnRTdGFsZQAFBLBUaGUgc3RhdGVtZW50IGZvciBQVkYgcHJlLWNoZWNraW5nIGlzIHN0YWxlLlxQdmZDaGVja1N0YXRlbWVudEZ1dHVyZQAGBOxUaGUgc3RhdGVtZW50IGZvciBQVkYgcHJlLWNoZWNraW5nIGlzIGZvciBhIGZ1dHVyZSBzZXNzaW9uLoRQdmZDaGVja1ZhbGlkYXRvckluZGV4T3V0T2ZCb3VuZHMABwSkQ2xhaW1lZCB2YWxpZGF0b3IgaW5kZXggaXMgb3V0IG9mIGJvdW5kcy5gUHZmQ2hlY2tJbnZhbGlkU2lnbmF0dXJlAAgEyFRoZSBzaWduYXR1cmUgZm9yIHRoZSBQVkYgcHJlLWNoZWNraW5nIGlzIGludmFsaWQuSFB2ZkNoZWNrRG91YmxlVm90ZQAJBLBUaGUgZ2l2ZW4gdmFsaWRhdG9yIGFscmVhZHkgaGFzIGNhc3QgYSB2b3RlLlhQdmZDaGVja1N1YmplY3RJbnZhbGlkAAoE9FRoZSBnaXZlbiBQVkYgZG9lcyBub3QgZXhpc3QgYXQgdGhlIG1vbWVudCBvZiBwcm9jZXNzIGEgdm90ZS5EQ2Fubm90VXBncmFkZUNvZGUACwTMUGFyYWNoYWluIGNhbm5vdCBjdXJyZW50bHkgc2NoZWR1bGUgYSBjb2RlIHVwZ3JhZGUuLEludmFsaWRDb2RlAAwEdEludmFsaWQgdmFsaWRhdGlvbiBjb2RlIHNpemUuRE5vdGhpbmdBdXRob3JpemVkAA0EWE5vIHVwZ3JhZGUgYXV0aG9yaXplZC4wVW5hdXRob3JpemVkAA4ElFRoZSBzdWJtaXR0ZWQgY29kZSBpcyBub3QgYXV0aG9yaXplZC5ISW52YWxpZEJsb2NrTnVtYmVyAA8EVEludmFsaWQgYmxvY2sgbnVtYmVyLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC6lDQAAAqkNAKkNDGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMsaW5pdGlhbGl6ZXJUQnVmZmVyZWRTZXNzaW9uQ2hhbmdlAAAMASh2YWxpZGF0b3Jz+QwBQFZlYzxWYWxpZGF0b3JJZD4AARhxdWV1ZWT5DAFAVmVjPFZhbGlkYXRvcklkPgABNHNlc3Npb25faW5kZXgQATBTZXNzaW9uSW5kZXgAAK0NAAACsQ0AsQ0IYHBvbGthZG90X2NvcmVfcHJpbWl0aXZlc1hJbmJvdW5kRG93bndhcmRNZXNzYWdlBCxCbG9ja051bWJlcgEQAAgBHHNlbnRfYXQQASxCbG9ja051bWJlcgABDG1zZzgBPERvd253YXJkTWVzc2FnZQAAtQ0MbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucxBocm1wWEhybXBPcGVuQ2hhbm5lbFJlcXVlc3QAABgBJGNvbmZpcm1lZCABEGJvb2wAARBfYWdlEAEwU2Vzc2lvbkluZGV4AAE4c2VuZGVyX2RlcG9zaXQYARxCYWxhbmNlAAFAbWF4X21lc3NhZ2Vfc2l6ZRABDHUzMgABMG1heF9jYXBhY2l0eRABDHUzMgABOG1heF90b3RhbF9zaXplEAEMdTMyAAC5DQAAAiEGAL0NDGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMQaHJtcCxIcm1wQ2hhbm5lbAAAIAEwbWF4X2NhcGFjaXR5EAEMdTMyAAE4bWF4X3RvdGFsX3NpemUQAQx1MzIAAUBtYXhfbWVzc2FnZV9zaXplEAEMdTMyAAEkbXNnX2NvdW50EAEMdTMyAAEodG90YWxfc2l6ZRABDHUzMgABIG1xY19oZWFk9QQBME9wdGlvbjxIYXNoPgABOHNlbmRlcl9kZXBvc2l0GAEcQmFsYW5jZQABRHJlY2lwaWVudF9kZXBvc2l0GAEcQmFsYW5jZQAAwQ0AAALFDQDFDQhgcG9sa2Fkb3RfY29yZV9wcmltaXRpdmVzSEluYm91bmRIcm1wTWVzc2FnZQQsQmxvY2tOdW1iZXIBEAAIARxzZW50X2F0EAEsQmxvY2tOdW1iZXIAARBkYXRhOAFMYWxsb2M6OnZlYzo6VmVjPHU4PgAAyQ0AAALNDQDNDQAABAgQeQ0A0Q0QbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucxBocm1wGHBhbGxldBRFcnJvcgQEVAABUFRPcGVuSHJtcENoYW5uZWxUb1NlbGYAAATEVGhlIHNlbmRlciB0cmllZCB0byBvcGVuIGEgY2hhbm5lbCB0byB0aGVtc2VsdmVzLnxPcGVuSHJtcENoYW5uZWxJbnZhbGlkUmVjaXBpZW50AAEEiFRoZSByZWNpcGllbnQgaXMgbm90IGEgdmFsaWQgcGFyYS5sT3BlbkhybXBDaGFubmVsWmVyb0NhcGFjaXR5AAIEfFRoZSByZXF1ZXN0ZWQgY2FwYWNpdHkgaXMgemVyby6MT3BlbkhybXBDaGFubmVsQ2FwYWNpdHlFeGNlZWRzTGltaXQAAwTAVGhlIHJlcXVlc3RlZCBjYXBhY2l0eSBleGNlZWRzIHRoZSBnbG9iYWwgbGltaXQueE9wZW5Icm1wQ2hhbm5lbFplcm9NZXNzYWdlU2l6ZQAEBKBUaGUgcmVxdWVzdGVkIG1heGltdW0gbWVzc2FnZSBzaXplIGlzIDAumE9wZW5Icm1wQ2hhbm5lbE1lc3NhZ2VTaXplRXhjZWVkc0xpbWl0AAUEKQFUaGUgb3BlbiByZXF1ZXN0IHJlcXVlc3RlZCB0aGUgbWVzc2FnZSBzaXplIHRoYXQgZXhjZWVkcyB0aGUgZ2xvYmFsIGxpbWl0LnBPcGVuSHJtcENoYW5uZWxBbHJlYWR5RXhpc3RzAAYEaFRoZSBjaGFubmVsIGFscmVhZHkgZXhpc3RzfE9wZW5Icm1wQ2hhbm5lbEFscmVhZHlSZXF1ZXN0ZWQABwTQVGhlcmUgaXMgYWxyZWFkeSBhIHJlcXVlc3QgdG8gb3BlbiB0aGUgc2FtZSBjaGFubmVsLnBPcGVuSHJtcENoYW5uZWxMaW1pdEV4Y2VlZGVkAAgEHQFUaGUgc2VuZGVyIGFscmVhZHkgaGFzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBhbGxvd2VkIG91dGJvdW5kIGNoYW5uZWxzLnBBY2NlcHRIcm1wQ2hhbm5lbERvZXNudEV4aXN0AAkE4FRoZSBjaGFubmVsIGZyb20gdGhlIHNlbmRlciB0byB0aGUgb3JpZ2luIGRvZXNuJ3QgZXhpc3QuhEFjY2VwdEhybXBDaGFubmVsQWxyZWFkeUNvbmZpcm1lZAAKBIRUaGUgY2hhbm5lbCBpcyBhbHJlYWR5IGNvbmZpcm1lZC54QWNjZXB0SHJtcENoYW5uZWxMaW1pdEV4Y2VlZGVkAAsEJQFUaGUgcmVjaXBpZW50IGFscmVhZHkgaGFzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBhbGxvd2VkIGluYm91bmQgY2hhbm5lbHMucENsb3NlSHJtcENoYW5uZWxVbmF1dGhvcml6ZWQADARVAVRoZSBvcmlnaW4gdHJpZXMgdG8gY2xvc2UgYSBjaGFubmVsIHdoZXJlIGl0IGlzIG5laXRoZXIgdGhlIHNlbmRlciBub3IgdGhlIHJlY2lwaWVudC5sQ2xvc2VIcm1wQ2hhbm5lbERvZXNudEV4aXN0AA0EnFRoZSBjaGFubmVsIHRvIGJlIGNsb3NlZCBkb2Vzbid0IGV4aXN0LnxDbG9zZUhybXBDaGFubmVsQWxyZWFkeVVuZGVyd2F5AA4EvFRoZSBjaGFubmVsIGNsb3NlIHJlcXVlc3QgaXMgYWxyZWFkeSByZXF1ZXN0ZWQuhENhbmNlbEhybXBPcGVuQ2hhbm5lbFVuYXV0aG9yaXplZAAPBF0BQ2FuY2VsaW5nIGlzIHJlcXVlc3RlZCBieSBuZWl0aGVyIHRoZSBzZW5kZXIgbm9yIHJlY2lwaWVudCBvZiB0aGUgb3BlbiBjaGFubmVsIHJlcXVlc3QuaE9wZW5Icm1wQ2hhbm5lbERvZXNudEV4aXN0ABAEfFRoZSBvcGVuIHJlcXVlc3QgZG9lc24ndCBleGlzdC58T3BlbkhybXBDaGFubmVsQWxyZWFkeUNvbmZpcm1lZAARBC0BQ2Fubm90IGNhbmNlbCBhbiBIUk1QIG9wZW4gY2hhbm5lbCByZXF1ZXN0IGJlY2F1c2UgaXQgaXMgYWxyZWFkeSBjb25maXJtZWQuMFdyb25nV2l0bmVzcwASBIxUaGUgcHJvdmlkZWQgd2l0bmVzcyBkYXRhIGlzIHdyb25nLnBDaGFubmVsQ3JlYXRpb25Ob3RBdXRob3JpemVkABME6FRoZSBjaGFubmVsIGJldHdlZW4gdGhlc2UgdHdvIGNoYWlucyBjYW5ub3QgYmUgYXV0aG9yaXplZC4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQu1Q0AAAJdAgDZDQxMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2OCxTZXNzaW9uSW5mbwAANAFgYWN0aXZlX3ZhbGlkYXRvcl9pbmRpY2Vz9QwBTFZlYzxWYWxpZGF0b3JJbmRleD4AASxyYW5kb21fc2VlZAQBIFt1ODsgMzJdAAE4ZGlzcHV0ZV9wZXJpb2QQATBTZXNzaW9uSW5kZXgAASh2YWxpZGF0b3Jz3Q0BnEluZGV4ZWRWZWM8VmFsaWRhdG9ySW5kZXgsIFZhbGlkYXRvcklkPgABOGRpc2NvdmVyeV9rZXlzwQoBZFZlYzxBdXRob3JpdHlEaXNjb3ZlcnlJZD4AATxhc3NpZ25tZW50X2tleXPVDQFEVmVjPEFzc2lnbm1lbnRJZD4AAUB2YWxpZGF0b3JfZ3JvdXBz4Q0BrEluZGV4ZWRWZWM8R3JvdXBJbmRleCwgVmVjPFZhbGlkYXRvckluZGV4Pj4AARxuX2NvcmVzEAEMdTMyAAFoemVyb3RoX2RlbGF5X3RyYW5jaGVfd2lkdGgQAQx1MzIAAWByZWxheV92cmZfbW9kdWxvX3NhbXBsZXMQAQx1MzIAAUBuX2RlbGF5X3RyYW5jaGVzEAEMdTMyAAE0bm9fc2hvd19zbG90cxABDHUzMgABQG5lZWRlZF9hcHByb3ZhbHMQAQx1MzIAAN0NDExwb2xrYWRvdF9wcmltaXRpdmVzCHY4KEluZGV4ZWRWZWMIBEsBpQUEVgFZAgAEAPkMARhWZWM8Vj4AAOENDExwb2xrYWRvdF9wcmltaXRpdmVzCHY4KEluZGV4ZWRWZWMIBEsB1QgEVgH1DAAEAE0NARhWZWM8Vj4AAOUNAAAECBD1BQDpDQxMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2ODBEaXNwdXRlU3RhdGUEBE4BEAAQATh2YWxpZGF0b3JzX2Zvcp0FAXxCaXRWZWM8dTgsIGJpdHZlYzo6b3JkZXI6OkxzYjA+AAFIdmFsaWRhdG9yc19hZ2FpbnN0nQUBfEJpdFZlYzx1OCwgYml0dmVjOjpvcmRlcjo6THNiMD4AARRzdGFydBABBE4AATBjb25jbHVkZWRfYXScASRPcHRpb248Tj4AAO0NBCBCVHJlZVNldAQEVAGlBQAEAPUMAAAA8Q0QbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucyBkaXNwdXRlcxhwYWxsZXQURXJyb3IEBFQAASR0RHVwbGljYXRlRGlzcHV0ZVN0YXRlbWVudFNldHMAAASoRHVwbGljYXRlIGRpc3B1dGUgc3RhdGVtZW50IHNldHMgcHJvdmlkZWQuXEFuY2llbnREaXNwdXRlU3RhdGVtZW50AAEEjEFuY2llbnQgZGlzcHV0ZSBzdGF0ZW1lbnQgcHJvdmlkZWQuZFZhbGlkYXRvckluZGV4T3V0T2ZCb3VuZHMAAgToVmFsaWRhdG9yIGluZGV4IG9uIHN0YXRlbWVudCBpcyBvdXQgb2YgYm91bmRzIGZvciBzZXNzaW9uLkBJbnZhbGlkU2lnbmF0dXJlAAMEfEludmFsaWQgc2lnbmF0dXJlIG9uIHN0YXRlbWVudC5IRHVwbGljYXRlU3RhdGVtZW50AAQEzFZhbGlkYXRvciB2b3RlIHN1Ym1pdHRlZCBtb3JlIHRoYW4gb25jZSB0byBkaXNwdXRlLkhTaW5nbGVTaWRlZERpc3B1dGUABQTEQSBkaXNwdXRlIHdoZXJlIHRoZXJlIGFyZSBvbmx5IHZvdGVzIG9uIG9uZSBzaWRlLjxNYWxpY2lvdXNCYWNrZXIABgScQSBkaXNwdXRlIHZvdGUgZnJvbSBhIG1hbGljaW91cyBiYWNrZXIuTE1pc3NpbmdCYWNraW5nVm90ZXMABwTgTm8gYmFja2luZyB2b3RlcyB3ZXJlIHByb3ZpZGVzIGFsb25nIGRpc3B1dGUgc3RhdGVtZW50cy5IVW5jb25maXJtZWREaXNwdXRlAAgEsFVuY29uZmlybWVkIGRpc3B1dGUgc3RhdGVtZW50IHNldHMgcHJvdmlkZWQuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LvUNDExwb2xrYWRvdF9wcmltaXRpdmVzIHZzdGFnaW5nOFBlbmRpbmdTbGFzaGVzAAAIARBrZXlz+Q0BlEJUcmVlTWFwPFZhbGlkYXRvckluZGV4LCBWYWxpZGF0b3JJZD4AARBraW5kNQYBSERpc3B1dGVPZmZlbmNlS2luZAAA+Q0EIEJUcmVlTWFwCARLAaUFBFYBWQIABAD9DQAAAP0NAAACAQ4AAQ4AAAQIpQVZAgAFDhRscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zIGRpc3B1dGVzIHNsYXNoaW5nGHBhbGxldBRFcnJvcgQEVAABGGBJbnZhbGlkS2V5T3duZXJzaGlwUHJvb2YAAASMVGhlIGtleSBvd25lcnNoaXAgcHJvb2YgaXMgaW52YWxpZC5MSW52YWxpZFNlc3Npb25JbmRleAABBKBUaGUgc2Vzc2lvbiBpbmRleCBpcyB0b28gb2xkIG9yIGludmFsaWQuUEludmFsaWRDYW5kaWRhdGVIYXNoAAIEeFRoZSBjYW5kaWRhdGUgaGFzaCBpcyBpbnZhbGlkLlRJbnZhbGlkVmFsaWRhdG9ySW5kZXgAAwgBAVRoZXJlIGlzIG5vIHBlbmRpbmcgc2xhc2ggZm9yIHRoZSBnaXZlbiB2YWxpZGF0b3IgaW5kZXggYW5kIHRpbWUUc2xvdC5gVmFsaWRhdG9ySW5kZXhJZE1pc21hdGNoAAQE0FRoZSB2YWxpZGF0b3IgaW5kZXggZG9lcyBub3QgbWF0Y2ggdGhlIHZhbGlkYXRvciBpZC5cRHVwbGljYXRlU2xhc2hpbmdSZXBvcnQABQQNAVRoZSBnaXZlbiBzbGFzaGluZyByZXBvcnQgaXMgdmFsaWQgYnV0IGFscmVhZHkgcHJldmlvdXNseSByZXBvcnRlZC4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQuCQ4QbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucyRvbl9kZW1hbmQUdHlwZXNEQ29yZUFmZmluaXR5Q291bnQAAAgBKGNvcmVfaW5kZXjRCAEkQ29yZUluZGV4AAEUY291bnQQAQx1MzIAAA0OEGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMkb25fZGVtYW5kFHR5cGVzPFF1ZXVlU3RhdHVzVHlwZQAAEAEcdHJhZmZpYy0IASRGaXhlZFUxMjgAAShuZXh0X2luZGV4EQ4BKFF1ZXVlSW5kZXgAAThzbWFsbGVzdF9pbmRleBEOAShRdWV1ZUluZGV4AAE0ZnJlZWRfaW5kaWNlcxUOAXRCaW5hcnlIZWFwPFJldmVyc2VRdWV1ZUluZGV4PgAAEQ4QbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucyRvbl9kZW1hbmQUdHlwZXMoUXVldWVJbmRleAAABAAQAQx1MzIAABUOBChCaW5hcnlIZWFwBARUARkOAAQAHQ4AAAAZDhBscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zJG9uX2RlbWFuZBR0eXBlc0RSZXZlcnNlUXVldWVJbmRleAAABAAQAQx1MzIAAB0OAAACGQ4AIQ4EKEJpbmFyeUhlYXAEBFQBJQ4ABAApDgAAACUOEGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMkb25fZGVtYW5kFHR5cGVzNEVucXVldWVkT3JkZXIAAAgBHHBhcmFfaWSxAgEYUGFyYUlkAAEMaWR4EQ4BKFF1ZXVlSW5kZXgAACkOAAACJQ4ALQ4MTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAEYBFMAAAQAMQ4BGFZlYzxUPgAAMQ4AAAIYADUOEGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMkb25fZGVtYW5kGHBhbGxldBRFcnJvcgQEVAABDCRRdWV1ZUZ1bGwAAATkVGhlIG9yZGVyIHF1ZXVlIGlzIGZ1bGwsIGBwbGFjZV9vcmRlcmAgd2lsbCBub3QgY29udGludWUucFNwb3RQcmljZUhpZ2hlclRoYW5NYXhBbW91bnQAAQhNAVRoZSBjdXJyZW50IHNwb3QgcHJpY2UgaXMgaGlnaGVyIHRoYW4gdGhlIG1heCBhbW91bnQgc3BlY2lmaWVkIGluIHRoZSBgcGxhY2Vfb3JkZXJgYGNhbGwsIG1ha2luZyBpdCBpbnZhbGlkLkxJbnN1ZmZpY2llbnRDcmVkaXRzAAIEHQFUaGUgYWNjb3VudCBkb2Vzbid0IGhhdmUgZW5vdWdoIGNyZWRpdHMgdG8gcHVyY2hhc2Ugb24tZGVtYW5kIGNvcmV0aW1lLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC45DgAABAgQ0QgAPQ4MbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWluc0Rhc3NpZ25lcl9jb3JldGltZSBTY2hlZHVsZQQETgEQAAwBLGFzc2lnbm1lbnRzmQcBjFZlYzwoQ29yZUFzc2lnbm1lbnQsIFBhcnRzT2Y1NzYwMCk+AAEgZW5kX2hpbnScASRPcHRpb248Tj4AATRuZXh0X3NjaGVkdWxlnAEkT3B0aW9uPE4+AABBDgxscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zRGFzc2lnbmVyX2NvcmV0aW1lOENvcmVEZXNjcmlwdG9yBAROARAACAEUcXVldWVFDgFoT3B0aW9uPFF1ZXVlRGVzY3JpcHRvcjxOPj4AATBjdXJyZW50X3dvcmtNDgFQT3B0aW9uPFdvcmtTdGF0ZTxOPj4AAEUOBBhPcHRpb24EBFQBSQ4BCBBOb25lAAAAEFNvbWUEAEkOAAABAABJDgxscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zRGFzc2lnbmVyX2NvcmV0aW1lPFF1ZXVlRGVzY3JpcHRvcgQETgEQAAgBFGZpcnN0EAEETgABEGxhc3QQAQROAABNDgQYT3B0aW9uBARUAVEOAQgQTm9uZQAAABBTb21lBABRDgAAAQAAUQ4MbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWluc0Rhc3NpZ25lcl9jb3JldGltZSRXb3JrU3RhdGUEBE4BEAAQASxhc3NpZ25tZW50c1UOAZhWZWM8KENvcmVBc3NpZ25tZW50LCBBc3NpZ25tZW50U3RhdGUpPgABIGVuZF9oaW50nAEkT3B0aW9uPE4+AAEMcG9zQQEBDHUxNgABEHN0ZXClBwEwUGFydHNPZjU3NjAwAABVDgAAAlkOAFkOAAAECKEHXQ4AXQ4MbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWluc0Rhc3NpZ25lcl9jb3JldGltZTxBc3NpZ25tZW50U3RhdGUAAAgBFHJhdGlvpQcBMFBhcnRzT2Y1NzYwMAABJHJlbWFpbmluZ6UHATBQYXJ0c09mNTc2MDAAAGEOEGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnNEYXNzaWduZXJfY29yZXRpbWUYcGFsbGV0FEVycm9yBARUAAEIQEFzc2lnbm1lbnRzRW1wdHkAAABARGlzYWxsb3dlZEluc2VydAABCFEBYXNzaWduX2NvcmUgaXMgb25seSBhbGxvd2VkIHRvIGFwcGVuZCBuZXcgYXNzaWdubWVudHMgYXQgdGhlIGVuZCBvZiBhbHJlYWR5IGV4aXN0aW5neG9uZXMgb3IgdXBkYXRlIHRoZSBsYXN0IGVudHJ5LgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC5lDgxccG9sa2Fkb3RfcnVudGltZV9jb21tb248cGFyYXNfcmVnaXN0cmFyIFBhcmFJbmZvCBxBY2NvdW50AQAcQmFsYW5jZQEYAAwBHG1hbmFnZXIAARxBY2NvdW50AAEcZGVwb3NpdBgBHEJhbGFuY2UAARhsb2NrZWRNAgEwT3B0aW9uPGJvb2w+AABpDhBccG9sa2Fkb3RfcnVudGltZV9jb21tb248cGFyYXNfcmVnaXN0cmFyGHBhbGxldBRFcnJvcgQEVAABODROb3RSZWdpc3RlcmVkAAAEZFRoZSBJRCBpcyBub3QgcmVnaXN0ZXJlZC5EQWxyZWFkeVJlZ2lzdGVyZWQAAQR0VGhlIElEIGlzIGFscmVhZHkgcmVnaXN0ZXJlZC4gTm90T3duZXIAAgScVGhlIGNhbGxlciBpcyBub3QgdGhlIG93bmVyIG9mIHRoaXMgSWQuMENvZGVUb29MYXJnZQADBFxJbnZhbGlkIHBhcmEgY29kZSBzaXplLkBIZWFkRGF0YVRvb0xhcmdlAAQEcEludmFsaWQgcGFyYSBoZWFkIGRhdGEgc2l6ZS4wTm90UGFyYWNoYWluAAUEYFBhcmEgaXMgbm90IGEgUGFyYWNoYWluLjROb3RQYXJhdGhyZWFkAAYEvFBhcmEgaXMgbm90IGEgUGFyYXRocmVhZCAob24tZGVtYW5kIHBhcmFjaGFpbikuQENhbm5vdERlcmVnaXN0ZXIABwRYQ2Fubm90IGRlcmVnaXN0ZXIgcGFyYTxDYW5ub3REb3duZ3JhZGUACAQtAUNhbm5vdCBzY2hlZHVsZSBkb3duZ3JhZGUgb2YgbGVhc2UgaG9sZGluZyBwYXJhY2hhaW4gdG8gb24tZGVtYW5kIHBhcmFjaGFpbjRDYW5ub3RVcGdyYWRlAAkEJQFDYW5ub3Qgc2NoZWR1bGUgdXBncmFkZSBvZiBvbi1kZW1hbmQgcGFyYWNoYWluIHRvIGxlYXNlIGhvbGRpbmcgcGFyYWNoYWluKFBhcmFMb2NrZWQACghJAVBhcmEgaXMgbG9ja2VkIGZyb20gbWFuaXB1bGF0aW9uIGJ5IHRoZSBtYW5hZ2VyLiBNdXN0IHVzZSBwYXJhY2hhaW4gb3IgcmVsYXkgY2hhaW4sZ292ZXJuYW5jZS4sTm90UmVzZXJ2ZWQACwTQVGhlIElEIGdpdmVuIGZvciByZWdpc3RyYXRpb24gaGFzIG5vdCBiZWVuIHJlc2VydmVkLixJbnZhbGlkQ29kZQAMBHxUaGUgdmFsaWRhdGlvbiBjb2RlIGlzIGludmFsaWQuKENhbm5vdFN3YXAADQhRAUNhbm5vdCBwZXJmb3JtIGEgcGFyYWNoYWluIHNsb3QgLyBsaWZlY3ljbGUgc3dhcC4gQ2hlY2sgdGhhdCB0aGUgc3RhdGUgb2YgYm90aCBwYXJhc4RhcmUgY29ycmVjdCBmb3IgdGhlIHN3YXAgdG8gd29yay4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQubQ4AAAJJCwBxDhBccG9sa2Fkb3RfcnVudGltZV9jb21tb24Uc2xvdHMYcGFsbGV0FEVycm9yBARUAAEIRFBhcmFOb3RPbmJvYXJkaW5nAAAEjFRoZSBwYXJhY2hhaW4gSUQgaXMgbm90IG9uYm9hcmRpbmcuKExlYXNlRXJyb3IAAQSIVGhlcmUgd2FzIGFuIGVycm9yIHdpdGggdGhlIGxlYXNlLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC51DhBccG9sa2Fkb3RfcnVudGltZV9jb21tb25IcGFyYXNfc3Vkb193cmFwcGVyGHBhbGxldBRFcnJvcgQEVAABKDxQYXJhRG9lc250RXhpc3QAAASoVGhlIHNwZWNpZmllZCBwYXJhY2hhaW4gaXMgbm90IHJlZ2lzdGVyZWQuRFBhcmFBbHJlYWR5RXhpc3RzAAEEuFRoZSBzcGVjaWZpZWQgcGFyYWNoYWluIGlzIGFscmVhZHkgcmVnaXN0ZXJlZC5URXhjZWVkc01heE1lc3NhZ2VTaXplAAIIQQFBIERNUCBtZXNzYWdlIGNvdWxkbid0IGJlIHNlbnQgYmVjYXVzZSBpdCBleGNlZWRzIHRoZSBtYXhpbXVtIHNpemUgYWxsb3dlZCBmb3IgYURkb3dud2FyZCBtZXNzYWdlLihVbnJvdXRhYmxlAAMEGQFBIERNUCBtZXNzYWdlIGNvdWxkbid0IGJlIHNlbnQgYmVjYXVzZSB0aGUgZGVzdGluYXRpb24gaXMgdW5yZWFjaGFibGUuOENvdWxkbnRDbGVhbnVwAAQEgENvdWxkIG5vdCBzY2hlZHVsZSBwYXJhIGNsZWFudXAuNE5vdFBhcmF0aHJlYWQABQScTm90IGEgcGFyYXRocmVhZCAob24tZGVtYW5kIHBhcmFjaGFpbikuME5vdFBhcmFjaGFpbgAGBHhOb3QgYSBsZWFzZSBob2xkaW5nIHBhcmFjaGFpbi40Q2Fubm90VXBncmFkZQAHBPhDYW5ub3QgdXBncmFkZSBvbi1kZW1hbmQgcGFyYWNoYWluIHRvIGxlYXNlIGhvbGRpbmcgcGFyYWNoYWluLjxDYW5ub3REb3duZ3JhZGUACATYQ2Fubm90IGRvd25ncmFkZSBsZWFzZSBob2xkaW5nIHBhcmFjaGFpbiB0byBvbi1kZW1hbmQuMFRvb01hbnlDb3JlcwAJBMxUaGVyZSBhcmUgbW9yZSBjb3JlcyB0aGFuIHN1cHBvcnRlZCBieSB0aGUgcnVudGltZS4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQueQ4AAAQIALECAH0OAAADJAAAAIEOAIEOBBhPcHRpb24EBFQBhQ4BCBBOb25lAAAAEFNvbWUEAIUOAAABAACFDgAABAwAsQIYAIkOEFxwb2xrYWRvdF9ydW50aW1lX2NvbW1vbiBhdWN0aW9ucxhwYWxsZXQURXJyb3IEBFQAARxEQXVjdGlvbkluUHJvZ3Jlc3MAAASQVGhpcyBhdWN0aW9uIGlzIGFscmVhZHkgaW4gcHJvZ3Jlc3MuRExlYXNlUGVyaW9kSW5QYXN0AAEEgFRoZSBsZWFzZSBwZXJpb2QgaXMgaW4gdGhlIHBhc3QuRFBhcmFOb3RSZWdpc3RlcmVkAAIEWFBhcmEgaXMgbm90IHJlZ2lzdGVyZWRETm90Q3VycmVudEF1Y3Rpb24AAwRYTm90IGEgY3VycmVudCBhdWN0aW9uLihOb3RBdWN0aW9uAAQEPE5vdCBhbiBhdWN0aW9uLjBBdWN0aW9uRW5kZWQABQRoQXVjdGlvbiBoYXMgYWxyZWFkeSBlbmRlZC5AQWxyZWFkeUxlYXNlZE91dAAGBNhUaGUgcGFyYSBpcyBhbHJlYWR5IGxlYXNlZCBvdXQgZm9yIHBhcnQgb2YgdGhpcyByYW5nZS4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQujQ4MXHBvbGthZG90X3J1bnRpbWVfY29tbW9uJGNyb3dkbG9hbiBGdW5kSW5mbxAkQWNjb3VudElkAQAcQmFsYW5jZQEYLEJsb2NrTnVtYmVyARAsTGVhc2VQZXJpb2QBEAAoASRkZXBvc2l0b3IAASRBY2NvdW50SWQAASB2ZXJpZmllcoUHAUxPcHRpb248TXVsdGlTaWduZXI+AAEcZGVwb3NpdBgBHEJhbGFuY2UAARhyYWlzZWQYARxCYWxhbmNlAAEMZW5kEAEsQmxvY2tOdW1iZXIAAQxjYXAYARxCYWxhbmNlAAFEbGFzdF9jb250cmlidXRpb26RDgF0TGFzdENvbnRyaWJ1dGlvbjxCbG9ja051bWJlcj4AATBmaXJzdF9wZXJpb2QQASxMZWFzZVBlcmlvZAABLGxhc3RfcGVyaW9kEAEsTGVhc2VQZXJpb2QAAShmdW5kX2luZGV4EAEkRnVuZEluZGV4AACRDgxccG9sa2Fkb3RfcnVudGltZV9jb21tb24kY3Jvd2Rsb2FuQExhc3RDb250cmlidXRpb24ELEJsb2NrTnVtYmVyARABDBROZXZlcgAAACRQcmVFbmRpbmcEABABDHUzMgABABhFbmRpbmcEABABLEJsb2NrTnVtYmVyAAIAAJUOEFxwb2xrYWRvdF9ydW50aW1lX2NvbW1vbiRjcm93ZGxvYW4YcGFsbGV0FEVycm9yBARUAAFcREZpcnN0UGVyaW9kSW5QYXN0AAAE9FRoZSBjdXJyZW50IGxlYXNlIHBlcmlvZCBpcyBtb3JlIHRoYW4gdGhlIGZpcnN0IGxlYXNlIHBlcmlvZC5kRmlyc3RQZXJpb2RUb29GYXJJbkZ1dHVyZQABBBEBVGhlIGZpcnN0IGxlYXNlIHBlcmlvZCBuZWVkcyB0byBhdCBsZWFzdCBiZSBsZXNzIHRoYW4gMyBgbWF4X3ZhbHVlYC5sTGFzdFBlcmlvZEJlZm9yZUZpcnN0UGVyaW9kAAIE6Exhc3QgbGVhc2UgcGVyaW9kIG11c3QgYmUgZ3JlYXRlciB0aGFuIGZpcnN0IGxlYXNlIHBlcmlvZC5gTGFzdFBlcmlvZFRvb0ZhckluRnV0dXJlAAMELQFUaGUgbGFzdCBsZWFzZSBwZXJpb2QgY2Fubm90IGJlIG1vcmUgdGhhbiAzIHBlcmlvZHMgYWZ0ZXIgdGhlIGZpcnN0IHBlcmlvZC48Q2Fubm90RW5kSW5QYXN0AAQERQFUaGUgY2FtcGFpZ24gZW5kcyBiZWZvcmUgdGhlIGN1cnJlbnQgYmxvY2sgbnVtYmVyLiBUaGUgZW5kIG11c3QgYmUgaW4gdGhlIGZ1dHVyZS5ERW5kVG9vRmFySW5GdXR1cmUABQTAVGhlIGVuZCBkYXRlIGZvciB0aGlzIGNyb3dkbG9hbiBpcyBub3Qgc2Vuc2libGUuIE92ZXJmbG93AAYEWFRoZXJlIHdhcyBhbiBvdmVyZmxvdy5QQ29udHJpYnV0aW9uVG9vU21hbGwABwToVGhlIGNvbnRyaWJ1dGlvbiB3YXMgYmVsb3cgdGhlIG1pbmltdW0sIGBNaW5Db250cmlidXRpb25gLjRJbnZhbGlkUGFyYUlkAAgETEludmFsaWQgZnVuZCBpbmRleC4sQ2FwRXhjZWVkZWQACQSQQ29udHJpYnV0aW9ucyBleGNlZWQgbWF4aW11bSBhbW91bnQuWENvbnRyaWJ1dGlvblBlcmlvZE92ZXIACgSoVGhlIGNvbnRyaWJ1dGlvbiBwZXJpb2QgaGFzIGFscmVhZHkgZW5kZWQuNEludmFsaWRPcmlnaW4ACwSMVGhlIG9yaWdpbiBvZiB0aGlzIGNhbGwgaXMgaW52YWxpZC4wTm90UGFyYWNoYWluAAwEyFRoaXMgY3Jvd2Rsb2FuIGRvZXMgbm90IGNvcnJlc3BvbmQgdG8gYSBwYXJhY2hhaW4uLExlYXNlQWN0aXZlAA0EFQFUaGlzIHBhcmFjaGFpbiBsZWFzZSBpcyBzdGlsbCBhY3RpdmUgYW5kIHJldGlyZW1lbnQgY2Fubm90IHlldCBiZWdpbi5AQmlkT3JMZWFzZUFjdGl2ZQAOBDEBVGhpcyBwYXJhY2hhaW4ncyBiaWQgb3IgbGVhc2UgaXMgc3RpbGwgYWN0aXZlIGFuZCB3aXRoZHJhdyBjYW5ub3QgeWV0IGJlZ2luLjBGdW5kTm90RW5kZWQADwSAVGhlIGNyb3dkbG9hbiBoYXMgbm90IHlldCBlbmRlZC48Tm9Db250cmlidXRpb25zABAE0FRoZXJlIGFyZSBubyBjb250cmlidXRpb25zIHN0b3JlZCBpbiB0aGlzIGNyb3dkbG9hbi5ITm90UmVhZHlUb0Rpc3NvbHZlABEIVQFUaGUgY3Jvd2Rsb2FuIGlzIG5vdCByZWFkeSB0byBkaXNzb2x2ZS4gUG90ZW50aWFsbHkgc3RpbGwgaGFzIGEgc2xvdCBvciBpbiByZXRpcmVtZW50HHBlcmlvZC5ASW52YWxpZFNpZ25hdHVyZQASBEhJbnZhbGlkIHNpZ25hdHVyZS4wTWVtb1Rvb0xhcmdlABMEfFRoZSBwcm92aWRlZCBtZW1vIGlzIHRvbyBsYXJnZS5EQWxyZWFkeUluTmV3UmFpc2UAFASEVGhlIGZ1bmQgaXMgYWxyZWFkeSBpbiBgTmV3UmFpc2VgSFZyZkRlbGF5SW5Qcm9ncmVzcwAVBLRObyBjb250cmlidXRpb25zIGFsbG93ZWQgZHVyaW5nIHRoZSBWUkYgZGVsYXk0Tm9MZWFzZVBlcmlvZAAWBC0BQSBsZWFzZSBwZXJpb2QgaGFzIG5vdCBzdGFydGVkIHlldCwgZHVlIHRvIGFuIG9mZnNldCBpbiB0aGUgc3RhcnRpbmcgYmxvY2suBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LpkODFxwb2xrYWRvdF9ydW50aW1lX2NvbW1vbjhhc3NpZ25lZF9zbG90c1hQYXJhY2hhaW5UZW1wb3JhcnlTbG90CCRBY2NvdW50SWQBACxMZWFzZVBlcmlvZAEQABQBHG1hbmFnZXIAASRBY2NvdW50SWQAATBwZXJpb2RfYmVnaW4QASxMZWFzZVBlcmlvZAABMHBlcmlvZF9jb3VudBABLExlYXNlUGVyaW9kAAEobGFzdF9sZWFzZZwBTE9wdGlvbjxMZWFzZVBlcmlvZD4AASxsZWFzZV9jb3VudBABDHUzMgAAnQ4QXHBvbGthZG90X3J1bnRpbWVfY29tbW9uOGFzc2lnbmVkX3Nsb3RzGHBhbGxldBRFcnJvcgQEVAABJDxQYXJhRG9lc250RXhpc3QAAASoVGhlIHNwZWNpZmllZCBwYXJhY2hhaW4gaXMgbm90IHJlZ2lzdGVyZWQuNE5vdFBhcmF0aHJlYWQAAQScTm90IGEgcGFyYXRocmVhZCAob24tZGVtYW5kIHBhcmFjaGFpbikuNENhbm5vdFVwZ3JhZGUAAgjMQ2Fubm90IHVwZ3JhZGUgb24tZGVtYW5kIHBhcmFjaGFpbiB0byBsZWFzZSBob2xkaW5nKHBhcmFjaGFpbi48Q2Fubm90RG93bmdyYWRlAAMIrENhbm5vdCBkb3duZ3JhZGUgbGVhc2UgaG9sZGluZyBwYXJhY2hhaW4gdG8ob24tZGVtYW5kLkxTbG90QWxyZWFkeUFzc2lnbmVkAAQEtFBlcm1hbmVudCBvciBUZW1wb3Jhcnkgc2xvdCBhbHJlYWR5IGFzc2lnbmVkLjxTbG90Tm90QXNzaWduZWQABQTIUGVybWFuZW50IG9yIFRlbXBvcmFyeSBzbG90IGhhcyBub3QgYmVlbiBhc3NpZ25lZC5IT25nb2luZ0xlYXNlRXhpc3RzAAYEgEFuIG9uZ29pbmcgbGVhc2UgYWxyZWFkeSBleGlzdHMuZE1heFBlcm1hbmVudFNsb3RzRXhjZWVkZWQABwBkTWF4VGVtcG9yYXJ5U2xvdHNFeGNlZWRlZAAIAASAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC6hDhBscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zIGNvcmV0aW1lGHBhbGxldBRFcnJvcgQEVAABDCROb3RCcm9rZXIAAAQpAVRoZSBwYXJhaWQgbWFraW5nIHRoZSBjYWxsIGlzIG5vdCB0aGUgY29yZXRpbWUgYnJva2VyYWdlIHN5c3RlbSBwYXJhY2hhaW4uWFJlcXVlc3RlZEZ1dHVyZVJldmVudWUAAQhFAVJlcXVlc3RlZCByZXZlbnVlIGluZm9ybWF0aW9uIGB3aGVuYCBwYXJhbWV0ZXIgd2FzIGluIHRoZSBmdXR1cmUgZnJvbSB0aGUgY3VycmVudDRibG9jayBoZWlnaHQuTEFzc2V0VHJhbnNmZXJGYWlsZWQAAgS8RmFpbGVkIHRvIHRyYW5zZmVyIGFzc2V0cyB0byB0aGUgY29yZXRpbWUgY2hhaW4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQupQ4AAAQIEAECAKkOBCBCVHJlZU1hcAgESwEQBFYBrQ4ABAC9DgAAAK0OBCBCVHJlZU1hcAgESwEABFYBsQ4ABAC1DgAAALEOCHhwYWxsZXRfc3Rha2luZ19hc3luY19haF9jbGllbnQ8QnVmZmVyZWRPZmZlbmNlBCRBY2NvdW50SWQBAAAIASByZXBvcnRlcjUBAURPcHRpb248QWNjb3VudElkPgABOHNsYXNoX2ZyYWN0aW9umAFMc3BfcnVudGltZTo6UGVyYmlsbAAAtQ4AAAK5DgC5DgAABAgAsQ4AvQ4AAALBDgDBDgAABAgQrQ4AxQ4MeHBhbGxldF9zdGFraW5nX2FzeW5jX2FoX2NsaWVudBhwYWxsZXQURXJyb3IEBFQAAQQcQmxvY2tlZAAABCUBQ291bGQgbm90IHByb2Nlc3MgaW5jb21pbmcgbWVzc2FnZSBiZWNhdXNlIGluY29taW5nIG1lc3NhZ2VzIGFyZSBibG9ja2VkLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC7JDgxEcGFsbGV0X21pZ3JhdGlvbnMYcGFsbGV0FEVycm9yBARUAAEEHE9uZ29pbmcAAAToVGhlIG9wZXJhdGlvbiBjYW5ub3QgY29tcGxldGUgc2luY2Ugc29tZSBNQk1zIGFyZSBvbmdvaW5nLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC7NDgwocGFsbGV0X3hjbRhwYWxsZXQsUXVlcnlTdGF0dXMELEJsb2NrTnVtYmVyARABDBxQZW5kaW5nEAEkcmVzcG9uZGVyWQUBRFZlcnNpb25lZExvY2F0aW9uAAFMbWF5YmVfbWF0Y2hfcXVlcmllctEOAWRPcHRpb248VmVyc2lvbmVkTG9jYXRpb24+AAEwbWF5YmVfbm90aWZ51Q4BQE9wdGlvbjwodTgsIHU4KT4AARx0aW1lb3V0EAEsQmxvY2tOdW1iZXIAAAA8VmVyc2lvbk5vdGlmaWVyCAEYb3JpZ2luWQUBRFZlcnNpb25lZExvY2F0aW9uAAEkaXNfYWN0aXZlIAEQYm9vbAABABRSZWFkeQgBIHJlc3BvbnNl3Q4BRFZlcnNpb25lZFJlc3BvbnNlAAEIYXQQASxCbG9ja051bWJlcgACAADRDgQYT3B0aW9uBARUAVkFAQgQTm9uZQAAABBTb21lBABZBQAAAQAA1Q4EGE9wdGlvbgQEVAHZDgEIEE5vbmUAAAAQU29tZQQA2Q4AAAEAANkOAAAECAgIAN0OCAx4Y21EVmVyc2lvbmVkUmVzcG9uc2UAAQwIVjMEAHEGATB2Mzo6UmVzcG9uc2UAAwAIVjQEANkGATB2NDo6UmVzcG9uc2UABAAIVjUEACEHATB2NTo6UmVzcG9uc2UABQAA4Q4AAAQIEFkFAOUOAAAEDDAoEADpDgxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAe0OBFMAAAQA8Q4BGFZlYzxUPgAA7Q4AAAQIWQUQAPEOAAAC7Q4A9Q4MKHBhbGxldF94Y20YcGFsbGV0VFZlcnNpb25NaWdyYXRpb25TdGFnZQABEFxNaWdyYXRlU3VwcG9ydGVkVmVyc2lvbgAAAFxNaWdyYXRlVmVyc2lvbk5vdGlmaWVycwABAFBOb3RpZnlDdXJyZW50VGFyZ2V0cwQA2QcBPE9wdGlvbjxWZWM8dTg+PgACAGhNaWdyYXRlQW5kTm90aWZ5T2xkVGFyZ2V0cwADAAD5DgAABAwQABUIAP0ODChwYWxsZXRfeGNtGHBhbGxldGhSZW1vdGVMb2NrZWRGdW5naWJsZVJlY29yZAhIQ29uc3VtZXJJZGVudGlmaWVyAQUBME1heENvbnN1bWVycwAAEAEYYW1vdW50GAEQdTEyOAABFG93bmVyWQUBRFZlcnNpb25lZExvY2F0aW9uAAEYbG9ja2VyWQUBRFZlcnNpb25lZExvY2F0aW9uAAEkY29uc3VtZXJzAQ8B0EJvdW5kZWRWZWM8KENvbnN1bWVySWRlbnRpZmllciwgdTEyOCksIE1heENvbnN1bWVycz4AAAEPDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBBQ8EUwAABAAJDwEYVmVjPFQ+AAAFDwAABAgFARgACQ8AAAIFDwANDwxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAREPBFMAAAQAFQ8BGFZlYzxUPgAAEQ8AAAQIGFkFABUPAAACEQ8AGQ8IKHBhbGxldF94Y21YQXV0aG9yaXplZEFsaWFzZXNFbnRyeQgYVGlja2V0AR0PDE1BWAEhDwAIASBhbGlhc2VycyUPAXhCb3VuZGVkVmVjPE9yaWdpbkFsaWFzZXIsIE1BWD4AARh0aWNrZXQdDwEYVGlja2V0AAAdDxA0ZnJhbWVfc3VwcG9ydBh0cmFpdHMcc3RvcmFnZSBEaXNhYmxlZAAAAAAhDwwocGFsbGV0X3hjbRhwYWxsZXRQTWF4QXV0aG9yaXplZEFsaWFzZXMAAAAAJQ8MTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAEpDwRTAAAEAC0PARhWZWM8VD4AACkPDEB4Y21fcnVudGltZV9hcGlzSGF1dGhvcml6ZWRfYWxpYXNlczRPcmlnaW5BbGlhc2VyAAAIASBsb2NhdGlvblkFAURWZXJzaW9uZWRMb2NhdGlvbgABGGV4cGlyeRkIASxPcHRpb248dTY0PgAALQ8AAAIpDwAxDwwocGFsbGV0X3hjbRhwYWxsZXQURXJyb3IEBFQAAXAsVW5yZWFjaGFibGUAAAhdAVRoZSBkZXNpcmVkIGRlc3RpbmF0aW9uIHdhcyB1bnJlYWNoYWJsZSwgZ2VuZXJhbGx5IGJlY2F1c2UgdGhlcmUgaXMgYSBubyB3YXkgb2Ygcm91dGluZxh0byBpdC4sU2VuZEZhaWx1cmUAAQhBAVRoZXJlIHdhcyBzb21lIG90aGVyIGlzc3VlIChpLmUuIG5vdCB0byBkbyB3aXRoIHJvdXRpbmcpIGluIHNlbmRpbmcgdGhlIG1lc3NhZ2UuyFBlcmhhcHMgYSBsYWNrIG9mIHNwYWNlIGZvciBidWZmZXJpbmcgdGhlIG1lc3NhZ2UuIEZpbHRlcmVkAAIEnFRoZSBtZXNzYWdlIGV4ZWN1dGlvbiBmYWlscyB0aGUgZmlsdGVyLkhVbndlaWdoYWJsZU1lc3NhZ2UAAwS0VGhlIG1lc3NhZ2UncyB3ZWlnaHQgY291bGQgbm90IGJlIGRldGVybWluZWQuYERlc3RpbmF0aW9uTm90SW52ZXJ0aWJsZQAEBNxUaGUgZGVzdGluYXRpb24gYExvY2F0aW9uYCBwcm92aWRlZCBjYW5ub3QgYmUgaW52ZXJ0ZWQuFEVtcHR5AAUEgFRoZSBhc3NldHMgdG8gYmUgc2VudCBhcmUgZW1wdHkuOENhbm5vdFJlYW5jaG9yAAYENQFDb3VsZCBub3QgcmUtYW5jaG9yIHRoZSBhc3NldHMgdG8gZGVjbGFyZSB0aGUgZmVlcyBmb3IgdGhlIGRlc3RpbmF0aW9uIGNoYWluLjRUb29NYW55QXNzZXRzAAcExFRvbyBtYW55IGFzc2V0cyBoYXZlIGJlZW4gYXR0ZW1wdGVkIGZvciB0cmFuc2Zlci40SW52YWxpZE9yaWdpbgAIBHhPcmlnaW4gaXMgaW52YWxpZCBmb3Igc2VuZGluZy4oQmFkVmVyc2lvbgAJBCEBVGhlIHZlcnNpb24gb2YgdGhlIGBWZXJzaW9uZWRgIHZhbHVlIHVzZWQgaXMgbm90IGFibGUgdG8gYmUgaW50ZXJwcmV0ZWQuLEJhZExvY2F0aW9uAAoIQQFUaGUgZ2l2ZW4gbG9jYXRpb24gY291bGQgbm90IGJlIHVzZWQgKGUuZy4gYmVjYXVzZSBpdCBjYW5ub3QgYmUgZXhwcmVzc2VkIGluIHRoZWBkZXNpcmVkIHZlcnNpb24gb2YgWENNKS44Tm9TdWJzY3JpcHRpb24ACwS8VGhlIHJlZmVyZW5jZWQgc3Vic2NyaXB0aW9uIGNvdWxkIG5vdCBiZSBmb3VuZC5EQWxyZWFkeVN1YnNjcmliZWQADAQRAVRoZSBsb2NhdGlvbiBpcyBpbnZhbGlkIHNpbmNlIGl0IGFscmVhZHkgaGFzIGEgc3Vic2NyaXB0aW9uIGZyb20gdXMuWENhbm5vdENoZWNrT3V0VGVsZXBvcnQADQQpAUNvdWxkIG5vdCBjaGVjay1vdXQgdGhlIGFzc2V0cyBmb3IgdGVsZXBvcnRhdGlvbiB0byB0aGUgZGVzdGluYXRpb24gY2hhaW4uKExvd0JhbGFuY2UADgRBAVRoZSBvd25lciBkb2VzIG5vdCBvd24gKGFsbCkgb2YgdGhlIGFzc2V0IHRoYXQgdGhleSB3aXNoIHRvIGRvIHRoZSBvcGVyYXRpb24gb24uMFRvb01hbnlMb2NrcwAPBMBUaGUgYXNzZXQgb3duZXIgaGFzIHRvbyBtYW55IGxvY2tzIG9uIHRoZSBhc3NldC5MQWNjb3VudE5vdFNvdmVyZWlnbgAQBDEBVGhlIGdpdmVuIGFjY291bnQgaXMgbm90IGFuIGlkZW50aWZpYWJsZSBzb3ZlcmVpZ24gYWNjb3VudCBmb3IgYW55IGxvY2F0aW9uLihGZWVzTm90TWV0ABEEKQFUaGUgb3BlcmF0aW9uIHJlcXVpcmVkIGZlZXMgdG8gYmUgcGFpZCB3aGljaCB0aGUgaW5pdGlhdG9yIGNvdWxkIG5vdCBtZWV0LjBMb2NrTm90Rm91bmQAEgT0QSByZW1vdGUgbG9jayB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIGRhdGEgY291bGQgbm90IGJlIGZvdW5kLhRJblVzZQATBEkBVGhlIHVubG9jayBvcGVyYXRpb24gY2Fubm90IHN1Y2NlZWQgYmVjYXVzZSB0aGVyZSBhcmUgc3RpbGwgY29uc3VtZXJzIG9mIHRoZSBsb2NrLmhJbnZhbGlkQXNzZXRVbmtub3duUmVzZXJ2ZQAVBPBJbnZhbGlkIGFzc2V0LCByZXNlcnZlIGNoYWluIGNvdWxkIG5vdCBiZSBkZXRlcm1pbmVkIGZvciBpdC54SW52YWxpZEFzc2V0VW5zdXBwb3J0ZWRSZXNlcnZlABYERQFJbnZhbGlkIGFzc2V0LCBkbyBub3Qgc3VwcG9ydCByZW1vdGUgYXNzZXQgcmVzZXJ2ZXMgd2l0aCBkaWZmZXJlbnQgZmVlcyByZXNlcnZlcy48VG9vTWFueVJlc2VydmVzABcESQFUb28gbWFueSBhc3NldHMgd2l0aCBkaWZmZXJlbnQgcmVzZXJ2ZSBsb2NhdGlvbnMgaGF2ZSBiZWVuIGF0dGVtcHRlZCBmb3IgdHJhbnNmZXIuYExvY2FsRXhlY3V0aW9uSW5jb21wbGV0ZQAYBHxMb2NhbCBYQ00gZXhlY3V0aW9uIGluY29tcGxldGUuYFRvb01hbnlBdXRob3JpemVkQWxpYXNlcwAZBLhUb28gbWFueSBsb2NhdGlvbnMgYXV0aG9yaXplZCB0byBhbGlhcyBvcmlnaW4uNEV4cGlyZXNJblBhc3QAGgSMRXhwaXJ5IGJsb2NrIG51bWJlciBpcyBpbiB0aGUgcGFzdC40QWxpYXNOb3RGb3VuZAAbBNBUaGUgYWxpYXMgdG8gcmVtb3ZlIGF1dGhvcml6YXRpb24gZm9yIHdhcyBub3QgZm91bmQuhExvY2FsRXhlY3V0aW9uSW5jb21wbGV0ZVdpdGhFcnJvcggBFGluZGV4CAFASW5zdHJ1Y3Rpb25JbmRleAABFGVycm9yNQ8BOEV4ZWN1dGlvbkVycm9yABwINQFMb2NhbCBYQ00gZXhlY3V0aW9uIGluY29tcGxldGUgd2l0aCB0aGUgYWN0dWFsIFhDTSBlcnJvciBhbmQgdGhlIGluZGV4IG9mIHRoZYhpbnN0cnVjdGlvbiB0aGF0IGNhdXNlZCB0aGUgZXJyb3IuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LjUPDChwYWxsZXRfeGNtGGVycm9yczhFeGVjdXRpb25FcnJvcgABpCBPdmVyZmxvdwAAADRVbmltcGxlbWVudGVkAAEAYFVudHJ1c3RlZFJlc2VydmVMb2NhdGlvbgACAGRVbnRydXN0ZWRUZWxlcG9ydExvY2F0aW9uAAMAMExvY2F0aW9uRnVsbAAEAFRMb2NhdGlvbk5vdEludmVydGlibGUABQAkQmFkT3JpZ2luAAYAPEludmFsaWRMb2NhdGlvbgAHADRBc3NldE5vdEZvdW5kAAgAVEZhaWxlZFRvVHJhbnNhY3RBc3NldAAJADxOb3RXaXRoZHJhd2FibGUACgBITG9jYXRpb25DYW5ub3RIb2xkAAsAVEV4Y2VlZHNNYXhNZXNzYWdlU2l6ZQAMAFhEZXN0aW5hdGlvblVuc3VwcG9ydGVkAA0AJFRyYW5zcG9ydAAOAChVbnJvdXRhYmxlAA8AMFVua25vd25DbGFpbQAQADhGYWlsZWRUb0RlY29kZQARAEBNYXhXZWlnaHRJbnZhbGlkABIAOE5vdEhvbGRpbmdGZWVzABMAMFRvb0V4cGVuc2l2ZQAUABBUcmFwABUAQEV4cGVjdGF0aW9uRmFsc2UAFgA4UGFsbGV0Tm90Rm91bmQAFwAwTmFtZU1pc21hdGNoABgATFZlcnNpb25JbmNvbXBhdGlibGUAGQBQSG9sZGluZ1dvdWxkT3ZlcmZsb3cAGgAsRXhwb3J0RXJyb3IAGwA4UmVhbmNob3JGYWlsZWQAHAAYTm9EZWFsAB0AKEZlZXNOb3RNZXQAHgAkTG9ja0Vycm9yAB8AME5vUGVybWlzc2lvbgAgAChVbmFuY2hvcmVkACEAOE5vdERlcG9zaXRhYmxlACIANFRvb01hbnlBc3NldHMAIwBMVW5oYW5kbGVkWGNtVmVyc2lvbgAkAEhXZWlnaHRMaW1pdFJlYWNoZWQAJQAcQmFycmllcgAmAExXZWlnaHROb3RDb21wdXRhYmxlACcAREV4Y2VlZHNTdGFja0xpbWl0ACgAADkPCFBwYWxsZXRfbWVzc2FnZV9xdWV1ZSRCb29rU3RhdGUENE1lc3NhZ2VPcmlnaW4BIQgAGAEUYmVnaW4QASRQYWdlSW5kZXgAAQxlbmQQASRQYWdlSW5kZXgAARRjb3VudBABJFBhZ2VJbmRleAABQHJlYWR5X25laWdoYm91cnM9DwGET3B0aW9uPE5laWdoYm91cnM8TWVzc2FnZU9yaWdpbj4+AAE0bWVzc2FnZV9jb3VudDABDHU2NAABEHNpemUwAQx1NjQAAD0PBBhPcHRpb24EBFQBQQ8BCBBOb25lAAAAEFNvbWUEAEEPAAABAABBDwhQcGFsbGV0X21lc3NhZ2VfcXVldWUoTmVpZ2hib3VycwQ0TWVzc2FnZU9yaWdpbgEhCAAIARBwcmV2IQgBNE1lc3NhZ2VPcmlnaW4AARBuZXh0IQgBNE1lc3NhZ2VPcmlnaW4AAEUPAAAECCEIEABJDwhQcGFsbGV0X21lc3NhZ2VfcXVldWUQUGFnZQgQU2l6ZQEQIEhlYXBTaXplAAAYASRyZW1haW5pbmcQARBTaXplAAE4cmVtYWluaW5nX3NpemUQARBTaXplAAEsZmlyc3RfaW5kZXgQARBTaXplAAEUZmlyc3QQARBTaXplAAEQbGFzdBABEFNpemUAARBoZWFwTQ8BnEJvdW5kZWRWZWM8dTgsIEludG9VMzI8SGVhcFNpemUsIFNpemU+PgAATQ8MTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAEIBFMAAAQAOAEYVmVjPFQ+AABRDwxQcGFsbGV0X21lc3NhZ2VfcXVldWUYcGFsbGV0FEVycm9yBARUAAEkLE5vdFJlYXBhYmxlAAAISQFQYWdlIGlzIG5vdCByZWFwYWJsZSBiZWNhdXNlIGl0IGhhcyBpdGVtcyByZW1haW5pbmcgdG8gYmUgcHJvY2Vzc2VkIGFuZCBpcyBub3Qgb2xkHGVub3VnaC4YTm9QYWdlAAEEhFBhZ2UgdG8gYmUgcmVhcGVkIGRvZXMgbm90IGV4aXN0LiROb01lc3NhZ2UAAgSoVGhlIHJlZmVyZW5jZWQgbWVzc2FnZSBjb3VsZCBub3QgYmUgZm91bmQuQEFscmVhZHlQcm9jZXNzZWQAAwQBAVRoZSBtZXNzYWdlIHdhcyBhbHJlYWR5IHByb2Nlc3NlZCBhbmQgY2Fubm90IGJlIHByb2Nlc3NlZCBhZ2Fpbi4YUXVldWVkAAQErFRoZSBtZXNzYWdlIGlzIHF1ZXVlZCBmb3IgZnV0dXJlIGV4ZWN1dGlvbi5ISW5zdWZmaWNpZW50V2VpZ2h0AAUEGQFUaGVyZSBpcyB0ZW1wb3JhcmlseSBub3QgZW5vdWdoIHdlaWdodCB0byBjb250aW51ZSBzZXJ2aWNpbmcgbWVzc2FnZXMuYFRlbXBvcmFyaWx5VW5wcm9jZXNzYWJsZQAGEKhUaGlzIG1lc3NhZ2UgaXMgdGVtcG9yYXJpbHkgdW5wcm9jZXNzYWJsZS4AWQFTdWNoIGVycm9ycyBhcmUgZXhwZWN0ZWQsIGJ1dCBub3QgZ3VhcmFudGVlZCwgdG8gcmVzb2x2ZSB0aGVtc2VsdmVzIGV2ZW50dWFsbHkgdGhyb3VnaCRyZXRyeWluZy4sUXVldWVQYXVzZWQABwzsVGhlIHF1ZXVlIGlzIHBhdXNlZCBhbmQgbm8gbWVzc2FnZSBjYW4gYmUgZXhlY3V0ZWQgZnJvbSBpdC4AHQFUaGlzIGNhbiBjaGFuZ2UgYXQgYW55IHRpbWUgYW5kIG1heSByZXNvbHZlIGluIHRoZSBmdXR1cmUgYnkgcmUtdHJ5aW5nLkxSZWN1cnNpdmVEaXNhbGxvd2VkAAgEMQFBbm90aGVyIGNhbGwgaXMgaW4gcHJvZ3Jlc3MgYW5kIG5lZWRzIHRvIGZpbmlzaCBiZWZvcmUgdGhpcyBjYWxsIGNhbiBoYXBwZW4uBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LlUPDERwYWxsZXRfYXNzZXRfcmF0ZRhwYWxsZXQURXJyb3IEBFQAAQxAVW5rbm93bkFzc2V0S2luZAAABHhUaGUgZ2l2ZW4gYXNzZXQgSUQgaXMgdW5rbm93bi40QWxyZWFkeUV4aXN0cwABBFEBVGhlIGdpdmVuIGFzc2V0IElEIGFscmVhZHkgaGFzIGFuIGFzc2lnbmVkIGNvbnZlcnNpb24gcmF0ZSBhbmQgY2Fubm90IGJlIHJlLWNyZWF0ZWQuIE92ZXJmbG93AAIEzE92ZXJmbG93IG9jdXJyZWQgd2hlbiBjYWxjdWxhdGluZyB0aGUgaW52ZXJzZSByYXRlLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC5ZDww4cGFsbGV0X21ldGFfdHgYcGFsbGV0FEVycm9yBARUAAEYIEJhZFByb29mAAAEfEludmFsaWQgcHJvb2YgKGUuZy4gc2lnbmF0dXJlKS4YRnV0dXJlAAEE8FRoZSBtZXRhIHRyYW5zYWN0aW9uIGlzIG5vdCB5ZXQgdmFsaWQgKGUuZy4gbm9uY2UgdG9vIGhpZ2gpLhRTdGFsZQACBNhUaGUgbWV0YSB0cmFuc2FjdGlvbiBpcyBvdXRkYXRlZCAoZS5nLiBub25jZSB0b28gbG93KS5EQW5jaWVudEJpcnRoQmxvY2sAAwS8VGhlIG1ldGEgdHJhbnNhY3Rpb25zJ3MgYmlydGggYmxvY2sgaXMgYW5jaWVudC40VW5rbm93bk9yaWdpbgAEBNxUaGUgdHJhbnNhY3Rpb24gZXh0ZW5zaW9uIGRpZCBub3QgYXV0aG9yaXplIGFueSBvcmlnaW4uHEludmFsaWQABQSAVGhlIG1ldGEgdHJhbnNhY3Rpb24gaXMgaW52YWxpZC4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQuXQ8MTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAFlAgRTAAAEAGEPARhWZWM8VD4AAGEPAAACZQIAZQ8MMHBhbGxldF9iZWVmeRhwYWxsZXQURXJyb3IEBFQAARxgSW52YWxpZEtleU93bmVyc2hpcFByb29mAAAEMQFBIGtleSBvd25lcnNoaXAgcHJvb2YgcHJvdmlkZWQgYXMgcGFydCBvZiBhbiBlcXVpdm9jYXRpb24gcmVwb3J0IGlzIGludmFsaWQuYEludmFsaWREb3VibGVWb3RpbmdQcm9vZgABBDEBQSBkb3VibGUgdm90aW5nIHByb29mIHByb3ZpZGVkIGFzIHBhcnQgb2YgYW4gZXF1aXZvY2F0aW9uIHJlcG9ydCBpcyBpbnZhbGlkLlhJbnZhbGlkRm9ya1ZvdGluZ1Byb29mAAIEKQFBIGZvcmsgdm90aW5nIHByb29mIHByb3ZpZGVkIGFzIHBhcnQgb2YgYW4gZXF1aXZvY2F0aW9uIHJlcG9ydCBpcyBpbnZhbGlkLnRJbnZhbGlkRnV0dXJlQmxvY2tWb3RpbmdQcm9vZgADBEkBQSBmdXR1cmUgYmxvY2sgdm90aW5nIHByb29mIHByb3ZpZGVkIGFzIHBhcnQgb2YgYW4gZXF1aXZvY2F0aW9uIHJlcG9ydCBpcyBpbnZhbGlkLnxJbnZhbGlkRXF1aXZvY2F0aW9uUHJvb2ZTZXNzaW9uAAQEwFRoZSBzZXNzaW9uIG9mIHRoZSBlcXVpdm9jYXRpb24gcHJvb2YgaXMgaW52YWxpZFhEdXBsaWNhdGVPZmZlbmNlUmVwb3J0AAUEFQFBIGdpdmVuIGVxdWl2b2NhdGlvbiByZXBvcnQgaXMgdmFsaWQgYnV0IGFscmVhZHkgcHJldmlvdXNseSByZXBvcnRlZC5QSW52YWxpZENvbmZpZ3VyYXRpb24ABgSMU3VibWl0dGVkIGNvbmZpZ3VyYXRpb24gaXMgaW52YWxpZC4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQuaQ8MSHNwX2NvbnNlbnN1c19iZWVmeQxtbXJEQmVlZnlBdXRob3JpdHlTZXQEWEF1dGhvcml0eVNldENvbW1pdG1lbnQBNAAMAQhpZDABVGNyYXRlOjpWYWxpZGF0b3JTZXRJZAABDGxlbhABDHUzMgABRGtleXNldF9jb21taXRtZW50NAFYQXV0aG9yaXR5U2V0Q29tbWl0bWVudAAAbQ8AAAQscQ9JCE0IUQhVCFkIYQh1D3kPZQh9DwBxDxAwZnJhbWVfc3lzdGVtKGV4dGVuc2lvbnM4YXV0aG9yaXplX2NhbGw0QXV0aG9yaXplQ2FsbAQEVAAAAAB1DxAwZnJhbWVfc3lzdGVtKGV4dGVuc2lvbnMwY2hlY2tfd2VpZ2h0LENoZWNrV2VpZ2h0BARUAAAAAHkPCGhwYWxsZXRfdHJhbnNhY3Rpb25fcGF5bWVudGBDaGFyZ2VUcmFuc2FjdGlvblBheW1lbnQEBFQAAAQA/QEBMEJhbGFuY2VPZjxUPgAAfQ8QMGZyYW1lX3N5c3RlbShleHRlbnNpb25zOHdlaWdodF9yZWNsYWltNFdlaWdodFJlY2xhaW0EBFQAAAAAgQ8QKHNwX3J1bnRpbWUcZ2VuZXJpYxRibG9jaxRCbG9jawgYSGVhZGVyAcUBJEV4dHJpbnNpYwGFDwAIARhoZWFkZXLFAQEYSGVhZGVyAAEoZXh0cmluc2ljc4kPAThWZWM8RXh0cmluc2ljPgAAhQ8QKHNwX3J1bnRpbWUcZ2VuZXJpY0x1bmNoZWNrZWRfZXh0cmluc2ljSFVuY2hlY2tlZEV4dHJpbnNpYxAcQWRkcmVzcwHtARBDYWxsAakBJFNpZ25hdHVyZQGVAxRFeHRyYQFtDwAEADgAAACJDwAAAoUPAI0PCChzcF9ydW50aW1lWEV4dHJpbnNpY0luY2x1c2lvbk1vZGUAAQg0QWxsRXh0cmluc2ljcwAAADRPbmx5SW5oZXJlbnRzAAEAAJEPCBxzcF9jb3JlOE9wYXF1ZU1ldGFkYXRhAAAEADgBHFZlYzx1OD4AAJUPBBhPcHRpb24EBFQBkQ8BCBBOb25lAAAAEFNvbWUEAJEPAAABAACZDww0ZnJhbWVfc3VwcG9ydDh2aWV3X2Z1bmN0aW9uczhWaWV3RnVuY3Rpb25JZAAACAEYcHJlZml4sAEgW3U4OyAxNl0AARhzdWZmaXiwASBbdTg7IDE2XQAAnQ8EGFJlc3VsdAgEVAE4BEUBoQ8BCAhPawQAOAAAAAAMRXJyBAChDwAAAQAAoQ8MNGZyYW1lX3N1cHBvcnQ4dmlld19mdW5jdGlvbnNkVmlld0Z1bmN0aW9uRGlzcGF0Y2hFcnJvcgABDDhOb3RJbXBsZW1lbnRlZAAAACBOb3RGb3VuZAQAmQ8BOFZpZXdGdW5jdGlvbklkAAEAFENvZGVjAAIAAKUPBBhSZXN1bHQIBFQBAQEERQGpDwEICE9rBAABAQAAAAAMRXJyBACpDwAAAQAAqQ8MKHNwX3J1bnRpbWVQdHJhbnNhY3Rpb25fdmFsaWRpdHlgVHJhbnNhY3Rpb25WYWxpZGl0eUVycm9yAAEIHEludmFsaWQEAK0PAUhJbnZhbGlkVHJhbnNhY3Rpb24AAAAcVW5rbm93bgQAsQ8BSFVua25vd25UcmFuc2FjdGlvbgABAACtDwwoc3BfcnVudGltZVB0cmFuc2FjdGlvbl92YWxpZGl0eUhJbnZhbGlkVHJhbnNhY3Rpb24AATQQQ2FsbAAAABxQYXltZW50AAEAGEZ1dHVyZQACABRTdGFsZQADACBCYWRQcm9vZgAEAERBbmNpZW50QmlydGhCbG9jawAFAERFeGhhdXN0c1Jlc291cmNlcwAGABhDdXN0b20EAAgBCHU4AAcAMEJhZE1hbmRhdG9yeQAIAExNYW5kYXRvcnlWYWxpZGF0aW9uAAkAJEJhZFNpZ25lcgAKAFRJbmRldGVybWluYXRlSW1wbGljaXQACwA0VW5rbm93bk9yaWdpbgAMAACxDwwoc3BfcnVudGltZVB0cmFuc2FjdGlvbl92YWxpZGl0eUhVbmtub3duVHJhbnNhY3Rpb24AAQwwQ2Fubm90TG9va3VwAAAATE5vVW5zaWduZWRWYWxpZGF0b3IAAQAYQ3VzdG9tBAAIAQh1OAACAAC1Dwgwc3BfaW5oZXJlbnRzMEluaGVyZW50RGF0YQAABAEQZGF0YbkPAZRCVHJlZU1hcDxJbmhlcmVudElkZW50aWZpZXIsIFZlYzx1OD4+AAC5DwQgQlRyZWVNYXAIBEsBJQMEVgE4AAQAvQ8AAAC9DwAAAsEPAMEPAAAECCUDOADFDwgwc3BfaW5oZXJlbnRzUENoZWNrSW5oZXJlbnRzUmVzdWx0AAAMARBva2F5IAEQYm9vbAABLGZhdGFsX2Vycm9yIAEQYm9vbAABGGVycm9yc7UPATBJbmhlcmVudERhdGEAAMkPDChzcF9ydW50aW1lUHRyYW5zYWN0aW9uX3ZhbGlkaXR5RFRyYW5zYWN0aW9uU291cmNlAAEMHEluQmxvY2sAAAAUTG9jYWwAAQAgRXh0ZXJuYWwAAgAAzQ8EGFJlc3VsdAgEVAHRDwRFAakPAQgIT2sEANEPAAAAAAxFcnIEAKkPAAABAADRDwwoc3BfcnVudGltZVB0cmFuc2FjdGlvbl92YWxpZGl0eUBWYWxpZFRyYW5zYWN0aW9uAAAUASBwcmlvcml0eTABTFRyYW5zYWN0aW9uUHJpb3JpdHkAASByZXF1aXJlc7kBAUxWZWM8VHJhbnNhY3Rpb25UYWc+AAEgcHJvdmlkZXO5AQFMVmVjPFRyYW5zYWN0aW9uVGFnPgABJGxvbmdldml0eTABUFRyYW5zYWN0aW9uTG9uZ2V2aXR5AAEkcHJvcGFnYXRlIAEQYm9vbAAA1Q8AAAQITQ3ZDwDZDwxMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2OERHcm91cFJvdGF0aW9uSW5mbwQETgEQAAwBTHNlc3Npb25fc3RhcnRfYmxvY2sQAQROAAFgZ3JvdXBfcm90YXRpb25fZnJlcXVlbmN5EAEETgABDG5vdxABBE4AAN0PAAAC4Q8A4Q8MTHBvbGthZG90X3ByaW1pdGl2ZXMgdnN0YWdpbmckQ29yZVN0YXRlCARIATQETgEQAQwgT2NjdXBpZWQEAOUPAUhPY2N1cGllZENvcmU8SCwgTj4AAAAkU2NoZWR1bGVkBADtDwE0U2NoZWR1bGVkQ29yZQABABBGcmVlAAIAAOUPDExwb2xrYWRvdF9wcmltaXRpdmVzIHZzdGFnaW5nME9jY3VwaWVkQ29yZQgESAE0BE4BEAAgAVBuZXh0X3VwX29uX2F2YWlsYWJsZekPAVRPcHRpb248U2NoZWR1bGVkQ29yZT4AAThvY2N1cGllZF9zaW5jZRABBE4AASx0aW1lX291dF9hdBABBE4AAUxuZXh0X3VwX29uX3RpbWVfb3V06Q8BVE9wdGlvbjxTY2hlZHVsZWRDb3JlPgABMGF2YWlsYWJpbGl0eZ0FAXxCaXRWZWM8dTgsIGJpdHZlYzo6b3JkZXI6OkxzYjA+AAFEZ3JvdXBfcmVzcG9uc2libGXVCAEoR3JvdXBJbmRleAABOGNhbmRpZGF0ZV9oYXNo9QUBNENhbmRpZGF0ZUhhc2gAAVBjYW5kaWRhdGVfZGVzY3JpcHRvcrkFAWBDYW5kaWRhdGVEZXNjcmlwdG9yVjI8SD4AAOkPBBhPcHRpb24EBFQB7Q8BCBBOb25lAAAAEFNvbWUEAO0PAAABAADtDwxMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2ODRTY2hlZHVsZWRDb3JlAAAIARxwYXJhX2lksQIBCElkAAEgY29sbGF0b3LxDwFIT3B0aW9uPENvbGxhdG9ySWQ+AADxDwQYT3B0aW9uBARUAfUPAQgQTm9uZQAAABBTb21lBAD1DwAAAQAA9Q8QTHBvbGthZG90X3ByaW1pdGl2ZXMIdjgwY29sbGF0b3JfYXBwGFB1YmxpYwAABAAEATxzcjI1NTE5OjpQdWJsaWMAAPkPDExwb2xrYWRvdF9wcmltaXRpdmVzCHY4WE9jY3VwaWVkQ29yZUFzc3VtcHRpb24AAQwgSW5jbHVkZWQAAAAgVGltZWRPdXQAAQAQRnJlZQACAAD9DwQYT3B0aW9uBARUAQEQAQgQTm9uZQAAABBTb21lBAABEAAAAQAAARAMTHBvbGthZG90X3ByaW1pdGl2ZXMIdjhcUGVyc2lzdGVkVmFsaWRhdGlvbkRhdGEIBEgBNAROARAAEAEscGFyZW50X2hlYWThBQEgSGVhZERhdGEAAUxyZWxheV9wYXJlbnRfbnVtYmVyEAEETgABZHJlbGF5X3BhcmVudF9zdG9yYWdlX3Jvb3Q0AQRIAAEwbWF4X3Bvdl9zaXplEAEMdTMyAAAFEAQYT3B0aW9uBARUAQkQAQgQTm9uZQAAABBTb21lBAAJEAAAAQAACRAAAAQIARDBBQANEAQYT3B0aW9uBARUAbUFAQgQTm9uZQAAABBTb21lBAC1BQAAAQAAERAAAAIVEAAVEAxMcG9sa2Fkb3RfcHJpbWl0aXZlcyB2c3RhZ2luZzhDYW5kaWRhdGVFdmVudAQESAE0AQw8Q2FuZGlkYXRlQmFja2VkEADNCAFUQ2FuZGlkYXRlUmVjZWlwdFYyPEg+AADhBQEgSGVhZERhdGEAANEIASRDb3JlSW5kZXgAANUIAShHcm91cEluZGV4AAAARENhbmRpZGF0ZUluY2x1ZGVkEADNCAFUQ2FuZGlkYXRlUmVjZWlwdFYyPEg+AADhBQEgSGVhZERhdGEAANEIASRDb3JlSW5kZXgAANUIAShHcm91cEluZGV4AAEARENhbmRpZGF0ZVRpbWVkT3V0DADNCAFUQ2FuZGlkYXRlUmVjZWlwdFYyPEg+AADhBQEgSGVhZERhdGEAANEIASRDb3JlSW5kZXgAAgAAGRAEIEJUcmVlTWFwCARLAbECBFYBwQ0ABAAdEAAAAB0QAAACIRAAIRAAAAQIsQLBDQAlEAQYT3B0aW9uBARUATUNAQgQTm9uZQAAABBTb21lBAA1DQAAAQAAKRAEGE9wdGlvbgQEVAHZDQEIEE5vbmUAAAAQU29tZQQA2Q0AAAEAAC0QBBhPcHRpb24EBFQBwQUBCBBOb25lAAAAEFNvbWUEAMEFAAABAAAxEAAAAjUQADUQAAAEDBD1BekNADkQBBhPcHRpb24EBFQBZQUBCBBOb25lAAAAEFNvbWUEAGUFAAABAAA9EAAAAkEQAEEQAAAEDBD1BUUQAEUQEExwb2xrYWRvdF9wcmltaXRpdmVzCHY4IHNsYXNoaW5nOFBlbmRpbmdTbGFzaGVzAAAIARBrZXlz+Q0BlEJUcmVlTWFwPFZhbGlkYXRvckluZGV4LCBWYWxpZGF0b3JJZD4AARBraW5kSRABTFNsYXNoaW5nT2ZmZW5jZUtpbmQAAEkQEExwb2xrYWRvdF9wcmltaXRpdmVzCHY4IHNsYXNoaW5nTFNsYXNoaW5nT2ZmZW5jZUtpbmQAAQgoRm9ySW52YWxpZAAAADBBZ2FpbnN0VmFsaWQAAQAATRAEGE9wdGlvbgQEVAFREAEIEE5vbmUAAAAQU29tZQQAURAAAAEAAFEQEExwb2xrYWRvdF9wcmltaXRpdmVzCHY4IHNsYXNoaW5nXE9wYXF1ZUtleU93bmVyc2hpcFByb29mAAAEADgBHFZlYzx1OD4AAFUQEExwb2xrYWRvdF9wcmltaXRpdmVzCHY4IHNsYXNoaW5nMERpc3B1dGVQcm9vZgAAEAEkdGltZV9zbG90MQYBQERpc3B1dGVzVGltZVNsb3QAARBraW5kSRABTFNsYXNoaW5nT2ZmZW5jZUtpbmQAATx2YWxpZGF0b3JfaW5kZXilBQE4VmFsaWRhdG9ySW5kZXgAATB2YWxpZGF0b3JfaWRZAgEsVmFsaWRhdG9ySWQAAFkQBBhPcHRpb24EBFQBBQEBCBBOb25lAAAAEFNvbWUEAAUBAAABAABdEAQYT3B0aW9uBARUAWEQAQgQTm9uZQAAABBTb21lBABhEAAAAQAAYRAQTHBvbGthZG90X3ByaW1pdGl2ZXMgdnN0YWdpbmc0YXN5bmNfYmFja2luZzBCYWNraW5nU3RhdGUIBEgBNAROARAACAEsY29uc3RyYWludHNlEAGQY3JhdGU6OmFzeW5jX2JhY2tpbmc6OkNvbnN0cmFpbnRzPE4+AAFQcGVuZGluZ19hdmFpbGFiaWxpdHmFEAGcVmVjPENhbmRpZGF0ZVBlbmRpbmdBdmFpbGFiaWxpdHk8SCwgTj4+AABlEBBMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2ODRhc3luY19iYWNraW5nLENvbnN0cmFpbnRzBAROARAAOAFcbWluX3JlbGF5X3BhcmVudF9udW1iZXIQAQROAAEwbWF4X3Bvdl9zaXplEAEMdTMyAAE0bWF4X2NvZGVfc2l6ZRABDHUzMgABNHVtcF9yZW1haW5pbmcQAQx1MzIAAUx1bXBfcmVtYWluaW5nX2J5dGVzEAEMdTMyAAFkbWF4X3VtcF9udW1fcGVyX2NhbmRpZGF0ZRABDHUzMgABWGRtcF9yZW1haW5pbmdfbWVzc2FnZXORAQEYVmVjPE4+AAEwaHJtcF9pbmJvdW5kaRABZEluYm91bmRIcm1wTGltaXRhdGlvbnM8Tj4AAURocm1wX2NoYW5uZWxzX291dG0QAaRWZWM8KElkLCBPdXRib3VuZEhybXBDaGFubmVsTGltaXRhdGlvbnMpPgABaG1heF9ocm1wX251bV9wZXJfY2FuZGlkYXRlEAEMdTMyAAE8cmVxdWlyZWRfcGFyZW504QUBIEhlYWREYXRhAAFQdmFsaWRhdGlvbl9jb2RlX2hhc2jBBQFIVmFsaWRhdGlvbkNvZGVIYXNoAAFMdXBncmFkZV9yZXN0cmljdGlvbnkQAWhPcHRpb248VXBncmFkZVJlc3RyaWN0aW9uPgABWGZ1dHVyZV92YWxpZGF0aW9uX2NvZGV9EAF8T3B0aW9uPChOLCBWYWxpZGF0aW9uQ29kZUhhc2gpPgAAaRAQTHBvbGthZG90X3ByaW1pdGl2ZXMIdjg0YXN5bmNfYmFja2luZ1hJbmJvdW5kSHJtcExpbWl0YXRpb25zBAROARAABAFAdmFsaWRfd2F0ZXJtYXJrc5EBARhWZWM8Tj4AAG0QAAACcRAAcRAAAAQIsQJ1EAB1EBBMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2ODRhc3luY19iYWNraW5neE91dGJvdW5kSHJtcENoYW5uZWxMaW1pdGF0aW9ucwAACAE8Ynl0ZXNfcmVtYWluaW5nEAEMdTMyAAFIbWVzc2FnZXNfcmVtYWluaW5nEAEMdTMyAAB5EAQYT3B0aW9uBARUAZ0NAQgQTm9uZQAAABBTb21lBACdDQAAAQAAfRAEGE9wdGlvbgQEVAGBEAEIEE5vbmUAAAAQU29tZQQAgRAAAAEAAIEQAAAECBDBBQCFEAAAAokQAIkQEExwb2xrYWRvdF9wcmltaXRpdmVzIHZzdGFnaW5nNGFzeW5jX2JhY2tpbmdwQ2FuZGlkYXRlUGVuZGluZ0F2YWlsYWJpbGl0eQgESAE0BE4BEAAUAThjYW5kaWRhdGVfaGFzaPUFATRDYW5kaWRhdGVIYXNoAAEoZGVzY3JpcHRvcrkFAWBDYW5kaWRhdGVEZXNjcmlwdG9yVjI8SD4AASxjb21taXRtZW50c8UFAVBDYW5kaWRhdGVDb21taXRtZW50cwABTHJlbGF5X3BhcmVudF9udW1iZXIQAQROAAEwbWF4X3Bvdl9zaXplEAEMdTMyAACNEAQgQlRyZWVNYXAIBEsB0QgEVgF5DQAEAJEQAAAAkRAAAAKVEACVEAAABAjRCHkNAJkQAAACtQUAnRAEGE9wdGlvbgQEVAGhEAEIEE5vbmUAAAAQU29tZQQAoRAAAAEAAKEQEExwb2xrYWRvdF9wcmltaXRpdmVzIHZzdGFnaW5nNGFzeW5jX2JhY2tpbmcsQ29uc3RyYWludHMEBE4BEAA8AVxtaW5fcmVsYXlfcGFyZW50X251bWJlchABBE4AATBtYXhfcG92X3NpemUQAQx1MzIAATRtYXhfY29kZV9zaXplEAEMdTMyAAFIbWF4X2hlYWRfZGF0YV9zaXplEAEMdTMyAAE0dW1wX3JlbWFpbmluZxABDHUzMgABTHVtcF9yZW1haW5pbmdfYnl0ZXMQAQx1MzIAAWRtYXhfdW1wX251bV9wZXJfY2FuZGlkYXRlEAEMdTMyAAFYZG1wX3JlbWFpbmluZ19tZXNzYWdlc5EBARhWZWM8Tj4AATBocm1wX2luYm91bmRpEAFkSW5ib3VuZEhybXBMaW1pdGF0aW9uczxOPgABRGhybXBfY2hhbm5lbHNfb3V0bRABpFZlYzwoSWQsIE91dGJvdW5kSHJtcENoYW5uZWxMaW1pdGF0aW9ucyk+AAFobWF4X2hybXBfbnVtX3Blcl9jYW5kaWRhdGUQAQx1MzIAATxyZXF1aXJlZF9wYXJlbnThBQEgSGVhZERhdGEAAVB2YWxpZGF0aW9uX2NvZGVfaGFzaMEFAUhWYWxpZGF0aW9uQ29kZUhhc2gAAUx1cGdyYWRlX3Jlc3RyaWN0aW9ueRABaE9wdGlvbjxVcGdyYWRlUmVzdHJpY3Rpb24+AAFYZnV0dXJlX3ZhbGlkYXRpb25fY29kZX0QAXxPcHRpb248KE4sIFZhbGlkYXRpb25Db2RlSGFzaCk+AAClEAQYT3B0aW9uBARUAakQAQgQTm9uZQAAABBTb21lBACpEAAAAQAAqRAISHNwX2NvbnNlbnN1c19iZWVmeTBWYWxpZGF0b3JTZXQELEF1dGhvcml0eUlkAWUCAAgBKHZhbGlkYXRvcnNhDwFAVmVjPEF1dGhvcml0eUlkPgABCGlkMAE4VmFsaWRhdG9yU2V0SWQAAK0QCChzcF9ydW50aW1lLE9wYXF1ZVZhbHVlAAAEADgBHFZlYzx1OD4AALEQCEhzcF9jb25zZW5zdXNfYmVlZnk8Rm9ya1ZvdGluZ1Byb29mDBhIZWFkZXIBxQEISWQBZQI0QW5jZXN0cnlQcm9vZgGtEAAMARB2b3RleQgBuFZvdGVNZXNzYWdlPEhlYWRlcjo6TnVtYmVyLCBJZCwgSWQ6OlNpZ25hdHVyZT4AAThhbmNlc3RyeV9wcm9vZq0QATRBbmNlc3RyeVByb29mAAEYaGVhZGVyxQEBGEhlYWRlcgAAtRAEGE9wdGlvbgQEVAGtEAEIEE5vbmUAAAAQU29tZQQArRAAAAEAALkQBBhSZXN1bHQIBFQBNARFAb0QAQgIT2sEADQAAAAADEVycgQAvRAAAAEAAL0QCERzcF9tbXJfcHJpbWl0aXZlcxRFcnJvcgABKEBJbnZhbGlkTnVtZXJpY09wAAAAEFB1c2gAAQAcR2V0Um9vdAACABhDb21taXQAAwA0R2VuZXJhdGVQcm9vZgAEABhWZXJpZnkABQAwTGVhZk5vdEZvdW5kAAYARFBhbGxldE5vdEluY2x1ZGVkAAcAQEludmFsaWRMZWFmSW5kZXgACABUSW52YWxpZEJlc3RLbm93bkJsb2NrAAkAAMEQBBhSZXN1bHQIBFQBMARFAb0QAQgIT2sEADAAAAAADEVycgQAvRAAAAEAAMUQBBhSZXN1bHQIBFQByRAERQG9EAEICE9rBADJEAAAAAAMRXJyBAC9EAAAAQAAyRAAAAQIzRDVEADNEAAAAtEQANEQCERzcF9tbXJfcHJpbWl0aXZlc0xFbmNvZGFibGVPcGFxdWVMZWFmAAAEADgBHFZlYzx1OD4AANUQCERzcF9tbXJfcHJpbWl0aXZlcyRMZWFmUHJvb2YEEEhhc2gBNAAMATBsZWFmX2luZGljZXPhCwE4VmVjPExlYWZJbmRleD4AAShsZWFmX2NvdW50MAEkTm9kZUluZGV4AAEUaXRlbXO5AwEkVmVjPEhhc2g+AADZEAQYUmVzdWx0CARUAQUBBEUBvRABCAhPawQABQEAAAAADEVycgQAvRAAAAEAAN0QCERzcF9jb25zZW5zdXNfYmFiZURCYWJlQ29uZmlndXJhdGlvbgAAGAE0c2xvdF9kdXJhdGlvbjABDHU2NAABMGVwb2NoX2xlbmd0aDABDHU2NAABBGPdAQEoKHU2NCwgdTY0KQABLGF1dGhvcml0aWVziQkBnFZlYzwoQXV0aG9yaXR5SWQsIEJhYmVBdXRob3JpdHlXZWlnaHQpPgABKHJhbmRvbW5lc3MEAShSYW5kb21uZXNzAAE0YWxsb3dlZF9zbG90c+EBATBBbGxvd2VkU2xvdHMAAOEQCERzcF9jb25zZW5zdXNfYmFiZRRFcG9jaAAAGAEsZXBvY2hfaW5kZXgwAQx1NjQAAShzdGFydF9zbG900QEBEFNsb3QAASBkdXJhdGlvbjABDHU2NAABLGF1dGhvcml0aWVziQkBnFZlYzwoQXV0aG9yaXR5SWQsIEJhYmVBdXRob3JpdHlXZWlnaHQpPgABKHJhbmRvbW5lc3MEAShSYW5kb21uZXNzAAEYY29uZmlnrQkBWEJhYmVFcG9jaENvbmZpZ3VyYXRpb24AAOUQBBhPcHRpb24EBFQB6RABCBBOb25lAAAAEFNvbWUEAOkQAAABAADpEAhEc3BfY29uc2Vuc3VzX2JhYmVcT3BhcXVlS2V5T3duZXJzaGlwUHJvb2YAAAQAOAEcVmVjPHU4PgAA7RAEGE9wdGlvbgQEVAHxEAEIEE5vbmUAAAAQU29tZQQA8RAAAAEAAPEQAAAC9RAA9RAAAAQIOKUKAPkQDGhwYWxsZXRfdHJhbnNhY3Rpb25fcGF5bWVudBR0eXBlc0xSdW50aW1lRGlzcGF0Y2hJbmZvCBxCYWxhbmNlARgYV2VpZ2h0ASgADAEYd2VpZ2h0KAEYV2VpZ2h0AAEUY2xhc3NgATREaXNwYXRjaENsYXNzAAEscGFydGlhbF9mZWUYARxCYWxhbmNlAAD9EAxocGFsbGV0X3RyYW5zYWN0aW9uX3BheW1lbnQUdHlwZXMoRmVlRGV0YWlscwQcQmFsYW5jZQEYAAgBNGluY2x1c2lvbl9mZWUBEQF0T3B0aW9uPEluY2x1c2lvbkZlZTxCYWxhbmNlPj4AAQx0aXAYARxCYWxhbmNlAAABEQQYT3B0aW9uBARUAQURAQgQTm9uZQAAABBTb21lBAAFEQAAAQAABREMaHBhbGxldF90cmFuc2FjdGlvbl9wYXltZW50FHR5cGVzMEluY2x1c2lvbkZlZQQcQmFsYW5jZQEYAAwBIGJhc2VfZmVlGAEcQmFsYW5jZQABHGxlbl9mZWUYARxCYWxhbmNlAAFMYWRqdXN0ZWRfd2VpZ2h0X2ZlZRgBHEJhbGFuY2UAAAkRBBhSZXN1bHQIBFQBDREERQEREQEICE9rBAANEQAAAAAMRXJyBAAREQAAAQAADREAAAIVCAAREQxAeGNtX3J1bnRpbWVfYXBpcxBmZWVzFEVycm9yAAEYNFVuaW1wbGVtZW50ZWQAAABkVmVyc2lvbmVkQ29udmVyc2lvbkZhaWxlZAABAExXZWlnaHROb3RDb21wdXRhYmxlAAIATFVuaGFuZGxlZFhjbVZlcnNpb24AAwA0QXNzZXROb3RGb3VuZAAEAChVbnJvdXRhYmxlAAUAABURBBhSZXN1bHQIBFQBKARFARERAQgIT2sEACgAAAAADEVycgQAEREAAAEAABkRBBhSZXN1bHQIBFQBGARFARERAQgIT2sEABgAAAAADEVycgQAEREAAAEAAB0RBBhSZXN1bHQIBFQB4QcERQEREQEICE9rBADhBwAAAAAMRXJyBAAREQAAAQAAIREEGFJlc3VsdAgEVAElEQRFAT0RAQgIT2sEACURAAAAAAxFcnIEAD0RAAABAAAlEQxAeGNtX3J1bnRpbWVfYXBpcxxkcnlfcnVuRENhbGxEcnlSdW5FZmZlY3RzBBRFdmVudAFUABABQGV4ZWN1dGlvbl9yZXN1bHS1CAFoRGlzcGF0Y2hSZXN1bHRXaXRoUG9zdEluZm8AAThlbWl0dGVkX2V2ZW50cykRAShWZWM8RXZlbnQ+AAEkbG9jYWxfeGNtLREBYE9wdGlvbjxWZXJzaW9uZWRYY208KCk+PgABOGZvcndhcmRlZF94Y21zMREBvFZlYzwoVmVyc2lvbmVkTG9jYXRpb24sIFZlYzxWZXJzaW9uZWRYY208KCk+Pik+AAApEQAAAlQALREEGE9wdGlvbgQEVAFNBgEIEE5vbmUAAAAQU29tZQQATQYAAAEAADERAAACNREANREAAAQIWQU5EQA5EQAAAk0GAD0RDEB4Y21fcnVudGltZV9hcGlzHGRyeV9ydW4URXJyb3IAAQg0VW5pbXBsZW1lbnRlZAAAAGRWZXJzaW9uZWRDb252ZXJzaW9uRmFpbGVkAAEAAEERBBhSZXN1bHQIBFQBRREERQE9EQEICE9rBABFEQAAAAAMRXJyBAA9EQAAAQAARREMQHhjbV9ydW50aW1lX2FwaXMcZHJ5X3J1bkBYY21EcnlSdW5FZmZlY3RzBBRFdmVudAFUAAwBQGV4ZWN1dGlvbl9yZXN1bHQZCQEcT3V0Y29tZQABOGVtaXR0ZWRfZXZlbnRzKREBKFZlYzxFdmVudD4AAThmb3J3YXJkZWRfeGNtczERAbxWZWM8KFZlcnNpb25lZExvY2F0aW9uLCBWZWM8VmVyc2lvbmVkWGNtPCgpPj4pPgAASREEGFJlc3VsdAgEVAEABEUBTREBCAhPawQAAAAAAAAMRXJyBABNEQAAAQAATREMQHhjbV9ydW50aW1lX2FwaXMsY29udmVyc2lvbnMURXJyb3IAAQgsVW5zdXBwb3J0ZWQAAABkVmVyc2lvbmVkQ29udmVyc2lvbkZhaWxlZAABAABREQQYUmVzdWx0CARUAQUBBEUBTQkBCAhPawQABQEAAAAADEVycgQATQkAAAEAAFURBBhPcHRpb24EBFQBTQkBCBBOb25lAAAAEFNvbWUEAE0JAAABAABZEQAAAk0JAF0RCAx4Y204VmVyc2lvbmVkQXNzZXQAAQwIVjMEAGUGATh2Mzo6TXVsdGlBc3NldAADAAhWNAQAzQYBJHY0OjpBc3NldAAEAAhWNQQAFQcBJHY1OjpBc3NldAAFAABhEQQYUmVzdWx0CARUASAERQFlEQEICE9rBAAgAAAAAAxFcnIEAGURAAABAABlEQxAeGNtX3J1bnRpbWVfYXBpczR0cnVzdGVkX3F1ZXJ5FEVycm9yAAEIeFZlcnNpb25lZEFzc2V0Q29udmVyc2lvbkZhaWxlZAAAAIRWZXJzaW9uZWRMb2NhdGlvbkNvbnZlcnNpb25GYWlsZWQAAQAAaREIPHdlc3RlbmRfcnVudGltZTBSdW50aW1lRXJyb3IAAcAYU3lzdGVtBAB9CQFwZnJhbWVfc3lzdGVtOjpFcnJvcjxSdW50aW1lPgAAABBCYWJlBAC9CQFscGFsbGV0X2JhYmU6OkVycm9yPFJ1bnRpbWU+AAEAHEluZGljZXMEAMUJAXhwYWxsZXRfaW5kaWNlczo6RXJyb3I8UnVudGltZT4AAwAgQmFsYW5jZXMEAB0KAXxwYWxsZXRfYmFsYW5jZXM6OkVycm9yPFJ1bnRpbWU+AAQAHFN0YWtpbmcEAHkKAXhwYWxsZXRfc3Rha2luZzo6RXJyb3I8UnVudGltZT4ABgAcU2Vzc2lvbgQAqQoBeHBhbGxldF9zZXNzaW9uOjpFcnJvcjxSdW50aW1lPgAIABxHcmFuZHBhBAC5CgF4cGFsbGV0X2dyYW5kcGE6OkVycm9yPFJ1bnRpbWU+AAoAHFV0aWxpdHkEAMUKAXhwYWxsZXRfdXRpbGl0eTo6RXJyb3I8UnVudGltZT4AEAAgSWRlbnRpdHkEAAULAXxwYWxsZXRfaWRlbnRpdHk6OkVycm9yPFJ1bnRpbWU+ABEAIFJlY292ZXJ5BAAZCwF8cGFsbGV0X3JlY292ZXJ5OjpFcnJvcjxSdW50aW1lPgASABxWZXN0aW5nBAApCwF4cGFsbGV0X3Zlc3Rpbmc6OkVycm9yPFJ1bnRpbWU+ABMAJFNjaGVkdWxlcgQAQQsBgHBhbGxldF9zY2hlZHVsZXI6OkVycm9yPFJ1bnRpbWU+ABQAIFByZWltYWdlBABhCwF8cGFsbGV0X3ByZWltYWdlOjpFcnJvcjxSdW50aW1lPgAcABBTdWRvBABlCwFscGFsbGV0X3N1ZG86OkVycm9yPFJ1bnRpbWU+ABUAFFByb3h5BACJCwFwcGFsbGV0X3Byb3h5OjpFcnJvcjxSdW50aW1lPgAWACBNdWx0aXNpZwQAmQsBfHBhbGxldF9tdWx0aXNpZzo6RXJyb3I8UnVudGltZT4AFwBoRWxlY3Rpb25Qcm92aWRlck11bHRpUGhhc2UEANULAdBwYWxsZXRfZWxlY3Rpb25fcHJvdmlkZXJfbXVsdGlfcGhhc2U6OkVycm9yPFJ1bnRpbWU+ABgAJFZvdGVyTGlzdAQA5QsB9HBhbGxldF9iYWdzX2xpc3Q6OkVycm9yPFJ1bnRpbWUsIHBhbGxldF9iYWdzX2xpc3Q6Okluc3RhbmNlMT4AGQA8Tm9taW5hdGlvblBvb2xzBAAxDAGccGFsbGV0X25vbWluYXRpb25fcG9vbHM6OkVycm9yPFJ1bnRpbWU+AB0ALEZhc3RVbnN0YWtlBABFDAGMcGFsbGV0X2Zhc3RfdW5zdGFrZTo6RXJyb3I8UnVudGltZT4AHgBAQ29udmljdGlvblZvdGluZwQAeQwBoHBhbGxldF9jb252aWN0aW9uX3ZvdGluZzo6RXJyb3I8UnVudGltZT4AHwAkUmVmZXJlbmRhBAC5DAGAcGFsbGV0X3JlZmVyZW5kYTo6RXJyb3I8UnVudGltZT4AIAAkV2hpdGVsaXN0BAC9DAGAcGFsbGV0X3doaXRlbGlzdDo6RXJyb3I8UnVudGltZT4AJAAgVHJlYXN1cnkEANUMAXxwYWxsZXRfdHJlYXN1cnk6OkVycm9yPFJ1bnRpbWU+ACUAQERlbGVnYXRlZFN0YWtpbmcEAOEMAaBwYWxsZXRfZGVsZWdhdGVkX3N0YWtpbmc6OkVycm9yPFJ1bnRpbWU+ACYANENvbmZpZ3VyYXRpb24EAPEMAaBwYXJhY2hhaW5zX2NvbmZpZ3VyYXRpb246OkVycm9yPFJ1bnRpbWU+ACoANFBhcmFJbmNsdXNpb24EADENAZBwYXJhY2hhaW5zX2luY2x1c2lvbjo6RXJyb3I8UnVudGltZT4ALAAwUGFyYUluaGVyZW50BABJDQGkcGFyYWNoYWluc19wYXJhc19pbmhlcmVudDo6RXJyb3I8UnVudGltZT4ALQAUUGFyYXMEAKENAYBwYXJhY2hhaW5zX3BhcmFzOjpFcnJvcjxSdW50aW1lPgAvABBIcm1wBADRDQF8cGFyYWNoYWluc19ocm1wOjpFcnJvcjxSdW50aW1lPgAzADRQYXJhc0Rpc3B1dGVzBADxDQGMcGFyYWNoYWluc19kaXNwdXRlczo6RXJyb3I8UnVudGltZT4ANQA0UGFyYXNTbGFzaGluZwQABQ4BjHBhcmFjaGFpbnNfc2xhc2hpbmc6OkVycm9yPFJ1bnRpbWU+ADYAaE9uRGVtYW5kQXNzaWdubWVudFByb3ZpZGVyBAA1DgGQcGFyYWNoYWluc19vbl9kZW1hbmQ6OkVycm9yPFJ1bnRpbWU+ADgAaENvcmV0aW1lQXNzaWdubWVudFByb3ZpZGVyBABhDgGwcGFyYWNoYWluc19hc3NpZ25lcl9jb3JldGltZTo6RXJyb3I8UnVudGltZT4AOQAkUmVnaXN0cmFyBABpDgF8cGFyYXNfcmVnaXN0cmFyOjpFcnJvcjxSdW50aW1lPgA8ABRTbG90cwQAcQ4BVHNsb3RzOjpFcnJvcjxSdW50aW1lPgA9AEBQYXJhc1N1ZG9XcmFwcGVyBAB1DgGIcGFyYXNfc3Vkb193cmFwcGVyOjpFcnJvcjxSdW50aW1lPgA+ACBBdWN0aW9ucwQAiQ4BYGF1Y3Rpb25zOjpFcnJvcjxSdW50aW1lPgA/ACRDcm93ZGxvYW4EAJUOAWRjcm93ZGxvYW46OkVycm9yPFJ1bnRpbWU+AEAANEFzc2lnbmVkU2xvdHMEAJ0OAXhhc3NpZ25lZF9zbG90czo6RXJyb3I8UnVudGltZT4AQQAgQ29yZXRpbWUEAKEOAWBjb3JldGltZTo6RXJyb3I8UnVudGltZT4AQgA8U3Rha2luZ0FoQ2xpZW50BADFDgG4cGFsbGV0X3N0YWtpbmdfYXN5bmNfYWhfY2xpZW50OjpFcnJvcjxSdW50aW1lPgBDAFBNdWx0aUJsb2NrTWlncmF0aW9ucwQAyQ4BhHBhbGxldF9taWdyYXRpb25zOjpFcnJvcjxSdW50aW1lPgBiACRYY21QYWxsZXQEADEPAWhwYWxsZXRfeGNtOjpFcnJvcjxSdW50aW1lPgBjADBNZXNzYWdlUXVldWUEAFEPAZBwYWxsZXRfbWVzc2FnZV9xdWV1ZTo6RXJyb3I8UnVudGltZT4AZAAkQXNzZXRSYXRlBABVDwGEcGFsbGV0X2Fzc2V0X3JhdGU6OkVycm9yPFJ1bnRpbWU+AGUAGE1ldGFUeAQAWQ8BeHBhbGxldF9tZXRhX3R4OjpFcnJvcjxSdW50aW1lPgBnABRCZWVmeQQAZQ8BcHBhbGxldF9iZWVmeTo6RXJyb3I8UnVudGltZT4AyAAADQEYU3lzdGVtARhTeXN0ZW1MHEFjY291bnQBAQQCAAxBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACABOggVGhlIGZ1bGwgYWNjb3VudCBpbmZvcm1hdGlvbiBmb3IgYSBwYXJ0aWN1bGFyIGFjY291bnQgSUQuOEV4dHJpbnNpY0NvdW50AAAQBAAEuCBUb3RhbCBleHRyaW5zaWNzIGNvdW50IGZvciB0aGUgY3VycmVudCBibG9jay5ASW5oZXJlbnRzQXBwbGllZAEAIAQABKQgV2hldGhlciBhbGwgaW5oZXJlbnRzIGhhdmUgYmVlbiBhcHBsaWVkLixCbG9ja1dlaWdodAEAJBgAAAAAAAAEiCBUaGUgY3VycmVudCB3ZWlnaHQgZm9yIHRoZSBibG9jay5AQWxsRXh0cmluc2ljc0xlbgAAEAQABEEBIFRvdGFsIGxlbmd0aCAoaW4gYnl0ZXMpIGZvciBhbGwgZXh0cmluc2ljcyBwdXQgdG9nZXRoZXIsIGZvciB0aGUgY3VycmVudCBibG9jay4kQmxvY2tIYXNoAQEEBRA0gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABJggTWFwIG9mIGJsb2NrIG51bWJlcnMgdG8gYmxvY2sgaGFzaGVzLjRFeHRyaW5zaWNEYXRhAQEEBRA4BAAEPQEgRXh0cmluc2ljcyBkYXRhIGZvciB0aGUgY3VycmVudCBibG9jayAobWFwcyBhbiBleHRyaW5zaWMncyBpbmRleCB0byBpdHMgZGF0YSkuGE51bWJlcgEAEBAAAAAABAkBIFRoZSBjdXJyZW50IGJsb2NrIG51bWJlciBiZWluZyBwcm9jZXNzZWQuIFNldCBieSBgZXhlY3V0ZV9ibG9ja2AuKFBhcmVudEhhc2gBADSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEcCBIYXNoIG9mIHRoZSBwcmV2aW91cyBibG9jay4YRGlnZXN0AQA8BAAE8CBEaWdlc3Qgb2YgdGhlIGN1cnJlbnQgYmxvY2ssIGFsc28gcGFydCBvZiB0aGUgYmxvY2sgaGVhZGVyLhhFdmVudHMBAEwEABygIEV2ZW50cyBkZXBvc2l0ZWQgZm9yIHRoZSBjdXJyZW50IGJsb2NrLgAdASBOT1RFOiBUaGUgaXRlbSBpcyB1bmJvdW5kIGFuZCBzaG91bGQgdGhlcmVmb3JlIG5ldmVyIGJlIHJlYWQgb24gY2hhaW4u0CBJdCBjb3VsZCBvdGhlcndpc2UgaW5mbGF0ZSB0aGUgUG9WIHNpemUgb2YgYSBibG9jay4ALQEgRXZlbnRzIGhhdmUgYSBsYXJnZSBpbi1tZW1vcnkgc2l6ZS4gQm94IHRoZSBldmVudHMgdG8gbm90IGdvIG91dC1vZi1tZW1vcnn8IGp1c3QgaW4gY2FzZSBzb21lb25lIHN0aWxsIHJlYWRzIHRoZW0gZnJvbSB3aXRoaW4gdGhlIHJ1bnRpbWUuKEV2ZW50Q291bnQBABAQAAAAAAS4IFRoZSBudW1iZXIgb2YgZXZlbnRzIGluIHRoZSBgRXZlbnRzPFQ+YCBsaXN0LixFdmVudFRvcGljcwEBBAI0QQkEACglASBNYXBwaW5nIGJldHdlZW4gYSB0b3BpYyAocmVwcmVzZW50ZWQgYnkgVDo6SGFzaCkgYW5kIGEgdmVjdG9yIG9mIGluZGV4ZXOUIG9mIGV2ZW50cyBpbiB0aGUgYDxFdmVudHM8VD4+YCBsaXN0LgBRASBBbGwgdG9waWMgdmVjdG9ycyBoYXZlIGRldGVybWluaXN0aWMgc3RvcmFnZSBsb2NhdGlvbnMgZGVwZW5kaW5nIG9uIHRoZSB0b3BpYy4gVGhpc0UBIGFsbG93cyBsaWdodC1jbGllbnRzIHRvIGxldmVyYWdlIHRoZSBjaGFuZ2VzIHRyaWUgc3RvcmFnZSB0cmFja2luZyBtZWNoYW5pc20gYW5k5CBpbiBjYXNlIG9mIGNoYW5nZXMgZmV0Y2ggdGhlIGxpc3Qgb2YgZXZlbnRzIG9mIGludGVyZXN0LgBZASBUaGUgdmFsdWUgaGFzIHRoZSB0eXBlIGAoQmxvY2tOdW1iZXJGb3I8VD4sIEV2ZW50SW5kZXgpYCBiZWNhdXNlIGlmIHdlIHVzZWQgb25seSBqdXN0TQEgdGhlIGBFdmVudEluZGV4YCB0aGVuIGluIGNhc2UgaWYgdGhlIHRvcGljIGhhcyB0aGUgc2FtZSBjb250ZW50cyBvbiB0aGUgbmV4dCBibG9jawEBIG5vIG5vdGlmaWNhdGlvbiB3aWxsIGJlIHRyaWdnZXJlZCB0aHVzIHRoZSBldmVudCBtaWdodCBiZSBsb3N0LkhMYXN0UnVudGltZVVwZ3JhZGUAAEUJBAAEVQEgU3RvcmVzIHRoZSBgc3BlY192ZXJzaW9uYCBhbmQgYHNwZWNfbmFtZWAgb2Ygd2hlbiB0aGUgbGFzdCBydW50aW1lIHVwZ3JhZGUgaGFwcGVuZWQuVFVwZ3JhZGVkVG9VMzJSZWZDb3VudAEAIAQABE0BIFRydWUgaWYgd2UgaGF2ZSB1cGdyYWRlZCBzbyB0aGF0IGB0eXBlIFJlZkNvdW50YCBpcyBgdTMyYC4gRmFsc2UgKGRlZmF1bHQpIGlmIG5vdC5gVXBncmFkZWRUb1RyaXBsZVJlZkNvdW50AQAgBAAIXQEgVHJ1ZSBpZiB3ZSBoYXZlIHVwZ3JhZGVkIHNvIHRoYXQgQWNjb3VudEluZm8gY29udGFpbnMgdGhyZWUgdHlwZXMgb2YgYFJlZkNvdW50YC4gRmFsc2VIIChkZWZhdWx0KSBpZiBub3QuOEV4ZWN1dGlvblBoYXNlAAA9CQQABIggVGhlIGV4ZWN1dGlvbiBwaGFzZSBvZiB0aGUgYmxvY2suREF1dGhvcml6ZWRVcGdyYWRlAABRCQQABLggYFNvbWVgIGlmIGEgY29kZSB1cGdyYWRlIGhhcyBiZWVuIGF1dGhvcml6ZWQuYEV4dHJpbnNpY1dlaWdodFJlY2xhaW1lZAEAKAgAABygIFRoZSB3ZWlnaHQgcmVjbGFpbWVkIGZvciB0aGUgZXh0cmluc2ljLgAhASBUaGlzIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJs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dmFsaWRhdG9yIGluIHRoZSBzaG9ydCB0ZXJtLiBJdCBNQVkgYmUgdXNlZCBpbiBtYW55FQEgY3J5cHRvZ3JhcGhpYyBwcm90b2NvbHMsIGhvd2V2ZXIsIHNvIGxvbmcgYXMgb25lIHJlbWVtYmVycyB0aGF0IHRoaXMVASAobGlrZSBldmVyeXRoaW5nIGVsc2Ugb24tY2hhaW4pIGl0IGlzIHB1YmxpYy4gRm9yIGV4YW1wbGUsIGl0IGNhbiBiZQUBIHVzZWQgd2hlcmUgYSBudW1iZXIgaXMgbmVlZGVkIHRoYXQgY2Fubm90IGhhdmUgYmVlbiBjaG9zZW4gYnkgYW4NASBhZHZlcnNhcnksIGZvciBwdXJwb3NlcyBzdWNoIGFzIHB1YmxpYy1jb2luIHplcm8ta25vd2xlZGdlIHByb29mcy5gUGVuZGluZ0Vwb2NoQ29uZmlnQ2hhbmdlAADZAQQABGEBIFBlbmRpbmcgZXBvY2ggY29uZmlndXJhdGlvbiBjaGFuZ2UgdGhhdCB3aWxsIGJlIGFwcGxpZWQgd2hlbiB0aGUgbmV4dCBlcG9jaCBpcyBlbmFjdGVkLjhOZXh0UmFuZG9tbmVzcwEABIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARcIE5leHQgZXBvY2ggcmFuZG9tbmVzcy48TmV4dEF1dGhvcml0aWVzAQCBCQQABGAgTmV4dCBlcG9jaCBhdXRob3JpdGllcy4wU2VnbWVudEluZGV4AQAQEAAAAAAkfCBSYW5kb21uZXNzIHVuZGVyIGNvbnN0cnVjdGlvbi4A+CBXZSBtYWtlIGEgdHJhZGUtb2ZmIGJldHdlZW4gc3RvcmFnZSBhY2Nlc3NlcyBhbmQgbGlzdCBsZW5ndGguAQEgV2Ugc3RvcmUgdGhlIHVuZGVyLWNvbnN0cnVjdGlvbiByYW5kb21uZXNzIGluIHNlZ21lbnRzIG9mIHVwIHRvlCBgVU5ERVJfQ09OU1RSVUNUSU9OX1NFR01FTlRfTEVOR1RIYC4A7CBPbmNlIGEgc2VnbWVudCByZWFjaGVzIHRoaXMgbGVuZ3RoLCB3ZSBiZWdpbiB0aGUgbmV4dCBvbmUuCQEgV2UgcmVzZXQgYWxsIHNlZ21lbnRzIGFuZCByZXR1cm4gdG8gYDBgIGF0IHRoZSBiZWdpbm5pbmcgb2YgZXZlcnkcIGVwb2NoLkRVbmRlckNvbnN0cnVjdGlvbgEBBAUQjQkEAAQVASBUV09YLU5PVEU6IGBTZWdtZW50SW5kZXhgIGlzIGFuIGluY3JlYXNpbmcgaW50ZWdlciwgc28gdGhpcyBpcyBva2F5LixJbml0aWFsaXplZAAAlQkEAAgBASBUZW1wb3JhcnkgdmFsdWUgKGNsZWFyZWQgYXQgYmxvY2sgZmluYWxpemF0aW9uKSB3aGljaCBpcyBgU29tZWAdASBpZiBwZXItYmxvY2sgaW5pdGlhbGl6YXRpb24gaGFzIGFscmVhZHkgYmVlbiBjYWxsZWQgZm9yIGN1cnJlbnQgYmxvY2suTEF1dGhvclZyZlJhbmRvbW5lc3MBACkBBAAQFQEgVGhpcyBmaWVsZCBzaG91bGQgYWx3YXlzIGJlIHBvcHVsYXRlZCBkdXJpbmcgYmxvY2sgcHJvY2Vzc2luZyB1bmxlc3MZASBzZWNvbmRhcnkgcGxhaW4gc2xvdHMgYXJlIGVuYWJsZWQgKHdoaWNoIGRvbid0IGNvbnRhaW4gYSBWUkYgb3V0cHV0KS4ASQEgSXQgaXMgc2V0IGluIGBvbl9maW5hbGl6ZWAsIGJlZm9yZSBpdCB3aWxsIGNvbnRhaW4gdGhlIHZhbHVlIGZyb20gdGhlIGxhc3QgYmxvY2suKEVwb2NoU3RhcnQBACUBIAAAAAAAAAAAFF0BIFRoZSBibG9jayBudW1iZXJzIHdoZW4gdGhlIGxhc3QgYW5kIGN1cnJlbnQgZXBvY2ggaGF2ZSBzdGFydGVkLCByZXNwZWN0aXZlbHkgYE4tMWAgYW5kFCBgTmAuSQEgTk9URTogV2UgdHJhY2sgdGhpcyBpcyBpbiBvcmRlciB0byBhbm5vdGF0ZSB0aGUgYmxvY2sgbnVtYmVyIHdoZW4gYSBnaXZlbiBwb29sIG9mWQEgZW50cm9weSB3YXMgZml4ZWQgKGkuZS4gaXQgd2FzIGtub3duIHRvIGNoYWluIG9ic2VydmVycykuIFNpbmNlIGVwb2NocyBhcmUgZGVmaW5lZCBpblkBIHNsb3RzLCB3aGljaCBtYXkgYmUgc2tpcHBlZCwgdGhlIGJsb2NrIG51bWJlcnMgbWF5IG5vdCBsaW5lIHVwIHdpdGggdGhlIHNsb3QgbnVtYmVycy4gTGF0ZW5lc3MBABAQAAAAABTYIEhvdyBsYXRlIHRoZSBjdXJyZW50IGJsb2NrIGlzIGNvbXBhcmVkIHRvIGl0cyBwYXJlbnQuABUBIFRoaXMgZW50cnkgaXMgcG9wdWxhdGVkIGFzIHBhcnQgb2YgYmxvY2sgZXhlY3V0aW9uIGFuZCBpcyBjbGVhbmVkIHVwEQEgb24gYmxvY2sgZmluYWxpemF0aW9uLiBRdWVyeWluZyB0aGlzIHN0b3JhZ2UgZW50cnkgb3V0c2lkZSBvZiBibG9ja7AgZXhlY3V0aW9uIGNvbnRleHQgc2hvdWxkIGFsd2F5cyB5aWVsZCB6ZXJvLixFcG9jaENvbmZpZwAArQkEAAhhASBUaGUgY29uZmlndXJhdGlvbiBmb3IgdGhlIGN1cnJlbnQgZXBvY2guIFNob3VsZCBuZXZlciBiZSBgTm9uZWAgYXMgaXQgaXMgaW5pdGlhbGl6ZWQgaW4kIGdlbmVzaXMuPE5leHRFcG9jaENvbmZpZwAArQkEAAgtASBUaGUgY29uZmlndXJhdGlvbiBmb3IgdGhlIG5leHQgZXBvY2gsIGBOb25lYCBpZiB0aGUgY29uZmlnIHdpbGwgbm90IGNoYW5nZeggKHlvdSBjYW4gZmFsbGJhY2sgdG8gYEVwb2NoQ29uZmlnYCBpbnN0ZWFkIGluIHRoYXQgY2FzZSkuNFNraXBwZWRFcG9jaHMBALEJBAAgKQEgQSBsaXN0IG9mIHRoZSBsYXN0IDEwMCBza2lwcGVkIGVwb2NocyBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgc2Vzc2lvbiBpbmRleHAgd2hlbiB0aGUgZXBvY2ggd2FzIHNraXBwZWQuADEBIFRoaXMgaXMgb25seSB1c2VkIGZvciB2YWxpZGF0aW5nIGVxdWl2b2NhdGlvbiBwcm9vZnMuIEFuIGVxdWl2b2NhdGlvbiBwcm9vZjUBIG11c3QgY29udGFpbnMgYSBrZXktb3duZXJzaGlwIHByb29mIGZvciBhIGdpdmVuIHNlc3Npb24sIHRoZXJlZm9yZSB3ZSBuZWVkIGE5ASB3YXkgdG8gdGllIHRvZ2V0aGVyIHNlc3Npb25zIGFuZCBlcG9jaCBpbmRpY2VzLCBpLmUuIHdlIG5lZWQgdG8gdmFsaWRhdGUgdGhhdCkBIGEgdmFsaWRhdG9yIHdhcyB0aGUgb3duZXIgb2YgYSBnaXZlbiBrZXkgb24gYSBnaXZlbiBzZXNzaW9uLCBhbmQgd2hhdCB0aGWwIGFjdGl2ZSBlcG9jaCBpbmRleCB3YXMgZHVyaW5nIHRoYXQgc2Vzc2lvbi4BvQEAEDRFcG9jaER1cmF0aW9uMCBYAgAAAAAAAAzsIFRoZSBhbW91bnQgb2YgdGltZSwgaW4gc2xvdHMsIHRoYXQgZWFjaCBlcG9jaCBzaG91bGQgbGFzdC4ZASBOT1RFOiBDdXJyZW50bHkgaXQgaXMgbm90IHBvc3NpYmxlIHRvIGNoYW5nZSB0aGUgZXBvY2ggZHVyYXRpb24gYWZ0ZXIhASB0aGUgY2hhaW4gaGFzIHN0YXJ0ZWQuIEF0dGVtcHRpbmcgdG8gZG8gc28gd2lsbCBicmljayBibG9jayBwcm9kdWN0aW9uLkRFeHBlY3RlZEJsb2NrVGltZTAgcBcAAAAAAAAUBQEgVGhlIGV4cGVjdGVkIGF2ZXJhZ2UgYmxvY2sgdGltZSBhdCB3aGljaCBCQUJFIHNob3VsZCBiZSBjcmVhdGluZxEBIGJsb2Nrcy4gU2luY2UgQkFCRSBpcyBwcm9iYWJpbGlzdGljIGl0IGlzIG5vdCB0cml2aWFsIHRvIGZpZ3VyZSBvdXQFASB3aGF0IHRoZSBleHBlY3RlZCBhdmVyYWdlIGJsb2NrIHRpbWUgc2hvdWxkIGJlIGJhc2VkIG9uIHRoZSBzbG90CQEgZHVyYXRpb24gYW5kIHRoZSBzZWN1cml0eSBwYXJhbWV0ZXIgYGNgICh3aGVyZSBgMSAtIGNgIHJlcHJlc2VudHOgIHRoZSBwcm9iYWJpbGl0eSBvZiBhIHNsb3QgYmVpbmcgZW1wdHkpLjhNYXhBdXRob3JpdGllcxAQoIYBAASIIE1heCBudW1iZXIgb2YgYXV0aG9yaXRpZXMgYWxsb3dlZDRNYXhOb21pbmF0b3JzEBBAAAAABNQgVGhlIG1heGltdW0gbnVtYmVyIG9mIG5vbWluYXRvcnMgZm9yIGVhY2ggdmFsaWRhdG9yLgG9CQEAJFRpbWVzdGFtcAEkVGltZXN0YW1wCAxOb3cBADAgAAAAAAAAAAAEoCBUaGUgY3VycmVudCB0aW1lIGZvciB0aGUgY3VycmVudCBibG9jay4kRGlkVXBkYXRlAQAgBAAQ2CBXaGV0aGVyIHRoZSB0aW1lc3RhbXAgaGFzIGJlZW4gdXBkYXRlZCBpbiB0aGlzIGJsb2NrLgBVASBUaGlzIHZhbHVlIGlzIHVwZGF0ZWQgdG8gYHRydWVgIHVwb24gc3VjY2Vzc2Z1bCBzdWJtaXNzaW9uIG9mIGEgdGltZXN0YW1wIGJ5IGEgbm9kZS5FASBJdCBpcyB0aGVuIGNoZWNrZWQgYXQgdGhlIGVuZCBvZiBlYWNoIGJsb2NrIGV4ZWN1dGlvbiBpbiB0aGUgYG9uX2ZpbmFsaXplYCBob29rLgHlAQAENE1pbmltdW1QZXJpb2QwILgLAAAAAAAAGIwgVGhlIG1pbmltdW0gcGVyaW9kIGJldHdlZW4gYmxvY2tzLgBNASBCZSBhd2FyZSB0aGF0IHRoaXMgaXMgZGlmZmVyZW50IHRvIHRoZSAqZXhwZWN0ZWQqIHBlcmlvZCB0aGF0IHRoZSBibG9jayBwcm9kdWN0aW9uSQEgYXBwYXJhdHVzIHByb3ZpZGVzLiBZb3VyIGNob3NlbiBjb25zZW5zdXMgc3lzdGVtIHdpbGwgZ2VuZXJhbGx5IHdvcmsgd2l0aCB0aGlzIHRvYQEgZGV0ZXJtaW5lIGEgc2Vuc2libGUgYmxvY2sgdGltZS4gRm9yIGV4YW1wbGUsIGluIHRoZSBBdXJhIHBhbGxldCBpdCB3aWxsIGJlIGRvdWJsZSB0aGlzcCBwZXJpb2Qgb24gZGVmYXVsdCBzZXR0aW5ncy4AAgAcSW5kaWNlcwEcSW5kaWNlcwQgQWNjb3VudHMAAQQCEMEJBAAEiCBUaGUgbG9va3VwIGZyb20gaW5kZXggdG8gYWNjb3VudC4B6QEBgAQcRGVwb3NpdBhAABCl1OgAAAAAAAAAAAAAAASsIFRoZSBkZXBvc2l0IG5lZWRlZCBmb3IgcmVzZXJ2aW5nIGFuIGluZGV4LgHFCQMAIEJhbGFuY2VzASBCYWxhbmNlcxw0VG90YWxJc3N1YW5jZQEAGEAAAAAAAAAAAAAAAAAAAAAABJggVGhlIHRvdGFsIHVuaXRzIGlzc3VlZCBpbiB0aGUgc3lzdGVtLkBJbmFjdGl2ZUlzc3VhbmNlAQAYQAAAAAAAAAAAAAAAAAAAAAAECQEgVGhlIHRvdGFsIHVuaXRzIG9mIG91dHN0YW5kaW5nIGRlYWN0aXZhdGVkIGJhbGFuY2UgaW4gdGhlIHN5c3RlbS4cQWNjb3VudAEBBAIAFAEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgGAJASBUaGUgQmFsYW5jZXMgcGFsbGV0IGV4YW1wbGUgb2Ygc3RvcmluZyB0aGUgYmFsYW5jZSBvZiBhbiBhY2NvdW50LgAoICMgRXhhbXBsZQA0IGBgYG5vY29tcGlsZbAgIGltcGwgcGFsbGV0X2JhbGFuY2VzOjpDb25maWcgZm9yIFJ1bnRpbWUgexkCICAgIHR5cGUgQWNjb3VudFN0b3JlID0gU3RvcmFnZU1hcFNoaW08U2VsZjo6QWNjb3VudDxSdW50aW1lPiwgZnJhbWVfc3lzdGVtOjpQcm92aWRlcjxSdW50aW1lPiwgQWNjb3VudElkLCBTZWxmOjpBY2NvdW50RGF0YTxCYWxhbmNlPj4MICB9ECBgYGAAFQEgWW91IGNhbiBhbHNvIHN0b3JlIHRoZSBiYWxhbmNlIG9mIGFuIGFjY291bnQgaW4gdGhlIGBTeXN0ZW1gIHBhbGxldC4AKCAjIEV4YW1wbGUANCBgYGBub2NvbXBpbGWwICBpbXBsIHBhbGxldF9iYWxhbmNlczo6Q29uZmlnIGZvciBSdW50aW1lIHt0ICAgdHlwZSBBY2NvdW50U3RvcmUgPSBTeXN0ZW0MICB9ECBgYGAAUQEgQnV0IHRoaXMgY29tZXMgd2l0aCB0cmFkZW9mZnMsIHN0b3JpbmcgYWNjb3VudCBiYWxhbmNlcyBpbiB0aGUgc3lzdGVtIHBhbGxldCBzdG9yZXNtASBgZnJhbWVfc3lzdGVtYCBkYXRhIGFsb25nc2lkZSB0aGUgYWNjb3VudCBkYXRhIGNvbnRyYXJ5IHRvIHN0b3JpbmcgYWNjb3VudCBiYWxhbmNlcyBpbiB0aGUpASBgQmFsYW5jZXNgIHBhbGxldCwgd2hpY2ggdXNlcyBhIGBTdG9yYWdlTWFwYCB0byBzdG9yZSBiYWxhbmNlcyBkYXRhIG9ubHkuQQEgTk9URTogVGhpcyBpcyBvbmx5IHVzZWQgaW4gdGhlIGNhc2UgdGhhdCB0aGlzIHBhbGxldCBpcyB1c2VkIHRvIHN0b3JlIGJhbGFuY2VzLhRMb2NrcwEBBAIAyQkEABC4IEFueSBsaXF1aWRpdHkgbG9ja3Mgb24gc29tZSBhY2NvdW50IGJhbGFuY2VzLiUBIE5PVEU6IFNob3VsZCBvbmx5IGJlIGFjY2Vzc2VkIHdoZW4gc2V0dGluZywgY2hhbmdpbmcgYW5kIGZyZWVpbmcgYSBsb2NrLgCtASBVc2Ugb2YgbG9ja3MgaXMgZGVwcmVjYXRlZCBpbiBmYXZvdXIgb2YgZnJlZXplcy4gU2VlIGBodHRwczovL2dpdGh1Yi5jb20vcGFyaXR5dGVjaC9zdWJzdHJhdGUvcHVsbC8xMjk1MS9gIFJlc2VydmVzAQEEAgDZCQQADKQgTmFtZWQgcmVzZXJ2ZXMgb24gc29tZSBhY2NvdW50IGJhbGFuY2VzLgCxASBVc2Ugb2YgcmVzZXJ2ZXMgaXMgZGVwcmVjYXRlZCBpbiBmYXZvdXIgb2YgaG9sZHMuIFNlZSBgaHR0cHM6Ly9naXRodWIuY29tL3Bhcml0eXRlY2gvc3Vic3RyYXRlL3B1bGwvMTI5NTEvYBRIb2xkcwEBBAIA5QkEAARsIEhvbGRzIG9uIGFjY291bnQgYmFsYW5jZXMuHEZyZWV6ZXMBAQQCAAkKBAAEiCBGcmVlemUgbG9ja3Mgb24gYWNjb3VudCBiYWxhbmNlcy4B+QEBhBBIRXhpc3RlbnRpYWxEZXBvc2l0GEAA5AtUAgAAAAAAAAAAAAAAIEEBIFRoZSBtaW5pbXVtIGFtb3VudCByZXF1aXJlZCB0byBrZWVwIGFuIGFjY291bnQgb3Blbi4gTVVTVCBCRSBHUkVBVEVSIFRIQU4gWkVSTyEAWQEgSWYgeW91ICpyZWFsbHkqIG5lZWQgaXQgdG8gYmUgemVybywgeW91IGNhbiBlbmFibGUgdGhlIGZlYXR1cmUgYGluc2VjdXJlX3plcm9fZWRgIGZvcmEBIHRoaXMgcGFsbGV0LiBIb3dldmVyLCB5b3UgZG8gc28gYXQgeW91ciBvd24gcmlzazogdGhpcyB3aWxsIG9wZW4gdXAgYSBtYWpvciBEb1MgdmVjdG9yLlkBIEluIGNhc2UgeW91IGhhdmUgbXVsdGlwbGUgc291cmNlcyBvZiBwcm92aWRlciByZWZlcmVuY2VzLCB5b3UgbWF5IGFsc28gZ2V0IHVuZXhwZWN0ZWSMIGJlaGF2aW91ciBpZiB5b3Ugc2V0IHRoaXMgdG8gemVyby4A8CBCb3R0b20gbGluZTogRG8geW91cnNlbGYgYSBmYXZvdXIgYW5kIG1ha2UgaXQgYXQgbGVhc3Qgb25lISBNYXhMb2NrcxAQMgAAABD0IFRoZSBtYXhpbXVtIG51bWJlciBvZiBsb2NrcyB0aGF0IHNob3VsZCBleGlzdCBvbiBhbiBhY2NvdW50LtwgTm90IHN0cmljdGx5IGVuZm9yY2VkLCBidXQgdXNlZCBmb3Igd2VpZ2h0IGVzdGltYXRpb24uAK0BIFVzZSBvZiBsb2NrcyBpcyBkZXByZWNhdGVkIGluIGZhdm91ciBvZiBmcmVlemVzLiBTZWUgYGh0dHBzOi8vZ2l0aHViLmNvbS9wYXJpdHl0ZWNoL3N1YnN0cmF0ZS9wdWxsLzEyOTUxL2AsTWF4UmVzZXJ2ZXMQEDIAAAAMDQEgVGhlIG1heGltdW0gbnVtYmVyIG9mIG5hbWVkIHJlc2VydmVzIHRoYXQgY2FuIGV4aXN0IG9uIGFuIGFjY291bnQuALEBIFVzZSBvZiByZXNlcnZlcyBpcyBkZXByZWNhdGVkIGluIGZhdm91ciBvZiBob2xkcy4gU2VlIGBodHRwczovL2dpdGh1Yi5jb20vcGFyaXR5dGVjaC9zdWJzdHJhdGUvcHVsbC8xMjk1MS9gKE1heEZyZWV6ZXMQEAEAAAAEYQEgVGhlIG1heGltdW0gbnVtYmVyIG9mIGluZGl2aWR1YWwgZnJlZXplIGxvY2tzIHRoYXQgY2FuIGV4aXN0IG9uIGFuIGFjY291bnQgYXQgYW55IHRpbWUuAR0KBABIVHJhbnNhY3Rpb25QYXltZW50AUhUcmFuc2FjdGlvblBheW1lbnQIRE5leHRGZWVNdWx0aXBsaWVyAQAtCEAAAGSns7bgDQAAAAAAAAAAADhTdG9yYWdlVmVyc2lvbgEAIQoEAAAAAYwEYE9wZXJhdGlvbmFsRmVlTXVsdGlwbGllcggEBVRZASBBIGZlZSBtdWx0aXBsaWVyIGZvciBgT3BlcmF0aW9uYWxgIGV4dHJpbnNpY3MgdG8gY29tcHV0ZSAidmlydHVhbCB0aXAiIHRvIGJvb3N0IHRoZWlyLCBgcHJpb3JpdHlgAFEBIFRoaXMgdmFsdWUgaXMgbXVsdGlwbGllZCBieSB0aGUgYGZpbmFsX2ZlZWAgdG8gb2J0YWluIGEgInZpcnR1YWwgdGlwIiB0aGF0IGlzIGxhdGVy9CBhZGRlZCB0byBhIHRpcCBjb21wb25lbnQgaW4gcmVndWxhciBgcHJpb3JpdHlgIGNhbGN1bGF0aW9ucy5NASBJdCBtZWFucyB0aGF0IGEgYE5vcm1hbGAgdHJhbnNhY3Rpb24gY2FuIGZyb250LXJ1biBhIHNpbWlsYXJseS1zaXplZCBgT3BlcmF0aW9uYWxgQQEgZXh0cmluc2ljICh3aXRoIG5vIHRpcCksIGJ5IGluY2x1ZGluZyBhIHRpcCB2YWx1ZSBncmVhdGVyIHRoYW4gdGhlIHZpcnR1YWwgdGlwLgA8IGBgYHJ1c3QsaWdub3JlQCAvLyBGb3IgYE5vcm1hbGCMIGxldCBwcmlvcml0eSA9IHByaW9yaXR5X2NhbGModGlwKTsAVCAvLyBGb3IgYE9wZXJhdGlvbmFsYBEBIGxldCB2aXJ0dWFsX3RpcCA9IChpbmNsdXNpb25fZmVlICsgdGlwKSAqIE9wZXJhdGlvbmFsRmVlTXVsdGlwbGllcjvEIGxldCBwcmlvcml0eSA9IHByaW9yaXR5X2NhbGModGlwICsgdmlydHVhbF90aXApOxAgYGBgAFEBIE5vdGUgdGhhdCBzaW5jZSB3ZSB1c2UgYGZpbmFsX2ZlZWAgdGhlIG11bHRpcGxpZXIgYXBwbGllcyBhbHNvIHRvIHRoZSByZWd1bGFyIGB0aXBgXQEgc2VudCB3aXRoIHRoZSB0cmFuc2FjdGlvbi4gU28sIG5vdCBvbmx5IGRvZXMgdGhlIHRyYW5zYWN0aW9uIGdldCBhIHByaW9yaXR5IGJ1bXAgYmFzZWRhASBvbiB0aGUgYGluY2x1c2lvbl9mZWVgLCBidXQgd2UgYWxzbyBhbXBsaWZ5IHRoZSBpbXBhY3Qgb2YgdGlwcyBhcHBsaWVkIHRvIGBPcGVyYXRpb25hbGA4IHRyYW5zYWN0aW9ucy4AGgAoQXV0aG9yc2hpcAEoQXV0aG9yc2hpcAQYQXV0aG9yAAAABAAEZCBBdXRob3Igb2YgY3VycmVudCBibG9jay4AAAAABQAcU3Rha2luZwEcU3Rha2luZ6g4VmFsaWRhdG9yQ291bnQBABAQAAAAAAScIFRoZSBpZGVhbCBudW1iZXIgb2YgYWN0aXZlIHZhbGlkYXRvcnMuVE1pbmltdW1WYWxpZGF0b3JDb3VudAEAEBAAAAAABEEBIE1pbmltdW0gbnVtYmVyIG9mIHN0YWtpbmcgcGFydGljaXBhbnRzIGJlZm9yZSBlbWVyZ2VuY3kgY29uZGl0aW9ucyBhcmUgaW1wb3NlZC40SW52dWxuZXJhYmxlcwEAAQIEAAxZASBBbnkgdmFsaWRhdG9ycyB0aGF0IG1heSBuZXZlciBiZSBzbGFzaGVkIG9yIGZvcmNpYmx5IGtpY2tlZC4gSXQncyBhIFZlYyBzaW5jZSB0aGV5J3JlTQEgZWFzeSB0byBpbml0aWFsaXplIGFuZCB0aGUgcGVyZm9ybWFuY2UgaGl0IGlzIG1pbmltYWwgKHdlIGV4cGVjdCBubyBtb3JlIHRoYW4gZm91cqwgaW52dWxuZXJhYmxlcykgYW5kIHJlc3RyaWN0ZWQgdG8gdGVzdG5ldHMuGEJvbmRlZAABBAUAAAQADAEBIE1hcCBmcm9tIGFsbCBsb2NrZWQgInN0YXNoIiBhY2NvdW50cyB0byB0aGUgY29udHJvbGxlciBhY2NvdW50LgDQIFRXT1gtTk9URTogU0FGRSBzaW5jZSBgQWNjb3VudElkYCBpcyBhIHNlY3VyZSBoYXNoLkBNaW5Ob21pbmF0b3JCb25kAQAYQAAAAAAAAAAAAAAAAAAAAAAEIQEgVGhlIG1pbmltdW0gYWN0aXZlIGJvbmQgdG8gYmVjb21lIGFuZCBtYWludGFpbiB0aGUgcm9sZSBvZiBhIG5vbWluYXRvci5ATWluVmFsaWRhdG9yQm9uZAEAGEAAAAAAAAAAAAAAAAAAAAAABCEBIFRoZSBtaW5pbXVtIGFjdGl2ZSBib25kIHRvIGJlY29tZSBhbmQgbWFpbnRhaW4gdGhlIHJvbGUgb2YgYSB2YWxpZGF0b3IuSE1pbmltdW1BY3RpdmVTdGFrZQEAGEAAAAAAAAAAAAAAAAAAAAAABBEBIFRoZSBtaW5pbXVtIGFjdGl2ZSBub21pbmF0b3Igc3Rha2Ugb2YgdGhlIGxhc3Qgc3VjY2Vzc2Z1bCBlbGVjdGlvbi40TWluQ29tbWlzc2lvbgEAmBAAAAAADOggVGhlIG1pbmltdW0gYW1vdW50IG9mIGNvbW1pc3Npb24gdGhhdCB2YWxpZGF0b3JzIGNhbiBzZXQuAIAgSWYgc2V0IHRvIGAwYCwgbm8gbGltaXQgZXhpc3RzLhhMZWRnZXIAAQQCACUKBAAQRQEgTWFwIGZyb20gYWxsICh1bmxvY2tlZCkgImNvbnRyb2xsZXIiIGFjY291bnRzIHRvIHRoZSBpbmZvIHJlZ2FyZGluZyB0aGUgc3Rha2luZy4AdQEgTm90ZTogQWxsIHRoZSByZWFkcyBhbmQgbXV0YXRpb25zIHRvIHRoaXMgc3RvcmFnZSAqTVVTVCogYmUgZG9uZSB0aHJvdWdoIHRoZSBtZXRob2RzIGV4cG9zZWToIGJ5IFtgU3Rha2luZ0xlZGdlcmBdIHRvIGVuc3VyZSBkYXRhIGFuZCBsb2NrIGNvbnNpc3RlbmN5LhRQYXllZQABBAUAlAQADOQgV2hlcmUgdGhlIHJld2FyZCBwYXltZW50IHNob3VsZCBiZSBtYWRlLiBLZXllZCBieSBzdGFzaC4A0CBUV09YLU5PVEU6IFNBRkUgc2luY2UgYEFjY291bnRJZGAgaXMgYSBzZWN1cmUgaGFzaC4oVmFsaWRhdG9ycwEBBAUAoAgAAAxFASBUaGUgbWFwIGZyb20gKHdhbm5hYmUpIHZhbGlkYXRvciBzdGFzaCBrZXkgdG8gdGhlIHByZWZlcmVuY2VzIG9mIHRoYXQgdmFsaWRhdG9yLgDQIFRXT1gtTk9URTogU0FGRSBzaW5jZSBgQWNjb3VudElkYCBpcyBhIHNlY3VyZSBoYXNoLlBDb3VudGVyRm9yVmFsaWRhdG9ycwEAEBAAAAAABKxDb3VudGVyIGZvciB0aGUgcmVsYXRlZCBjb3VudGVkIHN0b3JhZ2UgbWFwSE1heFZhbGlkYXRvcnNDb3VudAAAEAQADDEBIFRoZSBtYXhpbXVtIHZhbGlkYXRvciBjb3VudCBiZWZvcmUgd2Ugc3RvcCBhbGxvd2luZyBuZXcgdmFsaWRhdG9ycyB0byBqb2luLgDQIFdoZW4gdGhpcyB2YWx1ZSBpcyBub3Qgc2V0LCBubyBsaW1pdHMgYXJlIGVuZm9yY2VkLihOb21pbmF0b3JzAAEEBQAtCgQATHUBIFRoZSBtYXAgZnJvbSBub21pbmF0b3Igc3Rhc2gga2V5IHRvIHRoZWlyIG5vbWluYXRpb24gcHJlZmVyZW5jZXMsIG5hbWVseSB0aGUgdmFsaWRhdG9ycyB0aGF0WCB0aGV5IHdpc2ggdG8gc3VwcG9ydC4AOQEgTm90ZSB0aGF0IHRoZSBrZXlzIG9mIHRoaXMgc3RvcmFnZSBtYXAgbWlnaHQgYmVjb21lIG5vbi1kZWNvZGFibGUgaW4gY2FzZSB0aGUtASBhY2NvdW50J3MgW2BOb21pbmF0aW9uc1F1b3RhOjpNYXhOb21pbmF0aW9uc2BdIGNvbmZpZ3VyYXRpb24gaXMgZGVjcmVhc2VkLpAgSW4gdGhpcyByYXJlIGNhc2UsIHRoZXNlIG5vbWluYXRvcnNlASBhcmUgc3RpbGwgZXhpc3RlbnQgaW4gc3RvcmFnZSwgdGhlaXIga2V5IGlzIGNvcnJlY3QgYW5kIHJldHJpZXZhYmxlIChpLmUuIGBjb250YWluc19rZXlgcQEgaW5kaWNhdGVzIHRoYXQgdGhleSBleGlzdCksIGJ1dCB0aGVpciB2YWx1ZSBjYW5ub3QgYmUgZGVjb2RlZC4gVGhlcmVmb3JlLCB0aGUgbm9uLWRlY29kYWJsZW0BIG5vbWluYXRvcnMgd2lsbCBlZmZlY3RpdmVseSBub3QtZXhpc3QsIHVudGlsIHRoZXkgcmUtc3VibWl0IHRoZWlyIHByZWZlcmVuY2VzIHN1Y2ggdGhhdCBpdAEBIGlzIHdpdGhpbiB0aGUgYm91bmRzIG9mIHRoZSBuZXdseSBzZXQgYENvbmZpZzo6TWF4Tm9taW5hdGlvbnNgLgBhASBUaGlzIGltcGxpZXMgdGhhdCBgOjppdGVyX2tleXMoKS5jb3VudCgpYCBhbmQgYDo6aXRlcigpLmNvdW50KClgIG1pZ2h0IHJldHVybiBkaWZmZXJlbnRtASB2YWx1ZXMgZm9yIHRoaXMgbWFwLiBNb3Jlb3ZlciwgdGhlIG1haW4gYDo6Y291bnQoKWAgaXMgYWxpZ25lZCB3aXRoIHRoZSBmb3JtZXIsIG5hbWVseSB0aGVsIG51bWJlciBvZiBrZXlzIHRoYXQgZXhpc3QuAG0BIExhc3RseSwgaWYgYW55IG9mIHRoZSBub21pbmF0b3JzIGJlY29tZSBub24tZGVjb2RhYmxlLCB0aGV5IGNhbiBiZSBjaGlsbGVkIGltbWVkaWF0ZWx5IHZpYbggW2BDYWxsOjpjaGlsbF9vdGhlcmBdIGRpc3BhdGNoYWJsZSBieSBhbnlvbmUuANAgVFdPWC1OT1RFOiBTQUZFIHNpbmNlIGBBY2NvdW50SWRgIGlzIGEgc2VjdXJlIGhhc2guUENvdW50ZXJGb3JOb21pbmF0b3JzAQAQEAAAAAAErENvdW50ZXIgZm9yIHRoZSByZWxhdGVkIGNvdW50ZWQgc3RvcmFnZSBtYXA4VmlydHVhbFN0YWtlcnMAAQQFAAUBBAAYyCBTdGFrZXJzIHdob3NlIGZ1bmRzIGFyZSBtYW5hZ2VkIGJ5IG90aGVyIHBhbGxldHMuAHUBIFRoaXMgcGFsbGV0IGRvZXMgbm90IGFwcGx5IGFueSBsb2NrcyBvbiB0aGVtLCB0aGVyZWZvcmUgdGhleSBhcmUgb25seSB2aXJ0dWFsbHkgYm9uZGVkLiBUaGV5bQEgYXJlIGV4cGVjdGVkIHRvIGJlIGtleWxlc3MgYWNjb3VudHMgYW5kIGhlbmNlIHNob3VsZCBub3QgYmUgYWxsb3dlZCB0byBtdXRhdGUgdGhlaXIgbGVkZ2VycQEgZGlyZWN0bHkgdmlhIHRoaXMgcGFsbGV0LiBJbnN0ZWFkLCB0aGVzZSBhY2NvdW50cyBhcmUgbWFuYWdlZCBieSBvdGhlciBwYWxsZXRzIGFuZCBhY2Nlc3NlZCkBIHZpYSBsb3cgbGV2ZWwgYXBpcy4gV2Uga2VlcCB0cmFjayBvZiB0aGVtIHRvIGRvIG1pbmltYWwgaW50ZWdyaXR5IGNoZWNrcy5gQ291bnRlckZvclZpcnR1YWxTdGFrZXJzAQAQEAAAAAAErENvdW50ZXIgZm9yIHRoZSByZWxhdGVkIGNvdW50ZWQgc3RvcmFnZSBtYXBITWF4Tm9taW5hdG9yc0NvdW50AAAQBAAMMQEgVGhlIG1heGltdW0gbm9taW5hdG9yIGNvdW50IGJlZm9yZSB3ZSBzdG9wIGFsbG93aW5nIG5ldyB2YWxpZGF0b3JzIHRvIGpvaW4uANAgV2hlbiB0aGlzIHZhbHVlIGlzIG5vdCBzZXQsIG5vIGxpbWl0cyBhcmUgZW5mb3JjZWQuKEN1cnJlbnRFcmEAABAEABBcIFRoZSBjdXJyZW50IGVyYSBpbmRleC4AZQEgVGhpcyBpcyB0aGUgbGF0ZXN0IHBsYW5uZWQgZXJhLCBkZXBlbmRpbmcgb24gaG93IHRoZSBTZXNzaW9uIHBhbGxldCBxdWV1ZXMgdGhlIHZhbGlkYXRvcoAgc2V0LCBpdCBtaWdodCBiZSBhY3RpdmUgb3Igbm90LiRBY3RpdmVFcmEAADUKBAAQ2CBUaGUgYWN0aXZlIGVyYSBpbmZvcm1hdGlvbiwgaXQgaG9sZHMgaW5kZXggYW5kIHN0YXJ0LgBZASBUaGUgYWN0aXZlIGVyYSBpcyB0aGUgZXJhIGJlaW5nIGN1cnJlbnRseSByZXdhcmRlZC4gVmFsaWRhdG9yIHNldCBvZiB0aGlzIGVyYSBtdXN0IGJlrCBlcXVhbCB0byBbYFNlc3Npb25JbnRlcmZhY2U6OnZhbGlkYXRvcnNgXS5URXJhc1N0YXJ0U2Vzc2lvbkluZGV4AAEEBRAQBAAQVQEgVGhlIHNlc3Npb24gaW5kZXggYXQgd2hpY2ggdGhlIGVyYSBzdGFydCBmb3IgdGhlIGxhc3QgW2BDb25maWc6Okhpc3RvcnlEZXB0aGBdIGVyYXMuAGEBIE5vdGU6IFRoaXMgdHJhY2tzIHRoZSBzdGFydGluZyBzZXNzaW9uIChpLmUuIHNlc3Npb24gaW5kZXggd2hlbiBlcmEgc3RhcnQgYmVpbmcgYWN0aXZlKfAgZm9yIHRoZSBlcmFzIGluIGBbQ3VycmVudEVyYSAtIEhJU1RPUllfREVQVEgsIEN1cnJlbnRFcmFdYC4sRXJhc1N0YWtlcnMBAQgFBTkKPQoMAAAAIHggRXhwb3N1cmUgb2YgdmFsaWRhdG9yIGF0IGVyYS4AYQEgVGhpcyBpcyBrZXllZCBmaXJzdCBieSB0aGUgZXJhIGluZGV4IHRvIGFsbG93IGJ1bGsgZGVsZXRpb24gYW5kIHRoZW4gdGhlIHN0YXNoIGFjY291bnQuAMwgSXMgaXQgcmVtb3ZlZCBhZnRlciBbYENvbmZpZzo6SGlzdG9yeURlcHRoYF0gZXJhcy5BASBJZiBzdGFrZXJzIGhhc24ndCBiZWVuIHNldCBvciBoYXMgYmVlbiByZW1vdmVkIHRoZW4gZW1wdHkgZXhwb3N1cmUgaXMgcmV0dXJuZWQuACkBIE5vdGU6IERlcHJlY2F0ZWQgc2luY2UgdjE0LiBVc2UgYEVyYUluZm9gIGluc3RlYWQgdG8gd29yayB3aXRoIGV4cG9zdXJlcy5MRXJhc1N0YWtlcnNPdmVydmlldwABCAUFOQpJCgQAMLggU3VtbWFyeSBvZiB2YWxpZGF0b3IgZXhwb3N1cmUgYXQgYSBnaXZlbiBlcmEuAHEBIFRoaXMgY29udGFpbnMgdGhlIHRvdGFsIHN0YWtlIGluIHN1cHBvcnQgb2YgdGhlIHZhbGlkYXRvciBhbmQgdGhlaXIgb3duIHN0YWtlLiBJbiBhZGRpdGlvbix1ASBpdCBjYW4gYWxzbyBiZSB1c2VkIHRvIGdldCB0aGUgbnVtYmVyIG9mIG5vbWluYXRvcnMgYmFja2luZyB0aGlzIHZhbGlkYXRvciBhbmQgdGhlIG51bWJlciBvZmkBIGV4cG9zdXJlIHBhZ2VzIHRoZXkgYXJlIGRpdmlkZWQgaW50by4gVGhlIHBhZ2UgY291bnQgaXMgdXNlZnVsIHRvIGRldGVybWluZSB0aGUgbnVtYmVyIG9mrCBwYWdlcyBvZiByZXdhcmRzIHRoYXQgbmVlZHMgdG8gYmUgY2xhaW1lZC4AYQEgVGhpcyBpcyBrZXllZCBmaXJzdCBieSB0aGUgZXJhIGluZGV4IHRvIGFsbG93IGJ1bGsgZGVsZXRpb24gYW5kIHRoZW4gdGhlIHN0YXNoIGFjY291bnQurCBTaG91bGQgb25seSBiZSBhY2Nlc3NlZCB0aHJvdWdoIGBFcmFJbmZvYC4AzCBJcyBpdCByZW1vdmVkIGFmdGVyIFtgQ29uZmlnOjpIaXN0b3J5RGVwdGhgXSBlcmFzLkEBIElmIHN0YWtlcnMgaGFzbid0IGJlZW4gc2V0IG9yIGhhcyBiZWVuIHJlbW92ZWQgdGhlbiBlbXB0eSBvdmVydmlldyBpcyByZXR1cm5lZC5IRXJhc1N0YWtlcnNDbGlwcGVkAQEIBQU5Cj0KDAAAAECYIENsaXBwZWQgRXhwb3N1cmUgb2YgdmFsaWRhdG9yIGF0IGVyYS4AZQEgTm90ZTogVGhpcyBpcyBkZXByZWNhdGVkLCBzaG91bGQgYmUgdXNlZCBhcyByZWFkLW9ubHkgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLjEBIE5ldyBgRXhwb3N1cmVgcyBhcmUgc3RvcmVkIGluIGEgcGFnZWQgbWFubmVyIGluIGBFcmFzU3Rha2Vyc1BhZ2VkYCBpbnN0ZWFkLgBZASBUaGlzIGlzIHNpbWlsYXIgdG8gW2BFcmFzU3Rha2Vyc2BdIGJ1dCBudW1iZXIgb2Ygbm9taW5hdG9ycyBleHBvc2VkIGlzIHJlZHVjZWQgdG8gdGhlqCBgVDo6TWF4RXhwb3N1cmVQYWdlU2l6ZWAgYmlnZ2VzdCBzdGFrZXJzLh0BIChOb3RlOiB0aGUgZmllbGQgYHRvdGFsYCBhbmQgYG93bmAgb2YgdGhlIGV4cG9zdXJlIHJlbWFpbnMgdW5jaGFuZ2VkKS70IFRoaXMgaXMgdXNlZCB0byBsaW1pdCB0aGUgaS9vIGNvc3QgZm9yIHRoZSBub21pbmF0b3IgcGF5b3V0LgBdASBUaGlzIGlzIGtleWVkIGZpc3QgYnkgdGhlIGVyYSBpbmRleCB0byBhbGxvdyBidWxrIGRlbGV0aW9uIGFuZCB0aGVuIHRoZSBzdGFzaCBhY2NvdW50LgDMIEl0IGlzIHJlbW92ZWQgYWZ0ZXIgW2BDb25maWc6Okhpc3RvcnlEZXB0aGBdIGVyYXMuQQEgSWYgc3Rha2VycyBoYXNuJ3QgYmVlbiBzZXQgb3IgaGFzIGJlZW4gcmVtb3ZlZCB0aGVuIGVtcHR5IGV4cG9zdXJlIGlzIHJldHVybmVkLgApASBOb3RlOiBEZXByZWNhdGVkIHNpbmNlIHYxNC4gVXNlIGBFcmFJbmZvYCBpbnN0ZWFkIHRvIHdvcmsgd2l0aCBleHBvc3VyZXMuQEVyYXNTdGFrZXJzUGFnZWQAAQwFBQVNClEKBAAYwCBQYWdpbmF0ZWQgZXhwb3N1cmUgb2YgYSB2YWxpZGF0b3IgYXQgZ2l2ZW4gZXJhLgBxASBUaGlzIGlzIGtleWVkIGZpcnN0IGJ5IHRoZSBlcmEgaW5kZXggdG8gYWxsb3cgYnVsayBkZWxldGlvbiwgdGhlbiBzdGFzaCBhY2NvdW50IGFuZCBmaW5hbGx51CB0aGUgcGFnZS4gU2hvdWxkIG9ubHkgYmUgYWNjZXNzZWQgdGhyb3VnaCBgRXJhSW5mb2AuANQgVGhpcyBpcyBjbGVhcmVkIGFmdGVyIFtgQ29uZmlnOjpIaXN0b3J5RGVwdGhgXSBlcmFzLjhDbGFpbWVkUmV3YXJkcwEBCAUFOQqRAQQAGNwgSGlzdG9yeSBvZiBjbGFpbWVkIHBhZ2VkIHJld2FyZHMgYnkgZXJhIGFuZCB2YWxpZGF0b3IuAGkBIFRoaXMgaXMga2V5ZWQgYnkgZXJhIGFuZCB2YWxpZGF0b3Igc3Rhc2ggd2hpY2ggbWFwcyB0byB0aGUgc2V0IG9mIHBhZ2UgaW5kZXhlcyB3aGljaCBoYXZlOCBiZWVuIGNsYWltZWQuAMwgSXQgaXMgcmVtb3ZlZCBhZnRlciBbYENvbmZpZzo6SGlzdG9yeURlcHRoYF0gZXJhcy5IRXJhc1ZhbGlkYXRvclByZWZzAQEIBQU5CqAIAAAUEQEgU2ltaWxhciB0byBgRXJhc1N0YWtlcnNgLCB0aGlzIGhvbGRzIHRoZSBwcmVmZXJlbmNlcyBvZiB2YWxpZGF0b3JzLgBhASBUaGlzIGlzIGtleWVkIGZpcnN0IGJ5IHRoZSBlcmEgaW5kZXggdG8gYWxsb3cgYnVsayBkZWxldGlvbiBhbmQgdGhlbiB0aGUgc3Rhc2ggYWNjb3VudC4AzCBJcyBpdCByZW1vdmVkIGFmdGVyIFtgQ29uZmlnOjpIaXN0b3J5RGVwdGhgXSBlcmFzLkxFcmFzVmFsaWRhdG9yUmV3YXJkAAEEBRAYBAAMLQEgVGhlIHRvdGFsIHZhbGlkYXRvciBlcmEgcGF5b3V0IGZvciB0aGUgbGFzdCBbYENvbmZpZzo6SGlzdG9yeURlcHRoYF0gZXJhcy4AIQEgRXJhcyB0aGF0IGhhdmVuJ3QgZmluaXNoZWQgeWV0IG9yIGhhcyBiZWVuIHJlbW92ZWQgZG9lc24ndCBoYXZlIHJld2FyZC5ARXJhc1Jld2FyZFBvaW50cwEBBAUQVQoUAAAAAAAI0CBSZXdhcmRzIGZvciB0aGUgbGFzdCBbYENvbmZpZzo6SGlzdG9yeURlcHRoYF0gZXJhcy4lASBJZiByZXdhcmQgaGFzbid0IGJlZW4gc2V0IG9yIGhhcyBiZWVuIHJlbW92ZWQgdGhlbiAwIHJld2FyZCBpcyByZXR1cm5lZC44RXJhc1RvdGFsU3Rha2UBAQQFEBhAAAAAAAAAAAAAAAAAAAAAAAgRASBUaGUgdG90YWwgYW1vdW50IHN0YWtlZCBmb3IgdGhlIGxhc3QgW2BDb25maWc6Okhpc3RvcnlEZXB0aGBdIGVyYXMuHQEgSWYgdG90YWwgaGFzbid0IGJlZW4gc2V0IG9yIGhhcyBiZWVuIHJlbW92ZWQgdGhlbiAwIHN0YWtlIGlzIHJldHVybmVkLiBGb3JjZUVyYQEAqAQABFQgTW9kZSBvZiBlcmEgZm9yY2luZy5ATWF4U3Rha2VkUmV3YXJkcwAAEQIEAAwZASBNYXhpbXVtIHN0YWtlZCByZXdhcmRzLCBpLmUuIHRoZSBwZXJjZW50YWdlIG9mIHRoZSBlcmEgaW5mbGF0aW9uIHRoYXRsIGlzIHVzZWQgZm9yIHN0YWtlIHJld2FyZHMurCBTZWUgW0VyYSBwYXlvdXRdKC4vaW5kZXguaHRtbCNlcmEtcGF5b3V0KS5MU2xhc2hSZXdhcmRGcmFjdGlvbgEAmBAAAAAADPggVGhlIHBlcmNlbnRhZ2Ugb2YgdGhlIHNsYXNoIHRoYXQgaXMgZGlzdHJpYnV0ZWQgdG8gcmVwb3J0ZXJzLgDkIFRoZSByZXN0IG9mIHRoZSBzbGFzaGVkIHZhbHVlIGlzIGhhbmRsZWQgYnkgdGhlIGBTbGFzaGAuTENhbmNlbGVkU2xhc2hQYXlvdXQBABhAAAAAAAAAAAAAAAAAAAAAAAgVASBUaGUgYW1vdW50IG9mIGN1cnJlbmN5IGdpdmVuIHRvIHJlcG9ydGVycyBvZiBhIHNsYXNoIGV2ZW50IHdoaWNoIHdhc+wgY2FuY2VsZWQgYnkgZXh0cmFvcmRpbmFyeSBjaXJjdW1zdGFuY2VzIChlLmcuIGdvdmVybmFuY2UpLkBVbmFwcGxpZWRTbGFzaGVzAQEEBRBlCgQABMQgQWxsIHVuYXBwbGllZCBzbGFzaGVzIHRoYXQgYXJlIHF1ZXVlZCBmb3IgbGF0ZXIuKEJvbmRlZEVyYXMBAEEJBAAQJQEgQSBtYXBwaW5nIGZyb20gc3RpbGwtYm9uZGVkIGVyYXMgdG8gdGhlIGZpcnN0IHNlc3Npb24gaW5kZXggb2YgdGhhdCBlcmEuAMggTXVzdCBjb250YWlucyBpbmZvcm1hdGlvbiBmb3IgZXJhcyBmb3IgdGhlIHJhbmdlOrwgYFthY3RpdmVfZXJhIC0gYm91bmRpbmdfZHVyYXRpb247IGFjdGl2ZV9lcmFdYExWYWxpZGF0b3JTbGFzaEluRXJhAAEIBQU5Cm0KBAAIRQEgQWxsIHNsYXNoaW5nIGV2ZW50cyBvbiB2YWxpZGF0b3JzLCBtYXBwZWQgYnkgZXJhIHRvIHRoZSBoaWdoZXN0IHNsYXNoIHByb3BvcnRpb25wIGFuZCBzbGFzaCB2YWx1ZSBvZiB0aGUgZXJhLkxOb21pbmF0b3JTbGFzaEluRXJhAAEIBQU5ChgEAARhASBBbGwgc2xhc2hpbmcgZXZlbnRzIG9uIG5vbWluYXRvcnMsIG1hcHBlZCBieSBlcmEgdG8gdGhlIGhpZ2hlc3Qgc2xhc2ggdmFsdWUgb2YgdGhlIGVyYS40U2xhc2hpbmdTcGFucwABBAUAcQoEAASMIFNsYXNoaW5nIHNwYW5zIGZvciBzdGFzaCBhY2NvdW50cy4kU3BhblNsYXNoAQEEBWEKdQqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIPQEgUmVjb3JkcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbWF4aW11bSBzbGFzaCBvZiBhIHN0YXNoIHdpdGhpbiBhIHNsYXNoaW5nIHNwYW4suCBhcyB3ZWxsIGFzIGhvdyBtdWNoIHJld2FyZCBoYXMgYmVlbiBwYWlkIG91dC5UQ3VycmVudFBsYW5uZWRTZXNzaW9uAQAQEAAAAAAM6CBUaGUgbGFzdCBwbGFubmVkIHNlc3Npb24gc2NoZWR1bGVkIGJ5IHRoZSBzZXNzaW9uIHBhbGxldC4AcQEgVGhpcyBpcyBiYXNpY2FsbHkgaW4gc3luYyB3aXRoIHRoZSBjYWxsIHRvIFtgcGFsbGV0X3Nlc3Npb246OlNlc3Npb25NYW5hZ2VyOjpuZXdfc2Vzc2lvbmBdLjhDaGlsbFRocmVzaG9sZAAAEQIEAAxRASBUaGUgdGhyZXNob2xkIGZvciB3aGVuIHVzZXJzIGNhbiBzdGFydCBjYWxsaW5nIGBjaGlsbF9vdGhlcmAgZm9yIG90aGVyIHZhbGlkYXRvcnMgL1kBIG5vbWluYXRvcnMuIFRoZSB0aHJlc2hvbGQgaXMgY29tcGFyZWQgdG8gdGhlIGFjdHVhbCBudW1iZXIgb2YgdmFsaWRhdG9ycyAvIG5vbWluYXRvcnMpASAoYENvdW50Rm9yKmApIGluIHRoZSBzeXN0ZW0gY29tcGFyZWQgdG8gdGhlIGNvbmZpZ3VyZWQgbWF4IChgTWF4KkNvdW50YCkuAQkCAZAcMEhpc3RvcnlEZXB0aBAQVAAAAFCMIE51bWJlciBvZiBlcmFzIHRvIGtlZXAgaW4gaGlzdG9yeS4A6CBGb2xsb3dpbmcgaW5mb3JtYXRpb24gaXMga2VwdCBmb3IgZXJhcyBpbiBgW2N1cnJlbnRfZXJhIC0JASBIaXN0b3J5RGVwdGgsIGN1cnJlbnRfZXJhXWA6IGBFcmFzU3Rha2Vyc2AsIGBFcmFzU3Rha2Vyc0NsaXBwZWRgLAUBIGBFcmFzVmFsaWRhdG9yUHJlZnNgLCBgRXJhc1ZhbGlkYXRvclJld2FyZGAsIGBFcmFzUmV3YXJkUG9pbnRzYCxFASBgRXJhc1RvdGFsU3Rha2VgLCBgRXJhc1N0YXJ0U2Vzc2lvbkluZGV4YCwgYENsYWltZWRSZXdhcmRzYCwgYEVyYXNTdGFrZXJzUGFnZWRgLFwgYEVyYXNTdGFrZXJzT3ZlcnZpZXdgLgDkIE11c3QgYmUgbW9yZSB0aGFuIHRoZSBudW1iZXIgb2YgZXJhcyBkZWxheWVkIGJ5IHNlc3Npb24u+CBJLmUuIGFjdGl2ZSBlcmEgbXVzdCBhbHdheXMgYmUgaW4gaGlzdG9yeS4gSS5lLiBgYWN0aXZlX2VyYSA+xCBjdXJyZW50X2VyYSAtIGhpc3RvcnlfZGVwdGhgIG11c3QgYmUgZ3VhcmFudGVlZC4AEQEgSWYgbWlncmF0aW5nIGFuIGV4aXN0aW5nIHBhbGxldCBmcm9tIHN0b3JhZ2UgdmFsdWUgdG8gY29uZmlnIHZhbHVlLOwgdGhpcyBzaG91bGQgYmUgc2V0IHRvIHNhbWUgdmFsdWUgb3IgZ3JlYXRlciBhcyBpbiBzdG9yYWdlLgAVASBOb3RlOiBgSGlzdG9yeURlcHRoYCBpcyB1c2VkIGFzIHRoZSB1cHBlciBib3VuZCBmb3IgdGhlIGBCb3VuZGVkVmVjYC0BIGl0ZW0gYFN0YWtpbmdMZWRnZXIubGVnYWN5X2NsYWltZWRfcmV3YXJkc2AuIFNldHRpbmcgdGhpcyB2YWx1ZSBsb3dlciB0aGFu2CB0aGUgZXhpc3RpbmcgdmFsdWUgY2FuIGxlYWQgdG8gaW5jb25zaXN0ZW5jaWVzIGluIHRoZRUBIGBTdGFraW5nTGVkZ2VyYCBhbmQgd2lsbCBuZWVkIHRvIGJlIGhhbmRsZWQgcHJvcGVybHkgaW4gYSBtaWdyYXRpb24u8CBUaGUgdGVzdCBgcmVkdWNpbmdfaGlzdG9yeV9kZXB0aF9hYnJ1cHRgIHNob3dzIHRoaXMgZWZmZWN0LjhTZXNzaW9uc1BlckVyYRAQBgAAAARwIE51bWJlciBvZiBzZXNzaW9ucyBwZXIgZXJhLjxCb25kaW5nRHVyYXRpb24QEAIAAAAE5CBOdW1iZXIgb2YgZXJhcyB0aGF0IHN0YWtlZCBmdW5kcyBtdXN0IHJlbWFpbiBib25kZWQgZm9yLkhTbGFzaERlZmVyRHVyYXRpb24QEAEAAAAQAQEgTnVtYmVyIG9mIGVyYXMgdGhhdCBzbGFzaGVzIGFyZSBkZWZlcnJlZCBieSwgYWZ0ZXIgY29tcHV0YXRpb24uAA0BIFRoaXMgc2hvdWxkIGJlIGxlc3MgdGhhbiB0aGUgYm9uZGluZyBkdXJhdGlvbi4gU2V0IHRvIDAgaWYgc2xhc2hlcxUBIHNob3VsZCBiZSBhcHBsaWVkIGltbWVkaWF0ZWx5LCB3aXRob3V0IG9wcG9ydHVuaXR5IGZvciBpbnRlcnZlbnRpb24uTE1heEV4cG9zdXJlUGFnZVNpemUQEEAAAAAssCBUaGUgbWF4aW11bSBzaXplIG9mIGVhY2ggYFQ6OkV4cG9zdXJlUGFnZWAuACkBIEFuIGBFeHBvc3VyZVBhZ2VgIGlzIHdlYWtseSBib3VuZGVkIHRvIGEgbWF4aW11bSBvZiBgTWF4RXhwb3N1cmVQYWdlU2l6ZWAwIG5vbWluYXRvcnMuACEBIEZvciBvbGRlciBub24tcGFnZWQgZXhwb3N1cmUsIGEgcmV3YXJkIHBheW91dCB3YXMgcmVzdHJpY3RlZCB0byB0aGUgdG9wIQEgYE1heEV4cG9zdXJlUGFnZVNpemVgIG5vbWluYXRvcnMuIFRoaXMgaXMgdG8gbGltaXQgdGhlIGkvbyBjb3N0IGZvciB0aGVIIG5vbWluYXRvciBwYXlvdXQuAFkBIE5vdGU6IGBNYXhFeHBvc3VyZVBhZ2VTaXplYCBpcyB1c2VkIHRvIGJvdW5kIGBDbGFpbWVkUmV3YXJkc2AgYW5kIGlzIHVuc2FmZSB0byByZWR1Y2WQIHdpdGhvdXQgaGFuZGxpbmcgaXQgaW4gYSBtaWdyYXRpb24uPE1heFZhbGlkYXRvclNldBAQ6AMAAAQVASBUaGUgYWJzb2x1dGUgbWF4aW11bSBvZiB3aW5uZXIgdmFsaWRhdG9ycyB0aGlzIHBhbGxldCBzaG91bGQgcmV0dXJuLkhNYXhVbmxvY2tpbmdDaHVua3MQECAAAAAoBQEgVGhlIG1heGltdW0gbnVtYmVyIG9mIGB1bmxvY2tpbmdgIGNodW5rcyBhIFtgU3Rha2luZ0xlZGdlcmBdIGNhbgkBIGhhdmUuIEVmZmVjdGl2ZWx5IGRldGVybWluZXMgaG93IG1hbnkgdW5pcXVlIGVyYXMgYSBzdGFrZXIgbWF5IGJlOCB1bmJvbmRpbmcgaW4uAPggTm90ZTogYE1heFVubG9ja2luZ0NodW5rc2AgaXMgdXNlZCBhcyB0aGUgdXBwZXIgYm91bmQgZm9yIHRoZQEBIGBCb3VuZGVkVmVjYCBpdGVtIGBTdGFraW5nTGVkZ2VyLnVubG9ja2luZ2AuIFNldHRpbmcgdGhpcyB2YWx1ZQUBIGxvd2VyIHRoYW4gdGhlIGV4aXN0aW5nIHZhbHVlIGNhbiBsZWFkIHRvIGluY29uc2lzdGVuY2llcyBpbiB0aGUJASBgU3Rha2luZ0xlZGdlcmAgYW5kIHdpbGwgbmVlZCB0byBiZSBoYW5kbGVkIHByb3Blcmx5IGluIGEgcnVudGltZQUBIG1pZ3JhdGlvbi4gVGhlIHRlc3QgYHJlZHVjaW5nX21heF91bmxvY2tpbmdfY2h1bmtzX2FicnVwdGAgc2hvd3M0IHRoaXMgZWZmZWN0LgF5CgYAIE9mZmVuY2VzASBPZmZlbmNlcwgcUmVwb3J0cwABBAU0fQoEAARJASBUaGUgcHJpbWFyeSBzdHJ1Y3R1cmUgdGhhdCBob2xkcyBhbGwgb2ZmZW5jZSByZWNvcmRzIGtleWVkIGJ5IHJlcG9ydCBpZGVudGlmaWVycy5YQ29uY3VycmVudFJlcG9ydHNJbmRleAEBCAUFhQq5AwQABCkBIEEgdmVjdG9yIG9mIHJlcG9ydHMgb2YgdGhlIHNhbWUga2luZCB0aGF0IGhhcHBlbmVkIGF0IHRoZSBzYW1lIHRpbWUgc2xvdC4AAawAAAcAKEhpc3RvcmljYWwBKEhpc3RvcmljYWwISEhpc3RvcmljYWxTZXNzaW9ucwABBAUQiQoEAARdASBNYXBwaW5nIGZyb20gaGlzdG9yaWNhbCBzZXNzaW9uIGluZGljZXMgdG8gc2Vzc2lvbi1kYXRhIHJvb3QgaGFzaCBhbmQgdmFsaWRhdG9yIGNvdW50LixTdG9yZWRSYW5nZQAAJQEEAATkIFRoZSByYW5nZSBvZiBoaXN0b3JpY2FsIHNlc3Npb25zIHdlIHN0b3JlLiBbZmlyc3QsIGxhc3QpAAG0AAAbAChQYXJhbWV0ZXJzAShQYXJhbWV0ZXJzBChQYXJhbWV0ZXJzAAEEArzcBAAETCBTdG9yZWQgcGFyYW1ldGVycy4BPQIBuAAARgAcU2Vzc2lvbgEcU2Vzc2lvbhwoVmFsaWRhdG9ycwEAAQIEAAR8IFRoZSBjdXJyZW50IHNldCBvZiB2YWxpZGF0b3JzLjBDdXJyZW50SW5kZXgBABAQAAAAAAR4IEN1cnJlbnQgaW5kZXggb2YgdGhlIHNlc3Npb24uNFF1ZXVlZENoYW5nZWQBACAEAAg5ASBUcnVlIGlmIHRoZSB1bmRlcmx5aW5nIGVjb25vbWljIGlkZW50aXRpZXMgb3Igd2VpZ2h0aW5nIGJlaGluZCB0aGUgdmFsaWRhdG9yc6QgaGFzIGNoYW5nZWQgaW4gdGhlIHF1ZXVlZCB2YWxpZGF0b3Igc2V0LihRdWV1ZWRLZXlzAQCNCgQACD0BIFRoZSBxdWV1ZWQga2V5cyBmb3IgdGhlIG5leHQgc2Vzc2lvbi4gV2hlbiB0aGUgbmV4dCBzZXNzaW9uIGJlZ2lucywgdGhlc2Uga2V5c+Agd2lsbCBiZSB1c2VkIHRvIGRldGVybWluZSB0aGUgdmFsaWRhdG9yJ3Mgc2Vzc2lvbiBrZXlzLkhEaXNhYmxlZFZhbGlkYXRvcnMBAJUKBAAUgCBJbmRpY2VzIG9mIGRpc2FibGVkIHZhbGlkYXRvcnMuAD0BIFRoZSB2ZWMgaXMgYWx3YXlzIGtlcHQgc29ydGVkIHNvIHRoYXQgd2UgY2FuIGZpbmQgd2hldGhlciBhIGdpdmVuIHZhbGlkYXRvciBpcz0BIGRpc2FibGVkIHVzaW5nIGJpbmFyeSBzZWFyY2guIEl0IGdldHMgY2xlYXJlZCB3aGVuIGBvbl9zZXNzaW9uX2VuZGluZ2AgcmV0dXJuc2QgYSBuZXcgc2V0IG9mIGlkZW50aXRpZXMuIE5leHRLZXlzAAEEBQBVAgQABJwgVGhlIG5leHQgc2Vzc2lvbiBrZXlzIGZvciBhIHZhbGlkYXRvci4gS2V5T3duZXIAAQQFoQoABAAECQEgVGhlIG93bmVyIG9mIGEga2V5LiBUaGUga2V5IGlzIHRoZSBgS2V5VHlwZUlkYCArIHRoZSBlbmNvZGVkIGtleS4BUQIB6AQoS2V5RGVwb3NpdBhAAAAAAAAAAAAAAAAAAAAAAASkIFRoZSBhbW91bnQgdG8gYmUgaGVsZCB3aGVuIHNldHRpbmcga2V5cy4BqQoIABxHcmFuZHBhARxHcmFuZHBhHBRTdGF0ZQEArQoEAASQIFN0YXRlIG9mIHRoZSBjdXJyZW50IGF1dGhvcml0eSBzZXQuNFBlbmRpbmdDaGFuZ2UAALEKBAAExCBQZW5kaW5nIGNoYW5nZTogKHNpZ25hbGVkIGF0LCBzY2hlZHVsZWQgY2hhbmdlKS4oTmV4dEZvcmNlZAAAEAQABLwgbmV4dCBibG9jayBudW1iZXIgd2hlcmUgd2UgY2FuIGZvcmNlIGEgY2hhbmdlLhxTdGFsbGVkAAAlAQQABJAgYHRydWVgIGlmIHdlIGFyZSBjdXJyZW50bHkgc3RhbGxlZC4wQ3VycmVudFNldElkAQAwIAAAAAAAAAAACF0BIFRoZSBudW1iZXIgb2YgY2hhbmdlcyAoYm90aCBpbiB0ZXJtcyBvZiBrZXlzIGFuZCB1bmRlcmx5aW5nIGVjb25vbWljIHJlc3BvbnNpYmlsaXRpZXMpxCBpbiB0aGUgInNldCIgb2YgR3JhbmRwYSB2YWxpZGF0b3JzIGZyb20gZ2VuZXNpcy4wU2V0SWRTZXNzaW9uAAEEBTAQBAAoWQEgQSBtYXBwaW5nIGZyb20gZ3JhbmRwYSBzZXQgSUQgdG8gdGhlIGluZGV4IG9mIHRoZSAqbW9zdCByZWNlbnQqIHNlc3Npb24gZm9yIHdoaWNoIGl0c2ggbWVtYmVycyB3ZXJlIHJlc3BvbnNpYmxlLgBFASBUaGlzIGlzIG9ubHkgdXNlZCBmb3IgdmFsaWRhdGluZyBlcXVpdm9jYXRpb24gcHJvb2ZzLiBBbiBlcXVpdm9jYXRpb24gcHJvb2YgbXVzdE0BIGNvbnRhaW5zIGEga2V5LW93bmVyc2hpcCBwcm9vZiBmb3IgYSBnaXZlbiBzZXNzaW9uLCB0aGVyZWZvcmUgd2UgbmVlZCBhIHdheSB0byB0aWVFASB0b2dldGhlciBzZXNzaW9ucyBhbmQgR1JBTkRQQSBzZXQgaWRzLCBpLmUuIHdlIG5lZWQgdG8gdmFsaWRhdGUgdGhhdCBhIHZhbGlkYXRvckEBIHdhcyB0aGUgb3duZXIgb2YgYSBnaXZlbiBrZXkgb24gYSBnaXZlbiBzZXNzaW9uLCBhbmQgd2hhdCB0aGUgYWN0aXZlIHNldCBJRCB3YXNUIGR1cmluZyB0aGF0IHNlc3Npb24uALggVFdPWC1OT1RFOiBgU2V0SWRgIGlzIG5vdCB1bmRlciB1c2VyIGNvbnRyb2wuLEF1dGhvcml0aWVzAQC1CgQABIQgVGhlIGN1cnJlbnQgbGlzdCBvZiBhdXRob3JpdGllcy4BbQIB7Aw4TWF4QXV0aG9yaXRpZXMQEKCGAQAEXCBNYXggQXV0aG9yaXRpZXMgaW4gdXNlNE1heE5vbWluYXRvcnMQEEAAAAAE1CBUaGUgbWF4aW11bSBudW1iZXIgb2Ygbm9taW5hdG9ycyBmb3IgZWFjaCB2YWxpZGF0b3IuWE1heFNldElkU2Vzc2lvbkVudHJpZXMwIAwAAAAAAAAAGDkBIFRoZSBtYXhpbXVtIG51bWJlciBvZiBlbnRyaWVzIHRvIGtlZXAgaW4gdGhlIHNldCBpZCB0byBzZXNzaW9uIGluZGV4IG1hcHBpbmcuADEBIFNpbmNlIHRoZSBgU2V0SWRTZXNzaW9uYCBtYXAgaXMgb25seSB1c2VkIGZvciB2YWxpZGF0aW5nIGVxdWl2b2NhdGlvbnMgdGhpcykBIHZhbHVlIHNob3VsZCByZWxhdGUgdG8gdGhlIGJvbmRpbmcgZHVyYXRpb24gb2Ygd2hhdGV2ZXIgc3Rha2luZyBzeXN0ZW0gaXM1ASBiZWluZyB1c2VkIChpZiBhbnkpLiBJZiBlcXVpdm9jYXRpb24gaGFuZGxpbmcgaXMgbm90IGVuYWJsZWQgdGhlbiB0aGlzIHZhbHVlNCBjYW4gYmUgemVyby4BuQoKAEhBdXRob3JpdHlEaXNjb3ZlcnkBSEF1dGhvcml0eURpc2NvdmVyeQgQS2V5cwEAvQoEAASMIEtleXMgb2YgdGhlIGN1cnJlbnQgYXV0aG9yaXR5IHNldC4gTmV4dEtleXMBAL0KBAAEgCBLZXlzIG9mIHRoZSBuZXh0IGF1dGhvcml0eSBzZXQuAAAAAAwAHFV0aWxpdHkAAZkCAfwETGJhdGNoZWRfY2FsbHNfbGltaXQQEKoqAAAEqCBUaGUgbGltaXQgb24gdGhlIG51bWJlciBvZiBiYXRjaGVkIGNhbGxzLgHFChAAIElkZW50aXR5ASBJZGVudGl0eSQoSWRlbnRpdHlPZgABBAUAyQoEABBpASBJbmZvcm1hdGlvbiB0aGF0IGlzIHBlcnRpbmVudCB0byBpZGVudGlmeSB0aGUgZW50aXR5IGJlaGluZCBhbiBhY2NvdW50LiBGaXJzdCBpdGVtIGlzIHRoZeAgcmVnaXN0cmF0aW9uLCBzZWNvbmQgaXMgdGhlIGFjY291bnQncyBwcmltYXJ5IHVzZXJuYW1lLgDAIFRXT1gtTk9URTogT0sg4oCVIGBBY2NvdW50SWRgIGlzIGEgc2VjdXJlIGhhc2guKFVzZXJuYW1lT2YAAQQFAA0BBAAEvCBJZGVudGlmaWVzIHRoZSBwcmltYXJ5IHVzZXJuYW1lIG9mIGFuIGFjY291bnQuHFN1cGVyT2YAAQQCAIkDBAAIYQEgVGhlIHN1cGVyLWlkZW50aXR5IG9mIGFuIGFsdGVybmF0aXZlICJzdWIiIGlkZW50aXR5IHRvZ2V0aGVyIHdpdGggaXRzIG5hbWUsIHdpdGhpbiB0aGF0UQEgY29udGV4dC4gSWYgdGhlIGFjY291bnQgaXMgbm90IHNvbWUgb3RoZXIgYWNjb3VudCdzIHN1Yi1pZGVudGl0eSwgdGhlbiBqdXN0IGBOb25lYC4YU3Vic09mAQEEBQDZCkQAAAAAAAAAAAAAAAAAAAAAABS4IEFsdGVybmF0aXZlICJzdWIiIGlkZW50aXRpZXMgb2YgdGhpcyBhY2NvdW50LgAdASBUaGUgZmlyc3QgaXRlbSBpcyB0aGUgZGVwb3NpdCwgdGhlIHNlY29uZCBpcyBhIHZlY3RvciBvZiB0aGUgYWNjb3VudHMuAMAgVFdPWC1OT1RFOiBPSyDigJUgYEFjY291bnRJZGAgaXMgYSBzZWN1cmUgaGFzaC4oUmVnaXN0cmFycwEA4QoEABBNASBUaGUgc2V0IG9mIHJlZ2lzdHJhcnMuIE5vdCBleHBlY3RlZCB0byBnZXQgdmVyeSBiaWcgYXMgY2FuIG9ubHkgYmUgYWRkZWQgdGhyb3VnaCBhqCBzcGVjaWFsIG9yaWdpbiAobGlrZWx5IGEgY291bmNpbCBtb3Rpb24pLgApASBUaGUgaW5kZXggaW50byB0aGlzIGNhbiBiZSBjYXN0IHRvIGBSZWdpc3RyYXJJbmRleGAgdG8gZ2V0IGEgdmFsaWQgdmFsdWUuLEF1dGhvcml0eU9mAAEEBfEK9QoEAAT0IEEgbWFwIG9mIHRoZSBhY2NvdW50cyB3aG8gYXJlIGF1dGhvcml6ZWQgdG8gZ3JhbnQgdXNlcm5hbWVzLjhVc2VybmFtZUluZm9PZgABBAINAfkKBAAYdQEgUmV2ZXJzZSBsb29rdXAgZnJvbSBgdXNlcm5hbWVgIHRvIHRoZSBgQWNjb3VudElkYCB0aGF0IGhhcyByZWdpc3RlcmVkIGl0IGFuZCB0aGUgcHJvdmlkZXIgb2ZtASB0aGUgdXNlcm5hbWUuIFRoZSBgb3duZXJgIHZhbHVlIHNob3VsZCBiZSBhIGtleSBpbiB0aGUgYFVzZXJuYW1lT2ZgIG1hcCwgYnV0IGl0IG1heSBub3QgaWbwIHRoZSB1c2VyIGhhcyBjbGVhcmVkIHRoZWlyIHVzZXJuYW1lIG9yIGl0IGhhcyBiZWVuIHJlbW92ZWQuAGkBIE11bHRpcGxlIHVzZXJuYW1lcyBtYXkgbWFwIHRvIHRoZSBzYW1lIGBBY2NvdW50SWRgLCBidXQgYFVzZXJuYW1lT2ZgIHdpbGwgb25seSBtYXAgdG8gb25lSCBwcmltYXJ5IHVzZXJuYW1lLkBQZW5kaW5nVXNlcm5hbWVzAAEEAg0BAQsEABhtASBVc2VybmFtZXMgdGhhdCBhbiBhdXRob3JpdHkgaGFzIGdyYW50ZWQsIGJ1dCB0aGF0IHRoZSBhY2NvdW50IGNvbnRyb2xsZXIgaGFzIG5vdCBjb25maXJtZWRxASB0aGF0IHRoZXkgd2FudCBpdC4gVXNlZCBwcmltYXJpbHkgaW4gY2FzZXMgd2hlcmUgdGhlIGBBY2NvdW50SWRgIGNhbm5vdCBwcm92aWRlIGEgc2lnbmF0dXJlXQEgYmVjYXVzZSB0aGV5IGFyZSBhIHB1cmUgcHJveHksIG11bHRpc2lnLCBldGMuIEluIG9yZGVyIHRvIGNvbmZpcm0gaXQsIHRoZXkgc2hvdWxkIGNhbGywIFthY2NlcHRfdXNlcm5hbWVdKGBDYWxsOjphY2NlcHRfdXNlcm5hbWVgKS4AHQEgRmlyc3QgdHVwbGUgaXRlbSBpcyB0aGUgYWNjb3VudCBhbmQgc2Vjb25kIGlzIHRoZSBhY2NlcHRhbmNlIGRlYWRsaW5lLkhVbmJpbmRpbmdVc2VybmFtZXMAAQQCDQEQBAAQXQEgVXNlcm5hbWVzIGZvciB3aGljaCB0aGUgYXV0aG9yaXR5IHRoYXQgZ3JhbnRlZCB0aGVtIGhhcyBzdGFydGVkIHRoZSByZW1vdmFsIHByb2Nlc3MgYnlxASB1bmJpbmRpbmcgdGhlbS4gRWFjaCB1bmJpbmRpbmcgdXNlcm5hbWUgbWFwcyB0byBpdHMgZ3JhY2UgcGVyaW9kIGV4cGlyeSwgd2hpY2ggaXMgdGhlIGZpcnN03CBibG9jayBpbiB3aGljaCB0aGUgdXNlcm5hbWUgY291bGQgYmUgZGVsZXRlZCB0aHJvdWdoIGHEIFtyZW1vdmVfdXNlcm5hbWVdKGBDYWxsOjpyZW1vdmVfdXNlcm5hbWVgKSBjYWxsLgH1AgEJASgwQmFzaWNEZXBvc2l0GEAAoHJOGAkAAAAAAAAAAAAABNggVGhlIGFtb3VudCBoZWxkIG9uIGRlcG9zaXQgZm9yIGEgcmVnaXN0ZXJlZCBpZGVudGl0eS4sQnl0ZURlcG9zaXQYQIDw+gIAAAAAAAAAAAAAAAAEHQEgVGhlIGFtb3VudCBoZWxkIG9uIGRlcG9zaXQgcGVyIGVuY29kZWQgYnl0ZSBmb3IgYSByZWdpc3RlcmVkIGlkZW50aXR5LjxVc2VybmFtZURlcG9zaXQYQAAQXl8AAAAAAAAAAAAAAAAIVQEgVGhlIGFtb3VudCBoZWxkIG9uIGRlcG9zaXQgcGVyIHJlZ2lzdGVyZWQgdXNlcm5hbWUuIFRoaXMgdmFsdWUgc2hvdWxkIGNoYW5nZSBvbmx5IGlu9CBydW50aW1lIHVwZ3JhZGVzIHdpdGggcHJvcGVyIG1pZ3JhdGlvbiBvZiBleGlzdGluZyBkZXBvc2l0cy5EU3ViQWNjb3VudERlcG9zaXQYQAAgSqnRAQAAAAAAAAAAAAAMZQEgVGhlIGFtb3VudCBoZWxkIG9uIGRlcG9zaXQgZm9yIGEgcmVnaXN0ZXJlZCBzdWJhY2NvdW50LiBUaGlzIHNob3VsZCBhY2NvdW50IGZvciB0aGUgZmFjdGUBIHRoYXQgb25lIHN0b3JhZ2UgaXRlbSdzIHZhbHVlIHdpbGwgaW5jcmVhc2UgYnkgdGhlIHNpemUgb2YgYW4gYWNjb3VudCBJRCwgYW5kIHRoZXJlIHdpbGw1ASBiZSBhbm90aGVyIHRyaWUgaXRlbSB3aG9zZSB2YWx1ZSBpcyB0aGUgc2l6ZSBvZiBhbiBhY2NvdW50IElEIHBsdXMgMzIgYnl0ZXMuOE1heFN1YkFjY291bnRzEBBkAAAABA0BIFRoZSBtYXhpbXVtIG51bWJlciBvZiBzdWItYWNjb3VudHMgYWxsb3dlZCBwZXIgaWRlbnRpZmllZCBhY2NvdW50LjRNYXhSZWdpc3RyYXJzEBAUAAAACE0BIE1heGltdW0gbnVtYmVyIG9mIHJlZ2lzdHJhcnMgYWxsb3dlZCBpbiB0aGUgc3lzdGVtLiBOZWVkZWQgdG8gYm91bmQgdGhlIGNvbXBsZXhpdHl8IG9mLCBlLmcuLCB1cGRhdGluZyBqdWRnZW1lbnRzLmRQZW5kaW5nVXNlcm5hbWVFeHBpcmF0aW9uEBDAiQEABBUBIFRoZSBudW1iZXIgb2YgYmxvY2tzIHdpdGhpbiB3aGljaCBhIHVzZXJuYW1lIGdyYW50IG11c3QgYmUgYWNjZXB0ZWQuTFVzZXJuYW1lR3JhY2VQZXJpb2QQEICXBgAIWQEgVGhlIG51bWJlciBvZiBibG9ja3MgdGhhdCBtdXN0IHBhc3MgdG8gZW5hYmxlIHRoZSBwZXJtYW5lbnQgZGVsZXRpb24gb2YgYSB1c2VybmFtZSBieWggaXRzIHJlc3BlY3RpdmUgYXV0aG9yaXR5LjxNYXhTdWZmaXhMZW5ndGgQEAcAAAAEgCBUaGUgbWF4aW11bSBsZW5ndGggb2YgYSBzdWZmaXguRE1heFVzZXJuYW1lTGVuZ3RoEBAgAAAABGEBIFRoZSBtYXhpbXVtIGxlbmd0aCBvZiBhIHVzZXJuYW1lLCBpbmNsdWRpbmcgaXRzIHN1ZmZpeCBhbmQgYW55IHN5c3RlbS1hZGRlZCBkZWxpbWl0ZXJzLgEFCxEAIFJlY292ZXJ5ASBSZWNvdmVyeQwsUmVjb3ZlcmFibGUAAQQFAAkLBAAECQEgVGhlIHNldCBvZiByZWNvdmVyYWJsZSBhY2NvdW50cyBhbmQgdGhlaXIgcmVjb3ZlcnkgY29uZmlndXJhdGlvbi5AQWN0aXZlUmVjb3ZlcmllcwABCAUFEQsVCwQAEGggQWN0aXZlIHJlY292ZXJ5IGF0dGVtcHRzLgAVASBGaXJzdCBhY2NvdW50IGlzIHRoZSBhY2NvdW50IHRvIGJlIHJlY292ZXJlZCwgYW5kIHRoZSBzZWNvbmQgYWNjb3VudKwgaXMgdGhlIHVzZXIgdHJ5aW5nIHRvIHJlY292ZXIgdGhlIGFjY291bnQuFFByb3h5AAEEAgAABAAMkCBUaGUgbGlzdCBvZiBhbGxvd2VkIHByb3h5IGFjY291bnRzLgD4IE1hcCBmcm9tIHRoZSB1c2VyIHdobyBjYW4gYWNjZXNzIGl0IHRvIHRoZSByZWNvdmVyZWQgYWNjb3VudC4BnQMBEQEQRENvbmZpZ0RlcG9zaXRCYXNlGEAAUDknjAQAAAAAAAAAAAAAEFUBIFRoZSBiYXNlIGFtb3VudCBvZiBjdXJyZW5jeSBuZWVkZWQgdG8gcmVzZXJ2ZSBmb3IgY3JlYXRpbmcgYSByZWNvdmVyeSBjb25maWd1cmF0aW9uLgABASBUaGlzIGlzIGhlbGQgZm9yIGFuIGFkZGl0aW9uYWwgc3RvcmFnZSBpdGVtIHdob3NlIHZhbHVlIHNpemUgaXOoIGAyICsgc2l6ZW9mKEJsb2NrTnVtYmVyLCBCYWxhbmNlKWAgYnl0ZXMuTEZyaWVuZERlcG9zaXRGYWN0b3IYQACIUmp0AAAAAAAAAAAAAAAULQEgVGhlIGFtb3VudCBvZiBjdXJyZW5jeSBuZWVkZWQgcGVyIGFkZGl0aW9uYWwgdXNlciB3aGVuIGNyZWF0aW5nIGEgcmVjb3Zlcnk8IGNvbmZpZ3VyYXRpb24uAE0BIFRoaXMgaXMgaGVsZCBmb3IgYWRkaW5nIGBzaXplb2YoQWNjb3VudElkKWAgYnl0ZXMgbW9yZSBpbnRvIGEgcHJlLWV4aXN0aW5nIHN0b3JhZ2UcIHZhbHVlLihNYXhGcmllbmRzEBAJAAAAGA0BIFRoZSBtYXhpbXVtIGFtb3VudCBvZiBmcmllbmRzIGFsbG93ZWQgaW4gYSByZWNvdmVyeSBjb25maWd1cmF0aW9uLgANASBOT1RFOiBUaGUgdGhyZXNob2xkIHByb2dyYW1tZWQgaW4gdGhpcyBQYWxsZXQgdXNlcyB1MTYsIHNvIGl0IGRvZXMJASBub3QgcmVhbGx5IG1ha2Ugc2Vuc2UgdG8gaGF2ZSBhIGxpbWl0IGhlcmUgZ3JlYXRlciB0aGFuIHUxNjo6TUFYLhUBIEJ1dCBhbHNvLCB0aGF0IGlzIGEgbG90IG1vcmUgdGhhbiB5b3Ugc2hvdWxkIHByb2JhYmx5IHNldCB0aGlzIHZhbHVlNCB0byBhbnl3YXkuLi48UmVjb3ZlcnlEZXBvc2l0GEAAUDknjAQAAAAAAAAAAAAAHB0BIFRoZSBiYXNlIGFtb3VudCBvZiBjdXJyZW5jeSBuZWVkZWQgdG8gcmVzZXJ2ZSBmb3Igc3RhcnRpbmcgYSByZWNvdmVyeS4ANQEgVGhpcyBpcyBwcmltYXJpbHkgaGVsZCBmb3IgZGV0ZXJyaW5nIG1hbGljaW91cyByZWNvdmVyeSBhdHRlbXB0cywgYW5kIHNob3VsZCkBIGhhdmUgYSB2YWx1ZSBsYXJnZSBlbm91Z2ggdGhhdCBhIGJhZCBhY3RvciB3b3VsZCBjaG9vc2Ugbm90IHRvIHBsYWNlIHRoaXMpASBkZXBvc2l0LiBJdCBhbHNvIGFjdHMgdG8gZnVuZCBhZGRpdGlvbmFsIHN0b3JhZ2UgaXRlbSB3aG9zZSB2YWx1ZSBzaXplIGlzQQEgYHNpemVvZihCbG9ja051bWJlciwgQmFsYW5jZSArIFQgKiBBY2NvdW50SWQpYCBieXRlcy4gV2hlcmUgVCBpcyBhIGNvbmZpZ3VyYWJsZSwgdGhyZXNob2xkLgEZCxIAHFZlc3RpbmcBHFZlc3RpbmcIHFZlc3RpbmcAAQQCAB0LBAAE2CBJbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhlIHZlc3Rpbmcgb2YgYSBnaXZlbiBhY2NvdW50LjhTdG9yYWdlVmVyc2lvbgEAJQsEAAx8IFN0b3JhZ2UgdmVyc2lvbiBvZiB0aGUgcGFsbGV0LgAxASBOZXcgbmV0d29ya3Mgc3RhcnQgd2l0aCBsYXRlc3QgdmVyc2lvbiwgYXMgZGV0ZXJtaW5lZCBieSB0aGUgZ2VuZXNpcyBidWlsZC4BpQMBHQEIRE1pblZlc3RlZFRyYW5zZmVyGEAAEKXU6AAAAAAAAAAAAAAABOggVGhlIG1pbmltdW0gYW1vdW50IHRyYW5zZmVycmVkIHRvIGNhbGwgYHZlc3RlZF90cmFuc2ZlcmAuTE1heFZlc3RpbmdTY2hlZHVsZXMQEBwAAAAAASkLEwAkU2NoZWR1bGVyASRTY2hlZHVsZXIQPEluY29tcGxldGVTaW5jZQAAEAQABPQgQmxvY2sgbnVtYmVyIGF0IHdoaWNoIHRoZSBhZ2VuZGEgYmVnYW4gaW5jb21wbGV0ZSBleGVjdXRpb24uGEFnZW5kYQEBBAUQLQsEAARNASBJdGVtcyB0byBiZSBleGVjdXRlZCwgaW5kZXhlZCBieSB0aGUgYmxvY2sgbnVtYmVyIHRoYXQgdGhleSBzaG91bGQgYmUgZXhlY3V0ZWQgb24uHFJldHJpZXMAAQQCJQE9CwQABCEBIFJldHJ5IGNvbmZpZ3VyYXRpb25zIGZvciBpdGVtcyB0byBiZSBleGVjdXRlZCwgaW5kZXhlZCBieSB0YXNrIGFkZHJlc3MuGExvb2t1cAABBAUEJQEEABD4IExvb2t1cCBmcm9tIGEgbmFtZSB0byB0aGUgYmxvY2sgbnVtYmVyIGFuZCBpbmRleCBvZiB0aGUgdGFzay4AWQEgRm9yIHYzIC0+IHY0IHRoZSBwcmV2aW91c2x5IHVuYm91bmRlZCBpZGVudGl0aWVzIGFyZSBCbGFrZTItMjU2IGhhc2hlZCB0byBmb3JtIHRoZSB2NDAgaWRlbnRpdGllcy4BrQMBIQEINE1heGltdW1XZWlnaHQoQAsAgG6HdAETzMzMzMzMzMwEKQEgVGhlIG1heGltdW0gd2VpZ2h0IHRoYXQgbWF5IGJlIHNjaGVkdWxlZCBwZXIgYmxvY2sgZm9yIGFueSBkaXNwYXRjaGFibGVzLlBNYXhTY2hlZHVsZWRQZXJCbG9jaxAQMgAAABQdASBUaGUgbWF4aW11bSBudW1iZXIgb2Ygc2NoZWR1bGVkIGNhbGxzIGluIHRoZSBxdWV1ZSBmb3IgYSBzaW5nbGUgYmxvY2suABggTk9URTpRASArIERlcGVuZGVudCBwYWxsZXRzJyBiZW5jaG1hcmtzIG1pZ2h0IHJlcXVpcmUgYSBoaWdoZXIgbGltaXQgZm9yIHRoZSBzZXR0aW5nLiBTZXQgYcQgaGlnaGVyIGxpbWl0IHVuZGVyIGBydW50aW1lLWJlbmNobWFya3NgIGZlYXR1cmUuAUELFAAgUHJlaW1hZ2UBIFByZWltYWdlDCRTdGF0dXNGb3IAAQQGNEULBAAEkCBUaGUgcmVxdWVzdCBzdGF0dXMgb2YgYSBnaXZlbiBoYXNoLkBSZXF1ZXN0U3RhdHVzRm9yAAEEBjRNCwQABJAgVGhlIHJlcXVlc3Qgc3RhdHVzIG9mIGEgZ2l2ZW4gaGFzaC4sUHJlaW1hZ2VGb3IAAQQGiQpdCwQAAAG1AwEtAQABYQscABBTdWRvARBTdWRvBAxLZXkAAAAEAASEIFRoZSBgQWNjb3VudElkYCBvZiB0aGUgc3VkbyBrZXkuAb0DATEBAAFlCxUAFFByb3h5ARRQcm94eQgcUHJveGllcwEBBAUAaQtEAAAAAAAAAAAAAAAAAAAAAAAIRQEgVGhlIHNldCBvZiBhY2NvdW50IHByb3hpZXMuIE1hcHMgdGhlIGFjY291bnQgd2hpY2ggaGFzIGRlbGVnYXRlZCB0byB0aGUgYWNjb3VudHMhASB3aGljaCBhcmUgYmVpbmcgZGVsZWdhdGVkIHRvLCB0b2dldGhlciB3aXRoIHRoZSBhbW91bnQgaGVsZCBvbiBkZXBvc2l0LjRBbm5vdW5jZW1lbnRzAQEEBQB5C0QAAAAAAAAAAAAAAAAAAAAAAASsIFRoZSBhbm5vdW5jZW1lbnRzIG1hZGUgYnkgdGhlIHByb3h5IChrZXkpLgHBAwE5ARhAUHJveHlEZXBvc2l0QmFzZRhAAJR87OgAAAAAAAAAAAAAABARASBUaGUgYmFzZSBhbW91bnQgb2YgY3VycmVuY3kgbmVlZGVkIHRvIHJlc2VydmUgZm9yIGNyZWF0aW5nIGEgcHJveHkuAAEBIFRoaXMgaXMgaGVsZCBmb3IgYW4gYWRkaXRpb25hbCBzdG9yYWdlIGl0ZW0gd2hvc2UgdmFsdWUgc2l6ZSBpcyUBIGBzaXplb2YoQmFsYW5jZSlgIGJ5dGVzIGFuZCB3aG9zZSBrZXkgc2l6ZSBpcyBgc2l6ZW9mKEFjY291bnRJZClgIGJ5dGVzLkhQcm94eURlcG9zaXRGYWN0b3IYQIAAWWIAAAAAAAAAAAAAAAAUvCBUaGUgYW1vdW50IG9mIGN1cnJlbmN5IG5lZWRlZCBwZXIgcHJveHkgYWRkZWQuADUBIFRoaXMgaXMgaGVsZCBmb3IgYWRkaW5nIDMyIGJ5dGVzIHBsdXMgYW4gaW5zdGFuY2Ugb2YgYFByb3h5VHlwZWAgbW9yZSBpbnRvIGFhASBwcmUtZXhpc3Rpbmcgc3RvcmFnZSB2YWx1ZS4gVGh1cywgd2hlbiBjb25maWd1cmluZyBgUHJveHlEZXBvc2l0RmFjdG9yYCBvbmUgc2hvdWxkIHRha2X0IGludG8gYWNjb3VudCBgMzIgKyBwcm94eV90eXBlLmVuY29kZSgpLmxlbigpYCBieXRlcyBvZiBkYXRhLihNYXhQcm94aWVzEBAgAAAABPAgVGhlIG1heGltdW0gYW1vdW50IG9mIHByb3hpZXMgYWxsb3dlZCBmb3IgYSBzaW5nbGUgYWNjb3VudC4oTWF4UGVuZGluZxAQIAAAAARFASBUaGUgbWF4aW11bSBhbW91bnQgb2YgdGltZS1kZWxheWVkIGFubm91bmNlbWVudHMgdGhhdCBhcmUgYWxsb3dlZCB0byBiZSBwZW5kaW5nLlxBbm5vdW5jZW1lbnREZXBvc2l0QmFzZRhAAJR87OgAAAAAAAAAAAAAABAxASBUaGUgYmFzZSBhbW91bnQgb2YgY3VycmVuY3kgbmVlZGVkIHRvIHJlc2VydmUgZm9yIGNyZWF0aW5nIGFuIGFubm91bmNlbWVudC4ASQEgVGhpcyBpcyBoZWxkIHdoZW4gYSBuZXcgc3RvcmFnZSBpdGVtIGhvbGRpbmcgYSBgQmFsYW5jZWAgaXMgY3JlYXRlZCAodHlwaWNhbGx5IDE2ICBieXRlcykuZEFubm91bmNlbWVudERlcG9zaXRGYWN0b3IYQAABssQAAAAAAAAAAAAAAAAQ1CBUaGUgYW1vdW50IG9mIGN1cnJlbmN5IG5lZWRlZCBwZXIgYW5ub3VuY2VtZW50IG1hZGUuAFkBIFRoaXMgaXMgaGVsZCBmb3IgYWRkaW5nIGFuIGBBY2NvdW50SWRgLCBgSGFzaGAgYW5kIGBCbG9ja051bWJlcmAgKHR5cGljYWxseSA2OCBieXRlcymMIGludG8gYSBwcmUtZXhpc3Rpbmcgc3RvcmFnZSB2YWx1ZS4BiQsWACBNdWx0aXNpZwEgTXVsdGlzaWcEJE11bHRpc2lncwABCAUCjQuRCwQABJQgVGhlIHNldCBvZiBvcGVuIG11bHRpc2lnIG9wZXJhdGlvbnMuAckDAUkBDCxEZXBvc2l0QmFzZRhAALzn2ukAAAAAAAAAAAAAABhZASBUaGUgYmFzZSBhbW91bnQgb2YgY3VycmVuY3kgbmVlZGVkIHRvIHJlc2VydmUgZm9yIGNyZWF0aW5nIGEgbXVsdGlzaWcgZXhlY3V0aW9uIG9yIHRvhCBzdG9yZSBhIGRpc3BhdGNoIGNhbGwgZm9yIGxhdGVyLgABASBUaGlzIGlzIGhlbGQgZm9yIGFuIGFkZGl0aW9uYWwgc3RvcmFnZSBpdGVtIHdob3NlIHZhbHVlIHNpemUgaXMxASBgNCArIHNpemVvZigoQmxvY2tOdW1iZXIsIEJhbGFuY2UsIEFjY291bnRJZCkpYCBieXRlcyBhbmQgd2hvc2Uga2V5IHNpemUgaXOAIGAzMiArIHNpemVvZihBY2NvdW50SWQpYCBieXRlcy40RGVwb3NpdEZhY3RvchhAABBeXwAAAAAAAAAAAAAAAAxVASBUaGUgYW1vdW50IG9mIGN1cnJlbmN5IG5lZWRlZCBwZXIgdW5pdCB0aHJlc2hvbGQgd2hlbiBjcmVhdGluZyBhIG11bHRpc2lnIGV4ZWN1dGlvbi4AJQEgVGhpcyBpcyBoZWxkIGZvciBhZGRpbmcgMzIgYnl0ZXMgbW9yZSBpbnRvIGEgcHJlLWV4aXN0aW5nIHN0b3JhZ2UgdmFsdWUuOE1heFNpZ25hdG9yaWVzEBBkAAAABOwgVGhlIG1heGltdW0gYW1vdW50IG9mIHNpZ25hdG9yaWVzIGFsbG93ZWQgaW4gdGhlIG11bHRpc2lnLgGZCxcAaEVsZWN0aW9uUHJvdmlkZXJNdWx0aVBoYXNlAWhFbGVjdGlvblByb3ZpZGVyTXVsdGlQaGFzZSgUUm91bmQBABAQAQAAABisIEludGVybmFsIGNvdW50ZXIgZm9yIHRoZSBudW1iZXIgb2Ygcm91bmRzLgBVASBUaGlzIGlzIHVzZWZ1bCBmb3IgZGUtZHVwbGljYXRpb24gb2YgdHJhbnNhY3Rpb25zIHN1Ym1pdHRlZCB0byB0aGUgcG9vbCwgYW5kIGdlbmVyYWxsIGRpYWdub3N0aWNzIG9mIHRoZSBwYWxsZXQuAE0BIFRoaXMgaXMgbWVyZWx5IGluY3JlbWVudGVkIG9uY2UgcGVyIGV2ZXJ5IHRpbWUgdGhhdCBhbiB1cHN0cmVhbSBgZWxlY3RgIGlzIGNhbGxlZC4wQ3VycmVudFBoYXNlAQBdAQQABDwgQ3VycmVudCBwaGFzZS44UXVldWVkU29sdXRpb24AAJ0LBAAMPQEgQ3VycmVudCBiZXN0IHNvbHV0aW9uLCBzaWduZWQgb3IgdW5zaWduZWQsIHF1ZXVlZCB0byBiZSByZXR1cm5lZCB1cG9uIGBlbGVjdGAuAGAgQWx3YXlzIHNvcnRlZCBieSBzY29yZS4gU25hcHNob3QAALkLBAAQcCBTbmFwc2hvdCBkYXRhIG9mIHRoZSByb3VuZC4AXQEgVGhpcyBpcyBjcmVhdGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHNpZ25lZCBwaGFzZSBhbmQgY2xlYXJlZCB1cG9uIGNhbGxpbmcgYGVsZWN0YC4pASBOb3RlOiBUaGlzIHN0b3JhZ2UgdHlwZSBtdXN0IG9ubHkgYmUgbXV0YXRlZCB0aHJvdWdoIFtgU25hcHNob3RXcmFwcGVyYF0uOERlc2lyZWRUYXJnZXRzAAAQBAAQzCBEZXNpcmVkIG51bWJlciBvZiB0YXJnZXRzIHRvIGVsZWN0IGZvciB0aGlzIHJvdW5kLgCoIE9ubHkgZXhpc3RzIHdoZW4gW2BTbmFwc2hvdGBdIGlzIHByZXNlbnQuKQEgTm90ZTogVGhpcyBzdG9yYWdlIHR5cGUgbXVzdCBvbmx5IGJlIG11dGF0ZWQgdGhyb3VnaCBbYFNuYXBzaG90V3JhcHBlcmBdLkBTbmFwc2hvdE1ldGFkYXRhAAClBAQAEJggVGhlIG1ldGFkYXRhIG9mIHRoZSBbYFJvdW5kU25hcHNob3RgXQCoIE9ubHkgZXhpc3RzIHdoZW4gW2BTbmFwc2hvdGBdIGlzIHByZXNlbnQuKQEgTm90ZTogVGhpcyBzdG9yYWdlIHR5cGUgbXVzdCBvbmx5IGJlIG11dGF0ZWQgdGhyb3VnaCBbYFNuYXBzaG90V3JhcHBlcmBdLmRTaWduZWRTdWJtaXNzaW9uTmV4dEluZGV4AQAQEAAAAAAkAQEgVGhlIG5leHQgaW5kZXggdG8gYmUgYXNzaWduZWQgdG8gYW4gaW5jb21pbmcgc2lnbmVkIHN1Ym1pc3Npb24uAHUBIEV2ZXJ5IGFjY2VwdGVkIHN1Ym1pc3Npb24gaXMgYXNzaWduZWQgYSB1bmlxdWUgaW5kZXg7IHRoYXQgaW5kZXggaXMgYm91bmQgdG8gdGhhdCBwYXJ0aWN1bGFyZQEgc3VibWlzc2lvbiBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSBlbGVjdGlvbi4gT24gZWxlY3Rpb24gZmluYWxpemF0aW9uLCB0aGUgbmV4dCBpbmRleCBpczAgcmVzZXQgdG8gMC4AaQEgV2UgY2FuJ3QganVzdCB1c2UgYFNpZ25lZFN1Ym1pc3Npb25JbmRpY2VzLmxlbigpYCwgYmVjYXVzZSB0aGF0J3MgYSBib3VuZGVkIHNldDsgcGFzdCBpdHNZASBjYXBhY2l0eSwgaXQgd2lsbCBzaW1wbHkgc2F0dXJhdGUuIFdlIGNhbid0IGp1c3QgaXRlcmF0ZSBvdmVyIGBTaWduZWRTdWJtaXNzaW9uc01hcGAs9CBiZWNhdXNlIGl0ZXJhdGlvbiBpcyBzbG93LiBJbnN0ZWFkLCB3ZSBzdG9yZSB0aGUgdmFsdWUgaGVyZS5cU2lnbmVkU3VibWlzc2lvbkluZGljZXMBAMULBAAYbQEgQSBzb3J0ZWQsIGJvdW5kZWQgdmVjdG9yIG9mIGAoc2NvcmUsIGJsb2NrX251bWJlciwgaW5kZXgpYCwgd2hlcmUgZWFjaCBgaW5kZXhgIHBvaW50cyB0byBheCB2YWx1ZSBpbiBgU2lnbmVkU3VibWlzc2lvbnNgLgBxASBXZSBuZXZlciBuZWVkIHRvIHByb2Nlc3MgbW9yZSB0aGFuIGEgc2luZ2xlIHNpZ25lZCBzdWJtaXNzaW9uIGF0IGEgdGltZS4gU2lnbmVkIHN1Ym1pc3Npb25zdQEgY2FuIGJlIHF1aXRlIGxhcmdlLCBzbyB3ZSdyZSB3aWxsaW5nIHRvIHBheSB0aGUgY29zdCBvZiBtdWx0aXBsZSBkYXRhYmFzZSBhY2Nlc3NlcyB0byBhY2Nlc3MhASB0aGVtIG9uZSBhdCBhIHRpbWUgaW5zdGVhZCBvZiByZWFkaW5nIGFuZCBkZWNvZGluZyBhbGwgb2YgdGhlbSBhdCBvbmNlLlBTaWduZWRTdWJtaXNzaW9uc01hcAABBAUQ0QsEABx0IFVuY2hlY2tlZCwgc2lnbmVkIHNvbHV0aW9ucy4AaQEgVG9nZXRoZXIgd2l0aCBgU3VibWlzc2lvbkluZGljZXNgLCB0aGlzIHN0b3JlcyBhIGJvdW5kZWQgc2V0IG9mIGBTaWduZWRTdWJtaXNzaW9uc2Agd2hpbGXsIGFsbG93aW5nIHVzIHRvIGtlZXAgb25seSBhIHNpbmdsZSBvbmUgaW4gbWVtb3J5IGF0IGEgdGltZS4AaQEgVHdveCBub3RlOiB0aGUga2V5IG9mIHRoZSBtYXAgaXMgYW4gYXV0by1pbmNyZW1lbnRpbmcgaW5kZXggd2hpY2ggdXNlcnMgY2Fubm90IGluc3BlY3Qgb3L0IGFmZmVjdDsgd2Ugc2hvdWxkbid0IG5lZWQgYSBjcnlwdG9ncmFwaGljYWxseSBzZWN1cmUgaGFzaGVyLlRNaW5pbXVtVW50cnVzdGVkU2NvcmUAAFkBBAAQXQEgVGhlIG1pbmltdW0gc2NvcmUgdGhhdCBlYWNoICd1bnRydXN0ZWQnIHNvbHV0aW9uIG11c3QgYXR0YWluIGluIG9yZGVyIHRvIGJlIGNvbnNpZGVyZWQoIGZlYXNpYmxlLgC4IENhbiBiZSBzZXQgdmlhIGBzZXRfbWluaW11bV91bnRydXN0ZWRfc2NvcmVgLgHRAwFRATxUQmV0dGVyU2lnbmVkVGhyZXNob2xkmBAAAAAACE0BIFRoZSBtaW5pbXVtIGFtb3VudCBvZiBpbXByb3ZlbWVudCB0byB0aGUgc29sdXRpb24gc2NvcmUgdGhhdCBkZWZpbmVzIGEgc29sdXRpb24gYXN4ICJiZXR0ZXIiIGluIHRoZSBTaWduZWQgcGhhc2UuOE9mZmNoYWluUmVwZWF0EBAlAAAAELQgVGhlIHJlcGVhdCB0aHJlc2hvbGQgb2YgdGhlIG9mZmNoYWluIHdvcmtlci4AYQEgRm9yIGV4YW1wbGUsIGlmIGl0IGlzIDUsIHRoYXQgbWVhbnMgdGhhdCBhdCBsZWFzdCA1IGJsb2NrcyB3aWxsIGVsYXBzZSBiZXR3ZWVuIGF0dGVtcHRzhCB0byBzdWJtaXQgdGhlIHdvcmtlcidzIHNvbHV0aW9uLjxNaW5lclR4UHJpb3JpdHkwIP////////9/BCUBIFRoZSBwcmlvcml0eSBvZiB0aGUgdW5zaWduZWQgdHJhbnNhY3Rpb24gc3VibWl0dGVkIGluIHRoZSB1bnNpZ25lZC1waGFzZVBTaWduZWRNYXhTdWJtaXNzaW9ucxAQgAAAABzkIE1heGltdW0gbnVtYmVyIG9mIHNpZ25lZCBzdWJtaXNzaW9ucyB0aGF0IGNhbiBiZSBxdWV1ZWQuAFUBIEl0IGlzIGJlc3QgdG8gYXZvaWQgYWRqdXN0aW5nIHRoaXMgZHVyaW5nIGFuIGVsZWN0aW9uLCBhcyBpdCBpbXBhY3RzIGRvd25zdHJlYW0gZGF0YWUBIHN0cnVjdHVyZXMuIEluIHBhcnRpY3VsYXIsIGBTaWduZWRTdWJtaXNzaW9uSW5kaWNlczxUPmAgaXMgYm91bmRlZCBvbiB0aGlzIHZhbHVlLiBJZiB5b3X0IHVwZGF0ZSB0aGlzIHZhbHVlIGR1cmluZyBhbiBlbGVjdGlvbiwgeW91IF9tdXN0XyBlbnN1cmUgdGhhdE0BIGBTaWduZWRTdWJtaXNzaW9uSW5kaWNlcy5sZW4oKWAgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBuZXcgdmFsdWUuIE90aGVyd2lzZSzwIGF0dGVtcHRzIHRvIHN1Ym1pdCBuZXcgc29sdXRpb25zIG1heSBjYXVzZSBhIHJ1bnRpbWUgcGFuaWMuPFNpZ25lZE1heFdlaWdodChAC2CMkHRYAROjcD0K16NwvRSUIE1heGltdW0gd2VpZ2h0IG9mIGEgc2lnbmVkIHNvbHV0aW9uLgBdASBJZiBbYENvbmZpZzo6TWluZXJDb25maWdgXSBpcyBiZWluZyBpbXBsZW1lbnRlZCB0byBzdWJtaXQgc2lnbmVkIHNvbHV0aW9ucyAob3V0c2lkZSBvZj0BIHRoaXMgcGFsbGV0KSwgdGhlbiBbYE1pbmVyQ29uZmlnOjpzb2x1dGlvbl93ZWlnaHRgXSBpcyB1c2VkIHRvIGNvbXBhcmUgYWdhaW5zdDAgdGhpcyB2YWx1ZS5AU2lnbmVkTWF4UmVmdW5kcxAQIAAAAAQZASBUaGUgbWF4aW11bSBhbW91bnQgb2YgdW5jaGVja2VkIHNvbHV0aW9ucyB0byByZWZ1bmQgdGhlIGNhbGwgZmVlIGZvci5AU2lnbmVkUmV3YXJkQmFzZRhAABCl1OgAAAAAAAAAAAAAAASIIEJhc2UgcmV3YXJkIGZvciBhIHNpZ25lZCBzb2x1dGlvbkRTaWduZWREZXBvc2l0Qnl0ZRhAWXMHAAAAAAAAAAAAAAAAAASgIFBlci1ieXRlIGRlcG9zaXQgZm9yIGEgc2lnbmVkIHNvbHV0aW9uLkxTaWduZWREZXBvc2l0V2VpZ2h0GEAAAAAAAAAAAAAAAAAAAAAABKggUGVyLXdlaWdodCBkZXBvc2l0IGZvciBhIHNpZ25lZCBzb2x1dGlvbi4oTWF4V2lubmVycxAQ6AMAAAzUIE1heGltdW0gbnVtYmVyIG9mIHdpbm5lcnMgdGhhdCBhbiBlbGVjdGlvbiBzdXBwb3J0cy4AUQEgTm90ZTogVGhpcyBtdXN0IGFsd2F5cyBiZSBncmVhdGVyIG9yIGVxdWFsIHRvIGBUOjpEYXRhUHJvdmlkZXI6OmRlc2lyZWRfdGFyZ2V0cygpYC5MTWF4QmFja2Vyc1Blcldpbm5lchAQ5FcAAAwxASBNYXhpbXVtIG51bWJlciBvZiB2b3RlcnMgdGhhdCBjYW4gc3VwcG9ydCBhIHdpbm5lciBpbiBhbiBlbGVjdGlvbiBzb2x1dGlvbi4A6CBUaGlzIGlzIG5lZWRlZCB0byBlbnN1cmUgZWxlY3Rpb24gY29tcHV0YXRpb24gaXMgYm91bmRlZC44TWluZXJNYXhMZW5ndGgQEAAANgAAOE1pbmVyTWF4V2VpZ2h0KEALYIyQdFgBE6NwPQrXo3C9AFRNaW5lck1heFZvdGVzUGVyVm90ZXIQEBAAAAAAPE1pbmVyTWF4V2lubmVycxAQ6AMAAAAB1QsYACRWb3Rlckxpc3QBJFZvdGVyTGlzdBQkTGlzdE5vZGVzAAEEBQDZCwQADIAgQSBzaW5nbGUgbm9kZSwgd2l0aGluIHNvbWUgYmFnLgAFASBOb2RlcyBzdG9yZSBsaW5rcyBmb3J3YXJkIGFuZCBiYWNrIHdpdGhpbiB0aGVpciByZXNwZWN0aXZlIGJhZ3MuTENvdW50ZXJGb3JMaXN0Tm9kZXMBABAQAAAAAASsQ291bnRlciBmb3IgdGhlIHJlbGF0ZWQgY291bnRlZCBzdG9yYWdlIG1hcCBMaXN0QmFncwABBAUw3QsEAAxkIEEgYmFnIHN0b3JlZCBpbiBzdG9yYWdlLgAZASBTdG9yZXMgYSBgQmFnYCBzdHJ1Y3QsIHdoaWNoIHN0b3JlcyBoZWFkIGFuZCB0YWlsIHBvaW50ZXJzIHRvIGl0c2VsZi5QTmV4dE5vZGVBdXRvUmViYWdnZWQAAAAEAAgFASBQb2ludGVyIHRoYXQgcmVtZW1iZXJzIHRoZSBuZXh0IG5vZGUgdGhhdCB3aWxsIGJlIGF1dG8tcmViYWdnZWQuAQEgV2hlbiBgTm9uZWAsIHRoZSBuZXh0IHNjYW4gd2lsbCBzdGFydCBmcm9tIHRoZSBsaXN0IGhlYWQgYWdhaW4uEExvY2sAAAUBBAAQhCBMb2NrIGFsbCB1cGRhdGVzIHRvIHRoaXMgcGFsbGV0LgA5ASBJZiBhbnkgbm9kZXMgbmVlZHMgdXBkYXRpbmcsIHJlbW92YWwgb3IgYWRkaXRpb24gZHVlIHRvIGEgdGVtcG9yYXJ5IGxvY2ssIHRoZXQgW2BDYWxsOjpyZWJhZ2BdIGNhbiBiZSB1c2VkLgHBBAFlAQg0QmFnVGhyZXNob2xkc+ELCRkhAwDkC1QCAAAA856AlwIAAACosZfiAgAA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IHNjb3JluCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gaXRzIHVwcGVyIHRocmVzaG9sZC4AZQEgV2hlbiBpZHMgYXJlIGl0ZXJhdGVkLCBoaWdoZXIgYmFncyBhcmUgaXRlcmF0ZWQgY29tcGxldGVseSBiZWZvcmUgbG93ZXIgYmFncy4gVGhpcyBtZWFuc1kBIHRoYXQgaXRlcmF0aW9uIGlzIF9zZW1pLXNvcnRlZF86IGlkcyBvZiBoaWdoZXIgc2NvcmUgdGVuZCB0byBjb21lIGJlZm9yZSBpZHMgb2YgbG93ZXItASBzY29yZSwgYnV0IHBlZXIgaWRzIHdpdGhpbiBhIHBhcnRpY3VsYXIgYmFnIGFyZSBzb3J0ZWQgaW4gaW5zZXJ0aW9uIG9yZGVyLgBoICMgRXhwcmVzc2luZyB0aGUgY29uc3RhbnQATQEgVGhpcyBjb25zdGFudCBtdXN0IGJlIHNvcnRlZCBpbiBzdHJpY3RseSBpbmNyZWFzaW5nIG9yZGVyLiBEdXBsaWNhdGUgaXRlbXMgYXJlIG5vdCwgcGVybWl0dGVkLgBBASBUaGVyZSBpcyBhbiBpbXBsaWVkIHVwcGVyIGxpbWl0IG9mIGBTY29yZTo6TUFYYDsgdGhhdCB2YWx1ZSBkb2VzIG5vdCBuZWVkIHRvIGJlIQEgc3BlY2lmaWVkIHdpdGhpbiB0aGUgYmFnLiBGb3IgYW55IHR3byB0aHJlc2hvbGQgbGlzdHMsIGlmIG9uZSBlbmRzIHdpdGgxASBgU2NvcmU6Ok1BWGAsIHRoZSBvdGhlciBvbmUgZG9lcyBub3QsIGFuZCB0aGV5IGFyZSBvdGhlcndpc2UgZXF1YWwsIHRoZSB0d298IGxpc3RzIHdpbGwgYmVoYXZlIGlkZW50aWNhbGx5LgA4ICMgQ2FsY3VsYXRpb24AVQEgSXQgaXMgcmVjb21tZW5kZWQgdG8gZ2VuZXJhdGUgdGhlIHNldCBvZiB0aHJlc2hvbGRzIGluIGEgZ2VvbWV0cmljIHNlcmllcywgc3VjaCB0aGF0QQEgdGhlcmUgZXhpc3RzIHNvbWUgY29uc3RhbnQgcmF0aW8gc3VjaCB0aGF0IGB0aHJlc2hvbGRbayArIDFdID09ICh0aHJlc2hvbGRba10gKtAgY29uc3RhbnRfcmF0aW8pLm1heCh0aHJlc2hvbGRba10gKyAxKWAgZm9yIGFsbCBga2AuAFkBIFRoZSBoZWxwZXJzIGluIHRoZSBgL3V0aWxzL2ZyYW1lL2dlbmVyYXRlLWJhZ3NgIG1vZHVsZSBjYW4gc2ltcGxpZnkgdGhpcyBjYWxjdWxhdGlvbi4ALCAjIEV4YW1wbGVzAFEBIC0gSWYgYEJhZ1RocmVzaG9sZHM6OmdldCgpLmlzX2VtcHR5KClgLCB0aGVuIGFsbCBpZHMgYXJlIHB1dCBpbnRvIHRoZSBzYW1lIGJhZywgYW5ksCAgIGl0ZXJhdGlvbiBpcyBzdHJpY3RseSBpbiBpbnNlcnRpb24gb3JkZXIuYQEgLSBJZiBgQmFnVGhyZXNob2xkczo6Z2V0KCkubGVuKCkgPT0gNjRgLCBhbmQgdGhlIHRocmVzaG9sZHMgYXJlIGRldGVybWluZWQgYWNjb3JkaW5nIHRvEQEgICB0aGUgcHJvY2VkdXJlIGdpdmVuIGFib3ZlLCB0aGVuIHRoZSBjb25zdGFudCByYXRpbyBpcyBlcXVhbCB0byAyLmUBIC0gSWYgYEJhZ1RocmVzaG9sZHM6OmdldCgpLmxlbigpID09IDIwMGAsIGFuZCB0aGUgdGhyZXNob2xkcyBhcmUgZGV0ZXJtaW5lZCBhY2NvcmRpbmcgdG9ZASAgIHRoZSBwcm9jZWR1cmUgZ2l2ZW4gYWJvdmUsIHRoZW4gdGhlIGNvbnN0YW50IHJhdGlvIGlzIGFwcHJveGltYXRlbHkgZXF1YWwgdG8gMS4yNDguYQEgLSBJZiB0aGUgdGhyZXNob2xkIGxpc3QgYmVnaW5zIGBbMSwgMiwgMywgLi4uXWAsIHRoZW4gYW4gaWQgd2l0aCBzY29yZSAwIG9yIDEgd2lsbCBmYWxs8CAgIGludG8gYmFnIDAsIGFuIGlkIHdpdGggc2NvcmUgMiB3aWxsIGZhbGwgaW50byBiYWcgMSwgZXRjLgAwICMgTWlncmF0aW9uAGEBIEluIHRoZSBldmVudCB0aGF0IHRoaXMgbGlzdCBldmVyIGNoYW5nZXMsIGEgY29weSBvZiB0aGUgb2xkIGJhZ3MgbGlzdCBtdXN0IGJlIHJldGFpbmVkLl0BIFdpdGggdGhhdCBgTGlzdDo6bWlncmF0ZWAgY2FuIGJlIGNhbGxlZCwgd2hpY2ggd2lsbCBwZXJmb3JtIHRoZSBhcHByb3ByaWF0ZSBtaWdyYXRpb24uUE1heEF1dG9SZWJhZ1BlckJsb2NrEBAKAAAAEDUBIE1heGltdW0gbnVtYmVyIG9mIGFjY291bnRzIHRoYXQgbWF5IGJlIHJlLWJhZ2dlZCBhdXRvbWF0aWNhbGx5IGluIGBvbl9pZGxlYC4AUQEgQSB2YWx1ZSBvZiBgMGAgKG9idGFpbmVkIGJ5IGNvbmZpZ3VyaW5nIGB0eXBlIE1heEF1dG9SZWJhZ1BlckJsb2NrID0gKCk7YCkgZGlzYWJsZXM0IHRoZSBmZWF0dXJlLgHlCxkAPE5vbWluYXRpb25Qb29scwE8Tm9taW5hdGlvblBvb2xzVEBUb3RhbFZhbHVlTG9ja2VkAQAYQAAAAAAAAAAAAAAAAAAAAAAUjCBUaGUgc3VtIG9mIGZ1bmRzIGFjcm9zcyBhbGwgcG9vbHMuAHEBIFRoaXMgbWlnaHQgYmUgbG93ZXIgYnV0IG5ldmVyIGhpZ2hlciB0aGFuIHRoZSBzdW0gb2YgYHRvdGFsX2JhbGFuY2VgIG9mIGFsbCBbYFBvb2xNZW1iZXJzYF1ZASBiZWNhdXNlIGNhbGxpbmcgYHBvb2xfd2l0aGRyYXdfdW5ib25kZWRgIG1pZ2h0IGRlY3JlYXNlIHRoZSB0b3RhbCBzdGFrZSBvZiB0aGUgcG9vbCdzKQEgYGJvbmRlZF9hY2NvdW50YCB3aXRob3V0IGFkanVzdGluZyB0aGUgcGFsbGV0LWludGVybmFsIGBVbmJvbmRpbmdQb29sYCdzLixNaW5Kb2luQm9uZAEAGEAAAAAAAAAAAAAAAAAAAAAABJwgTWluaW11bSBhbW91bnQgdG8gYm9uZCB0byBqb2luIGEgcG9vbC40TWluQ3JlYXRlQm9uZAEAGEAAAAAAAAAAAAAAAAAAAAAAHKAgTWluaW11bSBib25kIHJlcXVpcmVkIHRvIGNyZWF0ZSBhIHBvb2wuAGUBIFRoaXMgaXMgdGhlIGFtb3VudCB0aGF0IHRoZSBkZXBvc2l0b3IgbXVzdCBwdXQgYXMgdGhlaXIgaW5pdGlhbCBzdGFrZSBpbiB0aGUgcG9vbCwgYXMgYW6IIGluZGljYXRpb24gb2YgInNraW4gaW4gdGhlIGdhbWUiLgBpASBUaGlzIGlzIHRoZSB2YWx1ZSB0aGF0IHdpbGwgYWx3YXlzIGV4aXN0IGluIHRoZSBzdGFraW5nIGxlZGdlciBvZiB0aGUgcG9vbCBib25kZWQgYWNjb3VudIAgd2hpbGUgYWxsIG90aGVyIGFjY291bnRzIGxlYXZlLiBNYXhQb29scwAAEAQACGkBIE1heGltdW0gbnVtYmVyIG9mIG5vbWluYXRpb24gcG9vbHMgdGhhdCBjYW4gZXhpc3QuIElmIGBOb25lYCwgdGhlbiBhbiB1bmJvdW5kZWQgbnVtYmVyIG9mRCBwb29scyBjYW4gZXhpc3QuOE1heFBvb2xNZW1iZXJzAAAQBAAISQEgTWF4aW11bSBudW1iZXIgb2YgbWVtYmVycyB0aGF0IGNhbiBleGlzdCBpbiB0aGUgc3lzdGVtLiBJZiBgTm9uZWAsIHRoZW4gdGhlIGNvdW50uCBtZW1iZXJzIGFyZSBub3QgYm91bmQgb24gYSBzeXN0ZW0gd2lkZSBiYXNpcy5UTWF4UG9vbE1lbWJlcnNQZXJQb29sAAAQBAAIQQEgTWF4aW11bSBudW1iZXIgb2YgbWVtYmVycyB0aGF0IG1heSBiZWxvbmcgdG8gcG9vbC4gSWYgYE5vbmVgLCB0aGVuIHRoZSBjb3VudCBvZqggbWVtYmVycyBpcyBub3QgYm91bmQgb24gYSBwZXIgcG9vbCBiYXNpcy5MR2xvYmFsTWF4Q29tbWlzc2lvbgAAmAQADGkBIFRoZSBtYXhpbXVtIGNvbW1pc3Npb24gdGhhdCBjYW4gYmUgY2hhcmdlZCBieSBhIHBvb2wuIFVzZWQgb24gY29tbWlzc2lvbiBwYXlvdXRzIHRvIGJvdW5kJQEgcG9vbCBjb21taXNzaW9ucyB0aGF0IGFyZSA+IGBHbG9iYWxNYXhDb21taXNzaW9uYCwgbmVjZXNzYXJ5IGlmIGEgZnV0dXJlDQEgYEdsb2JhbE1heENvbW1pc3Npb25gIGlzIGxvd2VyIHRoYW4gc29tZSBjdXJyZW50IHBvb2wgY29tbWlzc2lvbnMuLFBvb2xNZW1iZXJzAAEEBQDtCwQADEAgQWN0aXZlIG1lbWJlcnMuANAgVFdPWC1OT1RFOiBTQUZFIHNpbmNlIGBBY2NvdW50SWRgIGlzIGEgc2VjdXJlIGhhc2guVENvdW50ZXJGb3JQb29sTWVtYmVycwEAEBAAAAAABKxDb3VudGVyIGZvciB0aGUgcmVsYXRlZCBjb3VudGVkIHN0b3JhZ2UgbWFwLEJvbmRlZFBvb2xzAAEEBRABDAQABGggU3RvcmFnZSBmb3IgYm9uZGVkIHBvb2xzLlRDb3VudGVyRm9yQm9uZGVkUG9vbHMBABAQAAAAAASsQ291bnRlciBmb3IgdGhlIHJlbGF0ZWQgY291bnRlZCBzdG9yYWdlIG1hcCxSZXdhcmRQb29scwABBAUQEQwEAAh1ASBSZXdhcmQgcG9vbHMuIFRoaXMgaXMgd2hlcmUgdGhlcmUgcmV3YXJkcyBmb3IgZWFjaCBwb29sIGFjY3VtdWxhdGUuIFdoZW4gYSBtZW1iZXJzIHBheW91dCBpc1kBIGNsYWltZWQsIHRoZSBiYWxhbmNlIGNvbWVzIG91dCBvZiB0aGUgcmV3YXJkIHBvb2wuIEtleWVkIGJ5IHRoZSBib25kZWQgcG9vbHMgYWNjb3VudC5UQ291bnRlckZvclJld2FyZFBvb2xzAQAQEAAAAAAErENvdW50ZXIgZm9yIHRoZSByZWxhdGVkIGNvdW50ZWQgc3RvcmFnZSBtYXA8U3ViUG9vbHNTdG9yYWdlAAEEBRAVDAQACBkBIEdyb3VwcyBvZiB1bmJvbmRpbmcgcG9vbHMuIEVhY2ggZ3JvdXAgb2YgdW5ib25kaW5nIHBvb2xzIGJlbG9uZ3MgdG8gYSkBIGJvbmRlZCBwb29sLCBoZW5jZSB0aGUgbmFtZSBzdWItcG9vbHMuIEtleWVkIGJ5IHRoZSBib25kZWQgcG9vbHMgYWNjb3VudC5kQ291bnRlckZvclN1YlBvb2xzU3RvcmFnZQEAEBAAAAAABKxDb3VudGVyIGZvciB0aGUgcmVsYXRlZCBjb3VudGVkIHN0b3JhZ2UgbWFwIE1ldGFkYXRhAQEEBRDRBwQABFwgTWV0YWRhdGEgZm9yIHRoZSBwb29sLkhDb3VudGVyRm9yTWV0YWRhdGEBABAQAAAAAASsQ291bnRlciBmb3IgdGhlIHJlbGF0ZWQgY291bnRlZCBzdG9yYWdlIG1hcChMYXN0UG9vbElkAQAQEAAAAAAE0CBFdmVyIGluY3JlYXNpbmcgbnVtYmVyIG9mIGFsbCBwb29scyBjcmVhdGVkIHNvIGZhci5MUmV2ZXJzZVBvb2xJZExvb2t1cAABBAUAEAQAENwgQSByZXZlcnNlIGxvb2t1cCBmcm9tIHRoZSBwb29sJ3MgYWNjb3VudCBpZCB0byBpdHMgaWQuAHUBIFRoaXMgaXMgb25seSB1c2VkIGZvciBzbGFzaGluZyBhbmQgb24gYXV0b21hdGljIHdpdGhkcmF3IHVwZGF0ZS4gSW4gYWxsIG90aGVyIGluc3RhbmNlcywgdGhlJQEgcG9vbCBpZCBpcyB1c2VkLCBhbmQgdGhlIGFjY291bnRzIGFyZSBkZXRlcm1pbmlzdGljYWxseSBkZXJpdmVkIGZyb20gaXQudENvdW50ZXJGb3JSZXZlcnNlUG9vbElkTG9va3VwAQAQEAAAAAAErENvdW50ZXIgZm9yIHRoZSByZWxhdGVkIGNvdW50ZWQgc3RvcmFnZSBtYXBAQ2xhaW1QZXJtaXNzaW9ucwEBBAUAhQEEAgQBASBNYXAgZnJvbSBhIHBvb2wgbWVtYmVyIGFjY291bnQgdG8gdGhlaXIgb3B0ZWQgY2xhaW0gcGVybWlzc2lvbi4BxQQBaQEMIFBhbGxldElkLQwgcHkvbm9wbHMEhCBUaGUgbm9taW5hdGlvbiBwb29sJ3MgcGFsbGV0IGlkLkhNYXhQb2ludHNUb0JhbGFuY2UIBAowHQEgVGhlIG1heGltdW0gcG9vbCBwb2ludHMtdG8tYmFsYW5jZSByYXRpbyB0aGF0IGFuIGBvcGVuYCBwb29sIGNhbiBoYXZlLgBVASBUaGlzIGlzIGltcG9ydGFudCBpbiB0aGUgZXZlbnQgc2xhc2hpbmcgdGFrZXMgcGxhY2UgYW5kIHRoZSBwb29sJ3MgcG9pbnRzLXRvLWJhbGFuY2V8IHJhdGlvIGJlY29tZXMgZGlzcHJvcG9ydGlvbmFsLgBlASBNb3Jlb3ZlciwgdGhpcyByZWxhdGVzIHRvIHRoZSBgUmV3YXJkQ291bnRlcmAgdHlwZSBhcyB3ZWxsLCBhcyB0aGUgYXJpdGhtZXRpYyBvcGVyYXRpb25zVQEgYXJlIGEgZnVuY3Rpb24gb2YgbnVtYmVyIG9mIHBvaW50cywgYW5kIGJ5IHNldHRpbmcgdGhpcyB2YWx1ZSB0byBlLmcuIDEwLCB5b3UgZW5zdXJlZQEgdGhhdCB0aGUgdG90YWwgbnVtYmVyIG9mIHBvaW50cyBpbiB0aGUgc3lzdGVtIGFyZSBhdCBtb3N0IDEwIHRpbWVzIHRoZSB0b3RhbF9pc3N1YW5jZSBvZpwgdGhlIGNoYWluLCBpbiB0aGUgYWJzb2x1dGUgd29yc2UgY2FzZS4ASQEgRm9yIGEgdmFsdWUgb2YgMTAsIHRoZSB0aHJlc2hvbGQgd291bGQgYmUgYSBwb29sIHBvaW50cy10by1iYWxhbmNlIHJhdGlvIG9mIDEwOjEuMQEgU3VjaCBhIHNjZW5hcmlvIHdvdWxkIGFsc28gYmUgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIHBvb2wgYmVpbmcgOTAlIHNsYXNoZWQuME1heFVuYm9uZGluZxAQIAAAAAQ9ASBUaGUgbWF4aW11bSBudW1iZXIgb2Ygc2ltdWx0YW5lb3VzIHVuYm9uZGluZyBjaHVua3MgdGhhdCBjYW4gZXhpc3QgcGVyIG1lbWJlci4BMQwdACxGYXN0VW5zdGFrZQEsRmFzdFVuc3Rha2UQEEhlYWQAADkMBAAMwCBUaGUgY3VycmVudCAiaGVhZCBvZiB0aGUgcXVldWUiIGJlaW5nIHVuc3Rha2VkLgApASBUaGUgaGVhZCBpbiBpdHNlbGYgY2FuIGJlIGEgYmF0Y2ggb2YgdXAgdG8gW2BDb25maWc6OkJhdGNoU2l6ZWBdIHN0YWtlcnMuFFF1ZXVlAAEEBQAYBAAMwCBUaGUgbWFwIG9mIGFsbCBhY2NvdW50cyB3aXNoaW5nIHRvIGJlIHVuc3Rha2VkLgA5ASBLZWVwcyB0cmFjayBvZiBgQWNjb3VudElkYCB3aXNoaW5nIHRvIHVuc3Rha2UgYW5kIGl0J3MgY29ycmVzcG9uZGluZyBkZXBvc2l0LjxDb3VudGVyRm9yUXVldWUBABAQAAAAAASsQ291bnRlciBmb3IgdGhlIHJlbGF0ZWQgY291bnRlZCBzdG9yYWdlIG1hcExFcmFzVG9DaGVja1BlckJsb2NrAQAQEAAAAAAgjCBOdW1iZXIgb2YgZXJhcyB0byBjaGVjayBwZXIgYmxvY2suADUBIElmIHNldCB0byAwLCB0aGlzIHBhbGxldCBkb2VzIGFic29sdXRlbHkgbm90aGluZy4gQ2Fubm90IGJlIHNldCB0byBtb3JlIHRoYW6QIFtgQ29uZmlnOjpNYXhFcmFzVG9DaGVja1BlckJsb2NrYF0uAGUBIEJhc2VkIG9uIHRoZSBhbW91bnQgb2Ygd2VpZ2h0IGF2YWlsYWJsZSBhdCBbYFBhbGxldDo6b25faWRsZWBdLCB1cCB0byB0aGlzIG1hbnkgZXJhcyBhcmVdASBjaGVja2VkLiBUaGUgY2hlY2tpbmcgaXMgcmVwcmVzZW50ZWQgYnkgdXBkYXRpbmcgW2BVbnN0YWtlUmVxdWVzdDo6Y2hlY2tlZGBdLCB3aGljaCBpc1Agc3RvcmVkIGluIFtgSGVhZGBdLgHdBAGNAQQcRGVwb3NpdBhAABCl1OgAAAAAAAAAAAAAAAhlASBEZXBvc2l0IHRvIHRha2UgZm9yIHVuc3Rha2luZywgdG8gbWFrZSBzdXJlIHdlJ3JlIGFibGUgdG8gc2xhc2ggdGhlIGl0IGluIG9yZGVyIHRvIGNvdmVywCB0aGUgY29zdHMgb2YgcmVzb3VyY2VzIG9uIHVuc3VjY2Vzc2Z1bCB1bnN0YWtlLgFFDB4AQENvbnZpY3Rpb25Wb3RpbmcBQENvbnZpY3Rpb25Wb3RpbmcIJFZvdGluZ0ZvcgEBCAUFSQxNDNgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIdQEgQWxsIHZvdGluZyBmb3IgYSBwYXJ0aWN1bGFyIHZvdGVyIGluIGEgcGFydGljdWxhciB2b3RpbmcgY2xhc3MuIFdlIHN0b3JlIHRoZSBiYWxhbmNlIGZvciB0aGWcIG51bWJlciBvZiB2b3RlcyB0aGF0IHdlIGhhdmUgcmVjb3JkZWQuNENsYXNzTG9ja3NGb3IBAQQFAG0MBAAMaQEgVGhlIHZvdGluZyBjbGFzc2VzIHdoaWNoIGhhdmUgYSBub24temVybyBsb2NrIHJlcXVpcmVtZW50IGFuZCB0aGUgbG9jayBhbW91bnRzIHdoaWNoIHRoZXltASByZXF1aXJlLiBUaGUgYWN0dWFsIGFtb3VudCBsb2NrZWQgb24gYmVoYWxmIG9mIHRoaXMgcGFsbGV0IHNob3VsZCBhbHdheXMgYmUgdGhlIG1heGltdW0gb2YsIHRoaXMgbGlzdC4B4QQBlQEIIE1heFZvdGVzEBAAAgAAEPAgVGhlIG1heGltdW0gbnVtYmVyIG9mIGNvbmN1cnJlbnQgdm90ZXMgYW4gYWNjb3VudCBtYXkgaGF2ZS4AVQEgQWxzbyB1c2VkIHRvIGNvbXB1dGUgd2VpZ2h0LCBhbiBvdmVybHkgbGFyZ2UgdmFsdWUgY2FuIGxlYWQgdG8gZXh0cmluc2ljcyB3aXRoIGxhcmdlwCB3ZWlnaHQgZXN0aW1hdGlvbjogc2VlIGBkZWxlZ2F0ZWAgZm9yIGluc3RhbmNlLkRWb3RlTG9ja2luZ1BlcmlvZBAQwIkBABCQIFRoZSBtaW5pbXVtIHBlcmlvZCBvZiB2b3RlIGxvY2tpbmcuAGUBIEl0IHNob3VsZCBiZSBubyBzaG9ydGVyIHRoYW4gZW5hY3RtZW50IHBlcmlvZCB0byBlbnN1cmUgdGhhdCBpbiB0aGUgY2FzZSBvZiBhbiBhcHByb3ZhbCxJASB0aG9zZSBzdWNjZXNzZnVsIHZvdGVycyBhcmUgbG9ja2VkIGludG8gdGhlIGNvbnNlcXVlbmNlcyB0aGF0IHRoZWlyIHZvdGVzIGVudGFpbC4BeQwfACRSZWZlcmVuZGEBJFJlZmVyZW5kYRQ8UmVmZXJlbmR1bUNvdW50AQAQEAAAAAAEMQEgVGhlIG5leHQgZnJlZSByZWZlcmVuZHVtIGluZGV4LCBha2EgdGhlIG51bWJlciBvZiByZWZlcmVuZGEgc3RhcnRlZCBzbyBmYXIuRFJlZmVyZW5kdW1JbmZvRm9yAAEEAhB9DAQABLQgSW5mb3JtYXRpb24gY29uY2VybmluZyBhbnkgZ2l2ZW4gcmVmZXJlbmR1bS4oVHJhY2tRdWV1ZQEBBAVBAZ0MBAAQXQEgVGhlIHNvcnRlZCBsaXN0IG9mIHJlZmVyZW5kYSByZWFkeSB0byBiZSBkZWNpZGVkIGJ1dCBub3QgeWV0IGJlaW5nIGRlY2lkZWQsIG9yZGVyZWQgYnl8IGNvbnZpY3Rpb24td2VpZ2h0ZWQgYXBwcm92YWxzLgBBASBUaGlzIHNob3VsZCBiZSBlbXB0eSBpZiBgRGVjaWRpbmdDb3VudGAgaXMgbGVzcyB0aGFuIGBUcmFja0luZm86Om1heF9kZWNpZGluZ2AuNERlY2lkaW5nQ291bnQBAQQFQQEQEAAAAAAExCBUaGUgbnVtYmVyIG9mIHJlZmVyZW5kYSBiZWluZyBkZWNpZGVkIGN1cnJlbnRseS4oTWV0YWRhdGFPZgABBAIQNAQAGAUBIFRoZSBtZXRhZGF0YSBpcyBhIGdlbmVyYWwgaW5mb3JtYXRpb24gY29uY2VybmluZyB0aGUgcmVmZXJlbmR1bS5JASBUaGUgYEhhc2hgIHJlZmVycyB0byB0aGUgcHJlaW1hZ2Ugb2YgdGhlIGBQcmVpbWFnZXNgIHByb3ZpZGVyIHdoaWNoIGNhbiBiZSBhIEpTT06IIGR1bXAgb3IgSVBGUyBoYXNoIG9mIGEgSlNPTiBmaWxlLgB1ASBDb25zaWRlciBhIGdhcmJhZ2UgY29sbGVjdGlvbiBmb3IgYSBtZXRhZGF0YSBvZiBmaW5pc2hlZCByZWZlcmVuZHVtcyB0byBgdW5yZXF1ZXN0YCAocmVtb3ZlKUQgbGFyZ2UgcHJlaW1hZ2VzLgHtBAGhARREU3VibWlzc2lvbkRlcG9zaXQYQACsI/wGAAAAAAAAAAAAAAAENQEgVGhlIG1pbmltdW0gYW1vdW50IHRvIGJlIHVzZWQgYXMgYSBkZXBvc2l0IGZvciBhIHB1YmxpYyByZWZlcmVuZHVtIHByb3Bvc2FsLiRNYXhRdWV1ZWQQEGQAAAAE5CBNYXhpbXVtIHNpemUgb2YgdGhlIHJlZmVyZW5kdW0gcXVldWUgZm9yIGEgc2luZ2xlIHRyYWNrLkRVbmRlY2lkaW5nVGltZW91dBAQgBMDAAhVASBUaGUgbnVtYmVyIG9mIGJsb2NrcyBhZnRlciBzdWJtaXNzaW9uIHRoYXQgYSByZWZlcmVuZHVtIG11c3QgYmVnaW4gYmVpbmcgZGVjaWRlZCBieS7kIE9uY2UgdGhpcyBwYXNzZXMsIHRoZW4gYW55b25lIG1heSBjYW5jZWwgdGhlIHJlZmVyZW5kdW0uNEFsYXJtSW50ZXJ2YWwQEAEAAAAMXQEgUXVhbnRpemF0aW9uIGxldmVsIGZvciB0aGUgcmVmZXJlbmR1bSB3YWtldXAgc2NoZWR1bGVyLiBBIGhpZ2hlciBudW1iZXIgd2lsbCBy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cmFja3MgYXJlIGR5bmFtaWMsIHRoZSB2YWx1ZSBpbiB0aGUgc3RhdGljIG1ldGFkYXRhIG1pZ2h0IGJlIGluYWNjdXJhdGUuAbkMIAAcT3JpZ2lucwAAAAAAIwAkV2hpdGVsaXN0ASRXaGl0ZWxpc3QEPFdoaXRlbGlzdGVkQ2FsbAABBAU0BQEEAAAB+QQBsQgAAb0MJAAgVHJlYXN1cnkBIFRyZWFzdXJ5HDRQcm9wb3NhbENvdW50AQAQEAAAAAAQQQEgREVQUkVDQVRFRDogYXNzb2NpYXRlZCB3aXRoIGBzcGVuZF9sb2NhbGAgY2FsbCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIE1heSAyMDI1LmkBIFJlZmVyIHRvIDxodHRwczovL2dpdGh1Yi5jb20vcGFyaXR5dGVjaC9wb2xrYWRvdC1zZGsvcHVsbC81OTYxPiBmb3IgbWlncmF0aW9uIHRvIGBzcGVuZGAuAKQgTnVtYmVyIG9mIHByb3Bvc2FscyB0aGF0IGhhdmUgYmVlbiBtYWRlLiRQcm9wb3NhbHMAAQQFEMEMBAAQQQEgREVQUkVDQVRFRDogYXNzb2NpYXRlZCB3aXRoIGBzcGVuZF9sb2NhbGAgY2FsbCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIE1heSAyMDI1LmkBIFJlZmVyIHRvIDxodHRwczovL2dpdGh1Yi5jb20vcGFyaXR5dGVjaC9wb2xrYWRvdC1zZGsvcHVsbC81OTYxPiBmb3IgbWlncmF0aW9uIHRvIGBzcGVuZGAuAHwgUHJvcG9zYWxzIHRoYXQgaGF2ZSBiZWVuIG1hZGUuLERlYWN0aXZhdGVkAQAYQAAAAAAAAAAAAAAAAAAAAAAE8CBUaGUgYW1vdW50IHdoaWNoIGhhcyBiZWVuIHJlcG9ydGVkIGFzIGluYWN0aXZlIHRvIEN1cnJlbmN5LiRBcHByb3ZhbHMBAMUMBAAQQQEgREVQUkVDQVRFRDogYXNzb2NpYXRlZCB3aXRoIGBzcGVuZF9sb2NhbGAgY2FsbCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIE1heSAyMDI1LmkBIFJlZmVyIHRvIDxodHRwczovL2dpdGh1Yi5jb20vcGFyaXR5dGVjaC9wb2xrYWRvdC1zZGsvcHVsbC81OTYxPiBmb3IgbWlncmF0aW9uIHRvIGBzcGVuZGAuAPggUHJvcG9zYWwgaW5kaWNlcyB0aGF0IGhhdmUgYmVlbiBhcHByb3ZlZCBidXQgbm90IHlldCBhd2FyZGVkLihTcGVuZENvdW50AQAQEAAAAAAEpCBUaGUgY291bnQgb2Ygc3BlbmRzIHRoYXQgaGF2ZSBiZWVuIG1hZGUuGFNwZW5kcwABBAUQyQwEAATQIFNwZW5kcyB0aGF0IGhhdmUgYmVlbiBhcHByb3ZlZCBhbmQgYmVpbmcgcHJvY2Vzc2VkLjxMYXN0U3BlbmRQZXJpb2QAABAEAATUIFRoZSBibG9ja251bWJlciBmb3IgdGhlIGxhc3QgdHJpZ2dlcmVkIHNwZW5kIHBlcmlvZC4B/QQBwQgYLFNwZW5kUGVyaW9kEBCAUQEABIggUGVyaW9kIGJldHdlZW4gc3VjY2Vzc2l2ZSBzcGVuZHMuEEJ1cm7RDBDQBwAABBEBIFBlcmNlbnRhZ2Ugb2Ygc3BhcmUgZnVuZHMgKGlmIGFueSkgdGhhdCBhcmUgYnVybnQgcGVyIHNwZW5kIHBlcmlvZC4gUGFsbGV0SWQtDCBweS90cnNyeQQZASBUaGUgdHJlYXN1cnkncyBwYWxsZXQgaWQsIHVzZWQgZm9yIGRlcml2aW5nIGl0cyBzb3ZlcmVpZ24gYWNjb3VudCBJRC4wTWF4QXBwcm92YWxzEBBkAAAAGEEBIERFUFJFQ0FURUQ6IGFzc29jaWF0ZWQgd2l0aCBgc3BlbmRfbG9jYWxgIGNhbGwgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBNYXkgMjAyNS5pASBSZWZlciB0byA8aHR0cHM6Ly9naXRodWIuY29tL3Bhcml0eXRlY2gvcG9sa2Fkb3Qtc2RrL3B1bGwvNTk2MT4gZm9yIG1pZ3JhdGlvbiB0byBgc3BlbmRgLgAVASBUaGUgbWF4aW11bSBudW1iZXIgb2YgYXBwcm92YWxzIHRoYXQgY2FuIHdhaXQgaW4gdGhlIHNwZW5kaW5nIHF1ZXVlLgBNASBOT1RFOiBUaGlzIHBhcmFtZXRlciBpcyBhbHNvIHVzZWQgd2l0aGluIHRoZSBCb3VudGllcyBQYWxsZXQgZXh0ZW5zaW9uIGlmIGVuYWJsZWQuMFBheW91dFBlcmlvZBAQgJcGAAQZASBUaGUgcGVyaW9kIGR1cmluZyB3aGljaCBhbiBhcHByb3ZlZCB0cmVhc3VyeSBzcGVuZCBoYXMgdG8gYmUgY2xhaW1lZC4scG90X2FjY291bnQAgG1vZGxweS90cnNyeQAAAAAAAAAAAAAAAAAAAAAAAAAABKAgR2V0cyB0aGlzIHBhbGxldCdzIGRlcml2ZWQgcG90IGFjY291bnQuAdUMJQBARGVsZWdhdGVkU3Rha2luZwFARGVsZWdhdGVkU3Rha2luZxAoRGVsZWdhdG9ycwABBAUA2QwEABCkIE1hcCBvZiBEZWxlZ2F0b3JzIHRvIHRoZWlyIGBEZWxlZ2F0aW9uYC4AYQEgSW1wbGVtZW50YXRpb24gbm90ZTogV2UgYXJlIG5vdCB1c2luZyBhIGRvdWJsZSBtYXAgd2l0aCBgZGVsZWdhdG9yYCBhbmQgYGFnZW50YCBhY2NvdW50YQEgYXMga2V5cyBzaW5jZSB3ZSB3YW50IHRvIHJlc3RyaWN0IGRlbGVnYXRvcnMgdG8gZGVsZWdhdGUgb25seSB0byBvbmUgYWNjb3VudCBhdCBhIHRpbWUuUENvdW50ZXJGb3JEZWxlZ2F0b3JzAQAQEAAAAAAErENvdW50ZXIgZm9yIHRoZSByZWxhdGVkIGNvdW50ZWQgc3RvcmFnZSBtYXAYQWdlbnRzAAEEBQDdDAQABIggTWFwIG9mIGBBZ2VudGAgdG8gdGhlaXIgYExlZGdlcmAuQENvdW50ZXJGb3JBZ2VudHMBABAQAAAAAASsQ291bnRlciBmb3IgdGhlIHJlbGF0ZWQgY291bnRlZCBzdG9yYWdlIG1hcAABxQgIIFBhbGxldElkLQwgcHkvZGxzdGsEkCBJbmplY3RlZCBpZGVudGlmaWVyIGZvciB0aGUgcGFsbGV0LkxTbGFzaFJld2FyZEZyYWN0aW9umBCAlpgABFEBIEZyYWN0aW9uIG9mIHRoZSBzbGFzaCB0aGF0IGlzIHJld2FyZGVkIHRvIHRoZSBjYWxsZXIgb2YgcGVuZGluZyBzbGFzaCB0byB0aGUgYWdlbnQuAeEMJgBAUGFyYWNoYWluc09yaWdpbgAAAAAAKRB5ASBUaGVyZSBpcyBubyB3YXkgdG8gcmVnaXN0ZXIgYW4gb3JpZ2luIHR5cGUgaW4gYGNvbnN0cnVjdF9ydW50aW1lYCB3aXRob3V0IGEgcGFsbGV0IHRoZSBvcmlnaW4wIGJlbG9uZ3MgdG8uAHUBIFRoaXMgbW9kdWxlIGZ1bGZpbGxzIG9ubHkgdGhlIHNpbmdsZSBwdXJwb3NlIG9mIGhvdXNpbmcgdGhlIGBPcmlnaW5gIGluIGBjb25zdHJ1Y3RfcnVudGltZWAuNENvbmZpZ3VyYXRpb24BNENvbmZpZ3VyYXRpb24MMEFjdGl2ZUNvbmZpZwEA5QxBAwAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAGQAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAIAAAACAAAAAgAAAAABAAAAAQAAAAEAAAAAAQAAAAAAAAAAAAAAECcAAICy5g6Aw8kBgJaYAAAAAAAAAAAAAAAAAAUAAAAEyCBUaGUgYWN0aXZlIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBjdXJyZW50IHNlc3Npb24uOFBlbmRpbmdDb25maWdzAQDpDAQAHHwgUGVuZGluZyBjb25maWd1cmF0aW9uIGNoYW5nZXMuAFkBIFRoaXMgaXMgYSBsaXN0IG9mIGNvbmZpZ3VyYXRpb24gY2hhbmdlcywgZWFjaCB3aXRoIGEgc2Vzc2lvbiBpbmRleCBhdCB3aGljaCBpdCBzaG91bGQwIGJlIGFwcGxpZWQuAGEBIFRoZSBsaXN0IGlzIHNvcnRlZCBhc2NlbmRpbmcgYnkgc2Vzc2lvbiBpbmRleC4gQWxzbywgdGhpcyBsaXN0IGNhbiBvbmx5IGNvbnRhaW4gYXQgbW9zdPwgMiBpdGVtczogZm9yIHRoZSBuZXh0IHNlc3Npb24gYW5kIGZvciB0aGUgYHNjaGVkdWxlZF9zZXNzaW9uYC5YQnlwYXNzQ29uc2lzdGVuY3lDaGVjawEAIAQACGEBIElmIHRoaXMgaXMgc2V0LCB0aGVuIHRoZSBjb25maWd1cmF0aW9uIHNldHRlcnMgd2lsbCBieXBhc3MgdGhlIGNvbnNpc3RlbmN5IGNoZWNrcy4gVGhpc7QgaXMgbWVhbnQgdG8gYmUgdXNlZCBvbmx5IGFzIHRoZSBsYXN0IHJlc29ydC4BXQUAAAHxDCoALFBhcmFzU2hhcmVkASxQYXJhc1NoYXJlZBBMQ3VycmVudFNlc3Npb25JbmRleAEAEBAAAAAABGwgVGhlIGN1cnJlbnQgc2Vzc2lvbiBpbmRleC5YQWN0aXZlVmFsaWRhdG9ySW5kaWNlcwEA9QwEAAgJASBBbGwgdGhlIHZhbGlkYXRvcnMgYWN0aXZlbHkgcGFydGljaXBhdGluZyBpbiBwYXJhY2hhaW4gY29uc2Vuc3VzLrAgSW5kaWNlcyBhcmUgaW50byB0aGUgYnJvYWRlciB2YWxpZGF0b3Igc2V0LkxBY3RpdmVWYWxpZGF0b3JLZXlzAQD5DAQACFUBIFRoZSBwYXJhY2hhaW4gYXR0ZXN0YXRpb24ga2V5cyBvZiB0aGUgdmFsaWRhdG9ycyBhY3RpdmVseSBwYXJ0aWNpcGF0aW5nIGluIHBhcmFjaGFpbh0BIGNvbnNlbnN1cy4gVGhpcyBzaG91bGQgYmUgdGhlIHNhbWUgbGVuZ3RoIGFzIGBBY3RpdmVWYWxpZGF0b3JJbmRpY2VzYC5MQWxsb3dlZFJlbGF5UGFyZW50cwEA/QwUAAAAAAAEbCBBbGwgYWxsb3dlZCByZWxheS1wYXJlbnRzLgGBBQAAACsANFBhcmFJbmNsdXNpb24BNFBhcmFJbmNsdXNpb24ECFYxAAEEBbECKQ0EABRhASBDYW5kaWRhdGVzIHBlbmRpbmcgYXZhaWxhYmlsaXR5IGJ5IGBQYXJhSWRgLiBUaGV5IGZvcm0gYSBjaGFpbiBzdGFydGluZyBmcm9tIHRoZSBsYXRlc3RsIGluY2x1ZGVkIGhlYWQgb2YgdGhlIHBhcmEuYQEgVXNlIGEgZGlmZmVyZW50IHByZWZpeCBwb3N0LW1pZ3JhdGlvbiB0byB2MSwgc2luY2UgdGhlIHYwIGBQZW5kaW5nQXZhaWxhYmlsaXR5YCBzdG9yYWdlcQEgd291bGQgb3RoZXJ3aXNlIGhhdmUgdGhlIGV4YWN0IHNhbWUgcHJlZml4IHdoaWNoIGNvdWxkIGNhdXNlIHVuZGVmaW5lZCBiZWhhdmlvdXIgd2hlbiBkb2luZzwgdGhlIG1pZ3JhdGlvbi4BhQUByQgAATENLAAwUGFyYUluaGVyZW50ATBQYXJhSW5oZXJlbnQIIEluY2x1ZGVkAAAFAQQAGOwgV2hldGhlciB0aGUgcGFyYXMgaW5oZXJlbnQgd2FzIGluY2x1ZGVkIHdpdGhpbiB0aGlzIGJsb2NrLgBpASBUaGUgYE9wdGlvbjwoKT5gIGlzIGVmZmVjdGl2ZWx5IGEgYGJvb2xgLCBidXQgaXQgbmV2ZXIgaGl0cyBzdG9yYWdlIGluIHRoZSBgTm9uZWAgdmFyaWFudLwgZHVlIHRvIHRoZSBndWFyYW50ZWVzIG9mIEZSQU1FJ3Mgc3RvcmFnZSBBUElzLgBJASBJZiB0aGlzIGlzIGBOb25lYCBhdCB0aGUgZW5kIG9mIHRoZSBibG9jaywgd2UgcGFuaWMgYW5kIHJlbmRlciB0aGUgYmxvY2sgaW52YWxpZC4wT25DaGFpblZvdGVzAAA1DQQABEUBIFNjcmFwZWQgb24gY2hhaW4gZGF0YSBmb3IgZXh0cmFjdGluZyByZXNvbHZlZCBkaXNwdXRlcyBhcyB3ZWxsIGFzIGJhY2tpbmcgdm90ZXMuAYkFAAABSQ0tADRQYXJhU2NoZWR1bGVyATRQYXJhU2NoZWR1bGVyDDxWYWxpZGF0b3JHcm91cHMBAE0NBAAcbQEgQWxsIHRoZSB2YWxpZGF0b3IgZ3JvdXBzLiBPbmUgZm9yIGVhY2ggY29yZS4gSW5kaWNlcyBhcmUgaW50byBgQWN0aXZlVmFsaWRhdG9yc2AgLSBub3QgdGhlbQEgYnJvYWRlciBzZXQgb2YgUG9sa2Fkb3QgdmFsaWRhdG9ycywgYnV0IGluc3RlYWQganVzdCB0aGUgc3Vic2V0IHVzZWQgZm9yIHBhcmFjaGFpbnMgZHVyaW5nOCB0aGlzIHNlc3Npb24uAEkBIEJvdW5kOiBUaGUgbnVtYmVyIG9mIGNvcmVzIGlzIHRoZSBzdW0gb2YgdGhlIG51bWJlcnMgb2YgcGFyYWNoYWlucyBhbmQgcGFyYXRocmVhZGkBIG11bHRpcGxleGVycy4gUmVhc29uYWJseSwgMTAwLTEwMDAuIFRoZSBkb21pbmFudCBmYWN0b3IgaXMgdGhlIG51bWJlciBvZiB2YWxpZGF0b3JzOiBzYWZlUCB1cHBlciBib3VuZCBhdCAxMGsuRFNlc3Npb25TdGFydEJsb2NrAQAQEAAAAAAcaQEgVGhlIGJsb2NrIG51bWJlciB3aGVyZSB0aGUgc2Vzc2lvbiBzdGFydCBvY2N1cnJlZC4gVXNlZCB0byB0cmFjayBob3cgbWFueSBncm91cCByb3RhdGlvbnM8IGhhdmUgb2NjdXJyZWQuAFUBIE5vdGUgdGhhdCBpbiB0aGUgY29udGV4dCBvZiBwYXJhY2hhaW5zIG1vZHVsZXMgdGhlIHNlc3Npb24gY2hhbmdlIGlzIHNpZ25hbGVkIGR1cmluZ2EBIHRoZSBibG9jayBhbmQgZW5hY3RlZCBhdCB0aGUgZW5kIG9mIHRoZSBibG9jayAoYXQgdGhlIGZpbmFsaXphdGlvbiBzdGFnZSwgdG8gYmUgZXhhY3QpLlkBIFRodXMgZm9yIGFsbCBpbnRlbnRzIGFuZCBwdXJwb3NlcyB0aGUgZWZmZWN0IG9mIHRoZSBzZXNzaW9uIGNoYW5nZSBpcyBvYnNlcnZlZCBhdCB0aGVlASBibG9jayBmb2xsb3dpbmcgdGhlIHNlc3Npb24gY2hhbmdlLCBibG9jayBudW1iZXIgb2Ygd2hpY2ggd2Ugc2F2ZSBpbiB0aGlzIHN0b3JhZ2UgdmFsdWUuKENsYWltUXVldWUBAFENBAAIWQEgT25lIGVudHJ5IGZvciBlYWNoIGF2YWlsYWJpbGl0eSBjb3JlLiBUaGUgYFZlY0RlcXVlYCByZXByZXNlbnRzIHRoZSBhc3NpZ25tZW50cyB0byBiZWAgc2NoZWR1bGVkIG9uIHRoYXQgY29yZS4AAAAALgAUUGFyYXMBFFBhcmFzWEBQdmZBY3RpdmVWb3RlTWFwAAEEBcEFZQ0EABC0IEFsbCBjdXJyZW50bHkgYWN0aXZlIFBWRiBwcmUtY2hlY2tpbmcgdm90ZXMuACwgSW52YXJpYW50OnUBIC0gVGhlcmUgYXJlIG5vIFBWRiBwcmUtY2hlY2tpbmcgdm90ZXMgdGhhdCBleGlzdHMgaW4gbGlzdCBidXQgbm90IGluIHRoZSBzZXQgYW5kIHZpY2UgdmVyc2EuRFB2ZkFjdGl2ZVZvdGVMaXN0AQB1DQQABDUBIFRoZSBsaXN0IG9mIGFsbCBjdXJyZW50bHkgYWN0aXZlIFBWRiB2b3Rlcy4gQXV4aWxpYXJ5IHRvIGBQdmZBY3RpdmVWb3RlTWFwYC4oUGFyYWNoYWlucwEAeQ0EABBpASBBbGwgbGVhc2UgaG9sZGluZyBwYXJhY2hhaW5zLiBPcmRlcmVkIGFzY2VuZGluZyBieSBgUGFyYUlkYC4gT24gZGVtYW5kIHBhcmFjaGFpbnMgYXJlIG5vdCggaW5jbHVkZWQuAOggQ29uc2lkZXIgdXNpbmcgdGhlIFtgUGFyYWNoYWluc0NhY2hlYF0gdHlwZSBvZiBtb2RpZnlpbmcuOFBhcmFMaWZlY3ljbGVzAAEEBbECfQ0EAAS8IFRoZSBjdXJyZW50IGxpZmVjeWNsZSBvZiBhIGFsbCBrbm93biBQYXJhIElEcy4USGVhZHMAAQQFsQLhBQQABKAgVGhlIGhlYWQtZGF0YSBvZiBldmVyeSByZWdpc3RlcmVkIHBhcmEuRE1vc3RSZWNlbnRDb250ZXh0AAEEBbECEAQABCkBIFRoZSBjb250ZXh0IChyZWxheS1jaGFpbiBibG9jayBudW1iZXIpIG9mIHRoZSBtb3N0IHJlY2VudCBwYXJhY2hhaW4gaGVhZC48Q3VycmVudENvZGVIYXNoAAEEBbECwQUEAAy0IFRoZSB2YWxpZGF0aW9uIGNvZGUgaGFzaCBvZiBldmVyeSBsaXZlIHBhcmEuAOQgQ29ycmVzcG9uZGluZyBjb2RlIGNhbiBiZSByZXRyaWV2ZWQgd2l0aCBbYENvZGVCeUhhc2hgXS4wUGFzdENvZGVIYXNoAAEEBYENwQUEABBhASBBY3R1YWwgcGFzdCBjb2RlIGhhc2gsIGluZGljYXRlZCBieSB0aGUgcGFyYSBpZCBhcyB3ZWxsIGFzIHRoZSBibG9jayBudW1iZXIgYXQgd2hpY2ggaXREIGJlY2FtZSBvdXRkYXRlZC4A5CBDb3JyZXNwb25kaW5nIGNvZGUgY2FuIGJlIHJldHJpZXZlZCB3aXRoIFtgQ29kZUJ5SGFzaGBdLjBQYXN0Q29kZU1ldGEBAQQFsQKFDQgAAAxJASBQYXN0IGNvZGUgb2YgcGFyYWNoYWlucy4gVGhlIHBhcmFjaGFpbnMgdGhlbXNlbHZlcyBtYXkgbm90IGJlIHJlZ2lzdGVyZWQgYW55bW9yZSxJASBidXQgd2UgYWxzbyBrZWVwIHRoZWlyIGNvZGUgb24tY2hhaW4gZm9yIHRoZSBzYW1lIGFtb3VudCBvZiB0aW1lIGFzIG91dGRhdGVkIGNvZGWwIHRvIGtlZXAgaXQgYXZhaWxhYmxlIGZvciBhcHByb3ZhbCBjaGVja2Vycy48UGFzdENvZGVQcnVuaW5nAQCRDQQAGGkBIFdoaWNoIHBhcmFzIGhhdmUgcGFzdCBjb2RlIHRoYXQgbmVlZHMgcHJ1bmluZyBhbmQgdGhlIHJlbGF5LWNoYWluIGJsb2NrIGF0IHdoaWNoIHRoZSBjb2RlaQEgd2FzIHJlcGxhY2VkLiBOb3RlIHRoYXQgdGhpcyBpcyB0aGUgYWN0dWFsIGhlaWdodCBvZiB0aGUgaW5jbHVkZWQgYmxvY2ssIG5vdCB0aGUgZXhwZWN0ZWQ9ASBoZWlnaHQgYXQgd2hpY2ggdGhlIGNvZGUgdXBncmFkZSB3b3VsZCBiZSBhcHBsaWVkLCBhbHRob3VnaCB0aGV5IG1heSBiZSBlcXVhbC5tASBUaGlzIGlzIHRvIGVuc3VyZSB0aGUgZW50aXJlIGFjY2VwdGFuY2UgcGVyaW9kIGlzIGNvdmVyZWQsIG5vdCBhbiBvZmZzZXQgYWNjZXB0YW5jZSBwZXJpb2RtASBzdGFydGluZyBmcm9tIHRoZSB0aW1lIGF0IHdoaWNoIHRoZSBwYXJhY2hhaW4gcGVyY2VpdmVzIGEgY29kZSB1cGdyYWRlIGFzIGhhdmluZyBvY2N1cnJlZC5VASBNdWx0aXBsZSBlbnRyaWVzIGZvciBhIHNpbmdsZSBwYXJhIGFyZSBwZXJtaXR0ZWQuIE9yZGVyZWQgYXNjZW5kaW5nIGJ5IGJsb2NrIG51bWJlci5IRnV0dXJlQ29kZVVwZ3JhZGVzAAEEBbECEAQAED0BIFRoZSBibG9jayBudW1iZXIgYXQgd2hpY2ggdGhlIHBsYW5uZWQgY29kZSBjaGFuZ2UgaXMgZXhwZWN0ZWQgZm9yIGEgcGFyYWNoYWluLgBlASBUaGUgY2hhbmdlIHdpbGwgYmUgYXBwbGllZCBhZnRlciB0aGUgZmlyc3QgcGFyYWJsb2NrIGZvciB0aGlzIElEIGluY2x1ZGVkIHdoaWNoIGV4ZWN1dGVzGQEgaW4gdGhlIGNvbnRleHQgb2YgYSByZWxheSBjaGFpbiBibG9jayB3aXRoIGEgbnVtYmVyID49IGBleHBlY3RlZF9hdGAuUEZ1dHVyZUNvZGVVcGdyYWRlc0F0AQCRDQQAIKwgVGhlIGxpc3Qgb2YgdXBjb21pbmcgZnV0dXJlIGNvZGUgdXBncmFkZXMuAG0BIEVhY2ggaXRlbSBpcyBhIHBhaXIgb2YgdGhlIHBhcmFjaGFpbiBhbmQgdGhlIGV4cGVjdGVkIGJsb2NrIGF0IHdoaWNoIHRoZSB1cGdyYWRlIHNob3VsZCBiZVEBIGFwcGxpZWQuIFRoZSB1cGdyYWRlIHdpbGwgYmUgYXBwbGllZCBhdCB0aGUgZ2l2ZW4gcmVsYXkgY2hhaW4gYmxvY2suIEluIGNvbnRyYXN0IHRvdQEgW2BGdXR1cmVDb2RlVXBncmFkZXNgXSB0aGlzIGNvZGUgdXBncmFkZSB3aWxsIGJlIGFwcGxpZWQgcmVnYXJkbGVzcyB0aGUgcGFyYWNoYWluIG1ha2luZyBhbnlEIHByb2dyZXNzIG9yIG5vdC4AjCBPcmRlcmVkIGFzY2VuZGluZyBieSBibG9jayBudW1iZXIuOEZ1dHVyZUNvZGVIYXNoAAEEBbECwQUEAAycIFRoZSBhY3R1YWwgZnV0dXJlIGNvZGUgaGFzaCBvZiBhIHBhcmEuAOQgQ29ycmVzcG9uZGluZyBjb2RlIGNhbiBiZSByZXRyaWV2ZWQgd2l0aCBbYENvZGVCeUhhc2hgXS5IQXV0aG9yaXplZENvZGVIYXNoAAEEBbEClQ0EAARtASBUaGUgY29kZSBoYXNoIGF1dGhvcml6YXRpb25zIGZvciBhIHBhcmEgd2hpY2ggd2lsbCBleHBpcmUgYGV4cGlyZV9hdGAgYEJsb2NrTnVtYmVyRm9yPFQ+YC5QVXBncmFkZUdvQWhlYWRTaWduYWwAAQQFsQKZDQQAKHUBIFRoaXMgaXMgdXNlZCBieSB0aGUgcmVsYXktY2hhaW4gdG8gY29tbXVuaWNhdGUgdG8gYSBwYXJhY2hhaW4gYSBnby1haGVhZCB3aXRoIGluIHRoZSB1cGdyYWRlLCBwcm9jZWR1cmUuAHUBIFRoaXMgdmFsdWUgaXMgYWJzZW50IHdoZW4gdGhlcmUgYXJlIG5vIHVwZ3JhZGVzIHNjaGVkdWxlZCBvciBkdXJpbmcgdGhlIHRpbWUgdGhlIHJlbGF5IGNoYWluVQEgcGVyZm9ybXMgdGhlIGNoZWNrcy4gSXQgaXMgc2V0IGF0IHRoZSBmaXJzdCByZWxheS1jaGFpbiBibG9jayB3aGVuIHRoZSBjb3JyZXNwb25kaW5ndQEgcGFyYWNoYWluIGNhbiBzd2l0Y2ggaXRzIHVwZ3JhZGUgZnVuY3Rpb24uIEFzIHNvb24gYXMgdGhlIHBhcmFjaGFpbidzIGJsb2NrIGlzIGluY2x1ZGVkLCB0aGVwIHZhbHVlIGdldHMgcmVzZXQgdG8gYE5vbmVgLgBlASBOT1RFIHRoYXQgdGhpcyBmaWVsZCBpcyB1c2VkIGJ5IHBhcmFjaGFpbnMgdmlhIG1lcmtsZSBzdG9yYWdlIHByb29mcywgdGhlcmVmb3JlIGNoYW5naW5nxCB0aGUgZm9ybWF0IHdpbGwgcmVxdWlyZSBtaWdyYXRpb24gb2YgcGFyYWNoYWlucy5gVXBncmFkZVJlc3RyaWN0aW9uU2lnbmFsAAEEBbECnQ0EACRpASBUaGlzIGlzIHVzZWQgYnkgdGhlIHJlbGF5LWNoYWluIHRvIGNvbW11bmljYXRlIHRoYXQgdGhlcmUgYXJlIHJlc3RyaWN0aW9ucyBmb3IgcGVyZm9ybWluZ3wgYW4gdXBncmFkZSBmb3IgdGhpcyBwYXJhY2hhaW4uAFkBIFRoaXMgbWF5IGJlIGEgYmVjYXVzZSB0aGUgcGFyYWNoYWluIHdhaXRzIGZvciB0aGUgdXBncmFkZSBjb29sZG93biB0byBleHBpcmUuIEFub3RoZXJtASBwb3RlbnRpYWwgdXNlIGNhc2UgaXMgd2hlbiB3ZSB3YW50IHRvIHBlcmZvcm0gc29tZSBtYWludGVuYW5jZSAoc3VjaCBhcyBzdG9yYWdlIG1pZ3JhdGlvbingIHdlIGNvdWxkIHJlc3RyaWN0IHVwZ3JhZGVzIHRvIG1ha2UgdGhlIHByb2Nlc3Mgc2ltcGxlci4AZQEgTk9URSB0aGF0IHRoaXMgZmllbGQgaXMgdXNlZCBieSBwYXJhY2hhaW5zIHZpYSBtZXJrbGUgc3RvcmFnZSBwcm9vZnMsIHRoZXJlZm9yZSBjaGFuZ2luZ8QgdGhlIGZvcm1hdCB3aWxsIHJlcXVpcmUgbWlncmF0aW9uIG9mIHBhcmFjaGFpbnMuQFVwZ3JhZGVDb29sZG93bnMBAJENBAAMUQEgVGhlIGxpc3Qgb2YgcGFyYWNoYWlucyB0aGF0IGFyZSBhd2FpdGluZyBmb3IgdGhlaXIgdXBncmFkZSByZXN0cmljdGlvbiB0byBjb29sZG93bi4AjCBPcmRlcmVkIGFzY2VuZGluZyBieSBibG9jayBudW1iZXIuQFVwY29taW5nVXBncmFkZXMBAJENBAAYkCBUaGUgbGlzdCBvZiB1cGNvbWluZyBjb2RlIHVwZ3JhZGVzLgBxASBFYWNoIGl0ZW0gaXMgYSBwYWlyIG9mIHdoaWNoIHBhcmEgcGVyZm9ybXMgYSBjb2RlIHVwZ3JhZGUgYW5kIGF0IHdoaWNoIHJlbGF5LWNoYWluIGJsb2NrIGl0QCBpcyBleHBlY3RlZCBhdC4AjCBPcmRlcmVkIGFzY2VuZGluZyBieSBibG9jayBudW1iZXIuMEFjdGlvbnNRdWV1ZQEBBAUQeQ0EAAQVASBUaGUgYWN0aW9ucyB0byBwZXJmb3JtIGR1cmluZyB0aGUgc3RhcnQgb2YgYSBzcGVjaWZpYyBzZXNzaW9uIGluZGV4LlBVcGNvbWluZ1BhcmFzR2VuZXNpcwABBAWxAkkGBAAQoCBVcGNvbWluZyBwYXJhcyBpbnN0YW50aWF0aW9uIGFyZ3VtZW50cy4AZQEgTk9URSB0aGF0IGFmdGVyIFBWRiBwcmUtY2hlY2tpbmcgaXMgZW5hYmxlZCB0aGUgcGFyYSBnZW5lc2lzIGFyZyB3aWxsIGhhdmUgaXQncyBjb2RlIHNldGEBIHRvIGVtcHR5LiBJbnN0ZWFkLCB0aGUgY29kZSB3aWxsIGJlIHNhdmVkIGludG8gdGhlIHN0b3JhZ2UgcmlnaHQgYXdheSB2aWEgYENvZGVCeUhhc2hgLjhDb2RlQnlIYXNoUmVmcwEBBAbBBRAQAAAAAAQpASBUaGUgbnVtYmVyIG9mIHJlZmVyZW5jZSBvbiB0aGUgdmFsaWRhdGlvbiBjb2RlIGluIFtgQ29kZUJ5SGFzaGBdIHN0b3JhZ2UuKENvZGVCeUhhc2gAAQQGwQXdBQQAEJAgVmFsaWRhdGlvbiBjb2RlIHN0b3JlZCBieSBpdHMgaGFzaC4AMQEgVGhpcyBzdG9yYWdlIGlzIGNvbnNpc3RlbnQgd2l0aCBbYEZ1dHVyZUNvZGVIYXNoYF0sIFtgQ3VycmVudENvZGVIYXNoYF0gYW5kSCBbYFBhc3RDb2RlSGFzaGBdLgERBgHZCARAVW5zaWduZWRQcmlvcml0eTAg//////////8AAaENLwAsSW5pdGlhbGl6ZXIBLEluaXRpYWxpemVyCDhIYXNJbml0aWFsaXplZAAABQEEACAhASBXaGV0aGVyIHRoZSBwYXJhY2hhaW5zIG1vZHVsZXMgaGF2ZSBiZWVuIGluaXRpYWxpemVkIHdpdGhpbiB0aGlzIGJsb2NrLgAlASBTZW1hbnRpY2FsbHkgYSBgYm9vbGAsIGJ1dCB0aGlzIGd1YXJhbnRlZXMgaXQgc2hvdWxkIG5ldmVyIGhpdCB0aGUgdHJpZSxpASBhcyB0aGlzIGlzIGNsZWFyZWQgaW4gYG9uX2ZpbmFsaXplYCBhbmQgRnJhbWUgb3B0aW1pemVzIGBOb25lYCB2YWx1ZXMgdG8gYmUgZW1wdHkgdmFsdWVzLgBxASBBcyBhIGBib29sYCwgYHNldChmYWxzZSlgIGFuZCBgcmVtb3ZlKClgIGJvdGggbGVhZCB0byB0aGUgbmV4dCBgZ2V0KClgIGJlaW5nIGZhbHNlLCBidXQgb25ldQEgb2YgdGhlbSB3cml0ZXMgdG8gdGhlIHRyaWUgYW5kIG9uZSBkb2VzIG5vdC4gVGhpcyBjb25mdXNpb24gbWFrZXMgYE9wdGlvbjwoKT5gIG1vcmUgc3VpdGFibGWQIGZvciB0aGUgc2VtYW50aWNzIG9mIHRoaXMgdmFyaWFibGUuWEJ1ZmZlcmVkU2Vzc2lvbkNoYW5nZXMBAKUNBAAcaCBCdWZmZXJlZCBzZXNzaW9uIGNoYW5nZXMuAF0BIFR5cGljYWxseSB0aGlzIHdpbGwgYmUgZW1wdHkgb3Igb25lIGVsZW1lbnQgbG9uZy4gQXBhcnQgZnJvbSB0aGF0IHRoaXMgaXRlbSBuZXZlciBoaXRzNCB0aGUgc3RvcmFnZS4AaQEgSG93ZXZlciB0aGlzIGlzIGEgYFZlY2AgcmVnYXJkbGVzcyB0byBoYW5kbGUgdmFyaW91cyBlZGdlIGNhc2VzIHRoYXQgbWF5IG9jY3VyIGF0IHJ1bnRpbWXAIHVwZ3JhZGUgYm91bmRhcmllcyBvciBpZiBnb3Zlcm5hbmNlIGludGVydmVuZXMuARkGAAAAMAAMRG1wAQxEbXAMVERvd253YXJkTWVzc2FnZVF1ZXVlcwEBBAWxAq0NBAAE0CBUaGUgZG93bndhcmQgbWVzc2FnZXMgYWRkcmVzc2VkIGZvciBhIGNlcnRhaW4gcGFyYS5kRG93bndhcmRNZXNzYWdlUXVldWVIZWFkcwEBBAWxAjSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcJQEgQSBtYXBwaW5nIHRoYXQgc3RvcmVzIHRoZSBkb3dud2FyZCBtZXNzYWdlIHF1ZXVlIE1RQyBoZWFkIGZvciBlYWNoIHBhcmEuAJAgRWFjaCBsaW5rIGluIHRoaXMgY2hhaW4gaGFzIGEgZm9ybTp4IGAocHJldl9oZWFkLCBCLCBIKE0pKWAsIHdoZXJl6CAtIGBwcmV2X2hlYWRgOiBpcyB0aGUgcHJldmlvdXMgaGVhZCBoYXNoIG9yIHplcm8gaWYgbm9uZS4hASAtIGBCYDogaXMgdGhlIHJlbGF5LWNoYWluIGJsb2NrIG51bWJlciBpbiB3aGljaCBhIG1lc3NhZ2Ugd2FzIGFwcGVuZGVkLtQgLSBgSChNKWA6IGlzIHRoZSBoYXNoIG9mIHRoZSBtZXNzYWdlIGJlaW5nIGFwcGVuZGVkLkREZWxpdmVyeUZlZUZhY3RvcgEBBAWxAi0IQAAAZKeztuANAAAAAAAAAAAExCBUaGUgZmFjdG9yIHRvIG11bHRpcGx5IHRoZSBiYXNlIGRlbGl2ZXJ5IGZlZSBieS4AAAAAMQAQSHJtcAEQSHJtcDBcSHJtcE9wZW5DaGFubmVsUmVxdWVzdHMAAQQFIQa1DQQAGLwgVGhlIHNldCBvZiBwZW5kaW5nIEhSTVAgb3BlbiBjaGFubmVsIHJlcXVlc3RzLgDAIFRoZSBzZXQgaXMgYWNjb21wYW5pZWQgYnkgYSBsaXN0IGZvciBpdGVyYXRpb24uACwgSW52YXJpYW50Oj0BIC0gVGhlcmUgYXJlIG5vIGNoYW5uZWxzIHRoYXQgZXhpc3RzIGluIGxpc3QgYnV0IG5vdCBpbiB0aGUgc2V0IGFuZCB2aWNlIHZlcnNhLmxIcm1wT3BlbkNoYW5uZWxSZXF1ZXN0c0xpc3QBALkNBAAAbEhybXBPcGVuQ2hhbm5lbFJlcXVlc3RDb3VudAEBBAWxAhAQAAAAAAxlASBUaGlzIG1hcHBpbmcgdHJhY2tzIGhvdyBtYW55IG9wZW4gY2hhbm5lbCByZXF1ZXN0cyBhcmUgaW5pdGlhdGVkIGJ5IGEgZ2l2ZW4gc2VuZGVyIHBhcmEuWQEgSW52YXJpYW50OiBgSHJtcE9wZW5DaGFubmVsUmVxdWVzdHNgIHNob3VsZCBjb250YWluIHRoZSBzYW1lIG51bWJlciBvZiBpdGVtcyB0aGF0IGhhcwUBIGAoWCwgXylgIGFzIHRoZSBudW1iZXIgb2YgYEhybXBPcGVuQ2hhbm5lbFJlcXVlc3RDb3VudGAgZm9yIGBYYC58SHJtcEFjY2VwdGVkQ2hhbm5lbFJlcXVlc3RDb3VudAEBBAWxAhAQAAAAAAxxASBUaGlzIG1hcHBpbmcgdHJhY2tzIGhvdyBtYW55IG9wZW4gY2hhbm5lbCByZXF1ZXN0cyB3ZXJlIGFjY2VwdGVkIGJ5IGEgZ2l2ZW4gcmVjaXBpZW50IHBhcmEubQEgSW52YXJpYW50OiBgSHJtcE9wZW5DaGFubmVsUmVxdWVzdHNgIHNob3VsZCBjb250YWluIHRoZSBzYW1lIG51bWJlciBvZiBpdGVtcyBgKF8sIFgpYCB3aXRoVQEgYGNvbmZpcm1lZGAgc2V0IHRvIHRydWUsIGFzIHRoZSBudW1iZXIgb2YgYEhybXBBY2NlcHRlZENoYW5uZWxSZXF1ZXN0Q291bnRgIGZvciBgWGAuYEhybXBDbG9zZUNoYW5uZWxSZXF1ZXN0cwABBAUhBgUBBAAccQEgQSBzZXQgb2YgcGVuZGluZyBIUk1QIGNsb3NlIGNoYW5uZWwgcmVxdWVzdHMgdGhhdCBhcmUgZ29pbmcgdG8gYmUgY2xvc2VkIGR1cmluZyB0aGUgc2Vzc2lvbiEBIGNoYW5nZS4gVXNlZCBmb3IgY2hlY2tpbmcgaWYgYSBnaXZlbiBjaGFubmVsIGlzIHJlZ2lzdGVyZWQgZm9yIGNsb3N1cmUuAMAgVGhlIHNldCBpcyBhY2NvbXBhbmllZCBieSBhIGxpc3QgZm9yIGl0ZXJhdGlvbi4ALCBJbnZhcmlhbnQ6PQEgLSBUaGVyZSBhcmUgbm8gY2hhbm5lbHMgdGhhdCBleGlzdHMgaW4gbGlzdCBidXQgbm90IGluIHRoZSBzZXQgYW5kIHZpY2UgdmVyc2EucEhybXBDbG9zZUNoYW5uZWxSZXF1ZXN0c0xpc3QBALkNBAAAOEhybXBXYXRlcm1hcmtzAAEEBbECEAQAELggVGhlIEhSTVAgd2F0ZXJtYXJrIGFzc29jaWF0ZWQgd2l0aCBlYWNoIHBhcmEuLCBJbnZhcmlhbnQ6VQEgLSBlYWNoIHBhcmEgYFBgIHVzZWQgaGVyZSBhcyBhIGtleSBzaG91bGQgc2F0aXNmeSBgUGFyYXM6OmlzX3ZhbGlkX3BhcmEoUClgIHdpdGhpbiBhLCAgIHNlc3Npb24uMEhybXBDaGFubmVscwABBAUhBr0NBAAMtCBIUk1QIGNoYW5uZWwgZGF0YSBhc3NvY2lhdGVkIHdpdGggZWFjaCBwYXJhLiwgSW52YXJpYW50OnUBIC0gZWFjaCBwYXJ0aWNpcGFudCBpbiB0aGUgY2hhbm5lbCBzaG91bGQgc2F0aXNmeSBgUGFyYXM6OmlzX3ZhbGlkX3BhcmEoUClgIHdpdGhpbiBhIHNlc3Npb24uYEhybXBJbmdyZXNzQ2hhbm5lbHNJbmRleAEBBAWxAnkNBAA0cQEgSW5ncmVzcy9lZ3Jlc3MgaW5kZXhlcyBhbGxvdyB0byBmaW5kIGFsbCB0aGUgc2VuZGVycyBhbmQgcmVjZWl2ZXJzIGdpdmVuIHRoZSBvcHBvc2l0ZSBzaWRlLhQgSS5lLgAhASAoYSkgaW5ncmVzcyBpbmRleCBhbGxvd3MgdG8gZmluZCBhbGwgdGhlIHNlbmRlcnMgZm9yIGEgZ2l2ZW4gcmVjaXBpZW50Lh0BIChiKSBlZ3Jlc3MgaW5kZXggYWxsb3dzIHRvIGZpbmQgYWxsIHRoZSByZWNpcGllbnRzIGZvciBhIGdpdmVuIHNlbmRlci4AMCBJbnZhcmlhbnRzOlEBIC0gZm9yIGVhY2ggaW5ncmVzcyBpbmRleCBlbnRyeSBmb3IgYFBgIGVhY2ggaXRlbSBgSWAgaW4gdGhlIGluZGV4IHNob3VsZCBwcmVzZW50IGlueCAgIGBIcm1wQ2hhbm5lbHNgIGFzIGAoSSwgUClgLk0BIC0gZm9yIGVhY2ggZWdyZXNzIGluZGV4IGVudHJ5IGZvciBgUGAgZWFjaCBpdGVtIGBFYCBpbiB0aGUgaW5kZXggc2hvdWxkIHByZXNlbnQgaW54ICAgYEhybXBDaGFubmVsc2AgYXMgYChQLCBFKWAuAQEgLSB0aGVyZSBzaG91bGQgYmUgbm8gb3RoZXIgZGFuZ2xpbmcgY2hhbm5lbHMgaW4gYEhybXBDaGFubmVsc2AuaCAtIHRoZSB2ZWN0b3JzIGFyZSBzb3J0ZWQuXEhybXBFZ3Jlc3NDaGFubmVsc0luZGV4AQEEBbECeQ0EAABMSHJtcENoYW5uZWxDb250ZW50cwEBBAUhBsENBAAIrCBTdG9yYWdlIGZvciB0aGUgbWVzc2FnZXMgZm9yIGVhY2ggY2hhbm5lbC5lASBJbnZhcmlhbnQ6IGNhbm5vdCBiZSBub24tZW1wdHkgaWYgdGhlIGNvcnJlc3BvbmRpbmcgY2hhbm5lbCBpbiBgSHJtcENoYW5uZWxzYCBpcyBgTm9uZWAuSEhybXBDaGFubmVsRGlnZXN0cwEBBAWxAskNBAAYaQEgTWFpbnRhaW5zIGEgbWFwcGluZyB0aGF0IGNhbiBiZSB1c2VkIHRvIGFuc3dlciB0aGUgcXVlc3Rpb246IFdoYXQgcGFyYXMgc2VudCBhIG1lc3NhZ2UgYXTkIHRoZSBnaXZlbiBibG9jayBudW1iZXIgZm9yIGEgZ2l2ZW4gcmVjZWl2ZXIuIEludmFyaWFudHM6qCAtIFRoZSBpbm5lciBgVmVjPFBhcmFJZD5gIGlzIG5ldmVyIGVtcHR5LuggLSBUaGUgaW5uZXIgYFZlYzxQYXJhSWQ+YCBjYW5ub3Qgc3RvcmUgdHdvIHNhbWUgYFBhcmFJZGAubQEgLSBUaGUgb3V0ZXIgdmVjdG9yIGlzIHNvcnRlZCBhc2NlbmRpbmcgYnkgYmxvY2sgbnVtYmVyIGFuZCBjYW5ub3Qgc3RvcmUgdHdvIGl0ZW1zIHdpdGggdGhlVCAgIHNhbWUgYmxvY2sgbnVtYmVyLgEdBgHdCAAB0Q0zADxQYXJhU2Vzc2lvbkluZm8BPFBhcmFTZXNzaW9uSW5mbxRQQXNzaWdubWVudEtleXNVbnNhZmUBANUNBAAMpCBBc3NpZ25tZW50IGtleXMgZm9yIHRoZSBjdXJyZW50IHNlc3Npb24ubQEgTm90ZSB0aGF0IHRoaXMgQVBJIGlzIHByaXZhdGUgZHVlIHRvIGl0IGJlaW5nIHByb25lIHRvICdvZmYtYnktb25lJyBhdCBzZXNzaW9uIGJvdW5kYXJpZXMurCBXaGVuIGluIGRvdWJ0LCB1c2UgYFNlc3Npb25zYCBBUEkgaW5zdGVhZC5URWFybGllc3RTdG9yZWRTZXNzaW9uAQAQEAAAAAAEAQEgVGhlIGVhcmxpZXN0IHNlc3Npb24gZm9yIHdoaWNoIHByZXZpb3VzIHNlc3Npb24gaW5mbyBpcyBzdG9yZWQuIFNlc3Npb25zAAEEBhDZDQQADKQgU2Vzc2lvbiBpbmZvcm1hdGlvbiBpbiBhIHJvbGxpbmcgd2luZG93LjUBIFNob3VsZCBoYXZlIGFuIGVudHJ5IGluIHJhbmdlIGBFYXJsaWVzdFN0b3JlZFNlc3Npb24uLj1DdXJyZW50U2Vzc2lvbkluZGV4YC51ASBEb2VzIG5vdCBoYXZlIGFueSBlbnRyaWVzIGJlZm9yZSB0aGUgc2Vzc2lvbiBpbmRleCBpbiB0aGUgZmlyc3Qgc2Vzc2lvbiBjaGFuZ2Ugbm90aWZpY2F0aW9uLixBY2NvdW50S2V5cwABBAYQAQIEAARxASBUaGUgdmFsaWRhdG9yIGFjY291bnQga2V5cyBvZiB0aGUgdmFsaWRhdG9ycyBhY3RpdmVseSBwYXJ0aWNpcGF0aW5nIGluIHBhcmFjaGFpbiBjb25zZW5zdXMuVFNlc3Npb25FeGVjdXRvclBhcmFtcwABBAYQZQUEAATEIEV4ZWN1dG9yIHBhcmFtZXRlciBzZXQgZm9yIGEgZ2l2ZW4gc2Vzc2lvbiBpbmRleAAAAAA0ADRQYXJhc0Rpc3B1dGVzATRQYXJhc0Rpc3B1dGVzFERMYXN0UHJ1bmVkU2Vzc2lvbgAAEAQACAEBIFRoZSBsYXN0IHBydW5lZCBzZXNzaW9uLCBpZiBhbnkuIEFsbCBkYXRhIHN0b3JlZCBieSB0aGlzIG1vZHVsZVQgcmVmZXJlbmNlcyBzZXNzaW9ucy4gRGlzcHV0ZXMAAQgFAuUN6Q0EAAQFASBBbGwgb25nb2luZyBvciBjb25jbHVkZWQgZGlzcHV0ZXMgZm9yIHRoZSBsYXN0IHNldmVyYWwgc2Vzc2lvbnMuREJhY2tlcnNPbkRpc3B1dGVzAAEIBQLlDe0NBAAInCBCYWNraW5nIHZvdGVzIHN0b3JlZCBmb3IgZWFjaCBkaXNwdXRlLowgVGhpcyBzdG9yYWdlIGlzIHVzZWQgZm9yIHNsYXNoaW5nLiBJbmNsdWRlZAABCAUC5Q0QBAAIRQEgQWxsIGluY2x1ZGVkIGJsb2NrcyBvbiB0aGUgY2hhaW4sIGFzIHdlbGwgYXMgdGhlIGJsb2NrIG51bWJlciBpbiB0aGlzIGNoYWluIHRoYXRZASBzaG91bGQgYmUgcmV2ZXJ0ZWQgYmFjayB0byBpZiB0aGUgY2FuZGlkYXRlIGlzIGRpc3B1dGVkIGFuZCBkZXRlcm1pbmVkIHRvIGJlIGludmFsaWQuGEZyb3plbgEAnAQAEBEBIFdoZXRoZXIgdGhlIGNoYWluIGlzIGZyb3plbi4gU3RhcnRzIGFzIGBOb25lYC4gV2hlbiB0aGlzIGlzIGBTb21lYCw1ASB0aGUgY2hhaW4gd2lsbCBub3QgYWNjZXB0IGFueSBuZXcgcGFyYWNoYWluIGJsb2NrcyBmb3IgYmFja2luZyBvciBpbmNsdXNpb24sCQEgYW5kIGl0cyB2YWx1ZSBpbmRpY2F0ZXMgdGhlIGxhc3QgdmFsaWQgYmxvY2sgbnVtYmVyIGluIHRoZSBjaGFpbi74IEl0IGNhbiBvbmx5IGJlIHNldCBiYWNrIHRvIGBOb25lYCBieSBnb3Zlcm5hbmNlIGludGVydmVudGlvbi4BJQYB4QgAAfENNQA0UGFyYXNTbGFzaGluZwE0UGFyYXNTbGFzaGluZwhAVW5hcHBsaWVkU2xhc2hlcwABCAUC5Q31DQQABJAgVmFsaWRhdG9ycyBwZW5kaW5nIGRpc3B1dGUgc2xhc2hlcy5IVmFsaWRhdG9yU2V0Q291bnRzAAEEBRAQBAAEhCBgVmFsaWRhdG9yU2V0Q291bnRgIHBlciBzZXNzaW9uLgEpBgAAAQUONgBoT25EZW1hbmRBc3NpZ25tZW50UHJvdmlkZXIBaE9uRGVtYW5kQXNzaWdubWVudFByb3ZpZGVyGDhQYXJhSWRBZmZpbml0eQABBAWxAgkOBAAMcQEgTWFwcyBhIGBQYXJhSWRgIHRvIGBDb3JlSW5kZXhgIGFuZCBrZWVwcyB0cmFjayBvZiBob3cgbWFueSBhc3NpZ25tZW50cyB0aGUgc2NoZWR1bGVyIGhhcyBpbl0BIGl0J3MgbG9va2FoZWFkLiBLZWVwaW5nIHRyYWNrIG9mIHRoaXMgYWZmaW5pdHkgcHJldmVudHMgcGFyYWxsZWwgZXhlY3V0aW9uIG9mIHRoZSBzYW1lnCBgUGFyYUlkYCBvbiB0d28gb3IgbW9yZSBgQ29yZUluZGV4YGVzLixRdWV1ZVN0YXR1cwEADQ5kAABkp7O24A0AAAAAAAAAAAAAAAAAAAAAAATcIE92ZXJhbGwgc3RhdHVzIG9mIHF1ZXVlIChib3RoIGZyZWUgKyBhZmZpbml0eSBlbnRyaWVzKSxGcmVlRW50cmllcwEAIQ4EAARhASBQcmlvcml0eSBxdWV1ZSBmb3IgYWxsIG9yZGVycyB3aGljaCBkb24ndCB5ZXQgKG9yIG5vdCBhbnkgbW9yZSkgaGF2ZSBhbnkgY29yZSBhZmZpbml0eS48QWZmaW5pdHlFbnRyaWVzAQEEBdEIIQ4EAARJASBRdWV1ZSBlbnRyaWVzIHRoYXQgYXJlIGN1cnJlbnRseSBib3VuZCB0byBhIHBhcnRpY3VsYXIgY29yZSBkdWUgdG8gY29yZSBhZmZpbml0eS4cUmV2ZW51ZQEALQ4EAAT8IEtlZXBzIHRyYWNrIG9mIGFjY3VtdWxhdGVkIHJldmVudWUgZnJvbSBvbiBkZW1hbmQgb3JkZXIgc2FsZXMuHENyZWRpdHMBAQQCABhAAAAAAAAAAAAAAAAAAAAAAAS4IEtlZXBzIHRyYWNrIG9mIGNyZWRpdHMgb3duZWQgYnkgZWFjaCBhY2NvdW50LgE5BgHtCAxMVHJhZmZpY0RlZmF1bHRWYWx1ZS0IQAAAZKeztuANAAAAAAAAAAAEzCBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIHNwb3QgdHJhZmZpYyBtdWx0aXBsaWVyLlBNYXhIaXN0b3JpY2FsUmV2ZW51ZRAQoAAAAAjUIFRoZSBtYXhpbXVtIG51bWJlciBvZiBibG9ja3Mgc29tZSBoaXN0b3JpY2FsIHJldmVudWVgIGluZm9ybWF0aW9uIHN0b3JlZCBmb3IuIFBhbGxldElkLQwgcHkvb25kbWQEtCBJZGVudGlmaWVyIGZvciB0aGUgaW50ZXJuYWwgcmV2ZW51ZSBiYWxhbmNlLgE1DjgAaENvcmV0aW1lQXNzaWdubWVudFByb3ZpZGVyAWhDb3JldGltZUFzc2lnbm1lbnRQcm92aWRlcgg0Q29yZVNjaGVkdWxlcwABBAQ5Dj0OBAAQbCBTY2hlZHVsZWQgYXNzaWdubWVudCBzZXRzLgBtASBBc3NpZ25tZW50cyBhcyBvZiB0aGUgZ2l2ZW4gYmxvY2sgbnVtYmVyLiBUaGV5IHdpbGwgZ28gaW50byBzdGF0ZSBvbmNlIHRoZSBibG9jayBudW1iZXIgaXPQIHJlYWNoZWQgKGFuZCByZXBsYWNlIHdoYXRldmVyIHdhcyBpbiB0aGVyZSBiZWZvcmUpLjxDb3JlRGVzY3JpcHRvcnMBAQQE0QhBDggAABCgIEFzc2lnbm1lbnRzIHdoaWNoIGFyZSBjdXJyZW50bHkgYWN0aXZlLgBpASBUaGV5IHdpbGwgYmUgcGlja2VkIGZyb20gYFBlbmRpbmdBc3NpZ25tZW50c2Agb25jZSB3ZSByZWFjaCB0aGUgc2NoZWR1bGVkIGJsb2NrIG51bWJlciBpblggYFBlbmRpbmdBc3NpZ25tZW50c2AuAAAAAWEOOQAkUmVnaXN0cmFyASRSZWdpc3RyYXIMLFBlbmRpbmdTd2FwAAEEBbECsQIEAARkIFBlbmRpbmcgc3dhcCBvcGVyYXRpb25zLhRQYXJhcwABBAWxAmUOBAAQBQEgQW1vdW50IGhlbGQgb24gZGVwb3NpdCBmb3IgZWFjaCBwYXJhIGFuZCB0aGUgb3JpZ2luYWwgZGVwb3NpdG9yLgBxASBUaGUgZ2l2ZW4gYWNjb3VudCBJRCBpcyByZXNwb25zaWJsZSBmb3IgcmVnaXN0ZXJpbmcgdGhlIGNvZGUgYW5kIGluaXRpYWwgaGVhZCBkYXRhLCBidXQgbWF5VQEgb25seSBkbyBzbyBpZiBpdCBpc24ndCB5ZXQgcmVnaXN0ZXJlZC4gKEFmdGVyIHRoYXQsIGl0J3MgdXAgdG8gZ292ZXJuYW5jZSB0byBkbyBzby4pOE5leHRGcmVlUGFyYUlkAQCxAhAAAAAABGAgVGhlIG5leHQgZnJlZSBgUGFyYUlkYC4BPQYB8QgILFBhcmFEZXBvc2l0GEAAQOWcMBIAAAAAAAAAAAAACNQgVGhlIGRlcG9zaXQgdG8gYmUgcGFpZCB0byBydW4gYSBvbi1kZW1hbmQgcGFyYWNoYWluLj0BIFRoaXMgc2hvdWxkIGluY2x1ZGUgdGhlIGNvc3QgZm9yIHN0b3JpbmcgdGhlIGdlbmVzaXMgaGVhZCBhbmQgdmFsaWRhdGlvbiBjb2RlLkhEYXRhRGVwb3NpdFBlckJ5dGUYQIDw+gIAAAAAAAAAAAAAAAAExCBUaGUgZGVwb3NpdCB0byBiZSBwYWlkIHBlciBieXRlIHN0b3JlZCBvbiBjaGFpbi4BaQ48ABRTbG90cwEUU2xvdHMEGExlYXNlcwEBBAWxAm0OBABAFQEgQW1vdW50cyBoZWxkIG9uIGRlcG9zaXQgZm9yIGVhY2ggKHBvc3NpYmx5IGZ1dHVyZSkgbGVhc2VkIHBhcmFjaGFpbi4AYQEgVGhlIGFjdHVhbCBhbW91bnQgbG9ja2VkIG9uIGl0cyBiZWhhbGYgYnkgYW55IGFjY291bnQgYXQgYW55IHRpbWUgaXMgdGhlIG1heGltdW0gb2YgdGhlKQEgc2Vjb25kIHZhbHVlcyBvZiB0aGUgaXRlbXMgaW4gdGhpcyBsaXN0IHdob3NlIGZpcnN0IHZhbHVlIGlzIHRoZSBhY2NvdW50LgBhASBUaGUgZmlyc3QgaXRlbSBpbiB0aGUgbGlzdCBpcyB0aGUgYW1vdW50IGxvY2tlZCBmb3IgdGhlIGN1cnJlbnQgTGVhc2UgUGVyaW9kLiBGb2xsb3dpbmewIGl0ZW1zIGFyZSBmb3IgdGhlIHN1YnNlcXVlbnQgbGVhc2UgcGVyaW9kcy4AYQEgVGhlIGRlZmF1bHQgdmFsdWUgKGFuIGVtcHR5IGxpc3QpIGltcGxpZXMgdGhhdCB0aGUgcGFyYWNoYWluIG5vIGxvbmdlciBleGlzdHMgKG9yIG5ldmVytCBleGlzdGVkKSBhcyBmYXIgYXMgdGhpcyBwYWxsZXQgaXMgY29uY2VybmVkLgBRASBJZiBhIHBhcmFjaGFpbiBkb2Vzbid0IGV4aXN0ICp5ZXQqIGJ1dCBpcyBzY2hlZHVsZWQgdG8gZXhpc3QgaW4gdGhlIGZ1dHVyZSwgdGhlbiBpdGEBIHdpbGwgYmUgbGVmdC1wYWRkZWQgd2l0aCBvbmUgb3IgbW9yZSBgTm9uZWBzIHRvIGRlbm90ZSB0aGUgZmFjdCB0aGF0IG5vdGhpbmcgaXMgaGVsZCBvbl0BIGRlcG9zaXQgZm9yIHRoZSBub24tZXhpc3RlbnQgY2hhaW4gY3VycmVudGx5LCBidXQgaXMgaGVsZCBhdCBzb21lIHBvaW50IGluIHRoZSBmdXR1cmUuANwgSXQgaXMgaWxsZWdhbCBmb3IgYSBgTm9uZWAgdmFsdWUgdG8gdHJhaWwgaW4gdGhlIGxpc3QuAUEGAfUICCxMZWFzZVBlcmlvZBAQACcGAATcIFRoZSBudW1iZXIgb2YgYmxvY2tzIG92ZXIgd2hpY2ggYSBzaW5nbGUgcGVyaW9kIGxhc3RzLixMZWFzZU9mZnNldBAQAAAAAATUIFRoZSBudW1iZXIgb2YgYmxvY2tzIHRvIG9mZnNldCBlYWNoIGxlYXNlIHBlcmlvZCBieS4BcQ49AEBQYXJhc1N1ZG9XcmFwcGVyAAFFBgAAAXUOPgAgQXVjdGlvbnMBIEF1Y3Rpb25zEDhBdWN0aW9uQ291bnRlcgEAEBAAAAAABIwgTnVtYmVyIG9mIGF1Y3Rpb25zIHN0YXJ0ZWQgc28gZmFyLixBdWN0aW9uSW5mbwAAJQEEABT4IEluZm9ybWF0aW9uIHJlbGF0aW5nIHRvIHRoZSBjdXJyZW50IGF1Y3Rpb24sIGlmIHRoZXJlIGlzIG9uZS4ARQEgVGhlIGZpcnN0IGl0ZW0gaW4gdGhlIHR1cGxlIGlzIHRoZSBsZWFzZSBwZXJpb2QgaW5kZXggdGhhdCB0aGUgZmlyc3Qgb2YgdGhlIGZvdXJRASBjb250aWd1b3VzIGxlYXNlIHBlcmlvZHMgb24gYXVjdGlvbiBpcyBmb3IuIFRoZSBzZWNvbmQgaXMgdGhlIGJsb2NrIG51bWJlciB3aGVuIHRoZV0BIGF1Y3Rpb24gd2lsbCAiYmVnaW4gdG8gZW5kIiwgaS5lLiB0aGUgZmlyc3QgYmxvY2sgb2YgdGhlIEVuZGluZyBQZXJpb2Qgb2YgdGhlIGF1Y3Rpb24uPFJlc2VydmVkQW1vdW50cwABBAV5DhgEAAgxASBBbW91bnRzIGN1cnJlbnRseSByZXNlcnZlZCBpbiB0aGUgYWNjb3VudHMgb2YgdGhlIGJpZGRlcnMgY3VycmVudGx5IHdpbm5pbmc4IChzdWItKXJhbmdlcy4cV2lubmluZwABBAUQfQ4EAAxhASBUaGUgd2lubmluZyBiaWRzIGZvciBlYWNoIG9mIHRoZSAxMCByYW5nZXMgYXQgZWFjaCBzYW1wbGUgaW4gdGhlIGZpbmFsIEVuZGluZyBQZXJpb2Qgb2ZJASB0aGUgY3VycmVudCBhdWN0aW9uLiBUaGUgbWFwJ3Mga2V5IGlzIHRoZSAwLWJhc2VkIGluZGV4IGludG8gdGhlIFNhbXBsZSBTaXplLiBUaGUdASBmaXJzdCBzYW1wbGUgb2YgdGhlIGVuZGluZyBwZXJpb2QgaXMgMDsgdGhlIGxhc3QgaXMgYFNhbXBsZSBTaXplIC0gMWAuAXkHAfkIEDBFbmRpbmdQZXJpb2QQEEAZAQAEHQEgVGhlIG51bWJlciBvZiBibG9ja3Mgb3ZlciB3aGljaCBhbiBhdWN0aW9uIG1heSBiZSByZXRyb2FjdGl2ZWx5IGVuZGVkLjBTYW1wbGVMZW5ndGgQEBQAAAAM8CBUaGUgbGVuZ3RoIG9mIGVhY2ggc2FtcGxlIHRvIHRha2UgZHVyaW5nIHRoZSBlbmRpbmcgcGVyaW9kLgDUIGBFbmRpbmdQZXJpb2RgIC8gYFNhbXBsZUxlbmd0aGAgPSBUb3RhbCAjIG9mIFNhbXBsZXM4U2xvdFJhbmdlQ291bnQQECQAAAAATExlYXNlUGVyaW9kc1BlclNsb3QQEAgAAAAAAYkOPwAkQ3Jvd2Rsb2FuASRDcm93ZGxvYW4QFEZ1bmRzAAEEBbECjQ4EAARoIEluZm8gb24gYWxsIG9mIHRoZSBmdW5kcy4gTmV3UmFpc2UBAHkNBAAIVQEgVGhlIGZ1bmRzIHRoYXQgaGF2ZSBoYWQgYWRkaXRpb25hbCBjb250cmlidXRpb25zIGR1cmluZyB0aGUgbGFzdCBibG9jay4gVGhpcyBpcyB1c2VkFQEgaW4gb3JkZXIgdG8gZGV0ZXJtaW5lIHdoaWNoIGZ1bmRzIHNob3VsZCBzdWJtaXQgbmV3IG9yIHVwZGF0ZWQgYmlkcy4wRW5kaW5nc0NvdW50AQAQEAAAAAAEKQEgVGhlIG51bWJlciBvZiBhdWN0aW9ucyB0aGF0IGhhdmUgZW50ZXJlZCBpbnRvIHRoZWlyIGVuZGluZyBwZXJpb2Qgc28gZmFyLjROZXh0RnVuZEluZGV4AQAQEAAAAAAEqCBUcmFja2VyIGZvciB0aGUgbmV4dCBhdmFpbGFibGUgZnVuZCBpbmRleAGBBwH9CAwgUGFsbGV0SWQtDCBweS9jZnVuZAgNASBgUGFsbGV0SWRgIGZvciB0aGUgY3Jvd2Rsb2FuIHBhbGxldC4gQW4gYXBwcm9wcmlhdGUgdmFsdWUgY291bGQgYmVkIGBQYWxsZXRJZCgqYiJweS9jZnVuZCIpYDxNaW5Db250cmlidXRpb24YQAAQpdToAAAAAAAAAAAAAAAIYQEgVGhlIG1pbmltdW0gYW1vdW50IHRoYXQgbWF5IGJlIGNvbnRyaWJ1dGVkIGludG8gYSBjcm93ZGxvYW4uIFNob3VsZCBhbG1vc3QgY2VydGFpbmx5IGJlfCBhdCBsZWFzdCBgRXhpc3RlbnRpYWxEZXBvc2l0YC48UmVtb3ZlS2V5c0xpbWl0EBD0AQAABOQgTWF4IG51bWJlciBvZiBzdG9yYWdlIGtleXMgdG8gcmVtb3ZlIHBlciBleHRyaW5zaWMgY2FsbC4BlQ5AADRBc3NpZ25lZFNsb3RzATRBc3NpZ25lZFNsb3RzHDhQZXJtYW5lbnRTbG90cwABBAWxAiUBBAAEHQEgQXNzaWduZWQgcGVybWFuZW50IHNsb3RzLCB3aXRoIHRoZWlyIHN0YXJ0IGxlYXNlIHBlcmlvZCwgYW5kIGR1cmF0aW9uLkhQZXJtYW5lbnRTbG90Q291bnQBABAQAAAAAATEIE51bWJlciBvZiBhc3NpZ25lZCAoYW5kIGFjdGl2ZSkgcGVybWFuZW50IHNsb3RzLjhUZW1wb3JhcnlTbG90cwABBAWxApkOBAAEaCBBc3NpZ25lZCB0ZW1wb3Jhcnkgc2xvdHMuSFRlbXBvcmFyeVNsb3RDb3VudAEAEBAAAAAABJAgTnVtYmVyIG9mIGFzc2lnbmVkIHRlbXBvcmFyeSBzbG90cy5gQWN0aXZlVGVtcG9yYXJ5U2xvdENvdW50AQAQEAAAAAAE/CBOdW1iZXIgb2YgYWN0aXZlIHRlbXBvcmFyeSBzbG90cyBpbiBjdXJyZW50IHNsb3QgbGVhc2UgcGVyaW9kLkRNYXhUZW1wb3JhcnlTbG90cwEAEBAAAAAABOQgIFRoZSBtYXggbnVtYmVyIG9mIHRlbXBvcmFyeSBzbG90cyB0aGF0IGNhbiBiZSBhc3NpZ25lZC5ETWF4UGVybWFuZW50U2xvdHMBABAQAAAAAATgIFRoZSBtYXggbnVtYmVyIG9mIHBlcm1hbmVudCBzbG90cyB0aGF0IGNhbiBiZSBhc3NpZ25lZC4BjQcBAQkMeFBlcm1hbmVudFNsb3RMZWFzZVBlcmlvZExlbmd0aBAQGgAAAAT4IFRoZSBudW1iZXIgb2YgbGVhc2UgcGVyaW9kcyBhIHBlcm1hbmVudCBwYXJhY2hhaW4gc2xvdCBsYXN0cy54VGVtcG9yYXJ5U2xvdExlYXNlUGVyaW9kTGVuZ3RoEBABAAAABPggVGhlIG51bWJlciBvZiBsZWFzZSBwZXJpb2RzIGEgdGVtcG9yYXJ5IHBhcmFjaGFpbiBzbG90IGxhc3RzLnhNYXhUZW1wb3JhcnlTbG90UGVyTGVhc2VQZXJpb2QQEAUAAAAEFQEgVGhlIG1heCBudW1iZXIgb2YgdGVtcG9yYXJ5IHNsb3RzIHRvIGJlIHNjaGVkdWxlZCBwZXIgbGVhc2UgcGVyaW9kcy4BnQ5BACBDb3JldGltZQABlQcBBQkIIEJyb2tlcklkEBDtAwAABIggVGhlIFBhcmFJZCBvZiB0aGUgY29yZXRpbWUgY2hhaW4uREJyb2tlclBvdExvY2F0aW9uvQKMAQEAbW9kbHB5L2Jyb2tlAAAAAAAAAAAAAAAAAAAAAAAAAAAEhCBUaGUgY29yZXRpbWUgY2hhaW4gcG90IGxvY2F0aW9uLgGhDkIAPFN0YWtpbmdBaENsaWVudAE8U3Rha2luZ0FoQ2xpZW50HDBWYWxpZGF0b3JTZXQAAKUOBAAM+CBUaGUgcXVldWVkIHZhbGlkYXRvciBzZXRzIGZvciBhIGdpdmVuIHBsYW5uaW5nIHNlc3Npb24gaW5kZXguAKwgVGhpcyBpcyByZWNlaXZlZCB2aWEgYSBjYWxsIGZyb20gQXNzZXRIdWIucEluY29tcGxldGVWYWxpZGF0b3JTZXRSZXBvcnQAAK0HBAAEkCBBbiBpbmNvbXBsZXRlIHZhbGlkYXRvciBzZXQgcmVwb3J0LjxWYWxpZGF0b3JQb2ludHMBAQQFABAQAAAAABCUIEFsbCBvZiB0aGUgcG9pbnRzIG9mIHRoZSB2YWxpZGF0b3JzLgBhASBUaGlzIGlzIHBvcHVsYXRlZCBkdXJpbmcgYSBzZXNzaW9uLCBhbmQgaXMgZmx1c2hlZCBhbmQgc2VudCBvdmVyIHZpYSBbYFNlbmRUb0Fzc2V0SHViYF1UIGF0IGVhY2ggc2Vzc2lvbiBlbmQuEE1vZGUBALEHBAAQ0CBJbmRpY2F0ZXMgdGhlIGN1cnJlbnQgb3BlcmF0aW5nIG1vZGUgb2YgdGhlIHBhbGxldC4AcQEgVGhpcyB2YWx1ZSBkZXRlcm1pbmVzIGhvdyB0aGUgcGFsbGV0IGJlaGF2ZXMgaW4gcmVzcG9uc2UgdG8gaW5jb21pbmcgYW5kIG91dGdvaW5nIG1lc3NhZ2VzLGkBIHBhcnRpY3VsYXJseSB3aGV0aGVyIGl0IHNob3VsZCBleGVjdXRlIGxvZ2ljIGRpcmVjdGx5LCBkZWZlciBpdCwgb3IgZGVsZWdhdGUgaXQgZW50aXJlbHkucE5leHRTZXNzaW9uQ2hhbmdlc1ZhbGlkYXRvcnMAABAEACBpASBBIHN0b3JhZ2UgdmFsdWUgdGhhdCBpcyBzZXQgd2hlbiBhIGBuZXdfc2Vzc2lvbmAgZ2l2ZXMgYSBuZXcgdmFsaWRhdG9yIHNldCB0byB0aGUgc2Vzc2lvbqQgcGFsbGV0LCBhbmQgaXMgY2xlYXJlZCBvbiB0aGUgbmV4dCBjYWxsLgBtASBUaGUgaW5uZXIgdTMyIGlzIHRoZSBpZCBvZiB0aGUgc2FpZCBhY3RpdmF0ZWQgdmFsaWRhdG9yIHNldC4gV2hpbGUgbm90IHJlbGV2YW50IGhlcmUsIGdvb2T8IHRvIGtub3cgdGhpcyBpcyB0aGUgcGxhbm5pbmcgZXJhIGluZGV4IG9mIHN0YWtpbmctYXN5bmMgb24gQUguAFkBIE9uY2UgY2xlYXJlZCwgd2Uga25vdyBhIHZhbGlkYXRvciBzZXQgaGFzIGJlZW4gYWN0aXZhdGVkLCBhbmQgdGhlcmVmb3JlIHdlIGNhbiBzZW5kIGFEIHRpbWVzdGFtcCB0byBBSC5UVmFsaWRhdG9yU2V0QXBwbGllZEF0AAAQBAAQJQEgVGhlIHNlc3Npb24gaW5kZXggYXQgd2hpY2ggdGhlIGxhdGVzdCBlbGVjdGVkIHZhbGlkYXRvciBzZXQgd2FzIGFwcGxpZWQuAHUBIFRoaXMgaXMgdXNlZCB0byBkZXRlcm1pbmUgaWYgYW4gb2ZmZW5jZSwgZ2l2ZW4gYSBzZXNzaW9uIGluZGV4LCBpcyBpbiB0aGUgY3VycmVudCBhY3RpdmUgZXJhICBvciBub3QuQEJ1ZmZlcmVkT2ZmZW5jZXMBAKkOBAAo+CBPZmZlbmNlcyBjb2xsZWN0ZWQgd2hpbGUgaW4gW2BPcGVyYXRpbmdNb2RlOjpCdWZmZXJlZGBdIG1vZGUuAHUBIFRoZXNlIGFyZSB0ZW1wb3JhcmlseSBzdG9yZWQgYW5kIHNlbnQgb25jZSB0aGUgcGFsbGV0IHN3aXRjaGVzIHRvIFtgT3BlcmF0aW5nTW9kZTo6QWN0aXZlYF0u+CBGb3IgZWFjaCBvZmZlbmRlciwgb25seSB0aGUgaGlnaGVzdCBgc2xhc2hfZnJhY3Rpb25gIGlzIGtlcHQuAKAgSW50ZXJuYWxseSBzdG9yZXMgYXMgYSBuZXN0ZWQgQlRyZWVNYXA69CBgc2Vzc2lvbl9pbmRleCAtPiAob2ZmZW5kZXIgLT4gKHJlcG9ydGVyLCBzbGFzaF9mcmFjdGlvbikpYC4AcQEgTm90ZTogV2hpbGUgdGhlIFtgcmNfY2xpZW50OjpPZmZlbmNlYF0gdHlwZSBpbmNsdWRlcyBhIGxpc3Qgb2YgcmVwb3J0ZXJzLCBpbiBwcmFjdGljZSB0aGVyZW0BIGlzIG9ubHkgb25lLiBJbiB0aGlzIHBhbGxldCwgd2UgYXNzdW1lIHRoaXMgaXMgdGhlIGNhc2UgYW5kIHN0b3JlIG9ubHkgdGhlIGZpcnN0IHJlcG9ydGVyLgGpBwEJCQABxQ5DAFBNdWx0aUJsb2NrTWlncmF0aW9ucwFQTXVsdGlCbG9ja01pZ3JhdGlvbnMIGEN1cnNvcgAAvQcEAAzYIFRoZSBjdXJyZW50bHkgYWN0aXZlIG1pZ3JhdGlvbiB0byBydW4gYW5kIGl0cyBjdXJzb3IuALwgYE5vbmVgIGluZGljYXRlcyB0aGF0IG5vIG1pZ3JhdGlvbiBpcyBydW5uaW5nLiBIaXN0b3JpYwABBAXRBwUBBAAQtCBTZXQgb2YgYWxsIHN1Y2Nlc3NmdWxseSBleGVjdXRlZCBtaWdyYXRpb25zLgBxASBUaGlzIGlzIHVzZWQgYXMgYmxhY2tsaXN0LCB0byBub3QgcmUtZXhlY3V0ZSBtaWdyYXRpb25zIHRoYXQgaGF2ZSBub3QgYmVlbiByZW1vdmVkIGZyb20gdGhlMQEgY29kZWJhc2UgeWV0LiBHb3Zlcm5hbmNlIGNhbiByZWd1bGFybHkgY2xlYXIgdGhpcyBvdXQgdmlhIGBjbGVhcl9oaXN0b3JpY2AuAbUHAREJCDBDdXJzb3JNYXhMZW4QEAAAAQAQpCBUaGUgbWF4aW1hbCBsZW5ndGggb2YgYW4gZW5jb2RlZCBjdXJzb3IuAGUBIEEgZ29vZCBkZWZhdWx0IG5lZWRzIHRvIHNlbGVjdGVkIHN1Y2ggdGhhdCBubyBtaWdyYXRpb24gd2lsbCBldmVyIGhhdmUgYSBjdXJzb3Igd2l0aCBNRUwJASBhYm92ZSB0aGlzIGxpbWl0LiBUaGlzIGlzIHN0YXRpY2FsbHkgY2hlY2tlZCBpbiBgaW50ZWdyaXR5X3Rlc3RgLkBJZGVudGlmaWVyTWF4TGVuEBAAAQAAELQgVGhlIG1heGltYWwgbGVuZ3RoIG9mIGFuIGVuY29kZWQgaWRlbnRpZmllci4AVQEgQSBnb29kIGRlZmF1bHQgbmVlZHMgdG8gc2VsZWN0ZWQgc3VjaCB0aGF0IG5vIG1pZ3JhdGlvbiB3aWxsIGV2ZXIgaGF2ZSBhbiBpZGVudGlmaWVyLQEgd2l0aCBNRUwgYWJvdmUgdGhpcyBsaW1pdC4gVGhpcyBpcyBzdGF0aWNhbGx5IGNoZWNrZWQgaW4gYGludGVncml0eV90ZXN0YC4ByQ5iACRYY21QYWxsZXQBJFhjbVBhbGxldDwwUXVlcnlDb3VudGVyAQAwIAAAAAAAAAAABIggVGhlIGxhdGVzdCBhdmFpbGFibGUgcXVlcnkgaW5kZXguHFF1ZXJpZXMAAQQCMM0OBAAEVCBUaGUgb25nb2luZyBxdWVyaWVzLihBc3NldFRyYXBzAQEEBjQQEAAAAAAQaCBUaGUgZXhpc3RpbmcgYXNzZXQgdHJhcHMuAGEBIEtleSBpcyB0aGUgYmxha2UyIDI1NiBoYXNoIG9mIChvcmlnaW4sIHZlcnNpb25lZCBgQXNzZXRzYCkgcGFpci4gVmFsdWUgaXMgdGhlIG51bWJlciBvZh0BIHRpbWVzIHRoaXMgcGFpciBoYXMgYmVlbiB0cmFwcGVkICh1c3VhbGx5IGp1c3QgMSBpZiBpdCBleGlzdHMgYXQgYWxsKS44U2FmZVhjbVZlcnNpb24AABAEAAhhASBEZWZhdWx0IHZlcnNpb24gdG8gZW5jb2RlIFhDTSB3aGVuIGxhdGVzdCB2ZXJzaW9uIG9mIGRlc3RpbmF0aW9uIGlzIHVua25vd24uIElmIGBOb25lYCw9ASB0aGVuIHRoZSBkZXN0aW5hdGlvbnMgd2hvc2UgWENNIHZlcnNpb24gaXMgdW5rbm93biBhcmUgY29uc2lkZXJlZCB1bnJlYWNoYWJsZS5AU3VwcG9ydGVkVmVyc2lvbgABCAUC4Q4QBAAE8CBUaGUgTGF0ZXN0IHZlcnNpb25zIHRoYXQgd2Uga25vdyB2YXJpb3VzIGxvY2F0aW9ucyBzdXBwb3J0LkBWZXJzaW9uTm90aWZpZXJzAAEIBQLhDjAEAAQFASBBbGwgbG9jYXRpb25zIHRoYXQgd2UgaGF2ZSByZXF1ZXN0ZWQgdmVyc2lvbiBub3RpZmljYXRpb25zIGZyb20uUFZlcnNpb25Ob3RpZnlUYXJnZXRzAAEIBQLhDuUOBAAIcQEgVGhlIHRhcmdldCBsb2NhdGlvbnMgdGhhdCBhcmUgc3Vic2NyaWJlZCB0byBvdXIgdmVyc2lvbiBjaGFuZ2VzLCBhcyB3ZWxsIGFzIHRoZSBtb3N0IHJlY2VudJQgb2Ygb3VyIHZlcnNpb25zIHdlIGluZm9ybWVkIHRoZW0gb2YuVFZlcnNpb25EaXNjb3ZlcnlRdWV1ZQEA6Q4EAAxlASBEZXN0aW5hdGlvbnMgd2hvc2UgbGF0ZXN0IFhDTSB2ZXJzaW9uIHdlIHdvdWxkIGxpa2UgdG8ga25vdy4gRHVwbGljYXRlcyBub3QgYWxsb3dlZCwgYW5kcQEgdGhlIGB1MzJgIGNvdW50ZXIgaXMgdGhlIG51bWJlciBvZiB0aW1lcyB0aGF0IGEgc2VuZCB0byB0aGUgZGVzdGluYXRpb24gaGFzIGJlZW4gYXR0ZW1wdGVkLIwgd2hpY2ggaXMgdXNlZCBhcyBhIHByaW9yaXRpemF0aW9uLkBDdXJyZW50TWlncmF0aW9uAAD1DgQABJwgVGhlIGN1cnJlbnQgbWlncmF0aW9uJ3Mgc3RhZ2UsIGlmIGFueS5UUmVtb3RlTG9ja2VkRnVuZ2libGVzAAEMBQIC+Q79DgQABPAgRnVuZ2libGUgYXNzZXRzIHdoaWNoIHdlIGtub3cgYXJlIGxvY2tlZCBvbiBhIHJlbW90ZSBjaGFpbi48TG9ja2VkRnVuZ2libGVzAAEEAgANDwQABOAgRnVuZ2libGUgYXNzZXRzIHdoaWNoIHdlIGtub3cgYXJlIGxvY2tlZCBvbiB0aGlzIGNoYWluLlRYY21FeGVjdXRpb25TdXNwZW5kZWQBACAEAAS0IEdsb2JhbCBzdXNwZW5zaW9uIHN0YXRlIG9mIHRoZSBYQ00gZXhlY3V0b3IuPFNob3VsZFJlY29yZFhjbQEAIAQAHFkBIFdoZXRoZXIgb3Igbm90IGluY29taW5nIFhDTXMgKGJvdGggZXhlY3V0ZWQgbG9jYWxseSBhbmQgcmVjZWl2ZWQpIHNob3VsZCBiZSByZWNvcmRlZC7EIE9ubHkgb25lIFhDTSBwcm9ncmFtIHdpbGwgYmUgcmVjb3JkZWQgYXQgYSB0aW1lLikBIFRoaXMgaXMgbWVhbnQgdG8gYmUgdXNlZCBpbiBydW50aW1lIEFQSXMsIGFuZCBpdCdzIGFkdmlzZWQgaXQgc3RheXMgZmFsc2UNASBmb3IgYWxsIG90aGVyIHVzZSBjYXNlcywgc28gYXMgdG8gbm90IGRlZ3JhZGUgcmVndWxhciBwZXJmb3JtYW5jZS4AWQEgT25seSByZWxldmFudCBpZiB0aGlzIHBhbGxldCBpcyBiZWluZyB1c2VkIGFzIHRoZSBbYHhjbV9leGVjdXRvcjo6dHJhaXRzOjpSZWNvcmRYY21gXcggaW1wbGVtZW50YXRpb24gaW4gdGhlIFhDTSBleGVjdXRvciBjb25maWd1cmF0aW9uLixSZWNvcmRlZFhjbQAAAQcEABhJASBJZiBbYFNob3VsZFJlY29yZFhjbWBdIGlzIHNldCB0byB0cnVlLCB0aGVuIHRoZSBsYXN0IFhDTSBwcm9ncmFtIGV4ZWN1dGVkIGxvY2FsbHlUIHdpbGwgYmUgc3RvcmVkIGhlcmUuKQEgUnVudGltZSBBUElzIGNhbiBmZXRjaCB0aGUgWENNIHRoYXQgd2FzIGV4ZWN1dGVkIGJ5IGFjY2Vzc2luZyB0aGlzIHZhbHVlLgBZASBPbmx5IHJlbGV2YW50IGlmIHRoaXMgcGFsbGV0IGlzIGJlaW5nIHVzZWQgYXMgdGhlIFtgeGNtX2V4ZWN1dG9yOjp0cmFpdHM6OlJlY29yZFhjbWBdyCBpbXBsZW1lbnRhdGlvbiBpbiB0aGUgWENNIGV4ZWN1dG9yIGNvbmZpZ3VyYXRpb24uREF1dGhvcml6ZWRBbGlhc2VzAAEEAlkFGQ8EAAxlASBNYXAgb2YgYXV0aG9yaXplZCBhbGlhc2VycyBvZiBsb2NhbCBvcmlnaW5zLiBFYWNoIGxvY2FsIGxvY2F0aW9uIGNhbiBhdXRob3JpemUgYSBsaXN0IG9mWQEgb3RoZXIgbG9jYXRpb25zIHRvIGFsaWFzIGludG8gaXQuIEVhY2ggYWxpYXNlciBpcyBvbmx5IHZhbGlkIHVudGlsIGl0cyBpbm5lciBgZXhwaXJ5YDggYmxvY2sgbnVtYmVyLgHdBwEVCRBEVW5pdmVyc2FsTG9jYXRpb269AowBCQDhQ/I4A6xQ6Pb45iaV0c6eTh1oqjbBzSz9FTQCE/NCPgSEIFRoaXMgY2hhaW4ncyBVbml2ZXJzYWwgTG9jYXRpb24uUEFkdmVydGlzZWRYY21WZXJzaW9uEBAFAAAACCUBIFRoZSBsYXRlc3Qgc3VwcG9ydGVkIHZlcnNpb24gdGhhdCB3ZSBhZHZlcnRpc2UuIEdlbmVyYWxseSBqdXN0IHNldCBpdCB0b4QgYHBhbGxldF94Y206OkN1cnJlbnRYY21WZXJzaW9uYC4oTWF4TG9ja2VycxAQCAAAAAQZASBUaGUgbWF4aW11bSBudW1iZXIgb2YgbG9jYWwgWENNIGxvY2tzIHRoYXQgYSBzaW5nbGUgYWNjb3VudCBtYXkgaGF2ZS5YTWF4UmVtb3RlTG9ja0NvbnN1bWVycxAQAAAAAAT8IFRoZSBtYXhpbXVtIG51bWJlciBvZiBjb25zdW1lcnMgYSBzaW5nbGUgcmVtb3RlIGxvY2sgbWF5IGhhdmUuATEPYwAwTWVzc2FnZVF1ZXVlATBNZXNzYWdlUXVldWUMMEJvb2tTdGF0ZUZvcgEBBAUhCDkPdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMwgVGhlIGluZGV4IG9mIHRoZSBmaXJzdCBhbmQgbGFzdCAobm9uLWVtcHR5KSBwYWdlcy4sU2VydmljZUhlYWQAACEIBAAEvCBUaGUgb3JpZ2luIGF0IHdoaWNoIHdlIHNob3VsZCBiZWdpbiBzZXJ2aWNpbmcuFFBhZ2VzAAEIBQVFD0kPBAAEiCBUaGUgbWFwIG9mIHBhZ2UgaW5kaWNlcyB0byBwYWdlcy4BHQgBJQkQIEhlYXBTaXplEBAAAAIAFD0BIFRoZSBzaXplIG9mIHRoZSBwYWdlOyB0aGlzIGltcGxpZXMgdGhlIG1heGltdW0gbWVzc2FnZSBzaXplIHdoaWNoIGNhbiBiZSBzZW50LgBZASBBIGdvb2QgdmFsdWUgZGVwZW5kcyBvbiB0aGUgZXhwZWN0ZWQgbWVzc2FnZSBzaXplcywgdGhlaXIgd2VpZ2h0cywgdGhlIHdlaWdodCB0aGF0IGlzXQEgYXZhaWxhYmxlIGZvciBwcm9jZXNzaW5nIHRoZW0gYW5kIHRoZSBtYXhpbWFsIG5lZWRlZCBtZXNzYWdlIHNpemUuIFRoZSBtYXhpbWFsIG1lc3NhZ2URASBzaXplIGlzIHNsaWdodGx5IGxvd2VyIHRoYW4gdGhpcyBhcyBkZWZpbmVkIGJ5IFtgTWF4TWVzc2FnZUxlbk9mYF0uIE1heFN0YWxlEBAwAAAADF0BIFRoZSBtYXhpbXVtIG51bWJlciBvZiBzdGFsZSBwYWdlcyAoaS5lLiBvZiBvdmVyd2VpZ2h0IG1lc3NhZ2VzKSBhbGxvd2VkIGJlZm9yZSBjdWxsaW5nUQEgY2FuIGhhcHBlbi4gT25jZSB0aGVyZSBhcmUgbW9yZSBzdGFsZSBwYWdlcyB0aGFuIHRoaXMsIHRoZW4gaGlzdG9yaWNhbCBwYWdlcyBtYXkgYmX8IGRyb3BwZWQsIGV2ZW4gaWYgdGhleSBjb250YWluIHVucHJvY2Vzc2VkIG92ZXJ3ZWlnaHQgbWVzc2FnZXMuNFNlcnZpY2VXZWlnaHRFB0ABBwCg2yFdEzMzMzMzMzMzGEEBIFRoZSBhbW91bnQgb2Ygd2VpZ2h0IChpZiBhbnkpIHdoaWNoIHNob3VsZCBiZSBwcm92aWRlZCB0byB0aGUgbWVzc2FnZSBxdWV1ZSBmb3KoIHNlcnZpY2luZyBlbnF1ZXVlZCBpdGVtcyBgb25faW5pdGlhbGl6ZWAuAPwgVGhpcyBtYXkgYmUgbGVnaXRpbWF0ZWx5IGBOb25lYCBpbiB0aGUgY2FzZSB0aGF0IHlvdSB3aWxsIGNhbGxdASBgU2VydmljZVF1ZXVlczo6c2VydmljZV9xdWV1ZXNgIG1hbnVhbGx5IG9yIHNldCBbYFNlbGY6OklkbGVNYXhTZXJ2aWNlV2VpZ2h0YF0gdG8gaGF2ZVQgaXQgcnVuIGluIGBvbl9pZGxlYC5QSWRsZU1heFNlcnZpY2VXZWlnaHRFB0ABBwCg2yFdEzMzMzMzMzMzFF0BIFRoZSBtYXhpbXVtIGFtb3VudCBvZiB3ZWlnaHQgKGlmIGFueSkgdG8gYmUgdXNlZCBmcm9tIHJlbWFpbmluZyB3ZWlnaHQgYG9uX2lkbGVgIHdoaWNoQQEgc2hvdWxkIGJlIHByb3ZpZGVkIHRvIHRoZSBtZXNzYWdlIHF1ZXVlIGZvciBzZXJ2aWNpbmcgZW5xdWV1ZWQgaXRlbXMgYG9uX2lkbGVgLj0BIFVzZWZ1bCBmb3IgcGFyYWNoYWlucyB0byBwcm9jZXNzIG1lc3NhZ2VzIGF0IHRoZSBzYW1lIGJsb2NrIHRoZXkgYXJlIHJlY2VpdmVkLgApASBJZiBgTm9uZWAsIGl0IHdpbGwgbm90IGNhbGwgYFNlcnZpY2VRdWV1ZXM6OnNlcnZpY2VfcXVldWVzYCBpbiBgb25faWRsZWAuAVEPZAAkQXNzZXRSYXRlASRBc3NldFJhdGUEWENvbnZlcnNpb25SYXRlVG9OYXRpdmUAAQQCAQUtCAQADB0BIE1hcHMgYW4gYXNzZXQgdG8gaXRzIGZpeGVkIHBvaW50IHJlcHJlc2VudGF0aW9uIGluIHRoZSBuYXRpdmUgYmFsYW5jZS4ATQEgRS5nLiBgbmF0aXZlX2Ftb3VudCA9IGFzc2V0X2Ftb3VudCAqIENvbnZlcnNpb25SYXRlVG9OYXRpdmU6OjxUPjo6Z2V0KGFzc2V0X2tpbmQpYAEpCAEtCQABVQ9lACxSb290VGVzdGluZwABMQgBMQkAAGYAGE1ldGFUeAABNQgBNQkAAVkPZwA8VmVyaWZ5U2lnbmF0dXJlAAAAAABoABRCZWVmeQEUQmVlZnkULEF1dGhvcml0aWVzAQBdDwQABHAgVGhlIGN1cnJlbnQgYXV0aG9yaXRpZXMgc2V0OFZhbGlkYXRvclNldElkAQAwIAAAAAAAAAAABHQgVGhlIGN1cnJlbnQgdmFsaWRhdG9yIHNldCBpZDxOZXh0QXV0aG9yaXRpZXMBAF0PBAAE7CBBdXRob3JpdGllcyBzZXQgc2NoZWR1bGVkIHRvIGJlIHVzZWQgd2l0aCB0aGUgbmV4dCBzZXNzaW9uMFNldElkU2Vzc2lvbgABBAUwEAQAKFEBIEEgbWFwcGluZyBmcm9tIEJFRUZZIHNldCBJRCB0byB0aGUgaW5kZXggb2YgdGhlICptb3N0IHJlY2VudCogc2Vzc2lvbiBmb3Igd2hpY2ggaXRzaCBtZW1iZXJzIHdlcmUgcmVzcG9uc2libGUuAEUBIFRoaXMgaXMgb25seSB1c2VkIGZvciB2YWxpZGF0aW5nIGVxdWl2b2NhdGlvbiBwcm9vZnMuIEFuIGVxdWl2b2NhdGlvbiBwcm9vZiBtdXN0TQEgY29udGFpbnMgYSBrZXktb3duZXJzaGlwIHByb29mIGZvciBhIGdpdmVuIHNlc3Npb24sIHRoZXJlZm9yZSB3ZSBuZWVkIGEgd2F5IHRvIHRpZT0BIHRvZ2V0aGVyIHNlc3Npb25zIGFuZCBCRUVGWSBzZXQgaWRzLCBpLmUuIHdlIG5lZWQgdG8gdmFsaWRhdGUgdGhhdCBhIHZhbGlkYXRvckEBIHdhcyB0aGUgb3duZXIgb2YgYSBnaXZlbiBrZXkgb24gYSBnaXZlbiBzZXNzaW9uLCBhbmQgd2hhdCB0aGUgYWN0aXZlIHNldCBJRCB3YXNUIGR1cmluZyB0aGF0IHNlc3Npb24uANwgVFdPWC1OT1RFOiBgVmFsaWRhdG9yU2V0SWRgIGlzIG5vdCB1bmRlciB1c2VyIGNvbnRyb2wuMEdlbmVzaXNCbG9jawEAnAQADNwgQmxvY2sgbnVtYmVyIHdoZXJlIEJFRUZZIGNvbnNlbnN1cyBpcyBlbmFibGVkL3N0YXJ0ZWQuaQEgQnkgY2hhbmdpbmcgdGhpcyAodGhyb3VnaCBwcml2aWxlZ2VkIGBzZXRfbmV3X2dlbmVzaXMoKWApLCBCRUVGWSBjb25zZW5zdXMgaXMgZWZmZWN0aXZlbHmsIHJlc3RhcnRlZCBmcm9tIHRoZSBuZXdseSBzZXQgYmxvY2sgbnVtYmVyLgFtCAAMOE1heEF1dGhvcml0aWVzEBCghgEABNQgVGhlIG1heGltdW0gbnVtYmVyIG9mIGF1dGhvcml0aWVzIHRoYXQgY2FuIGJlIGFkZGVkLjRNYXhOb21pbmF0b3JzEBBAAAAABNQgVGhlIG1heGltdW0gbnVtYmVyIG9mIG5vbWluYXRvcnMgZm9yIGVhY2ggdmFsaWRhdG9yLlhNYXhTZXRJZFNlc3Npb25FbnRyaWVzMCAMAAAAAAAAABg5ASBUaGUgbWF4aW11bSBudW1iZXIgb2YgZW50cmllcyB0byBrZWVwIGluIHRoZSBzZXQgaWQgdG8gc2Vzc2lvbiBpbmRleCBtYXBwaW5nLgAxASBTaW5jZSB0aGUgYFNldElkU2Vzc2lvbmAgbWFwIGlzIG9ubHkgdXNlZCBmb3IgdmFsaWRhdGluZyBlcXVpdm9jYXRpb25zIHRoaXMpASB2YWx1ZSBzaG91bGQgcmVsYXRlIHRvIHRoZSBib25kaW5nIGR1cmF0aW9uIG9mIHdoYXRldmVyIHN0YWtpbmcgc3lzdGVtIGlzNQEgYmVpbmcgdXNlZCAoaWYgYW55KS4gSWYgZXF1aXZvY2F0aW9uIGhhbmRsaW5nIGlzIG5vdCBlbmFibGVkIHRoZW4gdGhpcyB2YWx1ZTQgY2FuIGJlIHplcm8uAWUPyAAMTW1yAQxNbXIMIFJvb3RIYXNoAQA0gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFggTGF0ZXN0IE1NUiBSb290IGhhc2guOE51bWJlck9mTGVhdmVzAQAwIAAAAAAAAAAABLAgQ3VycmVudCBzaXplIG9mIHRoZSBNTVIgKG51bWJlciBvZiBsZWF2ZXMpLhROb2RlcwABBAYwNAQAEIAgSGFzaGVzIG9mIHRoZSBub2RlcyBpbiB0aGUgTU1SLgAtASBOb3RlIHRoaXMgY29sbGVjdGlvbiBvbmx5IGNvbnRhaW5zIE1NUiBwZWFrcywgdGhlIGlubmVyIG5vZGVzIChhbmQgbGVhdmVzKbwgYXJlIHBydW5lZCBhbmQgb25seSBzdG9yZWQgaW4gdGhlIE9mZmNoYWluIERCLgAAAADJADBCZWVmeU1tckxlYWYBMEJlZWZ5TW1yTGVhZghAQmVlZnlBdXRob3JpdGllcwEAaQ+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEoCBEZXRhaWxzIG9mIGN1cnJlbnQgQkVFRlkgYXV0aG9yaXR5IHNldC5QQmVlZnlOZXh0QXV0aG9yaXRpZXMBAGkPsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADJQgRGV0YWlscyBvZiBuZXh0IEJFRUZZIGF1dGhvcml0eSBzZXQuAFEBIFRoaXMgc3RvcmFnZSBlbnRyeSBpcyB1c2VkIGFzIGNhY2hlIGZvciBjYWxscyB0byBgdXBkYXRlX2JlZWZ5X25leHRfYXV0aG9yaXR5X3NldGAuAAAAAMoAQElkZW50aXR5TWlncmF0b3IAAaEIATkJAAD4AATtAakBlQNtDyw0QXV0aG9yaXplQ2FsbHEPBQFIQ2hlY2tOb25aZXJvU2VuZGVySQgFAUBDaGVja1NwZWNWZXJzaW9uTQgQOENoZWNrVHhWZXJzaW9uUQgQMENoZWNrR2VuZXNpc1UINDhDaGVja01vcnRhbGl0eVkINChDaGVja05vbmNlYQgFASxDaGVja1dlaWdodHUPBQFgQ2hhcmdlVHJhbnNhY3Rpb25QYXltZW50eQ8FAURDaGVja01ldGFkYXRhSGFzaGUIKQE0V2VpZ2h0UmVjbGFpbX0PBQEZAWAQQ29yZQwcdmVyc2lvbgBtCQSQIFJldHVybnMgdGhlIHZlcnNpb24gb2YgdGhlIHJ1bnRpbWUuNGV4ZWN1dGVfYmxvY2sEFGJsb2NrgQ8FAQRkIEV4ZWN1dGUgdGhlIGdpdmVuIGJsb2NrLkBpbml0aWFsaXplX2Jsb2NrBBhoZWFkZXLFAY0PBEEBIEluaXRpYWxpemUgYSBibG9jayB3aXRoIHRoZSBnaXZlbiBoZWFkZXIgYW5kIHJldHVybiB0aGUgcnVudGltZSBleGVjdXRpdmUgbW9kZS4EIQEgVGhlIGBDb3JlYCBydW50aW1lIGFwaSB0aGF0IGV2ZXJ5IFN1YnN0cmF0ZSBydW50aW1lIG5lZWRzIHRvIGltcGxlbWVudC4gTWV0YWRhdGEMIG1ldGFkYXRhAJEPBIwgUmV0dXJucyB0aGUgbWV0YWRhdGEgb2YgYSBydW50aW1lLkxtZXRhZGF0YV9hdF92ZXJzaW9uBBx2ZXJzaW9uEJUPEKQgUmV0dXJucyB0aGUgbWV0YWRhdGEgYXQgYSBnaXZlbiB2ZXJzaW9uLgAFASBJZiB0aGUgZ2l2ZW4gYHZlcnNpb25gIGlzbid0IHN1cHBvcnRlZCwgdGhpcyB3aWxsIHJldHVybiBgTm9uZWAudQEgVXNlIFtgU2VsZjo6bWV0YWRhdGFfdmVyc2lvbnNgXSB0byBmaW5kIG91dCBhYm91dCBzdXBwb3J0ZWQgbWV0YWRhdGEgdmVyc2lvbiBvZiB0aGUgcnVudGltZS5EbWV0YWRhdGFfdmVyc2lvbnMAkQEMpCBSZXR1cm5zIHRoZSBzdXBwb3J0ZWQgbWV0YWRhdGEgdmVyc2lvbnMuAMAgVGhpcyBjYW4gYmUgdXNlZCB0byBjYWxsIGBtZXRhZGF0YV9hdF92ZXJzaW9uYC4EAQEgVGhlIGBNZXRhZGF0YWAgYXBpIHRyYWl0IHRoYXQgcmV0dXJucyBtZXRhZGF0YSBmb3IgdGhlIHJ1bnRpbWUuTFJ1bnRpbWVWaWV3RnVuY3Rpb24EVGV4ZWN1dGVfdmlld19mdW5jdGlvbgggcXVlcnlfaWSZDxRpbnB1dDidDwR8IEV4ZWN1dGUgYSB2aWV3IGZ1bmN0aW9uIHF1ZXJ5LgSkIFJ1bnRpbWUgQVBJIGZvciBleGVjdXRpbmcgdmlldyBmdW5jdGlvbnMwQmxvY2tCdWlsZGVyEDxhcHBseV9leHRyaW5zaWMEJGV4dHJpbnNpY4UPpQ8QbCBBcHBseSB0aGUgZ2l2ZW4gZXh0cmluc2ljLgA5ASBSZXR1cm5zIGFuIGluY2x1c2lvbiBvdXRjb21lIHdoaWNoIHNwZWNpZmllcyBpZiB0aGlzIGV4dHJpbnNpYyBpcyBpbmNsdWRlZCBpbkwgdGhpcyBibG9jayBvciBub3QuOGZpbmFsaXplX2Jsb2NrAMUBBGggRmluaXNoIHRoZSBjdXJyZW50IGJsb2NrLkxpbmhlcmVudF9leHRyaW5zaWNzBCBpbmhlcmVudLUPiQ8EPQEgR2VuZXJhdGUgaW5oZXJlbnQgZXh0cmluc2ljcy4gVGhlIGluaGVyZW50IGRhdGEgd2lsbCB2YXJ5IGZyb20gY2hhaW4gdG8gY2hhaW4uPGNoZWNrX2luaGVyZW50cwgUYmxvY2uBDxBkYXRhtQ/FDwRVASBDaGVjayB0aGF0IHRoZSBpbmhlcmVudHMgYXJlIHZhbGlkLiBUaGUgaW5oZXJlbnQgZGF0YSB3aWxsIHZhcnkgZnJvbSBjaGFpbiB0byBjaGFpbi4EcQEgVGhlIGBCbG9ja0J1aWxkZXJgIGFwaSB0cmFpdCB0aGF0IHByb3ZpZGVzIHRoZSByZXF1aXJlZCBmdW5jdGlvbmFsaXR5IGZvciBidWlsZGluZyBhIGJsb2NrLlhUYWdnZWRUcmFuc2FjdGlvblF1ZXVlBFB2YWxpZGF0ZV90cmFuc2FjdGlvbgwYc291cmNlyQ8IdHiFDyhibG9ja19oYXNoNM0PJGggVmFsaWRhdGUgdGhlIHRyYW5zYWN0aW9uLgBlASBUaGlzIG1ldGhvZCBpcyBpbnZva2VkIGJ5IHRoZSB0cmFuc2FjdGlvbiBwb29sIHRvIGxlYXJuIGRldGFpbHMgYWJvdXQgZ2l2ZW4gdHJhbnNhY3Rpb24uRQEgVGhlIGltcGxlbWVudGF0aW9uIHNob3VsZCBtYWtlIHN1cmUgdG8gdmVyaWZ5IHRoZSBjb3JyZWN0bmVzcyBvZiB0aGUgdHJhbnNhY3Rpb25NASBhZ2FpbnN0IGN1cnJlbnQgc3RhdGUuIFRoZSBnaXZlbiBgYmxvY2tfaGFzaGAgY29ycmVzcG9uZHMgdG8gdGhlIGhhc2ggb2YgdGhlIGJsb2NrfCB0aGF0IGlzIHVzZWQgYXMgY3VycmVudCBzdGF0ZS4ARQEgTm90ZSB0aGF0IHRoaXMgY2FsbCBtYXkgYmUgcGVyZm9ybWVkIGJ5IHRoZSBwb29sIG11bHRpcGxlIHRpbWVzIGFuZCB0cmFuc2FjdGlvbnOkIG1pZ2h0IGJlIHZlcmlmaWVkIGluIGFueSBwb3NzaWJsZSBvcmRlci4ETQEgVGhlIGBUYWdnZWRUcmFuc2FjdGlvblF1ZXVlYCBhcGkgdHJhaXQgZm9yIGludGVyZmVyaW5nIHdpdGggdGhlIHRyYW5zYWN0aW9uIHF1ZXVlLkRPZmZjaGFpbldvcmtlckFwaQQ8b2ZmY2hhaW5fd29ya2VyBBhoZWFkZXLFAQUBBMggU3RhcnRzIHRoZSBvZmYtY2hhaW4gdGFzayBmb3IgZ2l2ZW4gYmxvY2sgaGVhZGVyLgRkIFRoZSBvZmZjaGFpbiB3b3JrZXIgYXBpLjRQYXJhY2hhaW5Ib3N0jCh2YWxpZGF0b3JzAPkMBHAgR2V0IHRoZSBjdXJyZW50IHZhbGlkYXRvcnMuQHZhbGlkYXRvcl9ncm91cHMA1Q8MZQEgUmV0dXJucyB0aGUgdmFsaWRhdG9yIGdyb3VwcyBhbmQgcm90YXRpb24gaW5mbyBsb2NhbGl6ZWQgYmFzZWQgb24gdGhlIGh5cG90aGV0aWNhbCBjaGlsZGEBICBvZiBhIGJsb2NrIHdob3NlIHN0YXRlICB0aGlzIGlzIGludm9rZWQgb24uIE5vdGUgdGhhdCBgbm93YCBpbiB0aGUgYEdyb3VwUm90YXRpb25JbmZvYNAgc2hvdWxkIGJlIHRoZSBzdWNjZXNzb3Igb2YgdGhlIG51bWJlciBvZiB0aGUgYmxvY2suSGF2YWlsYWJpbGl0eV9jb3JlcwDdDwg1ASBZaWVsZHMgaW5mb3JtYXRpb24gb24gYWxsIGF2YWlsYWJpbGl0eSBjb3JlcyBhcyByZWxldmFudCB0byB0aGUgY2hpbGQgYmxvY2suPQEgQ29yZXMgYXJlIGVpdGhlciBmcmVlIG9yIG9jY3VwaWVkLiBGcmVlIGNvcmVzIGNhbiBoYXZlIHBhcmFzIGFzc2lnbmVkIHRvIHRoZW0uZHBlcnNpc3RlZF92YWxpZGF0aW9uX2RhdGEIHHBhcmFfaWSxAihhc3N1bXB0aW9u+Q/9DxRpASBZaWVsZHMgdGhlIHBlcnNpc3RlZCB2YWxpZGF0aW9uIGRhdGEgZm9yIHRoZSBnaXZlbiBgUGFyYUlkYCBhbG9uZyB3aXRoIGFuIGFzc3VtcHRpb24gdGhhdNggc2hvdWxkIGJlIHVzZWQgaWYgdGhlIHBhcmEgY3VycmVudGx5IG9jY3VwaWVzIGEgY29yZS4ARQEgUmV0dXJucyBgTm9uZWAgaWYgZWl0aGVyIHRoZSBwYXJhIGlzIG5vdCByZWdpc3RlcmVkIG9yIHRoZSBhc3N1bXB0aW9uIGlzIGBGcmVlZGCYIGFuZCB0aGUgcGFyYSBhbHJlYWR5IG9jY3VwaWVzIGEgY29yZS5cYXNzdW1lZF92YWxpZGF0aW9uX2RhdGEIHHBhcmFfaWSxApxleHBlY3RlZF9wZXJzaXN0ZWRfdmFsaWRhdGlvbl9kYXRhX2hhc2g0BRAMaQEgUmV0dXJucyB0aGUgcGVyc2lzdGVkIHZhbGlkYXRpb24gZGF0YSBmb3IgdGhlIGdpdmVuIGBQYXJhSWRgIGFsb25nIHdpdGggdGhlIGNvcnJlc3BvbmRpbmd1ASB2YWxpZGF0aW9uIGNvZGUgaGFzaC4gSW5zdGVhZCBvZiBhY2NlcHRpbmcgYXNzdW1wdGlvbiBhYm91dCB0aGUgcGFyYSwgbWF0Y2hlcyB0aGUgdmFsaWRhdGlvbikBIGRhdGEgaGFzaCBhZ2FpbnN0IGFuIGV4cGVjdGVkIG9uZSBhbmQgeWllbGRzIGBOb25lYCBpZiB0aGV5J3JlIG5vdCBlcXVhbC5gY2hlY2tfdmFsaWRhdGlvbl9vdXRwdXRzCBxwYXJhX2lksQIcb3V0cHV0c8UFIAQVASBDaGVja3MgaWYgdGhlIGdpdmVuIHZhbGlkYXRpb24gb3V0cHV0cyBwYXNzIHRoZSBhY2NlcHRhbmNlIGNyaXRlcmlhLlxzZXNzaW9uX2luZGV4X2Zvcl9jaGlsZAAQDPAgUmV0dXJucyB0aGUgc2Vzc2lvbiBpbmRleCBleHBlY3RlZCBhdCBhIGNoaWxkIG9mIHRoZSBibG9jay4A0CBUaGlzIGNhbiBiZSB1c2VkIHRvIGluc3RhbnRpYXRlIGEgYFNpZ25pbmdDb250ZXh0YC48dmFsaWRhdGlvbl9jb2RlCBxwYXJhX2lksQIoYXNzdW1wdGlvbvkP2QUQVQEgRmV0Y2ggdGhlIHZhbGlkYXRpb24gY29kZSB1c2VkIGJ5IGEgcGFyYSwgbWFraW5nIHRoZSBnaXZlbiBgT2NjdXBpZWRDb3JlQXNzdW1wdGlvbmAuAEUBIFJldHVybnMgYE5vbmVgIGlmIGVpdGhlciB0aGUgcGFyYSBpcyBub3QgcmVnaXN0ZXJlZCBvciB0aGUgYXNzdW1wdGlvbiBpcyBgRnJlZWRgmCBhbmQgdGhlIHBhcmEgYWxyZWFkeSBvY2N1cGllcyBhIGNvcmUueGNhbmRpZGF0ZV9wZW5kaW5nX2F2YWlsYWJpbGl0eQQccGFyYV9pZLECDRAIXQEgR2V0IHRoZSByZWNlaXB0IG9mIGEgY2FuZGlkYXRlIHBlbmRpbmcgYXZhaWxhYmlsaXR5LiBUaGlzIHJldHVybnMgYFNvbWVgIGZvciBhbnkgcGFyYXMlASBhc3NpZ25lZCB0byBvY2N1cGllZCBjb3JlcyBpbiBgYXZhaWxhYmlsaXR5X2NvcmVzYCBhbmQgYE5vbmVgIG90aGVyd2lzZS5AY2FuZGlkYXRlX2V2ZW50cwAREAQtASBHZXQgYSB2ZWN0b3Igb2YgZXZlbnRzIGNvbmNlcm5pbmcgY2FuZGlkYXRlcyB0aGF0IG9jY3VycmVkIHdpdGhpbiBhIGJsb2NrLjBkbXFfY29udGVudHMEJHJlY2lwaWVudLECrQ0EPQEgR2V0IGFsbCB0aGUgcGVuZGluZyBpbmJvdW5kIG1lc3NhZ2VzIGluIHRoZSBkb3dud2FyZCBtZXNzYWdlIHF1ZXVlIGZvciBhIHBhcmEueGluYm91bmRfaHJtcF9jaGFubmVsc19jb250ZW50cwQkcmVjaXBpZW50sQIZEAhlASBHZXQgdGhlIGNvbnRlbnRzIG9mIGFsbCBjaGFubmVscyBhZGRyZXNzZWQgdG8gdGhlIGdpdmVuIHJlY2lwaWVudC4gQ2hhbm5lbHMgdGhhdCBoYXZlIG5vkCBtZXNzYWdlcyBpbiB0aGVtIGFyZSBhbHNvIGluY2x1ZGVkLlx2YWxpZGF0aW9uX2NvZGVfYnlfaGFzaAQQaGFzaMEF2QUEnCBHZXQgdGhlIHZhbGlkYXRpb24gY29kZSBmcm9tIGl0cyBoYXNoLjhvbl9jaGFpbl92b3RlcwAlEAQxASBTY3JhcGUgZGlzcHV0ZSByZWxldmFudCBmcm9tIG9uLWNoYWluLCBiYWNraW5nIHZvdGVzIGFuZCByZXNvbHZlZCBkaXNwdXRlcy4wc2Vzc2lvbl9pbmZvBBRpbmRleBApEAzcIEdldCB0aGUgc2Vzc2lvbiBpbmZvIGZvciB0aGUgZ2l2ZW4gc2Vzc2lvbiwgaWYgc3RvcmVkLgAZASBOT1RFOiBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgYXZhaWxhYmxlIHNpbmNlIHBhcmFjaGFpbiBob3N0IHZlcnNpb24gMi5oc3VibWl0X3B2Zl9jaGVja19zdGF0ZW1lbnQIEHN0bXQVBiRzaWduYXR1cmWpBQUBDAEBIFN1Ym1pdHMgYSBQVkYgcHJlLWNoZWNraW5nIHN0YXRlbWVudCBpbnRvIHRoZSB0cmFuc2FjdGlvbiBwb29sLgAZASBOT1RFOiBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgYXZhaWxhYmxlIHNpbmNlIHBhcmFjaGFpbiBob3N0IHZlcnNpb24gMi5UcHZmc19yZXF1aXJlX3ByZWNoZWNrAHUNDF0BIFJldHVybnMgY29kZSBoYXNoZXMgb2YgUFZGcyB0aGF0IHJlcXVpcmUgcHJlLWNoZWNraW5nIGJ5IHZhbGlkYXRvcnMgaW4gdGhlIGFjdGl2ZSBzZXQuABkBIE5PVEU6IFRoaXMgZnVuY3Rpb24gaXMgb25seSBhdmFpbGFibGUgc2luY2UgcGFyYWNoYWluIGhvc3QgdmVyc2lvbiAyLlB2YWxpZGF0aW9uX2NvZGVfaGFzaAgccGFyYV9pZLECKGFzc3VtcHRpb275Dy0QDIUBIEZldGNoIHRoZSBoYXNoIG9mIHRoZSB2YWxpZGF0aW9uIGNvZGUgdXNlZCBieSBhIHBhcmEsIG1ha2luZyB0aGUgZ2l2ZW4gYE9jY3VwaWVkQ29yZUFzc3VtcHRpb25gLgAZASBOT1RFOiBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgYXZhaWxhYmxlIHNpbmNlIHBhcmFjaGFpbiBob3N0IHZlcnNpb24gMi4gZGlzcHV0ZXMAMRAEeCBSZXR1cm5zIGFsbCBvbmNoYWluIGRpc3B1dGVzLlxzZXNzaW9uX2V4ZWN1dG9yX3BhcmFtcwQ0c2Vzc2lvbl9pbmRleBA5EAS4IFJldHVybnMgZXhlY3V0aW9uIHBhcmFtZXRlcnMgZm9yIHRoZSBzZXNzaW9uLkR1bmFwcGxpZWRfc2xhc2hlcwA9EAhZASBSZXR1cm5zIGEgbGlzdCBvZiB2YWxpZGF0b3JzIHRoYXQgbG9zdCBhIHBhc3Qgc2Vzc2lvbiBkaXNwdXRlIGFuZCBuZWVkIHRvIGJlIHNsYXNoZWQuGQEgTk9URTogVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGF2YWlsYWJsZSBzaW5jZSBwYXJhY2hhaW4gaG9zdCB2ZXJzaW9uIDUuTGtleV9vd25lcnNoaXBfcHJvb2YEMHZhbGlkYXRvcl9pZFkCTRAIzCBSZXR1cm5zIGEgbWVya2xlIHByb29mIG9mIGEgdmFsaWRhdG9yIHNlc3Npb24ga2V5LhkBIE5PVEU6IFRoaXMgZnVuY3Rpb24gaXMgb25seSBhdmFpbGFibGUgc2luY2UgcGFyYWNoYWluIGhvc3QgdmVyc2lvbiA1LmhzdWJtaXRfcmVwb3J0X2Rpc3B1dGVfbG9zdAg0ZGlzcHV0ZV9wcm9vZlUQTGtleV9vd25lcnNoaXBfcHJvb2ZREFkQDCkBIFN1Ym1pdCBhbiB1bnNpZ25lZCBleHRyaW5zaWMgdG8gc2xhc2ggdmFsaWRhdG9ycyB3aG8gbG9zdCBhIGRpc3B1dGUgYWJvdXR8IGEgY2FuZGlkYXRlIG9mIGEgcGFzdCBzZXNzaW9uLhkBIE5PVEU6IFRoaXMgZnVuY3Rpb24gaXMgb25seSBhdmFpbGFibGUgc2luY2UgcGFyYWNoYWluIGhvc3QgdmVyc2lvbiA1LlRtaW5pbXVtX2JhY2tpbmdfdm90ZXMAEAgNASBHZXQgdGhlIG1pbmltdW0gbnVtYmVyIG9mIGJhY2tpbmcgdm90ZXMgZm9yIGEgcGFyYWNoYWluIGNhbmRpZGF0ZS70IFRoaXMgaXMgYSBzdGFnaW5nIG1ldGhvZCEgRG8gbm90IHVzZSBvbiBwcm9kdWN0aW9uIHJ1bnRpbWVzIUhwYXJhX2JhY2tpbmdfc3RhdGUEgF9fcnVudGltZV9hcGlfZ2VuZXJhdGVkX25hbWVfMF9fsQJdEATkIFJldHVybnMgdGhlIHN0YXRlIG9mIHBhcmFjaGFpbiBiYWNraW5nIGZvciBhIGdpdmVuIHBhcmEuUGFzeW5jX2JhY2tpbmdfcGFyYW1zAGEFBGEBIFJldHVybnMgY2FuZGlkYXRlJ3MgYWNjZXB0YW5jZSBsaW1pdGF0aW9ucyBmb3IgYXN5bmNocm9ub3VzIGJhY2tpbmcgZm9yIGEgcmVsYXkgcGFyZW50LkxkaXNhYmxlZF92YWxpZGF0b3JzAPUMBPggUmV0dXJucyBhIGxpc3Qgb2YgYWxsIGRpc2FibGVkIHZhbGlkYXRvcnMgYXQgdGhlIGdpdmVuIGJsb2NrLjRub2RlX2ZlYXR1cmVzAJ0FCEwgR2V0IG5vZGUgZmVhdHVyZXMu9CBUaGlzIGlzIGEgc3RhZ2luZyBtZXRob2QhIERvIG5vdCB1c2Ugb24gcHJvZHVjdGlvbiBydW50aW1lcyFYYXBwcm92YWxfdm90aW5nX3BhcmFtcwB5BQSkIEFwcHJvdmFsIHZvdGluZyBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMsY2xhaW1fcXVldWUAjRAEMCBDbGFpbSBxdWV1ZXxjYW5kaWRhdGVzX3BlbmRpbmdfYXZhaWxhYmlsaXR5BBxwYXJhX2lksQKZEARgIEVsYXN0aWMgc2NhbGluZyBzdXBwb3J0aHZhbGlkYXRpb25fY29kZV9ib21iX2xpbWl0ABAEtCBSZXRyaWV2ZSB0aGUgbWF4aW11bSB1bmNvbXByZXNzZWQgY29kZSBzaXplLkxiYWNraW5nX2NvbnN0cmFpbnRzBBxwYXJhX2lksQKdEAgxASBSZXR1cm5zIHRoZSBjb25zdHJhaW50cyBvbiB0aGUgYWN0aW9ucyB0aGF0IGNhbiBiZSB0YWtlbiBieSBhIG5ldyBwYXJhY2hhaW4cIGJsb2NrLlBzY2hlZHVsaW5nX2xvb2thaGVhZAAQBIggUmV0cmlldmUgdGhlIHNjaGVkdWxpbmcgbG9va2FoZWFkIHBhcmFfaWRzAHkNBIQgUmV0cmlldmUgcGFyYWlkcyBhdCByZWxheSBwYXJlbnQE3CBUaGUgQVBJIGZvciBxdWVyeWluZyB0aGUgc3RhdGUgb2YgcGFyYWNoYWlucyBvbi1jaGFpbi4gQmVlZnlBcGkcNGJlZWZ5X2dlbmVzaXMAnAQFASBSZXR1cm4gdGhlIGJsb2NrIG51bWJlciB3aGVyZSBCRUVGWSBjb25zZW5zdXMgaXMgZW5hYmxlZC9zdGFydGVkNHZhbGlkYXRvcl9zZXQApRAEuCBSZXR1cm4gdGhlIGN1cnJlbnQgYWN0aXZlIEJFRUZZIHZhbGlkYXRvciBzZXS4c3VibWl0X3JlcG9ydF9kb3VibGVfdm90aW5nX3Vuc2lnbmVkX2V4dHJpbnNpYwhIZXF1aXZvY2F0aW9uX3Byb29mcQg8a2V5X293bmVyX3Byb29mrRBZECBFASBTdWJtaXRzIGFuIHVuc2lnbmVkIGV4dHJpbnNpYyB0byByZXBvcnQgYSBkb3VibGUgdm90aW5nIGVxdWl2b2NhdGlvbi4gVGhlIGNhbGxlcvwgbXVzdCBwcm92aWRlIHRoZSBkb3VibGUgdm90aW5nIHByb29mIGFuZCBhIGtleSBvd25lcnNoaXAgcHJvb2b8IChzaG91bGQgYmUgb2J0YWluZWQgdXNpbmcgYGdlbmVyYXRlX2tleV9vd25lcnNoaXBfcHJvb2ZgKS4gVGhlBQEgZXh0cmluc2ljIHdpbGwgYmUgdW5zaWduZWQgYW5kIHNob3VsZCBvbmx5IGJlIGFjY2VwdGVkIGZvciBsb2NhbBUBIGF1dGhvcnNoaXAgKG5vdCB0byBiZSBicm9hZGNhc3QgdG8gdGhlIG5ldHdvcmspLiBUaGlzIG1ldGhvZCByZXR1cm5zCQEgYE5vbmVgIHdoZW4gY3JlYXRpb24gb2YgdGhlIGV4dHJpbnNpYyBmYWlscywgZS5nLiBpZiBlcXVpdm9jYXRpb24FASByZXBvcnRpbmcgaXMgZGlzYWJsZWQgZm9yIHRoZSBnaXZlbiBydW50aW1lIChpLmUuIHRoaXMgbWV0aG9kIGlzBQEgaGFyZGNvZGVkIHRvIHJldHVybiBgTm9uZWApLiBPbmx5IHVzZWZ1bCBpbiBhbiBvZmZjaGFpbiBjb250ZXh0LrBzdWJtaXRfcmVwb3J0X2Zvcmtfdm90aW5nX3Vuc2lnbmVkX2V4dHJpbnNpYwhIZXF1aXZvY2F0aW9uX3Byb29msRA8a2V5X293bmVyX3Byb29mrRBZECA9ASBTdWJtaXRzIGFuIHVuc2lnbmVkIGV4dHJpbnNpYyB0byByZXBvcnQgYSBmb3JrIHZvdGluZyBlcXVpdm9jYXRpb24uIFRoZSBjYWxsZXJBASBtdXN0IHByb3ZpZGUgdGhlIGZvcmsgdm90aW5nIHByb29mICh0aGUgYW5jZXN0cnkgcHJvb2Ygc2hvdWxkIGJlIG9idGFpbmVkIHVzaW5nPQEgYGdlbmVyYXRlX2FuY2VzdHJ5X3Byb29mYCkgYW5kIGEga2V5IG93bmVyc2hpcCBwcm9vZiAoc2hvdWxkIGJlIG9idGFpbmVkIHVzaW5nQQEgYGdlbmVyYXRlX2tleV9vd25lcnNoaXBfcHJvb2ZgKS4gVGhlIGV4dHJpbnNpYyB3aWxsIGJlIHVuc2lnbmVkIGFuZCBzaG91bGQgb25seU0BIGJlIGFjY2VwdGVkIGZvciBsb2NhbCBhdXRob3JzaGlwIChub3QgdG8gYmUgYnJvYWRjYXN0IHRvIHRoZSBuZXR3b3JrKS4gVGhpcyBtZXRob2QpASByZXR1cm5zIGBOb25lYCB3aGVuIGNyZWF0aW9uIG9mIHRoZSBleHRyaW5zaWMgZmFpbHMsIGUuZy4gaWYgZXF1aXZvY2F0aW9uBQEgcmVwb3J0aW5nIGlzIGRpc2FibGVkIGZvciB0aGUgZ2l2ZW4gcnVudGltZSAoaS5lLiB0aGlzIG1ldGhvZCBpcwUBIGhhcmRjb2RlZCB0byByZXR1cm4gYE5vbmVgKS4gT25seSB1c2VmdWwgaW4gYW4gb2ZmY2hhaW4gY29udGV4dC7Qc3VibWl0X3JlcG9ydF9mdXR1cmVfYmxvY2tfdm90aW5nX3Vuc2lnbmVkX2V4dHJpbnNpYwhIZXF1aXZvY2F0aW9uX3Byb29mnQg8a2V5X293bmVyX3Byb29mrRBZECBdASBTdWJtaXRzIGFuIHVuc2lnbmVkIGV4dHJpbnNpYyB0byByZXBvcnQgYSBmdXR1cmUgYmxvY2sgdm90aW5nIGVxdWl2b2NhdGlvbi4gVGhlIGNhbGxlchUBIG11c3QgcHJvdmlkZSB0aGUgZnV0dXJlIGJsb2NrIHZvdGluZyBwcm9vZiBhbmQgYSBrZXkgb3duZXJzaGlwIHByb29m7CAoc2hvdWxkIGJlIG9idGFpbmVkIHVzaW5nIGBnZW5lcmF0ZV9rZXlfb3duZXJzaGlwX3Byb29mYCkuFQEgVGhlIGV4dHJpbnNpYyB3aWxsIGJlIHVuc2lnbmVkIGFuZCBzaG91bGQgb25seSBiZSBhY2NlcHRlZCBmb3IgbG9jYWwVASBhdXRob3JzaGlwIChub3QgdG8gYmUgYnJvYWRjYXN0IHRvIHRoZSBuZXR3b3JrKS4gVGhpcyBtZXRob2QgcmV0dXJucwkBIGBOb25lYCB3aGVuIGNyZWF0aW9uIG9mIHRoZSBleHRyaW5zaWMgZmFpbHMsIGUuZy4gaWYgZXF1aXZvY2F0aW9uBQEgcmVwb3J0aW5nIGlzIGRpc2FibGVkIGZvciB0aGUgZ2l2ZW4gcnVudGltZSAoaS5lLiB0aGlzIG1ldGhvZCBpcwUBIGhhcmRjb2RlZCB0byByZXR1cm4gYE5vbmVgKS4gT25seSB1c2VmdWwgaW4gYW4gb2ZmY2hhaW4gY29udGV4dC5wZ2VuZXJhdGVfa2V5X293bmVyc2hpcF9wcm9vZggYc2V0X2lkMDBhdXRob3JpdHlfaWRlArUQLAkBIEdlbmVyYXRlcyBhIHByb29mIG9mIGtleSBvd25lcnNoaXAgZm9yIHRoZSBnaXZlbiBhdXRob3JpdHkgaW4gdGhl/CBnaXZlbiBzZXQuIEFuIGV4YW1wbGUgdXNhZ2Ugb2YgdGhpcyBtb2R1bGUgaXMgY291cGxlZCB3aXRoIHRoZQUBIHNlc3Npb24gaGlzdG9yaWNhbCBtb2R1bGUgdG8gcHJvdmUgdGhhdCBhIGdpdmVuIGF1dGhvcml0eSBrZXkgaXMNASB0aWVkIHRvIGEgZ2l2ZW4gc3Rha2luZyBpZGVudGl0eSBkdXJpbmcgYSBzcGVjaWZpYyBzZXNzaW9uLiBQcm9vZnMRASBvZiBrZXkgb3duZXJzaGlwIGFyZSBuZWNlc3NhcnkgZm9yIHN1Ym1pdHRpbmcgZXF1aXZvY2F0aW9uIHJlcG9ydHMuEQEgTk9URTogZXZlbiB0aG91Z2ggdGhlIEFQSSB0YWtlcyBhIGBzZXRfaWRgIGFzIHBhcmFtZXRlciB0aGUgY3VycmVudAkBIGltcGxlbWVudGF0aW9ucyBpZ25vcmVzIHRoaXMgcGFyYW1ldGVyIGFuZCBpbnN0ZWFkIHJlbGllcyBvbiB0aGlzDQEgbWV0aG9kIGJlaW5nIGNhbGxlZCBhdCB0aGUgY29ycmVjdCBibG9jayBoZWlnaHQsIGkuZS4gYW55IHBvaW50IGF0FQEgd2hpY2ggdGhlIGdpdmVuIHNldCBpZCBpcyBsaXZlIG9uLWNoYWluLiBGdXR1cmUgaW1wbGVtZW50YXRpb25zIHdpbGwNASBpbnN0ZWFkIHVzZSBpbmRleGVkIGRhdGEgdGhyb3VnaCBhbiBvZmZjaGFpbiB3b3JrZXIsIG5vdCByZXF1aXJpbmd4IG9sZGVyIHN0YXRlcyB0byBiZSBhdmFpbGFibGUuXGdlbmVyYXRlX2FuY2VzdHJ5X3Byb29mCERwcmV2X2Jsb2NrX251bWJlchBcYmVzdF9rbm93bl9ibG9ja19udW1iZXKctRAIRQEgR2VuZXJhdGVzIGEgcHJvb2YgdGhhdCB0aGUgYHByZXZfYmxvY2tfbnVtYmVyYCBpcyBwYXJ0IG9mIHRoZSBjYW5vbmljYWwgY2hhaW4gYXRsIGBiZXN0X2tub3duX2Jsb2NrX251bWJlcmAuBIAgQVBJIG5lY2Vzc2FyeSBmb3IgQkVFRlkgdm90ZXJzLhhNbXJBcGkUIG1tcl9yb290ALkQBIwgUmV0dXJuIHRoZSBvbi1jaGFpbiBNTVIgcm9vdCBoYXNoLjhtbXJfbGVhZl9jb3VudADBEAS4IFJldHVybiB0aGUgbnVtYmVyIG9mIE1NUiBibG9ja3MgaW4gdGhlIGNoYWluLjhnZW5lcmF0ZV9wcm9vZgg0YmxvY2tfbnVtYmVyc5EBXGJlc3Rfa25vd25fYmxvY2tfbnVtYmVynMUQCGkBIEdlbmVyYXRlIE1NUiBwcm9vZiBmb3IgYSBzZXJpZXMgb2YgYmxvY2sgbnVtYmVycy4gSWYgYGJlc3Rfa25vd25fYmxvY2tfbnVtYmVyID0gU29tZShuKWAsRQEgdXNlIGhpc3RvcmljYWwgTU1SIHN0YXRlIGF0IGdpdmVuIGJsb2NrIGhlaWdodCBgbmAuIEVsc2UsIHVzZSBjdXJyZW50IE1NUiBzdGF0ZS4wdmVyaWZ5X3Byb29mCBhsZWF2ZXPNEBRwcm9vZtUQ2RAU9CBWZXJpZnkgTU1SIHByb29mIGFnYWluc3Qgb24tY2hhaW4gTU1SIGZvciBhIGJhdGNoIG9mIGxlYXZlcy4AcQEgTm90ZSB0aGlzIGZ1bmN0aW9uIHdpbGwgdXNlIG9uLWNoYWluIE1NUiByb290IGhhc2ggYW5kIGNoZWNrIGlmIHRoZSBwcm9vZiBtYXRjaGVzIHRoZSBoYXNoLm0BIE5vdGUsIHRoZSBsZWF2ZXMgc2hvdWxkIGJlIHNvcnRlZCBzdWNoIHRoYXQgY29ycmVzcG9uZGluZyBsZWF2ZXMgYW5kIGxlYWYgaW5kaWNlcyBoYXZlIHRoZZUBIHNhbWUgcG9zaXRpb24gaW4gYm90aCB0aGUgYGxlYXZlc2AgdmVjdG9yIGFuZCB0aGUgYGxlYWZfaW5kaWNlc2AgdmVjdG9yIGNvbnRhaW5lZCBpbiB0aGUgW0xlYWZQcm9vZl1YdmVyaWZ5X3Byb29mX3N0YXRlbGVzcwwQcm9vdDQYbGVhdmVzzRAUcHJvb2bVENkQHAEBIFZlcmlmeSBNTVIgcHJvb2YgYWdhaW5zdCBnaXZlbiByb290IGhhc2ggZm9yIGEgYmF0Y2ggb2YgbGVhdmVzLgD8IE5vdGUgdGhpcyBmdW5jdGlvbiBkb2VzIG5vdCByZXF1aXJlIGFueSBvbi1jaGFpbiBzdG9yYWdlIC0gdGhlvCBwcm9vZiBpcyB2ZXJpZmllZCBhZ2FpbnN0IGdpdmVuIE1NUiByb290IGhhc2guAG0BIE5vdGUsIHRoZSBsZWF2ZXMgc2hvdWxkIGJlIHNvcnRlZCBzdWNoIHRoYXQgY29ycmVzcG9uZGluZyBsZWF2ZXMgYW5kIGxlYWYgaW5kaWNlcyBoYXZlIHRoZZUBIHNhbWUgcG9zaXRpb24gaW4gYm90aCB0aGUgYGxlYXZlc2AgdmVjdG9yIGFuZCB0aGUgYGxlYWZfaW5kaWNlc2AgdmVjdG9yIGNvbnRhaW5lZCBpbiB0aGUgW0xlYWZQcm9vZl0EhCBBUEkgdG8gaW50ZXJhY3Qgd2l0aCBNTVIgcGFsbGV0LixCZWVmeU1tckFwaQhMYXV0aG9yaXR5X3NldF9wcm9vZgBpDwTcIFJldHVybiB0aGUgY3VycmVudGx5IGFjdGl2ZSBCRUVGWSBhdXRob3JpdHkgc2V0IHByb29mLmBuZXh0X2F1dGhvcml0eV9zZXRfcHJvb2YAaQ8EyCBSZXR1cm4gdGhlIG5leHQvcXVldWVkIEJFRUZZIGF1dGhvcml0eSBzZXQgcHJvb2YuBJAgQVBJIHVzZWZ1bCBmb3IgQkVFRlkgbGlnaHQgY2xpZW50cy4oR3JhbmRwYUFwaRBMZ3JhbmRwYV9hdXRob3JpdGllcwDwGD0BIEdldCB0aGUgY3VycmVudCBHUkFORFBBIGF1dGhvcml0aWVzIGFuZCB3ZWlnaHRzLiBUaGlzIHNob3VsZCBub3QgY2hhbmdlIGV4Y2VwdB0BIGZvciB3aGVuIGNoYW5nZXMgYXJlIHNjaGVkdWxlZCBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgZGVsYXkgaGFzIHBhc3NlZC4ANQEgV2hlbiBjYWxsZWQgYXQgYmxvY2sgQiwgaXQgd2lsbCByZXR1cm4gdGhlIHNldCBvZiBhdXRob3JpdGllcyB0aGF0IHNob3VsZCBiZT0BIHVzZWQgdG8gZmluYWxpemUgZGVzY2VuZGFudHMgb2YgdGhpcyBibG9jayAoQisxLCBCKzIsIC4uLikuIFRoZSBibG9jayBCIGl0c2VsZsAgaXMgZmluYWxpemVkIGJ5IHRoZSBhdXRob3JpdGllcyBmcm9tIGJsb2NrIEItMS60c3VibWl0X3JlcG9ydF9lcXVpdm9jYXRpb25fdW5zaWduZWRfZXh0cmluc2ljCEhlcXVpdm9jYXRpb25fcHJvb2ZxAjxrZXlfb3duZXJfcHJvb2atEFkQIBEBIFN1Ym1pdHMgYW4gdW5zaWduZWQgZXh0cmluc2ljIHRvIHJlcG9ydCBhbiBlcXVpdm9jYXRpb24uIFRoZSBjYWxsZXL4IG11c3QgcHJvdmlkZSB0aGUgZXF1aXZvY2F0aW9uIHByb29mIGFuZCBhIGtleSBvd25lcnNoaXAgcHJvb2b8IChzaG91bGQgYmUgb2J0YWluZWQgdXNpbmcgYGdlbmVyYXRlX2tleV9vd25lcnNoaXBfcHJvb2ZgKS4gVGhlBQEgZXh0cmluc2ljIHdpbGwgYmUgdW5zaWduZWQgYW5kIHNob3VsZCBvbmx5IGJlIGFjY2VwdGVkIGZvciBsb2NhbBUBIGF1dGhvcnNoaXAgKG5vdCB0byBiZSBicm9hZGNhc3QgdG8gdGhlIG5ldHdvcmspLiBUaGlzIG1ldGhvZCByZXR1cm5zCQEgYE5vbmVgIHdoZW4gY3JlYXRpb24gb2YgdGhlIGV4dHJpbnNpYyBmYWlscywgZS5nLiBpZiBlcXVpdm9jYXRpb24FASByZXBvcnRpbmcgaXMgZGlzYWJsZWQgZm9yIHRoZSBnaXZlbiBydW50aW1lIChpLmUuIHRoaXMgbWV0aG9kIGlzBQEgaGFyZGNvZGVkIHRvIHJldHVybiBgTm9uZWApLiBPbmx5IHVzZWZ1bCBpbiBhbiBvZmZjaGFpbiBjb250ZXh0LnBnZW5lcmF0ZV9rZXlfb3duZXJzaGlwX3Byb29mCBhzZXRfaWQwMGF1dGhvcml0eV9pZPi1ECwJASBHZW5lcmF0ZXMgYSBwcm9vZiBvZiBrZXkgb3duZXJzaGlwIGZvciB0aGUgZ2l2ZW4gYXV0aG9yaXR5IGluIHRoZfwgZ2l2ZW4gc2V0LiBBbiBleGFtcGxlIHVzYWdlIG9mIHRoaXMgbW9kdWxlIGlzIGNvdXBsZWQgd2l0aCB0aGUFASBzZXNzaW9uIGhpc3RvcmljYWwgbW9kdWxlIHRvIHByb3ZlIHRoYXQgYSBnaXZlbiBhdXRob3JpdHkga2V5IGlzDQEgdGllZCB0byBhIGdpdmVuIHN0YWtpbmcgaWRlbnRpdHkgZHVyaW5nIGEgc3BlY2lmaWMgc2Vzc2lvbi4gUHJvb2ZzEQEgb2Yga2V5IG93bmVyc2hpcCBhcmUgbmVjZXNzYXJ5IGZvciBzdWJtaXR0aW5nIGVxdWl2b2NhdGlvbiByZXBvcnRzLhEBIE5PVEU6IGV2ZW4gdGhvdWdoIHRoZSBBUEkgdGFrZXMgYSBgc2V0X2lkYCBhcyBwYXJhbWV0ZXIgdGhlIGN1cnJlbnT8IGltcGxlbWVudGF0aW9ucyBpZ25vcmUgdGhpcyBwYXJhbWV0ZXIgYW5kIGluc3RlYWQgcmVseSBvbiB0aGlzDQEgbWV0aG9kIGJlaW5nIGNhbGxlZCBhdCB0aGUgY29ycmVjdCBibG9jayBoZWlnaHQsIGkuZS4gYW55IHBvaW50IGF0FQEgd2hpY2ggdGhlIGdpdmVuIHNldCBpZCBpcyBsaXZlIG9uLWNoYWluLiBGdXR1cmUgaW1wbGVtZW50YXRpb25zIHdpbGwNASBpbnN0ZWFkIHVzZSBpbmRleGVkIGRhdGEgdGhyb3VnaCBhbiBvZmZjaGFpbiB3b3JrZXIsIG5vdCByZXF1aXJpbmd4IG9sZGVyIHN0YXRlcyB0byBiZSBhdmFpbGFibGUuOGN1cnJlbnRfc2V0X2lkADAEmCBHZXQgY3VycmVudCBHUkFORFBBIGF1dGhvcml0eSBzZXQgaWQuJAEBIEFQSXMgZm9yIGludGVncmF0aW5nIHRoZSBHUkFORFBBIGZpbmFsaXR5IGdhZGdldCBpbnRvIHJ1bnRpbWVzLsAgVGhpcyBzaG91bGQgYmUgaW1wbGVtZW50ZWQgb24gdGhlIHJ1bnRpbWUgc2lkZS4AFQEgVGhpcyBpcyBwcmltYXJpbHkgdXNlZCBmb3IgbmVnb3RpYXRpbmcgYXV0aG9yaXR5LXNldCBjaGFuZ2VzIGZvciB0aGUNASBnYWRnZXQuIEdSQU5EUEEgdXNlcyBhIHNpZ25hbGluZyBtb2RlbCBvZiBjaGFuZ2luZyBhdXRob3JpdHkgc2V0czoxASBjaGFuZ2VzIHNob3VsZCBiZSBzaWduYWxlZCB3aXRoIGEgZGVsYXkgb2YgTiBibG9ja3MsIGFuZCB0aGVuIGF1dG9tYXRpY2FsbHnkIGFwcGxpZWQgaW4gdGhlIHJ1bnRpbWUgYWZ0ZXIgdGhvc2UgTiBibG9ja3MgaGF2ZSBwYXNzZWQuAPwgVGhlIGNvbnNlbnN1cyBwcm90b2NvbCB3aWxsIGNvb3JkaW5hdGUgdGhlIGhhbmRvZmYgZXh0ZXJuYWxseS4cQmFiZUFwaRg0Y29uZmlndXJhdGlvbgDdEASMIFJldHVybiB0aGUgY29uZmlndXJhdGlvbiBmb3IgQkFCRS5MY3VycmVudF9lcG9jaF9zdGFydADRAQTEIFJldHVybnMgdGhlIHNsb3QgdGhhdCBzdGFydGVkIHRoZSBjdXJyZW50IGVwb2NoLjRjdXJyZW50X2Vwb2NoAOEQBMQgUmV0dXJucyBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhlIGN1cnJlbnQgZXBvY2guKG5leHRfZXBvY2gA4RAIAQEgUmV0dXJucyBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhlIG5leHQgZXBvY2ggKHdoaWNoIHdhcyBhbHJlYWR5XCBwcmV2aW91c2x5IGFubm91bmNlZCkucGdlbmVyYXRlX2tleV9vd25lcnNoaXBfcHJvb2YIEHNsb3TRATBhdXRob3JpdHlfaWTNAeUQLAkBIEdlbmVyYXRlcyBhIHByb29mIG9mIGtleSBvd25lcnNoaXAgZm9yIHRoZSBnaXZlbiBhdXRob3JpdHkgaW4gdGhlDQEgY3VycmVudCBlcG9jaC4gQW4gZXhhbXBsZSB1c2FnZSBvZiB0aGlzIG1vZHVsZSBpcyBjb3VwbGVkIHdpdGggdGhlBQEgc2Vzc2lvbiBoaXN0b3JpY2FsIG1vZHVsZSB0byBwcm92ZSB0aGF0IGEgZ2l2ZW4gYXV0aG9yaXR5IGtleSBpcw0BIHRpZWQgdG8gYSBnaXZlbiBzdGFraW5nIGlkZW50aXR5IGR1cmluZyBhIHNwZWNpZmljIHNlc3Npb24uIFByb29mcxEBIG9mIGtleSBvd25lcnNoaXAgYXJlIG5lY2Vzc2FyeSBmb3Igc3VibWl0dGluZyBlcXVpdm9jYXRpb24gcmVwb3J0cy4JASBOT1RFOiBldmVuIHRob3VnaCB0aGUgQVBJIHRha2VzIGEgYHNsb3RgIGFzIHBhcmFtZXRlciB0aGUgY3VycmVudAkBIGltcGxlbWVudGF0aW9ucyBpZ25vcmVzIHRoaXMgcGFyYW1ldGVyIGFuZCBpbnN0ZWFkIHJlbGllcyBvbiB0aGlzDQEgbWV0aG9kIGJlaW5nIGNhbGxlZCBhdCB0aGUgY29ycmVjdCBibG9jayBoZWlnaHQsIGkuZS4gYW55IHBvaW50IGF08CB3aGljaCB0aGUgZXBvY2ggZm9yIHRoZSBnaXZlbiBzbG90IGlzIGxpdmUgb24tY2hhaW4uIEZ1dHVyZQkBIGltcGxlbWVudGF0aW9ucyB3aWxsIGluc3RlYWQgdXNlIGluZGV4ZWQgZGF0YSB0aHJvdWdoIGFuIG9mZmNoYWlu0CB3b3JrZXIsIG5vdCByZXF1aXJpbmcgb2xkZXIgc3RhdGVzIHRvIGJlIGF2YWlsYWJsZS60c3VibWl0X3JlcG9ydF9lcXVpdm9jYXRpb25fdW5zaWduZWRfZXh0cmluc2ljCEhlcXVpdm9jYXRpb25fcHJvb2bBATxrZXlfb3duZXJfcHJvb2bpEFkQIBEBIFN1Ym1pdHMgYW4gdW5zaWduZWQgZXh0cmluc2ljIHRvIHJlcG9ydCBhbiBlcXVpdm9jYXRpb24uIFRoZSBjYWxsZXL4IG11c3QgcHJvdmlkZSB0aGUgZXF1aXZvY2F0aW9uIHByb29mIGFuZCBhIGtleSBvd25lcnNoaXAgcHJvb2b8IChzaG91bGQgYmUgb2J0YWluZWQgdXNpbmcgYGdlbmVyYXRlX2tleV9vd25lcnNoaXBfcHJvb2ZgKS4gVGhlBQEgZXh0cmluc2ljIHdpbGwgYmUgdW5zaWduZWQgYW5kIHNob3VsZCBvbmx5IGJlIGFjY2VwdGVkIGZvciBsb2NhbBUBIGF1dGhvcnNoaXAgKG5vdCB0byBiZSBicm9hZGNhc3QgdG8gdGhlIG5ldHdvcmspLiBUaGlzIG1ldGhvZCByZXR1cm5zCQEgYE5vbmVgIHdoZW4gY3JlYXRpb24gb2YgdGhlIGV4dHJpbnNpYyBmYWlscywgZS5nLiBpZiBlcXVpdm9jYXRpb24FASByZXBvcnRpbmcgaXMgZGlzYWJsZWQgZm9yIHRoZSBnaXZlbiBydW50aW1lIChpLmUuIHRoaXMgbWV0aG9kIGlzBQEgaGFyZGNvZGVkIHRvIHJldHVybiBgTm9uZWApLiBPbmx5IHVzZWZ1bCBpbiBhbiBvZmZjaGFpbiBjb250ZXh0LgS4IEFQSSBuZWNlc3NhcnkgZm9yIGJsb2NrIGF1dGhvcnNoaXAgd2l0aCBCQUJFLlRBdXRob3JpdHlEaXNjb3ZlcnlBcGkELGF1dGhvcml0aWVzAMEKBBkBIFJldHJpZXZlIGF1dGhvcml0eSBpZGVudGlmaWVycyBvZiB0aGUgY3VycmVudCBhbmQgbmV4dCBhdXRob3JpdHkgc2V0LhB0IFRoZSBhdXRob3JpdHkgZGlzY292ZXJ5IGFwaS4AUQEgVGhpcyBhcGkgaXMgdXNlZCBieSB0aGUgYGNsaWVudC9hdXRob3JpdHktZGlzY292ZXJ5YCBtb2R1bGUgdG8gcmV0cmlldmUgaWRlbnRpZmllcnOcIG9mIHRoZSBjdXJyZW50IGFuZCBuZXh0IGF1dGhvcml0eSBzZXQuLFNlc3Npb25LZXlzCFRnZW5lcmF0ZV9zZXNzaW9uX2tleXMEEHNlZWTZBzgcFQEgR2VuZXJhdGUgYSBzZXQgb2Ygc2Vzc2lvbiBrZXlzIHdpdGggb3B0aW9uYWxseSB1c2luZyB0aGUgZ2l2ZW4gc2VlZC4JASBUaGUga2V5cyBzaG91bGQgYmUgc3RvcmVkIHdpdGhpbiB0aGUga2V5c3RvcmUgZXhwb3NlZCB2aWEgcnVudGltZTwgZXh0ZXJuYWxpdGllcy4AsCBUaGUgc2VlZCBuZWVkcyB0byBiZSBhIHZhbGlkIGB1dGY4YCBzdHJpbmcuANAgUmV0dXJucyB0aGUgY29uY2F0ZW5hdGVkIFNDQUxFIGVuY29kZWQgcHVibGljIGtleXMuTGRlY29kZV9zZXNzaW9uX2tleXMEHGVuY29kZWQ47RAMmCBEZWNvZGUgdGhlIGdpdmVuIHB1YmxpYyBzZXNzaW9uIGtleXMuANwgUmV0dXJucyB0aGUgbGlzdCBvZiBwdWJsaWMgcmF3IHB1YmxpYyBrZXlzICsga2V5IHR5cGUuBGggU2Vzc2lvbiBrZXlzIHJ1bnRpbWUgYXBpLjxBY2NvdW50Tm9uY2VBcGkENGFjY291bnRfbm9uY2UEHGFjY291bnQAEATAIEdldCBjdXJyZW50IGFjY291bnQgbm9uY2Ugb2YgZ2l2ZW4gYEFjY291bnRJZGAuBIAgVGhlIEFQSSB0byBxdWVyeSBhY2NvdW50IG5vbmNlLlRUcmFuc2FjdGlvblBheW1lbnRBcGkQKHF1ZXJ5X2luZm8IDHV4dIUPDGxlbhD5EABEcXVlcnlfZmVlX2RldGFpbHMIDHV4dIUPDGxlbhD9EABMcXVlcnlfd2VpZ2h0X3RvX2ZlZQQYd2VpZ2h0KBgATHF1ZXJ5X2xlbmd0aF90b19mZWUEGGxlbmd0aBAYAABkVHJhbnNhY3Rpb25QYXltZW50Q2FsbEFwaRA8cXVlcnlfY2FsbF9pbmZvCBBjYWxsqQEMbGVuEPkQBEkBIFF1ZXJ5IGluZm9ybWF0aW9uIG9mIGEgZGlzcGF0Y2ggY2xhc3MsIHdlaWdodCwgYW5kIGZlZSBvZiBhIGdpdmVuIGVuY29kZWQgYENhbGxgLlhxdWVyeV9jYWxsX2ZlZV9kZXRhaWxzCBBjYWxsqQEMbGVuEP0QBLQgUXVlcnkgZmVlIGRldGFpbHMgb2YgYSBnaXZlbiBlbmNvZGVkIGBDYWxsYC5McXVlcnlfd2VpZ2h0X3RvX2ZlZQQYd2VpZ2h0KBgEAQEgUXVlcnkgdGhlIG91dHB1dCBvZiB0aGUgY3VycmVudCBgV2VpZ2h0VG9GZWVgIGdpdmVuIHNvbWUgaW5wdXQuTHF1ZXJ5X2xlbmd0aF90b19mZWUEGGxlbmd0aBAYBAEBIFF1ZXJ5IHRoZSBvdXRwdXQgb2YgdGhlIGN1cnJlbnQgYExlbmd0aFRvRmVlYCBnaXZlbiBzb21lIGlucHV0LgA0WGNtUGF5bWVudEFwaRB8cXVlcnlfYWNjZXB0YWJsZV9wYXltZW50X2Fzc2V0cwQseGNtX3ZlcnNpb24QCREUtCBSZXR1cm5zIGEgbGlzdCBvZiBhY2NlcHRhYmxlIHBheW1lbnQgYXNzZXRzLgAwICMgQXJndW1lbnRzAGggKiBgeGNtX3ZlcnNpb25gOiBWZXJzaW9uLkBxdWVyeV94Y21fd2VpZ2h0BBxtZXNzYWdlTQYVERSoIFJldHVybnMgYSB3ZWlnaHQgbmVlZGVkIHRvIGV4ZWN1dGUgYSBYQ00uADAgIyBBcmd1bWVudHMAdCAqIGBtZXNzYWdlYDogYFZlcnNpb25lZFhjbWAuZHF1ZXJ5X3dlaWdodF90b19hc3NldF9mZWUIGHdlaWdodCgUYXNzZXQVCBkRGOggQ29udmVydHMgYSB3ZWlnaHQgaW50byBhIGZlZSBmb3IgdGhlIHNwZWNpZmllZCBgQXNzZXRJZGAuADAgIyBBcmd1bWVudHMAiCAqIGB3ZWlnaHRgOiBjb252ZXJ0aWJsZSBgV2VpZ2h0YC58ICogYGFzc2V0YDogYFZlcnNpb25lZEFzc2V0SWRgLkxxdWVyeV9kZWxpdmVyeV9mZWVzCCxkZXN0aW5hdGlvblkFHG1lc3NhZ2VNBh0RIB0BIEdldCBkZWxpdmVyeSBmZWVzIGZvciBzZW5kaW5nIGEgc3BlY2lmaWMgYG1lc3NhZ2VgIHRvIGEgYGRlc3RpbmF0aW9uYC70IFRoZXNlIGFsd2F5cyBjb21lIGluIGEgc3BlY2lmaWMgYXNzZXQsIGRlZmluZWQgYnkgdGhlIGNoYWluLgAwICMgQXJndW1lbnRzgQEgKiBgbWVzc2FnZWA6IFRoZSBtZXNzYWdlIHRoYXQnbGwgYmUgc2VudCwgbmVjZXNzYXJ5IGJlY2F1c2UgbW9zdCBkZWxpdmVyeSBmZWVzIGFyZSBiYXNlZCBvbiB0aGVcICAgc2l6ZSBvZiB0aGUgbWVzc2FnZS5hASAqIGBkZXN0aW5hdGlvbmA6IFRoZSBkZXN0aW5hdGlvbiB0byBzZW5kIHRoZSBtZXNzYWdlIHRvLiBEaWZmZXJlbnQgZGVzdGluYXRpb25zIG1heSB1c2XAICAgZGlmZmVyZW50IHNlbmRlcnMgdGhhdCBjaGFyZ2UgZGlmZmVyZW50IGZlZXMuLHAgQSB0cmFpdCBvZiBYQ00gcGF5bWVudCBBUEkuAKggQVBJIHByb3ZpZGVzIGZ1bmN0aW9uYWxpdHkgZm9yIG9idGFpbmluZzoAxCAqIHRoZSB3ZWlnaHQgcmVxdWlyZWQgdG8gZXhlY3V0ZSBhbiBYQ00gbWVzc2FnZSwFASAqIGEgbGlzdCBvZiBhY2NlcHRhYmxlIGBBc3NldElkYHMgZm9yIG1lc3NhZ2UgZXhlY3V0aW9uIHBheW1lbnQsAQEgKiB0aGUgY29zdCBvZiB0aGUgd2VpZ2h0IGluIHRoZSBzcGVjaWZpZWQgYWNjZXB0YWJsZSBgQXNzZXRJZGAuoCAqIHRoZSBmZWVzIGZvciBhbiBYQ00gbWVzc2FnZSBkZWxpdmVyeS4A8CBUbyBkZXRlcm1pbmUgdGhlIGV4ZWN1dGlvbiB3ZWlnaHQgb2YgdGhlIGNhbGxzIHJlcXVpcmVkIGZvcnUBIFtgeGNtOjpsYXRlc3Q6Okluc3RydWN0aW9uOjpUcmFuc2FjdGBdIGluc3RydWN0aW9uLCBgVHJhbnNhY3Rpb25QYXltZW50Q2FsbEFwaWAgY2FuIGJlIHVzZWQuJERyeVJ1bkFwaQgwZHJ5X3J1bl9jYWxsDBhvcmlnaW6hAhBjYWxsqQFMcmVzdWx0X3hjbXNfdmVyc2lvbhAhEQREIERyeSBydW4gY2FsbCBWMi4sZHJ5X3J1bl94Y20IPG9yaWdpbl9sb2NhdGlvblkFDHhjbeUHQREEUCBEcnkgcnVuIFhDTSBwcm9ncmFtJLEBIEFQSSBmb3IgZHJ5LXJ1bm5pbmcgZXh0cmluc2ljcyBhbmQgWENNIHByb2dyYW1zIHRvIGdldCB0aGUgcHJvZ3JhbXMgdGhhdCBuZWVkIHRvIGJlIHBhc3NlZCB0byB0aGUgZmVlcyBBUEkuAIEBIEFsbCBjYWxscyByZXR1cm4gYSB2ZWN0b3Igb2YgdHVwbGVzIChsb2NhdGlvbiwgeGNtKSB3aGVyZSBlYWNoICJ4Y20iIGlzIGV4ZWN1dGVkIGluICJsb2NhdGlvbiIu5CBJZiB0aGVyZSdzIGxvY2FsIGV4ZWN1dGlvbiwgdGhlIGxvY2F0aW9uIHdpbGwgYmUgIkhlcmUiLh0BIFRoaXMgdmVjdG9yIGNhbiBiZSB1c2VkIHRvIGNhbGN1bGF0ZSBib3RoIGV4ZWN1dGlvbiBhbmQgZGVsaXZlcnkgZmVlcy4AmQEgQ2FsbHMgb3IgWENNcyBtaWdodCBmYWlsIHdoZW4gZXhlY3V0ZWQsIHRoaXMgZG9lc24ndCBtZWFuIHRoZSByZXN1bHQgb2YgdGhlc2UgY2FsbHMgd2lsbCBiZSBhbiBgRXJyYC5lASBJbiB0aG9zZSBjYXNlcywgdGhlcmUgbWlnaHQgc3RpbGwgYmUgYSB2YWxpZCByZXN1bHQsIHdpdGggdGhlIGV4ZWN1dGlvbiBlcnJvciBpbnNpZGUgaXQuZQEgVGhlIG9ubHkgcmVhc29ucyB3aHkgdGhlc2UgY2FsbHMgbWlnaHQgcmV0dXJuIGFuIGVycm9yIGFyZSBsaXN0ZWQgaW4gdGhlIFtgRXJyb3JgXSBlbnVtLlBMb2NhdGlvblRvQWNjb3VudEFwaQRAY29udmVydF9sb2NhdGlvbgQgbG9jYXRpb25ZBUkRBJAgQ29udmVydHMgYExvY2F0aW9uYCB0byBgQWNjb3VudElkYC4EDQEgQVBJIGZvciB1c2VmdWwgY29udmVyc2lvbnMgYmV0d2VlbiBYQ00gYExvY2F0aW9uYCBhbmQgYEFjY291bnRJZGAuSE5vbWluYXRpb25Qb29sc0FwaSg8cGVuZGluZ19yZXdhcmRzBAx3aG8AGAQ1ASBSZXR1cm5zIHRoZSBwZW5kaW5nIHJld2FyZHMgZm9yIHRoZSBtZW1iZXIgdGhhdCB0aGUgQWNjb3VudElkIHdhcyBnaXZlbiBmb3IuRHBvaW50c190b19iYWxhbmNlCBxwb29sX2lkEBhwb2ludHMYGAT0IFJldHVybnMgdGhlIGVxdWl2YWxlbnQgYmFsYW5jZSBvZiBgcG9pbnRzYCBmb3IgYSBnaXZlbiBwb29sLkRiYWxhbmNlX3RvX3BvaW50cwgccG9vbF9pZBAkbmV3X2Z1bmRzGBgE/CBSZXR1cm5zIHRoZSBlcXVpdmFsZW50IHBvaW50cyBvZiBgbmV3X2Z1bmRzYCBmb3IgYSBnaXZlbiBwb29sLkhwb29sX3BlbmRpbmdfc2xhc2gEHHBvb2xfaWQQGASwIFJldHVybnMgdGhlIHBlbmRpbmcgc2xhc2ggZm9yIGEgZ2l2ZW4gcG9vbC5QbWVtYmVyX3BlbmRpbmdfc2xhc2gEGG1lbWJlcgAYEMwgUmV0dXJucyB0aGUgcGVuZGluZyBzbGFzaCBmb3IgYSBnaXZlbiBwb29sIG1lbWJlci4ATQEgSWYgcGVuZGluZyBzbGFzaCBvZiB0aGUgbWVtYmVyIGV4Y2VlZHMgYEV4aXN0ZW50aWFsRGVwb3NpdGAsIGl0IGNhbiBiZSByZXBvcnRlZCBvbhwgY2hhaW4udHBvb2xfbmVlZHNfZGVsZWdhdGVfbWlncmF0aW9uBBxwb29sX2lkECAg5CBSZXR1cm5zIHRydWUgaWYgdGhlIHBvb2wgd2l0aCBgcG9vbF9pZGAgbmVlZHMgbWlncmF0aW9uLgBJASBUaGlzIGNhbiBoYXBwZW4gd2hlbiB0aGUgYHBhbGxldC1ub21pbmF0aW9uLXBvb2xzYCBoYXMgc3dpdGNoZWQgdG8gdXNpbmcgc3RyYXRlZ3lBASBbYERlbGVnYXRlU3Rha2VgXShwYWxsZXRfbm9taW5hdGlvbl9wb29sczo6YWRhcHRlcjo6RGVsZWdhdGVTdGFrZSkgYnV0IHRoZSBwb29s6CBzdGlsbCBoYXMgZnVuZHMgdGhhdCB3ZXJlIHN0YWtlZCB1c2luZyB0aGUgb2xkZXIgc3RyYXRlZ3kZASBbVHJhbnNmZXJTdGFrZV0ocGFsbGV0X25vbWluYXRpb25fcG9vbHM6OmFkYXB0ZXI6OlRyYW5zZmVyU3Rha2UpLiBVc2WJASBbYG1pZ3JhdGVfcG9vbF90b19kZWxlZ2F0ZV9zdGFrZWBdKHBhbGxldF9ub21pbmF0aW9uX3Bvb2xzOjpDYWxsOjptaWdyYXRlX3Bvb2xfdG9fZGVsZWdhdGVfc3Rha2UpVCB0byBtaWdyYXRlIHRoZSBwb29sLnxtZW1iZXJfbmVlZHNfZGVsZWdhdGVfbWlncmF0aW9uBBhtZW1iZXIAIBwpASBSZXR1cm5zIHRydWUgaWYgdGhlIGRlbGVnYXRlZCBmdW5kcyBvZiB0aGUgcG9vbCBgbWVtYmVyYCBuZWVkcyBtaWdyYXRpb24uANggT25jZSBhIHBvb2wgaGFzIHN1Y2Nlc3NmdWxseSBtaWdyYXRlZCB0byB0aGUgc3RyYXRlZ3lVASBbYERlbGVnYXRlU3Rha2VgXShwYWxsZXRfbm9taW5hdGlvbl9wb29sczo6YWRhcHRlcjo6RGVsZWdhdGVTdGFrZSksIHRoZSBmdW5kcyBvZiB0aGUZASBtZW1iZXIgY2FuIGJlIG1pZ3JhdGVkIGZyb20gcG9vbCBhY2NvdW50IHRvIHRoZSBtZW1iZXIncyBhY2NvdW50LiBVc2UpASBbYG1pZ3JhdGVfZGVsZWdhdGlvbmBdKHBhbGxldF9ub21pbmF0aW9uX3Bvb2xzOjpDYWxsOjptaWdyYXRlX2RlbGVnYXRpb24ppCB0byBtaWdyYXRlIHRoZSBmdW5kcyBvZiB0aGUgcG9vbCBtZW1iZXIuUG1lbWJlcl90b3RhbF9iYWxhbmNlBAx3aG8AGARlASBSZXR1cm5zIHRoZSB0b3RhbCBjb250cmlidXRpb24gb2YgYSBwb29sIG1lbWJlciBpbmNsdWRpbmcgYW55IGJhbGFuY2UgdGhhdCBpcyB1bmJvbmRpbmcuMHBvb2xfYmFsYW5jZQQccG9vbF9pZBAYBJwgVG90YWwgYmFsYW5jZSBjb250cmlidXRlZCB0byB0aGUgcG9vbC40cG9vbF9hY2NvdW50cwQccG9vbF9pZBARCwQtASBSZXR1cm5zIHRoZSBib25kZWQgYWNjb3VudCBhbmQgcmV3YXJkIGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBwb29sX2lkLgT4IFJ1bnRpbWUgYXBpIGZvciBhY2Nlc3NpbmcgaW5mb3JtYXRpb24gYWJvdXQgbm9taW5hdGlvbiBwb29scy4oU3Rha2luZ0FwaQxEbm9taW5hdGlvbnNfcXVvdGEEHGJhbGFuY2UYEAQRASBSZXR1cm5zIHRoZSBub21pbmF0aW9ucyBxdW90YSBmb3IgYSBub21pbmF0b3Igd2l0aCBhIGdpdmVuIGJhbGFuY2UuXGVyYXNfc3Rha2Vyc19wYWdlX2NvdW50CAxlcmEQHGFjY291bnQAEAQ5ASBSZXR1cm5zIHRoZSBwYWdlIGNvdW50IG9mIGV4cG9zdXJlcyBmb3IgYSB2YWxpZGF0b3IgYGFjY291bnRgIGluIGEgZ2l2ZW4gZXJhLjxwZW5kaW5nX3Jld2FyZHMIDGVyYRAcYWNjb3VudAAgBD0BIFJldHVybnMgdHJ1ZSBpZiB2YWxpZGF0b3IgYGFjY291bnRgIGhhcyBwYWdlcyB0byBiZSBjbGFpbWVkIGZvciB0aGUgZ2l2ZW4gZXJhLgA4R2VuZXNpc0J1aWxkZXIMLGJ1aWxkX3N0YXRlBBBqc29uOFERKGUBIEJ1aWxkIGBSdW50aW1lR2VuZXNpc0NvbmZpZ2AgZnJvbSBhIEpTT04gYmxvYiBub3QgdXNpbmcgYW55IGRlZmF1bHRzIGFuZCBzdG9yZSBpdCBpbiB0aGUkIHN0b3JhZ2UuACkBIEluIHRoZSBjYXNlIG9mIGEgRlJBTUUtYmFzZWQgcnVudGltZSwgdGhpcyBmdW5jdGlvbiBkZXNlcmlhbGl6ZXMgdGhlIGZ1bGxVASBgUnVudGltZUdlbmVzaXNDb25maWdgIGZyb20gdGhlIGdpdmVuIEpTT04gYmxvYiBhbmQgcHV0cyBpdCBpbnRvIHRoZSBzdG9yYWdlLiBJZiB0aGVVASBwcm92aWRlZCBKU09OIGJsb2IgaXMgaW5jb3JyZWN0IG9yIGluY29tcGxldGUgb3IgdGhlIGRlc2VyaWFsaXphdGlvbiBmYWlscywgYW4gZXJyb3I0IGlzIHJldHVybmVkLgBdASBQbGVhc2Ugbm90ZSB0aGF0IHByb3ZpZGVkIEpTT04gYmxvYiBtdXN0IGNvbnRhaW4gYWxsIGBSdW50aW1lR2VuZXNpc0NvbmZpZ2AgZmllbGRzLCBub1wgZGVmYXVsdHMgd2lsbCBiZSB1c2VkLihnZXRfcHJlc2V0BAhpZFUR2Qc4YQEgUmV0dXJucyBhIEpTT04gYmxvYiByZXByZXNlbnRhdGlvbiBvZiB0aGUgYnVpbHQtaW4gYFJ1bnRpbWVHZW5lc2lzQ29uZmlnYCBpZGVudGlmaWVkIGJ5GCBgaWRgLgBVASBJZiBgaWRgIGlzIGBOb25lYCB0aGUgZnVuY3Rpb24gc2hvdWxkIHJldHVybiBKU09OIGJsb2IgcmVwcmVzZW50YXRpb24gb2YgdGhlIGRlZmF1bHRJASBgUnVudGltZUdlbmVzaXNDb25maWdgIHN0cnVjdCBvZiB0aGUgcnVudGltZS4gSW1wbGVtZW50YXRpb24gbXVzdCBwcm92aWRlIGRlZmF1bHRgIGBSdW50aW1lR2VuZXNpc0NvbmZpZ2AuACEBIE90aGVyd2lzZSBmdW5jdGlvbiByZXR1cm5zIGEgSlNPTiByZXByZXNlbnRhdGlvbiBvZiB0aGUgYnVpbHQtaW4sIG5hbWVkUQEgYFJ1bnRpbWVHZW5lc2lzQ29uZmlnYCBwcmVzZXQgaWRlbnRpZmllZCBieSBgaWRgLCBvciBgTm9uZWAgaWYgc3VjaCBwcmVzZXQgZG9lcyBub3RhASBleGlzdC4gUmV0dXJuZWQgYFZlYzx1OD5gIGNvbnRhaW5zIGJ5dGVzIG9mIEpTT04gYmxvYiAocGF0Y2gpIHdoaWNoIGNvbXByaXNlcyBhIGxpc3Qgb2ZNASAocG90ZW50aWFsbHkgbmVzdGVkKSBrZXktdmFsdWUgcGFpcnMgdGhhdCBhcmUgaW50ZW5kZWQgZm9yIGN1c3RvbWl6aW5nIHRoZSBkZWZhdWx0ZQEgcnVudGltZSBnZW5lc2lzIGNvbmZpZy4gVGhlIHBhdGNoIHNoYWxsIGJlIG1lcmdlZCAocmZjNzM4Nikgd2l0aCB0aGUgSlNPTiByZXByZXNlbnRhdGlvbmEBIG9mIHRoZSBkZWZhdWx0IGBSdW50aW1lR2VuZXNpc0NvbmZpZ2AgdG8gY3JlYXRlIGEgY29tcHJlaGVuc2l2ZSBnZW5lc2lzIGNvbmZpZyB0aGF0IGNhboQgYmUgdXNlZCBpbiBgYnVpbGRfc3RhdGVgIG1ldGhvZC4wcHJlc2V0X25hbWVzAFkREFEBIFJldHVybnMgYSBsaXN0IG9mIGlkZW50aWZpZXJzIGZvciBhdmFpbGFibGUgYnVpbHRpbiBgUnVudGltZUdlbmVzaXNDb25maWdgIHByZXNldHMuAGEBIFRoZSBwcmVzZXRzIGZyb20gdGhlIGxpc3QgY2FuIGJlIHF1ZXJpZWQgd2l0aCBbYEdlbmVzaXNCdWlsZGVyOjpnZXRfcHJlc2V0YF0gbWV0aG9kLiBJZgEBIG5vIG5hbWVkIHByZXNldHMgYXJlIHByb3ZpZGVkIGJ5IHRoZSBydW50aW1lIHRoZSBsaXN0IGlzIGVtcHR5LgTwIEFQSSB0byBpbnRlcmFjdCB3aXRoIGBSdW50aW1lR2VuZXNpc0NvbmZpZ2AgZm9yIHRoZSBydW50aW1lPFRydXN0ZWRRdWVyeUFwaQhIaXNfdHJ1c3RlZF9yZXNlcnZlCBRhc3NldF0RIGxvY2F0aW9uWQVhERTwIFJldHVybnMgaWYgdGhlIGxvY2F0aW9uIGlzIGEgdHJ1c3RlZCByZXNlcnZlIGZvciB0aGUgYXNzZXQuADAgIyBBcmd1bWVudHN0ICogYGFzc2V0YDogYFZlcnNpb25lZEFzc2V0YC6MICogYGxvY2F0aW9uYDogYFZlcnNpb25lZExvY2F0aW9uYC5UaXNfdHJ1c3RlZF90ZWxlcG9ydGVyCBRhc3NldF0RIGxvY2F0aW9uWQVhERTgIFJldHVybnMgaWYgdGhlIGFzc2V0IGNhbiBiZSB0ZWxlcG9ydGVkIHRvIHRoZSBsb2NhdGlvbi4AMCAjIEFyZ3VtZW50c3QgKiBgYXNzZXRgOiBgVmVyc2lvbmVkQXNzZXRgLowgKiBgbG9jYXRpb25gOiBgVmVyc2lvbmVkTG9jYXRpb25gLgTsIEFQSSBmb3IgcXVlcnlpbmcgdHJ1c3RlZCByZXNlcnZlcyBhbmQgdHJ1c3RlZCB0ZWxlcG9ydGVycy6pAVRpEQA="; + wnd_metadata_default = binMeta4; + } +}); + +// .papi/descriptors/src/index.ts +var index_exports = {}; +__export(index_exports, { + ArithmeticError: () => ArithmeticError, + AssetRateEvent: () => AssetRateEvent, + BabeAllowedSlots: () => BabeAllowedSlots, + BabeDigestsNextConfigDescriptor: () => BabeDigestsNextConfigDescriptor, + BabeDigestsPreDigest: () => BabeDigestsPreDigest, + BagsListEvent: () => BagsListEvent, + BagsListListListError: () => BagsListListListError, + BalanceStatus: () => BalanceStatus, + BalancesAdjustmentDirection: () => BalancesAdjustmentDirection, + BalancesTypesReasons: () => BalancesTypesReasons, + BountiesBountyStatus: () => BountiesBountyStatus, + BountiesEvent: () => BountiesEvent, + BrokerCoretimeInterfaceCoreAssignment: () => BrokerCoretimeInterfaceCoreAssignment, + CandidateEvent: () => CandidateEvent, + ChildBountiesEvent: () => ChildBountiesEvent, + ChildBountyStatus: () => ChildBountyStatus, + ClaimsStatementKind: () => ClaimsStatementKind, + CommonAuctionsEvent: () => CommonAuctionsEvent, + CommonClaimsEvent: () => CommonClaimsEvent, + CommonCrowdloanLastContribution: () => CommonCrowdloanLastContribution, + CommonParasRegistrarEvent: () => CommonParasRegistrarEvent, + CommonSlotsEvent: () => CommonSlotsEvent, + ConvictionVotingEvent: () => ConvictionVotingEvent, + ConvictionVotingVoteAccountVote: () => ConvictionVotingVoteAccountVote, + ConvictionVotingVoteVoting: () => ConvictionVotingVoteVoting, + CoreState: () => CoreState, + DigestItem: () => DigestItem, + DispatchClass: () => DispatchClass, + DispatchRawOrigin: () => DispatchRawOrigin, + DotXcmVersionedAssetId: () => DotXcmVersionedAssetId, + DotXcmVersionedAssets: () => DotXcmVersionedAssets, + DotXcmVersionedLocation: () => DotXcmVersionedLocation, + DotXcmVersionedXcm: () => DotXcmVersionedXcm, + ElectionProviderMultiPhaseElectionCompute: () => ElectionProviderMultiPhaseElectionCompute, + ElectionProviderMultiPhaseEvent: () => ElectionProviderMultiPhaseEvent, + ElectionProviderMultiPhasePhase: () => ElectionProviderMultiPhasePhase, + ExtensionsCheckMortality: () => ExtensionsCheckMortality, + GovernanceOrigin: () => GovernanceOrigin, + GrandpaEquivocation: () => GrandpaEquivocation, + GrandpaEvent: () => GrandpaEvent, + GrandpaStoredState: () => GrandpaStoredState, + IdentityData: () => IdentityData, + IdentityJudgement: () => IdentityJudgement, + IndicesEvent: () => IndicesEvent, + InvalidDisputeStatementKind: () => InvalidDisputeStatementKind, + MmrPrimitivesError: () => MmrPrimitivesError, + MultiAddress: () => MultiAddress, + MultiSignature: () => MultiSignature, + MultiSigner: () => MultiSigner, + NominationPoolsBondExtra: () => NominationPoolsBondExtra, + NominationPoolsClaimPermission: () => NominationPoolsClaimPermission, + NominationPoolsCommissionClaimPermission: () => NominationPoolsCommissionClaimPermission, + NominationPoolsConfigOp: () => NominationPoolsConfigOp, + NominationPoolsEvent: () => NominationPoolsEvent, + NominationPoolsPalletFreezeReason: () => NominationPoolsPalletFreezeReason, + NominationPoolsPoolState: () => NominationPoolsPoolState, + OccupiedCoreAssumption: () => OccupiedCoreAssumption, + OffencesEvent: () => OffencesEvent, + ParachainsDisputeLocation: () => ParachainsDisputeLocation, + ParachainsDisputeResult: () => ParachainsDisputeResult, + ParachainsDisputesEvent: () => ParachainsDisputesEvent, + ParachainsHrmpEvent: () => ParachainsHrmpEvent, + ParachainsInclusionAggregateMessageOrigin: () => ParachainsInclusionAggregateMessageOrigin, + ParachainsInclusionEvent: () => ParachainsInclusionEvent, + ParachainsInclusionUmpQueueId: () => ParachainsInclusionUmpQueueId, + ParachainsOrigin: () => ParachainsOrigin, + ParachainsParasEvent: () => ParachainsParasEvent, + ParachainsParasParaLifecycle: () => ParachainsParasParaLifecycle, + Phase: () => Phase, + PolkadotPrimitivesV6DisputeStatement: () => PolkadotPrimitivesV6DisputeStatement, + PolkadotPrimitivesV6ExecutorParamsExecutorParam: () => PolkadotPrimitivesV6ExecutorParamsExecutorParam, + PolkadotPrimitivesV6PvfPrepKind: () => PolkadotPrimitivesV6PvfPrepKind, + PolkadotPrimitivesV6ValidDisputeStatementKind: () => PolkadotPrimitivesV6ValidDisputeStatementKind, + PolkadotRuntimeCommonAssignedSlotsEvent: () => PolkadotRuntimeCommonAssignedSlotsEvent, + PolkadotRuntimeCommonAssignedSlotsSlotLeasePeriodStart: () => PolkadotRuntimeCommonAssignedSlotsSlotLeasePeriodStart, + PolkadotRuntimeCommonIdentityMigratorEvent: () => PolkadotRuntimeCommonIdentityMigratorEvent, + PolkadotRuntimeOriginCaller: () => PolkadotRuntimeOriginCaller, + PolkadotRuntimeParachainsCoretimeEvent: () => PolkadotRuntimeParachainsCoretimeEvent, + PolkadotRuntimeParachainsSchedulerCommonAssignment: () => PolkadotRuntimeParachainsSchedulerCommonAssignment, + PolkadotRuntimeParachainsSchedulerPalletCoreOccupied: () => PolkadotRuntimeParachainsSchedulerPalletCoreOccupied, + PreimageEvent: () => PreimageEvent, + PreimageOldRequestStatus: () => PreimageOldRequestStatus, + PreimagePalletHoldReason: () => PreimagePalletHoldReason, + PreimageRequestStatus: () => PreimageRequestStatus, + PreimagesBounded: () => PreimagesBounded, + PvfExecKind: () => PvfExecKind, + RecoveryEvent: () => RecoveryEvent, + ReferendaTypesCurve: () => ReferendaTypesCurve, + RootTestingEvent: () => RootTestingEvent, + SessionEvent: () => SessionEvent, + SlashingOffenceKind: () => SlashingOffenceKind, + StakingEvent: () => StakingEvent, + StakingForcing: () => StakingForcing, + StakingPalletConfigOp: () => StakingPalletConfigOp, + StakingPalletConfigOpBig: () => StakingPalletConfigOpBig, + StakingRewardDestination: () => StakingRewardDestination, + TokenError: () => TokenError, + TraitsScheduleDispatchTime: () => TraitsScheduleDispatchTime, + TransactionPaymentEvent: () => TransactionPaymentEvent, + TransactionPaymentReleases: () => TransactionPaymentReleases, + TransactionValidityError: () => TransactionValidityError, + TransactionValidityInvalidTransaction: () => TransactionValidityInvalidTransaction, + TransactionValidityTransactionSource: () => TransactionValidityTransactionSource, + TransactionValidityUnknownTransaction: () => TransactionValidityUnknownTransaction, + TransactionalError: () => TransactionalError, + TreasuryPaymentState: () => TreasuryPaymentState, + UpgradeGoAhead: () => UpgradeGoAhead, + UpgradeRestriction: () => UpgradeRestriction, + ValidityAttestation: () => ValidityAttestation, + Version: () => Version, + VersionedLocatableAsset: () => VersionedLocatableAsset, + VestingEvent: () => VestingEvent, + VotingConviction: () => VotingConviction, + WestendRuntimeGovernanceOriginsPalletCustomOriginsOrigin: () => WestendRuntimeGovernanceOriginsPalletCustomOriginsOrigin, + WestendRuntimeRuntimeFreezeReason: () => WestendRuntimeRuntimeFreezeReason, + XcmPalletOrigin: () => XcmPalletOrigin, + XcmPalletQueryStatus: () => XcmPalletQueryStatus, + XcmPalletVersionMigrationStage: () => XcmPalletVersionMigrationStage, + XcmV2BodyId: () => XcmV2BodyId, + XcmV2Instruction: () => XcmV2Instruction, + XcmV2Junction: () => XcmV2Junction, + XcmV2JunctionBodyPart: () => XcmV2JunctionBodyPart, + XcmV2MultiAssetFilter: () => XcmV2MultiAssetFilter, + XcmV2MultiassetAssetId: () => XcmV2MultiassetAssetId, + XcmV2MultiassetAssetInstance: () => XcmV2MultiassetAssetInstance, + XcmV2MultiassetFungibility: () => XcmV2MultiassetFungibility, + XcmV2MultiassetWildFungibility: () => XcmV2MultiassetWildFungibility, + XcmV2MultiassetWildMultiAsset: () => XcmV2MultiassetWildMultiAsset, + XcmV2MultilocationJunctions: () => XcmV2MultilocationJunctions, + XcmV2NetworkId: () => XcmV2NetworkId, + XcmV2OriginKind: () => XcmV2OriginKind, + XcmV2Response: () => XcmV2Response, + XcmV2TraitsError: () => XcmV2TraitsError, + XcmV2WeightLimit: () => XcmV2WeightLimit, + XcmV3Instruction: () => XcmV3Instruction, + XcmV3Junction: () => XcmV3Junction, + XcmV3JunctionBodyId: () => XcmV3JunctionBodyId, + XcmV3JunctionNetworkId: () => XcmV3JunctionNetworkId, + XcmV3Junctions: () => XcmV3Junctions, + XcmV3MaybeErrorCode: () => XcmV3MaybeErrorCode, + XcmV3MultiassetAssetId: () => XcmV3MultiassetAssetId, + XcmV3MultiassetAssetInstance: () => XcmV3MultiassetAssetInstance, + XcmV3MultiassetFungibility: () => XcmV3MultiassetFungibility, + XcmV3MultiassetMultiAssetFilter: () => XcmV3MultiassetMultiAssetFilter, + XcmV3MultiassetWildMultiAsset: () => XcmV3MultiassetWildMultiAsset, + XcmV3Response: () => XcmV3Response, + XcmV3TraitsError: () => XcmV3TraitsError, + XcmV3WeightLimit: () => XcmV3WeightLimit, + XcmV4AssetAssetFilter: () => XcmV4AssetAssetFilter, + XcmV4AssetWildAsset: () => XcmV4AssetWildAsset, + XcmV4Instruction: () => XcmV4Instruction, + XcmV4Response: () => XcmV4Response, + XcmV4TraitsOutcome: () => XcmV4TraitsOutcome, + XcmV5AssetFilter: () => XcmV5AssetFilter, + XcmV5Instruction: () => XcmV5Instruction, + XcmV5Junction: () => XcmV5Junction, + XcmV5Junctions: () => XcmV5Junctions, + XcmV5NetworkId: () => XcmV5NetworkId, + XcmV5WildAsset: () => XcmV5WildAsset, + XcmVersionedAsset: () => XcmVersionedAsset, + XcmVersionedAssetId: () => XcmVersionedAssetId, + XcmVersionedAssets: () => XcmVersionedAssets, + XcmVersionedLocation: () => XcmVersionedLocation, + XcmVersionedResponse: () => XcmVersionedResponse, + XcmVersionedXcm: () => XcmVersionedXcm, + dot: () => dot_default, + ksm: () => ksm_default, + paseo: () => paseo_default, + wnd: () => wnd_default +}); +module.exports = __toCommonJS(index_exports); + +// .papi/descriptors/src/dot.ts +var toBinary = (() => { + const table = new Uint8Array(128); + for (let i = 0; i < 64; i++) table[i < 26 ? i + 65 : i < 52 ? i + 71 : i < 62 ? i - 4 : i * 4 - 205] = i; + return (base64) => { + const n = base64.length, bytes = new Uint8Array((n - Number(base64[n - 1] === "=") - Number(base64[n - 2] === "=")) * 3 / 4 | 0); + for (let i2 = 0, j = 0; i2 < n; ) { + const c0 = table[base64.charCodeAt(i2++)], c1 = table[base64.charCodeAt(i2++)]; + const c2 = table[base64.charCodeAt(i2++)], c3 = table[base64.charCodeAt(i2++)]; + bytes[j++] = c0 << 2 | c1 >> 4; + bytes[j++] = c1 << 4 | c2 >> 2; + bytes[j++] = c2 << 6 | c3; + } + return bytes; + }; +})(); +var descriptorValues = Promise.resolve().then(() => (init_descriptors(), descriptors_exports)).then((module2) => module2["Dot"]); +var metadataTypes = Promise.resolve().then(() => (init_metadataTypes(), metadataTypes_exports)).then( + (module2) => toBinary("default" in module2 ? module2.default : module2) +); +var asset = {}; +var getMetadata = () => Promise.resolve().then(() => (init_dot_metadata(), dot_metadata_exports)).then( + (module2) => toBinary("default" in module2 ? module2.default : module2) +); +var genesis = "0x91b171bb158e2d3848fa23a9f1c25182fb8e20313b2c1eb49219da7a70ce90c3"; +var _allDescriptors = { descriptors: descriptorValues, metadataTypes, asset, getMetadata, genesis }; +var dot_default = _allDescriptors; + +// .papi/descriptors/src/ksm.ts +var toBinary2 = (() => { + const table = new Uint8Array(128); + for (let i = 0; i < 64; i++) table[i < 26 ? i + 65 : i < 52 ? i + 71 : i < 62 ? i - 4 : i * 4 - 205] = i; + return (base64) => { + const n = base64.length, bytes = new Uint8Array((n - Number(base64[n - 1] === "=") - Number(base64[n - 2] === "=")) * 3 / 4 | 0); + for (let i2 = 0, j = 0; i2 < n; ) { + const c0 = table[base64.charCodeAt(i2++)], c1 = table[base64.charCodeAt(i2++)]; + const c2 = table[base64.charCodeAt(i2++)], c3 = table[base64.charCodeAt(i2++)]; + bytes[j++] = c0 << 2 | c1 >> 4; + bytes[j++] = c1 << 4 | c2 >> 2; + bytes[j++] = c2 << 6 | c3; + } + return bytes; + }; +})(); +var descriptorValues2 = Promise.resolve().then(() => (init_descriptors(), descriptors_exports)).then((module2) => module2["Ksm"]); +var metadataTypes2 = Promise.resolve().then(() => (init_metadataTypes(), metadataTypes_exports)).then( + (module2) => toBinary2("default" in module2 ? module2.default : module2) +); +var asset2 = {}; +var getMetadata2 = () => Promise.resolve().then(() => (init_ksm_metadata(), ksm_metadata_exports)).then( + (module2) => toBinary2("default" in module2 ? module2.default : module2) +); +var genesis2 = "0xb0a8d493285c2df73290dfb7e61f870f17b41801197a149ca93654499ea3dafe"; +var _allDescriptors2 = { descriptors: descriptorValues2, metadataTypes: metadataTypes2, asset: asset2, getMetadata: getMetadata2, genesis: genesis2 }; +var ksm_default = _allDescriptors2; + +// .papi/descriptors/src/paseo.ts +var toBinary3 = (() => { + const table = new Uint8Array(128); + for (let i = 0; i < 64; i++) table[i < 26 ? i + 65 : i < 52 ? i + 71 : i < 62 ? i - 4 : i * 4 - 205] = i; + return (base64) => { + const n = base64.length, bytes = new Uint8Array((n - Number(base64[n - 1] === "=") - Number(base64[n - 2] === "=")) * 3 / 4 | 0); + for (let i2 = 0, j = 0; i2 < n; ) { + const c0 = table[base64.charCodeAt(i2++)], c1 = table[base64.charCodeAt(i2++)]; + const c2 = table[base64.charCodeAt(i2++)], c3 = table[base64.charCodeAt(i2++)]; + bytes[j++] = c0 << 2 | c1 >> 4; + bytes[j++] = c1 << 4 | c2 >> 2; + bytes[j++] = c2 << 6 | c3; + } + return bytes; + }; +})(); +var descriptorValues3 = Promise.resolve().then(() => (init_descriptors(), descriptors_exports)).then((module2) => module2["Paseo"]); +var metadataTypes3 = Promise.resolve().then(() => (init_metadataTypes(), metadataTypes_exports)).then( + (module2) => toBinary3("default" in module2 ? module2.default : module2) +); +var asset3 = {}; +var getMetadata3 = () => Promise.resolve().then(() => (init_paseo_metadata(), paseo_metadata_exports)).then( + (module2) => toBinary3("default" in module2 ? module2.default : module2) +); +var genesis3 = "0x77afd6190f1554ad45fd0d31aee62aacc33c6db0ea801129acb813f913e0764f"; +var _allDescriptors3 = { descriptors: descriptorValues3, metadataTypes: metadataTypes3, asset: asset3, getMetadata: getMetadata3, genesis: genesis3 }; +var paseo_default = _allDescriptors3; + +// .papi/descriptors/src/wnd.ts +var toBinary4 = (() => { + const table = new Uint8Array(128); + for (let i = 0; i < 64; i++) table[i < 26 ? i + 65 : i < 52 ? i + 71 : i < 62 ? i - 4 : i * 4 - 205] = i; + return (base64) => { + const n = base64.length, bytes = new Uint8Array((n - Number(base64[n - 1] === "=") - Number(base64[n - 2] === "=")) * 3 / 4 | 0); + for (let i2 = 0, j = 0; i2 < n; ) { + const c0 = table[base64.charCodeAt(i2++)], c1 = table[base64.charCodeAt(i2++)]; + const c2 = table[base64.charCodeAt(i2++)], c3 = table[base64.charCodeAt(i2++)]; + bytes[j++] = c0 << 2 | c1 >> 4; + bytes[j++] = c1 << 4 | c2 >> 2; + bytes[j++] = c2 << 6 | c3; + } + return bytes; + }; +})(); +var descriptorValues4 = Promise.resolve().then(() => (init_descriptors(), descriptors_exports)).then((module2) => module2["Wnd"]); +var metadataTypes4 = Promise.resolve().then(() => (init_metadataTypes(), metadataTypes_exports)).then( + (module2) => toBinary4("default" in module2 ? module2.default : module2) +); +var asset4 = {}; +var getMetadata4 = () => Promise.resolve().then(() => (init_wnd_metadata(), wnd_metadata_exports)).then( + (module2) => toBinary4("default" in module2 ? module2.default : module2) +); +var genesis4 = "0xe143f23803ac50e8f6f8e62695d1ce9e4e1d68aa36c1cd2cfd15340213f3423e"; +var _allDescriptors4 = { descriptors: descriptorValues4, metadataTypes: metadataTypes4, asset: asset4, getMetadata: getMetadata4, genesis: genesis4 }; +var wnd_default = _allDescriptors4; + +// .papi/descriptors/src/common-types.ts +var import_polkadot_api = require("polkadot-api"); +var DigestItem = import_polkadot_api._Enum; +var Phase = import_polkadot_api._Enum; +var DispatchClass = import_polkadot_api._Enum; +var BagsListListListError = import_polkadot_api._Enum; +var TokenError = import_polkadot_api._Enum; +var ArithmeticError = import_polkadot_api._Enum; +var TransactionalError = import_polkadot_api._Enum; +var PreimageEvent = import_polkadot_api._Enum; +var IndicesEvent = import_polkadot_api._Enum; +var BalanceStatus = import_polkadot_api._Enum; +var TransactionPaymentEvent = import_polkadot_api._Enum; +var StakingEvent = import_polkadot_api._Enum; +var StakingRewardDestination = import_polkadot_api._Enum; +var StakingForcing = import_polkadot_api._Enum; +var OffencesEvent = import_polkadot_api._Enum; +var SessionEvent = import_polkadot_api._Enum; +var GrandpaEvent = import_polkadot_api._Enum; +var VersionedLocatableAsset = import_polkadot_api._Enum; +var XcmV3Junctions = import_polkadot_api._Enum; +var XcmV3Junction = import_polkadot_api._Enum; +var XcmV3JunctionNetworkId = import_polkadot_api._Enum; +var XcmV3JunctionBodyId = import_polkadot_api._Enum; +var XcmV2JunctionBodyPart = import_polkadot_api._Enum; +var XcmV3MultiassetAssetId = import_polkadot_api._Enum; +var DotXcmVersionedLocation = import_polkadot_api._Enum; +var XcmV2MultilocationJunctions = import_polkadot_api._Enum; +var XcmV2Junction = import_polkadot_api._Enum; +var XcmV2NetworkId = import_polkadot_api._Enum; +var XcmV2BodyId = import_polkadot_api._Enum; +var ConvictionVotingEvent = import_polkadot_api._Enum; +var PreimagesBounded = import_polkadot_api._Enum; +var CommonClaimsEvent = import_polkadot_api._Enum; +var VestingEvent = import_polkadot_api._Enum; +var BountiesEvent = import_polkadot_api._Enum; +var ChildBountiesEvent = import_polkadot_api._Enum; +var ElectionProviderMultiPhaseEvent = import_polkadot_api._Enum; +var ElectionProviderMultiPhaseElectionCompute = import_polkadot_api._Enum; +var ElectionProviderMultiPhasePhase = import_polkadot_api._Enum; +var BagsListEvent = import_polkadot_api._Enum; +var NominationPoolsEvent = import_polkadot_api._Enum; +var NominationPoolsPoolState = import_polkadot_api._Enum; +var NominationPoolsCommissionClaimPermission = import_polkadot_api._Enum; +var ParachainsInclusionEvent = import_polkadot_api._Enum; +var ParachainsParasEvent = import_polkadot_api._Enum; +var ParachainsHrmpEvent = import_polkadot_api._Enum; +var ParachainsDisputesEvent = import_polkadot_api._Enum; +var ParachainsDisputeLocation = import_polkadot_api._Enum; +var ParachainsDisputeResult = import_polkadot_api._Enum; +var CommonParasRegistrarEvent = import_polkadot_api._Enum; +var CommonSlotsEvent = import_polkadot_api._Enum; +var CommonAuctionsEvent = import_polkadot_api._Enum; +var PolkadotRuntimeParachainsCoretimeEvent = import_polkadot_api._Enum; +var XcmV4TraitsOutcome = import_polkadot_api._Enum; +var XcmV3TraitsError = import_polkadot_api._Enum; +var XcmV4Instruction = import_polkadot_api._Enum; +var XcmV3MultiassetFungibility = import_polkadot_api._Enum; +var XcmV3MultiassetAssetInstance = import_polkadot_api._Enum; +var XcmV4Response = import_polkadot_api._Enum; +var XcmV3MaybeErrorCode = import_polkadot_api._Enum; +var XcmV2OriginKind = import_polkadot_api._Enum; +var XcmV4AssetAssetFilter = import_polkadot_api._Enum; +var XcmV4AssetWildAsset = import_polkadot_api._Enum; +var XcmV2MultiassetWildFungibility = import_polkadot_api._Enum; +var XcmV3WeightLimit = import_polkadot_api._Enum; +var DotXcmVersionedAssets = import_polkadot_api._Enum; +var XcmV2MultiassetAssetId = import_polkadot_api._Enum; +var XcmV2MultiassetFungibility = import_polkadot_api._Enum; +var XcmV2MultiassetAssetInstance = import_polkadot_api._Enum; +var ParachainsInclusionAggregateMessageOrigin = import_polkadot_api._Enum; +var ParachainsInclusionUmpQueueId = import_polkadot_api._Enum; +var AssetRateEvent = import_polkadot_api._Enum; +var PolkadotRuntimeOriginCaller = import_polkadot_api._Enum; +var DispatchRawOrigin = import_polkadot_api._Enum; +var GovernanceOrigin = import_polkadot_api._Enum; +var ParachainsOrigin = import_polkadot_api._Enum; +var XcmPalletOrigin = import_polkadot_api._Enum; +var PreimageOldRequestStatus = import_polkadot_api._Enum; +var PreimageRequestStatus = import_polkadot_api._Enum; +var BabeDigestsNextConfigDescriptor = import_polkadot_api._Enum; +var BabeAllowedSlots = import_polkadot_api._Enum; +var BabeDigestsPreDigest = import_polkadot_api._Enum; +var BalancesTypesReasons = import_polkadot_api._Enum; +var PreimagePalletHoldReason = import_polkadot_api._Enum; +var WestendRuntimeRuntimeFreezeReason = import_polkadot_api._Enum; +var NominationPoolsPalletFreezeReason = import_polkadot_api._Enum; +var TransactionPaymentReleases = import_polkadot_api._Enum; +var GrandpaStoredState = import_polkadot_api._Enum; +var TreasuryPaymentState = import_polkadot_api._Enum; +var ConvictionVotingVoteVoting = import_polkadot_api._Enum; +var ConvictionVotingVoteAccountVote = import_polkadot_api._Enum; +var VotingConviction = import_polkadot_api._Enum; +var TraitsScheduleDispatchTime = import_polkadot_api._Enum; +var ClaimsStatementKind = import_polkadot_api._Enum; +var Version = import_polkadot_api._Enum; +var BountiesBountyStatus = import_polkadot_api._Enum; +var ChildBountyStatus = import_polkadot_api._Enum; +var NominationPoolsClaimPermission = import_polkadot_api._Enum; +var PolkadotPrimitivesV6ExecutorParamsExecutorParam = import_polkadot_api._Enum; +var PolkadotPrimitivesV6PvfPrepKind = import_polkadot_api._Enum; +var PvfExecKind = import_polkadot_api._Enum; +var ValidityAttestation = import_polkadot_api._Enum; +var PolkadotPrimitivesV6DisputeStatement = import_polkadot_api._Enum; +var PolkadotPrimitivesV6ValidDisputeStatementKind = import_polkadot_api._Enum; +var InvalidDisputeStatementKind = import_polkadot_api._Enum; +var PolkadotRuntimeParachainsSchedulerPalletCoreOccupied = import_polkadot_api._Enum; +var PolkadotRuntimeParachainsSchedulerCommonAssignment = import_polkadot_api._Enum; +var ParachainsParasParaLifecycle = import_polkadot_api._Enum; +var UpgradeGoAhead = import_polkadot_api._Enum; +var UpgradeRestriction = import_polkadot_api._Enum; +var SlashingOffenceKind = import_polkadot_api._Enum; +var BrokerCoretimeInterfaceCoreAssignment = import_polkadot_api._Enum; +var MultiSigner = import_polkadot_api._Enum; +var CommonCrowdloanLastContribution = import_polkadot_api._Enum; +var XcmPalletQueryStatus = import_polkadot_api._Enum; +var XcmVersionedResponse = import_polkadot_api._Enum; +var XcmV2Response = import_polkadot_api._Enum; +var XcmV2TraitsError = import_polkadot_api._Enum; +var XcmV3Response = import_polkadot_api._Enum; +var XcmPalletVersionMigrationStage = import_polkadot_api._Enum; +var DotXcmVersionedAssetId = import_polkadot_api._Enum; +var ReferendaTypesCurve = import_polkadot_api._Enum; +var MultiAddress = import_polkadot_api._Enum; +var BalancesAdjustmentDirection = import_polkadot_api._Enum; +var StakingPalletConfigOpBig = import_polkadot_api._Enum; +var StakingPalletConfigOp = import_polkadot_api._Enum; +var GrandpaEquivocation = import_polkadot_api._Enum; +var NominationPoolsBondExtra = import_polkadot_api._Enum; +var NominationPoolsConfigOp = import_polkadot_api._Enum; +var MultiSignature = import_polkadot_api._Enum; +var DotXcmVersionedXcm = import_polkadot_api._Enum; +var XcmV2Instruction = import_polkadot_api._Enum; +var XcmV2MultiAssetFilter = import_polkadot_api._Enum; +var XcmV2MultiassetWildMultiAsset = import_polkadot_api._Enum; +var XcmV2WeightLimit = import_polkadot_api._Enum; +var XcmV3Instruction = import_polkadot_api._Enum; +var XcmV3MultiassetMultiAssetFilter = import_polkadot_api._Enum; +var XcmV3MultiassetWildMultiAsset = import_polkadot_api._Enum; +var TransactionValidityError = import_polkadot_api._Enum; +var TransactionValidityInvalidTransaction = import_polkadot_api._Enum; +var TransactionValidityUnknownTransaction = import_polkadot_api._Enum; +var TransactionValidityTransactionSource = import_polkadot_api._Enum; +var CoreState = import_polkadot_api._Enum; +var OccupiedCoreAssumption = import_polkadot_api._Enum; +var CandidateEvent = import_polkadot_api._Enum; +var MmrPrimitivesError = import_polkadot_api._Enum; +var RecoveryEvent = import_polkadot_api._Enum; +var XcmV5Junctions = import_polkadot_api._Enum; +var XcmV5Junction = import_polkadot_api._Enum; +var XcmV5NetworkId = import_polkadot_api._Enum; +var XcmVersionedLocation = import_polkadot_api._Enum; +var PolkadotRuntimeCommonAssignedSlotsEvent = import_polkadot_api._Enum; +var XcmV5Instruction = import_polkadot_api._Enum; +var XcmV5AssetFilter = import_polkadot_api._Enum; +var XcmV5WildAsset = import_polkadot_api._Enum; +var XcmVersionedAssets = import_polkadot_api._Enum; +var RootTestingEvent = import_polkadot_api._Enum; +var PolkadotRuntimeCommonIdentityMigratorEvent = import_polkadot_api._Enum; +var IdentityJudgement = import_polkadot_api._Enum; +var IdentityData = import_polkadot_api._Enum; +var WestendRuntimeGovernanceOriginsPalletCustomOriginsOrigin = import_polkadot_api._Enum; +var XcmVersionedAssetId = import_polkadot_api._Enum; +var XcmVersionedXcm = import_polkadot_api._Enum; +var PolkadotRuntimeCommonAssignedSlotsSlotLeasePeriodStart = import_polkadot_api._Enum; +var ExtensionsCheckMortality = import_polkadot_api._Enum; +var XcmVersionedAsset = import_polkadot_api._Enum; diff --git a/examples/with-vite-papi/.papi/descriptors/dist/index.mjs b/examples/with-vite-papi/.papi/descriptors/dist/index.mjs new file mode 100644 index 0000000..3a3eeb8 --- /dev/null +++ b/examples/with-vite-papi/.papi/descriptors/dist/index.mjs @@ -0,0 +1,450 @@ +// .papi/descriptors/src/dot.ts +var toBinary = (() => { + const table = new Uint8Array(128); + for (let i = 0; i < 64; i++) table[i < 26 ? i + 65 : i < 52 ? i + 71 : i < 62 ? i - 4 : i * 4 - 205] = i; + return (base64) => { + const n = base64.length, bytes = new Uint8Array((n - Number(base64[n - 1] === "=") - Number(base64[n - 2] === "=")) * 3 / 4 | 0); + for (let i2 = 0, j = 0; i2 < n; ) { + const c0 = table[base64.charCodeAt(i2++)], c1 = table[base64.charCodeAt(i2++)]; + const c2 = table[base64.charCodeAt(i2++)], c3 = table[base64.charCodeAt(i2++)]; + bytes[j++] = c0 << 2 | c1 >> 4; + bytes[j++] = c1 << 4 | c2 >> 2; + bytes[j++] = c2 << 6 | c3; + } + return bytes; + }; +})(); +var descriptorValues = import("./descriptors-FVMV6DXM.mjs").then((module) => module["Dot"]); +var metadataTypes = import("./metadataTypes-HHY2W24Z.mjs").then( + (module) => toBinary("default" in module ? module.default : module) +); +var asset = {}; +var getMetadata = () => import("./dot_metadata-IBIC5C7M.mjs").then( + (module) => toBinary("default" in module ? module.default : module) +); +var genesis = "0x91b171bb158e2d3848fa23a9f1c25182fb8e20313b2c1eb49219da7a70ce90c3"; +var _allDescriptors = { descriptors: descriptorValues, metadataTypes, asset, getMetadata, genesis }; +var dot_default = _allDescriptors; + +// .papi/descriptors/src/ksm.ts +var toBinary2 = (() => { + const table = new Uint8Array(128); + for (let i = 0; i < 64; i++) table[i < 26 ? i + 65 : i < 52 ? i + 71 : i < 62 ? i - 4 : i * 4 - 205] = i; + return (base64) => { + const n = base64.length, bytes = new Uint8Array((n - Number(base64[n - 1] === "=") - Number(base64[n - 2] === "=")) * 3 / 4 | 0); + for (let i2 = 0, j = 0; i2 < n; ) { + const c0 = table[base64.charCodeAt(i2++)], c1 = table[base64.charCodeAt(i2++)]; + const c2 = table[base64.charCodeAt(i2++)], c3 = table[base64.charCodeAt(i2++)]; + bytes[j++] = c0 << 2 | c1 >> 4; + bytes[j++] = c1 << 4 | c2 >> 2; + bytes[j++] = c2 << 6 | c3; + } + return bytes; + }; +})(); +var descriptorValues2 = import("./descriptors-FVMV6DXM.mjs").then((module) => module["Ksm"]); +var metadataTypes2 = import("./metadataTypes-HHY2W24Z.mjs").then( + (module) => toBinary2("default" in module ? module.default : module) +); +var asset2 = {}; +var getMetadata2 = () => import("./ksm_metadata-I5XGB6KF.mjs").then( + (module) => toBinary2("default" in module ? module.default : module) +); +var genesis2 = "0xb0a8d493285c2df73290dfb7e61f870f17b41801197a149ca93654499ea3dafe"; +var _allDescriptors2 = { descriptors: descriptorValues2, metadataTypes: metadataTypes2, asset: asset2, getMetadata: getMetadata2, genesis: genesis2 }; +var ksm_default = _allDescriptors2; + +// .papi/descriptors/src/paseo.ts +var toBinary3 = (() => { + const table = new Uint8Array(128); + for (let i = 0; i < 64; i++) table[i < 26 ? i + 65 : i < 52 ? i + 71 : i < 62 ? i - 4 : i * 4 - 205] = i; + return (base64) => { + const n = base64.length, bytes = new Uint8Array((n - Number(base64[n - 1] === "=") - Number(base64[n - 2] === "=")) * 3 / 4 | 0); + for (let i2 = 0, j = 0; i2 < n; ) { + const c0 = table[base64.charCodeAt(i2++)], c1 = table[base64.charCodeAt(i2++)]; + const c2 = table[base64.charCodeAt(i2++)], c3 = table[base64.charCodeAt(i2++)]; + bytes[j++] = c0 << 2 | c1 >> 4; + bytes[j++] = c1 << 4 | c2 >> 2; + bytes[j++] = c2 << 6 | c3; + } + return bytes; + }; +})(); +var descriptorValues3 = import("./descriptors-FVMV6DXM.mjs").then((module) => module["Paseo"]); +var metadataTypes3 = import("./metadataTypes-HHY2W24Z.mjs").then( + (module) => toBinary3("default" in module ? module.default : module) +); +var asset3 = {}; +var getMetadata3 = () => import("./paseo_metadata-F2XWSS56.mjs").then( + (module) => toBinary3("default" in module ? module.default : module) +); +var genesis3 = "0x77afd6190f1554ad45fd0d31aee62aacc33c6db0ea801129acb813f913e0764f"; +var _allDescriptors3 = { descriptors: descriptorValues3, metadataTypes: metadataTypes3, asset: asset3, getMetadata: getMetadata3, genesis: genesis3 }; +var paseo_default = _allDescriptors3; + +// .papi/descriptors/src/wnd.ts +var toBinary4 = (() => { + const table = new Uint8Array(128); + for (let i = 0; i < 64; i++) table[i < 26 ? i + 65 : i < 52 ? i + 71 : i < 62 ? i - 4 : i * 4 - 205] = i; + return (base64) => { + const n = base64.length, bytes = new Uint8Array((n - Number(base64[n - 1] === "=") - Number(base64[n - 2] === "=")) * 3 / 4 | 0); + for (let i2 = 0, j = 0; i2 < n; ) { + const c0 = table[base64.charCodeAt(i2++)], c1 = table[base64.charCodeAt(i2++)]; + const c2 = table[base64.charCodeAt(i2++)], c3 = table[base64.charCodeAt(i2++)]; + bytes[j++] = c0 << 2 | c1 >> 4; + bytes[j++] = c1 << 4 | c2 >> 2; + bytes[j++] = c2 << 6 | c3; + } + return bytes; + }; +})(); +var descriptorValues4 = import("./descriptors-FVMV6DXM.mjs").then((module) => module["Wnd"]); +var metadataTypes4 = import("./metadataTypes-HHY2W24Z.mjs").then( + (module) => toBinary4("default" in module ? module.default : module) +); +var asset4 = {}; +var getMetadata4 = () => import("./wnd_metadata-VUPVFDP2.mjs").then( + (module) => toBinary4("default" in module ? module.default : module) +); +var genesis4 = "0xe143f23803ac50e8f6f8e62695d1ce9e4e1d68aa36c1cd2cfd15340213f3423e"; +var _allDescriptors4 = { descriptors: descriptorValues4, metadataTypes: metadataTypes4, asset: asset4, getMetadata: getMetadata4, genesis: genesis4 }; +var wnd_default = _allDescriptors4; + +// .papi/descriptors/src/common-types.ts +import { _Enum } from "polkadot-api"; +var DigestItem = _Enum; +var Phase = _Enum; +var DispatchClass = _Enum; +var BagsListListListError = _Enum; +var TokenError = _Enum; +var ArithmeticError = _Enum; +var TransactionalError = _Enum; +var PreimageEvent = _Enum; +var IndicesEvent = _Enum; +var BalanceStatus = _Enum; +var TransactionPaymentEvent = _Enum; +var StakingEvent = _Enum; +var StakingRewardDestination = _Enum; +var StakingForcing = _Enum; +var OffencesEvent = _Enum; +var SessionEvent = _Enum; +var GrandpaEvent = _Enum; +var VersionedLocatableAsset = _Enum; +var XcmV3Junctions = _Enum; +var XcmV3Junction = _Enum; +var XcmV3JunctionNetworkId = _Enum; +var XcmV3JunctionBodyId = _Enum; +var XcmV2JunctionBodyPart = _Enum; +var XcmV3MultiassetAssetId = _Enum; +var DotXcmVersionedLocation = _Enum; +var XcmV2MultilocationJunctions = _Enum; +var XcmV2Junction = _Enum; +var XcmV2NetworkId = _Enum; +var XcmV2BodyId = _Enum; +var ConvictionVotingEvent = _Enum; +var PreimagesBounded = _Enum; +var CommonClaimsEvent = _Enum; +var VestingEvent = _Enum; +var BountiesEvent = _Enum; +var ChildBountiesEvent = _Enum; +var ElectionProviderMultiPhaseEvent = _Enum; +var ElectionProviderMultiPhaseElectionCompute = _Enum; +var ElectionProviderMultiPhasePhase = _Enum; +var BagsListEvent = _Enum; +var NominationPoolsEvent = _Enum; +var NominationPoolsPoolState = _Enum; +var NominationPoolsCommissionClaimPermission = _Enum; +var ParachainsInclusionEvent = _Enum; +var ParachainsParasEvent = _Enum; +var ParachainsHrmpEvent = _Enum; +var ParachainsDisputesEvent = _Enum; +var ParachainsDisputeLocation = _Enum; +var ParachainsDisputeResult = _Enum; +var CommonParasRegistrarEvent = _Enum; +var CommonSlotsEvent = _Enum; +var CommonAuctionsEvent = _Enum; +var PolkadotRuntimeParachainsCoretimeEvent = _Enum; +var XcmV4TraitsOutcome = _Enum; +var XcmV3TraitsError = _Enum; +var XcmV4Instruction = _Enum; +var XcmV3MultiassetFungibility = _Enum; +var XcmV3MultiassetAssetInstance = _Enum; +var XcmV4Response = _Enum; +var XcmV3MaybeErrorCode = _Enum; +var XcmV2OriginKind = _Enum; +var XcmV4AssetAssetFilter = _Enum; +var XcmV4AssetWildAsset = _Enum; +var XcmV2MultiassetWildFungibility = _Enum; +var XcmV3WeightLimit = _Enum; +var DotXcmVersionedAssets = _Enum; +var XcmV2MultiassetAssetId = _Enum; +var XcmV2MultiassetFungibility = _Enum; +var XcmV2MultiassetAssetInstance = _Enum; +var ParachainsInclusionAggregateMessageOrigin = _Enum; +var ParachainsInclusionUmpQueueId = _Enum; +var AssetRateEvent = _Enum; +var PolkadotRuntimeOriginCaller = _Enum; +var DispatchRawOrigin = _Enum; +var GovernanceOrigin = _Enum; +var ParachainsOrigin = _Enum; +var XcmPalletOrigin = _Enum; +var PreimageOldRequestStatus = _Enum; +var PreimageRequestStatus = _Enum; +var BabeDigestsNextConfigDescriptor = _Enum; +var BabeAllowedSlots = _Enum; +var BabeDigestsPreDigest = _Enum; +var BalancesTypesReasons = _Enum; +var PreimagePalletHoldReason = _Enum; +var WestendRuntimeRuntimeFreezeReason = _Enum; +var NominationPoolsPalletFreezeReason = _Enum; +var TransactionPaymentReleases = _Enum; +var GrandpaStoredState = _Enum; +var TreasuryPaymentState = _Enum; +var ConvictionVotingVoteVoting = _Enum; +var ConvictionVotingVoteAccountVote = _Enum; +var VotingConviction = _Enum; +var TraitsScheduleDispatchTime = _Enum; +var ClaimsStatementKind = _Enum; +var Version = _Enum; +var BountiesBountyStatus = _Enum; +var ChildBountyStatus = _Enum; +var NominationPoolsClaimPermission = _Enum; +var PolkadotPrimitivesV6ExecutorParamsExecutorParam = _Enum; +var PolkadotPrimitivesV6PvfPrepKind = _Enum; +var PvfExecKind = _Enum; +var ValidityAttestation = _Enum; +var PolkadotPrimitivesV6DisputeStatement = _Enum; +var PolkadotPrimitivesV6ValidDisputeStatementKind = _Enum; +var InvalidDisputeStatementKind = _Enum; +var PolkadotRuntimeParachainsSchedulerPalletCoreOccupied = _Enum; +var PolkadotRuntimeParachainsSchedulerCommonAssignment = _Enum; +var ParachainsParasParaLifecycle = _Enum; +var UpgradeGoAhead = _Enum; +var UpgradeRestriction = _Enum; +var SlashingOffenceKind = _Enum; +var BrokerCoretimeInterfaceCoreAssignment = _Enum; +var MultiSigner = _Enum; +var CommonCrowdloanLastContribution = _Enum; +var XcmPalletQueryStatus = _Enum; +var XcmVersionedResponse = _Enum; +var XcmV2Response = _Enum; +var XcmV2TraitsError = _Enum; +var XcmV3Response = _Enum; +var XcmPalletVersionMigrationStage = _Enum; +var DotXcmVersionedAssetId = _Enum; +var ReferendaTypesCurve = _Enum; +var MultiAddress = _Enum; +var BalancesAdjustmentDirection = _Enum; +var StakingPalletConfigOpBig = _Enum; +var StakingPalletConfigOp = _Enum; +var GrandpaEquivocation = _Enum; +var NominationPoolsBondExtra = _Enum; +var NominationPoolsConfigOp = _Enum; +var MultiSignature = _Enum; +var DotXcmVersionedXcm = _Enum; +var XcmV2Instruction = _Enum; +var XcmV2MultiAssetFilter = _Enum; +var XcmV2MultiassetWildMultiAsset = _Enum; +var XcmV2WeightLimit = _Enum; +var XcmV3Instruction = _Enum; +var XcmV3MultiassetMultiAssetFilter = _Enum; +var XcmV3MultiassetWildMultiAsset = _Enum; +var TransactionValidityError = _Enum; +var TransactionValidityInvalidTransaction = _Enum; +var TransactionValidityUnknownTransaction = _Enum; +var TransactionValidityTransactionSource = _Enum; +var CoreState = _Enum; +var OccupiedCoreAssumption = _Enum; +var CandidateEvent = _Enum; +var MmrPrimitivesError = _Enum; +var RecoveryEvent = _Enum; +var XcmV5Junctions = _Enum; +var XcmV5Junction = _Enum; +var XcmV5NetworkId = _Enum; +var XcmVersionedLocation = _Enum; +var PolkadotRuntimeCommonAssignedSlotsEvent = _Enum; +var XcmV5Instruction = _Enum; +var XcmV5AssetFilter = _Enum; +var XcmV5WildAsset = _Enum; +var XcmVersionedAssets = _Enum; +var RootTestingEvent = _Enum; +var PolkadotRuntimeCommonIdentityMigratorEvent = _Enum; +var IdentityJudgement = _Enum; +var IdentityData = _Enum; +var WestendRuntimeGovernanceOriginsPalletCustomOriginsOrigin = _Enum; +var XcmVersionedAssetId = _Enum; +var XcmVersionedXcm = _Enum; +var PolkadotRuntimeCommonAssignedSlotsSlotLeasePeriodStart = _Enum; +var ExtensionsCheckMortality = _Enum; +var XcmVersionedAsset = _Enum; +export { + ArithmeticError, + AssetRateEvent, + BabeAllowedSlots, + BabeDigestsNextConfigDescriptor, + BabeDigestsPreDigest, + BagsListEvent, + BagsListListListError, + BalanceStatus, + BalancesAdjustmentDirection, + BalancesTypesReasons, + BountiesBountyStatus, + BountiesEvent, + BrokerCoretimeInterfaceCoreAssignment, + CandidateEvent, + ChildBountiesEvent, + ChildBountyStatus, + ClaimsStatementKind, + CommonAuctionsEvent, + CommonClaimsEvent, + CommonCrowdloanLastContribution, + CommonParasRegistrarEvent, + CommonSlotsEvent, + ConvictionVotingEvent, + ConvictionVotingVoteAccountVote, + ConvictionVotingVoteVoting, + CoreState, + DigestItem, + DispatchClass, + DispatchRawOrigin, + DotXcmVersionedAssetId, + DotXcmVersionedAssets, + DotXcmVersionedLocation, + DotXcmVersionedXcm, + ElectionProviderMultiPhaseElectionCompute, + ElectionProviderMultiPhaseEvent, + ElectionProviderMultiPhasePhase, + ExtensionsCheckMortality, + GovernanceOrigin, + GrandpaEquivocation, + GrandpaEvent, + GrandpaStoredState, + IdentityData, + IdentityJudgement, + IndicesEvent, + InvalidDisputeStatementKind, + MmrPrimitivesError, + MultiAddress, + MultiSignature, + MultiSigner, + NominationPoolsBondExtra, + NominationPoolsClaimPermission, + NominationPoolsCommissionClaimPermission, + NominationPoolsConfigOp, + NominationPoolsEvent, + NominationPoolsPalletFreezeReason, + NominationPoolsPoolState, + OccupiedCoreAssumption, + OffencesEvent, + ParachainsDisputeLocation, + ParachainsDisputeResult, + ParachainsDisputesEvent, + ParachainsHrmpEvent, + ParachainsInclusionAggregateMessageOrigin, + ParachainsInclusionEvent, + ParachainsInclusionUmpQueueId, + ParachainsOrigin, + ParachainsParasEvent, + ParachainsParasParaLifecycle, + Phase, + PolkadotPrimitivesV6DisputeStatement, + PolkadotPrimitivesV6ExecutorParamsExecutorParam, + PolkadotPrimitivesV6PvfPrepKind, + PolkadotPrimitivesV6ValidDisputeStatementKind, + PolkadotRuntimeCommonAssignedSlotsEvent, + PolkadotRuntimeCommonAssignedSlotsSlotLeasePeriodStart, + PolkadotRuntimeCommonIdentityMigratorEvent, + PolkadotRuntimeOriginCaller, + PolkadotRuntimeParachainsCoretimeEvent, + PolkadotRuntimeParachainsSchedulerCommonAssignment, + PolkadotRuntimeParachainsSchedulerPalletCoreOccupied, + PreimageEvent, + PreimageOldRequestStatus, + PreimagePalletHoldReason, + PreimageRequestStatus, + PreimagesBounded, + PvfExecKind, + RecoveryEvent, + ReferendaTypesCurve, + RootTestingEvent, + SessionEvent, + SlashingOffenceKind, + StakingEvent, + StakingForcing, + StakingPalletConfigOp, + StakingPalletConfigOpBig, + StakingRewardDestination, + TokenError, + TraitsScheduleDispatchTime, + TransactionPaymentEvent, + TransactionPaymentReleases, + TransactionValidityError, + TransactionValidityInvalidTransaction, + TransactionValidityTransactionSource, + TransactionValidityUnknownTransaction, + TransactionalError, + TreasuryPaymentState, + UpgradeGoAhead, + UpgradeRestriction, + ValidityAttestation, + Version, + VersionedLocatableAsset, + VestingEvent, + VotingConviction, + WestendRuntimeGovernanceOriginsPalletCustomOriginsOrigin, + WestendRuntimeRuntimeFreezeReason, + XcmPalletOrigin, + XcmPalletQueryStatus, + XcmPalletVersionMigrationStage, + XcmV2BodyId, + XcmV2Instruction, + XcmV2Junction, + XcmV2JunctionBodyPart, + XcmV2MultiAssetFilter, + XcmV2MultiassetAssetId, + XcmV2MultiassetAssetInstance, + XcmV2MultiassetFungibility, + XcmV2MultiassetWildFungibility, + XcmV2MultiassetWildMultiAsset, + XcmV2MultilocationJunctions, + XcmV2NetworkId, + XcmV2OriginKind, + XcmV2Response, + XcmV2TraitsError, + XcmV2WeightLimit, + XcmV3Instruction, + XcmV3Junction, + XcmV3JunctionBodyId, + XcmV3JunctionNetworkId, + XcmV3Junctions, + XcmV3MaybeErrorCode, + XcmV3MultiassetAssetId, + XcmV3MultiassetAssetInstance, + XcmV3MultiassetFungibility, + XcmV3MultiassetMultiAssetFilter, + XcmV3MultiassetWildMultiAsset, + XcmV3Response, + XcmV3TraitsError, + XcmV3WeightLimit, + XcmV4AssetAssetFilter, + XcmV4AssetWildAsset, + XcmV4Instruction, + XcmV4Response, + XcmV4TraitsOutcome, + XcmV5AssetFilter, + XcmV5Instruction, + XcmV5Junction, + XcmV5Junctions, + XcmV5NetworkId, + XcmV5WildAsset, + XcmVersionedAsset, + XcmVersionedAssetId, + XcmVersionedAssets, + XcmVersionedLocation, + XcmVersionedResponse, + XcmVersionedXcm, + dot_default as dot, + ksm_default as ksm, + paseo_default as paseo, + wnd_default as wnd +}; diff --git a/examples/with-vite-papi/.papi/descriptors/dist/ksm.d.ts b/examples/with-vite-papi/.papi/descriptors/dist/ksm.d.ts new file mode 100644 index 0000000..9feb860 --- /dev/null +++ b/examples/with-vite-papi/.papi/descriptors/dist/ksm.d.ts @@ -0,0 +1,11679 @@ +import { StorageDescriptor, PlainDescriptor, TxDescriptor, RuntimeDescriptor, Enum, QueryFromPalletsDef, TxFromPalletsDef, EventsFromPalletsDef, ErrorsFromPalletsDef, ConstFromPalletsDef, SS58String, FixedSizeBinary, Binary, FixedSizeArray } from "polkadot-api"; +import { I5sesotjlssv2d, Iffmde3ekjedi9, I4mddgoa69c0a2, I6oojue2nhp42f, I95g6i7ilua7lq, Ieniouoqkq4icf, Phase, Ibgl04rn6nbfm6, I3geksg000c171, BabeDigestsNextConfigDescriptor, Ic5m5lp1oioo8r, Idq7or56ds2f13, I4s6vifaf8k998, I9jd27rnpm8ttv, I8jnd4d8ip6djo, Ifip05kcrl65am, Iff9heri56m1mb, I1q8tnt1cluu5j, I8ds64oj6581v0, Ia7pdug7cdsg8g, Ifosl32ihgoeq6, I2l1ctuihi2mfd, TransactionPaymentReleases, Ia2lhg7l2hilo3, Ic12aht5vh2sen, StakingRewardDestination, I9o7ssi9vmhmgr, Ic3m9d6tdl6gi2, Ib3j7gb0jgs38u, Ifekshcrgkl12g, I7svnfko10tq2e, I6flrronqs3l6n, I97fulj5h3ik95, Ia8896dq44k9m4, Icgljjb6j82uhn, Iff9p3c7k6pfoi, StakingForcing, Iafq6t4rgheait, I4ojmnsk1dchql, Iinkhfdlka9ch, I2kj4j6mp68hf8, I6ouflveob4eli, I2bqvqrg0sbrdj, I23nq3fsgtejt, I4pact7n2e9a0i, Idt624nf41g34e, I9kr8cseidc66h, I82jm9g7pufuel, GrandpaStoredState, I7pe2me3i3vtn9, Iegmj7n48sc3am, I5v9a2mdqq4t8u, ConvictionVotingVoteVoting, If9jidduiuq7vv, I85t6l9pssiov4, I5g2vv0ckl2m8b, I3gg47bgkgq9tr, Icousgkbefm7ke, I22o1tjs56dvi2, I9h43amtitrqum, I2phecamkn3pej, ClaimsStatementKind, I9hkvi4k3kh916, Iam8qhv8b3jn4n, I1659sf24o6ga8, Iehiasr6uoqbq, I8adv0j4q3uu5d, I7d29ossbog0d3, I2na29tt2afp0j, I7mgf69gvksvu2, I3sfg6klg56vmk, Ibprd8oi8phm62, Idlqqo993i780l, Ifble4juuml5ig, Version, Ic836nv7r3fq4i, I56u24ncejr5kt, I3khkuiss7sr1m, I9p9lq3rej5bhc, Iag146hmjgqfgj, I8uo3fpd3bcc6f, PreimageOldRequestStatus, PreimageRequestStatus, I8phqps8r3of7e, Ibofbvvaehln4e, ElectionProviderMultiPhasePhase, Ictkaqdbfabuek, Ia7o65280hur3p, Iasd2iat48n080, Ic8d01sg6acf60, I84stt310eb6c3, I8s6n43okuj2b1, I2cqtnj49ogo81, I7btpfdeli5ea8, Ic79q40j9qptgh, I9bin2jc70qt6q, Ic5t26f9cp3tvk, I39k39h6vu4hbq, Idphjddn2h69vc, Idhh9vuu2bderg, If6qa32dj75gu1, I7oo2mprv1qd1s, NominationPoolsClaimPermission, I2eh80qovrl7h2, Idinvj2ldfa0k7, I78k2970vpbt1t, I27il479s8gsv0, Id375uoldedict, Ilg2fqs6cjgs3, Iarlj3qd8u1v13, I2ng2krd94ceva, Ie18mk3nmrn3nr, I4vk12npmr8ll0, ParachainsParasParaLifecycle, I79cs1p3m59mo7, UpgradeGoAhead, UpgradeRestriction, I2duhnt686rv0q, I7ulu3h1ibu60i, I6ljjd4b5fa4ov, Ibhmrlkcu01imb, I50mrcbubp554e, Id43g4eveajpkl, I7iua3ehrgl4va, Iev3u09i2vqn93, I9olhgo2o08h7b, I9m4rd2a7lc9md, I80rnntpog8qp6, I87u7jalc0lhah, I4p5t2krb1gmvp, I4arjljr6dpflb, I5kqchhvguhfvt, I4akf1ifqeclef, Ido5stnsbghtpd, I3ndpvu09rj685, Iafqnechp3omqg, I9dasmua8326io, I3g90iebhds6kb, I3av628q6dt6mq, Ifmaahl40gom3g, I70iuri2ilha1f, I6gun5k9fbb4s0, XcmPalletQueryStatus, Ic4qvh5df9s5gp, I7vlvrrl2pnbgk, I50sjs3s5lud21, XcmPalletVersionMigrationStage, I50qp0ij7h62g2, Iteuj23is2ed5, I3rp19gb4dadaa, Iegrepoo0c1jc5, I260m120dp9sbk, ParachainsInclusionAggregateMessageOrigin, I53esa2ms463bk, I1lfimt2mpej64, VersionedLocatableAsset, I2fb54desdqd9n, Idjett00s2gd, In7a38730s6qs, If15el53dd76v9, I9s0ave7t0vnrk, Ic6nglu2db2c36, Ibafpkl9hhno69, I4q39t5hn830vp, I35p85j063s0il, I6cs1itejju2vv, XcmV3Junctions, Iasb8k6ash5mjn, I8ofcg5rbj0g2c, I4adgbll7gku4i, I6pjjpfvhvcfru, I9pj91mj79qekl, I39uah9nss64h9, Ik64dknsq7k08, Ib51vk42m1po4n, I50ppnqasq4tjq, I9fin09kkg0jaj, Idcr6u6361oad9, I666bl2fqjkejo, I6o1er683vod1j, I5bq561t4gpfva, I4ktuaksf5i1gk, I9bqtpv2ii35mp, I9j7pagd6d4bda, I2h9pmio37r7fb, Ibmr18suc9ikh9, I9iq22t0burs89, I5u8olqbbvfnvf, I5utcetro501ir, I2eip8tc75dpje, I564va64vtidbq, Ie5v6njpckr05b, I328av3j0bgmjb, I4tuqm9ato907i, Iagi89qt4h1lqg, I9dgmcnuamt5p8, I3vh014cqgmrfd, Ifhs60omlhvt3, If34udpd5e57vi, I39t01nnod9109, Ie5vbnd9198quk, I3h6murn8bd4v5, I6k6jf8ncesuu3, I3qhk481i120pk, If1qr0kbbl298c, Idl3umm12u5pa, I5ont0141q9ss5, Ie6j49utvii126, I3v6ks33uluhnj, I3kiiim1cds68i, I4k60mkh2r6jjg, I5oi8saufice6j, I7ne83r38c2sqq, I2hviml3snvhhn, Icnrv1mfbd3in1, Icm9m0qeemu66d, Ibv74ul0c0qf0f, Idnsr2pndm36h0, Ia1pvdcbhuqf8m, I8steo882k7qns, I4pa4q37gj6fua, I5f178ab6b89t3, I4nakhtbsk3c5s, I4dvjo4haia091, Icbio0e1f0034b, I8c0vkqjjipnuj, I59bngqm85b22v, I3amdclkdfaipk, I8bvk21lpmah75, I449n3riv6jbum, I9a7qiue67urvk, I1adbcfi5uc62r, Ibf6ucefn8fh49, I2ifddbprs364f, I9j2r9vmc9atsu, I6uag8j5aql8q, Isq3k9rh2c0l4, I1dqiovk0tpoah, I1ntko0oih7v1a, I2tf5qmg09624f, I2jef1c2cnp8oc, I3v23e79tnlepm, I8b032lvj28v38, Ib36tv0e89obnf, Ibvkbvbkttt0k5, I8i12uisk6j7l, I26anifrfnljoi, I3qt1hgg4djhgb, I6a6f85pb71ums, I96p6guspeq6t, I4b66js88p45m8, Ieh40op1lafir9, Icjp7f9u9fno72, I1bk4tm1i2b3ng, I7pqmhr25d3dqq, I6s6ihmfj6j5qq, Ic6cqd9g0t65v0, I7ka1pdlbuevh2, Id9uqtigc0il3v, Iaa2o6cgjdpdn5, Iam6hrl7ptd85l, Ict9ivhr2c5hv0, I8t4vv03357lk9, I86371i6qagoce, I5n4sebgkfr760, I5gm0fj8b8qu3g, Ifs1i5fk9cqvr6, Ib5h8krvbu7gcm, Idunov91dgketn, Ieg3fd8p4pkt10, I8kg5ll427kfqq, I467333262q1l9, I8pt1p4aiber0h, Ia3sdslbn23eti, Ict27q3g3cg78f, Ieduhgeucg3h7j, I2eb501t8s6hsq, Ianmuoljk2sk1u, I9tfpm16e56og7, Ic11v0sqkv8lho, I5s3p8q2sfvnav, Ideaemvoneh309, I3d9o9d7epp66v, I82nfqfkd48n10, I1jm8m1rh9e20v, I3o5j3bli1pd8e, I2a839vbf5817q, Ia9p5bg6p18r0i, I42bqh279uf7oa, I4p6v96cffstms, I90n6nnkpdahrh, I8mk5kjgn02hi8, Ieqvq91sbe02ko, I2gr10p66od9ch, I9mcq66cm3gibo, Ic50i89t5eabvg, I80q14um2s2ckg, I5qs1t1erfi7u8, I2ou0mtsgm3l71, Ifsme8miqq9006, Icckjru8f8flpj, Iba38lgbjrs7je, Id9js0aucdivjk, I1vj3e1a62je3o, I6c1t14l6giceg, Ieg1oc56mamrl5, I2vu5vj7173ik9, I6galqkn58q3bl, I36uoc8t9liv80, Ibunghsg9qa7f7, I8qnouj2c0igph, Ic30e2k517a3ns, I47a2tsd2o2b1c, Ifc9k1s0e9nv8e, I4ihj26hl75e5p, I2dl8ekhm2t22h, I13us5e5h5645o, I931cottvong90, I7sujb8gfvuo7n, I1ors0vru14it3, I40s11r8nagn2g, I6bjj87fr5g9nl, I8cbluptqo8kbp, I81cc4plffa1dm, I3ihan8icf0c5k, I7ibh0fckqou49, I9j0ul7nh7b8jv, Id581arok0b1nj, I9jsikd1ghmc7l, I2f6mha3v4ooda, Iasqjdhasi408s, I6krn2lsleo87n, Iaid4btmkr5thp, I559fv6um7nmhd, Ibbf0j7ol2abrv, I1k3urvkqqshbc, I2ff0ffsh15vej, I1orfg86bkg123, Iaus4cb3drhu9q, Ivnsat10lv9d6, Ibncli8qttt2c2, I33rft6ag34efs, I9tmok5kceg2bg, I85icj2qbjeqbe, Ibuhbp68e6tkct, Idrevppfiubhve, I9s2h36kr71vk9, I4lkbiubo9ogq9, Id1baei7m8gkhk, I96ftepqm4vs7m, Ic3430470j4mbv, Ic3n7nqb6fffo0, I437u7rqtshfms, Iaa7g3f5tlv3gf, I7mf0sij342109, Ibvirp862qkkup, Ic5b47dj4coa3r, Idehabrqi23sc0, Idfpo6162k0hq, I19hvnphoaj44l, I1ng31ej27mh4k, I85qkvekflgteq, I1qt5nua7ua655, Ia1u3jll6a06ae, I7cl9esn1l72m7, Id68sq6o2gm8qi, Iafscmv8tjf0ou, Ibtsa3docbr9el, I2gpmmfdqv3cdc, I9paqujeb1fpv6, Iakevv83i18n4r, If2ssl12kcglhg, Iabk8ljl5g8c86, Ic76kfh5ebqkpl, Icrujen33bbibf, I5gi8h3e5lkbeq, Ibgm4rnf22lal1, I8mmaab8je28oo, I6r0pr82pbiftt, Ibv4ep0hngvn9e, Ieoqregtp7b00, I6nmp4rhqla35, I8ndstn7sf4kek, I3pirohb0sp3ic, Iemqna2uucuei9, Ia82mnkmeo2rhc, I64gl0ge4ir4jn, Icbccs0ug47ilf, I855j4i3kr8ko1, Icv68aq8841478, Ic262ibdoec56a, Iflcfm9b6nlmdd, Ijrsf4mnp3eka, Id5fm4p8lj5qgi, I8tjvj9uq4b7hi, I4cbvqmqadhrea, I4fooe9dun9o0t, Ier2cke86dqbr2, I1au3fq4n84nv3, Iejaj7m7qka9tr, Idnak900lt5lm8, I27n7lbd66730p, I2hq50pu2kdjpo, Ifk8eme5o7mukf, Iau4cgm6ih61cf, I6ir616rur362k, Ic19as7nbst738, I54umskavgc9du, I2ip7o9e2tc5sf, I5egvk6hadac5h, Iempvdlhc5ih6g, I5768ac424h061, I8iksqi3eani0a, I16enopmju1p0q, I43kq8qudg7pq9, I76riseemre533, I38bmcrmh852rk, I4hcillge8de5f, If52u7u3r3ve0n, Iek7v4hrgnq6iv, I229ijht536qdu, I62nte77gksm0f, I9cg2delv92pvq, Ilhp45uime5tp, I4f1hv034jf1dt, Im1pm2vf6llcn, I21jsoeb0o6476, Ier6ck0tpfo7, Ic6ecdcp9ut7jd, I27notaksll8qt, Ifehsusc6g747o, I9f0v9ntn9g19p, Ie3hcrrq6r18fs, I47k56fn84rojg, Iase69ms3nbqke, I461t9gdjcm4o5, I8ircspqpe79k7, I1vlt8l6nvnen6, I72vf0j9juc1df, Ie0phfcvllr4od, I476ep66p6ddg1, Ie3gphha4ejh40, If0btdsid69rrm, Ictusacdcqj61u, Ibsolu3c3q1lb4, Ib116djgo9u4uo, I9vkkue6cq74et, Ibu56t5h1q49i4, I1dmtl5t34b9g, Ievr89968437gm, Idhmkdhk0gf66d, Ia3c82eadg79bj, Ienusoeb625ftq, Ia9qkoqqvill5r, I2ur0oeqg495j8, Ica4ean4b9ksdn, Iep27ialq4a7o7, Iasu5jvoqr43mv, Icbi9ul88saklf, I5qolde99acmd1, Id9idaj83175f9, Ie1semicfuv5uu, If25fjs9o37co1, I70sc1pdo8vtos, I60p8l86a8cm59, I3m3sk2lgcabvp, I5pf572duh4oeg, I4mol6k10mv0io, Iec90vukseit9e, I7j4m7a3pkvsf4, Ic2n50kpnu5mae, Ie2vmgag6qiue4, I1kpuet4lkcdpf, I5tr1gp2t9i6oh, I7ls1r4u61csif, I3gjgtso69eopr, I37454vatvmm1l, Iblau1qa7u7fet, I1ti389kf8t6oi, If4nnre373amul, I55kbor0ocqk6h, Idsj9cg7j96kpc, Ido4u9drncfaml, Ie8c7ctks8ur2p, I7vqogd77mmdlm, I6mik29s5073td, I2m0sqmb75cnpb, I49agc5b62mehu, Iatq9jda4hq6pg, I2g87evcjlgmqi, Idsn6b9o09ac22, Ic0he9tlf9ll0u, Icdu1nb48l753j, I618m2uag0aopg, Ic8i89mfkmn3n7, Id2bej717ckub0, I545vo2e86o5i4, I3i09nus3ku37s, I2e447aa6a0imh, I82n7gg49bvucn, I58qkru548f7dl, Ibs22tt76qp5bi, I37r4bdai8o9mp, Idn2ghub1o4i40, I48u78djt89dod, Ib85m5kfbepu2t, Idaml5bdhsfcsl, Ieec0cu336gteb, I815d5k4ij85nv, Ifi98fgi9o46v7, Ic0oj9tok33uap, I3tdutpfjuk32j, I1esdujrkdacpb, I9g1d820jf9m2s, I8ve4g3egaln6a, I5too1knnpqnk1, If4hvqaeoqq5us, Iaiqv5prlisjkg, I2aatv5i0cb96a, Ib9msr5sr8t3dn, I3le5tr7ugg6l2, I3iun9sig164po, I2uqmls7kcdnii, Idg69klialbkb8, I13jboebjcbglr, I30pg328m00nr3, I381dkhrurdhrs, Ic8hi3qr11vngc, Ibjdlecumfu7q7, Ia9ems1kg7laoc, I92fq0fa45vi3, Id01dpp0dn2cj0, I6nu8k62ck9o8o, I6s1nbislhk619, I218fa3heih67o, I1tf93k54ltg1v, I6ove5at7hfiur, I9c0urppp07b8b, I1a3ecmnlnvr59, BagsListListListError, Ie2db4l6126rkt, I3he5stuuhiokq, Iaqet9jc3ihboe, Ic952bubvq4k7d, I2v50gu3s1aqk6, Iabpgqcjikia83, I7e8tdrv5aklbf, If7uv525tdvv7a, Itom7fk49o0c9, I2an1fs2eiebjp, TransactionValidityTransactionSource, Iajbob6uln5jct, I5985kfq7sspta, I4jmodim0td97u, OccupiedCoreAssumption, I9kavsa730sjfr, Ifn3gc8nc1jruq, Ic1d4u2opv3fst, Ic5plng3kq7oc8, Iajdik7eaq7pn0, I2pf0b05mc7sdr, I7n1him6iq79fv, Ialuks4a6iupcs, I36e6rra3ikq65, Idv6tqqnmb3i1j, Iekan13fn586c2, Idrp5a1qbbi2au, I943rhn463avqr, Iacuu7pfj40eo5, Iavuvfkop6318c, I3cs5lehnlql7v, Ifogo2hpqpe6b4, Ifiofttj73fsk1, I7rj2bnb76oko1, I4o356o7eq06ms, I46e127tr8ma2h, I38ee9is0n4jn9, Ie88mmnuvmuvp5, I9puqgoda8ofk4, Iems84l8lk2v0c, I1r5ke30ueqo0r, I68ii5ik8avr9o, Icerf8h8pdu8ss, I6spmpef2c7svf, Iei2mvq0mjvt81, Ibipt6qfiegcf5, I1p1369d52j8jd, DotXcmVersionedXcm, Ic0c3req3mlc1l, DotXcmVersionedAssetId, I7ocn4njqde3v5, DotXcmVersionedLocation, I5rlt6h8ph553n, I575vh6g119dum, Ib5fks2228v743, Ib748gt0noucrc, Ieh6nis3hdbtgi, Ie9sr1iqcg3cgm, I1mqgk2tmnn9i2, I6lr8sctk0bi4e, I3h7okodr0vdlp } from "./common-types"; +type AnonymousEnum = T & { + __anonymous: true; +}; +type MyTuple = [T, ...T[]]; +type SeparateUndefined = undefined extends T ? undefined | Exclude : T; +type Anonymize = SeparateUndefined ? number extends L ? Binary : FixedSizeBinary : T extends string | number | bigint | boolean | void | undefined | null | symbol | Uint8Array | Enum ? T : T extends AnonymousEnum ? Enum : T extends MyTuple ? { + [K in keyof T]: T[K]; +} : T extends [] ? [] : T extends FixedSizeArray ? number extends L ? Array : FixedSizeArray : { + [K in keyof T & string]: T[K]; +}>; +type IStorage = { + System: { + /** + * The full account information for a particular account ID. + */ + Account: StorageDescriptor<[Key: SS58String], Anonymize, false, never>; + /** + * Total extrinsics count for the current block. + */ + ExtrinsicCount: StorageDescriptor<[], number, true, never>; + /** + * Whether all inherents have been applied. + */ + InherentsApplied: StorageDescriptor<[], boolean, false, never>; + /** + * The current weight for the block. + */ + BlockWeight: StorageDescriptor<[], Anonymize, false, never>; + /** + * Total length (in bytes) for all extrinsics put together, for the current block. + */ + AllExtrinsicsLen: StorageDescriptor<[], number, true, never>; + /** + * Map of block numbers to block hashes. + */ + BlockHash: StorageDescriptor<[Key: number], FixedSizeBinary<32>, false, never>; + /** + * Extrinsics data for the current block (maps an extrinsic's index to its data). + */ + ExtrinsicData: StorageDescriptor<[Key: number], Binary, false, never>; + /** + * The current block number being processed. Set by `execute_block`. + */ + Number: StorageDescriptor<[], number, false, never>; + /** + * Hash of the previous block. + */ + ParentHash: StorageDescriptor<[], FixedSizeBinary<32>, false, never>; + /** + * Digest of the current block, also part of the block header. + */ + Digest: StorageDescriptor<[], Anonymize, false, never>; + /** + * Events deposited for the current block. + * + * NOTE: The item is unbound and should therefore never be read on chain. + * It could otherwise inflate the PoV size of a block. + * + * Events have a large in-memory size. Box the events to not go out-of-memory + * just in case someone still reads them from within the runtime. + */ + Events: StorageDescriptor<[], Anonymize, false, never>; + /** + * The number of events in the `Events` list. + */ + EventCount: StorageDescriptor<[], number, false, never>; + /** + * Mapping between a topic (represented by T::Hash) and a vector of indexes + * of events in the `>` list. + * + * All topic vectors have deterministic storage locations depending on the topic. This + * allows light-clients to leverage the changes trie storage tracking mechanism and + * in case of changes fetch the list of events of interest. + * + * The value has the type `(BlockNumberFor, EventIndex)` because if we used only just + * the `EventIndex` then in case if the topic has the same contents on the next block + * no notification will be triggered thus the event might be lost. + */ + EventTopics: StorageDescriptor<[Key: FixedSizeBinary<32>], Anonymize, false, never>; + /** + * Stores the `spec_version` and `spec_name` of when the last runtime upgrade happened. + */ + LastRuntimeUpgrade: StorageDescriptor<[], Anonymize, true, never>; + /** + * True if we have upgraded so that `type RefCount` is `u32`. False (default) if not. + */ + UpgradedToU32RefCount: StorageDescriptor<[], boolean, false, never>; + /** + * True if we have upgraded so that AccountInfo contains three types of `RefCount`. False + * (default) if not. + */ + UpgradedToTripleRefCount: StorageDescriptor<[], boolean, false, never>; + /** + * The execution phase of the block. + */ + ExecutionPhase: StorageDescriptor<[], Phase, true, never>; + /** + * `Some` if a code upgrade has been authorized. + */ + AuthorizedUpgrade: StorageDescriptor<[], Anonymize, true, never>; + }; + Babe: { + /** + * Current epoch index. + */ + EpochIndex: StorageDescriptor<[], bigint, false, never>; + /** + * Current epoch authorities. + */ + Authorities: StorageDescriptor<[], Anonymize, false, never>; + /** + * The slot at which the first epoch actually started. This is 0 + * until the first block of the chain. + */ + GenesisSlot: StorageDescriptor<[], bigint, false, never>; + /** + * Current slot number. + */ + CurrentSlot: StorageDescriptor<[], bigint, false, never>; + /** + * The epoch randomness for the *current* epoch. + * + * # Security + * + * This MUST NOT be used for gambling, as it can be influenced by a + * malicious validator in the short term. It MAY be used in many + * cryptographic protocols, however, so long as one remembers that this + * (like everything else on-chain) it is public. For example, it can be + * used where a number is needed that cannot have been chosen by an + * adversary, for purposes such as public-coin zero-knowledge proofs. + */ + Randomness: StorageDescriptor<[], FixedSizeBinary<32>, false, never>; + /** + * Pending epoch configuration change that will be applied when the next epoch is enacted. + */ + PendingEpochConfigChange: StorageDescriptor<[], BabeDigestsNextConfigDescriptor, true, never>; + /** + * Next epoch randomness. + */ + NextRandomness: StorageDescriptor<[], FixedSizeBinary<32>, false, never>; + /** + * Next epoch authorities. + */ + NextAuthorities: StorageDescriptor<[], Anonymize, false, never>; + /** + * Randomness under construction. + * + * We make a trade-off between storage accesses and list length. + * We store the under-construction randomness in segments of up to + * `UNDER_CONSTRUCTION_SEGMENT_LENGTH`. + * + * Once a segment reaches this length, we begin the next one. + * We reset all segments and return to `0` at the beginning of every + * epoch. + */ + SegmentIndex: StorageDescriptor<[], number, false, never>; + /** + * TWOX-NOTE: `SegmentIndex` is an increasing integer, so this is okay. + */ + UnderConstruction: StorageDescriptor<[Key: number], Anonymize, false, never>; + /** + * Temporary value (cleared at block finalization) which is `Some` + * if per-block initialization has already been called for current block. + */ + Initialized: StorageDescriptor<[], Anonymize, true, never>; + /** + * This field should always be populated during block processing unless + * secondary plain slots are enabled (which don't contain a VRF output). + * + * It is set in `on_finalize`, before it will contain the value from the last block. + */ + AuthorVrfRandomness: StorageDescriptor<[], Anonymize, false, never>; + /** + * The block numbers when the last and current epoch have started, respectively `N-1` and + * `N`. + * NOTE: We track this is in order to annotate the block number when a given pool of + * entropy was fixed (i.e. it was known to chain observers). Since epochs are defined in + * slots, which may be skipped, the block numbers may not line up with the slot numbers. + */ + EpochStart: StorageDescriptor<[], Anonymize, false, never>; + /** + * How late the current block is compared to its parent. + * + * This entry is populated as part of block execution and is cleaned up + * on block finalization. Querying this storage entry outside of block + * execution context should always yield zero. + */ + Lateness: StorageDescriptor<[], number, false, never>; + /** + * The configuration for the current epoch. Should never be `None` as it is initialized in + * genesis. + */ + EpochConfig: StorageDescriptor<[], Anonymize, true, never>; + /** + * The configuration for the next epoch, `None` if the config will not change + * (you can fallback to `EpochConfig` instead in that case). + */ + NextEpochConfig: StorageDescriptor<[], Anonymize, true, never>; + /** + * A list of the last 100 skipped epochs and the corresponding session index + * when the epoch was skipped. + * + * This is only used for validating equivocation proofs. An equivocation proof + * must contains a key-ownership proof for a given session, therefore we need a + * way to tie together sessions and epoch indices, i.e. we need to validate that + * a validator was the owner of a given key on a given session, and what the + * active epoch index was during that session. + */ + SkippedEpochs: StorageDescriptor<[], Anonymize, false, never>; + }; + Timestamp: { + /** + * The current time for the current block. + */ + Now: StorageDescriptor<[], bigint, false, never>; + /** + * Whether the timestamp has been updated in this block. + * + * This value is updated to `true` upon successful submission of a timestamp by a node. + * It is then checked at the end of each block execution in the `on_finalize` hook. + */ + DidUpdate: StorageDescriptor<[], boolean, false, never>; + }; + Indices: { + /** + * The lookup from index to account. + */ + Accounts: StorageDescriptor<[Key: number], Anonymize, true, never>; + }; + Balances: { + /** + * The total units issued in the system. + */ + TotalIssuance: StorageDescriptor<[], bigint, false, never>; + /** + * The total units of outstanding deactivated balance in the system. + */ + InactiveIssuance: StorageDescriptor<[], bigint, false, never>; + /** + * The Balances pallet example of storing the balance of an account. + * + * # Example + * + * ```nocompile + * impl pallet_balances::Config for Runtime { + * type AccountStore = StorageMapShim, frame_system::Provider, AccountId, Self::AccountData> + * } + * ``` + * + * You can also store the balance of an account in the `System` pallet. + * + * # Example + * + * ```nocompile + * impl pallet_balances::Config for Runtime { + * type AccountStore = System + * } + * ``` + * + * But this comes with tradeoffs, storing account balances in the system pallet stores + * `frame_system` data alongside the account data contrary to storing account balances in the + * `Balances` pallet, which uses a `StorageMap` to store balances data only. + * NOTE: This is only used in the case that this pallet is used to store balances. + */ + Account: StorageDescriptor<[Key: SS58String], Anonymize, false, never>; + /** + * Any liquidity locks on some account balances. + * NOTE: Should only be accessed when setting, changing and freeing a lock. + * + * Use of locks is deprecated in favour of freezes. See `https://github.com/paritytech/substrate/pull/12951/` + */ + Locks: StorageDescriptor<[Key: SS58String], Anonymize, false, never>; + /** + * Named reserves on some account balances. + * + * Use of reserves is deprecated in favour of holds. See `https://github.com/paritytech/substrate/pull/12951/` + */ + Reserves: StorageDescriptor<[Key: SS58String], Anonymize, false, never>; + /** + * Holds on account balances. + */ + Holds: StorageDescriptor<[Key: SS58String], Anonymize, false, never>; + /** + * Freeze locks on account balances. + */ + Freezes: StorageDescriptor<[Key: SS58String], Anonymize, false, never>; + }; + TransactionPayment: { + /** + + */ + NextFeeMultiplier: StorageDescriptor<[], bigint, false, never>; + /** + + */ + StorageVersion: StorageDescriptor<[], TransactionPaymentReleases, false, never>; + }; + Authorship: { + /** + * Author of current block. + */ + Author: StorageDescriptor<[], SS58String, true, never>; + }; + Staking: { + /** + * The ideal number of active validators. + */ + ValidatorCount: StorageDescriptor<[], number, false, never>; + /** + * Minimum number of staking participants before emergency conditions are imposed. + */ + MinimumValidatorCount: StorageDescriptor<[], number, false, never>; + /** + * Any validators that may never be slashed or forcibly kicked. It's a Vec since they're + * easy to initialize and the performance hit is minimal (we expect no more than four + * invulnerables) and restricted to testnets. + */ + Invulnerables: StorageDescriptor<[], Anonymize, false, never>; + /** + * Map from all locked "stash" accounts to the controller account. + * + * TWOX-NOTE: SAFE since `AccountId` is a secure hash. + */ + Bonded: StorageDescriptor<[Key: SS58String], SS58String, true, never>; + /** + * The minimum active bond to become and maintain the role of a nominator. + */ + MinNominatorBond: StorageDescriptor<[], bigint, false, never>; + /** + * The minimum active bond to become and maintain the role of a validator. + */ + MinValidatorBond: StorageDescriptor<[], bigint, false, never>; + /** + * The minimum active nominator stake of the last successful election. + */ + MinimumActiveStake: StorageDescriptor<[], bigint, false, never>; + /** + * The minimum amount of commission that validators can set. + * + * If set to `0`, no limit exists. + */ + MinCommission: StorageDescriptor<[], number, false, never>; + /** + * Map from all (unlocked) "controller" accounts to the info regarding the staking. + * + * Note: All the reads and mutations to this storage *MUST* be done through the methods exposed + * by [`StakingLedger`] to ensure data and lock consistency. + */ + Ledger: StorageDescriptor<[Key: SS58String], Anonymize, true, never>; + /** + * Where the reward payment should be made. Keyed by stash. + * + * TWOX-NOTE: SAFE since `AccountId` is a secure hash. + */ + Payee: StorageDescriptor<[Key: SS58String], StakingRewardDestination, true, never>; + /** + * The map from (wannabe) validator stash key to the preferences of that validator. + * + * TWOX-NOTE: SAFE since `AccountId` is a secure hash. + */ + Validators: StorageDescriptor<[Key: SS58String], Anonymize, false, never>; + /** + *Counter for the related counted storage map + */ + CounterForValidators: StorageDescriptor<[], number, false, never>; + /** + * The maximum validator count before we stop allowing new validators to join. + * + * When this value is not set, no limits are enforced. + */ + MaxValidatorsCount: StorageDescriptor<[], number, true, never>; + /** + * The map from nominator stash key to their nomination preferences, namely the validators that + * they wish to support. + * + * Note that the keys of this storage map might become non-decodable in case the + * account's [`NominationsQuota::MaxNominations`] configuration is decreased. + * In this rare case, these nominators + * are still existent in storage, their key is correct and retrievable (i.e. `contains_key` + * indicates that they exist), but their value cannot be decoded. Therefore, the non-decodable + * nominators will effectively not-exist, until they re-submit their preferences such that it + * is within the bounds of the newly set `Config::MaxNominations`. + * + * This implies that `::iter_keys().count()` and `::iter().count()` might return different + * values for this map. Moreover, the main `::count()` is aligned with the former, namely the + * number of keys that exist. + * + * Lastly, if any of the nominators become non-decodable, they can be chilled immediately via + * [`Call::chill_other`] dispatchable by anyone. + * + * TWOX-NOTE: SAFE since `AccountId` is a secure hash. + */ + Nominators: StorageDescriptor<[Key: SS58String], Anonymize, true, never>; + /** + *Counter for the related counted storage map + */ + CounterForNominators: StorageDescriptor<[], number, false, never>; + /** + * Stakers whose funds are managed by other pallets. + * + * This pallet does not apply any locks on them, therefore they are only virtually bonded. They + * are expected to be keyless accounts and hence should not be allowed to mutate their ledger + * directly via this pallet. Instead, these accounts are managed by other pallets and accessed + * via low level apis. We keep track of them to do minimal integrity checks. + */ + VirtualStakers: StorageDescriptor<[Key: SS58String], undefined, true, never>; + /** + *Counter for the related counted storage map + */ + CounterForVirtualStakers: StorageDescriptor<[], number, false, never>; + /** + * The maximum nominator count before we stop allowing new validators to join. + * + * When this value is not set, no limits are enforced. + */ + MaxNominatorsCount: StorageDescriptor<[], number, true, never>; + /** + * The current era index. + * + * This is the latest planned era, depending on how the Session pallet queues the validator + * set, it might be active or not. + */ + CurrentEra: StorageDescriptor<[], number, true, never>; + /** + * The active era information, it holds index and start. + * + * The active era is the era being currently rewarded. Validator set of this era must be + * equal to [`SessionInterface::validators`]. + */ + ActiveEra: StorageDescriptor<[], Anonymize, true, never>; + /** + * The session index at which the era start for the last [`Config::HistoryDepth`] eras. + * + * Note: This tracks the starting session (i.e. session index when era start being active) + * for the eras in `[CurrentEra - HISTORY_DEPTH, CurrentEra]`. + */ + ErasStartSessionIndex: StorageDescriptor<[Key: number], number, true, never>; + /** + * Exposure of validator at era. + * + * This is keyed first by the era index to allow bulk deletion and then the stash account. + * + * Is it removed after [`Config::HistoryDepth`] eras. + * If stakers hasn't been set or has been removed then empty exposure is returned. + * + * Note: Deprecated since v14. Use `EraInfo` instead to work with exposures. + */ + ErasStakers: StorageDescriptor, Anonymize, false, never>; + /** + * Summary of validator exposure at a given era. + * + * This contains the total stake in support of the validator and their own stake. In addition, + * it can also be used to get the number of nominators backing this validator and the number of + * exposure pages they are divided into. The page count is useful to determine the number of + * pages of rewards that needs to be claimed. + * + * This is keyed first by the era index to allow bulk deletion and then the stash account. + * Should only be accessed through `EraInfo`. + * + * Is it removed after [`Config::HistoryDepth`] eras. + * If stakers hasn't been set or has been removed then empty overview is returned. + */ + ErasStakersOverview: StorageDescriptor, Anonymize, true, never>; + /** + * Clipped Exposure of validator at era. + * + * Note: This is deprecated, should be used as read-only and will be removed in the future. + * New `Exposure`s are stored in a paged manner in `ErasStakersPaged` instead. + * + * This is similar to [`ErasStakers`] but number of nominators exposed is reduced to the + * `T::MaxExposurePageSize` biggest stakers. + * (Note: the field `total` and `own` of the exposure remains unchanged). + * This is used to limit the i/o cost for the nominator payout. + * + * This is keyed fist by the era index to allow bulk deletion and then the stash account. + * + * It is removed after [`Config::HistoryDepth`] eras. + * If stakers hasn't been set or has been removed then empty exposure is returned. + * + * Note: Deprecated since v14. Use `EraInfo` instead to work with exposures. + */ + ErasStakersClipped: StorageDescriptor, Anonymize, false, never>; + /** + * Paginated exposure of a validator at given era. + * + * This is keyed first by the era index to allow bulk deletion, then stash account and finally + * the page. Should only be accessed through `EraInfo`. + * + * This is cleared after [`Config::HistoryDepth`] eras. + */ + ErasStakersPaged: StorageDescriptor, Anonymize, true, never>; + /** + * History of claimed paged rewards by era and validator. + * + * This is keyed by era and validator stash which maps to the set of page indexes which have + * been claimed. + * + * It is removed after [`Config::HistoryDepth`] eras. + */ + ClaimedRewards: StorageDescriptor, Anonymize, false, never>; + /** + * Similar to `ErasStakers`, this holds the preferences of validators. + * + * This is keyed first by the era index to allow bulk deletion and then the stash account. + * + * Is it removed after [`Config::HistoryDepth`] eras. + */ + ErasValidatorPrefs: StorageDescriptor, Anonymize, false, never>; + /** + * The total validator era payout for the last [`Config::HistoryDepth`] eras. + * + * Eras that haven't finished yet or has been removed doesn't have reward. + */ + ErasValidatorReward: StorageDescriptor<[Key: number], bigint, true, never>; + /** + * Rewards for the last [`Config::HistoryDepth`] eras. + * If reward hasn't been set or has been removed then 0 reward is returned. + */ + ErasRewardPoints: StorageDescriptor<[Key: number], Anonymize, false, never>; + /** + * The total amount staked for the last [`Config::HistoryDepth`] eras. + * If total hasn't been set or has been removed then 0 stake is returned. + */ + ErasTotalStake: StorageDescriptor<[Key: number], bigint, false, never>; + /** + * Mode of era forcing. + */ + ForceEra: StorageDescriptor<[], StakingForcing, false, never>; + /** + * Maximum staked rewards, i.e. the percentage of the era inflation that + * is used for stake rewards. + * See [Era payout](./index.html#era-payout). + */ + MaxStakedRewards: StorageDescriptor<[], number, true, never>; + /** + * The percentage of the slash that is distributed to reporters. + * + * The rest of the slashed value is handled by the `Slash`. + */ + SlashRewardFraction: StorageDescriptor<[], number, false, never>; + /** + * The amount of currency given to reporters of a slash event which was + * canceled by extraordinary circumstances (e.g. governance). + */ + CanceledSlashPayout: StorageDescriptor<[], bigint, false, never>; + /** + * All unapplied slashes that are queued for later. + */ + UnappliedSlashes: StorageDescriptor<[Key: number], Anonymize, false, never>; + /** + * A mapping from still-bonded eras to the first session index of that era. + * + * Must contains information for eras for the range: + * `[active_era - bounding_duration; active_era]` + */ + BondedEras: StorageDescriptor<[], Anonymize, false, never>; + /** + * All slashing events on validators, mapped by era to the highest slash proportion + * and slash value of the era. + */ + ValidatorSlashInEra: StorageDescriptor, Anonymize, true, never>; + /** + * All slashing events on nominators, mapped by era to the highest slash value of the era. + */ + NominatorSlashInEra: StorageDescriptor, bigint, true, never>; + /** + * Slashing spans for stash accounts. + */ + SlashingSpans: StorageDescriptor<[Key: SS58String], Anonymize, true, never>; + /** + * Records information about the maximum slash of a stash within a slashing span, + * as well as how much reward has been paid out. + */ + SpanSlash: StorageDescriptor<[Key: Anonymize], Anonymize, false, never>; + /** + * The last planned session scheduled by the session pallet. + * + * This is basically in sync with the call to [`pallet_session::SessionManager::new_session`]. + */ + CurrentPlannedSession: StorageDescriptor<[], number, false, never>; + /** + * Indices of validators that have offended in the active era. The offenders are disabled for a + * whole era. For this reason they are kept here - only staking pallet knows about eras. The + * implementor of [`DisablingStrategy`] defines if a validator should be disabled which + * implicitly means that the implementor also controls the max number of disabled validators. + * + * The vec is always kept sorted so that we can find whether a given validator has previously + * offended using binary search. + */ + DisabledValidators: StorageDescriptor<[], Anonymize, false, never>; + /** + * The threshold for when users can start calling `chill_other` for other validators / + * nominators. The threshold is compared to the actual number of validators / nominators + * (`CountFor*`) in the system compared to the configured max (`Max*Count`). + */ + ChillThreshold: StorageDescriptor<[], number, true, never>; + }; + Offences: { + /** + * The primary structure that holds all offence records keyed by report identifiers. + */ + Reports: StorageDescriptor<[Key: FixedSizeBinary<32>], Anonymize, true, never>; + /** + * A vector of reports of the same kind that happened at the same time slot. + */ + ConcurrentReportsIndex: StorageDescriptor, Anonymize, false, never>; + }; + Historical: { + /** + * Mapping from historical session indices to session-data root hash and validator count. + */ + HistoricalSessions: StorageDescriptor<[Key: number], Anonymize, true, never>; + /** + * The range of historical sessions we store. [first, last) + */ + StoredRange: StorageDescriptor<[], Anonymize, true, never>; + }; + Session: { + /** + * The current set of validators. + */ + Validators: StorageDescriptor<[], Anonymize, false, never>; + /** + * Current index of the session. + */ + CurrentIndex: StorageDescriptor<[], number, false, never>; + /** + * True if the underlying economic identities or weighting behind the validators + * has changed in the queued validator set. + */ + QueuedChanged: StorageDescriptor<[], boolean, false, never>; + /** + * The queued keys for the next session. When the next session begins, these keys + * will be used to determine the validator's session keys. + */ + QueuedKeys: StorageDescriptor<[], Anonymize, false, never>; + /** + * Indices of disabled validators. + * + * The vec is always kept sorted so that we can find whether a given validator is + * disabled using binary search. It gets cleared when `on_session_ending` returns + * a new set of identities. + */ + DisabledValidators: StorageDescriptor<[], Anonymize, false, never>; + /** + * The next session keys for a validator. + */ + NextKeys: StorageDescriptor<[Key: SS58String], Anonymize, true, never>; + /** + * The owner of a key. The key is the `KeyTypeId` + the encoded key. + */ + KeyOwner: StorageDescriptor<[Key: Anonymize], SS58String, true, never>; + }; + Grandpa: { + /** + * State of the current authority set. + */ + State: StorageDescriptor<[], GrandpaStoredState, false, never>; + /** + * Pending change: (signaled at, scheduled change). + */ + PendingChange: StorageDescriptor<[], Anonymize, true, never>; + /** + * next block number where we can force a change. + */ + NextForced: StorageDescriptor<[], number, true, never>; + /** + * `true` if we are currently stalled. + */ + Stalled: StorageDescriptor<[], Anonymize, true, never>; + /** + * The number of changes (both in terms of keys and underlying economic responsibilities) + * in the "set" of Grandpa validators from genesis. + */ + CurrentSetId: StorageDescriptor<[], bigint, false, never>; + /** + * A mapping from grandpa set ID to the index of the *most recent* session for which its + * members were responsible. + * + * This is only used for validating equivocation proofs. An equivocation proof must + * contains a key-ownership proof for a given session, therefore we need a way to tie + * together sessions and GRANDPA set ids, i.e. we need to validate that a validator + * was the owner of a given key on a given session, and what the active set ID was + * during that session. + * + * TWOX-NOTE: `SetId` is not under user control. + */ + SetIdSession: StorageDescriptor<[Key: bigint], number, true, never>; + /** + * The current list of authorities. + */ + Authorities: StorageDescriptor<[], Anonymize, false, never>; + }; + AuthorityDiscovery: { + /** + * Keys of the current authority set. + */ + Keys: StorageDescriptor<[], Anonymize, false, never>; + /** + * Keys of the next authority set. + */ + NextKeys: StorageDescriptor<[], Anonymize, false, never>; + }; + Treasury: { + /** + * Number of proposals that have been made. + */ + ProposalCount: StorageDescriptor<[], number, false, never>; + /** + * Proposals that have been made. + */ + Proposals: StorageDescriptor<[Key: number], Anonymize, true, never>; + /** + * The amount which has been reported as inactive to Currency. + */ + Deactivated: StorageDescriptor<[], bigint, false, never>; + /** + * Proposal indices that have been approved but not yet awarded. + */ + Approvals: StorageDescriptor<[], Anonymize, false, never>; + /** + * The count of spends that have been made. + */ + SpendCount: StorageDescriptor<[], number, false, never>; + /** + * Spends that have been approved and being processed. + */ + Spends: StorageDescriptor<[Key: number], Anonymize, true, never>; + }; + ConvictionVoting: { + /** + * All voting for a particular voter in a particular voting class. We store the balance for the + * number of votes that we have recorded. + */ + VotingFor: StorageDescriptor, ConvictionVotingVoteVoting, false, never>; + /** + * The voting classes which have a non-zero lock requirement and the lock amounts which they + * require. The actual amount locked on behalf of this pallet should always be the maximum of + * this list. + */ + ClassLocksFor: StorageDescriptor<[Key: SS58String], Anonymize, false, never>; + }; + Referenda: { + /** + * The next free referendum index, aka the number of referenda started so far. + */ + ReferendumCount: StorageDescriptor<[], number, false, never>; + /** + * Information concerning any given referendum. + */ + ReferendumInfoFor: StorageDescriptor<[Key: number], Anonymize, true, never>; + /** + * The sorted list of referenda ready to be decided but not yet being decided, ordered by + * conviction-weighted approvals. + * + * This should be empty if `DecidingCount` is less than `TrackInfo::max_deciding`. + */ + TrackQueue: StorageDescriptor<[Key: number], Anonymize, false, never>; + /** + * The number of referenda being decided currently. + */ + DecidingCount: StorageDescriptor<[Key: number], number, false, never>; + /** + * The metadata is a general information concerning the referendum. + * The `Hash` refers to the preimage of the `Preimages` provider which can be a JSON + * dump or IPFS hash of a JSON file. + * + * Consider a garbage collection for a metadata of finished referendums to `unrequest` (remove) + * large preimages. + */ + MetadataOf: StorageDescriptor<[Key: number], FixedSizeBinary<32>, true, never>; + }; + FellowshipCollective: { + /** + * The number of members in the collective who have at least the rank according to the index + * of the vec. + */ + MemberCount: StorageDescriptor<[Key: number], number, false, never>; + /** + * The current members of the collective. + */ + Members: StorageDescriptor<[Key: SS58String], number, true, never>; + /** + * The index of each ranks's member into the group of members who have at least that rank. + */ + IdToIndex: StorageDescriptor, number, true, never>; + /** + * The members in the collective by index. All indices in the range `0..MemberCount` will + * return `Some`, however a member's index is not guaranteed to remain unchanged over time. + */ + IndexToId: StorageDescriptor, SS58String, true, never>; + /** + * Votes on a given proposal, if it is ongoing. + */ + Voting: StorageDescriptor, Anonymize, true, never>; + /** + + */ + VotingCleanup: StorageDescriptor<[Key: number], Binary, true, never>; + }; + FellowshipReferenda: { + /** + * The next free referendum index, aka the number of referenda started so far. + */ + ReferendumCount: StorageDescriptor<[], number, false, never>; + /** + * Information concerning any given referendum. + */ + ReferendumInfoFor: StorageDescriptor<[Key: number], Anonymize, true, never>; + /** + * The sorted list of referenda ready to be decided but not yet being decided, ordered by + * conviction-weighted approvals. + * + * This should be empty if `DecidingCount` is less than `TrackInfo::max_deciding`. + */ + TrackQueue: StorageDescriptor<[Key: number], Anonymize, false, never>; + /** + * The number of referenda being decided currently. + */ + DecidingCount: StorageDescriptor<[Key: number], number, false, never>; + /** + * The metadata is a general information concerning the referendum. + * The `Hash` refers to the preimage of the `Preimages` provider which can be a JSON + * dump or IPFS hash of a JSON file. + * + * Consider a garbage collection for a metadata of finished referendums to `unrequest` (remove) + * large preimages. + */ + MetadataOf: StorageDescriptor<[Key: number], FixedSizeBinary<32>, true, never>; + }; + Whitelist: { + /** + + */ + WhitelistedCall: StorageDescriptor<[Key: FixedSizeBinary<32>], undefined, true, never>; + }; + Parameters: { + /** + * Stored parameters. + */ + Parameters: StorageDescriptor<[Key: Anonymize], Anonymize, true, never>; + }; + Claims: { + /** + + */ + Claims: StorageDescriptor<[Key: FixedSizeBinary<20>], bigint, true, never>; + /** + + */ + Total: StorageDescriptor<[], bigint, false, never>; + /** + * Vesting schedule for a claim. + * First balance is the total amount that should be held for vesting. + * Second balance is how much should be unlocked per block. + * The block number is when the vesting should start. + */ + Vesting: StorageDescriptor<[Key: FixedSizeBinary<20>], Anonymize, true, never>; + /** + * The statement kind that must be signed, if any. + */ + Signing: StorageDescriptor<[Key: FixedSizeBinary<20>], ClaimsStatementKind, true, never>; + /** + * Pre-claimed Ethereum accounts, by the Account ID that they are claimed to. + */ + Preclaims: StorageDescriptor<[Key: SS58String], FixedSizeBinary<20>, true, never>; + }; + Society: { + /** + * The max number of members for the society at one time. + */ + Parameters: StorageDescriptor<[], Anonymize, true, never>; + /** + * Amount of our account balance that is specifically for the next round's bid(s). + */ + Pot: StorageDescriptor<[], bigint, false, never>; + /** + * The first member. + */ + Founder: StorageDescriptor<[], SS58String, true, never>; + /** + * The most primary from the most recently approved rank 0 members in the society. + */ + Head: StorageDescriptor<[], SS58String, true, never>; + /** + * A hash of the rules of this society concerning membership. Can only be set once and + * only by the founder. + */ + Rules: StorageDescriptor<[], FixedSizeBinary<32>, true, never>; + /** + * The current members and their rank. Doesn't include `SuspendedMembers`. + */ + Members: StorageDescriptor<[Key: SS58String], Anonymize, true, never>; + /** + * Information regarding rank-0 payouts, past and future. + */ + Payouts: StorageDescriptor<[Key: SS58String], Anonymize, false, never>; + /** + * The number of items in `Members` currently. (Doesn't include `SuspendedMembers`.) + */ + MemberCount: StorageDescriptor<[], number, false, never>; + /** + * The current items in `Members` keyed by their unique index. Keys are densely populated + * `0..MemberCount` (does not include `MemberCount`). + */ + MemberByIndex: StorageDescriptor<[Key: number], SS58String, true, never>; + /** + * The set of suspended members, with their old membership record. + */ + SuspendedMembers: StorageDescriptor<[Key: SS58String], Anonymize, true, never>; + /** + * The number of rounds which have passed. + */ + RoundCount: StorageDescriptor<[], number, false, never>; + /** + * The current bids, stored ordered by the value of the bid. + */ + Bids: StorageDescriptor<[], Anonymize, false, never>; + /** + + */ + Candidates: StorageDescriptor<[Key: SS58String], Anonymize, true, never>; + /** + * The current skeptic. + */ + Skeptic: StorageDescriptor<[], SS58String, true, never>; + /** + * Double map from Candidate -> Voter -> (Maybe) Vote. + */ + Votes: StorageDescriptor, Anonymize, true, never>; + /** + * Clear-cursor for Vote, map from Candidate -> (Maybe) Cursor. + */ + VoteClearCursor: StorageDescriptor<[Key: SS58String], Binary, true, never>; + /** + * At the end of the claim period, this contains the most recently approved members (along with + * their bid and round ID) who is from the most recent round with the lowest bid. They will + * become the new `Head`. + */ + NextHead: StorageDescriptor<[], Anonymize, true, never>; + /** + * The number of challenge rounds there have been. Used to identify stale DefenderVotes. + */ + ChallengeRoundCount: StorageDescriptor<[], number, false, never>; + /** + * The defending member currently being challenged, along with a running tally of votes. + */ + Defending: StorageDescriptor<[], Anonymize, true, never>; + /** + * Votes for the defender, keyed by challenge round. + */ + DefenderVotes: StorageDescriptor, Anonymize, true, never>; + }; + Recovery: { + /** + * The set of recoverable accounts and their recovery configuration. + */ + Recoverable: StorageDescriptor<[Key: SS58String], Anonymize, true, never>; + /** + * Active recovery attempts. + * + * First account is the account to be recovered, and the second account + * is the user trying to recover the account. + */ + ActiveRecoveries: StorageDescriptor, Anonymize, true, never>; + /** + * The list of allowed proxy accounts. + * + * Map from the user who can access it to the recovered account. + */ + Proxy: StorageDescriptor<[Key: SS58String], SS58String, true, never>; + }; + Vesting: { + /** + * Information regarding the vesting of a given account. + */ + Vesting: StorageDescriptor<[Key: SS58String], Anonymize, true, never>; + /** + * Storage version of the pallet. + * + * New networks start with latest version, as determined by the genesis build. + */ + StorageVersion: StorageDescriptor<[], Version, false, never>; + }; + Scheduler: { + /** + + */ + IncompleteSince: StorageDescriptor<[], number, true, never>; + /** + * Items to be executed, indexed by the block number that they should be executed on. + */ + Agenda: StorageDescriptor<[Key: number], Anonymize, false, never>; + /** + * Retry configurations for items to be executed, indexed by task address. + */ + Retries: StorageDescriptor<[Key: Anonymize], Anonymize, true, never>; + /** + * Lookup from a name to the block number and index of the task. + * + * For v3 -> v4 the previously unbounded identities are Blake2-256 hashed to form the v4 + * identities. + */ + Lookup: StorageDescriptor<[Key: FixedSizeBinary<32>], Anonymize, true, never>; + }; + Proxy: { + /** + * The set of account proxies. Maps the account which has delegated to the accounts + * which are being delegated to, together with the amount held on deposit. + */ + Proxies: StorageDescriptor<[Key: SS58String], Anonymize, false, never>; + /** + * The announcements made by the proxy (key). + */ + Announcements: StorageDescriptor<[Key: SS58String], Anonymize, false, never>; + }; + Multisig: { + /** + * The set of open multisig operations. + */ + Multisigs: StorageDescriptor, Anonymize, true, never>; + }; + Preimage: { + /** + * The request status of a given hash. + */ + StatusFor: StorageDescriptor<[Key: FixedSizeBinary<32>], PreimageOldRequestStatus, true, never>; + /** + * The request status of a given hash. + */ + RequestStatusFor: StorageDescriptor<[Key: FixedSizeBinary<32>], PreimageRequestStatus, true, never>; + /** + + */ + PreimageFor: StorageDescriptor<[Key: Anonymize], Binary, true, never>; + }; + Bounties: { + /** + * Number of bounty proposals that have been made. + */ + BountyCount: StorageDescriptor<[], number, false, never>; + /** + * Bounties that have been made. + */ + Bounties: StorageDescriptor<[Key: number], Anonymize, true, never>; + /** + * The description of each bounty. + */ + BountyDescriptions: StorageDescriptor<[Key: number], Binary, true, never>; + /** + * Bounty indices that have been approved but not yet funded. + */ + BountyApprovals: StorageDescriptor<[], Anonymize, false, never>; + }; + ChildBounties: { + /** + * Number of total child bounties. + */ + ChildBountyCount: StorageDescriptor<[], number, false, never>; + /** + * Number of child bounties per parent bounty. + * Map of parent bounty index to number of child bounties. + */ + ParentChildBounties: StorageDescriptor<[Key: number], number, false, never>; + /** + * Child bounties that have been added. + */ + ChildBounties: StorageDescriptor, Anonymize, true, never>; + /** + * The description of each child-bounty. + */ + ChildBountyDescriptions: StorageDescriptor<[Key: number], Binary, true, never>; + /** + * The cumulative child-bounty curator fee for each parent bounty. + */ + ChildrenCuratorFees: StorageDescriptor<[Key: number], bigint, false, never>; + }; + ElectionProviderMultiPhase: { + /** + * Internal counter for the number of rounds. + * + * This is useful for de-duplication of transactions submitted to the pool, and general + * diagnostics of the pallet. + * + * This is merely incremented once per every time that an upstream `elect` is called. + */ + Round: StorageDescriptor<[], number, false, never>; + /** + * Current phase. + */ + CurrentPhase: StorageDescriptor<[], ElectionProviderMultiPhasePhase, false, never>; + /** + * Current best solution, signed or unsigned, queued to be returned upon `elect`. + * + * Always sorted by score. + */ + QueuedSolution: StorageDescriptor<[], Anonymize, true, never>; + /** + * Snapshot data of the round. + * + * This is created at the beginning of the signed phase and cleared upon calling `elect`. + * Note: This storage type must only be mutated through [`SnapshotWrapper`]. + */ + Snapshot: StorageDescriptor<[], Anonymize, true, never>; + /** + * Desired number of targets to elect for this round. + * + * Only exists when [`Snapshot`] is present. + * Note: This storage type must only be mutated through [`SnapshotWrapper`]. + */ + DesiredTargets: StorageDescriptor<[], number, true, never>; + /** + * The metadata of the [`RoundSnapshot`] + * + * Only exists when [`Snapshot`] is present. + * Note: This storage type must only be mutated through [`SnapshotWrapper`]. + */ + SnapshotMetadata: StorageDescriptor<[], Anonymize, true, never>; + /** + * The next index to be assigned to an incoming signed submission. + * + * Every accepted submission is assigned a unique index; that index is bound to that particular + * submission for the duration of the election. On election finalization, the next index is + * reset to 0. + * + * We can't just use `SignedSubmissionIndices.len()`, because that's a bounded set; past its + * capacity, it will simply saturate. We can't just iterate over `SignedSubmissionsMap`, + * because iteration is slow. Instead, we store the value here. + */ + SignedSubmissionNextIndex: StorageDescriptor<[], number, false, never>; + /** + * A sorted, bounded vector of `(score, block_number, index)`, where each `index` points to a + * value in `SignedSubmissions`. + * + * We never need to process more than a single signed submission at a time. Signed submissions + * can be quite large, so we're willing to pay the cost of multiple database accesses to access + * them one at a time instead of reading and decoding all of them at once. + */ + SignedSubmissionIndices: StorageDescriptor<[], Anonymize, false, never>; + /** + * Unchecked, signed solutions. + * + * Together with `SubmissionIndices`, this stores a bounded set of `SignedSubmissions` while + * allowing us to keep only a single one in memory at a time. + * + * Twox note: the key of the map is an auto-incrementing index which users cannot inspect or + * affect; we shouldn't need a cryptographically secure hasher. + */ + SignedSubmissionsMap: StorageDescriptor<[Key: number], Anonymize, true, never>; + /** + * The minimum score that each 'untrusted' solution must attain in order to be considered + * feasible. + * + * Can be set via `set_minimum_untrusted_score`. + */ + MinimumUntrustedScore: StorageDescriptor<[], Anonymize, true, never>; + }; + Nis: { + /** + * The totals of items and balances within each queue. Saves a lot of storage reads in the + * case of sparsely packed queues. + * + * The vector is indexed by duration in `Period`s, offset by one, so information on the queue + * whose duration is one `Period` would be storage `0`. + */ + QueueTotals: StorageDescriptor<[], Anonymize, false, never>; + /** + * The queues of bids. Indexed by duration (in `Period`s). + */ + Queues: StorageDescriptor<[Key: number], Anonymize, false, never>; + /** + * Summary information over the general state. + */ + Summary: StorageDescriptor<[], Anonymize, false, never>; + /** + * The currently outstanding receipts, indexed according to the order of creation. + */ + Receipts: StorageDescriptor<[Key: number], Anonymize, true, never>; + }; + NisCounterpartBalances: { + /** + * The total units issued in the system. + */ + TotalIssuance: StorageDescriptor<[], bigint, false, never>; + /** + * The total units of outstanding deactivated balance in the system. + */ + InactiveIssuance: StorageDescriptor<[], bigint, false, never>; + /** + * The Balances pallet example of storing the balance of an account. + * + * # Example + * + * ```nocompile + * impl pallet_balances::Config for Runtime { + * type AccountStore = StorageMapShim, frame_system::Provider, AccountId, Self::AccountData> + * } + * ``` + * + * You can also store the balance of an account in the `System` pallet. + * + * # Example + * + * ```nocompile + * impl pallet_balances::Config for Runtime { + * type AccountStore = System + * } + * ``` + * + * But this comes with tradeoffs, storing account balances in the system pallet stores + * `frame_system` data alongside the account data contrary to storing account balances in the + * `Balances` pallet, which uses a `StorageMap` to store balances data only. + * NOTE: This is only used in the case that this pallet is used to store balances. + */ + Account: StorageDescriptor<[Key: SS58String], Anonymize, false, never>; + /** + * Any liquidity locks on some account balances. + * NOTE: Should only be accessed when setting, changing and freeing a lock. + * + * Use of locks is deprecated in favour of freezes. See `https://github.com/paritytech/substrate/pull/12951/` + */ + Locks: StorageDescriptor<[Key: SS58String], Anonymize, false, never>; + /** + * Named reserves on some account balances. + * + * Use of reserves is deprecated in favour of holds. See `https://github.com/paritytech/substrate/pull/12951/` + */ + Reserves: StorageDescriptor<[Key: SS58String], Anonymize, false, never>; + /** + * Holds on account balances. + */ + Holds: StorageDescriptor<[Key: SS58String], Anonymize, false, never>; + /** + * Freeze locks on account balances. + */ + Freezes: StorageDescriptor<[Key: SS58String], Anonymize, false, never>; + }; + VoterList: { + /** + * A single node, within some bag. + * + * Nodes store links forward and back within their respective bags. + */ + ListNodes: StorageDescriptor<[Key: SS58String], Anonymize, true, never>; + /** + *Counter for the related counted storage map + */ + CounterForListNodes: StorageDescriptor<[], number, false, never>; + /** + * A bag stored in storage. + * + * Stores a `Bag` struct, which stores head and tail pointers to itself. + */ + ListBags: StorageDescriptor<[Key: bigint], Anonymize, true, never>; + }; + NominationPools: { + /** + * The sum of funds across all pools. + * + * This might be lower but never higher than the sum of `total_balance` of all [`PoolMembers`] + * because calling `pool_withdraw_unbonded` might decrease the total stake of the pool's + * `bonded_account` without adjusting the pallet-internal `UnbondingPool`'s. + */ + TotalValueLocked: StorageDescriptor<[], bigint, false, never>; + /** + * Minimum amount to bond to join a pool. + */ + MinJoinBond: StorageDescriptor<[], bigint, false, never>; + /** + * Minimum bond required to create a pool. + * + * This is the amount that the depositor must put as their initial stake in the pool, as an + * indication of "skin in the game". + * + * This is the value that will always exist in the staking ledger of the pool bonded account + * while all other accounts leave. + */ + MinCreateBond: StorageDescriptor<[], bigint, false, never>; + /** + * Maximum number of nomination pools that can exist. If `None`, then an unbounded number of + * pools can exist. + */ + MaxPools: StorageDescriptor<[], number, true, never>; + /** + * Maximum number of members that can exist in the system. If `None`, then the count + * members are not bound on a system wide basis. + */ + MaxPoolMembers: StorageDescriptor<[], number, true, never>; + /** + * Maximum number of members that may belong to pool. If `None`, then the count of + * members is not bound on a per pool basis. + */ + MaxPoolMembersPerPool: StorageDescriptor<[], number, true, never>; + /** + * The maximum commission that can be charged by a pool. Used on commission payouts to bound + * pool commissions that are > `GlobalMaxCommission`, necessary if a future + * `GlobalMaxCommission` is lower than some current pool commissions. + */ + GlobalMaxCommission: StorageDescriptor<[], number, true, never>; + /** + * Active members. + * + * TWOX-NOTE: SAFE since `AccountId` is a secure hash. + */ + PoolMembers: StorageDescriptor<[Key: SS58String], Anonymize, true, never>; + /** + *Counter for the related counted storage map + */ + CounterForPoolMembers: StorageDescriptor<[], number, false, never>; + /** + * Storage for bonded pools. + */ + BondedPools: StorageDescriptor<[Key: number], Anonymize, true, never>; + /** + *Counter for the related counted storage map + */ + CounterForBondedPools: StorageDescriptor<[], number, false, never>; + /** + * Reward pools. This is where there rewards for each pool accumulate. When a members payout is + * claimed, the balance comes out of the reward pool. Keyed by the bonded pools account. + */ + RewardPools: StorageDescriptor<[Key: number], Anonymize, true, never>; + /** + *Counter for the related counted storage map + */ + CounterForRewardPools: StorageDescriptor<[], number, false, never>; + /** + * Groups of unbonding pools. Each group of unbonding pools belongs to a + * bonded pool, hence the name sub-pools. Keyed by the bonded pools account. + */ + SubPoolsStorage: StorageDescriptor<[Key: number], Anonymize, true, never>; + /** + *Counter for the related counted storage map + */ + CounterForSubPoolsStorage: StorageDescriptor<[], number, false, never>; + /** + * Metadata for the pool. + */ + Metadata: StorageDescriptor<[Key: number], Binary, false, never>; + /** + *Counter for the related counted storage map + */ + CounterForMetadata: StorageDescriptor<[], number, false, never>; + /** + * Ever increasing number of all pools created so far. + */ + LastPoolId: StorageDescriptor<[], number, false, never>; + /** + * A reverse lookup from the pool's account id to its id. + * + * This is only used for slashing and on automatic withdraw update. In all other instances, the + * pool id is used, and the accounts are deterministically derived from it. + */ + ReversePoolIdLookup: StorageDescriptor<[Key: SS58String], number, true, never>; + /** + *Counter for the related counted storage map + */ + CounterForReversePoolIdLookup: StorageDescriptor<[], number, false, never>; + /** + * Map from a pool member account to their opted claim permission. + */ + ClaimPermissions: StorageDescriptor<[Key: SS58String], NominationPoolsClaimPermission, false, never>; + }; + FastUnstake: { + /** + * The current "head of the queue" being unstaked. + * + * The head in itself can be a batch of up to [`Config::BatchSize`] stakers. + */ + Head: StorageDescriptor<[], Anonymize, true, never>; + /** + * The map of all accounts wishing to be unstaked. + * + * Keeps track of `AccountId` wishing to unstake and it's corresponding deposit. + */ + Queue: StorageDescriptor<[Key: SS58String], bigint, true, never>; + /** + *Counter for the related counted storage map + */ + CounterForQueue: StorageDescriptor<[], number, false, never>; + /** + * Number of eras to check per block. + * + * If set to 0, this pallet does absolutely nothing. Cannot be set to more than + * [`Config::MaxErasToCheckPerBlock`]. + * + * Based on the amount of weight available at [`Pallet::on_idle`], up to this many eras are + * checked. The checking is represented by updating [`UnstakeRequest::checked`], which is + * stored in [`Head`]. + */ + ErasToCheckPerBlock: StorageDescriptor<[], number, false, never>; + }; + Configuration: { + /** + * The active configuration for the current session. + */ + ActiveConfig: StorageDescriptor<[], Anonymize, false, never>; + /** + * Pending configuration changes. + * + * This is a list of configuration changes, each with a session index at which it should + * be applied. + * + * The list is sorted ascending by session index. Also, this list can only contain at most + * 2 items: for the next session and for the `scheduled_session`. + */ + PendingConfigs: StorageDescriptor<[], Anonymize, false, never>; + /** + * If this is set, then the configuration setters will bypass the consistency checks. This + * is meant to be used only as the last resort. + */ + BypassConsistencyCheck: StorageDescriptor<[], boolean, false, never>; + }; + ParasShared: { + /** + * The current session index. + */ + CurrentSessionIndex: StorageDescriptor<[], number, false, never>; + /** + * All the validators actively participating in parachain consensus. + * Indices are into the broader validator set. + */ + ActiveValidatorIndices: StorageDescriptor<[], Anonymize, false, never>; + /** + * The parachain attestation keys of the validators actively participating in parachain + * consensus. This should be the same length as `ActiveValidatorIndices`. + */ + ActiveValidatorKeys: StorageDescriptor<[], Anonymize, false, never>; + /** + * All allowed relay-parents. + */ + AllowedRelayParents: StorageDescriptor<[], Anonymize, false, never>; + }; + ParaInclusion: { + /** + * Candidates pending availability by `ParaId`. They form a chain starting from the latest + * included head of the para. + * Use a different prefix post-migration to v1, since the v0 `PendingAvailability` storage + * would otherwise have the exact same prefix which could cause undefined behaviour when doing + * the migration. + */ + V1: StorageDescriptor<[Key: number], Anonymize, true, never>; + }; + ParaInherent: { + /** + * Whether the paras inherent was included within this block. + * + * The `Option<()>` is effectively a `bool`, but it never hits storage in the `None` variant + * due to the guarantees of FRAME's storage APIs. + * + * If this is `None` at the end of the block, we panic and render the block invalid. + */ + Included: StorageDescriptor<[], undefined, true, never>; + /** + * Scraped on chain data for extracting resolved disputes as well as backing votes. + */ + OnChainVotes: StorageDescriptor<[], Anonymize, true, never>; + }; + ParaScheduler: { + /** + * All the validator groups. One for each core. Indices are into `ActiveValidators` - not the + * broader set of Polkadot validators, but instead just the subset used for parachains during + * this session. + * + * Bound: The number of cores is the sum of the numbers of parachains and parathread + * multiplexers. Reasonably, 100-1000. The dominant factor is the number of validators: safe + * upper bound at 10k. + */ + ValidatorGroups: StorageDescriptor<[], Anonymize, false, never>; + /** + * One entry for each availability core. The i'th parachain belongs to the i'th core, with the + * remaining cores all being on demand parachain multiplexers. + * + * Bounded by the maximum of either of these two values: + * * The number of parachains and parathread multiplexers + * * The number of validators divided by `configuration.max_validators_per_core`. + */ + AvailabilityCores: StorageDescriptor<[], Anonymize, false, never>; + /** + * The block number where the session start occurred. Used to track how many group rotations + * have occurred. + * + * Note that in the context of parachains modules the session change is signaled during + * the block and enacted at the end of the block (at the finalization stage, to be exact). + * Thus for all intents and purposes the effect of the session change is observed at the + * block following the session change, block number of which we save in this storage value. + */ + SessionStartBlock: StorageDescriptor<[], number, false, never>; + /** + * One entry for each availability core. The `VecDeque` represents the assignments to be + * scheduled on that core. The value contained here will not be valid after the end of + * a block. Runtime APIs should be used to determine scheduled cores for the upcoming block. + */ + ClaimQueue: StorageDescriptor<[], Anonymize, false, never>; + }; + Paras: { + /** + * All currently active PVF pre-checking votes. + * + * Invariant: + * - There are no PVF pre-checking votes that exists in list but not in the set and vice versa. + */ + PvfActiveVoteMap: StorageDescriptor<[Key: FixedSizeBinary<32>], Anonymize, true, never>; + /** + * The list of all currently active PVF votes. Auxiliary to `PvfActiveVoteMap`. + */ + PvfActiveVoteList: StorageDescriptor<[], Anonymize, false, never>; + /** + * All lease holding parachains. Ordered ascending by `ParaId`. On demand parachains are not + * included. + * + * Consider using the [`ParachainsCache`] type of modifying. + */ + Parachains: StorageDescriptor<[], Anonymize, false, never>; + /** + * The current lifecycle of a all known Para IDs. + */ + ParaLifecycles: StorageDescriptor<[Key: number], ParachainsParasParaLifecycle, true, never>; + /** + * The head-data of every registered para. + */ + Heads: StorageDescriptor<[Key: number], Binary, true, never>; + /** + * The context (relay-chain block number) of the most recent parachain head. + */ + MostRecentContext: StorageDescriptor<[Key: number], number, true, never>; + /** + * The validation code hash of every live para. + * + * Corresponding code can be retrieved with [`CodeByHash`]. + */ + CurrentCodeHash: StorageDescriptor<[Key: number], FixedSizeBinary<32>, true, never>; + /** + * Actual past code hash, indicated by the para id as well as the block number at which it + * became outdated. + * + * Corresponding code can be retrieved with [`CodeByHash`]. + */ + PastCodeHash: StorageDescriptor<[Key: Anonymize], FixedSizeBinary<32>, true, never>; + /** + * Past code of parachains. The parachains themselves may not be registered anymore, + * but we also keep their code on-chain for the same amount of time as outdated code + * to keep it available for approval checkers. + */ + PastCodeMeta: StorageDescriptor<[Key: number], Anonymize, false, never>; + /** + * Which paras have past code that needs pruning and the relay-chain block at which the code + * was replaced. Note that this is the actual height of the included block, not the expected + * height at which the code upgrade would be applied, although they may be equal. + * This is to ensure the entire acceptance period is covered, not an offset acceptance period + * starting from the time at which the parachain perceives a code upgrade as having occurred. + * Multiple entries for a single para are permitted. Ordered ascending by block number. + */ + PastCodePruning: StorageDescriptor<[], Anonymize, false, never>; + /** + * The block number at which the planned code change is expected for a parachain. + * + * The change will be applied after the first parablock for this ID included which executes + * in the context of a relay chain block with a number >= `expected_at`. + */ + FutureCodeUpgrades: StorageDescriptor<[Key: number], number, true, never>; + /** + * The list of upcoming future code upgrades. + * + * Each item is a pair of the parachain and the expected block at which the upgrade should be + * applied. The upgrade will be applied at the given relay chain block. In contrast to + * [`FutureCodeUpgrades`] this code upgrade will be applied regardless the parachain making any + * progress or not. + * + * Ordered ascending by block number. + */ + FutureCodeUpgradesAt: StorageDescriptor<[], Anonymize, false, never>; + /** + * The actual future code hash of a para. + * + * Corresponding code can be retrieved with [`CodeByHash`]. + */ + FutureCodeHash: StorageDescriptor<[Key: number], FixedSizeBinary<32>, true, never>; + /** + * This is used by the relay-chain to communicate to a parachain a go-ahead with in the upgrade + * procedure. + * + * This value is absent when there are no upgrades scheduled or during the time the relay chain + * performs the checks. It is set at the first relay-chain block when the corresponding + * parachain can switch its upgrade function. As soon as the parachain's block is included, the + * value gets reset to `None`. + * + * NOTE that this field is used by parachains via merkle storage proofs, therefore changing + * the format will require migration of parachains. + */ + UpgradeGoAheadSignal: StorageDescriptor<[Key: number], UpgradeGoAhead, true, never>; + /** + * This is used by the relay-chain to communicate that there are restrictions for performing + * an upgrade for this parachain. + * + * This may be a because the parachain waits for the upgrade cooldown to expire. Another + * potential use case is when we want to perform some maintenance (such as storage migration) + * we could restrict upgrades to make the process simpler. + * + * NOTE that this field is used by parachains via merkle storage proofs, therefore changing + * the format will require migration of parachains. + */ + UpgradeRestrictionSignal: StorageDescriptor<[Key: number], UpgradeRestriction, true, never>; + /** + * The list of parachains that are awaiting for their upgrade restriction to cooldown. + * + * Ordered ascending by block number. + */ + UpgradeCooldowns: StorageDescriptor<[], Anonymize, false, never>; + /** + * The list of upcoming code upgrades. + * + * Each item is a pair of which para performs a code upgrade and at which relay-chain block it + * is expected at. + * + * Ordered ascending by block number. + */ + UpcomingUpgrades: StorageDescriptor<[], Anonymize, false, never>; + /** + * The actions to perform during the start of a specific session index. + */ + ActionsQueue: StorageDescriptor<[Key: number], Anonymize, false, never>; + /** + * Upcoming paras instantiation arguments. + * + * NOTE that after PVF pre-checking is enabled the para genesis arg will have it's code set + * to empty. Instead, the code will be saved into the storage right away via `CodeByHash`. + */ + UpcomingParasGenesis: StorageDescriptor<[Key: number], Anonymize, true, never>; + /** + * The number of reference on the validation code in [`CodeByHash`] storage. + */ + CodeByHashRefs: StorageDescriptor<[Key: FixedSizeBinary<32>], number, false, never>; + /** + * Validation code stored by its hash. + * + * This storage is consistent with [`FutureCodeHash`], [`CurrentCodeHash`] and + * [`PastCodeHash`]. + */ + CodeByHash: StorageDescriptor<[Key: FixedSizeBinary<32>], Binary, true, never>; + }; + Initializer: { + /** + * Whether the parachains modules have been initialized within this block. + * + * Semantically a `bool`, but this guarantees it should never hit the trie, + * as this is cleared in `on_finalize` and Frame optimizes `None` values to be empty values. + * + * As a `bool`, `set(false)` and `remove()` both lead to the next `get()` being false, but one + * of them writes to the trie and one does not. This confusion makes `Option<()>` more suitable + * for the semantics of this variable. + */ + HasInitialized: StorageDescriptor<[], undefined, true, never>; + /** + * Buffered session changes along with the block number at which they should be applied. + * + * Typically this will be empty or one element long. Apart from that this item never hits + * the storage. + * + * However this is a `Vec` regardless to handle various edge cases that may occur at runtime + * upgrade boundaries or if governance intervenes. + */ + BufferedSessionChanges: StorageDescriptor<[], Anonymize, false, never>; + }; + Dmp: { + /** + * The downward messages addressed for a certain para. + */ + DownwardMessageQueues: StorageDescriptor<[Key: number], Anonymize, false, never>; + /** + * A mapping that stores the downward message queue MQC head for each para. + * + * Each link in this chain has a form: + * `(prev_head, B, H(M))`, where + * - `prev_head`: is the previous head hash or zero if none. + * - `B`: is the relay-chain block number in which a message was appended. + * - `H(M)`: is the hash of the message being appended. + */ + DownwardMessageQueueHeads: StorageDescriptor<[Key: number], FixedSizeBinary<32>, false, never>; + /** + * The factor to multiply the base delivery fee by. + */ + DeliveryFeeFactor: StorageDescriptor<[Key: number], bigint, false, never>; + }; + Hrmp: { + /** + * The set of pending HRMP open channel requests. + * + * The set is accompanied by a list for iteration. + * + * Invariant: + * - There are no channels that exists in list but not in the set and vice versa. + */ + HrmpOpenChannelRequests: StorageDescriptor<[Key: Anonymize], Anonymize, true, never>; + /** + + */ + HrmpOpenChannelRequestsList: StorageDescriptor<[], Anonymize, false, never>; + /** + * This mapping tracks how many open channel requests are initiated by a given sender para. + * Invariant: `HrmpOpenChannelRequests` should contain the same number of items that has + * `(X, _)` as the number of `HrmpOpenChannelRequestCount` for `X`. + */ + HrmpOpenChannelRequestCount: StorageDescriptor<[Key: number], number, false, never>; + /** + * This mapping tracks how many open channel requests were accepted by a given recipient para. + * Invariant: `HrmpOpenChannelRequests` should contain the same number of items `(_, X)` with + * `confirmed` set to true, as the number of `HrmpAcceptedChannelRequestCount` for `X`. + */ + HrmpAcceptedChannelRequestCount: StorageDescriptor<[Key: number], number, false, never>; + /** + * A set of pending HRMP close channel requests that are going to be closed during the session + * change. Used for checking if a given channel is registered for closure. + * + * The set is accompanied by a list for iteration. + * + * Invariant: + * - There are no channels that exists in list but not in the set and vice versa. + */ + HrmpCloseChannelRequests: StorageDescriptor<[Key: Anonymize], undefined, true, never>; + /** + + */ + HrmpCloseChannelRequestsList: StorageDescriptor<[], Anonymize, false, never>; + /** + * The HRMP watermark associated with each para. + * Invariant: + * - each para `P` used here as a key should satisfy `Paras::is_valid_para(P)` within a + * session. + */ + HrmpWatermarks: StorageDescriptor<[Key: number], number, true, never>; + /** + * HRMP channel data associated with each para. + * Invariant: + * - each participant in the channel should satisfy `Paras::is_valid_para(P)` within a session. + */ + HrmpChannels: StorageDescriptor<[Key: Anonymize], Anonymize, true, never>; + /** + * Ingress/egress indexes allow to find all the senders and receivers given the opposite side. + * I.e. + * + * (a) ingress index allows to find all the senders for a given recipient. + * (b) egress index allows to find all the recipients for a given sender. + * + * Invariants: + * - for each ingress index entry for `P` each item `I` in the index should present in + * `HrmpChannels` as `(I, P)`. + * - for each egress index entry for `P` each item `E` in the index should present in + * `HrmpChannels` as `(P, E)`. + * - there should be no other dangling channels in `HrmpChannels`. + * - the vectors are sorted. + */ + HrmpIngressChannelsIndex: StorageDescriptor<[Key: number], Anonymize, false, never>; + /** + + */ + HrmpEgressChannelsIndex: StorageDescriptor<[Key: number], Anonymize, false, never>; + /** + * Storage for the messages for each channel. + * Invariant: cannot be non-empty if the corresponding channel in `HrmpChannels` is `None`. + */ + HrmpChannelContents: StorageDescriptor<[Key: Anonymize], Anonymize, false, never>; + /** + * Maintains a mapping that can be used to answer the question: What paras sent a message at + * the given block number for a given receiver. Invariants: + * - The inner `Vec` is never empty. + * - The inner `Vec` cannot store two same `ParaId`. + * - The outer vector is sorted ascending by block number and cannot store two items with the + * same block number. + */ + HrmpChannelDigests: StorageDescriptor<[Key: number], Anonymize, false, never>; + }; + ParaSessionInfo: { + /** + * Assignment keys for the current session. + * Note that this API is private due to it being prone to 'off-by-one' at session boundaries. + * When in doubt, use `Sessions` API instead. + */ + AssignmentKeysUnsafe: StorageDescriptor<[], Anonymize, false, never>; + /** + * The earliest session for which previous session info is stored. + */ + EarliestStoredSession: StorageDescriptor<[], number, false, never>; + /** + * Session information in a rolling window. + * Should have an entry in range `EarliestStoredSession..=CurrentSessionIndex`. + * Does not have any entries before the session index in the first session change notification. + */ + Sessions: StorageDescriptor<[Key: number], Anonymize, true, never>; + /** + * The validator account keys of the validators actively participating in parachain consensus. + */ + AccountKeys: StorageDescriptor<[Key: number], Anonymize, true, never>; + /** + * Executor parameter set for a given session index + */ + SessionExecutorParams: StorageDescriptor<[Key: number], Anonymize, true, never>; + }; + ParasDisputes: { + /** + * The last pruned session, if any. All data stored by this module + * references sessions. + */ + LastPrunedSession: StorageDescriptor<[], number, true, never>; + /** + * All ongoing or concluded disputes for the last several sessions. + */ + Disputes: StorageDescriptor, Anonymize, true, never>; + /** + * Backing votes stored for each dispute. + * This storage is used for slashing. + */ + BackersOnDisputes: StorageDescriptor, Anonymize, true, never>; + /** + * All included blocks on the chain, as well as the block number in this chain that + * should be reverted back to if the candidate is disputed and determined to be invalid. + */ + Included: StorageDescriptor, number, true, never>; + /** + * Whether the chain is frozen. Starts as `None`. When this is `Some`, + * the chain will not accept any new parachain blocks for backing or inclusion, + * and its value indicates the last valid block number in the chain. + * It can only be set back to `None` by governance intervention. + */ + Frozen: StorageDescriptor<[], Anonymize, false, never>; + }; + ParasSlashing: { + /** + * Validators pending dispute slashes. + */ + UnappliedSlashes: StorageDescriptor, Anonymize, true, never>; + /** + * `ValidatorSetCount` per session. + */ + ValidatorSetCounts: StorageDescriptor<[Key: number], number, true, never>; + }; + OnDemandAssignmentProvider: { + /** + * Maps a `ParaId` to `CoreIndex` and keeps track of how many assignments the scheduler has in + * it's lookahead. Keeping track of this affinity prevents parallel execution of the same + * `ParaId` on two or more `CoreIndex`es. + */ + ParaIdAffinity: StorageDescriptor<[Key: number], Anonymize, true, never>; + /** + * Overall status of queue (both free + affinity entries) + */ + QueueStatus: StorageDescriptor<[], Anonymize, false, never>; + /** + * Priority queue for all orders which don't yet (or not any more) have any core affinity. + */ + FreeEntries: StorageDescriptor<[], Anonymize, false, never>; + /** + * Queue entries that are currently bound to a particular core due to core affinity. + */ + AffinityEntries: StorageDescriptor<[Key: number], Anonymize, false, never>; + /** + * Keeps track of accumulated revenue from on demand order sales. + */ + Revenue: StorageDescriptor<[], Anonymize, false, never>; + }; + CoretimeAssignmentProvider: { + /** + * Scheduled assignment sets. + * + * Assignments as of the given block number. They will go into state once the block number is + * reached (and replace whatever was in there before). + */ + CoreSchedules: StorageDescriptor<[Key: Anonymize], Anonymize, true, "0">; + /** + * Assignments which are currently active. + * + * They will be picked from `PendingAssignments` once we reach the scheduled block number in + * `PendingAssignments`. + */ + CoreDescriptors: StorageDescriptor<[Key: number], Anonymize, false, "0">; + }; + Registrar: { + /** + * Pending swap operations. + */ + PendingSwap: StorageDescriptor<[Key: number], number, true, never>; + /** + * Amount held on deposit for each para and the original depositor. + * + * The given account ID is responsible for registering the code and initial head data, but may + * only do so if it isn't yet registered. (After that, it's up to governance to do so.) + */ + Paras: StorageDescriptor<[Key: number], Anonymize, true, never>; + /** + * The next free `ParaId`. + */ + NextFreeParaId: StorageDescriptor<[], number, false, never>; + }; + Slots: { + /** + * Amounts held on deposit for each (possibly future) leased parachain. + * + * The actual amount locked on its behalf by any account at any time is the maximum of the + * second values of the items in this list whose first value is the account. + * + * The first item in the list is the amount locked for the current Lease Period. Following + * items are for the subsequent lease periods. + * + * The default value (an empty list) implies that the parachain no longer exists (or never + * existed) as far as this pallet is concerned. + * + * If a parachain doesn't exist *yet* but is scheduled to exist in the future, then it + * will be left-padded with one or more `None`s to denote the fact that nothing is held on + * deposit for the non-existent chain currently, but is held at some point in the future. + * + * It is illegal for a `None` value to trail in the list. + */ + Leases: StorageDescriptor<[Key: number], Anonymize, false, never>; + }; + Auctions: { + /** + * Number of auctions started so far. + */ + AuctionCounter: StorageDescriptor<[], number, false, never>; + /** + * Information relating to the current auction, if there is one. + * + * The first item in the tuple is the lease period index that the first of the four + * contiguous lease periods on auction is for. The second is the block number when the + * auction will "begin to end", i.e. the first block of the Ending Period of the auction. + */ + AuctionInfo: StorageDescriptor<[], Anonymize, true, never>; + /** + * Amounts currently reserved in the accounts of the bidders currently winning + * (sub-)ranges. + */ + ReservedAmounts: StorageDescriptor<[Key: Anonymize], bigint, true, never>; + /** + * The winning bids for each of the 10 ranges at each sample in the final Ending Period of + * the current auction. The map's key is the 0-based index into the Sample Size. The + * first sample of the ending period is 0; the last is `Sample Size - 1`. + */ + Winning: StorageDescriptor<[Key: number], Anonymize, true, never>; + }; + Crowdloan: { + /** + * Info on all of the funds. + */ + Funds: StorageDescriptor<[Key: number], Anonymize, true, never>; + /** + * The funds that have had additional contributions during the last block. This is used + * in order to determine which funds should submit new or updated bids. + */ + NewRaise: StorageDescriptor<[], Anonymize, false, never>; + /** + * The number of auctions that have entered into their ending period so far. + */ + EndingsCount: StorageDescriptor<[], number, false, never>; + /** + * Tracker for the next available fund index + */ + NextFundIndex: StorageDescriptor<[], number, false, never>; + }; + XcmPallet: { + /** + * The latest available query index. + */ + QueryCounter: StorageDescriptor<[], bigint, false, never>; + /** + * The ongoing queries. + */ + Queries: StorageDescriptor<[Key: bigint], XcmPalletQueryStatus, true, never>; + /** + * The existing asset traps. + * + * Key is the blake2 256 hash of (origin, versioned `Assets`) pair. Value is the number of + * times this pair has been trapped (usually just 1 if it exists at all). + */ + AssetTraps: StorageDescriptor<[Key: FixedSizeBinary<32>], number, false, never>; + /** + * Default version to encode XCM when latest version of destination is unknown. If `None`, + * then the destinations whose XCM version is unknown are considered unreachable. + */ + SafeXcmVersion: StorageDescriptor<[], number, true, never>; + /** + * The Latest versions that we know various locations support. + */ + SupportedVersion: StorageDescriptor, number, true, never>; + /** + * All locations that we have requested version notifications from. + */ + VersionNotifiers: StorageDescriptor, bigint, true, never>; + /** + * The target locations that are subscribed to our version changes, as well as the most recent + * of our versions we informed them of. + */ + VersionNotifyTargets: StorageDescriptor, Anonymize, true, never>; + /** + * Destinations whose latest XCM version we would like to know. Duplicates not allowed, and + * the `u32` counter is the number of times that a send to the destination has been attempted, + * which is used as a prioritization. + */ + VersionDiscoveryQueue: StorageDescriptor<[], Anonymize, false, never>; + /** + * The current migration's stage, if any. + */ + CurrentMigration: StorageDescriptor<[], XcmPalletVersionMigrationStage, true, never>; + /** + * Fungible assets which we know are locked on a remote chain. + */ + RemoteLockedFungibles: StorageDescriptor, Anonymize, true, never>; + /** + * Fungible assets which we know are locked on this chain. + */ + LockedFungibles: StorageDescriptor<[Key: SS58String], Anonymize, true, never>; + /** + * Global suspension state of the XCM executor. + */ + XcmExecutionSuspended: StorageDescriptor<[], boolean, false, never>; + /** + * Whether or not incoming XCMs (both executed locally and received) should be recorded. + * Only one XCM program will be recorded at a time. + * This is meant to be used in runtime APIs, and it's advised it stays false + * for all other use cases, so as to not degrade regular performance. + * + * Only relevant if this pallet is being used as the [`xcm_executor::traits::RecordXcm`] + * implementation in the XCM executor configuration. + */ + ShouldRecordXcm: StorageDescriptor<[], boolean, false, never>; + /** + * If [`ShouldRecordXcm`] is set to true, then the last XCM program executed locally + * will be stored here. + * Runtime APIs can fetch the XCM that was executed by accessing this value. + * + * Only relevant if this pallet is being used as the [`xcm_executor::traits::RecordXcm`] + * implementation in the XCM executor configuration. + */ + RecordedXcm: StorageDescriptor<[], Anonymize, true, never>; + }; + MessageQueue: { + /** + * The index of the first and last (non-empty) pages. + */ + BookStateFor: StorageDescriptor<[Key: ParachainsInclusionAggregateMessageOrigin], Anonymize, false, never>; + /** + * The origin at which we should begin servicing. + */ + ServiceHead: StorageDescriptor<[], ParachainsInclusionAggregateMessageOrigin, true, never>; + /** + * The map of page indices to pages. + */ + Pages: StorageDescriptor, Anonymize, true, never>; + }; + AssetRate: { + /** + * Maps an asset to its fixed point representation in the native balance. + * + * E.g. `native_amount = asset_amount * ConversionRateToNative::::get(asset_kind)` + */ + ConversionRateToNative: StorageDescriptor<[Key: VersionedLocatableAsset], bigint, true, never>; + }; + Beefy: { + /** + * The current authorities set + */ + Authorities: StorageDescriptor<[], Anonymize, false, never>; + /** + * The current validator set id + */ + ValidatorSetId: StorageDescriptor<[], bigint, false, never>; + /** + * Authorities set scheduled to be used with the next session + */ + NextAuthorities: StorageDescriptor<[], Anonymize, false, never>; + /** + * A mapping from BEEFY set ID to the index of the *most recent* session for which its + * members were responsible. + * + * This is only used for validating equivocation proofs. An equivocation proof must + * contains a key-ownership proof for a given session, therefore we need a way to tie + * together sessions and BEEFY set ids, i.e. we need to validate that a validator + * was the owner of a given key on a given session, and what the active set ID was + * during that session. + * + * TWOX-NOTE: `ValidatorSetId` is not under user control. + */ + SetIdSession: StorageDescriptor<[Key: bigint], number, true, never>; + /** + * Block number where BEEFY consensus is enabled/started. + * By changing this (through privileged `set_new_genesis()`), BEEFY consensus is effectively + * restarted from the newly set block number. + */ + GenesisBlock: StorageDescriptor<[], Anonymize, false, never>; + }; + Mmr: { + /** + * Latest MMR Root hash. + */ + RootHash: StorageDescriptor<[], FixedSizeBinary<32>, false, never>; + /** + * Current size of the MMR (number of leaves). + */ + NumberOfLeaves: StorageDescriptor<[], bigint, false, never>; + /** + * Hashes of the nodes in the MMR. + * + * Note this collection only contains MMR peaks, the inner nodes (and leaves) + * are pruned and only stored in the Offchain DB. + */ + Nodes: StorageDescriptor<[Key: bigint], FixedSizeBinary<32>, true, never>; + }; + BeefyMmrLeaf: { + /** + * Details of current BEEFY authority set. + */ + BeefyAuthorities: StorageDescriptor<[], Anonymize, false, never>; + /** + * Details of next BEEFY authority set. + * + * This storage entry is used as cache for calls to `update_beefy_next_authority_set`. + */ + BeefyNextAuthorities: StorageDescriptor<[], Anonymize, false, never>; + }; +}; +type ICalls = { + System: { + /** + *Make some on-chain remark. + * + *Can be executed by every `origin`. + */ + remark: TxDescriptor>; + /** + *Set the number of pages in the WebAssembly environment's heap. + */ + set_heap_pages: TxDescriptor>; + /** + *Set the new runtime code. + */ + set_code: TxDescriptor>; + /** + *Set the new runtime code without doing any checks of the given `code`. + * + *Note that runtime upgrades will not run if this is called with a not-increasing spec + *version! + */ + set_code_without_checks: TxDescriptor>; + /** + *Set some items of storage. + */ + set_storage: TxDescriptor>; + /** + *Kill some items from storage. + */ + kill_storage: TxDescriptor>; + /** + *Kill all storage items with a key that starts with the given prefix. + * + ***NOTE:** We rely on the Root origin to provide us the number of subkeys under + *the prefix we are removing to accurately calculate the weight of this function. + */ + kill_prefix: TxDescriptor>; + /** + *Make some on-chain remark and emit event. + */ + remark_with_event: TxDescriptor>; + /** + *Authorize an upgrade to a given `code_hash` for the runtime. The runtime can be supplied + *later. + * + *This call requires Root origin. + */ + authorize_upgrade: TxDescriptor>; + /** + *Authorize an upgrade to a given `code_hash` for the runtime. The runtime can be supplied + *later. + * + *WARNING: This authorizes an upgrade that will take place without any safety checks, for + *example that the spec name remains the same and that the version number increases. Not + *recommended for normal use. Use `authorize_upgrade` instead. + * + *This call requires Root origin. + */ + authorize_upgrade_without_checks: TxDescriptor>; + /** + *Provide the preimage (runtime binary) `code` for an upgrade that has been authorized. + * + *If the authorization required a version check, this call will ensure the spec name + *remains unchanged and that the spec version has increased. + * + *Depending on the runtime's `OnSetCode` configuration, this function may directly apply + *the new `code` in the same block or attempt to schedule the upgrade. + * + *All origins are allowed. + */ + apply_authorized_upgrade: TxDescriptor>; + }; + Babe: { + /** + *Report authority equivocation/misbehavior. This method will verify + *the equivocation proof and validate the given key ownership proof + *against the extracted offender. If both are valid, the offence will + *be reported. + */ + report_equivocation: TxDescriptor>; + /** + *Report authority equivocation/misbehavior. This method will verify + *the equivocation proof and validate the given key ownership proof + *against the extracted offender. If both are valid, the offence will + *be reported. + *This extrinsic must be called unsigned and it is expected that only + *block authors will call it (validated in `ValidateUnsigned`), as such + *if the block author is defined it will be defined as the equivocation + *reporter. + */ + report_equivocation_unsigned: TxDescriptor>; + /** + *Plan an epoch config change. The epoch config change is recorded and will be enacted on + *the next call to `enact_epoch_change`. The config will be activated one epoch after. + *Multiple calls to this method will replace any existing planned config change that had + *not been enacted yet. + */ + plan_config_change: TxDescriptor>; + }; + Timestamp: { + /** + *Set the current time. + * + *This call should be invoked exactly once per block. It will panic at the finalization + *phase, if this call hasn't been invoked by that time. + * + *The timestamp should be greater than the previous one by the amount specified by + *[`Config::MinimumPeriod`]. + * + *The dispatch origin for this call must be _None_. + * + *This dispatch class is _Mandatory_ to ensure it gets executed in the block. Be aware + *that changing the complexity of this call could result exhausting the resources in a + *block to execute any other calls. + * + *## Complexity + *- `O(1)` (Note that implementations of `OnTimestampSet` must also be `O(1)`) + *- 1 storage read and 1 storage mutation (codec `O(1)` because of `DidUpdate::take` in + * `on_finalize`) + *- 1 event handler `on_timestamp_set`. Must be `O(1)`. + */ + set: TxDescriptor>; + }; + Indices: { + /** + *Assign an previously unassigned index. + * + *Payment: `Deposit` is reserved from the sender account. + * + *The dispatch origin for this call must be _Signed_. + * + *- `index`: the index to be claimed. This must not be in use. + * + *Emits `IndexAssigned` if successful. + * + *## Complexity + *- `O(1)`. + */ + claim: TxDescriptor>; + /** + *Assign an index already owned by the sender to another account. The balance reservation + *is effectively transferred to the new account. + * + *The dispatch origin for this call must be _Signed_. + * + *- `index`: the index to be re-assigned. This must be owned by the sender. + *- `new`: the new owner of the index. This function is a no-op if it is equal to sender. + * + *Emits `IndexAssigned` if successful. + * + *## Complexity + *- `O(1)`. + */ + transfer: TxDescriptor>; + /** + *Free up an index owned by the sender. + * + *Payment: Any previous deposit placed for the index is unreserved in the sender account. + * + *The dispatch origin for this call must be _Signed_ and the sender must own the index. + * + *- `index`: the index to be freed. This must be owned by the sender. + * + *Emits `IndexFreed` if successful. + * + *## Complexity + *- `O(1)`. + */ + free: TxDescriptor>; + /** + *Force an index to an account. This doesn't require a deposit. If the index is already + *held, then any deposit is reimbursed to its current owner. + * + *The dispatch origin for this call must be _Root_. + * + *- `index`: the index to be (re-)assigned. + *- `new`: the new owner of the index. This function is a no-op if it is equal to sender. + *- `freeze`: if set to `true`, will freeze the index so it cannot be transferred. + * + *Emits `IndexAssigned` if successful. + * + *## Complexity + *- `O(1)`. + */ + force_transfer: TxDescriptor>; + /** + *Freeze an index so it will always point to the sender account. This consumes the + *deposit. + * + *The dispatch origin for this call must be _Signed_ and the signing account must have a + *non-frozen account `index`. + * + *- `index`: the index to be frozen in place. + * + *Emits `IndexFrozen` if successful. + * + *## Complexity + *- `O(1)`. + */ + freeze: TxDescriptor>; + }; + Balances: { + /** + *Transfer some liquid free balance to another account. + * + *`transfer_allow_death` will set the `FreeBalance` of the sender and receiver. + *If the sender's account is below the existential deposit as a result + *of the transfer, the account will be reaped. + * + *The dispatch origin for this call must be `Signed` by the transactor. + */ + transfer_allow_death: TxDescriptor>; + /** + *Exactly as `transfer_allow_death`, except the origin must be root and the source account + *may be specified. + */ + force_transfer: TxDescriptor>; + /** + *Same as the [`transfer_allow_death`] call, but with a check that the transfer will not + *kill the origin account. + * + *99% of the time you want [`transfer_allow_death`] instead. + * + *[`transfer_allow_death`]: struct.Pallet.html#method.transfer + */ + transfer_keep_alive: TxDescriptor>; + /** + *Transfer the entire transferable balance from the caller account. + * + *NOTE: This function only attempts to transfer _transferable_ balances. This means that + *any locked, reserved, or existential deposits (when `keep_alive` is `true`), will not be + *transferred by this function. To ensure that this function results in a killed account, + *you might need to prepare the account by removing any reference counters, storage + *deposits, etc... + * + *The dispatch origin of this call must be Signed. + * + *- `dest`: The recipient of the transfer. + *- `keep_alive`: A boolean to determine if the `transfer_all` operation should send all + * of the funds the account has, causing the sender account to be killed (false), or + * transfer everything except at least the existential deposit, which will guarantee to + * keep the sender account alive (true). + */ + transfer_all: TxDescriptor>; + /** + *Unreserve some balance from a user by force. + * + *Can only be called by ROOT. + */ + force_unreserve: TxDescriptor>; + /** + *Upgrade a specified account. + * + *- `origin`: Must be `Signed`. + *- `who`: The account to be upgraded. + * + *This will waive the transaction fee if at least all but 10% of the accounts needed to + *be upgraded. (We let some not have to be upgraded just in order to allow for the + *possibility of churn). + */ + upgrade_accounts: TxDescriptor>; + /** + *Set the regular balance of a given account. + * + *The dispatch origin for this call is `root`. + */ + force_set_balance: TxDescriptor>; + /** + *Adjust the total issuance in a saturating way. + * + *Can only be called by root and always needs a positive `delta`. + * + *# Example + */ + force_adjust_total_issuance: TxDescriptor>; + /** + *Burn the specified liquid free balance from the origin account. + * + *If the origin's account ends up below the existential deposit as a result + *of the burn and `keep_alive` is false, the account will be reaped. + * + *Unlike sending funds to a _burn_ address, which merely makes the funds inaccessible, + *this `burn` operation will reduce total issuance by the amount _burned_. + */ + burn: TxDescriptor>; + }; + Staking: { + /** + *Take the origin account as a stash and lock up `value` of its balance. `controller` will + *be the account that controls it. + * + *`value` must be more than the `minimum_balance` specified by `T::Currency`. + * + *The dispatch origin for this call must be _Signed_ by the stash account. + * + *Emits `Bonded`. + *## Complexity + *- Independent of the arguments. Moderate complexity. + *- O(1). + *- Three extra DB entries. + * + *NOTE: Two of the storage writes (`Self::bonded`, `Self::payee`) are _never_ cleaned + *unless the `origin` falls below _existential deposit_ (or equal to 0) and gets removed + *as dust. + */ + bond: TxDescriptor>; + /** + *Add some extra amount that have appeared in the stash `free_balance` into the balance up + *for staking. + * + *The dispatch origin for this call must be _Signed_ by the stash, not the controller. + * + *Use this if there are additional funds in your stash account that you wish to bond. + *Unlike [`bond`](Self::bond) or [`unbond`](Self::unbond) this function does not impose + *any limitation on the amount that can be added. + * + *Emits `Bonded`. + * + *## Complexity + *- Independent of the arguments. Insignificant complexity. + *- O(1). + */ + bond_extra: TxDescriptor>; + /** + *Schedule a portion of the stash to be unlocked ready for transfer out after the bond + *period ends. If this leaves an amount actively bonded less than + *T::Currency::minimum_balance(), then it is increased to the full amount. + * + *The dispatch origin for this call must be _Signed_ by the controller, not the stash. + * + *Once the unlock period is done, you can call `withdraw_unbonded` to actually move + *the funds out of management ready for transfer. + * + *No more than a limited number of unlocking chunks (see `MaxUnlockingChunks`) + *can co-exists at the same time. If there are no unlocking chunks slots available + *[`Call::withdraw_unbonded`] is called to remove some of the chunks (if possible). + * + *If a user encounters the `InsufficientBond` error when calling this extrinsic, + *they should call `chill` first in order to free up their bonded funds. + * + *Emits `Unbonded`. + * + *See also [`Call::withdraw_unbonded`]. + */ + unbond: TxDescriptor>; + /** + *Remove any unlocked chunks from the `unlocking` queue from our management. + * + *This essentially frees up that balance to be used by the stash account to do whatever + *it wants. + * + *The dispatch origin for this call must be _Signed_ by the controller. + * + *Emits `Withdrawn`. + * + *See also [`Call::unbond`]. + * + *## Parameters + * + *- `num_slashing_spans` indicates the number of metadata slashing spans to clear when + *this call results in a complete removal of all the data related to the stash account. + *In this case, the `num_slashing_spans` must be larger or equal to the number of + *slashing spans associated with the stash account in the [`SlashingSpans`] storage type, + *otherwise the call will fail. The call weight is directly proportional to + *`num_slashing_spans`. + * + *## Complexity + *O(S) where S is the number of slashing spans to remove + *NOTE: Weight annotation is the kill scenario, we refund otherwise. + */ + withdraw_unbonded: TxDescriptor>; + /** + *Declare the desire to validate for the origin controller. + * + *Effects will be felt at the beginning of the next era. + * + *The dispatch origin for this call must be _Signed_ by the controller, not the stash. + */ + validate: TxDescriptor>; + /** + *Declare the desire to nominate `targets` for the origin controller. + * + *Effects will be felt at the beginning of the next era. + * + *The dispatch origin for this call must be _Signed_ by the controller, not the stash. + * + *## Complexity + *- The transaction's complexity is proportional to the size of `targets` (N) + *which is capped at CompactAssignments::LIMIT (T::MaxNominations). + *- Both the reads and writes follow a similar pattern. + */ + nominate: TxDescriptor>; + /** + *Declare no desire to either validate or nominate. + * + *Effects will be felt at the beginning of the next era. + * + *The dispatch origin for this call must be _Signed_ by the controller, not the stash. + * + *## Complexity + *- Independent of the arguments. Insignificant complexity. + *- Contains one read. + *- Writes are limited to the `origin` account key. + */ + chill: TxDescriptor; + /** + *(Re-)set the payment target for a controller. + * + *Effects will be felt instantly (as soon as this function is completed successfully). + * + *The dispatch origin for this call must be _Signed_ by the controller, not the stash. + * + *## Complexity + *- O(1) + *- Independent of the arguments. Insignificant complexity. + *- Contains a limited number of reads. + *- Writes are limited to the `origin` account key. + *--------- + */ + set_payee: TxDescriptor>; + /** + *(Re-)sets the controller of a stash to the stash itself. This function previously + *accepted a `controller` argument to set the controller to an account other than the + *stash itself. This functionality has now been removed, now only setting the controller + *to the stash, if it is not already. + * + *Effects will be felt instantly (as soon as this function is completed successfully). + * + *The dispatch origin for this call must be _Signed_ by the stash, not the controller. + * + *## Complexity + *O(1) + *- Independent of the arguments. Insignificant complexity. + *- Contains a limited number of reads. + *- Writes are limited to the `origin` account key. + */ + set_controller: TxDescriptor; + /** + *Sets the ideal number of validators. + * + *The dispatch origin must be Root. + * + *## Complexity + *O(1) + */ + set_validator_count: TxDescriptor>; + /** + *Increments the ideal number of validators up to maximum of + *`ElectionProviderBase::MaxWinners`. + * + *The dispatch origin must be Root. + * + *## Complexity + *Same as [`Self::set_validator_count`]. + */ + increase_validator_count: TxDescriptor>; + /** + *Scale up the ideal number of validators by a factor up to maximum of + *`ElectionProviderBase::MaxWinners`. + * + *The dispatch origin must be Root. + * + *## Complexity + *Same as [`Self::set_validator_count`]. + */ + scale_validator_count: TxDescriptor>; + /** + *Force there to be no new eras indefinitely. + * + *The dispatch origin must be Root. + * + *# Warning + * + *The election process starts multiple blocks before the end of the era. + *Thus the election process may be ongoing when this is called. In this case the + *election will continue until the next era is triggered. + * + *## Complexity + *- No arguments. + *- Weight: O(1) + */ + force_no_eras: TxDescriptor; + /** + *Force there to be a new era at the end of the next session. After this, it will be + *reset to normal (non-forced) behaviour. + * + *The dispatch origin must be Root. + * + *# Warning + * + *The election process starts multiple blocks before the end of the era. + *If this is called just before a new era is triggered, the election process may not + *have enough blocks to get a result. + * + *## Complexity + *- No arguments. + *- Weight: O(1) + */ + force_new_era: TxDescriptor; + /** + *Set the validators who cannot be slashed (if any). + * + *The dispatch origin must be Root. + */ + set_invulnerables: TxDescriptor>; + /** + *Force a current staker to become completely unstaked, immediately. + * + *The dispatch origin must be Root. + * + *## Parameters + * + *- `num_slashing_spans`: Refer to comments on [`Call::withdraw_unbonded`] for more + *details. + */ + force_unstake: TxDescriptor>; + /** + *Force there to be a new era at the end of sessions indefinitely. + * + *The dispatch origin must be Root. + * + *# Warning + * + *The election process starts multiple blocks before the end of the era. + *If this is called just before a new era is triggered, the election process may not + *have enough blocks to get a result. + */ + force_new_era_always: TxDescriptor; + /** + *Cancel enactment of a deferred slash. + * + *Can be called by the `T::AdminOrigin`. + * + *Parameters: era and indices of the slashes for that era to kill. + */ + cancel_deferred_slash: TxDescriptor>; + /** + *Pay out next page of the stakers behind a validator for the given era. + * + *- `validator_stash` is the stash account of the validator. + *- `era` may be any era between `[current_era - history_depth; current_era]`. + * + *The origin of this call must be _Signed_. Any account can call this function, even if + *it is not one of the stakers. + * + *The reward payout could be paged in case there are too many nominators backing the + *`validator_stash`. This call will payout unpaid pages in an ascending order. To claim a + *specific page, use `payout_stakers_by_page`.` + * + *If all pages are claimed, it returns an error `InvalidPage`. + */ + payout_stakers: TxDescriptor>; + /** + *Rebond a portion of the stash scheduled to be unlocked. + * + *The dispatch origin must be signed by the controller. + * + *## Complexity + *- Time complexity: O(L), where L is unlocking chunks + *- Bounded by `MaxUnlockingChunks`. + */ + rebond: TxDescriptor>; + /** + *Remove all data structures concerning a staker/stash once it is at a state where it can + *be considered `dust` in the staking system. The requirements are: + * + *1. the `total_balance` of the stash is below existential deposit. + *2. or, the `ledger.total` of the stash is below existential deposit. + *3. or, existential deposit is zero and either `total_balance` or `ledger.total` is zero. + * + *The former can happen in cases like a slash; the latter when a fully unbonded account + *is still receiving staking rewards in `RewardDestination::Staked`. + * + *It can be called by anyone, as long as `stash` meets the above requirements. + * + *Refunds the transaction fees upon successful execution. + * + *## Parameters + * + *- `num_slashing_spans`: Refer to comments on [`Call::withdraw_unbonded`] for more + *details. + */ + reap_stash: TxDescriptor>; + /** + *Remove the given nominations from the calling validator. + * + *Effects will be felt at the beginning of the next era. + * + *The dispatch origin for this call must be _Signed_ by the controller, not the stash. + * + *- `who`: A list of nominator stash accounts who are nominating this validator which + * should no longer be nominating this validator. + * + *Note: Making this call only makes sense if you first set the validator preferences to + *block any further nominations. + */ + kick: TxDescriptor>; + /** + *Update the various staking configurations . + * + ** `min_nominator_bond`: The minimum active bond needed to be a nominator. + ** `min_validator_bond`: The minimum active bond needed to be a validator. + ** `max_nominator_count`: The max number of users who can be a nominator at once. When + * set to `None`, no limit is enforced. + ** `max_validator_count`: The max number of users who can be a validator at once. When + * set to `None`, no limit is enforced. + ** `chill_threshold`: The ratio of `max_nominator_count` or `max_validator_count` which + * should be filled in order for the `chill_other` transaction to work. + ** `min_commission`: The minimum amount of commission that each validators must maintain. + * This is checked only upon calling `validate`. Existing validators are not affected. + * + *RuntimeOrigin must be Root to call this function. + * + *NOTE: Existing nominators and validators will not be affected by this update. + *to kick people under the new limits, `chill_other` should be called. + */ + set_staking_configs: TxDescriptor>; + /** + *Declare a `controller` to stop participating as either a validator or nominator. + * + *Effects will be felt at the beginning of the next era. + * + *The dispatch origin for this call must be _Signed_, but can be called by anyone. + * + *If the caller is the same as the controller being targeted, then no further checks are + *enforced, and this function behaves just like `chill`. + * + *If the caller is different than the controller being targeted, the following conditions + *must be met: + * + ** `controller` must belong to a nominator who has become non-decodable, + * + *Or: + * + ** A `ChillThreshold` must be set and checked which defines how close to the max + * nominators or validators we must reach before users can start chilling one-another. + ** A `MaxNominatorCount` and `MaxValidatorCount` must be set which is used to determine + * how close we are to the threshold. + ** A `MinNominatorBond` and `MinValidatorBond` must be set and checked, which determines + * if this is a person that should be chilled because they have not met the threshold + * bond required. + * + *This can be helpful if bond requirements are updated, and we need to remove old users + *who do not satisfy these requirements. + */ + chill_other: TxDescriptor>; + /** + *Force a validator to have at least the minimum commission. This will not affect a + *validator who already has a commission greater than or equal to the minimum. Any account + *can call this. + */ + force_apply_min_commission: TxDescriptor>; + /** + *Sets the minimum amount of commission that each validators must maintain. + * + *This call has lower privilege requirements than `set_staking_config` and can be called + *by the `T::AdminOrigin`. Root can always call this. + */ + set_min_commission: TxDescriptor>; + /** + *Pay out a page of the stakers behind a validator for the given era and page. + * + *- `validator_stash` is the stash account of the validator. + *- `era` may be any era between `[current_era - history_depth; current_era]`. + *- `page` is the page index of nominators to pay out with value between 0 and + * `num_nominators / T::MaxExposurePageSize`. + * + *The origin of this call must be _Signed_. Any account can call this function, even if + *it is not one of the stakers. + * + *If a validator has more than [`Config::MaxExposurePageSize`] nominators backing + *them, then the list of nominators is paged, with each page being capped at + *[`Config::MaxExposurePageSize`.] If a validator has more than one page of nominators, + *the call needs to be made for each page separately in order for all the nominators + *backing a validator to receive the reward. The nominators are not sorted across pages + *and so it should not be assumed the highest staker would be on the topmost page and vice + *versa. If rewards are not claimed in [`Config::HistoryDepth`] eras, they are lost. + */ + payout_stakers_by_page: TxDescriptor>; + /** + *Migrates an account's `RewardDestination::Controller` to + *`RewardDestination::Account(controller)`. + * + *Effects will be felt instantly (as soon as this function is completed successfully). + * + *This will waive the transaction fee if the `payee` is successfully migrated. + */ + update_payee: TxDescriptor>; + /** + *Updates a batch of controller accounts to their corresponding stash account if they are + *not the same. Ignores any controller accounts that do not exist, and does not operate if + *the stash and controller are already the same. + * + *Effects will be felt instantly (as soon as this function is completed successfully). + * + *The dispatch origin must be `T::AdminOrigin`. + */ + deprecate_controller_batch: TxDescriptor>; + /** + *Restores the state of a ledger which is in an inconsistent state. + * + *The requirements to restore a ledger are the following: + ** The stash is bonded; or + ** The stash is not bonded but it has a staking lock left behind; or + ** If the stash has an associated ledger and its state is inconsistent; or + ** If the ledger is not corrupted *but* its staking lock is out of sync. + * + *The `maybe_*` input parameters will overwrite the corresponding data and metadata of the + *ledger associated with the stash. If the input parameters are not set, the ledger will + *be reset values from on-chain state. + */ + restore_ledger: TxDescriptor>; + }; + Session: { + /** + *Sets the session key(s) of the function caller to `keys`. + *Allows an account to set its session key prior to becoming a validator. + *This doesn't take effect until the next session. + * + *The dispatch origin of this function must be signed. + * + *## Complexity + *- `O(1)`. Actual cost depends on the number of length of `T::Keys::key_ids()` which is + * fixed. + */ + set_keys: TxDescriptor>; + /** + *Removes any session key(s) of the function caller. + * + *This doesn't take effect until the next session. + * + *The dispatch origin of this function must be Signed and the account must be either be + *convertible to a validator ID using the chain's typical addressing system (this usually + *means being a controller account) or directly convertible into a validator ID (which + *usually means being a stash account). + * + *## Complexity + *- `O(1)` in number of key types. Actual cost depends on the number of length of + * `T::Keys::key_ids()` which is fixed. + */ + purge_keys: TxDescriptor; + }; + Grandpa: { + /** + *Report voter equivocation/misbehavior. This method will verify the + *equivocation proof and validate the given key ownership proof + *against the extracted offender. If both are valid, the offence + *will be reported. + */ + report_equivocation: TxDescriptor>; + /** + *Report voter equivocation/misbehavior. This method will verify the + *equivocation proof and validate the given key ownership proof + *against the extracted offender. If both are valid, the offence + *will be reported. + * + *This extrinsic must be called unsigned and it is expected that only + *block authors will call it (validated in `ValidateUnsigned`), as such + *if the block author is defined it will be defined as the equivocation + *reporter. + */ + report_equivocation_unsigned: TxDescriptor>; + /** + *Note that the current authority set of the GRANDPA finality gadget has stalled. + * + *This will trigger a forced authority set change at the beginning of the next session, to + *be enacted `delay` blocks after that. The `delay` should be high enough to safely assume + *that the block signalling the forced change will not be re-orged e.g. 1000 blocks. + *The block production rate (which may be slowed down because of finality lagging) should + *be taken into account when choosing the `delay`. The GRANDPA voters based on the new + *authority will start voting on top of `best_finalized_block_number` for new finalized + *blocks. `best_finalized_block_number` should be the highest of the latest finalized + *block of all validators of the new authority set. + * + *Only callable by root. + */ + note_stalled: TxDescriptor>; + }; + Treasury: { + /** + *Propose and approve a spend of treasury funds. + * + *## Dispatch Origin + * + *Must be [`Config::SpendOrigin`] with the `Success` value being at least `amount`. + * + *### Details + *NOTE: For record-keeping purposes, the proposer is deemed to be equivalent to the + *beneficiary. + * + *### Parameters + *- `amount`: The amount to be transferred from the treasury to the `beneficiary`. + *- `beneficiary`: The destination account for the transfer. + * + *## Events + * + *Emits [`Event::SpendApproved`] if successful. + */ + spend_local: TxDescriptor>; + /** + *Force a previously approved proposal to be removed from the approval queue. + * + *## Dispatch Origin + * + *Must be [`Config::RejectOrigin`]. + * + *## Details + * + *The original deposit will no longer be returned. + * + *### Parameters + *- `proposal_id`: The index of a proposal + * + *### Complexity + *- O(A) where `A` is the number of approvals + * + *### Errors + *- [`Error::ProposalNotApproved`]: The `proposal_id` supplied was not found in the + * approval queue, i.e., the proposal has not been approved. This could also mean the + * proposal does not exist altogether, thus there is no way it would have been approved + * in the first place. + */ + remove_approval: TxDescriptor>; + /** + *Propose and approve a spend of treasury funds. + * + *## Dispatch Origin + * + *Must be [`Config::SpendOrigin`] with the `Success` value being at least + *`amount` of `asset_kind` in the native asset. The amount of `asset_kind` is converted + *for assertion using the [`Config::BalanceConverter`]. + * + *## Details + * + *Create an approved spend for transferring a specific `amount` of `asset_kind` to a + *designated beneficiary. The spend must be claimed using the `payout` dispatchable within + *the [`Config::PayoutPeriod`]. + * + *### Parameters + *- `asset_kind`: An indicator of the specific asset class to be spent. + *- `amount`: The amount to be transferred from the treasury to the `beneficiary`. + *- `beneficiary`: The beneficiary of the spend. + *- `valid_from`: The block number from which the spend can be claimed. It can refer to + * the past if the resulting spend has not yet expired according to the + * [`Config::PayoutPeriod`]. If `None`, the spend can be claimed immediately after + * approval. + * + *## Events + * + *Emits [`Event::AssetSpendApproved`] if successful. + */ + spend: TxDescriptor>; + /** + *Claim a spend. + * + *## Dispatch Origin + * + *Must be signed + * + *## Details + * + *Spends must be claimed within some temporal bounds. A spend may be claimed within one + *[`Config::PayoutPeriod`] from the `valid_from` block. + *In case of a payout failure, the spend status must be updated with the `check_status` + *dispatchable before retrying with the current function. + * + *### Parameters + *- `index`: The spend index. + * + *## Events + * + *Emits [`Event::Paid`] if successful. + */ + payout: TxDescriptor>; + /** + *Check the status of the spend and remove it from the storage if processed. + * + *## Dispatch Origin + * + *Must be signed. + * + *## Details + * + *The status check is a prerequisite for retrying a failed payout. + *If a spend has either succeeded or expired, it is removed from the storage by this + *function. In such instances, transaction fees are refunded. + * + *### Parameters + *- `index`: The spend index. + * + *## Events + * + *Emits [`Event::PaymentFailed`] if the spend payout has failed. + *Emits [`Event::SpendProcessed`] if the spend payout has succeed. + */ + check_status: TxDescriptor>; + /** + *Void previously approved spend. + * + *## Dispatch Origin + * + *Must be [`Config::RejectOrigin`]. + * + *## Details + * + *A spend void is only possible if the payout has not been attempted yet. + * + *### Parameters + *- `index`: The spend index. + * + *## Events + * + *Emits [`Event::AssetSpendVoided`] if successful. + */ + void_spend: TxDescriptor>; + }; + ConvictionVoting: { + /** + *Vote in a poll. If `vote.is_aye()`, the vote is to enact the proposal; + *otherwise it is a vote to keep the status quo. + * + *The dispatch origin of this call must be _Signed_. + * + *- `poll_index`: The index of the poll to vote for. + *- `vote`: The vote configuration. + * + *Weight: `O(R)` where R is the number of polls the voter has voted on. + */ + vote: TxDescriptor>; + /** + *Delegate the voting power (with some given conviction) of the sending account for a + *particular class of polls. + * + *The balance delegated is locked for as long as it's delegated, and thereafter for the + *time appropriate for the conviction's lock period. + * + *The dispatch origin of this call must be _Signed_, and the signing account must either: + * - be delegating already; or + * - have no voting activity (if there is, then it will need to be removed through + * `remove_vote`). + * + *- `to`: The account whose voting the `target` account's voting power will follow. + *- `class`: The class of polls to delegate. To delegate multiple classes, multiple calls + * to this function are required. + *- `conviction`: The conviction that will be attached to the delegated votes. When the + * account is undelegated, the funds will be locked for the corresponding period. + *- `balance`: The amount of the account's balance to be used in delegating. This must not + * be more than the account's current balance. + * + *Emits `Delegated`. + * + *Weight: `O(R)` where R is the number of polls the voter delegating to has + * voted on. Weight is initially charged as if maximum votes, but is refunded later. + */ + delegate: TxDescriptor>; + /** + *Undelegate the voting power of the sending account for a particular class of polls. + * + *Tokens may be unlocked following once an amount of time consistent with the lock period + *of the conviction with which the delegation was issued has passed. + * + *The dispatch origin of this call must be _Signed_ and the signing account must be + *currently delegating. + * + *- `class`: The class of polls to remove the delegation from. + * + *Emits `Undelegated`. + * + *Weight: `O(R)` where R is the number of polls the voter delegating to has + * voted on. Weight is initially charged as if maximum votes, but is refunded later. + */ + undelegate: TxDescriptor>; + /** + *Remove the lock caused by prior voting/delegating which has expired within a particular + *class. + * + *The dispatch origin of this call must be _Signed_. + * + *- `class`: The class of polls to unlock. + *- `target`: The account to remove the lock on. + * + *Weight: `O(R)` with R number of vote of target. + */ + unlock: TxDescriptor>; + /** + *Remove a vote for a poll. + * + *If: + *- the poll was cancelled, or + *- the poll is ongoing, or + *- the poll has ended such that + * - the vote of the account was in opposition to the result; or + * - there was no conviction to the account's vote; or + * - the account made a split vote + *...then the vote is removed cleanly and a following call to `unlock` may result in more + *funds being available. + * + *If, however, the poll has ended and: + *- it finished corresponding to the vote of the account, and + *- the account made a standard vote with conviction, and + *- the lock period of the conviction is not over + *...then the lock will be aggregated into the overall account's lock, which may involve + **overlocking* (where the two locks are combined into a single lock that is the maximum + *of both the amount locked and the time is it locked for). + * + *The dispatch origin of this call must be _Signed_, and the signer must have a vote + *registered for poll `index`. + * + *- `index`: The index of poll of the vote to be removed. + *- `class`: Optional parameter, if given it indicates the class of the poll. For polls + * which have finished or are cancelled, this must be `Some`. + * + *Weight: `O(R + log R)` where R is the number of polls that `target` has voted on. + * Weight is calculated for the maximum number of vote. + */ + remove_vote: TxDescriptor>; + /** + *Remove a vote for a poll. + * + *If the `target` is equal to the signer, then this function is exactly equivalent to + *`remove_vote`. If not equal to the signer, then the vote must have expired, + *either because the poll was cancelled, because the voter lost the poll or + *because the conviction period is over. + * + *The dispatch origin of this call must be _Signed_. + * + *- `target`: The account of the vote to be removed; this account must have voted for poll + * `index`. + *- `index`: The index of poll of the vote to be removed. + *- `class`: The class of the poll. + * + *Weight: `O(R + log R)` where R is the number of polls that `target` has voted on. + * Weight is calculated for the maximum number of vote. + */ + remove_other_vote: TxDescriptor>; + }; + Referenda: { + /** + *Propose a referendum on a privileged action. + * + *- `origin`: must be `SubmitOrigin` and the account must have `SubmissionDeposit` funds + * available. + *- `proposal_origin`: The origin from which the proposal should be executed. + *- `proposal`: The proposal. + *- `enactment_moment`: The moment that the proposal should be enacted. + * + *Emits `Submitted`. + */ + submit: TxDescriptor>; + /** + *Post the Decision Deposit for a referendum. + * + *- `origin`: must be `Signed` and the account must have funds available for the + * referendum's track's Decision Deposit. + *- `index`: The index of the submitted referendum whose Decision Deposit is yet to be + * posted. + * + *Emits `DecisionDepositPlaced`. + */ + place_decision_deposit: TxDescriptor>; + /** + *Refund the Decision Deposit for a closed referendum back to the depositor. + * + *- `origin`: must be `Signed` or `Root`. + *- `index`: The index of a closed referendum whose Decision Deposit has not yet been + * refunded. + * + *Emits `DecisionDepositRefunded`. + */ + refund_decision_deposit: TxDescriptor>; + /** + *Cancel an ongoing referendum. + * + *- `origin`: must be the `CancelOrigin`. + *- `index`: The index of the referendum to be cancelled. + * + *Emits `Cancelled`. + */ + cancel: TxDescriptor>; + /** + *Cancel an ongoing referendum and slash the deposits. + * + *- `origin`: must be the `KillOrigin`. + *- `index`: The index of the referendum to be cancelled. + * + *Emits `Killed` and `DepositSlashed`. + */ + kill: TxDescriptor>; + /** + *Advance a referendum onto its next logical state. Only used internally. + * + *- `origin`: must be `Root`. + *- `index`: the referendum to be advanced. + */ + nudge_referendum: TxDescriptor>; + /** + *Advance a track onto its next logical state. Only used internally. + * + *- `origin`: must be `Root`. + *- `track`: the track to be advanced. + * + *Action item for when there is now one fewer referendum in the deciding phase and the + *`DecidingCount` is not yet updated. This means that we should either: + *- begin deciding another referendum (and leave `DecidingCount` alone); or + *- decrement `DecidingCount`. + */ + one_fewer_deciding: TxDescriptor>; + /** + *Refund the Submission Deposit for a closed referendum back to the depositor. + * + *- `origin`: must be `Signed` or `Root`. + *- `index`: The index of a closed referendum whose Submission Deposit has not yet been + * refunded. + * + *Emits `SubmissionDepositRefunded`. + */ + refund_submission_deposit: TxDescriptor>; + /** + *Set or clear metadata of a referendum. + * + *Parameters: + *- `origin`: Must be `Signed` by a creator of a referendum or by anyone to clear a + * metadata of a finished referendum. + *- `index`: The index of a referendum to set or clear metadata for. + *- `maybe_hash`: The hash of an on-chain stored preimage. `None` to clear a metadata. + */ + set_metadata: TxDescriptor>; + }; + FellowshipCollective: { + /** + *Introduce a new member. + * + *- `origin`: Must be the `AddOrigin`. + *- `who`: Account of non-member which will become a member. + * + *Weight: `O(1)` + */ + add_member: TxDescriptor>; + /** + *Increment the rank of an existing member by one. + * + *- `origin`: Must be the `PromoteOrigin`. + *- `who`: Account of existing member. + * + *Weight: `O(1)` + */ + promote_member: TxDescriptor>; + /** + *Decrement the rank of an existing member by one. If the member is already at rank zero, + *then they are removed entirely. + * + *- `origin`: Must be the `DemoteOrigin`. + *- `who`: Account of existing member of rank greater than zero. + * + *Weight: `O(1)`, less if the member's index is highest in its rank. + */ + demote_member: TxDescriptor>; + /** + *Remove the member entirely. + * + *- `origin`: Must be the `RemoveOrigin`. + *- `who`: Account of existing member of rank greater than zero. + *- `min_rank`: The rank of the member or greater. + * + *Weight: `O(min_rank)`. + */ + remove_member: TxDescriptor>; + /** + *Add an aye or nay vote for the sender to the given proposal. + * + *- `origin`: Must be `Signed` by a member account. + *- `poll`: Index of a poll which is ongoing. + *- `aye`: `true` if the vote is to approve the proposal, `false` otherwise. + * + *Transaction fees are be waived if the member is voting on any particular proposal + *for the first time and the call is successful. Subsequent vote changes will charge a + *fee. + * + *Weight: `O(1)`, less if there was no previous vote on the poll by the member. + */ + vote: TxDescriptor>; + /** + *Remove votes from the given poll. It must have ended. + * + *- `origin`: Must be `Signed` by any account. + *- `poll_index`: Index of a poll which is completed and for which votes continue to + * exist. + *- `max`: Maximum number of vote items from remove in this call. + * + *Transaction fees are waived if the operation is successful. + * + *Weight `O(max)` (less if there are fewer items to remove than `max`). + */ + cleanup_poll: TxDescriptor>; + /** + *Exchanges a member with a new account and the same existing rank. + * + *- `origin`: Must be the `ExchangeOrigin`. + *- `who`: Account of existing member of rank greater than zero to be exchanged. + *- `new_who`: New Account of existing member of rank greater than zero to exchanged to. + */ + exchange_member: TxDescriptor>; + }; + FellowshipReferenda: { + /** + *Propose a referendum on a privileged action. + * + *- `origin`: must be `SubmitOrigin` and the account must have `SubmissionDeposit` funds + * available. + *- `proposal_origin`: The origin from which the proposal should be executed. + *- `proposal`: The proposal. + *- `enactment_moment`: The moment that the proposal should be enacted. + * + *Emits `Submitted`. + */ + submit: TxDescriptor>; + /** + *Post the Decision Deposit for a referendum. + * + *- `origin`: must be `Signed` and the account must have funds available for the + * referendum's track's Decision Deposit. + *- `index`: The index of the submitted referendum whose Decision Deposit is yet to be + * posted. + * + *Emits `DecisionDepositPlaced`. + */ + place_decision_deposit: TxDescriptor>; + /** + *Refund the Decision Deposit for a closed referendum back to the depositor. + * + *- `origin`: must be `Signed` or `Root`. + *- `index`: The index of a closed referendum whose Decision Deposit has not yet been + * refunded. + * + *Emits `DecisionDepositRefunded`. + */ + refund_decision_deposit: TxDescriptor>; + /** + *Cancel an ongoing referendum. + * + *- `origin`: must be the `CancelOrigin`. + *- `index`: The index of the referendum to be cancelled. + * + *Emits `Cancelled`. + */ + cancel: TxDescriptor>; + /** + *Cancel an ongoing referendum and slash the deposits. + * + *- `origin`: must be the `KillOrigin`. + *- `index`: The index of the referendum to be cancelled. + * + *Emits `Killed` and `DepositSlashed`. + */ + kill: TxDescriptor>; + /** + *Advance a referendum onto its next logical state. Only used internally. + * + *- `origin`: must be `Root`. + *- `index`: the referendum to be advanced. + */ + nudge_referendum: TxDescriptor>; + /** + *Advance a track onto its next logical state. Only used internally. + * + *- `origin`: must be `Root`. + *- `track`: the track to be advanced. + * + *Action item for when there is now one fewer referendum in the deciding phase and the + *`DecidingCount` is not yet updated. This means that we should either: + *- begin deciding another referendum (and leave `DecidingCount` alone); or + *- decrement `DecidingCount`. + */ + one_fewer_deciding: TxDescriptor>; + /** + *Refund the Submission Deposit for a closed referendum back to the depositor. + * + *- `origin`: must be `Signed` or `Root`. + *- `index`: The index of a closed referendum whose Submission Deposit has not yet been + * refunded. + * + *Emits `SubmissionDepositRefunded`. + */ + refund_submission_deposit: TxDescriptor>; + /** + *Set or clear metadata of a referendum. + * + *Parameters: + *- `origin`: Must be `Signed` by a creator of a referendum or by anyone to clear a + * metadata of a finished referendum. + *- `index`: The index of a referendum to set or clear metadata for. + *- `maybe_hash`: The hash of an on-chain stored preimage. `None` to clear a metadata. + */ + set_metadata: TxDescriptor>; + }; + Whitelist: { + /** + + */ + whitelist_call: TxDescriptor>; + /** + + */ + remove_whitelisted_call: TxDescriptor>; + /** + + */ + dispatch_whitelisted_call: TxDescriptor>; + /** + + */ + dispatch_whitelisted_call_with_preimage: TxDescriptor>; + }; + Parameters: { + /** + *Set the value of a parameter. + * + *The dispatch origin of this call must be `AdminOrigin` for the given `key`. Values be + *deleted by setting them to `None`. + */ + set_parameter: TxDescriptor>; + }; + Claims: { + /** + *Make a claim to collect your DOTs. + * + *The dispatch origin for this call must be _None_. + * + *Unsigned Validation: + *A call to claim is deemed valid if the signature provided matches + *the expected signed message of: + * + *> Ethereum Signed Message: + *> (configured prefix string)(address) + * + *and `address` matches the `dest` account. + * + *Parameters: + *- `dest`: The destination account to payout the claim. + *- `ethereum_signature`: The signature of an ethereum signed message matching the format + * described above. + * + * + *The weight of this call is invariant over the input parameters. + *Weight includes logic to validate unsigned `claim` call. + * + *Total Complexity: O(1) + * + */ + claim: TxDescriptor>; + /** + *Mint a new claim to collect DOTs. + * + *The dispatch origin for this call must be _Root_. + * + *Parameters: + *- `who`: The Ethereum address allowed to collect this claim. + *- `value`: The number of DOTs that will be claimed. + *- `vesting_schedule`: An optional vesting schedule for these DOTs. + * + * + *The weight of this call is invariant over the input parameters. + *We assume worst case that both vesting and statement is being inserted. + * + *Total Complexity: O(1) + * + */ + mint_claim: TxDescriptor>; + /** + *Make a claim to collect your DOTs by signing a statement. + * + *The dispatch origin for this call must be _None_. + * + *Unsigned Validation: + *A call to `claim_attest` is deemed valid if the signature provided matches + *the expected signed message of: + * + *> Ethereum Signed Message: + *> (configured prefix string)(address)(statement) + * + *and `address` matches the `dest` account; the `statement` must match that which is + *expected according to your purchase arrangement. + * + *Parameters: + *- `dest`: The destination account to payout the claim. + *- `ethereum_signature`: The signature of an ethereum signed message matching the format + * described above. + *- `statement`: The identity of the statement which is being attested to in the + * signature. + * + * + *The weight of this call is invariant over the input parameters. + *Weight includes logic to validate unsigned `claim_attest` call. + * + *Total Complexity: O(1) + * + */ + claim_attest: TxDescriptor>; + /** + *Attest to a statement, needed to finalize the claims process. + * + *WARNING: Insecure unless your chain includes `PrevalidateAttests` as a + *`SignedExtension`. + * + *Unsigned Validation: + *A call to attest is deemed valid if the sender has a `Preclaim` registered + *and provides a `statement` which is expected for the account. + * + *Parameters: + *- `statement`: The identity of the statement which is being attested to in the + * signature. + * + * + *The weight of this call is invariant over the input parameters. + *Weight includes logic to do pre-validation on `attest` call. + * + *Total Complexity: O(1) + * + */ + attest: TxDescriptor>; + /** + + */ + move_claim: TxDescriptor>; + }; + Utility: { + /** + *Send a batch of dispatch calls. + * + *May be called from any origin except `None`. + * + *- `calls`: The calls to be dispatched from the same origin. The number of call must not + * exceed the constant: `batched_calls_limit` (available in constant metadata). + * + *If origin is root then the calls are dispatched without checking origin filter. (This + *includes bypassing `frame_system::Config::BaseCallFilter`). + * + *## Complexity + *- O(C) where C is the number of calls to be batched. + * + *This will return `Ok` in all circumstances. To determine the success of the batch, an + *event is deposited. If a call failed and the batch was interrupted, then the + *`BatchInterrupted` event is deposited, along with the number of successful calls made + *and the error of the failed call. If all were successful, then the `BatchCompleted` + *event is deposited. + */ + batch: TxDescriptor>; + /** + *Send a call through an indexed pseudonym of the sender. + * + *Filter from origin are passed along. The call will be dispatched with an origin which + *use the same filter as the origin of this call. + * + *NOTE: If you need to ensure that any account-based filtering is not honored (i.e. + *because you expect `proxy` to have been used prior in the call stack and you do not want + *the call restrictions to apply to any sub-accounts), then use `as_multi_threshold_1` + *in the Multisig pallet instead. + * + *NOTE: Prior to version *12, this was called `as_limited_sub`. + * + *The dispatch origin for this call must be _Signed_. + */ + as_derivative: TxDescriptor>; + /** + *Send a batch of dispatch calls and atomically execute them. + *The whole transaction will rollback and fail if any of the calls failed. + * + *May be called from any origin except `None`. + * + *- `calls`: The calls to be dispatched from the same origin. The number of call must not + * exceed the constant: `batched_calls_limit` (available in constant metadata). + * + *If origin is root then the calls are dispatched without checking origin filter. (This + *includes bypassing `frame_system::Config::BaseCallFilter`). + * + *## Complexity + *- O(C) where C is the number of calls to be batched. + */ + batch_all: TxDescriptor>; + /** + *Dispatches a function call with a provided origin. + * + *The dispatch origin for this call must be _Root_. + * + *## Complexity + *- O(1). + */ + dispatch_as: TxDescriptor>; + /** + *Send a batch of dispatch calls. + *Unlike `batch`, it allows errors and won't interrupt. + * + *May be called from any origin except `None`. + * + *- `calls`: The calls to be dispatched from the same origin. The number of call must not + * exceed the constant: `batched_calls_limit` (available in constant metadata). + * + *If origin is root then the calls are dispatch without checking origin filter. (This + *includes bypassing `frame_system::Config::BaseCallFilter`). + * + *## Complexity + *- O(C) where C is the number of calls to be batched. + */ + force_batch: TxDescriptor>; + /** + *Dispatch a function call with a specified weight. + * + *This function does not check the weight of the call, and instead allows the + *Root origin to specify the weight of the call. + * + *The dispatch origin for this call must be _Root_. + */ + with_weight: TxDescriptor>; + }; + Society: { + /** + *A user outside of the society can make a bid for entry. + * + *Payment: The group's Candidate Deposit will be reserved for making a bid. It is returned + *when the bid becomes a member, or if the bid calls `unbid`. + * + *The dispatch origin for this call must be _Signed_. + * + *Parameters: + *- `value`: A one time payment the bid would like to receive when joining the society. + */ + bid: TxDescriptor>; + /** + *A bidder can remove their bid for entry into society. + *By doing so, they will have their candidate deposit returned or + *they will unvouch their voucher. + * + *Payment: The bid deposit is unreserved if the user made a bid. + * + *The dispatch origin for this call must be _Signed_ and a bidder. + */ + unbid: TxDescriptor; + /** + *As a member, vouch for someone to join society by placing a bid on their behalf. + * + *There is no deposit required to vouch for a new bid, but a member can only vouch for + *one bid at a time. If the bid becomes a suspended candidate and ultimately rejected by + *the suspension judgement origin, the member will be banned from vouching again. + * + *As a vouching member, you can claim a tip if the candidate is accepted. This tip will + *be paid as a portion of the reward the member will receive for joining the society. + * + *The dispatch origin for this call must be _Signed_ and a member. + * + *Parameters: + *- `who`: The user who you would like to vouch for. + *- `value`: The total reward to be paid between you and the candidate if they become + *a member in the society. + *- `tip`: Your cut of the total `value` payout when the candidate is inducted into + *the society. Tips larger than `value` will be saturated upon payout. + */ + vouch: TxDescriptor>; + /** + *As a vouching member, unvouch a bid. This only works while vouched user is + *only a bidder (and not a candidate). + * + *The dispatch origin for this call must be _Signed_ and a vouching member. + * + *Parameters: + *- `pos`: Position in the `Bids` vector of the bid who should be unvouched. + */ + unvouch: TxDescriptor; + /** + *As a member, vote on a candidate. + * + *The dispatch origin for this call must be _Signed_ and a member. + * + *Parameters: + *- `candidate`: The candidate that the member would like to bid on. + *- `approve`: A boolean which says if the candidate should be approved (`true`) or + * rejected (`false`). + */ + vote: TxDescriptor>; + /** + *As a member, vote on the defender. + * + *The dispatch origin for this call must be _Signed_ and a member. + * + *Parameters: + *- `approve`: A boolean which says if the candidate should be + *approved (`true`) or rejected (`false`). + */ + defender_vote: TxDescriptor>; + /** + *Transfer the first matured payout for the sender and remove it from the records. + * + *NOTE: This extrinsic needs to be called multiple times to claim multiple matured + *payouts. + * + *Payment: The member will receive a payment equal to their first matured + *payout to their free balance. + * + *The dispatch origin for this call must be _Signed_ and a member with + *payouts remaining. + */ + payout: TxDescriptor; + /** + *Repay the payment previously given to the member with the signed origin, remove any + *pending payments, and elevate them from rank 0 to rank 1. + */ + waive_repay: TxDescriptor>; + /** + *Found the society. + * + *This is done as a discrete action in order to allow for the + *pallet to be included into a running chain and can only be done once. + * + *The dispatch origin for this call must be from the _FounderSetOrigin_. + * + *Parameters: + *- `founder` - The first member and head of the newly founded society. + *- `max_members` - The initial max number of members for the society. + *- `max_intake` - The maximum number of candidates per intake period. + *- `max_strikes`: The maximum number of strikes a member may get before they become + * suspended and may only be reinstated by the founder. + *- `candidate_deposit`: The deposit required to make a bid for membership of the group. + *- `rules` - The rules of this society concerning membership. + * + *Complexity: O(1) + */ + found_society: TxDescriptor>; + /** + *Dissolve the society and remove all members. + * + *The dispatch origin for this call must be Signed, and the signing account must be both + *the `Founder` and the `Head`. This implies that it may only be done when there is one + *member. + */ + dissolve: TxDescriptor; + /** + *Allow suspension judgement origin to make judgement on a suspended member. + * + *If a suspended member is forgiven, we simply add them back as a member, not affecting + *any of the existing storage items for that member. + * + *If a suspended member is rejected, remove all associated storage items, including + *their payouts, and remove any vouched bids they currently have. + * + *The dispatch origin for this call must be Signed from the Founder. + * + *Parameters: + *- `who` - The suspended member to be judged. + *- `forgive` - A boolean representing whether the suspension judgement origin forgives + * (`true`) or rejects (`false`) a suspended member. + */ + judge_suspended_member: TxDescriptor>; + /** + *Change the maximum number of members in society and the maximum number of new candidates + *in a single intake period. + * + *The dispatch origin for this call must be Signed by the Founder. + * + *Parameters: + *- `max_members` - The maximum number of members for the society. This must be no less + * than the current number of members. + *- `max_intake` - The maximum number of candidates per intake period. + *- `max_strikes`: The maximum number of strikes a member may get before they become + * suspended and may only be reinstated by the founder. + *- `candidate_deposit`: The deposit required to make a bid for membership of the group. + */ + set_parameters: TxDescriptor>; + /** + *Punish the skeptic with a strike if they did not vote on a candidate. Callable by the + *candidate. + */ + punish_skeptic: TxDescriptor; + /** + *Transform an approved candidate into a member. Callable only by the + *the candidate, and only after the period for voting has ended. + */ + claim_membership: TxDescriptor; + /** + *Transform an approved candidate into a member. Callable only by the Signed origin of the + *Founder, only after the period for voting has ended and only when the candidate is not + *clearly rejected. + */ + bestow_membership: TxDescriptor>; + /** + *Remove the candidate's application from the society. Callable only by the Signed origin + *of the Founder, only after the period for voting has ended, and only when they do not + *have a clear approval. + * + *Any bid deposit is lost and voucher is banned. + */ + kick_candidate: TxDescriptor>; + /** + *Remove the candidate's application from the society. Callable only by the candidate. + * + *Any bid deposit is lost and voucher is banned. + */ + resign_candidacy: TxDescriptor; + /** + *Remove a `candidate`'s failed application from the society. Callable by any + *signed origin but only at the end of the subsequent round and only for + *a candidate with more rejections than approvals. + * + *The bid deposit is lost and the voucher is banned. + */ + drop_candidate: TxDescriptor>; + /** + *Remove up to `max` stale votes for the given `candidate`. + * + *May be called by any Signed origin, but only after the candidate's candidacy is ended. + */ + cleanup_candidacy: TxDescriptor>; + /** + *Remove up to `max` stale votes for the defender in the given `challenge_round`. + * + *May be called by any Signed origin, but only after the challenge round is ended. + */ + cleanup_challenge: TxDescriptor>; + }; + Recovery: { + /** + *Send a call through a recovered account. + * + *The dispatch origin for this call must be _Signed_ and registered to + *be able to make calls on behalf of the recovered account. + * + *Parameters: + *- `account`: The recovered account you want to make a call on-behalf-of. + *- `call`: The call you want to make with the recovered account. + */ + as_recovered: TxDescriptor>; + /** + *Allow ROOT to bypass the recovery process and set an a rescuer account + *for a lost account directly. + * + *The dispatch origin for this call must be _ROOT_. + * + *Parameters: + *- `lost`: The "lost account" to be recovered. + *- `rescuer`: The "rescuer account" which can call as the lost account. + */ + set_recovered: TxDescriptor>; + /** + *Create a recovery configuration for your account. This makes your account recoverable. + * + *Payment: `ConfigDepositBase` + `FriendDepositFactor` * #_of_friends balance + *will be reserved for storing the recovery configuration. This deposit is returned + *in full when the user calls `remove_recovery`. + * + *The dispatch origin for this call must be _Signed_. + * + *Parameters: + *- `friends`: A list of friends you trust to vouch for recovery attempts. Should be + * ordered and contain no duplicate values. + *- `threshold`: The number of friends that must vouch for a recovery attempt before the + * account can be recovered. Should be less than or equal to the length of the list of + * friends. + *- `delay_period`: The number of blocks after a recovery attempt is initialized that + * needs to pass before the account can be recovered. + */ + create_recovery: TxDescriptor>; + /** + *Initiate the process for recovering a recoverable account. + * + *Payment: `RecoveryDeposit` balance will be reserved for initiating the + *recovery process. This deposit will always be repatriated to the account + *trying to be recovered. See `close_recovery`. + * + *The dispatch origin for this call must be _Signed_. + * + *Parameters: + *- `account`: The lost account that you want to recover. This account needs to be + * recoverable (i.e. have a recovery configuration). + */ + initiate_recovery: TxDescriptor>; + /** + *Allow a "friend" of a recoverable account to vouch for an active recovery + *process for that account. + * + *The dispatch origin for this call must be _Signed_ and must be a "friend" + *for the recoverable account. + * + *Parameters: + *- `lost`: The lost account that you want to recover. + *- `rescuer`: The account trying to rescue the lost account that you want to vouch for. + * + *The combination of these two parameters must point to an active recovery + *process. + */ + vouch_recovery: TxDescriptor>; + /** + *Allow a successful rescuer to claim their recovered account. + * + *The dispatch origin for this call must be _Signed_ and must be a "rescuer" + *who has successfully completed the account recovery process: collected + *`threshold` or more vouches, waited `delay_period` blocks since initiation. + * + *Parameters: + *- `account`: The lost account that you want to claim has been successfully recovered by + * you. + */ + claim_recovery: TxDescriptor>; + /** + *As the controller of a recoverable account, close an active recovery + *process for your account. + * + *Payment: By calling this function, the recoverable account will receive + *the recovery deposit `RecoveryDeposit` placed by the rescuer. + * + *The dispatch origin for this call must be _Signed_ and must be a + *recoverable account with an active recovery process for it. + * + *Parameters: + *- `rescuer`: The account trying to rescue this recoverable account. + */ + close_recovery: TxDescriptor>; + /** + *Remove the recovery process for your account. Recovered accounts are still accessible. + * + *NOTE: The user must make sure to call `close_recovery` on all active + *recovery attempts before calling this function else it will fail. + * + *Payment: By calling this function the recoverable account will unreserve + *their recovery configuration deposit. + *(`ConfigDepositBase` + `FriendDepositFactor` * #_of_friends) + * + *The dispatch origin for this call must be _Signed_ and must be a + *recoverable account (i.e. has a recovery configuration). + */ + remove_recovery: TxDescriptor; + /** + *Cancel the ability to use `as_recovered` for `account`. + * + *The dispatch origin for this call must be _Signed_ and registered to + *be able to make calls on behalf of the recovered account. + * + *Parameters: + *- `account`: The recovered account you are able to call on-behalf-of. + */ + cancel_recovered: TxDescriptor>; + }; + Vesting: { + /** + *Unlock any vested funds of the sender account. + * + *The dispatch origin for this call must be _Signed_ and the sender must have funds still + *locked under this pallet. + * + *Emits either `VestingCompleted` or `VestingUpdated`. + * + *## Complexity + *- `O(1)`. + */ + vest: TxDescriptor; + /** + *Unlock any vested funds of a `target` account. + * + *The dispatch origin for this call must be _Signed_. + * + *- `target`: The account whose vested funds should be unlocked. Must have funds still + *locked under this pallet. + * + *Emits either `VestingCompleted` or `VestingUpdated`. + * + *## Complexity + *- `O(1)`. + */ + vest_other: TxDescriptor>; + /** + *Create a vested transfer. + * + *The dispatch origin for this call must be _Signed_. + * + *- `target`: The account receiving the vested funds. + *- `schedule`: The vesting schedule attached to the transfer. + * + *Emits `VestingCreated`. + * + *NOTE: This will unlock all schedules through the current block. + * + *## Complexity + *- `O(1)`. + */ + vested_transfer: TxDescriptor>; + /** + *Force a vested transfer. + * + *The dispatch origin for this call must be _Root_. + * + *- `source`: The account whose funds should be transferred. + *- `target`: The account that should be transferred the vested funds. + *- `schedule`: The vesting schedule attached to the transfer. + * + *Emits `VestingCreated`. + * + *NOTE: This will unlock all schedules through the current block. + * + *## Complexity + *- `O(1)`. + */ + force_vested_transfer: TxDescriptor>; + /** + *Merge two vesting schedules together, creating a new vesting schedule that unlocks over + *the highest possible start and end blocks. If both schedules have already started the + *current block will be used as the schedule start; with the caveat that if one schedule + *is finished by the current block, the other will be treated as the new merged schedule, + *unmodified. + * + *NOTE: If `schedule1_index == schedule2_index` this is a no-op. + *NOTE: This will unlock all schedules through the current block prior to merging. + *NOTE: If both schedules have ended by the current block, no new schedule will be created + *and both will be removed. + * + *Merged schedule attributes: + *- `starting_block`: `MAX(schedule1.starting_block, scheduled2.starting_block, + * current_block)`. + *- `ending_block`: `MAX(schedule1.ending_block, schedule2.ending_block)`. + *- `locked`: `schedule1.locked_at(current_block) + schedule2.locked_at(current_block)`. + * + *The dispatch origin for this call must be _Signed_. + * + *- `schedule1_index`: index of the first schedule to merge. + *- `schedule2_index`: index of the second schedule to merge. + */ + merge_schedules: TxDescriptor>; + /** + *Force remove a vesting schedule + * + *The dispatch origin for this call must be _Root_. + * + *- `target`: An account that has a vesting schedule + *- `schedule_index`: The vesting schedule index that should be removed + */ + force_remove_vesting_schedule: TxDescriptor>; + }; + Scheduler: { + /** + *Anonymously schedule a task. + */ + schedule: TxDescriptor>; + /** + *Cancel an anonymously scheduled task. + */ + cancel: TxDescriptor>; + /** + *Schedule a named task. + */ + schedule_named: TxDescriptor>; + /** + *Cancel a named scheduled task. + */ + cancel_named: TxDescriptor>; + /** + *Anonymously schedule a task after a delay. + */ + schedule_after: TxDescriptor>; + /** + *Schedule a named task after a delay. + */ + schedule_named_after: TxDescriptor>; + /** + *Set a retry configuration for a task so that, in case its scheduled run fails, it will + *be retried after `period` blocks, for a total amount of `retries` retries or until it + *succeeds. + * + *Tasks which need to be scheduled for a retry are still subject to weight metering and + *agenda space, same as a regular task. If a periodic task fails, it will be scheduled + *normally while the task is retrying. + * + *Tasks scheduled as a result of a retry for a periodic task are unnamed, non-periodic + *clones of the original task. Their retry configuration will be derived from the + *original task's configuration, but will have a lower value for `remaining` than the + *original `total_retries`. + */ + set_retry: TxDescriptor>; + /** + *Set a retry configuration for a named task so that, in case its scheduled run fails, it + *will be retried after `period` blocks, for a total amount of `retries` retries or until + *it succeeds. + * + *Tasks which need to be scheduled for a retry are still subject to weight metering and + *agenda space, same as a regular task. If a periodic task fails, it will be scheduled + *normally while the task is retrying. + * + *Tasks scheduled as a result of a retry for a periodic task are unnamed, non-periodic + *clones of the original task. Their retry configuration will be derived from the + *original task's configuration, but will have a lower value for `remaining` than the + *original `total_retries`. + */ + set_retry_named: TxDescriptor>; + /** + *Removes the retry configuration of a task. + */ + cancel_retry: TxDescriptor>; + /** + *Cancel the retry configuration of a named task. + */ + cancel_retry_named: TxDescriptor>; + }; + Proxy: { + /** + *Dispatch the given `call` from an account that the sender is authorised for through + *`add_proxy`. + * + *The dispatch origin for this call must be _Signed_. + * + *Parameters: + *- `real`: The account that the proxy will make a call on behalf of. + *- `force_proxy_type`: Specify the exact proxy type to be used and checked for this call. + *- `call`: The call to be made by the `real` account. + */ + proxy: TxDescriptor>; + /** + *Register a proxy account for the sender that is able to make calls on its behalf. + * + *The dispatch origin for this call must be _Signed_. + * + *Parameters: + *- `proxy`: The account that the `caller` would like to make a proxy. + *- `proxy_type`: The permissions allowed for this proxy account. + *- `delay`: The announcement period required of the initial proxy. Will generally be + *zero. + */ + add_proxy: TxDescriptor>; + /** + *Unregister a proxy account for the sender. + * + *The dispatch origin for this call must be _Signed_. + * + *Parameters: + *- `proxy`: The account that the `caller` would like to remove as a proxy. + *- `proxy_type`: The permissions currently enabled for the removed proxy account. + */ + remove_proxy: TxDescriptor>; + /** + *Unregister all proxy accounts for the sender. + * + *The dispatch origin for this call must be _Signed_. + * + *WARNING: This may be called on accounts created by `pure`, however if done, then + *the unreserved fees will be inaccessible. **All access to this account will be lost.** + */ + remove_proxies: TxDescriptor; + /** + *Spawn a fresh new account that is guaranteed to be otherwise inaccessible, and + *initialize it with a proxy of `proxy_type` for `origin` sender. + * + *Requires a `Signed` origin. + * + *- `proxy_type`: The type of the proxy that the sender will be registered as over the + *new account. This will almost always be the most permissive `ProxyType` possible to + *allow for maximum flexibility. + *- `index`: A disambiguation index, in case this is called multiple times in the same + *transaction (e.g. with `utility::batch`). Unless you're using `batch` you probably just + *want to use `0`. + *- `delay`: The announcement period required of the initial proxy. Will generally be + *zero. + * + *Fails with `Duplicate` if this has already been called in this transaction, from the + *same sender, with the same parameters. + * + *Fails if there are insufficient funds to pay for deposit. + */ + create_pure: TxDescriptor>; + /** + *Removes a previously spawned pure proxy. + * + *WARNING: **All access to this account will be lost.** Any funds held in it will be + *inaccessible. + * + *Requires a `Signed` origin, and the sender account must have been created by a call to + *`pure` with corresponding parameters. + * + *- `spawner`: The account that originally called `pure` to create this account. + *- `index`: The disambiguation index originally passed to `pure`. Probably `0`. + *- `proxy_type`: The proxy type originally passed to `pure`. + *- `height`: The height of the chain when the call to `pure` was processed. + *- `ext_index`: The extrinsic index in which the call to `pure` was processed. + * + *Fails with `NoPermission` in case the caller is not a previously created pure + *account whose `pure` call has corresponding parameters. + */ + kill_pure: TxDescriptor>; + /** + *Publish the hash of a proxy-call that will be made in the future. + * + *This must be called some number of blocks before the corresponding `proxy` is attempted + *if the delay associated with the proxy relationship is greater than zero. + * + *No more than `MaxPending` announcements may be made at any one time. + * + *This will take a deposit of `AnnouncementDepositFactor` as well as + *`AnnouncementDepositBase` if there are no other pending announcements. + * + *The dispatch origin for this call must be _Signed_ and a proxy of `real`. + * + *Parameters: + *- `real`: The account that the proxy will make a call on behalf of. + *- `call_hash`: The hash of the call to be made by the `real` account. + */ + announce: TxDescriptor>; + /** + *Remove a given announcement. + * + *May be called by a proxy account to remove a call they previously announced and return + *the deposit. + * + *The dispatch origin for this call must be _Signed_. + * + *Parameters: + *- `real`: The account that the proxy will make a call on behalf of. + *- `call_hash`: The hash of the call to be made by the `real` account. + */ + remove_announcement: TxDescriptor>; + /** + *Remove the given announcement of a delegate. + * + *May be called by a target (proxied) account to remove a call that one of their delegates + *(`delegate`) has announced they want to execute. The deposit is returned. + * + *The dispatch origin for this call must be _Signed_. + * + *Parameters: + *- `delegate`: The account that previously announced the call. + *- `call_hash`: The hash of the call to be made. + */ + reject_announcement: TxDescriptor>; + /** + *Dispatch the given `call` from an account that the sender is authorized for through + *`add_proxy`. + * + *Removes any corresponding announcement(s). + * + *The dispatch origin for this call must be _Signed_. + * + *Parameters: + *- `real`: The account that the proxy will make a call on behalf of. + *- `force_proxy_type`: Specify the exact proxy type to be used and checked for this call. + *- `call`: The call to be made by the `real` account. + */ + proxy_announced: TxDescriptor>; + }; + Multisig: { + /** + *Immediately dispatch a multi-signature call using a single approval from the caller. + * + *The dispatch origin for this call must be _Signed_. + * + *- `other_signatories`: The accounts (other than the sender) who are part of the + *multi-signature, but do not participate in the approval process. + *- `call`: The call to be executed. + * + *Result is equivalent to the dispatched result. + * + *## Complexity + *O(Z + C) where Z is the length of the call and C its execution weight. + */ + as_multi_threshold_1: TxDescriptor>; + /** + *Register approval for a dispatch to be made from a deterministic composite account if + *approved by a total of `threshold - 1` of `other_signatories`. + * + *If there are enough, then dispatch the call. + * + *Payment: `DepositBase` will be reserved if this is the first approval, plus + *`threshold` times `DepositFactor`. It is returned once this dispatch happens or + *is cancelled. + * + *The dispatch origin for this call must be _Signed_. + * + *- `threshold`: The total number of approvals for this dispatch before it is executed. + *- `other_signatories`: The accounts (other than the sender) who can approve this + *dispatch. May not be empty. + *- `maybe_timepoint`: If this is the first approval, then this must be `None`. If it is + *not the first approval, then it must be `Some`, with the timepoint (block number and + *transaction index) of the first approval transaction. + *- `call`: The call to be executed. + * + *NOTE: Unless this is the final approval, you will generally want to use + *`approve_as_multi` instead, since it only requires a hash of the call. + * + *Result is equivalent to the dispatched result if `threshold` is exactly `1`. Otherwise + *on success, result is `Ok` and the result from the interior call, if it was executed, + *may be found in the deposited `MultisigExecuted` event. + * + *## Complexity + *- `O(S + Z + Call)`. + *- Up to one balance-reserve or unreserve operation. + *- One passthrough operation, one insert, both `O(S)` where `S` is the number of + * signatories. `S` is capped by `MaxSignatories`, with weight being proportional. + *- One call encode & hash, both of complexity `O(Z)` where `Z` is tx-len. + *- One encode & hash, both of complexity `O(S)`. + *- Up to one binary search and insert (`O(logS + S)`). + *- I/O: 1 read `O(S)`, up to 1 mutate `O(S)`. Up to one remove. + *- One event. + *- The weight of the `call`. + *- Storage: inserts one item, value size bounded by `MaxSignatories`, with a deposit + * taken for its lifetime of `DepositBase + threshold * DepositFactor`. + */ + as_multi: TxDescriptor>; + /** + *Register approval for a dispatch to be made from a deterministic composite account if + *approved by a total of `threshold - 1` of `other_signatories`. + * + *Payment: `DepositBase` will be reserved if this is the first approval, plus + *`threshold` times `DepositFactor`. It is returned once this dispatch happens or + *is cancelled. + * + *The dispatch origin for this call must be _Signed_. + * + *- `threshold`: The total number of approvals for this dispatch before it is executed. + *- `other_signatories`: The accounts (other than the sender) who can approve this + *dispatch. May not be empty. + *- `maybe_timepoint`: If this is the first approval, then this must be `None`. If it is + *not the first approval, then it must be `Some`, with the timepoint (block number and + *transaction index) of the first approval transaction. + *- `call_hash`: The hash of the call to be executed. + * + *NOTE: If this is the final approval, you will want to use `as_multi` instead. + * + *## Complexity + *- `O(S)`. + *- Up to one balance-reserve or unreserve operation. + *- One passthrough operation, one insert, both `O(S)` where `S` is the number of + * signatories. `S` is capped by `MaxSignatories`, with weight being proportional. + *- One encode & hash, both of complexity `O(S)`. + *- Up to one binary search and insert (`O(logS + S)`). + *- I/O: 1 read `O(S)`, up to 1 mutate `O(S)`. Up to one remove. + *- One event. + *- Storage: inserts one item, value size bounded by `MaxSignatories`, with a deposit + * taken for its lifetime of `DepositBase + threshold * DepositFactor`. + */ + approve_as_multi: TxDescriptor>; + /** + *Cancel a pre-existing, on-going multisig transaction. Any deposit reserved previously + *for this operation will be unreserved on success. + * + *The dispatch origin for this call must be _Signed_. + * + *- `threshold`: The total number of approvals for this dispatch before it is executed. + *- `other_signatories`: The accounts (other than the sender) who can approve this + *dispatch. May not be empty. + *- `timepoint`: The timepoint (block number and transaction index) of the first approval + *transaction for this dispatch. + *- `call_hash`: The hash of the call to be executed. + * + *## Complexity + *- `O(S)`. + *- Up to one balance-reserve or unreserve operation. + *- One passthrough operation, one insert, both `O(S)` where `S` is the number of + * signatories. `S` is capped by `MaxSignatories`, with weight being proportional. + *- One encode & hash, both of complexity `O(S)`. + *- One event. + *- I/O: 1 read `O(S)`, one remove. + *- Storage: removes one item. + */ + cancel_as_multi: TxDescriptor>; + }; + Preimage: { + /** + *Register a preimage on-chain. + * + *If the preimage was previously requested, no fees or deposits are taken for providing + *the preimage. Otherwise, a deposit is taken proportional to the size of the preimage. + */ + note_preimage: TxDescriptor>; + /** + *Clear an unrequested preimage from the runtime storage. + * + *If `len` is provided, then it will be a much cheaper operation. + * + *- `hash`: The hash of the preimage to be removed from the store. + *- `len`: The length of the preimage of `hash`. + */ + unnote_preimage: TxDescriptor>; + /** + *Request a preimage be uploaded to the chain without paying any fees or deposits. + * + *If the preimage requests has already been provided on-chain, we unreserve any deposit + *a user may have paid, and take the control of the preimage out of their hands. + */ + request_preimage: TxDescriptor>; + /** + *Clear a previously made request for a preimage. + * + *NOTE: THIS MUST NOT BE CALLED ON `hash` MORE TIMES THAN `request_preimage`. + */ + unrequest_preimage: TxDescriptor>; + /** + *Ensure that the a bulk of pre-images is upgraded. + * + *The caller pays no fee if at least 90% of pre-images were successfully updated. + */ + ensure_updated: TxDescriptor>; + }; + Bounties: { + /** + *Propose a new bounty. + * + *The dispatch origin for this call must be _Signed_. + * + *Payment: `TipReportDepositBase` will be reserved from the origin account, as well as + *`DataDepositPerByte` for each byte in `reason`. It will be unreserved upon approval, + *or slashed when rejected. + * + *- `curator`: The curator account whom will manage this bounty. + *- `fee`: The curator fee. + *- `value`: The total payment amount of this bounty, curator fee included. + *- `description`: The description of this bounty. + */ + propose_bounty: TxDescriptor>; + /** + *Approve a bounty proposal. At a later time, the bounty will be funded and become active + *and the original deposit will be returned. + * + *May only be called from `T::SpendOrigin`. + * + *## Complexity + *- O(1). + */ + approve_bounty: TxDescriptor>; + /** + *Propose a curator to a funded bounty. + * + *May only be called from `T::SpendOrigin`. + * + *## Complexity + *- O(1). + */ + propose_curator: TxDescriptor>; + /** + *Unassign curator from a bounty. + * + *This function can only be called by the `RejectOrigin` a signed origin. + * + *If this function is called by the `RejectOrigin`, we assume that the curator is + *malicious or inactive. As a result, we will slash the curator when possible. + * + *If the origin is the curator, we take this as a sign they are unable to do their job and + *they willingly give up. We could slash them, but for now we allow them to recover their + *deposit and exit without issue. (We may want to change this if it is abused.) + * + *Finally, the origin can be anyone if and only if the curator is "inactive". This allows + *anyone in the community to call out that a curator is not doing their due diligence, and + *we should pick a new curator. In this case the curator should also be slashed. + * + *## Complexity + *- O(1). + */ + unassign_curator: TxDescriptor>; + /** + *Accept the curator role for a bounty. + *A deposit will be reserved from curator and refund upon successful payout. + * + *May only be called from the curator. + * + *## Complexity + *- O(1). + */ + accept_curator: TxDescriptor>; + /** + *Award bounty to a beneficiary account. The beneficiary will be able to claim the funds + *after a delay. + * + *The dispatch origin for this call must be the curator of this bounty. + * + *- `bounty_id`: Bounty ID to award. + *- `beneficiary`: The beneficiary account whom will receive the payout. + * + *## Complexity + *- O(1). + */ + award_bounty: TxDescriptor>; + /** + *Claim the payout from an awarded bounty after payout delay. + * + *The dispatch origin for this call must be the beneficiary of this bounty. + * + *- `bounty_id`: Bounty ID to claim. + * + *## Complexity + *- O(1). + */ + claim_bounty: TxDescriptor>; + /** + *Cancel a proposed or active bounty. All the funds will be sent to treasury and + *the curator deposit will be unreserved if possible. + * + *Only `T::RejectOrigin` is able to cancel a bounty. + * + *- `bounty_id`: Bounty ID to cancel. + * + *## Complexity + *- O(1). + */ + close_bounty: TxDescriptor>; + /** + *Extend the expiry time of an active bounty. + * + *The dispatch origin for this call must be the curator of this bounty. + * + *- `bounty_id`: Bounty ID to extend. + *- `remark`: additional information. + * + *## Complexity + *- O(1). + */ + extend_bounty_expiry: TxDescriptor>; + }; + ChildBounties: { + /** + *Add a new child-bounty. + * + *The dispatch origin for this call must be the curator of parent + *bounty and the parent bounty must be in "active" state. + * + *Child-bounty gets added successfully & fund gets transferred from + *parent bounty to child-bounty account, if parent bounty has enough + *funds, else the call fails. + * + *Upper bound to maximum number of active child bounties that can be + *added are managed via runtime trait config + *[`Config::MaxActiveChildBountyCount`]. + * + *If the call is success, the status of child-bounty is updated to + *"Added". + * + *- `parent_bounty_id`: Index of parent bounty for which child-bounty is being added. + *- `value`: Value for executing the proposal. + *- `description`: Text description for the child-bounty. + */ + add_child_bounty: TxDescriptor>; + /** + *Propose curator for funded child-bounty. + * + *The dispatch origin for this call must be curator of parent bounty. + * + *Parent bounty must be in active state, for this child-bounty call to + *work. + * + *Child-bounty must be in "Added" state, for processing the call. And + *state of child-bounty is moved to "CuratorProposed" on successful + *call completion. + * + *- `parent_bounty_id`: Index of parent bounty. + *- `child_bounty_id`: Index of child bounty. + *- `curator`: Address of child-bounty curator. + *- `fee`: payment fee to child-bounty curator for execution. + */ + propose_curator: TxDescriptor>; + /** + *Accept the curator role for the child-bounty. + * + *The dispatch origin for this call must be the curator of this + *child-bounty. + * + *A deposit will be reserved from the curator and refund upon + *successful payout or cancellation. + * + *Fee for curator is deducted from curator fee of parent bounty. + * + *Parent bounty must be in active state, for this child-bounty call to + *work. + * + *Child-bounty must be in "CuratorProposed" state, for processing the + *call. And state of child-bounty is moved to "Active" on successful + *call completion. + * + *- `parent_bounty_id`: Index of parent bounty. + *- `child_bounty_id`: Index of child bounty. + */ + accept_curator: TxDescriptor>; + /** + *Unassign curator from a child-bounty. + * + *The dispatch origin for this call can be either `RejectOrigin`, or + *the curator of the parent bounty, or any signed origin. + * + *For the origin other than T::RejectOrigin and the child-bounty + *curator, parent bounty must be in active state, for this call to + *work. We allow child-bounty curator and T::RejectOrigin to execute + *this call irrespective of the parent bounty state. + * + *If this function is called by the `RejectOrigin` or the + *parent bounty curator, we assume that the child-bounty curator is + *malicious or inactive. As a result, child-bounty curator deposit is + *slashed. + * + *If the origin is the child-bounty curator, we take this as a sign + *that they are unable to do their job, and are willingly giving up. + *We could slash the deposit, but for now we allow them to unreserve + *their deposit and exit without issue. (We may want to change this if + *it is abused.) + * + *Finally, the origin can be anyone iff the child-bounty curator is + *"inactive". Expiry update due of parent bounty is used to estimate + *inactive state of child-bounty curator. + * + *This allows anyone in the community to call out that a child-bounty + *curator is not doing their due diligence, and we should pick a new + *one. In this case the child-bounty curator deposit is slashed. + * + *State of child-bounty is moved to Added state on successful call + *completion. + * + *- `parent_bounty_id`: Index of parent bounty. + *- `child_bounty_id`: Index of child bounty. + */ + unassign_curator: TxDescriptor>; + /** + *Award child-bounty to a beneficiary. + * + *The beneficiary will be able to claim the funds after a delay. + * + *The dispatch origin for this call must be the parent curator or + *curator of this child-bounty. + * + *Parent bounty must be in active state, for this child-bounty call to + *work. + * + *Child-bounty must be in active state, for processing the call. And + *state of child-bounty is moved to "PendingPayout" on successful call + *completion. + * + *- `parent_bounty_id`: Index of parent bounty. + *- `child_bounty_id`: Index of child bounty. + *- `beneficiary`: Beneficiary account. + */ + award_child_bounty: TxDescriptor>; + /** + *Claim the payout from an awarded child-bounty after payout delay. + * + *The dispatch origin for this call may be any signed origin. + * + *Call works independent of parent bounty state, No need for parent + *bounty to be in active state. + * + *The Beneficiary is paid out with agreed bounty value. Curator fee is + *paid & curator deposit is unreserved. + * + *Child-bounty must be in "PendingPayout" state, for processing the + *call. And instance of child-bounty is removed from the state on + *successful call completion. + * + *- `parent_bounty_id`: Index of parent bounty. + *- `child_bounty_id`: Index of child bounty. + */ + claim_child_bounty: TxDescriptor>; + /** + *Cancel a proposed or active child-bounty. Child-bounty account funds + *are transferred to parent bounty account. The child-bounty curator + *deposit may be unreserved if possible. + * + *The dispatch origin for this call must be either parent curator or + *`T::RejectOrigin`. + * + *If the state of child-bounty is `Active`, curator deposit is + *unreserved. + * + *If the state of child-bounty is `PendingPayout`, call fails & + *returns `PendingPayout` error. + * + *For the origin other than T::RejectOrigin, parent bounty must be in + *active state, for this child-bounty call to work. For origin + *T::RejectOrigin execution is forced. + * + *Instance of child-bounty is removed from the state on successful + *call completion. + * + *- `parent_bounty_id`: Index of parent bounty. + *- `child_bounty_id`: Index of child bounty. + */ + close_child_bounty: TxDescriptor>; + }; + ElectionProviderMultiPhase: { + /** + *Submit a solution for the unsigned phase. + * + *The dispatch origin fo this call must be __none__. + * + *This submission is checked on the fly. Moreover, this unsigned solution is only + *validated when submitted to the pool from the **local** node. Effectively, this means + *that only active validators can submit this transaction when authoring a block (similar + *to an inherent). + * + *To prevent any incorrect solution (and thus wasted time/weight), this transaction will + *panic if the solution submitted by the validator is invalid in any way, effectively + *putting their authoring reward at risk. + * + *No deposit or reward is associated with this submission. + */ + submit_unsigned: TxDescriptor>; + /** + *Set a new value for `MinimumUntrustedScore`. + * + *Dispatch origin must be aligned with `T::ForceOrigin`. + * + *This check can be turned off by setting the value to `None`. + */ + set_minimum_untrusted_score: TxDescriptor>; + /** + *Set a solution in the queue, to be handed out to the client of this pallet in the next + *call to `ElectionProvider::elect`. + * + *This can only be set by `T::ForceOrigin`, and only when the phase is `Emergency`. + * + *The solution is not checked for any feasibility and is assumed to be trustworthy, as any + *feasibility check itself can in principle cause the election process to fail (due to + *memory/weight constrains). + */ + set_emergency_election_result: TxDescriptor>; + /** + *Submit a solution for the signed phase. + * + *The dispatch origin fo this call must be __signed__. + * + *The solution is potentially queued, based on the claimed score and processed at the end + *of the signed phase. + * + *A deposit is reserved and recorded for the solution. Based on the outcome, the solution + *might be rewarded, slashed, or get all or a part of the deposit back. + */ + submit: TxDescriptor>; + /** + *Trigger the governance fallback. + * + *This can only be called when [`Phase::Emergency`] is enabled, as an alternative to + *calling [`Call::set_emergency_election_result`]. + */ + governance_fallback: TxDescriptor>; + }; + Nis: { + /** + *Place a bid. + * + *Origin must be Signed, and account must have at least `amount` in free balance. + * + *- `amount`: The amount of the bid; these funds will be reserved, and if/when + * consolidated, removed. Must be at least `MinBid`. + *- `duration`: The number of periods before which the newly consolidated bid may be + * thawed. Must be greater than 1 and no more than `QueueCount`. + * + *Complexities: + *- `Queues[duration].len()` (just take max). + */ + place_bid: TxDescriptor>; + /** + *Retract a previously placed bid. + * + *Origin must be Signed, and the account should have previously issued a still-active bid + *of `amount` for `duration`. + * + *- `amount`: The amount of the previous bid. + *- `duration`: The duration of the previous bid. + */ + retract_bid: TxDescriptor>; + /** + *Ensure we have sufficient funding for all potential payouts. + * + *- `origin`: Must be accepted by `FundOrigin`. + */ + fund_deficit: TxDescriptor; + /** + *Reduce or remove an outstanding receipt, placing the according proportion of funds into + *the account of the owner. + * + *- `origin`: Must be Signed and the account must be the owner of the receipt `index` as + * well as any fungible counterpart. + *- `index`: The index of the receipt. + *- `portion`: If `Some`, then only the given portion of the receipt should be thawed. If + * `None`, then all of it should be. + */ + thaw_private: TxDescriptor>; + /** + *Reduce or remove an outstanding receipt, placing the according proportion of funds into + *the account of the owner. + * + *- `origin`: Must be Signed and the account must be the owner of the fungible counterpart + * for receipt `index`. + *- `index`: The index of the receipt. + */ + thaw_communal: TxDescriptor>; + /** + *Make a private receipt communal and create fungible counterparts for its owner. + */ + communify: TxDescriptor>; + /** + *Make a communal receipt private and burn fungible counterparts from its owner. + */ + privatize: TxDescriptor>; + }; + NisCounterpartBalances: { + /** + *Transfer some liquid free balance to another account. + * + *`transfer_allow_death` will set the `FreeBalance` of the sender and receiver. + *If the sender's account is below the existential deposit as a result + *of the transfer, the account will be reaped. + * + *The dispatch origin for this call must be `Signed` by the transactor. + */ + transfer_allow_death: TxDescriptor>; + /** + *Exactly as `transfer_allow_death`, except the origin must be root and the source account + *may be specified. + */ + force_transfer: TxDescriptor>; + /** + *Same as the [`transfer_allow_death`] call, but with a check that the transfer will not + *kill the origin account. + * + *99% of the time you want [`transfer_allow_death`] instead. + * + *[`transfer_allow_death`]: struct.Pallet.html#method.transfer + */ + transfer_keep_alive: TxDescriptor>; + /** + *Transfer the entire transferable balance from the caller account. + * + *NOTE: This function only attempts to transfer _transferable_ balances. This means that + *any locked, reserved, or existential deposits (when `keep_alive` is `true`), will not be + *transferred by this function. To ensure that this function results in a killed account, + *you might need to prepare the account by removing any reference counters, storage + *deposits, etc... + * + *The dispatch origin of this call must be Signed. + * + *- `dest`: The recipient of the transfer. + *- `keep_alive`: A boolean to determine if the `transfer_all` operation should send all + * of the funds the account has, causing the sender account to be killed (false), or + * transfer everything except at least the existential deposit, which will guarantee to + * keep the sender account alive (true). + */ + transfer_all: TxDescriptor>; + /** + *Unreserve some balance from a user by force. + * + *Can only be called by ROOT. + */ + force_unreserve: TxDescriptor>; + /** + *Upgrade a specified account. + * + *- `origin`: Must be `Signed`. + *- `who`: The account to be upgraded. + * + *This will waive the transaction fee if at least all but 10% of the accounts needed to + *be upgraded. (We let some not have to be upgraded just in order to allow for the + *possibility of churn). + */ + upgrade_accounts: TxDescriptor>; + /** + *Set the regular balance of a given account. + * + *The dispatch origin for this call is `root`. + */ + force_set_balance: TxDescriptor>; + /** + *Adjust the total issuance in a saturating way. + * + *Can only be called by root and always needs a positive `delta`. + * + *# Example + */ + force_adjust_total_issuance: TxDescriptor>; + /** + *Burn the specified liquid free balance from the origin account. + * + *If the origin's account ends up below the existential deposit as a result + *of the burn and `keep_alive` is false, the account will be reaped. + * + *Unlike sending funds to a _burn_ address, which merely makes the funds inaccessible, + *this `burn` operation will reduce total issuance by the amount _burned_. + */ + burn: TxDescriptor>; + }; + VoterList: { + /** + *Declare that some `dislocated` account has, through rewards or penalties, sufficiently + *changed its score that it should properly fall into a different bag than its current + *one. + * + *Anyone can call this function about any potentially dislocated account. + * + *Will always update the stored score of `dislocated` to the correct score, based on + *`ScoreProvider`. + * + *If `dislocated` does not exists, it returns an error. + */ + rebag: TxDescriptor>; + /** + *Move the caller's Id directly in front of `lighter`. + * + *The dispatch origin for this call must be _Signed_ and can only be called by the Id of + *the account going in front of `lighter`. Fee is payed by the origin under all + *circumstances. + * + *Only works if: + * + *- both nodes are within the same bag, + *- and `origin` has a greater `Score` than `lighter`. + */ + put_in_front_of: TxDescriptor>; + /** + *Same as [`Pallet::put_in_front_of`], but it can be called by anyone. + * + *Fee is paid by the origin under all circumstances. + */ + put_in_front_of_other: TxDescriptor>; + }; + NominationPools: { + /** + *Stake funds with a pool. The amount to bond is transferred from the member to the + *pools account and immediately increases the pools bond. + * + *# Note + * + ** An account can only be a member of a single pool. + ** An account cannot join the same pool multiple times. + ** This call will *not* dust the member account, so the member must have at least + * `existential deposit + amount` in their account. + ** Only a pool with [`PoolState::Open`] can be joined + */ + join: TxDescriptor>; + /** + *Bond `extra` more funds from `origin` into the pool to which they already belong. + * + *Additional funds can come from either the free balance of the account, of from the + *accumulated rewards, see [`BondExtra`]. + * + *Bonding extra funds implies an automatic payout of all pending rewards as well. + *See `bond_extra_other` to bond pending rewards of `other` members. + */ + bond_extra: TxDescriptor>; + /** + *A bonded member can use this to claim their payout based on the rewards that the pool + *has accumulated since their last claimed payout (OR since joining if this is their first + *time claiming rewards). The payout will be transferred to the member's account. + * + *The member will earn rewards pro rata based on the members stake vs the sum of the + *members in the pools stake. Rewards do not "expire". + * + *See `claim_payout_other` to claim rewards on behalf of some `other` pool member. + */ + claim_payout: TxDescriptor; + /** + *Unbond up to `unbonding_points` of the `member_account`'s funds from the pool. It + *implicitly collects the rewards one last time, since not doing so would mean some + *rewards would be forfeited. + * + *Under certain conditions, this call can be dispatched permissionlessly (i.e. by any + *account). + * + *# Conditions for a permissionless dispatch. + * + ** The pool is blocked and the caller is either the root or bouncer. This is refereed to + * as a kick. + ** The pool is destroying and the member is not the depositor. + ** The pool is destroying, the member is the depositor and no other members are in the + * pool. + * + *## Conditions for permissioned dispatch (i.e. the caller is also the + *`member_account`): + * + ** The caller is not the depositor. + ** The caller is the depositor, the pool is destroying and no other members are in the + * pool. + * + *# Note + * + *If there are too many unlocking chunks to unbond with the pool account, + *[`Call::pool_withdraw_unbonded`] can be called to try and minimize unlocking chunks. + *The [`StakingInterface::unbond`] will implicitly call [`Call::pool_withdraw_unbonded`] + *to try to free chunks if necessary (ie. if unbound was called and no unlocking chunks + *are available). However, it may not be possible to release the current unlocking chunks, + *in which case, the result of this call will likely be the `NoMoreChunks` error from the + *staking system. + */ + unbond: TxDescriptor>; + /** + *Call `withdraw_unbonded` for the pools account. This call can be made by any account. + * + *This is useful if there are too many unlocking chunks to call `unbond`, and some + *can be cleared by withdrawing. In the case there are too many unlocking chunks, the user + *would probably see an error like `NoMoreChunks` emitted from the staking system when + *they attempt to unbond. + */ + pool_withdraw_unbonded: TxDescriptor>; + /** + *Withdraw unbonded funds from `member_account`. If no bonded funds can be unbonded, an + *error is returned. + * + *Under certain conditions, this call can be dispatched permissionlessly (i.e. by any + *account). + * + *# Conditions for a permissionless dispatch + * + ** The pool is in destroy mode and the target is not the depositor. + ** The target is the depositor and they are the only member in the sub pools. + ** The pool is blocked and the caller is either the root or bouncer. + * + *# Conditions for permissioned dispatch + * + ** The caller is the target and they are not the depositor. + * + *# Note + * + *- If the target is the depositor, the pool will be destroyed. + *- If the pool has any pending slash, we also try to slash the member before letting them + *withdraw. This calculation adds some weight overhead and is only defensive. In reality, + *pool slashes must have been already applied via permissionless [`Call::apply_slash`]. + */ + withdraw_unbonded: TxDescriptor>; + /** + *Create a new delegation pool. + * + *# Arguments + * + ** `amount` - The amount of funds to delegate to the pool. This also acts of a sort of + * deposit since the pools creator cannot fully unbond funds until the pool is being + * destroyed. + ** `index` - A disambiguation index for creating the account. Likely only useful when + * creating multiple pools in the same extrinsic. + ** `root` - The account to set as [`PoolRoles::root`]. + ** `nominator` - The account to set as the [`PoolRoles::nominator`]. + ** `bouncer` - The account to set as the [`PoolRoles::bouncer`]. + * + *# Note + * + *In addition to `amount`, the caller will transfer the existential deposit; so the caller + *needs at have at least `amount + existential_deposit` transferable. + */ + create: TxDescriptor>; + /** + *Create a new delegation pool with a previously used pool id + * + *# Arguments + * + *same as `create` with the inclusion of + ** `pool_id` - `A valid PoolId. + */ + create_with_pool_id: TxDescriptor>; + /** + *Nominate on behalf of the pool. + * + *The dispatch origin of this call must be signed by the pool nominator or the pool + *root role. + * + *This directly forward the call to the staking pallet, on behalf of the pool bonded + *account. + * + *# Note + * + *In addition to a `root` or `nominator` role of `origin`, pool's depositor needs to have + *at least `depositor_min_bond` in the pool to start nominating. + */ + nominate: TxDescriptor>; + /** + *Set a new state for the pool. + * + *If a pool is already in the `Destroying` state, then under no condition can its state + *change again. + * + *The dispatch origin of this call must be either: + * + *1. signed by the bouncer, or the root role of the pool, + *2. if the pool conditions to be open are NOT met (as described by `ok_to_be_open`), and + * then the state of the pool can be permissionlessly changed to `Destroying`. + */ + set_state: TxDescriptor>; + /** + *Set a new metadata for the pool. + * + *The dispatch origin of this call must be signed by the bouncer, or the root role of the + *pool. + */ + set_metadata: TxDescriptor>; + /** + *Update configurations for the nomination pools. The origin for this call must be + *[`Config::AdminOrigin`]. + * + *# Arguments + * + ** `min_join_bond` - Set [`MinJoinBond`]. + ** `min_create_bond` - Set [`MinCreateBond`]. + ** `max_pools` - Set [`MaxPools`]. + ** `max_members` - Set [`MaxPoolMembers`]. + ** `max_members_per_pool` - Set [`MaxPoolMembersPerPool`]. + ** `global_max_commission` - Set [`GlobalMaxCommission`]. + */ + set_configs: TxDescriptor>; + /** + *Update the roles of the pool. + * + *The root is the only entity that can change any of the roles, including itself, + *excluding the depositor, who can never change. + * + *It emits an event, notifying UIs of the role change. This event is quite relevant to + *most pool members and they should be informed of changes to pool roles. + */ + update_roles: TxDescriptor>; + /** + *Chill on behalf of the pool. + * + *The dispatch origin of this call can be signed by the pool nominator or the pool + *root role, same as [`Pallet::nominate`]. + * + *Under certain conditions, this call can be dispatched permissionlessly (i.e. by any + *account). + * + *# Conditions for a permissionless dispatch: + ** When pool depositor has less than `MinNominatorBond` staked, otherwise pool members + * are unable to unbond. + * + *# Conditions for permissioned dispatch: + ** The caller has a nominator or root role of the pool. + *This directly forward the call to the staking pallet, on behalf of the pool bonded + *account. + */ + chill: TxDescriptor>; + /** + *`origin` bonds funds from `extra` for some pool member `member` into their respective + *pools. + * + *`origin` can bond extra funds from free balance or pending rewards when `origin == + *other`. + * + *In the case of `origin != other`, `origin` can only bond extra pending rewards of + *`other` members assuming set_claim_permission for the given member is + *`PermissionlessCompound` or `PermissionlessAll`. + */ + bond_extra_other: TxDescriptor>; + /** + *Allows a pool member to set a claim permission to allow or disallow permissionless + *bonding and withdrawing. + * + *# Arguments + * + ** `origin` - Member of a pool. + ** `permission` - The permission to be applied. + */ + set_claim_permission: TxDescriptor>; + /** + *`origin` can claim payouts on some pool member `other`'s behalf. + * + *Pool member `other` must have a `PermissionlessWithdraw` or `PermissionlessAll` claim + *permission for this call to be successful. + */ + claim_payout_other: TxDescriptor>; + /** + *Set the commission of a pool. + *Both a commission percentage and a commission payee must be provided in the `current` + *tuple. Where a `current` of `None` is provided, any current commission will be removed. + * + *- If a `None` is supplied to `new_commission`, existing commission will be removed. + */ + set_commission: TxDescriptor>; + /** + *Set the maximum commission of a pool. + * + *- Initial max can be set to any `Perbill`, and only smaller values thereafter. + *- Current commission will be lowered in the event it is higher than a new max + * commission. + */ + set_commission_max: TxDescriptor>; + /** + *Set the commission change rate for a pool. + * + *Initial change rate is not bounded, whereas subsequent updates can only be more + *restrictive than the current. + */ + set_commission_change_rate: TxDescriptor>; + /** + *Claim pending commission. + * + *The dispatch origin of this call must be signed by the `root` role of the pool. Pending + *commission is paid out and added to total claimed commission`. Total pending commission + *is reset to zero. the current. + */ + claim_commission: TxDescriptor>; + /** + *Top up the deficit or withdraw the excess ED from the pool. + * + *When a pool is created, the pool depositor transfers ED to the reward account of the + *pool. ED is subject to change and over time, the deposit in the reward account may be + *insufficient to cover the ED deficit of the pool or vice-versa where there is excess + *deposit to the pool. This call allows anyone to adjust the ED deposit of the + *pool by either topping up the deficit or claiming the excess. + */ + adjust_pool_deposit: TxDescriptor>; + /** + *Set or remove a pool's commission claim permission. + * + *Determines who can claim the pool's pending commission. Only the `Root` role of the pool + *is able to configure commission claim permissions. + */ + set_commission_claim_permission: TxDescriptor>; + /** + *Apply a pending slash on a member. + * + *Fails unless [`crate::pallet::Config::StakeAdapter`] is of strategy type: + *[`adapter::StakeStrategyType::Delegate`]. + * + *This call can be dispatched permissionlessly (i.e. by any account). If the member has + *slash to be applied, caller may be rewarded with the part of the slash. + */ + apply_slash: TxDescriptor>; + /** + *Migrates delegated funds from the pool account to the `member_account`. + * + *Fails unless [`crate::pallet::Config::StakeAdapter`] is of strategy type: + *[`adapter::StakeStrategyType::Delegate`]. + * + *This is a permission-less call and refunds any fee if claim is successful. + * + *If the pool has migrated to delegation based staking, the staked tokens of pool members + *can be moved and held in their own account. See [`adapter::DelegateStake`] + */ + migrate_delegation: TxDescriptor>; + /** + *Migrate pool from [`adapter::StakeStrategyType::Transfer`] to + *[`adapter::StakeStrategyType::Delegate`]. + * + *Fails unless [`crate::pallet::Config::StakeAdapter`] is of strategy type: + *[`adapter::StakeStrategyType::Delegate`]. + * + *This call can be dispatched permissionlessly, and refunds any fee if successful. + * + *If the pool has already migrated to delegation based staking, this call will fail. + */ + migrate_pool_to_delegate_stake: TxDescriptor>; + }; + FastUnstake: { + /** + *Register oneself for fast-unstake. + * + *## Dispatch Origin + * + *The dispatch origin of this call must be *signed* by whoever is permitted to call + *unbond funds by the staking system. See [`Config::Staking`]. + * + *## Details + * + *The stash associated with the origin must have no ongoing unlocking chunks. If + *successful, this will fully unbond and chill the stash. Then, it will enqueue the stash + *to be checked in further blocks. + * + *If by the time this is called, the stash is actually eligible for fast-unstake, then + *they are guaranteed to remain eligible, because the call will chill them as well. + * + *If the check works, the entire staking data is removed, i.e. the stash is fully + *unstaked. + * + *If the check fails, the stash remains chilled and waiting for being unbonded as in with + *the normal staking system, but they lose part of their unbonding chunks due to consuming + *the chain's resources. + * + *## Events + * + *Some events from the staking and currency system might be emitted. + */ + register_fast_unstake: TxDescriptor; + /** + *Deregister oneself from the fast-unstake. + * + *## Dispatch Origin + * + *The dispatch origin of this call must be *signed* by whoever is permitted to call + *unbond funds by the staking system. See [`Config::Staking`]. + * + *## Details + * + *This is useful if one is registered, they are still waiting, and they change their mind. + * + *Note that the associated stash is still fully unbonded and chilled as a consequence of + *calling [`Pallet::register_fast_unstake`]. Therefore, this should probably be followed + *by a call to `rebond` in the staking system. + * + *## Events + * + *Some events from the staking and currency system might be emitted. + */ + deregister: TxDescriptor; + /** + *Control the operation of this pallet. + * + *## Dispatch Origin + * + *The dispatch origin of this call must be [`Config::ControlOrigin`]. + * + *## Details + * + *Can set the number of eras to check per block, and potentially other admin work. + * + *## Events + * + *No events are emitted from this dispatch. + */ + control: TxDescriptor>; + }; + Configuration: { + /** + *Set the validation upgrade cooldown. + */ + set_validation_upgrade_cooldown: TxDescriptor>; + /** + *Set the validation upgrade delay. + */ + set_validation_upgrade_delay: TxDescriptor>; + /** + *Set the acceptance period for an included candidate. + */ + set_code_retention_period: TxDescriptor>; + /** + *Set the max validation code size for incoming upgrades. + */ + set_max_code_size: TxDescriptor>; + /** + *Set the max POV block size for incoming upgrades. + */ + set_max_pov_size: TxDescriptor>; + /** + *Set the max head data size for paras. + */ + set_max_head_data_size: TxDescriptor>; + /** + *Set the number of coretime execution cores. + * + *NOTE: that this configuration is managed by the coretime chain. Only manually change + *this, if you really know what you are doing! + */ + set_coretime_cores: TxDescriptor>; + /** + *Set the max number of times a claim may timeout on a core before it is abandoned + */ + set_max_availability_timeouts: TxDescriptor>; + /** + *Set the parachain validator-group rotation frequency + */ + set_group_rotation_frequency: TxDescriptor>; + /** + *Set the availability period for paras. + */ + set_paras_availability_period: TxDescriptor>; + /** + *Set the scheduling lookahead, in expected number of blocks at peak throughput. + */ + set_scheduling_lookahead: TxDescriptor>; + /** + *Set the maximum number of validators to assign to any core. + */ + set_max_validators_per_core: TxDescriptor>; + /** + *Set the maximum number of validators to use in parachain consensus. + */ + set_max_validators: TxDescriptor>; + /** + *Set the dispute period, in number of sessions to keep for disputes. + */ + set_dispute_period: TxDescriptor>; + /** + *Set the dispute post conclusion acceptance period. + */ + set_dispute_post_conclusion_acceptance_period: TxDescriptor>; + /** + *Set the no show slots, in number of number of consensus slots. + *Must be at least 1. + */ + set_no_show_slots: TxDescriptor>; + /** + *Set the total number of delay tranches. + */ + set_n_delay_tranches: TxDescriptor>; + /** + *Set the zeroth delay tranche width. + */ + set_zeroth_delay_tranche_width: TxDescriptor>; + /** + *Set the number of validators needed to approve a block. + */ + set_needed_approvals: TxDescriptor>; + /** + *Set the number of samples to do of the `RelayVRFModulo` approval assignment criterion. + */ + set_relay_vrf_modulo_samples: TxDescriptor>; + /** + *Sets the maximum items that can present in a upward dispatch queue at once. + */ + set_max_upward_queue_count: TxDescriptor>; + /** + *Sets the maximum total size of items that can present in a upward dispatch queue at + *once. + */ + set_max_upward_queue_size: TxDescriptor>; + /** + *Set the critical downward message size. + */ + set_max_downward_message_size: TxDescriptor>; + /** + *Sets the maximum size of an upward message that can be sent by a candidate. + */ + set_max_upward_message_size: TxDescriptor>; + /** + *Sets the maximum number of messages that a candidate can contain. + */ + set_max_upward_message_num_per_candidate: TxDescriptor>; + /** + *Sets the number of sessions after which an HRMP open channel request expires. + */ + set_hrmp_open_request_ttl: TxDescriptor>; + /** + *Sets the amount of funds that the sender should provide for opening an HRMP channel. + */ + set_hrmp_sender_deposit: TxDescriptor>; + /** + *Sets the amount of funds that the recipient should provide for accepting opening an HRMP + *channel. + */ + set_hrmp_recipient_deposit: TxDescriptor>; + /** + *Sets the maximum number of messages allowed in an HRMP channel at once. + */ + set_hrmp_channel_max_capacity: TxDescriptor>; + /** + *Sets the maximum total size of messages in bytes allowed in an HRMP channel at once. + */ + set_hrmp_channel_max_total_size: TxDescriptor>; + /** + *Sets the maximum number of inbound HRMP channels a parachain is allowed to accept. + */ + set_hrmp_max_parachain_inbound_channels: TxDescriptor>; + /** + *Sets the maximum size of a message that could ever be put into an HRMP channel. + */ + set_hrmp_channel_max_message_size: TxDescriptor>; + /** + *Sets the maximum number of outbound HRMP channels a parachain is allowed to open. + */ + set_hrmp_max_parachain_outbound_channels: TxDescriptor>; + /** + *Sets the maximum number of outbound HRMP messages can be sent by a candidate. + */ + set_hrmp_max_message_num_per_candidate: TxDescriptor>; + /** + *Set the number of session changes after which a PVF pre-checking voting is rejected. + */ + set_pvf_voting_ttl: TxDescriptor>; + /** + *Sets the minimum delay between announcing the upgrade block for a parachain until the + *upgrade taking place. + * + *See the field documentation for information and constraints for the new value. + */ + set_minimum_validation_upgrade_delay: TxDescriptor>; + /** + *Setting this to true will disable consistency checks for the configuration setters. + *Use with caution. + */ + set_bypass_consistency_check: TxDescriptor>; + /** + *Set the asynchronous backing parameters. + */ + set_async_backing_params: TxDescriptor>; + /** + *Set PVF executor parameters. + */ + set_executor_params: TxDescriptor>; + /** + *Set the on demand (parathreads) base fee. + */ + set_on_demand_base_fee: TxDescriptor>; + /** + *Set the on demand (parathreads) fee variability. + */ + set_on_demand_fee_variability: TxDescriptor>; + /** + *Set the on demand (parathreads) queue max size. + */ + set_on_demand_queue_max_size: TxDescriptor>; + /** + *Set the on demand (parathreads) fee variability. + */ + set_on_demand_target_queue_utilization: TxDescriptor>; + /** + *Set the on demand (parathreads) ttl in the claimqueue. + */ + set_on_demand_ttl: TxDescriptor>; + /** + *Set the minimum backing votes threshold. + */ + set_minimum_backing_votes: TxDescriptor>; + /** + *Set/Unset a node feature. + */ + set_node_feature: TxDescriptor>; + /** + *Set approval-voting-params. + */ + set_approval_voting_params: TxDescriptor>; + /** + *Set scheduler-params. + */ + set_scheduler_params: TxDescriptor>; + }; + ParaInherent: { + /** + *Enter the paras inherent. This will process bitfields and backed candidates. + */ + enter: TxDescriptor>; + }; + Paras: { + /** + *Set the storage for the parachain validation code immediately. + */ + force_set_current_code: TxDescriptor>; + /** + *Set the storage for the current parachain head data immediately. + */ + force_set_current_head: TxDescriptor>; + /** + *Schedule an upgrade as if it was scheduled in the given relay parent block. + */ + force_schedule_code_upgrade: TxDescriptor>; + /** + *Note a new block head for para within the context of the current block. + */ + force_note_new_head: TxDescriptor>; + /** + *Put a parachain directly into the next session's action queue. + *We can't queue it any sooner than this without going into the + *initializer... + */ + force_queue_action: TxDescriptor>; + /** + *Adds the validation code to the storage. + * + *The code will not be added if it is already present. Additionally, if PVF pre-checking + *is running for that code, it will be instantly accepted. + * + *Otherwise, the code will be added into the storage. Note that the code will be added + *into storage with reference count 0. This is to account the fact that there are no users + *for this code yet. The caller will have to make sure that this code eventually gets + *used by some parachain or removed from the storage to avoid storage leaks. For the + *latter prefer to use the `poke_unused_validation_code` dispatchable to raw storage + *manipulation. + * + *This function is mainly meant to be used for upgrading parachains that do not follow + *the go-ahead signal while the PVF pre-checking feature is enabled. + */ + add_trusted_validation_code: TxDescriptor>; + /** + *Remove the validation code from the storage iff the reference count is 0. + * + *This is better than removing the storage directly, because it will not remove the code + *that was suddenly got used by some parachain while this dispatchable was pending + *dispatching. + */ + poke_unused_validation_code: TxDescriptor>; + /** + *Includes a statement for a PVF pre-checking vote. Potentially, finalizes the vote and + *enacts the results if that was the last vote before achieving the supermajority. + */ + include_pvf_check_statement: TxDescriptor>; + /** + *Set the storage for the current parachain head data immediately. + */ + force_set_most_recent_context: TxDescriptor>; + }; + Initializer: { + /** + *Issue a signal to the consensus engine to forcibly act as though all parachain + *blocks in all relay chain blocks up to and including the given number in the current + *chain are valid and should be finalized. + */ + force_approve: TxDescriptor>; + }; + Hrmp: { + /** + *Initiate opening a channel from a parachain to a given recipient with given channel + *parameters. + * + *- `proposed_max_capacity` - specifies how many messages can be in the channel at once. + *- `proposed_max_message_size` - specifies the maximum size of the messages. + * + *These numbers are a subject to the relay-chain configuration limits. + * + *The channel can be opened only after the recipient confirms it and only on a session + *change. + */ + hrmp_init_open_channel: TxDescriptor>; + /** + *Accept a pending open channel request from the given sender. + * + *The channel will be opened only on the next session boundary. + */ + hrmp_accept_open_channel: TxDescriptor>; + /** + *Initiate unilateral closing of a channel. The origin must be either the sender or the + *recipient in the channel being closed. + * + *The closure can only happen on a session change. + */ + hrmp_close_channel: TxDescriptor>; + /** + *This extrinsic triggers the cleanup of all the HRMP storage items that a para may have. + *Normally this happens once per session, but this allows you to trigger the cleanup + *immediately for a specific parachain. + * + *Number of inbound and outbound channels for `para` must be provided as witness data. + * + *Origin must be the `ChannelManager`. + */ + force_clean_hrmp: TxDescriptor>; + /** + *Force process HRMP open channel requests. + * + *If there are pending HRMP open channel requests, you can use this function to process + *all of those requests immediately. + * + *Total number of opening channels must be provided as witness data. + * + *Origin must be the `ChannelManager`. + */ + force_process_hrmp_open: TxDescriptor>; + /** + *Force process HRMP close channel requests. + * + *If there are pending HRMP close channel requests, you can use this function to process + *all of those requests immediately. + * + *Total number of closing channels must be provided as witness data. + * + *Origin must be the `ChannelManager`. + */ + force_process_hrmp_close: TxDescriptor>; + /** + *This cancels a pending open channel request. It can be canceled by either of the sender + *or the recipient for that request. The origin must be either of those. + * + *The cancellation happens immediately. It is not possible to cancel the request if it is + *already accepted. + * + *Total number of open requests (i.e. `HrmpOpenChannelRequestsList`) must be provided as + *witness data. + */ + hrmp_cancel_open_request: TxDescriptor>; + /** + *Open a channel from a `sender` to a `recipient` `ParaId`. Although opened by governance, + *the `max_capacity` and `max_message_size` are still subject to the Relay Chain's + *configured limits. + * + *Expected use is when one (and only one) of the `ParaId`s involved in the channel is + *governed by the system, e.g. a system parachain. + * + *Origin must be the `ChannelManager`. + */ + force_open_hrmp_channel: TxDescriptor>; + /** + *Establish an HRMP channel between two system chains. If the channel does not already + *exist, the transaction fees will be refunded to the caller. The system does not take + *deposits for channels between system chains, and automatically sets the message number + *and size limits to the maximum allowed by the network's configuration. + * + *Arguments: + * + *- `sender`: A system chain, `ParaId`. + *- `recipient`: A system chain, `ParaId`. + * + *Any signed origin can call this function, but _both_ inputs MUST be system chains. If + *the channel does not exist yet, there is no fee. + */ + establish_system_channel: TxDescriptor>; + /** + *Update the deposits held for an HRMP channel to the latest `Configuration`. Channels + *with system chains do not require a deposit. + * + *Arguments: + * + *- `sender`: A chain, `ParaId`. + *- `recipient`: A chain, `ParaId`. + * + *Any signed origin can call this function. + */ + poke_channel_deposits: TxDescriptor>; + /** + *Establish a bidirectional HRMP channel between a parachain and a system chain. + * + *Arguments: + * + *- `target_system_chain`: A system chain, `ParaId`. + * + *The origin needs to be the parachain origin. + */ + establish_channel_with_system: TxDescriptor>; + }; + ParasDisputes: { + /** + + */ + force_unfreeze: TxDescriptor; + }; + ParasSlashing: { + /** + + */ + report_dispute_lost_unsigned: TxDescriptor>; + }; + OnDemandAssignmentProvider: { + /** + *Create a single on demand core order. + *Will use the spot price for the current block and will reap the account if needed. + * + *Parameters: + *- `origin`: The sender of the call, funds will be withdrawn from this account. + *- `max_amount`: The maximum balance to withdraw from the origin to place an order. + *- `para_id`: A `ParaId` the origin wants to provide blockspace for. + * + *Errors: + *- `InsufficientBalance`: from the Currency implementation + *- `QueueFull` + *- `SpotPriceHigherThanMaxAmount` + * + *Events: + *- `OnDemandOrderPlaced` + */ + place_order_allow_death: TxDescriptor>; + /** + *Same as the [`place_order_allow_death`](Self::place_order_allow_death) call , but with a + *check that placing the order will not reap the account. + * + *Parameters: + *- `origin`: The sender of the call, funds will be withdrawn from this account. + *- `max_amount`: The maximum balance to withdraw from the origin to place an order. + *- `para_id`: A `ParaId` the origin wants to provide blockspace for. + * + *Errors: + *- `InsufficientBalance`: from the Currency implementation + *- `QueueFull` + *- `SpotPriceHigherThanMaxAmount` + * + *Events: + *- `OnDemandOrderPlaced` + */ + place_order_keep_alive: TxDescriptor>; + }; + Registrar: { + /** + *Register head data and validation code for a reserved Para Id. + * + *## Arguments + *- `origin`: Must be called by a `Signed` origin. + *- `id`: The para ID. Must be owned/managed by the `origin` signing account. + *- `genesis_head`: The genesis head data of the parachain/thread. + *- `validation_code`: The initial validation code of the parachain/thread. + * + *## Deposits/Fees + *The account with the originating signature must reserve a deposit. + * + *The deposit is required to cover the costs associated with storing the genesis head + *data and the validation code. + *This accounts for the potential to store validation code of a size up to the + *`max_code_size`, as defined in the configuration pallet + * + *Anything already reserved previously for this para ID is accounted for. + * + *## Events + *The `Registered` event is emitted in case of success. + */ + register: TxDescriptor>; + /** + *Force the registration of a Para Id on the relay chain. + * + *This function must be called by a Root origin. + * + *The deposit taken can be specified for this registration. Any `ParaId` + *can be registered, including sub-1000 IDs which are System Parachains. + */ + force_register: TxDescriptor>; + /** + *Deregister a Para Id, freeing all data and returning any deposit. + * + *The caller must be Root, the `para` owner, or the `para` itself. The para must be an + *on-demand parachain. + */ + deregister: TxDescriptor>; + /** + *Swap a lease holding parachain with another parachain, either on-demand or lease + *holding. + * + *The origin must be Root, the `para` owner, or the `para` itself. + * + *The swap will happen only if there is already an opposite swap pending. If there is not, + *the swap will be stored in the pending swaps map, ready for a later confirmatory swap. + * + *The `ParaId`s remain mapped to the same head data and code so external code can rely on + *`ParaId` to be a long-term identifier of a notional "parachain". However, their + *scheduling info (i.e. whether they're an on-demand parachain or lease holding + *parachain), auction information and the auction deposit are switched. + */ + swap: TxDescriptor>; + /** + *Remove a manager lock from a para. This will allow the manager of a + *previously locked para to deregister or swap a para without using governance. + * + *Can only be called by the Root origin or the parachain. + */ + remove_lock: TxDescriptor>; + /** + *Reserve a Para Id on the relay chain. + * + *This function will reserve a new Para Id to be owned/managed by the origin account. + *The origin account is able to register head data and validation code using `register` to + *create an on-demand parachain. Using the Slots pallet, an on-demand parachain can then + *be upgraded to a lease holding parachain. + * + *## Arguments + *- `origin`: Must be called by a `Signed` origin. Becomes the manager/owner of the new + * para ID. + * + *## Deposits/Fees + *The origin must reserve a deposit of `ParaDeposit` for the registration. + * + *## Events + *The `Reserved` event is emitted in case of success, which provides the ID reserved for + *use. + */ + reserve: TxDescriptor; + /** + *Add a manager lock from a para. This will prevent the manager of a + *para to deregister or swap a para. + * + *Can be called by Root, the parachain, or the parachain manager if the parachain is + *unlocked. + */ + add_lock: TxDescriptor>; + /** + *Schedule a parachain upgrade. + * + *This will kick off a check of `new_code` by all validators. After the majority of the + *validators have reported on the validity of the code, the code will either be enacted + *or the upgrade will be rejected. If the code will be enacted, the current code of the + *parachain will be overwritten directly. This means that any PoV will be checked by this + *new code. The parachain itself will not be informed explicitly that the validation code + *has changed. + * + *Can be called by Root, the parachain, or the parachain manager if the parachain is + *unlocked. + */ + schedule_code_upgrade: TxDescriptor>; + /** + *Set the parachain's current head. + * + *Can be called by Root, the parachain, or the parachain manager if the parachain is + *unlocked. + */ + set_current_head: TxDescriptor>; + }; + Slots: { + /** + *Just a connect into the `lease_out` call, in case Root wants to force some lease to + *happen independently of any other on-chain mechanism to use it. + * + *The dispatch origin for this call must match `T::ForceOrigin`. + */ + force_lease: TxDescriptor>; + /** + *Clear all leases for a Para Id, refunding any deposits back to the original owners. + * + *The dispatch origin for this call must match `T::ForceOrigin`. + */ + clear_all_leases: TxDescriptor>; + /** + *Try to onboard a parachain that has a lease for the current lease period. + * + *This function can be useful if there was some state issue with a para that should + *have onboarded, but was unable to. As long as they have a lease period, we can + *let them onboard from here. + * + *Origin must be signed, but can be called by anyone. + */ + trigger_onboard: TxDescriptor>; + }; + Auctions: { + /** + *Create a new auction. + * + *This can only happen when there isn't already an auction in progress and may only be + *called by the root origin. Accepts the `duration` of this auction and the + *`lease_period_index` of the initial lease period of the four that are to be auctioned. + */ + new_auction: TxDescriptor>; + /** + *Make a new bid from an account (including a parachain account) for deploying a new + *parachain. + * + *Multiple simultaneous bids from the same bidder are allowed only as long as all active + *bids overlap each other (i.e. are mutually exclusive). Bids cannot be redacted. + * + *- `sub` is the sub-bidder ID, allowing for multiple competing bids to be made by (and + *funded by) the same account. + *- `auction_index` is the index of the auction to bid on. Should just be the present + *value of `AuctionCounter`. + *- `first_slot` is the first lease period index of the range to bid on. This is the + *absolute lease period index value, not an auction-specific offset. + *- `last_slot` is the last lease period index of the range to bid on. This is the + *absolute lease period index value, not an auction-specific offset. + *- `amount` is the amount to bid to be held as deposit for the parachain should the + *bid win. This amount is held throughout the range. + */ + bid: TxDescriptor>; + /** + *Cancel an in-progress auction. + * + *Can only be called by Root origin. + */ + cancel_auction: TxDescriptor; + }; + Crowdloan: { + /** + *Create a new crowdloaning campaign for a parachain slot with the given lease period + *range. + * + *This applies a lock to your parachain configuration, ensuring that it cannot be changed + *by the parachain manager. + */ + create: TxDescriptor>; + /** + *Contribute to a crowd sale. This will transfer some balance over to fund a parachain + *slot. It will be withdrawable when the crowdloan has ended and the funds are unused. + */ + contribute: TxDescriptor>; + /** + *Withdraw full balance of a specific contributor. + * + *Origin must be signed, but can come from anyone. + * + *The fund must be either in, or ready for, retirement. For a fund to be *in* retirement, + *then the retirement flag must be set. For a fund to be ready for retirement, then: + *- it must not already be in retirement; + *- the amount of raised funds must be bigger than the _free_ balance of the account; + *- and either: + * - the block number must be at least `end`; or + * - the current lease period must be greater than the fund's `last_period`. + * + *In this case, the fund's retirement flag is set and its `end` is reset to the current + *block number. + * + *- `who`: The account whose contribution should be withdrawn. + *- `index`: The parachain to whose crowdloan the contribution was made. + */ + withdraw: TxDescriptor>; + /** + *Automatically refund contributors of an ended crowdloan. + *Due to weight restrictions, this function may need to be called multiple + *times to fully refund all users. We will refund `RemoveKeysLimit` users at a time. + * + *Origin must be signed, but can come from anyone. + */ + refund: TxDescriptor>; + /** + *Remove a fund after the retirement period has ended and all funds have been returned. + */ + dissolve: TxDescriptor>; + /** + *Edit the configuration for an in-progress crowdloan. + * + *Can only be called by Root origin. + */ + edit: TxDescriptor>; + /** + *Add an optional memo to an existing crowdloan contribution. + * + *Origin must be Signed, and the user must have contributed to the crowdloan. + */ + add_memo: TxDescriptor>; + /** + *Poke the fund into `NewRaise` + * + *Origin must be Signed, and the fund has non-zero raise. + */ + poke: TxDescriptor>; + /** + *Contribute your entire balance to a crowd sale. This will transfer the entire balance of + *a user over to fund a parachain slot. It will be withdrawable when the crowdloan has + *ended and the funds are unused. + */ + contribute_all: TxDescriptor>; + }; + Coretime: { + /** + *Request the configuration to be updated with the specified number of cores. Warning: + *Since this only schedules a configuration update, it takes two sessions to come into + *effect. + * + *- `origin`: Root or the Coretime Chain + *- `count`: total number of cores + */ + request_core_count: TxDescriptor>; + /** + *Request to claim the instantaneous coretime sales revenue starting from the block it was + *last claimed until and up to the block specified. The claimed amount value is sent back + *to the Coretime chain in a `notify_revenue` message. At the same time, the amount is + *teleported to the Coretime chain. + */ + request_revenue_at: TxDescriptor>; + /** + *Receive instructions from the `ExternalBrokerOrigin`, detailing how a specific core is + *to be used. + * + *Parameters: + *-`origin`: The `ExternalBrokerOrigin`, assumed to be the coretime chain. + *-`core`: The core that should be scheduled. + *-`begin`: The starting blockheight of the instruction. + *-`assignment`: How the blockspace should be utilised. + *-`end_hint`: An optional hint as to when this particular set of instructions will end. + */ + assign_core: TxDescriptor>; + }; + XcmPallet: { + /** + + */ + send: TxDescriptor>; + /** + *Teleport some assets from the local chain to some destination chain. + * + ***This function is deprecated: Use `limited_teleport_assets` instead.** + * + *Fee payment on the destination side is made from the asset in the `assets` vector of + *index `fee_asset_item`. The weight limit for fees is not provided and thus is unlimited, + *with all fees taken as needed from the asset. + * + *- `origin`: Must be capable of withdrawing the `assets` and executing XCM. + *- `dest`: Destination context for the assets. Will typically be `[Parent, + * Parachain(..)]` to send from parachain to parachain, or `[Parachain(..)]` to send from + * relay to parachain. + *- `beneficiary`: A beneficiary location for the assets in the context of `dest`. Will + * generally be an `AccountId32` value. + *- `assets`: The assets to be withdrawn. This should include the assets used to pay the + * fee on the `dest` chain. + *- `fee_asset_item`: The index into `assets` of the item which should be used to pay + * fees. + */ + teleport_assets: TxDescriptor>; + /** + *Transfer some assets from the local chain to the destination chain through their local, + *destination or remote reserve. + * + *`assets` must have same reserve location and may not be teleportable to `dest`. + * - `assets` have local reserve: transfer assets to sovereign account of destination + * chain and forward a notification XCM to `dest` to mint and deposit reserve-based + * assets to `beneficiary`. + * - `assets` have destination reserve: burn local assets and forward a notification to + * `dest` chain to withdraw the reserve assets from this chain's sovereign account and + * deposit them to `beneficiary`. + * - `assets` have remote reserve: burn local assets, forward XCM to reserve chain to move + * reserves from this chain's SA to `dest` chain's SA, and forward another XCM to `dest` + * to mint and deposit reserve-based assets to `beneficiary`. + * + ***This function is deprecated: Use `limited_reserve_transfer_assets` instead.** + * + *Fee payment on the destination side is made from the asset in the `assets` vector of + *index `fee_asset_item`. The weight limit for fees is not provided and thus is unlimited, + *with all fees taken as needed from the asset. + * + *- `origin`: Must be capable of withdrawing the `assets` and executing XCM. + *- `dest`: Destination context for the assets. Will typically be `[Parent, + * Parachain(..)]` to send from parachain to parachain, or `[Parachain(..)]` to send from + * relay to parachain. + *- `beneficiary`: A beneficiary location for the assets in the context of `dest`. Will + * generally be an `AccountId32` value. + *- `assets`: The assets to be withdrawn. This should include the assets used to pay the + * fee on the `dest` (and possibly reserve) chains. + *- `fee_asset_item`: The index into `assets` of the item which should be used to pay + * fees. + */ + reserve_transfer_assets: TxDescriptor>; + /** + *Execute an XCM message from a local, signed, origin. + * + *An event is deposited indicating whether `msg` could be executed completely or only + *partially. + * + *No more than `max_weight` will be used in its attempted execution. If this is less than + *the maximum amount of weight that the message could take to be executed, then no + *execution attempt will be made. + */ + execute: TxDescriptor>; + /** + *Extoll that a particular destination can be communicated with through a particular + *version of XCM. + * + *- `origin`: Must be an origin specified by AdminOrigin. + *- `location`: The destination that is being described. + *- `xcm_version`: The latest version of XCM that `location` supports. + */ + force_xcm_version: TxDescriptor>; + /** + *Set a safe XCM version (the version that XCM should be encoded with if the most recent + *version a destination can accept is unknown). + * + *- `origin`: Must be an origin specified by AdminOrigin. + *- `maybe_xcm_version`: The default XCM encoding version, or `None` to disable. + */ + force_default_xcm_version: TxDescriptor>; + /** + *Ask a location to notify us regarding their XCM version and any changes to it. + * + *- `origin`: Must be an origin specified by AdminOrigin. + *- `location`: The location to which we should subscribe for XCM version notifications. + */ + force_subscribe_version_notify: TxDescriptor>; + /** + *Require that a particular destination should no longer notify us regarding any XCM + *version changes. + * + *- `origin`: Must be an origin specified by AdminOrigin. + *- `location`: The location to which we are currently subscribed for XCM version + * notifications which we no longer desire. + */ + force_unsubscribe_version_notify: TxDescriptor>; + /** + *Transfer some assets from the local chain to the destination chain through their local, + *destination or remote reserve. + * + *`assets` must have same reserve location and may not be teleportable to `dest`. + * - `assets` have local reserve: transfer assets to sovereign account of destination + * chain and forward a notification XCM to `dest` to mint and deposit reserve-based + * assets to `beneficiary`. + * - `assets` have destination reserve: burn local assets and forward a notification to + * `dest` chain to withdraw the reserve assets from this chain's sovereign account and + * deposit them to `beneficiary`. + * - `assets` have remote reserve: burn local assets, forward XCM to reserve chain to move + * reserves from this chain's SA to `dest` chain's SA, and forward another XCM to `dest` + * to mint and deposit reserve-based assets to `beneficiary`. + * + *Fee payment on the destination side is made from the asset in the `assets` vector of + *index `fee_asset_item`, up to enough to pay for `weight_limit` of weight. If more weight + *is needed than `weight_limit`, then the operation will fail and the sent assets may be + *at risk. + * + *- `origin`: Must be capable of withdrawing the `assets` and executing XCM. + *- `dest`: Destination context for the assets. Will typically be `[Parent, + * Parachain(..)]` to send from parachain to parachain, or `[Parachain(..)]` to send from + * relay to parachain. + *- `beneficiary`: A beneficiary location for the assets in the context of `dest`. Will + * generally be an `AccountId32` value. + *- `assets`: The assets to be withdrawn. This should include the assets used to pay the + * fee on the `dest` (and possibly reserve) chains. + *- `fee_asset_item`: The index into `assets` of the item which should be used to pay + * fees. + *- `weight_limit`: The remote-side weight limit, if any, for the XCM fee purchase. + */ + limited_reserve_transfer_assets: TxDescriptor>; + /** + *Teleport some assets from the local chain to some destination chain. + * + *Fee payment on the destination side is made from the asset in the `assets` vector of + *index `fee_asset_item`, up to enough to pay for `weight_limit` of weight. If more weight + *is needed than `weight_limit`, then the operation will fail and the sent assets may be + *at risk. + * + *- `origin`: Must be capable of withdrawing the `assets` and executing XCM. + *- `dest`: Destination context for the assets. Will typically be `[Parent, + * Parachain(..)]` to send from parachain to parachain, or `[Parachain(..)]` to send from + * relay to parachain. + *- `beneficiary`: A beneficiary location for the assets in the context of `dest`. Will + * generally be an `AccountId32` value. + *- `assets`: The assets to be withdrawn. This should include the assets used to pay the + * fee on the `dest` chain. + *- `fee_asset_item`: The index into `assets` of the item which should be used to pay + * fees. + *- `weight_limit`: The remote-side weight limit, if any, for the XCM fee purchase. + */ + limited_teleport_assets: TxDescriptor>; + /** + *Set or unset the global suspension state of the XCM executor. + * + *- `origin`: Must be an origin specified by AdminOrigin. + *- `suspended`: `true` to suspend, `false` to resume. + */ + force_suspension: TxDescriptor>; + /** + *Transfer some assets from the local chain to the destination chain through their local, + *destination or remote reserve, or through teleports. + * + *Fee payment on the destination side is made from the asset in the `assets` vector of + *index `fee_asset_item` (hence referred to as `fees`), up to enough to pay for + *`weight_limit` of weight. If more weight is needed than `weight_limit`, then the + *operation will fail and the sent assets may be at risk. + * + *`assets` (excluding `fees`) must have same reserve location or otherwise be teleportable + *to `dest`, no limitations imposed on `fees`. + * - for local reserve: transfer assets to sovereign account of destination chain and + * forward a notification XCM to `dest` to mint and deposit reserve-based assets to + * `beneficiary`. + * - for destination reserve: burn local assets and forward a notification to `dest` chain + * to withdraw the reserve assets from this chain's sovereign account and deposit them + * to `beneficiary`. + * - for remote reserve: burn local assets, forward XCM to reserve chain to move reserves + * from this chain's SA to `dest` chain's SA, and forward another XCM to `dest` to mint + * and deposit reserve-based assets to `beneficiary`. + * - for teleports: burn local assets and forward XCM to `dest` chain to mint/teleport + * assets and deposit them to `beneficiary`. + * + *- `origin`: Must be capable of withdrawing the `assets` and executing XCM. + *- `dest`: Destination context for the assets. Will typically be `X2(Parent, + * Parachain(..))` to send from parachain to parachain, or `X1(Parachain(..))` to send + * from relay to parachain. + *- `beneficiary`: A beneficiary location for the assets in the context of `dest`. Will + * generally be an `AccountId32` value. + *- `assets`: The assets to be withdrawn. This should include the assets used to pay the + * fee on the `dest` (and possibly reserve) chains. + *- `fee_asset_item`: The index into `assets` of the item which should be used to pay + * fees. + *- `weight_limit`: The remote-side weight limit, if any, for the XCM fee purchase. + */ + transfer_assets: TxDescriptor>; + /** + *Claims assets trapped on this pallet because of leftover assets during XCM execution. + * + *- `origin`: Anyone can call this extrinsic. + *- `assets`: The exact assets that were trapped. Use the version to specify what version + *was the latest when they were trapped. + *- `beneficiary`: The location/account where the claimed assets will be deposited. + */ + claim_assets: TxDescriptor>; + /** + *Transfer assets from the local chain to the destination chain using explicit transfer + *types for assets and fees. + * + *`assets` must have same reserve location or may be teleportable to `dest`. Caller must + *provide the `assets_transfer_type` to be used for `assets`: + * - `TransferType::LocalReserve`: transfer assets to sovereign account of destination + * chain and forward a notification XCM to `dest` to mint and deposit reserve-based + * assets to `beneficiary`. + * - `TransferType::DestinationReserve`: burn local assets and forward a notification to + * `dest` chain to withdraw the reserve assets from this chain's sovereign account and + * deposit them to `beneficiary`. + * - `TransferType::RemoteReserve(reserve)`: burn local assets, forward XCM to `reserve` + * chain to move reserves from this chain's SA to `dest` chain's SA, and forward another + * XCM to `dest` to mint and deposit reserve-based assets to `beneficiary`. Typically + * the remote `reserve` is Asset Hub. + * - `TransferType::Teleport`: burn local assets and forward XCM to `dest` chain to + * mint/teleport assets and deposit them to `beneficiary`. + * + *On the destination chain, as well as any intermediary hops, `BuyExecution` is used to + *buy execution using transferred `assets` identified by `remote_fees_id`. + *Make sure enough of the specified `remote_fees_id` asset is included in the given list + *of `assets`. `remote_fees_id` should be enough to pay for `weight_limit`. If more weight + *is needed than `weight_limit`, then the operation will fail and the sent assets may be + *at risk. + * + *`remote_fees_id` may use different transfer type than rest of `assets` and can be + *specified through `fees_transfer_type`. + * + *The caller needs to specify what should happen to the transferred assets once they reach + *the `dest` chain. This is done through the `custom_xcm_on_dest` parameter, which + *contains the instructions to execute on `dest` as a final step. + * This is usually as simple as: + * `Xcm(vec![DepositAsset { assets: Wild(AllCounted(assets.len())), beneficiary }])`, + * but could be something more exotic like sending the `assets` even further. + * + *- `origin`: Must be capable of withdrawing the `assets` and executing XCM. + *- `dest`: Destination context for the assets. Will typically be `[Parent, + * Parachain(..)]` to send from parachain to parachain, or `[Parachain(..)]` to send from + * relay to parachain, or `(parents: 2, (GlobalConsensus(..), ..))` to send from + * parachain across a bridge to another ecosystem destination. + *- `assets`: The assets to be withdrawn. This should include the assets used to pay the + * fee on the `dest` (and possibly reserve) chains. + *- `assets_transfer_type`: The XCM `TransferType` used to transfer the `assets`. + *- `remote_fees_id`: One of the included `assets` to be used to pay fees. + *- `fees_transfer_type`: The XCM `TransferType` used to transfer the `fees` assets. + *- `custom_xcm_on_dest`: The XCM to be executed on `dest` chain as the last step of the + * transfer, which also determines what happens to the assets on the destination chain. + *- `weight_limit`: The remote-side weight limit, if any, for the XCM fee purchase. + */ + transfer_assets_using_type_and_then: TxDescriptor>; + }; + MessageQueue: { + /** + *Remove a page which has no more messages remaining to be processed or is stale. + */ + reap_page: TxDescriptor>; + /** + *Execute an overweight message. + * + *Temporary processing errors will be propagated whereas permanent errors are treated + *as success condition. + * + *- `origin`: Must be `Signed`. + *- `message_origin`: The origin from which the message to be executed arrived. + *- `page`: The page in the queue in which the message to be executed is sitting. + *- `index`: The index into the queue of the message to be executed. + *- `weight_limit`: The maximum amount of weight allowed to be consumed in the execution + * of the message. + * + *Benchmark complexity considerations: O(index + weight_limit). + */ + execute_overweight: TxDescriptor>; + }; + AssetRate: { + /** + *Initialize a conversion rate to native balance for the given asset. + * + *## Complexity + *- O(1) + */ + create: TxDescriptor>; + /** + *Update the conversion rate to native balance for the given asset. + * + *## Complexity + *- O(1) + */ + update: TxDescriptor>; + /** + *Remove an existing conversion rate to native balance for the given asset. + * + *## Complexity + *- O(1) + */ + remove: TxDescriptor>; + }; + Beefy: { + /** + *Report voter equivocation/misbehavior. This method will verify the + *equivocation proof and validate the given key ownership proof + *against the extracted offender. If both are valid, the offence + *will be reported. + */ + report_equivocation: TxDescriptor>; + /** + *Report voter equivocation/misbehavior. This method will verify the + *equivocation proof and validate the given key ownership proof + *against the extracted offender. If both are valid, the offence + *will be reported. + * + *This extrinsic must be called unsigned and it is expected that only + *block authors will call it (validated in `ValidateUnsigned`), as such + *if the block author is defined it will be defined as the equivocation + *reporter. + */ + report_equivocation_unsigned: TxDescriptor>; + /** + *Reset BEEFY consensus by setting a new BEEFY genesis at `delay_in_blocks` blocks in the + *future. + * + *Note: `delay_in_blocks` has to be at least 1. + */ + set_new_genesis: TxDescriptor>; + }; +}; +type IEvent = { + System: { + /** + *An extrinsic completed successfully. + */ + ExtrinsicSuccess: PlainDescriptor>; + /** + *An extrinsic failed. + */ + ExtrinsicFailed: PlainDescriptor>; + /** + *`:code` was updated. + */ + CodeUpdated: PlainDescriptor; + /** + *A new account was created. + */ + NewAccount: PlainDescriptor>; + /** + *An account was reaped. + */ + KilledAccount: PlainDescriptor>; + /** + *On on-chain remark happened. + */ + Remarked: PlainDescriptor>; + /** + *An upgrade was authorized. + */ + UpgradeAuthorized: PlainDescriptor>; + }; + Indices: { + /** + *A account index was assigned. + */ + IndexAssigned: PlainDescriptor>; + /** + *A account index has been freed up (unassigned). + */ + IndexFreed: PlainDescriptor>; + /** + *A account index has been frozen to its current account ID. + */ + IndexFrozen: PlainDescriptor>; + }; + Balances: { + /** + *An account was created with some free balance. + */ + Endowed: PlainDescriptor>; + /** + *An account was removed whose balance was non-zero but below ExistentialDeposit, + *resulting in an outright loss. + */ + DustLost: PlainDescriptor>; + /** + *Transfer succeeded. + */ + Transfer: PlainDescriptor>; + /** + *A balance was set by root. + */ + BalanceSet: PlainDescriptor>; + /** + *Some balance was reserved (moved from free to reserved). + */ + Reserved: PlainDescriptor>; + /** + *Some balance was unreserved (moved from reserved to free). + */ + Unreserved: PlainDescriptor>; + /** + *Some balance was moved from the reserve of the first account to the second account. + *Final argument indicates the destination balance type. + */ + ReserveRepatriated: PlainDescriptor>; + /** + *Some amount was deposited (e.g. for transaction fees). + */ + Deposit: PlainDescriptor>; + /** + *Some amount was withdrawn from the account (e.g. for transaction fees). + */ + Withdraw: PlainDescriptor>; + /** + *Some amount was removed from the account (e.g. for misbehavior). + */ + Slashed: PlainDescriptor>; + /** + *Some amount was minted into an account. + */ + Minted: PlainDescriptor>; + /** + *Some amount was burned from an account. + */ + Burned: PlainDescriptor>; + /** + *Some amount was suspended from an account (it can be restored later). + */ + Suspended: PlainDescriptor>; + /** + *Some amount was restored into an account. + */ + Restored: PlainDescriptor>; + /** + *An account was upgraded. + */ + Upgraded: PlainDescriptor>; + /** + *Total issuance was increased by `amount`, creating a credit to be balanced. + */ + Issued: PlainDescriptor>; + /** + *Total issuance was decreased by `amount`, creating a debt to be balanced. + */ + Rescinded: PlainDescriptor>; + /** + *Some balance was locked. + */ + Locked: PlainDescriptor>; + /** + *Some balance was unlocked. + */ + Unlocked: PlainDescriptor>; + /** + *Some balance was frozen. + */ + Frozen: PlainDescriptor>; + /** + *Some balance was thawed. + */ + Thawed: PlainDescriptor>; + /** + *The `TotalIssuance` was forcefully changed. + */ + TotalIssuanceForced: PlainDescriptor>; + }; + TransactionPayment: { + /** + *A transaction fee `actual_fee`, of which `tip` was added to the minimum inclusion fee, + *has been paid by `who`. + */ + TransactionFeePaid: PlainDescriptor>; + }; + Staking: { + /** + *The era payout has been set; the first balance is the validator-payout; the second is + *the remainder from the maximum amount of reward. + */ + EraPaid: PlainDescriptor>; + /** + *The nominator has been rewarded by this amount to this destination. + */ + Rewarded: PlainDescriptor>; + /** + *A staker (validator or nominator) has been slashed by the given amount. + */ + Slashed: PlainDescriptor>; + /** + *A slash for the given validator, for the given percentage of their stake, at the given + *era as been reported. + */ + SlashReported: PlainDescriptor>; + /** + *An old slashing report from a prior era was discarded because it could + *not be processed. + */ + OldSlashingReportDiscarded: PlainDescriptor>; + /** + *A new set of stakers was elected. + */ + StakersElected: PlainDescriptor; + /** + *An account has bonded this amount. \[stash, amount\] + * + *NOTE: This event is only emitted when funds are bonded via a dispatchable. Notably, + *it will not be emitted for staking rewards when they are added to stake. + */ + Bonded: PlainDescriptor>; + /** + *An account has unbonded this amount. + */ + Unbonded: PlainDescriptor>; + /** + *An account has called `withdraw_unbonded` and removed unbonding chunks worth `Balance` + *from the unlocking queue. + */ + Withdrawn: PlainDescriptor>; + /** + *A nominator has been kicked from a validator. + */ + Kicked: PlainDescriptor>; + /** + *The election failed. No new era is planned. + */ + StakingElectionFailed: PlainDescriptor; + /** + *An account has stopped participating as either a validator or nominator. + */ + Chilled: PlainDescriptor>; + /** + *The stakers' rewards are getting paid. + */ + PayoutStarted: PlainDescriptor>; + /** + *A validator has set their preferences. + */ + ValidatorPrefsSet: PlainDescriptor>; + /** + *Voters size limit reached. + */ + SnapshotVotersSizeExceeded: PlainDescriptor>; + /** + *Targets size limit reached. + */ + SnapshotTargetsSizeExceeded: PlainDescriptor>; + /** + *A new force era mode was set. + */ + ForceEra: PlainDescriptor>; + /** + *Report of a controller batch deprecation. + */ + ControllerBatchDeprecated: PlainDescriptor>; + }; + Offences: { + /** + *There is an offence reported of the given `kind` happened at the `session_index` and + *(kind-specific) time slot. This event is not deposited for duplicate slashes. + *\[kind, timeslot\]. + */ + Offence: PlainDescriptor>; + }; + Session: { + /** + *New session has happened. Note that the argument is the session index, not the + *block number as the type might suggest. + */ + NewSession: PlainDescriptor>; + }; + Grandpa: { + /** + *New authority set has been applied. + */ + NewAuthorities: PlainDescriptor>; + /** + *Current authority set has been paused. + */ + Paused: PlainDescriptor; + /** + *Current authority set has been resumed. + */ + Resumed: PlainDescriptor; + }; + Treasury: { + /** + *We have ended a spend period and will now allocate funds. + */ + Spending: PlainDescriptor>; + /** + *Some funds have been allocated. + */ + Awarded: PlainDescriptor>; + /** + *Some of our funds have been burnt. + */ + Burnt: PlainDescriptor>; + /** + *Spending has finished; this is the amount that rolls over until next spend. + */ + Rollover: PlainDescriptor>; + /** + *Some funds have been deposited. + */ + Deposit: PlainDescriptor>; + /** + *A new spend proposal has been approved. + */ + SpendApproved: PlainDescriptor>; + /** + *The inactive funds of the pallet have been updated. + */ + UpdatedInactive: PlainDescriptor>; + /** + *A new asset spend proposal has been approved. + */ + AssetSpendApproved: PlainDescriptor>; + /** + *An approved spend was voided. + */ + AssetSpendVoided: PlainDescriptor>; + /** + *A payment happened. + */ + Paid: PlainDescriptor>; + /** + *A payment failed and can be retried. + */ + PaymentFailed: PlainDescriptor>; + /** + *A spend was processed and removed from the storage. It might have been successfully + *paid or it may have expired. + */ + SpendProcessed: PlainDescriptor>; + }; + ConvictionVoting: { + /** + *An account has delegated their vote to another account. \[who, target\] + */ + Delegated: PlainDescriptor>; + /** + *An \[account\] has cancelled a previous delegation operation. + */ + Undelegated: PlainDescriptor; + }; + Referenda: { + /** + *A referendum has been submitted. + */ + Submitted: PlainDescriptor>; + /** + *The decision deposit has been placed. + */ + DecisionDepositPlaced: PlainDescriptor>; + /** + *The decision deposit has been refunded. + */ + DecisionDepositRefunded: PlainDescriptor>; + /** + *A deposit has been slashed. + */ + DepositSlashed: PlainDescriptor>; + /** + *A referendum has moved into the deciding phase. + */ + DecisionStarted: PlainDescriptor>; + /** + + */ + ConfirmStarted: PlainDescriptor>; + /** + + */ + ConfirmAborted: PlainDescriptor>; + /** + *A referendum has ended its confirmation phase and is ready for approval. + */ + Confirmed: PlainDescriptor>; + /** + *A referendum has been approved and its proposal has been scheduled. + */ + Approved: PlainDescriptor>; + /** + *A proposal has been rejected by referendum. + */ + Rejected: PlainDescriptor>; + /** + *A referendum has been timed out without being decided. + */ + TimedOut: PlainDescriptor>; + /** + *A referendum has been cancelled. + */ + Cancelled: PlainDescriptor>; + /** + *A referendum has been killed. + */ + Killed: PlainDescriptor>; + /** + *The submission deposit has been refunded. + */ + SubmissionDepositRefunded: PlainDescriptor>; + /** + *Metadata for a referendum has been set. + */ + MetadataSet: PlainDescriptor>; + /** + *Metadata for a referendum has been cleared. + */ + MetadataCleared: PlainDescriptor>; + }; + FellowshipCollective: { + /** + *A member `who` has been added. + */ + MemberAdded: PlainDescriptor>; + /** + *The member `who`se rank has been changed to the given `rank`. + */ + RankChanged: PlainDescriptor>; + /** + *The member `who` of given `rank` has been removed from the collective. + */ + MemberRemoved: PlainDescriptor>; + /** + *The member `who` has voted for the `poll` with the given `vote` leading to an updated + *`tally`. + */ + Voted: PlainDescriptor>; + /** + *The member `who` had their `AccountId` changed to `new_who`. + */ + MemberExchanged: PlainDescriptor>; + }; + FellowshipReferenda: { + /** + *A referendum has been submitted. + */ + Submitted: PlainDescriptor>; + /** + *The decision deposit has been placed. + */ + DecisionDepositPlaced: PlainDescriptor>; + /** + *The decision deposit has been refunded. + */ + DecisionDepositRefunded: PlainDescriptor>; + /** + *A deposit has been slashed. + */ + DepositSlashed: PlainDescriptor>; + /** + *A referendum has moved into the deciding phase. + */ + DecisionStarted: PlainDescriptor>; + /** + + */ + ConfirmStarted: PlainDescriptor>; + /** + + */ + ConfirmAborted: PlainDescriptor>; + /** + *A referendum has ended its confirmation phase and is ready for approval. + */ + Confirmed: PlainDescriptor>; + /** + *A referendum has been approved and its proposal has been scheduled. + */ + Approved: PlainDescriptor>; + /** + *A proposal has been rejected by referendum. + */ + Rejected: PlainDescriptor>; + /** + *A referendum has been timed out without being decided. + */ + TimedOut: PlainDescriptor>; + /** + *A referendum has been cancelled. + */ + Cancelled: PlainDescriptor>; + /** + *A referendum has been killed. + */ + Killed: PlainDescriptor>; + /** + *The submission deposit has been refunded. + */ + SubmissionDepositRefunded: PlainDescriptor>; + /** + *Metadata for a referendum has been set. + */ + MetadataSet: PlainDescriptor>; + /** + *Metadata for a referendum has been cleared. + */ + MetadataCleared: PlainDescriptor>; + }; + Whitelist: { + /** + + */ + CallWhitelisted: PlainDescriptor>; + /** + + */ + WhitelistedCallRemoved: PlainDescriptor>; + /** + + */ + WhitelistedCallDispatched: PlainDescriptor>; + }; + Parameters: { + /** + *A Parameter was set. + * + *Is also emitted when the value was not changed. + */ + Updated: PlainDescriptor>; + }; + Claims: { + /** + *Someone claimed some DOTs. + */ + Claimed: PlainDescriptor>; + }; + Utility: { + /** + *Batch of dispatches did not complete fully. Index of first failing dispatch given, as + *well as the error. + */ + BatchInterrupted: PlainDescriptor>; + /** + *Batch of dispatches completed fully with no error. + */ + BatchCompleted: PlainDescriptor; + /** + *Batch of dispatches completed but has errors. + */ + BatchCompletedWithErrors: PlainDescriptor; + /** + *A single item within a Batch of dispatches has completed with no error. + */ + ItemCompleted: PlainDescriptor; + /** + *A single item within a Batch of dispatches has completed with error. + */ + ItemFailed: PlainDescriptor>; + /** + *A call was dispatched. + */ + DispatchedAs: PlainDescriptor>; + }; + Society: { + /** + *The society is founded by the given identity. + */ + Founded: PlainDescriptor>; + /** + *A membership bid just happened. The given account is the candidate's ID and their offer + *is the second. + */ + Bid: PlainDescriptor>; + /** + *A membership bid just happened by vouching. The given account is the candidate's ID and + *their offer is the second. The vouching party is the third. + */ + Vouch: PlainDescriptor>; + /** + *A candidate was dropped (due to an excess of bids in the system). + */ + AutoUnbid: PlainDescriptor>; + /** + *A candidate was dropped (by their request). + */ + Unbid: PlainDescriptor>; + /** + *A candidate was dropped (by request of who vouched for them). + */ + Unvouch: PlainDescriptor>; + /** + *A group of candidates have been inducted. The batch's primary is the first value, the + *batch in full is the second. + */ + Inducted: PlainDescriptor>; + /** + *A suspended member has been judged. + */ + SuspendedMemberJudgement: PlainDescriptor>; + /** + *A candidate has been suspended + */ + CandidateSuspended: PlainDescriptor>; + /** + *A member has been suspended + */ + MemberSuspended: PlainDescriptor>; + /** + *A member has been challenged + */ + Challenged: PlainDescriptor>; + /** + *A vote has been placed + */ + Vote: PlainDescriptor>; + /** + *A vote has been placed for a defending member + */ + DefenderVote: PlainDescriptor>; + /** + *A new set of \[params\] has been set for the group. + */ + NewParams: PlainDescriptor>; + /** + *Society is unfounded. + */ + Unfounded: PlainDescriptor>; + /** + *Some funds were deposited into the society account. + */ + Deposit: PlainDescriptor>; + /** + *A \[member\] got elevated to \[rank\]. + */ + Elevated: PlainDescriptor>; + }; + Recovery: { + /** + *A recovery process has been set up for an account. + */ + RecoveryCreated: PlainDescriptor>; + /** + *A recovery process has been initiated for lost account by rescuer account. + */ + RecoveryInitiated: PlainDescriptor>; + /** + *A recovery process for lost account by rescuer account has been vouched for by sender. + */ + RecoveryVouched: PlainDescriptor>; + /** + *A recovery process for lost account by rescuer account has been closed. + */ + RecoveryClosed: PlainDescriptor>; + /** + *Lost account has been successfully recovered by rescuer account. + */ + AccountRecovered: PlainDescriptor>; + /** + *A recovery process has been removed for an account. + */ + RecoveryRemoved: PlainDescriptor>; + }; + Vesting: { + /** + *The amount vested has been updated. This could indicate a change in funds available. + *The balance given is the amount which is left unvested (and thus locked). + */ + VestingUpdated: PlainDescriptor>; + /** + *An \[account\] has become fully vested. + */ + VestingCompleted: PlainDescriptor>; + }; + Scheduler: { + /** + *Scheduled some task. + */ + Scheduled: PlainDescriptor>; + /** + *Canceled some task. + */ + Canceled: PlainDescriptor>; + /** + *Dispatched some task. + */ + Dispatched: PlainDescriptor>; + /** + *Set a retry configuration for some task. + */ + RetrySet: PlainDescriptor>; + /** + *Cancel a retry configuration for some task. + */ + RetryCancelled: PlainDescriptor>; + /** + *The call for the provided hash was not found so the task has been aborted. + */ + CallUnavailable: PlainDescriptor>; + /** + *The given task was unable to be renewed since the agenda is full at that block. + */ + PeriodicFailed: PlainDescriptor>; + /** + *The given task was unable to be retried since the agenda is full at that block or there + *was not enough weight to reschedule it. + */ + RetryFailed: PlainDescriptor>; + /** + *The given task can never be executed since it is overweight. + */ + PermanentlyOverweight: PlainDescriptor>; + }; + Proxy: { + /** + *A proxy was executed correctly, with the given. + */ + ProxyExecuted: PlainDescriptor>; + /** + *A pure account has been created by new proxy with given + *disambiguation index and proxy type. + */ + PureCreated: PlainDescriptor>; + /** + *An announcement was placed to make a call in the future. + */ + Announced: PlainDescriptor>; + /** + *A proxy was added. + */ + ProxyAdded: PlainDescriptor>; + /** + *A proxy was removed. + */ + ProxyRemoved: PlainDescriptor>; + }; + Multisig: { + /** + *A new multisig operation has begun. + */ + NewMultisig: PlainDescriptor>; + /** + *A multisig operation has been approved by someone. + */ + MultisigApproval: PlainDescriptor>; + /** + *A multisig operation has been executed. + */ + MultisigExecuted: PlainDescriptor>; + /** + *A multisig operation has been cancelled. + */ + MultisigCancelled: PlainDescriptor>; + }; + Preimage: { + /** + *A preimage has been noted. + */ + Noted: PlainDescriptor>; + /** + *A preimage has been requested. + */ + Requested: PlainDescriptor>; + /** + *A preimage has ben cleared. + */ + Cleared: PlainDescriptor>; + }; + Bounties: { + /** + *New bounty proposal. + */ + BountyProposed: PlainDescriptor>; + /** + *A bounty proposal was rejected; funds were slashed. + */ + BountyRejected: PlainDescriptor>; + /** + *A bounty proposal is funded and became active. + */ + BountyBecameActive: PlainDescriptor>; + /** + *A bounty is awarded to a beneficiary. + */ + BountyAwarded: PlainDescriptor>; + /** + *A bounty is claimed by beneficiary. + */ + BountyClaimed: PlainDescriptor>; + /** + *A bounty is cancelled. + */ + BountyCanceled: PlainDescriptor>; + /** + *A bounty expiry is extended. + */ + BountyExtended: PlainDescriptor>; + /** + *A bounty is approved. + */ + BountyApproved: PlainDescriptor>; + /** + *A bounty curator is proposed. + */ + CuratorProposed: PlainDescriptor>; + /** + *A bounty curator is unassigned. + */ + CuratorUnassigned: PlainDescriptor>; + /** + *A bounty curator is accepted. + */ + CuratorAccepted: PlainDescriptor>; + }; + ChildBounties: { + /** + *A child-bounty is added. + */ + Added: PlainDescriptor>; + /** + *A child-bounty is awarded to a beneficiary. + */ + Awarded: PlainDescriptor>; + /** + *A child-bounty is claimed by beneficiary. + */ + Claimed: PlainDescriptor>; + /** + *A child-bounty is cancelled. + */ + Canceled: PlainDescriptor>; + }; + ElectionProviderMultiPhase: { + /** + *A solution was stored with the given compute. + * + *The `origin` indicates the origin of the solution. If `origin` is `Some(AccountId)`, + *the stored solution was submitted in the signed phase by a miner with the `AccountId`. + *Otherwise, the solution was stored either during the unsigned phase or by + *`T::ForceOrigin`. The `bool` is `true` when a previous solution was ejected to make + *room for this one. + */ + SolutionStored: PlainDescriptor>; + /** + *The election has been finalized, with the given computation and score. + */ + ElectionFinalized: PlainDescriptor>; + /** + *An election failed. + * + *Not much can be said about which computes failed in the process. + */ + ElectionFailed: PlainDescriptor; + /** + *An account has been rewarded for their signed submission being finalized. + */ + Rewarded: PlainDescriptor>; + /** + *An account has been slashed for submitting an invalid signed submission. + */ + Slashed: PlainDescriptor>; + /** + *There was a phase transition in a given round. + */ + PhaseTransitioned: PlainDescriptor>; + }; + Nis: { + /** + *A bid was successfully placed. + */ + BidPlaced: PlainDescriptor>; + /** + *A bid was successfully removed (before being accepted). + */ + BidRetracted: PlainDescriptor>; + /** + *A bid was dropped from a queue because of another, more substantial, bid was present. + */ + BidDropped: PlainDescriptor>; + /** + *A bid was accepted. The balance may not be released until expiry. + */ + Issued: PlainDescriptor>; + /** + *An receipt has been (at least partially) thawed. + */ + Thawed: PlainDescriptor>; + /** + *An automatic funding of the deficit was made. + */ + Funded: PlainDescriptor>; + /** + *A receipt was transferred. + */ + Transferred: PlainDescriptor>; + }; + NisCounterpartBalances: { + /** + *An account was created with some free balance. + */ + Endowed: PlainDescriptor>; + /** + *An account was removed whose balance was non-zero but below ExistentialDeposit, + *resulting in an outright loss. + */ + DustLost: PlainDescriptor>; + /** + *Transfer succeeded. + */ + Transfer: PlainDescriptor>; + /** + *A balance was set by root. + */ + BalanceSet: PlainDescriptor>; + /** + *Some balance was reserved (moved from free to reserved). + */ + Reserved: PlainDescriptor>; + /** + *Some balance was unreserved (moved from reserved to free). + */ + Unreserved: PlainDescriptor>; + /** + *Some balance was moved from the reserve of the first account to the second account. + *Final argument indicates the destination balance type. + */ + ReserveRepatriated: PlainDescriptor>; + /** + *Some amount was deposited (e.g. for transaction fees). + */ + Deposit: PlainDescriptor>; + /** + *Some amount was withdrawn from the account (e.g. for transaction fees). + */ + Withdraw: PlainDescriptor>; + /** + *Some amount was removed from the account (e.g. for misbehavior). + */ + Slashed: PlainDescriptor>; + /** + *Some amount was minted into an account. + */ + Minted: PlainDescriptor>; + /** + *Some amount was burned from an account. + */ + Burned: PlainDescriptor>; + /** + *Some amount was suspended from an account (it can be restored later). + */ + Suspended: PlainDescriptor>; + /** + *Some amount was restored into an account. + */ + Restored: PlainDescriptor>; + /** + *An account was upgraded. + */ + Upgraded: PlainDescriptor>; + /** + *Total issuance was increased by `amount`, creating a credit to be balanced. + */ + Issued: PlainDescriptor>; + /** + *Total issuance was decreased by `amount`, creating a debt to be balanced. + */ + Rescinded: PlainDescriptor>; + /** + *Some balance was locked. + */ + Locked: PlainDescriptor>; + /** + *Some balance was unlocked. + */ + Unlocked: PlainDescriptor>; + /** + *Some balance was frozen. + */ + Frozen: PlainDescriptor>; + /** + *Some balance was thawed. + */ + Thawed: PlainDescriptor>; + /** + *The `TotalIssuance` was forcefully changed. + */ + TotalIssuanceForced: PlainDescriptor>; + }; + VoterList: { + /** + *Moved an account from one bag to another. + */ + Rebagged: PlainDescriptor>; + /** + *Updated the score of some account to the given amount. + */ + ScoreUpdated: PlainDescriptor>; + }; + NominationPools: { + /** + *A pool has been created. + */ + Created: PlainDescriptor>; + /** + *A member has became bonded in a pool. + */ + Bonded: PlainDescriptor>; + /** + *A payout has been made to a member. + */ + PaidOut: PlainDescriptor>; + /** + *A member has unbonded from their pool. + * + *- `balance` is the corresponding balance of the number of points that has been + * requested to be unbonded (the argument of the `unbond` transaction) from the bonded + * pool. + *- `points` is the number of points that are issued as a result of `balance` being + *dissolved into the corresponding unbonding pool. + *- `era` is the era in which the balance will be unbonded. + *In the absence of slashing, these values will match. In the presence of slashing, the + *number of points that are issued in the unbonding pool will be less than the amount + *requested to be unbonded. + */ + Unbonded: PlainDescriptor>; + /** + *A member has withdrawn from their pool. + * + *The given number of `points` have been dissolved in return of `balance`. + * + *Similar to `Unbonded` event, in the absence of slashing, the ratio of point to balance + *will be 1. + */ + Withdrawn: PlainDescriptor>; + /** + *A pool has been destroyed. + */ + Destroyed: PlainDescriptor>; + /** + *The state of a pool has changed + */ + StateChanged: PlainDescriptor>; + /** + *A member has been removed from a pool. + * + *The removal can be voluntary (withdrawn all unbonded funds) or involuntary (kicked). + */ + MemberRemoved: PlainDescriptor>; + /** + *The roles of a pool have been updated to the given new roles. Note that the depositor + *can never change. + */ + RolesUpdated: PlainDescriptor>; + /** + *The active balance of pool `pool_id` has been slashed to `balance`. + */ + PoolSlashed: PlainDescriptor>; + /** + *The unbond pool at `era` of pool `pool_id` has been slashed to `balance`. + */ + UnbondingPoolSlashed: PlainDescriptor>; + /** + *A pool's commission setting has been changed. + */ + PoolCommissionUpdated: PlainDescriptor>; + /** + *A pool's maximum commission setting has been changed. + */ + PoolMaxCommissionUpdated: PlainDescriptor>; + /** + *A pool's commission `change_rate` has been changed. + */ + PoolCommissionChangeRateUpdated: PlainDescriptor>; + /** + *Pool commission claim permission has been updated. + */ + PoolCommissionClaimPermissionUpdated: PlainDescriptor>; + /** + *Pool commission has been claimed. + */ + PoolCommissionClaimed: PlainDescriptor>; + /** + *Topped up deficit in frozen ED of the reward pool. + */ + MinBalanceDeficitAdjusted: PlainDescriptor>; + /** + *Claimed excess frozen ED of af the reward pool. + */ + MinBalanceExcessAdjusted: PlainDescriptor>; + }; + FastUnstake: { + /** + *A staker was unstaked. + */ + Unstaked: PlainDescriptor>; + /** + *A staker was slashed for requesting fast-unstake whilst being exposed. + */ + Slashed: PlainDescriptor>; + /** + *A batch was partially checked for the given eras, but the process did not finish. + */ + BatchChecked: PlainDescriptor>; + /** + *A batch of a given size was terminated. + * + *This is always follows by a number of `Unstaked` or `Slashed` events, marking the end + *of the batch. A new batch will be created upon next block. + */ + BatchFinished: PlainDescriptor>; + /** + *An internal error happened. Operations will be paused now. + */ + InternalError: PlainDescriptor; + }; + ParaInclusion: { + /** + *A candidate was backed. `[candidate, head_data]` + */ + CandidateBacked: PlainDescriptor>; + /** + *A candidate was included. `[candidate, head_data]` + */ + CandidateIncluded: PlainDescriptor>; + /** + *A candidate timed out. `[candidate, head_data]` + */ + CandidateTimedOut: PlainDescriptor>; + /** + *Some upward messages have been received and will be processed. + */ + UpwardMessagesReceived: PlainDescriptor>; + }; + Paras: { + /** + *Current code has been updated for a Para. `para_id` + */ + CurrentCodeUpdated: PlainDescriptor; + /** + *Current head has been updated for a Para. `para_id` + */ + CurrentHeadUpdated: PlainDescriptor; + /** + *A code upgrade has been scheduled for a Para. `para_id` + */ + CodeUpgradeScheduled: PlainDescriptor; + /** + *A new head has been noted for a Para. `para_id` + */ + NewHeadNoted: PlainDescriptor; + /** + *A para has been queued to execute pending actions. `para_id` + */ + ActionQueued: PlainDescriptor>; + /** + *The given para either initiated or subscribed to a PVF check for the given validation + *code. `code_hash` `para_id` + */ + PvfCheckStarted: PlainDescriptor>; + /** + *The given validation code was accepted by the PVF pre-checking vote. + *`code_hash` `para_id` + */ + PvfCheckAccepted: PlainDescriptor>; + /** + *The given validation code was rejected by the PVF pre-checking vote. + *`code_hash` `para_id` + */ + PvfCheckRejected: PlainDescriptor>; + }; + Hrmp: { + /** + *Open HRMP channel requested. + */ + OpenChannelRequested: PlainDescriptor>; + /** + *An HRMP channel request sent by the receiver was canceled by either party. + */ + OpenChannelCanceled: PlainDescriptor>; + /** + *Open HRMP channel accepted. + */ + OpenChannelAccepted: PlainDescriptor>; + /** + *HRMP channel closed. + */ + ChannelClosed: PlainDescriptor>; + /** + *An HRMP channel was opened via Root origin. + */ + HrmpChannelForceOpened: PlainDescriptor>; + /** + *An HRMP channel was opened with a system chain. + */ + HrmpSystemChannelOpened: PlainDescriptor>; + /** + *An HRMP channel's deposits were updated. + */ + OpenChannelDepositsUpdated: PlainDescriptor>; + }; + ParasDisputes: { + /** + *A dispute has been initiated. \[candidate hash, dispute location\] + */ + DisputeInitiated: PlainDescriptor>; + /** + *A dispute has concluded for or against a candidate. + *`\[para id, candidate hash, dispute result\]` + */ + DisputeConcluded: PlainDescriptor>; + /** + *A dispute has concluded with supermajority against a candidate. + *Block authors should no longer build on top of this head and should + *instead revert the block at the given height. This should be the + *number of the child of the last known valid block in the chain. + */ + Revert: PlainDescriptor; + }; + OnDemandAssignmentProvider: { + /** + *An order was placed at some spot price amount by orderer ordered_by + */ + OnDemandOrderPlaced: PlainDescriptor>; + /** + *The value of the spot price has likely changed + */ + SpotPriceSet: PlainDescriptor>; + }; + Registrar: { + /** + + */ + Registered: PlainDescriptor>; + /** + + */ + Deregistered: PlainDescriptor>; + /** + + */ + Reserved: PlainDescriptor>; + /** + + */ + Swapped: PlainDescriptor>; + }; + Slots: { + /** + *A new `[lease_period]` is beginning. + */ + NewLeasePeriod: PlainDescriptor>; + /** + *A para has won the right to a continuous set of lease periods as a parachain. + *First balance is any extra amount reserved on top of the para's existing deposit. + *Second balance is the total amount reserved. + */ + Leased: PlainDescriptor>; + }; + Auctions: { + /** + *An auction started. Provides its index and the block number where it will begin to + *close and the first lease period of the quadruplet that is auctioned. + */ + AuctionStarted: PlainDescriptor>; + /** + *An auction ended. All funds become unreserved. + */ + AuctionClosed: PlainDescriptor>; + /** + *Funds were reserved for a winning bid. First balance is the extra amount reserved. + *Second is the total. + */ + Reserved: PlainDescriptor>; + /** + *Funds were unreserved since bidder is no longer active. `[bidder, amount]` + */ + Unreserved: PlainDescriptor>; + /** + *Someone attempted to lease the same slot twice for a parachain. The amount is held in + *reserve but no parachain slot has been leased. + */ + ReserveConfiscated: PlainDescriptor>; + /** + *A new bid has been accepted as the current winner. + */ + BidAccepted: PlainDescriptor>; + /** + *The winning offset was chosen for an auction. This will map into the `Winning` storage + *map. + */ + WinningOffset: PlainDescriptor>; + }; + Crowdloan: { + /** + *Create a new crowdloaning campaign. + */ + Created: PlainDescriptor>; + /** + *Contributed to a crowd sale. + */ + Contributed: PlainDescriptor>; + /** + *Withdrew full balance of a contributor. + */ + Withdrew: PlainDescriptor>; + /** + *The loans in a fund have been partially dissolved, i.e. there are some left + *over child keys that still need to be killed. + */ + PartiallyRefunded: PlainDescriptor>; + /** + *All loans in a fund have been refunded. + */ + AllRefunded: PlainDescriptor>; + /** + *Fund is dissolved. + */ + Dissolved: PlainDescriptor>; + /** + *The result of trying to submit a new bid to the Slots pallet. + */ + HandleBidResult: PlainDescriptor>; + /** + *The configuration to a crowdloan has been edited. + */ + Edited: PlainDescriptor>; + /** + *A memo has been updated. + */ + MemoUpdated: PlainDescriptor>; + /** + *A parachain has been moved to `NewRaise` + */ + AddedToNewRaise: PlainDescriptor>; + }; + Coretime: { + /** + *The broker chain has asked for revenue information for a specific block. + */ + RevenueInfoRequested: PlainDescriptor>; + /** + *A core has received a new assignment from the broker chain. + */ + CoreAssigned: PlainDescriptor>; + }; + XcmPallet: { + /** + *Execution of an XCM message was attempted. + */ + Attempted: PlainDescriptor>; + /** + *A XCM message was sent. + */ + Sent: PlainDescriptor>; + /** + *Query response received which does not match a registered query. This may be because a + *matching query was never registered, it may be because it is a duplicate response, or + *because the query timed out. + */ + UnexpectedResponse: PlainDescriptor>; + /** + *Query response has been received and is ready for taking with `take_response`. There is + *no registered notification call. + */ + ResponseReady: PlainDescriptor>; + /** + *Query response has been received and query is removed. The registered notification has + *been dispatched and executed successfully. + */ + Notified: PlainDescriptor>; + /** + *Query response has been received and query is removed. The registered notification + *could not be dispatched because the dispatch weight is greater than the maximum weight + *originally budgeted by this runtime for the query result. + */ + NotifyOverweight: PlainDescriptor>; + /** + *Query response has been received and query is removed. There was a general error with + *dispatching the notification call. + */ + NotifyDispatchError: PlainDescriptor>; + /** + *Query response has been received and query is removed. The dispatch was unable to be + *decoded into a `Call`; this might be due to dispatch function having a signature which + *is not `(origin, QueryId, Response)`. + */ + NotifyDecodeFailed: PlainDescriptor>; + /** + *Expected query response has been received but the origin location of the response does + *not match that expected. The query remains registered for a later, valid, response to + *be received and acted upon. + */ + InvalidResponder: PlainDescriptor>; + /** + *Expected query response has been received but the expected origin location placed in + *storage by this runtime previously cannot be decoded. The query remains registered. + * + *This is unexpected (since a location placed in storage in a previously executing + *runtime should be readable prior to query timeout) and dangerous since the possibly + *valid response will be dropped. Manual governance intervention is probably going to be + *needed. + */ + InvalidResponderVersion: PlainDescriptor>; + /** + *Received query response has been read and removed. + */ + ResponseTaken: PlainDescriptor>; + /** + *Some assets have been placed in an asset trap. + */ + AssetsTrapped: PlainDescriptor>; + /** + *An XCM version change notification message has been attempted to be sent. + * + *The cost of sending it (borne by the chain) is included. + */ + VersionChangeNotified: PlainDescriptor>; + /** + *The supported version of a location has been changed. This might be through an + *automatic notification or a manual intervention. + */ + SupportedVersionChanged: PlainDescriptor>; + /** + *A given location which had a version change subscription was dropped owing to an error + *sending the notification to it. + */ + NotifyTargetSendFail: PlainDescriptor>; + /** + *A given location which had a version change subscription was dropped owing to an error + *migrating the location to our new XCM format. + */ + NotifyTargetMigrationFail: PlainDescriptor>; + /** + *Expected query response has been received but the expected querier location placed in + *storage by this runtime previously cannot be decoded. The query remains registered. + * + *This is unexpected (since a location placed in storage in a previously executing + *runtime should be readable prior to query timeout) and dangerous since the possibly + *valid response will be dropped. Manual governance intervention is probably going to be + *needed. + */ + InvalidQuerierVersion: PlainDescriptor>; + /** + *Expected query response has been received but the querier location of the response does + *not match the expected. The query remains registered for a later, valid, response to + *be received and acted upon. + */ + InvalidQuerier: PlainDescriptor>; + /** + *A remote has requested XCM version change notification from us and we have honored it. + *A version information message is sent to them and its cost is included. + */ + VersionNotifyStarted: PlainDescriptor>; + /** + *We have requested that a remote chain send us XCM version change notifications. + */ + VersionNotifyRequested: PlainDescriptor>; + /** + *We have requested that a remote chain stops sending us XCM version change + *notifications. + */ + VersionNotifyUnrequested: PlainDescriptor>; + /** + *Fees were paid from a location for an operation (often for using `SendXcm`). + */ + FeesPaid: PlainDescriptor>; + /** + *Some assets have been claimed from an asset trap + */ + AssetsClaimed: PlainDescriptor>; + /** + *A XCM version migration finished. + */ + VersionMigrationFinished: PlainDescriptor>; + }; + MessageQueue: { + /** + *Message discarded due to an error in the `MessageProcessor` (usually a format error). + */ + ProcessingFailed: PlainDescriptor>; + /** + *Message is processed. + */ + Processed: PlainDescriptor>; + /** + *Message placed in overweight queue. + */ + OverweightEnqueued: PlainDescriptor>; + /** + *This page was reaped. + */ + PageReaped: PlainDescriptor>; + }; + AssetRate: { + /** + + */ + AssetRateCreated: PlainDescriptor>; + /** + + */ + AssetRateRemoved: PlainDescriptor>; + /** + + */ + AssetRateUpdated: PlainDescriptor>; + }; +}; +type IError = { + System: { + /** + *The name of specification does not match between the current runtime + *and the new runtime. + */ + InvalidSpecName: PlainDescriptor; + /** + *The specification version is not allowed to decrease between the current runtime + *and the new runtime. + */ + SpecVersionNeedsToIncrease: PlainDescriptor; + /** + *Failed to extract the runtime version from the new runtime. + * + *Either calling `Core_version` or decoding `RuntimeVersion` failed. + */ + FailedToExtractRuntimeVersion: PlainDescriptor; + /** + *Suicide called when the account has non-default composite data. + */ + NonDefaultComposite: PlainDescriptor; + /** + *There is a non-zero reference count preventing the account from being purged. + */ + NonZeroRefCount: PlainDescriptor; + /** + *The origin filter prevent the call to be dispatched. + */ + CallFiltered: PlainDescriptor; + /** + *A multi-block migration is ongoing and prevents the current code from being replaced. + */ + MultiBlockMigrationsOngoing: PlainDescriptor; + /** + *No upgrade authorized. + */ + NothingAuthorized: PlainDescriptor; + /** + *The submitted code is not authorized. + */ + Unauthorized: PlainDescriptor; + }; + Babe: { + /** + *An equivocation proof provided as part of an equivocation report is invalid. + */ + InvalidEquivocationProof: PlainDescriptor; + /** + *A key ownership proof provided as part of an equivocation report is invalid. + */ + InvalidKeyOwnershipProof: PlainDescriptor; + /** + *A given equivocation report is valid but already previously reported. + */ + DuplicateOffenceReport: PlainDescriptor; + /** + *Submitted configuration is invalid. + */ + InvalidConfiguration: PlainDescriptor; + }; + Indices: { + /** + *The index was not already assigned. + */ + NotAssigned: PlainDescriptor; + /** + *The index is assigned to another account. + */ + NotOwner: PlainDescriptor; + /** + *The index was not available. + */ + InUse: PlainDescriptor; + /** + *The source and destination accounts are identical. + */ + NotTransfer: PlainDescriptor; + /** + *The index is permanent and may not be freed/changed. + */ + Permanent: PlainDescriptor; + }; + Balances: { + /** + *Vesting balance too high to send value. + */ + VestingBalance: PlainDescriptor; + /** + *Account liquidity restrictions prevent withdrawal. + */ + LiquidityRestrictions: PlainDescriptor; + /** + *Balance too low to send value. + */ + InsufficientBalance: PlainDescriptor; + /** + *Value too low to create account due to existential deposit. + */ + ExistentialDeposit: PlainDescriptor; + /** + *Transfer/payment would kill account. + */ + Expendability: PlainDescriptor; + /** + *A vesting schedule already exists for this account. + */ + ExistingVestingSchedule: PlainDescriptor; + /** + *Beneficiary account must pre-exist. + */ + DeadAccount: PlainDescriptor; + /** + *Number of named reserves exceed `MaxReserves`. + */ + TooManyReserves: PlainDescriptor; + /** + *Number of holds exceed `VariantCountOf`. + */ + TooManyHolds: PlainDescriptor; + /** + *Number of freezes exceed `MaxFreezes`. + */ + TooManyFreezes: PlainDescriptor; + /** + *The issuance cannot be modified since it is already deactivated. + */ + IssuanceDeactivated: PlainDescriptor; + /** + *The delta cannot be zero. + */ + DeltaZero: PlainDescriptor; + }; + Staking: { + /** + *Not a controller account. + */ + NotController: PlainDescriptor; + /** + *Not a stash account. + */ + NotStash: PlainDescriptor; + /** + *Stash is already bonded. + */ + AlreadyBonded: PlainDescriptor; + /** + *Controller is already paired. + */ + AlreadyPaired: PlainDescriptor; + /** + *Targets cannot be empty. + */ + EmptyTargets: PlainDescriptor; + /** + *Duplicate index. + */ + DuplicateIndex: PlainDescriptor; + /** + *Slash record index out of bounds. + */ + InvalidSlashIndex: PlainDescriptor; + /** + *Cannot have a validator or nominator role, with value less than the minimum defined by + *governance (see `MinValidatorBond` and `MinNominatorBond`). If unbonding is the + *intention, `chill` first to remove one's role as validator/nominator. + */ + InsufficientBond: PlainDescriptor; + /** + *Can not schedule more unlock chunks. + */ + NoMoreChunks: PlainDescriptor; + /** + *Can not rebond without unlocking chunks. + */ + NoUnlockChunk: PlainDescriptor; + /** + *Attempting to target a stash that still has funds. + */ + FundedTarget: PlainDescriptor; + /** + *Invalid era to reward. + */ + InvalidEraToReward: PlainDescriptor; + /** + *Invalid number of nominations. + */ + InvalidNumberOfNominations: PlainDescriptor; + /** + *Items are not sorted and unique. + */ + NotSortedAndUnique: PlainDescriptor; + /** + *Rewards for this era have already been claimed for this validator. + */ + AlreadyClaimed: PlainDescriptor; + /** + *No nominators exist on this page. + */ + InvalidPage: PlainDescriptor; + /** + *Incorrect previous history depth input provided. + */ + IncorrectHistoryDepth: PlainDescriptor; + /** + *Incorrect number of slashing spans provided. + */ + IncorrectSlashingSpans: PlainDescriptor; + /** + *Internal state has become somehow corrupted and the operation cannot continue. + */ + BadState: PlainDescriptor; + /** + *Too many nomination targets supplied. + */ + TooManyTargets: PlainDescriptor; + /** + *A nomination target was supplied that was blocked or otherwise not a validator. + */ + BadTarget: PlainDescriptor; + /** + *The user has enough bond and thus cannot be chilled forcefully by an external person. + */ + CannotChillOther: PlainDescriptor; + /** + *There are too many nominators in the system. Governance needs to adjust the staking + *settings to keep things safe for the runtime. + */ + TooManyNominators: PlainDescriptor; + /** + *There are too many validator candidates in the system. Governance needs to adjust the + *staking settings to keep things safe for the runtime. + */ + TooManyValidators: PlainDescriptor; + /** + *Commission is too low. Must be at least `MinCommission`. + */ + CommissionTooLow: PlainDescriptor; + /** + *Some bound is not met. + */ + BoundNotMet: PlainDescriptor; + /** + *Used when attempting to use deprecated controller account logic. + */ + ControllerDeprecated: PlainDescriptor; + /** + *Cannot reset a ledger. + */ + CannotRestoreLedger: PlainDescriptor; + /** + *Provided reward destination is not allowed. + */ + RewardDestinationRestricted: PlainDescriptor; + /** + *Not enough funds available to withdraw. + */ + NotEnoughFunds: PlainDescriptor; + /** + *Operation not allowed for virtual stakers. + */ + VirtualStakerNotAllowed: PlainDescriptor; + }; + Session: { + /** + *Invalid ownership proof. + */ + InvalidProof: PlainDescriptor; + /** + *No associated validator ID for account. + */ + NoAssociatedValidatorId: PlainDescriptor; + /** + *Registered duplicate key. + */ + DuplicatedKey: PlainDescriptor; + /** + *No keys are associated with this account. + */ + NoKeys: PlainDescriptor; + /** + *Key setting account is not live, so it's impossible to associate keys. + */ + NoAccount: PlainDescriptor; + }; + Grandpa: { + /** + *Attempt to signal GRANDPA pause when the authority set isn't live + *(either paused or already pending pause). + */ + PauseFailed: PlainDescriptor; + /** + *Attempt to signal GRANDPA resume when the authority set isn't paused + *(either live or already pending resume). + */ + ResumeFailed: PlainDescriptor; + /** + *Attempt to signal GRANDPA change with one already pending. + */ + ChangePending: PlainDescriptor; + /** + *Cannot signal forced change so soon after last. + */ + TooSoon: PlainDescriptor; + /** + *A key ownership proof provided as part of an equivocation report is invalid. + */ + InvalidKeyOwnershipProof: PlainDescriptor; + /** + *An equivocation proof provided as part of an equivocation report is invalid. + */ + InvalidEquivocationProof: PlainDescriptor; + /** + *A given equivocation report is valid but already previously reported. + */ + DuplicateOffenceReport: PlainDescriptor; + }; + Treasury: { + /** + *No proposal, bounty or spend at that index. + */ + InvalidIndex: PlainDescriptor; + /** + *Too many approvals in the queue. + */ + TooManyApprovals: PlainDescriptor; + /** + *The spend origin is valid but the amount it is allowed to spend is lower than the + *amount to be spent. + */ + InsufficientPermission: PlainDescriptor; + /** + *Proposal has not been approved. + */ + ProposalNotApproved: PlainDescriptor; + /** + *The balance of the asset kind is not convertible to the balance of the native asset. + */ + FailedToConvertBalance: PlainDescriptor; + /** + *The spend has expired and cannot be claimed. + */ + SpendExpired: PlainDescriptor; + /** + *The spend is not yet eligible for payout. + */ + EarlyPayout: PlainDescriptor; + /** + *The payment has already been attempted. + */ + AlreadyAttempted: PlainDescriptor; + /** + *There was some issue with the mechanism of payment. + */ + PayoutError: PlainDescriptor; + /** + *The payout was not yet attempted/claimed. + */ + NotAttempted: PlainDescriptor; + /** + *The payment has neither failed nor succeeded yet. + */ + Inconclusive: PlainDescriptor; + }; + ConvictionVoting: { + /** + *Poll is not ongoing. + */ + NotOngoing: PlainDescriptor; + /** + *The given account did not vote on the poll. + */ + NotVoter: PlainDescriptor; + /** + *The actor has no permission to conduct the action. + */ + NoPermission: PlainDescriptor; + /** + *The actor has no permission to conduct the action right now but will do in the future. + */ + NoPermissionYet: PlainDescriptor; + /** + *The account is already delegating. + */ + AlreadyDelegating: PlainDescriptor; + /** + *The account currently has votes attached to it and the operation cannot succeed until + *these are removed through `remove_vote`. + */ + AlreadyVoting: PlainDescriptor; + /** + *Too high a balance was provided that the account cannot afford. + */ + InsufficientFunds: PlainDescriptor; + /** + *The account is not currently delegating. + */ + NotDelegating: PlainDescriptor; + /** + *Delegation to oneself makes no sense. + */ + Nonsense: PlainDescriptor; + /** + *Maximum number of votes reached. + */ + MaxVotesReached: PlainDescriptor; + /** + *The class must be supplied since it is not easily determinable from the state. + */ + ClassNeeded: PlainDescriptor; + /** + *The class ID supplied is invalid. + */ + BadClass: PlainDescriptor; + }; + Referenda: { + /** + *Referendum is not ongoing. + */ + NotOngoing: PlainDescriptor; + /** + *Referendum's decision deposit is already paid. + */ + HasDeposit: PlainDescriptor; + /** + *The track identifier given was invalid. + */ + BadTrack: PlainDescriptor; + /** + *There are already a full complement of referenda in progress for this track. + */ + Full: PlainDescriptor; + /** + *The queue of the track is empty. + */ + QueueEmpty: PlainDescriptor; + /** + *The referendum index provided is invalid in this context. + */ + BadReferendum: PlainDescriptor; + /** + *There was nothing to do in the advancement. + */ + NothingToDo: PlainDescriptor; + /** + *No track exists for the proposal origin. + */ + NoTrack: PlainDescriptor; + /** + *Any deposit cannot be refunded until after the decision is over. + */ + Unfinished: PlainDescriptor; + /** + *The deposit refunder is not the depositor. + */ + NoPermission: PlainDescriptor; + /** + *The deposit cannot be refunded since none was made. + */ + NoDeposit: PlainDescriptor; + /** + *The referendum status is invalid for this operation. + */ + BadStatus: PlainDescriptor; + /** + *The preimage does not exist. + */ + PreimageNotExist: PlainDescriptor; + /** + *The preimage is stored with a different length than the one provided. + */ + PreimageStoredWithDifferentLength: PlainDescriptor; + }; + FellowshipCollective: { + /** + *Account is already a member. + */ + AlreadyMember: PlainDescriptor; + /** + *Account is not a member. + */ + NotMember: PlainDescriptor; + /** + *The given poll index is unknown or has closed. + */ + NotPolling: PlainDescriptor; + /** + *The given poll is still ongoing. + */ + Ongoing: PlainDescriptor; + /** + *There are no further records to be removed. + */ + NoneRemaining: PlainDescriptor; + /** + *Unexpected error in state. + */ + Corruption: PlainDescriptor; + /** + *The member's rank is too low to vote. + */ + RankTooLow: PlainDescriptor; + /** + *The information provided is incorrect. + */ + InvalidWitness: PlainDescriptor; + /** + *The origin is not sufficiently privileged to do the operation. + */ + NoPermission: PlainDescriptor; + /** + *The new member to exchange is the same as the old member + */ + SameMember: PlainDescriptor; + /** + *The max member count for the rank has been reached. + */ + TooManyMembers: PlainDescriptor; + }; + FellowshipReferenda: { + /** + *Referendum is not ongoing. + */ + NotOngoing: PlainDescriptor; + /** + *Referendum's decision deposit is already paid. + */ + HasDeposit: PlainDescriptor; + /** + *The track identifier given was invalid. + */ + BadTrack: PlainDescriptor; + /** + *There are already a full complement of referenda in progress for this track. + */ + Full: PlainDescriptor; + /** + *The queue of the track is empty. + */ + QueueEmpty: PlainDescriptor; + /** + *The referendum index provided is invalid in this context. + */ + BadReferendum: PlainDescriptor; + /** + *There was nothing to do in the advancement. + */ + NothingToDo: PlainDescriptor; + /** + *No track exists for the proposal origin. + */ + NoTrack: PlainDescriptor; + /** + *Any deposit cannot be refunded until after the decision is over. + */ + Unfinished: PlainDescriptor; + /** + *The deposit refunder is not the depositor. + */ + NoPermission: PlainDescriptor; + /** + *The deposit cannot be refunded since none was made. + */ + NoDeposit: PlainDescriptor; + /** + *The referendum status is invalid for this operation. + */ + BadStatus: PlainDescriptor; + /** + *The preimage does not exist. + */ + PreimageNotExist: PlainDescriptor; + /** + *The preimage is stored with a different length than the one provided. + */ + PreimageStoredWithDifferentLength: PlainDescriptor; + }; + Whitelist: { + /** + *The preimage of the call hash could not be loaded. + */ + UnavailablePreImage: PlainDescriptor; + /** + *The call could not be decoded. + */ + UndecodableCall: PlainDescriptor; + /** + *The weight of the decoded call was higher than the witness. + */ + InvalidCallWeightWitness: PlainDescriptor; + /** + *The call was not whitelisted. + */ + CallIsNotWhitelisted: PlainDescriptor; + /** + *The call was already whitelisted; No-Op. + */ + CallAlreadyWhitelisted: PlainDescriptor; + }; + Claims: { + /** + *Invalid Ethereum signature. + */ + InvalidEthereumSignature: PlainDescriptor; + /** + *Ethereum address has no claim. + */ + SignerHasNoClaim: PlainDescriptor; + /** + *Account ID sending transaction has no claim. + */ + SenderHasNoClaim: PlainDescriptor; + /** + *There's not enough in the pot to pay out some unvested amount. Generally implies a + *logic error. + */ + PotUnderflow: PlainDescriptor; + /** + *A needed statement was not included. + */ + InvalidStatement: PlainDescriptor; + /** + *The account already has a vested balance. + */ + VestedBalanceExists: PlainDescriptor; + }; + Utility: { + /** + *Too many calls batched. + */ + TooManyCalls: PlainDescriptor; + }; + Society: { + /** + *User is not a member. + */ + NotMember: PlainDescriptor; + /** + *User is already a member. + */ + AlreadyMember: PlainDescriptor; + /** + *User is suspended. + */ + Suspended: PlainDescriptor; + /** + *User is not suspended. + */ + NotSuspended: PlainDescriptor; + /** + *Nothing to payout. + */ + NoPayout: PlainDescriptor; + /** + *Society already founded. + */ + AlreadyFounded: PlainDescriptor; + /** + *Not enough in pot to accept candidate. + */ + InsufficientPot: PlainDescriptor; + /** + *Member is already vouching or banned from vouching again. + */ + AlreadyVouching: PlainDescriptor; + /** + *Member is not vouching. + */ + NotVouchingOnBidder: PlainDescriptor; + /** + *Cannot remove the head of the chain. + */ + Head: PlainDescriptor; + /** + *Cannot remove the founder. + */ + Founder: PlainDescriptor; + /** + *User has already made a bid. + */ + AlreadyBid: PlainDescriptor; + /** + *User is already a candidate. + */ + AlreadyCandidate: PlainDescriptor; + /** + *User is not a candidate. + */ + NotCandidate: PlainDescriptor; + /** + *Too many members in the society. + */ + MaxMembers: PlainDescriptor; + /** + *The caller is not the founder. + */ + NotFounder: PlainDescriptor; + /** + *The caller is not the head. + */ + NotHead: PlainDescriptor; + /** + *The membership cannot be claimed as the candidate was not clearly approved. + */ + NotApproved: PlainDescriptor; + /** + *The candidate cannot be kicked as the candidate was not clearly rejected. + */ + NotRejected: PlainDescriptor; + /** + *The candidacy cannot be dropped as the candidate was clearly approved. + */ + Approved: PlainDescriptor; + /** + *The candidacy cannot be bestowed as the candidate was clearly rejected. + */ + Rejected: PlainDescriptor; + /** + *The candidacy cannot be concluded as the voting is still in progress. + */ + InProgress: PlainDescriptor; + /** + *The candidacy cannot be pruned until a full additional intake period has passed. + */ + TooEarly: PlainDescriptor; + /** + *The skeptic already voted. + */ + Voted: PlainDescriptor; + /** + *The skeptic need not vote on candidates from expired rounds. + */ + Expired: PlainDescriptor; + /** + *User is not a bidder. + */ + NotBidder: PlainDescriptor; + /** + *There is no defender currently. + */ + NoDefender: PlainDescriptor; + /** + *Group doesn't exist. + */ + NotGroup: PlainDescriptor; + /** + *The member is already elevated to this rank. + */ + AlreadyElevated: PlainDescriptor; + /** + *The skeptic has already been punished for this offence. + */ + AlreadyPunished: PlainDescriptor; + /** + *Funds are insufficient to pay off society debts. + */ + InsufficientFunds: PlainDescriptor; + /** + *The candidate/defender has no stale votes to remove. + */ + NoVotes: PlainDescriptor; + }; + Recovery: { + /** + *User is not allowed to make a call on behalf of this account + */ + NotAllowed: PlainDescriptor; + /** + *Threshold must be greater than zero + */ + ZeroThreshold: PlainDescriptor; + /** + *Friends list must be greater than zero and threshold + */ + NotEnoughFriends: PlainDescriptor; + /** + *Friends list must be less than max friends + */ + MaxFriends: PlainDescriptor; + /** + *Friends list must be sorted and free of duplicates + */ + NotSorted: PlainDescriptor; + /** + *This account is not set up for recovery + */ + NotRecoverable: PlainDescriptor; + /** + *This account is already set up for recovery + */ + AlreadyRecoverable: PlainDescriptor; + /** + *A recovery process has already started for this account + */ + AlreadyStarted: PlainDescriptor; + /** + *A recovery process has not started for this rescuer + */ + NotStarted: PlainDescriptor; + /** + *This account is not a friend who can vouch + */ + NotFriend: PlainDescriptor; + /** + *The friend must wait until the delay period to vouch for this recovery + */ + DelayPeriod: PlainDescriptor; + /** + *This user has already vouched for this recovery + */ + AlreadyVouched: PlainDescriptor; + /** + *The threshold for recovering this account has not been met + */ + Threshold: PlainDescriptor; + /** + *There are still active recovery attempts that need to be closed + */ + StillActive: PlainDescriptor; + /** + *This account is already set up for recovery + */ + AlreadyProxy: PlainDescriptor; + /** + *Some internal state is broken. + */ + BadState: PlainDescriptor; + }; + Vesting: { + /** + *The account given is not vesting. + */ + NotVesting: PlainDescriptor; + /** + *The account already has `MaxVestingSchedules` count of schedules and thus + *cannot add another one. Consider merging existing schedules in order to add another. + */ + AtMaxVestingSchedules: PlainDescriptor; + /** + *Amount being transferred is too low to create a vesting schedule. + */ + AmountLow: PlainDescriptor; + /** + *An index was out of bounds of the vesting schedules. + */ + ScheduleIndexOutOfBounds: PlainDescriptor; + /** + *Failed to create a new schedule because some parameter was invalid. + */ + InvalidScheduleParams: PlainDescriptor; + }; + Scheduler: { + /** + *Failed to schedule a call + */ + FailedToSchedule: PlainDescriptor; + /** + *Cannot find the scheduled call. + */ + NotFound: PlainDescriptor; + /** + *Given target block number is in the past. + */ + TargetBlockNumberInPast: PlainDescriptor; + /** + *Reschedule failed because it does not change scheduled time. + */ + RescheduleNoChange: PlainDescriptor; + /** + *Attempt to use a non-named function on a named task. + */ + Named: PlainDescriptor; + }; + Proxy: { + /** + *There are too many proxies registered or too many announcements pending. + */ + TooMany: PlainDescriptor; + /** + *Proxy registration not found. + */ + NotFound: PlainDescriptor; + /** + *Sender is not a proxy of the account to be proxied. + */ + NotProxy: PlainDescriptor; + /** + *A call which is incompatible with the proxy type's filter was attempted. + */ + Unproxyable: PlainDescriptor; + /** + *Account is already a proxy. + */ + Duplicate: PlainDescriptor; + /** + *Call may not be made by proxy because it may escalate its privileges. + */ + NoPermission: PlainDescriptor; + /** + *Announcement, if made at all, was made too recently. + */ + Unannounced: PlainDescriptor; + /** + *Cannot add self as proxy. + */ + NoSelfProxy: PlainDescriptor; + }; + Multisig: { + /** + *Threshold must be 2 or greater. + */ + MinimumThreshold: PlainDescriptor; + /** + *Call is already approved by this signatory. + */ + AlreadyApproved: PlainDescriptor; + /** + *Call doesn't need any (more) approvals. + */ + NoApprovalsNeeded: PlainDescriptor; + /** + *There are too few signatories in the list. + */ + TooFewSignatories: PlainDescriptor; + /** + *There are too many signatories in the list. + */ + TooManySignatories: PlainDescriptor; + /** + *The signatories were provided out of order; they should be ordered. + */ + SignatoriesOutOfOrder: PlainDescriptor; + /** + *The sender was contained in the other signatories; it shouldn't be. + */ + SenderInSignatories: PlainDescriptor; + /** + *Multisig operation not found when attempting to cancel. + */ + NotFound: PlainDescriptor; + /** + *Only the account that originally created the multisig is able to cancel it. + */ + NotOwner: PlainDescriptor; + /** + *No timepoint was given, yet the multisig operation is already underway. + */ + NoTimepoint: PlainDescriptor; + /** + *A different timepoint was given to the multisig operation that is underway. + */ + WrongTimepoint: PlainDescriptor; + /** + *A timepoint was given, yet no multisig operation is underway. + */ + UnexpectedTimepoint: PlainDescriptor; + /** + *The maximum weight information provided was too low. + */ + MaxWeightTooLow: PlainDescriptor; + /** + *The data to be stored is already stored. + */ + AlreadyStored: PlainDescriptor; + }; + Preimage: { + /** + *Preimage is too large to store on-chain. + */ + TooBig: PlainDescriptor; + /** + *Preimage has already been noted on-chain. + */ + AlreadyNoted: PlainDescriptor; + /** + *The user is not authorized to perform this action. + */ + NotAuthorized: PlainDescriptor; + /** + *The preimage cannot be removed since it has not yet been noted. + */ + NotNoted: PlainDescriptor; + /** + *A preimage may not be removed when there are outstanding requests. + */ + Requested: PlainDescriptor; + /** + *The preimage request cannot be removed since no outstanding requests exist. + */ + NotRequested: PlainDescriptor; + /** + *More than `MAX_HASH_UPGRADE_BULK_COUNT` hashes were requested to be upgraded at once. + */ + TooMany: PlainDescriptor; + /** + *Too few hashes were requested to be upgraded (i.e. zero). + */ + TooFew: PlainDescriptor; + /** + *No ticket with a cost was returned by [`Config::Consideration`] to store the preimage. + */ + NoCost: PlainDescriptor; + }; + Bounties: { + /** + *Proposer's balance is too low. + */ + InsufficientProposersBalance: PlainDescriptor; + /** + *No proposal or bounty at that index. + */ + InvalidIndex: PlainDescriptor; + /** + *The reason given is just too big. + */ + ReasonTooBig: PlainDescriptor; + /** + *The bounty status is unexpected. + */ + UnexpectedStatus: PlainDescriptor; + /** + *Require bounty curator. + */ + RequireCurator: PlainDescriptor; + /** + *Invalid bounty value. + */ + InvalidValue: PlainDescriptor; + /** + *Invalid bounty fee. + */ + InvalidFee: PlainDescriptor; + /** + *A bounty payout is pending. + *To cancel the bounty, you must unassign and slash the curator. + */ + PendingPayout: PlainDescriptor; + /** + *The bounties cannot be claimed/closed because it's still in the countdown period. + */ + Premature: PlainDescriptor; + /** + *The bounty cannot be closed because it has active child bounties. + */ + HasActiveChildBounty: PlainDescriptor; + /** + *Too many approvals are already queued. + */ + TooManyQueued: PlainDescriptor; + }; + ChildBounties: { + /** + *The parent bounty is not in active state. + */ + ParentBountyNotActive: PlainDescriptor; + /** + *The bounty balance is not enough to add new child-bounty. + */ + InsufficientBountyBalance: PlainDescriptor; + /** + *Number of child bounties exceeds limit `MaxActiveChildBountyCount`. + */ + TooManyChildBounties: PlainDescriptor; + }; + ElectionProviderMultiPhase: { + /** + *Submission was too early. + */ + PreDispatchEarlySubmission: PlainDescriptor; + /** + *Wrong number of winners presented. + */ + PreDispatchWrongWinnerCount: PlainDescriptor; + /** + *Submission was too weak, score-wise. + */ + PreDispatchWeakSubmission: PlainDescriptor; + /** + *The queue was full, and the solution was not better than any of the existing ones. + */ + SignedQueueFull: PlainDescriptor; + /** + *The origin failed to pay the deposit. + */ + SignedCannotPayDeposit: PlainDescriptor; + /** + *Witness data to dispatchable is invalid. + */ + SignedInvalidWitness: PlainDescriptor; + /** + *The signed submission consumes too much weight + */ + SignedTooMuchWeight: PlainDescriptor; + /** + *OCW submitted solution for wrong round + */ + OcwCallWrongEra: PlainDescriptor; + /** + *Snapshot metadata should exist but didn't. + */ + MissingSnapshotMetadata: PlainDescriptor; + /** + *`Self::insert_submission` returned an invalid index. + */ + InvalidSubmissionIndex: PlainDescriptor; + /** + *The call is not allowed at this point. + */ + CallNotAllowed: PlainDescriptor; + /** + *The fallback failed + */ + FallbackFailed: PlainDescriptor; + /** + *Some bound not met + */ + BoundNotMet: PlainDescriptor; + /** + *Submitted solution has too many winners + */ + TooManyWinners: PlainDescriptor; + /** + *Submission was prepared for a different round. + */ + PreDispatchDifferentRound: PlainDescriptor; + }; + Nis: { + /** + *The duration of the bid is less than one. + */ + DurationTooSmall: PlainDescriptor; + /** + *The duration is the bid is greater than the number of queues. + */ + DurationTooBig: PlainDescriptor; + /** + *The amount of the bid is less than the minimum allowed. + */ + AmountTooSmall: PlainDescriptor; + /** + *The queue for the bid's duration is full and the amount bid is too low to get in + *through replacing an existing bid. + */ + BidTooLow: PlainDescriptor; + /** + *Receipt index is unknown. + */ + UnknownReceipt: PlainDescriptor; + /** + *Not the owner of the receipt. + */ + NotOwner: PlainDescriptor; + /** + *Bond not yet at expiry date. + */ + NotExpired: PlainDescriptor; + /** + *The given bid for retraction is not found. + */ + UnknownBid: PlainDescriptor; + /** + *The portion supplied is beyond the value of the receipt. + */ + PortionTooBig: PlainDescriptor; + /** + *Not enough funds are held to pay out. + */ + Unfunded: PlainDescriptor; + /** + *There are enough funds for what is required. + */ + AlreadyFunded: PlainDescriptor; + /** + *The thaw throttle has been reached for this period. + */ + Throttled: PlainDescriptor; + /** + *The operation would result in a receipt worth an insignificant value. + */ + MakesDust: PlainDescriptor; + /** + *The receipt is already communal. + */ + AlreadyCommunal: PlainDescriptor; + /** + *The receipt is already private. + */ + AlreadyPrivate: PlainDescriptor; + }; + NisCounterpartBalances: { + /** + *Vesting balance too high to send value. + */ + VestingBalance: PlainDescriptor; + /** + *Account liquidity restrictions prevent withdrawal. + */ + LiquidityRestrictions: PlainDescriptor; + /** + *Balance too low to send value. + */ + InsufficientBalance: PlainDescriptor; + /** + *Value too low to create account due to existential deposit. + */ + ExistentialDeposit: PlainDescriptor; + /** + *Transfer/payment would kill account. + */ + Expendability: PlainDescriptor; + /** + *A vesting schedule already exists for this account. + */ + ExistingVestingSchedule: PlainDescriptor; + /** + *Beneficiary account must pre-exist. + */ + DeadAccount: PlainDescriptor; + /** + *Number of named reserves exceed `MaxReserves`. + */ + TooManyReserves: PlainDescriptor; + /** + *Number of holds exceed `VariantCountOf`. + */ + TooManyHolds: PlainDescriptor; + /** + *Number of freezes exceed `MaxFreezes`. + */ + TooManyFreezes: PlainDescriptor; + /** + *The issuance cannot be modified since it is already deactivated. + */ + IssuanceDeactivated: PlainDescriptor; + /** + *The delta cannot be zero. + */ + DeltaZero: PlainDescriptor; + }; + VoterList: { + /** + *A error in the list interface implementation. + */ + List: PlainDescriptor; + }; + NominationPools: { + /** + *A (bonded) pool id does not exist. + */ + PoolNotFound: PlainDescriptor; + /** + *An account is not a member. + */ + PoolMemberNotFound: PlainDescriptor; + /** + *A reward pool does not exist. In all cases this is a system logic error. + */ + RewardPoolNotFound: PlainDescriptor; + /** + *A sub pool does not exist. + */ + SubPoolsNotFound: PlainDescriptor; + /** + *An account is already delegating in another pool. An account may only belong to one + *pool at a time. + */ + AccountBelongsToOtherPool: PlainDescriptor; + /** + *The member is fully unbonded (and thus cannot access the bonded and reward pool + *anymore to, for example, collect rewards). + */ + FullyUnbonding: PlainDescriptor; + /** + *The member cannot unbond further chunks due to reaching the limit. + */ + MaxUnbondingLimit: PlainDescriptor; + /** + *None of the funds can be withdrawn yet because the bonding duration has not passed. + */ + CannotWithdrawAny: PlainDescriptor; + /** + *The amount does not meet the minimum bond to either join or create a pool. + * + *The depositor can never unbond to a value less than `Pallet::depositor_min_bond`. The + *caller does not have nominating permissions for the pool. Members can never unbond to a + *value below `MinJoinBond`. + */ + MinimumBondNotMet: PlainDescriptor; + /** + *The transaction could not be executed due to overflow risk for the pool. + */ + OverflowRisk: PlainDescriptor; + /** + *A pool must be in [`PoolState::Destroying`] in order for the depositor to unbond or for + *other members to be permissionlessly unbonded. + */ + NotDestroying: PlainDescriptor; + /** + *The caller does not have nominating permissions for the pool. + */ + NotNominator: PlainDescriptor; + /** + *Either a) the caller cannot make a valid kick or b) the pool is not destroying. + */ + NotKickerOrDestroying: PlainDescriptor; + /** + *The pool is not open to join + */ + NotOpen: PlainDescriptor; + /** + *The system is maxed out on pools. + */ + MaxPools: PlainDescriptor; + /** + *Too many members in the pool or system. + */ + MaxPoolMembers: PlainDescriptor; + /** + *The pools state cannot be changed. + */ + CanNotChangeState: PlainDescriptor; + /** + *The caller does not have adequate permissions. + */ + DoesNotHavePermission: PlainDescriptor; + /** + *Metadata exceeds [`Config::MaxMetadataLen`] + */ + MetadataExceedsMaxLen: PlainDescriptor; + /** + *Some error occurred that should never happen. This should be reported to the + *maintainers. + */ + Defensive: PlainDescriptor>; + /** + *Partial unbonding now allowed permissionlessly. + */ + PartialUnbondNotAllowedPermissionlessly: PlainDescriptor; + /** + *The pool's max commission cannot be set higher than the existing value. + */ + MaxCommissionRestricted: PlainDescriptor; + /** + *The supplied commission exceeds the max allowed commission. + */ + CommissionExceedsMaximum: PlainDescriptor; + /** + *The supplied commission exceeds global maximum commission. + */ + CommissionExceedsGlobalMaximum: PlainDescriptor; + /** + *Not enough blocks have surpassed since the last commission update. + */ + CommissionChangeThrottled: PlainDescriptor; + /** + *The submitted changes to commission change rate are not allowed. + */ + CommissionChangeRateNotAllowed: PlainDescriptor; + /** + *There is no pending commission to claim. + */ + NoPendingCommission: PlainDescriptor; + /** + *No commission current has been set. + */ + NoCommissionCurrentSet: PlainDescriptor; + /** + *Pool id currently in use. + */ + PoolIdInUse: PlainDescriptor; + /** + *Pool id provided is not correct/usable. + */ + InvalidPoolId: PlainDescriptor; + /** + *Bonding extra is restricted to the exact pending reward amount. + */ + BondExtraRestricted: PlainDescriptor; + /** + *No imbalance in the ED deposit for the pool. + */ + NothingToAdjust: PlainDescriptor; + /** + *No slash pending that can be applied to the member. + */ + NothingToSlash: PlainDescriptor; + /** + *The pool or member delegation has already migrated to delegate stake. + */ + AlreadyMigrated: PlainDescriptor; + /** + *The pool or member delegation has not migrated yet to delegate stake. + */ + NotMigrated: PlainDescriptor; + /** + *This call is not allowed in the current state of the pallet. + */ + NotSupported: PlainDescriptor; + }; + FastUnstake: { + /** + *The provided Controller account was not found. + * + *This means that the given account is not bonded. + */ + NotController: PlainDescriptor; + /** + *The bonded account has already been queued. + */ + AlreadyQueued: PlainDescriptor; + /** + *The bonded account has active unlocking chunks. + */ + NotFullyBonded: PlainDescriptor; + /** + *The provided un-staker is not in the `Queue`. + */ + NotQueued: PlainDescriptor; + /** + *The provided un-staker is already in Head, and cannot deregister. + */ + AlreadyHead: PlainDescriptor; + /** + *The call is not allowed at this point because the pallet is not active. + */ + CallNotAllowed: PlainDescriptor; + }; + Configuration: { + /** + *The new value for a configuration parameter is invalid. + */ + InvalidNewValue: PlainDescriptor; + }; + ParaInclusion: { + /** + *Validator index out of bounds. + */ + ValidatorIndexOutOfBounds: PlainDescriptor; + /** + *Candidate submitted but para not scheduled. + */ + UnscheduledCandidate: PlainDescriptor; + /** + *Head data exceeds the configured maximum. + */ + HeadDataTooLarge: PlainDescriptor; + /** + *Code upgrade prematurely. + */ + PrematureCodeUpgrade: PlainDescriptor; + /** + *Output code is too large + */ + NewCodeTooLarge: PlainDescriptor; + /** + *The candidate's relay-parent was not allowed. Either it was + *not recent enough or it didn't advance based on the last parachain block. + */ + DisallowedRelayParent: PlainDescriptor; + /** + *Failed to compute group index for the core: either it's out of bounds + *or the relay parent doesn't belong to the current session. + */ + InvalidAssignment: PlainDescriptor; + /** + *Invalid group index in core assignment. + */ + InvalidGroupIndex: PlainDescriptor; + /** + *Insufficient (non-majority) backing. + */ + InsufficientBacking: PlainDescriptor; + /** + *Invalid (bad signature, unknown validator, etc.) backing. + */ + InvalidBacking: PlainDescriptor; + /** + *Collator did not sign PoV. + */ + NotCollatorSigned: PlainDescriptor; + /** + *The validation data hash does not match expected. + */ + ValidationDataHashMismatch: PlainDescriptor; + /** + *The downward message queue is not processed correctly. + */ + IncorrectDownwardMessageHandling: PlainDescriptor; + /** + *At least one upward message sent does not pass the acceptance criteria. + */ + InvalidUpwardMessages: PlainDescriptor; + /** + *The candidate didn't follow the rules of HRMP watermark advancement. + */ + HrmpWatermarkMishandling: PlainDescriptor; + /** + *The HRMP messages sent by the candidate is not valid. + */ + InvalidOutboundHrmp: PlainDescriptor; + /** + *The validation code hash of the candidate is not valid. + */ + InvalidValidationCodeHash: PlainDescriptor; + /** + *The `para_head` hash in the candidate descriptor doesn't match the hash of the actual + *para head in the commitments. + */ + ParaHeadMismatch: PlainDescriptor; + }; + ParaInherent: { + /** + *Inclusion inherent called more than once per block. + */ + TooManyInclusionInherents: PlainDescriptor; + /** + *The hash of the submitted parent header doesn't correspond to the saved block hash of + *the parent. + */ + InvalidParentHeader: PlainDescriptor; + /** + *The data given to the inherent will result in an overweight block. + */ + InherentOverweight: PlainDescriptor; + /** + *A candidate was filtered during inherent execution. This should have only been done + *during creation. + */ + CandidatesFilteredDuringExecution: PlainDescriptor; + /** + *Too many candidates supplied. + */ + UnscheduledCandidate: PlainDescriptor; + }; + Paras: { + /** + *Para is not registered in our system. + */ + NotRegistered: PlainDescriptor; + /** + *Para cannot be onboarded because it is already tracked by our system. + */ + CannotOnboard: PlainDescriptor; + /** + *Para cannot be offboarded at this time. + */ + CannotOffboard: PlainDescriptor; + /** + *Para cannot be upgraded to a lease holding parachain. + */ + CannotUpgrade: PlainDescriptor; + /** + *Para cannot be downgraded to an on-demand parachain. + */ + CannotDowngrade: PlainDescriptor; + /** + *The statement for PVF pre-checking is stale. + */ + PvfCheckStatementStale: PlainDescriptor; + /** + *The statement for PVF pre-checking is for a future session. + */ + PvfCheckStatementFuture: PlainDescriptor; + /** + *Claimed validator index is out of bounds. + */ + PvfCheckValidatorIndexOutOfBounds: PlainDescriptor; + /** + *The signature for the PVF pre-checking is invalid. + */ + PvfCheckInvalidSignature: PlainDescriptor; + /** + *The given validator already has cast a vote. + */ + PvfCheckDoubleVote: PlainDescriptor; + /** + *The given PVF does not exist at the moment of process a vote. + */ + PvfCheckSubjectInvalid: PlainDescriptor; + /** + *Parachain cannot currently schedule a code upgrade. + */ + CannotUpgradeCode: PlainDescriptor; + /** + *Invalid validation code size. + */ + InvalidCode: PlainDescriptor; + }; + Hrmp: { + /** + *The sender tried to open a channel to themselves. + */ + OpenHrmpChannelToSelf: PlainDescriptor; + /** + *The recipient is not a valid para. + */ + OpenHrmpChannelInvalidRecipient: PlainDescriptor; + /** + *The requested capacity is zero. + */ + OpenHrmpChannelZeroCapacity: PlainDescriptor; + /** + *The requested capacity exceeds the global limit. + */ + OpenHrmpChannelCapacityExceedsLimit: PlainDescriptor; + /** + *The requested maximum message size is 0. + */ + OpenHrmpChannelZeroMessageSize: PlainDescriptor; + /** + *The open request requested the message size that exceeds the global limit. + */ + OpenHrmpChannelMessageSizeExceedsLimit: PlainDescriptor; + /** + *The channel already exists + */ + OpenHrmpChannelAlreadyExists: PlainDescriptor; + /** + *There is already a request to open the same channel. + */ + OpenHrmpChannelAlreadyRequested: PlainDescriptor; + /** + *The sender already has the maximum number of allowed outbound channels. + */ + OpenHrmpChannelLimitExceeded: PlainDescriptor; + /** + *The channel from the sender to the origin doesn't exist. + */ + AcceptHrmpChannelDoesntExist: PlainDescriptor; + /** + *The channel is already confirmed. + */ + AcceptHrmpChannelAlreadyConfirmed: PlainDescriptor; + /** + *The recipient already has the maximum number of allowed inbound channels. + */ + AcceptHrmpChannelLimitExceeded: PlainDescriptor; + /** + *The origin tries to close a channel where it is neither the sender nor the recipient. + */ + CloseHrmpChannelUnauthorized: PlainDescriptor; + /** + *The channel to be closed doesn't exist. + */ + CloseHrmpChannelDoesntExist: PlainDescriptor; + /** + *The channel close request is already requested. + */ + CloseHrmpChannelAlreadyUnderway: PlainDescriptor; + /** + *Canceling is requested by neither the sender nor recipient of the open channel request. + */ + CancelHrmpOpenChannelUnauthorized: PlainDescriptor; + /** + *The open request doesn't exist. + */ + OpenHrmpChannelDoesntExist: PlainDescriptor; + /** + *Cannot cancel an HRMP open channel request because it is already confirmed. + */ + OpenHrmpChannelAlreadyConfirmed: PlainDescriptor; + /** + *The provided witness data is wrong. + */ + WrongWitness: PlainDescriptor; + /** + *The channel between these two chains cannot be authorized. + */ + ChannelCreationNotAuthorized: PlainDescriptor; + }; + ParasDisputes: { + /** + *Duplicate dispute statement sets provided. + */ + DuplicateDisputeStatementSets: PlainDescriptor; + /** + *Ancient dispute statement provided. + */ + AncientDisputeStatement: PlainDescriptor; + /** + *Validator index on statement is out of bounds for session. + */ + ValidatorIndexOutOfBounds: PlainDescriptor; + /** + *Invalid signature on statement. + */ + InvalidSignature: PlainDescriptor; + /** + *Validator vote submitted more than once to dispute. + */ + DuplicateStatement: PlainDescriptor; + /** + *A dispute where there are only votes on one side. + */ + SingleSidedDispute: PlainDescriptor; + /** + *A dispute vote from a malicious backer. + */ + MaliciousBacker: PlainDescriptor; + /** + *No backing votes were provides along dispute statements. + */ + MissingBackingVotes: PlainDescriptor; + /** + *Unconfirmed dispute statement sets provided. + */ + UnconfirmedDispute: PlainDescriptor; + }; + ParasSlashing: { + /** + *The key ownership proof is invalid. + */ + InvalidKeyOwnershipProof: PlainDescriptor; + /** + *The session index is too old or invalid. + */ + InvalidSessionIndex: PlainDescriptor; + /** + *The candidate hash is invalid. + */ + InvalidCandidateHash: PlainDescriptor; + /** + *There is no pending slash for the given validator index and time + *slot. + */ + InvalidValidatorIndex: PlainDescriptor; + /** + *The validator index does not match the validator id. + */ + ValidatorIndexIdMismatch: PlainDescriptor; + /** + *The given slashing report is valid but already previously reported. + */ + DuplicateSlashingReport: PlainDescriptor; + }; + OnDemandAssignmentProvider: { + /** + *The order queue is full, `place_order` will not continue. + */ + QueueFull: PlainDescriptor; + /** + *The current spot price is higher than the max amount specified in the `place_order` + *call, making it invalid. + */ + SpotPriceHigherThanMaxAmount: PlainDescriptor; + }; + CoretimeAssignmentProvider: { + /** + + */ + AssignmentsEmpty: PlainDescriptor; + /** + *Assignments together exceeded 57600. + */ + OverScheduled: PlainDescriptor; + /** + *Assignments together less than 57600 + */ + UnderScheduled: PlainDescriptor; + /** + *assign_core is only allowed to append new assignments at the end of already existing + *ones. + */ + DisallowedInsert: PlainDescriptor; + /** + *Tried to insert a schedule for the same core and block number as an existing schedule + */ + DuplicateInsert: PlainDescriptor; + /** + *Tried to add an unsorted set of assignments + */ + AssignmentsNotSorted: PlainDescriptor; + }; + Registrar: { + /** + *The ID is not registered. + */ + NotRegistered: PlainDescriptor; + /** + *The ID is already registered. + */ + AlreadyRegistered: PlainDescriptor; + /** + *The caller is not the owner of this Id. + */ + NotOwner: PlainDescriptor; + /** + *Invalid para code size. + */ + CodeTooLarge: PlainDescriptor; + /** + *Invalid para head data size. + */ + HeadDataTooLarge: PlainDescriptor; + /** + *Para is not a Parachain. + */ + NotParachain: PlainDescriptor; + /** + *Para is not a Parathread (on-demand parachain). + */ + NotParathread: PlainDescriptor; + /** + *Cannot deregister para + */ + CannotDeregister: PlainDescriptor; + /** + *Cannot schedule downgrade of lease holding parachain to on-demand parachain + */ + CannotDowngrade: PlainDescriptor; + /** + *Cannot schedule upgrade of on-demand parachain to lease holding parachain + */ + CannotUpgrade: PlainDescriptor; + /** + *Para is locked from manipulation by the manager. Must use parachain or relay chain + *governance. + */ + ParaLocked: PlainDescriptor; + /** + *The ID given for registration has not been reserved. + */ + NotReserved: PlainDescriptor; + /** + *The validation code is invalid. + */ + InvalidCode: PlainDescriptor; + /** + *Cannot perform a parachain slot / lifecycle swap. Check that the state of both paras + *are correct for the swap to work. + */ + CannotSwap: PlainDescriptor; + }; + Slots: { + /** + *The parachain ID is not onboarding. + */ + ParaNotOnboarding: PlainDescriptor; + /** + *There was an error with the lease. + */ + LeaseError: PlainDescriptor; + }; + Auctions: { + /** + *This auction is already in progress. + */ + AuctionInProgress: PlainDescriptor; + /** + *The lease period is in the past. + */ + LeasePeriodInPast: PlainDescriptor; + /** + *Para is not registered + */ + ParaNotRegistered: PlainDescriptor; + /** + *Not a current auction. + */ + NotCurrentAuction: PlainDescriptor; + /** + *Not an auction. + */ + NotAuction: PlainDescriptor; + /** + *Auction has already ended. + */ + AuctionEnded: PlainDescriptor; + /** + *The para is already leased out for part of this range. + */ + AlreadyLeasedOut: PlainDescriptor; + }; + Crowdloan: { + /** + *The current lease period is more than the first lease period. + */ + FirstPeriodInPast: PlainDescriptor; + /** + *The first lease period needs to at least be less than 3 `max_value`. + */ + FirstPeriodTooFarInFuture: PlainDescriptor; + /** + *Last lease period must be greater than first lease period. + */ + LastPeriodBeforeFirstPeriod: PlainDescriptor; + /** + *The last lease period cannot be more than 3 periods after the first period. + */ + LastPeriodTooFarInFuture: PlainDescriptor; + /** + *The campaign ends before the current block number. The end must be in the future. + */ + CannotEndInPast: PlainDescriptor; + /** + *The end date for this crowdloan is not sensible. + */ + EndTooFarInFuture: PlainDescriptor; + /** + *There was an overflow. + */ + Overflow: PlainDescriptor; + /** + *The contribution was below the minimum, `MinContribution`. + */ + ContributionTooSmall: PlainDescriptor; + /** + *Invalid fund index. + */ + InvalidParaId: PlainDescriptor; + /** + *Contributions exceed maximum amount. + */ + CapExceeded: PlainDescriptor; + /** + *The contribution period has already ended. + */ + ContributionPeriodOver: PlainDescriptor; + /** + *The origin of this call is invalid. + */ + InvalidOrigin: PlainDescriptor; + /** + *This crowdloan does not correspond to a parachain. + */ + NotParachain: PlainDescriptor; + /** + *This parachain lease is still active and retirement cannot yet begin. + */ + LeaseActive: PlainDescriptor; + /** + *This parachain's bid or lease is still active and withdraw cannot yet begin. + */ + BidOrLeaseActive: PlainDescriptor; + /** + *The crowdloan has not yet ended. + */ + FundNotEnded: PlainDescriptor; + /** + *There are no contributions stored in this crowdloan. + */ + NoContributions: PlainDescriptor; + /** + *The crowdloan is not ready to dissolve. Potentially still has a slot or in retirement + *period. + */ + NotReadyToDissolve: PlainDescriptor; + /** + *Invalid signature. + */ + InvalidSignature: PlainDescriptor; + /** + *The provided memo is too large. + */ + MemoTooLarge: PlainDescriptor; + /** + *The fund is already in `NewRaise` + */ + AlreadyInNewRaise: PlainDescriptor; + /** + *No contributions allowed during the VRF delay + */ + VrfDelayInProgress: PlainDescriptor; + /** + *A lease period has not started yet, due to an offset in the starting block. + */ + NoLeasePeriod: PlainDescriptor; + }; + Coretime: { + /** + *The paraid making the call is not the coretime brokerage system parachain. + */ + NotBroker: PlainDescriptor; + /** + *Requested revenue information `when` parameter was in the future from the current + *block height. + */ + RequestedFutureRevenue: PlainDescriptor; + /** + *Failed to transfer assets to the coretime chain + */ + AssetTransferFailed: PlainDescriptor; + }; + XcmPallet: { + /** + *The desired destination was unreachable, generally because there is a no way of routing + *to it. + */ + Unreachable: PlainDescriptor; + /** + *There was some other issue (i.e. not to do with routing) in sending the message. + *Perhaps a lack of space for buffering the message. + */ + SendFailure: PlainDescriptor; + /** + *The message execution fails the filter. + */ + Filtered: PlainDescriptor; + /** + *The message's weight could not be determined. + */ + UnweighableMessage: PlainDescriptor; + /** + *The destination `Location` provided cannot be inverted. + */ + DestinationNotInvertible: PlainDescriptor; + /** + *The assets to be sent are empty. + */ + Empty: PlainDescriptor; + /** + *Could not re-anchor the assets to declare the fees for the destination chain. + */ + CannotReanchor: PlainDescriptor; + /** + *Too many assets have been attempted for transfer. + */ + TooManyAssets: PlainDescriptor; + /** + *Origin is invalid for sending. + */ + InvalidOrigin: PlainDescriptor; + /** + *The version of the `Versioned` value used is not able to be interpreted. + */ + BadVersion: PlainDescriptor; + /** + *The given location could not be used (e.g. because it cannot be expressed in the + *desired version of XCM). + */ + BadLocation: PlainDescriptor; + /** + *The referenced subscription could not be found. + */ + NoSubscription: PlainDescriptor; + /** + *The location is invalid since it already has a subscription from us. + */ + AlreadySubscribed: PlainDescriptor; + /** + *Could not check-out the assets for teleportation to the destination chain. + */ + CannotCheckOutTeleport: PlainDescriptor; + /** + *The owner does not own (all) of the asset that they wish to do the operation on. + */ + LowBalance: PlainDescriptor; + /** + *The asset owner has too many locks on the asset. + */ + TooManyLocks: PlainDescriptor; + /** + *The given account is not an identifiable sovereign account for any location. + */ + AccountNotSovereign: PlainDescriptor; + /** + *The operation required fees to be paid which the initiator could not meet. + */ + FeesNotMet: PlainDescriptor; + /** + *A remote lock with the corresponding data could not be found. + */ + LockNotFound: PlainDescriptor; + /** + *The unlock operation cannot succeed because there are still consumers of the lock. + */ + InUse: PlainDescriptor; + /** + *Invalid asset, reserve chain could not be determined for it. + */ + InvalidAssetUnknownReserve: PlainDescriptor; + /** + *Invalid asset, do not support remote asset reserves with different fees reserves. + */ + InvalidAssetUnsupportedReserve: PlainDescriptor; + /** + *Too many assets with different reserve locations have been attempted for transfer. + */ + TooManyReserves: PlainDescriptor; + /** + *Local XCM execution incomplete. + */ + LocalExecutionIncomplete: PlainDescriptor; + }; + MessageQueue: { + /** + *Page is not reapable because it has items remaining to be processed and is not old + *enough. + */ + NotReapable: PlainDescriptor; + /** + *Page to be reaped does not exist. + */ + NoPage: PlainDescriptor; + /** + *The referenced message could not be found. + */ + NoMessage: PlainDescriptor; + /** + *The message was already processed and cannot be processed again. + */ + AlreadyProcessed: PlainDescriptor; + /** + *The message is queued for future execution. + */ + Queued: PlainDescriptor; + /** + *There is temporarily not enough weight to continue servicing messages. + */ + InsufficientWeight: PlainDescriptor; + /** + *This message is temporarily unprocessable. + * + *Such errors are expected, but not guaranteed, to resolve themselves eventually through + *retrying. + */ + TemporarilyUnprocessable: PlainDescriptor; + /** + *The queue is paused and no message can be executed from it. + * + *This can change at any time and may resolve in the future by re-trying. + */ + QueuePaused: PlainDescriptor; + /** + *Another call is in progress and needs to finish before this call can happen. + */ + RecursiveDisallowed: PlainDescriptor; + }; + AssetRate: { + /** + *The given asset ID is unknown. + */ + UnknownAssetKind: PlainDescriptor; + /** + *The given asset ID already has an assigned conversion rate and cannot be re-created. + */ + AlreadyExists: PlainDescriptor; + /** + *Overflow ocurred when calculating the inverse rate. + */ + Overflow: PlainDescriptor; + }; + Beefy: { + /** + *A key ownership proof provided as part of an equivocation report is invalid. + */ + InvalidKeyOwnershipProof: PlainDescriptor; + /** + *An equivocation proof provided as part of an equivocation report is invalid. + */ + InvalidEquivocationProof: PlainDescriptor; + /** + *A given equivocation report is valid but already previously reported. + */ + DuplicateOffenceReport: PlainDescriptor; + /** + *Submitted configuration is invalid. + */ + InvalidConfiguration: PlainDescriptor; + }; +}; +type IConstants = { + System: { + /** + * Block & extrinsics weights: base values and limits. + */ + BlockWeights: PlainDescriptor>; + /** + * The maximum length of a block (in bytes). + */ + BlockLength: PlainDescriptor>; + /** + * Maximum number of block number to block hash mappings to keep (oldest pruned first). + */ + BlockHashCount: PlainDescriptor; + /** + * The weight of runtime database operations the runtime can invoke. + */ + DbWeight: PlainDescriptor>; + /** + * Get the chain's in-code version. + */ + Version: PlainDescriptor>; + /** + * The designated SS58 prefix of this chain. + * + * This replaces the "ss58Format" property declared in the chain spec. Reason is + * that the runtime should know about the prefix in order to make use of it as + * an identifier of the chain. + */ + SS58Prefix: PlainDescriptor; + }; + Babe: { + /** + * The amount of time, in slots, that each epoch should last. + * NOTE: Currently it is not possible to change the epoch duration after + * the chain has started. Attempting to do so will brick block production. + */ + EpochDuration: PlainDescriptor; + /** + * The expected average block time at which BABE should be creating + * blocks. Since BABE is probabilistic it is not trivial to figure out + * what the expected average block time should be based on the slot + * duration and the security parameter `c` (where `1 - c` represents + * the probability of a slot being empty). + */ + ExpectedBlockTime: PlainDescriptor; + /** + * Max number of authorities allowed + */ + MaxAuthorities: PlainDescriptor; + /** + * The maximum number of nominators for each validator. + */ + MaxNominators: PlainDescriptor; + }; + Timestamp: { + /** + * The minimum period between blocks. + * + * Be aware that this is different to the *expected* period that the block production + * apparatus provides. Your chosen consensus system will generally work with this to + * determine a sensible block time. For example, in the Aura pallet it will be double this + * period on default settings. + */ + MinimumPeriod: PlainDescriptor; + }; + Indices: { + /** + * The deposit needed for reserving an index. + */ + Deposit: PlainDescriptor; + }; + Balances: { + /** + * The minimum amount required to keep an account open. MUST BE GREATER THAN ZERO! + * + * If you *really* need it to be zero, you can enable the feature `insecure_zero_ed` for + * this pallet. However, you do so at your own risk: this will open up a major DoS vector. + * In case you have multiple sources of provider references, you may also get unexpected + * behaviour if you set this to zero. + * + * Bottom line: Do yourself a favour and make it at least one! + */ + ExistentialDeposit: PlainDescriptor; + /** + * The maximum number of locks that should exist on an account. + * Not strictly enforced, but used for weight estimation. + * + * Use of locks is deprecated in favour of freezes. See `https://github.com/paritytech/substrate/pull/12951/` + */ + MaxLocks: PlainDescriptor; + /** + * The maximum number of named reserves that can exist on an account. + * + * Use of reserves is deprecated in favour of holds. See `https://github.com/paritytech/substrate/pull/12951/` + */ + MaxReserves: PlainDescriptor; + /** + * The maximum number of individual freeze locks that can exist on an account at any time. + */ + MaxFreezes: PlainDescriptor; + }; + TransactionPayment: { + /** + * A fee multiplier for `Operational` extrinsics to compute "virtual tip" to boost their + * `priority` + * + * This value is multiplied by the `final_fee` to obtain a "virtual tip" that is later + * added to a tip component in regular `priority` calculations. + * It means that a `Normal` transaction can front-run a similarly-sized `Operational` + * extrinsic (with no tip), by including a tip value greater than the virtual tip. + * + * ```rust,ignore + * // For `Normal` + * let priority = priority_calc(tip); + * + * // For `Operational` + * let virtual_tip = (inclusion_fee + tip) * OperationalFeeMultiplier; + * let priority = priority_calc(tip + virtual_tip); + * ``` + * + * Note that since we use `final_fee` the multiplier applies also to the regular `tip` + * sent with the transaction. So, not only does the transaction get a priority bump based + * on the `inclusion_fee`, but we also amplify the impact of tips applied to `Operational` + * transactions. + */ + OperationalFeeMultiplier: PlainDescriptor; + }; + Staking: { + /** + * Number of eras to keep in history. + * + * Following information is kept for eras in `[current_era - + * HistoryDepth, current_era]`: `ErasStakers`, `ErasStakersClipped`, + * `ErasValidatorPrefs`, `ErasValidatorReward`, `ErasRewardPoints`, + * `ErasTotalStake`, `ErasStartSessionIndex`, `ClaimedRewards`, `ErasStakersPaged`, + * `ErasStakersOverview`. + * + * Must be more than the number of eras delayed by session. + * I.e. active era must always be in history. I.e. `active_era > + * current_era - history_depth` must be guaranteed. + * + * If migrating an existing pallet from storage value to config value, + * this should be set to same value or greater as in storage. + * + * Note: `HistoryDepth` is used as the upper bound for the `BoundedVec` + * item `StakingLedger.legacy_claimed_rewards`. Setting this value lower than + * the existing value can lead to inconsistencies in the + * `StakingLedger` and will need to be handled properly in a migration. + * The test `reducing_history_depth_abrupt` shows this effect. + */ + HistoryDepth: PlainDescriptor; + /** + * Number of sessions per era. + */ + SessionsPerEra: PlainDescriptor; + /** + * Number of eras that staked funds must remain bonded for. + */ + BondingDuration: PlainDescriptor; + /** + * Number of eras that slashes are deferred by, after computation. + * + * This should be less than the bonding duration. Set to 0 if slashes + * should be applied immediately, without opportunity for intervention. + */ + SlashDeferDuration: PlainDescriptor; + /** + * The maximum size of each `T::ExposurePage`. + * + * An `ExposurePage` is weakly bounded to a maximum of `MaxExposurePageSize` + * nominators. + * + * For older non-paged exposure, a reward payout was restricted to the top + * `MaxExposurePageSize` nominators. This is to limit the i/o cost for the + * nominator payout. + * + * Note: `MaxExposurePageSize` is used to bound `ClaimedRewards` and is unsafe to reduce + * without handling it in a migration. + */ + MaxExposurePageSize: PlainDescriptor; + /** + * The maximum number of `unlocking` chunks a [`StakingLedger`] can + * have. Effectively determines how many unique eras a staker may be + * unbonding in. + * + * Note: `MaxUnlockingChunks` is used as the upper bound for the + * `BoundedVec` item `StakingLedger.unlocking`. Setting this value + * lower than the existing value can lead to inconsistencies in the + * `StakingLedger` and will need to be handled properly in a runtime + * migration. The test `reducing_max_unlocking_chunks_abrupt` shows + * this effect. + */ + MaxUnlockingChunks: PlainDescriptor; + }; + Grandpa: { + /** + * Max Authorities in use + */ + MaxAuthorities: PlainDescriptor; + /** + * The maximum number of nominators for each validator. + */ + MaxNominators: PlainDescriptor; + /** + * The maximum number of entries to keep in the set id to session index mapping. + * + * Since the `SetIdSession` map is only used for validating equivocations this + * value should relate to the bonding duration of whatever staking system is + * being used (if any). If equivocation handling is not enabled then this value + * can be zero. + */ + MaxSetIdSessionEntries: PlainDescriptor; + }; + Treasury: { + /** + * Period between successive spends. + */ + SpendPeriod: PlainDescriptor; + /** + * Percentage of spare funds (if any) that are burnt per spend period. + */ + Burn: PlainDescriptor; + /** + * The treasury's pallet id, used for deriving its sovereign account ID. + */ + PalletId: PlainDescriptor>; + /** + * The maximum number of approvals that can wait in the spending queue. + * + * NOTE: This parameter is also used within the Bounties Pallet extension if enabled. + */ + MaxApprovals: PlainDescriptor; + /** + * The period during which an approved treasury spend has to be claimed. + */ + PayoutPeriod: PlainDescriptor; + }; + ConvictionVoting: { + /** + * The maximum number of concurrent votes an account may have. + * + * Also used to compute weight, an overly large value can lead to extrinsics with large + * weight estimation: see `delegate` for instance. + */ + MaxVotes: PlainDescriptor; + /** + * The minimum period of vote locking. + * + * It should be no shorter than enactment period to ensure that in the case of an approval, + * those successful voters are locked into the consequences that their votes entail. + */ + VoteLockingPeriod: PlainDescriptor; + }; + Referenda: { + /** + * The minimum amount to be used as a deposit for a public referendum proposal. + */ + SubmissionDeposit: PlainDescriptor; + /** + * Maximum size of the referendum queue for a single track. + */ + MaxQueued: PlainDescriptor; + /** + * The number of blocks after submission that a referendum must begin being decided by. + * Once this passes, then anyone may cancel the referendum. + */ + UndecidingTimeout: PlainDescriptor; + /** + * Quantization level for the referendum wakeup scheduler. A higher number will result in + * fewer storage reads/writes needed for smaller voters, but also result in delays to the + * automatic referendum status changes. Explicit servicing instructions are unaffected. + */ + AlarmInterval: PlainDescriptor; + /** + * Information concerning the different referendum tracks. + */ + Tracks: PlainDescriptor>; + }; + FellowshipReferenda: { + /** + * The minimum amount to be used as a deposit for a public referendum proposal. + */ + SubmissionDeposit: PlainDescriptor; + /** + * Maximum size of the referendum queue for a single track. + */ + MaxQueued: PlainDescriptor; + /** + * The number of blocks after submission that a referendum must begin being decided by. + * Once this passes, then anyone may cancel the referendum. + */ + UndecidingTimeout: PlainDescriptor; + /** + * Quantization level for the referendum wakeup scheduler. A higher number will result in + * fewer storage reads/writes needed for smaller voters, but also result in delays to the + * automatic referendum status changes. Explicit servicing instructions are unaffected. + */ + AlarmInterval: PlainDescriptor; + /** + * Information concerning the different referendum tracks. + */ + Tracks: PlainDescriptor>; + }; + Claims: { + /** + + */ + Prefix: PlainDescriptor; + }; + Utility: { + /** + * The limit on the number of batched calls. + */ + batched_calls_limit: PlainDescriptor; + }; + Society: { + /** + * The societies's pallet id + */ + PalletId: PlainDescriptor>; + /** + * The maximum number of strikes before a member gets funds slashed. + */ + GraceStrikes: PlainDescriptor; + /** + * The amount of incentive paid within each period. Doesn't include VoterTip. + */ + PeriodSpend: PlainDescriptor; + /** + * The number of blocks on which new candidates should be voted on. Together with + * `ClaimPeriod`, this sums to the number of blocks between candidate intake periods. + */ + VotingPeriod: PlainDescriptor; + /** + * The number of blocks on which new candidates can claim their membership and be the + * named head. + */ + ClaimPeriod: PlainDescriptor; + /** + * The maximum duration of the payout lock. + */ + MaxLockDuration: PlainDescriptor; + /** + * The number of blocks between membership challenges. + */ + ChallengePeriod: PlainDescriptor; + /** + * The maximum number of payouts a member may have waiting unclaimed. + */ + MaxPayouts: PlainDescriptor; + /** + * The maximum number of bids at once. + */ + MaxBids: PlainDescriptor; + }; + Recovery: { + /** + * The base amount of currency needed to reserve for creating a recovery configuration. + * + * This is held for an additional storage item whose value size is + * `2 + sizeof(BlockNumber, Balance)` bytes. + */ + ConfigDepositBase: PlainDescriptor; + /** + * The amount of currency needed per additional user when creating a recovery + * configuration. + * + * This is held for adding `sizeof(AccountId)` bytes more into a pre-existing storage + * value. + */ + FriendDepositFactor: PlainDescriptor; + /** + * The maximum amount of friends allowed in a recovery configuration. + * + * NOTE: The threshold programmed in this Pallet uses u16, so it does + * not really make sense to have a limit here greater than u16::MAX. + * But also, that is a lot more than you should probably set this value + * to anyway... + */ + MaxFriends: PlainDescriptor; + /** + * The base amount of currency needed to reserve for starting a recovery. + * + * This is primarily held for deterring malicious recovery attempts, and should + * have a value large enough that a bad actor would choose not to place this + * deposit. It also acts to fund additional storage item whose value size is + * `sizeof(BlockNumber, Balance + T * AccountId)` bytes. Where T is a configurable + * threshold. + */ + RecoveryDeposit: PlainDescriptor; + }; + Vesting: { + /** + * The minimum amount transferred to call `vested_transfer`. + */ + MinVestedTransfer: PlainDescriptor; + /** + + */ + MaxVestingSchedules: PlainDescriptor; + }; + Scheduler: { + /** + * The maximum weight that may be scheduled per block for any dispatchables. + */ + MaximumWeight: PlainDescriptor>; + /** + * The maximum number of scheduled calls in the queue for a single block. + * + * NOTE: + * + Dependent pallets' benchmarks might require a higher limit for the setting. Set a + * higher limit under `runtime-benchmarks` feature. + */ + MaxScheduledPerBlock: PlainDescriptor; + }; + Proxy: { + /** + * The base amount of currency needed to reserve for creating a proxy. + * + * This is held for an additional storage item whose value size is + * `sizeof(Balance)` bytes and whose key size is `sizeof(AccountId)` bytes. + */ + ProxyDepositBase: PlainDescriptor; + /** + * The amount of currency needed per proxy added. + * + * This is held for adding 32 bytes plus an instance of `ProxyType` more into a + * pre-existing storage value. Thus, when configuring `ProxyDepositFactor` one should take + * into account `32 + proxy_type.encode().len()` bytes of data. + */ + ProxyDepositFactor: PlainDescriptor; + /** + * The maximum amount of proxies allowed for a single account. + */ + MaxProxies: PlainDescriptor; + /** + * The maximum amount of time-delayed announcements that are allowed to be pending. + */ + MaxPending: PlainDescriptor; + /** + * The base amount of currency needed to reserve for creating an announcement. + * + * This is held when a new storage item holding a `Balance` is created (typically 16 + * bytes). + */ + AnnouncementDepositBase: PlainDescriptor; + /** + * The amount of currency needed per announcement made. + * + * This is held for adding an `AccountId`, `Hash` and `BlockNumber` (typically 68 bytes) + * into a pre-existing storage value. + */ + AnnouncementDepositFactor: PlainDescriptor; + }; + Multisig: { + /** + * The base amount of currency needed to reserve for creating a multisig execution or to + * store a dispatch call for later. + * + * This is held for an additional storage item whose value size is + * `4 + sizeof((BlockNumber, Balance, AccountId))` bytes and whose key size is + * `32 + sizeof(AccountId)` bytes. + */ + DepositBase: PlainDescriptor; + /** + * The amount of currency needed per unit threshold when creating a multisig execution. + * + * This is held for adding 32 bytes more into a pre-existing storage value. + */ + DepositFactor: PlainDescriptor; + /** + * The maximum amount of signatories allowed in the multisig. + */ + MaxSignatories: PlainDescriptor; + }; + Bounties: { + /** + * The amount held on deposit for placing a bounty proposal. + */ + BountyDepositBase: PlainDescriptor; + /** + * The delay period for which a bounty beneficiary need to wait before claim the payout. + */ + BountyDepositPayoutDelay: PlainDescriptor; + /** + * Bounty duration in blocks. + */ + BountyUpdatePeriod: PlainDescriptor; + /** + * The curator deposit is calculated as a percentage of the curator fee. + * + * This deposit has optional upper and lower bounds with `CuratorDepositMax` and + * `CuratorDepositMin`. + */ + CuratorDepositMultiplier: PlainDescriptor; + /** + * Maximum amount of funds that should be placed in a deposit for making a proposal. + */ + CuratorDepositMax: PlainDescriptor>; + /** + * Minimum amount of funds that should be placed in a deposit for making a proposal. + */ + CuratorDepositMin: PlainDescriptor>; + /** + * Minimum value for a bounty. + */ + BountyValueMinimum: PlainDescriptor; + /** + * The amount held on deposit per byte within the tip report reason or bounty description. + */ + DataDepositPerByte: PlainDescriptor; + /** + * Maximum acceptable reason length. + * + * Benchmarks depend on this value, be sure to update weights file when changing this value + */ + MaximumReasonLength: PlainDescriptor; + }; + ChildBounties: { + /** + * Maximum number of child bounties that can be added to a parent bounty. + */ + MaxActiveChildBountyCount: PlainDescriptor; + /** + * Minimum value for a child-bounty. + */ + ChildBountyValueMinimum: PlainDescriptor; + }; + ElectionProviderMultiPhase: { + /** + * The minimum amount of improvement to the solution score that defines a solution as + * "better" in the Signed phase. + */ + BetterSignedThreshold: PlainDescriptor; + /** + * The repeat threshold of the offchain worker. + * + * For example, if it is 5, that means that at least 5 blocks will elapse between attempts + * to submit the worker's solution. + */ + OffchainRepeat: PlainDescriptor; + /** + * The priority of the unsigned transaction submitted in the unsigned-phase + */ + MinerTxPriority: PlainDescriptor; + /** + * Maximum number of signed submissions that can be queued. + * + * It is best to avoid adjusting this during an election, as it impacts downstream data + * structures. In particular, `SignedSubmissionIndices` is bounded on this value. If you + * update this value during an election, you _must_ ensure that + * `SignedSubmissionIndices.len()` is less than or equal to the new value. Otherwise, + * attempts to submit new solutions may cause a runtime panic. + */ + SignedMaxSubmissions: PlainDescriptor; + /** + * Maximum weight of a signed solution. + * + * If [`Config::MinerConfig`] is being implemented to submit signed solutions (outside of + * this pallet), then [`MinerConfig::solution_weight`] is used to compare against + * this value. + */ + SignedMaxWeight: PlainDescriptor>; + /** + * The maximum amount of unchecked solutions to refund the call fee for. + */ + SignedMaxRefunds: PlainDescriptor; + /** + * Base reward for a signed solution + */ + SignedRewardBase: PlainDescriptor; + /** + * Per-byte deposit for a signed solution. + */ + SignedDepositByte: PlainDescriptor; + /** + * Per-weight deposit for a signed solution. + */ + SignedDepositWeight: PlainDescriptor; + /** + * The maximum number of winners that can be elected by this `ElectionProvider` + * implementation. + * + * Note: This must always be greater or equal to `T::DataProvider::desired_targets()`. + */ + MaxWinners: PlainDescriptor; + /** + + */ + MinerMaxLength: PlainDescriptor; + /** + + */ + MinerMaxWeight: PlainDescriptor>; + /** + + */ + MinerMaxVotesPerVoter: PlainDescriptor; + /** + + */ + MinerMaxWinners: PlainDescriptor; + }; + Nis: { + /** + * The treasury's pallet id, used for deriving its sovereign account ID. + */ + PalletId: PlainDescriptor>; + /** + * Number of duration queues in total. This sets the maximum duration supported, which is + * this value multiplied by `Period`. + */ + QueueCount: PlainDescriptor; + /** + * Maximum number of items that may be in each duration queue. + * + * Must be larger than zero. + */ + MaxQueueLen: PlainDescriptor; + /** + * Portion of the queue which is free from ordering and just a FIFO. + * + * Must be no greater than `MaxQueueLen`. + */ + FifoQueueLen: PlainDescriptor; + /** + * The base period for the duration queues. This is the common multiple across all + * supported freezing durations that can be bid upon. + */ + BasePeriod: PlainDescriptor; + /** + * The minimum amount of funds that may be placed in a bid. Note that this + * does not actually limit the amount which may be represented in a receipt since bids may + * be split up by the system. + * + * It should be at least big enough to ensure that there is no possible storage spam attack + * or queue-filling attack. + */ + MinBid: PlainDescriptor; + /** + * The minimum amount of funds which may intentionally be left remaining under a single + * receipt. + */ + MinReceipt: PlainDescriptor; + /** + * The number of blocks between consecutive attempts to dequeue bids and create receipts. + * + * A larger value results in fewer storage hits each block, but a slower period to get to + * the target. + */ + IntakePeriod: PlainDescriptor; + /** + * The maximum amount of bids that can consolidated into receipts in a single intake. A + * larger value here means less of the block available for transactions should there be a + * glut of bids. + */ + MaxIntakeWeight: PlainDescriptor>; + /** + * The maximum proportion which may be thawed and the period over which it is reset. + */ + ThawThrottle: PlainDescriptor>; + }; + NisCounterpartBalances: { + /** + * The minimum amount required to keep an account open. MUST BE GREATER THAN ZERO! + * + * If you *really* need it to be zero, you can enable the feature `insecure_zero_ed` for + * this pallet. However, you do so at your own risk: this will open up a major DoS vector. + * In case you have multiple sources of provider references, you may also get unexpected + * behaviour if you set this to zero. + * + * Bottom line: Do yourself a favour and make it at least one! + */ + ExistentialDeposit: PlainDescriptor; + /** + * The maximum number of locks that should exist on an account. + * Not strictly enforced, but used for weight estimation. + * + * Use of locks is deprecated in favour of freezes. See `https://github.com/paritytech/substrate/pull/12951/` + */ + MaxLocks: PlainDescriptor; + /** + * The maximum number of named reserves that can exist on an account. + * + * Use of reserves is deprecated in favour of holds. See `https://github.com/paritytech/substrate/pull/12951/` + */ + MaxReserves: PlainDescriptor; + /** + * The maximum number of individual freeze locks that can exist on an account at any time. + */ + MaxFreezes: PlainDescriptor; + }; + VoterList: { + /** + * The list of thresholds separating the various bags. + * + * Ids are separated into unsorted bags according to their score. This specifies the + * thresholds separating the bags. An id's bag is the largest bag for which the id's score + * is less than or equal to its upper threshold. + * + * When ids are iterated, higher bags are iterated completely before lower bags. This means + * that iteration is _semi-sorted_: ids of higher score tend to come before ids of lower + * score, but peer ids within a particular bag are sorted in insertion order. + * + * # Expressing the constant + * + * This constant must be sorted in strictly increasing order. Duplicate items are not + * permitted. + * + * There is an implied upper limit of `Score::MAX`; that value does not need to be + * specified within the bag. For any two threshold lists, if one ends with + * `Score::MAX`, the other one does not, and they are otherwise equal, the two + * lists will behave identically. + * + * # Calculation + * + * It is recommended to generate the set of thresholds in a geometric series, such that + * there exists some constant ratio such that `threshold[k + 1] == (threshold[k] * + * constant_ratio).max(threshold[k] + 1)` for all `k`. + * + * The helpers in the `/utils/frame/generate-bags` module can simplify this calculation. + * + * # Examples + * + * - If `BagThresholds::get().is_empty()`, then all ids are put into the same bag, and + * iteration is strictly in insertion order. + * - If `BagThresholds::get().len() == 64`, and the thresholds are determined according to + * the procedure given above, then the constant ratio is equal to 2. + * - If `BagThresholds::get().len() == 200`, and the thresholds are determined according to + * the procedure given above, then the constant ratio is approximately equal to 1.248. + * - If the threshold list begins `[1, 2, 3, ...]`, then an id with score 0 or 1 will fall + * into bag 0, an id with score 2 will fall into bag 1, etc. + * + * # Migration + * + * In the event that this list ever changes, a copy of the old bags list must be retained. + * With that `List::migrate` can be called, which will perform the appropriate migration. + */ + BagThresholds: PlainDescriptor>; + }; + NominationPools: { + /** + * The nomination pool's pallet id. + */ + PalletId: PlainDescriptor>; + /** + * The maximum pool points-to-balance ratio that an `open` pool can have. + * + * This is important in the event slashing takes place and the pool's points-to-balance + * ratio becomes disproportional. + * + * Moreover, this relates to the `RewardCounter` type as well, as the arithmetic operations + * are a function of number of points, and by setting this value to e.g. 10, you ensure + * that the total number of points in the system are at most 10 times the total_issuance of + * the chain, in the absolute worse case. + * + * For a value of 10, the threshold would be a pool points-to-balance ratio of 10:1. + * Such a scenario would also be the equivalent of the pool being 90% slashed. + */ + MaxPointsToBalance: PlainDescriptor; + /** + * The maximum number of simultaneous unbonding chunks that can exist per member. + */ + MaxUnbonding: PlainDescriptor; + }; + FastUnstake: { + /** + * Deposit to take for unstaking, to make sure we're able to slash the it in order to cover + * the costs of resources on unsuccessful unstake. + */ + Deposit: PlainDescriptor; + }; + Paras: { + /** + + */ + UnsignedPriority: PlainDescriptor; + }; + OnDemandAssignmentProvider: { + /** + * The default value for the spot traffic multiplier. + */ + TrafficDefaultValue: PlainDescriptor; + /** + * The maximum number of blocks some historical revenue + * information stored for. + */ + MaxHistoricalRevenue: PlainDescriptor; + /** + * Identifier for the internal revenue balance. + */ + PalletId: PlainDescriptor>; + }; + Registrar: { + /** + * The deposit to be paid to run a on-demand parachain. + * This should include the cost for storing the genesis head and validation code. + */ + ParaDeposit: PlainDescriptor; + /** + * The deposit to be paid per byte stored on chain. + */ + DataDepositPerByte: PlainDescriptor; + }; + Slots: { + /** + * The number of blocks over which a single period lasts. + */ + LeasePeriod: PlainDescriptor; + /** + * The number of blocks to offset each lease period by. + */ + LeaseOffset: PlainDescriptor; + }; + Auctions: { + /** + * The number of blocks over which an auction may be retroactively ended. + */ + EndingPeriod: PlainDescriptor; + /** + * The length of each sample to take during the ending period. + * + * `EndingPeriod` / `SampleLength` = Total # of Samples + */ + SampleLength: PlainDescriptor; + /** + + */ + SlotRangeCount: PlainDescriptor; + /** + + */ + LeasePeriodsPerSlot: PlainDescriptor; + }; + Crowdloan: { + /** + * `PalletId` for the crowdloan pallet. An appropriate value could be + * `PalletId(*b"py/cfund")` + */ + PalletId: PlainDescriptor>; + /** + * The minimum amount that may be contributed into a crowdloan. Should almost certainly be + * at least `ExistentialDeposit`. + */ + MinContribution: PlainDescriptor; + /** + * Max number of storage keys to remove per extrinsic call. + */ + RemoveKeysLimit: PlainDescriptor; + }; + Coretime: { + /** + * The ParaId of the coretime chain. + */ + BrokerId: PlainDescriptor; + /** + * The coretime chain pot location. + */ + BrokerPotLocation: PlainDescriptor; + }; + MessageQueue: { + /** + * The size of the page; this implies the maximum message size which can be sent. + * + * A good value depends on the expected message sizes, their weights, the weight that is + * available for processing them and the maximal needed message size. The maximal message + * size is slightly lower than this as defined by [`MaxMessageLenOf`]. + */ + HeapSize: PlainDescriptor; + /** + * The maximum number of stale pages (i.e. of overweight messages) allowed before culling + * can happen. Once there are more stale pages than this, then historical pages may be + * dropped, even if they contain unprocessed overweight messages. + */ + MaxStale: PlainDescriptor; + /** + * The amount of weight (if any) which should be provided to the message queue for + * servicing enqueued items `on_initialize`. + * + * This may be legitimately `None` in the case that you will call + * `ServiceQueues::service_queues` manually or set [`Self::IdleMaxServiceWeight`] to have + * it run in `on_idle`. + */ + ServiceWeight: PlainDescriptor>; + /** + * The maximum amount of weight (if any) to be used from remaining weight `on_idle` which + * should be provided to the message queue for servicing enqueued items `on_idle`. + * Useful for parachains to process messages at the same block they are received. + * + * If `None`, it will not call `ServiceQueues::service_queues` in `on_idle`. + */ + IdleMaxServiceWeight: PlainDescriptor>; + }; + Beefy: { + /** + * The maximum number of authorities that can be added. + */ + MaxAuthorities: PlainDescriptor; + /** + * The maximum number of nominators for each validator. + */ + MaxNominators: PlainDescriptor; + /** + * The maximum number of entries to keep in the set id to session index mapping. + * + * Since the `SetIdSession` map is only used for validating equivocations this + * value should relate to the bonding duration of whatever staking system is + * being used (if any). If equivocation handling is not enabled then this value + * can be zero. + */ + MaxSetIdSessionEntries: PlainDescriptor; + }; +}; +type IRuntimeCalls = { + /** + + */ + Inflation: { + /** + * Return the current estimates of the inflation amount. + * + * This is marked as experimental in light of RFC#89. Nonetheless, its usage is highly + * recommended over trying to read-storage, or re-create the onchain logic. + */ + experimental_inflation_prediction_info: RuntimeDescriptor<[], Anonymize>; + }; + /** + * The `Core` runtime api that every Substrate runtime needs to implement. + */ + Core: { + /** + * Returns the version of the runtime. + */ + version: RuntimeDescriptor<[], Anonymize>; + /** + * Execute the given block. + */ + execute_block: RuntimeDescriptor<[block: Anonymize], undefined>; + /** + * Initialize a block with the given header and return the runtime executive mode. + */ + initialize_block: RuntimeDescriptor<[header: Anonymize], Anonymize>; + }; + /** + * The `Metadata` api trait that returns metadata for the runtime. + */ + Metadata: { + /** + * Returns the metadata of a runtime. + */ + metadata: RuntimeDescriptor<[], Binary>; + /** + * Returns the metadata at a given version. + * + * If the given `version` isn't supported, this will return `None`. + * Use [`Self::metadata_versions`] to find out about supported metadata version of the runtime. + */ + metadata_at_version: RuntimeDescriptor<[version: number], Anonymize>; + /** + * Returns the supported metadata versions. + * + * This can be used to call `metadata_at_version`. + */ + metadata_versions: RuntimeDescriptor<[], Anonymize>; + }; + /** + * The `BlockBuilder` api trait that provides the required functionality for building a block. + */ + BlockBuilder: { + /** + * Apply the given extrinsic. + * + * Returns an inclusion outcome which specifies if this extrinsic is included in + * this block or not. + */ + apply_extrinsic: RuntimeDescriptor<[extrinsic: Binary], Anonymize>; + /** + * Finish the current block. + */ + finalize_block: RuntimeDescriptor<[], Anonymize>; + /** + * Generate inherent extrinsics. The inherent data will vary from chain to chain. + */ + inherent_extrinsics: RuntimeDescriptor<[inherent: Anonymize], Anonymize>; + /** + * Check that the inherents are valid. The inherent data will vary from chain to chain. + */ + check_inherents: RuntimeDescriptor<[block: Anonymize, data: Anonymize], Anonymize>; + }; + /** + * The `TaggedTransactionQueue` api trait for interfering with the transaction queue. + */ + TaggedTransactionQueue: { + /** + * Validate the transaction. + * + * This method is invoked by the transaction pool to learn details about given transaction. + * The implementation should make sure to verify the correctness of the transaction + * against current state. The given `block_hash` corresponds to the hash of the block + * that is used as current state. + * + * Note that this call may be performed by the pool multiple times and transactions + * might be verified in any possible order. + */ + validate_transaction: RuntimeDescriptor<[source: TransactionValidityTransactionSource, tx: Binary, block_hash: FixedSizeBinary<32>], Anonymize>; + }; + /** + * The offchain worker api. + */ + OffchainWorkerApi: { + /** + * Starts the off-chain task for given block header. + */ + offchain_worker: RuntimeDescriptor<[header: Anonymize], undefined>; + }; + /** + * The API for querying the state of parachains on-chain. + */ + ParachainHost: { + /** + * Get the current validators. + */ + validators: RuntimeDescriptor<[], Anonymize>; + /** + * Returns the validator groups and rotation info localized based on the hypothetical child + * of a block whose state this is invoked on. Note that `now` in the `GroupRotationInfo` + * should be the successor of the number of the block. + */ + validator_groups: RuntimeDescriptor<[], Anonymize>; + /** + * Yields information on all availability cores as relevant to the child block. + * Cores are either free or occupied. Free cores can have paras assigned to them. + */ + availability_cores: RuntimeDescriptor<[], Anonymize>; + /** + * Yields the persisted validation data for the given `ParaId` along with an assumption that + * should be used if the para currently occupies a core. + * + * Returns `None` if either the para is not registered or the assumption is `Freed` + * and the para already occupies a core. + */ + persisted_validation_data: RuntimeDescriptor<[para_id: number, assumption: OccupiedCoreAssumption], Anonymize>; + /** + * Returns the persisted validation data for the given `ParaId` along with the corresponding + * validation code hash. Instead of accepting assumption about the para, matches the validation + * data hash against an expected one and yields `None` if they're not equal. + */ + assumed_validation_data: RuntimeDescriptor<[para_id: number, expected_persisted_validation_data_hash: FixedSizeBinary<32>], Anonymize>; + /** + * Checks if the given validation outputs pass the acceptance criteria. + */ + check_validation_outputs: RuntimeDescriptor<[para_id: number, outputs: Anonymize], boolean>; + /** + * Returns the session index expected at a child of the block. + * + * This can be used to instantiate a `SigningContext`. + */ + session_index_for_child: RuntimeDescriptor<[], number>; + /** + * Fetch the validation code used by a para, making the given `OccupiedCoreAssumption`. + * + * Returns `None` if either the para is not registered or the assumption is `Freed` + * and the para already occupies a core. + */ + validation_code: RuntimeDescriptor<[para_id: number, assumption: OccupiedCoreAssumption], Anonymize>; + /** + * Get the receipt of a candidate pending availability. This returns `Some` for any paras + * assigned to occupied cores in `availability_cores` and `None` otherwise. + */ + candidate_pending_availability: RuntimeDescriptor<[para_id: number], Anonymize>; + /** + * Get a vector of events concerning candidates that occurred within a block. + */ + candidate_events: RuntimeDescriptor<[], Anonymize>; + /** + * Get all the pending inbound messages in the downward message queue for a para. + */ + dmq_contents: RuntimeDescriptor<[recipient: number], Anonymize>; + /** + * Get the contents of all channels addressed to the given recipient. Channels that have no + * messages in them are also included. + */ + inbound_hrmp_channels_contents: RuntimeDescriptor<[recipient: number], Anonymize>; + /** + * Get the validation code from its hash. + */ + validation_code_by_hash: RuntimeDescriptor<[hash: FixedSizeBinary<32>], Anonymize>; + /** + * Scrape dispute relevant from on-chain, backing votes and resolved disputes. + */ + on_chain_votes: RuntimeDescriptor<[], Anonymize>; + /** + * Get the session info for the given session, if stored. + * + * NOTE: This function is only available since parachain host version 2. + */ + session_info: RuntimeDescriptor<[index: number], Anonymize>; + /** + * Submits a PVF pre-checking statement into the transaction pool. + * + * NOTE: This function is only available since parachain host version 2. + */ + submit_pvf_check_statement: RuntimeDescriptor<[stmt: Anonymize, signature: FixedSizeBinary<64>], undefined>; + /** + * Returns code hashes of PVFs that require pre-checking by validators in the active set. + * + * NOTE: This function is only available since parachain host version 2. + */ + pvfs_require_precheck: RuntimeDescriptor<[], Anonymize>; + /** + * Fetch the hash of the validation code used by a para, making the given `OccupiedCoreAssumption`. + * + * NOTE: This function is only available since parachain host version 2. + */ + validation_code_hash: RuntimeDescriptor<[para_id: number, assumption: OccupiedCoreAssumption], Anonymize>; + /** + * Returns all onchain disputes. + */ + disputes: RuntimeDescriptor<[], Anonymize>; + /** + * Returns execution parameters for the session. + */ + session_executor_params: RuntimeDescriptor<[session_index: number], Anonymize>; + /** + * Returns a list of validators that lost a past session dispute and need to be slashed. + * NOTE: This function is only available since parachain host version 5. + */ + unapplied_slashes: RuntimeDescriptor<[], Anonymize>; + /** + * Returns a merkle proof of a validator session key. + * NOTE: This function is only available since parachain host version 5. + */ + key_ownership_proof: RuntimeDescriptor<[validator_id: FixedSizeBinary<32>], Anonymize>; + /** + * Submit an unsigned extrinsic to slash validators who lost a dispute about + * a candidate of a past session. + * NOTE: This function is only available since parachain host version 5. + */ + submit_report_dispute_lost: RuntimeDescriptor<[dispute_proof: Anonymize, key_ownership_proof: Binary], boolean>; + /** + * Get the minimum number of backing votes for a parachain candidate. + * This is a staging method! Do not use on production runtimes! + */ + minimum_backing_votes: RuntimeDescriptor<[], number>; + /** + * Returns the state of parachain backing for a given para. + */ + para_backing_state: RuntimeDescriptor<[_: number], Anonymize>; + /** + * Returns candidate's acceptance limitations for asynchronous backing for a relay parent. + */ + async_backing_params: RuntimeDescriptor<[], Anonymize>; + /** + * Returns a list of all disabled validators at the given block. + */ + disabled_validators: RuntimeDescriptor<[], Anonymize>; + /** + * Get node features. + * This is a staging method! Do not use on production runtimes! + */ + node_features: RuntimeDescriptor<[], { + bytes: Uint8Array; + bitsLen: number; + }>; + /** + * Approval voting configuration parameters + */ + approval_voting_params: RuntimeDescriptor<[], number>; + /** + * Claim queue + */ + claim_queue: RuntimeDescriptor<[], Anonymize>; + /** + * Elastic scaling support + */ + candidates_pending_availability: RuntimeDescriptor<[para_id: number], Anonymize>; + }; + /** + * API necessary for BEEFY voters. + */ + BeefyApi: { + /** + * Return the block number where BEEFY consensus is enabled/started + */ + beefy_genesis: RuntimeDescriptor<[], Anonymize>; + /** + * Return the current active BEEFY validator set + */ + validator_set: RuntimeDescriptor<[], Anonymize>; + /** + * Submits an unsigned extrinsic to report an equivocation. The caller + * must provide the equivocation proof and a key ownership proof + * (should be obtained using `generate_key_ownership_proof`). The + * extrinsic will be unsigned and should only be accepted for local + * authorship (not to be broadcast to the network). This method returns + * `None` when creation of the extrinsic fails, e.g. if equivocation + * reporting is disabled for the given runtime (i.e. this method is + * hardcoded to return `None`). Only useful in an offchain context. + */ + submit_report_equivocation_unsigned_extrinsic: RuntimeDescriptor<[equivocation_proof: Anonymize, key_owner_proof: Binary], boolean>; + /** + * Generates a proof of key ownership for the given authority in the + * given set. An example usage of this module is coupled with the + * session historical module to prove that a given authority key is + * tied to a given staking identity during a specific session. Proofs + * of key ownership are necessary for submitting equivocation reports. + * NOTE: even though the API takes a `set_id` as parameter the current + * implementations ignores this parameter and instead relies on this + * method being called at the correct block height, i.e. any point at + * which the given set id is live on-chain. Future implementations will + * instead use indexed data through an offchain worker, not requiring + * older states to be available. + */ + generate_key_ownership_proof: RuntimeDescriptor<[set_id: bigint, authority_id: FixedSizeBinary<33>], Anonymize>; + }; + /** + * API to interact with MMR pallet. + */ + MmrApi: { + /** + * Return the on-chain MMR root hash. + */ + mmr_root: RuntimeDescriptor<[], Anonymize>; + /** + * Return the number of MMR blocks in the chain. + */ + mmr_leaf_count: RuntimeDescriptor<[], Anonymize>; + /** + * Generate MMR proof for a series of block numbers. If `best_known_block_number = Some(n)`, + * use historical MMR state at given block height `n`. Else, use current MMR state. + */ + generate_proof: RuntimeDescriptor<[block_numbers: Anonymize, best_known_block_number: Anonymize], Anonymize>; + /** + * Verify MMR proof against on-chain MMR for a batch of leaves. + * + * Note this function will use on-chain MMR root hash and check if the proof matches the hash. + * Note, the leaves should be sorted such that corresponding leaves and leaf indices have the + * same position in both the `leaves` vector and the `leaf_indices` vector contained in the [LeafProof] + */ + verify_proof: RuntimeDescriptor<[leaves: Anonymize, proof: Anonymize], Anonymize>; + /** + * Verify MMR proof against given root hash for a batch of leaves. + * + * Note this function does not require any on-chain storage - the + * proof is verified against given MMR root hash. + * + * Note, the leaves should be sorted such that corresponding leaves and leaf indices have the + * same position in both the `leaves` vector and the `leaf_indices` vector contained in the [LeafProof] + */ + verify_proof_stateless: RuntimeDescriptor<[root: FixedSizeBinary<32>, leaves: Anonymize, proof: Anonymize], Anonymize>; + }; + /** + * API useful for BEEFY light clients. + */ + BeefyMmrApi: { + /** + * Return the currently active BEEFY authority set proof. + */ + authority_set_proof: RuntimeDescriptor<[], Anonymize>; + /** + * Return the next/queued BEEFY authority set proof. + */ + next_authority_set_proof: RuntimeDescriptor<[], Anonymize>; + }; + /** + * APIs for integrating the GRANDPA finality gadget into runtimes. + * This should be implemented on the runtime side. + * + * This is primarily used for negotiating authority-set changes for the + * gadget. GRANDPA uses a signaling model of changing authority sets: + * changes should be signaled with a delay of N blocks, and then automatically + * applied in the runtime after those N blocks have passed. + * + * The consensus protocol will coordinate the handoff externally. + */ + GrandpaApi: { + /** + * Get the current GRANDPA authorities and weights. This should not change except + * for when changes are scheduled and the corresponding delay has passed. + * + * When called at block B, it will return the set of authorities that should be + * used to finalize descendants of this block (B+1, B+2, ...). The block B itself + * is finalized by the authorities from block B-1. + */ + grandpa_authorities: RuntimeDescriptor<[], Anonymize>; + /** + * Submits an unsigned extrinsic to report an equivocation. The caller + * must provide the equivocation proof and a key ownership proof + * (should be obtained using `generate_key_ownership_proof`). The + * extrinsic will be unsigned and should only be accepted for local + * authorship (not to be broadcast to the network). This method returns + * `None` when creation of the extrinsic fails, e.g. if equivocation + * reporting is disabled for the given runtime (i.e. this method is + * hardcoded to return `None`). Only useful in an offchain context. + */ + submit_report_equivocation_unsigned_extrinsic: RuntimeDescriptor<[equivocation_proof: Anonymize, key_owner_proof: Binary], boolean>; + /** + * Generates a proof of key ownership for the given authority in the + * given set. An example usage of this module is coupled with the + * session historical module to prove that a given authority key is + * tied to a given staking identity during a specific session. Proofs + * of key ownership are necessary for submitting equivocation reports. + * NOTE: even though the API takes a `set_id` as parameter the current + * implementations ignore this parameter and instead rely on this + * method being called at the correct block height, i.e. any point at + * which the given set id is live on-chain. Future implementations will + * instead use indexed data through an offchain worker, not requiring + * older states to be available. + */ + generate_key_ownership_proof: RuntimeDescriptor<[set_id: bigint, authority_id: FixedSizeBinary<32>], Anonymize>; + /** + * Get current GRANDPA authority set id. + */ + current_set_id: RuntimeDescriptor<[], bigint>; + }; + /** + * API necessary for block authorship with BABE. + */ + BabeApi: { + /** + * Return the configuration for BABE. + */ + configuration: RuntimeDescriptor<[], Anonymize>; + /** + * Returns the slot that started the current epoch. + */ + current_epoch_start: RuntimeDescriptor<[], bigint>; + /** + * Returns information regarding the current epoch. + */ + current_epoch: RuntimeDescriptor<[], Anonymize>; + /** + * Returns information regarding the next epoch (which was already + * previously announced). + */ + next_epoch: RuntimeDescriptor<[], Anonymize>; + /** + * Generates a proof of key ownership for the given authority in the + * current epoch. An example usage of this module is coupled with the + * session historical module to prove that a given authority key is + * tied to a given staking identity during a specific session. Proofs + * of key ownership are necessary for submitting equivocation reports. + * NOTE: even though the API takes a `slot` as parameter the current + * implementations ignores this parameter and instead relies on this + * method being called at the correct block height, i.e. any point at + * which the epoch for the given slot is live on-chain. Future + * implementations will instead use indexed data through an offchain + * worker, not requiring older states to be available. + */ + generate_key_ownership_proof: RuntimeDescriptor<[slot: bigint, authority_id: FixedSizeBinary<32>], Anonymize>; + /** + * Submits an unsigned extrinsic to report an equivocation. The caller + * must provide the equivocation proof and a key ownership proof + * (should be obtained using `generate_key_ownership_proof`). The + * extrinsic will be unsigned and should only be accepted for local + * authorship (not to be broadcast to the network). This method returns + * `None` when creation of the extrinsic fails, e.g. if equivocation + * reporting is disabled for the given runtime (i.e. this method is + * hardcoded to return `None`). Only useful in an offchain context. + */ + submit_report_equivocation_unsigned_extrinsic: RuntimeDescriptor<[equivocation_proof: Anonymize, key_owner_proof: Binary], boolean>; + }; + /** + * The authority discovery api. + * + * This api is used by the `client/authority-discovery` module to retrieve identifiers + * of the current and next authority set. + */ + AuthorityDiscoveryApi: { + /** + * Retrieve authority identifiers of the current and next authority set. + */ + authorities: RuntimeDescriptor<[], Anonymize>; + }; + /** + * Session keys runtime api. + */ + SessionKeys: { + /** + * Generate a set of session keys with optionally using the given seed. + * The keys should be stored within the keystore exposed via runtime + * externalities. + * + * The seed needs to be a valid `utf8` string. + * + * Returns the concatenated SCALE encoded public keys. + */ + generate_session_keys: RuntimeDescriptor<[seed: Anonymize], Binary>; + /** + * Decode the given public session keys. + * + * Returns the list of public raw public keys + key type. + */ + decode_session_keys: RuntimeDescriptor<[encoded: Binary], Anonymize>; + }; + /** + * The API to query account nonce. + */ + AccountNonceApi: { + /** + * Get current account nonce of given `AccountId`. + */ + account_nonce: RuntimeDescriptor<[account: SS58String], number>; + }; + /** + + */ + TransactionPaymentApi: { + /** + + */ + query_info: RuntimeDescriptor<[uxt: Binary, len: number], Anonymize>; + /** + + */ + query_fee_details: RuntimeDescriptor<[uxt: Binary, len: number], Anonymize>; + /** + + */ + query_weight_to_fee: RuntimeDescriptor<[weight: Anonymize], bigint>; + /** + + */ + query_length_to_fee: RuntimeDescriptor<[length: number], bigint>; + }; + /** + + */ + TransactionPaymentCallApi: { + /** + * Query information of a dispatch class, weight, and fee of a given encoded `Call`. + */ + query_call_info: RuntimeDescriptor<[call: Anonymize, len: number], Anonymize>; + /** + * Query fee details of a given encoded `Call`. + */ + query_call_fee_details: RuntimeDescriptor<[call: Anonymize, len: number], Anonymize>; + /** + * Query the output of the current `WeightToFee` given some input. + */ + query_weight_to_fee: RuntimeDescriptor<[weight: Anonymize], bigint>; + /** + * Query the output of the current `LengthToFee` given some input. + */ + query_length_to_fee: RuntimeDescriptor<[length: number], bigint>; + }; + /** + * A trait of XCM payment API. + * + * API provides functionality for obtaining: + * + * * the weight required to execute an XCM message, + * * a list of acceptable `AssetId`s for message execution payment, + * * the cost of the weight in the specified acceptable `AssetId`. + * * the fees for an XCM message delivery. + * + * To determine the execution weight of the calls required for + * [`xcm::latest::Instruction::Transact`] instruction, `TransactionPaymentCallApi` can be used. + */ + XcmPaymentApi: { + /** + * Returns a list of acceptable payment assets. + * + * # Arguments + * + * * `xcm_version`: Version. + */ + query_acceptable_payment_assets: RuntimeDescriptor<[xcm_version: number], Anonymize>; + /** + * Returns a weight needed to execute a XCM. + * + * # Arguments + * + * * `message`: `VersionedXcm`. + */ + query_xcm_weight: RuntimeDescriptor<[message: DotXcmVersionedXcm], Anonymize>; + /** + * Converts a weight into a fee for the specified `AssetId`. + * + * # Arguments + * + * * `weight`: convertible `Weight`. + * * `asset`: `VersionedAssetId`. + */ + query_weight_to_asset_fee: RuntimeDescriptor<[weight: Anonymize, asset: DotXcmVersionedAssetId], Anonymize>; + /** + * Get delivery fees for sending a specific `message` to a `destination`. + * These always come in a specific asset, defined by the chain. + * + * # Arguments + * * `message`: The message that'll be sent, necessary because most delivery fees are based on the + * size of the message. + * * `destination`: The destination to send the message to. Different destinations may use + * different senders that charge different fees. + */ + query_delivery_fees: RuntimeDescriptor<[destination: DotXcmVersionedLocation, message: DotXcmVersionedXcm], Anonymize>; + }; + /** + * API for dry-running extrinsics and XCM programs to get the programs that need to be passed to the fees API. + * + * All calls return a vector of tuples (location, xcm) where each "xcm" is executed in "location". + * If there's local execution, the location will be "Here". + * This vector can be used to calculate both execution and delivery fees. + * + * Calls or XCMs might fail when executed, this doesn't mean the result of these calls will be an `Err`. + * In those cases, there might still be a valid result, with the execution error inside it. + * The only reasons why these calls might return an error are listed in the [`Error`] enum. + */ + DryRunApi: { + /** + * Dry run call. + */ + dry_run_call: RuntimeDescriptor<[origin: Anonymize, call: Anonymize], Anonymize>; + /** + * Dry run XCM program + */ + dry_run_xcm: RuntimeDescriptor<[origin_location: DotXcmVersionedLocation, xcm: DotXcmVersionedXcm], Anonymize>; + }; + /** + * API for useful conversions between XCM `Location` and `AccountId`. + */ + LocationToAccountApi: { + /** + * Converts `Location` to `AccountId`. + */ + convert_location: RuntimeDescriptor<[location: DotXcmVersionedLocation], Anonymize>; + }; + /** + * Runtime api for accessing information about nomination pools. + */ + NominationPoolsApi: { + /** + * Returns the pending rewards for the member that the AccountId was given for. + */ + pending_rewards: RuntimeDescriptor<[who: SS58String], bigint>; + /** + * Returns the equivalent balance of `points` for a given pool. + */ + points_to_balance: RuntimeDescriptor<[pool_id: number, points: bigint], bigint>; + /** + * Returns the equivalent points of `new_funds` for a given pool. + */ + balance_to_points: RuntimeDescriptor<[pool_id: number, new_funds: bigint], bigint>; + /** + * Returns the pending slash for a given pool. + */ + pool_pending_slash: RuntimeDescriptor<[pool_id: number], bigint>; + /** + * Returns the pending slash for a given pool member. + */ + member_pending_slash: RuntimeDescriptor<[member: SS58String], bigint>; + /** + * Returns true if the pool with `pool_id` needs migration. + * + * This can happen when the `pallet-nomination-pools` has switched to using strategy + * [`DelegateStake`](pallet_nomination_pools::adapter::DelegateStake) but the pool + * still has funds that were staked using the older strategy + * [TransferStake](pallet_nomination_pools::adapter::TransferStake). Use + * [`migrate_pool_to_delegate_stake`](pallet_nomination_pools::Call::migrate_pool_to_delegate_stake) + * to migrate the pool. + */ + pool_needs_delegate_migration: RuntimeDescriptor<[pool_id: number], boolean>; + /** + * Returns true if the delegated funds of the pool `member` needs migration. + * + * Once a pool has successfully migrated to the strategy + * [`DelegateStake`](pallet_nomination_pools::adapter::DelegateStake), the funds of the + * member can be migrated from pool account to the member's account. Use + * [`migrate_delegation`](pallet_nomination_pools::Call::migrate_delegation) + * to migrate the funds of the pool member. + */ + member_needs_delegate_migration: RuntimeDescriptor<[member: SS58String], boolean>; + }; + /** + + */ + StakingApi: { + /** + * Returns the nominations quota for a nominator with a given balance. + */ + nominations_quota: RuntimeDescriptor<[balance: bigint], number>; + /** + * Returns the page count of exposures for a validator `account` in a given era. + */ + eras_stakers_page_count: RuntimeDescriptor<[era: number, account: SS58String], number>; + /** + * Returns true if validator `account` has pages to be claimed for the given era. + */ + pending_rewards: RuntimeDescriptor<[era: number, account: SS58String], boolean>; + }; + /** + * API to interact with RuntimeGenesisConfig for the runtime + */ + GenesisBuilder: { + /** + * Build `RuntimeGenesisConfig` from a JSON blob not using any defaults and store it in the + * storage. + * + * In the case of a FRAME-based runtime, this function deserializes the full `RuntimeGenesisConfig` from the given JSON blob and + * puts it into the storage. If the provided JSON blob is incorrect or incomplete or the + * deserialization fails, an error is returned. + * + * Please note that provided JSON blob must contain all `RuntimeGenesisConfig` fields, no + * defaults will be used. + */ + build_state: RuntimeDescriptor<[json: Binary], Anonymize>; + /** + * Returns a JSON blob representation of the built-in `RuntimeGenesisConfig` identified by + * `id`. + * + * If `id` is `None` the function returns JSON blob representation of the default + * `RuntimeGenesisConfig` struct of the runtime. Implementation must provide default + * `RuntimeGenesisConfig`. + * + * Otherwise function returns a JSON representation of the built-in, named + * `RuntimeGenesisConfig` preset identified by `id`, or `None` if such preset does not + * exists. Returned `Vec` contains bytes of JSON blob (patch) which comprises a list of + * (potentially nested) key-value pairs that are intended for customizing the default + * runtime genesis config. The patch shall be merged (rfc7386) with the JSON representation + * of the default `RuntimeGenesisConfig` to create a comprehensive genesis config that can + * be used in `build_state` method. + */ + get_preset: RuntimeDescriptor<[id: Anonymize], Anonymize>; + /** + * Returns a list of identifiers for available builtin `RuntimeGenesisConfig` presets. + * + * The presets from the list can be queried with [`GenesisBuilder::get_preset`] method. If + * no named presets are provided by the runtime the list is empty. + */ + preset_names: RuntimeDescriptor<[], Anonymize>; + }; +}; +type IAsset = PlainDescriptor; +export type KsmDispatchError = Anonymize; +type PalletsTypedef = { + __storage: IStorage; + __tx: ICalls; + __event: IEvent; + __error: IError; + __const: IConstants; +}; +type IDescriptors = { + descriptors: { + pallets: PalletsTypedef; + apis: IRuntimeCalls; + } & Promise; + metadataTypes: Promise; + asset: IAsset; + getMetadata: () => Promise; + genesis: string | undefined; +}; +declare const _allDescriptors: IDescriptors; +export default _allDescriptors; +export type KsmQueries = QueryFromPalletsDef; +export type KsmCalls = TxFromPalletsDef; +export type KsmEvents = EventsFromPalletsDef; +export type KsmErrors = ErrorsFromPalletsDef; +export type KsmConstants = ConstFromPalletsDef; +export type KsmCallData = Anonymize & { + value: { + type: string; + }; +}; +export type KsmWhitelistEntry = PalletKey | ApiKey | `query.${NestedKey}` | `tx.${NestedKey}` | `event.${NestedKey}` | `error.${NestedKey}` | `const.${NestedKey}`; +type PalletKey = `*.${keyof (IStorage & ICalls & IEvent & IError & IConstants & IRuntimeCalls)}`; +type NestedKey>> = "*" | { + [P in keyof D & string]: `${P}.*` | { + [N in keyof D[P] & string]: `${P}.${N}`; + }[keyof D[P] & string]; +}[keyof D & string]; +type ApiKey>> = "api.*" | { + [P in keyof D & string]: `api.${P}.*` | { + [N in keyof D[P] & string]: `api.${P}.${N}`; + }[keyof D[P] & string]; +}[keyof D & string]; diff --git a/examples/with-vite-papi/.papi/descriptors/dist/ksm_metadata-I5XGB6KF.mjs b/examples/with-vite-papi/.papi/descriptors/dist/ksm_metadata-I5XGB6KF.mjs new file mode 100644 index 0000000..afc4c54 --- /dev/null +++ b/examples/with-vite-papi/.papi/descriptors/dist/ksm_metadata-I5XGB6KF.mjs @@ -0,0 +1,6 @@ +// .papi/descriptors/src/ksm_metadata.ts +var binMeta = "bWV0YQ9FEAAMHHNwX2NvcmUYY3J5cHRvLEFjY291bnRJZDMyAAAEAAQBIFt1ODsgMzJdAAAEAAADIAAAAAgACAAABQMADAgwZnJhbWVfc3lzdGVtLEFjY291bnRJbmZvCBROb25jZQEQLEFjY291bnREYXRhARQAFAEUbm9uY2UQARROb25jZQABJGNvbnN1bWVycxABIFJlZkNvdW50AAEkcHJvdmlkZXJzEAEgUmVmQ291bnQAASxzdWZmaWNpZW50cxABIFJlZkNvdW50AAEQZGF0YRQBLEFjY291bnREYXRhAAAQAAAFBQAUDDxwYWxsZXRfYmFsYW5jZXMUdHlwZXMsQWNjb3VudERhdGEEHEJhbGFuY2UBGAAQARBmcmVlGAEcQmFsYW5jZQABIHJlc2VydmVkGAEcQmFsYW5jZQABGGZyb3plbhgBHEJhbGFuY2UAARRmbGFncxwBKEV4dHJhRmxhZ3MAABgAAAUHABwMPHBhbGxldF9iYWxhbmNlcxR0eXBlcyhFeHRyYUZsYWdzAAAEABgBEHUxMjgAACAAAAUAACQMNGZyYW1lX3N1cHBvcnQgZGlzcGF0Y2hAUGVyRGlzcGF0Y2hDbGFzcwQEVAEoAAwBGG5vcm1hbCgBBFQAASxvcGVyYXRpb25hbCgBBFQAASRtYW5kYXRvcnkoAQRUAAAoDChzcF93ZWlnaHRzJHdlaWdodF92MhhXZWlnaHQAAAgBIHJlZl90aW1lLAEMdTY0AAEocHJvb2Zfc2l6ZSwBDHU2NAAALAAABjAAMAAABQYANAg8cHJpbWl0aXZlX3R5cGVzEEgyNTYAAAQABAEgW3U4OyAzMl0AADgAAAIIADwQKHNwX3J1bnRpbWUcZ2VuZXJpYxhkaWdlc3QYRGlnZXN0AAAEARBsb2dzQAE8VmVjPERpZ2VzdEl0ZW0+AABAAAACRABEEChzcF9ydW50aW1lHGdlbmVyaWMYZGlnZXN0KERpZ2VzdEl0ZW0AARQoUHJlUnVudGltZQgASAFEQ29uc2Vuc3VzRW5naW5lSWQAADgBHFZlYzx1OD4ABgAkQ29uc2Vuc3VzCABIAURDb25zZW5zdXNFbmdpbmVJZAAAOAEcVmVjPHU4PgAEABBTZWFsCABIAURDb25zZW5zdXNFbmdpbmVJZAAAOAEcVmVjPHU4PgAFABRPdGhlcgQAOAEcVmVjPHU4PgAAAGRSdW50aW1lRW52aXJvbm1lbnRVcGRhdGVkAAgAAEgAAAMEAAAACABMAAACUABQCDBmcmFtZV9zeXN0ZW0sRXZlbnRSZWNvcmQIBEUBVARUATQADAEUcGhhc2U9CAEUUGhhc2UAARRldmVudFQBBEUAARh0b3BpY3MVAwEYVmVjPFQ+AABUCFhzdGFnaW5nX2t1c2FtYV9ydW50aW1lMFJ1bnRpbWVFdmVudAABtBhTeXN0ZW0EAFgBcGZyYW1lX3N5c3RlbTo6RXZlbnQ8UnVudGltZT4AAAAcSW5kaWNlcwQAfAF4cGFsbGV0X2luZGljZXM6OkV2ZW50PFJ1bnRpbWU+AAMAIEJhbGFuY2VzBACAAXxwYWxsZXRfYmFsYW5jZXM6OkV2ZW50PFJ1bnRpbWU+AAQASFRyYW5zYWN0aW9uUGF5bWVudAQAiAGocGFsbGV0X3RyYW5zYWN0aW9uX3BheW1lbnQ6OkV2ZW50PFJ1bnRpbWU+ACEAHFN0YWtpbmcEAIwBeHBhbGxldF9zdGFraW5nOjpFdmVudDxSdW50aW1lPgAGACBPZmZlbmNlcwQApAFYcGFsbGV0X29mZmVuY2VzOjpFdmVudAAHABxTZXNzaW9uBACsAVRwYWxsZXRfc2Vzc2lvbjo6RXZlbnQACAAcR3JhbmRwYQQAsAFUcGFsbGV0X2dyYW5kcGE6OkV2ZW50AAoAIFRyZWFzdXJ5BADAAXxwYWxsZXRfdHJlYXN1cnk6OkV2ZW50PFJ1bnRpbWU+ABIAQENvbnZpY3Rpb25Wb3RpbmcEAE0BAaBwYWxsZXRfY29udmljdGlvbl92b3Rpbmc6OkV2ZW50PFJ1bnRpbWU+ABQAJFJlZmVyZW5kYQQAUQEBgHBhbGxldF9yZWZlcmVuZGE6OkV2ZW50PFJ1bnRpbWU+ABUAUEZlbGxvd3NoaXBDb2xsZWN0aXZlBABVBwE5AXBhbGxldF9yYW5rZWRfY29sbGVjdGl2ZTo6RXZlbnQ8UnVudGltZSwgcGFsbGV0X3JhbmtlZF9jb2xsZWN0aXZlOjoKSW5zdGFuY2UxPgAWAExGZWxsb3dzaGlwUmVmZXJlbmRhBABhBwH0cGFsbGV0X3JlZmVyZW5kYTo6RXZlbnQ8UnVudGltZSwgcGFsbGV0X3JlZmVyZW5kYTo6SW5zdGFuY2UyPgAXACRXaGl0ZWxpc3QEAGUHAYBwYWxsZXRfd2hpdGVsaXN0OjpFdmVudDxSdW50aW1lPgAsAChQYXJhbWV0ZXJzBAB5BwGEcGFsbGV0X3BhcmFtZXRlcnM6OkV2ZW50PFJ1bnRpbWU+AC4AGENsYWltcwQAkQcBWGNsYWltczo6RXZlbnQ8UnVudGltZT4AEwAcVXRpbGl0eQQAlQcBVHBhbGxldF91dGlsaXR5OjpFdmVudAAYABxTb2NpZXR5BACdBwF4cGFsbGV0X3NvY2lldHk6OkV2ZW50PFJ1bnRpbWU+ABoAIFJlY292ZXJ5BAClBwF8cGFsbGV0X3JlY292ZXJ5OjpFdmVudDxSdW50aW1lPgAbABxWZXN0aW5nBACpBwF4cGFsbGV0X3Zlc3Rpbmc6OkV2ZW50PFJ1bnRpbWU+ABwAJFNjaGVkdWxlcgQArQcBgHBhbGxldF9zY2hlZHVsZXI6OkV2ZW50PFJ1bnRpbWU+AB0AFFByb3h5BAC1BwFwcGFsbGV0X3Byb3h5OjpFdmVudDxSdW50aW1lPgAeACBNdWx0aXNpZwQAuQcBfHBhbGxldF9tdWx0aXNpZzo6RXZlbnQ8UnVudGltZT4AHwAgUHJlaW1hZ2UEAL0HAXxwYWxsZXRfcHJlaW1hZ2U6OkV2ZW50PFJ1bnRpbWU+ACAAIEJvdW50aWVzBADBBwF8cGFsbGV0X2JvdW50aWVzOjpFdmVudDxSdW50aW1lPgAjADRDaGlsZEJvdW50aWVzBADFBwGUcGFsbGV0X2NoaWxkX2JvdW50aWVzOjpFdmVudDxSdW50aW1lPgAoAGhFbGVjdGlvblByb3ZpZGVyTXVsdGlQaGFzZQQAyQcB0HBhbGxldF9lbGVjdGlvbl9wcm92aWRlcl9tdWx0aV9waGFzZTo6RXZlbnQ8UnVudGltZT4AJQAMTmlzBADZBwFocGFsbGV0X25pczo6RXZlbnQ8UnVudGltZT4AJgBYTmlzQ291bnRlcnBhcnRCYWxhbmNlcwQA3QcB7HBhbGxldF9iYWxhbmNlczo6RXZlbnQ8UnVudGltZSwgcGFsbGV0X2JhbGFuY2VzOjpJbnN0YW5jZTI+AC0AJFZvdGVyTGlzdAQA4QcB9HBhbGxldF9iYWdzX2xpc3Q6OkV2ZW50PFJ1bnRpbWUsIHBhbGxldF9iYWdzX2xpc3Q6Okluc3RhbmNlMT4AJwA8Tm9taW5hdGlvblBvb2xzBADlBwGccGFsbGV0X25vbWluYXRpb25fcG9vbHM6OkV2ZW50PFJ1bnRpbWU+ACkALEZhc3RVbnN0YWtlBADpBwGMcGFsbGV0X2Zhc3RfdW5zdGFrZTo6RXZlbnQ8UnVudGltZT4AKgA0UGFyYUluY2x1c2lvbgQA7QcBkHBhcmFjaGFpbnNfaW5jbHVzaW9uOjpFdmVudDxSdW50aW1lPgA1ABRQYXJhcwQA/QcBXHBhcmFjaGFpbnNfcGFyYXM6OkV2ZW50ADgAEEhybXAEAAEIAXxwYXJhY2hhaW5zX2hybXA6OkV2ZW50PFJ1bnRpbWU+ADwANFBhcmFzRGlzcHV0ZXMEAAUIAYxwYXJhY2hhaW5zX2Rpc3B1dGVzOjpFdmVudDxSdW50aW1lPgA+AGhPbkRlbWFuZEFzc2lnbm1lbnRQcm92aWRlcgQAEQgBtHBhcmFjaGFpbnNfYXNzaWduZXJfb25fZGVtYW5kOjpFdmVudDxSdW50aW1lPgBAACRSZWdpc3RyYXIEABUIAXxwYXJhc19yZWdpc3RyYXI6OkV2ZW50PFJ1bnRpbWU+AEYAFFNsb3RzBAAZCAFUc2xvdHM6OkV2ZW50PFJ1bnRpbWU+AEcAIEF1Y3Rpb25zBAAdCAFgYXVjdGlvbnM6OkV2ZW50PFJ1bnRpbWU+AEgAJENyb3dkbG9hbgQAIQgBZGNyb3dkbG9hbjo6RXZlbnQ8UnVudGltZT4ASQAgQ29yZXRpbWUEACUIAWBjb3JldGltZTo6RXZlbnQ8UnVudGltZT4ASgAkWGNtUGFsbGV0BAApCAFocGFsbGV0X3hjbTo6RXZlbnQ8UnVudGltZT4AYwAwTWVzc2FnZVF1ZXVlBAAxCAGQcGFsbGV0X21lc3NhZ2VfcXVldWU6OkV2ZW50PFJ1bnRpbWU+AGQAJEFzc2V0UmF0ZQQAOQgBhHBhbGxldF9hc3NldF9yYXRlOjpFdmVudDxSdW50aW1lPgBlAABYDDBmcmFtZV9zeXN0ZW0YcGFsbGV0FEV2ZW50BARUAAEcQEV4dHJpbnNpY1N1Y2Nlc3MEATRkaXNwYXRjaF9pbmZvXAEwRGlzcGF0Y2hJbmZvAAAEkEFuIGV4dHJpbnNpYyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LjxFeHRyaW5zaWNGYWlsZWQIAThkaXNwYXRjaF9lcnJvcmgBNERpc3BhdGNoRXJyb3IAATRkaXNwYXRjaF9pbmZvXAEwRGlzcGF0Y2hJbmZvAAEEUEFuIGV4dHJpbnNpYyBmYWlsZWQuLENvZGVVcGRhdGVkAAIEUGA6Y29kZWAgd2FzIHVwZGF0ZWQuKE5ld0FjY291bnQEARxhY2NvdW50AAEwVDo6QWNjb3VudElkAAMEaEEgbmV3IGFjY291bnQgd2FzIGNyZWF0ZWQuNEtpbGxlZEFjY291bnQEARxhY2NvdW50AAEwVDo6QWNjb3VudElkAAQEWEFuIGFjY291bnQgd2FzIHJlYXBlZC4gUmVtYXJrZWQIARhzZW5kZXIAATBUOjpBY2NvdW50SWQAARBoYXNoNAEcVDo6SGFzaAAFBHBPbiBvbi1jaGFpbiByZW1hcmsgaGFwcGVuZWQuRFVwZ3JhZGVBdXRob3JpemVkCAEkY29kZV9oYXNoNAEcVDo6SGFzaAABNGNoZWNrX3ZlcnNpb24gARBib29sAAYEaEFuIHVwZ3JhZGUgd2FzIGF1dGhvcml6ZWQuBHBFdmVudCBmb3IgdGhlIFN5c3RlbSBwYWxsZXQuXAw0ZnJhbWVfc3VwcG9ydCBkaXNwYXRjaDBEaXNwYXRjaEluZm8AAAwBGHdlaWdodCgBGFdlaWdodAABFGNsYXNzYAE0RGlzcGF0Y2hDbGFzcwABIHBheXNfZmVlZAEQUGF5cwAAYAw0ZnJhbWVfc3VwcG9ydCBkaXNwYXRjaDREaXNwYXRjaENsYXNzAAEMGE5vcm1hbAAAACxPcGVyYXRpb25hbAABACRNYW5kYXRvcnkAAgAAZAw0ZnJhbWVfc3VwcG9ydCBkaXNwYXRjaBBQYXlzAAEIDFllcwAAAAhObwABAABoCChzcF9ydW50aW1lNERpc3BhdGNoRXJyb3IAATgUT3RoZXIAAAAwQ2Fubm90TG9va3VwAAEAJEJhZE9yaWdpbgACABhNb2R1bGUEAGwBLE1vZHVsZUVycm9yAAMARENvbnN1bWVyUmVtYWluaW5nAAQALE5vUHJvdmlkZXJzAAUAQFRvb01hbnlDb25zdW1lcnMABgAUVG9rZW4EAHABKFRva2VuRXJyb3IABwAoQXJpdGhtZXRpYwQAdAE8QXJpdGhtZXRpY0Vycm9yAAgANFRyYW5zYWN0aW9uYWwEAHgBSFRyYW5zYWN0aW9uYWxFcnJvcgAJACRFeGhhdXN0ZWQACgAoQ29ycnVwdGlvbgALACxVbmF2YWlsYWJsZQAMADhSb290Tm90QWxsb3dlZAANAABsCChzcF9ydW50aW1lLE1vZHVsZUVycm9yAAAIARRpbmRleAgBCHU4AAEUZXJyb3JIAYxbdTg7IE1BWF9NT0RVTEVfRVJST1JfRU5DT0RFRF9TSVpFXQAAcAgoc3BfcnVudGltZShUb2tlbkVycm9yAAEoQEZ1bmRzVW5hdmFpbGFibGUAAAAwT25seVByb3ZpZGVyAAEAMEJlbG93TWluaW11bQACADBDYW5ub3RDcmVhdGUAAwAwVW5rbm93bkFzc2V0AAQAGEZyb3plbgAFACxVbnN1cHBvcnRlZAAGAEBDYW5ub3RDcmVhdGVIb2xkAAcANE5vdEV4cGVuZGFibGUACAAcQmxvY2tlZAAJAAB0CDRzcF9hcml0aG1ldGljPEFyaXRobWV0aWNFcnJvcgABDCRVbmRlcmZsb3cAAAAgT3ZlcmZsb3cAAQA4RGl2aXNpb25CeVplcm8AAgAAeAgoc3BfcnVudGltZUhUcmFuc2FjdGlvbmFsRXJyb3IAAQgwTGltaXRSZWFjaGVkAAAAHE5vTGF5ZXIAAQAAfAw4cGFsbGV0X2luZGljZXMYcGFsbGV0FEV2ZW50BARUAAEMNEluZGV4QXNzaWduZWQIAQx3aG8AATBUOjpBY2NvdW50SWQAARRpbmRleBABPFQ6OkFjY291bnRJbmRleAAABHRBIGFjY291bnQgaW5kZXggd2FzIGFzc2lnbmVkLihJbmRleEZyZWVkBAEUaW5kZXgQATxUOjpBY2NvdW50SW5kZXgAAQS8QSBhY2NvdW50IGluZGV4IGhhcyBiZWVuIGZyZWVkIHVwICh1bmFzc2lnbmVkKS4sSW5kZXhGcm96ZW4IARRpbmRleBABPFQ6OkFjY291bnRJbmRleAABDHdobwABMFQ6OkFjY291bnRJZAACBOhBIGFjY291bnQgaW5kZXggaGFzIGJlZW4gZnJvemVuIHRvIGl0cyBjdXJyZW50IGFjY291bnQgSUQuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0gAw8cGFsbGV0X2JhbGFuY2VzGHBhbGxldBRFdmVudAgEVAAESQABWBxFbmRvd2VkCAEcYWNjb3VudAABMFQ6OkFjY291bnRJZAABMGZyZWVfYmFsYW5jZRgBKFQ6OkJhbGFuY2UAAAS4QW4gYWNjb3VudCB3YXMgY3JlYXRlZCB3aXRoIHNvbWUgZnJlZSBiYWxhbmNlLiBEdXN0TG9zdAgBHGFjY291bnQAATBUOjpBY2NvdW50SWQAARhhbW91bnQYAShUOjpCYWxhbmNlAAEIPQFBbiBhY2NvdW50IHdhcyByZW1vdmVkIHdob3NlIGJhbGFuY2Ugd2FzIG5vbi16ZXJvIGJ1dCBiZWxvdyBFeGlzdGVudGlhbERlcG9zaXQseHJlc3VsdGluZyBpbiBhbiBvdXRyaWdodCBsb3NzLiBUcmFuc2ZlcgwBEGZyb20AATBUOjpBY2NvdW50SWQAAQh0bwABMFQ6OkFjY291bnRJZAABGGFtb3VudBgBKFQ6OkJhbGFuY2UAAgRMVHJhbnNmZXIgc3VjY2VlZGVkLihCYWxhbmNlU2V0CAEMd2hvAAEwVDo6QWNjb3VudElkAAEQZnJlZRgBKFQ6OkJhbGFuY2UAAwRoQSBiYWxhbmNlIHdhcyBzZXQgYnkgcm9vdC4gUmVzZXJ2ZWQIAQx3aG8AATBUOjpBY2NvdW50SWQAARhhbW91bnQYAShUOjpCYWxhbmNlAAQE4FNvbWUgYmFsYW5jZSB3YXMgcmVzZXJ2ZWQgKG1vdmVkIGZyb20gZnJlZSB0byByZXNlcnZlZCkuKFVucmVzZXJ2ZWQIAQx3aG8AATBUOjpBY2NvdW50SWQAARhhbW91bnQYAShUOjpCYWxhbmNlAAUE6FNvbWUgYmFsYW5jZSB3YXMgdW5yZXNlcnZlZCAobW92ZWQgZnJvbSByZXNlcnZlZCB0byBmcmVlKS5IUmVzZXJ2ZVJlcGF0cmlhdGVkEAEQZnJvbQABMFQ6OkFjY291bnRJZAABCHRvAAEwVDo6QWNjb3VudElkAAEYYW1vdW50GAEoVDo6QmFsYW5jZQABSGRlc3RpbmF0aW9uX3N0YXR1c4QBGFN0YXR1cwAGCE0BU29tZSBiYWxhbmNlIHdhcyBtb3ZlZCBmcm9tIHRoZSByZXNlcnZlIG9mIHRoZSBmaXJzdCBhY2NvdW50IHRvIHRoZSBzZWNvbmQgYWNjb3VudC7YRmluYWwgYXJndW1lbnQgaW5kaWNhdGVzIHRoZSBkZXN0aW5hdGlvbiBiYWxhbmNlIHR5cGUuHERlcG9zaXQIAQx3aG8AATBUOjpBY2NvdW50SWQAARhhbW91bnQYAShUOjpCYWxhbmNlAAcE2FNvbWUgYW1vdW50IHdhcyBkZXBvc2l0ZWQgKGUuZy4gZm9yIHRyYW5zYWN0aW9uIGZlZXMpLiBXaXRoZHJhdwgBDHdobwABMFQ6OkFjY291bnRJZAABGGFtb3VudBgBKFQ6OkJhbGFuY2UACAQdAVNvbWUgYW1vdW50IHdhcyB3aXRoZHJhd24gZnJvbSB0aGUgYWNjb3VudCAoZS5nLiBmb3IgdHJhbnNhY3Rpb24gZmVlcykuHFNsYXNoZWQIAQx3aG8AATBUOjpBY2NvdW50SWQAARhhbW91bnQYAShUOjpCYWxhbmNlAAkEAQFTb21lIGFtb3VudCB3YXMgcmVtb3ZlZCBmcm9tIHRoZSBhY2NvdW50IChlLmcuIGZvciBtaXNiZWhhdmlvcikuGE1pbnRlZAgBDHdobwABMFQ6OkFjY291bnRJZAABGGFtb3VudBgBKFQ6OkJhbGFuY2UACgScU29tZSBhbW91bnQgd2FzIG1pbnRlZCBpbnRvIGFuIGFjY291bnQuGEJ1cm5lZAgBDHdobwABMFQ6OkFjY291bnRJZAABGGFtb3VudBgBKFQ6OkJhbGFuY2UACwScU29tZSBhbW91bnQgd2FzIGJ1cm5lZCBmcm9tIGFuIGFjY291bnQuJFN1c3BlbmRlZAgBDHdobwABMFQ6OkFjY291bnRJZAABGGFtb3VudBgBKFQ6OkJhbGFuY2UADAQVAVNvbWUgYW1vdW50IHdhcyBzdXNwZW5kZWQgZnJvbSBhbiBhY2NvdW50IChpdCBjYW4gYmUgcmVzdG9yZWQgbGF0ZXIpLiBSZXN0b3JlZAgBDHdobwABMFQ6OkFjY291bnRJZAABGGFtb3VudBgBKFQ6OkJhbGFuY2UADQSkU29tZSBhbW91bnQgd2FzIHJlc3RvcmVkIGludG8gYW4gYWNjb3VudC4gVXBncmFkZWQEAQx3aG8AATBUOjpBY2NvdW50SWQADgRgQW4gYWNjb3VudCB3YXMgdXBncmFkZWQuGElzc3VlZAQBGGFtb3VudBgBKFQ6OkJhbGFuY2UADwQtAVRvdGFsIGlzc3VhbmNlIHdhcyBpbmNyZWFzZWQgYnkgYGFtb3VudGAsIGNyZWF0aW5nIGEgY3JlZGl0IHRvIGJlIGJhbGFuY2VkLiRSZXNjaW5kZWQEARhhbW91bnQYAShUOjpCYWxhbmNlABAEJQFUb3RhbCBpc3N1YW5jZSB3YXMgZGVjcmVhc2VkIGJ5IGBhbW91bnRgLCBjcmVhdGluZyBhIGRlYnQgdG8gYmUgYmFsYW5jZWQuGExvY2tlZAgBDHdobwABMFQ6OkFjY291bnRJZAABGGFtb3VudBgBKFQ6OkJhbGFuY2UAEQRgU29tZSBiYWxhbmNlIHdhcyBsb2NrZWQuIFVubG9ja2VkCAEMd2hvAAEwVDo6QWNjb3VudElkAAEYYW1vdW50GAEoVDo6QmFsYW5jZQASBGhTb21lIGJhbGFuY2Ugd2FzIHVubG9ja2VkLhhGcm96ZW4IAQx3aG8AATBUOjpBY2NvdW50SWQAARhhbW91bnQYAShUOjpCYWxhbmNlABMEYFNvbWUgYmFsYW5jZSB3YXMgZnJvemVuLhhUaGF3ZWQIAQx3aG8AATBUOjpBY2NvdW50SWQAARhhbW91bnQYAShUOjpCYWxhbmNlABQEYFNvbWUgYmFsYW5jZSB3YXMgdGhhd2VkLkxUb3RhbElzc3VhbmNlRm9yY2VkCAEMb2xkGAEoVDo6QmFsYW5jZQABDG5ldxgBKFQ6OkJhbGFuY2UAFQSsVGhlIGBUb3RhbElzc3VhbmNlYCB3YXMgZm9yY2VmdWxseSBjaGFuZ2VkLgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldIQUNGZyYW1lX3N1cHBvcnQYdHJhaXRzGHRva2VucxBtaXNjNEJhbGFuY2VTdGF0dXMAAQgQRnJlZQAAACBSZXNlcnZlZAABAACIDGhwYWxsZXRfdHJhbnNhY3Rpb25fcGF5bWVudBhwYWxsZXQURXZlbnQEBFQAAQRIVHJhbnNhY3Rpb25GZWVQYWlkDAEMd2hvAAEwVDo6QWNjb3VudElkAAEoYWN0dWFsX2ZlZRgBMEJhbGFuY2VPZjxUPgABDHRpcBgBMEJhbGFuY2VPZjxUPgAACFkBQSB0cmFuc2FjdGlvbiBmZWUgYGFjdHVhbF9mZWVgLCBvZiB3aGljaCBgdGlwYCB3YXMgYWRkZWQgdG8gdGhlIG1pbmltdW0gaW5jbHVzaW9uIGZlZSxcaGFzIGJlZW4gcGFpZCBieSBgd2hvYC4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXSMEDhwYWxsZXRfc3Rha2luZxhwYWxsZXQYcGFsbGV0FEV2ZW50BARUAAFIHEVyYVBhaWQMASRlcmFfaW5kZXgQASBFcmFJbmRleAABQHZhbGlkYXRvcl9wYXlvdXQYATBCYWxhbmNlT2Y8VD4AASRyZW1haW5kZXIYATBCYWxhbmNlT2Y8VD4AAAhVAVRoZSBlcmEgcGF5b3V0IGhhcyBiZWVuIHNldDsgdGhlIGZpcnN0IGJhbGFuY2UgaXMgdGhlIHZhbGlkYXRvci1wYXlvdXQ7IHRoZSBzZWNvbmQgaXPAdGhlIHJlbWFpbmRlciBmcm9tIHRoZSBtYXhpbXVtIGFtb3VudCBvZiByZXdhcmQuIFJld2FyZGVkDAEUc3Rhc2gAATBUOjpBY2NvdW50SWQAARBkZXN0kAF8UmV3YXJkRGVzdGluYXRpb248VDo6QWNjb3VudElkPgABGGFtb3VudBgBMEJhbGFuY2VPZjxUPgABBA0BVGhlIG5vbWluYXRvciBoYXMgYmVlbiByZXdhcmRlZCBieSB0aGlzIGFtb3VudCB0byB0aGlzIGRlc3RpbmF0aW9uLhxTbGFzaGVkCAEYc3Rha2VyAAEwVDo6QWNjb3VudElkAAEYYW1vdW50GAEwQmFsYW5jZU9mPFQ+AAIEHQFBIHN0YWtlciAodmFsaWRhdG9yIG9yIG5vbWluYXRvcikgaGFzIGJlZW4gc2xhc2hlZCBieSB0aGUgZ2l2ZW4gYW1vdW50LjRTbGFzaFJlcG9ydGVkDAEkdmFsaWRhdG9yAAEwVDo6QWNjb3VudElkAAEgZnJhY3Rpb26UARxQZXJiaWxsAAEkc2xhc2hfZXJhEAEgRXJhSW5kZXgAAwhZAUEgc2xhc2ggZm9yIHRoZSBnaXZlbiB2YWxpZGF0b3IsIGZvciB0aGUgZ2l2ZW4gcGVyY2VudGFnZSBvZiB0aGVpciBzdGFrZSwgYXQgdGhlIGdpdmVuVGVyYSBhcyBiZWVuIHJlcG9ydGVkLmhPbGRTbGFzaGluZ1JlcG9ydERpc2NhcmRlZAQBNHNlc3Npb25faW5kZXgQATBTZXNzaW9uSW5kZXgABAgZAUFuIG9sZCBzbGFzaGluZyByZXBvcnQgZnJvbSBhIHByaW9yIGVyYSB3YXMgZGlzY2FyZGVkIGJlY2F1c2UgaXQgY291bGREbm90IGJlIHByb2Nlc3NlZC44U3Rha2Vyc0VsZWN0ZWQABQSEQSBuZXcgc2V0IG9mIHN0YWtlcnMgd2FzIGVsZWN0ZWQuGEJvbmRlZAgBFHN0YXNoAAEwVDo6QWNjb3VudElkAAEYYW1vdW50GAEwQmFsYW5jZU9mPFQ+AAYQ0EFuIGFjY291bnQgaGFzIGJvbmRlZCB0aGlzIGFtb3VudC4gXFtzdGFzaCwgYW1vdW50XF0ATQFOT1RFOiBUaGlzIGV2ZW50IGlzIG9ubHkgZW1pdHRlZCB3aGVuIGZ1bmRzIGFyZSBib25kZWQgdmlhIGEgZGlzcGF0Y2hhYmxlLiBOb3RhYmx5LCEBaXQgd2lsbCBub3QgYmUgZW1pdHRlZCBmb3Igc3Rha2luZyByZXdhcmRzIHdoZW4gdGhleSBhcmUgYWRkZWQgdG8gc3Rha2UuIFVuYm9uZGVkCAEUc3Rhc2gAATBUOjpBY2NvdW50SWQAARhhbW91bnQYATBCYWxhbmNlT2Y8VD4ABwSQQW4gYWNjb3VudCBoYXMgdW5ib25kZWQgdGhpcyBhbW91bnQuJFdpdGhkcmF3bggBFHN0YXNoAAEwVDo6QWNjb3VudElkAAEYYW1vdW50GAEwQmFsYW5jZU9mPFQ+AAgIWQFBbiBhY2NvdW50IGhhcyBjYWxsZWQgYHdpdGhkcmF3X3VuYm9uZGVkYCBhbmQgcmVtb3ZlZCB1bmJvbmRpbmcgY2h1bmtzIHdvcnRoIGBCYWxhbmNlYGRmcm9tIHRoZSB1bmxvY2tpbmcgcXVldWUuGEtpY2tlZAgBJG5vbWluYXRvcgABMFQ6OkFjY291bnRJZAABFHN0YXNoAAEwVDo6QWNjb3VudElkAAkEtEEgbm9taW5hdG9yIGhhcyBiZWVuIGtpY2tlZCBmcm9tIGEgdmFsaWRhdG9yLlRTdGFraW5nRWxlY3Rpb25GYWlsZWQACgSsVGhlIGVsZWN0aW9uIGZhaWxlZC4gTm8gbmV3IGVyYSBpcyBwbGFubmVkLhxDaGlsbGVkBAEUc3Rhc2gAATBUOjpBY2NvdW50SWQACwQhAUFuIGFjY291bnQgaGFzIHN0b3BwZWQgcGFydGljaXBhdGluZyBhcyBlaXRoZXIgYSB2YWxpZGF0b3Igb3Igbm9taW5hdG9yLjRQYXlvdXRTdGFydGVkCAEkZXJhX2luZGV4EAEgRXJhSW5kZXgAATx2YWxpZGF0b3Jfc3Rhc2gAATBUOjpBY2NvdW50SWQADASYVGhlIHN0YWtlcnMnIHJld2FyZHMgYXJlIGdldHRpbmcgcGFpZC5EVmFsaWRhdG9yUHJlZnNTZXQIARRzdGFzaAABMFQ6OkFjY291bnRJZAABFHByZWZzmAE4VmFsaWRhdG9yUHJlZnMADQSYQSB2YWxpZGF0b3IgaGFzIHNldCB0aGVpciBwcmVmZXJlbmNlcy5oU25hcHNob3RWb3RlcnNTaXplRXhjZWVkZWQEARBzaXplEAEMdTMyAA4EaFZvdGVycyBzaXplIGxpbWl0IHJlYWNoZWQubFNuYXBzaG90VGFyZ2V0c1NpemVFeGNlZWRlZAQBEHNpemUQAQx1MzIADwRsVGFyZ2V0cyBzaXplIGxpbWl0IHJlYWNoZWQuIEZvcmNlRXJhBAEQbW9kZaABHEZvcmNpbmcAEAR0QSBuZXcgZm9yY2UgZXJhIG1vZGUgd2FzIHNldC5kQ29udHJvbGxlckJhdGNoRGVwcmVjYXRlZAQBIGZhaWx1cmVzEAEMdTMyABEEpFJlcG9ydCBvZiBhIGNvbnRyb2xsZXIgYmF0Y2ggZGVwcmVjYXRpb24uBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0kAg4cGFsbGV0X3N0YWtpbmdEUmV3YXJkRGVzdGluYXRpb24EJEFjY291bnRJZAEAARQYU3Rha2VkAAAAFFN0YXNoAAEAKENvbnRyb2xsZXIAAgAcQWNjb3VudAQAAAEkQWNjb3VudElkAAMAEE5vbmUABAAAlAw0c3BfYXJpdGhtZXRpYyhwZXJfdGhpbmdzHFBlcmJpbGwAAAQAEAEMdTMyAACYCDhwYWxsZXRfc3Rha2luZzhWYWxpZGF0b3JQcmVmcwAACAEoY29tbWlzc2lvbpwBHFBlcmJpbGwAARxibG9ja2VkIAEQYm9vbAAAnAAABpQAoAg4cGFsbGV0X3N0YWtpbmccRm9yY2luZwABEChOb3RGb3JjaW5nAAAAIEZvcmNlTmV3AAEAJEZvcmNlTm9uZQACACxGb3JjZUFsd2F5cwADAACkDDxwYWxsZXRfb2ZmZW5jZXMYcGFsbGV0FEV2ZW50AAEEHE9mZmVuY2UIARBraW5kqAEQS2luZAABIHRpbWVzbG90OAE4T3BhcXVlVGltZVNsb3QAAAxRAVRoZXJlIGlzIGFuIG9mZmVuY2UgcmVwb3J0ZWQgb2YgdGhlIGdpdmVuIGBraW5kYCBoYXBwZW5lZCBhdCB0aGUgYHNlc3Npb25faW5kZXhgIGFuZDUBKGtpbmQtc3BlY2lmaWMpIHRpbWUgc2xvdC4gVGhpcyBldmVudCBpcyBub3QgZGVwb3NpdGVkIGZvciBkdXBsaWNhdGUgc2xhc2hlcy5MXFtraW5kLCB0aW1lc2xvdFxdLgQwRXZlbnRzIHR5cGUuqAAAAxAAAAAIAKwMOHBhbGxldF9zZXNzaW9uGHBhbGxldBRFdmVudAABBChOZXdTZXNzaW9uBAE0c2Vzc2lvbl9pbmRleBABMFNlc3Npb25JbmRleAAACDkBTmV3IHNlc3Npb24gaGFzIGhhcHBlbmVkLiBOb3RlIHRoYXQgdGhlIGFyZ3VtZW50IGlzIHRoZSBzZXNzaW9uIGluZGV4LCBub3QgdGhlnGJsb2NrIG51bWJlciBhcyB0aGUgdHlwZSBtaWdodCBzdWdnZXN0LgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldLAMOHBhbGxldF9ncmFuZHBhGHBhbGxldBRFdmVudAABDDhOZXdBdXRob3JpdGllcwQBNGF1dGhvcml0eV9zZXS0ATRBdXRob3JpdHlMaXN0AAAEjE5ldyBhdXRob3JpdHkgc2V0IGhhcyBiZWVuIGFwcGxpZWQuGFBhdXNlZAABBJhDdXJyZW50IGF1dGhvcml0eSBzZXQgaGFzIGJlZW4gcGF1c2VkLhxSZXN1bWVkAAIEnEN1cnJlbnQgYXV0aG9yaXR5IHNldCBoYXMgYmVlbiByZXN1bWVkLgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldLQAAAK4ALgAAAQIvDAAvAxQc3BfY29uc2Vuc3VzX2dyYW5kcGEMYXBwGFB1YmxpYwAABAAEATxlZDI1NTE5OjpQdWJsaWMAAMAMPHBhbGxldF90cmVhc3VyeRhwYWxsZXQURXZlbnQIBFQABEkAATAgU3BlbmRpbmcEAUBidWRnZXRfcmVtYWluaW5nGAE8QmFsYW5jZU9mPFQsIEk+AAAE5FdlIGhhdmUgZW5kZWQgYSBzcGVuZCBwZXJpb2QgYW5kIHdpbGwgbm93IGFsbG9jYXRlIGZ1bmRzLhxBd2FyZGVkDAE4cHJvcG9zYWxfaW5kZXgQATRQcm9wb3NhbEluZGV4AAEUYXdhcmQYATxCYWxhbmNlT2Y8VCwgST4AARxhY2NvdW50AAEwVDo6QWNjb3VudElkAAEEfFNvbWUgZnVuZHMgaGF2ZSBiZWVuIGFsbG9jYXRlZC4UQnVybnQEASxidXJudF9mdW5kcxgBPEJhbGFuY2VPZjxULCBJPgACBIhTb21lIG9mIG91ciBmdW5kcyBoYXZlIGJlZW4gYnVybnQuIFJvbGxvdmVyBAFAcm9sbG92ZXJfYmFsYW5jZRgBPEJhbGFuY2VPZjxULCBJPgADBC0BU3BlbmRpbmcgaGFzIGZpbmlzaGVkOyB0aGlzIGlzIHRoZSBhbW91bnQgdGhhdCByb2xscyBvdmVyIHVudGlsIG5leHQgc3BlbmQuHERlcG9zaXQEARR2YWx1ZRgBPEJhbGFuY2VPZjxULCBJPgAEBHxTb21lIGZ1bmRzIGhhdmUgYmVlbiBkZXBvc2l0ZWQuNFNwZW5kQXBwcm92ZWQMAThwcm9wb3NhbF9pbmRleBABNFByb3Bvc2FsSW5kZXgAARhhbW91bnQYATxCYWxhbmNlT2Y8VCwgST4AASxiZW5lZmljaWFyeQABMFQ6OkFjY291bnRJZAAFBJxBIG5ldyBzcGVuZCBwcm9wb3NhbCBoYXMgYmVlbiBhcHByb3ZlZC48VXBkYXRlZEluYWN0aXZlCAEscmVhY3RpdmF0ZWQYATxCYWxhbmNlT2Y8VCwgST4AASxkZWFjdGl2YXRlZBgBPEJhbGFuY2VPZjxULCBJPgAGBMxUaGUgaW5hY3RpdmUgZnVuZHMgb2YgdGhlIHBhbGxldCBoYXZlIGJlZW4gdXBkYXRlZC5IQXNzZXRTcGVuZEFwcHJvdmVkGAEUaW5kZXgQAShTcGVuZEluZGV4AAEoYXNzZXRfa2luZMQBMFQ6OkFzc2V0S2luZAABGGFtb3VudBgBUEFzc2V0QmFsYW5jZU9mPFQsIEk+AAEsYmVuZWZpY2lhcnktAQE4VDo6QmVuZWZpY2lhcnkAASh2YWxpZF9mcm9tEAFEQmxvY2tOdW1iZXJGb3I8VD4AASRleHBpcmVfYXQQAURCbG9ja051bWJlckZvcjxUPgAHBLRBIG5ldyBhc3NldCBzcGVuZCBwcm9wb3NhbCBoYXMgYmVlbiBhcHByb3ZlZC5AQXNzZXRTcGVuZFZvaWRlZAQBFGluZGV4EAEoU3BlbmRJbmRleAAIBHRBbiBhcHByb3ZlZCBzcGVuZCB3YXMgdm9pZGVkLhBQYWlkCAEUaW5kZXgQAShTcGVuZEluZGV4AAEocGF5bWVudF9pZDABZDxUOjpQYXltYXN0ZXIgYXMgUGF5Pjo6SWQACQRMQSBwYXltZW50IGhhcHBlbmVkLjRQYXltZW50RmFpbGVkCAEUaW5kZXgQAShTcGVuZEluZGV4AAEocGF5bWVudF9pZDABZDxUOjpQYXltYXN0ZXIgYXMgUGF5Pjo6SWQACgSQQSBwYXltZW50IGZhaWxlZCBhbmQgY2FuIGJlIHJldHJpZWQuOFNwZW5kUHJvY2Vzc2VkBAEUaW5kZXgQAShTcGVuZEluZGV4AAsITQFBIHNwZW5kIHdhcyBwcm9jZXNzZWQgYW5kIHJlbW92ZWQgZnJvbSB0aGUgc3RvcmFnZS4gSXQgbWlnaHQgaGF2ZSBiZWVuIHN1Y2Nlc3NmdWxseXBwYWlkIG9yIGl0IG1heSBoYXZlIGV4cGlyZWQuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0xAxccG9sa2Fkb3RfcnVudGltZV9jb21tb24UaW1wbHNcVmVyc2lvbmVkTG9jYXRhYmxlQXNzZXQAAQgIVjMIASBsb2NhdGlvbsgBRHhjbTo6djM6OkxvY2F0aW9uAAEgYXNzZXRfaWTwAUB4Y206OnYzOjpBc3NldElkAAMACFY0CAEgbG9jYXRpb270AUR4Y206OnY0OjpMb2NhdGlvbgABIGFzc2V0X2lkKQEBQHhjbTo6djQ6OkFzc2V0SWQABAAAyBAsc3RhZ2luZ194Y20IdjM0bXVsdGlsb2NhdGlvbjRNdWx0aUxvY2F0aW9uAAAIARxwYXJlbnRzCAEIdTgAASBpbnRlcmlvcswBJEp1bmN0aW9ucwAAzBAMeGNtCHYzJGp1bmN0aW9ucyRKdW5jdGlvbnMAASQQSGVyZQAAAAhYMQQA0AEgSnVuY3Rpb24AAQAIWDIIANABIEp1bmN0aW9uAADQASBKdW5jdGlvbgACAAhYMwwA0AEgSnVuY3Rpb24AANABIEp1bmN0aW9uAADQASBKdW5jdGlvbgADAAhYNBAA0AEgSnVuY3Rpb24AANABIEp1bmN0aW9uAADQASBKdW5jdGlvbgAA0AEgSnVuY3Rpb24ABAAIWDUUANABIEp1bmN0aW9uAADQASBKdW5jdGlvbgAA0AEgSnVuY3Rpb24AANABIEp1bmN0aW9uAADQASBKdW5jdGlvbgAFAAhYNhgA0AEgSnVuY3Rpb24AANABIEp1bmN0aW9uAADQASBKdW5jdGlvbgAA0AEgSnVuY3Rpb24AANABIEp1bmN0aW9uAADQASBKdW5jdGlvbgAGAAhYNxwA0AEgSnVuY3Rpb24AANABIEp1bmN0aW9uAADQASBKdW5jdGlvbgAA0AEgSnVuY3Rpb24AANABIEp1bmN0aW9uAADQASBKdW5jdGlvbgAA0AEgSnVuY3Rpb24ABwAIWDggANABIEp1bmN0aW9uAADQASBKdW5jdGlvbgAA0AEgSnVuY3Rpb24AANABIEp1bmN0aW9uAADQASBKdW5jdGlvbgAA0AEgSnVuY3Rpb24AANABIEp1bmN0aW9uAADQASBKdW5jdGlvbgAIAADQEAx4Y20IdjMganVuY3Rpb24gSnVuY3Rpb24AASgkUGFyYWNoYWluBADUAQx1MzIAAAAsQWNjb3VudElkMzIIARxuZXR3b3Jr2AFET3B0aW9uPE5ldHdvcmtJZD4AAQhpZAQBIFt1ODsgMzJdAAEAOEFjY291bnRJbmRleDY0CAEcbmV0d29ya9gBRE9wdGlvbjxOZXR3b3JrSWQ+AAEUaW5kZXgsAQx1NjQAAgAwQWNjb3VudEtleTIwCAEcbmV0d29ya9gBRE9wdGlvbjxOZXR3b3JrSWQ+AAEMa2V54AEgW3U4OyAyMF0AAwA4UGFsbGV0SW5zdGFuY2UEAAgBCHU4AAQAMEdlbmVyYWxJbmRleAQA5AEQdTEyOAAFAChHZW5lcmFsS2V5CAEYbGVuZ3RoCAEIdTgAARBkYXRhBAEgW3U4OyAzMl0ABgAkT25seUNoaWxkAAcAJFBsdXJhbGl0eQgBCGlk6AEYQm9keUlkAAEQcGFydOwBIEJvZHlQYXJ0AAgAPEdsb2JhbENvbnNlbnN1cwQA3AEkTmV0d29ya0lkAAkAANQAAAYQANgEGE9wdGlvbgQEVAHcAQgQTm9uZQAAABBTb21lBADcAAABAADcEAx4Y20IdjMganVuY3Rpb24kTmV0d29ya0lkAAEsJEJ5R2VuZXNpcwQABAEgW3U4OyAzMl0AAAAYQnlGb3JrCAEwYmxvY2tfbnVtYmVyMAEMdTY0AAEoYmxvY2tfaGFzaAQBIFt1ODsgMzJdAAEAIFBvbGthZG90AAIAGEt1c2FtYQADABxXZXN0ZW5kAAQAGFJvY29jbwAFABhXb2NvY28ABgAgRXRoZXJldW0EASBjaGFpbl9pZCwBDHU2NAAHACxCaXRjb2luQ29yZQAIACxCaXRjb2luQ2FzaAAJAEBQb2xrYWRvdEJ1bGxldGluAAoAAOAAAAMUAAAACADkAAAGGADoEAx4Y20IdjMganVuY3Rpb24YQm9keUlkAAEoEFVuaXQAAAAcTW9uaWtlcgQASAEcW3U4OyA0XQABABRJbmRleAQA1AEMdTMyAAIAJEV4ZWN1dGl2ZQADACRUZWNobmljYWwABAAsTGVnaXNsYXRpdmUABQAgSnVkaWNpYWwABgAcRGVmZW5zZQAHADhBZG1pbmlzdHJhdGlvbgAIACBUcmVhc3VyeQAJAADsEAx4Y20IdjMganVuY3Rpb24gQm9keVBhcnQAARQUVm9pY2UAAAAcTWVtYmVycwQBFGNvdW501AEMdTMyAAEAIEZyYWN0aW9uCAEMbm9t1AEMdTMyAAEUZGVub23UAQx1MzIAAgBEQXRMZWFzdFByb3BvcnRpb24IAQxub23UAQx1MzIAARRkZW5vbdQBDHUzMgADAEhNb3JlVGhhblByb3BvcnRpb24IAQxub23UAQx1MzIAARRkZW5vbdQBDHUzMgAEAADwEAx4Y20IdjMobXVsdGlhc3NldBxBc3NldElkAAEIIENvbmNyZXRlBADIATRNdWx0aUxvY2F0aW9uAAAAIEFic3RyYWN0BAAEASBbdTg7IDMyXQABAAD0ECxzdGFnaW5nX3hjbQh2NCBsb2NhdGlvbiBMb2NhdGlvbgAACAEccGFyZW50cwgBCHU4AAEgaW50ZXJpb3L4ASRKdW5jdGlvbnMAAPgQLHN0YWdpbmdfeGNtCHY0JGp1bmN0aW9ucyRKdW5jdGlvbnMAASQQSGVyZQAAAAhYMQQA/AFIQXJjPFtKdW5jdGlvbjsgMV0+AAEACFgyBAANAQFIQXJjPFtKdW5jdGlvbjsgMl0+AAIACFgzBAARAQFIQXJjPFtKdW5jdGlvbjsgM10+AAMACFg0BAAVAQFIQXJjPFtKdW5jdGlvbjsgNF0+AAQACFg1BAAZAQFIQXJjPFtKdW5jdGlvbjsgNV0+AAUACFg2BAAdAQFIQXJjPFtKdW5jdGlvbjsgNl0+AAYACFg3BAAhAQFIQXJjPFtKdW5jdGlvbjsgN10+AAcACFg4BAAlAQFIQXJjPFtKdW5jdGlvbjsgOF0+AAgAAPwAAAMBAAAAAQEAAQEQLHN0YWdpbmdfeGNtCHY0IGp1bmN0aW9uIEp1bmN0aW9uAAEoJFBhcmFjaGFpbgQA1AEMdTMyAAAALEFjY291bnRJZDMyCAEcbmV0d29yawUBAURPcHRpb248TmV0d29ya0lkPgABCGlkBAEgW3U4OyAzMl0AAQA4QWNjb3VudEluZGV4NjQIARxuZXR3b3JrBQEBRE9wdGlvbjxOZXR3b3JrSWQ+AAEUaW5kZXgsAQx1NjQAAgAwQWNjb3VudEtleTIwCAEcbmV0d29yawUBAURPcHRpb248TmV0d29ya0lkPgABDGtleeABIFt1ODsgMjBdAAMAOFBhbGxldEluc3RhbmNlBAAIAQh1OAAEADBHZW5lcmFsSW5kZXgEAOQBEHUxMjgABQAoR2VuZXJhbEtleQgBGGxlbmd0aAgBCHU4AAEQZGF0YQQBIFt1ODsgMzJdAAYAJE9ubHlDaGlsZAAHACRQbHVyYWxpdHkIAQhpZOgBGEJvZHlJZAABEHBhcnTsASBCb2R5UGFydAAIADxHbG9iYWxDb25zZW5zdXMEAAkBASROZXR3b3JrSWQACQAABQEEGE9wdGlvbgQEVAEJAQEIEE5vbmUAAAAQU29tZQQACQEAAAEAAAkBECxzdGFnaW5nX3hjbQh2NCBqdW5jdGlvbiROZXR3b3JrSWQAASwkQnlHZW5lc2lzBAAEASBbdTg7IDMyXQAAABhCeUZvcmsIATBibG9ja19udW1iZXIwAQx1NjQAAShibG9ja19oYXNoBAEgW3U4OyAzMl0AAQAgUG9sa2Fkb3QAAgAYS3VzYW1hAAMAHFdlc3RlbmQABAAYUm9jb2NvAAUAGFdvY29jbwAGACBFdGhlcmV1bQQBIGNoYWluX2lkLAEMdTY0AAcALEJpdGNvaW5Db3JlAAgALEJpdGNvaW5DYXNoAAkAQFBvbGthZG90QnVsbGV0aW4ACgAADQEAAAMCAAAAAQEAEQEAAAMDAAAAAQEAFQEAAAMEAAAAAQEAGQEAAAMFAAAAAQEAHQEAAAMGAAAAAQEAIQEAAAMHAAAAAQEAJQEAAAMIAAAAAQEAKQEQLHN0YWdpbmdfeGNtCHY0FGFzc2V0HEFzc2V0SWQAAAQA9AEgTG9jYXRpb24AAC0BCAx4Y21EVmVyc2lvbmVkTG9jYXRpb24AAQwIVjIEADEBAUR2Mjo6TXVsdGlMb2NhdGlvbgABAAhWMwQAyAFEdjM6Ok11bHRpTG9jYXRpb24AAwAIVjQEAPQBMHY0OjpMb2NhdGlvbgAEAAAxARAMeGNtCHYyNG11bHRpbG9jYXRpb240TXVsdGlMb2NhdGlvbgAACAEccGFyZW50cwgBCHU4AAEgaW50ZXJpb3I1AQEkSnVuY3Rpb25zAAA1ARAMeGNtCHYyNG11bHRpbG9jYXRpb24kSnVuY3Rpb25zAAEkEEhlcmUAAAAIWDEEADkBASBKdW5jdGlvbgABAAhYMggAOQEBIEp1bmN0aW9uAAA5AQEgSnVuY3Rpb24AAgAIWDMMADkBASBKdW5jdGlvbgAAOQEBIEp1bmN0aW9uAAA5AQEgSnVuY3Rpb24AAwAIWDQQADkBASBKdW5jdGlvbgAAOQEBIEp1bmN0aW9uAAA5AQEgSnVuY3Rpb24AADkBASBKdW5jdGlvbgAEAAhYNRQAOQEBIEp1bmN0aW9uAAA5AQEgSnVuY3Rpb24AADkBASBKdW5jdGlvbgAAOQEBIEp1bmN0aW9uAAA5AQEgSnVuY3Rpb24ABQAIWDYYADkBASBKdW5jdGlvbgAAOQEBIEp1bmN0aW9uAAA5AQEgSnVuY3Rpb24AADkBASBKdW5jdGlvbgAAOQEBIEp1bmN0aW9uAAA5AQEgSnVuY3Rpb24ABgAIWDccADkBASBKdW5jdGlvbgAAOQEBIEp1bmN0aW9uAAA5AQEgSnVuY3Rpb24AADkBASBKdW5jdGlvbgAAOQEBIEp1bmN0aW9uAAA5AQEgSnVuY3Rpb24AADkBASBKdW5jdGlvbgAHAAhYOCAAOQEBIEp1bmN0aW9uAAA5AQEgSnVuY3Rpb24AADkBASBKdW5jdGlvbgAAOQEBIEp1bmN0aW9uAAA5AQEgSnVuY3Rpb24AADkBASBKdW5jdGlvbgAAOQEBIEp1bmN0aW9uAAA5AQEgSnVuY3Rpb24ACAAAOQEQDHhjbQh2MiBqdW5jdGlvbiBKdW5jdGlvbgABJCRQYXJhY2hhaW4EANQBDHUzMgAAACxBY2NvdW50SWQzMggBHG5ldHdvcms9AQEkTmV0d29ya0lkAAEIaWQEASBbdTg7IDMyXQABADhBY2NvdW50SW5kZXg2NAgBHG5ldHdvcms9AQEkTmV0d29ya0lkAAEUaW5kZXgsAQx1NjQAAgAwQWNjb3VudEtleTIwCAEcbmV0d29yaz0BASROZXR3b3JrSWQAAQxrZXngASBbdTg7IDIwXQADADhQYWxsZXRJbnN0YW5jZQQACAEIdTgABAAwR2VuZXJhbEluZGV4BADkARB1MTI4AAUAKEdlbmVyYWxLZXkEAEEBAYBXZWFrQm91bmRlZFZlYzx1OCwgQ29uc3RVMzI8MzI+PgAGACRPbmx5Q2hpbGQABwAkUGx1cmFsaXR5CAEIaWRFAQEYQm9keUlkAAEQcGFydEkBASBCb2R5UGFydAAIAAA9AQwMeGNtCHYyJE5ldHdvcmtJZAABEAxBbnkAAAAUTmFtZWQEAEEBAYBXZWFrQm91bmRlZFZlYzx1OCwgQ29uc3RVMzI8MzI+PgABACBQb2xrYWRvdAACABhLdXNhbWEAAwAAQQEMTGJvdW5kZWRfY29sbGVjdGlvbnNAd2Vha19ib3VuZGVkX3ZlYzhXZWFrQm91bmRlZFZlYwgEVAEIBFMAAAQAOAEYVmVjPFQ+AABFAQwMeGNtCHYyGEJvZHlJZAABKBBVbml0AAAAFE5hbWVkBABBAQGAV2Vha0JvdW5kZWRWZWM8dTgsIENvbnN0VTMyPDMyPj4AAQAUSW5kZXgEANQBDHUzMgACACRFeGVjdXRpdmUAAwAkVGVjaG5pY2FsAAQALExlZ2lzbGF0aXZlAAUAIEp1ZGljaWFsAAYAHERlZmVuc2UABwA4QWRtaW5pc3RyYXRpb24ACAAgVHJlYXN1cnkACQAASQEMDHhjbQh2MiBCb2R5UGFydAABFBRWb2ljZQAAABxNZW1iZXJzBAEUY291bnTUAQx1MzIAAQAgRnJhY3Rpb24IAQxub23UAQx1MzIAARRkZW5vbdQBDHUzMgACAERBdExlYXN0UHJvcG9ydGlvbggBDG5vbdQBDHUzMgABFGRlbm9t1AEMdTMyAAMASE1vcmVUaGFuUHJvcG9ydGlvbggBDG5vbdQBDHUzMgABFGRlbm9t1AEMdTMyAAQAAE0BDGBwYWxsZXRfY29udmljdGlvbl92b3RpbmcYcGFsbGV0FEV2ZW50CARUAARJAAEIJERlbGVnYXRlZAgAAAEwVDo6QWNjb3VudElkAAAAATBUOjpBY2NvdW50SWQAAAQdAUFuIGFjY291bnQgaGFzIGRlbGVnYXRlZCB0aGVpciB2b3RlIHRvIGFub3RoZXIgYWNjb3VudC4gXFt3aG8sIHRhcmdldFxdLFVuZGVsZWdhdGVkBAAAATBUOjpBY2NvdW50SWQAAQT0QW4gXFthY2NvdW50XF0gaGFzIGNhbmNlbGxlZCBhIHByZXZpb3VzIGRlbGVnYXRpb24gb3BlcmF0aW9uLgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldFEBDEBwYWxsZXRfcmVmZXJlbmRhGHBhbGxldBRFdmVudAgEVAAESQABQCRTdWJtaXR0ZWQMARRpbmRleBABPFJlZmVyZW5kdW1JbmRleARgSW5kZXggb2YgdGhlIHJlZmVyZW5kdW0uARR0cmFja1UBATxUcmFja0lkT2Y8VCwgST4EJQFUaGUgdHJhY2sgKGFuZCBieSBleHRlbnNpb24gcHJvcG9zYWwgZGlzcGF0Y2ggb3JpZ2luKSBvZiB0aGlzIHJlZmVyZW5kdW0uASBwcm9wb3NhbFkBAUxCb3VuZGVkQ2FsbE9mPFQsIEk+BIBUaGUgcHJvcG9zYWwgZm9yIHRoZSByZWZlcmVuZHVtLgAEgEEgcmVmZXJlbmR1bSBoYXMgYmVlbiBzdWJtaXR0ZWQuVERlY2lzaW9uRGVwb3NpdFBsYWNlZAwBFGluZGV4EAE8UmVmZXJlbmR1bUluZGV4BGBJbmRleCBvZiB0aGUgcmVmZXJlbmR1bS4BDHdobwABMFQ6OkFjY291bnRJZASMVGhlIGFjY291bnQgd2hvIHBsYWNlZCB0aGUgZGVwb3NpdC4BGGFtb3VudBgBPEJhbGFuY2VPZjxULCBJPgSEVGhlIGFtb3VudCBwbGFjZWQgYnkgdGhlIGFjY291bnQuAQSUVGhlIGRlY2lzaW9uIGRlcG9zaXQgaGFzIGJlZW4gcGxhY2VkLlxEZWNpc2lvbkRlcG9zaXRSZWZ1bmRlZAwBFGluZGV4EAE8UmVmZXJlbmR1bUluZGV4BGBJbmRleCBvZiB0aGUgcmVmZXJlbmR1bS4BDHdobwABMFQ6OkFjY291bnRJZASMVGhlIGFjY291bnQgd2hvIHBsYWNlZCB0aGUgZGVwb3NpdC4BGGFtb3VudBgBPEJhbGFuY2VPZjxULCBJPgSEVGhlIGFtb3VudCBwbGFjZWQgYnkgdGhlIGFjY291bnQuAgScVGhlIGRlY2lzaW9uIGRlcG9zaXQgaGFzIGJlZW4gcmVmdW5kZWQuOERlcG9zaXRTbGFzaGVkCAEMd2hvAAEwVDo6QWNjb3VudElkBIxUaGUgYWNjb3VudCB3aG8gcGxhY2VkIHRoZSBkZXBvc2l0LgEYYW1vdW50GAE8QmFsYW5jZU9mPFQsIEk+BIRUaGUgYW1vdW50IHBsYWNlZCBieSB0aGUgYWNjb3VudC4DBGxBIGRlcG9zaXQgaGFzIGJlZW4gc2xhc2hlZC48RGVjaXNpb25TdGFydGVkEAEUaW5kZXgQATxSZWZlcmVuZHVtSW5kZXgEYEluZGV4IG9mIHRoZSByZWZlcmVuZHVtLgEUdHJhY2tVAQE8VHJhY2tJZE9mPFQsIEk+BCUBVGhlIHRyYWNrIChhbmQgYnkgZXh0ZW5zaW9uIHByb3Bvc2FsIGRpc3BhdGNoIG9yaWdpbikgb2YgdGhpcyByZWZlcmVuZHVtLgEgcHJvcG9zYWxZAQFMQm91bmRlZENhbGxPZjxULCBJPgSAVGhlIHByb3Bvc2FsIGZvciB0aGUgcmVmZXJlbmR1bS4BFHRhbGx5UQcBIFQ6OlRhbGx5BLhUaGUgY3VycmVudCB0YWxseSBvZiB2b3RlcyBpbiB0aGlzIHJlZmVyZW5kdW0uBAS8QSByZWZlcmVuZHVtIGhhcyBtb3ZlZCBpbnRvIHRoZSBkZWNpZGluZyBwaGFzZS44Q29uZmlybVN0YXJ0ZWQEARRpbmRleBABPFJlZmVyZW5kdW1JbmRleARgSW5kZXggb2YgdGhlIHJlZmVyZW5kdW0uBQA4Q29uZmlybUFib3J0ZWQEARRpbmRleBABPFJlZmVyZW5kdW1JbmRleARgSW5kZXggb2YgdGhlIHJlZmVyZW5kdW0uBgAkQ29uZmlybWVkCAEUaW5kZXgQATxSZWZlcmVuZHVtSW5kZXgEYEluZGV4IG9mIHRoZSByZWZlcmVuZHVtLgEUdGFsbHlRBwEgVDo6VGFsbHkEsFRoZSBmaW5hbCB0YWxseSBvZiB2b3RlcyBpbiB0aGlzIHJlZmVyZW5kdW0uBwQhAUEgcmVmZXJlbmR1bSBoYXMgZW5kZWQgaXRzIGNvbmZpcm1hdGlvbiBwaGFzZSBhbmQgaXMgcmVhZHkgZm9yIGFwcHJvdmFsLiBBcHByb3ZlZAQBFGluZGV4EAE8UmVmZXJlbmR1bUluZGV4BGBJbmRleCBvZiB0aGUgcmVmZXJlbmR1bS4IBA0BQSByZWZlcmVuZHVtIGhhcyBiZWVuIGFwcHJvdmVkIGFuZCBpdHMgcHJvcG9zYWwgaGFzIGJlZW4gc2NoZWR1bGVkLiBSZWplY3RlZAgBFGluZGV4EAE8UmVmZXJlbmR1bUluZGV4BGBJbmRleCBvZiB0aGUgcmVmZXJlbmR1bS4BFHRhbGx5UQcBIFQ6OlRhbGx5BLBUaGUgZmluYWwgdGFsbHkgb2Ygdm90ZXMgaW4gdGhpcyByZWZlcmVuZHVtLgkErEEgcHJvcG9zYWwgaGFzIGJlZW4gcmVqZWN0ZWQgYnkgcmVmZXJlbmR1bS4gVGltZWRPdXQIARRpbmRleBABPFJlZmVyZW5kdW1JbmRleARgSW5kZXggb2YgdGhlIHJlZmVyZW5kdW0uARR0YWxseVEHASBUOjpUYWxseQSwVGhlIGZpbmFsIHRhbGx5IG9mIHZvdGVzIGluIHRoaXMgcmVmZXJlbmR1bS4KBNhBIHJlZmVyZW5kdW0gaGFzIGJlZW4gdGltZWQgb3V0IHdpdGhvdXQgYmVpbmcgZGVjaWRlZC4kQ2FuY2VsbGVkCAEUaW5kZXgQATxSZWZlcmVuZHVtSW5kZXgEYEluZGV4IG9mIHRoZSByZWZlcmVuZHVtLgEUdGFsbHlRBwEgVDo6VGFsbHkEsFRoZSBmaW5hbCB0YWxseSBvZiB2b3RlcyBpbiB0aGlzIHJlZmVyZW5kdW0uCwSAQSByZWZlcmVuZHVtIGhhcyBiZWVuIGNhbmNlbGxlZC4YS2lsbGVkCAEUaW5kZXgQATxSZWZlcmVuZHVtSW5kZXgEYEluZGV4IG9mIHRoZSByZWZlcmVuZHVtLgEUdGFsbHlRBwEgVDo6VGFsbHkEsFRoZSBmaW5hbCB0YWxseSBvZiB2b3RlcyBpbiB0aGlzIHJlZmVyZW5kdW0uDAR0QSByZWZlcmVuZHVtIGhhcyBiZWVuIGtpbGxlZC5kU3VibWlzc2lvbkRlcG9zaXRSZWZ1bmRlZAwBFGluZGV4EAE8UmVmZXJlbmR1bUluZGV4BGBJbmRleCBvZiB0aGUgcmVmZXJlbmR1bS4BDHdobwABMFQ6OkFjY291bnRJZASMVGhlIGFjY291bnQgd2hvIHBsYWNlZCB0aGUgZGVwb3NpdC4BGGFtb3VudBgBPEJhbGFuY2VPZjxULCBJPgSEVGhlIGFtb3VudCBwbGFjZWQgYnkgdGhlIGFjY291bnQuDQSkVGhlIHN1Ym1pc3Npb24gZGVwb3NpdCBoYXMgYmVlbiByZWZ1bmRlZC4sTWV0YWRhdGFTZXQIARRpbmRleBABPFJlZmVyZW5kdW1JbmRleARgSW5kZXggb2YgdGhlIHJlZmVyZW5kdW0uARBoYXNoNAEcVDo6SGFzaAQ4UHJlaW1hZ2UgaGFzaC4OBJxNZXRhZGF0YSBmb3IgYSByZWZlcmVuZHVtIGhhcyBiZWVuIHNldC48TWV0YWRhdGFDbGVhcmVkCAEUaW5kZXgQATxSZWZlcmVuZHVtSW5kZXgEYEluZGV4IG9mIHRoZSByZWZlcmVuZHVtLgEQaGFzaDQBHFQ6Okhhc2gEOFByZWltYWdlIGhhc2guDwSsTWV0YWRhdGEgZm9yIGEgcmVmZXJlbmR1bSBoYXMgYmVlbiBjbGVhcmVkLgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldFUBAAAFBABZARA0ZnJhbWVfc3VwcG9ydBh0cmFpdHMkcHJlaW1hZ2VzHEJvdW5kZWQIBFQBXQEESAFJBwEMGExlZ2FjeQQBEGhhc2g0ASRIOjpPdXRwdXQAAAAYSW5saW5lBABNBwE0Qm91bmRlZElubGluZQABABhMb29rdXAIARBoYXNoNAEkSDo6T3V0cHV0AAEMbGVuEAEMdTMyAAIAAF0BCFhzdGFnaW5nX2t1c2FtYV9ydW50aW1lLFJ1bnRpbWVDYWxsAAHMGFN5c3RlbQQAYQEBrQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8U3lzdGVtLCBSdW50aW1lPgAAABBCYWJlBABxAQGlAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxCYWJlLCBSdW50aW1lPgABACRUaW1lc3RhbXAEAJUBAbkBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPFRpbWVzdGFtcCwgUnVudGltZT4AAgAcSW5kaWNlcwQAmQEBsQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8SW5kaWNlcywgUnVudGltZT4AAwAgQmFsYW5jZXMEAKkBAbUBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPEJhbGFuY2VzLCBSdW50aW1lPgAEABxTdGFraW5nBAC1AQGxAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxTdGFraW5nLCBSdW50aW1lPgAGABxTZXNzaW9uBADxAQGxAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxTZXNzaW9uLCBSdW50aW1lPgAIABxHcmFuZHBhBAANAgGxAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxHcmFuZHBhLCBSdW50aW1lPgAKACBUcmVhc3VyeQQAOQIBtQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8VHJlYXN1cnksIFJ1bnRpbWU+ABIAQENvbnZpY3Rpb25Wb3RpbmcEAEECAdUBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPENvbnZpY3Rpb25Wb3RpbmcsIFJ1bnRpbWU+ABQAJFJlZmVyZW5kYQQAVQIBuQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8UmVmZXJlbmRhLCBSdW50aW1lPgAVAFBGZWxsb3dzaGlwQ29sbGVjdGl2ZQQAfQIB5QFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8RmVsbG93c2hpcENvbGxlY3RpdmUsIFJ1bnRpbWU+ABYATEZlbGxvd3NoaXBSZWZlcmVuZGEEAIECAeEBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPEZlbGxvd3NoaXBSZWZlcmVuZGEsIFJ1bnRpbWU+ABcAJFdoaXRlbGlzdAQAhQIBuQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8V2hpdGVsaXN0LCBSdW50aW1lPgAsAChQYXJhbWV0ZXJzBACJAgG9AXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxQYXJhbWV0ZXJzLCBSdW50aW1lPgAuABhDbGFpbXMEALUCAa0Bc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPENsYWltcywgUnVudGltZT4AEwAcVXRpbGl0eQQA1QIBsQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8VXRpbGl0eSwgUnVudGltZT4AGAAcU29jaWV0eQQA3QIBsQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8U29jaWV0eSwgUnVudGltZT4AGgAgUmVjb3ZlcnkEAOECAbUBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPFJlY292ZXJ5LCBSdW50aW1lPgAbABxWZXN0aW5nBADlAgGxAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxWZXN0aW5nLCBSdW50aW1lPgAcACRTY2hlZHVsZXIEAO0CAbkBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPFNjaGVkdWxlciwgUnVudGltZT4AHQAUUHJveHkEAPkCAakBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPFByb3h5LCBSdW50aW1lPgAeACBNdWx0aXNpZwQABQMBtQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8TXVsdGlzaWcsIFJ1bnRpbWU+AB8AIFByZWltYWdlBAARAwG1AXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxQcmVpbWFnZSwgUnVudGltZT4AIAAgQm91bnRpZXMEABkDAbUBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPEJvdW50aWVzLCBSdW50aW1lPgAjADRDaGlsZEJvdW50aWVzBAAdAwHJAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxDaGlsZEJvdW50aWVzLCBSdW50aW1lPgAoAGhFbGVjdGlvblByb3ZpZGVyTXVsdGlQaGFzZQQAIQMB/QFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8RWxlY3Rpb25Qcm92aWRlck11bHRpUGhhc2UsIFJ1bnRpbWU+ACUADE5pcwQAdQQBoQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8TmlzLCBSdW50aW1lPgAmAFhOaXNDb3VudGVycGFydEJhbGFuY2VzBAB5BAHtAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxOaXNDb3VudGVycGFydEJhbGFuY2VzLCBSdW50aW1lPgAtACRWb3Rlckxpc3QEAH0EAbkBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPFZvdGVyTGlzdCwgUnVudGltZT4AJwA8Tm9taW5hdGlvblBvb2xzBACBBAHRAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxOb21pbmF0aW9uUG9vbHMsIFJ1bnRpbWU+ACkALEZhc3RVbnN0YWtlBAC1BAHBAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxGYXN0VW5zdGFrZSwgUnVudGltZT4AKgA0Q29uZmlndXJhdGlvbgQAuQQByQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8Q29uZmlndXJhdGlvbiwgUnVudGltZT4AMwAsUGFyYXNTaGFyZWQEAN0EAcEBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPFBhcmFzU2hhcmVkLCBSdW50aW1lPgA0ADRQYXJhSW5jbHVzaW9uBADhBAHJAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxQYXJhSW5jbHVzaW9uLCBSdW50aW1lPgA1ADBQYXJhSW5oZXJlbnQEAOUEAcUBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPFBhcmFJbmhlcmVudCwgUnVudGltZT4ANgAUUGFyYXMEAHEFAakBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPFBhcmFzLCBSdW50aW1lPgA4ACxJbml0aWFsaXplcgQAeQUBwQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8SW5pdGlhbGl6ZXIsIFJ1bnRpbWU+ADkAEEhybXAEAH0FAaUBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPEhybXAsIFJ1bnRpbWU+ADwANFBhcmFzRGlzcHV0ZXMEAIUFAckBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPFBhcmFzRGlzcHV0ZXMsIFJ1bnRpbWU+AD4ANFBhcmFzU2xhc2hpbmcEAIkFAckBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPFBhcmFzU2xhc2hpbmcsIFJ1bnRpbWU+AD8AaE9uRGVtYW5kQXNzaWdubWVudFByb3ZpZGVyBACZBQH9AXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxPbkRlbWFuZEFzc2lnbm1lbnRQcm92aWRlciwgUnVudGltZT4AQAAkUmVnaXN0cmFyBACdBQG5AXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxSZWdpc3RyYXIsIFJ1bnRpbWU+AEYAFFNsb3RzBAChBQGpAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxTbG90cywgUnVudGltZT4ARwAgQXVjdGlvbnMEAKUFAbUBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPEF1Y3Rpb25zLCBSdW50aW1lPgBIACRDcm93ZGxvYW4EAK0FAbkBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPENyb3dkbG9hbiwgUnVudGltZT4ASQAgQ29yZXRpbWUEAMEFAbUBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPENvcmV0aW1lLCBSdW50aW1lPgBKACRYY21QYWxsZXQEANUFAbkBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPFhjbVBhbGxldCwgUnVudGltZT4AYwAwTWVzc2FnZVF1ZXVlBAARBwHFAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxNZXNzYWdlUXVldWUsIFJ1bnRpbWU+AGQAJEFzc2V0UmF0ZQQAHQcBuQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8QXNzZXRSYXRlLCBSdW50aW1lPgBlABRCZWVmeQQAJQcBqQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8QmVlZnksIFJ1bnRpbWU+AMgAAGEBDDBmcmFtZV9zeXN0ZW0YcGFsbGV0EENhbGwEBFQAASwYcmVtYXJrBAEYcmVtYXJrOAEcVmVjPHU4PgAADGhNYWtlIHNvbWUgb24tY2hhaW4gcmVtYXJrLgCIQ2FuIGJlIGV4ZWN1dGVkIGJ5IGV2ZXJ5IGBvcmlnaW5gLjhzZXRfaGVhcF9wYWdlcwQBFHBhZ2VzMAEMdTY0AAEE+FNldCB0aGUgbnVtYmVyIG9mIHBhZ2VzIGluIHRoZSBXZWJBc3NlbWJseSBlbnZpcm9ubWVudCdzIGhlYXAuIHNldF9jb2RlBAEQY29kZTgBHFZlYzx1OD4AAgRkU2V0IHRoZSBuZXcgcnVudGltZSBjb2RlLlxzZXRfY29kZV93aXRob3V0X2NoZWNrcwQBEGNvZGU4ARxWZWM8dTg+AAMQGQFTZXQgdGhlIG5ldyBydW50aW1lIGNvZGUgd2l0aG91dCBkb2luZyBhbnkgY2hlY2tzIG9mIHRoZSBnaXZlbiBgY29kZWAuAFEBTm90ZSB0aGF0IHJ1bnRpbWUgdXBncmFkZXMgd2lsbCBub3QgcnVuIGlmIHRoaXMgaXMgY2FsbGVkIHdpdGggYSBub3QtaW5jcmVhc2luZyBzcGVjIHZlcnNpb24hLHNldF9zdG9yYWdlBAEUaXRlbXNlAQE0VmVjPEtleVZhbHVlPgAEBGhTZXQgc29tZSBpdGVtcyBvZiBzdG9yYWdlLjBraWxsX3N0b3JhZ2UEARBrZXlzbQEBIFZlYzxLZXk+AAUEdEtpbGwgc29tZSBpdGVtcyBmcm9tIHN0b3JhZ2UuLGtpbGxfcHJlZml4CAEYcHJlZml4OAEMS2V5AAEcc3Via2V5cxABDHUzMgAGEBEBS2lsbCBhbGwgc3RvcmFnZSBpdGVtcyB3aXRoIGEga2V5IHRoYXQgc3RhcnRzIHdpdGggdGhlIGdpdmVuIHByZWZpeC4AOQEqKk5PVEU6KiogV2UgcmVseSBvbiB0aGUgUm9vdCBvcmlnaW4gdG8gcHJvdmlkZSB1cyB0aGUgbnVtYmVyIG9mIHN1YmtleXMgdW5kZXI9AXRoZSBwcmVmaXggd2UgYXJlIHJlbW92aW5nIHRvIGFjY3VyYXRlbHkgY2FsY3VsYXRlIHRoZSB3ZWlnaHQgb2YgdGhpcyBmdW5jdGlvbi5EcmVtYXJrX3dpdGhfZXZlbnQEARhyZW1hcms4ARxWZWM8dTg+AAcEpE1ha2Ugc29tZSBvbi1jaGFpbiByZW1hcmsgYW5kIGVtaXQgZXZlbnQuRGF1dGhvcml6ZV91cGdyYWRlBAEkY29kZV9oYXNoNAEcVDo6SGFzaAAJEGEBQXV0aG9yaXplIGFuIHVwZ3JhZGUgdG8gYSBnaXZlbiBgY29kZV9oYXNoYCBmb3IgdGhlIHJ1bnRpbWUuIFRoZSBydW50aW1lIGNhbiBiZSBzdXBwbGllZBhsYXRlci4AfFRoaXMgY2FsbCByZXF1aXJlcyBSb290IG9yaWdpbi6AYXV0aG9yaXplX3VwZ3JhZGVfd2l0aG91dF9jaGVja3MEASRjb2RlX2hhc2g0ARxUOjpIYXNoAAogYQFBdXRob3JpemUgYW4gdXBncmFkZSB0byBhIGdpdmVuIGBjb2RlX2hhc2hgIGZvciB0aGUgcnVudGltZS4gVGhlIHJ1bnRpbWUgY2FuIGJlIHN1cHBsaWVkGGxhdGVyLgBdAVdBUk5JTkc6IFRoaXMgYXV0aG9yaXplcyBhbiB1cGdyYWRlIHRoYXQgd2lsbCB0YWtlIHBsYWNlIHdpdGhvdXQgYW55IHNhZmV0eSBjaGVja3MsIGZvclkBZXhhbXBsZSB0aGF0IHRoZSBzcGVjIG5hbWUgcmVtYWlucyB0aGUgc2FtZSBhbmQgdGhhdCB0aGUgdmVyc2lvbiBudW1iZXIgaW5jcmVhc2VzLiBOb3TwcmVjb21tZW5kZWQgZm9yIG5vcm1hbCB1c2UuIFVzZSBgYXV0aG9yaXplX3VwZ3JhZGVgIGluc3RlYWQuAHxUaGlzIGNhbGwgcmVxdWlyZXMgUm9vdCBvcmlnaW4uYGFwcGx5X2F1dGhvcml6ZWRfdXBncmFkZQQBEGNvZGU4ARxWZWM8dTg+AAskVQFQcm92aWRlIHRoZSBwcmVpbWFnZSAocnVudGltZSBiaW5hcnkpIGBjb2RlYCBmb3IgYW4gdXBncmFkZSB0aGF0IGhhcyBiZWVuIGF1dGhvcml6ZWQuAEkBSWYgdGhlIGF1dGhvcml6YXRpb24gcmVxdWlyZWQgYSB2ZXJzaW9uIGNoZWNrLCB0aGlzIGNhbGwgd2lsbCBlbnN1cmUgdGhlIHNwZWMgbmFtZehyZW1haW5zIHVuY2hhbmdlZCBhbmQgdGhhdCB0aGUgc3BlYyB2ZXJzaW9uIGhhcyBpbmNyZWFzZWQuAFkBRGVwZW5kaW5nIG9uIHRoZSBydW50aW1lJ3MgYE9uU2V0Q29kZWAgY29uZmlndXJhdGlvbiwgdGhpcyBmdW5jdGlvbiBtYXkgZGlyZWN0bHkgYXBwbHkRAXRoZSBuZXcgYGNvZGVgIGluIHRoZSBzYW1lIGJsb2NrIG9yIGF0dGVtcHQgdG8gc2NoZWR1bGUgdGhlIHVwZ3JhZGUuAGBBbGwgb3JpZ2lucyBhcmUgYWxsb3dlZC4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMuZQEAAAJpAQBpAQAABAg4OABtAQAAAjgAcQEMLHBhbGxldF9iYWJlGHBhbGxldBBDYWxsBARUAAEMTHJlcG9ydF9lcXVpdm9jYXRpb24IAUhlcXVpdm9jYXRpb25fcHJvb2Z1AQGQQm94PEVxdWl2b2NhdGlvblByb29mPEhlYWRlckZvcjxUPj4+AAE8a2V5X293bmVyX3Byb29mhQEBQFQ6OktleU93bmVyUHJvb2YAABAJAVJlcG9ydCBhdXRob3JpdHkgZXF1aXZvY2F0aW9uL21pc2JlaGF2aW9yLiBUaGlzIG1ldGhvZCB3aWxsIHZlcmlmeQUBdGhlIGVxdWl2b2NhdGlvbiBwcm9vZiBhbmQgdmFsaWRhdGUgdGhlIGdpdmVuIGtleSBvd25lcnNoaXAgcHJvb2YNAWFnYWluc3QgdGhlIGV4dHJhY3RlZCBvZmZlbmRlci4gSWYgYm90aCBhcmUgdmFsaWQsIHRoZSBvZmZlbmNlIHdpbGwwYmUgcmVwb3J0ZWQucHJlcG9ydF9lcXVpdm9jYXRpb25fdW5zaWduZWQIAUhlcXVpdm9jYXRpb25fcHJvb2Z1AQGQQm94PEVxdWl2b2NhdGlvblByb29mPEhlYWRlckZvcjxUPj4+AAE8a2V5X293bmVyX3Byb29mhQEBQFQ6OktleU93bmVyUHJvb2YAASAJAVJlcG9ydCBhdXRob3JpdHkgZXF1aXZvY2F0aW9uL21pc2JlaGF2aW9yLiBUaGlzIG1ldGhvZCB3aWxsIHZlcmlmeQUBdGhlIGVxdWl2b2NhdGlvbiBwcm9vZiBhbmQgdmFsaWRhdGUgdGhlIGdpdmVuIGtleSBvd25lcnNoaXAgcHJvb2YNAWFnYWluc3QgdGhlIGV4dHJhY3RlZCBvZmZlbmRlci4gSWYgYm90aCBhcmUgdmFsaWQsIHRoZSBvZmZlbmNlIHdpbGwwYmUgcmVwb3J0ZWQuDQFUaGlzIGV4dHJpbnNpYyBtdXN0IGJlIGNhbGxlZCB1bnNpZ25lZCBhbmQgaXQgaXMgZXhwZWN0ZWQgdGhhdCBvbmx5FQFibG9jayBhdXRob3JzIHdpbGwgY2FsbCBpdCAodmFsaWRhdGVkIGluIGBWYWxpZGF0ZVVuc2lnbmVkYCksIGFzIHN1Y2gVAWlmIHRoZSBibG9jayBhdXRob3IgaXMgZGVmaW5lZCBpdCB3aWxsIGJlIGRlZmluZWQgYXMgdGhlIGVxdWl2b2NhdGlvbiRyZXBvcnRlci5IcGxhbl9jb25maWdfY2hhbmdlBAEYY29uZmlniQEBUE5leHRDb25maWdEZXNjcmlwdG9yAAIQXQFQbGFuIGFuIGVwb2NoIGNvbmZpZyBjaGFuZ2UuIFRoZSBlcG9jaCBjb25maWcgY2hhbmdlIGlzIHJlY29yZGVkIGFuZCB3aWxsIGJlIGVuYWN0ZWQgb25RAXRoZSBuZXh0IGNhbGwgdG8gYGVuYWN0X2Vwb2NoX2NoYW5nZWAuIFRoZSBjb25maWcgd2lsbCBiZSBhY3RpdmF0ZWQgb25lIGVwb2NoIGFmdGVyLlkBTXVsdGlwbGUgY2FsbHMgdG8gdGhpcyBtZXRob2Qgd2lsbCByZXBsYWNlIGFueSBleGlzdGluZyBwbGFubmVkIGNvbmZpZyBjaGFuZ2UgdGhhdCBoYWRUbm90IGJlZW4gZW5hY3RlZCB5ZXQuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLnUBCEhzcF9jb25zZW5zdXNfc2xvdHNERXF1aXZvY2F0aW9uUHJvb2YIGEhlYWRlcgF5AQhJZAF9AQAQASBvZmZlbmRlcn0BAQhJZAABEHNsb3SBAQEQU2xvdAABMGZpcnN0X2hlYWRlcnkBARhIZWFkZXIAATRzZWNvbmRfaGVhZGVyeQEBGEhlYWRlcgAAeQEQKHNwX3J1bnRpbWUcZ2VuZXJpYxhoZWFkZXIYSGVhZGVyCBhOdW1iZXIBEBBIYXNoAAAUASxwYXJlbnRfaGFzaDQBMEhhc2g6Ok91dHB1dAABGG51bWJlctQBGE51bWJlcgABKHN0YXRlX3Jvb3Q0ATBIYXNoOjpPdXRwdXQAATxleHRyaW5zaWNzX3Jvb3Q0ATBIYXNoOjpPdXRwdXQAARhkaWdlc3Q8ARhEaWdlc3QAAH0BDERzcF9jb25zZW5zdXNfYmFiZQxhcHAYUHVibGljAAAEAAQBPHNyMjU1MTk6OlB1YmxpYwAAgQEISHNwX2NvbnNlbnN1c19zbG90cxBTbG90AAAEADABDHU2NAAAhQEIKHNwX3Nlc3Npb248TWVtYmVyc2hpcFByb29mAAAMARxzZXNzaW9uEAEwU2Vzc2lvbkluZGV4AAEodHJpZV9ub2Rlc20BATBWZWM8VmVjPHU4Pj4AATx2YWxpZGF0b3JfY291bnQQAThWYWxpZGF0b3JDb3VudAAAiQEMRHNwX2NvbnNlbnN1c19iYWJlHGRpZ2VzdHNQTmV4dENvbmZpZ0Rlc2NyaXB0b3IAAQQIVjEIAQRjjQEBKCh1NjQsIHU2NCkAATRhbGxvd2VkX3Nsb3RzkQEBMEFsbG93ZWRTbG90cwABAACNAQAABAgwMACRAQhEc3BfY29uc2Vuc3VzX2JhYmUwQWxsb3dlZFNsb3RzAAEMMFByaW1hcnlTbG90cwAAAHRQcmltYXJ5QW5kU2Vjb25kYXJ5UGxhaW5TbG90cwABAGxQcmltYXJ5QW5kU2Vjb25kYXJ5VlJGU2xvdHMAAgAAlQEMQHBhbGxldF90aW1lc3RhbXAYcGFsbGV0EENhbGwEBFQAAQQMc2V0BAEMbm93LAEkVDo6TW9tZW50AABMVFNldCB0aGUgY3VycmVudCB0aW1lLgBVAVRoaXMgY2FsbCBzaG91bGQgYmUgaW52b2tlZCBleGFjdGx5IG9uY2UgcGVyIGJsb2NrLiBJdCB3aWxsIHBhbmljIGF0IHRoZSBmaW5hbGl6YXRpb27UcGhhc2UsIGlmIHRoaXMgY2FsbCBoYXNuJ3QgYmVlbiBpbnZva2VkIGJ5IHRoYXQgdGltZS4AQQFUaGUgdGltZXN0YW1wIHNob3VsZCBiZSBncmVhdGVyIHRoYW4gdGhlIHByZXZpb3VzIG9uZSBieSB0aGUgYW1vdW50IHNwZWNpZmllZCBieWhbYENvbmZpZzo6TWluaW11bVBlcmlvZGBdLgDEVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX05vbmVfLgBRAVRoaXMgZGlzcGF0Y2ggY2xhc3MgaXMgX01hbmRhdG9yeV8gdG8gZW5zdXJlIGl0IGdldHMgZXhlY3V0ZWQgaW4gdGhlIGJsb2NrLiBCZSBhd2FyZVEBdGhhdCBjaGFuZ2luZyB0aGUgY29tcGxleGl0eSBvZiB0aGlzIGNhbGwgY291bGQgcmVzdWx0IGV4aGF1c3RpbmcgdGhlIHJlc291cmNlcyBpbiBhhGJsb2NrIHRvIGV4ZWN1dGUgYW55IG90aGVyIGNhbGxzLgA0IyMgQ29tcGxleGl0eTEBLSBgTygxKWAgKE5vdGUgdGhhdCBpbXBsZW1lbnRhdGlvbnMgb2YgYE9uVGltZXN0YW1wU2V0YCBtdXN0IGFsc28gYmUgYE8oMSlgKVUBLSAxIHN0b3JhZ2UgcmVhZCBhbmQgMSBzdG9yYWdlIG11dGF0aW9uIChjb2RlYyBgTygxKWAgYmVjYXVzZSBvZiBgRGlkVXBkYXRlOjp0YWtlYCBpbkAgIGBvbl9maW5hbGl6ZWAp1C0gMSBldmVudCBoYW5kbGVyIGBvbl90aW1lc3RhbXBfc2V0YC4gTXVzdCBiZSBgTygxKWAuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLpkBDDhwYWxsZXRfaW5kaWNlcxhwYWxsZXQQQ2FsbAQEVAABFBRjbGFpbQQBFGluZGV4EAE8VDo6QWNjb3VudEluZGV4AAAwmEFzc2lnbiBhbiBwcmV2aW91c2x5IHVuYXNzaWduZWQgaW5kZXguANxQYXltZW50OiBgRGVwb3NpdGAgaXMgcmVzZXJ2ZWQgZnJvbSB0aGUgc2VuZGVyIGFjY291bnQuAMxUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXy4A8C0gYGluZGV4YDogdGhlIGluZGV4IHRvIGJlIGNsYWltZWQuIFRoaXMgbXVzdCBub3QgYmUgaW4gdXNlLgCQRW1pdHMgYEluZGV4QXNzaWduZWRgIGlmIHN1Y2Nlc3NmdWwuADQjIyBDb21wbGV4aXR5JC0gYE8oMSlgLiB0cmFuc2ZlcggBDG5ld50BAVBBY2NvdW50SWRMb29rdXBPZjxUPgABFGluZGV4EAE8VDo6QWNjb3VudEluZGV4AAEwXQFBc3NpZ24gYW4gaW5kZXggYWxyZWFkeSBvd25lZCBieSB0aGUgc2VuZGVyIHRvIGFub3RoZXIgYWNjb3VudC4gVGhlIGJhbGFuY2UgcmVzZXJ2YXRpb264aXMgZWZmZWN0aXZlbHkgdHJhbnNmZXJyZWQgdG8gdGhlIG5ldyBhY2NvdW50LgDMVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uACUBLSBgaW5kZXhgOiB0aGUgaW5kZXggdG8gYmUgcmUtYXNzaWduZWQuIFRoaXMgbXVzdCBiZSBvd25lZCBieSB0aGUgc2VuZGVyLl0BLSBgbmV3YDogdGhlIG5ldyBvd25lciBvZiB0aGUgaW5kZXguIFRoaXMgZnVuY3Rpb24gaXMgYSBuby1vcCBpZiBpdCBpcyBlcXVhbCB0byBzZW5kZXIuAJBFbWl0cyBgSW5kZXhBc3NpZ25lZGAgaWYgc3VjY2Vzc2Z1bC4ANCMjIENvbXBsZXhpdHkkLSBgTygxKWAuEGZyZWUEARRpbmRleBABPFQ6OkFjY291bnRJbmRleAACMJRGcmVlIHVwIGFuIGluZGV4IG93bmVkIGJ5IHRoZSBzZW5kZXIuAF0BUGF5bWVudDogQW55IHByZXZpb3VzIGRlcG9zaXQgcGxhY2VkIGZvciB0aGUgaW5kZXggaXMgdW5yZXNlcnZlZCBpbiB0aGUgc2VuZGVyIGFjY291bnQuAFUBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8gYW5kIHRoZSBzZW5kZXIgbXVzdCBvd24gdGhlIGluZGV4LgANAS0gYGluZGV4YDogdGhlIGluZGV4IHRvIGJlIGZyZWVkLiBUaGlzIG11c3QgYmUgb3duZWQgYnkgdGhlIHNlbmRlci4AhEVtaXRzIGBJbmRleEZyZWVkYCBpZiBzdWNjZXNzZnVsLgA0IyMgQ29tcGxleGl0eSQtIGBPKDEpYC44Zm9yY2VfdHJhbnNmZXIMAQxuZXedAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AARRpbmRleBABPFQ6OkFjY291bnRJbmRleAABGGZyZWV6ZSABEGJvb2wAAzRVAUZvcmNlIGFuIGluZGV4IHRvIGFuIGFjY291bnQuIFRoaXMgZG9lc24ndCByZXF1aXJlIGEgZGVwb3NpdC4gSWYgdGhlIGluZGV4IGlzIGFscmVhZHnoaGVsZCwgdGhlbiBhbnkgZGVwb3NpdCBpcyByZWltYnVyc2VkIHRvIGl0cyBjdXJyZW50IG93bmVyLgDEVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1Jvb3RfLgCkLSBgaW5kZXhgOiB0aGUgaW5kZXggdG8gYmUgKHJlLSlhc3NpZ25lZC5dAS0gYG5ld2A6IHRoZSBuZXcgb3duZXIgb2YgdGhlIGluZGV4LiBUaGlzIGZ1bmN0aW9uIGlzIGEgbm8tb3AgaWYgaXQgaXMgZXF1YWwgdG8gc2VuZGVyLkEBLSBgZnJlZXplYDogaWYgc2V0IHRvIGB0cnVlYCwgd2lsbCBmcmVlemUgdGhlIGluZGV4IHNvIGl0IGNhbm5vdCBiZSB0cmFuc2ZlcnJlZC4AkEVtaXRzIGBJbmRleEFzc2lnbmVkYCBpZiBzdWNjZXNzZnVsLgA0IyMgQ29tcGxleGl0eSQtIGBPKDEpYC4YZnJlZXplBAEUaW5kZXgQATxUOjpBY2NvdW50SW5kZXgABDBBAUZyZWV6ZSBhbiBpbmRleCBzbyBpdCB3aWxsIGFsd2F5cyBwb2ludCB0byB0aGUgc2VuZGVyIGFjY291bnQuIFRoaXMgY29uc3VtZXMgdGhlIGRlcG9zaXQuAFkBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8gYW5kIHRoZSBzaWduaW5nIGFjY291bnQgbXVzdCBoYXZlIGFsbm9uLWZyb3plbiBhY2NvdW50IGBpbmRleGAuAKwtIGBpbmRleGA6IHRoZSBpbmRleCB0byBiZSBmcm96ZW4gaW4gcGxhY2UuAIhFbWl0cyBgSW5kZXhGcm96ZW5gIGlmIHN1Y2Nlc3NmdWwuADQjIyBDb21wbGV4aXR5JC0gYE8oMSlgLgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy6dAQwoc3BfcnVudGltZTBtdWx0aWFkZHJlc3MwTXVsdGlBZGRyZXNzCCRBY2NvdW50SWQBADBBY2NvdW50SW5kZXgBoQEBFAhJZAQAAAEkQWNjb3VudElkAAAAFEluZGV4BAClAQEwQWNjb3VudEluZGV4AAEADFJhdwQAOAEcVmVjPHU4PgACACRBZGRyZXNzMzIEAAQBIFt1ODsgMzJdAAMAJEFkZHJlc3MyMAQA4AEgW3U4OyAyMF0ABAAAoQEAAAQAAKUBAAAGoQEAqQEMPHBhbGxldF9iYWxhbmNlcxhwYWxsZXQQQ2FsbAgEVAAESQABJFB0cmFuc2Zlcl9hbGxvd19kZWF0aAgBEGRlc3SdAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AARR2YWx1ZeQBKFQ6OkJhbGFuY2UAABzUVHJhbnNmZXIgc29tZSBsaXF1aWQgZnJlZSBiYWxhbmNlIHRvIGFub3RoZXIgYWNjb3VudC4ANQFgdHJhbnNmZXJfYWxsb3dfZGVhdGhgIHdpbGwgc2V0IHRoZSBgRnJlZUJhbGFuY2VgIG9mIHRoZSBzZW5kZXIgYW5kIHJlY2VpdmVyLhEBSWYgdGhlIHNlbmRlcidzIGFjY291bnQgaXMgYmVsb3cgdGhlIGV4aXN0ZW50aWFsIGRlcG9zaXQgYXMgYSByZXN1bHSwb2YgdGhlIHRyYW5zZmVyLCB0aGUgYWNjb3VudCB3aWxsIGJlIHJlYXBlZC4AFQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBgU2lnbmVkYCBieSB0aGUgdHJhbnNhY3Rvci44Zm9yY2VfdHJhbnNmZXIMARhzb3VyY2WdAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AARBkZXN0nQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEUdmFsdWXkAShUOjpCYWxhbmNlAAIIYQFFeGFjdGx5IGFzIGB0cmFuc2Zlcl9hbGxvd19kZWF0aGAsIGV4Y2VwdCB0aGUgb3JpZ2luIG11c3QgYmUgcm9vdCBhbmQgdGhlIHNvdXJjZSBhY2NvdW50RG1heSBiZSBzcGVjaWZpZWQuTHRyYW5zZmVyX2tlZXBfYWxpdmUIARBkZXN0nQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEUdmFsdWXkAShUOjpCYWxhbmNlAAMYWQFTYW1lIGFzIHRoZSBbYHRyYW5zZmVyX2FsbG93X2RlYXRoYF0gY2FsbCwgYnV0IHdpdGggYSBjaGVjayB0aGF0IHRoZSB0cmFuc2ZlciB3aWxsIG5vdGBraWxsIHRoZSBvcmlnaW4gYWNjb3VudC4A6Dk5JSBvZiB0aGUgdGltZSB5b3Ugd2FudCBbYHRyYW5zZmVyX2FsbG93X2RlYXRoYF0gaW5zdGVhZC4A8FtgdHJhbnNmZXJfYWxsb3dfZGVhdGhgXTogc3RydWN0LlBhbGxldC5odG1sI21ldGhvZC50cmFuc2ZlcjB0cmFuc2Zlcl9hbGwIARBkZXN0nQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEoa2VlcF9hbGl2ZSABEGJvb2wABDwFAVRyYW5zZmVyIHRoZSBlbnRpcmUgdHJhbnNmZXJhYmxlIGJhbGFuY2UgZnJvbSB0aGUgY2FsbGVyIGFjY291bnQuAFkBTk9URTogVGhpcyBmdW5jdGlvbiBvbmx5IGF0dGVtcHRzIHRvIHRyYW5zZmVyIF90cmFuc2ZlcmFibGVfIGJhbGFuY2VzLiBUaGlzIG1lYW5zIHRoYXRhAWFueSBsb2NrZWQsIHJlc2VydmVkLCBvciBleGlzdGVudGlhbCBkZXBvc2l0cyAod2hlbiBga2VlcF9hbGl2ZWAgaXMgYHRydWVgKSwgd2lsbCBub3QgYmVdAXRyYW5zZmVycmVkIGJ5IHRoaXMgZnVuY3Rpb24uIFRvIGVuc3VyZSB0aGF0IHRoaXMgZnVuY3Rpb24gcmVzdWx0cyBpbiBhIGtpbGxlZCBhY2NvdW50LEUBeW91IG1pZ2h0IG5lZWQgdG8gcHJlcGFyZSB0aGUgYWNjb3VudCBieSByZW1vdmluZyBhbnkgcmVmZXJlbmNlIGNvdW50ZXJzLCBzdG9yYWdlQGRlcG9zaXRzLCBldGMuLi4AwFRoZSBkaXNwYXRjaCBvcmlnaW4gb2YgdGhpcyBjYWxsIG11c3QgYmUgU2lnbmVkLgCgLSBgZGVzdGA6IFRoZSByZWNpcGllbnQgb2YgdGhlIHRyYW5zZmVyLlkBLSBga2VlcF9hbGl2ZWA6IEEgYm9vbGVhbiB0byBkZXRlcm1pbmUgaWYgdGhlIGB0cmFuc2Zlcl9hbGxgIG9wZXJhdGlvbiBzaG91bGQgc2VuZCBhbGxNASAgb2YgdGhlIGZ1bmRzIHRoZSBhY2NvdW50IGhhcywgY2F1c2luZyB0aGUgc2VuZGVyIGFjY291bnQgdG8gYmUga2lsbGVkIChmYWxzZSksIG9yWQEgIHRyYW5zZmVyIGV2ZXJ5dGhpbmcgZXhjZXB0IGF0IGxlYXN0IHRoZSBleGlzdGVudGlhbCBkZXBvc2l0LCB3aGljaCB3aWxsIGd1YXJhbnRlZSB0b5wgIGtlZXAgdGhlIHNlbmRlciBhY2NvdW50IGFsaXZlICh0cnVlKS48Zm9yY2VfdW5yZXNlcnZlCAEMd2hvnQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEYYW1vdW50GAEoVDo6QmFsYW5jZQAFDLBVbnJlc2VydmUgc29tZSBiYWxhbmNlIGZyb20gYSB1c2VyIGJ5IGZvcmNlLgBsQ2FuIG9ubHkgYmUgY2FsbGVkIGJ5IFJPT1QuQHVwZ3JhZGVfYWNjb3VudHMEAQx3aG+tAQFEVmVjPFQ6OkFjY291bnRJZD4ABiBwVXBncmFkZSBhIHNwZWNpZmllZCBhY2NvdW50LgB0LSBgb3JpZ2luYDogTXVzdCBiZSBgU2lnbmVkYC6QLSBgd2hvYDogVGhlIGFjY291bnQgdG8gYmUgdXBncmFkZWQuAFUBVGhpcyB3aWxsIHdhaXZlIHRoZSB0cmFuc2FjdGlvbiBmZWUgaWYgYXQgbGVhc3QgYWxsIGJ1dCAxMCUgb2YgdGhlIGFjY291bnRzIG5lZWRlZCB0b0EBYmUgdXBncmFkZWQuIChXZSBsZXQgc29tZSBub3QgaGF2ZSB0byBiZSB1cGdyYWRlZCBqdXN0IGluIG9yZGVyIHRvIGFsbG93IGZvciB0aGVYcG9zc2liaWxpdHkgb2YgY2h1cm4pLkRmb3JjZV9zZXRfYmFsYW5jZQgBDHdob50BAVBBY2NvdW50SWRMb29rdXBPZjxUPgABIG5ld19mcmVl5AEoVDo6QmFsYW5jZQAIDKxTZXQgdGhlIHJlZ3VsYXIgYmFsYW5jZSBvZiBhIGdpdmVuIGFjY291bnQuALBUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgaXMgYHJvb3RgLmxmb3JjZV9hZGp1c3RfdG90YWxfaXNzdWFuY2UIASRkaXJlY3Rpb26xAQFMQWRqdXN0bWVudERpcmVjdGlvbgABFGRlbHRh5AEoVDo6QmFsYW5jZQAJFLhBZGp1c3QgdGhlIHRvdGFsIGlzc3VhbmNlIGluIGEgc2F0dXJhdGluZyB3YXkuAPxDYW4gb25seSBiZSBjYWxsZWQgYnkgcm9vdCBhbmQgYWx3YXlzIG5lZWRzIGEgcG9zaXRpdmUgYGRlbHRhYC4AJCMgRXhhbXBsZRBidXJuCAEUdmFsdWXkAShUOjpCYWxhbmNlAAEoa2VlcF9hbGl2ZSABEGJvb2wAChz8QnVybiB0aGUgc3BlY2lmaWVkIGxpcXVpZCBmcmVlIGJhbGFuY2UgZnJvbSB0aGUgb3JpZ2luIGFjY291bnQuACUBSWYgdGhlIG9yaWdpbidzIGFjY291bnQgZW5kcyB1cCBiZWxvdyB0aGUgZXhpc3RlbnRpYWwgZGVwb3NpdCBhcyBhIHJlc3VsdAkBb2YgdGhlIGJ1cm4gYW5kIGBrZWVwX2FsaXZlYCBpcyBmYWxzZSwgdGhlIGFjY291bnQgd2lsbCBiZSByZWFwZWQuAFEBVW5saWtlIHNlbmRpbmcgZnVuZHMgdG8gYSBfYnVybl8gYWRkcmVzcywgd2hpY2ggbWVyZWx5IG1ha2VzIHRoZSBmdW5kcyBpbmFjY2Vzc2libGUsIQF0aGlzIGBidXJuYCBvcGVyYXRpb24gd2lsbCByZWR1Y2UgdG90YWwgaXNzdWFuY2UgYnkgdGhlIGFtb3VudCBfYnVybmVkXy4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMurQEAAAIAALEBDDxwYWxsZXRfYmFsYW5jZXMUdHlwZXNMQWRqdXN0bWVudERpcmVjdGlvbgABCCBJbmNyZWFzZQAAACBEZWNyZWFzZQABAAC1ARA4cGFsbGV0X3N0YWtpbmcYcGFsbGV0GHBhbGxldBBDYWxsBARUAAF4EGJvbmQIARR2YWx1ZeQBMEJhbGFuY2VPZjxUPgABFHBheWVlkAF8UmV3YXJkRGVzdGluYXRpb248VDo6QWNjb3VudElkPgAAQGEBVGFrZSB0aGUgb3JpZ2luIGFjY291bnQgYXMgYSBzdGFzaCBhbmQgbG9jayB1cCBgdmFsdWVgIG9mIGl0cyBiYWxhbmNlLiBgY29udHJvbGxlcmAgd2lsbIBiZSB0aGUgYWNjb3VudCB0aGF0IGNvbnRyb2xzIGl0LgAtAWB2YWx1ZWAgbXVzdCBiZSBtb3JlIHRoYW4gdGhlIGBtaW5pbXVtX2JhbGFuY2VgIHNwZWNpZmllZCBieSBgVDo6Q3VycmVuY3lgLgAhAVRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfIGJ5IHRoZSBzdGFzaCBhY2NvdW50LgA8RW1pdHMgYEJvbmRlZGAuNCMjIENvbXBsZXhpdHnQLSBJbmRlcGVuZGVudCBvZiB0aGUgYXJndW1lbnRzLiBNb2RlcmF0ZSBjb21wbGV4aXR5LhwtIE8oMSkuZC0gVGhyZWUgZXh0cmEgREIgZW50cmllcy4ATQFOT1RFOiBUd28gb2YgdGhlIHN0b3JhZ2Ugd3JpdGVzIChgU2VsZjo6Ym9uZGVkYCwgYFNlbGY6OnBheWVlYCkgYXJlIF9uZXZlcl8gY2xlYW5lZFkBdW5sZXNzIHRoZSBgb3JpZ2luYCBmYWxscyBiZWxvdyBfZXhpc3RlbnRpYWwgZGVwb3NpdF8gKG9yIGVxdWFsIHRvIDApIGFuZCBnZXRzIHJlbW92ZWQgYXMgZHVzdC4oYm9uZF9leHRyYQQBOG1heF9hZGRpdGlvbmFs5AEwQmFsYW5jZU9mPFQ+AAE4YQFBZGQgc29tZSBleHRyYSBhbW91bnQgdGhhdCBoYXZlIGFwcGVhcmVkIGluIHRoZSBzdGFzaCBgZnJlZV9iYWxhbmNlYCBpbnRvIHRoZSBiYWxhbmNlIHVwMGZvciBzdGFraW5nLgBRAVRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfIGJ5IHRoZSBzdGFzaCwgbm90IHRoZSBjb250cm9sbGVyLgBNAVVzZSB0aGlzIGlmIHRoZXJlIGFyZSBhZGRpdGlvbmFsIGZ1bmRzIGluIHlvdXIgc3Rhc2ggYWNjb3VudCB0aGF0IHlvdSB3aXNoIHRvIGJvbmQuVQFVbmxpa2UgW2Bib25kYF0oU2VsZjo6Ym9uZCkgb3IgW2B1bmJvbmRgXShTZWxmOjp1bmJvbmQpIHRoaXMgZnVuY3Rpb24gZG9lcyBub3QgaW1wb3NlvGFueSBsaW1pdGF0aW9uIG9uIHRoZSBhbW91bnQgdGhhdCBjYW4gYmUgYWRkZWQuADxFbWl0cyBgQm9uZGVkYC4ANCMjIENvbXBsZXhpdHnkLSBJbmRlcGVuZGVudCBvZiB0aGUgYXJndW1lbnRzLiBJbnNpZ25pZmljYW50IGNvbXBsZXhpdHkuHC0gTygxKS4YdW5ib25kBAEUdmFsdWXkATBCYWxhbmNlT2Y8VD4AAkxRAVNjaGVkdWxlIGEgcG9ydGlvbiBvZiB0aGUgc3Rhc2ggdG8gYmUgdW5sb2NrZWQgcmVhZHkgZm9yIHRyYW5zZmVyIG91dCBhZnRlciB0aGUgYm9uZPxwZXJpb2QgZW5kcy4gSWYgdGhpcyBsZWF2ZXMgYW4gYW1vdW50IGFjdGl2ZWx5IGJvbmRlZCBsZXNzIHRoYW4hAVQ6OkN1cnJlbmN5OjptaW5pbXVtX2JhbGFuY2UoKSwgdGhlbiBpdCBpcyBpbmNyZWFzZWQgdG8gdGhlIGZ1bGwgYW1vdW50LgBRAVRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfIGJ5IHRoZSBjb250cm9sbGVyLCBub3QgdGhlIHN0YXNoLgBFAU9uY2UgdGhlIHVubG9jayBwZXJpb2QgaXMgZG9uZSwgeW91IGNhbiBjYWxsIGB3aXRoZHJhd191bmJvbmRlZGAgdG8gYWN0dWFsbHkgbW92Zbx0aGUgZnVuZHMgb3V0IG9mIG1hbmFnZW1lbnQgcmVhZHkgZm9yIHRyYW5zZmVyLgAxAU5vIG1vcmUgdGhhbiBhIGxpbWl0ZWQgbnVtYmVyIG9mIHVubG9ja2luZyBjaHVua3MgKHNlZSBgTWF4VW5sb2NraW5nQ2h1bmtzYClBAWNhbiBjby1leGlzdHMgYXQgdGhlIHNhbWUgdGltZS4gSWYgdGhlcmUgYXJlIG5vIHVubG9ja2luZyBjaHVua3Mgc2xvdHMgYXZhaWxhYmxlRQFbYENhbGw6OndpdGhkcmF3X3VuYm9uZGVkYF0gaXMgY2FsbGVkIHRvIHJlbW92ZSBzb21lIG9mIHRoZSBjaHVua3MgKGlmIHBvc3NpYmxlKS4AOQFJZiBhIHVzZXIgZW5jb3VudGVycyB0aGUgYEluc3VmZmljaWVudEJvbmRgIGVycm9yIHdoZW4gY2FsbGluZyB0aGlzIGV4dHJpbnNpYywZAXRoZXkgc2hvdWxkIGNhbGwgYGNoaWxsYCBmaXJzdCBpbiBvcmRlciB0byBmcmVlIHVwIHRoZWlyIGJvbmRlZCBmdW5kcy4AREVtaXRzIGBVbmJvbmRlZGAuAJRTZWUgYWxzbyBbYENhbGw6OndpdGhkcmF3X3VuYm9uZGVkYF0uRHdpdGhkcmF3X3VuYm9uZGVkBAFIbnVtX3NsYXNoaW5nX3NwYW5zEAEMdTMyAANcKQFSZW1vdmUgYW55IHVubG9ja2VkIGNodW5rcyBmcm9tIHRoZSBgdW5sb2NraW5nYCBxdWV1ZSBmcm9tIG91ciBtYW5hZ2VtZW50LgBVAVRoaXMgZXNzZW50aWFsbHkgZnJlZXMgdXAgdGhhdCBiYWxhbmNlIHRvIGJlIHVzZWQgYnkgdGhlIHN0YXNoIGFjY291bnQgdG8gZG8gd2hhdGV2ZXIkaXQgd2FudHMuABUBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8gYnkgdGhlIGNvbnRyb2xsZXIuAEhFbWl0cyBgV2l0aGRyYXduYC4AaFNlZSBhbHNvIFtgQ2FsbDo6dW5ib25kYF0uADQjIyBQYXJhbWV0ZXJzAFEBLSBgbnVtX3NsYXNoaW5nX3NwYW5zYCBpbmRpY2F0ZXMgdGhlIG51bWJlciBvZiBtZXRhZGF0YSBzbGFzaGluZyBzcGFucyB0byBjbGVhciB3aGVuVQF0aGlzIGNhbGwgcmVzdWx0cyBpbiBhIGNvbXBsZXRlIHJlbW92YWwgb2YgYWxsIHRoZSBkYXRhIHJlbGF0ZWQgdG8gdGhlIHN0YXNoIGFjY291bnQuPQFJbiB0aGlzIGNhc2UsIHRoZSBgbnVtX3NsYXNoaW5nX3NwYW5zYCBtdXN0IGJlIGxhcmdlciBvciBlcXVhbCB0byB0aGUgbnVtYmVyIG9mXQFzbGFzaGluZyBzcGFucyBhc3NvY2lhdGVkIHdpdGggdGhlIHN0YXNoIGFjY291bnQgaW4gdGhlIFtgU2xhc2hpbmdTcGFuc2BdIHN0b3JhZ2UgdHlwZSwlAW90aGVyd2lzZSB0aGUgY2FsbCB3aWxsIGZhaWwuIFRoZSBjYWxsIHdlaWdodCBpcyBkaXJlY3RseSBwcm9wb3J0aW9uYWwgdG9UYG51bV9zbGFzaGluZ19zcGFuc2AuADQjIyBDb21wbGV4aXR52E8oUykgd2hlcmUgUyBpcyB0aGUgbnVtYmVyIG9mIHNsYXNoaW5nIHNwYW5zIHRvIHJlbW92ZQkBTk9URTogV2VpZ2h0IGFubm90YXRpb24gaXMgdGhlIGtpbGwgc2NlbmFyaW8sIHdlIHJlZnVuZCBvdGhlcndpc2UuIHZhbGlkYXRlBAEUcHJlZnOYAThWYWxpZGF0b3JQcmVmcwAEFOREZWNsYXJlIHRoZSBkZXNpcmUgdG8gdmFsaWRhdGUgZm9yIHRoZSBvcmlnaW4gY29udHJvbGxlci4A2EVmZmVjdHMgd2lsbCBiZSBmZWx0IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIG5leHQgZXJhLgBRAVRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfIGJ5IHRoZSBjb250cm9sbGVyLCBub3QgdGhlIHN0YXNoLiBub21pbmF0ZQQBHHRhcmdldHO5AQFkVmVjPEFjY291bnRJZExvb2t1cE9mPFQ+PgAFKA0BRGVjbGFyZSB0aGUgZGVzaXJlIHRvIG5vbWluYXRlIGB0YXJnZXRzYCBmb3IgdGhlIG9yaWdpbiBjb250cm9sbGVyLgDYRWZmZWN0cyB3aWxsIGJlIGZlbHQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbmV4dCBlcmEuAFEBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8gYnkgdGhlIGNvbnRyb2xsZXIsIG5vdCB0aGUgc3Rhc2guADQjIyBDb21wbGV4aXR5LQEtIFRoZSB0cmFuc2FjdGlvbidzIGNvbXBsZXhpdHkgaXMgcHJvcG9ydGlvbmFsIHRvIHRoZSBzaXplIG9mIGB0YXJnZXRzYCAoTikFAXdoaWNoIGlzIGNhcHBlZCBhdCBDb21wYWN0QXNzaWdubWVudHM6OkxJTUlUIChUOjpNYXhOb21pbmF0aW9ucyku1C0gQm90aCB0aGUgcmVhZHMgYW5kIHdyaXRlcyBmb2xsb3cgYSBzaW1pbGFyIHBhdHRlcm4uFGNoaWxsAAYoxERlY2xhcmUgbm8gZGVzaXJlIHRvIGVpdGhlciB2YWxpZGF0ZSBvciBub21pbmF0ZS4A2EVmZmVjdHMgd2lsbCBiZSBmZWx0IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIG5leHQgZXJhLgBRAVRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfIGJ5IHRoZSBjb250cm9sbGVyLCBub3QgdGhlIHN0YXNoLgA0IyMgQ29tcGxleGl0eeQtIEluZGVwZW5kZW50IG9mIHRoZSBhcmd1bWVudHMuIEluc2lnbmlmaWNhbnQgY29tcGxleGl0eS5QLSBDb250YWlucyBvbmUgcmVhZC7ELSBXcml0ZXMgYXJlIGxpbWl0ZWQgdG8gdGhlIGBvcmlnaW5gIGFjY291bnQga2V5LiRzZXRfcGF5ZWUEARRwYXllZZABfFJld2FyZERlc3RpbmF0aW9uPFQ6OkFjY291bnRJZD4ABzC0KFJlLSlzZXQgdGhlIHBheW1lbnQgdGFyZ2V0IGZvciBhIGNvbnRyb2xsZXIuAFEBRWZmZWN0cyB3aWxsIGJlIGZlbHQgaW5zdGFudGx5IChhcyBzb29uIGFzIHRoaXMgZnVuY3Rpb24gaXMgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSkuAFEBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8gYnkgdGhlIGNvbnRyb2xsZXIsIG5vdCB0aGUgc3Rhc2guADQjIyBDb21wbGV4aXR5GC0gTygxKeQtIEluZGVwZW5kZW50IG9mIHRoZSBhcmd1bWVudHMuIEluc2lnbmlmaWNhbnQgY29tcGxleGl0eS6ULSBDb250YWlucyBhIGxpbWl0ZWQgbnVtYmVyIG9mIHJlYWRzLsQtIFdyaXRlcyBhcmUgbGltaXRlZCB0byB0aGUgYG9yaWdpbmAgYWNjb3VudCBrZXkuJC0tLS0tLS0tLThzZXRfY29udHJvbGxlcgAIOEUBKFJlLSlzZXRzIHRoZSBjb250cm9sbGVyIG9mIGEgc3Rhc2ggdG8gdGhlIHN0YXNoIGl0c2VsZi4gVGhpcyBmdW5jdGlvbiBwcmV2aW91c2x5TQFhY2NlcHRlZCBhIGBjb250cm9sbGVyYCBhcmd1bWVudCB0byBzZXQgdGhlIGNvbnRyb2xsZXIgdG8gYW4gYWNjb3VudCBvdGhlciB0aGFuIHRoZVkBc3Rhc2ggaXRzZWxmLiBUaGlzIGZ1bmN0aW9uYWxpdHkgaGFzIG5vdyBiZWVuIHJlbW92ZWQsIG5vdyBvbmx5IHNldHRpbmcgdGhlIGNvbnRyb2xsZXKMdG8gdGhlIHN0YXNoLCBpZiBpdCBpcyBub3QgYWxyZWFkeS4AUQFFZmZlY3RzIHdpbGwgYmUgZmVsdCBpbnN0YW50bHkgKGFzIHNvb24gYXMgdGhpcyBmdW5jdGlvbiBpcyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5KS4AUQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXyBieSB0aGUgc3Rhc2gsIG5vdCB0aGUgY29udHJvbGxlci4ANCMjIENvbXBsZXhpdHkQTygxKeQtIEluZGVwZW5kZW50IG9mIHRoZSBhcmd1bWVudHMuIEluc2lnbmlmaWNhbnQgY29tcGxleGl0eS6ULSBDb250YWlucyBhIGxpbWl0ZWQgbnVtYmVyIG9mIHJlYWRzLsQtIFdyaXRlcyBhcmUgbGltaXRlZCB0byB0aGUgYG9yaWdpbmAgYWNjb3VudCBrZXkuTHNldF92YWxpZGF0b3JfY291bnQEAQxuZXfUAQx1MzIACRiQU2V0cyB0aGUgaWRlYWwgbnVtYmVyIG9mIHZhbGlkYXRvcnMuAIRUaGUgZGlzcGF0Y2ggb3JpZ2luIG11c3QgYmUgUm9vdC4ANCMjIENvbXBsZXhpdHkQTygxKWBpbmNyZWFzZV92YWxpZGF0b3JfY291bnQEAShhZGRpdGlvbmFs1AEMdTMyAAoc6EluY3JlbWVudHMgdGhlIGlkZWFsIG51bWJlciBvZiB2YWxpZGF0b3JzIHVwIHRvIG1heGltdW0gb2aMYEVsZWN0aW9uUHJvdmlkZXJCYXNlOjpNYXhXaW5uZXJzYC4AhFRoZSBkaXNwYXRjaCBvcmlnaW4gbXVzdCBiZSBSb290LgA0IyMgQ29tcGxleGl0eZhTYW1lIGFzIFtgU2VsZjo6c2V0X3ZhbGlkYXRvcl9jb3VudGBdLlRzY2FsZV92YWxpZGF0b3JfY291bnQEARhmYWN0b3K9AQEcUGVyY2VudAALHBEBU2NhbGUgdXAgdGhlIGlkZWFsIG51bWJlciBvZiB2YWxpZGF0b3JzIGJ5IGEgZmFjdG9yIHVwIHRvIG1heGltdW0gb2aMYEVsZWN0aW9uUHJvdmlkZXJCYXNlOjpNYXhXaW5uZXJzYC4AhFRoZSBkaXNwYXRjaCBvcmlnaW4gbXVzdCBiZSBSb290LgA0IyMgQ29tcGxleGl0eZhTYW1lIGFzIFtgU2VsZjo6c2V0X3ZhbGlkYXRvcl9jb3VudGBdLjRmb3JjZV9ub19lcmFzAAw0rEZvcmNlIHRoZXJlIHRvIGJlIG5vIG5ldyBlcmFzIGluZGVmaW5pdGVseS4AhFRoZSBkaXNwYXRjaCBvcmlnaW4gbXVzdCBiZSBSb290LgAkIyBXYXJuaW5nABkBVGhlIGVsZWN0aW9uIHByb2Nlc3Mgc3RhcnRzIG11bHRpcGxlIGJsb2NrcyBiZWZvcmUgdGhlIGVuZCBvZiB0aGUgZXJhLjkBVGh1cyB0aGUgZWxlY3Rpb24gcHJvY2VzcyBtYXkgYmUgb25nb2luZyB3aGVuIHRoaXMgaXMgY2FsbGVkLiBJbiB0aGlzIGNhc2UgdGhl3GVsZWN0aW9uIHdpbGwgY29udGludWUgdW50aWwgdGhlIG5leHQgZXJhIGlzIHRyaWdnZXJlZC4ANCMjIENvbXBsZXhpdHk8LSBObyBhcmd1bWVudHMuOC0gV2VpZ2h0OiBPKDEpNGZvcmNlX25ld19lcmEADThJAUZvcmNlIHRoZXJlIHRvIGJlIGEgbmV3IGVyYSBhdCB0aGUgZW5kIG9mIHRoZSBuZXh0IHNlc3Npb24uIEFmdGVyIHRoaXMsIGl0IHdpbGwgYmWccmVzZXQgdG8gbm9ybWFsIChub24tZm9yY2VkKSBiZWhhdmlvdXIuAIRUaGUgZGlzcGF0Y2ggb3JpZ2luIG11c3QgYmUgUm9vdC4AJCMgV2FybmluZwAZAVRoZSBlbGVjdGlvbiBwcm9jZXNzIHN0YXJ0cyBtdWx0aXBsZSBibG9ja3MgYmVmb3JlIHRoZSBlbmQgb2YgdGhlIGVyYS5JAUlmIHRoaXMgaXMgY2FsbGVkIGp1c3QgYmVmb3JlIGEgbmV3IGVyYSBpcyB0cmlnZ2VyZWQsIHRoZSBlbGVjdGlvbiBwcm9jZXNzIG1heSBub3SMaGF2ZSBlbm91Z2ggYmxvY2tzIHRvIGdldCBhIHJlc3VsdC4ANCMjIENvbXBsZXhpdHk8LSBObyBhcmd1bWVudHMuOC0gV2VpZ2h0OiBPKDEpRHNldF9pbnZ1bG5lcmFibGVzBAE0aW52dWxuZXJhYmxlc60BAURWZWM8VDo6QWNjb3VudElkPgAODMhTZXQgdGhlIHZhbGlkYXRvcnMgd2hvIGNhbm5vdCBiZSBzbGFzaGVkIChpZiBhbnkpLgCEVGhlIGRpc3BhdGNoIG9yaWdpbiBtdXN0IGJlIFJvb3QuNGZvcmNlX3Vuc3Rha2UIARRzdGFzaAABMFQ6OkFjY291bnRJZAABSG51bV9zbGFzaGluZ19zcGFucxABDHUzMgAPIAkBRm9yY2UgYSBjdXJyZW50IHN0YWtlciB0byBiZWNvbWUgY29tcGxldGVseSB1bnN0YWtlZCwgaW1tZWRpYXRlbHkuAIRUaGUgZGlzcGF0Y2ggb3JpZ2luIG11c3QgYmUgUm9vdC4ANCMjIFBhcmFtZXRlcnMARQEtIGBudW1fc2xhc2hpbmdfc3BhbnNgOiBSZWZlciB0byBjb21tZW50cyBvbiBbYENhbGw6OndpdGhkcmF3X3VuYm9uZGVkYF0gZm9yIG1vcmUgZGV0YWlscy5QZm9yY2VfbmV3X2VyYV9hbHdheXMAECQBAUZvcmNlIHRoZXJlIHRvIGJlIGEgbmV3IGVyYSBhdCB0aGUgZW5kIG9mIHNlc3Npb25zIGluZGVmaW5pdGVseS4AhFRoZSBkaXNwYXRjaCBvcmlnaW4gbXVzdCBiZSBSb290LgAkIyBXYXJuaW5nABkBVGhlIGVsZWN0aW9uIHByb2Nlc3Mgc3RhcnRzIG11bHRpcGxlIGJsb2NrcyBiZWZvcmUgdGhlIGVuZCBvZiB0aGUgZXJhLkkBSWYgdGhpcyBpcyBjYWxsZWQganVzdCBiZWZvcmUgYSBuZXcgZXJhIGlzIHRyaWdnZXJlZCwgdGhlIGVsZWN0aW9uIHByb2Nlc3MgbWF5IG5vdIxoYXZlIGVub3VnaCBibG9ja3MgdG8gZ2V0IGEgcmVzdWx0LlRjYW5jZWxfZGVmZXJyZWRfc2xhc2gIAQxlcmEQASBFcmFJbmRleAABNHNsYXNoX2luZGljZXPBAQEgVmVjPHUzMj4AERSUQ2FuY2VsIGVuYWN0bWVudCBvZiBhIGRlZmVycmVkIHNsYXNoLgCYQ2FuIGJlIGNhbGxlZCBieSB0aGUgYFQ6OkFkbWluT3JpZ2luYC4AAQFQYXJhbWV0ZXJzOiBlcmEgYW5kIGluZGljZXMgb2YgdGhlIHNsYXNoZXMgZm9yIHRoYXQgZXJhIHRvIGtpbGwuOHBheW91dF9zdGFrZXJzCAE8dmFsaWRhdG9yX3N0YXNoAAEwVDo6QWNjb3VudElkAAEMZXJhEAEgRXJhSW5kZXgAEjQZAVBheSBvdXQgbmV4dCBwYWdlIG9mIHRoZSBzdGFrZXJzIGJlaGluZCBhIHZhbGlkYXRvciBmb3IgdGhlIGdpdmVuIGVyYS4A6C0gYHZhbGlkYXRvcl9zdGFzaGAgaXMgdGhlIHN0YXNoIGFjY291bnQgb2YgdGhlIHZhbGlkYXRvci4xAS0gYGVyYWAgbWF5IGJlIGFueSBlcmEgYmV0d2VlbiBgW2N1cnJlbnRfZXJhIC0gaGlzdG9yeV9kZXB0aDsgY3VycmVudF9lcmFdYC4AVQFUaGUgb3JpZ2luIG9mIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfLiBBbnkgYWNjb3VudCBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uLCBldmVuIGlmdGl0IGlzIG5vdCBvbmUgb2YgdGhlIHN0YWtlcnMuAEkBVGhlIHJld2FyZCBwYXlvdXQgY291bGQgYmUgcGFnZWQgaW4gY2FzZSB0aGVyZSBhcmUgdG9vIG1hbnkgbm9taW5hdG9ycyBiYWNraW5nIHRoZV0BYHZhbGlkYXRvcl9zdGFzaGAuIFRoaXMgY2FsbCB3aWxsIHBheW91dCB1bnBhaWQgcGFnZXMgaW4gYW4gYXNjZW5kaW5nIG9yZGVyLiBUbyBjbGFpbSBhtHNwZWNpZmljIHBhZ2UsIHVzZSBgcGF5b3V0X3N0YWtlcnNfYnlfcGFnZWAuYADwSWYgYWxsIHBhZ2VzIGFyZSBjbGFpbWVkLCBpdCByZXR1cm5zIGFuIGVycm9yIGBJbnZhbGlkUGFnZWAuGHJlYm9uZAQBFHZhbHVl5AEwQmFsYW5jZU9mPFQ+ABMc3FJlYm9uZCBhIHBvcnRpb24gb2YgdGhlIHN0YXNoIHNjaGVkdWxlZCB0byBiZSB1bmxvY2tlZC4A1FRoZSBkaXNwYXRjaCBvcmlnaW4gbXVzdCBiZSBzaWduZWQgYnkgdGhlIGNvbnRyb2xsZXIuADQjIyBDb21wbGV4aXR50C0gVGltZSBjb21wbGV4aXR5OiBPKEwpLCB3aGVyZSBMIGlzIHVubG9ja2luZyBjaHVua3OILSBCb3VuZGVkIGJ5IGBNYXhVbmxvY2tpbmdDaHVua3NgLihyZWFwX3N0YXNoCAEUc3Rhc2gAATBUOjpBY2NvdW50SWQAAUhudW1fc2xhc2hpbmdfc3BhbnMQAQx1MzIAFEhdAVJlbW92ZSBhbGwgZGF0YSBzdHJ1Y3R1cmVzIGNvbmNlcm5pbmcgYSBzdGFrZXIvc3Rhc2ggb25jZSBpdCBpcyBhdCBhIHN0YXRlIHdoZXJlIGl0IGNhbgUBYmUgY29uc2lkZXJlZCBgZHVzdGAgaW4gdGhlIHN0YWtpbmcgc3lzdGVtLiBUaGUgcmVxdWlyZW1lbnRzIGFyZToABQExLiB0aGUgYHRvdGFsX2JhbGFuY2VgIG9mIHRoZSBzdGFzaCBpcyBiZWxvdyBleGlzdGVudGlhbCBkZXBvc2l0LhEBMi4gb3IsIHRoZSBgbGVkZ2VyLnRvdGFsYCBvZiB0aGUgc3Rhc2ggaXMgYmVsb3cgZXhpc3RlbnRpYWwgZGVwb3NpdC5hATMuIG9yLCBleGlzdGVudGlhbCBkZXBvc2l0IGlzIHplcm8gYW5kIGVpdGhlciBgdG90YWxfYmFsYW5jZWAgb3IgYGxlZGdlci50b3RhbGAgaXMgemVyby4AVQFUaGUgZm9ybWVyIGNhbiBoYXBwZW4gaW4gY2FzZXMgbGlrZSBhIHNsYXNoOyB0aGUgbGF0dGVyIHdoZW4gYSBmdWxseSB1bmJvbmRlZCBhY2NvdW50CQFpcyBzdGlsbCByZWNlaXZpbmcgc3Rha2luZyByZXdhcmRzIGluIGBSZXdhcmREZXN0aW5hdGlvbjo6U3Rha2VkYC4AMQFJdCBjYW4gYmUgY2FsbGVkIGJ5IGFueW9uZSwgYXMgbG9uZyBhcyBgc3Rhc2hgIG1lZXRzIHRoZSBhYm92ZSByZXF1aXJlbWVudHMuANxSZWZ1bmRzIHRoZSB0cmFuc2FjdGlvbiBmZWVzIHVwb24gc3VjY2Vzc2Z1bCBleGVjdXRpb24uADQjIyBQYXJhbWV0ZXJzAEUBLSBgbnVtX3NsYXNoaW5nX3NwYW5zYDogUmVmZXIgdG8gY29tbWVudHMgb24gW2BDYWxsOjp3aXRoZHJhd191bmJvbmRlZGBdIGZvciBtb3JlIGRldGFpbHMuEGtpY2sEAQx3aG+5AQFkVmVjPEFjY291bnRJZExvb2t1cE9mPFQ+PgAVLOBSZW1vdmUgdGhlIGdpdmVuIG5vbWluYXRpb25zIGZyb20gdGhlIGNhbGxpbmcgdmFsaWRhdG9yLgDYRWZmZWN0cyB3aWxsIGJlIGZlbHQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbmV4dCBlcmEuAFEBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8gYnkgdGhlIGNvbnRyb2xsZXIsIG5vdCB0aGUgc3Rhc2guAE0BLSBgd2hvYDogQSBsaXN0IG9mIG5vbWluYXRvciBzdGFzaCBhY2NvdW50cyB3aG8gYXJlIG5vbWluYXRpbmcgdGhpcyB2YWxpZGF0b3Igd2hpY2jAICBzaG91bGQgbm8gbG9uZ2VyIGJlIG5vbWluYXRpbmcgdGhpcyB2YWxpZGF0b3IuAFUBTm90ZTogTWFraW5nIHRoaXMgY2FsbCBvbmx5IG1ha2VzIHNlbnNlIGlmIHlvdSBmaXJzdCBzZXQgdGhlIHZhbGlkYXRvciBwcmVmZXJlbmNlcyB0b3hibG9jayBhbnkgZnVydGhlciBub21pbmF0aW9ucy5Mc2V0X3N0YWtpbmdfY29uZmlncxwBSG1pbl9ub21pbmF0b3JfYm9uZMUBAVhDb25maWdPcDxCYWxhbmNlT2Y8VD4+AAFIbWluX3ZhbGlkYXRvcl9ib25kxQEBWENvbmZpZ09wPEJhbGFuY2VPZjxUPj4AAUxtYXhfbm9taW5hdG9yX2NvdW50yQEBNENvbmZpZ09wPHUzMj4AAUxtYXhfdmFsaWRhdG9yX2NvdW50yQEBNENvbmZpZ09wPHUzMj4AATxjaGlsbF90aHJlc2hvbGTNAQFEQ29uZmlnT3A8UGVyY2VudD4AAThtaW5fY29tbWlzc2lvbtEBAURDb25maWdPcDxQZXJiaWxsPgABSG1heF9zdGFrZWRfcmV3YXJkc80BAURDb25maWdPcDxQZXJjZW50PgAWRKxVcGRhdGUgdGhlIHZhcmlvdXMgc3Rha2luZyBjb25maWd1cmF0aW9ucyAuACUBKiBgbWluX25vbWluYXRvcl9ib25kYDogVGhlIG1pbmltdW0gYWN0aXZlIGJvbmQgbmVlZGVkIHRvIGJlIGEgbm9taW5hdG9yLiUBKiBgbWluX3ZhbGlkYXRvcl9ib25kYDogVGhlIG1pbmltdW0gYWN0aXZlIGJvbmQgbmVlZGVkIHRvIGJlIGEgdmFsaWRhdG9yLlUBKiBgbWF4X25vbWluYXRvcl9jb3VudGA6IFRoZSBtYXggbnVtYmVyIG9mIHVzZXJzIHdobyBjYW4gYmUgYSBub21pbmF0b3IgYXQgb25jZS4gV2hlbpggIHNldCB0byBgTm9uZWAsIG5vIGxpbWl0IGlzIGVuZm9yY2VkLlUBKiBgbWF4X3ZhbGlkYXRvcl9jb3VudGA6IFRoZSBtYXggbnVtYmVyIG9mIHVzZXJzIHdobyBjYW4gYmUgYSB2YWxpZGF0b3IgYXQgb25jZS4gV2hlbpggIHNldCB0byBgTm9uZWAsIG5vIGxpbWl0IGlzIGVuZm9yY2VkLlkBKiBgY2hpbGxfdGhyZXNob2xkYDogVGhlIHJhdGlvIG9mIGBtYXhfbm9taW5hdG9yX2NvdW50YCBvciBgbWF4X3ZhbGlkYXRvcl9jb3VudGAgd2hpY2gZASAgc2hvdWxkIGJlIGZpbGxlZCBpbiBvcmRlciBmb3IgdGhlIGBjaGlsbF9vdGhlcmAgdHJhbnNhY3Rpb24gdG8gd29yay5hASogYG1pbl9jb21taXNzaW9uYDogVGhlIG1pbmltdW0gYW1vdW50IG9mIGNvbW1pc3Npb24gdGhhdCBlYWNoIHZhbGlkYXRvcnMgbXVzdCBtYWludGFpbi5VASAgVGhpcyBpcyBjaGVja2VkIG9ubHkgdXBvbiBjYWxsaW5nIGB2YWxpZGF0ZWAuIEV4aXN0aW5nIHZhbGlkYXRvcnMgYXJlIG5vdCBhZmZlY3RlZC4AxFJ1bnRpbWVPcmlnaW4gbXVzdCBiZSBSb290IHRvIGNhbGwgdGhpcyBmdW5jdGlvbi4ANQFOT1RFOiBFeGlzdGluZyBub21pbmF0b3JzIGFuZCB2YWxpZGF0b3JzIHdpbGwgbm90IGJlIGFmZmVjdGVkIGJ5IHRoaXMgdXBkYXRlLhEBdG8ga2ljayBwZW9wbGUgdW5kZXIgdGhlIG5ldyBsaW1pdHMsIGBjaGlsbF9vdGhlcmAgc2hvdWxkIGJlIGNhbGxlZC4sY2hpbGxfb3RoZXIEARRzdGFzaAABMFQ6OkFjY291bnRJZAAXaEEBRGVjbGFyZSBhIGBjb250cm9sbGVyYCB0byBzdG9wIHBhcnRpY2lwYXRpbmcgYXMgZWl0aGVyIGEgdmFsaWRhdG9yIG9yIG5vbWluYXRvci4A2EVmZmVjdHMgd2lsbCBiZSBmZWx0IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIG5leHQgZXJhLgBBAVRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfLCBidXQgY2FuIGJlIGNhbGxlZCBieSBhbnlvbmUuAFkBSWYgdGhlIGNhbGxlciBpcyB0aGUgc2FtZSBhcyB0aGUgY29udHJvbGxlciBiZWluZyB0YXJnZXRlZCwgdGhlbiBubyBmdXJ0aGVyIGNoZWNrcyBhcmXYZW5mb3JjZWQsIGFuZCB0aGlzIGZ1bmN0aW9uIGJlaGF2ZXMganVzdCBsaWtlIGBjaGlsbGAuAF0BSWYgdGhlIGNhbGxlciBpcyBkaWZmZXJlbnQgdGhhbiB0aGUgY29udHJvbGxlciBiZWluZyB0YXJnZXRlZCwgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zMG11c3QgYmUgbWV0OgAdASogYGNvbnRyb2xsZXJgIG11c3QgYmVsb25nIHRvIGEgbm9taW5hdG9yIHdobyBoYXMgYmVjb21lIG5vbi1kZWNvZGFibGUsAAxPcjoAPQEqIEEgYENoaWxsVGhyZXNob2xkYCBtdXN0IGJlIHNldCBhbmQgY2hlY2tlZCB3aGljaCBkZWZpbmVzIGhvdyBjbG9zZSB0byB0aGUgbWF4VQEgIG5vbWluYXRvcnMgb3IgdmFsaWRhdG9ycyB3ZSBtdXN0IHJlYWNoIGJlZm9yZSB1c2VycyBjYW4gc3RhcnQgY2hpbGxpbmcgb25lLWFub3RoZXIuWQEqIEEgYE1heE5vbWluYXRvckNvdW50YCBhbmQgYE1heFZhbGlkYXRvckNvdW50YCBtdXN0IGJlIHNldCB3aGljaCBpcyB1c2VkIHRvIGRldGVybWluZZAgIGhvdyBjbG9zZSB3ZSBhcmUgdG8gdGhlIHRocmVzaG9sZC5dASogQSBgTWluTm9taW5hdG9yQm9uZGAgYW5kIGBNaW5WYWxpZGF0b3JCb25kYCBtdXN0IGJlIHNldCBhbmQgY2hlY2tlZCwgd2hpY2ggZGV0ZXJtaW5lc1EBICBpZiB0aGlzIGlzIGEgcGVyc29uIHRoYXQgc2hvdWxkIGJlIGNoaWxsZWQgYmVjYXVzZSB0aGV5IGhhdmUgbm90IG1ldCB0aGUgdGhyZXNob2xkQCAgYm9uZCByZXF1aXJlZC4AVQFUaGlzIGNhbiBiZSBoZWxwZnVsIGlmIGJvbmQgcmVxdWlyZW1lbnRzIGFyZSB1cGRhdGVkLCBhbmQgd2UgbmVlZCB0byByZW1vdmUgb2xkIHVzZXJzmHdobyBkbyBub3Qgc2F0aXNmeSB0aGVzZSByZXF1aXJlbWVudHMuaGZvcmNlX2FwcGx5X21pbl9jb21taXNzaW9uBAE8dmFsaWRhdG9yX3N0YXNoAAEwVDo6QWNjb3VudElkABgMRQFGb3JjZSBhIHZhbGlkYXRvciB0byBoYXZlIGF0IGxlYXN0IHRoZSBtaW5pbXVtIGNvbW1pc3Npb24uIFRoaXMgd2lsbCBub3QgYWZmZWN0IGFhAXZhbGlkYXRvciB3aG8gYWxyZWFkeSBoYXMgYSBjb21taXNzaW9uIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgbWluaW11bS4gQW55IGFjY291bnQ4Y2FuIGNhbGwgdGhpcy5Ic2V0X21pbl9jb21taXNzaW9uBAEMbmV3lAEcUGVyYmlsbAAZECUBU2V0cyB0aGUgbWluaW11bSBhbW91bnQgb2YgY29tbWlzc2lvbiB0aGF0IGVhY2ggdmFsaWRhdG9ycyBtdXN0IG1haW50YWluLgBZAVRoaXMgY2FsbCBoYXMgbG93ZXIgcHJpdmlsZWdlIHJlcXVpcmVtZW50cyB0aGFuIGBzZXRfc3Rha2luZ19jb25maWdgIGFuZCBjYW4gYmUgY2FsbGVkzGJ5IHRoZSBgVDo6QWRtaW5PcmlnaW5gLiBSb290IGNhbiBhbHdheXMgY2FsbCB0aGlzLlhwYXlvdXRfc3Rha2Vyc19ieV9wYWdlDAE8dmFsaWRhdG9yX3N0YXNoAAEwVDo6QWNjb3VudElkAAEMZXJhEAEgRXJhSW5kZXgAARBwYWdlEAEQUGFnZQAaRDEBUGF5IG91dCBhIHBhZ2Ugb2YgdGhlIHN0YWtlcnMgYmVoaW5kIGEgdmFsaWRhdG9yIGZvciB0aGUgZ2l2ZW4gZXJhIGFuZCBwYWdlLgDoLSBgdmFsaWRhdG9yX3N0YXNoYCBpcyB0aGUgc3Rhc2ggYWNjb3VudCBvZiB0aGUgdmFsaWRhdG9yLjEBLSBgZXJhYCBtYXkgYmUgYW55IGVyYSBiZXR3ZWVuIGBbY3VycmVudF9lcmEgLSBoaXN0b3J5X2RlcHRoOyBjdXJyZW50X2VyYV1gLjEBLSBgcGFnZWAgaXMgdGhlIHBhZ2UgaW5kZXggb2Ygbm9taW5hdG9ycyB0byBwYXkgb3V0IHdpdGggdmFsdWUgYmV0d2VlbiAwIGFuZLAgIGBudW1fbm9taW5hdG9ycyAvIFQ6Ok1heEV4cG9zdXJlUGFnZVNpemVgLgBVAVRoZSBvcmlnaW4gb2YgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uIEFueSBhY2NvdW50IGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24sIGV2ZW4gaWZ0aXQgaXMgbm90IG9uZSBvZiB0aGUgc3Rha2Vycy4APQFJZiBhIHZhbGlkYXRvciBoYXMgbW9yZSB0aGFuIFtgQ29uZmlnOjpNYXhFeHBvc3VyZVBhZ2VTaXplYF0gbm9taW5hdG9ycyBiYWNraW5nKQF0aGVtLCB0aGVuIHRoZSBsaXN0IG9mIG5vbWluYXRvcnMgaXMgcGFnZWQsIHdpdGggZWFjaCBwYWdlIGJlaW5nIGNhcHBlZCBhdFUBW2BDb25maWc6Ok1heEV4cG9zdXJlUGFnZVNpemVgLl0gSWYgYSB2YWxpZGF0b3IgaGFzIG1vcmUgdGhhbiBvbmUgcGFnZSBvZiBub21pbmF0b3JzLEkBdGhlIGNhbGwgbmVlZHMgdG8gYmUgbWFkZSBmb3IgZWFjaCBwYWdlIHNlcGFyYXRlbHkgaW4gb3JkZXIgZm9yIGFsbCB0aGUgbm9taW5hdG9yc1UBYmFja2luZyBhIHZhbGlkYXRvciB0byByZWNlaXZlIHRoZSByZXdhcmQuIFRoZSBub21pbmF0b3JzIGFyZSBub3Qgc29ydGVkIGFjcm9zcyBwYWdlc2EBYW5kIHNvIGl0IHNob3VsZCBub3QgYmUgYXNzdW1lZCB0aGUgaGlnaGVzdCBzdGFrZXIgd291bGQgYmUgb24gdGhlIHRvcG1vc3QgcGFnZSBhbmQgdmljZUkBdmVyc2EuIElmIHJld2FyZHMgYXJlIG5vdCBjbGFpbWVkIGluIFtgQ29uZmlnOjpIaXN0b3J5RGVwdGhgXSBlcmFzLCB0aGV5IGFyZSBsb3N0LjB1cGRhdGVfcGF5ZWUEAShjb250cm9sbGVyAAEwVDo6QWNjb3VudElkABsY4E1pZ3JhdGVzIGFuIGFjY291bnQncyBgUmV3YXJkRGVzdGluYXRpb246OkNvbnRyb2xsZXJgIHRvpGBSZXdhcmREZXN0aW5hdGlvbjo6QWNjb3VudChjb250cm9sbGVyKWAuAFEBRWZmZWN0cyB3aWxsIGJlIGZlbHQgaW5zdGFudGx5IChhcyBzb29uIGFzIHRoaXMgZnVuY3Rpb24gaXMgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSkuADEBVGhpcyB3aWxsIHdhaXZlIHRoZSB0cmFuc2FjdGlvbiBmZWUgaWYgdGhlIGBwYXllZWAgaXMgc3VjY2Vzc2Z1bGx5IG1pZ3JhdGVkLmhkZXByZWNhdGVfY29udHJvbGxlcl9iYXRjaAQBLGNvbnRyb2xsZXJz1QEB9EJvdW5kZWRWZWM8VDo6QWNjb3VudElkLCBUOjpNYXhDb250cm9sbGVyc0luRGVwcmVjYXRpb25CYXRjaD4AHBxdAVVwZGF0ZXMgYSBiYXRjaCBvZiBjb250cm9sbGVyIGFjY291bnRzIHRvIHRoZWlyIGNvcnJlc3BvbmRpbmcgc3Rhc2ggYWNjb3VudCBpZiB0aGV5IGFyZWEBbm90IHRoZSBzYW1lLiBJZ25vcmVzIGFueSBjb250cm9sbGVyIGFjY291bnRzIHRoYXQgZG8gbm90IGV4aXN0LCBhbmQgZG9lcyBub3Qgb3BlcmF0ZSBpZrh0aGUgc3Rhc2ggYW5kIGNvbnRyb2xsZXIgYXJlIGFscmVhZHkgdGhlIHNhbWUuAFEBRWZmZWN0cyB3aWxsIGJlIGZlbHQgaW5zdGFudGx5IChhcyBzb29uIGFzIHRoaXMgZnVuY3Rpb24gaXMgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSkuALRUaGUgZGlzcGF0Y2ggb3JpZ2luIG11c3QgYmUgYFQ6OkFkbWluT3JpZ2luYC44cmVzdG9yZV9sZWRnZXIQARRzdGFzaAABMFQ6OkFjY291bnRJZAABQG1heWJlX2NvbnRyb2xsZXLZAQFQT3B0aW9uPFQ6OkFjY291bnRJZD4AASxtYXliZV90b3RhbN0BAVBPcHRpb248QmFsYW5jZU9mPFQ+PgABPG1heWJlX3VubG9ja2luZ+EBARUBT3B0aW9uPEJvdW5kZWRWZWM8VW5sb2NrQ2h1bms8QmFsYW5jZU9mPFQ+PiwgVDo6Ck1heFVubG9ja2luZ0NodW5rcz4+AB0sBQFSZXN0b3JlcyB0aGUgc3RhdGUgb2YgYSBsZWRnZXIgd2hpY2ggaXMgaW4gYW4gaW5jb25zaXN0ZW50IHN0YXRlLgDcVGhlIHJlcXVpcmVtZW50cyB0byByZXN0b3JlIGEgbGVkZ2VyIGFyZSB0aGUgZm9sbG93aW5nOmQqIFRoZSBzdGFzaCBpcyBib25kZWQ7IG9yDQEqIFRoZSBzdGFzaCBpcyBub3QgYm9uZGVkIGJ1dCBpdCBoYXMgYSBzdGFraW5nIGxvY2sgbGVmdCBiZWhpbmQ7IG9yJQEqIElmIHRoZSBzdGFzaCBoYXMgYW4gYXNzb2NpYXRlZCBsZWRnZXIgYW5kIGl0cyBzdGF0ZSBpcyBpbmNvbnNpc3RlbnQ7IG9yHQEqIElmIHRoZSBsZWRnZXIgaXMgbm90IGNvcnJ1cHRlZCAqYnV0KiBpdHMgc3Rha2luZyBsb2NrIGlzIG91dCBvZiBzeW5jLgBhAVRoZSBgbWF5YmVfKmAgaW5wdXQgcGFyYW1ldGVycyB3aWxsIG92ZXJ3cml0ZSB0aGUgY29ycmVzcG9uZGluZyBkYXRhIGFuZCBtZXRhZGF0YSBvZiB0aGVZAWxlZGdlciBhc3NvY2lhdGVkIHdpdGggdGhlIHN0YXNoLiBJZiB0aGUgaW5wdXQgcGFyYW1ldGVycyBhcmUgbm90IHNldCwgdGhlIGxlZGdlciB3aWxskGJlIHJlc2V0IHZhbHVlcyBmcm9tIG9uLWNoYWluIHN0YXRlLgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy65AQAAAp0BAL0BDDRzcF9hcml0aG1ldGljKHBlcl90aGluZ3McUGVyY2VudAAABAAIAQh1OAAAwQEAAAIQAMUBEDhwYWxsZXRfc3Rha2luZxhwYWxsZXQYcGFsbGV0IENvbmZpZ09wBARUARgBDBBOb29wAAAADFNldAQAGAEEVAABABhSZW1vdmUAAgAAyQEQOHBhbGxldF9zdGFraW5nGHBhbGxldBhwYWxsZXQgQ29uZmlnT3AEBFQBEAEMEE5vb3AAAAAMU2V0BAAQAQRUAAEAGFJlbW92ZQACAADNARA4cGFsbGV0X3N0YWtpbmcYcGFsbGV0GHBhbGxldCBDb25maWdPcAQEVAG9AQEMEE5vb3AAAAAMU2V0BAC9AQEEVAABABhSZW1vdmUAAgAA0QEQOHBhbGxldF9zdGFraW5nGHBhbGxldBhwYWxsZXQgQ29uZmlnT3AEBFQBlAEMEE5vb3AAAAAMU2V0BACUAQRUAAEAGFJlbW92ZQACAADVAQxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAQAEUwAABACtAQEYVmVjPFQ+AADZAQQYT3B0aW9uBARUAQABCBBOb25lAAAAEFNvbWUEAAAAAAEAAN0BBBhPcHRpb24EBFQBGAEIEE5vbmUAAAAQU29tZQQAGAAAAQAA4QEEGE9wdGlvbgQEVAHlAQEIEE5vbmUAAAAQU29tZQQA5QEAAAEAAOUBDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQB6QEEUwAABADtAQEYVmVjPFQ+AADpAQg4cGFsbGV0X3N0YWtpbmcsVW5sb2NrQ2h1bmsEHEJhbGFuY2UBGAAIARR2YWx1ZeQBHEJhbGFuY2UAAQxlcmHUASBFcmFJbmRleAAA7QEAAALpAQDxAQw4cGFsbGV0X3Nlc3Npb24YcGFsbGV0EENhbGwEBFQAAQggc2V0X2tleXMIARBrZXlz9QEBHFQ6OktleXMAARRwcm9vZjgBHFZlYzx1OD4AACTkU2V0cyB0aGUgc2Vzc2lvbiBrZXkocykgb2YgdGhlIGZ1bmN0aW9uIGNhbGxlciB0byBga2V5c2AuHQFBbGxvd3MgYW4gYWNjb3VudCB0byBzZXQgaXRzIHNlc3Npb24ga2V5IHByaW9yIHRvIGJlY29taW5nIGEgdmFsaWRhdG9yLsBUaGlzIGRvZXNuJ3QgdGFrZSBlZmZlY3QgdW50aWwgdGhlIG5leHQgc2Vzc2lvbi4A0FRoZSBkaXNwYXRjaCBvcmlnaW4gb2YgdGhpcyBmdW5jdGlvbiBtdXN0IGJlIHNpZ25lZC4ANCMjIENvbXBsZXhpdHlZAS0gYE8oMSlgLiBBY3R1YWwgY29zdCBkZXBlbmRzIG9uIHRoZSBudW1iZXIgb2YgbGVuZ3RoIG9mIGBUOjpLZXlzOjprZXlfaWRzKClgIHdoaWNoIGlzICAgZml4ZWQuKHB1cmdlX2tleXMAATDIUmVtb3ZlcyBhbnkgc2Vzc2lvbiBrZXkocykgb2YgdGhlIGZ1bmN0aW9uIGNhbGxlci4AwFRoaXMgZG9lc24ndCB0YWtlIGVmZmVjdCB1bnRpbCB0aGUgbmV4dCBzZXNzaW9uLgBVAVRoZSBkaXNwYXRjaCBvcmlnaW4gb2YgdGhpcyBmdW5jdGlvbiBtdXN0IGJlIFNpZ25lZCBhbmQgdGhlIGFjY291bnQgbXVzdCBiZSBlaXRoZXIgYmVdAWNvbnZlcnRpYmxlIHRvIGEgdmFsaWRhdG9yIElEIHVzaW5nIHRoZSBjaGFpbidzIHR5cGljYWwgYWRkcmVzc2luZyBzeXN0ZW0gKHRoaXMgdXN1YWxseVEBbWVhbnMgYmVpbmcgYSBjb250cm9sbGVyIGFjY291bnQpIG9yIGRpcmVjdGx5IGNvbnZlcnRpYmxlIGludG8gYSB2YWxpZGF0b3IgSUQgKHdoaWNolHVzdWFsbHkgbWVhbnMgYmVpbmcgYSBzdGFzaCBhY2NvdW50KS4ANCMjIENvbXBsZXhpdHk9AS0gYE8oMSlgIGluIG51bWJlciBvZiBrZXkgdHlwZXMuIEFjdHVhbCBjb3N0IGRlcGVuZHMgb24gdGhlIG51bWJlciBvZiBsZW5ndGggb2aYICBgVDo6S2V5czo6a2V5X2lkcygpYCB3aGljaCBpcyBmaXhlZC4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMu9QEIWHN0YWdpbmdfa3VzYW1hX3J1bnRpbWUsU2Vzc2lvbktleXMAABgBHGdyYW5kcGG8AdA8R3JhbmRwYSBhcyAkY3JhdGU6OkJvdW5kVG9SdW50aW1lQXBwUHVibGljPjo6UHVibGljAAEQYmFiZX0BAcQ8QmFiZSBhcyAkY3JhdGU6OkJvdW5kVG9SdW50aW1lQXBwUHVibGljPjo6UHVibGljAAE4cGFyYV92YWxpZGF0b3L5AQHgPEluaXRpYWxpemVyIGFzICRjcmF0ZTo6Qm91bmRUb1J1bnRpbWVBcHBQdWJsaWM+OjpQdWJsaWMAATxwYXJhX2Fzc2lnbm1lbnT9AQHwPFBhcmFTZXNzaW9uSW5mbyBhcyAkY3JhdGU6OkJvdW5kVG9SdW50aW1lQXBwUHVibGljPjo6UHVibGljAAFMYXV0aG9yaXR5X2Rpc2NvdmVyeQECAfw8QXV0aG9yaXR5RGlzY292ZXJ5IGFzICRjcmF0ZTo6Qm91bmRUb1J1bnRpbWVBcHBQdWJsaWM+OjpQdWJsaWMAARRiZWVmeQUCAcg8QmVlZnkgYXMgJGNyYXRlOjpCb3VuZFRvUnVudGltZUFwcFB1YmxpYz46OlB1YmxpYwAA+QEQTHBvbGthZG90X3ByaW1pdGl2ZXMIdjc0dmFsaWRhdG9yX2FwcBhQdWJsaWMAAAQABAE8c3IyNTUxOTo6UHVibGljAAD9ARBMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2Nzhhc3NpZ25tZW50X2FwcBhQdWJsaWMAAAQABAE8c3IyNTUxOTo6UHVibGljAAABAgxYc3BfYXV0aG9yaXR5X2Rpc2NvdmVyeQxhcHAYUHVibGljAAAEAAQBPHNyMjU1MTk6OlB1YmxpYwAABQIMSHNwX2NvbnNlbnN1c19iZWVmeTBlY2RzYV9jcnlwdG8YUHVibGljAAAEAAkCATRlY2RzYTo6UHVibGljAAAJAgAAAyEAAAAIAA0CDDhwYWxsZXRfZ3JhbmRwYRhwYWxsZXQQQ2FsbAQEVAABDExyZXBvcnRfZXF1aXZvY2F0aW9uCAFIZXF1aXZvY2F0aW9uX3Byb29mEQIByEJveDxFcXVpdm9jYXRpb25Qcm9vZjxUOjpIYXNoLCBCbG9ja051bWJlckZvcjxUPj4+AAE8a2V5X293bmVyX3Byb29mhQEBQFQ6OktleU93bmVyUHJvb2YAABAJAVJlcG9ydCB2b3RlciBlcXVpdm9jYXRpb24vbWlzYmVoYXZpb3IuIFRoaXMgbWV0aG9kIHdpbGwgdmVyaWZ5IHRoZfRlcXVpdm9jYXRpb24gcHJvb2YgYW5kIHZhbGlkYXRlIHRoZSBnaXZlbiBrZXkgb3duZXJzaGlwIHByb29m+GFnYWluc3QgdGhlIGV4dHJhY3RlZCBvZmZlbmRlci4gSWYgYm90aCBhcmUgdmFsaWQsIHRoZSBvZmZlbmNlRHdpbGwgYmUgcmVwb3J0ZWQucHJlcG9ydF9lcXVpdm9jYXRpb25fdW5zaWduZWQIAUhlcXVpdm9jYXRpb25fcHJvb2YRAgHIQm94PEVxdWl2b2NhdGlvblByb29mPFQ6Okhhc2gsIEJsb2NrTnVtYmVyRm9yPFQ+Pj4AATxrZXlfb3duZXJfcHJvb2aFAQFAVDo6S2V5T3duZXJQcm9vZgABJAkBUmVwb3J0IHZvdGVyIGVxdWl2b2NhdGlvbi9taXNiZWhhdmlvci4gVGhpcyBtZXRob2Qgd2lsbCB2ZXJpZnkgdGhl9GVxdWl2b2NhdGlvbiBwcm9vZiBhbmQgdmFsaWRhdGUgdGhlIGdpdmVuIGtleSBvd25lcnNoaXAgcHJvb2b4YWdhaW5zdCB0aGUgZXh0cmFjdGVkIG9mZmVuZGVyLiBJZiBib3RoIGFyZSB2YWxpZCwgdGhlIG9mZmVuY2VEd2lsbCBiZSByZXBvcnRlZC4ADQFUaGlzIGV4dHJpbnNpYyBtdXN0IGJlIGNhbGxlZCB1bnNpZ25lZCBhbmQgaXQgaXMgZXhwZWN0ZWQgdGhhdCBvbmx5FQFibG9jayBhdXRob3JzIHdpbGwgY2FsbCBpdCAodmFsaWRhdGVkIGluIGBWYWxpZGF0ZVVuc2lnbmVkYCksIGFzIHN1Y2gVAWlmIHRoZSBibG9jayBhdXRob3IgaXMgZGVmaW5lZCBpdCB3aWxsIGJlIGRlZmluZWQgYXMgdGhlIGVxdWl2b2NhdGlvbiRyZXBvcnRlci4wbm90ZV9zdGFsbGVkCAEUZGVsYXkQAURCbG9ja051bWJlckZvcjxUPgABbGJlc3RfZmluYWxpemVkX2Jsb2NrX251bWJlchABREJsb2NrTnVtYmVyRm9yPFQ+AAIwPQFOb3RlIHRoYXQgdGhlIGN1cnJlbnQgYXV0aG9yaXR5IHNldCBvZiB0aGUgR1JBTkRQQSBmaW5hbGl0eSBnYWRnZXQgaGFzIHN0YWxsZWQuAGEBVGhpcyB3aWxsIHRyaWdnZXIgYSBmb3JjZWQgYXV0aG9yaXR5IHNldCBjaGFuZ2UgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbmV4dCBzZXNzaW9uLCB0b2EBYmUgZW5hY3RlZCBgZGVsYXlgIGJsb2NrcyBhZnRlciB0aGF0LiBUaGUgYGRlbGF5YCBzaG91bGQgYmUgaGlnaCBlbm91Z2ggdG8gc2FmZWx5IGFzc3VtZUkBdGhhdCB0aGUgYmxvY2sgc2lnbmFsbGluZyB0aGUgZm9yY2VkIGNoYW5nZSB3aWxsIG5vdCBiZSByZS1vcmdlZCBlLmcuIDEwMDAgYmxvY2tzLl0BVGhlIGJsb2NrIHByb2R1Y3Rpb24gcmF0ZSAod2hpY2ggbWF5IGJlIHNsb3dlZCBkb3duIGJlY2F1c2Ugb2YgZmluYWxpdHkgbGFnZ2luZykgc2hvdWxkUQFiZSB0YWtlbiBpbnRvIGFjY291bnQgd2hlbiBjaG9vc2luZyB0aGUgYGRlbGF5YC4gVGhlIEdSQU5EUEEgdm90ZXJzIGJhc2VkIG9uIHRoZSBuZXdVAWF1dGhvcml0eSB3aWxsIHN0YXJ0IHZvdGluZyBvbiB0b3Agb2YgYGJlc3RfZmluYWxpemVkX2Jsb2NrX251bWJlcmAgZm9yIG5ldyBmaW5hbGl6ZWRNAWJsb2Nrcy4gYGJlc3RfZmluYWxpemVkX2Jsb2NrX251bWJlcmAgc2hvdWxkIGJlIHRoZSBoaWdoZXN0IG9mIHRoZSBsYXRlc3QgZmluYWxpemVkxGJsb2NrIG9mIGFsbCB2YWxpZGF0b3JzIG9mIHRoZSBuZXcgYXV0aG9yaXR5IHNldC4AWE9ubHkgY2FsbGFibGUgYnkgcm9vdC4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMuEQIIUHNwX2NvbnNlbnN1c19ncmFuZHBhREVxdWl2b2NhdGlvblByb29mCARIATQETgEQAAgBGHNldF9pZDABFFNldElkAAEwZXF1aXZvY2F0aW9uFQIBSEVxdWl2b2NhdGlvbjxILCBOPgAAFQIIUHNwX2NvbnNlbnN1c19ncmFuZHBhMEVxdWl2b2NhdGlvbggESAE0BE4BEAEIHFByZXZvdGUEABkCAYkBZmluYWxpdHlfZ3JhbmRwYTo6RXF1aXZvY2F0aW9uPEF1dGhvcml0eUlkLCBmaW5hbGl0eV9ncmFuZHBhOjpQcmV2b3RlPApILCBOPiwgQXV0aG9yaXR5U2lnbmF0dXJlLD4AAAAkUHJlY29tbWl0BAAtAgGRAWZpbmFsaXR5X2dyYW5kcGE6OkVxdWl2b2NhdGlvbjxBdXRob3JpdHlJZCwgZmluYWxpdHlfZ3JhbmRwYTo6UHJlY29tbWl0CjxILCBOPiwgQXV0aG9yaXR5U2lnbmF0dXJlLD4AAQAAGQIIQGZpbmFsaXR5X2dyYW5kcGEwRXF1aXZvY2F0aW9uDAhJZAG8BFYBHQIEUwEhAgAQATByb3VuZF9udW1iZXIwAQx1NjQAASBpZGVudGl0ebwBCElkAAEUZmlyc3QpAgEYKFYsIFMpAAEYc2Vjb25kKQIBGChWLCBTKQAAHQIIQGZpbmFsaXR5X2dyYW5kcGEcUHJldm90ZQgESAE0BE4BEAAIASx0YXJnZXRfaGFzaDQBBEgAATR0YXJnZXRfbnVtYmVyEAEETgAAIQIMUHNwX2NvbnNlbnN1c19ncmFuZHBhDGFwcCRTaWduYXR1cmUAAAQAJQIBSGVkMjU1MTk6OlNpZ25hdHVyZQAAJQIAAANAAAAACAApAgAABAgdAiECAC0CCEBmaW5hbGl0eV9ncmFuZHBhMEVxdWl2b2NhdGlvbgwISWQBvARWATECBFMBIQIAEAEwcm91bmRfbnVtYmVyMAEMdTY0AAEgaWRlbnRpdHm8AQhJZAABFGZpcnN0NQIBGChWLCBTKQABGHNlY29uZDUCARgoViwgUykAADECCEBmaW5hbGl0eV9ncmFuZHBhJFByZWNvbW1pdAgESAE0BE4BEAAIASx0YXJnZXRfaGFzaDQBBEgAATR0YXJnZXRfbnVtYmVyEAEETgAANQIAAAQIMQIhAgA5Agw8cGFsbGV0X3RyZWFzdXJ5GHBhbGxldBBDYWxsCARUAARJAAEYLHNwZW5kX2xvY2FsCAEYYW1vdW505AE8QmFsYW5jZU9mPFQsIEk+AAEsYmVuZWZpY2lhcnmdAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AA0S4UHJvcG9zZSBhbmQgYXBwcm92ZSBhIHNwZW5kIG9mIHRyZWFzdXJ5IGZ1bmRzLgBIIyMgRGlzcGF0Y2ggT3JpZ2luAEUBTXVzdCBiZSBbYENvbmZpZzo6U3BlbmRPcmlnaW5gXSB3aXRoIHRoZSBgU3VjY2Vzc2AgdmFsdWUgYmVpbmcgYXQgbGVhc3QgYGFtb3VudGAuACwjIyMgRGV0YWlsc0UBTk9URTogRm9yIHJlY29yZC1rZWVwaW5nIHB1cnBvc2VzLCB0aGUgcHJvcG9zZXIgaXMgZGVlbWVkIHRvIGJlIGVxdWl2YWxlbnQgdG8gdGhlMGJlbmVmaWNpYXJ5LgA4IyMjIFBhcmFtZXRlcnNBAS0gYGFtb3VudGA6IFRoZSBhbW91bnQgdG8gYmUgdHJhbnNmZXJyZWQgZnJvbSB0aGUgdHJlYXN1cnkgdG8gdGhlIGBiZW5lZmljaWFyeWAu6C0gYGJlbmVmaWNpYXJ5YDogVGhlIGRlc3RpbmF0aW9uIGFjY291bnQgZm9yIHRoZSB0cmFuc2Zlci4AJCMjIEV2ZW50cwC0RW1pdHMgW2BFdmVudDo6U3BlbmRBcHByb3ZlZGBdIGlmIHN1Y2Nlc3NmdWwuPHJlbW92ZV9hcHByb3ZhbAQBLHByb3Bvc2FsX2lk1AE0UHJvcG9zYWxJbmRleAAEVC0BRm9yY2UgYSBwcmV2aW91c2x5IGFwcHJvdmVkIHByb3Bvc2FsIHRvIGJlIHJlbW92ZWQgZnJvbSB0aGUgYXBwcm92YWwgcXVldWUuAEgjIyBEaXNwYXRjaCBPcmlnaW4AhE11c3QgYmUgW2BDb25maWc6OlJlamVjdE9yaWdpbmBdLgAoIyMgRGV0YWlscwDAVGhlIG9yaWdpbmFsIGRlcG9zaXQgd2lsbCBubyBsb25nZXIgYmUgcmV0dXJuZWQuADgjIyMgUGFyYW1ldGVyc6AtIGBwcm9wb3NhbF9pZGA6IFRoZSBpbmRleCBvZiBhIHByb3Bvc2FsADgjIyMgQ29tcGxleGl0eawtIE8oQSkgd2hlcmUgYEFgIGlzIHRoZSBudW1iZXIgb2YgYXBwcm92YWxzACgjIyMgRXJyb3JzRQEtIFtgRXJyb3I6OlByb3Bvc2FsTm90QXBwcm92ZWRgXTogVGhlIGBwcm9wb3NhbF9pZGAgc3VwcGxpZWQgd2FzIG5vdCBmb3VuZCBpbiB0aGVRASAgYXBwcm92YWwgcXVldWUsIGkuZS4sIHRoZSBwcm9wb3NhbCBoYXMgbm90IGJlZW4gYXBwcm92ZWQuIFRoaXMgY291bGQgYWxzbyBtZWFuIHRoZVkBICBwcm9wb3NhbCBkb2VzIG5vdCBleGlzdCBhbHRvZ2V0aGVyLCB0aHVzIHRoZXJlIGlzIG5vIHdheSBpdCB3b3VsZCBoYXZlIGJlZW4gYXBwcm92ZWRUICBpbiB0aGUgZmlyc3QgcGxhY2UuFHNwZW5kEAEoYXNzZXRfa2luZMQBREJveDxUOjpBc3NldEtpbmQ+AAEYYW1vdW505AFQQXNzZXRCYWxhbmNlT2Y8VCwgST4AASxiZW5lZmljaWFyeS0BAXhCb3g8QmVuZWZpY2lhcnlMb29rdXBPZjxULCBJPj4AASh2YWxpZF9mcm9tPQIBZE9wdGlvbjxCbG9ja051bWJlckZvcjxUPj4ABWi4UHJvcG9zZSBhbmQgYXBwcm92ZSBhIHNwZW5kIG9mIHRyZWFzdXJ5IGZ1bmRzLgBIIyMgRGlzcGF0Y2ggT3JpZ2luAB0BTXVzdCBiZSBbYENvbmZpZzo6U3BlbmRPcmlnaW5gXSB3aXRoIHRoZSBgU3VjY2Vzc2AgdmFsdWUgYmVpbmcgYXQgbGVhc3RVAWBhbW91bnRgIG9mIGBhc3NldF9raW5kYCBpbiB0aGUgbmF0aXZlIGFzc2V0LiBUaGUgYW1vdW50IG9mIGBhc3NldF9raW5kYCBpcyBjb252ZXJ0ZWTUZm9yIGFzc2VydGlvbiB1c2luZyB0aGUgW2BDb25maWc6OkJhbGFuY2VDb252ZXJ0ZXJgXS4AKCMjIERldGFpbHMASQFDcmVhdGUgYW4gYXBwcm92ZWQgc3BlbmQgZm9yIHRyYW5zZmVycmluZyBhIHNwZWNpZmljIGBhbW91bnRgIG9mIGBhc3NldF9raW5kYCB0byBhYQFkZXNpZ25hdGVkIGJlbmVmaWNpYXJ5LiBUaGUgc3BlbmQgbXVzdCBiZSBjbGFpbWVkIHVzaW5nIHRoZSBgcGF5b3V0YCBkaXNwYXRjaGFibGUgd2l0aGludHRoZSBbYENvbmZpZzo6UGF5b3V0UGVyaW9kYF0uADgjIyMgUGFyYW1ldGVycxUBLSBgYXNzZXRfa2luZGA6IEFuIGluZGljYXRvciBvZiB0aGUgc3BlY2lmaWMgYXNzZXQgY2xhc3MgdG8gYmUgc3BlbnQuQQEtIGBhbW91bnRgOiBUaGUgYW1vdW50IHRvIGJlIHRyYW5zZmVycmVkIGZyb20gdGhlIHRyZWFzdXJ5IHRvIHRoZSBgYmVuZWZpY2lhcnlgLrgtIGBiZW5lZmljaWFyeWA6IFRoZSBiZW5lZmljaWFyeSBvZiB0aGUgc3BlbmQuVQEtIGB2YWxpZF9mcm9tYDogVGhlIGJsb2NrIG51bWJlciBmcm9tIHdoaWNoIHRoZSBzcGVuZCBjYW4gYmUgY2xhaW1lZC4gSXQgY2FuIHJlZmVyIHRvGQEgIHRoZSBwYXN0IGlmIHRoZSByZXN1bHRpbmcgc3BlbmQgaGFzIG5vdCB5ZXQgZXhwaXJlZCBhY2NvcmRpbmcgdG8gdGhlRQEgIFtgQ29uZmlnOjpQYXlvdXRQZXJpb2RgXS4gSWYgYE5vbmVgLCB0aGUgc3BlbmQgY2FuIGJlIGNsYWltZWQgaW1tZWRpYXRlbHkgYWZ0ZXIsICBhcHByb3ZhbC4AJCMjIEV2ZW50cwDIRW1pdHMgW2BFdmVudDo6QXNzZXRTcGVuZEFwcHJvdmVkYF0gaWYgc3VjY2Vzc2Z1bC4YcGF5b3V0BAEUaW5kZXgQAShTcGVuZEluZGV4AAZMOENsYWltIGEgc3BlbmQuAEgjIyBEaXNwYXRjaCBPcmlnaW4AOE11c3QgYmUgc2lnbmVkACgjIyBEZXRhaWxzAFUBU3BlbmRzIG11c3QgYmUgY2xhaW1lZCB3aXRoaW4gc29tZSB0ZW1wb3JhbCBib3VuZHMuIEEgc3BlbmQgbWF5IGJlIGNsYWltZWQgd2l0aGluIG9uZdRbYENvbmZpZzo6UGF5b3V0UGVyaW9kYF0gZnJvbSB0aGUgYHZhbGlkX2Zyb21gIGJsb2NrLlUBSW4gY2FzZSBvZiBhIHBheW91dCBmYWlsdXJlLCB0aGUgc3BlbmQgc3RhdHVzIG11c3QgYmUgdXBkYXRlZCB3aXRoIHRoZSBgY2hlY2tfc3RhdHVzYNxkaXNwYXRjaGFibGUgYmVmb3JlIHJldHJ5aW5nIHdpdGggdGhlIGN1cnJlbnQgZnVuY3Rpb24uADgjIyMgUGFyYW1ldGVyc2wtIGBpbmRleGA6IFRoZSBzcGVuZCBpbmRleC4AJCMjIEV2ZW50cwCQRW1pdHMgW2BFdmVudDo6UGFpZGBdIGlmIHN1Y2Nlc3NmdWwuMGNoZWNrX3N0YXR1cwQBFGluZGV4EAEoU3BlbmRJbmRleAAHTCkBQ2hlY2sgdGhlIHN0YXR1cyBvZiB0aGUgc3BlbmQgYW5kIHJlbW92ZSBpdCBmcm9tIHRoZSBzdG9yYWdlIGlmIHByb2Nlc3NlZC4ASCMjIERpc3BhdGNoIE9yaWdpbgA8TXVzdCBiZSBzaWduZWQuACgjIyBEZXRhaWxzAAEBVGhlIHN0YXR1cyBjaGVjayBpcyBhIHByZXJlcXVpc2l0ZSBmb3IgcmV0cnlpbmcgYSBmYWlsZWQgcGF5b3V0LkkBSWYgYSBzcGVuZCBoYXMgZWl0aGVyIHN1Y2NlZWRlZCBvciBleHBpcmVkLCBpdCBpcyByZW1vdmVkIGZyb20gdGhlIHN0b3JhZ2UgYnkgdGhpc+xmdW5jdGlvbi4gSW4gc3VjaCBpbnN0YW5jZXMsIHRyYW5zYWN0aW9uIGZlZXMgYXJlIHJlZnVuZGVkLgA4IyMjIFBhcmFtZXRlcnNsLSBgaW5kZXhgOiBUaGUgc3BlbmQgaW5kZXguACQjIyBFdmVudHMA+EVtaXRzIFtgRXZlbnQ6OlBheW1lbnRGYWlsZWRgXSBpZiB0aGUgc3BlbmQgcGF5b3V0IGhhcyBmYWlsZWQuAQFFbWl0cyBbYEV2ZW50OjpTcGVuZFByb2Nlc3NlZGBdIGlmIHRoZSBzcGVuZCBwYXlvdXQgaGFzIHN1Y2NlZWQuKHZvaWRfc3BlbmQEARRpbmRleBABKFNwZW5kSW5kZXgACEB8Vm9pZCBwcmV2aW91c2x5IGFwcHJvdmVkIHNwZW5kLgBIIyMgRGlzcGF0Y2ggT3JpZ2luAIRNdXN0IGJlIFtgQ29uZmlnOjpSZWplY3RPcmlnaW5gXS4AKCMjIERldGFpbHMAHQFBIHNwZW5kIHZvaWQgaXMgb25seSBwb3NzaWJsZSBpZiB0aGUgcGF5b3V0IGhhcyBub3QgYmVlbiBhdHRlbXB0ZWQgeWV0LgA4IyMjIFBhcmFtZXRlcnNsLSBgaW5kZXhgOiBUaGUgc3BlbmQgaW5kZXguACQjIyBFdmVudHMAwEVtaXRzIFtgRXZlbnQ6OkFzc2V0U3BlbmRWb2lkZWRgXSBpZiBzdWNjZXNzZnVsLgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy49AgQYT3B0aW9uBARUARABCBBOb25lAAAAEFNvbWUEABAAAAEAAEECDGBwYWxsZXRfY29udmljdGlvbl92b3RpbmcYcGFsbGV0EENhbGwIBFQABEkAARgQdm90ZQgBKHBvbGxfaW5kZXjUAURQb2xsSW5kZXhPZjxULCBJPgABEHZvdGVFAgFwQWNjb3VudFZvdGU8QmFsYW5jZU9mPFQsIEk+PgAAJBkBVm90ZSBpbiBhIHBvbGwuIElmIGB2b3RlLmlzX2F5ZSgpYCwgdGhlIHZvdGUgaXMgdG8gZW5hY3QgdGhlIHByb3Bvc2FsO7hvdGhlcndpc2UgaXQgaXMgYSB2b3RlIHRvIGtlZXAgdGhlIHN0YXR1cyBxdW8uAMhUaGUgZGlzcGF0Y2ggb3JpZ2luIG9mIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfLgDILSBgcG9sbF9pbmRleGA6IFRoZSBpbmRleCBvZiB0aGUgcG9sbCB0byB2b3RlIGZvci6ELSBgdm90ZWA6IFRoZSB2b3RlIGNvbmZpZ3VyYXRpb24uABUBV2VpZ2h0OiBgTyhSKWAgd2hlcmUgUiBpcyB0aGUgbnVtYmVyIG9mIHBvbGxzIHRoZSB2b3RlciBoYXMgdm90ZWQgb24uIGRlbGVnYXRlEAEUY2xhc3NVAQE0Q2xhc3NPZjxULCBJPgABCHRvnQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEoY29udmljdGlvbk0CAShDb252aWN0aW9uAAEcYmFsYW5jZRgBPEJhbGFuY2VPZjxULCBJPgABXE0BRGVsZWdhdGUgdGhlIHZvdGluZyBwb3dlciAod2l0aCBzb21lIGdpdmVuIGNvbnZpY3Rpb24pIG9mIHRoZSBzZW5kaW5nIGFjY291bnQgZm9yIGFocGFydGljdWxhciBjbGFzcyBvZiBwb2xscy4AVQFUaGUgYmFsYW5jZSBkZWxlZ2F0ZWQgaXMgbG9ja2VkIGZvciBhcyBsb25nIGFzIGl0J3MgZGVsZWdhdGVkLCBhbmQgdGhlcmVhZnRlciBmb3IgdGhlyHRpbWUgYXBwcm9wcmlhdGUgZm9yIHRoZSBjb252aWN0aW9uJ3MgbG9jayBwZXJpb2QuAF0BVGhlIGRpc3BhdGNoIG9yaWdpbiBvZiB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXywgYW5kIHRoZSBzaWduaW5nIGFjY291bnQgbXVzdCBlaXRoZXI6dCAgLSBiZSBkZWxlZ2F0aW5nIGFscmVhZHk7IG9yRQEgIC0gaGF2ZSBubyB2b3RpbmcgYWN0aXZpdHkgKGlmIHRoZXJlIGlzLCB0aGVuIGl0IHdpbGwgbmVlZCB0byBiZSByZW1vdmVkIHRocm91Z2hMICAgIGByZW1vdmVfdm90ZWApLgBFAS0gYHRvYDogVGhlIGFjY291bnQgd2hvc2Ugdm90aW5nIHRoZSBgdGFyZ2V0YCBhY2NvdW50J3Mgdm90aW5nIHBvd2VyIHdpbGwgZm9sbG93Ll0BLSBgY2xhc3NgOiBUaGUgY2xhc3Mgb2YgcG9sbHMgdG8gZGVsZWdhdGUuIFRvIGRlbGVnYXRlIG11bHRpcGxlIGNsYXNzZXMsIG11bHRpcGxlIGNhbGxzgCAgdG8gdGhpcyBmdW5jdGlvbiBhcmUgcmVxdWlyZWQuVQEtIGBjb252aWN0aW9uYDogVGhlIGNvbnZpY3Rpb24gdGhhdCB3aWxsIGJlIGF0dGFjaGVkIHRvIHRoZSBkZWxlZ2F0ZWQgdm90ZXMuIFdoZW4gdGhlQQEgIGFjY291bnQgaXMgdW5kZWxlZ2F0ZWQsIHRoZSBmdW5kcyB3aWxsIGJlIGxvY2tlZCBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgcGVyaW9kLmEBLSBgYmFsYW5jZWA6IFRoZSBhbW91bnQgb2YgdGhlIGFjY291bnQncyBiYWxhbmNlIHRvIGJlIHVzZWQgaW4gZGVsZWdhdGluZy4gVGhpcyBtdXN0IG5vdLQgIGJlIG1vcmUgdGhhbiB0aGUgYWNjb3VudCdzIGN1cnJlbnQgYmFsYW5jZS4ASEVtaXRzIGBEZWxlZ2F0ZWRgLgAlAVdlaWdodDogYE8oUilgIHdoZXJlIFIgaXMgdGhlIG51bWJlciBvZiBwb2xscyB0aGUgdm90ZXIgZGVsZWdhdGluZyB0byBoYXNNASAgdm90ZWQgb24uIFdlaWdodCBpcyBpbml0aWFsbHkgY2hhcmdlZCBhcyBpZiBtYXhpbXVtIHZvdGVzLCBidXQgaXMgcmVmdW5kZWQgbGF0ZXIuKHVuZGVsZWdhdGUEARRjbGFzc1UBATRDbGFzc09mPFQsIEk+AAI4TQFVbmRlbGVnYXRlIHRoZSB2b3RpbmcgcG93ZXIgb2YgdGhlIHNlbmRpbmcgYWNjb3VudCBmb3IgYSBwYXJ0aWN1bGFyIGNsYXNzIG9mIHBvbGxzLgBdAVRva2VucyBtYXkgYmUgdW5sb2NrZWQgZm9sbG93aW5nIG9uY2UgYW4gYW1vdW50IG9mIHRpbWUgY29uc2lzdGVudCB3aXRoIHRoZSBsb2NrIHBlcmlvZAkBb2YgdGhlIGNvbnZpY3Rpb24gd2l0aCB3aGljaCB0aGUgZGVsZWdhdGlvbiB3YXMgaXNzdWVkIGhhcyBwYXNzZWQuAEUBVGhlIGRpc3BhdGNoIG9yaWdpbiBvZiB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXyBhbmQgdGhlIHNpZ25pbmcgYWNjb3VudCBtdXN0IGJlVGN1cnJlbnRseSBkZWxlZ2F0aW5nLgDwLSBgY2xhc3NgOiBUaGUgY2xhc3Mgb2YgcG9sbHMgdG8gcmVtb3ZlIHRoZSBkZWxlZ2F0aW9uIGZyb20uAFBFbWl0cyBgVW5kZWxlZ2F0ZWRgLgAlAVdlaWdodDogYE8oUilgIHdoZXJlIFIgaXMgdGhlIG51bWJlciBvZiBwb2xscyB0aGUgdm90ZXIgZGVsZWdhdGluZyB0byBoYXNNASAgdm90ZWQgb24uIFdlaWdodCBpcyBpbml0aWFsbHkgY2hhcmdlZCBhcyBpZiBtYXhpbXVtIHZvdGVzLCBidXQgaXMgcmVmdW5kZWQgbGF0ZXIuGHVubG9jawgBFGNsYXNzVQEBNENsYXNzT2Y8VCwgST4AARh0YXJnZXSdAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AAyRdAVJlbW92ZSB0aGUgbG9jayBjYXVzZWQgYnkgcHJpb3Igdm90aW5nL2RlbGVnYXRpbmcgd2hpY2ggaGFzIGV4cGlyZWQgd2l0aGluIGEgcGFydGljdWxhchhjbGFzcy4AyFRoZSBkaXNwYXRjaCBvcmlnaW4gb2YgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uAKAtIGBjbGFzc2A6IFRoZSBjbGFzcyBvZiBwb2xscyB0byB1bmxvY2suuC0gYHRhcmdldGA6IFRoZSBhY2NvdW50IHRvIHJlbW92ZSB0aGUgbG9jayBvbi4AvFdlaWdodDogYE8oUilgIHdpdGggUiBudW1iZXIgb2Ygdm90ZSBvZiB0YXJnZXQuLHJlbW92ZV92b3RlCAEUY2xhc3NRAgFUT3B0aW9uPENsYXNzT2Y8VCwgST4+AAEUaW5kZXgQAURQb2xsSW5kZXhPZjxULCBJPgAEdGRSZW1vdmUgYSB2b3RlIGZvciBhIHBvbGwuAAxJZjpwLSB0aGUgcG9sbCB3YXMgY2FuY2VsbGVkLCBvcmQtIHRoZSBwb2xsIGlzIG9uZ29pbmcsIG9yeC0gdGhlIHBvbGwgaGFzIGVuZGVkIHN1Y2ggdGhhdPwgIC0gdGhlIHZvdGUgb2YgdGhlIGFjY291bnQgd2FzIGluIG9wcG9zaXRpb24gdG8gdGhlIHJlc3VsdDsgb3LUICAtIHRoZXJlIHdhcyBubyBjb252aWN0aW9uIHRvIHRoZSBhY2NvdW50J3Mgdm90ZTsgb3KEICAtIHRoZSBhY2NvdW50IG1hZGUgYSBzcGxpdCB2b3RlXQEuLi50aGVuIHRoZSB2b3RlIGlzIHJlbW92ZWQgY2xlYW5seSBhbmQgYSBmb2xsb3dpbmcgY2FsbCB0byBgdW5sb2NrYCBtYXkgcmVzdWx0IGluIG1vcmVYZnVuZHMgYmVpbmcgYXZhaWxhYmxlLgCQSWYsIGhvd2V2ZXIsIHRoZSBwb2xsIGhhcyBlbmRlZCBhbmQ67C0gaXQgZmluaXNoZWQgY29ycmVzcG9uZGluZyB0byB0aGUgdm90ZSBvZiB0aGUgYWNjb3VudCwgYW5k3C0gdGhlIGFjY291bnQgbWFkZSBhIHN0YW5kYXJkIHZvdGUgd2l0aCBjb252aWN0aW9uLCBhbmS8LSB0aGUgbG9jayBwZXJpb2Qgb2YgdGhlIGNvbnZpY3Rpb24gaXMgbm90IG92ZXJZAS4uLnRoZW4gdGhlIGxvY2sgd2lsbCBiZSBhZ2dyZWdhdGVkIGludG8gdGhlIG92ZXJhbGwgYWNjb3VudCdzIGxvY2ssIHdoaWNoIG1heSBpbnZvbHZlWQEqb3ZlcmxvY2tpbmcqICh3aGVyZSB0aGUgdHdvIGxvY2tzIGFyZSBjb21iaW5lZCBpbnRvIGEgc2luZ2xlIGxvY2sgdGhhdCBpcyB0aGUgbWF4aW11beRvZiBib3RoIHRoZSBhbW91bnQgbG9ja2VkIGFuZCB0aGUgdGltZSBpcyBpdCBsb2NrZWQgZm9yKS4ASQFUaGUgZGlzcGF0Y2ggb3JpZ2luIG9mIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfLCBhbmQgdGhlIHNpZ25lciBtdXN0IGhhdmUgYSB2b3RlcHJlZ2lzdGVyZWQgZm9yIHBvbGwgYGluZGV4YC4A3C0gYGluZGV4YDogVGhlIGluZGV4IG9mIHBvbGwgb2YgdGhlIHZvdGUgdG8gYmUgcmVtb3ZlZC5VAS0gYGNsYXNzYDogT3B0aW9uYWwgcGFyYW1ldGVyLCBpZiBnaXZlbiBpdCBpbmRpY2F0ZXMgdGhlIGNsYXNzIG9mIHRoZSBwb2xsLiBGb3IgcG9sbHPwICB3aGljaCBoYXZlIGZpbmlzaGVkIG9yIGFyZSBjYW5jZWxsZWQsIHRoaXMgbXVzdCBiZSBgU29tZWAuAEUBV2VpZ2h0OiBgTyhSICsgbG9nIFIpYCB3aGVyZSBSIGlzIHRoZSBudW1iZXIgb2YgcG9sbHMgdGhhdCBgdGFyZ2V0YCBoYXMgdm90ZWQgb24u2CAgV2VpZ2h0IGlzIGNhbGN1bGF0ZWQgZm9yIHRoZSBtYXhpbXVtIG51bWJlciBvZiB2b3RlLkRyZW1vdmVfb3RoZXJfdm90ZQwBGHRhcmdldJ0BAVBBY2NvdW50SWRMb29rdXBPZjxUPgABFGNsYXNzVQEBNENsYXNzT2Y8VCwgST4AARRpbmRleBABRFBvbGxJbmRleE9mPFQsIEk+AAVAZFJlbW92ZSBhIHZvdGUgZm9yIGEgcG9sbC4ATQFJZiB0aGUgYHRhcmdldGAgaXMgZXF1YWwgdG8gdGhlIHNpZ25lciwgdGhlbiB0aGlzIGZ1bmN0aW9uIGlzIGV4YWN0bHkgZXF1aXZhbGVudCB0by0BYHJlbW92ZV92b3RlYC4gSWYgbm90IGVxdWFsIHRvIHRoZSBzaWduZXIsIHRoZW4gdGhlIHZvdGUgbXVzdCBoYXZlIGV4cGlyZWQsJQFlaXRoZXIgYmVjYXVzZSB0aGUgcG9sbCB3YXMgY2FuY2VsbGVkLCBiZWNhdXNlIHRoZSB2b3RlciBsb3N0IHRoZSBwb2xsIG9ymGJlY2F1c2UgdGhlIGNvbnZpY3Rpb24gcGVyaW9kIGlzIG92ZXIuAMhUaGUgZGlzcGF0Y2ggb3JpZ2luIG9mIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfLgBhAS0gYHRhcmdldGA6IFRoZSBhY2NvdW50IG9mIHRoZSB2b3RlIHRvIGJlIHJlbW92ZWQ7IHRoaXMgYWNjb3VudCBtdXN0IGhhdmUgdm90ZWQgZm9yIHBvbGwoICBgaW5kZXhgLtwtIGBpbmRleGA6IFRoZSBpbmRleCBvZiBwb2xsIG9mIHRoZSB2b3RlIHRvIGJlIHJlbW92ZWQuhC0gYGNsYXNzYDogVGhlIGNsYXNzIG9mIHRoZSBwb2xsLgBFAVdlaWdodDogYE8oUiArIGxvZyBSKWAgd2hlcmUgUiBpcyB0aGUgbnVtYmVyIG9mIHBvbGxzIHRoYXQgYHRhcmdldGAgaGFzIHZvdGVkIG9uLtggIFdlaWdodCBpcyBjYWxjdWxhdGVkIGZvciB0aGUgbWF4aW11bSBudW1iZXIgb2Ygdm90ZS4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMuRQIMYHBhbGxldF9jb252aWN0aW9uX3ZvdGluZxB2b3RlLEFjY291bnRWb3RlBBxCYWxhbmNlARgBDCBTdGFuZGFyZAgBEHZvdGVJAgEQVm90ZQABHGJhbGFuY2UYARxCYWxhbmNlAAAAFFNwbGl0CAEMYXllGAEcQmFsYW5jZQABDG5heRgBHEJhbGFuY2UAAQAwU3BsaXRBYnN0YWluDAEMYXllGAEcQmFsYW5jZQABDG5heRgBHEJhbGFuY2UAARxhYnN0YWluGAEcQmFsYW5jZQACAABJAgxgcGFsbGV0X2NvbnZpY3Rpb25fdm90aW5nEHZvdGUQVm90ZQAABAAIAAAATQIMYHBhbGxldF9jb252aWN0aW9uX3ZvdGluZyhjb252aWN0aW9uKENvbnZpY3Rpb24AARwQTm9uZQAAACBMb2NrZWQxeAABACBMb2NrZWQyeAACACBMb2NrZWQzeAADACBMb2NrZWQ0eAAEACBMb2NrZWQ1eAAFACBMb2NrZWQ2eAAGAABRAgQYT3B0aW9uBARUAVUBAQgQTm9uZQAAABBTb21lBABVAQAAAQAAVQIMQHBhbGxldF9yZWZlcmVuZGEYcGFsbGV0EENhbGwIBFQABEkAASQYc3VibWl0DAE8cHJvcG9zYWxfb3JpZ2luWQIBXEJveDxQYWxsZXRzT3JpZ2luT2Y8VD4+AAEgcHJvcG9zYWxZAQFMQm91bmRlZENhbGxPZjxULCBJPgABQGVuYWN0bWVudF9tb21lbnR1AgF8RGlzcGF0Y2hUaW1lPEJsb2NrTnVtYmVyRm9yPFQ+PgAAJLBQcm9wb3NlIGEgcmVmZXJlbmR1bSBvbiBhIHByaXZpbGVnZWQgYWN0aW9uLgBZAS0gYG9yaWdpbmA6IG11c3QgYmUgYFN1Ym1pdE9yaWdpbmAgYW5kIHRoZSBhY2NvdW50IG11c3QgaGF2ZSBgU3VibWlzc2lvbkRlcG9zaXRgIGZ1bmRzMCAgYXZhaWxhYmxlLi0BLSBgcHJvcG9zYWxfb3JpZ2luYDogVGhlIG9yaWdpbiBmcm9tIHdoaWNoIHRoZSBwcm9wb3NhbCBzaG91bGQgYmUgZXhlY3V0ZWQubC0gYHByb3Bvc2FsYDogVGhlIHByb3Bvc2FsLhUBLSBgZW5hY3RtZW50X21vbWVudGA6IFRoZSBtb21lbnQgdGhhdCB0aGUgcHJvcG9zYWwgc2hvdWxkIGJlIGVuYWN0ZWQuAEhFbWl0cyBgU3VibWl0dGVkYC5YcGxhY2VfZGVjaXNpb25fZGVwb3NpdAQBFGluZGV4EAE8UmVmZXJlbmR1bUluZGV4AAEgrFBvc3QgdGhlIERlY2lzaW9uIERlcG9zaXQgZm9yIGEgcmVmZXJlbmR1bS4AOQEtIGBvcmlnaW5gOiBtdXN0IGJlIGBTaWduZWRgIGFuZCB0aGUgYWNjb3VudCBtdXN0IGhhdmUgZnVuZHMgYXZhaWxhYmxlIGZvciB0aGWgICByZWZlcmVuZHVtJ3MgdHJhY2sncyBEZWNpc2lvbiBEZXBvc2l0LlEBLSBgaW5kZXhgOiBUaGUgaW5kZXggb2YgdGhlIHN1Ym1pdHRlZCByZWZlcmVuZHVtIHdob3NlIERlY2lzaW9uIERlcG9zaXQgaXMgeWV0IHRvIGJlJCAgcG9zdGVkLgB4RW1pdHMgYERlY2lzaW9uRGVwb3NpdFBsYWNlZGAuXHJlZnVuZF9kZWNpc2lvbl9kZXBvc2l0BAEUaW5kZXgQATxSZWZlcmVuZHVtSW5kZXgAAhwpAVJlZnVuZCB0aGUgRGVjaXNpb24gRGVwb3NpdCBmb3IgYSBjbG9zZWQgcmVmZXJlbmR1bSBiYWNrIHRvIHRoZSBkZXBvc2l0b3IuAJwtIGBvcmlnaW5gOiBtdXN0IGJlIGBTaWduZWRgIG9yIGBSb290YC5NAS0gYGluZGV4YDogVGhlIGluZGV4IG9mIGEgY2xvc2VkIHJlZmVyZW5kdW0gd2hvc2UgRGVjaXNpb24gRGVwb3NpdCBoYXMgbm90IHlldCBiZWVuLCAgcmVmdW5kZWQuAIBFbWl0cyBgRGVjaXNpb25EZXBvc2l0UmVmdW5kZWRgLhhjYW5jZWwEARRpbmRleBABPFJlZmVyZW5kdW1JbmRleAADGHRDYW5jZWwgYW4gb25nb2luZyByZWZlcmVuZHVtLgCcLSBgb3JpZ2luYDogbXVzdCBiZSB0aGUgYENhbmNlbE9yaWdpbmAu3C0gYGluZGV4YDogVGhlIGluZGV4IG9mIHRoZSByZWZlcmVuZHVtIHRvIGJlIGNhbmNlbGxlZC4ASEVtaXRzIGBDYW5jZWxsZWRgLhBraWxsBAEUaW5kZXgQATxSZWZlcmVuZHVtSW5kZXgABBjQQ2FuY2VsIGFuIG9uZ29pbmcgcmVmZXJlbmR1bSBhbmQgc2xhc2ggdGhlIGRlcG9zaXRzLgCULSBgb3JpZ2luYDogbXVzdCBiZSB0aGUgYEtpbGxPcmlnaW5gLtwtIGBpbmRleGA6IFRoZSBpbmRleCBvZiB0aGUgcmVmZXJlbmR1bSB0byBiZSBjYW5jZWxsZWQuAJBFbWl0cyBgS2lsbGVkYCBhbmQgYERlcG9zaXRTbGFzaGVkYC5AbnVkZ2VfcmVmZXJlbmR1bQQBFGluZGV4EAE8UmVmZXJlbmR1bUluZGV4AAUQHQFBZHZhbmNlIGEgcmVmZXJlbmR1bSBvbnRvIGl0cyBuZXh0IGxvZ2ljYWwgc3RhdGUuIE9ubHkgdXNlZCBpbnRlcm5hbGx5LgBsLSBgb3JpZ2luYDogbXVzdCBiZSBgUm9vdGAupC0gYGluZGV4YDogdGhlIHJlZmVyZW5kdW0gdG8gYmUgYWR2YW5jZWQuSG9uZV9mZXdlcl9kZWNpZGluZwQBFHRyYWNrVQEBPFRyYWNrSWRPZjxULCBJPgAGJAkBQWR2YW5jZSBhIHRyYWNrIG9udG8gaXRzIG5leHQgbG9naWNhbCBzdGF0ZS4gT25seSB1c2VkIGludGVybmFsbHkuAGwtIGBvcmlnaW5gOiBtdXN0IGJlIGBSb290YC6QLSBgdHJhY2tgOiB0aGUgdHJhY2sgdG8gYmUgYWR2YW5jZWQuAFEBQWN0aW9uIGl0ZW0gZm9yIHdoZW4gdGhlcmUgaXMgbm93IG9uZSBmZXdlciByZWZlcmVuZHVtIGluIHRoZSBkZWNpZGluZyBwaGFzZSBhbmQgdGhlFQFgRGVjaWRpbmdDb3VudGAgaXMgbm90IHlldCB1cGRhdGVkLiBUaGlzIG1lYW5zIHRoYXQgd2Ugc2hvdWxkIGVpdGhlcjolAS0gYmVnaW4gZGVjaWRpbmcgYW5vdGhlciByZWZlcmVuZHVtIChhbmQgbGVhdmUgYERlY2lkaW5nQ291bnRgIGFsb25lKTsgb3JwLSBkZWNyZW1lbnQgYERlY2lkaW5nQ291bnRgLmRyZWZ1bmRfc3VibWlzc2lvbl9kZXBvc2l0BAEUaW5kZXgQATxSZWZlcmVuZHVtSW5kZXgABxwxAVJlZnVuZCB0aGUgU3VibWlzc2lvbiBEZXBvc2l0IGZvciBhIGNsb3NlZCByZWZlcmVuZHVtIGJhY2sgdG8gdGhlIGRlcG9zaXRvci4AnC0gYG9yaWdpbmA6IG11c3QgYmUgYFNpZ25lZGAgb3IgYFJvb3RgLlUBLSBgaW5kZXhgOiBUaGUgaW5kZXggb2YgYSBjbG9zZWQgcmVmZXJlbmR1bSB3aG9zZSBTdWJtaXNzaW9uIERlcG9zaXQgaGFzIG5vdCB5ZXQgYmVlbiwgIHJlZnVuZGVkLgCIRW1pdHMgYFN1Ym1pc3Npb25EZXBvc2l0UmVmdW5kZWRgLjBzZXRfbWV0YWRhdGEIARRpbmRleBABPFJlZmVyZW5kdW1JbmRleAABKG1heWJlX2hhc2h5AgE8T3B0aW9uPFQ6Okhhc2g+AAgcmFNldCBvciBjbGVhciBtZXRhZGF0YSBvZiBhIHJlZmVyZW5kdW0uACxQYXJhbWV0ZXJzOkUBLSBgb3JpZ2luYDogTXVzdCBiZSBgU2lnbmVkYCBieSBhIGNyZWF0b3Igb2YgYSByZWZlcmVuZHVtIG9yIGJ5IGFueW9uZSB0byBjbGVhciBhkCAgbWV0YWRhdGEgb2YgYSBmaW5pc2hlZCByZWZlcmVuZHVtLg0BLSBgaW5kZXhgOiAgVGhlIGluZGV4IG9mIGEgcmVmZXJlbmR1bSB0byBzZXQgb3IgY2xlYXIgbWV0YWRhdGEgZm9yLlEBLSBgbWF5YmVfaGFzaGA6IFRoZSBoYXNoIG9mIGFuIG9uLWNoYWluIHN0b3JlZCBwcmVpbWFnZS4gYE5vbmVgIHRvIGNsZWFyIGEgbWV0YWRhdGEuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLlkCCFhzdGFnaW5nX2t1c2FtYV9ydW50aW1lME9yaWdpbkNhbGxlcgABFBhzeXN0ZW0EAF0CAXRmcmFtZV9zeXN0ZW06Ok9yaWdpbjxSdW50aW1lPgAAABxPcmlnaW5zBABhAgF0cGFsbGV0X2N1c3RvbV9vcmlnaW5zOjpPcmlnaW4AKwBAUGFyYWNoYWluc09yaWdpbgQAZQIBZHBhcmFjaGFpbnNfb3JpZ2luOjpPcmlnaW4AMgAkWGNtUGFsbGV0BABtAgFIcGFsbGV0X3hjbTo6T3JpZ2luAGMAEFZvaWQEAHECAUEBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OgpfX3ByaXZhdGU6OlZvaWQABAAAXQIMNGZyYW1lX3N1cHBvcnQgZGlzcGF0Y2gkUmF3T3JpZ2luBCRBY2NvdW50SWQBAAEMEFJvb3QAAAAYU2lnbmVkBAAAASRBY2NvdW50SWQAAQAQTm9uZQACAABhAhRYc3RhZ2luZ19rdXNhbWFfcnVudGltZShnb3Zlcm5hbmNlHG9yaWdpbnNUcGFsbGV0X2N1c3RvbV9vcmlnaW5zGE9yaWdpbgABcDBTdGFraW5nQWRtaW4AAAAkVHJlYXN1cmVyAAEAPEZlbGxvd3NoaXBBZG1pbgACADBHZW5lcmFsQWRtaW4AAwAwQXVjdGlvbkFkbWluAAQAKExlYXNlQWRtaW4ABQBMUmVmZXJlbmR1bUNhbmNlbGxlcgAGAEBSZWZlcmVuZHVtS2lsbGVyAAcALFNtYWxsVGlwcGVyAAgAJEJpZ1RpcHBlcgAJADBTbWFsbFNwZW5kZXIACgA0TWVkaXVtU3BlbmRlcgALAChCaWdTcGVuZGVyAAwARFdoaXRlbGlzdGVkQ2FsbGVyAA0ATEZlbGxvd3NoaXBJbml0aWF0ZXMADgAcRmVsbG93cwAPAERGZWxsb3dzaGlwRXhwZXJ0cwAQAERGZWxsb3dzaGlwTWFzdGVycwARADhGZWxsb3dzaGlwMURhbgASADhGZWxsb3dzaGlwMkRhbgATADhGZWxsb3dzaGlwM0RhbgAUADhGZWxsb3dzaGlwNERhbgAVADhGZWxsb3dzaGlwNURhbgAWADhGZWxsb3dzaGlwNkRhbgAXADhGZWxsb3dzaGlwN0RhbgAYADhGZWxsb3dzaGlwOERhbgAZADhGZWxsb3dzaGlwOURhbgAaADRXaXNoRm9yQ2hhbmdlABsAAGUCEGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMYb3JpZ2luGHBhbGxldBhPcmlnaW4AAQQkUGFyYWNoYWluBABpAgEYUGFyYUlkAAAAAGkCDHRwb2xrYWRvdF9wYXJhY2hhaW5fcHJpbWl0aXZlcyhwcmltaXRpdmVzCElkAAAEABABDHUzMgAAbQIMKHBhbGxldF94Y20YcGFsbGV0GE9yaWdpbgABCAxYY20EAPQBIExvY2F0aW9uAAAAIFJlc3BvbnNlBAD0ASBMb2NhdGlvbgABAABxAggcc3BfY29yZRBWb2lkAAEAAHUCEDRmcmFtZV9zdXBwb3J0GHRyYWl0cyBzY2hlZHVsZTBEaXNwYXRjaFRpbWUELEJsb2NrTnVtYmVyARABCAhBdAQAEAEsQmxvY2tOdW1iZXIAAAAUQWZ0ZXIEABABLEJsb2NrTnVtYmVyAAEAAHkCBBhPcHRpb24EBFQBNAEIEE5vbmUAAAAQU29tZQQANAAAAQAAfQIMYHBhbGxldF9yYW5rZWRfY29sbGVjdGl2ZRhwYWxsZXQQQ2FsbAgEVAAESQABHChhZGRfbWVtYmVyBAEMd2hvnQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAAYXEludHJvZHVjZSBhIG5ldyBtZW1iZXIuAJAtIGBvcmlnaW5gOiBNdXN0IGJlIHRoZSBgQWRkT3JpZ2luYC7oLSBgd2hvYDogQWNjb3VudCBvZiBub24tbWVtYmVyIHdoaWNoIHdpbGwgYmVjb21lIGEgbWVtYmVyLgA4V2VpZ2h0OiBgTygxKWA4cHJvbW90ZV9tZW1iZXIEAQx3aG+dAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AARjASW5jcmVtZW50IHRoZSByYW5rIG9mIGFuIGV4aXN0aW5nIG1lbWJlciBieSBvbmUuAKAtIGBvcmlnaW5gOiBNdXN0IGJlIHRoZSBgUHJvbW90ZU9yaWdpbmAukC0gYHdob2A6IEFjY291bnQgb2YgZXhpc3RpbmcgbWVtYmVyLgA4V2VpZ2h0OiBgTygxKWA0ZGVtb3RlX21lbWJlcgQBDHdob50BAVBBY2NvdW50SWRMb29rdXBPZjxUPgACHF0BRGVjcmVtZW50IHRoZSByYW5rIG9mIGFuIGV4aXN0aW5nIG1lbWJlciBieSBvbmUuIElmIHRoZSBtZW1iZXIgaXMgYWxyZWFkeSBhdCByYW5rIHplcm8sfHRoZW4gdGhleSBhcmUgcmVtb3ZlZCBlbnRpcmVseS4AnC0gYG9yaWdpbmA6IE11c3QgYmUgdGhlIGBEZW1vdGVPcmlnaW5gLvgtIGB3aG9gOiBBY2NvdW50IG9mIGV4aXN0aW5nIG1lbWJlciBvZiByYW5rIGdyZWF0ZXIgdGhhbiB6ZXJvLgAJAVdlaWdodDogYE8oMSlgLCBsZXNzIGlmIHRoZSBtZW1iZXIncyBpbmRleCBpcyBoaWdoZXN0IGluIGl0cyByYW5rLjRyZW1vdmVfbWVtYmVyCAEMd2hvnQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEgbWluX3JhbmtVAQEQUmFuawADHGxSZW1vdmUgdGhlIG1lbWJlciBlbnRpcmVseS4AnC0gYG9yaWdpbmA6IE11c3QgYmUgdGhlIGBSZW1vdmVPcmlnaW5gLvgtIGB3aG9gOiBBY2NvdW50IG9mIGV4aXN0aW5nIG1lbWJlciBvZiByYW5rIGdyZWF0ZXIgdGhhbiB6ZXJvLsAtIGBtaW5fcmFua2A6IFRoZSByYW5rIG9mIHRoZSBtZW1iZXIgb3IgZ3JlYXRlci4AWFdlaWdodDogYE8obWluX3JhbmspYC4Qdm90ZQgBEHBvbGwQAURQb2xsSW5kZXhPZjxULCBJPgABDGF5ZSABEGJvb2wABCzwQWRkIGFuIGF5ZSBvciBuYXkgdm90ZSBmb3IgdGhlIHNlbmRlciB0byB0aGUgZ2l2ZW4gcHJvcG9zYWwuAMQtIGBvcmlnaW5gOiBNdXN0IGJlIGBTaWduZWRgIGJ5IGEgbWVtYmVyIGFjY291bnQurC0gYHBvbGxgOiBJbmRleCBvZiBhIHBvbGwgd2hpY2ggaXMgb25nb2luZy4pAS0gYGF5ZWA6IGB0cnVlYCBpZiB0aGUgdm90ZSBpcyB0byBhcHByb3ZlIHRoZSBwcm9wb3NhbCwgYGZhbHNlYCBvdGhlcndpc2UuAEUBVHJhbnNhY3Rpb24gZmVlcyBhcmUgYmUgd2FpdmVkIGlmIHRoZSBtZW1iZXIgaXMgdm90aW5nIG9uIGFueSBwYXJ0aWN1bGFyIHByb3Bvc2FsUQFmb3IgdGhlIGZpcnN0IHRpbWUgYW5kIHRoZSBjYWxsIGlzIHN1Y2Nlc3NmdWwuIFN1YnNlcXVlbnQgdm90ZSBjaGFuZ2VzIHdpbGwgY2hhcmdlIGEQZmVlLgA1AVdlaWdodDogYE8oMSlgLCBsZXNzIGlmIHRoZXJlIHdhcyBubyBwcmV2aW91cyB2b3RlIG9uIHRoZSBwb2xsIGJ5IHRoZSBtZW1iZXIuMGNsZWFudXBfcG9sbAgBKHBvbGxfaW5kZXgQAURQb2xsSW5kZXhPZjxULCBJPgABDG1heBABDHUzMgAFKNRSZW1vdmUgdm90ZXMgZnJvbSB0aGUgZ2l2ZW4gcG9sbC4gSXQgbXVzdCBoYXZlIGVuZGVkLgCwLSBgb3JpZ2luYDogTXVzdCBiZSBgU2lnbmVkYCBieSBhbnkgYWNjb3VudC5JAS0gYHBvbGxfaW5kZXhgOiBJbmRleCBvZiBhIHBvbGwgd2hpY2ggaXMgY29tcGxldGVkIGFuZCBmb3Igd2hpY2ggdm90ZXMgY29udGludWUgdG8gICBleGlzdC78LSBgbWF4YDogTWF4aW11bSBudW1iZXIgb2Ygdm90ZSBpdGVtcyBmcm9tIHJlbW92ZSBpbiB0aGlzIGNhbGwuAOxUcmFuc2FjdGlvbiBmZWVzIGFyZSB3YWl2ZWQgaWYgdGhlIG9wZXJhdGlvbiBpcyBzdWNjZXNzZnVsLgAVAVdlaWdodCBgTyhtYXgpYCAobGVzcyBpZiB0aGVyZSBhcmUgZmV3ZXIgaXRlbXMgdG8gcmVtb3ZlIHRoYW4gYG1heGApLjxleGNoYW5nZV9tZW1iZXIIAQx3aG+dAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AARxuZXdfd2hvnQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAYUBQFFeGNoYW5nZXMgYSBtZW1iZXIgd2l0aCBhIG5ldyBhY2NvdW50IGFuZCB0aGUgc2FtZSBleGlzdGluZyByYW5rLgCkLSBgb3JpZ2luYDogTXVzdCBiZSB0aGUgYEV4Y2hhbmdlT3JpZ2luYC45AS0gYHdob2A6IEFjY291bnQgb2YgZXhpc3RpbmcgbWVtYmVyIG9mIHJhbmsgZ3JlYXRlciB0aGFuIHplcm8gdG8gYmUgZXhjaGFuZ2VkLlkBLSBgbmV3X3dob2A6IE5ldyBBY2NvdW50IG9mIGV4aXN0aW5nIG1lbWJlciBvZiByYW5rIGdyZWF0ZXIgdGhhbiB6ZXJvIHRvIGV4Y2hhbmdlZCB0by4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMugQIMQHBhbGxldF9yZWZlcmVuZGEYcGFsbGV0EENhbGwIBFQABEkAASQYc3VibWl0DAE8cHJvcG9zYWxfb3JpZ2luWQIBXEJveDxQYWxsZXRzT3JpZ2luT2Y8VD4+AAEgcHJvcG9zYWxZAQFMQm91bmRlZENhbGxPZjxULCBJPgABQGVuYWN0bWVudF9tb21lbnR1AgF8RGlzcGF0Y2hUaW1lPEJsb2NrTnVtYmVyRm9yPFQ+PgAAJLBQcm9wb3NlIGEgcmVmZXJlbmR1bSBvbiBhIHByaXZpbGVnZWQgYWN0aW9uLgBZAS0gYG9yaWdpbmA6IG11c3QgYmUgYFN1Ym1pdE9yaWdpbmAgYW5kIHRoZSBhY2NvdW50IG11c3QgaGF2ZSBgU3VibWlzc2lvbkRlcG9zaXRgIGZ1bmRzMCAgYXZhaWxhYmxlLi0BLSBgcHJvcG9zYWxfb3JpZ2luYDogVGhlIG9yaWdpbiBmcm9tIHdoaWNoIHRoZSBwcm9wb3NhbCBzaG91bGQgYmUgZXhlY3V0ZWQubC0gYHByb3Bvc2FsYDogVGhlIHByb3Bvc2FsLhUBLSBgZW5hY3RtZW50X21vbWVudGA6IFRoZSBtb21lbnQgdGhhdCB0aGUgcHJvcG9zYWwgc2hvdWxkIGJlIGVuYWN0ZWQuAEhFbWl0cyBgU3VibWl0dGVkYC5YcGxhY2VfZGVjaXNpb25fZGVwb3NpdAQBFGluZGV4EAE8UmVmZXJlbmR1bUluZGV4AAEgrFBvc3QgdGhlIERlY2lzaW9uIERlcG9zaXQgZm9yIGEgcmVmZXJlbmR1bS4AOQEtIGBvcmlnaW5gOiBtdXN0IGJlIGBTaWduZWRgIGFuZCB0aGUgYWNjb3VudCBtdXN0IGhhdmUgZnVuZHMgYXZhaWxhYmxlIGZvciB0aGWgICByZWZlcmVuZHVtJ3MgdHJhY2sncyBEZWNpc2lvbiBEZXBvc2l0LlEBLSBgaW5kZXhgOiBUaGUgaW5kZXggb2YgdGhlIHN1Ym1pdHRlZCByZWZlcmVuZHVtIHdob3NlIERlY2lzaW9uIERlcG9zaXQgaXMgeWV0IHRvIGJlJCAgcG9zdGVkLgB4RW1pdHMgYERlY2lzaW9uRGVwb3NpdFBsYWNlZGAuXHJlZnVuZF9kZWNpc2lvbl9kZXBvc2l0BAEUaW5kZXgQATxSZWZlcmVuZHVtSW5kZXgAAhwpAVJlZnVuZCB0aGUgRGVjaXNpb24gRGVwb3NpdCBmb3IgYSBjbG9zZWQgcmVmZXJlbmR1bSBiYWNrIHRvIHRoZSBkZXBvc2l0b3IuAJwtIGBvcmlnaW5gOiBtdXN0IGJlIGBTaWduZWRgIG9yIGBSb290YC5NAS0gYGluZGV4YDogVGhlIGluZGV4IG9mIGEgY2xvc2VkIHJlZmVyZW5kdW0gd2hvc2UgRGVjaXNpb24gRGVwb3NpdCBoYXMgbm90IHlldCBiZWVuLCAgcmVmdW5kZWQuAIBFbWl0cyBgRGVjaXNpb25EZXBvc2l0UmVmdW5kZWRgLhhjYW5jZWwEARRpbmRleBABPFJlZmVyZW5kdW1JbmRleAADGHRDYW5jZWwgYW4gb25nb2luZyByZWZlcmVuZHVtLgCcLSBgb3JpZ2luYDogbXVzdCBiZSB0aGUgYENhbmNlbE9yaWdpbmAu3C0gYGluZGV4YDogVGhlIGluZGV4IG9mIHRoZSByZWZlcmVuZHVtIHRvIGJlIGNhbmNlbGxlZC4ASEVtaXRzIGBDYW5jZWxsZWRgLhBraWxsBAEUaW5kZXgQATxSZWZlcmVuZHVtSW5kZXgABBjQQ2FuY2VsIGFuIG9uZ29pbmcgcmVmZXJlbmR1bSBhbmQgc2xhc2ggdGhlIGRlcG9zaXRzLgCULSBgb3JpZ2luYDogbXVzdCBiZSB0aGUgYEtpbGxPcmlnaW5gLtwtIGBpbmRleGA6IFRoZSBpbmRleCBvZiB0aGUgcmVmZXJlbmR1bSB0byBiZSBjYW5jZWxsZWQuAJBFbWl0cyBgS2lsbGVkYCBhbmQgYERlcG9zaXRTbGFzaGVkYC5AbnVkZ2VfcmVmZXJlbmR1bQQBFGluZGV4EAE8UmVmZXJlbmR1bUluZGV4AAUQHQFBZHZhbmNlIGEgcmVmZXJlbmR1bSBvbnRvIGl0cyBuZXh0IGxvZ2ljYWwgc3RhdGUuIE9ubHkgdXNlZCBpbnRlcm5hbGx5LgBsLSBgb3JpZ2luYDogbXVzdCBiZSBgUm9vdGAupC0gYGluZGV4YDogdGhlIHJlZmVyZW5kdW0gdG8gYmUgYWR2YW5jZWQuSG9uZV9mZXdlcl9kZWNpZGluZwQBFHRyYWNrVQEBPFRyYWNrSWRPZjxULCBJPgAGJAkBQWR2YW5jZSBhIHRyYWNrIG9udG8gaXRzIG5leHQgbG9naWNhbCBzdGF0ZS4gT25seSB1c2VkIGludGVybmFsbHkuAGwtIGBvcmlnaW5gOiBtdXN0IGJlIGBSb290YC6QLSBgdHJhY2tgOiB0aGUgdHJhY2sgdG8gYmUgYWR2YW5jZWQuAFEBQWN0aW9uIGl0ZW0gZm9yIHdoZW4gdGhlcmUgaXMgbm93IG9uZSBmZXdlciByZWZlcmVuZHVtIGluIHRoZSBkZWNpZGluZyBwaGFzZSBhbmQgdGhlFQFgRGVjaWRpbmdDb3VudGAgaXMgbm90IHlldCB1cGRhdGVkLiBUaGlzIG1lYW5zIHRoYXQgd2Ugc2hvdWxkIGVpdGhlcjolAS0gYmVnaW4gZGVjaWRpbmcgYW5vdGhlciByZWZlcmVuZHVtIChhbmQgbGVhdmUgYERlY2lkaW5nQ291bnRgIGFsb25lKTsgb3JwLSBkZWNyZW1lbnQgYERlY2lkaW5nQ291bnRgLmRyZWZ1bmRfc3VibWlzc2lvbl9kZXBvc2l0BAEUaW5kZXgQATxSZWZlcmVuZHVtSW5kZXgABxwxAVJlZnVuZCB0aGUgU3VibWlzc2lvbiBEZXBvc2l0IGZvciBhIGNsb3NlZCByZWZlcmVuZHVtIGJhY2sgdG8gdGhlIGRlcG9zaXRvci4AnC0gYG9yaWdpbmA6IG11c3QgYmUgYFNpZ25lZGAgb3IgYFJvb3RgLlUBLSBgaW5kZXhgOiBUaGUgaW5kZXggb2YgYSBjbG9zZWQgcmVmZXJlbmR1bSB3aG9zZSBTdWJtaXNzaW9uIERlcG9zaXQgaGFzIG5vdCB5ZXQgYmVlbiwgIHJlZnVuZGVkLgCIRW1pdHMgYFN1Ym1pc3Npb25EZXBvc2l0UmVmdW5kZWRgLjBzZXRfbWV0YWRhdGEIARRpbmRleBABPFJlZmVyZW5kdW1JbmRleAABKG1heWJlX2hhc2h5AgE8T3B0aW9uPFQ6Okhhc2g+AAgcmFNldCBvciBjbGVhciBtZXRhZGF0YSBvZiBhIHJlZmVyZW5kdW0uACxQYXJhbWV0ZXJzOkUBLSBgb3JpZ2luYDogTXVzdCBiZSBgU2lnbmVkYCBieSBhIGNyZWF0b3Igb2YgYSByZWZlcmVuZHVtIG9yIGJ5IGFueW9uZSB0byBjbGVhciBhkCAgbWV0YWRhdGEgb2YgYSBmaW5pc2hlZCByZWZlcmVuZHVtLg0BLSBgaW5kZXhgOiAgVGhlIGluZGV4IG9mIGEgcmVmZXJlbmR1bSB0byBzZXQgb3IgY2xlYXIgbWV0YWRhdGEgZm9yLlEBLSBgbWF5YmVfaGFzaGA6IFRoZSBoYXNoIG9mIGFuIG9uLWNoYWluIHN0b3JlZCBwcmVpbWFnZS4gYE5vbmVgIHRvIGNsZWFyIGEgbWV0YWRhdGEuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLoUCDEBwYWxsZXRfd2hpdGVsaXN0GHBhbGxldBBDYWxsBARUAAEQOHdoaXRlbGlzdF9jYWxsBAEkY2FsbF9oYXNoNAEcVDo6SGFzaAAAAFxyZW1vdmVfd2hpdGVsaXN0ZWRfY2FsbAQBJGNhbGxfaGFzaDQBHFQ6Okhhc2gAAQBkZGlzcGF0Y2hfd2hpdGVsaXN0ZWRfY2FsbAwBJGNhbGxfaGFzaDQBHFQ6Okhhc2gAAUBjYWxsX2VuY29kZWRfbGVuEAEMdTMyAAFMY2FsbF93ZWlnaHRfd2l0bmVzcygBGFdlaWdodAACAJxkaXNwYXRjaF93aGl0ZWxpc3RlZF9jYWxsX3dpdGhfcHJlaW1hZ2UEARBjYWxsXQEBfEJveDw8VCBhcyBDb25maWc+OjpSdW50aW1lQ2FsbD4AAwAEDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMuiQIMRHBhbGxldF9wYXJhbWV0ZXJzGHBhbGxldBBDYWxsBARUAAEENHNldF9wYXJhbWV0ZXIEASRrZXlfdmFsdWWNAgFQVDo6UnVudGltZVBhcmFtZXRlcnMAABB0U2V0IHRoZSB2YWx1ZSBvZiBhIHBhcmFtZXRlci4AVQFUaGUgZGlzcGF0Y2ggb3JpZ2luIG9mIHRoaXMgY2FsbCBtdXN0IGJlIGBBZG1pbk9yaWdpbmAgZm9yIHRoZSBnaXZlbiBga2V5YC4gVmFsdWVzIGJliGRlbGV0ZWQgYnkgc2V0dGluZyB0aGVtIHRvIGBOb25lYC4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMujQIIWHN0YWdpbmdfa3VzYW1hX3J1bnRpbWVEUnVudGltZVBhcmFtZXRlcnMAAQQkSW5mbGF0aW9uBACRAgGUZHluYW1pY19wYXJhbXM6OmluZmxhdGlvbjo6UGFyYW1ldGVycwAAAACRAhBYc3RhZ2luZ19rdXNhbWFfcnVudGltZThkeW5hbWljX3BhcmFtcyRpbmZsYXRpb24oUGFyYW1ldGVycwABFDBNaW5JbmZsYXRpb24IAJUCATBNaW5JbmZsYXRpb24AAJkCAUxPcHRpb248UGVycXVpbnRpbGw+AAAAME1heEluZmxhdGlvbggAoQIBME1heEluZmxhdGlvbgAAmQIBTE9wdGlvbjxQZXJxdWludGlsbD4AAQAoSWRlYWxTdGFrZQgApQIBKElkZWFsU3Rha2UAAJkCAUxPcHRpb248UGVycXVpbnRpbGw+AAIAHEZhbGxvZmYIAKkCARxGYWxsb2ZmAACZAgFMT3B0aW9uPFBlcnF1aW50aWxsPgADADxVc2VBdWN0aW9uU2xvdHMIAK0CATxVc2VBdWN0aW9uU2xvdHMAALECATBPcHRpb248Ym9vbD4ABAAAlQIQWHN0YWdpbmdfa3VzYW1hX3J1bnRpbWU4ZHluYW1pY19wYXJhbXMkaW5mbGF0aW9uME1pbkluZmxhdGlvbgAAAACZAgQYT3B0aW9uBARUAZ0CAQgQTm9uZQAAABBTb21lBACdAgAAAQAAnQIMNHNwX2FyaXRobWV0aWMocGVyX3RoaW5ncyxQZXJxdWludGlsbAAABAAwAQx1NjQAAKECEFhzdGFnaW5nX2t1c2FtYV9ydW50aW1lOGR5bmFtaWNfcGFyYW1zJGluZmxhdGlvbjBNYXhJbmZsYXRpb24AAAAApQIQWHN0YWdpbmdfa3VzYW1hX3J1bnRpbWU4ZHluYW1pY19wYXJhbXMkaW5mbGF0aW9uKElkZWFsU3Rha2UAAAAAqQIQWHN0YWdpbmdfa3VzYW1hX3J1bnRpbWU4ZHluYW1pY19wYXJhbXMkaW5mbGF0aW9uHEZhbGxvZmYAAAAArQIQWHN0YWdpbmdfa3VzYW1hX3J1bnRpbWU4ZHluYW1pY19wYXJhbXMkaW5mbGF0aW9uPFVzZUF1Y3Rpb25TbG90cwAAAACxAgQYT3B0aW9uBARUASABCBBOb25lAAAAEFNvbWUEACAAAAEAALUCEFxwb2xrYWRvdF9ydW50aW1lX2NvbW1vbhhjbGFpbXMYcGFsbGV0EENhbGwEBFQAARQUY2xhaW0IARBkZXN0AAEwVDo6QWNjb3VudElkAAFIZXRoZXJldW1fc2lnbmF0dXJluQIBOEVjZHNhU2lnbmF0dXJlAABgiE1ha2UgYSBjbGFpbSB0byBjb2xsZWN0IHlvdXIgRE9Ucy4AxFRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9Ob25lXy4AUFVuc2lnbmVkIFZhbGlkYXRpb246BQFBIGNhbGwgdG8gY2xhaW0gaXMgZGVlbWVkIHZhbGlkIGlmIHRoZSBzaWduYXR1cmUgcHJvdmlkZWQgbWF0Y2hlc3x0aGUgZXhwZWN0ZWQgc2lnbmVkIG1lc3NhZ2Ugb2Y6AGg+IEV0aGVyZXVtIFNpZ25lZCBNZXNzYWdlOpQ+IChjb25maWd1cmVkIHByZWZpeCBzdHJpbmcpKGFkZHJlc3MpAKRhbmQgYGFkZHJlc3NgIG1hdGNoZXMgdGhlIGBkZXN0YCBhY2NvdW50LgAsUGFyYW1ldGVyczrYLSBgZGVzdGA6IFRoZSBkZXN0aW5hdGlvbiBhY2NvdW50IHRvIHBheW91dCB0aGUgY2xhaW0uXQEtIGBldGhlcmV1bV9zaWduYXR1cmVgOiBUaGUgc2lnbmF0dXJlIG9mIGFuIGV0aGVyZXVtIHNpZ25lZCBtZXNzYWdlIG1hdGNoaW5nIHRoZSBmb3JtYXRIICBkZXNjcmliZWQgYWJvdmUuACA8d2VpZ2h0PvxUaGUgd2VpZ2h0IG9mIHRoaXMgY2FsbCBpcyBpbnZhcmlhbnQgb3ZlciB0aGUgaW5wdXQgcGFyYW1ldGVycy7gV2VpZ2h0IGluY2x1ZGVzIGxvZ2ljIHRvIHZhbGlkYXRlIHVuc2lnbmVkIGBjbGFpbWAgY2FsbC4AWFRvdGFsIENvbXBsZXhpdHk6IE8oMSkkPC93ZWlnaHQ+KG1pbnRfY2xhaW0QAQx3aG/BAgE8RXRoZXJldW1BZGRyZXNzAAEUdmFsdWUYATBCYWxhbmNlT2Y8VD4AAUB2ZXN0aW5nX3NjaGVkdWxlxQIB3E9wdGlvbjwoQmFsYW5jZU9mPFQ+LCBCYWxhbmNlT2Y8VD4sIEJsb2NrTnVtYmVyRm9yPFQ+KT4AASRzdGF0ZW1lbnTNAgFUT3B0aW9uPFN0YXRlbWVudEtpbmQ+AAE8hE1pbnQgYSBuZXcgY2xhaW0gdG8gY29sbGVjdCBET1RzLgDEVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1Jvb3RfLgAsUGFyYW1ldGVyczrwLSBgd2hvYDogVGhlIEV0aGVyZXVtIGFkZHJlc3MgYWxsb3dlZCB0byBjb2xsZWN0IHRoaXMgY2xhaW0uzC0gYHZhbHVlYDogVGhlIG51bWJlciBvZiBET1RzIHRoYXQgd2lsbCBiZSBjbGFpbWVkLgkBLSBgdmVzdGluZ19zY2hlZHVsZWA6IEFuIG9wdGlvbmFsIHZlc3Rpbmcgc2NoZWR1bGUgZm9yIHRoZXNlIERPVHMuACA8d2VpZ2h0PvxUaGUgd2VpZ2h0IG9mIHRoaXMgY2FsbCBpcyBpbnZhcmlhbnQgb3ZlciB0aGUgaW5wdXQgcGFyYW1ldGVycy4dAVdlIGFzc3VtZSB3b3JzdCBjYXNlIHRoYXQgYm90aCB2ZXN0aW5nIGFuZCBzdGF0ZW1lbnQgaXMgYmVpbmcgaW5zZXJ0ZWQuAFhUb3RhbCBDb21wbGV4aXR5OiBPKDEpJDwvd2VpZ2h0PjBjbGFpbV9hdHRlc3QMARBkZXN0AAEwVDo6QWNjb3VudElkAAFIZXRoZXJldW1fc2lnbmF0dXJluQIBOEVjZHNhU2lnbmF0dXJlAAEkc3RhdGVtZW50OAEcVmVjPHU4PgACbORNYWtlIGEgY2xhaW0gdG8gY29sbGVjdCB5b3VyIERPVHMgYnkgc2lnbmluZyBhIHN0YXRlbWVudC4AxFRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9Ob25lXy4AUFVuc2lnbmVkIFZhbGlkYXRpb246KQFBIGNhbGwgdG8gYGNsYWltX2F0dGVzdGAgaXMgZGVlbWVkIHZhbGlkIGlmIHRoZSBzaWduYXR1cmUgcHJvdmlkZWQgbWF0Y2hlc3x0aGUgZXhwZWN0ZWQgc2lnbmVkIG1lc3NhZ2Ugb2Y6AGg+IEV0aGVyZXVtIFNpZ25lZCBNZXNzYWdlOsA+IChjb25maWd1cmVkIHByZWZpeCBzdHJpbmcpKGFkZHJlc3MpKHN0YXRlbWVudCkASQFhbmQgYGFkZHJlc3NgIG1hdGNoZXMgdGhlIGBkZXN0YCBhY2NvdW50OyB0aGUgYHN0YXRlbWVudGAgbXVzdCBtYXRjaCB0aGF0IHdoaWNoIGlzwGV4cGVjdGVkIGFjY29yZGluZyB0byB5b3VyIHB1cmNoYXNlIGFycmFuZ2VtZW50LgAsUGFyYW1ldGVyczrYLSBgZGVzdGA6IFRoZSBkZXN0aW5hdGlvbiBhY2NvdW50IHRvIHBheW91dCB0aGUgY2xhaW0uXQEtIGBldGhlcmV1bV9zaWduYXR1cmVgOiBUaGUgc2lnbmF0dXJlIG9mIGFuIGV0aGVyZXVtIHNpZ25lZCBtZXNzYWdlIG1hdGNoaW5nIHRoZSBmb3JtYXRIICBkZXNjcmliZWQgYWJvdmUuOQEtIGBzdGF0ZW1lbnRgOiBUaGUgaWRlbnRpdHkgb2YgdGhlIHN0YXRlbWVudCB3aGljaCBpcyBiZWluZyBhdHRlc3RlZCB0byBpbiB0aGUwICBzaWduYXR1cmUuACA8d2VpZ2h0PvxUaGUgd2VpZ2h0IG9mIHRoaXMgY2FsbCBpcyBpbnZhcmlhbnQgb3ZlciB0aGUgaW5wdXQgcGFyYW1ldGVycy78V2VpZ2h0IGluY2x1ZGVzIGxvZ2ljIHRvIHZhbGlkYXRlIHVuc2lnbmVkIGBjbGFpbV9hdHRlc3RgIGNhbGwuAFhUb3RhbCBDb21wbGV4aXR5OiBPKDEpJDwvd2VpZ2h0PhhhdHRlc3QEASRzdGF0ZW1lbnQ4ARxWZWM8dTg+AANM9EF0dGVzdCB0byBhIHN0YXRlbWVudCwgbmVlZGVkIHRvIGZpbmFsaXplIHRoZSBjbGFpbXMgcHJvY2Vzcy4AGQFXQVJOSU5HOiBJbnNlY3VyZSB1bmxlc3MgeW91ciBjaGFpbiBpbmNsdWRlcyBgUHJldmFsaWRhdGVBdHRlc3RzYCBhcyBhSGBTaWduZWRFeHRlbnNpb25gLgBQVW5zaWduZWQgVmFsaWRhdGlvbjopAUEgY2FsbCB0byBhdHRlc3QgaXMgZGVlbWVkIHZhbGlkIGlmIHRoZSBzZW5kZXIgaGFzIGEgYFByZWNsYWltYCByZWdpc3RlcmVk9GFuZCBwcm92aWRlcyBhIGBzdGF0ZW1lbnRgIHdoaWNoIGlzIGV4cGVjdGVkIGZvciB0aGUgYWNjb3VudC4ALFBhcmFtZXRlcnM6OQEtIGBzdGF0ZW1lbnRgOiBUaGUgaWRlbnRpdHkgb2YgdGhlIHN0YXRlbWVudCB3aGljaCBpcyBiZWluZyBhdHRlc3RlZCB0byBpbiB0aGUwICBzaWduYXR1cmUuACA8d2VpZ2h0PvxUaGUgd2VpZ2h0IG9mIHRoaXMgY2FsbCBpcyBpbnZhcmlhbnQgb3ZlciB0aGUgaW5wdXQgcGFyYW1ldGVycy7wV2VpZ2h0IGluY2x1ZGVzIGxvZ2ljIHRvIGRvIHByZS12YWxpZGF0aW9uIG9uIGBhdHRlc3RgIGNhbGwuAFhUb3RhbCBDb21wbGV4aXR5OiBPKDEpJDwvd2VpZ2h0Pihtb3ZlX2NsYWltDAEMb2xkwQIBPEV0aGVyZXVtQWRkcmVzcwABDG5ld8ECATxFdGhlcmV1bUFkZHJlc3MAAThtYXliZV9wcmVjbGFpbdkBAVBPcHRpb248VDo6QWNjb3VudElkPgAEAAQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy65AgxccG9sa2Fkb3RfcnVudGltZV9jb21tb24YY2xhaW1zOEVjZHNhU2lnbmF0dXJlAAAEAL0CASBbdTg7IDY1XQAAvQIAAANBAAAACADBAgxccG9sa2Fkb3RfcnVudGltZV9jb21tb24YY2xhaW1zPEV0aGVyZXVtQWRkcmVzcwAABADgASBbdTg7IDIwXQAAxQIEGE9wdGlvbgQEVAHJAgEIEE5vbmUAAAAQU29tZQQAyQIAAAEAAMkCAAAEDBgYEADNAgQYT3B0aW9uBARUAdECAQgQTm9uZQAAABBTb21lBADRAgAAAQAA0QIMXHBvbGthZG90X3J1bnRpbWVfY29tbW9uGGNsYWltczRTdGF0ZW1lbnRLaW5kAAEIHFJlZ3VsYXIAAAAQU2FmdAABAADVAgw4cGFsbGV0X3V0aWxpdHkYcGFsbGV0EENhbGwEBFQAARgUYmF0Y2gEARRjYWxsc9kCAXxWZWM8PFQgYXMgQ29uZmlnPjo6UnVudGltZUNhbGw+AABIfFNlbmQgYSBiYXRjaCBvZiBkaXNwYXRjaCBjYWxscy4AsE1heSBiZSBjYWxsZWQgZnJvbSBhbnkgb3JpZ2luIGV4Y2VwdCBgTm9uZWAuAF0BLSBgY2FsbHNgOiBUaGUgY2FsbHMgdG8gYmUgZGlzcGF0Y2hlZCBmcm9tIHRoZSBzYW1lIG9yaWdpbi4gVGhlIG51bWJlciBvZiBjYWxsIG11c3Qgbm90OQEgIGV4Y2VlZCB0aGUgY29uc3RhbnQ6IGBiYXRjaGVkX2NhbGxzX2xpbWl0YCAoYXZhaWxhYmxlIGluIGNvbnN0YW50IG1ldGFkYXRhKS4AVQFJZiBvcmlnaW4gaXMgcm9vdCB0aGVuIHRoZSBjYWxscyBhcmUgZGlzcGF0Y2hlZCB3aXRob3V0IGNoZWNraW5nIG9yaWdpbiBmaWx0ZXIuIChUaGlz7GluY2x1ZGVzIGJ5cGFzc2luZyBgZnJhbWVfc3lzdGVtOjpDb25maWc6OkJhc2VDYWxsRmlsdGVyYCkuADQjIyBDb21wbGV4aXR50C0gTyhDKSB3aGVyZSBDIGlzIHRoZSBudW1iZXIgb2YgY2FsbHMgdG8gYmUgYmF0Y2hlZC4AVQFUaGlzIHdpbGwgcmV0dXJuIGBPa2AgaW4gYWxsIGNpcmN1bXN0YW5jZXMuIFRvIGRldGVybWluZSB0aGUgc3VjY2VzcyBvZiB0aGUgYmF0Y2gsIGFuMQFldmVudCBpcyBkZXBvc2l0ZWQuIElmIGEgY2FsbCBmYWlsZWQgYW5kIHRoZSBiYXRjaCB3YXMgaW50ZXJydXB0ZWQsIHRoZW4gdGhlVQFgQmF0Y2hJbnRlcnJ1cHRlZGAgZXZlbnQgaXMgZGVwb3NpdGVkLCBhbG9uZyB3aXRoIHRoZSBudW1iZXIgb2Ygc3VjY2Vzc2Z1bCBjYWxscyBtYWRlTQFhbmQgdGhlIGVycm9yIG9mIHRoZSBmYWlsZWQgY2FsbC4gSWYgYWxsIHdlcmUgc3VjY2Vzc2Z1bCwgdGhlbiB0aGUgYEJhdGNoQ29tcGxldGVkYExldmVudCBpcyBkZXBvc2l0ZWQuNGFzX2Rlcml2YXRpdmUIARRpbmRleFUBAQx1MTYAARBjYWxsXQEBfEJveDw8VCBhcyBDb25maWc+OjpSdW50aW1lQ2FsbD4AATTcU2VuZCBhIGNhbGwgdGhyb3VnaCBhbiBpbmRleGVkIHBzZXVkb255bSBvZiB0aGUgc2VuZGVyLgBVAUZpbHRlciBmcm9tIG9yaWdpbiBhcmUgcGFzc2VkIGFsb25nLiBUaGUgY2FsbCB3aWxsIGJlIGRpc3BhdGNoZWQgd2l0aCBhbiBvcmlnaW4gd2hpY2i8dXNlIHRoZSBzYW1lIGZpbHRlciBhcyB0aGUgb3JpZ2luIG9mIHRoaXMgY2FsbC4ARQFOT1RFOiBJZiB5b3UgbmVlZCB0byBlbnN1cmUgdGhhdCBhbnkgYWNjb3VudC1iYXNlZCBmaWx0ZXJpbmcgaXMgbm90IGhvbm9yZWQgKGkuZS5hAWJlY2F1c2UgeW91IGV4cGVjdCBgcHJveHlgIHRvIGhhdmUgYmVlbiB1c2VkIHByaW9yIGluIHRoZSBjYWxsIHN0YWNrIGFuZCB5b3UgZG8gbm90IHdhbnRRAXRoZSBjYWxsIHJlc3RyaWN0aW9ucyB0byBhcHBseSB0byBhbnkgc3ViLWFjY291bnRzKSwgdGhlbiB1c2UgYGFzX211bHRpX3RocmVzaG9sZF8xYHxpbiB0aGUgTXVsdGlzaWcgcGFsbGV0IGluc3RlYWQuAPROT1RFOiBQcmlvciB0byB2ZXJzaW9uICoxMiwgdGhpcyB3YXMgY2FsbGVkIGBhc19saW1pdGVkX3N1YmAuAMxUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXy4kYmF0Y2hfYWxsBAEUY2FsbHPZAgF8VmVjPDxUIGFzIENvbmZpZz46OlJ1bnRpbWVDYWxsPgACNOxTZW5kIGEgYmF0Y2ggb2YgZGlzcGF0Y2ggY2FsbHMgYW5kIGF0b21pY2FsbHkgZXhlY3V0ZSB0aGVtLiEBVGhlIHdob2xlIHRyYW5zYWN0aW9uIHdpbGwgcm9sbGJhY2sgYW5kIGZhaWwgaWYgYW55IG9mIHRoZSBjYWxscyBmYWlsZWQuALBNYXkgYmUgY2FsbGVkIGZyb20gYW55IG9yaWdpbiBleGNlcHQgYE5vbmVgLgBdAS0gYGNhbGxzYDogVGhlIGNhbGxzIHRvIGJlIGRpc3BhdGNoZWQgZnJvbSB0aGUgc2FtZSBvcmlnaW4uIFRoZSBudW1iZXIgb2YgY2FsbCBtdXN0IG5vdDkBICBleGNlZWQgdGhlIGNvbnN0YW50OiBgYmF0Y2hlZF9jYWxsc19saW1pdGAgKGF2YWlsYWJsZSBpbiBjb25zdGFudCBtZXRhZGF0YSkuAFUBSWYgb3JpZ2luIGlzIHJvb3QgdGhlbiB0aGUgY2FsbHMgYXJlIGRpc3BhdGNoZWQgd2l0aG91dCBjaGVja2luZyBvcmlnaW4gZmlsdGVyLiAoVGhpc+xpbmNsdWRlcyBieXBhc3NpbmcgYGZyYW1lX3N5c3RlbTo6Q29uZmlnOjpCYXNlQ2FsbEZpbHRlcmApLgA0IyMgQ29tcGxleGl0edAtIE8oQykgd2hlcmUgQyBpcyB0aGUgbnVtYmVyIG9mIGNhbGxzIHRvIGJlIGJhdGNoZWQuLGRpc3BhdGNoX2FzCAEkYXNfb3JpZ2luWQIBVEJveDxUOjpQYWxsZXRzT3JpZ2luPgABEGNhbGxdAQF8Qm94PDxUIGFzIENvbmZpZz46OlJ1bnRpbWVDYWxsPgADGMhEaXNwYXRjaGVzIGEgZnVuY3Rpb24gY2FsbCB3aXRoIGEgcHJvdmlkZWQgb3JpZ2luLgDEVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1Jvb3RfLgA0IyMgQ29tcGxleGl0eRwtIE8oMSkuLGZvcmNlX2JhdGNoBAEUY2FsbHPZAgF8VmVjPDxUIGFzIENvbmZpZz46OlJ1bnRpbWVDYWxsPgAENHxTZW5kIGEgYmF0Y2ggb2YgZGlzcGF0Y2ggY2FsbHMu1FVubGlrZSBgYmF0Y2hgLCBpdCBhbGxvd3MgZXJyb3JzIGFuZCB3b24ndCBpbnRlcnJ1cHQuALBNYXkgYmUgY2FsbGVkIGZyb20gYW55IG9yaWdpbiBleGNlcHQgYE5vbmVgLgBdAS0gYGNhbGxzYDogVGhlIGNhbGxzIHRvIGJlIGRpc3BhdGNoZWQgZnJvbSB0aGUgc2FtZSBvcmlnaW4uIFRoZSBudW1iZXIgb2YgY2FsbCBtdXN0IG5vdDkBICBleGNlZWQgdGhlIGNvbnN0YW50OiBgYmF0Y2hlZF9jYWxsc19saW1pdGAgKGF2YWlsYWJsZSBpbiBjb25zdGFudCBtZXRhZGF0YSkuAE0BSWYgb3JpZ2luIGlzIHJvb3QgdGhlbiB0aGUgY2FsbHMgYXJlIGRpc3BhdGNoIHdpdGhvdXQgY2hlY2tpbmcgb3JpZ2luIGZpbHRlci4gKFRoaXPsaW5jbHVkZXMgYnlwYXNzaW5nIGBmcmFtZV9zeXN0ZW06OkNvbmZpZzo6QmFzZUNhbGxGaWx0ZXJgKS4ANCMjIENvbXBsZXhpdHnQLSBPKEMpIHdoZXJlIEMgaXMgdGhlIG51bWJlciBvZiBjYWxscyB0byBiZSBiYXRjaGVkLix3aXRoX3dlaWdodAgBEGNhbGxdAQF8Qm94PDxUIGFzIENvbmZpZz46OlJ1bnRpbWVDYWxsPgABGHdlaWdodCgBGFdlaWdodAAFGMREaXNwYXRjaCBhIGZ1bmN0aW9uIGNhbGwgd2l0aCBhIHNwZWNpZmllZCB3ZWlnaHQuAC0BVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBjaGVjayB0aGUgd2VpZ2h0IG9mIHRoZSBjYWxsLCBhbmQgaW5zdGVhZCBhbGxvd3MgdGhluFJvb3Qgb3JpZ2luIHRvIHNwZWNpZnkgdGhlIHdlaWdodCBvZiB0aGUgY2FsbC4AxFRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9Sb290Xy4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMu2QIAAAJdAQDdAgw4cGFsbGV0X3NvY2lldHkYcGFsbGV0EENhbGwIBFQABEkAAVAMYmlkBAEUdmFsdWUYATxCYWxhbmNlT2Y8VCwgST4AACTcQSB1c2VyIG91dHNpZGUgb2YgdGhlIHNvY2lldHkgY2FuIG1ha2UgYSBiaWQgZm9yIGVudHJ5LgBhAVBheW1lbnQ6IFRoZSBncm91cCdzIENhbmRpZGF0ZSBEZXBvc2l0IHdpbGwgYmUgcmVzZXJ2ZWQgZm9yIG1ha2luZyBhIGJpZC4gSXQgaXMgcmV0dXJuZWTsd2hlbiB0aGUgYmlkIGJlY29tZXMgYSBtZW1iZXIsIG9yIGlmIHRoZSBiaWQgY2FsbHMgYHVuYmlkYC4AzFRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfLgAsUGFyYW1ldGVyczpVAS0gYHZhbHVlYDogQSBvbmUgdGltZSBwYXltZW50IHRoZSBiaWQgd291bGQgbGlrZSB0byByZWNlaXZlIHdoZW4gam9pbmluZyB0aGUgc29jaWV0eS4UdW5iaWQAARzUQSBiaWRkZXIgY2FuIHJlbW92ZSB0aGVpciBiaWQgZm9yIGVudHJ5IGludG8gc29jaWV0eS78QnkgZG9pbmcgc28sIHRoZXkgd2lsbCBoYXZlIHRoZWlyIGNhbmRpZGF0ZSBkZXBvc2l0IHJldHVybmVkIG9ygHRoZXkgd2lsbCB1bnZvdWNoIHRoZWlyIHZvdWNoZXIuAPhQYXltZW50OiBUaGUgYmlkIGRlcG9zaXQgaXMgdW5yZXNlcnZlZCBpZiB0aGUgdXNlciBtYWRlIGEgYmlkLgABAVRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfIGFuZCBhIGJpZGRlci4Udm91Y2gMAQx3aG+dAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AARR2YWx1ZRgBPEJhbGFuY2VPZjxULCBJPgABDHRpcBgBPEJhbGFuY2VPZjxULCBJPgACREEBQXMgYSBtZW1iZXIsIHZvdWNoIGZvciBzb21lb25lIHRvIGpvaW4gc29jaWV0eSBieSBwbGFjaW5nIGEgYmlkIG9uIHRoZWlyIGJlaGFsZi4AUQFUaGVyZSBpcyBubyBkZXBvc2l0IHJlcXVpcmVkIHRvIHZvdWNoIGZvciBhIG5ldyBiaWQsIGJ1dCBhIG1lbWJlciBjYW4gb25seSB2b3VjaCBmb3JZAW9uZSBiaWQgYXQgYSB0aW1lLiBJZiB0aGUgYmlkIGJlY29tZXMgYSBzdXNwZW5kZWQgY2FuZGlkYXRlIGFuZCB1bHRpbWF0ZWx5IHJlamVjdGVkIGJ5PQF0aGUgc3VzcGVuc2lvbiBqdWRnZW1lbnQgb3JpZ2luLCB0aGUgbWVtYmVyIHdpbGwgYmUgYmFubmVkIGZyb20gdm91Y2hpbmcgYWdhaW4uAFUBQXMgYSB2b3VjaGluZyBtZW1iZXIsIHlvdSBjYW4gY2xhaW0gYSB0aXAgaWYgdGhlIGNhbmRpZGF0ZSBpcyBhY2NlcHRlZC4gVGhpcyB0aXAgd2lsbE0BYmUgcGFpZCBhcyBhIHBvcnRpb24gb2YgdGhlIHJld2FyZCB0aGUgbWVtYmVyIHdpbGwgcmVjZWl2ZSBmb3Igam9pbmluZyB0aGUgc29jaWV0eS4AAQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXyBhbmQgYSBtZW1iZXIuACxQYXJhbWV0ZXJzOsgtIGB3aG9gOiBUaGUgdXNlciB3aG8geW91IHdvdWxkIGxpa2UgdG8gdm91Y2ggZm9yLk0BLSBgdmFsdWVgOiBUaGUgdG90YWwgcmV3YXJkIHRvIGJlIHBhaWQgYmV0d2VlbiB5b3UgYW5kIHRoZSBjYW5kaWRhdGUgaWYgdGhleSBiZWNvbWVgYSBtZW1iZXIgaW4gdGhlIHNvY2lldHkuRQEtIGB0aXBgOiBZb3VyIGN1dCBvZiB0aGUgdG90YWwgYHZhbHVlYCBwYXlvdXQgd2hlbiB0aGUgY2FuZGlkYXRlIGlzIGluZHVjdGVkIGludG8RAXRoZSBzb2NpZXR5LiBUaXBzIGxhcmdlciB0aGFuIGB2YWx1ZWAgd2lsbCBiZSBzYXR1cmF0ZWQgdXBvbiBwYXlvdXQuHHVudm91Y2gAAxwpAUFzIGEgdm91Y2hpbmcgbWVtYmVyLCB1bnZvdWNoIGEgYmlkLiBUaGlzIG9ubHkgd29ya3Mgd2hpbGUgdm91Y2hlZCB1c2VyIGlzkG9ubHkgYSBiaWRkZXIgKGFuZCBub3QgYSBjYW5kaWRhdGUpLgAlAVRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfIGFuZCBhIHZvdWNoaW5nIG1lbWJlci4ALFBhcmFtZXRlcnM6KQEtIGBwb3NgOiBQb3NpdGlvbiBpbiB0aGUgYEJpZHNgIHZlY3RvciBvZiB0aGUgYmlkIHdobyBzaG91bGQgYmUgdW52b3VjaGVkLhB2b3RlCAEkY2FuZGlkYXRlnQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEcYXBwcm92ZSABEGJvb2wABCCEQXMgYSBtZW1iZXIsIHZvdGUgb24gYSBjYW5kaWRhdGUuAAEBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8gYW5kIGEgbWVtYmVyLgAsUGFyYW1ldGVyczoJAS0gYGNhbmRpZGF0ZWA6IFRoZSBjYW5kaWRhdGUgdGhhdCB0aGUgbWVtYmVyIHdvdWxkIGxpa2UgdG8gYmlkIG9uLkUBLSBgYXBwcm92ZWA6IEEgYm9vbGVhbiB3aGljaCBzYXlzIGlmIHRoZSBjYW5kaWRhdGUgc2hvdWxkIGJlIGFwcHJvdmVkIChgdHJ1ZWApIG9yVCAgcmVqZWN0ZWQgKGBmYWxzZWApLjRkZWZlbmRlcl92b3RlBAEcYXBwcm92ZSABEGJvb2wABRyIQXMgYSBtZW1iZXIsIHZvdGUgb24gdGhlIGRlZmVuZGVyLgABAVRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfIGFuZCBhIG1lbWJlci4ALFBhcmFtZXRlcnM68C0gYGFwcHJvdmVgOiBBIGJvb2xlYW4gd2hpY2ggc2F5cyBpZiB0aGUgY2FuZGlkYXRlIHNob3VsZCBiZaBhcHByb3ZlZCAoYHRydWVgKSBvciByZWplY3RlZCAoYGZhbHNlYCkuGHBheW91dAAGKEEBVHJhbnNmZXIgdGhlIGZpcnN0IG1hdHVyZWQgcGF5b3V0IGZvciB0aGUgc2VuZGVyIGFuZCByZW1vdmUgaXQgZnJvbSB0aGUgcmVjb3Jkcy4AQQFOT1RFOiBUaGlzIGV4dHJpbnNpYyBuZWVkcyB0byBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgdG8gY2xhaW0gbXVsdGlwbGUgbWF0dXJlZCBwYXlvdXRzLgAdAVBheW1lbnQ6IFRoZSBtZW1iZXIgd2lsbCByZWNlaXZlIGEgcGF5bWVudCBlcXVhbCB0byB0aGVpciBmaXJzdCBtYXR1cmVkdHBheW91dCB0byB0aGVpciBmcmVlIGJhbGFuY2UuABEBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8gYW5kIGEgbWVtYmVyIHdpdGhIcGF5b3V0cyByZW1haW5pbmcuLHdhaXZlX3JlcGF5BAEYYW1vdW50GAE8QmFsYW5jZU9mPFQsIEk+AAcITQFSZXBheSB0aGUgcGF5bWVudCBwcmV2aW91c2x5IGdpdmVuIHRvIHRoZSBtZW1iZXIgd2l0aCB0aGUgc2lnbmVkIG9yaWdpbiwgcmVtb3ZlIGFueeRwZW5kaW5nIHBheW1lbnRzLCBhbmQgZWxldmF0ZSB0aGVtIGZyb20gcmFuayAwIHRvIHJhbmsgMS40Zm91bmRfc29jaWV0eRgBHGZvdW5kZXKdAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AASxtYXhfbWVtYmVycxABDHUzMgABKG1heF9pbnRha2UQAQx1MzIAASxtYXhfc3RyaWtlcxABDHUzMgABRGNhbmRpZGF0ZV9kZXBvc2l0GAE8QmFsYW5jZU9mPFQsIEk+AAEUcnVsZXM4ARxWZWM8dTg+AAhESEZvdW5kIHRoZSBzb2NpZXR5LgDsVGhpcyBpcyBkb25lIGFzIGEgZGlzY3JldGUgYWN0aW9uIGluIG9yZGVyIHRvIGFsbG93IGZvciB0aGUVAXBhbGxldCB0byBiZSBpbmNsdWRlZCBpbnRvIGEgcnVubmluZyBjaGFpbiBhbmQgY2FuIG9ubHkgYmUgZG9uZSBvbmNlLgAZAVRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIGZyb20gdGhlIF9Gb3VuZGVyU2V0T3JpZ2luXy4ALFBhcmFtZXRlcnM6FQEtIGBmb3VuZGVyYCAtIFRoZSBmaXJzdCBtZW1iZXIgYW5kIGhlYWQgb2YgdGhlIG5ld2x5IGZvdW5kZWQgc29jaWV0eS4RAS0gYG1heF9tZW1iZXJzYCAtIFRoZSBpbml0aWFsIG1heCBudW1iZXIgb2YgbWVtYmVycyBmb3IgdGhlIHNvY2lldHkuEQEtIGBtYXhfaW50YWtlYCAtIFRoZSBtYXhpbXVtIG51bWJlciBvZiBjYW5kaWRhdGVzIHBlciBpbnRha2UgcGVyaW9kLkkBLSBgbWF4X3N0cmlrZXNgOiBUaGUgbWF4aW11bSBudW1iZXIgb2Ygc3RyaWtlcyBhIG1lbWJlciBtYXkgZ2V0IGJlZm9yZSB0aGV5IGJlY29tZdggIHN1c3BlbmRlZCBhbmQgbWF5IG9ubHkgYmUgcmVpbnN0YXRlZCBieSB0aGUgZm91bmRlci5ZAS0gYGNhbmRpZGF0ZV9kZXBvc2l0YDogVGhlIGRlcG9zaXQgcmVxdWlyZWQgdG8gbWFrZSBhIGJpZCBmb3IgbWVtYmVyc2hpcCBvZiB0aGUgZ3JvdXAu8C0gYHJ1bGVzYCAtIFRoZSBydWxlcyBvZiB0aGlzIHNvY2lldHkgY29uY2VybmluZyBtZW1iZXJzaGlwLgBAQ29tcGxleGl0eTogTygxKSBkaXNzb2x2ZQAJFLBEaXNzb2x2ZSB0aGUgc29jaWV0eSBhbmQgcmVtb3ZlIGFsbCBtZW1iZXJzLgBZAVRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIFNpZ25lZCwgYW5kIHRoZSBzaWduaW5nIGFjY291bnQgbXVzdCBiZSBib3RoVQF0aGUgYEZvdW5kZXJgIGFuZCB0aGUgYEhlYWRgLiBUaGlzIGltcGxpZXMgdGhhdCBpdCBtYXkgb25seSBiZSBkb25lIHdoZW4gdGhlcmUgaXMgb25lHG1lbWJlci5YanVkZ2Vfc3VzcGVuZGVkX21lbWJlcggBDHdob50BAVBBY2NvdW50SWRMb29rdXBPZjxUPgABHGZvcmdpdmUgARBib29sAAo4KQFBbGxvdyBzdXNwZW5zaW9uIGp1ZGdlbWVudCBvcmlnaW4gdG8gbWFrZSBqdWRnZW1lbnQgb24gYSBzdXNwZW5kZWQgbWVtYmVyLgBVAUlmIGEgc3VzcGVuZGVkIG1lbWJlciBpcyBmb3JnaXZlbiwgd2Ugc2ltcGx5IGFkZCB0aGVtIGJhY2sgYXMgYSBtZW1iZXIsIG5vdCBhZmZlY3RpbmfIYW55IG9mIHRoZSBleGlzdGluZyBzdG9yYWdlIGl0ZW1zIGZvciB0aGF0IG1lbWJlci4ARQFJZiBhIHN1c3BlbmRlZCBtZW1iZXIgaXMgcmVqZWN0ZWQsIHJlbW92ZSBhbGwgYXNzb2NpYXRlZCBzdG9yYWdlIGl0ZW1zLCBpbmNsdWRpbmf8dGhlaXIgcGF5b3V0cywgYW5kIHJlbW92ZSBhbnkgdm91Y2hlZCBiaWRzIHRoZXkgY3VycmVudGx5IGhhdmUuAAkBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgU2lnbmVkIGZyb20gdGhlIEZvdW5kZXIuACxQYXJhbWV0ZXJzOrAtIGB3aG9gIC0gVGhlIHN1c3BlbmRlZCBtZW1iZXIgdG8gYmUganVkZ2VkLlUBLSBgZm9yZ2l2ZWAgLSBBIGJvb2xlYW4gcmVwcmVzZW50aW5nIHdoZXRoZXIgdGhlIHN1c3BlbnNpb24ganVkZ2VtZW50IG9yaWdpbiBmb3JnaXZlc8wgIChgdHJ1ZWApIG9yIHJlamVjdHMgKGBmYWxzZWApIGEgc3VzcGVuZGVkIG1lbWJlci44c2V0X3BhcmFtZXRlcnMQASxtYXhfbWVtYmVycxABDHUzMgABKG1heF9pbnRha2UQAQx1MzIAASxtYXhfc3RyaWtlcxABDHUzMgABRGNhbmRpZGF0ZV9kZXBvc2l0GAE8QmFsYW5jZU9mPFQsIEk+AAswYQFDaGFuZ2UgdGhlIG1heGltdW0gbnVtYmVyIG9mIG1lbWJlcnMgaW4gc29jaWV0eSBhbmQgdGhlIG1heGltdW0gbnVtYmVyIG9mIG5ldyBjYW5kaWRhdGVzaGluIGEgc2luZ2xlIGludGFrZSBwZXJpb2QuAAEBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgU2lnbmVkIGJ5IHRoZSBGb3VuZGVyLgAsUGFyYW1ldGVyczpVAS0gYG1heF9tZW1iZXJzYCAtIFRoZSBtYXhpbXVtIG51bWJlciBvZiBtZW1iZXJzIGZvciB0aGUgc29jaWV0eS4gVGhpcyBtdXN0IGJlIG5vIGxlc3OUICB0aGFuIHRoZSBjdXJyZW50IG51bWJlciBvZiBtZW1iZXJzLhEBLSBgbWF4X2ludGFrZWAgLSBUaGUgbWF4aW11bSBudW1iZXIgb2YgY2FuZGlkYXRlcyBwZXIgaW50YWtlIHBlcmlvZC5JAS0gYG1heF9zdHJpa2VzYDogVGhlIG1heGltdW0gbnVtYmVyIG9mIHN0cmlrZXMgYSBtZW1iZXIgbWF5IGdldCBiZWZvcmUgdGhleSBiZWNvbWXYICBzdXNwZW5kZWQgYW5kIG1heSBvbmx5IGJlIHJlaW5zdGF0ZWQgYnkgdGhlIGZvdW5kZXIuWQEtIGBjYW5kaWRhdGVfZGVwb3NpdGA6IFRoZSBkZXBvc2l0IHJlcXVpcmVkIHRvIG1ha2UgYSBiaWQgZm9yIG1lbWJlcnNoaXAgb2YgdGhlIGdyb3VwLjhwdW5pc2hfc2tlcHRpYwAMCFUBUHVuaXNoIHRoZSBza2VwdGljIHdpdGggYSBzdHJpa2UgaWYgdGhleSBkaWQgbm90IHZvdGUgb24gYSBjYW5kaWRhdGUuIENhbGxhYmxlIGJ5IHRoZShjYW5kaWRhdGUuQGNsYWltX21lbWJlcnNoaXAADQgNAVRyYW5zZm9ybSBhbiBhcHByb3ZlZCBjYW5kaWRhdGUgaW50byBhIG1lbWJlci4gQ2FsbGFibGUgb25seSBieSB0aGX4dGhlIGNhbmRpZGF0ZSwgYW5kIG9ubHkgYWZ0ZXIgdGhlIHBlcmlvZCBmb3Igdm90aW5nIGhhcyBlbmRlZC5EYmVzdG93X21lbWJlcnNoaXAEASRjYW5kaWRhdGUAATBUOjpBY2NvdW50SWQADgxhAVRyYW5zZm9ybSBhbiBhcHByb3ZlZCBjYW5kaWRhdGUgaW50byBhIG1lbWJlci4gQ2FsbGFibGUgb25seSBieSB0aGUgU2lnbmVkIG9yaWdpbiBvZiB0aGVZAUZvdW5kZXIsIG9ubHkgYWZ0ZXIgdGhlIHBlcmlvZCBmb3Igdm90aW5nIGhhcyBlbmRlZCBhbmQgb25seSB3aGVuIHRoZSBjYW5kaWRhdGUgaXMgbm90RGNsZWFybHkgcmVqZWN0ZWQuOGtpY2tfY2FuZGlkYXRlBAEkY2FuZGlkYXRlAAEwVDo6QWNjb3VudElkAA8UXQFSZW1vdmUgdGhlIGNhbmRpZGF0ZSdzIGFwcGxpY2F0aW9uIGZyb20gdGhlIHNvY2lldHkuIENhbGxhYmxlIG9ubHkgYnkgdGhlIFNpZ25lZCBvcmlnaW5VAW9mIHRoZSBGb3VuZGVyLCBvbmx5IGFmdGVyIHRoZSBwZXJpb2QgZm9yIHZvdGluZyBoYXMgZW5kZWQsIGFuZCBvbmx5IHdoZW4gdGhleSBkbyBub3RYaGF2ZSBhIGNsZWFyIGFwcHJvdmFsLgC4QW55IGJpZCBkZXBvc2l0IGlzIGxvc3QgYW5kIHZvdWNoZXIgaXMgYmFubmVkLkByZXNpZ25fY2FuZGlkYWN5ABAMUQFSZW1vdmUgdGhlIGNhbmRpZGF0ZSdzIGFwcGxpY2F0aW9uIGZyb20gdGhlIHNvY2lldHkuIENhbGxhYmxlIG9ubHkgYnkgdGhlIGNhbmRpZGF0ZS4AuEFueSBiaWQgZGVwb3NpdCBpcyBsb3N0IGFuZCB2b3VjaGVyIGlzIGJhbm5lZC44ZHJvcF9jYW5kaWRhdGUEASRjYW5kaWRhdGUAATBUOjpBY2NvdW50SWQAERQtAVJlbW92ZSBhIGBjYW5kaWRhdGVgJ3MgZmFpbGVkIGFwcGxpY2F0aW9uIGZyb20gdGhlIHNvY2lldHkuIENhbGxhYmxlIGJ5IGFueRkBc2lnbmVkIG9yaWdpbiBidXQgb25seSBhdCB0aGUgZW5kIG9mIHRoZSBzdWJzZXF1ZW50IHJvdW5kIGFuZCBvbmx5IGZvcsBhIGNhbmRpZGF0ZSB3aXRoIG1vcmUgcmVqZWN0aW9ucyB0aGFuIGFwcHJvdmFscy4AyFRoZSBiaWQgZGVwb3NpdCBpcyBsb3N0IGFuZCB0aGUgdm91Y2hlciBpcyBiYW5uZWQuRGNsZWFudXBfY2FuZGlkYWN5CAEkY2FuZGlkYXRlAAEwVDo6QWNjb3VudElkAAEMbWF4EAEMdTMyABIM5FJlbW92ZSB1cCB0byBgbWF4YCBzdGFsZSB2b3RlcyBmb3IgdGhlIGdpdmVuIGBjYW5kaWRhdGVgLgBZAU1heSBiZSBjYWxsZWQgYnkgYW55IFNpZ25lZCBvcmlnaW4sIGJ1dCBvbmx5IGFmdGVyIHRoZSBjYW5kaWRhdGUncyBjYW5kaWRhY3kgaXMgZW5kZWQuRGNsZWFudXBfY2hhbGxlbmdlCAE8Y2hhbGxlbmdlX3JvdW5kEAEoUm91bmRJbmRleAABDG1heBABDHUzMgATDD0BUmVtb3ZlIHVwIHRvIGBtYXhgIHN0YWxlIHZvdGVzIGZvciB0aGUgZGVmZW5kZXIgaW4gdGhlIGdpdmVuIGBjaGFsbGVuZ2Vfcm91bmRgLgBBAU1heSBiZSBjYWxsZWQgYnkgYW55IFNpZ25lZCBvcmlnaW4sIGJ1dCBvbmx5IGFmdGVyIHRoZSBjaGFsbGVuZ2Ugcm91bmQgaXMgZW5kZWQuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLuECDDxwYWxsZXRfcmVjb3ZlcnkYcGFsbGV0EENhbGwEBFQAASQwYXNfcmVjb3ZlcmVkCAEcYWNjb3VudJ0BAVBBY2NvdW50SWRMb29rdXBPZjxUPgABEGNhbGxdAQF8Qm94PDxUIGFzIENvbmZpZz46OlJ1bnRpbWVDYWxsPgAAIKBTZW5kIGEgY2FsbCB0aHJvdWdoIGEgcmVjb3ZlcmVkIGFjY291bnQuABEBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8gYW5kIHJlZ2lzdGVyZWQgdG/kYmUgYWJsZSB0byBtYWtlIGNhbGxzIG9uIGJlaGFsZiBvZiB0aGUgcmVjb3ZlcmVkIGFjY291bnQuACxQYXJhbWV0ZXJzOiEBLSBgYWNjb3VudGA6IFRoZSByZWNvdmVyZWQgYWNjb3VudCB5b3Ugd2FudCB0byBtYWtlIGEgY2FsbCBvbi1iZWhhbGYtb2Yu/C0gYGNhbGxgOiBUaGUgY2FsbCB5b3Ugd2FudCB0byBtYWtlIHdpdGggdGhlIHJlY292ZXJlZCBhY2NvdW50LjRzZXRfcmVjb3ZlcmVkCAEQbG9zdJ0BAVBBY2NvdW50SWRMb29rdXBPZjxUPgABHHJlc2N1ZXKdAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AASAZAUFsbG93IFJPT1QgdG8gYnlwYXNzIHRoZSByZWNvdmVyeSBwcm9jZXNzIGFuZCBzZXQgYW4gYSByZXNjdWVyIGFjY291bnRwZm9yIGEgbG9zdCBhY2NvdW50IGRpcmVjdGx5LgDEVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1JPT1RfLgAsUGFyYW1ldGVyczq0LSBgbG9zdGA6IFRoZSAibG9zdCBhY2NvdW50IiB0byBiZSByZWNvdmVyZWQuGQEtIGByZXNjdWVyYDogVGhlICJyZXNjdWVyIGFjY291bnQiIHdoaWNoIGNhbiBjYWxsIGFzIHRoZSBsb3N0IGFjY291bnQuPGNyZWF0ZV9yZWNvdmVyeQwBHGZyaWVuZHOtAQFEVmVjPFQ6OkFjY291bnRJZD4AASR0aHJlc2hvbGRVAQEMdTE2AAEwZGVsYXlfcGVyaW9kEAFEQmxvY2tOdW1iZXJGb3I8VD4AAkBZAUNyZWF0ZSBhIHJlY292ZXJ5IGNvbmZpZ3VyYXRpb24gZm9yIHlvdXIgYWNjb3VudC4gVGhpcyBtYWtlcyB5b3VyIGFjY291bnQgcmVjb3ZlcmFibGUuAC0BUGF5bWVudDogYENvbmZpZ0RlcG9zaXRCYXNlYCArIGBGcmllbmREZXBvc2l0RmFjdG9yYCAqICNfb2ZfZnJpZW5kcyBiYWxhbmNlRQF3aWxsIGJlIHJlc2VydmVkIGZvciBzdG9yaW5nIHRoZSByZWNvdmVyeSBjb25maWd1cmF0aW9uLiBUaGlzIGRlcG9zaXQgaXMgcmV0dXJuZWS4aW4gZnVsbCB3aGVuIHRoZSB1c2VyIGNhbGxzIGByZW1vdmVfcmVjb3ZlcnlgLgDMVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uACxQYXJhbWV0ZXJzOkkBLSBgZnJpZW5kc2A6IEEgbGlzdCBvZiBmcmllbmRzIHlvdSB0cnVzdCB0byB2b3VjaCBmb3IgcmVjb3ZlcnkgYXR0ZW1wdHMuIFNob3VsZCBiZaggIG9yZGVyZWQgYW5kIGNvbnRhaW4gbm8gZHVwbGljYXRlIHZhbHVlcy5ZAS0gYHRocmVzaG9sZGA6IFRoZSBudW1iZXIgb2YgZnJpZW5kcyB0aGF0IG11c3Qgdm91Y2ggZm9yIGEgcmVjb3ZlcnkgYXR0ZW1wdCBiZWZvcmUgdGhlVQEgIGFjY291bnQgY2FuIGJlIHJlY292ZXJlZC4gU2hvdWxkIGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgbGVuZ3RoIG9mIHRoZSBsaXN0IG9mKCAgZnJpZW5kcy5NAS0gYGRlbGF5X3BlcmlvZGA6IFRoZSBudW1iZXIgb2YgYmxvY2tzIGFmdGVyIGEgcmVjb3ZlcnkgYXR0ZW1wdCBpcyBpbml0aWFsaXplZCB0aGF00CAgbmVlZHMgdG8gcGFzcyBiZWZvcmUgdGhlIGFjY291bnQgY2FuIGJlIHJlY292ZXJlZC5EaW5pdGlhdGVfcmVjb3ZlcnkEARxhY2NvdW50nQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAMs6EluaXRpYXRlIHRoZSBwcm9jZXNzIGZvciByZWNvdmVyaW5nIGEgcmVjb3ZlcmFibGUgYWNjb3VudC4AGQFQYXltZW50OiBgUmVjb3ZlcnlEZXBvc2l0YCBiYWxhbmNlIHdpbGwgYmUgcmVzZXJ2ZWQgZm9yIGluaXRpYXRpbmcgdGhlIQFyZWNvdmVyeSBwcm9jZXNzLiBUaGlzIGRlcG9zaXQgd2lsbCBhbHdheXMgYmUgcmVwYXRyaWF0ZWQgdG8gdGhlIGFjY291bnS0dHJ5aW5nIHRvIGJlIHJlY292ZXJlZC4gU2VlIGBjbG9zZV9yZWNvdmVyeWAuAMxUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXy4ALFBhcmFtZXRlcnM6QQEtIGBhY2NvdW50YDogVGhlIGxvc3QgYWNjb3VudCB0aGF0IHlvdSB3YW50IHRvIHJlY292ZXIuIFRoaXMgYWNjb3VudCBuZWVkcyB0byBiZcwgIHJlY292ZXJhYmxlIChpLmUuIGhhdmUgYSByZWNvdmVyeSBjb25maWd1cmF0aW9uKS44dm91Y2hfcmVjb3ZlcnkIARBsb3N0nQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEccmVzY3Vlcp0BAVBBY2NvdW50SWRMb29rdXBPZjxUPgAEMCUBQWxsb3cgYSAiZnJpZW5kIiBvZiBhIHJlY292ZXJhYmxlIGFjY291bnQgdG8gdm91Y2ggZm9yIGFuIGFjdGl2ZSByZWNvdmVyeWRwcm9jZXNzIGZvciB0aGF0IGFjY291bnQuACUBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8gYW5kIG11c3QgYmUgYSAiZnJpZW5kInBmb3IgdGhlIHJlY292ZXJhYmxlIGFjY291bnQuACxQYXJhbWV0ZXJzOtAtIGBsb3N0YDogVGhlIGxvc3QgYWNjb3VudCB0aGF0IHlvdSB3YW50IHRvIHJlY292ZXIuWQEtIGByZXNjdWVyYDogVGhlIGFjY291bnQgdHJ5aW5nIHRvIHJlc2N1ZSB0aGUgbG9zdCBhY2NvdW50IHRoYXQgeW91IHdhbnQgdG8gdm91Y2ggZm9yLgAhAVRoZSBjb21iaW5hdGlvbiBvZiB0aGVzZSB0d28gcGFyYW1ldGVycyBtdXN0IHBvaW50IHRvIGFuIGFjdGl2ZSByZWNvdmVyeSBwcm9jZXNzLjhjbGFpbV9yZWNvdmVyeQQBHGFjY291bnSdAQFQQWNjb3VudElkTG9va3VwT2Y8VD4ABSTwQWxsb3cgYSBzdWNjZXNzZnVsIHJlc2N1ZXIgdG8gY2xhaW0gdGhlaXIgcmVjb3ZlcmVkIGFjY291bnQuACkBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8gYW5kIG11c3QgYmUgYSAicmVzY3VlciIZAXdobyBoYXMgc3VjY2Vzc2Z1bGx5IGNvbXBsZXRlZCB0aGUgYWNjb3VudCByZWNvdmVyeSBwcm9jZXNzOiBjb2xsZWN0ZWQtAWB0aHJlc2hvbGRgIG9yIG1vcmUgdm91Y2hlcywgd2FpdGVkIGBkZWxheV9wZXJpb2RgIGJsb2NrcyBzaW5jZSBpbml0aWF0aW9uLgAsUGFyYW1ldGVyczpdAS0gYGFjY291bnRgOiBUaGUgbG9zdCBhY2NvdW50IHRoYXQgeW91IHdhbnQgdG8gY2xhaW0gaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHJlY292ZXJlZCBieRggIHlvdS44Y2xvc2VfcmVjb3ZlcnkEARxyZXNjdWVynQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAYsEQFBcyB0aGUgY29udHJvbGxlciBvZiBhIHJlY292ZXJhYmxlIGFjY291bnQsIGNsb3NlIGFuIGFjdGl2ZSByZWNvdmVyeWRwcm9jZXNzIGZvciB5b3VyIGFjY291bnQuAB0BUGF5bWVudDogQnkgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLCB0aGUgcmVjb3ZlcmFibGUgYWNjb3VudCB3aWxsIHJlY2VpdmX0dGhlIHJlY292ZXJ5IGRlcG9zaXQgYFJlY292ZXJ5RGVwb3NpdGAgcGxhY2VkIGJ5IHRoZSByZXNjdWVyLgABAVRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfIGFuZCBtdXN0IGJlIGHscmVjb3ZlcmFibGUgYWNjb3VudCB3aXRoIGFuIGFjdGl2ZSByZWNvdmVyeSBwcm9jZXNzIGZvciBpdC4ALFBhcmFtZXRlcnM6DQEtIGByZXNjdWVyYDogVGhlIGFjY291bnQgdHJ5aW5nIHRvIHJlc2N1ZSB0aGlzIHJlY292ZXJhYmxlIGFjY291bnQuPHJlbW92ZV9yZWNvdmVyeQAHLFkBUmVtb3ZlIHRoZSByZWNvdmVyeSBwcm9jZXNzIGZvciB5b3VyIGFjY291bnQuIFJlY292ZXJlZCBhY2NvdW50cyBhcmUgc3RpbGwgYWNjZXNzaWJsZS4AEQFOT1RFOiBUaGUgdXNlciBtdXN0IG1ha2Ugc3VyZSB0byBjYWxsIGBjbG9zZV9yZWNvdmVyeWAgb24gYWxsIGFjdGl2ZQUBcmVjb3ZlcnkgYXR0ZW1wdHMgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiBlbHNlIGl0IHdpbGwgZmFpbC4AIQFQYXltZW50OiBCeSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gdGhlIHJlY292ZXJhYmxlIGFjY291bnQgd2lsbCB1bnJlc2VydmWUdGhlaXIgcmVjb3ZlcnkgY29uZmlndXJhdGlvbiBkZXBvc2l0LvAoYENvbmZpZ0RlcG9zaXRCYXNlYCArIGBGcmllbmREZXBvc2l0RmFjdG9yYCAqICNfb2ZfZnJpZW5kcykAAQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXyBhbmQgbXVzdCBiZSBh4HJlY292ZXJhYmxlIGFjY291bnQgKGkuZS4gaGFzIGEgcmVjb3ZlcnkgY29uZmlndXJhdGlvbikuQGNhbmNlbF9yZWNvdmVyZWQEARxhY2NvdW50nQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAgc3ENhbmNlbCB0aGUgYWJpbGl0eSB0byB1c2UgYGFzX3JlY292ZXJlZGAgZm9yIGBhY2NvdW50YC4AEQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXyBhbmQgcmVnaXN0ZXJlZCB0b+RiZSBhYmxlIHRvIG1ha2UgY2FsbHMgb24gYmVoYWxmIG9mIHRoZSByZWNvdmVyZWQgYWNjb3VudC4ALFBhcmFtZXRlcnM6FQEtIGBhY2NvdW50YDogVGhlIHJlY292ZXJlZCBhY2NvdW50IHlvdSBhcmUgYWJsZSB0byBjYWxsIG9uLWJlaGFsZi1vZi4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMu5QIMOHBhbGxldF92ZXN0aW5nGHBhbGxldBBDYWxsBARUAAEYEHZlc3QAACS4VW5sb2NrIGFueSB2ZXN0ZWQgZnVuZHMgb2YgdGhlIHNlbmRlciBhY2NvdW50LgBdAVRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfIGFuZCB0aGUgc2VuZGVyIG11c3QgaGF2ZSBmdW5kcyBzdGlsbGRsb2NrZWQgdW5kZXIgdGhpcyBwYWxsZXQuANBFbWl0cyBlaXRoZXIgYFZlc3RpbmdDb21wbGV0ZWRgIG9yIGBWZXN0aW5nVXBkYXRlZGAuADQjIyBDb21wbGV4aXR5JC0gYE8oMSlgLih2ZXN0X290aGVyBAEYdGFyZ2V0nQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEsuFVubG9jayBhbnkgdmVzdGVkIGZ1bmRzIG9mIGEgYHRhcmdldGAgYWNjb3VudC4AzFRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfLgBRAS0gYHRhcmdldGA6IFRoZSBhY2NvdW50IHdob3NlIHZlc3RlZCBmdW5kcyBzaG91bGQgYmUgdW5sb2NrZWQuIE11c3QgaGF2ZSBmdW5kcyBzdGlsbGRsb2NrZWQgdW5kZXIgdGhpcyBwYWxsZXQuANBFbWl0cyBlaXRoZXIgYFZlc3RpbmdDb21wbGV0ZWRgIG9yIGBWZXN0aW5nVXBkYXRlZGAuADQjIyBDb21wbGV4aXR5JC0gYE8oMSlgLjx2ZXN0ZWRfdHJhbnNmZXIIARh0YXJnZXSdAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AASBzY2hlZHVsZekCAbBWZXN0aW5nSW5mbzxCYWxhbmNlT2Y8VD4sIEJsb2NrTnVtYmVyRm9yPFQ+PgACNGRDcmVhdGUgYSB2ZXN0ZWQgdHJhbnNmZXIuAMxUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXy4AzC0gYHRhcmdldGA6IFRoZSBhY2NvdW50IHJlY2VpdmluZyB0aGUgdmVzdGVkIGZ1bmRzLvAtIGBzY2hlZHVsZWA6IFRoZSB2ZXN0aW5nIHNjaGVkdWxlIGF0dGFjaGVkIHRvIHRoZSB0cmFuc2Zlci4AXEVtaXRzIGBWZXN0aW5nQ3JlYXRlZGAuAPxOT1RFOiBUaGlzIHdpbGwgdW5sb2NrIGFsbCBzY2hlZHVsZXMgdGhyb3VnaCB0aGUgY3VycmVudCBibG9jay4ANCMjIENvbXBsZXhpdHkkLSBgTygxKWAuVGZvcmNlX3Zlc3RlZF90cmFuc2ZlcgwBGHNvdXJjZZ0BAVBBY2NvdW50SWRMb29rdXBPZjxUPgABGHRhcmdldJ0BAVBBY2NvdW50SWRMb29rdXBPZjxUPgABIHNjaGVkdWxl6QIBsFZlc3RpbmdJbmZvPEJhbGFuY2VPZjxUPiwgQmxvY2tOdW1iZXJGb3I8VD4+AAM4YEZvcmNlIGEgdmVzdGVkIHRyYW5zZmVyLgDEVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1Jvb3RfLgDoLSBgc291cmNlYDogVGhlIGFjY291bnQgd2hvc2UgZnVuZHMgc2hvdWxkIGJlIHRyYW5zZmVycmVkLhEBLSBgdGFyZ2V0YDogVGhlIGFjY291bnQgdGhhdCBzaG91bGQgYmUgdHJhbnNmZXJyZWQgdGhlIHZlc3RlZCBmdW5kcy7wLSBgc2NoZWR1bGVgOiBUaGUgdmVzdGluZyBzY2hlZHVsZSBhdHRhY2hlZCB0byB0aGUgdHJhbnNmZXIuAFxFbWl0cyBgVmVzdGluZ0NyZWF0ZWRgLgD8Tk9URTogVGhpcyB3aWxsIHVubG9jayBhbGwgc2NoZWR1bGVzIHRocm91Z2ggdGhlIGN1cnJlbnQgYmxvY2suADQjIyBDb21wbGV4aXR5JC0gYE8oMSlgLjxtZXJnZV9zY2hlZHVsZXMIATxzY2hlZHVsZTFfaW5kZXgQAQx1MzIAATxzY2hlZHVsZTJfaW5kZXgQAQx1MzIABFRdAU1lcmdlIHR3byB2ZXN0aW5nIHNjaGVkdWxlcyB0b2dldGhlciwgY3JlYXRpbmcgYSBuZXcgdmVzdGluZyBzY2hlZHVsZSB0aGF0IHVubG9ja3Mgb3ZlclUBdGhlIGhpZ2hlc3QgcG9zc2libGUgc3RhcnQgYW5kIGVuZCBibG9ja3MuIElmIGJvdGggc2NoZWR1bGVzIGhhdmUgYWxyZWFkeSBzdGFydGVkIHRoZVkBY3VycmVudCBibG9jayB3aWxsIGJlIHVzZWQgYXMgdGhlIHNjaGVkdWxlIHN0YXJ0OyB3aXRoIHRoZSBjYXZlYXQgdGhhdCBpZiBvbmUgc2NoZWR1bGVdAWlzIGZpbmlzaGVkIGJ5IHRoZSBjdXJyZW50IGJsb2NrLCB0aGUgb3RoZXIgd2lsbCBiZSB0cmVhdGVkIGFzIHRoZSBuZXcgbWVyZ2VkIHNjaGVkdWxlLCx1bm1vZGlmaWVkLgD4Tk9URTogSWYgYHNjaGVkdWxlMV9pbmRleCA9PSBzY2hlZHVsZTJfaW5kZXhgIHRoaXMgaXMgYSBuby1vcC5BAU5PVEU6IFRoaXMgd2lsbCB1bmxvY2sgYWxsIHNjaGVkdWxlcyB0aHJvdWdoIHRoZSBjdXJyZW50IGJsb2NrIHByaW9yIHRvIG1lcmdpbmcuYQFOT1RFOiBJZiBib3RoIHNjaGVkdWxlcyBoYXZlIGVuZGVkIGJ5IHRoZSBjdXJyZW50IGJsb2NrLCBubyBuZXcgc2NoZWR1bGUgd2lsbCBiZSBjcmVhdGVkZGFuZCBib3RoIHdpbGwgYmUgcmVtb3ZlZC4AbE1lcmdlZCBzY2hlZHVsZSBhdHRyaWJ1dGVzOjUBLSBgc3RhcnRpbmdfYmxvY2tgOiBgTUFYKHNjaGVkdWxlMS5zdGFydGluZ19ibG9jaywgc2NoZWR1bGVkMi5zdGFydGluZ19ibG9jayxIICBjdXJyZW50X2Jsb2NrKWAuIQEtIGBlbmRpbmdfYmxvY2tgOiBgTUFYKHNjaGVkdWxlMS5lbmRpbmdfYmxvY2ssIHNjaGVkdWxlMi5lbmRpbmdfYmxvY2spYC5ZAS0gYGxvY2tlZGA6IGBzY2hlZHVsZTEubG9ja2VkX2F0KGN1cnJlbnRfYmxvY2spICsgc2NoZWR1bGUyLmxvY2tlZF9hdChjdXJyZW50X2Jsb2NrKWAuAMxUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXy4A6C0gYHNjaGVkdWxlMV9pbmRleGA6IGluZGV4IG9mIHRoZSBmaXJzdCBzY2hlZHVsZSB0byBtZXJnZS7sLSBgc2NoZWR1bGUyX2luZGV4YDogaW5kZXggb2YgdGhlIHNlY29uZCBzY2hlZHVsZSB0byBtZXJnZS50Zm9yY2VfcmVtb3ZlX3Zlc3Rpbmdfc2NoZWR1bGUIARh0YXJnZXSdAQGMPFQ6Okxvb2t1cCBhcyBTdGF0aWNMb29rdXA+OjpTb3VyY2UAAThzY2hlZHVsZV9pbmRleBABDHUzMgAFGHxGb3JjZSByZW1vdmUgYSB2ZXN0aW5nIHNjaGVkdWxlAMRUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfUm9vdF8uAMgtIGB0YXJnZXRgOiBBbiBhY2NvdW50IHRoYXQgaGFzIGEgdmVzdGluZyBzY2hlZHVsZRUBLSBgc2NoZWR1bGVfaW5kZXhgOiBUaGUgdmVzdGluZyBzY2hlZHVsZSBpbmRleCB0aGF0IHNob3VsZCBiZSByZW1vdmVkBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLukCDDhwYWxsZXRfdmVzdGluZzB2ZXN0aW5nX2luZm8sVmVzdGluZ0luZm8IHEJhbGFuY2UBGCxCbG9ja051bWJlcgEQAAwBGGxvY2tlZBgBHEJhbGFuY2UAASRwZXJfYmxvY2sYARxCYWxhbmNlAAE4c3RhcnRpbmdfYmxvY2sQASxCbG9ja051bWJlcgAA7QIMQHBhbGxldF9zY2hlZHVsZXIYcGFsbGV0EENhbGwEBFQAASggc2NoZWR1bGUQARB3aGVuEAFEQmxvY2tOdW1iZXJGb3I8VD4AAThtYXliZV9wZXJpb2RpY/ECAaxPcHRpb248c2NoZWR1bGU6OlBlcmlvZDxCbG9ja051bWJlckZvcjxUPj4+AAEgcHJpb3JpdHkIAUhzY2hlZHVsZTo6UHJpb3JpdHkAARBjYWxsXQEBfEJveDw8VCBhcyBDb25maWc+OjpSdW50aW1lQ2FsbD4AAARwQW5vbnltb3VzbHkgc2NoZWR1bGUgYSB0YXNrLhhjYW5jZWwIARB3aGVuEAFEQmxvY2tOdW1iZXJGb3I8VD4AARRpbmRleBABDHUzMgABBJRDYW5jZWwgYW4gYW5vbnltb3VzbHkgc2NoZWR1bGVkIHRhc2suOHNjaGVkdWxlX25hbWVkFAEIaWQEASBUYXNrTmFtZQABEHdoZW4QAURCbG9ja051bWJlckZvcjxUPgABOG1heWJlX3BlcmlvZGlj8QIBrE9wdGlvbjxzY2hlZHVsZTo6UGVyaW9kPEJsb2NrTnVtYmVyRm9yPFQ+Pj4AASBwcmlvcml0eQgBSHNjaGVkdWxlOjpQcmlvcml0eQABEGNhbGxdAQF8Qm94PDxUIGFzIENvbmZpZz46OlJ1bnRpbWVDYWxsPgACBFhTY2hlZHVsZSBhIG5hbWVkIHRhc2suMGNhbmNlbF9uYW1lZAQBCGlkBAEgVGFza05hbWUAAwR4Q2FuY2VsIGEgbmFtZWQgc2NoZWR1bGVkIHRhc2suOHNjaGVkdWxlX2FmdGVyEAEUYWZ0ZXIQAURCbG9ja051bWJlckZvcjxUPgABOG1heWJlX3BlcmlvZGlj8QIBrE9wdGlvbjxzY2hlZHVsZTo6UGVyaW9kPEJsb2NrTnVtYmVyRm9yPFQ+Pj4AASBwcmlvcml0eQgBSHNjaGVkdWxlOjpQcmlvcml0eQABEGNhbGxdAQF8Qm94PDxUIGFzIENvbmZpZz46OlJ1bnRpbWVDYWxsPgAEBKhBbm9ueW1vdXNseSBzY2hlZHVsZSBhIHRhc2sgYWZ0ZXIgYSBkZWxheS5Qc2NoZWR1bGVfbmFtZWRfYWZ0ZXIUAQhpZAQBIFRhc2tOYW1lAAEUYWZ0ZXIQAURCbG9ja051bWJlckZvcjxUPgABOG1heWJlX3BlcmlvZGlj8QIBrE9wdGlvbjxzY2hlZHVsZTo6UGVyaW9kPEJsb2NrTnVtYmVyRm9yPFQ+Pj4AASBwcmlvcml0eQgBSHNjaGVkdWxlOjpQcmlvcml0eQABEGNhbGxdAQF8Qm94PDxUIGFzIENvbmZpZz46OlJ1bnRpbWVDYWxsPgAFBJBTY2hlZHVsZSBhIG5hbWVkIHRhc2sgYWZ0ZXIgYSBkZWxheS4kc2V0X3JldHJ5DAEQdGFza/UCAXhUYXNrQWRkcmVzczxCbG9ja051bWJlckZvcjxUPj4AARxyZXRyaWVzCAEIdTgAARhwZXJpb2QQAURCbG9ja051bWJlckZvcjxUPgAGMFkBU2V0IGEgcmV0cnkgY29uZmlndXJhdGlvbiBmb3IgYSB0YXNrIHNvIHRoYXQsIGluIGNhc2UgaXRzIHNjaGVkdWxlZCBydW4gZmFpbHMsIGl0IHdpbGxVAWJlIHJldHJpZWQgYWZ0ZXIgYHBlcmlvZGAgYmxvY2tzLCBmb3IgYSB0b3RhbCBhbW91bnQgb2YgYHJldHJpZXNgIHJldHJpZXMgb3IgdW50aWwgaXQkc3VjY2VlZHMuAFUBVGFza3Mgd2hpY2ggbmVlZCB0byBiZSBzY2hlZHVsZWQgZm9yIGEgcmV0cnkgYXJlIHN0aWxsIHN1YmplY3QgdG8gd2VpZ2h0IG1ldGVyaW5nIGFuZFEBYWdlbmRhIHNwYWNlLCBzYW1lIGFzIGEgcmVndWxhciB0YXNrLiBJZiBhIHBlcmlvZGljIHRhc2sgZmFpbHMsIGl0IHdpbGwgYmUgc2NoZWR1bGVkkG5vcm1hbGx5IHdoaWxlIHRoZSB0YXNrIGlzIHJldHJ5aW5nLgBRAVRhc2tzIHNjaGVkdWxlZCBhcyBhIHJlc3VsdCBvZiBhIHJldHJ5IGZvciBhIHBlcmlvZGljIHRhc2sgYXJlIHVubmFtZWQsIG5vbi1wZXJpb2RpYz0BY2xvbmVzIG9mIHRoZSBvcmlnaW5hbCB0YXNrLiBUaGVpciByZXRyeSBjb25maWd1cmF0aW9uIHdpbGwgYmUgZGVyaXZlZCBmcm9tIHRoZU0Bb3JpZ2luYWwgdGFzaydzIGNvbmZpZ3VyYXRpb24sIGJ1dCB3aWxsIGhhdmUgYSBsb3dlciB2YWx1ZSBmb3IgYHJlbWFpbmluZ2AgdGhhbiB0aGVkb3JpZ2luYWwgYHRvdGFsX3JldHJpZXNgLjxzZXRfcmV0cnlfbmFtZWQMAQhpZAQBIFRhc2tOYW1lAAEccmV0cmllcwgBCHU4AAEYcGVyaW9kEAFEQmxvY2tOdW1iZXJGb3I8VD4ABzBdAVNldCBhIHJldHJ5IGNvbmZpZ3VyYXRpb24gZm9yIGEgbmFtZWQgdGFzayBzbyB0aGF0LCBpbiBjYXNlIGl0cyBzY2hlZHVsZWQgcnVuIGZhaWxzLCBpdF0Bd2lsbCBiZSByZXRyaWVkIGFmdGVyIGBwZXJpb2RgIGJsb2NrcywgZm9yIGEgdG90YWwgYW1vdW50IG9mIGByZXRyaWVzYCByZXRyaWVzIG9yIHVudGlsMGl0IHN1Y2NlZWRzLgBVAVRhc2tzIHdoaWNoIG5lZWQgdG8gYmUgc2NoZWR1bGVkIGZvciBhIHJldHJ5IGFyZSBzdGlsbCBzdWJqZWN0IHRvIHdlaWdodCBtZXRlcmluZyBhbmRRAWFnZW5kYSBzcGFjZSwgc2FtZSBhcyBhIHJlZ3VsYXIgdGFzay4gSWYgYSBwZXJpb2RpYyB0YXNrIGZhaWxzLCBpdCB3aWxsIGJlIHNjaGVkdWxlZJBub3JtYWxseSB3aGlsZSB0aGUgdGFzayBpcyByZXRyeWluZy4AUQFUYXNrcyBzY2hlZHVsZWQgYXMgYSByZXN1bHQgb2YgYSByZXRyeSBmb3IgYSBwZXJpb2RpYyB0YXNrIGFyZSB1bm5hbWVkLCBub24tcGVyaW9kaWM9AWNsb25lcyBvZiB0aGUgb3JpZ2luYWwgdGFzay4gVGhlaXIgcmV0cnkgY29uZmlndXJhdGlvbiB3aWxsIGJlIGRlcml2ZWQgZnJvbSB0aGVNAW9yaWdpbmFsIHRhc2sncyBjb25maWd1cmF0aW9uLCBidXQgd2lsbCBoYXZlIGEgbG93ZXIgdmFsdWUgZm9yIGByZW1haW5pbmdgIHRoYW4gdGhlZG9yaWdpbmFsIGB0b3RhbF9yZXRyaWVzYC4wY2FuY2VsX3JldHJ5BAEQdGFza/UCAXhUYXNrQWRkcmVzczxCbG9ja051bWJlckZvcjxUPj4ACASoUmVtb3ZlcyB0aGUgcmV0cnkgY29uZmlndXJhdGlvbiBvZiBhIHRhc2suSGNhbmNlbF9yZXRyeV9uYW1lZAQBCGlkBAEgVGFza05hbWUACQS8Q2FuY2VsIHRoZSByZXRyeSBjb25maWd1cmF0aW9uIG9mIGEgbmFtZWQgdGFzay4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMu8QIEGE9wdGlvbgQEVAH1AgEIEE5vbmUAAAAQU29tZQQA9QIAAAEAAPUCAAAECBAQAPkCDDBwYWxsZXRfcHJveHkYcGFsbGV0EENhbGwEBFQAASgUcHJveHkMARByZWFsnQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAFAZm9yY2VfcHJveHlfdHlwZf0CAVBPcHRpb248VDo6UHJveHlUeXBlPgABEGNhbGxdAQF8Qm94PDxUIGFzIENvbmZpZz46OlJ1bnRpbWVDYWxsPgAAJE0BRGlzcGF0Y2ggdGhlIGdpdmVuIGBjYWxsYCBmcm9tIGFuIGFjY291bnQgdGhhdCB0aGUgc2VuZGVyIGlzIGF1dGhvcmlzZWQgZm9yIHRocm91Z2gwYGFkZF9wcm94eWAuAMxUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXy4ALFBhcmFtZXRlcnM6DQEtIGByZWFsYDogVGhlIGFjY291bnQgdGhhdCB0aGUgcHJveHkgd2lsbCBtYWtlIGEgY2FsbCBvbiBiZWhhbGYgb2YuYQEtIGBmb3JjZV9wcm94eV90eXBlYDogU3BlY2lmeSB0aGUgZXhhY3QgcHJveHkgdHlwZSB0byBiZSB1c2VkIGFuZCBjaGVja2VkIGZvciB0aGlzIGNhbGwu0C0gYGNhbGxgOiBUaGUgY2FsbCB0byBiZSBtYWRlIGJ5IHRoZSBgcmVhbGAgYWNjb3VudC4kYWRkX3Byb3h5DAEgZGVsZWdhdGWdAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AAShwcm94eV90eXBlAQMBMFQ6OlByb3h5VHlwZQABFGRlbGF5EAFEQmxvY2tOdW1iZXJGb3I8VD4AASRFAVJlZ2lzdGVyIGEgcHJveHkgYWNjb3VudCBmb3IgdGhlIHNlbmRlciB0aGF0IGlzIGFibGUgdG8gbWFrZSBjYWxscyBvbiBpdHMgYmVoYWxmLgDMVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uACxQYXJhbWV0ZXJzOhEBLSBgcHJveHlgOiBUaGUgYWNjb3VudCB0aGF0IHRoZSBgY2FsbGVyYCB3b3VsZCBsaWtlIHRvIG1ha2UgYSBwcm94eS78LSBgcHJveHlfdHlwZWA6IFRoZSBwZXJtaXNzaW9ucyBhbGxvd2VkIGZvciB0aGlzIHByb3h5IGFjY291bnQuTQEtIGBkZWxheWA6IFRoZSBhbm5vdW5jZW1lbnQgcGVyaW9kIHJlcXVpcmVkIG9mIHRoZSBpbml0aWFsIHByb3h5LiBXaWxsIGdlbmVyYWxseSBiZRR6ZXJvLjByZW1vdmVfcHJveHkMASBkZWxlZ2F0ZZ0BAVBBY2NvdW50SWRMb29rdXBPZjxUPgABKHByb3h5X3R5cGUBAwEwVDo6UHJveHlUeXBlAAEUZGVsYXkQAURCbG9ja051bWJlckZvcjxUPgACHKhVbnJlZ2lzdGVyIGEgcHJveHkgYWNjb3VudCBmb3IgdGhlIHNlbmRlci4AzFRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfLgAsUGFyYW1ldGVyczolAS0gYHByb3h5YDogVGhlIGFjY291bnQgdGhhdCB0aGUgYGNhbGxlcmAgd291bGQgbGlrZSB0byByZW1vdmUgYXMgYSBwcm94eS5BAS0gYHByb3h5X3R5cGVgOiBUaGUgcGVybWlzc2lvbnMgY3VycmVudGx5IGVuYWJsZWQgZm9yIHRoZSByZW1vdmVkIHByb3h5IGFjY291bnQuOHJlbW92ZV9wcm94aWVzAAMYtFVucmVnaXN0ZXIgYWxsIHByb3h5IGFjY291bnRzIGZvciB0aGUgc2VuZGVyLgDMVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uAEEBV0FSTklORzogVGhpcyBtYXkgYmUgY2FsbGVkIG9uIGFjY291bnRzIGNyZWF0ZWQgYnkgYHB1cmVgLCBob3dldmVyIGlmIGRvbmUsIHRoZW5ZAXRoZSB1bnJlc2VydmVkIGZlZXMgd2lsbCBiZSBpbmFjY2Vzc2libGUuICoqQWxsIGFjY2VzcyB0byB0aGlzIGFjY291bnQgd2lsbCBiZSBsb3N0LioqLGNyZWF0ZV9wdXJlDAEocHJveHlfdHlwZQEDATBUOjpQcm94eVR5cGUAARRkZWxheRABREJsb2NrTnVtYmVyRm9yPFQ+AAEUaW5kZXhVAQEMdTE2AARIOQFTcGF3biBhIGZyZXNoIG5ldyBhY2NvdW50IHRoYXQgaXMgZ3VhcmFudGVlZCB0byBiZSBvdGhlcndpc2UgaW5hY2Nlc3NpYmxlLCBhbmT8aW5pdGlhbGl6ZSBpdCB3aXRoIGEgcHJveHkgb2YgYHByb3h5X3R5cGVgIGZvciBgb3JpZ2luYCBzZW5kZXIuAGxSZXF1aXJlcyBhIGBTaWduZWRgIG9yaWdpbi4AUQEtIGBwcm94eV90eXBlYDogVGhlIHR5cGUgb2YgdGhlIHByb3h5IHRoYXQgdGhlIHNlbmRlciB3aWxsIGJlIHJlZ2lzdGVyZWQgYXMgb3ZlciB0aGVNAW5ldyBhY2NvdW50LiBUaGlzIHdpbGwgYWxtb3N0IGFsd2F5cyBiZSB0aGUgbW9zdCBwZXJtaXNzaXZlIGBQcm94eVR5cGVgIHBvc3NpYmxlIHRveGFsbG93IGZvciBtYXhpbXVtIGZsZXhpYmlsaXR5LlEBLSBgaW5kZXhgOiBBIGRpc2FtYmlndWF0aW9uIGluZGV4LCBpbiBjYXNlIHRoaXMgaXMgY2FsbGVkIG11bHRpcGxlIHRpbWVzIGluIHRoZSBzYW1lXQF0cmFuc2FjdGlvbiAoZS5nLiB3aXRoIGB1dGlsaXR5OjpiYXRjaGApLiBVbmxlc3MgeW91J3JlIHVzaW5nIGBiYXRjaGAgeW91IHByb2JhYmx5IGp1c3RAd2FudCB0byB1c2UgYDBgLk0BLSBgZGVsYXlgOiBUaGUgYW5ub3VuY2VtZW50IHBlcmlvZCByZXF1aXJlZCBvZiB0aGUgaW5pdGlhbCBwcm94eS4gV2lsbCBnZW5lcmFsbHkgYmUUemVyby4AUQFGYWlscyB3aXRoIGBEdXBsaWNhdGVgIGlmIHRoaXMgaGFzIGFscmVhZHkgYmVlbiBjYWxsZWQgaW4gdGhpcyB0cmFuc2FjdGlvbiwgZnJvbSB0aGWYc2FtZSBzZW5kZXIsIHdpdGggdGhlIHNhbWUgcGFyYW1ldGVycy4A5EZhaWxzIGlmIHRoZXJlIGFyZSBpbnN1ZmZpY2llbnQgZnVuZHMgdG8gcGF5IGZvciBkZXBvc2l0LiRraWxsX3B1cmUUARxzcGF3bmVynQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEocHJveHlfdHlwZQEDATBUOjpQcm94eVR5cGUAARRpbmRleFUBAQx1MTYAARhoZWlnaHTUAURCbG9ja051bWJlckZvcjxUPgABJGV4dF9pbmRleNQBDHUzMgAFQKBSZW1vdmVzIGEgcHJldmlvdXNseSBzcGF3bmVkIHB1cmUgcHJveHkuAEkBV0FSTklORzogKipBbGwgYWNjZXNzIHRvIHRoaXMgYWNjb3VudCB3aWxsIGJlIGxvc3QuKiogQW55IGZ1bmRzIGhlbGQgaW4gaXQgd2lsbCBiZTRpbmFjY2Vzc2libGUuAFkBUmVxdWlyZXMgYSBgU2lnbmVkYCBvcmlnaW4sIGFuZCB0aGUgc2VuZGVyIGFjY291bnQgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCBieSBhIGNhbGwgdG+UYHB1cmVgIHdpdGggY29ycmVzcG9uZGluZyBwYXJhbWV0ZXJzLgA5AS0gYHNwYXduZXJgOiBUaGUgYWNjb3VudCB0aGF0IG9yaWdpbmFsbHkgY2FsbGVkIGBwdXJlYCB0byBjcmVhdGUgdGhpcyBhY2NvdW50LjkBLSBgaW5kZXhgOiBUaGUgZGlzYW1iaWd1YXRpb24gaW5kZXggb3JpZ2luYWxseSBwYXNzZWQgdG8gYHB1cmVgLiBQcm9iYWJseSBgMGAu7C0gYHByb3h5X3R5cGVgOiBUaGUgcHJveHkgdHlwZSBvcmlnaW5hbGx5IHBhc3NlZCB0byBgcHVyZWAuKQEtIGBoZWlnaHRgOiBUaGUgaGVpZ2h0IG9mIHRoZSBjaGFpbiB3aGVuIHRoZSBjYWxsIHRvIGBwdXJlYCB3YXMgcHJvY2Vzc2VkLjUBLSBgZXh0X2luZGV4YDogVGhlIGV4dHJpbnNpYyBpbmRleCBpbiB3aGljaCB0aGUgY2FsbCB0byBgcHVyZWAgd2FzIHByb2Nlc3NlZC4ANQFGYWlscyB3aXRoIGBOb1Blcm1pc3Npb25gIGluIGNhc2UgdGhlIGNhbGxlciBpcyBub3QgYSBwcmV2aW91c2x5IGNyZWF0ZWQgcHVyZdxhY2NvdW50IHdob3NlIGBwdXJlYCBjYWxsIGhhcyBjb3JyZXNwb25kaW5nIHBhcmFtZXRlcnMuIGFubm91bmNlCAEQcmVhbJ0BAVBBY2NvdW50SWRMb29rdXBPZjxUPgABJGNhbGxfaGFzaDQBNENhbGxIYXNoT2Y8VD4ABjwFAVB1Ymxpc2ggdGhlIGhhc2ggb2YgYSBwcm94eS1jYWxsIHRoYXQgd2lsbCBiZSBtYWRlIGluIHRoZSBmdXR1cmUuAF0BVGhpcyBtdXN0IGJlIGNhbGxlZCBzb21lIG51bWJlciBvZiBibG9ja3MgYmVmb3JlIHRoZSBjb3JyZXNwb25kaW5nIGBwcm94eWAgaXMgYXR0ZW1wdGVkJQFpZiB0aGUgZGVsYXkgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm94eSByZWxhdGlvbnNoaXAgaXMgZ3JlYXRlciB0aGFuIHplcm8uABEBTm8gbW9yZSB0aGFuIGBNYXhQZW5kaW5nYCBhbm5vdW5jZW1lbnRzIG1heSBiZSBtYWRlIGF0IGFueSBvbmUgdGltZS4ACQFUaGlzIHdpbGwgdGFrZSBhIGRlcG9zaXQgb2YgYEFubm91bmNlbWVudERlcG9zaXRGYWN0b3JgIGFzIHdlbGwgYXMZAWBBbm5vdW5jZW1lbnREZXBvc2l0QmFzZWAgaWYgdGhlcmUgYXJlIG5vIG90aGVyIHBlbmRpbmcgYW5ub3VuY2VtZW50cy4AJQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXyBhbmQgYSBwcm94eSBvZiBgcmVhbGAuACxQYXJhbWV0ZXJzOg0BLSBgcmVhbGA6IFRoZSBhY2NvdW50IHRoYXQgdGhlIHByb3h5IHdpbGwgbWFrZSBhIGNhbGwgb24gYmVoYWxmIG9mLhUBLSBgY2FsbF9oYXNoYDogVGhlIGhhc2ggb2YgdGhlIGNhbGwgdG8gYmUgbWFkZSBieSB0aGUgYHJlYWxgIGFjY291bnQuTHJlbW92ZV9hbm5vdW5jZW1lbnQIARByZWFsnQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEkY2FsbF9oYXNoNAE0Q2FsbEhhc2hPZjxUPgAHKHBSZW1vdmUgYSBnaXZlbiBhbm5vdW5jZW1lbnQuAFkBTWF5IGJlIGNhbGxlZCBieSBhIHByb3h5IGFjY291bnQgdG8gcmVtb3ZlIGEgY2FsbCB0aGV5IHByZXZpb3VzbHkgYW5ub3VuY2VkIGFuZCByZXR1cm4wdGhlIGRlcG9zaXQuAMxUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXy4ALFBhcmFtZXRlcnM6DQEtIGByZWFsYDogVGhlIGFjY291bnQgdGhhdCB0aGUgcHJveHkgd2lsbCBtYWtlIGEgY2FsbCBvbiBiZWhhbGYgb2YuFQEtIGBjYWxsX2hhc2hgOiBUaGUgaGFzaCBvZiB0aGUgY2FsbCB0byBiZSBtYWRlIGJ5IHRoZSBgcmVhbGAgYWNjb3VudC5McmVqZWN0X2Fubm91bmNlbWVudAgBIGRlbGVnYXRlnQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEkY2FsbF9oYXNoNAE0Q2FsbEhhc2hPZjxUPgAIKLBSZW1vdmUgdGhlIGdpdmVuIGFubm91bmNlbWVudCBvZiBhIGRlbGVnYXRlLgBhAU1heSBiZSBjYWxsZWQgYnkgYSB0YXJnZXQgKHByb3hpZWQpIGFjY291bnQgdG8gcmVtb3ZlIGEgY2FsbCB0aGF0IG9uZSBvZiB0aGVpciBkZWxlZ2F0ZXMlAShgZGVsZWdhdGVgKSBoYXMgYW5ub3VuY2VkIHRoZXkgd2FudCB0byBleGVjdXRlLiBUaGUgZGVwb3NpdCBpcyByZXR1cm5lZC4AzFRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfLgAsUGFyYW1ldGVyczr0LSBgZGVsZWdhdGVgOiBUaGUgYWNjb3VudCB0aGF0IHByZXZpb3VzbHkgYW5ub3VuY2VkIHRoZSBjYWxsLrwtIGBjYWxsX2hhc2hgOiBUaGUgaGFzaCBvZiB0aGUgY2FsbCB0byBiZSBtYWRlLjxwcm94eV9hbm5vdW5jZWQQASBkZWxlZ2F0ZZ0BAVBBY2NvdW50SWRMb29rdXBPZjxUPgABEHJlYWydAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AAUBmb3JjZV9wcm94eV90eXBl/QIBUE9wdGlvbjxUOjpQcm94eVR5cGU+AAEQY2FsbF0BAXxCb3g8PFQgYXMgQ29uZmlnPjo6UnVudGltZUNhbGw+AAksTQFEaXNwYXRjaCB0aGUgZ2l2ZW4gYGNhbGxgIGZyb20gYW4gYWNjb3VudCB0aGF0IHRoZSBzZW5kZXIgaXMgYXV0aG9yaXplZCBmb3IgdGhyb3VnaDBgYWRkX3Byb3h5YC4AqFJlbW92ZXMgYW55IGNvcnJlc3BvbmRpbmcgYW5ub3VuY2VtZW50KHMpLgDMVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uACxQYXJhbWV0ZXJzOg0BLSBgcmVhbGA6IFRoZSBhY2NvdW50IHRoYXQgdGhlIHByb3h5IHdpbGwgbWFrZSBhIGNhbGwgb24gYmVoYWxmIG9mLmEBLSBgZm9yY2VfcHJveHlfdHlwZWA6IFNwZWNpZnkgdGhlIGV4YWN0IHByb3h5IHR5cGUgdG8gYmUgdXNlZCBhbmQgY2hlY2tlZCBmb3IgdGhpcyBjYWxsLtAtIGBjYWxsYDogVGhlIGNhbGwgdG8gYmUgbWFkZSBieSB0aGUgYHJlYWxgIGFjY291bnQuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLv0CBBhPcHRpb24EBFQBAQMBCBBOb25lAAAAEFNvbWUEAAEDAAABAAABAwhYc3RhZ2luZ19rdXNhbWFfcnVudGltZSRQcm94eVR5cGUAASQMQW55AAAALE5vblRyYW5zZmVyAAEAKEdvdmVybmFuY2UAAgAcU3Rha2luZwADACxDYW5jZWxQcm94eQAFABxBdWN0aW9uAAYAHFNvY2lldHkABwA8Tm9taW5hdGlvblBvb2xzAAgAMFNwb2tlc3BlcnNvbgAJAAAFAww8cGFsbGV0X211bHRpc2lnGHBhbGxldBBDYWxsBARUAAEQUGFzX211bHRpX3RocmVzaG9sZF8xCAFEb3RoZXJfc2lnbmF0b3JpZXOtAQFEVmVjPFQ6OkFjY291bnRJZD4AARBjYWxsXQEBfEJveDw8VCBhcyBDb25maWc+OjpSdW50aW1lQ2FsbD4AADBRAUltbWVkaWF0ZWx5IGRpc3BhdGNoIGEgbXVsdGktc2lnbmF0dXJlIGNhbGwgdXNpbmcgYSBzaW5nbGUgYXBwcm92YWwgZnJvbSB0aGUgY2FsbGVyLgDMVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uAD0BLSBgb3RoZXJfc2lnbmF0b3JpZXNgOiBUaGUgYWNjb3VudHMgKG90aGVyIHRoYW4gdGhlIHNlbmRlcikgd2hvIGFyZSBwYXJ0IG9mIHRoZQEBbXVsdGktc2lnbmF0dXJlLCBidXQgZG8gbm90IHBhcnRpY2lwYXRlIGluIHRoZSBhcHByb3ZhbCBwcm9jZXNzLogtIGBjYWxsYDogVGhlIGNhbGwgdG8gYmUgZXhlY3V0ZWQuALhSZXN1bHQgaXMgZXF1aXZhbGVudCB0byB0aGUgZGlzcGF0Y2hlZCByZXN1bHQuADQjIyBDb21wbGV4aXR5GQFPKFogKyBDKSB3aGVyZSBaIGlzIHRoZSBsZW5ndGggb2YgdGhlIGNhbGwgYW5kIEMgaXRzIGV4ZWN1dGlvbiB3ZWlnaHQuIGFzX211bHRpFAEkdGhyZXNob2xkVQEBDHUxNgABRG90aGVyX3NpZ25hdG9yaWVzrQEBRFZlYzxUOjpBY2NvdW50SWQ+AAE8bWF5YmVfdGltZXBvaW50CQMBkE9wdGlvbjxUaW1lcG9pbnQ8QmxvY2tOdW1iZXJGb3I8VD4+PgABEGNhbGxdAQF8Qm94PDxUIGFzIENvbmZpZz46OlJ1bnRpbWVDYWxsPgABKG1heF93ZWlnaHQoARhXZWlnaHQAAZxVAVJlZ2lzdGVyIGFwcHJvdmFsIGZvciBhIGRpc3BhdGNoIHRvIGJlIG1hZGUgZnJvbSBhIGRldGVybWluaXN0aWMgY29tcG9zaXRlIGFjY291bnQgaWb4YXBwcm92ZWQgYnkgYSB0b3RhbCBvZiBgdGhyZXNob2xkIC0gMWAgb2YgYG90aGVyX3NpZ25hdG9yaWVzYC4AsElmIHRoZXJlIGFyZSBlbm91Z2gsIHRoZW4gZGlzcGF0Y2ggdGhlIGNhbGwuAC0BUGF5bWVudDogYERlcG9zaXRCYXNlYCB3aWxsIGJlIHJlc2VydmVkIGlmIHRoaXMgaXMgdGhlIGZpcnN0IGFwcHJvdmFsLCBwbHVzPQFgdGhyZXNob2xkYCB0aW1lcyBgRGVwb3NpdEZhY3RvcmAuIEl0IGlzIHJldHVybmVkIG9uY2UgdGhpcyBkaXNwYXRjaCBoYXBwZW5zIG9yNGlzIGNhbmNlbGxlZC4AzFRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfLgBVAS0gYHRocmVzaG9sZGA6IFRoZSB0b3RhbCBudW1iZXIgb2YgYXBwcm92YWxzIGZvciB0aGlzIGRpc3BhdGNoIGJlZm9yZSBpdCBpcyBleGVjdXRlZC5BAS0gYG90aGVyX3NpZ25hdG9yaWVzYDogVGhlIGFjY291bnRzIChvdGhlciB0aGFuIHRoZSBzZW5kZXIpIHdobyBjYW4gYXBwcm92ZSB0aGlzbGRpc3BhdGNoLiBNYXkgbm90IGJlIGVtcHR5LlkBLSBgbWF5YmVfdGltZXBvaW50YDogSWYgdGhpcyBpcyB0aGUgZmlyc3QgYXBwcm92YWwsIHRoZW4gdGhpcyBtdXN0IGJlIGBOb25lYC4gSWYgaXQgaXNRAW5vdCB0aGUgZmlyc3QgYXBwcm92YWwsIHRoZW4gaXQgbXVzdCBiZSBgU29tZWAsIHdpdGggdGhlIHRpbWVwb2ludCAoYmxvY2sgbnVtYmVyIGFuZNR0cmFuc2FjdGlvbiBpbmRleCkgb2YgdGhlIGZpcnN0IGFwcHJvdmFsIHRyYW5zYWN0aW9uLogtIGBjYWxsYDogVGhlIGNhbGwgdG8gYmUgZXhlY3V0ZWQuAB0BTk9URTogVW5sZXNzIHRoaXMgaXMgdGhlIGZpbmFsIGFwcHJvdmFsLCB5b3Ugd2lsbCBnZW5lcmFsbHkgd2FudCB0byB1c2UZAWBhcHByb3ZlX2FzX211bHRpYCBpbnN0ZWFkLCBzaW5jZSBpdCBvbmx5IHJlcXVpcmVzIGEgaGFzaCBvZiB0aGUgY2FsbC4AWQFSZXN1bHQgaXMgZXF1aXZhbGVudCB0byB0aGUgZGlzcGF0Y2hlZCByZXN1bHQgaWYgYHRocmVzaG9sZGAgaXMgZXhhY3RseSBgMWAuIE90aGVyd2lzZVUBb24gc3VjY2VzcywgcmVzdWx0IGlzIGBPa2AgYW5kIHRoZSByZXN1bHQgZnJvbSB0aGUgaW50ZXJpb3IgY2FsbCwgaWYgaXQgd2FzIGV4ZWN1dGVkLNxtYXkgYmUgZm91bmQgaW4gdGhlIGRlcG9zaXRlZCBgTXVsdGlzaWdFeGVjdXRlZGAgZXZlbnQuADQjIyBDb21wbGV4aXR5UC0gYE8oUyArIFogKyBDYWxsKWAuzC0gVXAgdG8gb25lIGJhbGFuY2UtcmVzZXJ2ZSBvciB1bnJlc2VydmUgb3BlcmF0aW9uLj0BLSBPbmUgcGFzc3Rocm91Z2ggb3BlcmF0aW9uLCBvbmUgaW5zZXJ0LCBib3RoIGBPKFMpYCB3aGVyZSBgU2AgaXMgdGhlIG51bWJlciBvZkUBICBzaWduYXRvcmllcy4gYFNgIGlzIGNhcHBlZCBieSBgTWF4U2lnbmF0b3JpZXNgLCB3aXRoIHdlaWdodCBiZWluZyBwcm9wb3J0aW9uYWwuIQEtIE9uZSBjYWxsIGVuY29kZSAmIGhhc2gsIGJvdGggb2YgY29tcGxleGl0eSBgTyhaKWAgd2hlcmUgYFpgIGlzIHR4LWxlbi68LSBPbmUgZW5jb2RlICYgaGFzaCwgYm90aCBvZiBjb21wbGV4aXR5IGBPKFMpYC7ULSBVcCB0byBvbmUgYmluYXJ5IHNlYXJjaCBhbmQgaW5zZXJ0IChgTyhsb2dTICsgUylgKS74LSBJL086IDEgcmVhZCBgTyhTKWAsIHVwIHRvIDEgbXV0YXRlIGBPKFMpYC4gVXAgdG8gb25lIHJlbW92ZS4wLSBPbmUgZXZlbnQubC0gVGhlIHdlaWdodCBvZiB0aGUgYGNhbGxgLk0BLSBTdG9yYWdlOiBpbnNlcnRzIG9uZSBpdGVtLCB2YWx1ZSBzaXplIGJvdW5kZWQgYnkgYE1heFNpZ25hdG9yaWVzYCwgd2l0aCBhIGRlcG9zaXQZASAgdGFrZW4gZm9yIGl0cyBsaWZldGltZSBvZiBgRGVwb3NpdEJhc2UgKyB0aHJlc2hvbGQgKiBEZXBvc2l0RmFjdG9yYC5AYXBwcm92ZV9hc19tdWx0aRQBJHRocmVzaG9sZFUBAQx1MTYAAURvdGhlcl9zaWduYXRvcmllc60BAURWZWM8VDo6QWNjb3VudElkPgABPG1heWJlX3RpbWVwb2ludAkDAZBPcHRpb248VGltZXBvaW50PEJsb2NrTnVtYmVyRm9yPFQ+Pj4AASRjYWxsX2hhc2gEASBbdTg7IDMyXQABKG1heF93ZWlnaHQoARhXZWlnaHQAAnhVAVJlZ2lzdGVyIGFwcHJvdmFsIGZvciBhIGRpc3BhdGNoIHRvIGJlIG1hZGUgZnJvbSBhIGRldGVybWluaXN0aWMgY29tcG9zaXRlIGFjY291bnQgaWb4YXBwcm92ZWQgYnkgYSB0b3RhbCBvZiBgdGhyZXNob2xkIC0gMWAgb2YgYG90aGVyX3NpZ25hdG9yaWVzYC4ALQFQYXltZW50OiBgRGVwb3NpdEJhc2VgIHdpbGwgYmUgcmVzZXJ2ZWQgaWYgdGhpcyBpcyB0aGUgZmlyc3QgYXBwcm92YWwsIHBsdXM9AWB0aHJlc2hvbGRgIHRpbWVzIGBEZXBvc2l0RmFjdG9yYC4gSXQgaXMgcmV0dXJuZWQgb25jZSB0aGlzIGRpc3BhdGNoIGhhcHBlbnMgb3I0aXMgY2FuY2VsbGVkLgDMVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uAFUBLSBgdGhyZXNob2xkYDogVGhlIHRvdGFsIG51bWJlciBvZiBhcHByb3ZhbHMgZm9yIHRoaXMgZGlzcGF0Y2ggYmVmb3JlIGl0IGlzIGV4ZWN1dGVkLkEBLSBgb3RoZXJfc2lnbmF0b3JpZXNgOiBUaGUgYWNjb3VudHMgKG90aGVyIHRoYW4gdGhlIHNlbmRlcikgd2hvIGNhbiBhcHByb3ZlIHRoaXNsZGlzcGF0Y2guIE1heSBub3QgYmUgZW1wdHkuWQEtIGBtYXliZV90aW1lcG9pbnRgOiBJZiB0aGlzIGlzIHRoZSBmaXJzdCBhcHByb3ZhbCwgdGhlbiB0aGlzIG11c3QgYmUgYE5vbmVgLiBJZiBpdCBpc1EBbm90IHRoZSBmaXJzdCBhcHByb3ZhbCwgdGhlbiBpdCBtdXN0IGJlIGBTb21lYCwgd2l0aCB0aGUgdGltZXBvaW50IChibG9jayBudW1iZXIgYW5k1HRyYW5zYWN0aW9uIGluZGV4KSBvZiB0aGUgZmlyc3QgYXBwcm92YWwgdHJhbnNhY3Rpb24uzC0gYGNhbGxfaGFzaGA6IFRoZSBoYXNoIG9mIHRoZSBjYWxsIHRvIGJlIGV4ZWN1dGVkLgA1AU5PVEU6IElmIHRoaXMgaXMgdGhlIGZpbmFsIGFwcHJvdmFsLCB5b3Ugd2lsbCB3YW50IHRvIHVzZSBgYXNfbXVsdGlgIGluc3RlYWQuADQjIyBDb21wbGV4aXR5JC0gYE8oUylgLswtIFVwIHRvIG9uZSBiYWxhbmNlLXJlc2VydmUgb3IgdW5yZXNlcnZlIG9wZXJhdGlvbi49AS0gT25lIHBhc3N0aHJvdWdoIG9wZXJhdGlvbiwgb25lIGluc2VydCwgYm90aCBgTyhTKWAgd2hlcmUgYFNgIGlzIHRoZSBudW1iZXIgb2ZFASAgc2lnbmF0b3JpZXMuIGBTYCBpcyBjYXBwZWQgYnkgYE1heFNpZ25hdG9yaWVzYCwgd2l0aCB3ZWlnaHQgYmVpbmcgcHJvcG9ydGlvbmFsLrwtIE9uZSBlbmNvZGUgJiBoYXNoLCBib3RoIG9mIGNvbXBsZXhpdHkgYE8oUylgLtQtIFVwIHRvIG9uZSBiaW5hcnkgc2VhcmNoIGFuZCBpbnNlcnQgKGBPKGxvZ1MgKyBTKWApLvgtIEkvTzogMSByZWFkIGBPKFMpYCwgdXAgdG8gMSBtdXRhdGUgYE8oUylgLiBVcCB0byBvbmUgcmVtb3ZlLjAtIE9uZSBldmVudC5NAS0gU3RvcmFnZTogaW5zZXJ0cyBvbmUgaXRlbSwgdmFsdWUgc2l6ZSBib3VuZGVkIGJ5IGBNYXhTaWduYXRvcmllc2AsIHdpdGggYSBkZXBvc2l0GQEgIHRha2VuIGZvciBpdHMgbGlmZXRpbWUgb2YgYERlcG9zaXRCYXNlICsgdGhyZXNob2xkICogRGVwb3NpdEZhY3RvcmAuPGNhbmNlbF9hc19tdWx0aRABJHRocmVzaG9sZFUBAQx1MTYAAURvdGhlcl9zaWduYXRvcmllc60BAURWZWM8VDo6QWNjb3VudElkPgABJHRpbWVwb2ludA0DAXBUaW1lcG9pbnQ8QmxvY2tOdW1iZXJGb3I8VD4+AAEkY2FsbF9oYXNoBAEgW3U4OyAzMl0AA1RVAUNhbmNlbCBhIHByZS1leGlzdGluZywgb24tZ29pbmcgbXVsdGlzaWcgdHJhbnNhY3Rpb24uIEFueSBkZXBvc2l0IHJlc2VydmVkIHByZXZpb3VzbHnEZm9yIHRoaXMgb3BlcmF0aW9uIHdpbGwgYmUgdW5yZXNlcnZlZCBvbiBzdWNjZXNzLgDMVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uAFUBLSBgdGhyZXNob2xkYDogVGhlIHRvdGFsIG51bWJlciBvZiBhcHByb3ZhbHMgZm9yIHRoaXMgZGlzcGF0Y2ggYmVmb3JlIGl0IGlzIGV4ZWN1dGVkLkEBLSBgb3RoZXJfc2lnbmF0b3JpZXNgOiBUaGUgYWNjb3VudHMgKG90aGVyIHRoYW4gdGhlIHNlbmRlcikgd2hvIGNhbiBhcHByb3ZlIHRoaXNsZGlzcGF0Y2guIE1heSBub3QgYmUgZW1wdHkuXQEtIGB0aW1lcG9pbnRgOiBUaGUgdGltZXBvaW50IChibG9jayBudW1iZXIgYW5kIHRyYW5zYWN0aW9uIGluZGV4KSBvZiB0aGUgZmlyc3QgYXBwcm92YWx4dHJhbnNhY3Rpb24gZm9yIHRoaXMgZGlzcGF0Y2guzC0gYGNhbGxfaGFzaGA6IFRoZSBoYXNoIG9mIHRoZSBjYWxsIHRvIGJlIGV4ZWN1dGVkLgA0IyMgQ29tcGxleGl0eSQtIGBPKFMpYC7MLSBVcCB0byBvbmUgYmFsYW5jZS1yZXNlcnZlIG9yIHVucmVzZXJ2ZSBvcGVyYXRpb24uPQEtIE9uZSBwYXNzdGhyb3VnaCBvcGVyYXRpb24sIG9uZSBpbnNlcnQsIGJvdGggYE8oUylgIHdoZXJlIGBTYCBpcyB0aGUgbnVtYmVyIG9mRQEgIHNpZ25hdG9yaWVzLiBgU2AgaXMgY2FwcGVkIGJ5IGBNYXhTaWduYXRvcmllc2AsIHdpdGggd2VpZ2h0IGJlaW5nIHByb3BvcnRpb25hbC68LSBPbmUgZW5jb2RlICYgaGFzaCwgYm90aCBvZiBjb21wbGV4aXR5IGBPKFMpYC4wLSBPbmUgZXZlbnQuhC0gSS9POiAxIHJlYWQgYE8oUylgLCBvbmUgcmVtb3ZlLnAtIFN0b3JhZ2U6IHJlbW92ZXMgb25lIGl0ZW0uBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLgkDBBhPcHRpb24EBFQBDQMBCBBOb25lAAAAEFNvbWUEAA0DAAABAAANAwg8cGFsbGV0X211bHRpc2lnJFRpbWVwb2ludAQsQmxvY2tOdW1iZXIBEAAIARhoZWlnaHQQASxCbG9ja051bWJlcgABFGluZGV4EAEMdTMyAAARAww8cGFsbGV0X3ByZWltYWdlGHBhbGxldBBDYWxsBARUAAEUNG5vdGVfcHJlaW1hZ2UEARRieXRlczgBHFZlYzx1OD4AABB0UmVnaXN0ZXIgYSBwcmVpbWFnZSBvbi1jaGFpbi4AVQFJZiB0aGUgcHJlaW1hZ2Ugd2FzIHByZXZpb3VzbHkgcmVxdWVzdGVkLCBubyBmZWVzIG9yIGRlcG9zaXRzIGFyZSB0YWtlbiBmb3IgcHJvdmlkaW5nVQF0aGUgcHJlaW1hZ2UuIE90aGVyd2lzZSwgYSBkZXBvc2l0IGlzIHRha2VuIHByb3BvcnRpb25hbCB0byB0aGUgc2l6ZSBvZiB0aGUgcHJlaW1hZ2UuPHVubm90ZV9wcmVpbWFnZQQBEGhhc2g0ARxUOjpIYXNoAAEY3ENsZWFyIGFuIHVucmVxdWVzdGVkIHByZWltYWdlIGZyb20gdGhlIHJ1bnRpbWUgc3RvcmFnZS4A/ElmIGBsZW5gIGlzIHByb3ZpZGVkLCB0aGVuIGl0IHdpbGwgYmUgYSBtdWNoIGNoZWFwZXIgb3BlcmF0aW9uLgABAS0gYGhhc2hgOiBUaGUgaGFzaCBvZiB0aGUgcHJlaW1hZ2UgdG8gYmUgcmVtb3ZlZCBmcm9tIHRoZSBzdG9yZS64LSBgbGVuYDogVGhlIGxlbmd0aCBvZiB0aGUgcHJlaW1hZ2Ugb2YgYGhhc2hgLkByZXF1ZXN0X3ByZWltYWdlBAEQaGFzaDQBHFQ6Okhhc2gAAhBBAVJlcXVlc3QgYSBwcmVpbWFnZSBiZSB1cGxvYWRlZCB0byB0aGUgY2hhaW4gd2l0aG91dCBwYXlpbmcgYW55IGZlZXMgb3IgZGVwb3NpdHMuAFUBSWYgdGhlIHByZWltYWdlIHJlcXVlc3RzIGhhcyBhbHJlYWR5IGJlZW4gcHJvdmlkZWQgb24tY2hhaW4sIHdlIHVucmVzZXJ2ZSBhbnkgZGVwb3NpdDkBYSB1c2VyIG1heSBoYXZlIHBhaWQsIGFuZCB0YWtlIHRoZSBjb250cm9sIG9mIHRoZSBwcmVpbWFnZSBvdXQgb2YgdGhlaXIgaGFuZHMuSHVucmVxdWVzdF9wcmVpbWFnZQQBEGhhc2g0ARxUOjpIYXNoAAMMvENsZWFyIGEgcHJldmlvdXNseSBtYWRlIHJlcXVlc3QgZm9yIGEgcHJlaW1hZ2UuAC0BTk9URTogVEhJUyBNVVNUIE5PVCBCRSBDQUxMRUQgT04gYGhhc2hgIE1PUkUgVElNRVMgVEhBTiBgcmVxdWVzdF9wcmVpbWFnZWAuOGVuc3VyZV91cGRhdGVkBAEYaGFzaGVzFQMBMFZlYzxUOjpIYXNoPgAEDMRFbnN1cmUgdGhhdCB0aGUgYSBidWxrIG9mIHByZS1pbWFnZXMgaXMgdXBncmFkZWQuAD0BVGhlIGNhbGxlciBwYXlzIG5vIGZlZSBpZiBhdCBsZWFzdCA5MCUgb2YgcHJlLWltYWdlcyB3ZXJlIHN1Y2Nlc3NmdWxseSB1cGRhdGVkLgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy4VAwAAAjQAGQMMPHBhbGxldF9ib3VudGllcxhwYWxsZXQQQ2FsbAgEVAAESQABJDhwcm9wb3NlX2JvdW50eQgBFHZhbHVl5AE8QmFsYW5jZU9mPFQsIEk+AAEsZGVzY3JpcHRpb244ARxWZWM8dTg+AAAwVFByb3Bvc2UgYSBuZXcgYm91bnR5LgDMVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uAFEBUGF5bWVudDogYFRpcFJlcG9ydERlcG9zaXRCYXNlYCB3aWxsIGJlIHJlc2VydmVkIGZyb20gdGhlIG9yaWdpbiBhY2NvdW50LCBhcyB3ZWxsIGFzUQFgRGF0YURlcG9zaXRQZXJCeXRlYCBmb3IgZWFjaCBieXRlIGluIGByZWFzb25gLiBJdCB3aWxsIGJlIHVucmVzZXJ2ZWQgdXBvbiBhcHByb3ZhbCxkb3Igc2xhc2hlZCB3aGVuIHJlamVjdGVkLgD4LSBgY3VyYXRvcmA6IFRoZSBjdXJhdG9yIGFjY291bnQgd2hvbSB3aWxsIG1hbmFnZSB0aGlzIGJvdW50eS5kLSBgZmVlYDogVGhlIGN1cmF0b3IgZmVlLiUBLSBgdmFsdWVgOiBUaGUgdG90YWwgcGF5bWVudCBhbW91bnQgb2YgdGhpcyBib3VudHksIGN1cmF0b3IgZmVlIGluY2x1ZGVkLsAtIGBkZXNjcmlwdGlvbmA6IFRoZSBkZXNjcmlwdGlvbiBvZiB0aGlzIGJvdW50eS44YXBwcm92ZV9ib3VudHkEASRib3VudHlfaWTUASxCb3VudHlJbmRleAABHF0BQXBwcm92ZSBhIGJvdW50eSBwcm9wb3NhbC4gQXQgYSBsYXRlciB0aW1lLCB0aGUgYm91bnR5IHdpbGwgYmUgZnVuZGVkIGFuZCBiZWNvbWUgYWN0aXZlqGFuZCB0aGUgb3JpZ2luYWwgZGVwb3NpdCB3aWxsIGJlIHJldHVybmVkLgCkTWF5IG9ubHkgYmUgY2FsbGVkIGZyb20gYFQ6OlNwZW5kT3JpZ2luYC4ANCMjIENvbXBsZXhpdHkcLSBPKDEpLjxwcm9wb3NlX2N1cmF0b3IMASRib3VudHlfaWTUASxCb3VudHlJbmRleAABHGN1cmF0b3KdAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AAQxmZWXkATxCYWxhbmNlT2Y8VCwgST4AAhiUUHJvcG9zZSBhIGN1cmF0b3IgdG8gYSBmdW5kZWQgYm91bnR5LgCkTWF5IG9ubHkgYmUgY2FsbGVkIGZyb20gYFQ6OlNwZW5kT3JpZ2luYC4ANCMjIENvbXBsZXhpdHkcLSBPKDEpLkB1bmFzc2lnbl9jdXJhdG9yBAEkYm91bnR5X2lk1AEsQm91bnR5SW5kZXgAA0R8VW5hc3NpZ24gY3VyYXRvciBmcm9tIGEgYm91bnR5LgAdAVRoaXMgZnVuY3Rpb24gY2FuIG9ubHkgYmUgY2FsbGVkIGJ5IHRoZSBgUmVqZWN0T3JpZ2luYCBhIHNpZ25lZCBvcmlnaW4uAD0BSWYgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIGBSZWplY3RPcmlnaW5gLCB3ZSBhc3N1bWUgdGhhdCB0aGUgY3VyYXRvciBpczEBbWFsaWNpb3VzIG9yIGluYWN0aXZlLiBBcyBhIHJlc3VsdCwgd2Ugd2lsbCBzbGFzaCB0aGUgY3VyYXRvciB3aGVuIHBvc3NpYmxlLgBhAUlmIHRoZSBvcmlnaW4gaXMgdGhlIGN1cmF0b3IsIHdlIHRha2UgdGhpcyBhcyBhIHNpZ24gdGhleSBhcmUgdW5hYmxlIHRvIGRvIHRoZWlyIGpvYiBhbmRdAXRoZXkgd2lsbGluZ2x5IGdpdmUgdXAuIFdlIGNvdWxkIHNsYXNoIHRoZW0sIGJ1dCBmb3Igbm93IHdlIGFsbG93IHRoZW0gdG8gcmVjb3ZlciB0aGVpcjUBZGVwb3NpdCBhbmQgZXhpdCB3aXRob3V0IGlzc3VlLiAoV2UgbWF5IHdhbnQgdG8gY2hhbmdlIHRoaXMgaWYgaXQgaXMgYWJ1c2VkLikAXQFGaW5hbGx5LCB0aGUgb3JpZ2luIGNhbiBiZSBhbnlvbmUgaWYgYW5kIG9ubHkgaWYgdGhlIGN1cmF0b3IgaXMgImluYWN0aXZlIi4gVGhpcyBhbGxvd3NhAWFueW9uZSBpbiB0aGUgY29tbXVuaXR5IHRvIGNhbGwgb3V0IHRoYXQgYSBjdXJhdG9yIGlzIG5vdCBkb2luZyB0aGVpciBkdWUgZGlsaWdlbmNlLCBhbmQ5AXdlIHNob3VsZCBwaWNrIGEgbmV3IGN1cmF0b3IuIEluIHRoaXMgY2FzZSB0aGUgY3VyYXRvciBzaG91bGQgYWxzbyBiZSBzbGFzaGVkLgA0IyMgQ29tcGxleGl0eRwtIE8oMSkuOGFjY2VwdF9jdXJhdG9yBAEkYm91bnR5X2lk1AEsQm91bnR5SW5kZXgABByUQWNjZXB0IHRoZSBjdXJhdG9yIHJvbGUgZm9yIGEgYm91bnR5LikBQSBkZXBvc2l0IHdpbGwgYmUgcmVzZXJ2ZWQgZnJvbSBjdXJhdG9yIGFuZCByZWZ1bmQgdXBvbiBzdWNjZXNzZnVsIHBheW91dC4AkE1heSBvbmx5IGJlIGNhbGxlZCBmcm9tIHRoZSBjdXJhdG9yLgA0IyMgQ29tcGxleGl0eRwtIE8oMSkuMGF3YXJkX2JvdW50eQgBJGJvdW50eV9pZNQBLEJvdW50eUluZGV4AAEsYmVuZWZpY2lhcnmdAQFQQWNjb3VudElkTG9va3VwT2Y8VD4ABShZAUF3YXJkIGJvdW50eSB0byBhIGJlbmVmaWNpYXJ5IGFjY291bnQuIFRoZSBiZW5lZmljaWFyeSB3aWxsIGJlIGFibGUgdG8gY2xhaW0gdGhlIGZ1bmRzOGFmdGVyIGEgZGVsYXkuABUBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgdGhlIGN1cmF0b3Igb2YgdGhpcyBib3VudHkuAIgtIGBib3VudHlfaWRgOiBCb3VudHkgSUQgdG8gYXdhcmQuGQEtIGBiZW5lZmljaWFyeWA6IFRoZSBiZW5lZmljaWFyeSBhY2NvdW50IHdob20gd2lsbCByZWNlaXZlIHRoZSBwYXlvdXQuADQjIyBDb21wbGV4aXR5HC0gTygxKS4wY2xhaW1fYm91bnR5BAEkYm91bnR5X2lk1AEsQm91bnR5SW5kZXgABiDsQ2xhaW0gdGhlIHBheW91dCBmcm9tIGFuIGF3YXJkZWQgYm91bnR5IGFmdGVyIHBheW91dCBkZWxheS4AJQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSB0aGUgYmVuZWZpY2lhcnkgb2YgdGhpcyBib3VudHkuAIgtIGBib3VudHlfaWRgOiBCb3VudHkgSUQgdG8gY2xhaW0uADQjIyBDb21wbGV4aXR5HC0gTygxKS4wY2xvc2VfYm91bnR5BAEkYm91bnR5X2lk1AEsQm91bnR5SW5kZXgAByQ5AUNhbmNlbCBhIHByb3Bvc2VkIG9yIGFjdGl2ZSBib3VudHkuIEFsbCB0aGUgZnVuZHMgd2lsbCBiZSBzZW50IHRvIHRyZWFzdXJ5IGFuZMx0aGUgY3VyYXRvciBkZXBvc2l0IHdpbGwgYmUgdW5yZXNlcnZlZCBpZiBwb3NzaWJsZS4AyE9ubHkgYFQ6OlJlamVjdE9yaWdpbmAgaXMgYWJsZSB0byBjYW5jZWwgYSBib3VudHkuAIwtIGBib3VudHlfaWRgOiBCb3VudHkgSUQgdG8gY2FuY2VsLgA0IyMgQ29tcGxleGl0eRwtIE8oMSkuUGV4dGVuZF9ib3VudHlfZXhwaXJ5CAEkYm91bnR5X2lk1AEsQm91bnR5SW5kZXgAARhyZW1hcms4ARxWZWM8dTg+AAgkrEV4dGVuZCB0aGUgZXhwaXJ5IHRpbWUgb2YgYW4gYWN0aXZlIGJvdW50eS4AFQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSB0aGUgY3VyYXRvciBvZiB0aGlzIGJvdW50eS4AjC0gYGJvdW50eV9pZGA6IEJvdW50eSBJRCB0byBleHRlbmQujC0gYHJlbWFya2A6IGFkZGl0aW9uYWwgaW5mb3JtYXRpb24uADQjIyBDb21wbGV4aXR5HC0gTygxKS4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMuHQMMVHBhbGxldF9jaGlsZF9ib3VudGllcxhwYWxsZXQQQ2FsbAQEVAABHEBhZGRfY2hpbGRfYm91bnR5DAFAcGFyZW50X2JvdW50eV9pZNQBLEJvdW50eUluZGV4AAEUdmFsdWXkATBCYWxhbmNlT2Y8VD4AASxkZXNjcmlwdGlvbjgBHFZlYzx1OD4AAExcQWRkIGEgbmV3IGNoaWxkLWJvdW50eS4A/FRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIHRoZSBjdXJhdG9yIG9mIHBhcmVudNxib3VudHkgYW5kIHRoZSBwYXJlbnQgYm91bnR5IG11c3QgYmUgaW4gImFjdGl2ZSIgc3RhdGUuAAUBQ2hpbGQtYm91bnR5IGdldHMgYWRkZWQgc3VjY2Vzc2Z1bGx5ICYgZnVuZCBnZXRzIHRyYW5zZmVycmVkIGZyb20JAXBhcmVudCBib3VudHkgdG8gY2hpbGQtYm91bnR5IGFjY291bnQsIGlmIHBhcmVudCBib3VudHkgaGFzIGVub3VnaGxmdW5kcywgZWxzZSB0aGUgY2FsbCBmYWlscy4ADQFVcHBlciBib3VuZCB0byBtYXhpbXVtIG51bWJlciBvZiBhY3RpdmUgIGNoaWxkIGJvdW50aWVzIHRoYXQgY2FuIGJlqGFkZGVkIGFyZSBtYW5hZ2VkIHZpYSBydW50aW1lIHRyYWl0IGNvbmZpZ5hbYENvbmZpZzo6TWF4QWN0aXZlQ2hpbGRCb3VudHlDb3VudGBdLgABAUlmIHRoZSBjYWxsIGlzIHN1Y2Nlc3MsIHRoZSBzdGF0dXMgb2YgY2hpbGQtYm91bnR5IGlzIHVwZGF0ZWQgdG8gIkFkZGVkIi4ATQEtIGBwYXJlbnRfYm91bnR5X2lkYDogSW5kZXggb2YgcGFyZW50IGJvdW50eSBmb3Igd2hpY2ggY2hpbGQtYm91bnR5IGlzIGJlaW5nIGFkZGVkLrAtIGB2YWx1ZWA6IFZhbHVlIGZvciBleGVjdXRpbmcgdGhlIHByb3Bvc2FsLtwtIGBkZXNjcmlwdGlvbmA6IFRleHQgZGVzY3JpcHRpb24gZm9yIHRoZSBjaGlsZC1ib3VudHkuPHByb3Bvc2VfY3VyYXRvchABQHBhcmVudF9ib3VudHlfaWTUASxCb3VudHlJbmRleAABPGNoaWxkX2JvdW50eV9pZNQBLEJvdW50eUluZGV4AAEcY3VyYXRvcp0BAVBBY2NvdW50SWRMb29rdXBPZjxUPgABDGZlZeQBMEJhbGFuY2VPZjxUPgABPKBQcm9wb3NlIGN1cmF0b3IgZm9yIGZ1bmRlZCBjaGlsZC1ib3VudHkuAA0BVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgY3VyYXRvciBvZiBwYXJlbnQgYm91bnR5LgARAVBhcmVudCBib3VudHkgbXVzdCBiZSBpbiBhY3RpdmUgc3RhdGUsIGZvciB0aGlzIGNoaWxkLWJvdW50eSBjYWxsIHRvFHdvcmsuAA0BQ2hpbGQtYm91bnR5IG11c3QgYmUgaW4gIkFkZGVkIiBzdGF0ZSwgZm9yIHByb2Nlc3NpbmcgdGhlIGNhbGwuIEFuZAUBc3RhdGUgb2YgY2hpbGQtYm91bnR5IGlzIG1vdmVkIHRvICJDdXJhdG9yUHJvcG9zZWQiIG9uIHN1Y2Nlc3NmdWxAY2FsbCBjb21wbGV0aW9uLgC0LSBgcGFyZW50X2JvdW50eV9pZGA6IEluZGV4IG9mIHBhcmVudCBib3VudHkurC0gYGNoaWxkX2JvdW50eV9pZGA6IEluZGV4IG9mIGNoaWxkIGJvdW50eS60LSBgY3VyYXRvcmA6IEFkZHJlc3Mgb2YgY2hpbGQtYm91bnR5IGN1cmF0b3Iu7C0gYGZlZWA6IHBheW1lbnQgZmVlIHRvIGNoaWxkLWJvdW50eSBjdXJhdG9yIGZvciBleGVjdXRpb24uOGFjY2VwdF9jdXJhdG9yCAFAcGFyZW50X2JvdW50eV9pZNQBLEJvdW50eUluZGV4AAE8Y2hpbGRfYm91bnR5X2lk1AEsQm91bnR5SW5kZXgAAky0QWNjZXB0IHRoZSBjdXJhdG9yIHJvbGUgZm9yIHRoZSBjaGlsZC1ib3VudHkuAPRUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSB0aGUgY3VyYXRvciBvZiB0aGlzNGNoaWxkLWJvdW50eS4A7EEgZGVwb3NpdCB3aWxsIGJlIHJlc2VydmVkIGZyb20gdGhlIGN1cmF0b3IgYW5kIHJlZnVuZCB1cG9uiHN1Y2Nlc3NmdWwgcGF5b3V0IG9yIGNhbmNlbGxhdGlvbi4A+EZlZSBmb3IgY3VyYXRvciBpcyBkZWR1Y3RlZCBmcm9tIGN1cmF0b3IgZmVlIG9mIHBhcmVudCBib3VudHkuABEBUGFyZW50IGJvdW50eSBtdXN0IGJlIGluIGFjdGl2ZSBzdGF0ZSwgZm9yIHRoaXMgY2hpbGQtYm91bnR5IGNhbGwgdG8Ud29yay4ADQFDaGlsZC1ib3VudHkgbXVzdCBiZSBpbiAiQ3VyYXRvclByb3Bvc2VkIiBzdGF0ZSwgZm9yIHByb2Nlc3NpbmcgdGhlCQFjYWxsLiBBbmQgc3RhdGUgb2YgY2hpbGQtYm91bnR5IGlzIG1vdmVkIHRvICJBY3RpdmUiIG9uIHN1Y2Nlc3NmdWxAY2FsbCBjb21wbGV0aW9uLgC0LSBgcGFyZW50X2JvdW50eV9pZGA6IEluZGV4IG9mIHBhcmVudCBib3VudHkurC0gYGNoaWxkX2JvdW50eV9pZGA6IEluZGV4IG9mIGNoaWxkIGJvdW50eS5AdW5hc3NpZ25fY3VyYXRvcggBQHBhcmVudF9ib3VudHlfaWTUASxCb3VudHlJbmRleAABPGNoaWxkX2JvdW50eV9pZNQBLEJvdW50eUluZGV4AAOIlFVuYXNzaWduIGN1cmF0b3IgZnJvbSBhIGNoaWxkLWJvdW50eS4ACQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgY2FuIGJlIGVpdGhlciBgUmVqZWN0T3JpZ2luYCwgb3LcdGhlIGN1cmF0b3Igb2YgdGhlIHBhcmVudCBib3VudHksIG9yIGFueSBzaWduZWQgb3JpZ2luLgD4Rm9yIHRoZSBvcmlnaW4gb3RoZXIgdGhhbiBUOjpSZWplY3RPcmlnaW4gYW5kIHRoZSBjaGlsZC1ib3VudHkBAWN1cmF0b3IsIHBhcmVudCBib3VudHkgbXVzdCBiZSBpbiBhY3RpdmUgc3RhdGUsIGZvciB0aGlzIGNhbGwgdG8JAXdvcmsuIFdlIGFsbG93IGNoaWxkLWJvdW50eSBjdXJhdG9yIGFuZCBUOjpSZWplY3RPcmlnaW4gdG8gZXhlY3V0Zch0aGlzIGNhbGwgaXJyZXNwZWN0aXZlIG9mIHRoZSBwYXJlbnQgYm91bnR5IHN0YXRlLgDcSWYgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIGBSZWplY3RPcmlnaW5gIG9yIHRoZQUBcGFyZW50IGJvdW50eSBjdXJhdG9yLCB3ZSBhc3N1bWUgdGhhdCB0aGUgY2hpbGQtYm91bnR5IGN1cmF0b3IgaXMNAW1hbGljaW91cyBvciBpbmFjdGl2ZS4gQXMgYSByZXN1bHQsIGNoaWxkLWJvdW50eSBjdXJhdG9yIGRlcG9zaXQgaXMgc2xhc2hlZC4ABQFJZiB0aGUgb3JpZ2luIGlzIHRoZSBjaGlsZC1ib3VudHkgY3VyYXRvciwgd2UgdGFrZSB0aGlzIGFzIGEgc2lnbgkBdGhhdCB0aGV5IGFyZSB1bmFibGUgdG8gZG8gdGhlaXIgam9iLCBhbmQgYXJlIHdpbGxpbmdseSBnaXZpbmcgdXAuCQFXZSBjb3VsZCBzbGFzaCB0aGUgZGVwb3NpdCwgYnV0IGZvciBub3cgd2UgYWxsb3cgdGhlbSB0byB1bnJlc2VydmURAXRoZWlyIGRlcG9zaXQgYW5kIGV4aXQgd2l0aG91dCBpc3N1ZS4gKFdlIG1heSB3YW50IHRvIGNoYW5nZSB0aGlzIGlmOGl0IGlzIGFidXNlZC4pAAUBRmluYWxseSwgdGhlIG9yaWdpbiBjYW4gYmUgYW55b25lIGlmZiB0aGUgY2hpbGQtYm91bnR5IGN1cmF0b3IgaXMJASJpbmFjdGl2ZSIuIEV4cGlyeSB1cGRhdGUgZHVlIG9mIHBhcmVudCBib3VudHkgaXMgdXNlZCB0byBlc3RpbWF0ZZxpbmFjdGl2ZSBzdGF0ZSBvZiBjaGlsZC1ib3VudHkgY3VyYXRvci4ADQFUaGlzIGFsbG93cyBhbnlvbmUgaW4gdGhlIGNvbW11bml0eSB0byBjYWxsIG91dCB0aGF0IGEgY2hpbGQtYm91bnR5CQFjdXJhdG9yIGlzIG5vdCBkb2luZyB0aGVpciBkdWUgZGlsaWdlbmNlLCBhbmQgd2Ugc2hvdWxkIHBpY2sgYSBuZXf4b25lLiBJbiB0aGlzIGNhc2UgdGhlIGNoaWxkLWJvdW50eSBjdXJhdG9yIGRlcG9zaXQgaXMgc2xhc2hlZC4AAQFTdGF0ZSBvZiBjaGlsZC1ib3VudHkgaXMgbW92ZWQgdG8gQWRkZWQgc3RhdGUgb24gc3VjY2Vzc2Z1bCBjYWxsLGNvbXBsZXRpb24uALQtIGBwYXJlbnRfYm91bnR5X2lkYDogSW5kZXggb2YgcGFyZW50IGJvdW50eS6sLSBgY2hpbGRfYm91bnR5X2lkYDogSW5kZXggb2YgY2hpbGQgYm91bnR5Lkhhd2FyZF9jaGlsZF9ib3VudHkMAUBwYXJlbnRfYm91bnR5X2lk1AEsQm91bnR5SW5kZXgAATxjaGlsZF9ib3VudHlfaWTUASxCb3VudHlJbmRleAABLGJlbmVmaWNpYXJ5nQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAREkEF3YXJkIGNoaWxkLWJvdW50eSB0byBhIGJlbmVmaWNpYXJ5LgD4VGhlIGJlbmVmaWNpYXJ5IHdpbGwgYmUgYWJsZSB0byBjbGFpbSB0aGUgZnVuZHMgYWZ0ZXIgYSBkZWxheS4A/FRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIHRoZSBwYXJlbnQgY3VyYXRvciBvcnRjdXJhdG9yIG9mIHRoaXMgY2hpbGQtYm91bnR5LgARAVBhcmVudCBib3VudHkgbXVzdCBiZSBpbiBhY3RpdmUgc3RhdGUsIGZvciB0aGlzIGNoaWxkLWJvdW50eSBjYWxsIHRvFHdvcmsuAAkBQ2hpbGQtYm91bnR5IG11c3QgYmUgaW4gYWN0aXZlIHN0YXRlLCBmb3IgcHJvY2Vzc2luZyB0aGUgY2FsbC4gQW5kEQFzdGF0ZSBvZiBjaGlsZC1ib3VudHkgaXMgbW92ZWQgdG8gIlBlbmRpbmdQYXlvdXQiIG9uIHN1Y2Nlc3NmdWwgY2FsbCxjb21wbGV0aW9uLgC0LSBgcGFyZW50X2JvdW50eV9pZGA6IEluZGV4IG9mIHBhcmVudCBib3VudHkurC0gYGNoaWxkX2JvdW50eV9pZGA6IEluZGV4IG9mIGNoaWxkIGJvdW50eS6ULSBgYmVuZWZpY2lhcnlgOiBCZW5lZmljaWFyeSBhY2NvdW50LkhjbGFpbV9jaGlsZF9ib3VudHkIAUBwYXJlbnRfYm91bnR5X2lk1AEsQm91bnR5SW5kZXgAATxjaGlsZF9ib3VudHlfaWTUASxCb3VudHlJbmRleAAFQAUBQ2xhaW0gdGhlIHBheW91dCBmcm9tIGFuIGF3YXJkZWQgY2hpbGQtYm91bnR5IGFmdGVyIHBheW91dCBkZWxheS4A7FRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtYXkgYmUgYW55IHNpZ25lZCBvcmlnaW4uAAUBQ2FsbCB3b3JrcyBpbmRlcGVuZGVudCBvZiBwYXJlbnQgYm91bnR5IHN0YXRlLCBObyBuZWVkIGZvciBwYXJlbnR0Ym91bnR5IHRvIGJlIGluIGFjdGl2ZSBzdGF0ZS4AEQFUaGUgQmVuZWZpY2lhcnkgaXMgcGFpZCBvdXQgd2l0aCBhZ3JlZWQgYm91bnR5IHZhbHVlLiBDdXJhdG9yIGZlZSBpc5RwYWlkICYgY3VyYXRvciBkZXBvc2l0IGlzIHVucmVzZXJ2ZWQuAAUBQ2hpbGQtYm91bnR5IG11c3QgYmUgaW4gIlBlbmRpbmdQYXlvdXQiIHN0YXRlLCBmb3IgcHJvY2Vzc2luZyB0aGX8Y2FsbC4gQW5kIGluc3RhbmNlIG9mIGNoaWxkLWJvdW50eSBpcyByZW1vdmVkIGZyb20gdGhlIHN0YXRlIG9ubHN1Y2Nlc3NmdWwgY2FsbCBjb21wbGV0aW9uLgC0LSBgcGFyZW50X2JvdW50eV9pZGA6IEluZGV4IG9mIHBhcmVudCBib3VudHkurC0gYGNoaWxkX2JvdW50eV9pZGA6IEluZGV4IG9mIGNoaWxkIGJvdW50eS5IY2xvc2VfY2hpbGRfYm91bnR5CAFAcGFyZW50X2JvdW50eV9pZNQBLEJvdW50eUluZGV4AAE8Y2hpbGRfYm91bnR5X2lk1AEsQm91bnR5SW5kZXgABlgRAUNhbmNlbCBhIHByb3Bvc2VkIG9yIGFjdGl2ZSBjaGlsZC1ib3VudHkuIENoaWxkLWJvdW50eSBhY2NvdW50IGZ1bmRzCQFhcmUgdHJhbnNmZXJyZWQgdG8gcGFyZW50IGJvdW50eSBhY2NvdW50LiBUaGUgY2hpbGQtYm91bnR5IGN1cmF0b3KYZGVwb3NpdCBtYXkgYmUgdW5yZXNlcnZlZCBpZiBwb3NzaWJsZS4ACQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBlaXRoZXIgcGFyZW50IGN1cmF0b3Igb3JIYFQ6OlJlamVjdE9yaWdpbmAuAPBJZiB0aGUgc3RhdGUgb2YgY2hpbGQtYm91bnR5IGlzIGBBY3RpdmVgLCBjdXJhdG9yIGRlcG9zaXQgaXMsdW5yZXNlcnZlZC4A9ElmIHRoZSBzdGF0ZSBvZiBjaGlsZC1ib3VudHkgaXMgYFBlbmRpbmdQYXlvdXRgLCBjYWxsIGZhaWxzICZ4cmV0dXJucyBgUGVuZGluZ1BheW91dGAgZXJyb3IuAA0BRm9yIHRoZSBvcmlnaW4gb3RoZXIgdGhhbiBUOjpSZWplY3RPcmlnaW4sIHBhcmVudCBib3VudHkgbXVzdCBiZSBpbvBhY3RpdmUgc3RhdGUsIGZvciB0aGlzIGNoaWxkLWJvdW50eSBjYWxsIHRvIHdvcmsuIEZvciBvcmlnaW6QVDo6UmVqZWN0T3JpZ2luIGV4ZWN1dGlvbiBpcyBmb3JjZWQuAAEBSW5zdGFuY2Ugb2YgY2hpbGQtYm91bnR5IGlzIHJlbW92ZWQgZnJvbSB0aGUgc3RhdGUgb24gc3VjY2Vzc2Z1bEBjYWxsIGNvbXBsZXRpb24uALQtIGBwYXJlbnRfYm91bnR5X2lkYDogSW5kZXggb2YgcGFyZW50IGJvdW50eS6sLSBgY2hpbGRfYm91bnR5X2lkYDogSW5kZXggb2YgY2hpbGQgYm91bnR5LgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy4hAwyQcGFsbGV0X2VsZWN0aW9uX3Byb3ZpZGVyX211bHRpX3BoYXNlGHBhbGxldBBDYWxsBARUAAEUPHN1Ym1pdF91bnNpZ25lZAgBMHJhd19zb2x1dGlvbiUDAbBCb3g8UmF3U29sdXRpb248U29sdXRpb25PZjxUOjpNaW5lckNvbmZpZz4+PgABHHdpdG5lc3NZBAFYU29sdXRpb25PclNuYXBzaG90U2l6ZQAAOKRTdWJtaXQgYSBzb2x1dGlvbiBmb3IgdGhlIHVuc2lnbmVkIHBoYXNlLgDIVGhlIGRpc3BhdGNoIG9yaWdpbiBmbyB0aGlzIGNhbGwgbXVzdCBiZSBfX25vbmVfXy4APQFUaGlzIHN1Ym1pc3Npb24gaXMgY2hlY2tlZCBvbiB0aGUgZmx5LiBNb3Jlb3ZlciwgdGhpcyB1bnNpZ25lZCBzb2x1dGlvbiBpcyBvbmx5VQF2YWxpZGF0ZWQgd2hlbiBzdWJtaXR0ZWQgdG8gdGhlIHBvb2wgZnJvbSB0aGUgKipsb2NhbCoqIG5vZGUuIEVmZmVjdGl2ZWx5LCB0aGlzIG1lYW5zXQF0aGF0IG9ubHkgYWN0aXZlIHZhbGlkYXRvcnMgY2FuIHN1Ym1pdCB0aGlzIHRyYW5zYWN0aW9uIHdoZW4gYXV0aG9yaW5nIGEgYmxvY2sgKHNpbWlsYXJAdG8gYW4gaW5oZXJlbnQpLgBZAVRvIHByZXZlbnQgYW55IGluY29ycmVjdCBzb2x1dGlvbiAoYW5kIHRodXMgd2FzdGVkIHRpbWUvd2VpZ2h0KSwgdGhpcyB0cmFuc2FjdGlvbiB3aWxsTQFwYW5pYyBpZiB0aGUgc29sdXRpb24gc3VibWl0dGVkIGJ5IHRoZSB2YWxpZGF0b3IgaXMgaW52YWxpZCBpbiBhbnkgd2F5LCBlZmZlY3RpdmVseZxwdXR0aW5nIHRoZWlyIGF1dGhvcmluZyByZXdhcmQgYXQgcmlzay4A4E5vIGRlcG9zaXQgb3IgcmV3YXJkIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHN1Ym1pc3Npb24ubHNldF9taW5pbXVtX3VudHJ1c3RlZF9zY29yZQQBQG1heWJlX25leHRfc2NvcmVdBAFUT3B0aW9uPEVsZWN0aW9uU2NvcmU+AAEUsFNldCBhIG5ldyB2YWx1ZSBmb3IgYE1pbmltdW1VbnRydXN0ZWRTY29yZWAuANhEaXNwYXRjaCBvcmlnaW4gbXVzdCBiZSBhbGlnbmVkIHdpdGggYFQ6OkZvcmNlT3JpZ2luYC4A8FRoaXMgY2hlY2sgY2FuIGJlIHR1cm5lZCBvZmYgYnkgc2V0dGluZyB0aGUgdmFsdWUgdG8gYE5vbmVgLnRzZXRfZW1lcmdlbmN5X2VsZWN0aW9uX3Jlc3VsdAQBIHN1cHBvcnRzYQQBWFN1cHBvcnRzPFQ6OkFjY291bnRJZD4AAiBZAVNldCBhIHNvbHV0aW9uIGluIHRoZSBxdWV1ZSwgdG8gYmUgaGFuZGVkIG91dCB0byB0aGUgY2xpZW50IG9mIHRoaXMgcGFsbGV0IGluIHRoZSBuZXh0iGNhbGwgdG8gYEVsZWN0aW9uUHJvdmlkZXI6OmVsZWN0YC4ARQFUaGlzIGNhbiBvbmx5IGJlIHNldCBieSBgVDo6Rm9yY2VPcmlnaW5gLCBhbmQgb25seSB3aGVuIHRoZSBwaGFzZSBpcyBgRW1lcmdlbmN5YC4AYQFUaGUgc29sdXRpb24gaXMgbm90IGNoZWNrZWQgZm9yIGFueSBmZWFzaWJpbGl0eSBhbmQgaXMgYXNzdW1lZCB0byBiZSB0cnVzdHdvcnRoeSwgYXMgYW55UQFmZWFzaWJpbGl0eSBjaGVjayBpdHNlbGYgY2FuIGluIHByaW5jaXBsZSBjYXVzZSB0aGUgZWxlY3Rpb24gcHJvY2VzcyB0byBmYWlsIChkdWUgdG9obWVtb3J5L3dlaWdodCBjb25zdHJhaW5zKS4Yc3VibWl0BAEwcmF3X3NvbHV0aW9uJQMBsEJveDxSYXdTb2x1dGlvbjxTb2x1dGlvbk9mPFQ6Ok1pbmVyQ29uZmlnPj4+AAMknFN1Ym1pdCBhIHNvbHV0aW9uIGZvciB0aGUgc2lnbmVkIHBoYXNlLgDQVGhlIGRpc3BhdGNoIG9yaWdpbiBmbyB0aGlzIGNhbGwgbXVzdCBiZSBfX3NpZ25lZF9fLgBdAVRoZSBzb2x1dGlvbiBpcyBwb3RlbnRpYWxseSBxdWV1ZWQsIGJhc2VkIG9uIHRoZSBjbGFpbWVkIHNjb3JlIGFuZCBwcm9jZXNzZWQgYXQgdGhlIGVuZFBvZiB0aGUgc2lnbmVkIHBoYXNlLgBdAUEgZGVwb3NpdCBpcyByZXNlcnZlZCBhbmQgcmVjb3JkZWQgZm9yIHRoZSBzb2x1dGlvbi4gQmFzZWQgb24gdGhlIG91dGNvbWUsIHRoZSBzb2x1dGlvbhUBbWlnaHQgYmUgcmV3YXJkZWQsIHNsYXNoZWQsIG9yIGdldCBhbGwgb3IgYSBwYXJ0IG9mIHRoZSBkZXBvc2l0IGJhY2suTGdvdmVybmFuY2VfZmFsbGJhY2sIAUBtYXliZV9tYXhfdm90ZXJzPQIBLE9wdGlvbjx1MzI+AAFEbWF5YmVfbWF4X3RhcmdldHM9AgEsT3B0aW9uPHUzMj4ABBCAVHJpZ2dlciB0aGUgZ292ZXJuYW5jZSBmYWxsYmFjay4ASQFUaGlzIGNhbiBvbmx5IGJlIGNhbGxlZCB3aGVuIFtgUGhhc2U6OkVtZXJnZW5jeWBdIGlzIGVuYWJsZWQsIGFzIGFuIGFsdGVybmF0aXZlIHRvwGNhbGxpbmcgW2BDYWxsOjpzZXRfZW1lcmdlbmN5X2VsZWN0aW9uX3Jlc3VsdGBdLgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy4lAwiQcGFsbGV0X2VsZWN0aW9uX3Byb3ZpZGVyX211bHRpX3BoYXNlLFJhd1NvbHV0aW9uBARTASkDAAwBIHNvbHV0aW9uKQMBBFMAARRzY29yZVUEATRFbGVjdGlvblNjb3JlAAEUcm91bmQQAQx1MzIAACkDCFhzdGFnaW5nX2t1c2FtYV9ydW50aW1lVE5wb3NDb21wYWN0U29sdXRpb24yNAAAYAEYdm90ZXMxLQMAAAEYdm90ZXMyOQMAAAEYdm90ZXMzTQMAAAEYdm90ZXM0WQMAAAEYdm90ZXM1ZQMAAAEYdm90ZXM2cQMAAAEYdm90ZXM3fQMAAAEYdm90ZXM4iQMAAAEYdm90ZXM5lQMAAAEcdm90ZXMxMKEDAAABHHZvdGVzMTGtAwAAARx2b3RlczEyuQMAAAEcdm90ZXMxM8UDAAABHHZvdGVzMTTRAwAAARx2b3RlczE13QMAAAEcdm90ZXMxNukDAAABHHZvdGVzMTf1AwAAARx2b3RlczE4AQQAAAEcdm90ZXMxOQ0EAAABHHZvdGVzMjAZBAAAARx2b3RlczIxJQQAAAEcdm90ZXMyMjEEAAABHHZvdGVzMjM9BAAAARx2b3RlczI0SQQAAAAtAwAAAjEDADEDAAAECNQ1AwA1AwAABlUBADkDAAACPQMAPQMAAAQM1EEDNQMAQQMAAAQINQNFAwBFAwAABkkDAEkDDDRzcF9hcml0aG1ldGljKHBlcl90aGluZ3MYUGVyVTE2AAAEAFUBAQx1MTYAAE0DAAACUQMAUQMAAAQM1FUDNQMAVQMAAAMCAAAAQQMAWQMAAAJdAwBdAwAABAzUYQM1AwBhAwAAAwMAAABBAwBlAwAAAmkDAGkDAAAEDNRtAzUDAG0DAAADBAAAAEEDAHEDAAACdQMAdQMAAAQM1HkDNQMAeQMAAAMFAAAAQQMAfQMAAAKBAwCBAwAABAzUhQM1AwCFAwAAAwYAAABBAwCJAwAAAo0DAI0DAAAEDNSRAzUDAJEDAAADBwAAAEEDAJUDAAACmQMAmQMAAAQM1J0DNQMAnQMAAAMIAAAAQQMAoQMAAAKlAwClAwAABAzUqQM1AwCpAwAAAwkAAABBAwCtAwAAArEDALEDAAAEDNS1AzUDALUDAAADCgAAAEEDALkDAAACvQMAvQMAAAQM1MEDNQMAwQMAAAMLAAAAQQMAxQMAAALJAwDJAwAABAzUzQM1AwDNAwAAAwwAAABBAwDRAwAAAtUDANUDAAAEDNTZAzUDANkDAAADDQAAAEEDAN0DAAAC4QMA4QMAAAQM1OUDNQMA5QMAAAMOAAAAQQMA6QMAAALtAwDtAwAABAzU8QM1AwDxAwAAAw8AAABBAwD1AwAAAvkDAPkDAAAEDNT9AzUDAP0DAAADEAAAAEEDAAEEAAACBQQABQQAAAQM1AkENQMACQQAAAMRAAAAQQMADQQAAAIRBAARBAAABAzUFQQ1AwAVBAAAAxIAAABBAwAZBAAAAh0EAB0EAAAEDNQhBDUDACEEAAADEwAAAEEDACUEAAACKQQAKQQAAAQM1C0ENQMALQQAAAMUAAAAQQMAMQQAAAI1BAA1BAAABAzUOQQ1AwA5BAAAAxUAAABBAwA9BAAAAkEEAEEEAAAEDNRFBDUDAEUEAAADFgAAAEEDAEkEAAACTQQATQQAAAQM1FEENQMAUQQAAAMXAAAAQQMAVQQIRHNwX25wb3NfZWxlY3Rpb25zNEVsZWN0aW9uU2NvcmUAAAwBNG1pbmltYWxfc3Rha2UYATxFeHRlbmRlZEJhbGFuY2UAASRzdW1fc3Rha2UYATxFeHRlbmRlZEJhbGFuY2UAAURzdW1fc3Rha2Vfc3F1YXJlZBgBPEV4dGVuZGVkQmFsYW5jZQAAWQQIkHBhbGxldF9lbGVjdGlvbl9wcm92aWRlcl9tdWx0aV9waGFzZVhTb2x1dGlvbk9yU25hcHNob3RTaXplAAAIARh2b3RlcnPUAQx1MzIAARx0YXJnZXRz1AEMdTMyAABdBAQYT3B0aW9uBARUAVUEAQgQTm9uZQAAABBTb21lBABVBAAAAQAAYQQAAAJlBABlBAAABAgAaQQAaQQIRHNwX25wb3NfZWxlY3Rpb25zHFN1cHBvcnQEJEFjY291bnRJZAEAAAgBFHRvdGFsGAE8RXh0ZW5kZWRCYWxhbmNlAAEYdm90ZXJzbQQBhFZlYzwoQWNjb3VudElkLCBFeHRlbmRlZEJhbGFuY2UpPgAAbQQAAAJxBABxBAAABAgAGAB1BAwocGFsbGV0X25pcxhwYWxsZXQQQ2FsbAQEVAABHCRwbGFjZV9iaWQIARhhbW91bnTkATBCYWxhbmNlT2Y8VD4AASBkdXJhdGlvbhABDHUzMgAALDBQbGFjZSBhIGJpZC4APQFPcmlnaW4gbXVzdCBiZSBTaWduZWQsIGFuZCBhY2NvdW50IG11c3QgaGF2ZSBhdCBsZWFzdCBgYW1vdW50YCBpbiBmcmVlIGJhbGFuY2UuADEBLSBgYW1vdW50YDogVGhlIGFtb3VudCBvZiB0aGUgYmlkOyB0aGVzZSBmdW5kcyB3aWxsIGJlIHJlc2VydmVkLCBhbmQgaWYvd2hlbswgIGNvbnNvbGlkYXRlZCwgcmVtb3ZlZC4gTXVzdCBiZSBhdCBsZWFzdCBgTWluQmlkYC5JAS0gYGR1cmF0aW9uYDogVGhlIG51bWJlciBvZiBwZXJpb2RzIGJlZm9yZSB3aGljaCB0aGUgbmV3bHkgY29uc29saWRhdGVkIGJpZCBtYXkgYmX8ICB0aGF3ZWQuIE11c3QgYmUgZ3JlYXRlciB0aGFuIDEgYW5kIG5vIG1vcmUgdGhhbiBgUXVldWVDb3VudGAuADRDb21wbGV4aXRpZXM6rC0gYFF1ZXVlc1tkdXJhdGlvbl0ubGVuKClgIChqdXN0IHRha2UgbWF4KS4scmV0cmFjdF9iaWQIARhhbW91bnTkATBCYWxhbmNlT2Y8VD4AASBkdXJhdGlvbhABDHUzMgABHIBSZXRyYWN0IGEgcHJldmlvdXNseSBwbGFjZWQgYmlkLgBdAU9yaWdpbiBtdXN0IGJlIFNpZ25lZCwgYW5kIHRoZSBhY2NvdW50IHNob3VsZCBoYXZlIHByZXZpb3VzbHkgaXNzdWVkIGEgc3RpbGwtYWN0aXZlIGJpZGxvZiBgYW1vdW50YCBmb3IgYGR1cmF0aW9uYC4ArC0gYGFtb3VudGA6IFRoZSBhbW91bnQgb2YgdGhlIHByZXZpb3VzIGJpZC68LSBgZHVyYXRpb25gOiBUaGUgZHVyYXRpb24gb2YgdGhlIHByZXZpb3VzIGJpZC4wZnVuZF9kZWZpY2l0AAIM8EVuc3VyZSB3ZSBoYXZlIHN1ZmZpY2llbnQgZnVuZGluZyBmb3IgYWxsIHBvdGVudGlhbCBwYXlvdXRzLgC0LSBgb3JpZ2luYDogTXVzdCBiZSBhY2NlcHRlZCBieSBgRnVuZE9yaWdpbmAuMHRoYXdfcHJpdmF0ZQgBFGluZGV41AEwUmVjZWlwdEluZGV4AAFAbWF5YmVfcHJvcG9ydGlvbpkCAUxPcHRpb248UGVycXVpbnRpbGw+AAMgXQFSZWR1Y2Ugb3IgcmVtb3ZlIGFuIG91dHN0YW5kaW5nIHJlY2VpcHQsIHBsYWNpbmcgdGhlIGFjY29yZGluZyBwcm9wb3J0aW9uIG9mIGZ1bmRzIGludG9kdGhlIGFjY291bnQgb2YgdGhlIG93bmVyLgBZAS0gYG9yaWdpbmA6IE11c3QgYmUgU2lnbmVkIGFuZCB0aGUgYWNjb3VudCBtdXN0IGJlIHRoZSBvd25lciBvZiB0aGUgcmVjZWlwdCBgaW5kZXhgIGFzjCAgd2VsbCBhcyBhbnkgZnVuZ2libGUgY291bnRlcnBhcnQukC0gYGluZGV4YDogVGhlIGluZGV4IG9mIHRoZSByZWNlaXB0Ll0BLSBgcG9ydGlvbmA6IElmIGBTb21lYCwgdGhlbiBvbmx5IHRoZSBnaXZlbiBwb3J0aW9uIG9mIHRoZSByZWNlaXB0IHNob3VsZCBiZSB0aGF3ZWQuIElmjCAgYE5vbmVgLCB0aGVuIGFsbCBvZiBpdCBzaG91bGQgYmUuNHRoYXdfY29tbXVuYWwEARRpbmRleNQBMFJlY2VpcHRJbmRleAAEGF0BUmVkdWNlIG9yIHJlbW92ZSBhbiBvdXRzdGFuZGluZyByZWNlaXB0LCBwbGFjaW5nIHRoZSBhY2NvcmRpbmcgcHJvcG9ydGlvbiBvZiBmdW5kcyBpbnRvZHRoZSBhY2NvdW50IG9mIHRoZSBvd25lci4AYQEtIGBvcmlnaW5gOiBNdXN0IGJlIFNpZ25lZCBhbmQgdGhlIGFjY291bnQgbXVzdCBiZSB0aGUgb3duZXIgb2YgdGhlIGZ1bmdpYmxlIGNvdW50ZXJwYXJ0WCAgZm9yIHJlY2VpcHQgYGluZGV4YC6QLSBgaW5kZXhgOiBUaGUgaW5kZXggb2YgdGhlIHJlY2VpcHQuJGNvbW11bmlmeQQBFGluZGV41AEwUmVjZWlwdEluZGV4AAUEPQFNYWtlIGEgcHJpdmF0ZSByZWNlaXB0IGNvbW11bmFsIGFuZCBjcmVhdGUgZnVuZ2libGUgY291bnRlcnBhcnRzIGZvciBpdHMgb3duZXIuJHByaXZhdGl6ZQQBFGluZGV41AEwUmVjZWlwdEluZGV4AAYEOQFNYWtlIGEgY29tbXVuYWwgcmVjZWlwdCBwcml2YXRlIGFuZCBidXJuIGZ1bmdpYmxlIGNvdW50ZXJwYXJ0cyBmcm9tIGl0cyBvd25lci4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMueQQMPHBhbGxldF9iYWxhbmNlcxhwYWxsZXQQQ2FsbAgEVAAESQABJFB0cmFuc2Zlcl9hbGxvd19kZWF0aAgBEGRlc3SdAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AARR2YWx1ZeQBKFQ6OkJhbGFuY2UAABzUVHJhbnNmZXIgc29tZSBsaXF1aWQgZnJlZSBiYWxhbmNlIHRvIGFub3RoZXIgYWNjb3VudC4ANQFgdHJhbnNmZXJfYWxsb3dfZGVhdGhgIHdpbGwgc2V0IHRoZSBgRnJlZUJhbGFuY2VgIG9mIHRoZSBzZW5kZXIgYW5kIHJlY2VpdmVyLhEBSWYgdGhlIHNlbmRlcidzIGFjY291bnQgaXMgYmVsb3cgdGhlIGV4aXN0ZW50aWFsIGRlcG9zaXQgYXMgYSByZXN1bHSwb2YgdGhlIHRyYW5zZmVyLCB0aGUgYWNjb3VudCB3aWxsIGJlIHJlYXBlZC4AFQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBgU2lnbmVkYCBieSB0aGUgdHJhbnNhY3Rvci44Zm9yY2VfdHJhbnNmZXIMARhzb3VyY2WdAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AARBkZXN0nQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEUdmFsdWXkAShUOjpCYWxhbmNlAAIIYQFFeGFjdGx5IGFzIGB0cmFuc2Zlcl9hbGxvd19kZWF0aGAsIGV4Y2VwdCB0aGUgb3JpZ2luIG11c3QgYmUgcm9vdCBhbmQgdGhlIHNvdXJjZSBhY2NvdW50RG1heSBiZSBzcGVjaWZpZWQuTHRyYW5zZmVyX2tlZXBfYWxpdmUIARBkZXN0nQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEUdmFsdWXkAShUOjpCYWxhbmNlAAMYWQFTYW1lIGFzIHRoZSBbYHRyYW5zZmVyX2FsbG93X2RlYXRoYF0gY2FsbCwgYnV0IHdpdGggYSBjaGVjayB0aGF0IHRoZSB0cmFuc2ZlciB3aWxsIG5vdGBraWxsIHRoZSBvcmlnaW4gYWNjb3VudC4A6Dk5JSBvZiB0aGUgdGltZSB5b3Ugd2FudCBbYHRyYW5zZmVyX2FsbG93X2RlYXRoYF0gaW5zdGVhZC4A8FtgdHJhbnNmZXJfYWxsb3dfZGVhdGhgXTogc3RydWN0LlBhbGxldC5odG1sI21ldGhvZC50cmFuc2ZlcjB0cmFuc2Zlcl9hbGwIARBkZXN0nQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEoa2VlcF9hbGl2ZSABEGJvb2wABDwFAVRyYW5zZmVyIHRoZSBlbnRpcmUgdHJhbnNmZXJhYmxlIGJhbGFuY2UgZnJvbSB0aGUgY2FsbGVyIGFjY291bnQuAFkBTk9URTogVGhpcyBmdW5jdGlvbiBvbmx5IGF0dGVtcHRzIHRvIHRyYW5zZmVyIF90cmFuc2ZlcmFibGVfIGJhbGFuY2VzLiBUaGlzIG1lYW5zIHRoYXRhAWFueSBsb2NrZWQsIHJlc2VydmVkLCBvciBleGlzdGVudGlhbCBkZXBvc2l0cyAod2hlbiBga2VlcF9hbGl2ZWAgaXMgYHRydWVgKSwgd2lsbCBub3QgYmVdAXRyYW5zZmVycmVkIGJ5IHRoaXMgZnVuY3Rpb24uIFRvIGVuc3VyZSB0aGF0IHRoaXMgZnVuY3Rpb24gcmVzdWx0cyBpbiBhIGtpbGxlZCBhY2NvdW50LEUBeW91IG1pZ2h0IG5lZWQgdG8gcHJlcGFyZSB0aGUgYWNjb3VudCBieSByZW1vdmluZyBhbnkgcmVmZXJlbmNlIGNvdW50ZXJzLCBzdG9yYWdlQGRlcG9zaXRzLCBldGMuLi4AwFRoZSBkaXNwYXRjaCBvcmlnaW4gb2YgdGhpcyBjYWxsIG11c3QgYmUgU2lnbmVkLgCgLSBgZGVzdGA6IFRoZSByZWNpcGllbnQgb2YgdGhlIHRyYW5zZmVyLlkBLSBga2VlcF9hbGl2ZWA6IEEgYm9vbGVhbiB0byBkZXRlcm1pbmUgaWYgdGhlIGB0cmFuc2Zlcl9hbGxgIG9wZXJhdGlvbiBzaG91bGQgc2VuZCBhbGxNASAgb2YgdGhlIGZ1bmRzIHRoZSBhY2NvdW50IGhhcywgY2F1c2luZyB0aGUgc2VuZGVyIGFjY291bnQgdG8gYmUga2lsbGVkIChmYWxzZSksIG9yWQEgIHRyYW5zZmVyIGV2ZXJ5dGhpbmcgZXhjZXB0IGF0IGxlYXN0IHRoZSBleGlzdGVudGlhbCBkZXBvc2l0LCB3aGljaCB3aWxsIGd1YXJhbnRlZSB0b5wgIGtlZXAgdGhlIHNlbmRlciBhY2NvdW50IGFsaXZlICh0cnVlKS48Zm9yY2VfdW5yZXNlcnZlCAEMd2hvnQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEYYW1vdW50GAEoVDo6QmFsYW5jZQAFDLBVbnJlc2VydmUgc29tZSBiYWxhbmNlIGZyb20gYSB1c2VyIGJ5IGZvcmNlLgBsQ2FuIG9ubHkgYmUgY2FsbGVkIGJ5IFJPT1QuQHVwZ3JhZGVfYWNjb3VudHMEAQx3aG+tAQFEVmVjPFQ6OkFjY291bnRJZD4ABiBwVXBncmFkZSBhIHNwZWNpZmllZCBhY2NvdW50LgB0LSBgb3JpZ2luYDogTXVzdCBiZSBgU2lnbmVkYC6QLSBgd2hvYDogVGhlIGFjY291bnQgdG8gYmUgdXBncmFkZWQuAFUBVGhpcyB3aWxsIHdhaXZlIHRoZSB0cmFuc2FjdGlvbiBmZWUgaWYgYXQgbGVhc3QgYWxsIGJ1dCAxMCUgb2YgdGhlIGFjY291bnRzIG5lZWRlZCB0b0EBYmUgdXBncmFkZWQuIChXZSBsZXQgc29tZSBub3QgaGF2ZSB0byBiZSB1cGdyYWRlZCBqdXN0IGluIG9yZGVyIHRvIGFsbG93IGZvciB0aGVYcG9zc2liaWxpdHkgb2YgY2h1cm4pLkRmb3JjZV9zZXRfYmFsYW5jZQgBDHdob50BAVBBY2NvdW50SWRMb29rdXBPZjxUPgABIG5ld19mcmVl5AEoVDo6QmFsYW5jZQAIDKxTZXQgdGhlIHJlZ3VsYXIgYmFsYW5jZSBvZiBhIGdpdmVuIGFjY291bnQuALBUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgaXMgYHJvb3RgLmxmb3JjZV9hZGp1c3RfdG90YWxfaXNzdWFuY2UIASRkaXJlY3Rpb26xAQFMQWRqdXN0bWVudERpcmVjdGlvbgABFGRlbHRh5AEoVDo6QmFsYW5jZQAJFLhBZGp1c3QgdGhlIHRvdGFsIGlzc3VhbmNlIGluIGEgc2F0dXJhdGluZyB3YXkuAPxDYW4gb25seSBiZSBjYWxsZWQgYnkgcm9vdCBhbmQgYWx3YXlzIG5lZWRzIGEgcG9zaXRpdmUgYGRlbHRhYC4AJCMgRXhhbXBsZRBidXJuCAEUdmFsdWXkAShUOjpCYWxhbmNlAAEoa2VlcF9hbGl2ZSABEGJvb2wAChz8QnVybiB0aGUgc3BlY2lmaWVkIGxpcXVpZCBmcmVlIGJhbGFuY2UgZnJvbSB0aGUgb3JpZ2luIGFjY291bnQuACUBSWYgdGhlIG9yaWdpbidzIGFjY291bnQgZW5kcyB1cCBiZWxvdyB0aGUgZXhpc3RlbnRpYWwgZGVwb3NpdCBhcyBhIHJlc3VsdAkBb2YgdGhlIGJ1cm4gYW5kIGBrZWVwX2FsaXZlYCBpcyBmYWxzZSwgdGhlIGFjY291bnQgd2lsbCBiZSByZWFwZWQuAFEBVW5saWtlIHNlbmRpbmcgZnVuZHMgdG8gYSBfYnVybl8gYWRkcmVzcywgd2hpY2ggbWVyZWx5IG1ha2VzIHRoZSBmdW5kcyBpbmFjY2Vzc2libGUsIQF0aGlzIGBidXJuYCBvcGVyYXRpb24gd2lsbCByZWR1Y2UgdG90YWwgaXNzdWFuY2UgYnkgdGhlIGFtb3VudCBfYnVybmVkXy4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMufQQMQHBhbGxldF9iYWdzX2xpc3QYcGFsbGV0EENhbGwIBFQABEkAAQwUcmViYWcEAShkaXNsb2NhdGVknQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAAoWQFEZWNsYXJlIHRoYXQgc29tZSBgZGlzbG9jYXRlZGAgYWNjb3VudCBoYXMsIHRocm91Z2ggcmV3YXJkcyBvciBwZW5hbHRpZXMsIHN1ZmZpY2llbnRseVEBY2hhbmdlZCBpdHMgc2NvcmUgdGhhdCBpdCBzaG91bGQgcHJvcGVybHkgZmFsbCBpbnRvIGEgZGlmZmVyZW50IGJhZyB0aGFuIGl0cyBjdXJyZW50EG9uZS4AHQFBbnlvbmUgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbiBhYm91dCBhbnkgcG90ZW50aWFsbHkgZGlzbG9jYXRlZCBhY2NvdW50LgBJAVdpbGwgYWx3YXlzIHVwZGF0ZSB0aGUgc3RvcmVkIHNjb3JlIG9mIGBkaXNsb2NhdGVkYCB0byB0aGUgY29ycmVjdCBzY29yZSwgYmFzZWQgb25AYFNjb3JlUHJvdmlkZXJgLgDUSWYgYGRpc2xvY2F0ZWRgIGRvZXMgbm90IGV4aXN0cywgaXQgcmV0dXJucyBhbiBlcnJvci48cHV0X2luX2Zyb250X29mBAEcbGlnaHRlcp0BAVBBY2NvdW50SWRMb29rdXBPZjxUPgABKNBNb3ZlIHRoZSBjYWxsZXIncyBJZCBkaXJlY3RseSBpbiBmcm9udCBvZiBgbGlnaHRlcmAuAFkBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8gYW5kIGNhbiBvbmx5IGJlIGNhbGxlZCBieSB0aGUgSWQgb2Y1AXRoZSBhY2NvdW50IGdvaW5nIGluIGZyb250IG9mIGBsaWdodGVyYC4gRmVlIGlzIHBheWVkIGJ5IHRoZSBvcmlnaW4gdW5kZXIgYWxsOGNpcmN1bXN0YW5jZXMuADhPbmx5IHdvcmtzIGlmOgCULSBib3RoIG5vZGVzIGFyZSB3aXRoaW4gdGhlIHNhbWUgYmFnLNAtIGFuZCBgb3JpZ2luYCBoYXMgYSBncmVhdGVyIGBTY29yZWAgdGhhbiBgbGlnaHRlcmAuVHB1dF9pbl9mcm9udF9vZl9vdGhlcggBHGhlYXZpZXKdAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AARxsaWdodGVynQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAIMEQFTYW1lIGFzIFtgUGFsbGV0OjpwdXRfaW5fZnJvbnRfb2ZgXSwgYnV0IGl0IGNhbiBiZSBjYWxsZWQgYnkgYW55b25lLgDIRmVlIGlzIHBhaWQgYnkgdGhlIG9yaWdpbiB1bmRlciBhbGwgY2lyY3Vtc3RhbmNlcy4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMugQQMXHBhbGxldF9ub21pbmF0aW9uX3Bvb2xzGHBhbGxldBBDYWxsBARUAAFoEGpvaW4IARhhbW91bnTkATBCYWxhbmNlT2Y8VD4AARxwb29sX2lkEAEYUG9vbElkAAAoRQFTdGFrZSBmdW5kcyB3aXRoIGEgcG9vbC4gVGhlIGFtb3VudCB0byBib25kIGlzIHRyYW5zZmVycmVkIGZyb20gdGhlIG1lbWJlciB0byB0aGXccG9vbHMgYWNjb3VudCBhbmQgaW1tZWRpYXRlbHkgaW5jcmVhc2VzIHRoZSBwb29scyBib25kLgAYIyBOb3RlAMwqIEFuIGFjY291bnQgY2FuIG9ubHkgYmUgYSBtZW1iZXIgb2YgYSBzaW5nbGUgcG9vbC7YKiBBbiBhY2NvdW50IGNhbm5vdCBqb2luIHRoZSBzYW1lIHBvb2wgbXVsdGlwbGUgdGltZXMuQQEqIFRoaXMgY2FsbCB3aWxsICpub3QqIGR1c3QgdGhlIG1lbWJlciBhY2NvdW50LCBzbyB0aGUgbWVtYmVyIG11c3QgaGF2ZSBhdCBsZWFzdMggIGBleGlzdGVudGlhbCBkZXBvc2l0ICsgYW1vdW50YCBpbiB0aGVpciBhY2NvdW50LtAqIE9ubHkgYSBwb29sIHdpdGggW2BQb29sU3RhdGU6Ok9wZW5gXSBjYW4gYmUgam9pbmVkKGJvbmRfZXh0cmEEARRleHRyYYUEAVxCb25kRXh0cmE8QmFsYW5jZU9mPFQ+PgABHEUBQm9uZCBgZXh0cmFgIG1vcmUgZnVuZHMgZnJvbSBgb3JpZ2luYCBpbnRvIHRoZSBwb29sIHRvIHdoaWNoIHRoZXkgYWxyZWFkeSBiZWxvbmcuAEkBQWRkaXRpb25hbCBmdW5kcyBjYW4gY29tZSBmcm9tIGVpdGhlciB0aGUgZnJlZSBiYWxhbmNlIG9mIHRoZSBhY2NvdW50LCBvZiBmcm9tIHRoZZxhY2N1bXVsYXRlZCByZXdhcmRzLCBzZWUgW2BCb25kRXh0cmFgXS4APQFCb25kaW5nIGV4dHJhIGZ1bmRzIGltcGxpZXMgYW4gYXV0b21hdGljIHBheW91dCBvZiBhbGwgcGVuZGluZyByZXdhcmRzIGFzIHdlbGwuCQFTZWUgYGJvbmRfZXh0cmFfb3RoZXJgIHRvIGJvbmQgcGVuZGluZyByZXdhcmRzIG9mIGBvdGhlcmAgbWVtYmVycy4wY2xhaW1fcGF5b3V0AAIgVQFBIGJvbmRlZCBtZW1iZXIgY2FuIHVzZSB0aGlzIHRvIGNsYWltIHRoZWlyIHBheW91dCBiYXNlZCBvbiB0aGUgcmV3YXJkcyB0aGF0IHRoZSBwb29sYQFoYXMgYWNjdW11bGF0ZWQgc2luY2UgdGhlaXIgbGFzdCBjbGFpbWVkIHBheW91dCAoT1Igc2luY2Ugam9pbmluZyBpZiB0aGlzIGlzIHRoZWlyIGZpcnN0PQF0aW1lIGNsYWltaW5nIHJld2FyZHMpLiBUaGUgcGF5b3V0IHdpbGwgYmUgdHJhbnNmZXJyZWQgdG8gdGhlIG1lbWJlcidzIGFjY291bnQuAEkBVGhlIG1lbWJlciB3aWxsIGVhcm4gcmV3YXJkcyBwcm8gcmF0YSBiYXNlZCBvbiB0aGUgbWVtYmVycyBzdGFrZSB2cyB0aGUgc3VtIG9mIHRoZdBtZW1iZXJzIGluIHRoZSBwb29scyBzdGFrZS4gUmV3YXJkcyBkbyBub3QgImV4cGlyZSIuAEEBU2VlIGBjbGFpbV9wYXlvdXRfb3RoZXJgIHRvIGNsYWltIHJld2FyZHMgb24gYmVoYWxmIG9mIHNvbWUgYG90aGVyYCBwb29sIG1lbWJlci4YdW5ib25kCAE4bWVtYmVyX2FjY291bnSdAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AAUB1bmJvbmRpbmdfcG9pbnRz5AEwQmFsYW5jZU9mPFQ+AAN8RQFVbmJvbmQgdXAgdG8gYHVuYm9uZGluZ19wb2ludHNgIG9mIHRoZSBgbWVtYmVyX2FjY291bnRgJ3MgZnVuZHMgZnJvbSB0aGUgcG9vbC4gSXRFAWltcGxpY2l0bHkgY29sbGVjdHMgdGhlIHJld2FyZHMgb25lIGxhc3QgdGltZSwgc2luY2Ugbm90IGRvaW5nIHNvIHdvdWxkIG1lYW4gc29tZWxyZXdhcmRzIHdvdWxkIGJlIGZvcmZlaXRlZC4ATQFVbmRlciBjZXJ0YWluIGNvbmRpdGlvbnMsIHRoaXMgY2FsbCBjYW4gYmUgZGlzcGF0Y2hlZCBwZXJtaXNzaW9ubGVzc2x5IChpLmUuIGJ5IGFueSRhY2NvdW50KS4ArCMgQ29uZGl0aW9ucyBmb3IgYSBwZXJtaXNzaW9ubGVzcyBkaXNwYXRjaC4AXQEqIFRoZSBwb29sIGlzIGJsb2NrZWQgYW5kIHRoZSBjYWxsZXIgaXMgZWl0aGVyIHRoZSByb290IG9yIGJvdW5jZXIuIFRoaXMgaXMgcmVmZXJlZWQgdG8wICBhcyBhIGtpY2su9CogVGhlIHBvb2wgaXMgZGVzdHJveWluZyBhbmQgdGhlIG1lbWJlciBpcyBub3QgdGhlIGRlcG9zaXRvci5VASogVGhlIHBvb2wgaXMgZGVzdHJveWluZywgdGhlIG1lbWJlciBpcyB0aGUgZGVwb3NpdG9yIGFuZCBubyBvdGhlciBtZW1iZXJzIGFyZSBpbiB0aGUcICBwb29sLgARASMjIENvbmRpdGlvbnMgZm9yIHBlcm1pc3Npb25lZCBkaXNwYXRjaCAoaS5lLiB0aGUgY2FsbGVyIGlzIGFsc28gdGhlSGBtZW1iZXJfYWNjb3VudGApOgCIKiBUaGUgY2FsbGVyIGlzIG5vdCB0aGUgZGVwb3NpdG9yLlUBKiBUaGUgY2FsbGVyIGlzIHRoZSBkZXBvc2l0b3IsIHRoZSBwb29sIGlzIGRlc3Ryb3lpbmcgYW5kIG5vIG90aGVyIG1lbWJlcnMgYXJlIGluIHRoZRwgIHBvb2wuABgjIE5vdGUAHQFJZiB0aGVyZSBhcmUgdG9vIG1hbnkgdW5sb2NraW5nIGNodW5rcyB0byB1bmJvbmQgd2l0aCB0aGUgcG9vbCBhY2NvdW50LFEBW2BDYWxsOjpwb29sX3dpdGhkcmF3X3VuYm9uZGVkYF0gY2FuIGJlIGNhbGxlZCB0byB0cnkgYW5kIG1pbmltaXplIHVubG9ja2luZyBjaHVua3MuWQFUaGUgW2BTdGFraW5nSW50ZXJmYWNlOjp1bmJvbmRgXSB3aWxsIGltcGxpY2l0bHkgY2FsbCBbYENhbGw6OnBvb2xfd2l0aGRyYXdfdW5ib25kZWRgXVUBdG8gdHJ5IHRvIGZyZWUgY2h1bmtzIGlmIG5lY2Vzc2FyeSAoaWUuIGlmIHVuYm91bmQgd2FzIGNhbGxlZCBhbmQgbm8gdW5sb2NraW5nIGNodW5rc2EBYXJlIGF2YWlsYWJsZSkuIEhvd2V2ZXIsIGl0IG1heSBub3QgYmUgcG9zc2libGUgdG8gcmVsZWFzZSB0aGUgY3VycmVudCB1bmxvY2tpbmcgY2h1bmtzLF0BaW4gd2hpY2ggY2FzZSwgdGhlIHJlc3VsdCBvZiB0aGlzIGNhbGwgd2lsbCBsaWtlbHkgYmUgdGhlIGBOb01vcmVDaHVua3NgIGVycm9yIGZyb20gdGhlPHN0YWtpbmcgc3lzdGVtLlhwb29sX3dpdGhkcmF3X3VuYm9uZGVkCAEccG9vbF9pZBABGFBvb2xJZAABSG51bV9zbGFzaGluZ19zcGFucxABDHUzMgAEGFUBQ2FsbCBgd2l0aGRyYXdfdW5ib25kZWRgIGZvciB0aGUgcG9vbHMgYWNjb3VudC4gVGhpcyBjYWxsIGNhbiBiZSBtYWRlIGJ5IGFueSBhY2NvdW50LgBBAVRoaXMgaXMgdXNlZnVsIGlmIHRoZXJlIGFyZSB0b28gbWFueSB1bmxvY2tpbmcgY2h1bmtzIHRvIGNhbGwgYHVuYm9uZGAsIGFuZCBzb21lYQFjYW4gYmUgY2xlYXJlZCBieSB3aXRoZHJhd2luZy4gSW4gdGhlIGNhc2UgdGhlcmUgYXJlIHRvbyBtYW55IHVubG9ja2luZyBjaHVua3MsIHRoZSB1c2VyUQF3b3VsZCBwcm9iYWJseSBzZWUgYW4gZXJyb3IgbGlrZSBgTm9Nb3JlQ2h1bmtzYCBlbWl0dGVkIGZyb20gdGhlIHN0YWtpbmcgc3lzdGVtIHdoZW5cdGhleSBhdHRlbXB0IHRvIHVuYm9uZC5Ed2l0aGRyYXdfdW5ib25kZWQIAThtZW1iZXJfYWNjb3VudJ0BAVBBY2NvdW50SWRMb29rdXBPZjxUPgABSG51bV9zbGFzaGluZ19zcGFucxABDHUzMgAFWFUBV2l0aGRyYXcgdW5ib25kZWQgZnVuZHMgZnJvbSBgbWVtYmVyX2FjY291bnRgLiBJZiBubyBib25kZWQgZnVuZHMgY2FuIGJlIHVuYm9uZGVkLCBhbkhlcnJvciBpcyByZXR1cm5lZC4ATQFVbmRlciBjZXJ0YWluIGNvbmRpdGlvbnMsIHRoaXMgY2FsbCBjYW4gYmUgZGlzcGF0Y2hlZCBwZXJtaXNzaW9ubGVzc2x5IChpLmUuIGJ5IGFueSRhY2NvdW50KS4AqCMgQ29uZGl0aW9ucyBmb3IgYSBwZXJtaXNzaW9ubGVzcyBkaXNwYXRjaAAJASogVGhlIHBvb2wgaXMgaW4gZGVzdHJveSBtb2RlIGFuZCB0aGUgdGFyZ2V0IGlzIG5vdCB0aGUgZGVwb3NpdG9yLjEBKiBUaGUgdGFyZ2V0IGlzIHRoZSBkZXBvc2l0b3IgYW5kIHRoZXkgYXJlIHRoZSBvbmx5IG1lbWJlciBpbiB0aGUgc3ViIHBvb2xzLg0BKiBUaGUgcG9vbCBpcyBibG9ja2VkIGFuZCB0aGUgY2FsbGVyIGlzIGVpdGhlciB0aGUgcm9vdCBvciBib3VuY2VyLgCYIyBDb25kaXRpb25zIGZvciBwZXJtaXNzaW9uZWQgZGlzcGF0Y2gA6CogVGhlIGNhbGxlciBpcyB0aGUgdGFyZ2V0IGFuZCB0aGV5IGFyZSBub3QgdGhlIGRlcG9zaXRvci4AGCMgTm90ZQD0LSBJZiB0aGUgdGFyZ2V0IGlzIHRoZSBkZXBvc2l0b3IsIHRoZSBwb29sIHdpbGwgYmUgZGVzdHJveWVkLmEBLSBJZiB0aGUgcG9vbCBoYXMgYW55IHBlbmRpbmcgc2xhc2gsIHdlIGFsc28gdHJ5IHRvIHNsYXNoIHRoZSBtZW1iZXIgYmVmb3JlIGxldHRpbmcgdGhlbV0Bd2l0aGRyYXcuIFRoaXMgY2FsY3VsYXRpb24gYWRkcyBzb21lIHdlaWdodCBvdmVyaGVhZCBhbmQgaXMgb25seSBkZWZlbnNpdmUuIEluIHJlYWxpdHksVQFwb29sIHNsYXNoZXMgbXVzdCBoYXZlIGJlZW4gYWxyZWFkeSBhcHBsaWVkIHZpYSBwZXJtaXNzaW9ubGVzcyBbYENhbGw6OmFwcGx5X3NsYXNoYF0uGGNyZWF0ZRABGGFtb3VudOQBMEJhbGFuY2VPZjxUPgABEHJvb3SdAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AASRub21pbmF0b3KdAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AARxib3VuY2VynQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAZEdENyZWF0ZSBhIG5ldyBkZWxlZ2F0aW9uIHBvb2wuACwjIEFyZ3VtZW50cwBVASogYGFtb3VudGAgLSBUaGUgYW1vdW50IG9mIGZ1bmRzIHRvIGRlbGVnYXRlIHRvIHRoZSBwb29sLiBUaGlzIGFsc28gYWN0cyBvZiBhIHNvcnQgb2ZNASAgZGVwb3NpdCBzaW5jZSB0aGUgcG9vbHMgY3JlYXRvciBjYW5ub3QgZnVsbHkgdW5ib25kIGZ1bmRzIHVudGlsIHRoZSBwb29sIGlzIGJlaW5nMCAgZGVzdHJveWVkLlEBKiBgaW5kZXhgIC0gQSBkaXNhbWJpZ3VhdGlvbiBpbmRleCBmb3IgY3JlYXRpbmcgdGhlIGFjY291bnQuIExpa2VseSBvbmx5IHVzZWZ1bCB3aGVuwCAgY3JlYXRpbmcgbXVsdGlwbGUgcG9vbHMgaW4gdGhlIHNhbWUgZXh0cmluc2ljLtQqIGByb290YCAtIFRoZSBhY2NvdW50IHRvIHNldCBhcyBbYFBvb2xSb2xlczo6cm9vdGBdLg0BKiBgbm9taW5hdG9yYCAtIFRoZSBhY2NvdW50IHRvIHNldCBhcyB0aGUgW2BQb29sUm9sZXM6Om5vbWluYXRvcmBdLvwqIGBib3VuY2VyYCAtIFRoZSBhY2NvdW50IHRvIHNldCBhcyB0aGUgW2BQb29sUm9sZXM6OmJvdW5jZXJgXS4AGCMgTm90ZQBhAUluIGFkZGl0aW9uIHRvIGBhbW91bnRgLCB0aGUgY2FsbGVyIHdpbGwgdHJhbnNmZXIgdGhlIGV4aXN0ZW50aWFsIGRlcG9zaXQ7IHNvIHRoZSBjYWxsZXINAW5lZWRzIGF0IGhhdmUgYXQgbGVhc3QgYGFtb3VudCArIGV4aXN0ZW50aWFsX2RlcG9zaXRgIHRyYW5zZmVyYWJsZS5MY3JlYXRlX3dpdGhfcG9vbF9pZBQBGGFtb3VudOQBMEJhbGFuY2VPZjxUPgABEHJvb3SdAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AASRub21pbmF0b3KdAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AARxib3VuY2VynQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEccG9vbF9pZBABGFBvb2xJZAAHGOxDcmVhdGUgYSBuZXcgZGVsZWdhdGlvbiBwb29sIHdpdGggYSBwcmV2aW91c2x5IHVzZWQgcG9vbCBpZAAsIyBBcmd1bWVudHMAmHNhbWUgYXMgYGNyZWF0ZWAgd2l0aCB0aGUgaW5jbHVzaW9uIG9meCogYHBvb2xfaWRgIC0gYEEgdmFsaWQgUG9vbElkLiBub21pbmF0ZQgBHHBvb2xfaWQQARhQb29sSWQAASh2YWxpZGF0b3JzrQEBRFZlYzxUOjpBY2NvdW50SWQ+AAgwfE5vbWluYXRlIG9uIGJlaGFsZiBvZiB0aGUgcG9vbC4ARQFUaGUgZGlzcGF0Y2ggb3JpZ2luIG9mIHRoaXMgY2FsbCBtdXN0IGJlIHNpZ25lZCBieSB0aGUgcG9vbCBub21pbmF0b3Igb3IgdGhlIHBvb2wocm9vdCByb2xlLgBJAVRoaXMgZGlyZWN0bHkgZm9yd2FyZCB0aGUgY2FsbCB0byB0aGUgc3Rha2luZyBwYWxsZXQsIG9uIGJlaGFsZiBvZiB0aGUgcG9vbCBib25kZWQgYWNjb3VudC4AGCMgTm90ZQBdAUluIGFkZGl0aW9uIHRvIGEgYHJvb3RgIG9yIGBub21pbmF0b3JgIHJvbGUgb2YgYG9yaWdpbmAsIHBvb2wncyBkZXBvc2l0b3IgbmVlZHMgdG8gaGF2ZfhhdCBsZWFzdCBgZGVwb3NpdG9yX21pbl9ib25kYCBpbiB0aGUgcG9vbCB0byBzdGFydCBub21pbmF0aW5nLiRzZXRfc3RhdGUIARxwb29sX2lkEAEYUG9vbElkAAEUc3RhdGWJBAEkUG9vbFN0YXRlAAkodFNldCBhIG5ldyBzdGF0ZSBmb3IgdGhlIHBvb2wuAFUBSWYgYSBwb29sIGlzIGFscmVhZHkgaW4gdGhlIGBEZXN0cm95aW5nYCBzdGF0ZSwgdGhlbiB1bmRlciBubyBjb25kaXRpb24gY2FuIGl0cyBzdGF0ZTRjaGFuZ2UgYWdhaW4uAMBUaGUgZGlzcGF0Y2ggb3JpZ2luIG9mIHRoaXMgY2FsbCBtdXN0IGJlIGVpdGhlcjoA3DEuIHNpZ25lZCBieSB0aGUgYm91bmNlciwgb3IgdGhlIHJvb3Qgcm9sZSBvZiB0aGUgcG9vbCxdATIuIGlmIHRoZSBwb29sIGNvbmRpdGlvbnMgdG8gYmUgb3BlbiBhcmUgTk9UIG1ldCAoYXMgZGVzY3JpYmVkIGJ5IGBva190b19iZV9vcGVuYCksIGFuZDkBICAgdGhlbiB0aGUgc3RhdGUgb2YgdGhlIHBvb2wgY2FuIGJlIHBlcm1pc3Npb25sZXNzbHkgY2hhbmdlZCB0byBgRGVzdHJveWluZ2AuMHNldF9tZXRhZGF0YQgBHHBvb2xfaWQQARhQb29sSWQAASBtZXRhZGF0YTgBHFZlYzx1OD4AChCAU2V0IGEgbmV3IG1ldGFkYXRhIGZvciB0aGUgcG9vbC4AXQFUaGUgZGlzcGF0Y2ggb3JpZ2luIG9mIHRoaXMgY2FsbCBtdXN0IGJlIHNpZ25lZCBieSB0aGUgYm91bmNlciwgb3IgdGhlIHJvb3Qgcm9sZSBvZiB0aGUUcG9vbC4sc2V0X2NvbmZpZ3MYATRtaW5fam9pbl9ib25kjQQBWENvbmZpZ09wPEJhbGFuY2VPZjxUPj4AATxtaW5fY3JlYXRlX2JvbmSNBAFYQ29uZmlnT3A8QmFsYW5jZU9mPFQ+PgABJG1heF9wb29sc5EEATRDb25maWdPcDx1MzI+AAEsbWF4X21lbWJlcnORBAE0Q29uZmlnT3A8dTMyPgABUG1heF9tZW1iZXJzX3Blcl9wb29skQQBNENvbmZpZ09wPHUzMj4AAVRnbG9iYWxfbWF4X2NvbW1pc3Npb26VBAFEQ29uZmlnT3A8UGVyYmlsbD4ACyxBAVVwZGF0ZSBjb25maWd1cmF0aW9ucyBmb3IgdGhlIG5vbWluYXRpb24gcG9vbHMuIFRoZSBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlYFtgQ29uZmlnOjpBZG1pbk9yaWdpbmBdLgAsIyBBcmd1bWVudHMAoCogYG1pbl9qb2luX2JvbmRgIC0gU2V0IFtgTWluSm9pbkJvbmRgXS6wKiBgbWluX2NyZWF0ZV9ib25kYCAtIFNldCBbYE1pbkNyZWF0ZUJvbmRgXS6EKiBgbWF4X3Bvb2xzYCAtIFNldCBbYE1heFBvb2xzYF0upCogYG1heF9tZW1iZXJzYCAtIFNldCBbYE1heFBvb2xNZW1iZXJzYF0u5CogYG1heF9tZW1iZXJzX3Blcl9wb29sYCAtIFNldCBbYE1heFBvb2xNZW1iZXJzUGVyUG9vbGBdLuAqIGBnbG9iYWxfbWF4X2NvbW1pc3Npb25gIC0gU2V0IFtgR2xvYmFsTWF4Q29tbWlzc2lvbmBdLjB1cGRhdGVfcm9sZXMQARxwb29sX2lkEAEYUG9vbElkAAEgbmV3X3Jvb3SZBAFYQ29uZmlnT3A8VDo6QWNjb3VudElkPgABNG5ld19ub21pbmF0b3KZBAFYQ29uZmlnT3A8VDo6QWNjb3VudElkPgABLG5ld19ib3VuY2VymQQBWENvbmZpZ09wPFQ6OkFjY291bnRJZD4ADBx0VXBkYXRlIHRoZSByb2xlcyBvZiB0aGUgcG9vbC4APQFUaGUgcm9vdCBpcyB0aGUgb25seSBlbnRpdHkgdGhhdCBjYW4gY2hhbmdlIGFueSBvZiB0aGUgcm9sZXMsIGluY2x1ZGluZyBpdHNlbGYsuGV4Y2x1ZGluZyB0aGUgZGVwb3NpdG9yLCB3aG8gY2FuIG5ldmVyIGNoYW5nZS4AUQFJdCBlbWl0cyBhbiBldmVudCwgbm90aWZ5aW5nIFVJcyBvZiB0aGUgcm9sZSBjaGFuZ2UuIFRoaXMgZXZlbnQgaXMgcXVpdGUgcmVsZXZhbnQgdG8dAW1vc3QgcG9vbCBtZW1iZXJzIGFuZCB0aGV5IHNob3VsZCBiZSBpbmZvcm1lZCBvZiBjaGFuZ2VzIHRvIHBvb2wgcm9sZXMuFGNoaWxsBAEccG9vbF9pZBABGFBvb2xJZAANQHBDaGlsbCBvbiBiZWhhbGYgb2YgdGhlIHBvb2wuAEEBVGhlIGRpc3BhdGNoIG9yaWdpbiBvZiB0aGlzIGNhbGwgY2FuIGJlIHNpZ25lZCBieSB0aGUgcG9vbCBub21pbmF0b3Igb3IgdGhlIHBvb2ygcm9vdCByb2xlLCBzYW1lIGFzIFtgUGFsbGV0Ojpub21pbmF0ZWBdLgBNAVVuZGVyIGNlcnRhaW4gY29uZGl0aW9ucywgdGhpcyBjYWxsIGNhbiBiZSBkaXNwYXRjaGVkIHBlcm1pc3Npb25sZXNzbHkgKGkuZS4gYnkgYW55JGFjY291bnQpLgCsIyBDb25kaXRpb25zIGZvciBhIHBlcm1pc3Npb25sZXNzIGRpc3BhdGNoOlkBKiBXaGVuIHBvb2wgZGVwb3NpdG9yIGhhcyBsZXNzIHRoYW4gYE1pbk5vbWluYXRvckJvbmRgIHN0YWtlZCwgb3RoZXJ3aXNlICBwb29sIG1lbWJlcnNcICBhcmUgdW5hYmxlIHRvIHVuYm9uZC4AnCMgQ29uZGl0aW9ucyBmb3IgcGVybWlzc2lvbmVkIGRpc3BhdGNoOtgqIFRoZSBjYWxsZXIgaGFzIGEgbm9taW5hdG9yIG9yIHJvb3Qgcm9sZSBvZiB0aGUgcG9vbC5JAVRoaXMgZGlyZWN0bHkgZm9yd2FyZCB0aGUgY2FsbCB0byB0aGUgc3Rha2luZyBwYWxsZXQsIG9uIGJlaGFsZiBvZiB0aGUgcG9vbCBib25kZWQgYWNjb3VudC5AYm9uZF9leHRyYV9vdGhlcggBGG1lbWJlcp0BAVBBY2NvdW50SWRMb29rdXBPZjxUPgABFGV4dHJhhQQBXEJvbmRFeHRyYTxCYWxhbmNlT2Y8VD4+AA4kVQFgb3JpZ2luYCBib25kcyBmdW5kcyBmcm9tIGBleHRyYWAgZm9yIHNvbWUgcG9vbCBtZW1iZXIgYG1lbWJlcmAgaW50byB0aGVpciByZXNwZWN0aXZlGHBvb2xzLgBJAWBvcmlnaW5gIGNhbiBib25kIGV4dHJhIGZ1bmRzIGZyb20gZnJlZSBiYWxhbmNlIG9yIHBlbmRpbmcgcmV3YXJkcyB3aGVuIGBvcmlnaW4gPT0cb3RoZXJgLgBFAUluIHRoZSBjYXNlIG9mIGBvcmlnaW4gIT0gb3RoZXJgLCBgb3JpZ2luYCBjYW4gb25seSBib25kIGV4dHJhIHBlbmRpbmcgcmV3YXJkcyBvZhUBYG90aGVyYCBtZW1iZXJzIGFzc3VtaW5nIHNldF9jbGFpbV9wZXJtaXNzaW9uIGZvciB0aGUgZ2l2ZW4gbWVtYmVyIGlzwGBQZXJtaXNzaW9ubGVzc0NvbXBvdW5kYCBvciBgUGVybWlzc2lvbmxlc3NBbGxgLlBzZXRfY2xhaW1fcGVybWlzc2lvbgQBKHBlcm1pc3Npb26dBAE8Q2xhaW1QZXJtaXNzaW9uAA8cSQFBbGxvd3MgYSBwb29sIG1lbWJlciB0byBzZXQgYSBjbGFpbSBwZXJtaXNzaW9uIHRvIGFsbG93IG9yIGRpc2FsbG93IHBlcm1pc3Npb25sZXNzYGJvbmRpbmcgYW5kIHdpdGhkcmF3aW5nLgAsIyBBcmd1bWVudHMAeCogYG9yaWdpbmAgLSBNZW1iZXIgb2YgYSBwb29sLrgqIGBwZXJtaXNzaW9uYCAtIFRoZSBwZXJtaXNzaW9uIHRvIGJlIGFwcGxpZWQuSGNsYWltX3BheW91dF9vdGhlcgQBFG90aGVyAAEwVDo6QWNjb3VudElkABAQAQFgb3JpZ2luYCBjYW4gY2xhaW0gcGF5b3V0cyBvbiBzb21lIHBvb2wgbWVtYmVyIGBvdGhlcmAncyBiZWhhbGYuAFUBUG9vbCBtZW1iZXIgYG90aGVyYCBtdXN0IGhhdmUgYSBgUGVybWlzc2lvbmxlc3NXaXRoZHJhd2Agb3IgYFBlcm1pc3Npb25sZXNzQWxsYCBjbGFpbahwZXJtaXNzaW9uIGZvciB0aGlzIGNhbGwgdG8gYmUgc3VjY2Vzc2Z1bC44c2V0X2NvbW1pc3Npb24IARxwb29sX2lkEAEYUG9vbElkAAE4bmV3X2NvbW1pc3Npb26hBAF8T3B0aW9uPChQZXJiaWxsLCBUOjpBY2NvdW50SWQpPgARFHRTZXQgdGhlIGNvbW1pc3Npb24gb2YgYSBwb29sLlUBQm90aCBhIGNvbW1pc3Npb24gcGVyY2VudGFnZSBhbmQgYSBjb21taXNzaW9uIHBheWVlIG11c3QgYmUgcHJvdmlkZWQgaW4gdGhlIGBjdXJyZW50YF0BdHVwbGUuIFdoZXJlIGEgYGN1cnJlbnRgIG9mIGBOb25lYCBpcyBwcm92aWRlZCwgYW55IGN1cnJlbnQgY29tbWlzc2lvbiB3aWxsIGJlIHJlbW92ZWQuAE0BLSBJZiBhIGBOb25lYCBpcyBzdXBwbGllZCB0byBgbmV3X2NvbW1pc3Npb25gLCBleGlzdGluZyBjb21taXNzaW9uIHdpbGwgYmUgcmVtb3ZlZC5Ic2V0X2NvbW1pc3Npb25fbWF4CAEccG9vbF9pZBABGFBvb2xJZAABOG1heF9jb21taXNzaW9ulAEcUGVyYmlsbAASFJRTZXQgdGhlIG1heGltdW0gY29tbWlzc2lvbiBvZiBhIHBvb2wuADkBLSBJbml0aWFsIG1heCBjYW4gYmUgc2V0IHRvIGFueSBgUGVyYmlsbGAsIGFuZCBvbmx5IHNtYWxsZXIgdmFsdWVzIHRoZXJlYWZ0ZXIuNQEtIEN1cnJlbnQgY29tbWlzc2lvbiB3aWxsIGJlIGxvd2VyZWQgaW4gdGhlIGV2ZW50IGl0IGlzIGhpZ2hlciB0aGFuIGEgbmV3IG1heDQgIGNvbW1pc3Npb24uaHNldF9jb21taXNzaW9uX2NoYW5nZV9yYXRlCAEccG9vbF9pZBABGFBvb2xJZAABLGNoYW5nZV9yYXRlqQQBnENvbW1pc3Npb25DaGFuZ2VSYXRlPEJsb2NrTnVtYmVyRm9yPFQ+PgATEKhTZXQgdGhlIGNvbW1pc3Npb24gY2hhbmdlIHJhdGUgZm9yIGEgcG9vbC4APQFJbml0aWFsIGNoYW5nZSByYXRlIGlzIG5vdCBib3VuZGVkLCB3aGVyZWFzIHN1YnNlcXVlbnQgdXBkYXRlcyBjYW4gb25seSBiZSBtb3JldHJlc3RyaWN0aXZlIHRoYW4gdGhlIGN1cnJlbnQuQGNsYWltX2NvbW1pc3Npb24EARxwb29sX2lkEAEYUG9vbElkABQUZENsYWltIHBlbmRpbmcgY29tbWlzc2lvbi4AXQFUaGUgZGlzcGF0Y2ggb3JpZ2luIG9mIHRoaXMgY2FsbCBtdXN0IGJlIHNpZ25lZCBieSB0aGUgYHJvb3RgIHJvbGUgb2YgdGhlIHBvb2wuIFBlbmRpbmddAWNvbW1pc3Npb24gaXMgcGFpZCBvdXQgYW5kIGFkZGVkIHRvIHRvdGFsIGNsYWltZWQgY29tbWlzc2lvbmAuIFRvdGFsIHBlbmRpbmcgY29tbWlzc2lvbnhpcyByZXNldCB0byB6ZXJvLiB0aGUgY3VycmVudC5MYWRqdXN0X3Bvb2xfZGVwb3NpdAQBHHBvb2xfaWQQARhQb29sSWQAFRzsVG9wIHVwIHRoZSBkZWZpY2l0IG9yIHdpdGhkcmF3IHRoZSBleGNlc3MgRUQgZnJvbSB0aGUgcG9vbC4AUQFXaGVuIGEgcG9vbCBpcyBjcmVhdGVkLCB0aGUgcG9vbCBkZXBvc2l0b3IgdHJhbnNmZXJzIEVEIHRvIHRoZSByZXdhcmQgYWNjb3VudCBvZiB0aGVVAXBvb2wuIEVEIGlzIHN1YmplY3QgdG8gY2hhbmdlIGFuZCBvdmVyIHRpbWUsIHRoZSBkZXBvc2l0IGluIHRoZSByZXdhcmQgYWNjb3VudCBtYXkgYmVRAWluc3VmZmljaWVudCB0byBjb3ZlciB0aGUgRUQgZGVmaWNpdCBvZiB0aGUgcG9vbCBvciB2aWNlLXZlcnNhIHdoZXJlIHRoZXJlIGlzIGV4Y2VzczEBZGVwb3NpdCB0byB0aGUgcG9vbC4gVGhpcyBjYWxsIGFsbG93cyBhbnlvbmUgdG8gYWRqdXN0IHRoZSBFRCBkZXBvc2l0IG9mIHRoZfRwb29sIGJ5IGVpdGhlciB0b3BwaW5nIHVwIHRoZSBkZWZpY2l0IG9yIGNsYWltaW5nIHRoZSBleGNlc3MufHNldF9jb21taXNzaW9uX2NsYWltX3Blcm1pc3Npb24IARxwb29sX2lkEAEYUG9vbElkAAEocGVybWlzc2lvbq0EAbxPcHRpb248Q29tbWlzc2lvbkNsYWltUGVybWlzc2lvbjxUOjpBY2NvdW50SWQ+PgAWEMxTZXQgb3IgcmVtb3ZlIGEgcG9vbCdzIGNvbW1pc3Npb24gY2xhaW0gcGVybWlzc2lvbi4AYQFEZXRlcm1pbmVzIHdobyBjYW4gY2xhaW0gdGhlIHBvb2wncyBwZW5kaW5nIGNvbW1pc3Npb24uIE9ubHkgdGhlIGBSb290YCByb2xlIG9mIHRoZSBwb29syGlzIGFibGUgdG8gY29uZmlndXJlIGNvbW1pc3Npb24gY2xhaW0gcGVybWlzc2lvbnMuLGFwcGx5X3NsYXNoBAE4bWVtYmVyX2FjY291bnSdAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AFxyIQXBwbHkgYSBwZW5kaW5nIHNsYXNoIG9uIGEgbWVtYmVyLgAlAUZhaWxzIHVubGVzcyBbYGNyYXRlOjpwYWxsZXQ6OkNvbmZpZzo6U3Rha2VBZGFwdGVyYF0gaXMgb2Ygc3RyYXRlZ3kgdHlwZTqkW2BhZGFwdGVyOjpTdGFrZVN0cmF0ZWd5VHlwZTo6RGVsZWdhdGVgXS4AVQFUaGlzIGNhbGwgY2FuIGJlIGRpc3BhdGNoZWQgcGVybWlzc2lvbmxlc3NseSAoaS5lLiBieSBhbnkgYWNjb3VudCkuIElmIHRoZSBtZW1iZXIgaGFzHQFzbGFzaCB0byBiZSBhcHBsaWVkLCBjYWxsZXIgbWF5IGJlIHJld2FyZGVkIHdpdGggdGhlIHBhcnQgb2YgdGhlIHNsYXNoLkhtaWdyYXRlX2RlbGVnYXRpb24EAThtZW1iZXJfYWNjb3VudJ0BAVBBY2NvdW50SWRMb29rdXBPZjxUPgAYJB0BTWlncmF0ZXMgZGVsZWdhdGVkIGZ1bmRzIGZyb20gdGhlIHBvb2wgYWNjb3VudCB0byB0aGUgYG1lbWJlcl9hY2NvdW50YC4AJQFGYWlscyB1bmxlc3MgW2BjcmF0ZTo6cGFsbGV0OjpDb25maWc6OlN0YWtlQWRhcHRlcmBdIGlzIG9mIHN0cmF0ZWd5IHR5cGU6pFtgYWRhcHRlcjo6U3Rha2VTdHJhdGVneVR5cGU6OkRlbGVnYXRlYF0uACkBVGhpcyBpcyBhIHBlcm1pc3Npb24tbGVzcyBjYWxsIGFuZCByZWZ1bmRzIGFueSBmZWUgaWYgY2xhaW0gaXMgc3VjY2Vzc2Z1bC4AXQFJZiB0aGUgcG9vbCBoYXMgbWlncmF0ZWQgdG8gZGVsZWdhdGlvbiBiYXNlZCBzdGFraW5nLCB0aGUgc3Rha2VkIHRva2VucyBvZiBwb29sIG1lbWJlcnMpAWNhbiBiZSBtb3ZlZCBhbmQgaGVsZCBpbiB0aGVpciBvd24gYWNjb3VudC4gU2VlIFtgYWRhcHRlcjo6RGVsZWdhdGVTdGFrZWBdeG1pZ3JhdGVfcG9vbF90b19kZWxlZ2F0ZV9zdGFrZQQBHHBvb2xfaWQQARhQb29sSWQAGST0TWlncmF0ZSBwb29sIGZyb20gW2BhZGFwdGVyOjpTdGFrZVN0cmF0ZWd5VHlwZTo6VHJhbnNmZXJgXSB0b6RbYGFkYXB0ZXI6OlN0YWtlU3RyYXRlZ3lUeXBlOjpEZWxlZ2F0ZWBdLgAlAUZhaWxzIHVubGVzcyBbYGNyYXRlOjpwYWxsZXQ6OkNvbmZpZzo6U3Rha2VBZGFwdGVyYF0gaXMgb2Ygc3RyYXRlZ3kgdHlwZTqkW2BhZGFwdGVyOjpTdGFrZVN0cmF0ZWd5VHlwZTo6RGVsZWdhdGVgXS4AQQFUaGlzIGNhbGwgY2FuIGJlIGRpc3BhdGNoZWQgcGVybWlzc2lvbmxlc3NseSwgYW5kIHJlZnVuZHMgYW55IGZlZSBpZiBzdWNjZXNzZnVsLgBJAUlmIHRoZSBwb29sIGhhcyBhbHJlYWR5IG1pZ3JhdGVkIHRvIGRlbGVnYXRpb24gYmFzZWQgc3Rha2luZywgdGhpcyBjYWxsIHdpbGwgZmFpbC4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMuhQQIXHBhbGxldF9ub21pbmF0aW9uX3Bvb2xzJEJvbmRFeHRyYQQcQmFsYW5jZQEYAQgsRnJlZUJhbGFuY2UEABgBHEJhbGFuY2UAAAAcUmV3YXJkcwABAACJBAhccGFsbGV0X25vbWluYXRpb25fcG9vbHMkUG9vbFN0YXRlAAEMEE9wZW4AAAAcQmxvY2tlZAABAChEZXN0cm95aW5nAAIAAI0ECFxwYWxsZXRfbm9taW5hdGlvbl9wb29scyBDb25maWdPcAQEVAEYAQwQTm9vcAAAAAxTZXQEABgBBFQAAQAYUmVtb3ZlAAIAAJEECFxwYWxsZXRfbm9taW5hdGlvbl9wb29scyBDb25maWdPcAQEVAEQAQwQTm9vcAAAAAxTZXQEABABBFQAAQAYUmVtb3ZlAAIAAJUECFxwYWxsZXRfbm9taW5hdGlvbl9wb29scyBDb25maWdPcAQEVAGUAQwQTm9vcAAAAAxTZXQEAJQBBFQAAQAYUmVtb3ZlAAIAAJkECFxwYWxsZXRfbm9taW5hdGlvbl9wb29scyBDb25maWdPcAQEVAEAAQwQTm9vcAAAAAxTZXQEAAABBFQAAQAYUmVtb3ZlAAIAAJ0ECFxwYWxsZXRfbm9taW5hdGlvbl9wb29sczxDbGFpbVBlcm1pc3Npb24AARAwUGVybWlzc2lvbmVkAAAAWFBlcm1pc3Npb25sZXNzQ29tcG91bmQAAQBYUGVybWlzc2lvbmxlc3NXaXRoZHJhdwACAERQZXJtaXNzaW9ubGVzc0FsbAADAAChBAQYT3B0aW9uBARUAaUEAQgQTm9uZQAAABBTb21lBAClBAAAAQAApQQAAAQIlAAAqQQIXHBhbGxldF9ub21pbmF0aW9uX3Bvb2xzUENvbW1pc3Npb25DaGFuZ2VSYXRlBCxCbG9ja051bWJlcgEQAAgBMG1heF9pbmNyZWFzZZQBHFBlcmJpbGwAASRtaW5fZGVsYXkQASxCbG9ja051bWJlcgAArQQEGE9wdGlvbgQEVAGxBAEIEE5vbmUAAAAQU29tZQQAsQQAAAEAALEECFxwYWxsZXRfbm9taW5hdGlvbl9wb29sc2RDb21taXNzaW9uQ2xhaW1QZXJtaXNzaW9uBCRBY2NvdW50SWQBAAEIOFBlcm1pc3Npb25sZXNzAAAAHEFjY291bnQEAAABJEFjY291bnRJZAABAAC1BAxMcGFsbGV0X2Zhc3RfdW5zdGFrZRhwYWxsZXQQQ2FsbAQEVAABDFRyZWdpc3Rlcl9mYXN0X3Vuc3Rha2UAAGiIUmVnaXN0ZXIgb25lc2VsZiBmb3IgZmFzdC11bnN0YWtlLgBIIyMgRGlzcGF0Y2ggT3JpZ2luAEUBVGhlIGRpc3BhdGNoIG9yaWdpbiBvZiB0aGlzIGNhbGwgbXVzdCBiZSAqc2lnbmVkKiBieSB3aG9ldmVyIGlzIHBlcm1pdHRlZCB0byBjYWxs8HVuYm9uZCBmdW5kcyBieSB0aGUgc3Rha2luZyBzeXN0ZW0uIFNlZSBbYENvbmZpZzo6U3Rha2luZ2BdLgAoIyMgRGV0YWlscwA5AVRoZSBzdGFzaCBhc3NvY2lhdGVkIHdpdGggdGhlIG9yaWdpbiBtdXN0IGhhdmUgbm8gb25nb2luZyB1bmxvY2tpbmcgY2h1bmtzLiBJZl0Bc3VjY2Vzc2Z1bCwgdGhpcyB3aWxsIGZ1bGx5IHVuYm9uZCBhbmQgY2hpbGwgdGhlIHN0YXNoLiBUaGVuLCBpdCB3aWxsIGVucXVldWUgdGhlIHN0YXNogHRvIGJlIGNoZWNrZWQgaW4gZnVydGhlciBibG9ja3MuAFEBSWYgYnkgdGhlIHRpbWUgdGhpcyBpcyBjYWxsZWQsIHRoZSBzdGFzaCBpcyBhY3R1YWxseSBlbGlnaWJsZSBmb3IgZmFzdC11bnN0YWtlLCB0aGVuRQF0aGV5IGFyZSBndWFyYW50ZWVkIHRvIHJlbWFpbiBlbGlnaWJsZSwgYmVjYXVzZSB0aGUgY2FsbCB3aWxsIGNoaWxsIHRoZW0gYXMgd2VsbC4APQFJZiB0aGUgY2hlY2sgd29ya3MsIHRoZSBlbnRpcmUgc3Rha2luZyBkYXRhIGlzIHJlbW92ZWQsIGkuZS4gdGhlIHN0YXNoIGlzIGZ1bGx5JHVuc3Rha2VkLgBdAUlmIHRoZSBjaGVjayBmYWlscywgdGhlIHN0YXNoIHJlbWFpbnMgY2hpbGxlZCBhbmQgd2FpdGluZyBmb3IgYmVpbmcgdW5ib25kZWQgYXMgaW4gd2l0aGEBdGhlIG5vcm1hbCBzdGFraW5nIHN5c3RlbSwgYnV0IHRoZXkgbG9zZSBwYXJ0IG9mIHRoZWlyIHVuYm9uZGluZyBjaHVua3MgZHVlIHRvIGNvbnN1bWluZ1h0aGUgY2hhaW4ncyByZXNvdXJjZXMuACQjIyBFdmVudHMACQFTb21lIGV2ZW50cyBmcm9tIHRoZSBzdGFraW5nIGFuZCBjdXJyZW5jeSBzeXN0ZW0gbWlnaHQgYmUgZW1pdHRlZC4oZGVyZWdpc3RlcgABSKREZXJlZ2lzdGVyIG9uZXNlbGYgZnJvbSB0aGUgZmFzdC11bnN0YWtlLgBIIyMgRGlzcGF0Y2ggT3JpZ2luAEUBVGhlIGRpc3BhdGNoIG9yaWdpbiBvZiB0aGlzIGNhbGwgbXVzdCBiZSAqc2lnbmVkKiBieSB3aG9ldmVyIGlzIHBlcm1pdHRlZCB0byBjYWxs8HVuYm9uZCBmdW5kcyBieSB0aGUgc3Rha2luZyBzeXN0ZW0uIFNlZSBbYENvbmZpZzo6U3Rha2luZ2BdLgAoIyMgRGV0YWlscwBhAVRoaXMgaXMgdXNlZnVsIGlmIG9uZSBpcyByZWdpc3RlcmVkLCB0aGV5IGFyZSBzdGlsbCB3YWl0aW5nLCBhbmQgdGhleSBjaGFuZ2UgdGhlaXIgbWluZC4AWQFOb3RlIHRoYXQgdGhlIGFzc29jaWF0ZWQgc3Rhc2ggaXMgc3RpbGwgZnVsbHkgdW5ib25kZWQgYW5kIGNoaWxsZWQgYXMgYSBjb25zZXF1ZW5jZSBvZlkBY2FsbGluZyBbYFBhbGxldDo6cmVnaXN0ZXJfZmFzdF91bnN0YWtlYF0uIFRoZXJlZm9yZSwgdGhpcyBzaG91bGQgcHJvYmFibHkgYmUgZm9sbG93ZWSwYnkgYSBjYWxsIHRvIGByZWJvbmRgIGluIHRoZSBzdGFraW5nIHN5c3RlbS4AJCMjIEV2ZW50cwAJAVNvbWUgZXZlbnRzIGZyb20gdGhlIHN0YWtpbmcgYW5kIGN1cnJlbmN5IHN5c3RlbSBtaWdodCBiZSBlbWl0dGVkLhxjb250cm9sBAE0ZXJhc190b19jaGVjaxABIEVyYUluZGV4AAI0lENvbnRyb2wgdGhlIG9wZXJhdGlvbiBvZiB0aGlzIHBhbGxldC4ASCMjIERpc3BhdGNoIE9yaWdpbgANAVRoZSBkaXNwYXRjaCBvcmlnaW4gb2YgdGhpcyBjYWxsIG11c3QgYmUgW2BDb25maWc6OkNvbnRyb2xPcmlnaW5gXS4AKCMjIERldGFpbHMAQQFDYW4gc2V0IHRoZSBudW1iZXIgb2YgZXJhcyB0byBjaGVjayBwZXIgYmxvY2ssIGFuZCBwb3RlbnRpYWxseSBvdGhlciBhZG1pbiB3b3JrLgAkIyMgRXZlbnRzAKRObyBldmVudHMgYXJlIGVtaXR0ZWQgZnJvbSB0aGlzIGRpc3BhdGNoLgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy65BBBscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zNGNvbmZpZ3VyYXRpb24YcGFsbGV0EENhbGwEBFQAAcB8c2V0X3ZhbGlkYXRpb25fdXBncmFkZV9jb29sZG93bgQBDG5ldxABREJsb2NrTnVtYmVyRm9yPFQ+AAAEkFNldCB0aGUgdmFsaWRhdGlvbiB1cGdyYWRlIGNvb2xkb3duLnBzZXRfdmFsaWRhdGlvbl91cGdyYWRlX2RlbGF5BAEMbmV3EAFEQmxvY2tOdW1iZXJGb3I8VD4AAQSEU2V0IHRoZSB2YWxpZGF0aW9uIHVwZ3JhZGUgZGVsYXkuZHNldF9jb2RlX3JldGVudGlvbl9wZXJpb2QEAQxuZXcQAURCbG9ja051bWJlckZvcjxUPgACBNBTZXQgdGhlIGFjY2VwdGFuY2UgcGVyaW9kIGZvciBhbiBpbmNsdWRlZCBjYW5kaWRhdGUuRHNldF9tYXhfY29kZV9zaXplBAEMbmV3EAEMdTMyAAME3FNldCB0aGUgbWF4IHZhbGlkYXRpb24gY29kZSBzaXplIGZvciBpbmNvbWluZyB1cGdyYWRlcy5Ac2V0X21heF9wb3Zfc2l6ZQQBDG5ldxABDHUzMgAEBMRTZXQgdGhlIG1heCBQT1YgYmxvY2sgc2l6ZSBmb3IgaW5jb21pbmcgdXBncmFkZXMuWHNldF9tYXhfaGVhZF9kYXRhX3NpemUEAQxuZXcQAQx1MzIABQSUU2V0IHRoZSBtYXggaGVhZCBkYXRhIHNpemUgZm9yIHBhcmFzLkhzZXRfY29yZXRpbWVfY29yZXMEAQxuZXcQAQx1MzIABhCsU2V0IHRoZSBudW1iZXIgb2YgY29yZXRpbWUgZXhlY3V0aW9uIGNvcmVzLgBRAU5PVEU6IHRoYXQgdGhpcyBjb25maWd1cmF0aW9uIGlzIG1hbmFnZWQgYnkgdGhlIGNvcmV0aW1lIGNoYWluLiBPbmx5IG1hbnVhbGx5IGNoYW5nZbB0aGlzLCBpZiB5b3UgcmVhbGx5IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nIXRzZXRfbWF4X2F2YWlsYWJpbGl0eV90aW1lb3V0cwQBDG5ldxABDHUzMgAHBEEBU2V0IHRoZSBtYXggbnVtYmVyIG9mIHRpbWVzIGEgY2xhaW0gbWF5IHRpbWVvdXQgb24gYSBjb3JlIGJlZm9yZSBpdCBpcyBhYmFuZG9uZWRwc2V0X2dyb3VwX3JvdGF0aW9uX2ZyZXF1ZW5jeQQBDG5ldxABREJsb2NrTnVtYmVyRm9yPFQ+AAgE0FNldCB0aGUgcGFyYWNoYWluIHZhbGlkYXRvci1ncm91cCByb3RhdGlvbiBmcmVxdWVuY3l0c2V0X3BhcmFzX2F2YWlsYWJpbGl0eV9wZXJpb2QEAQxuZXcQAURCbG9ja051bWJlckZvcjxUPgAJBJhTZXQgdGhlIGF2YWlsYWJpbGl0eSBwZXJpb2QgZm9yIHBhcmFzLmBzZXRfc2NoZWR1bGluZ19sb29rYWhlYWQEAQxuZXcQAQx1MzIACwQ5AVNldCB0aGUgc2NoZWR1bGluZyBsb29rYWhlYWQsIGluIGV4cGVjdGVkIG51bWJlciBvZiBibG9ja3MgYXQgcGVhayB0aHJvdWdocHV0LmxzZXRfbWF4X3ZhbGlkYXRvcnNfcGVyX2NvcmUEAQxuZXc9AgEsT3B0aW9uPHUzMj4ADATsU2V0IHRoZSBtYXhpbXVtIG51bWJlciBvZiB2YWxpZGF0b3JzIHRvIGFzc2lnbiB0byBhbnkgY29yZS5Ic2V0X21heF92YWxpZGF0b3JzBAEMbmV3PQIBLE9wdGlvbjx1MzI+AA0EDQFTZXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIHZhbGlkYXRvcnMgdG8gdXNlIGluIHBhcmFjaGFpbiBjb25zZW5zdXMuSHNldF9kaXNwdXRlX3BlcmlvZAQBDG5ldxABMFNlc3Npb25JbmRleAAOBA0BU2V0IHRoZSBkaXNwdXRlIHBlcmlvZCwgaW4gbnVtYmVyIG9mIHNlc3Npb25zIHRvIGtlZXAgZm9yIGRpc3B1dGVzLrRzZXRfZGlzcHV0ZV9wb3N0X2NvbmNsdXNpb25fYWNjZXB0YW5jZV9wZXJpb2QEAQxuZXcQAURCbG9ja051bWJlckZvcjxUPgAPBMhTZXQgdGhlIGRpc3B1dGUgcG9zdCBjb25jbHVzaW9uIGFjY2VwdGFuY2UgcGVyaW9kLkRzZXRfbm9fc2hvd19zbG90cwQBDG5ldxABDHUzMgASCPhTZXQgdGhlIG5vIHNob3cgc2xvdHMsIGluIG51bWJlciBvZiBudW1iZXIgb2YgY29uc2Vuc3VzIHNsb3RzLkxNdXN0IGJlIGF0IGxlYXN0IDEuUHNldF9uX2RlbGF5X3RyYW5jaGVzBAEMbmV3EAEMdTMyABMEnFNldCB0aGUgdG90YWwgbnVtYmVyIG9mIGRlbGF5IHRyYW5jaGVzLnhzZXRfemVyb3RoX2RlbGF5X3RyYW5jaGVfd2lkdGgEAQxuZXcQAQx1MzIAFASMU2V0IHRoZSB6ZXJvdGggZGVsYXkgdHJhbmNoZSB3aWR0aC5Qc2V0X25lZWRlZF9hcHByb3ZhbHMEAQxuZXcQAQx1MzIAFQTcU2V0IHRoZSBudW1iZXIgb2YgdmFsaWRhdG9ycyBuZWVkZWQgdG8gYXBwcm92ZSBhIGJsb2NrLnBzZXRfcmVsYXlfdnJmX21vZHVsb19zYW1wbGVzBAEMbmV3EAEMdTMyABYEWQFTZXQgdGhlIG51bWJlciBvZiBzYW1wbGVzIHRvIGRvIG9mIHRoZSBgUmVsYXlWUkZNb2R1bG9gIGFwcHJvdmFsIGFzc2lnbm1lbnQgY3JpdGVyaW9uLmhzZXRfbWF4X3Vwd2FyZF9xdWV1ZV9jb3VudAQBDG5ldxABDHUzMgAXBC0BU2V0cyB0aGUgbWF4aW11bSBpdGVtcyB0aGF0IGNhbiBwcmVzZW50IGluIGEgdXB3YXJkIGRpc3BhdGNoIHF1ZXVlIGF0IG9uY2UuZHNldF9tYXhfdXB3YXJkX3F1ZXVlX3NpemUEAQxuZXcQAQx1MzIAGAhNAVNldHMgdGhlIG1heGltdW0gdG90YWwgc2l6ZSBvZiBpdGVtcyB0aGF0IGNhbiBwcmVzZW50IGluIGEgdXB3YXJkIGRpc3BhdGNoIHF1ZXVlIGF0FG9uY2UudHNldF9tYXhfZG93bndhcmRfbWVzc2FnZV9zaXplBAEMbmV3EAEMdTMyABkEnFNldCB0aGUgY3JpdGljYWwgZG93bndhcmQgbWVzc2FnZSBzaXplLmxzZXRfbWF4X3Vwd2FyZF9tZXNzYWdlX3NpemUEAQxuZXcQAQx1MzIAGwQtAVNldHMgdGhlIG1heGltdW0gc2l6ZSBvZiBhbiB1cHdhcmQgbWVzc2FnZSB0aGF0IGNhbiBiZSBzZW50IGJ5IGEgY2FuZGlkYXRlLqBzZXRfbWF4X3Vwd2FyZF9tZXNzYWdlX251bV9wZXJfY2FuZGlkYXRlBAEMbmV3EAEMdTMyABwEBQFTZXRzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBtZXNzYWdlcyB0aGF0IGEgY2FuZGlkYXRlIGNhbiBjb250YWluLmRzZXRfaHJtcF9vcGVuX3JlcXVlc3RfdHRsBAEMbmV3EAEMdTMyAB0ENQFTZXRzIHRoZSBudW1iZXIgb2Ygc2Vzc2lvbnMgYWZ0ZXIgd2hpY2ggYW4gSFJNUCBvcGVuIGNoYW5uZWwgcmVxdWVzdCBleHBpcmVzLlxzZXRfaHJtcF9zZW5kZXJfZGVwb3NpdAQBDG5ldxgBHEJhbGFuY2UAHgRRAVNldHMgdGhlIGFtb3VudCBvZiBmdW5kcyB0aGF0IHRoZSBzZW5kZXIgc2hvdWxkIHByb3ZpZGUgZm9yIG9wZW5pbmcgYW4gSFJNUCBjaGFubmVsLmhzZXRfaHJtcF9yZWNpcGllbnRfZGVwb3NpdAQBDG5ldxgBHEJhbGFuY2UAHwhhAVNldHMgdGhlIGFtb3VudCBvZiBmdW5kcyB0aGF0IHRoZSByZWNpcGllbnQgc2hvdWxkIHByb3ZpZGUgZm9yIGFjY2VwdGluZyBvcGVuaW5nIGFuIEhSTVAgY2hhbm5lbC50c2V0X2hybXBfY2hhbm5lbF9tYXhfY2FwYWNpdHkEAQxuZXcQAQx1MzIAIAQdAVNldHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIG1lc3NhZ2VzIGFsbG93ZWQgaW4gYW4gSFJNUCBjaGFubmVsIGF0IG9uY2UufHNldF9ocm1wX2NoYW5uZWxfbWF4X3RvdGFsX3NpemUEAQxuZXcQAQx1MzIAIQRRAVNldHMgdGhlIG1heGltdW0gdG90YWwgc2l6ZSBvZiBtZXNzYWdlcyBpbiBieXRlcyBhbGxvd2VkIGluIGFuIEhSTVAgY2hhbm5lbCBhdCBvbmNlLpxzZXRfaHJtcF9tYXhfcGFyYWNoYWluX2luYm91bmRfY2hhbm5lbHMEAQxuZXcQAQx1MzIAIgRJAVNldHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGluYm91bmQgSFJNUCBjaGFubmVscyBhIHBhcmFjaGFpbiBpcyBhbGxvd2VkIHRvIGFjY2VwdC6Ec2V0X2hybXBfY2hhbm5lbF9tYXhfbWVzc2FnZV9zaXplBAEMbmV3EAEMdTMyACQEPQFTZXRzIHRoZSBtYXhpbXVtIHNpemUgb2YgYSBtZXNzYWdlIHRoYXQgY291bGQgZXZlciBiZSBwdXQgaW50byBhbiBIUk1QIGNoYW5uZWwuoHNldF9ocm1wX21heF9wYXJhY2hhaW5fb3V0Ym91bmRfY2hhbm5lbHMEAQxuZXcQAQx1MzIAJQRFAVNldHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIG91dGJvdW5kIEhSTVAgY2hhbm5lbHMgYSBwYXJhY2hhaW4gaXMgYWxsb3dlZCB0byBvcGVuLphzZXRfaHJtcF9tYXhfbWVzc2FnZV9udW1fcGVyX2NhbmRpZGF0ZQQBDG5ldxABDHUzMgAnBDUBU2V0cyB0aGUgbWF4aW11bSBudW1iZXIgb2Ygb3V0Ym91bmQgSFJNUCBtZXNzYWdlcyBjYW4gYmUgc2VudCBieSBhIGNhbmRpZGF0ZS5Ic2V0X3B2Zl92b3RpbmdfdHRsBAEMbmV3EAEwU2Vzc2lvbkluZGV4ACoEUQFTZXQgdGhlIG51bWJlciBvZiBzZXNzaW9uIGNoYW5nZXMgYWZ0ZXIgd2hpY2ggYSBQVkYgcHJlLWNoZWNraW5nIHZvdGluZyBpcyByZWplY3RlZC6Qc2V0X21pbmltdW1fdmFsaWRhdGlvbl91cGdyYWRlX2RlbGF5BAEMbmV3EAFEQmxvY2tOdW1iZXJGb3I8VD4AKxBVAVNldHMgdGhlIG1pbmltdW0gZGVsYXkgYmV0d2VlbiBhbm5vdW5jaW5nIHRoZSB1cGdyYWRlIGJsb2NrIGZvciBhIHBhcmFjaGFpbiB1bnRpbCB0aGVUdXBncmFkZSB0YWtpbmcgcGxhY2UuADkBU2VlIHRoZSBmaWVsZCBkb2N1bWVudGF0aW9uIGZvciBpbmZvcm1hdGlvbiBhbmQgY29uc3RyYWludHMgZm9yIHRoZSBuZXcgdmFsdWUucHNldF9ieXBhc3NfY29uc2lzdGVuY3lfY2hlY2sEAQxuZXcgARBib29sACwITQFTZXR0aW5nIHRoaXMgdG8gdHJ1ZSB3aWxsIGRpc2FibGUgY29uc2lzdGVuY3kgY2hlY2tzIGZvciB0aGUgY29uZmlndXJhdGlvbiBzZXR0ZXJzLkRVc2Ugd2l0aCBjYXV0aW9uLmBzZXRfYXN5bmNfYmFja2luZ19wYXJhbXMEAQxuZXe9BAFIQXN5bmNCYWNraW5nUGFyYW1zAC0EoFNldCB0aGUgYXN5bmNocm9ub3VzIGJhY2tpbmcgcGFyYW1ldGVycy5Mc2V0X2V4ZWN1dG9yX3BhcmFtcwQBDG5ld8EEAThFeGVjdXRvclBhcmFtcwAuBHBTZXQgUFZGIGV4ZWN1dG9yIHBhcmFtZXRlcnMuWHNldF9vbl9kZW1hbmRfYmFzZV9mZWUEAQxuZXcYARxCYWxhbmNlAC8EpFNldCB0aGUgb24gZGVtYW5kIChwYXJhdGhyZWFkcykgYmFzZSBmZWUudHNldF9vbl9kZW1hbmRfZmVlX3ZhcmlhYmlsaXR5BAEMbmV3lAEcUGVyYmlsbAAwBMBTZXQgdGhlIG9uIGRlbWFuZCAocGFyYXRocmVhZHMpIGZlZSB2YXJpYWJpbGl0eS5wc2V0X29uX2RlbWFuZF9xdWV1ZV9tYXhfc2l6ZQQBDG5ldxABDHUzMgAxBLxTZXQgdGhlIG9uIGRlbWFuZCAocGFyYXRocmVhZHMpIHF1ZXVlIG1heCBzaXplLphzZXRfb25fZGVtYW5kX3RhcmdldF9xdWV1ZV91dGlsaXphdGlvbgQBDG5ld5QBHFBlcmJpbGwAMgTAU2V0IHRoZSBvbiBkZW1hbmQgKHBhcmF0aHJlYWRzKSBmZWUgdmFyaWFiaWxpdHkuRHNldF9vbl9kZW1hbmRfdHRsBAEMbmV3EAFEQmxvY2tOdW1iZXJGb3I8VD4AMwTYU2V0IHRoZSBvbiBkZW1hbmQgKHBhcmF0aHJlYWRzKSB0dGwgaW4gdGhlIGNsYWltcXVldWUuZHNldF9taW5pbXVtX2JhY2tpbmdfdm90ZXMEAQxuZXcQAQx1MzIANASgU2V0IHRoZSBtaW5pbXVtIGJhY2tpbmcgdm90ZXMgdGhyZXNob2xkLkBzZXRfbm9kZV9mZWF0dXJlCAEUaW5kZXgIAQh1OAABFHZhbHVlIAEQYm9vbAA1BGRTZXQvVW5zZXQgYSBub2RlIGZlYXR1cmUuaHNldF9hcHByb3ZhbF92b3RpbmdfcGFyYW1zBAEMbmV31QQBUEFwcHJvdmFsVm90aW5nUGFyYW1zADYEbFNldCBhcHByb3ZhbC12b3RpbmctcGFyYW1zLlBzZXRfc2NoZWR1bGVyX3BhcmFtcwQBDG5ld9kEAYhTY2hlZHVsZXJQYXJhbXM8QmxvY2tOdW1iZXJGb3I8VD4+ADcEVFNldCBzY2hlZHVsZXItcGFyYW1zLgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy69BBBMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2NzRhc3luY19iYWNraW5nSEFzeW5jQmFja2luZ1BhcmFtcwAACAFMbWF4X2NhbmRpZGF0ZV9kZXB0aBABDHUzMgABUGFsbG93ZWRfYW5jZXN0cnlfbGVuEAEMdTMyAADBBBBMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2NzxleGVjdXRvcl9wYXJhbXM4RXhlY3V0b3JQYXJhbXMAAAQAxQQBSFZlYzxFeGVjdXRvclBhcmFtPgAAxQQAAALJBADJBBBMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2NzxleGVjdXRvcl9wYXJhbXM0RXhlY3V0b3JQYXJhbQABHDhNYXhNZW1vcnlQYWdlcwQAEAEMdTMyAAEAPFN0YWNrTG9naWNhbE1heAQAEAEMdTMyAAIAOFN0YWNrTmF0aXZlTWF4BAAQAQx1MzIAAwBQUHJlY2hlY2tpbmdNYXhNZW1vcnkEADABDHU2NAAEADhQdmZQcmVwVGltZW91dAgAzQQBLFB2ZlByZXBLaW5kAAAwAQx1NjQABQA4UHZmRXhlY1RpbWVvdXQIANEEASxQdmZFeGVjS2luZAAAMAEMdTY0AAYARFdhc21FeHRCdWxrTWVtb3J5AAcAAM0EDExwb2xrYWRvdF9wcmltaXRpdmVzCHY3LFB2ZlByZXBLaW5kAAEIIFByZWNoZWNrAAAAHFByZXBhcmUAAQAA0QQMTHBvbGthZG90X3ByaW1pdGl2ZXMIdjcsUHZmRXhlY0tpbmQAAQgcQmFja2luZwAAACBBcHByb3ZhbAABAADVBAxMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2N1BBcHByb3ZhbFZvdGluZ1BhcmFtcwAABAFsbWF4X2FwcHJvdmFsX2NvYWxlc2NlX2NvdW50EAEMdTMyAADZBAxMcG9sa2Fkb3RfcHJpbWl0aXZlcyB2c3RhZ2luZzxTY2hlZHVsZXJQYXJhbXMELEJsb2NrTnVtYmVyARAALAFgZ3JvdXBfcm90YXRpb25fZnJlcXVlbmN5EAEsQmxvY2tOdW1iZXIAAWRwYXJhc19hdmFpbGFiaWxpdHlfcGVyaW9kEAEsQmxvY2tOdW1iZXIAAVxtYXhfdmFsaWRhdG9yc19wZXJfY29yZT0CASxPcHRpb248dTMyPgABJGxvb2thaGVhZBABDHUzMgABJG51bV9jb3JlcxABDHUzMgABZG1heF9hdmFpbGFiaWxpdHlfdGltZW91dHMQAQx1MzIAAWBvbl9kZW1hbmRfcXVldWVfbWF4X3NpemUQAQx1MzIAAYhvbl9kZW1hbmRfdGFyZ2V0X3F1ZXVlX3V0aWxpemF0aW9ulAEcUGVyYmlsbAABZG9uX2RlbWFuZF9mZWVfdmFyaWFiaWxpdHmUARxQZXJiaWxsAAFIb25fZGVtYW5kX2Jhc2VfZmVlGAEcQmFsYW5jZQABDHR0bBABLEJsb2NrTnVtYmVyAADdBBBscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zGHNoYXJlZBhwYWxsZXQQQ2FsbAQEVAABAAQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy7hBBBscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zJGluY2x1c2lvbhhwYWxsZXQQQ2FsbAQEVAABAAQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy7lBBBscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zOHBhcmFzX2luaGVyZW50GHBhbGxldBBDYWxsBARUAAEEFGVudGVyBAEQZGF0YekEAZBQYXJhY2hhaW5zSW5oZXJlbnREYXRhPEhlYWRlckZvcjxUPj4AAAQxAUVudGVyIHRoZSBwYXJhcyBpbmhlcmVudC4gVGhpcyB3aWxsIHByb2Nlc3MgYml0ZmllbGRzIGFuZCBiYWNrZWQgY2FuZGlkYXRlcy4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMu6QQMTHBvbGthZG90X3ByaW1pdGl2ZXMIdjcwSW5oZXJlbnREYXRhBAxIRFIBeQEAEAEkYml0ZmllbGRz7QQBkFVuY2hlY2tlZFNpZ25lZEF2YWlsYWJpbGl0eUJpdGZpZWxkcwABRGJhY2tlZF9jYW5kaWRhdGVzCQUBfFZlYzxCYWNrZWRDYW5kaWRhdGU8SERSOjpIYXNoPj4AASBkaXNwdXRlc00FAWBNdWx0aURpc3B1dGVTdGF0ZW1lbnRTZXQAATRwYXJlbnRfaGVhZGVyeQEBDEhEUgAA7QQAAALxBADxBBBMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2NxhzaWduZWQ8VW5jaGVja2VkU2lnbmVkCBxQYXlsb2FkAfUELFJlYWxQYXlsb2FkAfUEAAwBHHBheWxvYWT1BAEcUGF5bG9hZAABPHZhbGlkYXRvcl9pbmRleAEFAThWYWxpZGF0b3JJbmRleAABJHNpZ25hdHVyZQUFAUhWYWxpZGF0b3JTaWduYXR1cmUAAPUEDExwb2xrYWRvdF9wcmltaXRpdmVzCHY3UEF2YWlsYWJpbGl0eUJpdGZpZWxkAAAEAPkEAXxCaXRWZWM8dTgsIGJpdHZlYzo6b3JkZXI6OkxzYjA+AAD5BAAABwj9BAD9BAwYYml0dmVjFG9yZGVyEExzYjAAAAAAAQUMTHBvbGthZG90X3ByaW1pdGl2ZXMIdjc4VmFsaWRhdG9ySW5kZXgAAAQAEAEMdTMyAAAFBRBMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2NzR2YWxpZGF0b3JfYXBwJFNpZ25hdHVyZQAABAAlAgFIc3IyNTUxOTo6U2lnbmF0dXJlAAAJBQAAAg0FAA0FDExwb2xrYWRvdF9wcmltaXRpdmVzCHY3PEJhY2tlZENhbmRpZGF0ZQQESAE0AAwBJGNhbmRpZGF0ZREFAXBDb21taXR0ZWRDYW5kaWRhdGVSZWNlaXB0PEg+AAE4dmFsaWRpdHlfdm90ZXNFBQFgVmVjPFZhbGlkaXR5QXR0ZXN0YXRpb24+AAFEdmFsaWRhdG9yX2luZGljZXP5BAF8Qml0VmVjPHU4LCBiaXR2ZWM6Om9yZGVyOjpMc2IwPgAAEQUMTHBvbGthZG90X3ByaW1pdGl2ZXMIdjdkQ29tbWl0dGVkQ2FuZGlkYXRlUmVjZWlwdAQESAE0AAgBKGRlc2NyaXB0b3IVBQFYQ2FuZGlkYXRlRGVzY3JpcHRvcjxIPgABLGNvbW1pdG1lbnRzJQUBUENhbmRpZGF0ZUNvbW1pdG1lbnRzAAAVBQxMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2N0xDYW5kaWRhdGVEZXNjcmlwdG9yBARIATQAJAEccGFyYV9pZGkCAQhJZAABMHJlbGF5X3BhcmVudDQBBEgAASBjb2xsYXRvchkFAShDb2xsYXRvcklkAAF4cGVyc2lzdGVkX3ZhbGlkYXRpb25fZGF0YV9oYXNoNAEQSGFzaAABIHBvdl9oYXNoNAEQSGFzaAABMGVyYXN1cmVfcm9vdDQBEEhhc2gAASRzaWduYXR1cmUdBQFEQ29sbGF0b3JTaWduYXR1cmUAASRwYXJhX2hlYWQ0ARBIYXNoAAFQdmFsaWRhdGlvbl9jb2RlX2hhc2ghBQFIVmFsaWRhdGlvbkNvZGVIYXNoAAAZBRBMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2NzBjb2xsYXRvcl9hcHAYUHVibGljAAAEAAQBPHNyMjU1MTk6OlB1YmxpYwAAHQUQTHBvbGthZG90X3ByaW1pdGl2ZXMIdjcwY29sbGF0b3JfYXBwJFNpZ25hdHVyZQAABAAlAgFIc3IyNTUxOTo6U2lnbmF0dXJlAAAhBQx0cG9sa2Fkb3RfcGFyYWNoYWluX3ByaW1pdGl2ZXMocHJpbWl0aXZlc0hWYWxpZGF0aW9uQ29kZUhhc2gAAAQANAEQSGFzaAAAJQUMTHBvbGthZG90X3ByaW1pdGl2ZXMIdjdQQ2FuZGlkYXRlQ29tbWl0bWVudHMEBE4BEAAYATx1cHdhcmRfbWVzc2FnZXMpBQE4VXB3YXJkTWVzc2FnZXMAAUxob3Jpem9udGFsX21lc3NhZ2VzLQUBSEhvcml6b250YWxNZXNzYWdlcwABTG5ld192YWxpZGF0aW9uX2NvZGU5BQFYT3B0aW9uPFZhbGlkYXRpb25Db2RlPgABJGhlYWRfZGF0YUEFASBIZWFkRGF0YQABbHByb2Nlc3NlZF9kb3dud2FyZF9tZXNzYWdlcxABDHUzMgABOGhybXBfd2F0ZXJtYXJrEAEETgAAKQUMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAE4BFMAAAQAbQEBGFZlYzxUPgAALQUMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAExBQRTAAAEADUFARhWZWM8VD4AADEFCGBwb2xrYWRvdF9jb3JlX3ByaW1pdGl2ZXNMT3V0Ym91bmRIcm1wTWVzc2FnZQQISWQBaQIACAEkcmVjaXBpZW50aQIBCElkAAEQZGF0YTgBUHNwX3N0ZDo6dmVjOjpWZWM8dTg+AAA1BQAAAjEFADkFBBhPcHRpb24EBFQBPQUBCBBOb25lAAAAEFNvbWUEAD0FAAABAAA9BQx0cG9sa2Fkb3RfcGFyYWNoYWluX3ByaW1pdGl2ZXMocHJpbWl0aXZlczhWYWxpZGF0aW9uQ29kZQAABAA4ARxWZWM8dTg+AABBBQx0cG9sa2Fkb3RfcGFyYWNoYWluX3ByaW1pdGl2ZXMocHJpbWl0aXZlcyBIZWFkRGF0YQAABAA4ARxWZWM8dTg+AABFBQAAAkkFAEkFDExwb2xrYWRvdF9wcmltaXRpdmVzCHY3TFZhbGlkaXR5QXR0ZXN0YXRpb24AAQggSW1wbGljaXQEAAUFAUhWYWxpZGF0b3JTaWduYXR1cmUAAQAgRXhwbGljaXQEAAUFAUhWYWxpZGF0b3JTaWduYXR1cmUAAgAATQUAAAJRBQBRBQxMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2N0xEaXNwdXRlU3RhdGVtZW50U2V0AAAMAThjYW5kaWRhdGVfaGFzaFUFATRDYW5kaWRhdGVIYXNoAAEcc2Vzc2lvbhABMFNlc3Npb25JbmRleAABKHN0YXRlbWVudHNZBQHsVmVjPChEaXNwdXRlU3RhdGVtZW50LCBWYWxpZGF0b3JJbmRleCwgVmFsaWRhdG9yU2lnbmF0dXJlKT4AAFUFCGBwb2xrYWRvdF9jb3JlX3ByaW1pdGl2ZXM0Q2FuZGlkYXRlSGFzaAAABAA0ARBIYXNoAABZBQAAAl0FAF0FAAAEDGEFAQUFBQBhBQxMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2N0BEaXNwdXRlU3RhdGVtZW50AAEIFFZhbGlkBABlBQFkVmFsaWREaXNwdXRlU3RhdGVtZW50S2luZAAAABxJbnZhbGlkBABtBQFsSW52YWxpZERpc3B1dGVTdGF0ZW1lbnRLaW5kAAEAAGUFDExwb2xrYWRvdF9wcmltaXRpdmVzCHY3ZFZhbGlkRGlzcHV0ZVN0YXRlbWVudEtpbmQAARQgRXhwbGljaXQAAAA8QmFja2luZ1NlY29uZGVkBAA0ARBIYXNoAAEAMEJhY2tpbmdWYWxpZAQANAEQSGFzaAACAEBBcHByb3ZhbENoZWNraW5nAAMAiEFwcHJvdmFsQ2hlY2tpbmdNdWx0aXBsZUNhbmRpZGF0ZXMEAGkFAUhWZWM8Q2FuZGlkYXRlSGFzaD4ABAAAaQUAAAJVBQBtBQxMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2N2xJbnZhbGlkRGlzcHV0ZVN0YXRlbWVudEtpbmQAAQQgRXhwbGljaXQAAAAAcQUQbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucxRwYXJhcxhwYWxsZXQQQ2FsbAQEVAABJFhmb3JjZV9zZXRfY3VycmVudF9jb2RlCAEQcGFyYWkCARhQYXJhSWQAASBuZXdfY29kZT0FAThWYWxpZGF0aW9uQ29kZQAABPhTZXQgdGhlIHN0b3JhZ2UgZm9yIHRoZSBwYXJhY2hhaW4gdmFsaWRhdGlvbiBjb2RlIGltbWVkaWF0ZWx5Llhmb3JjZV9zZXRfY3VycmVudF9oZWFkCAEQcGFyYWkCARhQYXJhSWQAASBuZXdfaGVhZEEFASBIZWFkRGF0YQABBAEBU2V0IHRoZSBzdG9yYWdlIGZvciB0aGUgY3VycmVudCBwYXJhY2hhaW4gaGVhZCBkYXRhIGltbWVkaWF0ZWx5Lmxmb3JjZV9zY2hlZHVsZV9jb2RlX3VwZ3JhZGUMARBwYXJhaQIBGFBhcmFJZAABIG5ld19jb2RlPQUBOFZhbGlkYXRpb25Db2RlAAFMcmVsYXlfcGFyZW50X251bWJlchABREJsb2NrTnVtYmVyRm9yPFQ+AAIELQFTY2hlZHVsZSBhbiB1cGdyYWRlIGFzIGlmIGl0IHdhcyBzY2hlZHVsZWQgaW4gdGhlIGdpdmVuIHJlbGF5IHBhcmVudCBibG9jay5MZm9yY2Vfbm90ZV9uZXdfaGVhZAgBEHBhcmFpAgEYUGFyYUlkAAEgbmV3X2hlYWRBBQEgSGVhZERhdGEAAwQdAU5vdGUgYSBuZXcgYmxvY2sgaGVhZCBmb3IgcGFyYSB3aXRoaW4gdGhlIGNvbnRleHQgb2YgdGhlIGN1cnJlbnQgYmxvY2suSGZvcmNlX3F1ZXVlX2FjdGlvbgQBEHBhcmFpAgEYUGFyYUlkAAQM+FB1dCBhIHBhcmFjaGFpbiBkaXJlY3RseSBpbnRvIHRoZSBuZXh0IHNlc3Npb24ncyBhY3Rpb24gcXVldWUu9FdlIGNhbid0IHF1ZXVlIGl0IGFueSBzb29uZXIgdGhhbiB0aGlzIHdpdGhvdXQgZ29pbmcgaW50byB0aGU4aW5pdGlhbGl6ZXIuLi5sYWRkX3RydXN0ZWRfdmFsaWRhdGlvbl9jb2RlBAE8dmFsaWRhdGlvbl9jb2RlPQUBOFZhbGlkYXRpb25Db2RlAAU4oEFkZHMgdGhlIHZhbGlkYXRpb24gY29kZSB0byB0aGUgc3RvcmFnZS4AWQFUaGUgY29kZSB3aWxsIG5vdCBiZSBhZGRlZCBpZiBpdCBpcyBhbHJlYWR5IHByZXNlbnQuIEFkZGl0aW9uYWxseSwgaWYgUFZGIHByZS1jaGVja2luZ+BpcyBydW5uaW5nIGZvciB0aGF0IGNvZGUsIGl0IHdpbGwgYmUgaW5zdGFudGx5IGFjY2VwdGVkLgBRAU90aGVyd2lzZSwgdGhlIGNvZGUgd2lsbCBiZSBhZGRlZCBpbnRvIHRoZSBzdG9yYWdlLiBOb3RlIHRoYXQgdGhlIGNvZGUgd2lsbCBiZSBhZGRlZGEBaW50byBzdG9yYWdlIHdpdGggcmVmZXJlbmNlIGNvdW50IDAuIFRoaXMgaXMgdG8gYWNjb3VudCB0aGUgZmFjdCB0aGF0IHRoZXJlIGFyZSBubyB1c2Vyc00BZm9yIHRoaXMgY29kZSB5ZXQuIFRoZSBjYWxsZXIgd2lsbCBoYXZlIHRvIG1ha2Ugc3VyZSB0aGF0IHRoaXMgY29kZSBldmVudHVhbGx5IGdldHNJAXVzZWQgYnkgc29tZSBwYXJhY2hhaW4gb3IgcmVtb3ZlZCBmcm9tIHRoZSBzdG9yYWdlIHRvIGF2b2lkIHN0b3JhZ2UgbGVha3MuIEZvciB0aGVJAWxhdHRlciBwcmVmZXIgdG8gdXNlIHRoZSBgcG9rZV91bnVzZWRfdmFsaWRhdGlvbl9jb2RlYCBkaXNwYXRjaGFibGUgdG8gcmF3IHN0b3JhZ2U0bWFuaXB1bGF0aW9uLgBRAVRoaXMgZnVuY3Rpb24gaXMgbWFpbmx5IG1lYW50IHRvIGJlIHVzZWQgZm9yIHVwZ3JhZGluZyBwYXJhY2hhaW5zIHRoYXQgZG8gbm90IGZvbGxvdwkBdGhlIGdvLWFoZWFkIHNpZ25hbCB3aGlsZSB0aGUgUFZGIHByZS1jaGVja2luZyBmZWF0dXJlIGlzIGVuYWJsZWQubHBva2VfdW51c2VkX3ZhbGlkYXRpb25fY29kZQQBUHZhbGlkYXRpb25fY29kZV9oYXNoIQUBSFZhbGlkYXRpb25Db2RlSGFzaAAGFCUBUmVtb3ZlIHRoZSB2YWxpZGF0aW9uIGNvZGUgZnJvbSB0aGUgc3RvcmFnZSBpZmYgdGhlIHJlZmVyZW5jZSBjb3VudCBpcyAwLgBZAVRoaXMgaXMgYmV0dGVyIHRoYW4gcmVtb3ZpbmcgdGhlIHN0b3JhZ2UgZGlyZWN0bHksIGJlY2F1c2UgaXQgd2lsbCBub3QgcmVtb3ZlIHRoZSBjb2RlQQF0aGF0IHdhcyBzdWRkZW5seSBnb3QgdXNlZCBieSBzb21lIHBhcmFjaGFpbiB3aGlsZSB0aGlzIGRpc3BhdGNoYWJsZSB3YXMgcGVuZGluZzBkaXNwYXRjaGluZy5saW5jbHVkZV9wdmZfY2hlY2tfc3RhdGVtZW50CAEQc3RtdHUFAURQdmZDaGVja1N0YXRlbWVudAABJHNpZ25hdHVyZQUFAUhWYWxpZGF0b3JTaWduYXR1cmUABwhVAUluY2x1ZGVzIGEgc3RhdGVtZW50IGZvciBhIFBWRiBwcmUtY2hlY2tpbmcgdm90ZS4gUG90ZW50aWFsbHksIGZpbmFsaXplcyB0aGUgdm90ZSBhbmRBAWVuYWN0cyB0aGUgcmVzdWx0cyBpZiB0aGF0IHdhcyB0aGUgbGFzdCB2b3RlIGJlZm9yZSBhY2hpZXZpbmcgdGhlIHN1cGVybWFqb3JpdHkudGZvcmNlX3NldF9tb3N0X3JlY2VudF9jb250ZXh0CAEQcGFyYWkCARhQYXJhSWQAARxjb250ZXh0EAFEQmxvY2tOdW1iZXJGb3I8VD4ACAQBAVNldCB0aGUgc3RvcmFnZSBmb3IgdGhlIGN1cnJlbnQgcGFyYWNoYWluIGhlYWQgZGF0YSBpbW1lZGlhdGVseS4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMudQUMTHBvbGthZG90X3ByaW1pdGl2ZXMIdjdEUHZmQ2hlY2tTdGF0ZW1lbnQAABABGGFjY2VwdCABEGJvb2wAARxzdWJqZWN0IQUBSFZhbGlkYXRpb25Db2RlSGFzaAABNHNlc3Npb25faW5kZXgQATBTZXNzaW9uSW5kZXgAATx2YWxpZGF0b3JfaW5kZXgBBQE4VmFsaWRhdG9ySW5kZXgAAHkFEGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMsaW5pdGlhbGl6ZXIYcGFsbGV0EENhbGwEBFQAAQQ0Zm9yY2VfYXBwcm92ZQQBFHVwX3RvEAEsQmxvY2tOdW1iZXIAAAw5AUlzc3VlIGEgc2lnbmFsIHRvIHRoZSBjb25zZW5zdXMgZW5naW5lIHRvIGZvcmNpYmx5IGFjdCBhcyB0aG91Z2ggYWxsIHBhcmFjaGFpblEBYmxvY2tzIGluIGFsbCByZWxheSBjaGFpbiBibG9ja3MgdXAgdG8gYW5kIGluY2x1ZGluZyB0aGUgZ2l2ZW4gbnVtYmVyIGluIHRoZSBjdXJyZW50oGNoYWluIGFyZSB2YWxpZCBhbmQgc2hvdWxkIGJlIGZpbmFsaXplZC4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMufQUQbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucxBocm1wGHBhbGxldBBDYWxsBARUAAEsWGhybXBfaW5pdF9vcGVuX2NoYW5uZWwMASRyZWNpcGllbnRpAgEYUGFyYUlkAAFUcHJvcG9zZWRfbWF4X2NhcGFjaXR5EAEMdTMyAAFkcHJvcG9zZWRfbWF4X21lc3NhZ2Vfc2l6ZRABDHUzMgAAKE0BSW5pdGlhdGUgb3BlbmluZyBhIGNoYW5uZWwgZnJvbSBhIHBhcmFjaGFpbiB0byBhIGdpdmVuIHJlY2lwaWVudCB3aXRoIGdpdmVuIGNoYW5uZWwscGFyYW1ldGVycy4AWQEtIGBwcm9wb3NlZF9tYXhfY2FwYWNpdHlgIC0gc3BlY2lmaWVzIGhvdyBtYW55IG1lc3NhZ2VzIGNhbiBiZSBpbiB0aGUgY2hhbm5lbCBhdCBvbmNlLi0BLSBgcHJvcG9zZWRfbWF4X21lc3NhZ2Vfc2l6ZWAgLSBzcGVjaWZpZXMgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgbWVzc2FnZXMuABEBVGhlc2UgbnVtYmVycyBhcmUgYSBzdWJqZWN0IHRvIHRoZSByZWxheS1jaGFpbiBjb25maWd1cmF0aW9uIGxpbWl0cy4AUQFUaGUgY2hhbm5lbCBjYW4gYmUgb3BlbmVkIG9ubHkgYWZ0ZXIgdGhlIHJlY2lwaWVudCBjb25maXJtcyBpdCBhbmQgb25seSBvbiBhIHNlc3Npb24cY2hhbmdlLmBocm1wX2FjY2VwdF9vcGVuX2NoYW5uZWwEARhzZW5kZXJpAgEYUGFyYUlkAAEM8EFjY2VwdCBhIHBlbmRpbmcgb3BlbiBjaGFubmVsIHJlcXVlc3QgZnJvbSB0aGUgZ2l2ZW4gc2VuZGVyLgD0VGhlIGNoYW5uZWwgd2lsbCBiZSBvcGVuZWQgb25seSBvbiB0aGUgbmV4dCBzZXNzaW9uIGJvdW5kYXJ5Lkhocm1wX2Nsb3NlX2NoYW5uZWwEAShjaGFubmVsX2lkgQUBNEhybXBDaGFubmVsSWQAAhBVAUluaXRpYXRlIHVuaWxhdGVyYWwgY2xvc2luZyBvZiBhIGNoYW5uZWwuIFRoZSBvcmlnaW4gbXVzdCBiZSBlaXRoZXIgdGhlIHNlbmRlciBvciB0aGWYcmVjaXBpZW50IGluIHRoZSBjaGFubmVsIGJlaW5nIGNsb3NlZC4AwFRoZSBjbG9zdXJlIGNhbiBvbmx5IGhhcHBlbiBvbiBhIHNlc3Npb24gY2hhbmdlLkBmb3JjZV9jbGVhbl9ocm1wDAEQcGFyYWkCARhQYXJhSWQAASxudW1faW5ib3VuZBABDHUzMgABMG51bV9vdXRib3VuZBABDHUzMgADHF0BVGhpcyBleHRyaW5zaWMgdHJpZ2dlcnMgdGhlIGNsZWFudXAgb2YgYWxsIHRoZSBIUk1QIHN0b3JhZ2UgaXRlbXMgdGhhdCBhIHBhcmEgbWF5IGhhdmUuSQFOb3JtYWxseSB0aGlzIGhhcHBlbnMgb25jZSBwZXIgc2Vzc2lvbiwgYnV0IHRoaXMgYWxsb3dzIHlvdSB0byB0cmlnZ2VyIHRoZSBjbGVhbnVwlGltbWVkaWF0ZWx5IGZvciBhIHNwZWNpZmljIHBhcmFjaGFpbi4AUQFOdW1iZXIgb2YgaW5ib3VuZCBhbmQgb3V0Ym91bmQgY2hhbm5lbHMgZm9yIGBwYXJhYCBtdXN0IGJlIHByb3ZpZGVkIGFzIHdpdG5lc3MgZGF0YS4AkE9yaWdpbiBtdXN0IGJlIHRoZSBgQ2hhbm5lbE1hbmFnZXJgLlxmb3JjZV9wcm9jZXNzX2hybXBfb3BlbgQBIGNoYW5uZWxzEAEMdTMyAAQgpEZvcmNlIHByb2Nlc3MgSFJNUCBvcGVuIGNoYW5uZWwgcmVxdWVzdHMuAFUBSWYgdGhlcmUgYXJlIHBlbmRpbmcgSFJNUCBvcGVuIGNoYW5uZWwgcmVxdWVzdHMsIHlvdSBjYW4gdXNlIHRoaXMgZnVuY3Rpb24gdG8gcHJvY2Vzc4hhbGwgb2YgdGhvc2UgcmVxdWVzdHMgaW1tZWRpYXRlbHkuAAkBVG90YWwgbnVtYmVyIG9mIG9wZW5pbmcgY2hhbm5lbHMgbXVzdCBiZSBwcm92aWRlZCBhcyB3aXRuZXNzIGRhdGEuAJBPcmlnaW4gbXVzdCBiZSB0aGUgYENoYW5uZWxNYW5hZ2VyYC5gZm9yY2VfcHJvY2Vzc19ocm1wX2Nsb3NlBAEgY2hhbm5lbHMQAQx1MzIABSCoRm9yY2UgcHJvY2VzcyBIUk1QIGNsb3NlIGNoYW5uZWwgcmVxdWVzdHMuAFkBSWYgdGhlcmUgYXJlIHBlbmRpbmcgSFJNUCBjbG9zZSBjaGFubmVsIHJlcXVlc3RzLCB5b3UgY2FuIHVzZSB0aGlzIGZ1bmN0aW9uIHRvIHByb2Nlc3OIYWxsIG9mIHRob3NlIHJlcXVlc3RzIGltbWVkaWF0ZWx5LgAJAVRvdGFsIG51bWJlciBvZiBjbG9zaW5nIGNoYW5uZWxzIG11c3QgYmUgcHJvdmlkZWQgYXMgd2l0bmVzcyBkYXRhLgCQT3JpZ2luIG11c3QgYmUgdGhlIGBDaGFubmVsTWFuYWdlcmAuYGhybXBfY2FuY2VsX29wZW5fcmVxdWVzdAgBKGNoYW5uZWxfaWSBBQE0SHJtcENoYW5uZWxJZAABNG9wZW5fcmVxdWVzdHMQAQx1MzIABiBdAVRoaXMgY2FuY2VscyBhIHBlbmRpbmcgb3BlbiBjaGFubmVsIHJlcXVlc3QuIEl0IGNhbiBiZSBjYW5jZWxlZCBieSBlaXRoZXIgb2YgdGhlIHNlbmRlchkBb3IgdGhlIHJlY2lwaWVudCBmb3IgdGhhdCByZXF1ZXN0LiBUaGUgb3JpZ2luIG11c3QgYmUgZWl0aGVyIG9mIHRob3NlLgBdAVRoZSBjYW5jZWxsYXRpb24gaGFwcGVucyBpbW1lZGlhdGVseS4gSXQgaXMgbm90IHBvc3NpYmxlIHRvIGNhbmNlbCB0aGUgcmVxdWVzdCBpZiBpdCBpc0RhbHJlYWR5IGFjY2VwdGVkLgBZAVRvdGFsIG51bWJlciBvZiBvcGVuIHJlcXVlc3RzIChpLmUuIGBIcm1wT3BlbkNoYW5uZWxSZXF1ZXN0c0xpc3RgKSBtdXN0IGJlIHByb3ZpZGVkIGFzNHdpdG5lc3MgZGF0YS5cZm9yY2Vfb3Blbl9ocm1wX2NoYW5uZWwQARhzZW5kZXJpAgEYUGFyYUlkAAEkcmVjaXBpZW50aQIBGFBhcmFJZAABMG1heF9jYXBhY2l0eRABDHUzMgABQG1heF9tZXNzYWdlX3NpemUQAQx1MzIAByBhAU9wZW4gYSBjaGFubmVsIGZyb20gYSBgc2VuZGVyYCB0byBhIGByZWNpcGllbnRgIGBQYXJhSWRgLiBBbHRob3VnaCBvcGVuZWQgYnkgZ292ZXJuYW5jZSxBAXRoZSBgbWF4X2NhcGFjaXR5YCBhbmQgYG1heF9tZXNzYWdlX3NpemVgIGFyZSBzdGlsbCBzdWJqZWN0IHRvIHRoZSBSZWxheSBDaGFpbidzSGNvbmZpZ3VyZWQgbGltaXRzLgBNAUV4cGVjdGVkIHVzZSBpcyB3aGVuIG9uZSAoYW5kIG9ubHkgb25lKSBvZiB0aGUgYFBhcmFJZGBzIGludm9sdmVkIGluIHRoZSBjaGFubmVsIGlzwGdvdmVybmVkIGJ5IHRoZSBzeXN0ZW0sIGUuZy4gYSBzeXN0ZW0gcGFyYWNoYWluLgCQT3JpZ2luIG11c3QgYmUgdGhlIGBDaGFubmVsTWFuYWdlcmAuYGVzdGFibGlzaF9zeXN0ZW1fY2hhbm5lbAgBGHNlbmRlcmkCARhQYXJhSWQAASRyZWNpcGllbnRpAgEYUGFyYUlkAAgwUQFFc3RhYmxpc2ggYW4gSFJNUCBjaGFubmVsIGJldHdlZW4gdHdvIHN5c3RlbSBjaGFpbnMuIElmIHRoZSBjaGFubmVsIGRvZXMgbm90IGFscmVhZHlRAWV4aXN0LCB0aGUgdHJhbnNhY3Rpb24gZmVlcyB3aWxsIGJlIHJlZnVuZGVkIHRvIHRoZSBjYWxsZXIuIFRoZSBzeXN0ZW0gZG9lcyBub3QgdGFrZVkBZGVwb3NpdHMgZm9yIGNoYW5uZWxzIGJldHdlZW4gc3lzdGVtIGNoYWlucywgYW5kIGF1dG9tYXRpY2FsbHkgc2V0cyB0aGUgbWVzc2FnZSBudW1iZXIZAWFuZCBzaXplIGxpbWl0cyB0byB0aGUgbWF4aW11bSBhbGxvd2VkIGJ5IHRoZSBuZXR3b3JrJ3MgY29uZmlndXJhdGlvbi4AKEFyZ3VtZW50czoAlC0gYHNlbmRlcmA6IEEgc3lzdGVtIGNoYWluLCBgUGFyYUlkYC6gLSBgcmVjaXBpZW50YDogQSBzeXN0ZW0gY2hhaW4sIGBQYXJhSWRgLgBVAUFueSBzaWduZWQgb3JpZ2luIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24sIGJ1dCBfYm90aF8gaW5wdXRzIE1VU1QgYmUgc3lzdGVtIGNoYWlucy4gSWbAdGhlIGNoYW5uZWwgZG9lcyBub3QgZXhpc3QgeWV0LCB0aGVyZSBpcyBubyBmZWUuVHBva2VfY2hhbm5lbF9kZXBvc2l0cwgBGHNlbmRlcmkCARhQYXJhSWQAASRyZWNpcGllbnRpAgEYUGFyYUlkAAkkUQFVcGRhdGUgdGhlIGRlcG9zaXRzIGhlbGQgZm9yIGFuIEhSTVAgY2hhbm5lbCB0byB0aGUgbGF0ZXN0IGBDb25maWd1cmF0aW9uYC4gQ2hhbm5lbHOwd2l0aCBzeXN0ZW0gY2hhaW5zIGRvIG5vdCByZXF1aXJlIGEgZGVwb3NpdC4AKEFyZ3VtZW50czoAeC0gYHNlbmRlcmA6IEEgY2hhaW4sIGBQYXJhSWRgLoQtIGByZWNpcGllbnRgOiBBIGNoYWluLCBgUGFyYUlkYC4ApEFueSBzaWduZWQgb3JpZ2luIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24udGVzdGFibGlzaF9jaGFubmVsX3dpdGhfc3lzdGVtBAFMdGFyZ2V0X3N5c3RlbV9jaGFpbmkCARhQYXJhSWQAChw5AUVzdGFibGlzaCBhIGJpZGlyZWN0aW9uYWwgSFJNUCBjaGFubmVsIGJldHdlZW4gYSBwYXJhY2hhaW4gYW5kIGEgc3lzdGVtIGNoYWluLgAoQXJndW1lbnRzOgDILSBgdGFyZ2V0X3N5c3RlbV9jaGFpbmA6IEEgc3lzdGVtIGNoYWluLCBgUGFyYUlkYC4AsFRoZSBvcmlnaW4gbmVlZHMgdG8gYmUgdGhlIHBhcmFjaGFpbiBvcmlnaW4uBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLoEFDHRwb2xrYWRvdF9wYXJhY2hhaW5fcHJpbWl0aXZlcyhwcmltaXRpdmVzNEhybXBDaGFubmVsSWQAAAgBGHNlbmRlcmkCAQhJZAABJHJlY2lwaWVudGkCAQhJZAAAhQUQbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucyBkaXNwdXRlcxhwYWxsZXQQQ2FsbAQEVAABBDhmb3JjZV91bmZyZWV6ZQAAAAQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy6JBRRscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zIGRpc3B1dGVzIHNsYXNoaW5nGHBhbGxldBBDYWxsBARUAAEEcHJlcG9ydF9kaXNwdXRlX2xvc3RfdW5zaWduZWQIATRkaXNwdXRlX3Byb29mjQUBREJveDxEaXNwdXRlUHJvb2Y+AAE8a2V5X293bmVyX3Byb29mhQEBQFQ6OktleU93bmVyUHJvb2YAAAAEDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMujQUQTHBvbGthZG90X3ByaW1pdGl2ZXMIdjcgc2xhc2hpbmcwRGlzcHV0ZVByb29mAAAQASR0aW1lX3Nsb3SRBQFARGlzcHV0ZXNUaW1lU2xvdAABEGtpbmSVBQFMU2xhc2hpbmdPZmZlbmNlS2luZAABPHZhbGlkYXRvcl9pbmRleAEFAThWYWxpZGF0b3JJbmRleAABMHZhbGlkYXRvcl9pZPkBASxWYWxpZGF0b3JJZAAAkQUQTHBvbGthZG90X3ByaW1pdGl2ZXMIdjcgc2xhc2hpbmdARGlzcHV0ZXNUaW1lU2xvdAAACAE0c2Vzc2lvbl9pbmRleBABMFNlc3Npb25JbmRleAABOGNhbmRpZGF0ZV9oYXNoVQUBNENhbmRpZGF0ZUhhc2gAAJUFEExwb2xrYWRvdF9wcmltaXRpdmVzCHY3IHNsYXNoaW5nTFNsYXNoaW5nT2ZmZW5jZUtpbmQAAQgoRm9ySW52YWxpZAAAADBBZ2FpbnN0VmFsaWQAAQAAmQUQbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWluc0hhc3NpZ25lcl9vbl9kZW1hbmQYcGFsbGV0EENhbGwEBFQAAQhccGxhY2Vfb3JkZXJfYWxsb3dfZGVhdGgIAShtYXhfYW1vdW50GAEwQmFsYW5jZU9mPFQ+AAEccGFyYV9pZGkCARhQYXJhSWQAADyUQ3JlYXRlIGEgc2luZ2xlIG9uIGRlbWFuZCBjb3JlIG9yZGVyLkkBV2lsbCB1c2UgdGhlIHNwb3QgcHJpY2UgZm9yIHRoZSBjdXJyZW50IGJsb2NrIGFuZCB3aWxsIHJlYXAgdGhlIGFjY291bnQgaWYgbmVlZGVkLgAsUGFyYW1ldGVyczo5AS0gYG9yaWdpbmA6IFRoZSBzZW5kZXIgb2YgdGhlIGNhbGwsIGZ1bmRzIHdpbGwgYmUgd2l0aGRyYXduIGZyb20gdGhpcyBhY2NvdW50LkkBLSBgbWF4X2Ftb3VudGA6IFRoZSBtYXhpbXVtIGJhbGFuY2UgdG8gd2l0aGRyYXcgZnJvbSB0aGUgb3JpZ2luIHRvIHBsYWNlIGFuIG9yZGVyLg0BLSBgcGFyYV9pZGA6IEEgYFBhcmFJZGAgdGhlIG9yaWdpbiB3YW50cyB0byBwcm92aWRlIGJsb2Nrc3BhY2UgZm9yLgAcRXJyb3JzOuQtIGBJbnN1ZmZpY2llbnRCYWxhbmNlYDogZnJvbSB0aGUgQ3VycmVuY3kgaW1wbGVtZW50YXRpb240LSBgUXVldWVGdWxsYIAtIGBTcG90UHJpY2VIaWdoZXJUaGFuTWF4QW1vdW50YAAcRXZlbnRzOlwtIGBPbkRlbWFuZE9yZGVyUGxhY2VkYFhwbGFjZV9vcmRlcl9rZWVwX2FsaXZlCAEobWF4X2Ftb3VudBgBMEJhbGFuY2VPZjxUPgABHHBhcmFfaWRpAgEYUGFyYUlkAAE8YQFTYW1lIGFzIHRoZSBbYHBsYWNlX29yZGVyX2FsbG93X2RlYXRoYF0oU2VsZjo6cGxhY2Vfb3JkZXJfYWxsb3dfZGVhdGgpIGNhbGwgLCBidXQgd2l0aCBh3GNoZWNrIHRoYXQgcGxhY2luZyB0aGUgb3JkZXIgd2lsbCBub3QgcmVhcCB0aGUgYWNjb3VudC4ALFBhcmFtZXRlcnM6OQEtIGBvcmlnaW5gOiBUaGUgc2VuZGVyIG9mIHRoZSBjYWxsLCBmdW5kcyB3aWxsIGJlIHdpdGhkcmF3biBmcm9tIHRoaXMgYWNjb3VudC5JAS0gYG1heF9hbW91bnRgOiBUaGUgbWF4aW11bSBiYWxhbmNlIHRvIHdpdGhkcmF3IGZyb20gdGhlIG9yaWdpbiB0byBwbGFjZSBhbiBvcmRlci4NAS0gYHBhcmFfaWRgOiBBIGBQYXJhSWRgIHRoZSBvcmlnaW4gd2FudHMgdG8gcHJvdmlkZSBibG9ja3NwYWNlIGZvci4AHEVycm9yczrkLSBgSW5zdWZmaWNpZW50QmFsYW5jZWA6IGZyb20gdGhlIEN1cnJlbmN5IGltcGxlbWVudGF0aW9uNC0gYFF1ZXVlRnVsbGCALSBgU3BvdFByaWNlSGlnaGVyVGhhbk1heEFtb3VudGAAHEV2ZW50czpcLSBgT25EZW1hbmRPcmRlclBsYWNlZGAEDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMunQUQXHBvbGthZG90X3J1bnRpbWVfY29tbW9uPHBhcmFzX3JlZ2lzdHJhchhwYWxsZXQQQ2FsbAQEVAABJCByZWdpc3RlcgwBCGlkaQIBGFBhcmFJZAABMGdlbmVzaXNfaGVhZEEFASBIZWFkRGF0YQABPHZhbGlkYXRpb25fY29kZT0FAThWYWxpZGF0aW9uQ29kZQAAUPhSZWdpc3RlciBoZWFkIGRhdGEgYW5kIHZhbGlkYXRpb24gY29kZSBmb3IgYSByZXNlcnZlZCBQYXJhIElkLgAwIyMgQXJndW1lbnRzwC0gYG9yaWdpbmA6IE11c3QgYmUgY2FsbGVkIGJ5IGEgYFNpZ25lZGAgb3JpZ2luLi0BLSBgaWRgOiBUaGUgcGFyYSBJRC4gTXVzdCBiZSBvd25lZC9tYW5hZ2VkIGJ5IHRoZSBgb3JpZ2luYCBzaWduaW5nIGFjY291bnQuAQEtIGBnZW5lc2lzX2hlYWRgOiBUaGUgZ2VuZXNpcyBoZWFkIGRhdGEgb2YgdGhlIHBhcmFjaGFpbi90aHJlYWQuJQEtIGB2YWxpZGF0aW9uX2NvZGVgOiBUaGUgaW5pdGlhbCB2YWxpZGF0aW9uIGNvZGUgb2YgdGhlIHBhcmFjaGFpbi90aHJlYWQuAEAjIyBEZXBvc2l0cy9GZWVzCQFUaGUgYWNjb3VudCB3aXRoIHRoZSBvcmlnaW5hdGluZyBzaWduYXR1cmUgbXVzdCByZXNlcnZlIGEgZGVwb3NpdC4ATQFUaGUgZGVwb3NpdCBpcyByZXF1aXJlZCB0byBjb3ZlciB0aGUgY29zdHMgYXNzb2NpYXRlZCB3aXRoIHN0b3JpbmcgdGhlIGdlbmVzaXMgaGVhZHRkYXRhIGFuZCB0aGUgdmFsaWRhdGlvbiBjb2RlLjEBVGhpcyBhY2NvdW50cyBmb3IgdGhlIHBvdGVudGlhbCB0byBzdG9yZSB2YWxpZGF0aW9uIGNvZGUgb2YgYSBzaXplIHVwIHRvIHRoZdxgbWF4X2NvZGVfc2l6ZWAsIGFzIGRlZmluZWQgaW4gdGhlIGNvbmZpZ3VyYXRpb24gcGFsbGV0AB0BQW55dGhpbmcgYWxyZWFkeSByZXNlcnZlZCBwcmV2aW91c2x5IGZvciB0aGlzIHBhcmEgSUQgaXMgYWNjb3VudGVkIGZvci4AJCMjIEV2ZW50c9RUaGUgYFJlZ2lzdGVyZWRgIGV2ZW50IGlzIGVtaXR0ZWQgaW4gY2FzZSBvZiBzdWNjZXNzLjhmb3JjZV9yZWdpc3RlchQBDHdobwABMFQ6OkFjY291bnRJZAABHGRlcG9zaXQYATBCYWxhbmNlT2Y8VD4AAQhpZGkCARhQYXJhSWQAATBnZW5lc2lzX2hlYWRBBQEgSGVhZERhdGEAATx2YWxpZGF0aW9uX2NvZGU9BQE4VmFsaWRhdGlvbkNvZGUAARjcRm9yY2UgdGhlIHJlZ2lzdHJhdGlvbiBvZiBhIFBhcmEgSWQgb24gdGhlIHJlbGF5IGNoYWluLgC4VGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBieSBhIFJvb3Qgb3JpZ2luLgAZAVRoZSBkZXBvc2l0IHRha2VuIGNhbiBiZSBzcGVjaWZpZWQgZm9yIHRoaXMgcmVnaXN0cmF0aW9uLiBBbnkgYFBhcmFJZGAZAWNhbiBiZSByZWdpc3RlcmVkLCBpbmNsdWRpbmcgc3ViLTEwMDAgSURzIHdoaWNoIGFyZSBTeXN0ZW0gUGFyYWNoYWlucy4oZGVyZWdpc3RlcgQBCGlkaQIBGFBhcmFJZAACEAUBRGVyZWdpc3RlciBhIFBhcmEgSWQsIGZyZWVpbmcgYWxsIGRhdGEgYW5kIHJldHVybmluZyBhbnkgZGVwb3NpdC4AUQFUaGUgY2FsbGVyIG11c3QgYmUgUm9vdCwgdGhlIGBwYXJhYCBvd25lciwgb3IgdGhlIGBwYXJhYCBpdHNlbGYuIFRoZSBwYXJhIG11c3QgYmUgYW5Qb24tZGVtYW5kIHBhcmFjaGFpbi4Qc3dhcAgBCGlkaQIBGFBhcmFJZAABFG90aGVyaQIBGFBhcmFJZAADMEEBU3dhcCBhIGxlYXNlIGhvbGRpbmcgcGFyYWNoYWluIHdpdGggYW5vdGhlciBwYXJhY2hhaW4sIGVpdGhlciBvbi1kZW1hbmQgb3IgbGVhc2UgaG9sZGluZy4AAQFUaGUgb3JpZ2luIG11c3QgYmUgUm9vdCwgdGhlIGBwYXJhYCBvd25lciwgb3IgdGhlIGBwYXJhYCBpdHNlbGYuAGEBVGhlIHN3YXAgd2lsbCBoYXBwZW4gb25seSBpZiB0aGVyZSBpcyBhbHJlYWR5IGFuIG9wcG9zaXRlIHN3YXAgcGVuZGluZy4gSWYgdGhlcmUgaXMgbm90LFkBdGhlIHN3YXAgd2lsbCBiZSBzdG9yZWQgaW4gdGhlIHBlbmRpbmcgc3dhcHMgbWFwLCByZWFkeSBmb3IgYSBsYXRlciBjb25maXJtYXRvcnkgc3dhcC4AXQFUaGUgYFBhcmFJZGBzIHJlbWFpbiBtYXBwZWQgdG8gdGhlIHNhbWUgaGVhZCBkYXRhIGFuZCBjb2RlIHNvIGV4dGVybmFsIGNvZGUgY2FuIHJlbHkgb249AWBQYXJhSWRgIHRvIGJlIGEgbG9uZy10ZXJtIGlkZW50aWZpZXIgb2YgYSBub3Rpb25hbCAicGFyYWNoYWluIi4gSG93ZXZlciwgdGhlaXI1AXNjaGVkdWxpbmcgaW5mbyAoaS5lLiB3aGV0aGVyIHRoZXkncmUgYW4gb24tZGVtYW5kIHBhcmFjaGFpbiBvciBsZWFzZSBob2xkaW5nFQFwYXJhY2hhaW4pLCBhdWN0aW9uIGluZm9ybWF0aW9uIGFuZCB0aGUgYXVjdGlvbiBkZXBvc2l0IGFyZSBzd2l0Y2hlZC4scmVtb3ZlX2xvY2sEARBwYXJhaQIBGFBhcmFJZAAEEA0BUmVtb3ZlIGEgbWFuYWdlciBsb2NrIGZyb20gYSBwYXJhLiBUaGlzIHdpbGwgYWxsb3cgdGhlIG1hbmFnZXIgb2YgYTUBcHJldmlvdXNseSBsb2NrZWQgcGFyYSB0byBkZXJlZ2lzdGVyIG9yIHN3YXAgYSBwYXJhIHdpdGhvdXQgdXNpbmcgZ292ZXJuYW5jZS4A3ENhbiBvbmx5IGJlIGNhbGxlZCBieSB0aGUgUm9vdCBvcmlnaW4gb3IgdGhlIHBhcmFjaGFpbi4ccmVzZXJ2ZQAFRJRSZXNlcnZlIGEgUGFyYSBJZCBvbiB0aGUgcmVsYXkgY2hhaW4uAE0BVGhpcyBmdW5jdGlvbiB3aWxsIHJlc2VydmUgYSBuZXcgUGFyYSBJZCB0byBiZSBvd25lZC9tYW5hZ2VkIGJ5IHRoZSBvcmlnaW4gYWNjb3VudC5hAVRoZSBvcmlnaW4gYWNjb3VudCBpcyBhYmxlIHRvIHJlZ2lzdGVyIGhlYWQgZGF0YSBhbmQgdmFsaWRhdGlvbiBjb2RlIHVzaW5nIGByZWdpc3RlcmAgdG9ZAWNyZWF0ZSBhbiBvbi1kZW1hbmQgcGFyYWNoYWluLiBVc2luZyB0aGUgU2xvdHMgcGFsbGV0LCBhbiBvbi1kZW1hbmQgcGFyYWNoYWluIGNhbiB0aGVupGJlIHVwZ3JhZGVkIHRvIGEgbGVhc2UgaG9sZGluZyBwYXJhY2hhaW4uADAjIyBBcmd1bWVudHNVAS0gYG9yaWdpbmA6IE11c3QgYmUgY2FsbGVkIGJ5IGEgYFNpZ25lZGAgb3JpZ2luLiBCZWNvbWVzIHRoZSBtYW5hZ2VyL293bmVyIG9mIHRoZSBuZXcoICBwYXJhIElELgBAIyMgRGVwb3NpdHMvRmVlcyEBVGhlIG9yaWdpbiBtdXN0IHJlc2VydmUgYSBkZXBvc2l0IG9mIGBQYXJhRGVwb3NpdGAgZm9yIHRoZSByZWdpc3RyYXRpb24uACQjIyBFdmVudHNZAVRoZSBgUmVzZXJ2ZWRgIGV2ZW50IGlzIGVtaXR0ZWQgaW4gY2FzZSBvZiBzdWNjZXNzLCB3aGljaCBwcm92aWRlcyB0aGUgSUQgcmVzZXJ2ZWQgZm9yEHVzZS4gYWRkX2xvY2sEARBwYXJhaQIBGFBhcmFJZAAGFAkBQWRkIGEgbWFuYWdlciBsb2NrIGZyb20gYSBwYXJhLiBUaGlzIHdpbGwgcHJldmVudCB0aGUgbWFuYWdlciBvZiBhiHBhcmEgdG8gZGVyZWdpc3RlciBvciBzd2FwIGEgcGFyYS4ASQFDYW4gYmUgY2FsbGVkIGJ5IFJvb3QsIHRoZSBwYXJhY2hhaW4sIG9yIHRoZSBwYXJhY2hhaW4gbWFuYWdlciBpZiB0aGUgcGFyYWNoYWluIGlzJHVubG9ja2VkLlRzY2hlZHVsZV9jb2RlX3VwZ3JhZGUIARBwYXJhaQIBGFBhcmFJZAABIG5ld19jb2RlPQUBOFZhbGlkYXRpb25Db2RlAAcsdFNjaGVkdWxlIGEgcGFyYWNoYWluIHVwZ3JhZGUuAFUBVGhpcyB3aWxsIGtpY2sgb2ZmIGEgY2hlY2sgb2YgYG5ld19jb2RlYCBieSBhbGwgdmFsaWRhdG9ycy4gQWZ0ZXIgdGhlIG1ham9yaXR5IG9mIHRoZVUBdmFsaWRhdG9ycyBoYXZlIHJlcG9ydGVkIG9uIHRoZSB2YWxpZGl0eSBvZiB0aGUgY29kZSwgdGhlIGNvZGUgd2lsbCBlaXRoZXIgYmUgZW5hY3RlZFUBb3IgdGhlIHVwZ3JhZGUgd2lsbCBiZSByZWplY3RlZC4gSWYgdGhlIGNvZGUgd2lsbCBiZSBlbmFjdGVkLCB0aGUgY3VycmVudCBjb2RlIG9mIHRoZV0BcGFyYWNoYWluIHdpbGwgYmUgb3ZlcndyaXR0ZW4gZGlyZWN0bHkuIFRoaXMgbWVhbnMgdGhhdCBhbnkgUG9WIHdpbGwgYmUgY2hlY2tlZCBieSB0aGlzXQFuZXcgY29kZS4gVGhlIHBhcmFjaGFpbiBpdHNlbGYgd2lsbCBub3QgYmUgaW5mb3JtZWQgZXhwbGljaXRseSB0aGF0IHRoZSB2YWxpZGF0aW9uIGNvZGUwaGFzIGNoYW5nZWQuAEkBQ2FuIGJlIGNhbGxlZCBieSBSb290LCB0aGUgcGFyYWNoYWluLCBvciB0aGUgcGFyYWNoYWluIG1hbmFnZXIgaWYgdGhlIHBhcmFjaGFpbiBpcyR1bmxvY2tlZC5Ac2V0X2N1cnJlbnRfaGVhZAgBEHBhcmFpAgEYUGFyYUlkAAEgbmV3X2hlYWRBBQEgSGVhZERhdGEACBCEU2V0IHRoZSBwYXJhY2hhaW4ncyBjdXJyZW50IGhlYWQuAEkBQ2FuIGJlIGNhbGxlZCBieSBSb290LCB0aGUgcGFyYWNoYWluLCBvciB0aGUgcGFyYWNoYWluIG1hbmFnZXIgaWYgdGhlIHBhcmFjaGFpbiBpcyR1bmxvY2tlZC4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMuoQUQXHBvbGthZG90X3J1bnRpbWVfY29tbW9uFHNsb3RzGHBhbGxldBBDYWxsBARUAAEMLGZvcmNlX2xlYXNlFAEQcGFyYWkCARhQYXJhSWQAARhsZWFzZXIAATBUOjpBY2NvdW50SWQAARhhbW91bnQYATBCYWxhbmNlT2Y8VD4AATBwZXJpb2RfYmVnaW4QAUBMZWFzZVBlcmlvZE9mPFQ+AAEwcGVyaW9kX2NvdW50EAFATGVhc2VQZXJpb2RPZjxUPgAAEE0BSnVzdCBhIGNvbm5lY3QgaW50byB0aGUgYGxlYXNlX291dGAgY2FsbCwgaW4gY2FzZSBSb290IHdhbnRzIHRvIGZvcmNlIHNvbWUgbGVhc2UgdG/8aGFwcGVuIGluZGVwZW5kZW50bHkgb2YgYW55IG90aGVyIG9uLWNoYWluIG1lY2hhbmlzbSB0byB1c2UgaXQuAPhUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBtYXRjaCBgVDo6Rm9yY2VPcmlnaW5gLkBjbGVhcl9hbGxfbGVhc2VzBAEQcGFyYWkCARhQYXJhSWQAAQxNAUNsZWFyIGFsbCBsZWFzZXMgZm9yIGEgUGFyYSBJZCwgcmVmdW5kaW5nIGFueSBkZXBvc2l0cyBiYWNrIHRvIHRoZSBvcmlnaW5hbCBvd25lcnMuAPhUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBtYXRjaCBgVDo6Rm9yY2VPcmlnaW5gLjx0cmlnZ2VyX29uYm9hcmQEARBwYXJhaQIBGFBhcmFJZAACHCUBVHJ5IHRvIG9uYm9hcmQgYSBwYXJhY2hhaW4gdGhhdCBoYXMgYSBsZWFzZSBmb3IgdGhlIGN1cnJlbnQgbGVhc2UgcGVyaW9kLgBFAVRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWZ1bCBpZiB0aGVyZSB3YXMgc29tZSBzdGF0ZSBpc3N1ZSB3aXRoIGEgcGFyYSB0aGF0IHNob3VsZDkBaGF2ZSBvbmJvYXJkZWQsIGJ1dCB3YXMgdW5hYmxlIHRvLiBBcyBsb25nIGFzIHRoZXkgaGF2ZSBhIGxlYXNlIHBlcmlvZCwgd2UgY2FubGxldCB0aGVtIG9uYm9hcmQgZnJvbSBoZXJlLgDMT3JpZ2luIG11c3QgYmUgc2lnbmVkLCBidXQgY2FuIGJlIGNhbGxlZCBieSBhbnlvbmUuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLqUFEFxwb2xrYWRvdF9ydW50aW1lX2NvbW1vbiBhdWN0aW9ucxhwYWxsZXQQQ2FsbAQEVAABDCxuZXdfYXVjdGlvbggBIGR1cmF0aW9u1AFEQmxvY2tOdW1iZXJGb3I8VD4AAUhsZWFzZV9wZXJpb2RfaW5kZXjUAUBMZWFzZVBlcmlvZE9mPFQ+AAAUVENyZWF0ZSBhIG5ldyBhdWN0aW9uLgBRAVRoaXMgY2FuIG9ubHkgaGFwcGVuIHdoZW4gdGhlcmUgaXNuJ3QgYWxyZWFkeSBhbiBhdWN0aW9uIGluIHByb2dyZXNzIGFuZCBtYXkgb25seSBiZSUBY2FsbGVkIGJ5IHRoZSByb290IG9yaWdpbi4gQWNjZXB0cyB0aGUgYGR1cmF0aW9uYCBvZiB0aGlzIGF1Y3Rpb24gYW5kIHRoZVkBYGxlYXNlX3BlcmlvZF9pbmRleGAgb2YgdGhlIGluaXRpYWwgbGVhc2UgcGVyaW9kIG9mIHRoZSBmb3VyIHRoYXQgYXJlIHRvIGJlIGF1Y3Rpb25lZC4MYmlkFAEQcGFyYakFARhQYXJhSWQAATRhdWN0aW9uX2luZGV41AEwQXVjdGlvbkluZGV4AAEoZmlyc3Rfc2xvdNQBQExlYXNlUGVyaW9kT2Y8VD4AASRsYXN0X3Nsb3TUAUBMZWFzZVBlcmlvZE9mPFQ+AAEYYW1vdW505AEwQmFsYW5jZU9mPFQ+AAFASQFNYWtlIGEgbmV3IGJpZCBmcm9tIGFuIGFjY291bnQgKGluY2x1ZGluZyBhIHBhcmFjaGFpbiBhY2NvdW50KSBmb3IgZGVwbG95aW5nIGEgbmV3KHBhcmFjaGFpbi4AWQFNdWx0aXBsZSBzaW11bHRhbmVvdXMgYmlkcyBmcm9tIHRoZSBzYW1lIGJpZGRlciBhcmUgYWxsb3dlZCBvbmx5IGFzIGxvbmcgYXMgYWxsIGFjdGl2ZT0BYmlkcyBvdmVybGFwIGVhY2ggb3RoZXIgKGkuZS4gYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZSkuIEJpZHMgY2Fubm90IGJlIHJlZGFjdGVkLgBVAS0gYHN1YmAgaXMgdGhlIHN1Yi1iaWRkZXIgSUQsIGFsbG93aW5nIGZvciBtdWx0aXBsZSBjb21wZXRpbmcgYmlkcyB0byBiZSBtYWRlIGJ5IChhbmRwZnVuZGVkIGJ5KSB0aGUgc2FtZSBhY2NvdW50Lk0BLSBgYXVjdGlvbl9pbmRleGAgaXMgdGhlIGluZGV4IG9mIHRoZSBhdWN0aW9uIHRvIGJpZCBvbi4gU2hvdWxkIGp1c3QgYmUgdGhlIHByZXNlbnRodmFsdWUgb2YgYEF1Y3Rpb25Db3VudGVyYC5JAS0gYGZpcnN0X3Nsb3RgIGlzIHRoZSBmaXJzdCBsZWFzZSBwZXJpb2QgaW5kZXggb2YgdGhlIHJhbmdlIHRvIGJpZCBvbi4gVGhpcyBpcyB0aGUJAWFic29sdXRlIGxlYXNlIHBlcmlvZCBpbmRleCB2YWx1ZSwgbm90IGFuIGF1Y3Rpb24tc3BlY2lmaWMgb2Zmc2V0LkEBLSBgbGFzdF9zbG90YCBpcyB0aGUgbGFzdCBsZWFzZSBwZXJpb2QgaW5kZXggb2YgdGhlIHJhbmdlIHRvIGJpZCBvbi4gVGhpcyBpcyB0aGUJAWFic29sdXRlIGxlYXNlIHBlcmlvZCBpbmRleCB2YWx1ZSwgbm90IGFuIGF1Y3Rpb24tc3BlY2lmaWMgb2Zmc2V0LkkBLSBgYW1vdW50YCBpcyB0aGUgYW1vdW50IHRvIGJpZCB0byBiZSBoZWxkIGFzIGRlcG9zaXQgZm9yIHRoZSBwYXJhY2hhaW4gc2hvdWxkIHRoZchiaWQgd2luLiBUaGlzIGFtb3VudCBpcyBoZWxkIHRocm91Z2hvdXQgdGhlIHJhbmdlLjhjYW5jZWxfYXVjdGlvbgACDHhDYW5jZWwgYW4gaW4tcHJvZ3Jlc3MgYXVjdGlvbi4AiENhbiBvbmx5IGJlIGNhbGxlZCBieSBSb290IG9yaWdpbi4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMuqQUAAAZpAgCtBRBccG9sa2Fkb3RfcnVudGltZV9jb21tb24kY3Jvd2Rsb2FuGHBhbGxldBBDYWxsBARUAAEkGGNyZWF0ZRgBFGluZGV4qQUBGFBhcmFJZAABDGNhcOQBMEJhbGFuY2VPZjxUPgABMGZpcnN0X3BlcmlvZNQBQExlYXNlUGVyaW9kT2Y8VD4AASxsYXN0X3BlcmlvZNQBQExlYXNlUGVyaW9kT2Y8VD4AAQxlbmTUAURCbG9ja051bWJlckZvcjxUPgABIHZlcmlmaWVysQUBTE9wdGlvbjxNdWx0aVNpZ25lcj4AABRNAUNyZWF0ZSBhIG5ldyBjcm93ZGxvYW5pbmcgY2FtcGFpZ24gZm9yIGEgcGFyYWNoYWluIHNsb3Qgd2l0aCB0aGUgZ2l2ZW4gbGVhc2UgcGVyaW9kGHJhbmdlLgBdAVRoaXMgYXBwbGllcyBhIGxvY2sgdG8geW91ciBwYXJhY2hhaW4gY29uZmlndXJhdGlvbiwgZW5zdXJpbmcgdGhhdCBpdCBjYW5ub3QgYmUgY2hhbmdlZGRieSB0aGUgcGFyYWNoYWluIG1hbmFnZXIuKGNvbnRyaWJ1dGUMARRpbmRleKkFARhQYXJhSWQAARR2YWx1ZeQBMEJhbGFuY2VPZjxUPgABJHNpZ25hdHVyZbkFAVhPcHRpb248TXVsdGlTaWduYXR1cmU+AAEIUQFDb250cmlidXRlIHRvIGEgY3Jvd2Qgc2FsZS4gVGhpcyB3aWxsIHRyYW5zZmVyIHNvbWUgYmFsYW5jZSBvdmVyIHRvIGZ1bmQgYSBwYXJhY2hhaW5RAXNsb3QuIEl0IHdpbGwgYmUgd2l0aGRyYXdhYmxlIHdoZW4gdGhlIGNyb3dkbG9hbiBoYXMgZW5kZWQgYW5kIHRoZSBmdW5kcyBhcmUgdW51c2VkLiB3aXRoZHJhdwgBDHdobwABMFQ6OkFjY291bnRJZAABFGluZGV4qQUBGFBhcmFJZAACRMBXaXRoZHJhdyBmdWxsIGJhbGFuY2Ugb2YgYSBzcGVjaWZpYyBjb250cmlidXRvci4AwE9yaWdpbiBtdXN0IGJlIHNpZ25lZCwgYnV0IGNhbiBjb21lIGZyb20gYW55b25lLgBdAVRoZSBmdW5kIG11c3QgYmUgZWl0aGVyIGluLCBvciByZWFkeSBmb3IsIHJldGlyZW1lbnQuIEZvciBhIGZ1bmQgdG8gYmUgKmluKiByZXRpcmVtZW50LEkBdGhlbiB0aGUgcmV0aXJlbWVudCBmbGFnIG11c3QgYmUgc2V0LiBGb3IgYSBmdW5kIHRvIGJlIHJlYWR5IGZvciByZXRpcmVtZW50LCB0aGVuOpwtIGl0IG11c3Qgbm90IGFscmVhZHkgYmUgaW4gcmV0aXJlbWVudDtNAS0gdGhlIGFtb3VudCBvZiByYWlzZWQgZnVuZHMgbXVzdCBiZSBiaWdnZXIgdGhhbiB0aGUgX2ZyZWVfIGJhbGFuY2Ugb2YgdGhlIGFjY291bnQ7NC0gYW5kIGVpdGhlcjq8ICAtIHRoZSBibG9jayBudW1iZXIgbXVzdCBiZSBhdCBsZWFzdCBgZW5kYDsgb3ItASAgLSB0aGUgY3VycmVudCBsZWFzZSBwZXJpb2QgbXVzdCBiZSBncmVhdGVyIHRoYW4gdGhlIGZ1bmQncyBgbGFzdF9wZXJpb2RgLgBVAUluIHRoaXMgY2FzZSwgdGhlIGZ1bmQncyByZXRpcmVtZW50IGZsYWcgaXMgc2V0IGFuZCBpdHMgYGVuZGAgaXMgcmVzZXQgdG8gdGhlIGN1cnJlbnQ0YmxvY2sgbnVtYmVyLgDwLSBgd2hvYDogVGhlIGFjY291bnQgd2hvc2UgY29udHJpYnV0aW9uIHNob3VsZCBiZSB3aXRoZHJhd24uGQEtIGBpbmRleGA6IFRoZSBwYXJhY2hhaW4gdG8gd2hvc2UgY3Jvd2Rsb2FuIHRoZSBjb250cmlidXRpb24gd2FzIG1hZGUuGHJlZnVuZAQBFGluZGV4qQUBGFBhcmFJZAADFOBBdXRvbWF0aWNhbGx5IHJlZnVuZCBjb250cmlidXRvcnMgb2YgYW4gZW5kZWQgY3Jvd2Rsb2FuLiEBRHVlIHRvIHdlaWdodCByZXN0cmljdGlvbnMsIHRoaXMgZnVuY3Rpb24gbWF5IG5lZWQgdG8gYmUgY2FsbGVkIG11bHRpcGxlSQF0aW1lcyB0byBmdWxseSByZWZ1bmQgYWxsIHVzZXJzLiBXZSB3aWxsIHJlZnVuZCBgUmVtb3ZlS2V5c0xpbWl0YCB1c2VycyBhdCBhIHRpbWUuAMBPcmlnaW4gbXVzdCBiZSBzaWduZWQsIGJ1dCBjYW4gY29tZSBmcm9tIGFueW9uZS4gZGlzc29sdmUEARRpbmRleKkFARhQYXJhSWQABARVAVJlbW92ZSBhIGZ1bmQgYWZ0ZXIgdGhlIHJldGlyZW1lbnQgcGVyaW9kIGhhcyBlbmRlZCBhbmQgYWxsIGZ1bmRzIGhhdmUgYmVlbiByZXR1cm5lZC4QZWRpdBgBFGluZGV4qQUBGFBhcmFJZAABDGNhcOQBMEJhbGFuY2VPZjxUPgABMGZpcnN0X3BlcmlvZNQBQExlYXNlUGVyaW9kT2Y8VD4AASxsYXN0X3BlcmlvZNQBQExlYXNlUGVyaW9kT2Y8VD4AAQxlbmTUAURCbG9ja051bWJlckZvcjxUPgABIHZlcmlmaWVysQUBTE9wdGlvbjxNdWx0aVNpZ25lcj4ABQzQRWRpdCB0aGUgY29uZmlndXJhdGlvbiBmb3IgYW4gaW4tcHJvZ3Jlc3MgY3Jvd2Rsb2FuLgCIQ2FuIG9ubHkgYmUgY2FsbGVkIGJ5IFJvb3Qgb3JpZ2luLiBhZGRfbWVtbwgBFGluZGV4aQIBGFBhcmFJZAABEG1lbW84ARxWZWM8dTg+AAYM7EFkZCBhbiBvcHRpb25hbCBtZW1vIHRvIGFuIGV4aXN0aW5nIGNyb3dkbG9hbiBjb250cmlidXRpb24uAC0BT3JpZ2luIG11c3QgYmUgU2lnbmVkLCBhbmQgdGhlIHVzZXIgbXVzdCBoYXZlIGNvbnRyaWJ1dGVkIHRvIHRoZSBjcm93ZGxvYW4uEHBva2UEARRpbmRleGkCARhQYXJhSWQABwx0UG9rZSB0aGUgZnVuZCBpbnRvIGBOZXdSYWlzZWAA3E9yaWdpbiBtdXN0IGJlIFNpZ25lZCwgYW5kIHRoZSBmdW5kIGhhcyBub24temVybyByYWlzZS44Y29udHJpYnV0ZV9hbGwIARRpbmRleKkFARhQYXJhSWQAASRzaWduYXR1cmW5BQFYT3B0aW9uPE11bHRpU2lnbmF0dXJlPgAIDGEBQ29udHJpYnV0ZSB5b3VyIGVudGlyZSBiYWxhbmNlIHRvIGEgY3Jvd2Qgc2FsZS4gVGhpcyB3aWxsIHRyYW5zZmVyIHRoZSBlbnRpcmUgYmFsYW5jZSBvZlEBYSB1c2VyIG92ZXIgdG8gZnVuZCBhIHBhcmFjaGFpbiBzbG90LiBJdCB3aWxsIGJlIHdpdGhkcmF3YWJsZSB3aGVuIHRoZSBjcm93ZGxvYW4gaGFzfGVuZGVkIGFuZCB0aGUgZnVuZHMgYXJlIHVudXNlZC4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMusQUEGE9wdGlvbgQEVAG1BQEIEE5vbmUAAAAQU29tZQQAtQUAAAEAALUFCChzcF9ydW50aW1lLE11bHRpU2lnbmVyAAEMHEVkMjU1MTkEAAQBPGVkMjU1MTk6OlB1YmxpYwAAABxTcjI1NTE5BAAEATxzcjI1NTE5OjpQdWJsaWMAAQAURWNkc2EEAAkCATRlY2RzYTo6UHVibGljAAIAALkFBBhPcHRpb24EBFQBvQUBCBBOb25lAAAAEFNvbWUEAL0FAAABAAC9BQgoc3BfcnVudGltZThNdWx0aVNpZ25hdHVyZQABDBxFZDI1NTE5BAAlAgFIZWQyNTUxOTo6U2lnbmF0dXJlAAAAHFNyMjU1MTkEACUCAUhzcjI1NTE5OjpTaWduYXR1cmUAAQAURWNkc2EEAL0CAUBlY2RzYTo6U2lnbmF0dXJlAAIAAMEFEGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMgY29yZXRpbWUYcGFsbGV0EENhbGwEBFQAAQxIcmVxdWVzdF9jb3JlX2NvdW50BAEUY291bnRVAQEMdTE2AAEYUQFSZXF1ZXN0IHRoZSBjb25maWd1cmF0aW9uIHRvIGJlIHVwZGF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBjb3Jlcy4gV2FybmluZzpRAVNpbmNlIHRoaXMgb25seSBzY2hlZHVsZXMgYSBjb25maWd1cmF0aW9uIHVwZGF0ZSwgaXQgdGFrZXMgdHdvIHNlc3Npb25zIHRvIGNvbWUgaW50bxxlZmZlY3QuAJgtIGBvcmlnaW5gOiBSb290IG9yIHRoZSBDb3JldGltZSBDaGFpboAtIGBjb3VudGA6IHRvdGFsIG51bWJlciBvZiBjb3Jlc0hyZXF1ZXN0X3JldmVudWVfYXQEARB3aGVuEAEsQmxvY2tOdW1iZXIAAhBhAVJlcXVlc3QgdG8gY2xhaW0gdGhlIGluc3RhbnRhbmVvdXMgY29yZXRpbWUgc2FsZXMgcmV2ZW51ZSBzdGFydGluZyBmcm9tIHRoZSBibG9jayBpdCB3YXNdAWxhc3QgY2xhaW1lZCB1bnRpbCBhbmQgdXAgdG8gdGhlIGJsb2NrIHNwZWNpZmllZC4gVGhlIGNsYWltZWQgYW1vdW50IHZhbHVlIGlzIHNlbnQgYmFja1EBdG8gdGhlIENvcmV0aW1lIGNoYWluIGluIGEgYG5vdGlmeV9yZXZlbnVlYCBtZXNzYWdlLiBBdCB0aGUgc2FtZSB0aW1lLCB0aGUgYW1vdW50IGlzhHRlbGVwb3J0ZWQgdG8gdGhlIENvcmV0aW1lIGNoYWluLixhc3NpZ25fY29yZRABEGNvcmVVAQE8QnJva2VyQ29yZUluZGV4AAEUYmVnaW4QAURCbG9ja051bWJlckZvcjxUPgABKGFzc2lnbm1lbnTFBQGMVmVjPChDb3JlQXNzaWdubWVudCwgUGFydHNPZjU3NjAwKT4AASBlbmRfaGludD0CAWRPcHRpb248QmxvY2tOdW1iZXJGb3I8VD4+AAQkWQFSZWNlaXZlIGluc3RydWN0aW9ucyBmcm9tIHRoZSBgRXh0ZXJuYWxCcm9rZXJPcmlnaW5gLCBkZXRhaWxpbmcgaG93IGEgc3BlY2lmaWMgY29yZSBpcyx0byBiZSB1c2VkLgAsUGFyYW1ldGVyczohAS1gb3JpZ2luYDogVGhlIGBFeHRlcm5hbEJyb2tlck9yaWdpbmAsIGFzc3VtZWQgdG8gYmUgdGhlIGNvcmV0aW1lIGNoYWluLqwtYGNvcmVgOiBUaGUgY29yZSB0aGF0IHNob3VsZCBiZSBzY2hlZHVsZWQu2C1gYmVnaW5gOiBUaGUgc3RhcnRpbmcgYmxvY2toZWlnaHQgb2YgdGhlIGluc3RydWN0aW9uLtQtYGFzc2lnbm1lbnRgOiBIb3cgdGhlIGJsb2Nrc3BhY2Ugc2hvdWxkIGJlIHV0aWxpc2VkLlkBLWBlbmRfaGludGA6IEFuIG9wdGlvbmFsIGhpbnQgYXMgdG8gd2hlbiB0aGlzIHBhcnRpY3VsYXIgc2V0IG9mIGluc3RydWN0aW9ucyB3aWxsIGVuZC4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMuxQUAAALJBQDJBQAABAjNBdEFAM0FDDRwYWxsZXRfYnJva2VySGNvcmV0aW1lX2ludGVyZmFjZThDb3JlQXNzaWdubWVudAABDBBJZGxlAAAAEFBvb2wAAQAQVGFzawQAEAEYVGFza0lkAAIAANEFDGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnNEYXNzaWduZXJfY29yZXRpbWUwUGFydHNPZjU3NjAwAAAEAFUBAQx1MTYAANUFDChwYWxsZXRfeGNtGHBhbGxldBBDYWxsBARUAAE4EHNlbmQIARBkZXN0LQEBWEJveDxWZXJzaW9uZWRMb2NhdGlvbj4AARxtZXNzYWdl2QUBVEJveDxWZXJzaW9uZWRYY208KCk+PgAAADx0ZWxlcG9ydF9hc3NldHMQARBkZXN0LQEBWEJveDxWZXJzaW9uZWRMb2NhdGlvbj4AASxiZW5lZmljaWFyeS0BAVhCb3g8VmVyc2lvbmVkTG9jYXRpb24+AAEYYXNzZXRz2QYBUEJveDxWZXJzaW9uZWRBc3NldHM+AAE4ZmVlX2Fzc2V0X2l0ZW0QAQx1MzIAAUgRAVRlbGVwb3J0IHNvbWUgYXNzZXRzIGZyb20gdGhlIGxvY2FsIGNoYWluIHRvIHNvbWUgZGVzdGluYXRpb24gY2hhaW4uAB0BKipUaGlzIGZ1bmN0aW9uIGlzIGRlcHJlY2F0ZWQ6IFVzZSBgbGltaXRlZF90ZWxlcG9ydF9hc3NldHNgIGluc3RlYWQuKioAUQFGZWUgcGF5bWVudCBvbiB0aGUgZGVzdGluYXRpb24gc2lkZSBpcyBtYWRlIGZyb20gdGhlIGFzc2V0IGluIHRoZSBgYXNzZXRzYCB2ZWN0b3Igb2ZhAWluZGV4IGBmZWVfYXNzZXRfaXRlbWAuIFRoZSB3ZWlnaHQgbGltaXQgZm9yIGZlZXMgaXMgbm90IHByb3ZpZGVkIGFuZCB0aHVzIGlzIHVubGltaXRlZCy0d2l0aCBhbGwgZmVlcyB0YWtlbiBhcyBuZWVkZWQgZnJvbSB0aGUgYXNzZXQuACkBLSBgb3JpZ2luYDogTXVzdCBiZSBjYXBhYmxlIG9mIHdpdGhkcmF3aW5nIHRoZSBgYXNzZXRzYCBhbmQgZXhlY3V0aW5nIFhDTS4lAS0gYGRlc3RgOiBEZXN0aW5hdGlvbiBjb250ZXh0IGZvciB0aGUgYXNzZXRzLiBXaWxsIHR5cGljYWxseSBiZSBgW1BhcmVudCxhASAgUGFyYWNoYWluKC4uKV1gIHRvIHNlbmQgZnJvbSBwYXJhY2hhaW4gdG8gcGFyYWNoYWluLCBvciBgW1BhcmFjaGFpbiguLildYCB0byBzZW5kIGZyb21UICByZWxheSB0byBwYXJhY2hhaW4uVQEtIGBiZW5lZmljaWFyeWA6IEEgYmVuZWZpY2lhcnkgbG9jYXRpb24gZm9yIHRoZSBhc3NldHMgaW4gdGhlIGNvbnRleHQgb2YgYGRlc3RgLiBXaWxsmCAgZ2VuZXJhbGx5IGJlIGFuIGBBY2NvdW50SWQzMmAgdmFsdWUuWQEtIGBhc3NldHNgOiBUaGUgYXNzZXRzIHRvIGJlIHdpdGhkcmF3bi4gVGhpcyBzaG91bGQgaW5jbHVkZSB0aGUgYXNzZXRzIHVzZWQgdG8gcGF5IHRoZWggIGZlZSBvbiB0aGUgYGRlc3RgIGNoYWluLk0BLSBgZmVlX2Fzc2V0X2l0ZW1gOiBUaGUgaW5kZXggaW50byBgYXNzZXRzYCBvZiB0aGUgaXRlbSB3aGljaCBzaG91bGQgYmUgdXNlZCB0byBwYXkcICBmZWVzLlxyZXNlcnZlX3RyYW5zZmVyX2Fzc2V0cxABEGRlc3QtAQFYQm94PFZlcnNpb25lZExvY2F0aW9uPgABLGJlbmVmaWNpYXJ5LQEBWEJveDxWZXJzaW9uZWRMb2NhdGlvbj4AARhhc3NldHPZBgFQQm94PFZlcnNpb25lZEFzc2V0cz4AAThmZWVfYXNzZXRfaXRlbRABDHUzMgACeF0BVHJhbnNmZXIgc29tZSBhc3NldHMgZnJvbSB0aGUgbG9jYWwgY2hhaW4gdG8gdGhlIGRlc3RpbmF0aW9uIGNoYWluIHRocm91Z2ggdGhlaXIgbG9jYWwseGRlc3RpbmF0aW9uIG9yIHJlbW90ZSByZXNlcnZlLgA9AWBhc3NldHNgIG11c3QgaGF2ZSBzYW1lIHJlc2VydmUgbG9jYXRpb24gYW5kIG1heSBub3QgYmUgdGVsZXBvcnRhYmxlIHRvIGBkZXN0YC5NASAtIGBhc3NldHNgIGhhdmUgbG9jYWwgcmVzZXJ2ZTogdHJhbnNmZXIgYXNzZXRzIHRvIHNvdmVyZWlnbiBhY2NvdW50IG9mIGRlc3RpbmF0aW9uTQEgICBjaGFpbiBhbmQgZm9yd2FyZCBhIG5vdGlmaWNhdGlvbiBYQ00gdG8gYGRlc3RgIHRvIG1pbnQgYW5kIGRlcG9zaXQgcmVzZXJ2ZS1iYXNlZGwgICBhc3NldHMgdG8gYGJlbmVmaWNpYXJ5YC5VASAtIGBhc3NldHNgIGhhdmUgZGVzdGluYXRpb24gcmVzZXJ2ZTogYnVybiBsb2NhbCBhc3NldHMgYW5kIGZvcndhcmQgYSBub3RpZmljYXRpb24gdG9ZASAgIGBkZXN0YCBjaGFpbiB0byB3aXRoZHJhdyB0aGUgcmVzZXJ2ZSBhc3NldHMgZnJvbSB0aGlzIGNoYWluJ3Mgc292ZXJlaWduIGFjY291bnQgYW5khCAgIGRlcG9zaXQgdGhlbSB0byBgYmVuZWZpY2lhcnlgLmEBIC0gYGFzc2V0c2AgaGF2ZSByZW1vdGUgcmVzZXJ2ZTogYnVybiBsb2NhbCBhc3NldHMsIGZvcndhcmQgWENNIHRvIHJlc2VydmUgY2hhaW4gdG8gbW92ZWEBICAgcmVzZXJ2ZXMgZnJvbSB0aGlzIGNoYWluJ3MgU0EgdG8gYGRlc3RgIGNoYWluJ3MgU0EsIGFuZCBmb3J3YXJkIGFub3RoZXIgWENNIHRvIGBkZXN0YPQgICB0byBtaW50IGFuZCBkZXBvc2l0IHJlc2VydmUtYmFzZWQgYXNzZXRzIHRvIGBiZW5lZmljaWFyeWAuAD0BKipUaGlzIGZ1bmN0aW9uIGlzIGRlcHJlY2F0ZWQ6IFVzZSBgbGltaXRlZF9yZXNlcnZlX3RyYW5zZmVyX2Fzc2V0c2AgaW5zdGVhZC4qKgBRAUZlZSBwYXltZW50IG9uIHRoZSBkZXN0aW5hdGlvbiBzaWRlIGlzIG1hZGUgZnJvbSB0aGUgYXNzZXQgaW4gdGhlIGBhc3NldHNgIHZlY3RvciBvZmEBaW5kZXggYGZlZV9hc3NldF9pdGVtYC4gVGhlIHdlaWdodCBsaW1pdCBmb3IgZmVlcyBpcyBub3QgcHJvdmlkZWQgYW5kIHRodXMgaXMgdW5saW1pdGVkLLR3aXRoIGFsbCBmZWVzIHRha2VuIGFzIG5lZWRlZCBmcm9tIHRoZSBhc3NldC4AKQEtIGBvcmlnaW5gOiBNdXN0IGJlIGNhcGFibGUgb2Ygd2l0aGRyYXdpbmcgdGhlIGBhc3NldHNgIGFuZCBleGVjdXRpbmcgWENNLiUBLSBgZGVzdGA6IERlc3RpbmF0aW9uIGNvbnRleHQgZm9yIHRoZSBhc3NldHMuIFdpbGwgdHlwaWNhbGx5IGJlIGBbUGFyZW50LGEBICBQYXJhY2hhaW4oLi4pXWAgdG8gc2VuZCBmcm9tIHBhcmFjaGFpbiB0byBwYXJhY2hhaW4sIG9yIGBbUGFyYWNoYWluKC4uKV1gIHRvIHNlbmQgZnJvbVQgIHJlbGF5IHRvIHBhcmFjaGFpbi5VAS0gYGJlbmVmaWNpYXJ5YDogQSBiZW5lZmljaWFyeSBsb2NhdGlvbiBmb3IgdGhlIGFzc2V0cyBpbiB0aGUgY29udGV4dCBvZiBgZGVzdGAuIFdpbGyYICBnZW5lcmFsbHkgYmUgYW4gYEFjY291bnRJZDMyYCB2YWx1ZS5ZAS0gYGFzc2V0c2A6IFRoZSBhc3NldHMgdG8gYmUgd2l0aGRyYXduLiBUaGlzIHNob3VsZCBpbmNsdWRlIHRoZSBhc3NldHMgdXNlZCB0byBwYXkgdGhlyCAgZmVlIG9uIHRoZSBgZGVzdGAgKGFuZCBwb3NzaWJseSByZXNlcnZlKSBjaGFpbnMuTQEtIGBmZWVfYXNzZXRfaXRlbWA6IFRoZSBpbmRleCBpbnRvIGBhc3NldHNgIG9mIHRoZSBpdGVtIHdoaWNoIHNob3VsZCBiZSB1c2VkIHRvIHBheRwgIGZlZXMuHGV4ZWN1dGUIARxtZXNzYWdl3QYBtEJveDxWZXJzaW9uZWRYY208PFQgYXMgQ29uZmlnPjo6UnVudGltZUNhbGw+PgABKG1heF93ZWlnaHQoARhXZWlnaHQAAyDQRXhlY3V0ZSBhbiBYQ00gbWVzc2FnZSBmcm9tIGEgbG9jYWwsIHNpZ25lZCwgb3JpZ2luLgBNAUFuIGV2ZW50IGlzIGRlcG9zaXRlZCBpbmRpY2F0aW5nIHdoZXRoZXIgYG1zZ2AgY291bGQgYmUgZXhlY3V0ZWQgY29tcGxldGVseSBvciBvbmx5KHBhcnRpYWxseS4AXQFObyBtb3JlIHRoYW4gYG1heF93ZWlnaHRgIHdpbGwgYmUgdXNlZCBpbiBpdHMgYXR0ZW1wdGVkIGV4ZWN1dGlvbi4gSWYgdGhpcyBpcyBsZXNzIHRoYW5BAXRoZSBtYXhpbXVtIGFtb3VudCBvZiB3ZWlnaHQgdGhhdCB0aGUgbWVzc2FnZSBjb3VsZCB0YWtlIHRvIGJlIGV4ZWN1dGVkLCB0aGVuIG5vfGV4ZWN1dGlvbiBhdHRlbXB0IHdpbGwgYmUgbWFkZS5EZm9yY2VfeGNtX3ZlcnNpb24IASBsb2NhdGlvbvQBNEJveDxMb2NhdGlvbj4AARx2ZXJzaW9uEAEoWGNtVmVyc2lvbgAEGEkBRXh0b2xsIHRoYXQgYSBwYXJ0aWN1bGFyIGRlc3RpbmF0aW9uIGNhbiBiZSBjb21tdW5pY2F0ZWQgd2l0aCB0aHJvdWdoIGEgcGFydGljdWxhcjx2ZXJzaW9uIG9mIFhDTS4A3C0gYG9yaWdpbmA6IE11c3QgYmUgYW4gb3JpZ2luIHNwZWNpZmllZCBieSBBZG1pbk9yaWdpbi7YLSBgbG9jYXRpb25gOiBUaGUgZGVzdGluYXRpb24gdGhhdCBpcyBiZWluZyBkZXNjcmliZWQuEQEtIGB4Y21fdmVyc2lvbmA6IFRoZSBsYXRlc3QgdmVyc2lvbiBvZiBYQ00gdGhhdCBgbG9jYXRpb25gIHN1cHBvcnRzLmRmb3JjZV9kZWZhdWx0X3hjbV92ZXJzaW9uBAFEbWF5YmVfeGNtX3ZlcnNpb249AgFIT3B0aW9uPFhjbVZlcnNpb24+AAUUWQFTZXQgYSBzYWZlIFhDTSB2ZXJzaW9uICh0aGUgdmVyc2lvbiB0aGF0IFhDTSBzaG91bGQgYmUgZW5jb2RlZCB3aXRoIGlmIHRoZSBtb3N0IHJlY2VudLR2ZXJzaW9uIGEgZGVzdGluYXRpb24gY2FuIGFjY2VwdCBpcyB1bmtub3duKS4A3C0gYG9yaWdpbmA6IE11c3QgYmUgYW4gb3JpZ2luIHNwZWNpZmllZCBieSBBZG1pbk9yaWdpbi45AS0gYG1heWJlX3hjbV92ZXJzaW9uYDogVGhlIGRlZmF1bHQgWENNIGVuY29kaW5nIHZlcnNpb24sIG9yIGBOb25lYCB0byBkaXNhYmxlLnhmb3JjZV9zdWJzY3JpYmVfdmVyc2lvbl9ub3RpZnkEASBsb2NhdGlvbi0BAVhCb3g8VmVyc2lvbmVkTG9jYXRpb24+AAYQOQFBc2sgYSBsb2NhdGlvbiB0byBub3RpZnkgdXMgcmVnYXJkaW5nIHRoZWlyIFhDTSB2ZXJzaW9uIGFuZCBhbnkgY2hhbmdlcyB0byBpdC4A3C0gYG9yaWdpbmA6IE11c3QgYmUgYW4gb3JpZ2luIHNwZWNpZmllZCBieSBBZG1pbk9yaWdpbi5ZAS0gYGxvY2F0aW9uYDogVGhlIGxvY2F0aW9uIHRvIHdoaWNoIHdlIHNob3VsZCBzdWJzY3JpYmUgZm9yIFhDTSB2ZXJzaW9uIG5vdGlmaWNhdGlvbnMugGZvcmNlX3Vuc3Vic2NyaWJlX3ZlcnNpb25fbm90aWZ5BAEgbG9jYXRpb24tAQFYQm94PFZlcnNpb25lZExvY2F0aW9uPgAHGEkBUmVxdWlyZSB0aGF0IGEgcGFydGljdWxhciBkZXN0aW5hdGlvbiBzaG91bGQgbm8gbG9uZ2VyIG5vdGlmeSB1cyByZWdhcmRpbmcgYW55IFhDTUB2ZXJzaW9uIGNoYW5nZXMuANwtIGBvcmlnaW5gOiBNdXN0IGJlIGFuIG9yaWdpbiBzcGVjaWZpZWQgYnkgQWRtaW5PcmlnaW4uPQEtIGBsb2NhdGlvbmA6IFRoZSBsb2NhdGlvbiB0byB3aGljaCB3ZSBhcmUgY3VycmVudGx5IHN1YnNjcmliZWQgZm9yIFhDTSB2ZXJzaW9uqCAgbm90aWZpY2F0aW9ucyB3aGljaCB3ZSBubyBsb25nZXIgZGVzaXJlLnxsaW1pdGVkX3Jlc2VydmVfdHJhbnNmZXJfYXNzZXRzFAEQZGVzdC0BAVhCb3g8VmVyc2lvbmVkTG9jYXRpb24+AAEsYmVuZWZpY2lhcnktAQFYQm94PFZlcnNpb25lZExvY2F0aW9uPgABGGFzc2V0c9kGAVBCb3g8VmVyc2lvbmVkQXNzZXRzPgABOGZlZV9hc3NldF9pdGVtEAEMdTMyAAEwd2VpZ2h0X2xpbWl0jQYBLFdlaWdodExpbWl0AAh4XQFUcmFuc2ZlciBzb21lIGFzc2V0cyBmcm9tIHRoZSBsb2NhbCBjaGFpbiB0byB0aGUgZGVzdGluYXRpb24gY2hhaW4gdGhyb3VnaCB0aGVpciBsb2NhbCx4ZGVzdGluYXRpb24gb3IgcmVtb3RlIHJlc2VydmUuAD0BYGFzc2V0c2AgbXVzdCBoYXZlIHNhbWUgcmVzZXJ2ZSBsb2NhdGlvbiBhbmQgbWF5IG5vdCBiZSB0ZWxlcG9ydGFibGUgdG8gYGRlc3RgLk0BIC0gYGFzc2V0c2AgaGF2ZSBsb2NhbCByZXNlcnZlOiB0cmFuc2ZlciBhc3NldHMgdG8gc292ZXJlaWduIGFjY291bnQgb2YgZGVzdGluYXRpb25NASAgIGNoYWluIGFuZCBmb3J3YXJkIGEgbm90aWZpY2F0aW9uIFhDTSB0byBgZGVzdGAgdG8gbWludCBhbmQgZGVwb3NpdCByZXNlcnZlLWJhc2VkbCAgIGFzc2V0cyB0byBgYmVuZWZpY2lhcnlgLlUBIC0gYGFzc2V0c2AgaGF2ZSBkZXN0aW5hdGlvbiByZXNlcnZlOiBidXJuIGxvY2FsIGFzc2V0cyBhbmQgZm9yd2FyZCBhIG5vdGlmaWNhdGlvbiB0b1kBICAgYGRlc3RgIGNoYWluIHRvIHdpdGhkcmF3IHRoZSByZXNlcnZlIGFzc2V0cyBmcm9tIHRoaXMgY2hhaW4ncyBzb3ZlcmVpZ24gYWNjb3VudCBhbmSEICAgZGVwb3NpdCB0aGVtIHRvIGBiZW5lZmljaWFyeWAuYQEgLSBgYXNzZXRzYCBoYXZlIHJlbW90ZSByZXNlcnZlOiBidXJuIGxvY2FsIGFzc2V0cywgZm9yd2FyZCBYQ00gdG8gcmVzZXJ2ZSBjaGFpbiB0byBtb3ZlYQEgICByZXNlcnZlcyBmcm9tIHRoaXMgY2hhaW4ncyBTQSB0byBgZGVzdGAgY2hhaW4ncyBTQSwgYW5kIGZvcndhcmQgYW5vdGhlciBYQ00gdG8gYGRlc3Rg9CAgIHRvIG1pbnQgYW5kIGRlcG9zaXQgcmVzZXJ2ZS1iYXNlZCBhc3NldHMgdG8gYGJlbmVmaWNpYXJ5YC4AUQFGZWUgcGF5bWVudCBvbiB0aGUgZGVzdGluYXRpb24gc2lkZSBpcyBtYWRlIGZyb20gdGhlIGFzc2V0IGluIHRoZSBgYXNzZXRzYCB2ZWN0b3Igb2ZhAWluZGV4IGBmZWVfYXNzZXRfaXRlbWAsIHVwIHRvIGVub3VnaCB0byBwYXkgZm9yIGB3ZWlnaHRfbGltaXRgIG9mIHdlaWdodC4gSWYgbW9yZSB3ZWlnaHRZAWlzIG5lZWRlZCB0aGFuIGB3ZWlnaHRfbGltaXRgLCB0aGVuIHRoZSBvcGVyYXRpb24gd2lsbCBmYWlsIGFuZCB0aGUgc2VudCBhc3NldHMgbWF5IGJlIGF0IHJpc2suACkBLSBgb3JpZ2luYDogTXVzdCBiZSBjYXBhYmxlIG9mIHdpdGhkcmF3aW5nIHRoZSBgYXNzZXRzYCBhbmQgZXhlY3V0aW5nIFhDTS4lAS0gYGRlc3RgOiBEZXN0aW5hdGlvbiBjb250ZXh0IGZvciB0aGUgYXNzZXRzLiBXaWxsIHR5cGljYWxseSBiZSBgW1BhcmVudCxhASAgUGFyYWNoYWluKC4uKV1gIHRvIHNlbmQgZnJvbSBwYXJhY2hhaW4gdG8gcGFyYWNoYWluLCBvciBgW1BhcmFjaGFpbiguLildYCB0byBzZW5kIGZyb21UICByZWxheSB0byBwYXJhY2hhaW4uVQEtIGBiZW5lZmljaWFyeWA6IEEgYmVuZWZpY2lhcnkgbG9jYXRpb24gZm9yIHRoZSBhc3NldHMgaW4gdGhlIGNvbnRleHQgb2YgYGRlc3RgLiBXaWxsmCAgZ2VuZXJhbGx5IGJlIGFuIGBBY2NvdW50SWQzMmAgdmFsdWUuWQEtIGBhc3NldHNgOiBUaGUgYXNzZXRzIHRvIGJlIHdpdGhkcmF3bi4gVGhpcyBzaG91bGQgaW5jbHVkZSB0aGUgYXNzZXRzIHVzZWQgdG8gcGF5IHRoZcggIGZlZSBvbiB0aGUgYGRlc3RgIChhbmQgcG9zc2libHkgcmVzZXJ2ZSkgY2hhaW5zLk0BLSBgZmVlX2Fzc2V0X2l0ZW1gOiBUaGUgaW5kZXggaW50byBgYXNzZXRzYCBvZiB0aGUgaXRlbSB3aGljaCBzaG91bGQgYmUgdXNlZCB0byBwYXkcICBmZWVzLkUBLSBgd2VpZ2h0X2xpbWl0YDogVGhlIHJlbW90ZS1zaWRlIHdlaWdodCBsaW1pdCwgaWYgYW55LCBmb3IgdGhlIFhDTSBmZWUgcHVyY2hhc2UuXGxpbWl0ZWRfdGVsZXBvcnRfYXNzZXRzFAEQZGVzdC0BAVhCb3g8VmVyc2lvbmVkTG9jYXRpb24+AAEsYmVuZWZpY2lhcnktAQFYQm94PFZlcnNpb25lZExvY2F0aW9uPgABGGFzc2V0c9kGAVBCb3g8VmVyc2lvbmVkQXNzZXRzPgABOGZlZV9hc3NldF9pdGVtEAEMdTMyAAEwd2VpZ2h0X2xpbWl0jQYBLFdlaWdodExpbWl0AAlIEQFUZWxlcG9ydCBzb21lIGFzc2V0cyBmcm9tIHRoZSBsb2NhbCBjaGFpbiB0byBzb21lIGRlc3RpbmF0aW9uIGNoYWluLgBRAUZlZSBwYXltZW50IG9uIHRoZSBkZXN0aW5hdGlvbiBzaWRlIGlzIG1hZGUgZnJvbSB0aGUgYXNzZXQgaW4gdGhlIGBhc3NldHNgIHZlY3RvciBvZmEBaW5kZXggYGZlZV9hc3NldF9pdGVtYCwgdXAgdG8gZW5vdWdoIHRvIHBheSBmb3IgYHdlaWdodF9saW1pdGAgb2Ygd2VpZ2h0LiBJZiBtb3JlIHdlaWdodFkBaXMgbmVlZGVkIHRoYW4gYHdlaWdodF9saW1pdGAsIHRoZW4gdGhlIG9wZXJhdGlvbiB3aWxsIGZhaWwgYW5kIHRoZSBzZW50IGFzc2V0cyBtYXkgYmUgYXQgcmlzay4AKQEtIGBvcmlnaW5gOiBNdXN0IGJlIGNhcGFibGUgb2Ygd2l0aGRyYXdpbmcgdGhlIGBhc3NldHNgIGFuZCBleGVjdXRpbmcgWENNLiUBLSBgZGVzdGA6IERlc3RpbmF0aW9uIGNvbnRleHQgZm9yIHRoZSBhc3NldHMuIFdpbGwgdHlwaWNhbGx5IGJlIGBbUGFyZW50LGEBICBQYXJhY2hhaW4oLi4pXWAgdG8gc2VuZCBmcm9tIHBhcmFjaGFpbiB0byBwYXJhY2hhaW4sIG9yIGBbUGFyYWNoYWluKC4uKV1gIHRvIHNlbmQgZnJvbVQgIHJlbGF5IHRvIHBhcmFjaGFpbi5VAS0gYGJlbmVmaWNpYXJ5YDogQSBiZW5lZmljaWFyeSBsb2NhdGlvbiBmb3IgdGhlIGFzc2V0cyBpbiB0aGUgY29udGV4dCBvZiBgZGVzdGAuIFdpbGyYICBnZW5lcmFsbHkgYmUgYW4gYEFjY291bnRJZDMyYCB2YWx1ZS5ZAS0gYGFzc2V0c2A6IFRoZSBhc3NldHMgdG8gYmUgd2l0aGRyYXduLiBUaGlzIHNob3VsZCBpbmNsdWRlIHRoZSBhc3NldHMgdXNlZCB0byBwYXkgdGhlaCAgZmVlIG9uIHRoZSBgZGVzdGAgY2hhaW4uTQEtIGBmZWVfYXNzZXRfaXRlbWA6IFRoZSBpbmRleCBpbnRvIGBhc3NldHNgIG9mIHRoZSBpdGVtIHdoaWNoIHNob3VsZCBiZSB1c2VkIHRvIHBheRwgIGZlZXMuRQEtIGB3ZWlnaHRfbGltaXRgOiBUaGUgcmVtb3RlLXNpZGUgd2VpZ2h0IGxpbWl0LCBpZiBhbnksIGZvciB0aGUgWENNIGZlZSBwdXJjaGFzZS5AZm9yY2Vfc3VzcGVuc2lvbgQBJHN1c3BlbmRlZCABEGJvb2wAChD0U2V0IG9yIHVuc2V0IHRoZSBnbG9iYWwgc3VzcGVuc2lvbiBzdGF0ZSBvZiB0aGUgWENNIGV4ZWN1dG9yLgDcLSBgb3JpZ2luYDogTXVzdCBiZSBhbiBvcmlnaW4gc3BlY2lmaWVkIGJ5IEFkbWluT3JpZ2luLtAtIGBzdXNwZW5kZWRgOiBgdHJ1ZWAgdG8gc3VzcGVuZCwgYGZhbHNlYCB0byByZXN1bWUuPHRyYW5zZmVyX2Fzc2V0cxQBEGRlc3QtAQFYQm94PFZlcnNpb25lZExvY2F0aW9uPgABLGJlbmVmaWNpYXJ5LQEBWEJveDxWZXJzaW9uZWRMb2NhdGlvbj4AARhhc3NldHPZBgFQQm94PFZlcnNpb25lZEFzc2V0cz4AAThmZWVfYXNzZXRfaXRlbRABDHUzMgABMHdlaWdodF9saW1pdI0GASxXZWlnaHRMaW1pdAALhF0BVHJhbnNmZXIgc29tZSBhc3NldHMgZnJvbSB0aGUgbG9jYWwgY2hhaW4gdG8gdGhlIGRlc3RpbmF0aW9uIGNoYWluIHRocm91Z2ggdGhlaXIgbG9jYWws0GRlc3RpbmF0aW9uIG9yIHJlbW90ZSByZXNlcnZlLCBvciB0aHJvdWdoIHRlbGVwb3J0cy4AUQFGZWUgcGF5bWVudCBvbiB0aGUgZGVzdGluYXRpb24gc2lkZSBpcyBtYWRlIGZyb20gdGhlIGFzc2V0IGluIHRoZSBgYXNzZXRzYCB2ZWN0b3Igb2Y1AWluZGV4IGBmZWVfYXNzZXRfaXRlbWAgKGhlbmNlIHJlZmVycmVkIHRvIGFzIGBmZWVzYCksIHVwIHRvIGVub3VnaCB0byBwYXkgZm9yQQFgd2VpZ2h0X2xpbWl0YCBvZiB3ZWlnaHQuIElmIG1vcmUgd2VpZ2h0IGlzIG5lZWRlZCB0aGFuIGB3ZWlnaHRfbGltaXRgLCB0aGVuIHRoZdxvcGVyYXRpb24gd2lsbCBmYWlsIGFuZCB0aGUgc2VudCBhc3NldHMgbWF5IGJlIGF0IHJpc2suAGEBYGFzc2V0c2AgKGV4Y2x1ZGluZyBgZmVlc2ApIG11c3QgaGF2ZSBzYW1lIHJlc2VydmUgbG9jYXRpb24gb3Igb3RoZXJ3aXNlIGJlIHRlbGVwb3J0YWJsZbB0byBgZGVzdGAsIG5vIGxpbWl0YXRpb25zIGltcG9zZWQgb24gYGZlZXNgLk0BIC0gZm9yIGxvY2FsIHJlc2VydmU6IHRyYW5zZmVyIGFzc2V0cyB0byBzb3ZlcmVpZ24gYWNjb3VudCBvZiBkZXN0aW5hdGlvbiBjaGFpbiBhbmRNASAgIGZvcndhcmQgYSBub3RpZmljYXRpb24gWENNIHRvIGBkZXN0YCB0byBtaW50IGFuZCBkZXBvc2l0IHJlc2VydmUtYmFzZWQgYXNzZXRzIHRvRCAgIGBiZW5lZmljaWFyeWAuYQEgLSBmb3IgZGVzdGluYXRpb24gcmVzZXJ2ZTogYnVybiBsb2NhbCBhc3NldHMgYW5kIGZvcndhcmQgYSBub3RpZmljYXRpb24gdG8gYGRlc3RgIGNoYWluWQEgICB0byB3aXRoZHJhdyB0aGUgcmVzZXJ2ZSBhc3NldHMgZnJvbSB0aGlzIGNoYWluJ3Mgc292ZXJlaWduIGFjY291bnQgYW5kIGRlcG9zaXQgdGhlbVAgICB0byBgYmVuZWZpY2lhcnlgLl0BIC0gZm9yIHJlbW90ZSByZXNlcnZlOiBidXJuIGxvY2FsIGFzc2V0cywgZm9yd2FyZCBYQ00gdG8gcmVzZXJ2ZSBjaGFpbiB0byBtb3ZlIHJlc2VydmVzXQEgICBmcm9tIHRoaXMgY2hhaW4ncyBTQSB0byBgZGVzdGAgY2hhaW4ncyBTQSwgYW5kIGZvcndhcmQgYW5vdGhlciBYQ00gdG8gYGRlc3RgIHRvIG1pbnTUICAgYW5kIGRlcG9zaXQgcmVzZXJ2ZS1iYXNlZCBhc3NldHMgdG8gYGJlbmVmaWNpYXJ5YC5RASAtIGZvciB0ZWxlcG9ydHM6IGJ1cm4gbG9jYWwgYXNzZXRzIGFuZCBmb3J3YXJkIFhDTSB0byBgZGVzdGAgY2hhaW4gdG8gbWludC90ZWxlcG9ydLAgICBhc3NldHMgYW5kIGRlcG9zaXQgdGhlbSB0byBgYmVuZWZpY2lhcnlgLgApAS0gYG9yaWdpbmA6IE11c3QgYmUgY2FwYWJsZSBvZiB3aXRoZHJhd2luZyB0aGUgYGFzc2V0c2AgYW5kIGV4ZWN1dGluZyBYQ00uLQEtIGBkZXN0YDogRGVzdGluYXRpb24gY29udGV4dCBmb3IgdGhlIGFzc2V0cy4gV2lsbCB0eXBpY2FsbHkgYmUgYFgyKFBhcmVudCxVASAgUGFyYWNoYWluKC4uKSlgIHRvIHNlbmQgZnJvbSBwYXJhY2hhaW4gdG8gcGFyYWNoYWluLCBvciBgWDEoUGFyYWNoYWluKC4uKSlgIHRvIHNlbmRoICBmcm9tIHJlbGF5IHRvIHBhcmFjaGFpbi5VAS0gYGJlbmVmaWNpYXJ5YDogQSBiZW5lZmljaWFyeSBsb2NhdGlvbiBmb3IgdGhlIGFzc2V0cyBpbiB0aGUgY29udGV4dCBvZiBgZGVzdGAuIFdpbGyYICBnZW5lcmFsbHkgYmUgYW4gYEFjY291bnRJZDMyYCB2YWx1ZS5ZAS0gYGFzc2V0c2A6IFRoZSBhc3NldHMgdG8gYmUgd2l0aGRyYXduLiBUaGlzIHNob3VsZCBpbmNsdWRlIHRoZSBhc3NldHMgdXNlZCB0byBwYXkgdGhlyCAgZmVlIG9uIHRoZSBgZGVzdGAgKGFuZCBwb3NzaWJseSByZXNlcnZlKSBjaGFpbnMuTQEtIGBmZWVfYXNzZXRfaXRlbWA6IFRoZSBpbmRleCBpbnRvIGBhc3NldHNgIG9mIHRoZSBpdGVtIHdoaWNoIHNob3VsZCBiZSB1c2VkIHRvIHBheRwgIGZlZXMuRQEtIGB3ZWlnaHRfbGltaXRgOiBUaGUgcmVtb3RlLXNpZGUgd2VpZ2h0IGxpbWl0LCBpZiBhbnksIGZvciB0aGUgWENNIGZlZSBwdXJjaGFzZS4wY2xhaW1fYXNzZXRzCAEYYXNzZXRz2QYBUEJveDxWZXJzaW9uZWRBc3NldHM+AAEsYmVuZWZpY2lhcnktAQFYQm94PFZlcnNpb25lZExvY2F0aW9uPgAMGFUBQ2xhaW1zIGFzc2V0cyB0cmFwcGVkIG9uIHRoaXMgcGFsbGV0IGJlY2F1c2Ugb2YgbGVmdG92ZXIgYXNzZXRzIGR1cmluZyBYQ00gZXhlY3V0aW9uLgCsLSBgb3JpZ2luYDogQW55b25lIGNhbiBjYWxsIHRoaXMgZXh0cmluc2ljLl0BLSBgYXNzZXRzYDogVGhlIGV4YWN0IGFzc2V0cyB0aGF0IHdlcmUgdHJhcHBlZC4gVXNlIHRoZSB2ZXJzaW9uIHRvIHNwZWNpZnkgd2hhdCB2ZXJzaW9umHdhcyB0aGUgbGF0ZXN0IHdoZW4gdGhleSB3ZXJlIHRyYXBwZWQuRQEtIGBiZW5lZmljaWFyeWA6IFRoZSBsb2NhdGlvbi9hY2NvdW50IHdoZXJlIHRoZSBjbGFpbWVkIGFzc2V0cyB3aWxsIGJlIGRlcG9zaXRlZC6MdHJhbnNmZXJfYXNzZXRzX3VzaW5nX3R5cGVfYW5kX3RoZW4cARBkZXN0LQEBWEJveDxWZXJzaW9uZWRMb2NhdGlvbj4AARhhc3NldHPZBgFQQm94PFZlcnNpb25lZEFzc2V0cz4AAVBhc3NldHNfdHJhbnNmZXJfdHlwZQkHAURCb3g8VHJhbnNmZXJUeXBlPgABOHJlbW90ZV9mZWVzX2lkDQcBVEJveDxWZXJzaW9uZWRBc3NldElkPgABSGZlZXNfdHJhbnNmZXJfdHlwZQkHAURCb3g8VHJhbnNmZXJUeXBlPgABSGN1c3RvbV94Y21fb25fZGVzdNkFAVRCb3g8VmVyc2lvbmVkWGNtPCgpPj4AATB3ZWlnaHRfbGltaXSNBgEsV2VpZ2h0TGltaXQADcBVAVRyYW5zZmVyIGFzc2V0cyBmcm9tIHRoZSBsb2NhbCBjaGFpbiB0byB0aGUgZGVzdGluYXRpb24gY2hhaW4gdXNpbmcgZXhwbGljaXQgdHJhbnNmZXJodHlwZXMgZm9yIGFzc2V0cyBhbmQgZmVlcy4AWQFgYXNzZXRzYCBtdXN0IGhhdmUgc2FtZSByZXNlcnZlIGxvY2F0aW9uIG9yIG1heSBiZSB0ZWxlcG9ydGFibGUgdG8gYGRlc3RgLiBDYWxsZXIgbXVzdOxwcm92aWRlIHRoZSBgYXNzZXRzX3RyYW5zZmVyX3R5cGVgIHRvIGJlIHVzZWQgZm9yIGBhc3NldHNgOlEBIC0gYFRyYW5zZmVyVHlwZTo6TG9jYWxSZXNlcnZlYDogdHJhbnNmZXIgYXNzZXRzIHRvIHNvdmVyZWlnbiBhY2NvdW50IG9mIGRlc3RpbmF0aW9uTQEgICBjaGFpbiBhbmQgZm9yd2FyZCBhIG5vdGlmaWNhdGlvbiBYQ00gdG8gYGRlc3RgIHRvIG1pbnQgYW5kIGRlcG9zaXQgcmVzZXJ2ZS1iYXNlZGwgICBhc3NldHMgdG8gYGJlbmVmaWNpYXJ5YC5ZASAtIGBUcmFuc2ZlclR5cGU6OkRlc3RpbmF0aW9uUmVzZXJ2ZWA6IGJ1cm4gbG9jYWwgYXNzZXRzIGFuZCBmb3J3YXJkIGEgbm90aWZpY2F0aW9uIHRvWQEgICBgZGVzdGAgY2hhaW4gdG8gd2l0aGRyYXcgdGhlIHJlc2VydmUgYXNzZXRzIGZyb20gdGhpcyBjaGFpbidzIHNvdmVyZWlnbiBhY2NvdW50IGFuZIQgICBkZXBvc2l0IHRoZW0gdG8gYGJlbmVmaWNpYXJ5YC5ZASAtIGBUcmFuc2ZlclR5cGU6OlJlbW90ZVJlc2VydmUocmVzZXJ2ZSlgOiBidXJuIGxvY2FsIGFzc2V0cywgZm9yd2FyZCBYQ00gdG8gYHJlc2VydmVgYQEgICBjaGFpbiB0byBtb3ZlIHJlc2VydmVzIGZyb20gdGhpcyBjaGFpbidzIFNBIHRvIGBkZXN0YCBjaGFpbidzIFNBLCBhbmQgZm9yd2FyZCBhbm90aGVyVQEgICBYQ00gdG8gYGRlc3RgIHRvIG1pbnQgYW5kIGRlcG9zaXQgcmVzZXJ2ZS1iYXNlZCBhc3NldHMgdG8gYGJlbmVmaWNpYXJ5YC4gVHlwaWNhbGx5lCAgIHRoZSByZW1vdGUgYHJlc2VydmVgIGlzIEFzc2V0IEh1Yi5FASAtIGBUcmFuc2ZlclR5cGU6OlRlbGVwb3J0YDogYnVybiBsb2NhbCBhc3NldHMgYW5kIGZvcndhcmQgWENNIHRvIGBkZXN0YCBjaGFpbiB0b+ggICBtaW50L3RlbGVwb3J0IGFzc2V0cyBhbmQgZGVwb3NpdCB0aGVtIHRvIGBiZW5lZmljaWFyeWAuAFUBT24gdGhlIGRlc3RpbmF0aW9uIGNoYWluLCBhcyB3ZWxsIGFzIGFueSBpbnRlcm1lZGlhcnkgaG9wcywgYEJ1eUV4ZWN1dGlvbmAgaXMgdXNlZCB0byEBYnV5IGV4ZWN1dGlvbiB1c2luZyB0cmFuc2ZlcnJlZCBgYXNzZXRzYCBpZGVudGlmaWVkIGJ5IGByZW1vdGVfZmVlc19pZGAuWQFNYWtlIHN1cmUgZW5vdWdoIG9mIHRoZSBzcGVjaWZpZWQgYHJlbW90ZV9mZWVzX2lkYCBhc3NldCBpcyBpbmNsdWRlZCBpbiB0aGUgZ2l2ZW4gbGlzdGEBb2YgYGFzc2V0c2AuIGByZW1vdGVfZmVlc19pZGAgc2hvdWxkIGJlIGVub3VnaCB0byBwYXkgZm9yIGB3ZWlnaHRfbGltaXRgLiBJZiBtb3JlIHdlaWdodFkBaXMgbmVlZGVkIHRoYW4gYHdlaWdodF9saW1pdGAsIHRoZW4gdGhlIG9wZXJhdGlvbiB3aWxsIGZhaWwgYW5kIHRoZSBzZW50IGFzc2V0cyBtYXkgYmUgYXQgcmlzay4ARQFgcmVtb3RlX2ZlZXNfaWRgIG1heSB1c2UgZGlmZmVyZW50IHRyYW5zZmVyIHR5cGUgdGhhbiByZXN0IG9mIGBhc3NldHNgIGFuZCBjYW4gYmWcc3BlY2lmaWVkIHRocm91Z2ggYGZlZXNfdHJhbnNmZXJfdHlwZWAuAGEBVGhlIGNhbGxlciBuZWVkcyB0byBzcGVjaWZ5IHdoYXQgc2hvdWxkIGhhcHBlbiB0byB0aGUgdHJhbnNmZXJyZWQgYXNzZXRzIG9uY2UgdGhleSByZWFjaEEBdGhlIGBkZXN0YCBjaGFpbi4gVGhpcyBpcyBkb25lIHRocm91Z2ggdGhlIGBjdXN0b21feGNtX29uX2Rlc3RgIHBhcmFtZXRlciwgd2hpY2j8Y29udGFpbnMgdGhlIGluc3RydWN0aW9ucyB0byBleGVjdXRlIG9uIGBkZXN0YCBhcyBhIGZpbmFsIHN0ZXAufCAgVGhpcyBpcyB1c3VhbGx5IGFzIHNpbXBsZSBhczpRASAgYFhjbSh2ZWMhW0RlcG9zaXRBc3NldCB7IGFzc2V0czogV2lsZChBbGxDb3VudGVkKGFzc2V0cy5sZW4oKSkpLCBiZW5lZmljaWFyeSB9XSlgLDEBICBidXQgY291bGQgYmUgc29tZXRoaW5nIG1vcmUgZXhvdGljIGxpa2Ugc2VuZGluZyB0aGUgYGFzc2V0c2AgZXZlbiBmdXJ0aGVyLgApAS0gYG9yaWdpbmA6IE11c3QgYmUgY2FwYWJsZSBvZiB3aXRoZHJhd2luZyB0aGUgYGFzc2V0c2AgYW5kIGV4ZWN1dGluZyBYQ00uJQEtIGBkZXN0YDogRGVzdGluYXRpb24gY29udGV4dCBmb3IgdGhlIGFzc2V0cy4gV2lsbCB0eXBpY2FsbHkgYmUgYFtQYXJlbnQsYQEgIFBhcmFjaGFpbiguLildYCB0byBzZW5kIGZyb20gcGFyYWNoYWluIHRvIHBhcmFjaGFpbiwgb3IgYFtQYXJhY2hhaW4oLi4pXWAgdG8gc2VuZCBmcm9tPQEgIHJlbGF5IHRvIHBhcmFjaGFpbiwgb3IgYChwYXJlbnRzOiAyLCAoR2xvYmFsQ29uc2Vuc3VzKC4uKSwgLi4pKWAgdG8gc2VuZCBmcm9t9CAgcGFyYWNoYWluIGFjcm9zcyBhIGJyaWRnZSB0byBhbm90aGVyIGVjb3N5c3RlbSBkZXN0aW5hdGlvbi5ZAS0gYGFzc2V0c2A6IFRoZSBhc3NldHMgdG8gYmUgd2l0aGRyYXduLiBUaGlzIHNob3VsZCBpbmNsdWRlIHRoZSBhc3NldHMgdXNlZCB0byBwYXkgdGhlyCAgZmVlIG9uIHRoZSBgZGVzdGAgKGFuZCBwb3NzaWJseSByZXNlcnZlKSBjaGFpbnMuPQEtIGBhc3NldHNfdHJhbnNmZXJfdHlwZWA6IFRoZSBYQ00gYFRyYW5zZmVyVHlwZWAgdXNlZCB0byB0cmFuc2ZlciB0aGUgYGFzc2V0c2AuIQEtIGByZW1vdGVfZmVlc19pZGA6IE9uZSBvZiB0aGUgaW5jbHVkZWQgYGFzc2V0c2AgdG8gYmUgdXNlZCB0byBwYXkgZmVlcy5JAS0gYGZlZXNfdHJhbnNmZXJfdHlwZWA6IFRoZSBYQ00gYFRyYW5zZmVyVHlwZWAgdXNlZCB0byB0cmFuc2ZlciB0aGUgYGZlZXNgIGFzc2V0cy5ZAS0gYGN1c3RvbV94Y21fb25fZGVzdGA6IFRoZSBYQ00gdG8gYmUgZXhlY3V0ZWQgb24gYGRlc3RgIGNoYWluIGFzIHRoZSBsYXN0IHN0ZXAgb2YgdGhlWQEgIHRyYW5zZmVyLCB3aGljaCBhbHNvIGRldGVybWluZXMgd2hhdCBoYXBwZW5zIHRvIHRoZSBhc3NldHMgb24gdGhlIGRlc3RpbmF0aW9uIGNoYWluLkUBLSBgd2VpZ2h0X2xpbWl0YDogVGhlIHJlbW90ZS1zaWRlIHdlaWdodCBsaW1pdCwgaWYgYW55LCBmb3IgdGhlIFhDTSBmZWUgcHVyY2hhc2UuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLtkFCAx4Y20wVmVyc2lvbmVkWGNtBCxSdW50aW1lQ2FsbAABDAhWMgQA3QUBUHYyOjpYY208UnVudGltZUNhbGw+AAIACFYzBAAtBgFQdjM6OlhjbTxSdW50aW1lQ2FsbD4AAwAIVjQEAJEGAVB2NDo6WGNtPFJ1bnRpbWVDYWxsPgAEAADdBQwMeGNtCHYyDFhjbQQsUnVudGltZUNhbGwAAAQA4QUBdFZlYzxJbnN0cnVjdGlvbjxSdW50aW1lQ2FsbD4+AADhBQAAAuUFAOUFDAx4Y20IdjIsSW5zdHJ1Y3Rpb24ELFJ1bnRpbWVDYWxsAAFwNFdpdGhkcmF3QXNzZXQEAOkFASxNdWx0aUFzc2V0cwAAAFRSZXNlcnZlQXNzZXREZXBvc2l0ZWQEAOkFASxNdWx0aUFzc2V0cwABAFhSZWNlaXZlVGVsZXBvcnRlZEFzc2V0BADpBQEsTXVsdGlBc3NldHMAAgA0UXVlcnlSZXNwb25zZQwBIHF1ZXJ5X2lkLAEcUXVlcnlJZAABIHJlc3BvbnNlBQYBIFJlc3BvbnNlAAEobWF4X3dlaWdodCwBDHU2NAADADRUcmFuc2ZlckFzc2V0CAEYYXNzZXRz6QUBLE11bHRpQXNzZXRzAAEsYmVuZWZpY2lhcnkxAQE0TXVsdGlMb2NhdGlvbgAEAFBUcmFuc2ZlclJlc2VydmVBc3NldAwBGGFzc2V0c+kFASxNdWx0aUFzc2V0cwABEGRlc3QxAQE0TXVsdGlMb2NhdGlvbgABDHhjbd0FARxYY208KCk+AAUAIFRyYW5zYWN0DAEsb3JpZ2luX3R5cGUVBgEoT3JpZ2luS2luZAABWHJlcXVpcmVfd2VpZ2h0X2F0X21vc3QsAQx1NjQAARBjYWxsGQYBaERvdWJsZUVuY29kZWQ8UnVudGltZUNhbGw+AAYAZEhybXBOZXdDaGFubmVsT3BlblJlcXVlc3QMARhzZW5kZXLUAQx1MzIAAUBtYXhfbWVzc2FnZV9zaXpl1AEMdTMyAAEwbWF4X2NhcGFjaXR51AEMdTMyAAcATEhybXBDaGFubmVsQWNjZXB0ZWQEASRyZWNpcGllbnTUAQx1MzIACABISHJtcENoYW5uZWxDbG9zaW5nDAEkaW5pdGlhdG9y1AEMdTMyAAEYc2VuZGVy1AEMdTMyAAEkcmVjaXBpZW501AEMdTMyAAkALENsZWFyT3JpZ2luAAoANERlc2NlbmRPcmlnaW4EADUBAVRJbnRlcmlvck11bHRpTG9jYXRpb24ACwAsUmVwb3J0RXJyb3IMASBxdWVyeV9pZCwBHFF1ZXJ5SWQAARBkZXN0MQEBNE11bHRpTG9jYXRpb24AAUxtYXhfcmVzcG9uc2Vfd2VpZ2h0LAEMdTY0AAwAMERlcG9zaXRBc3NldAwBGGFzc2V0cx0GAUBNdWx0aUFzc2V0RmlsdGVyAAEobWF4X2Fzc2V0c9QBDHUzMgABLGJlbmVmaWNpYXJ5MQEBNE11bHRpTG9jYXRpb24ADQBMRGVwb3NpdFJlc2VydmVBc3NldBABGGFzc2V0cx0GAUBNdWx0aUFzc2V0RmlsdGVyAAEobWF4X2Fzc2V0c9QBDHUzMgABEGRlc3QxAQE0TXVsdGlMb2NhdGlvbgABDHhjbd0FARxYY208KCk+AA4ANEV4Y2hhbmdlQXNzZXQIARBnaXZlHQYBQE11bHRpQXNzZXRGaWx0ZXIAARxyZWNlaXZl6QUBLE11bHRpQXNzZXRzAA8AXEluaXRpYXRlUmVzZXJ2ZVdpdGhkcmF3DAEYYXNzZXRzHQYBQE11bHRpQXNzZXRGaWx0ZXIAARxyZXNlcnZlMQEBNE11bHRpTG9jYXRpb24AAQx4Y23dBQEcWGNtPCgpPgAQAEBJbml0aWF0ZVRlbGVwb3J0DAEYYXNzZXRzHQYBQE11bHRpQXNzZXRGaWx0ZXIAARBkZXN0MQEBNE11bHRpTG9jYXRpb24AAQx4Y23dBQEcWGNtPCgpPgARADBRdWVyeUhvbGRpbmcQASBxdWVyeV9pZCwBHFF1ZXJ5SWQAARBkZXN0MQEBNE11bHRpTG9jYXRpb24AARhhc3NldHMdBgFATXVsdGlBc3NldEZpbHRlcgABTG1heF9yZXNwb25zZV93ZWlnaHQsAQx1NjQAEgAwQnV5RXhlY3V0aW9uCAEQZmVlc/EFAShNdWx0aUFzc2V0AAEwd2VpZ2h0X2xpbWl0KQYBLFdlaWdodExpbWl0ABMANFJlZnVuZFN1cnBsdXMAFAA8U2V0RXJyb3JIYW5kbGVyBADdBQFAWGNtPFJ1bnRpbWVDYWxsPgAVACxTZXRBcHBlbmRpeAQA3QUBQFhjbTxSdW50aW1lQ2FsbD4AFgAoQ2xlYXJFcnJvcgAXAChDbGFpbUFzc2V0CAEYYXNzZXRz6QUBLE11bHRpQXNzZXRzAAEYdGlja2V0MQEBNE11bHRpTG9jYXRpb24AGAAQVHJhcAQALAEMdTY0ABkAQFN1YnNjcmliZVZlcnNpb24IASBxdWVyeV9pZCwBHFF1ZXJ5SWQAAUxtYXhfcmVzcG9uc2Vfd2VpZ2h0LAEMdTY0ABoASFVuc3Vic2NyaWJlVmVyc2lvbgAbAADpBRAMeGNtCHYyKG11bHRpYXNzZXQsTXVsdGlBc3NldHMAAAQA7QUBPFZlYzxNdWx0aUFzc2V0PgAA7QUAAALxBQDxBRAMeGNtCHYyKG11bHRpYXNzZXQoTXVsdGlBc3NldAAACAEIaWT1BQEcQXNzZXRJZAABDGZ1bvkFASxGdW5naWJpbGl0eQAA9QUQDHhjbQh2MihtdWx0aWFzc2V0HEFzc2V0SWQAAQggQ29uY3JldGUEADEBATRNdWx0aUxvY2F0aW9uAAAAIEFic3RyYWN0BAA4ARxWZWM8dTg+AAEAAPkFEAx4Y20IdjIobXVsdGlhc3NldCxGdW5naWJpbGl0eQABCCBGdW5naWJsZQQA5AEQdTEyOAAAACxOb25GdW5naWJsZQQA/QUBNEFzc2V0SW5zdGFuY2UAAQAA/QUQDHhjbQh2MihtdWx0aWFzc2V0NEFzc2V0SW5zdGFuY2UAARwkVW5kZWZpbmVkAAAAFEluZGV4BADkARB1MTI4AAEAGEFycmF5NAQASAEcW3U4OyA0XQACABhBcnJheTgEAAEGARxbdTg7IDhdAAMAHEFycmF5MTYEAKgBIFt1ODsgMTZdAAQAHEFycmF5MzIEAAQBIFt1ODsgMzJdAAUAEEJsb2IEADgBHFZlYzx1OD4ABgAAAQYAAAMIAAAACAAFBgwMeGNtCHYyIFJlc3BvbnNlAAEQEE51bGwAAAAYQXNzZXRzBADpBQEsTXVsdGlBc3NldHMAAQA8RXhlY3V0aW9uUmVzdWx0BAAJBgFQT3B0aW9uPCh1MzIsIEVycm9yKT4AAgAcVmVyc2lvbgQAEAE4c3VwZXI6OlZlcnNpb24AAwAACQYEGE9wdGlvbgQEVAENBgEIEE5vbmUAAAAQU29tZQQADQYAAAEAAA0GAAAECBARBgARBhAMeGNtCHYyGHRyYWl0cxRFcnJvcgABaCBPdmVyZmxvdwAAADRVbmltcGxlbWVudGVkAAEAYFVudHJ1c3RlZFJlc2VydmVMb2NhdGlvbgACAGRVbnRydXN0ZWRUZWxlcG9ydExvY2F0aW9uAAMARE11bHRpTG9jYXRpb25GdWxsAAQAaE11bHRpTG9jYXRpb25Ob3RJbnZlcnRpYmxlAAUAJEJhZE9yaWdpbgAGADxJbnZhbGlkTG9jYXRpb24ABwA0QXNzZXROb3RGb3VuZAAIAFRGYWlsZWRUb1RyYW5zYWN0QXNzZXQACQA8Tm90V2l0aGRyYXdhYmxlAAoASExvY2F0aW9uQ2Fubm90SG9sZAALAFRFeGNlZWRzTWF4TWVzc2FnZVNpemUADABYRGVzdGluYXRpb25VbnN1cHBvcnRlZAANACRUcmFuc3BvcnQADgAoVW5yb3V0YWJsZQAPADBVbmtub3duQ2xhaW0AEAA4RmFpbGVkVG9EZWNvZGUAEQBATWF4V2VpZ2h0SW52YWxpZAASADhOb3RIb2xkaW5nRmVlcwATADBUb29FeHBlbnNpdmUAFAAQVHJhcAQAMAEMdTY0ABUATFVuaGFuZGxlZFhjbVZlcnNpb24AFgBIV2VpZ2h0TGltaXRSZWFjaGVkBAAwARhXZWlnaHQAFwAcQmFycmllcgAYAExXZWlnaHROb3RDb21wdXRhYmxlABkAABUGDAx4Y20IdjIoT3JpZ2luS2luZAABEBhOYXRpdmUAAABAU292ZXJlaWduQWNjb3VudAABACRTdXBlcnVzZXIAAgAMWGNtAAMAABkGDAx4Y204ZG91YmxlX2VuY29kZWQ0RG91YmxlRW5jb2RlZAQEVAAABAEcZW5jb2RlZDgBHFZlYzx1OD4AAB0GEAx4Y20IdjIobXVsdGlhc3NldEBNdWx0aUFzc2V0RmlsdGVyAAEIIERlZmluaXRlBADpBQEsTXVsdGlBc3NldHMAAAAQV2lsZAQAIQYBOFdpbGRNdWx0aUFzc2V0AAEAACEGEAx4Y20IdjIobXVsdGlhc3NldDhXaWxkTXVsdGlBc3NldAABCAxBbGwAAAAUQWxsT2YIAQhpZPUFARxBc3NldElkAAEMZnVuJQYBPFdpbGRGdW5naWJpbGl0eQABAAAlBhAMeGNtCHYyKG11bHRpYXNzZXQ8V2lsZEZ1bmdpYmlsaXR5AAEIIEZ1bmdpYmxlAAAALE5vbkZ1bmdpYmxlAAEAACkGDAx4Y20IdjIsV2VpZ2h0TGltaXQAAQgkVW5saW1pdGVkAAAAHExpbWl0ZWQEACwBDHU2NAABAAAtBgwMeGNtCHYzDFhjbQQQQ2FsbAAABAAxBgFYVmVjPEluc3RydWN0aW9uPENhbGw+PgAAMQYAAAI1BgA1BgwMeGNtCHYzLEluc3RydWN0aW9uBBBDYWxsAAHANFdpdGhkcmF3QXNzZXQEADkGASxNdWx0aUFzc2V0cwAAAFRSZXNlcnZlQXNzZXREZXBvc2l0ZWQEADkGASxNdWx0aUFzc2V0cwABAFhSZWNlaXZlVGVsZXBvcnRlZEFzc2V0BAA5BgEsTXVsdGlBc3NldHMAAgA0UXVlcnlSZXNwb25zZRABIHF1ZXJ5X2lkLAEcUXVlcnlJZAABIHJlc3BvbnNlTQYBIFJlc3BvbnNlAAEobWF4X3dlaWdodCgBGFdlaWdodAABHHF1ZXJpZXJ1BgFUT3B0aW9uPE11bHRpTG9jYXRpb24+AAMANFRyYW5zZmVyQXNzZXQIARhhc3NldHM5BgEsTXVsdGlBc3NldHMAASxiZW5lZmljaWFyecgBNE11bHRpTG9jYXRpb24ABABQVHJhbnNmZXJSZXNlcnZlQXNzZXQMARhhc3NldHM5BgEsTXVsdGlBc3NldHMAARBkZXN0yAE0TXVsdGlMb2NhdGlvbgABDHhjbS0GARxYY208KCk+AAUAIFRyYW5zYWN0DAEsb3JpZ2luX2tpbmR5BgEoT3JpZ2luS2luZAABWHJlcXVpcmVfd2VpZ2h0X2F0X21vc3QoARhXZWlnaHQAARBjYWxsGQYBTERvdWJsZUVuY29kZWQ8Q2FsbD4ABgBkSHJtcE5ld0NoYW5uZWxPcGVuUmVxdWVzdAwBGHNlbmRlctQBDHUzMgABQG1heF9tZXNzYWdlX3NpemXUAQx1MzIAATBtYXhfY2FwYWNpdHnUAQx1MzIABwBMSHJtcENoYW5uZWxBY2NlcHRlZAQBJHJlY2lwaWVudNQBDHUzMgAIAEhIcm1wQ2hhbm5lbENsb3NpbmcMASRpbml0aWF0b3LUAQx1MzIAARhzZW5kZXLUAQx1MzIAASRyZWNpcGllbnTUAQx1MzIACQAsQ2xlYXJPcmlnaW4ACgA0RGVzY2VuZE9yaWdpbgQAzAFUSW50ZXJpb3JNdWx0aUxvY2F0aW9uAAsALFJlcG9ydEVycm9yBAB9BgFEUXVlcnlSZXNwb25zZUluZm8ADAAwRGVwb3NpdEFzc2V0CAEYYXNzZXRzgQYBQE11bHRpQXNzZXRGaWx0ZXIAASxiZW5lZmljaWFyecgBNE11bHRpTG9jYXRpb24ADQBMRGVwb3NpdFJlc2VydmVBc3NldAwBGGFzc2V0c4EGAUBNdWx0aUFzc2V0RmlsdGVyAAEQZGVzdMgBNE11bHRpTG9jYXRpb24AAQx4Y20tBgEcWGNtPCgpPgAOADRFeGNoYW5nZUFzc2V0DAEQZ2l2ZYEGAUBNdWx0aUFzc2V0RmlsdGVyAAEQd2FudDkGASxNdWx0aUFzc2V0cwABHG1heGltYWwgARBib29sAA8AXEluaXRpYXRlUmVzZXJ2ZVdpdGhkcmF3DAEYYXNzZXRzgQYBQE11bHRpQXNzZXRGaWx0ZXIAARxyZXNlcnZlyAE0TXVsdGlMb2NhdGlvbgABDHhjbS0GARxYY208KCk+ABAAQEluaXRpYXRlVGVsZXBvcnQMARhhc3NldHOBBgFATXVsdGlBc3NldEZpbHRlcgABEGRlc3TIATRNdWx0aUxvY2F0aW9uAAEMeGNtLQYBHFhjbTwoKT4AEQA0UmVwb3J0SG9sZGluZwgBNHJlc3BvbnNlX2luZm99BgFEUXVlcnlSZXNwb25zZUluZm8AARhhc3NldHOBBgFATXVsdGlBc3NldEZpbHRlcgASADBCdXlFeGVjdXRpb24IARBmZWVzQQYBKE11bHRpQXNzZXQAATB3ZWlnaHRfbGltaXSNBgEsV2VpZ2h0TGltaXQAEwA0UmVmdW5kU3VycGx1cwAUADxTZXRFcnJvckhhbmRsZXIEAC0GASRYY208Q2FsbD4AFQAsU2V0QXBwZW5kaXgEAC0GASRYY208Q2FsbD4AFgAoQ2xlYXJFcnJvcgAXAChDbGFpbUFzc2V0CAEYYXNzZXRzOQYBLE11bHRpQXNzZXRzAAEYdGlja2V0yAE0TXVsdGlMb2NhdGlvbgAYABBUcmFwBAAsAQx1NjQAGQBAU3Vic2NyaWJlVmVyc2lvbggBIHF1ZXJ5X2lkLAEcUXVlcnlJZAABTG1heF9yZXNwb25zZV93ZWlnaHQoARhXZWlnaHQAGgBIVW5zdWJzY3JpYmVWZXJzaW9uABsAJEJ1cm5Bc3NldAQAOQYBLE11bHRpQXNzZXRzABwALEV4cGVjdEFzc2V0BAA5BgEsTXVsdGlBc3NldHMAHQAwRXhwZWN0T3JpZ2luBAB1BgFUT3B0aW9uPE11bHRpTG9jYXRpb24+AB4ALEV4cGVjdEVycm9yBABRBgFQT3B0aW9uPCh1MzIsIEVycm9yKT4AHwBQRXhwZWN0VHJhbnNhY3RTdGF0dXMEAG0GAThNYXliZUVycm9yQ29kZQAgACxRdWVyeVBhbGxldAgBLG1vZHVsZV9uYW1lOAEcVmVjPHU4PgABNHJlc3BvbnNlX2luZm99BgFEUXVlcnlSZXNwb25zZUluZm8AIQAwRXhwZWN0UGFsbGV0FAEUaW5kZXjUAQx1MzIAARBuYW1lOAEcVmVjPHU4PgABLG1vZHVsZV9uYW1lOAEcVmVjPHU4PgABLGNyYXRlX21ham9y1AEMdTMyAAE8bWluX2NyYXRlX21pbm9y1AEMdTMyACIAUFJlcG9ydFRyYW5zYWN0U3RhdHVzBAB9BgFEUXVlcnlSZXNwb25zZUluZm8AIwBMQ2xlYXJUcmFuc2FjdFN0YXR1cwAkADxVbml2ZXJzYWxPcmlnaW4EANABIEp1bmN0aW9uACUANEV4cG9ydE1lc3NhZ2UMARxuZXR3b3Jr3AEkTmV0d29ya0lkAAEsZGVzdGluYXRpb27MAVRJbnRlcmlvck11bHRpTG9jYXRpb24AAQx4Y20tBgEcWGNtPCgpPgAmACRMb2NrQXNzZXQIARRhc3NldEEGAShNdWx0aUFzc2V0AAEgdW5sb2NrZXLIATRNdWx0aUxvY2F0aW9uACcALFVubG9ja0Fzc2V0CAEUYXNzZXRBBgEoTXVsdGlBc3NldAABGHRhcmdldMgBNE11bHRpTG9jYXRpb24AKAA4Tm90ZVVubG9ja2FibGUIARRhc3NldEEGAShNdWx0aUFzc2V0AAEUb3duZXLIATRNdWx0aUxvY2F0aW9uACkANFJlcXVlc3RVbmxvY2sIARRhc3NldEEGAShNdWx0aUFzc2V0AAEYbG9ja2VyyAE0TXVsdGlMb2NhdGlvbgAqACxTZXRGZWVzTW9kZQQBMGppdF93aXRoZHJhdyABEGJvb2wAKwAgU2V0VG9waWMEAAQBIFt1ODsgMzJdACwAKENsZWFyVG9waWMALQAsQWxpYXNPcmlnaW4EAMgBNE11bHRpTG9jYXRpb24ALgA8VW5wYWlkRXhlY3V0aW9uCAEwd2VpZ2h0X2xpbWl0jQYBLFdlaWdodExpbWl0AAEwY2hlY2tfb3JpZ2ludQYBVE9wdGlvbjxNdWx0aUxvY2F0aW9uPgAvAAA5BhAMeGNtCHYzKG11bHRpYXNzZXQsTXVsdGlBc3NldHMAAAQAPQYBPFZlYzxNdWx0aUFzc2V0PgAAPQYAAAJBBgBBBhAMeGNtCHYzKG11bHRpYXNzZXQoTXVsdGlBc3NldAAACAEIaWTwARxBc3NldElkAAEMZnVuRQYBLEZ1bmdpYmlsaXR5AABFBhAMeGNtCHYzKG11bHRpYXNzZXQsRnVuZ2liaWxpdHkAAQggRnVuZ2libGUEAOQBEHUxMjgAAAAsTm9uRnVuZ2libGUEAEkGATRBc3NldEluc3RhbmNlAAEAAEkGEAx4Y20IdjMobXVsdGlhc3NldDRBc3NldEluc3RhbmNlAAEYJFVuZGVmaW5lZAAAABRJbmRleAQA5AEQdTEyOAABABhBcnJheTQEAEgBHFt1ODsgNF0AAgAYQXJyYXk4BAABBgEcW3U4OyA4XQADABxBcnJheTE2BACoASBbdTg7IDE2XQAEABxBcnJheTMyBAAEASBbdTg7IDMyXQAFAABNBgwMeGNtCHYzIFJlc3BvbnNlAAEYEE51bGwAAAAYQXNzZXRzBAA5BgEsTXVsdGlBc3NldHMAAQA8RXhlY3V0aW9uUmVzdWx0BABRBgFQT3B0aW9uPCh1MzIsIEVycm9yKT4AAgAcVmVyc2lvbgQAEAE4c3VwZXI6OlZlcnNpb24AAwAsUGFsbGV0c0luZm8EAF0GAZhCb3VuZGVkVmVjPFBhbGxldEluZm8sIE1heFBhbGxldHNJbmZvPgAEADhEaXNwYXRjaFJlc3VsdAQAbQYBOE1heWJlRXJyb3JDb2RlAAUAAFEGBBhPcHRpb24EBFQBVQYBCBBOb25lAAAAEFNvbWUEAFUGAAABAABVBgAABAgQWQYAWQYQDHhjbQh2Mxh0cmFpdHMURXJyb3IAAaAgT3ZlcmZsb3cAAAA0VW5pbXBsZW1lbnRlZAABAGBVbnRydXN0ZWRSZXNlcnZlTG9jYXRpb24AAgBkVW50cnVzdGVkVGVsZXBvcnRMb2NhdGlvbgADADBMb2NhdGlvbkZ1bGwABABUTG9jYXRpb25Ob3RJbnZlcnRpYmxlAAUAJEJhZE9yaWdpbgAGADxJbnZhbGlkTG9jYXRpb24ABwA0QXNzZXROb3RGb3VuZAAIAFRGYWlsZWRUb1RyYW5zYWN0QXNzZXQACQA8Tm90V2l0aGRyYXdhYmxlAAoASExvY2F0aW9uQ2Fubm90SG9sZAALAFRFeGNlZWRzTWF4TWVzc2FnZVNpemUADABYRGVzdGluYXRpb25VbnN1cHBvcnRlZAANACRUcmFuc3BvcnQADgAoVW5yb3V0YWJsZQAPADBVbmtub3duQ2xhaW0AEAA4RmFpbGVkVG9EZWNvZGUAEQBATWF4V2VpZ2h0SW52YWxpZAASADhOb3RIb2xkaW5nRmVlcwATADBUb29FeHBlbnNpdmUAFAAQVHJhcAQAMAEMdTY0ABUAQEV4cGVjdGF0aW9uRmFsc2UAFgA4UGFsbGV0Tm90Rm91bmQAFwAwTmFtZU1pc21hdGNoABgATFZlcnNpb25JbmNvbXBhdGlibGUAGQBQSG9sZGluZ1dvdWxkT3ZlcmZsb3cAGgAsRXhwb3J0RXJyb3IAGwA4UmVhbmNob3JGYWlsZWQAHAAYTm9EZWFsAB0AKEZlZXNOb3RNZXQAHgAkTG9ja0Vycm9yAB8AME5vUGVybWlzc2lvbgAgAChVbmFuY2hvcmVkACEAOE5vdERlcG9zaXRhYmxlACIATFVuaGFuZGxlZFhjbVZlcnNpb24AIwBIV2VpZ2h0TGltaXRSZWFjaGVkBAAoARhXZWlnaHQAJAAcQmFycmllcgAlAExXZWlnaHROb3RDb21wdXRhYmxlACYAREV4Y2VlZHNTdGFja0xpbWl0ACcAAF0GDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBYQYEUwAABABpBgEYVmVjPFQ+AABhBgwMeGNtCHYzKFBhbGxldEluZm8AABgBFGluZGV41AEMdTMyAAEQbmFtZWUGAYBCb3VuZGVkVmVjPHU4LCBNYXhQYWxsZXROYW1lTGVuPgABLG1vZHVsZV9uYW1lZQYBgEJvdW5kZWRWZWM8dTgsIE1heFBhbGxldE5hbWVMZW4+AAEUbWFqb3LUAQx1MzIAARRtaW5vctQBDHUzMgABFHBhdGNo1AEMdTMyAABlBgxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAQgEUwAABAA4ARhWZWM8VD4AAGkGAAACYQYAbQYMDHhjbQh2MzhNYXliZUVycm9yQ29kZQABDBxTdWNjZXNzAAAAFEVycm9yBABxBgGMQm91bmRlZFZlYzx1OCwgTWF4RGlzcGF0Y2hFcnJvckxlbj4AAQA4VHJ1bmNhdGVkRXJyb3IEAHEGAYxCb3VuZGVkVmVjPHU4LCBNYXhEaXNwYXRjaEVycm9yTGVuPgACAABxBgxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAQgEUwAABAA4ARhWZWM8VD4AAHUGBBhPcHRpb24EBFQByAEIEE5vbmUAAAAQU29tZQQAyAAAAQAAeQYMDHhjbQh2MyhPcmlnaW5LaW5kAAEQGE5hdGl2ZQAAAEBTb3ZlcmVpZ25BY2NvdW50AAEAJFN1cGVydXNlcgACAAxYY20AAwAAfQYMDHhjbQh2M0RRdWVyeVJlc3BvbnNlSW5mbwAADAEsZGVzdGluYXRpb27IATRNdWx0aUxvY2F0aW9uAAEgcXVlcnlfaWQsARxRdWVyeUlkAAEobWF4X3dlaWdodCgBGFdlaWdodAAAgQYQDHhjbQh2MyhtdWx0aWFzc2V0QE11bHRpQXNzZXRGaWx0ZXIAAQggRGVmaW5pdGUEADkGASxNdWx0aUFzc2V0cwAAABBXaWxkBACFBgE4V2lsZE11bHRpQXNzZXQAAQAAhQYQDHhjbQh2MyhtdWx0aWFzc2V0OFdpbGRNdWx0aUFzc2V0AAEQDEFsbAAAABRBbGxPZggBCGlk8AEcQXNzZXRJZAABDGZ1bokGATxXaWxkRnVuZ2liaWxpdHkAAQAoQWxsQ291bnRlZAQA1AEMdTMyAAIAMEFsbE9mQ291bnRlZAwBCGlk8AEcQXNzZXRJZAABDGZ1bokGATxXaWxkRnVuZ2liaWxpdHkAARRjb3VudNQBDHUzMgADAACJBhAMeGNtCHYzKG11bHRpYXNzZXQ8V2lsZEZ1bmdpYmlsaXR5AAEIIEZ1bmdpYmxlAAAALE5vbkZ1bmdpYmxlAAEAAI0GDAx4Y20IdjMsV2VpZ2h0TGltaXQAAQgkVW5saW1pdGVkAAAAHExpbWl0ZWQEACgBGFdlaWdodAABAACRBgwsc3RhZ2luZ194Y20IdjQMWGNtBBBDYWxsAAAEAJUGAVhWZWM8SW5zdHJ1Y3Rpb248Q2FsbD4+AACVBgAAApkGAJkGDCxzdGFnaW5nX3hjbQh2NCxJbnN0cnVjdGlvbgQQQ2FsbAABwDRXaXRoZHJhd0Fzc2V0BACdBgEYQXNzZXRzAAAAVFJlc2VydmVBc3NldERlcG9zaXRlZAQAnQYBGEFzc2V0cwABAFhSZWNlaXZlVGVsZXBvcnRlZEFzc2V0BACdBgEYQXNzZXRzAAIANFF1ZXJ5UmVzcG9uc2UQASBxdWVyeV9pZCwBHFF1ZXJ5SWQAASByZXNwb25zZbEGASBSZXNwb25zZQABKG1heF93ZWlnaHQoARhXZWlnaHQAARxxdWVyaWVyxQYBQE9wdGlvbjxMb2NhdGlvbj4AAwA0VHJhbnNmZXJBc3NldAgBGGFzc2V0c50GARhBc3NldHMAASxiZW5lZmljaWFyefQBIExvY2F0aW9uAAQAUFRyYW5zZmVyUmVzZXJ2ZUFzc2V0DAEYYXNzZXRznQYBGEFzc2V0cwABEGRlc3T0ASBMb2NhdGlvbgABDHhjbZEGARxYY208KCk+AAUAIFRyYW5zYWN0DAEsb3JpZ2luX2tpbmR5BgEoT3JpZ2luS2luZAABWHJlcXVpcmVfd2VpZ2h0X2F0X21vc3QoARhXZWlnaHQAARBjYWxsGQYBTERvdWJsZUVuY29kZWQ8Q2FsbD4ABgBkSHJtcE5ld0NoYW5uZWxPcGVuUmVxdWVzdAwBGHNlbmRlctQBDHUzMgABQG1heF9tZXNzYWdlX3NpemXUAQx1MzIAATBtYXhfY2FwYWNpdHnUAQx1MzIABwBMSHJtcENoYW5uZWxBY2NlcHRlZAQBJHJlY2lwaWVudNQBDHUzMgAIAEhIcm1wQ2hhbm5lbENsb3NpbmcMASRpbml0aWF0b3LUAQx1MzIAARhzZW5kZXLUAQx1MzIAASRyZWNpcGllbnTUAQx1MzIACQAsQ2xlYXJPcmlnaW4ACgA0RGVzY2VuZE9yaWdpbgQA+AFASW50ZXJpb3JMb2NhdGlvbgALACxSZXBvcnRFcnJvcgQAyQYBRFF1ZXJ5UmVzcG9uc2VJbmZvAAwAMERlcG9zaXRBc3NldAgBGGFzc2V0c80GASxBc3NldEZpbHRlcgABLGJlbmVmaWNpYXJ59AEgTG9jYXRpb24ADQBMRGVwb3NpdFJlc2VydmVBc3NldAwBGGFzc2V0c80GASxBc3NldEZpbHRlcgABEGRlc3T0ASBMb2NhdGlvbgABDHhjbZEGARxYY208KCk+AA4ANEV4Y2hhbmdlQXNzZXQMARBnaXZlzQYBLEFzc2V0RmlsdGVyAAEQd2FudJ0GARhBc3NldHMAARxtYXhpbWFsIAEQYm9vbAAPAFxJbml0aWF0ZVJlc2VydmVXaXRoZHJhdwwBGGFzc2V0c80GASxBc3NldEZpbHRlcgABHHJlc2VydmX0ASBMb2NhdGlvbgABDHhjbZEGARxYY208KCk+ABAAQEluaXRpYXRlVGVsZXBvcnQMARhhc3NldHPNBgEsQXNzZXRGaWx0ZXIAARBkZXN09AEgTG9jYXRpb24AAQx4Y22RBgEcWGNtPCgpPgARADRSZXBvcnRIb2xkaW5nCAE0cmVzcG9uc2VfaW5mb8kGAURRdWVyeVJlc3BvbnNlSW5mbwABGGFzc2V0c80GASxBc3NldEZpbHRlcgASADBCdXlFeGVjdXRpb24IARBmZWVzpQYBFEFzc2V0AAEwd2VpZ2h0X2xpbWl0jQYBLFdlaWdodExpbWl0ABMANFJlZnVuZFN1cnBsdXMAFAA8U2V0RXJyb3JIYW5kbGVyBACRBgEkWGNtPENhbGw+ABUALFNldEFwcGVuZGl4BACRBgEkWGNtPENhbGw+ABYAKENsZWFyRXJyb3IAFwAoQ2xhaW1Bc3NldAgBGGFzc2V0c50GARhBc3NldHMAARh0aWNrZXT0ASBMb2NhdGlvbgAYABBUcmFwBAAsAQx1NjQAGQBAU3Vic2NyaWJlVmVyc2lvbggBIHF1ZXJ5X2lkLAEcUXVlcnlJZAABTG1heF9yZXNwb25zZV93ZWlnaHQoARhXZWlnaHQAGgBIVW5zdWJzY3JpYmVWZXJzaW9uABsAJEJ1cm5Bc3NldAQAnQYBGEFzc2V0cwAcACxFeHBlY3RBc3NldAQAnQYBGEFzc2V0cwAdADBFeHBlY3RPcmlnaW4EAMUGAUBPcHRpb248TG9jYXRpb24+AB4ALEV4cGVjdEVycm9yBABRBgFQT3B0aW9uPCh1MzIsIEVycm9yKT4AHwBQRXhwZWN0VHJhbnNhY3RTdGF0dXMEAG0GAThNYXliZUVycm9yQ29kZQAgACxRdWVyeVBhbGxldAgBLG1vZHVsZV9uYW1lOAEcVmVjPHU4PgABNHJlc3BvbnNlX2luZm/JBgFEUXVlcnlSZXNwb25zZUluZm8AIQAwRXhwZWN0UGFsbGV0FAEUaW5kZXjUAQx1MzIAARBuYW1lOAEcVmVjPHU4PgABLG1vZHVsZV9uYW1lOAEcVmVjPHU4PgABLGNyYXRlX21ham9y1AEMdTMyAAE8bWluX2NyYXRlX21pbm9y1AEMdTMyACIAUFJlcG9ydFRyYW5zYWN0U3RhdHVzBADJBgFEUXVlcnlSZXNwb25zZUluZm8AIwBMQ2xlYXJUcmFuc2FjdFN0YXR1cwAkADxVbml2ZXJzYWxPcmlnaW4EAAEBASBKdW5jdGlvbgAlADRFeHBvcnRNZXNzYWdlDAEcbmV0d29yawkBASROZXR3b3JrSWQAASxkZXN0aW5hdGlvbvgBQEludGVyaW9yTG9jYXRpb24AAQx4Y22RBgEcWGNtPCgpPgAmACRMb2NrQXNzZXQIARRhc3NldKUGARRBc3NldAABIHVubG9ja2Vy9AEgTG9jYXRpb24AJwAsVW5sb2NrQXNzZXQIARRhc3NldKUGARRBc3NldAABGHRhcmdldPQBIExvY2F0aW9uACgAOE5vdGVVbmxvY2thYmxlCAEUYXNzZXSlBgEUQXNzZXQAARRvd25lcvQBIExvY2F0aW9uACkANFJlcXVlc3RVbmxvY2sIARRhc3NldKUGARRBc3NldAABGGxvY2tlcvQBIExvY2F0aW9uACoALFNldEZlZXNNb2RlBAEwaml0X3dpdGhkcmF3IAEQYm9vbAArACBTZXRUb3BpYwQABAEgW3U4OyAzMl0ALAAoQ2xlYXJUb3BpYwAtACxBbGlhc09yaWdpbgQA9AEgTG9jYXRpb24ALgA8VW5wYWlkRXhlY3V0aW9uCAEwd2VpZ2h0X2xpbWl0jQYBLFdlaWdodExpbWl0AAEwY2hlY2tfb3JpZ2luxQYBQE9wdGlvbjxMb2NhdGlvbj4ALwAAnQYQLHN0YWdpbmdfeGNtCHY0FGFzc2V0GEFzc2V0cwAABAChBgEoVmVjPEFzc2V0PgAAoQYAAAKlBgClBhAsc3RhZ2luZ194Y20IdjQUYXNzZXQUQXNzZXQAAAgBCGlkKQEBHEFzc2V0SWQAAQxmdW6pBgEsRnVuZ2liaWxpdHkAAKkGECxzdGFnaW5nX3hjbQh2NBRhc3NldCxGdW5naWJpbGl0eQABCCBGdW5naWJsZQQA5AEQdTEyOAAAACxOb25GdW5naWJsZQQArQYBNEFzc2V0SW5zdGFuY2UAAQAArQYQLHN0YWdpbmdfeGNtCHY0FGFzc2V0NEFzc2V0SW5zdGFuY2UAARgkVW5kZWZpbmVkAAAAFEluZGV4BADkARB1MTI4AAEAGEFycmF5NAQASAEcW3U4OyA0XQACABhBcnJheTgEAAEGARxbdTg7IDhdAAMAHEFycmF5MTYEAKgBIFt1ODsgMTZdAAQAHEFycmF5MzIEAAQBIFt1ODsgMzJdAAUAALEGDCxzdGFnaW5nX3hjbQh2NCBSZXNwb25zZQABGBBOdWxsAAAAGEFzc2V0cwQAnQYBGEFzc2V0cwABADxFeGVjdXRpb25SZXN1bHQEAFEGAVBPcHRpb248KHUzMiwgRXJyb3IpPgACABxWZXJzaW9uBAAQAThzdXBlcjo6VmVyc2lvbgADACxQYWxsZXRzSW5mbwQAtQYBmEJvdW5kZWRWZWM8UGFsbGV0SW5mbywgTWF4UGFsbGV0c0luZm8+AAQAOERpc3BhdGNoUmVzdWx0BABtBgE4TWF5YmVFcnJvckNvZGUABQAAtQYMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAG5BgRTAAAEAMEGARhWZWM8VD4AALkGDCxzdGFnaW5nX3hjbQh2NChQYWxsZXRJbmZvAAAYARRpbmRleNQBDHUzMgABEG5hbWW9BgGAQm91bmRlZFZlYzx1OCwgTWF4UGFsbGV0TmFtZUxlbj4AASxtb2R1bGVfbmFtZb0GAYBCb3VuZGVkVmVjPHU4LCBNYXhQYWxsZXROYW1lTGVuPgABFG1ham9y1AEMdTMyAAEUbWlub3LUAQx1MzIAARRwYXRjaNQBDHUzMgAAvQYMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAEIBFMAAAQAOAEYVmVjPFQ+AADBBgAAArkGAMUGBBhPcHRpb24EBFQB9AEIEE5vbmUAAAAQU29tZQQA9AAAAQAAyQYMLHN0YWdpbmdfeGNtCHY0RFF1ZXJ5UmVzcG9uc2VJbmZvAAAMASxkZXN0aW5hdGlvbvQBIExvY2F0aW9uAAEgcXVlcnlfaWQsARxRdWVyeUlkAAEobWF4X3dlaWdodCgBGFdlaWdodAAAzQYQLHN0YWdpbmdfeGNtCHY0FGFzc2V0LEFzc2V0RmlsdGVyAAEIIERlZmluaXRlBACdBgEYQXNzZXRzAAAAEFdpbGQEANEGASRXaWxkQXNzZXQAAQAA0QYQLHN0YWdpbmdfeGNtCHY0FGFzc2V0JFdpbGRBc3NldAABEAxBbGwAAAAUQWxsT2YIAQhpZCkBARxBc3NldElkAAEMZnVu1QYBPFdpbGRGdW5naWJpbGl0eQABAChBbGxDb3VudGVkBADUAQx1MzIAAgAwQWxsT2ZDb3VudGVkDAEIaWQpAQEcQXNzZXRJZAABDGZ1btUGATxXaWxkRnVuZ2liaWxpdHkAARRjb3VudNQBDHUzMgADAADVBhAsc3RhZ2luZ194Y20IdjQUYXNzZXQ8V2lsZEZ1bmdpYmlsaXR5AAEIIEZ1bmdpYmxlAAAALE5vbkZ1bmdpYmxlAAEAANkGCAx4Y208VmVyc2lvbmVkQXNzZXRzAAEMCFYyBADpBQE8djI6Ok11bHRpQXNzZXRzAAEACFYzBAA5BgE8djM6Ok11bHRpQXNzZXRzAAMACFY0BACdBgEodjQ6OkFzc2V0cwAEAADdBggMeGNtMFZlcnNpb25lZFhjbQQsUnVudGltZUNhbGwAAQwIVjIEAOEGAVB2Mjo6WGNtPFJ1bnRpbWVDYWxsPgACAAhWMwQA8QYBUHYzOjpYY208UnVudGltZUNhbGw+AAMACFY0BAD9BgFQdjQ6OlhjbTxSdW50aW1lQ2FsbD4ABAAA4QYMDHhjbQh2MgxYY20ELFJ1bnRpbWVDYWxsAAAEAOUGAXRWZWM8SW5zdHJ1Y3Rpb248UnVudGltZUNhbGw+PgAA5QYAAALpBgDpBgwMeGNtCHYyLEluc3RydWN0aW9uBCxSdW50aW1lQ2FsbAABcDRXaXRoZHJhd0Fzc2V0BADpBQEsTXVsdGlBc3NldHMAAABUUmVzZXJ2ZUFzc2V0RGVwb3NpdGVkBADpBQEsTXVsdGlBc3NldHMAAQBYUmVjZWl2ZVRlbGVwb3J0ZWRBc3NldAQA6QUBLE11bHRpQXNzZXRzAAIANFF1ZXJ5UmVzcG9uc2UMASBxdWVyeV9pZCwBHFF1ZXJ5SWQAASByZXNwb25zZQUGASBSZXNwb25zZQABKG1heF93ZWlnaHQsAQx1NjQAAwA0VHJhbnNmZXJBc3NldAgBGGFzc2V0c+kFASxNdWx0aUFzc2V0cwABLGJlbmVmaWNpYXJ5MQEBNE11bHRpTG9jYXRpb24ABABQVHJhbnNmZXJSZXNlcnZlQXNzZXQMARhhc3NldHPpBQEsTXVsdGlBc3NldHMAARBkZXN0MQEBNE11bHRpTG9jYXRpb24AAQx4Y23dBQEcWGNtPCgpPgAFACBUcmFuc2FjdAwBLG9yaWdpbl90eXBlFQYBKE9yaWdpbktpbmQAAVhyZXF1aXJlX3dlaWdodF9hdF9tb3N0LAEMdTY0AAEQY2FsbO0GAWhEb3VibGVFbmNvZGVkPFJ1bnRpbWVDYWxsPgAGAGRIcm1wTmV3Q2hhbm5lbE9wZW5SZXF1ZXN0DAEYc2VuZGVy1AEMdTMyAAFAbWF4X21lc3NhZ2Vfc2l6ZdQBDHUzMgABMG1heF9jYXBhY2l0edQBDHUzMgAHAExIcm1wQ2hhbm5lbEFjY2VwdGVkBAEkcmVjaXBpZW501AEMdTMyAAgASEhybXBDaGFubmVsQ2xvc2luZwwBJGluaXRpYXRvctQBDHUzMgABGHNlbmRlctQBDHUzMgABJHJlY2lwaWVudNQBDHUzMgAJACxDbGVhck9yaWdpbgAKADREZXNjZW5kT3JpZ2luBAA1AQFUSW50ZXJpb3JNdWx0aUxvY2F0aW9uAAsALFJlcG9ydEVycm9yDAEgcXVlcnlfaWQsARxRdWVyeUlkAAEQZGVzdDEBATRNdWx0aUxvY2F0aW9uAAFMbWF4X3Jlc3BvbnNlX3dlaWdodCwBDHU2NAAMADBEZXBvc2l0QXNzZXQMARhhc3NldHMdBgFATXVsdGlBc3NldEZpbHRlcgABKG1heF9hc3NldHPUAQx1MzIAASxiZW5lZmljaWFyeTEBATRNdWx0aUxvY2F0aW9uAA0ATERlcG9zaXRSZXNlcnZlQXNzZXQQARhhc3NldHMdBgFATXVsdGlBc3NldEZpbHRlcgABKG1heF9hc3NldHPUAQx1MzIAARBkZXN0MQEBNE11bHRpTG9jYXRpb24AAQx4Y23dBQEcWGNtPCgpPgAOADRFeGNoYW5nZUFzc2V0CAEQZ2l2ZR0GAUBNdWx0aUFzc2V0RmlsdGVyAAEccmVjZWl2ZekFASxNdWx0aUFzc2V0cwAPAFxJbml0aWF0ZVJlc2VydmVXaXRoZHJhdwwBGGFzc2V0cx0GAUBNdWx0aUFzc2V0RmlsdGVyAAEccmVzZXJ2ZTEBATRNdWx0aUxvY2F0aW9uAAEMeGNt3QUBHFhjbTwoKT4AEABASW5pdGlhdGVUZWxlcG9ydAwBGGFzc2V0cx0GAUBNdWx0aUFzc2V0RmlsdGVyAAEQZGVzdDEBATRNdWx0aUxvY2F0aW9uAAEMeGNt3QUBHFhjbTwoKT4AEQAwUXVlcnlIb2xkaW5nEAEgcXVlcnlfaWQsARxRdWVyeUlkAAEQZGVzdDEBATRNdWx0aUxvY2F0aW9uAAEYYXNzZXRzHQYBQE11bHRpQXNzZXRGaWx0ZXIAAUxtYXhfcmVzcG9uc2Vfd2VpZ2h0LAEMdTY0ABIAMEJ1eUV4ZWN1dGlvbggBEGZlZXPxBQEoTXVsdGlBc3NldAABMHdlaWdodF9saW1pdCkGASxXZWlnaHRMaW1pdAATADRSZWZ1bmRTdXJwbHVzABQAPFNldEVycm9ySGFuZGxlcgQA4QYBQFhjbTxSdW50aW1lQ2FsbD4AFQAsU2V0QXBwZW5kaXgEAOEGAUBYY208UnVudGltZUNhbGw+ABYAKENsZWFyRXJyb3IAFwAoQ2xhaW1Bc3NldAgBGGFzc2V0c+kFASxNdWx0aUFzc2V0cwABGHRpY2tldDEBATRNdWx0aUxvY2F0aW9uABgAEFRyYXAEACwBDHU2NAAZAEBTdWJzY3JpYmVWZXJzaW9uCAEgcXVlcnlfaWQsARxRdWVyeUlkAAFMbWF4X3Jlc3BvbnNlX3dlaWdodCwBDHU2NAAaAEhVbnN1YnNjcmliZVZlcnNpb24AGwAA7QYMDHhjbThkb3VibGVfZW5jb2RlZDREb3VibGVFbmNvZGVkBARUAAAEARxlbmNvZGVkOAEcVmVjPHU4PgAA8QYMDHhjbQh2MwxYY20EEENhbGwAAAQA9QYBWFZlYzxJbnN0cnVjdGlvbjxDYWxsPj4AAPUGAAAC+QYA+QYMDHhjbQh2MyxJbnN0cnVjdGlvbgQQQ2FsbAABwDRXaXRoZHJhd0Fzc2V0BAA5BgEsTXVsdGlBc3NldHMAAABUUmVzZXJ2ZUFzc2V0RGVwb3NpdGVkBAA5BgEsTXVsdGlBc3NldHMAAQBYUmVjZWl2ZVRlbGVwb3J0ZWRBc3NldAQAOQYBLE11bHRpQXNzZXRzAAIANFF1ZXJ5UmVzcG9uc2UQASBxdWVyeV9pZCwBHFF1ZXJ5SWQAASByZXNwb25zZU0GASBSZXNwb25zZQABKG1heF93ZWlnaHQoARhXZWlnaHQAARxxdWVyaWVydQYBVE9wdGlvbjxNdWx0aUxvY2F0aW9uPgADADRUcmFuc2ZlckFzc2V0CAEYYXNzZXRzOQYBLE11bHRpQXNzZXRzAAEsYmVuZWZpY2lhcnnIATRNdWx0aUxvY2F0aW9uAAQAUFRyYW5zZmVyUmVzZXJ2ZUFzc2V0DAEYYXNzZXRzOQYBLE11bHRpQXNzZXRzAAEQZGVzdMgBNE11bHRpTG9jYXRpb24AAQx4Y20tBgEcWGNtPCgpPgAFACBUcmFuc2FjdAwBLG9yaWdpbl9raW5keQYBKE9yaWdpbktpbmQAAVhyZXF1aXJlX3dlaWdodF9hdF9tb3N0KAEYV2VpZ2h0AAEQY2FsbO0GAUxEb3VibGVFbmNvZGVkPENhbGw+AAYAZEhybXBOZXdDaGFubmVsT3BlblJlcXVlc3QMARhzZW5kZXLUAQx1MzIAAUBtYXhfbWVzc2FnZV9zaXpl1AEMdTMyAAEwbWF4X2NhcGFjaXR51AEMdTMyAAcATEhybXBDaGFubmVsQWNjZXB0ZWQEASRyZWNpcGllbnTUAQx1MzIACABISHJtcENoYW5uZWxDbG9zaW5nDAEkaW5pdGlhdG9y1AEMdTMyAAEYc2VuZGVy1AEMdTMyAAEkcmVjaXBpZW501AEMdTMyAAkALENsZWFyT3JpZ2luAAoANERlc2NlbmRPcmlnaW4EAMwBVEludGVyaW9yTXVsdGlMb2NhdGlvbgALACxSZXBvcnRFcnJvcgQAfQYBRFF1ZXJ5UmVzcG9uc2VJbmZvAAwAMERlcG9zaXRBc3NldAgBGGFzc2V0c4EGAUBNdWx0aUFzc2V0RmlsdGVyAAEsYmVuZWZpY2lhcnnIATRNdWx0aUxvY2F0aW9uAA0ATERlcG9zaXRSZXNlcnZlQXNzZXQMARhhc3NldHOBBgFATXVsdGlBc3NldEZpbHRlcgABEGRlc3TIATRNdWx0aUxvY2F0aW9uAAEMeGNtLQYBHFhjbTwoKT4ADgA0RXhjaGFuZ2VBc3NldAwBEGdpdmWBBgFATXVsdGlBc3NldEZpbHRlcgABEHdhbnQ5BgEsTXVsdGlBc3NldHMAARxtYXhpbWFsIAEQYm9vbAAPAFxJbml0aWF0ZVJlc2VydmVXaXRoZHJhdwwBGGFzc2V0c4EGAUBNdWx0aUFzc2V0RmlsdGVyAAEccmVzZXJ2ZcgBNE11bHRpTG9jYXRpb24AAQx4Y20tBgEcWGNtPCgpPgAQAEBJbml0aWF0ZVRlbGVwb3J0DAEYYXNzZXRzgQYBQE11bHRpQXNzZXRGaWx0ZXIAARBkZXN0yAE0TXVsdGlMb2NhdGlvbgABDHhjbS0GARxYY208KCk+ABEANFJlcG9ydEhvbGRpbmcIATRyZXNwb25zZV9pbmZvfQYBRFF1ZXJ5UmVzcG9uc2VJbmZvAAEYYXNzZXRzgQYBQE11bHRpQXNzZXRGaWx0ZXIAEgAwQnV5RXhlY3V0aW9uCAEQZmVlc0EGAShNdWx0aUFzc2V0AAEwd2VpZ2h0X2xpbWl0jQYBLFdlaWdodExpbWl0ABMANFJlZnVuZFN1cnBsdXMAFAA8U2V0RXJyb3JIYW5kbGVyBADxBgEkWGNtPENhbGw+ABUALFNldEFwcGVuZGl4BADxBgEkWGNtPENhbGw+ABYAKENsZWFyRXJyb3IAFwAoQ2xhaW1Bc3NldAgBGGFzc2V0czkGASxNdWx0aUFzc2V0cwABGHRpY2tldMgBNE11bHRpTG9jYXRpb24AGAAQVHJhcAQALAEMdTY0ABkAQFN1YnNjcmliZVZlcnNpb24IASBxdWVyeV9pZCwBHFF1ZXJ5SWQAAUxtYXhfcmVzcG9uc2Vfd2VpZ2h0KAEYV2VpZ2h0ABoASFVuc3Vic2NyaWJlVmVyc2lvbgAbACRCdXJuQXNzZXQEADkGASxNdWx0aUFzc2V0cwAcACxFeHBlY3RBc3NldAQAOQYBLE11bHRpQXNzZXRzAB0AMEV4cGVjdE9yaWdpbgQAdQYBVE9wdGlvbjxNdWx0aUxvY2F0aW9uPgAeACxFeHBlY3RFcnJvcgQAUQYBUE9wdGlvbjwodTMyLCBFcnJvcik+AB8AUEV4cGVjdFRyYW5zYWN0U3RhdHVzBABtBgE4TWF5YmVFcnJvckNvZGUAIAAsUXVlcnlQYWxsZXQIASxtb2R1bGVfbmFtZTgBHFZlYzx1OD4AATRyZXNwb25zZV9pbmZvfQYBRFF1ZXJ5UmVzcG9uc2VJbmZvACEAMEV4cGVjdFBhbGxldBQBFGluZGV41AEMdTMyAAEQbmFtZTgBHFZlYzx1OD4AASxtb2R1bGVfbmFtZTgBHFZlYzx1OD4AASxjcmF0ZV9tYWpvctQBDHUzMgABPG1pbl9jcmF0ZV9taW5vctQBDHUzMgAiAFBSZXBvcnRUcmFuc2FjdFN0YXR1cwQAfQYBRFF1ZXJ5UmVzcG9uc2VJbmZvACMATENsZWFyVHJhbnNhY3RTdGF0dXMAJAA8VW5pdmVyc2FsT3JpZ2luBADQASBKdW5jdGlvbgAlADRFeHBvcnRNZXNzYWdlDAEcbmV0d29ya9wBJE5ldHdvcmtJZAABLGRlc3RpbmF0aW9uzAFUSW50ZXJpb3JNdWx0aUxvY2F0aW9uAAEMeGNtLQYBHFhjbTwoKT4AJgAkTG9ja0Fzc2V0CAEUYXNzZXRBBgEoTXVsdGlBc3NldAABIHVubG9ja2VyyAE0TXVsdGlMb2NhdGlvbgAnACxVbmxvY2tBc3NldAgBFGFzc2V0QQYBKE11bHRpQXNzZXQAARh0YXJnZXTIATRNdWx0aUxvY2F0aW9uACgAOE5vdGVVbmxvY2thYmxlCAEUYXNzZXRBBgEoTXVsdGlBc3NldAABFG93bmVyyAE0TXVsdGlMb2NhdGlvbgApADRSZXF1ZXN0VW5sb2NrCAEUYXNzZXRBBgEoTXVsdGlBc3NldAABGGxvY2tlcsgBNE11bHRpTG9jYXRpb24AKgAsU2V0RmVlc01vZGUEATBqaXRfd2l0aGRyYXcgARBib29sACsAIFNldFRvcGljBAAEASBbdTg7IDMyXQAsAChDbGVhclRvcGljAC0ALEFsaWFzT3JpZ2luBADIATRNdWx0aUxvY2F0aW9uAC4APFVucGFpZEV4ZWN1dGlvbggBMHdlaWdodF9saW1pdI0GASxXZWlnaHRMaW1pdAABMGNoZWNrX29yaWdpbnUGAVRPcHRpb248TXVsdGlMb2NhdGlvbj4ALwAA/QYMLHN0YWdpbmdfeGNtCHY0DFhjbQQQQ2FsbAAABAABBwFYVmVjPEluc3RydWN0aW9uPENhbGw+PgAAAQcAAAIFBwAFBwwsc3RhZ2luZ194Y20IdjQsSW5zdHJ1Y3Rpb24EEENhbGwAAcA0V2l0aGRyYXdBc3NldAQAnQYBGEFzc2V0cwAAAFRSZXNlcnZlQXNzZXREZXBvc2l0ZWQEAJ0GARhBc3NldHMAAQBYUmVjZWl2ZVRlbGVwb3J0ZWRBc3NldAQAnQYBGEFzc2V0cwACADRRdWVyeVJlc3BvbnNlEAEgcXVlcnlfaWQsARxRdWVyeUlkAAEgcmVzcG9uc2WxBgEgUmVzcG9uc2UAAShtYXhfd2VpZ2h0KAEYV2VpZ2h0AAEccXVlcmllcsUGAUBPcHRpb248TG9jYXRpb24+AAMANFRyYW5zZmVyQXNzZXQIARhhc3NldHOdBgEYQXNzZXRzAAEsYmVuZWZpY2lhcnn0ASBMb2NhdGlvbgAEAFBUcmFuc2ZlclJlc2VydmVBc3NldAwBGGFzc2V0c50GARhBc3NldHMAARBkZXN09AEgTG9jYXRpb24AAQx4Y22RBgEcWGNtPCgpPgAFACBUcmFuc2FjdAwBLG9yaWdpbl9raW5keQYBKE9yaWdpbktpbmQAAVhyZXF1aXJlX3dlaWdodF9hdF9tb3N0KAEYV2VpZ2h0AAEQY2FsbO0GAUxEb3VibGVFbmNvZGVkPENhbGw+AAYAZEhybXBOZXdDaGFubmVsT3BlblJlcXVlc3QMARhzZW5kZXLUAQx1MzIAAUBtYXhfbWVzc2FnZV9zaXpl1AEMdTMyAAEwbWF4X2NhcGFjaXR51AEMdTMyAAcATEhybXBDaGFubmVsQWNjZXB0ZWQEASRyZWNpcGllbnTUAQx1MzIACABISHJtcENoYW5uZWxDbG9zaW5nDAEkaW5pdGlhdG9y1AEMdTMyAAEYc2VuZGVy1AEMdTMyAAEkcmVjaXBpZW501AEMdTMyAAkALENsZWFyT3JpZ2luAAoANERlc2NlbmRPcmlnaW4EAPgBQEludGVyaW9yTG9jYXRpb24ACwAsUmVwb3J0RXJyb3IEAMkGAURRdWVyeVJlc3BvbnNlSW5mbwAMADBEZXBvc2l0QXNzZXQIARhhc3NldHPNBgEsQXNzZXRGaWx0ZXIAASxiZW5lZmljaWFyefQBIExvY2F0aW9uAA0ATERlcG9zaXRSZXNlcnZlQXNzZXQMARhhc3NldHPNBgEsQXNzZXRGaWx0ZXIAARBkZXN09AEgTG9jYXRpb24AAQx4Y22RBgEcWGNtPCgpPgAOADRFeGNoYW5nZUFzc2V0DAEQZ2l2Zc0GASxBc3NldEZpbHRlcgABEHdhbnSdBgEYQXNzZXRzAAEcbWF4aW1hbCABEGJvb2wADwBcSW5pdGlhdGVSZXNlcnZlV2l0aGRyYXcMARhhc3NldHPNBgEsQXNzZXRGaWx0ZXIAARxyZXNlcnZl9AEgTG9jYXRpb24AAQx4Y22RBgEcWGNtPCgpPgAQAEBJbml0aWF0ZVRlbGVwb3J0DAEYYXNzZXRzzQYBLEFzc2V0RmlsdGVyAAEQZGVzdPQBIExvY2F0aW9uAAEMeGNtkQYBHFhjbTwoKT4AEQA0UmVwb3J0SG9sZGluZwgBNHJlc3BvbnNlX2luZm/JBgFEUXVlcnlSZXNwb25zZUluZm8AARhhc3NldHPNBgEsQXNzZXRGaWx0ZXIAEgAwQnV5RXhlY3V0aW9uCAEQZmVlc6UGARRBc3NldAABMHdlaWdodF9saW1pdI0GASxXZWlnaHRMaW1pdAATADRSZWZ1bmRTdXJwbHVzABQAPFNldEVycm9ySGFuZGxlcgQA/QYBJFhjbTxDYWxsPgAVACxTZXRBcHBlbmRpeAQA/QYBJFhjbTxDYWxsPgAWAChDbGVhckVycm9yABcAKENsYWltQXNzZXQIARhhc3NldHOdBgEYQXNzZXRzAAEYdGlja2V09AEgTG9jYXRpb24AGAAQVHJhcAQALAEMdTY0ABkAQFN1YnNjcmliZVZlcnNpb24IASBxdWVyeV9pZCwBHFF1ZXJ5SWQAAUxtYXhfcmVzcG9uc2Vfd2VpZ2h0KAEYV2VpZ2h0ABoASFVuc3Vic2NyaWJlVmVyc2lvbgAbACRCdXJuQXNzZXQEAJ0GARhBc3NldHMAHAAsRXhwZWN0QXNzZXQEAJ0GARhBc3NldHMAHQAwRXhwZWN0T3JpZ2luBADFBgFAT3B0aW9uPExvY2F0aW9uPgAeACxFeHBlY3RFcnJvcgQAUQYBUE9wdGlvbjwodTMyLCBFcnJvcik+AB8AUEV4cGVjdFRyYW5zYWN0U3RhdHVzBABtBgE4TWF5YmVFcnJvckNvZGUAIAAsUXVlcnlQYWxsZXQIASxtb2R1bGVfbmFtZTgBHFZlYzx1OD4AATRyZXNwb25zZV9pbmZvyQYBRFF1ZXJ5UmVzcG9uc2VJbmZvACEAMEV4cGVjdFBhbGxldBQBFGluZGV41AEMdTMyAAEQbmFtZTgBHFZlYzx1OD4AASxtb2R1bGVfbmFtZTgBHFZlYzx1OD4AASxjcmF0ZV9tYWpvctQBDHUzMgABPG1pbl9jcmF0ZV9taW5vctQBDHUzMgAiAFBSZXBvcnRUcmFuc2FjdFN0YXR1cwQAyQYBRFF1ZXJ5UmVzcG9uc2VJbmZvACMATENsZWFyVHJhbnNhY3RTdGF0dXMAJAA8VW5pdmVyc2FsT3JpZ2luBAABAQEgSnVuY3Rpb24AJQA0RXhwb3J0TWVzc2FnZQwBHG5ldHdvcmsJAQEkTmV0d29ya0lkAAEsZGVzdGluYXRpb274AUBJbnRlcmlvckxvY2F0aW9uAAEMeGNtkQYBHFhjbTwoKT4AJgAkTG9ja0Fzc2V0CAEUYXNzZXSlBgEUQXNzZXQAASB1bmxvY2tlcvQBIExvY2F0aW9uACcALFVubG9ja0Fzc2V0CAEUYXNzZXSlBgEUQXNzZXQAARh0YXJnZXT0ASBMb2NhdGlvbgAoADhOb3RlVW5sb2NrYWJsZQgBFGFzc2V0pQYBFEFzc2V0AAEUb3duZXL0ASBMb2NhdGlvbgApADRSZXF1ZXN0VW5sb2NrCAEUYXNzZXSlBgEUQXNzZXQAARhsb2NrZXL0ASBMb2NhdGlvbgAqACxTZXRGZWVzTW9kZQQBMGppdF93aXRoZHJhdyABEGJvb2wAKwAgU2V0VG9waWMEAAQBIFt1ODsgMzJdACwAKENsZWFyVG9waWMALQAsQWxpYXNPcmlnaW4EAPQBIExvY2F0aW9uAC4APFVucGFpZEV4ZWN1dGlvbggBMHdlaWdodF9saW1pdI0GASxXZWlnaHRMaW1pdAABMGNoZWNrX29yaWdpbsUGAUBPcHRpb248TG9jYXRpb24+AC8AAAkHEFBzdGFnaW5nX3hjbV9leGVjdXRvchh0cmFpdHM4YXNzZXRfdHJhbnNmZXIwVHJhbnNmZXJUeXBlAAEQIFRlbGVwb3J0AAAAMExvY2FsUmVzZXJ2ZQABAEhEZXN0aW5hdGlvblJlc2VydmUAAgA0UmVtb3RlUmVzZXJ2ZQQALQEBRFZlcnNpb25lZExvY2F0aW9uAAMAAA0HCAx4Y21AVmVyc2lvbmVkQXNzZXRJZAABCAhWMwQA8AEsdjM6OkFzc2V0SWQAAwAIVjQEACkBASx2NDo6QXNzZXRJZAAEAAARBwxQcGFsbGV0X21lc3NhZ2VfcXVldWUYcGFsbGV0EENhbGwEBFQAAQgkcmVhcF9wYWdlCAE4bWVzc2FnZV9vcmlnaW4VBwFITWVzc2FnZU9yaWdpbk9mPFQ+AAEocGFnZV9pbmRleBABJFBhZ2VJbmRleAAABD0BUmVtb3ZlIGEgcGFnZSB3aGljaCBoYXMgbm8gbW9yZSBtZXNzYWdlcyByZW1haW5pbmcgdG8gYmUgcHJvY2Vzc2VkIG9yIGlzIHN0YWxlLkhleGVjdXRlX292ZXJ3ZWlnaHQQAThtZXNzYWdlX29yaWdpbhUHAUhNZXNzYWdlT3JpZ2luT2Y8VD4AARBwYWdlEAEkUGFnZUluZGV4AAEUaW5kZXgQARxUOjpTaXplAAEwd2VpZ2h0X2xpbWl0KAEYV2VpZ2h0AAE0eEV4ZWN1dGUgYW4gb3ZlcndlaWdodCBtZXNzYWdlLgBNAVRlbXBvcmFyeSBwcm9jZXNzaW5nIGVycm9ycyB3aWxsIGJlIHByb3BhZ2F0ZWQgd2hlcmVhcyBwZXJtYW5lbnQgZXJyb3JzIGFyZSB0cmVhdGVkVGFzIHN1Y2Nlc3MgY29uZGl0aW9uLgB0LSBgb3JpZ2luYDogTXVzdCBiZSBgU2lnbmVkYC41AS0gYG1lc3NhZ2Vfb3JpZ2luYDogVGhlIG9yaWdpbiBmcm9tIHdoaWNoIHRoZSBtZXNzYWdlIHRvIGJlIGV4ZWN1dGVkIGFycml2ZWQuPQEtIGBwYWdlYDogVGhlIHBhZ2UgaW4gdGhlIHF1ZXVlIGluIHdoaWNoIHRoZSBtZXNzYWdlIHRvIGJlIGV4ZWN1dGVkIGlzIHNpdHRpbmcuCQEtIGBpbmRleGA6IFRoZSBpbmRleCBpbnRvIHRoZSBxdWV1ZSBvZiB0aGUgbWVzc2FnZSB0byBiZSBleGVjdXRlZC5ZAS0gYHdlaWdodF9saW1pdGA6IFRoZSBtYXhpbXVtIGFtb3VudCBvZiB3ZWlnaHQgYWxsb3dlZCB0byBiZSBjb25zdW1lZCBpbiB0aGUgZXhlY3V0aW9uRCAgb2YgdGhlIG1lc3NhZ2UuAPRCZW5jaG1hcmsgY29tcGxleGl0eSBjb25zaWRlcmF0aW9uczogTyhpbmRleCArIHdlaWdodF9saW1pdCkuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLhUHDGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMkaW5jbHVzaW9uWEFnZ3JlZ2F0ZU1lc3NhZ2VPcmlnaW4AAQQMVW1wBAAZBwEoVW1wUXVldWVJZAAAAAAZBwxscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zJGluY2x1c2lvbihVbXBRdWV1ZUlkAAEEEFBhcmEEAGkCARhQYXJhSWQAAAAAHQcMRHBhbGxldF9hc3NldF9yYXRlGHBhbGxldBBDYWxsBARUAAEMGGNyZWF0ZQgBKGFzc2V0X2tpbmTEAURCb3g8VDo6QXNzZXRLaW5kPgABEHJhdGUhBwEkRml4ZWRVMTI4AAAQDQFJbml0aWFsaXplIGEgY29udmVyc2lvbiByYXRlIHRvIG5hdGl2ZSBiYWxhbmNlIGZvciB0aGUgZ2l2ZW4gYXNzZXQuADQjIyBDb21wbGV4aXR5GC0gTygxKRh1cGRhdGUIAShhc3NldF9raW5kxAFEQm94PFQ6OkFzc2V0S2luZD4AARByYXRlIQcBJEZpeGVkVTEyOAABEAUBVXBkYXRlIHRoZSBjb252ZXJzaW9uIHJhdGUgdG8gbmF0aXZlIGJhbGFuY2UgZm9yIHRoZSBnaXZlbiBhc3NldC4ANCMjIENvbXBsZXhpdHkYLSBPKDEpGHJlbW92ZQQBKGFzc2V0X2tpbmTEAURCb3g8VDo6QXNzZXRLaW5kPgACECUBUmVtb3ZlIGFuIGV4aXN0aW5nIGNvbnZlcnNpb24gcmF0ZSB0byBuYXRpdmUgYmFsYW5jZSBmb3IgdGhlIGdpdmVuIGFzc2V0LgA0IyMgQ29tcGxleGl0eRgtIE8oMSkEDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMuIQcMNHNwX2FyaXRobWV0aWMsZml4ZWRfcG9pbnQkRml4ZWRVMTI4AAAEABgBEHUxMjgAACUHDDBwYWxsZXRfYmVlZnkYcGFsbGV0EENhbGwEBFQAAQxMcmVwb3J0X2VxdWl2b2NhdGlvbggBSGVxdWl2b2NhdGlvbl9wcm9vZikHAY0BQm94PERvdWJsZVZvdGluZ1Byb29mPEJsb2NrTnVtYmVyRm9yPFQ+LCBUOjpCZWVmeUlkLDxUOjpCZWVmeUlkCmFzIFJ1bnRpbWVBcHBQdWJsaWM+OjpTaWduYXR1cmUsPiw+AAE8a2V5X293bmVyX3Byb29mhQEBQFQ6OktleU93bmVyUHJvb2YAABAJAVJlcG9ydCB2b3RlciBlcXVpdm9jYXRpb24vbWlzYmVoYXZpb3IuIFRoaXMgbWV0aG9kIHdpbGwgdmVyaWZ5IHRoZfRlcXVpdm9jYXRpb24gcHJvb2YgYW5kIHZhbGlkYXRlIHRoZSBnaXZlbiBrZXkgb3duZXJzaGlwIHByb29m+GFnYWluc3QgdGhlIGV4dHJhY3RlZCBvZmZlbmRlci4gSWYgYm90aCBhcmUgdmFsaWQsIHRoZSBvZmZlbmNlRHdpbGwgYmUgcmVwb3J0ZWQucHJlcG9ydF9lcXVpdm9jYXRpb25fdW5zaWduZWQIAUhlcXVpdm9jYXRpb25fcHJvb2YpBwGNAUJveDxEb3VibGVWb3RpbmdQcm9vZjxCbG9ja051bWJlckZvcjxUPiwgVDo6QmVlZnlJZCw8VDo6QmVlZnlJZAphcyBSdW50aW1lQXBwUHVibGljPjo6U2lnbmF0dXJlLD4sPgABPGtleV9vd25lcl9wcm9vZoUBAUBUOjpLZXlPd25lclByb29mAAEkCQFSZXBvcnQgdm90ZXIgZXF1aXZvY2F0aW9uL21pc2JlaGF2aW9yLiBUaGlzIG1ldGhvZCB3aWxsIHZlcmlmeSB0aGX0ZXF1aXZvY2F0aW9uIHByb29mIGFuZCB2YWxpZGF0ZSB0aGUgZ2l2ZW4ga2V5IG93bmVyc2hpcCBwcm9vZvhhZ2FpbnN0IHRoZSBleHRyYWN0ZWQgb2ZmZW5kZXIuIElmIGJvdGggYXJlIHZhbGlkLCB0aGUgb2ZmZW5jZUR3aWxsIGJlIHJlcG9ydGVkLgANAVRoaXMgZXh0cmluc2ljIG11c3QgYmUgY2FsbGVkIHVuc2lnbmVkIGFuZCBpdCBpcyBleHBlY3RlZCB0aGF0IG9ubHkVAWJsb2NrIGF1dGhvcnMgd2lsbCBjYWxsIGl0ICh2YWxpZGF0ZWQgaW4gYFZhbGlkYXRlVW5zaWduZWRgKSwgYXMgc3VjaBUBaWYgdGhlIGJsb2NrIGF1dGhvciBpcyBkZWZpbmVkIGl0IHdpbGwgYmUgZGVmaW5lZCBhcyB0aGUgZXF1aXZvY2F0aW9uJHJlcG9ydGVyLjxzZXRfbmV3X2dlbmVzaXMEATxkZWxheV9pbl9ibG9ja3MQAURCbG9ja051bWJlckZvcjxUPgACEF0BUmVzZXQgQkVFRlkgY29uc2Vuc3VzIGJ5IHNldHRpbmcgYSBuZXcgQkVFRlkgZ2VuZXNpcyBhdCBgZGVsYXlfaW5fYmxvY2tzYCBibG9ja3MgaW4gdGhlHGZ1dHVyZS4AtE5vdGU6IGBkZWxheV9pbl9ibG9ja3NgIGhhcyB0byBiZSBhdCBsZWFzdCAxLgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy4pBwhIc3BfY29uc2Vuc3VzX2JlZWZ5RERvdWJsZVZvdGluZ1Byb29mDBhOdW1iZXIBEAhJZAEFAiRTaWduYXR1cmUBLQcACAEUZmlyc3QxBwGIVm90ZU1lc3NhZ2U8TnVtYmVyLCBJZCwgU2lnbmF0dXJlPgABGHNlY29uZDEHAYhWb3RlTWVzc2FnZTxOdW1iZXIsIElkLCBTaWduYXR1cmU+AAAtBwxIc3BfY29uc2Vuc3VzX2JlZWZ5MGVjZHNhX2NyeXB0byRTaWduYXR1cmUAAAQAvQIBQGVjZHNhOjpTaWduYXR1cmUAADEHCEhzcF9jb25zZW5zdXNfYmVlZnksVm90ZU1lc3NhZ2UMGE51bWJlcgEQCElkAQUCJFNpZ25hdHVyZQEtBwAMAShjb21taXRtZW50NQcBSENvbW1pdG1lbnQ8TnVtYmVyPgABCGlkBQIBCElkAAEkc2lnbmF0dXJlLQcBJFNpZ25hdHVyZQAANQcMSHNwX2NvbnNlbnN1c19iZWVmeShjb21taXRtZW50KENvbW1pdG1lbnQEMFRCbG9ja051bWJlcgEQAAwBHHBheWxvYWQ5BwEcUGF5bG9hZAABMGJsb2NrX251bWJlchABMFRCbG9ja051bWJlcgABQHZhbGlkYXRvcl9zZXRfaWQwAThWYWxpZGF0b3JTZXRJZAAAOQcMSHNwX2NvbnNlbnN1c19iZWVmeRxwYXlsb2FkHFBheWxvYWQAAAQAPQcBeFZlYzwoQmVlZnlQYXlsb2FkSWQsIFZlYzx1OD4pPgAAPQcAAAJBBwBBBwAABAhFBzgARQcAAAMCAAAACABJBwwoc3BfcnVudGltZRh0cmFpdHMsQmxha2VUd28yNTYAAAAATQcMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAEIBFMAAAQAOAEYVmVjPFQ+AABRBwxgcGFsbGV0X2NvbnZpY3Rpb25fdm90aW5nFHR5cGVzFFRhbGx5CBRWb3RlcwEYFFRvdGFsAAAMARBheWVzGAEUVm90ZXMAARBuYXlzGAEUVm90ZXMAARxzdXBwb3J0GAEUVm90ZXMAAFUHDGBwYWxsZXRfcmFua2VkX2NvbGxlY3RpdmUYcGFsbGV0FEV2ZW50CARUAARJAAEULE1lbWJlckFkZGVkBAEMd2hvAAEwVDo6QWNjb3VudElkAAAEeEEgbWVtYmVyIGB3aG9gIGhhcyBiZWVuIGFkZGVkLixSYW5rQ2hhbmdlZAgBDHdobwABMFQ6OkFjY291bnRJZAABEHJhbmtVAQEQUmFuawABBPRUaGUgbWVtYmVyIGB3aG9gc2UgcmFuayBoYXMgYmVlbiBjaGFuZ2VkIHRvIHRoZSBnaXZlbiBgcmFua2AuNE1lbWJlclJlbW92ZWQIAQx3aG8AATBUOjpBY2NvdW50SWQAARByYW5rVQEBEFJhbmsAAgQZAVRoZSBtZW1iZXIgYHdob2Agb2YgZ2l2ZW4gYHJhbmtgIGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgY29sbGVjdGl2ZS4UVm90ZWQQAQx3aG8AATBUOjpBY2NvdW50SWQAARBwb2xsEAFEUG9sbEluZGV4T2Y8VCwgST4AARB2b3RlWQcBKFZvdGVSZWNvcmQAARR0YWxseV0HATRUYWxseU9mPFQsIEk+AAMIVQFUaGUgbWVtYmVyIGB3aG9gIGhhcyB2b3RlZCBmb3IgdGhlIGBwb2xsYCB3aXRoIHRoZSBnaXZlbiBgdm90ZWAgbGVhZGluZyB0byBhbiB1cGRhdGVkIGB0YWxseWAuPE1lbWJlckV4Y2hhbmdlZAgBDHdobwABMFQ6OkFjY291bnRJZAABHG5ld193aG8AATBUOjpBY2NvdW50SWQABATwVGhlIG1lbWJlciBgd2hvYCBoYWQgdGhlaXIgYEFjY291bnRJZGAgY2hhbmdlZCB0byBgbmV3X3dob2AuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0WQcIYHBhbGxldF9yYW5rZWRfY29sbGVjdGl2ZShWb3RlUmVjb3JkAAEIDEF5ZQQAEAEUVm90ZXMAAAAMTmF5BAAQARRWb3RlcwABAABdBwhgcGFsbGV0X3JhbmtlZF9jb2xsZWN0aXZlFFRhbGx5DARUAARJAARNAAAMASRiYXJlX2F5ZXMQASxNZW1iZXJJbmRleAABEGF5ZXMQARRWb3RlcwABEG5heXMQARRWb3RlcwAAYQcMQHBhbGxldF9yZWZlcmVuZGEYcGFsbGV0FEV2ZW50CARUAARJAAFAJFN1Ym1pdHRlZAwBFGluZGV4EAE8UmVmZXJlbmR1bUluZGV4BGBJbmRleCBvZiB0aGUgcmVmZXJlbmR1bS4BFHRyYWNrVQEBPFRyYWNrSWRPZjxULCBJPgQlAVRoZSB0cmFjayAoYW5kIGJ5IGV4dGVuc2lvbiBwcm9wb3NhbCBkaXNwYXRjaCBvcmlnaW4pIG9mIHRoaXMgcmVmZXJlbmR1bS4BIHByb3Bvc2FsWQEBTEJvdW5kZWRDYWxsT2Y8VCwgST4EgFRoZSBwcm9wb3NhbCBmb3IgdGhlIHJlZmVyZW5kdW0uAASAQSByZWZlcmVuZHVtIGhhcyBiZWVuIHN1Ym1pdHRlZC5URGVjaXNpb25EZXBvc2l0UGxhY2VkDAEUaW5kZXgQATxSZWZlcmVuZHVtSW5kZXgEYEluZGV4IG9mIHRoZSByZWZlcmVuZHVtLgEMd2hvAAEwVDo6QWNjb3VudElkBIxUaGUgYWNjb3VudCB3aG8gcGxhY2VkIHRoZSBkZXBvc2l0LgEYYW1vdW50GAE8QmFsYW5jZU9mPFQsIEk+BIRUaGUgYW1vdW50IHBsYWNlZCBieSB0aGUgYWNjb3VudC4BBJRUaGUgZGVjaXNpb24gZGVwb3NpdCBoYXMgYmVlbiBwbGFjZWQuXERlY2lzaW9uRGVwb3NpdFJlZnVuZGVkDAEUaW5kZXgQATxSZWZlcmVuZHVtSW5kZXgEYEluZGV4IG9mIHRoZSByZWZlcmVuZHVtLgEMd2hvAAEwVDo6QWNjb3VudElkBIxUaGUgYWNjb3VudCB3aG8gcGxhY2VkIHRoZSBkZXBvc2l0LgEYYW1vdW50GAE8QmFsYW5jZU9mPFQsIEk+BIRUaGUgYW1vdW50IHBsYWNlZCBieSB0aGUgYWNjb3VudC4CBJxUaGUgZGVjaXNpb24gZGVwb3NpdCBoYXMgYmVlbiByZWZ1bmRlZC44RGVwb3NpdFNsYXNoZWQIAQx3aG8AATBUOjpBY2NvdW50SWQEjFRoZSBhY2NvdW50IHdobyBwbGFjZWQgdGhlIGRlcG9zaXQuARhhbW91bnQYATxCYWxhbmNlT2Y8VCwgST4EhFRoZSBhbW91bnQgcGxhY2VkIGJ5IHRoZSBhY2NvdW50LgMEbEEgZGVwb3NpdCBoYXMgYmVlbiBzbGFzaGVkLjxEZWNpc2lvblN0YXJ0ZWQQARRpbmRleBABPFJlZmVyZW5kdW1JbmRleARgSW5kZXggb2YgdGhlIHJlZmVyZW5kdW0uARR0cmFja1UBATxUcmFja0lkT2Y8VCwgST4EJQFUaGUgdHJhY2sgKGFuZCBieSBleHRlbnNpb24gcHJvcG9zYWwgZGlzcGF0Y2ggb3JpZ2luKSBvZiB0aGlzIHJlZmVyZW5kdW0uASBwcm9wb3NhbFkBAUxCb3VuZGVkQ2FsbE9mPFQsIEk+BIBUaGUgcHJvcG9zYWwgZm9yIHRoZSByZWZlcmVuZHVtLgEUdGFsbHldBwEgVDo6VGFsbHkEuFRoZSBjdXJyZW50IHRhbGx5IG9mIHZvdGVzIGluIHRoaXMgcmVmZXJlbmR1bS4EBLxBIHJlZmVyZW5kdW0gaGFzIG1vdmVkIGludG8gdGhlIGRlY2lkaW5nIHBoYXNlLjhDb25maXJtU3RhcnRlZAQBFGluZGV4EAE8UmVmZXJlbmR1bUluZGV4BGBJbmRleCBvZiB0aGUgcmVmZXJlbmR1bS4FADhDb25maXJtQWJvcnRlZAQBFGluZGV4EAE8UmVmZXJlbmR1bUluZGV4BGBJbmRleCBvZiB0aGUgcmVmZXJlbmR1bS4GACRDb25maXJtZWQIARRpbmRleBABPFJlZmVyZW5kdW1JbmRleARgSW5kZXggb2YgdGhlIHJlZmVyZW5kdW0uARR0YWxseV0HASBUOjpUYWxseQSwVGhlIGZpbmFsIHRhbGx5IG9mIHZvdGVzIGluIHRoaXMgcmVmZXJlbmR1bS4HBCEBQSByZWZlcmVuZHVtIGhhcyBlbmRlZCBpdHMgY29uZmlybWF0aW9uIHBoYXNlIGFuZCBpcyByZWFkeSBmb3IgYXBwcm92YWwuIEFwcHJvdmVkBAEUaW5kZXgQATxSZWZlcmVuZHVtSW5kZXgEYEluZGV4IG9mIHRoZSByZWZlcmVuZHVtLggEDQFBIHJlZmVyZW5kdW0gaGFzIGJlZW4gYXBwcm92ZWQgYW5kIGl0cyBwcm9wb3NhbCBoYXMgYmVlbiBzY2hlZHVsZWQuIFJlamVjdGVkCAEUaW5kZXgQATxSZWZlcmVuZHVtSW5kZXgEYEluZGV4IG9mIHRoZSByZWZlcmVuZHVtLgEUdGFsbHldBwEgVDo6VGFsbHkEsFRoZSBmaW5hbCB0YWxseSBvZiB2b3RlcyBpbiB0aGlzIHJlZmVyZW5kdW0uCQSsQSBwcm9wb3NhbCBoYXMgYmVlbiByZWplY3RlZCBieSByZWZlcmVuZHVtLiBUaW1lZE91dAgBFGluZGV4EAE8UmVmZXJlbmR1bUluZGV4BGBJbmRleCBvZiB0aGUgcmVmZXJlbmR1bS4BFHRhbGx5XQcBIFQ6OlRhbGx5BLBUaGUgZmluYWwgdGFsbHkgb2Ygdm90ZXMgaW4gdGhpcyByZWZlcmVuZHVtLgoE2EEgcmVmZXJlbmR1bSBoYXMgYmVlbiB0aW1lZCBvdXQgd2l0aG91dCBiZWluZyBkZWNpZGVkLiRDYW5jZWxsZWQIARRpbmRleBABPFJlZmVyZW5kdW1JbmRleARgSW5kZXggb2YgdGhlIHJlZmVyZW5kdW0uARR0YWxseV0HASBUOjpUYWxseQSwVGhlIGZpbmFsIHRhbGx5IG9mIHZvdGVzIGluIHRoaXMgcmVmZXJlbmR1bS4LBIBBIHJlZmVyZW5kdW0gaGFzIGJlZW4gY2FuY2VsbGVkLhhLaWxsZWQIARRpbmRleBABPFJlZmVyZW5kdW1JbmRleARgSW5kZXggb2YgdGhlIHJlZmVyZW5kdW0uARR0YWxseV0HASBUOjpUYWxseQSwVGhlIGZpbmFsIHRhbGx5IG9mIHZvdGVzIGluIHRoaXMgcmVmZXJlbmR1bS4MBHRBIHJlZmVyZW5kdW0gaGFzIGJlZW4ga2lsbGVkLmRTdWJtaXNzaW9uRGVwb3NpdFJlZnVuZGVkDAEUaW5kZXgQATxSZWZlcmVuZHVtSW5kZXgEYEluZGV4IG9mIHRoZSByZWZlcmVuZHVtLgEMd2hvAAEwVDo6QWNjb3VudElkBIxUaGUgYWNjb3VudCB3aG8gcGxhY2VkIHRoZSBkZXBvc2l0LgEYYW1vdW50GAE8QmFsYW5jZU9mPFQsIEk+BIRUaGUgYW1vdW50IHBsYWNlZCBieSB0aGUgYWNjb3VudC4NBKRUaGUgc3VibWlzc2lvbiBkZXBvc2l0IGhhcyBiZWVuIHJlZnVuZGVkLixNZXRhZGF0YVNldAgBFGluZGV4EAE8UmVmZXJlbmR1bUluZGV4BGBJbmRleCBvZiB0aGUgcmVmZXJlbmR1bS4BEGhhc2g0ARxUOjpIYXNoBDhQcmVpbWFnZSBoYXNoLg4EnE1ldGFkYXRhIGZvciBhIHJlZmVyZW5kdW0gaGFzIGJlZW4gc2V0LjxNZXRhZGF0YUNsZWFyZWQIARRpbmRleBABPFJlZmVyZW5kdW1JbmRleARgSW5kZXggb2YgdGhlIHJlZmVyZW5kdW0uARBoYXNoNAEcVDo6SGFzaAQ4UHJlaW1hZ2UgaGFzaC4PBKxNZXRhZGF0YSBmb3IgYSByZWZlcmVuZHVtIGhhcyBiZWVuIGNsZWFyZWQuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0ZQcMQHBhbGxldF93aGl0ZWxpc3QYcGFsbGV0FEV2ZW50BARUAAEMPENhbGxXaGl0ZWxpc3RlZAQBJGNhbGxfaGFzaDQBHFQ6Okhhc2gAAABYV2hpdGVsaXN0ZWRDYWxsUmVtb3ZlZAQBJGNhbGxfaGFzaDQBHFQ6Okhhc2gAAQBkV2hpdGVsaXN0ZWRDYWxsRGlzcGF0Y2hlZAgBJGNhbGxfaGFzaDQBHFQ6Okhhc2gAARhyZXN1bHRpBwFoRGlzcGF0Y2hSZXN1bHRXaXRoUG9zdEluZm8AAgAEfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXRpBwQYUmVzdWx0CARUAW0HBEUBdQcBCAhPawQAbQcAAAAADEVycgQAdQcAAAEAAG0HDDRmcmFtZV9zdXBwb3J0IGRpc3BhdGNoQFBvc3REaXNwYXRjaEluZm8AAAgBNGFjdHVhbF93ZWlnaHRxBwE4T3B0aW9uPFdlaWdodD4AASBwYXlzX2ZlZWQBEFBheXMAAHEHBBhPcHRpb24EBFQBKAEIEE5vbmUAAAAQU29tZQQAKAAAAQAAdQcIKHNwX3J1bnRpbWVkRGlzcGF0Y2hFcnJvcldpdGhQb3N0SW5mbwQQSW5mbwFtBwAIASRwb3N0X2luZm9tBwEQSW5mbwABFGVycm9yaAE0RGlzcGF0Y2hFcnJvcgAAeQcMRHBhbGxldF9wYXJhbWV0ZXJzGHBhbGxldBRFdmVudAQEVAABBBxVcGRhdGVkDAEMa2V5fQcBxDxUOjpSdW50aW1lUGFyYW1ldGVycyBhcyBBZ2dyZWdhdGVkS2V5VmFsdWU+OjpLZXkEZFRoZSBrZXkgdGhhdCB3YXMgdXBkYXRlZC4BJG9sZF92YWx1ZYUHAexPcHRpb248PFQ6OlJ1bnRpbWVQYXJhbWV0ZXJzIGFzIEFnZ3JlZ2F0ZWRLZXlWYWx1ZT46OlZhbHVlPgR8VGhlIG9sZCB2YWx1ZSBiZWZvcmUgdGhpcyBjYWxsLgEkbmV3X3ZhbHVlhQcB7E9wdGlvbjw8VDo6UnVudGltZVBhcmFtZXRlcnMgYXMgQWdncmVnYXRlZEtleVZhbHVlPjo6VmFsdWU+BHhUaGUgbmV3IHZhbHVlIGFmdGVyIHRoaXMgY2FsbC4ADFBBIFBhcmFtZXRlciB3YXMgc2V0LgC8SXMgYWxzbyBlbWl0dGVkIHdoZW4gdGhlIHZhbHVlIHdhcyBub3QgY2hhbmdlZC4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXR9BwhYc3RhZ2luZ19rdXNhbWFfcnVudGltZVBSdW50aW1lUGFyYW1ldGVyc0tleQABBCRJbmZsYXRpb24EAIEHAakBPGR5bmFtaWNfcGFyYW1zOjppbmZsYXRpb246OlBhcmFtZXRlcnMgYXMgZnJhbWVfc3VwcG9ydDo6dHJhaXRzOjoKZHluYW1pY19wYXJhbXM6OkFnZ3JlZ2F0ZWRLZXlWYWx1ZT46OktleQAAAACBBxBYc3RhZ2luZ19rdXNhbWFfcnVudGltZThkeW5hbWljX3BhcmFtcyRpbmZsYXRpb240UGFyYW1ldGVyc0tleQABFDBNaW5JbmZsYXRpb24EAJUCATBNaW5JbmZsYXRpb24AAAAwTWF4SW5mbGF0aW9uBAChAgEwTWF4SW5mbGF0aW9uAAEAKElkZWFsU3Rha2UEAKUCAShJZGVhbFN0YWtlAAIAHEZhbGxvZmYEAKkCARxGYWxsb2ZmAAMAPFVzZUF1Y3Rpb25TbG90cwQArQIBPFVzZUF1Y3Rpb25TbG90cwAEAACFBwQYT3B0aW9uBARUAYkHAQgQTm9uZQAAABBTb21lBACJBwAAAQAAiQcIWHN0YWdpbmdfa3VzYW1hX3J1bnRpbWVYUnVudGltZVBhcmFtZXRlcnNWYWx1ZQABBCRJbmZsYXRpb24EAI0HAbEBPGR5bmFtaWNfcGFyYW1zOjppbmZsYXRpb246OlBhcmFtZXRlcnMgYXMgZnJhbWVfc3VwcG9ydDo6dHJhaXRzOjoKZHluYW1pY19wYXJhbXM6OkFnZ3JlZ2F0ZWRLZXlWYWx1ZT46OlZhbHVlAAAAAI0HEFhzdGFnaW5nX2t1c2FtYV9ydW50aW1lOGR5bmFtaWNfcGFyYW1zJGluZmxhdGlvbjxQYXJhbWV0ZXJzVmFsdWUAARQwTWluSW5mbGF0aW9uBACdAgEsUGVycXVpbnRpbGwAAAAwTWF4SW5mbGF0aW9uBACdAgEsUGVycXVpbnRpbGwAAQAoSWRlYWxTdGFrZQQAnQIBLFBlcnF1aW50aWxsAAIAHEZhbGxvZmYEAJ0CASxQZXJxdWludGlsbAADADxVc2VBdWN0aW9uU2xvdHMEACABEGJvb2wABAAAkQcQXHBvbGthZG90X3J1bnRpbWVfY29tbW9uGGNsYWltcxhwYWxsZXQURXZlbnQEBFQAAQQcQ2xhaW1lZAwBDHdobwABMFQ6OkFjY291bnRJZAABQGV0aGVyZXVtX2FkZHJlc3PBAgE8RXRoZXJldW1BZGRyZXNzAAEYYW1vdW50GAEwQmFsYW5jZU9mPFQ+AAAEaFNvbWVvbmUgY2xhaW1lZCBzb21lIERPVHMuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0lQcMOHBhbGxldF91dGlsaXR5GHBhbGxldBRFdmVudAABGEBCYXRjaEludGVycnVwdGVkCAEUaW5kZXgQAQx1MzIAARRlcnJvcmgBNERpc3BhdGNoRXJyb3IAAAhVAUJhdGNoIG9mIGRpc3BhdGNoZXMgZGlkIG5vdCBjb21wbGV0ZSBmdWxseS4gSW5kZXggb2YgZmlyc3QgZmFpbGluZyBkaXNwYXRjaCBnaXZlbiwgYXNId2VsbCBhcyB0aGUgZXJyb3IuOEJhdGNoQ29tcGxldGVkAAEEyEJhdGNoIG9mIGRpc3BhdGNoZXMgY29tcGxldGVkIGZ1bGx5IHdpdGggbm8gZXJyb3IuYEJhdGNoQ29tcGxldGVkV2l0aEVycm9ycwACBLRCYXRjaCBvZiBkaXNwYXRjaGVzIGNvbXBsZXRlZCBidXQgaGFzIGVycm9ycy40SXRlbUNvbXBsZXRlZAADBB0BQSBzaW5nbGUgaXRlbSB3aXRoaW4gYSBCYXRjaCBvZiBkaXNwYXRjaGVzIGhhcyBjb21wbGV0ZWQgd2l0aCBubyBlcnJvci4oSXRlbUZhaWxlZAQBFGVycm9yaAE0RGlzcGF0Y2hFcnJvcgAEBBEBQSBzaW5nbGUgaXRlbSB3aXRoaW4gYSBCYXRjaCBvZiBkaXNwYXRjaGVzIGhhcyBjb21wbGV0ZWQgd2l0aCBlcnJvci4wRGlzcGF0Y2hlZEFzBAEYcmVzdWx0mQcBOERpc3BhdGNoUmVzdWx0AAUEWEEgY2FsbCB3YXMgZGlzcGF0Y2hlZC4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXSZBwQYUmVzdWx0CARUAaEBBEUBaAEICE9rBAChAQAAAAAMRXJyBABoAAABAACdBww4cGFsbGV0X3NvY2lldHkYcGFsbGV0FEV2ZW50CARUAARJAAFEHEZvdW5kZWQEARxmb3VuZGVyAAEwVDo6QWNjb3VudElkAAAEtFRoZSBzb2NpZXR5IGlzIGZvdW5kZWQgYnkgdGhlIGdpdmVuIGlkZW50aXR5LgxCaWQIATBjYW5kaWRhdGVfaWQAATBUOjpBY2NvdW50SWQAARRvZmZlchgBPEJhbGFuY2VPZjxULCBJPgABCF0BQSBtZW1iZXJzaGlwIGJpZCBqdXN0IGhhcHBlbmVkLiBUaGUgZ2l2ZW4gYWNjb3VudCBpcyB0aGUgY2FuZGlkYXRlJ3MgSUQgYW5kIHRoZWlyIG9mZmVyOGlzIHRoZSBzZWNvbmQuFFZvdWNoDAEwY2FuZGlkYXRlX2lkAAEwVDo6QWNjb3VudElkAAEUb2ZmZXIYATxCYWxhbmNlT2Y8VCwgST4AASB2b3VjaGluZwABMFQ6OkFjY291bnRJZAACCF0BQSBtZW1iZXJzaGlwIGJpZCBqdXN0IGhhcHBlbmVkIGJ5IHZvdWNoaW5nLiBUaGUgZ2l2ZW4gYWNjb3VudCBpcyB0aGUgY2FuZGlkYXRlJ3MgSUQgYW5k7HRoZWlyIG9mZmVyIGlzIHRoZSBzZWNvbmQuIFRoZSB2b3VjaGluZyBwYXJ0eSBpcyB0aGUgdGhpcmQuJEF1dG9VbmJpZAQBJGNhbmRpZGF0ZQABMFQ6OkFjY291bnRJZAADBAUBQSBjYW5kaWRhdGUgd2FzIGRyb3BwZWQgKGR1ZSB0byBhbiBleGNlc3Mgb2YgYmlkcyBpbiB0aGUgc3lzdGVtKS4UVW5iaWQEASRjYW5kaWRhdGUAATBUOjpBY2NvdW50SWQABASsQSBjYW5kaWRhdGUgd2FzIGRyb3BwZWQgKGJ5IHRoZWlyIHJlcXVlc3QpLhxVbnZvdWNoBAEkY2FuZGlkYXRlAAEwVDo6QWNjb3VudElkAAUE9EEgY2FuZGlkYXRlIHdhcyBkcm9wcGVkIChieSByZXF1ZXN0IG9mIHdobyB2b3VjaGVkIGZvciB0aGVtKS4gSW5kdWN0ZWQIARxwcmltYXJ5AAEwVDo6QWNjb3VudElkAAEoY2FuZGlkYXRlc60BAURWZWM8VDo6QWNjb3VudElkPgAGCFUBQSBncm91cCBvZiBjYW5kaWRhdGVzIGhhdmUgYmVlbiBpbmR1Y3RlZC4gVGhlIGJhdGNoJ3MgcHJpbWFyeSBpcyB0aGUgZmlyc3QgdmFsdWUsIHRoZXBiYXRjaCBpbiBmdWxsIGlzIHRoZSBzZWNvbmQuYFN1c3BlbmRlZE1lbWJlckp1ZGdlbWVudAgBDHdobwABMFQ6OkFjY291bnRJZAABGGp1ZGdlZCABEGJvb2wABwSMQSBzdXNwZW5kZWQgbWVtYmVyIGhhcyBiZWVuIGp1ZGdlZC5IQ2FuZGlkYXRlU3VzcGVuZGVkBAEkY2FuZGlkYXRlAAEwVDo6QWNjb3VudElkAAgEeEEgY2FuZGlkYXRlIGhhcyBiZWVuIHN1c3BlbmRlZDxNZW1iZXJTdXNwZW5kZWQEARhtZW1iZXIAATBUOjpBY2NvdW50SWQACQRsQSBtZW1iZXIgaGFzIGJlZW4gc3VzcGVuZGVkKENoYWxsZW5nZWQEARhtZW1iZXIAATBUOjpBY2NvdW50SWQACgRwQSBtZW1iZXIgaGFzIGJlZW4gY2hhbGxlbmdlZBBWb3RlDAEkY2FuZGlkYXRlAAEwVDo6QWNjb3VudElkAAEUdm90ZXIAATBUOjpBY2NvdW50SWQAARB2b3RlIAEQYm9vbAALBFhBIHZvdGUgaGFzIGJlZW4gcGxhY2VkMERlZmVuZGVyVm90ZQgBFHZvdGVyAAEwVDo6QWNjb3VudElkAAEQdm90ZSABEGJvb2wADAS0QSB2b3RlIGhhcyBiZWVuIHBsYWNlZCBmb3IgYSBkZWZlbmRpbmcgbWVtYmVyJE5ld1BhcmFtcwQBGHBhcmFtc6EHAVBHcm91cFBhcmFtc0ZvcjxULCBJPgANBMxBIG5ldyBzZXQgb2YgXFtwYXJhbXNcXSBoYXMgYmVlbiBzZXQgZm9yIHRoZSBncm91cC4kVW5mb3VuZGVkBAEcZm91bmRlcgABMFQ6OkFjY291bnRJZAAOBFRTb2NpZXR5IGlzIHVuZm91bmRlZC4cRGVwb3NpdAQBFHZhbHVlGAE8QmFsYW5jZU9mPFQsIEk+AA8EzFNvbWUgZnVuZHMgd2VyZSBkZXBvc2l0ZWQgaW50byB0aGUgc29jaWV0eSBhY2NvdW50LiBFbGV2YXRlZAgBGG1lbWJlcgABMFQ6OkFjY291bnRJZAABEHJhbmsQARBSYW5rABAEmEEgXFttZW1iZXJcXSBnb3QgZWxldmF0ZWQgdG8gXFtyYW5rXF0uBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0oQcIOHBhbGxldF9zb2NpZXR5LEdyb3VwUGFyYW1zBBxCYWxhbmNlARgAEAEsbWF4X21lbWJlcnMQAQx1MzIAAShtYXhfaW50YWtlEAEMdTMyAAEsbWF4X3N0cmlrZXMQAQx1MzIAAURjYW5kaWRhdGVfZGVwb3NpdBgBHEJhbGFuY2UAAKUHDDxwYWxsZXRfcmVjb3ZlcnkYcGFsbGV0FEV2ZW50BARUAAEYPFJlY292ZXJ5Q3JlYXRlZAQBHGFjY291bnQAATBUOjpBY2NvdW50SWQAAATIQSByZWNvdmVyeSBwcm9jZXNzIGhhcyBiZWVuIHNldCB1cCBmb3IgYW4gYWNjb3VudC5EUmVjb3ZlcnlJbml0aWF0ZWQIATBsb3N0X2FjY291bnQAATBUOjpBY2NvdW50SWQAATxyZXNjdWVyX2FjY291bnQAATBUOjpBY2NvdW50SWQAAQQpAUEgcmVjb3ZlcnkgcHJvY2VzcyBoYXMgYmVlbiBpbml0aWF0ZWQgZm9yIGxvc3QgYWNjb3VudCBieSByZXNjdWVyIGFjY291bnQuPFJlY292ZXJ5Vm91Y2hlZAwBMGxvc3RfYWNjb3VudAABMFQ6OkFjY291bnRJZAABPHJlc2N1ZXJfYWNjb3VudAABMFQ6OkFjY291bnRJZAABGHNlbmRlcgABMFQ6OkFjY291bnRJZAACBFkBQSByZWNvdmVyeSBwcm9jZXNzIGZvciBsb3N0IGFjY291bnQgYnkgcmVzY3VlciBhY2NvdW50IGhhcyBiZWVuIHZvdWNoZWQgZm9yIGJ5IHNlbmRlci44UmVjb3ZlcnlDbG9zZWQIATBsb3N0X2FjY291bnQAATBUOjpBY2NvdW50SWQAATxyZXNjdWVyX2FjY291bnQAATBUOjpBY2NvdW50SWQAAwQdAUEgcmVjb3ZlcnkgcHJvY2VzcyBmb3IgbG9zdCBhY2NvdW50IGJ5IHJlc2N1ZXIgYWNjb3VudCBoYXMgYmVlbiBjbG9zZWQuQEFjY291bnRSZWNvdmVyZWQIATBsb3N0X2FjY291bnQAATBUOjpBY2NvdW50SWQAATxyZXNjdWVyX2FjY291bnQAATBUOjpBY2NvdW50SWQABAQBAUxvc3QgYWNjb3VudCBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgcmVjb3ZlcmVkIGJ5IHJlc2N1ZXIgYWNjb3VudC48UmVjb3ZlcnlSZW1vdmVkBAEwbG9zdF9hY2NvdW50AAEwVDo6QWNjb3VudElkAAUEzEEgcmVjb3ZlcnkgcHJvY2VzcyBoYXMgYmVlbiByZW1vdmVkIGZvciBhbiBhY2NvdW50LgQwRXZlbnRzIHR5cGUuqQcMOHBhbGxldF92ZXN0aW5nGHBhbGxldBRFdmVudAQEVAABCDhWZXN0aW5nVXBkYXRlZAgBHGFjY291bnQAATBUOjpBY2NvdW50SWQAASB1bnZlc3RlZBgBMEJhbGFuY2VPZjxUPgAACFEBVGhlIGFtb3VudCB2ZXN0ZWQgaGFzIGJlZW4gdXBkYXRlZC4gVGhpcyBjb3VsZCBpbmRpY2F0ZSBhIGNoYW5nZSBpbiBmdW5kcyBhdmFpbGFibGUuJQFUaGUgYmFsYW5jZSBnaXZlbiBpcyB0aGUgYW1vdW50IHdoaWNoIGlzIGxlZnQgdW52ZXN0ZWQgKGFuZCB0aHVzIGxvY2tlZCkuQFZlc3RpbmdDb21wbGV0ZWQEARxhY2NvdW50AAEwVDo6QWNjb3VudElkAAEEnEFuIFxbYWNjb3VudFxdIGhhcyBiZWNvbWUgZnVsbHkgdmVzdGVkLgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldK0HDEBwYWxsZXRfc2NoZWR1bGVyGHBhbGxldBRFdmVudAQEVAABJCRTY2hlZHVsZWQIARB3aGVuEAFEQmxvY2tOdW1iZXJGb3I8VD4AARRpbmRleBABDHUzMgAABFBTY2hlZHVsZWQgc29tZSB0YXNrLiBDYW5jZWxlZAgBEHdoZW4QAURCbG9ja051bWJlckZvcjxUPgABFGluZGV4EAEMdTMyAAEETENhbmNlbGVkIHNvbWUgdGFzay4oRGlzcGF0Y2hlZAwBEHRhc2v1AgF4VGFza0FkZHJlc3M8QmxvY2tOdW1iZXJGb3I8VD4+AAEIaWSxBwFAT3B0aW9uPFRhc2tOYW1lPgABGHJlc3VsdJkHAThEaXNwYXRjaFJlc3VsdAACBFREaXNwYXRjaGVkIHNvbWUgdGFzay4gUmV0cnlTZXQQARB0YXNr9QIBeFRhc2tBZGRyZXNzPEJsb2NrTnVtYmVyRm9yPFQ+PgABCGlksQcBQE9wdGlvbjxUYXNrTmFtZT4AARhwZXJpb2QQAURCbG9ja051bWJlckZvcjxUPgABHHJldHJpZXMIAQh1OAADBKBTZXQgYSByZXRyeSBjb25maWd1cmF0aW9uIGZvciBzb21lIHRhc2suOFJldHJ5Q2FuY2VsbGVkCAEQdGFza/UCAXhUYXNrQWRkcmVzczxCbG9ja051bWJlckZvcjxUPj4AAQhpZLEHAUBPcHRpb248VGFza05hbWU+AAQErENhbmNlbCBhIHJldHJ5IGNvbmZpZ3VyYXRpb24gZm9yIHNvbWUgdGFzay48Q2FsbFVuYXZhaWxhYmxlCAEQdGFza/UCAXhUYXNrQWRkcmVzczxCbG9ja051bWJlckZvcjxUPj4AAQhpZLEHAUBPcHRpb248VGFza05hbWU+AAUEKQFUaGUgY2FsbCBmb3IgdGhlIHByb3ZpZGVkIGhhc2ggd2FzIG5vdCBmb3VuZCBzbyB0aGUgdGFzayBoYXMgYmVlbiBhYm9ydGVkLjhQZXJpb2RpY0ZhaWxlZAgBEHRhc2v1AgF4VGFza0FkZHJlc3M8QmxvY2tOdW1iZXJGb3I8VD4+AAEIaWSxBwFAT3B0aW9uPFRhc2tOYW1lPgAGBD0BVGhlIGdpdmVuIHRhc2sgd2FzIHVuYWJsZSB0byBiZSByZW5ld2VkIHNpbmNlIHRoZSBhZ2VuZGEgaXMgZnVsbCBhdCB0aGF0IGJsb2NrLixSZXRyeUZhaWxlZAgBEHRhc2v1AgF4VGFza0FkZHJlc3M8QmxvY2tOdW1iZXJGb3I8VD4+AAEIaWSxBwFAT3B0aW9uPFRhc2tOYW1lPgAHCF0BVGhlIGdpdmVuIHRhc2sgd2FzIHVuYWJsZSB0byBiZSByZXRyaWVkIHNpbmNlIHRoZSBhZ2VuZGEgaXMgZnVsbCBhdCB0aGF0IGJsb2NrIG9yIHRoZXJlnHdhcyBub3QgZW5vdWdoIHdlaWdodCB0byByZXNjaGVkdWxlIGl0LlRQZXJtYW5lbnRseU92ZXJ3ZWlnaHQIARB0YXNr9QIBeFRhc2tBZGRyZXNzPEJsb2NrTnVtYmVyRm9yPFQ+PgABCGlksQcBQE9wdGlvbjxUYXNrTmFtZT4ACATwVGhlIGdpdmVuIHRhc2sgY2FuIG5ldmVyIGJlIGV4ZWN1dGVkIHNpbmNlIGl0IGlzIG92ZXJ3ZWlnaHQuBDBFdmVudHMgdHlwZS6xBwQYT3B0aW9uBARUAQQBCBBOb25lAAAAEFNvbWUEAAQAAAEAALUHDDBwYWxsZXRfcHJveHkYcGFsbGV0FEV2ZW50BARUAAEUNFByb3h5RXhlY3V0ZWQEARhyZXN1bHSZBwE4RGlzcGF0Y2hSZXN1bHQAAAS8QSBwcm94eSB3YXMgZXhlY3V0ZWQgY29ycmVjdGx5LCB3aXRoIHRoZSBnaXZlbi4sUHVyZUNyZWF0ZWQQARBwdXJlAAEwVDo6QWNjb3VudElkAAEMd2hvAAEwVDo6QWNjb3VudElkAAEocHJveHlfdHlwZQEDATBUOjpQcm94eVR5cGUAAVBkaXNhbWJpZ3VhdGlvbl9pbmRleFUBAQx1MTYAAQjcQSBwdXJlIGFjY291bnQgaGFzIGJlZW4gY3JlYXRlZCBieSBuZXcgcHJveHkgd2l0aCBnaXZlbpBkaXNhbWJpZ3VhdGlvbiBpbmRleCBhbmQgcHJveHkgdHlwZS4kQW5ub3VuY2VkDAEQcmVhbAABMFQ6OkFjY291bnRJZAABFHByb3h5AAEwVDo6QWNjb3VudElkAAEkY2FsbF9oYXNoNAE0Q2FsbEhhc2hPZjxUPgACBOBBbiBhbm5vdW5jZW1lbnQgd2FzIHBsYWNlZCB0byBtYWtlIGEgY2FsbCBpbiB0aGUgZnV0dXJlLihQcm94eUFkZGVkEAEkZGVsZWdhdG9yAAEwVDo6QWNjb3VudElkAAEkZGVsZWdhdGVlAAEwVDo6QWNjb3VudElkAAEocHJveHlfdHlwZQEDATBUOjpQcm94eVR5cGUAARRkZWxheRABREJsb2NrTnVtYmVyRm9yPFQ+AAMESEEgcHJveHkgd2FzIGFkZGVkLjBQcm94eVJlbW92ZWQQASRkZWxlZ2F0b3IAATBUOjpBY2NvdW50SWQAASRkZWxlZ2F0ZWUAATBUOjpBY2NvdW50SWQAAShwcm94eV90eXBlAQMBMFQ6OlByb3h5VHlwZQABFGRlbGF5EAFEQmxvY2tOdW1iZXJGb3I8VD4ABARQQSBwcm94eSB3YXMgcmVtb3ZlZC4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXS5Bww8cGFsbGV0X211bHRpc2lnGHBhbGxldBRFdmVudAQEVAABECxOZXdNdWx0aXNpZwwBJGFwcHJvdmluZwABMFQ6OkFjY291bnRJZAABIG11bHRpc2lnAAEwVDo6QWNjb3VudElkAAEkY2FsbF9oYXNoBAEgQ2FsbEhhc2gAAASMQSBuZXcgbXVsdGlzaWcgb3BlcmF0aW9uIGhhcyBiZWd1bi5ATXVsdGlzaWdBcHByb3ZhbBABJGFwcHJvdmluZwABMFQ6OkFjY291bnRJZAABJHRpbWVwb2ludA0DAXBUaW1lcG9pbnQ8QmxvY2tOdW1iZXJGb3I8VD4+AAEgbXVsdGlzaWcAATBUOjpBY2NvdW50SWQAASRjYWxsX2hhc2gEASBDYWxsSGFzaAABBMhBIG11bHRpc2lnIG9wZXJhdGlvbiBoYXMgYmVlbiBhcHByb3ZlZCBieSBzb21lb25lLkBNdWx0aXNpZ0V4ZWN1dGVkFAEkYXBwcm92aW5nAAEwVDo6QWNjb3VudElkAAEkdGltZXBvaW50DQMBcFRpbWVwb2ludDxCbG9ja051bWJlckZvcjxUPj4AASBtdWx0aXNpZwABMFQ6OkFjY291bnRJZAABJGNhbGxfaGFzaAQBIENhbGxIYXNoAAEYcmVzdWx0mQcBOERpc3BhdGNoUmVzdWx0AAIEnEEgbXVsdGlzaWcgb3BlcmF0aW9uIGhhcyBiZWVuIGV4ZWN1dGVkLkRNdWx0aXNpZ0NhbmNlbGxlZBABKGNhbmNlbGxpbmcAATBUOjpBY2NvdW50SWQAASR0aW1lcG9pbnQNAwFwVGltZXBvaW50PEJsb2NrTnVtYmVyRm9yPFQ+PgABIG11bHRpc2lnAAEwVDo6QWNjb3VudElkAAEkY2FsbF9oYXNoBAEgQ2FsbEhhc2gAAwSgQSBtdWx0aXNpZyBvcGVyYXRpb24gaGFzIGJlZW4gY2FuY2VsbGVkLgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldL0HDDxwYWxsZXRfcHJlaW1hZ2UYcGFsbGV0FEV2ZW50BARUAAEMFE5vdGVkBAEQaGFzaDQBHFQ6Okhhc2gAAARoQSBwcmVpbWFnZSBoYXMgYmVlbiBub3RlZC4kUmVxdWVzdGVkBAEQaGFzaDQBHFQ6Okhhc2gAAQR4QSBwcmVpbWFnZSBoYXMgYmVlbiByZXF1ZXN0ZWQuHENsZWFyZWQEARBoYXNoNAEcVDo6SGFzaAACBGxBIHByZWltYWdlIGhhcyBiZW4gY2xlYXJlZC4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXTBBww8cGFsbGV0X2JvdW50aWVzGHBhbGxldBRFdmVudAgEVAAESQABLDhCb3VudHlQcm9wb3NlZAQBFGluZGV4EAEsQm91bnR5SW5kZXgAAARQTmV3IGJvdW50eSBwcm9wb3NhbC44Qm91bnR5UmVqZWN0ZWQIARRpbmRleBABLEJvdW50eUluZGV4AAEQYm9uZBgBPEJhbGFuY2VPZjxULCBJPgABBMxBIGJvdW50eSBwcm9wb3NhbCB3YXMgcmVqZWN0ZWQ7IGZ1bmRzIHdlcmUgc2xhc2hlZC5IQm91bnR5QmVjYW1lQWN0aXZlBAEUaW5kZXgQASxCb3VudHlJbmRleAACBLhBIGJvdW50eSBwcm9wb3NhbCBpcyBmdW5kZWQgYW5kIGJlY2FtZSBhY3RpdmUuNEJvdW50eUF3YXJkZWQIARRpbmRleBABLEJvdW50eUluZGV4AAEsYmVuZWZpY2lhcnkAATBUOjpBY2NvdW50SWQAAwSUQSBib3VudHkgaXMgYXdhcmRlZCB0byBhIGJlbmVmaWNpYXJ5LjRCb3VudHlDbGFpbWVkDAEUaW5kZXgQASxCb3VudHlJbmRleAABGHBheW91dBgBPEJhbGFuY2VPZjxULCBJPgABLGJlbmVmaWNpYXJ5AAEwVDo6QWNjb3VudElkAAQEjEEgYm91bnR5IGlzIGNsYWltZWQgYnkgYmVuZWZpY2lhcnkuOEJvdW50eUNhbmNlbGVkBAEUaW5kZXgQASxCb3VudHlJbmRleAAFBFhBIGJvdW50eSBpcyBjYW5jZWxsZWQuOEJvdW50eUV4dGVuZGVkBAEUaW5kZXgQASxCb3VudHlJbmRleAAGBHBBIGJvdW50eSBleHBpcnkgaXMgZXh0ZW5kZWQuOEJvdW50eUFwcHJvdmVkBAEUaW5kZXgQASxCb3VudHlJbmRleAAHBFRBIGJvdW50eSBpcyBhcHByb3ZlZC48Q3VyYXRvclByb3Bvc2VkCAEkYm91bnR5X2lkEAEsQm91bnR5SW5kZXgAARxjdXJhdG9yAAEwVDo6QWNjb3VudElkAAgEdEEgYm91bnR5IGN1cmF0b3IgaXMgcHJvcG9zZWQuREN1cmF0b3JVbmFzc2lnbmVkBAEkYm91bnR5X2lkEAEsQm91bnR5SW5kZXgACQR8QSBib3VudHkgY3VyYXRvciBpcyB1bmFzc2lnbmVkLjxDdXJhdG9yQWNjZXB0ZWQIASRib3VudHlfaWQQASxCb3VudHlJbmRleAABHGN1cmF0b3IAATBUOjpBY2NvdW50SWQACgR0QSBib3VudHkgY3VyYXRvciBpcyBhY2NlcHRlZC4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXTFBwxUcGFsbGV0X2NoaWxkX2JvdW50aWVzGHBhbGxldBRFdmVudAQEVAABEBRBZGRlZAgBFGluZGV4EAEsQm91bnR5SW5kZXgAASxjaGlsZF9pbmRleBABLEJvdW50eUluZGV4AAAEYEEgY2hpbGQtYm91bnR5IGlzIGFkZGVkLhxBd2FyZGVkDAEUaW5kZXgQASxCb3VudHlJbmRleAABLGNoaWxkX2luZGV4EAEsQm91bnR5SW5kZXgAASxiZW5lZmljaWFyeQABMFQ6OkFjY291bnRJZAABBKxBIGNoaWxkLWJvdW50eSBpcyBhd2FyZGVkIHRvIGEgYmVuZWZpY2lhcnkuHENsYWltZWQQARRpbmRleBABLEJvdW50eUluZGV4AAEsY2hpbGRfaW5kZXgQASxCb3VudHlJbmRleAABGHBheW91dBgBMEJhbGFuY2VPZjxUPgABLGJlbmVmaWNpYXJ5AAEwVDo6QWNjb3VudElkAAIEpEEgY2hpbGQtYm91bnR5IGlzIGNsYWltZWQgYnkgYmVuZWZpY2lhcnkuIENhbmNlbGVkCAEUaW5kZXgQASxCb3VudHlJbmRleAABLGNoaWxkX2luZGV4EAEsQm91bnR5SW5kZXgAAwRwQSBjaGlsZC1ib3VudHkgaXMgY2FuY2VsbGVkLgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldMkHDJBwYWxsZXRfZWxlY3Rpb25fcHJvdmlkZXJfbXVsdGlfcGhhc2UYcGFsbGV0FEV2ZW50BARUAAEYOFNvbHV0aW9uU3RvcmVkDAEcY29tcHV0Zc0HATxFbGVjdGlvbkNvbXB1dGUAARhvcmlnaW7ZAQFQT3B0aW9uPFQ6OkFjY291bnRJZD4AATBwcmV2X2VqZWN0ZWQgARBib29sAAActEEgc29sdXRpb24gd2FzIHN0b3JlZCB3aXRoIHRoZSBnaXZlbiBjb21wdXRlLgBRAVRoZSBgb3JpZ2luYCBpbmRpY2F0ZXMgdGhlIG9yaWdpbiBvZiB0aGUgc29sdXRpb24uIElmIGBvcmlnaW5gIGlzIGBTb21lKEFjY291bnRJZClgLFkBdGhlIHN0b3JlZCBzb2x1dGlvbiB3YXMgc3VibWl0dGVkIGluIHRoZSBzaWduZWQgcGhhc2UgYnkgYSBtaW5lciB3aXRoIHRoZSBgQWNjb3VudElkYC4lAU90aGVyd2lzZSwgdGhlIHNvbHV0aW9uIHdhcyBzdG9yZWQgZWl0aGVyIGR1cmluZyB0aGUgdW5zaWduZWQgcGhhc2Ugb3IgYnlNAWBUOjpGb3JjZU9yaWdpbmAuIFRoZSBgYm9vbGAgaXMgYHRydWVgIHdoZW4gYSBwcmV2aW91cyBzb2x1dGlvbiB3YXMgZWplY3RlZCB0byBtYWtlSHJvb20gZm9yIHRoaXMgb25lLkRFbGVjdGlvbkZpbmFsaXplZAgBHGNvbXB1dGXNBwE8RWxlY3Rpb25Db21wdXRlAAEUc2NvcmVVBAE0RWxlY3Rpb25TY29yZQABBBkBVGhlIGVsZWN0aW9uIGhhcyBiZWVuIGZpbmFsaXplZCwgd2l0aCB0aGUgZ2l2ZW4gY29tcHV0YXRpb24gYW5kIHNjb3JlLjhFbGVjdGlvbkZhaWxlZAACDExBbiBlbGVjdGlvbiBmYWlsZWQuAAEBTm90IG11Y2ggY2FuIGJlIHNhaWQgYWJvdXQgd2hpY2ggY29tcHV0ZXMgZmFpbGVkIGluIHRoZSBwcm9jZXNzLiBSZXdhcmRlZAgBHGFjY291bnQAAZg8VCBhcyBmcmFtZV9zeXN0ZW06OkNvbmZpZz46OkFjY291bnRJZAABFHZhbHVlGAEwQmFsYW5jZU9mPFQ+AAMEJQFBbiBhY2NvdW50IGhhcyBiZWVuIHJld2FyZGVkIGZvciB0aGVpciBzaWduZWQgc3VibWlzc2lvbiBiZWluZyBmaW5hbGl6ZWQuHFNsYXNoZWQIARxhY2NvdW50AAGYPFQgYXMgZnJhbWVfc3lzdGVtOjpDb25maWc+OjpBY2NvdW50SWQAARR2YWx1ZRgBMEJhbGFuY2VPZjxUPgAEBCEBQW4gYWNjb3VudCBoYXMgYmVlbiBzbGFzaGVkIGZvciBzdWJtaXR0aW5nIGFuIGludmFsaWQgc2lnbmVkIHN1Ym1pc3Npb24uRFBoYXNlVHJhbnNpdGlvbmVkDAEQZnJvbdEHAWBQaGFzZTxCbG9ja051bWJlckZvcjxUPj4AAQh0b9EHAWBQaGFzZTxCbG9ja051bWJlckZvcjxUPj4AARRyb3VuZBABDHUzMgAFBLhUaGVyZSB3YXMgYSBwaGFzZSB0cmFuc2l0aW9uIGluIGEgZ2l2ZW4gcm91bmQuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0zQcIkHBhbGxldF9lbGVjdGlvbl9wcm92aWRlcl9tdWx0aV9waGFzZTxFbGVjdGlvbkNvbXB1dGUAARQcT25DaGFpbgAAABhTaWduZWQAAQAgVW5zaWduZWQAAgAgRmFsbGJhY2sAAwAkRW1lcmdlbmN5AAQAANEHCJBwYWxsZXRfZWxlY3Rpb25fcHJvdmlkZXJfbXVsdGlfcGhhc2UUUGhhc2UECEJuARABEAxPZmYAAAAYU2lnbmVkAAEAIFVuc2lnbmVkBADVBwEoKGJvb2wsIEJuKQACACRFbWVyZ2VuY3kAAwAA1QcAAAQIIBAA2QcMKHBhbGxldF9uaXMYcGFsbGV0FEV2ZW50BARUAAEcJEJpZFBsYWNlZAwBDHdobwABMFQ6OkFjY291bnRJZAABGGFtb3VudBgBMEJhbGFuY2VPZjxUPgABIGR1cmF0aW9uEAEMdTMyAAAEeEEgYmlkIHdhcyBzdWNjZXNzZnVsbHkgcGxhY2VkLjBCaWRSZXRyYWN0ZWQMAQx3aG8AATBUOjpBY2NvdW50SWQAARhhbW91bnQYATBCYWxhbmNlT2Y8VD4AASBkdXJhdGlvbhABDHUzMgABBNxBIGJpZCB3YXMgc3VjY2Vzc2Z1bGx5IHJlbW92ZWQgKGJlZm9yZSBiZWluZyBhY2NlcHRlZCkuKEJpZERyb3BwZWQMAQx3aG8AATBUOjpBY2NvdW50SWQAARhhbW91bnQYATBCYWxhbmNlT2Y8VD4AASBkdXJhdGlvbhABDHUzMgACBFUBQSBiaWQgd2FzIGRyb3BwZWQgZnJvbSBhIHF1ZXVlIGJlY2F1c2Ugb2YgYW5vdGhlciwgbW9yZSBzdWJzdGFudGlhbCwgYmlkIHdhcyBwcmVzZW50LhhJc3N1ZWQUARRpbmRleBABMFJlY2VpcHRJbmRleARwVGhlIGlkZW50aXR5IG9mIHRoZSByZWNlaXB0LgEYZXhwaXJ5EAFEQmxvY2tOdW1iZXJGb3I8VD4E0FRoZSBibG9jayBudW1iZXIgYXQgd2hpY2ggdGhlIHJlY2VpcHQgbWF5IGJlIHRoYXdlZC4BDHdobwABMFQ6OkFjY291bnRJZARkVGhlIG93bmVyIG9mIHRoZSByZWNlaXB0LgEocHJvcG9ydGlvbp0CASxQZXJxdWludGlsbAQxAVRoZSBwcm9wb3J0aW9uIG9mIHRoZSBlZmZlY3RpdmUgdG90YWwgaXNzdWFuY2Ugd2hpY2ggdGhlIHJlY2VpcHQgcmVwcmVzZW50cy4BGGFtb3VudBgBMEJhbGFuY2VPZjxUPgTYVGhlIGFtb3VudCBvZiBmdW5kcyB3aGljaCB3ZXJlIGRlYml0ZWQgZnJvbSB0aGUgb3duZXIuAwQFAUEgYmlkIHdhcyBhY2NlcHRlZC4gVGhlIGJhbGFuY2UgbWF5IG5vdCBiZSByZWxlYXNlZCB1bnRpbCBleHBpcnkuGFRoYXdlZBQBFGluZGV4EAEwUmVjZWlwdEluZGV4BHBUaGUgaWRlbnRpdHkgb2YgdGhlIHJlY2VpcHQuAQx3aG8AATBUOjpBY2NvdW50SWQEKFRoZSBvd25lci4BKHByb3BvcnRpb26dAgEsUGVycXVpbnRpbGwEOQFUaGUgcHJvcG9ydGlvbiBvZiB0aGUgZWZmZWN0aXZlIHRvdGFsIGlzc3VhbmNlIGJ5IHdoaWNoIHRoZSBvd25lciB3YXMgZGViaXRlZC4BGGFtb3VudBgBMEJhbGFuY2VPZjxUPgSsVGhlIGFtb3VudCBieSB3aGljaCB0aGUgb3duZXIgd2FzIGNyZWRpdGVkLgEcZHJvcHBlZCABEGJvb2wEjElmIGB0cnVlYCB0aGVuIHRoZSByZWNlaXB0IGlzIGRvbmUuBATAQW4gcmVjZWlwdCBoYXMgYmVlbiAoYXQgbGVhc3QgcGFydGlhbGx5KSB0aGF3ZWQuGEZ1bmRlZAQBHGRlZmljaXQYATBCYWxhbmNlT2Y8VD4ABQS0QW4gYXV0b21hdGljIGZ1bmRpbmcgb2YgdGhlIGRlZmljaXQgd2FzIG1hZGUuLFRyYW5zZmVycmVkDAEQZnJvbQABMFQ6OkFjY291bnRJZAABCHRvAAEwVDo6QWNjb3VudElkAAEUaW5kZXgQATBSZWNlaXB0SW5kZXgABgRoQSByZWNlaXB0IHdhcyB0cmFuc2ZlcnJlZC4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXTdBww8cGFsbGV0X2JhbGFuY2VzGHBhbGxldBRFdmVudAgEVAAESQABWBxFbmRvd2VkCAEcYWNjb3VudAABMFQ6OkFjY291bnRJZAABMGZyZWVfYmFsYW5jZRgBKFQ6OkJhbGFuY2UAAAS4QW4gYWNjb3VudCB3YXMgY3JlYXRlZCB3aXRoIHNvbWUgZnJlZSBiYWxhbmNlLiBEdXN0TG9zdAgBHGFjY291bnQAATBUOjpBY2NvdW50SWQAARhhbW91bnQYAShUOjpCYWxhbmNlAAEIPQFBbiBhY2NvdW50IHdhcyByZW1vdmVkIHdob3NlIGJhbGFuY2Ugd2FzIG5vbi16ZXJvIGJ1dCBiZWxvdyBFeGlzdGVudGlhbERlcG9zaXQseHJlc3VsdGluZyBpbiBhbiBvdXRyaWdodCBsb3NzLiBUcmFuc2ZlcgwBEGZyb20AATBUOjpBY2NvdW50SWQAAQh0bwABMFQ6OkFjY291bnRJZAABGGFtb3VudBgBKFQ6OkJhbGFuY2UAAgRMVHJhbnNmZXIgc3VjY2VlZGVkLihCYWxhbmNlU2V0CAEMd2hvAAEwVDo6QWNjb3VudElkAAEQZnJlZRgBKFQ6OkJhbGFuY2UAAwRoQSBiYWxhbmNlIHdhcyBzZXQgYnkgcm9vdC4gUmVzZXJ2ZWQIAQx3aG8AATBUOjpBY2NvdW50SWQAARhhbW91bnQYAShUOjpCYWxhbmNlAAQE4FNvbWUgYmFsYW5jZSB3YXMgcmVzZXJ2ZWQgKG1vdmVkIGZyb20gZnJlZSB0byByZXNlcnZlZCkuKFVucmVzZXJ2ZWQIAQx3aG8AATBUOjpBY2NvdW50SWQAARhhbW91bnQYAShUOjpCYWxhbmNlAAUE6FNvbWUgYmFsYW5jZSB3YXMgdW5yZXNlcnZlZCAobW92ZWQgZnJvbSByZXNlcnZlZCB0byBmcmVlKS5IUmVzZXJ2ZVJlcGF0cmlhdGVkEAEQZnJvbQABMFQ6OkFjY291bnRJZAABCHRvAAEwVDo6QWNjb3VudElkAAEYYW1vdW50GAEoVDo6QmFsYW5jZQABSGRlc3RpbmF0aW9uX3N0YXR1c4QBGFN0YXR1cwAGCE0BU29tZSBiYWxhbmNlIHdhcyBtb3ZlZCBmcm9tIHRoZSByZXNlcnZlIG9mIHRoZSBmaXJzdCBhY2NvdW50IHRvIHRoZSBzZWNvbmQgYWNjb3VudC7YRmluYWwgYXJndW1lbnQgaW5kaWNhdGVzIHRoZSBkZXN0aW5hdGlvbiBiYWxhbmNlIHR5cGUuHERlcG9zaXQIAQx3aG8AATBUOjpBY2NvdW50SWQAARhhbW91bnQYAShUOjpCYWxhbmNlAAcE2FNvbWUgYW1vdW50IHdhcyBkZXBvc2l0ZWQgKGUuZy4gZm9yIHRyYW5zYWN0aW9uIGZlZXMpLiBXaXRoZHJhdwgBDHdobwABMFQ6OkFjY291bnRJZAABGGFtb3VudBgBKFQ6OkJhbGFuY2UACAQdAVNvbWUgYW1vdW50IHdhcyB3aXRoZHJhd24gZnJvbSB0aGUgYWNjb3VudCAoZS5nLiBmb3IgdHJhbnNhY3Rpb24gZmVlcykuHFNsYXNoZWQIAQx3aG8AATBUOjpBY2NvdW50SWQAARhhbW91bnQYAShUOjpCYWxhbmNlAAkEAQFTb21lIGFtb3VudCB3YXMgcmVtb3ZlZCBmcm9tIHRoZSBhY2NvdW50IChlLmcuIGZvciBtaXNiZWhhdmlvcikuGE1pbnRlZAgBDHdobwABMFQ6OkFjY291bnRJZAABGGFtb3VudBgBKFQ6OkJhbGFuY2UACgScU29tZSBhbW91bnQgd2FzIG1pbnRlZCBpbnRvIGFuIGFjY291bnQuGEJ1cm5lZAgBDHdobwABMFQ6OkFjY291bnRJZAABGGFtb3VudBgBKFQ6OkJhbGFuY2UACwScU29tZSBhbW91bnQgd2FzIGJ1cm5lZCBmcm9tIGFuIGFjY291bnQuJFN1c3BlbmRlZAgBDHdobwABMFQ6OkFjY291bnRJZAABGGFtb3VudBgBKFQ6OkJhbGFuY2UADAQVAVNvbWUgYW1vdW50IHdhcyBzdXNwZW5kZWQgZnJvbSBhbiBhY2NvdW50IChpdCBjYW4gYmUgcmVzdG9yZWQgbGF0ZXIpLiBSZXN0b3JlZAgBDHdobwABMFQ6OkFjY291bnRJZAABGGFtb3VudBgBKFQ6OkJhbGFuY2UADQSkU29tZSBhbW91bnQgd2FzIHJlc3RvcmVkIGludG8gYW4gYWNjb3VudC4gVXBncmFkZWQEAQx3aG8AATBUOjpBY2NvdW50SWQADgRgQW4gYWNjb3VudCB3YXMgdXBncmFkZWQuGElzc3VlZAQBGGFtb3VudBgBKFQ6OkJhbGFuY2UADwQtAVRvdGFsIGlzc3VhbmNlIHdhcyBpbmNyZWFzZWQgYnkgYGFtb3VudGAsIGNyZWF0aW5nIGEgY3JlZGl0IHRvIGJlIGJhbGFuY2VkLiRSZXNjaW5kZWQEARhhbW91bnQYAShUOjpCYWxhbmNlABAEJQFUb3RhbCBpc3N1YW5jZSB3YXMgZGVjcmVhc2VkIGJ5IGBhbW91bnRgLCBjcmVhdGluZyBhIGRlYnQgdG8gYmUgYmFsYW5jZWQuGExvY2tlZAgBDHdobwABMFQ6OkFjY291bnRJZAABGGFtb3VudBgBKFQ6OkJhbGFuY2UAEQRgU29tZSBiYWxhbmNlIHdhcyBsb2NrZWQuIFVubG9ja2VkCAEMd2hvAAEwVDo6QWNjb3VudElkAAEYYW1vdW50GAEoVDo6QmFsYW5jZQASBGhTb21lIGJhbGFuY2Ugd2FzIHVubG9ja2VkLhhGcm96ZW4IAQx3aG8AATBUOjpBY2NvdW50SWQAARhhbW91bnQYAShUOjpCYWxhbmNlABMEYFNvbWUgYmFsYW5jZSB3YXMgZnJvemVuLhhUaGF3ZWQIAQx3aG8AATBUOjpBY2NvdW50SWQAARhhbW91bnQYAShUOjpCYWxhbmNlABQEYFNvbWUgYmFsYW5jZSB3YXMgdGhhd2VkLkxUb3RhbElzc3VhbmNlRm9yY2VkCAEMb2xkGAEoVDo6QmFsYW5jZQABDG5ldxgBKFQ6OkJhbGFuY2UAFQSsVGhlIGBUb3RhbElzc3VhbmNlYCB3YXMgZm9yY2VmdWxseSBjaGFuZ2VkLgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldOEHDEBwYWxsZXRfYmFnc19saXN0GHBhbGxldBRFdmVudAgEVAAESQABCCBSZWJhZ2dlZAwBDHdobwABMFQ6OkFjY291bnRJZAABEGZyb20wASBUOjpTY29yZQABCHRvMAEgVDo6U2NvcmUAAASkTW92ZWQgYW4gYWNjb3VudCBmcm9tIG9uZSBiYWcgdG8gYW5vdGhlci4wU2NvcmVVcGRhdGVkCAEMd2hvAAEwVDo6QWNjb3VudElkAAEkbmV3X3Njb3JlMAEgVDo6U2NvcmUAAQTYVXBkYXRlZCB0aGUgc2NvcmUgb2Ygc29tZSBhY2NvdW50IHRvIHRoZSBnaXZlbiBhbW91bnQuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV05QcMXHBhbGxldF9ub21pbmF0aW9uX3Bvb2xzGHBhbGxldBRFdmVudAQEVAABSBxDcmVhdGVkCAEkZGVwb3NpdG9yAAEwVDo6QWNjb3VudElkAAEccG9vbF9pZBABGFBvb2xJZAAABGBBIHBvb2wgaGFzIGJlZW4gY3JlYXRlZC4YQm9uZGVkEAEYbWVtYmVyAAEwVDo6QWNjb3VudElkAAEccG9vbF9pZBABGFBvb2xJZAABGGJvbmRlZBgBMEJhbGFuY2VPZjxUPgABGGpvaW5lZCABEGJvb2wAAQSUQSBtZW1iZXIgaGFzIGJlY2FtZSBib25kZWQgaW4gYSBwb29sLhxQYWlkT3V0DAEYbWVtYmVyAAEwVDo6QWNjb3VudElkAAEccG9vbF9pZBABGFBvb2xJZAABGHBheW91dBgBMEJhbGFuY2VPZjxUPgACBIxBIHBheW91dCBoYXMgYmVlbiBtYWRlIHRvIGEgbWVtYmVyLiBVbmJvbmRlZBQBGG1lbWJlcgABMFQ6OkFjY291bnRJZAABHHBvb2xfaWQQARhQb29sSWQAARxiYWxhbmNlGAEwQmFsYW5jZU9mPFQ+AAEYcG9pbnRzGAEwQmFsYW5jZU9mPFQ+AAEMZXJhEAEgRXJhSW5kZXgAAyyYQSBtZW1iZXIgaGFzIHVuYm9uZGVkIGZyb20gdGhlaXIgcG9vbC4AOQEtIGBiYWxhbmNlYCBpcyB0aGUgY29ycmVzcG9uZGluZyBiYWxhbmNlIG9mIHRoZSBudW1iZXIgb2YgcG9pbnRzIHRoYXQgaGFzIGJlZW5VASAgcmVxdWVzdGVkIHRvIGJlIHVuYm9uZGVkICh0aGUgYXJndW1lbnQgb2YgdGhlIGB1bmJvbmRgIHRyYW5zYWN0aW9uKSBmcm9tIHRoZSBib25kZWQcICBwb29sLkUBLSBgcG9pbnRzYCBpcyB0aGUgbnVtYmVyIG9mIHBvaW50cyB0aGF0IGFyZSBpc3N1ZWQgYXMgYSByZXN1bHQgb2YgYGJhbGFuY2VgIGJlaW5nwGRpc3NvbHZlZCBpbnRvIHRoZSBjb3JyZXNwb25kaW5nIHVuYm9uZGluZyBwb29sLuQtIGBlcmFgIGlzIHRoZSBlcmEgaW4gd2hpY2ggdGhlIGJhbGFuY2Ugd2lsbCBiZSB1bmJvbmRlZC5VAUluIHRoZSBhYnNlbmNlIG9mIHNsYXNoaW5nLCB0aGVzZSB2YWx1ZXMgd2lsbCBtYXRjaC4gSW4gdGhlIHByZXNlbmNlIG9mIHNsYXNoaW5nLCB0aGVNAW51bWJlciBvZiBwb2ludHMgdGhhdCBhcmUgaXNzdWVkIGluIHRoZSB1bmJvbmRpbmcgcG9vbCB3aWxsIGJlIGxlc3MgdGhhbiB0aGUgYW1vdW50ZHJlcXVlc3RlZCB0byBiZSB1bmJvbmRlZC4kV2l0aGRyYXduEAEYbWVtYmVyAAEwVDo6QWNjb3VudElkAAEccG9vbF9pZBABGFBvb2xJZAABHGJhbGFuY2UYATBCYWxhbmNlT2Y8VD4AARhwb2ludHMYATBCYWxhbmNlT2Y8VD4ABBicQSBtZW1iZXIgaGFzIHdpdGhkcmF3biBmcm9tIHRoZWlyIHBvb2wuACEBVGhlIGdpdmVuIG51bWJlciBvZiBgcG9pbnRzYCBoYXZlIGJlZW4gZGlzc29sdmVkIGluIHJldHVybiBvZiBgYmFsYW5jZWAuAFkBU2ltaWxhciB0byBgVW5ib25kZWRgIGV2ZW50LCBpbiB0aGUgYWJzZW5jZSBvZiBzbGFzaGluZywgdGhlIHJhdGlvIG9mIHBvaW50IHRvIGJhbGFuY2Uod2lsbCBiZSAxLiREZXN0cm95ZWQEARxwb29sX2lkEAEYUG9vbElkAAUEaEEgcG9vbCBoYXMgYmVlbiBkZXN0cm95ZWQuMFN0YXRlQ2hhbmdlZAgBHHBvb2xfaWQQARhQb29sSWQAASRuZXdfc3RhdGWJBAEkUG9vbFN0YXRlAAYEfFRoZSBzdGF0ZSBvZiBhIHBvb2wgaGFzIGNoYW5nZWQ0TWVtYmVyUmVtb3ZlZAgBHHBvb2xfaWQQARhQb29sSWQAARhtZW1iZXIAATBUOjpBY2NvdW50SWQABwyYQSBtZW1iZXIgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIGEgcG9vbC4AUQFUaGUgcmVtb3ZhbCBjYW4gYmUgdm9sdW50YXJ5ICh3aXRoZHJhd24gYWxsIHVuYm9uZGVkIGZ1bmRzKSBvciBpbnZvbHVudGFyeSAoa2lja2VkKS4wUm9sZXNVcGRhdGVkDAEQcm9vdNkBAVBPcHRpb248VDo6QWNjb3VudElkPgABHGJvdW5jZXLZAQFQT3B0aW9uPFQ6OkFjY291bnRJZD4AASRub21pbmF0b3LZAQFQT3B0aW9uPFQ6OkFjY291bnRJZD4ACAhVAVRoZSByb2xlcyBvZiBhIHBvb2wgaGF2ZSBiZWVuIHVwZGF0ZWQgdG8gdGhlIGdpdmVuIG5ldyByb2xlcy4gTm90ZSB0aGF0IHRoZSBkZXBvc2l0b3JEY2FuIG5ldmVyIGNoYW5nZS4sUG9vbFNsYXNoZWQIARxwb29sX2lkEAEYUG9vbElkAAEcYmFsYW5jZRgBMEJhbGFuY2VPZjxUPgAJBA0BVGhlIGFjdGl2ZSBiYWxhbmNlIG9mIHBvb2wgYHBvb2xfaWRgIGhhcyBiZWVuIHNsYXNoZWQgdG8gYGJhbGFuY2VgLlBVbmJvbmRpbmdQb29sU2xhc2hlZAwBHHBvb2xfaWQQARhQb29sSWQAAQxlcmEQASBFcmFJbmRleAABHGJhbGFuY2UYATBCYWxhbmNlT2Y8VD4ACgQlAVRoZSB1bmJvbmQgcG9vbCBhdCBgZXJhYCBvZiBwb29sIGBwb29sX2lkYCBoYXMgYmVlbiBzbGFzaGVkIHRvIGBiYWxhbmNlYC5UUG9vbENvbW1pc3Npb25VcGRhdGVkCAEccG9vbF9pZBABGFBvb2xJZAABHGN1cnJlbnShBAF8T3B0aW9uPChQZXJiaWxsLCBUOjpBY2NvdW50SWQpPgALBLRBIHBvb2wncyBjb21taXNzaW9uIHNldHRpbmcgaGFzIGJlZW4gY2hhbmdlZC5gUG9vbE1heENvbW1pc3Npb25VcGRhdGVkCAEccG9vbF9pZBABGFBvb2xJZAABOG1heF9jb21taXNzaW9ulAEcUGVyYmlsbAAMBNRBIHBvb2wncyBtYXhpbXVtIGNvbW1pc3Npb24gc2V0dGluZyBoYXMgYmVlbiBjaGFuZ2VkLnxQb29sQ29tbWlzc2lvbkNoYW5nZVJhdGVVcGRhdGVkCAEccG9vbF9pZBABGFBvb2xJZAABLGNoYW5nZV9yYXRlqQQBnENvbW1pc3Npb25DaGFuZ2VSYXRlPEJsb2NrTnVtYmVyRm9yPFQ+PgANBMxBIHBvb2wncyBjb21taXNzaW9uIGBjaGFuZ2VfcmF0ZWAgaGFzIGJlZW4gY2hhbmdlZC6QUG9vbENvbW1pc3Npb25DbGFpbVBlcm1pc3Npb25VcGRhdGVkCAEccG9vbF9pZBABGFBvb2xJZAABKHBlcm1pc3Npb26tBAG8T3B0aW9uPENvbW1pc3Npb25DbGFpbVBlcm1pc3Npb248VDo6QWNjb3VudElkPj4ADgTIUG9vbCBjb21taXNzaW9uIGNsYWltIHBlcm1pc3Npb24gaGFzIGJlZW4gdXBkYXRlZC5UUG9vbENvbW1pc3Npb25DbGFpbWVkCAEccG9vbF9pZBABGFBvb2xJZAABKGNvbW1pc3Npb24YATBCYWxhbmNlT2Y8VD4ADwSEUG9vbCBjb21taXNzaW9uIGhhcyBiZWVuIGNsYWltZWQuZE1pbkJhbGFuY2VEZWZpY2l0QWRqdXN0ZWQIARxwb29sX2lkEAEYUG9vbElkAAEYYW1vdW50GAEwQmFsYW5jZU9mPFQ+ABAEyFRvcHBlZCB1cCBkZWZpY2l0IGluIGZyb3plbiBFRCBvZiB0aGUgcmV3YXJkIHBvb2wuYE1pbkJhbGFuY2VFeGNlc3NBZGp1c3RlZAgBHHBvb2xfaWQQARhQb29sSWQAARhhbW91bnQYATBCYWxhbmNlT2Y8VD4AEQS8Q2xhaW1lZCBleGNlc3MgZnJvemVuIEVEIG9mIGFmIHRoZSByZXdhcmQgcG9vbC4EWEV2ZW50cyBvZiB0aGlzIHBhbGxldC7pBwxMcGFsbGV0X2Zhc3RfdW5zdGFrZRhwYWxsZXQURXZlbnQEBFQAARQgVW5zdGFrZWQIARRzdGFzaAABMFQ6OkFjY291bnRJZAABGHJlc3VsdJkHAThEaXNwYXRjaFJlc3VsdAAABFhBIHN0YWtlciB3YXMgdW5zdGFrZWQuHFNsYXNoZWQIARRzdGFzaAABMFQ6OkFjY291bnRJZAABGGFtb3VudBgBMEJhbGFuY2VPZjxUPgABBBkBQSBzdGFrZXIgd2FzIHNsYXNoZWQgZm9yIHJlcXVlc3RpbmcgZmFzdC11bnN0YWtlIHdoaWxzdCBiZWluZyBleHBvc2VkLjBCYXRjaENoZWNrZWQEARBlcmFzwQEBNFZlYzxFcmFJbmRleD4AAgRFAUEgYmF0Y2ggd2FzIHBhcnRpYWxseSBjaGVja2VkIGZvciB0aGUgZ2l2ZW4gZXJhcywgYnV0IHRoZSBwcm9jZXNzIGRpZCBub3QgZmluaXNoLjRCYXRjaEZpbmlzaGVkBAEQc2l6ZRABDHUzMgADEJxBIGJhdGNoIG9mIGEgZ2l2ZW4gc2l6ZSB3YXMgdGVybWluYXRlZC4AVQFUaGlzIGlzIGFsd2F5cyBmb2xsb3dzIGJ5IGEgbnVtYmVyIG9mIGBVbnN0YWtlZGAgb3IgYFNsYXNoZWRgIGV2ZW50cywgbWFya2luZyB0aGUgZW5k6G9mIHRoZSBiYXRjaC4gQSBuZXcgYmF0Y2ggd2lsbCBiZSBjcmVhdGVkIHVwb24gbmV4dCBibG9jay40SW50ZXJuYWxFcnJvcgAEBOhBbiBpbnRlcm5hbCBlcnJvciBoYXBwZW5lZC4gT3BlcmF0aW9ucyB3aWxsIGJlIHBhdXNlZCBub3cuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV07QcQbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucyRpbmNsdXNpb24YcGFsbGV0FEV2ZW50BARUAAEQPENhbmRpZGF0ZUJhY2tlZBAA8QcBZENhbmRpZGF0ZVJlY2VpcHQ8VDo6SGFzaD4AAEEFASBIZWFkRGF0YQAA9QcBJENvcmVJbmRleAAA+QcBKEdyb3VwSW5kZXgAAATAQSBjYW5kaWRhdGUgd2FzIGJhY2tlZC4gYFtjYW5kaWRhdGUsIGhlYWRfZGF0YV1gRENhbmRpZGF0ZUluY2x1ZGVkEADxBwFkQ2FuZGlkYXRlUmVjZWlwdDxUOjpIYXNoPgAAQQUBIEhlYWREYXRhAAD1BwEkQ29yZUluZGV4AAD5BwEoR3JvdXBJbmRleAABBMhBIGNhbmRpZGF0ZSB3YXMgaW5jbHVkZWQuIGBbY2FuZGlkYXRlLCBoZWFkX2RhdGFdYERDYW5kaWRhdGVUaW1lZE91dAwA8QcBZENhbmRpZGF0ZVJlY2VpcHQ8VDo6SGFzaD4AAEEFASBIZWFkRGF0YQAA9QcBJENvcmVJbmRleAACBLxBIGNhbmRpZGF0ZSB0aW1lZCBvdXQuIGBbY2FuZGlkYXRlLCBoZWFkX2RhdGFdYFhVcHdhcmRNZXNzYWdlc1JlY2VpdmVkCAEQZnJvbWkCARhQYXJhSWQAARRjb3VudBABDHUzMgADBPhTb21lIHVwd2FyZCBtZXNzYWdlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgYW5kIHdpbGwgYmUgcHJvY2Vzc2VkLgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldPEHDExwb2xrYWRvdF9wcmltaXRpdmVzCHY3QENhbmRpZGF0ZVJlY2VpcHQEBEgBNAAIAShkZXNjcmlwdG9yFQUBWENhbmRpZGF0ZURlc2NyaXB0b3I8SD4AAUBjb21taXRtZW50c19oYXNoNAEQSGFzaAAA9QcMTHBvbGthZG90X3ByaW1pdGl2ZXMIdjckQ29yZUluZGV4AAAEABABDHUzMgAA+QcMTHBvbGthZG90X3ByaW1pdGl2ZXMIdjcoR3JvdXBJbmRleAAABAAQAQx1MzIAAP0HEGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMUcGFyYXMYcGFsbGV0FEV2ZW50AAEgSEN1cnJlbnRDb2RlVXBkYXRlZAQAaQIBGFBhcmFJZAAABMxDdXJyZW50IGNvZGUgaGFzIGJlZW4gdXBkYXRlZCBmb3IgYSBQYXJhLiBgcGFyYV9pZGBIQ3VycmVudEhlYWRVcGRhdGVkBABpAgEYUGFyYUlkAAEEzEN1cnJlbnQgaGVhZCBoYXMgYmVlbiB1cGRhdGVkIGZvciBhIFBhcmEuIGBwYXJhX2lkYFBDb2RlVXBncmFkZVNjaGVkdWxlZAQAaQIBGFBhcmFJZAACBNxBIGNvZGUgdXBncmFkZSBoYXMgYmVlbiBzY2hlZHVsZWQgZm9yIGEgUGFyYS4gYHBhcmFfaWRgME5ld0hlYWROb3RlZAQAaQIBGFBhcmFJZAADBLxBIG5ldyBoZWFkIGhhcyBiZWVuIG5vdGVkIGZvciBhIFBhcmEuIGBwYXJhX2lkYDBBY3Rpb25RdWV1ZWQIAGkCARhQYXJhSWQAABABMFNlc3Npb25JbmRleAAEBPBBIHBhcmEgaGFzIGJlZW4gcXVldWVkIHRvIGV4ZWN1dGUgcGVuZGluZyBhY3Rpb25zLiBgcGFyYV9pZGA8UHZmQ2hlY2tTdGFydGVkCAAhBQFIVmFsaWRhdGlvbkNvZGVIYXNoAABpAgEYUGFyYUlkAAUIVQFUaGUgZ2l2ZW4gcGFyYSBlaXRoZXIgaW5pdGlhdGVkIG9yIHN1YnNjcmliZWQgdG8gYSBQVkYgY2hlY2sgZm9yIHRoZSBnaXZlbiB2YWxpZGF0aW9ubGNvZGUuIGBjb2RlX2hhc2hgIGBwYXJhX2lkYEBQdmZDaGVja0FjY2VwdGVkCAAhBQFIVmFsaWRhdGlvbkNvZGVIYXNoAABpAgEYUGFyYUlkAAYIEQFUaGUgZ2l2ZW4gdmFsaWRhdGlvbiBjb2RlIHdhcyBhY2NlcHRlZCBieSB0aGUgUFZGIHByZS1jaGVja2luZyB2b3RlLlRgY29kZV9oYXNoYCBgcGFyYV9pZGBAUHZmQ2hlY2tSZWplY3RlZAgAIQUBSFZhbGlkYXRpb25Db2RlSGFzaAAAaQIBGFBhcmFJZAAHCBEBVGhlIGdpdmVuIHZhbGlkYXRpb24gY29kZSB3YXMgcmVqZWN0ZWQgYnkgdGhlIFBWRiBwcmUtY2hlY2tpbmcgdm90ZS5UYGNvZGVfaGFzaGAgYHBhcmFfaWRgBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0AQgQbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucxBocm1wGHBhbGxldBRFdmVudAQEVAABHFBPcGVuQ2hhbm5lbFJlcXVlc3RlZBABGHNlbmRlcmkCARhQYXJhSWQAASRyZWNpcGllbnRpAgEYUGFyYUlkAAFUcHJvcG9zZWRfbWF4X2NhcGFjaXR5EAEMdTMyAAFkcHJvcG9zZWRfbWF4X21lc3NhZ2Vfc2l6ZRABDHUzMgAABHBPcGVuIEhSTVAgY2hhbm5lbCByZXF1ZXN0ZWQuTE9wZW5DaGFubmVsQ2FuY2VsZWQIATBieV9wYXJhY2hhaW5pAgEYUGFyYUlkAAEoY2hhbm5lbF9pZIEFATRIcm1wQ2hhbm5lbElkAAEEKQFBbiBIUk1QIGNoYW5uZWwgcmVxdWVzdCBzZW50IGJ5IHRoZSByZWNlaXZlciB3YXMgY2FuY2VsZWQgYnkgZWl0aGVyIHBhcnR5LkxPcGVuQ2hhbm5lbEFjY2VwdGVkCAEYc2VuZGVyaQIBGFBhcmFJZAABJHJlY2lwaWVudGkCARhQYXJhSWQAAgRsT3BlbiBIUk1QIGNoYW5uZWwgYWNjZXB0ZWQuNENoYW5uZWxDbG9zZWQIATBieV9wYXJhY2hhaW5pAgEYUGFyYUlkAAEoY2hhbm5lbF9pZIEFATRIcm1wQ2hhbm5lbElkAAMEUEhSTVAgY2hhbm5lbCBjbG9zZWQuWEhybXBDaGFubmVsRm9yY2VPcGVuZWQQARhzZW5kZXJpAgEYUGFyYUlkAAEkcmVjaXBpZW50aQIBGFBhcmFJZAABVHByb3Bvc2VkX21heF9jYXBhY2l0eRABDHUzMgABZHByb3Bvc2VkX21heF9tZXNzYWdlX3NpemUQAQx1MzIABASsQW4gSFJNUCBjaGFubmVsIHdhcyBvcGVuZWQgdmlhIFJvb3Qgb3JpZ2luLlxIcm1wU3lzdGVtQ2hhbm5lbE9wZW5lZBABGHNlbmRlcmkCARhQYXJhSWQAASRyZWNpcGllbnRpAgEYUGFyYUlkAAFUcHJvcG9zZWRfbWF4X2NhcGFjaXR5EAEMdTMyAAFkcHJvcG9zZWRfbWF4X21lc3NhZ2Vfc2l6ZRABDHUzMgAFBLxBbiBIUk1QIGNoYW5uZWwgd2FzIG9wZW5lZCB3aXRoIGEgc3lzdGVtIGNoYWluLmhPcGVuQ2hhbm5lbERlcG9zaXRzVXBkYXRlZAgBGHNlbmRlcmkCARhQYXJhSWQAASRyZWNpcGllbnRpAgEYUGFyYUlkAAYEoEFuIEhSTVAgY2hhbm5lbCdzIGRlcG9zaXRzIHdlcmUgdXBkYXRlZC4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXQFCBBscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zIGRpc3B1dGVzGHBhbGxldBRFdmVudAQEVAABDEBEaXNwdXRlSW5pdGlhdGVkCABVBQE0Q2FuZGlkYXRlSGFzaAAACQgBPERpc3B1dGVMb2NhdGlvbgAABAkBQSBkaXNwdXRlIGhhcyBiZWVuIGluaXRpYXRlZC4gXFtjYW5kaWRhdGUgaGFzaCwgZGlzcHV0ZSBsb2NhdGlvblxdQERpc3B1dGVDb25jbHVkZWQIAFUFATRDYW5kaWRhdGVIYXNoAAANCAE0RGlzcHV0ZVJlc3VsdAABCMxBIGRpc3B1dGUgaGFzIGNvbmNsdWRlZCBmb3Igb3IgYWdhaW5zdCBhIGNhbmRpZGF0ZS60YFxbcGFyYSBpZCwgY2FuZGlkYXRlIGhhc2gsIGRpc3B1dGUgcmVzdWx0XF1gGFJldmVydAQAEAFEQmxvY2tOdW1iZXJGb3I8VD4AAhD8QSBkaXNwdXRlIGhhcyBjb25jbHVkZWQgd2l0aCBzdXBlcm1ham9yaXR5IGFnYWluc3QgYSBjYW5kaWRhdGUuDQFCbG9jayBhdXRob3JzIHNob3VsZCBubyBsb25nZXIgYnVpbGQgb24gdG9wIG9mIHRoaXMgaGVhZCBhbmQgc2hvdWxkAQFpbnN0ZWFkIHJldmVydCB0aGUgYmxvY2sgYXQgdGhlIGdpdmVuIGhlaWdodC4gVGhpcyBzaG91bGQgYmUgdGhl/G51bWJlciBvZiB0aGUgY2hpbGQgb2YgdGhlIGxhc3Qga25vd24gdmFsaWQgYmxvY2sgaW4gdGhlIGNoYWluLgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldAkIDGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMgZGlzcHV0ZXM8RGlzcHV0ZUxvY2F0aW9uAAEIFExvY2FsAAAAGFJlbW90ZQABAAANCAxscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zIGRpc3B1dGVzNERpc3B1dGVSZXN1bHQAAQgUVmFsaWQAAAAcSW52YWxpZAABAAARCBBscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zSGFzc2lnbmVyX29uX2RlbWFuZBhwYWxsZXQURXZlbnQEBFQAAQhMT25EZW1hbmRPcmRlclBsYWNlZAwBHHBhcmFfaWRpAgEYUGFyYUlkAAEoc3BvdF9wcmljZRgBMEJhbGFuY2VPZjxUPgABKG9yZGVyZWRfYnkAATBUOjpBY2NvdW50SWQAAAQNAUFuIG9yZGVyIHdhcyBwbGFjZWQgYXQgc29tZSBzcG90IHByaWNlIGFtb3VudCBieSBvcmRlcmVyIG9yZGVyZWRfYnkwU3BvdFByaWNlU2V0BAEoc3BvdF9wcmljZRgBMEJhbGFuY2VPZjxUPgABBLhUaGUgdmFsdWUgb2YgdGhlIHNwb3QgcHJpY2UgaGFzIGxpa2VseSBjaGFuZ2VkBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0FQgQXHBvbGthZG90X3J1bnRpbWVfY29tbW9uPHBhcmFzX3JlZ2lzdHJhchhwYWxsZXQURXZlbnQEBFQAARAoUmVnaXN0ZXJlZAgBHHBhcmFfaWRpAgEYUGFyYUlkAAEcbWFuYWdlcgABMFQ6OkFjY291bnRJZAAAADBEZXJlZ2lzdGVyZWQEARxwYXJhX2lkaQIBGFBhcmFJZAABACBSZXNlcnZlZAgBHHBhcmFfaWRpAgEYUGFyYUlkAAEMd2hvAAEwVDo6QWNjb3VudElkAAIAHFN3YXBwZWQIARxwYXJhX2lkaQIBGFBhcmFJZAABIG90aGVyX2lkaQIBGFBhcmFJZAADAAR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldBkIEFxwb2xrYWRvdF9ydW50aW1lX2NvbW1vbhRzbG90cxhwYWxsZXQURXZlbnQEBFQAAQg4TmV3TGVhc2VQZXJpb2QEATBsZWFzZV9wZXJpb2QQAUBMZWFzZVBlcmlvZE9mPFQ+AAAEkEEgbmV3IGBbbGVhc2VfcGVyaW9kXWAgaXMgYmVnaW5uaW5nLhhMZWFzZWQYARxwYXJhX2lkaQIBGFBhcmFJZAABGGxlYXNlcgABMFQ6OkFjY291bnRJZAABMHBlcmlvZF9iZWdpbhABQExlYXNlUGVyaW9kT2Y8VD4AATBwZXJpb2RfY291bnQQAUBMZWFzZVBlcmlvZE9mPFQ+AAE4ZXh0cmFfcmVzZXJ2ZWQYATBCYWxhbmNlT2Y8VD4AATB0b3RhbF9hbW91bnQYATBCYWxhbmNlT2Y8VD4AAQw1AUEgcGFyYSBoYXMgd29uIHRoZSByaWdodCB0byBhIGNvbnRpbnVvdXMgc2V0IG9mIGxlYXNlIHBlcmlvZHMgYXMgYSBwYXJhY2hhaW4uRQFGaXJzdCBiYWxhbmNlIGlzIGFueSBleHRyYSBhbW91bnQgcmVzZXJ2ZWQgb24gdG9wIG9mIHRoZSBwYXJhJ3MgZXhpc3RpbmcgZGVwb3NpdC6wU2Vjb25kIGJhbGFuY2UgaXMgdGhlIHRvdGFsIGFtb3VudCByZXNlcnZlZC4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXQdCBBccG9sa2Fkb3RfcnVudGltZV9jb21tb24gYXVjdGlvbnMYcGFsbGV0FEV2ZW50BARUAAEcOEF1Y3Rpb25TdGFydGVkDAE0YXVjdGlvbl9pbmRleBABMEF1Y3Rpb25JbmRleAABMGxlYXNlX3BlcmlvZBABQExlYXNlUGVyaW9kT2Y8VD4AARhlbmRpbmcQAURCbG9ja051bWJlckZvcjxUPgAACEkBQW4gYXVjdGlvbiBzdGFydGVkLiBQcm92aWRlcyBpdHMgaW5kZXggYW5kIHRoZSBibG9jayBudW1iZXIgd2hlcmUgaXQgd2lsbCBiZWdpbiB0bxUBY2xvc2UgYW5kIHRoZSBmaXJzdCBsZWFzZSBwZXJpb2Qgb2YgdGhlIHF1YWRydXBsZXQgdGhhdCBpcyBhdWN0aW9uZWQuNEF1Y3Rpb25DbG9zZWQEATRhdWN0aW9uX2luZGV4EAEwQXVjdGlvbkluZGV4AAEEuEFuIGF1Y3Rpb24gZW5kZWQuIEFsbCBmdW5kcyBiZWNvbWUgdW5yZXNlcnZlZC4gUmVzZXJ2ZWQMARhiaWRkZXIAATBUOjpBY2NvdW50SWQAAThleHRyYV9yZXNlcnZlZBgBMEJhbGFuY2VPZjxUPgABMHRvdGFsX2Ftb3VudBgBMEJhbGFuY2VPZjxUPgACCEkBRnVuZHMgd2VyZSByZXNlcnZlZCBmb3IgYSB3aW5uaW5nIGJpZC4gRmlyc3QgYmFsYW5jZSBpcyB0aGUgZXh0cmEgYW1vdW50IHJlc2VydmVkLlBTZWNvbmQgaXMgdGhlIHRvdGFsLihVbnJlc2VydmVkCAEYYmlkZGVyAAEwVDo6QWNjb3VudElkAAEYYW1vdW50GAEwQmFsYW5jZU9mPFQ+AAMEKQFGdW5kcyB3ZXJlIHVucmVzZXJ2ZWQgc2luY2UgYmlkZGVyIGlzIG5vIGxvbmdlciBhY3RpdmUuIGBbYmlkZGVyLCBhbW91bnRdYEhSZXNlcnZlQ29uZmlzY2F0ZWQMARxwYXJhX2lkaQIBGFBhcmFJZAABGGxlYXNlcgABMFQ6OkFjY291bnRJZAABGGFtb3VudBgBMEJhbGFuY2VPZjxUPgAECFUBU29tZW9uZSBhdHRlbXB0ZWQgdG8gbGVhc2UgdGhlIHNhbWUgc2xvdCB0d2ljZSBmb3IgYSBwYXJhY2hhaW4uIFRoZSBhbW91bnQgaXMgaGVsZCBpbrhyZXNlcnZlIGJ1dCBubyBwYXJhY2hhaW4gc2xvdCBoYXMgYmVlbiBsZWFzZWQuLEJpZEFjY2VwdGVkFAEYYmlkZGVyAAEwVDo6QWNjb3VudElkAAEccGFyYV9pZGkCARhQYXJhSWQAARhhbW91bnQYATBCYWxhbmNlT2Y8VD4AAShmaXJzdF9zbG90EAFATGVhc2VQZXJpb2RPZjxUPgABJGxhc3Rfc2xvdBABQExlYXNlUGVyaW9kT2Y8VD4ABQTIQSBuZXcgYmlkIGhhcyBiZWVuIGFjY2VwdGVkIGFzIHRoZSBjdXJyZW50IHdpbm5lci40V2lubmluZ09mZnNldAgBNGF1Y3Rpb25faW5kZXgQATBBdWN0aW9uSW5kZXgAATBibG9ja19udW1iZXIQAURCbG9ja051bWJlckZvcjxUPgAGCFkBVGhlIHdpbm5pbmcgb2Zmc2V0IHdhcyBjaG9zZW4gZm9yIGFuIGF1Y3Rpb24uIFRoaXMgd2lsbCBtYXAgaW50byB0aGUgYFdpbm5pbmdgIHN0b3JhZ2UQbWFwLgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldCEIEFxwb2xrYWRvdF9ydW50aW1lX2NvbW1vbiRjcm93ZGxvYW4YcGFsbGV0FEV2ZW50BARUAAEoHENyZWF0ZWQEARxwYXJhX2lkaQIBGFBhcmFJZAAABIxDcmVhdGUgYSBuZXcgY3Jvd2Rsb2FuaW5nIGNhbXBhaWduLixDb250cmlidXRlZAwBDHdobwABMFQ6OkFjY291bnRJZAABKGZ1bmRfaW5kZXhpAgEYUGFyYUlkAAEYYW1vdW50GAEwQmFsYW5jZU9mPFQ+AAEEcENvbnRyaWJ1dGVkIHRvIGEgY3Jvd2Qgc2FsZS4gV2l0aGRyZXcMAQx3aG8AATBUOjpBY2NvdW50SWQAAShmdW5kX2luZGV4aQIBGFBhcmFJZAABGGFtb3VudBgBMEJhbGFuY2VPZjxUPgACBJxXaXRoZHJldyBmdWxsIGJhbGFuY2Ugb2YgYSBjb250cmlidXRvci5EUGFydGlhbGx5UmVmdW5kZWQEARxwYXJhX2lkaQIBGFBhcmFJZAADCC0BVGhlIGxvYW5zIGluIGEgZnVuZCBoYXZlIGJlZW4gcGFydGlhbGx5IGRpc3NvbHZlZCwgaS5lLiB0aGVyZSBhcmUgc29tZSBsZWZ0tG92ZXIgY2hpbGQga2V5cyB0aGF0IHN0aWxsIG5lZWQgdG8gYmUga2lsbGVkLixBbGxSZWZ1bmRlZAQBHHBhcmFfaWRpAgEYUGFyYUlkAAQEnEFsbCBsb2FucyBpbiBhIGZ1bmQgaGF2ZSBiZWVuIHJlZnVuZGVkLiREaXNzb2x2ZWQEARxwYXJhX2lkaQIBGFBhcmFJZAAFBEhGdW5kIGlzIGRpc3NvbHZlZC48SGFuZGxlQmlkUmVzdWx0CAEccGFyYV9pZGkCARhQYXJhSWQAARhyZXN1bHSZBwE4RGlzcGF0Y2hSZXN1bHQABgT0VGhlIHJlc3VsdCBvZiB0cnlpbmcgdG8gc3VibWl0IGEgbmV3IGJpZCB0byB0aGUgU2xvdHMgcGFsbGV0LhhFZGl0ZWQEARxwYXJhX2lkaQIBGFBhcmFJZAAHBMRUaGUgY29uZmlndXJhdGlvbiB0byBhIGNyb3dkbG9hbiBoYXMgYmVlbiBlZGl0ZWQuLE1lbW9VcGRhdGVkDAEMd2hvAAEwVDo6QWNjb3VudElkAAEccGFyYV9pZGkCARhQYXJhSWQAARBtZW1vOAEcVmVjPHU4PgAIBGBBIG1lbW8gaGFzIGJlZW4gdXBkYXRlZC48QWRkZWRUb05ld1JhaXNlBAEccGFyYV9pZGkCARhQYXJhSWQACQSgQSBwYXJhY2hhaW4gaGFzIGJlZW4gbW92ZWQgdG8gYE5ld1JhaXNlYAR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldCUIEGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMgY29yZXRpbWUYcGFsbGV0FEV2ZW50BARUAAEIUFJldmVudWVJbmZvUmVxdWVzdGVkBAEQd2hlbhABREJsb2NrTnVtYmVyRm9yPFQ+AAAEIQFUaGUgYnJva2VyIGNoYWluIGhhcyBhc2tlZCBmb3IgcmV2ZW51ZSBpbmZvcm1hdGlvbiBmb3IgYSBzcGVjaWZpYyBibG9jay4wQ29yZUFzc2lnbmVkBAEQY29yZfUHASRDb3JlSW5kZXgAAQTsQSBjb3JlIGhhcyByZWNlaXZlZCBhIG5ldyBhc3NpZ25tZW50IGZyb20gdGhlIGJyb2tlciBjaGFpbi4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXQpCAwocGFsbGV0X3hjbRhwYWxsZXQURXZlbnQEBFQAAWAkQXR0ZW1wdGVkBAEcb3V0Y29tZS0IAVB4Y206OmxhdGVzdDo6T3V0Y29tZQAABKhFeGVjdXRpb24gb2YgYW4gWENNIG1lc3NhZ2Ugd2FzIGF0dGVtcHRlZC4QU2VudBABGG9yaWdpbvQBIExvY2F0aW9uAAEsZGVzdGluYXRpb270ASBMb2NhdGlvbgABHG1lc3NhZ2WRBgEcWGNtPCgpPgABKG1lc3NhZ2VfaWQEARxYY21IYXNoAAEEXEEgWENNIG1lc3NhZ2Ugd2FzIHNlbnQuSFVuZXhwZWN0ZWRSZXNwb25zZQgBGG9yaWdpbvQBIExvY2F0aW9uAAEgcXVlcnlfaWQwARxRdWVyeUlkAAIMWQFRdWVyeSByZXNwb25zZSByZWNlaXZlZCB3aGljaCBkb2VzIG5vdCBtYXRjaCBhIHJlZ2lzdGVyZWQgcXVlcnkuIFRoaXMgbWF5IGJlIGJlY2F1c2UgYVUBbWF0Y2hpbmcgcXVlcnkgd2FzIG5ldmVyIHJlZ2lzdGVyZWQsIGl0IG1heSBiZSBiZWNhdXNlIGl0IGlzIGEgZHVwbGljYXRlIHJlc3BvbnNlLCBvcnBiZWNhdXNlIHRoZSBxdWVyeSB0aW1lZCBvdXQuNFJlc3BvbnNlUmVhZHkIASBxdWVyeV9pZDABHFF1ZXJ5SWQAASByZXNwb25zZbEGASBSZXNwb25zZQADCF0BUXVlcnkgcmVzcG9uc2UgaGFzIGJlZW4gcmVjZWl2ZWQgYW5kIGlzIHJlYWR5IGZvciB0YWtpbmcgd2l0aCBgdGFrZV9yZXNwb25zZWAuIFRoZXJlIGlzgG5vIHJlZ2lzdGVyZWQgbm90aWZpY2F0aW9uIGNhbGwuIE5vdGlmaWVkDAEgcXVlcnlfaWQwARxRdWVyeUlkAAEwcGFsbGV0X2luZGV4CAEIdTgAAShjYWxsX2luZGV4CAEIdTgABAhZAVF1ZXJ5IHJlc3BvbnNlIGhhcyBiZWVuIHJlY2VpdmVkIGFuZCBxdWVyeSBpcyByZW1vdmVkLiBUaGUgcmVnaXN0ZXJlZCBub3RpZmljYXRpb24gaGFzqGJlZW4gZGlzcGF0Y2hlZCBhbmQgZXhlY3V0ZWQgc3VjY2Vzc2Z1bGx5LkBOb3RpZnlPdmVyd2VpZ2h0FAEgcXVlcnlfaWQwARxRdWVyeUlkAAEwcGFsbGV0X2luZGV4CAEIdTgAAShjYWxsX2luZGV4CAEIdTgAATRhY3R1YWxfd2VpZ2h0KAEYV2VpZ2h0AAFMbWF4X2J1ZGdldGVkX3dlaWdodCgBGFdlaWdodAAFDEkBUXVlcnkgcmVzcG9uc2UgaGFzIGJlZW4gcmVjZWl2ZWQgYW5kIHF1ZXJ5IGlzIHJlbW92ZWQuIFRoZSByZWdpc3RlcmVkIG5vdGlmaWNhdGlvblkBY291bGQgbm90IGJlIGRpc3BhdGNoZWQgYmVjYXVzZSB0aGUgZGlzcGF0Y2ggd2VpZ2h0IGlzIGdyZWF0ZXIgdGhhbiB0aGUgbWF4aW11bSB3ZWlnaHTkb3JpZ2luYWxseSBidWRnZXRlZCBieSB0aGlzIHJ1bnRpbWUgZm9yIHRoZSBxdWVyeSByZXN1bHQuTE5vdGlmeURpc3BhdGNoRXJyb3IMASBxdWVyeV9pZDABHFF1ZXJ5SWQAATBwYWxsZXRfaW5kZXgIAQh1OAABKGNhbGxfaW5kZXgIAQh1OAAGCFUBUXVlcnkgcmVzcG9uc2UgaGFzIGJlZW4gcmVjZWl2ZWQgYW5kIHF1ZXJ5IGlzIHJlbW92ZWQuIFRoZXJlIHdhcyBhIGdlbmVyYWwgZXJyb3Igd2l0aIhkaXNwYXRjaGluZyB0aGUgbm90aWZpY2F0aW9uIGNhbGwuSE5vdGlmeURlY29kZUZhaWxlZAwBIHF1ZXJ5X2lkMAEcUXVlcnlJZAABMHBhbGxldF9pbmRleAgBCHU4AAEoY2FsbF9pbmRleAgBCHU4AAcMUQFRdWVyeSByZXNwb25zZSBoYXMgYmVlbiByZWNlaXZlZCBhbmQgcXVlcnkgaXMgcmVtb3ZlZC4gVGhlIGRpc3BhdGNoIHdhcyB1bmFibGUgdG8gYmVZAWRlY29kZWQgaW50byBhIGBDYWxsYDsgdGhpcyBtaWdodCBiZSBkdWUgdG8gZGlzcGF0Y2ggZnVuY3Rpb24gaGF2aW5nIGEgc2lnbmF0dXJlIHdoaWNolGlzIG5vdCBgKG9yaWdpbiwgUXVlcnlJZCwgUmVzcG9uc2UpYC5ASW52YWxpZFJlc3BvbmRlcgwBGG9yaWdpbvQBIExvY2F0aW9uAAEgcXVlcnlfaWQwARxRdWVyeUlkAAFEZXhwZWN0ZWRfbG9jYXRpb27FBgFAT3B0aW9uPExvY2F0aW9uPgAIDFkBRXhwZWN0ZWQgcXVlcnkgcmVzcG9uc2UgaGFzIGJlZW4gcmVjZWl2ZWQgYnV0IHRoZSBvcmlnaW4gbG9jYXRpb24gb2YgdGhlIHJlc3BvbnNlIGRvZXNVAW5vdCBtYXRjaCB0aGF0IGV4cGVjdGVkLiBUaGUgcXVlcnkgcmVtYWlucyByZWdpc3RlcmVkIGZvciBhIGxhdGVyLCB2YWxpZCwgcmVzcG9uc2UgdG9sYmUgcmVjZWl2ZWQgYW5kIGFjdGVkIHVwb24uXEludmFsaWRSZXNwb25kZXJWZXJzaW9uCAEYb3JpZ2lu9AEgTG9jYXRpb24AASBxdWVyeV9pZDABHFF1ZXJ5SWQACRxRAUV4cGVjdGVkIHF1ZXJ5IHJlc3BvbnNlIGhhcyBiZWVuIHJlY2VpdmVkIGJ1dCB0aGUgZXhwZWN0ZWQgb3JpZ2luIGxvY2F0aW9uIHBsYWNlZCBpbk0Bc3RvcmFnZSBieSB0aGlzIHJ1bnRpbWUgcHJldmlvdXNseSBjYW5ub3QgYmUgZGVjb2RlZC4gVGhlIHF1ZXJ5IHJlbWFpbnMgcmVnaXN0ZXJlZC4AQQFUaGlzIGlzIHVuZXhwZWN0ZWQgKHNpbmNlIGEgbG9jYXRpb24gcGxhY2VkIGluIHN0b3JhZ2UgaW4gYSBwcmV2aW91c2x5IGV4ZWN1dGluZ00BcnVudGltZSBzaG91bGQgYmUgcmVhZGFibGUgcHJpb3IgdG8gcXVlcnkgdGltZW91dCkgYW5kIGRhbmdlcm91cyBzaW5jZSB0aGUgcG9zc2libHlZAXZhbGlkIHJlc3BvbnNlIHdpbGwgYmUgZHJvcHBlZC4gTWFudWFsIGdvdmVybmFuY2UgaW50ZXJ2ZW50aW9uIGlzIHByb2JhYmx5IGdvaW5nIHRvIGJlHG5lZWRlZC40UmVzcG9uc2VUYWtlbgQBIHF1ZXJ5X2lkMAEcUXVlcnlJZAAKBMhSZWNlaXZlZCBxdWVyeSByZXNwb25zZSBoYXMgYmVlbiByZWFkIGFuZCByZW1vdmVkLjRBc3NldHNUcmFwcGVkDAEQaGFzaDQBEEgyNTYAARhvcmlnaW70ASBMb2NhdGlvbgABGGFzc2V0c9kGATxWZXJzaW9uZWRBc3NldHMACwS4U29tZSBhc3NldHMgaGF2ZSBiZWVuIHBsYWNlZCBpbiBhbiBhc3NldCB0cmFwLlRWZXJzaW9uQ2hhbmdlTm90aWZpZWQQASxkZXN0aW5hdGlvbvQBIExvY2F0aW9uAAEYcmVzdWx0EAEoWGNtVmVyc2lvbgABEGNvc3SdBgEYQXNzZXRzAAEobWVzc2FnZV9pZAQBHFhjbUhhc2gADAwlAUFuIFhDTSB2ZXJzaW9uIGNoYW5nZSBub3RpZmljYXRpb24gbWVzc2FnZSBoYXMgYmVlbiBhdHRlbXB0ZWQgdG8gYmUgc2VudC4A4FRoZSBjb3N0IG9mIHNlbmRpbmcgaXQgKGJvcm5lIGJ5IHRoZSBjaGFpbikgaXMgaW5jbHVkZWQuXFN1cHBvcnRlZFZlcnNpb25DaGFuZ2VkCAEgbG9jYXRpb270ASBMb2NhdGlvbgABHHZlcnNpb24QAShYY21WZXJzaW9uAA0IOQFUaGUgc3VwcG9ydGVkIHZlcnNpb24gb2YgYSBsb2NhdGlvbiBoYXMgYmVlbiBjaGFuZ2VkLiBUaGlzIG1pZ2h0IGJlIHRocm91Z2ggYW7AYXV0b21hdGljIG5vdGlmaWNhdGlvbiBvciBhIG1hbnVhbCBpbnRlcnZlbnRpb24uUE5vdGlmeVRhcmdldFNlbmRGYWlsDAEgbG9jYXRpb270ASBMb2NhdGlvbgABIHF1ZXJ5X2lkMAEcUXVlcnlJZAABFGVycm9yWQYBIFhjbUVycm9yAA4IWQFBIGdpdmVuIGxvY2F0aW9uIHdoaWNoIGhhZCBhIHZlcnNpb24gY2hhbmdlIHN1YnNjcmlwdGlvbiB3YXMgZHJvcHBlZCBvd2luZyB0byBhbiBlcnJvcnxzZW5kaW5nIHRoZSBub3RpZmljYXRpb24gdG8gaXQuZE5vdGlmeVRhcmdldE1pZ3JhdGlvbkZhaWwIASBsb2NhdGlvbi0BAURWZXJzaW9uZWRMb2NhdGlvbgABIHF1ZXJ5X2lkMAEcUXVlcnlJZAAPCFkBQSBnaXZlbiBsb2NhdGlvbiB3aGljaCBoYWQgYSB2ZXJzaW9uIGNoYW5nZSBzdWJzY3JpcHRpb24gd2FzIGRyb3BwZWQgb3dpbmcgdG8gYW4gZXJyb3K0bWlncmF0aW5nIHRoZSBsb2NhdGlvbiB0byBvdXIgbmV3IFhDTSBmb3JtYXQuVEludmFsaWRRdWVyaWVyVmVyc2lvbggBGG9yaWdpbvQBIExvY2F0aW9uAAEgcXVlcnlfaWQwARxRdWVyeUlkABAcVQFFeHBlY3RlZCBxdWVyeSByZXNwb25zZSBoYXMgYmVlbiByZWNlaXZlZCBidXQgdGhlIGV4cGVjdGVkIHF1ZXJpZXIgbG9jYXRpb24gcGxhY2VkIGluTQFzdG9yYWdlIGJ5IHRoaXMgcnVudGltZSBwcmV2aW91c2x5IGNhbm5vdCBiZSBkZWNvZGVkLiBUaGUgcXVlcnkgcmVtYWlucyByZWdpc3RlcmVkLgBBAVRoaXMgaXMgdW5leHBlY3RlZCAoc2luY2UgYSBsb2NhdGlvbiBwbGFjZWQgaW4gc3RvcmFnZSBpbiBhIHByZXZpb3VzbHkgZXhlY3V0aW5nTQFydW50aW1lIHNob3VsZCBiZSByZWFkYWJsZSBwcmlvciB0byBxdWVyeSB0aW1lb3V0KSBhbmQgZGFuZ2Vyb3VzIHNpbmNlIHRoZSBwb3NzaWJseVkBdmFsaWQgcmVzcG9uc2Ugd2lsbCBiZSBkcm9wcGVkLiBNYW51YWwgZ292ZXJuYW5jZSBpbnRlcnZlbnRpb24gaXMgcHJvYmFibHkgZ29pbmcgdG8gYmUcbmVlZGVkLjhJbnZhbGlkUXVlcmllchABGG9yaWdpbvQBIExvY2F0aW9uAAEgcXVlcnlfaWQwARxRdWVyeUlkAAFAZXhwZWN0ZWRfcXVlcmllcvQBIExvY2F0aW9uAAFQbWF5YmVfYWN0dWFsX3F1ZXJpZXLFBgFAT3B0aW9uPExvY2F0aW9uPgARDF0BRXhwZWN0ZWQgcXVlcnkgcmVzcG9uc2UgaGFzIGJlZW4gcmVjZWl2ZWQgYnV0IHRoZSBxdWVyaWVyIGxvY2F0aW9uIG9mIHRoZSByZXNwb25zZSBkb2VzUQFub3QgbWF0Y2ggdGhlIGV4cGVjdGVkLiBUaGUgcXVlcnkgcmVtYWlucyByZWdpc3RlcmVkIGZvciBhIGxhdGVyLCB2YWxpZCwgcmVzcG9uc2UgdG9sYmUgcmVjZWl2ZWQgYW5kIGFjdGVkIHVwb24uUFZlcnNpb25Ob3RpZnlTdGFydGVkDAEsZGVzdGluYXRpb270ASBMb2NhdGlvbgABEGNvc3SdBgEYQXNzZXRzAAEobWVzc2FnZV9pZAQBHFhjbUhhc2gAEghZAUEgcmVtb3RlIGhhcyByZXF1ZXN0ZWQgWENNIHZlcnNpb24gY2hhbmdlIG5vdGlmaWNhdGlvbiBmcm9tIHVzIGFuZCB3ZSBoYXZlIGhvbm9yZWQgaXQuHQFBIHZlcnNpb24gaW5mb3JtYXRpb24gbWVzc2FnZSBpcyBzZW50IHRvIHRoZW0gYW5kIGl0cyBjb3N0IGlzIGluY2x1ZGVkLlhWZXJzaW9uTm90aWZ5UmVxdWVzdGVkDAEsZGVzdGluYXRpb270ASBMb2NhdGlvbgABEGNvc3SdBgEYQXNzZXRzAAEobWVzc2FnZV9pZAQBHFhjbUhhc2gAEwQ9AVdlIGhhdmUgcmVxdWVzdGVkIHRoYXQgYSByZW1vdGUgY2hhaW4gc2VuZCB1cyBYQ00gdmVyc2lvbiBjaGFuZ2Ugbm90aWZpY2F0aW9ucy5gVmVyc2lvbk5vdGlmeVVucmVxdWVzdGVkDAEsZGVzdGluYXRpb270ASBMb2NhdGlvbgABEGNvc3SdBgEYQXNzZXRzAAEobWVzc2FnZV9pZAQBHFhjbUhhc2gAFAglAVdlIGhhdmUgcmVxdWVzdGVkIHRoYXQgYSByZW1vdGUgY2hhaW4gc3RvcHMgc2VuZGluZyB1cyBYQ00gdmVyc2lvbiBjaGFuZ2U4bm90aWZpY2F0aW9ucy4gRmVlc1BhaWQIARhwYXlpbmf0ASBMb2NhdGlvbgABEGZlZXOdBgEYQXNzZXRzABUEMQFGZWVzIHdlcmUgcGFpZCBmcm9tIGEgbG9jYXRpb24gZm9yIGFuIG9wZXJhdGlvbiAob2Z0ZW4gZm9yIHVzaW5nIGBTZW5kWGNtYCkuNEFzc2V0c0NsYWltZWQMARBoYXNoNAEQSDI1NgABGG9yaWdpbvQBIExvY2F0aW9uAAEYYXNzZXRz2QYBPFZlcnNpb25lZEFzc2V0cwAWBMBTb21lIGFzc2V0cyBoYXZlIGJlZW4gY2xhaW1lZCBmcm9tIGFuIGFzc2V0IHRyYXBgVmVyc2lvbk1pZ3JhdGlvbkZpbmlzaGVkBAEcdmVyc2lvbhABKFhjbVZlcnNpb24AFwSEQSBYQ00gdmVyc2lvbiBtaWdyYXRpb24gZmluaXNoZWQuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0LQgQLHN0YWdpbmdfeGNtCHY0GHRyYWl0cxxPdXRjb21lAAEMIENvbXBsZXRlBAEQdXNlZCgBGFdlaWdodAAAAChJbmNvbXBsZXRlCAEQdXNlZCgBGFdlaWdodAABFGVycm9yWQYBFEVycm9yAAEAFEVycm9yBAEUZXJyb3JZBgEURXJyb3IAAgAAMQgMUHBhbGxldF9tZXNzYWdlX3F1ZXVlGHBhbGxldBRFdmVudAQEVAABEEBQcm9jZXNzaW5nRmFpbGVkDAEIaWQ0ARBIMjU2BJRUaGUgYGJsYWtlMl8yNTZgIGhhc2ggb2YgdGhlIG1lc3NhZ2UuARhvcmlnaW4VBwFITWVzc2FnZU9yaWdpbk9mPFQ+BGRUaGUgcXVldWUgb2YgdGhlIG1lc3NhZ2UuARRlcnJvcjUIAUxQcm9jZXNzTWVzc2FnZUVycm9yEGBUaGUgZXJyb3IgdGhhdCBvY2N1cnJlZC4ASQFUaGlzIGVycm9yIGlzIHByZXR0eSBvcGFxdWUuIE1vcmUgZmluZS1ncmFpbmVkIGVycm9ycyBuZWVkIHRvIGJlIGVtaXR0ZWQgYXMgZXZlbnRzaGJ5IHRoZSBgTWVzc2FnZVByb2Nlc3NvcmAuAARVAU1lc3NhZ2UgZGlzY2FyZGVkIGR1ZSB0byBhbiBlcnJvciBpbiB0aGUgYE1lc3NhZ2VQcm9jZXNzb3JgICh1c3VhbGx5IGEgZm9ybWF0IGVycm9yKS4kUHJvY2Vzc2VkEAEIaWQ0ARBIMjU2BJRUaGUgYGJsYWtlMl8yNTZgIGhhc2ggb2YgdGhlIG1lc3NhZ2UuARhvcmlnaW4VBwFITWVzc2FnZU9yaWdpbk9mPFQ+BGRUaGUgcXVldWUgb2YgdGhlIG1lc3NhZ2UuASx3ZWlnaHRfdXNlZCgBGFdlaWdodATASG93IG11Y2ggd2VpZ2h0IHdhcyB1c2VkIHRvIHByb2Nlc3MgdGhlIG1lc3NhZ2UuARxzdWNjZXNzIAEQYm9vbBiIV2hldGhlciB0aGUgbWVzc2FnZSB3YXMgcHJvY2Vzc2VkLgBJAU5vdGUgdGhhdCB0aGlzIGRvZXMgbm90IG1lYW4gdGhhdCB0aGUgdW5kZXJseWluZyBgTWVzc2FnZVByb2Nlc3NvcmAgd2FzIGludGVybmFsbHk1AXN1Y2Nlc3NmdWwuIEl0ICpzb2xlbHkqIG1lYW5zIHRoYXQgdGhlIE1RIHBhbGxldCB3aWxsIHRyZWF0IHRoaXMgYXMgYSBzdWNjZXNzTQFjb25kaXRpb24gYW5kIGRpc2NhcmQgdGhlIG1lc3NhZ2UuIEFueSBpbnRlcm5hbCBlcnJvciBuZWVkcyB0byBiZSBlbWl0dGVkIGFzIGV2ZW50c2hieSB0aGUgYE1lc3NhZ2VQcm9jZXNzb3JgLgEEVE1lc3NhZ2UgaXMgcHJvY2Vzc2VkLkhPdmVyd2VpZ2h0RW5xdWV1ZWQQAQhpZAQBIFt1ODsgMzJdBJRUaGUgYGJsYWtlMl8yNTZgIGhhc2ggb2YgdGhlIG1lc3NhZ2UuARhvcmlnaW4VBwFITWVzc2FnZU9yaWdpbk9mPFQ+BGRUaGUgcXVldWUgb2YgdGhlIG1lc3NhZ2UuAShwYWdlX2luZGV4EAEkUGFnZUluZGV4BGBUaGUgcGFnZSBvZiB0aGUgbWVzc2FnZS4BNG1lc3NhZ2VfaW5kZXgQARxUOjpTaXplBKRUaGUgaW5kZXggb2YgdGhlIG1lc3NhZ2Ugd2l0aGluIHRoZSBwYWdlLgIEjE1lc3NhZ2UgcGxhY2VkIGluIG92ZXJ3ZWlnaHQgcXVldWUuKFBhZ2VSZWFwZWQIARhvcmlnaW4VBwFITWVzc2FnZU9yaWdpbk9mPFQ+BFhUaGUgcXVldWUgb2YgdGhlIHBhZ2UuARRpbmRleBABJFBhZ2VJbmRleARYVGhlIGluZGV4IG9mIHRoZSBwYWdlLgMEVFRoaXMgcGFnZSB3YXMgcmVhcGVkLgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldDUIEDRmcmFtZV9zdXBwb3J0GHRyYWl0cyBtZXNzYWdlc0xQcm9jZXNzTWVzc2FnZUVycm9yAAEYJEJhZEZvcm1hdAAAABxDb3JydXB0AAEALFVuc3VwcG9ydGVkAAIAKE92ZXJ3ZWlnaHQEACgBGFdlaWdodAADABRZaWVsZAAEAERTdGFja0xpbWl0UmVhY2hlZAAFAAA5CAxEcGFsbGV0X2Fzc2V0X3JhdGUYcGFsbGV0FEV2ZW50BARUAAEMQEFzc2V0UmF0ZUNyZWF0ZWQIAShhc3NldF9raW5kxAEwVDo6QXNzZXRLaW5kAAEQcmF0ZSEHASRGaXhlZFUxMjgAAABAQXNzZXRSYXRlUmVtb3ZlZAQBKGFzc2V0X2tpbmTEATBUOjpBc3NldEtpbmQAAQBAQXNzZXRSYXRlVXBkYXRlZAwBKGFzc2V0X2tpbmTEATBUOjpBc3NldEtpbmQAAQxvbGQhBwEkRml4ZWRVMTI4AAEMbmV3IQcBJEZpeGVkVTEyOAACAAR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldD0ICDBmcmFtZV9zeXN0ZW0UUGhhc2UAAQw4QXBwbHlFeHRyaW5zaWMEABABDHUzMgAAADBGaW5hbGl6YXRpb24AAQA4SW5pdGlhbGl6YXRpb24AAgAAQQgAAAL1AgBFCAgwZnJhbWVfc3lzdGVtWExhc3RSdW50aW1lVXBncmFkZUluZm8AAAgBMHNwZWNfdmVyc2lvbtQBTGNvZGVjOjpDb21wYWN0PHUzMj4AASRzcGVjX25hbWVJCAFkc3BfcnVudGltZTo6UnVudGltZVN0cmluZwAASQgAAAUCAE0ICDBmcmFtZV9zeXN0ZW1gQ29kZVVwZ3JhZGVBdXRob3JpemF0aW9uBARUAAAIASRjb2RlX2hhc2g0ARxUOjpIYXNoAAE0Y2hlY2tfdmVyc2lvbiABEGJvb2wAAFEIDDBmcmFtZV9zeXN0ZW0YbGltaXRzMEJsb2NrV2VpZ2h0cwAADAEoYmFzZV9ibG9jaygBGFdlaWdodAABJG1heF9ibG9jaygBGFdlaWdodAABJHBlcl9jbGFzc1UIAYRQZXJEaXNwYXRjaENsYXNzPFdlaWdodHNQZXJDbGFzcz4AAFUIDDRmcmFtZV9zdXBwb3J0IGRpc3BhdGNoQFBlckRpc3BhdGNoQ2xhc3MEBFQBWQgADAEYbm9ybWFsWQgBBFQAASxvcGVyYXRpb25hbFkIAQRUAAEkbWFuZGF0b3J5WQgBBFQAAFkIDDBmcmFtZV9zeXN0ZW0YbGltaXRzPFdlaWdodHNQZXJDbGFzcwAAEAE4YmFzZV9leHRyaW5zaWMoARhXZWlnaHQAATRtYXhfZXh0cmluc2ljcQcBOE9wdGlvbjxXZWlnaHQ+AAEkbWF4X3RvdGFscQcBOE9wdGlvbjxXZWlnaHQ+AAEgcmVzZXJ2ZWRxBwE4T3B0aW9uPFdlaWdodD4AAF0IDDBmcmFtZV9zeXN0ZW0YbGltaXRzLEJsb2NrTGVuZ3RoAAAEAQxtYXhhCAFUUGVyRGlzcGF0Y2hDbGFzczx1MzI+AABhCAw0ZnJhbWVfc3VwcG9ydCBkaXNwYXRjaEBQZXJEaXNwYXRjaENsYXNzBARUARAADAEYbm9ybWFsEAEEVAABLG9wZXJhdGlvbmFsEAEEVAABJG1hbmRhdG9yeRABBFQAAGUICChzcF93ZWlnaHRzPFJ1bnRpbWVEYldlaWdodAAACAEQcmVhZDABDHU2NAABFHdyaXRlMAEMdTY0AABpCAgoc3BfdmVyc2lvbjhSdW50aW1lVmVyc2lvbgAAIAEkc3BlY19uYW1lSQgBNFJ1bnRpbWVTdHJpbmcAASRpbXBsX25hbWVJCAE0UnVudGltZVN0cmluZwABRGF1dGhvcmluZ192ZXJzaW9uEAEMdTMyAAEwc3BlY192ZXJzaW9uEAEMdTMyAAEwaW1wbF92ZXJzaW9uEAEMdTMyAAEQYXBpc20IARxBcGlzVmVjAAFMdHJhbnNhY3Rpb25fdmVyc2lvbhABDHUzMgABNHN0YXRlX3ZlcnNpb24IAQh1OAAAbQgEDENvdwQEVAFxCAAEAHEIAAAAcQgAAAJ1CAB1CAAABAgBBhAAeQgMMGZyYW1lX3N5c3RlbRhwYWxsZXQURXJyb3IEBFQAASQ8SW52YWxpZFNwZWNOYW1lAAAIEQFUaGUgbmFtZSBvZiBzcGVjaWZpY2F0aW9uIGRvZXMgbm90IG1hdGNoIGJldHdlZW4gdGhlIGN1cnJlbnQgcnVudGltZVBhbmQgdGhlIG5ldyBydW50aW1lLmhTcGVjVmVyc2lvbk5lZWRzVG9JbmNyZWFzZQABCEEBVGhlIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpcyBub3QgYWxsb3dlZCB0byBkZWNyZWFzZSBiZXR3ZWVuIHRoZSBjdXJyZW50IHJ1bnRpbWVQYW5kIHRoZSBuZXcgcnVudGltZS50RmFpbGVkVG9FeHRyYWN0UnVudGltZVZlcnNpb24AAgzsRmFpbGVkIHRvIGV4dHJhY3QgdGhlIHJ1bnRpbWUgdmVyc2lvbiBmcm9tIHRoZSBuZXcgcnVudGltZS4ACQFFaXRoZXIgY2FsbGluZyBgQ29yZV92ZXJzaW9uYCBvciBkZWNvZGluZyBgUnVudGltZVZlcnNpb25gIGZhaWxlZC5MTm9uRGVmYXVsdENvbXBvc2l0ZQADBPxTdWljaWRlIGNhbGxlZCB3aGVuIHRoZSBhY2NvdW50IGhhcyBub24tZGVmYXVsdCBjb21wb3NpdGUgZGF0YS48Tm9uWmVyb1JlZkNvdW50AAQENQFUaGVyZSBpcyBhIG5vbi16ZXJvIHJlZmVyZW5jZSBjb3VudCBwcmV2ZW50aW5nIHRoZSBhY2NvdW50IGZyb20gYmVpbmcgcHVyZ2VkLjBDYWxsRmlsdGVyZWQABQTQVGhlIG9yaWdpbiBmaWx0ZXIgcHJldmVudCB0aGUgY2FsbCB0byBiZSBkaXNwYXRjaGVkLmxNdWx0aUJsb2NrTWlncmF0aW9uc09uZ29pbmcABgRVAUEgbXVsdGktYmxvY2sgbWlncmF0aW9uIGlzIG9uZ29pbmcgYW5kIHByZXZlbnRzIHRoZSBjdXJyZW50IGNvZGUgZnJvbSBiZWluZyByZXBsYWNlZC5ETm90aGluZ0F1dGhvcml6ZWQABwRYTm8gdXBncmFkZSBhdXRob3JpemVkLjBVbmF1dGhvcml6ZWQACASUVGhlIHN1Ym1pdHRlZCBjb2RlIGlzIG5vdCBhdXRob3JpemVkLgRsRXJyb3IgZm9yIHRoZSBTeXN0ZW0gcGFsbGV0fQgMTGJvdW5kZWRfY29sbGVjdGlvbnNAd2Vha19ib3VuZGVkX3ZlYzhXZWFrQm91bmRlZFZlYwgEVAGBCARTAAAEAIUIARhWZWM8VD4AAIEIAAAECH0BMACFCAAAAoEIAIkIDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBBARTAAAEAI0IARhWZWM8VD4AAI0IAAACBACRCAQYT3B0aW9uBARUAZUIAQgQTm9uZQAAABBTb21lBACVCAAAAQAAlQgMRHNwX2NvbnNlbnN1c19iYWJlHGRpZ2VzdHMkUHJlRGlnZXN0AAEMHFByaW1hcnkEAJkIAUBQcmltYXJ5UHJlRGlnZXN0AAEAOFNlY29uZGFyeVBsYWluBAChCAFcU2Vjb25kYXJ5UGxhaW5QcmVEaWdlc3QAAgAwU2Vjb25kYXJ5VlJGBAClCAFUU2Vjb25kYXJ5VlJGUHJlRGlnZXN0AAMAAJkIDERzcF9jb25zZW5zdXNfYmFiZRxkaWdlc3RzQFByaW1hcnlQcmVEaWdlc3QAAAwBPGF1dGhvcml0eV9pbmRleBABVHN1cGVyOjpBdXRob3JpdHlJbmRleAABEHNsb3SBAQEQU2xvdAABNHZyZl9zaWduYXR1cmWdCAEwVnJmU2lnbmF0dXJlAACdCBAcc3BfY29yZRxzcjI1NTE5DHZyZjBWcmZTaWduYXR1cmUAAAgBKHByZV9vdXRwdXQEATBWcmZQcmVPdXRwdXQAARRwcm9vZiUCASBWcmZQcm9vZgAAoQgMRHNwX2NvbnNlbnN1c19iYWJlHGRpZ2VzdHNcU2Vjb25kYXJ5UGxhaW5QcmVEaWdlc3QAAAgBPGF1dGhvcml0eV9pbmRleBABVHN1cGVyOjpBdXRob3JpdHlJbmRleAABEHNsb3SBAQEQU2xvdAAApQgMRHNwX2NvbnNlbnN1c19iYWJlHGRpZ2VzdHNUU2Vjb25kYXJ5VlJGUHJlRGlnZXN0AAAMATxhdXRob3JpdHlfaW5kZXgQAVRzdXBlcjo6QXV0aG9yaXR5SW5kZXgAARBzbG90gQEBEFNsb3QAATR2cmZfc2lnbmF0dXJlnQgBMFZyZlNpZ25hdHVyZQAAqQgIRHNwX2NvbnNlbnN1c19iYWJlWEJhYmVFcG9jaENvbmZpZ3VyYXRpb24AAAgBBGONAQEoKHU2NCwgdTY0KQABNGFsbG93ZWRfc2xvdHORAQEwQWxsb3dlZFNsb3RzAACtCAxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAbEIBFMAAAQAtQgBGFZlYzxUPgAAsQgAAAQIMBAAtQgAAAKxCAC5CAwscGFsbGV0X2JhYmUYcGFsbGV0FEVycm9yBARUAAEQYEludmFsaWRFcXVpdm9jYXRpb25Qcm9vZgAABDEBQW4gZXF1aXZvY2F0aW9uIHByb29mIHByb3ZpZGVkIGFzIHBhcnQgb2YgYW4gZXF1aXZvY2F0aW9uIHJlcG9ydCBpcyBpbnZhbGlkLmBJbnZhbGlkS2V5T3duZXJzaGlwUHJvb2YAAQQxAUEga2V5IG93bmVyc2hpcCBwcm9vZiBwcm92aWRlZCBhcyBwYXJ0IG9mIGFuIGVxdWl2b2NhdGlvbiByZXBvcnQgaXMgaW52YWxpZC5YRHVwbGljYXRlT2ZmZW5jZVJlcG9ydAACBBUBQSBnaXZlbiBlcXVpdm9jYXRpb24gcmVwb3J0IGlzIHZhbGlkIGJ1dCBhbHJlYWR5IHByZXZpb3VzbHkgcmVwb3J0ZWQuUEludmFsaWRDb25maWd1cmF0aW9uAAMEjFN1Ym1pdHRlZCBjb25maWd1cmF0aW9uIGlzIGludmFsaWQuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0Lr0IAAAEDAAYIADBCAw4cGFsbGV0X2luZGljZXMYcGFsbGV0FEVycm9yBARUAAEULE5vdEFzc2lnbmVkAAAEjFRoZSBpbmRleCB3YXMgbm90IGFscmVhZHkgYXNzaWduZWQuIE5vdE93bmVyAAEEpFRoZSBpbmRleCBpcyBhc3NpZ25lZCB0byBhbm90aGVyIGFjY291bnQuFEluVXNlAAIEcFRoZSBpbmRleCB3YXMgbm90IGF2YWlsYWJsZS4sTm90VHJhbnNmZXIAAwTIVGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gYWNjb3VudHMgYXJlIGlkZW50aWNhbC4kUGVybWFuZW50AAQE0FRoZSBpbmRleCBpcyBwZXJtYW5lbnQgYW5kIG1heSBub3QgYmUgZnJlZWQvY2hhbmdlZC4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQuxQgMTGJvdW5kZWRfY29sbGVjdGlvbnNAd2Vha19ib3VuZGVkX3ZlYzhXZWFrQm91bmRlZFZlYwgEVAHJCARTAAAEANEIARhWZWM8VD4AAMkIDDxwYWxsZXRfYmFsYW5jZXMUdHlwZXMsQmFsYW5jZUxvY2sEHEJhbGFuY2UBGAAMAQhpZAEGAThMb2NrSWRlbnRpZmllcgABGGFtb3VudBgBHEJhbGFuY2UAARxyZWFzb25zzQgBHFJlYXNvbnMAAM0IDDxwYWxsZXRfYmFsYW5jZXMUdHlwZXMcUmVhc29ucwABDAxGZWUAAAAQTWlzYwABAAxBbGwAAgAA0QgAAALJCADVCAxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAdkIBFMAAAQA3QgBGFZlYzxUPgAA2QgMPHBhbGxldF9iYWxhbmNlcxR0eXBlcyxSZXNlcnZlRGF0YQhEUmVzZXJ2ZUlkZW50aWZpZXIBAQYcQmFsYW5jZQEYAAgBCGlkAQYBRFJlc2VydmVJZGVudGlmaWVyAAEYYW1vdW50GAEcQmFsYW5jZQAA3QgAAALZCADhCAxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAeUIBFMAAAQA9QgBGFZlYzxUPgAA5QgUNGZyYW1lX3N1cHBvcnQYdHJhaXRzGHRva2VucxBtaXNjIElkQW1vdW50CAhJZAHpCBxCYWxhbmNlARgACAEIaWTpCAEISWQAARhhbW91bnQYARxCYWxhbmNlAADpCAhYc3RhZ2luZ19rdXNhbWFfcnVudGltZURSdW50aW1lSG9sZFJlYXNvbgABCCBQcmVpbWFnZQQA7QgBbHBhbGxldF9wcmVpbWFnZTo6SG9sZFJlYXNvbgAgAAxOaXMEAPEIAVhwYWxsZXRfbmlzOjpIb2xkUmVhc29uACYAAO0IDDxwYWxsZXRfcHJlaW1hZ2UYcGFsbGV0KEhvbGRSZWFzb24AAQQgUHJlaW1hZ2UAAAAA8QgMKHBhbGxldF9uaXMYcGFsbGV0KEhvbGRSZWFzb24AAQQoTmZ0UmVjZWlwdAAAAAD1CAAAAuUIAPkIDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQB/QgEUwAABAAJCQEYVmVjPFQ+AAD9CBQ0ZnJhbWVfc3VwcG9ydBh0cmFpdHMYdG9rZW5zEG1pc2MgSWRBbW91bnQICElkAQEJHEJhbGFuY2UBGAAIAQhpZAEJAQhJZAABGGFtb3VudBgBHEJhbGFuY2UAAAEJCFhzdGFnaW5nX2t1c2FtYV9ydW50aW1lTFJ1bnRpbWVGcmVlemVSZWFzb24AAQQ8Tm9taW5hdGlvblBvb2xzBAAFCQGUcGFsbGV0X25vbWluYXRpb25fcG9vbHM6OkZyZWV6ZVJlYXNvbgApAAAFCQxccGFsbGV0X25vbWluYXRpb25fcG9vbHMYcGFsbGV0MEZyZWV6ZVJlYXNvbgABBDhQb29sTWluQmFsYW5jZQAAAAAJCQAAAv0IAA0JDDxwYWxsZXRfYmFsYW5jZXMYcGFsbGV0FEVycm9yCARUAARJAAEwOFZlc3RpbmdCYWxhbmNlAAAEnFZlc3RpbmcgYmFsYW5jZSB0b28gaGlnaCB0byBzZW5kIHZhbHVlLlRMaXF1aWRpdHlSZXN0cmljdGlvbnMAAQTIQWNjb3VudCBsaXF1aWRpdHkgcmVzdHJpY3Rpb25zIHByZXZlbnQgd2l0aGRyYXdhbC5MSW5zdWZmaWNpZW50QmFsYW5jZQACBHhCYWxhbmNlIHRvbyBsb3cgdG8gc2VuZCB2YWx1ZS5IRXhpc3RlbnRpYWxEZXBvc2l0AAME7FZhbHVlIHRvbyBsb3cgdG8gY3JlYXRlIGFjY291bnQgZHVlIHRvIGV4aXN0ZW50aWFsIGRlcG9zaXQuNEV4cGVuZGFiaWxpdHkABASQVHJhbnNmZXIvcGF5bWVudCB3b3VsZCBraWxsIGFjY291bnQuXEV4aXN0aW5nVmVzdGluZ1NjaGVkdWxlAAUEzEEgdmVzdGluZyBzY2hlZHVsZSBhbHJlYWR5IGV4aXN0cyBmb3IgdGhpcyBhY2NvdW50LixEZWFkQWNjb3VudAAGBIxCZW5lZmljaWFyeSBhY2NvdW50IG11c3QgcHJlLWV4aXN0LjxUb29NYW55UmVzZXJ2ZXMABwS4TnVtYmVyIG9mIG5hbWVkIHJlc2VydmVzIGV4Y2VlZCBgTWF4UmVzZXJ2ZXNgLjBUb29NYW55SG9sZHMACAT4TnVtYmVyIG9mIGhvbGRzIGV4Y2VlZCBgVmFyaWFudENvdW50T2Y8VDo6UnVudGltZUhvbGRSZWFzb24+YC44VG9vTWFueUZyZWV6ZXMACQSYTnVtYmVyIG9mIGZyZWV6ZXMgZXhjZWVkIGBNYXhGcmVlemVzYC5MSXNzdWFuY2VEZWFjdGl2YXRlZAAKBAEBVGhlIGlzc3VhbmNlIGNhbm5vdCBiZSBtb2RpZmllZCBzaW5jZSBpdCBpcyBhbHJlYWR5IGRlYWN0aXZhdGVkLiREZWx0YVplcm8ACwRkVGhlIGRlbHRhIGNhbm5vdCBiZSB6ZXJvLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC4RCQhocGFsbGV0X3RyYW5zYWN0aW9uX3BheW1lbnQgUmVsZWFzZXMAAQgkVjFBbmNpZW50AAAACFYyAAEAABUJCDhwYWxsZXRfc3Rha2luZzRTdGFraW5nTGVkZ2VyBARUAAAUARRzdGFzaAABMFQ6OkFjY291bnRJZAABFHRvdGFs5AEwQmFsYW5jZU9mPFQ+AAEYYWN0aXZl5AEwQmFsYW5jZU9mPFQ+AAEkdW5sb2NraW5n5QEB8EJvdW5kZWRWZWM8VW5sb2NrQ2h1bms8QmFsYW5jZU9mPFQ+PiwgVDo6TWF4VW5sb2NraW5nQ2h1bmtzPgABWGxlZ2FjeV9jbGFpbWVkX3Jld2FyZHMZCQGUQm91bmRlZFZlYzxFcmFJbmRleCwgVDo6SGlzdG9yeURlcHRoPgAAGQkMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAEQBFMAAAQAwQEBGFZlYzxUPgAAHQkIOHBhbGxldF9zdGFraW5nLE5vbWluYXRpb25zBARUAAAMARx0YXJnZXRzIQkBtEJvdW5kZWRWZWM8VDo6QWNjb3VudElkLCBNYXhOb21pbmF0aW9uc09mPFQ+PgABMHN1Ym1pdHRlZF9pbhABIEVyYUluZGV4AAEoc3VwcHJlc3NlZCABEGJvb2wAACEJDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBAARTAAAEAK0BARhWZWM8VD4AACUJCDhwYWxsZXRfc3Rha2luZzRBY3RpdmVFcmFJbmZvAAAIARRpbmRleBABIEVyYUluZGV4AAEUc3RhcnQpCQEsT3B0aW9uPHU2ND4AACkJBBhPcHRpb24EBFQBMAEIEE5vbmUAAAAQU29tZQQAMAAAAQAALQkAAAQIEAAAMQkIKHNwX3N0YWtpbmcgRXhwb3N1cmUIJEFjY291bnRJZAEAHEJhbGFuY2UBGAAMARR0b3RhbOQBHEJhbGFuY2UAAQxvd27kARxCYWxhbmNlAAEYb3RoZXJzNQkBrFZlYzxJbmRpdmlkdWFsRXhwb3N1cmU8QWNjb3VudElkLCBCYWxhbmNlPj4AADUJAAACOQkAOQkIKHNwX3N0YWtpbmdISW5kaXZpZHVhbEV4cG9zdXJlCCRBY2NvdW50SWQBABxCYWxhbmNlARgACAEMd2hvAAEkQWNjb3VudElkAAEUdmFsdWXkARxCYWxhbmNlAAA9CQgoc3Bfc3Rha2luZ1RQYWdlZEV4cG9zdXJlTWV0YWRhdGEEHEJhbGFuY2UBGAAQARR0b3RhbOQBHEJhbGFuY2UAAQxvd27kARxCYWxhbmNlAAE8bm9taW5hdG9yX2NvdW50EAEMdTMyAAEocGFnZV9jb3VudBABEFBhZ2UAAEEJAAAEDBAAEABFCQgoc3Bfc3Rha2luZzBFeHBvc3VyZVBhZ2UIJEFjY291bnRJZAEAHEJhbGFuY2UBGAAIAShwYWdlX3RvdGFs5AEcQmFsYW5jZQABGG90aGVyczUJAaxWZWM8SW5kaXZpZHVhbEV4cG9zdXJlPEFjY291bnRJZCwgQmFsYW5jZT4+AABJCQg4cGFsbGV0X3N0YWtpbmc8RXJhUmV3YXJkUG9pbnRzBCRBY2NvdW50SWQBAAAIARR0b3RhbBABLFJld2FyZFBvaW50AAEoaW5kaXZpZHVhbE0JAYBCVHJlZU1hcDxBY2NvdW50SWQsIFJld2FyZFBvaW50PgAATQkEIEJUcmVlTWFwCARLAQAEVgEQAAQAUQkAAABRCQAAAlUJAFUJAAAECAAQAFkJAAACXQkAXQkIOHBhbGxldF9zdGFraW5nOFVuYXBwbGllZFNsYXNoCCRBY2NvdW50SWQBABxCYWxhbmNlARgAFAEkdmFsaWRhdG9yAAEkQWNjb3VudElkAAEMb3duGAEcQmFsYW5jZQABGG90aGVyc20EAWRWZWM8KEFjY291bnRJZCwgQmFsYW5jZSk+AAEkcmVwb3J0ZXJzrQEBOFZlYzxBY2NvdW50SWQ+AAEYcGF5b3V0GAEcQmFsYW5jZQAAYQkAAAQIlBgAZQkMOHBhbGxldF9zdGFraW5nIHNsYXNoaW5nNFNsYXNoaW5nU3BhbnMAABABKHNwYW5faW5kZXgQASRTcGFuSW5kZXgAAShsYXN0X3N0YXJ0EAEgRXJhSW5kZXgAAUhsYXN0X25vbnplcm9fc2xhc2gQASBFcmFJbmRleAABFHByaW9ywQEBNFZlYzxFcmFJbmRleD4AAGkJDDhwYWxsZXRfc3Rha2luZyBzbGFzaGluZyhTcGFuUmVjb3JkBBxCYWxhbmNlARgACAEcc2xhc2hlZBgBHEJhbGFuY2UAASBwYWlkX291dBgBHEJhbGFuY2UAAG0JEDhwYWxsZXRfc3Rha2luZxhwYWxsZXQYcGFsbGV0FEVycm9yBARUAAF8NE5vdENvbnRyb2xsZXIAAARkTm90IGEgY29udHJvbGxlciBhY2NvdW50LiBOb3RTdGFzaAABBFBOb3QgYSBzdGFzaCBhY2NvdW50LjRBbHJlYWR5Qm9uZGVkAAIEYFN0YXNoIGlzIGFscmVhZHkgYm9uZGVkLjRBbHJlYWR5UGFpcmVkAAMEdENvbnRyb2xsZXIgaXMgYWxyZWFkeSBwYWlyZWQuMEVtcHR5VGFyZ2V0cwAEBGBUYXJnZXRzIGNhbm5vdCBiZSBlbXB0eS44RHVwbGljYXRlSW5kZXgABQRARHVwbGljYXRlIGluZGV4LkRJbnZhbGlkU2xhc2hJbmRleAAGBIRTbGFzaCByZWNvcmQgaW5kZXggb3V0IG9mIGJvdW5kcy5ASW5zdWZmaWNpZW50Qm9uZAAHDFkBQ2Fubm90IGhhdmUgYSB2YWxpZGF0b3Igb3Igbm9taW5hdG9yIHJvbGUsIHdpdGggdmFsdWUgbGVzcyB0aGFuIHRoZSBtaW5pbXVtIGRlZmluZWQgYnk9AWdvdmVybmFuY2UgKHNlZSBgTWluVmFsaWRhdG9yQm9uZGAgYW5kIGBNaW5Ob21pbmF0b3JCb25kYCkuIElmIHVuYm9uZGluZyBpcyB0aGUVAWludGVudGlvbiwgYGNoaWxsYCBmaXJzdCB0byByZW1vdmUgb25lJ3Mgcm9sZSBhcyB2YWxpZGF0b3Ivbm9taW5hdG9yLjBOb01vcmVDaHVua3MACASQQ2FuIG5vdCBzY2hlZHVsZSBtb3JlIHVubG9jayBjaHVua3MuNE5vVW5sb2NrQ2h1bmsACQSgQ2FuIG5vdCByZWJvbmQgd2l0aG91dCB1bmxvY2tpbmcgY2h1bmtzLjBGdW5kZWRUYXJnZXQACgTIQXR0ZW1wdGluZyB0byB0YXJnZXQgYSBzdGFzaCB0aGF0IHN0aWxsIGhhcyBmdW5kcy5ISW52YWxpZEVyYVRvUmV3YXJkAAsEWEludmFsaWQgZXJhIHRvIHJld2FyZC5oSW52YWxpZE51bWJlck9mTm9taW5hdGlvbnMADAR4SW52YWxpZCBudW1iZXIgb2Ygbm9taW5hdGlvbnMuSE5vdFNvcnRlZEFuZFVuaXF1ZQANBIBJdGVtcyBhcmUgbm90IHNvcnRlZCBhbmQgdW5pcXVlLjhBbHJlYWR5Q2xhaW1lZAAOBAkBUmV3YXJkcyBmb3IgdGhpcyBlcmEgaGF2ZSBhbHJlYWR5IGJlZW4gY2xhaW1lZCBmb3IgdGhpcyB2YWxpZGF0b3IuLEludmFsaWRQYWdlAA8EhE5vIG5vbWluYXRvcnMgZXhpc3Qgb24gdGhpcyBwYWdlLlRJbmNvcnJlY3RIaXN0b3J5RGVwdGgAEATASW5jb3JyZWN0IHByZXZpb3VzIGhpc3RvcnkgZGVwdGggaW5wdXQgcHJvdmlkZWQuWEluY29ycmVjdFNsYXNoaW5nU3BhbnMAEQSwSW5jb3JyZWN0IG51bWJlciBvZiBzbGFzaGluZyBzcGFucyBwcm92aWRlZC4gQmFkU3RhdGUAEgQ5AUludGVybmFsIHN0YXRlIGhhcyBiZWNvbWUgc29tZWhvdyBjb3JydXB0ZWQgYW5kIHRoZSBvcGVyYXRpb24gY2Fubm90IGNvbnRpbnVlLjhUb29NYW55VGFyZ2V0cwATBJRUb28gbWFueSBub21pbmF0aW9uIHRhcmdldHMgc3VwcGxpZWQuJEJhZFRhcmdldAAUBD0BQSBub21pbmF0aW9uIHRhcmdldCB3YXMgc3VwcGxpZWQgdGhhdCB3YXMgYmxvY2tlZCBvciBvdGhlcndpc2Ugbm90IGEgdmFsaWRhdG9yLkBDYW5ub3RDaGlsbE90aGVyABUEVQFUaGUgdXNlciBoYXMgZW5vdWdoIGJvbmQgYW5kIHRodXMgY2Fubm90IGJlIGNoaWxsZWQgZm9yY2VmdWxseSBieSBhbiBleHRlcm5hbCBwZXJzb24uRFRvb01hbnlOb21pbmF0b3JzABYITQFUaGVyZSBhcmUgdG9vIG1hbnkgbm9taW5hdG9ycyBpbiB0aGUgc3lzdGVtLiBHb3Zlcm5hbmNlIG5lZWRzIHRvIGFkanVzdCB0aGUgc3Rha2luZ7RzZXR0aW5ncyB0byBrZWVwIHRoaW5ncyBzYWZlIGZvciB0aGUgcnVudGltZS5EVG9vTWFueVZhbGlkYXRvcnMAFwhVAVRoZXJlIGFyZSB0b28gbWFueSB2YWxpZGF0b3IgY2FuZGlkYXRlcyBpbiB0aGUgc3lzdGVtLiBHb3Zlcm5hbmNlIG5lZWRzIHRvIGFkanVzdCB0aGXUc3Rha2luZyBzZXR0aW5ncyB0byBrZWVwIHRoaW5ncyBzYWZlIGZvciB0aGUgcnVudGltZS5AQ29tbWlzc2lvblRvb0xvdwAYBOBDb21taXNzaW9uIGlzIHRvbyBsb3cuIE11c3QgYmUgYXQgbGVhc3QgYE1pbkNvbW1pc3Npb25gLixCb3VuZE5vdE1ldAAZBFhTb21lIGJvdW5kIGlzIG5vdCBtZXQuUENvbnRyb2xsZXJEZXByZWNhdGVkABoEAQFVc2VkIHdoZW4gYXR0ZW1wdGluZyB0byB1c2UgZGVwcmVjYXRlZCBjb250cm9sbGVyIGFjY291bnQgbG9naWMuTENhbm5vdFJlc3RvcmVMZWRnZXIAGwRYQ2Fubm90IHJlc2V0IGEgbGVkZ2VyLmxSZXdhcmREZXN0aW5hdGlvblJlc3RyaWN0ZWQAHASsUHJvdmlkZWQgcmV3YXJkIGRlc3RpbmF0aW9uIGlzIG5vdCBhbGxvd2VkLjhOb3RFbm91Z2hGdW5kcwAdBJxOb3QgZW5vdWdoIGZ1bmRzIGF2YWlsYWJsZSB0byB3aXRoZHJhdy5cVmlydHVhbFN0YWtlck5vdEFsbG93ZWQAHgSoT3BlcmF0aW9uIG5vdCBhbGxvd2VkIGZvciB2aXJ0dWFsIHN0YWtlcnMuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LnEJDChzcF9zdGFraW5nHG9mZmVuY2U4T2ZmZW5jZURldGFpbHMIIFJlcG9ydGVyAQAgT2ZmZW5kZXIBdQkACAEgb2ZmZW5kZXJ1CQEgT2ZmZW5kZXIAASRyZXBvcnRlcnOtAQE0VmVjPFJlcG9ydGVyPgAAdQkAAAQIADEJAHkJAAAECKg4AH0JAAAECDQQAIEJAAAChQkAhQkAAAQIAPUBAIkJAAAECI0JOACNCQwcc3BfY29yZRhjcnlwdG8kS2V5VHlwZUlkAAAEAEgBHFt1ODsgNF0AAJEJDDhwYWxsZXRfc2Vzc2lvbhhwYWxsZXQURXJyb3IEBFQAARQwSW52YWxpZFByb29mAAAEYEludmFsaWQgb3duZXJzaGlwIHByb29mLlxOb0Fzc29jaWF0ZWRWYWxpZGF0b3JJZAABBJxObyBhc3NvY2lhdGVkIHZhbGlkYXRvciBJRCBmb3IgYWNjb3VudC40RHVwbGljYXRlZEtleQACBGRSZWdpc3RlcmVkIGR1cGxpY2F0ZSBrZXkuGE5vS2V5cwADBKRObyBrZXlzIGFyZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBhY2NvdW50LiROb0FjY291bnQABAQZAUtleSBzZXR0aW5nIGFjY291bnQgaXMgbm90IGxpdmUsIHNvIGl0J3MgaW1wb3NzaWJsZSB0byBhc3NvY2lhdGUga2V5cy4EdEVycm9yIGZvciB0aGUgc2Vzc2lvbiBwYWxsZXQulQkIOHBhbGxldF9ncmFuZHBhLFN0b3JlZFN0YXRlBAROARABEBBMaXZlAAAAMFBlbmRpbmdQYXVzZQgBMHNjaGVkdWxlZF9hdBABBE4AARRkZWxheRABBE4AAQAYUGF1c2VkAAIANFBlbmRpbmdSZXN1bWUIATBzY2hlZHVsZWRfYXQQAQROAAEUZGVsYXkQAQROAAMAAJkJCDhwYWxsZXRfZ3JhbmRwYUxTdG9yZWRQZW5kaW5nQ2hhbmdlCAROARAUTGltaXQAABABMHNjaGVkdWxlZF9hdBABBE4AARRkZWxheRABBE4AAUBuZXh0X2F1dGhvcml0aWVznQkBbEJvdW5kZWRBdXRob3JpdHlMaXN0PExpbWl0PgABGGZvcmNlZD0CASRPcHRpb248Tj4AAJ0JDExib3VuZGVkX2NvbGxlY3Rpb25zQHdlYWtfYm91bmRlZF92ZWM4V2Vha0JvdW5kZWRWZWMIBFQBuARTAAAEALQBGFZlYzxUPgAAoQkMOHBhbGxldF9ncmFuZHBhGHBhbGxldBRFcnJvcgQEVAABHCxQYXVzZUZhaWxlZAAACAUBQXR0ZW1wdCB0byBzaWduYWwgR1JBTkRQQSBwYXVzZSB3aGVuIHRoZSBhdXRob3JpdHkgc2V0IGlzbid0IGxpdmWkKGVpdGhlciBwYXVzZWQgb3IgYWxyZWFkeSBwZW5kaW5nIHBhdXNlKS4wUmVzdW1lRmFpbGVkAAEIEQFBdHRlbXB0IHRvIHNpZ25hbCBHUkFORFBBIHJlc3VtZSB3aGVuIHRoZSBhdXRob3JpdHkgc2V0IGlzbid0IHBhdXNlZKAoZWl0aGVyIGxpdmUgb3IgYWxyZWFkeSBwZW5kaW5nIHJlc3VtZSkuNENoYW5nZVBlbmRpbmcAAgToQXR0ZW1wdCB0byBzaWduYWwgR1JBTkRQQSBjaGFuZ2Ugd2l0aCBvbmUgYWxyZWFkeSBwZW5kaW5nLhxUb29Tb29uAAMEvENhbm5vdCBzaWduYWwgZm9yY2VkIGNoYW5nZSBzbyBzb29uIGFmdGVyIGxhc3QuYEludmFsaWRLZXlPd25lcnNoaXBQcm9vZgAEBDEBQSBrZXkgb3duZXJzaGlwIHByb29mIHByb3ZpZGVkIGFzIHBhcnQgb2YgYW4gZXF1aXZvY2F0aW9uIHJlcG9ydCBpcyBpbnZhbGlkLmBJbnZhbGlkRXF1aXZvY2F0aW9uUHJvb2YABQQxAUFuIGVxdWl2b2NhdGlvbiBwcm9vZiBwcm92aWRlZCBhcyBwYXJ0IG9mIGFuIGVxdWl2b2NhdGlvbiByZXBvcnQgaXMgaW52YWxpZC5YRHVwbGljYXRlT2ZmZW5jZVJlcG9ydAAGBBUBQSBnaXZlbiBlcXVpdm9jYXRpb24gcmVwb3J0IGlzIHZhbGlkIGJ1dCBhbHJlYWR5IHByZXZpb3VzbHkgcmVwb3J0ZWQuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LqUJDExib3VuZGVkX2NvbGxlY3Rpb25zQHdlYWtfYm91bmRlZF92ZWM4V2Vha0JvdW5kZWRWZWMIBFQBAQIEUwAABACpCQEYVmVjPFQ+AACpCQAAAgECAK0JCDxwYWxsZXRfdHJlYXN1cnkgUHJvcG9zYWwIJEFjY291bnRJZAEAHEJhbGFuY2UBGAAQASBwcm9wb3NlcgABJEFjY291bnRJZAABFHZhbHVlGAEcQmFsYW5jZQABLGJlbmVmaWNpYXJ5AAEkQWNjb3VudElkAAEQYm9uZBgBHEJhbGFuY2UAALEJDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBEARTAAAEAMEBARhWZWM8VD4AALUJCDxwYWxsZXRfdHJlYXN1cnksU3BlbmRTdGF0dXMUJEFzc2V0S2luZAHEMEFzc2V0QmFsYW5jZQEYLEJlbmVmaWNpYXJ5AS0BLEJsb2NrTnVtYmVyARAkUGF5bWVudElkATAAGAEoYXNzZXRfa2luZMQBJEFzc2V0S2luZAABGGFtb3VudBgBMEFzc2V0QmFsYW5jZQABLGJlbmVmaWNpYXJ5LQEBLEJlbmVmaWNpYXJ5AAEodmFsaWRfZnJvbRABLEJsb2NrTnVtYmVyAAEkZXhwaXJlX2F0EAEsQmxvY2tOdW1iZXIAARhzdGF0dXO5CQFcUGF5bWVudFN0YXRlPFBheW1lbnRJZD4AALkJCDxwYWxsZXRfdHJlYXN1cnkwUGF5bWVudFN0YXRlBAhJZAEwAQwcUGVuZGluZwAAACRBdHRlbXB0ZWQEAQhpZDABCElkAAEAGEZhaWxlZAACAAC9CQw0c3BfYXJpdGhtZXRpYyhwZXJfdGhpbmdzHFBlcm1pbGwAAAQAEAEMdTMyAADBCQg0ZnJhbWVfc3VwcG9ydCBQYWxsZXRJZAAABAABBgEcW3U4OyA4XQAAxQkMPHBhbGxldF90cmVhc3VyeRhwYWxsZXQURXJyb3IIBFQABEkAASwwSW52YWxpZEluZGV4AAAErE5vIHByb3Bvc2FsLCBib3VudHkgb3Igc3BlbmQgYXQgdGhhdCBpbmRleC5AVG9vTWFueUFwcHJvdmFscwABBIBUb28gbWFueSBhcHByb3ZhbHMgaW4gdGhlIHF1ZXVlLlhJbnN1ZmZpY2llbnRQZXJtaXNzaW9uAAIIRQFUaGUgc3BlbmQgb3JpZ2luIGlzIHZhbGlkIGJ1dCB0aGUgYW1vdW50IGl0IGlzIGFsbG93ZWQgdG8gc3BlbmQgaXMgbG93ZXIgdGhhbiB0aGVMYW1vdW50IHRvIGJlIHNwZW50LkxQcm9wb3NhbE5vdEFwcHJvdmVkAAMEfFByb3Bvc2FsIGhhcyBub3QgYmVlbiBhcHByb3ZlZC5YRmFpbGVkVG9Db252ZXJ0QmFsYW5jZQAEBFEBVGhlIGJhbGFuY2Ugb2YgdGhlIGFzc2V0IGtpbmQgaXMgbm90IGNvbnZlcnRpYmxlIHRvIHRoZSBiYWxhbmNlIG9mIHRoZSBuYXRpdmUgYXNzZXQuMFNwZW5kRXhwaXJlZAAFBLBUaGUgc3BlbmQgaGFzIGV4cGlyZWQgYW5kIGNhbm5vdCBiZSBjbGFpbWVkLixFYXJseVBheW91dAAGBKRUaGUgc3BlbmQgaXMgbm90IHlldCBlbGlnaWJsZSBmb3IgcGF5b3V0LkBBbHJlYWR5QXR0ZW1wdGVkAAcEnFRoZSBwYXltZW50IGhhcyBhbHJlYWR5IGJlZW4gYXR0ZW1wdGVkLixQYXlvdXRFcnJvcgAIBMxUaGVyZSB3YXMgc29tZSBpc3N1ZSB3aXRoIHRoZSBtZWNoYW5pc20gb2YgcGF5bWVudC4wTm90QXR0ZW1wdGVkAAkEpFRoZSBwYXlvdXQgd2FzIG5vdCB5ZXQgYXR0ZW1wdGVkL2NsYWltZWQuMEluY29uY2x1c2l2ZQAKBMRUaGUgcGF5bWVudCBoYXMgbmVpdGhlciBmYWlsZWQgbm9yIHN1Y2NlZWRlZCB5ZXQuBHhFcnJvciBmb3IgdGhlIHRyZWFzdXJ5IHBhbGxldC7JCQAABAgAVQEAzQkMYHBhbGxldF9jb252aWN0aW9uX3ZvdGluZxB2b3RlGFZvdGluZxQcQmFsYW5jZQEYJEFjY291bnRJZAEALEJsb2NrTnVtYmVyARAkUG9sbEluZGV4ARAgTWF4Vm90ZXMAAQgcQ2FzdGluZwQA0QkByENhc3Rpbmc8QmFsYW5jZSwgQmxvY2tOdW1iZXIsIFBvbGxJbmRleCwgTWF4Vm90ZXM+AAAAKERlbGVnYXRpbmcEAOkJAaxEZWxlZ2F0aW5nPEJhbGFuY2UsIEFjY291bnRJZCwgQmxvY2tOdW1iZXI+AAEAANEJDGBwYWxsZXRfY29udmljdGlvbl92b3RpbmcQdm90ZRxDYXN0aW5nEBxCYWxhbmNlARgsQmxvY2tOdW1iZXIBECRQb2xsSW5kZXgBECBNYXhWb3RlcwAADAEUdm90ZXPVCQHcQm91bmRlZFZlYzwoUG9sbEluZGV4LCBBY2NvdW50Vm90ZTxCYWxhbmNlPiksIE1heFZvdGVzPgABLGRlbGVnYXRpb25z4QkBUERlbGVnYXRpb25zPEJhbGFuY2U+AAEUcHJpb3LlCQF8UHJpb3JMb2NrPEJsb2NrTnVtYmVyLCBCYWxhbmNlPgAA1QkMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAHZCQRTAAAEAN0JARhWZWM8VD4AANkJAAAECBBFAgDdCQAAAtkJAOEJDGBwYWxsZXRfY29udmljdGlvbl92b3RpbmcUdHlwZXMsRGVsZWdhdGlvbnMEHEJhbGFuY2UBGAAIARR2b3RlcxgBHEJhbGFuY2UAARxjYXBpdGFsGAEcQmFsYW5jZQAA5QkMYHBhbGxldF9jb252aWN0aW9uX3ZvdGluZxB2b3RlJFByaW9yTG9jawgsQmxvY2tOdW1iZXIBEBxCYWxhbmNlARgACAAQASxCbG9ja051bWJlcgAAGAEcQmFsYW5jZQAA6QkMYHBhbGxldF9jb252aWN0aW9uX3ZvdGluZxB2b3RlKERlbGVnYXRpbmcMHEJhbGFuY2UBGCRBY2NvdW50SWQBACxCbG9ja051bWJlcgEQABQBHGJhbGFuY2UYARxCYWxhbmNlAAEYdGFyZ2V0AAEkQWNjb3VudElkAAEoY29udmljdGlvbk0CAShDb252aWN0aW9uAAEsZGVsZWdhdGlvbnPhCQFQRGVsZWdhdGlvbnM8QmFsYW5jZT4AARRwcmlvcuUJAXxQcmlvckxvY2s8QmxvY2tOdW1iZXIsIEJhbGFuY2U+AADtCQxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAfEJBFMAAAQA9QkBGFZlYzxUPgAA8QkAAAQIVQEYAPUJAAAC8QkA+QkMYHBhbGxldF9jb252aWN0aW9uX3ZvdGluZxhwYWxsZXQURXJyb3IIBFQABEkAATAoTm90T25nb2luZwAABFBQb2xsIGlzIG5vdCBvbmdvaW5nLiBOb3RWb3RlcgABBKxUaGUgZ2l2ZW4gYWNjb3VudCBkaWQgbm90IHZvdGUgb24gdGhlIHBvbGwuME5vUGVybWlzc2lvbgACBMhUaGUgYWN0b3IgaGFzIG5vIHBlcm1pc3Npb24gdG8gY29uZHVjdCB0aGUgYWN0aW9uLjxOb1Blcm1pc3Npb25ZZXQAAwRZAVRoZSBhY3RvciBoYXMgbm8gcGVybWlzc2lvbiB0byBjb25kdWN0IHRoZSBhY3Rpb24gcmlnaHQgbm93IGJ1dCB3aWxsIGRvIGluIHRoZSBmdXR1cmUuREFscmVhZHlEZWxlZ2F0aW5nAAQEiFRoZSBhY2NvdW50IGlzIGFscmVhZHkgZGVsZWdhdGluZy40QWxyZWFkeVZvdGluZwAFCFUBVGhlIGFjY291bnQgY3VycmVudGx5IGhhcyB2b3RlcyBhdHRhY2hlZCB0byBpdCBhbmQgdGhlIG9wZXJhdGlvbiBjYW5ub3Qgc3VjY2VlZCB1bnRpbKB0aGVzZSBhcmUgcmVtb3ZlZCB0aHJvdWdoIGByZW1vdmVfdm90ZWAuREluc3VmZmljaWVudEZ1bmRzAAYE/FRvbyBoaWdoIGEgYmFsYW5jZSB3YXMgcHJvdmlkZWQgdGhhdCB0aGUgYWNjb3VudCBjYW5ub3QgYWZmb3JkLjROb3REZWxlZ2F0aW5nAAcEoFRoZSBhY2NvdW50IGlzIG5vdCBjdXJyZW50bHkgZGVsZWdhdGluZy4gTm9uc2Vuc2UACASURGVsZWdhdGlvbiB0byBvbmVzZWxmIG1ha2VzIG5vIHNlbnNlLjxNYXhWb3Rlc1JlYWNoZWQACQSATWF4aW11bSBudW1iZXIgb2Ygdm90ZXMgcmVhY2hlZC4sQ2xhc3NOZWVkZWQACgQ5AVRoZSBjbGFzcyBtdXN0IGJlIHN1cHBsaWVkIHNpbmNlIGl0IGlzIG5vdCBlYXNpbHkgZGV0ZXJtaW5hYmxlIGZyb20gdGhlIHN0YXRlLiBCYWRDbGFzcwALBIRUaGUgY2xhc3MgSUQgc3VwcGxpZWQgaXMgaW52YWxpZC4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQu/QkMQHBhbGxldF9yZWZlcmVuZGEUdHlwZXM4UmVmZXJlbmR1bUluZm8gHFRyYWNrSWQBVQE0UnVudGltZU9yaWdpbgFZAhhNb21lbnQBEBBDYWxsAVkBHEJhbGFuY2UBGBRUYWxseQFRByRBY2NvdW50SWQBADxTY2hlZHVsZUFkZHJlc3MB9QIBGBxPbmdvaW5nBAABCgGNAVJlZmVyZW5kdW1TdGF0dXM8VHJhY2tJZCwgUnVudGltZU9yaWdpbiwgTW9tZW50LCBDYWxsLCBCYWxhbmNlLCBUYWxseSwKQWNjb3VudElkLCBTY2hlZHVsZUFkZHJlc3MsPgAAACBBcHByb3ZlZAwAEAEYTW9tZW50AAAJCgGMT3B0aW9uPERlcG9zaXQ8QWNjb3VudElkLCBCYWxhbmNlPj4AAAkKAYxPcHRpb248RGVwb3NpdDxBY2NvdW50SWQsIEJhbGFuY2U+PgABACBSZWplY3RlZAwAEAEYTW9tZW50AAAJCgGMT3B0aW9uPERlcG9zaXQ8QWNjb3VudElkLCBCYWxhbmNlPj4AAAkKAYxPcHRpb248RGVwb3NpdDxBY2NvdW50SWQsIEJhbGFuY2U+PgACACRDYW5jZWxsZWQMABABGE1vbWVudAAACQoBjE9wdGlvbjxEZXBvc2l0PEFjY291bnRJZCwgQmFsYW5jZT4+AAAJCgGMT3B0aW9uPERlcG9zaXQ8QWNjb3VudElkLCBCYWxhbmNlPj4AAwAgVGltZWRPdXQMABABGE1vbWVudAAACQoBjE9wdGlvbjxEZXBvc2l0PEFjY291bnRJZCwgQmFsYW5jZT4+AAAJCgGMT3B0aW9uPERlcG9zaXQ8QWNjb3VudElkLCBCYWxhbmNlPj4ABAAYS2lsbGVkBAAQARhNb21lbnQABQAAAQoMQHBhbGxldF9yZWZlcmVuZGEUdHlwZXNAUmVmZXJlbmR1bVN0YXR1cyAcVHJhY2tJZAFVATRSdW50aW1lT3JpZ2luAVkCGE1vbWVudAEQEENhbGwBWQEcQmFsYW5jZQEYFFRhbGx5AVEHJEFjY291bnRJZAEAPFNjaGVkdWxlQWRkcmVzcwH1AgAsARR0cmFja1UBARxUcmFja0lkAAEYb3JpZ2luWQIBNFJ1bnRpbWVPcmlnaW4AASBwcm9wb3NhbFkBARBDYWxsAAEkZW5hY3RtZW50dQIBUERpc3BhdGNoVGltZTxNb21lbnQ+AAEkc3VibWl0dGVkEAEYTW9tZW50AAFIc3VibWlzc2lvbl9kZXBvc2l0BQoBbERlcG9zaXQ8QWNjb3VudElkLCBCYWxhbmNlPgABQGRlY2lzaW9uX2RlcG9zaXQJCgGMT3B0aW9uPERlcG9zaXQ8QWNjb3VudElkLCBCYWxhbmNlPj4AASBkZWNpZGluZw0KAXhPcHRpb248RGVjaWRpbmdTdGF0dXM8TW9tZW50Pj4AARR0YWxseVEHARRUYWxseQABIGluX3F1ZXVlIAEQYm9vbAABFGFsYXJtFQoBhE9wdGlvbjwoTW9tZW50LCBTY2hlZHVsZUFkZHJlc3MpPgAABQoMQHBhbGxldF9yZWZlcmVuZGEUdHlwZXMcRGVwb3NpdAgkQWNjb3VudElkAQAcQmFsYW5jZQEYAAgBDHdobwABJEFjY291bnRJZAABGGFtb3VudBgBHEJhbGFuY2UAAAkKBBhPcHRpb24EBFQBBQoBCBBOb25lAAAAEFNvbWUEAAUKAAABAAANCgQYT3B0aW9uBARUAREKAQgQTm9uZQAAABBTb21lBAARCgAAAQAAEQoMQHBhbGxldF9yZWZlcmVuZGEUdHlwZXM4RGVjaWRpbmdTdGF0dXMELEJsb2NrTnVtYmVyARAACAEUc2luY2UQASxCbG9ja051bWJlcgABKGNvbmZpcm1pbmc9AgFMT3B0aW9uPEJsb2NrTnVtYmVyPgAAFQoEGE9wdGlvbgQEVAEZCgEIEE5vbmUAAAAQU29tZQQAGQoAAAEAABkKAAAECBD1AgAdCgxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUASEKBFMAAAQAJQoBGFZlYzxUPgAAIQoAAAQIEBgAJQoAAAIhCgApCgAAAi0KAC0KAAAECFUBMQoAMQoMQHBhbGxldF9yZWZlcmVuZGEUdHlwZXMkVHJhY2tJbmZvCBxCYWxhbmNlARgYTW9tZW50ARAAJAEQbmFtZUkIATAmJ3N0YXRpYyBzdHIAATBtYXhfZGVjaWRpbmcQAQx1MzIAAUBkZWNpc2lvbl9kZXBvc2l0GAEcQmFsYW5jZQABOHByZXBhcmVfcGVyaW9kEAEYTW9tZW50AAE8ZGVjaXNpb25fcGVyaW9kEAEYTW9tZW50AAE4Y29uZmlybV9wZXJpb2QQARhNb21lbnQAAVBtaW5fZW5hY3RtZW50X3BlcmlvZBABGE1vbWVudAABMG1pbl9hcHByb3ZhbDUKARRDdXJ2ZQABLG1pbl9zdXBwb3J0NQoBFEN1cnZlAAA1CgxAcGFsbGV0X3JlZmVyZW5kYRR0eXBlcxRDdXJ2ZQABDEBMaW5lYXJEZWNyZWFzaW5nDAEYbGVuZ3RolAEcUGVyYmlsbAABFGZsb29ylAEcUGVyYmlsbAABEGNlaWyUARxQZXJiaWxsAAAARFN0ZXBwZWREZWNyZWFzaW5nEAEUYmVnaW6UARxQZXJiaWxsAAEMZW5klAEcUGVyYmlsbAABEHN0ZXCUARxQZXJiaWxsAAEYcGVyaW9klAEcUGVyYmlsbAABAChSZWNpcHJvY2FsDAEYZmFjdG9yOQoBIEZpeGVkSTY0AAEgeF9vZmZzZXQ5CgEgRml4ZWRJNjQAASB5X29mZnNldDkKASBGaXhlZEk2NAACAAA5Cgw0c3BfYXJpdGhtZXRpYyxmaXhlZF9wb2ludCBGaXhlZEk2NAAABAA9CgEMaTY0AAA9CgAABQwAQQoMQHBhbGxldF9yZWZlcmVuZGEYcGFsbGV0FEVycm9yCARUAARJAAE4KE5vdE9uZ29pbmcAAARoUmVmZXJlbmR1bSBpcyBub3Qgb25nb2luZy4oSGFzRGVwb3NpdAABBLhSZWZlcmVuZHVtJ3MgZGVjaXNpb24gZGVwb3NpdCBpcyBhbHJlYWR5IHBhaWQuIEJhZFRyYWNrAAIEnFRoZSB0cmFjayBpZGVudGlmaWVyIGdpdmVuIHdhcyBpbnZhbGlkLhBGdWxsAAMEMQFUaGVyZSBhcmUgYWxyZWFkeSBhIGZ1bGwgY29tcGxlbWVudCBvZiByZWZlcmVuZGEgaW4gcHJvZ3Jlc3MgZm9yIHRoaXMgdHJhY2suKFF1ZXVlRW1wdHkABASAVGhlIHF1ZXVlIG9mIHRoZSB0cmFjayBpcyBlbXB0eS40QmFkUmVmZXJlbmR1bQAFBORUaGUgcmVmZXJlbmR1bSBpbmRleCBwcm92aWRlZCBpcyBpbnZhbGlkIGluIHRoaXMgY29udGV4dC4sTm90aGluZ1RvRG8ABgSsVGhlcmUgd2FzIG5vdGhpbmcgdG8gZG8gaW4gdGhlIGFkdmFuY2VtZW50LhxOb1RyYWNrAAcEoE5vIHRyYWNrIGV4aXN0cyBmb3IgdGhlIHByb3Bvc2FsIG9yaWdpbi4oVW5maW5pc2hlZAAIBAEBQW55IGRlcG9zaXQgY2Fubm90IGJlIHJlZnVuZGVkIHVudGlsIGFmdGVyIHRoZSBkZWNpc2lvbiBpcyBvdmVyLjBOb1Blcm1pc3Npb24ACQSoVGhlIGRlcG9zaXQgcmVmdW5kZXIgaXMgbm90IHRoZSBkZXBvc2l0b3IuJE5vRGVwb3NpdAAKBMxUaGUgZGVwb3NpdCBjYW5ub3QgYmUgcmVmdW5kZWQgc2luY2Ugbm9uZSB3YXMgbWFkZS4kQmFkU3RhdHVzAAsE0FRoZSByZWZlcmVuZHVtIHN0YXR1cyBpcyBpbnZhbGlkIGZvciB0aGlzIG9wZXJhdGlvbi5AUHJlaW1hZ2VOb3RFeGlzdAAMBHBUaGUgcHJlaW1hZ2UgZG9lcyBub3QgZXhpc3QuhFByZWltYWdlU3RvcmVkV2l0aERpZmZlcmVudExlbmd0aAANBBUBVGhlIHByZWltYWdlIGlzIHN0b3JlZCB3aXRoIGEgZGlmZmVyZW50IGxlbmd0aCB0aGFuIHRoZSBvbmUgcHJvdmlkZWQuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LkUKCGBwYWxsZXRfcmFua2VkX2NvbGxlY3RpdmUwTWVtYmVyUmVjb3JkAAAEARByYW5rVQEBEFJhbmsAAEkKAAAECFUBAABNCgAABAhVARAAUQoMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAEIBFMAAAQAOAEYVmVjPFQ+AABVCgxgcGFsbGV0X3JhbmtlZF9jb2xsZWN0aXZlGHBhbGxldBRFcnJvcggEVAAESQABLDRBbHJlYWR5TWVtYmVyAAAEcEFjY291bnQgaXMgYWxyZWFkeSBhIG1lbWJlci4kTm90TWVtYmVyAAEEYEFjY291bnQgaXMgbm90IGEgbWVtYmVyLihOb3RQb2xsaW5nAAIEuFRoZSBnaXZlbiBwb2xsIGluZGV4IGlzIHVua25vd24gb3IgaGFzIGNsb3NlZC4cT25nb2luZwADBIBUaGUgZ2l2ZW4gcG9sbCBpcyBzdGlsbCBvbmdvaW5nLjROb25lUmVtYWluaW5nAAQErFRoZXJlIGFyZSBubyBmdXJ0aGVyIHJlY29yZHMgdG8gYmUgcmVtb3ZlZC4oQ29ycnVwdGlvbgAFBGhVbmV4cGVjdGVkIGVycm9yIGluIHN0YXRlLihSYW5rVG9vTG93AAYElFRoZSBtZW1iZXIncyByYW5rIGlzIHRvbyBsb3cgdG8gdm90ZS44SW52YWxpZFdpdG5lc3MABwSYVGhlIGluZm9ybWF0aW9uIHByb3ZpZGVkIGlzIGluY29ycmVjdC4wTm9QZXJtaXNzaW9uAAgE+FRoZSBvcmlnaW4gaXMgbm90IHN1ZmZpY2llbnRseSBwcml2aWxlZ2VkIHRvIGRvIHRoZSBvcGVyYXRpb24uKFNhbWVNZW1iZXIACQTgVGhlIG5ldyBtZW1iZXIgdG8gZXhjaGFuZ2UgaXMgdGhlIHNhbWUgYXMgdGhlIG9sZCBtZW1iZXI4VG9vTWFueU1lbWJlcnMACgTMVGhlIG1heCBtZW1iZXIgY291bnQgZm9yIHRoZSByYW5rIGhhcyBiZWVuIHJlYWNoZWQuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LlkKDEBwYWxsZXRfcmVmZXJlbmRhFHR5cGVzOFJlZmVyZW5kdW1JbmZvIBxUcmFja0lkAVUBNFJ1bnRpbWVPcmlnaW4BWQIYTW9tZW50ARAQQ2FsbAFZARxCYWxhbmNlARgUVGFsbHkBXQckQWNjb3VudElkAQA8U2NoZWR1bGVBZGRyZXNzAfUCARgcT25nb2luZwQAXQoBjQFSZWZlcmVuZHVtU3RhdHVzPFRyYWNrSWQsIFJ1bnRpbWVPcmlnaW4sIE1vbWVudCwgQ2FsbCwgQmFsYW5jZSwgVGFsbHksCkFjY291bnRJZCwgU2NoZWR1bGVBZGRyZXNzLD4AAAAgQXBwcm92ZWQMABABGE1vbWVudAAACQoBjE9wdGlvbjxEZXBvc2l0PEFjY291bnRJZCwgQmFsYW5jZT4+AAAJCgGMT3B0aW9uPERlcG9zaXQ8QWNjb3VudElkLCBCYWxhbmNlPj4AAQAgUmVqZWN0ZWQMABABGE1vbWVudAAACQoBjE9wdGlvbjxEZXBvc2l0PEFjY291bnRJZCwgQmFsYW5jZT4+AAAJCgGMT3B0aW9uPERlcG9zaXQ8QWNjb3VudElkLCBCYWxhbmNlPj4AAgAkQ2FuY2VsbGVkDAAQARhNb21lbnQAAAkKAYxPcHRpb248RGVwb3NpdDxBY2NvdW50SWQsIEJhbGFuY2U+PgAACQoBjE9wdGlvbjxEZXBvc2l0PEFjY291bnRJZCwgQmFsYW5jZT4+AAMAIFRpbWVkT3V0DAAQARhNb21lbnQAAAkKAYxPcHRpb248RGVwb3NpdDxBY2NvdW50SWQsIEJhbGFuY2U+PgAACQoBjE9wdGlvbjxEZXBvc2l0PEFjY291bnRJZCwgQmFsYW5jZT4+AAQAGEtpbGxlZAQAEAEYTW9tZW50AAUAAF0KDEBwYWxsZXRfcmVmZXJlbmRhFHR5cGVzQFJlZmVyZW5kdW1TdGF0dXMgHFRyYWNrSWQBVQE0UnVudGltZU9yaWdpbgFZAhhNb21lbnQBEBBDYWxsAVkBHEJhbGFuY2UBGBRUYWxseQFdByRBY2NvdW50SWQBADxTY2hlZHVsZUFkZHJlc3MB9QIALAEUdHJhY2tVAQEcVHJhY2tJZAABGG9yaWdpblkCATRSdW50aW1lT3JpZ2luAAEgcHJvcG9zYWxZAQEQQ2FsbAABJGVuYWN0bWVudHUCAVBEaXNwYXRjaFRpbWU8TW9tZW50PgABJHN1Ym1pdHRlZBABGE1vbWVudAABSHN1Ym1pc3Npb25fZGVwb3NpdAUKAWxEZXBvc2l0PEFjY291bnRJZCwgQmFsYW5jZT4AAUBkZWNpc2lvbl9kZXBvc2l0CQoBjE9wdGlvbjxEZXBvc2l0PEFjY291bnRJZCwgQmFsYW5jZT4+AAEgZGVjaWRpbmcNCgF4T3B0aW9uPERlY2lkaW5nU3RhdHVzPE1vbWVudD4+AAEUdGFsbHldBwEUVGFsbHkAASBpbl9xdWV1ZSABEGJvb2wAARRhbGFybRUKAYRPcHRpb248KE1vbWVudCwgU2NoZWR1bGVBZGRyZXNzKT4AAGEKDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQB9QIEUwAABABBCAEYVmVjPFQ+AABlCgxAcGFsbGV0X3JlZmVyZW5kYRhwYWxsZXQURXJyb3IIBFQABEkAATgoTm90T25nb2luZwAABGhSZWZlcmVuZHVtIGlzIG5vdCBvbmdvaW5nLihIYXNEZXBvc2l0AAEEuFJlZmVyZW5kdW0ncyBkZWNpc2lvbiBkZXBvc2l0IGlzIGFscmVhZHkgcGFpZC4gQmFkVHJhY2sAAgScVGhlIHRyYWNrIGlkZW50aWZpZXIgZ2l2ZW4gd2FzIGludmFsaWQuEEZ1bGwAAwQxAVRoZXJlIGFyZSBhbHJlYWR5IGEgZnVsbCBjb21wbGVtZW50IG9mIHJlZmVyZW5kYSBpbiBwcm9ncmVzcyBmb3IgdGhpcyB0cmFjay4oUXVldWVFbXB0eQAEBIBUaGUgcXVldWUgb2YgdGhlIHRyYWNrIGlzIGVtcHR5LjRCYWRSZWZlcmVuZHVtAAUE5FRoZSByZWZlcmVuZHVtIGluZGV4IHByb3ZpZGVkIGlzIGludmFsaWQgaW4gdGhpcyBjb250ZXh0LixOb3RoaW5nVG9EbwAGBKxUaGVyZSB3YXMgbm90aGluZyB0byBkbyBpbiB0aGUgYWR2YW5jZW1lbnQuHE5vVHJhY2sABwSgTm8gdHJhY2sgZXhpc3RzIGZvciB0aGUgcHJvcG9zYWwgb3JpZ2luLihVbmZpbmlzaGVkAAgEAQFBbnkgZGVwb3NpdCBjYW5ub3QgYmUgcmVmdW5kZWQgdW50aWwgYWZ0ZXIgdGhlIGRlY2lzaW9uIGlzIG92ZXIuME5vUGVybWlzc2lvbgAJBKhUaGUgZGVwb3NpdCByZWZ1bmRlciBpcyBub3QgdGhlIGRlcG9zaXRvci4kTm9EZXBvc2l0AAoEzFRoZSBkZXBvc2l0IGNhbm5vdCBiZSByZWZ1bmRlZCBzaW5jZSBub25lIHdhcyBtYWRlLiRCYWRTdGF0dXMACwTQVGhlIHJlZmVyZW5kdW0gc3RhdHVzIGlzIGludmFsaWQgZm9yIHRoaXMgb3BlcmF0aW9uLkBQcmVpbWFnZU5vdEV4aXN0AAwEcFRoZSBwcmVpbWFnZSBkb2VzIG5vdCBleGlzdC6EUHJlaW1hZ2VTdG9yZWRXaXRoRGlmZmVyZW50TGVuZ3RoAA0EFQFUaGUgcHJlaW1hZ2UgaXMgc3RvcmVkIHdpdGggYSBkaWZmZXJlbnQgbGVuZ3RoIHRoYW4gdGhlIG9uZSBwcm92aWRlZC4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQuaQoMQHBhbGxldF93aGl0ZWxpc3QYcGFsbGV0FEVycm9yBARUAAEUTFVuYXZhaWxhYmxlUHJlSW1hZ2UAAATIVGhlIHByZWltYWdlIG9mIHRoZSBjYWxsIGhhc2ggY291bGQgbm90IGJlIGxvYWRlZC48VW5kZWNvZGFibGVDYWxsAAEEeFRoZSBjYWxsIGNvdWxkIG5vdCBiZSBkZWNvZGVkLmBJbnZhbGlkQ2FsbFdlaWdodFdpdG5lc3MAAgTsVGhlIHdlaWdodCBvZiB0aGUgZGVjb2RlZCBjYWxsIHdhcyBoaWdoZXIgdGhhbiB0aGUgd2l0bmVzcy5QQ2FsbElzTm90V2hpdGVsaXN0ZWQAAwR0VGhlIGNhbGwgd2FzIG5vdCB3aGl0ZWxpc3RlZC5YQ2FsbEFscmVhZHlXaGl0ZWxpc3RlZAAEBKBUaGUgY2FsbCB3YXMgYWxyZWFkeSB3aGl0ZWxpc3RlZDsgTm8tT3AuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0Lm0KEFxwb2xrYWRvdF9ydW50aW1lX2NvbW1vbhhjbGFpbXMYcGFsbGV0FEVycm9yBARUAAEYYEludmFsaWRFdGhlcmV1bVNpZ25hdHVyZQAABGxJbnZhbGlkIEV0aGVyZXVtIHNpZ25hdHVyZS5AU2lnbmVySGFzTm9DbGFpbQABBHhFdGhlcmV1bSBhZGRyZXNzIGhhcyBubyBjbGFpbS5AU2VuZGVySGFzTm9DbGFpbQACBLBBY2NvdW50IElEIHNlbmRpbmcgdHJhbnNhY3Rpb24gaGFzIG5vIGNsYWltLjBQb3RVbmRlcmZsb3cAAwhJAVRoZXJlJ3Mgbm90IGVub3VnaCBpbiB0aGUgcG90IHRvIHBheSBvdXQgc29tZSB1bnZlc3RlZCBhbW91bnQuIEdlbmVyYWxseSBpbXBsaWVzIGEwbG9naWMgZXJyb3IuQEludmFsaWRTdGF0ZW1lbnQABASQQSBuZWVkZWQgc3RhdGVtZW50IHdhcyBub3QgaW5jbHVkZWQuTFZlc3RlZEJhbGFuY2VFeGlzdHMABQSkVGhlIGFjY291bnQgYWxyZWFkeSBoYXMgYSB2ZXN0ZWQgYmFsYW5jZS4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQucQoMOHBhbGxldF91dGlsaXR5GHBhbGxldBRFcnJvcgQEVAABBDBUb29NYW55Q2FsbHMAAARcVG9vIG1hbnkgY2FsbHMgYmF0Y2hlZC4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQudQoIOHBhbGxldF9zb2NpZXR5ME1lbWJlclJlY29yZAAAEAEQcmFuaxABEFJhbmsAARxzdHJpa2VzEAEsU3RyaWtlQ291bnQAASB2b3VjaGluZ3kKAVhPcHRpb248Vm91Y2hpbmdTdGF0dXM+AAEUaW5kZXgQAQx1MzIAAHkKBBhPcHRpb24EBFQBfQoBCBBOb25lAAAAEFNvbWUEAH0KAAABAAB9Cgg4cGFsbGV0X3NvY2lldHk4Vm91Y2hpbmdTdGF0dXMAAQggVm91Y2hpbmcAAAAYQmFubmVkAAEAAIEKCDhwYWxsZXRfc29jaWV0eTBQYXlvdXRSZWNvcmQIHEJhbGFuY2UBGChQYXlvdXRzVmVjAYUKAAgBEHBhaWQYARxCYWxhbmNlAAEccGF5b3V0c4UKAShQYXlvdXRzVmVjAACFCgxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUASEKBFMAAAQAJQoBGFZlYzxUPgAAiQoMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAGNCgRTAAAEAJUKARhWZWM8VD4AAI0KCDhwYWxsZXRfc29jaWV0eQxCaWQIJEFjY291bnRJZAEAHEJhbGFuY2UBGAAMAQx3aG8AASRBY2NvdW50SWQAARBraW5kkQoBbEJpZEtpbmQ8QWNjb3VudElkLCBCYWxhbmNlPgABFHZhbHVlGAEcQmFsYW5jZQAAkQoIOHBhbGxldF9zb2NpZXR5HEJpZEtpbmQIJEFjY291bnRJZAEAHEJhbGFuY2UBGAEIHERlcG9zaXQEABgBHEJhbGFuY2UAAAAUVm91Y2gIAAABJEFjY291bnRJZAAAGAEcQmFsYW5jZQABAACVCgAAAo0KAJkKCDhwYWxsZXRfc29jaWV0eSRDYW5kaWRhY3kIJEFjY291bnRJZAEAHEJhbGFuY2UBGAAUARRyb3VuZBABKFJvdW5kSW5kZXgAARBraW5kkQoBbEJpZEtpbmQ8QWNjb3VudElkLCBCYWxhbmNlPgABDGJpZBgBHEJhbGFuY2UAARR0YWxseZ0KARRUYWxseQABOHNrZXB0aWNfc3RydWNrIAEQYm9vbAAAnQoIOHBhbGxldF9zb2NpZXR5FFRhbGx5AAAIASRhcHByb3ZhbHMQASRWb3RlQ291bnQAAShyZWplY3Rpb25zEAEkVm90ZUNvdW50AAChCgAABAgAAAClCgg4cGFsbGV0X3NvY2lldHkQVm90ZQAACAEcYXBwcm92ZSABEGJvb2wAARh3ZWlnaHQQAQx1MzIAAKkKDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBCARTAAAEADgBGFZlYzxUPgAArQoIOHBhbGxldF9zb2NpZXR5MEludGFrZVJlY29yZAgkQWNjb3VudElkAQAcQmFsYW5jZQEYAAwBDHdobwABJEFjY291bnRJZAABDGJpZBgBHEJhbGFuY2UAARRyb3VuZBABKFJvdW5kSW5kZXgAALEKAAAEDAAAnQoAtQoMOHBhbGxldF9zb2NpZXR5GHBhbGxldBRFcnJvcggEVAAESQABgCROb3RNZW1iZXIAAARUVXNlciBpcyBub3QgYSBtZW1iZXIuNEFscmVhZHlNZW1iZXIAAQRkVXNlciBpcyBhbHJlYWR5IGEgbWVtYmVyLiRTdXNwZW5kZWQAAgRIVXNlciBpcyBzdXNwZW5kZWQuME5vdFN1c3BlbmRlZAADBFhVc2VyIGlzIG5vdCBzdXNwZW5kZWQuIE5vUGF5b3V0AAQESE5vdGhpbmcgdG8gcGF5b3V0LjhBbHJlYWR5Rm91bmRlZAAFBGBTb2NpZXR5IGFscmVhZHkgZm91bmRlZC48SW5zdWZmaWNpZW50UG90AAYEmE5vdCBlbm91Z2ggaW4gcG90IHRvIGFjY2VwdCBjYW5kaWRhdGUuPEFscmVhZHlWb3VjaGluZwAHBORNZW1iZXIgaXMgYWxyZWFkeSB2b3VjaGluZyBvciBiYW5uZWQgZnJvbSB2b3VjaGluZyBhZ2Fpbi5MTm90Vm91Y2hpbmdPbkJpZGRlcgAIBFxNZW1iZXIgaXMgbm90IHZvdWNoaW5nLhBIZWFkAAkEkENhbm5vdCByZW1vdmUgdGhlIGhlYWQgb2YgdGhlIGNoYWluLhxGb3VuZGVyAAoEaENhbm5vdCByZW1vdmUgdGhlIGZvdW5kZXIuKEFscmVhZHlCaWQACwRwVXNlciBoYXMgYWxyZWFkeSBtYWRlIGEgYmlkLkBBbHJlYWR5Q2FuZGlkYXRlAAwEcFVzZXIgaXMgYWxyZWFkeSBhIGNhbmRpZGF0ZS4wTm90Q2FuZGlkYXRlAA0EYFVzZXIgaXMgbm90IGEgY2FuZGlkYXRlLihNYXhNZW1iZXJzAA4EgFRvbyBtYW55IG1lbWJlcnMgaW4gdGhlIHNvY2lldHkuKE5vdEZvdW5kZXIADwR4VGhlIGNhbGxlciBpcyBub3QgdGhlIGZvdW5kZXIuHE5vdEhlYWQAEARsVGhlIGNhbGxlciBpcyBub3QgdGhlIGhlYWQuLE5vdEFwcHJvdmVkABEELQFUaGUgbWVtYmVyc2hpcCBjYW5ub3QgYmUgY2xhaW1lZCBhcyB0aGUgY2FuZGlkYXRlIHdhcyBub3QgY2xlYXJseSBhcHByb3ZlZC4sTm90UmVqZWN0ZWQAEgQlAVRoZSBjYW5kaWRhdGUgY2Fubm90IGJlIGtpY2tlZCBhcyB0aGUgY2FuZGlkYXRlIHdhcyBub3QgY2xlYXJseSByZWplY3RlZC4gQXBwcm92ZWQAEwQZAVRoZSBjYW5kaWRhY3kgY2Fubm90IGJlIGRyb3BwZWQgYXMgdGhlIGNhbmRpZGF0ZSB3YXMgY2xlYXJseSBhcHByb3ZlZC4gUmVqZWN0ZWQAFAQdAVRoZSBjYW5kaWRhY3kgY2Fubm90IGJlIGJlc3Rvd2VkIGFzIHRoZSBjYW5kaWRhdGUgd2FzIGNsZWFybHkgcmVqZWN0ZWQuKEluUHJvZ3Jlc3MAFQQVAVRoZSBjYW5kaWRhY3kgY2Fubm90IGJlIGNvbmNsdWRlZCBhcyB0aGUgdm90aW5nIGlzIHN0aWxsIGluIHByb2dyZXNzLiBUb29FYXJseQAWBEEBVGhlIGNhbmRpZGFjeSBjYW5ub3QgYmUgcHJ1bmVkIHVudGlsIGEgZnVsbCBhZGRpdGlvbmFsIGludGFrZSBwZXJpb2QgaGFzIHBhc3NlZC4UVm90ZWQAFwRoVGhlIHNrZXB0aWMgYWxyZWFkeSB2b3RlZC4cRXhwaXJlZAAYBPBUaGUgc2tlcHRpYyBuZWVkIG5vdCB2b3RlIG9uIGNhbmRpZGF0ZXMgZnJvbSBleHBpcmVkIHJvdW5kcy4kTm90QmlkZGVyABkEVFVzZXIgaXMgbm90IGEgYmlkZGVyLihOb0RlZmVuZGVyABoEfFRoZXJlIGlzIG5vIGRlZmVuZGVyIGN1cnJlbnRseS4gTm90R3JvdXAAGwRQR3JvdXAgZG9lc24ndCBleGlzdC48QWxyZWFkeUVsZXZhdGVkABwEsFRoZSBtZW1iZXIgaXMgYWxyZWFkeSBlbGV2YXRlZCB0byB0aGlzIHJhbmsuPEFscmVhZHlQdW5pc2hlZAAdBNxUaGUgc2tlcHRpYyBoYXMgYWxyZWFkeSBiZWVuIHB1bmlzaGVkIGZvciB0aGlzIG9mZmVuY2UuREluc3VmZmljaWVudEZ1bmRzAB4EwEZ1bmRzIGFyZSBpbnN1ZmZpY2llbnQgdG8gcGF5IG9mZiBzb2NpZXR5IGRlYnRzLhxOb1ZvdGVzAB8E0FRoZSBjYW5kaWRhdGUvZGVmZW5kZXIgaGFzIG5vIHN0YWxlIHZvdGVzIHRvIHJlbW92ZS4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQuuQoIPHBhbGxldF9yZWNvdmVyeThSZWNvdmVyeUNvbmZpZwwsQmxvY2tOdW1iZXIBEBxCYWxhbmNlARgcRnJpZW5kcwG9CgAQATBkZWxheV9wZXJpb2QQASxCbG9ja051bWJlcgABHGRlcG9zaXQYARxCYWxhbmNlAAEcZnJpZW5kc70KARxGcmllbmRzAAEkdGhyZXNob2xkVQEBDHUxNgAAvQoMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAEABFMAAAQArQEBGFZlYzxUPgAAwQoIPHBhbGxldF9yZWNvdmVyeThBY3RpdmVSZWNvdmVyeQwsQmxvY2tOdW1iZXIBEBxCYWxhbmNlARgcRnJpZW5kcwG9CgAMARxjcmVhdGVkEAEsQmxvY2tOdW1iZXIAARxkZXBvc2l0GAEcQmFsYW5jZQABHGZyaWVuZHO9CgEcRnJpZW5kcwAAxQoMPHBhbGxldF9yZWNvdmVyeRhwYWxsZXQURXJyb3IEBFQAAUAoTm90QWxsb3dlZAAABPBVc2VyIGlzIG5vdCBhbGxvd2VkIHRvIG1ha2UgYSBjYWxsIG9uIGJlaGFsZiBvZiB0aGlzIGFjY291bnQ0WmVyb1RocmVzaG9sZAABBIxUaHJlc2hvbGQgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVyb0BOb3RFbm91Z2hGcmllbmRzAAIE0EZyaWVuZHMgbGlzdCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvIGFuZCB0aHJlc2hvbGQoTWF4RnJpZW5kcwADBKhGcmllbmRzIGxpc3QgbXVzdCBiZSBsZXNzIHRoYW4gbWF4IGZyaWVuZHMkTm90U29ydGVkAAQEyEZyaWVuZHMgbGlzdCBtdXN0IGJlIHNvcnRlZCBhbmQgZnJlZSBvZiBkdXBsaWNhdGVzOE5vdFJlY292ZXJhYmxlAAUEnFRoaXMgYWNjb3VudCBpcyBub3Qgc2V0IHVwIGZvciByZWNvdmVyeUhBbHJlYWR5UmVjb3ZlcmFibGUABgSsVGhpcyBhY2NvdW50IGlzIGFscmVhZHkgc2V0IHVwIGZvciByZWNvdmVyeThBbHJlYWR5U3RhcnRlZAAHBNxBIHJlY292ZXJ5IHByb2Nlc3MgaGFzIGFscmVhZHkgc3RhcnRlZCBmb3IgdGhpcyBhY2NvdW50KE5vdFN0YXJ0ZWQACATMQSByZWNvdmVyeSBwcm9jZXNzIGhhcyBub3Qgc3RhcnRlZCBmb3IgdGhpcyByZXNjdWVyJE5vdEZyaWVuZAAJBKhUaGlzIGFjY291bnQgaXMgbm90IGEgZnJpZW5kIHdobyBjYW4gdm91Y2gsRGVsYXlQZXJpb2QACgQZAVRoZSBmcmllbmQgbXVzdCB3YWl0IHVudGlsIHRoZSBkZWxheSBwZXJpb2QgdG8gdm91Y2ggZm9yIHRoaXMgcmVjb3Zlcnk4QWxyZWFkeVZvdWNoZWQACwS8VGhpcyB1c2VyIGhhcyBhbHJlYWR5IHZvdWNoZWQgZm9yIHRoaXMgcmVjb3ZlcnkkVGhyZXNob2xkAAwE6FRoZSB0aHJlc2hvbGQgZm9yIHJlY292ZXJpbmcgdGhpcyBhY2NvdW50IGhhcyBub3QgYmVlbiBtZXQsU3RpbGxBY3RpdmUADQT8VGhlcmUgYXJlIHN0aWxsIGFjdGl2ZSByZWNvdmVyeSBhdHRlbXB0cyB0aGF0IG5lZWQgdG8gYmUgY2xvc2VkMEFscmVhZHlQcm94eQAOBKxUaGlzIGFjY291bnQgaXMgYWxyZWFkeSBzZXQgdXAgZm9yIHJlY292ZXJ5IEJhZFN0YXRlAA8EeFNvbWUgaW50ZXJuYWwgc3RhdGUgaXMgYnJva2VuLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC7JCgxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAekCBFMAAAQAzQoBGFZlYzxUPgAAzQoAAALpAgDRCgg4cGFsbGV0X3Zlc3RpbmcgUmVsZWFzZXMAAQgIVjAAAAAIVjEAAQAA1QoMOHBhbGxldF92ZXN0aW5nGHBhbGxldBRFcnJvcgQEVAABFChOb3RWZXN0aW5nAAAEhFRoZSBhY2NvdW50IGdpdmVuIGlzIG5vdCB2ZXN0aW5nLlRBdE1heFZlc3RpbmdTY2hlZHVsZXMAAQglAVRoZSBhY2NvdW50IGFscmVhZHkgaGFzIGBNYXhWZXN0aW5nU2NoZWR1bGVzYCBjb3VudCBvZiBzY2hlZHVsZXMgYW5kIHRodXNRAWNhbm5vdCBhZGQgYW5vdGhlciBvbmUuIENvbnNpZGVyIG1lcmdpbmcgZXhpc3Rpbmcgc2NoZWR1bGVzIGluIG9yZGVyIHRvIGFkZCBhbm90aGVyLiRBbW91bnRMb3cAAgQFAUFtb3VudCBiZWluZyB0cmFuc2ZlcnJlZCBpcyB0b28gbG93IHRvIGNyZWF0ZSBhIHZlc3Rpbmcgc2NoZWR1bGUuYFNjaGVkdWxlSW5kZXhPdXRPZkJvdW5kcwADBNBBbiBpbmRleCB3YXMgb3V0IG9mIGJvdW5kcyBvZiB0aGUgdmVzdGluZyBzY2hlZHVsZXMuVEludmFsaWRTY2hlZHVsZVBhcmFtcwAEBA0BRmFpbGVkIHRvIGNyZWF0ZSBhIG5ldyBzY2hlZHVsZSBiZWNhdXNlIHNvbWUgcGFyYW1ldGVyIHdhcyBpbnZhbGlkLgR0RXJyb3IgZm9yIHRoZSB2ZXN0aW5nIHBhbGxldC7ZCgxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAd0KBFMAAAQA5QoBGFZlYzxUPgAA3QoEGE9wdGlvbgQEVAHhCgEIEE5vbmUAAAAQU29tZQQA4QoAAAEAAOEKCEBwYWxsZXRfc2NoZWR1bGVyJFNjaGVkdWxlZBQQTmFtZQEEEENhbGwBWQEsQmxvY2tOdW1iZXIBEDRQYWxsZXRzT3JpZ2luAVkCJEFjY291bnRJZAEAABQBIG1heWJlX2lksQcBME9wdGlvbjxOYW1lPgABIHByaW9yaXR5CAFIc2NoZWR1bGU6OlByaW9yaXR5AAEQY2FsbFkBARBDYWxsAAE4bWF5YmVfcGVyaW9kaWPxAgGUT3B0aW9uPHNjaGVkdWxlOjpQZXJpb2Q8QmxvY2tOdW1iZXI+PgABGG9yaWdpblkCATRQYWxsZXRzT3JpZ2luAADlCgAAAt0KAOkKCEBwYWxsZXRfc2NoZWR1bGVyLFJldHJ5Q29uZmlnBBhQZXJpb2QBEAAMATR0b3RhbF9yZXRyaWVzCAEIdTgAASRyZW1haW5pbmcIAQh1OAABGHBlcmlvZBABGFBlcmlvZAAA7QoMQHBhbGxldF9zY2hlZHVsZXIYcGFsbGV0FEVycm9yBARUAAEUQEZhaWxlZFRvU2NoZWR1bGUAAARkRmFpbGVkIHRvIHNjaGVkdWxlIGEgY2FsbCBOb3RGb3VuZAABBHxDYW5ub3QgZmluZCB0aGUgc2NoZWR1bGVkIGNhbGwuXFRhcmdldEJsb2NrTnVtYmVySW5QYXN0AAIEpEdpdmVuIHRhcmdldCBibG9jayBudW1iZXIgaXMgaW4gdGhlIHBhc3QuSFJlc2NoZWR1bGVOb0NoYW5nZQADBPBSZXNjaGVkdWxlIGZhaWxlZCBiZWNhdXNlIGl0IGRvZXMgbm90IGNoYW5nZSBzY2hlZHVsZWQgdGltZS4UTmFtZWQABATQQXR0ZW1wdCB0byB1c2UgYSBub24tbmFtZWQgZnVuY3Rpb24gb24gYSBuYW1lZCB0YXNrLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC7xCgAABAj1ChgA9QoMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAH5CgRTAAAEAP0KARhWZWM8VD4AAPkKCDBwYWxsZXRfcHJveHk8UHJveHlEZWZpbml0aW9uDCRBY2NvdW50SWQBACRQcm94eVR5cGUBAQMsQmxvY2tOdW1iZXIBEAAMASBkZWxlZ2F0ZQABJEFjY291bnRJZAABKHByb3h5X3R5cGUBAwEkUHJveHlUeXBlAAEUZGVsYXkQASxCbG9ja051bWJlcgAA/QoAAAL5CgABCwAABAgFCxgABQsMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAEJCwRTAAAEAA0LARhWZWM8VD4AAAkLCDBwYWxsZXRfcHJveHkwQW5ub3VuY2VtZW50DCRBY2NvdW50SWQBABBIYXNoATQsQmxvY2tOdW1iZXIBEAAMARByZWFsAAEkQWNjb3VudElkAAEkY2FsbF9oYXNoNAEQSGFzaAABGGhlaWdodBABLEJsb2NrTnVtYmVyAAANCwAAAgkLABELDDBwYWxsZXRfcHJveHkYcGFsbGV0FEVycm9yBARUAAEgHFRvb01hbnkAAAQhAVRoZXJlIGFyZSB0b28gbWFueSBwcm94aWVzIHJlZ2lzdGVyZWQgb3IgdG9vIG1hbnkgYW5ub3VuY2VtZW50cyBwZW5kaW5nLiBOb3RGb3VuZAABBHRQcm94eSByZWdpc3RyYXRpb24gbm90IGZvdW5kLiBOb3RQcm94eQACBMxTZW5kZXIgaXMgbm90IGEgcHJveHkgb2YgdGhlIGFjY291bnQgdG8gYmUgcHJveGllZC4sVW5wcm94eWFibGUAAwQhAUEgY2FsbCB3aGljaCBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgcHJveHkgdHlwZSdzIGZpbHRlciB3YXMgYXR0ZW1wdGVkLiREdXBsaWNhdGUABARsQWNjb3VudCBpcyBhbHJlYWR5IGEgcHJveHkuME5vUGVybWlzc2lvbgAFBBUBQ2FsbCBtYXkgbm90IGJlIG1hZGUgYnkgcHJveHkgYmVjYXVzZSBpdCBtYXkgZXNjYWxhdGUgaXRzIHByaXZpbGVnZXMuLFVuYW5ub3VuY2VkAAYE0EFubm91bmNlbWVudCwgaWYgbWFkZSBhdCBhbGwsIHdhcyBtYWRlIHRvbyByZWNlbnRseS4sTm9TZWxmUHJveHkABwRkQ2Fubm90IGFkZCBzZWxmIGFzIHByb3h5LgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC4VCwAABAgABAAZCwg8cGFsbGV0X211bHRpc2lnIE11bHRpc2lnECxCbG9ja051bWJlcgEQHEJhbGFuY2UBGCRBY2NvdW50SWQBADBNYXhBcHByb3ZhbHMAABABEHdoZW4NAwFYVGltZXBvaW50PEJsb2NrTnVtYmVyPgABHGRlcG9zaXQYARxCYWxhbmNlAAEkZGVwb3NpdG9yAAEkQWNjb3VudElkAAEkYXBwcm92YWxzHQsBjEJvdW5kZWRWZWM8QWNjb3VudElkLCBNYXhBcHByb3ZhbHM+AAAdCwxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAQAEUwAABACtAQEYVmVjPFQ+AAAhCww8cGFsbGV0X211bHRpc2lnGHBhbGxldBRFcnJvcgQEVAABOEBNaW5pbXVtVGhyZXNob2xkAAAEfFRocmVzaG9sZCBtdXN0IGJlIDIgb3IgZ3JlYXRlci48QWxyZWFkeUFwcHJvdmVkAAEErENhbGwgaXMgYWxyZWFkeSBhcHByb3ZlZCBieSB0aGlzIHNpZ25hdG9yeS5ETm9BcHByb3ZhbHNOZWVkZWQAAgScQ2FsbCBkb2Vzbid0IG5lZWQgYW55IChtb3JlKSBhcHByb3ZhbHMuRFRvb0Zld1NpZ25hdG9yaWVzAAMEqFRoZXJlIGFyZSB0b28gZmV3IHNpZ25hdG9yaWVzIGluIHRoZSBsaXN0LkhUb29NYW55U2lnbmF0b3JpZXMABASsVGhlcmUgYXJlIHRvbyBtYW55IHNpZ25hdG9yaWVzIGluIHRoZSBsaXN0LlRTaWduYXRvcmllc091dE9mT3JkZXIABQQNAVRoZSBzaWduYXRvcmllcyB3ZXJlIHByb3ZpZGVkIG91dCBvZiBvcmRlcjsgdGhleSBzaG91bGQgYmUgb3JkZXJlZC5MU2VuZGVySW5TaWduYXRvcmllcwAGBA0BVGhlIHNlbmRlciB3YXMgY29udGFpbmVkIGluIHRoZSBvdGhlciBzaWduYXRvcmllczsgaXQgc2hvdWxkbid0IGJlLiBOb3RGb3VuZAAHBNxNdWx0aXNpZyBvcGVyYXRpb24gbm90IGZvdW5kIHdoZW4gYXR0ZW1wdGluZyB0byBjYW5jZWwuIE5vdE93bmVyAAgELQFPbmx5IHRoZSBhY2NvdW50IHRoYXQgb3JpZ2luYWxseSBjcmVhdGVkIHRoZSBtdWx0aXNpZyBpcyBhYmxlIHRvIGNhbmNlbCBpdC4sTm9UaW1lcG9pbnQACQQdAU5vIHRpbWVwb2ludCB3YXMgZ2l2ZW4sIHlldCB0aGUgbXVsdGlzaWcgb3BlcmF0aW9uIGlzIGFscmVhZHkgdW5kZXJ3YXkuOFdyb25nVGltZXBvaW50AAoELQFBIGRpZmZlcmVudCB0aW1lcG9pbnQgd2FzIGdpdmVuIHRvIHRoZSBtdWx0aXNpZyBvcGVyYXRpb24gdGhhdCBpcyB1bmRlcndheS5MVW5leHBlY3RlZFRpbWVwb2ludAALBPRBIHRpbWVwb2ludCB3YXMgZ2l2ZW4sIHlldCBubyBtdWx0aXNpZyBvcGVyYXRpb24gaXMgdW5kZXJ3YXkuPE1heFdlaWdodFRvb0xvdwAMBNBUaGUgbWF4aW11bSB3ZWlnaHQgaW5mb3JtYXRpb24gcHJvdmlkZWQgd2FzIHRvbyBsb3cuNEFscmVhZHlTdG9yZWQADQSgVGhlIGRhdGEgdG8gYmUgc3RvcmVkIGlzIGFscmVhZHkgc3RvcmVkLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC4lCwg8cGFsbGV0X3ByZWltYWdlQE9sZFJlcXVlc3RTdGF0dXMIJEFjY291bnRJZAEAHEJhbGFuY2UBGAEILFVucmVxdWVzdGVkCAEcZGVwb3NpdHEEAVAoQWNjb3VudElkLCBCYWxhbmNlKQABDGxlbhABDHUzMgAAACRSZXF1ZXN0ZWQMARxkZXBvc2l0KQsBcE9wdGlvbjwoQWNjb3VudElkLCBCYWxhbmNlKT4AARRjb3VudBABDHUzMgABDGxlbj0CASxPcHRpb248dTMyPgABAAApCwQYT3B0aW9uBARUAXEEAQgQTm9uZQAAABBTb21lBABxBAAAAQAALQsIPHBhbGxldF9wcmVpbWFnZTRSZXF1ZXN0U3RhdHVzCCRBY2NvdW50SWQBABhUaWNrZXQBMQsBCCxVbnJlcXVlc3RlZAgBGHRpY2tldDULAUwoQWNjb3VudElkLCBUaWNrZXQpAAEMbGVuEAEMdTMyAAAAJFJlcXVlc3RlZAwBMG1heWJlX3RpY2tldDkLAWxPcHRpb248KEFjY291bnRJZCwgVGlja2V0KT4AARRjb3VudBABDHUzMgABJG1heWJlX2xlbj0CASxPcHRpb248dTMyPgABAAAxCxQ0ZnJhbWVfc3VwcG9ydBh0cmFpdHMYdG9rZW5zIGZ1bmdpYmxlREhvbGRDb25zaWRlcmF0aW9uFARBAARGAARSAAREAAhGcAAABAAYAShGOjpCYWxhbmNlAAA1CwAABAgAMQsAOQsEGE9wdGlvbgQEVAE1CwEIEE5vbmUAAAAQU29tZQQANQsAAAEAAD0LDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBCARTAAAEADgBGFZlYzxUPgAAQQsMPHBhbGxldF9wcmVpbWFnZRhwYWxsZXQURXJyb3IEBFQAASQYVG9vQmlnAAAEoFByZWltYWdlIGlzIHRvbyBsYXJnZSB0byBzdG9yZSBvbi1jaGFpbi4wQWxyZWFkeU5vdGVkAAEEpFByZWltYWdlIGhhcyBhbHJlYWR5IGJlZW4gbm90ZWQgb24tY2hhaW4uNE5vdEF1dGhvcml6ZWQAAgTIVGhlIHVzZXIgaXMgbm90IGF1dGhvcml6ZWQgdG8gcGVyZm9ybSB0aGlzIGFjdGlvbi4gTm90Tm90ZWQAAwT8VGhlIHByZWltYWdlIGNhbm5vdCBiZSByZW1vdmVkIHNpbmNlIGl0IGhhcyBub3QgeWV0IGJlZW4gbm90ZWQuJFJlcXVlc3RlZAAEBAkBQSBwcmVpbWFnZSBtYXkgbm90IGJlIHJlbW92ZWQgd2hlbiB0aGVyZSBhcmUgb3V0c3RhbmRpbmcgcmVxdWVzdHMuME5vdFJlcXVlc3RlZAAFBC0BVGhlIHByZWltYWdlIHJlcXVlc3QgY2Fubm90IGJlIHJlbW92ZWQgc2luY2Ugbm8gb3V0c3RhbmRpbmcgcmVxdWVzdHMgZXhpc3QuHFRvb01hbnkABgRVAU1vcmUgdGhhbiBgTUFYX0hBU0hfVVBHUkFERV9CVUxLX0NPVU5UYCBoYXNoZXMgd2VyZSByZXF1ZXN0ZWQgdG8gYmUgdXBncmFkZWQgYXQgb25jZS4YVG9vRmV3AAcE5FRvbyBmZXcgaGFzaGVzIHdlcmUgcmVxdWVzdGVkIHRvIGJlIHVwZ3JhZGVkIChpLmUuIHplcm8pLhhOb0Nvc3QACARZAU5vIHRpY2tldCB3aXRoIGEgY29zdCB3YXMgcmV0dXJuZWQgYnkgW2BDb25maWc6OkNvbnNpZGVyYXRpb25gXSB0byBzdG9yZSB0aGUgcHJlaW1hZ2UuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LkULCDxwYWxsZXRfYm91bnRpZXMYQm91bnR5DCRBY2NvdW50SWQBABxCYWxhbmNlARgsQmxvY2tOdW1iZXIBEAAYASBwcm9wb3NlcgABJEFjY291bnRJZAABFHZhbHVlGAEcQmFsYW5jZQABDGZlZRgBHEJhbGFuY2UAATxjdXJhdG9yX2RlcG9zaXQYARxCYWxhbmNlAAEQYm9uZBgBHEJhbGFuY2UAARhzdGF0dXNJCwGQQm91bnR5U3RhdHVzPEFjY291bnRJZCwgQmxvY2tOdW1iZXI+AABJCwg8cGFsbGV0X2JvdW50aWVzMEJvdW50eVN0YXR1cwgkQWNjb3VudElkAQAsQmxvY2tOdW1iZXIBEAEYIFByb3Bvc2VkAAAAIEFwcHJvdmVkAAEAGEZ1bmRlZAACADxDdXJhdG9yUHJvcG9zZWQEARxjdXJhdG9yAAEkQWNjb3VudElkAAMAGEFjdGl2ZQgBHGN1cmF0b3IAASRBY2NvdW50SWQAASh1cGRhdGVfZHVlEAEsQmxvY2tOdW1iZXIABAA0UGVuZGluZ1BheW91dAwBHGN1cmF0b3IAASRBY2NvdW50SWQAASxiZW5lZmljaWFyeQABJEFjY291bnRJZAABJHVubG9ja19hdBABLEJsb2NrTnVtYmVyAAUAAE0LDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBCARTAAAEADgBGFZlYzxUPgAAUQsMPHBhbGxldF9ib3VudGllcxhwYWxsZXQURXJyb3IIBFQABEkAASxwSW5zdWZmaWNpZW50UHJvcG9zZXJzQmFsYW5jZQAABHhQcm9wb3NlcidzIGJhbGFuY2UgaXMgdG9vIGxvdy4wSW52YWxpZEluZGV4AAEEkE5vIHByb3Bvc2FsIG9yIGJvdW50eSBhdCB0aGF0IGluZGV4LjBSZWFzb25Ub29CaWcAAgSEVGhlIHJlYXNvbiBnaXZlbiBpcyBqdXN0IHRvbyBiaWcuQFVuZXhwZWN0ZWRTdGF0dXMAAwSAVGhlIGJvdW50eSBzdGF0dXMgaXMgdW5leHBlY3RlZC44UmVxdWlyZUN1cmF0b3IABARcUmVxdWlyZSBib3VudHkgY3VyYXRvci4wSW52YWxpZFZhbHVlAAUEVEludmFsaWQgYm91bnR5IHZhbHVlLihJbnZhbGlkRmVlAAYETEludmFsaWQgYm91bnR5IGZlZS40UGVuZGluZ1BheW91dAAHCGxBIGJvdW50eSBwYXlvdXQgaXMgcGVuZGluZy74VG8gY2FuY2VsIHRoZSBib3VudHksIHlvdSBtdXN0IHVuYXNzaWduIGFuZCBzbGFzaCB0aGUgY3VyYXRvci4kUHJlbWF0dXJlAAgERQFUaGUgYm91bnRpZXMgY2Fubm90IGJlIGNsYWltZWQvY2xvc2VkIGJlY2F1c2UgaXQncyBzdGlsbCBpbiB0aGUgY291bnRkb3duIHBlcmlvZC5QSGFzQWN0aXZlQ2hpbGRCb3VudHkACQQFAVRoZSBib3VudHkgY2Fubm90IGJlIGNsb3NlZCBiZWNhdXNlIGl0IGhhcyBhY3RpdmUgY2hpbGQgYm91bnRpZXMuNFRvb01hbnlRdWV1ZWQACgSYVG9vIG1hbnkgYXBwcm92YWxzIGFyZSBhbHJlYWR5IHF1ZXVlZC4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQuVQsIVHBhbGxldF9jaGlsZF9ib3VudGllcyxDaGlsZEJvdW50eQwkQWNjb3VudElkAQAcQmFsYW5jZQEYLEJsb2NrTnVtYmVyARAAFAE0cGFyZW50X2JvdW50eRABLEJvdW50eUluZGV4AAEUdmFsdWUYARxCYWxhbmNlAAEMZmVlGAEcQmFsYW5jZQABPGN1cmF0b3JfZGVwb3NpdBgBHEJhbGFuY2UAARhzdGF0dXNZCwGkQ2hpbGRCb3VudHlTdGF0dXM8QWNjb3VudElkLCBCbG9ja051bWJlcj4AAFkLCFRwYWxsZXRfY2hpbGRfYm91bnRpZXNEQ2hpbGRCb3VudHlTdGF0dXMIJEFjY291bnRJZAEALEJsb2NrTnVtYmVyARABEBRBZGRlZAAAADxDdXJhdG9yUHJvcG9zZWQEARxjdXJhdG9yAAEkQWNjb3VudElkAAEAGEFjdGl2ZQQBHGN1cmF0b3IAASRBY2NvdW50SWQAAgA0UGVuZGluZ1BheW91dAwBHGN1cmF0b3IAASRBY2NvdW50SWQAASxiZW5lZmljaWFyeQABJEFjY291bnRJZAABJHVubG9ja19hdBABLEJsb2NrTnVtYmVyAAMAAF0LDFRwYWxsZXRfY2hpbGRfYm91bnRpZXMYcGFsbGV0FEVycm9yBARUAAEMVFBhcmVudEJvdW50eU5vdEFjdGl2ZQAABKRUaGUgcGFyZW50IGJvdW50eSBpcyBub3QgaW4gYWN0aXZlIHN0YXRlLmRJbnN1ZmZpY2llbnRCb3VudHlCYWxhbmNlAAEE5FRoZSBib3VudHkgYmFsYW5jZSBpcyBub3QgZW5vdWdoIHRvIGFkZCBuZXcgY2hpbGQtYm91bnR5LlBUb29NYW55Q2hpbGRCb3VudGllcwACBA0BTnVtYmVyIG9mIGNoaWxkIGJvdW50aWVzIGV4Y2VlZHMgbGltaXQgYE1heEFjdGl2ZUNoaWxkQm91bnR5Q291bnRgLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC5hCwiQcGFsbGV0X2VsZWN0aW9uX3Byb3ZpZGVyX211bHRpX3BoYXNlNFJlYWR5U29sdXRpb24IJEFjY291bnRJZAAoTWF4V2lubmVycwAADAEgc3VwcG9ydHNlCwGYQm91bmRlZFN1cHBvcnRzPEFjY291bnRJZCwgTWF4V2lubmVycz4AARRzY29yZVUEATRFbGVjdGlvblNjb3JlAAEcY29tcHV0Zc0HATxFbGVjdGlvbkNvbXB1dGUAAGULDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBZQQEUwAABABhBAEYVmVjPFQ+AABpCwiQcGFsbGV0X2VsZWN0aW9uX3Byb3ZpZGVyX211bHRpX3BoYXNlNFJvdW5kU25hcHNob3QIJEFjY291bnRJZAEAMERhdGFQcm92aWRlcgFtCwAIARh2b3RlcnNxCwFEVmVjPERhdGFQcm92aWRlcj4AARx0YXJnZXRzrQEBOFZlYzxBY2NvdW50SWQ+AABtCwAABAwAMCEJAHELAAACbQsAdQsMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAF5CwRTAAAEAH0LARhWZWM8VD4AAHkLAAAEDFUEEBAAfQsAAAJ5CwCBCwyQcGFsbGV0X2VsZWN0aW9uX3Byb3ZpZGVyX211bHRpX3BoYXNlGHNpZ25lZEBTaWduZWRTdWJtaXNzaW9uDCRBY2NvdW50SWQBABxCYWxhbmNlARggU29sdXRpb24BKQMAEAEMd2hvAAEkQWNjb3VudElkAAEcZGVwb3NpdBgBHEJhbGFuY2UAATByYXdfc29sdXRpb24lAwFUUmF3U29sdXRpb248U29sdXRpb24+AAEgY2FsbF9mZWUYARxCYWxhbmNlAACFCwyQcGFsbGV0X2VsZWN0aW9uX3Byb3ZpZGVyX211bHRpX3BoYXNlGHBhbGxldBRFcnJvcgQEVAABPGhQcmVEaXNwYXRjaEVhcmx5U3VibWlzc2lvbgAABGRTdWJtaXNzaW9uIHdhcyB0b28gZWFybHkubFByZURpc3BhdGNoV3JvbmdXaW5uZXJDb3VudAABBIhXcm9uZyBudW1iZXIgb2Ygd2lubmVycyBwcmVzZW50ZWQuZFByZURpc3BhdGNoV2Vha1N1Ym1pc3Npb24AAgSQU3VibWlzc2lvbiB3YXMgdG9vIHdlYWssIHNjb3JlLXdpc2UuPFNpZ25lZFF1ZXVlRnVsbAADBEkBVGhlIHF1ZXVlIHdhcyBmdWxsLCBhbmQgdGhlIHNvbHV0aW9uIHdhcyBub3QgYmV0dGVyIHRoYW4gYW55IG9mIHRoZSBleGlzdGluZyBvbmVzLlhTaWduZWRDYW5ub3RQYXlEZXBvc2l0AAQElFRoZSBvcmlnaW4gZmFpbGVkIHRvIHBheSB0aGUgZGVwb3NpdC5QU2lnbmVkSW52YWxpZFdpdG5lc3MABQSgV2l0bmVzcyBkYXRhIHRvIGRpc3BhdGNoYWJsZSBpcyBpbnZhbGlkLkxTaWduZWRUb29NdWNoV2VpZ2h0AAYEuFRoZSBzaWduZWQgc3VibWlzc2lvbiBjb25zdW1lcyB0b28gbXVjaCB3ZWlnaHQ8T2N3Q2FsbFdyb25nRXJhAAcEmE9DVyBzdWJtaXR0ZWQgc29sdXRpb24gZm9yIHdyb25nIHJvdW5kXE1pc3NpbmdTbmFwc2hvdE1ldGFkYXRhAAgEqFNuYXBzaG90IG1ldGFkYXRhIHNob3VsZCBleGlzdCBidXQgZGlkbid0LlhJbnZhbGlkU3VibWlzc2lvbkluZGV4AAkE0GBTZWxmOjppbnNlcnRfc3VibWlzc2lvbmAgcmV0dXJuZWQgYW4gaW52YWxpZCBpbmRleC44Q2FsbE5vdEFsbG93ZWQACgSYVGhlIGNhbGwgaXMgbm90IGFsbG93ZWQgYXQgdGhpcyBwb2ludC44RmFsbGJhY2tGYWlsZWQACwRMVGhlIGZhbGxiYWNrIGZhaWxlZCxCb3VuZE5vdE1ldAAMBEhTb21lIGJvdW5kIG5vdCBtZXQ4VG9vTWFueVdpbm5lcnMADQScU3VibWl0dGVkIHNvbHV0aW9uIGhhcyB0b28gbWFueSB3aW5uZXJzZFByZURpc3BhdGNoRGlmZmVyZW50Um91bmQADgS4U3VibWlzc2lvbiB3YXMgcHJlcGFyZWQgZm9yIGEgZGlmZmVyZW50IHJvdW5kLgQNAUVycm9yIG9mIHRoZSBwYWxsZXQgdGhhdCBjYW4gYmUgcmV0dXJuZWQgaW4gcmVzcG9uc2UgdG8gZGlzcGF0Y2hlcy6JCwxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUASEKBFMAAAQAJQoBGFZlYzxUPgAAjQsMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAGRCwRTAAAEAJULARhWZWM8VD4AAJELDChwYWxsZXRfbmlzGHBhbGxldAxCaWQIHEJhbGFuY2UBGCRBY2NvdW50SWQBAAAIARhhbW91bnQYARxCYWxhbmNlAAEMd2hvAAEkQWNjb3VudElkAACVCwAAApELAJkLDChwYWxsZXRfbmlzGHBhbGxldDRTdW1tYXJ5UmVjb3JkCCxCbG9ja051bWJlcgEQHEJhbGFuY2UBGAAUATxwcm9wb3J0aW9uX293ZWSdAgEsUGVycXVpbnRpbGwAARRpbmRleBABMFJlY2VpcHRJbmRleAABGHRoYXdlZJ0CASxQZXJxdWludGlsbAABLGxhc3RfcGVyaW9kEAEsQmxvY2tOdW1iZXIAAUByZWNlaXB0c19vbl9ob2xkGAEcQmFsYW5jZQAAnQsMKHBhbGxldF9uaXMYcGFsbGV0NFJlY2VpcHRSZWNvcmQMJEFjY291bnRJZAEALEJsb2NrTnVtYmVyARAcQmFsYW5jZQEYAAwBKHByb3BvcnRpb26dAgEsUGVycXVpbnRpbGwAARRvd25lcikLAXBPcHRpb248KEFjY291bnRJZCwgQmFsYW5jZSk+AAEYZXhwaXJ5EAEsQmxvY2tOdW1iZXIAAKELAAAECJ0CEAClCwwocGFsbGV0X25pcxhwYWxsZXQURXJyb3IEBFQAATxARHVyYXRpb25Ub29TbWFsbAAABKRUaGUgZHVyYXRpb24gb2YgdGhlIGJpZCBpcyBsZXNzIHRoYW4gb25lLjhEdXJhdGlvblRvb0JpZwABBPRUaGUgZHVyYXRpb24gaXMgdGhlIGJpZCBpcyBncmVhdGVyIHRoYW4gdGhlIG51bWJlciBvZiBxdWV1ZXMuOEFtb3VudFRvb1NtYWxsAAIE3FRoZSBhbW91bnQgb2YgdGhlIGJpZCBpcyBsZXNzIHRoYW4gdGhlIG1pbmltdW0gYWxsb3dlZC4kQmlkVG9vTG93AAMIQQFUaGUgcXVldWUgZm9yIHRoZSBiaWQncyBkdXJhdGlvbiBpcyBmdWxsIGFuZCB0aGUgYW1vdW50IGJpZCBpcyB0b28gbG93IHRvIGdldCBpboh0aHJvdWdoIHJlcGxhY2luZyBhbiBleGlzdGluZyBiaWQuOFVua25vd25SZWNlaXB0AAQEZFJlY2VpcHQgaW5kZXggaXMgdW5rbm93bi4gTm90T3duZXIABQR0Tm90IHRoZSBvd25lciBvZiB0aGUgcmVjZWlwdC4oTm90RXhwaXJlZAAGBHBCb25kIG5vdCB5ZXQgYXQgZXhwaXJ5IGRhdGUuKFVua25vd25CaWQABwSoVGhlIGdpdmVuIGJpZCBmb3IgcmV0cmFjdGlvbiBpcyBub3QgZm91bmQuNFBvcnRpb25Ub29CaWcACATgVGhlIHBvcnRpb24gc3VwcGxpZWQgaXMgYmV5b25kIHRoZSB2YWx1ZSBvZiB0aGUgcmVjZWlwdC4gVW5mdW5kZWQACQSUTm90IGVub3VnaCBmdW5kcyBhcmUgaGVsZCB0byBwYXkgb3V0LjRBbHJlYWR5RnVuZGVkAAoEsFRoZXJlIGFyZSBlbm91Z2ggZnVuZHMgZm9yIHdoYXQgaXMgcmVxdWlyZWQuJFRocm90dGxlZAALBMxUaGUgdGhhdyB0aHJvdHRsZSBoYXMgYmVlbiByZWFjaGVkIGZvciB0aGlzIHBlcmlvZC4kTWFrZXNEdXN0AAwEFQFUaGUgb3BlcmF0aW9uIHdvdWxkIHJlc3VsdCBpbiBhIHJlY2VpcHQgd29ydGggYW4gaW5zaWduaWZpY2FudCB2YWx1ZS48QWxyZWFkeUNvbW11bmFsAA0EgFRoZSByZWNlaXB0IGlzIGFscmVhZHkgY29tbXVuYWwuOEFscmVhZHlQcml2YXRlAA4EfFRoZSByZWNlaXB0IGlzIGFscmVhZHkgcHJpdmF0ZS4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQuqQsMTGJvdW5kZWRfY29sbGVjdGlvbnNAd2Vha19ib3VuZGVkX3ZlYzhXZWFrQm91bmRlZFZlYwgEVAHJCARTAAAEANEIARhWZWM8VD4AAK0LDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQB2QgEUwAABADdCAEYVmVjPFQ+AACxCwxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAbULBFMAAAQAuQsBGFZlYzxUPgAAtQsUNGZyYW1lX3N1cHBvcnQYdHJhaXRzGHRva2VucxBtaXNjIElkQW1vdW50CAhJZAGhARxCYWxhbmNlARgACAEIaWShAQEISWQAARhhbW91bnQYARxCYWxhbmNlAAC5CwAAArULAL0LDDxwYWxsZXRfYmFsYW5jZXMYcGFsbGV0FEVycm9yCARUAARJAAEwOFZlc3RpbmdCYWxhbmNlAAAEnFZlc3RpbmcgYmFsYW5jZSB0b28gaGlnaCB0byBzZW5kIHZhbHVlLlRMaXF1aWRpdHlSZXN0cmljdGlvbnMAAQTIQWNjb3VudCBsaXF1aWRpdHkgcmVzdHJpY3Rpb25zIHByZXZlbnQgd2l0aGRyYXdhbC5MSW5zdWZmaWNpZW50QmFsYW5jZQACBHhCYWxhbmNlIHRvbyBsb3cgdG8gc2VuZCB2YWx1ZS5IRXhpc3RlbnRpYWxEZXBvc2l0AAME7FZhbHVlIHRvbyBsb3cgdG8gY3JlYXRlIGFjY291bnQgZHVlIHRvIGV4aXN0ZW50aWFsIGRlcG9zaXQuNEV4cGVuZGFiaWxpdHkABASQVHJhbnNmZXIvcGF5bWVudCB3b3VsZCBraWxsIGFjY291bnQuXEV4aXN0aW5nVmVzdGluZ1NjaGVkdWxlAAUEzEEgdmVzdGluZyBzY2hlZHVsZSBhbHJlYWR5IGV4aXN0cyBmb3IgdGhpcyBhY2NvdW50LixEZWFkQWNjb3VudAAGBIxCZW5lZmljaWFyeSBhY2NvdW50IG11c3QgcHJlLWV4aXN0LjxUb29NYW55UmVzZXJ2ZXMABwS4TnVtYmVyIG9mIG5hbWVkIHJlc2VydmVzIGV4Y2VlZCBgTWF4UmVzZXJ2ZXNgLjBUb29NYW55SG9sZHMACAT4TnVtYmVyIG9mIGhvbGRzIGV4Y2VlZCBgVmFyaWFudENvdW50T2Y8VDo6UnVudGltZUhvbGRSZWFzb24+YC44VG9vTWFueUZyZWV6ZXMACQSYTnVtYmVyIG9mIGZyZWV6ZXMgZXhjZWVkIGBNYXhGcmVlemVzYC5MSXNzdWFuY2VEZWFjdGl2YXRlZAAKBAEBVGhlIGlzc3VhbmNlIGNhbm5vdCBiZSBtb2RpZmllZCBzaW5jZSBpdCBpcyBhbHJlYWR5IGRlYWN0aXZhdGVkLiREZWx0YVplcm8ACwRkVGhlIGRlbHRhIGNhbm5vdCBiZSB6ZXJvLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC7BCwxAcGFsbGV0X2JhZ3NfbGlzdBBsaXN0EE5vZGUIBFQABEkAABQBCGlkAAEwVDo6QWNjb3VudElkAAEQcHJldtkBAVBPcHRpb248VDo6QWNjb3VudElkPgABEG5leHTZAQFQT3B0aW9uPFQ6OkFjY291bnRJZD4AASRiYWdfdXBwZXIwASBUOjpTY29yZQABFHNjb3JlMAEgVDo6U2NvcmUAAMULDEBwYWxsZXRfYmFnc19saXN0EGxpc3QMQmFnCARUAARJAAAIARBoZWFk2QEBUE9wdGlvbjxUOjpBY2NvdW50SWQ+AAEQdGFpbNkBAVBPcHRpb248VDo6QWNjb3VudElkPgAAyQsAAAIwAM0LDEBwYWxsZXRfYmFnc19saXN0GHBhbGxldBRFcnJvcggEVAAESQABBBBMaXN0BADRCwEkTGlzdEVycm9yAAAEtEEgZXJyb3IgaW4gdGhlIGxpc3QgaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC7RCwxAcGFsbGV0X2JhZ3NfbGlzdBBsaXN0JExpc3RFcnJvcgABECREdXBsaWNhdGUAAAAoTm90SGVhdmllcgABADBOb3RJblNhbWVCYWcAAgAwTm9kZU5vdEZvdW5kAAMAANULCFxwYWxsZXRfbm9taW5hdGlvbl9wb29scyhQb29sTWVtYmVyBARUAAAQARxwb29sX2lkEAEYUG9vbElkAAEYcG9pbnRzGAEwQmFsYW5jZU9mPFQ+AAFwbGFzdF9yZWNvcmRlZF9yZXdhcmRfY291bnRlciEHAUBUOjpSZXdhcmRDb3VudGVyAAE4dW5ib25kaW5nX2VyYXPZCwHgQm91bmRlZEJUcmVlTWFwPEVyYUluZGV4LCBCYWxhbmNlT2Y8VD4sIFQ6Ok1heFVuYm9uZGluZz4AANkLDExib3VuZGVkX2NvbGxlY3Rpb25zRGJvdW5kZWRfYnRyZWVfbWFwPEJvdW5kZWRCVHJlZU1hcAwESwEQBFYBGARTAAAEAN0LAThCVHJlZU1hcDxLLCBWPgAA3QsEIEJUcmVlTWFwCARLARAEVgEYAAQAJQoAAADhCwhccGFsbGV0X25vbWluYXRpb25fcG9vbHM8Qm9uZGVkUG9vbElubmVyBARUAAAUAShjb21taXNzaW9u5QsBNENvbW1pc3Npb248VD4AAThtZW1iZXJfY291bnRlchABDHUzMgABGHBvaW50cxgBMEJhbGFuY2VPZjxUPgABFHJvbGVz8QsBXFBvb2xSb2xlczxUOjpBY2NvdW50SWQ+AAEUc3RhdGWJBAEkUG9vbFN0YXRlAADlCwhccGFsbGV0X25vbWluYXRpb25fcG9vbHMoQ29tbWlzc2lvbgQEVAAAFAEcY3VycmVudKEEAXxPcHRpb248KFBlcmJpbGwsIFQ6OkFjY291bnRJZCk+AAEMbWF46QsBPE9wdGlvbjxQZXJiaWxsPgABLGNoYW5nZV9yYXRl7QsBvE9wdGlvbjxDb21taXNzaW9uQ2hhbmdlUmF0ZTxCbG9ja051bWJlckZvcjxUPj4+AAE0dGhyb3R0bGVfZnJvbT0CAWRPcHRpb248QmxvY2tOdW1iZXJGb3I8VD4+AAFAY2xhaW1fcGVybWlzc2lvbq0EAbxPcHRpb248Q29tbWlzc2lvbkNsYWltUGVybWlzc2lvbjxUOjpBY2NvdW50SWQ+PgAA6QsEGE9wdGlvbgQEVAGUAQgQTm9uZQAAABBTb21lBACUAAABAADtCwQYT3B0aW9uBARUAakEAQgQTm9uZQAAABBTb21lBACpBAAAAQAA8QsIXHBhbGxldF9ub21pbmF0aW9uX3Bvb2xzJFBvb2xSb2xlcwQkQWNjb3VudElkAQAAEAEkZGVwb3NpdG9yAAEkQWNjb3VudElkAAEQcm9vdNkBAURPcHRpb248QWNjb3VudElkPgABJG5vbWluYXRvctkBAURPcHRpb248QWNjb3VudElkPgABHGJvdW5jZXLZAQFET3B0aW9uPEFjY291bnRJZD4AAPULCFxwYWxsZXRfbm9taW5hdGlvbl9wb29scyhSZXdhcmRQb29sBARUAAAUAXBsYXN0X3JlY29yZGVkX3Jld2FyZF9jb3VudGVyIQcBQFQ6OlJld2FyZENvdW50ZXIAAWxsYXN0X3JlY29yZGVkX3RvdGFsX3BheW91dHMYATBCYWxhbmNlT2Y8VD4AAVR0b3RhbF9yZXdhcmRzX2NsYWltZWQYATBCYWxhbmNlT2Y8VD4AAWB0b3RhbF9jb21taXNzaW9uX3BlbmRpbmcYATBCYWxhbmNlT2Y8VD4AAWB0b3RhbF9jb21taXNzaW9uX2NsYWltZWQYATBCYWxhbmNlT2Y8VD4AAPkLCFxwYWxsZXRfbm9taW5hdGlvbl9wb29scyBTdWJQb29scwQEVAAACAEYbm9fZXJh/QsBNFVuYm9uZFBvb2w8VD4AASB3aXRoX2VyYQEMAQEBQm91bmRlZEJUcmVlTWFwPEVyYUluZGV4LCBVbmJvbmRQb29sPFQ+LCBUb3RhbFVuYm9uZGluZ1Bvb2xzPFQ+PgAA/QsIXHBhbGxldF9ub21pbmF0aW9uX3Bvb2xzKFVuYm9uZFBvb2wEBFQAAAgBGHBvaW50cxgBMEJhbGFuY2VPZjxUPgABHGJhbGFuY2UYATBCYWxhbmNlT2Y8VD4AAAEMDExib3VuZGVkX2NvbGxlY3Rpb25zRGJvdW5kZWRfYnRyZWVfbWFwPEJvdW5kZWRCVHJlZU1hcAwESwEQBFYB/QsEUwAABAAFDAE4QlRyZWVNYXA8SywgVj4AAAUMBCBCVHJlZU1hcAgESwEQBFYB/QsABAAJDAAAAAkMAAACDQwADQwAAAQIEP0LABEMDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBCARTAAAEADgBGFZlYzxUPgAAFQwMXHBhbGxldF9ub21pbmF0aW9uX3Bvb2xzGHBhbGxldBRFcnJvcgQEVAABkDBQb29sTm90Rm91bmQAAASIQSAoYm9uZGVkKSBwb29sIGlkIGRvZXMgbm90IGV4aXN0LkhQb29sTWVtYmVyTm90Rm91bmQAAQRsQW4gYWNjb3VudCBpcyBub3QgYSBtZW1iZXIuSFJld2FyZFBvb2xOb3RGb3VuZAACBCEBQSByZXdhcmQgcG9vbCBkb2VzIG5vdCBleGlzdC4gSW4gYWxsIGNhc2VzIHRoaXMgaXMgYSBzeXN0ZW0gbG9naWMgZXJyb3IuQFN1YlBvb2xzTm90Rm91bmQAAwRoQSBzdWIgcG9vbCBkb2VzIG5vdCBleGlzdC5kQWNjb3VudEJlbG9uZ3NUb090aGVyUG9vbAAECE0BQW4gYWNjb3VudCBpcyBhbHJlYWR5IGRlbGVnYXRpbmcgaW4gYW5vdGhlciBwb29sLiBBbiBhY2NvdW50IG1heSBvbmx5IGJlbG9uZyB0byBvbmU8cG9vbCBhdCBhIHRpbWUuOEZ1bGx5VW5ib25kaW5nAAUIPQFUaGUgbWVtYmVyIGlzIGZ1bGx5IHVuYm9uZGVkIChhbmQgdGh1cyBjYW5ub3QgYWNjZXNzIHRoZSBib25kZWQgYW5kIHJld2FyZCBwb29sqGFueW1vcmUgdG8sIGZvciBleGFtcGxlLCBjb2xsZWN0IHJld2FyZHMpLkRNYXhVbmJvbmRpbmdMaW1pdAAGBAkBVGhlIG1lbWJlciBjYW5ub3QgdW5ib25kIGZ1cnRoZXIgY2h1bmtzIGR1ZSB0byByZWFjaGluZyB0aGUgbGltaXQuRENhbm5vdFdpdGhkcmF3QW55AAcETQFOb25lIG9mIHRoZSBmdW5kcyBjYW4gYmUgd2l0aGRyYXduIHlldCBiZWNhdXNlIHRoZSBib25kaW5nIGR1cmF0aW9uIGhhcyBub3QgcGFzc2VkLkRNaW5pbXVtQm9uZE5vdE1ldAAIFCkBVGhlIGFtb3VudCBkb2VzIG5vdCBtZWV0IHRoZSBtaW5pbXVtIGJvbmQgdG8gZWl0aGVyIGpvaW4gb3IgY3JlYXRlIGEgcG9vbC4AVQFUaGUgZGVwb3NpdG9yIGNhbiBuZXZlciB1bmJvbmQgdG8gYSB2YWx1ZSBsZXNzIHRoYW4gYFBhbGxldDo6ZGVwb3NpdG9yX21pbl9ib25kYC4gVGhlXQFjYWxsZXIgZG9lcyBub3QgaGF2ZSBub21pbmF0aW5nIHBlcm1pc3Npb25zIGZvciB0aGUgcG9vbC4gTWVtYmVycyBjYW4gbmV2ZXIgdW5ib25kIHRvIGFodmFsdWUgYmVsb3cgYE1pbkpvaW5Cb25kYC4wT3ZlcmZsb3dSaXNrAAkEIQFUaGUgdHJhbnNhY3Rpb24gY291bGQgbm90IGJlIGV4ZWN1dGVkIGR1ZSB0byBvdmVyZmxvdyByaXNrIGZvciB0aGUgcG9vbC40Tm90RGVzdHJveWluZwAKCF0BQSBwb29sIG11c3QgYmUgaW4gW2BQb29sU3RhdGU6OkRlc3Ryb3lpbmdgXSBpbiBvcmRlciBmb3IgdGhlIGRlcG9zaXRvciB0byB1bmJvbmQgb3IgZm9yuG90aGVyIG1lbWJlcnMgdG8gYmUgcGVybWlzc2lvbmxlc3NseSB1bmJvbmRlZC4wTm90Tm9taW5hdG9yAAsE9FRoZSBjYWxsZXIgZG9lcyBub3QgaGF2ZSBub21pbmF0aW5nIHBlcm1pc3Npb25zIGZvciB0aGUgcG9vbC5UTm90S2lja2VyT3JEZXN0cm95aW5nAAwEPQFFaXRoZXIgYSkgdGhlIGNhbGxlciBjYW5ub3QgbWFrZSBhIHZhbGlkIGtpY2sgb3IgYikgdGhlIHBvb2wgaXMgbm90IGRlc3Ryb3lpbmcuHE5vdE9wZW4ADQRwVGhlIHBvb2wgaXMgbm90IG9wZW4gdG8gam9pbiBNYXhQb29scwAOBIRUaGUgc3lzdGVtIGlzIG1heGVkIG91dCBvbiBwb29scy44TWF4UG9vbE1lbWJlcnMADwScVG9vIG1hbnkgbWVtYmVycyBpbiB0aGUgcG9vbCBvciBzeXN0ZW0uRENhbk5vdENoYW5nZVN0YXRlABAEiFRoZSBwb29scyBzdGF0ZSBjYW5ub3QgYmUgY2hhbmdlZC5URG9lc05vdEhhdmVQZXJtaXNzaW9uABEEuFRoZSBjYWxsZXIgZG9lcyBub3QgaGF2ZSBhZGVxdWF0ZSBwZXJtaXNzaW9ucy5UTWV0YWRhdGFFeGNlZWRzTWF4TGVuABIErE1ldGFkYXRhIGV4Y2VlZHMgW2BDb25maWc6Ok1heE1ldGFkYXRhTGVuYF0kRGVmZW5zaXZlBAAZDAE4RGVmZW5zaXZlRXJyb3IAEwgxAVNvbWUgZXJyb3Igb2NjdXJyZWQgdGhhdCBzaG91bGQgbmV2ZXIgaGFwcGVuLiBUaGlzIHNob3VsZCBiZSByZXBvcnRlZCB0byB0aGUwbWFpbnRhaW5lcnMunFBhcnRpYWxVbmJvbmROb3RBbGxvd2VkUGVybWlzc2lvbmxlc3NseQAUBLxQYXJ0aWFsIHVuYm9uZGluZyBub3cgYWxsb3dlZCBwZXJtaXNzaW9ubGVzc2x5LlxNYXhDb21taXNzaW9uUmVzdHJpY3RlZAAVBB0BVGhlIHBvb2wncyBtYXggY29tbWlzc2lvbiBjYW5ub3QgYmUgc2V0IGhpZ2hlciB0aGFuIHRoZSBleGlzdGluZyB2YWx1ZS5gQ29tbWlzc2lvbkV4Y2VlZHNNYXhpbXVtABYE7FRoZSBzdXBwbGllZCBjb21taXNzaW9uIGV4Y2VlZHMgdGhlIG1heCBhbGxvd2VkIGNvbW1pc3Npb24ueENvbW1pc3Npb25FeGNlZWRzR2xvYmFsTWF4aW11bQAXBOhUaGUgc3VwcGxpZWQgY29tbWlzc2lvbiBleGNlZWRzIGdsb2JhbCBtYXhpbXVtIGNvbW1pc3Npb24uZENvbW1pc3Npb25DaGFuZ2VUaHJvdHRsZWQAGAQJAU5vdCBlbm91Z2ggYmxvY2tzIGhhdmUgc3VycGFzc2VkIHNpbmNlIHRoZSBsYXN0IGNvbW1pc3Npb24gdXBkYXRlLnhDb21taXNzaW9uQ2hhbmdlUmF0ZU5vdEFsbG93ZWQAGQQBAVRoZSBzdWJtaXR0ZWQgY2hhbmdlcyB0byBjb21taXNzaW9uIGNoYW5nZSByYXRlIGFyZSBub3QgYWxsb3dlZC5MTm9QZW5kaW5nQ29tbWlzc2lvbgAaBKBUaGVyZSBpcyBubyBwZW5kaW5nIGNvbW1pc3Npb24gdG8gY2xhaW0uWE5vQ29tbWlzc2lvbkN1cnJlbnRTZXQAGwSMTm8gY29tbWlzc2lvbiBjdXJyZW50IGhhcyBiZWVuIHNldC4sUG9vbElkSW5Vc2UAHARkUG9vbCBpZCBjdXJyZW50bHkgaW4gdXNlLjRJbnZhbGlkUG9vbElkAB0EnFBvb2wgaWQgcHJvdmlkZWQgaXMgbm90IGNvcnJlY3QvdXNhYmxlLkxCb25kRXh0cmFSZXN0cmljdGVkAB4E/EJvbmRpbmcgZXh0cmEgaXMgcmVzdHJpY3RlZCB0byB0aGUgZXhhY3QgcGVuZGluZyByZXdhcmQgYW1vdW50LjxOb3RoaW5nVG9BZGp1c3QAHwSwTm8gaW1iYWxhbmNlIGluIHRoZSBFRCBkZXBvc2l0IGZvciB0aGUgcG9vbC44Tm90aGluZ1RvU2xhc2gAIATMTm8gc2xhc2ggcGVuZGluZyB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIHRoZSBtZW1iZXIuPEFscmVhZHlNaWdyYXRlZAAhBBUBVGhlIHBvb2wgb3IgbWVtYmVyIGRlbGVnYXRpb24gaGFzIGFscmVhZHkgbWlncmF0ZWQgdG8gZGVsZWdhdGUgc3Rha2UuLE5vdE1pZ3JhdGVkACIEFQFUaGUgcG9vbCBvciBtZW1iZXIgZGVsZWdhdGlvbiBoYXMgbm90IG1pZ3JhdGVkIHlldCB0byBkZWxlZ2F0ZSBzdGFrZS4wTm90U3VwcG9ydGVkACME8FRoaXMgY2FsbCBpcyBub3QgYWxsb3dlZCBpbiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgcGFsbGV0LgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC4ZDAxccGFsbGV0X25vbWluYXRpb25fcG9vbHMYcGFsbGV0OERlZmVuc2l2ZUVycm9yAAEcaE5vdEVub3VnaFNwYWNlSW5VbmJvbmRQb29sAAAAMFBvb2xOb3RGb3VuZAABAEhSZXdhcmRQb29sTm90Rm91bmQAAgBAU3ViUG9vbHNOb3RGb3VuZAADAHBCb25kZWRTdGFzaEtpbGxlZFByZW1hdHVyZWx5AAQAVERlbGVnYXRpb25VbnN1cHBvcnRlZAAFADxTbGFzaE5vdEFwcGxpZWQABgAAHQwMTHBhbGxldF9mYXN0X3Vuc3Rha2UUdHlwZXM4VW5zdGFrZVJlcXVlc3QEBFQAAAgBHHN0YXNoZXMhDAHYQm91bmRlZFZlYzwoVDo6QWNjb3VudElkLCBCYWxhbmNlT2Y8VD4pLCBUOjpCYXRjaFNpemU+AAEcY2hlY2tlZCUMAZBCb3VuZGVkVmVjPEVyYUluZGV4LCBNYXhDaGVja2luZzxUPj4AACEMDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBcQQEUwAABABtBAEYVmVjPFQ+AAAlDAxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUARAEUwAABADBAQEYVmVjPFQ+AAApDAxMcGFsbGV0X2Zhc3RfdW5zdGFrZRhwYWxsZXQURXJyb3IEBFQAARg0Tm90Q29udHJvbGxlcgAADLhUaGUgcHJvdmlkZWQgQ29udHJvbGxlciBhY2NvdW50IHdhcyBub3QgZm91bmQuAMBUaGlzIG1lYW5zIHRoYXQgdGhlIGdpdmVuIGFjY291bnQgaXMgbm90IGJvbmRlZC40QWxyZWFkeVF1ZXVlZAABBKxUaGUgYm9uZGVkIGFjY291bnQgaGFzIGFscmVhZHkgYmVlbiBxdWV1ZWQuOE5vdEZ1bGx5Qm9uZGVkAAIEvFRoZSBib25kZWQgYWNjb3VudCBoYXMgYWN0aXZlIHVubG9ja2luZyBjaHVua3MuJE5vdFF1ZXVlZAADBLRUaGUgcHJvdmlkZWQgdW4tc3Rha2VyIGlzIG5vdCBpbiB0aGUgYFF1ZXVlYC4sQWxyZWFkeUhlYWQABAQFAVRoZSBwcm92aWRlZCB1bi1zdGFrZXIgaXMgYWxyZWFkeSBpbiBIZWFkLCBhbmQgY2Fubm90IGRlcmVnaXN0ZXIuOENhbGxOb3RBbGxvd2VkAAUEHQFUaGUgY2FsbCBpcyBub3QgYWxsb3dlZCBhdCB0aGlzIHBvaW50IGJlY2F1c2UgdGhlIHBhbGxldCBpcyBub3QgYWN0aXZlLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC4tDAxscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zNGNvbmZpZ3VyYXRpb25ESG9zdENvbmZpZ3VyYXRpb24ELEJsb2NrTnVtYmVyARAAjAE0bWF4X2NvZGVfc2l6ZRABDHUzMgABSG1heF9oZWFkX2RhdGFfc2l6ZRABDHUzMgABWG1heF91cHdhcmRfcXVldWVfY291bnQQAQx1MzIAAVRtYXhfdXB3YXJkX3F1ZXVlX3NpemUQAQx1MzIAAVxtYXhfdXB3YXJkX21lc3NhZ2Vfc2l6ZRABDHUzMgABkG1heF91cHdhcmRfbWVzc2FnZV9udW1fcGVyX2NhbmRpZGF0ZRABDHUzMgABiGhybXBfbWF4X21lc3NhZ2VfbnVtX3Blcl9jYW5kaWRhdGUQAQx1MzIAAWx2YWxpZGF0aW9uX3VwZ3JhZGVfY29vbGRvd24QASxCbG9ja051bWJlcgABYHZhbGlkYXRpb25fdXBncmFkZV9kZWxheRABLEJsb2NrTnVtYmVyAAFQYXN5bmNfYmFja2luZ19wYXJhbXO9BAFIQXN5bmNCYWNraW5nUGFyYW1zAAEwbWF4X3Bvdl9zaXplEAEMdTMyAAFkbWF4X2Rvd253YXJkX21lc3NhZ2Vfc2l6ZRABDHUzMgABkGhybXBfbWF4X3BhcmFjaGFpbl9vdXRib3VuZF9jaGFubmVscxABDHUzMgABTGhybXBfc2VuZGVyX2RlcG9zaXQYARxCYWxhbmNlAAFYaHJtcF9yZWNpcGllbnRfZGVwb3NpdBgBHEJhbGFuY2UAAWRocm1wX2NoYW5uZWxfbWF4X2NhcGFjaXR5EAEMdTMyAAFsaHJtcF9jaGFubmVsX21heF90b3RhbF9zaXplEAEMdTMyAAGMaHJtcF9tYXhfcGFyYWNoYWluX2luYm91bmRfY2hhbm5lbHMQAQx1MzIAAXRocm1wX2NoYW5uZWxfbWF4X21lc3NhZ2Vfc2l6ZRABDHUzMgABPGV4ZWN1dG9yX3BhcmFtc8EEAThFeGVjdXRvclBhcmFtcwABVGNvZGVfcmV0ZW50aW9uX3BlcmlvZBABLEJsb2NrTnVtYmVyAAE4bWF4X3ZhbGlkYXRvcnM9AgEsT3B0aW9uPHUzMj4AAThkaXNwdXRlX3BlcmlvZBABMFNlc3Npb25JbmRleAABpGRpc3B1dGVfcG9zdF9jb25jbHVzaW9uX2FjY2VwdGFuY2VfcGVyaW9kEAEsQmxvY2tOdW1iZXIAATRub19zaG93X3Nsb3RzEAEMdTMyAAFAbl9kZWxheV90cmFuY2hlcxABDHUzMgABaHplcm90aF9kZWxheV90cmFuY2hlX3dpZHRoEAEMdTMyAAFAbmVlZGVkX2FwcHJvdmFscxABDHUzMgABYHJlbGF5X3ZyZl9tb2R1bG9fc2FtcGxlcxABDHUzMgABOHB2Zl92b3RpbmdfdHRsEAEwU2Vzc2lvbkluZGV4AAGAbWluaW11bV92YWxpZGF0aW9uX3VwZ3JhZGVfZGVsYXkQASxCbG9ja051bWJlcgABVG1pbmltdW1fYmFja2luZ192b3RlcxABDHUzMgABNG5vZGVfZmVhdHVyZXP5BAEwTm9kZUZlYXR1cmVzAAFYYXBwcm92YWxfdm90aW5nX3BhcmFtc9UEAVBBcHByb3ZhbFZvdGluZ1BhcmFtcwABQHNjaGVkdWxlcl9wYXJhbXPZBAFwU2NoZWR1bGVyUGFyYW1zPEJsb2NrTnVtYmVyPgAAMQwAAAI1DAA1DAAABAgQLQwAOQwQbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWluczRjb25maWd1cmF0aW9uGHBhbGxldBRFcnJvcgQEVAABBDxJbnZhbGlkTmV3VmFsdWUAAATcVGhlIG5ldyB2YWx1ZSBmb3IgYSBjb25maWd1cmF0aW9uIHBhcmFtZXRlciBpcyBpbnZhbGlkLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC49DAAAAgEFAEEMAAAC+QEARQwMbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucxhzaGFyZWRoQWxsb3dlZFJlbGF5UGFyZW50c1RyYWNrZXIIEEhhc2gBNCxCbG9ja051bWJlcgEQAAgBGGJ1ZmZlckkMAVhWZWNEZXF1ZTwoSGFzaCwgSGFzaCk+AAE0bGF0ZXN0X251bWJlchABLEJsb2NrTnVtYmVyAABJDAAAAk0MAE0MAAAECDQ0AFEMAAACVQwAVQwMbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucyRpbmNsdXNpb25wQ2FuZGlkYXRlUGVuZGluZ0F2YWlsYWJpbGl0eQgESAE0BE4BEAAkARBjb3Jl9QcBJENvcmVJbmRleAABEGhhc2hVBQE0Q2FuZGlkYXRlSGFzaAABKGRlc2NyaXB0b3IVBQFYQ2FuZGlkYXRlRGVzY3JpcHRvcjxIPgABLGNvbW1pdG1lbnRzJQUBUENhbmRpZGF0ZUNvbW1pdG1lbnRzAAFIYXZhaWxhYmlsaXR5X3ZvdGVz+QQBYEJpdFZlYzx1OCwgQml0T3JkZXJMc2IwPgABHGJhY2tlcnP5BAFgQml0VmVjPHU4LCBCaXRPcmRlckxzYjA+AAFMcmVsYXlfcGFyZW50X251bWJlchABBE4AAUBiYWNrZWRfaW5fbnVtYmVyEAEETgABNGJhY2tpbmdfZ3JvdXD5BwEoR3JvdXBJbmRleAAAWQwQbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucyRpbmNsdXNpb24YcGFsbGV0FEVycm9yBARUAAFIZFZhbGlkYXRvckluZGV4T3V0T2ZCb3VuZHMAAAR4VmFsaWRhdG9yIGluZGV4IG91dCBvZiBib3VuZHMuUFVuc2NoZWR1bGVkQ2FuZGlkYXRlAAEErENhbmRpZGF0ZSBzdWJtaXR0ZWQgYnV0IHBhcmEgbm90IHNjaGVkdWxlZC5ASGVhZERhdGFUb29MYXJnZQACBKRIZWFkIGRhdGEgZXhjZWVkcyB0aGUgY29uZmlndXJlZCBtYXhpbXVtLlBQcmVtYXR1cmVDb2RlVXBncmFkZQADBGRDb2RlIHVwZ3JhZGUgcHJlbWF0dXJlbHkuPE5ld0NvZGVUb29MYXJnZQAEBGBPdXRwdXQgY29kZSBpcyB0b28gbGFyZ2VURGlzYWxsb3dlZFJlbGF5UGFyZW50AAUI7FRoZSBjYW5kaWRhdGUncyByZWxheS1wYXJlbnQgd2FzIG5vdCBhbGxvd2VkLiBFaXRoZXIgaXQgd2FzJQFub3QgcmVjZW50IGVub3VnaCBvciBpdCBkaWRuJ3QgYWR2YW5jZSBiYXNlZCBvbiB0aGUgbGFzdCBwYXJhY2hhaW4gYmxvY2suREludmFsaWRBc3NpZ25tZW50AAYIFQFGYWlsZWQgdG8gY29tcHV0ZSBncm91cCBpbmRleCBmb3IgdGhlIGNvcmU6IGVpdGhlciBpdCdzIG91dCBvZiBib3VuZHPob3IgdGhlIHJlbGF5IHBhcmVudCBkb2Vzbid0IGJlbG9uZyB0byB0aGUgY3VycmVudCBzZXNzaW9uLkRJbnZhbGlkR3JvdXBJbmRleAAHBJxJbnZhbGlkIGdyb3VwIGluZGV4IGluIGNvcmUgYXNzaWdubWVudC5MSW5zdWZmaWNpZW50QmFja2luZwAIBJBJbnN1ZmZpY2llbnQgKG5vbi1tYWpvcml0eSkgYmFja2luZy44SW52YWxpZEJhY2tpbmcACQTkSW52YWxpZCAoYmFkIHNpZ25hdHVyZSwgdW5rbm93biB2YWxpZGF0b3IsIGV0Yy4pIGJhY2tpbmcuRE5vdENvbGxhdG9yU2lnbmVkAAoEaENvbGxhdG9yIGRpZCBub3Qgc2lnbiBQb1YuaFZhbGlkYXRpb25EYXRhSGFzaE1pc21hdGNoAAsExFRoZSB2YWxpZGF0aW9uIGRhdGEgaGFzaCBkb2VzIG5vdCBtYXRjaCBleHBlY3RlZC6ASW5jb3JyZWN0RG93bndhcmRNZXNzYWdlSGFuZGxpbmcADATYVGhlIGRvd253YXJkIG1lc3NhZ2UgcXVldWUgaXMgbm90IHByb2Nlc3NlZCBjb3JyZWN0bHkuVEludmFsaWRVcHdhcmRNZXNzYWdlcwANBB0BQXQgbGVhc3Qgb25lIHVwd2FyZCBtZXNzYWdlIHNlbnQgZG9lcyBub3QgcGFzcyB0aGUgYWNjZXB0YW5jZSBjcml0ZXJpYS5gSHJtcFdhdGVybWFya01pc2hhbmRsaW5nAA4EEQFUaGUgY2FuZGlkYXRlIGRpZG4ndCBmb2xsb3cgdGhlIHJ1bGVzIG9mIEhSTVAgd2F0ZXJtYXJrIGFkdmFuY2VtZW50LkxJbnZhbGlkT3V0Ym91bmRIcm1wAA8E1FRoZSBIUk1QIG1lc3NhZ2VzIHNlbnQgYnkgdGhlIGNhbmRpZGF0ZSBpcyBub3QgdmFsaWQuZEludmFsaWRWYWxpZGF0aW9uQ29kZUhhc2gAEATcVGhlIHZhbGlkYXRpb24gY29kZSBoYXNoIG9mIHRoZSBjYW5kaWRhdGUgaXMgbm90IHZhbGlkLkBQYXJhSGVhZE1pc21hdGNoABEIVQFUaGUgYHBhcmFfaGVhZGAgaGFzaCBpbiB0aGUgY2FuZGlkYXRlIGRlc2NyaXB0b3IgZG9lc24ndCBtYXRjaCB0aGUgaGFzaCBvZiB0aGUgYWN0dWFsdHBhcmEgaGVhZCBpbiB0aGUgY29tbWl0bWVudHMuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0Ll0MDExwb2xrYWRvdF9wcmltaXRpdmVzCHY3TFNjcmFwZWRPbkNoYWluVm90ZXMEBEgBNAAMARxzZXNzaW9uEAEwU2Vzc2lvbkluZGV4AAGAYmFja2luZ192YWxpZGF0b3JzX3Blcl9jYW5kaWRhdGVhDAEdAVZlYzwoQ2FuZGlkYXRlUmVjZWlwdDxIPiwgVmVjPChWYWxpZGF0b3JJbmRleCwgVmFsaWRpdHlBdHRlc3RhdGlvbik+KQo+AAEgZGlzcHV0ZXNNBQFgTXVsdGlEaXNwdXRlU3RhdGVtZW50U2V0AABhDAAAAmUMAGUMAAAECPEHaQwAaQwAAAJtDABtDAAABAgBBUkFAHEMEGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnM4cGFyYXNfaW5oZXJlbnQYcGFsbGV0FEVycm9yBARUAAEUZFRvb01hbnlJbmNsdXNpb25JbmhlcmVudHMAAATMSW5jbHVzaW9uIGluaGVyZW50IGNhbGxlZCBtb3JlIHRoYW4gb25jZSBwZXIgYmxvY2suTEludmFsaWRQYXJlbnRIZWFkZXIAAQhVAVRoZSBoYXNoIG9mIHRoZSBzdWJtaXR0ZWQgcGFyZW50IGhlYWRlciBkb2Vzbid0IGNvcnJlc3BvbmQgdG8gdGhlIHNhdmVkIGJsb2NrIGhhc2ggb2YsdGhlIHBhcmVudC5ISW5oZXJlbnRPdmVyd2VpZ2h0AAIECQFUaGUgZGF0YSBnaXZlbiB0byB0aGUgaW5oZXJlbnQgd2lsbCByZXN1bHQgaW4gYW4gb3ZlcndlaWdodCBibG9jay6EQ2FuZGlkYXRlc0ZpbHRlcmVkRHVyaW5nRXhlY3V0aW9uAAMITQFBIGNhbmRpZGF0ZSB3YXMgZmlsdGVyZWQgZHVyaW5nIGluaGVyZW50IGV4ZWN1dGlvbi4gVGhpcyBzaG91bGQgaGF2ZSBvbmx5IGJlZW4gZG9uZUBkdXJpbmcgY3JlYXRpb24uUFVuc2NoZWR1bGVkQ2FuZGlkYXRlAAQEdFRvbyBtYW55IGNhbmRpZGF0ZXMgc3VwcGxpZWQuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LnUMAAACPQwAeQwAAAJ9DAB9DBBscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zJHNjaGVkdWxlchhwYWxsZXQwQ29yZU9jY3VwaWVkBAROARABCBBGcmVlAAAAFFBhcmFzBACBDAE0UGFyYXNFbnRyeTxOPgABAACBDBBscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zJHNjaGVkdWxlchhwYWxsZXQoUGFyYXNFbnRyeQQETgEQAAwBKGFzc2lnbm1lbnSFDAEoQXNzaWdubWVudAABVGF2YWlsYWJpbGl0eV90aW1lb3V0cxABDHUzMgABDHR0bBABBE4AAIUMEGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMkc2NoZWR1bGVyGGNvbW1vbihBc3NpZ25tZW50AAEIEFBvb2wIARxwYXJhX2lkaQIBGFBhcmFJZAABKGNvcmVfaW5kZXj1BwEkQ29yZUluZGV4AAAAEEJ1bGsEAGkCARhQYXJhSWQAAQAAiQwEIEJUcmVlTWFwCARLAfUHBFYBjQwABACRDAAAAI0MAAACgQwAkQwAAAKVDACVDAAABAj1B40MAJkMDGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMUcGFyYXNcUHZmQ2hlY2tBY3RpdmVWb3RlU3RhdGUELEJsb2NrTnVtYmVyARAAFAEwdm90ZXNfYWNjZXB0+QQBYEJpdFZlYzx1OCwgQml0T3JkZXJMc2IwPgABMHZvdGVzX3JlamVjdPkEAWBCaXRWZWM8dTgsIEJpdE9yZGVyTHNiMD4AAQxhZ2UQATBTZXNzaW9uSW5kZXgAAShjcmVhdGVkX2F0EAEsQmxvY2tOdW1iZXIAARhjYXVzZXOdDAF8VmVjPFB2ZkNoZWNrQ2F1c2U8QmxvY2tOdW1iZXI+PgAAnQwAAAKhDAChDAxscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zFHBhcmFzNFB2ZkNoZWNrQ2F1c2UELEJsb2NrTnVtYmVyARABCChPbmJvYXJkaW5nBABpAgEYUGFyYUlkAAAAHFVwZ3JhZGUMAQhpZGkCARhQYXJhSWQAASxpbmNsdWRlZF9hdBABLEJsb2NrTnVtYmVyAAFAdXBncmFkZV9zdHJhdGVneaUMATxVcGdyYWRlU3RyYXRlZ3kAAQAApQwMbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucxRwYXJhczxVcGdyYWRlU3RyYXRlZ3kAAQhAU2V0R29BaGVhZFNpZ25hbAAAAFBBcHBseUF0RXhwZWN0ZWRCbG9jawABAACpDAAAAiEFAK0MAAACaQIAsQwMbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucxRwYXJhczRQYXJhTGlmZWN5Y2xlAAEcKE9uYm9hcmRpbmcAAAAoUGFyYXRocmVhZAABACRQYXJhY2hhaW4AAgBMVXBncmFkaW5nUGFyYXRocmVhZAADAFBEb3duZ3JhZGluZ1BhcmFjaGFpbgAEAFRPZmZib2FyZGluZ1BhcmF0aHJlYWQABQBQT2ZmYm9hcmRpbmdQYXJhY2hhaW4ABgAAtQwAAAQIaQIQALkMDGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMUcGFyYXNAUGFyYVBhc3RDb2RlTWV0YQQETgEQAAgBNHVwZ3JhZGVfdGltZXO9DAFgVmVjPFJlcGxhY2VtZW50VGltZXM8Tj4+AAEsbGFzdF9wcnVuZWQ9AgEkT3B0aW9uPE4+AAC9DAAAAsEMAMEMDGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMUcGFyYXNAUmVwbGFjZW1lbnRUaW1lcwQETgEQAAgBLGV4cGVjdGVkX2F0EAEETgABMGFjdGl2YXRlZF9hdBABBE4AAMUMAAACtQwAyQwMTHBvbGthZG90X3ByaW1pdGl2ZXMIdjc4VXBncmFkZUdvQWhlYWQAAQgUQWJvcnQAAAAcR29BaGVhZAABAADNDAxMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2N0hVcGdyYWRlUmVzdHJpY3Rpb24AAQQcUHJlc2VudAAAAADRDAxscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zFHBhcmFzPFBhcmFHZW5lc2lzQXJncwAADAEwZ2VuZXNpc19oZWFkQQUBIEhlYWREYXRhAAE8dmFsaWRhdGlvbl9jb2RlPQUBOFZhbGlkYXRpb25Db2RlAAEkcGFyYV9raW5kIAEgUGFyYUtpbmQAANUMEGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMUcGFyYXMYcGFsbGV0FEVycm9yBARUAAE0NE5vdFJlZ2lzdGVyZWQAAASUUGFyYSBpcyBub3QgcmVnaXN0ZXJlZCBpbiBvdXIgc3lzdGVtLjRDYW5ub3RPbmJvYXJkAAEEFQFQYXJhIGNhbm5vdCBiZSBvbmJvYXJkZWQgYmVjYXVzZSBpdCBpcyBhbHJlYWR5IHRyYWNrZWQgYnkgb3VyIHN5c3RlbS44Q2Fubm90T2ZmYm9hcmQAAgScUGFyYSBjYW5ub3QgYmUgb2ZmYm9hcmRlZCBhdCB0aGlzIHRpbWUuNENhbm5vdFVwZ3JhZGUAAwTUUGFyYSBjYW5ub3QgYmUgdXBncmFkZWQgdG8gYSBsZWFzZSBob2xkaW5nIHBhcmFjaGFpbi48Q2Fubm90RG93bmdyYWRlAAQE0FBhcmEgY2Fubm90IGJlIGRvd25ncmFkZWQgdG8gYW4gb24tZGVtYW5kIHBhcmFjaGFpbi5YUHZmQ2hlY2tTdGF0ZW1lbnRTdGFsZQAFBLBUaGUgc3RhdGVtZW50IGZvciBQVkYgcHJlLWNoZWNraW5nIGlzIHN0YWxlLlxQdmZDaGVja1N0YXRlbWVudEZ1dHVyZQAGBOxUaGUgc3RhdGVtZW50IGZvciBQVkYgcHJlLWNoZWNraW5nIGlzIGZvciBhIGZ1dHVyZSBzZXNzaW9uLoRQdmZDaGVja1ZhbGlkYXRvckluZGV4T3V0T2ZCb3VuZHMABwSkQ2xhaW1lZCB2YWxpZGF0b3IgaW5kZXggaXMgb3V0IG9mIGJvdW5kcy5gUHZmQ2hlY2tJbnZhbGlkU2lnbmF0dXJlAAgEyFRoZSBzaWduYXR1cmUgZm9yIHRoZSBQVkYgcHJlLWNoZWNraW5nIGlzIGludmFsaWQuSFB2ZkNoZWNrRG91YmxlVm90ZQAJBLBUaGUgZ2l2ZW4gdmFsaWRhdG9yIGFscmVhZHkgaGFzIGNhc3QgYSB2b3RlLlhQdmZDaGVja1N1YmplY3RJbnZhbGlkAAoE9FRoZSBnaXZlbiBQVkYgZG9lcyBub3QgZXhpc3QgYXQgdGhlIG1vbWVudCBvZiBwcm9jZXNzIGEgdm90ZS5EQ2Fubm90VXBncmFkZUNvZGUACwTMUGFyYWNoYWluIGNhbm5vdCBjdXJyZW50bHkgc2NoZWR1bGUgYSBjb2RlIHVwZ3JhZGUuLEludmFsaWRDb2RlAAwEdEludmFsaWQgdmFsaWRhdGlvbiBjb2RlIHNpemUuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LtkMAAAC3QwA3QwMbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucyxpbml0aWFsaXplclRCdWZmZXJlZFNlc3Npb25DaGFuZ2UAAAwBKHZhbGlkYXRvcnNBDAFAVmVjPFZhbGlkYXRvcklkPgABGHF1ZXVlZEEMAUBWZWM8VmFsaWRhdG9ySWQ+AAE0c2Vzc2lvbl9pbmRleBABMFNlc3Npb25JbmRleAAA4QwAAALlDADlDAhgcG9sa2Fkb3RfY29yZV9wcmltaXRpdmVzWEluYm91bmREb3dud2FyZE1lc3NhZ2UELEJsb2NrTnVtYmVyARAACAEcc2VudF9hdBABLEJsb2NrTnVtYmVyAAEMbXNnOAE8RG93bndhcmRNZXNzYWdlAADpDAxscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zEGhybXBYSHJtcE9wZW5DaGFubmVsUmVxdWVzdAAAGAEkY29uZmlybWVkIAEQYm9vbAABEF9hZ2UQATBTZXNzaW9uSW5kZXgAAThzZW5kZXJfZGVwb3NpdBgBHEJhbGFuY2UAAUBtYXhfbWVzc2FnZV9zaXplEAEMdTMyAAEwbWF4X2NhcGFjaXR5EAEMdTMyAAE4bWF4X3RvdGFsX3NpemUQAQx1MzIAAO0MAAACgQUA8QwMbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucxBocm1wLEhybXBDaGFubmVsAAAgATBtYXhfY2FwYWNpdHkQAQx1MzIAAThtYXhfdG90YWxfc2l6ZRABDHUzMgABQG1heF9tZXNzYWdlX3NpemUQAQx1MzIAASRtc2dfY291bnQQAQx1MzIAASh0b3RhbF9zaXplEAEMdTMyAAEgbXFjX2hlYWR5AgEwT3B0aW9uPEhhc2g+AAE4c2VuZGVyX2RlcG9zaXQYARxCYWxhbmNlAAFEcmVjaXBpZW50X2RlcG9zaXQYARxCYWxhbmNlAAD1DAAAAvkMAPkMCGBwb2xrYWRvdF9jb3JlX3ByaW1pdGl2ZXNISW5ib3VuZEhybXBNZXNzYWdlBCxCbG9ja051bWJlcgEQAAgBHHNlbnRfYXQQASxCbG9ja051bWJlcgABEGRhdGE4AVBzcF9zdGQ6OnZlYzo6VmVjPHU4PgAA/QwAAAIBDQABDQAABAgQrQwABQ0QbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucxBocm1wGHBhbGxldBRFcnJvcgQEVAABUFRPcGVuSHJtcENoYW5uZWxUb1NlbGYAAATEVGhlIHNlbmRlciB0cmllZCB0byBvcGVuIGEgY2hhbm5lbCB0byB0aGVtc2VsdmVzLnxPcGVuSHJtcENoYW5uZWxJbnZhbGlkUmVjaXBpZW50AAEEiFRoZSByZWNpcGllbnQgaXMgbm90IGEgdmFsaWQgcGFyYS5sT3BlbkhybXBDaGFubmVsWmVyb0NhcGFjaXR5AAIEfFRoZSByZXF1ZXN0ZWQgY2FwYWNpdHkgaXMgemVyby6MT3BlbkhybXBDaGFubmVsQ2FwYWNpdHlFeGNlZWRzTGltaXQAAwTAVGhlIHJlcXVlc3RlZCBjYXBhY2l0eSBleGNlZWRzIHRoZSBnbG9iYWwgbGltaXQueE9wZW5Icm1wQ2hhbm5lbFplcm9NZXNzYWdlU2l6ZQAEBKBUaGUgcmVxdWVzdGVkIG1heGltdW0gbWVzc2FnZSBzaXplIGlzIDAumE9wZW5Icm1wQ2hhbm5lbE1lc3NhZ2VTaXplRXhjZWVkc0xpbWl0AAUEKQFUaGUgb3BlbiByZXF1ZXN0IHJlcXVlc3RlZCB0aGUgbWVzc2FnZSBzaXplIHRoYXQgZXhjZWVkcyB0aGUgZ2xvYmFsIGxpbWl0LnBPcGVuSHJtcENoYW5uZWxBbHJlYWR5RXhpc3RzAAYEaFRoZSBjaGFubmVsIGFscmVhZHkgZXhpc3RzfE9wZW5Icm1wQ2hhbm5lbEFscmVhZHlSZXF1ZXN0ZWQABwTQVGhlcmUgaXMgYWxyZWFkeSBhIHJlcXVlc3QgdG8gb3BlbiB0aGUgc2FtZSBjaGFubmVsLnBPcGVuSHJtcENoYW5uZWxMaW1pdEV4Y2VlZGVkAAgEHQFUaGUgc2VuZGVyIGFscmVhZHkgaGFzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBhbGxvd2VkIG91dGJvdW5kIGNoYW5uZWxzLnBBY2NlcHRIcm1wQ2hhbm5lbERvZXNudEV4aXN0AAkE4FRoZSBjaGFubmVsIGZyb20gdGhlIHNlbmRlciB0byB0aGUgb3JpZ2luIGRvZXNuJ3QgZXhpc3QuhEFjY2VwdEhybXBDaGFubmVsQWxyZWFkeUNvbmZpcm1lZAAKBIRUaGUgY2hhbm5lbCBpcyBhbHJlYWR5IGNvbmZpcm1lZC54QWNjZXB0SHJtcENoYW5uZWxMaW1pdEV4Y2VlZGVkAAsEJQFUaGUgcmVjaXBpZW50IGFscmVhZHkgaGFzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBhbGxvd2VkIGluYm91bmQgY2hhbm5lbHMucENsb3NlSHJtcENoYW5uZWxVbmF1dGhvcml6ZWQADARVAVRoZSBvcmlnaW4gdHJpZXMgdG8gY2xvc2UgYSBjaGFubmVsIHdoZXJlIGl0IGlzIG5laXRoZXIgdGhlIHNlbmRlciBub3IgdGhlIHJlY2lwaWVudC5sQ2xvc2VIcm1wQ2hhbm5lbERvZXNudEV4aXN0AA0EnFRoZSBjaGFubmVsIHRvIGJlIGNsb3NlZCBkb2Vzbid0IGV4aXN0LnxDbG9zZUhybXBDaGFubmVsQWxyZWFkeVVuZGVyd2F5AA4EvFRoZSBjaGFubmVsIGNsb3NlIHJlcXVlc3QgaXMgYWxyZWFkeSByZXF1ZXN0ZWQuhENhbmNlbEhybXBPcGVuQ2hhbm5lbFVuYXV0aG9yaXplZAAPBF0BQ2FuY2VsaW5nIGlzIHJlcXVlc3RlZCBieSBuZWl0aGVyIHRoZSBzZW5kZXIgbm9yIHJlY2lwaWVudCBvZiB0aGUgb3BlbiBjaGFubmVsIHJlcXVlc3QuaE9wZW5Icm1wQ2hhbm5lbERvZXNudEV4aXN0ABAEfFRoZSBvcGVuIHJlcXVlc3QgZG9lc24ndCBleGlzdC58T3BlbkhybXBDaGFubmVsQWxyZWFkeUNvbmZpcm1lZAARBC0BQ2Fubm90IGNhbmNlbCBhbiBIUk1QIG9wZW4gY2hhbm5lbCByZXF1ZXN0IGJlY2F1c2UgaXQgaXMgYWxyZWFkeSBjb25maXJtZWQuMFdyb25nV2l0bmVzcwASBIxUaGUgcHJvdmlkZWQgd2l0bmVzcyBkYXRhIGlzIHdyb25nLnBDaGFubmVsQ3JlYXRpb25Ob3RBdXRob3JpemVkABME6FRoZSBjaGFubmVsIGJldHdlZW4gdGhlc2UgdHdvIGNoYWlucyBjYW5ub3QgYmUgYXV0aG9yaXplZC4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQuCQ0AAAL9AQANDQxMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2NyxTZXNzaW9uSW5mbwAANAFgYWN0aXZlX3ZhbGlkYXRvcl9pbmRpY2VzPQwBTFZlYzxWYWxpZGF0b3JJbmRleD4AASxyYW5kb21fc2VlZAQBIFt1ODsgMzJdAAE4ZGlzcHV0ZV9wZXJpb2QQATBTZXNzaW9uSW5kZXgAASh2YWxpZGF0b3JzEQ0BnEluZGV4ZWRWZWM8VmFsaWRhdG9ySW5kZXgsIFZhbGlkYXRvcklkPgABOGRpc2NvdmVyeV9rZXlzqQkBZFZlYzxBdXRob3JpdHlEaXNjb3ZlcnlJZD4AATxhc3NpZ25tZW50X2tleXMJDQFEVmVjPEFzc2lnbm1lbnRJZD4AAUB2YWxpZGF0b3JfZ3JvdXBzFQ0BrEluZGV4ZWRWZWM8R3JvdXBJbmRleCwgVmVjPFZhbGlkYXRvckluZGV4Pj4AARxuX2NvcmVzEAEMdTMyAAFoemVyb3RoX2RlbGF5X3RyYW5jaGVfd2lkdGgQAQx1MzIAAWByZWxheV92cmZfbW9kdWxvX3NhbXBsZXMQAQx1MzIAAUBuX2RlbGF5X3RyYW5jaGVzEAEMdTMyAAE0bm9fc2hvd19zbG90cxABDHUzMgABQG5lZWRlZF9hcHByb3ZhbHMQAQx1MzIAABENDExwb2xrYWRvdF9wcmltaXRpdmVzCHY3KEluZGV4ZWRWZWMIBEsBAQUEVgH5AQAEAEEMARhWZWM8Vj4AABUNDExwb2xrYWRvdF9wcmltaXRpdmVzCHY3KEluZGV4ZWRWZWMIBEsB+QcEVgE9DAAEAHUMARhWZWM8Vj4AABkNAAAECBBVBQAdDQxMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2NzBEaXNwdXRlU3RhdGUEBE4BEAAQATh2YWxpZGF0b3JzX2ZvcvkEAXxCaXRWZWM8dTgsIGJpdHZlYzo6b3JkZXI6OkxzYjA+AAFIdmFsaWRhdG9yc19hZ2FpbnN0+QQBfEJpdFZlYzx1OCwgYml0dmVjOjpvcmRlcjo6THNiMD4AARRzdGFydBABBE4AATBjb25jbHVkZWRfYXQ9AgEkT3B0aW9uPE4+AAAhDQQgQlRyZWVTZXQEBFQBAQUABAA9DAAAACUNEGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMgZGlzcHV0ZXMYcGFsbGV0FEVycm9yBARUAAEkdER1cGxpY2F0ZURpc3B1dGVTdGF0ZW1lbnRTZXRzAAAEqER1cGxpY2F0ZSBkaXNwdXRlIHN0YXRlbWVudCBzZXRzIHByb3ZpZGVkLlxBbmNpZW50RGlzcHV0ZVN0YXRlbWVudAABBIxBbmNpZW50IGRpc3B1dGUgc3RhdGVtZW50IHByb3ZpZGVkLmRWYWxpZGF0b3JJbmRleE91dE9mQm91bmRzAAIE6FZhbGlkYXRvciBpbmRleCBvbiBzdGF0ZW1lbnQgaXMgb3V0IG9mIGJvdW5kcyBmb3Igc2Vzc2lvbi5ASW52YWxpZFNpZ25hdHVyZQADBHxJbnZhbGlkIHNpZ25hdHVyZSBvbiBzdGF0ZW1lbnQuSER1cGxpY2F0ZVN0YXRlbWVudAAEBMxWYWxpZGF0b3Igdm90ZSBzdWJtaXR0ZWQgbW9yZSB0aGFuIG9uY2UgdG8gZGlzcHV0ZS5IU2luZ2xlU2lkZWREaXNwdXRlAAUExEEgZGlzcHV0ZSB3aGVyZSB0aGVyZSBhcmUgb25seSB2b3RlcyBvbiBvbmUgc2lkZS48TWFsaWNpb3VzQmFja2VyAAYEnEEgZGlzcHV0ZSB2b3RlIGZyb20gYSBtYWxpY2lvdXMgYmFja2VyLkxNaXNzaW5nQmFja2luZ1ZvdGVzAAcE4E5vIGJhY2tpbmcgdm90ZXMgd2VyZSBwcm92aWRlcyBhbG9uZyBkaXNwdXRlIHN0YXRlbWVudHMuSFVuY29uZmlybWVkRGlzcHV0ZQAIBLBVbmNvbmZpcm1lZCBkaXNwdXRlIHN0YXRlbWVudCBzZXRzIHByb3ZpZGVkLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC4pDRBMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2NyBzbGFzaGluZzhQZW5kaW5nU2xhc2hlcwAACAEQa2V5cy0NAZRCVHJlZU1hcDxWYWxpZGF0b3JJbmRleCwgVmFsaWRhdG9ySWQ+AAEQa2luZJUFAUxTbGFzaGluZ09mZmVuY2VLaW5kAAAtDQQgQlRyZWVNYXAIBEsBAQUEVgH5AQAEADENAAAAMQ0AAAI1DQA1DQAABAgBBfkBADkNFGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMgZGlzcHV0ZXMgc2xhc2hpbmcYcGFsbGV0FEVycm9yBARUAAEYYEludmFsaWRLZXlPd25lcnNoaXBQcm9vZgAABIxUaGUga2V5IG93bmVyc2hpcCBwcm9vZiBpcyBpbnZhbGlkLkxJbnZhbGlkU2Vzc2lvbkluZGV4AAEEoFRoZSBzZXNzaW9uIGluZGV4IGlzIHRvbyBvbGQgb3IgaW52YWxpZC5QSW52YWxpZENhbmRpZGF0ZUhhc2gAAgR4VGhlIGNhbmRpZGF0ZSBoYXNoIGlzIGludmFsaWQuVEludmFsaWRWYWxpZGF0b3JJbmRleAADCAEBVGhlcmUgaXMgbm8gcGVuZGluZyBzbGFzaCBmb3IgdGhlIGdpdmVuIHZhbGlkYXRvciBpbmRleCBhbmQgdGltZRRzbG90LmBWYWxpZGF0b3JJbmRleElkTWlzbWF0Y2gABATQVGhlIHZhbGlkYXRvciBpbmRleCBkb2VzIG5vdCBtYXRjaCB0aGUgdmFsaWRhdG9yIGlkLlxEdXBsaWNhdGVTbGFzaGluZ1JlcG9ydAAFBA0BVGhlIGdpdmVuIHNsYXNoaW5nIHJlcG9ydCBpcyB2YWxpZCBidXQgYWxyZWFkeSBwcmV2aW91c2x5IHJlcG9ydGVkLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC49DRBscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zSGFzc2lnbmVyX29uX2RlbWFuZBR0eXBlc0RDb3JlQWZmaW5pdHlDb3VudAAACAEoY29yZV9pbmRlePUHASRDb3JlSW5kZXgAARRjb3VudBABDHUzMgAAQQ0QbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWluc0hhc3NpZ25lcl9vbl9kZW1hbmQUdHlwZXM8UXVldWVTdGF0dXNUeXBlAAAQARx0cmFmZmljIQcBJEZpeGVkVTEyOAABKG5leHRfaW5kZXhFDQEoUXVldWVJbmRleAABOHNtYWxsZXN0X2luZGV4RQ0BKFF1ZXVlSW5kZXgAATRmcmVlZF9pbmRpY2VzSQ0BdEJpbmFyeUhlYXA8UmV2ZXJzZVF1ZXVlSW5kZXg+AABFDRBscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zSGFzc2lnbmVyX29uX2RlbWFuZBR0eXBlcyhRdWV1ZUluZGV4AAAEABABDHUzMgAASQ0EKEJpbmFyeUhlYXAEBFQBTQ0ABABRDQAAAE0NEGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnNIYXNzaWduZXJfb25fZGVtYW5kFHR5cGVzRFJldmVyc2VRdWV1ZUluZGV4AAAEABABDHUzMgAAUQ0AAAJNDQBVDQQoQmluYXJ5SGVhcAQEVAFZDQAEAF0NAAAAWQ0QbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWluc0hhc3NpZ25lcl9vbl9kZW1hbmQUdHlwZXM0RW5xdWV1ZWRPcmRlcgAACAEccGFyYV9pZGkCARhQYXJhSWQAAQxpZHhFDQEoUXVldWVJbmRleAAAXQ0AAAJZDQBhDQxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUARgEUwAABABlDQEYVmVjPFQ+AABlDQAAAhgAaQ0QbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWluc0hhc3NpZ25lcl9vbl9kZW1hbmQYcGFsbGV0FEVycm9yBARUAAEIJFF1ZXVlRnVsbAAABORUaGUgb3JkZXIgcXVldWUgaXMgZnVsbCwgYHBsYWNlX29yZGVyYCB3aWxsIG5vdCBjb250aW51ZS5wU3BvdFByaWNlSGlnaGVyVGhhbk1heEFtb3VudAABCE0BVGhlIGN1cnJlbnQgc3BvdCBwcmljZSBpcyBoaWdoZXIgdGhhbiB0aGUgbWF4IGFtb3VudCBzcGVjaWZpZWQgaW4gdGhlIGBwbGFjZV9vcmRlcmBgY2FsbCwgbWFraW5nIGl0IGludmFsaWQuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0Lm0NAAAECBD1BwBxDQxscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zRGFzc2lnbmVyX2NvcmV0aW1lIFNjaGVkdWxlBAROARAADAEsYXNzaWdubWVudHPFBQGMVmVjPChDb3JlQXNzaWdubWVudCwgUGFydHNPZjU3NjAwKT4AASBlbmRfaGludD0CASRPcHRpb248Tj4AATRuZXh0X3NjaGVkdWxlPQIBJE9wdGlvbjxOPgAAdQ0MbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWluc0Rhc3NpZ25lcl9jb3JldGltZThDb3JlRGVzY3JpcHRvcgQETgEQAAgBFHF1ZXVleQ0BaE9wdGlvbjxRdWV1ZURlc2NyaXB0b3I8Tj4+AAEwY3VycmVudF93b3JrgQ0BUE9wdGlvbjxXb3JrU3RhdGU8Tj4+AAB5DQQYT3B0aW9uBARUAX0NAQgQTm9uZQAAABBTb21lBAB9DQAAAQAAfQ0MbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWluc0Rhc3NpZ25lcl9jb3JldGltZTxRdWV1ZURlc2NyaXB0b3IEBE4BEAAIARRmaXJzdBABBE4AARBsYXN0EAEETgAAgQ0EGE9wdGlvbgQEVAGFDQEIEE5vbmUAAAAQU29tZQQAhQ0AAAEAAIUNDGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnNEYXNzaWduZXJfY29yZXRpbWUkV29ya1N0YXRlBAROARAAEAEsYXNzaWdubWVudHOJDQGYVmVjPChDb3JlQXNzaWdubWVudCwgQXNzaWdubWVudFN0YXRlKT4AASBlbmRfaGludD0CASRPcHRpb248Tj4AAQxwb3NVAQEMdTE2AAEQc3RlcNEFATBQYXJ0c09mNTc2MDAAAIkNAAACjQ0AjQ0AAAQIzQWRDQCRDQxscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zRGFzc2lnbmVyX2NvcmV0aW1lPEFzc2lnbm1lbnRTdGF0ZQAACAEUcmF0aW/RBQEwUGFydHNPZjU3NjAwAAEkcmVtYWluaW5n0QUBMFBhcnRzT2Y1NzYwMAAAlQ0QbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWluc0Rhc3NpZ25lcl9jb3JldGltZRhwYWxsZXQURXJyb3IEBFQAARhAQXNzaWdubWVudHNFbXB0eQAAADRPdmVyU2NoZWR1bGVkAAEEkEFzc2lnbm1lbnRzIHRvZ2V0aGVyIGV4Y2VlZGVkIDU3NjAwLjhVbmRlclNjaGVkdWxlZAACBJBBc3NpZ25tZW50cyB0b2dldGhlciBsZXNzIHRoYW4gNTc2MDBARGlzYWxsb3dlZEluc2VydAADCFEBYXNzaWduX2NvcmUgaXMgb25seSBhbGxvd2VkIHRvIGFwcGVuZCBuZXcgYXNzaWdubWVudHMgYXQgdGhlIGVuZCBvZiBhbHJlYWR5IGV4aXN0aW5nFG9uZXMuPER1cGxpY2F0ZUluc2VydAAEBFUBVHJpZWQgdG8gaW5zZXJ0IGEgc2NoZWR1bGUgZm9yIHRoZSBzYW1lIGNvcmUgYW5kIGJsb2NrIG51bWJlciBhcyBhbiBleGlzdGluZyBzY2hlZHVsZVBBc3NpZ25tZW50c05vdFNvcnRlZAAFBKxUcmllZCB0byBhZGQgYW4gdW5zb3J0ZWQgc2V0IG9mIGFzc2lnbm1lbnRzBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LpkNDFxwb2xrYWRvdF9ydW50aW1lX2NvbW1vbjxwYXJhc19yZWdpc3RyYXIgUGFyYUluZm8IHEFjY291bnQBABxCYWxhbmNlARgADAEcbWFuYWdlcgABHEFjY291bnQAARxkZXBvc2l0GAEcQmFsYW5jZQABGGxvY2tlZLECATBPcHRpb248Ym9vbD4AAJ0NEFxwb2xrYWRvdF9ydW50aW1lX2NvbW1vbjxwYXJhc19yZWdpc3RyYXIYcGFsbGV0FEVycm9yBARUAAE4NE5vdFJlZ2lzdGVyZWQAAARkVGhlIElEIGlzIG5vdCByZWdpc3RlcmVkLkRBbHJlYWR5UmVnaXN0ZXJlZAABBHRUaGUgSUQgaXMgYWxyZWFkeSByZWdpc3RlcmVkLiBOb3RPd25lcgACBJxUaGUgY2FsbGVyIGlzIG5vdCB0aGUgb3duZXIgb2YgdGhpcyBJZC4wQ29kZVRvb0xhcmdlAAMEXEludmFsaWQgcGFyYSBjb2RlIHNpemUuQEhlYWREYXRhVG9vTGFyZ2UABARwSW52YWxpZCBwYXJhIGhlYWQgZGF0YSBzaXplLjBOb3RQYXJhY2hhaW4ABQRgUGFyYSBpcyBub3QgYSBQYXJhY2hhaW4uNE5vdFBhcmF0aHJlYWQABgS8UGFyYSBpcyBub3QgYSBQYXJhdGhyZWFkIChvbi1kZW1hbmQgcGFyYWNoYWluKS5AQ2Fubm90RGVyZWdpc3RlcgAHBFhDYW5ub3QgZGVyZWdpc3RlciBwYXJhPENhbm5vdERvd25ncmFkZQAIBC0BQ2Fubm90IHNjaGVkdWxlIGRvd25ncmFkZSBvZiBsZWFzZSBob2xkaW5nIHBhcmFjaGFpbiB0byBvbi1kZW1hbmQgcGFyYWNoYWluNENhbm5vdFVwZ3JhZGUACQQlAUNhbm5vdCBzY2hlZHVsZSB1cGdyYWRlIG9mIG9uLWRlbWFuZCBwYXJhY2hhaW4gdG8gbGVhc2UgaG9sZGluZyBwYXJhY2hhaW4oUGFyYUxvY2tlZAAKCEkBUGFyYSBpcyBsb2NrZWQgZnJvbSBtYW5pcHVsYXRpb24gYnkgdGhlIG1hbmFnZXIuIE11c3QgdXNlIHBhcmFjaGFpbiBvciByZWxheSBjaGFpbixnb3Zlcm5hbmNlLixOb3RSZXNlcnZlZAALBNBUaGUgSUQgZ2l2ZW4gZm9yIHJlZ2lzdHJhdGlvbiBoYXMgbm90IGJlZW4gcmVzZXJ2ZWQuLEludmFsaWRDb2RlAAwEfFRoZSB2YWxpZGF0aW9uIGNvZGUgaXMgaW52YWxpZC4oQ2Fubm90U3dhcAANCFEBQ2Fubm90IHBlcmZvcm0gYSBwYXJhY2hhaW4gc2xvdCAvIGxpZmVjeWNsZSBzd2FwLiBDaGVjayB0aGF0IHRoZSBzdGF0ZSBvZiBib3RoIHBhcmFzhGFyZSBjb3JyZWN0IGZvciB0aGUgc3dhcCB0byB3b3JrLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC6hDQAAAikLAKUNEFxwb2xrYWRvdF9ydW50aW1lX2NvbW1vbhRzbG90cxhwYWxsZXQURXJyb3IEBFQAAQhEUGFyYU5vdE9uYm9hcmRpbmcAAASMVGhlIHBhcmFjaGFpbiBJRCBpcyBub3Qgb25ib2FyZGluZy4oTGVhc2VFcnJvcgABBIhUaGVyZSB3YXMgYW4gZXJyb3Igd2l0aCB0aGUgbGVhc2UuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LqkNAAAECABpAgCtDQAAAyQAAACxDQCxDQQYT3B0aW9uBARUAbUNAQgQTm9uZQAAABBTb21lBAC1DQAAAQAAtQ0AAAQMAGkCGAC5DRBccG9sa2Fkb3RfcnVudGltZV9jb21tb24gYXVjdGlvbnMYcGFsbGV0FEVycm9yBARUAAEcREF1Y3Rpb25JblByb2dyZXNzAAAEkFRoaXMgYXVjdGlvbiBpcyBhbHJlYWR5IGluIHByb2dyZXNzLkRMZWFzZVBlcmlvZEluUGFzdAABBIBUaGUgbGVhc2UgcGVyaW9kIGlzIGluIHRoZSBwYXN0LkRQYXJhTm90UmVnaXN0ZXJlZAACBFhQYXJhIGlzIG5vdCByZWdpc3RlcmVkRE5vdEN1cnJlbnRBdWN0aW9uAAMEWE5vdCBhIGN1cnJlbnQgYXVjdGlvbi4oTm90QXVjdGlvbgAEBDxOb3QgYW4gYXVjdGlvbi4wQXVjdGlvbkVuZGVkAAUEaEF1Y3Rpb24gaGFzIGFscmVhZHkgZW5kZWQuQEFscmVhZHlMZWFzZWRPdXQABgTYVGhlIHBhcmEgaXMgYWxyZWFkeSBsZWFzZWQgb3V0IGZvciBwYXJ0IG9mIHRoaXMgcmFuZ2UuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0Lr0NDFxwb2xrYWRvdF9ydW50aW1lX2NvbW1vbiRjcm93ZGxvYW4gRnVuZEluZm8QJEFjY291bnRJZAEAHEJhbGFuY2UBGCxCbG9ja051bWJlcgEQLExlYXNlUGVyaW9kARAAKAEkZGVwb3NpdG9yAAEkQWNjb3VudElkAAEgdmVyaWZpZXKxBQFMT3B0aW9uPE11bHRpU2lnbmVyPgABHGRlcG9zaXQYARxCYWxhbmNlAAEYcmFpc2VkGAEcQmFsYW5jZQABDGVuZBABLEJsb2NrTnVtYmVyAAEMY2FwGAEcQmFsYW5jZQABRGxhc3RfY29udHJpYnV0aW9uwQ0BdExhc3RDb250cmlidXRpb248QmxvY2tOdW1iZXI+AAEwZmlyc3RfcGVyaW9kEAEsTGVhc2VQZXJpb2QAASxsYXN0X3BlcmlvZBABLExlYXNlUGVyaW9kAAEoZnVuZF9pbmRleBABJEZ1bmRJbmRleAAAwQ0MXHBvbGthZG90X3J1bnRpbWVfY29tbW9uJGNyb3dkbG9hbkBMYXN0Q29udHJpYnV0aW9uBCxCbG9ja051bWJlcgEQAQwUTmV2ZXIAAAAkUHJlRW5kaW5nBAAQAQx1MzIAAQAYRW5kaW5nBAAQASxCbG9ja051bWJlcgACAADFDRBccG9sa2Fkb3RfcnVudGltZV9jb21tb24kY3Jvd2Rsb2FuGHBhbGxldBRFcnJvcgQEVAABXERGaXJzdFBlcmlvZEluUGFzdAAABPRUaGUgY3VycmVudCBsZWFzZSBwZXJpb2QgaXMgbW9yZSB0aGFuIHRoZSBmaXJzdCBsZWFzZSBwZXJpb2QuZEZpcnN0UGVyaW9kVG9vRmFySW5GdXR1cmUAAQQRAVRoZSBmaXJzdCBsZWFzZSBwZXJpb2QgbmVlZHMgdG8gYXQgbGVhc3QgYmUgbGVzcyB0aGFuIDMgYG1heF92YWx1ZWAubExhc3RQZXJpb2RCZWZvcmVGaXJzdFBlcmlvZAACBOhMYXN0IGxlYXNlIHBlcmlvZCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBmaXJzdCBsZWFzZSBwZXJpb2QuYExhc3RQZXJpb2RUb29GYXJJbkZ1dHVyZQADBC0BVGhlIGxhc3QgbGVhc2UgcGVyaW9kIGNhbm5vdCBiZSBtb3JlIHRoYW4gMyBwZXJpb2RzIGFmdGVyIHRoZSBmaXJzdCBwZXJpb2QuPENhbm5vdEVuZEluUGFzdAAEBEUBVGhlIGNhbXBhaWduIGVuZHMgYmVmb3JlIHRoZSBjdXJyZW50IGJsb2NrIG51bWJlci4gVGhlIGVuZCBtdXN0IGJlIGluIHRoZSBmdXR1cmUuREVuZFRvb0ZhckluRnV0dXJlAAUEwFRoZSBlbmQgZGF0ZSBmb3IgdGhpcyBjcm93ZGxvYW4gaXMgbm90IHNlbnNpYmxlLiBPdmVyZmxvdwAGBFhUaGVyZSB3YXMgYW4gb3ZlcmZsb3cuUENvbnRyaWJ1dGlvblRvb1NtYWxsAAcE6FRoZSBjb250cmlidXRpb24gd2FzIGJlbG93IHRoZSBtaW5pbXVtLCBgTWluQ29udHJpYnV0aW9uYC40SW52YWxpZFBhcmFJZAAIBExJbnZhbGlkIGZ1bmQgaW5kZXguLENhcEV4Y2VlZGVkAAkEkENvbnRyaWJ1dGlvbnMgZXhjZWVkIG1heGltdW0gYW1vdW50LlhDb250cmlidXRpb25QZXJpb2RPdmVyAAoEqFRoZSBjb250cmlidXRpb24gcGVyaW9kIGhhcyBhbHJlYWR5IGVuZGVkLjRJbnZhbGlkT3JpZ2luAAsEjFRoZSBvcmlnaW4gb2YgdGhpcyBjYWxsIGlzIGludmFsaWQuME5vdFBhcmFjaGFpbgAMBMhUaGlzIGNyb3dkbG9hbiBkb2VzIG5vdCBjb3JyZXNwb25kIHRvIGEgcGFyYWNoYWluLixMZWFzZUFjdGl2ZQANBBUBVGhpcyBwYXJhY2hhaW4gbGVhc2UgaXMgc3RpbGwgYWN0aXZlIGFuZCByZXRpcmVtZW50IGNhbm5vdCB5ZXQgYmVnaW4uQEJpZE9yTGVhc2VBY3RpdmUADgQxAVRoaXMgcGFyYWNoYWluJ3MgYmlkIG9yIGxlYXNlIGlzIHN0aWxsIGFjdGl2ZSBhbmQgd2l0aGRyYXcgY2Fubm90IHlldCBiZWdpbi4wRnVuZE5vdEVuZGVkAA8EgFRoZSBjcm93ZGxvYW4gaGFzIG5vdCB5ZXQgZW5kZWQuPE5vQ29udHJpYnV0aW9ucwAQBNBUaGVyZSBhcmUgbm8gY29udHJpYnV0aW9ucyBzdG9yZWQgaW4gdGhpcyBjcm93ZGxvYW4uSE5vdFJlYWR5VG9EaXNzb2x2ZQARCFUBVGhlIGNyb3dkbG9hbiBpcyBub3QgcmVhZHkgdG8gZGlzc29sdmUuIFBvdGVudGlhbGx5IHN0aWxsIGhhcyBhIHNsb3Qgb3IgaW4gcmV0aXJlbWVudBxwZXJpb2QuQEludmFsaWRTaWduYXR1cmUAEgRISW52YWxpZCBzaWduYXR1cmUuME1lbW9Ub29MYXJnZQATBHxUaGUgcHJvdmlkZWQgbWVtbyBpcyB0b28gbGFyZ2UuREFscmVhZHlJbk5ld1JhaXNlABQEhFRoZSBmdW5kIGlzIGFscmVhZHkgaW4gYE5ld1JhaXNlYEhWcmZEZWxheUluUHJvZ3Jlc3MAFQS0Tm8gY29udHJpYnV0aW9ucyBhbGxvd2VkIGR1cmluZyB0aGUgVlJGIGRlbGF5NE5vTGVhc2VQZXJpb2QAFgQtAUEgbGVhc2UgcGVyaW9kIGhhcyBub3Qgc3RhcnRlZCB5ZXQsIGR1ZSB0byBhbiBvZmZzZXQgaW4gdGhlIHN0YXJ0aW5nIGJsb2NrLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC7JDRBscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zIGNvcmV0aW1lGHBhbGxldBRFcnJvcgQEVAABDCROb3RCcm9rZXIAAAQpAVRoZSBwYXJhaWQgbWFraW5nIHRoZSBjYWxsIGlzIG5vdCB0aGUgY29yZXRpbWUgYnJva2VyYWdlIHN5c3RlbSBwYXJhY2hhaW4uWFJlcXVlc3RlZEZ1dHVyZVJldmVudWUAAQhFAVJlcXVlc3RlZCByZXZlbnVlIGluZm9ybWF0aW9uIGB3aGVuYCBwYXJhbWV0ZXIgd2FzIGluIHRoZSBmdXR1cmUgZnJvbSB0aGUgY3VycmVudDRibG9jayBoZWlnaHQuTEFzc2V0VHJhbnNmZXJGYWlsZWQAAgS8RmFpbGVkIHRvIHRyYW5zZmVyIGFzc2V0cyB0byB0aGUgY29yZXRpbWUgY2hhaW4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQuzQ0MKHBhbGxldF94Y20YcGFsbGV0LFF1ZXJ5U3RhdHVzBCxCbG9ja051bWJlcgEQAQwcUGVuZGluZxABJHJlc3BvbmRlci0BAURWZXJzaW9uZWRMb2NhdGlvbgABTG1heWJlX21hdGNoX3F1ZXJpZXLRDQFkT3B0aW9uPFZlcnNpb25lZExvY2F0aW9uPgABMG1heWJlX25vdGlmedUNAUBPcHRpb248KHU4LCB1OCk+AAEcdGltZW91dBABLEJsb2NrTnVtYmVyAAAAPFZlcnNpb25Ob3RpZmllcggBGG9yaWdpbi0BAURWZXJzaW9uZWRMb2NhdGlvbgABJGlzX2FjdGl2ZSABEGJvb2wAAQAUUmVhZHkIASByZXNwb25zZd0NAURWZXJzaW9uZWRSZXNwb25zZQABCGF0EAEsQmxvY2tOdW1iZXIAAgAA0Q0EGE9wdGlvbgQEVAEtAQEIEE5vbmUAAAAQU29tZQQALQEAAAEAANUNBBhPcHRpb24EBFQB2Q0BCBBOb25lAAAAEFNvbWUEANkNAAABAADZDQAABAgICADdDQgMeGNtRFZlcnNpb25lZFJlc3BvbnNlAAEMCFYyBAAFBgEwdjI6OlJlc3BvbnNlAAIACFYzBABNBgEwdjM6OlJlc3BvbnNlAAMACFY0BACxBgEwdjQ6OlJlc3BvbnNlAAQAAOENAAAECBAtAQDlDQAABAwwKBAA6Q0MTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAHtDQRTAAAEAPENARhWZWM8VD4AAO0NAAAECC0BEADxDQAAAu0NAPUNDChwYWxsZXRfeGNtGHBhbGxldFRWZXJzaW9uTWlncmF0aW9uU3RhZ2UAARBcTWlncmF0ZVN1cHBvcnRlZFZlcnNpb24AAABcTWlncmF0ZVZlcnNpb25Ob3RpZmllcnMAAQBQTm90aWZ5Q3VycmVudFRhcmdldHMEAPkNATxPcHRpb248VmVjPHU4Pj4AAgBoTWlncmF0ZUFuZE5vdGlmeU9sZFRhcmdldHMAAwAA+Q0EGE9wdGlvbgQEVAE4AQgQTm9uZQAAABBTb21lBAA4AAABAAD9DQAABAwQAA0HAAEODChwYWxsZXRfeGNtGHBhbGxldGhSZW1vdGVMb2NrZWRGdW5naWJsZVJlY29yZAhIQ29uc3VtZXJJZGVudGlmaWVyAaEBME1heENvbnN1bWVycwAAEAEYYW1vdW50GAEQdTEyOAABFG93bmVyLQEBRFZlcnNpb25lZExvY2F0aW9uAAEYbG9ja2VyLQEBRFZlcnNpb25lZExvY2F0aW9uAAEkY29uc3VtZXJzBQ4B0EJvdW5kZWRWZWM8KENvbnN1bWVySWRlbnRpZmllciwgdTEyOCksIE1heENvbnN1bWVycz4AAAUODExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBCQ4EUwAABAANDgEYVmVjPFQ+AAAJDgAABAihARgADQ4AAAIJDgARDgxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUARUOBFMAAAQAGQ4BGFZlYzxUPgAAFQ4AAAQIGC0BABkOAAACFQ4AHQ4MKHBhbGxldF94Y20YcGFsbGV0FEVycm9yBARUAAFgLFVucmVhY2hhYmxlAAAIXQFUaGUgZGVzaXJlZCBkZXN0aW5hdGlvbiB3YXMgdW5yZWFjaGFibGUsIGdlbmVyYWxseSBiZWNhdXNlIHRoZXJlIGlzIGEgbm8gd2F5IG9mIHJvdXRpbmcYdG8gaXQuLFNlbmRGYWlsdXJlAAEIQQFUaGVyZSB3YXMgc29tZSBvdGhlciBpc3N1ZSAoaS5lLiBub3QgdG8gZG8gd2l0aCByb3V0aW5nKSBpbiBzZW5kaW5nIHRoZSBtZXNzYWdlLshQZXJoYXBzIGEgbGFjayBvZiBzcGFjZSBmb3IgYnVmZmVyaW5nIHRoZSBtZXNzYWdlLiBGaWx0ZXJlZAACBJxUaGUgbWVzc2FnZSBleGVjdXRpb24gZmFpbHMgdGhlIGZpbHRlci5IVW53ZWlnaGFibGVNZXNzYWdlAAMEtFRoZSBtZXNzYWdlJ3Mgd2VpZ2h0IGNvdWxkIG5vdCBiZSBkZXRlcm1pbmVkLmBEZXN0aW5hdGlvbk5vdEludmVydGlibGUABATcVGhlIGRlc3RpbmF0aW9uIGBMb2NhdGlvbmAgcHJvdmlkZWQgY2Fubm90IGJlIGludmVydGVkLhRFbXB0eQAFBIBUaGUgYXNzZXRzIHRvIGJlIHNlbnQgYXJlIGVtcHR5LjhDYW5ub3RSZWFuY2hvcgAGBDUBQ291bGQgbm90IHJlLWFuY2hvciB0aGUgYXNzZXRzIHRvIGRlY2xhcmUgdGhlIGZlZXMgZm9yIHRoZSBkZXN0aW5hdGlvbiBjaGFpbi40VG9vTWFueUFzc2V0cwAHBMRUb28gbWFueSBhc3NldHMgaGF2ZSBiZWVuIGF0dGVtcHRlZCBmb3IgdHJhbnNmZXIuNEludmFsaWRPcmlnaW4ACAR4T3JpZ2luIGlzIGludmFsaWQgZm9yIHNlbmRpbmcuKEJhZFZlcnNpb24ACQQhAVRoZSB2ZXJzaW9uIG9mIHRoZSBgVmVyc2lvbmVkYCB2YWx1ZSB1c2VkIGlzIG5vdCBhYmxlIHRvIGJlIGludGVycHJldGVkLixCYWRMb2NhdGlvbgAKCEEBVGhlIGdpdmVuIGxvY2F0aW9uIGNvdWxkIG5vdCBiZSB1c2VkIChlLmcuIGJlY2F1c2UgaXQgY2Fubm90IGJlIGV4cHJlc3NlZCBpbiB0aGVgZGVzaXJlZCB2ZXJzaW9uIG9mIFhDTSkuOE5vU3Vic2NyaXB0aW9uAAsEvFRoZSByZWZlcmVuY2VkIHN1YnNjcmlwdGlvbiBjb3VsZCBub3QgYmUgZm91bmQuREFscmVhZHlTdWJzY3JpYmVkAAwEEQFUaGUgbG9jYXRpb24gaXMgaW52YWxpZCBzaW5jZSBpdCBhbHJlYWR5IGhhcyBhIHN1YnNjcmlwdGlvbiBmcm9tIHVzLlhDYW5ub3RDaGVja091dFRlbGVwb3J0AA0EKQFDb3VsZCBub3QgY2hlY2stb3V0IHRoZSBhc3NldHMgZm9yIHRlbGVwb3J0YXRpb24gdG8gdGhlIGRlc3RpbmF0aW9uIGNoYWluLihMb3dCYWxhbmNlAA4EQQFUaGUgb3duZXIgZG9lcyBub3Qgb3duIChhbGwpIG9mIHRoZSBhc3NldCB0aGF0IHRoZXkgd2lzaCB0byBkbyB0aGUgb3BlcmF0aW9uIG9uLjBUb29NYW55TG9ja3MADwTAVGhlIGFzc2V0IG93bmVyIGhhcyB0b28gbWFueSBsb2NrcyBvbiB0aGUgYXNzZXQuTEFjY291bnROb3RTb3ZlcmVpZ24AEAQxAVRoZSBnaXZlbiBhY2NvdW50IGlzIG5vdCBhbiBpZGVudGlmaWFibGUgc292ZXJlaWduIGFjY291bnQgZm9yIGFueSBsb2NhdGlvbi4oRmVlc05vdE1ldAARBCkBVGhlIG9wZXJhdGlvbiByZXF1aXJlZCBmZWVzIHRvIGJlIHBhaWQgd2hpY2ggdGhlIGluaXRpYXRvciBjb3VsZCBub3QgbWVldC4wTG9ja05vdEZvdW5kABIE9EEgcmVtb3RlIGxvY2sgd2l0aCB0aGUgY29ycmVzcG9uZGluZyBkYXRhIGNvdWxkIG5vdCBiZSBmb3VuZC4USW5Vc2UAEwRJAVRoZSB1bmxvY2sgb3BlcmF0aW9uIGNhbm5vdCBzdWNjZWVkIGJlY2F1c2UgdGhlcmUgYXJlIHN0aWxsIGNvbnN1bWVycyBvZiB0aGUgbG9jay5oSW52YWxpZEFzc2V0VW5rbm93blJlc2VydmUAFQTwSW52YWxpZCBhc3NldCwgcmVzZXJ2ZSBjaGFpbiBjb3VsZCBub3QgYmUgZGV0ZXJtaW5lZCBmb3IgaXQueEludmFsaWRBc3NldFVuc3VwcG9ydGVkUmVzZXJ2ZQAWBEUBSW52YWxpZCBhc3NldCwgZG8gbm90IHN1cHBvcnQgcmVtb3RlIGFzc2V0IHJlc2VydmVzIHdpdGggZGlmZmVyZW50IGZlZXMgcmVzZXJ2ZXMuPFRvb01hbnlSZXNlcnZlcwAXBEkBVG9vIG1hbnkgYXNzZXRzIHdpdGggZGlmZmVyZW50IHJlc2VydmUgbG9jYXRpb25zIGhhdmUgYmVlbiBhdHRlbXB0ZWQgZm9yIHRyYW5zZmVyLmBMb2NhbEV4ZWN1dGlvbkluY29tcGxldGUAGAR8TG9jYWwgWENNIGV4ZWN1dGlvbiBpbmNvbXBsZXRlLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC4hDghQcGFsbGV0X21lc3NhZ2VfcXVldWUkQm9va1N0YXRlBDRNZXNzYWdlT3JpZ2luARUHABgBFGJlZ2luEAEkUGFnZUluZGV4AAEMZW5kEAEkUGFnZUluZGV4AAEUY291bnQQASRQYWdlSW5kZXgAAUByZWFkeV9uZWlnaGJvdXJzJQ4BhE9wdGlvbjxOZWlnaGJvdXJzPE1lc3NhZ2VPcmlnaW4+PgABNG1lc3NhZ2VfY291bnQwAQx1NjQAARBzaXplMAEMdTY0AAAlDgQYT3B0aW9uBARUASkOAQgQTm9uZQAAABBTb21lBAApDgAAAQAAKQ4IUHBhbGxldF9tZXNzYWdlX3F1ZXVlKE5laWdoYm91cnMENE1lc3NhZ2VPcmlnaW4BFQcACAEQcHJldhUHATRNZXNzYWdlT3JpZ2luAAEQbmV4dBUHATRNZXNzYWdlT3JpZ2luAAAtDgAABAgVBxAAMQ4IUHBhbGxldF9tZXNzYWdlX3F1ZXVlEFBhZ2UIEFNpemUBECBIZWFwU2l6ZQAAGAEkcmVtYWluaW5nEAEQU2l6ZQABOHJlbWFpbmluZ19zaXplEAEQU2l6ZQABLGZpcnN0X2luZGV4EAEQU2l6ZQABFGZpcnN0EAEQU2l6ZQABEGxhc3QQARBTaXplAAEQaGVhcDUOAZxCb3VuZGVkVmVjPHU4LCBJbnRvVTMyPEhlYXBTaXplLCBTaXplPj4AADUODExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBCARTAAAEADgBGFZlYzxUPgAAOQ4MUHBhbGxldF9tZXNzYWdlX3F1ZXVlGHBhbGxldBRFcnJvcgQEVAABJCxOb3RSZWFwYWJsZQAACEkBUGFnZSBpcyBub3QgcmVhcGFibGUgYmVjYXVzZSBpdCBoYXMgaXRlbXMgcmVtYWluaW5nIHRvIGJlIHByb2Nlc3NlZCBhbmQgaXMgbm90IG9sZBxlbm91Z2guGE5vUGFnZQABBIRQYWdlIHRvIGJlIHJlYXBlZCBkb2VzIG5vdCBleGlzdC4kTm9NZXNzYWdlAAIEqFRoZSByZWZlcmVuY2VkIG1lc3NhZ2UgY291bGQgbm90IGJlIGZvdW5kLkBBbHJlYWR5UHJvY2Vzc2VkAAMEAQFUaGUgbWVzc2FnZSB3YXMgYWxyZWFkeSBwcm9jZXNzZWQgYW5kIGNhbm5vdCBiZSBwcm9jZXNzZWQgYWdhaW4uGFF1ZXVlZAAEBKxUaGUgbWVzc2FnZSBpcyBxdWV1ZWQgZm9yIGZ1dHVyZSBleGVjdXRpb24uSEluc3VmZmljaWVudFdlaWdodAAFBBkBVGhlcmUgaXMgdGVtcG9yYXJpbHkgbm90IGVub3VnaCB3ZWlnaHQgdG8gY29udGludWUgc2VydmljaW5nIG1lc3NhZ2VzLmBUZW1wb3JhcmlseVVucHJvY2Vzc2FibGUABhCoVGhpcyBtZXNzYWdlIGlzIHRlbXBvcmFyaWx5IHVucHJvY2Vzc2FibGUuAFkBU3VjaCBlcnJvcnMgYXJlIGV4cGVjdGVkLCBidXQgbm90IGd1YXJhbnRlZWQsIHRvIHJlc29sdmUgdGhlbXNlbHZlcyBldmVudHVhbGx5IHRocm91Z2gkcmV0cnlpbmcuLFF1ZXVlUGF1c2VkAAcM7FRoZSBxdWV1ZSBpcyBwYXVzZWQgYW5kIG5vIG1lc3NhZ2UgY2FuIGJlIGV4ZWN1dGVkIGZyb20gaXQuAB0BVGhpcyBjYW4gY2hhbmdlIGF0IGFueSB0aW1lIGFuZCBtYXkgcmVzb2x2ZSBpbiB0aGUgZnV0dXJlIGJ5IHJlLXRyeWluZy5MUmVjdXJzaXZlRGlzYWxsb3dlZAAIBDEBQW5vdGhlciBjYWxsIGlzIGluIHByb2dyZXNzIGFuZCBuZWVkcyB0byBmaW5pc2ggYmVmb3JlIHRoaXMgY2FsbCBjYW4gaGFwcGVuLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC49DgxEcGFsbGV0X2Fzc2V0X3JhdGUYcGFsbGV0FEVycm9yBARUAAEMQFVua25vd25Bc3NldEtpbmQAAAR4VGhlIGdpdmVuIGFzc2V0IElEIGlzIHVua25vd24uNEFscmVhZHlFeGlzdHMAAQRRAVRoZSBnaXZlbiBhc3NldCBJRCBhbHJlYWR5IGhhcyBhbiBhc3NpZ25lZCBjb252ZXJzaW9uIHJhdGUgYW5kIGNhbm5vdCBiZSByZS1jcmVhdGVkLiBPdmVyZmxvdwACBMxPdmVyZmxvdyBvY3VycmVkIHdoZW4gY2FsY3VsYXRpbmcgdGhlIGludmVyc2UgcmF0ZS4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQuQQ4MTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAEFAgRTAAAEAEUOARhWZWM8VD4AAEUOAAACBQIASQ4MMHBhbGxldF9iZWVmeRhwYWxsZXQURXJyb3IEBFQAARBgSW52YWxpZEtleU93bmVyc2hpcFByb29mAAAEMQFBIGtleSBvd25lcnNoaXAgcHJvb2YgcHJvdmlkZWQgYXMgcGFydCBvZiBhbiBlcXVpdm9jYXRpb24gcmVwb3J0IGlzIGludmFsaWQuYEludmFsaWRFcXVpdm9jYXRpb25Qcm9vZgABBDEBQW4gZXF1aXZvY2F0aW9uIHByb29mIHByb3ZpZGVkIGFzIHBhcnQgb2YgYW4gZXF1aXZvY2F0aW9uIHJlcG9ydCBpcyBpbnZhbGlkLlhEdXBsaWNhdGVPZmZlbmNlUmVwb3J0AAIEFQFBIGdpdmVuIGVxdWl2b2NhdGlvbiByZXBvcnQgaXMgdmFsaWQgYnV0IGFscmVhZHkgcHJldmlvdXNseSByZXBvcnRlZC5QSW52YWxpZENvbmZpZ3VyYXRpb24AAwSMU3VibWl0dGVkIGNvbmZpZ3VyYXRpb24gaXMgaW52YWxpZC4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQuTQ4MSHNwX2NvbnNlbnN1c19iZWVmeQxtbXJEQmVlZnlBdXRob3JpdHlTZXQEWEF1dGhvcml0eVNldENvbW1pdG1lbnQBNAAMAQhpZDABVGNyYXRlOjpWYWxpZGF0b3JTZXRJZAABDGxlbhABDHUzMgABRGtleXNldF9jb21taXRtZW50NAFYQXV0aG9yaXR5U2V0Q29tbWl0bWVudAAAUQ4AAAQkVQ5ZDl0OYQ5lDm0OcQ51DnkOAFUOEDBmcmFtZV9zeXN0ZW0oZXh0ZW5zaW9uc1RjaGVja19ub25femVyb19zZW5kZXJIQ2hlY2tOb25aZXJvU2VuZGVyBARUAAAAAFkOEDBmcmFtZV9zeXN0ZW0oZXh0ZW5zaW9uc0hjaGVja19zcGVjX3ZlcnNpb25AQ2hlY2tTcGVjVmVyc2lvbgQEVAAAAABdDhAwZnJhbWVfc3lzdGVtKGV4dGVuc2lvbnNAY2hlY2tfdHhfdmVyc2lvbjhDaGVja1R4VmVyc2lvbgQEVAAAAABhDhAwZnJhbWVfc3lzdGVtKGV4dGVuc2lvbnM0Y2hlY2tfZ2VuZXNpczBDaGVja0dlbmVzaXMEBFQAAAAAZQ4QMGZyYW1lX3N5c3RlbShleHRlbnNpb25zPGNoZWNrX21vcnRhbGl0eThDaGVja01vcnRhbGl0eQQEVAAABABpDgEMRXJhAABpDhAoc3BfcnVudGltZRxnZW5lcmljDGVyYQxFcmEAAQEEIEltbW9ydGFsAAAAHE1vcnRhbDEEAAgAAAEAHE1vcnRhbDIEAAgAAAIAHE1vcnRhbDMEAAgAAAMAHE1vcnRhbDQEAAgAAAQAHE1vcnRhbDUEAAgAAAUAHE1vcnRhbDYEAAgAAAYAHE1vcnRhbDcEAAgAAAcAHE1vcnRhbDgEAAgAAAgAHE1vcnRhbDkEAAgAAAkAIE1vcnRhbDEwBAAIAAAKACBNb3J0YWwxMQQACAAACwAgTW9ydGFsMTIEAAgAAAwAIE1vcnRhbDEzBAAIAAANACBNb3J0YWwxNAQACAAADgAgTW9ydGFsMTUEAAgAAA8AIE1vcnRhbDE2BAAIAAAQACBNb3J0YWwxNwQACAAAEQAgTW9ydGFsMTgEAAgAABIAIE1vcnRhbDE5BAAIAAATACBNb3J0YWwyMAQACAAAFAAgTW9ydGFsMjEEAAgAABUAIE1vcnRhbDIyBAAIAAAWACBNb3J0YWwyMwQACAAAFwAgTW9ydGFsMjQEAAgAABgAIE1vcnRhbDI1BAAIAAAZACBNb3J0YWwyNgQACAAAGgAgTW9ydGFsMjcEAAgAABsAIE1vcnRhbDI4BAAIAAAcACBNb3J0YWwyOQQACAAAHQAgTW9ydGFsMzAEAAgAAB4AIE1vcnRhbDMxBAAIAAAfACBNb3J0YWwzMgQACAAAIAAgTW9ydGFsMzMEAAgAACEAIE1vcnRhbDM0BAAIAAAiACBNb3J0YWwzNQQACAAAIwAgTW9ydGFsMzYEAAgAACQAIE1vcnRhbDM3BAAIAAAlACBNb3J0YWwzOAQACAAAJgAgTW9ydGFsMzkEAAgAACcAIE1vcnRhbDQwBAAIAAAoACBNb3J0YWw0MQQACAAAKQAgTW9ydGFsNDIEAAgAACoAIE1vcnRhbDQzBAAIAAArACBNb3J0YWw0NAQACAAALAAgTW9ydGFsNDUEAAgAAC0AIE1vcnRhbDQ2BAAIAAAuACBNb3J0YWw0NwQACAAALwAgTW9ydGFsNDgEAAgAADAAIE1vcnRhbDQ5BAAIAAAxACBNb3J0YWw1MAQACAAAMgAgTW9ydGFsNTEEAAgAADMAIE1vcnRhbDUyBAAIAAA0ACBNb3J0YWw1MwQACAAANQAgTW9ydGFsNTQEAAgAADYAIE1vcnRhbDU1BAAIAAA3ACBNb3J0YWw1NgQACAAAOAAgTW9ydGFsNTcEAAgAADkAIE1vcnRhbDU4BAAIAAA6ACBNb3J0YWw1OQQACAAAOwAgTW9ydGFsNjAEAAgAADwAIE1vcnRhbDYxBAAIAAA9ACBNb3J0YWw2MgQACAAAPgAgTW9ydGFsNjMEAAgAAD8AIE1vcnRhbDY0BAAIAABAACBNb3J0YWw2NQQACAAAQQAgTW9ydGFsNjYEAAgAAEIAIE1vcnRhbDY3BAAIAABDACBNb3J0YWw2OAQACAAARAAgTW9ydGFsNjkEAAgAAEUAIE1vcnRhbDcwBAAIAABGACBNb3J0YWw3MQQACAAARwAgTW9ydGFsNzIEAAgAAEgAIE1vcnRhbDczBAAIAABJACBNb3J0YWw3NAQACAAASgAgTW9ydGFsNzUEAAgAAEsAIE1vcnRhbDc2BAAIAABMACBNb3J0YWw3NwQACAAATQAgTW9ydGFsNzgEAAgAAE4AIE1vcnRhbDc5BAAIAABPACBNb3J0YWw4MAQACAAAUAAgTW9ydGFsODEEAAgAAFEAIE1vcnRhbDgyBAAIAABSACBNb3J0YWw4MwQACAAAUwAgTW9ydGFsODQEAAgAAFQAIE1vcnRhbDg1BAAIAABVACBNb3J0YWw4NgQACAAAVgAgTW9ydGFsODcEAAgAAFcAIE1vcnRhbDg4BAAIAABYACBNb3J0YWw4OQQACAAAWQAgTW9ydGFsOTAEAAgAAFoAIE1vcnRhbDkxBAAIAABbACBNb3J0YWw5MgQACAAAXAAgTW9ydGFsOTMEAAgAAF0AIE1vcnRhbDk0BAAIAABeACBNb3J0YWw5NQQACAAAXwAgTW9ydGFsOTYEAAgAAGAAIE1vcnRhbDk3BAAIAABhACBNb3J0YWw5OAQACAAAYgAgTW9ydGFsOTkEAAgAAGMAJE1vcnRhbDEwMAQACAAAZAAkTW9ydGFsMTAxBAAIAABlACRNb3J0YWwxMDIEAAgAAGYAJE1vcnRhbDEwMwQACAAAZwAkTW9ydGFsMTA0BAAIAABoACRNb3J0YWwxMDUEAAgAAGkAJE1vcnRhbDEwNgQACAAAagAkTW9ydGFsMTA3BAAIAABrACRNb3J0YWwxMDgEAAgAAGwAJE1vcnRhbDEwOQQACAAAbQAkTW9ydGFsMTEwBAAIAABuACRNb3J0YWwxMTEEAAgAAG8AJE1vcnRhbDExMgQACAAAcAAkTW9ydGFsMTEzBAAIAABxACRNb3J0YWwxMTQEAAgAAHIAJE1vcnRhbDExNQQACAAAcwAkTW9ydGFsMTE2BAAIAAB0ACRNb3J0YWwxMTcEAAgAAHUAJE1vcnRhbDExOAQACAAAdgAkTW9ydGFsMTE5BAAIAAB3ACRNb3J0YWwxMjAEAAgAAHgAJE1vcnRhbDEyMQQACAAAeQAkTW9ydGFsMTIyBAAIAAB6ACRNb3J0YWwxMjMEAAgAAHsAJE1vcnRhbDEyNAQACAAAfAAkTW9ydGFsMTI1BAAIAAB9ACRNb3J0YWwxMjYEAAgAAH4AJE1vcnRhbDEyNwQACAAAfwAkTW9ydGFsMTI4BAAIAACAACRNb3J0YWwxMjkEAAgAAIEAJE1vcnRhbDEzMAQACAAAggAkTW9ydGFsMTMxBAAIAACDACRNb3J0YWwxMzIEAAgAAIQAJE1vcnRhbDEzMwQACAAAhQAkTW9ydGFsMTM0BAAIAACGACRNb3J0YWwxMzUEAAgAAIcAJE1vcnRhbDEzNgQACAAAiAAkTW9ydGFsMTM3BAAIAACJACRNb3J0YWwxMzgEAAgAAIoAJE1vcnRhbDEzOQQACAAAiwAkTW9ydGFsMTQwBAAIAACMACRNb3J0YWwxNDEEAAgAAI0AJE1vcnRhbDE0MgQACAAAjgAkTW9ydGFsMTQzBAAIAACPACRNb3J0YWwxNDQEAAgAAJAAJE1vcnRhbDE0NQQACAAAkQAkTW9ydGFsMTQ2BAAIAACSACRNb3J0YWwxNDcEAAgAAJMAJE1vcnRhbDE0OAQACAAAlAAkTW9ydGFsMTQ5BAAIAACVACRNb3J0YWwxNTAEAAgAAJYAJE1vcnRhbDE1MQQACAAAlwAkTW9ydGFsMTUyBAAIAACYACRNb3J0YWwxNTMEAAgAAJkAJE1vcnRhbDE1NAQACAAAmgAkTW9ydGFsMTU1BAAIAACbACRNb3J0YWwxNTYEAAgAAJwAJE1vcnRhbDE1NwQACAAAnQAkTW9ydGFsMTU4BAAIAACeACRNb3J0YWwxNTkEAAgAAJ8AJE1vcnRhbDE2MAQACAAAoAAkTW9ydGFsMTYxBAAIAAChACRNb3J0YWwxNjIEAAgAAKIAJE1vcnRhbDE2MwQACAAAowAkTW9ydGFsMTY0BAAIAACkACRNb3J0YWwxNjUEAAgAAKUAJE1vcnRhbDE2NgQACAAApgAkTW9ydGFsMTY3BAAIAACnACRNb3J0YWwxNjgEAAgAAKgAJE1vcnRhbDE2OQQACAAAqQAkTW9ydGFsMTcwBAAIAACqACRNb3J0YWwxNzEEAAgAAKsAJE1vcnRhbDE3MgQACAAArAAkTW9ydGFsMTczBAAIAACtACRNb3J0YWwxNzQEAAgAAK4AJE1vcnRhbDE3NQQACAAArwAkTW9ydGFsMTc2BAAIAACwACRNb3J0YWwxNzcEAAgAALEAJE1vcnRhbDE3OAQACAAAsgAkTW9ydGFsMTc5BAAIAACzACRNb3J0YWwxODAEAAgAALQAJE1vcnRhbDE4MQQACAAAtQAkTW9ydGFsMTgyBAAIAAC2ACRNb3J0YWwxODMEAAgAALcAJE1vcnRhbDE4NAQACAAAuAAkTW9ydGFsMTg1BAAIAAC5ACRNb3J0YWwxODYEAAgAALoAJE1vcnRhbDE4NwQACAAAuwAkTW9ydGFsMTg4BAAIAAC8ACRNb3J0YWwxODkEAAgAAL0AJE1vcnRhbDE5MAQACAAAvgAkTW9ydGFsMTkxBAAIAAC/ACRNb3J0YWwxOTIEAAgAAMAAJE1vcnRhbDE5MwQACAAAwQAkTW9ydGFsMTk0BAAIAADCACRNb3J0YWwxOTUEAAgAAMMAJE1vcnRhbDE5NgQACAAAxAAkTW9ydGFsMTk3BAAIAADFACRNb3J0YWwxOTgEAAgAAMYAJE1vcnRhbDE5OQQACAAAxwAkTW9ydGFsMjAwBAAIAADIACRNb3J0YWwyMDEEAAgAAMkAJE1vcnRhbDIwMgQACAAAygAkTW9ydGFsMjAzBAAIAADLACRNb3J0YWwyMDQEAAgAAMwAJE1vcnRhbDIwNQQACAAAzQAkTW9ydGFsMjA2BAAIAADOACRNb3J0YWwyMDcEAAgAAM8AJE1vcnRhbDIwOAQACAAA0AAkTW9ydGFsMjA5BAAIAADRACRNb3J0YWwyMTAEAAgAANIAJE1vcnRhbDIxMQQACAAA0wAkTW9ydGFsMjEyBAAIAADUACRNb3J0YWwyMTMEAAgAANUAJE1vcnRhbDIxNAQACAAA1gAkTW9ydGFsMjE1BAAIAADXACRNb3J0YWwyMTYEAAgAANgAJE1vcnRhbDIxNwQACAAA2QAkTW9ydGFsMjE4BAAIAADaACRNb3J0YWwyMTkEAAgAANsAJE1vcnRhbDIyMAQACAAA3AAkTW9ydGFsMjIxBAAIAADdACRNb3J0YWwyMjIEAAgAAN4AJE1vcnRhbDIyMwQACAAA3wAkTW9ydGFsMjI0BAAIAADgACRNb3J0YWwyMjUEAAgAAOEAJE1vcnRhbDIyNgQACAAA4gAkTW9ydGFsMjI3BAAIAADjACRNb3J0YWwyMjgEAAgAAOQAJE1vcnRhbDIyOQQACAAA5QAkTW9ydGFsMjMwBAAIAADmACRNb3J0YWwyMzEEAAgAAOcAJE1vcnRhbDIzMgQACAAA6AAkTW9ydGFsMjMzBAAIAADpACRNb3J0YWwyMzQEAAgAAOoAJE1vcnRhbDIzNQQACAAA6wAkTW9ydGFsMjM2BAAIAADsACRNb3J0YWwyMzcEAAgAAO0AJE1vcnRhbDIzOAQACAAA7gAkTW9ydGFsMjM5BAAIAADvACRNb3J0YWwyNDAEAAgAAPAAJE1vcnRhbDI0MQQACAAA8QAkTW9ydGFsMjQyBAAIAADyACRNb3J0YWwyNDMEAAgAAPMAJE1vcnRhbDI0NAQACAAA9AAkTW9ydGFsMjQ1BAAIAAD1ACRNb3J0YWwyNDYEAAgAAPYAJE1vcnRhbDI0NwQACAAA9wAkTW9ydGFsMjQ4BAAIAAD4ACRNb3J0YWwyNDkEAAgAAPkAJE1vcnRhbDI1MAQACAAA+gAkTW9ydGFsMjUxBAAIAAD7ACRNb3J0YWwyNTIEAAgAAPwAJE1vcnRhbDI1MwQACAAA/QAkTW9ydGFsMjU0BAAIAAD+ACRNb3J0YWwyNTUEAAgAAP8AAG0OEDBmcmFtZV9zeXN0ZW0oZXh0ZW5zaW9ucyxjaGVja19ub25jZShDaGVja05vbmNlBARUAAAEANQBIFQ6Ok5vbmNlAABxDhAwZnJhbWVfc3lzdGVtKGV4dGVuc2lvbnMwY2hlY2tfd2VpZ2h0LENoZWNrV2VpZ2h0BARUAAAAAHUOCGhwYWxsZXRfdHJhbnNhY3Rpb25fcGF5bWVudGBDaGFyZ2VUcmFuc2FjdGlvblBheW1lbnQEBFQAAAQA5AEwQmFsYW5jZU9mPFQ+AAB5Dgh0ZnJhbWVfbWV0YWRhdGFfaGFzaF9leHRlbnNpb25EQ2hlY2tNZXRhZGF0YUhhc2gEBFQAAAQBEG1vZGV9DgEQTW9kZQAAfQ4IdGZyYW1lX21ldGFkYXRhX2hhc2hfZXh0ZW5zaW9uEE1vZGUAAQggRGlzYWJsZWQAAAAcRW5hYmxlZAABAACBDghYc3RhZ2luZ19rdXNhbWFfcnVudGltZRxSdW50aW1lAAAAAIUODDByZWxheV9jb21tb24QYXBpczRJbmZsYXRpb25JbmZvAAAIASRpbmZsYXRpb26dAgFcc3BfcnVudGltZTo6UGVycXVpbnRpbGwAASRuZXh0X21pbnSJDgHwKHBvbGthZG90X3ByaW1pdGl2ZXM6OkJhbGFuY2UsIHBvbGthZG90X3ByaW1pdGl2ZXM6OkJhbGFuY2UpAACJDgAABAgYGACNDhAoc3BfcnVudGltZRxnZW5lcmljFGJsb2NrFEJsb2NrCBhIZWFkZXIBeQEkRXh0cmluc2ljAZEOAAgBGGhlYWRlcnkBARhIZWFkZXIAAShleHRyaW5zaWNzlQ4BOFZlYzxFeHRyaW5zaWM+AACRDhAoc3BfcnVudGltZRxnZW5lcmljTHVuY2hlY2tlZF9leHRyaW5zaWNIVW5jaGVja2VkRXh0cmluc2ljEBxBZGRyZXNzAZ0BEENhbGwBXQEkU2lnbmF0dXJlAb0FFEV4dHJhAVEOAAQAOAAAAJUOAAACkQ4AmQ4IKHNwX3J1bnRpbWVYRXh0cmluc2ljSW5jbHVzaW9uTW9kZQABCDRBbGxFeHRyaW5zaWNzAAAANE9ubHlJbmhlcmVudHMAAQAAnQ4IHHNwX2NvcmU4T3BhcXVlTWV0YWRhdGEAAAQAOAEcVmVjPHU4PgAAoQ4EGE9wdGlvbgQEVAGdDgEIEE5vbmUAAAAQU29tZQQAnQ4AAAEAAKUOBBhSZXN1bHQIBFQBmQcERQGpDgEICE9rBACZBwAAAAAMRXJyBACpDgAAAQAAqQ4MKHNwX3J1bnRpbWVQdHJhbnNhY3Rpb25fdmFsaWRpdHlgVHJhbnNhY3Rpb25WYWxpZGl0eUVycm9yAAEIHEludmFsaWQEAK0OAUhJbnZhbGlkVHJhbnNhY3Rpb24AAAAcVW5rbm93bgQAsQ4BSFVua25vd25UcmFuc2FjdGlvbgABAACtDgwoc3BfcnVudGltZVB0cmFuc2FjdGlvbl92YWxpZGl0eUhJbnZhbGlkVHJhbnNhY3Rpb24AASwQQ2FsbAAAABxQYXltZW50AAEAGEZ1dHVyZQACABRTdGFsZQADACBCYWRQcm9vZgAEAERBbmNpZW50QmlydGhCbG9jawAFAERFeGhhdXN0c1Jlc291cmNlcwAGABhDdXN0b20EAAgBCHU4AAcAMEJhZE1hbmRhdG9yeQAIAExNYW5kYXRvcnlWYWxpZGF0aW9uAAkAJEJhZFNpZ25lcgAKAACxDgwoc3BfcnVudGltZVB0cmFuc2FjdGlvbl92YWxpZGl0eUhVbmtub3duVHJhbnNhY3Rpb24AAQwwQ2Fubm90TG9va3VwAAAATE5vVW5zaWduZWRWYWxpZGF0b3IAAQAYQ3VzdG9tBAAIAQh1OAACAAC1Dggwc3BfaW5oZXJlbnRzMEluaGVyZW50RGF0YQAABAEQZGF0YbkOAZRCVHJlZU1hcDxJbmhlcmVudElkZW50aWZpZXIsIFZlYzx1OD4+AAC5DgQgQlRyZWVNYXAIBEsBAQYEVgE4AAQAvQ4AAAC9DgAAAsEOAMEOAAAECAEGOADFDggwc3BfaW5oZXJlbnRzUENoZWNrSW5oZXJlbnRzUmVzdWx0AAAMARBva2F5IAEQYm9vbAABLGZhdGFsX2Vycm9yIAEQYm9vbAABGGVycm9yc7UOATBJbmhlcmVudERhdGEAAMkODChzcF9ydW50aW1lUHRyYW5zYWN0aW9uX3ZhbGlkaXR5RFRyYW5zYWN0aW9uU291cmNlAAEMHEluQmxvY2sAAAAUTG9jYWwAAQAgRXh0ZXJuYWwAAgAAzQ4EGFJlc3VsdAgEVAHRDgRFAakOAQgIT2sEANEOAAAAAAxFcnIEAKkOAAABAADRDgwoc3BfcnVudGltZVB0cmFuc2FjdGlvbl92YWxpZGl0eUBWYWxpZFRyYW5zYWN0aW9uAAAUASBwcmlvcml0eTABTFRyYW5zYWN0aW9uUHJpb3JpdHkAASByZXF1aXJlc20BAUxWZWM8VHJhbnNhY3Rpb25UYWc+AAEgcHJvdmlkZXNtAQFMVmVjPFRyYW5zYWN0aW9uVGFnPgABJGxvbmdldml0eTABUFRyYW5zYWN0aW9uTG9uZ2V2aXR5AAEkcHJvcGFnYXRlIAEQYm9vbAAA1Q4AAAQIdQzZDgDZDgxMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2N0RHcm91cFJvdGF0aW9uSW5mbwQETgEQAAwBTHNlc3Npb25fc3RhcnRfYmxvY2sQAQROAAFgZ3JvdXBfcm90YXRpb25fZnJlcXVlbmN5EAEETgABDG5vdxABBE4AAN0OAAAC4Q4A4Q4MTHBvbGthZG90X3ByaW1pdGl2ZXMIdjckQ29yZVN0YXRlCARIATQETgEQAQwgT2NjdXBpZWQEAOUOAUhPY2N1cGllZENvcmU8SCwgTj4AAAAkU2NoZWR1bGVkBADtDgE0U2NoZWR1bGVkQ29yZQABABBGcmVlAAIAAOUODExwb2xrYWRvdF9wcmltaXRpdmVzCHY3ME9jY3VwaWVkQ29yZQgESAE0BE4BEAAgAVBuZXh0X3VwX29uX2F2YWlsYWJsZekOAVRPcHRpb248U2NoZWR1bGVkQ29yZT4AAThvY2N1cGllZF9zaW5jZRABBE4AASx0aW1lX291dF9hdBABBE4AAUxuZXh0X3VwX29uX3RpbWVfb3V06Q4BVE9wdGlvbjxTY2hlZHVsZWRDb3JlPgABMGF2YWlsYWJpbGl0efkEAXxCaXRWZWM8dTgsIGJpdHZlYzo6b3JkZXI6OkxzYjA+AAFEZ3JvdXBfcmVzcG9uc2libGX5BwEoR3JvdXBJbmRleAABOGNhbmRpZGF0ZV9oYXNoVQUBNENhbmRpZGF0ZUhhc2gAAVBjYW5kaWRhdGVfZGVzY3JpcHRvchUFAVhDYW5kaWRhdGVEZXNjcmlwdG9yPEg+AADpDgQYT3B0aW9uBARUAe0OAQgQTm9uZQAAABBTb21lBADtDgAAAQAA7Q4MTHBvbGthZG90X3ByaW1pdGl2ZXMIdjc0U2NoZWR1bGVkQ29yZQAACAEccGFyYV9pZGkCAQhJZAABIGNvbGxhdG9y8Q4BSE9wdGlvbjxDb2xsYXRvcklkPgAA8Q4EGE9wdGlvbgQEVAEZBQEIEE5vbmUAAAAQU29tZQQAGQUAAAEAAPUODExwb2xrYWRvdF9wcmltaXRpdmVzCHY3WE9jY3VwaWVkQ29yZUFzc3VtcHRpb24AAQwgSW5jbHVkZWQAAAAgVGltZWRPdXQAAQAQRnJlZQACAAD5DgQYT3B0aW9uBARUAf0OAQgQTm9uZQAAABBTb21lBAD9DgAAAQAA/Q4MTHBvbGthZG90X3ByaW1pdGl2ZXMIdjdcUGVyc2lzdGVkVmFsaWRhdGlvbkRhdGEIBEgBNAROARAAEAEscGFyZW50X2hlYWRBBQEgSGVhZERhdGEAAUxyZWxheV9wYXJlbnRfbnVtYmVyEAEETgABZHJlbGF5X3BhcmVudF9zdG9yYWdlX3Jvb3Q0AQRIAAEwbWF4X3Bvdl9zaXplEAEMdTMyAAABDwQYT3B0aW9uBARUAQUPAQgQTm9uZQAAABBTb21lBAAFDwAAAQAABQ8AAAQI/Q4hBQAJDwQYT3B0aW9uBARUAREFAQgQTm9uZQAAABBTb21lBAARBQAAAQAADQ8AAAIRDwARDwxMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2NzhDYW5kaWRhdGVFdmVudAQESAE0AQw8Q2FuZGlkYXRlQmFja2VkEADxBwFMQ2FuZGlkYXRlUmVjZWlwdDxIPgAAQQUBIEhlYWREYXRhAAD1BwEkQ29yZUluZGV4AAD5BwEoR3JvdXBJbmRleAAAAERDYW5kaWRhdGVJbmNsdWRlZBAA8QcBTENhbmRpZGF0ZVJlY2VpcHQ8SD4AAEEFASBIZWFkRGF0YQAA9QcBJENvcmVJbmRleAAA+QcBKEdyb3VwSW5kZXgAAQBEQ2FuZGlkYXRlVGltZWRPdXQMAPEHAUxDYW5kaWRhdGVSZWNlaXB0PEg+AABBBQEgSGVhZERhdGEAAPUHASRDb3JlSW5kZXgAAgAAFQ8EIEJUcmVlTWFwCARLAWkCBFYB9QwABAAZDwAAABkPAAACHQ8AHQ8AAAQIaQL1DAAhDwQYT3B0aW9uBARUAV0MAQgQTm9uZQAAABBTb21lBABdDAAAAQAAJQ8EGE9wdGlvbgQEVAENDQEIEE5vbmUAAAAQU29tZQQADQ0AAAEAACkPBBhPcHRpb24EBFQBIQUBCBBOb25lAAAAEFNvbWUEACEFAAABAAAtDwAAAjEPADEPAAAEDBBVBR0NADUPBBhPcHRpb24EBFQBwQQBCBBOb25lAAAAEFNvbWUEAMEEAAABAAA5DwAAAj0PAD0PAAAEDBBVBSkNAEEPBBhPcHRpb24EBFQBRQ8BCBBOb25lAAAAEFNvbWUEAEUPAAABAABFDxBMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2NyBzbGFzaGluZ1xPcGFxdWVLZXlPd25lcnNoaXBQcm9vZgAABAA4ARxWZWM8dTg+AABJDwQYT3B0aW9uBARUAaEBAQgQTm9uZQAAABBTb21lBAChAQAAAQAATQ8EGE9wdGlvbgQEVAFRDwEIEE5vbmUAAAAQU29tZQQAUQ8AAAEAAFEPEExwb2xrYWRvdF9wcmltaXRpdmVzCHY3NGFzeW5jX2JhY2tpbmcwQmFja2luZ1N0YXRlCARIATQETgEQAAgBLGNvbnN0cmFpbnRzVQ8BOENvbnN0cmFpbnRzPE4+AAFQcGVuZGluZ19hdmFpbGFiaWxpdHl1DwGcVmVjPENhbmRpZGF0ZVBlbmRpbmdBdmFpbGFiaWxpdHk8SCwgTj4+AABVDxBMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2NzRhc3luY19iYWNraW5nLENvbnN0cmFpbnRzBAROARAAOAFcbWluX3JlbGF5X3BhcmVudF9udW1iZXIQAQROAAEwbWF4X3Bvdl9zaXplEAEMdTMyAAE0bWF4X2NvZGVfc2l6ZRABDHUzMgABNHVtcF9yZW1haW5pbmcQAQx1MzIAAUx1bXBfcmVtYWluaW5nX2J5dGVzEAEMdTMyAAFkbWF4X3VtcF9udW1fcGVyX2NhbmRpZGF0ZRABDHUzMgABWGRtcF9yZW1haW5pbmdfbWVzc2FnZXPBAQEYVmVjPE4+AAEwaHJtcF9pbmJvdW5kWQ8BZEluYm91bmRIcm1wTGltaXRhdGlvbnM8Tj4AAURocm1wX2NoYW5uZWxzX291dF0PAaRWZWM8KElkLCBPdXRib3VuZEhybXBDaGFubmVsTGltaXRhdGlvbnMpPgABaG1heF9ocm1wX251bV9wZXJfY2FuZGlkYXRlEAEMdTMyAAE8cmVxdWlyZWRfcGFyZW50QQUBIEhlYWREYXRhAAFQdmFsaWRhdGlvbl9jb2RlX2hhc2ghBQFIVmFsaWRhdGlvbkNvZGVIYXNoAAFMdXBncmFkZV9yZXN0cmljdGlvbmkPAWhPcHRpb248VXBncmFkZVJlc3RyaWN0aW9uPgABWGZ1dHVyZV92YWxpZGF0aW9uX2NvZGVtDwF8T3B0aW9uPChOLCBWYWxpZGF0aW9uQ29kZUhhc2gpPgAAWQ8QTHBvbGthZG90X3ByaW1pdGl2ZXMIdjc0YXN5bmNfYmFja2luZ1hJbmJvdW5kSHJtcExpbWl0YXRpb25zBAROARAABAFAdmFsaWRfd2F0ZXJtYXJrc8EBARhWZWM8Tj4AAF0PAAACYQ8AYQ8AAAQIaQJlDwBlDxBMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2NzRhc3luY19iYWNraW5neE91dGJvdW5kSHJtcENoYW5uZWxMaW1pdGF0aW9ucwAACAE8Ynl0ZXNfcmVtYWluaW5nEAEMdTMyAAFIbWVzc2FnZXNfcmVtYWluaW5nEAEMdTMyAABpDwQYT3B0aW9uBARUAc0MAQgQTm9uZQAAABBTb21lBADNDAAAAQAAbQ8EGE9wdGlvbgQEVAFxDwEIEE5vbmUAAAAQU29tZQQAcQ8AAAEAAHEPAAAECBAhBQB1DwAAAnkPAHkPEExwb2xrYWRvdF9wcmltaXRpdmVzCHY3NGFzeW5jX2JhY2tpbmdwQ2FuZGlkYXRlUGVuZGluZ0F2YWlsYWJpbGl0eQgESAE0BE4BEAAUAThjYW5kaWRhdGVfaGFzaFUFATRDYW5kaWRhdGVIYXNoAAEoZGVzY3JpcHRvchUFAVhDYW5kaWRhdGVEZXNjcmlwdG9yPEg+AAEsY29tbWl0bWVudHMlBQFQQ2FuZGlkYXRlQ29tbWl0bWVudHMAAUxyZWxheV9wYXJlbnRfbnVtYmVyEAEETgABMG1heF9wb3Zfc2l6ZRABDHUzMgAAfQ8EIEJUcmVlTWFwCARLAfUHBFYBrQwABACBDwAAAIEPAAAChQ8AhQ8AAAQI9QetDACJDwAAAhEFAI0PBBhPcHRpb24EBFQBkQ8BCBBOb25lAAAAEFNvbWUEAJEPAAABAACRDwhIc3BfY29uc2Vuc3VzX2JlZWZ5MFZhbGlkYXRvclNldAQsQXV0aG9yaXR5SWQBBQIACAEodmFsaWRhdG9yc0UOAUBWZWM8QXV0aG9yaXR5SWQ+AAEIaWQwAThWYWxpZGF0b3JTZXRJZAAAlQ8IKHNwX3J1bnRpbWUsT3BhcXVlVmFsdWUAAAQAOAEcVmVjPHU4PgAAmQ8EGE9wdGlvbgQEVAGVDwEIEE5vbmUAAAAQU29tZQQAlQ8AAAEAAJ0PBBhSZXN1bHQIBFQBNARFAaEPAQgIT2sEADQAAAAADEVycgQAoQ8AAAEAAKEPCERzcF9tbXJfcHJpbWl0aXZlcxRFcnJvcgABKEBJbnZhbGlkTnVtZXJpY09wAAAAEFB1c2gAAQAcR2V0Um9vdAACABhDb21taXQAAwA0R2VuZXJhdGVQcm9vZgAEABhWZXJpZnkABQAwTGVhZk5vdEZvdW5kAAYARFBhbGxldE5vdEluY2x1ZGVkAAcAQEludmFsaWRMZWFmSW5kZXgACABUSW52YWxpZEJlc3RLbm93bkJsb2NrAAkAAKUPBBhSZXN1bHQIBFQBMARFAaEPAQgIT2sEADAAAAAADEVycgQAoQ8AAAEAAKkPBBhSZXN1bHQIBFQBrQ8ERQGhDwEICE9rBACtDwAAAAAMRXJyBAChDwAAAQAArQ8AAAQIsQ+5DwCxDwAAArUPALUPCERzcF9tbXJfcHJpbWl0aXZlc0xFbmNvZGFibGVPcGFxdWVMZWFmAAAEADgBHFZlYzx1OD4AALkPCERzcF9tbXJfcHJpbWl0aXZlcyRMZWFmUHJvb2YEEEhhc2gBNAAMATBsZWFmX2luZGljZXPJCwE4VmVjPExlYWZJbmRleD4AAShsZWFmX2NvdW50MAEkTm9kZUluZGV4AAEUaXRlbXMVAwEkVmVjPEhhc2g+AAC9DwQYUmVzdWx0CARUAaEBBEUBoQ8BCAhPawQAoQEAAAAADEVycgQAoQ8AAAEAAMEPCERzcF9jb25zZW5zdXNfYmFiZURCYWJlQ29uZmlndXJhdGlvbgAAGAE0c2xvdF9kdXJhdGlvbjABDHU2NAABMGVwb2NoX2xlbmd0aDABDHU2NAABBGONAQEoKHU2NCwgdTY0KQABLGF1dGhvcml0aWVzhQgBnFZlYzwoQXV0aG9yaXR5SWQsIEJhYmVBdXRob3JpdHlXZWlnaHQpPgABKHJhbmRvbW5lc3MEAShSYW5kb21uZXNzAAE0YWxsb3dlZF9zbG90c5EBATBBbGxvd2VkU2xvdHMAAMUPCERzcF9jb25zZW5zdXNfYmFiZRRFcG9jaAAAGAEsZXBvY2hfaW5kZXgwAQx1NjQAAShzdGFydF9zbG90gQEBEFNsb3QAASBkdXJhdGlvbjABDHU2NAABLGF1dGhvcml0aWVzhQgBnFZlYzwoQXV0aG9yaXR5SWQsIEJhYmVBdXRob3JpdHlXZWlnaHQpPgABKHJhbmRvbW5lc3MEAShSYW5kb21uZXNzAAEYY29uZmlnqQgBWEJhYmVFcG9jaENvbmZpZ3VyYXRpb24AAMkPBBhPcHRpb24EBFQBzQ8BCBBOb25lAAAAEFNvbWUEAM0PAAABAADNDwhEc3BfY29uc2Vuc3VzX2JhYmVcT3BhcXVlS2V5T3duZXJzaGlwUHJvb2YAAAQAOAEcVmVjPHU4PgAA0Q8EGE9wdGlvbgQEVAHVDwEIEE5vbmUAAAAQU29tZQQA1Q8AAAEAANUPAAAC2Q8A2Q8AAAQIOI0JAN0PDGhwYWxsZXRfdHJhbnNhY3Rpb25fcGF5bWVudBR0eXBlc0xSdW50aW1lRGlzcGF0Y2hJbmZvCBxCYWxhbmNlARgYV2VpZ2h0ASgADAEYd2VpZ2h0KAEYV2VpZ2h0AAEUY2xhc3NgATREaXNwYXRjaENsYXNzAAEscGFydGlhbF9mZWUYARxCYWxhbmNlAADhDwxocGFsbGV0X3RyYW5zYWN0aW9uX3BheW1lbnQUdHlwZXMoRmVlRGV0YWlscwQcQmFsYW5jZQEYAAgBNGluY2x1c2lvbl9mZWXlDwF0T3B0aW9uPEluY2x1c2lvbkZlZTxCYWxhbmNlPj4AAQx0aXAYARxCYWxhbmNlAADlDwQYT3B0aW9uBARUAekPAQgQTm9uZQAAABBTb21lBADpDwAAAQAA6Q8MaHBhbGxldF90cmFuc2FjdGlvbl9wYXltZW50FHR5cGVzMEluY2x1c2lvbkZlZQQcQmFsYW5jZQEYAAwBIGJhc2VfZmVlGAEcQmFsYW5jZQABHGxlbl9mZWUYARxCYWxhbmNlAAFMYWRqdXN0ZWRfd2VpZ2h0X2ZlZRgBHEJhbGFuY2UAAO0PBBhSZXN1bHQIBFQB8Q8ERQH1DwEICE9rBADxDwAAAAAMRXJyBAD1DwAAAQAA8Q8AAAINBwD1DwxAeGNtX3J1bnRpbWVfYXBpcxBmZWVzFEVycm9yAAEYNFVuaW1wbGVtZW50ZWQAAABkVmVyc2lvbmVkQ29udmVyc2lvbkZhaWxlZAABAExXZWlnaHROb3RDb21wdXRhYmxlAAIATFVuaGFuZGxlZFhjbVZlcnNpb24AAwA0QXNzZXROb3RGb3VuZAAEAChVbnJvdXRhYmxlAAUAAPkPBBhSZXN1bHQIBFQBKARFAfUPAQgIT2sEACgAAAAADEVycgQA9Q8AAAEAAP0PBBhSZXN1bHQIBFQBGARFAfUPAQgIT2sEABgAAAAADEVycgQA9Q8AAAEAAAEQBBhSZXN1bHQIBFQB2QYERQH1DwEICE9rBADZBgAAAAAMRXJyBAD1DwAAAQAABRAEGFJlc3VsdAgEVAEJEARFASEQAQgIT2sEAAkQAAAAAAxFcnIEACEQAAABAAAJEAxAeGNtX3J1bnRpbWVfYXBpcxxkcnlfcnVuRENhbGxEcnlSdW5FZmZlY3RzBBRFdmVudAFUABABQGV4ZWN1dGlvbl9yZXN1bHRpBwFoRGlzcGF0Y2hSZXN1bHRXaXRoUG9zdEluZm8AAThlbWl0dGVkX2V2ZW50cw0QAShWZWM8RXZlbnQ+AAEkbG9jYWxfeGNtERABYE9wdGlvbjxWZXJzaW9uZWRYY208KCk+PgABOGZvcndhcmRlZF94Y21zFRABvFZlYzwoVmVyc2lvbmVkTG9jYXRpb24sIFZlYzxWZXJzaW9uZWRYY208KCk+Pik+AAANEAAAAlQAERAEGE9wdGlvbgQEVAHZBQEIEE5vbmUAAAAQU29tZQQA2QUAAAEAABUQAAACGRAAGRAAAAQILQEdEAAdEAAAAtkFACEQDEB4Y21fcnVudGltZV9hcGlzHGRyeV9ydW4URXJyb3IAAQg0VW5pbXBsZW1lbnRlZAAAAGRWZXJzaW9uZWRDb252ZXJzaW9uRmFpbGVkAAEAACUQBBhSZXN1bHQIBFQBKRAERQEhEAEICE9rBAApEAAAAAAMRXJyBAAhEAAAAQAAKRAMQHhjbV9ydW50aW1lX2FwaXMcZHJ5X3J1bkBYY21EcnlSdW5FZmZlY3RzBBRFdmVudAFUAAwBQGV4ZWN1dGlvbl9yZXN1bHQtCAEcT3V0Y29tZQABOGVtaXR0ZWRfZXZlbnRzDRABKFZlYzxFdmVudD4AAThmb3J3YXJkZWRfeGNtcxUQAbxWZWM8KFZlcnNpb25lZExvY2F0aW9uLCBWZWM8VmVyc2lvbmVkWGNtPCgpPj4pPgAALRAEGFJlc3VsdAgEVAEABEUBMRABCAhPawQAAAAAAAAMRXJyBAAxEAAAAQAAMRAMQHhjbV9ydW50aW1lX2FwaXMsY29udmVyc2lvbnMURXJyb3IAAQgsVW5zdXBwb3J0ZWQAAABkVmVyc2lvbmVkQ29udmVyc2lvbkZhaWxlZAABAAA1EAQYUmVzdWx0CARUAaEBBEUBSQgBCAhPawQAoQEAAAAADEVycgQASQgAAAEAADkQBBhPcHRpb24EBFQBSQgBCBBOb25lAAAAEFNvbWUEAEkIAAABAAA9EAAAAkkIAEEQCFhzdGFnaW5nX2t1c2FtYV9ydW50aW1lMFJ1bnRpbWVFcnJvcgABwBhTeXN0ZW0EAHkIAXBmcmFtZV9zeXN0ZW06OkVycm9yPFJ1bnRpbWU+AAAAEEJhYmUEALkIAWxwYWxsZXRfYmFiZTo6RXJyb3I8UnVudGltZT4AAQAcSW5kaWNlcwQAwQgBeHBhbGxldF9pbmRpY2VzOjpFcnJvcjxSdW50aW1lPgADACBCYWxhbmNlcwQADQkBfHBhbGxldF9iYWxhbmNlczo6RXJyb3I8UnVudGltZT4ABAAcU3Rha2luZwQAbQkBeHBhbGxldF9zdGFraW5nOjpFcnJvcjxSdW50aW1lPgAGABxTZXNzaW9uBACRCQF4cGFsbGV0X3Nlc3Npb246OkVycm9yPFJ1bnRpbWU+AAgAHEdyYW5kcGEEAKEJAXhwYWxsZXRfZ3JhbmRwYTo6RXJyb3I8UnVudGltZT4ACgAgVHJlYXN1cnkEAMUJAXxwYWxsZXRfdHJlYXN1cnk6OkVycm9yPFJ1bnRpbWU+ABIAQENvbnZpY3Rpb25Wb3RpbmcEAPkJAaBwYWxsZXRfY29udmljdGlvbl92b3Rpbmc6OkVycm9yPFJ1bnRpbWU+ABQAJFJlZmVyZW5kYQQAQQoBgHBhbGxldF9yZWZlcmVuZGE6OkVycm9yPFJ1bnRpbWU+ABUAUEZlbGxvd3NoaXBDb2xsZWN0aXZlBABVCgE5AXBhbGxldF9yYW5rZWRfY29sbGVjdGl2ZTo6RXJyb3I8UnVudGltZSwgcGFsbGV0X3JhbmtlZF9jb2xsZWN0aXZlOjoKSW5zdGFuY2UxPgAWAExGZWxsb3dzaGlwUmVmZXJlbmRhBABlCgH0cGFsbGV0X3JlZmVyZW5kYTo6RXJyb3I8UnVudGltZSwgcGFsbGV0X3JlZmVyZW5kYTo6SW5zdGFuY2UyPgAXACRXaGl0ZWxpc3QEAGkKAYBwYWxsZXRfd2hpdGVsaXN0OjpFcnJvcjxSdW50aW1lPgAsABhDbGFpbXMEAG0KAVhjbGFpbXM6OkVycm9yPFJ1bnRpbWU+ABMAHFV0aWxpdHkEAHEKAXhwYWxsZXRfdXRpbGl0eTo6RXJyb3I8UnVudGltZT4AGAAcU29jaWV0eQQAtQoBeHBhbGxldF9zb2NpZXR5OjpFcnJvcjxSdW50aW1lPgAaACBSZWNvdmVyeQQAxQoBfHBhbGxldF9yZWNvdmVyeTo6RXJyb3I8UnVudGltZT4AGwAcVmVzdGluZwQA1QoBeHBhbGxldF92ZXN0aW5nOjpFcnJvcjxSdW50aW1lPgAcACRTY2hlZHVsZXIEAO0KAYBwYWxsZXRfc2NoZWR1bGVyOjpFcnJvcjxSdW50aW1lPgAdABRQcm94eQQAEQsBcHBhbGxldF9wcm94eTo6RXJyb3I8UnVudGltZT4AHgAgTXVsdGlzaWcEACELAXxwYWxsZXRfbXVsdGlzaWc6OkVycm9yPFJ1bnRpbWU+AB8AIFByZWltYWdlBABBCwF8cGFsbGV0X3ByZWltYWdlOjpFcnJvcjxSdW50aW1lPgAgACBCb3VudGllcwQAUQsBfHBhbGxldF9ib3VudGllczo6RXJyb3I8UnVudGltZT4AIwA0Q2hpbGRCb3VudGllcwQAXQsBlHBhbGxldF9jaGlsZF9ib3VudGllczo6RXJyb3I8UnVudGltZT4AKABoRWxlY3Rpb25Qcm92aWRlck11bHRpUGhhc2UEAIULAdBwYWxsZXRfZWxlY3Rpb25fcHJvdmlkZXJfbXVsdGlfcGhhc2U6OkVycm9yPFJ1bnRpbWU+ACUADE5pcwQApQsBaHBhbGxldF9uaXM6OkVycm9yPFJ1bnRpbWU+ACYAWE5pc0NvdW50ZXJwYXJ0QmFsYW5jZXMEAL0LAexwYWxsZXRfYmFsYW5jZXM6OkVycm9yPFJ1bnRpbWUsIHBhbGxldF9iYWxhbmNlczo6SW5zdGFuY2UyPgAtACRWb3Rlckxpc3QEAM0LAfRwYWxsZXRfYmFnc19saXN0OjpFcnJvcjxSdW50aW1lLCBwYWxsZXRfYmFnc19saXN0OjpJbnN0YW5jZTE+ACcAPE5vbWluYXRpb25Qb29scwQAFQwBnHBhbGxldF9ub21pbmF0aW9uX3Bvb2xzOjpFcnJvcjxSdW50aW1lPgApACxGYXN0VW5zdGFrZQQAKQwBjHBhbGxldF9mYXN0X3Vuc3Rha2U6OkVycm9yPFJ1bnRpbWU+ACoANENvbmZpZ3VyYXRpb24EADkMAaBwYXJhY2hhaW5zX2NvbmZpZ3VyYXRpb246OkVycm9yPFJ1bnRpbWU+ADMANFBhcmFJbmNsdXNpb24EAFkMAZBwYXJhY2hhaW5zX2luY2x1c2lvbjo6RXJyb3I8UnVudGltZT4ANQAwUGFyYUluaGVyZW50BABxDAGkcGFyYWNoYWluc19wYXJhc19pbmhlcmVudDo6RXJyb3I8UnVudGltZT4ANgAUUGFyYXMEANUMAYBwYXJhY2hhaW5zX3BhcmFzOjpFcnJvcjxSdW50aW1lPgA4ABBIcm1wBAAFDQF8cGFyYWNoYWluc19ocm1wOjpFcnJvcjxSdW50aW1lPgA8ADRQYXJhc0Rpc3B1dGVzBAAlDQGMcGFyYWNoYWluc19kaXNwdXRlczo6RXJyb3I8UnVudGltZT4APgA0UGFyYXNTbGFzaGluZwQAOQ0BjHBhcmFjaGFpbnNfc2xhc2hpbmc6OkVycm9yPFJ1bnRpbWU+AD8AaE9uRGVtYW5kQXNzaWdubWVudFByb3ZpZGVyBABpDQG0cGFyYWNoYWluc19hc3NpZ25lcl9vbl9kZW1hbmQ6OkVycm9yPFJ1bnRpbWU+AEAAaENvcmV0aW1lQXNzaWdubWVudFByb3ZpZGVyBACVDQGwcGFyYWNoYWluc19hc3NpZ25lcl9jb3JldGltZTo6RXJyb3I8UnVudGltZT4AQQAkUmVnaXN0cmFyBACdDQF8cGFyYXNfcmVnaXN0cmFyOjpFcnJvcjxSdW50aW1lPgBGABRTbG90cwQApQ0BVHNsb3RzOjpFcnJvcjxSdW50aW1lPgBHACBBdWN0aW9ucwQAuQ0BYGF1Y3Rpb25zOjpFcnJvcjxSdW50aW1lPgBIACRDcm93ZGxvYW4EAMUNAWRjcm93ZGxvYW46OkVycm9yPFJ1bnRpbWU+AEkAIENvcmV0aW1lBADJDQFgY29yZXRpbWU6OkVycm9yPFJ1bnRpbWU+AEoAJFhjbVBhbGxldAQAHQ4BaHBhbGxldF94Y206OkVycm9yPFJ1bnRpbWU+AGMAME1lc3NhZ2VRdWV1ZQQAOQ4BkHBhbGxldF9tZXNzYWdlX3F1ZXVlOjpFcnJvcjxSdW50aW1lPgBkACRBc3NldFJhdGUEAD0OAYRwYWxsZXRfYXNzZXRfcmF0ZTo6RXJyb3I8UnVudGltZT4AZQAUQmVlZnkEAEkOAXBwYWxsZXRfYmVlZnk6OkVycm9yPFJ1bnRpbWU+AMgAAAEBGFN5c3RlbQEYU3lzdGVtSBxBY2NvdW50AQEEAgAMQQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAToIFRoZSBmdWxsIGFjY291bnQgaW5mb3JtYXRpb24gZm9yIGEgcGFydGljdWxhciBhY2NvdW50IElELjhFeHRyaW5zaWNDb3VudAAAEAQABLggVG90YWwgZXh0cmluc2ljcyBjb3VudCBmb3IgdGhlIGN1cnJlbnQgYmxvY2suQEluaGVyZW50c0FwcGxpZWQBACAEAASkIFdoZXRoZXIgYWxsIGluaGVyZW50cyBoYXZlIGJlZW4gYXBwbGllZC4sQmxvY2tXZWlnaHQBACQYAAAAAAAABIggVGhlIGN1cnJlbnQgd2VpZ2h0IGZvciB0aGUgYmxvY2suQEFsbEV4dHJpbnNpY3NMZW4AABAEAARBASBUb3RhbCBsZW5ndGggKGluIGJ5dGVzKSBmb3IgYWxsIGV4dHJpbnNpY3MgcHV0IHRvZ2V0aGVyLCBmb3IgdGhlIGN1cnJlbnQgYmxvY2suJEJsb2NrSGFzaAEBBAUQNIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASYIE1hcCBvZiBibG9jayBudW1iZXJzIHRvIGJsb2NrIGhhc2hlcy40RXh0cmluc2ljRGF0YQEBBAUQOAQABD0BIEV4dHJpbnNpY3MgZGF0YSBmb3IgdGhlIGN1cnJlbnQgYmxvY2sgKG1hcHMgYW4gZXh0cmluc2ljJ3MgaW5kZXggdG8gaXRzIGRhdGEpLhhOdW1iZXIBABAQAAAAAAQJASBUaGUgY3VycmVudCBibG9jayBudW1iZXIgYmVpbmcgcHJvY2Vzc2VkLiBTZXQgYnkgYGV4ZWN1dGVfYmxvY2tgLihQYXJlbnRIYXNoAQA0gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHAgSGFzaCBvZiB0aGUgcHJldmlvdXMgYmxvY2suGERpZ2VzdAEAPAQABPAgRGlnZXN0IG9mIHRoZSBjdXJyZW50IGJsb2NrLCBhbHNvIHBhcnQgb2YgdGhlIGJsb2NrIGhlYWRlci4YRXZlbnRzAQBMBAAcoCBFdmVudHMgZGVwb3NpdGVkIGZvciB0aGUgY3VycmVudCBibG9jay4AHQEgTk9URTogVGhlIGl0ZW0gaXMgdW5ib3VuZCBhbmQgc2hvdWxkIHRoZXJlZm9yZSBuZXZlciBiZSByZWFkIG9uIGNoYWluLtAgSXQgY291bGQgb3RoZXJ3aXNlIGluZmxhdGUgdGhlIFBvViBzaXplIG9mIGEgYmxvY2suAC0BIEV2ZW50cyBoYXZlIGEgbGFyZ2UgaW4tbWVtb3J5IHNpemUuIEJveCB0aGUgZXZlbnRzIHRvIG5vdCBnbyBvdXQtb2YtbWVtb3J5/CBqdXN0IGluIGNhc2Ugc29tZW9uZSBzdGlsbCByZWFkcyB0aGVtIGZyb20gd2l0aGluIHRoZSBydW50aW1lLihFdmVudENvdW50AQAQEAAAAAAEuCBUaGUgbnVtYmVyIG9mIGV2ZW50cyBpbiB0aGUgYEV2ZW50czxUPmAgbGlzdC4sRXZlbnRUb3BpY3MBAQQCNEEIBAAoJQEgTWFwcGluZyBiZXR3ZWVuIGEgdG9waWMgKHJlcHJlc2VudGVkIGJ5IFQ6Okhhc2gpIGFuZCBhIHZlY3RvciBvZiBpbmRleGVzlCBvZiBldmVudHMgaW4gdGhlIGA8RXZlbnRzPFQ+PmAgbGlzdC4AUQEgQWxsIHRvcGljIHZlY3RvcnMgaGF2ZSBkZXRlcm1pbmlzdGljIHN0b3JhZ2UgbG9jYXRpb25zIGRlcGVuZGluZyBvbiB0aGUgdG9waWMuIFRoaXNFASBhbGxvd3MgbGlnaHQtY2xpZW50cyB0byBsZXZlcmFnZSB0aGUgY2hhbmdlcyB0cmllIHN0b3JhZ2UgdHJhY2tpbmcgbWVjaGFuaXNtIGFuZOQgaW4gY2FzZSBvZiBjaGFuZ2VzIGZldGNoIHRoZSBsaXN0IG9mIGV2ZW50cyBvZiBpbnRlcmVzdC4AWQEgVGhlIHZhbHVlIGhhcyB0aGUgdHlwZSBgKEJsb2NrTnVtYmVyRm9yPFQ+LCBFdmVudEluZGV4KWAgYmVjYXVzZSBpZiB3ZSB1c2VkIG9ubHkganVzdE0BIHRoZSBgRXZlbnRJbmRleGAgdGhlbiBpbiBjYXNlIGlmIHRoZSB0b3BpYyBoYXMgdGhlIHNhbWUgY29udGVudHMgb24gdGhlIG5leHQgYmxvY2sBASBubyBub3RpZmljYXRpb24gd2lsbCBiZSB0cmlnZ2VyZWQgdGh1cyB0aGUgZXZlbnQgbWlnaHQgYmUgbG9zdC5ITGFzdFJ1bnRpbWVVcGdyYWRlAABFCAQABFUBIFN0b3JlcyB0aGUgYHNwZWNfdmVyc2lvbmAgYW5kIGBzcGVjX25hbWVgIG9mIHdoZW4gdGhlIGxhc3QgcnVudGltZSB1cGdyYWRlIGhhcHBlbmVkLlRVcGdyYWRlZFRvVTMyUmVmQ291bnQBACAEAARNASBUcnVlIGlmIHdlIGhhdmUgdXBncmFkZWQgc28gdGhhdCBgdHlwZSBSZWZDb3VudGAgaXMgYHUzMmAuIEZhbHNlIChkZWZhdWx0KSBpZiBub3QuYFVwZ3JhZGVkVG9UcmlwbGVSZWZDb3VudAEAIAQACF0BIFRydWUgaWYgd2UgaGF2ZSB1cGdyYWRlZCBzbyB0aGF0IEFjY291bnRJbmZvIGNvbnRhaW5zIHRocmVlIHR5cGVzIG9mIGBSZWZDb3VudGAuIEZhbHNlSCAoZGVmYXVsdCkgaWYgbm90LjhFeGVjdXRpb25QaGFzZQAAPQgEAASIIFRoZSBleGVjdXRpb24gcGhhc2Ugb2YgdGhlIGJsb2NrLkRBdXRob3JpemVkVXBncmFkZQAATQgEAAS4IGBTb21lYCBpZiBhIGNvZGUgdXBncmFkZSBoYXMgYmVlbiBhdXRob3JpemVkLgFhAQFYGDBCbG9ja1dlaWdodHNRCAECB6gaClMDAAsAIEqp0QET//////////9Cc7sdAAELMPNwj1gBE6NwPQrXo3C9AQsAmPc+XQET/////////78BAABCc7sdAAELMHvD+cwBE6NwPQrXo3D9AQsAIEqp0QET//////////8BBwCIUmp0EwAAAAAAAABAQnO7HQAAAAAE0CBCbG9jayAmIGV4dHJpbnNpY3Mgd2VpZ2h0czogYmFzZSB2YWx1ZXMgYW5kIGxpbWl0cy4sQmxvY2tMZW5ndGhdCDAAADwAAABQAAAAUAAEqCBUaGUgbWF4aW11bSBsZW5ndGggb2YgYSBibG9jayAoaW4gYnl0ZXMpLjhCbG9ja0hhc2hDb3VudBAQABAAAARVASBNYXhpbXVtIG51bWJlciBvZiBibG9jayBudW1iZXIgdG8gYmxvY2sgaGFzaCBtYXBwaW5ncyB0byBrZWVwIChvbGRlc3QgcHJ1bmVkIGZpcnN0KS4gRGJXZWlnaHRlCEBAeH0BAAAAAADh9QUAAAAABAkBIFRoZSB3ZWlnaHQgb2YgcnVudGltZSBkYXRhYmFzZSBvcGVyYXRpb25zIHRoZSBydW50aW1lIGNhbiBpbnZva2UuHFZlcnNpb25pCO0EGGt1c2FtYTRwYXJpdHkta3VzYW1hAgAAAPtNDwAAAAAAXMUf8fo/XQzKAQAAAN9qy2iZB2CbBQAAADfjl/x8kfXkAgAAAED+OtQB+JWaBgAAANK8mJfu0I8VAwAAAPeLJ4vlP0VMAgAAAK8sApeiPm09CwAAAEnqrxtUigywAwAAAJHV3xiw0s9YAgAAACpekkZVOZ5gAQAAAO2ZxayyXu31AwAAAMvKJeOfFCOHAgAAAGh61ErTfwPCAQAAAKs8BXIpH+uLAQAAALydiZBPW5I/AQAAADfIuxNQqaKoBAAAAPP/FNWrUnBZAwAAAG/1LuhY5sW9AQAAAJGxyLFjKOuSAQAAAJ/7UFqnONacAQAAABemvA0AYq6zAQAAABjvWKO2e6dwAQAAAPvFd7nXR+/WAQAAABoAAAABBIQgR2V0IHRoZSBjaGFpbidzIGluLWNvZGUgdmVyc2lvbi4oU1M1OFByZWZpeFUBCAIAFKggVGhlIGRlc2lnbmF0ZWQgU1M1OCBwcmVmaXggb2YgdGhpcyBjaGFpbi4AOQEgVGhpcyByZXBsYWNlcyB0aGUgInNzNThGb3JtYXQiIHByb3BlcnR5IGRlY2xhcmVkIGluIHRoZSBjaGFpbiBzcGVjLiBSZWFzb24gaXMxASB0aGF0IHRoZSBydW50aW1lIHNob3VsZCBrbm93IGFib3V0IHRoZSBwcmVmaXggaW4gb3JkZXIgdG8gbWFrZSB1c2Ugb2YgaXQgYXNwIGFuIGlkZW50aWZpZXIgb2YgdGhlIGNoYWluLgF5CAAAEEJhYmUBEEJhYmVEKEVwb2NoSW5kZXgBADAgAAAAAAAAAAAEVCBDdXJyZW50IGVwb2NoIGluZGV4LixBdXRob3JpdGllcwEAfQgEAARsIEN1cnJlbnQgZXBvY2ggYXV0aG9yaXRpZXMuLEdlbmVzaXNTbG90AQCBASAAAAAAAAAAAAj4IFRoZSBzbG90IGF0IHdoaWNoIHRoZSBmaXJzdCBlcG9jaCBhY3R1YWxseSBzdGFydGVkLiBUaGlzIGlzIDCQIHVudGlsIHRoZSBmaXJzdCBibG9jayBvZiB0aGUgY2hhaW4uLEN1cnJlbnRTbG90AQCBASAAAAAAAAAAAARUIEN1cnJlbnQgc2xvdCBudW1iZXIuKFJhbmRvbW5lc3MBAASAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAouCBUaGUgZXBvY2ggcmFuZG9tbmVzcyBmb3IgdGhlICpjdXJyZW50KiBlcG9jaC4ALCAjIFNlY3VyaXR5AAUBIFRoaXMgTVVTVCBOT1QgYmUgdXNlZCBmb3IgZ2FtYmxpbmcsIGFzIGl0IGNhbiBiZSBpbmZsdWVuY2VkIGJ5IGH4IG1hbGljaW91cyB2YWxpZGF0b3IgaW4gdGhlIHNob3J0IHRlcm0uIEl0IE1BWSBiZSB1c2VkIGluIG1hbnkVASBjcnlwdG9ncmFwaGljIHByb3RvY29scywgaG93ZXZlciwgc28gbG9uZyBhcyBvbmUgcmVtZW1iZXJzIHRoYXQgdGhpcxUBIChsaWtlIGV2ZXJ5dGhpbmcgZWxzZSBvbi1jaGFpbikgaXQgaXMgcHVibGljLiBGb3IgZXhhbXBsZSwgaXQgY2FuIGJlBQEgdXNlZCB3aGVyZSBhIG51bWJlciBpcyBuZWVkZWQgdGhhdCBjYW5ub3QgaGF2ZSBiZWVuIGNob3NlbiBieSBhbg0BIGFkdmVyc2FyeSwgZm9yIHB1cnBvc2VzIHN1Y2ggYXMgcHVibGljLWNvaW4gemVyby1rbm93bGVkZ2UgcHJvb2ZzLmBQZW5kaW5nRXBvY2hDb25maWdDaGFuZ2UAAIkBBAAEYQEgUGVuZGluZyBlcG9jaCBjb25maWd1cmF0aW9uIGNoYW5nZSB0aGF0IHdpbGwgYmUgYXBwbGllZCB3aGVuIHRoZSBuZXh0IGVwb2NoIGlzIGVuYWN0ZWQuOE5leHRSYW5kb21uZXNzAQAEgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFwgTmV4dCBlcG9jaCByYW5kb21uZXNzLjxOZXh0QXV0aG9yaXRpZXMBAH0IBAAEYCBOZXh0IGVwb2NoIGF1dGhvcml0aWVzLjBTZWdtZW50SW5kZXgBABAQAAAAACR8IFJhbmRvbW5lc3MgdW5kZXIgY29uc3RydWN0aW9uLgD4IFdlIG1ha2UgYSB0cmFkZS1vZmYgYmV0d2VlbiBzdG9yYWdlIGFjY2Vzc2VzIGFuZCBsaXN0IGxlbmd0aC4BASBXZSBzdG9yZSB0aGUgdW5kZXItY29uc3RydWN0aW9uIHJhbmRvbW5lc3MgaW4gc2VnbWVudHMgb2YgdXAgdG+UIGBVTkRFUl9DT05TVFJVQ1RJT05fU0VHTUVOVF9MRU5HVEhgLgDsIE9uY2UgYSBzZWdtZW50IHJlYWNoZXMgdGhpcyBsZW5ndGgsIHdlIGJlZ2luIHRoZSBuZXh0IG9uZS4JASBXZSByZXNldCBhbGwgc2VnbWVudHMgYW5kIHJldHVybiB0byBgMGAgYXQgdGhlIGJlZ2lubmluZyBvZiBldmVyeRwgZXBvY2guRFVuZGVyQ29uc3RydWN0aW9uAQEEBRCJCAQABBUBIFRXT1gtTk9URTogYFNlZ21lbnRJbmRleGAgaXMgYW4gaW5jcmVhc2luZyBpbnRlZ2VyLCBzbyB0aGlzIGlzIG9rYXkuLEluaXRpYWxpemVkAACRCAQACAEBIFRlbXBvcmFyeSB2YWx1ZSAoY2xlYXJlZCBhdCBibG9jayBmaW5hbGl6YXRpb24pIHdoaWNoIGlzIGBTb21lYB0BIGlmIHBlci1ibG9jayBpbml0aWFsaXphdGlvbiBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZCBmb3IgY3VycmVudCBibG9jay5MQXV0aG9yVnJmUmFuZG9tbmVzcwEAsQcEABAVASBUaGlzIGZpZWxkIHNob3VsZCBhbHdheXMgYmUgcG9wdWxhdGVkIGR1cmluZyBibG9jayBwcm9jZXNzaW5nIHVubGVzcxkBIHNlY29uZGFyeSBwbGFpbiBzbG90cyBhcmUgZW5hYmxlZCAod2hpY2ggZG9uJ3QgY29udGFpbiBhIFZSRiBvdXRwdXQpLgBJASBJdCBpcyBzZXQgaW4gYG9uX2ZpbmFsaXplYCwgYmVmb3JlIGl0IHdpbGwgY29udGFpbiB0aGUgdmFsdWUgZnJvbSB0aGUgbGFzdCBibG9jay4oRXBvY2hTdGFydAEA9QIgAAAAAAAAAAAUXQEgVGhlIGJsb2NrIG51bWJlcnMgd2hlbiB0aGUgbGFzdCBhbmQgY3VycmVudCBlcG9jaCBoYXZlIHN0YXJ0ZWQsIHJlc3BlY3RpdmVseSBgTi0xYCBhbmQUIGBOYC5JASBOT1RFOiBXZSB0cmFjayB0aGlzIGlzIGluIG9yZGVyIHRvIGFubm90YXRlIHRoZSBibG9jayBudW1iZXIgd2hlbiBhIGdpdmVuIHBvb2wgb2ZZASBlbnRyb3B5IHdhcyBmaXhlZCAoaS5lLiBpdCB3YXMga25vd24gdG8gY2hhaW4gb2JzZXJ2ZXJzKS4gU2luY2UgZXBvY2hzIGFyZSBkZWZpbmVkIGluWQEgc2xvdHMsIHdoaWNoIG1heSBiZSBza2lwcGVkLCB0aGUgYmxvY2sgbnVtYmVycyBtYXkgbm90IGxpbmUgdXAgd2l0aCB0aGUgc2xvdCBudW1iZXJzLiBMYXRlbmVzcwEAEBAAAAAAFNggSG93IGxhdGUgdGhlIGN1cnJlbnQgYmxvY2sgaXMgY29tcGFyZWQgdG8gaXRzIHBhcmVudC4AFQEgVGhpcyBlbnRyeSBpcyBwb3B1bGF0ZWQgYXMgcGFydCBvZiBibG9jayBleGVjdXRpb24gYW5kIGlzIGNsZWFuZWQgdXARASBvbiBibG9jayBmaW5hbGl6YXRpb24uIFF1ZXJ5aW5nIHRoaXMgc3RvcmFnZSBlbnRyeSBvdXRzaWRlIG9mIGJsb2NrsCBleGVjdXRpb24gY29udGV4dCBzaG91bGQgYWx3YXlzIHlpZWxkIHplcm8uLEVwb2NoQ29uZmlnAACpCAQACGEBIFRoZSBjb25maWd1cmF0aW9uIGZvciB0aGUgY3VycmVudCBlcG9jaC4gU2hvdWxkIG5ldmVyIGJlIGBOb25lYCBhcyBpdCBpcyBpbml0aWFsaXplZCBpbiQgZ2VuZXNpcy48TmV4dEVwb2NoQ29uZmlnAACpCAQACC0BIFRoZSBjb25maWd1cmF0aW9uIGZvciB0aGUgbmV4dCBlcG9jaCwgYE5vbmVgIGlmIHRoZSBjb25maWcgd2lsbCBub3QgY2hhbmdl6CAoeW91IGNhbiBmYWxsYmFjayB0byBgRXBvY2hDb25maWdgIGluc3RlYWQgaW4gdGhhdCBjYXNlKS40U2tpcHBlZEVwb2NocwEArQgEACApASBBIGxpc3Qgb2YgdGhlIGxhc3QgMTAwIHNraXBwZWQgZXBvY2hzIGFuZCB0aGUgY29ycmVzcG9uZGluZyBzZXNzaW9uIGluZGV4cCB3aGVuIHRoZSBlcG9jaCB3YXMgc2tpcHBlZC4AMQEgVGhpcyBpcyBvbmx5IHVzZWQgZm9yIHZhbGlkYXRpbmcgZXF1aXZvY2F0aW9uIHByb29mcy4gQW4gZXF1aXZvY2F0aW9uIHByb29mNQEgbXVzdCBjb250YWlucyBhIGtleS1vd25lcnNoaXAgcHJvb2YgZm9yIGEgZ2l2ZW4gc2Vzc2lvbiwgdGhlcmVmb3JlIHdlIG5lZWQgYTkBIHdheSB0byB0aWUgdG9nZXRoZXIgc2Vzc2lvbnMgYW5kIGVwb2NoIGluZGljZXMsIGkuZS4gd2UgbmVlZCB0byB2YWxpZGF0ZSB0aGF0KQEgYSB2YWxpZGF0b3Igd2FzIHRoZSBvd25lciBvZiBhIGdpdmVuIGtleSBvbiBhIGdpdmVuIHNlc3Npb24sIGFuZCB3aGF0IHRoZbAgYWN0aXZlIGVwb2NoIGluZGV4IHdhcyBkdXJpbmcgdGhhdCBzZXNzaW9uLgFxAQAQNEVwb2NoRHVyYXRpb24wIFgCAAAAAAAADOwgVGhlIGFtb3VudCBvZiB0aW1lLCBpbiBzbG90cywgdGhhdCBlYWNoIGVwb2NoIHNob3VsZCBsYXN0LhkBIE5PVEU6IEN1cnJlbnRseSBpdCBpcyBub3QgcG9zc2libGUgdG8gY2hhbmdlIHRoZSBlcG9jaCBkdXJhdGlvbiBhZnRlciEBIHRoZSBjaGFpbiBoYXMgc3RhcnRlZC4gQXR0ZW1wdGluZyB0byBkbyBzbyB3aWxsIGJyaWNrIGJsb2NrIHByb2R1Y3Rpb24uREV4cGVjdGVkQmxvY2tUaW1lMCBwFwAAAAAAABQFASBUaGUgZXhwZWN0ZWQgYXZlcmFnZSBibG9jayB0aW1lIGF0IHdoaWNoIEJBQkUgc2hvdWxkIGJlIGNyZWF0aW5nEQEgYmxvY2tzLiBTaW5jZSBCQUJFIGlzIHByb2JhYmlsaXN0aWMgaXQgaXMgbm90IHRyaXZpYWwgdG8gZmlndXJlIG91dAUBIHdoYXQgdGhlIGV4cGVjdGVkIGF2ZXJhZ2UgYmxvY2sgdGltZSBzaG91bGQgYmUgYmFzZWQgb24gdGhlIHNsb3QJASBkdXJhdGlvbiBhbmQgdGhlIHNlY3VyaXR5IHBhcmFtZXRlciBgY2AgKHdoZXJlIGAxIC0gY2AgcmVwcmVzZW50c6AgdGhlIHByb2JhYmlsaXR5IG9mIGEgc2xvdCBiZWluZyBlbXB0eSkuOE1heEF1dGhvcml0aWVzEBCghgEABIggTWF4IG51bWJlciBvZiBhdXRob3JpdGllcyBhbGxvd2VkNE1heE5vbWluYXRvcnMQEAACAAAE1CBUaGUgbWF4aW11bSBudW1iZXIgb2Ygbm9taW5hdG9ycyBmb3IgZWFjaCB2YWxpZGF0b3IuAbkIAQAkVGltZXN0YW1wASRUaW1lc3RhbXAIDE5vdwEAMCAAAAAAAAAAAASgIFRoZSBjdXJyZW50IHRpbWUgZm9yIHRoZSBjdXJyZW50IGJsb2NrLiREaWRVcGRhdGUBACAEABDYIFdoZXRoZXIgdGhlIHRpbWVzdGFtcCBoYXMgYmVlbiB1cGRhdGVkIGluIHRoaXMgYmxvY2suAFUBIFRoaXMgdmFsdWUgaXMgdXBkYXRlZCB0byBgdHJ1ZWAgdXBvbiBzdWNjZXNzZnVsIHN1Ym1pc3Npb24gb2YgYSB0aW1lc3RhbXAgYnkgYSBub2RlLkUBIEl0IGlzIHRoZW4gY2hlY2tlZCBhdCB0aGUgZW5kIG9mIGVhY2ggYmxvY2sgZXhlY3V0aW9uIGluIHRoZSBgb25fZmluYWxpemVgIGhvb2suAZUBAAQ0TWluaW11bVBlcmlvZDAguAsAAAAAAAAYjCBUaGUgbWluaW11bSBwZXJpb2QgYmV0d2VlbiBibG9ja3MuAE0BIEJlIGF3YXJlIHRoYXQgdGhpcyBpcyBkaWZmZXJlbnQgdG8gdGhlICpleHBlY3RlZCogcGVyaW9kIHRoYXQgdGhlIGJsb2NrIHByb2R1Y3Rpb25JASBhcHBhcmF0dXMgcHJvdmlkZXMuIFlvdXIgY2hvc2VuIGNvbnNlbnN1cyBzeXN0ZW0gd2lsbCBnZW5lcmFsbHkgd29yayB3aXRoIHRoaXMgdG9hASBkZXRlcm1pbmUgYSBzZW5zaWJsZSBibG9jayB0aW1lLiBGb3IgZXhhbXBsZSwgaW4gdGhlIEF1cmEgcGFsbGV0IGl0IHdpbGwgYmUgZG91YmxlIHRoaXNwIHBlcmlvZCBvbiBkZWZhdWx0IHNldHRpbmdzLgACABxJbmRpY2VzARxJbmRpY2VzBCBBY2NvdW50cwABBAIQvQgEAASIIFRoZSBsb29rdXAgZnJvbSBpbmRleCB0byBhY2NvdW50LgGZAQF8BBxEZXBvc2l0GEA0TdLCBwAAAAAAAAAAAAAABKwgVGhlIGRlcG9zaXQgbmVlZGVkIGZvciByZXNlcnZpbmcgYW4gaW5kZXguAcEIAwAgQmFsYW5jZXMBIEJhbGFuY2VzHDRUb3RhbElzc3VhbmNlAQAYQAAAAAAAAAAAAAAAAAAAAAAEmCBUaGUgdG90YWwgdW5pdHMgaXNzdWVkIGluIHRoZSBzeXN0ZW0uQEluYWN0aXZlSXNzdWFuY2UBABhAAAAAAAAAAAAAAAAAAAAAAAQJASBUaGUgdG90YWwgdW5pdHMgb2Ygb3V0c3RhbmRpbmcgZGVhY3RpdmF0ZWQgYmFsYW5jZSBpbiB0aGUgc3lzdGVtLhxBY2NvdW50AQEEAgAUAQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAYAkBIFRoZSBCYWxhbmNlcyBwYWxsZXQgZXhhbXBsZSBvZiBzdG9yaW5nIHRoZSBiYWxhbmNlIG9mIGFuIGFjY291bnQuACggIyBFeGFtcGxlADQgYGBgbm9jb21waWxlsCAgaW1wbCBwYWxsZXRfYmFsYW5jZXM6OkNvbmZpZyBmb3IgUnVudGltZSB7GQIgICAgdHlwZSBBY2NvdW50U3RvcmUgPSBTdG9yYWdlTWFwU2hpbTxTZWxmOjpBY2NvdW50PFJ1bnRpbWU+LCBmcmFtZV9zeXN0ZW06OlByb3ZpZGVyPFJ1bnRpbWU+LCBBY2NvdW50SWQsIFNlbGY6OkFjY291bnREYXRhPEJhbGFuY2U+PgwgIH0QIGBgYAAVASBZb3UgY2FuIGFsc28gc3RvcmUgdGhlIGJhbGFuY2Ugb2YgYW4gYWNjb3VudCBpbiB0aGUgYFN5c3RlbWAgcGFsbGV0LgAoICMgRXhhbXBsZQA0IGBgYG5vY29tcGlsZbAgIGltcGwgcGFsbGV0X2JhbGFuY2VzOjpDb25maWcgZm9yIFJ1bnRpbWUge3QgICB0eXBlIEFjY291bnRTdG9yZSA9IFN5c3RlbQwgIH0QIGBgYABRASBCdXQgdGhpcyBjb21lcyB3aXRoIHRyYWRlb2Zmcywgc3RvcmluZyBhY2NvdW50IGJhbGFuY2VzIGluIHRoZSBzeXN0ZW0gcGFsbGV0IHN0b3Jlc20BIGBmcmFtZV9zeXN0ZW1gIGRhdGEgYWxvbmdzaWRlIHRoZSBhY2NvdW50IGRhdGEgY29udHJhcnkgdG8gc3RvcmluZyBhY2NvdW50IGJhbGFuY2VzIGluIHRoZSkBIGBCYWxhbmNlc2AgcGFsbGV0LCB3aGljaCB1c2VzIGEgYFN0b3JhZ2VNYXBgIHRvIHN0b3JlIGJhbGFuY2VzIGRhdGEgb25seS5BASBOT1RFOiBUaGlzIGlzIG9ubHkgdXNlZCBpbiB0aGUgY2FzZSB0aGF0IHRoaXMgcGFsbGV0IGlzIHVzZWQgdG8gc3RvcmUgYmFsYW5jZXMuFExvY2tzAQEEAgDFCAQAELggQW55IGxpcXVpZGl0eSBsb2NrcyBvbiBzb21lIGFjY291bnQgYmFsYW5jZXMuJQEgTk9URTogU2hvdWxkIG9ubHkgYmUgYWNjZXNzZWQgd2hlbiBzZXR0aW5nLCBjaGFuZ2luZyBhbmQgZnJlZWluZyBhIGxvY2suAK0BIFVzZSBvZiBsb2NrcyBpcyBkZXByZWNhdGVkIGluIGZhdm91ciBvZiBmcmVlemVzLiBTZWUgYGh0dHBzOi8vZ2l0aHViLmNvbS9wYXJpdHl0ZWNoL3N1YnN0cmF0ZS9wdWxsLzEyOTUxL2AgUmVzZXJ2ZXMBAQQCANUIBAAMpCBOYW1lZCByZXNlcnZlcyBvbiBzb21lIGFjY291bnQgYmFsYW5jZXMuALEBIFVzZSBvZiByZXNlcnZlcyBpcyBkZXByZWNhdGVkIGluIGZhdm91ciBvZiBob2xkcy4gU2VlIGBodHRwczovL2dpdGh1Yi5jb20vcGFyaXR5dGVjaC9zdWJzdHJhdGUvcHVsbC8xMjk1MS9gFEhvbGRzAQEEAgDhCAQABGwgSG9sZHMgb24gYWNjb3VudCBiYWxhbmNlcy4cRnJlZXplcwEBBAIA+QgEAASIIEZyZWV6ZSBsb2NrcyBvbiBhY2NvdW50IGJhbGFuY2VzLgGpAQGAEEhFeGlzdGVudGlhbERlcG9zaXQYQFVD3hMAAAAAAAAAAAAAAAAgQQEgVGhlIG1pbmltdW0gYW1vdW50IHJlcXVpcmVkIHRvIGtlZXAgYW4gYWNjb3VudCBvcGVuLiBNVVNUIEJFIEdSRUFURVIgVEhBTiBaRVJPIQBZASBJZiB5b3UgKnJlYWxseSogbmVlZCBpdCB0byBiZSB6ZXJvLCB5b3UgY2FuIGVuYWJsZSB0aGUgZmVhdHVyZSBgaW5zZWN1cmVfemVyb19lZGAgZm9yYQEgdGhpcyBwYWxsZXQuIEhvd2V2ZXIsIHlvdSBkbyBzbyBhdCB5b3VyIG93biByaXNrOiB0aGlzIHdpbGwgb3BlbiB1cCBhIG1ham9yIERvUyB2ZWN0b3IuWQEgSW4gY2FzZSB5b3UgaGF2ZSBtdWx0aXBsZSBzb3VyY2VzIG9mIHByb3ZpZGVyIHJlZmVyZW5jZXMsIHlvdSBtYXkgYWxzbyBnZXQgdW5leHBlY3RlZIwgYmVoYXZpb3VyIGlmIHlvdSBzZXQgdGhpcyB0byB6ZXJvLgDwIEJvdHRvbSBsaW5lOiBEbyB5b3Vyc2VsZiBhIGZhdm91ciBhbmQgbWFrZSBpdCBhdCBsZWFzdCBvbmUhIE1heExvY2tzEBAyAAAAEPQgVGhlIG1heGltdW0gbnVtYmVyIG9mIGxvY2tzIHRoYXQgc2hvdWxkIGV4aXN0IG9uIGFuIGFjY291bnQu3CBOb3Qgc3RyaWN0bHkgZW5mb3JjZWQsIGJ1dCB1c2VkIGZvciB3ZWlnaHQgZXN0aW1hdGlvbi4ArQEgVXNlIG9mIGxvY2tzIGlzIGRlcHJlY2F0ZWQgaW4gZmF2b3VyIG9mIGZyZWV6ZXMuIFNlZSBgaHR0cHM6Ly9naXRodWIuY29tL3Bhcml0eXRlY2gvc3Vic3RyYXRlL3B1bGwvMTI5NTEvYCxNYXhSZXNlcnZlcxAQMgAAAAwNASBUaGUgbWF4aW11bSBudW1iZXIgb2YgbmFtZWQgcmVzZXJ2ZXMgdGhhdCBjYW4gZXhpc3Qgb24gYW4gYWNjb3VudC4AsQEgVXNlIG9mIHJlc2VydmVzIGlzIGRlcHJlY2F0ZWQgaW4gZmF2b3VyIG9mIGhvbGRzLiBTZWUgYGh0dHBzOi8vZ2l0aHViLmNvbS9wYXJpdHl0ZWNoL3N1YnN0cmF0ZS9wdWxsLzEyOTUxL2AoTWF4RnJlZXplcxAQCAAAAARhASBUaGUgbWF4aW11bSBudW1iZXIgb2YgaW5kaXZpZHVhbCBmcmVlemUgbG9ja3MgdGhhdCBjYW4gZXhpc3Qgb24gYW4gYWNjb3VudCBhdCBhbnkgdGltZS4BDQkEAEhUcmFuc2FjdGlvblBheW1lbnQBSFRyYW5zYWN0aW9uUGF5bWVudAhETmV4dEZlZU11bHRpcGxpZXIBACEHQAAAZKeztuANAAAAAAAAAAAAOFN0b3JhZ2VWZXJzaW9uAQARCQQAAAABiARgT3BlcmF0aW9uYWxGZWVNdWx0aXBsaWVyCAQFVFkBIEEgZmVlIG11bHRpcGxpZXIgZm9yIGBPcGVyYXRpb25hbGAgZXh0cmluc2ljcyB0byBjb21wdXRlICJ2aXJ0dWFsIHRpcCIgdG8gYm9vc3QgdGhlaXIsIGBwcmlvcml0eWAAUQEgVGhpcyB2YWx1ZSBpcyBtdWx0aXBsaWVkIGJ5IHRoZSBgZmluYWxfZmVlYCB0byBvYnRhaW4gYSAidmlydHVhbCB0aXAiIHRoYXQgaXMgbGF0ZXL0IGFkZGVkIHRvIGEgdGlwIGNvbXBvbmVudCBpbiByZWd1bGFyIGBwcmlvcml0eWAgY2FsY3VsYXRpb25zLk0BIEl0IG1lYW5zIHRoYXQgYSBgTm9ybWFsYCB0cmFuc2FjdGlvbiBjYW4gZnJvbnQtcnVuIGEgc2ltaWxhcmx5LXNpemVkIGBPcGVyYXRpb25hbGBBASBleHRyaW5zaWMgKHdpdGggbm8gdGlwKSwgYnkgaW5jbHVkaW5nIGEgdGlwIHZhbHVlIGdyZWF0ZXIgdGhhbiB0aGUgdmlydHVhbCB0aXAuADwgYGBgcnVzdCxpZ25vcmVAIC8vIEZvciBgTm9ybWFsYIwgbGV0IHByaW9yaXR5ID0gcHJpb3JpdHlfY2FsYyh0aXApOwBUIC8vIEZvciBgT3BlcmF0aW9uYWxgEQEgbGV0IHZpcnR1YWxfdGlwID0gKGluY2x1c2lvbl9mZWUgKyB0aXApICogT3BlcmF0aW9uYWxGZWVNdWx0aXBsaWVyO8QgbGV0IHByaW9yaXR5ID0gcHJpb3JpdHlfY2FsYyh0aXAgKyB2aXJ0dWFsX3RpcCk7ECBgYGAAUQEgTm90ZSB0aGF0IHNpbmNlIHdlIHVzZSBgZmluYWxfZmVlYCB0aGUgbXVsdGlwbGllciBhcHBsaWVzIGFsc28gdG8gdGhlIHJlZ3VsYXIgYHRpcGBdASBzZW50IHdpdGggdGhlIHRyYW5zYWN0aW9uLiBTbywgbm90IG9ubHkgZG9lcyB0aGUgdHJhbnNhY3Rpb24gZ2V0IGEgcHJpb3JpdHkgYnVtcCBiYXNlZGEBIG9uIHRoZSBgaW5jbHVzaW9uX2ZlZWAsIGJ1dCB3ZSBhbHNvIGFtcGxpZnkgdGhlIGltcGFjdCBvZiB0aXBzIGFwcGxpZWQgdG8gYE9wZXJhdGlvbmFsYDggdHJhbnNhY3Rpb25zLgAhAChBdXRob3JzaGlwAShBdXRob3JzaGlwBBhBdXRob3IAAAAEAARkIEF1dGhvciBvZiBjdXJyZW50IGJsb2NrLgAAAAAFABxTdGFraW5nARxTdGFraW5nrDhWYWxpZGF0b3JDb3VudAEAEBAAAAAABJwgVGhlIGlkZWFsIG51bWJlciBvZiBhY3RpdmUgdmFsaWRhdG9ycy5UTWluaW11bVZhbGlkYXRvckNvdW50AQAQEAAAAAAEQQEgTWluaW11bSBudW1iZXIgb2Ygc3Rha2luZyBwYXJ0aWNpcGFudHMgYmVmb3JlIGVtZXJnZW5jeSBjb25kaXRpb25zIGFyZSBpbXBvc2VkLjRJbnZ1bG5lcmFibGVzAQCtAQQADFkBIEFueSB2YWxpZGF0b3JzIHRoYXQgbWF5IG5ldmVyIGJlIHNsYXNoZWQgb3IgZm9yY2libHkga2lja2VkLiBJdCdzIGEgVmVjIHNpbmNlIHRoZXkncmVNASBlYXN5IHRvIGluaXRpYWxpemUgYW5kIHRoZSBwZXJmb3JtYW5jZSBoaXQgaXMgbWluaW1hbCAod2UgZXhwZWN0IG5vIG1vcmUgdGhhbiBmb3VyrCBpbnZ1bG5lcmFibGVzKSBhbmQgcmVzdHJpY3RlZCB0byB0ZXN0bmV0cy4YQm9uZGVkAAEEBQAABAAMAQEgTWFwIGZyb20gYWxsIGxvY2tlZCAic3Rhc2giIGFjY291bnRzIHRvIHRoZSBjb250cm9sbGVyIGFjY291bnQuANAgVFdPWC1OT1RFOiBTQUZFIHNpbmNlIGBBY2NvdW50SWRgIGlzIGEgc2VjdXJlIGhhc2guQE1pbk5vbWluYXRvckJvbmQBABhAAAAAAAAAAAAAAAAAAAAAAAQhASBUaGUgbWluaW11bSBhY3RpdmUgYm9uZCB0byBiZWNvbWUgYW5kIG1haW50YWluIHRoZSByb2xlIG9mIGEgbm9taW5hdG9yLkBNaW5WYWxpZGF0b3JCb25kAQAYQAAAAAAAAAAAAAAAAAAAAAAEIQEgVGhlIG1pbmltdW0gYWN0aXZlIGJvbmQgdG8gYmVjb21lIGFuZCBtYWludGFpbiB0aGUgcm9sZSBvZiBhIHZhbGlkYXRvci5ITWluaW11bUFjdGl2ZVN0YWtlAQAYQAAAAAAAAAAAAAAAAAAAAAAEEQEgVGhlIG1pbmltdW0gYWN0aXZlIG5vbWluYXRvciBzdGFrZSBvZiB0aGUgbGFzdCBzdWNjZXNzZnVsIGVsZWN0aW9uLjRNaW5Db21taXNzaW9uAQCUEAAAAAAM6CBUaGUgbWluaW11bSBhbW91bnQgb2YgY29tbWlzc2lvbiB0aGF0IHZhbGlkYXRvcnMgY2FuIHNldC4AgCBJZiBzZXQgdG8gYDBgLCBubyBsaW1pdCBleGlzdHMuGExlZGdlcgABBAIAFQkEABBFASBNYXAgZnJvbSBhbGwgKHVubG9ja2VkKSAiY29udHJvbGxlciIgYWNjb3VudHMgdG8gdGhlIGluZm8gcmVnYXJkaW5nIHRoZSBzdGFraW5nLgB1ASBOb3RlOiBBbGwgdGhlIHJlYWRzIGFuZCBtdXRhdGlvbnMgdG8gdGhpcyBzdG9yYWdlICpNVVNUKiBiZSBkb25lIHRocm91Z2ggdGhlIG1ldGhvZHMgZXhwb3NlZOggYnkgW2BTdGFraW5nTGVkZ2VyYF0gdG8gZW5zdXJlIGRhdGEgYW5kIGxvY2sgY29uc2lzdGVuY3kuFFBheWVlAAEEBQCQBAAM5CBXaGVyZSB0aGUgcmV3YXJkIHBheW1lbnQgc2hvdWxkIGJlIG1hZGUuIEtleWVkIGJ5IHN0YXNoLgDQIFRXT1gtTk9URTogU0FGRSBzaW5jZSBgQWNjb3VudElkYCBpcyBhIHNlY3VyZSBoYXNoLihWYWxpZGF0b3JzAQEEBQCYCAAADEUBIFRoZSBtYXAgZnJvbSAod2FubmFiZSkgdmFsaWRhdG9yIHN0YXNoIGtleSB0byB0aGUgcHJlZmVyZW5jZXMgb2YgdGhhdCB2YWxpZGF0b3IuANAgVFdPWC1OT1RFOiBTQUZFIHNpbmNlIGBBY2NvdW50SWRgIGlzIGEgc2VjdXJlIGhhc2guUENvdW50ZXJGb3JWYWxpZGF0b3JzAQAQEAAAAAAErENvdW50ZXIgZm9yIHRoZSByZWxhdGVkIGNvdW50ZWQgc3RvcmFnZSBtYXBITWF4VmFsaWRhdG9yc0NvdW50AAAQBAAMMQEgVGhlIG1heGltdW0gdmFsaWRhdG9yIGNvdW50IGJlZm9yZSB3ZSBzdG9wIGFsbG93aW5nIG5ldyB2YWxpZGF0b3JzIHRvIGpvaW4uANAgV2hlbiB0aGlzIHZhbHVlIGlzIG5vdCBzZXQsIG5vIGxpbWl0cyBhcmUgZW5mb3JjZWQuKE5vbWluYXRvcnMAAQQFAB0JBABMdQEgVGhlIG1hcCBmcm9tIG5vbWluYXRvciBzdGFzaCBrZXkgdG8gdGhlaXIgbm9taW5hdGlvbiBwcmVmZXJlbmNlcywgbmFtZWx5IHRoZSB2YWxpZGF0b3JzIHRoYXRYIHRoZXkgd2lzaCB0byBzdXBwb3J0LgA5ASBOb3RlIHRoYXQgdGhlIGtleXMgb2YgdGhpcyBzdG9yYWdlIG1hcCBtaWdodCBiZWNvbWUgbm9uLWRlY29kYWJsZSBpbiBjYXNlIHRoZS0BIGFjY291bnQncyBbYE5vbWluYXRpb25zUXVvdGE6Ok1heE5vbWluYXRpb25zYF0gY29uZmlndXJhdGlvbiBpcyBkZWNyZWFzZWQukCBJbiB0aGlzIHJhcmUgY2FzZSwgdGhlc2Ugbm9taW5hdG9yc2UBIGFyZSBzdGlsbCBleGlzdGVudCBpbiBzdG9yYWdlLCB0aGVpciBrZXkgaXMgY29ycmVjdCBhbmQgcmV0cmlldmFibGUgKGkuZS4gYGNvbnRhaW5zX2tleWBxASBpbmRpY2F0ZXMgdGhhdCB0aGV5IGV4aXN0KSwgYnV0IHRoZWlyIHZhbHVlIGNhbm5vdCBiZSBkZWNvZGVkLiBUaGVyZWZvcmUsIHRoZSBub24tZGVjb2RhYmxlbQEgbm9taW5hdG9ycyB3aWxsIGVmZmVjdGl2ZWx5IG5vdC1leGlzdCwgdW50aWwgdGhleSByZS1zdWJtaXQgdGhlaXIgcHJlZmVyZW5jZXMgc3VjaCB0aGF0IGl0AQEgaXMgd2l0aGluIHRoZSBib3VuZHMgb2YgdGhlIG5ld2x5IHNldCBgQ29uZmlnOjpNYXhOb21pbmF0aW9uc2AuAGEBIFRoaXMgaW1wbGllcyB0aGF0IGA6Oml0ZXJfa2V5cygpLmNvdW50KClgIGFuZCBgOjppdGVyKCkuY291bnQoKWAgbWlnaHQgcmV0dXJuIGRpZmZlcmVudG0BIHZhbHVlcyBmb3IgdGhpcyBtYXAuIE1vcmVvdmVyLCB0aGUgbWFpbiBgOjpjb3VudCgpYCBpcyBhbGlnbmVkIHdpdGggdGhlIGZvcm1lciwgbmFtZWx5IHRoZWwgbnVtYmVyIG9mIGtleXMgdGhhdCBleGlzdC4AbQEgTGFzdGx5LCBpZiBhbnkgb2YgdGhlIG5vbWluYXRvcnMgYmVjb21lIG5vbi1kZWNvZGFibGUsIHRoZXkgY2FuIGJlIGNoaWxsZWQgaW1tZWRpYXRlbHkgdmlhuCBbYENhbGw6OmNoaWxsX290aGVyYF0gZGlzcGF0Y2hhYmxlIGJ5IGFueW9uZS4A0CBUV09YLU5PVEU6IFNBRkUgc2luY2UgYEFjY291bnRJZGAgaXMgYSBzZWN1cmUgaGFzaC5QQ291bnRlckZvck5vbWluYXRvcnMBABAQAAAAAASsQ291bnRlciBmb3IgdGhlIHJlbGF0ZWQgY291bnRlZCBzdG9yYWdlIG1hcDhWaXJ0dWFsU3Rha2VycwABBAUAoQEEABjIIFN0YWtlcnMgd2hvc2UgZnVuZHMgYXJlIG1hbmFnZWQgYnkgb3RoZXIgcGFsbGV0cy4AdQEgVGhpcyBwYWxsZXQgZG9lcyBub3QgYXBwbHkgYW55IGxvY2tzIG9uIHRoZW0sIHRoZXJlZm9yZSB0aGV5IGFyZSBvbmx5IHZpcnR1YWxseSBib25kZWQuIFRoZXltASBhcmUgZXhwZWN0ZWQgdG8gYmUga2V5bGVzcyBhY2NvdW50cyBhbmQgaGVuY2Ugc2hvdWxkIG5vdCBiZSBhbGxvd2VkIHRvIG11dGF0ZSB0aGVpciBsZWRnZXJxASBkaXJlY3RseSB2aWEgdGhpcyBwYWxsZXQuIEluc3RlYWQsIHRoZXNlIGFjY291bnRzIGFyZSBtYW5hZ2VkIGJ5IG90aGVyIHBhbGxldHMgYW5kIGFjY2Vzc2VkKQEgdmlhIGxvdyBsZXZlbCBhcGlzLiBXZSBrZWVwIHRyYWNrIG9mIHRoZW0gdG8gZG8gbWluaW1hbCBpbnRlZ3JpdHkgY2hlY2tzLmBDb3VudGVyRm9yVmlydHVhbFN0YWtlcnMBABAQAAAAAASsQ291bnRlciBmb3IgdGhlIHJlbGF0ZWQgY291bnRlZCBzdG9yYWdlIG1hcEhNYXhOb21pbmF0b3JzQ291bnQAABAEAAwxASBUaGUgbWF4aW11bSBub21pbmF0b3IgY291bnQgYmVmb3JlIHdlIHN0b3AgYWxsb3dpbmcgbmV3IHZhbGlkYXRvcnMgdG8gam9pbi4A0CBXaGVuIHRoaXMgdmFsdWUgaXMgbm90IHNldCwgbm8gbGltaXRzIGFyZSBlbmZvcmNlZC4oQ3VycmVudEVyYQAAEAQAEFwgVGhlIGN1cnJlbnQgZXJhIGluZGV4LgBlASBUaGlzIGlzIHRoZSBsYXRlc3QgcGxhbm5lZCBlcmEsIGRlcGVuZGluZyBvbiBob3cgdGhlIFNlc3Npb24gcGFsbGV0IHF1ZXVlcyB0aGUgdmFsaWRhdG9ygCBzZXQsIGl0IG1pZ2h0IGJlIGFjdGl2ZSBvciBub3QuJEFjdGl2ZUVyYQAAJQkEABDYIFRoZSBhY3RpdmUgZXJhIGluZm9ybWF0aW9uLCBpdCBob2xkcyBpbmRleCBhbmQgc3RhcnQuAFkBIFRoZSBhY3RpdmUgZXJhIGlzIHRoZSBlcmEgYmVpbmcgY3VycmVudGx5IHJld2FyZGVkLiBWYWxpZGF0b3Igc2V0IG9mIHRoaXMgZXJhIG11c3QgYmWsIGVxdWFsIHRvIFtgU2Vzc2lvbkludGVyZmFjZTo6dmFsaWRhdG9yc2BdLlRFcmFzU3RhcnRTZXNzaW9uSW5kZXgAAQQFEBAEABBVASBUaGUgc2Vzc2lvbiBpbmRleCBhdCB3aGljaCB0aGUgZXJhIHN0YXJ0IGZvciB0aGUgbGFzdCBbYENvbmZpZzo6SGlzdG9yeURlcHRoYF0gZXJhcy4AYQEgTm90ZTogVGhpcyB0cmFja3MgdGhlIHN0YXJ0aW5nIHNlc3Npb24gKGkuZS4gc2Vzc2lvbiBpbmRleCB3aGVuIGVyYSBzdGFydCBiZWluZyBhY3RpdmUp8CBmb3IgdGhlIGVyYXMgaW4gYFtDdXJyZW50RXJhIC0gSElTVE9SWV9ERVBUSCwgQ3VycmVudEVyYV1gLixFcmFzU3Rha2VycwEBCAUFLQkxCQwAAAAgeCBFeHBvc3VyZSBvZiB2YWxpZGF0b3IgYXQgZXJhLgBhASBUaGlzIGlzIGtleWVkIGZpcnN0IGJ5IHRoZSBlcmEgaW5kZXggdG8gYWxsb3cgYnVsayBkZWxldGlvbiBhbmQgdGhlbiB0aGUgc3Rhc2ggYWNjb3VudC4AzCBJcyBpdCByZW1vdmVkIGFmdGVyIFtgQ29uZmlnOjpIaXN0b3J5RGVwdGhgXSBlcmFzLkEBIElmIHN0YWtlcnMgaGFzbid0IGJlZW4gc2V0IG9yIGhhcyBiZWVuIHJlbW92ZWQgdGhlbiBlbXB0eSBleHBvc3VyZSBpcyByZXR1cm5lZC4AKQEgTm90ZTogRGVwcmVjYXRlZCBzaW5jZSB2MTQuIFVzZSBgRXJhSW5mb2AgaW5zdGVhZCB0byB3b3JrIHdpdGggZXhwb3N1cmVzLkxFcmFzU3Rha2Vyc092ZXJ2aWV3AAEIBQUtCT0JBAAwuCBTdW1tYXJ5IG9mIHZhbGlkYXRvciBleHBvc3VyZSBhdCBhIGdpdmVuIGVyYS4AcQEgVGhpcyBjb250YWlucyB0aGUgdG90YWwgc3Rha2UgaW4gc3VwcG9ydCBvZiB0aGUgdmFsaWRhdG9yIGFuZCB0aGVpciBvd24gc3Rha2UuIEluIGFkZGl0aW9uLHUBIGl0IGNhbiBhbHNvIGJlIHVzZWQgdG8gZ2V0IHRoZSBudW1iZXIgb2Ygbm9taW5hdG9ycyBiYWNraW5nIHRoaXMgdmFsaWRhdG9yIGFuZCB0aGUgbnVtYmVyIG9maQEgZXhwb3N1cmUgcGFnZXMgdGhleSBhcmUgZGl2aWRlZCBpbnRvLiBUaGUgcGFnZSBjb3VudCBpcyB1c2VmdWwgdG8gZGV0ZXJtaW5lIHRoZSBudW1iZXIgb2asIHBhZ2VzIG9mIHJld2FyZHMgdGhhdCBuZWVkcyB0byBiZSBjbGFpbWVkLgBhASBUaGlzIGlzIGtleWVkIGZpcnN0IGJ5IHRoZSBlcmEgaW5kZXggdG8gYWxsb3cgYnVsayBkZWxldGlvbiBhbmQgdGhlbiB0aGUgc3Rhc2ggYWNjb3VudC6sIFNob3VsZCBvbmx5IGJlIGFjY2Vzc2VkIHRocm91Z2ggYEVyYUluZm9gLgDMIElzIGl0IHJlbW92ZWQgYWZ0ZXIgW2BDb25maWc6Okhpc3RvcnlEZXB0aGBdIGVyYXMuQQEgSWYgc3Rha2VycyBoYXNuJ3QgYmVlbiBzZXQgb3IgaGFzIGJlZW4gcmVtb3ZlZCB0aGVuIGVtcHR5IG92ZXJ2aWV3IGlzIHJldHVybmVkLkhFcmFzU3Rha2Vyc0NsaXBwZWQBAQgFBS0JMQkMAAAAQJggQ2xpcHBlZCBFeHBvc3VyZSBvZiB2YWxpZGF0b3IgYXQgZXJhLgBlASBOb3RlOiBUaGlzIGlzIGRlcHJlY2F0ZWQsIHNob3VsZCBiZSB1c2VkIGFzIHJlYWQtb25seSBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUuMQEgTmV3IGBFeHBvc3VyZWBzIGFyZSBzdG9yZWQgaW4gYSBwYWdlZCBtYW5uZXIgaW4gYEVyYXNTdGFrZXJzUGFnZWRgIGluc3RlYWQuAFkBIFRoaXMgaXMgc2ltaWxhciB0byBbYEVyYXNTdGFrZXJzYF0gYnV0IG51bWJlciBvZiBub21pbmF0b3JzIGV4cG9zZWQgaXMgcmVkdWNlZCB0byB0aGWoIGBUOjpNYXhFeHBvc3VyZVBhZ2VTaXplYCBiaWdnZXN0IHN0YWtlcnMuHQEgKE5vdGU6IHRoZSBmaWVsZCBgdG90YWxgIGFuZCBgb3duYCBvZiB0aGUgZXhwb3N1cmUgcmVtYWlucyB1bmNoYW5nZWQpLvQgVGhpcyBpcyB1c2VkIHRvIGxpbWl0IHRoZSBpL28gY29zdCBmb3IgdGhlIG5vbWluYXRvciBwYXlvdXQuAF0BIFRoaXMgaXMga2V5ZWQgZmlzdCBieSB0aGUgZXJhIGluZGV4IHRvIGFsbG93IGJ1bGsgZGVsZXRpb24gYW5kIHRoZW4gdGhlIHN0YXNoIGFjY291bnQuAMwgSXQgaXMgcmVtb3ZlZCBhZnRlciBbYENvbmZpZzo6SGlzdG9yeURlcHRoYF0gZXJhcy5BASBJZiBzdGFrZXJzIGhhc24ndCBiZWVuIHNldCBvciBoYXMgYmVlbiByZW1vdmVkIHRoZW4gZW1wdHkgZXhwb3N1cmUgaXMgcmV0dXJuZWQuACkBIE5vdGU6IERlcHJlY2F0ZWQgc2luY2UgdjE0LiBVc2UgYEVyYUluZm9gIGluc3RlYWQgdG8gd29yayB3aXRoIGV4cG9zdXJlcy5ARXJhc1N0YWtlcnNQYWdlZAABDAUFBUEJRQkEABjAIFBhZ2luYXRlZCBleHBvc3VyZSBvZiBhIHZhbGlkYXRvciBhdCBnaXZlbiBlcmEuAHEBIFRoaXMgaXMga2V5ZWQgZmlyc3QgYnkgdGhlIGVyYSBpbmRleCB0byBhbGxvdyBidWxrIGRlbGV0aW9uLCB0aGVuIHN0YXNoIGFjY291bnQgYW5kIGZpbmFsbHnUIHRoZSBwYWdlLiBTaG91bGQgb25seSBiZSBhY2Nlc3NlZCB0aHJvdWdoIGBFcmFJbmZvYC4A1CBUaGlzIGlzIGNsZWFyZWQgYWZ0ZXIgW2BDb25maWc6Okhpc3RvcnlEZXB0aGBdIGVyYXMuOENsYWltZWRSZXdhcmRzAQEIBQUtCcEBBAAY3CBIaXN0b3J5IG9mIGNsYWltZWQgcGFnZWQgcmV3YXJkcyBieSBlcmEgYW5kIHZhbGlkYXRvci4AaQEgVGhpcyBpcyBrZXllZCBieSBlcmEgYW5kIHZhbGlkYXRvciBzdGFzaCB3aGljaCBtYXBzIHRvIHRoZSBzZXQgb2YgcGFnZSBpbmRleGVzIHdoaWNoIGhhdmU4IGJlZW4gY2xhaW1lZC4AzCBJdCBpcyByZW1vdmVkIGFmdGVyIFtgQ29uZmlnOjpIaXN0b3J5RGVwdGhgXSBlcmFzLkhFcmFzVmFsaWRhdG9yUHJlZnMBAQgFBS0JmAgAABQRASBTaW1pbGFyIHRvIGBFcmFzU3Rha2Vyc2AsIHRoaXMgaG9sZHMgdGhlIHByZWZlcmVuY2VzIG9mIHZhbGlkYXRvcnMuAGEBIFRoaXMgaXMga2V5ZWQgZmlyc3QgYnkgdGhlIGVyYSBpbmRleCB0byBhbGxvdyBidWxrIGRlbGV0aW9uIGFuZCB0aGVuIHRoZSBzdGFzaCBhY2NvdW50LgDMIElzIGl0IHJlbW92ZWQgYWZ0ZXIgW2BDb25maWc6Okhpc3RvcnlEZXB0aGBdIGVyYXMuTEVyYXNWYWxpZGF0b3JSZXdhcmQAAQQFEBgEAAwtASBUaGUgdG90YWwgdmFsaWRhdG9yIGVyYSBwYXlvdXQgZm9yIHRoZSBsYXN0IFtgQ29uZmlnOjpIaXN0b3J5RGVwdGhgXSBlcmFzLgAhASBFcmFzIHRoYXQgaGF2ZW4ndCBmaW5pc2hlZCB5ZXQgb3IgaGFzIGJlZW4gcmVtb3ZlZCBkb2Vzbid0IGhhdmUgcmV3YXJkLkBFcmFzUmV3YXJkUG9pbnRzAQEEBRBJCRQAAAAAAAjQIFJld2FyZHMgZm9yIHRoZSBsYXN0IFtgQ29uZmlnOjpIaXN0b3J5RGVwdGhgXSBlcmFzLiUBIElmIHJld2FyZCBoYXNuJ3QgYmVlbiBzZXQgb3IgaGFzIGJlZW4gcmVtb3ZlZCB0aGVuIDAgcmV3YXJkIGlzIHJldHVybmVkLjhFcmFzVG90YWxTdGFrZQEBBAUQGEAAAAAAAAAAAAAAAAAAAAAACBEBIFRoZSB0b3RhbCBhbW91bnQgc3Rha2VkIGZvciB0aGUgbGFzdCBbYENvbmZpZzo6SGlzdG9yeURlcHRoYF0gZXJhcy4dASBJZiB0b3RhbCBoYXNuJ3QgYmVlbiBzZXQgb3IgaGFzIGJlZW4gcmVtb3ZlZCB0aGVuIDAgc3Rha2UgaXMgcmV0dXJuZWQuIEZvcmNlRXJhAQCgBAAEVCBNb2RlIG9mIGVyYSBmb3JjaW5nLkBNYXhTdGFrZWRSZXdhcmRzAAC9AQQADBkBIE1heGltdW0gc3Rha2VkIHJld2FyZHMsIGkuZS4gdGhlIHBlcmNlbnRhZ2Ugb2YgdGhlIGVyYSBpbmZsYXRpb24gdGhhdGwgaXMgdXNlZCBmb3Igc3Rha2UgcmV3YXJkcy6sIFNlZSBbRXJhIHBheW91dF0oLi9pbmRleC5odG1sI2VyYS1wYXlvdXQpLkxTbGFzaFJld2FyZEZyYWN0aW9uAQCUEAAAAAAM+CBUaGUgcGVyY2VudGFnZSBvZiB0aGUgc2xhc2ggdGhhdCBpcyBkaXN0cmlidXRlZCB0byByZXBvcnRlcnMuAOQgVGhlIHJlc3Qgb2YgdGhlIHNsYXNoZWQgdmFsdWUgaXMgaGFuZGxlZCBieSB0aGUgYFNsYXNoYC5MQ2FuY2VsZWRTbGFzaFBheW91dAEAGEAAAAAAAAAAAAAAAAAAAAAACBUBIFRoZSBhbW91bnQgb2YgY3VycmVuY3kgZ2l2ZW4gdG8gcmVwb3J0ZXJzIG9mIGEgc2xhc2ggZXZlbnQgd2hpY2ggd2Fz7CBjYW5jZWxlZCBieSBleHRyYW9yZGluYXJ5IGNpcmN1bXN0YW5jZXMgKGUuZy4gZ292ZXJuYW5jZSkuQFVuYXBwbGllZFNsYXNoZXMBAQQFEFkJBAAExCBBbGwgdW5hcHBsaWVkIHNsYXNoZXMgdGhhdCBhcmUgcXVldWVkIGZvciBsYXRlci4oQm9uZGVkRXJhcwEAQQgEABAlASBBIG1hcHBpbmcgZnJvbSBzdGlsbC1ib25kZWQgZXJhcyB0byB0aGUgZmlyc3Qgc2Vzc2lvbiBpbmRleCBvZiB0aGF0IGVyYS4AyCBNdXN0IGNvbnRhaW5zIGluZm9ybWF0aW9uIGZvciBlcmFzIGZvciB0aGUgcmFuZ2U6vCBgW2FjdGl2ZV9lcmEgLSBib3VuZGluZ19kdXJhdGlvbjsgYWN0aXZlX2VyYV1gTFZhbGlkYXRvclNsYXNoSW5FcmEAAQgFBS0JYQkEAAhFASBBbGwgc2xhc2hpbmcgZXZlbnRzIG9uIHZhbGlkYXRvcnMsIG1hcHBlZCBieSBlcmEgdG8gdGhlIGhpZ2hlc3Qgc2xhc2ggcHJvcG9ydGlvbnAgYW5kIHNsYXNoIHZhbHVlIG9mIHRoZSBlcmEuTE5vbWluYXRvclNsYXNoSW5FcmEAAQgFBS0JGAQABGEBIEFsbCBzbGFzaGluZyBldmVudHMgb24gbm9taW5hdG9ycywgbWFwcGVkIGJ5IGVyYSB0byB0aGUgaGlnaGVzdCBzbGFzaCB2YWx1ZSBvZiB0aGUgZXJhLjRTbGFzaGluZ1NwYW5zAAEEBQBlCQQABIwgU2xhc2hpbmcgc3BhbnMgZm9yIHN0YXNoIGFjY291bnRzLiRTcGFuU2xhc2gBAQQFVQlpCYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAg9ASBSZWNvcmRzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBtYXhpbXVtIHNsYXNoIG9mIGEgc3Rhc2ggd2l0aGluIGEgc2xhc2hpbmcgc3Bhbiy4IGFzIHdlbGwgYXMgaG93IG11Y2ggcmV3YXJkIGhhcyBiZWVuIHBhaWQgb3V0LlRDdXJyZW50UGxhbm5lZFNlc3Npb24BABAQAAAAAAzoIFRoZSBsYXN0IHBsYW5uZWQgc2Vzc2lvbiBzY2hlZHVsZWQgYnkgdGhlIHNlc3Npb24gcGFsbGV0LgBxASBUaGlzIGlzIGJhc2ljYWxseSBpbiBzeW5jIHdpdGggdGhlIGNhbGwgdG8gW2BwYWxsZXRfc2Vzc2lvbjo6U2Vzc2lvbk1hbmFnZXI6Om5ld19zZXNzaW9uYF0uSERpc2FibGVkVmFsaWRhdG9ycwEAwQEEABx1ASBJbmRpY2VzIG9mIHZhbGlkYXRvcnMgdGhhdCBoYXZlIG9mZmVuZGVkIGluIHRoZSBhY3RpdmUgZXJhLiBUaGUgb2ZmZW5kZXJzIGFyZSBkaXNhYmxlZCBmb3IgYWkBIHdob2xlIGVyYS4gRm9yIHRoaXMgcmVhc29uIHRoZXkgYXJlIGtlcHQgaGVyZSAtIG9ubHkgc3Rha2luZyBwYWxsZXQga25vd3MgYWJvdXQgZXJhcy4gVGhlVQEgaW1wbGVtZW50b3Igb2YgW2BEaXNhYmxpbmdTdHJhdGVneWBdIGRlZmluZXMgaWYgYSB2YWxpZGF0b3Igc2hvdWxkIGJlIGRpc2FibGVkIHdoaWNobQEgaW1wbGljaXRseSBtZWFucyB0aGF0IHRoZSBpbXBsZW1lbnRvciBhbHNvIGNvbnRyb2xzIHRoZSBtYXggbnVtYmVyIG9mIGRpc2FibGVkIHZhbGlkYXRvcnMuAG0BIFRoZSB2ZWMgaXMgYWx3YXlzIGtlcHQgc29ydGVkIHNvIHRoYXQgd2UgY2FuIGZpbmQgd2hldGhlciBhIGdpdmVuIHZhbGlkYXRvciBoYXMgcHJldmlvdXNseXggb2ZmZW5kZWQgdXNpbmcgYmluYXJ5IHNlYXJjaC44Q2hpbGxUaHJlc2hvbGQAAL0BBAAMUQEgVGhlIHRocmVzaG9sZCBmb3Igd2hlbiB1c2VycyBjYW4gc3RhcnQgY2FsbGluZyBgY2hpbGxfb3RoZXJgIGZvciBvdGhlciB2YWxpZGF0b3JzIC9ZASBub21pbmF0b3JzLiBUaGUgdGhyZXNob2xkIGlzIGNvbXBhcmVkIHRvIHRoZSBhY3R1YWwgbnVtYmVyIG9mIHZhbGlkYXRvcnMgLyBub21pbmF0b3JzKQEgKGBDb3VudEZvcipgKSBpbiB0aGUgc3lzdGVtIGNvbXBhcmVkIHRvIHRoZSBjb25maWd1cmVkIG1heCAoYE1heCpDb3VudGApLgG1AQGMGDBIaXN0b3J5RGVwdGgQEFQAAABQjCBOdW1iZXIgb2YgZXJhcyB0byBrZWVwIGluIGhpc3RvcnkuAOggRm9sbG93aW5nIGluZm9ybWF0aW9uIGlzIGtlcHQgZm9yIGVyYXMgaW4gYFtjdXJyZW50X2VyYSAtCQEgSGlzdG9yeURlcHRoLCBjdXJyZW50X2VyYV1gOiBgRXJhc1N0YWtlcnNgLCBgRXJhc1N0YWtlcnNDbGlwcGVkYCwFASBgRXJhc1ZhbGlkYXRvclByZWZzYCwgYEVyYXNWYWxpZGF0b3JSZXdhcmRgLCBgRXJhc1Jld2FyZFBvaW50c2AsRQEgYEVyYXNUb3RhbFN0YWtlYCwgYEVyYXNTdGFydFNlc3Npb25JbmRleGAsIGBDbGFpbWVkUmV3YXJkc2AsIGBFcmFzU3Rha2Vyc1BhZ2VkYCxcIGBFcmFzU3Rha2Vyc092ZXJ2aWV3YC4A5CBNdXN0IGJlIG1vcmUgdGhhbiB0aGUgbnVtYmVyIG9mIGVyYXMgZGVsYXllZCBieSBzZXNzaW9uLvggSS5lLiBhY3RpdmUgZXJhIG11c3QgYWx3YXlzIGJlIGluIGhpc3RvcnkuIEkuZS4gYGFjdGl2ZV9lcmEgPsQgY3VycmVudF9lcmEgLSBoaXN0b3J5X2RlcHRoYCBtdXN0IGJlIGd1YXJhbnRlZWQuABEBIElmIG1pZ3JhdGluZyBhbiBleGlzdGluZyBwYWxsZXQgZnJvbSBzdG9yYWdlIHZhbHVlIHRvIGNvbmZpZyB2YWx1ZSzsIHRoaXMgc2hvdWxkIGJlIHNldCB0byBzYW1lIHZhbHVlIG9yIGdyZWF0ZXIgYXMgaW4gc3RvcmFnZS4AFQEgTm90ZTogYEhpc3RvcnlEZXB0aGAgaXMgdXNlZCBhcyB0aGUgdXBwZXIgYm91bmQgZm9yIHRoZSBgQm91bmRlZFZlY2AtASBpdGVtIGBTdGFraW5nTGVkZ2VyLmxlZ2FjeV9jbGFpbWVkX3Jld2FyZHNgLiBTZXR0aW5nIHRoaXMgdmFsdWUgbG93ZXIgdGhhbtggdGhlIGV4aXN0aW5nIHZhbHVlIGNhbiBsZWFkIHRvIGluY29uc2lzdGVuY2llcyBpbiB0aGUVASBgU3Rha2luZ0xlZGdlcmAgYW5kIHdpbGwgbmVlZCB0byBiZSBoYW5kbGVkIHByb3Blcmx5IGluIGEgbWlncmF0aW9uLvAgVGhlIHRlc3QgYHJlZHVjaW5nX2hpc3RvcnlfZGVwdGhfYWJydXB0YCBzaG93cyB0aGlzIGVmZmVjdC44U2Vzc2lvbnNQZXJFcmEQEAYAAAAEcCBOdW1iZXIgb2Ygc2Vzc2lvbnMgcGVyIGVyYS48Qm9uZGluZ0R1cmF0aW9uEBAcAAAABOQgTnVtYmVyIG9mIGVyYXMgdGhhdCBzdGFrZWQgZnVuZHMgbXVzdCByZW1haW4gYm9uZGVkIGZvci5IU2xhc2hEZWZlckR1cmF0aW9uEBAbAAAAEAEBIE51bWJlciBvZiBlcmFzIHRoYXQgc2xhc2hlcyBhcmUgZGVmZXJyZWQgYnksIGFmdGVyIGNvbXB1dGF0aW9uLgANASBUaGlzIHNob3VsZCBiZSBsZXNzIHRoYW4gdGhlIGJvbmRpbmcgZHVyYXRpb24uIFNldCB0byAwIGlmIHNsYXNoZXMVASBzaG91bGQgYmUgYXBwbGllZCBpbW1lZGlhdGVseSwgd2l0aG91dCBvcHBvcnR1bml0eSBmb3IgaW50ZXJ2ZW50aW9uLkxNYXhFeHBvc3VyZVBhZ2VTaXplEBAAAgAALLAgVGhlIG1heGltdW0gc2l6ZSBvZiBlYWNoIGBUOjpFeHBvc3VyZVBhZ2VgLgApASBBbiBgRXhwb3N1cmVQYWdlYCBpcyB3ZWFrbHkgYm91bmRlZCB0byBhIG1heGltdW0gb2YgYE1heEV4cG9zdXJlUGFnZVNpemVgMCBub21pbmF0b3JzLgAhASBGb3Igb2xkZXIgbm9uLXBhZ2VkIGV4cG9zdXJlLCBhIHJld2FyZCBwYXlvdXQgd2FzIHJlc3RyaWN0ZWQgdG8gdGhlIHRvcCEBIGBNYXhFeHBvc3VyZVBhZ2VTaXplYCBub21pbmF0b3JzLiBUaGlzIGlzIHRvIGxpbWl0IHRoZSBpL28gY29zdCBmb3IgdGhlSCBub21pbmF0b3IgcGF5b3V0LgBZASBOb3RlOiBgTWF4RXhwb3N1cmVQYWdlU2l6ZWAgaXMgdXNlZCB0byBib3VuZCBgQ2xhaW1lZFJld2FyZHNgIGFuZCBpcyB1bnNhZmUgdG8gcmVkdWNlkCB3aXRob3V0IGhhbmRsaW5nIGl0IGluIGEgbWlncmF0aW9uLkhNYXhVbmxvY2tpbmdDaHVua3MQECAAAAAoBQEgVGhlIG1heGltdW0gbnVtYmVyIG9mIGB1bmxvY2tpbmdgIGNodW5rcyBhIFtgU3Rha2luZ0xlZGdlcmBdIGNhbgkBIGhhdmUuIEVmZmVjdGl2ZWx5IGRldGVybWluZXMgaG93IG1hbnkgdW5pcXVlIGVyYXMgYSBzdGFrZXIgbWF5IGJlOCB1bmJvbmRpbmcgaW4uAPggTm90ZTogYE1heFVubG9ja2luZ0NodW5rc2AgaXMgdXNlZCBhcyB0aGUgdXBwZXIgYm91bmQgZm9yIHRoZQEBIGBCb3VuZGVkVmVjYCBpdGVtIGBTdGFraW5nTGVkZ2VyLnVubG9ja2luZ2AuIFNldHRpbmcgdGhpcyB2YWx1ZQUBIGxvd2VyIHRoYW4gdGhlIGV4aXN0aW5nIHZhbHVlIGNhbiBsZWFkIHRvIGluY29uc2lzdGVuY2llcyBpbiB0aGUJASBgU3Rha2luZ0xlZGdlcmAgYW5kIHdpbGwgbmVlZCB0byBiZSBoYW5kbGVkIHByb3Blcmx5IGluIGEgcnVudGltZQUBIG1pZ3JhdGlvbi4gVGhlIHRlc3QgYHJlZHVjaW5nX21heF91bmxvY2tpbmdfY2h1bmtzX2FicnVwdGAgc2hvd3M0IHRoaXMgZWZmZWN0LgFtCQYAIE9mZmVuY2VzASBPZmZlbmNlcwgcUmVwb3J0cwABBAU0cQkEAARJASBUaGUgcHJpbWFyeSBzdHJ1Y3R1cmUgdGhhdCBob2xkcyBhbGwgb2ZmZW5jZSByZWNvcmRzIGtleWVkIGJ5IHJlcG9ydCBpZGVudGlmaWVycy5YQ29uY3VycmVudFJlcG9ydHNJbmRleAEBCAUFeQkVAwQABCkBIEEgdmVjdG9yIG9mIHJlcG9ydHMgb2YgdGhlIHNhbWUga2luZCB0aGF0IGhhcHBlbmVkIGF0IHRoZSBzYW1lIHRpbWUgc2xvdC4AAaQAAAcAKEhpc3RvcmljYWwBKEhpc3RvcmljYWwISEhpc3RvcmljYWxTZXNzaW9ucwABBAUQfQkEAARdASBNYXBwaW5nIGZyb20gaGlzdG9yaWNhbCBzZXNzaW9uIGluZGljZXMgdG8gc2Vzc2lvbi1kYXRhIHJvb3QgaGFzaCBhbmQgdmFsaWRhdG9yIGNvdW50LixTdG9yZWRSYW5nZQAA9QIEAATkIFRoZSByYW5nZSBvZiBoaXN0b3JpY2FsIHNlc3Npb25zIHdlIHN0b3JlLiBbZmlyc3QsIGxhc3QpAAAAACIAHFNlc3Npb24BHFNlc3Npb24cKFZhbGlkYXRvcnMBAK0BBAAEfCBUaGUgY3VycmVudCBzZXQgb2YgdmFsaWRhdG9ycy4wQ3VycmVudEluZGV4AQAQEAAAAAAEeCBDdXJyZW50IGluZGV4IG9mIHRoZSBzZXNzaW9uLjRRdWV1ZWRDaGFuZ2VkAQAgBAAIOQEgVHJ1ZSBpZiB0aGUgdW5kZXJseWluZyBlY29ub21pYyBpZGVudGl0aWVzIG9yIHdlaWdodGluZyBiZWhpbmQgdGhlIHZhbGlkYXRvcnOkIGhhcyBjaGFuZ2VkIGluIHRoZSBxdWV1ZWQgdmFsaWRhdG9yIHNldC4oUXVldWVkS2V5cwEAgQkEAAg9ASBUaGUgcXVldWVkIGtleXMgZm9yIHRoZSBuZXh0IHNlc3Npb24uIFdoZW4gdGhlIG5leHQgc2Vzc2lvbiBiZWdpbnMsIHRoZXNlIGtleXPgIHdpbGwgYmUgdXNlZCB0byBkZXRlcm1pbmUgdGhlIHZhbGlkYXRvcidzIHNlc3Npb24ga2V5cy5IRGlzYWJsZWRWYWxpZGF0b3JzAQDBAQQAFIAgSW5kaWNlcyBvZiBkaXNhYmxlZCB2YWxpZGF0b3JzLgA9ASBUaGUgdmVjIGlzIGFsd2F5cyBrZXB0IHNvcnRlZCBzbyB0aGF0IHdlIGNhbiBmaW5kIHdoZXRoZXIgYSBnaXZlbiB2YWxpZGF0b3IgaXM9ASBkaXNhYmxlZCB1c2luZyBiaW5hcnkgc2VhcmNoLiBJdCBnZXRzIGNsZWFyZWQgd2hlbiBgb25fc2Vzc2lvbl9lbmRpbmdgIHJldHVybnNkIGEgbmV3IHNldCBvZiBpZGVudGl0aWVzLiBOZXh0S2V5cwABBAUA9QEEAAScIFRoZSBuZXh0IHNlc3Npb24ga2V5cyBmb3IgYSB2YWxpZGF0b3IuIEtleU93bmVyAAEEBYkJAAQABAkBIFRoZSBvd25lciBvZiBhIGtleS4gVGhlIGtleSBpcyB0aGUgYEtleVR5cGVJZGAgKyB0aGUgZW5jb2RlZCBrZXkuAfEBAawAAZEJCAAcR3JhbmRwYQEcR3JhbmRwYRwUU3RhdGUBAJUJBAAEkCBTdGF0ZSBvZiB0aGUgY3VycmVudCBhdXRob3JpdHkgc2V0LjRQZW5kaW5nQ2hhbmdlAACZCQQABMQgUGVuZGluZyBjaGFuZ2U6IChzaWduYWxlZCBhdCwgc2NoZWR1bGVkIGNoYW5nZSkuKE5leHRGb3JjZWQAABAEAAS8IG5leHQgYmxvY2sgbnVtYmVyIHdoZXJlIHdlIGNhbiBmb3JjZSBhIGNoYW5nZS4cU3RhbGxlZAAA9QIEAASQIGB0cnVlYCBpZiB3ZSBhcmUgY3VycmVudGx5IHN0YWxsZWQuMEN1cnJlbnRTZXRJZAEAMCAAAAAAAAAAAAhdASBUaGUgbnVtYmVyIG9mIGNoYW5nZXMgKGJvdGggaW4gdGVybXMgb2Yga2V5cyBhbmQgdW5kZXJseWluZyBlY29ub21pYyByZXNwb25zaWJpbGl0aWVzKcQgaW4gdGhlICJzZXQiIG9mIEdyYW5kcGEgdmFsaWRhdG9ycyBmcm9tIGdlbmVzaXMuMFNldElkU2Vzc2lvbgABBAUwEAQAKFkBIEEgbWFwcGluZyBmcm9tIGdyYW5kcGEgc2V0IElEIHRvIHRoZSBpbmRleCBvZiB0aGUgKm1vc3QgcmVjZW50KiBzZXNzaW9uIGZvciB3aGljaCBpdHNoIG1lbWJlcnMgd2VyZSByZXNwb25zaWJsZS4ARQEgVGhpcyBpcyBvbmx5IHVzZWQgZm9yIHZhbGlkYXRpbmcgZXF1aXZvY2F0aW9uIHByb29mcy4gQW4gZXF1aXZvY2F0aW9uIHByb29mIG11c3RNASBjb250YWlucyBhIGtleS1vd25lcnNoaXAgcHJvb2YgZm9yIGEgZ2l2ZW4gc2Vzc2lvbiwgdGhlcmVmb3JlIHdlIG5lZWQgYSB3YXkgdG8gdGllRQEgdG9nZXRoZXIgc2Vzc2lvbnMgYW5kIEdSQU5EUEEgc2V0IGlkcywgaS5lLiB3ZSBuZWVkIHRvIHZhbGlkYXRlIHRoYXQgYSB2YWxpZGF0b3JBASB3YXMgdGhlIG93bmVyIG9mIGEgZ2l2ZW4ga2V5IG9uIGEgZ2l2ZW4gc2Vzc2lvbiwgYW5kIHdoYXQgdGhlIGFjdGl2ZSBzZXQgSUQgd2FzVCBkdXJpbmcgdGhhdCBzZXNzaW9uLgC4IFRXT1gtTk9URTogYFNldElkYCBpcyBub3QgdW5kZXIgdXNlciBjb250cm9sLixBdXRob3JpdGllcwEAnQkEAASEIFRoZSBjdXJyZW50IGxpc3Qgb2YgYXV0aG9yaXRpZXMuAQ0CAbAMOE1heEF1dGhvcml0aWVzEBCghgEABFwgTWF4IEF1dGhvcml0aWVzIGluIHVzZTRNYXhOb21pbmF0b3JzEBAAAgAABNQgVGhlIG1heGltdW0gbnVtYmVyIG9mIG5vbWluYXRvcnMgZm9yIGVhY2ggdmFsaWRhdG9yLlhNYXhTZXRJZFNlc3Npb25FbnRyaWVzMCCoAAAAAAAAABg5ASBUaGUgbWF4aW11bSBudW1iZXIgb2YgZW50cmllcyB0byBrZWVwIGluIHRoZSBzZXQgaWQgdG8gc2Vzc2lvbiBpbmRleCBtYXBwaW5nLgAxASBTaW5jZSB0aGUgYFNldElkU2Vzc2lvbmAgbWFwIGlzIG9ubHkgdXNlZCBmb3IgdmFsaWRhdGluZyBlcXVpdm9jYXRpb25zIHRoaXMpASB2YWx1ZSBzaG91bGQgcmVsYXRlIHRvIHRoZSBib25kaW5nIGR1cmF0aW9uIG9mIHdoYXRldmVyIHN0YWtpbmcgc3lzdGVtIGlzNQEgYmVpbmcgdXNlZCAoaWYgYW55KS4gSWYgZXF1aXZvY2F0aW9uIGhhbmRsaW5nIGlzIG5vdCBlbmFibGVkIHRoZW4gdGhpcyB2YWx1ZTQgY2FuIGJlIHplcm8uAaEJCgBIQXV0aG9yaXR5RGlzY292ZXJ5AUhBdXRob3JpdHlEaXNjb3ZlcnkIEEtleXMBAKUJBAAEjCBLZXlzIG9mIHRoZSBjdXJyZW50IGF1dGhvcml0eSBzZXQuIE5leHRLZXlzAQClCQQABIAgS2V5cyBvZiB0aGUgbmV4dCBhdXRob3JpdHkgc2V0LgAAAAAMACBUcmVhc3VyeQEgVHJlYXN1cnkYNFByb3Bvc2FsQ291bnQBABAQAAAAAASkIE51bWJlciBvZiBwcm9wb3NhbHMgdGhhdCBoYXZlIGJlZW4gbWFkZS4kUHJvcG9zYWxzAAEEBRCtCQQABHwgUHJvcG9zYWxzIHRoYXQgaGF2ZSBiZWVuIG1hZGUuLERlYWN0aXZhdGVkAQAYQAAAAAAAAAAAAAAAAAAAAAAE8CBUaGUgYW1vdW50IHdoaWNoIGhhcyBiZWVuIHJlcG9ydGVkIGFzIGluYWN0aXZlIHRvIEN1cnJlbmN5LiRBcHByb3ZhbHMBALEJBAAE+CBQcm9wb3NhbCBpbmRpY2VzIHRoYXQgaGF2ZSBiZWVuIGFwcHJvdmVkIGJ1dCBub3QgeWV0IGF3YXJkZWQuKFNwZW5kQ291bnQBABAQAAAAAASkIFRoZSBjb3VudCBvZiBzcGVuZHMgdGhhdCBoYXZlIGJlZW4gbWFkZS4YU3BlbmRzAAEEBRC1CQQABNAgU3BlbmRzIHRoYXQgaGF2ZSBiZWVuIGFwcHJvdmVkIGFuZCBiZWluZyBwcm9jZXNzZWQuATkCAcAULFNwZW5kUGVyaW9kEBCAUQEABIggUGVyaW9kIGJldHdlZW4gc3VjY2Vzc2l2ZSBzcGVuZHMuEEJ1cm69CRDQBwAABBEBIFBlcmNlbnRhZ2Ugb2Ygc3BhcmUgZnVuZHMgKGlmIGFueSkgdGhhdCBhcmUgYnVybnQgcGVyIHNwZW5kIHBlcmlvZC4gUGFsbGV0SWTBCSBweS90cnNyeQQZASBUaGUgdHJlYXN1cnkncyBwYWxsZXQgaWQsIHVzZWQgZm9yIGRlcml2aW5nIGl0cyBzb3ZlcmVpZ24gYWNjb3VudCBJRC4wTWF4QXBwcm92YWxzEBBkAAAADBUBIFRoZSBtYXhpbXVtIG51bWJlciBvZiBhcHByb3ZhbHMgdGhhdCBjYW4gd2FpdCBpbiB0aGUgc3BlbmRpbmcgcXVldWUuAE0BIE5PVEU6IFRoaXMgcGFyYW1ldGVyIGlzIGFsc28gdXNlZCB3aXRoaW4gdGhlIEJvdW50aWVzIFBhbGxldCBleHRlbnNpb24gaWYgZW5hYmxlZC4wUGF5b3V0UGVyaW9kEBCAlwYABBkBIFRoZSBwZXJpb2QgZHVyaW5nIHdoaWNoIGFuIGFwcHJvdmVkIHRyZWFzdXJ5IHNwZW5kIGhhcyB0byBiZSBjbGFpbWVkLgHFCRIAQENvbnZpY3Rpb25Wb3RpbmcBQENvbnZpY3Rpb25Wb3RpbmcIJFZvdGluZ0ZvcgEBCAUFyQnNCdgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIdQEgQWxsIHZvdGluZyBmb3IgYSBwYXJ0aWN1bGFyIHZvdGVyIGluIGEgcGFydGljdWxhciB2b3RpbmcgY2xhc3MuIFdlIHN0b3JlIHRoZSBiYWxhbmNlIGZvciB0aGWcIG51bWJlciBvZiB2b3RlcyB0aGF0IHdlIGhhdmUgcmVjb3JkZWQuNENsYXNzTG9ja3NGb3IBAQQFAO0JBAAMaQEgVGhlIHZvdGluZyBjbGFzc2VzIHdoaWNoIGhhdmUgYSBub24temVybyBsb2NrIHJlcXVpcmVtZW50IGFuZCB0aGUgbG9jayBhbW91bnRzIHdoaWNoIHRoZXltASByZXF1aXJlLiBUaGUgYWN0dWFsIGFtb3VudCBsb2NrZWQgb24gYmVoYWxmIG9mIHRoaXMgcGFsbGV0IHNob3VsZCBhbHdheXMgYmUgdGhlIG1heGltdW0gb2YsIHRoaXMgbGlzdC4BQQIBTQEIIE1heFZvdGVzEBAAAgAAEPAgVGhlIG1heGltdW0gbnVtYmVyIG9mIGNvbmN1cnJlbnQgdm90ZXMgYW4gYWNjb3VudCBtYXkgaGF2ZS4AVQEgQWxzbyB1c2VkIHRvIGNvbXB1dGUgd2VpZ2h0LCBhbiBvdmVybHkgbGFyZ2UgdmFsdWUgY2FuIGxlYWQgdG8gZXh0cmluc2ljcyB3aXRoIGxhcmdlwCB3ZWlnaHQgZXN0aW1hdGlvbjogc2VlIGBkZWxlZ2F0ZWAgZm9yIGluc3RhbmNlLkRWb3RlTG9ja2luZ1BlcmlvZBAQwIkBABCQIFRoZSBtaW5pbXVtIHBlcmlvZCBvZiB2b3RlIGxvY2tpbmcuAGUBIEl0IHNob3VsZCBiZSBubyBzaG9ydGVyIHRoYW4gZW5hY3RtZW50IHBlcmlvZCB0byBlbnN1cmUgdGhhdCBpbiB0aGUgY2FzZSBvZiBhbiBhcHByb3ZhbCxJASB0aG9zZSBzdWNjZXNzZnVsIHZvdGVycyBhcmUgbG9ja2VkIGludG8gdGhlIGNvbnNlcXVlbmNlcyB0aGF0IHRoZWlyIHZvdGVzIGVudGFpbC4B+QkUACRSZWZlcmVuZGEBJFJlZmVyZW5kYRQ8UmVmZXJlbmR1bUNvdW50AQAQEAAAAAAEMQEgVGhlIG5leHQgZnJlZSByZWZlcmVuZHVtIGluZGV4LCBha2EgdGhlIG51bWJlciBvZiByZWZlcmVuZGEgc3RhcnRlZCBzbyBmYXIuRFJlZmVyZW5kdW1JbmZvRm9yAAEEAhD9CQQABLQgSW5mb3JtYXRpb24gY29uY2VybmluZyBhbnkgZ2l2ZW4gcmVmZXJlbmR1bS4oVHJhY2tRdWV1ZQEBBAVVAR0KBAAQXQEgVGhlIHNvcnRlZCBsaXN0IG9mIHJlZmVyZW5kYSByZWFkeSB0byBiZSBkZWNpZGVkIGJ1dCBub3QgeWV0IGJlaW5nIGRlY2lkZWQsIG9yZGVyZWQgYnl8IGNvbnZpY3Rpb24td2VpZ2h0ZWQgYXBwcm92YWxzLgBBASBUaGlzIHNob3VsZCBiZSBlbXB0eSBpZiBgRGVjaWRpbmdDb3VudGAgaXMgbGVzcyB0aGFuIGBUcmFja0luZm86Om1heF9kZWNpZGluZ2AuNERlY2lkaW5nQ291bnQBAQQFVQEQEAAAAAAExCBUaGUgbnVtYmVyIG9mIHJlZmVyZW5kYSBiZWluZyBkZWNpZGVkIGN1cnJlbnRseS4oTWV0YWRhdGFPZgABBAIQNAQAGAUBIFRoZSBtZXRhZGF0YSBpcyBhIGdlbmVyYWwgaW5mb3JtYXRpb24gY29uY2VybmluZyB0aGUgcmVmZXJlbmR1bS5JASBUaGUgYEhhc2hgIHJlZmVycyB0byB0aGUgcHJlaW1hZ2Ugb2YgdGhlIGBQcmVpbWFnZXNgIHByb3ZpZGVyIHdoaWNoIGNhbiBiZSBhIEpTT06IIGR1bXAgb3IgSVBGUyBoYXNoIG9mIGEgSlNPTiBmaWxlLgB1ASBDb25zaWRlciBhIGdhcmJhZ2UgY29sbGVjdGlvbiBmb3IgYSBtZXRhZGF0YSBvZiBmaW5pc2hlZCByZWZlcmVuZHVtcyB0byBgdW5yZXF1ZXN0YCAocmVtb3ZlKUQgbGFyZ2UgcHJlaW1hZ2VzLgFVAgFRARREU3VibWlzc2lvbkRlcG9zaXQYQFVN0sIHAAAAAAAAAAAAAAAENQEgVGhlIG1pbmltdW0gYW1vdW50IHRvIGJlIHVzZWQgYXMgYSBkZXBvc2l0IGZvciBhIHB1YmxpYyByZWZlcmVuZHVtIHByb3Bvc2FsLiRNYXhRdWV1ZWQQEGQAAAAE5CBNYXhpbXVtIHNpemUg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AIxoif//////IQA4bWVkaXVtX3NwZW5kZXIyAAAAaGpMNBAGAAAAAAAAAAAAAGAJAACAEwMAQDgAAEA4AAAAWwH2MABlzR0Aypo7AhFh2wAAAAAAv9GqAQAAAAAglyr//////yIALGJpZ19zcGVuZGVyMgAAANDUmGggDAAAAAAAAAAAAABgCQAAgBMDAIBwAABAOAAAAADKmjsAZc0dAMqaOwJBPLABAAAAAHVdNAMAAAAARdFl/v////8E4CBJbmZvcm1hdGlvbiBjb25jZXJuaW5nIHRoZSBkaWZmZXJlbnQgcmVmZXJlbmR1bSB0cmFja3MuAUEKFQBQRmVsbG93c2hpcENvbGxlY3RpdmUBUEZlbGxvd3NoaXBDb2xsZWN0aXZlGCxNZW1iZXJDb3VudAEBBAVVARAQAAAAAAhpASBUaGUgbnVtYmVyIG9mIG1lbWJlcnMgaW4gdGhlIGNvbGxlY3RpdmUgd2hvIGhhdmUgYXQgbGVhc3QgdGhlIHJhbmsgYWNjb3JkaW5nIHRvIHRoZSBpbmRleDAgb2YgdGhlIHZlYy4cTWVtYmVycwABBAUARQoEAAScIFRoZSBjdXJyZW50IG1lbWJlcnMgb2YgdGhlIGNvbGxlY3RpdmUuJElkVG9JbmRleAABCAUFSQoQBAAEYQEgVGhlIGluZGV4IG9mIGVhY2ggcmFua3MncyBtZW1iZXIgaW50byB0aGUgZ3JvdXAgb2YgbWVtYmVycyB3aG8gaGF2ZSBhdCBsZWFzdCB0aGF0IHJhbmsuJEluZGV4VG9JZAABCAUFTQoABAAIXQEgVGhlIG1lbWJlcnMgaW4gdGhlIGNvbGxlY3RpdmUgYnkgaW5kZXguIEFsbCBpbmRpY2VzIGluIHRoZSByYW5nZSBgMC4uTWVtYmVyQ291bnRgIHdpbGxlASByZXR1cm4gYFNvbWVgLCBob3dldmVyIGEgbWVtYmVyJ3MgaW5kZXggaXMgbm90IGd1YXJhbnRlZWQgdG8gcmVtYWluIHVuY2hhbmdlZCBvdmVyIHRpbWUuGFZvdGluZwABCAIFLQlZBwQABLQgVm90ZXMgb24gYSBnaXZlbiBwcm9wb3NhbCwgaWYgaXQgaXMgb25nb2luZy40Vm90aW5nQ2xlYW51cAABBAIQUQoEAAABfQIBVQcAAVUKFgBMRmVsbG93c2hpcFJlZmVyZW5kYQFMRmVsbG93c2hpcFJlZmVyZW5kYRQ8UmVmZXJlbmR1bUNvdW50AQAQEAAAAAAEMQEgVGhlIG5leHQgZnJlZSByZWZlcmVuZHVtIGluZGV4LCBha2EgdGhlIG51bWJlciBvZiByZWZlcmVuZGEgc3RhcnRlZCBzbyBmYXIuRFJlZmVyZW5kdW1JbmZvRm9yAAEEAhBZCgQABLQgSW5mb3JtYXRpb24gY29uY2VybmluZyBhbnkgZ2l2ZW4gcmVmZXJlbmR1bS4oVHJhY2tRdWV1ZQEBBAVVAWEKBAAQXQEgVGhlIHNvcnRlZCBsaXN0IG9mIHJlZmVyZW5kYSByZWFkeSB0byBiZSBkZWNpZGVkIGJ1dCBub3QgeWV0IGJlaW5nIGRlY2lkZWQsIG9yZGVyZWQgYnl8IGNvbnZpY3Rpb24td2VpZ2h0ZWQgYXBwcm92YWxzLgBBASBUaGlzIHNob3VsZCBiZSBlbXB0eSBpZiBgRGVjaWRpbmdDb3VudGAgaXMgbGVzcyB0aGFuIGBUcmFja0luZm86Om1heF9kZWNpZGluZ2AuNERlY2lkaW5nQ291bnQBAQQFVQEQEAAAAAAExCBUaGUgbnVtYmVyIG9mIHJlZmVyZW5kYSBiZWluZyBkZWNpZGVkIGN1cnJlbnRseS4oTWV0YWRhdGFPZgABBAIQNAQAGAUBIFRoZSBtZXRhZGF0YSBpcyBhIGdlbmVyYWwgaW5mb3JtYXRpb24gY29uY2VybmluZyB0aGUgcmVmZXJlbmR1bS5JASBUaGUgYEhhc2hgIHJlZmVycyB0byB0aGUgcHJlaW1hZ2Ugb2YgdGhlIGBQcmVpbWFnZXNgIHByb3ZpZGVyIHdoaWNoIGNhbiBiZSBhIEpTT06IIGR1bXAgb3IgSVBGUyBoYXNoIG9mIGEgSlNPTiBmaWxlLgB1ASBDb25zaWRlciBhIGdhcmJhZ2UgY29sbGVjdGlvbiBmb3IgYSBtZXRhZGF0YSBvZiBmaW5pc2hlZCByZWZlcmVuZHVtcyB0byBgdW5yZXF1ZXN0YCAocmVtb3ZlKUQgbGFyZ2UgcHJlaW1hZ2VzLgGBAgFhBxREU3VibWlzc2lvbkRlcG9zaXQYQAAAAAAAAAAAAAAAAAAAAAAENQEgVGhlIG1pbmltdW0gYW1vdW50IHRvIGJlIHVzZWQgYXMgYSBkZXBvc2l0IGZvciBhIHB1YmxpYyByZWZlcmVuZHVtIHByb3Bvc2FsLiRNYXhRdWV1ZWQQEGQAAAAE5CBNYXhpbXVtIHNpemUgb2YgdGhlIHJlZmVyZW5kdW0gcXVldWUgZm9yIGEgc2luZ2xlIHRyYWNrLkRVbmRlY2lkaW5nVGltZW91dBAQwIkBAAhVASBUaGUgbnVtYmVyIG9mIGJsb2NrcyBhZnRlciBzdWJtaXNzaW9uIHRoYXQgYSByZWZlcmVuZHVtIG11c3QgYmVnaW4gYmVpbmcgZGVjaWRlZCBieS7kIE9uY2UgdGhpcyBwYXNzZXMsIHRoZW4gYW55b25lIG1heSBjYW5jZWwgdGhlIHJlZmVyZW5kdW0uNEFsYXJtSW50ZXJ2YWwQEAEAAAAMXQEgUXVhbnRpemF0aW9uIGxldmVsIGZvciB0aGUgcmVmZXJlbmR1bSB3YWtldXAgc2NoZWR1bGVyLiBBIGhpZ2hlciBudW1iZXIgd2lsbCByZXN1bHQgaW5dASBmZXdlciBzdG9yYWdlIHJlYWRzL3dyaXRlcyBuZWVkZWQgZm9yIHNtYWxsZXIgdm90ZXJzLCBidXQgYWxzbyByZXN1bHQgaW4gZGVsYXlzIHRvIHRoZVUBIGF1dG9tYXRpYyByZWZlcmVuZHVtIHN0YXR1cyBjaGFuZ2VzLiBFeHBsaWNpdCBzZXJ2aWNpbmcgaW5zdHJ1Y3Rpb25zIGFyZSB1bmFmZmVjdGVkLhhUcmFja3MpCs0LKAAAKGNhbmRpZGF0ZXMKAAAANDUmGggDAAAAAAAAAAAAACwBAADAiQEALAEAAAoAAAAAAMqaOwBlzR0Aypo7AADKmjsAAAAAAGXNHQEAHG1lbWJlcnMKAAAAUgU3nE0AAAAAAAAAAAAAACwBAADAiQEALAEAAAoAAAAAAMqaOwBlzR0Aypo7AADKmjsAAAAAAGXNHQIALHByb2ZpY2llbnRzCgAAAFIFN5xNAAAAAAAAAAAAAAAsAQAAwIkBACwBAAAKAAAAAADKmjsAZc0dAMqaOwAAypo7AAAAAABlzR0DABxmZWxsb3dzCgAAAFIFN5xNAAAAAAAAAAAAAAAsAQAAwIkBACwBAAAKAAAAAADKmjsAZc0dAMqaOwAAypo7AAAAAABlzR0EADhzZW5pb3IgZmVsbG93cwoAAABSBTecTQAAAAAAAAAAAAAALAEAAMCJAQAsAQAACgAAAAAAypo7AGXNHQDKmjsAAMqaOwAAAAAAZc0dBQAcZXhwZXJ0cwoAAABVTdLCBwAAAAAAAAAAAAAALAEAAMCJAQAsAQAACgAAAAAAypo7AGXNHQDKmjsAAMqaOwAAAAAAZc0dBgA4c2VuaW9yIGV4cGVydHMKAAAAVU3SwgcAAAAAAAAAAAAAACwBAADAiQEALAEAAAoAAAAAAMqaOwBlzR0Aypo7AADKmjsAAAAAAGXNHQcAHG1hc3RlcnMKAAAAVU3SwgcAAAAAAAAAAAAAACwBAADAiQEALAEAAAoAAAAAAMqaOwBlzR0Aypo7AADKmjsAAAAAAGXNHQgAOHNlbmlvciBtYXN0ZXJzCgAAAFVN0sIHAAAAAAAAAAAAAAAsAQAAwIkBACwBAAAKAAAAAADKmjsAZc0dAMqaOwAAypo7AAAAAABlzR0JADRncmFuZCBtYXN0ZXJzCgAAAFVN0sIHAAAAAAAAAAAAAAAsAQAAwIkBACwBAAAKAAAAAADKmjsAZc0dAMqaOwAAypo7AAAAAABlzR0E4CBJbmZvcm1hdGlvbiBjb25jZXJuaW5nIHRoZSBkaWZmZXJlbnQgcmVmZXJlbmR1bSB0cmFja3MuAWUKFwAcT3JpZ2lucwAAAAAAKwAkV2hpdGVsaXN0ASRXaGl0ZWxpc3QEPFdoaXRlbGlzdGVkQ2FsbAABBAU0oQEEAAABhQIBZQcAAWkKLAAoUGFyYW1ldGVycwEoUGFyYW1ldGVycwQoUGFyYW1ldGVycwABBAJ9B4kHBAAETCBTdG9yZWQgcGFyYW1ldGVycy4BiQIBeQcAAC4AGENsYWltcwEYQ2xhaW1zFBhDbGFpbXMAAQQGwQIYBAAAFFRvdGFsAQAYQAAAAAAAAAAAAAAAAAAAAAAAHFZlc3RpbmcAAQQGwQLJAgQAEHggVmVzdGluZyBzY2hlZHVsZSBmb3IgYSBjbGFpbS4NASBGaXJzdCBiYWxhbmNlIGlzIHRoZSB0b3RhbCBhbW91bnQgdGhhdCBzaG91bGQgYmUgaGVsZCBmb3IgdmVzdGluZy7kIFNlY29uZCBiYWxhbmNlIGlzIGhvdyBtdWNoIHNob3VsZCBiZSB1bmxvY2tlZCBwZXIgYmxvY2suzCBUaGUgYmxvY2sgbnVtYmVyIGlzIHdoZW4gdGhlIHZlc3Rpbmcgc2hvdWxkIHN0YXJ0LhxTaWduaW5nAAEEBsEC0QIEAATAIFRoZSBzdGF0ZW1lbnQga2luZCB0aGF0IG11c3QgYmUgc2lnbmVkLCBpZiBhbnkuJFByZWNsYWltcwABBAYAwQIEAAQtASBQcmUtY2xhaW1lZCBFdGhlcmV1bSBhY2NvdW50cywgYnkgdGhlIEFjY291bnQgSUQgdGhhdCB0aGV5IGFyZSBjbGFpbWVkIHRvLgG1AgGRBwQYUHJlZml4OIB8UGF5IEtTTXMgdG8gdGhlIEt1c2FtYSBhY2NvdW50OgABbQoTABxVdGlsaXR5AAHVAgGVBwRMYmF0Y2hlZF9jYWxsc19saW1pdBAQqioAAASoIFRoZSBsaW1pdCBvbiB0aGUgbnVtYmVyIG9mIGJhdGNoZWQgY2FsbHMuAXEKGAAcU29jaWV0eQEcU29jaWV0eVAoUGFyYW1ldGVycwAAoQcEAATcIFRoZSBtYXggbnVtYmVyIG9mIG1lbWJlcnMgZm9yIHRoZSBzb2NpZXR5IGF0IG9uZSB0aW1lLgxQb3QBABhAAAAAAAAAAAAAAAAAAAAAAARBASBBbW91bnQgb2Ygb3VyIGFjY291bnQgYmFsYW5jZSB0aGF0IGlzIHNwZWNpZmljYWxseSBmb3IgdGhlIG5leHQgcm91bmQncyBiaWQocykuHEZvdW5kZXIAAAAEAARIIFRoZSBmaXJzdCBtZW1iZXIuEEhlYWQAAAAEAARBASBUaGUgbW9zdCBwcmltYXJ5IGZyb20gdGhlIG1vc3QgcmVjZW50bHkgYXBwcm92ZWQgcmFuayAwIG1lbWJlcnMgaW4gdGhlIHNvY2lldHkuFFJ1bGVzAAA0BAAIUQEgQSBoYXNoIG9mIHRoZSBydWxlcyBvZiB0aGlzIHNvY2lldHkgY29uY2VybmluZyBtZW1iZXJzaGlwLiBDYW4gb25seSBiZSBzZXQgb25jZSBhbmRUIG9ubHkgYnkgdGhlIGZvdW5kZXIuHE1lbWJlcnMAAQQFAHUKBAAEIQEgVGhlIGN1cnJlbnQgbWVtYmVycyBhbmQgdGhlaXIgcmFuay4gRG9lc24ndCBpbmNsdWRlIGBTdXNwZW5kZWRNZW1iZXJzYC4cUGF5b3V0cwEBBAUAgQpEAAAAAAAAAAAAAAAAAAAAAAAE3CBJbmZvcm1hdGlvbiByZWdhcmRpbmcgcmFuay0wIHBheW91dHMsIHBhc3QgYW5kIGZ1dHVyZS4sTWVtYmVyQ291bnQBABAQAAAAAARJASBUaGUgbnVtYmVyIG9mIGl0ZW1zIGluIGBNZW1iZXJzYCBjdXJyZW50bHkuIChEb2Vzbid0IGluY2x1ZGUgYFN1c3BlbmRlZE1lbWJlcnNgLik0TWVtYmVyQnlJbmRleAABBAUQAAQACF0BIFRoZSBjdXJyZW50IGl0ZW1zIGluIGBNZW1iZXJzYCBrZXllZCBieSB0aGVpciB1bmlxdWUgaW5kZXguIEtleXMgYXJlIGRlbnNlbHkgcG9wdWxhdGVkzCBgMC4uTWVtYmVyQ291bnRgIChkb2VzIG5vdCBpbmNsdWRlIGBNZW1iZXJDb3VudGApLkBTdXNwZW5kZWRNZW1iZXJzAAEEBQB1CgQABAEBIFRoZSBzZXQgb2Ygc3VzcGVuZGVkIG1lbWJlcnMsIHdpdGggdGhlaXIgb2xkIG1lbWJlcnNoaXAgcmVjb3JkLihSb3VuZENvdW50AQAQEAAAAAAEoCBUaGUgbnVtYmVyIG9mIHJvdW5kcyB3aGljaCBoYXZlIHBhc3NlZC4QQmlkcwEAiQoEAAToIFRoZSBjdXJyZW50IGJpZHMsIHN0b3JlZCBvcmRlcmVkIGJ5IHRoZSB2YWx1ZSBvZiB0aGUgYmlkLihDYW5kaWRhdGVzAAEEAgCZCgQAABxTa2VwdGljAAAABAAEVCBUaGUgY3VycmVudCBza2VwdGljLhRWb3RlcwABCAUFoQqlCgQABNAgRG91YmxlIG1hcCBmcm9tIENhbmRpZGF0ZSAtPiBWb3RlciAtPiAoTWF5YmUpIFZvdGUuPFZvdGVDbGVhckN1cnNvcgABBAUAqQoEAAT0IENsZWFyLWN1cnNvciBmb3IgVm90ZSwgbWFwIGZyb20gQ2FuZGlkYXRlIC0+IChNYXliZSkgQ3Vyc29yLiBOZXh0SGVhZAAArQoEAAx1ASBBdCB0aGUgZW5kIG9mIHRoZSBjbGFpbSBwZXJpb2QsIHRoaXMgY29udGFpbnMgdGhlIG1vc3QgcmVjZW50bHkgYXBwcm92ZWQgbWVtYmVycyAoYWxvbmcgd2l0aGUBIHRoZWlyIGJpZCBhbmQgcm91bmQgSUQpIHdobyBpcyBmcm9tIHRoZSBtb3N0IHJlY2VudCByb3VuZCB3aXRoIHRoZSBsb3dlc3QgYmlkLiBUaGV5IHdpbGxcIGJlY29tZSB0aGUgbmV3IGBIZWFkYC5MQ2hhbGxlbmdlUm91bmRDb3VudAEAEBAAAAAABFkBIFRoZSBudW1iZXIgb2YgY2hhbGxlbmdlIHJvdW5kcyB0aGVyZSBoYXZlIGJlZW4uIFVzZWQgdG8gaWRlbnRpZnkgc3RhbGUgRGVmZW5kZXJWb3Rlcy4kRGVmZW5kaW5nAACxCgQABFkBIFRoZSBkZWZlbmRpbmcgbWVtYmVyIGN1cnJlbnRseSBiZWluZyBjaGFsbGVuZ2VkLCBhbG9uZyB3aXRoIGEgcnVubmluZyB0YWxseSBvZiB2b3Rlcy40RGVmZW5kZXJWb3RlcwABCAUFLQmlCgQABMggVm90ZXMgZm9yIHRoZSBkZWZlbmRlciwga2V5ZWQgYnkgY2hhbGxlbmdlIHJvdW5kLgHdAgGdByQgUGFsbGV0SWTBCSBweS9zb2NpZQRoIFRoZSBzb2NpZXRpZXMncyBwYWxsZXQgaWQwR3JhY2VTdHJpa2VzEBAKAAAABAkBIFRoZSBtYXhpbXVtIG51bWJlciBvZiBzdHJpa2VzIGJlZm9yZSBhIG1lbWJlciBnZXRzIGZ1bmRzIHNsYXNoZWQuLFBlcmlvZFNwZW5kGEAECr+CKA8AAAAAAAAAAAAABC0BIFRoZSBhbW91bnQgb2YgaW5jZW50aXZlIHBhaWQgd2l0aGluIGVhY2ggcGVyaW9kLiBEb2Vzbid0IGluY2x1ZGUgVm90ZXJUaXAuMFZvdGluZ1BlcmlvZBAQQBkBAAg9ASBUaGUgbnVtYmVyIG9mIGJsb2NrcyBvbiB3aGljaCBuZXcgY2FuZGlkYXRlcyBzaG91bGQgYmUgdm90ZWQgb24uIFRvZ2V0aGVyIHdpdGhNASBgQ2xhaW1QZXJpb2RgLCB0aGlzIHN1bXMgdG8gdGhlIG51bWJlciBvZiBibG9ja3MgYmV0d2VlbiBjYW5kaWRhdGUgaW50YWtlIHBlcmlvZHMuLENsYWltUGVyaW9kEBCAcAAACE0BIFRoZSBudW1iZXIgb2YgYmxvY2tzIG9uIHdoaWNoIG5ldyBjYW5kaWRhdGVzIGNhbiBjbGFpbSB0aGVpciBtZW1iZXJzaGlwIGFuZCBiZSB0aGUwIG5hbWVkIGhlYWQuPE1heExvY2tEdXJhdGlvbhAQAE7tAASkIFRoZSBtYXhpbXVtIGR1cmF0aW9uIG9mIHRoZSBwYXlvdXQgbG9jay48Q2hhbGxlbmdlUGVyaW9kEBDAiQEABNAgVGhlIG51bWJlciBvZiBibG9ja3MgYmV0d2VlbiBtZW1iZXJzaGlwIGNoYWxsZW5nZXMuKE1heFBheW91dHMQEAgAAAAEDQEgVGhlIG1heGltdW0gbnVtYmVyIG9mIHBheW91dHMgYSBtZW1iZXIgbWF5IGhhdmUgd2FpdGluZyB1bmNsYWltZWQuHE1heEJpZHMQEAACAAAEkCBUaGUgbWF4aW11bSBudW1iZXIgb2YgYmlkcyBhdCBvbmNlLgG1ChoAIFJlY292ZXJ5ASBSZWNvdmVyeQwsUmVjb3ZlcmFibGUAAQQFALkKBAAECQEgVGhlIHNldCBvZiByZWNvdmVyYWJsZSBhY2NvdW50cyBhbmQgdGhlaXIgcmVjb3ZlcnkgY29uZmlndXJhdGlvbi5AQWN0aXZlUmVjb3ZlcmllcwABCAUFoQrBCgQAEGggQWN0aXZlIHJlY292ZXJ5IGF0dGVtcHRzLgAVASBGaXJzdCBhY2NvdW50IGlzIHRoZSBhY2NvdW50IHRvIGJlIHJlY292ZXJlZCwgYW5kIHRoZSBzZWNvbmQgYWNjb3VudKwgaXMgdGhlIHVzZXIgdHJ5aW5nIHRvIHJlY292ZXIgdGhlIGFjY291bnQuFFByb3h5AAEEAgAABAAMkCBUaGUgbGlzdCBvZiBhbGxvd2VkIHByb3h5IGFjY291bnRzLgD4IE1hcCBmcm9tIHRoZSB1c2VyIHdobyBjYW4gYWNjZXNzIGl0IHRvIHRoZSByZWNvdmVyZWQgYWNjb3VudC4B4QIBpQcQRENvbmZpZ0RlcG9zaXRCYXNlGEAEghvOJgAAAAAAAAAAAAAAEFUBIFRoZSBiYXNlIGFtb3VudCBvZiBjdXJyZW5jeSBuZWVkZWQgdG8gcmVzZXJ2ZSBmb3IgY3JlYXRpbmcgYSByZWNvdmVyeSBjb25maWd1cmF0aW9uLgABASBUaGlzIGlzIGhlbGQgZm9yIGFuIGFkZGl0aW9uYWwgc3RvcmFnZSBpdGVtIHdob3NlIHZhbHVlIHNpemUgaXOoIGAyICsgc2l6ZW9mKEJsb2NrTnVtYmVyLCBCYWxhbmNlKWAgYnl0ZXMuTEZyaWVuZERlcG9zaXRGYWN0b3IYQJomaeEDAAAAAAAAAAAAAAAULQEgVGhlIGFtb3VudCBvZiBjdXJyZW5jeSBuZWVkZWQgcGVyIGFkZGl0aW9uYWwgdXNlciB3aGVuIGNyZWF0aW5nIGEgcmVjb3Zlcnk8IGNvbmZpZ3VyYXRpb24uAE0BIFRoaXMgaXMgaGVsZCBmb3IgYWRkaW5nIGBzaXplb2YoQWNjb3VudElkKWAgYnl0ZXMgbW9yZSBpbnRvIGEgcHJlLWV4aXN0aW5nIHN0b3JhZ2UcIHZhbHVlLihNYXhGcmllbmRzEBAJAAAAGA0BIFRoZSBtYXhpbXVtIGFtb3VudCBvZiBmcmllbmRzIGFsbG93ZWQgaW4gYSByZWNvdmVyeSBjb25maWd1cmF0aW9uLgANASBOT1RFOiBUaGUgdGhyZXNob2xkIHByb2dyYW1tZWQgaW4gdGhpcyBQYWxsZXQgdXNlcyB1MTYsIHNvIGl0IGRvZXMJASBub3QgcmVhbGx5IG1ha2Ugc2Vuc2UgdG8gaGF2ZSBhIGxpbWl0IGhlcmUgZ3JlYXRlciB0aGFuIHUxNjo6TUFYLhUBIEJ1dCBhbHNvLCB0aGF0IGlzIGEgbG90IG1vcmUgdGhhbiB5b3Ugc2hvdWxkIHByb2JhYmx5IHNldCB0aGlzIHZhbHVlNCB0byBhbnl3YXkuLi48UmVjb3ZlcnlEZXBvc2l0GEAEghvOJgAAAAAAAAAAAAAAHB0BIFRoZSBiYXNlIGFtb3VudCBvZiBjdXJyZW5jeSBuZWVkZWQgdG8gcmVzZXJ2ZSBmb3Igc3RhcnRpbmcgYSByZWNvdmVyeS4ANQEgVGhpcyBpcyBwcmltYXJpbHkgaGVsZCBmb3IgZGV0ZXJyaW5nIG1hbGljaW91cyByZWNvdmVyeSBhdHRlbXB0cywgYW5kIHNob3VsZCkBIGhhdmUgYSB2YWx1ZSBsYXJnZSBlbm91Z2ggdGhhdCBhIGJhZCBhY3RvciB3b3VsZCBjaG9vc2Ugbm90IHRvIHBsYWNlIHRoaXMpASBkZXBvc2l0LiBJdCBhbHNvIGFjdHMgdG8gZnVuZCBhZGRpdGlvbmFsIHN0b3JhZ2UgaXRlbSB3aG9zZSB2YWx1ZSBzaXplIGlzQQEgYHNpemVvZihCbG9ja051bWJlciwgQmFsYW5jZSArIFQgKiBBY2NvdW50SWQpYCBieXRlcy4gV2hlcmUgVCBpcyBhIGNvbmZpZ3VyYWJsZSwgdGhyZXNob2xkLgHFChsAHFZlc3RpbmcBHFZlc3RpbmcIHFZlc3RpbmcAAQQCAMkKBAAE2CBJbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhlIHZlc3Rpbmcgb2YgYSBnaXZlbiBhY2NvdW50LjhTdG9yYWdlVmVyc2lvbgEA0QoEAAx8IFN0b3JhZ2UgdmVyc2lvbiBvZiB0aGUgcGFsbGV0LgAxASBOZXcgbmV0d29ya3Mgc3RhcnQgd2l0aCBsYXRlc3QgdmVyc2lvbiwgYXMgZGV0ZXJtaW5lZCBieSB0aGUgZ2VuZXNpcyBidWlsZC4B5QIBqQcIRE1pblZlc3RlZFRyYW5zZmVyGEA0TdLCBwAAAAAAAAAAAAAABOggVGhlIG1pbmltdW0gYW1vdW50IHRyYW5zZmVycmVkIHRvIGNhbGwgYHZlc3RlZF90cmFuc2ZlcmAuTE1heFZlc3RpbmdTY2hlZHVsZXMQEBwAAAAAAdUKHAAkU2NoZWR1bGVyASRTY2hlZHVsZXIQPEluY29tcGxldGVTaW5jZQAAEAQAABhBZ2VuZGEBAQQFENkKBAAETQEgSXRlbXMgdG8gYmUgZXhlY3V0ZWQsIGluZGV4ZWQgYnkgdGhlIGJsb2NrIG51bWJlciB0aGF0IHRoZXkgc2hvdWxkIGJlIGV4ZWN1dGVkIG9uLhxSZXRyaWVzAAEEAvUC6QoEAAQhASBSZXRyeSBjb25maWd1cmF0aW9ucyBmb3IgaXRlbXMgdG8gYmUgZXhlY3V0ZWQsIGluZGV4ZWQgYnkgdGFzayBhZGRyZXNzLhhMb29rdXAAAQQFBPUCBAAQ+CBMb29rdXAgZnJvbSBhIG5hbWUgdG8gdGhlIGJsb2NrIG51bWJlciBhbmQgaW5kZXggb2YgdGhlIHRhc2suAFkBIEZvciB2MyAtPiB2NCB0aGUgcHJldmlvdXNseSB1bmJvdW5kZWQgaWRlbnRpdGllcyBhcmUgQmxha2UyLTI1NiBoYXNoZWQgdG8gZm9ybSB0aGUgdjQwIGlkZW50aXRpZXMuAe0CAa0HCDRNYXhpbXVtV2VpZ2h0KEALAIBuh3QBE8zMzMzMzMzMBCkBIFRoZSBtYXhpbXVtIHdlaWdodCB0aGF0IG1heSBiZSBzY2hlZHVsZWQgcGVyIGJsb2NrIGZvciBhbnkgZGlzcGF0Y2hhYmxlcy5QTWF4U2NoZWR1bGVkUGVyQmxvY2sQEDIAAAAUHQEgVGhlIG1heGltdW0gbnVtYmVyIG9mIHNjaGVkdWxlZCBjYWxscyBpbiB0aGUgcXVldWUgZm9yIGEgc2luZ2xlIGJsb2NrLgAYIE5PVEU6UQEgKyBEZXBlbmRlbnQgcGFsbGV0cycgYmVuY2htYXJrcyBtaWdodCByZXF1aXJlIGEgaGlnaGVyIGxpbWl0IGZvciB0aGUgc2V0dGluZy4gU2V0IGHEIGhpZ2hlciBsaW1pdCB1bmRlciBgcnVudGltZS1iZW5jaG1hcmtzYCBmZWF0dXJlLgHtCh0AFFByb3h5ARRQcm94eQgcUHJveGllcwEBBAUA8QpEAAAAAAAAAAAAAAAAAAAAAAAIRQEgVGhlIHNldCBvZiBhY2NvdW50IHByb3hpZXMuIE1hcHMgdGhlIGFjY291bnQgd2hpY2ggaGFzIGRlbGVnYXRlZCB0byB0aGUgYWNjb3VudHMhASB3aGljaCBhcmUgYmVpbmcgZGVsZWdhdGVkIHRvLCB0b2dldGhlciB3aXRoIHRoZSBhbW91bnQgaGVsZCBvbiBkZXBvc2l0LjRBbm5vdW5jZW1lbnRzAQEEBQABC0QAAAAAAAAAAAAAAAAAAAAAAASsIFRoZSBhbm5vdW5jZW1lbnRzIG1hZGUgYnkgdGhlIHByb3h5IChrZXkpLgH5AgG1BxhAUHJveHlEZXBvc2l0QmFzZRhAsAlTSJsAAAAAAAAAAAAAABARASBUaGUgYmFzZSBhbW91bnQgb2YgY3VycmVuY3kgbmVlZGVkIHRvIHJlc2VydmUgZm9yIGNyZWF0aW5nIGEgcHJveHkuAAEBIFRoaXMgaXMgaGVsZCBmb3IgYW4gYWRkaXRpb25hbCBzdG9yYWdlIGl0ZW0gd2hvc2UgdmFsdWUgc2l6ZSBpcyUBIGBzaXplb2YoQmFsYW5jZSlgIGJ5dGVzIGFuZCB3aG9zZSBrZXkgc2l6ZSBpcyBgc2l6ZW9mKEFjY291bnRJZClgIGJ5dGVzLkhQcm94eURlcG9zaXRGYWN0b3IYQLSmkEEAAAAAAAAAAAAAAAAUvCBUaGUgYW1vdW50IG9mIGN1cnJlbmN5IG5lZWRlZCBwZXIgcHJveHkgYWRkZWQuADUBIFRoaXMgaXMgaGVsZCBmb3IgYWRkaW5nIDMyIGJ5dGVzIHBsdXMgYW4gaW5zdGFuY2Ugb2YgYFByb3h5VHlwZWAgbW9yZSBpbnRvIGFhASBwcmUtZXhpc3Rpbmcgc3RvcmFnZSB2YWx1ZS4gVGh1cywgd2hlbiBjb25maWd1cmluZyBgUHJveHlEZXBvc2l0RmFjdG9yYCBvbmUgc2hvdWxkIHRha2X0IGludG8gYWNjb3VudCBgMzIgKyBwcm94eV90eXBlLmVuY29kZSgpLmxlbigpYCBieXRlcyBvZiBkYXRhLihNYXhQcm94aWVzEBAgAAAABPAgVGhlIG1heGltdW0gYW1vdW50IG9mIHByb3hpZXMgYWxsb3dlZCBmb3IgYSBzaW5nbGUgYWNjb3VudC4oTWF4UGVuZGluZxAQIAAAAARFASBUaGUgbWF4aW11bSBhbW91bnQgb2YgdGltZS1kZWxheWVkIGFubm91bmNlbWVudHMgdGhhdCBhcmUgYWxsb3dlZCB0byBiZSBwZW5kaW5nLlxBbm5vdW5jZW1lbnREZXBvc2l0QmFzZRhAsAlTSJsAAAAAAAAAAAAAABAxASBUaGUgYmFzZSBhbW91bnQgb2YgY3VycmVuY3kgbmVlZGVkIHRvIHJlc2VydmUgZm9yIGNyZWF0aW5nIGFuIGFubm91bmNlbWVudC4ASQEgVGhpcyBpcyBoZWxkIHdoZW4gYSBuZXcgc3RvcmFnZSBpdGVtIGhvbGRpbmcgYSBgQmFsYW5jZWAgaXMgY3JlYXRlZCAodHlwaWNhbGx5IDE2ICBieXRlcykuZEFubm91bmNlbWVudERlcG9zaXRGYWN0b3IYQGhNIYMAAAAAAAAAAAAAAAAQ1CBUaGUgYW1vdW50IG9mIGN1cnJlbmN5IG5lZWRlZCBwZXIgYW5ub3VuY2VtZW50IG1hZGUuAFkBIFRoaXMgaXMgaGVsZCBmb3IgYWRkaW5nIGFuIGBBY2NvdW50SWRgLCBgSGFzaGAgYW5kIGBCbG9ja051bWJlcmAgKHR5cGljYWxseSA2OCBieXRlcymMIGludG8gYSBwcmUtZXhpc3Rpbmcgc3RvcmFnZSB2YWx1ZS4BEQseACBNdWx0aXNpZwEgTXVsdGlzaWcEJE11bHRpc2lncwABCAUCFQsZCwQABJQgVGhlIHNldCBvZiBvcGVuIG11bHRpc2lnIG9wZXJhdGlvbnMuAQUDAbkHDCxEZXBvc2l0QmFzZRhA8BlF55sAAAAAAAAAAAAAABhZASBUaGUgYmFzZSBhbW91bnQgb2YgY3VycmVuY3kgbmVlZGVkIHRvIHJlc2VydmUgZm9yIGNyZWF0aW5nIGEgbXVsdGlzaWcgZXhlY3V0aW9uIG9yIHRvhCBzdG9yZSBhIGRpc3BhdGNoIGNhbGwgZm9yIGxhdGVyLgABASBUaGlzIGlzIGhlbGQgZm9yIGFuIGFkZGl0aW9uYWwgc3RvcmFnZSBpdGVtIHdob3NlIHZhbHVlIHNpemUgaXMxASBgNCArIHNpemVvZigoQmxvY2tOdW1iZXIsIEJhbGFuY2UsIEFjY291bnRJZCkpYCBieXRlcyBhbmQgd2hvc2Uga2V5IHNpemUgaXOAIGAzMiArIHNpemVvZihBY2NvdW50SWQpYCBieXRlcy40RGVwb3NpdEZhY3RvchhAgAaUPwAAAAAAAAAAAAAAAAxVASBUaGUgYW1vdW50IG9mIGN1cnJlbmN5IG5lZWRlZCBwZXIgdW5pdCB0aHJlc2hvbGQgd2hlbiBjcmVhdGluZyBhIG11bHRpc2lnIGV4ZWN1dGlvbi4AJQEgVGhpcyBpcyBoZWxkIGZvciBhZGRpbmcgMzIgYnl0ZXMgbW9yZSBpbnRvIGEgcHJlLWV4aXN0aW5nIHN0b3JhZ2UgdmFsdWUuOE1heFNpZ25hdG9yaWVzEBBkAAAABOwgVGhlIG1heGltdW0gYW1vdW50IG9mIHNpZ25hdG9yaWVzIGFsbG93ZWQgaW4gdGhlIG11bHRpc2lnLgEhCx8AIFByZWltYWdlASBQcmVpbWFnZQwkU3RhdHVzRm9yAAEEBjQlCwQABJAgVGhlIHJlcXVlc3Qgc3RhdHVzIG9mIGEgZ2l2ZW4gaGFzaC5AUmVxdWVzdFN0YXR1c0ZvcgABBAY0LQsEAASQIFRoZSByZXF1ZXN0IHN0YXR1cyBvZiBhIGdpdmVuIGhhc2guLFByZWltYWdlRm9yAAEEBn0JPQsEAAABEQMBvQcAAUELIAAgQm91bnRpZXMBIEJvdW50aWVzECxCb3VudHlDb3VudAEAEBAAAAAABMAgTnVtYmVyIG9mIGJvdW50eSBwcm9wb3NhbHMgdGhhdCBoYXZlIGJlZW4gbWFkZS4gQm91bnRpZXMAAQQFEEULBAAEeCBCb3VudGllcyB0aGF0IGhhdmUgYmVlbiBtYWRlLkhCb3VudHlEZXNjcmlwdGlvbnMAAQQFEE0LBAAEgCBUaGUgZGVzY3JpcHRpb24gb2YgZWFjaCBib3VudHkuPEJvdW50eUFwcHJvdmFscwEAsQkEAATsIEJvdW50eSBpbmRpY2VzIHRoYXQgaGF2ZSBiZWVuIGFwcHJvdmVkIGJ1dCBub3QgeWV0IGZ1bmRlZC4BGQMBwQckREJvdW50eURlcG9zaXRCYXNlGEA0TdLCBwAAAAAAAAAAAAAABOggVGhlIGFtb3VudCBoZWxkIG9uIGRlcG9zaXQgZm9yIHBsYWNpbmcgYSBib3VudHkgcHJvcG9zYWwuYEJvdW50eURlcG9zaXRQYXlvdXREZWxheRAQAAAAAARZASBUaGUgZGVsYXkgcGVyaW9kIGZvciB3aGljaCBhIGJvdW50eSBiZW5lZmljaWFyeSBuZWVkIHRvIHdhaXQgYmVmb3JlIGNsYWltIHRoZSBwYXlvdXQuSEJvdW50eVVwZGF0ZVBlcmlvZBAQgMYTAARsIEJvdW50eSBkdXJhdGlvbiBpbiBibG9ja3MuYEN1cmF0b3JEZXBvc2l0TXVsdGlwbGllcr0JECChBwAQGQEgVGhlIGN1cmF0b3IgZGVwb3NpdCBpcyBjYWxjdWxhdGVkIGFzIGEgcGVyY2VudGFnZSBvZiB0aGUgY3VyYXRvciBmZWUuADkBIFRoaXMgZGVwb3NpdCBoYXMgb3B0aW9uYWwgdXBwZXIgYW5kIGxvd2VyIGJvdW5kcyB3aXRoIGBDdXJhdG9yRGVwb3NpdE1heGAgYW5kVCBgQ3VyYXRvckRlcG9zaXRNaW5gLkRDdXJhdG9yRGVwb3NpdE1heN0BRAEEghvOJgAAAAAAAAAAAAAABEkBIE1heGltdW0gYW1vdW50IG9mIGZ1bmRzIHRoYXQgc2hvdWxkIGJlIHBsYWNlZCBpbiBhIGRlcG9zaXQgZm9yIG1ha2luZyBhIHByb3Bvc2FsLkRDdXJhdG9yRGVwb3NpdE1pbt0BRAFSoa7GAAAAAAAAAAAAAAAABEkBIE1pbmltdW0gYW1vdW50IG9mIGZ1bmRzIHRoYXQgc2hvdWxkIGJlIHBsYWNlZCBpbiBhIGRlcG9zaXQgZm9yIG1ha2luZyBhIHByb3Bvc2FsLkhCb3VudHlWYWx1ZU1pbmltdW0YQGiapIUPAAAAAAAAAAAAAAAEcCBNaW5pbXVtIHZhbHVlIGZvciBhIGJvdW50eS5IRGF0YURlcG9zaXRQZXJCeXRlGEBVQ94TAAAAAAAAAAAAAAAABGEBIFRoZSBhbW91bnQgaGVsZCBvbiBkZXBvc2l0IHBlciBieXRlIHdpdGhpbiB0aGUgdGlwIHJlcG9ydCByZWFzb24gb3IgYm91bnR5IGRlc2NyaXB0aW9uLkxNYXhpbXVtUmVhc29uTGVuZ3RoEBAAQAAADIggTWF4aW11bSBhY2NlcHRhYmxlIHJlYXNvbiBsZW5ndGguAGUBIEJlbmNobWFya3MgZGVwZW5kIG9uIHRoaXMgdmFsdWUsIGJlIHN1cmUgdG8gdXBkYXRlIHdlaWdodHMgZmlsZSB3aGVuIGNoYW5naW5nIHRoaXMgdmFsdWUBUQsjADRDaGlsZEJvdW50aWVzATRDaGlsZEJvdW50aWVzFEBDaGlsZEJvdW50eUNvdW50AQAQEAAAAAAEgCBOdW1iZXIgb2YgdG90YWwgY2hpbGQgYm91bnRpZXMuTFBhcmVudENoaWxkQm91bnRpZXMBAQQFEBAQAAAAAAiwIE51bWJlciBvZiBjaGlsZCBib3VudGllcyBwZXIgcGFyZW50IGJvdW50eS7gIE1hcCBvZiBwYXJlbnQgYm91bnR5IGluZGV4IHRvIG51bWJlciBvZiBjaGlsZCBib3VudGllcy40Q2hpbGRCb3VudGllcwABCAUF9QJVCwQABJQgQ2hpbGQgYm91bnRpZXMgdGhhdCBoYXZlIGJlZW4gYWRkZWQuXENoaWxkQm91bnR5RGVzY3JpcHRpb25zAAEEBRBNCwQABJggVGhlIGRlc2NyaXB0aW9uIG9mIGVhY2ggY2hpbGQtYm91bnR5LkxDaGlsZHJlbkN1cmF0b3JGZWVzAQEEBRAYQAAAAAAAAAAAAAAAAAAAAAAEAQEgVGhlIGN1bXVsYXRpdmUgY2hpbGQtYm91bnR5IGN1cmF0b3IgZmVlIGZvciBlYWNoIHBhcmVudCBib3VudHkuAR0DAcUHCGRNYXhBY3RpdmVDaGlsZEJvdW50eUNvdW50EBBkAAAABB0BIE1heGltdW0gbnVtYmVyIG9mIGNoaWxkIGJvdW50aWVzIHRoYXQgY2FuIGJlIGFkZGVkIHRvIGEgcGFyZW50IGJvdW50eS5cQ2hpbGRCb3VudHlWYWx1ZU1pbmltdW0YQKRCXY0BAAAAAAAAAAAAAAAEiCBNaW5pbXVtIHZhbHVlIGZvciBhIGNoaWxkLWJvdW50eS4BXQsoAGhFbGVjdGlvblByb3ZpZGVyTXVsdGlQaGFzZQFoRWxlY3Rpb25Qcm92aWRlck11bHRpUGhhc2UoFFJvdW5kAQAQEAEAAAAYrCBJbnRlcm5hbCBjb3VudGVyIGZvciB0aGUgbnVtYmVyIG9mIHJvdW5kcy4AVQEgVGhpcyBpcyB1c2VmdWwgZm9yIGRlLWR1cGxpY2F0aW9uIG9mIHRyYW5zYWN0aW9ucyBzdWJtaXR0ZWQgdG8gdGhlIHBvb2wsIGFuZCBnZW5lcmFsbCBkaWFnbm9zdGljcyBvZiB0aGUgcGFsbGV0LgBNASBUaGlzIGlzIG1lcmVseSBpbmNyZW1lbnRlZCBvbmNlIHBlciBldmVyeSB0aW1lIHRoYXQgYW4gdXBzdHJlYW0gYGVsZWN0YCBpcyBjYWxsZWQuMEN1cnJlbnRQaGFzZQEA0QcEAAQ8IEN1cnJlbnQgcGhhc2UuOFF1ZXVlZFNvbHV0aW9uAABhCwQADD0BIEN1cnJlbnQgYmVzdCBzb2x1dGlvbiwgc2lnbmVkIG9yIHVuc2lnbmVkLCBxdWV1ZWQgdG8gYmUgcmV0dXJuZWQgdXBvbiBgZWxlY3RgLgBgIEFsd2F5cyBzb3J0ZWQgYnkgc2NvcmUuIFNuYXBzaG90AABpCwQAEHAgU25hcHNob3QgZGF0YSBvZiB0aGUgcm91bmQuAF0BIFRoaXMgaXMgY3JlYXRlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzaWduZWQgcGhhc2UgYW5kIGNsZWFyZWQgdXBvbiBjYWxsaW5nIGBlbGVjdGAuKQEgTm90ZTogVGhpcyBzdG9yYWdlIHR5cGUgbXVzdCBvbmx5IGJlIG11dGF0ZWQgdGhyb3VnaCBbYFNuYXBzaG90V3JhcHBlcmBdLjhEZXNpcmVkVGFyZ2V0cwAAEAQAEMwgRGVzaXJlZCBudW1iZXIgb2YgdGFyZ2V0cyB0byBlbGVjdCBmb3IgdGhpcyByb3VuZC4AqCBPbmx5IGV4aXN0cyB3aGVuIFtgU25hcHNob3RgXSBpcyBwcmVzZW50LikBIE5vdGU6IFRoaXMgc3RvcmFnZSB0eXBlIG11c3Qgb25seSBiZSBtdXRhdGVkIHRocm91Z2ggW2BTbmFwc2hvdFdyYXBwZXJgXS5AU25hcHNob3RNZXRhZGF0YQAAWQQEABCYIFRoZSBtZXRhZGF0YSBvZiB0aGUgW2BSb3VuZFNuYXBzaG90YF0AqCBPbmx5IGV4aXN0cyB3aGVuIFtgU25hcHNob3RgXSBpcyBwcmVzZW50LikBIE5vdGU6IFRoaXMgc3RvcmFnZSB0eXBlIG11c3Qgb25seSBiZSBtdXRhdGVkIHRocm91Z2ggW2BTbmFwc2hvdFdyYXBwZXJgXS5kU2lnbmVkU3VibWlzc2lvbk5leHRJbmRleAEAEBAAAAAAJAEBIFRoZSBuZXh0IGluZGV4IHRvIGJlIGFzc2lnbmVkIHRvIGFuIGluY29taW5nIHNpZ25lZCBzdWJtaXNzaW9uLgB1ASBFdmVyeSBhY2NlcHRlZCBzdWJtaXNzaW9uIGlzIGFzc2lnbmVkIGEgdW5pcXVlIGluZGV4OyB0aGF0IGluZGV4IGlzIGJvdW5kIHRvIHRoYXQgcGFydGljdWxhcmUBIHN1Ym1pc3Npb24gZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgZWxlY3Rpb24uIE9uIGVsZWN0aW9uIGZpbmFsaXphdGlvbiwgdGhlIG5leHQgaW5kZXggaXMwIHJlc2V0IHRvIDAuAGkBIFdlIGNhbid0IGp1c3QgdXNlIGBTaWduZWRTdWJtaXNzaW9uSW5kaWNlcy5sZW4oKWAsIGJlY2F1c2UgdGhhdCdzIGEgYm91bmRlZCBzZXQ7IHBhc3QgaXRzWQEgY2FwYWNpdHksIGl0IHdpbGwgc2ltcGx5IHNhdHVyYXRlLiBXZSBjYW4ndCBqdXN0IGl0ZXJhdGUgb3ZlciBgU2lnbmVkU3VibWlzc2lvbnNNYXBgLPQgYmVjYXVzZSBpdGVyYXRpb24gaXMgc2xvdy4gSW5zdGVhZCwgd2Ugc3RvcmUgdGhlIHZhbHVlIGhlcmUuXFNpZ25lZFN1Ym1pc3Npb25JbmRpY2VzAQB1CwQAGG0BIEEgc29ydGVkLCBib3VuZGVkIHZlY3RvciBvZiBgKHNjb3JlLCBibG9ja19udW1iZXIsIGluZGV4KWAsIHdoZXJlIGVhY2ggYGluZGV4YCBwb2ludHMgdG8gYXggdmFsdWUgaW4gYFNpZ25lZFN1Ym1pc3Npb25zYC4AcQEgV2UgbmV2ZXIgbmVlZCB0byBwcm9jZXNzIG1vcmUgdGhhbiBhIHNpbmdsZSBzaWduZWQgc3VibWlzc2lvbiBhdCBhIHRpbWUuIFNpZ25lZCBzdWJtaXNzaW9uc3UBIGNhbiBiZSBxdWl0ZSBsYXJnZSwgc28gd2UncmUgd2lsbGluZyB0byBwYXkgdGhlIGNvc3Qgb2YgbXVsdGlwbGUgZGF0YWJhc2UgYWNjZXNzZXMgdG8gYWNjZXNzIQEgdGhlbSBvbmUgYXQgYSB0aW1lIGluc3RlYWQgb2YgcmVhZGluZyBhbmQgZGVjb2RpbmcgYWxsIG9mIHRoZW0gYXQgb25jZS5QU2lnbmVkU3VibWlzc2lvbnNNYXAAAQQFEIELBAAcdCBVbmNoZWNrZWQsIHNpZ25lZCBzb2x1dGlvbnMuAGkBIFRvZ2V0aGVyIHdpdGggYFN1Ym1pc3Npb25JbmRpY2VzYCwgdGhpcyBzdG9yZXMgYSBib3VuZGVkIHNldCBvZiBgU2lnbmVkU3VibWlzc2lvbnNgIHdoaWxl7CBhbGxvd2luZyB1cyB0byBrZWVwIG9ubHkgYSBzaW5nbGUgb25lIGluIG1lbW9yeSBhdCBhIHRpbWUuAGkBIFR3b3ggbm90ZTogdGhlIGtleSBvZiB0aGUgbWFwIGlzIGFuIGF1dG8taW5jcmVtZW50aW5nIGluZGV4IHdoaWNoIHVzZXJzIGNhbm5vdCBpbnNwZWN0IG9y9CBhZmZlY3Q7IHdlIHNob3VsZG4ndCBuZWVkIGEgY3J5cHRvZ3JhcGhpY2FsbHkgc2VjdXJlIGhhc2hlci5UTWluaW11bVVudHJ1c3RlZFNjb3JlAABVBAQAEF0BIFRoZSBtaW5pbXVtIHNjb3JlIHRoYXQgZWFjaCAndW50cnVzdGVkJyBzb2x1dGlvbiBtdXN0IGF0dGFpbiBpbiBvcmRlciB0byBiZSBjb25zaWRlcmVkKCBmZWFzaWJsZS4AuCBDYW4gYmUgc2V0IHZpYSBgc2V0X21pbmltdW1fdW50cnVzdGVkX3Njb3JlYC4BIQMByQc4VEJldHRlclNpZ25lZFRocmVzaG9sZJQQAAAAAAhNASBUaGUgbWluaW11bSBhbW91bnQgb2YgaW1wcm92ZW1lbnQgdG8gdGhlIHNvbHV0aW9uIHNjb3JlIHRoYXQgZGVmaW5lcyBhIHNvbHV0aW9uIGFzeCAiYmV0dGVyIiBpbiB0aGUgU2lnbmVkIHBoYXNlLjhPZmZjaGFpblJlcGVhdBAQEgAAABC0IFRoZSByZXBlYXQgdGhyZXNob2xkIG9mIHRoZSBvZmZjaGFpbiB3b3JrZXIuAGEBIEZvciBleGFtcGxlLCBpZiBpdCBpcyA1LCB0aGF0IG1lYW5zIHRoYXQgYXQgbGVhc3QgNSBibG9ja3Mgd2lsbCBlbGFwc2UgYmV0d2VlbiBhdHRlbXB0c4QgdG8gc3VibWl0IHRoZSB3b3JrZXIncyBzb2x1dGlvbi48TWluZXJUeFByaW9yaXR5MCBlZmZmZmZm5gQlASBUaGUgcHJpb3JpdHkgb2YgdGhlIHVuc2lnbmVkIHRyYW5zYWN0aW9uIHN1Ym1pdHRlZCBpbiB0aGUgdW5zaWduZWQtcGhhc2VQU2lnbmVkTWF4U3VibWlzc2lvbnMQEBAAAAAc5CBNYXhpbXVtIG51bWJlciBvZiBzaWduZWQgc3VibWlzc2lvbnMgdGhhdCBjYW4gYmUgcXVldWVkLgBVASBJdCBpcyBiZXN0IHRvIGF2b2lkIGFkanVzdGluZyB0aGlzIGR1cmluZyBhbiBlbGVjdGlvbiwgYXMgaXQgaW1wYWN0cyBkb3duc3RyZWFtIGRhdGFlASBzdHJ1Y3R1cmVzLiBJbiBwYXJ0aWN1bGFyLCBgU2lnbmVkU3VibWlzc2lvbkluZGljZXM8VD5gIGlzIGJvdW5kZWQgb24gdGhpcyB2YWx1ZS4gSWYgeW919CB1cGRhdGUgdGhpcyB2YWx1ZSBkdXJpbmcgYW4gZWxlY3Rpb24sIHlvdSBfbXVzdF8gZW5zdXJlIHRoYXRNASBgU2lnbmVkU3VibWlzc2lvbkluZGljZXMubGVuKClgIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgbmV3IHZhbHVlLiBPdGhlcndpc2Us8CBhdHRlbXB0cyB0byBzdWJtaXQgbmV3IHNvbHV0aW9ucyBtYXkgY2F1c2UgYSBydW50aW1lIHBhbmljLjxTaWduZWRNYXhXZWlnaHQoQAuI2GY8VQETo3A9CtejcL0UlCBNYXhpbXVtIHdlaWdodCBvZiBhIHNpZ25lZCBzb2x1dGlvbi4AXQEgSWYgW2BDb25maWc6Ok1pbmVyQ29uZmlnYF0gaXMgYmVpbmcgaW1wbGVtZW50ZWQgdG8gc3VibWl0IHNpZ25lZCBzb2x1dGlvbnMgKG91dHNpZGUgb2Y9ASB0aGlzIHBhbGxldCksIHRoZW4gW2BNaW5lckNvbmZpZzo6c29sdXRpb25fd2VpZ2h0YF0gaXMgdXNlZCB0byBjb21wYXJlIGFnYWluc3QwIHRoaXMgdmFsdWUuQFNpZ25lZE1heFJlZnVuZHMQEAQAAAAEGQEgVGhlIG1heGltdW0gYW1vdW50IG9mIHVuY2hlY2tlZCBzb2x1dGlvbnMgdG8gcmVmdW5kIHRoZSBjYWxsIGZlZSBmb3IuQFNpZ25lZFJld2FyZEJhc2UYQADodkgXAAAAAAAAAAAAAAAEiCBCYXNlIHJld2FyZCBmb3IgYSBzaWduZWQgc29sdXRpb25EU2lnbmVkRGVwb3NpdEJ5dGUYQJD3BAAAAAAAAAAAAAAAAAAEoCBQZXItYnl0ZSBkZXBvc2l0IGZvciBhIHNpZ25lZCBzb2x1dGlvbi5MU2lnbmVkRGVwb3NpdFdlaWdodBhAAAAAAAAAAAAAAAAAAAAAAASoIFBlci13ZWlnaHQgZGVwb3NpdCBmb3IgYSBzaWduZWQgc29sdXRpb24uKE1heFdpbm5lcnMQENAHAAAQNQEgVGhlIG1heGltdW0gbnVtYmVyIG9mIHdpbm5lcnMgdGhhdCBjYW4gYmUgZWxlY3RlZCBieSB0aGlzIGBFbGVjdGlvblByb3ZpZGVyYEAgaW1wbGVtZW50YXRpb24uAFEBIE5vdGU6IFRoaXMgbXVzdCBhbHdheXMgYmUgZ3JlYXRlciBvciBlcXVhbCB0byBgVDo6RGF0YVByb3ZpZGVyOjpkZXNpcmVkX3RhcmdldHMoKWAuOE1pbmVyTWF4TGVuZ3RoEBAAADYAADhNaW5lck1heFdlaWdodChAC4jYZjxVAROjcD0K16NwvQBUTWluZXJNYXhWb3Rlc1BlclZvdGVyEBAYAAAAADxNaW5lck1heFdpbm5lcnMQENAHAAAAAYULJQAMTmlzAQxOaXMQLFF1ZXVlVG90YWxzAQCJC0mc0QcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFGEBIFRoZSB0b3RhbHMgb2YgaXRlbXMgYW5kIGJhbGFuY2VzIHdpdGhpbiBlYWNoIHF1ZXVlLiBTYXZlcyBhIGxvdCBvZiBzdG9yYWdlIHJlYWRzIGluIHRoZYAgY2FzZSBvZiBzcGFyc2VseSBwYWNrZWQgcXVldWVzLgBtASBUaGUgdmVjdG9yIGlzIGluZGV4ZWQgYnkgZHVyYXRpb24gaW4gYFBlcmlvZGBzLCBvZmZzZXQgYnkgb25lLCBzbyBpbmZvcm1hdGlvbiBvbiB0aGUgcXVldWXUIHdob3NlIGR1cmF0aW9uIGlzIG9uZSBgUGVyaW9kYCB3b3VsZCBiZSBzdG9yYWdlIGAwYC4YUXVldWVzAQEEAhCNCwQABOAgVGhlIHF1ZXVlcyBvZiBiaWRzLiBJbmRleGVkIGJ5IGR1cmF0aW9uIChpbiBgUGVyaW9kYHMpLhxTdW1tYXJ5AQCZC6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABLAgU3VtbWFyeSBpbmZvcm1hdGlvbiBvdmVyIHRoZSBnZW5lcmFsIHN0YXRlLiBSZWNlaXB0cwABBAIQnQsEAARBASBUaGUgY3VycmVudGx5IG91dHN0YW5kaW5nIHJlY2VpcHRzLCBpbmRleGVkIGFjY29yZGluZyB0byB0aGUgb3JkZXIgb2YgY3JlYXRpb24uAXUEAdkHKCBQYWxsZXRJZMEJIHB5L25pcyAgBBkBIFRoZSB0cmVhc3VyeSdzIHBhbGxldCBpZCwgdXNlZCBmb3IgZGVyaXZpbmcgaXRzIHNvdmVyZWlnbiBhY2NvdW50IElELihRdWV1ZUNvdW50EBD0AQAACF0BIE51bWJlciBvZiBkdXJhdGlvbiBxdWV1ZXMgaW4gdG90YWwuIFRoaXMgc2V0cyB0aGUgbWF4aW11bSBkdXJhdGlvbiBzdXBwb3J0ZWQsIHdoaWNoIGlzjCB0aGlzIHZhbHVlIG11bHRpcGxpZWQgYnkgYFBlcmlvZGAuLE1heFF1ZXVlTGVuEBDoAwAADPAgTWF4aW11bSBudW1iZXIgb2YgaXRlbXMgdGhhdCBtYXkgYmUgaW4gZWFjaCBkdXJhdGlvbiBxdWV1ZS4AaCBNdXN0IGJlIGxhcmdlciB0aGFuIHplcm8uMEZpZm9RdWV1ZUxlbhAQ+gAAAAwJASBQb3J0aW9uIG9mIHRoZSBxdWV1ZSB3aGljaCBpcyBmcmVlIGZyb20gb3JkZXJpbmcgYW5kIGp1c3QgYSBGSUZPLgCcIE11c3QgYmUgbm8gZ3JlYXRlciB0aGFuIGBNYXhRdWV1ZUxlbmAuKEJhc2VQZXJpb2QQEMCJAQAIQQEgVGhlIGJhc2UgcGVyaW9kIGZvciB0aGUgZHVyYXRpb24gcXVldWVzLiBUaGlzIGlzIHRoZSBjb21tb24gbXVsdGlwbGUgYWNyb3NzIGFsbMwgc3VwcG9ydGVkIGZyZWV6aW5nIGR1cmF0aW9ucyB0aGF0IGNhbiBiZSBiaWQgdXBvbi4YTWluQmlkGEA0NSYaCAMAAAAAAAAAAAAAGCEBIFRoZSBtaW5pbXVtIGFtb3VudCBvZiBmdW5kcyB0aGF0IG1heSBiZSBwbGFjZWQgaW4gYSBiaWQuIE5vdGUgdGhhdCB0aGlzYQEgZG9lcyBub3QgYWN0dWFsbHkgbGltaXQgdGhlIGFtb3VudCB3aGljaCBtYXkgYmUgcmVwcmVzZW50ZWQgaW4gYSByZWNlaXB0IHNpbmNlIGJpZHMgbWF5bCBiZSBzcGxpdCB1cCBieSB0aGUgc3lzdGVtLgBlASBJdCBzaG91bGQgYmUgYXQgbGVhc3QgYmlnIGVub3VnaCB0byBlbnN1cmUgdGhhdCB0aGVyZSBpcyBubyBwb3NzaWJsZSBzdG9yYWdlIHNwYW0gYXR0YWNrZCBvciBxdWV1ZS1maWxsaW5nIGF0dGFjay4oTWluUmVjZWlwdJ0CIADodkgXAAAACFUBIFRoZSBtaW5pbXVtIGFtb3VudCBvZiBmdW5kcyB3aGljaCBtYXkgaW50ZW50aW9uYWxseSBiZSBsZWZ0IHJlbWFpbmluZyB1bmRlciBhIHNpbmdsZSQgcmVjZWlwdC4wSW50YWtlUGVyaW9kEBAyAAAAEF0BIFRoZSBudW1iZXIgb2YgYmxvY2tzIGJldHdlZW4gY29uc2VjdXRpdmUgYXR0ZW1wdHMgdG8gZGVxdWV1ZSBiaWRzIGFuZCBjcmVhdGUgcmVjZWlwdHMuAF0BIEEgbGFyZ2VyIHZhbHVlIHJlc3VsdHMgaW4gZmV3ZXIgc3RvcmFnZSBoaXRzIGVhY2ggYmxvY2ssIGJ1dCBhIHNsb3dlciBwZXJpb2QgdG8gZ2V0IHRvMCB0aGUgdGFyZ2V0LjxNYXhJbnRha2VXZWlnaHQoPAcA0O2QLhOZmZmZmZmZGQxVASBUaGUgbWF4aW11bSBhbW91bnQgb2YgYmlkcyB0aGF0IGNhbiBjb25zb2xpZGF0ZWQgaW50byByZWNlaXB0cyBpbiBhIHNpbmdsZSBpbnRha2UuIEFdASBsYXJnZXIgdmFsdWUgaGVyZSBtZWFucyBsZXNzIG9mIHRoZSBibG9jayBhdmFpbGFibGUgZm9yIHRyYW5zYWN0aW9ucyBzaG91bGQgdGhlcmUgYmUgYTggZ2x1dCBvZiBiaWRzLjBUaGF3VGhyb3R0bGWhCzAAANnprC14AwUAAAAESQEgVGhlIG1heGltdW0gcHJvcG9ydGlvbiB3aGljaCBtYXkgYmUgdGhhd2VkIGFuZCB0aGUgcGVyaW9kIG92ZXIgd2hpY2ggaXQgaXMgcmVzZXQuAaULJgBYTmlzQ291bnRlcnBhcnRCYWxhbmNlcwFYTmlzQ291bnRlcnBhcnRCYWxhbmNlcxw0VG90YWxJc3N1YW5jZQEAGEAAAAAAAAAAAAAAAAAAAAAABJggVGhlIHRvdGFsIHVuaXRzIGlzc3VlZCBpbiB0aGUgc3lzdGVtLkBJbmFjdGl2ZUlzc3VhbmNlAQAYQAAAAAAAAAAAAAAAAAAAAAAECQEgVGhlIHRvdGFsIHVuaXRzIG9mIG91dHN0YW5kaW5nIGRlYWN0aXZhdGVkIGJhbGFuY2UgaW4gdGhlIHN5c3RlbS4cQWNjb3VudAEBBAIAFAEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgGAJASBUaGUgQmFsYW5jZXMgcGFsbGV0IGV4YW1wbGUgb2Ygc3RvcmluZyB0aGUgYmFsYW5jZSBvZiBhbiBhY2NvdW50LgAoICMgRXhhbXBsZQA0IGBgYG5vY29tcGlsZbAgIGltcGwgcGFsbGV0X2JhbGFuY2VzOjpDb25maWcgZm9yIFJ1bnRpbWUgexkCICAgIHR5cGUgQWNjb3VudFN0b3JlID0gU3RvcmFnZU1hcFNoaW08U2VsZjo6QWNjb3VudDxSdW50aW1lPiwgZnJhbWVfc3lzdGVtOjpQcm92aWRlcjxSdW50aW1lPiwgQWNjb3VudElkLCBTZWxmOjpBY2NvdW50RGF0YTxCYWxhbmNlPj4MICB9ECBgYGAAFQEgWW91IGNhbiBhbHNvIHN0b3JlIHRoZSBiYWxhbmNlIG9mIGFuIGFjY291bnQgaW4gdGhlIGBTeXN0ZW1gIHBhbGxldC4AKCAjIEV4YW1wbGUANCBgYGBub2NvbXBpbGWwICBpbXBsIHBhbGxldF9iYWxhbmNlczo6Q29uZmlnIGZvciBSdW50aW1lIHt0ICAgdHlwZSBBY2NvdW50U3RvcmUgPSBTeXN0ZW0MICB9ECBgYGAAUQEgQnV0IHRoaXMgY29tZXMgd2l0aCB0cmFkZW9mZnMsIHN0b3JpbmcgYWNjb3VudCBiYWxhbmNlcyBpbiB0aGUgc3lzdGVtIHBhbGxldCBzdG9yZXNtASBgZnJhbWVfc3lzdGVtYCBkYXRhIGFsb25nc2lkZSB0aGUgYWNjb3VudCBkYXRhIGNvbnRyYXJ5IHRvIHN0b3JpbmcgYWNjb3VudCBiYWxhbmNlcyBpbiB0aGUpASBgQmFsYW5jZXNgIHBhbGxldCwgd2hpY2ggdXNlcyBhIGBTdG9yYWdlTWFwYCB0byBzdG9yZSBiYWxhbmNlcyBkYXRhIG9ubHkuQQEgTk9URTogVGhpcyBpcyBvbmx5IHVzZWQgaW4gdGhlIGNhc2UgdGhhdCB0aGlzIHBhbGxldCBpcyB1c2VkIHRvIHN0b3JlIGJhbGFuY2VzLhRMb2NrcwEBBAIAqQsEABC4IEFueSBsaXF1aWRpdHkgbG9ja3Mgb24gc29tZSBhY2NvdW50IGJhbGFuY2VzLiUBIE5PVEU6IFNob3VsZCBvbmx5IGJlIGFjY2Vzc2VkIHdoZW4gc2V0dGluZywgY2hhbmdpbmcgYW5kIGZyZWVpbmcgYSBsb2NrLgCtASBVc2Ugb2YgbG9ja3MgaXMgZGVwcmVjYXRlZCBpbiBmYXZvdXIgb2YgZnJlZXplcy4gU2VlIGBodHRwczovL2dpdGh1Yi5jb20vcGFyaXR5dGVjaC9zdWJzdHJhdGUvcHVsbC8xMjk1MS9gIFJlc2VydmVzAQEEAgCtCwQADKQgTmFtZWQgcmVzZXJ2ZXMgb24gc29tZSBhY2NvdW50IGJhbGFuY2VzLgCxASBVc2Ugb2YgcmVzZXJ2ZXMgaXMgZGVwcmVjYXRlZCBpbiBmYXZvdXIgb2YgaG9sZHMuIFNlZSBgaHR0cHM6Ly9naXRodWIuY29tL3Bhcml0eXRlY2gvc3Vic3RyYXRlL3B1bGwvMTI5NTEvYBRIb2xkcwEBBAIA4QgEAARsIEhvbGRzIG9uIGFjY291bnQgYmFsYW5jZXMuHEZyZWV6ZXMBAQQCALELBAAEiCBGcmVlemUgbG9ja3Mgb24gYWNjb3VudCBiYWxhbmNlcy4BeQQB3QcQSEV4aXN0ZW50aWFsRGVwb3NpdBhAAOQLVAIAAAAAAAAAAAAAACBBASBUaGUgbWluaW11bSBhbW91bnQgcmVxdWlyZWQgdG8ga2VlcCBhbiBhY2NvdW50IG9wZW4uIE1VU1QgQkUgR1JFQVRFUiBUSEFOIFpFUk8hAFkBIElmIHlvdSAqcmVhbGx5KiBuZWVkIGl0IHRvIGJlIHplcm8sIHlvdSBjYW4gZW5hYmxlIHRoZSBmZWF0dXJlIGBpbnNlY3VyZV96ZXJvX2VkYCBmb3JhASB0aGlzIHBhbGxldC4gSG93ZXZlciwgeW91IGRvIHNvIGF0IHlvdXIgb3duIHJpc2s6IHRoaXMgd2lsbCBvcGVuIHVwIGEgbWFqb3IgRG9TIHZlY3Rvci5ZASBJbiBjYXNlIHlvdSBoYXZlIG11bHRpcGxlIHNvdXJjZXMgb2YgcHJvdmlkZXIgcmVmZXJlbmNlcywgeW91IG1heSBhbHNvIGdldCB1bmV4cGVjdGVkjCBiZWhhdmlvdXIgaWYgeW91IHNldCB0aGlzIHRvIHplcm8uAPAgQm90dG9tIGxpbmU6IERvIHlvdXJzZWxmIGEgZmF2b3VyIGFuZCBtYWtlIGl0IGF0IGxlYXN0IG9uZSEgTWF4TG9ja3MQEAQAAAAQ9CBUaGUgbWF4aW11bSBudW1iZXIgb2YgbG9ja3MgdGhhdCBzaG91bGQgZXhpc3Qgb24gYW4gYWNjb3VudC7cIE5vdCBzdHJpY3RseSBlbmZvcmNlZCwgYnV0IHVzZWQgZm9yIHdlaWdodCBlc3RpbWF0aW9uLgCtASBVc2Ugb2YgbG9ja3MgaXMgZGVwcmVjYXRlZCBpbiBmYXZvdXIgb2YgZnJlZXplcy4gU2VlIGBodHRwczovL2dpdGh1Yi5jb20vcGFyaXR5dGVjaC9zdWJzdHJhdGUvcHVsbC8xMjk1MS9gLE1heFJlc2VydmVzEBAEAAAADA0BIFRoZSBtYXhpbXVtIG51bWJlciBvZiBuYW1lZCByZXNlcnZlcyB0aGF0IGNhbiBleGlzdCBvbiBhbiBhY2NvdW50LgCxASBVc2Ugb2YgcmVzZXJ2ZXMgaXMgZGVwcmVjYXRlZCBpbiBmYXZvdXIgb2YgaG9sZHMuIFNlZSBgaHR0cHM6Ly9naXRodWIuY29tL3Bhcml0eXRlY2gvc3Vic3RyYXRlL3B1bGwvMTI5NTEvYChNYXhGcmVlemVzEBABAAAABGEBIFRoZSBtYXhpbXVtIG51bWJlciBvZiBpbmRpdmlkdWFsIGZyZWV6ZSBsb2NrcyB0aGF0IGNhbiBleGlzdCBvbiBhbiBhY2NvdW50IGF0IGFueSB0aW1lLgG9Cy0AJFZvdGVyTGlzdAEkVm90ZXJMaXN0DCRMaXN0Tm9kZXMAAQQFAMELBAAMgCBBIHNpbmdsZSBub2RlLCB3aXRoaW4gc29tZSBiYWcuAAUBIE5vZGVzIHN0b3JlIGxpbmtzIGZvcndhcmQgYW5kIGJhY2sgd2l0aGluIHRoZWlyIHJlc3BlY3RpdmUgYmFncy5MQ291bnRlckZvckxpc3ROb2RlcwEAEBAAAAAABKxD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ZiB0aHJlc2hvbGRzIHNlcGFyYXRpbmcgdGhlIHZhcmlvdXMgYmFncy4ASQEgSWRzIGFyZSBzZXBhcmF0ZWQgaW50byB1bnNvcnRlZCBiYWdzIGFjY29yZGluZyB0byB0aGVpciBzY29yZS4gVGhpcyBzcGVjaWZpZXMgdGhlYQEgdGhyZXNob2xkcyBzZXBhcmF0aW5nIHRoZSBiYWdzLiBBbiBpZCdzIGJhZyBpcyB0aGUgbGFyZ2VzdCBiYWcgZm9yIHdoaWNoIHRoZSBpZCdzIHNjb3JluCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gaXRzIHVwcGVyIHRocmVzaG9sZC4AZQEgV2hlbiBpZHMgYXJlIGl0ZXJhdGVkLCBoaWdoZXIgYmFncyBhcmUgaXRlcmF0ZWQgY29tcGxldGVseSBiZWZvcmUgbG93ZXIgYmFncy4gVGhpcyBtZWFuc1kBIHRoYXQgaXRlcmF0aW9uIGlzIF9zZW1pLXNvcnRlZF86IGlkcyBvZiBoaWdoZXIgc2NvcmUgdGVuZCB0byBjb21lIGJlZm9yZSBpZHMgb2YgbG93ZXItASBzY29yZSwgYnV0IHBlZXIgaWRzIHdpdGhpbiBhIHBhcnRpY3VsYXIgYmFnIGFyZSBzb3J0ZWQgaW4gaW5zZXJ0aW9uIG9yZGVyLgBoICMgRXhwcmVzc2luZyB0aGUgY29uc3RhbnQATQEgVGhpcyBjb25zdGFudCBtdXN0IGJlIHNvcnRlZCBpbiBzdHJpY3RseSBpbmNyZWFzaW5nIG9yZGVyLiBEdXBsaWNhdGUgaXRlbXMgYXJlIG5vdCwgcGVybWl0dGVkLgBBASBUaGVyZSBpcyBhbiBpbXBsaWVkIHVwcGVyIGxpbWl0IG9mIGBTY29yZTo6TUFYYDsgdGhhdCB2YWx1ZSBkb2VzIG5vdCBuZWVkIHRvIGJlIQEgc3BlY2lmaWVkIHdpdGhpbiB0aGUgYmFnLiBGb3IgYW55IHR3byB0aHJlc2hvbGQgbGlzdHMsIGlmIG9uZSBlbmRzIHdpdGgxASBgU2NvcmU6Ok1BWGAsIHRoZSBvdGhlciBvbmUgZG9lcyBub3QsIGFuZCB0aGV5IGFyZSBvdGhlcndpc2UgZXF1YWwsIHRoZSB0d298IGxpc3RzIHdpbGwgYmVoYXZlIGlkZW50aWNhbGx5LgA4ICMgQ2FsY3VsYXRpb24AVQEgSXQgaXMgcmVjb21tZW5kZWQgdG8gZ2VuZXJhdGUgdGhlIHNldCBvZiB0aHJlc2hvbGRzIGluIGEgZ2VvbWV0cmljIHNlcmllcywgc3VjaCB0aGF0QQEgdGhlcmUgZXhpc3RzIHNvbWUgY29uc3RhbnQgcmF0aW8gc3VjaCB0aGF0IGB0aHJlc2hvbGRbayArIDFdID09ICh0aHJlc2hvbGRba10gKtAgY29uc3RhbnRfcmF0aW8pLm1heCh0aHJlc2hvbGRba10gKyAxKWAgZm9yIGFsbCBga2AuAFkBIFRoZSBoZWxwZXJzIGluIHRoZSBgL3V0aWxzL2ZyYW1lL2dlbmVyYXRlLWJhZ3NgIG1vZHVsZSBjYW4gc2ltcGxpZnkgdGhpcyBjYWxjdWxhdGlvbi4ALCAjIEV4YW1wbGVzAFEBIC0gSWYgYEJhZ1RocmVzaG9sZHM6OmdldCgpLmlzX2VtcHR5KClgLCB0aGVuIGFsbCBpZHMgYXJlIHB1dCBpbnRvIHRoZSBzYW1lIGJhZywgYW5ksCAgIGl0ZXJhdGlvbiBpcyBzdHJpY3RseSBpbiBpbnNlcnRpb24gb3JkZXIuYQEgLSBJZiBgQmFnVGhyZXNob2xkczo6Z2V0KCkubGVuKCkgPT0gNjRgLCBhbmQgdGhlIHRocmVzaG9sZHMgYXJlIGRldGVybWluZWQgYWNjb3JkaW5nIHRvEQEgICB0aGUgcHJvY2VkdXJlIGdpdmVuIGFib3ZlLCB0aGVuIHRoZSBjb25zdGFudCByYXRpbyBpcyBlcXVhbCB0byAyLmUBIC0gSWYgYEJhZ1RocmVzaG9sZHM6OmdldCgpLmxlbigpID09IDIwMGAsIGFuZCB0aGUgdGhyZXNob2xkcyBhcmUgZGV0ZXJtaW5lZCBhY2NvcmRpbmcgdG9ZASAgIHRoZSBwcm9jZWR1cmUgZ2l2ZW4gYWJvdmUsIHRoZW4gdGhlIGNvbnN0YW50IHJhdGlvIGlzIGFwcHJveGltYXRlbHkgZXF1YWwgdG8gMS4yNDguYQEgLSBJZiB0aGUgdGhyZXNob2xkIGxpc3QgYmVnaW5zIGBbMSwgMiwgMywgLi4uXWAsIHRoZW4gYW4gaWQgd2l0aCBzY29yZSAwIG9yIDEgd2lsbCBmYWxs8CAgIGludG8gYmFnIDAsIGFuIGlkIHdpdGggc2NvcmUgMiB3aWxsIGZhbGwgaW50byBiYWcgMSwgZXRjLgAwICMgTWlncmF0aW9uAGEBIEluIHRoZSBldmVudCB0aGF0IHRoaXMgbGlzdCBldmVyIGNoYW5nZXMsIGEgY29weSBvZiB0aGUgb2xkIGJhZ3MgbGlzdCBtdXN0IGJlIHJldGFpbmVkLl0BIFdpdGggdGhhdCBgTGlzdDo6bWlncmF0ZWAgY2FuIGJlIGNhbGxlZCwgd2hpY2ggd2lsbCBwZXJmb3JtIHRoZSBhcHByb3ByaWF0ZSBtaWdyYXRpb24uAc0LJwA8Tm9taW5hdGlvblBvb2xzATxOb21pbmF0aW9uUG9vbHNUQFRvdGFsVmFsdWVMb2NrZWQBABhAAAAAAAAAAAAAAAAAAAAAABSMIFRoZSBzdW0gb2YgZnVuZHMgYWNyb3NzIGFsbCBwb29scy4AcQEgVGhpcyBtaWdodCBiZSBsb3dlciBidXQgbmV2ZXIgaGlnaGVyIHRoYW4gdGhlIHN1bSBvZiBgdG90YWxfYmFsYW5jZWAgb2YgYWxsIFtgUG9vbE1lbWJlcnNgXVkBIGJlY2F1c2UgY2FsbGluZyBgcG9vbF93aXRoZHJhd191bmJvbmRlZGAgbWlnaHQgZGVjcmVhc2UgdGhlIHRvdGFsIHN0YWtlIG9mIHRoZSBwb29sJ3MpASBgYm9uZGVkX2FjY291bnRgIHdpdGhvdXQgYWRqdXN0aW5nIHRoZSBwYWxsZXQtaW50ZXJuYWwgYFVuYm9uZGluZ1Bvb2xgJ3MuLE1pbkpvaW5Cb25kAQAYQAAAAAAAAAAAAAAAAAAAAAAEnCBNaW5pbXVtIGFtb3VudCB0byBib25kIHRvIGpvaW4gYSBwb29sLjRNaW5DcmVhdGVCb25kAQAYQAAAAAAAAAAAAAAAAAAAAAAcoCBNaW5pbXVtIGJvbmQgcmVxdWlyZWQgdG8gY3JlYXRlIGEgcG9vbC4AZQEgVGhpcyBpcyB0aGUgYW1vdW50IHRoYXQgdGhlIGRlcG9zaXRvciBtdXN0IHB1dCBhcyB0aGVpciBpbml0aWFsIHN0YWtlIGluIHRoZSBwb29sLCBhcyBhboggaW5kaWNhdGlvbiBvZiAic2tpbiBpbiB0aGUgZ2FtZSIuAGkBIFRoaXMgaXMgdGhlIHZhbHVlIHRoYXQgd2lsbCBhbHdheXMgZXhpc3QgaW4gdGhlIHN0YWtpbmcgbGVkZ2VyIG9mIHRoZSBwb29sIGJvbmRlZCBhY2NvdW50gCB3aGlsZSBhbGwgb3RoZXIgYWNjb3VudHMgbGVhdmUuIE1heFBvb2xzAAAQBAAIaQEgTWF4aW11bSBudW1iZXIgb2Ygbm9taW5hdGlvbiBwb29scyB0aGF0IGNhbiBleGlzdC4gSWYgYE5vbmVgLCB0aGVuIGFuIHVuYm91bmRlZCBudW1iZXIgb2ZEIHBvb2xzIGNhbiBleGlzdC44TWF4UG9vbE1lbWJlcnMAABAEAAhJASBNYXhpbXVtIG51bWJlciBvZiBtZW1iZXJzIHRoYXQgY2FuIGV4aXN0IGluIHRoZSBzeXN0ZW0uIElmIGBOb25lYCwgdGhlbiB0aGUgY291bnS4IG1lbWJlcnMgYXJlIG5vdCBib3VuZCBvbiBhIHN5c3RlbSB3aWRlIGJhc2lzLlRNYXhQb29sTWVtYmVyc1BlclBvb2wAABAEAAhBASBNYXhpbXVtIG51bWJlciBvZiBtZW1iZXJzIHRoYXQgbWF5IGJlbG9uZyB0byBwb29sLiBJZiBgTm9uZWAsIHRoZW4gdGhlIGNvdW50IG9mqCBtZW1iZXJzIGlzIG5vdCBib3VuZCBvbiBhIHBlciBwb29sIGJhc2lzLkxHbG9iYWxNYXhDb21taXNzaW9uAACUBAAMaQEgVGhlIG1heGltdW0gY29tbWlzc2lvbiB0aGF0IGNhbiBiZSBjaGFyZ2VkIGJ5IGEgcG9vbC4gVXNlZCBvbiBjb21taXNzaW9uIHBheW91dHMgdG8gYm91bmQlASBwb29sIGNvbW1pc3Npb25zIHRoYXQgYXJlID4gYEdsb2JhbE1heENvbW1pc3Npb25gLCBuZWNlc3NhcnkgaWYgYSBmdXR1cmUNASBgR2xvYmFsTWF4Q29tbWlzc2lvbmAgaXMgbG93ZXIgdGhhbiBzb21lIGN1cnJlbnQgcG9vbCBjb21taXNzaW9ucy4sUG9vbE1lbWJlcnMAAQQFANULBAAMQCBBY3RpdmUgbWVtYmVycy4A0CBUV09YLU5PVEU6IFNBRkUgc2luY2UgYEFjY291bnRJZGAgaXMgYSBzZWN1cmUgaGFzaC5UQ291bnRlckZvclBvb2xNZW1iZXJzAQAQEAAAAAAErENvdW50ZXIgZm9yIHRoZSByZWxhdGVkIGNvdW50ZWQgc3RvcmFnZSBtYXAsQm9uZGVkUG9vbHMAAQQFEOELBAAEaCBTdG9yYWdlIGZvciBib25kZWQgcG9vbHMuVENvdW50ZXJGb3JCb25kZWRQb29scwEAEBAAAAAABKxDb3VudGVyIGZvciB0aGUgcmVsYXRlZCBjb3VudGVkIHN0b3JhZ2UgbWFwLFJld2FyZFBvb2xzAAEEBRD1CwQACHUBIFJld2FyZCBwb29scy4gVGhpcyBpcyB3aGVyZSB0aGVyZSByZXdhcmRzIGZvciBlYWNoIHBvb2wgYWNjdW11bGF0ZS4gV2hlbiBhIG1lbWJlcnMgcGF5b3V0IGlzWQEgY2xhaW1lZCwgdGhlIGJhbGFuY2UgY29tZXMgb3V0IG9mIHRoZSByZXdhcmQgcG9vbC4gS2V5ZWQgYnkgdGhlIGJvbmRlZCBwb29scyBhY2NvdW50LlRDb3VudGVyRm9yUmV3YXJkUG9vbHMBABAQAAAAAASsQ291bnRlciBmb3IgdGhlIHJlbGF0ZWQgY291bnRlZCBzdG9yYWdlIG1hcDxTdWJQb29sc1N0b3JhZ2UAAQQFEPkLBAAIGQEgR3JvdXBzIG9mIHVuYm9uZGluZyBwb29scy4gRWFjaCBncm91cCBvZiB1bmJvbmRpbmcgcG9vbHMgYmVsb25ncyB0byBhKQEgYm9uZGVkIHBvb2wsIGhlbmNlIHRoZSBuYW1lIHN1Yi1wb29scy4gS2V5ZWQgYnkgdGhlIGJvbmRlZCBwb29scyBhY2NvdW50LmRDb3VudGVyRm9yU3ViUG9vbHNTdG9yYWdlAQAQEAAAAAAErENvdW50ZXIgZm9yIHRoZSByZWxhdGVkIGNvdW50ZWQgc3RvcmFnZSBtYXAgTWV0YWRhdGEBAQQFEBEMBAAEXCBNZXRhZGF0YSBmb3IgdGhlIHBvb2wuSENvdW50ZXJGb3JNZXRhZGF0YQEAEBAAAAAABKxDb3VudGVyIGZvciB0aGUgcmVsYXRlZCBjb3VudGVkIHN0b3JhZ2UgbWFwKExhc3RQb29sSWQBABAQAAAAAATQIEV2ZXIgaW5jcmVhc2luZyBudW1iZXIgb2YgYWxsIHBvb2xzIGNyZWF0ZWQgc28gZmFyLkxSZXZlcnNlUG9vbElkTG9va3VwAAEEBQAQBAAQ3CBBIHJldmVyc2UgbG9va3VwIGZyb20gdGhlIHBvb2wncyBhY2NvdW50IGlkIHRvIGl0cyBpZC4AdQEgVGhpcyBpcyBvbmx5IHVzZWQgZm9yIHNsYXNoaW5nIGFuZCBvbiBhdXRvbWF0aWMgd2l0aGRyYXcgdXBkYXRlLiBJbiBhbGwgb3RoZXIgaW5zdGFuY2VzLCB0aGUlASBwb29sIGlkIGlzIHVzZWQsIGFuZCB0aGUgYWNjb3VudHMgYXJlIGRldGVybWluaXN0aWNhbGx5IGRlcml2ZWQgZnJvbSBpdC50Q291bnRlckZvclJldmVyc2VQb29sSWRMb29rdXABABAQAAAAAASsQ291bnRlciBmb3IgdGhlIHJlbGF0ZWQgY291bnRlZCBzdG9yYWdlIG1hcEBDbGFpbVBlcm1pc3Npb25zAQEEBQCdBAQCBAEBIE1hcCBmcm9tIGEgcG9vbCBtZW1iZXIgYWNjb3VudCB0byB0aGVpciBvcHRlZCBjbGFpbSBwZXJtaXNzaW9uLgGBBAHlBwwgUGFsbGV0SWTBCSBweS9ub3BscwSEIFRoZSBub21pbmF0aW9uIHBvb2wncyBwYWxsZXQgaWQuSE1heFBvaW50c1RvQmFsYW5jZQgECjAdASBUaGUgbWF4aW11bSBwb29sIHBvaW50cy10by1iYWxhbmNlIHJhdGlvIHRoYXQgYW4gYG9wZW5gIHBvb2wgY2FuIGhhdmUuAFUBIFRoaXMgaXMgaW1wb3J0YW50IGluIHRoZSBldmVudCBzbGFzaGluZyB0YWtlcyBwbGFjZSBhbmQgdGhlIHBvb2wncyBwb2ludHMtdG8tYmFsYW5jZXwgcmF0aW8gYmVjb21lcyBkaXNwcm9wb3J0aW9uYWwuAGUBIE1vcmVvdmVyLCB0aGlzIHJlbGF0ZXMgdG8gdGhlIGBSZXdhcmRDb3VudGVyYCB0eXBlIGFzIHdlbGwsIGFzIHRoZSBhcml0aG1ldGljIG9wZXJhdGlvbnNVASBhcmUgYSBmdW5jdGlvbiBvZiBudW1iZXIgb2YgcG9pbnRzLCBhbmQgYnkgc2V0dGluZyB0aGlzIHZhbHVlIHRvIGUuZy4gMTAsIHlvdSBlbnN1cmVlASB0aGF0IHRoZSB0b3RhbCBudW1iZXIgb2YgcG9pbnRzIGluIHRoZSBzeXN0ZW0gYXJlIGF0IG1vc3QgMTAgdGltZXMgdGhlIHRvdGFsX2lzc3VhbmNlIG9mnCB0aGUgY2hhaW4sIGluIHRoZSBhYnNvbHV0ZSB3b3JzZSBjYXNlLgBJASBGb3IgYSB2YWx1ZSBvZiAxMCwgdGhlIHRocmVzaG9sZCB3b3VsZCBiZSBhIHBvb2wgcG9pbnRzLXRvLWJhbGFuY2UgcmF0aW8gb2YgMTA6MS4xASBTdWNoIGEgc2NlbmFyaW8gd291bGQgYWxzbyBiZSB0aGUgZXF1aXZhbGVudCBvZiB0aGUgcG9vbCBiZWluZyA5MCUgc2xhc2hlZC4wTWF4VW5ib25kaW5nEBAgAAAABD0BIFRoZSBtYXhpbXVtIG51bWJlciBvZiBzaW11bHRhbmVvdXMgdW5ib25kaW5nIGNodW5rcyB0aGF0IGNhbiBleGlzdCBwZXIgbWVtYmVyLgEVDCkALEZhc3RVbnN0YWtlASxGYXN0VW5zdGFrZRAQSGVhZAAAHQwEAAzAIFRoZSBjdXJyZW50ICJoZWFkIG9mIHRoZSBxdWV1ZSIgYmVpbmcgdW5zdGFrZWQuACkBIFRoZSBoZWFkIGluIGl0c2VsZiBjYW4gYmUgYSBiYXRjaCBvZiB1cCB0byBbYENvbmZpZzo6QmF0Y2hTaXplYF0gc3Rha2Vycy4UUXVldWUAAQQFABgEAAzAIFRoZSBtYXAgb2YgYWxsIGFjY291bnRzIHdpc2hpbmcgdG8gYmUgdW5zdGFrZWQuADkBIEtlZXBzIHRyYWNrIG9mIGBBY2NvdW50SWRgIHdpc2hpbmcgdG8gdW5zdGFrZSBhbmQgaXQncyBjb3JyZXNwb25kaW5nIGRlcG9zaXQuPENvdW50ZXJGb3JRdWV1ZQEAEBAAAAAABKxDb3VudGVyIGZvciB0aGUgcmVsYXRlZCBjb3VudGVkIHN0b3JhZ2UgbWFwTEVyYXNUb0NoZWNrUGVyQmxvY2sBABAQAAAAACCMIE51bWJlciBvZiBlcmFzIHRvIGNoZWNrIHBlciBibG9jay4ANQEgSWYgc2V0IHRvIDAsIHRoaXMgcGFsbGV0IGRvZXMgYWJzb2x1dGVseSBub3RoaW5nLiBDYW5ub3QgYmUgc2V0IHRvIG1vcmUgdGhhbpAgW2BDb25maWc6Ok1heEVyYXNUb0NoZWNrUGVyQmxvY2tgXS4AZQEgQmFzZWQgb24gdGhlIGFtb3VudCBvZiB3ZWlnaHQgYXZhaWxhYmxlIGF0IFtgUGFsbGV0Ojpvbl9pZGxlYF0sIHVwIHRvIHRoaXMgbWFueSBlcmFzIGFyZV0BIGNoZWNrZWQuIFRoZSBjaGVja2luZyBpcyByZXByZXNlbnRlZCBieSB1cGRhdGluZyBbYFVuc3Rha2VSZXF1ZXN0OjpjaGVja2VkYF0sIHdoaWNoIGlzUCBzdG9yZWQgaW4gW2BIZWFkYF0uAbUEAekHBBxEZXBvc2l0GEA0TdLCBwAAAAAAAAAAAAAACGUBIERlcG9zaXQgdG8gdGFrZSBmb3IgdW5zdGFraW5nLCB0byBtYWtlIHN1cmUgd2UncmUgYWJsZSB0byBzbGFzaCB0aGUgaXQgaW4gb3JkZXIgdG8gY292ZXLAIHRoZSBjb3N0cyBvZiByZXNvdXJjZXMgb24gdW5zdWNjZXNzZnVsIHVuc3Rha2UuASkMKgBAUGFyYWNoYWluc09yaWdpbgAAAAAAMhB5ASBUaGVyZSBpcyBubyB3YXkgdG8gcmVnaXN0ZXIgYW4gb3JpZ2luIHR5cGUgaW4gYGNvbnN0cnVjdF9ydW50aW1lYCB3aXRob3V0IGEgcGFsbGV0IHRoZSBvcmlnaW4wIGJlbG9uZ3MgdG8uAHUBIFRoaXMgbW9kdWxlIGZ1bGZpbGxzIG9ubHkgdGhlIHNpbmdsZSBwdXJwb3NlIG9mIGhvdXNpbmcgdGhlIGBPcmlnaW5gIGluIGBjb25zdHJ1Y3RfcnVudGltZWAuNENvbmZpZ3VyYXRpb24BNENvbmZpZ3VyYXRpb24MMEFjdGl2ZUNvbmZpZwEALQxBAwAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAGQAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAIAAAACAAAAAgAAAAABAAAAAQAAAAEAAAAAAQAAAAAAAAAAAAAAECcAAICy5g6Aw8kBgJaYAAAAAAAAAAAAAAAAAAUAAAAEyCBUaGUgYWN0aXZlIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBjdXJyZW50IHNlc3Npb24uOFBlbmRpbmdDb25maWdzAQAxDAQAHHwgUGVuZGluZyBjb25maWd1cmF0aW9uIGNoYW5nZXMuAFkBIFRoaXMgaXMgYSBsaXN0IG9mIGNvbmZpZ3VyYXRpb24gY2hhbmdlcywgZWFjaCB3aXRoIGEgc2Vzc2lvbiBpbmRleCBhdCB3aGljaCBpdCBzaG91bGQwIGJlIGFwcGxpZWQuAGEBIFRoZSBsaXN0IGlzIHNvcnRlZCBhc2NlbmRpbmcgYnkgc2Vzc2lvbiBpbmRleC4gQWxzbywgdGhpcyBsaXN0IGNhbiBvbmx5IGNvbnRhaW4gYXQgbW9zdPwgMiBpdGVtczogZm9yIHRoZSBuZXh0IHNlc3Npb24gYW5kIGZvciB0aGUgYHNjaGVkdWxlZF9zZXNzaW9uYC5YQnlwYXNzQ29uc2lzdGVuY3lDaGVjawEAIAQACGEBIElmIHRoaXMgaXMgc2V0LCB0aGVuIHRoZSBjb25maWd1cmF0aW9uIHNldHRlcnMgd2lsbCBieXBhc3MgdGhlIGNvbnNpc3RlbmN5IGNoZWNrcy4gVGhpc7QgaXMgbWVhbnQgdG8gYmUgdXNlZCBvbmx5IGFzIHRoZSBsYXN0IHJlc29ydC4BuQQAAAE5DDMALFBhcmFzU2hhcmVkASxQYXJhc1NoYXJlZBBMQ3VycmVudFNlc3Npb25JbmRleAEAEBAAAAAABGwgVGhlIGN1cnJlbnQgc2Vzc2lvbiBpbmRleC5YQWN0aXZlVmFsaWRhdG9ySW5kaWNlcwEAPQwEAAgJASBBbGwgdGhlIHZhbGlkYXRvcnMgYWN0aXZlbHkgcGFydGljaXBhdGluZyBpbiBwYXJhY2hhaW4gY29uc2Vuc3VzLrAgSW5kaWNlcyBhcmUgaW50byB0aGUgYnJvYWRlciB2YWxpZGF0b3Igc2V0LkxBY3RpdmVWYWxpZGF0b3JLZXlzAQBBDAQACFUBIFRoZSBwYXJhY2hhaW4gYXR0ZXN0YXRpb24ga2V5cyBvZiB0aGUgdmFsaWRhdG9ycyBhY3RpdmVseSBwYXJ0aWNpcGF0aW5nIGluIHBhcmFjaGFpbh0BIGNvbnNlbnN1cy4gVGhpcyBzaG91bGQgYmUgdGhlIHNhbWUgbGVuZ3RoIGFzIGBBY3RpdmVWYWxpZGF0b3JJbmRpY2VzYC5MQWxsb3dlZFJlbGF5UGFyZW50cwEARQwUAAAAAAAEbCBBbGwgYWxsb3dlZCByZWxheS1wYXJlbnRzLgHdBAAAADQANFBhcmFJbmNsdXNpb24BNFBhcmFJbmNsdXNpb24ECFYxAAEEBWkCUQwEABRhASBDYW5kaWRhdGVzIHBlbmRpbmcgYXZhaWxhYmlsaXR5IGJ5IGBQYXJhSWRgLiBUaGV5IGZvcm0gYSBjaGFpbiBzdGFydGluZyBmcm9tIHRoZSBsYXRlc3RsIGluY2x1ZGVkIGhlYWQgb2YgdGhlIHBhcmEuYQEgVXNlIGEgZGlmZmVyZW50IHByZWZpeCBwb3N0LW1pZ3JhdGlvbiB0byB2MSwgc2luY2UgdGhlIHYwIGBQZW5kaW5nQXZhaWxhYmlsaXR5YCBzdG9yYWdlcQEgd291bGQgb3RoZXJ3aXNlIGhhdmUgdGhlIGV4YWN0IHNhbWUgcHJlZml4IHdoaWNoIGNvdWxkIGNhdXNlIHVuZGVmaW5lZCBiZWhhdmlvdXIgd2hlbiBkb2luZzwgdGhlIG1pZ3JhdGlvbi4B4QQB7QcAAVkMNQAwUGFyYUluaGVyZW50ATBQYXJhSW5oZXJlbnQIIEluY2x1ZGVkAAChAQQAGOwgV2hldGhlciB0aGUgcGFyYXMgaW5oZXJlbnQgd2FzIGluY2x1ZGVkIHdpdGhpbiB0aGlzIGJsb2NrLgBpASBUaGUgYE9wdGlvbjwoKT5gIGlzIGVmZmVjdGl2ZWx5IGEgYGJvb2xgLCBidXQgaXQgbmV2ZXIgaGl0cyBzdG9yYWdlIGluIHRoZSBgTm9uZWAgdmFyaWFudLwgZHVlIHRvIHRoZSBndWFyYW50ZWVzIG9mIEZSQU1FJ3Mgc3RvcmFnZSBBUElzLgBJASBJZiB0aGlzIGlzIGBOb25lYCBhdCB0aGUgZW5kIG9mIHRoZSBibG9jaywgd2UgcGFuaWMgYW5kIHJlbmRlciB0aGUgYmxvY2sgaW52YWxpZC4wT25DaGFpblZvdGVzAABdDAQABEUBIFNjcmFwZWQgb24gY2hhaW4gZGF0YSBmb3IgZXh0cmFjdGluZyByZXNvbHZlZCBkaXNwdXRlcyBhcyB3ZWxsIGFzIGJhY2tpbmcgdm90ZXMuAeUEAAABcQw2ADRQYXJhU2NoZWR1bGVyATRQYXJhU2NoZWR1bGVyEDxWYWxpZGF0b3JHcm91cHMBAHUMBAAcbQEgQWxsIHRoZSB2YWxpZGF0b3IgZ3JvdXBzLiBPbmUgZm9yIGVhY2ggY29yZS4gSW5kaWNlcyBhcmUgaW50byBgQWN0aXZlVmFsaWRhdG9yc2AgLSBub3QgdGhlbQEgYnJvYWRlciBzZXQgb2YgUG9sa2Fkb3QgdmFsaWRhdG9ycywgYnV0IGluc3RlYWQganVzdCB0aGUgc3Vic2V0IHVzZWQgZm9yIHBhcmFjaGFpbnMgZHVyaW5nOCB0aGlzIHNlc3Npb24uAEkBIEJvdW5kOiBUaGUgbnVtYmVyIG9mIGNvcmVzIGlzIHRoZSBzdW0gb2YgdGhlIG51bWJlcnMgb2YgcGFyYWNoYWlucyBhbmQgcGFyYXRocmVhZGkBIG11bHRpcGxleGVycy4gUmVhc29uYWJseSwgMTAwLTEwMDAuIFRoZSBkb21pbmFudCBmYWN0b3IgaXMgdGhlIG51bWJlciBvZiB2YWxpZGF0b3JzOiBzYWZlUCB1cHBlciBib3VuZCBhdCAxMGsuREF2YWlsYWJpbGl0eUNvcmVzAQB5DAQAGHEBIE9uZSBlbnRyeSBmb3IgZWFjaCBhdmFpbGFiaWxpdHkgY29yZS4gVGhlIGkndGggcGFyYWNoYWluIGJlbG9uZ3MgdG8gdGhlIGkndGggY29yZSwgd2l0aCB0aGXwIHJlbWFpbmluZyBjb3JlcyBhbGwgYmVpbmcgb24gZGVtYW5kIHBhcmFjaGFpbiBtdWx0aXBsZXhlcnMuANggQm91bmRlZCBieSB0aGUgbWF4aW11bSBvZiBlaXRoZXIgb2YgdGhlc2UgdHdvIHZhbHVlczrkICAgKiBUaGUgbnVtYmVyIG9mIHBhcmFjaGFpbnMgYW5kIHBhcmF0aHJlYWQgbXVsdGlwbGV4ZXJzRQEgICAqIFRoZSBudW1iZXIgb2YgdmFsaWRhdG9ycyBkaXZpZGVkIGJ5IGBjb25maWd1cmF0aW9uLm1heF92YWxpZGF0b3JzX3Blcl9jb3JlYC5EU2Vzc2lvblN0YXJ0QmxvY2sBABAQAAAAABxpASBUaGUgYmxvY2sgbnVtYmVyIHdoZXJlIHRoZSBzZXNzaW9uIHN0YXJ0IG9jY3VycmVkLiBVc2VkIHRvIHRyYWNrIGhvdyBtYW55IGdyb3VwIHJvdGF0aW9uczwgaGF2ZSBvY2N1cnJlZC4AVQEgTm90ZSB0aGF0IGluIHRoZSBjb250ZXh0IG9mIHBhcmFjaGFpbnMgbW9kdWxlcyB0aGUgc2Vzc2lvbiBjaGFuZ2UgaXMgc2lnbmFsZWQgZHVyaW5nYQEgdGhlIGJsb2NrIGFuZCBlbmFjdGVkIGF0IHRoZSBlbmQgb2YgdGhlIGJsb2NrIChhdCB0aGUgZmluYWxpemF0aW9uIHN0YWdlLCB0byBiZSBleGFjdCkuWQEgVGh1cyBmb3IgYWxsIGludGVudHMgYW5kIHB1cnBvc2VzIHRoZSBlZmZlY3Qgb2YgdGhlIHNlc3Npb24gY2hhbmdlIGlzIG9ic2VydmVkIGF0IHRoZWUBIGJsb2NrIGZvbGxvd2luZyB0aGUgc2Vzc2lvbiBjaGFuZ2UsIGJsb2NrIG51bWJlciBvZiB3aGljaCB3ZSBzYXZlIGluIHRoaXMgc3RvcmFnZSB2YWx1ZS4oQ2xhaW1RdWV1ZQEAiQwEAAxZASBPbmUgZW50cnkgZm9yIGVhY2ggYXZhaWxhYmlsaXR5IGNvcmUuIFRoZSBgVmVjRGVxdWVgIHJlcHJlc2VudHMgdGhlIGFzc2lnbm1lbnRzIHRvIGJlUQEgc2NoZWR1bGVkIG9uIHRoYXQgY29yZS4gVGhlIHZhbHVlIGNvbnRhaW5lZCBoZXJlIHdpbGwgbm90IGJlIHZhbGlkIGFmdGVyIHRoZSBlbmQgb2ZpASBhIGJsb2NrLiBSdW50aW1lIEFQSXMgc2hvdWxkIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHNjaGVkdWxlZCBjb3JlcyBmb3IgdGhlIHVwY29taW5nIGJsb2NrLgAAAAA3ABRQYXJhcwEUUGFyYXNUQFB2ZkFjdGl2ZVZvdGVNYXAAAQQFIQWZDAQAELQgQWxsIGN1cnJlbnRseSBhY3RpdmUgUFZGIHByZS1jaGVja2luZyB2b3Rlcy4ALCBJbnZhcmlhbnQ6dQEgLSBUaGVyZSBhcmUgbm8gUFZGIHByZS1jaGVja2luZyB2b3RlcyB0aGF0IGV4aXN0cyBpbiBsaXN0IGJ1dCBub3QgaW4gdGhlIHNldCBhbmQgdmljZSB2ZXJzYS5EUHZmQWN0aXZlVm90ZUxpc3QBAKkMBAAENQEgVGhlIGxpc3Qgb2YgYWxsIGN1cnJlbnRseSBhY3RpdmUgUFZGIHZvdGVzLiBBdXhpbGlhcnkgdG8gYFB2ZkFjdGl2ZVZvdGVNYXBgLihQYXJhY2hhaW5zAQCtDAQAEGkBIEFsbCBsZWFzZSBob2xkaW5nIHBhcmFjaGFpbnMuIE9yZGVyZWQgYXNjZW5kaW5nIGJ5IGBQYXJhSWRgLiBPbiBkZW1hbmQgcGFyYWNoYWlucyBhcmUgbm90KCBpbmNsdWRlZC4A6CBDb25zaWRlciB1c2luZyB0aGUgW2BQYXJhY2hhaW5zQ2FjaGVgXSB0eXBlIG9mIG1vZGlmeWluZy44UGFyYUxpZmVjeWNsZXMAAQQFaQKxDAQABLwgVGhlIGN1cnJlbnQgbGlmZWN5Y2xlIG9mIGEgYWxsIGtub3duIFBhcmEgSURzLhRIZWFkcwABBAVpAkEFBAAEoCBUaGUgaGVhZC1kYXRhIG9mIGV2ZXJ5IHJlZ2lzdGVyZWQgcGFyYS5ETW9zdFJlY2VudENvbnRleHQAAQQFaQIQBAAEKQEgVGhlIGNvbnRleHQgKHJlbGF5LWNoYWluIGJsb2NrIG51bWJlcikgb2YgdGhlIG1vc3QgcmVjZW50IHBhcmFjaGFpbiBoZWFkLjxDdXJyZW50Q29kZUhhc2gAAQQFaQIhBQQADLQgVGhlIHZhbGlkYXRpb24gY29kZSBoYXNoIG9mIGV2ZXJ5IGxpdmUgcGFyYS4A5CBDb3JyZXNwb25kaW5nIGNvZGUgY2FuIGJlIHJldHJpZXZlZCB3aXRoIFtgQ29kZUJ5SGFzaGBdLjBQYXN0Q29kZUhhc2gAAQQFtQwhBQQAEGEBIEFjdHVhbCBwYXN0IGNvZGUgaGFzaCwgaW5kaWNhdGVkIGJ5IHRoZSBwYXJhIGlkIGFzIHdlbGwgYXMgdGhlIGJsb2NrIG51bWJlciBhdCB3aGljaCBpdEQgYmVjYW1lIG91dGRhdGVkLgDkIENvcnJlc3BvbmRpbmcgY29kZSBjYW4gYmUgcmV0cmlldmVkIHdpdGggW2BDb2RlQnlIYXNoYF0uMFBhc3RDb2RlTWV0YQEBBAVpArkMCAAADEkBIFBhc3QgY29kZSBvZiBwYXJhY2hhaW5zLiBUaGUgcGFyYWNoYWlucyB0aGVtc2VsdmVzIG1heSBub3QgYmUgcmVnaXN0ZXJlZCBhbnltb3JlLEkBIGJ1dCB3ZSBhbHNvIGtlZXAgdGhlaXIgY29kZSBvbi1jaGFpbiBmb3IgdGhlIHNhbWUgYW1vdW50IG9mIHRpbWUgYXMgb3V0ZGF0ZWQgY29kZbAgdG8ga2VlcCBpdCBhdmFpbGFibGUgZm9yIGFwcHJvdmFsIGNoZWNrZXJzLjxQYXN0Q29kZVBydW5pbmcBAMUMBAAYaQEgV2hpY2ggcGFyYXMgaGF2ZSBwYXN0IGNvZGUgdGhhdCBuZWVkcyBwcnVuaW5nIGFuZCB0aGUgcmVsYXktY2hhaW4gYmxvY2sgYXQgd2hpY2ggdGhlIGNvZGVpASB3YXMgcmVwbGFjZWQuIE5vdGUgdGhhdCB0aGlzIGlzIHRoZSBhY3R1YWwgaGVpZ2h0IG9mIHRoZSBpbmNsdWRlZCBibG9jaywgbm90IHRoZSBleHBlY3RlZD0BIGhlaWdodCBhdCB3aGljaCB0aGUgY29kZSB1cGdyYWRlIHdvdWxkIGJlIGFwcGxpZWQsIGFsdGhvdWdoIHRoZXkgbWF5IGJlIGVxdWFsLm0BIFRoaXMgaXMgdG8gZW5zdXJlIHRoZSBlbnRpcmUgYWNjZXB0YW5jZSBwZXJpb2QgaXMgY292ZXJlZCwgbm90IGFuIG9mZnNldCBhY2NlcHRhbmNlIHBlcmlvZG0BIHN0YXJ0aW5nIGZyb20gdGhlIHRpbWUgYXQgd2hpY2ggdGhlIHBhcmFjaGFpbiBwZXJjZWl2ZXMgYSBjb2RlIHVwZ3JhZGUgYXMgaGF2aW5nIG9jY3VycmVkLlUBIE11bHRpcGxlIGVudHJpZXMgZm9yIGEgc2luZ2xlIHBhcmEgYXJlIHBlcm1pdHRlZC4gT3JkZXJlZCBhc2NlbmRpbmcgYnkgYmxvY2sgbnVtYmVyLkhGdXR1cmVDb2RlVXBncmFkZXMAAQQFaQIQBAAQPQEgVGhlIGJsb2NrIG51bWJlciBhdCB3aGljaCB0aGUgcGxhbm5lZCBjb2RlIGNoYW5nZSBpcyBleHBlY3RlZCBmb3IgYSBwYXJhY2hhaW4uAGUBIFRoZSBjaGFuZ2Ugd2lsbCBiZSBhcHBsaWVkIGFmdGVyIHRoZSBmaXJzdCBwYXJhYmxvY2sgZm9yIHRoaXMgSUQgaW5jbHVkZWQgd2hpY2ggZXhlY3V0ZXMZASBpbiB0aGUgY29udGV4dCBvZiBhIHJlbGF5IGNoYWluIGJsb2NrIHdpdGggYSBudW1iZXIgPj0gYGV4cGVjdGVkX2F0YC5QRnV0dXJlQ29kZVVwZ3JhZGVzQXQBAMUMBAAgrCBUaGUgbGlzdCBvZiB1cGNvbWluZyBmdXR1cmUgY29kZSB1cGdyYWRlcy4AbQEgRWFjaCBpdGVtIGlzIGEgcGFpciBvZiB0aGUgcGFyYWNoYWluIGFuZCB0aGUgZXhwZWN0ZWQgYmxvY2sgYXQgd2hpY2ggdGhlIHVwZ3JhZGUgc2hvdWxkIGJlUQEgYXBwbGllZC4gVGhlIHVwZ3JhZGUgd2lsbCBiZSBhcHBsaWVkIGF0IHRoZSBnaXZlbiByZWxheSBjaGFpbiBibG9jay4gSW4gY29udHJhc3QgdG91ASBbYEZ1dHVyZUNvZGVVcGdyYWRlc2BdIHRoaXMgY29kZSB1cGdyYWRlIHdpbGwgYmUgYXBwbGllZCByZWdhcmRsZXNzIHRoZSBwYXJhY2hhaW4gbWFraW5nIGFueUQgcHJvZ3Jlc3Mgb3Igbm90LgCMIE9yZGVyZWQgYXNjZW5kaW5nIGJ5IGJsb2NrIG51bWJlci44RnV0dXJlQ29kZUhhc2gAAQQFaQIhBQQADJwgVGhlIGFjdHVhbCBmdXR1cmUgY29kZSBoYXNoIG9mIGEgcGFyYS4A5CBDb3JyZXNwb25kaW5nIGNvZGUgY2FuIGJlIHJldHJpZXZlZCB3aXRoIFtgQ29kZUJ5SGFzaGBdLlBVcGdyYWRlR29BaGVhZFNpZ25hbAABBAVpAskMBAAodQEgVGhpcyBpcyB1c2VkIGJ5IHRoZSByZWxheS1jaGFpbiB0byBjb21tdW5pY2F0ZSB0byBhIHBhcmFjaGFpbiBhIGdvLWFoZWFkIHdpdGggaW4gdGhlIHVwZ3JhZGUsIHByb2NlZHVyZS4AdQEgVGhpcyB2YWx1ZSBpcyBhYnNlbnQgd2hlbiB0aGVyZSBhcmUgbm8gdXBncmFkZXMgc2NoZWR1bGVkIG9yIGR1cmluZyB0aGUgdGltZSB0aGUgcmVsYXkgY2hhaW5VASBwZXJmb3JtcyB0aGUgY2hlY2tzLiBJdCBpcyBzZXQgYXQgdGhlIGZpcnN0IHJlbGF5LWNoYWluIGJsb2NrIHdoZW4gdGhlIGNvcnJlc3BvbmRpbmd1ASBwYXJhY2hhaW4gY2FuIHN3aXRjaCBpdHMgdXBncmFkZSBmdW5jdGlvbi4gQXMgc29vbiBhcyB0aGUgcGFyYWNoYWluJ3MgYmxvY2sgaXMgaW5jbHVkZWQsIHRoZXAgdmFsdWUgZ2V0cyByZXNldCB0byBgTm9uZWAuAGUBIE5PVEUgdGhhdCB0aGlzIGZpZWxkIGlzIHVzZWQgYnkgcGFyYWNoYWlucyB2aWEgbWVya2xlIHN0b3JhZ2UgcHJvb2ZzLCB0aGVyZWZvcmUgY2hhbmdpbmfEIHRoZSBmb3JtYXQgd2lsbCByZXF1aXJlIG1pZ3JhdGlvbiBvZiBwYXJhY2hhaW5zLmBVcGdyYWRlUmVzdHJpY3Rpb25TaWduYWwAAQQFaQLNDAQAJGkBIFRoaXMgaXMgdXNlZCBieSB0aGUgcmVsYXktY2hhaW4gdG8gY29tbXVuaWNhdGUgdGhhdCB0aGVyZSBhcmUgcmVzdHJpY3Rpb25zIGZvciBwZXJmb3JtaW5nfCBhbiB1cGdyYWRlIGZvciB0aGlzIHBhcmFjaGFpbi4AWQEgVGhpcyBtYXkgYmUgYSBiZWNhdXNlIHRoZSBwYXJhY2hhaW4gd2FpdHMgZm9yIHRoZSB1cGdyYWRlIGNvb2xkb3duIHRvIGV4cGlyZS4gQW5vdGhlcm0BIHBvdGVudGlhbCB1c2UgY2FzZSBpcyB3aGVuIHdlIHdhbnQgdG8gcGVyZm9ybSBzb21lIG1haW50ZW5hbmNlIChzdWNoIGFzIHN0b3JhZ2UgbWlncmF0aW9uKeAgd2UgY291bGQgcmVzdHJpY3QgdXBncmFkZXMgdG8gbWFrZSB0aGUgcHJvY2VzcyBzaW1wbGVyLgBlASBOT1RFIHRoYXQgdGhpcyBmaWVsZCBpcyB1c2VkIGJ5IHBhcmFjaGFpbnMgdmlhIG1lcmtsZSBzdG9yYWdlIHByb29mcywgdGhlcmVmb3JlIGNoYW5naW5nxCB0aGUgZm9ybWF0IHdpbGwgcmVxdWlyZSBtaWdyYXRpb24gb2YgcGFyYWNoYWlucy5AVXBncmFkZUNvb2xkb3ducwEAxQwEAAxRASBUaGUgbGlzdCBvZiBwYXJhY2hhaW5zIHRoYXQgYXJlIGF3YWl0aW5nIGZvciB0aGVpciB1cGdyYWRlIHJlc3RyaWN0aW9uIHRvIGNvb2xkb3duLgCMIE9yZGVyZWQgYXNjZW5kaW5nIGJ5IGJsb2NrIG51bWJlci5AVXBjb21pbmdVcGdyYWRlcwEAxQwEABiQIFRoZSBsaXN0IG9mIHVwY29taW5nIGNvZGUgdXBncmFkZXMuAHEBIEVhY2ggaXRlbSBpcyBhIHBhaXIgb2Ygd2hpY2ggcGFyYSBwZXJmb3JtcyBhIGNvZGUgdXBncmFkZSBhbmQgYXQgd2hpY2ggcmVsYXktY2hhaW4gYmxvY2sgaXRAIGlzIGV4cGVjdGVkIGF0LgCMIE9yZGVyZWQgYXNjZW5kaW5nIGJ5IGJsb2NrIG51bWJlci4wQWN0aW9uc1F1ZXVlAQEEBRCtDAQABBUBIFRoZSBhY3Rpb25zIHRvIHBlcmZvcm0gZHVyaW5nIHRoZSBzdGFydCBvZiBhIHNwZWNpZmljIHNlc3Npb24gaW5kZXguUFVwY29taW5nUGFyYXNHZW5lc2lzAAEEBWkC0QwEABCgIFVwY29taW5nIHBhcmFzIGluc3RhbnRpYXRpb24gYXJndW1lbnRzLgBlASBOT1RFIHRoYXQgYWZ0ZXIgUFZGIHByZS1jaGVja2luZyBpcyBlbmFibGVkIHRoZSBwYXJhIGdlbmVzaXMgYXJnIHdpbGwgaGF2ZSBpdCdzIGNvZGUgc2V0YQEgdG8gZW1wdHkuIEluc3RlYWQsIHRoZSBjb2RlIHdpbGwgYmUgc2F2ZWQgaW50byB0aGUgc3RvcmFnZSByaWdodCBhd2F5IHZpYSBgQ29kZUJ5SGFzaGAuOENvZGVCeUhhc2hSZWZzAQEEBiEFEBAAAAAABCkBIFRoZSBudW1iZXIgb2YgcmVmZXJlbmNlIG9uIHRoZSB2YWxpZGF0aW9uIGNvZGUgaW4gW2BDb2RlQnlIYXNoYF0gc3RvcmFnZS4oQ29kZUJ5SGFzaAABBAYhBT0FBAAQkCBWYWxpZGF0aW9uIGNvZGUgc3RvcmVkIGJ5IGl0cyBoYXNoLgAxASBUaGlzIHN0b3JhZ2UgaXMgY29uc2lzdGVudCB3aXRoIFtgRnV0dXJlQ29kZUhhc2hgXSwgW2BDdXJyZW50Q29kZUhhc2hgXSBhbmRIIFtgUGFzdENvZGVIYXNoYF0uAXEFAf0HBEBVbnNpZ25lZFByaW9yaXR5MCD//////////wAB1Qw4ACxJbml0aWFsaXplcgEsSW5pdGlhbGl6ZXIIOEhhc0luaXRpYWxpemVkAAChAQQAICEBIFdoZXRoZXIgdGhlIHBhcmFjaGFpbnMgbW9kdWxlcyBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQgd2l0aGluIHRoaXMgYmxvY2suACUBIFNlbWFudGljYWxseSBhIGBib29sYCwgYnV0IHRoaXMgZ3VhcmFudGVlcyBpdCBzaG91bGQgbmV2ZXIgaGl0IHRoZSB0cmllLGkBIGFzIHRoaXMgaXMgY2xlYXJlZCBpbiBgb25fZmluYWxpemVgIGFuZCBGcmFtZSBvcHRpbWl6ZXMgYE5vbmVgIHZhbHVlcyB0byBiZSBlbXB0eSB2YWx1ZXMuAHEBIEFzIGEgYGJvb2xgLCBgc2V0KGZhbHNlKWAgYW5kIGByZW1vdmUoKWAgYm90aCBsZWFkIHRvIHRoZSBuZXh0IGBnZXQoKWAgYmVpbmcgZmFsc2UsIGJ1dCBvbmV1ASBvZiB0aGVtIHdyaXRlcyB0byB0aGUgdHJpZSBhbmQgb25lIGRvZXMgbm90LiBUaGlzIGNvbmZ1c2lvbiBtYWtlcyBgT3B0aW9uPCgpPmAgbW9yZSBzdWl0YWJsZZAgZm9yIHRoZSBzZW1hbnRpY3Mgb2YgdGhpcyB2YXJpYWJsZS5YQnVmZmVyZWRTZXNzaW9uQ2hhbmdlcwEA2QwEABxZASBCdWZmZXJlZCBzZXNzaW9uIGNoYW5nZXMgYWxvbmcgd2l0aCB0aGUgYmxvY2sgbnVtYmVyIGF0IHdoaWNoIHRoZXkgc2hvdWxkIGJlIGFwcGxpZWQuAF0BIFR5cGljYWxseSB0aGlzIHdpbGwgYmUgZW1wdHkgb3Igb25lIGVsZW1lbnQgbG9uZy4gQXBhcnQgZnJvbSB0aGF0IHRoaXMgaXRlbSBuZXZlciBoaXRzNCB0aGUgc3RvcmFnZS4AaQEgSG93ZXZlciB0aGlzIGlzIGEgYFZlY2AgcmVnYXJkbGVzcyB0byBoYW5kbGUgdmFyaW91cyBlZGdlIGNhc2VzIHRoYXQgbWF5IG9jY3VyIGF0IHJ1bnRpbWXAIHVwZ3JhZGUgYm91bmRhcmllcyBvciBpZiBnb3Zlcm5hbmNlIGludGVydmVuZXMuAXkFAAAAOQAMRG1wAQxEbXAMVERvd253YXJkTWVzc2FnZVF1ZXVlcwEBBAVpAuEMBAAE0CBUaGUgZG93bndhcmQgbWVzc2FnZXMgYWRkcmVzc2VkIGZvciBhIGNlcnRhaW4gcGFyYS5kRG93bndhcmRNZXNzYWdlUXVldWVIZWFkcwEBBAVpAjSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcJQEgQSBtYXBwaW5nIHRoYXQgc3RvcmVzIHRoZSBkb3dud2FyZCBtZXNzYWdlIHF1ZXVlIE1RQyBoZWFkIGZvciBlYWNoIHBhcmEuAJAgRWFjaCBsaW5rIGluIHRoaXMgY2hhaW4gaGFzIGEgZm9ybTp4IGAocHJldl9oZWFkLCBCLCBIKE0pKWAsIHdoZXJl6CAtIGBwcmV2X2hlYWRgOiBpcyB0aGUgcHJldmlvdXMgaGVhZCBoYXNoIG9yIHplcm8gaWYgbm9uZS4hASAtIGBCYDogaXMgdGhlIHJlbGF5LWNoYWluIGJsb2NrIG51bWJlciBpbiB3aGljaCBhIG1lc3NhZ2Ugd2FzIGFwcGVuZGVkLtQgLSBgSChNKWA6IGlzIHRoZSBoYXNoIG9mIHRoZSBtZXNzYWdlIGJlaW5nIGFwcGVuZGVkLkREZWxpdmVyeUZlZUZhY3RvcgEBBAVpAiEHQAAAZKeztuANAAAAAAAAAAAExCBUaGUgZmFjdG9yIHRvIG11bHRpcGx5IHRoZSBiYXNlIGRlbGl2ZXJ5IGZlZSBieS4AAAAAOgAQSHJtcAEQSHJtcDBcSHJtcE9wZW5DaGFubmVsUmVxdWVzdHMAAQQFgQXpDAQAGLwgVGhlIHNldCBvZiBwZW5kaW5nIEhSTVAgb3BlbiBjaGFubmVsIHJlcXVlc3RzLgDAIFRoZSBzZXQgaXMgYWNjb21wYW5pZWQgYnkgYSBsaXN0IGZvciBpdGVyYXRpb24uACwgSW52YXJpYW50Oj0BIC0gVGhlcmUgYXJlIG5vIGNoYW5uZWxzIHRoYXQgZXhpc3RzIGluIGxpc3QgYnV0IG5vdCBpbiB0aGUgc2V0IGFuZCB2aWNlIHZlcnNhLmxIcm1wT3BlbkNoYW5uZWxSZXF1ZXN0c0xpc3QBAO0MBAAAbEhybXBPcGVuQ2hhbm5lbFJlcXVlc3RDb3VudAEBBAVpAhAQAAAAAAxlASBUaGlzIG1hcHBpbmcgdHJhY2tzIGhvdyBtYW55IG9wZW4gY2hhbm5lbCByZXF1ZXN0cyBhcmUgaW5pdGlhdGVkIGJ5IGEgZ2l2ZW4gc2VuZGVyIHBhcmEuWQEgSW52YXJpYW50OiBgSHJtcE9wZW5DaGFubmVsUmVxdWVzdHNgIHNob3VsZCBjb250YWluIHRoZSBzYW1lIG51bWJlciBvZiBpdGVtcyB0aGF0IGhhcwUBIGAoWCwgXylgIGFzIHRoZSBudW1iZXIgb2YgYEhybXBPcGVuQ2hhbm5lbFJlcXVlc3RDb3VudGAgZm9yIGBYYC58SHJtcEFjY2VwdGVkQ2hhbm5lbFJlcXVlc3RDb3VudAEBBAVpAhAQAAAAAAxxASBUaGlzIG1hcHBpbmcgdHJhY2tzIGhvdyBtYW55IG9wZW4gY2hhbm5lbCByZXF1ZXN0cyB3ZXJlIGFjY2VwdGVkIGJ5IGEgZ2l2ZW4gcmVjaXBpZW50IHBhcmEubQEgSW52YXJpYW50OiBgSHJtcE9wZW5DaGFubmVsUmVxdWVzdHNgIHNob3VsZCBjb250YWluIHRoZSBzYW1lIG51bWJlciBvZiBpdGVtcyBgKF8sIFgpYCB3aXRoVQEgYGNvbmZpcm1lZGAgc2V0IHRvIHRydWUsIGFzIHRoZSBudW1iZXIgb2YgYEhybXBBY2NlcHRlZENoYW5uZWxSZXF1ZXN0Q291bnRgIGZvciBgWGAuYEhybXBDbG9zZUNoYW5uZWxSZXF1ZXN0cwABBAWBBaEBBAAccQEgQSBzZXQgb2YgcGVuZGluZyBIUk1QIGNsb3NlIGNoYW5uZWwgcmVxdWVzdHMgdGhhdCBhcmUgZ29pbmcgdG8gYmUgY2xvc2VkIGR1cmluZyB0aGUgc2Vzc2lvbiEBIGNoYW5nZS4gVXNlZCBmb3IgY2hlY2tpbmcgaWYgYSBnaXZlbiBjaGFubmVsIGlzIHJlZ2lzdGVyZWQgZm9yIGNsb3N1cmUuAMAgVGhlIHNldCBpcyBhY2NvbXBhbmllZCBieSBhIGxpc3QgZm9yIGl0ZXJhdGlvbi4ALCBJbnZhcmlhbnQ6PQEgLSBUaGVyZSBhcmUgbm8gY2hhbm5lbHMgdGhhdCBleGlzdHMgaW4gbGlzdCBidXQgbm90IGluIHRoZSBzZXQgYW5kIHZpY2UgdmVyc2EucEhybXBDbG9zZUNoYW5uZWxSZXF1ZXN0c0xpc3QBAO0MBAAAOEhybXBXYXRlcm1hcmtzAAEEBWkCEAQAELggVGhlIEhSTVAgd2F0ZXJtYXJrIGFzc29jaWF0ZWQgd2l0aCBlYWNoIHBhcmEuLCBJbnZhcmlhbnQ6VQEgLSBlYWNoIHBhcmEgYFBgIHVzZWQgaGVyZSBhcyBhIGtleSBzaG91bGQgc2F0aXNmeSBgUGFyYXM6OmlzX3ZhbGlkX3BhcmEoUClgIHdpdGhpbiBhLCAgIHNlc3Npb24uMEhybXBDaGFubmVscwABBAWBBfEMBAAMtCBIUk1QIGNoYW5uZWwgZGF0YSBhc3NvY2lhdGVkIHdpdGggZWFjaCBwYXJhLiwgSW52YXJpYW50OnUBIC0gZWFjaCBwYXJ0aWNpcGFudCBpbiB0aGUgY2hhbm5lbCBzaG91bGQgc2F0aXNmeSBgUGFyYXM6OmlzX3ZhbGlkX3BhcmEoUClgIHdpdGhpbiBhIHNlc3Npb24uYEhybXBJbmdyZXNzQ2hhbm5lbHNJbmRleAEBBAVpAq0MBAA0cQEgSW5ncmVzcy9lZ3Jlc3MgaW5kZXhlcyBhbGxvdyB0byBmaW5kIGFsbCB0aGUgc2VuZGVycyBhbmQgcmVjZWl2ZXJzIGdpdmVuIHRoZSBvcHBvc2l0ZSBzaWRlLhQgSS5lLgAhASAoYSkgaW5ncmVzcyBpbmRleCBhbGxvd3MgdG8gZmluZCBhbGwgdGhlIHNlbmRlcnMgZm9yIGEgZ2l2ZW4gcmVjaXBpZW50Lh0BIChiKSBlZ3Jlc3MgaW5kZXggYWxsb3dzIHRvIGZpbmQgYWxsIHRoZSByZWNpcGllbnRzIGZvciBhIGdpdmVuIHNlbmRlci4AMCBJbnZhcmlhbnRzOlEBIC0gZm9yIGVhY2ggaW5ncmVzcyBpbmRleCBlbnRyeSBmb3IgYFBgIGVhY2ggaXRlbSBgSWAgaW4gdGhlIGluZGV4IHNob3VsZCBwcmVzZW50IGlueCAgIGBIcm1wQ2hhbm5lbHNgIGFzIGAoSSwgUClgLk0BIC0gZm9yIGVhY2ggZWdyZXNzIGluZGV4IGVudHJ5IGZvciBgUGAgZWFjaCBpdGVtIGBFYCBpbiB0aGUgaW5kZXggc2hvdWxkIHByZXNlbnQgaW54ICAgYEhybXBDaGFubmVsc2AgYXMgYChQLCBFKWAuAQEgLSB0aGVyZSBzaG91bGQgYmUgbm8gb3RoZXIgZGFuZ2xpbmcgY2hhbm5lbHMgaW4gYEhybXBDaGFubmVsc2AuaCAtIHRoZSB2ZWN0b3JzIGFyZSBzb3J0ZWQuXEhybXBFZ3Jlc3NDaGFubmVsc0luZGV4AQEEBWkCrQwEAABMSHJtcENoYW5uZWxDb250ZW50cwEBBAWBBfUMBAAIrCBTdG9yYWdlIGZvciB0aGUgbWVzc2FnZXMgZm9yIGVhY2ggY2hhbm5lbC5lASBJbnZhcmlhbnQ6IGNhbm5vdCBiZSBub24tZW1wdHkgaWYgdGhlIGNvcnJlc3BvbmRpbmcgY2hhbm5lbCBpbiBgSHJtcENoYW5uZWxzYCBpcyBgTm9uZWAuSEhybXBDaGFubmVsRGlnZXN0cwEBBAVpAv0MBAAYaQEgTWFpbnRhaW5zIGEgbWFwcGluZyB0aGF0IGNhbiBiZSB1c2VkIHRvIGFuc3dlciB0aGUgcXVlc3Rpb246IFdoYXQgcGFyYXMgc2VudCBhIG1lc3NhZ2UgYXTkIHRoZSBnaXZlbiBibG9jayBudW1iZXIgZm9yIGEgZ2l2ZW4gcmVjZWl2ZXIuIEludmFyaWFudHM6qCAtIFRoZSBpbm5lciBgVmVjPFBhcmFJZD5gIGlzIG5ldmVyIGVtcHR5LuggLSBUaGUgaW5uZXIgYFZlYzxQYXJhSWQ+YCBjYW5ub3Qgc3RvcmUgdHdvIHNhbWUgYFBhcmFJZGAubQEgLSBUaGUgb3V0ZXIgdmVjdG9yIGlzIHNvcnRlZCBhc2NlbmRpbmcgYnkgYmxvY2sgbnVtYmVyIGFuZCBjYW5ub3Qgc3RvcmUgdHdvIGl0ZW1zIHdpdGggdGhlVCAgIHNhbWUgYmxvY2sgbnVtYmVyLgF9BQEBCAABBQ08ADxQYXJhU2Vzc2lvbkluZm8BPFBhcmFTZXNzaW9uSW5mbxRQQXNzaWdubWVudEtleXNVbnNhZmUBAAkNBAAMpCBBc3NpZ25tZW50IGtleXMgZm9yIHRoZSBjdXJyZW50IHNlc3Npb24ubQEgTm90ZSB0aGF0IHRoaXMgQVBJIGlzIHByaXZhdGUgZHVlIHRvIGl0IGJlaW5nIHByb25lIHRvICdvZmYtYnktb25lJyBhdCBzZXNzaW9uIGJvdW5kYXJpZXMurCBXaGVuIGluIGRvdWJ0LCB1c2UgYFNlc3Npb25zYCBBUEkgaW5zdGVhZC5URWFybGllc3RTdG9yZWRTZXNzaW9uAQAQEAAAAAAEAQEgVGhlIGVhcmxpZXN0IHNlc3Npb24gZm9yIHdoaWNoIHByZXZpb3VzIHNlc3Npb24gaW5mbyBpcyBzdG9yZWQuIFNlc3Npb25zAAEEBhANDQQADKQgU2Vzc2lvbiBpbmZvcm1hdGlvbiBpbiBhIHJvbGxpbmcgd2luZG93LjUBIFNob3VsZCBoYXZlIGFuIGVudHJ5IGluIHJhbmdlIGBFYXJsaWVzdFN0b3JlZFNlc3Npb24uLj1DdXJyZW50U2Vzc2lvbkluZGV4YC51ASBEb2VzIG5vdCBoYXZlIGFueSBlbnRyaWVzIGJlZm9yZSB0aGUgc2Vzc2lvbiBpbmRleCBpbiB0aGUgZmlyc3Qgc2Vzc2lvbiBjaGFuZ2Ugbm90aWZpY2F0aW9uLixBY2NvdW50S2V5cwABBAYQrQEEAARxASBUaGUgdmFsaWRhdG9yIGFjY291bnQga2V5cyBvZiB0aGUgdmFsaWRhdG9ycyBhY3RpdmVseSBwYXJ0aWNpcGF0aW5nIGluIHBhcmFjaGFpbiBjb25zZW5zdXMuVFNlc3Npb25FeGVjdXRvclBhcmFtcwABBAYQwQQEAATEIEV4ZWN1dG9yIHBhcmFtZXRlciBzZXQgZm9yIGEgZ2l2ZW4gc2Vzc2lvbiBpbmRleAAAAAA9ADRQYXJhc0Rpc3B1dGVzATRQYXJhc0Rpc3B1dGVzFERMYXN0UHJ1bmVkU2Vzc2lvbgAAEAQACAEBIFRoZSBsYXN0IHBydW5lZCBzZXNzaW9uLCBpZiBhbnkuIEFsbCBkYXRhIHN0b3JlZCBieSB0aGlzIG1vZHVsZVQgcmVmZXJlbmNlcyBzZXNzaW9ucy4gRGlzcHV0ZXMAAQgFAhkNHQ0EAAQFASBBbGwgb25nb2luZyBvciBjb25jbHVkZWQgZGlzcHV0ZXMgZm9yIHRoZSBsYXN0IHNldmVyYWwgc2Vzc2lvbnMuREJhY2tlcnNPbkRpc3B1dGVzAAEIBQIZDSENBAAInCBCYWNraW5nIHZvdGVzIHN0b3JlZCBmb3IgZWFjaCBkaXNwdXRlLowgVGhpcyBzdG9yYWdlIGlzIHVzZWQgZm9yIHNsYXNoaW5nLiBJbmNsdWRlZAABCAUCGQ0QBAAIRQEgQWxsIGluY2x1ZGVkIGJsb2NrcyBvbiB0aGUgY2hhaW4sIGFzIHdlbGwgYXMgdGhlIGJsb2NrIG51bWJlciBpbiB0aGlzIGNoYWluIHRoYXRZASBzaG91bGQgYmUgcmV2ZXJ0ZWQgYmFjayB0byBpZiB0aGUgY2FuZGlkYXRlIGlzIGRpc3B1dGVkIGFuZCBkZXRlcm1pbmVkIHRvIGJlIGludmFsaWQuGEZyb3plbgEAPQIEABARASBXaGV0aGVyIHRoZSBjaGFpbiBpcyBmcm96ZW4uIFN0YXJ0cyBhcyBgTm9uZWAuIFdoZW4gdGhpcyBpcyBgU29tZWAsNQEgdGhlIGNoYWluIHdpbGwgbm90IGFjY2VwdCBhbnkgbmV3IHBhcmFjaGFpbiBibG9ja3MgZm9yIGJhY2tpbmcgb3IgaW5jbHVzaW9uLAkBIGFuZCBpdHMgdmFsdWUgaW5kaWNhdGVzIHRoZSBsYXN0IHZhbGlkIGJsb2NrIG51bWJlciBpbiB0aGUgY2hhaW4u+CBJdCBjYW4gb25seSBiZSBzZXQgYmFjayB0byBgTm9uZWAgYnkgZ292ZXJuYW5jZSBpbnRlcnZlbnRpb24uAYUFAQUIAAElDT4ANFBhcmFzU2xhc2hpbmcBNFBhcmFzU2xhc2hpbmcIQFVuYXBwbGllZFNsYXNoZXMAAQgFAhkNKQ0EAASQIFZhbGlkYXRvcnMgcGVuZGluZyBkaXNwdXRlIHNsYXNoZXMuSFZhbGlkYXRvclNldENvdW50cwABBAUQEAQABIQgYFZhbGlkYXRvclNldENvdW50YCBwZXIgc2Vzc2lvbi4BiQUAAAE5DT8AaE9uRGVtYW5kQXNzaWdubWVudFByb3ZpZGVyAWhPbkRlbWFuZEFzc2lnbm1lbnRQcm92aWRlchQ4UGFyYUlkQWZmaW5pdHkAAQQFaQI9DQQADHEBIE1hcHMgYSBgUGFyYUlkYCB0byBgQ29yZUluZGV4YCBhbmQga2VlcHMgdHJhY2sgb2YgaG93IG1hbnkgYXNzaWdubWVudHMgdGhlIHNjaGVkdWxlciBoYXMgaW5dASBpdCdzIGxvb2thaGVhZC4gS2VlcGluZyB0cmFjayBvZiB0aGlzIGFmZmluaXR5IHByZXZlbnRzIHBhcmFsbGVsIGV4ZWN1dGlvbiBvZiB0aGUgc2FtZZwgYFBhcmFJZGAgb24gdHdvIG9yIG1vcmUgYENvcmVJbmRleGBlcy4sUXVldWVTdGF0dXMBAEENZAAAZKeztuANAAAAAAAAAAAAAAAAAAAAAAAE3CBPdmVyYWxsIHN0YXR1cyBvZiBxdWV1ZSAoYm90aCBmcmVlICsgYWZmaW5pdHkgZW50cmllcyksRnJlZUVudHJpZXMBAFUNBAAEYQEgUHJpb3JpdHkgcXVldWUgZm9yIGFsbCBvcmRlcnMgd2hpY2ggZG9uJ3QgeWV0IChvciBub3QgYW55IG1vcmUpIGhhdmUgYW55IGNvcmUgYWZmaW5pdHkuPEFmZmluaXR5RW50cmllcwEBBAX1B1UNBAAESQEgUXVldWUgZW50cmllcyB0aGF0IGFyZSBjdXJyZW50bHkgYm91bmQgdG8gYSBwYXJ0aWN1bGFyIGNvcmUgZHVlIHRvIGNvcmUgYWZmaW5pdHkuHFJldmVudWUBAGENBAAE/CBLZWVwcyB0cmFjayBvZiBhY2N1bXVsYXRlZCByZXZlbnVlIGZyb20gb24gZGVtYW5kIG9yZGVyIHNhbGVzLgGZBQERCAxMVHJhZmZpY0RlZmF1bHRWYWx1ZSEHQAAAZKeztuANAAAAAAAAAAAEzCBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIHNwb3QgdHJhZmZpYyBtdWx0aXBsaWVyLlBNYXhIaXN0b3JpY2FsUmV2ZW51ZRAQoAAAAAjUIFRoZSBtYXhpbXVtIG51bWJlciBvZiBibG9ja3Mgc29tZSBoaXN0b3JpY2FsIHJldmVudWVgIGluZm9ybWF0aW9uIHN0b3JlZCBmb3IuIFBhbGxldElkwQkgcHkvb25kbWQEtCBJZGVudGlmaWVyIGZvciB0aGUgaW50ZXJuYWwgcmV2ZW51ZSBiYWxhbmNlLgFpDUAAaENvcmV0aW1lQXNzaWdubWVudFByb3ZpZGVyAWhDb3JldGltZUFzc2lnbm1lbnRQcm92aWRlcgg0Q29yZVNjaGVkdWxlcwABBARtDXENBAAQbCBTY2hlZHVsZWQgYXNzaWdubWVudCBzZXRzLgBtASBBc3NpZ25tZW50cyBhcyBvZiB0aGUgZ2l2ZW4gYmxvY2sgbnVtYmVyLiBUaGV5IHdpbGwgZ28gaW50byBzdGF0ZSBvbmNlIHRoZSBibG9jayBudW1iZXIgaXPQIHJlYWNoZWQgKGFuZCByZXBsYWNlIHdoYXRldmVyIHdhcyBpbiB0aGVyZSBiZWZvcmUpLjxDb3JlRGVzY3JpcHRvcnMBAQQE9Qd1DQgAABCgIEFzc2lnbm1lbnRzIHdoaWNoIGFyZSBjdXJyZW50bHkgYWN0aXZlLgBpASBUaGV5IHdpbGwgYmUgcGlja2VkIGZyb20gYFBlbmRpbmdBc3NpZ25tZW50c2Agb25jZSB3ZSByZWFjaCB0aGUgc2NoZWR1bGVkIGJsb2NrIG51bWJlciBpblggYFBlbmRpbmdBc3NpZ25tZW50c2AuAAAAAZUNQQAkUmVnaXN0cmFyASRSZWdpc3RyYXIMLFBlbmRpbmdTd2FwAAEEBWkCaQIEAARkIFBlbmRpbmcgc3dhcCBvcGVyYXRpb25zLhRQYXJhcwABBAVpApkNBAAQBQEgQW1vdW50IGhlbGQgb24gZGVwb3NpdCBmb3IgZWFjaCBwYXJhIGFuZCB0aGUgb3JpZ2luYWwgZGVwb3NpdG9yLgBxASBUaGUgZ2l2ZW4gYWNjb3VudCBJRCBpcyByZXNwb25zaWJsZSBmb3IgcmVnaXN0ZXJpbmcgdGhlIGNvZGUgYW5kIGluaXRpYWwgaGVhZCBkYXRhLCBidXQgbWF5VQEgb25seSBkbyBzbyBpZiBpdCBpc24ndCB5ZXQgcmVnaXN0ZXJlZC4gKEFmdGVyIHRoYXQsIGl0J3MgdXAgdG8gZ292ZXJuYW5jZSB0byBkbyBzby4pOE5leHRGcmVlUGFyYUlkAQBpAhAAAAAABGAgVGhlIG5leHQgZnJlZSBgUGFyYUlkYC4BnQUBFQgILFBhcmFEZXBvc2l0GEAAgMo5YSQAAAAAAAAAAAAACNQgVGhlIGRlcG9zaXQgdG8gYmUgcGFpZCB0byBydW4gYSBvbi1kZW1hbmQgcGFyYWNoYWluLj0BIFRoaXMgc2hvdWxkIGluY2x1ZGUgdGhlIGNvc3QgZm9yIHN0b3JpbmcgdGhlIGdlbmVzaXMgaGVhZCBhbmQgdmFsaWRhdGlvbiBjb2RlLkhEYXRhRGVwb3NpdFBlckJ5dGUYQFVD3hMAAAAAAAAAAAAAAAAExCBUaGUgZGVwb3NpdCB0byBiZSBwYWlkIHBlciBieXRlIHN0b3JlZCBvbiBjaGFpbi4BnQ1GABRTbG90cwEUU2xvdHMEGExlYXNlcwEBBAVpAqENBABAFQEgQW1vdW50cyBoZWxkIG9uIGRlcG9zaXQgZm9yIGVhY2ggKHBvc3NpYmx5IGZ1dHVyZSkgbGVhc2VkIHBhcmFjaGFpbi4AYQEgVGhlIGFjdHVhbCBhbW91bnQgbG9ja2VkIG9uIGl0cyBiZWhhbGYgYnkgYW55IGFjY291bnQgYXQgYW55IHRpbWUgaXMgdGhlIG1heGltdW0gb2YgdGhlKQEgc2Vjb25kIHZhbHVlcyBvZiB0aGUgaXRlbXMgaW4gdGhpcyBsaXN0IHdob3NlIGZpcnN0IHZhbHVlIGlzIHRoZSBhY2NvdW50LgBhASBUaGUgZmlyc3QgaXRlbSBpbiB0aGUgbGlzdCBpcyB0aGUgYW1vdW50IGxvY2tlZCBmb3IgdGhlIGN1cnJlbnQgTGVhc2UgUGVyaW9kLiBGb2xsb3dpbmewIGl0ZW1zIGFyZSBmb3IgdGhlIHN1YnNlcXVlbnQgbGVhc2UgcGVyaW9kcy4AYQEgVGhlIGRlZmF1bHQgdmFsdWUgKGFuIGVtcHR5IGxpc3QpIGltcGxpZXMgdGhhdCB0aGUgcGFyYWNoYWluIG5vIGxvbmdlciBleGlzdHMgKG9yIG5ldmVytCBleGlzdGVkKSBhcyBmYXIgYXMgdGhpcyBwYWxsZXQgaXMgY29uY2VybmVkLgBRASBJZiBhIHBhcmFjaGFpbiBkb2Vzbid0IGV4aXN0ICp5ZXQqIGJ1dCBpcyBzY2hlZHVsZWQgdG8gZXhpc3QgaW4gdGhlIGZ1dHVyZSwgdGhlbiBpdGEBIHdpbGwgYmUgbGVmdC1wYWRkZWQgd2l0aCBvbmUgb3IgbW9yZSBgTm9uZWBzIHRvIGRlbm90ZSB0aGUgZmFjdCB0aGF0IG5vdGhpbmcgaXMgaGVsZCBvbl0BIGRlcG9zaXQgZm9yIHRoZSBub24tZXhpc3RlbnQgY2hhaW4gY3VycmVudGx5LCBidXQgaXMgaGVsZCBhdCBzb21lIHBvaW50IGluIHRoZSBmdXR1cmUuANwgSXQgaXMgaWxsZWdhbCBmb3IgYSBgTm9uZWAgdmFsdWUgdG8gdHJhaWwgaW4gdGhlIGxpc3QuAaEFARkICCxMZWFzZVBlcmlvZBAQgDoJAATcIFRoZSBudW1iZXIgb2YgYmxvY2tzIG92ZXIgd2hpY2ggYSBzaW5nbGUgcGVyaW9kIGxhc3RzLixMZWFzZU9mZnNldBAQAAAAAATUIFRoZSBudW1iZXIgb2YgYmxvY2tzIHRvIG9mZnNldCBlYWNoIGxlYXNlIHBlcmlvZCBieS4BpQ1HACBBdWN0aW9ucwEgQXVjdGlvbnMQOEF1Y3Rpb25Db3VudGVyAQAQEAAAAAAEjCBOdW1iZXIgb2YgYXVjdGlvbnMgc3RhcnRlZCBzbyBmYXIuLEF1Y3Rpb25JbmZvAAD1AgQAFPggSW5mb3JtYXRpb24gcmVsYXRpbmcgdG8gdGhlIGN1cnJlbnQgYXVjdGlvbiwgaWYgdGhlcmUgaXMgb25lLgBFASBUaGUgZmlyc3QgaXRlbSBpbiB0aGUgdHVwbGUgaXMgdGhlIGxlYXNlIHBlcmlvZCBpbmRleCB0aGF0IHRoZSBmaXJzdCBvZiB0aGUgZm91clEBIGNvbnRpZ3VvdXMgbGVhc2UgcGVyaW9kcyBvbiBhdWN0aW9uIGlzIGZvci4gVGhlIHNlY29uZCBpcyB0aGUgYmxvY2sgbnVtYmVyIHdoZW4gdGhlXQEgYXVjdGlvbiB3aWxsICJiZWdpbiB0byBlbmQiLCBpLmUuIHRoZSBmaXJzdCBibG9jayBvZiB0aGUgRW5kaW5nIFBlcmlvZCBvZiB0aGUgYXVjdGlvbi48UmVzZXJ2ZWRBbW91bnRzAAEEBakNGAQACDEBIEFtb3VudHMgY3VycmVudGx5IHJlc2VydmVkIGluIHRoZSBhY2NvdW50cyBvZiB0aGUgYmlkZGVycyBjdXJyZW50bHkgd2lubmluZzggKHN1Yi0pcmFuZ2VzLhxXaW5uaW5nAAEEBRCtDQQADGEBIFRoZSB3aW5uaW5nIGJpZHMgZm9yIGVhY2ggb2YgdGhlIDEwIHJhbmdlcyBhdCBlYWNoIHNhbXBsZSBpbiB0aGUgZmluYWwgRW5kaW5nIFBlcmlvZCBvZkkBIHRoZSBjdXJyZW50IGF1Y3Rpb24uIFRoZSBtYXAncyBrZXkgaXMgdGhlIDAtYmFzZWQgaW5kZXggaW50byB0aGUgU2FtcGxlIFNpemUuIFRoZR0BIGZpcnN0IHNhbXBsZSBvZiB0aGUgZW5kaW5nIHBlcmlvZCBpcyAwOyB0aGUgbGFzdCBpcyBgU2FtcGxlIFNpemUgLSAxYC4BpQUBHQgQMEVuZGluZ1BlcmlvZBAQQBkBAAQdASBUaGUgbnVtYmVyIG9mIGJsb2NrcyBvdmVyIHdoaWNoIGFuIGF1Y3Rpb24gbWF5IGJlIHJldHJvYWN0aXZlbHkgZW5kZWQuMFNhbXBsZUxlbmd0aBAQFAAAAAzwIFRoZSBsZW5ndGggb2YgZWFjaCBzYW1wbGUgdG8gdGFrZSBkdXJpbmcgdGhlIGVuZGluZyBwZXJpb2QuANQgYEVuZGluZ1BlcmlvZGAgLyBgU2FtcGxlTGVuZ3RoYCA9IFRvdGFsICMgb2YgU2FtcGxlczhTbG90UmFuZ2VDb3VudBAQJAAAAABMTGVhc2VQZXJpb2RzUGVyU2xvdBAQCAAAAAABuQ1IACRDcm93ZGxvYW4BJENyb3dkbG9hbhAURnVuZHMAAQQFaQK9DQQABGggSW5mbyBvbiBhbGwgb2YgdGhlIGZ1bmRzLiBOZXdSYWlzZQEArQwEAAhVASBUaGUgZnVuZHMgdGhhdCBoYXZlIGhhZCBhZGRpdGlvbmFsIGNvbnRyaWJ1dGlvbnMgZHVyaW5nIHRoZSBsYXN0IGJsb2NrLiBUaGlzIGlzIHVzZWQVASBpbiBvcmRlciB0byBkZXRlcm1pbmUgd2hpY2ggZnVuZHMgc2hvdWxkIHN1Ym1pdCBuZXcgb3IgdXBkYXRlZCBiaWRzLjBFbmRpbmdzQ291bnQBABAQAAAAAAQpASBUaGUgbnVtYmVyIG9mIGF1Y3Rpb25zIHRoYXQgaGF2ZSBlbnRlcmVkIGludG8gdGhlaXIgZW5kaW5nIHBlcmlvZCBzbyBmYXIuNE5leHRGdW5kSW5kZXgBABAQAAAAAASoIFRyYWNrZXIgZm9yIHRoZSBuZXh0IGF2YWlsYWJsZSBmdW5kIGluZGV4Aa0FASEIDCBQYWxsZXRJZMEJIHB5L2NmdW5kCA0BIGBQYWxsZXRJZGAgZm9yIHRoZSBjcm93ZGxvYW4gcGFsbGV0LiBBbiBhcHByb3ByaWF0ZSB2YWx1ZSBjb3VsZCBiZWQgYFBhbGxldElkKCpiInB5L2NmdW5kIilgPE1pbkNvbnRyaWJ1dGlvbhhAGAyl1OgAAAAAAAAAAAAAAAhhASBUaGUgbWluaW11bSBhbW91bnQgdGhhdCBtYXkgYmUgY29udHJpYnV0ZWQgaW50byBhIGNyb3dkbG9hbi4gU2hvdWxkIGFsbW9zdCBjZXJ0YWlubHkgYmV8IGF0IGxlYXN0IGBFeGlzdGVudGlhbERlcG9zaXRgLjxSZW1vdmVLZXlzTGltaXQQEOgDAAAE5CBNYXggbnVtYmVyIG9mIHN0b3JhZ2Uga2V5cyB0byByZW1vdmUgcGVyIGV4dHJpbnNpYyBjYWxsLgHFDUkAIENvcmV0aW1lAAHBBQElCAggQnJva2VySWQQEO0DAAAEiCBUaGUgUGFyYUlkIG9mIHRoZSBjb3JldGltZSBjaGFpbi5EQnJva2VyUG90TG9jYXRpb274jAEBAG1vZGxweS9icm9rZQAAAAAAAAAAAAAAAAAAAAAAAAAABIQgVGhlIGNvcmV0aW1lIGNoYWluIHBvdCBsb2NhdGlvbi4ByQ1KACRYY21QYWxsZXQBJFhjbVBhbGxldDgwUXVlcnlDb3VudGVyAQAwIAAAAAAAAAAABIggVGhlIGxhdGVzdCBhdmFpbGFibGUgcXVlcnkgaW5kZXguHFF1ZXJpZXMAAQQCMM0NBAAEVCBUaGUgb25nb2luZyBxdWVyaWVzLihBc3NldFRyYXBzAQEEBjQQEAAAAAAQaCBUaGUgZXhpc3RpbmcgYXNzZXQgdHJhcHMuAGEBIEtleSBpcyB0aGUgYmxha2UyIDI1NiBoYXNoIG9mIChvcmlnaW4sIHZlcnNpb25lZCBgQXNzZXRzYCkgcGFpci4gVmFsdWUgaXMgdGhlIG51bWJlciBvZh0BIHRpbWVzIHRoaXMgcGFpciBoYXMgYmVlbiB0cmFwcGVkICh1c3VhbGx5IGp1c3QgMSBpZiBpdCBleGlzdHMgYXQgYWxsKS44U2FmZVhjbVZlcnNpb24AABAEAAhhASBEZWZhdWx0IHZlcnNpb24gdG8gZW5jb2RlIFhDTSB3aGVuIGxhdGVzdCB2ZXJzaW9uIG9mIGRlc3RpbmF0aW9uIGlzIHVua25vd24uIElmIGBOb25lYCw9ASB0aGVuIHRoZSBkZXN0aW5hdGlvbnMgd2hvc2UgWENNIHZlcnNpb24gaXMgdW5rbm93biBhcmUgY29uc2lkZXJlZCB1bnJlYWNoYWJsZS5AU3VwcG9ydGVkVmVyc2lvbgABCAUC4Q0QBAAE8CBUaGUgTGF0ZXN0IHZlcnNpb25zIHRoYXQgd2Uga25vdyB2YXJpb3VzIGxvY2F0aW9ucyBzdXBwb3J0LkBWZXJzaW9uTm90aWZpZXJzAAEIBQLhDTAEAAQFASBBbGwgbG9jYXRpb25zIHRoYXQgd2UgaGF2ZSByZXF1ZXN0ZWQgdmVyc2lvbiBub3RpZmljYXRpb25zIGZyb20uUFZlcnNpb25Ob3RpZnlUYXJnZXRzAAEIBQLhDeUNBAAIcQEgVGhlIHRhcmdldCBsb2NhdGlvbnMgdGhhdCBhcmUgc3Vic2NyaWJlZCB0byBvdXIgdmVyc2lvbiBjaGFuZ2VzLCBhcyB3ZWxsIGFzIHRoZSBtb3N0IHJlY2VudJQgb2Ygb3VyIHZlcnNpb25zIHdlIGluZm9ybWVkIHRoZW0gb2YuVFZlcnNpb25EaXNjb3ZlcnlRdWV1ZQEA6Q0EAAxlASBEZXN0aW5hdGlvbnMgd2hvc2UgbGF0ZXN0IFhDTSB2ZXJzaW9uIHdlIHdvdWxkIGxpa2UgdG8ga25vdy4gRHVwbGljYXRlcyBub3QgYWxsb3dlZCwgYW5kcQEgdGhlIGB1MzJgIGNvdW50ZXIgaXMgdGhlIG51bWJlciBvZiB0aW1lcyB0aGF0IGEgc2VuZCB0byB0aGUgZGVzdGluYXRpb24gaGFzIGJlZW4gYXR0ZW1wdGVkLIwgd2hpY2ggaXMgdXNlZCBhcyBhIHByaW9yaXRpemF0aW9uLkBDdXJyZW50TWlncmF0aW9uAAD1DQQABJwgVGhlIGN1cnJlbnQgbWlncmF0aW9uJ3Mgc3RhZ2UsIGlmIGFueS5UUmVtb3RlTG9ja2VkRnVuZ2libGVzAAEMBQIC/Q0BDgQABPAgRnVuZ2libGUgYXNzZXRzIHdoaWNoIHdlIGtub3cgYXJlIGxvY2tlZCBvbiBhIHJlbW90ZSBjaGFpbi48TG9ja2VkRnVuZ2libGVzAAEEAgARDgQABOAgRnVuZ2libGUgYXNzZXRzIHdoaWNoIHdlIGtub3cgYXJlIGxvY2tlZCBvbiB0aGlzIGNoYWluLlRYY21FeGVjdXRpb25TdXNwZW5kZWQBACAEAAS0IEdsb2JhbCBzdXNwZW5zaW9uIHN0YXRlIG9mIHRoZSBYQ00gZXhlY3V0b3IuPFNob3VsZFJlY29yZFhjbQEAIAQAHFkBIFdoZXRoZXIgb3Igbm90IGluY29taW5nIFhDTXMgKGJvdGggZXhlY3V0ZWQgbG9jYWxseSBhbmQgcmVjZWl2ZWQpIHNob3VsZCBiZSByZWNvcmRlZC7EIE9ubHkgb25lIFhDTSBwcm9ncmFtIHdpbGwgYmUgcmVjb3JkZWQgYXQgYSB0aW1lLikBIFRoaXMgaXMgbWVhbnQgdG8gYmUgdXNlZCBpbiBydW50aW1lIEFQSXMsIGFuZCBpdCdzIGFkdmlzZWQgaXQgc3RheXMgZmFsc2UNASBmb3IgYWxsIG90aGVyIHVzZSBjYXNlcywgc28gYXMgdG8gbm90IGRlZ3JhZGUgcmVndWxhciBwZXJmb3JtYW5jZS4AWQEgT25seSByZWxldmFudCBpZiB0aGlzIHBhbGxldCBpcyBiZWluZyB1c2VkIGFzIHRoZSBbYHhjbV9leGVjdXRvcjo6dHJhaXRzOjpSZWNvcmRYY21gXcggaW1wbGVtZW50YXRpb24gaW4gdGhlIFhDTSBleGVjdXRvciBjb25maWd1cmF0aW9uLixSZWNvcmRlZFhjbQAAkQYEABhJASBJZiBbYFNob3VsZFJlY29yZFhjbWBdIGlzIHNldCB0byB0cnVlLCB0aGVuIHRoZSBsYXN0IFhDTSBwcm9ncmFtIGV4ZWN1dGVkIGxvY2FsbHlUIHdpbGwgYmUgc3RvcmVkIGhlcmUuKQEgUnVudGltZSBBUElzIGNhbiBmZXRjaCB0aGUgWENNIHRoYXQgd2FzIGV4ZWN1dGVkIGJ5IGFjY2Vzc2luZyB0aGlzIHZhbHVlLgBZASBPbmx5IHJlbGV2YW50IGlmIHRoaXMgcGFsbGV0IGlzIGJlaW5nIHVzZWQgYXMgdGhlIFtgeGNtX2V4ZWN1dG9yOjp0cmFpdHM6OlJlY29yZFhjbWBdyCBpbXBsZW1lbnRhdGlvbiBpbiB0aGUgWENNIGV4ZWN1dG9yIGNvbmZpZ3VyYXRpb24uAdUFASkIAAEdDmMAME1lc3NhZ2VRdWV1ZQEwTWVzc2FnZVF1ZXVlDDBCb29rU3RhdGVGb3IBAQQFFQchDnQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATMIFRoZSBpbmRleCBvZiB0aGUgZmlyc3QgYW5kIGxhc3QgKG5vbi1lbXB0eSkgcGFnZXMuLFNlcnZpY2VIZWFkAAAVBwQABLwgVGhlIG9yaWdpbiBhdCB3aGljaCB3ZSBzaG91bGQgYmVnaW4gc2VydmljaW5nLhRQYWdlcwABCAUFLQ4xDgQABIggVGhlIG1hcCBvZiBwYWdlIGluZGljZXMgdG8gcGFnZXMuAREHATEIECBIZWFwU2l6ZRAQAAABABQ9ASBUaGUgc2l6ZSBvZiB0aGUgcGFnZTsgdGhpcyBpbXBsaWVzIHRoZSBtYXhpbXVtIG1lc3NhZ2Ugc2l6ZSB3aGljaCBjYW4gYmUgc2VudC4AWQEgQSBnb29kIHZhbHVlIGRlcGVuZHMgb24gdGhlIGV4cGVjdGVkIG1lc3NhZ2Ugc2l6ZXMsIHRoZWlyIHdlaWdodHMsIHRoZSB3ZWlnaHQgdGhhdCBpc10BIGF2YWlsYWJsZSBmb3IgcHJvY2Vzc2luZyB0aGVtIGFuZCB0aGUgbWF4aW1hbCBuZWVkZWQgbWVzc2FnZSBzaXplLiBUaGUgbWF4aW1hbCBtZXNzYWdlEQEgc2l6ZSBpcyBzbGlnaHRseSBsb3dlciB0aGFuIHRoaXMgYXMgZGVmaW5lZCBieSBbYE1heE1lc3NhZ2VMZW5PZmBdLiBNYXhTdGFsZRAQEAAAAAxdASBUaGUgbWF4aW11bSBudW1iZXIgb2Ygc3RhbGUgcGFnZXMgKGkuZS4gb2Ygb3ZlcndlaWdodCBtZXNzYWdlcykgYWxsb3dlZCBiZWZvcmUgY3VsbGluZ1EBIGNhbiBoYXBwZW4uIE9uY2UgdGhlcmUgYXJlIG1vcmUgc3RhbGUgcGFnZXMgdGhhbiB0aGlzLCB0aGVuIGhpc3RvcmljYWwgcGFnZXMgbWF5IGJl/CBkcm9wcGVkLCBldmVuIGlmIHRoZXkgY29udGFpbiB1bnByb2Nlc3NlZCBvdmVyd2VpZ2h0IG1lc3NhZ2VzLjRTZXJ2aWNlV2VpZ2h0cQdAAQcAoNshXRMzMzMzMzMzMxhBASBUaGUgYW1vdW50IG9mIHdlaWdodCAoaWYgYW55KSB3aGljaCBzaG91bGQgYmUgcHJvdmlkZWQgdG8gdGhlIG1lc3NhZ2UgcXVldWUgZm9yqCBzZXJ2aWNpbmcgZW5xdWV1ZWQgaXRlbXMgYG9uX2luaXRpYWxpemVgLgD8IFRoaXMgbWF5IGJlIGxlZ2l0aW1hdGVseSBgTm9uZWAgaW4gdGhlIGNhc2UgdGhhdCB5b3Ugd2lsbCBjYWxsXQEgYFNlcnZpY2VRdWV1ZXM6OnNlcnZpY2VfcXVldWVzYCBtYW51YWxseSBvciBzZXQgW2BTZWxmOjpJZGxlTWF4U2VydmljZVdlaWdodGBdIHRvIGhhdmVUIGl0IHJ1biBpbiBgb25faWRsZWAuUElkbGVNYXhTZXJ2aWNlV2VpZ2h0cQdAAQcAoNshXRMzMzMzMzMzMxRdASBUaGUgbWF4aW11bSBhbW91bnQgb2Ygd2VpZ2h0IChpZiBhbnkpIHRvIGJlIHVzZWQgZnJvbSByZW1haW5pbmcgd2VpZ2h0IGBvbl9pZGxlYCB3aGljaEEBIHNob3VsZCBiZSBwcm92aWRlZCB0byB0aGUgbWVzc2FnZSBxdWV1ZSBmb3Igc2VydmljaW5nIGVucXVldWVkIGl0ZW1zIGBvbl9pZGxlYC49ASBVc2VmdWwgZm9yIHBhcmFjaGFpbnMgdG8gcHJvY2VzcyBtZXNzYWdlcyBhdCB0aGUgc2FtZSBibG9jayB0aGV5IGFyZSByZWNlaXZlZC4AKQEgSWYgYE5vbmVgLCBpdCB3aWxsIG5vdCBjYWxsIGBTZXJ2aWNlUXVldWVzOjpzZXJ2aWNlX3F1ZXVlc2AgaW4gYG9uX2lkbGVgLgE5DmQAJEFzc2V0UmF0ZQEkQXNzZXRSYXRlBFhDb252ZXJzaW9uUmF0ZVRvTmF0aXZlAAEEAsQhBwQADB0BIE1hcHMgYW4gYXNzZXQgdG8gaXRzIGZpeGVkIHBvaW50IHJlcHJlc2VudGF0aW9uIGluIHRoZSBuYXRpdmUgYmFsYW5jZS4ATQEgRS5nLiBgbmF0aXZlX2Ftb3VudCA9IGFzc2V0X2Ftb3VudCAqIENvbnZlcnNpb25SYXRlVG9OYXRpdmU6OjxUPjo6Z2V0KGFzc2V0X2tpbmQpYAEdBwE5CAABPQ5lABRCZWVmeQEUQmVlZnkULEF1dGhvcml0aWVzAQBBDgQABHAgVGhlIGN1cnJlbnQgYXV0aG9yaXRpZXMgc2V0OFZhbGlkYXRvclNldElkAQAwIAAAAAAAAAAABHQgVGhlIGN1cnJlbnQgdmFsaWRhdG9yIHNldCBpZDxOZXh0QXV0aG9yaXRpZXMBAEEOBAAE7CBBdXRob3JpdGllcyBzZXQgc2NoZWR1bGVkIHRvIGJlIHVzZWQgd2l0aCB0aGUgbmV4dCBzZXNzaW9uMFNldElkU2Vzc2lvbgABBAUwEAQAKFEBIEEgbWFwcGluZyBmcm9tIEJFRUZZIHNldCBJRCB0byB0aGUgaW5kZXggb2YgdGhlICptb3N0IHJlY2VudCogc2Vzc2lvbiBmb3Igd2hpY2ggaXRzaCBtZW1iZXJzIHdlcmUgcmVzcG9uc2libGUuAEUBIFRoaXMgaXMgb25seSB1c2VkIGZvciB2YWxpZGF0aW5nIGVxdWl2b2NhdGlvbiBwcm9vZnMuIEFuIGVxdWl2b2NhdGlvbiBwcm9vZiBtdXN0TQEgY29udGFpbnMgYSBrZXktb3duZXJzaGlwIHByb29mIGZvciBhIGdpdmVuIHNlc3Npb24sIHRoZXJlZm9yZSB3ZSBuZWVkIGEgd2F5IHRvIHRpZT0BIHRvZ2V0aGVyIHNlc3Npb25zIGFuZCBCRUVGWSBzZXQgaWRzLCBpLmUuIHdlIG5lZWQgdG8gdmFsaWRhdGUgdGhhdCBhIHZhbGlkYXRvckEBIHdhcyB0aGUgb3duZXIgb2YgYSBnaXZlbiBrZXkgb24gYSBnaXZlbiBzZXNzaW9uLCBhbmQgd2hhdCB0aGUgYWN0aXZlIHNldCBJRCB3YXNUIGR1cmluZyB0aGF0IHNlc3Npb24uANwgVFdPWC1OT1RFOiBgVmFsaWRhdG9yU2V0SWRgIGlzIG5vdCB1bmRlciB1c2VyIGNvbnRyb2wuMEdlbmVzaXNCbG9jawEAPQIEAAzcIEJsb2NrIG51bWJlciB3aGVyZSBCRUVGWSBjb25zZW5zdXMgaXMgZW5hYmxlZC9zdGFydGVkLmkBIEJ5IGNoYW5naW5nIHRoaXMgKHRocm91Z2ggcHJpdmlsZWdlZCBgc2V0X25ld19nZW5lc2lzKClgKSwgQkVFRlkgY29uc2Vuc3VzIGlzIGVmZmVjdGl2ZWx5rCByZXN0YXJ0ZWQgZnJvbSB0aGUgbmV3bHkgc2V0IGJsb2NrIG51bWJlci4BJQcADDhNYXhBdXRob3JpdGllcxAQoIYBAATUIFRoZSBtYXhpbXVtIG51bWJlciBvZiBhdXRob3JpdGllcyB0aGF0IGNhbiBiZSBhZGRlZC40TWF4Tm9taW5hdG9ycxAQAAIAAATUIFRoZSBtYXhpbXVtIG51bWJlciBvZiBub21pbmF0b3JzIGZvciBlYWNoIHZhbGlkYXRvci5YTWF4U2V0SWRTZXNzaW9uRW50cmllczAgqAAAAAAAAAAYOQEgVGhlIG1heGltdW0gbnVtYmVyIG9mIGVudHJpZXMgdG8ga2VlcCBpbiB0aGUgc2V0IGlkIHRvIHNlc3Npb24gaW5kZXggbWFwcGluZy4AMQEgU2luY2UgdGhlIGBTZXRJZFNlc3Npb25gIG1hcCBpcyBvbmx5IHVzZWQgZm9yIHZhbGlkYXRpbmcgZXF1aXZvY2F0aW9ucyB0aGlzKQEgdmFsdWUgc2hvdWxkIHJlbGF0ZSB0byB0aGUgYm9uZGluZyBkdXJhdGlvbiBvZiB3aGF0ZXZlciBzdGFraW5nIHN5c3RlbSBpczUBIGJlaW5nIHVzZWQgKGlmIGFueSkuIElmIGVxdWl2b2NhdGlvbiBoYW5kbGluZyBpcyBub3QgZW5hYmxlZCB0aGVuIHRoaXMgdmFsdWU0IGNhbiBiZSB6ZXJvLgFJDsgADE1tcgEMTW1yDCBSb290SGFzaAEANIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARYIExhdGVzdCBNTVIgUm9vdCBoYXNoLjhOdW1iZXJPZkxlYXZlcwEAMCAAAAAAAAAAAASwIEN1cnJlbnQgc2l6ZSBvZiB0aGUgTU1SIChudW1iZXIgb2YgbGVhdmVzKS4UTm9kZXMAAQQGMDQEABCAIEhhc2hlcyBvZiB0aGUgbm9kZXMgaW4gdGhlIE1NUi4ALQEgTm90ZSB0aGlzIGNvbGxlY3Rpb24gb25seSBjb250YWlucyBNTVIgcGVha3MsIHRoZSBpbm5lciBub2RlcyAoYW5kIGxlYXZlcym8IGFyZSBwcnVuZWQgYW5kIG9ubHkgc3RvcmVkIGluIHRoZSBPZmZjaGFpbiBEQi4AAAAAyQAwQmVlZnlNbXJMZWFmATBCZWVmeU1tckxlYWYIQEJlZWZ5QXV0aG9yaXRpZXMBAE0OsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABKAgRGV0YWlscyBvZiBjdXJyZW50IEJFRUZZIGF1dGhvcml0eSBzZXQuUEJlZWZ5TmV4dEF1dGhvcml0aWVzAQBNDrAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyUIERldGFpbHMgb2YgbmV4dCBCRUVGWSBhdXRob3JpdHkgc2V0LgBRASBUaGlzIHN0b3JhZ2UgZW50cnkgaXMgdXNlZCBhcyBjYWNoZSBmb3IgY2FsbHMgdG8gYHVwZGF0ZV9iZWVmeV9uZXh0X2F1dGhvcml0eV9zZXRgLgAAAADKAASdAV0BvQVRDiRIQ2hlY2tOb25aZXJvU2VuZGVyVQ6hAUBDaGVja1NwZWNWZXJzaW9uWQ4QOENoZWNrVHhWZXJzaW9uXQ4QMENoZWNrR2VuZXNpc2EONDhDaGVja01vcnRhbGl0eWUONChDaGVja05vbmNlbQ6hASxDaGVja1dlaWdodHEOoQFgQ2hhcmdlVHJhbnNhY3Rpb25QYXltZW50dQ6hAURDaGVja01ldGFkYXRhSGFzaHkOsQeBDlwkSW5mbGF0aW9uBJhleHBlcmltZW50YWxfaW5mbGF0aW9uX3ByZWRpY3Rpb25faW5mbwCFDhDYIFJldHVybiB0aGUgY3VycmVudCBlc3RpbWF0ZXMgb2YgdGhlIGluZmxhdGlvbiBhbW91bnQuAFEBIFRoaXMgaXMgbWFya2VkIGFzIGV4cGVyaW1lbnRhbCBpbiBsaWdodCBvZiBSRkMjODkuIE5vbmV0aGVsZXNzLCBpdHMgdXNhZ2UgaXMgaGlnaGx5JQEgcmVjb21tZW5kZWQgb3ZlciB0cnlpbmcgdG8gcmVhZC1zdG9yYWdlLCBvciByZS1jcmVhdGUgdGhlIG9uY2hhaW4gbG9naWMuABBDb3JlDBx2ZXJzaW9uAGkIBJAgUmV0dXJucyB0aGUgdmVyc2lvbiBvZiB0aGUgcnVudGltZS40ZXhlY3V0ZV9ibG9jawQUYmxvY2uNDqEBBGQgRXhlY3V0ZSB0aGUgZ2l2ZW4gYmxvY2suQGluaXRpYWxpemVfYmxvY2sEGGhlYWRlcnkBmQ4EQQEgSW5pdGlhbGl6ZSBhIGJsb2NrIHdpdGggdGhlIGdpdmVuIGhlYWRlciBhbmQgcmV0dXJuIHRoZSBydW50aW1lIGV4ZWN1dGl2ZSBtb2RlLgQhASBUaGUgYENvcmVgIHJ1bnRpbWUgYXBpIHRoYXQgZXZlcnkgU3Vic3RyYXRlIHJ1bnRpbWUgbmVlZHMgdG8gaW1wbGVtZW50LiBNZXRhZGF0YQwgbWV0YWRhdGEAnQ4EjCBSZXR1cm5zIHRoZSBtZXRhZGF0YSBvZiBhIHJ1bnRpbWUuTG1ldGFkYXRhX2F0X3ZlcnNpb24EHHZlcnNpb24QoQ4QpCBSZXR1cm5zIHRoZSBtZXRhZGF0YSBhdCBhIGdpdmVuIHZlcnNpb24uAAUBIElmIHRoZSBnaXZlbiBgdmVyc2lvbmAgaXNuJ3Qgc3VwcG9ydGVkLCB0aGlzIHdpbGwgcmV0dXJuIGBOb25lYC51ASBVc2UgW2BTZWxmOjptZXRhZGF0YV92ZXJzaW9uc2BdIHRvIGZpbmQgb3V0IGFib3V0IHN1cHBvcnRlZCBtZXRhZGF0YSB2ZXJzaW9uIG9mIHRoZSBydW50aW1lLkRtZXRhZGF0YV92ZXJzaW9ucwDBAQykIFJldHVybnMgdGhlIHN1cHBvcnRlZCBtZXRhZGF0YSB2ZXJzaW9ucy4AwCBUaGlzIGNhbiBiZSB1c2VkIHRvIGNhbGwgYG1ldGFkYXRhX2F0X3ZlcnNpb25gLgQBASBUaGUgYE1ldGFkYXRhYCBhcGkgdHJhaXQgdGhhdCByZXR1cm5zIG1ldGFkYXRhIGZvciB0aGUgcnVudGltZS4wQmxvY2tCdWlsZGVyEDxhcHBseV9leHRyaW5zaWMEJGV4dHJpbnNpY5EOpQ4QbCBBcHBseSB0aGUgZ2l2ZW4gZXh0cmluc2ljLgA5ASBSZXR1cm5zIGFuIGluY2x1c2lvbiBvdXRjb21lIHdoaWNoIHNwZWNpZmllcyBpZiB0aGlzIGV4dHJpbnNpYyBpcyBpbmNsdWRlZCBpbkwgdGhpcyBibG9jayBvciBub3QuOGZpbmFsaXplX2Jsb2NrAHkBBGggRmluaXNoIHRoZSBjdXJyZW50IGJsb2NrLkxpbmhlcmVudF9leHRyaW5zaWNzBCBpbmhlcmVudLUOlQ4EPQEgR2VuZXJhdGUgaW5oZXJlbnQgZXh0cmluc2ljcy4gVGhlIGluaGVyZW50IGRhdGEgd2lsbCB2YXJ5IGZyb20gY2hhaW4gdG8gY2hhaW4uPGNoZWNrX2luaGVyZW50cwgUYmxvY2uNDhBkYXRhtQ7FDgRVASBDaGVjayB0aGF0IHRoZSBpbmhlcmVudHMgYXJlIHZhbGlkLiBUaGUgaW5oZXJlbnQgZGF0YSB3aWxsIHZhcnkgZnJvbSBjaGFpbiB0byBjaGFpbi4EcQEgVGhlIGBCbG9ja0J1aWxkZXJgIGFwaSB0cmFpdCB0aGF0IHByb3ZpZGVzIHRoZSByZXF1aXJlZCBmdW5jdGlvbmFsaXR5IGZvciBidWlsZGluZyBhIGJsb2NrLlhUYWdnZWRUcmFuc2FjdGlvblF1ZXVlBFB2YWxpZGF0ZV90cmFuc2FjdGlvbgwYc291cmNlyQ4IdHiRDihibG9ja19oYXNoNM0OJGggVmFsaWRhdGUgdGhlIHRyYW5zYWN0aW9uLgBlASBUaGlzIG1ldGhvZCBpcyBpbnZva2VkIGJ5IHRoZSB0cmFuc2FjdGlvbiBwb29sIHRvIGxlYXJuIGRldGFpbHMgYWJvdXQgZ2l2ZW4gdHJhbnNhY3Rpb24uRQEgVGhlIGltcGxlbWVudGF0aW9uIHNob3VsZCBtYWtlIHN1cmUgdG8gdmVyaWZ5IHRoZSBjb3JyZWN0bmVzcyBvZiB0aGUgdHJhbnNhY3Rpb25NASBhZ2FpbnN0IGN1cnJlbnQgc3RhdGUuIFRoZSBnaXZlbiBgYmxvY2tfaGFzaGAgY29ycmVzcG9uZHMgdG8gdGhlIGhhc2ggb2YgdGhlIGJsb2NrfCB0aGF0IGlzIHVzZWQgYXMgY3VycmVudCBzdGF0ZS4ARQEgTm90ZSB0aGF0IHRoaXMgY2FsbCBtYXkgYmUgcGVyZm9ybWVkIGJ5IHRoZSBwb29sIG11bHRpcGxlIHRpbWVzIGFuZCB0cmFuc2FjdGlvbnOkIG1pZ2h0IGJlIHZlcmlmaWVkIGluIGFueSBwb3NzaWJsZSBvcmRlci4ETQEgVGhlIGBUYWdnZWRUcmFuc2FjdGlvblF1ZXVlYCBhcGkgdHJhaXQgZm9yIGludGVyZmVyaW5nIHdpdGggdGhlIHRyYW5zYWN0aW9uIHF1ZXVlLkRPZmZjaGFpbldvcmtlckFwaQQ8b2ZmY2hhaW5fd29ya2VyBBhoZWFkZXJ5AaEBBMggU3RhcnRzIHRoZSBvZmYtY2hhaW4gdGFzayBmb3IgZ2l2ZW4gYmxvY2sgaGVhZGVyLgRkIFRoZSBvZmZjaGFpbiB3b3JrZXIgYXBpLjRQYXJhY2hhaW5Ib3N0fCh2YWxpZGF0b3JzAEEMBHAgR2V0IHRoZSBjdXJyZW50IHZhbGlkYXRvcnMuQHZhbGlkYXRvcl9ncm91cHMA1Q4MZQEgUmV0dXJucyB0aGUgdmFsaWRhdG9yIGdyb3VwcyBhbmQgcm90YXRpb24gaW5mbyBsb2NhbGl6ZWQgYmFzZWQgb24gdGhlIGh5cG90aGV0aWNhbCBjaGlsZGEBICBvZiBhIGJsb2NrIHdob3NlIHN0YXRlICB0aGlzIGlzIGludm9rZWQgb24uIE5vdGUgdGhhdCBgbm93YCBpbiB0aGUgYEdyb3VwUm90YXRpb25JbmZvYNAgc2hvdWxkIGJlIHRoZSBzdWNjZXNzb3Igb2YgdGhlIG51bWJlciBvZiB0aGUgYmxvY2suSGF2YWlsYWJpbGl0eV9jb3JlcwDdDgg1ASBZaWVsZHMgaW5mb3JtYXRpb24gb24gYWxsIGF2YWlsYWJpbGl0eSBjb3JlcyBhcyByZWxldmFudCB0byB0aGUgY2hpbGQgYmxvY2suPQEgQ29yZXMgYXJlIGVpdGhlciBmcmVlIG9yIG9jY3VwaWVkLiBGcmVlIGNvcmVzIGNhbiBoYXZlIHBhcmFzIGFzc2lnbmVkIHRvIHRoZW0uZHBlcnNpc3RlZF92YWxpZGF0aW9uX2RhdGEIHHBhcmFfaWRpAihhc3N1bXB0aW9u9Q75DhRpASBZaWVsZHMgdGhlIHBlcnNpc3RlZCB2YWxpZGF0aW9uIGRhdGEgZm9yIHRoZSBnaXZlbiBgUGFyYUlkYCBhbG9uZyB3aXRoIGFuIGFzc3VtcHRpb24gdGhhdNggc2hvdWxkIGJlIHVzZWQgaWYgdGhlIHBhcmEgY3VycmVudGx5IG9jY3VwaWVzIGEgY29yZS4ARQEgUmV0dXJucyBgTm9uZWAgaWYgZWl0aGVyIHRoZSBwYXJhIGlzIG5vdCByZWdpc3RlcmVkIG9yIHRoZSBhc3N1bXB0aW9uIGlzIGBGcmVlZGCYIGFuZCB0aGUgcGFyYSBhbHJlYWR5IG9jY3VwaWVzIGEgY29yZS5cYXNzdW1lZF92YWxpZGF0aW9uX2RhdGEIHHBhcmFfaWRpApxleHBlY3RlZF9wZXJzaXN0ZWRfdmFsaWRhdGlvbl9kYXRhX2hhc2g0AQ8MaQEgUmV0dXJucyB0aGUgcGVyc2lzdGVkIHZhbGlkYXRpb24gZGF0YSBmb3IgdGhlIGdpdmVuIGBQYXJhSWRgIGFsb25nIHdpdGggdGhlIGNvcnJlc3BvbmRpbmd1ASB2YWxpZGF0aW9uIGNvZGUgaGFzaC4gSW5zdGVhZCBvZiBhY2NlcHRpbmcgYXNzdW1wdGlvbiBhYm91dCB0aGUgcGFyYSwgbWF0Y2hlcyB0aGUgdmFsaWRhdGlvbikBIGRhdGEgaGFzaCBhZ2FpbnN0IGFuIGV4cGVjdGVkIG9uZSBhbmQgeWllbGRzIGBOb25lYCBpZiB0aGV5J3JlIG5vdCBlcXVhbC5gY2hlY2tfdmFsaWRhdGlvbl9vdXRwdXRzCBxwYXJhX2lkaQIcb3V0cHV0cyUFIAQVASBDaGVja3MgaWYgdGhlIGdpdmVuIHZhbGlkYXRpb24gb3V0cHV0cyBwYXNzIHRoZSBhY2NlcHRhbmNlIGNyaXRlcmlhLlxzZXNzaW9uX2luZGV4X2Zvcl9jaGlsZAAQDPAgUmV0dXJucyB0aGUgc2Vzc2lvbiBpbmRleCBleHBlY3RlZCBhdCBhIGNoaWxkIG9mIHRoZSBibG9jay4A0CBUaGlzIGNhbiBiZSB1c2VkIHRvIGluc3RhbnRpYXRlIGEgYFNpZ25pbmdDb250ZXh0YC48dmFsaWRhdGlvbl9jb2RlCBxwYXJhX2lkaQIoYXNzdW1wdGlvbvUOOQUQVQEgRmV0Y2ggdGhlIHZhbGlkYXRpb24gY29kZSB1c2VkIGJ5IGEgcGFyYSwgbWFraW5nIHRoZSBnaXZlbiBgT2NjdXBpZWRDb3JlQXNzdW1wdGlvbmAuAEUBIFJldHVybnMgYE5vbmVgIGlmIGVpdGhlciB0aGUgcGFyYSBpcyBub3QgcmVnaXN0ZXJlZCBvciB0aGUgYXNzdW1wdGlvbiBpcyBgRnJlZWRgmCBhbmQgdGhlIHBhcmEgYWxyZWFkeSBvY2N1cGllcyBhIGNvcmUueGNhbmRpZGF0ZV9wZW5kaW5nX2F2YWlsYWJpbGl0eQQccGFyYV9pZGkCCQ8IXQEgR2V0IHRoZSByZWNlaXB0IG9mIGEgY2FuZGlkYXRlIHBlbmRpbmcgYXZhaWxhYmlsaXR5LiBUaGlzIHJldHVybnMgYFNvbWVgIGZvciBhbnkgcGFyYXMlASBhc3NpZ25lZCB0byBvY2N1cGllZCBjb3JlcyBpbiBgYXZhaWxhYmlsaXR5X2NvcmVzYCBhbmQgYE5vbmVgIG90aGVyd2lzZS5AY2FuZGlkYXRlX2V2ZW50cwANDwQtASBHZXQgYSB2ZWN0b3Igb2YgZXZlbnRzIGNvbmNlcm5pbmcgY2FuZGlkYXRlcyB0aGF0IG9jY3VycmVkIHdpdGhpbiBhIGJsb2NrLjBkbXFfY29udGVudHMEJHJlY2lwaWVudGkC4QwEPQEgR2V0IGFsbCB0aGUgcGVuZGluZyBpbmJvdW5kIG1lc3NhZ2VzIGluIHRoZSBkb3dud2FyZCBtZXNzYWdlIHF1ZXVlIGZvciBhIHBhcmEueGluYm91bmRfaHJtcF9jaGFubmVsc19jb250ZW50cwQkcmVjaXBpZW50aQIVDwhlASBHZXQgdGhlIGNvbnRlbnRzIG9mIGFsbCBjaGFubmVscyBhZGRyZXNzZWQgdG8gdGhlIGdpdmVuIHJlY2lwaWVudC4gQ2hhbm5lbHMgdGhhdCBoYXZlIG5vkCBtZXNzYWdlcyBpbiB0aGVtIGFyZSBhbHNvIGluY2x1ZGVkLlx2YWxpZGF0aW9uX2NvZGVfYnlfaGFzaAQQaGFzaCEFOQUEnCBHZXQgdGhlIHZhbGlkYXRpb24gY29kZSBmcm9tIGl0cyBoYXNoLjhvbl9jaGFpbl92b3RlcwAhDwQxASBTY3JhcGUgZGlzcHV0ZSByZWxldmFudCBmcm9tIG9uLWNoYWluLCBiYWNraW5nIHZvdGVzIGFuZCByZXNvbHZlZCBkaXNwdXRlcy4wc2Vzc2lvbl9pbmZvBBRpbmRleBAlDwzcIEdldCB0aGUgc2Vzc2lvbiBpbmZvIGZvciB0aGUgZ2l2ZW4gc2Vzc2lvbiwgaWYgc3RvcmVkLgAZASBOT1RFOiBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgYXZhaWxhYmxlIHNpbmNlIHBhcmFjaGFpbiBob3N0IHZlcnNpb24gMi5oc3VibWl0X3B2Zl9jaGVja19zdGF0ZW1lbnQIEHN0bXR1BSRzaWduYXR1cmUFBaEBDAEBIFN1Ym1pdHMgYSBQVkYgcHJlLWNoZWNraW5nIHN0YXRlbWVudCBpbnRvIHRoZSB0cmFuc2FjdGlvbiBwb29sLgAZASBOT1RFOiBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgYXZhaWxhYmxlIHNpbmNlIHBhcmFjaGFpbiBob3N0IHZlcnNpb24gMi5UcHZmc19yZXF1aXJlX3ByZWNoZWNrAKkMDF0BIFJldHVybnMgY29kZSBoYXNoZXMgb2YgUFZGcyB0aGF0IHJlcXVpcmUgcHJlLWNoZWNraW5nIGJ5IHZhbGlkYXRvcnMgaW4gdGhlIGFjdGl2ZSBzZXQuABkBIE5PVEU6IFRoaXMgZnVuY3Rpb24gaXMgb25seSBhdmFpbGFibGUgc2luY2UgcGFyYWNoYWluIGhvc3QgdmVyc2lvbiAyLlB2YWxpZGF0aW9uX2NvZGVfaGFzaAgccGFyYV9pZGkCKGFzc3VtcHRpb271DikPDIUBIEZldGNoIHRoZSBoYXNoIG9mIHRoZSB2YWxpZGF0aW9uIGNvZGUgdXNlZCBieSBhIHBhcmEsIG1ha2luZyB0aGUgZ2l2ZW4gYE9jY3VwaWVkQ29yZUFzc3VtcHRpb25gLgAZASBOT1RFOiBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgYXZhaWxhYmxlIHNpbmNlIHBhcmFjaGFpbiBob3N0IHZlcnNpb24gMi4gZGlzcHV0ZXMALQ8EeCBSZXR1cm5zIGFsbCBvbmNoYWluIGRpc3B1dGVzLlxzZXNzaW9uX2V4ZWN1dG9yX3BhcmFtcwQ0c2Vzc2lvbl9pbmRleBA1DwS4IFJldHVybnMgZXhlY3V0aW9uIHBhcmFtZXRlcnMgZm9yIHRoZSBzZXNzaW9uLkR1bmFwcGxpZWRfc2xhc2hlcwA5DwhZASBSZXR1cm5zIGEgbGlzdCBvZiB2YWxpZGF0b3JzIHRoYXQgbG9zdCBhIHBhc3Qgc2Vzc2lvbiBkaXNwdXRlIGFuZCBuZWVkIHRvIGJlIHNsYXNoZWQuGQEgTk9URTogVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGF2YWlsYWJsZSBzaW5jZSBwYXJhY2hhaW4gaG9zdCB2ZXJzaW9uIDUuTGtleV9vd25lcnNoaXBfcHJvb2YEMHZhbGlkYXRvcl9pZPkBQQ8IzCBSZXR1cm5zIGEgbWVya2xlIHByb29mIG9mIGEgdmFsaWRhdG9yIHNlc3Npb24ga2V5LhkBIE5PVEU6IFRoaXMgZnVuY3Rpb24gaXMgb25seSBhdmFpbGFibGUgc2luY2UgcGFyYWNoYWluIGhvc3QgdmVyc2lvbiA1LmhzdWJtaXRfcmVwb3J0X2Rpc3B1dGVfbG9zdAg0ZGlzcHV0ZV9wcm9vZo0FTGtleV9vd25lcnNoaXBfcHJvb2ZFD0kPDCkBIFN1Ym1pdCBhbiB1bnNpZ25lZCBleHRyaW5zaWMgdG8gc2xhc2ggdmFsaWRhdG9ycyB3aG8gbG9zdCBhIGRpc3B1dGUgYWJvdXR8IGEgY2FuZGlkYXRlIG9mIGEgcGFzdCBzZXNzaW9uLhkBIE5PVEU6IFRoaXMgZnVuY3Rpb24gaXMgb25seSBhdmFpbGFibGUgc2luY2UgcGFyYWNoYWluIGhvc3QgdmVyc2lvbiA1LlRtaW5pbXVtX2JhY2tpbmdfdm90ZXMAEAgNASBHZXQgdGhlIG1pbmltdW0gbnVtYmVyIG9mIGJhY2tpbmcgdm90ZXMgZm9yIGEgcGFyYWNoYWluIGNhbmRpZGF0ZS70IFRoaXMgaXMgYSBzdGFnaW5nIG1ldGhvZCEgRG8gbm90IHVzZSBvbiBwcm9kdWN0aW9uIHJ1bnRpbWVzIUhwYXJhX2JhY2tpbmdfc3RhdGUEBF9pAk0PBOQgUmV0dXJucyB0aGUgc3RhdGUgb2YgcGFyYWNoYWluIGJhY2tpbmcgZm9yIGEgZ2l2ZW4gcGFyYS5QYXN5bmNfYmFja2luZ19wYXJhbXMAvQQEYQEgUmV0dXJucyBjYW5kaWRhdGUncyBhY2NlcHRhbmNlIGxpbWl0YXRpb25zIGZvciBhc3luY2hyb25vdXMgYmFja2luZyBmb3IgYSByZWxheSBwYXJlbnQuTGRpc2FibGVkX3ZhbGlkYXRvcnMAPQwE+CBSZXR1cm5zIGEgbGlzdCBvZiBhbGwgZGlzYWJsZWQgdmFsaWRhdG9ycyBhdCB0aGUgZ2l2ZW4gYmxvY2suNG5vZGVfZmVhdHVyZXMA+QQITCBHZXQgbm9kZSBmZWF0dXJlcy70IFRoaXMgaXMgYSBzdGFnaW5nIG1ldGhvZCEgRG8gbm90IHVzZSBvbiBwcm9kdWN0aW9uIHJ1bnRpbWVzIVhhcHByb3ZhbF92b3RpbmdfcGFyYW1zANUEBKQgQXBwcm92YWwgdm90aW5nIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyxjbGFpbV9xdWV1ZQB9DwQwIENsYWltIHF1ZXVlfGNhbmRpZGF0ZXNfcGVuZGluZ19hdmFpbGFiaWxpdHkEHHBhcmFfaWRpAokPBGAgRWxhc3RpYyBzY2FsaW5nIHN1cHBvcnQE3CBUaGUgQVBJIGZvciBxdWVyeWluZyB0aGUgc3RhdGUgb2YgcGFyYWNoYWlucyBvbi1jaGFpbi4gQmVlZnlBcGkQNGJlZWZ5X2dlbmVzaXMAPQIEBQEgUmV0dXJuIHRoZSBibG9jayBudW1iZXIgd2hlcmUgQkVFRlkgY29uc2Vuc3VzIGlzIGVuYWJsZWQvc3RhcnRlZDR2YWxpZGF0b3Jfc2V0AI0PBLggUmV0dXJuIHRoZSBjdXJyZW50IGFjdGl2ZSBCRUVGWSB2YWxpZGF0b3Igc2V0tHN1Ym1pdF9yZXBvcnRfZXF1aXZvY2F0aW9uX3Vuc2lnbmVkX2V4dHJpbnNpYwhIZXF1aXZvY2F0aW9uX3Byb29mKQc8a2V5X293bmVyX3Byb29mlQ9JDyARASBTdWJtaXRzIGFuIHVuc2lnbmVkIGV4dHJpbnNpYyB0byByZXBvcnQgYW4gZXF1aXZvY2F0aW9uLiBUaGUgY2FsbGVy+CBtdXN0IHByb3ZpZGUgdGhlIGVxdWl2b2NhdGlvbiBwcm9vZiBhbmQgYSBrZXkgb3duZXJzaGlwIHByb29m/CAoc2hvdWxkIGJlIG9idGFpbmVkIHVzaW5nIGBnZW5lcmF0ZV9rZXlfb3duZXJzaGlwX3Byb29mYCkuIFRoZQUBIGV4dHJpbnNpYyB3aWxsIGJlIHVuc2lnbmVkIGFuZCBzaG91bGQgb25seSBiZSBhY2NlcHRlZCBmb3IgbG9jYWwVASBhdXRob3JzaGlwIChub3QgdG8gYmUgYnJvYWRjYXN0IHRvIHRoZSBuZXR3b3JrKS4gVGhpcyBtZXRob2QgcmV0dXJucwkBIGBOb25lYCB3aGVuIGNyZWF0aW9uIG9mIHRoZSBleHRyaW5zaWMgZmFpbHMsIGUuZy4gaWYgZXF1aXZvY2F0aW9uBQEgcmVwb3J0aW5nIGlzIGRpc2FibGVkIGZvciB0aGUgZ2l2ZW4gcnVudGltZSAoaS5lLiB0aGlzIG1ldGhvZCBpcwUBIGhhcmRjb2RlZCB0byByZXR1cm4gYE5vbmVgKS4gT25seSB1c2VmdWwgaW4gYW4gb2ZmY2hhaW4gY29udGV4dC5wZ2VuZXJhdGVfa2V5X293bmVyc2hpcF9wcm9vZggYc2V0X2lkMDBhdXRob3JpdHlfaWQFApkPLAkBIEdlbmVyYXRlcyBhIHByb29mIG9mIGtleSBvd25lcnNoaXAgZm9yIHRoZSBnaXZlbiBhdXRob3JpdHkgaW4gdGhl/CBnaXZlbiBzZXQuIEFuIGV4YW1wbGUgdXNhZ2Ugb2YgdGhpcyBtb2R1bGUgaXMgY291cGxlZCB3aXRoIHRoZQUBIHNlc3Npb24gaGlzdG9yaWNhbCBtb2R1bGUgdG8gcHJvdmUgdGhhdCBhIGdpdmVuIGF1dGhvcml0eSBrZXkgaXMNASB0aWVkIHRvIGEgZ2l2ZW4gc3Rha2luZyBpZGVudGl0eSBkdXJpbmcgYSBzcGVjaWZpYyBzZXNzaW9uLiBQcm9vZnMRASBvZiBrZXkgb3duZXJzaGlwIGFyZSBuZWNlc3NhcnkgZm9yIHN1Ym1pdHRpbmcgZXF1aXZvY2F0aW9uIHJlcG9ydHMuEQEgTk9URTogZXZlbiB0aG91Z2ggdGhlIEFQSSB0YWtlcyBhIGBzZXRfaWRgIGFzIHBhcmFtZXRlciB0aGUgY3VycmVudAkBIGltcGxlbWVudGF0aW9ucyBpZ25vcmVzIHRoaXMgcGFyYW1ldGVyIGFuZCBpbnN0ZWFkIHJlbGllcyBvbiB0aGlzDQEgbWV0aG9kIGJlaW5nIGNhbGxlZCBhdCB0aGUgY29ycmVjdCBibG9jayBoZWlnaHQsIGkuZS4gYW55IHBvaW50IGF0FQEgd2hpY2ggdGhlIGdpdmVuIHNldCBpZCBpcyBsaXZlIG9uLWNoYWluLiBGdXR1cmUgaW1wbGVtZW50YXRpb25zIHdpbGwNASBpbnN0ZWFkIHVzZSBpbmRleGVkIGRhdGEgdGhyb3VnaCBhbiBvZmZjaGFpbiB3b3JrZXIsIG5vdCByZXF1aXJpbmd4IG9sZGVyIHN0YXRlcyB0byBiZSBhdmFpbGFibGUuBIAgQVBJIG5lY2Vzc2FyeSBmb3IgQkVFRlkgdm90ZXJzLhhNbXJBcGkUIG1tcl9yb290AJ0PBIwgUmV0dXJuIHRoZSBvbi1jaGFpbiBNTVIgcm9vdCBoYXNoLjhtbXJfbGVhZl9jb3VudAClDwS4IFJldHVybiB0aGUgbnVtYmVyIG9mIE1NUiBibG9ja3MgaW4gdGhlIGNoYWluLjhnZW5lcmF0ZV9wcm9vZgg0YmxvY2tfbnVtYmVyc8EBXGJlc3Rfa25vd25fYmxvY2tfbnVtYmVyPQKpDwhpASBHZW5lcmF0ZSBNTVIgcHJvb2YgZm9yIGEgc2VyaWVzIG9mIGJsb2NrIG51bWJlcnMuIElmIGBiZXN0X2tub3duX2Jsb2NrX251bWJlciA9IFNvbWUobilgLEUBIHVzZSBoaXN0b3JpY2FsIE1NUiBzdGF0ZSBhdCBnaXZlbiBibG9jayBoZWlnaHQgYG5gLiBFbHNlLCB1c2UgY3VycmVudCBNTVIgc3RhdGUuMHZlcmlmeV9wcm9vZggYbGVhdmVzsQ8UcHJvb2a5D70PFPQgVmVyaWZ5IE1NUiBwcm9vZiBhZ2FpbnN0IG9uLWNoYWluIE1NUiBmb3IgYSBiYXRjaCBvZiBsZWF2ZXMuAHEBIE5vdGUgdGhpcyBmdW5jdGlvbiB3aWxsIHVzZSBvbi1jaGFpbiBNTVIgcm9vdCBoYXNoIGFuZCBjaGVjayBpZiB0aGUgcHJvb2YgbWF0Y2hlcyB0aGUgaGFzaC5tASBOb3RlLCB0aGUgbGVhdmVzIHNob3VsZCBiZSBzb3J0ZWQgc3VjaCB0aGF0IGNvcnJlc3BvbmRpbmcgbGVhdmVzIGFuZCBsZWFmIGluZGljZXMgaGF2ZSB0aGWVASBzYW1lIHBvc2l0aW9uIGluIGJvdGggdGhlIGBsZWF2ZXNgIHZlY3RvciBhbmQgdGhlIGBsZWFmX2luZGljZXNgIHZlY3RvciBjb250YWluZWQgaW4gdGhlIFtMZWFmUHJvb2ZdWHZlcmlmeV9wcm9vZl9zdGF0ZWxlc3MMEHJvb3Q0GGxlYXZlc7EPFHByb29muQ+9DxwBASBWZXJpZnkgTU1SIHByb29mIGFnYWluc3QgZ2l2ZW4gcm9vdCBoYXNoIGZvciBhIGJhdGNoIG9mIGxlYXZlcy4A/CBOb3RlIHRoaXMgZnVuY3Rpb24gZG9lcyBub3QgcmVxdWlyZSBhbnkgb24tY2hhaW4gc3RvcmFnZSAtIHRoZbwgcHJvb2YgaXMgdmVyaWZpZWQgYWdhaW5zdCBnaXZlbiBNTVIgcm9vdCBoYXNoLgBtASBOb3RlLCB0aGUgbGVhdmVzIHNob3VsZCBiZSBzb3J0ZWQgc3VjaCB0aGF0IGNvcnJlc3BvbmRpbmcgbGVhdmVzIGFuZCBsZWFmIGluZGljZXMgaGF2ZSB0aGWVASBzYW1lIHBvc2l0aW9uIGluIGJvdGggdGhlIGBsZWF2ZXNgIHZlY3RvciBhbmQgdGhlIGBsZWFmX2luZGljZXNgIHZlY3RvciBjb250YWluZWQgaW4gdGhlIFtMZWFmUHJvb2ZdBIQgQVBJIHRvIGludGVyYWN0IHdpdGggTU1SIHBhbGxldC4sQmVlZnlNbXJBcGkITGF1dGhvcml0eV9zZXRfcHJvb2YATQ4E3CBSZXR1cm4gdGhlIGN1cnJlbnRseSBhY3RpdmUgQkVFRlkgYXV0aG9yaXR5IHNldCBwcm9vZi5gbmV4dF9hdXRob3JpdHlfc2V0X3Byb29mAE0OBMggUmV0dXJuIHRoZSBuZXh0L3F1ZXVlZCBCRUVGWSBhdXRob3JpdHkgc2V0IHByb29mLgSQIEFQSSB1c2VmdWwgZm9yIEJFRUZZIGxpZ2h0IGNsaWVudHMuKEdyYW5kcGFBcGkQTGdyYW5kcGFfYXV0aG9yaXRpZXMAtBg9ASBHZXQgdGhlIGN1cnJlbnQgR1JBTkRQQSBhdXRob3JpdGllcyBhbmQgd2VpZ2h0cy4gVGhpcyBzaG91bGQgbm90IGNoYW5nZSBleGNlcHQdASBmb3Igd2hlbiBjaGFuZ2VzIGFyZSBzY2hlZHVsZWQgYW5kIHRoZSBjb3JyZXNwb25kaW5nIGRlbGF5IGhhcyBwYXNzZWQuADUBIFdoZW4gY2FsbGVkIGF0IGJsb2NrIEIsIGl0IHdpbGwgcmV0dXJuIHRoZSBzZXQgb2YgYXV0aG9yaXRpZXMgdGhhdCBzaG91bGQgYmU9ASB1c2VkIHRvIGZpbmFsaXplIGRlc2NlbmRhbnRzIG9mIHRoaXMgYmxvY2sgKEIrMSwgQisyLCAuLi4pLiBUaGUgYmxvY2sgQiBpdHNlbGbAIGlzIGZpbmFsaXplZCBieSB0aGUgYXV0aG9yaXRpZXMgZnJvbSBibG9jayBCLTEutHN1Ym1pdF9yZXBvcnRfZXF1aXZvY2F0aW9uX3Vuc2lnbmVkX2V4dHJpbnNpYwhIZXF1aXZvY2F0aW9uX3Byb29mEQI8a2V5X293bmVyX3Byb29mlQ9JDyARASBTdWJtaXRzIGFuIHVuc2lnbmVkIGV4dHJpbnNpYyB0byByZXBvcnQgYW4gZXF1aXZvY2F0aW9uLiBUaGUgY2FsbGVy+CBtdXN0IHByb3ZpZGUgdGhlIGVxdWl2b2NhdGlvbiBwcm9vZiBhbmQgYSBrZXkgb3duZXJzaGlwIHByb29m/CAoc2hvdWxkIGJlIG9idGFpbmVkIHVzaW5nIGBnZW5lcmF0ZV9rZXlfb3duZXJzaGlwX3Byb29mYCkuIFRoZQUBIGV4dHJpbnNpYyB3aWxsIGJlIHVuc2lnbmVkIGFuZCBzaG91bGQgb25seSBiZSBhY2NlcHRlZCBmb3IgbG9jYWwVASBhdXRob3JzaGlwIChub3QgdG8gYmUgYnJvYWRjYXN0IHRvIHRoZSBuZXR3b3JrKS4gVGhpcyBtZXRob2QgcmV0dXJucwkBIGBOb25lYCB3aGVuIGNyZWF0aW9uIG9mIHRoZSBleHRyaW5zaWMgZmFpbHMsIGUuZy4gaWYgZXF1aXZvY2F0aW9uBQEgcmVwb3J0aW5nIGlzIGRpc2FibGVkIGZvciB0aGUgZ2l2ZW4gcnVudGltZSAoaS5lLiB0aGlzIG1ldGhvZCBpcwUBIGhhcmRjb2RlZCB0byByZXR1cm4gYE5vbmVgKS4gT25seSB1c2VmdWwgaW4gYW4gb2ZmY2hhaW4gY29udGV4dC5wZ2VuZXJhdGVfa2V5X293bmVyc2hpcF9wcm9vZggYc2V0X2lkMDBhdXRob3JpdHlfaWS8mQ8sCQEgR2VuZXJhdGVzIGEgcHJvb2Ygb2Yga2V5IG93bmVyc2hpcCBmb3IgdGhlIGdpdmVuIGF1dGhvcml0eSBpbiB0aGX8IGdpdmVuIHNldC4gQW4gZXhhbXBsZSB1c2FnZSBvZiB0aGlzIG1vZHVsZSBpcyBjb3VwbGVkIHdpdGggdGhlBQEgc2Vzc2lvbiBoaXN0b3JpY2FsIG1vZHVsZSB0byBwcm92ZSB0aGF0IGEgZ2l2ZW4gYXV0aG9yaXR5IGtleSBpcw0BIHRpZWQgdG8gYSBnaXZlbiBzdGFraW5nIGlkZW50aXR5IGR1cmluZyBhIHNwZWNpZmljIHNlc3Npb24uIFByb29mcxEBIG9mIGtleSBvd25lcnNoaXAgYXJlIG5lY2Vzc2FyeSBmb3Igc3VibWl0dGluZyBlcXVpdm9jYXRpb24gcmVwb3J0cy4RASBOT1RFOiBldmVuIHRob3VnaCB0aGUgQVBJIHRha2VzIGEgYHNldF9pZGAgYXMgcGFyYW1ldGVyIHRoZSBjdXJyZW50/CBpbXBsZW1lbnRhdGlvbnMgaWdub3JlIHRoaXMgcGFyYW1ldGVyIGFuZCBpbnN0ZWFkIHJlbHkgb24gdGhpcw0BIG1ldGhvZCBiZWluZyBjYWxsZWQgYXQgdGhlIGNvcnJlY3QgYmxvY2sgaGVpZ2h0LCBpLmUuIGFueSBwb2ludCBhdBUBIHdoaWNoIHRoZSBnaXZlbiBzZXQgaWQgaXMgbGl2ZSBvbi1jaGFpbi4gRnV0dXJlIGltcGxlbWVudGF0aW9ucyB3aWxsDQEgaW5zdGVhZCB1c2UgaW5kZXhlZCBkYXRhIHRocm91Z2ggYW4gb2ZmY2hhaW4gd29ya2VyLCBub3QgcmVxdWlyaW5neCBvbGRlciBzdGF0ZXMgdG8gYmUgYXZhaWxhYmxlLjhjdXJyZW50X3NldF9pZAAwBJggR2V0IGN1cnJlbnQgR1JBTkRQQSBhdXRob3JpdHkgc2V0IGlkLiQBASBBUElzIGZvciBpbnRlZ3JhdGluZyB0aGUgR1JBTkRQQSBmaW5hbGl0eSBnYWRnZXQgaW50byBydW50aW1lcy7AIFRoaXMgc2hvdWxkIGJlIGltcGxlbWVudGVkIG9uIHRoZSBydW50aW1lIHNpZGUuABUBIFRoaXMgaXMgcHJpbWFyaWx5IHVzZWQgZm9yIG5lZ290aWF0aW5nIGF1dGhvcml0eS1zZXQgY2hhbmdlcyBmb3IgdGhlDQEgZ2FkZ2V0LiBHUkFORFBBIHVzZXMgYSBzaWduYWxpbmcgbW9kZWwgb2YgY2hhbmdpbmcgYXV0aG9yaXR5IHNldHM6MQEgY2hhbmdlcyBzaG91bGQgYmUgc2lnbmFsZWQgd2l0aCBhIGRlbGF5IG9mIE4gYmxvY2tzLCBhbmQgdGhlbiBhdXRvbWF0aWNhbGx55CBhcHBsaWVkIGluIHRoZSBydW50aW1lIGFmdGVyIHRob3NlIE4gYmxvY2tzIGhhdmUgcGFzc2VkLgD8IFRoZSBjb25zZW5zdXMgcHJvdG9jb2wgd2lsbCBjb29yZGluYXRlIHRoZSBoYW5kb2ZmIGV4dGVybmFsbHkuHEJhYmVBcGkYNGNvbmZpZ3VyYXRpb24AwQ8EjCBSZXR1cm4gdGhlIGNvbmZpZ3VyYXRpb24gZm9yIEJBQkUuTGN1cnJlbnRfZXBvY2hfc3RhcnQAgQEExCBSZXR1cm5zIHRoZSBzbG90IHRoYXQgc3RhcnRlZCB0aGUgY3VycmVudCBlcG9jaC40Y3VycmVudF9lcG9jaADFDwTEIFJldHVybnMgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoZSBjdXJyZW50IGVwb2NoLihuZXh0X2Vwb2NoAMUPCAEBIFJldHVybnMgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoZSBuZXh0IGVwb2NoICh3aGljaCB3YXMgYWxyZWFkeVwgcHJldmlvdXNseSBhbm5vdW5jZWQpLnBnZW5lcmF0ZV9rZXlfb3duZXJzaGlwX3Byb29mCBBzbG90gQEwYXV0aG9yaXR5X2lkfQHJDywJASBHZW5lcmF0ZXMgYSBwcm9vZiBvZiBrZXkgb3duZXJzaGlwIGZvciB0aGUgZ2l2ZW4gYXV0aG9yaXR5IGluIHRoZQ0BIGN1cnJlbnQgZXBvY2guIEFuIGV4YW1wbGUgdXNhZ2Ugb2YgdGhpcyBtb2R1bGUgaXMgY291cGxlZCB3aXRoIHRoZQUBIHNlc3Npb24gaGlzdG9yaWNhbCBtb2R1bGUgdG8gcHJvdmUgdGhhdCBhIGdpdmVuIGF1dGhvcml0eSBrZXkgaXMNASB0aWVkIHRvIGEgZ2l2ZW4gc3Rha2luZyBpZGVudGl0eSBkdXJpbmcgYSBzcGVjaWZpYyBzZXNzaW9uLiBQcm9vZnMRASBvZiBrZXkgb3duZXJzaGlwIGFyZSBuZWNlc3NhcnkgZm9yIHN1Ym1pdHRpbmcgZXF1aXZvY2F0aW9uIHJlcG9ydHMuCQEgTk9URTogZXZlbiB0aG91Z2ggdGhlIEFQSSB0YWtlcyBhIGBzbG90YCBhcyBwYXJhbWV0ZXIgdGhlIGN1cnJlbnQJASBpbXBsZW1lbnRhdGlvbnMgaWdub3JlcyB0aGlzIHBhcmFtZXRlciBhbmQgaW5zdGVhZCByZWxpZXMgb24gdGhpcw0BIG1ldGhvZCBiZWluZyBjYWxsZWQgYXQgdGhlIGNvcnJlY3QgYmxvY2sgaGVpZ2h0LCBpLmUuIGFueSBwb2ludCBhdPAgd2hpY2ggdGhlIGVwb2NoIGZvciB0aGUgZ2l2ZW4gc2xvdCBpcyBsaXZlIG9uLWNoYWluLiBGdXR1cmUJASBpbXBsZW1lbnRhdGlvbnMgd2lsbCBpbnN0ZWFkIHVzZSBpbmRleGVkIGRhdGEgdGhyb3VnaCBhbiBvZmZjaGFpbtAgd29ya2VyLCBub3QgcmVxdWlyaW5nIG9sZGVyIHN0YXRlcyB0byBiZSBhdmFpbGFibGUutHN1Ym1pdF9yZXBvcnRfZXF1aXZvY2F0aW9uX3Vuc2lnbmVkX2V4dHJpbnNpYwhIZXF1aXZvY2F0aW9uX3Byb29mdQE8a2V5X293bmVyX3Byb29mzQ9JDyARASBTdWJtaXRzIGFuIHVuc2lnbmVkIGV4dHJpbnNpYyB0byByZXBvcnQgYW4gZXF1aXZvY2F0aW9uLiBUaGUgY2FsbGVy+CBtdXN0IHByb3ZpZGUgdGhlIGVxdWl2b2NhdGlvbiBwcm9vZiBhbmQgYSBrZXkgb3duZXJzaGlwIHByb29m/CAoc2hvdWxkIGJlIG9idGFpbmVkIHVzaW5nIGBnZW5lcmF0ZV9rZXlfb3duZXJzaGlwX3Byb29mYCkuIFRoZQUBIGV4dHJpbnNpYyB3aWxsIGJlIHVuc2lnbmVkIGFuZCBzaG91bGQgb25seSBiZSBhY2NlcHRlZCBmb3IgbG9jYWwVASBhdXRob3JzaGlwIChub3QgdG8gYmUgYnJvYWRjYXN0IHRvIHRoZSBuZXR3b3JrKS4gVGhpcyBtZXRob2QgcmV0dXJucwkBIGBOb25lYCB3aGVuIGNyZWF0aW9uIG9mIHRoZSBleHRyaW5zaWMgZmFpbHMsIGUuZy4gaWYgZXF1aXZvY2F0aW9uBQEgcmVwb3J0aW5nIGlzIGRpc2FibGVkIGZvciB0aGUgZ2l2ZW4gcnVudGltZSAoaS5lLiB0aGlzIG1ldGhvZCBpcwUBIGhhcmRjb2RlZCB0byByZXR1cm4gYE5vbmVgKS4gT25seSB1c2VmdWwgaW4gYW4gb2ZmY2hhaW4gY29udGV4dC4EuCBBUEkgbmVjZXNzYXJ5IGZvciBibG9jayBhdXRob3JzaGlwIHdpdGggQkFCRS5UQXV0aG9yaXR5RGlzY292ZXJ5QXBpBCxhdXRob3JpdGllcwCpCQQZASBSZXRyaWV2ZSBhdXRob3JpdHkgaWRlbnRpZmllcnMgb2YgdGhlIGN1cnJlbnQgYW5kIG5leHQgYXV0aG9yaXR5IHNldC4QdCBUaGUgYXV0aG9yaXR5IGRpc2NvdmVyeSBhcGkuAFEBIFRoaXMgYXBpIGlzIHVzZWQgYnkgdGhlIGBjbGllbnQvYXV0aG9yaXR5LWRpc2NvdmVyeWAgbW9kdWxlIHRvIHJldHJpZXZlIGlkZW50aWZpZXJznCBvZiB0aGUgY3VycmVudCBhbmQgbmV4dCBhdXRob3JpdHkgc2V0LixTZXNzaW9uS2V5cwhUZ2VuZXJhdGVfc2Vzc2lvbl9rZXlzBBBzZWVk+Q04HBUBIEdlbmVyYXRlIGEgc2V0IG9mIHNlc3Npb24ga2V5cyB3aXRoIG9wdGlvbmFsbHkgdXNpbmcgdGhlIGdpdmVuIHNlZWQuCQEgVGhlIGtleXMgc2hvdWxkIGJlIHN0b3JlZCB3aXRoaW4gdGhlIGtleXN0b3JlIGV4cG9zZWQgdmlhIHJ1bnRpbWU8IGV4dGVybmFsaXRpZXMuALAgVGhlIHNlZWQgbmVlZHMgdG8gYmUgYSB2YWxpZCBgdXRmOGAgc3RyaW5nLgDQIFJldHVybnMgdGhlIGNvbmNhdGVuYXRlZCBTQ0FMRSBlbmNvZGVkIHB1YmxpYyBrZXlzLkxkZWNvZGVfc2Vzc2lvbl9rZXlzBBxlbmNvZGVkONEPDJggRGVjb2RlIHRoZSBnaXZlbiBwdWJsaWMgc2Vzc2lvbiBrZXlzLgDcIFJldHVybnMgdGhlIGxpc3Qgb2YgcHVibGljIHJhdyBwdWJsaWMga2V5cyArIGtleSB0eXBlLgRoIFNlc3Npb24ga2V5cyBydW50aW1lIGFwaS48QWNjb3VudE5vbmNlQXBpBDRhY2NvdW50X25vbmNlBBxhY2NvdW50ABAEwCBHZXQgY3VycmVudCBhY2NvdW50IG5vbmNlIG9mIGdpdmVuIGBBY2NvdW50SWRgLgSAIFRoZSBBUEkgdG8gcXVlcnkgYWNjb3VudCBub25jZS5UVHJhbnNhY3Rpb25QYXltZW50QXBpEChxdWVyeV9pbmZvCAx1eHSRDgxsZW4Q3Q8ARHF1ZXJ5X2ZlZV9kZXRhaWxzCAx1eHSRDgxsZW4Q4Q8ATHF1ZXJ5X3dlaWdodF90b19mZWUEGHdlaWdodCgYAExxdWVyeV9sZW5ndGhfdG9fZmVlBBhsZW5ndGgQGAAAZFRyYW5zYWN0aW9uUGF5bWVudENhbGxBcGkQPHF1ZXJ5X2NhbGxfaW5mbwgQY2FsbF0BDGxlbhDdDwRJASBRdWVyeSBpbmZvcm1hdGlvbiBvZiBhIGRpc3BhdGNoIGNsYXNzLCB3ZWlnaHQsIGFuZCBmZWUgb2YgYSBnaXZlbiBlbmNvZGVkIGBDYWxsYC5YcXVlcnlfY2FsbF9mZWVfZGV0YWlscwgQY2FsbF0BDGxlbhDhDwS0IFF1ZXJ5IGZlZSBkZXRhaWxzIG9mIGEgZ2l2ZW4gZW5jb2RlZCBgQ2FsbGAuTHF1ZXJ5X3dlaWdodF90b19mZWUEGHdlaWdodCgYBAEBIFF1ZXJ5IHRoZSBvdXRwdXQgb2YgdGhlIGN1cnJlbnQgYFdlaWdodFRvRmVlYCBnaXZlbiBzb21lIGlucHV0LkxxdWVyeV9sZW5ndGhfdG9fZmVlBBhsZW5ndGgQGAQBASBRdWVyeSB0aGUgb3V0cHV0IG9mIHRoZSBjdXJyZW50IGBMZW5ndGhUb0ZlZWAgZ2l2ZW4gc29tZSBpbnB1dC4ANFhjbVBheW1lbnRBcGkQfHF1ZXJ5X2FjY2VwdGFibGVfcGF5bWVudF9hc3NldHMELHhjbV92ZXJzaW9uEO0PFLQgUmV0dXJucyBhIGxpc3Qgb2YgYWNjZXB0YWJsZSBwYXltZW50IGFzc2V0cy4AMCAjIEFyZ3VtZW50cwBoICogYHhjbV92ZXJzaW9uYDogVmVyc2lvbi5AcXVlcnlfeGNtX3dlaWdodAQcbWVzc2FnZdkF+Q8UqCBSZXR1cm5zIGEgd2VpZ2h0IG5lZWRlZCB0byBleGVjdXRlIGEgWENNLgAwICMgQXJndW1lbnRzAHQgKiBgbWVzc2FnZWA6IGBWZXJzaW9uZWRYY21gLmRxdWVyeV93ZWlnaHRfdG9fYXNzZXRfZmVlCBh3ZWlnaHQoFGFzc2V0DQf9DxjoIENvbnZlcnRzIGEgd2VpZ2h0IGludG8gYSBmZWUgZm9yIHRoZSBzcGVjaWZpZWQgYEFzc2V0SWRgLgAwICMgQXJndW1lbnRzAIggKiBgd2VpZ2h0YDogY29udmVydGlibGUgYFdlaWdodGAufCAqIGBhc3NldGA6IGBWZXJzaW9uZWRBc3NldElkYC5McXVlcnlfZGVsaXZlcnlfZmVlcwgsZGVzdGluYXRpb24tARxtZXNzYWdl2QUBECAdASBHZXQgZGVsaXZlcnkgZmVlcyBmb3Igc2VuZGluZyBhIHNwZWNpZmljIGBtZXNzYWdlYCB0byBhIGBkZXN0aW5hdGlvbmAu9CBUaGVzZSBhbHdheXMgY29tZSBpbiBhIHNwZWNpZmljIGFzc2V0LCBkZWZpbmVkIGJ5IHRoZSBjaGFpbi4AMCAjIEFyZ3VtZW50c4EBICogYG1lc3NhZ2VgOiBUaGUgbWVzc2FnZSB0aGF0J2xsIGJlIHNlbnQsIG5lY2Vzc2FyeSBiZWNhdXNlIG1vc3QgZGVsaXZlcnkgZmVlcyBhcmUgYmFzZWQgb24gdGhlXCAgIHNpemUgb2YgdGhlIG1lc3NhZ2UuYQEgKiBgZGVzdGluYXRpb25gOiBUaGUgZGVzdGluYXRpb24gdG8gc2VuZCB0aGUgbWVzc2FnZSB0by4gRGlmZmVyZW50IGRlc3RpbmF0aW9ucyBtYXkgdXNlwCAgIGRpZmZlcmVudCBzZW5kZXJzIHRoYXQgY2hhcmdlIGRpZmZlcmVudCBmZWVzLixwIEEgdHJhaXQgb2YgWENNIHBheW1lbnQgQVBJLgCoIEFQSSBwcm92aWRlcyBmdW5jdGlvbmFsaXR5IGZvciBvYnRhaW5pbmc6AMQgKiB0aGUgd2VpZ2h0IHJlcXVpcmVkIHRvIGV4ZWN1dGUgYW4gWENNIG1lc3NhZ2UsBQEgKiBhIGxpc3Qgb2YgYWNjZXB0YWJsZSBgQXNzZXRJZGBzIGZvciBtZXNzYWdlIGV4ZWN1dGlvbiBwYXltZW50LAEBICogdGhlIGNvc3Qgb2YgdGhlIHdlaWdodCBpbiB0aGUgc3BlY2lmaWVkIGFjY2VwdGFibGUgYEFzc2V0SWRgLqAgKiB0aGUgZmVlcyBmb3IgYW4gWENNIG1lc3NhZ2UgZGVsaXZlcnkuAPAgVG8gZGV0ZXJtaW5lIHRoZSBleGVjdXRpb24gd2VpZ2h0IG9mIHRoZSBjYWxscyByZXF1aXJlZCBmb3J1ASBbYHhjbTo6bGF0ZXN0OjpJbnN0cnVjdGlvbjo6VHJhbnNhY3RgXSBpbnN0cnVjdGlvbiwgYFRyYW5zYWN0aW9uUGF5bWVudENhbGxBcGlgIGNhbiBiZSB1c2VkLiREcnlSdW5BcGkIMGRyeV9ydW5fY2FsbAgYb3JpZ2luWQIQY2FsbF0BBRAEOCBEcnkgcnVuIGNhbGwuLGRyeV9ydW5feGNtCDxvcmlnaW5fbG9jYXRpb24tAQx4Y23dBiUQBFAgRHJ5IHJ1biBYQ00gcHJvZ3JhbSSxASBBUEkgZm9yIGRyeS1ydW5uaW5nIGV4dHJpbnNpY3MgYW5kIFhDTSBwcm9ncmFtcyB0byBnZXQgdGhlIHByb2dyYW1zIHRoYXQgbmVlZCB0byBiZSBwYXNzZWQgdG8gdGhlIGZlZXMgQVBJLgCBASBBbGwgY2FsbHMgcmV0dXJuIGEgdmVjdG9yIG9mIHR1cGxlcyAobG9jYXRpb24sIHhjbSkgd2hlcmUgZWFjaCAieGNtIiBpcyBleGVjdXRlZCBpbiAibG9jYXRpb24iLuQgSWYgdGhlcmUncyBsb2NhbCBleGVjdXRpb24sIHRoZSBsb2NhdGlvbiB3aWxsIGJlICJIZXJlIi4dASBUaGlzIHZlY3RvciBjYW4gYmUgdXNlZCB0byBjYWxjdWxhdGUgYm90aCBleGVjdXRpb24gYW5kIGRlbGl2ZXJ5IGZlZXMuAJkBIENhbGxzIG9yIFhDTXMgbWlnaHQgZmFpbCB3aGVuIGV4ZWN1dGVkLCB0aGlzIGRvZXNuJ3QgbWVhbiB0aGUgcmVzdWx0IG9mIHRoZXNlIGNhbGxzIHdpbGwgYmUgYW4gYEVycmAuZQEgSW4gdGhvc2UgY2FzZXMsIHRoZXJlIG1pZ2h0IHN0aWxsIGJlIGEgdmFsaWQgcmVzdWx0LCB3aXRoIHRoZSBleGVjdXRpb24gZXJyb3IgaW5zaWRlIGl0LmUBIFRoZSBvbmx5IHJlYXNvbnMgd2h5IHRoZXNlIGNhbGxzIG1pZ2h0IHJldHVybiBhbiBlcnJvciBhcmUgbGlzdGVkIGluIHRoZSBbYEVycm9yYF0gZW51bS5QTG9jYXRpb25Ub0FjY291bnRBcGkEQGNvbnZlcnRfbG9jYXRpb24EIGxvY2F0aW9uLQEtEASQIENvbnZlcnRzIGBMb2NhdGlvbmAgdG8gYEFjY291bnRJZGAuBA0BIEFQSSBmb3IgdXNlZnVsIGNvbnZlcnNpb25zIGJldHdlZW4gWENNIGBMb2NhdGlvbmAgYW5kIGBBY2NvdW50SWRgLkhOb21pbmF0aW9uUG9vbHNBcGkcPHBlbmRpbmdfcmV3YXJkcwQMd2hvABgENQEgUmV0dXJucyB0aGUgcGVuZGluZyByZXdhcmRzIGZvciB0aGUgbWVtYmVyIHRoYXQgdGhlIEFjY291bnRJZCB3YXMgZ2l2ZW4gZm9yLkRwb2ludHNfdG9fYmFsYW5jZQgccG9vbF9pZBAYcG9pbnRzGBgE9CBSZXR1cm5zIHRoZSBlcXVpdmFsZW50IGJhbGFuY2Ugb2YgYHBvaW50c2AgZm9yIGEgZ2l2ZW4gcG9vbC5EYmFsYW5jZV90b19wb2ludHMIHHBvb2xfaWQQJG5ld19mdW5kcxgYBPwgUmV0dXJucyB0aGUgZXF1aXZhbGVudCBwb2ludHMgb2YgYG5ld19mdW5kc2AgZm9yIGEgZ2l2ZW4gcG9vbC5IcG9vbF9wZW5kaW5nX3NsYXNoBBxwb29sX2lkEBgEsCBSZXR1cm5zIHRoZSBwZW5kaW5nIHNsYXNoIGZvciBhIGdpdmVuIHBvb2wuUG1lbWJlcl9wZW5kaW5nX3NsYXNoBBhtZW1iZXIAGATMIFJldHVybnMgdGhlIHBlbmRpbmcgc2xhc2ggZm9yIGEgZ2l2ZW4gcG9vbCBtZW1iZXIudHBvb2xfbmVlZHNfZGVsZWdhdGVfbWlncmF0aW9uBBxwb29sX2lkECAg5CBSZXR1cm5zIHRydWUgaWYgdGhlIHBvb2wgd2l0aCBgcG9vbF9pZGAgbmVlZHMgbWlncmF0aW9uLgBJASBUaGlzIGNhbiBoYXBwZW4gd2hlbiB0aGUgYHBhbGxldC1ub21pbmF0aW9uLXBvb2xzYCBoYXMgc3dpdGNoZWQgdG8gdXNpbmcgc3RyYXRlZ3lBASBbYERlbGVnYXRlU3Rha2VgXShwYWxsZXRfbm9taW5hdGlvbl9wb29sczo6YWRhcHRlcjo6RGVsZWdhdGVTdGFrZSkgYnV0IHRoZSBwb29s6CBzdGlsbCBoYXMgZnVuZHMgdGhhdCB3ZXJlIHN0YWtlZCB1c2luZyB0aGUgb2xkZXIgc3RyYXRlZ3kZASBbVHJhbnNmZXJTdGFrZV0ocGFsbGV0X25vbWluYXRpb25fcG9vbHM6OmFkYXB0ZXI6OlRyYW5zZmVyU3Rha2UpLiBVc2WJASBbYG1pZ3JhdGVfcG9vbF90b19kZWxlZ2F0ZV9zdGFrZWBdKHBhbGxldF9ub21pbmF0aW9uX3Bvb2xzOjpDYWxsOjptaWdyYXRlX3Bvb2xfdG9fZGVsZWdhdGVfc3Rha2UpVCB0byBtaWdyYXRlIHRoZSBwb29sLnxtZW1iZXJfbmVlZHNfZGVsZWdhdGVfbWlncmF0aW9uBBhtZW1iZXIAIBwpASBSZXR1cm5zIHRydWUgaWYgdGhlIGRlbGVnYXRlZCBmdW5kcyBvZiB0aGUgcG9vbCBgbWVtYmVyYCBuZWVkcyBtaWdyYXRpb24uANggT25jZSBhIHBvb2wgaGFzIHN1Y2Nlc3NmdWxseSBtaWdyYXRlZCB0byB0aGUgc3RyYXRlZ3lVASBbYERlbGVnYXRlU3Rha2VgXShwYWxsZXRfbm9taW5hdGlvbl9wb29sczo6YWRhcHRlcjo6RGVsZWdhdGVTdGFrZSksIHRoZSBmdW5kcyBvZiB0aGUZASBtZW1iZXIgY2FuIGJlIG1pZ3JhdGVkIGZyb20gcG9vbCBhY2NvdW50IHRvIHRoZSBtZW1iZXIncyBhY2NvdW50LiBVc2UpASBbYG1pZ3JhdGVfZGVsZWdhdGlvbmBdKHBhbGxldF9ub21pbmF0aW9uX3Bvb2xzOjpDYWxsOjptaWdyYXRlX2RlbGVnYXRpb24ppCB0byBtaWdyYXRlIHRoZSBmdW5kcyBvZiB0aGUgcG9vbCBtZW1iZXIuBPggUnVudGltZSBhcGkgZm9yIGFjY2Vzc2luZyBpbmZvcm1hdGlvbiBhYm91dCBub21pbmF0aW9uIHBvb2xzLihTdGFraW5nQXBpDERub21pbmF0aW9uc19xdW90YQQcYmFsYW5jZRgQBBEBIFJldHVybnMgdGhlIG5vbWluYXRpb25zIHF1b3RhIGZvciBhIG5vbWluYXRvciB3aXRoIGEgZ2l2ZW4gYmFsYW5jZS5cZXJhc19zdGFrZXJzX3BhZ2VfY291bnQIDGVyYRAcYWNjb3VudAAQBDkBIFJldHVybnMgdGhlIHBhZ2UgY291bnQgb2YgZXhwb3N1cmVzIGZvciBhIHZhbGlkYXRvciBgYWNjb3VudGAgaW4gYSBnaXZlbiBlcmEuPHBlbmRpbmdfcmV3YXJkcwgMZXJhEBxhY2NvdW50ACAEPQEgUmV0dXJucyB0cnVlIGlmIHZhbGlkYXRvciBgYWNjb3VudGAgaGFzIHBhZ2VzIHRvIGJlIGNsYWltZWQgZm9yIHRoZSBnaXZlbiBlcmEuADhHZW5lc2lzQnVpbGRlcgwsYnVpbGRfc3RhdGUEEGpzb244NRAkZQEgQnVpbGQgYFJ1bnRpbWVHZW5lc2lzQ29uZmlnYCBmcm9tIGEgSlNPTiBibG9iIG5vdCB1c2luZyBhbnkgZGVmYXVsdHMgYW5kIHN0b3JlIGl0IGluIHRoZSQgc3RvcmFnZS4A+QEgSW4gdGhlIGNhc2Ugb2YgYSBGUkFNRS1iYXNlZCBydW50aW1lLCB0aGlzIGZ1bmN0aW9uIGRlc2VyaWFsaXplcyB0aGUgZnVsbCBgUnVudGltZUdlbmVzaXNDb25maWdgIGZyb20gdGhlIGdpdmVuIEpTT04gYmxvYiBhbmRZASBwdXRzIGl0IGludG8gdGhlIHN0b3JhZ2UuIElmIHRoZSBwcm92aWRlZCBKU09OIGJsb2IgaXMgaW5jb3JyZWN0IG9yIGluY29tcGxldGUgb3IgdGhltCBkZXNlcmlhbGl6YXRpb24gZmFpbHMsIGFuIGVycm9yIGlzIHJldHVybmVkLgBdASBQbGVhc2Ugbm90ZSB0aGF0IHByb3ZpZGVkIEpTT04gYmxvYiBtdXN0IGNvbnRhaW4gYWxsIGBSdW50aW1lR2VuZXNpc0NvbmZpZ2AgZmllbGRzLCBub1wgZGVmYXVsdHMgd2lsbCBiZSB1c2VkLihnZXRfcHJlc2V0BAhpZDkQ+Q04YQEgUmV0dXJucyBhIEpTT04gYmxvYiByZXByZXNlbnRhdGlvbiBvZiB0aGUgYnVpbHQtaW4gYFJ1bnRpbWVHZW5lc2lzQ29uZmlnYCBpZGVudGlmaWVkIGJ5GCBgaWRgLgA9ASBJZiBgaWRgIGlzIGBOb25lYCB0aGUgZnVuY3Rpb24gcmV0dXJucyBKU09OIGJsb2IgcmVwcmVzZW50YXRpb24gb2YgdGhlIGRlZmF1bHRJASBgUnVudGltZUdlbmVzaXNDb25maWdgIHN0cnVjdCBvZiB0aGUgcnVudGltZS4gSW1wbGVtZW50YXRpb24gbXVzdCBwcm92aWRlIGRlZmF1bHRgIGBSdW50aW1lR2VuZXNpc0NvbmZpZ2AuACEBIE90aGVyd2lzZSBmdW5jdGlvbiByZXR1cm5zIGEgSlNPTiByZXByZXNlbnRhdGlvbiBvZiB0aGUgYnVpbHQtaW4sIG5hbWVkUQEgYFJ1bnRpbWVHZW5lc2lzQ29uZmlnYCBwcmVzZXQgaWRlbnRpZmllZCBieSBgaWRgLCBvciBgTm9uZWAgaWYgc3VjaCBwcmVzZXQgZG9lcyBub3RlASBleGlzdHMuIFJldHVybmVkIGBWZWM8dTg+YCBjb250YWlucyBieXRlcyBvZiBKU09OIGJsb2IgKHBhdGNoKSB3aGljaCBjb21wcmlzZXMgYSBsaXN0IG9mTQEgKHBvdGVudGlhbGx5IG5lc3RlZCkga2V5LXZhbHVlIHBhaXJzIHRoYXQgYXJlIGludGVuZGVkIGZvciBjdXN0b21pemluZyB0aGUgZGVmYXVsdGUBIHJ1bnRpbWUgZ2VuZXNpcyBjb25maWcuIFRoZSBwYXRjaCBzaGFsbCBiZSBtZXJnZWQgKHJmYzczODYpIHdpdGggdGhlIEpTT04gcmVwcmVzZW50YXRpb25hASBvZiB0aGUgZGVmYXVsdCBgUnVudGltZUdlbmVzaXNDb25maWdgIHRvIGNyZWF0ZSBhIGNvbXByZWhlbnNpdmUgZ2VuZXNpcyBjb25maWcgdGhhdCBjYW6EIGJlIHVzZWQgaW4gYGJ1aWxkX3N0YXRlYCBtZXRob2QuMHByZXNldF9uYW1lcwA9EBBRASBSZXR1cm5zIGEgbGlzdCBvZiBpZGVudGlmaWVycyBmb3IgYXZhaWxhYmxlIGJ1aWx0aW4gYFJ1bnRpbWVHZW5lc2lzQ29uZmlnYCBwcmVzZXRzLgBhASBUaGUgcHJlc2V0cyBmcm9tIHRoZSBsaXN0IGNhbiBiZSBxdWVyaWVkIHdpdGggW2BHZW5lc2lzQnVpbGRlcjo6Z2V0X3ByZXNldGBdIG1ldGhvZC4gSWYBASBubyBuYW1lZCBwcmVzZXRzIGFyZSBwcm92aWRlZCBieSB0aGUgcnVudGltZSB0aGUgbGlzdCBpcyBlbXB0eS4E6CBBUEkgdG8gaW50ZXJhY3Qgd2l0aCBSdW50aW1lR2VuZXNpc0NvbmZpZyBmb3IgdGhlIHJ1bnRpbWVdAVRBEAA="; +var ksm_metadata_default = binMeta; +export { + ksm_metadata_default as default +}; diff --git a/examples/with-vite-papi/.papi/descriptors/dist/ksm_metadata.d.ts b/examples/with-vite-papi/.papi/descriptors/dist/ksm_metadata.d.ts new file mode 100644 index 0000000..e54c947 --- /dev/null +++ b/examples/with-vite-papi/.papi/descriptors/dist/ksm_metadata.d.ts @@ -0,0 +1,2 @@ +declare const binMeta: string; +export default binMeta; diff --git a/examples/with-vite-papi/.papi/descriptors/dist/metadataTypes-HHY2W24Z.mjs b/examples/with-vite-papi/.papi/descriptors/dist/metadataTypes-HHY2W24Z.mjs new file mode 100644 index 0000000..89a94a3 --- /dev/null +++ b/examples/with-vite-papi/.papi/descriptors/dist/metadataTypes-HHY2W24Z.mjs @@ -0,0 +1,6 @@ +// .papi/descriptors/src/metadataTypes.ts +var content = "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CBRzdGFzaABIbnVtX3NsYXNoaW5nX3NwYW5zBAEBBQEACAxlcmEENHNsYXNoX2luZGljZXM5AgEBBQEACDx2YWxpZGF0b3Jfc3Rhc2gADGVyYQQBAQUBAAQMd2hv6QMBAQUBABxIbWluX25vbWluYXRvcl9ib25k7QNIbWluX3ZhbGlkYXRvcl9ib25k7QNMbWF4X25vbWluYXRvcl9jb3VudPEDTG1heF92YWxpZGF0b3JfY291bnTxAzxjaGlsbF90aHJlc2hvbGTxAzhtaW5fY29tbWlzc2lvbvEDSG1heF9zdGFrZWRfcmV3YXJkc/EDAQEFAQAEFHN0YXNoAAEBBQEABDx2YWxpZGF0b3Jfc3Rhc2gAAQEFAQAMPHZhbGlkYXRvcl9zdGFzaAAMZXJhBBBwYWdlBAEBBQEABChjb250cm9sbGVyAAEBBQEABCxjb250cm9sbGVyc90DAQEFAQAQFHN0YXNoAEBtYXliZV9jb250cm9sbGVyBQIsbWF5YmVfdG90YWz1AzxtYXliZV91bmxvY2tpbmcBBAEBBQEBBQEADCRlcmFfaW5kZXgEQHZhbGlkYXRvcl9wYXlvdXQIJHJlbWFpbmRlcggBAQUBAAwUc3Rhc2gAEGRlc3Q1ARhhbW91bnQIAQEFAQAIGHN0YWtlcgAYYW1vdW50CAEBBQEADCR2YWxpZGF0b3IAIGZyYWN0aW9uBCRzbGFzaF9lcmEEAQEFAQAENHNlc3Npb25faW5kZXgEAQEFAQAIFHN0YXNoABhhbW91bnQIAQEFAQAIJG5vbWluYXRvcgAUc3Rhc2gAAQEFAQAEFHN0YXNoAAEBBQEACCRlcmFfaW5kZXgEPHZhbGlkYXRvcl9zdGFzaAABAQUBAAgUc3Rhc2gAFHByZWZzOQEBAQUBAAQQc2l6ZQQBAQUBAAQQbW9kZT0BAQEFAQAEIGZhaWx1cmVzBAAgAJkHAJ0HADkDAQEFAQAIEGtpbmRFASB0aW1lc2xvdCQABADtBgEBBQClBwAAAA0EAKkHAAABAAgQa2V5cw0EFHByb29mJAEBBQEBBQCtBwEBBQCxBwAIAAQBAAhIZXF1aXZvY2F0aW9uX3Byb29mJQQ8a2V5X293bmVyX3Byb29mvQMBAQUBAAgUZGVsYXkEbGJlc3RfZmluYWxpemVkX2Jsb2NrX251bWJlcgQBAQUBAQUBAAQ0YXV0aG9yaXR5X3NldFUBAQEFADkDAAQAtQcABAC9BwEBBQCRAgEACBhhbW91bnQILGJlbmVmaWNpYXJ51QMBAQUBAAQscHJvcG9zYWxfaWQEAQEFAQAQKGFzc2V0X2tpbmSBARhhbW91bnQILGJlbmVmaWNpYXJ5mQEodmFsaWRfZnJvbS0EAQEFAQEFAQAEQGJ1ZGdldF9yZW1haW5pbmcIAQEFAQAMOHByb3Bvc2FsX2luZGV4BBRhd2FyZAgcYWNjb3VudAABAQUBAAQsYnVybnRfZnVuZHMIAQEFAQAEQHJvbGxvdmVyX2JhbGFuY2UIAQEFAQAEFHZhbHVlCAEBBQEADDhwcm9wb3NhbF9pbmRleAQYYW1vdW50CCxiZW5lZmljaWFyeQABAQUBAAgscmVhY3RpdmF0ZWQILGRlYWN0aXZhdGVkCAEBBQEAGBRpbmRleAQoYXNzZXRfa2luZIEBGGFtb3VudAgsYmVuZWZpY2lhcnmZASh2YWxpZF9mcm9tBCRleHBpcmVfYXQEAQEFAQAIFGluZGV4BChwYXltZW50X2lkCAB1BwDVBwAAANkHAQAIKHBvbGxfaW5kZXgEEHZvdGU1BAEBBQEAEBRjbGFzcwQIdG/VAyhjb252aWN0aW9uOQQcYmFsYW5jZQgBAQUBAAQUY2xhc3MEAQEFAQAIFGNsYXNzBBh0YXJnZXTVAwEBBQEACBRjbGFzcy0EFGluZGV4BAEBBQEADBh0YXJnZXTVAxRjbGFzcwQUaW5kZXgEAQEFAQEFAQQAAQgBAQUAAAAEAPkHAAQA2QcBAQUACQgBAAw8cHJvcG9zYWxfb3JpZ2lulQMgcHJvcG9zYWylAUBlbmFjdG1lbnRfbW9tZW50QQQBAQUBAAQUdHJhY2sEAQEFAQAIFGluZGV4BChtYXliZV9oYXNoEQEBAQUBAQUBAAwUaW5kZXgEFHRyYWNrBCBwcm9wb3NhbKUBAQEFAQAMFGluZGV4BAx3aG8AGGFtb3VudAgBAQUBABAUaW5kZXgEFHRyYWNrBCBwcm9wb3NhbKUBFHRhbGx5qQEBAQUBAAgUaW5kZXgEFHRhbGx5qQEBAQUBAAgUaW5kZXgEEGhhc2ggACAAFQEBAAQkY2FsbF9oYXNoIAEBBQEADCRjYWxsX2hhc2ggQGNhbGxfZW5jb2RlZF9sZW4ETGNhbGxfd2VpZ2h0X3dpdG5lc3MYAQEFAQAEEGNhbGzdBgEBBQEBBQEABCRjYWxsX2hhc2ggAQEFAQAIJGNhbGxfaGFzaCAYcmVzdWx0vQEAyQEA0QEBAAQka2V5X3ZhbHVlVQQBAQUBAQUBAAwMa2V5yQEkb2xkX3ZhbHVl1QEkbmV3X3ZhbHVl1QEAZQEACABlAQBhBABlAQBpBAAAAGUBAQEFACQBAAgQZGVzdABIZXRoZXJldW1fc2lnbmF0dXJlXQQBAQUBABAMd2hvZQEUdmFsdWUIQHZlc3Rpbmdfc2NoZWR1bGVlBCRzdGF0ZW1lbnRtBAEBBQEADBBkZXN0AEhldGhlcmV1bV9zaWduYXR1cmVdBCRzdGF0ZW1lbnQkAQEFAQAEJHN0YXRlbWVudCQBAQUBAAwMb2xkZQEMbmV3ZQE4bWF5YmVfcHJlY2xhaW0FAgEBBQEBBQEADAx3aG8AQGV0aGVyZXVtX2FkZHJlc3NlARhhbW91bnQIAAAADQgBAQUAEQgBAAQYdGFyZ2V01QMBAQUBAAgYdGFyZ2V01QMgc2NoZWR1bGV1BAEBBQEADBhzb3VyY2XVAxh0YXJnZXTVAyBzY2hlZHVsZXUEAQEFAQAIPHNjaGVkdWxlMV9pbmRleAQ8c2NoZWR1bGUyX2luZGV4BAEBBQEACBh0YXJnZXTVAzhzY2hlZHVsZV9pbmRleAQBAQUBAQUBAAgcYWNjb3VudAAgdW52ZXN0ZWQIAQAEFGNhbGxzfQQBAQUBAAgUaW5kZXgEEGNhbGzdBgEBBQEACCRhc19vcmlnaW6VAxBjYWxs3QYBAQUBAAgQY2FsbN0GGHdlaWdodBgBAQUBAQUBAAgUaW5kZXgEFGVycm9yBQEBAQUBAAQUZXJyb3IFAQEBBQEABBhyZXN1bHQZAQAAAB0IAAAAKQgBAAwQcmVhbNUDQGZvcmNlX3Byb3h5X3R5cGWFBBBjYWxs3QYBAQUBAAwgZGVsZWdhdGXVAyhwcm94eV90eXBl6QEUZGVsYXkEAQEFAQAMKHByb3h5X3R5cGXpARRkZWxheQQUaW5kZXgEAQEFAQAUHHNwYXduZXLVAyhwcm94eV90eXBl6QEUaW5kZXgEGGhlaWdodAQkZXh0X2luZGV4BAEBBQEACBByZWFs1QMkY2FsbF9oYXNoIAEBBQEACCBkZWxlZ2F0ZdUDJGNhbGxfaGFzaCABAQUBABAgZGVsZWdhdGXVAxByZWFs1QNAZm9yY2VfcHJveHlfdHlwZYUEEGNhbGzdBgEBBQEBBQEAEBBwdXJlAAx3aG8AKHByb3h5X3R5cGXpAVBkaXNhbWJpZ3VhdGlvbl9pbmRleAQBAQUBAAwQcmVhbAAUcHJveHkAJGNhbGxfaGFzaCABAQUBABAkZGVsZWdhdG9yACRkZWxlZ2F0ZWUAKHByb3h5X3R5cGXpARRkZWxheQQALQgAMQgBAAhEb3RoZXJfc2lnbmF0b3JpZXPdAxBjYWxs3QYBAQUBABQkdGhyZXNob2xkBERvdGhlcl9zaWduYXRvcmllc90DPG1heWJlX3RpbWVwb2ludI0EEGNhbGzdBihtYXhfd2VpZ2h0GAEBBQEAFCR0aHJlc2hvbGQERG90aGVyX3NpZ25hdG9yaWVz3QM8bWF5YmVfdGltZXBvaW50jQQkY2FsbF9oYXNoIChtYXhfd2VpZ2h0GAEBBQEAECR0aHJlc2hvbGQERG90aGVyX3NpZ25hdG9yaWVz3QMkdGltZXBvaW508QEkY2FsbF9oYXNoIAEBBQEBBQEADCRhcHByb3ZpbmcAIG11bHRpc2lnACRjYWxsX2hhc2ggAQEFAQAQJGFwcHJvdmluZwAkdGltZXBvaW508QEgbXVsdGlzaWcAJGNhbGxfaGFzaCABAQUBABQkYXBwcm92aW5nACR0aW1lcG9pbnTxASBtdWx0aXNpZwAkY2FsbF9oYXNoIBhyZXN1bHQZAQEBBQEAEChjYW5jZWxsaW5nACR0aW1lcG9pbnTxASBtdWx0aXNpZwAkY2FsbF9oYXNoIAAEADkIAQEFAPUDAQAIFHZhbHVlCCxkZXNjcmlwdGlvbiQBAQUBAAQkYm91bnR5X2lkBAEBBQEADCRib3VudHlfaWQEHGN1cmF0b3LVAwxmZWUIAQEFAQAIJGJvdW50eV9pZAQsYmVuZWZpY2lhcnnVAwEBBQEACCRib3VudHlfaWQEGHJlbWFyayQBAQUBAQUBAAgUaW5kZXgEEGJvbmQIAQEFAQAIFGluZGV4BCxiZW5lZmljaWFyeQABAQUBAAwUaW5kZXgEGHBheW91dAgsYmVuZWZpY2lhcnkAAQEFAQAIJGJvdW50eV9pZAQcY3VyYXRvcgABAQUBAAQkYm91bnR5X2lkBAANAQBBCAEADEBwYXJlbnRfYm91bnR5X2lkBBR2YWx1ZQgsZGVzY3JpcHRpb24kAQEFAQAQQHBhcmVudF9ib3VudHlfaWQEPGNoaWxkX2JvdW50eV9pZAQcY3VyYXRvctUDDGZlZQgBAQUBAAhAcGFyZW50X2JvdW50eV9pZAQ8Y2hpbGRfYm91bnR5X2lkBAEBBQEADEBwYXJlbnRfYm91bnR5X2lkBDxjaGlsZF9ib3VudHlfaWQELGJlbmVmaWNpYXJ51QMBAQUBAQUBAAgUaW5kZXgELGNoaWxkX2luZGV4BAEBBQEADBRpbmRleAQsY2hpbGRfaW5kZXgELGJlbmVmaWNpYXJ5AAEBBQEAEBRpbmRleAQsY2hpbGRfaW5kZXgEGHBheW91dAgsYmVuZWZpY2lhcnkAAQEFABECAQEFAEUIAQEFAFEIAQEFAF0FAQEFAFkIAAQAXQgBAQUACQIBAAgwcmF3X3NvbHV0aW9uWQUcd2l0bmVzc10FAQEFAQAEQG1heWJlX25leHRfc2NvcmVhBQEBBQEABCBzdXBwb3J0c3UFAQEFAQAEMHJhd19zb2x1dGlvblkFAQEFAQAIQG1heWJlX21heF92b3RlcnMtBERtYXliZV9tYXhfdGFyZ2V0cy0EAQEFAQEFAQAMHGNvbXB1dGUBAhhvcmlnaW4FAjBwcmV2X2VqZWN0ZWQUAQEFAQAIHGNvbXB1dGUBAhRzY29yZQkCAQEFAQAIHGFjY291bnQAFHZhbHVlCAEBBQEADBBmcm9tEQIIdG8RAhRyb3VuZAQAAABhCAAIAGUIAQEFAGkIAQAEKGRpc2xvY2F0ZWTVAwEBBQEABBxsaWdodGVy1QMBAQUBAAgcaGVhdmllctUDHGxpZ2h0ZXLVAwEBBQEBBQEADAx3aG8AEGZyb20ICHRvCAEBBQEACAx3aG8AJG5ld19zY29yZQgBAQUAmAAAAG0IAAQAfQgABACBCAAEAJEIAAAABAAAAIkFAQAIGGFtb3VudAgccG9vbF9pZAQBAQUBAAQUZXh0cmGBBQEBBQEACDhtZW1iZXJfYWNjb3VudNUDQHVuYm9uZGluZ19wb2ludHMIAQEFAQAIHHBvb2xfaWQESG51bV9zbGFzaGluZ19zcGFucwQBAQUBAAg4bWVtYmVyX2FjY291bnTVA0hudW1fc2xhc2hpbmdfc3BhbnMEAQEFAQAQGGFtb3VudAgQcm9vdNUDJG5vbWluYXRvctUDHGJvdW5jZXLVAwEBBQEAFBhhbW91bnQIEHJvb3TVAyRub21pbmF0b3LVAxxib3VuY2Vy1QMccG9vbF9pZAQBAQUBAAgccG9vbF9pZAQodmFsaWRhdG9yc90DAQEFAQAIHHBvb2xfaWQEFHN0YXRlHQIBAQUBAAgccG9vbF9pZAQgbWV0YWRhdGEkAQEFAQAYNG1pbl9qb2luX2JvbmTtAzxtaW5fY3JlYXRlX2JvbmTtAyRtYXhfcG9vbHPxAyxtYXhfbWVtYmVyc/EDUG1heF9tZW1iZXJzX3Blcl9wb29s8QNUZ2xvYmFsX21heF9jb21taXNzaW9u8QMBAQUBABAccG9vbF9pZAQgbmV3X3Jvb3SFBTRuZXdfbm9taW5hdG9yhQUsbmV3X2JvdW5jZXKFBQEBBQEABBxwb29sX2lkBAEBBQEACBhtZW1iZXLVAxRleHRyYYEFAQEFAQAEKHBlcm1pc3Npb26JBQEBBQEABBRvdGhlcgABAQUBAAgccG9vbF9pZAQ4bmV3X2NvbW1pc3Npb24lAgEBBQEACBxwb29sX2lkBDhtYXhfY29tbWlzc2lvbgQBAQUBAAgccG9vbF9pZAQsY2hhbmdlX3JhdGUpAgEBBQEACBxwb29sX2lkBChwZXJtaXNzaW9uMQIBAQUBAAQ4bWVtYmVyX2FjY291bnTVAwEBBQEBBQEACCRkZXBvc2l0b3IAHHBvb2xfaWQEAQEFAQAQGG1lbWJlcgAccG9vbF9pZAQYYm9uZGVkCBhqb2luZWQUAQEFAQAMGG1lbWJlcgAccG9vbF9pZAQYcGF5b3V0CAEBBQEAFBhtZW1iZXIAHHBvb2xfaWQEHGJhbGFuY2UIGHBvaW50cwgMZXJhBAEBBQEAEBhtZW1iZXIAHHBvb2xfaWQEHGJhbGFuY2UIGHBvaW50cwgBAQUBAAQccG9vbF9pZAQBAQUBAAgccG9vbF9pZAQkbmV3X3N0YXRlHQIBAQUBAAgccG9vbF9pZAQYbWVtYmVyAAEBBQEADBByb290BQIcYm91bmNlcgUCJG5vbWluYXRvcgUCAQEFAQAIHHBvb2xfaWQEHGJhbGFuY2UIAQEFAQAMHHBvb2xfaWQEDGVyYQQcYmFsYW5jZQgBAQUBAAgccG9vbF9pZAQcY3VycmVudCUCAQEFAQAIHHBvb2xfaWQEOG1heF9jb21taXNzaW9uBAEBBQEACBxwb29sX2lkBCxjaGFuZ2VfcmF0ZSkCAQEFAQAIHHBvb2xfaWQEKHBlcm1pc3Npb24xAgEBBQEACBxwb29sX2lkBChjb21taXNzaW9uCAEBBQEACBxwb29sX2lkBBhhbW91bnQIAQEFAKABAQUAlQgAAAAIAQAENGVyYXNfdG9fY2hlY2sEAQEFAQEFAQAIFHN0YXNoABhyZXN1bHQZAQEBBQEABBBlcmFzOQIBAQUAmQgBAQUAoQgBAAQMbmV3LQQBAQUBAAQMbmV3CAEBBQEABAxuZXcUAQEFAQAEDG5ld5UFAQEFAQAEDG5ld6UFAQEFAQAIFGluZGV4BBR2YWx1ZRQBAQUBAAQMbmV3qQUBAQUBAQUArQgABAC1CAEBBQEDEEkCJAQEAQEFAQMMSQIkBAEBBQEACBBmcm9tBBRjb3VudAQBAQUAFQEBAQUAyQgBAAQQZGF0Yf0FAQEFAQEFAM0IAQEFAN0IAQEFAOkIACAA+QgABAD9CAANAQAgAAQACQkABAANCQAEABEJAAQAOQIABAAVCQAgAAQAIAAkAQAIEHBhcmEEIG5ld19jb2RlJAEBBQEACBBwYXJhBCBuZXdfaGVhZCQBAQUBAAwQcGFyYQQgbmV3X2NvZGUkTHJlbGF5X3BhcmVudF9udW1iZXIEAQEFAQAEEHBhcmEEAQEFAQAEPHZhbGlkYXRpb25fY29kZSQBAQUBAARQdmFsaWRhdGlvbl9jb2RlX2hhc2ggAQEFAQAIEHN0bXQFBiRzaWduYXR1cmVBAgEBBQEACBBwYXJhBBxjb250ZXh0BAEBBQEBBQAEAQEFAQQEAQgBAQUBAwggBAEBBQAdCQEABBR1cF90bwQBAQUABAAlCQBVAgApCQEBBQAtCQBVAgAVAQBVAgAxCQBVAgA5CQAEAEEJAQAMJHJlY2lwaWVudARUcHJvcG9zZWRfbWF4X2NhcGFjaXR5BGRwcm9wb3NlZF9tYXhfbWVzc2FnZV9zaXplBAEBBQEABBhzZW5kZXIEAQEFAQAEKGNoYW5uZWxfaWRVAgEBBQEADBBwYXJhBCxudW1faW5ib3VuZAQwbnVtX291dGJvdW5kBAEBBQEABCBjaGFubmVscwQBAQUBAAgoY2hhbm5lbF9pZFUCNG9wZW5fcmVxdWVzdHMEAQEFAQAQGHNlbmRlcgQkcmVjaXBpZW50BDBtYXhfY2FwYWNpdHkEQG1heF9tZXNzYWdlX3NpemUEAQEFAQAIGHNlbmRlcgQkcmVjaXBpZW50BAEBBQEABEx0YXJnZXRfc3lzdGVtX2NoYWluBAEBBQEBBQEAEBhzZW5kZXIEJHJlY2lwaWVudARUcHJvcG9zZWRfbWF4X2NhcGFjaXR5BGRwcm9wb3NlZF9tYXhfbWVzc2FnZV9zaXplBAEBBQEACDBieV9wYXJhY2hhaW4EKGNoYW5uZWxfaWRVAgEBBQEACBhzZW5kZXIEJHJlY2lwaWVudAQABABFCQAEAN0DAAQApQUASQkATQkASQkAOQIASQkABAEBBQAtBAEBBQEDCCBdAgEBBQEDCCBhAgBJCQBVCQEACDRkaXNwdXRlX3Byb29mIQY8a2V5X293bmVyX3Byb29mvQMBAQUABABZCQEBBQBdCQEBBQBlCQAEAGUJAQAIKG1heF9hbW91bnQIHHBhcmFfaWQEAQEFAQEFAQAMHHBhcmFfaWQEKHNwb3RfcHJpY2UIKG9yZGVyZWRfYnkAAQEFAQAEKHNwb3RfcHJpY2UIAA0BAGkJAAQAiQkABACNCQEADAhpZAQwZ2VuZXNpc19oZWFkJDx2YWxpZGF0aW9uX2NvZGUkAQEFAQAUDHdobwAcZGVwb3NpdAgIaWQEMGdlbmVzaXNfaGVhZCQ8dmFsaWRhdGlvbl9jb2RlJAEBBQEABAhpZAQBAQUBAAgIaWQEFG90aGVyBAEBBQEBBQEACBxwYXJhX2lkBBxtYW5hZ2VyAAEBBQEABBxwYXJhX2lkBAEBBQEACBxwYXJhX2lkBAx3aG8AAQEFAQAIHHBhcmFfaWQEIG90aGVyX2lkBAAEAJEJAQAUEHBhcmEEGGxlYXNlcgAYYW1vdW50CDBwZXJpb2RfYmVnaW4EMHBlcmlvZF9jb3VudAQBAQUBAQUBAAQwbGVhc2VfcGVyaW9kBAEBBQEAGBxwYXJhX2lkBBhsZWFzZXIAMHBlcmlvZF9iZWdpbgQwcGVyaW9kX2NvdW50BDhleHRyYV9yZXNlcnZlZAgwdG90YWxfYW1vdW50CAB1BwAIAAQAnQkBAAggZHVyYXRpb24ESGxlYXNlX3BlcmlvZF9pbmRleAQBAQUBABQQcGFyYQQ0YXVjdGlvbl9pbmRleAQoZmlyc3Rfc2xvdAQkbGFzdF9zbG90BBhhbW91bnQIAQEFAQEFAQAMNGF1Y3Rpb25faW5kZXgEMGxlYXNlX3BlcmlvZAQYZW5kaW5nBAEBBQEABDRhdWN0aW9uX2luZGV4BAEBBQEADBhiaWRkZXIAOGV4dHJhX3Jlc2VydmVkCDB0b3RhbF9hbW91bnQIAQEFAQAIGGJpZGRlcgAYYW1vdW50CAEBBQEADBxwYXJhX2lkBBhsZWFzZXIAGGFtb3VudAgBAQUBABQYYmlkZGVyABxwYXJhX2lkBBhhbW91bnQIKGZpcnN0X3Nsb3QEJGxhc3Rfc2xvdAQBAQUBAAg0YXVjdGlvbl9pbmRleAQwYmxvY2tfbnVtYmVyBAAEAKUJAQAYFGluZGV4BAxjYXAIMGZpcnN0X3BlcmlvZAQsbGFzdF9wZXJpb2QEDGVuZAQgdmVyaWZpZXI9BgEBBQEADBRpbmRleAQUdmFsdWUIJHNpZ25hdHVyZUUGAQEFAQAIDHdobwAUaW5kZXgEAQEFAQAIFGluZGV4BBBtZW1vJAEBBQEACBRpbmRleAQkc2lnbmF0dXJlRQYBAQUBAQUBAAwMd2hvAChmdW5kX2luZGV4BBhhbW91bnQIAQEFAQAIHHBhcmFfaWQEGHJlc3VsdBkBAQEFAQAMDHdobwAccGFyYV9pZAQQbWVtbyQBAQUAdQEBAAQUY291bnQEAQEFAQAEEHdoZW4EAQEFAQAQEGNvcmUEFGJlZ2luBChhc3NpZ25tZW50VQYgZW5kX2hpbnQtBAEBBQEBBQEABBB3aGVuBAEBBQEABBBjb3JlBAEBBQBpBgEBBQBhBgEBBQBdBgEABDBtYXliZV9jb25maWdhBgEBBQEADBhsaW1pdHNdBjxyZWFsX3NpemVfdXBwZXIEMHdpdG5lc3NfdGFza2kGAQEFAQAIEGtleXN9AzB3aXRuZXNzX3NpemUEAQEFAQAMEHJvb3QkKGNoaWxkX2tleXN9Ayh0b3RhbF9zaXplBAEBBQEABBhsaW1pdHNdBgEBBQEACDBwcm9ncmVzc190b3BlBjhwcm9ncmVzc19jaGlsZGUGAQEFAQEFAQAMDHRvcAQUY2hpbGQEHGNvbXB1dGWBAgEBBQEABBRlcnJvcuQACAC1CQC5CQAEALkJAAgAuQkAvQkBAQUAxQkBAQUAyQkAzQkA2QkAAADhCQEBBQD5AgEACBBkZXN0mQEcbWVzc2FnZakGAQEFAQAQEGRlc3SZASxiZW5lZmljaWFyeZkBGGFzc2V0cxkDOGZlZV9hc3NldF9pdGVtBAEBBQEACBxtZXNzYWdlqQYobWF4X3dlaWdodBgBAQUBAAggbG9jYXRpb255ARx2ZXJzaW9uBAEBBQEABERtYXliZV94Y21fdmVyc2lvbi0EAQEFAQAEIGxvY2F0aW9umQEBAQUBABQQZGVzdJkBLGJlbmVmaWNpYXJ5mQEYYXNzZXRzGQM4ZmVlX2Fzc2V0X2l0ZW0EMHdlaWdodF9saW1pdPECAQEFAQAEJHN1c3BlbmRlZBQBAQUBAAgYYXNzZXRzGQMsYmVuZWZpY2lhcnmZAQEBBQEAHBBkZXN0mQEYYXNzZXRzGQNQYXNzZXRzX3RyYW5zZmVyX3R5cGWtBjhyZW1vdGVfZmVlc19pZLEGSGZlZXNfdHJhbnNmZXJfdHlwZa0GSGN1c3RvbV94Y21fb25fZGVzdKkGMHdlaWdodF9saW1pdPECAQEFAQEFAQAEHG91dGNvbWWNAgEBBQEAEBhvcmlnaW55ASxkZXN0aW5hdGlvbnkBHG1lc3NhZ2X5AihtZXNzYWdlX2lkIAEBBQEACBhvcmlnaW55ASBxdWVyeV9pZAgBAQUBAAggcXVlcnlfaWQIIHJlc3BvbnNluQIBAQUBAAwgcXVlcnlfaWQIMHBhbGxldF9pbmRleAQoY2FsbF9pbmRleAQBAQUBABQgcXVlcnlfaWQIMHBhbGxldF9pbmRleAQoY2FsbF9pbmRleAQ0YWN0dWFsX3dlaWdodBhMbWF4X2J1ZGdldGVkX3dlaWdodBgBAQUBAAwYb3JpZ2lueQEgcXVlcnlfaWQIRGV4cGVjdGVkX2xvY2F0aW9uvQIBAQUBAAQgcXVlcnlfaWQIAQEFAQAMEGhhc2ggGG9yaWdpbnkBGGFzc2V0cxkDAQEFAQAQLGRlc3RpbmF0aW9ueQEYcmVzdWx0BBBjb3N0oQIobWVzc2FnZV9pZCABAQUBAAggbG9jYXRpb255ARx2ZXJzaW9u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AQEFAQAEGHJlc3VsdJULAQEFAJ0LAAAAoQwAAAClDAAEAAABAQUAsQwAAAC5DAC9DADBDAAAACQBAQUAxQwBAQUAyQwAIQIAwQwBAAwMd2hv1QMUdmFsdWUIDHRpcAgBAQUBAAgkY2FuZGlkYXRl1QMcYXBwcm92ZRQBAQUBAAQcYXBwcm92ZRQBAQUBAAQYYW1vdW50CAEBBQEAGBxmb3VuZGVy1QMsbWF4X21lbWJlcnMEKG1heF9pbnRha2UELG1heF9zdHJpa2VzBERjYW5kaWRhdGVfZGVwb3NpdAgUcnVsZXMkAQEFAQAIDHdob9UDHGZvcmdpdmUUAQEFAQAQLG1heF9tZW1iZXJzBChtYXhfaW50YWtlBCxtYXhfc3RyaWtlcwREY2FuZGlkYXRlX2RlcG9zaXQIAQEFAQAEJGNhbmRpZGF0ZQABAQUBAAgkY2FuZGlkYXRlAAxtYXgEAQEFAQAIPGNoYWxsZW5nZV9yb3VuZAQMbWF4BAEBBQEBBQEABBxmb3VuZGVyAAEBBQEACDBjYW5kaWRhdGVfaWQAFG9mZmVyCAEBBQEADDBjYW5kaWRhdGVfaWQAFG9mZmVyCCB2b3VjaGluZwABAQUBAAQkY2FuZGlkYXRlAAEBBQEACBxwcmltYXJ5AChjYW5kaWRhdGVz3QMBAQUBAAgMd2hvABhqdWRnZWQUAQEFAQAEGG1lbWJlcgABAQUBAAwkY2FuZGlkYXRlABR2b3RlcgAQdm90ZRQBAQUBAAgUdm90ZXIAEHZvdGUUAQEFAQAEGHBhcmFtc50LAQEFAQAIGG1lbWJlcgAQcmFuawQAAADNDAC9DADRDAEACBxhY2NvdW501QMQY2FsbJUMAQEFAQAIEGxvc3TVAxxyZXNjdWVy1QMBAQUBAAwcZnJpZW5kc90DJHRocmVzaG9sZAQwZGVsYXlfcGVyaW9kBAEBBQEABBxhY2NvdW501QMBAQUBAAQccmVzY3VlctUDAQEFAQEFAQAIMGxvc3RfYWNjb3VudAA8cmVzY3Vlcl9hY2NvdW50AAEBBQEADDBsb3N0X2FjY291bnQAPHJlc2N1ZXJfYWNjb3VudAAYc2VuZGVyAAEBBQEABDBsb3N0X2FjY291bnQAAAQA3QwBABAQd2hlbgQ4bWF5YmVfcGVyaW9kaWOBAyBwcmlvcml0eQQQY2FsbJUMAQEFAQAUCGlkIBB3aGVuBDhtYXliZV9wZXJpb2RpY4EDIHByaW9yaXR5BBBjYWxslQwBAQUBABAUYWZ0ZXIEOG1heWJlX3BlcmlvZGljgQMgcHJpb3JpdHkEEGNhbGyVDAEBBQEAFAhpZCAUYWZ0ZXIEOG1heWJlX3BlcmlvZGljgQMgcHJpb3JpdHkEEGNhbGyVDAEBBQEBBQEADBB0YXNrDQEIaWQRARhyZXN1bHSVCwAAAOkMAQAMEHJlYWzVA0Bmb3JjZV9wcm94eV90eXBlGQwQY2FsbJUMAQEFAQAMIGRlbGVnYXRl1QMocHJveHlfdHlwZa0LFGRlbGF5BAEBBQEADChwcm94eV90eXBlrQsUZGVsYXkEFGluZGV4BAEBBQEAFBxzcGF3bmVy1QMocHJveHlfdHlwZa0LFGluZGV4BBhoZWlnaHQEJGV4dF9pbmRleAQBAQUBABAgZGVsZWdhdGXVAxByZWFs1QNAZm9yY2VfcHJveHlfdHlwZRkMEGNhbGyVDAEBBQEBBQEAEBBwdXJlAAx3aG8AKHByb3h5X3R5cGWtC1BkaXNhbWJpZ3VhdGlvbl9pbmRleAQBAQUBABAkZGVsZWdhdG9yACRkZWxlZ2F0ZWUAKHByb3h5X3R5cGWtCxRkZWxheQQBAAhEb3RoZXJfc2lnbmF0b3JpZXPdAxBjYWxslQwBAQUBABQkdGhyZXNob2xkBERvdGhlcl9zaWduYXRvcmllc90DPG1heWJlX3RpbWVwb2ludI0EEGNhbGyVDChtYXhfd2VpZ2h0GAEBBQEBBQEAFCRhcHByb3ZpbmcAJHRpbWVwb2ludPEBIG11bHRpc2lnACRjYWxsX2hhc2ggGHJlc3VsdJULAAQA7QwBAAgwcmF3X3NvbHV0aW9uiQwcd2l0bmVzc10FAQEFAQAEMHJhd19zb2x1dGlvbokMAQEFAQEFANkHAAQA8QwBAQUA9QwABAD5DAEBBQAJBwEACBhhbW91bnQIIGR1cmF0aW9uBAEBBQEACBRpbmRleARAbWF5YmVfcHJvcG9ydGlvbvUDAQEFAQEFAQAMDHdobwAYYW1vdW50CCBkdXJhdGlvbgQBAQUBABQUaW5kZXgEGGV4cGlyeQQMd2hvAChwcm9wb3J0aW9uCBhhbW91bnQIAQEFAQAUFGluZGV4BAx3aG8AKHByb3BvcnRpb24IGGFtb3VudAgcZHJvcHBlZBQBAQUBAAQcZGVmaWNpdAgBAQUBAAwQZnJvbQAIdG8AFGluZGV4BAAAAAENAQEFAQAIFHN0YXNoABhyZXN1bHSVCwEBBQEACBxwYXJhX2lkBBhyZXN1bHSVCwEDBCQABQ0BAwiVDAQA+QoBAwiVDAQABQsBAwjlC5UMABENAQMImQGpBgAZDQEBBQBlDQEBBQEACDhkaXNwYXRjaF9lcnJvcikNNGRpc3BhdGNoX2luZm9AAQAQEHdoZW4EOG1heWJlX3BlcmlvZGljgQMgcHJpb3JpdHkEEGNhbGyJDQEBBQEAFAhpZCAQd2hlbgQ4bWF5YmVfcGVyaW9kaWOBAyBwcmlvcml0eQQQY2FsbIkNAQEFAQAQFGFmdGVyBDhtYXliZV9wZXJpb2RpY4EDIHByaW9yaXR5BBBjYWxsiQ0BAQUBABQIaWQgFGFmdGVyBDhtYXliZV9wZXJpb2RpY4EDIHByaW9yaXR5BBBjYWxsiQ0BAQUBAQUBAAwQdGFzaw0BCGlkEQEYcmVzdWx0MQ0BAAQQY2FsbIkNAQEFAQEFAQAIJGNhbGxfaGFzaCAYcmVzdWx0PQ0BAAQUY2FsbHNxDQEBBQEACBRpbmRleAQQY2FsbIkNAQEFAQAIJGFzX29yaWdpbpUDEGNhbGyJDQEBBQEACBBjYWxsiQ0Yd2VpZ2h0GAEBBQEBBQEACBRpbmRleAQUZXJyb3IpDQEBBQEABBRlcnJvcikNAQEFAQAEGHJlc3VsdDENAQAMEHJlYWzVA0Bmb3JjZV9wcm94eV90eXBlhQQQY2FsbIkNAQEFAQAQIGRlbGVnYXRl1QMQcmVhbNUDQGZvcmNlX3Byb3h5X3R5cGWFBBBjYWxsiQ0BAQUBAAhEb3RoZXJfc2lnbmF0b3JpZXPdAxBjYWxsiQ0BAQUBABQkdGhyZXNob2xkBERvdGhlcl9zaWduYXRvcmllc90DPG1heWJlX3RpbWVwb2ludI0EEGNhbGyJDShtYXhfd2VpZ2h0GAEBBQEBBQEAFCRhcHByb3ZpbmcAJHRpbWVwb2ludPEBIG11bHRpc2lnACRjYWxsX2hhc2ggGHJlc3VsdDENAQEFAQAIFHN0YXNoABhyZXN1bHQxDQEBBQEACBxwYXJhX2lkBBhyZXN1bHQxDQEACAhpZAQcZ2VuZXNpcxUJAQEFAQAICGlkBAx4Y22pBgEBBQEABAxuZXfVAwEBBQEACAx3aG/VAxBjYWxsiQ0BAQUBAQUBAAQsc3Vkb19yZXN1bHQxDQEBBQEACAxvbGQFAgxuZXcAAQMEJACNDQEDCIkNBAD5CgEDCIkNBAAFCwEDCJUDiQ0AmQ0BAwiZAakGAKENAQEFAD0PAQEFAEEPAQEFAQAIOGRpc3BhdGNoX2Vycm9y/Q00ZGlzcGF0Y2hfaW5mb0ABAQUBAAgkY29kZV9oYXNoIBRlcnJvcv0NAQEFAQAQDHdobwAUaW5kZXgELG9sZF9kZXBvc2l0CCxuZXdfZGVwb3NpdAgAAABdDwEADDx2YWxpZGF0b3Jfc3Rhc2gADGVyYQQ4c2xhc2hfZnJhY3Rpb24EAQEFAQEFAQAQJGVyYV9pbmRleAQ8dmFsaWRhdG9yX3N0YXNoABBwYWdlBBBuZXh0LQQBAQUBAAgUc3Rhc2gAOGZvcmNlX3dpdGhkcmF3CAEBBQEABBR1cF90bwQBAQUBAAQkdmFsaWRhdG9yAAEABBRjYWxsc9UQAQEFAQAIFGluZGV4BBBjYWxs0RABAQUBAAgkYXNfb3JpZ2ludQ8QY2FsbNEQAQEFAQAIEGNhbGzREBh3ZWlnaHQYAQEFAQAIEG1haW7RECBmYWxsYmFja9EQAQEFAQEFAQAIFGluZGV4BBRlcnJvcv0NAQEFAQAEFGVycm9y/Q0BAQUBAAQYcmVzdWx0FQ4BAQUBAAQobWFpbl9lcnJvcv0NAAAA4RAAAADxDwAAAOUQAQEFAPEQACQA9RAAJAD9EAAkAAERACQABAEABBBpbmZv7Q8BAQUBAAQQc3Vic/UPAQEFAQAIJHJlZ19pbmRleAQcbWF4X2ZlZQgBAQUBAAQkcmVnX2luZGV4BAEBBQEACBRpbmRleAQMZmVlCAEBBQEACBRpbmRleAQYZmllbGRzCAEBBQEAECRyZWdfaW5kZXgEGHRhcmdldNUDJGp1ZGdlbWVudPkPIGlkZW50aXR5IAEBBQEACAxzdWLVAxBkYXRh3Q8BAQUBAAQMc3Vi1QMBAQUBAAwkYXV0aG9yaXR51QMYc3VmZml4JChhbGxvY2F0aW9uBAEBBQEACBhzdWZmaXgkJGF1dGhvcml0edUDAQEFAQAQDHdob9UDIHVzZXJuYW1lJCRzaWduYXR1cmVFBjh1c2VfYWxsb2NhdGlvbhQBAQUBAAQgdXNlcm5hbWUkAQEFAQEFAQAIDHdobwAcZGVwb3NpdAgBAQUBAAgMd2hvADxyZWdpc3RyYXJfaW5kZXgEAQEFAQAIGHRhcmdldAA8cmVnaXN0cmFyX2luZGV4BAEBBQEABDxyZWdpc3RyYXJfaW5kZXgEAQEFAQAMDHN1YgAQbWFpbgAcZGVwb3NpdAgBAQUBAAwQbWFpbgA4bnVtYmVyX29mX3N1YnMELG5ld19kZXBvc2l0CAEBBQEACAxzdWIAEG1haW4AAQEFAQAEJGF1dGhvcml0eQABAQUBAAgMd2hvACB1c2VybmFtZSQBAQUBAAwMd2hvACB1c2VybmFtZSQoZXhwaXJhdGlvbgQBAQUBAAQUd2hvc2UAAQEFAQAEIHVzZXJuYW1lJAEACBxhY2NvdW501QMQY2FsbNEQAQEFAQAENG1heWJlX2FjY291bnQBEAEBBQEBBQEAEAx3aG8AEGtpbmQhDixvbGRfZGVwb3NpdAgsbmV3X2RlcG9zaXQIAQEFAQAIHGFjY291bnQAOHNjaGVkdWxlX2luZGV4BAAEAA0RAQAQEHdoZW4EOG1heWJlX3BlcmlvZGljgQMgcHJpb3JpdHkEEGNhbGzREAEBBQEAFAhpZCAQd2hlbgQ4bWF5YmVfcGVyaW9kaWOBAyBwcmlvcml0eQQQY2FsbNEQAQEFAQAQFGFmdGVyBDhtYXliZV9wZXJpb2RpY4EDIHByaW9yaXR5BBBjYWxs0RABAQUBABQIaWQgFGFmdGVyBDhtYXliZV9wZXJpb2RpY4EDIHByaW9yaXR5BBBjYWxs0RABAQUBAQUBAAwQdGFzaw0BCGlkEQEYcmVzdWx0FQ4BAAQQY2FsbNEQAQEFAQAIDHdob9UDEGNhbGzREAEBBQEBBQEABCxzdWRvX3Jlc3VsdBUOAAAAGREBAAwQcmVhbNUDQGZvcmNlX3Byb3h5X3R5cGUREBBjYWxs0RABAQUBAAwgZGVsZWdhdGXVAyhwcm94eV90eXBlNQ4UZGVsYXkEAQEFAQAMKHByb3h5X3R5cGU1DhRkZWxheQQUaW5kZXgEAQEFAQAUHHNwYXduZXLVAyhwcm94eV90eXBlNQ4UaW5kZXgEGGhlaWdodAQkZXh0X2luZGV4BAEBBQEAECBkZWxlZ2F0ZdUDEHJlYWzVA0Bmb3JjZV9wcm94eV90eXBlERAQY2FsbNEQAQEFAQEFAQAQEHB1cmUADHdobwAocHJveHlfdHlwZTUOUGRpc2FtYmlndWF0aW9uX2luZGV4BAEBBQEAEBBwdXJlABxzcGF3bmVyAChwcm94eV90eXBlNQ5QZGlzYW1iaWd1YXRpb25faW5kZXgEAQEFAQAQJGRlbGVnYXRvcgAkZGVsZWdhdGVlAChwcm94eV90eXBlNQ4UZGVsYXkEAQEFAQAQDHdobwAQa2luZDkOLG9sZF9kZXBvc2l0CCxuZXdfZGVwb3NpdAgBAAhEb3RoZXJfc2lnbmF0b3JpZXPdAxBjYWxs0RABAQUBABQkdGhyZXNob2xkBERvdGhlcl9zaWduYXRvcmllc90DPG1heWJlX3RpbWVwb2ludI0EEGNhbGzREChtYXhfd2VpZ2h0GAEBBQEADCR0aHJlc2hvbGQERG90aGVyX3NpZ25hdG9yaWVz3QMkY2FsbF9oYXNoIAEBBQEBBQEAFCRhcHByb3ZpbmcAJHRpbWVwb2ludPEBIG11bHRpc2lnACRjYWxsX2hhc2ggGHJlc3VsdBUOAQEFAQAQDHdobwAkY2FsbF9oYXNoICxvbGRfZGVwb3NpdAgsbmV3X2RlcG9zaXQIAQEFALENAQEFAQAMHHBvb2xfaWQEGG1lbWJlcgBAcmVsZWFzZWRfYmFsYW5jZQgBAQUBAAgYbWVtYmVyAChwZXJtaXNzaW9uiQUBAQUBAAgccG9vbF9pZAQYY2FsbGVyAAEBBQEAGDRtaW5fam9pbl9ib25kCDxtaW5fY3JlYXRlX2JvbmQIJG1heF9wb29scy0ELG1heF9tZW1iZXJzLQRQbWF4X21lbWJlcnNfcGVyX3Bvb2wtBFRnbG9iYWxfbWF4X2NvbW1pc3Npb24tBAEBBQEACBRzdGFzaAAYcmVzdWx0FQ4BAQUBAAgMd2hvABB2b3RlNQQBAQUBAAgMd2hvABRjbGFzcwQABAAhEQEADDxwcm9wb3NhbF9vcmlnaW51DyBwcm9wb3NhbKUBQGVuYWN0bWVudF9tb21lbnRBBAEBBQEBBQEACCRjYWxsX2hhc2ggGHJlc3VsdFUOAAQAJREBABAoYXNzZXRfa2luZI0OGGFtb3VudAgsYmVuZWZpY2lhcnmRDih2YWxpZF9mcm9tLQQBAQUBAQUBABgUaW5kZXgEKGFzc2V0X2tpbmSNDhhhbW91bnQILGJlbmVmaWNpYXJ5kQ4odmFsaWRfZnJvbQQkZXhwaXJlX2F0BAAAACkRAAAALREBAQUBAAwUYWdlbnQAJGRlbGVnYXRvcgAYYW1vdW50CAEBBQBBEQAEAEkRAQEFAQMQpQ4kBAQBAQUBAwylDiQEAQEFAFURAQAEEGRhdGE9EAEBBQEBBQBhEQAEAGURAQAMEHBhcmEENG5ld19jb2RlX2hhc2ggMHZhbGlkX3BlcmlvZAQBAQUBAQUBAAwccGFyYV9pZAQkY29kZV9oYXNoICRleHBpcmVfYXQEAEkJAGkRAQAINGRpc3B1dGVfcHJvb2ZNEDxrZXlfb3duZXJfcHJvb2a9AwEBBQEACAhpZAQMeGNtWRABAQUBAQUBAAgccGFyYV9pZAQYcmVzdWx0FQ4ABAANAQAEAG0RAQAICGlkBEhsZWFzZV9wZXJpb2Rfc3RhcnRhEAEBBQEABBRzbG90cwQBAQUBAQUBAAQUc2xvdHMEAQEFAIUOAQAIDHdobwAYYW1vdW50CAEBBQEBBQBxEQEBBQBtEAEBBQBxEAEBBQCFEQEABBhyZXBvcnRtEAEBBQEABBBtb2RlcRABAQUBAQUBABAIaWQEXG5ld192YWxpZGF0b3Jfc2V0X2NvdW50BCxwcnVuZV91cF90by0EIGxlZnRvdmVyFAEBBQC9DgEBBQB9EAAkABUBAQAEGGN1cnNvcoEQAQEFAQAMFGluZGV4BDBpbm5lcl9jdXJzb3LFBShzdGFydGVkX2F0LQQBAQUBAAQgc2VsZWN0b3KFEAEBBQEBBQEABChtaWdyYXRpb25zBAEBBQEACBRpbmRleAQQdG9vawQBAQUBAAQsbmV4dF9jdXJzb3LFBQAIAJERAJURAAQAlREACACVEQC9CQEBBQCdEQChEQClEQAAAK0RAQEFABUPAJEOALkRAQAIEGRlc3SRDhxtZXNzYWdlWRABAQUBABAQZGVzdJEOLGJlbmVmaWNpYXJ5kQ4YYXNzZXRzHQ84ZmVlX2Fzc2V0X2l0ZW0EAQEFAQAIHG1lc3NhZ2VZEChtYXhfd2VpZ2h0GAEBBQEACCBsb2NhdGlvbokOHHZlcnNpb24EAQEFAQAEIGxvY2F0aW9ukQ4BAQUBABQQZGVzdJEOLGJlbmVmaWNpYXJ5kQ4YYXNzZXRzHQ84ZmVlX2Fzc2V0X2l0ZW0EMHdlaWdodF9saW1pdPECAQEFAQAIGGFzc2V0cx0PLGJlbmVmaWNpYXJ5kQ4BAQUBABwQZGVzdJEOGGFzc2V0cx0PUGFzc2V0c190cmFuc2Zlcl90eXBljRA4cmVtb3RlX2ZlZXNfaWSREEhmZWVzX3RyYW5zZmVyX3R5cGWNEEhjdXN0b21feGNtX29uX2Rlc3RZEDB3ZWlnaHRfbGltaXTxAgEBBQEACBxhbGlhc2VykQ4cZXhwaXJlc/UDAQEFAQAEHGFsaWFzZXKRDgEBBQEBBQEABBxvdXRjb21l0Q4BAQUBABAYb3JpZ2luiQ4sZGVzdGluYXRpb26JDhxtZXNzYWdlFQ8obWVzc2FnZV9pZCABAQUBABAYb3JpZ2luiQ4sZGVzdGluYXRpb26JDhRlcnJvchkPKG1lc3NhZ2VfaWQgAQEFAQAMGG9yaWdpbokOFGVycm9yyQ4obWVzc2FnZV9pZCABAQUBAAgYb3JpZ2luiQ4gcXVlcnlfaWQIAQEFAQAIIHF1ZXJ5X2lkCCByZXNwb25zZeUOAQEFAQAMGG9yaWdpbokOIHF1ZXJ5X2lkCERleHBlY3RlZF9sb2NhdGlvbukOAQEFAQAMEGhhc2ggGG9yaWdpbokOGGFzc2V0cx0PAQEFAQAQLGRlc3RpbmF0aW9uiQ4YcmVzdWx0BBBjb3N02Q4obWVzc2FnZV9pZCABAQUBAAggbG9jYXRpb26JDhx2ZXJzaW9uBAEBBQEADCBsb2NhdGlvbokOIHF1ZXJ5X2lkCBRlcnJvcskOAQEFAQAIIGxvY2F0aW9ukQ4gcXVlcnlfaWQIAQEFAQAQGG9yaWdpbokOIHF1ZXJ5X2lkCEBleHBlY3RlZF9xdWVyaWVyiQ5QbWF5YmVfYWN0dWFsX3F1ZXJpZXLpDgEBBQEADCxkZXN0aW5hdGlvbokOEGNvc3TZDihtZXNzYWdlX2lkIAEBBQEACBhwYXlpbmeJDhBmZWVz2Q4BAQUBAAwcYWxpYXNlcokOGHRhcmdldIkOGGV4cGlyefUDAQEFAQAIHGFsaWFzZXKJDhh0YXJnZXSJDgEBBQEABBh0YXJnZXSJDgEBBQEACBRpbmRleAQUZXJyb3LlDQCNDgAIAQAIKGFzc2V0X2tpbmSNDhByYXRlCAEBBQEABChhc3NldF9raW5kjQ4BAQUBAQUBAAgoYXNzZXRfa2luZI0OEHJhdGUIAQEFAQAEKGFzc2V0X2tpbmSNDgEBBQEADChhc3NldF9raW5kjQ4Mb2xkCAxuZXcIAQAEFHJhdGlvBAEBBQEABBxtZXRhX3R4sRABAQUBAQUBAAQYcmVzdWx0VQ4BAAhIZXF1aXZvY2F0aW9uX3Byb29mxRA8a2V5X293bmVyX3Byb29mvQMBAQUBAAhIZXF1aXZvY2F0aW9uX3Byb29m0QY8a2V5X293bmVyX3Byb29mvQMBAQUBAAQMd2hvAAEBBQEBBQEADAx3aG8AIGlkZW50aXR5CBBzdWJzCAEDAABBDwEDCL0RJADFEQEDBCQA0REBAwwpCiQgANURAQMAAOERAQMEBADlEQEDAADtEQEDAADxEQEDBAQAARIBAwQEAAUSAQMEBAANEgEDCBESJAAUAQMI0QYkABQBAwgELQQAxQUBAwjREAQA+QoBAwjREAQABQsBAwQEABkSAQMEWRAAFQsBAwgYkRAAGQsBAwiRDlkQAB0SAQMMdQ/REAQAORIBAwiRDlkQAEESAQMEkQ4ATQsBAwQEAL0MAQMIRRKRDgBNElESAQEBAgEDABAQZnJlZQggcmVzZXJ2ZWQIGGZyb3plbggUZmxhZ3MIABQUbm9uY2UEJGNvbnN1bWVycwQkcHJvdmlkZXJzBCxzdWZmaWNpZW50cwQQZGF0YQwBAAAIIHJlZl90aW1lCChwcm9vZl9zaXplCAAMGG5vcm1hbBgsb3BlcmF0aW9uYWwYJG1hbmRhdG9yeRgFAYAFAAUBEAIUKFByZVJ1bnRpbWUBAwgoJCRDb25zZW5zdXMBAwgoJBBTZWFsAQMIKCQUT3RoZXIBBQBkUnVudGltZUVudmlyb25tZW50VXBkYXRlZAEBBQQsAAIMOEFwcGx5RXh0cmluc2ljAQECMEZpbmFsaXphdGlvbgEBBThJbml0aWFsaXphdGlvbgEBBQIMGE5vcm1hbAEBBSxPcGVyYXRpb25hbAEBBSRNYW5kYXRvcnkBAQUCCAxZZXMBAQUITm8BAQUADBh3ZWlnaHQYFGNsYXNzOCBwYXlzX2ZlZTwCJDxJbnZhbGlkU3BlY05hbWUBAQVoU3BlY1ZlcnNpb25OZWVkc1RvSW5jcmVhc2UBAQV0RmFpbGVkVG9FeHRyYWN0UnVudGltZVZlcnNpb24BAQVMTm9uRGVmYXVsdENvbXBvc2l0ZQEBBTxOb25aZXJvUmVmQ291bnQBAQUwQ2FsbEZpbHRlcmVkAQEFbE11bHRpQmxvY2tNaWdyYXRpb25zT25nb2luZwEBBUROb3RoaW5nQXV0aG9yaXplZAEBBTBVbmF1dGhvcml6ZWQBAQUCFEBGYWlsZWRUb1NjaGVkdWxlAQEFIE5vdEZvdW5kAQEFXFRhcmdldEJsb2NrTnVtYmVySW5QYXN0AQEFSFJlc2NoZWR1bGVOb0NoYW5nZQEBBRROYW1lZAEBBQIkGFRvb0JpZwEBBTBBbHJlYWR5Tm90ZWQBAQU0Tm90QXV0aG9yaXplZAEBBSBOb3ROb3RlZAEBBSRSZXF1ZXN0ZWQBAQUwTm90UmVxdWVzdGVkAQEFHFRvb01hbnkBAQUYVG9vRmV3AQEFGE5vQ29zdAEBBQIQYEludmFsaWRFcXVpdm9jYXRpb25Qcm9vZgEBBWBJbnZhbGlkS2V5T3duZXJzaGlwUHJvb2YBAQVYRHVwbGljYXRlT2ZmZW5jZVJlcG9ydAEBBVBJbnZhbGlkQ29uZmlndXJhdGlvbgEBBQIULE5vdEFzc2lnbmVkAQEFIE5vdE93bmVyAQEFFEluVXNlAQEFLE5vdFRyYW5zZmVyAQEFJFBlcm1hbmVudAEBBQIwOFZlc3RpbmdCYWxhbmNlAQEFVExpcXVpZGl0eVJlc3RyaWN0aW9ucwEBBUxJbnN1ZmZpY2llbnRCYWxhbmNlAQEFSEV4aXN0ZW50aWFsRGVwb3NpdAEBBTRFeHBlbmRhYmlsaXR5AQEFXEV4aXN0aW5nVmVzdGluZ1NjaGVkdWxlAQEFLERlYWRBY2NvdW50AQEFPFRvb01hbnlSZXNlcnZlcwEBBTBUb29NYW55SG9sZHMBAQU4VG9vTWFueUZyZWV6ZXMBAQVMSXNzdWFuY2VEZWFjdGl2YXRlZAEBBSREZWx0YVplcm8BAQUCfDROb3RDb250cm9sbGVyAQEFIE5vdFN0YXNoAQEFNEFscmVhZHlCb25kZWQBAQU0QWxyZWFkeVBhaXJlZAEBBTBFbXB0eVRhcmdldHMBAQU4RHVwbGljYXRlSW5kZXgBAQVESW52YWxpZFNsYXNoSW5kZXgBAQVASW5zdWZmaWNpZW50Qm9uZAEBBTBOb01vcmVDaHVua3MBAQU0Tm9VbmxvY2tDaHVuawEBBTBGdW5kZWRUYXJnZXQBAQVISW52YWxpZEVyYVRvUmV3YXJkAQEFaEludmFsaWROdW1iZXJPZk5vbWluYXRpb25zAQEFSE5vdFNvcnRlZEFuZFVuaXF1ZQEBBThBbHJlYWR5Q2xhaW1lZAEBBSxJbnZhbGlkUGFnZQEBBVRJbmNvcnJlY3RIaXN0b3J5RGVwdGgBAQVYSW5jb3JyZWN0U2xhc2hpbmdTcGFucwEBBSBCYWRTdGF0ZQEBBThUb29NYW55VGFyZ2V0cwEBBSRCYWRUYXJnZXQBAQVAQ2Fubm90Q2hpbGxPdGhlcgEBBURUb29NYW55Tm9taW5hdG9ycwEBBURUb29NYW55VmFsaWRhdG9ycwEBBUBDb21taXNzaW9uVG9vTG93AQEFLEJvdW5kTm90TWV0AQEFUENvbnRyb2xsZXJEZXByZWNhdGVkAQEFTENhbm5vdFJlc3RvcmVMZWRnZXIBAQVsUmV3YXJkRGVzdGluYXRpb25SZXN0cmljdGVkAQEFOE5vdEVub3VnaEZ1bmRzAQEFXFZpcnR1YWxTdGFrZXJOb3RBbGxvd2VkAQEFAhQwSW52YWxpZFByb29mAQEFXE5vQXNzb2NpYXRlZFZhbGlkYXRvcklkAQEFNER1cGxpY2F0ZWRLZXkBAQUYTm9LZXlzAQEFJE5vQWNjb3VudAEBBQIcLFBhdXNlRmFpbGVkAQEFMFJlc3VtZUZhaWxlZAEBBTRDaGFuZ2VQZW5kaW5nAQEFHFRvb1Nvb24BAQVgSW52YWxpZEtleU93bmVyc2hpcFByb29mAQEFYEludmFsaWRFcXVpdm9jYXRpb25Qcm9vZgEBBVhEdXBsaWNhdGVPZmZlbmNlUmVwb3J0AQEFAiwwSW52YWxpZEluZGV4AQEFQFRvb01hbnlBcHByb3ZhbHMBAQVYSW5zdWZmaWNpZW50UGVybWlzc2lvbgEBBUxQcm9wb3NhbE5vdEFwcHJvdmVkAQEFWEZhaWxlZFRvQ29udmVydEJhbGFuY2UBAQUwU3BlbmRFeHBpcmVkAQEFLEVhcmx5UGF5b3V0AQEFQEFscmVhZHlBdHRlbXB0ZWQBAQUsUGF5b3V0RXJyb3IBAQUwTm90QXR0ZW1wdGVkAQEFMEluY29uY2x1c2l2ZQEBBQIwKE5vdE9uZ29pbmcBAQUgTm90Vm90ZXIBAQUwTm9QZXJtaXNzaW9uAQEFPE5vUGVybWlzc2lvbllldAEBBURBbHJlYWR5RGVsZWdhdGluZwEBBTRBbHJlYWR5Vm90aW5nAQEFREluc3VmZmljaWVudEZ1bmRzAQEFNE5vdERlbGVnYXRpbmcBAQUgTm9uc2Vuc2UBAQU8TWF4Vm90ZXNSZWFjaGVkAQEFLENsYXNzTmVlZGVkAQEFIEJhZENsYXNzAQEFAjgoTm90T25nb2luZwEBBShIYXNEZXBvc2l0AQEFIEJhZFRyYWNrAQEFEEZ1bGwBAQUoUXVldWVFbXB0eQEBBTRCYWRSZWZlcmVuZHVtAQEFLE5vdGhpbmdUb0RvAQEFHE5vVHJhY2sBAQUoVW5maW5pc2hlZAEBBTBOb1Blcm1pc3Npb24BAQUkTm9EZXBvc2l0AQEFJEJhZFN0YXR1cwEBBUBQcmVpbWFnZU5vdEV4aXN0AQEFhFByZWltYWdlU3RvcmVkV2l0aERpZmZlcmVudExlbmd0aAEBBQIUTFVuYXZhaWxhYmxlUHJlSW1hZ2UBAQU8VW5kZWNvZGFibGVDYWxsAQEFYEludmFsaWRDYWxsV2VpZ2h0V2l0bmVzcwEBBVBDYWxsSXNOb3RXaGl0ZWxpc3RlZAEBBVhDYWxsQWxyZWFkeVdoaXRlbGlzdGVkAQEFAhhgSW52YWxpZEV0aGVyZXVtU2lnbmF0dXJlAQEFQFNpZ25lckhhc05vQ2xhaW0BAQVAU2VuZGVySGFzTm9DbGFpbQEBBTBQb3RVbmRlcmZsb3cBAQVASW52YWxpZFN0YXRlbWVudAEBBUxWZXN0ZWRCYWxhbmNlRXhpc3RzAQEFAhQoTm90VmVzdGluZwEBBVRBdE1heFZlc3RpbmdTY2hlZHVsZXMBAQUkQW1vdW50TG93AQEFYFNjaGVkdWxlSW5kZXhPdXRPZkJvdW5kcwEBBVRJbnZhbGlkU2NoZWR1bGVQYXJhbXMBAQUCBDBUb29NYW55Q2FsbHMBAQUCIBxUb29NYW55AQEFIE5vdEZvdW5kAQEFIE5vdFByb3h5AQEFLFVucHJveHlhYmxlAQEFJER1cGxpY2F0ZQEBBTBOb1Blcm1pc3Npb24BAQUsVW5hbm5vdW5jZWQBAQUsTm9TZWxmUHJveHkBAQUCOEBNaW5pbXVtVGhyZXNob2xkAQEFPEFscmVhZHlBcHByb3ZlZAEBBUROb0FwcHJvdmFsc05lZWRlZAEBBURUb29GZXdTaWduYXRvcmllcwEBBUhUb29NYW55U2lnbmF0b3JpZXMBAQVUU2lnbmF0b3JpZXNPdXRPZk9yZGVyAQEFTFNlbmRlckluU2lnbmF0b3JpZXMBAQUgTm90Rm91bmQBAQUgTm90T3duZXIBAQUsTm9UaW1lcG9pbnQBAQU4V3JvbmdUaW1lcG9pbnQBAQVMVW5leHBlY3RlZFRpbWVwb2ludAEBBTxNYXhXZWlnaHRUb29Mb3cBAQU0QWxyZWFkeVN0b3JlZAEBBQIscEluc3VmZmljaWVudFByb3Bvc2Vyc0JhbGFuY2UBAQUwSW52YWxpZEluZGV4AQEFMFJlYXNvblRvb0JpZwEBBUBVbmV4cGVjdGVkU3RhdHVzAQEFOFJlcXVpcmVDdXJhdG9yAQEFMEludmFsaWRWYWx1ZQEBBShJbnZhbGlkRmVlAQEFNFBlbmRpbmdQYXlvdXQBAQUkUHJlbWF0dXJlAQEFUEhhc0FjdGl2ZUNoaWxkQm91bnR5AQEFNFRvb01hbnlRdWV1ZWQBAQUCDFRQYXJlbnRCb3VudHlOb3RBY3RpdmUBAQVkSW5zdWZmaWNpZW50Qm91bnR5QmFsYW5jZQEBBVBUb29NYW55Q2hpbGRCb3VudGllcwEBBQI8aFByZURpc3BhdGNoRWFybHlTdWJtaXNzaW9uAQEFbFByZURpc3BhdGNoV3JvbmdXaW5uZXJDb3VudAEBBWRQcmVEaXNwYXRjaFdlYWtTdWJtaXNzaW9uAQEFPFNpZ25lZFF1ZXVlRnVsbAEBBVhTaWduZWRDYW5ub3RQYXlEZXBvc2l0AQEFUFNpZ25lZEludmFsaWRXaXRuZXNzAQEFTFNpZ25lZFRvb011Y2hXZWlnaHQBAQU8T2N3Q2FsbFdyb25nRXJhAQEFXE1pc3NpbmdTbmFwc2hvdE1ldGFkYXRhAQEFWEludmFsaWRTdWJtaXNzaW9uSW5kZXgBAQU4Q2FsbE5vdEFsbG93ZWQBAQU4RmFsbGJhY2tGYWlsZWQBAQUsQm91bmROb3RNZXQBAQU4VG9vTWFueVdpbm5lcnMBAQVkUHJlRGlzcGF0Y2hEaWZmZXJlbnRSb3VuZAEBBQIQJER1cGxpY2F0ZQEBBShOb3RIZWF2aWVyAQEFME5vdEluU2FtZUJhZwEBBTBOb2RlTm90Rm91bmQBAQUCBBBMaXN0AQIQJER1cGxpY2F0ZQEBBShOb3RIZWF2aWVyAQEFME5vdEluU2FtZUJhZwEBBTBOb2RlTm90Rm91bmQBAQUCHGhOb3RFbm91Z2hTcGFjZUluVW5ib25kUG9vbAEBBTBQb29sTm90Rm91bmQBAQVIUmV3YXJkUG9vbE5vdEZvdW5kAQEFQFN1YlBvb2xzTm90Rm91bmQBAQVwQm9uZGVkU3Rhc2hLaWxsZWRQcmVtYXR1cmVseQEBBVREZWxlZ2F0aW9uVW5zdXBwb3J0ZWQBAQU8U2xhc2hOb3RBcHBsaWVkAQEFApAwUG9vbE5vdEZvdW5kAQEFSFBvb2xNZW1iZXJOb3RGb3VuZAEBBUhSZXdhcmRQb29sTm90Rm91bmQBAQVAU3ViUG9vbHNOb3RGb3VuZAEBBWRBY2NvdW50QmVsb25nc1RvT3RoZXJQb29sAQEFOEZ1bGx5VW5ib25kaW5nAQEFRE1heFVuYm9uZGluZ0xpbWl0AQEFRENhbm5vdFdpdGhkcmF3QW55AQEFRE1pbmltdW1Cb25kTm90TWV0AQEFME92ZXJmbG93UmlzawEBBTROb3REZXN0cm95aW5nAQEFME5vdE5vbWluYXRvcgEBBVROb3RLaWNrZXJPckRlc3Ryb3lpbmcBAQUcTm90T3BlbgEBBSBNYXhQb29scwEBBThNYXhQb29sTWVtYmVycwEBBURDYW5Ob3RDaGFuZ2VTdGF0ZQEBBVREb2VzTm90SGF2ZVBlcm1pc3Npb24BAQVUTWV0YWRhdGFFeGNlZWRzTWF4TGVuAQEFJERlZmVuc2l2ZQECHGhOb3RFbm91Z2hTcGFjZUluVW5ib25kUG9vbAEBBTBQb29sTm90Rm91bmQBAQVIUmV3YXJkUG9vbE5vdEZvdW5kAQEFQFN1YlBvb2xzTm90Rm91bmQBAQVwQm9uZGVkU3Rhc2hLaWxsZWRQcmVtYXR1cmVseQEBBVREZWxlZ2F0aW9uVW5zdXBwb3J0ZWQBAQU8U2xhc2hOb3RBcHBsaWVkAQEFnFBhcnRpYWxVbmJvbmROb3RBbGxvd2VkUGVybWlzc2lvbmxlc3NseQEBBVxNYXhDb21taXNzaW9uUmVzdHJpY3RlZAEBBWBDb21taXNzaW9uRXhjZWVkc01heGltdW0BAQV4Q29tbWlzc2lvbkV4Y2VlZHNHbG9iYWxNYXhpbXVtAQEFZENvbW1pc3Npb25DaGFuZ2VUaHJvdHRsZWQBAQV4Q29tbWlzc2lvbkNoYW5nZVJhdGVOb3RBbGxvd2VkAQEFTE5vUGVuZGluZ0NvbW1pc3Npb24BAQVYTm9Db21taXNzaW9uQ3VycmVudFNldAEBBSxQb29sSWRJblVzZQEBBTRJbnZhbGlkUG9vbElkAQEFTEJvbmRFeHRyYVJlc3RyaWN0ZWQBAQU8Tm90aGluZ1RvQWRqdXN0AQEFOE5vdGhpbmdUb1NsYXNoAQEFPEFscmVhZHlNaWdyYXRlZAEBBSxOb3RNaWdyYXRlZAEBBTBOb3RTdXBwb3J0ZWQBAQUCGDROb3RDb250cm9sbGVyAQEFNEFscmVhZHlRdWV1ZWQBAQU4Tm90RnVsbHlCb25kZWQBAQUkTm90UXVldWVkAQEFLEFscmVhZHlIZWFkAQEFOENhbGxOb3RBbGxvd2VkAQEFAgQ8SW52YWxpZE5ld1ZhbHVlAQEFAkhkVmFsaWRhdG9ySW5kZXhPdXRPZkJvdW5kcwEBBVBVbnNjaGVkdWxlZENhbmRpZGF0ZQEBBUBIZWFkRGF0YVRvb0xhcmdlAQEFUFByZW1hdHVyZUNvZGVVcGdyYWRlAQEFPE5ld0NvZGVUb29MYXJnZQEBBVREaXNhbGxvd2VkUmVsYXlQYXJlbnQBAQVESW52YWxpZEFzc2lnbm1lbnQBAQVESW52YWxpZEdyb3VwSW5kZXgBAQVMSW5zdWZmaWNpZW50QmFja2luZwEBBThJbnZhbGlkQmFja2luZwEBBUROb3RDb2xsYXRvclNpZ25lZAEBBWhWYWxpZGF0aW9uRGF0YUhhc2hNaXNtYXRjaAEBBYBJbmNvcnJlY3REb3dud2FyZE1lc3NhZ2VIYW5kbGluZwEBBVRJbnZhbGlkVXB3YXJkTWVzc2FnZXMBAQVgSHJtcFdhdGVybWFya01pc2hhbmRsaW5nAQEFTEludmFsaWRPdXRib3VuZEhybXABAQVkSW52YWxpZFZhbGlkYXRpb25Db2RlSGFzaAEBBUBQYXJhSGVhZE1pc21hdGNoAQEFAhRkVG9vTWFueUluY2x1c2lvbkluaGVyZW50cwEBBUxJbnZhbGlkUGFyZW50SGVhZGVyAQEFSEluaGVyZW50T3ZlcndlaWdodAEBBYRDYW5kaWRhdGVzRmlsdGVyZWREdXJpbmdFeGVjdXRpb24BAQVQVW5zY2hlZHVsZWRDYW5kaWRhdGUBAQUCNDROb3RSZWdpc3RlcmVkAQEFNENhbm5vdE9uYm9hcmQBAQU4Q2Fubm90T2ZmYm9hcmQBAQU0Q2Fubm90VXBncmFkZQEBBTxDYW5ub3REb3duZ3JhZGUBAQVYUHZmQ2hlY2tTdGF0ZW1lbnRTdGFsZQEBBVxQdmZDaGVja1N0YXRlbWVudEZ1dHVyZQEBBYRQdmZDaGVja1ZhbGlkYXRvckluZGV4T3V0T2ZCb3VuZHMBAQVgUHZmQ2hlY2tJbnZhbGlkU2lnbmF0dXJlAQEFSFB2ZkNoZWNrRG91YmxlVm90ZQEBBVhQdmZDaGVja1N1YmplY3RJbnZhbGlkAQEFRENhbm5vdFVwZ3JhZGVDb2RlAQEFLEludmFsaWRDb2RlAQEFAlBUT3BlbkhybXBDaGFubmVsVG9TZWxmAQEFfE9wZW5Icm1wQ2hhbm5lbEludmFsaWRSZWNpcGllbnQBAQVsT3BlbkhybXBDaGFubmVsWmVyb0NhcGFjaXR5AQEFjE9wZW5Icm1wQ2hhbm5lbENhcGFjaXR5RXhjZWVkc0xpbWl0AQEFeE9wZW5Icm1wQ2hhbm5lbFplcm9NZXNzYWdlU2l6ZQEBBZhPcGVuSHJtcENoYW5uZWxNZXNzYWdlU2l6ZUV4Y2VlZHNMaW1pdAEBBXBPcGVuSHJtcENoYW5uZWxBbHJlYWR5RXhpc3RzAQEFfE9wZW5Icm1wQ2hhbm5lbEFscmVhZHlSZXF1ZXN0ZWQBAQVwT3BlbkhybXBDaGFubmVsTGltaXRFeGNlZWRlZAEBBXBBY2NlcHRIcm1wQ2hhbm5lbERvZXNudEV4aXN0AQEFhEFjY2VwdEhybXBDaGFubmVsQWxyZWFkeUNvbmZpcm1lZAEBBXhBY2NlcHRIcm1wQ2hhbm5lbExpbWl0RXhjZWVkZWQBAQVwQ2xvc2VIcm1wQ2hhbm5lbFVuYXV0aG9yaXplZAEBBWxDbG9zZUhybXBDaGFubmVsRG9lc250RXhpc3QBAQV8Q2xvc2VIcm1wQ2hhbm5lbEFscmVhZHlVbmRlcndheQEBBYRDYW5jZWxIcm1wT3BlbkNoYW5uZWxVbmF1dGhvcml6ZWQBAQVoT3BlbkhybXBDaGFubmVsRG9lc250RXhpc3QBAQV8T3BlbkhybXBDaGFubmVsQWxyZWFkeUNvbmZpcm1lZAEBBTBXcm9uZ1dpdG5lc3MBAQVwQ2hhbm5lbENyZWF0aW9uTm90QXV0aG9yaXplZAEBBQIkdER1cGxpY2F0ZURpc3B1dGVTdGF0ZW1lbnRTZXRzAQEFXEFuY2llbnREaXNwdXRlU3RhdGVtZW50AQEFZFZhbGlkYXRvckluZGV4T3V0T2ZCb3VuZHMBAQVASW52YWxpZFNpZ25hdHVyZQEBBUhEdXBsaWNhdGVTdGF0ZW1lbnQBAQVIU2luZ2xlU2lkZWREaXNwdXRlAQEFPE1hbGljaW91c0JhY2tlcgEBBUxNaXNzaW5nQmFja2luZ1ZvdGVzAQEFSFVuY29uZmlybWVkRGlzcHV0ZQEBBQIYYEludmFsaWRLZXlPd25lcnNoaXBQcm9vZgEBBUxJbnZhbGlkU2Vzc2lvbkluZGV4AQEFUEludmFsaWRDYW5kaWRhdGVIYXNoAQEFVEludmFsaWRWYWxpZGF0b3JJbmRleAEBBWBWYWxpZGF0b3JJbmRleElkTWlzbWF0Y2gBAQVcRHVwbGljYXRlU2xhc2hpbmdSZXBvcnQBAQUCCCRRdWV1ZUZ1bGwBAQVwU3BvdFByaWNlSGlnaGVyVGhhbk1heEFtb3VudAEBBQIYQEFzc2lnbm1lbnRzRW1wdHkBAQU0T3ZlclNjaGVkdWxlZAEBBThVbmRlclNjaGVkdWxlZAEBBUBEaXNhbGxvd2VkSW5zZXJ0AQEFPER1cGxpY2F0ZUluc2VydAEBBVBBc3NpZ25tZW50c05vdFNvcnRlZAEBBQI4NE5vdFJlZ2lzdGVyZWQBAQVEQWxyZWFkeVJlZ2lzdGVyZWQBAQUgTm90T3duZXIBAQUwQ29kZVRvb0xhcmdlAQEFQEhlYWREYXRhVG9vTGFyZ2UBAQUwTm90UGFyYWNoYWluAQEFNE5vdFBhcmF0aHJlYWQBAQVAQ2Fubm90RGVyZWdpc3RlcgEBBTxDYW5ub3REb3duZ3JhZGUBAQU0Q2Fubm90VXBncmFkZQEBBShQYXJhTG9ja2VkAQEFLE5vdFJlc2VydmVkAQEFLEludmFsaWRDb2RlAQEFKENhbm5vdFN3YXABAQUCCERQYXJhTm90T25ib2FyZGluZwEBBShMZWFzZUVycm9yAQEFAhxEQXVjdGlvbkluUHJvZ3Jlc3MBAQVETGVhc2VQZXJpb2RJblBhc3QBAQVEUGFyYU5vdFJlZ2lzdGVyZWQBAQVETm90Q3VycmVudEF1Y3Rpb24BAQUoTm90QXVjdGlvbgEBBTBBdWN0aW9uRW5kZWQBAQVAQWxyZWFkeUxlYXNlZE91dAEBBQJcREZpcnN0UGVyaW9kSW5QYXN0AQEFZEZpcnN0UGVyaW9kVG9vRmFySW5GdXR1cmUBAQVsTGFzdFBlcmlvZEJlZm9yZUZpcnN0UGVyaW9kAQEFYExhc3RQZXJpb2RUb29GYXJJbkZ1dHVyZQEBBTxDYW5ub3RFbmRJblBhc3QBAQVERW5kVG9vRmFySW5GdXR1cmUBAQUgT3ZlcmZsb3cBAQVQQ29udHJpYnV0aW9uVG9vU21hbGwBAQU0SW52YWxpZFBhcmFJZAEBBSxDYXBFeGNlZWRlZAEBBVhDb250cmlidXRpb25QZXJpb2RPdmVyAQEFNEludmFsaWRPcmlnaW4BAQUwTm90UGFyYWNoYWluAQEFLExlYXNlQWN0aXZlAQEFQEJpZE9yTGVhc2VBY3RpdmUBAQUwRnVuZE5vdEVuZGVkAQEFPE5vQ29udHJpYnV0aW9ucwEBBUhOb3RSZWFkeVRvRGlzc29sdmUBAQVASW52YWxpZFNpZ25hdHVyZQEBBTBNZW1vVG9vTGFyZ2UBAQVEQWxyZWFkeUluTmV3UmFpc2UBAQVIVnJmRGVsYXlJblByb2dyZXNzAQEFNE5vTGVhc2VQZXJpb2QBAQUCDCROb3RCcm9rZXIBAQVYUmVxdWVzdGVkRnV0dXJlUmV2ZW51ZQEBBUxBc3NldFRyYW5zZmVyRmFpbGVkAQEFAhg8TWF4U2lnbmVkTGltaXRzAQEFKEtleVRvb0xvbmcBAQU4Tm90RW5vdWdoRnVuZHMBAQUoQmFkV2l0bmVzcwEBBWRTaWduZWRNaWdyYXRpb25Ob3RBbGxvd2VkAQEFMEJhZENoaWxkUm9vdAEBBQJgLFVucmVhY2hhYmxlAQEFLFNlbmRGYWlsdXJlAQEFIEZpbHRlcmVkAQEFSFVud2VpZ2hhYmxlTWVzc2FnZQEBBWBEZXN0aW5hdGlvbk5vdEludmVydGlibGUBAQUURW1wdHkBAQU4Q2Fubm90UmVhbmNob3IBAQU0VG9vTWFueUFzc2V0cwEBBTRJbnZhbGlkT3JpZ2luAQEFKEJhZFZlcnNpb24BAQUsQmFkTG9jYXRpb24BAQU4Tm9TdWJzY3JpcHRpb24BAQVEQWxyZWFkeVN1YnNjcmliZWQBAQVYQ2Fubm90Q2hlY2tPdXRUZWxlcG9ydAEBBShMb3dCYWxhbmNlAQEFMFRvb01hbnlMb2NrcwEBBUxBY2NvdW50Tm90U292ZXJlaWduAQEFKEZlZXNOb3RNZXQBAQUwTG9ja05vdEZvdW5kAQEFFEluVXNlAQEFaEludmFsaWRBc3NldFVua25vd25SZXNlcnZlAQEFeEludmFsaWRBc3NldFVuc3VwcG9ydGVkUmVzZXJ2ZQEBBTxUb29NYW55UmVzZXJ2ZXMBAQVgTG9jYWxFeGVjdXRpb25JbmNvbXBsZXRlAQEFAiQsTm90UmVhcGFibGUBAQUYTm9QYWdlAQEFJE5vTWVzc2FnZQEBBUBBbHJlYWR5UHJvY2Vzc2VkAQEFGFF1ZXVlZAEBBUhJbnN1ZmZpY2llbnRXZWlnaHQBAQVgVGVtcG9yYXJpbHlVbnByb2Nlc3NhYmxlAQEFLFF1ZXVlUGF1c2VkAQEFTFJlY3Vyc2l2ZURpc2FsbG93ZWQBAQUCDEBVbmtub3duQXNzZXRLaW5kAQEFNEFscmVhZHlFeGlzdHMBAQUgT3ZlcmZsb3cBAQUC7BhTeXN0ZW0BAiQ8SW52YWxpZFNwZWNOYW1lAQEFaFNwZWNWZXJzaW9uTmVlZHNUb0luY3JlYXNlAQEFdEZhaWxlZFRvRXh0cmFjdFJ1bnRpbWVWZXJzaW9uAQEFTE5vbkRlZmF1bHRDb21wb3NpdGUBAQU8Tm9uWmVyb1JlZkNvdW50AQEFMENhbGxGaWx0ZXJlZAEBBWxNdWx0aUJsb2NrTWlncmF0aW9uc09uZ29pbmcBAQVETm90aGluZ0F1dGhvcml6ZWQBAQUwVW5hdXRob3JpemVkAQEFJFNjaGVkdWxlcgECFEBGYWlsZWRUb1NjaGVkdWxlAQEFIE5vdEZvdW5kAQEFXFRhcmdldEJsb2NrTnVtYmVySW5QYXN0AQEFSFJlc2NoZWR1bGVOb0NoYW5nZQEBBRROYW1lZAEBBSBQcmVpbWFnZQECJBhUb29CaWcBAQUwQWxyZWFkeU5vdGVkAQEFNE5vdEF1dGhvcml6ZWQBAQUgTm90Tm90ZWQBAQUkUmVxdWVzdGVkAQEFME5vdFJlcXVlc3RlZAEBBRxUb29NYW55AQEFGFRvb0ZldwEBBRhOb0Nvc3QBAQUQQmFiZQECEGBJbnZhbGlkRXF1aXZvY2F0aW9uUHJvb2YBAQVgSW52YWxpZEtleU93bmVyc2hpcFByb29mAQEFWER1cGxpY2F0ZU9mZmVuY2VSZXBvcnQBAQVQSW52YWxpZENvbmZpZ3VyYXRpb24BAQUkVGltZXN0YW1wAQEFHEluZGljZXMBAhQsTm90QXNzaWduZWQBAQUgTm90T3duZXIBAQUUSW5Vc2UBAQUsTm90VHJhbnNmZXIBAQUkUGVybWFuZW50AQEFIEJhbGFuY2VzAQIwOFZlc3RpbmdCYWxhbmNlAQEFVExpcXVpZGl0eVJlc3RyaWN0aW9ucwEBBUxJbnN1ZmZpY2llbnRCYWxhbmNlAQEFSEV4aXN0ZW50aWFsRGVwb3NpdAEBBTRFeHBlbmRhYmlsaXR5AQEFXEV4aXN0aW5nVmVzdGluZ1NjaGVkdWxlAQEFLERlYWRBY2NvdW50AQEFPFRvb01hbnlSZXNlcnZlcwEBBTBUb29NYW55SG9sZHMBAQU4VG9vTWFueUZyZWV6ZXMBAQVMSXNzdWFuY2VEZWFjdGl2YXRlZAEBBSREZWx0YVplcm8BAQVIVHJhbnNhY3Rpb25QYXltZW50AQEFKEF1dGhvcnNoaXABAQUcU3Rha2luZwECfDROb3RDb250cm9sbGVyAQEFIE5vdFN0YXNoAQEFNEFscmVhZHlCb25kZWQBAQU0QWxyZWFkeVBhaXJlZAEBBTBFbXB0eVRhcmdldHMBAQU4RHVwbGljYXRlSW5kZXgBAQVESW52YWxpZFNsYXNoSW5kZXgBAQVASW5zdWZmaWNpZW50Qm9uZAEBBTBOb01vcmVDaHVua3MBAQU0Tm9VbmxvY2tDaHVuawEBBTBGdW5kZWRUYXJnZXQBAQVISW52YWxpZEVyYVRvUmV3YXJkAQEFaEludmFsaWROdW1iZXJPZk5vbWluYXRpb25zAQEFSE5vdFNvcnRlZEFuZFVuaXF1ZQEBBThBbHJlYWR5Q2xhaW1lZAEBBSxJbnZhbGlkUGFnZQEBBVRJbmNvcnJlY3RIaXN0b3J5RGVwdGgBAQVYSW5jb3JyZWN0U2xhc2hpbmdTcGFucwEBBSBCYWRTdGF0ZQEBBThUb29NYW55VGFyZ2V0cwEBBSRCYWRUYXJnZXQBAQVAQ2Fubm90Q2hpbGxPdGhlcgEBBURUb29NYW55Tm9taW5hdG9ycwEBBURUb29NYW55VmFsaWRhdG9ycwEBBUBDb21taXNzaW9uVG9vTG93AQEFLEJvdW5kTm90TWV0AQEFUENvbnRyb2xsZXJEZXByZWNhdGVkAQEFTENhbm5vdFJlc3RvcmVMZWRnZXIBAQVsUmV3YXJkRGVzdGluYXRpb25SZXN0cmljdGVkAQEFOE5vdEVub3VnaEZ1bmRzAQEFXFZpcnR1YWxTdGFrZXJOb3RBbGxvd2VkAQEFIE9mZmVuY2VzAQEFKEhpc3RvcmljYWwBAQUcU2Vzc2lvbgECFDBJbnZhbGlkUHJvb2YBAQVcTm9Bc3NvY2lhdGVkVmFsaWRhdG9ySWQBAQU0RHVwbGljYXRlZEtleQEBBRhOb0tleXMBAQUkTm9BY2NvdW50AQEFHEdyYW5kcGEBAhwsUGF1c2VGYWlsZWQBAQUwUmVzdW1lRmFpbGVkAQEFNENoYW5nZVBlbmRpbmcBAQUcVG9vU29vbgEBBWBJbnZhbGlkS2V5T3duZXJzaGlwUHJvb2YBAQVgSW52YWxpZEVxdWl2b2NhdGlvblByb29mAQEFWER1cGxpY2F0ZU9mZmVuY2VSZXBvcnQBAQVIQXV0aG9yaXR5RGlzY292ZXJ5AQEFIFRyZWFzdXJ5AQIsMEludmFsaWRJbmRleAEBBUBUb29NYW55QXBwcm92YWxzAQEFWEluc3VmZmljaWVudFBlcm1pc3Npb24BAQVMUHJvcG9zYWxOb3RBcHByb3ZlZAEBBVhGYWlsZWRUb0NvbnZlcnRCYWxhbmNlAQEFMFNwZW5kRXhwaXJlZAEBBSxFYXJseVBheW91dAEBBUBBbHJlYWR5QXR0ZW1wdGVkAQEFLFBheW91dEVycm9yAQEFME5vdEF0dGVtcHRlZAEBBTBJbmNvbmNsdXNpdmUBAQVAQ29udmljdGlvblZvdGluZwECMChOb3RPbmdvaW5nAQEFIE5vdFZvdGVyAQEFME5vUGVybWlzc2lvbgEBBTxOb1Blcm1pc3Npb25ZZXQBAQVEQWxyZWFkeURlbGVnYXRpbmcBAQU0QWxyZWFkeVZvdGluZwEBBURJbnN1ZmZpY2llbnRGdW5kcwEBBTROb3REZWxlZ2F0aW5nAQEFIE5vbnNlbnNlAQEFPE1heFZvdGVzUmVhY2hlZAEBBSxDbGFzc05lZWRlZAEBBSBCYWRDbGFzcwEBBSRSZWZlcmVuZGEBAjgoTm90T25nb2luZwEBBShIYXNEZXBvc2l0AQEFIEJhZFRyYWNrAQEFEEZ1bGwBAQUoUXVldWVFbXB0eQEBBTRCYWRSZWZlcmVuZHVtAQEFLE5vdGhpbmdUb0RvAQEFHE5vVHJhY2sBAQUoVW5maW5pc2hlZAEBBTBOb1Blcm1pc3Npb24BAQUkTm9EZXBvc2l0AQEFJEJhZFN0YXR1cwEBBUBQcmVpbWFnZU5vdEV4aXN0AQEFhFByZWltYWdlU3RvcmVkV2l0aERpZmZlcmVudExlbmd0aAEBBRxPcmlnaW5zAQEFJFdoaXRlbGlzdAECFExVbmF2YWlsYWJsZVByZUltYWdlAQEFPFVuZGVjb2RhYmxlQ2FsbAEBBWBJbnZhbGlkQ2FsbFdlaWdodFdpdG5lc3MBAQVQQ2FsbElzTm90V2hpdGVsaXN0ZWQBAQVYQ2FsbEFscmVhZHlXaGl0ZWxpc3RlZAEBBShQYXJhbWV0ZXJzAQEFGENsYWltcwECGGBJbnZhbGlkRXRoZXJldW1TaWduYXR1cmUBAQVAU2lnbmVySGFzTm9DbGFpbQEBBUBTZW5kZXJIYXNOb0NsYWltAQEFMFBvdFVuZGVyZmxvdwEBBUBJbnZhbGlkU3RhdGVtZW50AQEFTFZlc3RlZEJhbGFuY2VFeGlzdHMBAQUcVmVzdGluZwECFChOb3RWZXN0aW5nAQEFVEF0TWF4VmVzdGluZ1NjaGVkdWxlcwEBBSRBbW91bnRMb3cBAQVgU2NoZWR1bGVJbmRleE91dE9mQm91bmRzAQEFVEludmFsaWRTY2hlZHVsZVBhcmFtcwEBBRxVdGlsaXR5AQIEMFRvb01hbnlDYWxscwEBBRRQcm94eQECIBxUb29NYW55AQEFIE5vdEZvdW5kAQEFIE5vdFByb3h5AQEFLFVucHJveHlhYmxlAQEFJER1cGxpY2F0ZQEBBTBOb1Blcm1pc3Npb24BAQUsVW5hbm5vdW5jZWQBAQUsTm9TZWxmUHJveHkBAQUgTXVsdGlzaWcBAjhATWluaW11bVRocmVzaG9sZAEBBTxBbHJlYWR5QXBwcm92ZWQBAQVETm9BcHByb3ZhbHNOZWVkZWQBAQVEVG9vRmV3U2lnbmF0b3JpZXMBAQVIVG9vTWFueVNpZ25hdG9yaWVzAQEFVFNpZ25hdG9yaWVzT3V0T2ZPcmRlcgEBBUxTZW5kZXJJblNpZ25hdG9yaWVzAQEFIE5vdEZvdW5kAQEFIE5vdE93bmVyAQEFLE5vVGltZXBvaW50AQEFOFdyb25nVGltZXBvaW50AQEFTFVuZXhwZWN0ZWRUaW1lcG9pbnQBAQU8TWF4V2VpZ2h0VG9vTG93AQEFNEFscmVhZHlTdG9yZWQBAQUgQm91bnRpZXMBAixwSW5zdWZmaWNpZW50UHJvcG9zZXJzQmFsYW5jZQEBBTBJbnZhbGlkSW5kZXgBAQUwUmVhc29uVG9vQmlnAQEFQFVuZXhwZWN0ZWRTdGF0dXMBAQU4UmVxdWlyZUN1cmF0b3IBAQUwSW52YWxpZFZhbHVlAQEFKEludmFsaWRGZWUBAQU0UGVuZGluZ1BheW91dAEBBSRQcmVtYXR1cmUBAQVQSGFzQWN0aXZlQ2hpbGRCb3VudHkBAQU0VG9vTWFueVF1ZXVlZAEBBTRDaGlsZEJvdW50aWVzAQIMVFBhcmVudEJvdW50eU5vdEFjdGl2ZQEBBWRJbnN1ZmZpY2llbnRCb3VudHlCYWxhbmNlAQEFUFRvb01hbnlDaGlsZEJvdW50aWVzAQEFaEVsZWN0aW9uUHJvdmlkZXJNdWx0aVBoYXNlAQI8aFByZURpc3BhdGNoRWFybHlTdWJtaXNzaW9uAQEFbFByZURpc3BhdGNoV3JvbmdXaW5uZXJDb3VudAEBBWRQcmVEaXNwYXRjaFdlYWtTdWJtaXNzaW9uAQEFPFNpZ25lZFF1ZXVlRnVsbAEBBVhTaWduZWRDYW5ub3RQYXlEZXBvc2l0AQEFUFNpZ25lZEludmFsaWRXaXRuZXNzAQEFTFNpZ25lZFRvb011Y2hXZWlnaHQBAQU8T2N3Q2FsbFdyb25nRXJhAQEFXE1pc3NpbmdTbmFwc2hvdE1ldGFkYXRhAQEFWEludmFsaWRTdWJtaXNzaW9uSW5kZXgBAQU4Q2FsbE5vdEFsbG93ZWQBAQU4RmFsbGJhY2tGYWlsZWQBAQUsQm91bmROb3RNZXQBAQU4VG9vTWFueVdpbm5lcnMBAQVkUHJlRGlzcGF0Y2hEaWZmZXJlbnRSb3VuZAEBBSRWb3Rlckxpc3QBAgQQTGlzdAECECREdXBsaWNhdGUBAQUoTm90SGVhdmllcgEBBTBOb3RJblNhbWVCYWcBAQUwTm9kZU5vdEZvdW5kAQEFPE5vbWluYXRpb25Qb29scwECkDBQb29sTm90Rm91bmQBAQVIUG9vbE1lbWJlck5vdEZvdW5kAQEFSFJld2FyZFBvb2xOb3RGb3VuZAEBBUBTdWJQb29sc05vdEZvdW5kAQEFZEFjY291bnRCZWxvbmdzVG9PdGhlclBvb2wBAQU4RnVsbHlVbmJvbmRpbmcBAQVETWF4VW5ib25kaW5nTGltaXQBAQVEQ2Fubm90V2l0aGRyYXdBbnkBAQVETWluaW11bUJvbmROb3RNZXQBAQUwT3ZlcmZsb3dSaXNrAQEFNE5vdERlc3Ryb3lpbmcBAQUwTm90Tm9taW5hdG9yAQEFVE5vdEtpY2tlck9yRGVzdHJveWluZwEBBRxOb3RPcGVuAQEFIE1heFBvb2xzAQEFOE1heFBvb2xNZW1iZXJzAQEFRENhbk5vdENoYW5nZVN0YXRlAQEFVERvZXNOb3RIYXZlUGVybWlzc2lvbgEBBVRNZXRhZGF0YUV4Y2VlZHNNYXhMZW4BAQUkRGVmZW5zaXZlAQIcaE5vdEVub3VnaFNwYWNlSW5VbmJvbmRQb29sAQEFMFBvb2xOb3RGb3VuZAEBBUhSZXdhcmRQb29sTm90Rm91bmQBAQVAU3ViUG9vbHNOb3RGb3VuZAEBBXBCb25kZWRTdGFzaEtpbGxlZFByZW1hdHVyZWx5AQEFVERlbGVnYXRpb25VbnN1cHBvcnRlZAEBBTxTbGFzaE5vdEFwcGxpZWQBAQWcUGFydGlhbFVuYm9uZE5vdEFsbG93ZWRQZXJtaXNzaW9ubGVzc2x5AQEFXE1heENvbW1pc3Npb25SZXN0cmljdGVkAQEFYENvbW1pc3Npb25FeGNlZWRzTWF4aW11bQEBBXhDb21taXNzaW9uRXhjZWVkc0dsb2JhbE1heGltdW0BAQVkQ29tbWlzc2lvbkNoYW5nZVRocm90dGxlZAEBBXhDb21taXNzaW9uQ2hhbmdlUmF0ZU5vdEFsbG93ZWQBAQVMTm9QZW5kaW5nQ29tbWlzc2lvbgEBBVhOb0NvbW1pc3Npb25DdXJyZW50U2V0AQEFLFBvb2xJZEluVXNlAQEFNEludmFsaWRQb29sSWQBAQVMQm9uZEV4dHJhUmVzdHJpY3RlZAEBBTxOb3RoaW5nVG9BZGp1c3QBAQU4Tm90aGluZ1RvU2xhc2gBAQU8QWxyZWFkeU1pZ3JhdGVkAQEFLE5vdE1pZ3JhdGVkAQEFME5vdFN1cHBvcnRlZAEBBSxGYXN0VW5zdGFrZQECGDROb3RDb250cm9sbGVyAQEFNEFscmVhZHlRdWV1ZWQBAQU4Tm90RnVsbHlCb25kZWQBAQUkTm90UXVldWVkAQEFLEFscmVhZHlIZWFkAQEFOENhbGxOb3RBbGxvd2VkAQEFQFBhcmFjaGFpbnNPcmlnaW4BAQU0Q29uZmlndXJhdGlvbgECBDxJbnZhbGlkTmV3VmFsdWUBAQUsUGFyYXNTaGFyZWQBAQU0UGFyYUluY2x1c2lvbgECSGRWYWxpZGF0b3JJbmRleE91dE9mQm91bmRzAQEFUFVuc2NoZWR1bGVkQ2FuZGlkYXRlAQEFQEhlYWREYXRhVG9vTGFyZ2UBAQVQUHJlbWF0dXJlQ29kZVVwZ3JhZGUBAQU8TmV3Q29kZVRvb0xhcmdlAQEFVERpc2FsbG93ZWRSZWxheVBhcmVudAEBBURJbnZhbGlkQXNzaWdubWVudAEBBURJbnZhbGlkR3JvdXBJbmRleAEBBUxJbnN1ZmZpY2llbnRCYWNraW5nAQEFOEludmFsaWRCYWNraW5nAQEFRE5vdENvbGxhdG9yU2lnbmVkAQEFaFZhbGlkYXRpb25EYXRhSGFzaE1pc21hdGNoAQEFgEluY29ycmVjdERvd253YXJkTWVzc2FnZUhhbmRsaW5nAQEFVEludmFsaWRVcHdhcmRNZXNzYWdlcwEBBWBIcm1wV2F0ZXJtYXJrTWlzaGFuZGxpbmcBAQVMSW52YWxpZE91dGJvdW5kSHJtcAEBBWRJbnZhbGlkVmFsaWRhdGlvbkNvZGVIYXNoAQEFQFBhcmFIZWFkTWlzbWF0Y2gBAQUwUGFyYUluaGVyZW50AQIUZFRvb01hbnlJbmNsdXNpb25JbmhlcmVudHMBAQVMSW52YWxpZFBhcmVudEhlYWRlcgEBBUhJbmhlcmVudE92ZXJ3ZWlnaHQBAQWEQ2FuZGlkYXRlc0ZpbHRlcmVkRHVyaW5nRXhlY3V0aW9uAQEFUFVuc2NoZWR1bGVkQ2FuZGlkYXRlAQEFNFBhcmFTY2hlZHVsZXIBAQUUUGFyYXMBAjQ0Tm90UmVnaXN0ZXJlZAEBBTRDYW5ub3RPbmJvYXJkAQEFOENhbm5vdE9mZmJvYXJkAQEFNENhbm5vdFVwZ3JhZGUBAQU8Q2Fubm90RG93bmdyYWRlAQEFWFB2ZkNoZWNrU3RhdGVtZW50U3RhbGUBAQVcUHZmQ2hlY2tTdGF0ZW1lbnRGdXR1cmUBAQWEUHZmQ2hlY2tWYWxpZGF0b3JJbmRleE91dE9mQm91bmRzAQEFYFB2ZkNoZWNrSW52YWxpZFNpZ25hdHVyZQEBBUhQdmZDaGVja0RvdWJsZVZvdGUBAQVYUHZmQ2hlY2tTdWJqZWN0SW52YWxpZAEBBURDYW5ub3RVcGdyYWRlQ29kZQEBBSxJbnZhbGlkQ29kZQEBBSxJbml0aWFsaXplcgEBBQxEbXABAQUQSHJtcAECUFRPcGVuSHJtcENoYW5uZWxUb1NlbGYBAQV8T3BlbkhybXBDaGFubmVsSW52YWxpZFJlY2lwaWVudAEBBWxPcGVuSHJtcENoYW5uZWxaZXJvQ2FwYWNpdHkBAQWMT3BlbkhybXBDaGFubmVsQ2FwYWNpdHlFeGNlZWRzTGltaXQBAQV4T3BlbkhybXBDaGFubmVsWmVyb01lc3NhZ2VTaXplAQEFmE9wZW5Icm1wQ2hhbm5lbE1lc3NhZ2VTaXplRXhjZWVkc0xpbWl0AQEFcE9wZW5Icm1wQ2hhbm5lbEFscmVhZHlFeGlzdHMBAQV8T3BlbkhybXBDaGFubmVsQWxyZWFkeVJlcXVlc3RlZAEBBXBPcGVuSHJtcENoYW5uZWxMaW1pdEV4Y2VlZGVkAQEFcEFjY2VwdEhybXBDaGFubmVsRG9lc250RXhpc3QBAQWEQWNjZXB0SHJtcENoYW5uZWxBbHJlYWR5Q29uZmlybWVkAQEFeEFjY2VwdEhybXBDaGFubmVsTGltaXRFeGNlZWRlZAEBBXBDbG9zZUhybXBDaGFubmVsVW5hdXRob3JpemVkAQEFbENsb3NlSHJtcENoYW5uZWxEb2VzbnRFeGlzdAEBBXxDbG9zZUhybXBDaGFubmVsQWxyZWFkeVVuZGVyd2F5AQEFhENhbmNlbEhybXBPcGVuQ2hhbm5lbFVuYXV0aG9yaXplZAEBBWhPcGVuSHJtcENoYW5uZWxEb2VzbnRFeGlzdAEBBXxPcGVuSHJtcENoYW5uZWxBbHJlYWR5Q29uZmlybWVkAQEFMFdyb25nV2l0bmVzcwEBBXBDaGFubmVsQ3JlYXRpb25Ob3RBdXRob3JpemVkAQEFPFBhcmFTZXNzaW9uSW5mbwEBBTRQYXJhc0Rpc3B1dGVzAQIkdER1cGxpY2F0ZURpc3B1dGVTdGF0ZW1lbnRTZXRzAQEFXEFuY2llbnREaXNwdXRlU3RhdGVtZW50AQEFZFZhbGlkYXRvckluZGV4T3V0T2ZCb3VuZHMBAQVASW52YWxpZFNpZ25hdHVyZQEBBUhEdXBsaWNhdGVTdGF0ZW1lbnQBAQVIU2luZ2xlU2lkZWREaXNwdXRlAQEFPE1hbGljaW91c0JhY2tlcgEBBUxNaXNzaW5nQmFja2luZ1ZvdGVzAQEFSFVuY29uZmlybWVkRGlzcHV0ZQEBBTRQYXJhc1NsYXNoaW5nAQIYYEludmFsaWRLZXlPd25lcnNoaXBQcm9vZgEBBUxJbnZhbGlkU2Vzc2lvbkluZGV4AQEFUEludmFsaWRDYW5kaWRhdGVIYXNoAQEFVEludmFsaWRWYWxpZGF0b3JJbmRleAEBBWBWYWxpZGF0b3JJbmRleElkTWlzbWF0Y2gBAQVcRHVwbGljYXRlU2xhc2hpbmdSZXBvcnQBAQUgT25EZW1hbmQBAggkUXVldWVGdWxsAQEFcFNwb3RQcmljZUhpZ2hlclRoYW5NYXhBbW91bnQBAQVoQ29yZXRpbWVBc3NpZ25tZW50UHJvdmlkZXIBAhhAQXNzaWdubWVudHNFbXB0eQEBBTRPdmVyU2NoZWR1bGVkAQEFOFVuZGVyU2NoZWR1bGVkAQEFQERpc2FsbG93ZWRJbnNlcnQBAQU8RHVwbGljYXRlSW5zZXJ0AQEFUEFzc2lnbm1lbnRzTm90U29ydGVkAQEFJFJlZ2lzdHJhcgECODROb3RSZWdpc3RlcmVkAQEFREFscmVhZHlSZWdpc3RlcmVkAQEFIE5vdE93bmVyAQEFMENvZGVUb29MYXJnZQEBBUBIZWFkRGF0YVRvb0xhcmdlAQEFME5vdFBhcmFjaGFpbgEBBTROb3RQYXJhdGhyZWFkAQEFQENhbm5vdERlcmVnaXN0ZXIBAQU8Q2Fubm90RG93bmdyYWRlAQEFNENhbm5vdFVwZ3JhZGUBAQUoUGFyYUxvY2tlZAEBBSxOb3RSZXNlcnZlZAEBBSxJbnZhbGlkQ29kZQEBBShDYW5ub3RTd2FwAQEFFFNsb3RzAQIIRFBhcmFOb3RPbmJvYXJkaW5nAQEFKExlYXNlRXJyb3IBAQUgQXVjdGlvbnMBAhxEQXVjdGlvbkluUHJvZ3Jlc3MBAQVETGVhc2VQZXJpb2RJblBhc3QBAQVEUGFyYU5vdFJlZ2lzdGVyZWQBAQVETm90Q3VycmVudEF1Y3Rpb24BAQUoTm90QXVjdGlvbgEBBTBBdWN0aW9uRW5kZWQBAQVAQWxyZWFkeUxlYXNlZE91dAEBBSRDcm93ZGxvYW4BAlxERmlyc3RQZXJpb2RJblBhc3QBAQVkRmlyc3RQZXJpb2RUb29GYXJJbkZ1dHVyZQEBBWxMYXN0UGVyaW9kQmVmb3JlRmlyc3RQZXJpb2QBAQVgTGFzdFBlcmlvZFRvb0ZhckluRnV0dXJlAQEFPENhbm5vdEVuZEluUGFzdAEBBURFbmRUb29GYXJJbkZ1dHVyZQEBBSBPdmVyZmxvdwEBBVBDb250cmlidXRpb25Ub29TbWFsbAEBBTRJbnZhbGlkUGFyYUlkAQEFLENhcEV4Y2VlZGVkAQEFWENvbnRyaWJ1dGlvblBlcmlvZE92ZXIBAQU0SW52YWxpZE9yaWdpbgEBBTBOb3RQYXJhY2hhaW4BAQUsTGVhc2VBY3RpdmUBAQVAQmlkT3JMZWFzZUFjdGl2ZQEBBTBGdW5kTm90RW5kZWQBAQU8Tm9Db250cmlidXRpb25zAQEFSE5vdFJlYWR5VG9EaXNzb2x2ZQEBBUBJbnZhbGlkU2lnbmF0dXJlAQEFME1lbW9Ub29MYXJnZQEBBURBbHJlYWR5SW5OZXdSYWlzZQEBBUhWcmZEZWxheUluUHJvZ3Jlc3MBAQU0Tm9MZWFzZVBlcmlvZAEBBSBDb3JldGltZQECDCROb3RCcm9rZXIBAQVYUmVxdWVzdGVkRnV0dXJlUmV2ZW51ZQEBBUxBc3NldFRyYW5zZmVyRmFpbGVkAQEFSFN0YXRlVHJpZU1pZ3JhdGlvbgECGDxNYXhTaWduZWRMaW1pdHMBAQUoS2V5VG9vTG9uZwEBBThOb3RFbm91Z2hGdW5kcwEBBShCYWRXaXRuZXNzAQEFZFNpZ25lZE1pZ3JhdGlvbk5vdEFsbG93ZWQBAQUwQmFkQ2hpbGRSb290AQEFJFhjbVBhbGxldAECYCxVbnJlYWNoYWJsZQEBBSxTZW5kRmFpbHVyZQEBBSBGaWx0ZXJlZAEBBUhVbndlaWdoYWJsZU1lc3NhZ2UBAQVgRGVzdGluYXRpb25Ob3RJbnZlcnRpYmxlAQEFFEVtcHR5AQEFOENhbm5vdFJlYW5jaG9yAQEFNFRvb01hbnlBc3NldHMBAQU0SW52YWxpZE9yaWdpbgEBBShCYWRWZXJzaW9uAQEFLEJhZExvY2F0aW9uAQEFOE5vU3Vic2NyaXB0aW9uAQEFREFscmVhZHlTdWJzY3JpYmVkAQEFWENhbm5vdENoZWNrT3V0VGVsZXBvcnQBAQUoTG93QmFsYW5jZQEBBTBUb29NYW55TG9ja3MBAQVMQWNjb3VudE5vdFNvdmVyZWlnbgEBBShGZWVzTm90TWV0AQEFMExvY2tOb3RGb3VuZAEBBRRJblVzZQEBBWhJbnZhbGlkQXNzZXRVbmtub3duUmVzZXJ2ZQEBBXhJbnZhbGlkQXNzZXRVbnN1cHBvcnRlZFJlc2VydmUBAQU8VG9vTWFueVJlc2VydmVzAQEFYExvY2FsRXhlY3V0aW9uSW5jb21wbGV0ZQEBBTBNZXNzYWdlUXVldWUBAiQsTm90UmVhcGFibGUBAQUYTm9QYWdlAQEFJE5vTWVzc2FnZQEBBUBBbHJlYWR5UHJvY2Vzc2VkAQEFGFF1ZXVlZAEBBUhJbnN1ZmZpY2llbnRXZWlnaHQBAQVgVGVtcG9yYXJpbHlVbnByb2Nlc3NhYmxlAQEFLFF1ZXVlUGF1c2VkAQEFTFJlY3Vyc2l2ZURpc2FsbG93ZWQBAQUkQXNzZXRSYXRlAQIMQFVua25vd25Bc3NldEtpbmQBAQU0QWxyZWFkeUV4aXN0cwEBBSBPdmVyZmxvdwEBBRRCZWVmeQECEGBJbnZhbGlkS2V5T3duZXJzaGlwUHJvb2YBAQVgSW52YWxpZEVxdWl2b2NhdGlvblByb29mAQEFWER1cGxpY2F0ZU9mZmVuY2VSZXBvcnQBAQVQSW52YWxpZENvbmZpZ3VyYXRpb24BAQUMTW1yAQEFMEJlZWZ5TW1yTGVhZgEBBQIoQEZ1bmRzVW5hdmFpbGFibGUBAQUwT25seVByb3ZpZGVyAQEFMEJlbG93TWluaW11bQEBBTBDYW5ub3RDcmVhdGUBAQUwVW5rbm93bkFzc2V0AQEFGEZyb3plbgEBBSxVbnN1cHBvcnRlZAEBBUBDYW5ub3RDcmVhdGVIb2xkAQEFNE5vdEV4cGVuZGFibGUBAQUcQmxvY2tlZAEBBQIMJFVuZGVyZmxvdwEBBSBPdmVyZmxvdwEBBThEaXZpc2lvbkJ5WmVybwEBBQIIMExpbWl0UmVhY2hlZAEBBRxOb0xheWVyAQEFAjgUT3RoZXIBAQUwQ2Fubm90TG9va3VwAQEFJEJhZE9yaWdpbgEBBRhNb2R1bGUBAuwYU3lzdGVtAQIkPEludmFsaWRTcGVjTmFtZQEBBWhTcGVjVmVyc2lvbk5lZWRzVG9JbmNyZWFzZQEBBXRGYWlsZWRUb0V4dHJhY3RSdW50aW1lVmVyc2lvbgEBBUxOb25EZWZhdWx0Q29tcG9zaXRlAQEFPE5vblplcm9SZWZDb3VudAEBBTBDYWxsRmlsdGVyZWQBAQVsTXVsdGlCbG9ja01pZ3JhdGlvbnNPbmdvaW5nAQEFRE5vdGhpbmdBdXRob3JpemVkAQEFMFVuYXV0aG9yaXplZAEBBSRTY2hlZHVsZXIBAhRARmFpbGVkVG9TY2hlZHVsZQEBBSBOb3RGb3VuZAEBBVxUYXJnZXRCbG9ja051bWJlckluUGFzdAEBBUhSZXNjaGVkdWxlTm9DaGFuZ2UBAQUUTmFtZWQBAQUgUHJlaW1hZ2UBAiQYVG9vQmlnAQEFMEFscmVhZHlOb3RlZAEBBTROb3RBdXRob3JpemVkAQEFIE5vdE5vdGVkAQEFJFJlcXVlc3RlZAEBBTBOb3RSZXF1ZXN0ZWQBAQUcVG9vTWFueQEBBRhUb29GZXcBAQUYTm9Db3N0AQEFEEJhYmUBAhBgSW52YWxpZEVxdWl2b2NhdGlvblByb29mAQEFYEludmFsaWRLZXlPd25lcnNoaXBQcm9vZgEBBVhEdXBsaWNhdGVPZmZlbmNlUmVwb3J0AQEFUEludmFsaWRDb25maWd1cmF0aW9uAQEFJFRpbWVzdGFtcAEBBRxJbmRpY2VzAQIULE5vdEFzc2lnbmVkAQEFIE5vdE93bmVyAQEFFEluVXNlAQEFLE5vdFRyYW5zZmVyAQEFJFBlcm1hbmVudAEBBSBCYWxhbmNlcwECMDhWZXN0aW5nQmFsYW5jZQEBBVRMaXF1aWRpdHlSZXN0cmljdGlvbnMBAQVMSW5zdWZmaWNpZW50QmFsYW5jZQEBBUhFeGlzdGVudGlhbERlcG9zaXQBAQU0RXhwZW5kYWJpbGl0eQEBBVxFeGlzdGluZ1Zlc3RpbmdTY2hlZHVsZQEBBSxEZWFkQWNjb3VudAEBBTxUb29NYW55UmVzZXJ2ZXMBAQUwVG9vTWFueUhvbGRzAQEFOFRvb01hbnlGcmVlemVzAQEFTElzc3VhbmNlRGVhY3RpdmF0ZWQBAQUkRGVsdGFaZXJvAQEFSFRyYW5zYWN0aW9uUGF5bWVudAEBBShBdXRob3JzaGlwAQEFHFN0YWtpbmcBAnw0Tm90Q29udHJvbGxlcgEBBSBOb3RTdGFzaAEBBTRBbHJlYWR5Qm9uZGVkAQEFNEFscmVhZHlQYWlyZWQBAQUwRW1wdHlUYXJnZXRzAQEFOER1cGxpY2F0ZUluZGV4AQEFREludmFsaWRTbGFzaEluZGV4AQEFQEluc3VmZmljaWVudEJvbmQBAQUwTm9Nb3JlQ2h1bmtzAQEFNE5vVW5sb2NrQ2h1bmsBAQUwRnVuZGVkVGFyZ2V0AQEFSEludmFsaWRFcmFUb1Jld2FyZAEBBWhJbnZhbGlkTnVtYmVyT2ZOb21pbmF0aW9ucwEBBUhOb3RTb3J0ZWRBbmRVbmlxdWUBAQU4QWxyZWFkeUNsYWltZWQBAQUsSW52YWxpZFBhZ2UBAQVUSW5jb3JyZWN0SGlzdG9yeURlcHRoAQEFWEluY29ycmVjdFNsYXNoaW5nU3BhbnMBAQUgQmFkU3RhdGUBAQU4VG9vTWFueVRhcmdldHMBAQUkQmFkVGFyZ2V0AQEFQENhbm5vdENoaWxsT3RoZXIBAQVEVG9vTWFueU5vbWluYXRvcnMBAQVEVG9vTWFueVZhbGlkYXRvcnMBAQVAQ29tbWlzc2lvblRvb0xvdwEBBSxCb3VuZE5vdE1ldAEBBVBDb250cm9sbGVyRGVwcmVjYXRlZAEBBUxDYW5ub3RSZXN0b3JlTGVkZ2VyAQEFbFJld2FyZERlc3RpbmF0aW9uUmVzdHJpY3RlZAEBBThOb3RFbm91Z2hGdW5kcwEBBVxWaXJ0dWFsU3Rha2VyTm90QWxsb3dlZAEBBSBPZmZlbmNlcwEBBShIaXN0b3JpY2FsAQEFHFNlc3Npb24BAhQwSW52YWxpZFByb29mAQEFXE5vQXNzb2NpYXRlZFZhbGlkYXRvcklkAQEFNER1cGxpY2F0ZWRLZXkBAQUYTm9LZXlzAQEFJE5vQWNjb3VudAEBBRxHcmFuZHBhAQIcLFBhdXNlRmFpbGVkAQEFMFJlc3VtZUZhaWxlZAEBBTRDaGFuZ2VQZW5kaW5nAQEFHFRvb1Nvb24BAQVgSW52YWxpZEtleU93bmVyc2hpcFByb29mAQEFYEludmFsaWRFcXVpdm9jYXRpb25Qcm9vZgEBBVhEdXBsaWNhdGVPZmZlbmNlUmVwb3J0AQEFSEF1dGhvcml0eURpc2NvdmVyeQEBBSBUcmVhc3VyeQECLDBJbnZhbGlkSW5kZXgBAQVAVG9vTWFueUFwcHJvdmFscwEBBVhJbnN1ZmZpY2llbnRQZXJtaXNzaW9uAQEFTFByb3Bvc2FsTm90QXBwcm92ZWQBAQVYRmFpbGVkVG9Db252ZXJ0QmFsYW5jZQEBBTBTcGVuZEV4cGlyZWQBAQUsRWFybHlQYXlvdXQBAQVAQWxyZWFkeUF0dGVtcHRlZAEBBSxQYXlvdXRFcnJvcgEBBTBOb3RBdHRlbXB0ZWQBAQUwSW5jb25jbHVzaXZlAQEFQENvbnZpY3Rpb25Wb3RpbmcBAjAoTm90T25nb2luZwEBBSBOb3RWb3RlcgEBBTBOb1Blcm1pc3Npb24BAQU8Tm9QZXJtaXNzaW9uWWV0AQEFREFscmVhZHlEZWxlZ2F0aW5nAQEFNEFscmVhZHlWb3RpbmcBAQVESW5zdWZmaWNpZW50RnVuZHMBAQU0Tm90RGVsZWdhdGluZwEBBSBOb25zZW5zZQEBBTxNYXhWb3Rlc1JlYWNoZWQBAQUsQ2xhc3NOZWVkZWQBAQUgQmFkQ2xhc3MBAQUkUmVmZXJlbmRhAQI4KE5vdE9uZ29pbmcBAQUoSGFzRGVwb3NpdAEBBSBCYWRUcmFjawEBBRBGdWxsAQEFKFF1ZXVlRW1wdHkBAQU0QmFkUmVmZXJlbmR1bQEBBSxOb3RoaW5nVG9EbwEBBRxOb1RyYWNrAQEFKFVuZmluaXNoZWQBAQUwTm9QZXJtaXNzaW9uAQEFJE5vRGVwb3NpdAEBBSRCYWRTdGF0dXMBAQVAUHJlaW1hZ2VOb3RFeGlzdAEBBYRQcmVpbWFnZVN0b3JlZFdpdGhEaWZmZXJlbnRMZW5ndGgBAQUcT3JpZ2lucwEBBSRXaGl0ZWxpc3QBAhRMVW5hdmFpbGFibGVQcmVJbWFnZQEBBTxVbmRlY29kYWJsZUNhbGwBAQVgSW52YWxpZENhbGxXZWlnaHRXaXRuZXNzAQEFUENhbGxJc05vdFdoaXRlbGlzdGVkAQEFWENhbGxBbHJlYWR5V2hpdGVsaXN0ZWQBAQUoUGFyYW1ldGVycwEBBRhDbGFpbXMBAhhgSW52YWxpZEV0aGVyZXVtU2lnbmF0dXJlAQEFQFNpZ25lckhhc05vQ2xhaW0BAQVAU2VuZGVySGFzTm9DbGFpbQEBBTBQb3RVbmRlcmZsb3cBAQVASW52YWxpZFN0YXRlbWVudAEBBUxWZXN0ZWRCYWxhbmNlRXhpc3RzAQEFHFZlc3RpbmcBAhQoTm90VmVzdGluZwEBBVRBdE1heFZlc3RpbmdTY2hlZHVsZXMBAQUkQW1vdW50TG93AQEFYFNjaGVkdWxlSW5kZXhPdXRPZkJvdW5kcwEBBVRJbnZhbGlkU2NoZWR1bGVQYXJhbXMBAQUcVXRpbGl0eQECBDBUb29NYW55Q2FsbHMBAQUUUHJveHkBAiAcVG9vTWFueQEBBSBOb3RGb3VuZAEBBSBOb3RQcm94eQEBBSxVbnByb3h5YWJsZQEBBSREdXBsaWNhdGUBAQUwTm9QZXJtaXNzaW9uAQEFLFVuYW5ub3VuY2VkAQEFLE5vU2VsZlByb3h5AQEFIE11bHRpc2lnAQI4QE1pbmltdW1UaHJlc2hvbGQBAQU8QWxyZWFkeUFwcHJvdmVkAQEFRE5vQXBwcm92YWxzTmVlZGVkAQEFRFRvb0Zld1NpZ25hdG9yaWVzAQEFSFRvb01hbnlTaWduYXRvcmllcwEBBVRTaWduYXRvcmllc091dE9mT3JkZXIBAQVMU2VuZGVySW5TaWduYXRvcmllcwEBBSBOb3RGb3VuZAEBBSBOb3RPd25lcgEBBSxOb1RpbWVwb2ludAEBBThXcm9uZ1RpbWVwb2ludAEBBUxVbmV4cGVjdGVkVGltZXBvaW50AQEFPE1heFdlaWdodFRvb0xvdwEBBTRBbHJlYWR5U3RvcmVkAQEFIEJvdW50aWVzAQIscEluc3VmZmljaWVudFByb3Bvc2Vyc0JhbGFuY2UBAQUwSW52YWxpZEluZGV4AQEFMFJlYXNvblRvb0JpZwEBBUBVbmV4cGVjdGVkU3RhdHVzAQEFOFJlcXVpcmVDdXJhdG9yAQEFMEludmFsaWRWYWx1ZQEBBShJbnZhbGlkRmVlAQEFNFBlbmRpbmdQYXlvdXQBAQUkUHJlbWF0dXJlAQEFUEhhc0FjdGl2ZUNoaWxkQm91bnR5AQEFNFRvb01hbnlRdWV1ZWQBAQU0Q2hpbGRCb3VudGllcwECDFRQYXJlbnRCb3VudHlOb3RBY3RpdmUBAQVkSW5zdWZmaWNpZW50Qm91bnR5QmFsYW5jZQEBBVBUb29NYW55Q2hpbGRCb3VudGllcwEBBWhFbGVjdGlvblByb3ZpZGVyTXVsdGlQaGFzZQECPGhQcmVEaXNwYXRjaEVhcmx5U3VibWlzc2lvbgEBBWxQcmVEaXNwYXRjaFdyb25nV2lubmVyQ291bnQBAQVkUHJlRGlzcGF0Y2hXZWFrU3VibWlzc2lvbgEBBTxTaWduZWRRdWV1ZUZ1bGwBAQVYU2lnbmVkQ2Fubm90UGF5RGVwb3NpdAEBBVBTaWduZWRJbnZhbGlkV2l0bmVzcwEBBUxTaWduZWRUb29NdWNoV2VpZ2h0AQEFPE9jd0NhbGxXcm9uZ0VyYQEBBVxNaXNzaW5nU25hcHNob3RNZXRhZGF0YQEBBVhJbnZhbGlkU3VibWlzc2lvbkluZGV4AQEFOENhbGxOb3RBbGxvd2VkAQEFOEZhbGxiYWNrRmFpbGVkAQEFLEJvdW5kTm90TWV0AQEFOFRvb01hbnlXaW5uZXJzAQEFZFByZURpc3BhdGNoRGlmZmVyZW50Um91bmQBAQUkVm90ZXJMaXN0AQIEEExpc3QBAhAkRHVwbGljYXRlAQEFKE5vdEhlYXZpZXIBAQUwTm90SW5TYW1lQmFnAQEFME5vZGVOb3RGb3VuZAEBBTxOb21pbmF0aW9uUG9vbHMBApAwUG9vbE5vdEZvdW5kAQEFSFBvb2xNZW1iZXJOb3RGb3VuZAEBBUhSZXdhcmRQb29sTm90Rm91bmQBAQVAU3ViUG9vbHNOb3RGb3VuZAEBBWRBY2NvdW50QmVsb25nc1RvT3RoZXJQb29sAQEFOEZ1bGx5VW5ib25kaW5nAQEFRE1heFVuYm9uZGluZ0xpbWl0AQEFRENhbm5vdFdpdGhkcmF3QW55AQEFRE1pbmltdW1Cb25kTm90TWV0AQEFME92ZXJmbG93UmlzawEBBTROb3REZXN0cm95aW5nAQEFME5vdE5vbWluYXRvcgEBBVROb3RLaWNrZXJPckRlc3Ryb3lpbmcBAQUcTm90T3BlbgEBBSBNYXhQb29scwEBBThNYXhQb29sTWVtYmVycwEBBURDYW5Ob3RDaGFuZ2VTdGF0ZQEBBVREb2VzTm90SGF2ZVBlcm1pc3Npb24BAQVUTWV0YWRhdGFFeGNlZWRzTWF4TGVuAQEFJERlZmVuc2l2ZQECHGhOb3RFbm91Z2hTcGFjZUluVW5ib25kUG9vbAEBBTBQb29sTm90Rm91bmQBAQVIUmV3YXJkUG9vbE5vdEZvdW5kAQEFQFN1YlBvb2xzTm90Rm91bmQBAQVwQm9uZGVkU3Rhc2hLaWxsZWRQcmVtYXR1cmVseQEBBVREZWxlZ2F0aW9uVW5zdXBwb3J0ZWQBAQU8U2xhc2hOb3RBcHBsaWVkAQEFnFBhcnRpYWxVbmJvbmROb3RBbGxvd2VkUGVybWlzc2lvbmxlc3NseQEBBVxNYXhDb21taXNzaW9uUmVzdHJpY3RlZAEBBWBDb21taXNzaW9uRXhjZWVkc01heGltdW0BAQV4Q29tbWlzc2lvbkV4Y2VlZHNHbG9iYWxNYXhpbXVtAQEFZENvbW1pc3Npb25DaGFuZ2VUaHJvdHRsZWQBAQV4Q29tbWlzc2lvbkNoYW5nZVJhdGVOb3RBbGxvd2VkAQEFTE5vUGVuZGluZ0NvbW1pc3Npb24BAQVYTm9Db21taXNzaW9uQ3VycmVudFNldAEBBSxQb29sSWRJblVzZQEBBTRJbnZhbGlkUG9vbElkAQEFTEJvbmRFeHRyYVJlc3RyaWN0ZWQBAQU8Tm90aGluZ1RvQWRqdXN0AQEFOE5vdGhpbmdUb1NsYXNoAQEFPEFscmVhZHlNaWdyYXRlZAEBBSxOb3RNaWdyYXRlZAEBBTBOb3RTdXBwb3J0ZWQBAQUsRmFzdFVuc3Rha2UBAhg0Tm90Q29udHJvbGxlcgEBBTRBbHJlYWR5UXVldWVkAQEFOE5vdEZ1bGx5Qm9uZGVkAQEFJE5vdFF1ZXVlZAEBBSxBbHJlYWR5SGVhZAEBBThDYWxsTm90QWxsb3dlZAEBBUBQYXJhY2hhaW5zT3JpZ2luAQEFNENvbmZpZ3VyYXRpb24BAgQ8SW52YWxpZE5ld1ZhbHVlAQEFLFBhcmFzU2hhcmVkAQEFNFBhcmFJbmNsdXNpb24BAkhkVmFsaWRhdG9ySW5kZXhPdXRPZkJvdW5kcwEBBVBVbnNjaGVkdWxlZENhbmRpZGF0ZQEBBUBIZWFkRGF0YVRvb0xhcmdlAQEFUFByZW1hdHVyZUNvZGVVcGdyYWRlAQEFPE5ld0NvZGVUb29MYXJnZQEBBVREaXNhbGxvd2VkUmVsYXlQYXJlbnQBAQVESW52YWxpZEFzc2lnbm1lbnQBAQVESW52YWxpZEdyb3VwSW5kZXgBAQVMSW5zdWZmaWNpZW50QmFja2luZwEBBThJbnZhbGlkQmFja2luZwEBBUROb3RDb2xsYXRvclNpZ25lZAEBBWhWYWxpZGF0aW9uRGF0YUhhc2hNaXNtYXRjaAEBBYBJbmNvcnJlY3REb3dud2FyZE1lc3NhZ2VIYW5kbGluZwEBBVRJbnZhbGlkVXB3YXJkTWVzc2FnZXMBAQVgSHJtcFdhdGVybWFya01pc2hhbmRsaW5nAQEFTEludmFsaWRPdXRib3VuZEhybXABAQVkSW52YWxpZFZhbGlkYXRpb25Db2RlSGFzaAEBBUBQYXJhSGVhZE1pc21hdGNoAQEFMFBhcmFJbmhlcmVudAECFGRUb29NYW55SW5jbHVzaW9uSW5oZXJlbnRzAQEFTEludmFsaWRQYXJlbnRIZWFkZXIBAQVISW5oZXJlbnRPdmVyd2VpZ2h0AQEFhENhbmRpZGF0ZXNGaWx0ZXJlZER1cmluZ0V4ZWN1dGlvbgEBBVBVbnNjaGVkdWxlZENhbmRpZGF0ZQEBBTRQYXJhU2NoZWR1bGVyAQEFFFBhcmFzAQI0NE5vdFJlZ2lzdGVyZWQBAQU0Q2Fubm90T25ib2FyZAEBBThDYW5ub3RPZmZib2FyZAEBBTRDYW5ub3RVcGdyYWRlAQEFPENhbm5vdERvd25ncmFkZQEBBVhQdmZDaGVja1N0YXRlbWVudFN0YWxlAQEFXFB2ZkNoZWNrU3RhdGVtZW50RnV0dXJlAQEFhFB2ZkNoZWNrVmFsaWRhdG9ySW5kZXhPdXRPZkJvdW5kcwEBBWBQdmZDaGVja0ludmFsaWRTaWduYXR1cmUBAQVIUHZmQ2hlY2tEb3VibGVWb3RlAQEFWFB2ZkNoZWNrU3ViamVjdEludmFsaWQBAQVEQ2Fubm90VXBncmFkZUNvZGUBAQUsSW52YWxpZENvZGUBAQUsSW5pdGlhbGl6ZXIBAQUMRG1wAQEFEEhybXABAlBUT3BlbkhybXBDaGFubmVsVG9TZWxmAQEFfE9wZW5Icm1wQ2hhbm5lbEludmFsaWRSZWNpcGllbnQBAQVsT3BlbkhybXBDaGFubmVsWmVyb0NhcGFjaXR5AQEFjE9wZW5Icm1wQ2hhbm5lbENhcGFjaXR5RXhjZWVkc0xpbWl0AQEFeE9wZW5Icm1wQ2hhbm5lbFplcm9NZXNzYWdlU2l6ZQEBBZhPcGVuSHJtcENoYW5uZWxNZXNzYWdlU2l6ZUV4Y2VlZHNMaW1pdAEBBXBPcGVuSHJtcENoYW5uZWxBbHJlYWR5RXhpc3RzAQEFfE9wZW5Icm1wQ2hhbm5lbEFscmVhZHlSZXF1ZXN0ZWQBAQVwT3BlbkhybXBDaGFubmVsTGltaXRFeGNlZWRlZAEBBXBBY2NlcHRIcm1wQ2hhbm5lbERvZXNudEV4aXN0AQEFhEFjY2VwdEhybXBDaGFubmVsQWxyZWFkeUNvbmZpcm1lZAEBBXhBY2NlcHRIcm1wQ2hhbm5lbExpbWl0RXhjZWVkZWQBAQVwQ2xvc2VIcm1wQ2hhbm5lbFVuYXV0aG9yaXplZAEBBWxDbG9zZUhybXBDaGFubmVsRG9lc250RXhpc3QBAQV8Q2xvc2VIcm1wQ2hhbm5lbEFscmVhZHlVbmRlcndheQEBBYRDYW5jZWxIcm1wT3BlbkNoYW5uZWxVbmF1dGhvcml6ZWQBAQVoT3BlbkhybXBDaGFubmVsRG9lc250RXhpc3QBAQV8T3BlbkhybXBDaGFubmVsQWxyZWFkeUNvbmZpcm1lZAEBBTBXcm9uZ1dpdG5lc3MBAQVwQ2hhbm5lbENyZWF0aW9uTm90QXV0aG9yaXplZAEBBTxQYXJhU2Vzc2lvbkluZm8BAQU0UGFyYXNEaXNwdXRlcwECJHREdXBsaWNhdGVEaXNwdXRlU3RhdGVtZW50U2V0cwEBBVxBbmNpZW50RGlzcHV0ZVN0YXRlbWVudAEBBWRWYWxpZGF0b3JJbmRleE91dE9mQm91bmRzAQEFQEludmFsaWRTaWduYXR1cmUBAQVIRHVwbGljYXRlU3RhdGVtZW50AQEFSFNpbmdsZVNpZGVkRGlzcHV0ZQEBBTxNYWxpY2lvdXNCYWNrZXIBAQVMTWlzc2luZ0JhY2tpbmdWb3RlcwEBBUhVbmNvbmZpcm1lZERpc3B1dGUBAQU0UGFyYXNTbGFzaGluZwECGGBJbnZhbGlkS2V5T3duZXJzaGlwUHJvb2YBAQVMSW52YWxpZFNlc3Npb25JbmRleAEBBVBJbnZhbGlkQ2FuZGlkYXRlSGFzaAEBBVRJbnZhbGlkVmFsaWRhdG9ySW5kZXgBAQVgVmFsaWRhdG9ySW5kZXhJZE1pc21hdGNoAQEFXER1cGxpY2F0ZVNsYXNoaW5nUmVwb3J0AQEFIE9uRGVtYW5kAQIIJFF1ZXVlRnVsbAEBBXBTcG90UHJpY2VIaWdoZXJUaGFuTWF4QW1vdW50AQEFaENvcmV0aW1lQXNzaWdubWVudFByb3ZpZGVyAQIYQEFzc2lnbm1lbnRzRW1wdHkBAQU0T3ZlclNjaGVkdWxlZAEBBThVbmRlclNjaGVkdWxlZAEBBUBEaXNhbGxvd2VkSW5zZXJ0AQEFPER1cGxpY2F0ZUluc2VydAEBBVBBc3NpZ25tZW50c05vdFNvcnRlZAEBBSRSZWdpc3RyYXIBAjg0Tm90UmVnaXN0ZXJlZAEBBURBbHJlYWR5UmVnaXN0ZXJlZAEBBSBOb3RPd25lcgEBBTBDb2RlVG9vTGFyZ2UBAQVASGVhZERhdGFUb29MYXJnZQEBBTBOb3RQYXJhY2hhaW4BAQU0Tm90UGFyYXRocmVhZAEBBUBDYW5ub3REZXJlZ2lzdGVyAQEFPENhbm5vdERvd25ncmFkZQEBBTRDYW5ub3RVcGdyYWRlAQEFKFBhcmFMb2NrZWQBAQUsTm90UmVzZXJ2ZWQBAQUsSW52YWxpZENvZGUBAQUoQ2Fubm90U3dhcAEBBRRTbG90cwECCERQYXJhTm90T25ib2FyZGluZwEBBShMZWFzZUVycm9yAQEFIEF1Y3Rpb25zAQIcREF1Y3Rpb25JblByb2dyZXNzAQEFRExlYXNlUGVyaW9kSW5QYXN0AQEFRFBhcmFOb3RSZWdpc3RlcmVkAQEFRE5vdEN1cnJlbnRBdWN0aW9uAQEFKE5vdEF1Y3Rpb24BAQUwQXVjdGlvbkVuZGVkAQEFQEFscmVhZHlMZWFzZWRPdXQBAQUkQ3Jvd2Rsb2FuAQJcREZpcnN0UGVyaW9kSW5QYXN0AQEFZEZpcnN0UGVyaW9kVG9vRmFySW5GdXR1cmUBAQVsTGFzdFBlcmlvZEJlZm9yZUZpcnN0UGVyaW9kAQEFYExhc3RQZXJpb2RUb29GYXJJbkZ1dHVyZQEBBTxDYW5ub3RFbmRJblBhc3QBAQVERW5kVG9vRmFySW5GdXR1cmUBAQUgT3ZlcmZsb3cBAQVQQ29udHJpYnV0aW9uVG9vU21hbGwBAQU0SW52YWxpZFBhcmFJZAEBBSxDYXBFeGNlZWRlZAEBBVhDb250cmlidXRpb25QZXJpb2RPdmVyAQEFNEludmFsaWRPcmlnaW4BAQUwTm90UGFyYWNoYWluAQEFLExlYXNlQWN0aXZlAQEFQEJpZE9yTGVhc2VBY3RpdmUBAQUwRnVuZE5vdEVuZGVkAQEFPE5vQ29udHJpYnV0aW9ucwEBBUhOb3RSZWFkeVRvRGlzc29sdmUBAQVASW52YWxpZFNpZ25hdHVyZQEBBTBNZW1vVG9vTGFyZ2UBAQVEQWxyZWFkeUluTmV3UmFpc2UBAQVIVnJmRGVsYXlJblByb2dyZXNzAQEFNE5vTGVhc2VQZXJpb2QBAQUgQ29yZXRpbWUBAgwkTm90QnJva2VyAQEFWFJlcXVlc3RlZEZ1dHVyZVJldmVudWUBAQVMQXNzZXRUcmFuc2ZlckZhaWxlZAEBBUhTdGF0ZVRyaWVNaWdyYXRpb24BAhg8TWF4U2lnbmVkTGltaXRzAQEFKEtleVRvb0xvbmcBAQU4Tm90RW5vdWdoRnVuZHMBAQUoQmFkV2l0bmVzcwEBBWRTaWduZWRNaWdyYXRpb25Ob3RBbGxvd2VkAQEFMEJhZENoaWxkUm9vdAEBBSRYY21QYWxsZXQBAmAsVW5yZWFjaGFibGUBAQUsU2VuZEZhaWx1cmUBAQUgRmlsdGVyZWQBAQVIVW53ZWlnaGFibGVNZXNzYWdlAQEFYERlc3RpbmF0aW9uTm90SW52ZXJ0aWJsZQEBBRRFbXB0eQEBBThDYW5ub3RSZWFuY2hvcgEBBTRUb29NYW55QXNzZXRzAQEFNEludmFsaWRPcmlnaW4BAQUoQmFkVmVyc2lvbgEBBSxCYWRMb2NhdGlvbgEBBThOb1N1YnNjcmlwdGlvbgEBBURBbHJlYWR5U3Vic2NyaWJlZAEBBVhDYW5ub3RDaGVja091dFRlbGVwb3J0AQEFKExvd0JhbGFuY2UBAQUwVG9vTWFueUxvY2tzAQEFTEFjY291bnROb3RTb3ZlcmVpZ24BAQUoRmVlc05vdE1ldAEBBTBMb2NrTm90Rm91bmQBAQUUSW5Vc2UBAQVoSW52YWxpZEFzc2V0VW5rbm93blJlc2VydmUBAQV4SW52YWxpZEFzc2V0VW5zdXBwb3J0ZWRSZXNlcnZlAQEFPFRvb01hbnlSZXNlcnZlcwEBBWBMb2NhbEV4ZWN1dGlvbkluY29tcGxldGUBAQUwTWVzc2FnZVF1ZXVlAQIkLE5vdFJlYXBhYmxlAQEFGE5vUGFnZQEBBSROb01lc3NhZ2UBAQVAQWxyZWFkeVByb2Nlc3NlZAEBBRhRdWV1ZWQBAQVISW5zdWZmaWNpZW50V2VpZ2h0AQEFYFRlbXBvcmFyaWx5VW5wcm9jZXNzYWJsZQEBBSxRdWV1ZVBhdXNlZAEBBUxSZWN1cnNpdmVEaXNhbGxvd2VkAQEFJEFzc2V0UmF0ZQECDEBVbmtub3duQXNzZXRLaW5kAQEFNEFscmVhZHlFeGlzdHMBAQUgT3ZlcmZsb3cBAQUUQmVlZnkBAhBgSW52YWxpZEtleU93bmVyc2hpcFByb29mAQEFYEludmFsaWRFcXVpdm9jYXRpb25Qcm9vZgEBBVhEdXBsaWNhdGVPZmZlbmNlUmVwb3J0AQEFUEludmFsaWRDb25maWd1cmF0aW9uAQEFDE1tcgEBBTBCZWVmeU1tckxlYWYBAQVEQ29uc3VtZXJSZW1haW5pbmcBAQUsTm9Qcm92aWRlcnMBAQVAVG9vTWFueUNvbnN1bWVycwEBBRRUb2tlbgECKEBGdW5kc1VuYXZhaWxhYmxlAQEFME9ubHlQcm92aWRlcgEBBTBCZWxvd01pbmltdW0BAQUwQ2Fubm90Q3JlYXRlAQEFMFVua25vd25Bc3NldAEBBRhGcm96ZW4BAQUsVW5zdXBwb3J0ZWQBAQVAQ2Fubm90Q3JlYXRlSG9sZAEBBTROb3RFeHBlbmRhYmxlAQEFHEJsb2NrZWQBAQUoQXJpdGhtZXRpYwECDCRVbmRlcmZsb3cBAQUgT3ZlcmZsb3cBAQU4RGl2aXNpb25CeVplcm8BAQU0VHJhbnNhY3Rpb25hbAECCDBMaW1pdFJlYWNoZWQBAQUcTm9MYXllcgEBBSRFeGhhdXN0ZWQBAQUoQ29ycnVwdGlvbgEBBSxVbmF2YWlsYWJsZQEBBThSb290Tm90QWxsb3dlZAEBBQIcQEV4dHJpbnNpY1N1Y2Nlc3MBAAQ0ZGlzcGF0Y2hfaW5mb0A8RXh0cmluc2ljRmFpbGVkAQAIOGRpc3BhdGNoX2Vycm9yBQE0ZGlzcGF0Y2hfaW5mb0AsQ29kZVVwZGF0ZWQBAQUoTmV3QWNjb3VudAEABBxhY2NvdW50ADRLaWxsZWRBY2NvdW50AQAEHGFjY291bnQAIFJlbWFya2VkAQAIGHNlbmRlcgAQaGFzaCBEVXBncmFkZUF1dGhvcml6ZWQBAAgkY29kZV9oYXNoIDRjaGVja192ZXJzaW9uFAQEAQgGIAEFBxUBBQECJCRTY2hlZHVsZWQBAAgQd2hlbgQUaW5kZXgEIENhbmNlbGVkAQAIEHdoZW4EFGluZGV4BChEaXNwYXRjaGVkAQAMEHRhc2sNAQhpZBEBGHJlc3VsdBkBIFJldHJ5U2V0AQAQEHRhc2sNAQhpZBEBGHBlcmlvZAQccmV0cmllcwQ4UmV0cnlDYW5jZWxsZWQBAAgQdGFzaw0BCGlkEQE8Q2FsbFVuYXZhaWxhYmxlAQAIEHRhc2sNAQhpZBEBOFBlcmlvZGljRmFpbGVkAQAIEHRhc2sNAQhpZBEBLFJldHJ5RmFpbGVkAQAIEHRhc2sNAQhpZBEBVFBlcm1hbmVudGx5T3ZlcndlaWdodAEACBB0YXNrDQEIaWQRAQIMFE5vdGVkAQAEEGhhc2ggJFJlcXVlc3RlZAEABBBoYXNoIBxDbGVhcmVkAQAEEGhhc2ggAgw0SW5kZXhBc3NpZ25lZAEACAx3aG8AFGluZGV4BChJbmRleEZyZWVkAQAEFGluZGV4BCxJbmRleEZyb3plbgEACBRpbmRleAQMd2hvAAIIEEZyZWUBAQUgUmVzZXJ2ZWQBAQUCWBxFbmRvd2VkAQAIHGFjY291bnQAMGZyZWVfYmFsYW5jZQggRHVzdExvc3QBAAgcYWNjb3VudAAYYW1vdW50CCBUcmFuc2ZlcgEADBBmcm9tAAh0bwAYYW1vdW50CChCYWxhbmNlU2V0AQAIDHdobwAQZnJlZQggUmVzZXJ2ZWQBAAgMd2hvABhhbW91bnQIKFVucmVzZXJ2ZWQBAAgMd2hvABhhbW91bnQISFJlc2VydmVSZXBhdHJpYXRlZAEAEBBmcm9tAAh0bwAYYW1vdW50CEhkZXN0aW5hdGlvbl9zdGF0dXMpARxEZXBvc2l0AQAIDHdobwAYYW1vdW50CCBXaXRoZHJhdwEACAx3aG8AGGFtb3VudAgcU2xhc2hlZAEACAx3aG8AGGFtb3VudAgYTWludGVkAQAIDHdobwAYYW1vdW50CBhCdXJuZWQBAAgMd2hvABhhbW91bnQIJFN1c3BlbmRlZAEACAx3aG8AGGFtb3VudAggUmVzdG9yZWQBAAgMd2hvABhhbW91bnQIIFVwZ3JhZGVkAQAEDHdobwAYSXNzdWVkAQAEGGFtb3VudAgkUmVzY2luZGVkAQAEGGFtb3VudAgYTG9ja2VkAQAIDHdobwAYYW1vdW50CCBVbmxvY2tlZAEACAx3aG8AGGFtb3VudAgYRnJvemVuAQAIDHdobwAYYW1vdW50CBhUaGF3ZWQBAAgMd2hvABhhbW91bnQITFRvdGFsSXNzdWFuY2VGb3JjZWQBAAgMb2xkCAxuZXcIAgRIVHJhbnNhY3Rpb25GZWVQYWlkAQAMDHdobwAoYWN0dWFsX2ZlZQgMdGlwCAIUGFN0YWtlZAEBBRRTdGFzaAEBBShDb250cm9sbGVyAQEFHEFjY291bnQBAQEQTm9uZQEBBQAIKGNvbW1pc3Npb24EHGJsb2NrZWQUAhAoTm90Rm9yY2luZwEBBSBGb3JjZU5ldwEBBSRGb3JjZU5vbmUBAQUsRm9yY2VBbHdheXMBAQUCSBxFcmFQYWlkAQAMJGVyYV9pbmRleARAdmFsaWRhdG9yX3BheW91dAgkcmVtYWluZGVyCCBSZXdhcmRlZAEADBRzdGFzaAAQZGVzdDUBGGFtb3VudAgcU2xhc2hlZAEACBhzdGFrZXIAGGFtb3VudAg0U2xhc2hSZXBvcnRlZAEADCR2YWxpZGF0b3IAIGZyYWN0aW9uBCRzbGFzaF9lcmEEaE9sZFNsYXNoaW5nUmVwb3J0RGlzY2FyZGVkAQAENHNlc3Npb25faW5kZXgEOFN0YWtlcnNFbGVjdGVkAQEFGEJvbmRlZAEACBRzdGFzaAAYYW1vdW50CCBVbmJvbmRlZAEACBRzdGFzaAAYYW1vdW50CCRXaXRoZHJhd24BAAgUc3Rhc2gAGGFtb3VudAgYS2lja2VkAQAIJG5vbWluYXRvcgAUc3Rhc2gAVFN0YWtpbmdFbGVjdGlvbkZhaWxlZAEBBRxDaGlsbGVkAQAEFHN0YXNoADRQYXlvdXRTdGFydGVkAQAIJGVyYV9pbmRleAQ8dmFsaWRhdG9yX3N0YXNoAERWYWxpZGF0b3JQcmVmc1NldAEACBRzdGFzaAAUcHJlZnM5AWhTbmFwc2hvdFZvdGVyc1NpemVFeGNlZWRlZAEABBBzaXplBGxTbmFwc2hvdFRhcmdldHNTaXplRXhjZWVkZWQBAAQQc2l6ZQQgRm9yY2VFcmEBAAQQbW9kZT0BZENvbnRyb2xsZXJCYXRjaERlcHJlY2F0ZWQBAAQgZmFpbHVyZXMEBQFAAgQcT2ZmZW5jZQEACBBraW5kRQEgdGltZXNsb3QkAgQoTmV3U2Vzc2lvbgEABDRzZXNzaW9uX2luZGV4BAMIIAgEUQEAAgw4TmV3QXV0aG9yaXRpZXMBAAQ0YXV0aG9yaXR5X3NldFUBGFBhdXNlZAEBBRxSZXN1bWVkAQEFAiwkQnlHZW5lc2lzAQUBgBhCeUZvcmsBAAgwYmxvY2tfbnVtYmVyCChibG9ja19oYXNoICBQb2xrYWRvdAEBBRhLdXNhbWEBAQUcV2VzdGVuZAEBBRhSb2NvY28BAQUYV29jb2NvAQEFIEV0aGVyZXVtAQAEIGNoYWluX2lkCCxCaXRjb2luQ29yZQEBBSxCaXRjb2luQ2FzaAEBBUBQb2xrYWRvdEJ1bGxldGluAQEFBl0BBQFQAigQVW5pdAEBBRxNb25pa2VyAQUBEBRJbmRleAEBAiRFeGVjdXRpdmUBAQUkVGVjaG5pY2FsAQEFLExlZ2lzbGF0aXZlAQEFIEp1ZGljaWFsAQEFHERlZmVuc2UBAQU4QWRtaW5pc3RyYXRpb24BAQUgVHJlYXN1cnkBAQUCFBRWb2ljZQEBBRxNZW1iZXJzAQAEFGNvdW50BCBGcmFjdGlvbgEACAxub20EFGRlbm9tBERBdExlYXN0UHJvcG9ydGlvbgEACAxub20EFGRlbm9tBEhNb3JlVGhhblByb3BvcnRpb24BAAgMbm9tBBRkZW5vbQQCKCRQYXJhY2hhaW4BAQIsQWNjb3VudElkMzIBAAgcbmV0d29ya2EBCGlkIDhBY2NvdW50SW5kZXg2NAEACBxuZXR3b3JrYQEUaW5kZXgIMEFjY291bnRLZXkyMAEACBxuZXR3b3JrYQEMa2V5ZQE4UGFsbGV0SW5zdGFuY2UBAQIwR2VuZXJhbEluZGV4AQEDKEdlbmVyYWxLZXkBAAgYbGVuZ3RoBBBkYXRhICRPbmx5Q2hpbGQBAQUkUGx1cmFsaXR5AQAICGlkaQEQcGFydG0BPEdsb2JhbENvbnNlbnN1cwECLCRCeUdlbmVzaXMBBQGAGEJ5Rm9yawEACDBibG9ja19udW1iZXIIKGJsb2NrX2hhc2ggIFBvbGthZG90AQEFGEt1c2FtYQEBBRxXZXN0ZW5kAQEFGFJvY29jbwEBBRhXb2NvY28BAQUgRXRoZXJldW0BAAQgY2hhaW5faWQILEJpdGNvaW5Db3JlAQEFLEJpdGNvaW5DYXNoAQEFQFBvbGthZG90QnVsbGV0aW4BAQUCJBBIZXJlAQEFCFgxAQIoJFBhcmFjaGFpbgEBAixBY2NvdW50SWQzMgEACBxuZXR3b3JrYQEIaWQgOEFjY291bnRJbmRleDY0AQAIHG5ldHdvcmthARRpbmRleAgwQWNjb3VudEtleTIwAQAIHG5ldHdvcmthAQxrZXllAThQYWxsZXRJbnN0YW5jZQEBAjBHZW5lcmFsSW5kZXgBAQMoR2VuZXJhbEtleQEACBhsZW5ndGgEEGRhdGEgJE9ubHlDaGlsZAEBBSRQbHVyYWxpdHkBAAgIaWRpARBwYXJ0bQE8R2xvYmFsQ29uc2Vuc3VzAQIsJEJ5R2VuZXNpcwEFAYAYQnlGb3JrAQAIMGJsb2NrX251bWJlcggoYmxvY2tfaGFzaCAgUG9sa2Fkb3QBAQUYS3VzYW1hAQEFHFdlc3RlbmQBAQUYUm9jb2NvAQEFGFdvY29jbwEBBSBFdGhlcmV1bQEABCBjaGFpbl9pZAgsQml0Y29pbkNvcmUBAQUsQml0Y29pbkNhc2gBAQVAUG9sa2Fkb3RCdWxsZXRpbgEBBQhYMgEEcQEBCAhYMwEEcQEBDAhYNAEEcQEBEAhYNQEEcQEBFAhYNgEEcQEBGAhYNwEEcQEBHAhYOAEEcQEBIAAIHHBhcmVudHMEIGludGVyaW9ydQECCCBDb25jcmV0ZQEACBxwYXJlbnRzBCBpbnRlcmlvcnUBIEFic3RyYWN0AQUBgAIICFYzAQAIIGxvY2F0aW9ueQEgYXNzZXRfaWR9AQhWNAEACCBsb2NhdGlvbnkBIGFzc2V0X2lkeQECEAxBbnkBAQUUTmFtZWQBBQAgUG9sa2Fkb3QBAQUYS3VzYW1hAQEFAigQVW5pdAEBBRROYW1lZAEFABRJbmRleAEBAiRFeGVjdXRpdmUBAQUkVGVjaG5pY2FsAQEFLExlZ2lzbGF0aXZlAQEFIEp1ZGljaWFsAQEFHERlZmVuc2UBAQU4QWRtaW5pc3RyYXRpb24BAQUgVHJlYXN1cnkBAQUCJCRQYXJhY2hhaW4BAQIsQWNjb3VudElkMzIBAAgcbmV0d29ya4UBCGlkIDhBY2NvdW50SW5kZXg2NAEACBxuZXR3b3JrhQEUaW5kZXgIMEFjY291bnRLZXkyMAEACBxuZXR3b3JrhQEMa2V5ZQE4UGFsbGV0SW5zdGFuY2UBAQIwR2VuZXJhbEluZGV4AQEDKEdlbmVyYWxLZXkBBQAkT25seUNoaWxkAQEFJFBsdXJhbGl0eQEACAhpZIkBEHBhcnRtAQIkEEhlcmUBAQUIWDEBAiQkUGFyYWNoYWluAQECLEFjY291bnRJZDMyAQAIHG5ldHdvcmuFAQhpZCA4QWNjb3VudEluZGV4NjQBAAgcbmV0d29ya4UBFGluZGV4CDBBY2NvdW50S2V5MjABAAgcbmV0d29ya4UBDGtleWUBOFBhbGxldEluc3RhbmNlAQECMEdlbmVyYWxJbmRleAEBAyhHZW5lcmFsS2V5AQUAJE9ubHlDaGlsZAEBBSRQbHVyYWxpdHkBAAgIaWSJARBwYXJ0bQEIWDIBBI0BAQgIWDMBBI0BAQwIWDQBBI0BARAIWDUBBI0BARQIWDYBBI0BARgIWDcBBI0BARwIWDgBBI0BASAACBxwYXJlbnRzBCBpbnRlcmlvcpEBAgwIVjIBAAgccGFyZW50cwQgaW50ZXJpb3KRAQhWMwEACBxwYXJlbnRzBCBpbnRlcmlvcnUBCFY0AQAIHHBhcmVudHMEIGludGVyaW9ydQECMCBTcGVuZGluZwEABEBidWRnZXRfcmVtYWluaW5nCBxBd2FyZGVkAQAMOHByb3Bvc2FsX2luZGV4BBRhd2FyZAgcYWNjb3VudAAUQnVybnQBAAQsYnVybnRfZnVuZHMIIFJvbGxvdmVyAQAEQHJvbGxvdmVyX2JhbGFuY2UIHERlcG9zaXQBAAQUdmFsdWUINFNwZW5kQXBwcm92ZWQBAAw4cHJvcG9zYWxfaW5kZXgEGGFtb3VudAgsYmVuZWZpY2lhcnkAPFVwZGF0ZWRJbmFjdGl2ZQEACCxyZWFjdGl2YXRlZAgsZGVhY3RpdmF0ZWQISEFzc2V0U3BlbmRBcHByb3ZlZAEAGBRpbmRleAQoYXNzZXRfa2luZIEBGGFtb3VudAgsYmVuZWZpY2lhcnmZASh2YWxpZF9mcm9tBCRleHBpcmVfYXQEQEFzc2V0U3BlbmRWb2lkZWQBAAQUaW5kZXgEEFBhaWQBAAgUaW5kZXgEKHBheW1lbnRfaWQINFBheW1lbnRGYWlsZWQBAAgUaW5kZXgEKHBheW1lbnRfaWQIOFNwZW5kUHJvY2Vzc2VkAQAEFGluZGV4BAIIJERlbGVnYXRlZAEEAAEILFVuZGVsZWdhdGVkAQEBAgwYTGVnYWN5AQAEEGhhc2ggGElubGluZQEFABhMb29rdXABAAgQaGFzaCAMbGVuBAAMEGF5ZXMIEG5heXMIHHN1cHBvcnQIAkAkU3VibWl0dGVkAQAMFGluZGV4BBR0cmFjawQgcHJvcG9zYWylAVREZWNpc2lvbkRlcG9zaXRQbGFjZWQBAAwUaW5kZXgEDHdobwAYYW1vdW50CFxEZWNpc2lvbkRlcG9zaXRSZWZ1bmRlZAEADBRpbmRleAQMd2hvABhhbW91bnQIOERlcG9zaXRTbGFzaGVkAQAIDHdobwAYYW1vdW50CDxEZWNpc2lvblN0YXJ0ZWQBABAUaW5kZXgEFHRyYWNrBCBwcm9wb3NhbKUBFHRhbGx5qQE4Q29uZmlybVN0YXJ0ZWQBAAQUaW5kZXgEOENvbmZpcm1BYm9ydGVkAQAEFGluZGV4BCRDb25maXJtZWQBAAgUaW5kZXgEFHRhbGx5qQEgQXBwcm92ZWQBAAQUaW5kZXgEIFJlamVjdGVkAQAIFGluZGV4BBR0YWxseakBIFRpbWVkT3V0AQAIFGluZGV4BBR0YWxseakBJENhbmNlbGxlZAEACBRpbmRleAQUdGFsbHmpARhLaWxsZWQBAAgUaW5kZXgEFHRhbGx5qQFkU3VibWlzc2lvbkRlcG9zaXRSZWZ1bmRlZAEADBRpbmRleAQMd2hvABhhbW91bnQILE1ldGFkYXRhU2V0AQAIFGluZGV4BBBoYXNoIDxNZXRhZGF0YUNsZWFyZWQBAAgUaW5kZXgEEGhhc2ggBhgACDRhY3R1YWxfd2VpZ2h0sQEgcGF5c19mZWU8AAgkcG9zdF9pbmZvtQEUZXJyb3IFAQe1AbkBAgw8Q2FsbFdoaXRlbGlzdGVkAQAEJGNhbGxfaGFzaCBYV2hpdGVsaXN0ZWRDYWxsUmVtb3ZlZAEABCRjYWxsX2hhc2ggZFdoaXRlbGlzdGVkQ2FsbERpc3BhdGNoZWQBAAgkY2FsbF9oYXNoIBhyZXN1bHS9AQIUME1pbkluZmxhdGlvbgEBBTBNYXhJbmZsYXRpb24BAQUoSWRlYWxTdGFrZQEBBRxGYWxsb2ZmAQEFPFVzZUF1Y3Rpb25TbG90cwEBBQIEJEluZmxhdGlvbgECFDBNaW5JbmZsYXRpb24BAQUwTWF4SW5mbGF0aW9uAQEFKElkZWFsU3Rha2UBAQUcRmFsbG9mZgEBBTxVc2VBdWN0aW9uU2xvdHMBAQUCFDBNaW5JbmZsYXRpb24BAQMwTWF4SW5mbGF0aW9uAQEDKElkZWFsU3Rha2UBAQMcRmFsbG9mZgEBAzxVc2VBdWN0aW9uU2xvdHMBAQACBCRJbmZsYXRpb24BAhQwTWluSW5mbGF0aW9uAQEDME1heEluZmxhdGlvbgEBAyhJZGVhbFN0YWtlAQEDHEZhbGxvZmYBAQM8VXNlQXVjdGlvblNsb3RzAQEABtEBAgQcVXBkYXRlZAEADAxrZXnJASRvbGRfdmFsdWXVASRuZXdfdmFsdWXVAQIEHENsYWltZWQBAAwMd2hvAEBldGhlcmV1bV9hZGRyZXNzZQEYYW1vdW50CAIIOFZlc3RpbmdVcGRhdGVkAQAIHGFjY291bnQAIHVudmVzdGVkCEBWZXN0aW5nQ29tcGxldGVkAQAEHGFjY291bnQAAhhAQmF0Y2hJbnRlcnJ1cHRlZAEACBRpbmRleAQUZXJyb3IFAThCYXRjaENvbXBsZXRlZAEBBWBCYXRjaENvbXBsZXRlZFdpdGhFcnJvcnMBAQU0SXRlbUNvbXBsZXRlZAEBBShJdGVtRmFpbGVkAQAEFGVycm9yBQEwRGlzcGF0Y2hlZEFzAQAEGHJlc3VsdBkBAhwMQW55AQEFLE5vblRyYW5zZmVyAQEFKEdvdmVybmFuY2UBAQUcU3Rha2luZwEBBSxDYW5jZWxQcm94eQEBBRxBdWN0aW9uAQEFPE5vbWluYXRpb25Qb29scwEBBQIUNFByb3h5RXhlY3V0ZWQBAAQYcmVzdWx0GQEsUHVyZUNyZWF0ZWQBABAQcHVyZQAMd2hvAChwcm94eV90eXBl6QFQZGlzYW1iaWd1YXRpb25faW5kZXgEJEFubm91bmNlZAEADBByZWFsABRwcm94eQAkY2FsbF9oYXNoIChQcm94eUFkZGVkAQAQJGRlbGVnYXRvcgAkZGVsZWdhdGVlAChwcm94eV90eXBl6QEUZGVsYXkEMFByb3h5UmVtb3ZlZAEAECRkZWxlZ2F0b3IAJGRlbGVnYXRlZQAocHJveHlfdHlwZekBFGRlbGF5BAAIGGhlaWdodAQUaW5kZXgEAhAsTmV3TXVsdGlzaWcBAAwkYXBwcm92aW5nACBtdWx0aXNpZwAkY2FsbF9oYXNoIEBNdWx0aXNpZ0FwcHJvdmFsAQAQJGFwcHJvdmluZwAkdGltZXBvaW508QEgbXVsdGlzaWcAJGNhbGxfaGFzaCBATXVsdGlzaWdFeGVjdXRlZAEAFCRhcHByb3ZpbmcAJHRpbWVwb2ludPEBIG11bHRpc2lnACRjYWxsX2hhc2ggGHJlc3VsdBkBRE11bHRpc2lnQ2FuY2VsbGVkAQAQKGNhbmNlbGxpbmcAJHRpbWVwb2ludPEBIG11bHRpc2lnACRjYWxsX2hhc2ggAiw4Qm91bnR5UHJvcG9zZWQBAAQUaW5kZXgEOEJvdW50eVJlamVjdGVkAQAIFGluZGV4BBBib25kCEhCb3VudHlCZWNhbWVBY3RpdmUBAAQUaW5kZXgENEJvdW50eUF3YXJkZWQBAAgUaW5kZXgELGJlbmVmaWNpYXJ5ADRCb3VudHlDbGFpbWVkAQAMFGluZGV4BBhwYXlvdXQILGJlbmVmaWNpYXJ5ADhCb3VudHlDYW5jZWxlZAEABBRpbmRleAQ4Qm91bnR5RXh0ZW5kZWQBAAQUaW5kZXgEOEJvdW50eUFwcHJvdmVkAQAEFGluZGV4BDxDdXJhdG9yUHJvcG9zZWQBAAgkYm91bnR5X2lkBBxjdXJhdG9yAERDdXJhdG9yVW5hc3NpZ25lZAEABCRib3VudHlfaWQEPEN1cmF0b3JBY2NlcHRlZAEACCRib3VudHlfaWQEHGN1cmF0b3IAAhAUQWRkZWQBAAgUaW5kZXgELGNoaWxkX2luZGV4BBxBd2FyZGVkAQAMFGluZGV4BCxjaGlsZF9pbmRleAQsYmVuZWZpY2lhcnkAHENsYWltZWQBABAUaW5kZXgELGNoaWxkX2luZGV4BBhwYXlvdXQILGJlbmVmaWNpYXJ5ACBDYW5jZWxlZAEACBRpbmRleAQsY2hpbGRfaW5kZXgEAhQcT25DaGFpbgEBBRhTaWduZWQBAQUgVW5zaWduZWQBAQUgRmFsbGJhY2sBAQUkRW1lcmdlbmN5AQEFBgAADDRtaW5pbWFsX3N0YWtlCCRzdW1fc3Rha2UIRHN1bV9zdGFrZV9zcXVhcmVkCAMIFAQCEAxPZmYBAQUYU2lnbmVkAQEFIFVuc2lnbmVkAQMIFAQkRW1lcmdlbmN5AQEFAhg4U29sdXRpb25TdG9yZWQBAAwcY29tcHV0ZQECGG9yaWdpbgUCMHByZXZfZWplY3RlZBRERWxlY3Rpb25GaW5hbGl6ZWQBAAgcY29tcHV0ZQECFHNjb3JlCQI4RWxlY3Rpb25GYWlsZWQBAQUgUmV3YXJkZWQBAAgcYWNjb3VudAAUdmFsdWUIHFNsYXNoZWQBAAgcYWNjb3VudAAUdmFsdWUIRFBoYXNlVHJhbnNpdGlvbmVkAQAMEGZyb20RAgh0bxECFHJvdW5kBAIIIFJlYmFnZ2VkAQAMDHdobwAQZnJvbQgIdG8IMFNjb3JlVXBkYXRlZAEACAx3aG8AJG5ld19zY29yZQgCDBBPcGVuAQEFHEJsb2NrZWQBAQUoRGVzdHJveWluZwEBBQMIBAAGIQIACDBtYXhfaW5jcmVhc2UEJG1pbl9kZWxheQQCCDhQZXJtaXNzaW9ubGVzcwEBBRxBY2NvdW50AQEBBi0CAkgcQ3JlYXRlZAEACCRkZXBvc2l0b3IAHHBvb2xfaWQEGEJvbmRlZAEAEBhtZW1iZXIAHHBvb2xfaWQEGGJvbmRlZAgYam9pbmVkFBxQYWlkT3V0AQAMGG1lbWJlcgAccG9vbF9pZAQYcGF5b3V0CCBVbmJvbmRlZAEAFBhtZW1iZXIAHHBvb2xfaWQEHGJhbGFuY2UIGHBvaW50cwgMZXJhBCRXaXRoZHJhd24BABAYbWVtYmVyABxwb29sX2lkBBxiYWxhbmNlCBhwb2ludHMIJERlc3Ryb3llZAEABBxwb29sX2lkBDBTdGF0ZUNoYW5nZWQBAAgccG9vbF9pZAQkbmV3X3N0YXRlHQI0TWVtYmVyUmVtb3ZlZAEACBxwb29sX2lkBBhtZW1iZXIAMFJvbGVzVXBkYXRlZAEADBByb290BQIcYm91bmNlcgUCJG5vbWluYXRvcgUCLFBvb2xTbGFzaGVkAQAIHHBvb2xfaWQEHGJhbGFuY2UIUFVuYm9uZGluZ1Bvb2xTbGFzaGVkAQAMHHBvb2xfaWQEDGVyYQQcYmFsYW5jZQhUUG9vbENvbW1pc3Npb25VcGRhdGVkAQAIHHBvb2xfaWQEHGN1cnJlbnQlAmBQb29sTWF4Q29tbWlzc2lvblVwZGF0ZWQBAAgccG9vbF9pZAQ4bWF4X2NvbW1pc3Npb24EfFBvb2xDb21taXNzaW9uQ2hhbmdlUmF0ZVVwZGF0ZWQBAAgccG9vbF9pZAQsY2hhbmdlX3JhdGUpApBQb29sQ29tbWlzc2lvbkNsYWltUGVybWlzc2lvblVwZGF0ZWQBAAgccG9vbF9pZAQocGVybWlzc2lvbjECVFBvb2xDb21taXNzaW9uQ2xhaW1lZAEACBxwb29sX2lkBChjb21taXNzaW9uCGRNaW5CYWxhbmNlRGVmaWNpdEFkanVzdGVkAQAIHHBvb2xfaWQEGGFtb3VudAhgTWluQmFsYW5jZUV4Y2Vzc0FkanVzdGVkAQAIHHBvb2xfaWQEGGFtb3VudAgEBAACFCBVbnN0YWtlZAEACBRzdGFzaAAYcmVzdWx0GQEcU2xhc2hlZAEACBRzdGFzaAAYYW1vdW50CDBCYXRjaENoZWNrZWQBAAQQZXJhczkCNEJhdGNoRmluaXNoZWQBAAQQc2l6ZQQ0SW50ZXJuYWxFcnJvcgEBBQUBAQEAJBxwYXJhX2lkBDByZWxheV9wYXJlbnQgIGNvbGxhdG9yIHhwZXJzaXN0ZWRfdmFsaWRhdGlvbl9kYXRhX2hhc2ggIHBvdl9oYXNoIDBlcmFzdXJlX3Jvb3QgJHNpZ25hdHVyZUECJHBhcmFfaGVhZCBQdmFsaWRhdGlvbl9jb2RlX2hhc2ggAAgoZGVzY3JpcHRvckUCQGNvbW1pdG1lbnRzX2hhc2ggAhA8Q2FuZGlkYXRlQmFja2VkAQMQSQIkBAREQ2FuZGlkYXRlSW5jbHVkZWQBAxBJAiQEBERDYW5kaWRhdGVUaW1lZE91dAEDDEkCJARYVXB3YXJkTWVzc2FnZXNSZWNlaXZlZAEACBBmcm9tBBRjb3VudAQCIEhDdXJyZW50Q29kZVVwZGF0ZWQBAQJIQ3VycmVudEhlYWRVcGRhdGVkAQECUENvZGVVcGdyYWRlU2NoZWR1bGVkAQECME5ld0hlYWROb3RlZAEBAjBBY3Rpb25RdWV1ZWQBBAQBCDxQdmZDaGVja1N0YXJ0ZWQBAwggBEBQdmZDaGVja0FjY2VwdGVkAQMIIARAUHZmQ2hlY2tSZWplY3RlZAEDCCAEAAgYc2VuZGVyBCRyZWNpcGllbnQEAhxQT3BlbkNoYW5uZWxSZXF1ZXN0ZWQBABAYc2VuZGVyBCRyZWNpcGllbnQEVHByb3Bvc2VkX21heF9jYXBhY2l0eQRkcHJvcG9zZWRfbWF4X21lc3NhZ2Vfc2l6ZQRMT3BlbkNoYW5uZWxDYW5jZWxlZAEACDBieV9wYXJhY2hhaW4EKGNoYW5uZWxfaWRVAkxPcGVuQ2hhbm5lbEFjY2VwdGVkAQAIGHNlbmRlcgQkcmVjaXBpZW50BDRDaGFubmVsQ2xvc2VkAQAIMGJ5X3BhcmFjaGFpbgQoY2hhbm5lbF9pZFUCWEhybXBDaGFubmVsRm9yY2VPcGVuZWQBABAYc2VuZGVyBCRyZWNpcGllbnQEVHByb3Bvc2VkX21heF9jYXBhY2l0eQRkcHJvcG9zZWRfbWF4X21lc3NhZ2Vfc2l6ZQRcSHJtcFN5c3RlbUNoYW5uZWxPcGVuZWQBABAYc2VuZGVyBCRyZWNpcGllbnQEVHByb3Bvc2VkX21heF9jYXBhY2l0eQRkcHJvcG9zZWRfbWF4X21lc3NhZ2Vfc2l6ZQRoT3BlbkNoYW5uZWxEZXBvc2l0c1VwZGF0ZWQBAAgYc2VuZGVyBCRyZWNpcGllbnQEAggUTG9jYWwBAQUYUmVtb3RlAQEFAggUVmFsaWQBAQUcSW52YWxpZAEBBQIMQERpc3B1dGVJbml0aWF0ZWQBAwggXQJARGlzcHV0ZUNvbmNsdWRlZAEDCCBhAhhSZXZlcnQBAQICCExPbkRlbWFuZE9yZGVyUGxhY2VkAQAMHHBhcmFfaWQEKHNwb3RfcHJpY2UIKG9yZGVyZWRfYnkAMFNwb3RQcmljZVNldAEABChzcG90X3ByaWNlCAIQKFJlZ2lzdGVyZWQBAAgccGFyYV9pZAQcbWFuYWdlcgAwRGVyZWdpc3RlcmVkAQAEHHBhcmFfaWQEIFJlc2VydmVkAQAIHHBhcmFfaWQEDHdobwAcU3dhcHBlZAEACBxwYXJhX2lkBCBvdGhlcl9pZAQCCDhOZXdMZWFzZVBlcmlvZAEABDBsZWFzZV9wZXJpb2QEGExlYXNlZAEAGBxwYXJhX2lkBBhsZWFzZXIAMHBlcmlvZF9iZWdpbgQwcGVyaW9kX2NvdW50BDhleHRyYV9yZXNlcnZlZAgwdG90YWxfYW1vdW50CAIcOEF1Y3Rpb25TdGFydGVkAQAMNGF1Y3Rpb25faW5kZXgEMGxlYXNlX3BlcmlvZAQYZW5kaW5nBDRBdWN0aW9uQ2xvc2VkAQAENGF1Y3Rpb25faW5kZXgEIFJlc2VydmVkAQAMGGJpZGRlcgA4ZXh0cmFfcmVzZXJ2ZWQIMHRvdGFsX2Ftb3VudAgoVW5yZXNlcnZlZAEACBhiaWRkZXIAGGFtb3VudAhIUmVzZXJ2ZUNvbmZpc2NhdGVkAQAMHHBhcmFfaWQEGGxlYXNlcgAYYW1vdW50CCxCaWRBY2NlcHRlZAEAFBhiaWRkZXIAHHBhcmFfaWQEGGFtb3VudAgoZmlyc3Rfc2xvdAQkbGFzdF9zbG90BDRXaW5uaW5nT2Zmc2V0AQAINGF1Y3Rpb25faW5kZXgEMGJsb2NrX251bWJlcgQCKBxDcmVhdGVkAQAEHHBhcmFfaWQELENvbnRyaWJ1dGVkAQAMDHdobwAoZnVuZF9pbmRleAQYYW1vdW50CCBXaXRoZHJldwEADAx3aG8AKGZ1bmRfaW5kZXgEGGFtb3VudAhEUGFydGlhbGx5UmVmdW5kZWQBAAQccGFyYV9pZAQsQWxsUmVmdW5kZWQBAAQccGFyYV9pZAQkRGlzc29sdmVkAQAEHHBhcmFfaWQEPEhhbmRsZUJpZFJlc3VsdAEACBxwYXJhX2lkBBhyZXN1bHQZARhFZGl0ZWQBAAQccGFyYV9pZAQsTWVtb1VwZGF0ZWQBAAwMd2hvABxwYXJhX2lkBBBtZW1vJDxBZGRlZFRvTmV3UmFpc2UBAAQccGFyYV9pZAQCCFBSZXZlbnVlSW5mb1JlcXVlc3RlZAEABBB3aGVuBDBDb3JlQXNzaWduZWQBAAQQY29yZQQCCBhTaWduZWQBAQUQQXV0bwEBBQIQIE1pZ3JhdGVkAQAMDHRvcAQUY2hpbGQEHGNvbXB1dGWBAhxTbGFzaGVkAQAIDHdobwAYYW1vdW50CFRBdXRvTWlncmF0aW9uRmluaXNoZWQBAQUYSGFsdGVkAQAEFGVycm9y5AKgIE92ZXJmbG93AQEFNFVuaW1wbGVtZW50ZWQBAQVgVW50cnVzdGVkUmVzZXJ2ZUxvY2F0aW9uAQEFZFVudHJ1c3RlZFRlbGVwb3J0TG9jYXRpb24BAQUwTG9jYXRpb25GdWxsAQEFVExvY2F0aW9uTm90SW52ZXJ0aWJsZQEBBSRCYWRPcmlnaW4BAQU8SW52YWxpZExvY2F0aW9uAQEFNEFzc2V0Tm90Rm91bmQBAQVURmFpbGVkVG9UcmFuc2FjdEFzc2V0AQEFPE5vdFdpdGhkcmF3YWJsZQEBBUhMb2NhdGlvbkNhbm5vdEhvbGQBAQVURXhjZWVkc01heE1lc3NhZ2VTaXplAQEFWERlc3RpbmF0aW9uVW5zdXBwb3J0ZWQBAQUkVHJhbnNwb3J0AQEFKFVucm91dGFibGUBAQUwVW5rbm93bkNsYWltAQEFOEZhaWxlZFRvRGVjb2RlAQEFQE1heFdlaWdodEludmFsaWQBAQU4Tm90SG9sZGluZ0ZlZXMBAQUwVG9vRXhwZW5zaXZlAQEFEFRyYXABAQNARXhwZWN0YXRpb25GYWxzZQEBBThQYWxsZXROb3RGb3VuZAEBBTBOYW1lTWlzbWF0Y2gBAQVMVmVyc2lvbkluY29tcGF0aWJsZQEBBVBIb2xkaW5nV291bGRPdmVyZmxvdwEBBSxFeHBvcnRFcnJvcgEBBThSZWFuY2hvckZhaWxlZAEBBRhOb0RlYWwBAQUoRmVlc05vdE1ldAEBBSRMb2NrRXJyb3IBAQUwTm9QZXJtaXNzaW9uAQEFKFVuYW5jaG9yZWQBAQU4Tm90RGVwb3NpdGFibGUBAQVMVW5oYW5kbGVkWGNtVmVyc2lvbgEBBUhXZWlnaHRMaW1pdFJlYWNoZWQBAAggcmVmX3RpbWUIKHByb29mX3NpemUIHEJhcnJpZXIBAQVMV2VpZ2h0Tm90Q29tcHV0YWJsZQEBBURFeGNlZWRzU3RhY2tMaW1pdAEBBQIMIENvbXBsZXRlAQAEEHVzZWQYKEluY29tcGxldGUBAAgQdXNlZBgUZXJyb3KJAhRFcnJvcgEABBRlcnJvcokCBQEgAhgkVW5kZWZpbmVkAQEFFEluZGV4AQEDGEFycmF5NAEFARAYQXJyYXk4AQUBIBxBcnJheTE2AQUBQBxBcnJheTMyAQUBgAIIIEZ1bmdpYmxlAQEDLE5vbkZ1bmdpYmxlAQIYJFVuZGVmaW5lZAEBBRRJbmRleAEBAxhBcnJheTQBBQEQGEFycmF5OAEFASAcQXJyYXkxNgEFAUAcQXJyYXkzMgEFAYAACAhpZHkBDGZ1bpkCBJ0CAAMIBIkCBqUCABgUaW5kZXgEEG5hbWUkLG1vZHVsZV9uYW1lJBRtYWpvcgQUbWlub3IEFHBhdGNoBAStAgACDBxTdWNjZXNzAQEFFEVycm9yAQUAOFRydW5jYXRlZEVycm9yAQUAAhgQTnVsbAEBBRhBc3NldHMBBJ0CADxFeGVjdXRpb25SZXN1bHQBBqUCHFZlcnNpb24BAQIsUGFsbGV0c0luZm8BBK0CADhEaXNwYXRjaFJlc3VsdAECDBxTdWNjZXNzAQEFFEVycm9yAQUAOFRydW5jYXRlZEVycm9yAQUABnkBAhAYTmF0aXZlAQEFQFNvdmVyZWlnbkFjY291bnQBAQUkU3VwZXJ1c2VyAQEFDFhjbQEBBQRxAQEIBHEBAQwEcQEBEARxAQEUBHEBARgEcQEBHARxAQEgAAwsZGVzdGluYXRpb255ASBxdWVyeV9pZAgobWF4X3dlaWdodBgCCCBGdW5naWJsZQEBBSxOb25GdW5naWJsZQEBBQIQDEFsbAEBBRRBbGxPZgEACAhpZHkBDGZ1buUCKEFsbENvdW50ZWQBAQIwQWxsT2ZDb3VudGVkAQAMCGlkeQEMZnVu5QIUY291bnQEAgggRGVmaW5pdGUBBJ0CABBXaWxkAQIQDEFsbAEBBRRBbGxPZgEACAhpZHkBDGZ1buUCKEFsbENvdW50ZWQBAQIwQWxsT2ZDb3VudGVkAQAMCGlkeQEMZnVu5QIUY291bnQEAggkVW5saW1pdGVkAQEFHExpbWl0ZWQBAAggcmVmX3RpbWUIKHByb29mX3NpemUIAsA0V2l0aGRyYXdBc3NldAEEnQIAVFJlc2VydmVBc3NldERlcG9zaXRlZAEEnQIAWFJlY2VpdmVUZWxlcG9ydGVkQXNzZXQBBJ0CADRRdWVyeVJlc3BvbnNlAQAQIHF1ZXJ5X2lkCCByZXNwb25zZbkCKG1heF93ZWlnaHQYHHF1ZXJpZXK9AjRUcmFuc2ZlckFzc2V0AQAIGGFzc2V0c6ECLGJlbmVmaWNpYXJ5eQFQVHJhbnNmZXJSZXNlcnZlQXNzZXQBAAwYYXNzZXRzoQIQZGVzdHkBDHhjbfkCIFRyYW5zYWN0AQAMLG9yaWdpbl9raW5kwQJYcmVxdWlyZV93ZWlnaHRfYXRfbW9zdBgQY2FsbCRkSHJtcE5ld0NoYW5uZWxPcGVuUmVxdWVzdAEADBhzZW5kZXIEQG1heF9tZXNzYWdlX3NpemUEMG1heF9jYXBhY2l0eQRMSHJtcENoYW5uZWxBY2NlcHRlZAEABCRyZWNpcGllbnQESEhybXBDaGFubmVsQ2xvc2luZwEADCRpbml0aWF0b3IEGHNlbmRlcgQkcmVjaXBpZW50BCxDbGVhck9yaWdpbgEBBTREZXNjZW5kT3JpZ2luAQIkEEhlcmUBAQUIWDEBAigkUGFyYWNoYWluAQECLEFjY291bnRJZDMyAQAIHG5ldHdvcmthAQhpZCA4QWNjb3VudEluZGV4NjQBAAgcbmV0d29ya2EBFGluZGV4CDBBY2NvdW50S2V5MjABAAgcbmV0d29ya2EBDGtleWUBOFBhbGxldEluc3RhbmNlAQECMEdlbmVyYWxJbmRleAEBAyhHZW5lcmFsS2V5AQAIGGxlbmd0aAQQZGF0YSAkT25seUNoaWxkAQEFJFBsdXJhbGl0eQEACAhpZGkBEHBhcnRtATxHbG9iYWxDb25zZW5zdXMBAiwkQnlHZW5lc2lzAQUBgBhCeUZvcmsBAAgwYmxvY2tfbnVtYmVyCChibG9ja19oYXNoICBQb2xrYWRvdAEBBRhLdXNhbWEBAQUcV2VzdGVuZAEBBRhSb2NvY28BAQUYV29jb2NvAQEFIEV0aGVyZXVtAQAEIGNoYWluX2lkCCxCaXRjb2luQ29yZQEBBSxCaXRjb2luQ2FzaAEBBUBQb2xrYWRvdEJ1bGxldGluAQEFCFgyAQRxAQEICFgzAQRxAQEMCFg0AQRxAQEQCFg1AQRxAQEUCFg2AQRxAQEYCFg3AQRxAQEcCFg4AQRxAQEgLFJlcG9ydEVycm9yAQAMLGRlc3RpbmF0aW9ueQEgcXVlcnlfaWQIKG1heF93ZWlnaHQYMERlcG9zaXRBc3NldAEACBhhc3NldHPtAixiZW5lZmljaWFyeXkBTERlcG9zaXRSZXNlcnZlQXNzZXQBAAwYYXNzZXRz7QIQZGVzdHkBDHhjbfkCNEV4Y2hhbmdlQXNzZXQBAAwQZ2l2Ze0CEHdhbnShAhxtYXhpbWFsFFxJbml0aWF0ZVJlc2VydmVXaXRoZHJhdwEADBhhc3NldHPtAhxyZXNlcnZleQEMeGNt+QJASW5pdGlhdGVUZWxlcG9ydAEADBhhc3NldHPtAhBkZXN0eQEMeGNt+QI0UmVwb3J0SG9sZGluZwEACDRyZXNwb25zZV9pbmZv4QIYYXNzZXRz7QIwQnV5RXhlY3V0aW9uAQAIEGZlZXOdAjB3ZWlnaHRfbGltaXTxAjRSZWZ1bmRTdXJwbHVzAQEFPFNldEVycm9ySGFuZGxlcgEE9QIALFNldEFwcGVuZGl4AQT1AgAoQ2xlYXJFcnJvcgEBBShDbGFpbUFzc2V0AQAIGGFzc2V0c6ECGHRpY2tldHkBEFRyYXABAQNAU3Vic2NyaWJlVmVyc2lvbgEACCBxdWVyeV9pZAhMbWF4X3Jlc3BvbnNlX3dlaWdodBhIVW5zdWJzY3JpYmVWZXJzaW9uAQEFJEJ1cm5Bc3NldAEEnQIALEV4cGVjdEFzc2V0AQSdAgAwRXhwZWN0T3JpZ2luAQZ5ASxFeHBlY3RFcnJvcgEGpQJQRXhwZWN0VHJhbnNhY3RTdGF0dXMBAgwcU3VjY2VzcwEBBRRFcnJvcgEFADhUcnVuY2F0ZWRFcnJvcgEFACxRdWVyeVBhbGxldAEACCxtb2R1bGVfbmFtZSQ0cmVzcG9uc2VfaW5mb+ECMEV4cGVjdFBhbGxldAEAFBRpbmRleAQQbmFtZSQsbW9kdWxlX25hbWUkLGNyYXRlX21ham9yBDxtaW5fY3JhdGVfbWlub3IEUFJlcG9ydFRyYW5zYWN0U3RhdHVzAQAMLGRlc3RpbmF0aW9ueQEgcXVlcnlfaWQIKG1heF93ZWlnaHQYTENsZWFyVHJhbnNhY3RTdGF0dXMBAQU8VW5pdmVyc2FsT3JpZ2luAQIoJFBhcmFjaGFpbgEBAixBY2NvdW50SWQzMgEACBxuZXR3b3JrYQEIaWQgOEFjY291bnRJbmRleDY0AQAIHG5ldHdvcmthARRpbmRleAgwQWNjb3VudEtleTIwAQAIHG5ldHdvcmthAQxrZXllAThQYWxsZXRJbnN0YW5jZQEBAjBHZW5lcmFsSW5kZXgBAQMoR2VuZXJhbEtleQEACBhsZW5ndGgEEGRhdGEgJE9ubHlDaGlsZAEBBSRQbHVyYWxpdHkBAAgIaWRpARBwYXJ0bQE8R2xvYmFsQ29uc2Vuc3VzAQIsJEJ5R2VuZXNpcwEFAYAYQnlGb3JrAQAIMGJsb2NrX251bWJlcggoYmxvY2tfaGFzaCAgUG9sa2Fkb3QBAQUYS3VzYW1hAQEFHFdlc3RlbmQBAQUYUm9jb2NvAQEFGFdvY29jbwEBBSBFdGhlcmV1bQEABCBjaGFpbl9pZAgsQml0Y29pbkNvcmUBAQUsQml0Y29pbkNhc2gBAQVAUG9sa2Fkb3RCdWxsZXRpbgEBBTRFeHBvcnRNZXNzYWdlAQAMHG5ldHdvcmtdASxkZXN0aW5hdGlvbnUBDHhjbfkCJExvY2tBc3NldAEACBRhc3NldJ0CIHVubG9ja2VyeQEsVW5sb2NrQXNzZXQBAAgUYXNzZXSdAhh0YXJnZXR5AThOb3RlVW5sb2NrYWJsZQEACBRhc3NldJ0CFG93bmVyeQE0UmVxdWVzdFVubG9jawEACBRhc3NldJ0CGGxvY2tlcnkBLFNldEZlZXNNb2RlAQAEMGppdF93aXRoZHJhdxQgU2V0VG9waWMBBQGAKENsZWFyVG9waWMBAQUsQWxpYXNPcmlnaW4BAAgccGFyZW50cwQgaW50ZXJpb3J1ATxVbnBhaWRFeGVjdXRpb24BAAgwd2VpZ2h0X2xpbWl08QIwY2hlY2tfb3JpZ2luvQIE9QIAAgggQ29uY3JldGUBAAgccGFyZW50cwQgaW50ZXJpb3KRASBBYnN0cmFjdAEFAAIcJFVuZGVmaW5lZAEBBRRJbmRleAEBAxhBcnJheTQBBQEQGEFycmF5OAEFASAcQXJyYXkxNgEFAUAcQXJyYXkzMgEFAYAQQmxvYgEFAAIIIEZ1bmdpYmxlAQEDLE5vbkZ1bmdpYmxlAQIcJFVuZGVmaW5lZAEBBRRJbmRleAEBAxhBcnJheTQBBQEQGEFycmF5OAEFASAcQXJyYXkxNgEFAUAcQXJyYXkzMgEFAYAQQmxvYgEFAAAICGlk/QIMZnVuBQMECQMAAAgIaWR9AQxmdW6ZAgQRAwACDAhWMgEECQMACFYzAQQRAwAIVjQBBJ0CAAJgJEF0dGVtcHRlZAEABBxvdXRjb21ljQIQU2VudAEAEBhvcmlnaW55ASxkZXN0aW5hdGlvbnkBHG1lc3NhZ2X5AihtZXNzYWdlX2lkIEhVbmV4cGVjdGVkUmVzcG9uc2UBAAgYb3JpZ2lueQEgcXVlcnlfaWQINFJlc3BvbnNlUmVhZHkBAAggcXVlcnlfaWQIIHJlc3BvbnNluQIgTm90aWZpZWQBAAwgcXVlcnlfaWQIMHBhbGxldF9pbmRleAQoY2FsbF9pbmRleARATm90aWZ5T3ZlcndlaWdodAEAFCBxdWVyeV9pZAgwcGFsbGV0X2luZGV4BChjYWxsX2luZGV4BDRhY3R1YWxfd2VpZ2h0GExtYXhfYnVkZ2V0ZWRfd2VpZ2h0GExOb3RpZnlEaXNwYXRjaEVycm9yAQAMIHF1ZXJ5X2lkCDBwYWxsZXRfaW5kZXgEKGNhbGxfaW5kZXgESE5vdGlmeURlY29kZUZhaWxlZAEADCBxdWVyeV9pZAgwcGFsbGV0X2luZGV4BChjYWxsX2luZGV4BEBJbnZhbGlkUmVzcG9uZGVyAQAMGG9yaWdpbnkBIHF1ZXJ5X2lkCERleHBlY3RlZF9sb2NhdGlvbr0CXEludmFsaWRSZXNwb25kZXJWZXJzaW9uAQAIGG9yaWdpbnkBIHF1ZXJ5X2lkCDRSZXNwb25zZVRha2VuAQAEIHF1ZXJ5X2lkCDRBc3NldHNUcmFwcGVkAQAMEGhhc2ggGG9yaWdpbnkBGGFzc2V0cxkDVFZlcnNpb25DaGFuZ2VOb3RpZmllZAEAECxkZXN0aW5hdGlvbnkBGHJlc3VsdAQQY29zdKECKG1lc3NhZ2VfaWQgXFN1cHBvcnRlZFZlcnNpb25DaGFuZ2VkAQAIIGxvY2F0aW9ueQEcdmVyc2lvbgRQTm90aWZ5VGFyZ2V0U2VuZEZhaWwBAAwgbG9jYXRpb255ASBxdWVyeV9pZAgUZXJyb3KJAmROb3RpZnlUYXJnZXRNaWdyYXRpb25GYWlsAQAIIGxvY2F0aW9umQEgcXVlcnlfaWQIVEludmFsaWRRdWVyaWVyVmVyc2lvbgEACBhvcmlnaW55ASBxdWVyeV9pZAg4SW52YWxpZFF1ZXJpZXIBABAYb3JpZ2lueQEgcXVlcnlfaWQIQGV4cGVjdGVkX3F1ZXJpZXJ5AVBtYXliZV9hY3R1YWxfcXVlcmllcr0CUFZlcnNpb25Ob3RpZnlTdGFydGVkAQAMLGRlc3RpbmF0aW9ueQEQY29zdKECKG1lc3NhZ2VfaWQgWFZlcnNpb25Ob3RpZnlSZXF1ZXN0ZWQBAAwsZGVzdGluYXRpb255ARBjb3N0oQIobWVzc2FnZV9pZCBgVmVyc2lvbk5vdGlmeVVucmVxdWVzdGVkAQAMLGRlc3RpbmF0aW9ueQEQY29zdKECKG1lc3NhZ2VfaWQgIEZlZXNQYWlkAQAIGHBheWluZ3kBEGZlZXOhAjRBc3NldHNDbGFpbWVkAQAMEGhhc2ggGG9yaWdpbnkBGGFzc2V0cxkDYFZlcnNpb25NaWdyYXRpb25GaW5pc2hlZAEABBx2ZXJzaW9uBAIEEFBhcmEBAQICBAxVbXABAgQQUGFyYQEBAgIYJEJhZEZvcm1hdAEBBRxDb3JydXB0AQEFLFVuc3VwcG9ydGVkAQEFKE92ZXJ3ZWlnaHQBAAggcmVmX3RpbWUIKHByb29mX3NpemUIFFlpZWxkAQEFRFN0YWNrTGltaXRSZWFjaGVkAQEFAhBAUHJvY2Vzc2luZ0ZhaWxlZAEADAhpZCAYb3JpZ2luJQMUZXJyb3IpAyRQcm9jZXNzZWQBABAIaWQgGG9yaWdpbiUDLHdlaWdodF91c2VkGBxzdWNjZXNzFEhPdmVyd2VpZ2h0RW5xdWV1ZWQBABAIaWQgGG9yaWdpbiUDKHBhZ2VfaW5kZXgENG1lc3NhZ2VfaW5kZXgEKFBhZ2VSZWFwZWQBAAgYb3JpZ2luJQMUaW5kZXgEAgxAQXNzZXRSYXRlQ3JlYXRlZAEACChhc3NldF9raW5kgQEQcmF0ZQhAQXNzZXRSYXRlUmVtb3ZlZAEABChhc3NldF9raW5kgQFAQXNzZXRSYXRlVXBkYXRlZAEADChhc3NldF9raW5kgQEMb2xkCAxuZXcIAqAYU3lzdGVtAQIcQEV4dHJpbnNpY1N1Y2Nlc3MBAAQ0ZGlzcGF0Y2hfaW5mb0A8RXh0cmluc2ljRmFpbGVkAQAIOGRpc3BhdGNoX2Vycm9yBQE0ZGlzcGF0Y2hfaW5mb0AsQ29kZVVwZGF0ZWQBAQUoTmV3QWNjb3VudAEABBxhY2NvdW50ADRLaWxsZWRBY2NvdW50AQAEHGFjY291bnQAIFJlbWFya2VkAQAIGHNlbmRlcgAQaGFzaCBEVXBncmFkZUF1dGhvcml6ZWQBAAgkY29kZV9oYXNoIDRjaGVja192ZXJzaW9uFCRTY2hlZHVsZXIBAiQkU2NoZWR1bGVkAQAIEHdoZW4EFGluZGV4BCBDYW5jZWxlZAEACBB3aGVuBBRpbmRleAQoRGlzcGF0Y2hlZAEADBB0YXNrDQEIaWQRARhyZXN1bHQZASBSZXRyeVNldAEAEBB0YXNrDQEIaWQRARhwZXJpb2QEHHJldHJpZXMEOFJldHJ5Q2FuY2VsbGVkAQAIEHRhc2sNAQhpZBEBPENhbGxVbmF2YWlsYWJsZQEACBB0YXNrDQEIaWQRAThQZXJpb2RpY0ZhaWxlZAEACBB0YXNrDQEIaWQRASxSZXRyeUZhaWxlZAEACBB0YXNrDQEIaWQRAVRQZXJtYW5lbnRseU92ZXJ3ZWlnaHQBAAgQdGFzaw0BCGlkEQEgUHJlaW1hZ2UBAgwUTm90ZWQBAAQQaGFzaCAkUmVxdWVzdGVkAQAEEGhhc2ggHENsZWFyZWQBAAQQaGFzaCAcSW5kaWNlcwECDDRJbmRleEFzc2lnbmVkAQAIDHdobwAUaW5kZXgEKEluZGV4RnJlZWQBAAQUaW5kZXgELEluZGV4RnJvemVuAQAIFGluZGV4BAx3aG8AIEJhbGFuY2VzAQJYHEVuZG93ZWQBAAgcYWNjb3VudAAwZnJlZV9iYWxhbmNlCCBEdXN0TG9zdAEACBxhY2NvdW50ABhhbW91bnQIIFRyYW5zZmVyAQAMEGZyb20ACHRvABhhbW91bnQIKEJhbGFuY2VTZXQBAAgMd2hvABBmcmVlCCBSZXNlcnZlZAEACAx3aG8AGGFtb3VudAgoVW5yZXNlcnZlZAEACAx3aG8AGGFtb3VudAhIUmVzZXJ2ZVJlcGF0cmlhdGVkAQAQEGZyb20ACHRvABhhbW91bnQISGRlc3RpbmF0aW9uX3N0YXR1cykBHERlcG9zaXQBAAgMd2hvABhhbW91bnQIIFdpdGhkcmF3AQAIDHdobwAYYW1vdW50CBxTbGFzaGVkAQAIDHdobwAYYW1vdW50CBhNaW50ZWQBAAgMd2hvABhhbW91bnQIGEJ1cm5lZAEACAx3aG8AGGFtb3VudAgkU3VzcGVuZGVkAQAIDHdobwAYYW1vdW50CCBSZXN0b3JlZAEACAx3aG8AGGFtb3VudAggVXBncmFkZWQBAAQMd2hvABhJc3N1ZWQBAAQYYW1vdW50CCRSZXNjaW5kZWQBAAQYYW1vdW50CBhMb2NrZWQBAAgMd2hvABhhbW91bnQIIFVubG9ja2VkAQAIDHdobwAYYW1vdW50CBhGcm96ZW4BAAgMd2hvABhhbW91bnQIGFRoYXdlZAEACAx3aG8AGGFtb3VudAhMVG90YWxJc3N1YW5jZUZvcmNlZAEACAxvbGQIDG5ldwhIVHJhbnNhY3Rpb25QYXltZW50AQIESFRyYW5zYWN0aW9uRmVlUGFpZAEADAx3aG8AKGFjdHVhbF9mZWUIDHRpcAgcU3Rha2luZwECSBxFcmFQYWlkAQAMJGVyYV9pbmRleARAdmFsaWRhdG9yX3BheW91dAgkcmVtYWluZGVyCCBSZXdhcmRlZAEADBRzdGFzaAAQZGVzdDUBGGFtb3VudAgcU2xhc2hlZAEACBhzdGFrZXIAGGFtb3VudAg0U2xhc2hSZXBvcnRlZAEADCR2YWxpZGF0b3IAIGZyYWN0aW9uBCRzbGFzaF9lcmEEaE9sZFNsYXNoaW5nUmVwb3J0RGlzY2FyZGVkAQAENHNlc3Npb25faW5kZXgEOFN0YWtlcnNFbGVjdGVkAQEFGEJvbmRlZAEACBRzdGFzaAAYYW1vdW50CCBVbmJvbmRlZAEACBRzdGFzaAAYYW1vdW50CCRXaXRoZHJhd24BAAgUc3Rhc2gAGGFtb3VudAgYS2lja2VkAQAIJG5vbWluYXRvcgAUc3Rhc2gAVFN0YWtpbmdFbGVjdGlvbkZhaWxlZAEBBRxDaGlsbGVkAQAEFHN0YXNoADRQYXlvdXRTdGFydGVkAQAIJGVyYV9pbmRleAQ8dmFsaWRhdG9yX3N0YXNoAERWYWxpZGF0b3JQcmVmc1NldAEACBRzdGFzaAAUcHJlZnM5AWhTbmFwc2hvdFZvdGVyc1NpemVFeGNlZWRlZAEABBBzaXplBGxTbmFwc2hvdFRhcmdldHNTaXplRXhjZWVkZWQBAAQQc2l6ZQQgRm9yY2VFcmEBAAQQbW9kZT0BZENvbnRyb2xsZXJCYXRjaERlcHJlY2F0ZWQBAAQgZmFpbHVyZXMEIE9mZmVuY2VzAQIEHE9mZmVuY2UBAAgQa2luZEUBIHRpbWVzbG90JBxTZXNzaW9uAQIEKE5ld1Nlc3Npb24BAAQ0c2Vzc2lvbl9pbmRleAQcR3JhbmRwYQECDDhOZXdBdXRob3JpdGllcwEABDRhdXRob3JpdHlfc2V0VQEYUGF1c2VkAQEFHFJlc3VtZWQBAQUgVHJlYXN1cnkBAjAgU3BlbmRpbmcBAARAYnVkZ2V0X3JlbWFpbmluZwgcQXdhcmRlZAEADDhwcm9wb3NhbF9pbmRleAQUYXdhcmQIHGFjY291bnQAFEJ1cm50AQAELGJ1cm50X2Z1bmRzCCBSb2xsb3ZlcgEABEByb2xsb3Zlcl9iYWxhbmNlCBxEZXBvc2l0AQAEFHZhbHVlCDRTcGVuZEFwcHJvdmVkAQAMOHByb3Bvc2FsX2luZGV4BBhhbW91bnQILGJlbmVmaWNpYXJ5ADxVcGRhdGVkSW5hY3RpdmUBAAgscmVhY3RpdmF0ZWQILGRlYWN0aXZhdGVkCEhBc3NldFNwZW5kQXBwcm92ZWQBABgUaW5kZXgEKGFzc2V0X2tpbmSBARhhbW91bnQILGJlbmVmaWNpYXJ5mQEodmFsaWRfZnJvbQQkZXhwaXJlX2F0BEBBc3NldFNwZW5kVm9pZGVkAQAEFGluZGV4BBBQYWlkAQAIFGluZGV4BChwYXltZW50X2lkCDRQYXltZW50RmFpbGVkAQAIFGluZGV4BChwYXltZW50X2lkCDhTcGVuZFByb2Nlc3NlZAEABBRpbmRleARAQ29udmljdGlvblZvdGluZwECCCREZWxlZ2F0ZWQBBAABCCxVbmRlbGVnYXRlZAEBASRSZWZlcmVuZGEBAkAkU3VibWl0dGVkAQAMFGluZGV4BBR0cmFjawQgcHJvcG9zYWylAVREZWNpc2lvbkRlcG9zaXRQbGFjZWQBAAwUaW5kZXgEDHdobwAYYW1vdW50CFxEZWNpc2lvbkRlcG9zaXRSZWZ1bmRlZAEADBRpbmRleAQMd2hvABhhbW91bnQIOERlcG9zaXRTbGFzaGVkAQAIDHdobwAYYW1vdW50CDxEZWNpc2lvblN0YXJ0ZWQBABAUaW5kZXgEFHRyYWNrBCBwcm9wb3NhbKUBFHRhbGx5qQE4Q29uZmlybVN0YXJ0ZWQBAAQUaW5kZXgEOENvbmZpcm1BYm9ydGVkAQAEFGluZGV4BCRDb25maXJtZWQBAAgUaW5kZXgEFHRhbGx5qQEgQXBwcm92ZWQBAAQUaW5kZXgEIFJlamVjdGVkAQAIFGluZGV4BBR0YWxseakBIFRpbWVkT3V0AQAIFGluZGV4BBR0YWxseakBJENhbmNlbGxlZAEACBRpbmRleAQUdGFsbHmpARhLaWxsZWQBAAgUaW5kZXgEFHRhbGx5qQFkU3VibWlzc2lvbkRlcG9zaXRSZWZ1bmRlZAEADBRpbmRleAQMd2hvABhhbW91bnQILE1ldGFkYXRhU2V0AQAIFGluZGV4BBBoYXNoIDxNZXRhZGF0YUNsZWFyZWQBAAgUaW5kZXgEEGhhc2ggJFdoaXRlbGlzdAECDDxDYWxsV2hpdGVsaXN0ZWQBAAQkY2FsbF9oYXNoIFhXaGl0ZWxpc3RlZENhbGxSZW1vdmVkAQAEJGNhbGxfaGFzaCBkV2hpdGVsaXN0ZWRDYWxsRGlzcGF0Y2hlZAEACCRjYWxsX2hhc2ggGHJlc3VsdL0BKFBhcmFtZXRlcnMBAgQcVXBkYXRlZAEADAxrZXnJASRvbGRfdmFsdWXVASRuZXdfdmFsdWXVARhDbGFpbXMBAgQcQ2xhaW1lZAEADAx3aG8AQGV0aGVyZXVtX2FkZHJlc3NlARhhbW91bnQIHFZlc3RpbmcBAgg4VmVzdGluZ1VwZGF0ZWQBAAgcYWNjb3VudAAgdW52ZXN0ZWQIQFZlc3RpbmdDb21wbGV0ZWQBAAQcYWNjb3VudAAcVXRpbGl0eQECGEBCYXRjaEludGVycnVwdGVkAQAIFGluZGV4BBRlcnJvcgUBOEJhdGNoQ29tcGxldGVkAQEFYEJhdGNoQ29tcGxldGVkV2l0aEVycm9ycwEBBTRJdGVtQ29tcGxldGVkAQEFKEl0ZW1GYWlsZWQBAAQUZXJyb3IFATBEaXNwYXRjaGVkQXMBAAQYcmVzdWx0GQEUUHJveHkBAhQ0UHJveHlFeGVjdXRlZAEABBhyZXN1bHQZASxQdXJlQ3JlYXRlZAEAEBBwdXJlAAx3aG8AKHByb3h5X3R5cGXpAVBkaXNhbWJpZ3VhdGlvbl9pbmRleAQkQW5ub3VuY2VkAQAMEHJlYWwAFHByb3h5ACRjYWxsX2hhc2ggKFByb3h5QWRkZWQBABAkZGVsZWdhdG9yACRkZWxlZ2F0ZWUAKHByb3h5X3R5cGXpARRkZWxheQQwUHJveHlSZW1vdmVkAQAQJGRlbGVnYXRvcgAkZGVsZWdhdGVlAChwcm94eV90eXBl6QEUZGVsYXkEIE11bHRpc2lnAQIQLE5ld011bHRpc2lnAQAMJGFwcHJvdmluZwAgbXVsdGlzaWcAJGNhbGxfaGFzaCBATXVsdGlzaWdBcHByb3ZhbAEAECRhcHByb3ZpbmcAJHRpbWVwb2ludPEBIG11bHRpc2lnACRjYWxsX2hhc2ggQE11bHRpc2lnRXhlY3V0ZWQBABQkYXBwcm92aW5nACR0aW1lcG9pbnTxASBtdWx0aXNpZwAkY2FsbF9oYXNoIBhyZXN1bHQZAURNdWx0aXNpZ0NhbmNlbGxlZAEAEChjYW5jZWxsaW5nACR0aW1lcG9pbnTxASBtdWx0aXNpZwAkY2FsbF9oYXNoICBCb3VudGllcwECLDhCb3VudHlQcm9wb3NlZAEABBRpbmRleAQ4Qm91bnR5UmVqZWN0ZWQBAAgUaW5kZXgEEGJvbmQISEJvdW50eUJlY2FtZUFjdGl2ZQEABBRpbmRleAQ0Qm91bnR5QXdhcmRlZAEACBRpbmRleAQsYmVuZWZpY2lhcnkANEJvdW50eUNsYWltZWQBAAwUaW5kZXgEGHBheW91dAgsYmVuZWZpY2lhcnkAOEJvdW50eUNhbmNlbGVkAQAEFGluZGV4BDhCb3VudHlFeHRlbmRlZAEABBRpbmRleAQ4Qm91bnR5QXBwcm92ZWQBAAQUaW5kZXgEPEN1cmF0b3JQcm9wb3NlZAEACCRib3VudHlfaWQEHGN1cmF0b3IAREN1cmF0b3JVbmFzc2lnbmVkAQAEJGJvdW50eV9pZAQ8Q3VyYXRvckFjY2VwdGVkAQAIJGJvdW50eV9pZAQcY3VyYXRvcgA0Q2hpbGRCb3VudGllcwECEBRBZGRlZAEACBRpbmRleAQsY2hpbGRfaW5kZXgEHEF3YXJkZWQBAAwUaW5kZXgELGNoaWxkX2luZGV4BCxiZW5lZmljaWFyeQAcQ2xhaW1lZAEAEBRpbmRleAQsY2hpbGRfaW5kZXgEGHBheW91dAgsYmVuZWZpY2lhcnkAIENhbmNlbGVkAQAIFGluZGV4BCxjaGlsZF9pbmRleARoRWxlY3Rpb25Qcm92aWRlck11bHRpUGhhc2UBAhg4U29sdXRpb25TdG9yZWQBAAwcY29tcHV0ZQECGG9yaWdpbgUCMHByZXZfZWplY3RlZBRERWxlY3Rpb25GaW5hbGl6ZWQBAAgcY29tcHV0ZQECFHNjb3JlCQI4RWxlY3Rpb25GYWlsZWQBAQUgUmV3YXJkZWQBAAgcYWNjb3VudAAUdmFsdWUIHFNsYXNoZWQBAAgcYWNjb3VudAAUdmFsdWUIRFBoYXNlVHJhbnNpdGlvbmVkAQAMEGZyb20RAgh0bxECFHJvdW5kBCRWb3Rlckxpc3QBAgggUmViYWdnZWQBAAwMd2hvABBmcm9tCAh0bwgwU2NvcmVVcGRhdGVkAQAIDHdobwAkbmV3X3Njb3JlCDxOb21pbmF0aW9uUG9vbHMBAkgcQ3JlYXRlZAEACCRkZXBvc2l0b3IAHHBvb2xfaWQEGEJvbmRlZAEAEBhtZW1iZXIAHHBvb2xfaWQEGGJvbmRlZAgYam9pbmVkFBxQYWlkT3V0AQAMGG1lbWJlcgAccG9vbF9pZAQYcGF5b3V0CCBVbmJvbmRlZAEAFBhtZW1iZXIAHHBvb2xfaWQEHGJhbGFuY2UIGHBvaW50cwgMZXJhBCRXaXRoZHJhd24BABAYbWVtYmVyABxwb29sX2lkBBxiYWxhbmNlCBhwb2ludHMIJERlc3Ryb3llZAEABBxwb29sX2lkBDBTdGF0ZUNoYW5nZWQBAAgccG9vbF9pZAQkbmV3X3N0YXRlHQI0TWVtYmVyUmVtb3ZlZAEACBxwb29sX2lkBBhtZW1iZXIAMFJvbGVzVXBkYXRlZAEADBByb290BQIcYm91bmNlcgUCJG5vbWluYXRvcgUCLFBvb2xTbGFzaGVkAQAIHHBvb2xfaWQEHGJhbGFuY2UIUFVuYm9uZGluZ1Bvb2xTbGFzaGVkAQAMHHBvb2xfaWQEDGVyYQQcYmFsYW5jZQhUUG9vbENvbW1pc3Npb25VcGRhdGVkAQAIHHBvb2xfaWQEHGN1cnJlbnQlAmBQb29sTWF4Q29tbWlzc2lvblVwZGF0ZWQBAAgccG9vbF9pZAQ4bWF4X2NvbW1pc3Npb24EfFBvb2xDb21taXNzaW9uQ2hhbmdlUmF0ZVVwZGF0ZWQBAAgccG9vbF9pZAQsY2hhbmdlX3JhdGUpApBQb29sQ29tbWlzc2lvbkNsYWltUGVybWlzc2lvblVwZGF0ZWQBAAgccG9vbF9pZAQocGVybWlzc2lvbjECVFBvb2xDb21taXNzaW9uQ2xhaW1lZAEACBxwb29sX2lkBChjb21taXNzaW9uCGRNaW5CYWxhbmNlRGVmaWNpdEFkanVzdGVkAQAIHHBvb2xfaWQEGGFtb3VudAhgTWluQmFsYW5jZUV4Y2Vzc0FkanVzdGVkAQAIHHBvb2xfaWQEGGFtb3VudAgsRmFzdFVuc3Rha2UBAhQgVW5zdGFrZWQBAAgUc3Rhc2gAGHJlc3VsdBkBHFNsYXNoZWQBAAgUc3Rhc2gAGGFtb3VudAgwQmF0Y2hDaGVja2VkAQAEEGVyYXM5AjRCYXRjaEZpbmlzaGVkAQAEEHNpemUENEludGVybmFsRXJyb3IBAQU0UGFyYUluY2x1c2lvbgECEDxDYW5kaWRhdGVCYWNrZWQBAxBJAiQEBERDYW5kaWRhdGVJbmNsdWRlZAEDEEkCJAQERENhbmRpZGF0ZVRpbWVkT3V0AQMMSQIkBFhVcHdhcmRNZXNzYWdlc1JlY2VpdmVkAQAIEGZyb20EFGNvdW50BBRQYXJhcwECIEhDdXJyZW50Q29kZVVwZGF0ZWQBAQJIQ3VycmVudEhlYWRVcGRhdGVkAQECUENvZGVVcGdyYWRlU2NoZWR1bGVkAQECME5ld0hlYWROb3RlZAEBAjBBY3Rpb25RdWV1ZWQBBAQBCDxQdmZDaGVja1N0YXJ0ZWQBAwggBEBQdmZDaGVja0FjY2VwdGVkAQMIIARAUHZmQ2hlY2tSZWplY3RlZAEDCCAEEEhybXABAhxQT3BlbkNoYW5uZWxSZXF1ZXN0ZWQBABAYc2VuZGVyBCRyZWNpcGllbnQEVHByb3Bvc2VkX21heF9jYXBhY2l0eQRkcHJvcG9zZWRfbWF4X21lc3NhZ2Vfc2l6ZQRMT3BlbkNoYW5uZWxDYW5jZWxlZAEACDBieV9wYXJhY2hhaW4EKGNoYW5uZWxfaWRVAkxPcGVuQ2hhbm5lbEFjY2VwdGVkAQAIGHNlbmRlcgQkcmVjaXBpZW50BDRDaGFubmVsQ2xvc2VkAQAIMGJ5X3BhcmFjaGFpbgQoY2hhbm5lbF9pZFUCWEhybXBDaGFubmVsRm9yY2VPcGVuZWQBABAYc2VuZGVyBCRyZWNpcGllbnQEVHByb3Bvc2VkX21heF9jYXBhY2l0eQRkcHJvcG9zZWRfbWF4X21lc3NhZ2Vfc2l6ZQRcSHJtcFN5c3RlbUNoYW5uZWxPcGVuZWQBABAYc2VuZGVyBCRyZWNpcGllbnQEVHByb3Bvc2VkX21heF9jYXBhY2l0eQRkcHJvcG9zZWRfbWF4X21lc3NhZ2Vfc2l6ZQRoT3BlbkNoYW5uZWxEZXBvc2l0c1VwZGF0ZWQBAAgYc2VuZGVyBCRyZWNpcGllbnQENFBhcmFzRGlzcHV0ZXMBAgxARGlzcHV0ZUluaXRpYXRlZAEDCCBdAkBEaXNwdXRlQ29uY2x1ZGVkAQMIIGECGFJldmVydAEBAiBPbkRlbWFuZAECCExPbkRlbWFuZE9yZGVyUGxhY2VkAQAMHHBhcmFfaWQEKHNwb3RfcHJpY2UIKG9yZGVyZWRfYnkAMFNwb3RQcmljZVNldAEABChzcG90X3ByaWNlCCRSZWdpc3RyYXIBAhAoUmVnaXN0ZXJlZAEACBxwYXJhX2lkBBxtYW5hZ2VyADBEZXJlZ2lzdGVyZWQBAAQccGFyYV9pZAQgUmVzZXJ2ZWQBAAgccGFyYV9pZAQMd2hvABxTd2FwcGVkAQAIHHBhcmFfaWQEIG90aGVyX2lkBBRTbG90cwECCDhOZXdMZWFzZVBlcmlvZAEABDBsZWFzZV9wZXJpb2QEGExlYXNlZAEAGBxwYXJhX2lkBBhsZWFzZXIAMHBlcmlvZF9iZWdpbgQwcGVyaW9kX2NvdW50BDhleHRyYV9yZXNlcnZlZAgwdG90YWxfYW1vdW50CCBBdWN0aW9ucwECHDhBdWN0aW9uU3RhcnRlZAEADDRhdWN0aW9uX2luZGV4BDBsZWFzZV9wZXJpb2QEGGVuZGluZwQ0QXVjdGlvbkNsb3NlZAEABDRhdWN0aW9uX2luZGV4BCBSZXNlcnZlZAEADBhiaWRkZXIAOGV4dHJhX3Jlc2VydmVkCDB0b3RhbF9hbW91bnQIKFVucmVzZXJ2ZWQBAAgYYmlkZGVyABhhbW91bnQISFJlc2VydmVDb25maXNjYXRlZAEADBxwYXJhX2lkBBhsZWFzZXIAGGFtb3VudAgsQmlkQWNjZXB0ZWQBABQYYmlkZGVyABxwYXJhX2lkBBhhbW91bnQIKGZpcnN0X3Nsb3QEJGxhc3Rfc2xvdAQ0V2lubmluZ09mZnNldAEACDRhdWN0aW9uX2luZGV4BDBibG9ja19udW1iZXIEJENyb3dkbG9hbgECKBxDcmVhdGVkAQAEHHBhcmFfaWQELENvbnRyaWJ1dGVkAQAMDHdobwAoZnVuZF9pbmRleAQYYW1vdW50CCBXaXRoZHJldwEADAx3aG8AKGZ1bmRfaW5kZXgEGGFtb3VudAhEUGFydGlhbGx5UmVmdW5kZWQBAAQccGFyYV9pZAQsQWxsUmVmdW5kZWQBAAQccGFyYV9pZAQkRGlzc29sdmVkAQAEHHBhcmFfaWQEPEhhbmRsZUJpZFJlc3VsdAEACBxwYXJhX2lkBBhyZXN1bHQZARhFZGl0ZWQBAAQccGFyYV9pZAQsTWVtb1VwZGF0ZWQBAAwMd2hvABxwYXJhX2lkBBBtZW1vJDxBZGRlZFRvTmV3UmFpc2UBAAQccGFyYV9pZAQgQ29yZXRpbWUBAghQUmV2ZW51ZUluZm9SZXF1ZXN0ZWQBAAQQd2hlbgQwQ29yZUFzc2lnbmVkAQAEEGNvcmUESFN0YXRlVHJpZU1pZ3JhdGlvbgECECBNaWdyYXRlZAEADAx0b3AEFGNoaWxkBBxjb21wdXRlgQIcU2xhc2hlZAEACAx3aG8AGGFtb3VudAhUQXV0b01pZ3JhdGlvbkZpbmlzaGVkAQEFGEhhbHRlZAEABBRlcnJvcuQkWGNtUGFsbGV0AQJgJEF0dGVtcHRlZAEABBxvdXRjb21ljQIQU2VudAEAEBhvcmlnaW55ASxkZXN0aW5hdGlvbnkBHG1lc3NhZ2X5AihtZXNzYWdlX2lkIEhVbmV4cGVjdGVkUmVzcG9uc2UBAAgYb3JpZ2lueQEgcXVlcnlfaWQINFJlc3BvbnNlUmVhZHkBAAggcXVlcnlfaWQIIHJlc3BvbnNluQIgTm90aWZpZWQBAAwgcXVlcnlfaWQIMHBhbGxldF9pbmRleAQoY2FsbF9pbmRleARATm90aWZ5T3ZlcndlaWdodAEAFCBxdWVyeV9pZAgwcGFsbGV0X2luZGV4BChjYWxsX2luZGV4BDRhY3R1YWxfd2VpZ2h0GExtYXhfYnVkZ2V0ZWRfd2VpZ2h0GExOb3RpZnlEaXNwYXRjaEVycm9yAQAMIHF1ZXJ5X2lkCDBwYWxsZXRfaW5kZXgEKGNhbGxfaW5kZXgESE5vdGlmeURlY29kZUZhaWxlZAEADCBxdWVyeV9pZAgwcGFsbGV0X2luZGV4BChjYWxsX2luZGV4BEBJbnZhbGlkUmVzcG9uZGVyAQAMGG9yaWdpbnkBIHF1ZXJ5X2lkCERleHBlY3RlZF9sb2NhdGlvbr0CXEludmFsaWRSZXNwb25kZXJWZXJzaW9uAQAIGG9yaWdpbnkBIHF1ZXJ5X2lkCDRSZXNwb25zZVRha2VuAQAEIHF1ZXJ5X2lkCDRBc3NldHNUcmFwcGVkAQAMEGhhc2ggGG9yaWdpbnkBGGFzc2V0cxkDVFZlcnNpb25DaGFuZ2VOb3RpZmllZAEAECxkZXN0aW5hdGlvbnkBGHJlc3VsdAQQY29zdKECKG1lc3NhZ2VfaWQgXFN1cHBvcnRlZFZlcnNpb25DaGFuZ2VkAQAIIGxvY2F0aW9ueQEcdmVyc2lvbgRQTm90aWZ5VGFyZ2V0U2VuZEZhaWwBAAwgbG9jYXRpb255ASBxdWVyeV9pZAgUZXJyb3KJAmROb3RpZnlUYXJnZXRNaWdyYXRpb25GYWlsAQAIIGxvY2F0aW9umQEgcXVlcnlfaWQIVEludmFsaWRRdWVyaWVyVmVyc2lvbgEACBhvcmlnaW55ASBxdWVyeV9pZAg4SW52YWxpZFF1ZXJpZXIBABAYb3JpZ2lueQEgcXVlcnlfaWQIQGV4cGVjdGVkX3F1ZXJpZXJ5AVBtYXliZV9hY3R1YWxfcXVlcmllcr0CUFZlcnNpb25Ob3RpZnlTdGFydGVkAQAMLGRlc3RpbmF0aW9ueQEQY29zdKECKG1lc3NhZ2VfaWQgWFZlcnNpb25Ob3RpZnlSZXF1ZXN0ZWQBAAwsZGVzdGluYXRpb255ARBjb3N0oQIobWVzc2FnZV9pZCBgVmVyc2lvbk5vdGlmeVVucmVxdWVzdGVkAQAMLGRlc3RpbmF0aW9ueQEQY29zdKECKG1lc3NhZ2VfaWQgIEZlZXNQYWlkAQAIGHBheWluZ3kBEGZlZXOhAjRBc3NldHNDbGFpbWVkAQAMEGhhc2ggGG9yaWdpbnkBGGFzc2V0cxkDYFZlcnNpb25NaWdyYXRpb25GaW5pc2hlZAEABBx2ZXJzaW9uBDBNZXNzYWdlUXVldWUBAhBAUHJvY2Vzc2luZ0ZhaWxlZAEADAhpZCAYb3JpZ2luJQMUZXJyb3IpAyRQcm9jZXNzZWQBABAIaWQgGG9yaWdpbiUDLHdlaWdodF91c2VkGBxzdWNjZXNzFEhPdmVyd2VpZ2h0RW5xdWV1ZWQBABAIaWQgGG9yaWdpbiUDKHBhZ2VfaW5kZXgENG1lc3NhZ2VfaW5kZXgEKFBhZ2VSZWFwZWQBAAgYb3JpZ2luJQMUaW5kZXgEJEFzc2V0UmF0ZQECDEBBc3NldFJhdGVDcmVhdGVkAQAIKGFzc2V0X2tpbmSBARByYXRlCEBBc3NldFJhdGVSZW1vdmVkAQAEKGFzc2V0X2tpbmSBAUBBc3NldFJhdGVVcGRhdGVkAQAMKGFzc2V0X2tpbmSBAQxvbGQIDG5ldwgEIAAADBRwaGFzZTQUZXZlbnQ1Axh0b3BpY3M5AwQ9AwAEDQEAAQEACDBzcGVjX3ZlcnNpb24EJHNwZWNfbmFtZUkDAAgkY29kZV9oYXNoIDRjaGVja192ZXJzaW9uFAAQOGJhc2VfZXh0cmluc2ljGDRtYXhfZXh0cmluc2ljsQEkbWF4X3RvdGFssQEgcmVzZXJ2ZWSxAQAMGG5vcm1hbFUDLG9wZXJhdGlvbmFsVQMkbWFuZGF0b3J5VQMADChiYXNlX2Jsb2NrGCRtYXhfYmxvY2sYJHBlcl9jbGFzc1kDAAwYbm9ybWFsBCxvcGVyYXRpb25hbAQkbWFuZGF0b3J5BAAIEHJlYWQIFHdyaXRlCAMIkQIEBGkDAAAgJHNwZWNfbmFtZUkDJGltcGxfbmFtZUkDRGF1dGhvcmluZ192ZXJzaW9uBDBzcGVjX3ZlcnNpb24EMGltcGxfdmVyc2lvbgQQYXBpc20DTHRyYW5zYWN0aW9uX3ZlcnNpb24ENHN0YXRlX3ZlcnNpb24EBCQBCAR1AwAEJAAGDQECDBBSb290AQEFGFNpZ25lZAEBARBOb25lAQEFAjwwU3Rha2luZ0FkbWluAQEFJFRyZWFzdXJlcgEBBTxGZWxsb3dzaGlwQWRtaW4BAQUwR2VuZXJhbEFkbWluAQEFMEF1Y3Rpb25BZG1pbgEBBShMZWFzZUFkbWluAQEFTFJlZmVyZW5kdW1DYW5jZWxsZXIBAQVAUmVmZXJlbmR1bUtpbGxlcgEBBSxTbWFsbFRpcHBlcgEBBSRCaWdUaXBwZXIBAQUwU21hbGxTcGVuZGVyAQEFNE1lZGl1bVNwZW5kZXIBAQUoQmlnU3BlbmRlcgEBBURXaGl0ZWxpc3RlZENhbGxlcgEBBTRXaXNoRm9yQ2hhbmdlAQEFAgQkUGFyYWNoYWluAQECAggMWGNtAQAIHHBhcmVudHMEIGludGVyaW9ydQEgUmVzcG9uc2UBAAgccGFyZW50cwQgaW50ZXJpb3J1AQIUGHN5c3RlbQECDBBSb290AQEFGFNpZ25lZAEBARBOb25lAQEFHE9yaWdpbnMBAjwwU3Rha2luZ0FkbWluAQEFJFRyZWFzdXJlcgEBBTxGZWxsb3dzaGlwQWRtaW4BAQUwR2VuZXJhbEFkbWluAQEFMEF1Y3Rpb25BZG1pbgEBBShMZWFzZUFkbWluAQEFTFJlZmVyZW5kdW1DYW5jZWxsZXIBAQVAUmVmZXJlbmR1bUtpbGxlcgEBBSxTbWFsbFRpcHBlcgEBBSRCaWdUaXBwZXIBAQUwU21hbGxTcGVuZGVyAQEFNE1lZGl1bVNwZW5kZXIBAQUoQmlnU3BlbmRlcgEBBURXaGl0ZWxpc3RlZENhbGxlcgEBBTRXaXNoRm9yQ2hhbmdlAQEFQFBhcmFjaGFpbnNPcmlnaW4BAgQkUGFyYWNoYWluAQECJFhjbVBhbGxldAECCAxYY20BAAgccGFyZW50cwQgaW50ZXJpb3J1ASBSZXNwb25zZQEACBxwYXJlbnRzBCBpbnRlcmlvcnUBEFZvaWQBAQUAFCBtYXliZV9pZBEBIHByaW9yaXR5BBBjYWxspQE4bWF5YmVfcGVyaW9kaWOBAxhvcmlnaW6VAwaZAwSdAwAADDR0b3RhbF9yZXRyaWVzBCRyZW1haW5pbmcEGHBlcmlvZAQCLBhyZW1hcmsBAAQYcmVtYXJrJDhzZXRfaGVhcF9wYWdlcwEABBRwYWdlcwggc2V0X2NvZGUBAAQQY29kZSRcc2V0X2NvZGVfd2l0aG91dF9jaGVja3MBAAQQY29kZSQsc2V0X3N0b3JhZ2UBAAQUaXRlbXN5AzBraWxsX3N0b3JhZ2UBAAQQa2V5c30DLGtpbGxfcHJlZml4AQAIGHByZWZpeCQcc3Via2V5cwREcmVtYXJrX3dpdGhfZXZlbnQBAAQYcmVtYXJrJERhdXRob3JpemVfdXBncmFkZQEABCRjb2RlX2hhc2gggGF1dGhvcml6ZV91cGdyYWRlX3dpdGhvdXRfY2hlY2tzAQAEJGNvZGVfaGFzaCBgYXBwbHlfYXV0aG9yaXplZF91cGdyYWRlAQAEEGNvZGUkAiggc2NoZWR1bGUBABAQd2hlbgQ4bWF5YmVfcGVyaW9kaWOBAyBwcmlvcml0eQQQY2FsbN0GGGNhbmNlbAEACBB3aGVuBBRpbmRleAQ4c2NoZWR1bGVfbmFtZWQBABQIaWQgEHdoZW4EOG1heWJlX3BlcmlvZGljgQMgcHJpb3JpdHkEEGNhbGzdBjBjYW5jZWxfbmFtZWQBAAQIaWQgOHNjaGVkdWxlX2FmdGVyAQAQFGFmdGVyBDhtYXliZV9wZXJpb2RpY4EDIHByaW9yaXR5BBBjYWxs3QZQc2NoZWR1bGVfbmFtZWRfYWZ0ZXIBABQIaWQgFGFmdGVyBDhtYXliZV9wZXJpb2RpY4EDIHByaW9yaXR5BBBjYWxs3QYkc2V0X3JldHJ5AQAMEHRhc2sNARxyZXRyaWVzBBhwZXJpb2QEPHNldF9yZXRyeV9uYW1lZAEADAhpZCAccmV0cmllcwQYcGVyaW9kBDBjYW5jZWxfcmV0cnkBAAQQdGFzaw0BSGNhbmNlbF9yZXRyeV9uYW1lZAEABAhpZCACFDRub3RlX3ByZWltYWdlAQAEFGJ5dGVzJDx1bm5vdGVfcHJlaW1hZ2UBAAQQaGFzaCBAcmVxdWVzdF9wcmVpbWFnZQEABBBoYXNoIEh1bnJlcXVlc3RfcHJlaW1hZ2UBAAQQaGFzaCA4ZW5zdXJlX3VwZGF0ZWQBAAQYaGFzaGVzOQMAFCxwYXJlbnRfaGFzaCAYbnVtYmVyBChzdGF0ZV9yb290IDxleHRyaW5zaWNzX3Jvb3QgGGRpZ2VzdDAAECBvZmZlbmRlciAQc2xvdAgwZmlyc3RfaGVhZGVytQM0c2Vjb25kX2hlYWRlcrUDAAwcc2Vzc2lvbgQodHJpZV9ub2Rlc30DPHZhbGlkYXRvcl9jb3VudAQECAEIAgwwUHJpbWFyeVNsb3RzAQEFdFByaW1hcnlBbmRTZWNvbmRhcnlQbGFpblNsb3RzAQEFbFByaW1hcnlBbmRTZWNvbmRhcnlWUkZTbG90cwEBBQIECFYxAQAIBGPBAzRhbGxvd2VkX3Nsb3RzxQMCDExyZXBvcnRfZXF1aXZvY2F0aW9uAQAISGVxdWl2b2NhdGlvbl9wcm9vZrkDPGtleV9vd25lcl9wcm9vZr0DcHJlcG9ydF9lcXVpdm9jYXRpb25fdW5zaWduZWQBAAhIZXF1aXZvY2F0aW9uX3Byb29muQM8a2V5X293bmVyX3Byb29mvQNIcGxhbl9jb25maWdfY2hhbmdlAQAEGGNvbmZpZ8kDAgQMc2V0AQAEDG5vdwgCFAhJZAEBARRJbmRleAEBBQxSYXcBBQAkQWRkcmVzczMyAQUBgCRBZGRyZXNzMjABBQFQAhQUY2xhaW0BAAQUaW5kZXgEIHRyYW5zZmVyAQAIDG5ld9UDFGluZGV4BBBmcmVlAQAEFGluZGV4BDhmb3JjZV90cmFuc2ZlcgEADAxuZXfVAxRpbmRleAQYZnJlZXplFBhmcmVlemUBAAQUaW5kZXgEBAAAAgggSW5jcmVhc2UBAQUgRGVjcmVhc2UBAQUCJFB0cmFuc2Zlcl9hbGxvd19kZWF0aAEACBBkZXN01QMUdmFsdWUIOGZvcmNlX3RyYW5zZmVyAQAMGHNvdXJjZdUDEGRlc3TVAxR2YWx1ZQhMdHJhbnNmZXJfa2VlcF9hbGl2ZQEACBBkZXN01QMUdmFsdWUIMHRyYW5zZmVyX2FsbAEACBBkZXN01QMoa2VlcF9hbGl2ZRQ8Zm9yY2VfdW5yZXNlcnZlAQAIDHdob9UDGGFtb3VudAhAdXBncmFkZV9hY2NvdW50cwEABAx3aG/dA0Rmb3JjZV9zZXRfYmFsYW5jZQEACAx3aG/VAyBuZXdfZnJlZQhsZm9yY2VfYWRqdXN0X3RvdGFsX2lzc3VhbmNlAQAIJGRpcmVjdGlvbuEDFGRlbHRhCBBidXJuAQAIFHZhbHVlCChrZWVwX2FsaXZlFATVAwACDBBOb29wAQEFDFNldAEBAxhSZW1vdmUBAQUCDBBOb29wAQEFDFNldAEBAhhSZW1vdmUBAQUGCAAIFHZhbHVlCAxlcmEEBPkDAAb9AwJ4EGJvbmQBAAgUdmFsdWUIFHBheWVlNQEoYm9uZF9leHRyYQEABDhtYXhfYWRkaXRpb25hbAgYdW5ib25kAQAEFHZhbHVlCER3aXRoZHJhd191bmJvbmRlZAEABEhudW1fc2xhc2hpbmdfc3BhbnMEIHZhbGlkYXRlAQAEFHByZWZzOQEgbm9taW5hdGUBAAQcdGFyZ2V0c+kDFGNoaWxsAQEFJHNldF9wYXllZQEABBRwYXllZTUBOHNldF9jb250cm9sbGVyAQEFTHNldF92YWxpZGF0b3JfY291bnQBAAQMbmV3BGBpbmNyZWFzZV92YWxpZGF0b3JfY291bnQBAAQoYWRkaXRpb25hbARUc2NhbGVfdmFsaWRhdG9yX2NvdW50AQAEGGZhY3RvcgQ0Zm9yY2Vfbm9fZXJhcwEBBTRmb3JjZV9uZXdfZXJhAQEFRHNldF9pbnZ1bG5lcmFibGVzAQAENGludnVsbmVyYWJsZXPdAzRmb3JjZV91bnN0YWtlAQAIFHN0YXNoAEhudW1fc2xhc2hpbmdfc3BhbnMEUGZvcmNlX25ld19lcmFfYWx3YXlzAQEFVGNhbmNlbF9kZWZlcnJlZF9zbGFzaAEACAxlcmEENHNsYXNoX2luZGljZXM5AjhwYXlvdXRfc3Rha2VycwEACDx2YWxpZGF0b3Jfc3Rhc2gADGVyYQQYcmVib25kAQAEFHZhbHVlCChyZWFwX3N0YXNoAQAIFHN0YXNoAEhudW1fc2xhc2hpbmdfc3BhbnMEEGtpY2sBAAQMd2hv6QNMc2V0X3N0YWtpbmdfY29uZmlncwEAHEhtaW5fbm9taW5hdG9yX2JvbmTtA0htaW5fdmFsaWRhdG9yX2JvbmTtA0xtYXhfbm9taW5hdG9yX2NvdW508QNMbWF4X3ZhbGlkYXRvcl9jb3VudPEDPGNoaWxsX3RocmVzaG9sZPEDOG1pbl9jb21taXNzaW9u8QNIbWF4X3N0YWtlZF9yZXdhcmRz8QMsY2hpbGxfb3RoZXIBAAQUc3Rhc2gAaGZvcmNlX2FwcGx5X21pbl9jb21taXNzaW9uAQAEPHZhbGlkYXRvcl9zdGFzaABIc2V0X21pbl9jb21taXNzaW9uAQAEDG5ldwRYcGF5b3V0X3N0YWtlcnNfYnlfcGFnZQEADDx2YWxpZGF0b3Jfc3Rhc2gADGVyYQQQcGFnZQQwdXBkYXRlX3BheWVlAQAEKGNvbnRyb2xsZXIAaGRlcHJlY2F0ZV9jb250cm9sbGVyX2JhdGNoAQAELGNvbnRyb2xsZXJz3QM4cmVzdG9yZV9sZWRnZXIBABAUc3Rhc2gAQG1heWJlX2NvbnRyb2xsZXIFAixtYXliZV90b3RhbPUDPG1heWJlX3VubG9ja2luZwEEBQGEABgcZ3JhbmRwYSAQYmFiZSA4cGFyYV92YWxpZGF0b3IgPHBhcmFfYXNzaWdubWVudCBMYXV0aG9yaXR5X2Rpc2NvdmVyeSAUYmVlZnkJBAIIIHNldF9rZXlzAQAIEGtleXMNBBRwcm9vZiQocHVyZ2Vfa2V5cwEBBQAILHRhcmdldF9oYXNoIDR0YXJnZXRfbnVtYmVyBAMIFQRBAgAQMHJvdW5kX251bWJlcgggaWRlbnRpdHkgFGZpcnN0GQQYc2Vjb25kGQQCCBxQcmV2b3RlAQAQMHJvdW5kX251bWJlcgggaWRlbnRpdHkgFGZpcnN0GQQYc2Vjb25kGQQkUHJlY29tbWl0AQAQMHJvdW5kX251bWJlcgggaWRlbnRpdHkgFGZpcnN0GQQYc2Vjb25kGQQACBhzZXRfaWQIMGVxdWl2b2NhdGlvbiEEAgxMcmVwb3J0X2VxdWl2b2NhdGlvbgEACEhlcXVpdm9jYXRpb25fcHJvb2YlBDxrZXlfb3duZXJfcHJvb2a9A3ByZXBvcnRfZXF1aXZvY2F0aW9uX3Vuc2lnbmVkAQAISGVxdWl2b2NhdGlvbl9wcm9vZiUEPGtleV9vd25lcl9wcm9vZr0DMG5vdGVfc3RhbGxlZAEACBRkZWxheQRsYmVzdF9maW5hbGl6ZWRfYmxvY2tfbnVtYmVyBAYEAhgsc3BlbmRfbG9jYWwBAAgYYW1vdW50CCxiZW5lZmljaWFyedUDPHJlbW92ZV9hcHByb3ZhbAEABCxwcm9wb3NhbF9pZAQUc3BlbmQBABAoYXNzZXRfa2luZIEBGGFtb3VudAgsYmVuZWZpY2lhcnmZASh2YWxpZF9mcm9tLQQYcGF5b3V0AQAEFGluZGV4BDBjaGVja19zdGF0dXMBAAQUaW5kZXgEKHZvaWRfc3BlbmQBAAQUaW5kZXgEAgwgU3RhbmRhcmQBAAgQdm90ZQQcYmFsYW5jZQgUU3BsaXQBAAgMYXllCAxuYXkIMFNwbGl0QWJzdGFpbgEADAxheWUIDG5heQgcYWJzdGFpbggCHBBOb25lAQEFIExvY2tlZDF4AQEFIExvY2tlZDJ4AQEFIExvY2tlZDN4AQEFIExvY2tlZDR4AQEFIExvY2tlZDV4AQEFIExvY2tlZDZ4AQEFAhgQdm90ZQEACChwb2xsX2luZGV4BBB2b3RlNQQgZGVsZWdhdGUBABAUY2xhc3MECHRv1QMoY29udmljdGlvbjkEHGJhbGFuY2UIKHVuZGVsZWdhdGUBAAQUY2xhc3MEGHVubG9jawEACBRjbGFzcwQYdGFyZ2V01QMscmVtb3ZlX3ZvdGUBAAgUY2xhc3MtBBRpbmRleAREcmVtb3ZlX290aGVyX3ZvdGUBAAwYdGFyZ2V01QMUY2xhc3MEFGluZGV4BAIICEF0AQECFEFmdGVyAQECAiQYc3VibWl0AQAMPHByb3Bvc2FsX29yaWdpbpUDIHByb3Bvc2FspQFAZW5hY3RtZW50X21vbWVudEEEWHBsYWNlX2RlY2lzaW9uX2RlcG9zaXQBAAQUaW5kZXgEXHJlZnVuZF9kZWNpc2lvbl9kZXBvc2l0AQAEFGluZGV4BBhjYW5jZWwBAAQUaW5kZXgEEGtpbGwBAAQUaW5kZXgEQG51ZGdlX3JlZmVyZW5kdW0BAAQUaW5kZXgESG9uZV9mZXdlcl9kZWNpZGluZwEABBR0cmFjawRkcmVmdW5kX3N1Ym1pc3Npb25fZGVwb3NpdAEABBRpbmRleAQwc2V0X21ldGFkYXRhAQAIFGluZGV4BChtYXliZV9oYXNoEQECEDh3aGl0ZWxpc3RfY2FsbAEABCRjYWxsX2hhc2ggXHJlbW92ZV93aGl0ZWxpc3RlZF9jYWxsAQAEJGNhbGxfaGFzaCBkZGlzcGF0Y2hfd2hpdGVsaXN0ZWRfY2FsbAEADCRjYWxsX2hhc2ggQGNhbGxfZW5jb2RlZF9sZW4ETGNhbGxfd2VpZ2h0X3dpdG5lc3MYnGRpc3BhdGNoX3doaXRlbGlzdGVkX2NhbGxfd2l0aF9wcmVpbWFnZQEABBBjYWxs3QYGFAIUME1pbkluZmxhdGlvbgEE9QMBBDBNYXhJbmZsYXRpb24BBPUDAQQoSWRlYWxTdGFrZQEE9QMBBBxGYWxsb2ZmAQT1AwEEPFVzZUF1Y3Rpb25TbG90cwEETQQBBAIEJEluZmxhdGlvbgECFDBNaW5JbmZsYXRpb24BBPUDAQQwTWF4SW5mbGF0aW9uAQT1AwEEKElkZWFsU3Rha2UBBPUDAQQcRmFsbG9mZgEE9QMBBDxVc2VBdWN0aW9uU2xvdHMBBE0EAQQCBDRzZXRfcGFyYW1ldGVyAQAEJGtleV92YWx1ZVUEBQEFAQMMCAgEBmEEAggcUmVndWxhcgEBBRBTYWZ0AQEFBmkEAhQUY2xhaW0BAAgQZGVzdABIZXRoZXJldW1fc2lnbmF0dXJlXQQobWludF9jbGFpbQEAEAx3aG9lARR2YWx1ZQhAdmVzdGluZ19zY2hlZHVsZWUEJHN0YXRlbWVudG0EMGNsYWltX2F0dGVzdAEADBBkZXN0AEhldGhlcmV1bV9zaWduYXR1cmVdBCRzdGF0ZW1lbnQkGGF0dGVzdAEABCRzdGF0ZW1lbnQkKG1vdmVfY2xhaW0BAAwMb2xkZQEMbmV3ZQE4bWF5YmVfcHJlY2xhaW0FAgAMGGxvY2tlZAgkcGVyX2Jsb2NrCDhzdGFydGluZ19ibG9jawQCGBB2ZXN0AQEFKHZlc3Rfb3RoZXIBAAQYdGFyZ2V01QM8dmVzdGVkX3RyYW5zZmVyAQAIGHRhcmdldNUDIHNjaGVkdWxldQRUZm9yY2VfdmVzdGVkX3RyYW5zZmVyAQAMGHNvdXJjZdUDGHRhcmdldNUDIHNjaGVkdWxldQQ8bWVyZ2Vfc2NoZWR1bGVzAQAIPHNjaGVkdWxlMV9pbmRleAQ8c2NoZWR1bGUyX2luZGV4BHRmb3JjZV9yZW1vdmVfdmVzdGluZ19zY2hlZHVsZQEACBh0YXJnZXTVAzhzY2hlZHVsZV9pbmRleAQE3QYAAhgUYmF0Y2gBAAQUY2FsbHN9BDRhc19kZXJpdmF0aXZlAQAIFGluZGV4BBBjYWxs3QYkYmF0Y2hfYWxsAQAEFGNhbGxzfQQsZGlzcGF0Y2hfYXMBAAgkYXNfb3JpZ2lulQMQY2FsbN0GLGZvcmNlX2JhdGNoAQAEFGNhbGxzfQQsd2l0aF93ZWlnaHQBAAgQY2FsbN0GGHdlaWdodBgG6QECKBRwcm94eQEADBByZWFs1QNAZm9yY2VfcHJveHlfdHlwZYUEEGNhbGzdBiRhZGRfcHJveHkBAAwgZGVsZWdhdGXVAyhwcm94eV90eXBl6QEUZGVsYXkEMHJlbW92ZV9wcm94eQEADCBkZWxlZ2F0ZdUDKHByb3h5X3R5cGXpARRkZWxheQQ4cmVtb3ZlX3Byb3hpZXMBAQUsY3JlYXRlX3B1cmUBAAwocHJveHlfdHlwZekBFGRlbGF5BBRpbmRleAQka2lsbF9wdXJlAQAUHHNwYXduZXLVAyhwcm94eV90eXBl6QEUaW5kZXgEGGhlaWdodAQkZXh0X2luZGV4BCBhbm5vdW5jZQEACBByZWFs1QMkY2FsbF9oYXNoIExyZW1vdmVfYW5ub3VuY2VtZW50AQAIEHJlYWzVAyRjYWxsX2hhc2ggTHJlamVjdF9hbm5vdW5jZW1lbnQBAAggZGVsZWdhdGXVAyRjYWxsX2hhc2ggPHByb3h5X2Fubm91bmNlZAEAECBkZWxlZ2F0ZdUDEHJlYWzVA0Bmb3JjZV9wcm94eV90eXBlhQQQY2FsbN0GBvEBAhBQYXNfbXVsdGlfdGhyZXNob2xkXzEBAAhEb3RoZXJfc2lnbmF0b3JpZXPdAxBjYWxs3QYgYXNfbXVsdGkBABQkdGhyZXNob2xkBERvdGhlcl9zaWduYXRvcmllc90DPG1heWJlX3RpbWVwb2ludI0EEGNhbGzdBihtYXhfd2VpZ2h0GEBhcHByb3ZlX2FzX211bHRpAQAUJHRocmVzaG9sZAREb3RoZXJfc2lnbmF0b3JpZXPdAzxtYXliZV90aW1lcG9pbnSNBCRjYWxsX2hhc2ggKG1heF93ZWlnaHQYPGNhbmNlbF9hc19tdWx0aQEAECR0aHJlc2hvbGQERG90aGVyX3NpZ25hdG9yaWVz3QMkdGltZXBvaW508QEkY2FsbF9oYXNoIAIkOHByb3Bvc2VfYm91bnR5AQAIFHZhbHVlCCxkZXNjcmlwdGlvbiQ4YXBwcm92ZV9ib3VudHkBAAQkYm91bnR5X2lkBDxwcm9wb3NlX2N1cmF0b3IBAAwkYm91bnR5X2lkBBxjdXJhdG9y1QMMZmVlCEB1bmFzc2lnbl9jdXJhdG9yAQAEJGJvdW50eV9pZAQ4YWNjZXB0X2N1cmF0b3IBAAQkYm91bnR5X2lkBDBhd2FyZF9ib3VudHkBAAgkYm91bnR5X2lkBCxiZW5lZmljaWFyedUDMGNsYWltX2JvdW50eQEABCRib3VudHlfaWQEMGNsb3NlX2JvdW50eQEABCRib3VudHlfaWQEUGV4dGVuZF9ib3VudHlfZXhwaXJ5AQAIJGJvdW50eV9pZAQYcmVtYXJrJAIcQGFkZF9jaGlsZF9ib3VudHkBAAxAcGFyZW50X2JvdW50eV9pZAQUdmFsdWUILGRlc2NyaXB0aW9uJDxwcm9wb3NlX2N1cmF0b3IBABBAcGFyZW50X2JvdW50eV9pZAQ8Y2hpbGRfYm91bnR5X2lkBBxjdXJhdG9y1QMMZmVlCDhhY2NlcHRfY3VyYXRvcgEACEBwYXJlbnRfYm91bnR5X2lkBDxjaGlsZF9ib3VudHlfaWQEQHVuYXNzaWduX2N1cmF0b3IBAAhAcGFyZW50X2JvdW50eV9pZAQ8Y2hpbGRfYm91bnR5X2lkBEhhd2FyZF9jaGlsZF9ib3VudHkBAAxAcGFyZW50X2JvdW50eV9pZAQ8Y2hpbGRfYm91bnR5X2lkBCxiZW5lZmljaWFyedUDSGNsYWltX2NoaWxkX2JvdW50eQEACEBwYXJlbnRfYm91bnR5X2lkBDxjaGlsZF9ib3VudHlfaWQESGNsb3NlX2NoaWxkX2JvdW50eQEACEBwYXJlbnRfYm91bnR5X2lkBDxjaGlsZF9ib3VudHlfaWQEAwgEBASdBAADDASdBAQEpQQABJ0EAQgDDAStBAQEsQQABJ0EAQwDDAS5BAQEvQQABJ0EARADDATFBAQEyQQABJ0EARQDDATRBAQE1QQABJ0EARgDDATdBAQE4QQABJ0EARwDDATpBAQE7QQABJ0EASADDAT1BAQE+QQABJ0EASQDDAQBBQQEBQUABJ0EASgDDAQNBQQEEQUABJ0EASwDDAQZBQQEHQUABJ0EATADDAQlBQQEKQUABJ0EATQDDAQxBQQENQUABJ0EATgDDAQ9BQQEQQUABJ0EATwDDARJBQQETQUAAEAYdm90ZXMxoQQYdm90ZXMyqQQYdm90ZXMztQQYdm90ZXM0wQQYdm90ZXM1zQQYdm90ZXM22QQYdm90ZXM35QQYdm90ZXM48QQYdm90ZXM5/QQcdm90ZXMxMAkFHHZvdGVzMTEVBRx2b3RlczEyIQUcdm90ZXMxMy0FHHZvdGVzMTQ5BRx2b3RlczE1RQUcdm90ZXMxNlEFAAwgc29sdXRpb25VBRRzY29yZQkCFHJvdW5kBAAIGHZvdGVycwQcdGFyZ2V0cwQGCQIDCAAIBGUFAAAIFHRvdGFsCBh2b3RlcnNpBQMIAG0FBHEFAAIUPHN1Ym1pdF91bnNpZ25lZAEACDByYXdfc29sdXRpb25ZBRx3aXRuZXNzXQVsc2V0X21pbmltdW1fdW50cnVzdGVkX3Njb3JlAQAEQG1heWJlX25leHRfc2NvcmVhBXRzZXRfZW1lcmdlbmN5X2VsZWN0aW9uX3Jlc3VsdAEABCBzdXBwb3J0c3UFGHN1Ym1pdAEABDByYXdfc29sdXRpb25ZBUxnb3Zlcm5hbmNlX2ZhbGxiYWNrAQAIQG1heWJlX21heF92b3RlcnMtBERtYXliZV9tYXhfdGFyZ2V0cy0EAgwUcmViYWcBAAQoZGlzbG9jYXRlZNUDPHB1dF9pbl9mcm9udF9vZgEABBxsaWdodGVy1QNUcHV0X2luX2Zyb250X29mX290aGVyAQAIHGhlYXZpZXLVAxxsaWdodGVy1QMCCCxGcmVlQmFsYW5jZQEBAxxSZXdhcmRzAQEFAgwQTm9vcAEBBQxTZXQBAQEYUmVtb3ZlAQEFAhAwUGVybWlzc2lvbmVkAQEFWFBlcm1pc3Npb25sZXNzQ29tcG91bmQBAQVYUGVybWlzc2lvbmxlc3NXaXRoZHJhdwEBBURQZXJtaXNzaW9ubGVzc0FsbAEBBQJoEGpvaW4BAAgYYW1vdW50CBxwb29sX2lkBChib25kX2V4dHJhAQAEFGV4dHJhgQUwY2xhaW1fcGF5b3V0AQEFGHVuYm9uZAEACDhtZW1iZXJfYWNjb3VudNUDQHVuYm9uZGluZ19wb2ludHMIWHBvb2xfd2l0aGRyYXdfdW5ib25kZWQBAAgccG9vbF9pZARIbnVtX3NsYXNoaW5nX3NwYW5zBER3aXRoZHJhd191bmJvbmRlZAEACDhtZW1iZXJfYWNjb3VudNUDSG51bV9zbGFzaGluZ19zcGFucwQYY3JlYXRlAQAQGGFtb3VudAgQcm9vdNUDJG5vbWluYXRvctUDHGJvdW5jZXLVA0xjcmVhdGVfd2l0aF9wb29sX2lkAQAUGGFtb3VudAgQcm9vdNUDJG5vbWluYXRvctUDHGJvdW5jZXLVAxxwb29sX2lkBCBub21pbmF0ZQEACBxwb29sX2lkBCh2YWxpZGF0b3Jz3QMkc2V0X3N0YXRlAQAIHHBvb2xfaWQEFHN0YXRlHQIwc2V0X21ldGFkYXRhAQAIHHBvb2xfaWQEIG1ldGFkYXRhJCxzZXRfY29uZmlncwEAGDRtaW5fam9pbl9ib25k7QM8bWluX2NyZWF0ZV9ib25k7QMkbWF4X3Bvb2xz8QMsbWF4X21lbWJlcnPxA1BtYXhfbWVtYmVyc19wZXJfcG9vbPEDVGdsb2JhbF9tYXhfY29tbWlzc2lvbvEDMHVwZGF0ZV9yb2xlcwEAEBxwb29sX2lkBCBuZXdfcm9vdIUFNG5ld19ub21pbmF0b3KFBSxuZXdfYm91bmNlcoUFFGNoaWxsAQAEHHBvb2xfaWQEQGJvbmRfZXh0cmFfb3RoZXIBAAgYbWVtYmVy1QMUZXh0cmGBBVBzZXRfY2xhaW1fcGVybWlzc2lvbgEABChwZXJtaXNzaW9uiQVIY2xhaW1fcGF5b3V0X290aGVyAQAEFG90aGVyADhzZXRfY29tbWlzc2lvbgEACBxwb29sX2lkBDhuZXdfY29tbWlzc2lvbiUCSHNldF9jb21taXNzaW9uX21heAEACBxwb29sX2lkBDhtYXhfY29tbWlzc2lvbgRoc2V0X2NvbW1pc3Npb25fY2hhbmdlX3JhdGUBAAgccG9vbF9pZAQsY2hhbmdlX3JhdGUpAkBjbGFpbV9jb21taXNzaW9uAQAEHHBvb2xfaWQETGFkanVzdF9wb29sX2RlcG9zaXQBAAQccG9vbF9pZAR8c2V0X2NvbW1pc3Npb25fY2xhaW1fcGVybWlzc2lvbgEACBxwb29sX2lkBChwZXJtaXNzaW9uMQIsYXBwbHlfc2xhc2gBAAQ4bWVtYmVyX2FjY291bnTVA0htaWdyYXRlX2RlbGVnYXRpb24BAAQ4bWVtYmVyX2FjY291bnTVA3htaWdyYXRlX3Bvb2xfdG9fZGVsZWdhdGVfc3Rha2UBAAQccG9vbF9pZAQCDFRyZWdpc3Rlcl9mYXN0X3Vuc3Rha2UBAQUoZGVyZWdpc3RlcgEBBRxjb250cm9sAQAENGVyYXNfdG9fY2hlY2sEAAhMbWF4X2NhbmRpZGF0ZV9kZXB0aARQYWxsb3dlZF9hbmNlc3RyeV9sZW4EAgggUHJlY2hlY2sBAQUcUHJlcGFyZQEBBQIIHEJhY2tpbmcBAQUgQXBwcm92YWwBAQUCHDhNYXhNZW1vcnlQYWdlcwEBAjxTdGFja0xvZ2ljYWxNYXgBAQI4U3RhY2tOYXRpdmVNYXgBAQJQUHJlY2hlY2tpbmdNYXhNZW1vcnkBAQM4UHZmUHJlcFRpbWVvdXQBAwiZBQg4UHZmRXhlY1RpbWVvdXQBAwidBQhEV2FzbUV4dEJ1bGtNZW1vcnkBAQUEoQUAACxgZ3JvdXBfcm90YXRpb25fZnJlcXVlbmN5BGRwYXJhc19hdmFpbGFiaWxpdHlfcGVyaW9kBFxtYXhfdmFsaWRhdG9yc19wZXJfY29yZS0EJGxvb2thaGVhZAQkbnVtX2NvcmVzBGRtYXhfYXZhaWxhYmlsaXR5X3RpbWVvdXRzBGBvbl9kZW1hbmRfcXVldWVfbWF4X3NpemUEiG9uX2RlbWFuZF90YXJnZXRfcXVldWVfdXRpbGl6YXRpb24EZG9uX2RlbWFuZF9mZWVfdmFyaWFiaWxpdHkESG9uX2RlbWFuZF9iYXNlX2ZlZQgMdHRsBALAfHNldF92YWxpZGF0aW9uX3VwZ3JhZGVfY29vbGRvd24BAAQMbmV3BHBzZXRfdmFsaWRhdGlvbl91cGdyYWRlX2RlbGF5AQAEDG5ldwRkc2V0X2NvZGVfcmV0ZW50aW9uX3BlcmlvZAEABAxuZXcERHNldF9tYXhfY29kZV9zaXplAQAEDG5ldwRAc2V0X21heF9wb3Zfc2l6ZQEABAxuZXcEWHNldF9tYXhfaGVhZF9kYXRhX3NpemUBAAQMbmV3BEhzZXRfY29yZXRpbWVfY29yZXMBAAQMbmV3BHRzZXRfbWF4X2F2YWlsYWJpbGl0eV90aW1lb3V0cwEABAxuZXcEcHNldF9ncm91cF9yb3RhdGlvbl9mcmVxdWVuY3kBAAQMbmV3BHRzZXRfcGFyYXNfYXZhaWxhYmlsaXR5X3BlcmlvZAEABAxuZXcEYHNldF9zY2hlZHVsaW5nX2xvb2thaGVhZAEABAxuZXcEbHNldF9tYXhfdmFsaWRhdG9yc19wZXJfY29yZQEABAxuZXctBEhzZXRfbWF4X3ZhbGlkYXRvcnMBAAQMbmV3LQRIc2V0X2Rpc3B1dGVfcGVyaW9kAQAEDG5ldwS0c2V0X2Rpc3B1dGVfcG9zdF9jb25jbHVzaW9uX2FjY2VwdGFuY2VfcGVyaW9kAQAEDG5ldwREc2V0X25vX3Nob3dfc2xvdHMBAAQMbmV3BFBzZXRfbl9kZWxheV90cmFuY2hlcwEABAxuZXcEeHNldF96ZXJvdGhfZGVsYXlfdHJhbmNoZV93aWR0aAEABAxuZXcEUHNldF9uZWVkZWRfYXBwcm92YWxzAQAEDG5ldwRwc2V0X3JlbGF5X3ZyZl9tb2R1bG9fc2FtcGxlcwEABAxuZXcEaHNldF9tYXhfdXB3YXJkX3F1ZXVlX2NvdW50AQAEDG5ldwRkc2V0X21heF91cHdhcmRfcXVldWVfc2l6ZQEABAxuZXcEdHNldF9tYXhfZG93bndhcmRfbWVzc2FnZV9zaXplAQAEDG5ldwRsc2V0X21heF91cHdhcmRfbWVzc2FnZV9zaXplAQAEDG5ldwSgc2V0X21heF91cHdhcmRfbWVzc2FnZV9udW1fcGVyX2NhbmRpZGF0ZQEABAxuZXcEZHNldF9ocm1wX29wZW5fcmVxdWVzdF90dGwBAAQMbmV3BFxzZXRfaHJtcF9zZW5kZXJfZGVwb3NpdAEABAxuZXcIaHNldF9ocm1wX3JlY2lwaWVudF9kZXBvc2l0AQAEDG5ldwh0c2V0X2hybXBfY2hhbm5lbF9tYXhfY2FwYWNpdHkBAAQMbmV3BHxzZXRfaHJtcF9jaGFubmVsX21heF90b3RhbF9zaXplAQAEDG5ldwScc2V0X2hybXBfbWF4X3BhcmFjaGFpbl9pbmJvdW5kX2NoYW5uZWxzAQAEDG5ldwSEc2V0X2hybXBfY2hhbm5lbF9tYXhfbWVzc2FnZV9zaXplAQAEDG5ldwSgc2V0X2hybXBfbWF4X3BhcmFjaGFpbl9vdXRib3VuZF9jaGFubmVscwEABAxuZXcEmHNldF9ocm1wX21heF9tZXNzYWdlX251bV9wZXJfY2FuZGlkYXRlAQAEDG5ldwRIc2V0X3B2Zl92b3RpbmdfdHRsAQAEDG5ldwSQc2V0X21pbmltdW1fdmFsaWRhdGlvbl91cGdyYWRlX2RlbGF5AQAEDG5ldwRwc2V0X2J5cGFzc19jb25zaXN0ZW5jeV9jaGVjawEABAxuZXcUYHNldF9hc3luY19iYWNraW5nX3BhcmFtcwEABAxuZXeVBUxzZXRfZXhlY3V0b3JfcGFyYW1zAQAEDG5ld6UFWHNldF9vbl9kZW1hbmRfYmFzZV9mZWUBAAQMbmV3CHRzZXRfb25fZGVtYW5kX2ZlZV92YXJpYWJpbGl0eQEABAxuZXcEcHNldF9vbl9kZW1hbmRfcXVldWVfbWF4X3NpemUBAAQMbmV3BJhzZXRfb25fZGVtYW5kX3RhcmdldF9xdWV1ZV91dGlsaXphdGlvbgEABAxuZXcERHNldF9vbl9kZW1hbmRfdHRsAQAEDG5ldwRkc2V0X21pbmltdW1fYmFja2luZ192b3RlcwEABAxuZXcEQHNldF9ub2RlX2ZlYXR1cmUBAAgUaW5kZXgEFHZhbHVlFGhzZXRfYXBwcm92YWxfdm90aW5nX3BhcmFtcwEABAxuZXcEUHNldF9zY2hlZHVsZXJfcGFyYW1zAQAEDG5ld6kFAQQADBxwYXlsb2FksQU8dmFsaWRhdG9yX2luZGV4BCRzaWduYXR1cmVBAgS1BQAACCRyZWNpcGllbnQEEGRhdGEkBL0FAAYkABg8dXB3YXJkX21lc3NhZ2VzfQNMaG9yaXpvbnRhbF9tZXNzYWdlc8EFTG5ld192YWxpZGF0aW9uX2NvZGXFBSRoZWFkX2RhdGEkbHByb2Nlc3NlZF9kb3dud2FyZF9tZXNzYWdlcwQ4aHJtcF93YXRlcm1hcmsEAAgoZGVzY3JpcHRvckUCLGNvbW1pdG1lbnRzyQUCCCBJbXBsaWNpdAEFAQEBIEV4cGxpY2l0AQUBAQEE0QUAAAwkY2FuZGlkYXRlzQU4dmFsaWRpdHlfdm90ZXPVBUR2YWxpZGF0b3JfaW5kaWNlc7EFBNkFAAIUIEV4cGxpY2l0AQEFPEJhY2tpbmdTZWNvbmRlZAEFAYAwQmFja2luZ1ZhbGlkAQUBgEBBcHByb3ZhbENoZWNraW5nAQEFiEFwcHJvdmFsQ2hlY2tpbmdNdWx0aXBsZUNhbmRpZGF0ZXMBBCAAAgQgRXhwbGljaXQBAQUCCBRWYWxpZAECFCBFeHBsaWNpdAEBBTxCYWNraW5nU2Vjb25kZWQBBQGAMEJhY2tpbmdWYWxpZAEFAYBAQXBwcm92YWxDaGVja2luZwEBBYhBcHByb3ZhbENoZWNraW5nTXVsdGlwbGVDYW5kaWRhdGVzAQQgABxJbnZhbGlkAQIEIEV4cGxpY2l0AQEFAwzpBQRBAgTtBQAADDhjYW5kaWRhdGVfaGFzaCAcc2Vzc2lvbgQoc3RhdGVtZW50c/EFBPUFAAAQJGJpdGZpZWxkc7kFRGJhY2tlZF9jYW5kaWRhdGVz3QUgZGlzcHV0ZXP5BTRwYXJlbnRfaGVhZGVytQMCBBRlbnRlcgEABBBkYXRh/QUAEBhhY2NlcHQUHHN1YmplY3QgNHNlc3Npb25faW5kZXgEPHZhbGlkYXRvcl9pbmRleAQCJFhmb3JjZV9zZXRfY3VycmVudF9jb2RlAQAIEHBhcmEEIG5ld19jb2RlJFhmb3JjZV9zZXRfY3VycmVudF9oZWFkAQAIEHBhcmEEIG5ld19oZWFkJGxmb3JjZV9zY2hlZHVsZV9jb2RlX3VwZ3JhZGUBAAwQcGFyYQQgbmV3X2NvZGUkTHJlbGF5X3BhcmVudF9udW1iZXIETGZvcmNlX25vdGVfbmV3X2hlYWQBAAgQcGFyYQQgbmV3X2hlYWQkSGZvcmNlX3F1ZXVlX2FjdGlvbgEABBBwYXJhBGxhZGRfdHJ1c3RlZF92YWxpZGF0aW9uX2NvZGUBAAQ8dmFsaWRhdGlvbl9jb2RlJGxwb2tlX3VudXNlZF92YWxpZGF0aW9uX2NvZGUBAARQdmFsaWRhdGlvbl9jb2RlX2hhc2ggbGluY2x1ZGVfcHZmX2NoZWNrX3N0YXRlbWVudAEACBBzdG10BQYkc2lnbmF0dXJlQQJ0Zm9yY2Vfc2V0X21vc3RfcmVjZW50X2NvbnRleHQBAAgQcGFyYQQcY29udGV4dAQCBDRmb3JjZV9hcHByb3ZlAQAEFHVwX3RvBAIsWGhybXBfaW5pdF9vcGVuX2NoYW5uZWwBAAwkcmVjaXBpZW50BFRwcm9wb3NlZF9tYXhfY2FwYWNpdHkEZHByb3Bvc2VkX21heF9tZXNzYWdlX3NpemUEYGhybXBfYWNjZXB0X29wZW5fY2hhbm5lbAEABBhzZW5kZXIESGhybXBfY2xvc2VfY2hhbm5lbAEABChjaGFubmVsX2lkVQJAZm9yY2VfY2xlYW5faHJtcAEADBBwYXJhBCxudW1faW5ib3VuZAQwbnVtX291dGJvdW5kBFxmb3JjZV9wcm9jZXNzX2hybXBfb3BlbgEABCBjaGFubmVscwRgZm9yY2VfcHJvY2Vzc19ocm1wX2Nsb3NlAQAEIGNoYW5uZWxzBGBocm1wX2NhbmNlbF9vcGVuX3JlcXVlc3QBAAgoY2hhbm5lbF9pZFUCNG9wZW5fcmVxdWVzdHMEXGZvcmNlX29wZW5faHJtcF9jaGFubmVsAQAQGHNlbmRlcgQkcmVjaXBpZW50BDBtYXhfY2FwYWNpdHkEQG1heF9tZXNzYWdlX3NpemUEYGVzdGFibGlzaF9zeXN0ZW1fY2hhbm5lbAEACBhzZW5kZXIEJHJlY2lwaWVudARUcG9rZV9jaGFubmVsX2RlcG9zaXRzAQAIGHNlbmRlcgQkcmVjaXBpZW50BHRlc3RhYmxpc2hfY2hhbm5lbF93aXRoX3N5c3RlbQEABEx0YXJnZXRfc3lzdGVtX2NoYWluBAIEOGZvcmNlX3VuZnJlZXplAQEFAAg0c2Vzc2lvbl9pbmRleAQ4Y2FuZGlkYXRlX2hhc2ggAggoRm9ySW52YWxpZAEBBTBBZ2FpbnN0VmFsaWQBAQUAECR0aW1lX3Nsb3QZBhBraW5kHQY8dmFsaWRhdG9yX2luZGV4BDB2YWxpZGF0b3JfaWQgAgRwcmVwb3J0X2Rpc3B1dGVfbG9zdF91bnNpZ25lZAEACDRkaXNwdXRlX3Byb29mIQY8a2V5X293bmVyX3Byb29mvQMCCFxwbGFjZV9vcmRlcl9hbGxvd19kZWF0aAEACChtYXhfYW1vdW50CBxwYXJhX2lkBFhwbGFjZV9vcmRlcl9rZWVwX2FsaXZlAQAIKG1heF9hbW91bnQIHHBhcmFfaWQEAiQgcmVnaXN0ZXIBAAwIaWQEMGdlbmVzaXNfaGVhZCQ8dmFsaWRhdGlvbl9jb2RlJDhmb3JjZV9yZWdpc3RlcgEAFAx3aG8AHGRlcG9zaXQICGlkBDBnZW5lc2lzX2hlYWQkPHZhbGlkYXRpb25fY29kZSQoZGVyZWdpc3RlcgEABAhpZAQQc3dhcAEACAhpZAQUb3RoZXIELHJlbW92ZV9sb2NrAQAEEHBhcmEEHHJlc2VydmUBAQUgYWRkX2xvY2sBAAQQcGFyYQRUc2NoZWR1bGVfY29kZV91cGdyYWRlAQAIEHBhcmEEIG5ld19jb2RlJEBzZXRfY3VycmVudF9oZWFkAQAIEHBhcmEEIG5ld19oZWFkJAIMLGZvcmNlX2xlYXNlAQAUEHBhcmEEGGxlYXNlcgAYYW1vdW50CDBwZXJpb2RfYmVnaW4EMHBlcmlvZF9jb3VudARAY2xlYXJfYWxsX2xlYXNlcwEABBBwYXJhBDx0cmlnZ2VyX29uYm9hcmQBAAQQcGFyYQQCDCxuZXdfYXVjdGlvbgEACCBkdXJhdGlvbgRIbGVhc2VfcGVyaW9kX2luZGV4BAxiaWQBABQQcGFyYQQ0YXVjdGlvbl9pbmRleAQoZmlyc3Rfc2xvdAQkbGFzdF9zbG90BBhhbW91bnQIOGNhbmNlbF9hdWN0aW9uAQEFAgwcRWQyNTUxOQEFAYAcU3IyNTUxOQEFAYAURWNkc2EBBQGEBjkGAgwcRWQyNTUxOQEFAQEBHFNyMjU1MTkBBQEBARRFY2RzYQEFAQUBBkEGAiQYY3JlYXRlAQAYFGluZGV4BAxjYXAIMGZpcnN0X3BlcmlvZAQsbGFzdF9wZXJpb2QEDGVuZAQgdmVyaWZpZXI9Bihjb250cmlidXRlAQAMFGluZGV4BBR2YWx1ZQgkc2lnbmF0dXJlRQYgd2l0aGRyYXcBAAgMd2hvABRpbmRleAQYcmVmdW5kAQAEFGluZGV4BCBkaXNzb2x2ZQEABBRpbmRleAQQZWRpdAEAGBRpbmRleAQMY2FwCDBmaXJzdF9wZXJpb2QELGxhc3RfcGVyaW9kBAxlbmQEIHZlcmlmaWVyPQYgYWRkX21lbW8BAAgUaW5kZXgEEG1lbW8kEHBva2UBAAQUaW5kZXgEOGNvbnRyaWJ1dGVfYWxsAQAIFGluZGV4BCRzaWduYXR1cmVFBgIMEElkbGUBAQUQUG9vbAEBBRBUYXNrAQECAwhNBgQEUQYAAgxIcmVxdWVzdF9jb3JlX2NvdW50AQAEFGNvdW50BEhyZXF1ZXN0X3JldmVudWVfYXQBAAQQd2hlbgQsYXNzaWduX2NvcmUBABAQY29yZQQUYmVnaW4EKGFzc2lnbm1lbnRVBiBlbmRfaGludC0EAAgQc2l6ZQQQaXRlbQQGXQYCDBxUb1N0YXJ0AQEFHExhc3RLZXkBBQAgQ29tcGxldGUBAQUAFDBwcm9ncmVzc190b3BlBjhwcm9ncmVzc19jaGlsZGUGEHNpemUEJHRvcF9pdGVtcwQsY2hpbGRfaXRlbXMEAhhYY29udHJvbF9hdXRvX21pZ3JhdGlvbgEABDBtYXliZV9jb25maWdhBkBjb250aW51ZV9taWdyYXRlAQAMGGxpbWl0c10GPHJlYWxfc2l6ZV91cHBlcgQwd2l0bmVzc190YXNraQZIbWlncmF0ZV9jdXN0b21fdG9wAQAIEGtleXN9AzB3aXRuZXNzX3NpemUEUG1pZ3JhdGVfY3VzdG9tX2NoaWxkAQAMEHJvb3QkKGNoaWxkX2tleXN9Ayh0b3RhbF9zaXplBFRzZXRfc2lnbmVkX21heF9saW1pdHMBAAQYbGltaXRzXQZIZm9yY2Vfc2V0X3Byb2dyZXNzAQAIMHByb2dyZXNzX3RvcGUGOHByb2dyZXNzX2NoaWxkZQYCaCBPdmVyZmxvdwEBBTRVbmltcGxlbWVudGVkAQEFYFVudHJ1c3RlZFJlc2VydmVMb2NhdGlvbgEBBWRVbnRydXN0ZWRUZWxlcG9ydExvY2F0aW9uAQEFRE11bHRpTG9jYXRpb25GdWxsAQEFaE11bHRpTG9jYXRpb25Ob3RJbnZlcnRpYmxlAQEFJEJhZE9yaWdpbgEBBTxJbnZhbGlkTG9jYXRpb24BAQU0QXNzZXROb3RGb3VuZAEBBVRGYWlsZWRUb1RyYW5zYWN0QXNzZXQBAQU8Tm90V2l0aGRyYXdhYmxlAQEFSExvY2F0aW9uQ2Fubm90SG9sZAEBBVRFeGNlZWRzTWF4TWVzc2FnZVNpemUBAQVYRGVzdGluYXRpb25VbnN1cHBvcnRlZAEBBSRUcmFuc3BvcnQBAQUoVW5yb3V0YWJsZQEBBTBVbmtub3duQ2xhaW0BAQU4RmFpbGVkVG9EZWNvZGUBAQVATWF4V2VpZ2h0SW52YWxpZAEBBThOb3RIb2xkaW5nRmVlcwEBBTBUb29FeHBlbnNpdmUBAQUQVHJhcAEBA0xVbmhhbmRsZWRYY21WZXJzaW9uAQEFSFdlaWdodExpbWl0UmVhY2hlZAEBAxxCYXJyaWVyAQEFTFdlaWdodE5vdENvbXB1dGFibGUBAQUDCARxBgZ1BgIQEE51bGwBAQUYQXNzZXRzAQQJAwA8RXhlY3V0aW9uUmVzdWx0AQZ1BhxWZXJzaW9uAQECAggMQWxsAQEFFEFsbE9mAQAICGlk/QIMZnVu5QICCCBEZWZpbml0ZQEECQMAEFdpbGQBAggMQWxsAQEFFEFsbE9mAQAICGlk/QIMZnVu5QICCCRVbmxpbWl0ZWQBAQUcTGltaXRlZAEBAwJwNFdpdGhkcmF3QXNzZXQBBAkDAFRSZXNlcnZlQXNzZXREZXBvc2l0ZWQBBAkDAFhSZWNlaXZlVGVsZXBvcnRlZEFzc2V0AQQJAwA0UXVlcnlSZXNwb25zZQEADCBxdWVyeV9pZAggcmVzcG9uc2V9BihtYXhfd2VpZ2h0CDRUcmFuc2ZlckFzc2V0AQAIGGFzc2V0cw0DLGJlbmVmaWNpYXJ5lQFQVHJhbnNmZXJSZXNlcnZlQXNzZXQBAAwYYXNzZXRzDQMQZGVzdJUBDHhjbZEGIFRyYW5zYWN0AQAMLG9yaWdpbl90eXBlwQJYcmVxdWlyZV93ZWlnaHRfYXRfbW9zdAgQY2FsbCRkSHJtcE5ld0NoYW5uZWxPcGVuUmVxdWVzdAEADBhzZW5kZXIEQG1heF9tZXNzYWdlX3NpemUEMG1heF9jYXBhY2l0eQRMSHJtcENoYW5uZWxBY2NlcHRlZAEABCRyZWNpcGllbnQESEhybXBDaGFubmVsQ2xvc2luZwEADCRpbml0aWF0b3IEGHNlbmRlcgQkcmVjaXBpZW50BCxDbGVhck9yaWdpbgEBBTREZXNjZW5kT3JpZ2luAQIkEEhlcmUBAQUIWDEBAiQkUGFyYWNoYWluAQECLEFjY291bnRJZDMyAQAIHG5ldHdvcmuFAQhpZCA4QWNjb3VudEluZGV4NjQBAAgcbmV0d29ya4UBFGluZGV4CDBBY2NvdW50S2V5MjABAAgcbmV0d29ya4UBDGtleWUBOFBhbGxldEluc3RhbmNlAQECMEdlbmVyYWxJbmRleAEBAyhHZW5lcmFsS2V5AQUAJE9ubHlDaGlsZAEBBSRQbHVyYWxpdHkBAAgIaWSJARBwYXJ0bQEIWDIBBI0BAQgIWDMBBI0BAQwIWDQBBI0BARAIWDUBBI0BARQIWDYBBI0BARgIWDcBBI0BARwIWDgBBI0BASAsUmVwb3J0RXJyb3IBAAwgcXVlcnlfaWQIEGRlc3SVAUxtYXhfcmVzcG9uc2Vfd2VpZ2h0CDBEZXBvc2l0QXNzZXQBAAwYYXNzZXRzhQYobWF4X2Fzc2V0cwQsYmVuZWZpY2lhcnmVAUxEZXBvc2l0UmVzZXJ2ZUFzc2V0AQAQGGFzc2V0c4UGKG1heF9hc3NldHMEEGRlc3SVAQx4Y22RBjRFeGNoYW5nZUFzc2V0AQAIEGdpdmWFBhxyZWNlaXZlDQNcSW5pdGlhdGVSZXNlcnZlV2l0aGRyYXcBAAwYYXNzZXRzhQYccmVzZXJ2ZZUBDHhjbZEGQEluaXRpYXRlVGVsZXBvcnQBAAwYYXNzZXRzhQYQZGVzdJUBDHhjbZEGMFF1ZXJ5SG9sZGluZwEAECBxdWVyeV9pZAgQZGVzdJUBGGFzc2V0c4UGTG1heF9yZXNwb25zZV93ZWlnaHQIMEJ1eUV4ZWN1dGlvbgEACBBmZWVzCQMwd2VpZ2h0X2xpbWl0iQY0UmVmdW5kU3VycGx1cwEBBTxTZXRFcnJvckhhbmRsZXIBBI0GACxTZXRBcHBlbmRpeAEEjQYAKENsZWFyRXJyb3IBAQUoQ2xhaW1Bc3NldAEACBhhc3NldHMNAxh0aWNrZXSVARBUcmFwAQEDQFN1YnNjcmliZVZlcnNpb24BAAggcXVlcnlfaWQITG1heF9yZXNwb25zZV93ZWlnaHQISFVuc3Vic2NyaWJlVmVyc2lvbgEBBQSNBgACGBBOdWxsAQEFGEFzc2V0cwEEEQMAPEV4ZWN1dGlvblJlc3VsdAEGpQIcVmVyc2lvbgEBAixQYWxsZXRzSW5mbwEErQIAOERpc3BhdGNoUmVzdWx0AQIMHFN1Y2Nlc3MBAQUURXJyb3IBBQA4VHJ1bmNhdGVkRXJyb3IBBQACEAxBbGwBAQUUQWxsT2YBAAgIaWR9AQxmdW7lAihBbGxDb3VudGVkAQECMEFsbE9mQ291bnRlZAEADAhpZH0BDGZ1buUCFGNvdW50BAIIIERlZmluaXRlAQQRAwAQV2lsZAECEAxBbGwBAQUUQWxsT2YBAAgIaWR9AQxmdW7lAihBbGxDb3VudGVkAQECMEFsbE9mQ291bnRlZAEADAhpZH0BDGZ1buUCFGNvdW50BALANFdpdGhkcmF3QXNzZXQBBBEDAFRSZXNlcnZlQXNzZXREZXBvc2l0ZWQBBBEDAFhSZWNlaXZlVGVsZXBvcnRlZEFzc2V0AQQRAwA0UXVlcnlSZXNwb25zZQEAECBxdWVyeV9pZAggcmVzcG9uc2WVBihtYXhfd2VpZ2h0GBxxdWVyaWVyvQI0VHJhbnNmZXJBc3NldAEACBhhc3NldHMVAyxiZW5lZmljaWFyeXkBUFRyYW5zZmVyUmVzZXJ2ZUFzc2V0AQAMGGFzc2V0cxUDEGRlc3R5AQx4Y22lBiBUcmFuc2FjdAEADCxvcmlnaW5fa2luZMECWHJlcXVpcmVfd2VpZ2h0X2F0X21vc3QYEGNhbGwkZEhybXBOZXdDaGFubmVsT3BlblJlcXVlc3QBAAwYc2VuZGVyBEBtYXhfbWVzc2FnZV9zaXplBDBtYXhfY2FwYWNpdHkETEhybXBDaGFubmVsQWNjZXB0ZWQBAAQkcmVjaXBpZW50BEhIcm1wQ2hhbm5lbENsb3NpbmcBAAwkaW5pdGlhdG9yBBhzZW5kZXIEJHJlY2lwaWVudAQsQ2xlYXJPcmlnaW4BAQU0RGVzY2VuZE9yaWdpbgECJBBIZXJlAQEFCFgxAQIoJFBhcmFjaGFpbgEBAixBY2NvdW50SWQzMgEACBxuZXR3b3JrYQEIaWQgOEFjY291bnRJbmRleDY0AQAIHG5ldHdvcmthARRpbmRleAgwQWNjb3VudEtleTIwAQAIHG5ldHdvcmthAQxrZXllAThQYWxsZXRJbnN0YW5jZQEBAjBHZW5lcmFsSW5kZXgBAQMoR2VuZXJhbEtleQEACBhsZW5ndGgEEGRhdGEgJE9ubHlDaGlsZAEBBSRQbHVyYWxpdHkBAAgIaWRpARBwYXJ0bQE8R2xvYmFsQ29uc2Vuc3VzAQIsJEJ5R2VuZXNpcwEFAYAYQnlGb3JrAQAIMGJsb2NrX251bWJlcggoYmxvY2tfaGFzaCAgUG9sa2Fkb3QBAQUYS3VzYW1hAQEFHFdlc3RlbmQBAQUYUm9jb2NvAQEFGFdvY29jbwEBBSBFdGhlcmV1bQEABCBjaGFpbl9pZAgsQml0Y29pbkNvcmUBAQUsQml0Y29pbkNhc2gBAQVAUG9sa2Fkb3RCdWxsZXRpbgEBBQhYMgEEcQEBCAhYMwEEcQEBDAhYNAEEcQEBEAhYNQEEcQEBFAhYNgEEcQEBGAhYNwEEcQEBHAhYOAEEcQEBICxSZXBvcnRFcnJvcgEADCxkZXN0aW5hdGlvbnkBIHF1ZXJ5X2lkCChtYXhfd2VpZ2h0GDBEZXBvc2l0QXNzZXQBAAgYYXNzZXRznQYsYmVuZWZpY2lhcnl5AUxEZXBvc2l0UmVzZXJ2ZUFzc2V0AQAMGGFzc2V0c50GEGRlc3R5AQx4Y22lBjRFeGNoYW5nZUFzc2V0AQAMEGdpdmWdBhB3YW50FQMcbWF4aW1hbBRcSW5pdGlhdGVSZXNlcnZlV2l0aGRyYXcBAAwYYXNzZXRznQYccmVzZXJ2ZXkBDHhjbaUGQEluaXRpYXRlVGVsZXBvcnQBAAwYYXNzZXRznQYQZGVzdHkBDHhjbaUGNFJlcG9ydEhvbGRpbmcBAAg0cmVzcG9uc2VfaW5mb+ECGGFzc2V0c50GMEJ1eUV4ZWN1dGlvbgEACBBmZWVzEQMwd2VpZ2h0X2xpbWl08QI0UmVmdW5kU3VycGx1cwEBBTxTZXRFcnJvckhhbmRsZXIBBKEGACxTZXRBcHBlbmRpeAEEoQYAKENsZWFyRXJyb3IBAQUoQ2xhaW1Bc3NldAEACBhhc3NldHMVAxh0aWNrZXR5ARBUcmFwAQEDQFN1YnNjcmliZVZlcnNpb24BAAggcXVlcnlfaWQITG1heF9yZXNwb25zZV93ZWlnaHQYSFVuc3Vic2NyaWJlVmVyc2lvbgEBBSRCdXJuQXNzZXQBBBEDACxFeHBlY3RBc3NldAEEEQMAMEV4cGVjdE9yaWdpbgEGeQEsRXhwZWN0RXJyb3IBBqUCUEV4cGVjdFRyYW5zYWN0U3RhdHVzAQIMHFN1Y2Nlc3MBAQUURXJyb3IBBQA4VHJ1bmNhdGVkRXJyb3IBBQAsUXVlcnlQYWxsZXQBAAgsbW9kdWxlX25hbWUkNHJlc3BvbnNlX2luZm/hAjBFeHBlY3RQYWxsZXQBABQUaW5kZXgEEG5hbWUkLG1vZHVsZV9uYW1lJCxjcmF0ZV9tYWpvcgQ8bWluX2NyYXRlX21pbm9yBFBSZXBvcnRUcmFuc2FjdFN0YXR1cwEADCxkZXN0aW5hdGlvbnkBIHF1ZXJ5X2lkCChtYXhfd2VpZ2h0GExDbGVhclRyYW5zYWN0U3RhdHVzAQEFPFVuaXZlcnNhbE9yaWdpbgECKCRQYXJhY2hhaW4BAQIsQWNjb3VudElkMzIBAAgcbmV0d29ya2EBCGlkIDhBY2NvdW50SW5kZXg2NAEACBxuZXR3b3JrYQEUaW5kZXgIMEFjY291bnRLZXkyMAEACBxuZXR3b3JrYQEMa2V5ZQE4UGFsbGV0SW5zdGFuY2UBAQIwR2VuZXJhbEluZGV4AQEDKEdlbmVyYWxLZXkBAAgYbGVuZ3RoBBBkYXRhICRPbmx5Q2hpbGQBAQUkUGx1cmFsaXR5AQAICGlkaQEQcGFydG0BPEdsb2JhbENvbnNlbnN1cwECLCRCeUdlbmVzaXMBBQGAGEJ5Rm9yawEACDBibG9ja19udW1iZXIIKGJsb2NrX2hhc2ggIFBvbGthZG90AQEFGEt1c2FtYQEBBRxXZXN0ZW5kAQEFGFJvY29jbwEBBRhXb2NvY28BAQUgRXRoZXJldW0BAAQgY2hhaW5faWQILEJpdGNvaW5Db3JlAQEFLEJpdGNvaW5DYXNoAQEFQFBvbGthZG90QnVsbGV0aW4BAQU0RXhwb3J0TWVzc2FnZQEADBxuZXR3b3JrXQEsZGVzdGluYXRpb251AQx4Y22lBiRMb2NrQXNzZXQBAAgUYXNzZXQRAyB1bmxvY2tlcnkBLFVubG9ja0Fzc2V0AQAIFGFzc2V0EQMYdGFyZ2V0eQE4Tm90ZVVubG9ja2FibGUBAAgUYXNzZXQRAxRvd25lcnkBNFJlcXVlc3RVbmxvY2sBAAgUYXNzZXQRAxhsb2NrZXJ5ASxTZXRGZWVzTW9kZQEABDBqaXRfd2l0aGRyYXcUIFNldFRvcGljAQUBgChDbGVhclRvcGljAQEFLEFsaWFzT3JpZ2luAQAIHHBhcmVudHMEIGludGVyaW9ydQE8VW5wYWlkRXhlY3V0aW9uAQAIMHdlaWdodF9saW1pdPECMGNoZWNrX29yaWdpbr0CBKEGAAIMCFYyAQSNBgAIVjMBBKEGAAhWNAEE9QIAAhAgVGVsZXBvcnQBAQUwTG9jYWxSZXNlcnZlAQEFSERlc3RpbmF0aW9uUmVzZXJ2ZQEBBTRSZW1vdGVSZXNlcnZlAQIMCFYyAQAIHHBhcmVudHMEIGludGVyaW9ykQEIVjMBAAgccGFyZW50cwQgaW50ZXJpb3J1AQhWNAEACBxwYXJlbnRzBCBpbnRlcmlvcnUBAggIVjMBAgggQ29uY3JldGUBAAgccGFyZW50cwQgaW50ZXJpb3J1ASBBYnN0cmFjdAEFAYAIVjQBAAgccGFyZW50cwQgaW50ZXJpb3J1AQI4EHNlbmQBAAgQZGVzdJkBHG1lc3NhZ2WpBjx0ZWxlcG9ydF9hc3NldHMBABAQZGVzdJkBLGJlbmVmaWNpYXJ5mQEYYXNzZXRzGQM4ZmVlX2Fzc2V0X2l0ZW0EXHJlc2VydmVfdHJhbnNmZXJfYXNzZXRzAQAQEGRlc3SZASxiZW5lZmljaWFyeZkBGGFzc2V0cxkDOGZlZV9hc3NldF9pdGVtBBxleGVjdXRlAQAIHG1lc3NhZ2WpBihtYXhfd2VpZ2h0GERmb3JjZV94Y21fdmVyc2lvbgEACCBsb2NhdGlvbnkBHHZlcnNpb24EZGZvcmNlX2RlZmF1bHRfeGNtX3ZlcnNpb24BAAREbWF5YmVfeGNtX3ZlcnNpb24tBHhmb3JjZV9zdWJzY3JpYmVfdmVyc2lvbl9ub3RpZnkBAAQgbG9jYXRpb26ZAYBmb3JjZV91bnN1YnNjcmliZV92ZXJzaW9uX25vdGlmeQEABCBsb2NhdGlvbpkBfGxpbWl0ZWRfcmVzZXJ2ZV90cmFuc2Zlcl9hc3NldHMBABQQZGVzdJkBLGJlbmVmaWNpYXJ5mQEYYXNzZXRzGQM4ZmVlX2Fzc2V0X2l0ZW0EMHdlaWdodF9saW1pdPECXGxpbWl0ZWRfdGVsZXBvcnRfYXNzZXRzAQAUEGRlc3SZASxiZW5lZmljaWFyeZkBGGFzc2V0cxkDOGZlZV9hc3NldF9pdGVtBDB3ZWlnaHRfbGltaXTxAkBmb3JjZV9zdXNwZW5zaW9uAQAEJHN1c3BlbmRlZBQ8dHJhbnNmZXJfYXNzZXRzAQAUEGRlc3SZASxiZW5lZmljaWFyeZkBGGFzc2V0cxkDOGZlZV9hc3NldF9pdGVtBDB3ZWlnaHRfbGltaXTxAjBjbGFpbV9hc3NldHMBAAgYYXNzZXRzGQMsYmVuZWZpY2lhcnmZAYx0cmFuc2Zlcl9hc3NldHNfdXNpbmdfdHlwZV9hbmRfdGhlbgEAHBBkZXN0mQEYYXNzZXRzGQNQYXNzZXRzX3RyYW5zZmVyX3R5cGWtBjhyZW1vdGVfZmVlc19pZLEGSGZlZXNfdHJhbnNmZXJfdHlwZa0GSGN1c3RvbV94Y21fb25fZGVzdKkGMHdlaWdodF9saW1pdPECAggkcmVhcF9wYWdlAQAIOG1lc3NhZ2Vfb3JpZ2luJQMocGFnZV9pbmRleARIZXhlY3V0ZV9vdmVyd2VpZ2h0AQAQOG1lc3NhZ2Vfb3JpZ2luJQMQcGFnZQQUaW5kZXgEMHdlaWdodF9saW1pdBgCDBhjcmVhdGUBAAgoYXNzZXRfa2luZIEBEHJhdGUIGHVwZGF0ZQEACChhc3NldF9raW5kgQEQcmF0ZQgYcmVtb3ZlAQAEKGFzc2V0X2tpbmSBAQUBCAMIwQYkBMUGAAAMHHBheWxvYWTJBjBibG9ja19udW1iZXIEQHZhbGlkYXRvcl9zZXRfaWQIAAwoY29tbWl0bWVudM0GCGlkCQQkc2lnbmF0dXJlXQQACBRmaXJzdNEGGHNlY29uZNEGAgxMcmVwb3J0X2VxdWl2b2NhdGlvbgEACEhlcXVpdm9jYXRpb25fcHJvb2bVBjxrZXlfb3duZXJfcHJvb2a9A3ByZXBvcnRfZXF1aXZvY2F0aW9uX3Vuc2lnbmVkAQAISGVxdWl2b2NhdGlvbl9wcm9vZtUGPGtleV9vd25lcl9wcm9vZr0DPHNldF9uZXdfZ2VuZXNpcwEABDxkZWxheV9pbl9ibG9ja3MEArgYU3lzdGVtAQIsGHJlbWFyawEABBhyZW1hcmskOHNldF9oZWFwX3BhZ2VzAQAEFHBhZ2VzCCBzZXRfY29kZQEABBBjb2RlJFxzZXRfY29kZV93aXRob3V0X2NoZWNrcwEABBBjb2RlJCxzZXRfc3RvcmFnZQEABBRpdGVtc3kDMGtpbGxfc3RvcmFnZQEABBBrZXlzfQMsa2lsbF9wcmVmaXgBAAgYcHJlZml4JBxzdWJrZXlzBERyZW1hcmtfd2l0aF9ldmVudAEABBhyZW1hcmskRGF1dGhvcml6ZV91cGdyYWRlAQAEJGNvZGVfaGFzaCCAYXV0aG9yaXplX3VwZ3JhZGVfd2l0aG91dF9jaGVja3MBAAQkY29kZV9oYXNoIGBhcHBseV9hdXRob3JpemVkX3VwZ3JhZGUBAAQQY29kZSQkU2NoZWR1bGVyAQIoIHNjaGVkdWxlAQAQEHdoZW4EOG1heWJlX3BlcmlvZGljgQMgcHJpb3JpdHkEEGNhbGzdBhhjYW5jZWwBAAgQd2hlbgQUaW5kZXgEOHNjaGVkdWxlX25hbWVkAQAUCGlkIBB3aGVuBDhtYXliZV9wZXJpb2RpY4EDIHByaW9yaXR5BBBjYWxs3QYwY2FuY2VsX25hbWVkAQAECGlkIDhzY2hlZHVsZV9hZnRlcgEAEBRhZnRlcgQ4bWF5YmVfcGVyaW9kaWOBAyBwcmlvcml0eQQQY2FsbN0GUHNjaGVkdWxlX25hbWVkX2FmdGVyAQAUCGlkIBRhZnRlcgQ4bWF5YmVfcGVyaW9kaWOBAyBwcmlvcml0eQQQY2FsbN0GJHNldF9yZXRyeQEADBB0YXNrDQEccmV0cmllcwQYcGVyaW9kBDxzZXRfcmV0cnlfbmFtZWQBAAwIaWQgHHJldHJpZXMEGHBlcmlvZAQwY2FuY2VsX3JldHJ5AQAEEHRhc2sNAUhjYW5jZWxfcmV0cnlfbmFtZWQBAAQIaWQgIFByZWltYWdlAQIUNG5vdGVfcHJlaW1hZ2UBAAQUYnl0ZXMkPHVubm90ZV9wcmVpbWFnZQEABBBoYXNoIEByZXF1ZXN0X3ByZWltYWdlAQAEEGhhc2ggSHVucmVxdWVzdF9wcmVpbWFnZQEABBBoYXNoIDhlbnN1cmVfdXBkYXRlZAEABBhoYXNoZXM5AxBCYWJlAQIMTHJlcG9ydF9lcXVpdm9jYXRpb24BAAhIZXF1aXZvY2F0aW9uX3Byb29muQM8a2V5X293bmVyX3Byb29mvQNwcmVwb3J0X2VxdWl2b2NhdGlvbl91bnNpZ25lZAEACEhlcXVpdm9jYXRpb25fcHJvb2a5AzxrZXlfb3duZXJfcHJvb2a9A0hwbGFuX2NvbmZpZ19jaGFuZ2UBAAQYY29uZmlnyQMkVGltZXN0YW1wAQIEDHNldAEABAxub3cIHEluZGljZXMBAhQUY2xhaW0BAAQUaW5kZXgEIHRyYW5zZmVyAQAIDG5ld9UDFGluZGV4BBBmcmVlAQAEFGluZGV4BDhmb3JjZV90cmFuc2ZlcgEADAxuZXfVAxRpbmRleAQYZnJlZXplFBhmcmVlemUBAAQUaW5kZXgEIEJhbGFuY2VzAQIkUHRyYW5zZmVyX2FsbG93X2RlYXRoAQAIEGRlc3TVAxR2YWx1ZQg4Zm9yY2VfdHJhbnNmZXIBAAwYc291cmNl1QMQZGVzdNUDFHZhbHVlCEx0cmFuc2Zlcl9rZWVwX2FsaXZlAQAIEGRlc3TVAxR2YWx1ZQgwdHJhbnNmZXJfYWxsAQAIEGRlc3TVAyhrZWVwX2FsaXZlFDxmb3JjZV91bnJlc2VydmUBAAgMd2hv1QMYYW1vdW50CEB1cGdyYWRlX2FjY291bnRzAQAEDHdob90DRGZvcmNlX3NldF9iYWxhbmNlAQAIDHdob9UDIG5ld19mcmVlCGxmb3JjZV9hZGp1c3RfdG90YWxfaXNzdWFuY2UBAAgkZGlyZWN0aW9u4QMUZGVsdGEIEGJ1cm4BAAgUdmFsdWUIKGtlZXBfYWxpdmUUHFN0YWtpbmcBAngQYm9uZAEACBR2YWx1ZQgUcGF5ZWU1AShib25kX2V4dHJhAQAEOG1heF9hZGRpdGlvbmFsCBh1bmJvbmQBAAQUdmFsdWUIRHdpdGhkcmF3X3VuYm9uZGVkAQAESG51bV9zbGFzaGluZ19zcGFucwQgdmFsaWRhdGUBAAQUcHJlZnM5ASBub21pbmF0ZQEABBx0YXJnZXRz6QMUY2hpbGwBAQUkc2V0X3BheWVlAQAEFHBheWVlNQE4c2V0X2NvbnRyb2xsZXIBAQVMc2V0X3ZhbGlkYXRvcl9jb3VudAEABAxuZXcEYGluY3JlYXNlX3ZhbGlkYXRvcl9jb3VudAEABChhZGRpdGlvbmFsBFRzY2FsZV92YWxpZGF0b3JfY291bnQBAAQYZmFjdG9yBDRmb3JjZV9ub19lcmFzAQEFNGZvcmNlX25ld19lcmEBAQVEc2V0X2ludnVsbmVyYWJsZXMBAAQ0aW52dWxuZXJhYmxlc90DNGZvcmNlX3Vuc3Rha2UBAAgUc3Rhc2gASG51bV9zbGFzaGluZ19zcGFucwRQZm9yY2VfbmV3X2VyYV9hbHdheXMBAQVUY2FuY2VsX2RlZmVycmVkX3NsYXNoAQAIDGVyYQQ0c2xhc2hfaW5kaWNlczkCOHBheW91dF9zdGFrZXJzAQAIPHZhbGlkYXRvcl9zdGFzaAAMZXJhBBhyZWJvbmQBAAQUdmFsdWUIKHJlYXBfc3Rhc2gBAAgUc3Rhc2gASG51bV9zbGFzaGluZ19zcGFucwQQa2ljawEABAx3aG/pA0xzZXRfc3Rha2luZ19jb25maWdzAQAcSG1pbl9ub21pbmF0b3JfYm9uZO0DSG1pbl92YWxpZGF0b3JfYm9uZO0DTG1heF9ub21pbmF0b3JfY291bnTxA0xtYXhfdmFsaWRhdG9yX2NvdW508QM8Y2hpbGxfdGhyZXNob2xk8QM4bWluX2NvbW1pc3Npb27xA0htYXhfc3Rha2VkX3Jld2FyZHPxAyxjaGlsbF9vdGhlcgEABBRzdGFzaABoZm9yY2VfYXBwbHlfbWluX2NvbW1pc3Npb24BAAQ8dmFsaWRhdG9yX3N0YXNoAEhzZXRfbWluX2NvbW1pc3Npb24BAAQMbmV3BFhwYXlvdXRfc3Rha2Vyc19ieV9wYWdlAQAMPHZhbGlkYXRvcl9zdGFzaAAMZXJhBBBwYWdlBDB1cGRhdGVfcGF5ZWUBAAQoY29udHJvbGxlcgBoZGVwcmVjYXRlX2NvbnRyb2xsZXJfYmF0Y2gBAAQsY29udHJvbGxlcnPdAzhyZXN0b3JlX2xlZGdlcgEAEBRzdGFzaABAbWF5YmVfY29udHJvbGxlcgUCLG1heWJlX3RvdGFs9QM8bWF5YmVfdW5sb2NraW5nAQQcU2Vzc2lvbgECCCBzZXRfa2V5cwEACBBrZXlzDQQUcHJvb2YkKHB1cmdlX2tleXMBAQUcR3JhbmRwYQECDExyZXBvcnRfZXF1aXZvY2F0aW9uAQAISGVxdWl2b2NhdGlvbl9wcm9vZiUEPGtleV9vd25lcl9wcm9vZr0DcHJlcG9ydF9lcXVpdm9jYXRpb25fdW5zaWduZWQBAAhIZXF1aXZvY2F0aW9uX3Byb29mJQQ8a2V5X293bmVyX3Byb29mvQMwbm90ZV9zdGFsbGVkAQAIFGRlbGF5BGxiZXN0X2ZpbmFsaXplZF9ibG9ja19udW1iZXIEIFRyZWFzdXJ5AQIYLHNwZW5kX2xvY2FsAQAIGGFtb3VudAgsYmVuZWZpY2lhcnnVAzxyZW1vdmVfYXBwcm92YWwBAAQscHJvcG9zYWxfaWQEFHNwZW5kAQAQKGFzc2V0X2tpbmSBARhhbW91bnQILGJlbmVmaWNpYXJ5mQEodmFsaWRfZnJvbS0EGHBheW91dAEABBRpbmRleAQwY2hlY2tfc3RhdHVzAQAEFGluZGV4BCh2b2lkX3NwZW5kAQAEFGluZGV4BEBDb252aWN0aW9uVm90aW5nAQIYEHZvdGUBAAgocG9sbF9pbmRleAQQdm90ZTUEIGRlbGVnYXRlAQAQFGNsYXNzBAh0b9UDKGNvbnZpY3Rpb245BBxiYWxhbmNlCCh1bmRlbGVnYXRlAQAEFGNsYXNzBBh1bmxvY2sBAAgUY2xhc3MEGHRhcmdldNUDLHJlbW92ZV92b3RlAQAIFGNsYXNzLQQUaW5kZXgERHJlbW92ZV9vdGhlcl92b3RlAQAMGHRhcmdldNUDFGNsYXNzBBRpbmRleAQkUmVmZXJlbmRhAQIkGHN1Ym1pdAEADDxwcm9wb3NhbF9vcmlnaW6VAyBwcm9wb3NhbKUBQGVuYWN0bWVudF9tb21lbnRBBFhwbGFjZV9kZWNpc2lvbl9kZXBvc2l0AQAEFGluZGV4BFxyZWZ1bmRfZGVjaXNpb25fZGVwb3NpdAEABBRpbmRleAQYY2FuY2VsAQAEFGluZGV4BBBraWxsAQAEFGluZGV4BEBudWRnZV9yZWZlcmVuZHVtAQAEFGluZGV4BEhvbmVfZmV3ZXJfZGVjaWRpbmcBAAQUdHJhY2sEZHJlZnVuZF9zdWJtaXNzaW9uX2RlcG9zaXQBAAQUaW5kZXgEMHNldF9tZXRhZGF0YQEACBRpbmRleAQobWF5YmVfaGFzaBEBJFdoaXRlbGlzdAECEDh3aGl0ZWxpc3RfY2FsbAEABCRjYWxsX2hhc2ggXHJlbW92ZV93aGl0ZWxpc3RlZF9jYWxsAQAEJGNhbGxfaGFzaCBkZGlzcGF0Y2hfd2hpdGVsaXN0ZWRfY2FsbAEADCRjYWxsX2hhc2ggQGNhbGxfZW5jb2RlZF9sZW4ETGNhbGxfd2VpZ2h0X3dpdG5lc3MYnGRpc3BhdGNoX3doaXRlbGlzdGVkX2NhbGxfd2l0aF9wcmVpbWFnZQEABBBjYWxs3QYoUGFyYW1ldGVycwECBDRzZXRfcGFyYW1ldGVyAQAEJGtleV92YWx1ZVUEGENsYWltcwECFBRjbGFpbQEACBBkZXN0AEhldGhlcmV1bV9zaWduYXR1cmVdBChtaW50X2NsYWltAQAQDHdob2UBFHZhbHVlCEB2ZXN0aW5nX3NjaGVkdWxlZQQkc3RhdGVtZW50bQQwY2xhaW1fYXR0ZXN0AQAMEGRlc3QASGV0aGVyZXVtX3NpZ25hdHVyZV0EJHN0YXRlbWVudCQYYXR0ZXN0AQAEJHN0YXRlbWVudCQobW92ZV9jbGFpbQEADAxvbGRlAQxuZXdlAThtYXliZV9wcmVjbGFpbQUCHFZlc3RpbmcBAhgQdmVzdAEBBSh2ZXN0X290aGVyAQAEGHRhcmdldNUDPHZlc3RlZF90cmFuc2ZlcgEACBh0YXJnZXTVAyBzY2hlZHVsZXUEVGZvcmNlX3Zlc3RlZF90cmFuc2ZlcgEADBhzb3VyY2XVAxh0YXJnZXTVAyBzY2hlZHVsZXUEPG1lcmdlX3NjaGVkdWxlcwEACDxzY2hlZHVsZTFfaW5kZXgEPHNjaGVkdWxlMl9pbmRleAR0Zm9yY2VfcmVtb3ZlX3Zlc3Rpbmdfc2NoZWR1bGUBAAgYdGFyZ2V01QM4c2NoZWR1bGVfaW5kZXgEHFV0aWxpdHkBAhgUYmF0Y2gBAAQUY2FsbHN9BDRhc19kZXJpdmF0aXZlAQAIFGluZGV4BBBjYWxs3QYkYmF0Y2hfYWxsAQAEFGNhbGxzfQQsZGlzcGF0Y2hfYXMBAAgkYXNfb3JpZ2lulQMQY2FsbN0GLGZvcmNlX2JhdGNoAQAEFGNhbGxzfQQsd2l0aF93ZWlnaHQBAAgQY2FsbN0GGHdlaWdodBgUUHJveHkBAigUcHJveHkBAAwQcmVhbNUDQGZvcmNlX3Byb3h5X3R5cGWFBBBjYWxs3QYkYWRkX3Byb3h5AQAMIGRlbGVnYXRl1QMocHJveHlfdHlwZekBFGRlbGF5BDByZW1vdmVfcHJveHkBAAwgZGVsZWdhdGXVAyhwcm94eV90eXBl6QEUZGVsYXkEOHJlbW92ZV9wcm94aWVzAQEFLGNyZWF0ZV9wdXJlAQAMKHByb3h5X3R5cGXpARRkZWxheQQUaW5kZXgEJGtpbGxfcHVyZQEAFBxzcGF3bmVy1QMocHJveHlfdHlwZekBFGluZGV4BBhoZWlnaHQEJGV4dF9pbmRleAQgYW5ub3VuY2UBAAgQcmVhbNUDJGNhbGxfaGFzaCBMcmVtb3ZlX2Fubm91bmNlbWVudAEACBByZWFs1QMkY2FsbF9oYXNoIExyZWplY3RfYW5ub3VuY2VtZW50AQAIIGRlbGVnYXRl1QMkY2FsbF9oYXNoIDxwcm94eV9hbm5vdW5jZWQBABAgZGVsZWdhdGXVAxByZWFs1QNAZm9yY2VfcHJveHlfdHlwZYUEEGNhbGzdBiBNdWx0aXNpZwECEFBhc19tdWx0aV90aHJlc2hvbGRfMQEACERvdGhlcl9zaWduYXRvcmllc90DEGNhbGzdBiBhc19tdWx0aQEAFCR0aHJlc2hvbGQERG90aGVyX3NpZ25hdG9yaWVz3QM8bWF5YmVfdGltZXBvaW50jQQQY2FsbN0GKG1heF93ZWlnaHQYQGFwcHJvdmVfYXNfbXVsdGkBABQkdGhyZXNob2xkBERvdGhlcl9zaWduYXRvcmllc90DPG1heWJlX3RpbWVwb2ludI0EJGNhbGxfaGFzaCAobWF4X3dlaWdodBg8Y2FuY2VsX2FzX211bHRpAQAQJHRocmVzaG9sZAREb3RoZXJfc2lnbmF0b3JpZXPdAyR0aW1lcG9pbnTxASRjYWxsX2hhc2ggIEJvdW50aWVzAQIkOHByb3Bvc2VfYm91bnR5AQAIFHZhbHVlCCxkZXNjcmlwdGlvbiQ4YXBwcm92ZV9ib3VudHkBAAQkYm91bnR5X2lkBDxwcm9wb3NlX2N1cmF0b3IBAAwkYm91bnR5X2lkBBxjdXJhdG9y1QMMZmVlCEB1bmFzc2lnbl9jdXJhdG9yAQAEJGJvdW50eV9pZAQ4YWNjZXB0X2N1cmF0b3IBAAQkYm91bnR5X2lkBDBhd2FyZF9ib3VudHkBAAgkYm91bnR5X2lkBCxiZW5lZmljaWFyedUDMGNsYWltX2JvdW50eQEABCRib3VudHlfaWQEMGNsb3NlX2JvdW50eQEABCRib3VudHlfaWQEUGV4dGVuZF9ib3VudHlfZXhwaXJ5AQAIJGJvdW50eV9pZAQYcmVtYXJrJDRDaGlsZEJvdW50aWVzAQIcQGFkZF9jaGlsZF9ib3VudHkBAAxAcGFyZW50X2JvdW50eV9pZAQUdmFsdWUILGRlc2NyaXB0aW9uJDxwcm9wb3NlX2N1cmF0b3IBABBAcGFyZW50X2JvdW50eV9pZAQ8Y2hpbGRfYm91bnR5X2lkBBxjdXJhdG9y1QMMZmVlCDhhY2NlcHRfY3VyYXRvcgEACEBwYXJlbnRfYm91bnR5X2lkBDxjaGlsZF9ib3VudHlfaWQEQHVuYXNzaWduX2N1cmF0b3IBAAhAcGFyZW50X2JvdW50eV9pZAQ8Y2hpbGRfYm91bnR5X2lkBEhhd2FyZF9jaGlsZF9ib3VudHkBAAxAcGFyZW50X2JvdW50eV9pZAQ8Y2hpbGRfYm91bnR5X2lkBCxiZW5lZmljaWFyedUDSGNsYWltX2NoaWxkX2JvdW50eQEACEBwYXJlbnRfYm91bnR5X2lkBDxjaGlsZF9ib3VudHlfaWQESGNsb3NlX2NoaWxkX2JvdW50eQEACEBwYXJlbnRfYm91bnR5X2lkBDxjaGlsZF9ib3VudHlfaWQEaEVsZWN0aW9uUHJvdmlkZXJNdWx0aVBoYXNlAQIUPHN1Ym1pdF91bnNpZ25lZAEACDByYXdfc29sdXRpb25ZBRx3aXRuZXNzXQVsc2V0X21pbmltdW1fdW50cnVzdGVkX3Njb3JlAQAEQG1heWJlX25leHRfc2NvcmVhBXRzZXRfZW1lcmdlbmN5X2VsZWN0aW9uX3Jlc3VsdAEABCBzdXBwb3J0c3UFGHN1Ym1pdAEABDByYXdfc29sdXRpb25ZBUxnb3Zlcm5hbmNlX2ZhbGxiYWNrAQAIQG1heWJlX21heF92b3RlcnMtBERtYXliZV9tYXhfdGFyZ2V0cy0EJFZvdGVyTGlzdAECDBRyZWJhZwEABChkaXNsb2NhdGVk1QM8cHV0X2luX2Zyb250X29mAQAEHGxpZ2h0ZXLVA1RwdXRfaW5fZnJvbnRfb2Zfb3RoZXIBAAgcaGVhdmllctUDHGxpZ2h0ZXLVAzxOb21pbmF0aW9uUG9vbHMBAmgQam9pbgEACBhhbW91bnQIHHBvb2xfaWQEKGJvbmRfZXh0cmEBAAQUZXh0cmGBBTBjbGFpbV9wYXlvdXQBAQUYdW5ib25kAQAIOG1lbWJlcl9hY2NvdW501QNAdW5ib25kaW5nX3BvaW50cwhYcG9vbF93aXRoZHJhd191bmJvbmRlZAEACBxwb29sX2lkBEhudW1fc2xhc2hpbmdfc3BhbnMERHdpdGhkcmF3X3VuYm9uZGVkAQAIOG1lbWJlcl9hY2NvdW501QNIbnVtX3NsYXNoaW5nX3NwYW5zBBhjcmVhdGUBABAYYW1vdW50CBByb2901QMkbm9taW5hdG9y1QMcYm91bmNlctUDTGNyZWF0ZV93aXRoX3Bvb2xfaWQBABQYYW1vdW50CBByb2901QMkbm9taW5hdG9y1QMcYm91bmNlctUDHHBvb2xfaWQEIG5vbWluYXRlAQAIHHBvb2xfaWQEKHZhbGlkYXRvcnPdAyRzZXRfc3RhdGUBAAgccG9vbF9pZAQUc3RhdGUdAjBzZXRfbWV0YWRhdGEBAAgccG9vbF9pZAQgbWV0YWRhdGEkLHNldF9jb25maWdzAQAYNG1pbl9qb2luX2JvbmTtAzxtaW5fY3JlYXRlX2JvbmTtAyRtYXhfcG9vbHPxAyxtYXhfbWVtYmVyc/EDUG1heF9tZW1iZXJzX3Blcl9wb29s8QNUZ2xvYmFsX21heF9jb21taXNzaW9u8QMwdXBkYXRlX3JvbGVzAQAQHHBvb2xfaWQEIG5ld19yb290hQU0bmV3X25vbWluYXRvcoUFLG5ld19ib3VuY2VyhQUUY2hpbGwBAAQccG9vbF9pZARAYm9uZF9leHRyYV9vdGhlcgEACBhtZW1iZXLVAxRleHRyYYEFUHNldF9jbGFpbV9wZXJtaXNzaW9uAQAEKHBlcm1pc3Npb26JBUhjbGFpbV9wYXlvdXRfb3RoZXIBAAQUb3RoZXIAOHNldF9jb21taXNzaW9uAQAIHHBvb2xfaWQEOG5ld19jb21taXNzaW9uJQJIc2V0X2NvbW1pc3Npb25fbWF4AQAIHHBvb2xfaWQEOG1heF9jb21taXNzaW9uBGhzZXRfY29tbWlzc2lvbl9jaGFuZ2VfcmF0ZQEACBxwb29sX2lkBCxjaGFuZ2VfcmF0ZSkCQGNsYWltX2NvbW1pc3Npb24BAAQccG9vbF9pZARMYWRqdXN0X3Bvb2xfZGVwb3NpdAEABBxwb29sX2lkBHxzZXRfY29tbWlzc2lvbl9jbGFpbV9wZXJtaXNzaW9uAQAIHHBvb2xfaWQEKHBlcm1pc3Npb24xAixhcHBseV9zbGFzaAEABDhtZW1iZXJfYWNjb3VudNUDSG1pZ3JhdGVfZGVsZWdhdGlvbgEABDhtZW1iZXJfYWNjb3VudNUDeG1pZ3JhdGVfcG9vbF90b19kZWxlZ2F0ZV9zdGFrZQEABBxwb29sX2lkBCxGYXN0VW5zdGFrZQECDFRyZWdpc3Rlcl9mYXN0X3Vuc3Rha2UBAQUoZGVyZWdpc3RlcgEBBRxjb250cm9sAQAENGVyYXNfdG9fY2hlY2sENENvbmZpZ3VyYXRpb24BAsB8c2V0X3ZhbGlkYXRpb25fdXBncmFkZV9jb29sZG93bgEABAxuZXcEcHNldF92YWxpZGF0aW9uX3VwZ3JhZGVfZGVsYXkBAAQMbmV3BGRzZXRfY29kZV9yZXRlbnRpb25fcGVyaW9kAQAEDG5ldwREc2V0X21heF9jb2RlX3NpemUBAAQMbmV3BEBzZXRfbWF4X3Bvdl9zaXplAQAEDG5ldwRYc2V0X21heF9oZWFkX2RhdGFfc2l6ZQEABAxuZXcESHNldF9jb3JldGltZV9jb3JlcwEABAxuZXcEdHNldF9tYXhfYXZhaWxhYmlsaXR5X3RpbWVvdXRzAQAEDG5ldwRwc2V0X2dyb3VwX3JvdGF0aW9uX2ZyZXF1ZW5jeQEABAxuZXcEdHNldF9wYXJhc19hdmFpbGFiaWxpdHlfcGVyaW9kAQAEDG5ldwRgc2V0X3NjaGVkdWxpbmdfbG9va2FoZWFkAQAEDG5ldwRsc2V0X21heF92YWxpZGF0b3JzX3Blcl9jb3JlAQAEDG5ldy0ESHNldF9tYXhfdmFsaWRhdG9ycwEABAxuZXctBEhzZXRfZGlzcHV0ZV9wZXJpb2QBAAQMbmV3BLRzZXRfZGlzcHV0ZV9wb3N0X2NvbmNsdXNpb25fYWNjZXB0YW5jZV9wZXJpb2QBAAQMbmV3BERzZXRfbm9fc2hvd19zbG90cwEABAxuZXcEUHNldF9uX2RlbGF5X3RyYW5jaGVzAQAEDG5ldwR4c2V0X3plcm90aF9kZWxheV90cmFuY2hlX3dpZHRoAQAEDG5ldwRQc2V0X25lZWRlZF9hcHByb3ZhbHMBAAQMbmV3BHBzZXRfcmVsYXlfdnJmX21vZHVsb19zYW1wbGVzAQAEDG5ldwRoc2V0X21heF91cHdhcmRfcXVldWVfY291bnQBAAQMbmV3BGRzZXRfbWF4X3Vwd2FyZF9xdWV1ZV9zaXplAQAEDG5ldwR0c2V0X21heF9kb3dud2FyZF9tZXNzYWdlX3NpemUBAAQMbmV3BGxzZXRfbWF4X3Vwd2FyZF9tZXNzYWdlX3NpemUBAAQMbmV3BKBzZXRfbWF4X3Vwd2FyZF9tZXNzYWdlX251bV9wZXJfY2FuZGlkYXRlAQAEDG5ldwRkc2V0X2hybXBfb3Blbl9yZXF1ZXN0X3R0bAEABAxuZXcEXHNldF9ocm1wX3NlbmRlcl9kZXBvc2l0AQAEDG5ldwhoc2V0X2hybXBfcmVjaXBpZW50X2RlcG9zaXQBAAQMbmV3CHRzZXRfaHJtcF9jaGFubmVsX21heF9jYXBhY2l0eQEABAxuZXcEfHNldF9ocm1wX2NoYW5uZWxfbWF4X3RvdGFsX3NpemUBAAQMbmV3BJxzZXRfaHJtcF9tYXhfcGFyYWNoYWluX2luYm91bmRfY2hhbm5lbHMBAAQMbmV3BIRzZXRfaHJtcF9jaGFubmVsX21heF9tZXNzYWdlX3NpemUBAAQMbmV3BKBzZXRfaHJtcF9tYXhfcGFyYWNoYWluX291dGJvdW5kX2NoYW5uZWxzAQAEDG5ldwSYc2V0X2hybXBfbWF4X21lc3NhZ2VfbnVtX3Blcl9jYW5kaWRhdGUBAAQMbmV3BEhzZXRfcHZmX3ZvdGluZ190dGwBAAQMbmV3BJBzZXRfbWluaW11bV92YWxpZGF0aW9uX3VwZ3JhZGVfZGVsYXkBAAQMbmV3BHBzZXRfYnlwYXNzX2NvbnNpc3RlbmN5X2NoZWNrAQAEDG5ldxRgc2V0X2FzeW5jX2JhY2tpbmdfcGFyYW1zAQAEDG5ld5UFTHNldF9leGVjdXRvcl9wYXJhbXMBAAQMbmV3pQVYc2V0X29uX2RlbWFuZF9iYXNlX2ZlZQEABAxuZXcIdHNldF9vbl9kZW1hbmRfZmVlX3ZhcmlhYmlsaXR5AQAEDG5ldwRwc2V0X29uX2RlbWFuZF9xdWV1ZV9tYXhfc2l6ZQEABAxuZXcEmHNldF9vbl9kZW1hbmRfdGFyZ2V0X3F1ZXVlX3V0aWxpemF0aW9uAQAEDG5ldwREc2V0X29uX2RlbWFuZF90dGwBAAQMbmV3BGRzZXRfbWluaW11bV9iYWNraW5nX3ZvdGVzAQAEDG5ldwRAc2V0X25vZGVfZmVhdHVyZQEACBRpbmRleAQUdmFsdWUUaHNldF9hcHByb3ZhbF92b3RpbmdfcGFyYW1zAQAEDG5ldwRQc2V0X3NjaGVkdWxlcl9wYXJhbXMBAAQMbmV3qQUsUGFyYXNTaGFyZWQBAQU0UGFyYUluY2x1c2lvbgEBBTBQYXJhSW5oZXJlbnQBAgQUZW50ZXIBAAQQZGF0Yf0FFFBhcmFzAQIkWGZvcmNlX3NldF9jdXJyZW50X2NvZGUBAAgQcGFyYQQgbmV3X2NvZGUkWGZvcmNlX3NldF9jdXJyZW50X2hlYWQBAAgQcGFyYQQgbmV3X2hlYWQkbGZvcmNlX3NjaGVkdWxlX2NvZGVfdXBncmFkZQEADBBwYXJhBCBuZXdfY29kZSRMcmVsYXlfcGFyZW50X251bWJlcgRMZm9yY2Vfbm90ZV9uZXdfaGVhZAEACBBwYXJhBCBuZXdfaGVhZCRIZm9yY2VfcXVldWVfYWN0aW9uAQAEEHBhcmEEbGFkZF90cnVzdGVkX3ZhbGlkYXRpb25fY29kZQEABDx2YWxpZGF0aW9uX2NvZGUkbHBva2VfdW51c2VkX3ZhbGlkYXRpb25fY29kZQEABFB2YWxpZGF0aW9uX2NvZGVfaGFzaCBsaW5jbHVkZV9wdmZfY2hlY2tfc3RhdGVtZW50AQAIEHN0bXQFBiRzaWduYXR1cmVBAnRmb3JjZV9zZXRfbW9zdF9yZWNlbnRfY29udGV4dAEACBBwYXJhBBxjb250ZXh0BCxJbml0aWFsaXplcgECBDRmb3JjZV9hcHByb3ZlAQAEFHVwX3RvBBBIcm1wAQIsWGhybXBfaW5pdF9vcGVuX2NoYW5uZWwBAAwkcmVjaXBpZW50BFRwcm9wb3NlZF9tYXhfY2FwYWNpdHkEZHByb3Bvc2VkX21heF9tZXNzYWdlX3NpemUEYGhybXBfYWNjZXB0X29wZW5fY2hhbm5lbAEABBhzZW5kZXIESGhybXBfY2xvc2VfY2hhbm5lbAEABChjaGFubmVsX2lkVQJAZm9yY2VfY2xlYW5faHJtcAEADBBwYXJhBCxudW1faW5ib3VuZAQwbnVtX291dGJvdW5kBFxmb3JjZV9wcm9jZXNzX2hybXBfb3BlbgEABCBjaGFubmVscwRgZm9yY2VfcHJvY2Vzc19ocm1wX2Nsb3NlAQAEIGNoYW5uZWxzBGBocm1wX2NhbmNlbF9vcGVuX3JlcXVlc3QBAAgoY2hhbm5lbF9pZFUCNG9wZW5fcmVxdWVzdHMEXGZvcmNlX29wZW5faHJtcF9jaGFubmVsAQAQGHNlbmRlcgQkcmVjaXBpZW50BDBtYXhfY2FwYWNpdHkEQG1heF9tZXNzYWdlX3NpemUEYGVzdGFibGlzaF9zeXN0ZW1fY2hhbm5lbAEACBhzZW5kZXIEJHJlY2lwaWVudARUcG9rZV9jaGFubmVsX2RlcG9zaXRzAQAIGHNlbmRlcgQkcmVjaXBpZW50BHRlc3RhYmxpc2hfY2hhbm5lbF93aXRoX3N5c3RlbQEABEx0YXJnZXRfc3lzdGVtX2NoYWluBDRQYXJhc0Rpc3B1dGVzAQIEOGZvcmNlX3VuZnJlZXplAQEFNFBhcmFzU2xhc2hpbmcBAgRwcmVwb3J0X2Rpc3B1dGVfbG9zdF91bnNpZ25lZAEACDRkaXNwdXRlX3Byb29mIQY8a2V5X293bmVyX3Byb29mvQMgT25EZW1hbmQBAghccGxhY2Vfb3JkZXJfYWxsb3dfZGVhdGgBAAgobWF4X2Ftb3VudAgccGFyYV9pZARYcGxhY2Vfb3JkZXJfa2VlcF9hbGl2ZQEACChtYXhfYW1vdW50CBxwYXJhX2lkBCRSZWdpc3RyYXIBAiQgcmVnaXN0ZXIBAAwIaWQEMGdlbmVzaXNfaGVhZCQ8dmFsaWRhdGlvbl9jb2RlJDhmb3JjZV9yZWdpc3RlcgEAFAx3aG8AHGRlcG9zaXQICGlkBDBnZW5lc2lzX2hlYWQkPHZhbGlkYXRpb25fY29kZSQoZGVyZWdpc3RlcgEABAhpZAQQc3dhcAEACAhpZAQUb3RoZXIELHJlbW92ZV9sb2NrAQAEEHBhcmEEHHJlc2VydmUBAQUgYWRkX2xvY2sBAAQQcGFyYQRUc2NoZWR1bGVfY29kZV91cGdyYWRlAQAIEHBhcmEEIG5ld19jb2RlJEBzZXRfY3VycmVudF9oZWFkAQAIEHBhcmEEIG5ld19oZWFkJBRTbG90cwECDCxmb3JjZV9sZWFzZQEAFBBwYXJhBBhsZWFzZXIAGGFtb3VudAgwcGVyaW9kX2JlZ2luBDBwZXJpb2RfY291bnQEQGNsZWFyX2FsbF9sZWFzZXMBAAQQcGFyYQQ8dHJpZ2dlcl9vbmJvYXJkAQAEEHBhcmEEIEF1Y3Rpb25zAQIMLG5ld19hdWN0aW9uAQAIIGR1cmF0aW9uBEhsZWFzZV9wZXJpb2RfaW5kZXgEDGJpZAEAFBBwYXJhBDRhdWN0aW9uX2luZGV4BChmaXJzdF9zbG90BCRsYXN0X3Nsb3QEGGFtb3VudAg4Y2FuY2VsX2F1Y3Rpb24BAQUkQ3Jvd2Rsb2FuAQIkGGNyZWF0ZQEAGBRpbmRleAQMY2FwCDBmaXJzdF9wZXJpb2QELGxhc3RfcGVyaW9kBAxlbmQEIHZlcmlmaWVyPQYoY29udHJpYnV0ZQEADBRpbmRleAQUdmFsdWUIJHNpZ25hdHVyZUUGIHdpdGhkcmF3AQAIDHdobwAUaW5kZXgEGHJlZnVuZAEABBRpbmRleAQgZGlzc29sdmUBAAQUaW5kZXgEEGVkaXQBABgUaW5kZXgEDGNhcAgwZmlyc3RfcGVyaW9kBCxsYXN0X3BlcmlvZAQMZW5kBCB2ZXJpZmllcj0GIGFkZF9tZW1vAQAIFGluZGV4BBBtZW1vJBBwb2tlAQAEFGluZGV4BDhjb250cmlidXRlX2FsbAEACBRpbmRleAQkc2lnbmF0dXJlRQYgQ29yZXRpbWUBAgxIcmVxdWVzdF9jb3JlX2NvdW50AQAEFGNvdW50BEhyZXF1ZXN0X3JldmVudWVfYXQBAAQQd2hlbgQsYXNzaWduX2NvcmUBABAQY29yZQQUYmVnaW4EKGFzc2lnbm1lbnRVBiBlbmRfaGludC0ESFN0YXRlVHJpZU1pZ3JhdGlvbgECGFhjb250cm9sX2F1dG9fbWlncmF0aW9uAQAEMG1heWJlX2NvbmZpZ2EGQGNvbnRpbnVlX21pZ3JhdGUBAAwYbGltaXRzXQY8cmVhbF9zaXplX3VwcGVyBDB3aXRuZXNzX3Rhc2tpBkhtaWdyYXRlX2N1c3RvbV90b3ABAAgQa2V5c30DMHdpdG5lc3Nfc2l6ZQRQbWlncmF0ZV9jdXN0b21fY2hpbGQBAAwQcm9vdCQoY2hpbGRfa2V5c30DKHRvdGFsX3NpemUEVHNldF9zaWduZWRfbWF4X2xpbWl0cwEABBhsaW1pdHNdBkhmb3JjZV9zZXRfcHJvZ3Jlc3MBAAgwcHJvZ3Jlc3NfdG9wZQY4cHJvZ3Jlc3NfY2hpbGRlBiRYY21QYWxsZXQBAjgQc2VuZAEACBBkZXN0mQEcbWVzc2FnZakGPHRlbGVwb3J0X2Fzc2V0cwEAEBBkZXN0mQEsYmVuZWZpY2lhcnmZARhhc3NldHMZAzhmZWVfYXNzZXRfaXRlbQRccmVzZXJ2ZV90cmFuc2Zlcl9hc3NldHMBABAQZGVzdJkBLGJlbmVmaWNpYXJ5mQEYYXNzZXRzGQM4ZmVlX2Fzc2V0X2l0ZW0EHGV4ZWN1dGUBAAgcbWVzc2FnZakGKG1heF93ZWlnaHQYRGZvcmNlX3hjbV92ZXJzaW9uAQAIIGxvY2F0aW9ueQEcdmVyc2lvbgRkZm9yY2VfZGVmYXVsdF94Y21fdmVyc2lvbgEABERtYXliZV94Y21fdmVyc2lvbi0EeGZvcmNlX3N1YnNjcmliZV92ZXJzaW9uX25vdGlmeQEABCBsb2NhdGlvbpkBgGZvcmNlX3Vuc3Vic2NyaWJlX3ZlcnNpb25fbm90aWZ5AQAEIGxvY2F0aW9umQF8bGltaXRlZF9yZXNlcnZlX3RyYW5zZmVyX2Fzc2V0cwEAFBBkZXN0mQEsYmVuZWZpY2lhcnmZARhhc3NldHMZAzhmZWVfYXNzZXRfaXRlbQQwd2VpZ2h0X2xpbWl08QJcbGltaXRlZF90ZWxlcG9ydF9hc3NldHMBABQQZGVzdJkBLGJlbmVmaWNpYXJ5mQEYYXNzZXRzGQM4ZmVlX2Fzc2V0X2l0ZW0EMHdlaWdodF9saW1pdPECQGZvcmNlX3N1c3BlbnNpb24BAAQkc3VzcGVuZGVkFDx0cmFuc2Zlcl9hc3NldHMBABQQZGVzdJkBLGJlbmVmaWNpYXJ5mQEYYXNzZXRzGQM4ZmVlX2Fzc2V0X2l0ZW0EMHdlaWdodF9saW1pdPECMGNsYWltX2Fzc2V0cwEACBhhc3NldHMZAyxiZW5lZmljaWFyeZkBjHRyYW5zZmVyX2Fzc2V0c191c2luZ190eXBlX2FuZF90aGVuAQAcEGRlc3SZARhhc3NldHMZA1Bhc3NldHNfdHJhbnNmZXJfdHlwZa0GOHJlbW90ZV9mZWVzX2lksQZIZmVlc190cmFuc2Zlcl90eXBlrQZIY3VzdG9tX3hjbV9vbl9kZXN0qQYwd2VpZ2h0X2xpbWl08QIwTWVzc2FnZVF1ZXVlAQIIJHJlYXBfcGFnZQEACDhtZXNzYWdlX29yaWdpbiUDKHBhZ2VfaW5kZXgESGV4ZWN1dGVfb3ZlcndlaWdodAEAEDhtZXNzYWdlX29yaWdpbiUDEHBhZ2UEFGluZGV4BDB3ZWlnaHRfbGltaXQYJEFzc2V0UmF0ZQECDBhjcmVhdGUBAAgoYXNzZXRfa2luZIEBEHJhdGUIGHVwZGF0ZQEACChhc3NldF9raW5kgQEQcmF0ZQgYcmVtb3ZlAQAEKGFzc2V0X2tpbmSBARRCZWVmeQECDExyZXBvcnRfZXF1aXZvY2F0aW9uAQAISGVxdWl2b2NhdGlvbl9wcm9vZtUGPGtleV9vd25lcl9wcm9vZr0DcHJlcG9ydF9lcXVpdm9jYXRpb25fdW5zaWduZWQBAAhIZXF1aXZvY2F0aW9uX3Byb29m1QY8a2V5X293bmVyX3Byb29mvQM8c2V0X25ld19nZW5lc2lzAQAEPGRlbGF5X2luX2Jsb2NrcwQGZQUCCCxVbnJlcXVlc3RlZAEACBxkZXBvc2l0ZQUMbGVuBCRSZXF1ZXN0ZWQBAAwcZGVwb3NpdOEGFGNvdW50BAxsZW4tBAIILFVucmVxdWVzdGVkAQAIGHRpY2tldGUFDGxlbgQkUmVxdWVzdGVkAQAMMG1heWJlX3RpY2tldOEGFGNvdW50BCRtYXliZV9sZW4tBAMIIAQACChwcmVfb3V0cHV0IBRwcm9vZkECAAw8YXV0aG9yaXR5X2luZGV4BBBzbG90CDR2cmZfc2lnbmF0dXJl8QYACDxhdXRob3JpdHlfaW5kZXgEEHNsb3QIAgwcUHJpbWFyeQEADDxhdXRob3JpdHlfaW5kZXgEEHNsb3QINHZyZl9zaWduYXR1cmXxBjhTZWNvbmRhcnlQbGFpbgEACDxhdXRob3JpdHlfaW5kZXgEEHNsb3QIMFNlY29uZGFyeVZSRgEADDxhdXRob3JpdHlfaW5kZXgEEHNsb3QINHZyZl9zaWduYXR1cmXxBgb9BgAIBGPBAzRhbGxvd2VkX3Nsb3RzxQMDCAgEBAkHAAMMAAgUAgwMRmVlAQEFEE1pc2MBAQUMQWxsAQEFAAwIaWSRAhhhbW91bnQIHHJlYXNvbnMVBwQZBwAACAhpZJECGGFtb3VudAgEIQcAAgQgUHJlaW1hZ2UBAQUCBDxTbGFzaEZvck1pZ3JhdGUBAQUCCCBQcmVpbWFnZQECBCBQcmVpbWFnZQEBBUhTdGF0ZVRyaWVNaWdyYXRpb24BAgQ8U2xhc2hGb3JNaWdyYXRlAQEFAAgIaWQxBxhhbW91bnQIBDUHAAIEOFBvb2xNaW5CYWxhbmNlAQEFAgQ8Tm9taW5hdGlvblBvb2xzAQIEOFBvb2xNaW5CYWxhbmNlAQEFAAgIaWRBBxhhbW91bnQIBEUHAAIIJFYxQW5jaWVudAEBBQhWMgEBBQAUFHN0YXNoABR0b3RhbAgYYWN0aXZlCCR1bmxvY2tpbmf9A1hsZWdhY3lfY2xhaW1lZF9yZXdhcmRzOQIADBx0YXJnZXRz3QMwc3VibWl0dGVkX2luBChzdXBwcmVzc2VkFAAIFGluZGV4BBRzdGFydPUDAAgMd2hvABR2YWx1ZQgEXQcAAAwUdG90YWwIDG93bggYb3RoZXJzYQcAEBR0b3RhbAgMb3duCDxub21pbmF0b3JfY291bnQEKHBhZ2VfY291bnQEAwwEAAQACChwYWdlX3RvdGFsCBhvdGhlcnNhBwMIAAQEdQcAAAgUdG90YWwEKGluZGl2aWR1YWx5BwAUJHZhbGlkYXRvcgAMb3duCBhvdGhlcnNpBSRyZXBvcnRlcnPdAxhwYXlvdXQIBIEHAAMIBAgAEChzcGFuX2luZGV4BChsYXN0X3N0YXJ0BEhsYXN0X25vbnplcm9fc2xhc2gEFHByaW9yOQIACBxzbGFzaGVkCCBwYWlkX291dAgDCABlBwAIIG9mZmVuZGVylQckcmVwb3J0ZXJz3QMDCEUBJAMIAA0EBKEHAAMIKCQCEBBMaXZlAQEFMFBlbmRpbmdQYXVzZQEACDBzY2hlZHVsZWRfYXQEFGRlbGF5BBhQYXVzZWQBAQU0UGVuZGluZ1Jlc3VtZQEACDBzY2hlZHVsZWRfYXQEFGRlbGF5BAAQMHNjaGVkdWxlZF9hdAQUZGVsYXkEQG5leHRfYXV0aG9yaXRpZXNVARhmb3JjZWQtBAAQIHByb3Bvc2VyABR2YWx1ZQgsYmVuZWZpY2lhcnkAEGJvbmQIAgwcUGVuZGluZwEBBSRBdHRlbXB0ZWQBAAQIaWQIGEZhaWxlZAEBBQAYKGFzc2V0X2tpbmSBARhhbW91bnQILGJlbmVmaWNpYXJ5mQEodmFsaWRfZnJvbQQkZXhwaXJlX2F0BBhzdGF0dXO5BwMIBDUEBMEHAAAIFHZvdGVzCBxjYXBpdGFsCAAMFHZvdGVzxQcsZGVsZWdhdGlvbnPJBxRwcmlvcokHABQcYmFsYW5jZQgYdGFyZ2V0AChjb252aWN0aW9uOQQsZGVsZWdhdGlvbnPJBxRwcmlvcokHAggcQ2FzdGluZwEADBR2b3Rlc8UHLGRlbGVnYXRpb25zyQcUcHJpb3KJByhEZWxlZ2F0aW5nAQAUHGJhbGFuY2UIGHRhcmdldAAoY29udmljdGlvbjkELGRlbGVnYXRpb25zyQcUcHJpb3KJBwSJBwAACAx3aG8AGGFtb3VudAgG3QcACBRzaW5jZQQoY29uZmlybWluZy0EBuUHAwgEDQEG7QcALBR0cmFjawQYb3JpZ2lulQMgcHJvcG9zYWylASRlbmFjdG1lbnRBBCRzdWJtaXR0ZWQESHN1Ym1pc3Npb25fZGVwb3NpdN0HQGRlY2lzaW9uX2RlcG9zaXThByBkZWNpZGluZ+kHFHRhbGx5qQEgaW5fcXVldWUUFGFsYXJt8QcCGBxPbmdvaW5nAQAsFHRyYWNrBBhvcmlnaW6VAyBwcm9wb3NhbKUBJGVuYWN0bWVudEEEJHN1Ym1pdHRlZARIc3VibWlzc2lvbl9kZXBvc2l03QdAZGVjaXNpb25fZGVwb3NpdOEHIGRlY2lkaW5n6QcUdGFsbHmpASBpbl9xdWV1ZRQUYWxhcm3xByBBcHByb3ZlZAEDDAThB+EHIFJlamVjdGVkAQMMBOEH4QckQ2FuY2VsbGVkAQMMBOEH4QcgVGltZWRPdXQBAwwE4QfhBxhLaWxsZWQBAQICDEBMaW5lYXJEZWNyZWFzaW5nAQAMGGxlbmd0aAQUZmxvb3IEEGNlaWwERFN0ZXBwZWREZWNyZWFzaW5nAQAQFGJlZ2luBAxlbmQEEHN0ZXAEGHBlcmlvZAQoUmVjaXByb2NhbAEADBhmYWN0b3IIIHhfb2Zmc2V0CCB5X29mZnNldAgAJBBuYW1lSQMwbWF4X2RlY2lkaW5nBEBkZWNpc2lvbl9kZXBvc2l0CDhwcmVwYXJlX3BlcmlvZAQ8ZGVjaXNpb25fcGVyaW9kBDhjb25maXJtX3BlcmlvZARQbWluX2VuYWN0bWVudF9wZXJpb2QEMG1pbl9hcHByb3ZhbP0HLG1pbl9zdXBwb3J0/QcDCAQBCAQFCAAEdQQAAggIVjABAQUIVjEBAQUADCBkZWxlZ2F0ZQAocHJveHlfdHlwZekBFGRlbGF5BAQVCAADCBkICAAMEHJlYWwAJGNhbGxfaGFzaCAYaGVpZ2h0BAQhCAADCCUICAMIACAAEBB3aGVu8QEcZGVwb3NpdAgkZGVwb3NpdG9yACRhcHByb3ZhbHPdAwIYIFByb3Bvc2VkAQEFIEFwcHJvdmVkAQEFGEZ1bmRlZAEBBTxDdXJhdG9yUHJvcG9zZWQBAAQcY3VyYXRvcgAYQWN0aXZlAQAIHGN1cmF0b3IAKHVwZGF0ZV9kdWUENFBlbmRpbmdQYXlvdXQBAAwcY3VyYXRvcgAsYmVuZWZpY2lhcnkAJHVubG9ja19hdAQAGCBwcm9wb3NlcgAUdmFsdWUIDGZlZQg8Y3VyYXRvcl9kZXBvc2l0CBBib25kCBhzdGF0dXM1CAIQFEFkZGVkAQEFPEN1cmF0b3JQcm9wb3NlZAEABBxjdXJhdG9yABhBY3RpdmUBAAQcY3VyYXRvcgA0UGVuZGluZ1BheW91dAEADBxjdXJhdG9yACxiZW5lZmljaWFyeQAkdW5sb2NrX2F0BAAUNHBhcmVudF9ib3VudHkEFHZhbHVlCAxmZWUIPGN1cmF0b3JfZGVwb3NpdAgYc3RhdHVzPQgADCBzdXBwb3J0c3UFFHNjb3JlCQIcY29tcHV0ZQECAwwACN0DBEkIAAAIGHZvdGVyc00IHHRhcmdldHPdAwMMCQIEBARVCAAAEAx3aG8AHGRlcG9zaXQIMHJhd19zb2x1dGlvblkFIGNhbGxfZmVlCAAUCGlkABBwcmV2BQIQbmV4dAUCJGJhZ191cHBlcggUc2NvcmUIAAgQaGVhZAUCEHRhaWwFAgQIAAAQHHBvb2xfaWQEGHBvaW50cwhwbGFzdF9yZWNvcmRlZF9yZXdhcmRfY291bnRlcgg4dW5ib25kaW5nX2VyYXPZBwYpAgAUHGN1cnJlbnQlAgxtYXgtBCxjaGFuZ2VfcmF0ZXEINHRocm90dGxlX2Zyb20tBEBjbGFpbV9wZXJtaXNzaW9uMQIAECRkZXBvc2l0b3IAEHJvb3QFAiRub21pbmF0b3IFAhxib3VuY2VyBQIAFChjb21taXNzaW9udQg4bWVtYmVyX2NvdW50ZXIEGHBvaW50cwgUcm9sZXN5CBRzdGF0ZR0CABRwbGFzdF9yZWNvcmRlZF9yZXdhcmRfY291bnRlcghsbGFzdF9yZWNvcmRlZF90b3RhbF9wYXlvdXRzCFR0b3RhbF9yZXdhcmRzX2NsYWltZWQIYHRvdGFsX2NvbW1pc3Npb25fcGVuZGluZwhgdG90YWxfY29tbWlzc2lvbl9jbGFpbWVkCAAIGHBvaW50cwgcYmFsYW5jZQgDCASFCASJCAAACBhub19lcmGFCCB3aXRoX2VyYY0IAAgcc3Rhc2hlc2kFHGNoZWNrZWQ5AgCMNG1heF9jb2RlX3NpemUESG1heF9oZWFkX2RhdGFfc2l6ZQRYbWF4X3Vwd2FyZF9xdWV1ZV9jb3VudARUbWF4X3Vwd2FyZF9xdWV1ZV9zaXplBFxtYXhfdXB3YXJkX21lc3NhZ2Vfc2l6ZQSQbWF4X3Vwd2FyZF9tZXNzYWdlX251bV9wZXJfY2FuZGlkYXRlBIhocm1wX21heF9tZXNzYWdlX251bV9wZXJfY2FuZGlkYXRlBGx2YWxpZGF0aW9uX3VwZ3JhZGVfY29vbGRvd24EYHZhbGlkYXRpb25fdXBncmFkZV9kZWxheQRQYXN5bmNfYmFja2luZ19wYXJhbXOVBTBtYXhfcG92X3NpemUEZG1heF9kb3dud2FyZF9tZXNzYWdlX3NpemUEkGhybXBfbWF4X3BhcmFjaGFpbl9vdXRib3VuZF9jaGFubmVscwRMaHJtcF9zZW5kZXJfZGVwb3NpdAhYaHJtcF9yZWNpcGllbnRfZGVwb3NpdAhkaHJtcF9jaGFubmVsX21heF9jYXBhY2l0eQRsaHJtcF9jaGFubmVsX21heF90b3RhbF9zaXplBIxocm1wX21heF9wYXJhY2hhaW5faW5ib3VuZF9jaGFubmVscwR0aHJtcF9jaGFubmVsX21heF9tZXNzYWdlX3NpemUEPGV4ZWN1dG9yX3BhcmFtc6UFVGNvZGVfcmV0ZW50aW9uX3BlcmlvZAQ4bWF4X3ZhbGlkYXRvcnMtBDhkaXNwdXRlX3BlcmlvZASkZGlzcHV0ZV9wb3N0X2NvbmNsdXNpb25fYWNjZXB0YW5jZV9wZXJpb2QENG5vX3Nob3dfc2xvdHMEQG5fZGVsYXlfdHJhbmNoZXMEaHplcm90aF9kZWxheV90cmFuY2hlX3dpZHRoBEBuZWVkZWRfYXBwcm92YWxzBGByZWxheV92cmZfbW9kdWxvX3NhbXBsZXMEOHB2Zl92b3RpbmdfdHRsBIBtaW5pbXVtX3ZhbGlkYXRpb25fdXBncmFkZV9kZWxheQRUbWluaW11bV9iYWNraW5nX3ZvdGVzBDRub2RlX2ZlYXR1cmVzsQVYYXBwcm92YWxfdm90aW5nX3BhcmFtcwRAc2NoZWR1bGVyX3BhcmFtc6kFAwgEmQgEnQgABCABCASlCAAACBhidWZmZXKpCDRsYXRlc3RfbnVtYmVyBAAkEGNvcmUEEGhhc2ggKGRlc2NyaXB0b3JFAixjb21taXRtZW50c8kFSGF2YWlsYWJpbGl0eV92b3Rlc7EFHGJhY2tlcnOxBUxyZWxheV9wYXJlbnRfbnVtYmVyBEBiYWNrZWRfaW5fbnVtYmVyBDRiYWNraW5nX2dyb3VwBASxCAADCATRBQS5CAADCEkCvQgEwQgAAAwcc2Vzc2lvbgSAYmFja2luZ192YWxpZGF0b3JzX3Blcl9jYW5kaWRhdGXFCCBkaXNwdXRlc/kFBDkCAAIIEFBvb2wBAAgccGFyYV9pZAQoY29yZV9pbmRleAQQQnVsawEBAgAMKGFzc2lnbm1lbnTRCFRhdmFpbGFiaWxpdHlfdGltZW91dHMEDHR0bAQCCBBGcmVlAQEFFFBhcmFzAQAMKGFzc2lnbm1lbnTRCFRhdmFpbGFiaWxpdHlfdGltZW91dHMEDHR0bAQE2QgABNUIAAMIBOEIBOUIAAIIQFNldEdvQWhlYWRTaWduYWwBAQVQQXBwbHlBdEV4cGVjdGVkQmxvY2sBAQUCCChPbmJvYXJkaW5nAQECHFVwZ3JhZGUBAAwIaWQELGluY2x1ZGVkX2F0BEB1cGdyYWRlX3N0cmF0ZWd57QgE8QgAABQwdm90ZXNfYWNjZXB0sQUwdm90ZXNfcmVqZWN0sQUMYWdlBChjcmVhdGVkX2F0BBhjYXVzZXP1CAIcKE9uYm9hcmRpbmcBAQUoUGFyYXRocmVhZAEBBSRQYXJhY2hhaW4BAQVMVXBncmFkaW5nUGFyYXRocmVhZAEBBVBEb3duZ3JhZGluZ1BhcmFjaGFpbgEBBVRPZmZib2FyZGluZ1BhcmF0aHJlYWQBAQVQT2ZmYm9hcmRpbmdQYXJhY2hhaW4BAQUACCxleHBlY3RlZF9hdAQwYWN0aXZhdGVkX2F0BAQBCQAACDR1cGdyYWRlX3RpbWVzBQksbGFzdF9wcnVuZWQtBAIIFEFib3J0AQEFHEdvQWhlYWQBAQUCBBxQcmVzZW50AQEFAAwwZ2VuZXNpc19oZWFkJDx2YWxpZGF0aW9uX2NvZGUkJHBhcmFfa2luZBQADCh2YWxpZGF0b3JzOQMYcXVldWVkOQM0c2Vzc2lvbl9pbmRleAQEGQkAAAgcc2VudF9hdAQMbXNnJAQhCQAAGCRjb25maXJtZWQUEF9hZ2UEOHNlbmRlcl9kZXBvc2l0CEBtYXhfbWVzc2FnZV9zaXplBDBtYXhfY2FwYWNpdHkEOG1heF90b3RhbF9zaXplBARVAgAAIDBtYXhfY2FwYWNpdHkEOG1heF90b3RhbF9zaXplBEBtYXhfbWVzc2FnZV9zaXplBCRtc2dfY291bnQEKHRvdGFsX3NpemUEIG1xY19oZWFkEQE4c2VuZGVyX2RlcG9zaXQIRHJlY2lwaWVudF9kZXBvc2l0CAAIHHNlbnRfYXQEEGRhdGEkBDUJAAMIBDkCBD0JAAA0YGFjdGl2ZV92YWxpZGF0b3JfaW5kaWNlczkCLHJhbmRvbV9zZWVkIDhkaXNwdXRlX3BlcmlvZAQodmFsaWRhdG9yczkDOGRpc2NvdmVyeV9rZXlzOQM8YXNzaWdubWVudF9rZXlzOQNAdmFsaWRhdG9yX2dyb3Vwc80IHG5fY29yZXMEaHplcm90aF9kZWxheV90cmFuY2hlX3dpZHRoBGByZWxheV92cmZfbW9kdWxvX3NhbXBsZXMEQG5fZGVsYXlfdHJhbmNoZXMENG5vX3Nob3dfc2xvdHMEQG5lZWRlZF9hcHByb3ZhbHMEAwgEIAAQOHZhbGlkYXRvcnNfZm9ysQVIdmFsaWRhdG9yc19hZ2FpbnN0sQUUc3RhcnQEMGNvbmNsdWRlZF9hdC0EBEkJAAAIEGtleXNRCRBraW5kHQYACChjb3JlX2luZGV4BBRjb3VudAQAEBx0cmFmZmljCChuZXh0X2luZGV4BDhzbWFsbGVzdF9pbmRleAQ0ZnJlZWRfaW5kaWNlczkCAAgccGFyYV9pZAQMaWR4BARhCQAADCxhc3NpZ25tZW50c1UGIGVuZF9oaW50LQQ0bmV4dF9zY2hlZHVsZS0EAAgUZmlyc3QEEGxhc3QEBm0JAAgUcmF0aW8EJHJlbWFpbmluZwQDCE0GdQkEeQkAABAsYXNzaWdubWVudHN9CSBlbmRfaGludC0EDHBvcwQQc3RlcAQGgQkACBRxdWV1ZXEJMGN1cnJlbnRfd29ya4UJAAwcbWFuYWdlcgAcZGVwb3NpdAgYbG9ja2VkTQQE4QYAAwwABAgGlQkEmQkBkAIMFE5ldmVyAQEFJFByZUVuZGluZwEBAhhFbmRpbmcBAQIAKCRkZXBvc2l0b3IAIHZlcmlmaWVyPQYcZGVwb3NpdAgYcmFpc2VkCAxlbmQEDGNhcAhEbGFzdF9jb250cmlidXRpb26hCTBmaXJzdF9wZXJpb2QELGxhc3RfcGVyaW9kBChmdW5kX2luZGV4BAaZAQbBBgIMCFYyAQIQEE51bGwBAQUYQXNzZXRzAQQJAwA8RXhlY3V0aW9uUmVzdWx0AQZ1BhxWZXJzaW9uAQECCFYzAQIYEE51bGwBAQUYQXNzZXRzAQQRAwA8RXhlY3V0aW9uUmVzdWx0AQalAhxWZXJzaW9uAQECLFBhbGxldHNJbmZvAQStAgA4RGlzcGF0Y2hSZXN1bHQBAgwcU3VjY2VzcwEBBRRFcnJvcgEFADhUcnVuY2F0ZWRFcnJvcgEFAAhWNAECGBBOdWxsAQEFGEFzc2V0cwEEnQIAPEV4ZWN1dGlvblJlc3VsdAEGpQIcVmVyc2lvbgEBAixQYWxsZXRzSW5mbwEErQIAOERpc3BhdGNoUmVzdWx0AQIMHFN1Y2Nlc3MBAQUURXJyb3IBBQA4VHJ1bmNhdGVkRXJyb3IBBQACDBxQZW5kaW5nAQAQJHJlc3BvbmRlcpkBTG1heWJlX21hdGNoX3F1ZXJpZXKpCTBtYXliZV9ub3RpZnmtCRx0aW1lb3V0BDxWZXJzaW9uTm90aWZpZXIBAAgYb3JpZ2lumQEkaXNfYWN0aXZlFBRSZWFkeQEACCByZXNwb25zZbEJCGF0BAMIBJkBAwwIGAQDCJkBBATBCQACEFxNaWdyYXRlU3VwcG9ydGVkVmVyc2lvbgEBBVxNaWdyYXRlVmVyc2lvbk5vdGlmaWVycwEBBVBOb3RpZnlDdXJyZW50VGFyZ2V0cwEGJGhNaWdyYXRlQW5kTm90aWZ5T2xkVGFyZ2V0cwEBBQMMBACxBgMIFQEIBNEJAAAQGGFtb3VudAgUb3duZXKZARhsb2NrZXKZASRjb25zdW1lcnPVCQMICJkBBN0JAAAIEHByZXYlAxBuZXh0JQMG5QkAGBRiZWdpbgQMZW5kBBRjb3VudARAcmVhZHlfbmVpZ2hib3Vyc+kJNG1lc3NhZ2VfY291bnQIEHNpemUIAwglAwQAGCRyZW1haW5pbmcEOHJlbWFpbmluZ19zaXplBCxmaXJzdF9pbmRleAQUZmlyc3QEEGxhc3QEEGhlYXAkBAkEAAAMCGlkCAxsZW4ERGtleXNldF9jb21taXRtZW50IAAIJGluZmxhdGlvbggkbmV4dF9taW50wQMACBhoZWFkZXK1AyhleHRyaW5zaWNzfQMCCDRBbGxFeHRyaW5zaWNzAQEFNE9ubHlJbmhlcmVudHMBAQUCLBBDYWxsAQEFHFBheW1lbnQBAQUYRnV0dXJlAQEFFFN0YWxlAQEFIEJhZFByb29mAQEFREFuY2llbnRCaXJ0aEJsb2NrAQEFREV4aGF1c3RzUmVzb3VyY2VzAQEFGEN1c3RvbQEBAjBCYWRNYW5kYXRvcnkBAQVMTWFuZGF0b3J5VmFsaWRhdGlvbgEBBSRCYWRTaWduZXIBAQUCDDBDYW5ub3RMb29rdXABAQVMTm9VbnNpZ25lZFZhbGlkYXRvcgEBBRhDdXN0b20BAQICCBxJbnZhbGlkAQIsEENhbGwBAQUcUGF5bWVudAEBBRhGdXR1cmUBAQUUU3RhbGUBAQUgQmFkUHJvb2YBAQVEQW5jaWVudEJpcnRoQmxvY2sBAQVERXhoYXVzdHNSZXNvdXJjZXMBAQUYQ3VzdG9tAQECMEJhZE1hbmRhdG9yeQEBBUxNYW5kYXRvcnlWYWxpZGF0aW9uAQEFJEJhZFNpZ25lcgEBBRxVbmtub3duAQIMMENhbm5vdExvb2t1cAEBBUxOb1Vuc2lnbmVkVmFsaWRhdG9yAQEFGEN1c3RvbQEBAgcZARUKAwiRAiQEHQoAAAwQb2theRQsZmF0YWxfZXJyb3IUGGVycm9ycyEKAgwcSW5CbG9jawEBBRRMb2NhbAEBBSBFeHRlcm5hbAEBBQAUIHByaW9yaXR5CCByZXF1aXJlc30DIHByb3ZpZGVzfQMkbG9uZ2V2aXR5CCRwcm9wYWdhdGUUBy0KFQoADExzZXNzaW9uX3N0YXJ0X2Jsb2NrBGBncm91cF9yb3RhdGlvbl9mcmVxdWVuY3kEDG5vdwQDCM0INQoACBxwYXJhX2lkBCBjb2xsYXRvchEBBj0KACBQbmV4dF91cF9vbl9hdmFpbGFibGVBCjhvY2N1cGllZF9zaW5jZQQsdGltZV9vdXRfYXQETG5leHRfdXBfb25fdGltZV9vdXRBCjBhdmFpbGFiaWxpdHmxBURncm91cF9yZXNwb25zaWJsZQQ4Y2FuZGlkYXRlX2hhc2ggUGNhbmRpZGF0ZV9kZXNjcmlwdG9yRQICDCBPY2N1cGllZAEAIFBuZXh0X3VwX29uX2F2YWlsYWJsZUEKOG9jY3VwaWVkX3NpbmNlBCx0aW1lX291dF9hdARMbmV4dF91cF9vbl90aW1lX291dEEKMGF2YWlsYWJpbGl0ebEFRGdyb3VwX3Jlc3BvbnNpYmxlBDhjYW5kaWRhdGVfaGFzaCBQY2FuZGlkYXRlX2Rlc2NyaXB0b3JFAiRTY2hlZHVsZWQBAAgccGFyYV9pZAQgY29sbGF0b3IRARBGcmVlAQEFBEkKAAIMIEluY2x1ZGVkAQEFIFRpbWVkT3V0AQEFEEZyZWUBAQUAECxwYXJlbnRfaGVhZCRMcmVsYXlfcGFyZW50X251bWJlcgRkcmVsYXlfcGFyZW50X3N0b3JhZ2Vfcm9vdCAwbWF4X3Bvdl9zaXplBAZVCgMIVQogBl0KBs0FAgw8Q2FuZGlkYXRlQmFja2VkAQMQSQIkBAREQ2FuZGlkYXRlSW5jbHVkZWQBAxBJAiQEBERDYW5kaWRhdGVUaW1lZE91dAEDDEkCJAQEaQoAAwgEOQkEcQoABskIBkUJAwwEIE0JBIEKAAalBQMMBCBVCQSNCgAACDxieXRlc19yZW1haW5pbmcESG1lc3NhZ2VzX3JlbWFpbmluZwQDCASVCgSZCgAGEQkGSQkAOFxtaW5fcmVsYXlfcGFyZW50X251bWJlcgQwbWF4X3Bvdl9zaXplBDRtYXhfY29kZV9zaXplBDR1bXBfcmVtYWluaW5nBEx1bXBfcmVtYWluaW5nX2J5dGVzBGRtYXhfdW1wX251bV9wZXJfY2FuZGlkYXRlBFhkbXBfcmVtYWluaW5nX21lc3NhZ2VzOQIwaHJtcF9pbmJvdW5kOQJEaHJtcF9jaGFubmVsc19vdXSdCmhtYXhfaHJtcF9udW1fcGVyX2NhbmRpZGF0ZQQ8cmVxdWlyZWRfcGFyZW50JFB2YWxpZGF0aW9uX2NvZGVfaGFzaCBMdXBncmFkZV9yZXN0cmljdGlvbqEKWGZ1dHVyZV92YWxpZGF0aW9uX2NvZGWlCgAUOGNhbmRpZGF0ZV9oYXNoIChkZXNjcmlwdG9yRQIsY29tbWl0bWVudHPJBUxyZWxheV9wYXJlbnRfbnVtYmVyBDBtYXhfcG92X3NpemUEBK0KAAAILGNvbnN0cmFpbnRzqQpQcGVuZGluZ19hdmFpbGFiaWxpdHmxCga1CgTNBQAACCh2YWxpZGF0b3Jz+QkIaWQIBsEKAihASW52YWxpZE51bWVyaWNPcAEBBRBQdXNoAQEFHEdldFJvb3QBAQUYQ29tbWl0AQEFNEdlbmVyYXRlUHJvb2YBAQUYVmVyaWZ5AQEFMExlYWZOb3RGb3VuZAEBBURQYWxsZXROb3RJbmNsdWRlZAEBBUBJbnZhbGlkTGVhZkluZGV4AQEFVEludmFsaWRCZXN0S25vd25CbG9jawEBBQcgyQoHCMkKAAwwbGVhZl9pbmRpY2VzaQgobGVhZl9jb3VudAgUaXRlbXM5AwMIfQPVCgfZCskKBxUByQoAGDRzbG90X2R1cmF0aW9uCDBlcG9jaF9sZW5ndGgIBGPBAyxhdXRob3JpdGllc1UBKHJhbmRvbW5lc3MgNGFsbG93ZWRfc2xvdHPFAwAYLGVwb2NoX2luZGV4CChzdGFydF9zbG90CCBkdXJhdGlvbggsYXV0aG9yaXRpZXNVAShyYW5kb21uZXNzIBhjb25maWcFBwMIJCgE7QoABvEKAAwYd2VpZ2h0GBRjbGFzczgscGFydGlhbF9mZWUIAAwgYmFzZV9mZWUIHGxlbl9mZWUITGFkanVzdGVkX3dlaWdodF9mZWUIBv0KAAg0aW5jbHVzaW9uX2ZlZQELDHRpcAgEsQYAAhg0VW5pbXBsZW1lbnRlZAEBBWRWZXJzaW9uZWRDb252ZXJzaW9uRmFpbGVkAQEFTFdlaWdodE5vdENvbXB1dGFibGUBAQVMVW5oYW5kbGVkWGNtVmVyc2lvbgEBBTRBc3NldE5vdEZvdW5kAQEFKFVucm91dGFibGUBAQUHCQsNCwcYDQsHCA0LBxkDDQsENQMABqkGBKkGAAMImQEpCwQtCwAAEEBleGVjdXRpb25fcmVzdWx0vQE4ZW1pdHRlZF9ldmVudHMhCyRsb2NhbF94Y20lCzhmb3J3YXJkZWRfeGNtczELAgg0VW5pbXBsZW1lbnRlZAEBBWRWZXJzaW9uZWRDb252ZXJzaW9uRmFpbGVkAQEFBzULOQsADEBleGVjdXRpb25fcmVzdWx0jQI4ZW1pdHRlZF9ldmVudHMhCzhmb3J3YXJkZWRfeGNtczELB0ELOQsCCCxVbnN1cHBvcnRlZAEBBWRWZXJzaW9uZWRDb252ZXJzaW9uRmFpbGVkAQEFBwBJCwcVAUkDBkkDBEkDAAIsNEFscmVhZHlNZW1iZXIBAQUkTm90TWVtYmVyAQEFKE5vdFBvbGxpbmcBAQUcT25nb2luZwEBBTROb25lUmVtYWluaW5nAQEFKENvcnJ1cHRpb24BAQUoUmFua1Rvb0xvdwEBBThJbnZhbGlkV2l0bmVzcwEBBTBOb1Blcm1pc3Npb24BAQUoU2FtZU1lbWJlcgEBBThUb29NYW55TWVtYmVycwEBBQKAJE5vdE1lbWJlcgEBBTRBbHJlYWR5TWVtYmVyAQEFJFN1c3BlbmRlZAEBBTBOb3RTdXNwZW5kZWQBAQUgTm9QYXlvdXQBAQU4QWxyZWFkeUZvdW5kZWQBAQU8SW5zdWZmaWNpZW50UG90AQEFPEFscmVhZHlWb3VjaGluZwEBBUxOb3RWb3VjaGluZ09uQmlkZGVyAQEFEEhlYWQBAQUcRm91bmRlcgEBBShBbHJlYWR5QmlkAQEFQEFscmVhZHlDYW5kaWRhdGUBAQUwTm90Q2FuZGlkYXRlAQEFKE1heE1lbWJlcnMBAQUoTm90Rm91bmRlcgEBBRxOb3RIZWFkAQEFLE5vdEFwcHJvdmVkAQEFLE5vdFJlamVjdGVkAQEFIEFwcHJvdmVkAQEFIFJlamVjdGVkAQEFKEluUHJvZ3Jlc3MBAQUgVG9vRWFybHkBAQUUVm90ZWQBAQUcRXhwaXJlZAEBBSROb3RCaWRkZXIBAQUoTm9EZWZlbmRlcgEBBSBOb3RHcm91cAEBBTxBbHJlYWR5RWxldmF0ZWQBAQU8QWxyZWFkeVB1bmlzaGVkAQEFREluc3VmZmljaWVudEZ1bmRzAQEFHE5vVm90ZXMBAQUCQChOb3RBbGxvd2VkAQEFNFplcm9UaHJlc2hvbGQBAQVATm90RW5vdWdoRnJpZW5kcwEBBShNYXhGcmllbmRzAQEFJE5vdFNvcnRlZAEBBThOb3RSZWNvdmVyYWJsZQEBBUhBbHJlYWR5UmVjb3ZlcmFibGUBAQU4QWxyZWFkeVN0YXJ0ZWQBAQUoTm90U3RhcnRlZAEBBSROb3RGcmllbmQBAQUsRGVsYXlQZXJpb2QBAQU4QWxyZWFkeVZvdWNoZWQBAQUkVGhyZXNob2xkAQEFLFN0aWxsQWN0aXZlAQEFMEFscmVhZHlQcm94eQEBBSBCYWRTdGF0ZQEBBQI8QER1cmF0aW9uVG9vU21hbGwBAQU4RHVyYXRpb25Ub29CaWcBAQU4QW1vdW50VG9vU21hbGwBAQUkQmlkVG9vTG93AQEFOFVua25vd25SZWNlaXB0AQEFIE5vdE93bmVyAQEFKE5vdEV4cGlyZWQBAQUoVW5rbm93bkJpZAEBBTRQb3J0aW9uVG9vQmlnAQEFIFVuZnVuZGVkAQEFNEFscmVhZHlGdW5kZWQBAQUkVGhyb3R0bGVkAQEFJE1ha2VzRHVzdAEBBTxBbHJlYWR5Q29tbXVuYWwBAQU4QWxyZWFkeVByaXZhdGUBAQUCAQEYU3lzdGVtAQIkPEludmFsaWRTcGVjTmFtZQEBBWhTcGVjVmVyc2lvbk5lZWRzVG9JbmNyZWFzZQEBBXRGYWlsZWRUb0V4dHJhY3RSdW50aW1lVmVyc2lvbgEBBUxOb25EZWZhdWx0Q29tcG9zaXRlAQEFPE5vblplcm9SZWZDb3VudAEBBTBDYWxsRmlsdGVyZWQBAQVsTXVsdGlCbG9ja01pZ3JhdGlvbnNPbmdvaW5nAQEFRE5vdGhpbmdBdXRob3JpemVkAQEFMFVuYXV0aG9yaXplZAEBBRBCYWJlAQIQYEludmFsaWRFcXVpdm9jYXRpb25Qcm9vZgEBBWBJbnZhbGlkS2V5T3duZXJzaGlwUHJvb2YBAQVYRHVwbGljYXRlT2ZmZW5jZVJlcG9ydAEBBVBJbnZhbGlkQ29uZmlndXJhdGlvbgEBBSRUaW1lc3RhbXABAQUcSW5kaWNlcwECFCxOb3RBc3NpZ25lZAEBBSBOb3RPd25lcgEBBRRJblVzZQEBBSxOb3RUcmFuc2ZlcgEBBSRQZXJtYW5lbnQBAQUgQmFsYW5jZXMBAjA4VmVzdGluZ0JhbGFuY2UBAQVUTGlxdWlkaXR5UmVzdHJpY3Rpb25zAQEFTEluc3VmZmljaWVudEJhbGFuY2UBAQVIRXhpc3RlbnRpYWxEZXBvc2l0AQEFNEV4cGVuZGFiaWxpdHkBAQVcRXhpc3RpbmdWZXN0aW5nU2NoZWR1bGUBAQUsRGVhZEFjY291bnQBAQU8VG9vTWFueVJlc2VydmVzAQEFMFRvb01hbnlIb2xkcwEBBThUb29NYW55RnJlZXplcwEBBUxJc3N1YW5jZURlYWN0aXZhdGVkAQEFJERlbHRhWmVybwEBBUhUcmFuc2FjdGlvblBheW1lbnQBAQUoQXV0aG9yc2hpcAEBBRxTdGFraW5nAQJ8NE5vdENvbnRyb2xsZXIBAQUgTm90U3Rhc2gBAQU0QWxyZWFkeUJvbmRlZAEBBTRBbHJlYWR5UGFpcmVkAQEFMEVtcHR5VGFyZ2V0cwEBBThEdXBsaWNhdGVJbmRleAEBBURJbnZhbGlkU2xhc2hJbmRleAEBBUBJbnN1ZmZpY2llbnRCb25kAQEFME5vTW9yZUNodW5rcwEBBTROb1VubG9ja0NodW5rAQEFMEZ1bmRlZFRhcmdldAEBBUhJbnZhbGlkRXJhVG9SZXdhcmQBAQVoSW52YWxpZE51bWJlck9mTm9taW5hdGlvbnMBAQVITm90U29ydGVkQW5kVW5pcXVlAQEFOEFscmVhZHlDbGFpbWVkAQEFLEludmFsaWRQYWdlAQEFVEluY29ycmVjdEhpc3RvcnlEZXB0aAEBBVhJbmNvcnJlY3RTbGFzaGluZ1NwYW5zAQEFIEJhZFN0YXRlAQEFOFRvb01hbnlUYXJnZXRzAQEFJEJhZFRhcmdldAEBBUBDYW5ub3RDaGlsbE90aGVyAQEFRFRvb01hbnlOb21pbmF0b3JzAQEFRFRvb01hbnlWYWxpZGF0b3JzAQEFQENvbW1pc3Npb25Ub29Mb3cBAQUsQm91bmROb3RNZXQBAQVQQ29udHJvbGxlckRlcHJlY2F0ZWQBAQVMQ2Fubm90UmVzdG9yZUxlZGdlcgEBBWxSZXdhcmREZXN0aW5hdGlvblJlc3RyaWN0ZWQBAQU4Tm90RW5vdWdoRnVuZHMBAQVcVmlydHVhbFN0YWtlck5vdEFsbG93ZWQBAQUgT2ZmZW5jZXMBAQUoSGlzdG9yaWNhbAEBBRxTZXNzaW9uAQIUMEludmFsaWRQcm9vZgEBBVxOb0Fzc29jaWF0ZWRWYWxpZGF0b3JJZAEBBTREdXBsaWNhdGVkS2V5AQEFGE5vS2V5cwEBBSROb0FjY291bnQBAQUcR3JhbmRwYQECHCxQYXVzZUZhaWxlZAEBBTBSZXN1bWVGYWlsZWQBAQU0Q2hhbmdlUGVuZGluZwEBBRxUb29Tb29uAQEFYEludmFsaWRLZXlPd25lcnNoaXBQcm9vZgEBBWBJbnZhbGlkRXF1aXZvY2F0aW9uUHJvb2YBAQVYRHVwbGljYXRlT2ZmZW5jZVJlcG9ydAEBBUhBdXRob3JpdHlEaXNjb3ZlcnkBAQUgVHJlYXN1cnkBAiwwSW52YWxpZEluZGV4AQEFQFRvb01hbnlBcHByb3ZhbHMBAQVYSW5zdWZmaWNpZW50UGVybWlzc2lvbgEBBUxQcm9wb3NhbE5vdEFwcHJvdmVkAQEFWEZhaWxlZFRvQ29udmVydEJhbGFuY2UBAQUwU3BlbmRFeHBpcmVkAQEFLEVhcmx5UGF5b3V0AQEFQEFscmVhZHlBdHRlbXB0ZWQBAQUsUGF5b3V0RXJyb3IBAQUwTm90QXR0ZW1wdGVkAQEFMEluY29uY2x1c2l2ZQEBBUBDb252aWN0aW9uVm90aW5nAQIwKE5vdE9uZ29pbmcBAQUgTm90Vm90ZXIBAQUwTm9QZXJtaXNzaW9uAQEFPE5vUGVybWlzc2lvbllldAEBBURBbHJlYWR5RGVsZWdhdGluZwEBBTRBbHJlYWR5Vm90aW5nAQEFREluc3VmZmljaWVudEZ1bmRzAQEFNE5vdERlbGVnYXRpbmcBAQUgTm9uc2Vuc2UBAQU8TWF4Vm90ZXNSZWFjaGVkAQEFLENsYXNzTmVlZGVkAQEFIEJhZENsYXNzAQEFJFJlZmVyZW5kYQECOChOb3RPbmdvaW5nAQEFKEhhc0RlcG9zaXQBAQUgQmFkVHJhY2sBAQUQRnVsbAEBBShRdWV1ZUVtcHR5AQEFNEJhZFJlZmVyZW5kdW0BAQUsTm90aGluZ1RvRG8BAQUcTm9UcmFjawEBBShVbmZpbmlzaGVkAQEFME5vUGVybWlzc2lvbgEBBSROb0RlcG9zaXQBAQUkQmFkU3RhdHVzAQEFQFByZWltYWdlTm90RXhpc3QBAQWEUHJlaW1hZ2VTdG9yZWRXaXRoRGlmZmVyZW50TGVuZ3RoAQEFUEZlbGxvd3NoaXBDb2xsZWN0aXZlAQIsNEFscmVhZHlNZW1iZXIBAQUkTm90TWVtYmVyAQEFKE5vdFBvbGxpbmcBAQUcT25nb2luZwEBBTROb25lUmVtYWluaW5nAQEFKENvcnJ1cHRpb24BAQUoUmFua1Rvb0xvdwEBBThJbnZhbGlkV2l0bmVzcwEBBTBOb1Blcm1pc3Npb24BAQUoU2FtZU1lbWJlcgEBBThUb29NYW55TWVtYmVycwEBBUxGZWxsb3dzaGlwUmVmZXJlbmRhAQI4KE5vdE9uZ29pbmcBAQUoSGFzRGVwb3NpdAEBBSBCYWRUcmFjawEBBRBGdWxsAQEFKFF1ZXVlRW1wdHkBAQU0QmFkUmVmZXJlbmR1bQEBBSxOb3RoaW5nVG9EbwEBBRxOb1RyYWNrAQEFKFVuZmluaXNoZWQBAQUwTm9QZXJtaXNzaW9uAQEFJE5vRGVwb3NpdAEBBSRCYWRTdGF0dXMBAQVAUHJlaW1hZ2VOb3RFeGlzdAEBBYRQcmVpbWFnZVN0b3JlZFdpdGhEaWZmZXJlbnRMZW5ndGgBAQUcT3JpZ2lucwEBBSRXaGl0ZWxpc3QBAhRMVW5hdmFpbGFibGVQcmVJbWFnZQEBBTxVbmRlY29kYWJsZUNhbGwBAQVgSW52YWxpZENhbGxXZWlnaHRXaXRuZXNzAQEFUENhbGxJc05vdFdoaXRlbGlzdGVkAQEFWENhbGxBbHJlYWR5V2hpdGVsaXN0ZWQBAQUoUGFyYW1ldGVycwEBBRhDbGFpbXMBAhhgSW52YWxpZEV0aGVyZXVtU2lnbmF0dXJlAQEFQFNpZ25lckhhc05vQ2xhaW0BAQVAU2VuZGVySGFzTm9DbGFpbQEBBTBQb3RVbmRlcmZsb3cBAQVASW52YWxpZFN0YXRlbWVudAEBBUxWZXN0ZWRCYWxhbmNlRXhpc3RzAQEFHFV0aWxpdHkBAgQwVG9vTWFueUNhbGxzAQEFHFNvY2lldHkBAoAkTm90TWVtYmVyAQEFNEFscmVhZHlNZW1iZXIBAQUkU3VzcGVuZGVkAQEFME5vdFN1c3BlbmRlZAEBBSBOb1BheW91dAEBBThBbHJlYWR5Rm91bmRlZAEBBTxJbnN1ZmZpY2llbnRQb3QBAQU8QWxyZWFkeVZvdWNoaW5nAQEFTE5vdFZvdWNoaW5nT25CaWRkZXIBAQUQSGVhZAEBBRxGb3VuZGVyAQEFKEFscmVhZHlCaWQBAQVAQWxyZWFkeUNhbmRpZGF0ZQEBBTBOb3RDYW5kaWRhdGUBAQUoTWF4TWVtYmVycwEBBShOb3RGb3VuZGVyAQEFHE5vdEhlYWQBAQUsTm90QXBwcm92ZWQBAQUsTm90UmVqZWN0ZWQBAQUgQXBwcm92ZWQBAQUgUmVqZWN0ZWQBAQUoSW5Qcm9ncmVzcwEBBSBUb29FYXJseQEBBRRWb3RlZAEBBRxFeHBpcmVkAQEFJE5vdEJpZGRlcgEBBShOb0RlZmVuZGVyAQEFIE5vdEdyb3VwAQEFPEFscmVhZHlFbGV2YXRlZAEBBTxBbHJlYWR5UHVuaXNoZWQBAQVESW5zdWZmaWNpZW50RnVuZHMBAQUcTm9Wb3RlcwEBBSBSZWNvdmVyeQECQChOb3RBbGxvd2VkAQEFNFplcm9UaHJlc2hvbGQBAQVATm90RW5vdWdoRnJpZW5kcwEBBShNYXhGcmllbmRzAQEFJE5vdFNvcnRlZAEBBThOb3RSZWNvdmVyYWJsZQEBBUhBbHJlYWR5UmVjb3ZlcmFibGUBAQU4QWxyZWFkeVN0YXJ0ZWQBAQUoTm90U3RhcnRlZAEBBSROb3RGcmllbmQBAQUsRGVsYXlQZXJpb2QBAQU4QWxyZWFkeVZvdWNoZWQBAQUkVGhyZXNob2xkAQEFLFN0aWxsQWN0aXZlAQEFMEFscmVhZHlQcm94eQEBBSBCYWRTdGF0ZQEBBRxWZXN0aW5nAQIUKE5vdFZlc3RpbmcBAQVUQXRNYXhWZXN0aW5nU2NoZWR1bGVzAQEFJEFtb3VudExvdwEBBWBTY2hlZHVsZUluZGV4T3V0T2ZCb3VuZHMBAQVUSW52YWxpZFNjaGVkdWxlUGFyYW1zAQEFJFNjaGVkdWxlcgECFEBGYWlsZWRUb1NjaGVkdWxlAQEFIE5vdEZvdW5kAQEFXFRhcmdldEJsb2NrTnVtYmVySW5QYXN0AQEFSFJlc2NoZWR1bGVOb0NoYW5nZQEBBRROYW1lZAEBBRRQcm94eQECIBxUb29NYW55AQEFIE5vdEZvdW5kAQEFIE5vdFByb3h5AQEFLFVucHJveHlhYmxlAQEFJER1cGxpY2F0ZQEBBTBOb1Blcm1pc3Npb24BAQUsVW5hbm5vdW5jZWQBAQUsTm9TZWxmUHJveHkBAQUgTXVsdGlzaWcBAjhATWluaW11bVRocmVzaG9sZAEBBTxBbHJlYWR5QXBwcm92ZWQBAQVETm9BcHByb3ZhbHNOZWVkZWQBAQVEVG9vRmV3U2lnbmF0b3JpZXMBAQVIVG9vTWFueVNpZ25hdG9yaWVzAQEFVFNpZ25hdG9yaWVzT3V0T2ZPcmRlcgEBBUxTZW5kZXJJblNpZ25hdG9yaWVzAQEFIE5vdEZvdW5kAQEFIE5vdE93bmVyAQEFLE5vVGltZXBvaW50AQEFOFdyb25nVGltZXBvaW50AQEFTFVuZXhwZWN0ZWRUaW1lcG9pbnQBAQU8TWF4V2VpZ2h0VG9vTG93AQEFNEFscmVhZHlTdG9yZWQBAQUgUHJlaW1hZ2UBAiQYVG9vQmlnAQEFMEFscmVhZHlOb3RlZAEBBTROb3RBdXRob3JpemVkAQEFIE5vdE5vdGVkAQEFJFJlcXVlc3RlZAEBBTBOb3RSZXF1ZXN0ZWQBAQUcVG9vTWFueQEBBRhUb29GZXcBAQUYTm9Db3N0AQEFIEJvdW50aWVzAQIscEluc3VmZmljaWVudFByb3Bvc2Vyc0JhbGFuY2UBAQUwSW52YWxpZEluZGV4AQEFMFJlYXNvblRvb0JpZwEBBUBVbmV4cGVjdGVkU3RhdHVzAQEFOFJlcXVpcmVDdXJhdG9yAQEFMEludmFsaWRWYWx1ZQEBBShJbnZhbGlkRmVlAQEFNFBlbmRpbmdQYXlvdXQBAQUkUHJlbWF0dXJlAQEFUEhhc0FjdGl2ZUNoaWxkQm91bnR5AQEFNFRvb01hbnlRdWV1ZWQBAQU0Q2hpbGRCb3VudGllcwECDFRQYXJlbnRCb3VudHlOb3RBY3RpdmUBAQVkSW5zdWZmaWNpZW50Qm91bnR5QmFsYW5jZQEBBVBUb29NYW55Q2hpbGRCb3VudGllcwEBBWhFbGVjdGlvblByb3ZpZGVyTXVsdGlQaGFzZQECPGhQcmVEaXNwYXRjaEVhcmx5U3VibWlzc2lvbgEBBWxQcmVEaXNwYXRjaFdyb25nV2lubmVyQ291bnQBAQVkUHJlRGlzcGF0Y2hXZWFrU3VibWlzc2lvbgEBBTxTaWduZWRRdWV1ZUZ1bGwBAQVYU2lnbmVkQ2Fubm90UGF5RGVwb3NpdAEBBVBTaWduZWRJbnZhbGlkV2l0bmVzcwEBBUxTaWduZWRUb29NdWNoV2VpZ2h0AQEFPE9jd0NhbGxXcm9uZ0VyYQEBBVxNaXNzaW5nU25hcHNob3RNZXRhZGF0YQEBBVhJbnZhbGlkU3VibWlzc2lvbkluZGV4AQEFOENhbGxOb3RBbGxvd2VkAQEFOEZhbGxiYWNrRmFpbGVkAQEFLEJvdW5kTm90TWV0AQEFOFRvb01hbnlXaW5uZXJzAQEFZFByZURpc3BhdGNoRGlmZmVyZW50Um91bmQBAQUMTmlzAQI8QER1cmF0aW9uVG9vU21hbGwBAQU4RHVyYXRpb25Ub29CaWcBAQU4QW1vdW50VG9vU21hbGwBAQUkQmlkVG9vTG93AQEFOFVua25vd25SZWNlaXB0AQEFIE5vdE93bmVyAQEFKE5vdEV4cGlyZWQBAQUoVW5rbm93bkJpZAEBBTRQb3J0aW9uVG9vQmlnAQEFIFVuZnVuZGVkAQEFNEFscmVhZHlGdW5kZWQBAQUkVGhyb3R0bGVkAQEFJE1ha2VzRHVzdAEBBTxBbHJlYWR5Q29tbXVuYWwBAQU4QWxyZWFkeVByaXZhdGUBAQVYTmlzQ291bnRlcnBhcnRCYWxhbmNlcwECMDhWZXN0aW5nQmFsYW5jZQEBBVRMaXF1aWRpdHlSZXN0cmljdGlvbnMBAQVMSW5zdWZmaWNpZW50QmFsYW5jZQEBBUhFeGlzdGVudGlhbERlcG9zaXQBAQU0RXhwZW5kYWJpbGl0eQEBBVxFeGlzdGluZ1Zlc3RpbmdTY2hlZHVsZQEBBSxEZWFkQWNjb3VudAEBBTxUb29NYW55UmVzZXJ2ZXMBAQUwVG9vTWFueUhvbGRzAQEFOFRvb01hbnlGcmVlemVzAQEFTElzc3VhbmNlRGVhY3RpdmF0ZWQBAQUkRGVsdGFaZXJvAQEFJFZvdGVyTGlzdAECBBBMaXN0AQIQJER1cGxpY2F0ZQEBBShOb3RIZWF2aWVyAQEFME5vdEluU2FtZUJhZwEBBTBOb2RlTm90Rm91bmQBAQU8Tm9taW5hdGlvblBvb2xzAQKQMFBvb2xOb3RGb3VuZAEBBUhQb29sTWVtYmVyTm90Rm91bmQBAQVIUmV3YXJkUG9vbE5vdEZvdW5kAQEFQFN1YlBvb2xzTm90Rm91bmQBAQVkQWNjb3VudEJlbG9uZ3NUb090aGVyUG9vbAEBBThGdWxseVVuYm9uZGluZwEBBURNYXhVbmJvbmRpbmdMaW1pdAEBBURDYW5ub3RXaXRoZHJhd0FueQEBBURNaW5pbXVtQm9uZE5vdE1ldAEBBTBPdmVyZmxvd1Jpc2sBAQU0Tm90RGVzdHJveWluZwEBBTBOb3ROb21pbmF0b3IBAQVUTm90S2lja2VyT3JEZXN0cm95aW5nAQEFHE5vdE9wZW4BAQUgTWF4UG9vbHMBAQU4TWF4UG9vbE1lbWJlcnMBAQVEQ2FuTm90Q2hhbmdlU3RhdGUBAQVURG9lc05vdEhhdmVQZXJtaXNzaW9uAQEFVE1ldGFkYXRhRXhjZWVkc01heExlbgEBBSREZWZlbnNpdmUBAhxoTm90RW5vdWdoU3BhY2VJblVuYm9uZFBvb2wBAQUwUG9vbE5vdEZvdW5kAQEFSFJld2FyZFBvb2xOb3RGb3VuZAEBBUBTdWJQb29sc05vdEZvdW5kAQEFcEJvbmRlZFN0YXNoS2lsbGVkUHJlbWF0dXJlbHkBAQVURGVsZWdhdGlvblVuc3VwcG9ydGVkAQEFPFNsYXNoTm90QXBwbGllZAEBBZxQYXJ0aWFsVW5ib25kTm90QWxsb3dlZFBlcm1pc3Npb25sZXNzbHkBAQVcTWF4Q29tbWlzc2lvblJlc3RyaWN0ZWQBAQVgQ29tbWlzc2lvbkV4Y2VlZHNNYXhpbXVtAQEFeENvbW1pc3Npb25FeGNlZWRzR2xvYmFsTWF4aW11bQEBBWRDb21taXNzaW9uQ2hhbmdlVGhyb3R0bGVkAQEFeENvbW1pc3Npb25DaGFuZ2VSYXRlTm90QWxsb3dlZAEBBUxOb1BlbmRpbmdDb21taXNzaW9uAQEFWE5vQ29tbWlzc2lvbkN1cnJlbnRTZXQBAQUsUG9vbElkSW5Vc2UBAQU0SW52YWxpZFBvb2xJZAEBBUxCb25kRXh0cmFSZXN0cmljdGVkAQEFPE5vdGhpbmdUb0FkanVzdAEBBThOb3RoaW5nVG9TbGFzaAEBBTxBbHJlYWR5TWlncmF0ZWQBAQUsTm90TWlncmF0ZWQBAQUwTm90U3VwcG9ydGVkAQEFLEZhc3RVbnN0YWtlAQIYNE5vdENvbnRyb2xsZXIBAQU0QWxyZWFkeVF1ZXVlZAEBBThOb3RGdWxseUJvbmRlZAEBBSROb3RRdWV1ZWQBAQUsQWxyZWFkeUhlYWQBAQU4Q2FsbE5vdEFsbG93ZWQBAQVAUGFyYWNoYWluc09yaWdpbgEBBTRDb25maWd1cmF0aW9uAQIEPEludmFsaWROZXdWYWx1ZQEBBSxQYXJhc1NoYXJlZAEBBTRQYXJhSW5jbHVzaW9uAQJIZFZhbGlkYXRvckluZGV4T3V0T2ZCb3VuZHMBAQVQVW5zY2hlZHVsZWRDYW5kaWRhdGUBAQVASGVhZERhdGFUb29MYXJnZQEBBVBQcmVtYXR1cmVDb2RlVXBncmFkZQEBBTxOZXdDb2RlVG9vTGFyZ2UBAQVURGlzYWxsb3dlZFJlbGF5UGFyZW50AQEFREludmFsaWRBc3NpZ25tZW50AQEFREludmFsaWRHcm91cEluZGV4AQEFTEluc3VmZmljaWVudEJhY2tpbmcBAQU4SW52YWxpZEJhY2tpbmcBAQVETm90Q29sbGF0b3JTaWduZWQBAQVoVmFsaWRhdGlvbkRhdGFIYXNoTWlzbWF0Y2gBAQWASW5jb3JyZWN0RG93bndhcmRNZXNzYWdlSGFuZGxpbmcBAQVUSW52YWxpZFVwd2FyZE1lc3NhZ2VzAQEFYEhybXBXYXRlcm1hcmtNaXNoYW5kbGluZwEBBUxJbnZhbGlkT3V0Ym91bmRIcm1wAQEFZEludmFsaWRWYWxpZGF0aW9uQ29kZUhhc2gBAQVAUGFyYUhlYWRNaXNtYXRjaAEBBTBQYXJhSW5oZXJlbnQBAhRkVG9vTWFueUluY2x1c2lvbkluaGVyZW50cwEBBUxJbnZhbGlkUGFyZW50SGVhZGVyAQEFSEluaGVyZW50T3ZlcndlaWdodAEBBYRDYW5kaWRhdGVzRmlsdGVyZWREdXJpbmdFeGVjdXRpb24BAQVQVW5zY2hlZHVsZWRDYW5kaWRhdGUBAQU0UGFyYVNjaGVkdWxlcgEBBRRQYXJhcwECNDROb3RSZWdpc3RlcmVkAQEFNENhbm5vdE9uYm9hcmQBAQU4Q2Fubm90T2ZmYm9hcmQBAQU0Q2Fubm90VXBncmFkZQEBBTxDYW5ub3REb3duZ3JhZGUBAQVYUHZmQ2hlY2tTdGF0ZW1lbnRTdGFsZQEBBVxQdmZDaGVja1N0YXRlbWVudEZ1dHVyZQEBBYRQdmZDaGVja1ZhbGlkYXRvckluZGV4T3V0T2ZCb3VuZHMBAQVgUHZmQ2hlY2tJbnZhbGlkU2lnbmF0dXJlAQEFSFB2ZkNoZWNrRG91YmxlVm90ZQEBBVhQdmZDaGVja1N1YmplY3RJbnZhbGlkAQEFRENhbm5vdFVwZ3JhZGVDb2RlAQEFLEludmFsaWRDb2RlAQEFLEluaXRpYWxpemVyAQEFDERtcAEBBRBIcm1wAQJQVE9wZW5Icm1wQ2hhbm5lbFRvU2VsZgEBBXxPcGVuSHJtcENoYW5uZWxJbnZhbGlkUmVjaXBpZW50AQEFbE9wZW5Icm1wQ2hhbm5lbFplcm9DYXBhY2l0eQEBBYxPcGVuSHJtcENoYW5uZWxDYXBhY2l0eUV4Y2VlZHNMaW1pdAEBBXhPcGVuSHJtcENoYW5uZWxaZXJvTWVzc2FnZVNpemUBAQWYT3BlbkhybXBDaGFubmVsTWVzc2FnZVNpemVFeGNlZWRzTGltaXQBAQVwT3BlbkhybXBDaGFubmVsQWxyZWFkeUV4aXN0cwEBBXxPcGVuSHJtcENoYW5uZWxBbHJlYWR5UmVxdWVzdGVkAQEFcE9wZW5Icm1wQ2hhbm5lbExpbWl0RXhjZWVkZWQBAQVwQWNjZXB0SHJtcENoYW5uZWxEb2VzbnRFeGlzdAEBBYRBY2NlcHRIcm1wQ2hhbm5lbEFscmVhZHlDb25maXJtZWQBAQV4QWNjZXB0SHJtcENoYW5uZWxMaW1pdEV4Y2VlZGVkAQEFcENsb3NlSHJtcENoYW5uZWxVbmF1dGhvcml6ZWQBAQVsQ2xvc2VIcm1wQ2hhbm5lbERvZXNudEV4aXN0AQEFfENsb3NlSHJtcENoYW5uZWxBbHJlYWR5VW5kZXJ3YXkBAQWEQ2FuY2VsSHJtcE9wZW5DaGFubmVsVW5hdXRob3JpemVkAQEFaE9wZW5Icm1wQ2hhbm5lbERvZXNudEV4aXN0AQEFfE9wZW5Icm1wQ2hhbm5lbEFscmVhZHlDb25maXJtZWQBAQUwV3JvbmdXaXRuZXNzAQEFcENoYW5uZWxDcmVhdGlvbk5vdEF1dGhvcml6ZWQBAQU8UGFyYVNlc3Npb25JbmZvAQEFNFBhcmFzRGlzcHV0ZXMBAiR0RHVwbGljYXRlRGlzcHV0ZVN0YXRlbWVudFNldHMBAQVcQW5jaWVudERpc3B1dGVTdGF0ZW1lbnQBAQVkVmFsaWRhdG9ySW5kZXhPdXRPZkJvdW5kcwEBBUBJbnZhbGlkU2lnbmF0dXJlAQEFSER1cGxpY2F0ZVN0YXRlbWVudAEBBUhTaW5nbGVTaWRlZERpc3B1dGUBAQU8TWFsaWNpb3VzQmFja2VyAQEFTE1pc3NpbmdCYWNraW5nVm90ZXMBAQVIVW5jb25maXJtZWREaXNwdXRlAQEFNFBhcmFzU2xhc2hpbmcBAhhgSW52YWxpZEtleU93bmVyc2hpcFByb29mAQEFTEludmFsaWRTZXNzaW9uSW5kZXgBAQVQSW52YWxpZENhbmRpZGF0ZUhhc2gBAQVUSW52YWxpZFZhbGlkYXRvckluZGV4AQEFYFZhbGlkYXRvckluZGV4SWRNaXNtYXRjaAEBBVxEdXBsaWNhdGVTbGFzaGluZ1JlcG9ydAEBBWhPbkRlbWFuZEFzc2lnbm1lbnRQcm92aWRlcgECCCRRdWV1ZUZ1bGwBAQVwU3BvdFByaWNlSGlnaGVyVGhhbk1heEFtb3VudAEBBWhDb3JldGltZUFzc2lnbm1lbnRQcm92aWRlcgECGEBBc3NpZ25tZW50c0VtcHR5AQEFNE92ZXJTY2hlZHVsZWQBAQU4VW5kZXJTY2hlZHVsZWQBAQVARGlzYWxsb3dlZEluc2VydAEBBTxEdXBsaWNhdGVJbnNlcnQBAQVQQXNzaWdubWVudHNOb3RTb3J0ZWQBAQUkUmVnaXN0cmFyAQI4NE5vdFJlZ2lzdGVyZWQBAQVEQWxyZWFkeVJlZ2lzdGVyZWQBAQUgTm90T3duZXIBAQUwQ29kZVRvb0xhcmdlAQEFQEhlYWREYXRhVG9vTGFyZ2UBAQUwTm90UGFyYWNoYWluAQEFNE5vdFBhcmF0aHJlYWQBAQVAQ2Fubm90RGVyZWdpc3RlcgEBBTxDYW5ub3REb3duZ3JhZGUBAQU0Q2Fubm90VXBncmFkZQEBBShQYXJhTG9ja2VkAQEFLE5vdFJlc2VydmVkAQEFLEludmFsaWRDb2RlAQEFKENhbm5vdFN3YXABAQUUU2xvdHMBAghEUGFyYU5vdE9uYm9hcmRpbmcBAQUoTGVhc2VFcnJvcgEBBSBBdWN0aW9ucwECHERBdWN0aW9uSW5Qcm9ncmVzcwEBBURMZWFzZVBlcmlvZEluUGFzdAEBBURQYXJhTm90UmVnaXN0ZXJlZAEBBUROb3RDdXJyZW50QXVjdGlvbgEBBShOb3RBdWN0aW9uAQEFMEF1Y3Rpb25FbmRlZAEBBUBBbHJlYWR5TGVhc2VkT3V0AQEFJENyb3dkbG9hbgECXERGaXJzdFBlcmlvZEluUGFzdAEBBWRGaXJzdFBlcmlvZFRvb0ZhckluRnV0dXJlAQEFbExhc3RQZXJpb2RCZWZvcmVGaXJzdFBlcmlvZAEBBWBMYXN0UGVyaW9kVG9vRmFySW5GdXR1cmUBAQU8Q2Fubm90RW5kSW5QYXN0AQEFREVuZFRvb0ZhckluRnV0dXJlAQEFIE92ZXJmbG93AQEFUENvbnRyaWJ1dGlvblRvb1NtYWxsAQEFNEludmFsaWRQYXJhSWQBAQUsQ2FwRXhjZWVkZWQBAQVYQ29udHJpYnV0aW9uUGVyaW9kT3ZlcgEBBTRJbnZhbGlkT3JpZ2luAQEFME5vdFBhcmFjaGFpbgEBBSxMZWFzZUFjdGl2ZQEBBUBCaWRPckxlYXNlQWN0aXZlAQEFMEZ1bmROb3RFbmRlZAEBBTxOb0NvbnRyaWJ1dGlvbnMBAQVITm90UmVhZHlUb0Rpc3NvbHZlAQEFQEludmFsaWRTaWduYXR1cmUBAQUwTWVtb1Rvb0xhcmdlAQEFREFscmVhZHlJbk5ld1JhaXNlAQEFSFZyZkRlbGF5SW5Qcm9ncmVzcwEBBTROb0xlYXNlUGVyaW9kAQEFIENvcmV0aW1lAQIMJE5vdEJyb2tlcgEBBVhSZXF1ZXN0ZWRGdXR1cmVSZXZlbnVlAQEFTEFzc2V0VHJhbnNmZXJGYWlsZWQBAQUkWGNtUGFsbGV0AQJgLFVucmVhY2hhYmxlAQEFLFNlbmRGYWlsdXJlAQEFIEZpbHRlcmVkAQEFSFVud2VpZ2hhYmxlTWVzc2FnZQEBBWBEZXN0aW5hdGlvbk5vdEludmVydGlibGUBAQUURW1wdHkBAQU4Q2Fubm90UmVhbmNob3IBAQU0VG9vTWFueUFzc2V0cwEBBTRJbnZhbGlkT3JpZ2luAQEFKEJhZFZlcnNpb24BAQUsQmFkTG9jYXRpb24BAQU4Tm9TdWJzY3JpcHRpb24BAQVEQWxyZWFkeVN1YnNjcmliZWQBAQVYQ2Fubm90Q2hlY2tPdXRUZWxlcG9ydAEBBShMb3dCYWxhbmNlAQEFMFRvb01hbnlMb2NrcwEBBUxBY2NvdW50Tm90U292ZXJlaWduAQEFKEZlZXNOb3RNZXQBAQUwTG9ja05vdEZvdW5kAQEFFEluVXNlAQEFaEludmFsaWRBc3NldFVua25vd25SZXNlcnZlAQEFeEludmFsaWRBc3NldFVuc3VwcG9ydGVkUmVzZXJ2ZQEBBTxUb29NYW55UmVzZXJ2ZXMBAQVgTG9jYWxFeGVjdXRpb25JbmNvbXBsZXRlAQEFME1lc3NhZ2VRdWV1ZQECJCxOb3RSZWFwYWJsZQEBBRhOb1BhZ2UBAQUkTm9NZXNzYWdlAQEFQEFscmVhZHlQcm9jZXNzZWQBAQUYUXVldWVkAQEFSEluc3VmZmljaWVudFdlaWdodAEBBWBUZW1wb3JhcmlseVVucHJvY2Vzc2FibGUBAQUsUXVldWVQYXVzZWQBAQVMUmVjdXJzaXZlRGlzYWxsb3dlZAEBBSRBc3NldFJhdGUBAgxAVW5rbm93bkFzc2V0S2luZAEBBTRBbHJlYWR5RXhpc3RzAQEFIE92ZXJmbG93AQEFFEJlZWZ5AQIQYEludmFsaWRLZXlPd25lcnNoaXBQcm9vZgEBBWBJbnZhbGlkRXF1aXZvY2F0aW9uUHJvb2YBAQVYRHVwbGljYXRlT2ZmZW5jZVJlcG9ydAEBBVBJbnZhbGlkQ29uZmlndXJhdGlvbgEBBQxNbXIBAQUwQmVlZnlNbXJMZWFmAQEFAjgUT3RoZXIBAQUwQ2Fubm90TG9va3VwAQEFJEJhZE9yaWdpbgEBBRhNb2R1bGUBAgEBGFN5c3RlbQECJDxJbnZhbGlkU3BlY05hbWUBAQVoU3BlY1ZlcnNpb25OZWVkc1RvSW5jcmVhc2UBAQV0RmFpbGVkVG9FeHRyYWN0UnVudGltZVZlcnNpb24BAQVMTm9uRGVmYXVsdENvbXBvc2l0ZQEBBTxOb25aZXJvUmVmQ291bnQBAQUwQ2FsbEZpbHRlcmVkAQEFbE11bHRpQmxvY2tNaWdyYXRpb25zT25nb2luZwEBBUROb3RoaW5nQXV0aG9yaXplZAEBBTBVbmF1dGhvcml6ZWQBAQUQQmFiZQECEGBJbnZhbGlkRXF1aXZvY2F0aW9uUHJvb2YBAQVgSW52YWxpZEtleU93bmVyc2hpcFByb29mAQEFWER1cGxpY2F0ZU9mZmVuY2VSZXBvcnQBAQVQSW52YWxpZENvbmZpZ3VyYXRpb24BAQUkVGltZXN0YW1wAQEFHEluZGljZXMBAhQsTm90QXNzaWduZWQBAQUgTm90T3duZXIBAQUUSW5Vc2UBAQUsTm90VHJhbnNmZXIBAQUkUGVybWFuZW50AQEFIEJhbGFuY2VzAQIwOFZlc3RpbmdCYWxhbmNlAQEFVExpcXVpZGl0eVJlc3RyaWN0aW9ucwEBBUxJbnN1ZmZpY2llbnRCYWxhbmNlAQEFSEV4aXN0ZW50aWFsRGVwb3NpdAEBBTRFeHBlbmRhYmlsaXR5AQEFXEV4aXN0aW5nVmVzdGluZ1NjaGVkdWxlAQEFLERlYWRBY2NvdW50AQEFPFRvb01hbnlSZXNlcnZlcwEBBTBUb29NYW55SG9sZHMBAQU4VG9vTWFueUZyZWV6ZXMBAQVMSXNzdWFuY2VEZWFjdGl2YXRlZAEBBSREZWx0YVplcm8BAQVIVHJhbnNhY3Rpb25QYXltZW50AQEFKEF1dGhvcnNoaXABAQUcU3Rha2luZwECfDROb3RDb250cm9sbGVyAQEFIE5vdFN0YXNoAQEFNEFscmVhZHlCb25kZWQBAQU0QWxyZWFkeVBhaXJlZAEBBTBFbXB0eVRhcmdldHMBAQU4RHVwbGljYXRlSW5kZXgBAQVESW52YWxpZFNsYXNoSW5kZXgBAQVASW5zdWZmaWNpZW50Qm9uZAEBBTBOb01vcmVDaHVua3MBAQU0Tm9VbmxvY2tDaHVuawEBBTBGdW5kZWRUYXJnZXQBAQVISW52YWxpZEVyYVRvUmV3YXJkAQEFaEludmFsaWROdW1iZXJPZk5vbWluYXRpb25zAQEFSE5vdFNvcnRlZEFuZFVuaXF1ZQEBBThBbHJlYWR5Q2xhaW1lZAEBBSxJbnZhbGlkUGFnZQEBBVRJbmNvcnJlY3RIaXN0b3J5RGVwdGgBAQVYSW5jb3JyZWN0U2xhc2hpbmdTcGFucwEBBSBCYWRTdGF0ZQEBBThUb29NYW55VGFyZ2V0cwEBBSRCYWRUYXJnZXQBAQVAQ2Fubm90Q2hpbGxPdGhlcgEBBURUb29NYW55Tm9taW5hdG9ycwEBBURUb29NYW55VmFsaWRhdG9ycwEBBUBDb21taXNzaW9uVG9vTG93AQEFLEJvdW5kTm90TWV0AQEFUENvbnRyb2xsZXJEZXByZWNhdGVkAQEFTENhbm5vdFJlc3RvcmVMZWRnZXIBAQVsUmV3YXJkRGVzdGluYXRpb25SZXN0cmljdGVkAQEFOE5vdEVub3VnaEZ1bmRzAQEFXFZpcnR1YWxTdGFrZXJOb3RBbGxvd2VkAQEFIE9mZmVuY2VzAQEFKEhpc3RvcmljYWwBAQUcU2Vzc2lvbgECFDBJbnZhbGlkUHJvb2YBAQVcTm9Bc3NvY2lhdGVkVmFsaWRhdG9ySWQBAQU0RHVwbGljYXRlZEtleQEBBRhOb0tleXMBAQUkTm9BY2NvdW50AQEFHEdyYW5kcGEBAhwsUGF1c2VGYWlsZWQBAQUwUmVzdW1lRmFpbGVkAQEFNENoYW5nZVBlbmRpbmcBAQUcVG9vU29vbgEBBWBJbnZhbGlkS2V5T3duZXJzaGlwUHJvb2YBAQVgSW52YWxpZEVxdWl2b2NhdGlvblByb29mAQEFWER1cGxpY2F0ZU9mZmVuY2VSZXBvcnQBAQVIQXV0aG9yaXR5RGlzY292ZXJ5AQEFIFRyZWFzdXJ5AQIsMEludmFsaWRJbmRleAEBBUBUb29NYW55QXBwcm92YWxzAQEFWEluc3VmZmljaWVudFBlcm1pc3Npb24BAQVMUHJvcG9zYWxOb3RBcHByb3ZlZAEBBVhGYWlsZWRUb0NvbnZlcnRCYWxhbmNlAQEFMFNwZW5kRXhwaXJlZAEBBSxFYXJseVBheW91dAEBBUBBbHJlYWR5QXR0ZW1wdGVkAQEFLFBheW91dEVycm9yAQEFME5vdEF0dGVtcHRlZAEBBTBJbmNvbmNsdXNpdmUBAQVAQ29udmljdGlvblZvdGluZwECMChOb3RPbmdvaW5nAQEFIE5vdFZvdGVyAQEFME5vUGVybWlzc2lvbgEBBTxOb1Blcm1pc3Npb25ZZXQBAQVEQWxyZWFkeURlbGVnYXRpbmcBAQU0QWxyZWFkeVZvdGluZwEBBURJbnN1ZmZpY2llbnRGdW5kcwEBBTROb3REZWxlZ2F0aW5nAQEFIE5vbnNlbnNlAQEFPE1heFZvdGVzUmVhY2hlZAEBBSxDbGFzc05lZWRlZAEBBSBCYWRDbGFzcwEBBSRSZWZlcmVuZGEBAjgoTm90T25nb2luZwEBBShIYXNEZXBvc2l0AQEFIEJhZFRyYWNrAQEFEEZ1bGwBAQUoUXVldWVFbXB0eQEBBTRCYWRSZWZlcmVuZHVtAQEFLE5vdGhpbmdUb0RvAQEFHE5vVHJhY2sBAQUoVW5maW5pc2hlZAEBBTBOb1Blcm1pc3Npb24BAQUkTm9EZXBvc2l0AQEFJEJhZFN0YXR1cwEBBUBQcmVpbWFnZU5vdEV4aXN0AQEFhFByZWltYWdlU3RvcmVkV2l0aERpZmZlcmVudExlbmd0aAEBBVBGZWxsb3dzaGlwQ29sbGVjdGl2ZQECLDRBbHJlYWR5TWVtYmVyAQEFJE5vdE1lbWJlcgEBBShOb3RQb2xsaW5nAQEFHE9uZ29pbmcBAQU0Tm9uZVJlbWFpbmluZwEBBShDb3JydXB0aW9uAQEFKFJhbmtUb29Mb3cBAQU4SW52YWxpZFdpdG5lc3MBAQUwTm9QZXJtaXNzaW9uAQEFKFNhbWVNZW1iZXIBAQU4VG9vTWFueU1lbWJlcnMBAQVMRmVsbG93c2hpcFJlZmVyZW5kYQECOChOb3RPbmdvaW5nAQEFKEhhc0RlcG9zaXQBAQUgQmFkVHJhY2sBAQUQRnVsbAEBBShRdWV1ZUVtcHR5AQEFNEJhZFJlZmVyZW5kdW0BAQUsTm90aGluZ1RvRG8BAQUcTm9UcmFjawEBBShVbmZpbmlzaGVkAQEFME5vUGVybWlzc2lvbgEBBSROb0RlcG9zaXQBAQUkQmFkU3RhdHVzAQEFQFByZWltYWdlTm90RXhpc3QBAQWEUHJlaW1hZ2VTdG9yZWRXaXRoRGlmZmVyZW50TGVuZ3RoAQEFHE9yaWdpbnMBAQUkV2hpdGVsaXN0AQIUTFVuYXZhaWxhYmxlUHJlSW1hZ2UBAQU8VW5kZWNvZGFibGVDYWxsAQEFYEludmFsaWRDYWxsV2VpZ2h0V2l0bmVzcwEBBVBDYWxsSXNOb3RXaGl0ZWxpc3RlZAEBBVhDYWxsQWxyZWFkeVdoaXRlbGlzdGVkAQEFKFBhcmFtZXRlcnMBAQUYQ2xhaW1zAQIYYEludmFsaWRFdGhlcmV1bVNpZ25hdHVyZQEBBUBTaWduZXJIYXNOb0NsYWltAQEFQFNlbmRlckhhc05vQ2xhaW0BAQUwUG90VW5kZXJmbG93AQEFQEludmFsaWRTdGF0ZW1lbnQBAQVMVmVzdGVkQmFsYW5jZUV4aXN0cwEBBRxVdGlsaXR5AQIEMFRvb01hbnlDYWxscwEBBRxTb2NpZXR5AQKAJE5vdE1lbWJlcgEBBTRBbHJlYWR5TWVtYmVyAQEFJFN1c3BlbmRlZAEBBTBOb3RTdXNwZW5kZWQBAQUgTm9QYXlvdXQBAQU4QWxyZWFkeUZvdW5kZWQBAQU8SW5zdWZmaWNpZW50UG90AQEFPEFscmVhZHlWb3VjaGluZwEBBUxOb3RWb3VjaGluZ09uQmlkZGVyAQEFEEhlYWQBAQUcRm91bmRlcgEBBShBbHJlYWR5QmlkAQEFQEFscmVhZHlDYW5kaWRhdGUBAQUwTm90Q2FuZGlkYXRlAQEFKE1heE1lbWJlcnMBAQUoTm90Rm91bmRlcgEBBRxOb3RIZWFkAQEFLE5vdEFwcHJvdmVkAQEFLE5vdFJlamVjdGVkAQEFIEFwcHJvdmVkAQEFIFJlamVjdGVkAQEFKEluUHJvZ3Jlc3MBAQUgVG9vRWFybHkBAQUUVm90ZWQBAQUcRXhwaXJlZAEBBSROb3RCaWRkZXIBAQUoTm9EZWZlbmRlcgEBBSBOb3RHcm91cAEBBTxBbHJlYWR5RWxldmF0ZWQBAQU8QWxyZWFkeVB1bmlzaGVkAQEFREluc3VmZmljaWVudEZ1bmRzAQEFHE5vVm90ZXMBAQUgUmVjb3ZlcnkBAkAoTm90QWxsb3dlZAEBBTRaZXJvVGhyZXNob2xkAQEFQE5vdEVub3VnaEZyaWVuZHMBAQUoTWF4RnJpZW5kcwEBBSROb3RTb3J0ZWQBAQU4Tm90UmVjb3ZlcmFibGUBAQVIQWxyZWFkeVJlY292ZXJhYmxlAQEFOEFscmVhZHlTdGFydGVkAQEFKE5vdFN0YXJ0ZWQBAQUkTm90RnJpZW5kAQEFLERlbGF5UGVyaW9kAQEFOEFscmVhZHlWb3VjaGVkAQEFJFRocmVzaG9sZAEBBSxTdGlsbEFjdGl2ZQEBBTBBbHJlYWR5UHJveHkBAQUgQmFkU3RhdGUBAQUcVmVzdGluZwECFChOb3RWZXN0aW5nAQEFVEF0TWF4VmVzdGluZ1NjaGVkdWxlcwEBBSRBbW91bnRMb3cBAQVgU2NoZWR1bGVJbmRleE91dE9mQm91bmRzAQEFVEludmFsaWRTY2hlZHVsZVBhcmFtcwEBBSRTY2hlZHVsZXIBAhRARmFpbGVkVG9TY2hlZHVsZQEBBSBOb3RGb3VuZAEBBVxUYXJnZXRCbG9ja051bWJlckluUGFzdAEBBUhSZXNjaGVkdWxlTm9DaGFuZ2UBAQUUTmFtZWQBAQUUUHJveHkBAiAcVG9vTWFueQEBBSBOb3RGb3VuZAEBBSBOb3RQcm94eQEBBSxVbnByb3h5YWJsZQEBBSREdXBsaWNhdGUBAQUwTm9QZXJtaXNzaW9uAQEFLFVuYW5ub3VuY2VkAQEFLE5vU2VsZlByb3h5AQEFIE11bHRpc2lnAQI4QE1pbmltdW1UaHJlc2hvbGQBAQU8QWxyZWFkeUFwcHJvdmVkAQEFRE5vQXBwcm92YWxzTmVlZGVkAQEFRFRvb0Zld1NpZ25hdG9yaWVzAQEFSFRvb01hbnlTaWduYXRvcmllcwEBBVRTaWduYXRvcmllc091dE9mT3JkZXIBAQVMU2VuZGVySW5TaWduYXRvcmllcwEBBSBOb3RGb3VuZAEBBSBOb3RPd25lcgEBBSxOb1RpbWVwb2ludAEBBThXcm9uZ1RpbWVwb2ludAEBBUxVbmV4cGVjdGVkVGltZXBvaW50AQEFPE1heFdlaWdodFRvb0xvdwEBBTRBbHJlYWR5U3RvcmVkAQEFIFByZWltYWdlAQIkGFRvb0JpZwEBBTBBbHJlYWR5Tm90ZWQBAQU0Tm90QXV0aG9yaXplZAEBBSBOb3ROb3RlZAEBBSRSZXF1ZXN0ZWQBAQUwTm90UmVxdWVzdGVkAQEFHFRvb01hbnkBAQUYVG9vRmV3AQEFGE5vQ29zdAEBBSBCb3VudGllcwECLHBJbnN1ZmZpY2llbnRQcm9wb3NlcnNCYWxhbmNlAQEFMEludmFsaWRJbmRleAEBBTBSZWFzb25Ub29CaWcBAQVAVW5leHBlY3RlZFN0YXR1cwEBBThSZXF1aXJlQ3VyYXRvcgEBBTBJbnZhbGlkVmFsdWUBAQUoSW52YWxpZEZlZQEBBTRQZW5kaW5nUGF5b3V0AQEFJFByZW1hdHVyZQEBBVBIYXNBY3RpdmVDaGlsZEJvdW50eQEBBTRUb29NYW55UXVldWVkAQEFNENoaWxkQm91bnRpZXMBAgxUUGFyZW50Qm91bnR5Tm90QWN0aXZlAQEFZEluc3VmZmljaWVudEJvdW50eUJhbGFuY2UBAQVQVG9vTWFueUNoaWxkQm91bnRpZXMBAQVoRWxlY3Rpb25Qcm92aWRlck11bHRpUGhhc2UBAjxoUHJlRGlzcGF0Y2hFYXJseVN1Ym1pc3Npb24BAQVsUHJlRGlzcGF0Y2hXcm9uZ1dpbm5lckNvdW50AQEFZFByZURpc3BhdGNoV2Vha1N1Ym1pc3Npb24BAQU8U2lnbmVkUXVldWVGdWxsAQEFWFNpZ25lZENhbm5vdFBheURlcG9zaXQBAQVQU2lnbmVkSW52YWxpZFdpdG5lc3MBAQVMU2lnbmVkVG9vTXVjaFdlaWdodAEBBTxPY3dDYWxsV3JvbmdFcmEBAQVcTWlzc2luZ1NuYXBzaG90TWV0YWRhdGEBAQVYSW52YWxpZFN1Ym1pc3Npb25JbmRleAEBBThDYWxsTm90QWxsb3dlZAEBBThGYWxsYmFja0ZhaWxlZAEBBSxCb3VuZE5vdE1ldAEBBThUb29NYW55V2lubmVycwEBBWRQcmVEaXNwYXRjaERpZmZlcmVudFJvdW5kAQEFDE5pcwECPEBEdXJhdGlvblRvb1NtYWxsAQEFOER1cmF0aW9uVG9vQmlnAQEFOEFtb3VudFRvb1NtYWxsAQEFJEJpZFRvb0xvdwEBBThVbmtub3duUmVjZWlwdAEBBSBOb3RPd25lcgEBBShOb3RFeHBpcmVkAQEFKFVua25vd25CaWQBAQU0UG9ydGlvblRvb0JpZwEBBSBVbmZ1bmRlZAEBBTRBbHJlYWR5RnVuZGVkAQEFJFRocm90dGxlZAEBBSRNYWtlc0R1c3QBAQU8QWxyZWFkeUNvbW11bmFsAQEFOEFscmVhZHlQcml2YXRlAQEFWE5pc0NvdW50ZXJwYXJ0QmFsYW5jZXMBAjA4VmVzdGluZ0JhbGFuY2UBAQVUTGlxdWlkaXR5UmVzdHJpY3Rpb25zAQEFTEluc3VmZmljaWVudEJhbGFuY2UBAQVIRXhpc3RlbnRpYWxEZXBvc2l0AQEFNEV4cGVuZGFiaWxpdHkBAQVcRXhpc3RpbmdWZXN0aW5nU2NoZWR1bGUBAQUsRGVhZEFjY291bnQBAQU8VG9vTWFueVJlc2VydmVzAQEFMFRvb01hbnlIb2xkcwEBBThUb29NYW55RnJlZXplcwEBBUxJc3N1YW5jZURlYWN0aXZhdGVkAQEFJERlbHRhWmVybwEBBSRWb3Rlckxpc3QBAgQQTGlzdAECECREdXBsaWNhdGUBAQUoTm90SGVhdmllcgEBBTBOb3RJblNhbWVCYWcBAQUwTm9kZU5vdEZvdW5kAQEFPE5vbWluYXRpb25Qb29scwECkDBQb29sTm90Rm91bmQBAQVIUG9vbE1lbWJlck5vdEZvdW5kAQEFSFJld2FyZFBvb2xOb3RGb3VuZAEBBUBTdWJQb29sc05vdEZvdW5kAQEFZEFjY291bnRCZWxvbmdzVG9PdGhlclBvb2wBAQU4RnVsbHlVbmJvbmRpbmcBAQVETWF4VW5ib25kaW5nTGltaXQBAQVEQ2Fubm90V2l0aGRyYXdBbnkBAQVETWluaW11bUJvbmROb3RNZXQBAQUwT3ZlcmZsb3dSaXNrAQEFNE5vdERlc3Ryb3lpbmcBAQUwTm90Tm9taW5hdG9yAQEFVE5vdEtpY2tlck9yRGVzdHJveWluZwEBBRxOb3RPcGVuAQEFIE1heFBvb2xzAQEFOE1heFBvb2xNZW1iZXJzAQEFRENhbk5vdENoYW5nZVN0YXRlAQEFVERvZXNOb3RIYXZlUGVybWlzc2lvbgEBBVRNZXRhZGF0YUV4Y2VlZHNNYXhMZW4BAQUkRGVmZW5zaXZlAQIcaE5vdEVub3VnaFNwYWNlSW5VbmJvbmRQb29sAQEFMFBvb2xOb3RGb3VuZAEBBUhSZXdhcmRQb29sTm90Rm91bmQBAQVAU3ViUG9vbHNOb3RGb3VuZAEBBXBCb25kZWRTdGFzaEtpbGxlZFByZW1hdHVyZWx5AQEFVERlbGVnYXRpb25VbnN1cHBvcnRlZAEBBTxTbGFzaE5vdEFwcGxpZWQBAQWcUGFydGlhbFVuYm9uZE5vdEFsbG93ZWRQZXJtaXNzaW9ubGVzc2x5AQEFXE1heENvbW1pc3Npb25SZXN0cmljdGVkAQEFYENvbW1pc3Npb25FeGNlZWRzTWF4aW11bQEBBXhDb21taXNzaW9uRXhjZWVkc0dsb2JhbE1heGltdW0BAQVkQ29tbWlzc2lvbkNoYW5nZVRocm90dGxlZAEBBXhDb21taXNzaW9uQ2hhbmdlUmF0ZU5vdEFsbG93ZWQBAQVMTm9QZW5kaW5nQ29tbWlzc2lvbgEBBVhOb0NvbW1pc3Npb25DdXJyZW50U2V0AQEFLFBvb2xJZEluVXNlAQEFNEludmFsaWRQb29sSWQBAQVMQm9uZEV4dHJhUmVzdHJpY3RlZAEBBTxOb3RoaW5nVG9BZGp1c3QBAQU4Tm90aGluZ1RvU2xhc2gBAQU8QWxyZWFkeU1pZ3JhdGVkAQEFLE5vdE1pZ3JhdGVkAQEFME5vdFN1cHBvcnRlZAEBBSxGYXN0VW5zdGFrZQECGDROb3RDb250cm9sbGVyAQEFNEFscmVhZHlRdWV1ZWQBAQU4Tm90RnVsbHlCb25kZWQBAQUkTm90UXVldWVkAQEFLEFscmVhZHlIZWFkAQEFOENhbGxOb3RBbGxvd2VkAQEFQFBhcmFjaGFpbnNPcmlnaW4BAQU0Q29uZmlndXJhdGlvbgECBDxJbnZhbGlkTmV3VmFsdWUBAQUsUGFyYXNTaGFyZWQBAQU0UGFyYUluY2x1c2lvbgECSGRWYWxpZGF0b3JJbmRleE91dE9mQm91bmRzAQEFUFVuc2NoZWR1bGVkQ2FuZGlkYXRlAQEFQEhlYWREYXRhVG9vTGFyZ2UBAQVQUHJlbWF0dXJlQ29kZVVwZ3JhZGUBAQU8TmV3Q29kZVRvb0xhcmdlAQEFVERpc2FsbG93ZWRSZWxheVBhcmVudAEBBURJbnZhbGlkQXNzaWdubWVudAEBBURJbnZhbGlkR3JvdXBJbmRleAEBBUxJbnN1ZmZpY2llbnRCYWNraW5nAQEFOEludmFsaWRCYWNraW5nAQEFRE5vdENvbGxhdG9yU2lnbmVkAQEFaFZhbGlkYXRpb25EYXRhSGFzaE1pc21hdGNoAQEFgEluY29ycmVjdERvd253YXJkTWVzc2FnZUhhbmRsaW5nAQEFVEludmFsaWRVcHdhcmRNZXNzYWdlcwEBBWBIcm1wV2F0ZXJtYXJrTWlzaGFuZGxpbmcBAQVMSW52YWxpZE91dGJvdW5kSHJtcAEBBWRJbnZhbGlkVmFsaWRhdGlvbkNvZGVIYXNoAQEFQFBhcmFIZWFkTWlzbWF0Y2gBAQUwUGFyYUluaGVyZW50AQIUZFRvb01hbnlJbmNsdXNpb25JbmhlcmVudHMBAQVMSW52YWxpZFBhcmVudEhlYWRlcgEBBUhJbmhlcmVudE92ZXJ3ZWlnaHQBAQWEQ2FuZGlkYXRlc0ZpbHRlcmVkRHVyaW5nRXhlY3V0aW9uAQEFUFVuc2NoZWR1bGVkQ2FuZGlkYXRlAQEFNFBhcmFTY2hlZHVsZXIBAQUUUGFyYXMBAjQ0Tm90UmVnaXN0ZXJlZAEBBTRDYW5ub3RPbmJvYXJkAQEFOENhbm5vdE9mZmJvYXJkAQEFNENhbm5vdFVwZ3JhZGUBAQU8Q2Fubm90RG93bmdyYWRlAQEFWFB2ZkNoZWNrU3RhdGVtZW50U3RhbGUBAQVcUHZmQ2hlY2tTdGF0ZW1lbnRGdXR1cmUBAQWEUHZmQ2hlY2tWYWxpZGF0b3JJbmRleE91dE9mQm91bmRzAQEFYFB2ZkNoZWNrSW52YWxpZFNpZ25hdHVyZQEBBUhQdmZDaGVja0RvdWJsZVZvdGUBAQVYUHZmQ2hlY2tTdWJqZWN0SW52YWxpZAEBBURDYW5ub3RVcGdyYWRlQ29kZQEBBSxJbnZhbGlkQ29kZQEBBSxJbml0aWFsaXplcgEBBQxEbXABAQUQSHJtcAECUFRPcGVuSHJtcENoYW5uZWxUb1NlbGYBAQV8T3BlbkhybXBDaGFubmVsSW52YWxpZFJlY2lwaWVudAEBBWxPcGVuSHJtcENoYW5uZWxaZXJvQ2FwYWNpdHkBAQWMT3BlbkhybXBDaGFubmVsQ2FwYWNpdHlFeGNlZWRzTGltaXQBAQV4T3BlbkhybXBDaGFubmVsWmVyb01lc3NhZ2VTaXplAQEFmE9wZW5Icm1wQ2hhbm5lbE1lc3NhZ2VTaXplRXhjZWVkc0xpbWl0AQEFcE9wZW5Icm1wQ2hhbm5lbEFscmVhZHlFeGlzdHMBAQV8T3BlbkhybXBDaGFubmVsQWxyZWFkeVJlcXVlc3RlZAEBBXBPcGVuSHJtcENoYW5uZWxMaW1pdEV4Y2VlZGVkAQEFcEFjY2VwdEhybXBDaGFubmVsRG9lc250RXhpc3QBAQWEQWNjZXB0SHJtcENoYW5uZWxBbHJlYWR5Q29uZmlybWVkAQEFeEFjY2VwdEhybXBDaGFubmVsTGltaXRFeGNlZWRlZAEBBXBDbG9zZUhybXBDaGFubmVsVW5hdXRob3JpemVkAQEFbENsb3NlSHJtcENoYW5uZWxEb2VzbnRFeGlzdAEBBXxDbG9zZUhybXBDaGFubmVsQWxyZWFkeVVuZGVyd2F5AQEFhENhbmNlbEhybXBPcGVuQ2hhbm5lbFVuYXV0aG9yaXplZAEBBWhPcGVuSHJtcENoYW5uZWxEb2VzbnRFeGlzdAEBBXxPcGVuSHJtcENoYW5uZWxBbHJlYWR5Q29uZmlybWVkAQEFMFdyb25nV2l0bmVzcwEBBXBDaGFubmVsQ3JlYXRpb25Ob3RBdXRob3JpemVkAQEFPFBhcmFTZXNzaW9uSW5mbwEBBTRQYXJhc0Rpc3B1dGVzAQIkdER1cGxpY2F0ZURpc3B1dGVTdGF0ZW1lbnRTZXRzAQEFXEFuY2llbnREaXNwdXRlU3RhdGVtZW50AQEFZFZhbGlkYXRvckluZGV4T3V0T2ZCb3VuZHMBAQVASW52YWxpZFNpZ25hdHVyZQEBBUhEdXBsaWNhdGVTdGF0ZW1lbnQBAQVIU2luZ2xlU2lkZWREaXNwdXRlAQEFPE1hbGljaW91c0JhY2tlcgEBBUxNaXNzaW5nQmFja2luZ1ZvdGVzAQEFSFVuY29uZmlybWVkRGlzcHV0ZQEBBTRQYXJhc1NsYXNoaW5nAQIYYEludmFsaWRLZXlPd25lcnNoaXBQcm9vZgEBBUxJbnZhbGlkU2Vzc2lvbkluZGV4AQEFUEludmFsaWRDYW5kaWRhdGVIYXNoAQEFVEludmFsaWRWYWxpZGF0b3JJbmRleAEBBWBWYWxpZGF0b3JJbmRleElkTWlzbWF0Y2gBAQVcRHVwbGljYXRlU2xhc2hpbmdSZXBvcnQBAQVoT25EZW1hbmRBc3NpZ25tZW50UHJvdmlkZXIBAggkUXVldWVGdWxsAQEFcFNwb3RQcmljZUhpZ2hlclRoYW5NYXhBbW91bnQBAQVoQ29yZXRpbWVBc3NpZ25tZW50UHJvdmlkZXIBAhhAQXNzaWdubWVudHNFbXB0eQEBBTRPdmVyU2NoZWR1bGVkAQEFOFVuZGVyU2NoZWR1bGVkAQEFQERpc2FsbG93ZWRJbnNlcnQBAQU8RHVwbGljYXRlSW5zZXJ0AQEFUEFzc2lnbm1lbnRzTm90U29ydGVkAQEFJFJlZ2lzdHJhcgECODROb3RSZWdpc3RlcmVkAQEFREFscmVhZHlSZWdpc3RlcmVkAQEFIE5vdE93bmVyAQEFMENvZGVUb29MYXJnZQEBBUBIZWFkRGF0YVRvb0xhcmdlAQEFME5vdFBhcmFjaGFpbgEBBTROb3RQYXJhdGhyZWFkAQEFQENhbm5vdERlcmVnaXN0ZXIBAQU8Q2Fubm90RG93bmdyYWRlAQEFNENhbm5vdFVwZ3JhZGUBAQUoUGFyYUxvY2tlZAEBBSxOb3RSZXNlcnZlZAEBBSxJbnZhbGlkQ29kZQEBBShDYW5ub3RTd2FwAQEFFFNsb3RzAQIIRFBhcmFOb3RPbmJvYXJkaW5nAQEFKExlYXNlRXJyb3IBAQUgQXVjdGlvbnMBAhxEQXVjdGlvbkluUHJvZ3Jlc3MBAQVETGVhc2VQZXJpb2RJblBhc3QBAQVEUGFyYU5vdFJlZ2lzdGVyZWQBAQVETm90Q3VycmVudEF1Y3Rpb24BAQUoTm90QXVjdGlvbgEBBTBBdWN0aW9uRW5kZWQBAQVAQWxyZWFkeUxlYXNlZE91dAEBBSRDcm93ZGxvYW4BAlxERmlyc3RQZXJpb2RJblBhc3QBAQVkRmlyc3RQZXJpb2RUb29GYXJJbkZ1dHVyZQEBBWxMYXN0UGVyaW9kQmVmb3JlRmlyc3RQZXJpb2QBAQVgTGFzdFBlcmlvZFRvb0ZhckluRnV0dXJlAQEFPENhbm5vdEVuZEluUGFzdAEBBURFbmRUb29GYXJJbkZ1dHVyZQEBBSBPdmVyZmxvdwEBBVBDb250cmlidXRpb25Ub29TbWFsbAEBBTRJbnZhbGlkUGFyYUlkAQEFLENhcEV4Y2VlZGVkAQEFWENvbnRyaWJ1dGlvblBlcmlvZE92ZXIBAQU0SW52YWxpZE9yaWdpbgEBBTBOb3RQYXJhY2hhaW4BAQUsTGVhc2VBY3RpdmUBAQVAQmlkT3JMZWFzZUFjdGl2ZQEBBTBGdW5kTm90RW5kZWQBAQU8Tm9Db250cmlidXRpb25zAQEFSE5vdFJlYWR5VG9EaXNzb2x2ZQEBBUBJbnZhbGlkU2lnbmF0dXJlAQEFME1lbW9Ub29MYXJnZQEBBURBbHJlYWR5SW5OZXdSYWlzZQEBBUhWcmZEZWxheUluUHJvZ3Jlc3MBAQU0Tm9MZWFzZVBlcmlvZAEBBSBDb3JldGltZQECDCROb3RCcm9rZXIBAQVYUmVxdWVzdGVkRnV0dXJlUmV2ZW51ZQEBBUxBc3NldFRyYW5zZmVyRmFpbGVkAQEFJFhjbVBhbGxldAECYCxVbnJlYWNoYWJsZQEBBSxTZW5kRmFpbHVyZQEBBSBGaWx0ZXJlZAEBBUhVbndlaWdoYWJsZU1lc3NhZ2UBAQVgRGVzdGluYXRpb25Ob3RJbnZlcnRpYmxlAQEFFEVtcHR5AQEFOENhbm5vdFJlYW5jaG9yAQEFNFRvb01hbnlBc3NldHMBAQU0SW52YWxpZE9yaWdpbgEBBShCYWRWZXJzaW9uAQEFLEJhZExvY2F0aW9uAQEFOE5vU3Vic2NyaXB0aW9uAQEFREFscmVhZHlTdWJzY3JpYmVkAQEFWENhbm5vdENoZWNrT3V0VGVsZXBvcnQBAQUoTG93QmFsYW5jZQEBBTBUb29NYW55TG9ja3MBAQVMQWNjb3VudE5vdFNvdmVyZWlnbgEBBShGZWVzTm90TWV0AQEFMExvY2tOb3RGb3VuZAEBBRRJblVzZQEBBWhJbnZhbGlkQXNzZXRVbmtub3duUmVzZXJ2ZQEBBXhJbnZhbGlkQXNzZXRVbnN1cHBvcnRlZFJlc2VydmUBAQU8VG9vTWFueVJlc2VydmVzAQEFYExvY2FsRXhlY3V0aW9uSW5jb21wbGV0ZQEBBTBNZXNzYWdlUXVldWUBAiQsTm90UmVhcGFibGUBAQUYTm9QYWdlAQEFJE5vTWVzc2FnZQEBBUBBbHJlYWR5UHJvY2Vzc2VkAQEFGFF1ZXVlZAEBBUhJbnN1ZmZpY2llbnRXZWlnaHQBAQVgVGVtcG9yYXJpbHlVbnByb2Nlc3NhYmxlAQEFLFF1ZXVlUGF1c2VkAQEFTFJlY3Vyc2l2ZURpc2FsbG93ZWQBAQUkQXNzZXRSYXRlAQIMQFVua25vd25Bc3NldEtpbmQBAQU0QWxyZWFkeUV4aXN0cwEBBSBPdmVyZmxvdwEBBRRCZWVmeQECEGBJbnZhbGlkS2V5T3duZXJzaGlwUHJvb2YBAQVgSW52YWxpZEVxdWl2b2NhdGlvblByb29mAQEFWER1cGxpY2F0ZU9mZmVuY2VSZXBvcnQBAQVQSW52YWxpZENvbmZpZ3VyYXRpb24BAQUMTW1yAQEFMEJlZWZ5TW1yTGVhZgEBBURDb25zdW1lclJlbWFpbmluZwEBBSxOb1Byb3ZpZGVycwEBBUBUb29NYW55Q29uc3VtZXJzAQEFFFRva2VuAQIoQEZ1bmRzVW5hdmFpbGFibGUBAQUwT25seVByb3ZpZGVyAQEFMEJlbG93TWluaW11bQEBBTBDYW5ub3RDcmVhdGUBAQUwVW5rbm93bkFzc2V0AQEFGEZyb3plbgEBBSxVbnN1cHBvcnRlZAEBBUBDYW5ub3RDcmVhdGVIb2xkAQEFNE5vdEV4cGVuZGFibGUBAQUcQmxvY2tlZAEBBShBcml0aG1ldGljAQIMJFVuZGVyZmxvdwEBBSBPdmVyZmxvdwEBBThEaXZpc2lvbkJ5WmVybwEBBTRUcmFuc2FjdGlvbmFsAQIIMExpbWl0UmVhY2hlZAEBBRxOb0xheWVyAQEFJEV4aGF1c3RlZAEBBShDb3JydXB0aW9uAQEFLFVuYXZhaWxhYmxlAQEFOFJvb3ROb3RBbGxvd2VkAQEFAhxARXh0cmluc2ljU3VjY2VzcwEABDRkaXNwYXRjaF9pbmZvQDxFeHRyaW5zaWNGYWlsZWQBAAg4ZGlzcGF0Y2hfZXJyb3JxCzRkaXNwYXRjaF9pbmZvQCxDb2RlVXBkYXRlZAEBBShOZXdBY2NvdW50AQAEHGFjY291bnQANEtpbGxlZEFjY291bnQBAAQcYWNjb3VudAAgUmVtYXJrZWQBAAgYc2VuZGVyABBoYXNoIERVcGdyYWRlQXV0aG9yaXplZAEACCRjb2RlX2hhc2ggNGNoZWNrX3ZlcnNpb24UAggMQXllAQECDE5heQEBAgAMJGJhcmVfYXllcwQQYXllcwQQbmF5cwQCFCxNZW1iZXJBZGRlZAEABAx3aG8ALFJhbmtDaGFuZ2VkAQAIDHdobwAQcmFuawQ0TWVtYmVyUmVtb3ZlZAEACAx3aG8AEHJhbmsEFFZvdGVkAQAQDHdobwAQcG9sbAQQdm90ZXkLFHRhbGx5fQs8TWVtYmVyRXhjaGFuZ2VkAQAIDHdobwAcbmV3X3dobwACQCRTdWJtaXR0ZWQBAAwUaW5kZXgEFHRyYWNrBCBwcm9wb3NhbKUBVERlY2lzaW9uRGVwb3NpdFBsYWNlZAEADBRpbmRleAQMd2hvABhhbW91bnQIXERlY2lzaW9uRGVwb3NpdFJlZnVuZGVkAQAMFGluZGV4BAx3aG8AGGFtb3VudAg4RGVwb3NpdFNsYXNoZWQBAAgMd2hvABhhbW91bnQIPERlY2lzaW9uU3RhcnRlZAEAEBRpbmRleAQUdHJhY2sEIHByb3Bvc2FspQEUdGFsbHl9CzhDb25maXJtU3RhcnRlZAEABBRpbmRleAQ4Q29uZmlybUFib3J0ZWQBAAQUaW5kZXgEJENvbmZpcm1lZAEACBRpbmRleAQUdGFsbHl9CyBBcHByb3ZlZAEABBRpbmRleAQgUmVqZWN0ZWQBAAgUaW5kZXgEFHRhbGx5fQsgVGltZWRPdXQBAAgUaW5kZXgEFHRhbGx5fQskQ2FuY2VsbGVkAQAIFGluZGV4BBR0YWxseX0LGEtpbGxlZAEACBRpbmRleAQUdGFsbHl9C2RTdWJtaXNzaW9uRGVwb3NpdFJlZnVuZGVkAQAMFGluZGV4BAx3aG8AGGFtb3VudAgsTWV0YWRhdGFTZXQBAAgUaW5kZXgEEGhhc2ggPE1ldGFkYXRhQ2xlYXJlZAEACBRpbmRleAQQaGFzaCAACCRwb3N0X2luZm+1ARRlcnJvcnELB7UBiQsCDDxDYWxsV2hpdGVsaXN0ZWQBAAQkY2FsbF9oYXNoIFhXaGl0ZWxpc3RlZENhbGxSZW1vdmVkAQAEJGNhbGxfaGFzaCBkV2hpdGVsaXN0ZWRDYWxsRGlzcGF0Y2hlZAEACCRjYWxsX2hhc2ggGHJlc3VsdI0LBxUBcQsCGEBCYXRjaEludGVycnVwdGVkAQAIFGluZGV4BBRlcnJvcnELOEJhdGNoQ29tcGxldGVkAQEFYEJhdGNoQ29tcGxldGVkV2l0aEVycm9ycwEBBTRJdGVtQ29tcGxldGVkAQEFKEl0ZW1GYWlsZWQBAAQUZXJyb3JxCzBEaXNwYXRjaGVkQXMBAAQYcmVzdWx0lQsAECxtYXhfbWVtYmVycwQobWF4X2ludGFrZQQsbWF4X3N0cmlrZXMERGNhbmRpZGF0ZV9kZXBvc2l0CAJEHEZvdW5kZWQBAAQcZm91bmRlcgAMQmlkAQAIMGNhbmRpZGF0ZV9pZAAUb2ZmZXIIFFZvdWNoAQAMMGNhbmRpZGF0ZV9pZAAUb2ZmZXIIIHZvdWNoaW5nACRBdXRvVW5iaWQBAAQkY2FuZGlkYXRlABRVbmJpZAEABCRjYW5kaWRhdGUAHFVudm91Y2gBAAQkY2FuZGlkYXRlACBJbmR1Y3RlZAEACBxwcmltYXJ5AChjYW5kaWRhdGVz3QNgU3VzcGVuZGVkTWVtYmVySnVkZ2VtZW50AQAIDHdobwAYanVkZ2VkFEhDYW5kaWRhdGVTdXNwZW5kZWQBAAQkY2FuZGlkYXRlADxNZW1iZXJTdXNwZW5kZWQBAAQYbWVtYmVyAChDaGFsbGVuZ2VkAQAEGG1lbWJlcgAQVm90ZQEADCRjYW5kaWRhdGUAFHZvdGVyABB2b3RlFDBEZWZlbmRlclZvdGUBAAgUdm90ZXIAEHZvdGUUJE5ld1BhcmFtcwEABBhwYXJhbXOdCyRVbmZvdW5kZWQBAAQcZm91bmRlcgAcRGVwb3NpdAEABBR2YWx1ZQggRWxldmF0ZWQBAAgYbWVtYmVyABByYW5rBAIYPFJlY292ZXJ5Q3JlYXRlZAEABBxhY2NvdW50AERSZWNvdmVyeUluaXRpYXRlZAEACDBsb3N0X2FjY291bnQAPHJlc2N1ZXJfYWNjb3VudAA8UmVjb3ZlcnlWb3VjaGVkAQAMMGxvc3RfYWNjb3VudAA8cmVzY3Vlcl9hY2NvdW50ABhzZW5kZXIAOFJlY292ZXJ5Q2xvc2VkAQAIMGxvc3RfYWNjb3VudAA8cmVzY3Vlcl9hY2NvdW50AEBBY2NvdW50UmVjb3ZlcmVkAQAIMGxvc3RfYWNjb3VudAA8cmVzY3Vlcl9hY2NvdW50ADxSZWNvdmVyeVJlbW92ZWQBAAQwbG9zdF9hY2NvdW50AAIkJFNjaGVkdWxlZAEACBB3aGVuBBRpbmRleAQgQ2FuY2VsZWQBAAgQd2hlbgQUaW5kZXgEKERpc3BhdGNoZWQBAAwQdGFzaw0BCGlkEQEYcmVzdWx0lQsgUmV0cnlTZXQBABAQdGFzaw0BCGlkEQEYcGVyaW9kBBxyZXRyaWVzBDhSZXRyeUNhbmNlbGxlZAEACBB0YXNrDQEIaWQRATxDYWxsVW5hdmFpbGFibGUBAAgQdGFzaw0BCGlkEQE4UGVyaW9kaWNGYWlsZWQBAAgQdGFzaw0BCGlkEQEsUmV0cnlGYWlsZWQBAAgQdGFzaw0BCGlkEQFUUGVybWFuZW50bHlPdmVyd2VpZ2h0AQAIEHRhc2sNAQhpZBEBAiQMQW55AQEFLE5vblRyYW5zZmVyAQEFKEdvdmVybmFuY2UBAQUcU3Rha2luZwEBBSxDYW5jZWxQcm94eQEBBRxBdWN0aW9uAQEFHFNvY2lldHkBAQU8Tm9taW5hdGlvblBvb2xzAQEFMFNwb2tlc3BlcnNvbgEBBQIUNFByb3h5RXhlY3V0ZWQBAAQYcmVzdWx0lQssUHVyZUNyZWF0ZWQBABAQcHVyZQAMd2hvAChwcm94eV90eXBlrQtQZGlzYW1iaWd1YXRpb25faW5kZXgEJEFubm91bmNlZAEADBByZWFsABRwcm94eQAkY2FsbF9oYXNoIChQcm94eUFkZGVkAQAQJGRlbGVnYXRvcgAkZGVsZWdhdGVlAChwcm94eV90eXBlrQsUZGVsYXkEMFByb3h5UmVtb3ZlZAEAECRkZWxlZ2F0b3IAJGRlbGVnYXRlZQAocHJveHlfdHlwZa0LFGRlbGF5BAIQLE5ld011bHRpc2lnAQAMJGFwcHJvdmluZwAgbXVsdGlzaWcAJGNhbGxfaGFzaCBATXVsdGlzaWdBcHByb3ZhbAEAECRhcHByb3ZpbmcAJHRpbWVwb2ludPEBIG11bHRpc2lnACRjYWxsX2hhc2ggQE11bHRpc2lnRXhlY3V0ZWQBABQkYXBwcm92aW5nACR0aW1lcG9pbnTxASBtdWx0aXNpZwAkY2FsbF9oYXNoIBhyZXN1bHSVC0RNdWx0aXNpZ0NhbmNlbGxlZAEAEChjYW5jZWxsaW5nACR0aW1lcG9pbnTxASBtdWx0aXNpZwAkY2FsbF9oYXNoIAIcJEJpZFBsYWNlZAEADAx3aG8AGGFtb3VudAggZHVyYXRpb24EMEJpZFJldHJhY3RlZAEADAx3aG8AGGFtb3VudAggZHVyYXRpb24EKEJpZERyb3BwZWQBAAwMd2hvABhhbW91bnQIIGR1cmF0aW9uBBhJc3N1ZWQBABQUaW5kZXgEGGV4cGlyeQQMd2hvAChwcm9wb3J0aW9uCBhhbW91bnQIGFRoYXdlZAEAFBRpbmRleAQMd2hvAChwcm9wb3J0aW9uCBhhbW91bnQIHGRyb3BwZWQUGEZ1bmRlZAEABBxkZWZpY2l0CCxUcmFuc2ZlcnJlZAEADBBmcm9tAAh0bwAUaW5kZXgEAhQgVW5zdGFrZWQBAAgUc3Rhc2gAGHJlc3VsdJULHFNsYXNoZWQBAAgUc3Rhc2gAGGFtb3VudAgwQmF0Y2hDaGVja2VkAQAEEGVyYXM5AjRCYXRjaEZpbmlzaGVkAQAEEHNpemUENEludGVybmFsRXJyb3IBAQUCKBxDcmVhdGVkAQAEHHBhcmFfaWQELENvbnRyaWJ1dGVkAQAMDHdobwAoZnVuZF9pbmRleAQYYW1vdW50CCBXaXRoZHJldwEADAx3aG8AKGZ1bmRfaW5kZXgEGGFtb3VudAhEUGFydGlhbGx5UmVmdW5kZWQBAAQccGFyYV9pZAQsQWxsUmVmdW5kZWQBAAQccGFyYV9pZAQkRGlzc29sdmVkAQAEHHBhcmFfaWQEPEhhbmRsZUJpZFJlc3VsdAEACBxwYXJhX2lkBBhyZXN1bHSVCxhFZGl0ZWQBAAQccGFyYV9pZAQsTWVtb1VwZGF0ZWQBAAwMd2hvABxwYXJhX2lkBBBtZW1vJDxBZGRlZFRvTmV3UmFpc2UBAAQccGFyYV9pZAQCtBhTeXN0ZW0BAhxARXh0cmluc2ljU3VjY2VzcwEABDRkaXNwYXRjaF9pbmZvQDxFeHRyaW5zaWNGYWlsZWQBAAg4ZGlzcGF0Y2hfZXJyb3JxCzRkaXNwYXRjaF9pbmZvQCxDb2RlVXBkYXRlZAEBBShOZXdBY2NvdW50AQAEHGFjY291bnQANEtpbGxlZEFjY291bnQBAAQcYWNjb3VudAAgUmVtYXJrZWQBAAgYc2VuZGVyABBoYXNoIERVcGdyYWRlQXV0aG9yaXplZAEACCRjb2RlX2hhc2ggNGNoZWNrX3ZlcnNpb24UHEluZGljZXMBAgw0SW5kZXhBc3NpZ25lZAEACAx3aG8AFGluZGV4BChJbmRleEZyZWVkAQAEFGluZGV4BCxJbmRleEZyb3plbgEACBRpbmRleAQMd2hvACBCYWxhbmNlcwECWBxFbmRvd2VkAQAIHGFjY291bnQAMGZyZWVfYmFsYW5jZQggRHVzdExvc3QBAAgcYWNjb3VudAAYYW1vdW50CCBUcmFuc2ZlcgEADBBmcm9tAAh0bwAYYW1vdW50CChCYWxhbmNlU2V0AQAIDHdobwAQZnJlZQggUmVzZXJ2ZWQBAAgMd2hvABhhbW91bnQIKFVucmVzZXJ2ZWQBAAgMd2hvABhhbW91bnQISFJlc2VydmVSZXBhdHJpYXRlZAEAEBBmcm9tAAh0bwAYYW1vdW50CEhkZXN0aW5hdGlvbl9zdGF0dXMpARxEZXBvc2l0AQAIDHdobwAYYW1vdW50CCBXaXRoZHJhdwEACAx3aG8AGGFtb3VudAgcU2xhc2hlZAEACAx3aG8AGGFtb3VudAgYTWludGVkAQAIDHdobwAYYW1vdW50CBhCdXJuZWQBAAgMd2hvABhhbW91bnQIJFN1c3BlbmRlZAEACAx3aG8AGGFtb3VudAggUmVzdG9yZWQBAAgMd2hvABhhbW91bnQIIFVwZ3JhZGVkAQAEDHdobwAYSXNzdWVkAQAEGGFtb3VudAgkUmVzY2luZGVkAQAEGGFtb3VudAgYTG9ja2VkAQAIDHdobwAYYW1vdW50CCBVbmxvY2tlZAEACAx3aG8AGGFtb3VudAgYRnJvemVuAQAIDHdobwAYYW1vdW50CBhUaGF3ZWQBAAgMd2hvABhhbW91bnQITFRvdGFsSXNzdWFuY2VGb3JjZWQBAAgMb2xkCAxuZXcISFRyYW5zYWN0aW9uUGF5bWVudAECBEhUcmFuc2FjdGlvbkZlZVBhaWQBAAwMd2hvAChhY3R1YWxfZmVlCAx0aXAIHFN0YWtpbmcBAkgcRXJhUGFpZAEADCRlcmFfaW5kZXgEQHZhbGlkYXRvcl9wYXlvdXQIJHJlbWFpbmRlcgggUmV3YXJkZWQBAAwUc3Rhc2gAEGRlc3Q1ARhhbW91bnQIHFNsYXNoZWQBAAgYc3Rha2VyABhhbW91bnQINFNsYXNoUmVwb3J0ZWQBAAwkdmFsaWRhdG9yACBmcmFjdGlvbgQkc2xhc2hfZXJhBGhPbGRTbGFzaGluZ1JlcG9ydERpc2NhcmRlZAEABDRzZXNzaW9uX2luZGV4BDhTdGFrZXJzRWxlY3RlZAEBBRhCb25kZWQBAAgUc3Rhc2gAGGFtb3VudAggVW5ib25kZWQBAAgUc3Rhc2gAGGFtb3VudAgkV2l0aGRyYXduAQAIFHN0YXNoABhhbW91bnQIGEtpY2tlZAEACCRub21pbmF0b3IAFHN0YXNoAFRTdGFraW5nRWxlY3Rpb25GYWlsZWQBAQUcQ2hpbGxlZAEABBRzdGFzaAA0UGF5b3V0U3RhcnRlZAEACCRlcmFfaW5kZXgEPHZhbGlkYXRvcl9zdGFzaABEVmFsaWRhdG9yUHJlZnNTZXQBAAgUc3Rhc2gAFHByZWZzOQFoU25hcHNob3RWb3RlcnNTaXplRXhjZWVkZWQBAAQQc2l6ZQRsU25hcHNob3RUYXJnZXRzU2l6ZUV4Y2VlZGVkAQAEEHNpemUEIEZvcmNlRXJhAQAEEG1vZGU9AWRDb250cm9sbGVyQmF0Y2hEZXByZWNhdGVkAQAEIGZhaWx1cmVzBCBPZmZlbmNlcwECBBxPZmZlbmNlAQAIEGtpbmRFASB0aW1lc2xvdCQcU2Vzc2lvbgECBChOZXdTZXNzaW9uAQAENHNlc3Npb25faW5kZXgEHEdyYW5kcGEBAgw4TmV3QXV0aG9yaXRpZXMBAAQ0YXV0aG9yaXR5X3NldFUBGFBhdXNlZAEBBRxSZXN1bWVkAQEFIFRyZWFzdXJ5AQIwIFNwZW5kaW5nAQAEQGJ1ZGdldF9yZW1haW5pbmcIHEF3YXJkZWQBAAw4cHJvcG9zYWxfaW5kZXgEFGF3YXJkCBxhY2NvdW50ABRCdXJudAEABCxidXJudF9mdW5kcwggUm9sbG92ZXIBAARAcm9sbG92ZXJfYmFsYW5jZQgcRGVwb3NpdAEABBR2YWx1ZQg0U3BlbmRBcHByb3ZlZAEADDhwcm9wb3NhbF9pbmRleAQYYW1vdW50CCxiZW5lZmljaWFyeQA8VXBkYXRlZEluYWN0aXZlAQAILHJlYWN0aXZhdGVkCCxkZWFjdGl2YXRlZAhIQXNzZXRTcGVuZEFwcHJvdmVkAQAYFGluZGV4BChhc3NldF9raW5kgQEYYW1vdW50CCxiZW5lZmljaWFyeZkBKHZhbGlkX2Zyb20EJGV4cGlyZV9hdARAQXNzZXRTcGVuZFZvaWRlZAEABBRpbmRleAQQUGFpZAEACBRpbmRleAQocGF5bWVudF9pZAg0UGF5bWVudEZhaWxlZAEACBRpbmRleAQocGF5bWVudF9pZAg4U3BlbmRQcm9jZXNzZWQBAAQUaW5kZXgEQENvbnZpY3Rpb25Wb3RpbmcBAggkRGVsZWdhdGVkAQQAAQgsVW5kZWxlZ2F0ZWQBAQEkUmVmZXJlbmRhAQJAJFN1Ym1pdHRlZAEADBRpbmRleAQUdHJhY2sEIHByb3Bvc2FspQFURGVjaXNpb25EZXBvc2l0UGxhY2VkAQAMFGluZGV4BAx3aG8AGGFtb3VudAhcRGVjaXNpb25EZXBvc2l0UmVmdW5kZWQBAAwUaW5kZXgEDHdobwAYYW1vdW50CDhEZXBvc2l0U2xhc2hlZAEACAx3aG8AGGFtb3VudAg8RGVjaXNpb25TdGFydGVkAQAQFGluZGV4BBR0cmFjawQgcHJvcG9zYWylARR0YWxseakBOENvbmZpcm1TdGFydGVkAQAEFGluZGV4BDhDb25maXJtQWJvcnRlZAEABBRpbmRleAQkQ29uZmlybWVkAQAIFGluZGV4BBR0YWxseakBIEFwcHJvdmVkAQAEFGluZGV4BCBSZWplY3RlZAEACBRpbmRleAQUdGFsbHmpASBUaW1lZE91dAEACBRpbmRleAQUdGFsbHmpASRDYW5jZWxsZWQBAAgUaW5kZXgEFHRhbGx5qQEYS2lsbGVkAQAIFGluZGV4BBR0YWxseakBZFN1Ym1pc3Npb25EZXBvc2l0UmVmdW5kZWQBAAwUaW5kZXgEDHdobwAYYW1vdW50CCxNZXRhZGF0YVNldAEACBRpbmRleAQQaGFzaCA8TWV0YWRhdGFDbGVhcmVkAQAIFGluZGV4BBBoYXNoIFBGZWxsb3dzaGlwQ29sbGVjdGl2ZQECFCxNZW1iZXJBZGRlZAEABAx3aG8ALFJhbmtDaGFuZ2VkAQAIDHdobwAQcmFuawQ0TWVtYmVyUmVtb3ZlZAEACAx3aG8AEHJhbmsEFFZvdGVkAQAQDHdobwAQcG9sbAQQdm90ZXkLFHRhbGx5fQs8TWVtYmVyRXhjaGFuZ2VkAQAIDHdobwAcbmV3X3dobwBMRmVsbG93c2hpcFJlZmVyZW5kYQECQCRTdWJtaXR0ZWQBAAwUaW5kZXgEFHRyYWNrBCBwcm9wb3NhbKUBVERlY2lzaW9uRGVwb3NpdFBsYWNlZAEADBRpbmRleAQMd2hvABhhbW91bnQIXERlY2lzaW9uRGVwb3NpdFJlZnVuZGVkAQAMFGluZGV4BAx3aG8AGGFtb3VudAg4RGVwb3NpdFNsYXNoZWQBAAgMd2hvABhhbW91bnQIPERlY2lzaW9uU3RhcnRlZAEAEBRpbmRleAQUdHJhY2sEIHByb3Bvc2FspQEUdGFsbHl9CzhDb25maXJtU3RhcnRlZAEABBRpbmRleAQ4Q29uZmlybUFib3J0ZWQBAAQUaW5kZXgEJENvbmZpcm1lZAEACBRpbmRleAQUdGFsbHl9CyBBcHByb3ZlZAEABBRpbmRleAQgUmVqZWN0ZWQBAAgUaW5kZXgEFHRhbGx5fQsgVGltZWRPdXQBAAgUaW5kZXgEFHRhbGx5fQskQ2FuY2VsbGVkAQAIFGluZGV4BBR0YWxseX0LGEtpbGxlZAEACBRpbmRleAQUdGFsbHl9C2RTdWJtaXNzaW9uRGVwb3NpdFJlZnVuZGVkAQAMFGluZGV4BAx3aG8AGGFtb3VudAgsTWV0YWRhdGFTZXQBAAgUaW5kZXgEEGhhc2ggPE1ldGFkYXRhQ2xlYXJlZAEACBRpbmRleAQQaGFzaCAkV2hpdGVsaXN0AQIMPENhbGxXaGl0ZWxpc3RlZAEABCRjYWxsX2hhc2ggWFdoaXRlbGlzdGVkQ2FsbFJlbW92ZWQBAAQkY2FsbF9oYXNoIGRXaGl0ZWxpc3RlZENhbGxEaXNwYXRjaGVkAQAIJGNhbGxfaGFzaCAYcmVzdWx0jQsoUGFyYW1ldGVycwECBBxVcGRhdGVkAQAMDGtleckBJG9sZF92YWx1ZdUBJG5ld192YWx1ZdUBGENsYWltcwECBBxDbGFpbWVkAQAMDHdobwBAZXRoZXJldW1fYWRkcmVzc2UBGGFtb3VudAgcVXRpbGl0eQECGEBCYXRjaEludGVycnVwdGVkAQAIFGluZGV4BBRlcnJvcnELOEJhdGNoQ29tcGxldGVkAQEFYEJhdGNoQ29tcGxldGVkV2l0aEVycm9ycwEBBTRJdGVtQ29tcGxldGVkAQEFKEl0ZW1GYWlsZWQBAAQUZXJyb3JxCzBEaXNwYXRjaGVkQXMBAAQYcmVzdWx0lQscU29jaWV0eQECRBxGb3VuZGVkAQAEHGZvdW5kZXIADEJpZAEACDBjYW5kaWRhdGVfaWQAFG9mZmVyCBRWb3VjaAEADDBjYW5kaWRhdGVfaWQAFG9mZmVyCCB2b3VjaGluZwAkQXV0b1VuYmlkAQAEJGNhbmRpZGF0ZQAUVW5iaWQBAAQkY2FuZGlkYXRlABxVbnZvdWNoAQAEJGNhbmRpZGF0ZQAgSW5kdWN0ZWQBAAgccHJpbWFyeQAoY2FuZGlkYXRlc90DYFN1c3BlbmRlZE1lbWJlckp1ZGdlbWVudAEACAx3aG8AGGp1ZGdlZBRIQ2FuZGlkYXRlU3VzcGVuZGVkAQAEJGNhbmRpZGF0ZQA8TWVtYmVyU3VzcGVuZGVkAQAEGG1lbWJlcgAoQ2hhbGxlbmdlZAEABBhtZW1iZXIAEFZvdGUBAAwkY2FuZGlkYXRlABR2b3RlcgAQdm90ZRQwRGVmZW5kZXJWb3RlAQAIFHZvdGVyABB2b3RlFCROZXdQYXJhbXMBAAQYcGFyYW1znQskVW5mb3VuZGVkAQAEHGZvdW5kZXIAHERlcG9zaXQBAAQUdmFsdWUIIEVsZXZhdGVkAQAIGG1lbWJlcgAQcmFuawQgUmVjb3ZlcnkBAhg8UmVjb3ZlcnlDcmVhdGVkAQAEHGFjY291bnQARFJlY292ZXJ5SW5pdGlhdGVkAQAIMGxvc3RfYWNjb3VudAA8cmVzY3Vlcl9hY2NvdW50ADxSZWNvdmVyeVZvdWNoZWQBAAwwbG9zdF9hY2NvdW50ADxyZXNjdWVyX2FjY291bnQAGHNlbmRlcgA4UmVjb3ZlcnlDbG9zZWQBAAgwbG9zdF9hY2NvdW50ADxyZXNjdWVyX2FjY291bnQAQEFjY291bnRSZWNvdmVyZWQBAAgwbG9zdF9hY2NvdW50ADxyZXNjdWVyX2FjY291bnQAPFJlY292ZXJ5UmVtb3ZlZAEABDBsb3N0X2FjY291bnQAHFZlc3RpbmcBAgg4VmVzdGluZ1VwZGF0ZWQBAAgcYWNjb3VudAAgdW52ZXN0ZWQIQFZlc3RpbmdDb21wbGV0ZWQBAAQcYWNjb3VudAAkU2NoZWR1bGVyAQIkJFNjaGVkdWxlZAEACBB3aGVuBBRpbmRleAQgQ2FuY2VsZWQBAAgQd2hlbgQUaW5kZXgEKERpc3BhdGNoZWQBAAwQdGFzaw0BCGlkEQEYcmVzdWx0lQsgUmV0cnlTZXQBABAQdGFzaw0BCGlkEQEYcGVyaW9kBBxyZXRyaWVzBDhSZXRyeUNhbmNlbGxlZAEACBB0YXNrDQEIaWQRATxDYWxsVW5hdmFpbGFibGUBAAgQdGFzaw0BCGlkEQE4UGVyaW9kaWNGYWlsZWQBAAgQdGFzaw0BCGlkEQEsUmV0cnlGYWlsZWQBAAgQdGFzaw0BCGlkEQFUUGVybWFuZW50bHlPdmVyd2VpZ2h0AQAIEHRhc2sNAQhpZBEBFFByb3h5AQIUNFByb3h5RXhlY3V0ZWQBAAQYcmVzdWx0lQssUHVyZUNyZWF0ZWQBABAQcHVyZQAMd2hvAChwcm94eV90eXBlrQtQZGlzYW1iaWd1YXRpb25faW5kZXgEJEFubm91bmNlZAEADBByZWFsABRwcm94eQAkY2FsbF9oYXNoIChQcm94eUFkZGVkAQAQJGRlbGVnYXRvcgAkZGVsZWdhdGVlAChwcm94eV90eXBlrQsUZGVsYXkEMFByb3h5UmVtb3ZlZAEAECRkZWxlZ2F0b3IAJGRlbGVnYXRlZQAocHJveHlfdHlwZa0LFGRlbGF5BCBNdWx0aXNpZwECECxOZXdNdWx0aXNpZwEADCRhcHByb3ZpbmcAIG11bHRpc2lnACRjYWxsX2hhc2ggQE11bHRpc2lnQXBwcm92YWwBABAkYXBwcm92aW5nACR0aW1lcG9pbnTxASBtdWx0aXNpZwAkY2FsbF9oYXNoIEBNdWx0aXNpZ0V4ZWN1dGVkAQAUJGFwcHJvdmluZwAkdGltZXBvaW508QEgbXVsdGlzaWcAJGNhbGxfaGFzaCAYcmVzdWx0lQtETXVsdGlzaWdDYW5jZWxsZWQBABAoY2FuY2VsbGluZwAkdGltZXBvaW508QEgbXVsdGlzaWcAJGNhbGxfaGFzaCAgUHJlaW1hZ2UBAgwUTm90ZWQBAAQQaGFzaCAkUmVxdWVzdGVkAQAEEGhhc2ggHENsZWFyZWQBAAQQaGFzaCAgQm91bnRpZXMBAiw4Qm91bnR5UHJvcG9zZWQBAAQUaW5kZXgEOEJvdW50eVJlamVjdGVkAQAIFGluZGV4BBBib25kCEhCb3VudHlCZWNhbWVBY3RpdmUBAAQUaW5kZXgENEJvdW50eUF3YXJkZWQBAAgUaW5kZXgELGJlbmVmaWNpYXJ5ADRCb3VudHlDbGFpbWVkAQAMFGluZGV4BBhwYXlvdXQILGJlbmVmaWNpYXJ5ADhCb3VudHlDYW5jZWxlZAEABBRpbmRleAQ4Qm91bnR5RXh0ZW5kZWQBAAQUaW5kZXgEOEJvdW50eUFwcHJvdmVkAQAEFGluZGV4BDxDdXJhdG9yUHJvcG9zZWQBAAgkYm91bnR5X2lkBBxjdXJhdG9yAERDdXJhdG9yVW5hc3NpZ25lZAEABCRib3VudHlfaWQEPEN1cmF0b3JBY2NlcHRlZAEACCRib3VudHlfaWQEHGN1cmF0b3IANENoaWxkQm91bnRpZXMBAhAUQWRkZWQBAAgUaW5kZXgELGNoaWxkX2luZGV4BBxBd2FyZGVkAQAMFGluZGV4BCxjaGlsZF9pbmRleAQsYmVuZWZpY2lhcnkAHENsYWltZWQBABAUaW5kZXgELGNoaWxkX2luZGV4BBhwYXlvdXQILGJlbmVmaWNpYXJ5ACBDYW5jZWxlZAEACBRpbmRleAQsY2hpbGRfaW5kZXgEaEVsZWN0aW9uUHJvdmlkZXJNdWx0aVBoYXNlAQIYOFNvbHV0aW9uU3RvcmVkAQAMHGNvbXB1dGUBAhhvcmlnaW4FAjBwcmV2X2VqZWN0ZWQUREVsZWN0aW9uRmluYWxpemVkAQAIHGNvbXB1dGUBAhRzY29yZQkCOEVsZWN0aW9uRmFpbGVkAQEFIFJld2FyZGVkAQAIHGFjY291bnQAFHZhbHVlCBxTbGFzaGVkAQAIHGFjY291bnQAFHZhbHVlCERQaGFzZVRyYW5zaXRpb25lZAEADBBmcm9tEQIIdG8RAhRyb3VuZAQMTmlzAQIcJEJpZFBsYWNlZAEADAx3aG8AGGFtb3VudAggZHVyYXRpb24EMEJpZFJldHJhY3RlZAEADAx3aG8AGGFtb3VudAggZHVyYXRpb24EKEJpZERyb3BwZWQBAAwMd2hvABhhbW91bnQIIGR1cmF0aW9uBBhJc3N1ZWQBABQUaW5kZXgEGGV4cGlyeQQMd2hvAChwcm9wb3J0aW9uCBhhbW91bnQIGFRoYXdlZAEAFBRpbmRleAQMd2hvAChwcm9wb3J0aW9uCBhhbW91bnQIHGRyb3BwZWQUGEZ1bmRlZAEABBxkZWZpY2l0CCxUcmFuc2ZlcnJlZAEADBBmcm9tAAh0bwAUaW5kZXgEWE5pc0NvdW50ZXJwYXJ0QmFsYW5jZXMBAlgcRW5kb3dlZAEACBxhY2NvdW50ADBmcmVlX2JhbGFuY2UIIER1c3RMb3N0AQAIHGFjY291bnQAGGFtb3VudAggVHJhbnNmZXIBAAwQZnJvbQAIdG8AGGFtb3VudAgoQmFsYW5jZVNldAEACAx3aG8AEGZyZWUIIFJlc2VydmVkAQAIDHdobwAYYW1vdW50CChVbnJlc2VydmVkAQAIDHdobwAYYW1vdW50CEhSZXNlcnZlUmVwYXRyaWF0ZWQBABAQZnJvbQAIdG8AGGFtb3VudAhIZGVzdGluYXRpb25fc3RhdHVzKQEcRGVwb3NpdAEACAx3aG8AGGFtb3VudAggV2l0aGRyYXcBAAgMd2hvABhhbW91bnQIHFNsYXNoZWQBAAgMd2hvABhhbW91bnQIGE1pbnRlZAEACAx3aG8AGGFtb3VudAgYQnVybmVkAQAIDHdobwAYYW1vdW50CCRTdXNwZW5kZWQBAAgMd2hvABhhbW91bnQIIFJlc3RvcmVkAQAIDHdobwAYYW1vdW50CCBVcGdyYWRlZAEABAx3aG8AGElzc3VlZAEABBhhbW91bnQIJFJlc2NpbmRlZAEABBhhbW91bnQIGExvY2tlZAEACAx3aG8AGGFtb3VudAggVW5sb2NrZWQBAAgMd2hvABhhbW91bnQIGEZyb3plbgEACAx3aG8AGGFtb3VudAgYVGhhd2VkAQAIDHdobwAYYW1vdW50CExUb3RhbElzc3VhbmNlRm9yY2VkAQAIDG9sZAgMbmV3CCRWb3Rlckxpc3QBAgggUmViYWdnZWQBAAwMd2hvABBmcm9tCAh0bwgwU2NvcmVVcGRhdGVkAQAIDHdobwAkbmV3X3Njb3JlCDxOb21pbmF0aW9uUG9vbHMBAkgcQ3JlYXRlZAEACCRkZXBvc2l0b3IAHHBvb2xfaWQEGEJvbmRlZAEAEBhtZW1iZXIAHHBvb2xfaWQEGGJvbmRlZAgYam9pbmVkFBxQYWlkT3V0AQAMGG1lbWJlcgAccG9vbF9pZAQYcGF5b3V0CCBVbmJvbmRlZAEAFBhtZW1iZXIAHHBvb2xfaWQEHGJhbGFuY2UIGHBvaW50cwgMZXJhBCRXaXRoZHJhd24BABAYbWVtYmVyABxwb29sX2lkBBxiYWxhbmNlCBhwb2ludHMIJERlc3Ryb3llZAEABBxwb29sX2lkBDBTdGF0ZUNoYW5nZWQBAAgccG9vbF9pZAQkbmV3X3N0YXRlHQI0TWVtYmVyUmVtb3ZlZAEACBxwb29sX2lkBBhtZW1iZXIAMFJvbGVzVXBkYXRlZAEADBByb290BQIcYm91bmNlcgUCJG5vbWluYXRvcgUCLFBvb2xTbGFzaGVkAQAIHHBvb2xfaWQEHGJhbGFuY2UIUFVuYm9uZGluZ1Bvb2xTbGFzaGVkAQAMHHBvb2xfaWQEDGVyYQQcYmFsYW5jZQhUUG9vbENvbW1pc3Npb25VcGRhdGVkAQAIHHBvb2xfaWQEHGN1cnJlbnQlAmBQb29sTWF4Q29tbWlzc2lvblVwZGF0ZWQBAAgccG9vbF9pZAQ4bWF4X2NvbW1pc3Npb24EfFBvb2xDb21taXNzaW9uQ2hhbmdlUmF0ZVVwZGF0ZWQBAAgccG9vbF9pZAQsY2hhbmdlX3JhdGUpApBQb29sQ29tbWlzc2lvbkNsYWltUGVybWlzc2lvblVwZGF0ZWQBAAgccG9vbF9pZAQocGVybWlzc2lvbjECVFBvb2xDb21taXNzaW9uQ2xhaW1lZAEACBxwb29sX2lkBChjb21taXNzaW9uCGRNaW5CYWxhbmNlRGVmaWNpdEFkanVzdGVkAQAIHHBvb2xfaWQEGGFtb3VudAhgTWluQmFsYW5jZUV4Y2Vzc0FkanVzdGVkAQAIHHBvb2xfaWQEGGFtb3VudAgsRmFzdFVuc3Rha2UBAhQgVW5zdGFrZWQBAAgUc3Rhc2gAGHJlc3VsdJULHFNsYXNoZWQBAAgUc3Rhc2gAGGFtb3VudAgwQmF0Y2hDaGVja2VkAQAEEGVyYXM5AjRCYXRjaEZpbmlzaGVkAQAEEHNpemUENEludGVybmFsRXJyb3IBAQU0UGFyYUluY2x1c2lvbgECEDxDYW5kaWRhdGVCYWNrZWQBAxBJAiQEBERDYW5kaWRhdGVJbmNsdWRlZAEDEEkCJAQERENhbmRpZGF0ZVRpbWVkT3V0AQMMSQIkBFhVcHdhcmRNZXNzYWdlc1JlY2VpdmVkAQAIEGZyb20EFGNvdW50BBRQYXJhcwECIEhDdXJyZW50Q29kZVVwZGF0ZWQBAQJIQ3VycmVudEhlYWRVcGRhdGVkAQECUENvZGVVcGdyYWRlU2NoZWR1bGVkAQECME5ld0hlYWROb3RlZAEBAjBBY3Rpb25RdWV1ZWQBBAQBCDxQdmZDaGVja1N0YXJ0ZWQBAwggBEBQdmZDaGVja0FjY2VwdGVkAQMIIARAUHZmQ2hlY2tSZWplY3RlZAEDCCAEEEhybXABAhxQT3BlbkNoYW5uZWxSZXF1ZXN0ZWQBABAYc2VuZGVyBCRyZWNpcGllbnQEVHByb3Bvc2VkX21heF9jYXBhY2l0eQRkcHJvcG9zZWRfbWF4X21lc3NhZ2Vfc2l6ZQRMT3BlbkNoYW5uZWxDYW5jZWxlZAEACDBieV9wYXJhY2hhaW4EKGNoYW5uZWxfaWRVAkxPcGVuQ2hhbm5lbEFjY2VwdGVkAQAIGHNlbmRlcgQkcmVjaXBpZW50BDRDaGFubmVsQ2xvc2VkAQAIMGJ5X3BhcmFjaGFpbgQoY2hhbm5lbF9pZFUCWEhybXBDaGFubmVsRm9yY2VPcGVuZWQBABAYc2VuZGVyBCRyZWNpcGllbnQEVHByb3Bvc2VkX21heF9jYXBhY2l0eQRkcHJvcG9zZWRfbWF4X21lc3NhZ2Vfc2l6ZQRcSHJtcFN5c3RlbUNoYW5uZWxPcGVuZWQBABAYc2VuZGVyBCRyZWNpcGllbnQEVHByb3Bvc2VkX21heF9jYXBhY2l0eQRkcHJvcG9zZWRfbWF4X21lc3NhZ2Vfc2l6ZQRoT3BlbkNoYW5uZWxEZXBvc2l0c1VwZGF0ZWQBAAgYc2VuZGVyBCRyZWNpcGllbnQENFBhcmFzRGlzcHV0ZXMBAgxARGlzcHV0ZUluaXRpYXRlZAEDCCBdAkBEaXNwdXRlQ29uY2x1ZGVkAQMIIGECGFJldmVydAEBAmhPbkRlbWFuZEFzc2lnbm1lbnRQcm92aWRlcgECCExPbkRlbWFuZE9yZGVyUGxhY2VkAQAMHHBhcmFfaWQEKHNwb3RfcHJpY2UIKG9yZGVyZWRfYnkAMFNwb3RQcmljZVNldAEABChzcG90X3ByaWNlCCRSZWdpc3RyYXIBAhAoUmVnaXN0ZXJlZAEACBxwYXJhX2lkBBxtYW5hZ2VyADBEZXJlZ2lzdGVyZWQBAAQccGFyYV9pZAQgUmVzZXJ2ZWQBAAgccGFyYV9pZAQMd2hvABxTd2FwcGVkAQAIHHBhcmFfaWQEIG90aGVyX2lkBBRTbG90cwECCDhOZXdMZWFzZVBlcmlvZAEABDBsZWFzZV9wZXJpb2QEGExlYXNlZAEAGBxwYXJhX2lkBBhsZWFzZXIAMHBlcmlvZF9iZWdpbgQwcGVyaW9kX2NvdW50BDhleHRyYV9yZXNlcnZlZAgwdG90YWxfYW1vdW50CCBBdWN0aW9ucwECHDhBdWN0aW9uU3RhcnRlZAEADDRhdWN0aW9uX2luZGV4BDBsZWFzZV9wZXJpb2QEGGVuZGluZwQ0QXVjdGlvbkNsb3NlZAEABDRhdWN0aW9uX2luZGV4BCBSZXNlcnZlZAEADBhiaWRkZXIAOGV4dHJhX3Jlc2VydmVkCDB0b3RhbF9hbW91bnQIKFVucmVzZXJ2ZWQBAAgYYmlkZGVyABhhbW91bnQISFJlc2VydmVDb25maXNjYXRlZAEADBxwYXJhX2lkBBhsZWFzZXIAGGFtb3VudAgsQmlkQWNjZXB0ZWQBABQYYmlkZGVyABxwYXJhX2lkBBhhbW91bnQIKGZpcnN0X3Nsb3QEJGxhc3Rfc2xvdAQ0V2lubmluZ09mZnNldAEACDRhdWN0aW9uX2luZGV4BDBibG9ja19udW1iZXIEJENyb3dkbG9hbgECKBxDcmVhdGVkAQAEHHBhcmFfaWQELENvbnRyaWJ1dGVkAQAMDHdobwAoZnVuZF9pbmRleAQYYW1vdW50CCBXaXRoZHJldwEADAx3aG8AKGZ1bmRfaW5kZXgEGGFtb3VudAhEUGFydGlhbGx5UmVmdW5kZWQBAAQccGFyYV9pZAQsQWxsUmVmdW5kZWQBAAQccGFyYV9pZAQkRGlzc29sdmVkAQAEHHBhcmFfaWQEPEhhbmRsZUJpZFJlc3VsdAEACBxwYXJhX2lkBBhyZXN1bHSVCxhFZGl0ZWQBAAQccGFyYV9pZAQsTWVtb1VwZGF0ZWQBAAwMd2hvABxwYXJhX2lkBBBtZW1vJDxBZGRlZFRvTmV3UmFpc2UBAAQccGFyYV9pZAQgQ29yZXRpbWUBAghQUmV2ZW51ZUluZm9SZXF1ZXN0ZWQBAAQQd2hlbgQwQ29yZUFzc2lnbmVkAQAEEGNvcmUEJFhjbVBhbGxldAECYCRBdHRlbXB0ZWQBAAQcb3V0Y29tZY0CEFNlbnQBABAYb3JpZ2lueQEsZGVzdGluYXRpb255ARxtZXNzYWdl+QIobWVzc2FnZV9pZCBIVW5leHBlY3RlZFJlc3BvbnNlAQAIGG9yaWdpbnkBIHF1ZXJ5X2lkCDRSZXNwb25zZVJlYWR5AQAIIHF1ZXJ5X2lkCCByZXNwb25zZbkCIE5vdGlmaWVkAQAMIHF1ZXJ5X2lkCDBwYWxsZXRfaW5kZXgEKGNhbGxfaW5kZXgEQE5vdGlmeU92ZXJ3ZWlnaHQBABQgcXVlcnlfaWQIMHBhbGxldF9pbmRleAQoY2FsbF9pbmRleAQ0YWN0dWFsX3dlaWdodBhMbWF4X2J1ZGdldGVkX3dlaWdodBhMTm90aWZ5RGlzcGF0Y2hFcnJvcgEADCBxdWVyeV9pZAgwcGFsbGV0X2luZGV4BChjYWxsX2luZGV4BEhOb3RpZnlEZWNvZGVGYWlsZWQBAAwgcXVlcnlfaWQIMHBhbGxldF9pbmRleAQoY2FsbF9pbmRleARASW52YWxpZFJlc3BvbmRlcgEADBhvcmlnaW55ASBxdWVyeV9pZAhEZXhwZWN0ZWRfbG9jYXRpb269AlxJbnZhbGlkUmVzcG9uZGVyVmVyc2lvbgEACBhvcmlnaW55ASBxdWVyeV9pZAg0UmVzcG9uc2VUYWtlbgEABCBxdWVyeV9pZAg0QXNzZXRzVHJhcHBlZAEADBBoYXNoIBhvcmlnaW55ARhhc3NldHMZA1RWZXJzaW9uQ2hhbmdlTm90aWZpZWQBABAsZGVzdGluYXRpb255ARhyZXN1bHQEEGNvc3ShAihtZXNzYWdlX2lkIFxTdXBwb3J0ZWRWZXJzaW9uQ2hhbmdlZAEACCBsb2NhdGlvbnkBHHZlcnNpb24EUE5vdGlmeVRhcmdldFNlbmRGYWlsAQAMIGxvY2F0aW9ueQEgcXVlcnlfaWQIFGVycm9yiQJkTm90aWZ5VGFyZ2V0TWlncmF0aW9uRmFpbAEACCBsb2NhdGlvbpkBIHF1ZXJ5X2lkCFRJbnZhbGlkUXVlcmllclZlcnNpb24BAAgYb3JpZ2lueQEgcXVlcnlfaWQIOEludmFsaWRRdWVyaWVyAQAQGG9yaWdpbnkBIHF1ZXJ5X2lkCEBleHBlY3RlZF9xdWVyaWVyeQFQbWF5YmVfYWN0dWFsX3F1ZXJpZXK9AlBWZXJzaW9uTm90aWZ5U3RhcnRlZAEADCxkZXN0aW5hdGlvbnkBEGNvc3ShAihtZXNzYWdlX2lkIFhWZXJzaW9uTm90aWZ5UmVxdWVzdGVkAQAMLGRlc3RpbmF0aW9ueQEQY29zdKECKG1lc3NhZ2VfaWQgYFZlcnNpb25Ob3RpZnlVbnJlcXVlc3RlZAEADCxkZXN0aW5hdGlvbnkBEGNvc3ShAihtZXNzYWdlX2lkICBGZWVzUGFpZAEACBhwYXlpbmd5ARBmZWVzoQI0QXNzZXRzQ2xhaW1lZAEADBBoYXNoIBhvcmlnaW55ARhhc3NldHMZA2BWZXJzaW9uTWlncmF0aW9uRmluaXNoZWQBAAQcdmVyc2lvbgQwTWVzc2FnZVF1ZXVlAQIQQFByb2Nlc3NpbmdGYWlsZWQBAAwIaWQgGG9yaWdpbiUDFGVycm9yKQMkUHJvY2Vzc2VkAQAQCGlkIBhvcmlnaW4lAyx3ZWlnaHRfdXNlZBgcc3VjY2VzcxRIT3ZlcndlaWdodEVucXVldWVkAQAQCGlkIBhvcmlnaW4lAyhwYWdlX2luZGV4BDRtZXNzYWdlX2luZGV4BChQYWdlUmVhcGVkAQAIGG9yaWdpbiUDFGluZGV4BCRBc3NldFJhdGUBAgxAQXNzZXRSYXRlQ3JlYXRlZAEACChhc3NldF9raW5kgQEQcmF0ZQhAQXNzZXRSYXRlUmVtb3ZlZAEABChhc3NldF9raW5kgQFAQXNzZXRSYXRlVXBkYXRlZAEADChhc3NldF9raW5kgQEMb2xkCAxuZXcIAAwUcGhhc2U0FGV2ZW50xQsYdG9waWNzOQMEyQsAAgQoTmZ0UmVjZWlwdAEBBQIIIFByZWltYWdlAQIEIFByZWltYWdlAQEFDE5pcwECBChOZnRSZWNlaXB0AQEFAAgIaWTVCxhhbW91bnQIBNkLAAJwMFN0YWtpbmdBZG1pbgEBBSRUcmVhc3VyZXIBAQU8RmVsbG93c2hpcEFkbWluAQEFMEdlbmVyYWxBZG1pbgEBBTBBdWN0aW9uQWRtaW4BAQUoTGVhc2VBZG1pbgEBBUxSZWZlcmVuZHVtQ2FuY2VsbGVyAQEFQFJlZmVyZW5kdW1LaWxsZXIBAQUsU21hbGxUaXBwZXIBAQUkQmlnVGlwcGVyAQEFMFNtYWxsU3BlbmRlcgEBBTRNZWRpdW1TcGVuZGVyAQEFKEJpZ1NwZW5kZXIBAQVEV2hpdGVsaXN0ZWRDYWxsZXIBAQVMRmVsbG93c2hpcEluaXRpYXRlcwEBBRxGZWxsb3dzAQEFREZlbGxvd3NoaXBFeHBlcnRzAQEFREZlbGxvd3NoaXBNYXN0ZXJzAQEFOEZlbGxvd3NoaXAxRGFuAQEFOEZlbGxvd3NoaXAyRGFuAQEFOEZlbGxvd3NoaXAzRGFuAQEFOEZlbGxvd3NoaXA0RGFuAQEFOEZlbGxvd3NoaXA1RGFuAQEFOEZlbGxvd3NoaXA2RGFuAQEFOEZlbGxvd3NoaXA3RGFuAQEFOEZlbGxvd3NoaXA4RGFuAQEFOEZlbGxvd3NoaXA5RGFuAQEFNFdpc2hGb3JDaGFuZ2UBAQUCFBhzeXN0ZW0BAgwQUm9vdAEBBRhTaWduZWQBAQEQTm9uZQEBBRxPcmlnaW5zAQJwMFN0YWtpbmdBZG1pbgEBBSRUcmVhc3VyZXIBAQU8RmVsbG93c2hpcEFkbWluAQEFMEdlbmVyYWxBZG1pbgEBBTBBdWN0aW9uQWRtaW4BAQUoTGVhc2VBZG1pbgEBBUxSZWZlcmVuZHVtQ2FuY2VsbGVyAQEFQFJlZmVyZW5kdW1LaWxsZXIBAQUsU21hbGxUaXBwZXIBAQUkQmlnVGlwcGVyAQEFMFNtYWxsU3BlbmRlcgEBBTRNZWRpdW1TcGVuZGVyAQEFKEJpZ1NwZW5kZXIBAQVEV2hpdGVsaXN0ZWRDYWxsZXIBAQVMRmVsbG93c2hpcEluaXRpYXRlcwEBBRxGZWxsb3dzAQEFREZlbGxvd3NoaXBFeHBlcnRzAQEFREZlbGxvd3NoaXBNYXN0ZXJzAQEFOEZlbGxvd3NoaXAxRGFuAQEFOEZlbGxvd3NoaXAyRGFuAQEFOEZlbGxvd3NoaXAzRGFuAQEFOEZlbGxvd3NoaXA0RGFuAQEFOEZlbGxvd3NoaXA1RGFuAQEFOEZlbGxvd3NoaXA2RGFuAQEFOEZlbGxvd3NoaXA3RGFuAQEFOEZlbGxvd3NoaXA4RGFuAQEFOEZlbGxvd3NoaXA5RGFuAQEFNFdpc2hGb3JDaGFuZ2UBAQVAUGFyYWNoYWluc09yaWdpbgECBCRQYXJhY2hhaW4BAQIkWGNtUGFsbGV0AQIIDFhjbQEACBxwYXJlbnRzBCBpbnRlcmlvcnUBIFJlc3BvbnNlAQAIHHBhcmVudHMEIGludGVyaW9ydQEQVm9pZAEBBQAsFHRyYWNrBBhvcmlnaW7lCyBwcm9wb3NhbKUBJGVuYWN0bWVudEEEJHN1Ym1pdHRlZARIc3VibWlzc2lvbl9kZXBvc2l03QdAZGVjaXNpb25fZGVwb3NpdOEHIGRlY2lkaW5n6QcUdGFsbHmpASBpbl9xdWV1ZRQUYWxhcm3xBwIYHE9uZ29pbmcBACwUdHJhY2sEGG9yaWdpbuULIHByb3Bvc2FspQEkZW5hY3RtZW50QQQkc3VibWl0dGVkBEhzdWJtaXNzaW9uX2RlcG9zaXTdB0BkZWNpc2lvbl9kZXBvc2l04QcgZGVjaWRpbmfpBxR0YWxseakBIGluX3F1ZXVlFBRhbGFybfEHIEFwcHJvdmVkAQMMBOEH4QcgUmVqZWN0ZWQBAwwE4QfhByRDYW5jZWxsZWQBAwwE4QfhByBUaW1lZE91dAEDDAThB+EHGEtpbGxlZAEBAgAsFHRyYWNrBBhvcmlnaW7lCyBwcm9wb3NhbKUBJGVuYWN0bWVudEEEJHN1Ym1pdHRlZARIc3VibWlzc2lvbl9kZXBvc2l03QdAZGVjaXNpb25fZGVwb3NpdOEHIGRlY2lkaW5n6QcUdGFsbHl9CyBpbl9xdWV1ZRQUYWxhcm3xBwIYHE9uZ29pbmcBACwUdHJhY2sEGG9yaWdpbuULIHByb3Bvc2FspQEkZW5hY3RtZW50QQQkc3VibWl0dGVkBEhzdWJtaXNzaW9uX2RlcG9zaXTdB0BkZWNpc2lvbl9kZXBvc2l04QcgZGVjaWRpbmfpBxR0YWxseX0LIGluX3F1ZXVlFBRhbGFybfEHIEFwcHJvdmVkAQMMBOEH4QcgUmVqZWN0ZWQBAwwE4QfhByRDYW5jZWxsZWQBAwwE4QfhByBUaW1lZE91dAEDDAThB+EHGEtpbGxlZAEBAgIkGHN1Ym1pdAEADDxwcm9wb3NhbF9vcmlnaW7lCyBwcm9wb3NhbKUBQGVuYWN0bWVudF9tb21lbnRBBFhwbGFjZV9kZWNpc2lvbl9kZXBvc2l0AQAEFGluZGV4BFxyZWZ1bmRfZGVjaXNpb25fZGVwb3NpdAEABBRpbmRleAQYY2FuY2VsAQAEFGluZGV4BBBraWxsAQAEFGluZGV4BEBudWRnZV9yZWZlcmVuZHVtAQAEFGluZGV4BEhvbmVfZmV3ZXJfZGVjaWRpbmcBAAQUdHJhY2sEZHJlZnVuZF9zdWJtaXNzaW9uX2RlcG9zaXQBAAQUaW5kZXgEMHNldF9tZXRhZGF0YQEACBRpbmRleAQobWF5YmVfaGFzaBEBAhwoYWRkX21lbWJlcgEABAx3aG/VAzhwcm9tb3RlX21lbWJlcgEABAx3aG/VAzRkZW1vdGVfbWVtYmVyAQAEDHdob9UDNHJlbW92ZV9tZW1iZXIBAAgMd2hv1QMgbWluX3JhbmsEEHZvdGUBAAgQcG9sbAQMYXllFDBjbGVhbnVwX3BvbGwBAAgocG9sbF9pbmRleAQMbWF4BDxleGNoYW5nZV9tZW1iZXIBAAgMd2hv1QMcbmV3X3dob9UDAhA4d2hpdGVsaXN0X2NhbGwBAAQkY2FsbF9oYXNoIFxyZW1vdmVfd2hpdGVsaXN0ZWRfY2FsbAEABCRjYWxsX2hhc2ggZGRpc3BhdGNoX3doaXRlbGlzdGVkX2NhbGwBAAwkY2FsbF9oYXNoIEBjYWxsX2VuY29kZWRfbGVuBExjYWxsX3dlaWdodF93aXRuZXNzGJxkaXNwYXRjaF93aGl0ZWxpc3RlZF9jYWxsX3dpdGhfcHJlaW1hZ2UBAAQQY2FsbJUMBJUMAAIYFGJhdGNoAQAEFGNhbGxzBQw0YXNfZGVyaXZhdGl2ZQEACBRpbmRleAQQY2FsbJUMJGJhdGNoX2FsbAEABBRjYWxscwUMLGRpc3BhdGNoX2FzAQAIJGFzX29yaWdpbuULEGNhbGyVDCxmb3JjZV9iYXRjaAEABBRjYWxscwUMLHdpdGhfd2VpZ2h0AQAIEGNhbGyVDBh3ZWlnaHQYAlAMYmlkAQAEFHZhbHVlCBR1bmJpZAEBBRR2b3VjaAEADAx3aG/VAxR2YWx1ZQgMdGlwCBx1bnZvdWNoAQEFEHZvdGUBAAgkY2FuZGlkYXRl1QMcYXBwcm92ZRQ0ZGVmZW5kZXJfdm90ZQEABBxhcHByb3ZlFBhwYXlvdXQBAQUsd2FpdmVfcmVwYXkBAAQYYW1vdW50CDRmb3VuZF9zb2NpZXR5AQAYHGZvdW5kZXLVAyxtYXhfbWVtYmVycwQobWF4X2ludGFrZQQsbWF4X3N0cmlrZXMERGNhbmRpZGF0ZV9kZXBvc2l0CBRydWxlcyQgZGlzc29sdmUBAQVYanVkZ2Vfc3VzcGVuZGVkX21lbWJlcgEACAx3aG/VAxxmb3JnaXZlFDhzZXRfcGFyYW1ldGVycwEAECxtYXhfbWVtYmVycwQobWF4X2ludGFrZQQsbWF4X3N0cmlrZXMERGNhbmRpZGF0ZV9kZXBvc2l0CDhwdW5pc2hfc2tlcHRpYwEBBUBjbGFpbV9tZW1iZXJzaGlwAQEFRGJlc3Rvd19tZW1iZXJzaGlwAQAEJGNhbmRpZGF0ZQA4a2lja19jYW5kaWRhdGUBAAQkY2FuZGlkYXRlAEByZXNpZ25fY2FuZGlkYWN5AQEFOGRyb3BfY2FuZGlkYXRlAQAEJGNhbmRpZGF0ZQBEY2xlYW51cF9jYW5kaWRhY3kBAAgkY2FuZGlkYXRlAAxtYXgERGNsZWFudXBfY2hhbGxlbmdlAQAIPGNoYWxsZW5nZV9yb3VuZAQMbWF4BAIkMGFzX3JlY292ZXJlZAEACBxhY2NvdW501QMQY2FsbJUMNHNldF9yZWNvdmVyZWQBAAgQbG9zdNUDHHJlc2N1ZXLVAzxjcmVhdGVfcmVjb3ZlcnkBAAwcZnJpZW5kc90DJHRocmVzaG9sZAQwZGVsYXlfcGVyaW9kBERpbml0aWF0ZV9yZWNvdmVyeQEABBxhY2NvdW501QM4dm91Y2hfcmVjb3ZlcnkBAAgQbG9zdNUDHHJlc2N1ZXLVAzhjbGFpbV9yZWNvdmVyeQEABBxhY2NvdW501QM4Y2xvc2VfcmVjb3ZlcnkBAAQccmVzY3VlctUDPHJlbW92ZV9yZWNvdmVyeQEBBUBjYW5jZWxfcmVjb3ZlcmVkAQAEHGFjY291bnTVAwIoIHNjaGVkdWxlAQAQEHdoZW4EOG1heWJlX3BlcmlvZGljgQMgcHJpb3JpdHkEEGNhbGyVDBhjYW5jZWwBAAgQd2hlbgQUaW5kZXgEOHNjaGVkdWxlX25hbWVkAQAUCGlkIBB3aGVuBDhtYXliZV9wZXJpb2RpY4EDIHByaW9yaXR5BBBjYWxslQwwY2FuY2VsX25hbWVkAQAECGlkIDhzY2hlZHVsZV9hZnRlcgEAEBRhZnRlcgQ4bWF5YmVfcGVyaW9kaWOBAyBwcmlvcml0eQQQY2FsbJUMUHNjaGVkdWxlX25hbWVkX2FmdGVyAQAUCGlkIBRhZnRlcgQ4bWF5YmVfcGVyaW9kaWOBAyBwcmlvcml0eQQQY2FsbJUMJHNldF9yZXRyeQEADBB0YXNrDQEccmV0cmllcwQYcGVyaW9kBDxzZXRfcmV0cnlfbmFtZWQBAAwIaWQgHHJldHJpZXMEGHBlcmlvZAQwY2FuY2VsX3JldHJ5AQAEEHRhc2sNAUhjYW5jZWxfcmV0cnlfbmFtZWQBAAQIaWQgBq0LAigUcHJveHkBAAwQcmVhbNUDQGZvcmNlX3Byb3h5X3R5cGUZDBBjYWxslQwkYWRkX3Byb3h5AQAMIGRlbGVnYXRl1QMocHJveHlfdHlwZa0LFGRlbGF5BDByZW1vdmVfcHJveHkBAAwgZGVsZWdhdGXVAyhwcm94eV90eXBlrQsUZGVsYXkEOHJlbW92ZV9wcm94aWVzAQEFLGNyZWF0ZV9wdXJlAQAMKHByb3h5X3R5cGWtCxRkZWxheQQUaW5kZXgEJGtpbGxfcHVyZQEAFBxzcGF3bmVy1QMocHJveHlfdHlwZa0LFGluZGV4BBhoZWlnaHQEJGV4dF9pbmRleAQgYW5ub3VuY2UBAAgQcmVhbNUDJGNhbGxfaGFzaCBMcmVtb3ZlX2Fubm91bmNlbWVudAEACBByZWFs1QMkY2FsbF9oYXNoIExyZWplY3RfYW5ub3VuY2VtZW50AQAIIGRlbGVnYXRl1QMkY2FsbF9oYXNoIDxwcm94eV9hbm5vdW5jZWQBABAgZGVsZWdhdGXVAxByZWFs1QNAZm9yY2VfcHJveHlfdHlwZRkMEGNhbGyVDAIQUGFzX211bHRpX3RocmVzaG9sZF8xAQAIRG90aGVyX3NpZ25hdG9yaWVz3QMQY2FsbJUMIGFzX211bHRpAQAUJHRocmVzaG9sZAREb3RoZXJfc2lnbmF0b3JpZXPdAzxtYXliZV90aW1lcG9pbnSNBBBjYWxslQwobWF4X3dlaWdodBhAYXBwcm92ZV9hc19tdWx0aQEAFCR0aHJlc2hvbGQERG90aGVyX3NpZ25hdG9yaWVz3QM8bWF5YmVfdGltZXBvaW50jQQkY2FsbF9oYXNoIChtYXhfd2VpZ2h0GDxjYW5jZWxfYXNfbXVsdGkBABAkdGhyZXNob2xkBERvdGhlcl9zaWduYXRvcmllc90DJHRpbWVwb2ludPEBJGNhbGxfaGFzaCAEnQQBQAMMBCUMBAQpDAAEnQQBRAMMBDEMBAQ1DAAEnQQBSAMMBD0MBARBDAAEnQQBTAMMBEkMBARNDAAEnQQBUAMMBFUMBARZDAAEnQQBVAMMBGEMBARlDAAEnQQBWAMMBG0MBARxDAAEnQQBXAMMBHkMBAR9DAAAYBh2b3RlczGhBBh2b3RlczKpBBh2b3RlczO1BBh2b3RlczTBBBh2b3RlczXNBBh2b3RlczbZBBh2b3RlczflBBh2b3RlczjxBBh2b3Rlczn9BBx2b3RlczEwCQUcdm90ZXMxMRUFHHZvdGVzMTIhBRx2b3RlczEzLQUcdm90ZXMxNDkFHHZvdGVzMTVFBRx2b3RlczE2UQUcdm90ZXMxNy0MHHZvdGVzMTg5DBx2b3RlczE5RQwcdm90ZXMyMFEMHHZvdGVzMjFdDBx2b3RlczIyaQwcdm90ZXMyM3UMHHZvdGVzMjSBDAAMIHNvbHV0aW9uhQwUc2NvcmUJAhRyb3VuZAQCFDxzdWJtaXRfdW5zaWduZWQBAAgwcmF3X3NvbHV0aW9uiQwcd2l0bmVzc10FbHNldF9taW5pbXVtX3VudHJ1c3RlZF9zY29yZQEABEBtYXliZV9uZXh0X3Njb3JlYQV0c2V0X2VtZXJnZW5jeV9lbGVjdGlvbl9yZXN1bHQBAAQgc3VwcG9ydHN1BRhzdWJtaXQBAAQwcmF3X3NvbHV0aW9uiQxMZ292ZXJuYW5jZV9mYWxsYmFjawEACEBtYXliZV9tYXhfdm90ZXJzLQREbWF5YmVfbWF4X3RhcmdldHMtBAIcJHBsYWNlX2JpZAEACBhhbW91bnQIIGR1cmF0aW9uBCxyZXRyYWN0X2JpZAEACBhhbW91bnQIIGR1cmF0aW9uBDBmdW5kX2RlZmljaXQBAQUwdGhhd19wcml2YXRlAQAIFGluZGV4BEBtYXliZV9wcm9wb3J0aW9u9QM0dGhhd19jb21tdW5hbAEABBRpbmRleAQkY29tbXVuaWZ5AQAEFGluZGV4BCRwcml2YXRpemUBAAQUaW5kZXgEAswYU3lzdGVtAQIsGHJlbWFyawEABBhyZW1hcmskOHNldF9oZWFwX3BhZ2VzAQAEFHBhZ2VzCCBzZXRfY29kZQEABBBjb2RlJFxzZXRfY29kZV93aXRob3V0X2NoZWNrcwEABBBjb2RlJCxzZXRfc3RvcmFnZQEABBRpdGVtc3kDMGtpbGxfc3RvcmFnZQEABBBrZXlzfQMsa2lsbF9wcmVmaXgBAAgYcHJlZml4JBxzdWJrZXlzBERyZW1hcmtfd2l0aF9ldmVudAEABBhyZW1hcmskRGF1dGhvcml6ZV91cGdyYWRlAQAEJGNvZGVfaGFzaCCAYXV0aG9yaXplX3VwZ3JhZGVfd2l0aG91dF9jaGVja3MBAAQkY29kZV9oYXNoIGBhcHBseV9hdXRob3JpemVkX3VwZ3JhZGUBAAQQY29kZSQQQmFiZQECDExyZXBvcnRfZXF1aXZvY2F0aW9uAQAISGVxdWl2b2NhdGlvbl9wcm9vZrkDPGtleV9vd25lcl9wcm9vZr0DcHJlcG9ydF9lcXVpdm9jYXRpb25fdW5zaWduZWQBAAhIZXF1aXZvY2F0aW9uX3Byb29muQM8a2V5X293bmVyX3Byb29mvQNIcGxhbl9jb25maWdfY2hhbmdlAQAEGGNvbmZpZ8kDJFRpbWVzdGFtcAECBAxzZXQBAAQMbm93CBxJbmRpY2VzAQIUFGNsYWltAQAEFGluZGV4BCB0cmFuc2ZlcgEACAxuZXfVAxRpbmRleAQQZnJlZQEABBRpbmRleAQ4Zm9yY2VfdHJhbnNmZXIBAAwMbmV31QMUaW5kZXgEGGZyZWV6ZRQYZnJlZXplAQAEFGluZGV4BCBCYWxhbmNlcwECJFB0cmFuc2Zlcl9hbGxvd19kZWF0aAEACBBkZXN01QMUdmFsdWUIOGZvcmNlX3RyYW5zZmVyAQAMGHNvdXJjZdUDEGRlc3TVAxR2YWx1ZQhMdHJhbnNmZXJfa2VlcF9hbGl2ZQEACBBkZXN01QMUdmFsdWUIMHRyYW5zZmVyX2FsbAEACBBkZXN01QMoa2VlcF9hbGl2ZRQ8Zm9yY2VfdW5yZXNlcnZlAQAIDHdob9UDGGFtb3VudAhAdXBncmFkZV9hY2NvdW50cwEABAx3aG/dA0Rmb3JjZV9zZXRfYmFsYW5jZQEACAx3aG/VAyBuZXdfZnJlZQhsZm9yY2VfYWRqdXN0X3RvdGFsX2lzc3VhbmNlAQAIJGRpcmVjdGlvbuEDFGRlbHRhCBBidXJuAQAIFHZhbHVlCChrZWVwX2FsaXZlFBxTdGFraW5nAQJ4EGJvbmQBAAgUdmFsdWUIFHBheWVlNQEoYm9uZF9leHRyYQEABDhtYXhfYWRkaXRpb25hbAgYdW5ib25kAQAEFHZhbHVlCER3aXRoZHJhd191bmJvbmRlZAEABEhudW1fc2xhc2hpbmdfc3BhbnMEIHZhbGlkYXRlAQAEFHByZWZzOQEgbm9taW5hdGUBAAQcdGFyZ2V0c+kDFGNoaWxsAQEFJHNldF9wYXllZQEABBRwYXllZTUBOHNldF9jb250cm9sbGVyAQEFTHNldF92YWxpZGF0b3JfY291bnQBAAQMbmV3BGBpbmNyZWFzZV92YWxpZGF0b3JfY291bnQBAAQoYWRkaXRpb25hbARUc2NhbGVfdmFsaWRhdG9yX2NvdW50AQAEGGZhY3RvcgQ0Zm9yY2Vfbm9fZXJhcwEBBTRmb3JjZV9uZXdfZXJhAQEFRHNldF9pbnZ1bG5lcmFibGVzAQAENGludnVsbmVyYWJsZXPdAzRmb3JjZV91bnN0YWtlAQAIFHN0YXNoAEhudW1fc2xhc2hpbmdfc3BhbnMEUGZvcmNlX25ld19lcmFfYWx3YXlzAQEFVGNhbmNlbF9kZWZlcnJlZF9zbGFzaAEACAxlcmEENHNsYXNoX2luZGljZXM5AjhwYXlvdXRfc3Rha2VycwEACDx2YWxpZGF0b3Jfc3Rhc2gADGVyYQQYcmVib25kAQAEFHZhbHVlCChyZWFwX3N0YXNoAQAIFHN0YXNoAEhudW1fc2xhc2hpbmdfc3BhbnMEEGtpY2sBAAQMd2hv6QNMc2V0X3N0YWtpbmdfY29uZmlncwEAHEhtaW5fbm9taW5hdG9yX2JvbmTtA0htaW5fdmFsaWRhdG9yX2JvbmTtA0xtYXhfbm9taW5hdG9yX2NvdW508QNMbWF4X3ZhbGlkYXRvcl9jb3VudPEDPGNoaWxsX3RocmVzaG9sZPEDOG1pbl9jb21taXNzaW9u8QNIbWF4X3N0YWtlZF9yZXdhcmRz8QMsY2hpbGxfb3RoZXIBAAQUc3Rhc2gAaGZvcmNlX2FwcGx5X21pbl9jb21taXNzaW9uAQAEPHZhbGlkYXRvcl9zdGFzaABIc2V0X21pbl9jb21taXNzaW9uAQAEDG5ldwRYcGF5b3V0X3N0YWtlcnNfYnlfcGFnZQEADDx2YWxpZGF0b3Jfc3Rhc2gADGVyYQQQcGFnZQQwdXBkYXRlX3BheWVlAQAEKGNvbnRyb2xsZXIAaGRlcHJlY2F0ZV9jb250cm9sbGVyX2JhdGNoAQAELGNvbnRyb2xsZXJz3QM4cmVzdG9yZV9sZWRnZXIBABAUc3Rhc2gAQG1heWJlX2NvbnRyb2xsZXIFAixtYXliZV90b3RhbPUDPG1heWJlX3VubG9ja2luZwEEHFNlc3Npb24BAgggc2V0X2tleXMBAAgQa2V5cw0EFHByb29mJChwdXJnZV9rZXlzAQEFHEdyYW5kcGEBAgxMcmVwb3J0X2VxdWl2b2NhdGlvbgEACEhlcXVpdm9jYXRpb25fcHJvb2YlBDxrZXlfb3duZXJfcHJvb2a9A3ByZXBvcnRfZXF1aXZvY2F0aW9uX3Vuc2lnbmVkAQAISGVxdWl2b2NhdGlvbl9wcm9vZiUEPGtleV9vd25lcl9wcm9vZr0DMG5vdGVfc3RhbGxlZAEACBRkZWxheQRsYmVzdF9maW5hbGl6ZWRfYmxvY2tfbnVtYmVyBCBUcmVhc3VyeQECGCxzcGVuZF9sb2NhbAEACBhhbW91bnQILGJlbmVmaWNpYXJ51QM8cmVtb3ZlX2FwcHJvdmFsAQAELHByb3Bvc2FsX2lkBBRzcGVuZAEAEChhc3NldF9raW5kgQEYYW1vdW50CCxiZW5lZmljaWFyeZkBKHZhbGlkX2Zyb20tBBhwYXlvdXQBAAQUaW5kZXgEMGNoZWNrX3N0YXR1cwEABBRpbmRleAQodm9pZF9zcGVuZAEABBRpbmRleARAQ29udmljdGlvblZvdGluZwECGBB2b3RlAQAIKHBvbGxfaW5kZXgEEHZvdGU1BCBkZWxlZ2F0ZQEAEBRjbGFzcwQIdG/VAyhjb252aWN0aW9uOQQcYmFsYW5jZQgodW5kZWxlZ2F0ZQEABBRjbGFzcwQYdW5sb2NrAQAIFGNsYXNzBBh0YXJnZXTVAyxyZW1vdmVfdm90ZQEACBRjbGFzcy0EFGluZGV4BERyZW1vdmVfb3RoZXJfdm90ZQEADBh0YXJnZXTVAxRjbGFzcwQUaW5kZXgEJFJlZmVyZW5kYQECJBhzdWJtaXQBAAw8cHJvcG9zYWxfb3JpZ2lu5QsgcHJvcG9zYWylAUBlbmFjdG1lbnRfbW9tZW50QQRYcGxhY2VfZGVjaXNpb25fZGVwb3NpdAEABBRpbmRleARccmVmdW5kX2RlY2lzaW9uX2RlcG9zaXQBAAQUaW5kZXgEGGNhbmNlbAEABBRpbmRleAQQa2lsbAEABBRpbmRleARAbnVkZ2VfcmVmZXJlbmR1bQEABBRpbmRleARIb25lX2Zld2VyX2RlY2lkaW5nAQAEFHRyYWNrBGRyZWZ1bmRfc3VibWlzc2lvbl9kZXBvc2l0AQAEFGluZGV4BDBzZXRfbWV0YWRhdGEBAAgUaW5kZXgEKG1heWJlX2hhc2gRAVBGZWxsb3dzaGlwQ29sbGVjdGl2ZQECHChhZGRfbWVtYmVyAQAEDHdob9UDOHByb21vdGVfbWVtYmVyAQAEDHdob9UDNGRlbW90ZV9tZW1iZXIBAAQMd2hv1QM0cmVtb3ZlX21lbWJlcgEACAx3aG/VAyBtaW5fcmFuawQQdm90ZQEACBBwb2xsBAxheWUUMGNsZWFudXBfcG9sbAEACChwb2xsX2luZGV4BAxtYXgEPGV4Y2hhbmdlX21lbWJlcgEACAx3aG/VAxxuZXdfd2hv1QNMRmVsbG93c2hpcFJlZmVyZW5kYQECJBhzdWJtaXQBAAw8cHJvcG9zYWxfb3JpZ2lu5QsgcHJvcG9zYWylAUBlbmFjdG1lbnRfbW9tZW50QQRYcGxhY2VfZGVjaXNpb25fZGVwb3NpdAEABBRpbmRleARccmVmdW5kX2RlY2lzaW9uX2RlcG9zaXQBAAQUaW5kZXgEGGNhbmNlbAEABBRpbmRleAQQa2lsbAEABBRpbmRleARAbnVkZ2VfcmVmZXJlbmR1bQEABBRpbmRleARIb25lX2Zld2VyX2RlY2lkaW5nAQAEFHRyYWNrBGRyZWZ1bmRfc3VibWlzc2lvbl9kZXBvc2l0AQAEFGluZGV4BDBzZXRfbWV0YWRhdGEBAAgUaW5kZXgEKG1heWJlX2hhc2gRASRXaGl0ZWxpc3QBAhA4d2hpdGVsaXN0X2NhbGwBAAQkY2FsbF9oYXNoIFxyZW1vdmVfd2hpdGVsaXN0ZWRfY2FsbAEABCRjYWxsX2hhc2ggZGRpc3BhdGNoX3doaXRlbGlzdGVkX2NhbGwBAAwkY2FsbF9oYXNoIEBjYWxsX2VuY29kZWRfbGVuBExjYWxsX3dlaWdodF93aXRuZXNzGJxkaXNwYXRjaF93aGl0ZWxpc3RlZF9jYWxsX3dpdGhfcHJlaW1hZ2UBAAQQY2FsbJUMKFBhcmFtZXRlcnMBAgQ0c2V0X3BhcmFtZXRlcgEABCRrZXlfdmFsdWVVBBhDbGFpbXMBAhQUY2xhaW0BAAgQZGVzdABIZXRoZXJldW1fc2lnbmF0dXJlXQQobWludF9jbGFpbQEAEAx3aG9lARR2YWx1ZQhAdmVzdGluZ19zY2hlZHVsZWUEJHN0YXRlbWVudG0EMGNsYWltX2F0dGVzdAEADBBkZXN0AEhldGhlcmV1bV9zaWduYXR1cmVdBCRzdGF0ZW1lbnQkGGF0dGVzdAEABCRzdGF0ZW1lbnQkKG1vdmVfY2xhaW0BAAwMb2xkZQEMbmV3ZQE4bWF5YmVfcHJlY2xhaW0FAhxVdGlsaXR5AQIYFGJhdGNoAQAEFGNhbGxzBQw0YXNfZGVyaXZhdGl2ZQEACBRpbmRleAQQY2FsbJUMJGJhdGNoX2FsbAEABBRjYWxscwUMLGRpc3BhdGNoX2FzAQAIJGFzX29yaWdpbuULEGNhbGyVDCxmb3JjZV9iYXRjaAEABBRjYWxscwUMLHdpdGhfd2VpZ2h0AQAIEGNhbGyVDBh3ZWlnaHQYHFNvY2lldHkBAlAMYmlkAQAEFHZhbHVlCBR1bmJpZAEBBRR2b3VjaAEADAx3aG/VAxR2YWx1ZQgMdGlwCBx1bnZvdWNoAQEFEHZvdGUBAAgkY2FuZGlkYXRl1QMcYXBwcm92ZRQ0ZGVmZW5kZXJfdm90ZQEABBxhcHByb3ZlFBhwYXlvdXQBAQUsd2FpdmVfcmVwYXkBAAQYYW1vdW50CDRmb3VuZF9zb2NpZXR5AQAYHGZvdW5kZXLVAyxtYXhfbWVtYmVycwQobWF4X2ludGFrZQQsbWF4X3N0cmlrZXMERGNhbmRpZGF0ZV9kZXBvc2l0CBRydWxlcyQgZGlzc29sdmUBAQVYanVkZ2Vfc3VzcGVuZGVkX21lbWJlcgEACAx3aG/VAxxmb3JnaXZlFDhzZXRfcGFyYW1ldGVycwEAECxtYXhfbWVtYmVycwQobWF4X2ludGFrZQQsbWF4X3N0cmlrZXMERGNhbmRpZGF0ZV9kZXBvc2l0CDhwdW5pc2hfc2tlcHRpYwEBBUBjbGFpbV9tZW1iZXJzaGlwAQEFRGJlc3Rvd19tZW1iZXJzaGlwAQAEJGNhbmRpZGF0ZQA4a2lja19jYW5kaWRhdGUBAAQkY2FuZGlkYXRlAEByZXNpZ25fY2FuZGlkYWN5AQEFOGRyb3BfY2FuZGlkYXRlAQAEJGNhbmRpZGF0ZQBEY2xlYW51cF9jYW5kaWRhY3kBAAgkY2FuZGlkYXRlAAxtYXgERGNsZWFudXBfY2hhbGxlbmdlAQAIPGNoYWxsZW5nZV9yb3VuZAQMbWF4BCBSZWNvdmVyeQECJDBhc19yZWNvdmVyZWQBAAgcYWNjb3VudNUDEGNhbGyVDDRzZXRfcmVjb3ZlcmVkAQAIEGxvc3TVAxxyZXNjdWVy1QM8Y3JlYXRlX3JlY292ZXJ5AQAMHGZyaWVuZHPdAyR0aHJlc2hvbGQEMGRlbGF5X3BlcmlvZAREaW5pdGlhdGVfcmVjb3ZlcnkBAAQcYWNjb3VudNUDOHZvdWNoX3JlY292ZXJ5AQAIEGxvc3TVAxxyZXNjdWVy1QM4Y2xhaW1fcmVjb3ZlcnkBAAQcYWNjb3VudNUDOGNsb3NlX3JlY292ZXJ5AQAEHHJlc2N1ZXLVAzxyZW1vdmVfcmVjb3ZlcnkBAQVAY2FuY2VsX3JlY292ZXJlZAEABBxhY2NvdW501QMcVmVzdGluZwECGBB2ZXN0AQEFKHZlc3Rfb3RoZXIBAAQYdGFyZ2V01QM8dmVzdGVkX3RyYW5zZmVyAQAIGHRhcmdldNUDIHNjaGVkdWxldQRUZm9yY2VfdmVzdGVkX3RyYW5zZmVyAQAMGHNvdXJjZdUDGHRhcmdldNUDIHNjaGVkdWxldQQ8bWVyZ2Vfc2NoZWR1bGVzAQAIPHNjaGVkdWxlMV9pbmRleAQ8c2NoZWR1bGUyX2luZGV4BHRmb3JjZV9yZW1vdmVfdmVzdGluZ19zY2hlZHVsZQEACBh0YXJnZXTVAzhzY2hlZHVsZV9pbmRleAQkU2NoZWR1bGVyAQIoIHNjaGVkdWxlAQAQEHdoZW4EOG1heWJlX3BlcmlvZGljgQMgcHJpb3JpdHkEEGNhbGyVDBhjYW5jZWwBAAgQd2hlbgQUaW5kZXgEOHNjaGVkdWxlX25hbWVkAQAUCGlkIBB3aGVuBDhtYXliZV9wZXJpb2RpY4EDIHByaW9yaXR5BBBjYWxslQwwY2FuY2VsX25hbWVkAQAECGlkIDhzY2hlZHVsZV9hZnRlcgEAEBRhZnRlcgQ4bWF5YmVfcGVyaW9kaWOBAyBwcmlvcml0eQQQY2FsbJUMUHNjaGVkdWxlX25hbWVkX2FmdGVyAQAUCGlkIBRhZnRlcgQ4bWF5YmVfcGVyaW9kaWOBAyBwcmlvcml0eQQQY2FsbJUMJHNldF9yZXRyeQEADBB0YXNrDQEccmV0cmllcwQYcGVyaW9kBDxzZXRfcmV0cnlfbmFtZWQBAAwIaWQgHHJldHJpZXMEGHBlcmlvZAQwY2FuY2VsX3JldHJ5AQAEEHRhc2sNAUhjYW5jZWxfcmV0cnlfbmFtZWQBAAQIaWQgFFByb3h5AQIoFHByb3h5AQAMEHJlYWzVA0Bmb3JjZV9wcm94eV90eXBlGQwQY2FsbJUMJGFkZF9wcm94eQEADCBkZWxlZ2F0ZdUDKHByb3h5X3R5cGWtCxRkZWxheQQwcmVtb3ZlX3Byb3h5AQAMIGRlbGVnYXRl1QMocHJveHlfdHlwZa0LFGRlbGF5BDhyZW1vdmVfcHJveGllcwEBBSxjcmVhdGVfcHVyZQEADChwcm94eV90eXBlrQsUZGVsYXkEFGluZGV4BCRraWxsX3B1cmUBABQcc3Bhd25lctUDKHByb3h5X3R5cGWtCxRpbmRleAQYaGVpZ2h0BCRleHRfaW5kZXgEIGFubm91bmNlAQAIEHJlYWzVAyRjYWxsX2hhc2ggTHJlbW92ZV9hbm5vdW5jZW1lbnQBAAgQcmVhbNUDJGNhbGxfaGFzaCBMcmVqZWN0X2Fubm91bmNlbWVudAEACCBkZWxlZ2F0ZdUDJGNhbGxfaGFzaCA8cHJveHlfYW5ub3VuY2VkAQAQIGRlbGVnYXRl1QMQcmVhbNUDQGZvcmNlX3Byb3h5X3R5cGUZDBBjYWxslQwgTXVsdGlzaWcBAhBQYXNfbXVsdGlfdGhyZXNob2xkXzEBAAhEb3RoZXJfc2lnbmF0b3JpZXPdAxBjYWxslQwgYXNfbXVsdGkBABQkdGhyZXNob2xkBERvdGhlcl9zaWduYXRvcmllc90DPG1heWJlX3RpbWVwb2ludI0EEGNhbGyVDChtYXhfd2VpZ2h0GEBhcHByb3ZlX2FzX211bHRpAQAUJHRocmVzaG9sZAREb3RoZXJfc2lnbmF0b3JpZXPdAzxtYXliZV90aW1lcG9pbnSNBCRjYWxsX2hhc2ggKG1heF93ZWlnaHQYPGNhbmNlbF9hc19tdWx0aQEAECR0aHJlc2hvbGQERG90aGVyX3NpZ25hdG9yaWVz3QMkdGltZXBvaW508QEkY2FsbF9oYXNoICBQcmVpbWFnZQECFDRub3RlX3ByZWltYWdlAQAEFGJ5dGVzJDx1bm5vdGVfcHJlaW1hZ2UBAAQQaGFzaCBAcmVxdWVzdF9wcmVpbWFnZQEABBBoYXNoIEh1bnJlcXVlc3RfcHJlaW1hZ2UBAAQQaGFzaCA4ZW5zdXJlX3VwZGF0ZWQBAAQYaGFzaGVzOQMgQm91bnRpZXMBAiQ4cHJvcG9zZV9ib3VudHkBAAgUdmFsdWUILGRlc2NyaXB0aW9uJDhhcHByb3ZlX2JvdW50eQEABCRib3VudHlfaWQEPHByb3Bvc2VfY3VyYXRvcgEADCRib3VudHlfaWQEHGN1cmF0b3LVAwxmZWUIQHVuYXNzaWduX2N1cmF0b3IBAAQkYm91bnR5X2lkBDhhY2NlcHRfY3VyYXRvcgEABCRib3VudHlfaWQEMGF3YXJkX2JvdW50eQEACCRib3VudHlfaWQELGJlbmVmaWNpYXJ51QMwY2xhaW1fYm91bnR5AQAEJGJvdW50eV9pZAQwY2xvc2VfYm91bnR5AQAEJGJvdW50eV9pZARQZXh0ZW5kX2JvdW50eV9leHBpcnkBAAgkYm91bnR5X2lkBBhyZW1hcmskNENoaWxkQm91bnRpZXMBAhxAYWRkX2NoaWxkX2JvdW50eQEADEBwYXJlbnRfYm91bnR5X2lkBBR2YWx1ZQgsZGVzY3JpcHRpb24kPHByb3Bvc2VfY3VyYXRvcgEAEEBwYXJlbnRfYm91bnR5X2lkBDxjaGlsZF9ib3VudHlfaWQEHGN1cmF0b3LVAwxmZWUIOGFjY2VwdF9jdXJhdG9yAQAIQHBhcmVudF9ib3VudHlfaWQEPGNoaWxkX2JvdW50eV9pZARAdW5hc3NpZ25fY3VyYXRvcgEACEBwYXJlbnRfYm91bnR5X2lkBDxjaGlsZF9ib3VudHlfaWQESGF3YXJkX2NoaWxkX2JvdW50eQEADEBwYXJlbnRfYm91bnR5X2lkBDxjaGlsZF9ib3VudHlfaWQELGJlbmVmaWNpYXJ51QNIY2xhaW1fY2hpbGRfYm91bnR5AQAIQHBhcmVudF9ib3VudHlfaWQEPGNoaWxkX2JvdW50eV9pZARIY2xvc2VfY2hpbGRfYm91bnR5AQAIQHBhcmVudF9ib3VudHlfaWQEPGNoaWxkX2JvdW50eV9pZARoRWxlY3Rpb25Qcm92aWRlck11bHRpUGhhc2UBAhQ8c3VibWl0X3Vuc2lnbmVkAQAIMHJhd19zb2x1dGlvbokMHHdpdG5lc3NdBWxzZXRfbWluaW11bV91bnRydXN0ZWRfc2NvcmUBAARAbWF5YmVfbmV4dF9zY29yZWEFdHNldF9lbWVyZ2VuY3lfZWxlY3Rpb25fcmVzdWx0AQAEIHN1cHBvcnRzdQUYc3VibWl0AQAEMHJhd19zb2x1dGlvbokMTGdvdmVybmFuY2VfZmFsbGJhY2sBAAhAbWF5YmVfbWF4X3ZvdGVycy0ERG1heWJlX21heF90YXJnZXRzLQQMTmlzAQIcJHBsYWNlX2JpZAEACBhhbW91bnQIIGR1cmF0aW9uBCxyZXRyYWN0X2JpZAEACBhhbW91bnQIIGR1cmF0aW9uBDBmdW5kX2RlZmljaXQBAQUwdGhhd19wcml2YXRlAQAIFGluZGV4BEBtYXliZV9wcm9wb3J0aW9u9QM0dGhhd19jb21tdW5hbAEABBRpbmRleAQkY29tbXVuaWZ5AQAEFGluZGV4BCRwcml2YXRpemUBAAQUaW5kZXgEWE5pc0NvdW50ZXJwYXJ0QmFsYW5jZXMBAiRQdHJhbnNmZXJfYWxsb3dfZGVhdGgBAAgQZGVzdNUDFHZhbHVlCDhmb3JjZV90cmFuc2ZlcgEADBhzb3VyY2XVAxBkZXN01QMUdmFsdWUITHRyYW5zZmVyX2tlZXBfYWxpdmUBAAgQZGVzdNUDFHZhbHVlCDB0cmFuc2Zlcl9hbGwBAAgQZGVzdNUDKGtlZXBfYWxpdmUUPGZvcmNlX3VucmVzZXJ2ZQEACAx3aG/VAxhhbW91bnQIQHVwZ3JhZGVfYWNjb3VudHMBAAQMd2hv3QNEZm9yY2Vfc2V0X2JhbGFuY2UBAAgMd2hv1QMgbmV3X2ZyZWUIbGZvcmNlX2FkanVzdF90b3RhbF9pc3N1YW5jZQEACCRkaXJlY3Rpb27hAxRkZWx0YQgQYnVybgEACBR2YWx1ZQgoa2VlcF9hbGl2ZRQkVm90ZXJMaXN0AQIMFHJlYmFnAQAEKGRpc2xvY2F0ZWTVAzxwdXRfaW5fZnJvbnRfb2YBAAQcbGlnaHRlctUDVHB1dF9pbl9mcm9udF9vZl9vdGhlcgEACBxoZWF2aWVy1QMcbGlnaHRlctUDPE5vbWluYXRpb25Qb29scwECaBBqb2luAQAIGGFtb3VudAgccG9vbF9pZAQoYm9uZF9leHRyYQEABBRleHRyYYEFMGNsYWltX3BheW91dAEBBRh1bmJvbmQBAAg4bWVtYmVyX2FjY291bnTVA0B1bmJvbmRpbmdfcG9pbnRzCFhwb29sX3dpdGhkcmF3X3VuYm9uZGVkAQAIHHBvb2xfaWQESG51bV9zbGFzaGluZ19zcGFucwREd2l0aGRyYXdfdW5ib25kZWQBAAg4bWVtYmVyX2FjY291bnTVA0hudW1fc2xhc2hpbmdfc3BhbnMEGGNyZWF0ZQEAEBhhbW91bnQIEHJvb3TVAyRub21pbmF0b3LVAxxib3VuY2Vy1QNMY3JlYXRlX3dpdGhfcG9vbF9pZAEAFBhhbW91bnQIEHJvb3TVAyRub21pbmF0b3LVAxxib3VuY2Vy1QMccG9vbF9pZAQgbm9taW5hdGUBAAgccG9vbF9pZAQodmFsaWRhdG9yc90DJHNldF9zdGF0ZQEACBxwb29sX2lkBBRzdGF0ZR0CMHNldF9tZXRhZGF0YQEACBxwb29sX2lkBCBtZXRhZGF0YSQsc2V0X2NvbmZpZ3MBABg0bWluX2pvaW5fYm9uZO0DPG1pbl9jcmVhdGVfYm9uZO0DJG1heF9wb29sc/EDLG1heF9tZW1iZXJz8QNQbWF4X21lbWJlcnNfcGVyX3Bvb2zxA1RnbG9iYWxfbWF4X2NvbW1pc3Npb27xAzB1cGRhdGVfcm9sZXMBABAccG9vbF9pZAQgbmV3X3Jvb3SFBTRuZXdfbm9taW5hdG9yhQUsbmV3X2JvdW5jZXKFBRRjaGlsbAEABBxwb29sX2lkBEBib25kX2V4dHJhX290aGVyAQAIGG1lbWJlctUDFGV4dHJhgQVQc2V0X2NsYWltX3Blcm1pc3Npb24BAAQocGVybWlzc2lvbokFSGNsYWltX3BheW91dF9vdGhlcgEABBRvdGhlcgA4c2V0X2NvbW1pc3Npb24BAAgccG9vbF9pZAQ4bmV3X2NvbW1pc3Npb24lAkhzZXRfY29tbWlzc2lvbl9tYXgBAAgccG9vbF9pZAQ4bWF4X2NvbW1pc3Npb24EaHNldF9jb21taXNzaW9uX2NoYW5nZV9yYXRlAQAIHHBvb2xfaWQELGNoYW5nZV9yYXRlKQJAY2xhaW1fY29tbWlzc2lvbgEABBxwb29sX2lkBExhZGp1c3RfcG9vbF9kZXBvc2l0AQAEHHBvb2xfaWQEfHNldF9jb21taXNzaW9uX2NsYWltX3Blcm1pc3Npb24BAAgccG9vbF9pZAQocGVybWlzc2lvbjECLGFwcGx5X3NsYXNoAQAEOG1lbWJlcl9hY2NvdW501QNIbWlncmF0ZV9kZWxlZ2F0aW9uAQAEOG1lbWJlcl9hY2NvdW501QN4bWlncmF0ZV9wb29sX3RvX2RlbGVnYXRlX3N0YWtlAQAEHHBvb2xfaWQELEZhc3RVbnN0YWtlAQIMVHJlZ2lzdGVyX2Zhc3RfdW5zdGFrZQEBBShkZXJlZ2lzdGVyAQEFHGNvbnRyb2wBAAQ0ZXJhc190b19jaGVjawQ0Q29uZmlndXJhdGlvbgECwHxzZXRfdmFsaWRhdGlvbl91cGdyYWRlX2Nvb2xkb3duAQAEDG5ldwRwc2V0X3ZhbGlkYXRpb25fdXBncmFkZV9kZWxheQEABAxuZXcEZHNldF9jb2RlX3JldGVudGlvbl9wZXJpb2QBAAQMbmV3BERzZXRfbWF4X2NvZGVfc2l6ZQEABAxuZXcEQHNldF9tYXhfcG92X3NpemUBAAQMbmV3BFhzZXRfbWF4X2hlYWRfZGF0YV9zaXplAQAEDG5ldwRIc2V0X2NvcmV0aW1lX2NvcmVzAQAEDG5ldwR0c2V0X21heF9hdmFpbGFiaWxpdHlfdGltZW91dHMBAAQMbmV3BHBzZXRfZ3JvdXBfcm90YXRpb25fZnJlcXVlbmN5AQAEDG5ldwR0c2V0X3BhcmFzX2F2YWlsYWJpbGl0eV9wZXJpb2QBAAQMbmV3BGBzZXRfc2NoZWR1bGluZ19sb29rYWhlYWQBAAQMbmV3BGxzZXRfbWF4X3ZhbGlkYXRvcnNfcGVyX2NvcmUBAAQMbmV3LQRIc2V0X21heF92YWxpZGF0b3JzAQAEDG5ldy0ESHNldF9kaXNwdXRlX3BlcmlvZAEABAxuZXcEtHNldF9kaXNwdXRlX3Bvc3RfY29uY2x1c2lvbl9hY2NlcHRhbmNlX3BlcmlvZAEABAxuZXcERHNldF9ub19zaG93X3Nsb3RzAQAEDG5ldwRQc2V0X25fZGVsYXlfdHJhbmNoZXMBAAQMbmV3BHhzZXRfemVyb3RoX2RlbGF5X3RyYW5jaGVfd2lkdGgBAAQMbmV3BFBzZXRfbmVlZGVkX2FwcHJvdmFscwEABAxuZXcEcHNldF9yZWxheV92cmZfbW9kdWxvX3NhbXBsZXMBAAQMbmV3BGhzZXRfbWF4X3Vwd2FyZF9xdWV1ZV9jb3VudAEABAxuZXcEZHNldF9tYXhfdXB3YXJkX3F1ZXVlX3NpemUBAAQMbmV3BHRzZXRfbWF4X2Rvd253YXJkX21lc3NhZ2Vfc2l6ZQEABAxuZXcEbHNldF9tYXhfdXB3YXJkX21lc3NhZ2Vfc2l6ZQEABAxuZXcEoHNldF9tYXhfdXB3YXJkX21lc3NhZ2VfbnVtX3Blcl9jYW5kaWRhdGUBAAQMbmV3BGRzZXRfaHJtcF9vcGVuX3JlcXVlc3RfdHRsAQAEDG5ldwRcc2V0X2hybXBfc2VuZGVyX2RlcG9zaXQBAAQMbmV3CGhzZXRfaHJtcF9yZWNpcGllbnRfZGVwb3NpdAEABAxuZXcIdHNldF9ocm1wX2NoYW5uZWxfbWF4X2NhcGFjaXR5AQAEDG5ldwR8c2V0X2hybXBfY2hhbm5lbF9tYXhfdG90YWxfc2l6ZQEABAxuZXcEnHNldF9ocm1wX21heF9wYXJhY2hhaW5faW5ib3VuZF9jaGFubmVscwEABAxuZXcEhHNldF9ocm1wX2NoYW5uZWxfbWF4X21lc3NhZ2Vfc2l6ZQEABAxuZXcEoHNldF9ocm1wX21heF9wYXJhY2hhaW5fb3V0Ym91bmRfY2hhbm5lbHMBAAQMbmV3BJhzZXRfaHJtcF9tYXhfbWVzc2FnZV9udW1fcGVyX2NhbmRpZGF0ZQEABAxuZXcESHNldF9wdmZfdm90aW5nX3R0bAEABAxuZXcEkHNldF9taW5pbXVtX3ZhbGlkYXRpb25fdXBncmFkZV9kZWxheQEABAxuZXcEcHNldF9ieXBhc3NfY29uc2lzdGVuY3lfY2hlY2sBAAQMbmV3FGBzZXRfYXN5bmNfYmFja2luZ19wYXJhbXMBAAQMbmV3lQVMc2V0X2V4ZWN1dG9yX3BhcmFtcwEABAxuZXelBVhzZXRfb25fZGVtYW5kX2Jhc2VfZmVlAQAEDG5ldwh0c2V0X29uX2RlbWFuZF9mZWVfdmFyaWFiaWxpdHkBAAQMbmV3BHBzZXRfb25fZGVtYW5kX3F1ZXVlX21heF9zaXplAQAEDG5ldwSYc2V0X29uX2RlbWFuZF90YXJnZXRfcXVldWVfdXRpbGl6YXRpb24BAAQMbmV3BERzZXRfb25fZGVtYW5kX3R0bAEABAxuZXcEZHNldF9taW5pbXVtX2JhY2tpbmdfdm90ZXMBAAQMbmV3BEBzZXRfbm9kZV9mZWF0dXJlAQAIFGluZGV4BBR2YWx1ZRRoc2V0X2FwcHJvdmFsX3ZvdGluZ19wYXJhbXMBAAQMbmV3BFBzZXRfc2NoZWR1bGVyX3BhcmFtcwEABAxuZXepBSxQYXJhc1NoYXJlZAEBBTRQYXJhSW5jbHVzaW9uAQEFMFBhcmFJbmhlcmVudAECBBRlbnRlcgEABBBkYXRh/QUUUGFyYXMBAiRYZm9yY2Vfc2V0X2N1cnJlbnRfY29kZQEACBBwYXJhBCBuZXdfY29kZSRYZm9yY2Vfc2V0X2N1cnJlbnRfaGVhZAEACBBwYXJhBCBuZXdfaGVhZCRsZm9yY2Vfc2NoZWR1bGVfY29kZV91cGdyYWRlAQAMEHBhcmEEIG5ld19jb2RlJExyZWxheV9wYXJlbnRfbnVtYmVyBExmb3JjZV9ub3RlX25ld19oZWFkAQAIEHBhcmEEIG5ld19oZWFkJEhmb3JjZV9xdWV1ZV9hY3Rpb24BAAQQcGFyYQRsYWRkX3RydXN0ZWRfdmFsaWRhdGlvbl9jb2RlAQAEPHZhbGlkYXRpb25fY29kZSRscG9rZV91bnVzZWRfdmFsaWRhdGlvbl9jb2RlAQAEUHZhbGlkYXRpb25fY29kZV9oYXNoIGxpbmNsdWRlX3B2Zl9jaGVja19zdGF0ZW1lbnQBAAgQc3RtdAUGJHNpZ25hdHVyZUECdGZvcmNlX3NldF9tb3N0X3JlY2VudF9jb250ZXh0AQAIEHBhcmEEHGNvbnRleHQELEluaXRpYWxpemVyAQIENGZvcmNlX2FwcHJvdmUBAAQUdXBfdG8EEEhybXABAixYaHJtcF9pbml0X29wZW5fY2hhbm5lbAEADCRyZWNpcGllbnQEVHByb3Bvc2VkX21heF9jYXBhY2l0eQRkcHJvcG9zZWRfbWF4X21lc3NhZ2Vfc2l6ZQRgaHJtcF9hY2NlcHRfb3Blbl9jaGFubmVsAQAEGHNlbmRlcgRIaHJtcF9jbG9zZV9jaGFubmVsAQAEKGNoYW5uZWxfaWRVAkBmb3JjZV9jbGVhbl9ocm1wAQAMEHBhcmEELG51bV9pbmJvdW5kBDBudW1fb3V0Ym91bmQEXGZvcmNlX3Byb2Nlc3NfaHJtcF9vcGVuAQAEIGNoYW5uZWxzBGBmb3JjZV9wcm9jZXNzX2hybXBfY2xvc2UBAAQgY2hhbm5lbHMEYGhybXBfY2FuY2VsX29wZW5fcmVxdWVzdAEACChjaGFubmVsX2lkVQI0b3Blbl9yZXF1ZXN0cwRcZm9yY2Vfb3Blbl9ocm1wX2NoYW5uZWwBABAYc2VuZGVyBCRyZWNpcGllbnQEMG1heF9jYXBhY2l0eQRAbWF4X21lc3NhZ2Vfc2l6ZQRgZXN0YWJsaXNoX3N5c3RlbV9jaGFubmVsAQAIGHNlbmRlcgQkcmVjaXBpZW50BFRwb2tlX2NoYW5uZWxfZGVwb3NpdHMBAAgYc2VuZGVyBCRyZWNpcGllbnQEdGVzdGFibGlzaF9jaGFubmVsX3dpdGhfc3lzdGVtAQAETHRhcmdldF9zeXN0ZW1fY2hhaW4ENFBhcmFzRGlzcHV0ZXMBAgQ4Zm9yY2VfdW5mcmVlemUBAQU0UGFyYXNTbGFzaGluZwECBHByZXBvcnRfZGlzcHV0ZV9sb3N0X3Vuc2lnbmVkAQAINGRpc3B1dGVfcHJvb2YhBjxrZXlfb3duZXJfcHJvb2a9A2hPbkRlbWFuZEFzc2lnbm1lbnRQcm92aWRlcgECCFxwbGFjZV9vcmRlcl9hbGxvd19kZWF0aAEACChtYXhfYW1vdW50CBxwYXJhX2lkBFhwbGFjZV9vcmRlcl9rZWVwX2FsaXZlAQAIKG1heF9hbW91bnQIHHBhcmFfaWQEJFJlZ2lzdHJhcgECJCByZWdpc3RlcgEADAhpZAQwZ2VuZXNpc19oZWFkJDx2YWxpZGF0aW9uX2NvZGUkOGZvcmNlX3JlZ2lzdGVyAQAUDHdobwAcZGVwb3NpdAgIaWQEMGdlbmVzaXNfaGVhZCQ8dmFsaWRhdGlvbl9jb2RlJChkZXJlZ2lzdGVyAQAECGlkBBBzd2FwAQAICGlkBBRvdGhlcgQscmVtb3ZlX2xvY2sBAAQQcGFyYQQccmVzZXJ2ZQEBBSBhZGRfbG9jawEABBBwYXJhBFRzY2hlZHVsZV9jb2RlX3VwZ3JhZGUBAAgQcGFyYQQgbmV3X2NvZGUkQHNldF9jdXJyZW50X2hlYWQBAAgQcGFyYQQgbmV3X2hlYWQkFFNsb3RzAQIMLGZvcmNlX2xlYXNlAQAUEHBhcmEEGGxlYXNlcgAYYW1vdW50CDBwZXJpb2RfYmVnaW4EMHBlcmlvZF9jb3VudARAY2xlYXJfYWxsX2xlYXNlcwEABBBwYXJhBDx0cmlnZ2VyX29uYm9hcmQBAAQQcGFyYQQgQXVjdGlvbnMBAgwsbmV3X2F1Y3Rpb24BAAggZHVyYXRpb24ESGxlYXNlX3BlcmlvZF9pbmRleAQMYmlkAQAUEHBhcmEENGF1Y3Rpb25faW5kZXgEKGZpcnN0X3Nsb3QEJGxhc3Rfc2xvdAQYYW1vdW50CDhjYW5jZWxfYXVjdGlvbgEBBSRDcm93ZGxvYW4BAiQYY3JlYXRlAQAYFGluZGV4BAxjYXAIMGZpcnN0X3BlcmlvZAQsbGFzdF9wZXJpb2QEDGVuZAQgdmVyaWZpZXI9Bihjb250cmlidXRlAQAMFGluZGV4BBR2YWx1ZQgkc2lnbmF0dXJlRQYgd2l0aGRyYXcBAAgMd2hvABRpbmRleAQYcmVmdW5kAQAEFGluZGV4BCBkaXNzb2x2ZQEABBRpbmRleAQQZWRpdAEAGBRpbmRleAQMY2FwCDBmaXJzdF9wZXJpb2QELGxhc3RfcGVyaW9kBAxlbmQEIHZlcmlmaWVyPQYgYWRkX21lbW8BAAgUaW5kZXgEEG1lbW8kEHBva2UBAAQUaW5kZXgEOGNvbnRyaWJ1dGVfYWxsAQAIFGluZGV4BCRzaWduYXR1cmVFBiBDb3JldGltZQECDEhyZXF1ZXN0X2NvcmVfY291bnQBAAQUY291bnQESHJlcXVlc3RfcmV2ZW51ZV9hdAEABBB3aGVuBCxhc3NpZ25fY29yZQEAEBBjb3JlBBRiZWdpbgQoYXNzaWdubWVudFUGIGVuZF9oaW50LQQkWGNtUGFsbGV0AQI4EHNlbmQBAAgQZGVzdJkBHG1lc3NhZ2WpBjx0ZWxlcG9ydF9hc3NldHMBABAQZGVzdJkBLGJlbmVmaWNpYXJ5mQEYYXNzZXRzGQM4ZmVlX2Fzc2V0X2l0ZW0EXHJlc2VydmVfdHJhbnNmZXJfYXNzZXRzAQAQEGRlc3SZASxiZW5lZmljaWFyeZkBGGFzc2V0cxkDOGZlZV9hc3NldF9pdGVtBBxleGVjdXRlAQAIHG1lc3NhZ2WpBihtYXhfd2VpZ2h0GERmb3JjZV94Y21fdmVyc2lvbgEACCBsb2NhdGlvbnkBHHZlcnNpb24EZGZvcmNlX2RlZmF1bHRfeGNtX3ZlcnNpb24BAAREbWF5YmVfeGNtX3ZlcnNpb24tBHhmb3JjZV9zdWJzY3JpYmVfdmVyc2lvbl9ub3RpZnkBAAQgbG9jYXRpb26ZAYBmb3JjZV91bnN1YnNjcmliZV92ZXJzaW9uX25vdGlmeQEABCBsb2NhdGlvbpkBfGxpbWl0ZWRfcmVzZXJ2ZV90cmFuc2Zlcl9hc3NldHMBABQQZGVzdJkBLGJlbmVmaWNpYXJ5mQEYYXNzZXRzGQM4ZmVlX2Fzc2V0X2l0ZW0EMHdlaWdodF9saW1pdPECXGxpbWl0ZWRfdGVsZXBvcnRfYXNzZXRzAQAUEGRlc3SZASxiZW5lZmljaWFyeZkBGGFzc2V0cxkDOGZlZV9hc3NldF9pdGVtBDB3ZWlnaHRfbGltaXTxAkBmb3JjZV9zdXNwZW5zaW9uAQAEJHN1c3BlbmRlZBQ8dHJhbnNmZXJfYXNzZXRzAQAUEGRlc3SZASxiZW5lZmljaWFyeZkBGGFzc2V0cxkDOGZlZV9hc3NldF9pdGVtBDB3ZWlnaHRfbGltaXTxAjBjbGFpbV9hc3NldHMBAAgYYXNzZXRzGQMsYmVuZWZpY2lhcnmZAYx0cmFuc2Zlcl9hc3NldHNfdXNpbmdfdHlwZV9hbmRfdGhlbgEAHBBkZXN0mQEYYXNzZXRzGQNQYXNzZXRzX3RyYW5zZmVyX3R5cGWtBjhyZW1vdGVfZmVlc19pZLEGSGZlZXNfdHJhbnNmZXJfdHlwZa0GSGN1c3RvbV94Y21fb25fZGVzdKkGMHdlaWdodF9saW1pdPECME1lc3NhZ2VRdWV1ZQECCCRyZWFwX3BhZ2UBAAg4bWVzc2FnZV9vcmlnaW4lAyhwYWdlX2luZGV4BEhleGVjdXRlX292ZXJ3ZWlnaHQBABA4bWVzc2FnZV9vcmlnaW4lAxBwYWdlBBRpbmRleAQwd2VpZ2h0X2xpbWl0GCRBc3NldFJhdGUBAgwYY3JlYXRlAQAIKGFzc2V0X2tpbmSBARByYXRlCBh1cGRhdGUBAAgoYXNzZXRfa2luZIEBEHJhdGUIGHJlbW92ZQEABChhc3NldF9raW5kgQEUQmVlZnkBAgxMcmVwb3J0X2VxdWl2b2NhdGlvbgEACEhlcXVpdm9jYXRpb25fcHJvb2bVBjxrZXlfb3duZXJfcHJvb2a9A3ByZXBvcnRfZXF1aXZvY2F0aW9uX3Vuc2lnbmVkAQAISGVxdWl2b2NhdGlvbl9wcm9vZtUGPGtleV9vd25lcl9wcm9vZr0DPHNldF9uZXdfZ2VuZXNpcwEABDxkZWxheV9pbl9ibG9ja3MEAgggVm91Y2hpbmcBAQUYQmFubmVkAQEFBpkMABAQcmFuawQcc3RyaWtlcwQgdm91Y2hpbmedDBRpbmRleAQACBBwYWlkCBxwYXlvdXRz2QcCCBxEZXBvc2l0AQEDFFZvdWNoAQMIAAgADAx3aG8AEGtpbmSpDBR2YWx1ZQgErQwAAAgkYXBwcm92YWxzBChyZWplY3Rpb25zBAAUFHJvdW5kBBBraW5kqQwMYmlkCBR0YWxsebUMOHNrZXB0aWNfc3RydWNrFAQAAQgACBxhcHByb3ZlFBh3ZWlnaHQEAAwMd2hvAAxiaWQIFHJvdW5kBAMMAAC1DAAQMGRlbGF5X3BlcmlvZAQcZGVwb3NpdAgcZnJpZW5kc90DJHRocmVzaG9sZAQADBxjcmVhdGVkBBxkZXBvc2l0CBxmcmllbmRz3QMAFCBtYXliZV9pZBEBIHByaW9yaXR5BBBjYWxspQE4bWF5YmVfcGVyaW9kaWOBAxhvcmlnaW7lCwbVDATZDAAADCBkZWxlZ2F0ZQAocHJveHlfdHlwZa0LFGRlbGF5BAThDAADCOUMCAAQDHdobwAcZGVwb3NpdAgwcmF3X3NvbHV0aW9uiQwgY2FsbF9mZWUIBN0HAAAUPHByb3BvcnRpb25fb3dlZAgUaW5kZXgEGHRoYXdlZAgsbGFzdF9wZXJpb2QEQHJlY2VpcHRzX29uX2hvbGQIAAwocHJvcG9ydGlvbggUb3duZXLhBhhleHBpcnkEAAQYYW1vdW50CAT9DAAHlQsVCgTFCwAAEEBleGVjdXRpb25fcmVzdWx0jQs4ZW1pdHRlZF9ldmVudHMJDSRsb2NhbF94Y20lCzhmb3J3YXJkZWRfeGNtczELBw0NOQsADEBleGVjdXRpb25fcmVzdWx0jQI4ZW1pdHRlZF9ldmVudHMJDThmb3J3YXJkZWRfeGNtczELBxUNOQsCJDxQYXJhRG9lc250RXhpc3QBAQVEUGFyYUFscmVhZHlFeGlzdHMBAQVURXhjZWVkc01heE1lc3NhZ2VTaXplAQEFOENvdWxkbnRDbGVhbnVwAQEFNE5vdFBhcmF0aHJlYWQBAQUwTm90UGFyYWNoYWluAQEFNENhbm5vdFVwZ3JhZGUBAQU8Q2Fubm90RG93bmdyYWRlAQEFMFRvb01hbnlDb3JlcwEBBQIELFJlcXVpcmVTdWRvAQEFAvQYU3lzdGVtAQIkPEludmFsaWRTcGVjTmFtZQEBBWhTcGVjVmVyc2lvbk5lZWRzVG9JbmNyZWFzZQEBBXRGYWlsZWRUb0V4dHJhY3RSdW50aW1lVmVyc2lvbgEBBUxOb25EZWZhdWx0Q29tcG9zaXRlAQEFPE5vblplcm9SZWZDb3VudAEBBTBDYWxsRmlsdGVyZWQBAQVsTXVsdGlCbG9ja01pZ3JhdGlvbnNPbmdvaW5nAQEFRE5vdGhpbmdBdXRob3JpemVkAQEFMFVuYXV0aG9yaXplZAEBBSRTY2hlZHVsZXIBAhRARmFpbGVkVG9TY2hlZHVsZQEBBSBOb3RGb3VuZAEBBVxUYXJnZXRCbG9ja051bWJlckluUGFzdAEBBUhSZXNjaGVkdWxlTm9DaGFuZ2UBAQUUTmFtZWQBAQUgUHJlaW1hZ2UBAiQYVG9vQmlnAQEFMEFscmVhZHlOb3RlZAEBBTROb3RBdXRob3JpemVkAQEFIE5vdE5vdGVkAQEFJFJlcXVlc3RlZAEBBTBOb3RSZXF1ZXN0ZWQBAQUcVG9vTWFueQEBBRhUb29GZXcBAQUYTm9Db3N0AQEFEEJhYmUBAhBgSW52YWxpZEVxdWl2b2NhdGlvblByb29mAQEFYEludmFsaWRLZXlPd25lcnNoaXBQcm9vZgEBBVhEdXBsaWNhdGVPZmZlbmNlUmVwb3J0AQEFUEludmFsaWRDb25maWd1cmF0aW9uAQEFJFRpbWVzdGFtcAEBBRxJbmRpY2VzAQIULE5vdEFzc2lnbmVkAQEFIE5vdE93bmVyAQEFFEluVXNlAQEFLE5vdFRyYW5zZmVyAQEFJFBlcm1hbmVudAEBBSBCYWxhbmNlcwECMDhWZXN0aW5nQmFsYW5jZQEBBVRMaXF1aWRpdHlSZXN0cmljdGlvbnMBAQVMSW5zdWZmaWNpZW50QmFsYW5jZQEBBUhFeGlzdGVudGlhbERlcG9zaXQBAQU0RXhwZW5kYWJpbGl0eQEBBVxFeGlzdGluZ1Zlc3RpbmdTY2hlZHVsZQEBBSxEZWFkQWNjb3VudAEBBTxUb29NYW55UmVzZXJ2ZXMBAQUwVG9vTWFueUhvbGRzAQEFOFRvb01hbnlGcmVlemVzAQEFTElzc3VhbmNlRGVhY3RpdmF0ZWQBAQUkRGVsdGFaZXJvAQEFSFRyYW5zYWN0aW9uUGF5bWVudAEBBShBdXRob3JzaGlwAQEFHFN0YWtpbmcBAnw0Tm90Q29udHJvbGxlcgEBBSBOb3RTdGFzaAEBBTRBbHJlYWR5Qm9uZGVkAQEFNEFscmVhZHlQYWlyZWQBAQUwRW1wdHlUYXJnZXRzAQEFOER1cGxpY2F0ZUluZGV4AQEFREludmFsaWRTbGFzaEluZGV4AQEFQEluc3VmZmljaWVudEJvbmQBAQUwTm9Nb3JlQ2h1bmtzAQEFNE5vVW5sb2NrQ2h1bmsBAQUwRnVuZGVkVGFyZ2V0AQEFSEludmFsaWRFcmFUb1Jld2FyZAEBBWhJbnZhbGlkTnVtYmVyT2ZOb21pbmF0aW9ucwEBBUhOb3RTb3J0ZWRBbmRVbmlxdWUBAQU4QWxyZWFkeUNsYWltZWQBAQUsSW52YWxpZFBhZ2UBAQVUSW5jb3JyZWN0SGlzdG9yeURlcHRoAQEFWEluY29ycmVjdFNsYXNoaW5nU3BhbnMBAQUgQmFkU3RhdGUBAQU4VG9vTWFueVRhcmdldHMBAQUkQmFkVGFyZ2V0AQEFQENhbm5vdENoaWxsT3RoZXIBAQVEVG9vTWFueU5vbWluYXRvcnMBAQVEVG9vTWFueVZhbGlkYXRvcnMBAQVAQ29tbWlzc2lvblRvb0xvdwEBBSxCb3VuZE5vdE1ldAEBBVBDb250cm9sbGVyRGVwcmVjYXRlZAEBBUxDYW5ub3RSZXN0b3JlTGVkZ2VyAQEFbFJld2FyZERlc3RpbmF0aW9uUmVzdHJpY3RlZAEBBThOb3RFbm91Z2hGdW5kcwEBBVxWaXJ0dWFsU3Rha2VyTm90QWxsb3dlZAEBBSBPZmZlbmNlcwEBBShIaXN0b3JpY2FsAQEFHFNlc3Npb24BAhQwSW52YWxpZFByb29mAQEFXE5vQXNzb2NpYXRlZFZhbGlkYXRvcklkAQEFNER1cGxpY2F0ZWRLZXkBAQUYTm9LZXlzAQEFJE5vQWNjb3VudAEBBRxHcmFuZHBhAQIcLFBhdXNlRmFpbGVkAQEFMFJlc3VtZUZhaWxlZAEBBTRDaGFuZ2VQZW5kaW5nAQEFHFRvb1Nvb24BAQVgSW52YWxpZEtleU93bmVyc2hpcFByb29mAQEFYEludmFsaWRFcXVpdm9jYXRpb25Qcm9vZgEBBVhEdXBsaWNhdGVPZmZlbmNlUmVwb3J0AQEFSEF1dGhvcml0eURpc2NvdmVyeQEBBSBUcmVhc3VyeQECLDBJbnZhbGlkSW5kZXgBAQVAVG9vTWFueUFwcHJvdmFscwEBBVhJbnN1ZmZpY2llbnRQZXJtaXNzaW9uAQEFTFByb3Bvc2FsTm90QXBwcm92ZWQBAQVYRmFpbGVkVG9Db252ZXJ0QmFsYW5jZQEBBTBTcGVuZEV4cGlyZWQBAQUsRWFybHlQYXlvdXQBAQVAQWxyZWFkeUF0dGVtcHRlZAEBBSxQYXlvdXRFcnJvcgEBBTBOb3RBdHRlbXB0ZWQBAQUwSW5jb25jbHVzaXZlAQEFQENvbnZpY3Rpb25Wb3RpbmcBAjAoTm90T25nb2luZwEBBSBOb3RWb3RlcgEBBTBOb1Blcm1pc3Npb24BAQU8Tm9QZXJtaXNzaW9uWWV0AQEFREFscmVhZHlEZWxlZ2F0aW5nAQEFNEFscmVhZHlWb3RpbmcBAQVESW5zdWZmaWNpZW50RnVuZHMBAQU0Tm90RGVsZWdhdGluZwEBBSBOb25zZW5zZQEBBTxNYXhWb3Rlc1JlYWNoZWQBAQUsQ2xhc3NOZWVkZWQBAQUgQmFkQ2xhc3MBAQUkUmVmZXJlbmRhAQI4KE5vdE9uZ29pbmcBAQUoSGFzRGVwb3NpdAEBBSBCYWRUcmFjawEBBRBGdWxsAQEFKFF1ZXVlRW1wdHkBAQU0QmFkUmVmZXJlbmR1bQEBBSxOb3RoaW5nVG9EbwEBBRxOb1RyYWNrAQEFKFVuZmluaXNoZWQBAQUwTm9QZXJtaXNzaW9uAQEFJE5vRGVwb3NpdAEBBSRCYWRTdGF0dXMBAQVAUHJlaW1hZ2VOb3RFeGlzdAEBBYRQcmVpbWFnZVN0b3JlZFdpdGhEaWZmZXJlbnRMZW5ndGgBAQUcT3JpZ2lucwEBBSRXaGl0ZWxpc3QBAhRMVW5hdmFpbGFibGVQcmVJbWFnZQEBBTxVbmRlY29kYWJsZUNhbGwBAQVgSW52YWxpZENhbGxXZWlnaHRXaXRuZXNzAQEFUENhbGxJc05vdFdoaXRlbGlzdGVkAQEFWENhbGxBbHJlYWR5V2hpdGVsaXN0ZWQBAQUoUGFyYW1ldGVycwEBBRhDbGFpbXMBAhhgSW52YWxpZEV0aGVyZXVtU2lnbmF0dXJlAQEFQFNpZ25lckhhc05vQ2xhaW0BAQVAU2VuZGVySGFzTm9DbGFpbQEBBTBQb3RVbmRlcmZsb3cBAQVASW52YWxpZFN0YXRlbWVudAEBBUxWZXN0ZWRCYWxhbmNlRXhpc3RzAQEFHFZlc3RpbmcBAhQoTm90VmVzdGluZwEBBVRBdE1heFZlc3RpbmdTY2hlZHVsZXMBAQUkQW1vdW50TG93AQEFYFNjaGVkdWxlSW5kZXhPdXRPZkJvdW5kcwEBBVRJbnZhbGlkU2NoZWR1bGVQYXJhbXMBAQUcVXRpbGl0eQECBDBUb29NYW55Q2FsbHMBAQUUUHJveHkBAiAcVG9vTWFueQEBBSBOb3RGb3VuZAEBBSBOb3RQcm94eQEBBSxVbnByb3h5YWJsZQEBBSREdXBsaWNhdGUBAQUwTm9QZXJtaXNzaW9uAQEFLFVuYW5ub3VuY2VkAQEFLE5vU2VsZlByb3h5AQEFIE11bHRpc2lnAQI4QE1pbmltdW1UaHJlc2hvbGQBAQU8QWxyZWFkeUFwcHJvdmVkAQEFRE5vQXBwcm92YWxzTmVlZGVkAQEFRFRvb0Zld1NpZ25hdG9yaWVzAQEFSFRvb01hbnlTaWduYXRvcmllcwEBBVRTaWduYXRvcmllc091dE9mT3JkZXIBAQVMU2VuZGVySW5TaWduYXRvcmllcwEBBSBOb3RGb3VuZAEBBSBOb3RPd25lcgEBBSxOb1RpbWVwb2ludAEBBThXcm9uZ1RpbWVwb2ludAEBBUxVbmV4cGVjdGVkVGltZXBvaW50AQEFPE1heFdlaWdodFRvb0xvdwEBBTRBbHJlYWR5U3RvcmVkAQEFIEJvdW50aWVzAQIscEluc3VmZmljaWVudFByb3Bvc2Vyc0JhbGFuY2UBAQUwSW52YWxpZEluZGV4AQEFMFJlYXNvblRvb0JpZwEBBUBVbmV4cGVjdGVkU3RhdHVzAQEFOFJlcXVpcmVDdXJhdG9yAQEFMEludmFsaWRWYWx1ZQEBBShJbnZhbGlkRmVlAQEFNFBlbmRpbmdQYXlvdXQBAQUkUHJlbWF0dXJlAQEFUEhhc0FjdGl2ZUNoaWxkQm91bnR5AQEFNFRvb01hbnlRdWV1ZWQBAQU0Q2hpbGRCb3VudGllcwECDFRQYXJlbnRCb3VudHlOb3RBY3RpdmUBAQVkSW5zdWZmaWNpZW50Qm91bnR5QmFsYW5jZQEBBVBUb29NYW55Q2hpbGRCb3VudGllcwEBBWhFbGVjdGlvblByb3ZpZGVyTXVsdGlQaGFzZQECPGhQcmVEaXNwYXRjaEVhcmx5U3VibWlzc2lvbgEBBWxQcmVEaXNwYXRjaFdyb25nV2lubmVyQ291bnQBAQVkUHJlRGlzcGF0Y2hXZWFrU3VibWlzc2lvbgEBBTxTaWduZWRRdWV1ZUZ1bGwBAQVYU2lnbmVkQ2Fubm90UGF5RGVwb3NpdAEBBVBTaWduZWRJbnZhbGlkV2l0bmVzcwEBBUxTaWduZWRUb29NdWNoV2VpZ2h0AQEFPE9jd0NhbGxXcm9uZ0VyYQEBBVxNaXNzaW5nU25hcHNob3RNZXRhZGF0YQEBBVhJbnZhbGlkU3VibWlzc2lvbkluZGV4AQEFOENhbGxOb3RBbGxvd2VkAQEFOEZhbGxiYWNrRmFpbGVkAQEFLEJvdW5kTm90TWV0AQEFOFRvb01hbnlXaW5uZXJzAQEFZFByZURpc3BhdGNoRGlmZmVyZW50Um91bmQBAQUkVm90ZXJMaXN0AQIEEExpc3QBAhAkRHVwbGljYXRlAQEFKE5vdEhlYXZpZXIBAQUwTm90SW5TYW1lQmFnAQEFME5vZGVOb3RGb3VuZAEBBTxOb21pbmF0aW9uUG9vbHMBApAwUG9vbE5vdEZvdW5kAQEFSFBvb2xNZW1iZXJOb3RGb3VuZAEBBUhSZXdhcmRQb29sTm90Rm91bmQBAQVAU3ViUG9vbHNOb3RGb3VuZAEBBWRBY2NvdW50QmVsb25nc1RvT3RoZXJQb29sAQEFOEZ1bGx5VW5ib25kaW5nAQEFRE1heFVuYm9uZGluZ0xpbWl0AQEFRENhbm5vdFdpdGhkcmF3QW55AQEFRE1pbmltdW1Cb25kTm90TWV0AQEFME92ZXJmbG93UmlzawEBBTROb3REZXN0cm95aW5nAQEFME5vdE5vbWluYXRvcgEBBVROb3RLaWNrZXJPckRlc3Ryb3lpbmcBAQUcTm90T3BlbgEBBSBNYXhQb29scwEBBThNYXhQb29sTWVtYmVycwEBBURDYW5Ob3RDaGFuZ2VTdGF0ZQEBBVREb2VzTm90SGF2ZVBlcm1pc3Npb24BAQVUTWV0YWRhdGFFeGNlZWRzTWF4TGVuAQEFJERlZmVuc2l2ZQECHGhOb3RFbm91Z2hTcGFjZUluVW5ib25kUG9vbAEBBTBQb29sTm90Rm91bmQBAQVIUmV3YXJkUG9vbE5vdEZvdW5kAQEFQFN1YlBvb2xzTm90Rm91bmQBAQVwQm9uZGVkU3Rhc2hLaWxsZWRQcmVtYXR1cmVseQEBBVREZWxlZ2F0aW9uVW5zdXBwb3J0ZWQBAQU8U2xhc2hOb3RBcHBsaWVkAQEFnFBhcnRpYWxVbmJvbmROb3RBbGxvd2VkUGVybWlzc2lvbmxlc3NseQEBBVxNYXhDb21taXNzaW9uUmVzdHJpY3RlZAEBBWBDb21taXNzaW9uRXhjZWVkc01heGltdW0BAQV4Q29tbWlzc2lvbkV4Y2VlZHNHbG9iYWxNYXhpbXVtAQEFZENvbW1pc3Npb25DaGFuZ2VUaHJvdHRsZWQBAQV4Q29tbWlzc2lvbkNoYW5nZVJhdGVOb3RBbGxvd2VkAQEFTE5vUGVuZGluZ0NvbW1pc3Npb24BAQVYTm9Db21taXNzaW9uQ3VycmVudFNldAEBBSxQb29sSWRJblVzZQEBBTRJbnZhbGlkUG9vbElkAQEFTEJvbmRFeHRyYVJlc3RyaWN0ZWQBAQU8Tm90aGluZ1RvQWRqdXN0AQEFOE5vdGhpbmdUb1NsYXNoAQEFPEFscmVhZHlNaWdyYXRlZAEBBSxOb3RNaWdyYXRlZAEBBTBOb3RTdXBwb3J0ZWQBAQUsRmFzdFVuc3Rha2UBAhg0Tm90Q29udHJvbGxlcgEBBTRBbHJlYWR5UXVldWVkAQEFOE5vdEZ1bGx5Qm9uZGVkAQEFJE5vdFF1ZXVlZAEBBSxBbHJlYWR5SGVhZAEBBThDYWxsTm90QWxsb3dlZAEBBUBQYXJhY2hhaW5zT3JpZ2luAQEFNENvbmZpZ3VyYXRpb24BAgQ8SW52YWxpZE5ld1ZhbHVlAQEFLFBhcmFzU2hhcmVkAQEFNFBhcmFJbmNsdXNpb24BAkhkVmFsaWRhdG9ySW5kZXhPdXRPZkJvdW5kcwEBBVBVbnNjaGVkdWxlZENhbmRpZGF0ZQEBBUBIZWFkRGF0YVRvb0xhcmdlAQEFUFByZW1hdHVyZUNvZGVVcGdyYWRlAQEFPE5ld0NvZGVUb29MYXJnZQEBBVREaXNhbGxvd2VkUmVsYXlQYXJlbnQBAQVESW52YWxpZEFzc2lnbm1lbnQBAQVESW52YWxpZEdyb3VwSW5kZXgBAQVMSW5zdWZmaWNpZW50QmFja2luZwEBBThJbnZhbGlkQmFja2luZwEBBUROb3RDb2xsYXRvclNpZ25lZAEBBWhWYWxpZGF0aW9uRGF0YUhhc2hNaXNtYXRjaAEBBYBJbmNvcnJlY3REb3dud2FyZE1lc3NhZ2VIYW5kbGluZwEBBVRJbnZhbGlkVXB3YXJkTWVzc2FnZXMBAQVgSHJtcFdhdGVybWFya01pc2hhbmRsaW5nAQEFTEludmFsaWRPdXRib3VuZEhybXABAQVkSW52YWxpZFZhbGlkYXRpb25Db2RlSGFzaAEBBUBQYXJhSGVhZE1pc21hdGNoAQEFMFBhcmFJbmhlcmVudAECFGRUb29NYW55SW5jbHVzaW9uSW5oZXJlbnRzAQEFTEludmFsaWRQYXJlbnRIZWFkZXIBAQVISW5oZXJlbnRPdmVyd2VpZ2h0AQEFhENhbmRpZGF0ZXNGaWx0ZXJlZER1cmluZ0V4ZWN1dGlvbgEBBVBVbnNjaGVkdWxlZENhbmRpZGF0ZQEBBTRQYXJhU2NoZWR1bGVyAQEFFFBhcmFzAQI0NE5vdFJlZ2lzdGVyZWQBAQU0Q2Fubm90T25ib2FyZAEBBThDYW5ub3RPZmZib2FyZAEBBTRDYW5ub3RVcGdyYWRlAQEFPENhbm5vdERvd25ncmFkZQEBBVhQdmZDaGVja1N0YXRlbWVudFN0YWxlAQEFXFB2ZkNoZWNrU3RhdGVtZW50RnV0dXJlAQEFhFB2ZkNoZWNrVmFsaWRhdG9ySW5kZXhPdXRPZkJvdW5kcwEBBWBQdmZDaGVja0ludmFsaWRTaWduYXR1cmUBAQVIUHZmQ2hlY2tEb3VibGVWb3RlAQEFWFB2ZkNoZWNrU3ViamVjdEludmFsaWQBAQVEQ2Fubm90VXBncmFkZUNvZGUBAQUsSW52YWxpZENvZGUBAQUsSW5pdGlhbGl6ZXIBAQUMRG1wAQEFEEhybXABAlBUT3BlbkhybXBDaGFubmVsVG9TZWxmAQEFfE9wZW5Icm1wQ2hhbm5lbEludmFsaWRSZWNpcGllbnQBAQVsT3BlbkhybXBDaGFubmVsWmVyb0NhcGFjaXR5AQEFjE9wZW5Icm1wQ2hhbm5lbENhcGFjaXR5RXhjZWVkc0xpbWl0AQEFeE9wZW5Icm1wQ2hhbm5lbFplcm9NZXNzYWdlU2l6ZQEBBZhPcGVuSHJtcENoYW5uZWxNZXNzYWdlU2l6ZUV4Y2VlZHNMaW1pdAEBBXBPcGVuSHJtcENoYW5uZWxBbHJlYWR5RXhpc3RzAQEFfE9wZW5Icm1wQ2hhbm5lbEFscmVhZHlSZXF1ZXN0ZWQBAQVwT3BlbkhybXBDaGFubmVsTGltaXRFeGNlZWRlZAEBBXBBY2NlcHRIcm1wQ2hhbm5lbERvZXNudEV4aXN0AQEFhEFjY2VwdEhybXBDaGFubmVsQWxyZWFkeUNvbmZpcm1lZAEBBXhBY2NlcHRIcm1wQ2hhbm5lbExpbWl0RXhjZWVkZWQBAQVwQ2xvc2VIcm1wQ2hhbm5lbFVuYXV0aG9yaXplZAEBBWxDbG9zZUhybXBDaGFubmVsRG9lc250RXhpc3QBAQV8Q2xvc2VIcm1wQ2hhbm5lbEFscmVhZHlVbmRlcndheQEBBYRDYW5jZWxIcm1wT3BlbkNoYW5uZWxVbmF1dGhvcml6ZWQBAQVoT3BlbkhybXBDaGFubmVsRG9lc250RXhpc3QBAQV8T3BlbkhybXBDaGFubmVsQWxyZWFkeUNvbmZpcm1lZAEBBTBXcm9uZ1dpdG5lc3MBAQVwQ2hhbm5lbENyZWF0aW9uTm90QXV0aG9yaXplZAEBBTxQYXJhU2Vzc2lvbkluZm8BAQU0UGFyYXNEaXNwdXRlcwECJHREdXBsaWNhdGVEaXNwdXRlU3RhdGVtZW50U2V0cwEBBVxBbmNpZW50RGlzcHV0ZVN0YXRlbWVudAEBBWRWYWxpZGF0b3JJbmRleE91dE9mQm91bmRzAQEFQEludmFsaWRTaWduYXR1cmUBAQVIRHVwbGljYXRlU3RhdGVtZW50AQEFSFNpbmdsZVNpZGVkRGlzcHV0ZQEBBTxNYWxpY2lvdXNCYWNrZXIBAQVMTWlzc2luZ0JhY2tpbmdWb3RlcwEBBUhVbmNvbmZpcm1lZERpc3B1dGUBAQU0UGFyYXNTbGFzaGluZwECGGBJbnZhbGlkS2V5T3duZXJzaGlwUHJvb2YBAQVMSW52YWxpZFNlc3Npb25JbmRleAEBBVBJbnZhbGlkQ2FuZGlkYXRlSGFzaAEBBVRJbnZhbGlkVmFsaWRhdG9ySW5kZXgBAQVgVmFsaWRhdG9ySW5kZXhJZE1pc21hdGNoAQEFXER1cGxpY2F0ZVNsYXNoaW5nUmVwb3J0AQEFIE9uRGVtYW5kAQIIJFF1ZXVlRnVsbAEBBXBTcG90UHJpY2VIaWdoZXJUaGFuTWF4QW1vdW50AQEFaENvcmV0aW1lQXNzaWdubWVudFByb3ZpZGVyAQIYQEFzc2lnbm1lbnRzRW1wdHkBAQU0T3ZlclNjaGVkdWxlZAEBBThVbmRlclNjaGVkdWxlZAEBBUBEaXNhbGxvd2VkSW5zZXJ0AQEFPER1cGxpY2F0ZUluc2VydAEBBVBBc3NpZ25tZW50c05vdFNvcnRlZAEBBSRSZWdpc3RyYXIBAjg0Tm90UmVnaXN0ZXJlZAEBBURBbHJlYWR5UmVnaXN0ZXJlZAEBBSBOb3RPd25lcgEBBTBDb2RlVG9vTGFyZ2UBAQVASGVhZERhdGFUb29MYXJnZQEBBTBOb3RQYXJhY2hhaW4BAQU0Tm90UGFyYXRocmVhZAEBBUBDYW5ub3REZXJlZ2lzdGVyAQEFPENhbm5vdERvd25ncmFkZQEBBTRDYW5ub3RVcGdyYWRlAQEFKFBhcmFMb2NrZWQBAQUsTm90UmVzZXJ2ZWQBAQUsSW52YWxpZENvZGUBAQUoQ2Fubm90U3dhcAEBBRRTbG90cwECCERQYXJhTm90T25ib2FyZGluZwEBBShMZWFzZUVycm9yAQEFIEF1Y3Rpb25zAQIcREF1Y3Rpb25JblByb2dyZXNzAQEFRExlYXNlUGVyaW9kSW5QYXN0AQEFRFBhcmFOb3RSZWdpc3RlcmVkAQEFRE5vdEN1cnJlbnRBdWN0aW9uAQEFKE5vdEF1Y3Rpb24BAQUwQXVjdGlvbkVuZGVkAQEFQEFscmVhZHlMZWFzZWRPdXQBAQUkQ3Jvd2Rsb2FuAQJcREZpcnN0UGVyaW9kSW5QYXN0AQEFZEZpcnN0UGVyaW9kVG9vRmFySW5GdXR1cmUBAQVsTGFzdFBlcmlvZEJlZm9yZUZpcnN0UGVyaW9kAQEFYExhc3RQZXJpb2RUb29GYXJJbkZ1dHVyZQEBBTxDYW5ub3RFbmRJblBhc3QBAQVERW5kVG9vRmFySW5GdXR1cmUBAQUgT3ZlcmZsb3cBAQVQQ29udHJpYnV0aW9uVG9vU21hbGwBAQU0SW52YWxpZFBhcmFJZAEBBSxDYXBFeGNlZWRlZAEBBVhDb250cmlidXRpb25QZXJpb2RPdmVyAQEFNEludmFsaWRPcmlnaW4BAQUwTm90UGFyYWNoYWluAQEFLExlYXNlQWN0aXZlAQEFQEJpZE9yTGVhc2VBY3RpdmUBAQUwRnVuZE5vdEVuZGVkAQEFPE5vQ29udHJpYnV0aW9ucwEBBUhOb3RSZWFkeVRvRGlzc29sdmUBAQVASW52YWxpZFNpZ25hdHVyZQEBBTBNZW1vVG9vTGFyZ2UBAQVEQWxyZWFkeUluTmV3UmFpc2UBAQVIVnJmRGVsYXlJblByb2dyZXNzAQEFNE5vTGVhc2VQZXJpb2QBAQUgQ29yZXRpbWUBAgwkTm90QnJva2VyAQEFWFJlcXVlc3RlZEZ1dHVyZVJldmVudWUBAQVMQXNzZXRUcmFuc2ZlckZhaWxlZAEBBUhTdGF0ZVRyaWVNaWdyYXRpb24BAhg8TWF4U2lnbmVkTGltaXRzAQEFKEtleVRvb0xvbmcBAQU4Tm90RW5vdWdoRnVuZHMBAQUoQmFkV2l0bmVzcwEBBWRTaWduZWRNaWdyYXRpb25Ob3RBbGxvd2VkAQEFMEJhZENoaWxkUm9vdAEBBSRYY21QYWxsZXQBAmAsVW5yZWFjaGFibGUBAQUsU2VuZEZhaWx1cmUBAQUgRmlsdGVyZWQBAQVIVW53ZWlnaGFibGVNZXNzYWdlAQEFYERlc3RpbmF0aW9uTm90SW52ZXJ0aWJsZQEBBRRFbXB0eQEBBThDYW5ub3RSZWFuY2hvcgEBBTRUb29NYW55QXNzZXRzAQEFNEludmFsaWRPcmlnaW4BAQUoQmFkVmVyc2lvbgEBBSxCYWRMb2NhdGlvbgEBBThOb1N1YnNjcmlwdGlvbgEBBURBbHJlYWR5U3Vic2NyaWJlZAEBBVhDYW5ub3RDaGVja091dFRlbGVwb3J0AQEFKExvd0JhbGFuY2UBAQUwVG9vTWFueUxvY2tzAQEFTEFjY291bnROb3RTb3ZlcmVpZ24BAQUoRmVlc05vdE1ldAEBBTBMb2NrTm90Rm91bmQBAQUUSW5Vc2UBAQVoSW52YWxpZEFzc2V0VW5rbm93blJlc2VydmUBAQV4SW52YWxpZEFzc2V0VW5zdXBwb3J0ZWRSZXNlcnZlAQEFPFRvb01hbnlSZXNlcnZlcwEBBWBMb2NhbEV4ZWN1dGlvbkluY29tcGxldGUBAQUwTWVzc2FnZVF1ZXVlAQIkLE5vdFJlYXBhYmxlAQEFGE5vUGFnZQEBBSROb01lc3NhZ2UBAQVAQWxyZWFkeVByb2Nlc3NlZAEBBRhRdWV1ZWQBAQVISW5zdWZmaWNpZW50V2VpZ2h0AQEFYFRlbXBvcmFyaWx5VW5wcm9jZXNzYWJsZQEBBSxRdWV1ZVBhdXNlZAEBBUxSZWN1cnNpdmVEaXNhbGxvd2VkAQEFJEFzc2V0UmF0ZQECDEBVbmtub3duQXNzZXRLaW5kAQEFNEFscmVhZHlFeGlzdHMBAQUgT3ZlcmZsb3cBAQUUQmVlZnkBAhBgSW52YWxpZEtleU93bmVyc2hpcFByb29mAQEFYEludmFsaWRFcXVpdm9jYXRpb25Qcm9vZgEBBVhEdXBsaWNhdGVPZmZlbmNlUmVwb3J0AQEFUEludmFsaWRDb25maWd1cmF0aW9uAQEFDE1tcgEBBTBCZWVmeU1tckxlYWYBAQU8UGFyYVN1ZG9XcmFwcGVyAQIkPFBhcmFEb2VzbnRFeGlzdAEBBURQYXJhQWxyZWFkeUV4aXN0cwEBBVRFeGNlZWRzTWF4TWVzc2FnZVNpemUBAQU4Q291bGRudENsZWFudXABAQU0Tm90UGFyYXRocmVhZAEBBTBOb3RQYXJhY2hhaW4BAQU0Q2Fubm90VXBncmFkZQEBBTxDYW5ub3REb3duZ3JhZGUBAQUwVG9vTWFueUNvcmVzAQEFEFN1ZG8BAgQsUmVxdWlyZVN1ZG8BAQUCOBRPdGhlcgEBBTBDYW5ub3RMb29rdXABAQUkQmFkT3JpZ2luAQEFGE1vZHVsZQEC9BhTeXN0ZW0BAiQ8SW52YWxpZFNwZWNOYW1lAQEFaFNwZWNWZXJzaW9uTmVlZHNUb0luY3JlYXNlAQEFdEZhaWxlZFRvRXh0cmFjdFJ1bnRpbWVWZXJzaW9uAQEFTE5vbkRlZmF1bHRDb21wb3NpdGUBAQU8Tm9uWmVyb1JlZkNvdW50AQEFMENhbGxGaWx0ZXJlZAEBBWxNdWx0aUJsb2NrTWlncmF0aW9uc09uZ29pbmcBAQVETm90aGluZ0F1dGhvcml6ZWQBAQUwVW5hdXRob3JpemVkAQEFJFNjaGVkdWxlcgECFEBGYWlsZWRUb1NjaGVkdWxlAQEFIE5vdEZvdW5kAQEFXFRhcmdldEJsb2NrTnVtYmVySW5QYXN0AQEFSFJlc2NoZWR1bGVOb0NoYW5nZQEBBRROYW1lZAEBBSBQcmVpbWFnZQECJBhUb29CaWcBAQUwQWxyZWFkeU5vdGVkAQEFNE5vdEF1dGhvcml6ZWQBAQUgTm90Tm90ZWQBAQUkUmVxdWVzdGVkAQEFME5vdFJlcXVlc3RlZAEBBRxUb29NYW55AQEFGFRvb0ZldwEBBRhOb0Nvc3QBAQUQQmFiZQECEGBJbnZhbGlkRXF1aXZvY2F0aW9uUHJvb2YBAQVgSW52YWxpZEtleU93bmVyc2hpcFByb29mAQEFWER1cGxpY2F0ZU9mZmVuY2VSZXBvcnQBAQVQSW52YWxpZENvbmZpZ3VyYXRpb24BAQUkVGltZXN0YW1wAQEFHEluZGljZXMBAhQsTm90QXNzaWduZWQBAQUgTm90T3duZXIBAQUUSW5Vc2UBAQUsTm90VHJhbnNmZXIBAQUkUGVybWFuZW50AQEFIEJhbGFuY2VzAQIwOFZlc3RpbmdCYWxhbmNlAQEFVExpcXVpZGl0eVJlc3RyaWN0aW9ucwEBBUxJbnN1ZmZpY2llbnRCYWxhbmNlAQEFSEV4aXN0ZW50aWFsRGVwb3NpdAEBBTRFeHBlbmRhYmlsaXR5AQEFXEV4aXN0aW5nVmVzdGluZ1NjaGVkdWxlAQEFLERlYWRBY2NvdW50AQEFPFRvb01hbnlSZXNlcnZlcwEBBTBUb29NYW55SG9sZHMBAQU4VG9vTWFueUZyZWV6ZXMBAQVMSXNzdWFuY2VEZWFjdGl2YXRlZAEBBSREZWx0YVplcm8BAQVIVHJhbnNhY3Rpb25QYXltZW50AQEFKEF1dGhvcnNoaXABAQUcU3Rha2luZwECfDROb3RDb250cm9sbGVyAQEFIE5vdFN0YXNoAQEFNEFscmVhZHlCb25kZWQBAQU0QWxyZWFkeVBhaXJlZAEBBTBFbXB0eVRhcmdldHMBAQU4RHVwbGljYXRlSW5kZXgBAQVESW52YWxpZFNsYXNoSW5kZXgBAQVASW5zdWZmaWNpZW50Qm9uZAEBBTBOb01vcmVDaHVua3MBAQU0Tm9VbmxvY2tDaHVuawEBBTBGdW5kZWRUYXJnZXQBAQVISW52YWxpZEVyYVRvUmV3YXJkAQEFaEludmFsaWROdW1iZXJPZk5vbWluYXRpb25zAQEFSE5vdFNvcnRlZEFuZFVuaXF1ZQEBBThBbHJlYWR5Q2xhaW1lZAEBBSxJbnZhbGlkUGFnZQEBBVRJbmNvcnJlY3RIaXN0b3J5RGVwdGgBAQVYSW5jb3JyZWN0U2xhc2hpbmdTcGFucwEBBSBCYWRTdGF0ZQEBBThUb29NYW55VGFyZ2V0cwEBBSRCYWRUYXJnZXQBAQVAQ2Fubm90Q2hpbGxPdGhlcgEBBURUb29NYW55Tm9taW5hdG9ycwEBBURUb29NYW55VmFsaWRhdG9ycwEBBUBDb21taXNzaW9uVG9vTG93AQEFLEJvdW5kTm90TWV0AQEFUENvbnRyb2xsZXJEZXByZWNhdGVkAQEFTENhbm5vdFJlc3RvcmVMZWRnZXIBAQVsUmV3YXJkRGVzdGluYXRpb25SZXN0cmljdGVkAQEFOE5vdEVub3VnaEZ1bmRzAQEFXFZpcnR1YWxTdGFrZXJOb3RBbGxvd2VkAQEFIE9mZmVuY2VzAQEFKEhpc3RvcmljYWwBAQUcU2Vzc2lvbgECFDBJbnZhbGlkUHJvb2YBAQVcTm9Bc3NvY2lhdGVkVmFsaWRhdG9ySWQBAQU0RHVwbGljYXRlZEtleQEBBRhOb0tleXMBAQUkTm9BY2NvdW50AQEFHEdyYW5kcGEBAhwsUGF1c2VGYWlsZWQBAQUwUmVzdW1lRmFpbGVkAQEFNENoYW5nZVBlbmRpbmcBAQUcVG9vU29vbgEBBWBJbnZhbGlkS2V5T3duZXJzaGlwUHJvb2YBAQVgSW52YWxpZEVxdWl2b2NhdGlvblByb29mAQEFWER1cGxpY2F0ZU9mZmVuY2VSZXBvcnQBAQVIQXV0aG9yaXR5RGlzY292ZXJ5AQEFIFRyZWFzdXJ5AQIsMEludmFsaWRJbmRleAEBBUBUb29NYW55QXBwcm92YWxzAQEFWEluc3VmZmljaWVudFBlcm1pc3Npb24BAQVMUHJvcG9zYWxOb3RBcHByb3ZlZAEBBVhGYWlsZWRUb0NvbnZlcnRCYWxhbmNlAQEFMFNwZW5kRXhwaXJlZAEBBSxFYXJseVBheW91dAEBBUBBbHJlYWR5QXR0ZW1wdGVkAQEFLFBheW91dEVycm9yAQEFME5vdEF0dGVtcHRlZAEBBTBJbmNvbmNsdXNpdmUBAQVAQ29udmljdGlvblZvdGluZwECMChOb3RPbmdvaW5nAQEFIE5vdFZvdGVyAQEFME5vUGVybWlzc2lvbgEBBTxOb1Blcm1pc3Npb25ZZXQBAQVEQWxyZWFkeURlbGVnYXRpbmcBAQU0QWxyZWFkeVZvdGluZwEBBURJbnN1ZmZpY2llbnRGdW5kcwEBBTROb3REZWxlZ2F0aW5nAQEFIE5vbnNlbnNlAQEFPE1heFZvdGVzUmVhY2hlZAEBBSxDbGFzc05lZWRlZAEBBSBCYWRDbGFzcwEBBSRSZWZlcmVuZGEBAjgoTm90T25nb2luZwEBBShIYXNEZXBvc2l0AQEFIEJhZFRyYWNrAQEFEEZ1bGwBAQUoUXVldWVFbXB0eQEBBTRCYWRSZWZlcmVuZHVtAQEFLE5vdGhpbmdUb0RvAQEFHE5vVHJhY2sBAQUoVW5maW5pc2hlZAEBBTBOb1Blcm1pc3Npb24BAQUkTm9EZXBvc2l0AQEFJEJhZFN0YXR1cwEBBUBQcmVpbWFnZU5vdEV4aXN0AQEFhFByZWltYWdlU3RvcmVkV2l0aERpZmZlcmVudExlbmd0aAEBBRxPcmlnaW5zAQEFJFdoaXRlbGlzdAECFExVbmF2YWlsYWJsZVByZUltYWdlAQEFPFVuZGVjb2RhYmxlQ2FsbAEBBWBJbnZhbGlkQ2FsbFdlaWdodFdpdG5lc3MBAQVQQ2FsbElzTm90V2hpdGVsaXN0ZWQBAQVYQ2FsbEFscmVhZHlXaGl0ZWxpc3RlZAEBBShQYXJhbWV0ZXJzAQEFGENsYWltcwECGGBJbnZhbGlkRXRoZXJldW1TaWduYXR1cmUBAQVAU2lnbmVySGFzTm9DbGFpbQEBBUBTZW5kZXJIYXNOb0NsYWltAQEFMFBvdFVuZGVyZmxvdwEBBUBJbnZhbGlkU3RhdGVtZW50AQEFTFZlc3RlZEJhbGFuY2VFeGlzdHMBAQUcVmVzdGluZwECFChOb3RWZXN0aW5nAQEFVEF0TWF4VmVzdGluZ1NjaGVkdWxlcwEBBSRBbW91bnRMb3cBAQVgU2NoZWR1bGVJbmRleE91dE9mQm91bmRzAQEFVEludmFsaWRTY2hlZHVsZVBhcmFtcwEBBRxVdGlsaXR5AQIEMFRvb01hbnlDYWxscwEBBRRQcm94eQECIBxUb29NYW55AQEFIE5vdEZvdW5kAQEFIE5vdFByb3h5AQEFLFVucHJveHlhYmxlAQEFJER1cGxpY2F0ZQEBBTBOb1Blcm1pc3Npb24BAQUsVW5hbm5vdW5jZWQBAQUsTm9TZWxmUHJveHkBAQUgTXVsdGlzaWcBAjhATWluaW11bVRocmVzaG9sZAEBBTxBbHJlYWR5QXBwcm92ZWQBAQVETm9BcHByb3ZhbHNOZWVkZWQBAQVEVG9vRmV3U2lnbmF0b3JpZXMBAQVIVG9vTWFueVNpZ25hdG9yaWVzAQEFVFNpZ25hdG9yaWVzT3V0T2ZPcmRlcgEBBUxTZW5kZXJJblNpZ25hdG9yaWVzAQEFIE5vdEZvdW5kAQEFIE5vdE93bmVyAQEFLE5vVGltZXBvaW50AQEFOFdyb25nVGltZXBvaW50AQEFTFVuZXhwZWN0ZWRUaW1lcG9pbnQBAQU8TWF4V2VpZ2h0VG9vTG93AQEFNEFscmVhZHlTdG9yZWQBAQUgQm91bnRpZXMBAixwSW5zdWZmaWNpZW50UHJvcG9zZXJzQmFsYW5jZQEBBTBJbnZhbGlkSW5kZXgBAQUwUmVhc29uVG9vQmlnAQEFQFVuZXhwZWN0ZWRTdGF0dXMBAQU4UmVxdWlyZUN1cmF0b3IBAQUwSW52YWxpZFZhbHVlAQEFKEludmFsaWRGZWUBAQU0UGVuZGluZ1BheW91dAEBBSRQcmVtYXR1cmUBAQVQSGFzQWN0aXZlQ2hpbGRCb3VudHkBAQU0VG9vTWFueVF1ZXVlZAEBBTRDaGlsZEJvdW50aWVzAQIMVFBhcmVudEJvdW50eU5vdEFjdGl2ZQEBBWRJbnN1ZmZpY2llbnRCb3VudHlCYWxhbmNlAQEFUFRvb01hbnlDaGlsZEJvdW50aWVzAQEFaEVsZWN0aW9uUHJvdmlkZXJNdWx0aVBoYXNlAQI8aFByZURpc3BhdGNoRWFybHlTdWJtaXNzaW9uAQEFbFByZURpc3BhdGNoV3JvbmdXaW5uZXJDb3VudAEBBWRQcmVEaXNwYXRjaFdlYWtTdWJtaXNzaW9uAQEFPFNpZ25lZFF1ZXVlRnVsbAEBBVhTaWduZWRDYW5ub3RQYXlEZXBvc2l0AQEFUFNpZ25lZEludmFsaWRXaXRuZXNzAQEFTFNpZ25lZFRvb011Y2hXZWlnaHQBAQU8T2N3Q2FsbFdyb25nRXJhAQEFXE1pc3NpbmdTbmFwc2hvdE1ldGFkYXRhAQEFWEludmFsaWRTdWJtaXNzaW9uSW5kZXgBAQU4Q2FsbE5vdEFsbG93ZWQBAQU4RmFsbGJhY2tGYWlsZWQBAQUsQm91bmROb3RNZXQBAQU4VG9vTWFueVdpbm5lcnMBAQVkUHJlRGlzcGF0Y2hEaWZmZXJlbnRSb3VuZAEBBSRWb3Rlckxpc3QBAgQQTGlzdAECECREdXBsaWNhdGUBAQUoTm90SGVhdmllcgEBBTBOb3RJblNhbWVCYWcBAQUwTm9kZU5vdEZvdW5kAQEFPE5vbWluYXRpb25Qb29scwECkDBQb29sTm90Rm91bmQBAQVIUG9vbE1lbWJlck5vdEZvdW5kAQEFSFJld2FyZFBvb2xOb3RGb3VuZAEBBUBTdWJQb29sc05vdEZvdW5kAQEFZEFjY291bnRCZWxvbmdzVG9PdGhlclBvb2wBAQU4RnVsbHlVbmJvbmRpbmcBAQVETWF4VW5ib25kaW5nTGltaXQBAQVEQ2Fubm90V2l0aGRyYXdBbnkBAQVETWluaW11bUJvbmROb3RNZXQBAQUwT3ZlcmZsb3dSaXNrAQEFNE5vdERlc3Ryb3lpbmcBAQUwTm90Tm9taW5hdG9yAQEFVE5vdEtpY2tlck9yRGVzdHJveWluZwEBBRxOb3RPcGVuAQEFIE1heFBvb2xzAQEFOE1heFBvb2xNZW1iZXJzAQEFRENhbk5vdENoYW5nZVN0YXRlAQEFVERvZXNOb3RIYXZlUGVybWlzc2lvbgEBBVRNZXRhZGF0YUV4Y2VlZHNNYXhMZW4BAQUkRGVmZW5zaXZlAQIcaE5vdEVub3VnaFNwYWNlSW5VbmJvbmRQb29sAQEFMFBvb2xOb3RGb3VuZAEBBUhSZXdhcmRQb29sTm90Rm91bmQBAQVAU3ViUG9vbHNOb3RGb3VuZAEBBXBCb25kZWRTdGFzaEtpbGxlZFByZW1hdHVyZWx5AQEFVERlbGVnYXRpb25VbnN1cHBvcnRlZAEBBTxTbGFzaE5vdEFwcGxpZWQBAQWcUGFydGlhbFVuYm9uZE5vdEFsbG93ZWRQZXJtaXNzaW9ubGVzc2x5AQEFXE1heENvbW1pc3Npb25SZXN0cmljdGVkAQEFYENvbW1pc3Npb25FeGNlZWRzTWF4aW11bQEBBXhDb21taXNzaW9uRXhjZWVkc0dsb2JhbE1heGltdW0BAQVkQ29tbWlzc2lvbkNoYW5nZVRocm90dGxlZAEBBXhDb21taXNzaW9uQ2hhbmdlUmF0ZU5vdEFsbG93ZWQBAQVMTm9QZW5kaW5nQ29tbWlzc2lvbgEBBVhOb0NvbW1pc3Npb25DdXJyZW50U2V0AQEFLFBvb2xJZEluVXNlAQEFNEludmFsaWRQb29sSWQBAQVMQm9uZEV4dHJhUmVzdHJpY3RlZAEBBTxOb3RoaW5nVG9BZGp1c3QBAQU4Tm90aGluZ1RvU2xhc2gBAQU8QWxyZWFkeU1pZ3JhdGVkAQEFLE5vdE1pZ3JhdGVkAQEFME5vdFN1cHBvcnRlZAEBBSxGYXN0VW5zdGFrZQECGDROb3RDb250cm9sbGVyAQEFNEFscmVhZHlRdWV1ZWQBAQU4Tm90RnVsbHlCb25kZWQBAQUkTm90UXVldWVkAQEFLEFscmVhZHlIZWFkAQEFOENhbGxOb3RBbGxvd2VkAQEFQFBhcmFjaGFpbnNPcmlnaW4BAQU0Q29uZmlndXJhdGlvbgECBDxJbnZhbGlkTmV3VmFsdWUBAQUsUGFyYXNTaGFyZWQBAQU0UGFyYUluY2x1c2lvbgECSGRWYWxpZGF0b3JJbmRleE91dE9mQm91bmRzAQEFUFVuc2NoZWR1bGVkQ2FuZGlkYXRlAQEFQEhlYWREYXRhVG9vTGFyZ2UBAQVQUHJlbWF0dXJlQ29kZVVwZ3JhZGUBAQU8TmV3Q29kZVRvb0xhcmdlAQEFVERpc2FsbG93ZWRSZWxheVBhcmVudAEBBURJbnZhbGlkQXNzaWdubWVudAEBBURJbnZhbGlkR3JvdXBJbmRleAEBBUxJbnN1ZmZpY2llbnRCYWNraW5nAQEFOEludmFsaWRCYWNraW5nAQEFRE5vdENvbGxhdG9yU2lnbmVkAQEFaFZhbGlkYXRpb25EYXRhSGFzaE1pc21hdGNoAQEFgEluY29ycmVjdERvd253YXJkTWVzc2FnZUhhbmRsaW5nAQEFVEludmFsaWRVcHdhcmRNZXNzYWdlcwEBBWBIcm1wV2F0ZXJtYXJrTWlzaGFuZGxpbmcBAQVMSW52YWxpZE91dGJvdW5kSHJtcAEBBWRJbnZhbGlkVmFsaWRhdGlvbkNvZGVIYXNoAQEFQFBhcmFIZWFkTWlzbWF0Y2gBAQUwUGFyYUluaGVyZW50AQIUZFRvb01hbnlJbmNsdXNpb25JbmhlcmVudHMBAQVMSW52YWxpZFBhcmVudEhlYWRlcgEBBUhJbmhlcmVudE92ZXJ3ZWlnaHQBAQWEQ2FuZGlkYXRlc0ZpbHRlcmVkRHVyaW5nRXhlY3V0aW9uAQEFUFVuc2NoZWR1bGVkQ2FuZGlkYXRlAQEFNFBhcmFTY2hlZHVsZXIBAQUUUGFyYXMBAjQ0Tm90UmVnaXN0ZXJlZAEBBTRDYW5ub3RPbmJvYXJkAQEFOENhbm5vdE9mZmJvYXJkAQEFNENhbm5vdFVwZ3JhZGUBAQU8Q2Fubm90RG93bmdyYWRlAQEFWFB2ZkNoZWNrU3RhdGVtZW50U3RhbGUBAQVcUHZmQ2hlY2tTdGF0ZW1lbnRGdXR1cmUBAQWEUHZmQ2hlY2tWYWxpZGF0b3JJbmRleE91dE9mQm91bmRzAQEFYFB2ZkNoZWNrSW52YWxpZFNpZ25hdHVyZQEBBUhQdmZDaGVja0RvdWJsZVZvdGUBAQVYUHZmQ2hlY2tTdWJqZWN0SW52YWxpZAEBBURDYW5ub3RVcGdyYWRlQ29kZQEBBSxJbnZhbGlkQ29kZQEBBSxJbml0aWFsaXplcgEBBQxEbXABAQUQSHJtcAECUFRPcGVuSHJtcENoYW5uZWxUb1NlbGYBAQV8T3BlbkhybXBDaGFubmVsSW52YWxpZFJlY2lwaWVudAEBBWxPcGVuSHJtcENoYW5uZWxaZXJvQ2FwYWNpdHkBAQWMT3BlbkhybXBDaGFubmVsQ2FwYWNpdHlFeGNlZWRzTGltaXQBAQV4T3BlbkhybXBDaGFubmVsWmVyb01lc3NhZ2VTaXplAQEFmE9wZW5Icm1wQ2hhbm5lbE1lc3NhZ2VTaXplRXhjZWVkc0xpbWl0AQEFcE9wZW5Icm1wQ2hhbm5lbEFscmVhZHlFeGlzdHMBAQV8T3BlbkhybXBDaGFubmVsQWxyZWFkeVJlcXVlc3RlZAEBBXBPcGVuSHJtcENoYW5uZWxMaW1pdEV4Y2VlZGVkAQEFcEFjY2VwdEhybXBDaGFubmVsRG9lc250RXhpc3QBAQWEQWNjZXB0SHJtcENoYW5uZWxBbHJlYWR5Q29uZmlybWVkAQEFeEFjY2VwdEhybXBDaGFubmVsTGltaXRFeGNlZWRlZAEBBXBDbG9zZUhybXBDaGFubmVsVW5hdXRob3JpemVkAQEFbENsb3NlSHJtcENoYW5uZWxEb2VzbnRFeGlzdAEBBXxDbG9zZUhybXBDaGFubmVsQWxyZWFkeVVuZGVyd2F5AQEFhENhbmNlbEhybXBPcGVuQ2hhbm5lbFVuYXV0aG9yaXplZAEBBWhPcGVuSHJtcENoYW5uZWxEb2VzbnRFeGlzdAEBBXxPcGVuSHJtcENoYW5uZWxBbHJlYWR5Q29uZmlybWVkAQEFMFdyb25nV2l0bmVzcwEBBXBDaGFubmVsQ3JlYXRpb25Ob3RBdXRob3JpemVkAQEFPFBhcmFTZXNzaW9uSW5mbwEBBTRQYXJhc0Rpc3B1dGVzAQIkdER1cGxpY2F0ZURpc3B1dGVTdGF0ZW1lbnRTZXRzAQEFXEFuY2llbnREaXNwdXRlU3RhdGVtZW50AQEFZFZhbGlkYXRvckluZGV4T3V0T2ZCb3VuZHMBAQVASW52YWxpZFNpZ25hdHVyZQEBBUhEdXBsaWNhdGVTdGF0ZW1lbnQBAQVIU2luZ2xlU2lkZWREaXNwdXRlAQEFPE1hbGljaW91c0JhY2tlcgEBBUxNaXNzaW5nQmFja2luZ1ZvdGVzAQEFSFVuY29uZmlybWVkRGlzcHV0ZQEBBTRQYXJhc1NsYXNoaW5nAQIYYEludmFsaWRLZXlPd25lcnNoaXBQcm9vZgEBBUxJbnZhbGlkU2Vzc2lvbkluZGV4AQEFUEludmFsaWRDYW5kaWRhdGVIYXNoAQEFVEludmFsaWRWYWxpZGF0b3JJbmRleAEBBWBWYWxpZGF0b3JJbmRleElkTWlzbWF0Y2gBAQVcRHVwbGljYXRlU2xhc2hpbmdSZXBvcnQBAQUgT25EZW1hbmQBAggkUXVldWVGdWxsAQEFcFNwb3RQcmljZUhpZ2hlclRoYW5NYXhBbW91bnQBAQVoQ29yZXRpbWVBc3NpZ25tZW50UHJvdmlkZXIBAhhAQXNzaWdubWVudHNFbXB0eQEBBTRPdmVyU2NoZWR1bGVkAQEFOFVuZGVyU2NoZWR1bGVkAQEFQERpc2FsbG93ZWRJbnNlcnQBAQU8RHVwbGljYXRlSW5zZXJ0AQEFUEFzc2lnbm1lbnRzTm90U29ydGVkAQEFJFJlZ2lzdHJhcgECODROb3RSZWdpc3RlcmVkAQEFREFscmVhZHlSZWdpc3RlcmVkAQEFIE5vdE93bmVyAQEFMENvZGVUb29MYXJnZQEBBUBIZWFkRGF0YVRvb0xhcmdlAQEFME5vdFBhcmFjaGFpbgEBBTROb3RQYXJhdGhyZWFkAQEFQENhbm5vdERlcmVnaXN0ZXIBAQU8Q2Fubm90RG93bmdyYWRlAQEFNENhbm5vdFVwZ3JhZGUBAQUoUGFyYUxvY2tlZAEBBSxOb3RSZXNlcnZlZAEBBSxJbnZhbGlkQ29kZQEBBShDYW5ub3RTd2FwAQEFFFNsb3RzAQIIRFBhcmFOb3RPbmJvYXJkaW5nAQEFKExlYXNlRXJyb3IBAQUgQXVjdGlvbnMBAhxEQXVjdGlvbkluUHJvZ3Jlc3MBAQVETGVhc2VQZXJpb2RJblBhc3QBAQVEUGFyYU5vdFJlZ2lzdGVyZWQBAQVETm90Q3VycmVudEF1Y3Rpb24BAQUoTm90QXVjdGlvbgEBBTBBdWN0aW9uRW5kZWQBAQVAQWxyZWFkeUxlYXNlZE91dAEBBSRDcm93ZGxvYW4BAlxERmlyc3RQZXJpb2RJblBhc3QBAQVkRmlyc3RQZXJpb2RUb29GYXJJbkZ1dHVyZQEBBWxMYXN0UGVyaW9kQmVmb3JlRmlyc3RQZXJpb2QBAQVgTGFzdFBlcmlvZFRvb0ZhckluRnV0dXJlAQEFPENhbm5vdEVuZEluUGFzdAEBBURFbmRUb29GYXJJbkZ1dHVyZQEBBSBPdmVyZmxvdwEBBVBDb250cmlidXRpb25Ub29TbWFsbAEBBTRJbnZhbGlkUGFyYUlkAQEFLENhcEV4Y2VlZGVkAQEFWENvbnRyaWJ1dGlvblBlcmlvZE92ZXIBAQU0SW52YWxpZE9yaWdpbgEBBTBOb3RQYXJhY2hhaW4BAQUsTGVhc2VBY3RpdmUBAQVAQmlkT3JMZWFzZUFjdGl2ZQEBBTBGdW5kTm90RW5kZWQBAQU8Tm9Db250cmlidXRpb25zAQEFSE5vdFJlYWR5VG9EaXNzb2x2ZQEBBUBJbnZhbGlkU2lnbmF0dXJlAQEFME1lbW9Ub29MYXJnZQEBBURBbHJlYWR5SW5OZXdSYWlzZQEBBUhWcmZEZWxheUluUHJvZ3Jlc3MBAQU0Tm9MZWFzZVBlcmlvZAEBBSBDb3JldGltZQECDCROb3RCcm9rZXIBAQVYUmVxdWVzdGVkRnV0dXJlUmV2ZW51ZQEBBUxBc3NldFRyYW5zZmVyRmFpbGVkAQEFSFN0YXRlVHJpZU1pZ3JhdGlvbgECGDxNYXhTaWduZWRMaW1pdHMBAQUoS2V5VG9vTG9uZwEBBThOb3RFbm91Z2hGdW5kcwEBBShCYWRXaXRuZXNzAQEFZFNpZ25lZE1pZ3JhdGlvbk5vdEFsbG93ZWQBAQUwQmFkQ2hpbGRSb290AQEFJFhjbVBhbGxldAECYCxVbnJlYWNoYWJsZQEBBSxTZW5kRmFpbHVyZQEBBSBGaWx0ZXJlZAEBBUhVbndlaWdoYWJsZU1lc3NhZ2UBAQVgRGVzdGluYXRpb25Ob3RJbnZlcnRpYmxlAQEFFEVtcHR5AQEFOENhbm5vdFJlYW5jaG9yAQEFNFRvb01hbnlBc3NldHMBAQU0SW52YWxpZE9yaWdpbgEBBShCYWRWZXJzaW9uAQEFLEJhZExvY2F0aW9uAQEFOE5vU3Vic2NyaXB0aW9uAQEFREFscmVhZHlTdWJzY3JpYmVkAQEFWENhbm5vdENoZWNrT3V0VGVsZXBvcnQBAQUoTG93QmFsYW5jZQEBBTBUb29NYW55TG9ja3MBAQVMQWNjb3VudE5vdFNvdmVyZWlnbgEBBShGZWVzTm90TWV0AQEFMExvY2tOb3RGb3VuZAEBBRRJblVzZQEBBWhJbnZhbGlkQXNzZXRVbmtub3duUmVzZXJ2ZQEBBXhJbnZhbGlkQXNzZXRVbnN1cHBvcnRlZFJlc2VydmUBAQU8VG9vTWFueVJlc2VydmVzAQEFYExvY2FsRXhlY3V0aW9uSW5jb21wbGV0ZQEBBTBNZXNzYWdlUXVldWUBAiQsTm90UmVhcGFibGUBAQUYTm9QYWdlAQEFJE5vTWVzc2FnZQEBBUBBbHJlYWR5UHJvY2Vzc2VkAQEFGFF1ZXVlZAEBBUhJbnN1ZmZpY2llbnRXZWlnaHQBAQVgVGVtcG9yYXJpbHlVbnByb2Nlc3NhYmxlAQEFLFF1ZXVlUGF1c2VkAQEFTFJlY3Vyc2l2ZURpc2FsbG93ZWQBAQUkQXNzZXRSYXRlAQIMQFVua25vd25Bc3NldEtpbmQBAQU0QWxyZWFkeUV4aXN0cwEBBSBPdmVyZmxvdwEBBRRCZWVmeQECEGBJbnZhbGlkS2V5T3duZXJzaGlwUHJvb2YBAQVgSW52YWxpZEVxdWl2b2NhdGlvblByb29mAQEFWER1cGxpY2F0ZU9mZmVuY2VSZXBvcnQBAQVQSW52YWxpZENvbmZpZ3VyYXRpb24BAQUMTW1yAQEFMEJlZWZ5TW1yTGVhZgEBBTxQYXJhU3Vkb1dyYXBwZXIBAiQ8UGFyYURvZXNudEV4aXN0AQEFRFBhcmFBbHJlYWR5RXhpc3RzAQEFVEV4Y2VlZHNNYXhNZXNzYWdlU2l6ZQEBBThDb3VsZG50Q2xlYW51cAEBBTROb3RQYXJhdGhyZWFkAQEFME5vdFBhcmFjaGFpbgEBBTRDYW5ub3RVcGdyYWRlAQEFPENhbm5vdERvd25ncmFkZQEBBTBUb29NYW55Q29yZXMBAQUQU3VkbwECBCxSZXF1aXJlU3VkbwEBBURDb25zdW1lclJlbWFpbmluZwEBBSxOb1Byb3ZpZGVycwEBBUBUb29NYW55Q29uc3VtZXJzAQEFFFRva2VuAQIoQEZ1bmRzVW5hdmFpbGFibGUBAQUwT25seVByb3ZpZGVyAQEFMEJlbG93TWluaW11bQEBBTBDYW5ub3RDcmVhdGUBAQUwVW5rbm93bkFzc2V0AQEFGEZyb3plbgEBBSxVbnN1cHBvcnRlZAEBBUBDYW5ub3RDcmVhdGVIb2xkAQEFNE5vdEV4cGVuZGFibGUBAQUcQmxvY2tlZAEBBShBcml0aG1ldGljAQIMJFVuZGVyZmxvdwEBBSBPdmVyZmxvdwEBBThEaXZpc2lvbkJ5WmVybwEBBTRUcmFuc2FjdGlvbmFsAQIIMExpbWl0UmVhY2hlZAEBBRxOb0xheWVyAQEFJEV4aGF1c3RlZAEBBShDb3JydXB0aW9uAQEFLFVuYXZhaWxhYmxlAQEFOFJvb3ROb3RBbGxvd2VkAQEFAhxARXh0cmluc2ljU3VjY2VzcwEABDRkaXNwYXRjaF9pbmZvQDxFeHRyaW5zaWNGYWlsZWQBAAg4ZGlzcGF0Y2hfZXJyb3IpDTRkaXNwYXRjaF9pbmZvQCxDb2RlVXBkYXRlZAEBBShOZXdBY2NvdW50AQAEHGFjY291bnQANEtpbGxlZEFjY291bnQBAAQcYWNjb3VudAAgUmVtYXJrZWQBAAgYc2VuZGVyABBoYXNoIERVcGdyYWRlQXV0aG9yaXplZAEACCRjb2RlX2hhc2ggNGNoZWNrX3ZlcnNpb24UBxUBKQ0CJCRTY2hlZHVsZWQBAAgQd2hlbgQUaW5kZXgEIENhbmNlbGVkAQAIEHdoZW4EFGluZGV4BChEaXNwYXRjaGVkAQAMEHRhc2sNAQhpZBEBGHJlc3VsdDENIFJldHJ5U2V0AQAQEHRhc2sNAQhpZBEBGHBlcmlvZAQccmV0cmllcwQ4UmV0cnlDYW5jZWxsZWQBAAgQdGFzaw0BCGlkEQE8Q2FsbFVuYXZhaWxhYmxlAQAIEHRhc2sNAQhpZBEBOFBlcmlvZGljRmFpbGVkAQAIEHRhc2sNAQhpZBEBLFJldHJ5RmFpbGVkAQAIEHRhc2sNAQhpZBEBVFBlcm1hbmVudGx5T3ZlcndlaWdodAEACBB0YXNrDQEIaWQRAQAIJHBvc3RfaW5mb7UBFGVycm9yKQ0HtQE5DQIMPENhbGxXaGl0ZWxpc3RlZAEABCRjYWxsX2hhc2ggWFdoaXRlbGlzdGVkQ2FsbFJlbW92ZWQBAAQkY2FsbF9oYXNoIGRXaGl0ZWxpc3RlZENhbGxEaXNwYXRjaGVkAQAIJGNhbGxfaGFzaCAYcmVzdWx0PQ0CGEBCYXRjaEludGVycnVwdGVkAQAIFGluZGV4BBRlcnJvcikNOEJhdGNoQ29tcGxldGVkAQEFYEJhdGNoQ29tcGxldGVkV2l0aEVycm9ycwEBBTRJdGVtQ29tcGxldGVkAQEFKEl0ZW1GYWlsZWQBAAQUZXJyb3IpDTBEaXNwYXRjaGVkQXMBAAQYcmVzdWx0MQ0CFDRQcm94eUV4ZWN1dGVkAQAEGHJlc3VsdDENLFB1cmVDcmVhdGVkAQAQEHB1cmUADHdobwAocHJveHlfdHlwZekBUGRpc2FtYmlndWF0aW9uX2luZGV4BCRBbm5vdW5jZWQBAAwQcmVhbAAUcHJveHkAJGNhbGxfaGFzaCAoUHJveHlBZGRlZAEAECRkZWxlZ2F0b3IAJGRlbGVnYXRlZQAocHJveHlfdHlwZekBFGRlbGF5BDBQcm94eVJlbW92ZWQBABAkZGVsZWdhdG9yACRkZWxlZ2F0ZWUAKHByb3h5X3R5cGXpARRkZWxheQQCECxOZXdNdWx0aXNpZwEADCRhcHByb3ZpbmcAIG11bHRpc2lnACRjYWxsX2hhc2ggQE11bHRpc2lnQXBwcm92YWwBABAkYXBwcm92aW5nACR0aW1lcG9pbnTxASBtdWx0aXNpZwAkY2FsbF9oYXNoIEBNdWx0aXNpZ0V4ZWN1dGVkAQAUJGFwcHJvdmluZwAkdGltZXBvaW508QEgbXVsdGlzaWcAJGNhbGxfaGFzaCAYcmVzdWx0MQ1ETXVsdGlzaWdDYW5jZWxsZWQBABAoY2FuY2VsbGluZwAkdGltZXBvaW508QEgbXVsdGlzaWcAJGNhbGxfaGFzaCACFCBVbnN0YWtlZAEACBRzdGFzaAAYcmVzdWx0MQ0cU2xhc2hlZAEACBRzdGFzaAAYYW1vdW50CDBCYXRjaENoZWNrZWQBAAQQZXJhczkCNEJhdGNoRmluaXNoZWQBAAQQc2l6ZQQ0SW50ZXJuYWxFcnJvcgEBBQIoHENyZWF0ZWQBAAQccGFyYV9pZAQsQ29udHJpYnV0ZWQBAAwMd2hvAChmdW5kX2luZGV4BBhhbW91bnQIIFdpdGhkcmV3AQAMDHdobwAoZnVuZF9pbmRleAQYYW1vdW50CERQYXJ0aWFsbHlSZWZ1bmRlZAEABBxwYXJhX2lkBCxBbGxSZWZ1bmRlZAEABBxwYXJhX2lkBCREaXNzb2x2ZWQBAAQccGFyYV9pZAQ8SGFuZGxlQmlkUmVzdWx0AQAIHHBhcmFfaWQEGHJlc3VsdDENGEVkaXRlZAEABBxwYXJhX2lkBCxNZW1vVXBkYXRlZAEADAx3aG8AHHBhcmFfaWQEEG1lbW8kPEFkZGVkVG9OZXdSYWlzZQEABBxwYXJhX2lkBAIQFFN1ZGlkAQAELHN1ZG9fcmVzdWx0MQ0oS2V5Q2hhbmdlZAEACAxvbGQFAgxuZXcAKEtleVJlbW92ZWQBAQUoU3Vkb0FzRG9uZQEABCxzdWRvX3Jlc3VsdDENAqQYU3lzdGVtAQIcQEV4dHJpbnNpY1N1Y2Nlc3MBAAQ0ZGlzcGF0Y2hfaW5mb0A8RXh0cmluc2ljRmFpbGVkAQAIOGRpc3BhdGNoX2Vycm9yKQ00ZGlzcGF0Y2hfaW5mb0AsQ29kZVVwZGF0ZWQBAQUoTmV3QWNjb3VudAEABBxhY2NvdW50ADRLaWxsZWRBY2NvdW50AQAEHGFjY291bnQAIFJlbWFya2VkAQAIGHNlbmRlcgAQaGFzaCBEVXBncmFkZUF1dGhvcml6ZWQBAAgkY29kZV9oYXNoIDRjaGVja192ZXJzaW9uFCRTY2hlZHVsZXIBAiQkU2NoZWR1bGVkAQAIEHdoZW4EFGluZGV4BCBDYW5jZWxlZAEACBB3aGVuBBRpbmRleAQoRGlzcGF0Y2hlZAEADBB0YXNrDQEIaWQRARhyZXN1bHQxDSBSZXRyeVNldAEAEBB0YXNrDQEIaWQRARhwZXJpb2QEHHJldHJpZXMEOFJldHJ5Q2FuY2VsbGVkAQAIEHRhc2sNAQhpZBEBPENhbGxVbmF2YWlsYWJsZQEACBB0YXNrDQEIaWQRAThQZXJpb2RpY0ZhaWxlZAEACBB0YXNrDQEIaWQRASxSZXRyeUZhaWxlZAEACBB0YXNrDQEIaWQRAVRQZXJtYW5lbnRseU92ZXJ3ZWlnaHQBAAgQdGFzaw0BCGlkEQEgUHJlaW1hZ2UBAgwUTm90ZWQBAAQQaGFzaCAkUmVxdWVzdGVkAQAEEGhhc2ggHENsZWFyZWQBAAQQaGFzaCAcSW5kaWNlcwECDDRJbmRleEFzc2lnbmVkAQAIDHdobwAUaW5kZXgEKEluZGV4RnJlZWQBAAQUaW5kZXgELEluZGV4RnJvemVuAQAIFGluZGV4BAx3aG8AIEJhbGFuY2VzAQJYHEVuZG93ZWQBAAgcYWNjb3VudAAwZnJlZV9iYWxhbmNlCCBEdXN0TG9zdAEACBxhY2NvdW50ABhhbW91bnQIIFRyYW5zZmVyAQAMEGZyb20ACHRvABhhbW91bnQIKEJhbGFuY2VTZXQBAAgMd2hvABBmcmVlCCBSZXNlcnZlZAEACAx3aG8AGGFtb3VudAgoVW5yZXNlcnZlZAEACAx3aG8AGGFtb3VudAhIUmVzZXJ2ZVJlcGF0cmlhdGVkAQAQEGZyb20ACHRvABhhbW91bnQISGRlc3RpbmF0aW9uX3N0YXR1cykBHERlcG9zaXQBAAgMd2hvABhhbW91bnQIIFdpdGhkcmF3AQAIDHdobwAYYW1vdW50CBxTbGFzaGVkAQAIDHdobwAYYW1vdW50CBhNaW50ZWQBAAgMd2hvABhhbW91bnQIGEJ1cm5lZAEACAx3aG8AGGFtb3VudAgkU3VzcGVuZGVkAQAIDHdobwAYYW1vdW50CCBSZXN0b3JlZAEACAx3aG8AGGFtb3VudAggVXBncmFkZWQBAAQMd2hvABhJc3N1ZWQBAAQYYW1vdW50CCRSZXNjaW5kZWQBAAQYYW1vdW50CBhMb2NrZWQBAAgMd2hvABhhbW91bnQIIFVubG9ja2VkAQAIDHdobwAYYW1vdW50CBhGcm96ZW4BAAgMd2hvABhhbW91bnQIGFRoYXdlZAEACAx3aG8AGGFtb3VudAhMVG90YWxJc3N1YW5jZUZvcmNlZAEACAxvbGQIDG5ldwhIVHJhbnNhY3Rpb25QYXltZW50AQIESFRyYW5zYWN0aW9uRmVlUGFpZAEADAx3aG8AKGFjdHVhbF9mZWUIDHRpcAgcU3Rha2luZwECSBxFcmFQYWlkAQAMJGVyYV9pbmRleARAdmFsaWRhdG9yX3BheW91dAgkcmVtYWluZGVyCCBSZXdhcmRlZAEADBRzdGFzaAAQZGVzdDUBGGFtb3VudAgcU2xhc2hlZAEACBhzdGFrZXIAGGFtb3VudAg0U2xhc2hSZXBvcnRlZAEADCR2YWxpZGF0b3IAIGZyYWN0aW9uBCRzbGFzaF9lcmEEaE9sZFNsYXNoaW5nUmVwb3J0RGlzY2FyZGVkAQAENHNlc3Npb25faW5kZXgEOFN0YWtlcnNFbGVjdGVkAQEFGEJvbmRlZAEACBRzdGFzaAAYYW1vdW50CCBVbmJvbmRlZAEACBRzdGFzaAAYYW1vdW50CCRXaXRoZHJhd24BAAgUc3Rhc2gAGGFtb3VudAgYS2lja2VkAQAIJG5vbWluYXRvcgAUc3Rhc2gAVFN0YWtpbmdFbGVjdGlvbkZhaWxlZAEBBRxDaGlsbGVkAQAEFHN0YXNoADRQYXlvdXRTdGFydGVkAQAIJGVyYV9pbmRleAQ8dmFsaWRhdG9yX3N0YXNoAERWYWxpZGF0b3JQcmVmc1NldAEACBRzdGFzaAAUcHJlZnM5AWhTbmFwc2hvdFZvdGVyc1NpemVFeGNlZWRlZAEABBBzaXplBGxTbmFwc2hvdFRhcmdldHNTaXplRXhjZWVkZWQBAAQQc2l6ZQQgRm9yY2VFcmEBAAQQbW9kZT0BZENvbnRyb2xsZXJCYXRjaERlcHJlY2F0ZWQBAAQgZmFpbHVyZXMEIE9mZmVuY2VzAQIEHE9mZmVuY2UBAAgQa2luZEUBIHRpbWVzbG90JBxTZXNzaW9uAQIEKE5ld1Nlc3Npb24BAAQ0c2Vzc2lvbl9pbmRleAQcR3JhbmRwYQECDDhOZXdBdXRob3JpdGllcwEABDRhdXRob3JpdHlfc2V0VQEYUGF1c2VkAQEFHFJlc3VtZWQBAQUgVHJlYXN1cnkBAjAgU3BlbmRpbmcBAARAYnVkZ2V0X3JlbWFpbmluZwgcQXdhcmRlZAEADDhwcm9wb3NhbF9pbmRleAQUYXdhcmQIHGFjY291bnQAFEJ1cm50AQAELGJ1cm50X2Z1bmRzCCBSb2xsb3ZlcgEABEByb2xsb3Zlcl9iYWxhbmNlCBxEZXBvc2l0AQAEFHZhbHVlCDRTcGVuZEFwcHJvdmVkAQAMOHByb3Bvc2FsX2luZGV4BBhhbW91bnQILGJlbmVmaWNpYXJ5ADxVcGRhdGVkSW5hY3RpdmUBAAgscmVhY3RpdmF0ZWQILGRlYWN0aXZhdGVkCEhBc3NldFNwZW5kQXBwcm92ZWQBABgUaW5kZXgEKGFzc2V0X2tpbmSBARhhbW91bnQILGJlbmVmaWNpYXJ5mQEodmFsaWRfZnJvbQQkZXhwaXJlX2F0BEBBc3NldFNwZW5kVm9pZGVkAQAEFGluZGV4BBBQYWlkAQAIFGluZGV4BChwYXltZW50X2lkCDRQYXltZW50RmFpbGVkAQAIFGluZGV4BChwYXltZW50X2lkCDhTcGVuZFByb2Nlc3NlZAEABBRpbmRleARAQ29udmljdGlvblZvdGluZwECCCREZWxlZ2F0ZWQBBAABCCxVbmRlbGVnYXRlZAEBASRSZWZlcmVuZGEBAkAkU3VibWl0dGVkAQAMFGluZGV4BBR0cmFjawQgcHJvcG9zYWylAVREZWNpc2lvbkRlcG9zaXRQbGFjZWQBAAwUaW5kZXgEDHdobwAYYW1vdW50CFxEZWNpc2lvbkRlcG9zaXRSZWZ1bmRlZAEADBRpbmRleAQMd2hvABhhbW91bnQIOERlcG9zaXRTbGFzaGVkAQAIDHdobwAYYW1vdW50CDxEZWNpc2lvblN0YXJ0ZWQBABAUaW5kZXgEFHRyYWNrBCBwcm9wb3NhbKUBFHRhbGx5qQE4Q29uZmlybVN0YXJ0ZWQBAAQUaW5kZXgEOENvbmZpcm1BYm9ydGVkAQAEFGluZGV4BCRDb25maXJtZWQBAAgUaW5kZXgEFHRhbGx5qQEgQXBwcm92ZWQBAAQUaW5kZXgEIFJlamVjdGVkAQAIFGluZGV4BBR0YWxseakBIFRpbWVkT3V0AQAIFGluZGV4BBR0YWxseakBJENhbmNlbGxlZAEACBRpbmRleAQUdGFsbHmpARhLaWxsZWQBAAgUaW5kZXgEFHRhbGx5qQFkU3VibWlzc2lvbkRlcG9zaXRSZWZ1bmRlZAEADBRpbmRleAQMd2hvABhhbW91bnQILE1ldGFkYXRhU2V0AQAIFGluZGV4BBBoYXNoIDxNZXRhZGF0YUNsZWFyZWQBAAgUaW5kZXgEEGhhc2ggJFdoaXRlbGlzdAECDDxDYWxsV2hpdGVsaXN0ZWQBAAQkY2FsbF9oYXNoIFhXaGl0ZWxpc3RlZENhbGxSZW1vdmVkAQAEJGNhbGxfaGFzaCBkV2hpdGVsaXN0ZWRDYWxsRGlzcGF0Y2hlZAEACCRjYWxsX2hhc2ggGHJlc3VsdD0NKFBhcmFtZXRlcnMBAgQcVXBkYXRlZAEADAxrZXnJASRvbGRfdmFsdWXVASRuZXdfdmFsdWXVARhDbGFpbXMBAgQcQ2xhaW1lZAEADAx3aG8AQGV0aGVyZXVtX2FkZHJlc3NlARhhbW91bnQIHFZlc3RpbmcBAgg4VmVzdGluZ1VwZGF0ZWQBAAgcYWNjb3VudAAgdW52ZXN0ZWQIQFZlc3RpbmdDb21wbGV0ZWQBAAQcYWNjb3VudAAcVXRpbGl0eQECGEBCYXRjaEludGVycnVwdGVkAQAIFGluZGV4BBRlcnJvcikNOEJhdGNoQ29tcGxldGVkAQEFYEJhdGNoQ29tcGxldGVkV2l0aEVycm9ycwEBBTRJdGVtQ29tcGxldGVkAQEFKEl0ZW1GYWlsZWQBAAQUZXJyb3IpDTBEaXNwYXRjaGVkQXMBAAQYcmVzdWx0MQ0UUHJveHkBAhQ0UHJveHlFeGVjdXRlZAEABBhyZXN1bHQxDSxQdXJlQ3JlYXRlZAEAEBBwdXJlAAx3aG8AKHByb3h5X3R5cGXpAVBkaXNhbWJpZ3VhdGlvbl9pbmRleAQkQW5ub3VuY2VkAQAMEHJlYWwAFHByb3h5ACRjYWxsX2hhc2ggKFByb3h5QWRkZWQBABAkZGVsZWdhdG9yACRkZWxlZ2F0ZWUAKHByb3h5X3R5cGXpARRkZWxheQQwUHJveHlSZW1vdmVkAQAQJGRlbGVnYXRvcgAkZGVsZWdhdGVlAChwcm94eV90eXBl6QEUZGVsYXkEIE11bHRpc2lnAQIQLE5ld011bHRpc2lnAQAMJGFwcHJvdmluZwAgbXVsdGlzaWcAJGNhbGxfaGFzaCBATXVsdGlzaWdBcHByb3ZhbAEAECRhcHByb3ZpbmcAJHRpbWVwb2ludPEBIG11bHRpc2lnACRjYWxsX2hhc2ggQE11bHRpc2lnRXhlY3V0ZWQBABQkYXBwcm92aW5nACR0aW1lcG9pbnTxASBtdWx0aXNpZwAkY2FsbF9oYXNoIBhyZXN1bHQxDURNdWx0aXNpZ0NhbmNlbGxlZAEAEChjYW5jZWxsaW5nACR0aW1lcG9pbnTxASBtdWx0aXNpZwAkY2FsbF9oYXNoICBCb3VudGllcwECLDhCb3VudHlQcm9wb3NlZAEABBRpbmRleAQ4Qm91bnR5UmVqZWN0ZWQBAAgUaW5kZXgEEGJvbmQISEJvdW50eUJlY2FtZUFjdGl2ZQEABBRpbmRleAQ0Qm91bnR5QXdhcmRlZAEACBRpbmRleAQsYmVuZWZpY2lhcnkANEJvdW50eUNsYWltZWQBAAwUaW5kZXgEGHBheW91dAgsYmVuZWZpY2lhcnkAOEJvdW50eUNhbmNlbGVkAQAEFGluZGV4BDhCb3VudHlFeHRlbmRlZAEABBRpbmRleAQ4Qm91bnR5QXBwcm92ZWQBAAQUaW5kZXgEPEN1cmF0b3JQcm9wb3NlZAEACCRib3VudHlfaWQEHGN1cmF0b3IAREN1cmF0b3JVbmFzc2lnbmVkAQAEJGJvdW50eV9pZAQ8Q3VyYXRvckFjY2VwdGVkAQAIJGJvdW50eV9pZAQcY3VyYXRvcgA0Q2hpbGRCb3VudGllcwECEBRBZGRlZAEACBRpbmRleAQsY2hpbGRfaW5kZXgEHEF3YXJkZWQBAAwUaW5kZXgELGNoaWxkX2luZGV4BCxiZW5lZmljaWFyeQAcQ2xhaW1lZAEAEBRpbmRleAQsY2hpbGRfaW5kZXgEGHBheW91dAgsYmVuZWZpY2lhcnkAIENhbmNlbGVkAQAIFGluZGV4BCxjaGlsZF9pbmRleARoRWxlY3Rpb25Qcm92aWRlck11bHRpUGhhc2UBAhg4U29sdXRpb25TdG9yZWQBAAwcY29tcHV0ZQECGG9yaWdpbgUCMHByZXZfZWplY3RlZBRERWxlY3Rpb25GaW5hbGl6ZWQBAAgcY29tcHV0ZQECFHNjb3JlCQI4RWxlY3Rpb25GYWlsZWQBAQUgUmV3YXJkZWQBAAgcYWNjb3VudAAUdmFsdWUIHFNsYXNoZWQBAAgcYWNjb3VudAAUdmFsdWUIRFBoYXNlVHJhbnNpdGlvbmVkAQAMEGZyb20RAgh0bxECFHJvdW5kBCRWb3Rlckxpc3QBAgggUmViYWdnZWQBAAwMd2hvABBmcm9tCAh0bwgwU2NvcmVVcGRhdGVkAQAIDHdobwAkbmV3X3Njb3JlCDxOb21pbmF0aW9uUG9vbHMBAkgcQ3JlYXRlZAEACCRkZXBvc2l0b3IAHHBvb2xfaWQEGEJvbmRlZAEAEBhtZW1iZXIAHHBvb2xfaWQEGGJvbmRlZAgYam9pbmVkFBxQYWlkT3V0AQAMGG1lbWJlcgAccG9vbF9pZAQYcGF5b3V0CCBVbmJvbmRlZAEAFBhtZW1iZXIAHHBvb2xfaWQEHGJhbGFuY2UIGHBvaW50cwgMZXJhBCRXaXRoZHJhd24BABAYbWVtYmVyABxwb29sX2lkBBxiYWxhbmNlCBhwb2ludHMIJERlc3Ryb3llZAEABBxwb29sX2lkBDBTdGF0ZUNoYW5nZWQBAAgccG9vbF9pZAQkbmV3X3N0YXRlHQI0TWVtYmVyUmVtb3ZlZAEACBxwb29sX2lkBBhtZW1iZXIAMFJvbGVzVXBkYXRlZAEADBByb290BQIcYm91bmNlcgUCJG5vbWluYXRvcgUCLFBvb2xTbGFzaGVkAQAIHHBvb2xfaWQEHGJhbGFuY2UIUFVuYm9uZGluZ1Bvb2xTbGFzaGVkAQAMHHBvb2xfaWQEDGVyYQQcYmFsYW5jZQhUUG9vbENvbW1pc3Npb25VcGRhdGVkAQAIHHBvb2xfaWQEHGN1cnJlbnQlAmBQb29sTWF4Q29tbWlzc2lvblVwZGF0ZWQBAAgccG9vbF9pZAQ4bWF4X2NvbW1pc3Npb24EfFBvb2xDb21taXNzaW9uQ2hhbmdlUmF0ZVVwZGF0ZWQBAAgccG9vbF9pZAQsY2hhbmdlX3JhdGUpApBQb29sQ29tbWlzc2lvbkNsYWltUGVybWlzc2lvblVwZGF0ZWQBAAgccG9vbF9pZAQocGVybWlzc2lvbjECVFBvb2xDb21taXNzaW9uQ2xhaW1lZAEACBxwb29sX2lkBChjb21taXNzaW9uCGRNaW5CYWxhbmNlRGVmaWNpdEFkanVzdGVkAQAIHHBvb2xfaWQEGGFtb3VudAhgTWluQmFsYW5jZUV4Y2Vzc0FkanVzdGVkAQAIHHBvb2xfaWQEGGFtb3VudAgsRmFzdFVuc3Rha2UBAhQgVW5zdGFrZWQBAAgUc3Rhc2gAGHJlc3VsdDENHFNsYXNoZWQBAAgUc3Rhc2gAGGFtb3VudAgwQmF0Y2hDaGVja2VkAQAEEGVyYXM5AjRCYXRjaEZpbmlzaGVkAQAEEHNpemUENEludGVybmFsRXJyb3IBAQU0UGFyYUluY2x1c2lvbgECEDxDYW5kaWRhdGVCYWNrZWQBAxBJAiQEBERDYW5kaWRhdGVJbmNsdWRlZAEDEEkCJAQERENhbmRpZGF0ZVRpbWVkT3V0AQMMSQIkBFhVcHdhcmRNZXNzYWdlc1JlY2VpdmVkAQAIEGZyb20EFGNvdW50BBRQYXJhcwECIEhDdXJyZW50Q29kZVVwZGF0ZWQBAQJIQ3VycmVudEhlYWRVcGRhdGVkAQECUENvZGVVcGdyYWRlU2NoZWR1bGVkAQECME5ld0hlYWROb3RlZAEBAjBBY3Rpb25RdWV1ZWQBBAQBCDxQdmZDaGVja1N0YXJ0ZWQBAwggBEBQdmZDaGVja0FjY2VwdGVkAQMIIARAUHZmQ2hlY2tSZWplY3RlZAEDCCAEEEhybXABAhxQT3BlbkNoYW5uZWxSZXF1ZXN0ZWQBABAYc2VuZGVyBCRyZWNpcGllbnQEVHByb3Bvc2VkX21heF9jYXBhY2l0eQRkcHJvcG9zZWRfbWF4X21lc3NhZ2Vfc2l6ZQRMT3BlbkNoYW5uZWxDYW5jZWxlZAEACDBieV9wYXJhY2hhaW4EKGNoYW5uZWxfaWRVAkxPcGVuQ2hhbm5lbEFjY2VwdGVkAQAIGHNlbmRlcgQkcmVjaXBpZW50BDRDaGFubmVsQ2xvc2VkAQAIMGJ5X3BhcmFjaGFpbgQoY2hhbm5lbF9pZFUCWEhybXBDaGFubmVsRm9yY2VPcGVuZWQBABAYc2VuZGVyBCRyZWNpcGllbnQEVHByb3Bvc2VkX21heF9jYXBhY2l0eQRkcHJvcG9zZWRfbWF4X21lc3NhZ2Vfc2l6ZQRcSHJtcFN5c3RlbUNoYW5uZWxPcGVuZWQBABAYc2VuZGVyBCRyZWNpcGllbnQEVHByb3Bvc2VkX21heF9jYXBhY2l0eQRkcHJvcG9zZWRfbWF4X21lc3NhZ2Vfc2l6ZQRoT3BlbkNoYW5uZWxEZXBvc2l0c1VwZGF0ZWQBAAgYc2VuZGVyBCRyZWNpcGllbnQENFBhcmFzRGlzcHV0ZXMBAgxARGlzcHV0ZUluaXRpYXRlZAEDCCBdAkBEaXNwdXRlQ29uY2x1ZGVkAQMIIGECGFJldmVydAEBAiBPbkRlbWFuZAECCExPbkRlbWFuZE9yZGVyUGxhY2VkAQAMHHBhcmFfaWQEKHNwb3RfcHJpY2UIKG9yZGVyZWRfYnkAMFNwb3RQcmljZVNldAEABChzcG90X3ByaWNlCCRSZWdpc3RyYXIBAhAoUmVnaXN0ZXJlZAEACBxwYXJhX2lkBBxtYW5hZ2VyADBEZXJlZ2lzdGVyZWQBAAQccGFyYV9pZAQgUmVzZXJ2ZWQBAAgccGFyYV9pZAQMd2hvABxTd2FwcGVkAQAIHHBhcmFfaWQEIG90aGVyX2lkBBRTbG90cwECCDhOZXdMZWFzZVBlcmlvZAEABDBsZWFzZV9wZXJpb2QEGExlYXNlZAEAGBxwYXJhX2lkBBhsZWFzZXIAMHBlcmlvZF9iZWdpbgQwcGVyaW9kX2NvdW50BDhleHRyYV9yZXNlcnZlZAgwdG90YWxfYW1vdW50CCBBdWN0aW9ucwECHDhBdWN0aW9uU3RhcnRlZAEADDRhdWN0aW9uX2luZGV4BDBsZWFzZV9wZXJpb2QEGGVuZGluZwQ0QXVjdGlvbkNsb3NlZAEABDRhdWN0aW9uX2luZGV4BCBSZXNlcnZlZAEADBhiaWRkZXIAOGV4dHJhX3Jlc2VydmVkCDB0b3RhbF9hbW91bnQIKFVucmVzZXJ2ZWQBAAgYYmlkZGVyABhhbW91bnQISFJlc2VydmVDb25maXNjYXRlZAEADBxwYXJhX2lkBBhsZWFzZXIAGGFtb3VudAgsQmlkQWNjZXB0ZWQBABQYYmlkZGVyABxwYXJhX2lkBBhhbW91bnQIKGZpcnN0X3Nsb3QEJGxhc3Rfc2xvdAQ0V2lubmluZ09mZnNldAEACDRhdWN0aW9uX2luZGV4BDBibG9ja19udW1iZXIEJENyb3dkbG9hbgECKBxDcmVhdGVkAQAEHHBhcmFfaWQELENvbnRyaWJ1dGVkAQAMDHdobwAoZnVuZF9pbmRleAQYYW1vdW50CCBXaXRoZHJldwEADAx3aG8AKGZ1bmRfaW5kZXgEGGFtb3VudAhEUGFydGlhbGx5UmVmdW5kZWQBAAQccGFyYV9pZAQsQWxsUmVmdW5kZWQBAAQccGFyYV9pZAQkRGlzc29sdmVkAQAEHHBhcmFfaWQEPEhhbmRsZUJpZFJlc3VsdAEACBxwYXJhX2lkBBhyZXN1bHQxDRhFZGl0ZWQBAAQccGFyYV9pZAQsTWVtb1VwZGF0ZWQBAAwMd2hvABxwYXJhX2lkBBBtZW1vJDxBZGRlZFRvTmV3UmFpc2UBAAQccGFyYV9pZAQgQ29yZXRpbWUBAghQUmV2ZW51ZUluZm9SZXF1ZXN0ZWQBAAQQd2hlbgQwQ29yZUFzc2lnbmVkAQAEEGNvcmUESFN0YXRlVHJpZU1pZ3JhdGlvbgECECBNaWdyYXRlZAEADAx0b3AEFGNoaWxkBBxjb21wdXRlgQIcU2xhc2hlZAEACAx3aG8AGGFtb3VudAhUQXV0b01pZ3JhdGlvbkZpbmlzaGVkAQEFGEhhbHRlZAEABBRlcnJvcuQkWGNtUGFsbGV0AQJgJEF0dGVtcHRlZAEABBxvdXRjb21ljQIQU2VudAEAEBhvcmlnaW55ASxkZXN0aW5hdGlvbnkBHG1lc3NhZ2X5AihtZXNzYWdlX2lkIEhVbmV4cGVjdGVkUmVzcG9uc2UBAAgYb3JpZ2lueQEgcXVlcnlfaWQINFJlc3BvbnNlUmVhZHkBAAggcXVlcnlfaWQIIHJlc3BvbnNluQIgTm90aWZpZWQBAAwgcXVlcnlfaWQIMHBhbGxldF9pbmRleAQoY2FsbF9pbmRleARATm90aWZ5T3ZlcndlaWdodAEAFCBxdWVyeV9pZAgwcGFsbGV0X2luZGV4BChjYWxsX2luZGV4BDRhY3R1YWxfd2VpZ2h0GExtYXhfYnVkZ2V0ZWRfd2VpZ2h0GExOb3RpZnlEaXNwYXRjaEVycm9yAQAMIHF1ZXJ5X2lkCDBwYWxsZXRfaW5kZXgEKGNhbGxfaW5kZXgESE5vdGlmeURlY29kZUZhaWxlZAEADCBxdWVyeV9pZAgwcGFsbGV0X2luZGV4BChjYWxsX2luZGV4BEBJbnZhbGlkUmVzcG9uZGVyAQAMGG9yaWdpbnkBIHF1ZXJ5X2lkCERleHBlY3RlZF9sb2NhdGlvbr0CXEludmFsaWRSZXNwb25kZXJWZXJzaW9uAQAIGG9yaWdpbnkBIHF1ZXJ5X2lkCDRSZXNwb25zZVRha2VuAQAEIHF1ZXJ5X2lkCDRBc3NldHNUcmFwcGVkAQAMEGhhc2ggGG9yaWdpbnkBGGFzc2V0cxkDVFZlcnNpb25DaGFuZ2VOb3RpZmllZAEAECxkZXN0aW5hdGlvbnkBGHJlc3VsdAQQY29zdKECKG1lc3NhZ2VfaWQgXFN1cHBvcnRlZFZlcnNpb25DaGFuZ2VkAQAIIGxvY2F0aW9ueQEcdmVyc2lvbgRQTm90aWZ5VGFyZ2V0U2VuZEZhaWwBAAwgbG9jYXRpb255ASBxdWVyeV9pZAgUZXJyb3KJAmROb3RpZnlUYXJnZXRNaWdyYXRpb25GYWlsAQAIIGxvY2F0aW9umQEgcXVlcnlfaWQIVEludmFsaWRRdWVyaWVyVmVyc2lvbgEACBhvcmlnaW55ASBxdWVyeV9pZAg4SW52YWxpZFF1ZXJpZXIBABAYb3JpZ2lueQEgcXVlcnlfaWQIQGV4cGVjdGVkX3F1ZXJpZXJ5AVBtYXliZV9hY3R1YWxfcXVlcmllcr0CUFZlcnNpb25Ob3RpZnlTdGFydGVkAQAMLGRlc3RpbmF0aW9ueQEQY29zdKECKG1lc3NhZ2VfaWQgWFZlcnNpb25Ob3RpZnlSZXF1ZXN0ZWQBAAwsZGVzdGluYXRpb255ARBjb3N0oQIobWVzc2FnZV9pZCBgVmVyc2lvbk5vdGlmeVVucmVxdWVzdGVkAQAMLGRlc3RpbmF0aW9ueQEQY29zdKECKG1lc3NhZ2VfaWQgIEZlZXNQYWlkAQAIGHBheWluZ3kBEGZlZXOhAjRBc3NldHNDbGFpbWVkAQAMEGhhc2ggGG9yaWdpbnkBGGFzc2V0cxkDYFZlcnNpb25NaWdyYXRpb25GaW5pc2hlZAEABBx2ZXJzaW9uBDBNZXNzYWdlUXVldWUBAhBAUHJvY2Vzc2luZ0ZhaWxlZAEADAhpZCAYb3JpZ2luJQMUZXJyb3IpAyRQcm9jZXNzZWQBABAIaWQgGG9yaWdpbiUDLHdlaWdodF91c2VkGBxzdWNjZXNzFEhPdmVyd2VpZ2h0RW5xdWV1ZWQBABAIaWQgGG9yaWdpbiUDKHBhZ2VfaW5kZXgENG1lc3NhZ2VfaW5kZXgEKFBhZ2VSZWFwZWQBAAgYb3JpZ2luJQMUaW5kZXgEJEFzc2V0UmF0ZQECDEBBc3NldFJhdGVDcmVhdGVkAQAIKGFzc2V0X2tpbmSBARByYXRlCEBBc3NldFJhdGVSZW1vdmVkAQAEKGFzc2V0X2tpbmSBAUBBc3NldFJhdGVVcGRhdGVkAQAMKGFzc2V0X2tpbmSBAQxvbGQIDG5ldwgQU3VkbwECEBRTdWRpZAEABCxzdWRvX3Jlc3VsdDENKEtleUNoYW5nZWQBAAgMb2xkBQIMbmV3AChLZXlSZW1vdmVkAQEFKFN1ZG9Bc0RvbmUBAAQsc3Vkb19yZXN1bHQxDQAMFHBoYXNlNBRldmVudF0NGHRvcGljczkDBGENAAIoIHNjaGVkdWxlAQAQEHdoZW4EOG1heWJlX3BlcmlvZGljgQMgcHJpb3JpdHkEEGNhbGyJDRhjYW5jZWwBAAgQd2hlbgQUaW5kZXgEOHNjaGVkdWxlX25hbWVkAQAUCGlkIBB3aGVuBDhtYXliZV9wZXJpb2RpY4EDIHByaW9yaXR5BBBjYWxsiQ0wY2FuY2VsX25hbWVkAQAECGlkIDhzY2hlZHVsZV9hZnRlcgEAEBRhZnRlcgQ4bWF5YmVfcGVyaW9kaWOBAyBwcmlvcml0eQQQY2FsbIkNUHNjaGVkdWxlX25hbWVkX2FmdGVyAQAUCGlkIBRhZnRlcgQ4bWF5YmVfcGVyaW9kaWOBAyBwcmlvcml0eQQQY2FsbIkNJHNldF9yZXRyeQEADBB0YXNrDQEccmV0cmllcwQYcGVyaW9kBDxzZXRfcmV0cnlfbmFtZWQBAAwIaWQgHHJldHJpZXMEGHBlcmlvZAQwY2FuY2VsX3JldHJ5AQAEEHRhc2sNAUhjYW5jZWxfcmV0cnlfbmFtZWQBAAQIaWQgAhA4d2hpdGVsaXN0X2NhbGwBAAQkY2FsbF9oYXNoIFxyZW1vdmVfd2hpdGVsaXN0ZWRfY2FsbAEABCRjYWxsX2hhc2ggZGRpc3BhdGNoX3doaXRlbGlzdGVkX2NhbGwBAAwkY2FsbF9oYXNoIEBjYWxsX2VuY29kZWRfbGVuBExjYWxsX3dlaWdodF93aXRuZXNzGJxkaXNwYXRjaF93aGl0ZWxpc3RlZF9jYWxsX3dpdGhfcHJlaW1hZ2UBAAQQY2FsbIkNBIkNAAIYFGJhdGNoAQAEFGNhbGxzcQ00YXNfZGVyaXZhdGl2ZQEACBRpbmRleAQQY2FsbIkNJGJhdGNoX2FsbAEABBRjYWxsc3ENLGRpc3BhdGNoX2FzAQAIJGFzX29yaWdpbpUDEGNhbGyJDSxmb3JjZV9iYXRjaAEABBRjYWxsc3ENLHdpdGhfd2VpZ2h0AQAIEGNhbGyJDRh3ZWlnaHQYAigUcHJveHkBAAwQcmVhbNUDQGZvcmNlX3Byb3h5X3R5cGWFBBBjYWxsiQ0kYWRkX3Byb3h5AQAMIGRlbGVnYXRl1QMocHJveHlfdHlwZekBFGRlbGF5BDByZW1vdmVfcHJveHkBAAwgZGVsZWdhdGXVAyhwcm94eV90eXBl6QEUZGVsYXkEOHJlbW92ZV9wcm94aWVzAQEFLGNyZWF0ZV9wdXJlAQAMKHByb3h5X3R5cGXpARRkZWxheQQUaW5kZXgEJGtpbGxfcHVyZQEAFBxzcGF3bmVy1QMocHJveHlfdHlwZekBFGluZGV4BBhoZWlnaHQEJGV4dF9pbmRleAQgYW5ub3VuY2UBAAgQcmVhbNUDJGNhbGxfaGFzaCBMcmVtb3ZlX2Fubm91bmNlbWVudAEACBByZWFs1QMkY2FsbF9oYXNoIExyZWplY3RfYW5ub3VuY2VtZW50AQAIIGRlbGVnYXRl1QMkY2FsbF9oYXNoIDxwcm94eV9hbm5vdW5jZWQBABAgZGVsZWdhdGXVAxByZWFs1QNAZm9yY2VfcHJveHlfdHlwZYUEEGNhbGyJDQIQUGFzX211bHRpX3RocmVzaG9sZF8xAQAIRG90aGVyX3NpZ25hdG9yaWVz3QMQY2FsbIkNIGFzX211bHRpAQAUJHRocmVzaG9sZAREb3RoZXJfc2lnbmF0b3JpZXPdAzxtYXliZV90aW1lcG9pbnSNBBBjYWxsiQ0obWF4X3dlaWdodBhAYXBwcm92ZV9hc19tdWx0aQEAFCR0aHJlc2hvbGQERG90aGVyX3NpZ25hdG9yaWVz3QM8bWF5YmVfdGltZXBvaW50jQQkY2FsbF9oYXNoIChtYXhfd2VpZ2h0GDxjYW5jZWxfYXNfbXVsdGkBABAkdGhyZXNob2xkBERvdGhlcl9zaWduYXRvcmllc90DJHRpbWVwb2ludPEBJGNhbGxfaGFzaCACGHRzdWRvX3NjaGVkdWxlX3BhcmFfaW5pdGlhbGl6ZQEACAhpZAQcZ2VuZXNpcxUJaHN1ZG9fc2NoZWR1bGVfcGFyYV9jbGVhbnVwAQAECGlkBIBzdWRvX3NjaGVkdWxlX3BhcmF0aHJlYWRfdXBncmFkZQEABAhpZASEc3Vkb19zY2hlZHVsZV9wYXJhY2hhaW5fZG93bmdyYWRlAQAECGlkBFxzdWRvX3F1ZXVlX2Rvd253YXJkX3hjbQEACAhpZAQMeGNtqQZsc3Vkb19lc3RhYmxpc2hfaHJtcF9jaGFubmVsAQAQGHNlbmRlcgQkcmVjaXBpZW50BDBtYXhfY2FwYWNpdHkEQG1heF9tZXNzYWdlX3NpemUEAhQQc3VkbwEABBBjYWxsiQ1Uc3Vkb191bmNoZWNrZWRfd2VpZ2h0AQAIEGNhbGyJDRh3ZWlnaHQYHHNldF9rZXkBAAQMbmV31QMcc3Vkb19hcwEACAx3aG/VAxBjYWxsiQ0ocmVtb3ZlX2tleQEBBQLAGFN5c3RlbQECLBhyZW1hcmsBAAQYcmVtYXJrJDhzZXRfaGVhcF9wYWdlcwEABBRwYWdlcwggc2V0X2NvZGUBAAQQY29kZSRcc2V0X2NvZGVfd2l0aG91dF9jaGVja3MBAAQQY29kZSQsc2V0X3N0b3JhZ2UBAAQUaXRlbXN5AzBraWxsX3N0b3JhZ2UBAAQQa2V5c30DLGtpbGxfcHJlZml4AQAIGHByZWZpeCQcc3Via2V5cwREcmVtYXJrX3dpdGhfZXZlbnQBAAQYcmVtYXJrJERhdXRob3JpemVfdXBncmFkZQEABCRjb2RlX2hhc2gggGF1dGhvcml6ZV91cGdyYWRlX3dpdGhvdXRfY2hlY2tzAQAEJGNvZGVfaGFzaCBgYXBwbHlfYXV0aG9yaXplZF91cGdyYWRlAQAEEGNvZGUkJFNjaGVkdWxlcgECKCBzY2hlZHVsZQEAEBB3aGVuBDhtYXliZV9wZXJpb2RpY4EDIHByaW9yaXR5BBBjYWxsiQ0YY2FuY2VsAQAIEHdoZW4EFGluZGV4BDhzY2hlZHVsZV9uYW1lZAEAFAhpZCAQd2hlbgQ4bWF5YmVfcGVyaW9kaWOBAyBwcmlvcml0eQQQY2FsbIkNMGNhbmNlbF9uYW1lZAEABAhpZCA4c2NoZWR1bGVfYWZ0ZXIBABAUYWZ0ZXIEOG1heWJlX3BlcmlvZGljgQMgcHJpb3JpdHkEEGNhbGyJDVBzY2hlZHVsZV9uYW1lZF9hZnRlcgEAFAhpZCAUYWZ0ZXIEOG1heWJlX3BlcmlvZGljgQMgcHJpb3JpdHkEEGNhbGyJDSRzZXRfcmV0cnkBAAwQdGFzaw0BHHJldHJpZXMEGHBlcmlvZAQ8c2V0X3JldHJ5X25hbWVkAQAMCGlkIBxyZXRyaWVzBBhwZXJpb2QEMGNhbmNlbF9yZXRyeQEABBB0YXNrDQFIY2FuY2VsX3JldHJ5X25hbWVkAQAECGlkICBQcmVpbWFnZQECFDRub3RlX3ByZWltYWdlAQAEFGJ5dGVzJDx1bm5vdGVfcHJlaW1hZ2UBAAQQaGFzaCBAcmVxdWVzdF9wcmVpbWFnZQEABBBoYXNoIEh1bnJlcXVlc3RfcHJlaW1hZ2UBAAQQaGFzaCA4ZW5zdXJlX3VwZGF0ZWQBAAQYaGFzaGVzOQMQQmFiZQECDExyZXBvcnRfZXF1aXZvY2F0aW9uAQAISGVxdWl2b2NhdGlvbl9wcm9vZrkDPGtleV9vd25lcl9wcm9vZr0DcHJlcG9ydF9lcXVpdm9jYXRpb25fdW5zaWduZWQBAAhIZXF1aXZvY2F0aW9uX3Byb29muQM8a2V5X293bmVyX3Byb29mvQNIcGxhbl9jb25maWdfY2hhbmdlAQAEGGNvbmZpZ8kDJFRpbWVzdGFtcAECBAxzZXQBAAQMbm93CBxJbmRpY2VzAQIUFGNsYWltAQAEFGluZGV4BCB0cmFuc2ZlcgEACAxuZXfVAxRpbmRleAQQZnJlZQEABBRpbmRleAQ4Zm9yY2VfdHJhbnNmZXIBAAwMbmV31QMUaW5kZXgEGGZyZWV6ZRQYZnJlZXplAQAEFGluZGV4BCBCYWxhbmNlcwECJFB0cmFuc2Zlcl9hbGxvd19kZWF0aAEACBBkZXN01QMUdmFsdWUIOGZvcmNlX3RyYW5zZmVyAQAMGHNvdXJjZdUDEGRlc3TVAxR2YWx1ZQhMdHJhbnNmZXJfa2VlcF9hbGl2ZQEACBBkZXN01QMUdmFsdWUIMHRyYW5zZmVyX2FsbAEACBBkZXN01QMoa2VlcF9hbGl2ZRQ8Zm9yY2VfdW5yZXNlcnZlAQAIDHdob9UDGGFtb3VudAhAdXBncmFkZV9hY2NvdW50cwEABAx3aG/dA0Rmb3JjZV9zZXRfYmFsYW5jZQEACAx3aG/VAyBuZXdfZnJlZQhsZm9yY2VfYWRqdXN0X3RvdGFsX2lzc3VhbmNlAQAIJGRpcmVjdGlvbuEDFGRlbHRhCBBidXJuAQAIFHZhbHVlCChrZWVwX2FsaXZlFBxTdGFraW5nAQJ4EGJvbmQBAAgUdmFsdWUIFHBheWVlNQEoYm9uZF9leHRyYQEABDhtYXhfYWRkaXRpb25hbAgYdW5ib25kAQAEFHZhbHVlCER3aXRoZHJhd191bmJvbmRlZAEABEhudW1fc2xhc2hpbmdfc3BhbnMEIHZhbGlkYXRlAQAEFHByZWZzOQEgbm9taW5hdGUBAAQcdGFyZ2V0c+kDFGNoaWxsAQEFJHNldF9wYXllZQEABBRwYXllZTUBOHNldF9jb250cm9sbGVyAQEFTHNldF92YWxpZGF0b3JfY291bnQBAAQMbmV3BGBpbmNyZWFzZV92YWxpZGF0b3JfY291bnQBAAQoYWRkaXRpb25hbARUc2NhbGVfdmFsaWRhdG9yX2NvdW50AQAEGGZhY3RvcgQ0Zm9yY2Vfbm9fZXJhcwEBBTRmb3JjZV9uZXdfZXJhAQEFRHNldF9pbnZ1bG5lcmFibGVzAQAENGludnVsbmVyYWJsZXPdAzRmb3JjZV91bnN0YWtlAQAIFHN0YXNoAEhudW1fc2xhc2hpbmdfc3BhbnMEUGZvcmNlX25ld19lcmFfYWx3YXlzAQEFVGNhbmNlbF9kZWZlcnJlZF9zbGFzaAEACAxlcmEENHNsYXNoX2luZGljZXM5AjhwYXlvdXRfc3Rha2VycwEACDx2YWxpZGF0b3Jfc3Rhc2gADGVyYQQYcmVib25kAQAEFHZhbHVlCChyZWFwX3N0YXNoAQAIFHN0YXNoAEhudW1fc2xhc2hpbmdfc3BhbnMEEGtpY2sBAAQMd2hv6QNMc2V0X3N0YWtpbmdfY29uZmlncwEAHEhtaW5fbm9taW5hdG9yX2JvbmTtA0htaW5fdmFsaWRhdG9yX2JvbmTtA0xtYXhfbm9taW5hdG9yX2NvdW508QNMbWF4X3ZhbGlkYXRvcl9jb3VudPEDPGNoaWxsX3RocmVzaG9sZPEDOG1pbl9jb21taXNzaW9u8QNIbWF4X3N0YWtlZF9yZXdhcmRz8QMsY2hpbGxfb3RoZXIBAAQUc3Rhc2gAaGZvcmNlX2FwcGx5X21pbl9jb21taXNzaW9uAQAEPHZhbGlkYXRvcl9zdGFzaABIc2V0X21pbl9jb21taXNzaW9uAQAEDG5ldwRYcGF5b3V0X3N0YWtlcnNfYnlfcGFnZQEADDx2YWxpZGF0b3Jfc3Rhc2gADGVyYQQQcGFnZQQwdXBkYXRlX3BheWVlAQAEKGNvbnRyb2xsZXIAaGRlcHJlY2F0ZV9jb250cm9sbGVyX2JhdGNoAQAELGNvbnRyb2xsZXJz3QM4cmVzdG9yZV9sZWRnZXIBABAUc3Rhc2gAQG1heWJlX2NvbnRyb2xsZXIFAixtYXliZV90b3RhbPUDPG1heWJlX3VubG9ja2luZwEEHFNlc3Npb24BAgggc2V0X2tleXMBAAgQa2V5cw0EFHByb29mJChwdXJnZV9rZXlzAQEFHEdyYW5kcGEBAgxMcmVwb3J0X2VxdWl2b2NhdGlvbgEACEhlcXVpdm9jYXRpb25fcHJvb2YlBDxrZXlfb3duZXJfcHJvb2a9A3ByZXBvcnRfZXF1aXZvY2F0aW9uX3Vuc2lnbmVkAQAISGVxdWl2b2NhdGlvbl9wcm9vZiUEPGtleV9vd25lcl9wcm9vZr0DMG5vdGVfc3RhbGxlZAEACBRkZWxheQRsYmVzdF9maW5hbGl6ZWRfYmxvY2tfbnVtYmVyBCBUcmVhc3VyeQECGCxzcGVuZF9sb2NhbAEACBhhbW91bnQILGJlbmVmaWNpYXJ51QM8cmVtb3ZlX2FwcHJvdmFsAQAELHByb3Bvc2FsX2lkBBRzcGVuZAEAEChhc3NldF9raW5kgQEYYW1vdW50CCxiZW5lZmljaWFyeZkBKHZhbGlkX2Zyb20tBBhwYXlvdXQBAAQUaW5kZXgEMGNoZWNrX3N0YXR1cwEABBRpbmRleAQodm9pZF9zcGVuZAEABBRpbmRleARAQ29udmljdGlvblZvdGluZwECGBB2b3RlAQAIKHBvbGxfaW5kZXgEEHZvdGU1BCBkZWxlZ2F0ZQEAEBRjbGFzcwQIdG/VAyhjb252aWN0aW9uOQQcYmFsYW5jZQgodW5kZWxlZ2F0ZQEABBRjbGFzcwQYdW5sb2NrAQAIFGNsYXNzBBh0YXJnZXTVAyxyZW1vdmVfdm90ZQEACBRjbGFzcy0EFGluZGV4BERyZW1vdmVfb3RoZXJfdm90ZQEADBh0YXJnZXTVAxRjbGFzcwQUaW5kZXgEJFJlZmVyZW5kYQECJBhzdWJtaXQBAAw8cHJvcG9zYWxfb3JpZ2lulQMgcHJvcG9zYWylAUBlbmFjdG1lbnRfbW9tZW50QQRYcGxhY2VfZGVjaXNpb25fZGVwb3NpdAEABBRpbmRleARccmVmdW5kX2RlY2lzaW9uX2RlcG9zaXQBAAQUaW5kZXgEGGNhbmNlbAEABBRpbmRleAQQa2lsbAEABBRpbmRleARAbnVkZ2VfcmVmZXJlbmR1bQEABBRpbmRleARIb25lX2Zld2VyX2RlY2lkaW5nAQAEFHRyYWNrBGRyZWZ1bmRfc3VibWlzc2lvbl9kZXBvc2l0AQAEFGluZGV4BDBzZXRfbWV0YWRhdGEBAAgUaW5kZXgEKG1heWJlX2hhc2gRASRXaGl0ZWxpc3QBAhA4d2hpdGVsaXN0X2NhbGwBAAQkY2FsbF9oYXNoIFxyZW1vdmVfd2hpdGVsaXN0ZWRfY2FsbAEABCRjYWxsX2hhc2ggZGRpc3BhdGNoX3doaXRlbGlzdGVkX2NhbGwBAAwkY2FsbF9oYXNoIEBjYWxsX2VuY29kZWRfbGVuBExjYWxsX3dlaWdodF93aXRuZXNzGJxkaXNwYXRjaF93aGl0ZWxpc3RlZF9jYWxsX3dpdGhfcHJlaW1hZ2UBAAQQY2FsbIkNKFBhcmFtZXRlcnMBAgQ0c2V0X3BhcmFtZXRlcgEABCRrZXlfdmFsdWVVBBhDbGFpbXMBAhQUY2xhaW0BAAgQZGVzdABIZXRoZXJldW1fc2lnbmF0dXJlXQQobWludF9jbGFpbQEAEAx3aG9lARR2YWx1ZQhAdmVzdGluZ19zY2hlZHVsZWUEJHN0YXRlbWVudG0EMGNsYWltX2F0dGVzdAEADBBkZXN0AEhldGhlcmV1bV9zaWduYXR1cmVdBCRzdGF0ZW1lbnQkGGF0dGVzdAEABCRzdGF0ZW1lbnQkKG1vdmVfY2xhaW0BAAwMb2xkZQEMbmV3ZQE4bWF5YmVfcHJlY2xhaW0FAhxWZXN0aW5nAQIYEHZlc3QBAQUodmVzdF9vdGhlcgEABBh0YXJnZXTVAzx2ZXN0ZWRfdHJhbnNmZXIBAAgYdGFyZ2V01QMgc2NoZWR1bGV1BFRmb3JjZV92ZXN0ZWRfdHJhbnNmZXIBAAwYc291cmNl1QMYdGFyZ2V01QMgc2NoZWR1bGV1BDxtZXJnZV9zY2hlZHVsZXMBAAg8c2NoZWR1bGUxX2luZGV4BDxzY2hlZHVsZTJfaW5kZXgEdGZvcmNlX3JlbW92ZV92ZXN0aW5nX3NjaGVkdWxlAQAIGHRhcmdldNUDOHNjaGVkdWxlX2luZGV4BBxVdGlsaXR5AQIYFGJhdGNoAQAEFGNhbGxzcQ00YXNfZGVyaXZhdGl2ZQEACBRpbmRleAQQY2FsbIkNJGJhdGNoX2FsbAEABBRjYWxsc3ENLGRpc3BhdGNoX2FzAQAIJGFzX29yaWdpbpUDEGNhbGyJDSxmb3JjZV9iYXRjaAEABBRjYWxsc3ENLHdpdGhfd2VpZ2h0AQAIEGNhbGyJDRh3ZWlnaHQYFFByb3h5AQIoFHByb3h5AQAMEHJlYWzVA0Bmb3JjZV9wcm94eV90eXBlhQQQY2FsbIkNJGFkZF9wcm94eQEADCBkZWxlZ2F0ZdUDKHByb3h5X3R5cGXpARRkZWxheQQwcmVtb3ZlX3Byb3h5AQAMIGRlbGVnYXRl1QMocHJveHlfdHlwZekBFGRlbGF5BDhyZW1vdmVfcHJveGllcwEBBSxjcmVhdGVfcHVyZQEADChwcm94eV90eXBl6QEUZGVsYXkEFGluZGV4BCRraWxsX3B1cmUBABQcc3Bhd25lctUDKHByb3h5X3R5cGXpARRpbmRleAQYaGVpZ2h0BCRleHRfaW5kZXgEIGFubm91bmNlAQAIEHJlYWzVAyRjYWxsX2hhc2ggTHJlbW92ZV9hbm5vdW5jZW1lbnQBAAgQcmVhbNUDJGNhbGxfaGFzaCBMcmVqZWN0X2Fubm91bmNlbWVudAEACCBkZWxlZ2F0ZdUDJGNhbGxfaGFzaCA8cHJveHlfYW5ub3VuY2VkAQAQIGRlbGVnYXRl1QMQcmVhbNUDQGZvcmNlX3Byb3h5X3R5cGWFBBBjYWxsiQ0gTXVsdGlzaWcBAhBQYXNfbXVsdGlfdGhyZXNob2xkXzEBAAhEb3RoZXJfc2lnbmF0b3JpZXPdAxBjYWxsiQ0gYXNfbXVsdGkBABQkdGhyZXNob2xkBERvdGhlcl9zaWduYXRvcmllc90DPG1heWJlX3RpbWVwb2ludI0EEGNhbGyJDShtYXhfd2VpZ2h0GEBhcHByb3ZlX2FzX211bHRpAQAUJHRocmVzaG9sZAREb3RoZXJfc2lnbmF0b3JpZXPdAzxtYXliZV90aW1lcG9pbnSNBCRjYWxsX2hhc2ggKG1heF93ZWlnaHQYPGNhbmNlbF9hc19tdWx0aQEAECR0aHJlc2hvbGQERG90aGVyX3NpZ25hdG9yaWVz3QMkdGltZXBvaW508QEkY2FsbF9oYXNoICBCb3VudGllcwECJDhwcm9wb3NlX2JvdW50eQEACBR2YWx1ZQgsZGVzY3JpcHRpb24kOGFwcHJvdmVfYm91bnR5AQAEJGJvdW50eV9pZAQ8cHJvcG9zZV9jdXJhdG9yAQAMJGJvdW50eV9pZAQcY3VyYXRvctUDDGZlZQhAdW5hc3NpZ25fY3VyYXRvcgEABCRib3VudHlfaWQEOGFjY2VwdF9jdXJhdG9yAQAEJGJvdW50eV9pZAQwYXdhcmRfYm91bnR5AQAIJGJvdW50eV9pZAQsYmVuZWZpY2lhcnnVAzBjbGFpbV9ib3VudHkBAAQkYm91bnR5X2lkBDBjbG9zZV9ib3VudHkBAAQkYm91bnR5X2lkBFBleHRlbmRfYm91bnR5X2V4cGlyeQEACCRib3VudHlfaWQEGHJlbWFyayQ0Q2hpbGRCb3VudGllcwECHEBhZGRfY2hpbGRfYm91bnR5AQAMQHBhcmVudF9ib3VudHlfaWQEFHZhbHVlCCxkZXNjcmlwdGlvbiQ8cHJvcG9zZV9jdXJhdG9yAQAQQHBhcmVudF9ib3VudHlfaWQEPGNoaWxkX2JvdW50eV9pZAQcY3VyYXRvctUDDGZlZQg4YWNjZXB0X2N1cmF0b3IBAAhAcGFyZW50X2JvdW50eV9pZAQ8Y2hpbGRfYm91bnR5X2lkBEB1bmFzc2lnbl9jdXJhdG9yAQAIQHBhcmVudF9ib3VudHlfaWQEPGNoaWxkX2JvdW50eV9pZARIYXdhcmRfY2hpbGRfYm91bnR5AQAMQHBhcmVudF9ib3VudHlfaWQEPGNoaWxkX2JvdW50eV9pZAQsYmVuZWZpY2lhcnnVA0hjbGFpbV9jaGlsZF9ib3VudHkBAAhAcGFyZW50X2JvdW50eV9pZAQ8Y2hpbGRfYm91bnR5X2lkBEhjbG9zZV9jaGlsZF9ib3VudHkBAAhAcGFyZW50X2JvdW50eV9pZAQ8Y2hpbGRfYm91bnR5X2lkBGhFbGVjdGlvblByb3ZpZGVyTXVsdGlQaGFzZQECFDxzdWJtaXRfdW5zaWduZWQBAAgwcmF3X3NvbHV0aW9uWQUcd2l0bmVzc10FbHNldF9taW5pbXVtX3VudHJ1c3RlZF9zY29yZQEABEBtYXliZV9uZXh0X3Njb3JlYQV0c2V0X2VtZXJnZW5jeV9lbGVjdGlvbl9yZXN1bHQBAAQgc3VwcG9ydHN1BRhzdWJtaXQBAAQwcmF3X3NvbHV0aW9uWQVMZ292ZXJuYW5jZV9mYWxsYmFjawEACEBtYXliZV9tYXhfdm90ZXJzLQREbWF5YmVfbWF4X3RhcmdldHMtBCRWb3Rlckxpc3QBAgwUcmViYWcBAAQoZGlzbG9jYXRlZNUDPHB1dF9pbl9mcm9udF9vZgEABBxsaWdodGVy1QNUcHV0X2luX2Zyb250X29mX290aGVyAQAIHGhlYXZpZXLVAxxsaWdodGVy1QM8Tm9taW5hdGlvblBvb2xzAQJoEGpvaW4BAAgYYW1vdW50CBxwb29sX2lkBChib25kX2V4dHJhAQAEFGV4dHJhgQUwY2xhaW1fcGF5b3V0AQEFGHVuYm9uZAEACDhtZW1iZXJfYWNjb3VudNUDQHVuYm9uZGluZ19wb2ludHMIWHBvb2xfd2l0aGRyYXdfdW5ib25kZWQBAAgccG9vbF9pZARIbnVtX3NsYXNoaW5nX3NwYW5zBER3aXRoZHJhd191bmJvbmRlZAEACDhtZW1iZXJfYWNjb3VudNUDSG51bV9zbGFzaGluZ19zcGFucwQYY3JlYXRlAQAQGGFtb3VudAgQcm9vdNUDJG5vbWluYXRvctUDHGJvdW5jZXLVA0xjcmVhdGVfd2l0aF9wb29sX2lkAQAUGGFtb3VudAgQcm9vdNUDJG5vbWluYXRvctUDHGJvdW5jZXLVAxxwb29sX2lkBCBub21pbmF0ZQEACBxwb29sX2lkBCh2YWxpZGF0b3Jz3QMkc2V0X3N0YXRlAQAIHHBvb2xfaWQEFHN0YXRlHQIwc2V0X21ldGFkYXRhAQAIHHBvb2xfaWQEIG1ldGFkYXRhJCxzZXRfY29uZmlncwEAGDRtaW5fam9pbl9ib25k7QM8bWluX2NyZWF0ZV9ib25k7QMkbWF4X3Bvb2xz8QMsbWF4X21lbWJlcnPxA1BtYXhfbWVtYmVyc19wZXJfcG9vbPEDVGdsb2JhbF9tYXhfY29tbWlzc2lvbvEDMHVwZGF0ZV9yb2xlcwEAEBxwb29sX2lkBCBuZXdfcm9vdIUFNG5ld19ub21pbmF0b3KFBSxuZXdfYm91bmNlcoUFFGNoaWxsAQAEHHBvb2xfaWQEQGJvbmRfZXh0cmFfb3RoZXIBAAgYbWVtYmVy1QMUZXh0cmGBBVBzZXRfY2xhaW1fcGVybWlzc2lvbgEABChwZXJtaXNzaW9uiQVIY2xhaW1fcGF5b3V0X290aGVyAQAEFG90aGVyADhzZXRfY29tbWlzc2lvbgEACBxwb29sX2lkBDhuZXdfY29tbWlzc2lvbiUCSHNldF9jb21taXNzaW9uX21heAEACBxwb29sX2lkBDhtYXhfY29tbWlzc2lvbgRoc2V0X2NvbW1pc3Npb25fY2hhbmdlX3JhdGUBAAgccG9vbF9pZAQsY2hhbmdlX3JhdGUpAkBjbGFpbV9jb21taXNzaW9uAQAEHHBvb2xfaWQETGFkanVzdF9wb29sX2RlcG9zaXQBAAQccG9vbF9pZAR8c2V0X2NvbW1pc3Npb25fY2xhaW1fcGVybWlzc2lvbgEACBxwb29sX2lkBChwZXJtaXNzaW9uMQIsYXBwbHlfc2xhc2gBAAQ4bWVtYmVyX2FjY291bnTVA0htaWdyYXRlX2RlbGVnYXRpb24BAAQ4bWVtYmVyX2FjY291bnTVA3htaWdyYXRlX3Bvb2xfdG9fZGVsZWdhdGVfc3Rha2UBAAQccG9vbF9pZAQsRmFzdFVuc3Rha2UBAgxUcmVnaXN0ZXJfZmFzdF91bnN0YWtlAQEFKGRlcmVnaXN0ZXIBAQUcY29udHJvbAEABDRlcmFzX3RvX2NoZWNrBDRDb25maWd1cmF0aW9uAQLAfHNldF92YWxpZGF0aW9uX3VwZ3JhZGVfY29vbGRvd24BAAQMbmV3BHBzZXRfdmFsaWRhdGlvbl91cGdyYWRlX2RlbGF5AQAEDG5ldwRkc2V0X2NvZGVfcmV0ZW50aW9uX3BlcmlvZAEABAxuZXcERHNldF9tYXhfY29kZV9zaXplAQAEDG5ldwRAc2V0X21heF9wb3Zfc2l6ZQEABAxuZXcEWHNldF9tYXhfaGVhZF9kYXRhX3NpemUBAAQMbmV3BEhzZXRfY29yZXRpbWVfY29yZXMBAAQMbmV3BHRzZXRfbWF4X2F2YWlsYWJpbGl0eV90aW1lb3V0cwEABAxuZXcEcHNldF9ncm91cF9yb3RhdGlvbl9mcmVxdWVuY3kBAAQMbmV3BHRzZXRfcGFyYXNfYXZhaWxhYmlsaXR5X3BlcmlvZAEABAxuZXcEYHNldF9zY2hlZHVsaW5nX2xvb2thaGVhZAEABAxuZXcEbHNldF9tYXhfdmFsaWRhdG9yc19wZXJfY29yZQEABAxuZXctBEhzZXRfbWF4X3ZhbGlkYXRvcnMBAAQMbmV3LQRIc2V0X2Rpc3B1dGVfcGVyaW9kAQAEDG5ldwS0c2V0X2Rpc3B1dGVfcG9zdF9jb25jbHVzaW9uX2FjY2VwdGFuY2VfcGVyaW9kAQAEDG5ldwREc2V0X25vX3Nob3dfc2xvdHMBAAQMbmV3BFBzZXRfbl9kZWxheV90cmFuY2hlcwEABAxuZXcEeHNldF96ZXJvdGhfZGVsYXlfdHJhbmNoZV93aWR0aAEABAxuZXcEUHNldF9uZWVkZWRfYXBwcm92YWxzAQAEDG5ldwRwc2V0X3JlbGF5X3ZyZl9tb2R1bG9fc2FtcGxlcwEABAxuZXcEaHNldF9tYXhfdXB3YXJkX3F1ZXVlX2NvdW50AQAEDG5ldwRkc2V0X21heF91cHdhcmRfcXVldWVfc2l6ZQEABAxuZXcEdHNldF9tYXhfZG93bndhcmRfbWVzc2FnZV9zaXplAQAEDG5ldwRsc2V0X21heF91cHdhcmRfbWVzc2FnZV9zaXplAQAEDG5ldwSgc2V0X21heF91cHdhcmRfbWVzc2FnZV9udW1fcGVyX2NhbmRpZGF0ZQEABAxuZXcEZHNldF9ocm1wX29wZW5fcmVxdWVzdF90dGwBAAQMbmV3BFxzZXRfaHJtcF9zZW5kZXJfZGVwb3NpdAEABAxuZXcIaHNldF9ocm1wX3JlY2lwaWVudF9kZXBvc2l0AQAEDG5ldwh0c2V0X2hybXBfY2hhbm5lbF9tYXhfY2FwYWNpdHkBAAQMbmV3BHxzZXRfaHJtcF9jaGFubmVsX21heF90b3RhbF9zaXplAQAEDG5ldwScc2V0X2hybXBfbWF4X3BhcmFjaGFpbl9pbmJvdW5kX2NoYW5uZWxzAQAEDG5ldwSEc2V0X2hybXBfY2hhbm5lbF9tYXhfbWVzc2FnZV9zaXplAQAEDG5ldwSgc2V0X2hybXBfbWF4X3BhcmFjaGFpbl9vdXRib3VuZF9jaGFubmVscwEABAxuZXcEmHNldF9ocm1wX21heF9tZXNzYWdlX251bV9wZXJfY2FuZGlkYXRlAQAEDG5ldwRIc2V0X3B2Zl92b3RpbmdfdHRsAQAEDG5ldwSQc2V0X21pbmltdW1fdmFsaWRhdGlvbl91cGdyYWRlX2RlbGF5AQAEDG5ldwRwc2V0X2J5cGFzc19jb25zaXN0ZW5jeV9jaGVjawEABAxuZXcUYHNldF9hc3luY19iYWNraW5nX3BhcmFtcwEABAxuZXeVBUxzZXRfZXhlY3V0b3JfcGFyYW1zAQAEDG5ld6UFWHNldF9vbl9kZW1hbmRfYmFzZV9mZWUBAAQMbmV3CHRzZXRfb25fZGVtYW5kX2ZlZV92YXJpYWJpbGl0eQEABAxuZXcEcHNldF9vbl9kZW1hbmRfcXVldWVfbWF4X3NpemUBAAQMbmV3BJhzZXRfb25fZGVtYW5kX3RhcmdldF9xdWV1ZV91dGlsaXphdGlvbgEABAxuZXcERHNldF9vbl9kZW1hbmRfdHRsAQAEDG5ldwRkc2V0X21pbmltdW1fYmFja2luZ192b3RlcwEABAxuZXcEQHNldF9ub2RlX2ZlYXR1cmUBAAgUaW5kZXgEFHZhbHVlFGhzZXRfYXBwcm92YWxfdm90aW5nX3BhcmFtcwEABAxuZXcEUHNldF9zY2hlZHVsZXJfcGFyYW1zAQAEDG5ld6kFLFBhcmFzU2hhcmVkAQEFNFBhcmFJbmNsdXNpb24BAQUwUGFyYUluaGVyZW50AQIEFGVudGVyAQAEEGRhdGH9BRRQYXJhcwECJFhmb3JjZV9zZXRfY3VycmVudF9jb2RlAQAIEHBhcmEEIG5ld19jb2RlJFhmb3JjZV9zZXRfY3VycmVudF9oZWFkAQAIEHBhcmEEIG5ld19oZWFkJGxmb3JjZV9zY2hlZHVsZV9jb2RlX3VwZ3JhZGUBAAwQcGFyYQQgbmV3X2NvZGUkTHJlbGF5X3BhcmVudF9udW1iZXIETGZvcmNlX25vdGVfbmV3X2hlYWQBAAgQcGFyYQQgbmV3X2hlYWQkSGZvcmNlX3F1ZXVlX2FjdGlvbgEABBBwYXJhBGxhZGRfdHJ1c3RlZF92YWxpZGF0aW9uX2NvZGUBAAQ8dmFsaWRhdGlvbl9jb2RlJGxwb2tlX3VudXNlZF92YWxpZGF0aW9uX2NvZGUBAARQdmFsaWRhdGlvbl9jb2RlX2hhc2ggbGluY2x1ZGVfcHZmX2NoZWNrX3N0YXRlbWVudAEACBBzdG10BQYkc2lnbmF0dXJlQQJ0Zm9yY2Vfc2V0X21vc3RfcmVjZW50X2NvbnRleHQBAAgQcGFyYQQcY29udGV4dAQsSW5pdGlhbGl6ZXIBAgQ0Zm9yY2VfYXBwcm92ZQEABBR1cF90bwQQSHJtcAECLFhocm1wX2luaXRfb3Blbl9jaGFubmVsAQAMJHJlY2lwaWVudARUcHJvcG9zZWRfbWF4X2NhcGFjaXR5BGRwcm9wb3NlZF9tYXhfbWVzc2FnZV9zaXplBGBocm1wX2FjY2VwdF9vcGVuX2NoYW5uZWwBAAQYc2VuZGVyBEhocm1wX2Nsb3NlX2NoYW5uZWwBAAQoY2hhbm5lbF9pZFUCQGZvcmNlX2NsZWFuX2hybXABAAwQcGFyYQQsbnVtX2luYm91bmQEMG51bV9vdXRib3VuZARcZm9yY2VfcHJvY2Vzc19ocm1wX29wZW4BAAQgY2hhbm5lbHMEYGZvcmNlX3Byb2Nlc3NfaHJtcF9jbG9zZQEABCBjaGFubmVscwRgaHJtcF9jYW5jZWxfb3Blbl9yZXF1ZXN0AQAIKGNoYW5uZWxfaWRVAjRvcGVuX3JlcXVlc3RzBFxmb3JjZV9vcGVuX2hybXBfY2hhbm5lbAEAEBhzZW5kZXIEJHJlY2lwaWVudAQwbWF4X2NhcGFjaXR5BEBtYXhfbWVzc2FnZV9zaXplBGBlc3RhYmxpc2hfc3lzdGVtX2NoYW5uZWwBAAgYc2VuZGVyBCRyZWNpcGllbnQEVHBva2VfY2hhbm5lbF9kZXBvc2l0cwEACBhzZW5kZXIEJHJlY2lwaWVudAR0ZXN0YWJsaXNoX2NoYW5uZWxfd2l0aF9zeXN0ZW0BAARMdGFyZ2V0X3N5c3RlbV9jaGFpbgQ0UGFyYXNEaXNwdXRlcwECBDhmb3JjZV91bmZyZWV6ZQEBBTRQYXJhc1NsYXNoaW5nAQIEcHJlcG9ydF9kaXNwdXRlX2xvc3RfdW5zaWduZWQBAAg0ZGlzcHV0ZV9wcm9vZiEGPGtleV9vd25lcl9wcm9vZr0DIE9uRGVtYW5kAQIIXHBsYWNlX29yZGVyX2FsbG93X2RlYXRoAQAIKG1heF9hbW91bnQIHHBhcmFfaWQEWHBsYWNlX29yZGVyX2tlZXBfYWxpdmUBAAgobWF4X2Ftb3VudAgccGFyYV9pZAQkUmVnaXN0cmFyAQIkIHJlZ2lzdGVyAQAMCGlkBDBnZW5lc2lzX2hlYWQkPHZhbGlkYXRpb25fY29kZSQ4Zm9yY2VfcmVnaXN0ZXIBABQMd2hvABxkZXBvc2l0CAhpZAQwZ2VuZXNpc19oZWFkJDx2YWxpZGF0aW9uX2NvZGUkKGRlcmVnaXN0ZXIBAAQIaWQEEHN3YXABAAgIaWQEFG90aGVyBCxyZW1vdmVfbG9jawEABBBwYXJhBBxyZXNlcnZlAQEFIGFkZF9sb2NrAQAEEHBhcmEEVHNjaGVkdWxlX2NvZGVfdXBncmFkZQEACBBwYXJhBCBuZXdfY29kZSRAc2V0X2N1cnJlbnRfaGVhZAEACBBwYXJhBCBuZXdfaGVhZCQUU2xvdHMBAgwsZm9yY2VfbGVhc2UBABQQcGFyYQQYbGVhc2VyABhhbW91bnQIMHBlcmlvZF9iZWdpbgQwcGVyaW9kX2NvdW50BEBjbGVhcl9hbGxfbGVhc2VzAQAEEHBhcmEEPHRyaWdnZXJfb25ib2FyZAEABBBwYXJhBCBBdWN0aW9ucwECDCxuZXdfYXVjdGlvbgEACCBkdXJhdGlvbgRIbGVhc2VfcGVyaW9kX2luZGV4BAxiaWQBABQQcGFyYQQ0YXVjdGlvbl9pbmRleAQoZmlyc3Rfc2xvdAQkbGFzdF9zbG90BBhhbW91bnQIOGNhbmNlbF9hdWN0aW9uAQEFJENyb3dkbG9hbgECJBhjcmVhdGUBABgUaW5kZXgEDGNhcAgwZmlyc3RfcGVyaW9kBCxsYXN0X3BlcmlvZAQMZW5kBCB2ZXJpZmllcj0GKGNvbnRyaWJ1dGUBAAwUaW5kZXgEFHZhbHVlCCRzaWduYXR1cmVFBiB3aXRoZHJhdwEACAx3aG8AFGluZGV4BBhyZWZ1bmQBAAQUaW5kZXgEIGRpc3NvbHZlAQAEFGluZGV4BBBlZGl0AQAYFGluZGV4BAxjYXAIMGZpcnN0X3BlcmlvZAQsbGFzdF9wZXJpb2QEDGVuZAQgdmVyaWZpZXI9BiBhZGRfbWVtbwEACBRpbmRleAQQbWVtbyQQcG9rZQEABBRpbmRleAQ4Y29udHJpYnV0ZV9hbGwBAAgUaW5kZXgEJHNpZ25hdHVyZUUGIENvcmV0aW1lAQIMSHJlcXVlc3RfY29yZV9jb3VudAEABBRjb3VudARIcmVxdWVzdF9yZXZlbnVlX2F0AQAEEHdoZW4ELGFzc2lnbl9jb3JlAQAQEGNvcmUEFGJlZ2luBChhc3NpZ25tZW50VQYgZW5kX2hpbnQtBEhTdGF0ZVRyaWVNaWdyYXRpb24BAhhYY29udHJvbF9hdXRvX21pZ3JhdGlvbgEABDBtYXliZV9jb25maWdhBkBjb250aW51ZV9taWdyYXRlAQAMGGxpbWl0c10GPHJlYWxfc2l6ZV91cHBlcgQwd2l0bmVzc190YXNraQZIbWlncmF0ZV9jdXN0b21fdG9wAQAIEGtleXN9AzB3aXRuZXNzX3NpemUEUG1pZ3JhdGVfY3VzdG9tX2NoaWxkAQAMEHJvb3QkKGNoaWxkX2tleXN9Ayh0b3RhbF9zaXplBFRzZXRfc2lnbmVkX21heF9saW1pdHMBAAQYbGltaXRzXQZIZm9yY2Vfc2V0X3Byb2dyZXNzAQAIMHByb2dyZXNzX3RvcGUGOHByb2dyZXNzX2NoaWxkZQYkWGNtUGFsbGV0AQI4EHNlbmQBAAgQZGVzdJkBHG1lc3NhZ2WpBjx0ZWxlcG9ydF9hc3NldHMBABAQZGVzdJkBLGJlbmVmaWNpYXJ5mQEYYXNzZXRzGQM4ZmVlX2Fzc2V0X2l0ZW0EXHJlc2VydmVfdHJhbnNmZXJfYXNzZXRzAQAQEGRlc3SZASxiZW5lZmljaWFyeZkBGGFzc2V0cxkDOGZlZV9hc3NldF9pdGVtBBxleGVjdXRlAQAIHG1lc3NhZ2WpBihtYXhfd2VpZ2h0GERmb3JjZV94Y21fdmVyc2lvbgEACCBsb2NhdGlvbnkBHHZlcnNpb24EZGZvcmNlX2RlZmF1bHRfeGNtX3ZlcnNpb24BAAREbWF5YmVfeGNtX3ZlcnNpb24tBHhmb3JjZV9zdWJzY3JpYmVfdmVyc2lvbl9ub3RpZnkBAAQgbG9jYXRpb26ZAYBmb3JjZV91bnN1YnNjcmliZV92ZXJzaW9uX25vdGlmeQEABCBsb2NhdGlvbpkBfGxpbWl0ZWRfcmVzZXJ2ZV90cmFuc2Zlcl9hc3NldHMBABQQZGVzdJkBLGJlbmVmaWNpYXJ5mQEYYXNzZXRzGQM4ZmVlX2Fzc2V0X2l0ZW0EMHdlaWdodF9saW1pdPECXGxpbWl0ZWRfdGVsZXBvcnRfYXNzZXRzAQAUEGRlc3SZASxiZW5lZmljaWFyeZkBGGFzc2V0cxkDOGZlZV9hc3NldF9pdGVtBDB3ZWlnaHRfbGltaXTxAkBmb3JjZV9zdXNwZW5zaW9uAQAEJHN1c3BlbmRlZBQ8dHJhbnNmZXJfYXNzZXRzAQAUEGRlc3SZASxiZW5lZmljaWFyeZkBGGFzc2V0cxkDOGZlZV9hc3NldF9pdGVtBDB3ZWlnaHRfbGltaXTxAjBjbGFpbV9hc3NldHMBAAgYYXNzZXRzGQMsYmVuZWZpY2lhcnmZAYx0cmFuc2Zlcl9hc3NldHNfdXNpbmdfdHlwZV9hbmRfdGhlbgEAHBBkZXN0mQEYYXNzZXRzGQNQYXNzZXRzX3RyYW5zZmVyX3R5cGWtBjhyZW1vdGVfZmVlc19pZLEGSGZlZXNfdHJhbnNmZXJfdHlwZa0GSGN1c3RvbV94Y21fb25fZGVzdKkGMHdlaWdodF9saW1pdPECME1lc3NhZ2VRdWV1ZQECCCRyZWFwX3BhZ2UBAAg4bWVzc2FnZV9vcmlnaW4lAyhwYWdlX2luZGV4BEhleGVjdXRlX292ZXJ3ZWlnaHQBABA4bWVzc2FnZV9vcmlnaW4lAxBwYWdlBBRpbmRleAQwd2VpZ2h0X2xpbWl0GCRBc3NldFJhdGUBAgwYY3JlYXRlAQAIKGFzc2V0X2tpbmSBARByYXRlCBh1cGRhdGUBAAgoYXNzZXRfa2luZIEBEHJhdGUIGHJlbW92ZQEABChhc3NldF9raW5kgQEUQmVlZnkBAgxMcmVwb3J0X2VxdWl2b2NhdGlvbgEACEhlcXVpdm9jYXRpb25fcHJvb2bVBjxrZXlfb3duZXJfcHJvb2a9A3ByZXBvcnRfZXF1aXZvY2F0aW9uX3Vuc2lnbmVkAQAISGVxdWl2b2NhdGlvbl9wcm9vZtUGPGtleV9vd25lcl9wcm9vZr0DPHNldF9uZXdfZ2VuZXNpcwEABDxkZWxheV9pbl9ibG9ja3MEPFBhcmFTdWRvV3JhcHBlcgECGHRzdWRvX3NjaGVkdWxlX3BhcmFfaW5pdGlhbGl6ZQEACAhpZAQcZ2VuZXNpcxUJaHN1ZG9fc2NoZWR1bGVfcGFyYV9jbGVhbnVwAQAECGlkBIBzdWRvX3NjaGVkdWxlX3BhcmF0aHJlYWRfdXBncmFkZQEABAhpZASEc3Vkb19zY2hlZHVsZV9wYXJhY2hhaW5fZG93bmdyYWRlAQAECGlkBFxzdWRvX3F1ZXVlX2Rvd253YXJkX3hjbQEACAhpZAQMeGNtqQZsc3Vkb19lc3RhYmxpc2hfaHJtcF9jaGFubmVsAQAQGHNlbmRlcgQkcmVjaXBpZW50BDBtYXhfY2FwYWNpdHkEQG1heF9tZXNzYWdlX3NpemUEEFN1ZG8BAhQQc3VkbwEABBBjYWxsiQ1Uc3Vkb191bmNoZWNrZWRfd2VpZ2h0AQAIEGNhbGyJDRh3ZWlnaHQYHHNldF9rZXkBAAQMbmV31QMcc3Vkb19hcwEACAx3aG/VAxBjYWxsiQ0ocmVtb3ZlX2tleQEBBQcxDRUKBF0NAAAQQGV4ZWN1dGlvbl9yZXN1bHQ9DThlbWl0dGVkX2V2ZW50c5ENJGxvY2FsX3hjbSULOGZvcndhcmRlZF94Y21zMQsHlQ05CwAMQGV4ZWN1dGlvbl9yZXN1bHSNAjhlbWl0dGVkX2V2ZW50c5ENOGZvcndhcmRlZF94Y21zMQsHnQ05CwKINE5vdENvbnRyb2xsZXIBAQUgTm90U3Rhc2gBAQU0QWxyZWFkeUJvbmRlZAEBBTRBbHJlYWR5UGFpcmVkAQEFMEVtcHR5VGFyZ2V0cwEBBThEdXBsaWNhdGVJbmRleAEBBURJbnZhbGlkU2xhc2hJbmRleAEBBUBJbnN1ZmZpY2llbnRCb25kAQEFME5vTW9yZUNodW5rcwEBBTROb1VubG9ja0NodW5rAQEFMEZ1bmRlZFRhcmdldAEBBUhJbnZhbGlkRXJhVG9SZXdhcmQBAQVoSW52YWxpZE51bWJlck9mTm9taW5hdGlvbnMBAQVITm90U29ydGVkQW5kVW5pcXVlAQEFOEFscmVhZHlDbGFpbWVkAQEFLEludmFsaWRQYWdlAQEFVEluY29ycmVjdEhpc3RvcnlEZXB0aAEBBVhJbmNvcnJlY3RTbGFzaGluZ1NwYW5zAQEFIEJhZFN0YXRlAQEFOFRvb01hbnlUYXJnZXRzAQEFJEJhZFRhcmdldAEBBUBDYW5ub3RDaGlsbE90aGVyAQEFRFRvb01hbnlOb21pbmF0b3JzAQEFRFRvb01hbnlWYWxpZGF0b3JzAQEFQENvbW1pc3Npb25Ub29Mb3cBAQUsQm91bmROb3RNZXQBAQVQQ29udHJvbGxlckRlcHJlY2F0ZWQBAQVMQ2Fubm90UmVzdG9yZUxlZGdlcgEBBWxSZXdhcmREZXN0aW5hdGlvblJlc3RyaWN0ZWQBAQU4Tm90RW5vdWdoRnVuZHMBAQVcVmlydHVhbFN0YWtlck5vdEFsbG93ZWQBAQU8Q2Fubm90UmVhcFN0YXNoAQEFPEFscmVhZHlNaWdyYXRlZAEBBShSZXN0cmljdGVkAQEFAnhIVG9vTWFueVN1YkFjY291bnRzAQEFIE5vdEZvdW5kAQEFIE5vdE5hbWVkAQEFKEVtcHR5SW5kZXgBAQUoRmVlQ2hhbmdlZAEBBShOb0lkZW50aXR5AQEFPFN0aWNreUp1ZGdlbWVudAEBBThKdWRnZW1lbnRHaXZlbgEBBUBJbnZhbGlkSnVkZ2VtZW50AQEFMEludmFsaWRJbmRleAEBBTRJbnZhbGlkVGFyZ2V0AQEFRFRvb01hbnlSZWdpc3RyYXJzAQEFOEFscmVhZHlDbGFpbWVkAQEFGE5vdFN1YgEBBSBOb3RPd25lZAEBBXRKdWRnZW1lbnRGb3JEaWZmZXJlbnRJZGVudGl0eQEBBVhKdWRnZW1lbnRQYXltZW50RmFpbGVkAQEFNEludmFsaWRTdWZmaXgBAQVQTm90VXNlcm5hbWVBdXRob3JpdHkBAQUwTm9BbGxvY2F0aW9uAQEFQEludmFsaWRTaWduYXR1cmUBAQVEUmVxdWlyZXNTaWduYXR1cmUBAQU8SW52YWxpZFVzZXJuYW1lAQEFNFVzZXJuYW1lVGFrZW4BAQUoTm9Vc2VybmFtZQEBBShOb3RFeHBpcmVkAQEFIFRvb0Vhcmx5AQEFME5vdFVuYmluZGluZwEBBUBBbHJlYWR5VW5iaW5kaW5nAQEFWEluc3VmZmljaWVudFByaXZpbGVnZXMBAQUCIBhUb29CaWcBAQUwQWxyZWFkeU5vdGVkAQEFNE5vdEF1dGhvcml6ZWQBAQUgTm90Tm90ZWQBAQUkUmVxdWVzdGVkAQEFME5vdFJlcXVlc3RlZAEBBRxUb29NYW55AQEFGFRvb0ZldwEBBQIUJER1cGxpY2F0ZQEBBShOb3RIZWF2aWVyAQEFME5vdEluU2FtZUJhZwEBBTBOb2RlTm90Rm91bmQBAQUYTG9ja2VkAQEFAggQTGlzdAECFCREdXBsaWNhdGUBAQUoTm90SGVhdmllcgEBBTBOb3RJblNhbWVCYWcBAQUwTm9kZU5vdEZvdW5kAQEFGExvY2tlZAEBBRhMb2NrZWQBAQUCmDBQb29sTm90Rm91bmQBAQVIUG9vbE1lbWJlck5vdEZvdW5kAQEFSFJld2FyZFBvb2xOb3RGb3VuZAEBBUBTdWJQb29sc05vdEZvdW5kAQEFZEFjY291bnRCZWxvbmdzVG9PdGhlclBvb2wBAQU4RnVsbHlVbmJvbmRpbmcBAQVETWF4VW5ib25kaW5nTGltaXQBAQVEQ2Fubm90V2l0aGRyYXdBbnkBAQVETWluaW11bUJvbmROb3RNZXQBAQUwT3ZlcmZsb3dSaXNrAQEFNE5vdERlc3Ryb3lpbmcBAQUwTm90Tm9taW5hdG9yAQEFVE5vdEtpY2tlck9yRGVzdHJveWluZwEBBRxOb3RPcGVuAQEFIE1heFBvb2xzAQEFOE1heFBvb2xNZW1iZXJzAQEFRENhbk5vdENoYW5nZVN0YXRlAQEFVERvZXNOb3RIYXZlUGVybWlzc2lvbgEBBVRNZXRhZGF0YUV4Y2VlZHNNYXhMZW4BAQUkRGVmZW5zaXZlAQIcaE5vdEVub3VnaFNwYWNlSW5VbmJvbmRQb29sAQEFMFBvb2xOb3RGb3VuZAEBBUhSZXdhcmRQb29sTm90Rm91bmQBAQVAU3ViUG9vbHNOb3RGb3VuZAEBBXBCb25kZWRTdGFzaEtpbGxlZFByZW1hdHVyZWx5AQEFVERlbGVnYXRpb25VbnN1cHBvcnRlZAEBBTxTbGFzaE5vdEFwcGxpZWQBAQWcUGFydGlhbFVuYm9uZE5vdEFsbG93ZWRQZXJtaXNzaW9ubGVzc2x5AQEFXE1heENvbW1pc3Npb25SZXN0cmljdGVkAQEFYENvbW1pc3Npb25FeGNlZWRzTWF4aW11bQEBBXhDb21taXNzaW9uRXhjZWVkc0dsb2JhbE1heGltdW0BAQVkQ29tbWlzc2lvbkNoYW5nZVRocm90dGxlZAEBBXhDb21taXNzaW9uQ2hhbmdlUmF0ZU5vdEFsbG93ZWQBAQVMTm9QZW5kaW5nQ29tbWlzc2lvbgEBBVhOb0NvbW1pc3Npb25DdXJyZW50U2V0AQEFLFBvb2xJZEluVXNlAQEFNEludmFsaWRQb29sSWQBAQVMQm9uZEV4dHJhUmVzdHJpY3RlZAEBBTxOb3RoaW5nVG9BZGp1c3QBAQU4Tm90aGluZ1RvU2xhc2gBAQUsU2xhc2hUb29Mb3cBAQU8QWxyZWFkeU1pZ3JhdGVkAQEFLE5vdE1pZ3JhdGVkAQEFME5vdFN1cHBvcnRlZAEBBShSZXN0cmljdGVkAQEFAjAoTm90QWxsb3dlZAEBBThBbHJlYWR5U3Rha2luZwEBBWBJbnZhbGlkUmV3YXJkRGVzdGluYXRpb24BAQVESW52YWxpZERlbGVnYXRpb24BAQU4Tm90RW5vdWdoRnVuZHMBAQUgTm90QWdlbnQBAQUwTm90RGVsZWdhdG9yAQEFIEJhZFN0YXRlAQEFOFVuYXBwbGllZFNsYXNoAQEFOE5vdGhpbmdUb1NsYXNoAQEFOFdpdGhkcmF3RmFpbGVkAQEFME5vdFN1cHBvcnRlZAEBBQJEZFZhbGlkYXRvckluZGV4T3V0T2ZCb3VuZHMBAQVQVW5zY2hlZHVsZWRDYW5kaWRhdGUBAQVASGVhZERhdGFUb29MYXJnZQEBBVBQcmVtYXR1cmVDb2RlVXBncmFkZQEBBTxOZXdDb2RlVG9vTGFyZ2UBAQVURGlzYWxsb3dlZFJlbGF5UGFyZW50AQEFREludmFsaWRBc3NpZ25tZW50AQEFREludmFsaWRHcm91cEluZGV4AQEFTEluc3VmZmljaWVudEJhY2tpbmcBAQU4SW52YWxpZEJhY2tpbmcBAQVoVmFsaWRhdGlvbkRhdGFIYXNoTWlzbWF0Y2gBAQWASW5jb3JyZWN0RG93bndhcmRNZXNzYWdlSGFuZGxpbmcBAQVUSW52YWxpZFVwd2FyZE1lc3NhZ2VzAQEFYEhybXBXYXRlcm1hcmtNaXNoYW5kbGluZwEBBUxJbnZhbGlkT3V0Ym91bmRIcm1wAQEFZEludmFsaWRWYWxpZGF0aW9uQ29kZUhhc2gBAQVAUGFyYUhlYWRNaXNtYXRjaAEBBQIQZFRvb01hbnlJbmNsdXNpb25JbmhlcmVudHMBAQVMSW52YWxpZFBhcmVudEhlYWRlcgEBBYxJbmhlcmVudERhdGFGaWx0ZXJlZER1cmluZ0V4ZWN1dGlvbgEBBVBVbnNjaGVkdWxlZENhbmRpZGF0ZQEBBQJANE5vdFJlZ2lzdGVyZWQBAQU0Q2Fubm90T25ib2FyZAEBBThDYW5ub3RPZmZib2FyZAEBBTRDYW5ub3RVcGdyYWRlAQEFPENhbm5vdERvd25ncmFkZQEBBVhQdmZDaGVja1N0YXRlbWVudFN0YWxlAQEFXFB2ZkNoZWNrU3RhdGVtZW50RnV0dXJlAQEFhFB2ZkNoZWNrVmFsaWRhdG9ySW5kZXhPdXRPZkJvdW5kcwEBBWBQdmZDaGVja0ludmFsaWRTaWduYXR1cmUBAQVIUHZmQ2hlY2tEb3VibGVWb3RlAQEFWFB2ZkNoZWNrU3ViamVjdEludmFsaWQBAQVEQ2Fubm90VXBncmFkZUNvZGUBAQUsSW52YWxpZENvZGUBAQVETm90aGluZ0F1dGhvcml6ZWQBAQUwVW5hdXRob3JpemVkAQEFSEludmFsaWRCbG9ja051bWJlcgEBBQIMJFF1ZXVlRnVsbAEBBXBTcG90UHJpY2VIaWdoZXJUaGFuTWF4QW1vdW50AQEFTEluc3VmZmljaWVudENyZWRpdHMBAQUCCEBBc3NpZ25tZW50c0VtcHR5AQEFQERpc2FsbG93ZWRJbnNlcnQBAQUCKDxQYXJhRG9lc250RXhpc3QBAQVEUGFyYUFscmVhZHlFeGlzdHMBAQVURXhjZWVkc01heE1lc3NhZ2VTaXplAQEFKFVucm91dGFibGUBAQU4Q291bGRudENsZWFudXABAQU0Tm90UGFyYXRocmVhZAEBBTBOb3RQYXJhY2hhaW4BAQU0Q2Fubm90VXBncmFkZQEBBTxDYW5ub3REb3duZ3JhZGUBAQUwVG9vTWFueUNvcmVzAQEFAiQ8UGFyYURvZXNudEV4aXN0AQEFNE5vdFBhcmF0aHJlYWQBAQU0Q2Fubm90VXBncmFkZQEBBTxDYW5ub3REb3duZ3JhZGUBAQVMU2xvdEFscmVhZHlBc3NpZ25lZAEBBTxTbG90Tm90QXNzaWduZWQBAQVIT25nb2luZ0xlYXNlRXhpc3RzAQEFZE1heFBlcm1hbmVudFNsb3RzRXhjZWVkZWQBAQVkTWF4VGVtcG9yYXJ5U2xvdHNFeGNlZWRlZAEBBQIEHEJsb2NrZWQBAQUCBBxPbmdvaW5nAQEFAqQgT3ZlcmZsb3cBAQU0VW5pbXBsZW1lbnRlZAEBBWBVbnRydXN0ZWRSZXNlcnZlTG9jYXRpb24BAQVkVW50cnVzdGVkVGVsZXBvcnRMb2NhdGlvbgEBBTBMb2NhdGlvbkZ1bGwBAQVUTG9jYXRpb25Ob3RJbnZlcnRpYmxlAQEFJEJhZE9yaWdpbgEBBTxJbnZhbGlkTG9jYXRpb24BAQU0QXNzZXROb3RGb3VuZAEBBVRGYWlsZWRUb1RyYW5zYWN0QXNzZXQBAQU8Tm90V2l0aGRyYXdhYmxlAQEFSExvY2F0aW9uQ2Fubm90SG9sZAEBBVRFeGNlZWRzTWF4TWVzc2FnZVNpemUBAQVYRGVzdGluYXRpb25VbnN1cHBvcnRlZAEBBSRUcmFuc3BvcnQBAQUoVW5yb3V0YWJsZQEBBTBVbmtub3duQ2xhaW0BAQU4RmFpbGVkVG9EZWNvZGUBAQVATWF4V2VpZ2h0SW52YWxpZAEBBThOb3RIb2xkaW5nRmVlcwEBBTBUb29FeHBlbnNpdmUBAQUQVHJhcAEBBUBFeHBlY3RhdGlvbkZhbHNlAQEFOFBhbGxldE5vdEZvdW5kAQEFME5hbWVNaXNtYXRjaAEBBUxWZXJzaW9uSW5jb21wYXRpYmxlAQEFUEhvbGRpbmdXb3VsZE92ZXJmbG93AQEFLEV4cG9ydEVycm9yAQEFOFJlYW5jaG9yRmFpbGVkAQEFGE5vRGVhbAEBBShGZWVzTm90TWV0AQEFJExvY2tFcnJvcgEBBTBOb1Blcm1pc3Npb24BAQUoVW5hbmNob3JlZAEBBThOb3REZXBvc2l0YWJsZQEBBTRUb29NYW55QXNzZXRzAQEFTFVuaGFuZGxlZFhjbVZlcnNpb24BAQVIV2VpZ2h0TGltaXRSZWFjaGVkAQEFHEJhcnJpZXIBAQVMV2VpZ2h0Tm90Q29tcHV0YWJsZQEBBURFeGNlZWRzU3RhY2tMaW1pdAEBBQJwLFVucmVhY2hhYmxlAQEFLFNlbmRGYWlsdXJlAQEFIEZpbHRlcmVkAQEFSFVud2VpZ2hhYmxlTWVzc2FnZQEBBWBEZXN0aW5hdGlvbk5vdEludmVydGlibGUBAQUURW1wdHkBAQU4Q2Fubm90UmVhbmNob3IBAQU0VG9vTWFueUFzc2V0cwEBBTRJbnZhbGlkT3JpZ2luAQEFKEJhZFZlcnNpb24BAQUsQmFkTG9jYXRpb24BAQU4Tm9TdWJzY3JpcHRpb24BAQVEQWxyZWFkeVN1YnNjcmliZWQBAQVYQ2Fubm90Q2hlY2tPdXRUZWxlcG9ydAEBBShMb3dCYWxhbmNlAQEFMFRvb01hbnlMb2NrcwEBBUxBY2NvdW50Tm90U292ZXJlaWduAQEFKEZlZXNOb3RNZXQBAQUwTG9ja05vdEZvdW5kAQEFFEluVXNlAQEFaEludmFsaWRBc3NldFVua25vd25SZXNlcnZlAQEFeEludmFsaWRBc3NldFVuc3VwcG9ydGVkUmVzZXJ2ZQEBBTxUb29NYW55UmVzZXJ2ZXMBAQVgTG9jYWxFeGVjdXRpb25JbmNvbXBsZXRlAQEFYFRvb01hbnlBdXRob3JpemVkQWxpYXNlcwEBBTRFeHBpcmVzSW5QYXN0AQEFNEFsaWFzTm90Rm91bmQBAQWETG9jYWxFeGVjdXRpb25JbmNvbXBsZXRlV2l0aEVycm9yAQAIFGluZGV4BBRlcnJvcuUNAhggQmFkUHJvb2YBAQUYRnV0dXJlAQEFFFN0YWxlAQEFREFuY2llbnRCaXJ0aEJsb2NrAQEFNFVua25vd25PcmlnaW4BAQUcSW52YWxpZAEBBQIcYEludmFsaWRLZXlPd25lcnNoaXBQcm9vZgEBBWBJbnZhbGlkRG91YmxlVm90aW5nUHJvb2YBAQVYSW52YWxpZEZvcmtWb3RpbmdQcm9vZgEBBXRJbnZhbGlkRnV0dXJlQmxvY2tWb3RpbmdQcm9vZgEBBXxJbnZhbGlkRXF1aXZvY2F0aW9uUHJvb2ZTZXNzaW9uAQEFWER1cGxpY2F0ZU9mZmVuY2VSZXBvcnQBAQVQSW52YWxpZENvbmZpZ3VyYXRpb24BAQUCDQEYU3lzdGVtAQIkPEludmFsaWRTcGVjTmFtZQEBBWhTcGVjVmVyc2lvbk5lZWRzVG9JbmNyZWFzZQEBBXRGYWlsZWRUb0V4dHJhY3RSdW50aW1lVmVyc2lvbgEBBUxOb25EZWZhdWx0Q29tcG9zaXRlAQEFPE5vblplcm9SZWZDb3VudAEBBTBDYWxsRmlsdGVyZWQBAQVsTXVsdGlCbG9ja01pZ3JhdGlvbnNPbmdvaW5nAQEFRE5vdGhpbmdBdXRob3JpemVkAQEFMFVuYXV0aG9yaXplZAEBBRBCYWJlAQIQYEludmFsaWRFcXVpdm9jYXRpb25Qcm9vZgEBBWBJbnZhbGlkS2V5T3duZXJzaGlwUHJvb2YBAQVYRHVwbGljYXRlT2ZmZW5jZVJlcG9ydAEBBVBJbnZhbGlkQ29uZmlndXJhdGlvbgEBBSRUaW1lc3RhbXABAQUcSW5kaWNlcwECFCxOb3RBc3NpZ25lZAEBBSBOb3RPd25lcgEBBRRJblVzZQEBBSxOb3RUcmFuc2ZlcgEBBSRQZXJtYW5lbnQBAQUgQmFsYW5jZXMBAjA4VmVzdGluZ0JhbGFuY2UBAQVUTGlxdWlkaXR5UmVzdHJpY3Rpb25zAQEFTEluc3VmZmljaWVudEJhbGFuY2UBAQVIRXhpc3RlbnRpYWxEZXBvc2l0AQEFNEV4cGVuZGFiaWxpdHkBAQVcRXhpc3RpbmdWZXN0aW5nU2NoZWR1bGUBAQUsRGVhZEFjY291bnQBAQU8VG9vTWFueVJlc2VydmVzAQEFMFRvb01hbnlIb2xkcwEBBThUb29NYW55RnJlZXplcwEBBUxJc3N1YW5jZURlYWN0aXZhdGVkAQEFJERlbHRhWmVybwEBBUhUcmFuc2FjdGlvblBheW1lbnQBAQUoQXV0aG9yc2hpcAEBBRxTdGFraW5nAQKINE5vdENvbnRyb2xsZXIBAQUgTm90U3Rhc2gBAQU0QWxyZWFkeUJvbmRlZAEBBTRBbHJlYWR5UGFpcmVkAQEFMEVtcHR5VGFyZ2V0cwEBBThEdXBsaWNhdGVJbmRleAEBBURJbnZhbGlkU2xhc2hJbmRleAEBBUBJbnN1ZmZpY2llbnRCb25kAQEFME5vTW9yZUNodW5rcwEBBTROb1VubG9ja0NodW5rAQEFMEZ1bmRlZFRhcmdldAEBBUhJbnZhbGlkRXJhVG9SZXdhcmQBAQVoSW52YWxpZE51bWJlck9mTm9taW5hdGlvbnMBAQVITm90U29ydGVkQW5kVW5pcXVlAQEFOEFscmVhZHlDbGFpbWVkAQEFLEludmFsaWRQYWdlAQEFVEluY29ycmVjdEhpc3RvcnlEZXB0aAEBBVhJbmNvcnJlY3RTbGFzaGluZ1NwYW5zAQEFIEJhZFN0YXRlAQEFOFRvb01hbnlUYXJnZXRzAQEFJEJhZFRhcmdldAEBBUBDYW5ub3RDaGlsbE90aGVyAQEFRFRvb01hbnlOb21pbmF0b3JzAQEFRFRvb01hbnlWYWxpZGF0b3JzAQEFQENvbW1pc3Npb25Ub29Mb3cBAQUsQm91bmROb3RNZXQBAQVQQ29udHJvbGxlckRlcHJlY2F0ZWQBAQVMQ2Fubm90UmVzdG9yZUxlZGdlcgEBBWxSZXdhcmREZXN0aW5hdGlvblJlc3RyaWN0ZWQBAQU4Tm90RW5vdWdoRnVuZHMBAQVcVmlydHVhbFN0YWtlck5vdEFsbG93ZWQBAQU8Q2Fubm90UmVhcFN0YXNoAQEFPEFscmVhZHlNaWdyYXRlZAEBBShSZXN0cmljdGVkAQEFIE9mZmVuY2VzAQEFKEhpc3RvcmljYWwBAQUoUGFyYW1ldGVycwEBBRxTZXNzaW9uAQIUMEludmFsaWRQcm9vZgEBBVxOb0Fzc29jaWF0ZWRWYWxpZGF0b3JJZAEBBTREdXBsaWNhdGVkS2V5AQEFGE5vS2V5cwEBBSROb0FjY291bnQBAQUcR3JhbmRwYQECHCxQYXVzZUZhaWxlZAEBBTBSZXN1bWVGYWlsZWQBAQU0Q2hhbmdlUGVuZGluZwEBBRxUb29Tb29uAQEFYEludmFsaWRLZXlPd25lcnNoaXBQcm9vZgEBBWBJbnZhbGlkRXF1aXZvY2F0aW9uUHJvb2YBAQVYRHVwbGljYXRlT2ZmZW5jZVJlcG9ydAEBBUhBdXRob3JpdHlEaXNjb3ZlcnkBAQUcVXRpbGl0eQECBDBUb29NYW55Q2FsbHMBAQUgSWRlbnRpdHkBAnhIVG9vTWFueVN1YkFjY291bnRzAQEFIE5vdEZvdW5kAQEFIE5vdE5hbWVkAQEFKEVtcHR5SW5kZXgBAQUoRmVlQ2hhbmdlZAEBBShOb0lkZW50aXR5AQEFPFN0aWNreUp1ZGdlbWVudAEBBThKdWRnZW1lbnRHaXZlbgEBBUBJbnZhbGlkSnVkZ2VtZW50AQEFMEludmFsaWRJbmRleAEBBTRJbnZhbGlkVGFyZ2V0AQEFRFRvb01hbnlSZWdpc3RyYXJzAQEFOEFscmVhZHlDbGFpbWVkAQEFGE5vdFN1YgEBBSBOb3RPd25lZAEBBXRKdWRnZW1lbnRGb3JEaWZmZXJlbnRJZGVudGl0eQEBBVhKdWRnZW1lbnRQYXltZW50RmFpbGVkAQEFNEludmFsaWRTdWZmaXgBAQVQTm90VXNlcm5hbWVBdXRob3JpdHkBAQUwTm9BbGxvY2F0aW9uAQEFQEludmFsaWRTaWduYXR1cmUBAQVEUmVxdWlyZXNTaWduYXR1cmUBAQU8SW52YWxpZFVzZXJuYW1lAQEFNFVzZXJuYW1lVGFrZW4BAQUoTm9Vc2VybmFtZQEBBShOb3RFeHBpcmVkAQEFIFRvb0Vhcmx5AQEFME5vdFVuYmluZGluZwEBBUBBbHJlYWR5VW5iaW5kaW5nAQEFWEluc3VmZmljaWVudFByaXZpbGVnZXMBAQUgUmVjb3ZlcnkBAkAoTm90QWxsb3dlZAEBBTRaZXJvVGhyZXNob2xkAQEFQE5vdEVub3VnaEZyaWVuZHMBAQUoTWF4RnJpZW5kcwEBBSROb3RTb3J0ZWQBAQU4Tm90UmVjb3ZlcmFibGUBAQVIQWxyZWFkeVJlY292ZXJhYmxlAQEFOEFscmVhZHlTdGFydGVkAQEFKE5vdFN0YXJ0ZWQBAQUkTm90RnJpZW5kAQEFLERlbGF5UGVyaW9kAQEFOEFscmVhZHlWb3VjaGVkAQEFJFRocmVzaG9sZAEBBSxTdGlsbEFjdGl2ZQEBBTBBbHJlYWR5UHJveHkBAQUgQmFkU3RhdGUBAQUcVmVzdGluZwECFChOb3RWZXN0aW5nAQEFVEF0TWF4VmVzdGluZ1NjaGVkdWxlcwEBBSRBbW91bnRMb3cBAQVgU2NoZWR1bGVJbmRleE91dE9mQm91bmRzAQEFVEludmFsaWRTY2hlZHVsZVBhcmFtcwEBBSRTY2hlZHVsZXIBAhRARmFpbGVkVG9TY2hlZHVsZQEBBSBOb3RGb3VuZAEBBVxUYXJnZXRCbG9ja051bWJlckluUGFzdAEBBUhSZXNjaGVkdWxlTm9DaGFuZ2UBAQUUTmFtZWQBAQUgUHJlaW1hZ2UBAiAYVG9vQmlnAQEFMEFscmVhZHlOb3RlZAEBBTROb3RBdXRob3JpemVkAQEFIE5vdE5vdGVkAQEFJFJlcXVlc3RlZAEBBTBOb3RSZXF1ZXN0ZWQBAQUcVG9vTWFueQEBBRhUb29GZXcBAQUQU3VkbwECBCxSZXF1aXJlU3VkbwEBBRRQcm94eQECIBxUb29NYW55AQEFIE5vdEZvdW5kAQEFIE5vdFByb3h5AQEFLFVucHJveHlhYmxlAQEFJER1cGxpY2F0ZQEBBTBOb1Blcm1pc3Npb24BAQUsVW5hbm5vdW5jZWQBAQUsTm9TZWxmUHJveHkBAQUgTXVsdGlzaWcBAjhATWluaW11bVRocmVzaG9sZAEBBTxBbHJlYWR5QXBwcm92ZWQBAQVETm9BcHByb3ZhbHNOZWVkZWQBAQVEVG9vRmV3U2lnbmF0b3JpZXMBAQVIVG9vTWFueVNpZ25hdG9yaWVzAQEFVFNpZ25hdG9yaWVzT3V0T2ZPcmRlcgEBBUxTZW5kZXJJblNpZ25hdG9yaWVzAQEFIE5vdEZvdW5kAQEFIE5vdE93bmVyAQEFLE5vVGltZXBvaW50AQEFOFdyb25nVGltZXBvaW50AQEFTFVuZXhwZWN0ZWRUaW1lcG9pbnQBAQU8TWF4V2VpZ2h0VG9vTG93AQEFNEFscmVhZHlTdG9yZWQBAQVoRWxlY3Rpb25Qcm92aWRlck11bHRpUGhhc2UBAjxoUHJlRGlzcGF0Y2hFYXJseVN1Ym1pc3Npb24BAQVsUHJlRGlzcGF0Y2hXcm9uZ1dpbm5lckNvdW50AQEFZFByZURpc3BhdGNoV2Vha1N1Ym1pc3Npb24BAQU8U2lnbmVkUXVldWVGdWxsAQEFWFNpZ25lZENhbm5vdFBheURlcG9zaXQBAQVQU2lnbmVkSW52YWxpZFdpdG5lc3MBAQVMU2lnbmVkVG9vTXVjaFdlaWdodAEBBTxPY3dDYWxsV3JvbmdFcmEBAQVcTWlzc2luZ1NuYXBzaG90TWV0YWRhdGEBAQVYSW52YWxpZFN1Ym1pc3Npb25JbmRleAEBBThDYWxsTm90QWxsb3dlZAEBBThGYWxsYmFja0ZhaWxlZAEBBSxCb3VuZE5vdE1ldAEBBThUb29NYW55V2lubmVycwEBBWRQcmVEaXNwYXRjaERpZmZlcmVudFJvdW5kAQEFJFZvdGVyTGlzdAECCBBMaXN0AQIUJER1cGxpY2F0ZQEBBShOb3RIZWF2aWVyAQEFME5vdEluU2FtZUJhZwEBBTBOb2RlTm90Rm91bmQBAQUYTG9ja2VkAQEFGExvY2tlZAEBBTxOb21pbmF0aW9uUG9vbHMBApgwUG9vbE5vdEZvdW5kAQEFSFBvb2xNZW1iZXJOb3RGb3VuZAEBBUhSZXdhcmRQb29sTm90Rm91bmQBAQVAU3ViUG9vbHNOb3RGb3VuZAEBBWRBY2NvdW50QmVsb25nc1RvT3RoZXJQb29sAQEFOEZ1bGx5VW5ib25kaW5nAQEFRE1heFVuYm9uZGluZ0xpbWl0AQEFRENhbm5vdFdpdGhkcmF3QW55AQEFRE1pbmltdW1Cb25kTm90TWV0AQEFME92ZXJmbG93UmlzawEBBTROb3REZXN0cm95aW5nAQEFME5vdE5vbWluYXRvcgEBBVROb3RLaWNrZXJPckRlc3Ryb3lpbmcBAQUcTm90T3BlbgEBBSBNYXhQb29scwEBBThNYXhQb29sTWVtYmVycwEBBURDYW5Ob3RDaGFuZ2VTdGF0ZQEBBVREb2VzTm90SGF2ZVBlcm1pc3Npb24BAQVUTWV0YWRhdGFFeGNlZWRzTWF4TGVuAQEFJERlZmVuc2l2ZQECHGhOb3RFbm91Z2hTcGFjZUluVW5ib25kUG9vbAEBBTBQb29sTm90Rm91bmQBAQVIUmV3YXJkUG9vbE5vdEZvdW5kAQEFQFN1YlBvb2xzTm90Rm91bmQBAQVwQm9uZGVkU3Rhc2hLaWxsZWRQcmVtYXR1cmVseQEBBVREZWxlZ2F0aW9uVW5zdXBwb3J0ZWQBAQU8U2xhc2hOb3RBcHBsaWVkAQEFnFBhcnRpYWxVbmJvbmROb3RBbGxvd2VkUGVybWlzc2lvbmxlc3NseQEBBVxNYXhDb21taXNzaW9uUmVzdHJpY3RlZAEBBWBDb21taXNzaW9uRXhjZWVkc01heGltdW0BAQV4Q29tbWlzc2lvbkV4Y2VlZHNHbG9iYWxNYXhpbXVtAQEFZENvbW1pc3Npb25DaGFuZ2VUaHJvdHRsZWQBAQV4Q29tbWlzc2lvbkNoYW5nZVJhdGVOb3RBbGxvd2VkAQEFTE5vUGVuZGluZ0NvbW1pc3Npb24BAQVYTm9Db21taXNzaW9uQ3VycmVudFNldAEBBSxQb29sSWRJblVzZQEBBTRJbnZhbGlkUG9vbElkAQEFTEJvbmRFeHRyYVJlc3RyaWN0ZWQBAQU8Tm90aGluZ1RvQWRqdXN0AQEFOE5vdGhpbmdUb1NsYXNoAQEFLFNsYXNoVG9vTG93AQEFPEFscmVhZHlNaWdyYXRlZAEBBSxOb3RNaWdyYXRlZAEBBTBOb3RTdXBwb3J0ZWQBAQUoUmVzdHJpY3RlZAEBBSxGYXN0VW5zdGFrZQECGDROb3RDb250cm9sbGVyAQEFNEFscmVhZHlRdWV1ZWQBAQU4Tm90RnVsbHlCb25kZWQBAQUkTm90UXVldWVkAQEFLEFscmVhZHlIZWFkAQEFOENhbGxOb3RBbGxvd2VkAQEFQENvbnZpY3Rpb25Wb3RpbmcBAjAoTm90T25nb2luZwEBBSBOb3RWb3RlcgEBBTBOb1Blcm1pc3Npb24BAQU8Tm9QZXJtaXNzaW9uWWV0AQEFREFscmVhZHlEZWxlZ2F0aW5nAQEFNEFscmVhZHlWb3RpbmcBAQVESW5zdWZmaWNpZW50RnVuZHMBAQU0Tm90RGVsZWdhdGluZwEBBSBOb25zZW5zZQEBBTxNYXhWb3Rlc1JlYWNoZWQBAQUsQ2xhc3NOZWVkZWQBAQUgQmFkQ2xhc3MBAQUkUmVmZXJlbmRhAQI4KE5vdE9uZ29pbmcBAQUoSGFzRGVwb3NpdAEBBSBCYWRUcmFjawEBBRBGdWxsAQEFKFF1ZXVlRW1wdHkBAQU0QmFkUmVmZXJlbmR1bQEBBSxOb3RoaW5nVG9EbwEBBRxOb1RyYWNrAQEFKFVuZmluaXNoZWQBAQUwTm9QZXJtaXNzaW9uAQEFJE5vRGVwb3NpdAEBBSRCYWRTdGF0dXMBAQVAUHJlaW1hZ2VOb3RFeGlzdAEBBYRQcmVpbWFnZVN0b3JlZFdpdGhEaWZmZXJlbnRMZW5ndGgBAQUcT3JpZ2lucwEBBSRXaGl0ZWxpc3QBAhRMVW5hdmFpbGFibGVQcmVJbWFnZQEBBTxVbmRlY29kYWJsZUNhbGwBAQVgSW52YWxpZENhbGxXZWlnaHRXaXRuZXNzAQEFUENhbGxJc05vdFdoaXRlbGlzdGVkAQEFWENhbGxBbHJlYWR5V2hpdGVsaXN0ZWQBAQUgVHJlYXN1cnkBAiwwSW52YWxpZEluZGV4AQEFQFRvb01hbnlBcHByb3ZhbHMBAQVYSW5zdWZmaWNpZW50UGVybWlzc2lvbgEBBUxQcm9wb3NhbE5vdEFwcHJvdmVkAQEFWEZhaWxlZFRvQ29udmVydEJhbGFuY2UBAQUwU3BlbmRFeHBpcmVkAQEFLEVhcmx5UGF5b3V0AQEFQEFscmVhZHlBdHRlbXB0ZWQBAQUsUGF5b3V0RXJyb3IBAQUwTm90QXR0ZW1wdGVkAQEFMEluY29uY2x1c2l2ZQEBBUBEZWxlZ2F0ZWRTdGFraW5nAQIwKE5vdEFsbG93ZWQBAQU4QWxyZWFkeVN0YWtpbmcBAQVgSW52YWxpZFJld2FyZERlc3RpbmF0aW9uAQEFREludmFsaWREZWxlZ2F0aW9uAQEFOE5vdEVub3VnaEZ1bmRzAQEFIE5vdEFnZW50AQEFME5vdERlbGVnYXRvcgEBBSBCYWRTdGF0ZQEBBThVbmFwcGxpZWRTbGFzaAEBBThOb3RoaW5nVG9TbGFzaAEBBThXaXRoZHJhd0ZhaWxlZAEBBTBOb3RTdXBwb3J0ZWQBAQVAUGFyYWNoYWluc09yaWdpbgEBBTRDb25maWd1cmF0aW9uAQIEPEludmFsaWROZXdWYWx1ZQEBBSxQYXJhc1NoYXJlZAEBBTRQYXJhSW5jbHVzaW9uAQJEZFZhbGlkYXRvckluZGV4T3V0T2ZCb3VuZHMBAQVQVW5zY2hlZHVsZWRDYW5kaWRhdGUBAQVASGVhZERhdGFUb29MYXJnZQEBBVBQcmVtYXR1cmVDb2RlVXBncmFkZQEBBTxOZXdDb2RlVG9vTGFyZ2UBAQVURGlzYWxsb3dlZFJlbGF5UGFyZW50AQEFREludmFsaWRBc3NpZ25tZW50AQEFREludmFsaWRHcm91cEluZGV4AQEFTEluc3VmZmljaWVudEJhY2tpbmcBAQU4SW52YWxpZEJhY2tpbmcBAQVoVmFsaWRhdGlvbkRhdGFIYXNoTWlzbWF0Y2gBAQWASW5jb3JyZWN0RG93bndhcmRNZXNzYWdlSGFuZGxpbmcBAQVUSW52YWxpZFVwd2FyZE1lc3NhZ2VzAQEFYEhybXBXYXRlcm1hcmtNaXNoYW5kbGluZwEBBUxJbnZhbGlkT3V0Ym91bmRIcm1wAQEFZEludmFsaWRWYWxpZGF0aW9uQ29kZUhhc2gBAQVAUGFyYUhlYWRNaXNtYXRjaAEBBTBQYXJhSW5oZXJlbnQBAhBkVG9vTWFueUluY2x1c2lvbkluaGVyZW50cwEBBUxJbnZhbGlkUGFyZW50SGVhZGVyAQEFjEluaGVyZW50RGF0YUZpbHRlcmVkRHVyaW5nRXhlY3V0aW9uAQEFUFVuc2NoZWR1bGVkQ2FuZGlkYXRlAQEFNFBhcmFTY2hlZHVsZXIBAQUUUGFyYXMBAkA0Tm90UmVnaXN0ZXJlZAEBBTRDYW5ub3RPbmJvYXJkAQEFOENhbm5vdE9mZmJvYXJkAQEFNENhbm5vdFVwZ3JhZGUBAQU8Q2Fubm90RG93bmdyYWRlAQEFWFB2ZkNoZWNrU3RhdGVtZW50U3RhbGUBAQVcUHZmQ2hlY2tTdGF0ZW1lbnRGdXR1cmUBAQWEUHZmQ2hlY2tWYWxpZGF0b3JJbmRleE91dE9mQm91bmRzAQEFYFB2ZkNoZWNrSW52YWxpZFNpZ25hdHVyZQEBBUhQdmZDaGVja0RvdWJsZVZvdGUBAQVYUHZmQ2hlY2tTdWJqZWN0SW52YWxpZAEBBURDYW5ub3RVcGdyYWRlQ29kZQEBBSxJbnZhbGlkQ29kZQEBBUROb3RoaW5nQXV0aG9yaXplZAEBBTBVbmF1dGhvcml6ZWQBAQVISW52YWxpZEJsb2NrTnVtYmVyAQEFLEluaXRpYWxpemVyAQEFDERtcAEBBRBIcm1wAQJQVE9wZW5Icm1wQ2hhbm5lbFRvU2VsZgEBBXxPcGVuSHJtcENoYW5uZWxJbnZhbGlkUmVjaXBpZW50AQEFbE9wZW5Icm1wQ2hhbm5lbFplcm9DYXBhY2l0eQEBBYxPcGVuSHJtcENoYW5uZWxDYXBhY2l0eUV4Y2VlZHNMaW1pdAEBBXhPcGVuSHJtcENoYW5uZWxaZXJvTWVzc2FnZVNpemUBAQWYT3BlbkhybXBDaGFubmVsTWVzc2FnZVNpemVFeGNlZWRzTGltaXQBAQVwT3BlbkhybXBDaGFubmVsQWxyZWFkeUV4aXN0cwEBBXxPcGVuSHJtcENoYW5uZWxBbHJlYWR5UmVxdWVzdGVkAQEFcE9wZW5Icm1wQ2hhbm5lbExpbWl0RXhjZWVkZWQBAQVwQWNjZXB0SHJtcENoYW5uZWxEb2VzbnRFeGlzdAEBBYRBY2NlcHRIcm1wQ2hhbm5lbEFscmVhZHlDb25maXJtZWQBAQV4QWNjZXB0SHJtcENoYW5uZWxMaW1pdEV4Y2VlZGVkAQEFcENsb3NlSHJtcENoYW5uZWxVbmF1dGhvcml6ZWQBAQVsQ2xvc2VIcm1wQ2hhbm5lbERvZXNudEV4aXN0AQEFfENsb3NlSHJtcENoYW5uZWxBbHJlYWR5VW5kZXJ3YXkBAQWEQ2FuY2VsSHJtcE9wZW5DaGFubmVsVW5hdXRob3JpemVkAQEFaE9wZW5Icm1wQ2hhbm5lbERvZXNudEV4aXN0AQEFfE9wZW5Icm1wQ2hhbm5lbEFscmVhZHlDb25maXJtZWQBAQUwV3JvbmdXaXRuZXNzAQEFcENoYW5uZWxDcmVhdGlvbk5vdEF1dGhvcml6ZWQBAQU8UGFyYVNlc3Npb25JbmZvAQEFNFBhcmFzRGlzcHV0ZXMBAiR0RHVwbGljYXRlRGlzcHV0ZVN0YXRlbWVudFNldHMBAQVcQW5jaWVudERpc3B1dGVTdGF0ZW1lbnQBAQVkVmFsaWRhdG9ySW5kZXhPdXRPZkJvdW5kcwEBBUBJbnZhbGlkU2lnbmF0dXJlAQEFSER1cGxpY2F0ZVN0YXRlbWVudAEBBUhTaW5nbGVTaWRlZERpc3B1dGUBAQU8TWFsaWNpb3VzQmFja2VyAQEFTE1pc3NpbmdCYWNraW5nVm90ZXMBAQVIVW5jb25maXJtZWREaXNwdXRlAQEFNFBhcmFzU2xhc2hpbmcBAhhgSW52YWxpZEtleU93bmVyc2hpcFByb29mAQEFTEludmFsaWRTZXNzaW9uSW5kZXgBAQVQSW52YWxpZENhbmRpZGF0ZUhhc2gBAQVUSW52YWxpZFZhbGlkYXRvckluZGV4AQEFYFZhbGlkYXRvckluZGV4SWRNaXNtYXRjaAEBBVxEdXBsaWNhdGVTbGFzaGluZ1JlcG9ydAEBBWhPbkRlbWFuZEFzc2lnbm1lbnRQcm92aWRlcgECDCRRdWV1ZUZ1bGwBAQVwU3BvdFByaWNlSGlnaGVyVGhhbk1heEFtb3VudAEBBUxJbnN1ZmZpY2llbnRDcmVkaXRzAQEFaENvcmV0aW1lQXNzaWdubWVudFByb3ZpZGVyAQIIQEFzc2lnbm1lbnRzRW1wdHkBAQVARGlzYWxsb3dlZEluc2VydAEBBSRSZWdpc3RyYXIBAjg0Tm90UmVnaXN0ZXJlZAEBBURBbHJlYWR5UmVnaXN0ZXJlZAEBBSBOb3RPd25lcgEBBTBDb2RlVG9vTGFyZ2UBAQVASGVhZERhdGFUb29MYXJnZQEBBTBOb3RQYXJhY2hhaW4BAQU0Tm90UGFyYXRocmVhZAEBBUBDYW5ub3REZXJlZ2lzdGVyAQEFPENhbm5vdERvd25ncmFkZQEBBTRDYW5ub3RVcGdyYWRlAQEFKFBhcmFMb2NrZWQBAQUsTm90UmVzZXJ2ZWQBAQUsSW52YWxpZENvZGUBAQUoQ2Fubm90U3dhcAEBBRRTbG90cwECCERQYXJhTm90T25ib2FyZGluZwEBBShMZWFzZUVycm9yAQEFQFBhcmFzU3Vkb1dyYXBwZXIBAig8UGFyYURvZXNudEV4aXN0AQEFRFBhcmFBbHJlYWR5RXhpc3RzAQEFVEV4Y2VlZHNNYXhNZXNzYWdlU2l6ZQEBBShVbnJvdXRhYmxlAQEFOENvdWxkbnRDbGVhbnVwAQEFNE5vdFBhcmF0aHJlYWQBAQUwTm90UGFyYWNoYWluAQEFNENhbm5vdFVwZ3JhZGUBAQU8Q2Fubm90RG93bmdyYWRlAQEFMFRvb01hbnlDb3JlcwEBBSBBdWN0aW9ucwECHERBdWN0aW9uSW5Qcm9ncmVzcwEBBURMZWFzZVBlcmlvZEluUGFzdAEBBURQYXJhTm90UmVnaXN0ZXJlZAEBBUROb3RDdXJyZW50QXVjdGlvbgEBBShOb3RBdWN0aW9uAQEFMEF1Y3Rpb25FbmRlZAEBBUBBbHJlYWR5TGVhc2VkT3V0AQEFJENyb3dkbG9hbgECXERGaXJzdFBlcmlvZEluUGFzdAEBBWRGaXJzdFBlcmlvZFRvb0ZhckluRnV0dXJlAQEFbExhc3RQZXJpb2RCZWZvcmVGaXJzdFBlcmlvZAEBBWBMYXN0UGVyaW9kVG9vRmFySW5GdXR1cmUBAQU8Q2Fubm90RW5kSW5QYXN0AQEFREVuZFRvb0ZhckluRnV0dXJlAQEFIE92ZXJmbG93AQEFUENvbnRyaWJ1dGlvblRvb1NtYWxsAQEFNEludmFsaWRQYXJhSWQBAQUsQ2FwRXhjZWVkZWQBAQVYQ29udHJpYnV0aW9uUGVyaW9kT3ZlcgEBBTRJbnZhbGlkT3JpZ2luAQEFME5vdFBhcmFjaGFpbgEBBSxMZWFzZUFjdGl2ZQEBBUBCaWRPckxlYXNlQWN0aXZlAQEFMEZ1bmROb3RFbmRlZAEBBTxOb0NvbnRyaWJ1dGlvbnMBAQVITm90UmVhZHlUb0Rpc3NvbHZlAQEFQEludmFsaWRTaWduYXR1cmUBAQUwTWVtb1Rvb0xhcmdlAQEFREFscmVhZHlJbk5ld1JhaXNlAQEFSFZyZkRlbGF5SW5Qcm9ncmVzcwEBBTROb0xlYXNlUGVyaW9kAQEFNEFzc2lnbmVkU2xvdHMBAiQ8UGFyYURvZXNudEV4aXN0AQEFNE5vdFBhcmF0aHJlYWQBAQU0Q2Fubm90VXBncmFkZQEBBTxDYW5ub3REb3duZ3JhZGUBAQVMU2xvdEFscmVhZHlBc3NpZ25lZAEBBTxTbG90Tm90QXNzaWduZWQBAQVIT25nb2luZ0xlYXNlRXhpc3RzAQEFZE1heFBlcm1hbmVudFNsb3RzRXhjZWVkZWQBAQVkTWF4VGVtcG9yYXJ5U2xvdHNFeGNlZWRlZAEBBSBDb3JldGltZQECDCROb3RCcm9rZXIBAQVYUmVxdWVzdGVkRnV0dXJlUmV2ZW51ZQEBBUxBc3NldFRyYW5zZmVyRmFpbGVkAQEFPFN0YWtpbmdBaENsaWVudAECBBxCbG9ja2VkAQEFUE11bHRpQmxvY2tNaWdyYXRpb25zAQIEHE9uZ29pbmcBAQUkWGNtUGFsbGV0AQJwLFVucmVhY2hhYmxlAQEFLFNlbmRGYWlsdXJlAQEFIEZpbHRlcmVkAQEFSFVud2VpZ2hhYmxlTWVzc2FnZQEBBWBEZXN0aW5hdGlvbk5vdEludmVydGlibGUBAQUURW1wdHkBAQU4Q2Fubm90UmVhbmNob3IBAQU0VG9vTWFueUFzc2V0cwEBBTRJbnZhbGlkT3JpZ2luAQEFKEJhZFZlcnNpb24BAQUsQmFkTG9jYXRpb24BAQU4Tm9TdWJzY3JpcHRpb24BAQVEQWxyZWFkeVN1YnNjcmliZWQBAQVYQ2Fubm90Q2hlY2tPdXRUZWxlcG9ydAEBBShMb3dCYWxhbmNlAQEFMFRvb01hbnlMb2NrcwEBBUxBY2NvdW50Tm90U292ZXJlaWduAQEFKEZlZXNOb3RNZXQBAQUwTG9ja05vdEZvdW5kAQEFFEluVXNlAQEFaEludmFsaWRBc3NldFVua25vd25SZXNlcnZlAQEFeEludmFsaWRBc3NldFVuc3VwcG9ydGVkUmVzZXJ2ZQEBBTxUb29NYW55UmVzZXJ2ZXMBAQVgTG9jYWxFeGVjdXRpb25JbmNvbXBsZXRlAQEFYFRvb01hbnlBdXRob3JpemVkQWxpYXNlcwEBBTRFeHBpcmVzSW5QYXN0AQEFNEFsaWFzTm90Rm91bmQBAQWETG9jYWxFeGVjdXRpb25JbmNvbXBsZXRlV2l0aEVycm9yAQAIFGluZGV4BBRlcnJvcuUNME1lc3NhZ2VRdWV1ZQECJCxOb3RSZWFwYWJsZQEBBRhOb1BhZ2UBAQUkTm9NZXNzYWdlAQEFQEFscmVhZHlQcm9jZXNzZWQBAQUYUXVldWVkAQEFSEluc3VmZmljaWVudFdlaWdodAEBBWBUZW1wb3JhcmlseVVucHJvY2Vzc2FibGUBAQUsUXVldWVQYXVzZWQBAQVMUmVjdXJzaXZlRGlzYWxsb3dlZAEBBSRBc3NldFJhdGUBAgxAVW5rbm93bkFzc2V0S2luZAEBBTRBbHJlYWR5RXhpc3RzAQEFIE92ZXJmbG93AQEFLFJvb3RUZXN0aW5nAQEFGE1ldGFUeAECGCBCYWRQcm9vZgEBBRhGdXR1cmUBAQUUU3RhbGUBAQVEQW5jaWVudEJpcnRoQmxvY2sBAQU0VW5rbm93bk9yaWdpbgEBBRxJbnZhbGlkAQEFPFZlcmlmeVNpZ25hdHVyZQEBBRRCZWVmeQECHGBJbnZhbGlkS2V5T3duZXJzaGlwUHJvb2YBAQVgSW52YWxpZERvdWJsZVZvdGluZ1Byb29mAQEFWEludmFsaWRGb3JrVm90aW5nUHJvb2YBAQV0SW52YWxpZEZ1dHVyZUJsb2NrVm90aW5nUHJvb2YBAQV8SW52YWxpZEVxdWl2b2NhdGlvblByb29mU2Vzc2lvbgEBBVhEdXBsaWNhdGVPZmZlbmNlUmVwb3J0AQEFUEludmFsaWRDb25maWd1cmF0aW9uAQEFDE1tcgEBBTBCZWVmeU1tckxlYWYBAQVASWRlbnRpdHlNaWdyYXRvcgEBBQI4QEludmFsaWRTdGF0ZVJvb3QBAQVISW5jb21wbGV0ZURhdGFiYXNlAQEFUFZhbHVlQXRJbmNvbXBsZXRlS2V5AQEFMERlY29kZXJFcnJvcgEBBSxJbnZhbGlkSGFzaAEBBTBEdXBsaWNhdGVLZXkBAQU4RXh0cmFuZW91c05vZGUBAQU8RXh0cmFuZW91c1ZhbHVlAQEFXEV4dHJhbmVvdXNIYXNoUmVmZXJlbmNlAQEFVEludmFsaWRDaGlsZFJlZmVyZW5jZQEBBTRWYWx1ZU1pc21hdGNoAQEFPEluY29tcGxldGVQcm9vZgEBBTBSb290TWlzbWF0Y2gBAQUsRGVjb2RlRXJyb3IBAQUCPBRPdGhlcgEBBTBDYW5ub3RMb29rdXABAQUkQmFkT3JpZ2luAQEFGE1vZHVsZQECDQEYU3lzdGVtAQIkPEludmFsaWRTcGVjTmFtZQEBBWhTcGVjVmVyc2lvbk5lZWRzVG9JbmNyZWFzZQEBBXRGYWlsZWRUb0V4dHJhY3RSdW50aW1lVmVyc2lvbgEBBUxOb25EZWZhdWx0Q29tcG9zaXRlAQEFPE5vblplcm9SZWZDb3VudAEBBTBDYWxsRmlsdGVyZWQBAQVsTXVsdGlCbG9ja01pZ3JhdGlvbnNPbmdvaW5nAQEFRE5vdGhpbmdBdXRob3JpemVkAQEFMFVuYXV0aG9yaXplZAEBBRBCYWJlAQIQYEludmFsaWRFcXVpdm9jYXRpb25Qcm9vZgEBBWBJbnZhbGlkS2V5T3duZXJzaGlwUHJvb2YBAQVYRHVwbGljYXRlT2ZmZW5jZVJlcG9ydAEBBVBJbnZhbGlkQ29uZmlndXJhdGlvbgEBBSRUaW1lc3RhbXABAQUcSW5kaWNlcwECFCxOb3RBc3NpZ25lZAEBBSBOb3RPd25lcgEBBRRJblVzZQEBBSxOb3RUcmFuc2ZlcgEBBSRQZXJtYW5lbnQBAQUgQmFsYW5jZXMBAjA4VmVzdGluZ0JhbGFuY2UBAQVUTGlxdWlkaXR5UmVzdHJpY3Rpb25zAQEFTEluc3VmZmljaWVudEJhbGFuY2UBAQVIRXhpc3RlbnRpYWxEZXBvc2l0AQEFNEV4cGVuZGFiaWxpdHkBAQVcRXhpc3RpbmdWZXN0aW5nU2NoZWR1bGUBAQUsRGVhZEFjY291bnQBAQU8VG9vTWFueVJlc2VydmVzAQEFMFRvb01hbnlIb2xkcwEBBThUb29NYW55RnJlZXplcwEBBUxJc3N1YW5jZURlYWN0aXZhdGVkAQEFJERlbHRhWmVybwEBBUhUcmFuc2FjdGlvblBheW1lbnQBAQUoQXV0aG9yc2hpcAEBBRxTdGFraW5nAQKINE5vdENvbnRyb2xsZXIBAQUgTm90U3Rhc2gBAQU0QWxyZWFkeUJvbmRlZAEBBTRBbHJlYWR5UGFpcmVkAQEFMEVtcHR5VGFyZ2V0cwEBBThEdXBsaWNhdGVJbmRleAEBBURJbnZhbGlkU2xhc2hJbmRleAEBBUBJbnN1ZmZpY2llbnRCb25kAQEFME5vTW9yZUNodW5rcwEBBTROb1VubG9ja0NodW5rAQEFMEZ1bmRlZFRhcmdldAEBBUhJbnZhbGlkRXJhVG9SZXdhcmQBAQVoSW52YWxpZE51bWJlck9mTm9taW5hdGlvbnMBAQVITm90U29ydGVkQW5kVW5pcXVlAQEFOEFscmVhZHlDbGFpbWVkAQEFLEludmFsaWRQYWdlAQEFVEluY29ycmVjdEhpc3RvcnlEZXB0aAEBBVhJbmNvcnJlY3RTbGFzaGluZ1NwYW5zAQEFIEJhZFN0YXRlAQEFOFRvb01hbnlUYXJnZXRzAQEFJEJhZFRhcmdldAEBBUBDYW5ub3RDaGlsbE90aGVyAQEFRFRvb01hbnlOb21pbmF0b3JzAQEFRFRvb01hbnlWYWxpZGF0b3JzAQEFQENvbW1pc3Npb25Ub29Mb3cBAQUsQm91bmROb3RNZXQBAQVQQ29udHJvbGxlckRlcHJlY2F0ZWQBAQVMQ2Fubm90UmVzdG9yZUxlZGdlcgEBBWxSZXdhcmREZXN0aW5hdGlvblJlc3RyaWN0ZWQBAQU4Tm90RW5vdWdoRnVuZHMBAQVcVmlydHVhbFN0YWtlck5vdEFsbG93ZWQBAQU8Q2Fubm90UmVhcFN0YXNoAQEFPEFscmVhZHlNaWdyYXRlZAEBBShSZXN0cmljdGVkAQEFIE9mZmVuY2VzAQEFKEhpc3RvcmljYWwBAQUoUGFyYW1ldGVycwEBBRxTZXNzaW9uAQIUMEludmFsaWRQcm9vZgEBBVxOb0Fzc29jaWF0ZWRWYWxpZGF0b3JJZAEBBTREdXBsaWNhdGVkS2V5AQEFGE5vS2V5cwEBBSROb0FjY291bnQBAQUcR3JhbmRwYQECHCxQYXVzZUZhaWxlZAEBBTBSZXN1bWVGYWlsZWQBAQU0Q2hhbmdlUGVuZGluZwEBBRxUb29Tb29uAQEFYEludmFsaWRLZXlPd25lcnNoaXBQcm9vZgEBBWBJbnZhbGlkRXF1aXZvY2F0aW9uUHJvb2YBAQVYRHVwbGljYXRlT2ZmZW5jZVJlcG9ydAEBBUhBdXRob3JpdHlEaXNjb3ZlcnkBAQUcVXRpbGl0eQECBDBUb29NYW55Q2FsbHMBAQUgSWRlbnRpdHkBAnhIVG9vTWFueVN1YkFjY291bnRzAQEFIE5vdEZvdW5kAQEFIE5vdE5hbWVkAQEFKEVtcHR5SW5kZXgBAQUoRmVlQ2hhbmdlZAEBBShOb0lkZW50aXR5AQEFPFN0aWNreUp1ZGdlbWVudAEBBThKdWRnZW1lbnRHaXZlbgEBBUBJbnZhbGlkSnVkZ2VtZW50AQEFMEludmFsaWRJbmRleAEBBTRJbnZhbGlkVGFyZ2V0AQEFRFRvb01hbnlSZWdpc3RyYXJzAQEFOEFscmVhZHlDbGFpbWVkAQEFGE5vdFN1YgEBBSBOb3RPd25lZAEBBXRKdWRnZW1lbnRGb3JEaWZmZXJlbnRJZGVudGl0eQEBBVhKdWRnZW1lbnRQYXltZW50RmFpbGVkAQEFNEludmFsaWRTdWZmaXgBAQVQTm90VXNlcm5hbWVBdXRob3JpdHkBAQUwTm9BbGxvY2F0aW9uAQEFQEludmFsaWRTaWduYXR1cmUBAQVEUmVxdWlyZXNTaWduYXR1cmUBAQU8SW52YWxpZFVzZXJuYW1lAQEFNFVzZXJuYW1lVGFrZW4BAQUoTm9Vc2VybmFtZQEBBShOb3RFeHBpcmVkAQEFIFRvb0Vhcmx5AQEFME5vdFVuYmluZGluZwEBBUBBbHJlYWR5VW5iaW5kaW5nAQEFWEluc3VmZmljaWVudFByaXZpbGVnZXMBAQUgUmVjb3ZlcnkBAkAoTm90QWxsb3dlZAEBBTRaZXJvVGhyZXNob2xkAQEFQE5vdEVub3VnaEZyaWVuZHMBAQUoTWF4RnJpZW5kcwEBBSROb3RTb3J0ZWQBAQU4Tm90UmVjb3ZlcmFibGUBAQVIQWxyZWFkeVJlY292ZXJhYmxlAQEFOEFscmVhZHlTdGFydGVkAQEFKE5vdFN0YXJ0ZWQBAQUkTm90RnJpZW5kAQEFLERlbGF5UGVyaW9kAQEFOEFscmVhZHlWb3VjaGVkAQEFJFRocmVzaG9sZAEBBSxTdGlsbEFjdGl2ZQEBBTBBbHJlYWR5UHJveHkBAQUgQmFkU3RhdGUBAQUcVmVzdGluZwECFChOb3RWZXN0aW5nAQEFVEF0TWF4VmVzdGluZ1NjaGVkdWxlcwEBBSRBbW91bnRMb3cBAQVgU2NoZWR1bGVJbmRleE91dE9mQm91bmRzAQEFVEludmFsaWRTY2hlZHVsZVBhcmFtcwEBBSRTY2hlZHVsZXIBAhRARmFpbGVkVG9TY2hlZHVsZQEBBSBOb3RGb3VuZAEBBVxUYXJnZXRCbG9ja051bWJlckluUGFzdAEBBUhSZXNjaGVkdWxlTm9DaGFuZ2UBAQUUTmFtZWQBAQUgUHJlaW1hZ2UBAiAYVG9vQmlnAQEFMEFscmVhZHlOb3RlZAEBBTROb3RBdXRob3JpemVkAQEFIE5vdE5vdGVkAQEFJFJlcXVlc3RlZAEBBTBOb3RSZXF1ZXN0ZWQBAQUcVG9vTWFueQEBBRhUb29GZXcBAQUQU3VkbwECBCxSZXF1aXJlU3VkbwEBBRRQcm94eQECIBxUb29NYW55AQEFIE5vdEZvdW5kAQEFIE5vdFByb3h5AQEFLFVucHJveHlhYmxlAQEFJER1cGxpY2F0ZQEBBTBOb1Blcm1pc3Npb24BAQUsVW5hbm5vdW5jZWQBAQUsTm9TZWxmUHJveHkBAQUgTXVsdGlzaWcBAjhATWluaW11bVRocmVzaG9sZAEBBTxBbHJlYWR5QXBwcm92ZWQBAQVETm9BcHByb3ZhbHNOZWVkZWQBAQVEVG9vRmV3U2lnbmF0b3JpZXMBAQVIVG9vTWFueVNpZ25hdG9yaWVzAQEFVFNpZ25hdG9yaWVzT3V0T2ZPcmRlcgEBBUxTZW5kZXJJblNpZ25hdG9yaWVzAQEFIE5vdEZvdW5kAQEFIE5vdE93bmVyAQEFLE5vVGltZXBvaW50AQEFOFdyb25nVGltZXBvaW50AQEFTFVuZXhwZWN0ZWRUaW1lcG9pbnQBAQU8TWF4V2VpZ2h0VG9vTG93AQEFNEFscmVhZHlTdG9yZWQBAQVoRWxlY3Rpb25Qcm92aWRlck11bHRpUGhhc2UBAjxoUHJlRGlzcGF0Y2hFYXJseVN1Ym1pc3Npb24BAQVsUHJlRGlzcGF0Y2hXcm9uZ1dpbm5lckNvdW50AQEFZFByZURpc3BhdGNoV2Vha1N1Ym1pc3Npb24BAQU8U2lnbmVkUXVldWVGdWxsAQEFWFNpZ25lZENhbm5vdFBheURlcG9zaXQBAQVQU2lnbmVkSW52YWxpZFdpdG5lc3MBAQVMU2lnbmVkVG9vTXVjaFdlaWdodAEBBTxPY3dDYWxsV3JvbmdFcmEBAQVcTWlzc2luZ1NuYXBzaG90TWV0YWRhdGEBAQVYSW52YWxpZFN1Ym1pc3Npb25JbmRleAEBBThDYWxsTm90QWxsb3dlZAEBBThGYWxsYmFja0ZhaWxlZAEBBSxCb3VuZE5vdE1ldAEBBThUb29NYW55V2lubmVycwEBBWRQcmVEaXNwYXRjaERpZmZlcmVudFJvdW5kAQEFJFZvdGVyTGlzdAECCBBMaXN0AQIUJER1cGxpY2F0ZQEBBShOb3RIZWF2aWVyAQEFME5vdEluU2FtZUJhZwEBBTBOb2RlTm90Rm91bmQBAQUYTG9ja2VkAQEFGExvY2tlZAEBBTxOb21pbmF0aW9uUG9vbHMBApgwUG9vbE5vdEZvdW5kAQEFSFBvb2xNZW1iZXJOb3RGb3VuZAEBBUhSZXdhcmRQb29sTm90Rm91bmQBAQVAU3ViUG9vbHNOb3RGb3VuZAEBBWRBY2NvdW50QmVsb25nc1RvT3RoZXJQb29sAQEFOEZ1bGx5VW5ib25kaW5nAQEFRE1heFVuYm9uZGluZ0xpbWl0AQEFRENhbm5vdFdpdGhkcmF3QW55AQEFRE1pbmltdW1Cb25kTm90TWV0AQEFME92ZXJmbG93UmlzawEBBTROb3REZXN0cm95aW5nAQEFME5vdE5vbWluYXRvcgEBBVROb3RLaWNrZXJPckRlc3Ryb3lpbmcBAQUcTm90T3BlbgEBBSBNYXhQb29scwEBBThNYXhQb29sTWVtYmVycwEBBURDYW5Ob3RDaGFuZ2VTdGF0ZQEBBVREb2VzTm90SGF2ZVBlcm1pc3Npb24BAQVUTWV0YWRhdGFFeGNlZWRzTWF4TGVuAQEFJERlZmVuc2l2ZQECHGhOb3RFbm91Z2hTcGFjZUluVW5ib25kUG9vbAEBBTBQb29sTm90Rm91bmQBAQVIUmV3YXJkUG9vbE5vdEZvdW5kAQEFQFN1YlBvb2xzTm90Rm91bmQBAQVwQm9uZGVkU3Rhc2hLaWxsZWRQcmVtYXR1cmVseQEBBVREZWxlZ2F0aW9uVW5zdXBwb3J0ZWQBAQU8U2xhc2hOb3RBcHBsaWVkAQEFnFBhcnRpYWxVbmJvbmROb3RBbGxvd2VkUGVybWlzc2lvbmxlc3NseQEBBVxNYXhDb21taXNzaW9uUmVzdHJpY3RlZAEBBWBDb21taXNzaW9uRXhjZWVkc01heGltdW0BAQV4Q29tbWlzc2lvbkV4Y2VlZHNHbG9iYWxNYXhpbXVtAQEFZENvbW1pc3Npb25DaGFuZ2VUaHJvdHRsZWQBAQV4Q29tbWlzc2lvbkNoYW5nZVJhdGVOb3RBbGxvd2VkAQEFTE5vUGVuZGluZ0NvbW1pc3Npb24BAQVYTm9Db21taXNzaW9uQ3VycmVudFNldAEBBSxQb29sSWRJblVzZQEBBTRJbnZhbGlkUG9vbElkAQEFTEJvbmRFeHRyYVJlc3RyaWN0ZWQBAQU8Tm90aGluZ1RvQWRqdXN0AQEFOE5vdGhpbmdUb1NsYXNoAQEFLFNsYXNoVG9vTG93AQEFPEFscmVhZHlNaWdyYXRlZAEBBSxOb3RNaWdyYXRlZAEBBTBOb3RTdXBwb3J0ZWQBAQUoUmVzdHJpY3RlZAEBBSxGYXN0VW5zdGFrZQECGDROb3RDb250cm9sbGVyAQEFNEFscmVhZHlRdWV1ZWQBAQU4Tm90RnVsbHlCb25kZWQBAQUkTm90UXVldWVkAQEFLEFscmVhZHlIZWFkAQEFOENhbGxOb3RBbGxvd2VkAQEFQENvbnZpY3Rpb25Wb3RpbmcBAjAoTm90T25nb2luZwEBBSBOb3RWb3RlcgEBBTBOb1Blcm1pc3Npb24BAQU8Tm9QZXJtaXNzaW9uWWV0AQEFREFscmVhZHlEZWxlZ2F0aW5nAQEFNEFscmVhZHlWb3RpbmcBAQVESW5zdWZmaWNpZW50RnVuZHMBAQU0Tm90RGVsZWdhdGluZwEBBSBOb25zZW5zZQEBBTxNYXhWb3Rlc1JlYWNoZWQBAQUsQ2xhc3NOZWVkZWQBAQUgQmFkQ2xhc3MBAQUkUmVmZXJlbmRhAQI4KE5vdE9uZ29pbmcBAQUoSGFzRGVwb3NpdAEBBSBCYWRUcmFjawEBBRBGdWxsAQEFKFF1ZXVlRW1wdHkBAQU0QmFkUmVmZXJlbmR1bQEBBSxOb3RoaW5nVG9EbwEBBRxOb1RyYWNrAQEFKFVuZmluaXNoZWQBAQUwTm9QZXJtaXNzaW9uAQEFJE5vRGVwb3NpdAEBBSRCYWRTdGF0dXMBAQVAUHJlaW1hZ2VOb3RFeGlzdAEBBYRQcmVpbWFnZVN0b3JlZFdpdGhEaWZmZXJlbnRMZW5ndGgBAQUcT3JpZ2lucwEBBSRXaGl0ZWxpc3QBAhRMVW5hdmFpbGFibGVQcmVJbWFnZQEBBTxVbmRlY29kYWJsZUNhbGwBAQVgSW52YWxpZENhbGxXZWlnaHRXaXRuZXNzAQEFUENhbGxJc05vdFdoaXRlbGlzdGVkAQEFWENhbGxBbHJlYWR5V2hpdGVsaXN0ZWQBAQUgVHJlYXN1cnkBAiwwSW52YWxpZEluZGV4AQEFQFRvb01hbnlBcHByb3ZhbHMBAQVYSW5zdWZmaWNpZW50UGVybWlzc2lvbgEBBUxQcm9wb3NhbE5vdEFwcHJvdmVkAQEFWEZhaWxlZFRvQ29udmVydEJhbGFuY2UBAQUwU3BlbmRFeHBpcmVkAQEFLEVhcmx5UGF5b3V0AQEFQEFscmVhZHlBdHRlbXB0ZWQBAQUsUGF5b3V0RXJyb3IBAQUwTm90QXR0ZW1wdGVkAQEFMEluY29uY2x1c2l2ZQEBBUBEZWxlZ2F0ZWRTdGFraW5nAQIwKE5vdEFsbG93ZWQBAQU4QWxyZWFkeVN0YWtpbmcBAQVgSW52YWxpZFJld2FyZERlc3RpbmF0aW9uAQEFREludmFsaWREZWxlZ2F0aW9uAQEFOE5vdEVub3VnaEZ1bmRzAQEFIE5vdEFnZW50AQEFME5vdERlbGVnYXRvcgEBBSBCYWRTdGF0ZQEBBThVbmFwcGxpZWRTbGFzaAEBBThOb3RoaW5nVG9TbGFzaAEBBThXaXRoZHJhd0ZhaWxlZAEBBTBOb3RTdXBwb3J0ZWQBAQVAUGFyYWNoYWluc09yaWdpbgEBBTRDb25maWd1cmF0aW9uAQIEPEludmFsaWROZXdWYWx1ZQEBBSxQYXJhc1NoYXJlZAEBBTRQYXJhSW5jbHVzaW9uAQJEZFZhbGlkYXRvckluZGV4T3V0T2ZCb3VuZHMBAQVQVW5zY2hlZHVsZWRDYW5kaWRhdGUBAQVASGVhZERhdGFUb29MYXJnZQEBBVBQcmVtYXR1cmVDb2RlVXBncmFkZQEBBTxOZXdDb2RlVG9vTGFyZ2UBAQVURGlzYWxsb3dlZFJlbGF5UGFyZW50AQEFREludmFsaWRBc3NpZ25tZW50AQEFREludmFsaWRHcm91cEluZGV4AQEFTEluc3VmZmljaWVudEJhY2tpbmcBAQU4SW52YWxpZEJhY2tpbmcBAQVoVmFsaWRhdGlvbkRhdGFIYXNoTWlzbWF0Y2gBAQWASW5jb3JyZWN0RG93bndhcmRNZXNzYWdlSGFuZGxpbmcBAQVUSW52YWxpZFVwd2FyZE1lc3NhZ2VzAQEFYEhybXBXYXRlcm1hcmtNaXNoYW5kbGluZwEBBUxJbnZhbGlkT3V0Ym91bmRIcm1wAQEFZEludmFsaWRWYWxpZGF0aW9uQ29kZUhhc2gBAQVAUGFyYUhlYWRNaXNtYXRjaAEBBTBQYXJhSW5oZXJlbnQBAhBkVG9vTWFueUluY2x1c2lvbkluaGVyZW50cwEBBUxJbnZhbGlkUGFyZW50SGVhZGVyAQEFjEluaGVyZW50RGF0YUZpbHRlcmVkRHVyaW5nRXhlY3V0aW9uAQEFUFVuc2NoZWR1bGVkQ2FuZGlkYXRlAQEFNFBhcmFTY2hlZHVsZXIBAQUUUGFyYXMBAkA0Tm90UmVnaXN0ZXJlZAEBBTRDYW5ub3RPbmJvYXJkAQEFOENhbm5vdE9mZmJvYXJkAQEFNENhbm5vdFVwZ3JhZGUBAQU8Q2Fubm90RG93bmdyYWRlAQEFWFB2ZkNoZWNrU3RhdGVtZW50U3RhbGUBAQVcUHZmQ2hlY2tTdGF0ZW1lbnRGdXR1cmUBAQWEUHZmQ2hlY2tWYWxpZGF0b3JJbmRleE91dE9mQm91bmRzAQEFYFB2ZkNoZWNrSW52YWxpZFNpZ25hdHVyZQEBBUhQdmZDaGVja0RvdWJsZVZvdGUBAQVYUHZmQ2hlY2tTdWJqZWN0SW52YWxpZAEBBURDYW5ub3RVcGdyYWRlQ29kZQEBBSxJbnZhbGlkQ29kZQEBBUROb3RoaW5nQXV0aG9yaXplZAEBBTBVbmF1dGhvcml6ZWQBAQVISW52YWxpZEJsb2NrTnVtYmVyAQEFLEluaXRpYWxpemVyAQEFDERtcAEBBRBIcm1wAQJQVE9wZW5Icm1wQ2hhbm5lbFRvU2VsZgEBBXxPcGVuSHJtcENoYW5uZWxJbnZhbGlkUmVjaXBpZW50AQEFbE9wZW5Icm1wQ2hhbm5lbFplcm9DYXBhY2l0eQEBBYxPcGVuSHJtcENoYW5uZWxDYXBhY2l0eUV4Y2VlZHNMaW1pdAEBBXhPcGVuSHJtcENoYW5uZWxaZXJvTWVzc2FnZVNpemUBAQWYT3BlbkhybXBDaGFubmVsTWVzc2FnZVNpemVFeGNlZWRzTGltaXQBAQVwT3BlbkhybXBDaGFubmVsQWxyZWFkeUV4aXN0cwEBBXxPcGVuSHJtcENoYW5uZWxBbHJlYWR5UmVxdWVzdGVkAQEFcE9wZW5Icm1wQ2hhbm5lbExpbWl0RXhjZWVkZWQBAQVwQWNjZXB0SHJtcENoYW5uZWxEb2VzbnRFeGlzdAEBBYRBY2NlcHRIcm1wQ2hhbm5lbEFscmVhZHlDb25maXJtZWQBAQV4QWNjZXB0SHJtcENoYW5uZWxMaW1pdEV4Y2VlZGVkAQEFcENsb3NlSHJtcENoYW5uZWxVbmF1dGhvcml6ZWQBAQVsQ2xvc2VIcm1wQ2hhbm5lbERvZXNudEV4aXN0AQEFfENsb3NlSHJtcENoYW5uZWxBbHJlYWR5VW5kZXJ3YXkBAQWEQ2FuY2VsSHJtcE9wZW5DaGFubmVsVW5hdXRob3JpemVkAQEFaE9wZW5Icm1wQ2hhbm5lbERvZXNudEV4aXN0AQEFfE9wZW5Icm1wQ2hhbm5lbEFscmVhZHlDb25maXJtZWQBAQUwV3JvbmdXaXRuZXNzAQEFcENoYW5uZWxDcmVhdGlvbk5vdEF1dGhvcml6ZWQBAQU8UGFyYVNlc3Npb25JbmZvAQEFNFBhcmFzRGlzcHV0ZXMBAiR0RHVwbGljYXRlRGlzcHV0ZVN0YXRlbWVudFNldHMBAQVcQW5jaWVudERpc3B1dGVTdGF0ZW1lbnQBAQVkVmFsaWRhdG9ySW5kZXhPdXRPZkJvdW5kcwEBBUBJbnZhbGlkU2lnbmF0dXJlAQEFSER1cGxpY2F0ZVN0YXRlbWVudAEBBUhTaW5nbGVTaWRlZERpc3B1dGUBAQU8TWFsaWNpb3VzQmFja2VyAQEFTE1pc3NpbmdCYWNraW5nVm90ZXMBAQVIVW5jb25maXJtZWREaXNwdXRlAQEFNFBhcmFzU2xhc2hpbmcBAhhgSW52YWxpZEtleU93bmVyc2hpcFByb29mAQEFTEludmFsaWRTZXNzaW9uSW5kZXgBAQVQSW52YWxpZENhbmRpZGF0ZUhhc2gBAQVUSW52YWxpZFZhbGlkYXRvckluZGV4AQEFYFZhbGlkYXRvckluZGV4SWRNaXNtYXRjaAEBBVxEdXBsaWNhdGVTbGFzaGluZ1JlcG9ydAEBBWhPbkRlbWFuZEFzc2lnbm1lbnRQcm92aWRlcgECDCRRdWV1ZUZ1bGwBAQVwU3BvdFByaWNlSGlnaGVyVGhhbk1heEFtb3VudAEBBUxJbnN1ZmZpY2llbnRDcmVkaXRzAQEFaENvcmV0aW1lQXNzaWdubWVudFByb3ZpZGVyAQIIQEFzc2lnbm1lbnRzRW1wdHkBAQVARGlzYWxsb3dlZEluc2VydAEBBSRSZWdpc3RyYXIBAjg0Tm90UmVnaXN0ZXJlZAEBBURBbHJlYWR5UmVnaXN0ZXJlZAEBBSBOb3RPd25lcgEBBTBDb2RlVG9vTGFyZ2UBAQVASGVhZERhdGFUb29MYXJnZQEBBTBOb3RQYXJhY2hhaW4BAQU0Tm90UGFyYXRocmVhZAEBBUBDYW5ub3REZXJlZ2lzdGVyAQEFPENhbm5vdERvd25ncmFkZQEBBTRDYW5ub3RVcGdyYWRlAQEFKFBhcmFMb2NrZWQBAQUsTm90UmVzZXJ2ZWQBAQUsSW52YWxpZENvZGUBAQUoQ2Fubm90U3dhcAEBBRRTbG90cwECCERQYXJhTm90T25ib2FyZGluZwEBBShMZWFzZUVycm9yAQEFQFBhcmFzU3Vkb1dyYXBwZXIBAig8UGFyYURvZXNudEV4aXN0AQEFRFBhcmFBbHJlYWR5RXhpc3RzAQEFVEV4Y2VlZHNNYXhNZXNzYWdlU2l6ZQEBBShVbnJvdXRhYmxlAQEFOENvdWxkbnRDbGVhbnVwAQEFNE5vdFBhcmF0aHJlYWQBAQUwTm90UGFyYWNoYWluAQEFNENhbm5vdFVwZ3JhZGUBAQU8Q2Fubm90RG93bmdyYWRlAQEFMFRvb01hbnlDb3JlcwEBBSBBdWN0aW9ucwECHERBdWN0aW9uSW5Qcm9ncmVzcwEBBURMZWFzZVBlcmlvZEluUGFzdAEBBURQYXJhTm90UmVnaXN0ZXJlZAEBBUROb3RDdXJyZW50QXVjdGlvbgEBBShOb3RBdWN0aW9uAQEFMEF1Y3Rpb25FbmRlZAEBBUBBbHJlYWR5TGVhc2VkT3V0AQEFJENyb3dkbG9hbgECXERGaXJzdFBlcmlvZEluUGFzdAEBBWRGaXJzdFBlcmlvZFRvb0ZhckluRnV0dXJlAQEFbExhc3RQZXJpb2RCZWZvcmVGaXJzdFBlcmlvZAEBBWBMYXN0UGVyaW9kVG9vRmFySW5GdXR1cmUBAQU8Q2Fubm90RW5kSW5QYXN0AQEFREVuZFRvb0ZhckluRnV0dXJlAQEFIE92ZXJmbG93AQEFUENvbnRyaWJ1dGlvblRvb1NtYWxsAQEFNEludmFsaWRQYXJhSWQBAQUsQ2FwRXhjZWVkZWQBAQVYQ29udHJpYnV0aW9uUGVyaW9kT3ZlcgEBBTRJbnZhbGlkT3JpZ2luAQEFME5vdFBhcmFjaGFpbgEBBSxMZWFzZUFjdGl2ZQEBBUBCaWRPckxlYXNlQWN0aXZlAQEFMEZ1bmROb3RFbmRlZAEBBTxOb0NvbnRyaWJ1dGlvbnMBAQVITm90UmVhZHlUb0Rpc3NvbHZlAQEFQEludmFsaWRTaWduYXR1cmUBAQUwTWVtb1Rvb0xhcmdlAQEFREFscmVhZHlJbk5ld1JhaXNlAQEFSFZyZkRlbGF5SW5Qcm9ncmVzcwEBBTROb0xlYXNlUGVyaW9kAQEFNEFzc2lnbmVkU2xvdHMBAiQ8UGFyYURvZXNudEV4aXN0AQEFNE5vdFBhcmF0aHJlYWQBAQU0Q2Fubm90VXBncmFkZQEBBTxDYW5ub3REb3duZ3JhZGUBAQVMU2xvdEFscmVhZHlBc3NpZ25lZAEBBTxTbG90Tm90QXNzaWduZWQBAQVIT25nb2luZ0xlYXNlRXhpc3RzAQEFZE1heFBlcm1hbmVudFNsb3RzRXhjZWVkZWQBAQVkTWF4VGVtcG9yYXJ5U2xvdHNFeGNlZWRlZAEBBSBDb3JldGltZQECDCROb3RCcm9rZXIBAQVYUmVxdWVzdGVkRnV0dXJlUmV2ZW51ZQEBBUxBc3NldFRyYW5zZmVyRmFpbGVkAQEFPFN0YWtpbmdBaENsaWVudAECBBxCbG9ja2VkAQEFUE11bHRpQmxvY2tNaWdyYXRpb25zAQIEHE9uZ29pbmcBAQUkWGNtUGFsbGV0AQJwLFVucmVhY2hhYmxlAQEFLFNlbmRGYWlsdXJlAQEFIEZpbHRlcmVkAQEFSFVud2VpZ2hhYmxlTWVzc2FnZQEBBWBEZXN0aW5hdGlvbk5vdEludmVydGlibGUBAQUURW1wdHkBAQU4Q2Fubm90UmVhbmNob3IBAQU0VG9vTWFueUFzc2V0cwEBBTRJbnZhbGlkT3JpZ2luAQEFKEJhZFZlcnNpb24BAQUsQmFkTG9jYXRpb24BAQU4Tm9TdWJzY3JpcHRpb24BAQVEQWxyZWFkeVN1YnNjcmliZWQBAQVYQ2Fubm90Q2hlY2tPdXRUZWxlcG9ydAEBBShMb3dCYWxhbmNlAQEFMFRvb01hbnlMb2NrcwEBBUxBY2NvdW50Tm90U292ZXJlaWduAQEFKEZlZXNOb3RNZXQBAQUwTG9ja05vdEZvdW5kAQEFFEluVXNlAQEFaEludmFsaWRBc3NldFVua25vd25SZXNlcnZlAQEFeEludmFsaWRBc3NldFVuc3VwcG9ydGVkUmVzZXJ2ZQEBBTxUb29NYW55UmVzZXJ2ZXMBAQVgTG9jYWxFeGVjdXRpb25JbmNvbXBsZXRlAQEFYFRvb01hbnlBdXRob3JpemVkQWxpYXNlcwEBBTRFeHBpcmVzSW5QYXN0AQEFNEFsaWFzTm90Rm91bmQBAQWETG9jYWxFeGVjdXRpb25JbmNvbXBsZXRlV2l0aEVycm9yAQAIFGluZGV4BBRlcnJvcuUNME1lc3NhZ2VRdWV1ZQECJCxOb3RSZWFwYWJsZQEBBRhOb1BhZ2UBAQUkTm9NZXNzYWdlAQEFQEFscmVhZHlQcm9jZXNzZWQBAQUYUXVldWVkAQEFSEluc3VmZmljaWVudFdlaWdodAEBBWBUZW1wb3JhcmlseVVucHJvY2Vzc2FibGUBAQUsUXVldWVQYXVzZWQBAQVMUmVjdXJzaXZlRGlzYWxsb3dlZAEBBSRBc3NldFJhdGUBAgxAVW5rbm93bkFzc2V0S2luZAEBBTRBbHJlYWR5RXhpc3RzAQEFIE92ZXJmbG93AQEFLFJvb3RUZXN0aW5nAQEFGE1ldGFUeAECGCBCYWRQcm9vZgEBBRhGdXR1cmUBAQUUU3RhbGUBAQVEQW5jaWVudEJpcnRoQmxvY2sBAQU0VW5rbm93bk9yaWdpbgEBBRxJbnZhbGlkAQEFPFZlcmlmeVNpZ25hdHVyZQEBBRRCZWVmeQECHGBJbnZhbGlkS2V5T3duZXJzaGlwUHJvb2YBAQVgSW52YWxpZERvdWJsZVZvdGluZ1Byb29mAQEFWEludmFsaWRGb3JrVm90aW5nUHJvb2YBAQV0SW52YWxpZEZ1dHVyZUJsb2NrVm90aW5nUHJvb2YBAQV8SW52YWxpZEVxdWl2b2NhdGlvblByb29mU2Vzc2lvbgEBBVhEdXBsaWNhdGVPZmZlbmNlUmVwb3J0AQEFUEludmFsaWRDb25maWd1cmF0aW9uAQEFDE1tcgEBBTBCZWVmeU1tckxlYWYBAQVASWRlbnRpdHlNaWdyYXRvcgEBBURDb25zdW1lclJlbWFpbmluZwEBBSxOb1Byb3ZpZGVycwEBBUBUb29NYW55Q29uc3VtZXJzAQEFFFRva2VuAQIoQEZ1bmRzVW5hdmFpbGFibGUBAQUwT25seVByb3ZpZGVyAQEFMEJlbG93TWluaW11bQEBBTBDYW5ub3RDcmVhdGUBAQUwVW5rbm93bkFzc2V0AQEFGEZyb3plbgEBBSxVbnN1cHBvcnRlZAEBBUBDYW5ub3RDcmVhdGVIb2xkAQEFNE5vdEV4cGVuZGFibGUBAQUcQmxvY2tlZAEBBShBcml0aG1ldGljAQIMJFVuZGVyZmxvdwEBBSBPdmVyZmxvdwEBBThEaXZpc2lvbkJ5WmVybwEBBTRUcmFuc2FjdGlvbmFsAQIIMExpbWl0UmVhY2hlZAEBBRxOb0xheWVyAQEFJEV4aGF1c3RlZAEBBShDb3JydXB0aW9uAQEFLFVuYXZhaWxhYmxlAQEFOFJvb3ROb3RBbGxvd2VkAQEFEFRyaWUBAjhASW52YWxpZFN0YXRlUm9vdAEBBUhJbmNvbXBsZXRlRGF0YWJhc2UBAQVQVmFsdWVBdEluY29tcGxldGVLZXkBAQUwRGVjb2RlckVycm9yAQEFLEludmFsaWRIYXNoAQEFMER1cGxpY2F0ZUtleQEBBThFeHRyYW5lb3VzTm9kZQEBBTxFeHRyYW5lb3VzVmFsdWUBAQVcRXh0cmFuZW91c0hhc2hSZWZlcmVuY2UBAQVUSW52YWxpZENoaWxkUmVmZXJlbmNlAQEFNFZhbHVlTWlzbWF0Y2gBAQU8SW5jb21wbGV0ZVByb29mAQEFMFJvb3RNaXNtYXRjaAEBBSxEZWNvZGVFcnJvcgEBBQIgQEV4dHJpbnNpY1N1Y2Nlc3MBAAQ0ZGlzcGF0Y2hfaW5mb0A8RXh0cmluc2ljRmFpbGVkAQAIOGRpc3BhdGNoX2Vycm9y/Q00ZGlzcGF0Y2hfaW5mb0AsQ29kZVVwZGF0ZWQBAQUoTmV3QWNjb3VudAEABBxhY2NvdW50ADRLaWxsZWRBY2NvdW50AQAEHGFjY291bnQAIFJlbWFya2VkAQAIGHNlbmRlcgAQaGFzaCBEVXBncmFkZUF1dGhvcml6ZWQBAAgkY29kZV9oYXNoIDRjaGVja192ZXJzaW9uFIBSZWplY3RlZEludmFsaWRBdXRob3JpemVkVXBncmFkZQEACCRjb2RlX2hhc2ggFGVycm9y/Q0CEDRJbmRleEFzc2lnbmVkAQAIDHdobwAUaW5kZXgEKEluZGV4RnJlZWQBAAQUaW5kZXgELEluZGV4RnJvemVuAQAIFGluZGV4BAx3aG8AMERlcG9zaXRQb2tlZAEAEAx3aG8AFGluZGV4BCxvbGRfZGVwb3NpdAgsbmV3X2RlcG9zaXQIAkwcRXJhUGFpZAEADCRlcmFfaW5kZXgEQHZhbGlkYXRvcl9wYXlvdXQIJHJlbWFpbmRlcgggUmV3YXJkZWQBAAwUc3Rhc2gAEGRlc3Q1ARhhbW91bnQIHFNsYXNoZWQBAAgYc3Rha2VyABhhbW91bnQINFNsYXNoUmVwb3J0ZWQBAAwkdmFsaWRhdG9yACBmcmFjdGlvbgQkc2xhc2hfZXJhBGhPbGRTbGFzaGluZ1JlcG9ydERpc2NhcmRlZAEABDRzZXNzaW9uX2luZGV4BDhTdGFrZXJzRWxlY3RlZAEBBRhCb25kZWQBAAgUc3Rhc2gAGGFtb3VudAggVW5ib25kZWQBAAgUc3Rhc2gAGGFtb3VudAgkV2l0aGRyYXduAQAIFHN0YXNoABhhbW91bnQIGEtpY2tlZAEACCRub21pbmF0b3IAFHN0YXNoAFRTdGFraW5nRWxlY3Rpb25GYWlsZWQBAQUcQ2hpbGxlZAEABBRzdGFzaAA0UGF5b3V0U3RhcnRlZAEAECRlcmFfaW5kZXgEPHZhbGlkYXRvcl9zdGFzaAAQcGFnZQQQbmV4dC0ERFZhbGlkYXRvclByZWZzU2V0AQAIFHN0YXNoABRwcmVmczkBaFNuYXBzaG90Vm90ZXJzU2l6ZUV4Y2VlZGVkAQAEEHNpemUEbFNuYXBzaG90VGFyZ2V0c1NpemVFeGNlZWRlZAEABBBzaXplBCBGb3JjZUVyYQEABBBtb2RlPQFkQ29udHJvbGxlckJhdGNoRGVwcmVjYXRlZAEABCBmYWlsdXJlcwRAQ3VycmVuY3lNaWdyYXRlZAEACBRzdGFzaAA4Zm9yY2Vfd2l0aGRyYXcIAggoUm9vdFN0b3JlZAEABBRpbmRleAQsUm9vdHNQcnVuZWQBAAQUdXBfdG8EAhAoTmV3U2Vzc2lvbgEABDRzZXNzaW9uX2luZGV4BCROZXdRdWV1ZWQBAQVEVmFsaWRhdG9yRGlzYWJsZWQBAAQkdmFsaWRhdG9yAEhWYWxpZGF0b3JSZWVuYWJsZWQBAAQkdmFsaWRhdG9yAAcVAf0NAiBAQmF0Y2hJbnRlcnJ1cHRlZAEACBRpbmRleAQUZXJyb3L9DThCYXRjaENvbXBsZXRlZAEBBWBCYXRjaENvbXBsZXRlZFdpdGhFcnJvcnMBAQU0SXRlbUNvbXBsZXRlZAEBBShJdGVtRmFpbGVkAQAEFGVycm9y/Q0wRGlzcGF0Y2hlZEFzAQAEGHJlc3VsdBUORElmRWxzZU1haW5TdWNjZXNzAQEFUElmRWxzZUZhbGxiYWNrQ2FsbGVkAQAEKG1haW5fZXJyb3L9DQJYLElkZW50aXR5U2V0AQAEDHdobwA8SWRlbnRpdHlDbGVhcmVkAQAIDHdobwAcZGVwb3NpdAg4SWRlbnRpdHlLaWxsZWQBAAgMd2hvABxkZXBvc2l0CEhKdWRnZW1lbnRSZXF1ZXN0ZWQBAAgMd2hvADxyZWdpc3RyYXJfaW5kZXgEUEp1ZGdlbWVudFVucmVxdWVzdGVkAQAIDHdobwA8cmVnaXN0cmFyX2luZGV4BDhKdWRnZW1lbnRHaXZlbgEACBh0YXJnZXQAPHJlZ2lzdHJhcl9pbmRleAQ4UmVnaXN0cmFyQWRkZWQBAAQ8cmVnaXN0cmFyX2luZGV4BEBTdWJJZGVudGl0eUFkZGVkAQAMDHN1YgAQbWFpbgAcZGVwb3NpdAhAU3ViSWRlbnRpdGllc1NldAEADBBtYWluADhudW1iZXJfb2Zfc3VicwQsbmV3X2RlcG9zaXQISFN1YklkZW50aXR5UmVuYW1lZAEACAxzdWIAEG1haW4ASFN1YklkZW50aXR5UmVtb3ZlZAEADAxzdWIAEG1haW4AHGRlcG9zaXQISFN1YklkZW50aXR5UmV2b2tlZAEADAxzdWIAEG1haW4AHGRlcG9zaXQIOEF1dGhvcml0eUFkZGVkAQAEJGF1dGhvcml0eQBAQXV0aG9yaXR5UmVtb3ZlZAEABCRhdXRob3JpdHkALFVzZXJuYW1lU2V0AQAIDHdobwAgdXNlcm5hbWUkOFVzZXJuYW1lUXVldWVkAQAMDHdobwAgdXNlcm5hbWUkKGV4cGlyYXRpb24ESFByZWFwcHJvdmFsRXhwaXJlZAEABBR3aG9zZQBIUHJpbWFyeVVzZXJuYW1lU2V0AQAIDHdobwAgdXNlcm5hbWUkXERhbmdsaW5nVXNlcm5hbWVSZW1vdmVkAQAIDHdobwAgdXNlcm5hbWUkPFVzZXJuYW1lVW5ib3VuZAEABCB1c2VybmFtZSQ8VXNlcm5hbWVSZW1vdmVkAQAEIHVzZXJuYW1lJDhVc2VybmFtZUtpbGxlZAEABCB1c2VybmFtZSQCCDhSZWNvdmVyeUNvbmZpZwEBBURBY3RpdmVSZWNvdmVyeUZvcgEBAQIcPFJlY292ZXJ5Q3JlYXRlZAEABBxhY2NvdW50AERSZWNvdmVyeUluaXRpYXRlZAEACDBsb3N0X2FjY291bnQAPHJlc2N1ZXJfYWNjb3VudAA8UmVjb3ZlcnlWb3VjaGVkAQAMMGxvc3RfYWNjb3VudAA8cmVzY3Vlcl9hY2NvdW50ABhzZW5kZXIAOFJlY292ZXJ5Q2xvc2VkAQAIMGxvc3RfYWNjb3VudAA8cmVzY3Vlcl9hY2NvdW50AEBBY2NvdW50UmVjb3ZlcmVkAQAIMGxvc3RfYWNjb3VudAA8cmVzY3Vlcl9hY2NvdW50ADxSZWNvdmVyeVJlbW92ZWQBAAQwbG9zdF9hY2NvdW50ADBEZXBvc2l0UG9rZWQBABAMd2hvABBraW5kIQ4sb2xkX2RlcG9zaXQILG5ld19kZXBvc2l0CAIMOFZlc3RpbmdDcmVhdGVkAQAIHGFjY291bnQAOHNjaGVkdWxlX2luZGV4BDhWZXN0aW5nVXBkYXRlZAEACBxhY2NvdW50ACB1bnZlc3RlZAhAVmVzdGluZ0NvbXBsZXRlZAEABBxhY2NvdW50AAIoJFNjaGVkdWxlZAEACBB3aGVuBBRpbmRleAQgQ2FuY2VsZWQBAAgQd2hlbgQUaW5kZXgEKERpc3BhdGNoZWQBAAwQdGFzaw0BCGlkEQEYcmVzdWx0FQ4gUmV0cnlTZXQBABAQdGFzaw0BCGlkEQEYcGVyaW9kBBxyZXRyaWVzBDhSZXRyeUNhbmNlbGxlZAEACBB0YXNrDQEIaWQRATxDYWxsVW5hdmFpbGFibGUBAAgQdGFzaw0BCGlkEQE4UGVyaW9kaWNGYWlsZWQBAAgQdGFzaw0BCGlkEQEsUmV0cnlGYWlsZWQBAAgQdGFzaw0BCGlkEQFUUGVybWFuZW50bHlPdmVyd2VpZ2h0AQAIEHRhc2sNAQhpZBEBQEFnZW5kYUluY29tcGxldGUBAAQQd2hlbgQCEBRTdWRpZAEABCxzdWRvX3Jlc3VsdBUOKEtleUNoYW5nZWQBAAgMb2xkBQIMbmV3AChLZXlSZW1vdmVkAQEFKFN1ZG9Bc0RvbmUBAAQsc3Vkb19yZXN1bHQVDgIoDEFueQEBBSxOb25UcmFuc2ZlcgEBBShHb3Zlcm5hbmNlAQEFHFN0YWtpbmcBAQUwU3Vkb0JhbGFuY2VzAQEFRElkZW50aXR5SnVkZ2VtZW50AQEFLENhbmNlbFByb3h5AQEFHEF1Y3Rpb24BAQU8Tm9taW5hdGlvblBvb2xzAQEFQFBhcmFSZWdpc3RyYXRpb24BAQUCCBxQcm94aWVzAQEFNEFubm91bmNlbWVudHMBAQUCHDRQcm94eUV4ZWN1dGVkAQAEGHJlc3VsdBUOLFB1cmVDcmVhdGVkAQAQEHB1cmUADHdobwAocHJveHlfdHlwZTUOUGRpc2FtYmlndWF0aW9uX2luZGV4BChQdXJlS2lsbGVkAQAQEHB1cmUAHHNwYXduZXIAKHByb3h5X3R5cGU1DlBkaXNhbWJpZ3VhdGlvbl9pbmRleAQkQW5ub3VuY2VkAQAMEHJlYWwAFHByb3h5ACRjYWxsX2hhc2ggKFByb3h5QWRkZWQBABAkZGVsZWdhdG9yACRkZWxlZ2F0ZWUAKHByb3h5X3R5cGU1DhRkZWxheQQwUHJveHlSZW1vdmVkAQAQJGRlbGVnYXRvcgAkZGVsZWdhdGVlAChwcm94eV90eXBlNQ4UZGVsYXkEMERlcG9zaXRQb2tlZAEAEAx3aG8AEGtpbmQ5DixvbGRfZGVwb3NpdAgsbmV3X2RlcG9zaXQIAhQsTmV3TXVsdGlzaWcBAAwkYXBwcm92aW5nACBtdWx0aXNpZwAkY2FsbF9oYXNoIEBNdWx0aXNpZ0FwcHJvdmFsAQAQJGFwcHJvdmluZwAkdGltZXBvaW508QEgbXVsdGlzaWcAJGNhbGxfaGFzaCBATXVsdGlzaWdFeGVjdXRlZAEAFCRhcHByb3ZpbmcAJHRpbWVwb2ludPEBIG11bHRpc2lnACRjYWxsX2hhc2ggGHJlc3VsdBUORE11bHRpc2lnQ2FuY2VsbGVkAQAQKGNhbmNlbGxpbmcAJHRpbWVwb2ludPEBIG11bHRpc2lnACRjYWxsX2hhc2ggMERlcG9zaXRQb2tlZAEAEAx3aG8AJGNhbGxfaGFzaCAsb2xkX2RlcG9zaXQILG5ld19kZXBvc2l0CAJcHENyZWF0ZWQBAAgkZGVwb3NpdG9yABxwb29sX2lkBBhCb25kZWQBABAYbWVtYmVyABxwb29sX2lkBBhib25kZWQIGGpvaW5lZBQcUGFpZE91dAEADBhtZW1iZXIAHHBvb2xfaWQEGHBheW91dAggVW5ib25kZWQBABQYbWVtYmVyABxwb29sX2lkBBxiYWxhbmNlCBhwb2ludHMIDGVyYQQkV2l0aGRyYXduAQAQGG1lbWJlcgAccG9vbF9pZAQcYmFsYW5jZQgYcG9pbnRzCCREZXN0cm95ZWQBAAQccG9vbF9pZAQwU3RhdGVDaGFuZ2VkAQAIHHBvb2xfaWQEJG5ld19zdGF0ZR0CNE1lbWJlclJlbW92ZWQBAAwccG9vbF9pZAQYbWVtYmVyAEByZWxlYXNlZF9iYWxhbmNlCDBSb2xlc1VwZGF0ZWQBAAwQcm9vdAUCHGJvdW5jZXIFAiRub21pbmF0b3IFAixQb29sU2xhc2hlZAEACBxwb29sX2lkBBxiYWxhbmNlCFBVbmJvbmRpbmdQb29sU2xhc2hlZAEADBxwb29sX2lkBAxlcmEEHGJhbGFuY2UIVFBvb2xDb21taXNzaW9uVXBkYXRlZAEACBxwb29sX2lkBBxjdXJyZW50JQJgUG9vbE1heENvbW1pc3Npb25VcGRhdGVkAQAIHHBvb2xfaWQEOG1heF9jb21taXNzaW9uBHxQb29sQ29tbWlzc2lvbkNoYW5nZVJhdGVVcGRhdGVkAQAIHHBvb2xfaWQELGNoYW5nZV9yYXRlKQKQUG9vbENvbW1pc3Npb25DbGFpbVBlcm1pc3Npb25VcGRhdGVkAQAIHHBvb2xfaWQEKHBlcm1pc3Npb24xAlRQb29sQ29tbWlzc2lvbkNsYWltZWQBAAgccG9vbF9pZAQoY29tbWlzc2lvbghkTWluQmFsYW5jZURlZmljaXRBZGp1c3RlZAEACBxwb29sX2lkBBhhbW91bnQIYE1pbkJhbGFuY2VFeGNlc3NBZGp1c3RlZAEACBxwb29sX2lkBBhhbW91bnQIcE1lbWJlckNsYWltUGVybWlzc2lvblVwZGF0ZWQBAAgYbWVtYmVyAChwZXJtaXNzaW9uiQU8TWV0YWRhdGFVcGRhdGVkAQAIHHBvb2xfaWQEGGNhbGxlcgBIUG9vbE5vbWluYXRpb25NYWRlAQAIHHBvb2xfaWQEGGNhbGxlcgBQUG9vbE5vbWluYXRvckNoaWxsZWQBAAgccG9vbF9pZAQYY2FsbGVyAExHbG9iYWxQYXJhbXNVcGRhdGVkAQAYNG1pbl9qb2luX2JvbmQIPG1pbl9jcmVhdGVfYm9uZAgkbWF4X3Bvb2xzLQQsbWF4X21lbWJlcnMtBFBtYXhfbWVtYmVyc19wZXJfcG9vbC0EVGdsb2JhbF9tYXhfY29tbWlzc2lvbi0EAhQgVW5zdGFrZWQBAAgUc3Rhc2gAGHJlc3VsdBUOHFNsYXNoZWQBAAgUc3Rhc2gAGGFtb3VudAgwQmF0Y2hDaGVja2VkAQAEEGVyYXM5AjRCYXRjaEZpbmlzaGVkAQAEEHNpemUENEludGVybmFsRXJyb3IBAQUCFCREZWxlZ2F0ZWQBBAABCCxVbmRlbGVnYXRlZAEBARRWb3RlZAEACAx3aG8AEHZvdGU1BCxWb3RlUmVtb3ZlZAEACAx3aG8AEHZvdGU1BDBWb3RlVW5sb2NrZWQBAAgMd2hvABRjbGFzcwQACCRwb3N0X2luZm+1ARRlcnJvcv0NB7UBUQ4CDDxDYWxsV2hpdGVsaXN0ZWQBAAQkY2FsbF9oYXNoIFhXaGl0ZWxpc3RlZENhbGxSZW1vdmVkAQAEJGNhbGxfaGFzaCBkV2hpdGVsaXN0ZWRDYWxsRGlzcGF0Y2hlZAEACCRjYWxsX2hhc2ggGHJlc3VsdFUOAiAkQnlHZW5lc2lzAQUBgBhCeUZvcmsBAAgwYmxvY2tfbnVtYmVyCChibG9ja19oYXNoICBQb2xrYWRvdAEBBRhLdXNhbWEBAQUgRXRoZXJldW0BAAQgY2hhaW5faWQILEJpdGNvaW5Db3JlAQEFLEJpdGNvaW5DYXNoAQEFQFBvbGthZG90QnVsbGV0aW4BAQUGXQ4CKCRQYXJhY2hhaW4BAQIsQWNjb3VudElkMzIBAAgcbmV0d29ya2EOCGlkIDhBY2NvdW50SW5kZXg2NAEACBxuZXR3b3JrYQ4UaW5kZXgIMEFjY291bnRLZXkyMAEACBxuZXR3b3JrYQ4Ma2V5ZQE4UGFsbGV0SW5zdGFuY2UBAQIwR2VuZXJhbEluZGV4AQEDKEdlbmVyYWxLZXkBAAgYbGVuZ3RoBBBkYXRhICRPbmx5Q2hpbGQBAQUkUGx1cmFsaXR5AQAICGlkaQEQcGFydG0BPEdsb2JhbENvbnNlbnN1cwECICRCeUdlbmVzaXMBBQGAGEJ5Rm9yawEACDBibG9ja19udW1iZXIIKGJsb2NrX2hhc2ggIFBvbGthZG90AQEFGEt1c2FtYQEBBSBFdGhlcmV1bQEABCBjaGFpbl9pZAgsQml0Y29pbkNvcmUBAQUsQml0Y29pbkNhc2gBAQVAUG9sa2Fkb3RCdWxsZXRpbgEBBQRlDgEIBGUOAQwEZQ4BEARlDgEUBGUOARgEZQ4BHARlDgEgAiQQSGVyZQEBBQhYMQECKCRQYXJhY2hhaW4BAQIsQWNjb3VudElkMzIBAAgcbmV0d29ya2EOCGlkIDhBY2NvdW50SW5kZXg2NAEACBxuZXR3b3JrYQ4UaW5kZXgIMEFjY291bnRLZXkyMAEACBxuZXR3b3JrYQ4Ma2V5ZQE4UGFsbGV0SW5zdGFuY2UBAQIwR2VuZXJhbEluZGV4AQEDKEdlbmVyYWxLZXkBAAgYbGVuZ3RoBBBkYXRhICRPbmx5Q2hpbGQBAQUkUGx1cmFsaXR5AQAICGlkaQEQcGFydG0BPEdsb2JhbENvbnNlbnN1cwECICRCeUdlbmVzaXMBBQGAGEJ5Rm9yawEACDBibG9ja19udW1iZXIIKGJsb2NrX2hhc2ggIFBvbGthZG90AQEFGEt1c2FtYQEBBSBFdGhlcmV1bQEABCBjaGFpbl9pZAgsQml0Y29pbkNvcmUBAQUsQml0Y29pbkNhc2gBAQVAUG9sa2Fkb3RCdWxsZXRpbgEBBQhYMgEEZQ4BCAhYMwEEZQ4BDAhYNAEEZQ4BEAhYNQEEZQ4BFAhYNgEEZQ4BGAhYNwEEZQ4BHAhYOAEEZQ4BIAAIHHBhcmVudHMEIGludGVyaW9yhQ4CDAhWMwEACCBsb2NhdGlvbnkBIGFzc2V0X2lkfQEIVjQBAAggbG9jYXRpb255ASBhc3NldF9pZHkBCFY1AQAIIGxvY2F0aW9uiQ4gYXNzZXRfaWSJDgIMCFYzAQAIHHBhcmVudHMEIGludGVyaW9ydQEIVjQBAAgccGFyZW50cwQgaW50ZXJpb3J1AQhWNQEACBxwYXJlbnRzBCBpbnRlcmlvcoUOAjAgU3BlbmRpbmcBAARAYnVkZ2V0X3JlbWFpbmluZwgcQXdhcmRlZAEADDhwcm9wb3NhbF9pbmRleAQUYXdhcmQIHGFjY291bnQAFEJ1cm50AQAELGJ1cm50X2Z1bmRzCCBSb2xsb3ZlcgEABEByb2xsb3Zlcl9iYWxhbmNlCBxEZXBvc2l0AQAEFHZhbHVlCDRTcGVuZEFwcHJvdmVkAQAMOHByb3Bvc2FsX2luZGV4BBhhbW91bnQILGJlbmVmaWNpYXJ5ADxVcGRhdGVkSW5hY3RpdmUBAAgscmVhY3RpdmF0ZWQILGRlYWN0aXZhdGVkCEhBc3NldFNwZW5kQXBwcm92ZWQBABgUaW5kZXgEKGFzc2V0X2tpbmSNDhhhbW91bnQILGJlbmVmaWNpYXJ5kQ4odmFsaWRfZnJvbQQkZXhwaXJlX2F0BEBBc3NldFNwZW5kVm9pZGVkAQAEFGluZGV4BBBQYWlkAQAIFGluZGV4BChwYXltZW50X2lkCDRQYXltZW50RmFpbGVkAQAIFGluZGV4BChwYXltZW50X2lkCDhTcGVuZFByb2Nlc3NlZAEABBRpbmRleAQCECREZWxlZ2F0ZWQBAAwUYWdlbnQAJGRlbGVnYXRvcgAYYW1vdW50CCBSZWxlYXNlZAEADBRhZ2VudAAkZGVsZWdhdG9yABhhbW91bnQIHFNsYXNoZWQBAAwUYWdlbnQAJGRlbGVnYXRvcgAYYW1vdW50CEhNaWdyYXRlZERlbGVnYXRpb24BAAwUYWdlbnQAJGRlbGVnYXRvcgAYYW1vdW50CAUBZAAwHHBhcmFfaWQEMHJlbGF5X3BhcmVudCAcdmVyc2lvbgQoY29yZV9pbmRleAQ0c2Vzc2lvbl9pbmRleAQkcmVzZXJ2ZWQxnQ54cGVyc2lzdGVkX3ZhbGlkYXRpb25fZGF0YV9oYXNoICBwb3ZfaGFzaCAwZXJhc3VyZV9yb290ICRyZXNlcnZlZDJBAiRwYXJhX2hlYWQgUHZhbGlkYXRpb25fY29kZV9oYXNoIAAIKGRlc2NyaXB0b3KhDkBjb21taXRtZW50c19oYXNoIAIQPENhbmRpZGF0ZUJhY2tlZAEDEKUOJAQERENhbmRpZGF0ZUluY2x1ZGVkAQMQpQ4kBAREQ2FuZGlkYXRlVGltZWRPdXQBAwylDiQEWFVwd2FyZE1lc3NhZ2VzUmVjZWl2ZWQBAAgQZnJvbQQUY291bnQEAihIQ3VycmVudENvZGVVcGRhdGVkAQECSEN1cnJlbnRIZWFkVXBkYXRlZAEBAlBDb2RlVXBncmFkZVNjaGVkdWxlZAEBAjBOZXdIZWFkTm90ZWQBAQIwQWN0aW9uUXVldWVkAQQEAQg8UHZmQ2hlY2tTdGFydGVkAQMIIARAUHZmQ2hlY2tBY2NlcHRlZAEDCCAEQFB2ZkNoZWNrUmVqZWN0ZWQBAwggBFhVcGdyYWRlQ29vbGRvd25SZW1vdmVkAQAEHHBhcmFfaWQEOENvZGVBdXRob3JpemVkAQAMHHBhcmFfaWQEJGNvZGVfaGFzaCAkZXhwaXJlX2F0BAIMTE9uRGVtYW5kT3JkZXJQbGFjZWQBAAwccGFyYV9pZAQoc3BvdF9wcmljZQgob3JkZXJlZF9ieQAwU3BvdFByaWNlU2V0AQAEKHNwb3RfcHJpY2UIPEFjY291bnRDcmVkaXRlZAEACAx3aG8AGGFtb3VudAgCKBxDcmVhdGVkAQAEHHBhcmFfaWQELENvbnRyaWJ1dGVkAQAMDHdobwAoZnVuZF9pbmRleAQYYW1vdW50CCBXaXRoZHJldwEADAx3aG8AKGZ1bmRfaW5kZXgEGGFtb3VudAhEUGFydGlhbGx5UmVmdW5kZWQBAAQccGFyYV9pZAQsQWxsUmVmdW5kZWQBAAQccGFyYV9pZAQkRGlzc29sdmVkAQAEHHBhcmFfaWQEPEhhbmRsZUJpZFJlc3VsdAEACBxwYXJhX2lkBBhyZXN1bHQVDhhFZGl0ZWQBAAQccGFyYV9pZAQsTWVtb1VwZGF0ZWQBAAwMd2hvABxwYXJhX2lkBBBtZW1vJDxBZGRlZFRvTmV3UmFpc2UBAAQccGFyYV9pZAQCEFRQZXJtYW5lbnRTbG90QXNzaWduZWQBAQJUVGVtcG9yYXJ5U2xvdEFzc2lnbmVkAQECYE1heFBlcm1hbmVudFNsb3RzQ2hhbmdlZAEABBRzbG90cwRgTWF4VGVtcG9yYXJ5U2xvdHNDaGFuZ2VkAQAEFHNsb3RzBAIIgFJlY2VpdmVkVmFsaWRhdG9yU2V0V2hpbGVQYXNzaXZlAQEFYFVuZXhwZWN0ZWRNb2RlVHJhbnNpdGlvbgEBBQIQUFZhbGlkYXRvclNldFJlY2VpdmVkAQAQCGlkBFxuZXdfdmFsaWRhdG9yX3NldF9jb3VudAQscHJ1bmVfdXBfdG8tBCBsZWZ0b3ZlchRcQ291bGROb3RNZXJnZUFuZERyb3BwZWQBAQVUU2V0VG9vU21hbGxBbmREcm9wcGVkAQEFKFVuZXhwZWN0ZWQBAgiAUmVjZWl2ZWRWYWxpZGF0b3JTZXRXaGlsZVBhc3NpdmUBAQVgVW5leHBlY3RlZE1vZGVUcmFuc2l0aW9uAQEFAiA4VXBncmFkZVN0YXJ0ZWQBAAQobWlncmF0aW9ucwRAVXBncmFkZUNvbXBsZXRlZAEBBTRVcGdyYWRlRmFpbGVkAQEFQE1pZ3JhdGlvblNraXBwZWQBAAQUaW5kZXgERE1pZ3JhdGlvbkFkdmFuY2VkAQAIFGluZGV4BBB0b29rBEhNaWdyYXRpb25Db21wbGV0ZWQBAAgUaW5kZXgEEHRvb2sEPE1pZ3JhdGlvbkZhaWxlZAEACBRpbmRleAQQdG9vawQ8SGlzdG9yaWNDbGVhcmVkAQAELG5leHRfY3Vyc29yxQUCpCBPdmVyZmxvdwEBBTRVbmltcGxlbWVudGVkAQEFYFVudHJ1c3RlZFJlc2VydmVMb2NhdGlvbgEBBWRVbnRydXN0ZWRUZWxlcG9ydExvY2F0aW9uAQEFMExvY2F0aW9uRnVsbAEBBVRMb2NhdGlvbk5vdEludmVydGlibGUBAQUkQmFkT3JpZ2luAQEFPEludmFsaWRMb2NhdGlvbgEBBTRBc3NldE5vdEZvdW5kAQEFVEZhaWxlZFRvVHJhbnNhY3RBc3NldAEBBTxOb3RXaXRoZHJhd2FibGUBAQVITG9jYXRpb25DYW5ub3RIb2xkAQEFVEV4Y2VlZHNNYXhNZXNzYWdlU2l6ZQEBBVhEZXN0aW5hdGlvblVuc3VwcG9ydGVkAQEFJFRyYW5zcG9ydAEBBShVbnJvdXRhYmxlAQEFMFVua25vd25DbGFpbQEBBThGYWlsZWRUb0RlY29kZQEBBUBNYXhXZWlnaHRJbnZhbGlkAQEFOE5vdEhvbGRpbmdGZWVzAQEFMFRvb0V4cGVuc2l2ZQEBBRBUcmFwAQEDQEV4cGVjdGF0aW9uRmFsc2UBAQU4UGFsbGV0Tm90Rm91bmQBAQUwTmFtZU1pc21hdGNoAQEFTFZlcnNpb25JbmNvbXBhdGlibGUBAQVQSG9sZGluZ1dvdWxkT3ZlcmZsb3cBAQUsRXhwb3J0RXJyb3IBAQU4UmVhbmNob3JGYWlsZWQBAQUYTm9EZWFsAQEFKEZlZXNOb3RNZXQBAQUkTG9ja0Vycm9yAQEFME5vUGVybWlzc2lvbgEBBShVbmFuY2hvcmVkAQEFOE5vdERlcG9zaXRhYmxlAQEFNFRvb01hbnlBc3NldHMBAQVMVW5oYW5kbGVkWGNtVmVyc2lvbgEBBUhXZWlnaHRMaW1pdFJlYWNoZWQBAAggcmVmX3RpbWUIKHByb29mX3NpemUIHEJhcnJpZXIBAQVMV2VpZ2h0Tm90Q29tcHV0YWJsZQEBBURFeGNlZWRzU3RhY2tMaW1pdAEBBQAIFGluZGV4BBRlcnJvcskOAgwgQ29tcGxldGUBAAQQdXNlZBgoSW5jb21wbGV0ZQEACBB1c2VkGBRlcnJvcs0OFEVycm9yAQAIFGluZGV4BBRlcnJvcskOAAgIaWSJDgxmdW6ZAgTVDgADCATJDgbdDgIYEE51bGwBAQUYQXNzZXRzAQTVDgA8RXhlY3V0aW9uUmVzdWx0AQbdDhxWZXJzaW9uAQECLFBhbGxldHNJbmZvAQStAgA4RGlzcGF0Y2hSZXN1bHQBAgwcU3VjY2VzcwEBBRRFcnJvcgEFADhUcnVuY2F0ZWRFcnJvcgEFAAaJDgAMLGRlc3RpbmF0aW9uiQ4gcXVlcnlfaWQIKG1heF93ZWlnaHQYAhAMQWxsAQEFFEFsbE9mAQAICGlkiQ4MZnVu5QIoQWxsQ291bnRlZAEBAjBBbGxPZkNvdW50ZWQBAAwIaWSJDgxmdW7lAhRjb3VudAQCCCBEZWZpbml0ZQEE1Q4AEFdpbGQBAhAMQWxsAQEFFEFsbE9mAQAICGlkiQ4MZnVu5QIoQWxsQ291bnRlZAEBAjBBbGxPZkNvdW50ZWQBAAwIaWSJDgxmdW7lAhRjb3VudAQCDCBUZWxlcG9ydAECCCBEZWZpbml0ZQEE1Q4AEFdpbGQBAhAMQWxsAQEFFEFsbE9mAQAICGlkiQ4MZnVu5QIoQWxsQ291bnRlZAEBAjBBbGxPZkNvdW50ZWQBAAwIaWSJDgxmdW7lAhRjb3VudAQ4UmVzZXJ2ZURlcG9zaXQBAgggRGVmaW5pdGUBBNUOABBXaWxkAQIQDEFsbAEBBRRBbGxPZgEACAhpZIkODGZ1buUCKEFsbENvdW50ZWQBAQIwQWxsT2ZDb3VudGVkAQAMCGlkiQ4MZnVu5QIUY291bnQEPFJlc2VydmVXaXRoZHJhdwECCCBEZWZpbml0ZQEE1Q4AEFdpbGQBAhAMQWxsAQEFFEFsbE9mAQAICGlkiQ4MZnVu5QIoQWxsQ291bnRlZAEBAjBBbGxPZkNvdW50ZWQBAAwIaWSJDgxmdW7lAhRjb3VudAQG+Q4E+Q4ABoUOAgQwQXNzZXRDbGFpbWVyAQAEIGxvY2F0aW9uiQ4ECQ8AAtA0V2l0aGRyYXdBc3NldAEE1Q4AVFJlc2VydmVBc3NldERlcG9zaXRlZAEE1Q4AWFJlY2VpdmVUZWxlcG9ydGVkQXNzZXQBBNUOADRRdWVyeVJlc3BvbnNlAQAQIHF1ZXJ5X2lkCCByZXNwb25zZeUOKG1heF93ZWlnaHQYHHF1ZXJpZXLpDjRUcmFuc2ZlckFzc2V0AQAIGGFzc2V0c9kOLGJlbmVmaWNpYXJ5iQ5QVHJhbnNmZXJSZXNlcnZlQXNzZXQBAAwYYXNzZXRz2Q4QZGVzdIkODHhjbRUPIFRyYW5zYWN0AQAMLG9yaWdpbl9raW5kwQJMZmFsbGJhY2tfbWF4X3dlaWdodLEBEGNhbGwkZEhybXBOZXdDaGFubmVsT3BlblJlcXVlc3QBAAwYc2VuZGVyBEBtYXhfbWVzc2FnZV9zaXplBDBtYXhfY2FwYWNpdHkETEhybXBDaGFubmVsQWNjZXB0ZWQBAAQkcmVjaXBpZW50BEhIcm1wQ2hhbm5lbENsb3NpbmcBAAwkaW5pdGlhdG9yBBhzZW5kZXIEJHJlY2lwaWVudAQsQ2xlYXJPcmlnaW4BAQU0RGVzY2VuZE9yaWdpbgECJBBIZXJlAQEFCFgxAQIoJFBhcmFjaGFpbgEBAixBY2NvdW50SWQzMgEACBxuZXR3b3JrYQ4IaWQgOEFjY291bnRJbmRleDY0AQAIHG5ldHdvcmthDhRpbmRleAgwQWNjb3VudEtleTIwAQAIHG5ldHdvcmthDgxrZXllAThQYWxsZXRJbnN0YW5jZQEBAjBHZW5lcmFsSW5kZXgBAQMoR2VuZXJhbEtleQEACBhsZW5ndGgEEGRhdGEgJE9ubHlDaGlsZAEBBSRQbHVyYWxpdHkBAAgIaWRpARBwYXJ0bQE8R2xvYmFsQ29uc2Vuc3VzAQIgJEJ5R2VuZXNpcwEFAYAYQnlGb3JrAQAIMGJsb2NrX251bWJlcggoYmxvY2tfaGFzaCAgUG9sa2Fkb3QBAQUYS3VzYW1hAQEFIEV0aGVyZXVtAQAEIGNoYWluX2lkCCxCaXRjb2luQ29yZQEBBSxCaXRjb2luQ2FzaAEBBUBQb2xrYWRvdEJ1bGxldGluAQEFCFgyAQRlDgEICFgzAQRlDgEMCFg0AQRlDgEQCFg1AQRlDgEUCFg2AQRlDgEYCFg3AQRlDgEcCFg4AQRlDgEgLFJlcG9ydEVycm9yAQAMLGRlc3RpbmF0aW9uiQ4gcXVlcnlfaWQIKG1heF93ZWlnaHQYMERlcG9zaXRBc3NldAEACBhhc3NldHP1DixiZW5lZmljaWFyeYkOTERlcG9zaXRSZXNlcnZlQXNzZXQBAAwYYXNzZXRz9Q4QZGVzdIkODHhjbRUPNEV4Y2hhbmdlQXNzZXQBAAwQZ2l2ZfUOEHdhbnTZDhxtYXhpbWFsFFxJbml0aWF0ZVJlc2VydmVXaXRoZHJhdwEADBhhc3NldHP1DhxyZXNlcnZliQ4MeGNtFQ9ASW5pdGlhdGVUZWxlcG9ydAEADBhhc3NldHP1DhBkZXN0iQ4MeGNtFQ80UmVwb3J0SG9sZGluZwEACDRyZXNwb25zZV9pbmZv7Q4YYXNzZXRz9Q4wQnV5RXhlY3V0aW9uAQAIEGZlZXPVDjB3ZWlnaHRfbGltaXTxAjRSZWZ1bmRTdXJwbHVzAQEFPFNldEVycm9ySGFuZGxlcgEEEQ8ALFNldEFwcGVuZGl4AQQRDwAoQ2xlYXJFcnJvcgEBBShDbGFpbUFzc2V0AQAIGGFzc2V0c9kOGHRpY2tldIkOEFRyYXABAQNAU3Vic2NyaWJlVmVyc2lvbgEACCBxdWVyeV9pZAhMbWF4X3Jlc3BvbnNlX3dlaWdodBhIVW5zdWJzY3JpYmVWZXJzaW9uAQEFJEJ1cm5Bc3NldAEE1Q4ALEV4cGVjdEFzc2V0AQTVDgAwRXhwZWN0T3JpZ2luAQaJDixFeHBlY3RFcnJvcgEG3Q5QRXhwZWN0VHJhbnNhY3RTdGF0dXMBAgwcU3VjY2VzcwEBBRRFcnJvcgEFADhUcnVuY2F0ZWRFcnJvcgEFACxRdWVyeVBhbGxldAEACCxtb2R1bGVfbmFtZSQ0cmVzcG9uc2VfaW5mb+0OMEV4cGVjdFBhbGxldAEAFBRpbmRleAQQbmFtZSQsbW9kdWxlX25hbWUkLGNyYXRlX21ham9yBDxtaW5fY3JhdGVfbWlub3IEUFJlcG9ydFRyYW5zYWN0U3RhdHVzAQAMLGRlc3RpbmF0aW9uiQ4gcXVlcnlfaWQIKG1heF93ZWlnaHQYTENsZWFyVHJhbnNhY3RTdGF0dXMBAQU8VW5pdmVyc2FsT3JpZ2luAQIoJFBhcmFjaGFpbgEBAixBY2NvdW50SWQzMgEACBxuZXR3b3JrYQ4IaWQgOEFjY291bnRJbmRleDY0AQAIHG5ldHdvcmthDhRpbmRleAgwQWNjb3VudEtleTIwAQAIHG5ldHdvcmthDgxrZXllAThQYWxsZXRJbnN0YW5jZQEBAjBHZW5lcmFsSW5kZXgBAQMoR2VuZXJhbEtleQEACBhsZW5ndGgEEGRhdGEgJE9ubHlDaGlsZAEBBSRQbHVyYWxpdHkBAAgIaWRpARBwYXJ0bQE8R2xvYmFsQ29uc2Vuc3VzAQIgJEJ5R2VuZXNpcwEFAYAYQnlGb3JrAQAIMGJsb2NrX251bWJlcggoYmxvY2tfaGFzaCAgUG9sa2Fkb3QBAQUYS3VzYW1hAQEFIEV0aGVyZXVtAQAEIGNoYWluX2lkCCxCaXRjb2luQ29yZQEBBSxCaXRjb2luQ2FzaAEBBUBQb2xrYWRvdEJ1bGxldGluAQEFNEV4cG9ydE1lc3NhZ2UBAAwcbmV0d29ya10OLGRlc3RpbmF0aW9uhQ4MeGNtFQ8kTG9ja0Fzc2V0AQAIFGFzc2V01Q4gdW5sb2NrZXKJDixVbmxvY2tBc3NldAEACBRhc3NldNUOGHRhcmdldIkOOE5vdGVVbmxvY2thYmxlAQAIFGFzc2V01Q4Ub3duZXKJDjRSZXF1ZXN0VW5sb2NrAQAIFGFzc2V01Q4YbG9ja2VyiQ4sU2V0RmVlc01vZGUBAAQwaml0X3dpdGhkcmF3FCBTZXRUb3BpYwEFAYAoQ2xlYXJUb3BpYwEBBSxBbGlhc09yaWdpbgEACBxwYXJlbnRzBCBpbnRlcmlvcoUOPFVucGFpZEV4ZWN1dGlvbgEACDB3ZWlnaHRfbGltaXTxAjBjaGVja19vcmlnaW7pDhxQYXlGZWVzAQAEFGFzc2V01Q5ASW5pdGlhdGVUcmFuc2ZlcgEAFCxkZXN0aW5hdGlvbokOLHJlbW90ZV9mZWVz/Q48cHJlc2VydmVfb3JpZ2luFBhhc3NldHMBDyhyZW1vdGVfeGNtFQ9ERXhlY3V0ZVdpdGhPcmlnaW4BAAhEZGVzY2VuZGFudF9vcmlnaW4FDwx4Y20VDyBTZXRIaW50cwEABBRoaW50cw0PBBEPAAIcNE5vdEFwcGxpY2FibGUBAQUkVHJhbnNwb3J0AQEFKFVucm91dGFibGUBAQVYRGVzdGluYXRpb25VbnN1cHBvcnRlZAEBBVRFeGNlZWRzTWF4TWVzc2FnZVNpemUBAQU8TWlzc2luZ0FyZ3VtZW50AQEFEEZlZXMBAQUCDAhWMwEEEQMACFY0AQSdAgAIVjUBBNUOAAJ0JEF0dGVtcHRlZAEABBxvdXRjb21l0Q4QU2VudAEAEBhvcmlnaW6JDixkZXN0aW5hdGlvbokOHG1lc3NhZ2UVDyhtZXNzYWdlX2lkIChTZW5kRmFpbGVkAQAQGG9yaWdpbokOLGRlc3RpbmF0aW9uiQ4UZXJyb3IZDyhtZXNzYWdlX2lkIDxQcm9jZXNzWGNtRXJyb3IBAAwYb3JpZ2luiQ4UZXJyb3LJDihtZXNzYWdlX2lkIEhVbmV4cGVjdGVkUmVzcG9uc2UBAAgYb3JpZ2luiQ4gcXVlcnlfaWQINFJlc3BvbnNlUmVhZHkBAAggcXVlcnlfaWQIIHJlc3BvbnNl5Q4gTm90aWZpZWQBAAwgcXVlcnlfaWQIMHBhbGxldF9pbmRleAQoY2FsbF9pbmRleARATm90aWZ5T3ZlcndlaWdodAEAFCBxdWVyeV9pZAgwcGFsbGV0X2luZGV4BChjYWxsX2luZGV4BDRhY3R1YWxfd2VpZ2h0GExtYXhfYnVkZ2V0ZWRfd2VpZ2h0GExOb3RpZnlEaXNwYXRjaEVycm9yAQAMIHF1ZXJ5X2lkCDBwYWxsZXRfaW5kZXgEKGNhbGxfaW5kZXgESE5vdGlmeURlY29kZUZhaWxlZAEADCBxdWVyeV9pZAgwcGFsbGV0X2luZGV4BChjYWxsX2luZGV4BEBJbnZhbGlkUmVzcG9uZGVyAQAMGG9yaWdpbokOIHF1ZXJ5X2lkCERleHBlY3RlZF9sb2NhdGlvbukOXEludmFsaWRSZXNwb25kZXJWZXJzaW9uAQAIGG9yaWdpbokOIHF1ZXJ5X2lkCDRSZXNwb25zZVRha2VuAQAEIHF1ZXJ5X2lkCDRBc3NldHNUcmFwcGVkAQAMEGhhc2ggGG9yaWdpbokOGGFzc2V0cx0PVFZlcnNpb25DaGFuZ2VOb3RpZmllZAEAECxkZXN0aW5hdGlvbokOGHJlc3VsdAQQY29zdNkOKG1lc3NhZ2VfaWQgXFN1cHBvcnRlZFZlcnNpb25DaGFuZ2VkAQAIIGxvY2F0aW9uiQ4cdmVyc2lvbgRQTm90aWZ5VGFyZ2V0U2VuZEZhaWwBAAwgbG9jYXRpb26JDiBxdWVyeV9pZAgUZXJyb3LJDmROb3RpZnlUYXJnZXRNaWdyYXRpb25GYWlsAQAIIGxvY2F0aW9ukQ4gcXVlcnlfaWQIVEludmFsaWRRdWVyaWVyVmVyc2lvbgEACBhvcmlnaW6JDiBxdWVyeV9pZAg4SW52YWxpZFF1ZXJpZXIBABAYb3JpZ2luiQ4gcXVlcnlfaWQIQGV4cGVjdGVkX3F1ZXJpZXKJDlBtYXliZV9hY3R1YWxfcXVlcmllcukOUFZlcnNpb25Ob3RpZnlTdGFydGVkAQAMLGRlc3RpbmF0aW9uiQ4QY29zdNkOKG1lc3NhZ2VfaWQgWFZlcnNpb25Ob3RpZnlSZXF1ZXN0ZWQBAAwsZGVzdGluYXRpb26JDhBjb3N02Q4obWVzc2FnZV9pZCBgVmVyc2lvbk5vdGlmeVVucmVxdWVzdGVkAQAMLGRlc3RpbmF0aW9uiQ4QY29zdNkOKG1lc3NhZ2VfaWQgIEZlZXNQYWlkAQAIGHBheWluZ4kOEGZlZXPZDjRBc3NldHNDbGFpbWVkAQAMEGhhc2ggGG9yaWdpbokOGGFzc2V0cx0PYFZlcnNpb25NaWdyYXRpb25GaW5pc2hlZAEABBx2ZXJzaW9uBDxBbGlhc0F1dGhvcml6ZWQBAAwcYWxpYXNlcokOGHRhcmdldIkOGGV4cGlyefUDZEFsaWFzQXV0aG9yaXphdGlvblJlbW92ZWQBAAgcYWxpYXNlcokOGHRhcmdldIkOcEFsaWFzZXNBdXRob3JpemF0aW9uc1JlbW92ZWQBAAQYdGFyZ2V0iQ4CDEBBc3NldFJhdGVDcmVhdGVkAQAIKGFzc2V0X2tpbmSNDhByYXRlCEBBc3NldFJhdGVSZW1vdmVkAQAEKGFzc2V0X2tpbmSNDkBBc3NldFJhdGVVcGRhdGVkAQAMKGFzc2V0X2tpbmSNDgxvbGQIDG5ldwgCBEREZWZlbnNpdmVUZXN0Q2FsbAEBBQIEKERpc3BhdGNoZWQBAAQYcmVzdWx0VQ4CCDhJZGVudGl0eVJlYXBlZAEABAx3aG8AOERlcG9zaXRVcGRhdGVkAQAMDHdobwAgaWRlbnRpdHkIEHN1YnMIArwYU3lzdGVtAQIgQEV4dHJpbnNpY1N1Y2Nlc3MBAAQ0ZGlzcGF0Y2hfaW5mb0A8RXh0cmluc2ljRmFpbGVkAQAIOGRpc3BhdGNoX2Vycm9y/Q00ZGlzcGF0Y2hfaW5mb0AsQ29kZVVwZGF0ZWQBAQUoTmV3QWNjb3VudAEABBxhY2NvdW50ADRLaWxsZWRBY2NvdW50AQAEHGFjY291bnQAIFJlbWFya2VkAQAIGHNlbmRlcgAQaGFzaCBEVXBncmFkZUF1dGhvcml6ZWQBAAgkY29kZV9oYXNoIDRjaGVja192ZXJzaW9uFIBSZWplY3RlZEludmFsaWRBdXRob3JpemVkVXBncmFkZQEACCRjb2RlX2hhc2ggFGVycm9y/Q0cSW5kaWNlcwECEDRJbmRleEFzc2lnbmVkAQAIDHdobwAUaW5kZXgEKEluZGV4RnJlZWQBAAQUaW5kZXgELEluZGV4RnJvemVuAQAIFGluZGV4BAx3aG8AMERlcG9zaXRQb2tlZAEAEAx3aG8AFGluZGV4BCxvbGRfZGVwb3NpdAgsbmV3X2RlcG9zaXQIIEJhbGFuY2VzAQJYHEVuZG93ZWQBAAgcYWNjb3VudAAwZnJlZV9iYWxhbmNlCCBEdXN0TG9zdAEACBxhY2NvdW50ABhhbW91bnQIIFRyYW5zZmVyAQAMEGZyb20ACHRvABhhbW91bnQIKEJhbGFuY2VTZXQBAAgMd2hvABBmcmVlCCBSZXNlcnZlZAEACAx3aG8AGGFtb3VudAgoVW5yZXNlcnZlZAEACAx3aG8AGGFtb3VudAhIUmVzZXJ2ZVJlcGF0cmlhdGVkAQAQEGZyb20ACHRvABhhbW91bnQISGRlc3RpbmF0aW9uX3N0YXR1cykBHERlcG9zaXQBAAgMd2hvABhhbW91bnQIIFdpdGhkcmF3AQAIDHdobwAYYW1vdW50CBxTbGFzaGVkAQAIDHdobwAYYW1vdW50CBhNaW50ZWQBAAgMd2hvABhhbW91bnQIGEJ1cm5lZAEACAx3aG8AGGFtb3VudAgkU3VzcGVuZGVkAQAIDHdobwAYYW1vdW50CCBSZXN0b3JlZAEACAx3aG8AGGFtb3VudAggVXBncmFkZWQBAAQMd2hvABhJc3N1ZWQBAAQYYW1vdW50CCRSZXNjaW5kZWQBAAQYYW1vdW50CBhMb2NrZWQBAAgMd2hvABhhbW91bnQIIFVubG9ja2VkAQAIDHdobwAYYW1vdW50CBhGcm96ZW4BAAgMd2hvABhhbW91bnQIGFRoYXdlZAEACAx3aG8AGGFtb3VudAhMVG90YWxJc3N1YW5jZUZvcmNlZAEACAxvbGQIDG5ldwhIVHJhbnNhY3Rpb25QYXltZW50AQIESFRyYW5zYWN0aW9uRmVlUGFpZAEADAx3aG8AKGFjdHVhbF9mZWUIDHRpcAgcU3Rha2luZwECTBxFcmFQYWlkAQAMJGVyYV9pbmRleARAdmFsaWRhdG9yX3BheW91dAgkcmVtYWluZGVyCCBSZXdhcmRlZAEADBRzdGFzaAAQZGVzdDUBGGFtb3VudAgcU2xhc2hlZAEACBhzdGFrZXIAGGFtb3VudAg0U2xhc2hSZXBvcnRlZAEADCR2YWxpZGF0b3IAIGZyYWN0aW9uBCRzbGFzaF9lcmEEaE9sZFNsYXNoaW5nUmVwb3J0RGlzY2FyZGVkAQAENHNlc3Npb25faW5kZXgEOFN0YWtlcnNFbGVjdGVkAQEFGEJvbmRlZAEACBRzdGFzaAAYYW1vdW50CCBVbmJvbmRlZAEACBRzdGFzaAAYYW1vdW50CCRXaXRoZHJhd24BAAgUc3Rhc2gAGGFtb3VudAgYS2lja2VkAQAIJG5vbWluYXRvcgAUc3Rhc2gAVFN0YWtpbmdFbGVjdGlvbkZhaWxlZAEBBRxDaGlsbGVkAQAEFHN0YXNoADRQYXlvdXRTdGFydGVkAQAQJGVyYV9pbmRleAQ8dmFsaWRhdG9yX3N0YXNoABBwYWdlBBBuZXh0LQREVmFsaWRhdG9yUHJlZnNTZXQBAAgUc3Rhc2gAFHByZWZzOQFoU25hcHNob3RWb3RlcnNTaXplRXhjZWVkZWQBAAQQc2l6ZQRsU25hcHNob3RUYXJnZXRzU2l6ZUV4Y2VlZGVkAQAEEHNpemUEIEZvcmNlRXJhAQAEEG1vZGU9AWRDb250cm9sbGVyQmF0Y2hEZXByZWNhdGVkAQAEIGZhaWx1cmVzBEBDdXJyZW5jeU1pZ3JhdGVkAQAIFHN0YXNoADhmb3JjZV93aXRoZHJhdwggT2ZmZW5jZXMBAgQcT2ZmZW5jZQEACBBraW5kRQEgdGltZXNsb3QkKEhpc3RvcmljYWwBAggoUm9vdFN0b3JlZAEABBRpbmRleAQsUm9vdHNQcnVuZWQBAAQUdXBfdG8EKFBhcmFtZXRlcnMBAgQcVXBkYXRlZAEADAxrZXnJASRvbGRfdmFsdWXVASRuZXdfdmFsdWXVARxTZXNzaW9uAQIQKE5ld1Nlc3Npb24BAAQ0c2Vzc2lvbl9pbmRleAQkTmV3UXVldWVkAQEFRFZhbGlkYXRvckRpc2FibGVkAQAEJHZhbGlkYXRvcgBIVmFsaWRhdG9yUmVlbmFibGVkAQAEJHZhbGlkYXRvcgAcR3JhbmRwYQECDDhOZXdBdXRob3JpdGllcwEABDRhdXRob3JpdHlfc2V0VQEYUGF1c2VkAQEFHFJlc3VtZWQBAQUcVXRpbGl0eQECIEBCYXRjaEludGVycnVwdGVkAQAIFGluZGV4BBRlcnJvcv0NOEJhdGNoQ29tcGxldGVkAQEFYEJhdGNoQ29tcGxldGVkV2l0aEVycm9ycwEBBTRJdGVtQ29tcGxldGVkAQEFKEl0ZW1GYWlsZWQBAAQUZXJyb3L9DTBEaXNwYXRjaGVkQXMBAAQYcmVzdWx0FQ5ESWZFbHNlTWFpblN1Y2Nlc3MBAQVQSWZFbHNlRmFsbGJhY2tDYWxsZWQBAAQobWFpbl9lcnJvcv0NIElkZW50aXR5AQJYLElkZW50aXR5U2V0AQAEDHdobwA8SWRlbnRpdHlDbGVhcmVkAQAIDHdobwAcZGVwb3NpdAg4SWRlbnRpdHlLaWxsZWQBAAgMd2hvABxkZXBvc2l0CEhKdWRnZW1lbnRSZXF1ZXN0ZWQBAAgMd2hvADxyZWdpc3RyYXJfaW5kZXgEUEp1ZGdlbWVudFVucmVxdWVzdGVkAQAIDHdobwA8cmVnaXN0cmFyX2luZGV4BDhKdWRnZW1lbnRHaXZlbgEACBh0YXJnZXQAPHJlZ2lzdHJhcl9pbmRleAQ4UmVnaXN0cmFyQWRkZWQBAAQ8cmVnaXN0cmFyX2luZGV4BEBTdWJJZGVudGl0eUFkZGVkAQAMDHN1YgAQbWFpbgAcZGVwb3NpdAhAU3ViSWRlbnRpdGllc1NldAEADBBtYWluADhudW1iZXJfb2Zfc3VicwQsbmV3X2RlcG9zaXQISFN1YklkZW50aXR5UmVuYW1lZAEACAxzdWIAEG1haW4ASFN1YklkZW50aXR5UmVtb3ZlZAEADAxzdWIAEG1haW4AHGRlcG9zaXQISFN1YklkZW50aXR5UmV2b2tlZAEADAxzdWIAEG1haW4AHGRlcG9zaXQIOEF1dGhvcml0eUFkZGVkAQAEJGF1dGhvcml0eQBAQXV0aG9yaXR5UmVtb3ZlZAEABCRhdXRob3JpdHkALFVzZXJuYW1lU2V0AQAIDHdobwAgdXNlcm5hbWUkOFVzZXJuYW1lUXVldWVkAQAMDHdobwAgdXNlcm5hbWUkKGV4cGlyYXRpb24ESFByZWFwcHJvdmFsRXhwaXJlZAEABBR3aG9zZQBIUHJpbWFyeVVzZXJuYW1lU2V0AQAIDHdobwAgdXNlcm5hbWUkXERhbmdsaW5nVXNlcm5hbWVSZW1vdmVkAQAIDHdobwAgdXNlcm5hbWUkPFVzZXJuYW1lVW5ib3VuZAEABCB1c2VybmFtZSQ8VXNlcm5hbWVSZW1vdmVkAQAEIHVzZXJuYW1lJDhVc2VybmFtZUtpbGxlZAEABCB1c2VybmFtZSQgUmVjb3ZlcnkBAhw8UmVjb3ZlcnlDcmVhdGVkAQAEHGFjY291bnQARFJlY292ZXJ5SW5pdGlhdGVkAQAIMGxvc3RfYWNjb3VudAA8cmVzY3Vlcl9hY2NvdW50ADxSZWNvdmVyeVZvdWNoZWQBAAwwbG9zdF9hY2NvdW50ADxyZXNjdWVyX2FjY291bnQAGHNlbmRlcgA4UmVjb3ZlcnlDbG9zZWQBAAgwbG9zdF9hY2NvdW50ADxyZXNjdWVyX2FjY291bnQAQEFjY291bnRSZWNvdmVyZWQBAAgwbG9zdF9hY2NvdW50ADxyZXNjdWVyX2FjY291bnQAPFJlY292ZXJ5UmVtb3ZlZAEABDBsb3N0X2FjY291bnQAMERlcG9zaXRQb2tlZAEAEAx3aG8AEGtpbmQhDixvbGRfZGVwb3NpdAgsbmV3X2RlcG9zaXQIHFZlc3RpbmcBAgw4VmVzdGluZ0NyZWF0ZWQBAAgcYWNjb3VudAA4c2NoZWR1bGVfaW5kZXgEOFZlc3RpbmdVcGRhdGVkAQAIHGFjY291bnQAIHVudmVzdGVkCEBWZXN0aW5nQ29tcGxldGVkAQAEHGFjY291bnQAJFNjaGVkdWxlcgECKCRTY2hlZHVsZWQBAAgQd2hlbgQUaW5kZXgEIENhbmNlbGVkAQAIEHdoZW4EFGluZGV4BChEaXNwYXRjaGVkAQAMEHRhc2sNAQhpZBEBGHJlc3VsdBUOIFJldHJ5U2V0AQAQEHRhc2sNAQhpZBEBGHBlcmlvZAQccmV0cmllcwQ4UmV0cnlDYW5jZWxsZWQBAAgQdGFzaw0BCGlkEQE8Q2FsbFVuYXZhaWxhYmxlAQAIEHRhc2sNAQhpZBEBOFBlcmlvZGljRmFpbGVkAQAIEHRhc2sNAQhpZBEBLFJldHJ5RmFpbGVkAQAIEHRhc2sNAQhpZBEBVFBlcm1hbmVudGx5T3ZlcndlaWdodAEACBB0YXNrDQEIaWQRAUBBZ2VuZGFJbmNvbXBsZXRlAQAEEHdoZW4EIFByZWltYWdlAQIMFE5vdGVkAQAEEGhhc2ggJFJlcXVlc3RlZAEABBBoYXNoIBxDbGVhcmVkAQAEEGhhc2ggEFN1ZG8BAhAUU3VkaWQBAAQsc3Vkb19yZXN1bHQVDihLZXlDaGFuZ2VkAQAIDG9sZAUCDG5ldwAoS2V5UmVtb3ZlZAEBBShTdWRvQXNEb25lAQAELHN1ZG9fcmVzdWx0FQ4UUHJveHkBAhw0UHJveHlFeGVjdXRlZAEABBhyZXN1bHQVDixQdXJlQ3JlYXRlZAEAEBBwdXJlAAx3aG8AKHByb3h5X3R5cGU1DlBkaXNhbWJpZ3VhdGlvbl9pbmRleAQoUHVyZUtpbGxlZAEAEBBwdXJlABxzcGF3bmVyAChwcm94eV90eXBlNQ5QZGlzYW1iaWd1YXRpb25faW5kZXgEJEFubm91bmNlZAEADBByZWFsABRwcm94eQAkY2FsbF9oYXNoIChQcm94eUFkZGVkAQAQJGRlbGVnYXRvcgAkZGVsZWdhdGVlAChwcm94eV90eXBlNQ4UZGVsYXkEMFByb3h5UmVtb3ZlZAEAECRkZWxlZ2F0b3IAJGRlbGVnYXRlZQAocHJveHlfdHlwZTUOFGRlbGF5BDBEZXBvc2l0UG9rZWQBABAMd2hvABBraW5kOQ4sb2xkX2RlcG9zaXQILG5ld19kZXBvc2l0CCBNdWx0aXNpZwECFCxOZXdNdWx0aXNpZwEADCRhcHByb3ZpbmcAIG11bHRpc2lnACRjYWxsX2hhc2ggQE11bHRpc2lnQXBwcm92YWwBABAkYXBwcm92aW5nACR0aW1lcG9pbnTxASBtdWx0aXNpZwAkY2FsbF9oYXNoIEBNdWx0aXNpZ0V4ZWN1dGVkAQAUJGFwcHJvdmluZwAkdGltZXBvaW508QEgbXVsdGlzaWcAJGNhbGxfaGFzaCAYcmVzdWx0FQ5ETXVsdGlzaWdDYW5jZWxsZWQBABAoY2FuY2VsbGluZwAkdGltZXBvaW508QEgbXVsdGlzaWcAJGNhbGxfaGFzaCAwRGVwb3NpdFBva2VkAQAQDHdobwAkY2FsbF9oYXNoICxvbGRfZGVwb3NpdAgsbmV3X2RlcG9zaXQIaEVsZWN0aW9uUHJvdmlkZXJNdWx0aVBoYXNlAQIYOFNvbHV0aW9uU3RvcmVkAQAMHGNvbXB1dGUBAhhvcmlnaW4FAjBwcmV2X2VqZWN0ZWQUREVsZWN0aW9uRmluYWxpemVkAQAIHGNvbXB1dGUBAhRzY29yZQkCOEVsZWN0aW9uRmFpbGVkAQEFIFJld2FyZGVkAQAIHGFjY291bnQAFHZhbHVlCBxTbGFzaGVkAQAIHGFjY291bnQAFHZhbHVlCERQaGFzZVRyYW5zaXRpb25lZAEADBBmcm9tEQIIdG8RAhRyb3VuZAQkVm90ZXJMaXN0AQIIIFJlYmFnZ2VkAQAMDHdobwAQZnJvbQgIdG8IMFNjb3JlVXBkYXRlZAEACAx3aG8AJG5ld19zY29yZQg8Tm9taW5hdGlvblBvb2xzAQJcHENyZWF0ZWQBAAgkZGVwb3NpdG9yABxwb29sX2lkBBhCb25kZWQBABAYbWVtYmVyABxwb29sX2lkBBhib25kZWQIGGpvaW5lZBQcUGFpZE91dAEADBhtZW1iZXIAHHBvb2xfaWQEGHBheW91dAggVW5ib25kZWQBABQYbWVtYmVyABxwb29sX2lkBBxiYWxhbmNlCBhwb2ludHMIDGVyYQQkV2l0aGRyYXduAQAQGG1lbWJlcgAccG9vbF9pZAQcYmFsYW5jZQgYcG9pbnRzCCREZXN0cm95ZWQBAAQccG9vbF9pZAQwU3RhdGVDaGFuZ2VkAQAIHHBvb2xfaWQEJG5ld19zdGF0ZR0CNE1lbWJlclJlbW92ZWQBAAwccG9vbF9pZAQYbWVtYmVyAEByZWxlYXNlZF9iYWxhbmNlCDBSb2xlc1VwZGF0ZWQBAAwQcm9vdAUCHGJvdW5jZXIFAiRub21pbmF0b3IFAixQb29sU2xhc2hlZAEACBxwb29sX2lkBBxiYWxhbmNlCFBVbmJvbmRpbmdQb29sU2xhc2hlZAEADBxwb29sX2lkBAxlcmEEHGJhbGFuY2UIVFBvb2xDb21taXNzaW9uVXBkYXRlZAEACBxwb29sX2lkBBxjdXJyZW50JQJgUG9vbE1heENvbW1pc3Npb25VcGRhdGVkAQAIHHBvb2xfaWQEOG1heF9jb21taXNzaW9uBHxQb29sQ29tbWlzc2lvbkNoYW5nZVJhdGVVcGRhdGVkAQAIHHBvb2xfaWQELGNoYW5nZV9yYXRlKQKQUG9vbENvbW1pc3Npb25DbGFpbVBlcm1pc3Npb25VcGRhdGVkAQAIHHBvb2xfaWQEKHBlcm1pc3Npb24xAlRQb29sQ29tbWlzc2lvbkNsYWltZWQBAAgccG9vbF9pZAQoY29tbWlzc2lvbghkTWluQmFsYW5jZURlZmljaXRBZGp1c3RlZAEACBxwb29sX2lkBBhhbW91bnQIYE1pbkJhbGFuY2VFeGNlc3NBZGp1c3RlZAEACBxwb29sX2lkBBhhbW91bnQIcE1lbWJlckNsYWltUGVybWlzc2lvblVwZGF0ZWQBAAgYbWVtYmVyAChwZXJtaXNzaW9uiQU8TWV0YWRhdGFVcGRhdGVkAQAIHHBvb2xfaWQEGGNhbGxlcgBIUG9vbE5vbWluYXRpb25NYWRlAQAIHHBvb2xfaWQEGGNhbGxlcgBQUG9vbE5vbWluYXRvckNoaWxsZWQBAAgccG9vbF9pZAQYY2FsbGVyAExHbG9iYWxQYXJhbXNVcGRhdGVkAQAYNG1pbl9qb2luX2JvbmQIPG1pbl9jcmVhdGVfYm9uZAgkbWF4X3Bvb2xzLQQsbWF4X21lbWJlcnMtBFBtYXhfbWVtYmVyc19wZXJfcG9vbC0EVGdsb2JhbF9tYXhfY29tbWlzc2lvbi0ELEZhc3RVbnN0YWtlAQIUIFVuc3Rha2VkAQAIFHN0YXNoABhyZXN1bHQVDhxTbGFzaGVkAQAIFHN0YXNoABhhbW91bnQIMEJhdGNoQ2hlY2tlZAEABBBlcmFzOQI0QmF0Y2hGaW5pc2hlZAEABBBzaXplBDRJbnRlcm5hbEVycm9yAQEFQENvbnZpY3Rpb25Wb3RpbmcBAhQkRGVsZWdhdGVkAQQAAQgsVW5kZWxlZ2F0ZWQBAQEUVm90ZWQBAAgMd2hvABB2b3RlNQQsVm90ZVJlbW92ZWQBAAgMd2hvABB2b3RlNQQwVm90ZVVubG9ja2VkAQAIDHdobwAUY2xhc3MEJFJlZmVyZW5kYQECQCRTdWJtaXR0ZWQBAAwUaW5kZXgEFHRyYWNrBCBwcm9wb3NhbKUBVERlY2lzaW9uRGVwb3NpdFBsYWNlZAEADBRpbmRleAQMd2hvABhhbW91bnQIXERlY2lzaW9uRGVwb3NpdFJlZnVuZGVkAQAMFGluZGV4BAx3aG8AGGFtb3VudAg4RGVwb3NpdFNsYXNoZWQBAAgMd2hvABhhbW91bnQIPERlY2lzaW9uU3RhcnRlZAEAEBRpbmRleAQUdHJhY2sEIHByb3Bvc2FspQEUdGFsbHmpAThDb25maXJtU3RhcnRlZAEABBRpbmRleAQ4Q29uZmlybUFib3J0ZWQBAAQUaW5kZXgEJENvbmZpcm1lZAEACBRpbmRleAQUdGFsbHmpASBBcHByb3ZlZAEABBRpbmRleAQgUmVqZWN0ZWQBAAgUaW5kZXgEFHRhbGx5qQEgVGltZWRPdXQBAAgUaW5kZXgEFHRhbGx5qQEkQ2FuY2VsbGVkAQAIFGluZGV4BBR0YWxseakBGEtpbGxlZAEACBRpbmRleAQUdGFsbHmpAWRTdWJtaXNzaW9uRGVwb3NpdFJlZnVuZGVkAQAMFGluZGV4BAx3aG8AGGFtb3VudAgsTWV0YWRhdGFTZXQBAAgUaW5kZXgEEGhhc2ggPE1ldGFkYXRhQ2xlYXJlZAEACBRpbmRleAQQaGFzaCAkV2hpdGVsaXN0AQIMPENhbGxXaGl0ZWxpc3RlZAEABCRjYWxsX2hhc2ggWFdoaXRlbGlzdGVkQ2FsbFJlbW92ZWQBAAQkY2FsbF9oYXNoIGRXaGl0ZWxpc3RlZENhbGxEaXNwYXRjaGVkAQAIJGNhbGxfaGFzaCAYcmVzdWx0VQ4gVHJlYXN1cnkBAjAgU3BlbmRpbmcBAARAYnVkZ2V0X3JlbWFpbmluZwgcQXdhcmRlZAEADDhwcm9wb3NhbF9pbmRleAQUYXdhcmQIHGFjY291bnQAFEJ1cm50AQAELGJ1cm50X2Z1bmRzCCBSb2xsb3ZlcgEABEByb2xsb3Zlcl9iYWxhbmNlCBxEZXBvc2l0AQAEFHZhbHVlCDRTcGVuZEFwcHJvdmVkAQAMOHByb3Bvc2FsX2luZGV4BBhhbW91bnQILGJlbmVmaWNpYXJ5ADxVcGRhdGVkSW5hY3RpdmUBAAgscmVhY3RpdmF0ZWQILGRlYWN0aXZhdGVkCEhBc3NldFNwZW5kQXBwcm92ZWQBABgUaW5kZXgEKGFzc2V0X2tpbmSNDhhhbW91bnQILGJlbmVmaWNpYXJ5kQ4odmFsaWRfZnJvbQQkZXhwaXJlX2F0BEBBc3NldFNwZW5kVm9pZGVkAQAEFGluZGV4BBBQYWlkAQAIFGluZGV4BChwYXltZW50X2lkCDRQYXltZW50RmFpbGVkAQAIFGluZGV4BChwYXltZW50X2lkCDhTcGVuZFByb2Nlc3NlZAEABBRpbmRleARARGVsZWdhdGVkU3Rha2luZwECECREZWxlZ2F0ZWQBAAwUYWdlbnQAJGRlbGVnYXRvcgAYYW1vdW50CCBSZWxlYXNlZAEADBRhZ2VudAAkZGVsZWdhdG9yABhhbW91bnQIHFNsYXNoZWQBAAwUYWdlbnQAJGRlbGVnYXRvcgAYYW1vdW50CEhNaWdyYXRlZERlbGVnYXRpb24BAAwUYWdlbnQAJGRlbGVnYXRvcgAYYW1vdW50CDRQYXJhSW5jbHVzaW9uAQIQPENhbmRpZGF0ZUJhY2tlZAEDEKUOJAQERENhbmRpZGF0ZUluY2x1ZGVkAQMQpQ4kBAREQ2FuZGlkYXRlVGltZWRPdXQBAwylDiQEWFVwd2FyZE1lc3NhZ2VzUmVjZWl2ZWQBAAgQZnJvbQQUY291bnQEFFBhcmFzAQIoSEN1cnJlbnRDb2RlVXBkYXRlZAEBAkhDdXJyZW50SGVhZFVwZGF0ZWQBAQJQQ29kZVVwZ3JhZGVTY2hlZHVsZWQBAQIwTmV3SGVhZE5vdGVkAQECMEFjdGlvblF1ZXVlZAEEBAEIPFB2ZkNoZWNrU3RhcnRlZAEDCCAEQFB2ZkNoZWNrQWNjZXB0ZWQBAwggBEBQdmZDaGVja1JlamVjdGVkAQMIIARYVXBncmFkZUNvb2xkb3duUmVtb3ZlZAEABBxwYXJhX2lkBDhDb2RlQXV0aG9yaXplZAEADBxwYXJhX2lkBCRjb2RlX2hhc2ggJGV4cGlyZV9hdAQQSHJtcAECHFBPcGVuQ2hhbm5lbFJlcXVlc3RlZAEAEBhzZW5kZXIEJHJlY2lwaWVudARUcHJvcG9zZWRfbWF4X2NhcGFjaXR5BGRwcm9wb3NlZF9tYXhfbWVzc2FnZV9zaXplBExPcGVuQ2hhbm5lbENhbmNlbGVkAQAIMGJ5X3BhcmFjaGFpbgQoY2hhbm5lbF9pZFUCTE9wZW5DaGFubmVsQWNjZXB0ZWQBAAgYc2VuZGVyBCRyZWNpcGllbnQENENoYW5uZWxDbG9zZWQBAAgwYnlfcGFyYWNoYWluBChjaGFubmVsX2lkVQJYSHJtcENoYW5uZWxGb3JjZU9wZW5lZAEAEBhzZW5kZXIEJHJlY2lwaWVudARUcHJvcG9zZWRfbWF4X2NhcGFjaXR5BGRwcm9wb3NlZF9tYXhfbWVzc2FnZV9zaXplBFxIcm1wU3lzdGVtQ2hhbm5lbE9wZW5lZAEAEBhzZW5kZXIEJHJlY2lwaWVudARUcHJvcG9zZWRfbWF4X2NhcGFjaXR5BGRwcm9wb3NlZF9tYXhfbWVzc2FnZV9zaXplBGhPcGVuQ2hhbm5lbERlcG9zaXRzVXBkYXRlZAEACBhzZW5kZXIEJHJlY2lwaWVudAQ0UGFyYXNEaXNwdXRlcwECDEBEaXNwdXRlSW5pdGlhdGVkAQMIIF0CQERpc3B1dGVDb25jbHVkZWQBAwggYQIYUmV2ZXJ0AQECaE9uRGVtYW5kQXNzaWdubWVudFByb3ZpZGVyAQIMTE9uRGVtYW5kT3JkZXJQbGFjZWQBAAwccGFyYV9pZAQoc3BvdF9wcmljZQgob3JkZXJlZF9ieQAwU3BvdFByaWNlU2V0AQAEKHNwb3RfcHJpY2UIPEFjY291bnRDcmVkaXRlZAEACAx3aG8AGGFtb3VudAgkUmVnaXN0cmFyAQIQKFJlZ2lzdGVyZWQBAAgccGFyYV9pZAQcbWFuYWdlcgAwRGVyZWdpc3RlcmVkAQAEHHBhcmFfaWQEIFJlc2VydmVkAQAIHHBhcmFfaWQEDHdobwAcU3dhcHBlZAEACBxwYXJhX2lkBCBvdGhlcl9pZAQUU2xvdHMBAgg4TmV3TGVhc2VQZXJpb2QBAAQwbGVhc2VfcGVyaW9kBBhMZWFzZWQBABgccGFyYV9pZAQYbGVhc2VyADBwZXJpb2RfYmVnaW4EMHBlcmlvZF9jb3VudAQ4ZXh0cmFfcmVzZXJ2ZWQIMHRvdGFsX2Ftb3VudAggQXVjdGlvbnMBAhw4QXVjdGlvblN0YXJ0ZWQBAAw0YXVjdGlvbl9pbmRleAQwbGVhc2VfcGVyaW9kBBhlbmRpbmcENEF1Y3Rpb25DbG9zZWQBAAQ0YXVjdGlvbl9pbmRleAQgUmVzZXJ2ZWQBAAwYYmlkZGVyADhleHRyYV9yZXNlcnZlZAgwdG90YWxfYW1vdW50CChVbnJlc2VydmVkAQAIGGJpZGRlcgAYYW1vdW50CEhSZXNlcnZlQ29uZmlzY2F0ZWQBAAwccGFyYV9pZAQYbGVhc2VyABhhbW91bnQILEJpZEFjY2VwdGVkAQAUGGJpZGRlcgAccGFyYV9pZAQYYW1vdW50CChmaXJzdF9zbG90BCRsYXN0X3Nsb3QENFdpbm5pbmdPZmZzZXQBAAg0YXVjdGlvbl9pbmRleAQwYmxvY2tfbnVtYmVyBCRDcm93ZGxvYW4BAigcQ3JlYXRlZAEABBxwYXJhX2lkBCxDb250cmlidXRlZAEADAx3aG8AKGZ1bmRfaW5kZXgEGGFtb3VudAggV2l0aGRyZXcBAAwMd2hvAChmdW5kX2luZGV4BBhhbW91bnQIRFBhcnRpYWxseVJlZnVuZGVkAQAEHHBhcmFfaWQELEFsbFJlZnVuZGVkAQAEHHBhcmFfaWQEJERpc3NvbHZlZAEABBxwYXJhX2lkBDxIYW5kbGVCaWRSZXN1bHQBAAgccGFyYV9pZAQYcmVzdWx0FQ4YRWRpdGVkAQAEHHBhcmFfaWQELE1lbW9VcGRhdGVkAQAMDHdobwAccGFyYV9pZAQQbWVtbyQ8QWRkZWRUb05ld1JhaXNlAQAEHHBhcmFfaWQENEFzc2lnbmVkU2xvdHMBAhBUUGVybWFuZW50U2xvdEFzc2lnbmVkAQECVFRlbXBvcmFyeVNsb3RBc3NpZ25lZAEBAmBNYXhQZXJtYW5lbnRTbG90c0NoYW5nZWQBAAQUc2xvdHMEYE1heFRlbXBvcmFyeVNsb3RzQ2hhbmdlZAEABBRzbG90cwQgQ29yZXRpbWUBAghQUmV2ZW51ZUluZm9SZXF1ZXN0ZWQBAAQQd2hlbgQwQ29yZUFzc2lnbmVkAQAEEGNvcmUEPFN0YWtpbmdBaENsaWVudAECEFBWYWxpZGF0b3JTZXRSZWNlaXZlZAEAEAhpZARcbmV3X3ZhbGlkYXRvcl9zZXRfY291bnQELHBydW5lX3VwX3RvLQQgbGVmdG92ZXIUXENvdWxkTm90TWVyZ2VBbmREcm9wcGVkAQEFVFNldFRvb1NtYWxsQW5kRHJvcHBlZAEBBShVbmV4cGVjdGVkAQIIgFJlY2VpdmVkVmFsaWRhdG9yU2V0V2hpbGVQYXNzaXZlAQEFYFVuZXhwZWN0ZWRNb2RlVHJhbnNpdGlvbgEBBVBNdWx0aUJsb2NrTWlncmF0aW9ucwECIDhVcGdyYWRlU3RhcnRlZAEABChtaWdyYXRpb25zBEBVcGdyYWRlQ29tcGxldGVkAQEFNFVwZ3JhZGVGYWlsZWQBAQVATWlncmF0aW9uU2tpcHBlZAEABBRpbmRleARETWlncmF0aW9uQWR2YW5jZWQBAAgUaW5kZXgEEHRvb2sESE1pZ3JhdGlvbkNvbXBsZXRlZAEACBRpbmRleAQQdG9vawQ8TWlncmF0aW9uRmFpbGVkAQAIFGluZGV4BBB0b29rBDxIaXN0b3JpY0NsZWFyZWQBAAQsbmV4dF9jdXJzb3LFBSRYY21QYWxsZXQBAnQkQXR0ZW1wdGVkAQAEHG91dGNvbWXRDhBTZW50AQAQGG9yaWdpbokOLGRlc3RpbmF0aW9uiQ4cbWVzc2FnZRUPKG1lc3NhZ2VfaWQgKFNlbmRGYWlsZWQBABAYb3JpZ2luiQ4sZGVzdGluYXRpb26JDhRlcnJvchkPKG1lc3NhZ2VfaWQgPFByb2Nlc3NYY21FcnJvcgEADBhvcmlnaW6JDhRlcnJvcskOKG1lc3NhZ2VfaWQgSFVuZXhwZWN0ZWRSZXNwb25zZQEACBhvcmlnaW6JDiBxdWVyeV9pZAg0UmVzcG9uc2VSZWFkeQEACCBxdWVyeV9pZAggcmVzcG9uc2XlDiBOb3RpZmllZAEADCBxdWVyeV9pZAgwcGFsbGV0X2luZGV4BChjYWxsX2luZGV4BEBOb3RpZnlPdmVyd2VpZ2h0AQAUIHF1ZXJ5X2lkCDBwYWxsZXRfaW5kZXgEKGNhbGxfaW5kZXgENGFjdHVhbF93ZWlnaHQYTG1heF9idWRnZXRlZF93ZWlnaHQYTE5vdGlmeURpc3BhdGNoRXJyb3IBAAwgcXVlcnlfaWQIMHBhbGxldF9pbmRleAQoY2FsbF9pbmRleARITm90aWZ5RGVjb2RlRmFpbGVkAQAMIHF1ZXJ5X2lkCDBwYWxsZXRfaW5kZXgEKGNhbGxfaW5kZXgEQEludmFsaWRSZXNwb25kZXIBAAwYb3JpZ2luiQ4gcXVlcnlfaWQIRGV4cGVjdGVkX2xvY2F0aW9u6Q5cSW52YWxpZFJlc3BvbmRlclZlcnNpb24BAAgYb3JpZ2luiQ4gcXVlcnlfaWQINFJlc3BvbnNlVGFrZW4BAAQgcXVlcnlfaWQINEFzc2V0c1RyYXBwZWQBAAwQaGFzaCAYb3JpZ2luiQ4YYXNzZXRzHQ9UVmVyc2lvbkNoYW5nZU5vdGlmaWVkAQAQLGRlc3RpbmF0aW9uiQ4YcmVzdWx0BBBjb3N02Q4obWVzc2FnZV9pZCBcU3VwcG9ydGVkVmVyc2lvbkNoYW5nZWQBAAggbG9jYXRpb26JDhx2ZXJzaW9uBFBOb3RpZnlUYXJnZXRTZW5kRmFpbAEADCBsb2NhdGlvbokOIHF1ZXJ5X2lkCBRlcnJvcskOZE5vdGlmeVRhcmdldE1pZ3JhdGlvbkZhaWwBAAggbG9jYXRpb26RDiBxdWVyeV9pZAhUSW52YWxpZFF1ZXJpZXJWZXJzaW9uAQAIGG9yaWdpbokOIHF1ZXJ5X2lkCDhJbnZhbGlkUXVlcmllcgEAEBhvcmlnaW6JDiBxdWVyeV9pZAhAZXhwZWN0ZWRfcXVlcmllcokOUG1heWJlX2FjdHVhbF9xdWVyaWVy6Q5QVmVyc2lvbk5vdGlmeVN0YXJ0ZWQBAAwsZGVzdGluYXRpb26JDhBjb3N02Q4obWVzc2FnZV9pZCBYVmVyc2lvbk5vdGlmeVJlcXVlc3RlZAEADCxkZXN0aW5hdGlvbokOEGNvc3TZDihtZXNzYWdlX2lkIGBWZXJzaW9uTm90aWZ5VW5yZXF1ZXN0ZWQBAAwsZGVzdGluYXRpb26JDhBjb3N02Q4obWVzc2FnZV9pZCAgRmVlc1BhaWQBAAgYcGF5aW5niQ4QZmVlc9kONEFzc2V0c0NsYWltZWQBAAwQaGFzaCAYb3JpZ2luiQ4YYXNzZXRzHQ9gVmVyc2lvbk1pZ3JhdGlvbkZpbmlzaGVkAQAEHHZlcnNpb24EPEFsaWFzQXV0aG9yaXplZAEADBxhbGlhc2VyiQ4YdGFyZ2V0iQ4YZXhwaXJ59QNkQWxpYXNBdXRob3JpemF0aW9uUmVtb3ZlZAEACBxhbGlhc2VyiQ4YdGFyZ2V0iQ5wQWxpYXNlc0F1dGhvcml6YXRpb25zUmVtb3ZlZAEABBh0YXJnZXSJDjBNZXNzYWdlUXVldWUBAhBAUHJvY2Vzc2luZ0ZhaWxlZAEADAhpZCAYb3JpZ2luJQMUZXJyb3IpAyRQcm9jZXNzZWQBABAIaWQgGG9yaWdpbiUDLHdlaWdodF91c2VkGBxzdWNjZXNzFEhPdmVyd2VpZ2h0RW5xdWV1ZWQBABAIaWQgGG9yaWdpbiUDKHBhZ2VfaW5kZXgENG1lc3NhZ2VfaW5kZXgEKFBhZ2VSZWFwZWQBAAgYb3JpZ2luJQMUaW5kZXgEJEFzc2V0UmF0ZQECDEBBc3NldFJhdGVDcmVhdGVkAQAIKGFzc2V0X2tpbmSNDhByYXRlCEBBc3NldFJhdGVSZW1vdmVkAQAEKGFzc2V0X2tpbmSNDkBBc3NldFJhdGVVcGRhdGVkAQAMKGFzc2V0X2tpbmSNDgxvbGQIDG5ldwgsUm9vdFRlc3RpbmcBAgRERGVmZW5zaXZlVGVzdENhbGwBAQUYTWV0YVR4AQIEKERpc3BhdGNoZWQBAAQYcmVzdWx0VQ5ASWRlbnRpdHlNaWdyYXRvcgECCDhJZGVudGl0eVJlYXBlZAEABAx3aG8AOERlcG9zaXRVcGRhdGVkAQAMDHdobwAgaWRlbnRpdHkIEHN1YnMIAAwUcGhhc2U0FGV2ZW50NQ8YdG9waWNzOQMEOQ8AACAkc3BlY19uYW1lSQMkaW1wbF9uYW1lSQNEYXV0aG9yaW5nX3ZlcnNpb24EMHNwZWNfdmVyc2lvbgQwaW1wbF92ZXJzaW9uBBBhcGlzbQNMdHJhbnNhY3Rpb25fdmVyc2lvbgQ4c3lzdGVtX3ZlcnNpb24EAgQcU3Rha2luZwEBBQIEEEtleXMBAQUCBERTdGFraW5nRGVsZWdhdGlvbgEBBQIEOEF1dGhvcml6ZUFsaWFzAQEFAhQcU3Rha2luZwECBBxTdGFraW5nAQEFHFNlc3Npb24BAgQQS2V5cwEBBSBQcmVpbWFnZQECBCBQcmVpbWFnZQEBBUBEZWxlZ2F0ZWRTdGFraW5nAQIERFN0YWtpbmdEZWxlZ2F0aW9uAQEFJFhjbVBhbGxldAECBDhBdXRob3JpemVBbGlhcwEBBQAICGlkVQ8YYW1vdW50CARZDwACGBRjbGFpbQEABBRpbmRleAQgdHJhbnNmZXIBAAgMbmV31QMUaW5kZXgEEGZyZWUBAAQUaW5kZXgEOGZvcmNlX3RyYW5zZmVyAQAMDG5ld9UDFGluZGV4BBhmcmVlemUUGGZyZWV6ZQEABBRpbmRleAQwcG9rZV9kZXBvc2l0AQAEFGluZGV4BAKAEGJvbmQBAAgUdmFsdWUIFHBheWVlNQEoYm9uZF9leHRyYQEABDhtYXhfYWRkaXRpb25hbAgYdW5ib25kAQAEFHZhbHVlCER3aXRoZHJhd191bmJvbmRlZAEABEhudW1fc2xhc2hpbmdfc3BhbnMEIHZhbGlkYXRlAQAEFHByZWZzOQEgbm9taW5hdGUBAAQcdGFyZ2V0c+kDFGNoaWxsAQEFJHNldF9wYXllZQEABBRwYXllZTUBOHNldF9jb250cm9sbGVyAQEFTHNldF92YWxpZGF0b3JfY291bnQBAAQMbmV3BGBpbmNyZWFzZV92YWxpZGF0b3JfY291bnQBAAQoYWRkaXRpb25hbARUc2NhbGVfdmFsaWRhdG9yX2NvdW50AQAEGGZhY3RvcgQ0Zm9yY2Vfbm9fZXJhcwEBBTRmb3JjZV9uZXdfZXJhAQEFRHNldF9pbnZ1bG5lcmFibGVzAQAENGludnVsbmVyYWJsZXPdAzRmb3JjZV91bnN0YWtlAQAIFHN0YXNoAEhudW1fc2xhc2hpbmdfc3BhbnMEUGZvcmNlX25ld19lcmFfYWx3YXlzAQEFVGNhbmNlbF9kZWZlcnJlZF9zbGFzaAEACAxlcmEENHNsYXNoX2luZGljZXM5AjhwYXlvdXRfc3Rha2VycwEACDx2YWxpZGF0b3Jfc3Rhc2gADGVyYQQYcmVib25kAQAEFHZhbHVlCChyZWFwX3N0YXNoAQAIFHN0YXNoAEhudW1fc2xhc2hpbmdfc3BhbnMEEGtpY2sBAAQMd2hv6QNMc2V0X3N0YWtpbmdfY29uZmlncwEAHEhtaW5fbm9taW5hdG9yX2JvbmTtA0htaW5fdmFsaWRhdG9yX2JvbmTtA0xtYXhfbm9taW5hdG9yX2NvdW508QNMbWF4X3ZhbGlkYXRvcl9jb3VudPEDPGNoaWxsX3RocmVzaG9sZPEDOG1pbl9jb21taXNzaW9u8QNIbWF4X3N0YWtlZF9yZXdhcmRz8QMsY2hpbGxfb3RoZXIBAAQUc3Rhc2gAaGZvcmNlX2FwcGx5X21pbl9jb21taXNzaW9uAQAEPHZhbGlkYXRvcl9zdGFzaABIc2V0X21pbl9jb21taXNzaW9uAQAEDG5ldwRYcGF5b3V0X3N0YWtlcnNfYnlfcGFnZQEADDx2YWxpZGF0b3Jfc3Rhc2gADGVyYQQQcGFnZQQwdXBkYXRlX3BheWVlAQAEKGNvbnRyb2xsZXIAaGRlcHJlY2F0ZV9jb250cm9sbGVyX2JhdGNoAQAELGNvbnRyb2xsZXJz3QM4cmVzdG9yZV9sZWRnZXIBABAUc3Rhc2gAQG1heWJlX2NvbnRyb2xsZXIFAixtYXliZV90b3RhbPUDPG1heWJlX3VubG9ja2luZwEEQG1pZ3JhdGVfY3VycmVuY3kBAAQUc3Rhc2gAMG1hbnVhbF9zbGFzaAEADDx2YWxpZGF0b3Jfc3Rhc2gADGVyYQQ4c2xhc2hfZnJhY3Rpb24EAhAQUm9vdAEBBRhTaWduZWQBAQEQTm9uZQEBBShBdXRob3JpemVkAQEFAmwwU3Rha2luZ0FkbWluAQEFJFRyZWFzdXJlcgEBBTxGZWxsb3dzaGlwQWRtaW4BAQUwR2VuZXJhbEFkbWluAQEFMEF1Y3Rpb25BZG1pbgEBBShMZWFzZUFkbWluAQEFTFJlZmVyZW5kdW1DYW5jZWxsZXIBAQVAUmVmZXJlbmR1bUtpbGxlcgEBBSxTbWFsbFRpcHBlcgEBBSRCaWdUaXBwZXIBAQUwU21hbGxTcGVuZGVyAQEFNE1lZGl1bVNwZW5kZXIBAQUoQmlnU3BlbmRlcgEBBURXaGl0ZWxpc3RlZENhbGxlcgEBBUxGZWxsb3dzaGlwSW5pdGlhdGVzAQEFHEZlbGxvd3MBAQVERmVsbG93c2hpcEV4cGVydHMBAQVERmVsbG93c2hpcE1hc3RlcnMBAQU4RmVsbG93c2hpcDFEYW4BAQU4RmVsbG93c2hpcDJEYW4BAQU4RmVsbG93c2hpcDNEYW4BAQU4RmVsbG93c2hpcDREYW4BAQU4RmVsbG93c2hpcDVEYW4BAQU4RmVsbG93c2hpcDZEYW4BAQU4RmVsbG93c2hpcDdEYW4BAQU4RmVsbG93c2hpcDhEYW4BAQU4RmVsbG93c2hpcDlEYW4BAQUCCAxYY20BAAgccGFyZW50cwQgaW50ZXJpb3KFDiBSZXNwb25zZQEACBxwYXJlbnRzBCBpbnRlcmlvcoUOAhAYc3lzdGVtAQIQEFJvb3QBAQUYU2lnbmVkAQEBEE5vbmUBAQUoQXV0aG9yaXplZAEBBRxPcmlnaW5zAQJsMFN0YWtpbmdBZG1pbgEBBSRUcmVhc3VyZXIBAQU8RmVsbG93c2hpcEFkbWluAQEFMEdlbmVyYWxBZG1pbgEBBTBBdWN0aW9uQWRtaW4BAQUoTGVhc2VBZG1pbgEBBUxSZWZlcmVuZHVtQ2FuY2VsbGVyAQEFQFJlZmVyZW5kdW1LaWxsZXIBAQUsU21hbGxUaXBwZXIBAQUkQmlnVGlwcGVyAQEFMFNtYWxsU3BlbmRlcgEBBTRNZWRpdW1TcGVuZGVyAQEFKEJpZ1NwZW5kZXIBAQVEV2hpdGVsaXN0ZWRDYWxsZXIBAQVMRmVsbG93c2hpcEluaXRpYXRlcwEBBRxGZWxsb3dzAQEFREZlbGxvd3NoaXBFeHBlcnRzAQEFREZlbGxvd3NoaXBNYXN0ZXJzAQEFOEZlbGxvd3NoaXAxRGFuAQEFOEZlbGxvd3NoaXAyRGFuAQEFOEZlbGxvd3NoaXAzRGFuAQEFOEZlbGxvd3NoaXA0RGFuAQEFOEZlbGxvd3NoaXA1RGFuAQEFOEZlbGxvd3NoaXA2RGFuAQEFOEZlbGxvd3NoaXA3RGFuAQEFOEZlbGxvd3NoaXA4RGFuAQEFOEZlbGxvd3NoaXA5RGFuAQEFQFBhcmFjaGFpbnNPcmlnaW4BAgQkUGFyYWNoYWluAQECJFhjbVBhbGxldAECCAxYY20BAAgccGFyZW50cwQgaW50ZXJpb3KFDiBSZXNwb25zZQEACBxwYXJlbnRzBCBpbnRlcmlvcoUOAiAUYmF0Y2gBAAQUY2FsbHPVEDRhc19kZXJpdmF0aXZlAQAIFGluZGV4BBBjYWxs0RAkYmF0Y2hfYWxsAQAEFGNhbGxz1RAsZGlzcGF0Y2hfYXMBAAgkYXNfb3JpZ2ludQ8QY2FsbNEQLGZvcmNlX2JhdGNoAQAEFGNhbGxz1RAsd2l0aF93ZWlnaHQBAAgQY2FsbNEQGHdlaWdodBgcaWZfZWxzZQEACBBtYWlu0RAgZmFsbGJhY2vREFBkaXNwYXRjaF9hc19mYWxsaWJsZQEACCRhc19vcmlnaW51DxBjYWxs0RAFAQwFARQFARgFARwFASQFASgFASwFATAFATQFATgFATwFAUQFAUgFAUwFAVQFAVgFAVwFAWAFAWgFAWwFAXAFAXQFAXgFAXwCmBBOb25lAQEFEFJhdzABAQUQUmF3MQEBAhBSYXcyAQUBCBBSYXczAQUBDBBSYXc0AQUBEBBSYXc1AQUBFBBSYXc2AQUBGBBSYXc3AQUBHBBSYXc4AQUBIBBSYXc5AQUBJBRSYXcxMAEFASgUUmF3MTEBBQEsFFJhdzEyAQUBMBRSYXcxMwEFATQUUmF3MTQBBQE4FFJhdzE1AQUBPBRSYXcxNgEFAUAUUmF3MTcBBQFEFFJhdzE4AQUBSBRSYXcxOQEFAUwUUmF3MjABBQFQFFJhdzIxAQUBVBRSYXcyMgEFAVgUUmF3MjMBBQFcFFJhdzI0AQUBYBRSYXcyNQEFAWQUUmF3MjYBBQFoFFJhdzI3AQUBbBRSYXcyOAEFAXAUUmF3MjkBBQF0FFJhdzMwAQUBeBRSYXczMQEFAXwUUmF3MzIBBQGALEJsYWtlVHdvMjU2AQUBgBhTaGEyNTYBBQGAJEtlY2NhazI1NgEFAYAsU2hhVGhyZWUyNTYBBQGABN0PAQgE4Q8ABmUBACQoYWRkaXRpb25hbOUPHGRpc3BsYXndDxRsZWdhbN0PDHdlYt0PEHJpb3TdDxRlbWFpbN0PPHBncF9maW5nZXJwcmludOkPFGltYWdl3Q8cdHdpdHRlct0PAwgA3Q8E8Q8AAhwcVW5rbm93bgEBBRxGZWVQYWlkAQEDKFJlYXNvbmFibGUBAQUkS25vd25Hb29kAQEFJE91dE9mRGF0ZQEBBShMb3dRdWFsaXR5AQEFJEVycm9uZW91cwEBBQJgNGFkZF9yZWdpc3RyYXIBAAQcYWNjb3VudNUDMHNldF9pZGVudGl0eQEABBBpbmZv7Q8gc2V0X3N1YnMBAAQQc3Vic/UPOGNsZWFyX2lkZW50aXR5AQEFRHJlcXVlc3RfanVkZ2VtZW50AQAIJHJlZ19pbmRleAQcbWF4X2ZlZQg4Y2FuY2VsX3JlcXVlc3QBAAQkcmVnX2luZGV4BBxzZXRfZmVlAQAIFGluZGV4BAxmZWUIOHNldF9hY2NvdW50X2lkAQAIFGluZGV4BAxuZXfVAyhzZXRfZmllbGRzAQAIFGluZGV4BBhmaWVsZHMIRHByb3ZpZGVfanVkZ2VtZW50AQAQJHJlZ19pbmRleAQYdGFyZ2V01QMkanVkZ2VtZW50+Q8gaWRlbnRpdHkgNGtpbGxfaWRlbnRpdHkBAAQYdGFyZ2V01QMcYWRkX3N1YgEACAxzdWLVAxBkYXRh3Q8ocmVuYW1lX3N1YgEACAxzdWLVAxBkYXRh3Q8ocmVtb3ZlX3N1YgEABAxzdWLVAyBxdWl0X3N1YgEBBVhhZGRfdXNlcm5hbWVfYXV0aG9yaXR5AQAMJGF1dGhvcml0edUDGHN1ZmZpeCQoYWxsb2NhdGlvbgRkcmVtb3ZlX3VzZXJuYW1lX2F1dGhvcml0eQEACBhzdWZmaXgkJGF1dGhvcml0edUDQHNldF91c2VybmFtZV9mb3IBABAMd2hv1QMgdXNlcm5hbWUkJHNpZ25hdHVyZUUGOHVzZV9hbGxvY2F0aW9uFDxhY2NlcHRfdXNlcm5hbWUBAAQgdXNlcm5hbWUkXHJlbW92ZV9leHBpcmVkX2FwcHJvdmFsAQAEIHVzZXJuYW1lJFBzZXRfcHJpbWFyeV91c2VybmFtZQEABCB1c2VybmFtZSQ8dW5iaW5kX3VzZXJuYW1lAQAEIHVzZXJuYW1lJDxyZW1vdmVfdXNlcm5hbWUBAAQgdXNlcm5hbWUkNGtpbGxfdXNlcm5hbWUBAAQgdXNlcm5hbWUkBtUDAigwYXNfcmVjb3ZlcmVkAQAIHGFjY291bnTVAxBjYWxs0RA0c2V0X3JlY292ZXJlZAEACBBsb3N01QMccmVzY3VlctUDPGNyZWF0ZV9yZWNvdmVyeQEADBxmcmllbmRz3QMkdGhyZXNob2xkBDBkZWxheV9wZXJpb2QERGluaXRpYXRlX3JlY292ZXJ5AQAEHGFjY291bnTVAzh2b3VjaF9yZWNvdmVyeQEACBBsb3N01QMccmVzY3VlctUDOGNsYWltX3JlY292ZXJ5AQAEHGFjY291bnTVAzhjbG9zZV9yZWNvdmVyeQEABBxyZXNjdWVy1QM8cmVtb3ZlX3JlY292ZXJ5AQEFQGNhbmNlbF9yZWNvdmVyZWQBAAQcYWNjb3VudNUDMHBva2VfZGVwb3NpdAEABDRtYXliZV9hY2NvdW50ARACKCBzY2hlZHVsZQEAEBB3aGVuBDhtYXliZV9wZXJpb2RpY4EDIHByaW9yaXR5BBBjYWxs0RAYY2FuY2VsAQAIEHdoZW4EFGluZGV4BDhzY2hlZHVsZV9uYW1lZAEAFAhpZCAQd2hlbgQ4bWF5YmVfcGVyaW9kaWOBAyBwcmlvcml0eQQQY2FsbNEQMGNhbmNlbF9uYW1lZAEABAhpZCA4c2NoZWR1bGVfYWZ0ZXIBABAUYWZ0ZXIEOG1heWJlX3BlcmlvZGljgQMgcHJpb3JpdHkEEGNhbGzREFBzY2hlZHVsZV9uYW1lZF9hZnRlcgEAFAhpZCAUYWZ0ZXIEOG1heWJlX3BlcmlvZGljgQMgcHJpb3JpdHkEEGNhbGzRECRzZXRfcmV0cnkBAAwQdGFzaw0BHHJldHJpZXMEGHBlcmlvZAQ8c2V0X3JldHJ5X25hbWVkAQAMCGlkIBxyZXRyaWVzBBhwZXJpb2QEMGNhbmNlbF9yZXRyeQEABBB0YXNrDQFIY2FuY2VsX3JldHJ5X25hbWVkAQAECGlkIAIUEHN1ZG8BAAQQY2FsbNEQVHN1ZG9fdW5jaGVja2VkX3dlaWdodAEACBBjYWxs0RAYd2VpZ2h0GBxzZXRfa2V5AQAEDG5ld9UDHHN1ZG9fYXMBAAgMd2hv1QMQY2FsbNEQKHJlbW92ZV9rZXkBAQUGNQ4CLBRwcm94eQEADBByZWFs1QNAZm9yY2VfcHJveHlfdHlwZREQEGNhbGzRECRhZGRfcHJveHkBAAwgZGVsZWdhdGXVAyhwcm94eV90eXBlNQ4UZGVsYXkEMHJlbW92ZV9wcm94eQEADCBkZWxlZ2F0ZdUDKHByb3h5X3R5cGU1DhRkZWxheQQ4cmVtb3ZlX3Byb3hpZXMBAQUsY3JlYXRlX3B1cmUBAAwocHJveHlfdHlwZTUOFGRlbGF5BBRpbmRleAQka2lsbF9wdXJlAQAUHHNwYXduZXLVAyhwcm94eV90eXBlNQ4UaW5kZXgEGGhlaWdodAQkZXh0X2luZGV4BCBhbm5vdW5jZQEACBByZWFs1QMkY2FsbF9oYXNoIExyZW1vdmVfYW5ub3VuY2VtZW50AQAIEHJlYWzVAyRjYWxsX2hhc2ggTHJlamVjdF9hbm5vdW5jZW1lbnQBAAggZGVsZWdhdGXVAyRjYWxsX2hhc2ggPHByb3h5X2Fubm91bmNlZAEAECBkZWxlZ2F0ZdUDEHJlYWzVA0Bmb3JjZV9wcm94eV90eXBlERAQY2FsbNEQMHBva2VfZGVwb3NpdAEBBQIUUGFzX211bHRpX3RocmVzaG9sZF8xAQAIRG90aGVyX3NpZ25hdG9yaWVz3QMQY2FsbNEQIGFzX211bHRpAQAUJHRocmVzaG9sZAREb3RoZXJfc2lnbmF0b3JpZXPdAzxtYXliZV90aW1lcG9pbnSNBBBjYWxs0RAobWF4X3dlaWdodBhAYXBwcm92ZV9hc19tdWx0aQEAFCR0aHJlc2hvbGQERG90aGVyX3NpZ25hdG9yaWVz3QM8bWF5YmVfdGltZXBvaW50jQQkY2FsbF9oYXNoIChtYXhfd2VpZ2h0GDxjYW5jZWxfYXNfbXVsdGkBABAkdGhyZXNob2xkBERvdGhlcl9zaWduYXRvcmllc90DJHRpbWVwb2ludPEBJGNhbGxfaGFzaCAwcG9rZV9kZXBvc2l0AQAMJHRocmVzaG9sZAREb3RoZXJfc2lnbmF0b3JpZXPdAyRjYWxsX2hhc2ggAhQ8c3VibWl0X3Vuc2lnbmVkAQAIMHJhd19zb2x1dGlvblkFHHdpdG5lc3NdBWxzZXRfbWluaW11bV91bnRydXN0ZWRfc2NvcmUBAARAbWF5YmVfbmV4dF9zY29yZWEFdHNldF9lbWVyZ2VuY3lfZWxlY3Rpb25fcmVzdWx0AQAEIHN1cHBvcnRzdQUYc3VibWl0AQAEMHJhd19zb2x1dGlvblkFTGdvdmVybmFuY2VfZmFsbGJhY2sBAQUCJBhzdWJtaXQBAAw8cHJvcG9zYWxfb3JpZ2ludQ8gcHJvcG9zYWylAUBlbmFjdG1lbnRfbW9tZW50QQRYcGxhY2VfZGVjaXNpb25fZGVwb3NpdAEABBRpbmRleARccmVmdW5kX2RlY2lzaW9uX2RlcG9zaXQBAAQUaW5kZXgEGGNhbmNlbAEABBRpbmRleAQQa2lsbAEABBRpbmRleARAbnVkZ2VfcmVmZXJlbmR1bQEABBRpbmRleARIb25lX2Zld2VyX2RlY2lkaW5nAQAEFHRyYWNrBGRyZWZ1bmRfc3VibWlzc2lvbl9kZXBvc2l0AQAEFGluZGV4BDBzZXRfbWV0YWRhdGEBAAgUaW5kZXgEKG1heWJlX2hhc2gRAQIQOHdoaXRlbGlzdF9jYWxsAQAEJGNhbGxfaGFzaCBccmVtb3ZlX3doaXRlbGlzdGVkX2NhbGwBAAQkY2FsbF9oYXNoIGRkaXNwYXRjaF93aGl0ZWxpc3RlZF9jYWxsAQAMJGNhbGxfaGFzaCBAY2FsbF9lbmNvZGVkX2xlbgRMY2FsbF93ZWlnaHRfd2l0bmVzcxicZGlzcGF0Y2hfd2hpdGVsaXN0ZWRfY2FsbF93aXRoX3ByZWltYWdlAQAEEGNhbGzREAIYLHNwZW5kX2xvY2FsAQAIGGFtb3VudAgsYmVuZWZpY2lhcnnVAzxyZW1vdmVfYXBwcm92YWwBAAQscHJvcG9zYWxfaWQEFHNwZW5kAQAQKGFzc2V0X2tpbmSNDhhhbW91bnQILGJlbmVmaWNpYXJ5kQ4odmFsaWRfZnJvbS0EGHBheW91dAEABBRpbmRleAQwY2hlY2tfc3RhdHVzAQAEFGluZGV4BCh2b2lkX3NwZW5kAQAEFGluZGV4BAK4fHNldF92YWxpZGF0aW9uX3VwZ3JhZGVfY29vbGRvd24BAAQMbmV3BHBzZXRfdmFsaWRhdGlvbl91cGdyYWRlX2RlbGF5AQAEDG5ldwRkc2V0X2NvZGVfcmV0ZW50aW9uX3BlcmlvZAEABAxuZXcERHNldF9tYXhfY29kZV9zaXplAQAEDG5ldwRAc2V0X21heF9wb3Zfc2l6ZQEABAxuZXcEWHNldF9tYXhfaGVhZF9kYXRhX3NpemUBAAQMbmV3BEhzZXRfY29yZXRpbWVfY29yZXMBAAQMbmV3BHBzZXRfZ3JvdXBfcm90YXRpb25fZnJlcXVlbmN5AQAEDG5ldwR0c2V0X3BhcmFzX2F2YWlsYWJpbGl0eV9wZXJpb2QBAAQMbmV3BGBzZXRfc2NoZWR1bGluZ19sb29rYWhlYWQBAAQMbmV3BGxzZXRfbWF4X3ZhbGlkYXRvcnNfcGVyX2NvcmUBAAQMbmV3LQRIc2V0X21heF92YWxpZGF0b3JzAQAEDG5ldy0ESHNldF9kaXNwdXRlX3BlcmlvZAEABAxuZXcEtHNldF9kaXNwdXRlX3Bvc3RfY29uY2x1c2lvbl9hY2NlcHRhbmNlX3BlcmlvZAEABAxuZXcERHNldF9ub19zaG93X3Nsb3RzAQAEDG5ldwRQc2V0X25fZGVsYXlfdHJhbmNoZXMBAAQMbmV3BHhzZXRfemVyb3RoX2RlbGF5X3RyYW5jaGVfd2lkdGgBAAQMbmV3BFBzZXRfbmVlZGVkX2FwcHJvdmFscwEABAxuZXcEcHNldF9yZWxheV92cmZfbW9kdWxvX3NhbXBsZXMBAAQMbmV3BGhzZXRfbWF4X3Vwd2FyZF9xdWV1ZV9jb3VudAEABAxuZXcEZHNldF9tYXhfdXB3YXJkX3F1ZXVlX3NpemUBAAQMbmV3BHRzZXRfbWF4X2Rvd253YXJkX21lc3NhZ2Vfc2l6ZQEABAxuZXcEbHNldF9tYXhfdXB3YXJkX21lc3NhZ2Vfc2l6ZQEABAxuZXcEoHNldF9tYXhfdXB3YXJkX21lc3NhZ2VfbnVtX3Blcl9jYW5kaWRhdGUBAAQMbmV3BGRzZXRfaHJtcF9vcGVuX3JlcXVlc3RfdHRsAQAEDG5ldwRcc2V0X2hybXBfc2VuZGVyX2RlcG9zaXQBAAQMbmV3CGhzZXRfaHJtcF9yZWNpcGllbnRfZGVwb3NpdAEABAxuZXcIdHNldF9ocm1wX2NoYW5uZWxfbWF4X2NhcGFjaXR5AQAEDG5ldwR8c2V0X2hybXBfY2hhbm5lbF9tYXhfdG90YWxfc2l6ZQEABAxuZXcEnHNldF9ocm1wX21heF9wYXJhY2hhaW5faW5ib3VuZF9jaGFubmVscwEABAxuZXcEhHNldF9ocm1wX2NoYW5uZWxfbWF4X21lc3NhZ2Vfc2l6ZQEABAxuZXcEoHNldF9ocm1wX21heF9wYXJhY2hhaW5fb3V0Ym91bmRfY2hhbm5lbHMBAAQMbmV3BJhzZXRfaHJtcF9tYXhfbWVzc2FnZV9udW1fcGVyX2NhbmRpZGF0ZQEABAxuZXcESHNldF9wdmZfdm90aW5nX3R0bAEABAxuZXcEkHNldF9taW5pbXVtX3ZhbGlkYXRpb25fdXBncmFkZV9kZWxheQEABAxuZXcEcHNldF9ieXBhc3NfY29uc2lzdGVuY3lfY2hlY2sBAAQMbmV3FGBzZXRfYXN5bmNfYmFja2luZ19wYXJhbXMBAAQMbmV3lQVMc2V0X2V4ZWN1dG9yX3BhcmFtcwEABAxuZXelBVhzZXRfb25fZGVtYW5kX2Jhc2VfZmVlAQAEDG5ldwh0c2V0X29uX2RlbWFuZF9mZWVfdmFyaWFiaWxpdHkBAAQMbmV3BHBzZXRfb25fZGVtYW5kX3F1ZXVlX21heF9zaXplAQAEDG5ldwSYc2V0X29uX2RlbWFuZF90YXJnZXRfcXVldWVfdXRpbGl6YXRpb24BAAQMbmV3BGRzZXRfbWluaW11bV9iYWNraW5nX3ZvdGVzAQAEDG5ldwRAc2V0X25vZGVfZmVhdHVyZQEACBRpbmRleAQUdmFsdWUUaHNldF9hcHByb3ZhbF92b3RpbmdfcGFyYW1zAQAEDG5ldwRQc2V0X3NjaGVkdWxlcl9wYXJhbXMBAAQMbmV3qQUACChkZXNjcmlwdG9yoQ4sY29tbWl0bWVudHPJBQAMJGNhbmRpZGF0ZTEQOHZhbGlkaXR5X3ZvdGVz1QVEdmFsaWRhdG9yX2luZGljZXOxBQQ1EAAAECRiaXRmaWVsZHO5BURiYWNrZWRfY2FuZGlkYXRlczkQIGRpc3B1dGVz+QU0cGFyZW50X2hlYWRlcrUDAgQUZW50ZXIBAAQQZGF0YT0QAjBYZm9yY2Vfc2V0X2N1cnJlbnRfY29kZQEACBBwYXJhBCBuZXdfY29kZSRYZm9yY2Vfc2V0X2N1cnJlbnRfaGVhZAEACBBwYXJhBCBuZXdfaGVhZCRsZm9yY2Vfc2NoZWR1bGVfY29kZV91cGdyYWRlAQAMEHBhcmEEIG5ld19jb2RlJExyZWxheV9wYXJlbnRfbnVtYmVyBExmb3JjZV9ub3RlX25ld19oZWFkAQAIEHBhcmEEIG5ld19oZWFkJEhmb3JjZV9xdWV1ZV9hY3Rpb24BAAQQcGFyYQRsYWRkX3RydXN0ZWRfdmFsaWRhdGlvbl9jb2RlAQAEPHZhbGlkYXRpb25fY29kZSRscG9rZV91bnVzZWRfdmFsaWRhdGlvbl9jb2RlAQAEUHZhbGlkYXRpb25fY29kZV9oYXNoIGxpbmNsdWRlX3B2Zl9jaGVja19zdGF0ZW1lbnQBAAgQc3RtdAUGJHNpZ25hdHVyZUECdGZvcmNlX3NldF9tb3N0X3JlY2VudF9jb250ZXh0AQAIEHBhcmEEHGNvbnRleHQEXHJlbW92ZV91cGdyYWRlX2Nvb2xkb3duAQAEEHBhcmEElGF1dGhvcml6ZV9mb3JjZV9zZXRfY3VycmVudF9jb2RlX2hhc2gBAAwQcGFyYQQ0bmV3X2NvZGVfaGFzaCAwdmFsaWRfcGVyaW9kBJxhcHBseV9hdXRob3JpemVkX2ZvcmNlX3NldF9jdXJyZW50X2NvZGUBAAgQcGFyYQQgbmV3X2NvZGUkAgxARm9ySW52YWxpZEJhY2tlZAEBBTBBZ2FpbnN0VmFsaWQBAQVIRm9ySW52YWxpZEFwcHJvdmVkAQEFABAkdGltZV9zbG90GQYQa2luZEkQPHZhbGlkYXRvcl9pbmRleAQwdmFsaWRhdG9yX2lkIAIEcHJlcG9ydF9kaXNwdXRlX2xvc3RfdW5zaWduZWQBAAg0ZGlzcHV0ZV9wcm9vZk0QPGtleV9vd25lcl9wcm9vZr0DAgxccGxhY2Vfb3JkZXJfYWxsb3dfZGVhdGgBAAgobWF4X2Ftb3VudAgccGFyYV9pZARYcGxhY2Vfb3JkZXJfa2VlcF9hbGl2ZQEACChtYXhfYW1vdW50CBxwYXJhX2lkBGBwbGFjZV9vcmRlcl93aXRoX2NyZWRpdHMBAAgobWF4X2Ftb3VudAgccGFyYV9pZAQCDAhWMwEEoQYACFY0AQT1AgAIVjUBBBEPAAIYdHN1ZG9fc2NoZWR1bGVfcGFyYV9pbml0aWFsaXplAQAICGlkBBxnZW5lc2lzFQloc3Vkb19zY2hlZHVsZV9wYXJhX2NsZWFudXABAAQIaWQEgHN1ZG9fc2NoZWR1bGVfcGFyYXRocmVhZF91cGdyYWRlAQAECGlkBIRzdWRvX3NjaGVkdWxlX3BhcmFjaGFpbl9kb3duZ3JhZGUBAAQIaWQEXHN1ZG9fcXVldWVfZG93bndhcmRfeGNtAQAICGlkBAx4Y21ZEGxzdWRvX2VzdGFibGlzaF9ocm1wX2NoYW5uZWwBABAYc2VuZGVyBCRyZWNpcGllbnQEMG1heF9jYXBhY2l0eQRAbWF4X21lc3NhZ2Vfc2l6ZQQCCBxDdXJyZW50AQEFEE5leHQBAQUCFGhhc3NpZ25fcGVybV9wYXJhY2hhaW5fc2xvdAEABAhpZARoYXNzaWduX3RlbXBfcGFyYWNoYWluX3Nsb3QBAAgIaWQESGxlYXNlX3BlcmlvZF9zdGFydGEQXHVuYXNzaWduX3BhcmFjaGFpbl9zbG90AQAECGlkBFxzZXRfbWF4X3Blcm1hbmVudF9zbG90cwEABBRzbG90cwRcc2V0X21heF90ZW1wb3Jhcnlfc2xvdHMBAAQUc2xvdHMEAhBIcmVxdWVzdF9jb3JlX2NvdW50AQAEFGNvdW50BEhyZXF1ZXN0X3JldmVudWVfYXQBAAQQd2hlbgQ4Y3JlZGl0X2FjY291bnQBAAgMd2hvABhhbW91bnQILGFzc2lnbl9jb3JlAQAQEGNvcmUEFGJlZ2luBChhc3NpZ25tZW50VQYgZW5kX2hpbnQtBAAQRG5ld192YWxpZGF0b3Jfc2V03QMIaWQELHBydW5lX3VwX3RvLQQgbGVmdG92ZXIUAgwcUGFzc2l2ZQEBBSBCdWZmZXJlZAEBBRhBY3RpdmUBAQUCDDR2YWxpZGF0b3Jfc2V0AQAEGHJlcG9ydG0QIHNldF9tb2RlAQAEEG1vZGVxEFhmb3JjZV9vbl9taWdyYXRpb25fZW5kAQEFAAwUaW5kZXgEMGlubmVyX2N1cnNvcsUFKHN0YXJ0ZWRfYXQEAggYQWN0aXZlAQAMFGluZGV4BDBpbm5lcl9jdXJzb3LFBShzdGFydGVkX2F0BBRTdHVjawEBBQZ9EAIIIFNwZWNpZmljAQQkACBXaWxkY2FyZAEACBRsaW1pdC0EPHByZXZpb3VzX2N1cnNvcsUFAhBAZm9yY2Vfc2V0X2N1cnNvcgEABBhjdXJzb3KBEFxmb3JjZV9zZXRfYWN0aXZlX2N1cnNvcgEADBRpbmRleAQwaW5uZXJfY3Vyc29yxQUoc3RhcnRlZF9hdC0ESGZvcmNlX29uYm9hcmRfbWJtcwEBBThjbGVhcl9oaXN0b3JpYwEABCBzZWxlY3RvcoUQAhAgVGVsZXBvcnQBAQUwTG9jYWxSZXNlcnZlAQEFSERlc3RpbmF0aW9uUmVzZXJ2ZQEBBTRSZW1vdGVSZXNlcnZlAQIMCFYzAQAIHHBhcmVudHMEIGludGVyaW9ydQEIVjQBAAgccGFyZW50cwQgaW50ZXJpb3J1AQhWNQEACBxwYXJlbnRzBCBpbnRlcmlvcoUOAgwIVjMBAgggQ29uY3JldGUBAAgccGFyZW50cwQgaW50ZXJpb3J1ASBBYnN0cmFjdAEFAYAIVjQBAAgccGFyZW50cwQgaW50ZXJpb3J1AQhWNQEACBxwYXJlbnRzBCBpbnRlcmlvcoUOAkQQc2VuZAEACBBkZXN0kQ4cbWVzc2FnZVkQPHRlbGVwb3J0X2Fzc2V0cwEAEBBkZXN0kQ4sYmVuZWZpY2lhcnmRDhhhc3NldHMdDzhmZWVfYXNzZXRfaXRlbQRccmVzZXJ2ZV90cmFuc2Zlcl9hc3NldHMBABAQZGVzdJEOLGJlbmVmaWNpYXJ5kQ4YYXNzZXRzHQ84ZmVlX2Fzc2V0X2l0ZW0EHGV4ZWN1dGUBAAgcbWVzc2FnZVkQKG1heF93ZWlnaHQYRGZvcmNlX3hjbV92ZXJzaW9uAQAIIGxvY2F0aW9uiQ4cdmVyc2lvbgRkZm9yY2VfZGVmYXVsdF94Y21fdmVyc2lvbgEABERtYXliZV94Y21fdmVyc2lvbi0EeGZvcmNlX3N1YnNjcmliZV92ZXJzaW9uX25vdGlmeQEABCBsb2NhdGlvbpEOgGZvcmNlX3Vuc3Vic2NyaWJlX3ZlcnNpb25fbm90aWZ5AQAEIGxvY2F0aW9ukQ58bGltaXRlZF9yZXNlcnZlX3RyYW5zZmVyX2Fzc2V0cwEAFBBkZXN0kQ4sYmVuZWZpY2lhcnmRDhhhc3NldHMdDzhmZWVfYXNzZXRfaXRlbQQwd2VpZ2h0X2xpbWl08QJcbGltaXRlZF90ZWxlcG9ydF9hc3NldHMBABQQZGVzdJEOLGJlbmVmaWNpYXJ5kQ4YYXNzZXRzHQ84ZmVlX2Fzc2V0X2l0ZW0EMHdlaWdodF9saW1pdPECQGZvcmNlX3N1c3BlbnNpb24BAAQkc3VzcGVuZGVkFDx0cmFuc2Zlcl9hc3NldHMBABQQZGVzdJEOLGJlbmVmaWNpYXJ5kQ4YYXNzZXRzHQ84ZmVlX2Fzc2V0X2l0ZW0EMHdlaWdodF9saW1pdPECMGNsYWltX2Fzc2V0cwEACBhhc3NldHMdDyxiZW5lZmljaWFyeZEOjHRyYW5zZmVyX2Fzc2V0c191c2luZ190eXBlX2FuZF90aGVuAQAcEGRlc3SRDhhhc3NldHMdD1Bhc3NldHNfdHJhbnNmZXJfdHlwZY0QOHJlbW90ZV9mZWVzX2lkkRBIZmVlc190cmFuc2Zlcl90eXBljRBIY3VzdG9tX3hjbV9vbl9kZXN0WRAwd2VpZ2h0X2xpbWl08QJQYWRkX2F1dGhvcml6ZWRfYWxpYXMBAAgcYWxpYXNlcpEOHGV4cGlyZXP1A1xyZW1vdmVfYXV0aG9yaXplZF9hbGlhcwEABBxhbGlhc2VykQ50cmVtb3ZlX2FsbF9hdXRob3JpemVkX2FsaWFzZXMBAQUCDBhjcmVhdGUBAAgoYXNzZXRfa2luZI0OEHJhdGUIGHVwZGF0ZQEACChhc3NldF9raW5kjQ4QcmF0ZQgYcmVtb3ZlAQAEKGFzc2V0X2tpbmSNDgIIKGZpbGxfYmxvY2sBAAQUcmF0aW8ERHRyaWdnZXJfZGVmZW5zaXZlAQEFAggYU2lnbmVkAQAIJHNpZ25hdHVyZUEGHGFjY291bnQAIERpc2FibGVkAQEFAgEEIEltbW9ydGFsAQEFHE1vcnRhbDEBAQIcTW9ydGFsMgEBAhxNb3J0YWwzAQECHE1vcnRhbDQBAQIcTW9ydGFsNQEBAhxNb3J0YWw2AQECHE1vcnRhbDcBAQIcTW9ydGFsOAEBAhxNb3J0YWw5AQECIE1vcnRhbDEwAQECIE1vcnRhbDExAQECIE1vcnRhbDEyAQECIE1vcnRhbDEzAQECIE1vcnRhbDE0AQECIE1vcnRhbDE1AQECIE1vcnRhbDE2AQECIE1vcnRhbDE3AQECIE1vcnRhbDE4AQECIE1vcnRhbDE5AQECIE1vcnRhbDIwAQECIE1vcnRhbDIxAQECIE1vcnRhbDIyAQECIE1vcnRhbDIzAQECIE1vcnRhbDI0AQECIE1vcnRhbDI1AQECIE1vcnRhbDI2AQECIE1vcnRhbDI3AQECIE1vcnRhbDI4AQECIE1vcnRhbDI5AQECIE1vcnRhbDMwAQECIE1vcnRhbDMxAQECIE1vcnRhbDMyAQECIE1vcnRhbDMzAQECIE1vcnRhbDM0AQECIE1vcnRhbDM1AQECIE1vcnRhbDM2AQECIE1vcnRhbDM3AQECIE1vcnRhbDM4AQECIE1vcnRhbDM5AQECIE1vcnRhbDQwAQECIE1vcnRhbDQxAQECIE1vcnRhbDQyAQECIE1vcnRhbDQzAQECIE1vcnRhbDQ0AQECIE1vcnRhbDQ1AQECIE1vcnRhbDQ2AQECIE1vcnRhbDQ3AQECIE1vcnRhbDQ4AQECIE1vcnRhbDQ5AQECIE1vcnRhbDUwAQECIE1vcnRhbDUxAQECIE1vcnRhbDUyAQECIE1vcnRhbDUzAQECIE1vcnRhbDU0AQECIE1vcnRhbDU1AQECIE1vcnRhbDU2AQECIE1vcnRhbDU3AQECIE1vcnRhbDU4AQECIE1vcnRhbDU5AQECIE1vcnRhbDYwAQECIE1vcnRhbDYxAQECIE1vcnRhbDYyAQECIE1vcnRhbDYzAQECIE1vcnRhbDY0AQECIE1vcnRhbDY1AQECIE1vcnRhbDY2AQECIE1vcnRhbDY3AQECIE1vcnRhbDY4AQECIE1vcnRhbDY5AQECIE1vcnRhbDcwAQECIE1vcnRhbDcxAQECIE1vcnRhbDcyAQECIE1vcnRhbDczAQECIE1vcnRhbDc0AQECIE1vcnRhbDc1AQECIE1vcnRhbDc2AQECIE1vcnRhbDc3AQECIE1vcnRhbDc4AQECIE1vcnRhbDc5AQECIE1vcnRhbDgwAQECIE1vcnRhbDgxAQECIE1vcnRhbDgyAQECIE1vcnRhbDgzAQECIE1vcnRhbDg0AQECIE1vcnRhbDg1AQECIE1vcnRhbDg2AQECIE1vcnRhbDg3AQECIE1vcnRhbDg4AQECIE1vcnRhbDg5AQECIE1vcnRhbDkwAQECIE1vcnRhbDkxAQECIE1vcnRhbDkyAQECIE1vcnRhbDkzAQECIE1vcnRhbDk0AQECIE1vcnRhbDk1AQECIE1vcnRhbDk2AQECIE1vcnRhbDk3AQECIE1vcnRhbDk4AQECIE1vcnRhbDk5AQECJE1vcnRhbDEwMAEBAiRNb3J0YWwxMDEBAQIkTW9ydGFsMTAyAQECJE1vcnRhbDEwMwEBAiRNb3J0YWwxMDQBAQIkTW9ydGFsMTA1AQECJE1vcnRhbDEwNgEBAiRNb3J0YWwxMDcBAQIkTW9ydGFsMTA4AQECJE1vcnRhbDEwOQEBAiRNb3J0YWwxMTABAQIkTW9ydGFsMTExAQECJE1vcnRhbDExMgEBAiRNb3J0YWwxMTMBAQIkTW9ydGFsMTE0AQECJE1vcnRhbDExNQEBAiRNb3J0YWwxMTYBAQIkTW9ydGFsMTE3AQECJE1vcnRhbDExOAEBAiRNb3J0YWwxMTkBAQIkTW9ydGFsMTIwAQECJE1vcnRhbDEyMQEBAiRNb3J0YWwxMjIBAQIkTW9ydGFsMTIzAQECJE1vcnRhbDEyNAEBAiRNb3J0YWwxMjUBAQIkTW9ydGFsMTI2AQECJE1vcnRhbDEyNwEBAiRNb3J0YWwxMjgBAQIkTW9ydGFsMTI5AQECJE1vcnRhbDEzMAEBAiRNb3J0YWwxMzEBAQIkTW9ydGFsMTMyAQECJE1vcnRhbDEzMwEBAiRNb3J0YWwxMzQBAQIkTW9ydGFsMTM1AQECJE1vcnRhbDEzNgEBAiRNb3J0YWwxMzcBAQIkTW9ydGFsMTM4AQECJE1vcnRhbDEzOQEBAiRNb3J0YWwxNDABAQIkTW9ydGFsMTQxAQECJE1vcnRhbDE0MgEBAiRNb3J0YWwxNDMBAQIkTW9ydGFsMTQ0AQECJE1vcnRhbDE0NQEBAiRNb3J0YWwxNDYBAQIkTW9ydGFsMTQ3AQECJE1vcnRhbDE0OAEBAiRNb3J0YWwxNDkBAQIkTW9ydGFsMTUwAQECJE1vcnRhbDE1MQEBAiRNb3J0YWwxNTIBAQIkTW9ydGFsMTUzAQECJE1vcnRhbDE1NAEBAiRNb3J0YWwxNTUBAQIkTW9ydGFsMTU2AQECJE1vcnRhbDE1NwEBAiRNb3J0YWwxNTgBAQIkTW9ydGFsMTU5AQECJE1vcnRhbDE2MAEBAiRNb3J0YWwxNjEBAQIkTW9ydGFsMTYyAQECJE1vcnRhbDE2MwEBAiRNb3J0YWwxNjQBAQIkTW9ydGFsMTY1AQECJE1vcnRhbDE2NgEBAiRNb3J0YWwxNjcBAQIkTW9ydGFsMTY4AQECJE1vcnRhbDE2OQEBAiRNb3J0YWwxNzABAQIkTW9ydGFsMTcxAQECJE1vcnRhbDE3MgEBAiRNb3J0YWwxNzMBAQIkTW9ydGFsMTc0AQECJE1vcnRhbDE3NQEBAiRNb3J0YWwxNzYBAQIkTW9ydGFsMTc3AQECJE1vcnRhbDE3OAEBAiRNb3J0YWwxNzkBAQIkTW9ydGFsMTgwAQECJE1vcnRhbDE4MQEBAiRNb3J0YWwxODIBAQIkTW9ydGFsMTgzAQECJE1vcnRhbDE4NAEBAiRNb3J0YWwxODUBAQIkTW9ydGFsMTg2AQECJE1vcnRhbDE4NwEBAiRNb3J0YWwxODgBAQIkTW9ydGFsMTg5AQECJE1vcnRhbDE5MAEBAiRNb3J0YWwxOTEBAQIkTW9ydGFsMTkyAQECJE1vcnRhbDE5MwEBAiRNb3J0YWwxOTQBAQIkTW9ydGFsMTk1AQECJE1vcnRhbDE5NgEBAiRNb3J0YWwxOTcBAQIkTW9ydGFsMTk4AQECJE1vcnRhbDE5OQEBAiRNb3J0YWwyMDABAQIkTW9ydGFsMjAxAQECJE1vcnRhbDIwMgEBAiRNb3J0YWwyMDMBAQIkTW9ydGFsMjA0AQECJE1vcnRhbDIwNQEBAiRNb3J0YWwyMDYBAQIkTW9ydGFsMjA3AQECJE1vcnRhbDIwOAEBAiRNb3J0YWwyMDkBAQIkTW9ydGFsMjEwAQECJE1vcnRhbDIxMQEBAiRNb3J0YWwyMTIBAQIkTW9ydGFsMjEzAQECJE1vcnRhbDIxNAEBAiRNb3J0YWwyMTUBAQIkTW9ydGFsMjE2AQECJE1vcnRhbDIxNwEBAiRNb3J0YWwyMTgBAQIkTW9ydGFsMjE5AQECJE1vcnRhbDIyMAEBAiRNb3J0YWwyMjEBAQIkTW9ydGFsMjIyAQECJE1vcnRhbDIyMwEBAiRNb3J0YWwyMjQBAQIkTW9ydGFsMjI1AQECJE1vcnRhbDIyNgEBAiRNb3J0YWwyMjcBAQIkTW9ydGFsMjI4AQECJE1vcnRhbDIyOQEBAiRNb3J0YWwyMzABAQIkTW9ydGFsMjMxAQECJE1vcnRhbDIzMgEBAiRNb3J0YWwyMzMBAQIkTW9ydGFsMjM0AQECJE1vcnRhbDIzNQEBAiRNb3J0YWwyMzYBAQIkTW9ydGFsMjM3AQECJE1vcnRhbDIzOAEBAiRNb3J0YWwyMzkBAQIkTW9ydGFsMjQwAQECJE1vcnRhbDI0MQEBAiRNb3J0YWwyNDIBAQIkTW9ydGFsMjQzAQECJE1vcnRhbDI0NAEBAiRNb3J0YWwyNDUBAQIkTW9ydGFsMjQ2AQECJE1vcnRhbDI0NwEBAiRNb3J0YWwyNDgBAQIkTW9ydGFsMjQ5AQECJE1vcnRhbDI1MAEBAiRNb3J0YWwyNTEBAQIkTW9ydGFsMjUyAQECJE1vcnRhbDI1MwEBAiRNb3J0YWwyNTQBAQIkTW9ydGFsMjU1AQECAgggRGlzYWJsZWQBAQUcRW5hYmxlZAEBBQMkoRAVARUBFQEVARUBpRAEqRAADBBjYWxs0RBEZXh0ZW5zaW9uX3ZlcnNpb24EJGV4dGVuc2lvbq0QAgQgZGlzcGF0Y2gBAAQcbWV0YV90eLEQAwgIIAS5EAAAEChwcmV2X3BlYWtzOQM8cHJldl9sZWFmX2NvdW50CChsZWFmX2NvdW50CBRpdGVtc70QAAwQdm90ZdEGOGFuY2VzdHJ5X3Byb29mwRAYaGVhZGVytQMCHFByZXBvcnRfZG91YmxlX3ZvdGluZwEACEhlcXVpdm9jYXRpb25fcHJvb2bVBjxrZXlfb3duZXJfcHJvb2a9A3RyZXBvcnRfZG91YmxlX3ZvdGluZ191bnNpZ25lZAEACEhlcXVpdm9jYXRpb25fcHJvb2bVBjxrZXlfb3duZXJfcHJvb2a9AzxzZXRfbmV3X2dlbmVzaXMBAAQ8ZGVsYXlfaW5fYmxvY2tzBEhyZXBvcnRfZm9ya192b3RpbmcBAAhIZXF1aXZvY2F0aW9uX3Byb29mxRA8a2V5X293bmVyX3Byb29mvQNscmVwb3J0X2Zvcmtfdm90aW5nX3Vuc2lnbmVkAQAISGVxdWl2b2NhdGlvbl9wcm9vZsUQPGtleV9vd25lcl9wcm9vZr0DaHJlcG9ydF9mdXR1cmVfYmxvY2tfdm90aW5nAQAISGVxdWl2b2NhdGlvbl9wcm9vZtEGPGtleV9vd25lcl9wcm9vZr0DjHJlcG9ydF9mdXR1cmVfYmxvY2tfdm90aW5nX3Vuc2lnbmVkAQAISGVxdWl2b2NhdGlvbl9wcm9vZtEGPGtleV9vd25lcl9wcm9vZr0DAgg0cmVhcF9pZGVudGl0eQEABAx3aG8AMHBva2VfZGVwb3NpdAEABAx3aG8AAtAYU3lzdGVtAQIsGHJlbWFyawEABBhyZW1hcmskOHNldF9oZWFwX3BhZ2VzAQAEFHBhZ2VzCCBzZXRfY29kZQEABBBjb2RlJFxzZXRfY29kZV93aXRob3V0X2NoZWNrcwEABBBjb2RlJCxzZXRfc3RvcmFnZQEABBRpdGVtc3kDMGtpbGxfc3RvcmFnZQEABBBrZXlzfQMsa2lsbF9wcmVmaXgBAAgYcHJlZml4JBxzdWJrZXlzBERyZW1hcmtfd2l0aF9ldmVudAEABBhyZW1hcmskRGF1dGhvcml6ZV91cGdyYWRlAQAEJGNvZGVfaGFzaCCAYXV0aG9yaXplX3VwZ3JhZGVfd2l0aG91dF9jaGVja3MBAAQkY29kZV9oYXNoIGBhcHBseV9hdXRob3JpemVkX3VwZ3JhZGUBAAQQY29kZSQQQmFiZQECDExyZXBvcnRfZXF1aXZvY2F0aW9uAQAISGVxdWl2b2NhdGlvbl9wcm9vZrkDPGtleV9vd25lcl9wcm9vZr0DcHJlcG9ydF9lcXVpdm9jYXRpb25fdW5zaWduZWQBAAhIZXF1aXZvY2F0aW9uX3Byb29muQM8a2V5X293bmVyX3Byb29mvQNIcGxhbl9jb25maWdfY2hhbmdlAQAEGGNvbmZpZ8kDJFRpbWVzdGFtcAECBAxzZXQBAAQMbm93CBxJbmRpY2VzAQIYFGNsYWltAQAEFGluZGV4BCB0cmFuc2ZlcgEACAxuZXfVAxRpbmRleAQQZnJlZQEABBRpbmRleAQ4Zm9yY2VfdHJhbnNmZXIBAAwMbmV31QMUaW5kZXgEGGZyZWV6ZRQYZnJlZXplAQAEFGluZGV4BDBwb2tlX2RlcG9zaXQBAAQUaW5kZXgEIEJhbGFuY2VzAQIkUHRyYW5zZmVyX2FsbG93X2RlYXRoAQAIEGRlc3TVAxR2YWx1ZQg4Zm9yY2VfdHJhbnNmZXIBAAwYc291cmNl1QMQZGVzdNUDFHZhbHVlCEx0cmFuc2Zlcl9rZWVwX2FsaXZlAQAIEGRlc3TVAxR2YWx1ZQgwdHJhbnNmZXJfYWxsAQAIEGRlc3TVAyhrZWVwX2FsaXZlFDxmb3JjZV91bnJlc2VydmUBAAgMd2hv1QMYYW1vdW50CEB1cGdyYWRlX2FjY291bnRzAQAEDHdob90DRGZvcmNlX3NldF9iYWxhbmNlAQAIDHdob9UDIG5ld19mcmVlCGxmb3JjZV9hZGp1c3RfdG90YWxfaXNzdWFuY2UBAAgkZGlyZWN0aW9u4QMUZGVsdGEIEGJ1cm4BAAgUdmFsdWUIKGtlZXBfYWxpdmUUHFN0YWtpbmcBAoAQYm9uZAEACBR2YWx1ZQgUcGF5ZWU1AShib25kX2V4dHJhAQAEOG1heF9hZGRpdGlvbmFsCBh1bmJvbmQBAAQUdmFsdWUIRHdpdGhkcmF3X3VuYm9uZGVkAQAESG51bV9zbGFzaGluZ19zcGFucwQgdmFsaWRhdGUBAAQUcHJlZnM5ASBub21pbmF0ZQEABBx0YXJnZXRz6QMUY2hpbGwBAQUkc2V0X3BheWVlAQAEFHBheWVlNQE4c2V0X2NvbnRyb2xsZXIBAQVMc2V0X3ZhbGlkYXRvcl9jb3VudAEABAxuZXcEYGluY3JlYXNlX3ZhbGlkYXRvcl9jb3VudAEABChhZGRpdGlvbmFsBFRzY2FsZV92YWxpZGF0b3JfY291bnQBAAQYZmFjdG9yBDRmb3JjZV9ub19lcmFzAQEFNGZvcmNlX25ld19lcmEBAQVEc2V0X2ludnVsbmVyYWJsZXMBAAQ0aW52dWxuZXJhYmxlc90DNGZvcmNlX3Vuc3Rha2UBAAgUc3Rhc2gASG51bV9zbGFzaGluZ19zcGFucwRQZm9yY2VfbmV3X2VyYV9hbHdheXMBAQVUY2FuY2VsX2RlZmVycmVkX3NsYXNoAQAIDGVyYQQ0c2xhc2hfaW5kaWNlczkCOHBheW91dF9zdGFrZXJzAQAIPHZhbGlkYXRvcl9zdGFzaAAMZXJhBBhyZWJvbmQBAAQUdmFsdWUIKHJlYXBfc3Rhc2gBAAgUc3Rhc2gASG51bV9zbGFzaGluZ19zcGFucwQQa2ljawEABAx3aG/pA0xzZXRfc3Rha2luZ19jb25maWdzAQAcSG1pbl9ub21pbmF0b3JfYm9uZO0DSG1pbl92YWxpZGF0b3JfYm9uZO0DTG1heF9ub21pbmF0b3JfY291bnTxA0xtYXhfdmFsaWRhdG9yX2NvdW508QM8Y2hpbGxfdGhyZXNob2xk8QM4bWluX2NvbW1pc3Npb27xA0htYXhfc3Rha2VkX3Jld2FyZHPxAyxjaGlsbF9vdGhlcgEABBRzdGFzaABoZm9yY2VfYXBwbHlfbWluX2NvbW1pc3Npb24BAAQ8dmFsaWRhdG9yX3N0YXNoAEhzZXRfbWluX2NvbW1pc3Npb24BAAQMbmV3BFhwYXlvdXRfc3Rha2Vyc19ieV9wYWdlAQAMPHZhbGlkYXRvcl9zdGFzaAAMZXJhBBBwYWdlBDB1cGRhdGVfcGF5ZWUBAAQoY29udHJvbGxlcgBoZGVwcmVjYXRlX2NvbnRyb2xsZXJfYmF0Y2gBAAQsY29udHJvbGxlcnPdAzhyZXN0b3JlX2xlZGdlcgEAEBRzdGFzaABAbWF5YmVfY29udHJvbGxlcgUCLG1heWJlX3RvdGFs9QM8bWF5YmVfdW5sb2NraW5nAQRAbWlncmF0ZV9jdXJyZW5jeQEABBRzdGFzaAAwbWFudWFsX3NsYXNoAQAMPHZhbGlkYXRvcl9zdGFzaAAMZXJhBDhzbGFzaF9mcmFjdGlvbgQoUGFyYW1ldGVycwECBDRzZXRfcGFyYW1ldGVyAQAEJGtleV92YWx1ZVUEHFNlc3Npb24BAgggc2V0X2tleXMBAAgQa2V5cw0EFHByb29mJChwdXJnZV9rZXlzAQEFHEdyYW5kcGEBAgxMcmVwb3J0X2VxdWl2b2NhdGlvbgEACEhlcXVpdm9jYXRpb25fcHJvb2YlBDxrZXlfb3duZXJfcHJvb2a9A3ByZXBvcnRfZXF1aXZvY2F0aW9uX3Vuc2lnbmVkAQAISGVxdWl2b2NhdGlvbl9wcm9vZiUEPGtleV9vd25lcl9wcm9vZr0DMG5vdGVfc3RhbGxlZAEACBRkZWxheQRsYmVzdF9maW5hbGl6ZWRfYmxvY2tfbnVtYmVyBBxVdGlsaXR5AQIgFGJhdGNoAQAEFGNhbGxz1RA0YXNfZGVyaXZhdGl2ZQEACBRpbmRleAQQY2FsbNEQJGJhdGNoX2FsbAEABBRjYWxsc9UQLGRpc3BhdGNoX2FzAQAIJGFzX29yaWdpbnUPEGNhbGzRECxmb3JjZV9iYXRjaAEABBRjYWxsc9UQLHdpdGhfd2VpZ2h0AQAIEGNhbGzREBh3ZWlnaHQYHGlmX2Vsc2UBAAgQbWFpbtEQIGZhbGxiYWNr0RBQZGlzcGF0Y2hfYXNfZmFsbGlibGUBAAgkYXNfb3JpZ2ludQ8QY2FsbNEQIElkZW50aXR5AQJgNGFkZF9yZWdpc3RyYXIBAAQcYWNjb3VudNUDMHNldF9pZGVudGl0eQEABBBpbmZv7Q8gc2V0X3N1YnMBAAQQc3Vic/UPOGNsZWFyX2lkZW50aXR5AQEFRHJlcXVlc3RfanVkZ2VtZW50AQAIJHJlZ19pbmRleAQcbWF4X2ZlZQg4Y2FuY2VsX3JlcXVlc3QBAAQkcmVnX2luZGV4BBxzZXRfZmVlAQAIFGluZGV4BAxmZWUIOHNldF9hY2NvdW50X2lkAQAIFGluZGV4BAxuZXfVAyhzZXRfZmllbGRzAQAIFGluZGV4BBhmaWVsZHMIRHByb3ZpZGVfanVkZ2VtZW50AQAQJHJlZ19pbmRleAQYdGFyZ2V01QMkanVkZ2VtZW50+Q8gaWRlbnRpdHkgNGtpbGxfaWRlbnRpdHkBAAQYdGFyZ2V01QMcYWRkX3N1YgEACAxzdWLVAxBkYXRh3Q8ocmVuYW1lX3N1YgEACAxzdWLVAxBkYXRh3Q8ocmVtb3ZlX3N1YgEABAxzdWLVAyBxdWl0X3N1YgEBBVhhZGRfdXNlcm5hbWVfYXV0aG9yaXR5AQAMJGF1dGhvcml0edUDGHN1ZmZpeCQoYWxsb2NhdGlvbgRkcmVtb3ZlX3VzZXJuYW1lX2F1dGhvcml0eQEACBhzdWZmaXgkJGF1dGhvcml0edUDQHNldF91c2VybmFtZV9mb3IBABAMd2hv1QMgdXNlcm5hbWUkJHNpZ25hdHVyZUUGOHVzZV9hbGxvY2F0aW9uFDxhY2NlcHRfdXNlcm5hbWUBAAQgdXNlcm5hbWUkXHJlbW92ZV9leHBpcmVkX2FwcHJvdmFsAQAEIHVzZXJuYW1lJFBzZXRfcHJpbWFyeV91c2VybmFtZQEABCB1c2VybmFtZSQ8dW5iaW5kX3VzZXJuYW1lAQAEIHVzZXJuYW1lJDxyZW1vdmVfdXNlcm5hbWUBAAQgdXNlcm5hbWUkNGtpbGxfdXNlcm5hbWUBAAQgdXNlcm5hbWUkIFJlY292ZXJ5AQIoMGFzX3JlY292ZXJlZAEACBxhY2NvdW501QMQY2FsbNEQNHNldF9yZWNvdmVyZWQBAAgQbG9zdNUDHHJlc2N1ZXLVAzxjcmVhdGVfcmVjb3ZlcnkBAAwcZnJpZW5kc90DJHRocmVzaG9sZAQwZGVsYXlfcGVyaW9kBERpbml0aWF0ZV9yZWNvdmVyeQEABBxhY2NvdW501QM4dm91Y2hfcmVjb3ZlcnkBAAgQbG9zdNUDHHJlc2N1ZXLVAzhjbGFpbV9yZWNvdmVyeQEABBxhY2NvdW501QM4Y2xvc2VfcmVjb3ZlcnkBAAQccmVzY3VlctUDPHJlbW92ZV9yZWNvdmVyeQEBBUBjYW5jZWxfcmVjb3ZlcmVkAQAEHGFjY291bnTVAzBwb2tlX2RlcG9zaXQBAAQ0bWF5YmVfYWNjb3VudAEQHFZlc3RpbmcBAhgQdmVzdAEBBSh2ZXN0X290aGVyAQAEGHRhcmdldNUDPHZlc3RlZF90cmFuc2ZlcgEACBh0YXJnZXTVAyBzY2hlZHVsZXUEVGZvcmNlX3Zlc3RlZF90cmFuc2ZlcgEADBhzb3VyY2XVAxh0YXJnZXTVAyBzY2hlZHVsZXUEPG1lcmdlX3NjaGVkdWxlcwEACDxzY2hlZHVsZTFfaW5kZXgEPHNjaGVkdWxlMl9pbmRleAR0Zm9yY2VfcmVtb3ZlX3Zlc3Rpbmdfc2NoZWR1bGUBAAgYdGFyZ2V01QM4c2NoZWR1bGVfaW5kZXgEJFNjaGVkdWxlcgECKCBzY2hlZHVsZQEAEBB3aGVuBDhtYXliZV9wZXJpb2RpY4EDIHByaW9yaXR5BBBjYWxs0RAYY2FuY2VsAQAIEHdoZW4EFGluZGV4BDhzY2hlZHVsZV9uYW1lZAEAFAhpZCAQd2hlbgQ4bWF5YmVfcGVyaW9kaWOBAyBwcmlvcml0eQQQY2FsbNEQMGNhbmNlbF9uYW1lZAEABAhpZCA4c2NoZWR1bGVfYWZ0ZXIBABAUYWZ0ZXIEOG1heWJlX3BlcmlvZGljgQMgcHJpb3JpdHkEEGNhbGzREFBzY2hlZHVsZV9uYW1lZF9hZnRlcgEAFAhpZCAUYWZ0ZXIEOG1heWJlX3BlcmlvZGljgQMgcHJpb3JpdHkEEGNhbGzRECRzZXRfcmV0cnkBAAwQdGFzaw0BHHJldHJpZXMEGHBlcmlvZAQ8c2V0X3JldHJ5X25hbWVkAQAMCGlkIBxyZXRyaWVzBBhwZXJpb2QEMGNhbmNlbF9yZXRyeQEABBB0YXNrDQFIY2FuY2VsX3JldHJ5X25hbWVkAQAECGlkICBQcmVpbWFnZQECFDRub3RlX3ByZWltYWdlAQAEFGJ5dGVzJDx1bm5vdGVfcHJlaW1hZ2UBAAQQaGFzaCBAcmVxdWVzdF9wcmVpbWFnZQEABBBoYXNoIEh1bnJlcXVlc3RfcHJlaW1hZ2UBAAQQaGFzaCA4ZW5zdXJlX3VwZGF0ZWQBAAQYaGFzaGVzOQMQU3VkbwECFBBzdWRvAQAEEGNhbGzREFRzdWRvX3VuY2hlY2tlZF93ZWlnaHQBAAgQY2FsbNEQGHdlaWdodBgcc2V0X2tleQEABAxuZXfVAxxzdWRvX2FzAQAIDHdob9UDEGNhbGzREChyZW1vdmVfa2V5AQEFFFByb3h5AQIsFHByb3h5AQAMEHJlYWzVA0Bmb3JjZV9wcm94eV90eXBlERAQY2FsbNEQJGFkZF9wcm94eQEADCBkZWxlZ2F0ZdUDKHByb3h5X3R5cGU1DhRkZWxheQQwcmVtb3ZlX3Byb3h5AQAMIGRlbGVnYXRl1QMocHJveHlfdHlwZTUOFGRlbGF5BDhyZW1vdmVfcHJveGllcwEBBSxjcmVhdGVfcHVyZQEADChwcm94eV90eXBlNQ4UZGVsYXkEFGluZGV4BCRraWxsX3B1cmUBABQcc3Bhd25lctUDKHByb3h5X3R5cGU1DhRpbmRleAQYaGVpZ2h0BCRleHRfaW5kZXgEIGFubm91bmNlAQAIEHJlYWzVAyRjYWxsX2hhc2ggTHJlbW92ZV9hbm5vdW5jZW1lbnQBAAgQcmVhbNUDJGNhbGxfaGFzaCBMcmVqZWN0X2Fubm91bmNlbWVudAEACCBkZWxlZ2F0ZdUDJGNhbGxfaGFzaCA8cHJveHlfYW5ub3VuY2VkAQAQIGRlbGVnYXRl1QMQcmVhbNUDQGZvcmNlX3Byb3h5X3R5cGUREBBjYWxs0RAwcG9rZV9kZXBvc2l0AQEFIE11bHRpc2lnAQIUUGFzX211bHRpX3RocmVzaG9sZF8xAQAIRG90aGVyX3NpZ25hdG9yaWVz3QMQY2FsbNEQIGFzX211bHRpAQAUJHRocmVzaG9sZAREb3RoZXJfc2lnbmF0b3JpZXPdAzxtYXliZV90aW1lcG9pbnSNBBBjYWxs0RAobWF4X3dlaWdodBhAYXBwcm92ZV9hc19tdWx0aQEAFCR0aHJlc2hvbGQERG90aGVyX3NpZ25hdG9yaWVz3QM8bWF5YmVfdGltZXBvaW50jQQkY2FsbF9oYXNoIChtYXhfd2VpZ2h0GDxjYW5jZWxfYXNfbXVsdGkBABAkdGhyZXNob2xkBERvdGhlcl9zaWduYXRvcmllc90DJHRpbWVwb2ludPEBJGNhbGxfaGFzaCAwcG9rZV9kZXBvc2l0AQAMJHRocmVzaG9sZAREb3RoZXJfc2lnbmF0b3JpZXPdAyRjYWxsX2hhc2ggaEVsZWN0aW9uUHJvdmlkZXJNdWx0aVBoYXNlAQIUPHN1Ym1pdF91bnNpZ25lZAEACDByYXdfc29sdXRpb25ZBRx3aXRuZXNzXQVsc2V0X21pbmltdW1fdW50cnVzdGVkX3Njb3JlAQAEQG1heWJlX25leHRfc2NvcmVhBXRzZXRfZW1lcmdlbmN5X2VsZWN0aW9uX3Jlc3VsdAEABCBzdXBwb3J0c3UFGHN1Ym1pdAEABDByYXdfc29sdXRpb25ZBUxnb3Zlcm5hbmNlX2ZhbGxiYWNrAQEFJFZvdGVyTGlzdAECDBRyZWJhZwEABChkaXNsb2NhdGVk1QM8cHV0X2luX2Zyb250X29mAQAEHGxpZ2h0ZXLVA1RwdXRfaW5fZnJvbnRfb2Zfb3RoZXIBAAgcaGVhdmllctUDHGxpZ2h0ZXLVAzxOb21pbmF0aW9uUG9vbHMBAmgQam9pbgEACBhhbW91bnQIHHBvb2xfaWQEKGJvbmRfZXh0cmEBAAQUZXh0cmGBBTBjbGFpbV9wYXlvdXQBAQUYdW5ib25kAQAIOG1lbWJlcl9hY2NvdW501QNAdW5ib25kaW5nX3BvaW50cwhYcG9vbF93aXRoZHJhd191bmJvbmRlZAEACBxwb29sX2lkBEhudW1fc2xhc2hpbmdfc3BhbnMERHdpdGhkcmF3X3VuYm9uZGVkAQAIOG1lbWJlcl9hY2NvdW501QNIbnVtX3NsYXNoaW5nX3NwYW5zBBhjcmVhdGUBABAYYW1vdW50CBByb2901QMkbm9taW5hdG9y1QMcYm91bmNlctUDTGNyZWF0ZV93aXRoX3Bvb2xfaWQBABQYYW1vdW50CBByb2901QMkbm9taW5hdG9y1QMcYm91bmNlctUDHHBvb2xfaWQEIG5vbWluYXRlAQAIHHBvb2xfaWQEKHZhbGlkYXRvcnPdAyRzZXRfc3RhdGUBAAgccG9vbF9pZAQUc3RhdGUdAjBzZXRfbWV0YWRhdGEBAAgccG9vbF9pZAQgbWV0YWRhdGEkLHNldF9jb25maWdzAQAYNG1pbl9qb2luX2JvbmTtAzxtaW5fY3JlYXRlX2JvbmTtAyRtYXhfcG9vbHPxAyxtYXhfbWVtYmVyc/EDUG1heF9tZW1iZXJzX3Blcl9wb29s8QNUZ2xvYmFsX21heF9jb21taXNzaW9u8QMwdXBkYXRlX3JvbGVzAQAQHHBvb2xfaWQEIG5ld19yb290hQU0bmV3X25vbWluYXRvcoUFLG5ld19ib3VuY2VyhQUUY2hpbGwBAAQccG9vbF9pZARAYm9uZF9leHRyYV9vdGhlcgEACBhtZW1iZXLVAxRleHRyYYEFUHNldF9jbGFpbV9wZXJtaXNzaW9uAQAEKHBlcm1pc3Npb26JBUhjbGFpbV9wYXlvdXRfb3RoZXIBAAQUb3RoZXIAOHNldF9jb21taXNzaW9uAQAIHHBvb2xfaWQEOG5ld19jb21taXNzaW9uJQJIc2V0X2NvbW1pc3Npb25fbWF4AQAIHHBvb2xfaWQEOG1heF9jb21taXNzaW9uBGhzZXRfY29tbWlzc2lvbl9jaGFuZ2VfcmF0ZQEACBxwb29sX2lkBCxjaGFuZ2VfcmF0ZSkCQGNsYWltX2NvbW1pc3Npb24BAAQccG9vbF9pZARMYWRqdXN0X3Bvb2xfZGVwb3NpdAEABBxwb29sX2lkBHxzZXRfY29tbWlzc2lvbl9jbGFpbV9wZXJtaXNzaW9uAQAIHHBvb2xfaWQEKHBlcm1pc3Npb24xAixhcHBseV9zbGFzaAEABDhtZW1iZXJfYWNjb3VudNUDSG1pZ3JhdGVfZGVsZWdhdGlvbgEABDhtZW1iZXJfYWNjb3VudNUDeG1pZ3JhdGVfcG9vbF90b19kZWxlZ2F0ZV9zdGFrZQEABBxwb29sX2lkBCxGYXN0VW5zdGFrZQECDFRyZWdpc3Rlcl9mYXN0X3Vuc3Rha2UBAQUoZGVyZWdpc3RlcgEBBRxjb250cm9sAQAENGVyYXNfdG9fY2hlY2sEQENvbnZpY3Rpb25Wb3RpbmcBAhgQdm90ZQEACChwb2xsX2luZGV4BBB2b3RlNQQgZGVsZWdhdGUBABAUY2xhc3MECHRv1QMoY29udmljdGlvbjkEHGJhbGFuY2UIKHVuZGVsZWdhdGUBAAQUY2xhc3MEGHVubG9jawEACBRjbGFzcwQYdGFyZ2V01QMscmVtb3ZlX3ZvdGUBAAgUY2xhc3MtBBRpbmRleAREcmVtb3ZlX290aGVyX3ZvdGUBAAwYdGFyZ2V01QMUY2xhc3MEFGluZGV4BCRSZWZlcmVuZGEBAiQYc3VibWl0AQAMPHByb3Bvc2FsX29yaWdpbnUPIHByb3Bvc2FspQFAZW5hY3RtZW50X21vbWVudEEEWHBsYWNlX2RlY2lzaW9uX2RlcG9zaXQBAAQUaW5kZXgEXHJlZnVuZF9kZWNpc2lvbl9kZXBvc2l0AQAEFGluZGV4BBhjYW5jZWwBAAQUaW5kZXgEEGtpbGwBAAQUaW5kZXgEQG51ZGdlX3JlZmVyZW5kdW0BAAQUaW5kZXgESG9uZV9mZXdlcl9kZWNpZGluZwEABBR0cmFjawRkcmVmdW5kX3N1Ym1pc3Npb25fZGVwb3NpdAEABBRpbmRleAQwc2V0X21ldGFkYXRhAQAIFGluZGV4BChtYXliZV9oYXNoEQEkV2hpdGVsaXN0AQIQOHdoaXRlbGlzdF9jYWxsAQAEJGNhbGxfaGFzaCBccmVtb3ZlX3doaXRlbGlzdGVkX2NhbGwBAAQkY2FsbF9oYXNoIGRkaXNwYXRjaF93aGl0ZWxpc3RlZF9jYWxsAQAMJGNhbGxfaGFzaCBAY2FsbF9lbmNvZGVkX2xlbgRMY2FsbF93ZWlnaHRfd2l0bmVzcxicZGlzcGF0Y2hfd2hpdGVsaXN0ZWRfY2FsbF93aXRoX3ByZWltYWdlAQAEEGNhbGzRECBUcmVhc3VyeQECGCxzcGVuZF9sb2NhbAEACBhhbW91bnQILGJlbmVmaWNpYXJ51QM8cmVtb3ZlX2FwcHJvdmFsAQAELHByb3Bvc2FsX2lkBBRzcGVuZAEAEChhc3NldF9raW5kjQ4YYW1vdW50CCxiZW5lZmljaWFyeZEOKHZhbGlkX2Zyb20tBBhwYXlvdXQBAAQUaW5kZXgEMGNoZWNrX3N0YXR1cwEABBRpbmRleAQodm9pZF9zcGVuZAEABBRpbmRleAQ0Q29uZmlndXJhdGlvbgECuHxzZXRfdmFsaWRhdGlvbl91cGdyYWRlX2Nvb2xkb3duAQAEDG5ldwRwc2V0X3ZhbGlkYXRpb25fdXBncmFkZV9kZWxheQEABAxuZXcEZHNldF9jb2RlX3JldGVudGlvbl9wZXJpb2QBAAQMbmV3BERzZXRfbWF4X2NvZGVfc2l6ZQEABAxuZXcEQHNldF9tYXhfcG92X3NpemUBAAQMbmV3BFhzZXRfbWF4X2hlYWRfZGF0YV9zaXplAQAEDG5ldwRIc2V0X2NvcmV0aW1lX2NvcmVzAQAEDG5ldwRwc2V0X2dyb3VwX3JvdGF0aW9uX2ZyZXF1ZW5jeQEABAxuZXcEdHNldF9wYXJhc19hdmFpbGFiaWxpdHlfcGVyaW9kAQAEDG5ldwRgc2V0X3NjaGVkdWxpbmdfbG9va2FoZWFkAQAEDG5ldwRsc2V0X21heF92YWxpZGF0b3JzX3Blcl9jb3JlAQAEDG5ldy0ESHNldF9tYXhfdmFsaWRhdG9ycwEABAxuZXctBEhzZXRfZGlzcHV0ZV9wZXJpb2QBAAQMbmV3BLRzZXRfZGlzcHV0ZV9wb3N0X2NvbmNsdXNpb25fYWNjZXB0YW5jZV9wZXJpb2QBAAQMbmV3BERzZXRfbm9fc2hvd19zbG90cwEABAxuZXcEUHNldF9uX2RlbGF5X3RyYW5jaGVzAQAEDG5ldwR4c2V0X3plcm90aF9kZWxheV90cmFuY2hlX3dpZHRoAQAEDG5ldwRQc2V0X25lZWRlZF9hcHByb3ZhbHMBAAQMbmV3BHBzZXRfcmVsYXlfdnJmX21vZHVsb19zYW1wbGVzAQAEDG5ldwRoc2V0X21heF91cHdhcmRfcXVldWVfY291bnQBAAQMbmV3BGRzZXRfbWF4X3Vwd2FyZF9xdWV1ZV9zaXplAQAEDG5ldwR0c2V0X21heF9kb3dud2FyZF9tZXNzYWdlX3NpemUBAAQMbmV3BGxzZXRfbWF4X3Vwd2FyZF9tZXNzYWdlX3NpemUBAAQMbmV3BKBzZXRfbWF4X3Vwd2FyZF9tZXNzYWdlX251bV9wZXJfY2FuZGlkYXRlAQAEDG5ldwRkc2V0X2hybXBfb3Blbl9yZXF1ZXN0X3R0bAEABAxuZXcEXHNldF9ocm1wX3NlbmRlcl9kZXBvc2l0AQAEDG5ldwhoc2V0X2hybXBfcmVjaXBpZW50X2RlcG9zaXQBAAQMbmV3CHRzZXRfaHJtcF9jaGFubmVsX21heF9jYXBhY2l0eQEABAxuZXcEfHNldF9ocm1wX2NoYW5uZWxfbWF4X3RvdGFsX3NpemUBAAQMbmV3BJxzZXRfaHJtcF9tYXhfcGFyYWNoYWluX2luYm91bmRfY2hhbm5lbHMBAAQMbmV3BIRzZXRfaHJtcF9jaGFubmVsX21heF9tZXNzYWdlX3NpemUBAAQMbmV3BKBzZXRfaHJtcF9tYXhfcGFyYWNoYWluX291dGJvdW5kX2NoYW5uZWxzAQAEDG5ldwSYc2V0X2hybXBfbWF4X21lc3NhZ2VfbnVtX3Blcl9jYW5kaWRhdGUBAAQMbmV3BEhzZXRfcHZmX3ZvdGluZ190dGwBAAQMbmV3BJBzZXRfbWluaW11bV92YWxpZGF0aW9uX3VwZ3JhZGVfZGVsYXkBAAQMbmV3BHBzZXRfYnlwYXNzX2NvbnNpc3RlbmN5X2NoZWNrAQAEDG5ldxRgc2V0X2FzeW5jX2JhY2tpbmdfcGFyYW1zAQAEDG5ld5UFTHNldF9leGVjdXRvcl9wYXJhbXMBAAQMbmV3pQVYc2V0X29uX2RlbWFuZF9iYXNlX2ZlZQEABAxuZXcIdHNldF9vbl9kZW1hbmRfZmVlX3ZhcmlhYmlsaXR5AQAEDG5ldwRwc2V0X29uX2RlbWFuZF9xdWV1ZV9tYXhfc2l6ZQEABAxuZXcEmHNldF9vbl9kZW1hbmRfdGFyZ2V0X3F1ZXVlX3V0aWxpemF0aW9uAQAEDG5ldwRkc2V0X21pbmltdW1fYmFja2luZ192b3RlcwEABAxuZXcEQHNldF9ub2RlX2ZlYXR1cmUBAAgUaW5kZXgEFHZhbHVlFGhzZXRfYXBwcm92YWxfdm90aW5nX3BhcmFtcwEABAxuZXcEUHNldF9zY2hlZHVsZXJfcGFyYW1zAQAEDG5ld6kFLFBhcmFzU2hhcmVkAQEFNFBhcmFJbmNsdXNpb24BAQUwUGFyYUluaGVyZW50AQIEFGVudGVyAQAEEGRhdGE9EBRQYXJhcwECMFhmb3JjZV9zZXRfY3VycmVudF9jb2RlAQAIEHBhcmEEIG5ld19jb2RlJFhmb3JjZV9zZXRfY3VycmVudF9oZWFkAQAIEHBhcmEEIG5ld19oZWFkJGxmb3JjZV9zY2hlZHVsZV9jb2RlX3VwZ3JhZGUBAAwQcGFyYQQgbmV3X2NvZGUkTHJlbGF5X3BhcmVudF9udW1iZXIETGZvcmNlX25vdGVfbmV3X2hlYWQBAAgQcGFyYQQgbmV3X2hlYWQkSGZvcmNlX3F1ZXVlX2FjdGlvbgEABBBwYXJhBGxhZGRfdHJ1c3RlZF92YWxpZGF0aW9uX2NvZGUBAAQ8dmFsaWRhdGlvbl9jb2RlJGxwb2tlX3VudXNlZF92YWxpZGF0aW9uX2NvZGUBAARQdmFsaWRhdGlvbl9jb2RlX2hhc2ggbGluY2x1ZGVfcHZmX2NoZWNrX3N0YXRlbWVudAEACBBzdG10BQYkc2lnbmF0dXJlQQJ0Zm9yY2Vfc2V0X21vc3RfcmVjZW50X2NvbnRleHQBAAgQcGFyYQQcY29udGV4dARccmVtb3ZlX3VwZ3JhZGVfY29vbGRvd24BAAQQcGFyYQSUYXV0aG9yaXplX2ZvcmNlX3NldF9jdXJyZW50X2NvZGVfaGFzaAEADBBwYXJhBDRuZXdfY29kZV9oYXNoIDB2YWxpZF9wZXJpb2QEnGFwcGx5X2F1dGhvcml6ZWRfZm9yY2Vfc2V0X2N1cnJlbnRfY29kZQEACBBwYXJhBCBuZXdfY29kZSQsSW5pdGlhbGl6ZXIBAgQ0Zm9yY2VfYXBwcm92ZQEABBR1cF90bwQQSHJtcAECLFhocm1wX2luaXRfb3Blbl9jaGFubmVsAQAMJHJlY2lwaWVudARUcHJvcG9zZWRfbWF4X2NhcGFjaXR5BGRwcm9wb3NlZF9tYXhfbWVzc2FnZV9zaXplBGBocm1wX2FjY2VwdF9vcGVuX2NoYW5uZWwBAAQYc2VuZGVyBEhocm1wX2Nsb3NlX2NoYW5uZWwBAAQoY2hhbm5lbF9pZFUCQGZvcmNlX2NsZWFuX2hybXABAAwQcGFyYQQsbnVtX2luYm91bmQEMG51bV9vdXRib3VuZARcZm9yY2VfcHJvY2Vzc19ocm1wX29wZW4BAAQgY2hhbm5lbHMEYGZvcmNlX3Byb2Nlc3NfaHJtcF9jbG9zZQEABCBjaGFubmVscwRgaHJtcF9jYW5jZWxfb3Blbl9yZXF1ZXN0AQAIKGNoYW5uZWxfaWRVAjRvcGVuX3JlcXVlc3RzBFxmb3JjZV9vcGVuX2hybXBfY2hhbm5lbAEAEBhzZW5kZXIEJHJlY2lwaWVudAQwbWF4X2NhcGFjaXR5BEBtYXhfbWVzc2FnZV9zaXplBGBlc3RhYmxpc2hfc3lzdGVtX2NoYW5uZWwBAAgYc2VuZGVyBCRyZWNpcGllbnQEVHBva2VfY2hhbm5lbF9kZXBvc2l0cwEACBhzZW5kZXIEJHJlY2lwaWVudAR0ZXN0YWJsaXNoX2NoYW5uZWxfd2l0aF9zeXN0ZW0BAARMdGFyZ2V0X3N5c3RlbV9jaGFpbgQ0UGFyYXNEaXNwdXRlcwECBDhmb3JjZV91bmZyZWV6ZQEBBTRQYXJhc1NsYXNoaW5nAQIEcHJlcG9ydF9kaXNwdXRlX2xvc3RfdW5zaWduZWQBAAg0ZGlzcHV0ZV9wcm9vZk0QPGtleV9vd25lcl9wcm9vZr0DaE9uRGVtYW5kQXNzaWdubWVudFByb3ZpZGVyAQIMXHBsYWNlX29yZGVyX2FsbG93X2RlYXRoAQAIKG1heF9hbW91bnQIHHBhcmFfaWQEWHBsYWNlX29yZGVyX2tlZXBfYWxpdmUBAAgobWF4X2Ftb3VudAgccGFyYV9pZARgcGxhY2Vfb3JkZXJfd2l0aF9jcmVkaXRzAQAIKG1heF9hbW91bnQIHHBhcmFfaWQEJFJlZ2lzdHJhcgECJCByZWdpc3RlcgEADAhpZAQwZ2VuZXNpc19oZWFkJDx2YWxpZGF0aW9uX2NvZGUkOGZvcmNlX3JlZ2lzdGVyAQAUDHdobwAcZGVwb3NpdAgIaWQEMGdlbmVzaXNfaGVhZCQ8dmFsaWRhdGlvbl9jb2RlJChkZXJlZ2lzdGVyAQAECGlkBBBzd2FwAQAICGlkBBRvdGhlcgQscmVtb3ZlX2xvY2sBAAQQcGFyYQQccmVzZXJ2ZQEBBSBhZGRfbG9jawEABBBwYXJhBFRzY2hlZHVsZV9jb2RlX3VwZ3JhZGUBAAgQcGFyYQQgbmV3X2NvZGUkQHNldF9jdXJyZW50X2hlYWQBAAgQcGFyYQQgbmV3X2hlYWQkFFNsb3RzAQIMLGZvcmNlX2xlYXNlAQAUEHBhcmEEGGxlYXNlcgAYYW1vdW50CDBwZXJpb2RfYmVnaW4EMHBlcmlvZF9jb3VudARAY2xlYXJfYWxsX2xlYXNlcwEABBBwYXJhBDx0cmlnZ2VyX29uYm9hcmQBAAQQcGFyYQRAUGFyYXNTdWRvV3JhcHBlcgECGHRzdWRvX3NjaGVkdWxlX3BhcmFfaW5pdGlhbGl6ZQEACAhpZAQcZ2VuZXNpcxUJaHN1ZG9fc2NoZWR1bGVfcGFyYV9jbGVhbnVwAQAECGlkBIBzdWRvX3NjaGVkdWxlX3BhcmF0aHJlYWRfdXBncmFkZQEABAhpZASEc3Vkb19zY2hlZHVsZV9wYXJhY2hhaW5fZG93bmdyYWRlAQAECGlkBFxzdWRvX3F1ZXVlX2Rvd253YXJkX3hjbQEACAhpZAQMeGNtWRBsc3Vkb19lc3RhYmxpc2hfaHJtcF9jaGFubmVsAQAQGHNlbmRlcgQkcmVjaXBpZW50BDBtYXhfY2FwYWNpdHkEQG1heF9tZXNzYWdlX3NpemUEIEF1Y3Rpb25zAQIMLG5ld19hdWN0aW9uAQAIIGR1cmF0aW9uBEhsZWFzZV9wZXJpb2RfaW5kZXgEDGJpZAEAFBBwYXJhBDRhdWN0aW9uX2luZGV4BChmaXJzdF9zbG90BCRsYXN0X3Nsb3QEGGFtb3VudAg4Y2FuY2VsX2F1Y3Rpb24BAQUkQ3Jvd2Rsb2FuAQIkGGNyZWF0ZQEAGBRpbmRleAQMY2FwCDBmaXJzdF9wZXJpb2QELGxhc3RfcGVyaW9kBAxlbmQEIHZlcmlmaWVyPQYoY29udHJpYnV0ZQEADBRpbmRleAQUdmFsdWUIJHNpZ25hdHVyZUUGIHdpdGhkcmF3AQAIDHdobwAUaW5kZXgEGHJlZnVuZAEABBRpbmRleAQgZGlzc29sdmUBAAQUaW5kZXgEEGVkaXQBABgUaW5kZXgEDGNhcAgwZmlyc3RfcGVyaW9kBCxsYXN0X3BlcmlvZAQMZW5kBCB2ZXJpZmllcj0GIGFkZF9tZW1vAQAIFGluZGV4BBBtZW1vJBBwb2tlAQAEFGluZGV4BDhjb250cmlidXRlX2FsbAEACBRpbmRleAQkc2lnbmF0dXJlRQY0QXNzaWduZWRTbG90cwECFGhhc3NpZ25fcGVybV9wYXJhY2hhaW5fc2xvdAEABAhpZARoYXNzaWduX3RlbXBfcGFyYWNoYWluX3Nsb3QBAAgIaWQESGxlYXNlX3BlcmlvZF9zdGFydGEQXHVuYXNzaWduX3BhcmFjaGFpbl9zbG90AQAECGlkBFxzZXRfbWF4X3Blcm1hbmVudF9zbG90cwEABBRzbG90cwRcc2V0X21heF90ZW1wb3Jhcnlfc2xvdHMBAAQUc2xvdHMEIENvcmV0aW1lAQIQSHJlcXVlc3RfY29yZV9jb3VudAEABBRjb3VudARIcmVxdWVzdF9yZXZlbnVlX2F0AQAEEHdoZW4EOGNyZWRpdF9hY2NvdW50AQAIDHdobwAYYW1vdW50CCxhc3NpZ25fY29yZQEAEBBjb3JlBBRiZWdpbgQoYXNzaWdubWVudFUGIGVuZF9oaW50LQQ8U3Rha2luZ0FoQ2xpZW50AQIMNHZhbGlkYXRvcl9zZXQBAAQYcmVwb3J0bRAgc2V0X21vZGUBAAQQbW9kZXEQWGZvcmNlX29uX21pZ3JhdGlvbl9lbmQBAQVQTXVsdGlCbG9ja01pZ3JhdGlvbnMBAhBAZm9yY2Vfc2V0X2N1cnNvcgEABBhjdXJzb3KBEFxmb3JjZV9zZXRfYWN0aXZlX2N1cnNvcgEADBRpbmRleAQwaW5uZXJfY3Vyc29yxQUoc3RhcnRlZF9hdC0ESGZvcmNlX29uYm9hcmRfbWJtcwEBBThjbGVhcl9oaXN0b3JpYwEABCBzZWxlY3RvcoUQJFhjbVBhbGxldAECRBBzZW5kAQAIEGRlc3SRDhxtZXNzYWdlWRA8dGVsZXBvcnRfYXNzZXRzAQAQEGRlc3SRDixiZW5lZmljaWFyeZEOGGFzc2V0cx0POGZlZV9hc3NldF9pdGVtBFxyZXNlcnZlX3RyYW5zZmVyX2Fzc2V0cwEAEBBkZXN0kQ4sYmVuZWZpY2lhcnmRDhhhc3NldHMdDzhmZWVfYXNzZXRfaXRlbQQcZXhlY3V0ZQEACBxtZXNzYWdlWRAobWF4X3dlaWdodBhEZm9yY2VfeGNtX3ZlcnNpb24BAAggbG9jYXRpb26JDhx2ZXJzaW9uBGRmb3JjZV9kZWZhdWx0X3hjbV92ZXJzaW9uAQAERG1heWJlX3hjbV92ZXJzaW9uLQR4Zm9yY2Vfc3Vic2NyaWJlX3ZlcnNpb25fbm90aWZ5AQAEIGxvY2F0aW9ukQ6AZm9yY2VfdW5zdWJzY3JpYmVfdmVyc2lvbl9ub3RpZnkBAAQgbG9jYXRpb26RDnxsaW1pdGVkX3Jlc2VydmVfdHJhbnNmZXJfYXNzZXRzAQAUEGRlc3SRDixiZW5lZmljaWFyeZEOGGFzc2V0cx0POGZlZV9hc3NldF9pdGVtBDB3ZWlnaHRfbGltaXTxAlxsaW1pdGVkX3RlbGVwb3J0X2Fzc2V0cwEAFBBkZXN0kQ4sYmVuZWZpY2lhcnmRDhhhc3NldHMdDzhmZWVfYXNzZXRfaXRlbQQwd2VpZ2h0X2xpbWl08QJAZm9yY2Vfc3VzcGVuc2lvbgEABCRzdXNwZW5kZWQUPHRyYW5zZmVyX2Fzc2V0cwEAFBBkZXN0kQ4sYmVuZWZpY2lhcnmRDhhhc3NldHMdDzhmZWVfYXNzZXRfaXRlbQQwd2VpZ2h0X2xpbWl08QIwY2xhaW1fYXNzZXRzAQAIGGFzc2V0cx0PLGJlbmVmaWNpYXJ5kQ6MdHJhbnNmZXJfYXNzZXRzX3VzaW5nX3R5cGVfYW5kX3RoZW4BABwQZGVzdJEOGGFzc2V0cx0PUGFzc2V0c190cmFuc2Zlcl90eXBljRA4cmVtb3RlX2ZlZXNfaWSREEhmZWVzX3RyYW5zZmVyX3R5cGWNEEhjdXN0b21feGNtX29uX2Rlc3RZEDB3ZWlnaHRfbGltaXTxAlBhZGRfYXV0aG9yaXplZF9hbGlhcwEACBxhbGlhc2VykQ4cZXhwaXJlc/UDXHJlbW92ZV9hdXRob3JpemVkX2FsaWFzAQAEHGFsaWFzZXKRDnRyZW1vdmVfYWxsX2F1dGhvcml6ZWRfYWxpYXNlcwEBBTBNZXNzYWdlUXVldWUBAggkcmVhcF9wYWdlAQAIOG1lc3NhZ2Vfb3JpZ2luJQMocGFnZV9pbmRleARIZXhlY3V0ZV9vdmVyd2VpZ2h0AQAQOG1lc3NhZ2Vfb3JpZ2luJQMQcGFnZQQUaW5kZXgEMHdlaWdodF9saW1pdBgkQXNzZXRSYXRlAQIMGGNyZWF0ZQEACChhc3NldF9raW5kjQ4QcmF0ZQgYdXBkYXRlAQAIKGFzc2V0X2tpbmSNDhByYXRlCBhyZW1vdmUBAAQoYXNzZXRfa2luZI0OLFJvb3RUZXN0aW5nAQIIKGZpbGxfYmxvY2sBAAQUcmF0aW8ERHRyaWdnZXJfZGVmZW5zaXZlAQEFGE1ldGFUeAECBCBkaXNwYXRjaAEABBxtZXRhX3R4sRAUQmVlZnkBAhxQcmVwb3J0X2RvdWJsZV92b3RpbmcBAAhIZXF1aXZvY2F0aW9uX3Byb29m1QY8a2V5X293bmVyX3Byb29mvQN0cmVwb3J0X2RvdWJsZV92b3RpbmdfdW5zaWduZWQBAAhIZXF1aXZvY2F0aW9uX3Byb29m1QY8a2V5X293bmVyX3Byb29mvQM8c2V0X25ld19nZW5lc2lzAQAEPGRlbGF5X2luX2Jsb2NrcwRIcmVwb3J0X2Zvcmtfdm90aW5nAQAISGVxdWl2b2NhdGlvbl9wcm9vZsUQPGtleV9vd25lcl9wcm9vZr0DbHJlcG9ydF9mb3JrX3ZvdGluZ191bnNpZ25lZAEACEhlcXVpdm9jYXRpb25fcHJvb2bFEDxrZXlfb3duZXJfcHJvb2a9A2hyZXBvcnRfZnV0dXJlX2Jsb2NrX3ZvdGluZwEACEhlcXVpdm9jYXRpb25fcHJvb2bRBjxrZXlfb3duZXJfcHJvb2a9A4xyZXBvcnRfZnV0dXJlX2Jsb2NrX3ZvdGluZ191bnNpZ25lZAEACEhlcXVpdm9jYXRpb25fcHJvb2bRBjxrZXlfb3duZXJfcHJvb2a9A0BJZGVudGl0eU1pZ3JhdG9yAQIINHJlYXBfaWRlbnRpdHkBAAQMd2hvADBwb2tlX2RlcG9zaXQBAAQMd2hvAATREAADCAT5DwTZEAAADChqdWRnZW1lbnRz3RAcZGVwb3NpdAgQaW5mb+0PAwgI3QMADBxhY2NvdW50AAxmZWUIGGZpZWxkcwgG6RAE7RAAAAgoYWNjb3VudF9pZAAoYWxsb2NhdGlvbgQCDChBbGxvY2F0aW9uAQEFQEF1dGhvcml0eURlcG9zaXQBAQMYU3lzdGVtAQEFAAgUb3duZXIAIHByb3ZpZGVy+RADDAAE+RAAFCBtYXliZV9pZBEBIHByaW9yaXR5BBBjYWxspQE4bWF5YmVfcGVyaW9kaWOBAxhvcmlnaW51DwYFEQQJEQAADCBkZWxlZ2F0ZQAocHJveHlfdHlwZTUOFGRlbGF5BAQREQADCBURCAAsFHRyYWNrBBhvcmlnaW51DyBwcm9wb3NhbKUBJGVuYWN0bWVudEEEJHN1Ym1pdHRlZARIc3VibWlzc2lvbl9kZXBvc2l03QdAZGVjaXNpb25fZGVwb3NpdOEHIGRlY2lkaW5n6QcUdGFsbHmpASBpbl9xdWV1ZRQUYWxhcm3xBwIYHE9uZ29pbmcBACwUdHJhY2sEGG9yaWdpbnUPIHByb3Bvc2FspQEkZW5hY3RtZW50QQQkc3VibWl0dGVkBEhzdWJtaXNzaW9uX2RlcG9zaXTdB0BkZWNpc2lvbl9kZXBvc2l04QcgZGVjaWRpbmfpBxR0YWxseakBIGluX3F1ZXVlFBRhbGFybfEHIEFwcHJvdmVkAQMMBOEH4QcgUmVqZWN0ZWQBAwwE4QfhByRDYW5jZWxsZWQBAwwE4QfhByBUaW1lZE91dAEDDAThB+EHGEtpbGxlZAEBAgAYKGFzc2V0X2tpbmSNDhhhbW91bnQILGJlbmVmaWNpYXJ5kQ4odmFsaWRfZnJvbQQkZXhwaXJlX2F0BBhzdGF0dXO5BwAIFGFnZW50ABhhbW91bnQIABAUcGF5ZWUAPHRvdGFsX2RlbGVnYXRlZAhUdW5jbGFpbWVkX3dpdGhkcmF3YWxzCDRwZW5kaW5nX3NsYXNoCAMIBEEJBDERAAAMMHJlbGF5X3BhcmVudCAoc3RhdGVfcm9vdCAsY2xhaW1fcXVldWU1EQQ5EQAACBhidWZmZXI9ETRsYXRlc3RfbnVtYmVyBAAkEGNvcmUEEGhhc2ggKGRlc2NyaXB0b3KhDixjb21taXRtZW50c8kFSGF2YWlsYWJpbGl0eV92b3Rlc7EFHGJhY2tlcnOxBUxyZWxheV9wYXJlbnRfbnVtYmVyBEBiYWNrZWRfaW5fbnVtYmVyBDRiYWNraW5nX2dyb3VwBARFEQADCKUOvQgETREAAAwcc2Vzc2lvbgSAYmFja2luZ192YWxpZGF0b3JzX3Blcl9jYW5kaWRhdGVRESBkaXNwdXRlc/kFBNEIAAMIBFkRBF0RAAAIJGNvZGVfaGFzaCAkZXhwaXJlX2F0BAAIEGtleXNRCRBraW5kSRAAFBxtYW5hZ2VyADBwZXJpb2RfYmVnaW4EMHBlcmlvZF9jb3VudAQobGFzdF9sZWFzZS0ELGxlYXNlX2NvdW50BAMIBN0DAAggcmVwb3J0ZXIFAjhzbGFzaF9mcmFjdGlvbgQDCAB1EQR5EQADCAR9EQSBEQAGkQ4CDAhWMwECGBBOdWxsAQEFGEFzc2V0cwEEEQMAPEV4ZWN1dGlvblJlc3VsdAEGpQIcVmVyc2lvbgEBAixQYWxsZXRzSW5mbwEErQIAOERpc3BhdGNoUmVzdWx0AQIMHFN1Y2Nlc3MBAQUURXJyb3IBBQA4VHJ1bmNhdGVkRXJyb3IBBQAIVjQBAhgQTnVsbAEBBRhBc3NldHMBBJ0CADxFeGVjdXRpb25SZXN1bHQBBqUCHFZlcnNpb24BAQIsUGFsbGV0c0luZm8BBK0CADhEaXNwYXRjaFJlc3VsdAECDBxTdWNjZXNzAQEFFEVycm9yAQUAOFRydW5jYXRlZEVycm9yAQUACFY1AQIYEE51bGwBAQUYQXNzZXRzAQTVDgA8RXhlY3V0aW9uUmVzdWx0AQbdDhxWZXJzaW9uAQECLFBhbGxldHNJbmZvAQStAgA4RGlzcGF0Y2hSZXN1bHQBAgwcU3VjY2VzcwEBBRRFcnJvcgEFADhUcnVuY2F0ZWRFcnJvcgEFAAIMHFBlbmRpbmcBABAkcmVzcG9uZGVykQ5MbWF5YmVfbWF0Y2hfcXVlcmllcokRMG1heWJlX25vdGlmea0JHHRpbWVvdXQEPFZlcnNpb25Ob3RpZmllcgEACBhvcmlnaW6RDiRpc19hY3RpdmUUFFJlYWR5AQAIIHJlc3BvbnNljREIYXQEAwgEkQ4DCJEOBASZEQADDAQAkRAAEBhhbW91bnQIFG93bmVykQ4YbG9ja2VykQ4kY29uc3VtZXJz1QkDCAiRDgSpEQAACCBsb2NhdGlvbpEOGGV4cGlyefUDBLERAAAEIGFsaWFzZXJztREACBhwcmVmaXhFARhzdWZmaXhFAQIMOE5vdEltcGxlbWVudGVkAQEFIE5vdEZvdW5kAQAIGHByZWZpeEUBGHN1ZmZpeEUBFENvZGVjAQEFByTBEQI0EENhbGwBAQUcUGF5bWVudAEBBRhGdXR1cmUBAQUUU3RhbGUBAQUgQmFkUHJvb2YBAQVEQW5jaWVudEJpcnRoQmxvY2sBAQVERXhoYXVzdHNSZXNvdXJjZXMBAQUYQ3VzdG9tAQECMEJhZE1hbmRhdG9yeQEBBUxNYW5kYXRvcnlWYWxpZGF0aW9uAQEFJEJhZFNpZ25lcgEBBVRJbmRldGVybWluYXRlSW1wbGljaXQBAQU0VW5rbm93bk9yaWdpbgEBBQIIHEludmFsaWQBAjQQQ2FsbAEBBRxQYXltZW50AQEFGEZ1dHVyZQEBBRRTdGFsZQEBBSBCYWRQcm9vZgEBBURBbmNpZW50QmlydGhCbG9jawEBBURFeGhhdXN0c1Jlc291cmNlcwEBBRhDdXN0b20BAQIwQmFkTWFuZGF0b3J5AQEFTE1hbmRhdG9yeVZhbGlkYXRpb24BAQUkQmFkU2lnbmVyAQEFVEluZGV0ZXJtaW5hdGVJbXBsaWNpdAEBBTRVbmtub3duT3JpZ2luAQEFHFVua25vd24BAgwwQ2Fubm90TG9va3VwAQEFTE5vVW5zaWduZWRWYWxpZGF0b3IBAQUYQ3VzdG9tAQECBxUOzREHLQrNEQAgUG5leHRfdXBfb25fYXZhaWxhYmxlQQo4b2NjdXBpZWRfc2luY2UELHRpbWVfb3V0X2F0BExuZXh0X3VwX29uX3RpbWVfb3V0QQowYXZhaWxhYmlsaXR5sQVEZ3JvdXBfcmVzcG9uc2libGUEOGNhbmRpZGF0ZV9oYXNoIFBjYW5kaWRhdGVfZGVzY3JpcHRvcqEOAgwgT2NjdXBpZWQBACBQbmV4dF91cF9vbl9hdmFpbGFibGVBCjhvY2N1cGllZF9zaW5jZQQsdGltZV9vdXRfYXQETG5leHRfdXBfb25fdGltZV9vdXRBCjBhdmFpbGFiaWxpdHmxBURncm91cF9yZXNwb25zaWJsZQQ4Y2FuZGlkYXRlX2hhc2ggUGNhbmRpZGF0ZV9kZXNjcmlwdG9yoQ4kU2NoZWR1bGVkAQAIHHBhcmFfaWQEIGNvbGxhdG9yEQEQRnJlZQEBBQTdEQAGMRACDDxDYW5kaWRhdGVCYWNrZWQBAxClDiQEBERDYW5kaWRhdGVJbmNsdWRlZAEDEKUOJAQERENhbmRpZGF0ZVRpbWVkT3V0AQMMpQ4kBATpEQAGVREAFDhjYW5kaWRhdGVfaGFzaCAoZGVzY3JpcHRvcqEOLGNvbW1pdG1lbnRzyQVMcmVsYXlfcGFyZW50X251bWJlcgQwbWF4X3Bvdl9zaXplBAT1EQAACCxjb25zdHJhaW50c6kKUHBlbmRpbmdfYXZhaWxhYmlsaXR5+REG/REEMRAAADxcbWluX3JlbGF5X3BhcmVudF9udW1iZXIEMG1heF9wb3Zfc2l6ZQQ0bWF4X2NvZGVfc2l6ZQRIbWF4X2hlYWRfZGF0YV9zaXplBDR1bXBfcmVtYWluaW5nBEx1bXBfcmVtYWluaW5nX2J5dGVzBGRtYXhfdW1wX251bV9wZXJfY2FuZGlkYXRlBFhkbXBfcmVtYWluaW5nX21lc3NhZ2VzOQIwaHJtcF9pbmJvdW5kOQJEaHJtcF9jaGFubmVsc19vdXSdCmhtYXhfaHJtcF9udW1fcGVyX2NhbmRpZGF0ZQQ8cmVxdWlyZWRfcGFyZW50JFB2YWxpZGF0aW9uX2NvZGVfaGFzaCBMdXBncmFkZV9yZXN0cmljdGlvbqEKWGZ1dHVyZV92YWxpZGF0aW9uX2NvZGWlCgYJEgAMEHZvdGXRBjhhbmNlc3RyeV9wcm9vZiQYaGVhZGVytQMEkRAABxUSDQsHHQ8NCwQ1DwAGWRAEWRAAAwiRDikSBC0SAAAQQGV4ZWN1dGlvbl9yZXN1bHRVDjhlbWl0dGVkX2V2ZW50cyESJGxvY2FsX3hjbSUSOGZvcndhcmRlZF94Y21zMRIHNRI5CwAMQGV4ZWN1dGlvbl9yZXN1bHTRDjhlbWl0dGVkX2V2ZW50cyESOGZvcndhcmRlZF94Y21zMRIHPRI5CwIMCFYzAQAICGlkfQEMZnVumQIIVjQBAAgIaWR5AQxmdW6ZAghWNQEACAhpZIkODGZ1bpkCAgh4VmVyc2lvbmVkQXNzZXRDb252ZXJzaW9uRmFpbGVkAQEFhFZlcnNpb25lZExvY2F0aW9uQ29udmVyc2lvbkZhaWxlZAEBBQcUSRI="; +var metadataTypes_default = content; +export { + metadataTypes_default as default +}; diff --git a/examples/with-vite-papi/.papi/descriptors/dist/metadataTypes.d.ts b/examples/with-vite-papi/.papi/descriptors/dist/metadataTypes.d.ts new file mode 100644 index 0000000..9594960 --- /dev/null +++ b/examples/with-vite-papi/.papi/descriptors/dist/metadataTypes.d.ts @@ -0,0 +1,2 @@ +declare const content = "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CBRzdGFzaABIbnVtX3NsYXNoaW5nX3NwYW5zBAEBBQEACAxlcmEENHNsYXNoX2luZGljZXM5AgEBBQEACDx2YWxpZGF0b3Jfc3Rhc2gADGVyYQQBAQUBAAQMd2hv6QMBAQUBABxIbWluX25vbWluYXRvcl9ib25k7QNIbWluX3ZhbGlkYXRvcl9ib25k7QNMbWF4X25vbWluYXRvcl9jb3VudPEDTG1heF92YWxpZGF0b3JfY291bnTxAzxjaGlsbF90aHJlc2hvbGTxAzhtaW5fY29tbWlzc2lvbvEDSG1heF9zdGFrZWRfcmV3YXJkc/EDAQEFAQAEFHN0YXNoAAEBBQEABDx2YWxpZGF0b3Jfc3Rhc2gAAQEFAQAMPHZhbGlkYXRvcl9zdGFzaAAMZXJhBBBwYWdlBAEBBQEABChjb250cm9sbGVyAAEBBQEABCxjb250cm9sbGVyc90DAQEFAQAQFHN0YXNoAEBtYXliZV9jb250cm9sbGVyBQIsbWF5YmVfdG90YWz1AzxtYXliZV91bmxvY2tpbmcBBAEBBQEBBQEADCRlcmFfaW5kZXgEQHZhbGlkYXRvcl9wYXlvdXQIJHJlbWFpbmRlcggBAQUBAAwUc3Rhc2gAEGRlc3Q1ARhhbW91bnQIAQEFAQAIGHN0YWtlcgAYYW1vdW50CAEBBQEADCR2YWxpZGF0b3IAIGZyYWN0aW9uBCRzbGFzaF9lcmEEAQEFAQAENHNlc3Npb25faW5kZXgEAQEFAQAIFHN0YXNoABhhbW91bnQIAQEFAQAIJG5vbWluYXRvcgAUc3Rhc2gAAQEFAQAEFHN0YXNoAAEBBQEACCRlcmFfaW5kZXgEPHZhbGlkYXRvcl9zdGFzaAABAQUBAAgUc3Rhc2gAFHByZWZzOQEBAQUBAAQQc2l6ZQQBAQUBAAQQbW9kZT0BAQEFAQAEIGZhaWx1cmVzBAAgAJkHAJ0HADkDAQEFAQAIEGtpbmRFASB0aW1lc2xvdCQABADtBgEBBQClBwAAAA0EAKkHAAABAAgQa2V5cw0EFHByb29mJAEBBQEBBQCtBwEBBQCxBwAIAAQBAAhIZXF1aXZvY2F0aW9uX3Byb29mJQQ8a2V5X293bmVyX3Byb29mvQMBAQUBAAgUZGVsYXkEbGJlc3RfZmluYWxpemVkX2Jsb2NrX251bWJlcgQBAQUBAQUBAAQ0YXV0aG9yaXR5X3NldFUBAQEFADkDAAQAtQcABAC9BwEBBQCRAgEACBhhbW91bnQILGJlbmVmaWNpYXJ51QMBAQUBAAQscHJvcG9zYWxfaWQEAQEFAQAQKGFzc2V0X2tpbmSBARhhbW91bnQILGJlbmVmaWNpYXJ5mQEodmFsaWRfZnJvbS0EAQEFAQEFAQAEQGJ1ZGdldF9yZW1haW5pbmcIAQEFAQAMOHByb3Bvc2FsX2luZGV4BBRhd2FyZAgcYWNjb3VudAABAQUBAAQsYnVybnRfZnVuZHMIAQEFAQAEQHJvbGxvdmVyX2JhbGFuY2UIAQEFAQAEFHZhbHVlCAEBBQEADDhwcm9wb3NhbF9pbmRleAQYYW1vdW50CCxiZW5lZmljaWFyeQABAQUBAAgscmVhY3RpdmF0ZWQILGRlYWN0aXZhdGVkCAEBBQEAGBRpbmRleAQoYXNzZXRfa2luZIEBGGFtb3VudAgsYmVuZWZpY2lhcnmZASh2YWxpZF9mcm9tBCRleHBpcmVfYXQEAQEFAQAIFGluZGV4BChwYXltZW50X2lkCAB1BwDVBwAAANkHAQAIKHBvbGxfaW5kZXgEEHZvdGU1BAEBBQEAEBRjbGFzcwQIdG/VAyhjb252aWN0aW9uOQQcYmFsYW5jZQgBAQUBAAQUY2xhc3MEAQEFAQAIFGNsYXNzBBh0YXJnZXTVAwEBBQEACBRjbGFzcy0EFGluZGV4BAEBBQEADBh0YXJnZXTVAxRjbGFzcwQUaW5kZXgEAQEFAQEFAQQAAQgBAQUAAAAEAPkHAAQA2QcBAQUACQgBAAw8cHJvcG9zYWxfb3JpZ2lulQMgcHJvcG9zYWylAUBlbmFjdG1lbnRfbW9tZW50QQQBAQUBAAQUdHJhY2sEAQEFAQAIFGluZGV4BChtYXliZV9oYXNoEQEBAQUBAQUBAAwUaW5kZXgEFHRyYWNrBCBwcm9wb3NhbKUBAQEFAQAMFGluZGV4BAx3aG8AGGFtb3VudAgBAQUBABAUaW5kZXgEFHRyYWNrBCBwcm9wb3NhbKUBFHRhbGx5qQEBAQUBAAgUaW5kZXgEFHRhbGx5qQEBAQUBAAgUaW5kZXgEEGhhc2ggACAAFQEBAAQkY2FsbF9oYXNoIAEBBQEADCRjYWxsX2hhc2ggQGNhbGxfZW5jb2RlZF9sZW4ETGNhbGxfd2VpZ2h0X3dpdG5lc3MYAQEFAQAEEGNhbGzdBgEBBQEBBQEABCRjYWxsX2hhc2ggAQEFAQAIJGNhbGxfaGFzaCAYcmVzdWx0vQEAyQEA0QEBAAQka2V5X3ZhbHVlVQQBAQUBAQUBAAwMa2V5yQEkb2xkX3ZhbHVl1QEkbmV3X3ZhbHVl1QEAZQEACABlAQBhBABlAQBpBAAAAGUBAQEFACQBAAgQZGVzdABIZXRoZXJldW1fc2lnbmF0dXJlXQQBAQUBABAMd2hvZQEUdmFsdWUIQHZlc3Rpbmdfc2NoZWR1bGVlBCRzdGF0ZW1lbnRtBAEBBQEADBBkZXN0AEhldGhlcmV1bV9zaWduYXR1cmVdBCRzdGF0ZW1lbnQkAQEFAQAEJHN0YXRlbWVudCQBAQUBAAwMb2xkZQEMbmV3ZQE4bWF5YmVfcHJlY2xhaW0FAgEBBQEBBQEADAx3aG8AQGV0aGVyZXVtX2FkZHJlc3NlARhhbW91bnQIAAAADQgBAQUAEQgBAAQYdGFyZ2V01QMBAQUBAAgYdGFyZ2V01QMgc2NoZWR1bGV1BAEBBQEADBhzb3VyY2XVAxh0YXJnZXTVAyBzY2hlZHVsZXUEAQEFAQAIPHNjaGVkdWxlMV9pbmRleAQ8c2NoZWR1bGUyX2luZGV4BAEBBQEACBh0YXJnZXTVAzhzY2hlZHVsZV9pbmRleAQBAQUBAQUBAAgcYWNjb3VudAAgdW52ZXN0ZWQIAQAEFGNhbGxzfQQBAQUBAAgUaW5kZXgEEGNhbGzdBgEBBQEACCRhc19vcmlnaW6VAxBjYWxs3QYBAQUBAAgQY2FsbN0GGHdlaWdodBgBAQUBAQUBAAgUaW5kZXgEFGVycm9yBQEBAQUBAAQUZXJyb3IFAQEBBQEABBhyZXN1bHQZAQAAAB0IAAAAKQgBAAwQcmVhbNUDQGZvcmNlX3Byb3h5X3R5cGWFBBBjYWxs3QYBAQUBAAwgZGVsZWdhdGXVAyhwcm94eV90eXBl6QEUZGVsYXkEAQEFAQAMKHByb3h5X3R5cGXpARRkZWxheQQUaW5kZXgEAQEFAQAUHHNwYXduZXLVAyhwcm94eV90eXBl6QEUaW5kZXgEGGhlaWdodAQkZXh0X2luZGV4BAEBBQEACBByZWFs1QMkY2FsbF9oYXNoIAEBBQEACCBkZWxlZ2F0ZdUDJGNhbGxfaGFzaCABAQUBABAgZGVsZWdhdGXVAxByZWFs1QNAZm9yY2VfcHJveHlfdHlwZYUEEGNhbGzdBgEBBQEBBQEAEBBwdXJlAAx3aG8AKHByb3h5X3R5cGXpAVBkaXNhbWJpZ3VhdGlvbl9pbmRleAQBAQUBAAwQcmVhbAAUcHJveHkAJGNhbGxfaGFzaCABAQUBABAkZGVsZWdhdG9yACRkZWxlZ2F0ZWUAKHByb3h5X3R5cGXpARRkZWxheQQALQgAMQgBAAhEb3RoZXJfc2lnbmF0b3JpZXPdAxBjYWxs3QYBAQUBABQkdGhyZXNob2xkBERvdGhlcl9zaWduYXRvcmllc90DPG1heWJlX3RpbWVwb2ludI0EEGNhbGzdBihtYXhfd2VpZ2h0GAEBBQEAFCR0aHJlc2hvbGQERG90aGVyX3NpZ25hdG9yaWVz3QM8bWF5YmVfdGltZXBvaW50jQQkY2FsbF9oYXNoIChtYXhfd2VpZ2h0GAEBBQEAECR0aHJlc2hvbGQERG90aGVyX3NpZ25hdG9yaWVz3QMkdGltZXBvaW508QEkY2FsbF9oYXNoIAEBBQEBBQEADCRhcHByb3ZpbmcAIG11bHRpc2lnACRjYWxsX2hhc2ggAQEFAQAQJGFwcHJvdmluZwAkdGltZXBvaW508QEgbXVsdGlzaWcAJGNhbGxfaGFzaCABAQUBABQkYXBwcm92aW5nACR0aW1lcG9pbnTxASBtdWx0aXNpZwAkY2FsbF9oYXNoIBhyZXN1bHQZAQEBBQEAEChjYW5jZWxsaW5nACR0aW1lcG9pbnTxASBtdWx0aXNpZwAkY2FsbF9oYXNoIAAEADkIAQEFAPUDAQAIFHZhbHVlCCxkZXNjcmlwdGlvbiQBAQUBAAQkYm91bnR5X2lkBAEBBQEADCRib3VudHlfaWQEHGN1cmF0b3LVAwxmZWUIAQEFAQAIJGJvdW50eV9pZAQsYmVuZWZpY2lhcnnVAwEBBQEACCRib3VudHlfaWQEGHJlbWFyayQBAQUBAQUBAAgUaW5kZXgEEGJvbmQIAQEFAQAIFGluZGV4BCxiZW5lZmljaWFyeQABAQUBAAwUaW5kZXgEGHBheW91dAgsYmVuZWZpY2lhcnkAAQEFAQAIJGJvdW50eV9pZAQcY3VyYXRvcgABAQUBAAQkYm91bnR5X2lkBAANAQBBCAEADEBwYXJlbnRfYm91bnR5X2lkBBR2YWx1ZQgsZGVzY3JpcHRpb24kAQEFAQAQQHBhcmVudF9ib3VudHlfaWQEPGNoaWxkX2JvdW50eV9pZAQcY3VyYXRvctUDDGZlZQgBAQUBAAhAcGFyZW50X2JvdW50eV9pZAQ8Y2hpbGRfYm91bnR5X2lkBAEBBQEADEBwYXJlbnRfYm91bnR5X2lkBDxjaGlsZF9ib3VudHlfaWQELGJlbmVmaWNpYXJ51QMBAQUBAQUBAAgUaW5kZXgELGNoaWxkX2luZGV4BAEBBQEADBRpbmRleAQsY2hpbGRfaW5kZXgELGJlbmVmaWNpYXJ5AAEBBQEAEBRpbmRleAQsY2hpbGRfaW5kZXgEGHBheW91dAgsYmVuZWZpY2lhcnkAAQEFABECAQEFAEUIAQEFAFEIAQEFAF0FAQEFAFkIAAQAXQgBAQUACQIBAAgwcmF3X3NvbHV0aW9uWQUcd2l0bmVzc10FAQEFAQAEQG1heWJlX25leHRfc2NvcmVhBQEBBQEABCBzdXBwb3J0c3UFAQEFAQAEMHJhd19zb2x1dGlvblkFAQEFAQAIQG1heWJlX21heF92b3RlcnMtBERtYXliZV9tYXhfdGFyZ2V0cy0EAQEFAQEFAQAMHGNvbXB1dGUBAhhvcmlnaW4FAjBwcmV2X2VqZWN0ZWQUAQEFAQAIHGNvbXB1dGUBAhRzY29yZQkCAQEFAQAIHGFjY291bnQAFHZhbHVlCAEBBQEADBBmcm9tEQIIdG8RAhRyb3VuZAQAAABhCAAIAGUIAQEFAGkIAQAEKGRpc2xvY2F0ZWTVAwEBBQEABBxsaWdodGVy1QMBAQUBAAgcaGVhdmllctUDHGxpZ2h0ZXLVAwEBBQEBBQEADAx3aG8AEGZyb20ICHRvCAEBBQEACAx3aG8AJG5ld19zY29yZQgBAQUAmAAAAG0IAAQAfQgABACBCAAEAJEIAAAABAAAAIkFAQAIGGFtb3VudAgccG9vbF9pZAQBAQUBAAQUZXh0cmGBBQEBBQEACDhtZW1iZXJfYWNjb3VudNUDQHVuYm9uZGluZ19wb2ludHMIAQEFAQAIHHBvb2xfaWQESG51bV9zbGFzaGluZ19zcGFucwQBAQUBAAg4bWVtYmVyX2FjY291bnTVA0hudW1fc2xhc2hpbmdfc3BhbnMEAQEFAQAQGGFtb3VudAgQcm9vdNUDJG5vbWluYXRvctUDHGJvdW5jZXLVAwEBBQEAFBhhbW91bnQIEHJvb3TVAyRub21pbmF0b3LVAxxib3VuY2Vy1QMccG9vbF9pZAQBAQUBAAgccG9vbF9pZAQodmFsaWRhdG9yc90DAQEFAQAIHHBvb2xfaWQEFHN0YXRlHQIBAQUBAAgccG9vbF9pZAQgbWV0YWRhdGEkAQEFAQAYNG1pbl9qb2luX2JvbmTtAzxtaW5fY3JlYXRlX2JvbmTtAyRtYXhfcG9vbHPxAyxtYXhfbWVtYmVyc/EDUG1heF9tZW1iZXJzX3Blcl9wb29s8QNUZ2xvYmFsX21heF9jb21taXNzaW9u8QMBAQUBABAccG9vbF9pZAQgbmV3X3Jvb3SFBTRuZXdfbm9taW5hdG9yhQUsbmV3X2JvdW5jZXKFBQEBBQEABBxwb29sX2lkBAEBBQEACBhtZW1iZXLVAxRleHRyYYEFAQEFAQAEKHBlcm1pc3Npb26JBQEBBQEABBRvdGhlcgABAQUBAAgccG9vbF9pZAQ4bmV3X2NvbW1pc3Npb24lAgEBBQEACBxwb29sX2lkBDhtYXhfY29tbWlzc2lvbgQBAQUBAAgccG9vbF9pZAQsY2hhbmdlX3JhdGUpAgEBBQEACBxwb29sX2lkBChwZXJtaXNzaW9uMQIBAQUBAAQ4bWVtYmVyX2FjY291bnTVAwEBBQEBBQEACCRkZXBvc2l0b3IAHHBvb2xfaWQEAQEFAQAQGG1lbWJlcgAccG9vbF9pZAQYYm9uZGVkCBhqb2luZWQUAQEFAQAMGG1lbWJlcgAccG9vbF9pZAQYcGF5b3V0CAEBBQEAFBhtZW1iZXIAHHBvb2xfaWQEHGJhbGFuY2UIGHBvaW50cwgMZXJhBAEBBQEAEBhtZW1iZXIAHHBvb2xfaWQEHGJhbGFuY2UIGHBvaW50cwgBAQUBAAQccG9vbF9pZAQBAQUBAAgccG9vbF9pZAQkbmV3X3N0YXRlHQIBAQUBAAgccG9vbF9pZAQYbWVtYmVyAAEBBQEADBByb290BQIcYm91bmNlcgUCJG5vbWluYXRvcgUCAQEFAQAIHHBvb2xfaWQEHGJhbGFuY2UIAQEFAQAMHHBvb2xfaWQEDGVyYQQcYmFsYW5jZQgBAQUBAAgccG9vbF9pZAQcY3VycmVudCUCAQEFAQAIHHBvb2xfaWQEOG1heF9jb21taXNzaW9uBAEBBQEACBxwb29sX2lkBCxjaGFuZ2VfcmF0ZSkCAQEFAQAIHHBvb2xfaWQEKHBlcm1pc3Npb24xAgEBBQEACBxwb29sX2lkBChjb21taXNzaW9uCAEBBQEACBxwb29sX2lkBBhhbW91bnQIAQEFAKABAQUAlQgAAAAIAQAENGVyYXNfdG9fY2hlY2sEAQEFAQEFAQAIFHN0YXNoABhyZXN1bHQZAQEBBQEABBBlcmFzOQIBAQUAmQgBAQUAoQgBAAQMbmV3LQQBAQUBAAQMbmV3CAEBBQEABAxuZXcUAQEFAQAEDG5ld5UFAQEFAQAEDG5ld6UFAQEFAQAIFGluZGV4BBR2YWx1ZRQBAQUBAAQMbmV3qQUBAQUBAQUArQgABAC1CAEBBQEDEEkCJAQEAQEFAQMMSQIkBAEBBQEACBBmcm9tBBRjb3VudAQBAQUAFQEBAQUAyQgBAAQQZGF0Yf0FAQEFAQEFAM0IAQEFAN0IAQEFAOkIACAA+QgABAD9CAANAQAgAAQACQkABAANCQAEABEJAAQAOQIABAAVCQAgAAQAIAAkAQAIEHBhcmEEIG5ld19jb2RlJAEBBQEACBBwYXJhBCBuZXdfaGVhZCQBAQUBAAwQcGFyYQQgbmV3X2NvZGUkTHJlbGF5X3BhcmVudF9udW1iZXIEAQEFAQAEEHBhcmEEAQEFAQAEPHZhbGlkYXRpb25fY29kZSQBAQUBAARQdmFsaWRhdGlvbl9jb2RlX2hhc2ggAQEFAQAIEHN0bXQFBiRzaWduYXR1cmVBAgEBBQEACBBwYXJhBBxjb250ZXh0BAEBBQEBBQAEAQEFAQQEAQgBAQUBAwggBAEBBQAdCQEABBR1cF90bwQBAQUABAAlCQBVAgApCQEBBQAtCQBVAgAVAQBVAgAxCQBVAgA5CQAEAEEJAQAMJHJlY2lwaWVudARUcHJvcG9zZWRfbWF4X2NhcGFjaXR5BGRwcm9wb3NlZF9tYXhfbWVzc2FnZV9zaXplBAEBBQEABBhzZW5kZXIEAQEFAQAEKGNoYW5uZWxfaWRVAgEBBQEADBBwYXJhBCxudW1faW5ib3VuZAQwbnVtX291dGJvdW5kBAEBBQEABCBjaGFubmVscwQBAQUBAAgoY2hhbm5lbF9pZFUCNG9wZW5fcmVxdWVzdHMEAQEFAQAQGHNlbmRlcgQkcmVjaXBpZW50BDBtYXhfY2FwYWNpdHkEQG1heF9tZXNzYWdlX3NpemUEAQEFAQAIGHNlbmRlcgQkcmVjaXBpZW50BAEBBQEABEx0YXJnZXRfc3lzdGVtX2NoYWluBAEBBQEBBQEAEBhzZW5kZXIEJHJlY2lwaWVudARUcHJvcG9zZWRfbWF4X2NhcGFjaXR5BGRwcm9wb3NlZF9tYXhfbWVzc2FnZV9zaXplBAEBBQEACDBieV9wYXJhY2hhaW4EKGNoYW5uZWxfaWRVAgEBBQEACBhzZW5kZXIEJHJlY2lwaWVudAQABABFCQAEAN0DAAQApQUASQkATQkASQkAOQIASQkABAEBBQAtBAEBBQEDCCBdAgEBBQEDCCBhAgBJCQBVCQEACDRkaXNwdXRlX3Byb29mIQY8a2V5X293bmVyX3Byb29mvQMBAQUABABZCQEBBQBdCQEBBQBlCQAEAGUJAQAIKG1heF9hbW91bnQIHHBhcmFfaWQEAQEFAQEFAQAMHHBhcmFfaWQEKHNwb3RfcHJpY2UIKG9yZGVyZWRfYnkAAQEFAQAEKHNwb3RfcHJpY2UIAA0BAGkJAAQAiQkABACNCQEADAhpZAQwZ2VuZXNpc19oZWFkJDx2YWxpZGF0aW9uX2NvZGUkAQEFAQAUDHdobwAcZGVwb3NpdAgIaWQEMGdlbmVzaXNfaGVhZCQ8dmFsaWRhdGlvbl9jb2RlJAEBBQEABAhpZAQBAQUBAAgIaWQEFG90aGVyBAEBBQEBBQEACBxwYXJhX2lkBBxtYW5hZ2VyAAEBBQEABBxwYXJhX2lkBAEBBQEACBxwYXJhX2lkBAx3aG8AAQEFAQAIHHBhcmFfaWQEIG90aGVyX2lkBAAEAJEJAQAUEHBhcmEEGGxlYXNlcgAYYW1vdW50CDBwZXJpb2RfYmVnaW4EMHBlcmlvZF9jb3VudAQBAQUBAQUBAAQwbGVhc2VfcGVyaW9kBAEBBQEAGBxwYXJhX2lkBBhsZWFzZXIAMHBlcmlvZF9iZWdpbgQwcGVyaW9kX2NvdW50BDhleHRyYV9yZXNlcnZlZAgwdG90YWxfYW1vdW50CAB1BwAIAAQAnQkBAAggZHVyYXRpb24ESGxlYXNlX3BlcmlvZF9pbmRleAQBAQUBABQQcGFyYQQ0YXVjdGlvbl9pbmRleAQoZmlyc3Rfc2xvdAQkbGFzdF9zbG90BBhhbW91bnQIAQEFAQEFAQAMNGF1Y3Rpb25faW5kZXgEMGxlYXNlX3BlcmlvZAQYZW5kaW5nBAEBBQEABDRhdWN0aW9uX2luZGV4BAEBBQEADBhiaWRkZXIAOGV4dHJhX3Jlc2VydmVkCDB0b3RhbF9hbW91bnQIAQEFAQAIGGJpZGRlcgAYYW1vdW50CAEBBQEADBxwYXJhX2lkBBhsZWFzZXIAGGFtb3VudAgBAQUBABQYYmlkZGVyABxwYXJhX2lkBBhhbW91bnQIKGZpcnN0X3Nsb3QEJGxhc3Rfc2xvdAQBAQUBAAg0YXVjdGlvbl9pbmRleAQwYmxvY2tfbnVtYmVyBAAEAKUJAQAYFGluZGV4BAxjYXAIMGZpcnN0X3BlcmlvZAQsbGFzdF9wZXJpb2QEDGVuZAQgdmVyaWZpZXI9BgEBBQEADBRpbmRleAQUdmFsdWUIJHNpZ25hdHVyZUUGAQEFAQAIDHdobwAUaW5kZXgEAQEFAQAIFGluZGV4BBBtZW1vJAEBBQEACBRpbmRleAQkc2lnbmF0dXJlRQYBAQUBAQUBAAwMd2hvAChmdW5kX2luZGV4BBhhbW91bnQIAQEFAQAIHHBhcmFfaWQEGHJlc3VsdBkBAQEFAQAMDHdobwAccGFyYV9pZAQQbWVtbyQBAQUAdQEBAAQUY291bnQEAQEFAQAEEHdoZW4EAQEFAQAQEGNvcmUEFGJlZ2luBChhc3NpZ25tZW50VQYgZW5kX2hpbnQtBAEBBQEBBQEABBB3aGVuBAEBBQEABBBjb3JlBAEBBQBpBgEBBQBhBgEBBQBdBgEABDBtYXliZV9jb25maWdhBgEBBQEADBhsaW1pdHNdBjxyZWFsX3NpemVfdXBwZXIEMHdpdG5lc3NfdGFza2kGAQEFAQAIEGtleXN9AzB3aXRuZXNzX3NpemUEAQEFAQAMEHJvb3QkKGNoaWxkX2tleXN9Ayh0b3RhbF9zaXplBAEBBQEABBhsaW1pdHNdBgEBBQEACDBwcm9ncmVzc190b3BlBjhwcm9ncmVzc19jaGlsZGUGAQEFAQEFAQAMDHRvcAQUY2hpbGQEHGNvbXB1dGWBAgEBBQEABBRlcnJvcuQACAC1CQC5CQAEALkJAAgAuQkAvQkBAQUAxQkBAQUAyQkAzQkA2QkAAADhCQEBBQD5AgEACBBkZXN0mQEcbWVzc2FnZakGAQEFAQAQEGRlc3SZASxiZW5lZmljaWFyeZkBGGFzc2V0cxkDOGZlZV9hc3NldF9pdGVtBAEBBQEACBxtZXNzYWdlqQYobWF4X3dlaWdodBgBAQUBAAggbG9jYXRpb255ARx2ZXJzaW9uBAEBBQEABERtYXliZV94Y21fdmVyc2lvbi0EAQEFAQAEIGxvY2F0aW9umQEBAQUBABQQZGVzdJkBLGJlbmVmaWNpYXJ5mQEYYXNzZXRzGQM4ZmVlX2Fzc2V0X2l0ZW0EMHdlaWdodF9saW1pdPECAQEFAQAEJHN1c3BlbmRlZBQBAQUBAAgYYXNzZXRzGQMsYmVuZWZpY2lhcnmZAQEBBQEAHBBkZXN0mQEYYXNzZXRzGQNQYXNzZXRzX3RyYW5zZmVyX3R5cGWtBjhyZW1vdGVfZmVlc19pZLEGSGZlZXNfdHJhbnNmZXJfdHlwZa0GSGN1c3RvbV94Y21fb25fZGVzdKkGMHdlaWdodF9saW1pdPECAQEFAQEFAQAEHG91dGNvbWWNAgEBBQEAEBhvcmlnaW55ASxkZXN0aW5hdGlvbnkBHG1lc3NhZ2X5AihtZXNzYWdlX2lkIAEBBQEACBhvcmlnaW55ASBxdWVyeV9pZAgBAQUBAAggcXVlcnlfaWQIIHJlc3BvbnNluQIBAQUBAAwgcXVlcnlfaWQIMHBhbGxldF9pbmRleAQoY2FsbF9pbmRleAQBAQUBABQgcXVlcnlfaWQIMHBhbGxldF9pbmRleAQoY2FsbF9pbmRleAQ0YWN0dWFsX3dlaWdodBhMbWF4X2J1ZGdldGVkX3dlaWdodBgBAQUBAAwYb3JpZ2lueQEgcXVlcnlfaWQIRGV4cGVjdGVkX2xvY2F0aW9uvQIBAQUBAAQgcXVlcnlfaWQIAQEFAQAMEGhhc2ggGG9yaWdpbnkBGGFzc2V0cxkDAQEFAQAQLGRlc3RpbmF0aW9ueQEYcmVzdWx0BBBjb3N0oQIobWVzc2FnZV9pZCABAQUBAAggbG9jYXRpb255ARx2ZXJzaW9u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AQEFAQAEGHJlc3VsdJULAQEFAJ0LAAAAoQwAAAClDAAEAAABAQUAsQwAAAC5DAC9DADBDAAAACQBAQUAxQwBAQUAyQwAIQIAwQwBAAwMd2hv1QMUdmFsdWUIDHRpcAgBAQUBAAgkY2FuZGlkYXRl1QMcYXBwcm92ZRQBAQUBAAQcYXBwcm92ZRQBAQUBAAQYYW1vdW50CAEBBQEAGBxmb3VuZGVy1QMsbWF4X21lbWJlcnMEKG1heF9pbnRha2UELG1heF9zdHJpa2VzBERjYW5kaWRhdGVfZGVwb3NpdAgUcnVsZXMkAQEFAQAIDHdob9UDHGZvcmdpdmUUAQEFAQAQLG1heF9tZW1iZXJzBChtYXhfaW50YWtlBCxtYXhfc3RyaWtlcwREY2FuZGlkYXRlX2RlcG9zaXQIAQEFAQAEJGNhbmRpZGF0ZQABAQUBAAgkY2FuZGlkYXRlAAxtYXgEAQEFAQAIPGNoYWxsZW5nZV9yb3VuZAQMbWF4BAEBBQEBBQEABBxmb3VuZGVyAAEBBQEACDBjYW5kaWRhdGVfaWQAFG9mZmVyCAEBBQEADDBjYW5kaWRhdGVfaWQAFG9mZmVyCCB2b3VjaGluZwABAQUBAAQkY2FuZGlkYXRlAAEBBQEACBxwcmltYXJ5AChjYW5kaWRhdGVz3QMBAQUBAAgMd2hvABhqdWRnZWQUAQEFAQAEGG1lbWJlcgABAQUBAAwkY2FuZGlkYXRlABR2b3RlcgAQdm90ZRQBAQUBAAgUdm90ZXIAEHZvdGUUAQEFAQAEGHBhcmFtc50LAQEFAQAIGG1lbWJlcgAQcmFuawQAAADNDAC9DADRDAEACBxhY2NvdW501QMQY2FsbJUMAQEFAQAIEGxvc3TVAxxyZXNjdWVy1QMBAQUBAAwcZnJpZW5kc90DJHRocmVzaG9sZAQwZGVsYXlfcGVyaW9kBAEBBQEABBxhY2NvdW501QMBAQUBAAQccmVzY3VlctUDAQEFAQEFAQAIMGxvc3RfYWNjb3VudAA8cmVzY3Vlcl9hY2NvdW50AAEBBQEADDBsb3N0X2FjY291bnQAPHJlc2N1ZXJfYWNjb3VudAAYc2VuZGVyAAEBBQEABDBsb3N0X2FjY291bnQAAAQA3QwBABAQd2hlbgQ4bWF5YmVfcGVyaW9kaWOBAyBwcmlvcml0eQQQY2FsbJUMAQEFAQAUCGlkIBB3aGVuBDhtYXliZV9wZXJpb2RpY4EDIHByaW9yaXR5BBBjYWxslQwBAQUBABAUYWZ0ZXIEOG1heWJlX3BlcmlvZGljgQMgcHJpb3JpdHkEEGNhbGyVDAEBBQEAFAhpZCAUYWZ0ZXIEOG1heWJlX3BlcmlvZGljgQMgcHJpb3JpdHkEEGNhbGyVDAEBBQEBBQEADBB0YXNrDQEIaWQRARhyZXN1bHSVCwAAAOkMAQAMEHJlYWzVA0Bmb3JjZV9wcm94eV90eXBlGQwQY2FsbJUMAQEFAQAMIGRlbGVnYXRl1QMocHJveHlfdHlwZa0LFGRlbGF5BAEBBQEADChwcm94eV90eXBlrQsUZGVsYXkEFGluZGV4BAEBBQEAFBxzcGF3bmVy1QMocHJveHlfdHlwZa0LFGluZGV4BBhoZWlnaHQEJGV4dF9pbmRleAQBAQUBABAgZGVsZWdhdGXVAxByZWFs1QNAZm9yY2VfcHJveHlfdHlwZRkMEGNhbGyVDAEBBQEBBQEAEBBwdXJlAAx3aG8AKHByb3h5X3R5cGWtC1BkaXNhbWJpZ3VhdGlvbl9pbmRleAQBAQUBABAkZGVsZWdhdG9yACRkZWxlZ2F0ZWUAKHByb3h5X3R5cGWtCxRkZWxheQQBAAhEb3RoZXJfc2lnbmF0b3JpZXPdAxBjYWxslQwBAQUBABQkdGhyZXNob2xkBERvdGhlcl9zaWduYXRvcmllc90DPG1heWJlX3RpbWVwb2ludI0EEGNhbGyVDChtYXhfd2VpZ2h0GAEBBQEBBQEAFCRhcHByb3ZpbmcAJHRpbWVwb2ludPEBIG11bHRpc2lnACRjYWxsX2hhc2ggGHJlc3VsdJULAAQA7QwBAAgwcmF3X3NvbHV0aW9uiQwcd2l0bmVzc10FAQEFAQAEMHJhd19zb2x1dGlvbokMAQEFAQEFANkHAAQA8QwBAQUA9QwABAD5DAEBBQAJBwEACBhhbW91bnQIIGR1cmF0aW9uBAEBBQEACBRpbmRleARAbWF5YmVfcHJvcG9ydGlvbvUDAQEFAQEFAQAMDHdobwAYYW1vdW50CCBkdXJhdGlvbgQBAQUBABQUaW5kZXgEGGV4cGlyeQQMd2hvAChwcm9wb3J0aW9uCBhhbW91bnQIAQEFAQAUFGluZGV4BAx3aG8AKHByb3BvcnRpb24IGGFtb3VudAgcZHJvcHBlZBQBAQUBAAQcZGVmaWNpdAgBAQUBAAwQZnJvbQAIdG8AFGluZGV4BAAAAAENAQEFAQAIFHN0YXNoABhyZXN1bHSVCwEBBQEACBxwYXJhX2lkBBhyZXN1bHSVCwEDBCQABQ0BAwiVDAQA+QoBAwiVDAQABQsBAwjlC5UMABENAQMImQGpBgAZDQEBBQBlDQEBBQEACDhkaXNwYXRjaF9lcnJvcikNNGRpc3BhdGNoX2luZm9AAQAQEHdoZW4EOG1heWJlX3BlcmlvZGljgQMgcHJpb3JpdHkEEGNhbGyJDQEBBQEAFAhpZCAQd2hlbgQ4bWF5YmVfcGVyaW9kaWOBAyBwcmlvcml0eQQQY2FsbIkNAQEFAQAQFGFmdGVyBDhtYXliZV9wZXJpb2RpY4EDIHByaW9yaXR5BBBjYWxsiQ0BAQUBABQIaWQgFGFmdGVyBDhtYXliZV9wZXJpb2RpY4EDIHByaW9yaXR5BBBjYWxsiQ0BAQUBAQUBAAwQdGFzaw0BCGlkEQEYcmVzdWx0MQ0BAAQQY2FsbIkNAQEFAQEFAQAIJGNhbGxfaGFzaCAYcmVzdWx0PQ0BAAQUY2FsbHNxDQEBBQEACBRpbmRleAQQY2FsbIkNAQEFAQAIJGFzX29yaWdpbpUDEGNhbGyJDQEBBQEACBBjYWxsiQ0Yd2VpZ2h0GAEBBQEBBQEACBRpbmRleAQUZXJyb3IpDQEBBQEABBRlcnJvcikNAQEFAQAEGHJlc3VsdDENAQAMEHJlYWzVA0Bmb3JjZV9wcm94eV90eXBlhQQQY2FsbIkNAQEFAQAQIGRlbGVnYXRl1QMQcmVhbNUDQGZvcmNlX3Byb3h5X3R5cGWFBBBjYWxsiQ0BAQUBAAhEb3RoZXJfc2lnbmF0b3JpZXPdAxBjYWxsiQ0BAQUBABQkdGhyZXNob2xkBERvdGhlcl9zaWduYXRvcmllc90DPG1heWJlX3RpbWVwb2ludI0EEGNhbGyJDShtYXhfd2VpZ2h0GAEBBQEBBQEAFCRhcHByb3ZpbmcAJHRpbWVwb2ludPEBIG11bHRpc2lnACRjYWxsX2hhc2ggGHJlc3VsdDENAQEFAQAIFHN0YXNoABhyZXN1bHQxDQEBBQEACBxwYXJhX2lkBBhyZXN1bHQxDQEACAhpZAQcZ2VuZXNpcxUJAQEFAQAICGlkBAx4Y22pBgEBBQEABAxuZXfVAwEBBQEACAx3aG/VAxBjYWxsiQ0BAQUBAQUBAAQsc3Vkb19yZXN1bHQxDQEBBQEACAxvbGQFAgxuZXcAAQMEJACNDQEDCIkNBAD5CgEDCIkNBAAFCwEDCJUDiQ0AmQ0BAwiZAakGAKENAQEFAD0PAQEFAEEPAQEFAQAIOGRpc3BhdGNoX2Vycm9y/Q00ZGlzcGF0Y2hfaW5mb0ABAQUBAAgkY29kZV9oYXNoIBRlcnJvcv0NAQEFAQAQDHdobwAUaW5kZXgELG9sZF9kZXBvc2l0CCxuZXdfZGVwb3NpdAgAAABdDwEADDx2YWxpZGF0b3Jfc3Rhc2gADGVyYQQ4c2xhc2hfZnJhY3Rpb24EAQEFAQEFAQAQJGVyYV9pbmRleAQ8dmFsaWRhdG9yX3N0YXNoABBwYWdlBBBuZXh0LQQBAQUBAAgUc3Rhc2gAOGZvcmNlX3dpdGhkcmF3CAEBBQEABBR1cF90bwQBAQUBAAQkdmFsaWRhdG9yAAEABBRjYWxsc9UQAQEFAQAIFGluZGV4BBBjYWxs0RABAQUBAAgkYXNfb3JpZ2ludQ8QY2FsbNEQAQEFAQAIEGNhbGzREBh3ZWlnaHQYAQEFAQAIEG1haW7RECBmYWxsYmFja9EQAQEFAQEFAQAIFGluZGV4BBRlcnJvcv0NAQEFAQAEFGVycm9y/Q0BAQUBAAQYcmVzdWx0FQ4BAQUBAAQobWFpbl9lcnJvcv0NAAAA4RAAAADxDwAAAOUQAQEFAPEQACQA9RAAJAD9EAAkAAERACQABAEABBBpbmZv7Q8BAQUBAAQQc3Vic/UPAQEFAQAIJHJlZ19pbmRleAQcbWF4X2ZlZQgBAQUBAAQkcmVnX2luZGV4BAEBBQEACBRpbmRleAQMZmVlCAEBBQEACBRpbmRleAQYZmllbGRzCAEBBQEAECRyZWdfaW5kZXgEGHRhcmdldNUDJGp1ZGdlbWVudPkPIGlkZW50aXR5IAEBBQEACAxzdWLVAxBkYXRh3Q8BAQUBAAQMc3Vi1QMBAQUBAAwkYXV0aG9yaXR51QMYc3VmZml4JChhbGxvY2F0aW9uBAEBBQEACBhzdWZmaXgkJGF1dGhvcml0edUDAQEFAQAQDHdob9UDIHVzZXJuYW1lJCRzaWduYXR1cmVFBjh1c2VfYWxsb2NhdGlvbhQBAQUBAAQgdXNlcm5hbWUkAQEFAQEFAQAIDHdobwAcZGVwb3NpdAgBAQUBAAgMd2hvADxyZWdpc3RyYXJfaW5kZXgEAQEFAQAIGHRhcmdldAA8cmVnaXN0cmFyX2luZGV4BAEBBQEABDxyZWdpc3RyYXJfaW5kZXgEAQEFAQAMDHN1YgAQbWFpbgAcZGVwb3NpdAgBAQUBAAwQbWFpbgA4bnVtYmVyX29mX3N1YnMELG5ld19kZXBvc2l0CAEBBQEACAxzdWIAEG1haW4AAQEFAQAEJGF1dGhvcml0eQABAQUBAAgMd2hvACB1c2VybmFtZSQBAQUBAAwMd2hvACB1c2VybmFtZSQoZXhwaXJhdGlvbgQBAQUBAAQUd2hvc2UAAQEFAQAEIHVzZXJuYW1lJAEACBxhY2NvdW501QMQY2FsbNEQAQEFAQAENG1heWJlX2FjY291bnQBEAEBBQEBBQEAEAx3aG8AEGtpbmQhDixvbGRfZGVwb3NpdAgsbmV3X2RlcG9zaXQIAQEFAQAIHGFjY291bnQAOHNjaGVkdWxlX2luZGV4BAAEAA0RAQAQEHdoZW4EOG1heWJlX3BlcmlvZGljgQMgcHJpb3JpdHkEEGNhbGzREAEBBQEAFAhpZCAQd2hlbgQ4bWF5YmVfcGVyaW9kaWOBAyBwcmlvcml0eQQQY2FsbNEQAQEFAQAQFGFmdGVyBDhtYXliZV9wZXJpb2RpY4EDIHByaW9yaXR5BBBjYWxs0RABAQUBABQIaWQgFGFmdGVyBDhtYXliZV9wZXJpb2RpY4EDIHByaW9yaXR5BBBjYWxs0RABAQUBAQUBAAwQdGFzaw0BCGlkEQEYcmVzdWx0FQ4BAAQQY2FsbNEQAQEFAQAIDHdob9UDEGNhbGzREAEBBQEBBQEABCxzdWRvX3Jlc3VsdBUOAAAAGREBAAwQcmVhbNUDQGZvcmNlX3Byb3h5X3R5cGUREBBjYWxs0RABAQUBAAwgZGVsZWdhdGXVAyhwcm94eV90eXBlNQ4UZGVsYXkEAQEFAQAMKHByb3h5X3R5cGU1DhRkZWxheQQUaW5kZXgEAQEFAQAUHHNwYXduZXLVAyhwcm94eV90eXBlNQ4UaW5kZXgEGGhlaWdodAQkZXh0X2luZGV4BAEBBQEAECBkZWxlZ2F0ZdUDEHJlYWzVA0Bmb3JjZV9wcm94eV90eXBlERAQY2FsbNEQAQEFAQEFAQAQEHB1cmUADHdobwAocHJveHlfdHlwZTUOUGRpc2FtYmlndWF0aW9uX2luZGV4BAEBBQEAEBBwdXJlABxzcGF3bmVyAChwcm94eV90eXBlNQ5QZGlzYW1iaWd1YXRpb25faW5kZXgEAQEFAQAQJGRlbGVnYXRvcgAkZGVsZWdhdGVlAChwcm94eV90eXBlNQ4UZGVsYXkEAQEFAQAQDHdobwAQa2luZDkOLG9sZF9kZXBvc2l0CCxuZXdfZGVwb3NpdAgBAAhEb3RoZXJfc2lnbmF0b3JpZXPdAxBjYWxs0RABAQUBABQkdGhyZXNob2xkBERvdGhlcl9zaWduYXRvcmllc90DPG1heWJlX3RpbWVwb2ludI0EEGNhbGzREChtYXhfd2VpZ2h0GAEBBQEADCR0aHJlc2hvbGQERG90aGVyX3NpZ25hdG9yaWVz3QMkY2FsbF9oYXNoIAEBBQEBBQEAFCRhcHByb3ZpbmcAJHRpbWVwb2ludPEBIG11bHRpc2lnACRjYWxsX2hhc2ggGHJlc3VsdBUOAQEFAQAQDHdobwAkY2FsbF9oYXNoICxvbGRfZGVwb3NpdAgsbmV3X2RlcG9zaXQIAQEFALENAQEFAQAMHHBvb2xfaWQEGG1lbWJlcgBAcmVsZWFzZWRfYmFsYW5jZQgBAQUBAAgYbWVtYmVyAChwZXJtaXNzaW9uiQUBAQUBAAgccG9vbF9pZAQYY2FsbGVyAAEBBQEAGDRtaW5fam9pbl9ib25kCDxtaW5fY3JlYXRlX2JvbmQIJG1heF9wb29scy0ELG1heF9tZW1iZXJzLQRQbWF4X21lbWJlcnNfcGVyX3Bvb2wtBFRnbG9iYWxfbWF4X2NvbW1pc3Npb24tBAEBBQEACBRzdGFzaAAYcmVzdWx0FQ4BAQUBAAgMd2hvABB2b3RlNQQBAQUBAAgMd2hvABRjbGFzcwQABAAhEQEADDxwcm9wb3NhbF9vcmlnaW51DyBwcm9wb3NhbKUBQGVuYWN0bWVudF9tb21lbnRBBAEBBQEBBQEACCRjYWxsX2hhc2ggGHJlc3VsdFUOAAQAJREBABAoYXNzZXRfa2luZI0OGGFtb3VudAgsYmVuZWZpY2lhcnmRDih2YWxpZF9mcm9tLQQBAQUBAQUBABgUaW5kZXgEKGFzc2V0X2tpbmSNDhhhbW91bnQILGJlbmVmaWNpYXJ5kQ4odmFsaWRfZnJvbQQkZXhwaXJlX2F0BAAAACkRAAAALREBAQUBAAwUYWdlbnQAJGRlbGVnYXRvcgAYYW1vdW50CAEBBQBBEQAEAEkRAQEFAQMQpQ4kBAQBAQUBAwylDiQEAQEFAFURAQAEEGRhdGE9EAEBBQEBBQBhEQAEAGURAQAMEHBhcmEENG5ld19jb2RlX2hhc2ggMHZhbGlkX3BlcmlvZAQBAQUBAQUBAAwccGFyYV9pZAQkY29kZV9oYXNoICRleHBpcmVfYXQEAEkJAGkRAQAINGRpc3B1dGVfcHJvb2ZNEDxrZXlfb3duZXJfcHJvb2a9AwEBBQEACAhpZAQMeGNtWRABAQUBAQUBAAgccGFyYV9pZAQYcmVzdWx0FQ4ABAANAQAEAG0RAQAICGlkBEhsZWFzZV9wZXJpb2Rfc3RhcnRhEAEBBQEABBRzbG90cwQBAQUBAQUBAAQUc2xvdHMEAQEFAIUOAQAIDHdobwAYYW1vdW50CAEBBQEBBQBxEQEBBQBtEAEBBQBxEAEBBQCFEQEABBhyZXBvcnRtEAEBBQEABBBtb2RlcRABAQUBAQUBABAIaWQEXG5ld192YWxpZGF0b3Jfc2V0X2NvdW50BCxwcnVuZV91cF90by0EIGxlZnRvdmVyFAEBBQC9DgEBBQB9EAAkABUBAQAEGGN1cnNvcoEQAQEFAQAMFGluZGV4BDBpbm5lcl9jdXJzb3LFBShzdGFydGVkX2F0LQQBAQUBAAQgc2VsZWN0b3KFEAEBBQEBBQEABChtaWdyYXRpb25zBAEBBQEACBRpbmRleAQQdG9vawQBAQUBAAQsbmV4dF9jdXJzb3LFBQAIAJERAJURAAQAlREACACVEQC9CQEBBQCdEQChEQClEQAAAK0RAQEFABUPAJEOALkRAQAIEGRlc3SRDhxtZXNzYWdlWRABAQUBABAQZGVzdJEOLGJlbmVmaWNpYXJ5kQ4YYXNzZXRzHQ84ZmVlX2Fzc2V0X2l0ZW0EAQEFAQAIHG1lc3NhZ2VZEChtYXhfd2VpZ2h0GAEBBQEACCBsb2NhdGlvbokOHHZlcnNpb24EAQEFAQAEIGxvY2F0aW9ukQ4BAQUBABQQZGVzdJEOLGJlbmVmaWNpYXJ5kQ4YYXNzZXRzHQ84ZmVlX2Fzc2V0X2l0ZW0EMHdlaWdodF9saW1pdPECAQEFAQAIGGFzc2V0cx0PLGJlbmVmaWNpYXJ5kQ4BAQUBABwQZGVzdJEOGGFzc2V0cx0PUGFzc2V0c190cmFuc2Zlcl90eXBljRA4cmVtb3RlX2ZlZXNfaWSREEhmZWVzX3RyYW5zZmVyX3R5cGWNEEhjdXN0b21feGNtX29uX2Rlc3RZEDB3ZWlnaHRfbGltaXTxAgEBBQEACBxhbGlhc2VykQ4cZXhwaXJlc/UDAQEFAQAEHGFsaWFzZXKRDgEBBQEBBQEABBxvdXRjb21l0Q4BAQUBABAYb3JpZ2luiQ4sZGVzdGluYXRpb26JDhxtZXNzYWdlFQ8obWVzc2FnZV9pZCABAQUBABAYb3JpZ2luiQ4sZGVzdGluYXRpb26JDhRlcnJvchkPKG1lc3NhZ2VfaWQgAQEFAQAMGG9yaWdpbokOFGVycm9yyQ4obWVzc2FnZV9pZCABAQUBAAgYb3JpZ2luiQ4gcXVlcnlfaWQIAQEFAQAIIHF1ZXJ5X2lkCCByZXNwb25zZeUOAQEFAQAMGG9yaWdpbokOIHF1ZXJ5X2lkCERleHBlY3RlZF9sb2NhdGlvbukOAQEFAQAMEGhhc2ggGG9yaWdpbokOGGFzc2V0cx0PAQEFAQAQLGRlc3RpbmF0aW9uiQ4YcmVzdWx0BBBjb3N02Q4obWVzc2FnZV9pZCABAQUBAAggbG9jYXRpb26JDhx2ZXJzaW9uBAEBBQEADCBsb2NhdGlvbokOIHF1ZXJ5X2lkCBRlcnJvcskOAQEFAQAIIGxvY2F0aW9ukQ4gcXVlcnlfaWQIAQEFAQAQGG9yaWdpbokOIHF1ZXJ5X2lkCEBleHBlY3RlZF9xdWVyaWVyiQ5QbWF5YmVfYWN0dWFsX3F1ZXJpZXLpDgEBBQEADCxkZXN0aW5hdGlvbokOEGNvc3TZDihtZXNzYWdlX2lkIAEBBQEACBhwYXlpbmeJDhBmZWVz2Q4BAQUBAAwcYWxpYXNlcokOGHRhcmdldIkOGGV4cGlyefUDAQEFAQAIHGFsaWFzZXKJDhh0YXJnZXSJDgEBBQEABBh0YXJnZXSJDgEBBQEACBRpbmRleAQUZXJyb3LlDQCNDgAIAQAIKGFzc2V0X2tpbmSNDhByYXRlCAEBBQEABChhc3NldF9raW5kjQ4BAQUBAQUBAAgoYXNzZXRfa2luZI0OEHJhdGUIAQEFAQAEKGFzc2V0X2tpbmSNDgEBBQEADChhc3NldF9raW5kjQ4Mb2xkCAxuZXcIAQAEFHJhdGlvBAEBBQEABBxtZXRhX3R4sRABAQUBAQUBAAQYcmVzdWx0VQ4BAAhIZXF1aXZvY2F0aW9uX3Byb29mxRA8a2V5X293bmVyX3Byb29mvQMBAQUBAAhIZXF1aXZvY2F0aW9uX3Byb29m0QY8a2V5X293bmVyX3Byb29mvQMBAQUBAAQMd2hvAAEBBQEBBQEADAx3aG8AIGlkZW50aXR5CBBzdWJzCAEDAABBDwEDCL0RJADFEQEDBCQA0REBAwwpCiQgANURAQMAAOERAQMEBADlEQEDAADtEQEDAADxEQEDBAQAARIBAwQEAAUSAQMEBAANEgEDCBESJAAUAQMI0QYkABQBAwgELQQAxQUBAwjREAQA+QoBAwjREAQABQsBAwQEABkSAQMEWRAAFQsBAwgYkRAAGQsBAwiRDlkQAB0SAQMMdQ/REAQAORIBAwiRDlkQAEESAQMEkQ4ATQsBAwQEAL0MAQMIRRKRDgBNElESAQEBAgEDABAQZnJlZQggcmVzZXJ2ZWQIGGZyb3plbggUZmxhZ3MIABQUbm9uY2UEJGNvbnN1bWVycwQkcHJvdmlkZXJzBCxzdWZmaWNpZW50cwQQZGF0YQwBAAAIIHJlZl90aW1lCChwcm9vZl9zaXplCAAMGG5vcm1hbBgsb3BlcmF0aW9uYWwYJG1hbmRhdG9yeRgFAYAFAAUBEAIUKFByZVJ1bnRpbWUBAwgoJCRDb25zZW5zdXMBAwgoJBBTZWFsAQMIKCQUT3RoZXIBBQBkUnVudGltZUVudmlyb25tZW50VXBkYXRlZAEBBQQsAAIMOEFwcGx5RXh0cmluc2ljAQECMEZpbmFsaXphdGlvbgEBBThJbml0aWFsaXphdGlvbgEBBQIMGE5vcm1hbAEBBSxPcGVyYXRpb25hbAEBBSRNYW5kYXRvcnkBAQUCCAxZZXMBAQUITm8BAQUADBh3ZWlnaHQYFGNsYXNzOCBwYXlzX2ZlZTwCJDxJbnZhbGlkU3BlY05hbWUBAQVoU3BlY1ZlcnNpb25OZWVkc1RvSW5jcmVhc2UBAQV0RmFpbGVkVG9FeHRyYWN0UnVudGltZVZlcnNpb24BAQVMTm9uRGVmYXVsdENvbXBvc2l0ZQEBBTxOb25aZXJvUmVmQ291bnQBAQUwQ2FsbEZpbHRlcmVkAQEFbE11bHRpQmxvY2tNaWdyYXRpb25zT25nb2luZwEBBUROb3RoaW5nQXV0aG9yaXplZAEBBTBVbmF1dGhvcml6ZWQBAQUCFEBGYWlsZWRUb1NjaGVkdWxlAQEFIE5vdEZvdW5kAQEFXFRhcmdldEJsb2NrTnVtYmVySW5QYXN0AQEFSFJlc2NoZWR1bGVOb0NoYW5nZQEBBRROYW1lZAEBBQIkGFRvb0JpZwEBBTBBbHJlYWR5Tm90ZWQBAQU0Tm90QXV0aG9yaXplZAEBBSBOb3ROb3RlZAEBBSRSZXF1ZXN0ZWQBAQUwTm90UmVxdWVzdGVkAQEFHFRvb01hbnkBAQUYVG9vRmV3AQEFGE5vQ29zdAEBBQIQYEludmFsaWRFcXVpdm9jYXRpb25Qcm9vZgEBBWBJbnZhbGlkS2V5T3duZXJzaGlwUHJvb2YBAQVYRHVwbGljYXRlT2ZmZW5jZVJlcG9ydAEBBVBJbnZhbGlkQ29uZmlndXJhdGlvbgEBBQIULE5vdEFzc2lnbmVkAQEFIE5vdE93bmVyAQEFFEluVXNlAQEFLE5vdFRyYW5zZmVyAQEFJFBlcm1hbmVudAEBBQIwOFZlc3RpbmdCYWxhbmNlAQEFVExpcXVpZGl0eVJlc3RyaWN0aW9ucwEBBUxJbnN1ZmZpY2llbnRCYWxhbmNlAQEFSEV4aXN0ZW50aWFsRGVwb3NpdAEBBTRFeHBlbmRhYmlsaXR5AQEFXEV4aXN0aW5nVmVzdGluZ1NjaGVkdWxlAQEFLERlYWRBY2NvdW50AQEFPFRvb01hbnlSZXNlcnZlcwEBBTBUb29NYW55SG9sZHMBAQU4VG9vTWFueUZyZWV6ZXMBAQVMSXNzdWFuY2VEZWFjdGl2YXRlZAEBBSREZWx0YVplcm8BAQUCfDROb3RDb250cm9sbGVyAQEFIE5vdFN0YXNoAQEFNEFscmVhZHlCb25kZWQBAQU0QWxyZWFkeVBhaXJlZAEBBTBFbXB0eVRhcmdldHMBAQU4RHVwbGljYXRlSW5kZXgBAQVESW52YWxpZFNsYXNoSW5kZXgBAQVASW5zdWZmaWNpZW50Qm9uZAEBBTBOb01vcmVDaHVua3MBAQU0Tm9VbmxvY2tDaHVuawEBBTBGdW5kZWRUYXJnZXQBAQVISW52YWxpZEVyYVRvUmV3YXJkAQEFaEludmFsaWROdW1iZXJPZk5vbWluYXRpb25zAQEFSE5vdFNvcnRlZEFuZFVuaXF1ZQEBBThBbHJlYWR5Q2xhaW1lZAEBBSxJbnZhbGlkUGFnZQEBBVRJbmNvcnJlY3RIaXN0b3J5RGVwdGgBAQVYSW5jb3JyZWN0U2xhc2hpbmdTcGFucwEBBSBCYWRTdGF0ZQEBBThUb29NYW55VGFyZ2V0cwEBBSRCYWRUYXJnZXQBAQVAQ2Fubm90Q2hpbGxPdGhlcgEBBURUb29NYW55Tm9taW5hdG9ycwEBBURUb29NYW55VmFsaWRhdG9ycwEBBUBDb21taXNzaW9uVG9vTG93AQEFLEJvdW5kTm90TWV0AQEFUENvbnRyb2xsZXJEZXByZWNhdGVkAQEFTENhbm5vdFJlc3RvcmVMZWRnZXIBAQVsUmV3YXJkRGVzdGluYXRpb25SZXN0cmljdGVkAQEFOE5vdEVub3VnaEZ1bmRzAQEFXFZpcnR1YWxTdGFrZXJOb3RBbGxvd2VkAQEFAhQwSW52YWxpZFByb29mAQEFXE5vQXNzb2NpYXRlZFZhbGlkYXRvcklkAQEFNER1cGxpY2F0ZWRLZXkBAQUYTm9LZXlzAQEFJE5vQWNjb3VudAEBBQIcLFBhdXNlRmFpbGVkAQEFMFJlc3VtZUZhaWxlZAEBBTRDaGFuZ2VQZW5kaW5nAQEFHFRvb1Nvb24BAQVgSW52YWxpZEtleU93bmVyc2hpcFByb29mAQEFYEludmFsaWRFcXVpdm9jYXRpb25Qcm9vZgEBBVhEdXBsaWNhdGVPZmZlbmNlUmVwb3J0AQEFAiwwSW52YWxpZEluZGV4AQEFQFRvb01hbnlBcHByb3ZhbHMBAQVYSW5zdWZmaWNpZW50UGVybWlzc2lvbgEBBUxQcm9wb3NhbE5vdEFwcHJvdmVkAQEFWEZhaWxlZFRvQ29udmVydEJhbGFuY2UBAQUwU3BlbmRFeHBpcmVkAQEFLEVhcmx5UGF5b3V0AQEFQEFscmVhZHlBdHRlbXB0ZWQBAQUsUGF5b3V0RXJyb3IBAQUwTm90QXR0ZW1wdGVkAQEFMEluY29uY2x1c2l2ZQEBBQIwKE5vdE9uZ29pbmcBAQUgTm90Vm90ZXIBAQUwTm9QZXJtaXNzaW9uAQEFPE5vUGVybWlzc2lvbllldAEBBURBbHJlYWR5RGVsZWdhdGluZwEBBTRBbHJlYWR5Vm90aW5nAQEFREluc3VmZmljaWVudEZ1bmRzAQEFNE5vdERlbGVnYXRpbmcBAQUgTm9uc2Vuc2UBAQU8TWF4Vm90ZXNSZWFjaGVkAQEFLENsYXNzTmVlZGVkAQEFIEJhZENsYXNzAQEFAjgoTm90T25nb2luZwEBBShIYXNEZXBvc2l0AQEFIEJhZFRyYWNrAQEFEEZ1bGwBAQUoUXVldWVFbXB0eQEBBTRCYWRSZWZlcmVuZHVtAQEFLE5vdGhpbmdUb0RvAQEFHE5vVHJhY2sBAQUoVW5maW5pc2hlZAEBBTBOb1Blcm1pc3Npb24BAQUkTm9EZXBvc2l0AQEFJEJhZFN0YXR1cwEBBUBQcmVpbWFnZU5vdEV4aXN0AQEFhFByZWltYWdlU3RvcmVkV2l0aERpZmZlcmVudExlbmd0aAEBBQIUTFVuYXZhaWxhYmxlUHJlSW1hZ2UBAQU8VW5kZWNvZGFibGVDYWxsAQEFYEludmFsaWRDYWxsV2VpZ2h0V2l0bmVzcwEBBVBDYWxsSXNOb3RXaGl0ZWxpc3RlZAEBBVhDYWxsQWxyZWFkeVdoaXRlbGlzdGVkAQEFAhhgSW52YWxpZEV0aGVyZXVtU2lnbmF0dXJlAQEFQFNpZ25lckhhc05vQ2xhaW0BAQVAU2VuZGVySGFzTm9DbGFpbQEBBTBQb3RVbmRlcmZsb3cBAQVASW52YWxpZFN0YXRlbWVudAEBBUxWZXN0ZWRCYWxhbmNlRXhpc3RzAQEFAhQoTm90VmVzdGluZwEBBVRBdE1heFZlc3RpbmdTY2hlZHVsZXMBAQUkQW1vdW50TG93AQEFYFNjaGVkdWxlSW5kZXhPdXRPZkJvdW5kcwEBBVRJbnZhbGlkU2NoZWR1bGVQYXJhbXMBAQUCBDBUb29NYW55Q2FsbHMBAQUCIBxUb29NYW55AQEFIE5vdEZvdW5kAQEFIE5vdFByb3h5AQEFLFVucHJveHlhYmxlAQEFJER1cGxpY2F0ZQEBBTBOb1Blcm1pc3Npb24BAQUsVW5hbm5vdW5jZWQBAQUsTm9TZWxmUHJveHkBAQUCOEBNaW5pbXVtVGhyZXNob2xkAQEFPEFscmVhZHlBcHByb3ZlZAEBBUROb0FwcHJvdmFsc05lZWRlZAEBBURUb29GZXdTaWduYXRvcmllcwEBBUhUb29NYW55U2lnbmF0b3JpZXMBAQVUU2lnbmF0b3JpZXNPdXRPZk9yZGVyAQEFTFNlbmRlckluU2lnbmF0b3JpZXMBAQUgTm90Rm91bmQBAQUgTm90T3duZXIBAQUsTm9UaW1lcG9pbnQBAQU4V3JvbmdUaW1lcG9pbnQBAQVMVW5leHBlY3RlZFRpbWVwb2ludAEBBTxNYXhXZWlnaHRUb29Mb3cBAQU0QWxyZWFkeVN0b3JlZAEBBQIscEluc3VmZmljaWVudFByb3Bvc2Vyc0JhbGFuY2UBAQUwSW52YWxpZEluZGV4AQEFMFJlYXNvblRvb0JpZwEBBUBVbmV4cGVjdGVkU3RhdHVzAQEFOFJlcXVpcmVDdXJhdG9yAQEFMEludmFsaWRWYWx1ZQEBBShJbnZhbGlkRmVlAQEFNFBlbmRpbmdQYXlvdXQBAQUkUHJlbWF0dXJlAQEFUEhhc0FjdGl2ZUNoaWxkQm91bnR5AQEFNFRvb01hbnlRdWV1ZWQBAQUCDFRQYXJlbnRCb3VudHlOb3RBY3RpdmUBAQVkSW5zdWZmaWNpZW50Qm91bnR5QmFsYW5jZQEBBVBUb29NYW55Q2hpbGRCb3VudGllcwEBBQI8aFByZURpc3BhdGNoRWFybHlTdWJtaXNzaW9uAQEFbFByZURpc3BhdGNoV3JvbmdXaW5uZXJDb3VudAEBBWRQcmVEaXNwYXRjaFdlYWtTdWJtaXNzaW9uAQEFPFNpZ25lZFF1ZXVlRnVsbAEBBVhTaWduZWRDYW5ub3RQYXlEZXBvc2l0AQEFUFNpZ25lZEludmFsaWRXaXRuZXNzAQEFTFNpZ25lZFRvb011Y2hXZWlnaHQBAQU8T2N3Q2FsbFdyb25nRXJhAQEFXE1pc3NpbmdTbmFwc2hvdE1ldGFkYXRhAQEFWEludmFsaWRTdWJtaXNzaW9uSW5kZXgBAQU4Q2FsbE5vdEFsbG93ZWQBAQU4RmFsbGJhY2tGYWlsZWQBAQUsQm91bmROb3RNZXQBAQU4VG9vTWFueVdpbm5lcnMBAQVkUHJlRGlzcGF0Y2hEaWZmZXJlbnRSb3VuZAEBBQIQJER1cGxpY2F0ZQEBBShOb3RIZWF2aWVyAQEFME5vdEluU2FtZUJhZwEBBTBOb2RlTm90Rm91bmQBAQUCBBBMaXN0AQIQJER1cGxpY2F0ZQEBBShOb3RIZWF2aWVyAQEFME5vdEluU2FtZUJhZwEBBTBOb2RlTm90Rm91bmQBAQUCHGhOb3RFbm91Z2hTcGFjZUluVW5ib25kUG9vbAEBBTBQb29sTm90Rm91bmQBAQVIUmV3YXJkUG9vbE5vdEZvdW5kAQEFQFN1YlBvb2xzTm90Rm91bmQBAQVwQm9uZGVkU3Rhc2hLaWxsZWRQcmVtYXR1cmVseQEBBVREZWxlZ2F0aW9uVW5zdXBwb3J0ZWQBAQU8U2xhc2hOb3RBcHBsaWVkAQEFApAwUG9vbE5vdEZvdW5kAQEFSFBvb2xNZW1iZXJOb3RGb3VuZAEBBUhSZXdhcmRQb29sTm90Rm91bmQBAQVAU3ViUG9vbHNOb3RGb3VuZAEBBWRBY2NvdW50QmVsb25nc1RvT3RoZXJQb29sAQEFOEZ1bGx5VW5ib25kaW5nAQEFRE1heFVuYm9uZGluZ0xpbWl0AQEFRENhbm5vdFdpdGhkcmF3QW55AQEFRE1pbmltdW1Cb25kTm90TWV0AQEFME92ZXJmbG93UmlzawEBBTROb3REZXN0cm95aW5nAQEFME5vdE5vbWluYXRvcgEBBVROb3RLaWNrZXJPckRlc3Ryb3lpbmcBAQUcTm90T3BlbgEBBSBNYXhQb29scwEBBThNYXhQb29sTWVtYmVycwEBBURDYW5Ob3RDaGFuZ2VTdGF0ZQEBBVREb2VzTm90SGF2ZVBlcm1pc3Npb24BAQVUTWV0YWRhdGFFeGNlZWRzTWF4TGVuAQEFJERlZmVuc2l2ZQECHGhOb3RFbm91Z2hTcGFjZUluVW5ib25kUG9vbAEBBTBQb29sTm90Rm91bmQBAQVIUmV3YXJkUG9vbE5vdEZvdW5kAQEFQFN1YlBvb2xzTm90Rm91bmQBAQVwQm9uZGVkU3Rhc2hLaWxsZWRQcmVtYXR1cmVseQEBBVREZWxlZ2F0aW9uVW5zdXBwb3J0ZWQBAQU8U2xhc2hOb3RBcHBsaWVkAQEFnFBhcnRpYWxVbmJvbmROb3RBbGxvd2VkUGVybWlzc2lvbmxlc3NseQEBBVxNYXhDb21taXNzaW9uUmVzdHJpY3RlZAEBBWBDb21taXNzaW9uRXhjZWVkc01heGltdW0BAQV4Q29tbWlzc2lvbkV4Y2VlZHNHbG9iYWxNYXhpbXVtAQEFZENvbW1pc3Npb25DaGFuZ2VUaHJvdHRsZWQBAQV4Q29tbWlzc2lvbkNoYW5nZVJhdGVOb3RBbGxvd2VkAQEFTE5vUGVuZGluZ0NvbW1pc3Npb24BAQVYTm9Db21taXNzaW9uQ3VycmVudFNldAEBBSxQb29sSWRJblVzZQEBBTRJbnZhbGlkUG9vbElkAQEFTEJvbmRFeHRyYVJlc3RyaWN0ZWQBAQU8Tm90aGluZ1RvQWRqdXN0AQEFOE5vdGhpbmdUb1NsYXNoAQEFPEFscmVhZHlNaWdyYXRlZAEBBSxOb3RNaWdyYXRlZAEBBTBOb3RTdXBwb3J0ZWQBAQUCGDROb3RDb250cm9sbGVyAQEFNEFscmVhZHlRdWV1ZWQBAQU4Tm90RnVsbHlCb25kZWQBAQUkTm90UXVldWVkAQEFLEFscmVhZHlIZWFkAQEFOENhbGxOb3RBbGxvd2VkAQEFAgQ8SW52YWxpZE5ld1ZhbHVlAQEFAkhkVmFsaWRhdG9ySW5kZXhPdXRPZkJvdW5kcwEBBVBVbnNjaGVkdWxlZENhbmRpZGF0ZQEBBUBIZWFkRGF0YVRvb0xhcmdlAQEFUFByZW1hdHVyZUNvZGVVcGdyYWRlAQEFPE5ld0NvZGVUb29MYXJnZQEBBVREaXNhbGxvd2VkUmVsYXlQYXJlbnQBAQVESW52YWxpZEFzc2lnbm1lbnQBAQVESW52YWxpZEdyb3VwSW5kZXgBAQVMSW5zdWZmaWNpZW50QmFja2luZwEBBThJbnZhbGlkQmFja2luZwEBBUROb3RDb2xsYXRvclNpZ25lZAEBBWhWYWxpZGF0aW9uRGF0YUhhc2hNaXNtYXRjaAEBBYBJbmNvcnJlY3REb3dud2FyZE1lc3NhZ2VIYW5kbGluZwEBBVRJbnZhbGlkVXB3YXJkTWVzc2FnZXMBAQVgSHJtcFdhdGVybWFya01pc2hhbmRsaW5nAQEFTEludmFsaWRPdXRib3VuZEhybXABAQVkSW52YWxpZFZhbGlkYXRpb25Db2RlSGFzaAEBBUBQYXJhSGVhZE1pc21hdGNoAQEFAhRkVG9vTWFueUluY2x1c2lvbkluaGVyZW50cwEBBUxJbnZhbGlkUGFyZW50SGVhZGVyAQEFSEluaGVyZW50T3ZlcndlaWdodAEBBYRDYW5kaWRhdGVzRmlsdGVyZWREdXJpbmdFeGVjdXRpb24BAQVQVW5zY2hlZHVsZWRDYW5kaWRhdGUBAQUCNDROb3RSZWdpc3RlcmVkAQEFNENhbm5vdE9uYm9hcmQBAQU4Q2Fubm90T2ZmYm9hcmQBAQU0Q2Fubm90VXBncmFkZQEBBTxDYW5ub3REb3duZ3JhZGUBAQVYUHZmQ2hlY2tTdGF0ZW1lbnRTdGFsZQEBBVxQdmZDaGVja1N0YXRlbWVudEZ1dHVyZQEBBYRQdmZDaGVja1ZhbGlkYXRvckluZGV4T3V0T2ZCb3VuZHMBAQVgUHZmQ2hlY2tJbnZhbGlkU2lnbmF0dXJlAQEFSFB2ZkNoZWNrRG91YmxlVm90ZQEBBVhQdmZDaGVja1N1YmplY3RJbnZhbGlkAQEFRENhbm5vdFVwZ3JhZGVDb2RlAQEFLEludmFsaWRDb2RlAQEFAlBUT3BlbkhybXBDaGFubmVsVG9TZWxmAQEFfE9wZW5Icm1wQ2hhbm5lbEludmFsaWRSZWNpcGllbnQBAQVsT3BlbkhybXBDaGFubmVsWmVyb0NhcGFjaXR5AQEFjE9wZW5Icm1wQ2hhbm5lbENhcGFjaXR5RXhjZWVkc0xpbWl0AQEFeE9wZW5Icm1wQ2hhbm5lbFplcm9NZXNzYWdlU2l6ZQEBBZhPcGVuSHJtcENoYW5uZWxNZXNzYWdlU2l6ZUV4Y2VlZHNMaW1pdAEBBXBPcGVuSHJtcENoYW5uZWxBbHJlYWR5RXhpc3RzAQEFfE9wZW5Icm1wQ2hhbm5lbEFscmVhZHlSZXF1ZXN0ZWQBAQVwT3BlbkhybXBDaGFubmVsTGltaXRFeGNlZWRlZAEBBXBBY2NlcHRIcm1wQ2hhbm5lbERvZXNudEV4aXN0AQEFhEFjY2VwdEhybXBDaGFubmVsQWxyZWFkeUNvbmZpcm1lZAEBBXhBY2NlcHRIcm1wQ2hhbm5lbExpbWl0RXhjZWVkZWQBAQVwQ2xvc2VIcm1wQ2hhbm5lbFVuYXV0aG9yaXplZAEBBWxDbG9zZUhybXBDaGFubmVsRG9lc250RXhpc3QBAQV8Q2xvc2VIcm1wQ2hhbm5lbEFscmVhZHlVbmRlcndheQEBBYRDYW5jZWxIcm1wT3BlbkNoYW5uZWxVbmF1dGhvcml6ZWQBAQVoT3BlbkhybXBDaGFubmVsRG9lc250RXhpc3QBAQV8T3BlbkhybXBDaGFubmVsQWxyZWFkeUNvbmZpcm1lZAEBBTBXcm9uZ1dpdG5lc3MBAQVwQ2hhbm5lbENyZWF0aW9uTm90QXV0aG9yaXplZAEBBQIkdER1cGxpY2F0ZURpc3B1dGVTdGF0ZW1lbnRTZXRzAQEFXEFuY2llbnREaXNwdXRlU3RhdGVtZW50AQEFZFZhbGlkYXRvckluZGV4T3V0T2ZCb3VuZHMBAQVASW52YWxpZFNpZ25hdHVyZQEBBUhEdXBsaWNhdGVTdGF0ZW1lbnQBAQVIU2luZ2xlU2lkZWREaXNwdXRlAQEFPE1hbGljaW91c0JhY2tlcgEBBUxNaXNzaW5nQmFja2luZ1ZvdGVzAQEFSFVuY29uZmlybWVkRGlzcHV0ZQEBBQIYYEludmFsaWRLZXlPd25lcnNoaXBQcm9vZgEBBUxJbnZhbGlkU2Vzc2lvbkluZGV4AQEFUEludmFsaWRDYW5kaWRhdGVIYXNoAQEFVEludmFsaWRWYWxpZGF0b3JJbmRleAEBBWBWYWxpZGF0b3JJbmRleElkTWlzbWF0Y2gBAQVcRHVwbGljYXRlU2xhc2hpbmdSZXBvcnQBAQUCCCRRdWV1ZUZ1bGwBAQVwU3BvdFByaWNlSGlnaGVyVGhhbk1heEFtb3VudAEBBQIYQEFzc2lnbm1lbnRzRW1wdHkBAQU0T3ZlclNjaGVkdWxlZAEBBThVbmRlclNjaGVkdWxlZAEBBUBEaXNhbGxvd2VkSW5zZXJ0AQEFPER1cGxpY2F0ZUluc2VydAEBBVBBc3NpZ25tZW50c05vdFNvcnRlZAEBBQI4NE5vdFJlZ2lzdGVyZWQBAQVEQWxyZWFkeVJlZ2lzdGVyZWQBAQUgTm90T3duZXIBAQUwQ29kZVRvb0xhcmdlAQEFQEhlYWREYXRhVG9vTGFyZ2UBAQUwTm90UGFyYWNoYWluAQEFNE5vdFBhcmF0aHJlYWQBAQVAQ2Fubm90RGVyZWdpc3RlcgEBBTxDYW5ub3REb3duZ3JhZGUBAQU0Q2Fubm90VXBncmFkZQEBBShQYXJhTG9ja2VkAQEFLE5vdFJlc2VydmVkAQEFLEludmFsaWRDb2RlAQEFKENhbm5vdFN3YXABAQUCCERQYXJhTm90T25ib2FyZGluZwEBBShMZWFzZUVycm9yAQEFAhxEQXVjdGlvbkluUHJvZ3Jlc3MBAQVETGVhc2VQZXJpb2RJblBhc3QBAQVEUGFyYU5vdFJlZ2lzdGVyZWQBAQVETm90Q3VycmVudEF1Y3Rpb24BAQUoTm90QXVjdGlvbgEBBTBBdWN0aW9uRW5kZWQBAQVAQWxyZWFkeUxlYXNlZE91dAEBBQJcREZpcnN0UGVyaW9kSW5QYXN0AQEFZEZpcnN0UGVyaW9kVG9vRmFySW5GdXR1cmUBAQVsTGFzdFBlcmlvZEJlZm9yZUZpcnN0UGVyaW9kAQEFYExhc3RQZXJpb2RUb29GYXJJbkZ1dHVyZQEBBTxDYW5ub3RFbmRJblBhc3QBAQVERW5kVG9vRmFySW5GdXR1cmUBAQUgT3ZlcmZsb3cBAQVQQ29udHJpYnV0aW9uVG9vU21hbGwBAQU0SW52YWxpZFBhcmFJZAEBBSxDYXBFeGNlZWRlZAEBBVhDb250cmlidXRpb25QZXJpb2RPdmVyAQEFNEludmFsaWRPcmlnaW4BAQUwTm90UGFyYWNoYWluAQEFLExlYXNlQWN0aXZlAQEFQEJpZE9yTGVhc2VBY3RpdmUBAQUwRnVuZE5vdEVuZGVkAQEFPE5vQ29udHJpYnV0aW9ucwEBBUhOb3RSZWFkeVRvRGlzc29sdmUBAQVASW52YWxpZFNpZ25hdHVyZQEBBTBNZW1vVG9vTGFyZ2UBAQVEQWxyZWFkeUluTmV3UmFpc2UBAQVIVnJmRGVsYXlJblByb2dyZXNzAQEFNE5vTGVhc2VQZXJpb2QBAQUCDCROb3RCcm9rZXIBAQVYUmVxdWVzdGVkRnV0dXJlUmV2ZW51ZQEBBUxBc3NldFRyYW5zZmVyRmFpbGVkAQEFAhg8TWF4U2lnbmVkTGltaXRzAQEFKEtleVRvb0xvbmcBAQU4Tm90RW5vdWdoRnVuZHMBAQUoQmFkV2l0bmVzcwEBBWRTaWduZWRNaWdyYXRpb25Ob3RBbGxvd2VkAQEFMEJhZENoaWxkUm9vdAEBBQJgLFVucmVhY2hhYmxlAQEFLFNlbmRGYWlsdXJlAQEFIEZpbHRlcmVkAQEFSFVud2VpZ2hhYmxlTWVzc2FnZQEBBWBEZXN0aW5hdGlvbk5vdEludmVydGlibGUBAQUURW1wdHkBAQU4Q2Fubm90UmVhbmNob3IBAQU0VG9vTWFueUFzc2V0cwEBBTRJbnZhbGlkT3JpZ2luAQEFKEJhZFZlcnNpb24BAQUsQmFkTG9jYXRpb24BAQU4Tm9TdWJzY3JpcHRpb24BAQVEQWxyZWFkeVN1YnNjcmliZWQBAQVYQ2Fubm90Q2hlY2tPdXRUZWxlcG9ydAEBBShMb3dCYWxhbmNlAQEFMFRvb01hbnlMb2NrcwEBBUxBY2NvdW50Tm90U292ZXJlaWduAQEFKEZlZXNOb3RNZXQBAQUwTG9ja05vdEZvdW5kAQEFFEluVXNlAQEFaEludmFsaWRBc3NldFVua25vd25SZXNlcnZlAQEFeEludmFsaWRBc3NldFVuc3VwcG9ydGVkUmVzZXJ2ZQEBBTxUb29NYW55UmVzZXJ2ZXMBAQVgTG9jYWxFeGVjdXRpb25JbmNvbXBsZXRlAQEFAiQsTm90UmVhcGFibGUBAQUYTm9QYWdlAQEFJE5vTWVzc2FnZQEBBUBBbHJlYWR5UHJvY2Vzc2VkAQEFGFF1ZXVlZAEBBUhJbnN1ZmZpY2llbnRXZWlnaHQBAQVgVGVtcG9yYXJpbHlVbnByb2Nlc3NhYmxlAQEFLFF1ZXVlUGF1c2VkAQEFTFJlY3Vyc2l2ZURpc2FsbG93ZWQBAQUCDEBVbmtub3duQXNzZXRLaW5kAQEFNEFscmVhZHlFeGlzdHMBAQUgT3ZlcmZsb3cBAQUC7BhTeXN0ZW0BAiQ8SW52YWxpZFNwZWNOYW1lAQEFaFNwZWNWZXJzaW9uTmVlZHNUb0luY3JlYXNlAQEFdEZhaWxlZFRvRXh0cmFjdFJ1bnRpbWVWZXJzaW9uAQEFTE5vbkRlZmF1bHRDb21wb3NpdGUBAQU8Tm9uWmVyb1JlZkNvdW50AQEFMENhbGxGaWx0ZXJlZAEBBWxNdWx0aUJsb2NrTWlncmF0aW9uc09uZ29pbmcBAQVETm90aGluZ0F1dGhvcml6ZWQBAQUwVW5hdXRob3JpemVkAQEFJFNjaGVkdWxlcgECFEBGYWlsZWRUb1NjaGVkdWxlAQEFIE5vdEZvdW5kAQEFXFRhcmdldEJsb2NrTnVtYmVySW5QYXN0AQEFSFJlc2NoZWR1bGVOb0NoYW5nZQEBBRROYW1lZAEBBSBQcmVpbWFnZQECJBhUb29CaWcBAQUwQWxyZWFkeU5vdGVkAQEFNE5vdEF1dGhvcml6ZWQBAQUgTm90Tm90ZWQBAQUkUmVxdWVzdGVkAQEFME5vdFJlcXVlc3RlZAEBBRxUb29NYW55AQEFGFRvb0ZldwEBBRhOb0Nvc3QBAQUQQmFiZQECEGBJbnZhbGlkRXF1aXZvY2F0aW9uUHJvb2YBAQVgSW52YWxpZEtleU93bmVyc2hpcFByb29mAQEFWER1cGxpY2F0ZU9mZmVuY2VSZXBvcnQBAQVQSW52YWxpZENvbmZpZ3VyYXRpb24BAQUkVGltZXN0YW1wAQEFHEluZGljZXMBAhQsTm90QXNzaWduZWQBAQUgTm90T3duZXIBAQUUSW5Vc2UBAQUsTm90VHJhbnNmZXIBAQUkUGVybWFuZW50AQEFIEJhbGFuY2VzAQIwOFZlc3RpbmdCYWxhbmNlAQEFVExpcXVpZGl0eVJlc3RyaWN0aW9ucwEBBUxJbnN1ZmZpY2llbnRCYWxhbmNlAQEFSEV4aXN0ZW50aWFsRGVwb3NpdAEBBTRFeHBlbmRhYmlsaXR5AQEFXEV4aXN0aW5nVmVzdGluZ1NjaGVkdWxlAQEFLERlYWRBY2NvdW50AQEFPFRvb01hbnlSZXNlcnZlcwEBBTBUb29NYW55SG9sZHMBAQU4VG9vTWFueUZyZWV6ZXMBAQVMSXNzdWFuY2VEZWFjdGl2YXRlZAEBBSREZWx0YVplcm8BAQVIVHJhbnNhY3Rpb25QYXltZW50AQEFKEF1dGhvcnNoaXABAQUcU3Rha2luZwECfDROb3RDb250cm9sbGVyAQEFIE5vdFN0YXNoAQEFNEFscmVhZHlCb25kZWQBAQU0QWxyZWFkeVBhaXJlZAEBBTBFbXB0eVRhcmdldHMBAQU4RHVwbGljYXRlSW5kZXgBAQVESW52YWxpZFNsYXNoSW5kZXgBAQVASW5zdWZmaWNpZW50Qm9uZAEBBTBOb01vcmVDaHVua3MBAQU0Tm9VbmxvY2tDaHVuawEBBTBGdW5kZWRUYXJnZXQBAQVISW52YWxpZEVyYVRvUmV3YXJkAQEFaEludmFsaWROdW1iZXJPZk5vbWluYXRpb25zAQEFSE5vdFNvcnRlZEFuZFVuaXF1ZQEBBThBbHJlYWR5Q2xhaW1lZAEBBSxJbnZhbGlkUGFnZQEBBVRJbmNvcnJlY3RIaXN0b3J5RGVwdGgBAQVYSW5jb3JyZWN0U2xhc2hpbmdTcGFucwEBBSBCYWRTdGF0ZQEBBThUb29NYW55VGFyZ2V0cwEBBSRCYWRUYXJnZXQBAQVAQ2Fubm90Q2hpbGxPdGhlcgEBBURUb29NYW55Tm9taW5hdG9ycwEBBURUb29NYW55VmFsaWRhdG9ycwEBBUBDb21taXNzaW9uVG9vTG93AQEFLEJvdW5kTm90TWV0AQEFUENvbnRyb2xsZXJEZXByZWNhdGVkAQEFTENhbm5vdFJlc3RvcmVMZWRnZXIBAQVsUmV3YXJkRGVzdGluYXRpb25SZXN0cmljdGVkAQEFOE5vdEVub3VnaEZ1bmRzAQEFXFZpcnR1YWxTdGFrZXJOb3RBbGxvd2VkAQEFIE9mZmVuY2VzAQEFKEhpc3RvcmljYWwBAQUcU2Vzc2lvbgECFDBJbnZhbGlkUHJvb2YBAQVcTm9Bc3NvY2lhdGVkVmFsaWRhdG9ySWQBAQU0RHVwbGljYXRlZEtleQEBBRhOb0tleXMBAQUkTm9BY2NvdW50AQEFHEdyYW5kcGEBAhwsUGF1c2VGYWlsZWQBAQUwUmVzdW1lRmFpbGVkAQEFNENoYW5nZVBlbmRpbmcBAQUcVG9vU29vbgEBBWBJbnZhbGlkS2V5T3duZXJzaGlwUHJvb2YBAQVgSW52YWxpZEVxdWl2b2NhdGlvblByb29mAQEFWER1cGxpY2F0ZU9mZmVuY2VSZXBvcnQBAQVIQXV0aG9yaXR5RGlzY292ZXJ5AQEFIFRyZWFzdXJ5AQIsMEludmFsaWRJbmRleAEBBUBUb29NYW55QXBwcm92YWxzAQEFWEluc3VmZmljaWVudFBlcm1pc3Npb24BAQVMUHJvcG9zYWxOb3RBcHByb3ZlZAEBBVhGYWlsZWRUb0NvbnZlcnRCYWxhbmNlAQEFMFNwZW5kRXhwaXJlZAEBBSxFYXJseVBheW91dAEBBUBBbHJlYWR5QXR0ZW1wdGVkAQEFLFBheW91dEVycm9yAQEFME5vdEF0dGVtcHRlZAEBBTBJbmNvbmNsdXNpdmUBAQVAQ29udmljdGlvblZvdGluZwECMChOb3RPbmdvaW5nAQEFIE5vdFZvdGVyAQEFME5vUGVybWlzc2lvbgEBBTxOb1Blcm1pc3Npb25ZZXQBAQVEQWxyZWFkeURlbGVnYXRpbmcBAQU0QWxyZWFkeVZvdGluZwEBBURJbnN1ZmZpY2llbnRGdW5kcwEBBTROb3REZWxlZ2F0aW5nAQEFIE5vbnNlbnNlAQEFPE1heFZvdGVzUmVhY2hlZAEBBSxDbGFzc05lZWRlZAEBBSBCYWRDbGFzcwEBBSRSZWZlcmVuZGEBAjgoTm90T25nb2luZwEBBShIYXNEZXBvc2l0AQEFIEJhZFRyYWNrAQEFEEZ1bGwBAQUoUXVldWVFbXB0eQEBBTRCYWRSZWZlcmVuZHVtAQEFLE5vdGhpbmdUb0RvAQEFHE5vVHJhY2sBAQUoVW5maW5pc2hlZAEBBTBOb1Blcm1pc3Npb24BAQUkTm9EZXBvc2l0AQEFJEJhZFN0YXR1cwEBBUBQcmVpbWFnZU5vdEV4aXN0AQEFhFByZWltYWdlU3RvcmVkV2l0aERpZmZlcmVudExlbmd0aAEBBRxPcmlnaW5zAQEFJFdoaXRlbGlzdAECFExVbmF2YWlsYWJsZVByZUltYWdlAQEFPFVuZGVjb2RhYmxlQ2FsbAEBBWBJbnZhbGlkQ2FsbFdlaWdodFdpdG5lc3MBAQVQQ2FsbElzTm90V2hpdGVsaXN0ZWQBAQVYQ2FsbEFscmVhZHlXaGl0ZWxpc3RlZAEBBShQYXJhbWV0ZXJzAQEFGENsYWltcwECGGBJbnZhbGlkRXRoZXJldW1TaWduYXR1cmUBAQVAU2lnbmVySGFzTm9DbGFpbQEBBUBTZW5kZXJIYXNOb0NsYWltAQEFMFBvdFVuZGVyZmxvdwEBBUBJbnZhbGlkU3RhdGVtZW50AQEFTFZlc3RlZEJhbGFuY2VFeGlzdHMBAQUcVmVzdGluZwECFChOb3RWZXN0aW5nAQEFVEF0TWF4VmVzdGluZ1NjaGVkdWxlcwEBBSRBbW91bnRMb3cBAQVgU2NoZWR1bGVJbmRleE91dE9mQm91bmRzAQEFVEludmFsaWRTY2hlZHVsZVBhcmFtcwEBBRxVdGlsaXR5AQIEMFRvb01hbnlDYWxscwEBBRRQcm94eQECIBxUb29NYW55AQEFIE5vdEZvdW5kAQEFIE5vdFByb3h5AQEFLFVucHJveHlhYmxlAQEFJER1cGxpY2F0ZQEBBTBOb1Blcm1pc3Npb24BAQUsVW5hbm5vdW5jZWQBAQUsTm9TZWxmUHJveHkBAQUgTXVsdGlzaWcBAjhATWluaW11bVRocmVzaG9sZAEBBTxBbHJlYWR5QXBwcm92ZWQBAQVETm9BcHByb3ZhbHNOZWVkZWQBAQVEVG9vRmV3U2lnbmF0b3JpZXMBAQVIVG9vTWFueVNpZ25hdG9yaWVzAQEFVFNpZ25hdG9yaWVzT3V0T2ZPcmRlcgEBBUxTZW5kZXJJblNpZ25hdG9yaWVzAQEFIE5vdEZvdW5kAQEFIE5vdE93bmVyAQEFLE5vVGltZXBvaW50AQEFOFdyb25nVGltZXBvaW50AQEFTFVuZXhwZWN0ZWRUaW1lcG9pbnQBAQU8TWF4V2VpZ2h0VG9vTG93AQEFNEFscmVhZHlTdG9yZWQBAQUgQm91bnRpZXMBAixwSW5zdWZmaWNpZW50UHJvcG9zZXJzQmFsYW5jZQEBBTBJbnZhbGlkSW5kZXgBAQUwUmVhc29uVG9vQmlnAQEFQFVuZXhwZWN0ZWRTdGF0dXMBAQU4UmVxdWlyZUN1cmF0b3IBAQUwSW52YWxpZFZhbHVlAQEFKEludmFsaWRGZWUBAQU0UGVuZGluZ1BheW91dAEBBSRQcmVtYXR1cmUBAQVQSGFzQWN0aXZlQ2hpbGRCb3VudHkBAQU0VG9vTWFueVF1ZXVlZAEBBTRDaGlsZEJvdW50aWVzAQIMVFBhcmVudEJvdW50eU5vdEFjdGl2ZQEBBWRJbnN1ZmZpY2llbnRCb3VudHlCYWxhbmNlAQEFUFRvb01hbnlDaGlsZEJvdW50aWVzAQEFaEVsZWN0aW9uUHJvdmlkZXJNdWx0aVBoYXNlAQI8aFByZURpc3BhdGNoRWFybHlTdWJtaXNzaW9uAQEFbFByZURpc3BhdGNoV3JvbmdXaW5uZXJDb3VudAEBBWRQcmVEaXNwYXRjaFdlYWtTdWJtaXNzaW9uAQEFPFNpZ25lZFF1ZXVlRnVsbAEBBVhTaWduZWRDYW5ub3RQYXlEZXBvc2l0AQEFUFNpZ25lZEludmFsaWRXaXRuZXNzAQEFTFNpZ25lZFRvb011Y2hXZWlnaHQBAQU8T2N3Q2FsbFdyb25nRXJhAQEFXE1pc3NpbmdTbmFwc2hvdE1ldGFkYXRhAQEFWEludmFsaWRTdWJtaXNzaW9uSW5kZXgBAQU4Q2FsbE5vdEFsbG93ZWQBAQU4RmFsbGJhY2tGYWlsZWQBAQUsQm91bmROb3RNZXQBAQU4VG9vTWFueVdpbm5lcnMBAQVkUHJlRGlzcGF0Y2hEaWZmZXJlbnRSb3VuZAEBBSRWb3Rlckxpc3QBAgQQTGlzdAECECREdXBsaWNhdGUBAQUoTm90SGVhdmllcgEBBTBOb3RJblNhbWVCYWcBAQUwTm9kZU5vdEZvdW5kAQEFPE5vbWluYXRpb25Qb29scwECkDBQb29sTm90Rm91bmQBAQVIUG9vbE1lbWJlck5vdEZvdW5kAQEFSFJld2FyZFBvb2xOb3RGb3VuZAEBBUBTdWJQb29sc05vdEZvdW5kAQEFZEFjY291bnRCZWxvbmdzVG9PdGhlclBvb2wBAQU4RnVsbHlVbmJvbmRpbmcBAQVETWF4VW5ib25kaW5nTGltaXQBAQVEQ2Fubm90V2l0aGRyYXdBbnkBAQVETWluaW11bUJvbmROb3RNZXQBAQUwT3ZlcmZsb3dSaXNrAQEFNE5vdERlc3Ryb3lpbmcBAQUwTm90Tm9taW5hdG9yAQEFVE5vdEtpY2tlck9yRGVzdHJveWluZwEBBRxOb3RPcGVuAQEFIE1heFBvb2xzAQEFOE1heFBvb2xNZW1iZXJzAQEFRENhbk5vdENoYW5nZVN0YXRlAQEFVERvZXNOb3RIYXZlUGVybWlzc2lvbgEBBVRNZXRhZGF0YUV4Y2VlZHNNYXhMZW4BAQUkRGVmZW5zaXZlAQIcaE5vdEVub3VnaFNwYWNlSW5VbmJvbmRQb29sAQEFMFBvb2xOb3RGb3VuZAEBBUhSZXdhcmRQb29sTm90Rm91bmQBAQVAU3ViUG9vbHNOb3RGb3VuZAEBBXBCb25kZWRTdGFzaEtpbGxlZFByZW1hdHVyZWx5AQEFVERlbGVnYXRpb25VbnN1cHBvcnRlZAEBBTxTbGFzaE5vdEFwcGxpZWQBAQWcUGFydGlhbFVuYm9uZE5vdEFsbG93ZWRQZXJtaXNzaW9ubGVzc2x5AQEFXE1heENvbW1pc3Npb25SZXN0cmljdGVkAQEFYENvbW1pc3Npb25FeGNlZWRzTWF4aW11bQEBBXhDb21taXNzaW9uRXhjZWVkc0dsb2JhbE1heGltdW0BAQVkQ29tbWlzc2lvbkNoYW5nZVRocm90dGxlZAEBBXhDb21taXNzaW9uQ2hhbmdlUmF0ZU5vdEFsbG93ZWQBAQVMTm9QZW5kaW5nQ29tbWlzc2lvbgEBBVhOb0NvbW1pc3Npb25DdXJyZW50U2V0AQEFLFBvb2xJZEluVXNlAQEFNEludmFsaWRQb29sSWQBAQVMQm9uZEV4dHJhUmVzdHJpY3RlZAEBBTxOb3RoaW5nVG9BZGp1c3QBAQU4Tm90aGluZ1RvU2xhc2gBAQU8QWxyZWFkeU1pZ3JhdGVkAQEFLE5vdE1pZ3JhdGVkAQEFME5vdFN1cHBvcnRlZAEBBSxGYXN0VW5zdGFrZQECGDROb3RDb250cm9sbGVyAQEFNEFscmVhZHlRdWV1ZWQBAQU4Tm90RnVsbHlCb25kZWQBAQUkTm90UXVldWVkAQEFLEFscmVhZHlIZWFkAQEFOENhbGxOb3RBbGxvd2VkAQEFQFBhcmFjaGFpbnNPcmlnaW4BAQU0Q29uZmlndXJhdGlvbgECBDxJbnZhbGlkTmV3VmFsdWUBAQUsUGFyYXNTaGFyZWQBAQU0UGFyYUluY2x1c2lvbgECSGRWYWxpZGF0b3JJbmRleE91dE9mQm91bmRzAQEFUFVuc2NoZWR1bGVkQ2FuZGlkYXRlAQEFQEhlYWREYXRhVG9vTGFyZ2UBAQVQUHJlbWF0dXJlQ29kZVVwZ3JhZGUBAQU8TmV3Q29kZVRvb0xhcmdlAQEFVERpc2FsbG93ZWRSZWxheVBhcmVudAEBBURJbnZhbGlkQXNzaWdubWVudAEBBURJbnZhbGlkR3JvdXBJbmRleAEBBUxJbnN1ZmZpY2llbnRCYWNraW5nAQEFOEludmFsaWRCYWNraW5nAQEFRE5vdENvbGxhdG9yU2lnbmVkAQEFaFZhbGlkYXRpb25EYXRhSGFzaE1pc21hdGNoAQEFgEluY29ycmVjdERvd253YXJkTWVzc2FnZUhhbmRsaW5nAQEFVEludmFsaWRVcHdhcmRNZXNzYWdlcwEBBWBIcm1wV2F0ZXJtYXJrTWlzaGFuZGxpbmcBAQVMSW52YWxpZE91dGJvdW5kSHJtcAEBBWRJbnZhbGlkVmFsaWRhdGlvbkNvZGVIYXNoAQEFQFBhcmFIZWFkTWlzbWF0Y2gBAQUwUGFyYUluaGVyZW50AQIUZFRvb01hbnlJbmNsdXNpb25JbmhlcmVudHMBAQVMSW52YWxpZFBhcmVudEhlYWRlcgEBBUhJbmhlcmVudE92ZXJ3ZWlnaHQBAQWEQ2FuZGlkYXRlc0ZpbHRlcmVkRHVyaW5nRXhlY3V0aW9uAQEFUFVuc2NoZWR1bGVkQ2FuZGlkYXRlAQEFNFBhcmFTY2hlZHVsZXIBAQUUUGFyYXMBAjQ0Tm90UmVnaXN0ZXJlZAEBBTRDYW5ub3RPbmJvYXJkAQEFOENhbm5vdE9mZmJvYXJkAQEFNENhbm5vdFVwZ3JhZGUBAQU8Q2Fubm90RG93bmdyYWRlAQEFWFB2ZkNoZWNrU3RhdGVtZW50U3RhbGUBAQVcUHZmQ2hlY2tTdGF0ZW1lbnRGdXR1cmUBAQWEUHZmQ2hlY2tWYWxpZGF0b3JJbmRleE91dE9mQm91bmRzAQEFYFB2ZkNoZWNrSW52YWxpZFNpZ25hdHVyZQEBBUhQdmZDaGVja0RvdWJsZVZvdGUBAQVYUHZmQ2hlY2tTdWJqZWN0SW52YWxpZAEBBURDYW5ub3RVcGdyYWRlQ29kZQEBBSxJbnZhbGlkQ29kZQEBBSxJbml0aWFsaXplcgEBBQxEbXABAQUQSHJtcAECUFRPcGVuSHJtcENoYW5uZWxUb1NlbGYBAQV8T3BlbkhybXBDaGFubmVsSW52YWxpZFJlY2lwaWVudAEBBWxPcGVuSHJtcENoYW5uZWxaZXJvQ2FwYWNpdHkBAQWMT3BlbkhybXBDaGFubmVsQ2FwYWNpdHlFeGNlZWRzTGltaXQBAQV4T3BlbkhybXBDaGFubmVsWmVyb01lc3NhZ2VTaXplAQEFmE9wZW5Icm1wQ2hhbm5lbE1lc3NhZ2VTaXplRXhjZWVkc0xpbWl0AQEFcE9wZW5Icm1wQ2hhbm5lbEFscmVhZHlFeGlzdHMBAQV8T3BlbkhybXBDaGFubmVsQWxyZWFkeVJlcXVlc3RlZAEBBXBPcGVuSHJtcENoYW5uZWxMaW1pdEV4Y2VlZGVkAQEFcEFjY2VwdEhybXBDaGFubmVsRG9lc250RXhpc3QBAQWEQWNjZXB0SHJtcENoYW5uZWxBbHJlYWR5Q29uZmlybWVkAQEFeEFjY2VwdEhybXBDaGFubmVsTGltaXRFeGNlZWRlZAEBBXBDbG9zZUhybXBDaGFubmVsVW5hdXRob3JpemVkAQEFbENsb3NlSHJtcENoYW5uZWxEb2VzbnRFeGlzdAEBBXxDbG9zZUhybXBDaGFubmVsQWxyZWFkeVVuZGVyd2F5AQEFhENhbmNlbEhybXBPcGVuQ2hhbm5lbFVuYXV0aG9yaXplZAEBBWhPcGVuSHJtcENoYW5uZWxEb2VzbnRFeGlzdAEBBXxPcGVuSHJtcENoYW5uZWxBbHJlYWR5Q29uZmlybWVkAQEFMFdyb25nV2l0bmVzcwEBBXBDaGFubmVsQ3JlYXRpb25Ob3RBdXRob3JpemVkAQEFPFBhcmFTZXNzaW9uSW5mbwEBBTRQYXJhc0Rpc3B1dGVzAQIkdER1cGxpY2F0ZURpc3B1dGVTdGF0ZW1lbnRTZXRzAQEFXEFuY2llbnREaXNwdXRlU3RhdGVtZW50AQEFZFZhbGlkYXRvckluZGV4T3V0T2ZCb3VuZHMBAQVASW52YWxpZFNpZ25hdHVyZQEBBUhEdXBsaWNhdGVTdGF0ZW1lbnQBAQVIU2luZ2xlU2lkZWREaXNwdXRlAQEFPE1hbGljaW91c0JhY2tlcgEBBUxNaXNzaW5nQmFja2luZ1ZvdGVzAQEFSFVuY29uZmlybWVkRGlzcHV0ZQEBBTRQYXJhc1NsYXNoaW5nAQIYYEludmFsaWRLZXlPd25lcnNoaXBQcm9vZgEBBUxJbnZhbGlkU2Vzc2lvbkluZGV4AQEFUEludmFsaWRDYW5kaWRhdGVIYXNoAQEFVEludmFsaWRWYWxpZGF0b3JJbmRleAEBBWBWYWxpZGF0b3JJbmRleElkTWlzbWF0Y2gBAQVcRHVwbGljYXRlU2xhc2hpbmdSZXBvcnQBAQUgT25EZW1hbmQBAggkUXVldWVGdWxsAQEFcFNwb3RQcmljZUhpZ2hlclRoYW5NYXhBbW91bnQBAQVoQ29yZXRpbWVBc3NpZ25tZW50UHJvdmlkZXIBAhhAQXNzaWdubWVudHNFbXB0eQEBBTRPdmVyU2NoZWR1bGVkAQEFOFVuZGVyU2NoZWR1bGVkAQEFQERpc2FsbG93ZWRJbnNlcnQBAQU8RHVwbGljYXRlSW5zZXJ0AQEFUEFzc2lnbm1lbnRzTm90U29ydGVkAQEFJFJlZ2lzdHJhcgECODROb3RSZWdpc3RlcmVkAQEFREFscmVhZHlSZWdpc3RlcmVkAQEFIE5vdE93bmVyAQEFMENvZGVUb29MYXJnZQEBBUBIZWFkRGF0YVRvb0xhcmdlAQEFME5vdFBhcmFjaGFpbgEBBTROb3RQYXJhdGhyZWFkAQEFQENhbm5vdERlcmVnaXN0ZXIBAQU8Q2Fubm90RG93bmdyYWRlAQEFNENhbm5vdFVwZ3JhZGUBAQUoUGFyYUxvY2tlZAEBBSxOb3RSZXNlcnZlZAEBBSxJbnZhbGlkQ29kZQEBBShDYW5ub3RTd2FwAQEFFFNsb3RzAQIIRFBhcmFOb3RPbmJvYXJkaW5nAQEFKExlYXNlRXJyb3IBAQUgQXVjdGlvbnMBAhxEQXVjdGlvbkluUHJvZ3Jlc3MBAQVETGVhc2VQZXJpb2RJblBhc3QBAQVEUGFyYU5vdFJlZ2lzdGVyZWQBAQVETm90Q3VycmVudEF1Y3Rpb24BAQUoTm90QXVjdGlvbgEBBTBBdWN0aW9uRW5kZWQBAQVAQWxyZWFkeUxlYXNlZE91dAEBBSRDcm93ZGxvYW4BAlxERmlyc3RQZXJpb2RJblBhc3QBAQVkRmlyc3RQZXJpb2RUb29GYXJJbkZ1dHVyZQEBBWxMYXN0UGVyaW9kQmVmb3JlRmlyc3RQZXJpb2QBAQVgTGFzdFBlcmlvZFRvb0ZhckluRnV0dXJlAQEFPENhbm5vdEVuZEluUGFzdAEBBURFbmRUb29GYXJJbkZ1dHVyZQEBBSBPdmVyZmxvdwEBBVBDb250cmlidXRpb25Ub29TbWFsbAEBBTRJbnZhbGlkUGFyYUlkAQEFLENhcEV4Y2VlZGVkAQEFWENvbnRyaWJ1dGlvblBlcmlvZE92ZXIBAQU0SW52YWxpZE9yaWdpbgEBBTBOb3RQYXJhY2hhaW4BAQUsTGVhc2VBY3RpdmUBAQVAQmlkT3JMZWFzZUFjdGl2ZQEBBTBGdW5kTm90RW5kZWQBAQU8Tm9Db250cmlidXRpb25zAQEFSE5vdFJlYWR5VG9EaXNzb2x2ZQEBBUBJbnZhbGlkU2lnbmF0dXJlAQEFME1lbW9Ub29MYXJnZQEBBURBbHJlYWR5SW5OZXdSYWlzZQEBBUhWcmZEZWxheUluUHJvZ3Jlc3MBAQU0Tm9MZWFzZVBlcmlvZAEBBSBDb3JldGltZQECDCROb3RCcm9rZXIBAQVYUmVxdWVzdGVkRnV0dXJlUmV2ZW51ZQEBBUxBc3NldFRyYW5zZmVyRmFpbGVkAQEFSFN0YXRlVHJpZU1pZ3JhdGlvbgECGDxNYXhTaWduZWRMaW1pdHMBAQUoS2V5VG9vTG9uZwEBBThOb3RFbm91Z2hGdW5kcwEBBShCYWRXaXRuZXNzAQEFZFNpZ25lZE1pZ3JhdGlvbk5vdEFsbG93ZWQBAQUwQmFkQ2hpbGRSb290AQEFJFhjbVBhbGxldAECYCxVbnJlYWNoYWJsZQEBBSxTZW5kRmFpbHVyZQEBBSBGaWx0ZXJlZAEBBUhVbndlaWdoYWJsZU1lc3NhZ2UBAQVgRGVzdGluYXRpb25Ob3RJbnZlcnRpYmxlAQEFFEVtcHR5AQEFOENhbm5vdFJlYW5jaG9yAQEFNFRvb01hbnlBc3NldHMBAQU0SW52YWxpZE9yaWdpbgEBBShCYWRWZXJzaW9uAQEFLEJhZExvY2F0aW9uAQEFOE5vU3Vic2NyaXB0aW9uAQEFREFscmVhZHlTdWJzY3JpYmVkAQEFWENhbm5vdENoZWNrT3V0VGVsZXBvcnQBAQUoTG93QmFsYW5jZQEBBTBUb29NYW55TG9ja3MBAQVMQWNjb3VudE5vdFNvdmVyZWlnbgEBBShGZWVzTm90TWV0AQEFMExvY2tOb3RGb3VuZAEBBRRJblVzZQEBBWhJbnZhbGlkQXNzZXRVbmtub3duUmVzZXJ2ZQEBBXhJbnZhbGlkQXNzZXRVbnN1cHBvcnRlZFJlc2VydmUBAQU8VG9vTWFueVJlc2VydmVzAQEFYExvY2FsRXhlY3V0aW9uSW5jb21wbGV0ZQEBBTBNZXNzYWdlUXVldWUBAiQsTm90UmVhcGFibGUBAQUYTm9QYWdlAQEFJE5vTWVzc2FnZQEBBUBBbHJlYWR5UHJvY2Vzc2VkAQEFGFF1ZXVlZAEBBUhJbnN1ZmZpY2llbnRXZWlnaHQBAQVgVGVtcG9yYXJpbHlVbnByb2Nlc3NhYmxlAQEFLFF1ZXVlUGF1c2VkAQEFTFJlY3Vyc2l2ZURpc2FsbG93ZWQBAQUkQXNzZXRSYXRlAQIMQFVua25vd25Bc3NldEtpbmQBAQU0QWxyZWFkeUV4aXN0cwEBBSBPdmVyZmxvdwEBBRRCZWVmeQECEGBJbnZhbGlkS2V5T3duZXJzaGlwUHJvb2YBAQVgSW52YWxpZEVxdWl2b2NhdGlvblByb29mAQEFWER1cGxpY2F0ZU9mZmVuY2VSZXBvcnQBAQVQSW52YWxpZENvbmZpZ3VyYXRpb24BAQUMTW1yAQEFMEJlZWZ5TW1yTGVhZgEBBQIoQEZ1bmRzVW5hdmFpbGFibGUBAQUwT25seVByb3ZpZGVyAQEFMEJlbG93TWluaW11bQEBBTBDYW5ub3RDcmVhdGUBAQUwVW5rbm93bkFzc2V0AQEFGEZyb3plbgEBBSxVbnN1cHBvcnRlZAEBBUBDYW5ub3RDcmVhdGVIb2xkAQEFNE5vdEV4cGVuZGFibGUBAQUcQmxvY2tlZAEBBQIMJFVuZGVyZmxvdwEBBSBPdmVyZmxvdwEBBThEaXZpc2lvbkJ5WmVybwEBBQIIMExpbWl0UmVhY2hlZAEBBRxOb0xheWVyAQEFAjgUT3RoZXIBAQUwQ2Fubm90TG9va3VwAQEFJEJhZE9yaWdpbgEBBRhNb2R1bGUBAuwYU3lzdGVtAQIkPEludmFsaWRTcGVjTmFtZQEBBWhTcGVjVmVyc2lvbk5lZWRzVG9JbmNyZWFzZQEBBXRGYWlsZWRUb0V4dHJhY3RSdW50aW1lVmVyc2lvbgEBBUxOb25EZWZhdWx0Q29tcG9zaXRlAQEFPE5vblplcm9SZWZDb3VudAEBBTBDYWxsRmlsdGVyZWQBAQVsTXVsdGlCbG9ja01pZ3JhdGlvbnNPbmdvaW5nAQEFRE5vdGhpbmdBdXRob3JpemVkAQEFMFVuYXV0aG9yaXplZAEBBSRTY2hlZHVsZXIBAhRARmFpbGVkVG9TY2hlZHVsZQEBBSBOb3RGb3VuZAEBBVxUYXJnZXRCbG9ja051bWJlckluUGFzdAEBBUhSZXNjaGVkdWxlTm9DaGFuZ2UBAQUUTmFtZWQBAQUgUHJlaW1hZ2UBAiQYVG9vQmlnAQEFMEFscmVhZHlOb3RlZAEBBTROb3RBdXRob3JpemVkAQEFIE5vdE5vdGVkAQEFJFJlcXVlc3RlZAEBBTBOb3RSZXF1ZXN0ZWQBAQUcVG9vTWFueQEBBRhUb29GZXcBAQUYTm9Db3N0AQEFEEJhYmUBAhBgSW52YWxpZEVxdWl2b2NhdGlvblByb29mAQEFYEludmFsaWRLZXlPd25lcnNoaXBQcm9vZgEBBVhEdXBsaWNhdGVPZmZlbmNlUmVwb3J0AQEFUEludmFsaWRDb25maWd1cmF0aW9uAQEFJFRpbWVzdGFtcAEBBRxJbmRpY2VzAQIULE5vdEFzc2lnbmVkAQEFIE5vdE93bmVyAQEFFEluVXNlAQEFLE5vdFRyYW5zZmVyAQEFJFBlcm1hbmVudAEBBSBCYWxhbmNlcwECMDhWZXN0aW5nQmFsYW5jZQEBBVRMaXF1aWRpdHlSZXN0cmljdGlvbnMBAQVMSW5zdWZmaWNpZW50QmFsYW5jZQEBBUhFeGlzdGVudGlhbERlcG9zaXQBAQU0RXhwZW5kYWJpbGl0eQEBBVxFeGlzdGluZ1Zlc3RpbmdTY2hlZHVsZQEBBSxEZWFkQWNjb3VudAEBBTxUb29NYW55UmVzZXJ2ZXMBAQUwVG9vTWFueUhvbGRzAQEFOFRvb01hbnlGcmVlemVzAQEFTElzc3VhbmNlRGVhY3RpdmF0ZWQBAQUkRGVsdGFaZXJvAQEFSFRyYW5zYWN0aW9uUGF5bWVudAEBBShBdXRob3JzaGlwAQEFHFN0YWtpbmcBAnw0Tm90Q29udHJvbGxlcgEBBSBOb3RTdGFzaAEBBTRBbHJlYWR5Qm9uZGVkAQEFNEFscmVhZHlQYWlyZWQBAQUwRW1wdHlUYXJnZXRzAQEFOER1cGxpY2F0ZUluZGV4AQEFREludmFsaWRTbGFzaEluZGV4AQEFQEluc3VmZmljaWVudEJvbmQBAQUwTm9Nb3JlQ2h1bmtzAQEFNE5vVW5sb2NrQ2h1bmsBAQUwRnVuZGVkVGFyZ2V0AQEFSEludmFsaWRFcmFUb1Jld2FyZAEBBWhJbnZhbGlkTnVtYmVyT2ZOb21pbmF0aW9ucwEBBUhOb3RTb3J0ZWRBbmRVbmlxdWUBAQU4QWxyZWFkeUNsYWltZWQBAQUsSW52YWxpZFBhZ2UBAQVUSW5jb3JyZWN0SGlzdG9yeURlcHRoAQEFWEluY29ycmVjdFNsYXNoaW5nU3BhbnMBAQUgQmFkU3RhdGUBAQU4VG9vTWFueVRhcmdldHMBAQUkQmFkVGFyZ2V0AQEFQENhbm5vdENoaWxsT3RoZXIBAQVEVG9vTWFueU5vbWluYXRvcnMBAQVEVG9vTWFueVZhbGlkYXRvcnMBAQVAQ29tbWlzc2lvblRvb0xvdwEBBSxCb3VuZE5vdE1ldAEBBVBDb250cm9sbGVyRGVwcmVjYXRlZAEBBUxDYW5ub3RSZXN0b3JlTGVkZ2VyAQEFbFJld2FyZERlc3RpbmF0aW9uUmVzdHJpY3RlZAEBBThOb3RFbm91Z2hGdW5kcwEBBVxWaXJ0dWFsU3Rha2VyTm90QWxsb3dlZAEBBSBPZmZlbmNlcwEBBShIaXN0b3JpY2FsAQEFHFNlc3Npb24BAhQwSW52YWxpZFByb29mAQEFXE5vQXNzb2NpYXRlZFZhbGlkYXRvcklkAQEFNER1cGxpY2F0ZWRLZXkBAQUYTm9LZXlzAQEFJE5vQWNjb3VudAEBBRxHcmFuZHBhAQIcLFBhdXNlRmFpbGVkAQEFMFJlc3VtZUZhaWxlZAEBBTRDaGFuZ2VQZW5kaW5nAQEFHFRvb1Nvb24BAQVgSW52YWxpZEtleU93bmVyc2hpcFByb29mAQEFYEludmFsaWRFcXVpdm9jYXRpb25Qcm9vZgEBBVhEdXBsaWNhdGVPZmZlbmNlUmVwb3J0AQEFSEF1dGhvcml0eURpc2NvdmVyeQEBBSBUcmVhc3VyeQECLDBJbnZhbGlkSW5kZXgBAQVAVG9vTWFueUFwcHJvdmFscwEBBVhJbnN1ZmZpY2llbnRQZXJtaXNzaW9uAQEFTFByb3Bvc2FsTm90QXBwcm92ZWQBAQVYRmFpbGVkVG9Db252ZXJ0QmFsYW5jZQEBBTBTcGVuZEV4cGlyZWQBAQUsRWFybHlQYXlvdXQBAQVAQWxyZWFkeUF0dGVtcHRlZAEBBSxQYXlvdXRFcnJvcgEBBTBOb3RBdHRlbXB0ZWQBAQUwSW5jb25jbHVzaXZlAQEFQENvbnZpY3Rpb25Wb3RpbmcBAjAoTm90T25nb2luZwEBBSBOb3RWb3RlcgEBBTBOb1Blcm1pc3Npb24BAQU8Tm9QZXJtaXNzaW9uWWV0AQEFREFscmVhZHlEZWxlZ2F0aW5nAQEFNEFscmVhZHlWb3RpbmcBAQVESW5zdWZmaWNpZW50RnVuZHMBAQU0Tm90RGVsZWdhdGluZwEBBSBOb25zZW5zZQEBBTxNYXhWb3Rlc1JlYWNoZWQBAQUsQ2xhc3NOZWVkZWQBAQUgQmFkQ2xhc3MBAQUkUmVmZXJlbmRhAQI4KE5vdE9uZ29pbmcBAQUoSGFzRGVwb3NpdAEBBSBCYWRUcmFjawEBBRBGdWxsAQEFKFF1ZXVlRW1wdHkBAQU0QmFkUmVmZXJlbmR1bQEBBSxOb3RoaW5nVG9EbwEBBRxOb1RyYWNrAQEFKFVuZmluaXNoZWQBAQUwTm9QZXJtaXNzaW9uAQEFJE5vRGVwb3NpdAEBBSRCYWRTdGF0dXMBAQVAUHJlaW1hZ2VOb3RFeGlzdAEBBYRQcmVpbWFnZVN0b3JlZFdpdGhEaWZmZXJlbnRMZW5ndGgBAQUcT3JpZ2lucwEBBSRXaGl0ZWxpc3QBAhRMVW5hdmFpbGFibGVQcmVJbWFnZQEBBTxVbmRlY29kYWJsZUNhbGwBAQVgSW52YWxpZENhbGxXZWlnaHRXaXRuZXNzAQEFUENhbGxJc05vdFdoaXRlbGlzdGVkAQEFWENhbGxBbHJlYWR5V2hpdGVsaXN0ZWQBAQUoUGFyYW1ldGVycwEBBRhDbGFpbXMBAhhgSW52YWxpZEV0aGVyZXVtU2lnbmF0dXJlAQEFQFNpZ25lckhhc05vQ2xhaW0BAQVAU2VuZGVySGFzTm9DbGFpbQEBBTBQb3RVbmRlcmZsb3cBAQVASW52YWxpZFN0YXRlbWVudAEBBUxWZXN0ZWRCYWxhbmNlRXhpc3RzAQEFHFZlc3RpbmcBAhQoTm90VmVzdGluZwEBBVRBdE1heFZlc3RpbmdTY2hlZHVsZXMBAQUkQW1vdW50TG93AQEFYFNjaGVkdWxlSW5kZXhPdXRPZkJvdW5kcwEBBVRJbnZhbGlkU2NoZWR1bGVQYXJhbXMBAQUcVXRpbGl0eQECBDBUb29NYW55Q2FsbHMBAQUUUHJveHkBAiAcVG9vTWFueQEBBSBOb3RGb3VuZAEBBSBOb3RQcm94eQEBBSxVbnByb3h5YWJsZQEBBSREdXBsaWNhdGUBAQUwTm9QZXJtaXNzaW9uAQEFLFVuYW5ub3VuY2VkAQEFLE5vU2VsZlByb3h5AQEFIE11bHRpc2lnAQI4QE1pbmltdW1UaHJlc2hvbGQBAQU8QWxyZWFkeUFwcHJvdmVkAQEFRE5vQXBwcm92YWxzTmVlZGVkAQEFRFRvb0Zld1NpZ25hdG9yaWVzAQEFSFRvb01hbnlTaWduYXRvcmllcwEBBVRTaWduYXRvcmllc091dE9mT3JkZXIBAQVMU2VuZGVySW5TaWduYXRvcmllcwEBBSBOb3RGb3VuZAEBBSBOb3RPd25lcgEBBSxOb1RpbWVwb2ludAEBBThXcm9uZ1RpbWVwb2ludAEBBUxVbmV4cGVjdGVkVGltZXBvaW50AQEFPE1heFdlaWdodFRvb0xvdwEBBTRBbHJlYWR5U3RvcmVkAQEFIEJvdW50aWVzAQIscEluc3VmZmljaWVudFByb3Bvc2Vyc0JhbGFuY2UBAQUwSW52YWxpZEluZGV4AQEFMFJlYXNvblRvb0JpZwEBBUBVbmV4cGVjdGVkU3RhdHVzAQEFOFJlcXVpcmVDdXJhdG9yAQEFMEludmFsaWRWYWx1ZQEBBShJbnZhbGlkRmVlAQEFNFBlbmRpbmdQYXlvdXQBAQUkUHJlbWF0dXJlAQEFUEhhc0FjdGl2ZUNoaWxkQm91bnR5AQEFNFRvb01hbnlRdWV1ZWQBAQU0Q2hpbGRCb3VudGllcwECDFRQYXJlbnRCb3VudHlOb3RBY3RpdmUBAQVkSW5zdWZmaWNpZW50Qm91bnR5QmFsYW5jZQEBBVBUb29NYW55Q2hpbGRCb3VudGllcwEBBWhFbGVjdGlvblByb3ZpZGVyTXVsdGlQaGFzZQECPGhQcmVEaXNwYXRjaEVhcmx5U3VibWlzc2lvbgEBBWxQcmVEaXNwYXRjaFdyb25nV2lubmVyQ291bnQBAQVkUHJlRGlzcGF0Y2hXZWFrU3VibWlzc2lvbgEBBTxTaWduZWRRdWV1ZUZ1bGwBAQVYU2lnbmVkQ2Fubm90UGF5RGVwb3NpdAEBBVBTaWduZWRJbnZhbGlkV2l0bmVzcwEBBUxTaWduZWRUb29NdWNoV2VpZ2h0AQEFPE9jd0NhbGxXcm9uZ0VyYQEBBVxNaXNzaW5nU25hcHNob3RNZXRhZGF0YQEBBVhJbnZhbGlkU3VibWlzc2lvbkluZGV4AQEFOENhbGxOb3RBbGxvd2VkAQEFOEZhbGxiYWNrRmFpbGVkAQEFLEJvdW5kTm90TWV0AQEFOFRvb01hbnlXaW5uZXJzAQEFZFByZURpc3BhdGNoRGlmZmVyZW50Um91bmQBAQUkVm90ZXJMaXN0AQIEEExpc3QBAhAkRHVwbGljYXRlAQEFKE5vdEhlYXZpZXIBAQUwTm90SW5TYW1lQmFnAQEFME5vZGVOb3RGb3VuZAEBBTxOb21pbmF0aW9uUG9vbHMBApAwUG9vbE5vdEZvdW5kAQEFSFBvb2xNZW1iZXJOb3RGb3VuZAEBBUhSZXdhcmRQb29sTm90Rm91bmQBAQVAU3ViUG9vbHNOb3RGb3VuZAEBBWRBY2NvdW50QmVsb25nc1RvT3RoZXJQb29sAQEFOEZ1bGx5VW5ib25kaW5nAQEFRE1heFVuYm9uZGluZ0xpbWl0AQEFRENhbm5vdFdpdGhkcmF3QW55AQEFRE1pbmltdW1Cb25kTm90TWV0AQEFME92ZXJmbG93UmlzawEBBTROb3REZXN0cm95aW5nAQEFME5vdE5vbWluYXRvcgEBBVROb3RLaWNrZXJPckRlc3Ryb3lpbmcBAQUcTm90T3BlbgEBBSBNYXhQb29scwEBBThNYXhQb29sTWVtYmVycwEBBURDYW5Ob3RDaGFuZ2VTdGF0ZQEBBVREb2VzTm90SGF2ZVBlcm1pc3Npb24BAQVUTWV0YWRhdGFFeGNlZWRzTWF4TGVuAQEFJERlZmVuc2l2ZQECHGhOb3RFbm91Z2hTcGFjZUluVW5ib25kUG9vbAEBBTBQb29sTm90Rm91bmQBAQVIUmV3YXJkUG9vbE5vdEZvdW5kAQEFQFN1YlBvb2xzTm90Rm91bmQBAQVwQm9uZGVkU3Rhc2hLaWxsZWRQcmVtYXR1cmVseQEBBVREZWxlZ2F0aW9uVW5zdXBwb3J0ZWQBAQU8U2xhc2hOb3RBcHBsaWVkAQEFnFBhcnRpYWxVbmJvbmROb3RBbGxvd2VkUGVybWlzc2lvbmxlc3NseQEBBVxNYXhDb21taXNzaW9uUmVzdHJpY3RlZAEBBWBDb21taXNzaW9uRXhjZWVkc01heGltdW0BAQV4Q29tbWlzc2lvbkV4Y2VlZHNHbG9iYWxNYXhpbXVtAQEFZENvbW1pc3Npb25DaGFuZ2VUaHJvdHRsZWQBAQV4Q29tbWlzc2lvbkNoYW5nZVJhdGVOb3RBbGxvd2VkAQEFTE5vUGVuZGluZ0NvbW1pc3Npb24BAQVYTm9Db21taXNzaW9uQ3VycmVudFNldAEBBSxQb29sSWRJblVzZQEBBTRJbnZhbGlkUG9vbElkAQEFTEJvbmRFeHRyYVJlc3RyaWN0ZWQBAQU8Tm90aGluZ1RvQWRqdXN0AQEFOE5vdGhpbmdUb1NsYXNoAQEFPEFscmVhZHlNaWdyYXRlZAEBBSxOb3RNaWdyYXRlZAEBBTBOb3RTdXBwb3J0ZWQBAQUsRmFzdFVuc3Rha2UBAhg0Tm90Q29udHJvbGxlcgEBBTRBbHJlYWR5UXVldWVkAQEFOE5vdEZ1bGx5Qm9uZGVkAQEFJE5vdFF1ZXVlZAEBBSxBbHJlYWR5SGVhZAEBBThDYWxsTm90QWxsb3dlZAEBBUBQYXJhY2hhaW5zT3JpZ2luAQEFNENvbmZpZ3VyYXRpb24BAgQ8SW52YWxpZE5ld1ZhbHVlAQEFLFBhcmFzU2hhcmVkAQEFNFBhcmFJbmNsdXNpb24BAkhkVmFsaWRhdG9ySW5kZXhPdXRPZkJvdW5kcwEBBVBVbnNjaGVkdWxlZENhbmRpZGF0ZQEBBUBIZWFkRGF0YVRvb0xhcmdlAQEFUFByZW1hdHVyZUNvZGVVcGdyYWRlAQEFPE5ld0NvZGVUb29MYXJnZQEBBVREaXNhbGxvd2VkUmVsYXlQYXJlbnQBAQVESW52YWxpZEFzc2lnbm1lbnQBAQVESW52YWxpZEdyb3VwSW5kZXgBAQVMSW5zdWZmaWNpZW50QmFja2luZwEBBThJbnZhbGlkQmFja2luZwEBBUROb3RDb2xsYXRvclNpZ25lZAEBBWhWYWxpZGF0aW9uRGF0YUhhc2hNaXNtYXRjaAEBBYBJbmNvcnJlY3REb3dud2FyZE1lc3NhZ2VIYW5kbGluZwEBBVRJbnZhbGlkVXB3YXJkTWVzc2FnZXMBAQVgSHJtcFdhdGVybWFya01pc2hhbmRsaW5nAQEFTEludmFsaWRPdXRib3VuZEhybXABAQVkSW52YWxpZFZhbGlkYXRpb25Db2RlSGFzaAEBBUBQYXJhSGVhZE1pc21hdGNoAQEFMFBhcmFJbmhlcmVudAECFGRUb29NYW55SW5jbHVzaW9uSW5oZXJlbnRzAQEFTEludmFsaWRQYXJlbnRIZWFkZXIBAQVISW5oZXJlbnRPdmVyd2VpZ2h0AQEFhENhbmRpZGF0ZXNGaWx0ZXJlZER1cmluZ0V4ZWN1dGlvbgEBBVBVbnNjaGVkdWxlZENhbmRpZGF0ZQEBBTRQYXJhU2NoZWR1bGVyAQEFFFBhcmFzAQI0NE5vdFJlZ2lzdGVyZWQBAQU0Q2Fubm90T25ib2FyZAEBBThDYW5ub3RPZmZib2FyZAEBBTRDYW5ub3RVcGdyYWRlAQEFPENhbm5vdERvd25ncmFkZQEBBVhQdmZDaGVja1N0YXRlbWVudFN0YWxlAQEFXFB2ZkNoZWNrU3RhdGVtZW50RnV0dXJlAQEFhFB2ZkNoZWNrVmFsaWRhdG9ySW5kZXhPdXRPZkJvdW5kcwEBBWBQdmZDaGVja0ludmFsaWRTaWduYXR1cmUBAQVIUHZmQ2hlY2tEb3VibGVWb3RlAQEFWFB2ZkNoZWNrU3ViamVjdEludmFsaWQBAQVEQ2Fubm90VXBncmFkZUNvZGUBAQUsSW52YWxpZENvZGUBAQUsSW5pdGlhbGl6ZXIBAQUMRG1wAQEFEEhybXABAlBUT3BlbkhybXBDaGFubmVsVG9TZWxmAQEFfE9wZW5Icm1wQ2hhbm5lbEludmFsaWRSZWNpcGllbnQBAQVsT3BlbkhybXBDaGFubmVsWmVyb0NhcGFjaXR5AQEFjE9wZW5Icm1wQ2hhbm5lbENhcGFjaXR5RXhjZWVkc0xpbWl0AQEFeE9wZW5Icm1wQ2hhbm5lbFplcm9NZXNzYWdlU2l6ZQEBBZhPcGVuSHJtcENoYW5uZWxNZXNzYWdlU2l6ZUV4Y2VlZHNMaW1pdAEBBXBPcGVuSHJtcENoYW5uZWxBbHJlYWR5RXhpc3RzAQEFfE9wZW5Icm1wQ2hhbm5lbEFscmVhZHlSZXF1ZXN0ZWQBAQVwT3BlbkhybXBDaGFubmVsTGltaXRFeGNlZWRlZAEBBXBBY2NlcHRIcm1wQ2hhbm5lbERvZXNudEV4aXN0AQEFhEFjY2VwdEhybXBDaGFubmVsQWxyZWFkeUNvbmZpcm1lZAEBBXhBY2NlcHRIcm1wQ2hhbm5lbExpbWl0RXhjZWVkZWQBAQVwQ2xvc2VIcm1wQ2hhbm5lbFVuYXV0aG9yaXplZAEBBWxDbG9zZUhybXBDaGFubmVsRG9lc250RXhpc3QBAQV8Q2xvc2VIcm1wQ2hhbm5lbEFscmVhZHlVbmRlcndheQEBBYRDYW5jZWxIcm1wT3BlbkNoYW5uZWxVbmF1dGhvcml6ZWQBAQVoT3BlbkhybXBDaGFubmVsRG9lc250RXhpc3QBAQV8T3BlbkhybXBDaGFubmVsQWxyZWFkeUNvbmZpcm1lZAEBBTBXcm9uZ1dpdG5lc3MBAQVwQ2hhbm5lbENyZWF0aW9uTm90QXV0aG9yaXplZAEBBTxQYXJhU2Vzc2lvbkluZm8BAQU0UGFyYXNEaXNwdXRlcwECJHREdXBsaWNhdGVEaXNwdXRlU3RhdGVtZW50U2V0cwEBBVxBbmNpZW50RGlzcHV0ZVN0YXRlbWVudAEBBWRWYWxpZGF0b3JJbmRleE91dE9mQm91bmRzAQEFQEludmFsaWRTaWduYXR1cmUBAQVIRHVwbGljYXRlU3RhdGVtZW50AQEFSFNpbmdsZVNpZGVkRGlzcHV0ZQEBBTxNYWxpY2lvdXNCYWNrZXIBAQVMTWlzc2luZ0JhY2tpbmdWb3RlcwEBBUhVbmNvbmZpcm1lZERpc3B1dGUBAQU0UGFyYXNTbGFzaGluZwECGGBJbnZhbGlkS2V5T3duZXJzaGlwUHJvb2YBAQVMSW52YWxpZFNlc3Npb25JbmRleAEBBVBJbnZhbGlkQ2FuZGlkYXRlSGFzaAEBBVRJbnZhbGlkVmFsaWRhdG9ySW5kZXgBAQVgVmFsaWRhdG9ySW5kZXhJZE1pc21hdGNoAQEFXER1cGxpY2F0ZVNsYXNoaW5nUmVwb3J0AQEFIE9uRGVtYW5kAQIIJFF1ZXVlRnVsbAEBBXBTcG90UHJpY2VIaWdoZXJUaGFuTWF4QW1vdW50AQEFaENvcmV0aW1lQXNzaWdubWVudFByb3ZpZGVyAQIYQEFzc2lnbm1lbnRzRW1wdHkBAQU0T3ZlclNjaGVkdWxlZAEBBThVbmRlclNjaGVkdWxlZAEBBUBEaXNhbGxvd2VkSW5zZXJ0AQEFPER1cGxpY2F0ZUluc2VydAEBBVBBc3NpZ25tZW50c05vdFNvcnRlZAEBBSRSZWdpc3RyYXIBAjg0Tm90UmVnaXN0ZXJlZAEBBURBbHJlYWR5UmVnaXN0ZXJlZAEBBSBOb3RPd25lcgEBBTBDb2RlVG9vTGFyZ2UBAQVASGVhZERhdGFUb29MYXJnZQEBBTBOb3RQYXJhY2hhaW4BAQU0Tm90UGFyYXRocmVhZAEBBUBDYW5ub3REZXJlZ2lzdGVyAQEFPENhbm5vdERvd25ncmFkZQEBBTRDYW5ub3RVcGdyYWRlAQEFKFBhcmFMb2NrZWQBAQUsTm90UmVzZXJ2ZWQBAQUsSW52YWxpZENvZGUBAQUoQ2Fubm90U3dhcAEBBRRTbG90cwECCERQYXJhTm90T25ib2FyZGluZwEBBShMZWFzZUVycm9yAQEFIEF1Y3Rpb25zAQIcREF1Y3Rpb25JblByb2dyZXNzAQEFRExlYXNlUGVyaW9kSW5QYXN0AQEFRFBhcmFOb3RSZWdpc3RlcmVkAQEFRE5vdEN1cnJlbnRBdWN0aW9uAQEFKE5vdEF1Y3Rpb24BAQUwQXVjdGlvbkVuZGVkAQEFQEFscmVhZHlMZWFzZWRPdXQBAQUkQ3Jvd2Rsb2FuAQJcREZpcnN0UGVyaW9kSW5QYXN0AQEFZEZpcnN0UGVyaW9kVG9vRmFySW5GdXR1cmUBAQVsTGFzdFBlcmlvZEJlZm9yZUZpcnN0UGVyaW9kAQEFYExhc3RQZXJpb2RUb29GYXJJbkZ1dHVyZQEBBTxDYW5ub3RFbmRJblBhc3QBAQVERW5kVG9vRmFySW5GdXR1cmUBAQUgT3ZlcmZsb3cBAQVQQ29udHJpYnV0aW9uVG9vU21hbGwBAQU0SW52YWxpZFBhcmFJZAEBBSxDYXBFeGNlZWRlZAEBBVhDb250cmlidXRpb25QZXJpb2RPdmVyAQEFNEludmFsaWRPcmlnaW4BAQUwTm90UGFyYWNoYWluAQEFLExlYXNlQWN0aXZlAQEFQEJpZE9yTGVhc2VBY3RpdmUBAQUwRnVuZE5vdEVuZGVkAQEFPE5vQ29udHJpYnV0aW9ucwEBBUhOb3RSZWFkeVRvRGlzc29sdmUBAQVASW52YWxpZFNpZ25hdHVyZQEBBTBNZW1vVG9vTGFyZ2UBAQVEQWxyZWFkeUluTmV3UmFpc2UBAQVIVnJmRGVsYXlJblByb2dyZXNzAQEFNE5vTGVhc2VQZXJpb2QBAQUgQ29yZXRpbWUBAgwkTm90QnJva2VyAQEFWFJlcXVlc3RlZEZ1dHVyZVJldmVudWUBAQVMQXNzZXRUcmFuc2ZlckZhaWxlZAEBBUhTdGF0ZVRyaWVNaWdyYXRpb24BAhg8TWF4U2lnbmVkTGltaXRzAQEFKEtleVRvb0xvbmcBAQU4Tm90RW5vdWdoRnVuZHMBAQUoQmFkV2l0bmVzcwEBBWRTaWduZWRNaWdyYXRpb25Ob3RBbGxvd2VkAQEFMEJhZENoaWxkUm9vdAEBBSRYY21QYWxsZXQBAmAsVW5yZWFjaGFibGUBAQUsU2VuZEZhaWx1cmUBAQUgRmlsdGVyZWQBAQVIVW53ZWlnaGFibGVNZXNzYWdlAQEFYERlc3RpbmF0aW9uTm90SW52ZXJ0aWJsZQEBBRRFbXB0eQEBBThDYW5ub3RSZWFuY2hvcgEBBTRUb29NYW55QXNzZXRzAQEFNEludmFsaWRPcmlnaW4BAQUoQmFkVmVyc2lvbgEBBSxCYWRMb2NhdGlvbgEBBThOb1N1YnNjcmlwdGlvbgEBBURBbHJlYWR5U3Vic2NyaWJlZAEBBVhDYW5ub3RDaGVja091dFRlbGVwb3J0AQEFKExvd0JhbGFuY2UBAQUwVG9vTWFueUxvY2tzAQEFTEFjY291bnROb3RTb3ZlcmVpZ24BAQUoRmVlc05vdE1ldAEBBTBMb2NrTm90Rm91bmQBAQUUSW5Vc2UBAQVoSW52YWxpZEFzc2V0VW5rbm93blJlc2VydmUBAQV4SW52YWxpZEFzc2V0VW5zdXBwb3J0ZWRSZXNlcnZlAQEFPFRvb01hbnlSZXNlcnZlcwEBBWBMb2NhbEV4ZWN1dGlvbkluY29tcGxldGUBAQUwTWVzc2FnZVF1ZXVlAQIkLE5vdFJlYXBhYmxlAQEFGE5vUGFnZQEBBSROb01lc3NhZ2UBAQVAQWxyZWFkeVByb2Nlc3NlZAEBBRhRdWV1ZWQBAQVISW5zdWZmaWNpZW50V2VpZ2h0AQEFYFRlbXBvcmFyaWx5VW5wcm9jZXNzYWJsZQEBBSxRdWV1ZVBhdXNlZAEBBUxSZWN1cnNpdmVEaXNhbGxvd2VkAQEFJEFzc2V0UmF0ZQECDEBVbmtub3duQXNzZXRLaW5kAQEFNEFscmVhZHlFeGlzdHMBAQUgT3ZlcmZsb3cBAQUUQmVlZnkBAhBgSW52YWxpZEtleU93bmVyc2hpcFByb29mAQEFYEludmFsaWRFcXVpdm9jYXRpb25Qcm9vZgEBBVhEdXBsaWNhdGVPZmZlbmNlUmVwb3J0AQEFUEludmFsaWRDb25maWd1cmF0aW9uAQEFDE1tcgEBBTBCZWVmeU1tckxlYWYBAQVEQ29uc3VtZXJSZW1haW5pbmcBAQUsTm9Qcm92aWRlcnMBAQVAVG9vTWFueUNvbnN1bWVycwEBBRRUb2tlbgECKEBGdW5kc1VuYXZhaWxhYmxlAQEFME9ubHlQcm92aWRlcgEBBTBCZWxvd01pbmltdW0BAQUwQ2Fubm90Q3JlYXRlAQEFMFVua25vd25Bc3NldAEBBRhGcm96ZW4BAQUsVW5zdXBwb3J0ZWQBAQVAQ2Fubm90Q3JlYXRlSG9sZAEBBTROb3RFeHBlbmRhYmxlAQEFHEJsb2NrZWQBAQUoQXJpdGhtZXRpYwECDCRVbmRlcmZsb3cBAQUgT3ZlcmZsb3cBAQU4RGl2aXNpb25CeVplcm8BAQU0VHJhbnNhY3Rpb25hbAECCDBMaW1pdFJlYWNoZWQBAQUcTm9MYXllcgEBBSRFeGhhdXN0ZWQBAQUoQ29ycnVwdGlvbgEBBSxVbmF2YWlsYWJsZQEBBThSb290Tm90QWxsb3dlZAEBBQIcQEV4dHJpbnNpY1N1Y2Nlc3MBAAQ0ZGlzcGF0Y2hfaW5mb0A8RXh0cmluc2ljRmFpbGVkAQAIOGRpc3BhdGNoX2Vycm9yBQE0ZGlzcGF0Y2hfaW5mb0AsQ29kZVVwZGF0ZWQBAQUoTmV3QWNjb3VudAEABBxhY2NvdW50ADRLaWxsZWRBY2NvdW50AQAEHGFjY291bnQAIFJlbWFya2VkAQAIGHNlbmRlcgAQaGFzaCBEVXBncmFkZUF1dGhvcml6ZWQBAAgkY29kZV9oYXNoIDRjaGVja192ZXJzaW9uFAQEAQgGIAEFBxUBBQECJCRTY2hlZHVsZWQBAAgQd2hlbgQUaW5kZXgEIENhbmNlbGVkAQAIEHdoZW4EFGluZGV4BChEaXNwYXRjaGVkAQAMEHRhc2sNAQhpZBEBGHJlc3VsdBkBIFJldHJ5U2V0AQAQEHRhc2sNAQhpZBEBGHBlcmlvZAQccmV0cmllcwQ4UmV0cnlDYW5jZWxsZWQBAAgQdGFzaw0BCGlkEQE8Q2FsbFVuYXZhaWxhYmxlAQAIEHRhc2sNAQhpZBEBOFBlcmlvZGljRmFpbGVkAQAIEHRhc2sNAQhpZBEBLFJldHJ5RmFpbGVkAQAIEHRhc2sNAQhpZBEBVFBlcm1hbmVudGx5T3ZlcndlaWdodAEACBB0YXNrDQEIaWQRAQIMFE5vdGVkAQAEEGhhc2ggJFJlcXVlc3RlZAEABBBoYXNoIBxDbGVhcmVkAQAEEGhhc2ggAgw0SW5kZXhBc3NpZ25lZAEACAx3aG8AFGluZGV4BChJbmRleEZyZWVkAQAEFGluZGV4BCxJbmRleEZyb3plbgEACBRpbmRleAQMd2hvAAIIEEZyZWUBAQUgUmVzZXJ2ZWQBAQUCWBxFbmRvd2VkAQAIHGFjY291bnQAMGZyZWVfYmFsYW5jZQggRHVzdExvc3QBAAgcYWNjb3VudAAYYW1vdW50CCBUcmFuc2ZlcgEADBBmcm9tAAh0bwAYYW1vdW50CChCYWxhbmNlU2V0AQAIDHdobwAQZnJlZQggUmVzZXJ2ZWQBAAgMd2hvABhhbW91bnQIKFVucmVzZXJ2ZWQBAAgMd2hvABhhbW91bnQISFJlc2VydmVSZXBhdHJpYXRlZAEAEBBmcm9tAAh0bwAYYW1vdW50CEhkZXN0aW5hdGlvbl9zdGF0dXMpARxEZXBvc2l0AQAIDHdobwAYYW1vdW50CCBXaXRoZHJhdwEACAx3aG8AGGFtb3VudAgcU2xhc2hlZAEACAx3aG8AGGFtb3VudAgYTWludGVkAQAIDHdobwAYYW1vdW50CBhCdXJuZWQBAAgMd2hvABhhbW91bnQIJFN1c3BlbmRlZAEACAx3aG8AGGFtb3VudAggUmVzdG9yZWQBAAgMd2hvABhhbW91bnQIIFVwZ3JhZGVkAQAEDHdobwAYSXNzdWVkAQAEGGFtb3VudAgkUmVzY2luZGVkAQAEGGFtb3VudAgYTG9ja2VkAQAIDHdobwAYYW1vdW50CCBVbmxvY2tlZAEACAx3aG8AGGFtb3VudAgYRnJvemVuAQAIDHdobwAYYW1vdW50CBhUaGF3ZWQBAAgMd2hvABhhbW91bnQITFRvdGFsSXNzdWFuY2VGb3JjZWQBAAgMb2xkCAxuZXcIAgRIVHJhbnNhY3Rpb25GZWVQYWlkAQAMDHdobwAoYWN0dWFsX2ZlZQgMdGlwCAIUGFN0YWtlZAEBBRRTdGFzaAEBBShDb250cm9sbGVyAQEFHEFjY291bnQBAQEQTm9uZQEBBQAIKGNvbW1pc3Npb24EHGJsb2NrZWQUAhAoTm90Rm9yY2luZwEBBSBGb3JjZU5ldwEBBSRGb3JjZU5vbmUBAQUsRm9yY2VBbHdheXMBAQUCSBxFcmFQYWlkAQAMJGVyYV9pbmRleARAdmFsaWRhdG9yX3BheW91dAgkcmVtYWluZGVyCCBSZXdhcmRlZAEADBRzdGFzaAAQZGVzdDUBGGFtb3VudAgcU2xhc2hlZAEACBhzdGFrZXIAGGFtb3VudAg0U2xhc2hSZXBvcnRlZAEADCR2YWxpZGF0b3IAIGZyYWN0aW9uBCRzbGFzaF9lcmEEaE9sZFNsYXNoaW5nUmVwb3J0RGlzY2FyZGVkAQAENHNlc3Npb25faW5kZXgEOFN0YWtlcnNFbGVjdGVkAQEFGEJvbmRlZAEACBRzdGFzaAAYYW1vdW50CCBVbmJvbmRlZAEACBRzdGFzaAAYYW1vdW50CCRXaXRoZHJhd24BAAgUc3Rhc2gAGGFtb3VudAgYS2lja2VkAQAIJG5vbWluYXRvcgAUc3Rhc2gAVFN0YWtpbmdFbGVjdGlvbkZhaWxlZAEBBRxDaGlsbGVkAQAEFHN0YXNoADRQYXlvdXRTdGFydGVkAQAIJGVyYV9pbmRleAQ8dmFsaWRhdG9yX3N0YXNoAERWYWxpZGF0b3JQcmVmc1NldAEACBRzdGFzaAAUcHJlZnM5AWhTbmFwc2hvdFZvdGVyc1NpemVFeGNlZWRlZAEABBBzaXplBGxTbmFwc2hvdFRhcmdldHNTaXplRXhjZWVkZWQBAAQQc2l6ZQQgRm9yY2VFcmEBAAQQbW9kZT0BZENvbnRyb2xsZXJCYXRjaERlcHJlY2F0ZWQBAAQgZmFpbHVyZXMEBQFAAgQcT2ZmZW5jZQEACBBraW5kRQEgdGltZXNsb3QkAgQoTmV3U2Vzc2lvbgEABDRzZXNzaW9uX2luZGV4BAMIIAgEUQEAAgw4TmV3QXV0aG9yaXRpZXMBAAQ0YXV0aG9yaXR5X3NldFUBGFBhdXNlZAEBBRxSZXN1bWVkAQEFAiwkQnlHZW5lc2lzAQUBgBhCeUZvcmsBAAgwYmxvY2tfbnVtYmVyCChibG9ja19oYXNoICBQb2xrYWRvdAEBBRhLdXNhbWEBAQUcV2VzdGVuZAEBBRhSb2NvY28BAQUYV29jb2NvAQEFIEV0aGVyZXVtAQAEIGNoYWluX2lkCCxCaXRjb2luQ29yZQEBBSxCaXRjb2luQ2FzaAEBBUBQb2xrYWRvdEJ1bGxldGluAQEFBl0BBQFQAigQVW5pdAEBBRxNb25pa2VyAQUBEBRJbmRleAEBAiRFeGVjdXRpdmUBAQUkVGVjaG5pY2FsAQEFLExlZ2lzbGF0aXZlAQEFIEp1ZGljaWFsAQEFHERlZmVuc2UBAQU4QWRtaW5pc3RyYXRpb24BAQUgVHJlYXN1cnkBAQUCFBRWb2ljZQEBBRxNZW1iZXJzAQAEFGNvdW50BCBGcmFjdGlvbgEACAxub20EFGRlbm9tBERBdExlYXN0UHJvcG9ydGlvbgEACAxub20EFGRlbm9tBEhNb3JlVGhhblByb3BvcnRpb24BAAgMbm9tBBRkZW5vbQQCKCRQYXJhY2hhaW4BAQIsQWNjb3VudElkMzIBAAgcbmV0d29ya2EBCGlkIDhBY2NvdW50SW5kZXg2NAEACBxuZXR3b3JrYQEUaW5kZXgIMEFjY291bnRLZXkyMAEACBxuZXR3b3JrYQEMa2V5ZQE4UGFsbGV0SW5zdGFuY2UBAQIwR2VuZXJhbEluZGV4AQEDKEdlbmVyYWxLZXkBAAgYbGVuZ3RoBBBkYXRhICRPbmx5Q2hpbGQBAQUkUGx1cmFsaXR5AQAICGlkaQEQcGFydG0BPEdsb2JhbENvbnNlbnN1cwECLCRCeUdlbmVzaXMBBQGAGEJ5Rm9yawEACDBibG9ja19udW1iZXIIKGJsb2NrX2hhc2ggIFBvbGthZG90AQEFGEt1c2FtYQEBBRxXZXN0ZW5kAQEFGFJvY29jbwEBBRhXb2NvY28BAQUgRXRoZXJldW0BAAQgY2hhaW5faWQILEJpdGNvaW5Db3JlAQEFLEJpdGNvaW5DYXNoAQEFQFBvbGthZG90QnVsbGV0aW4BAQUCJBBIZXJlAQEFCFgxAQIoJFBhcmFjaGFpbgEBAixBY2NvdW50SWQzMgEACBxuZXR3b3JrYQEIaWQgOEFjY291bnRJbmRleDY0AQAIHG5ldHdvcmthARRpbmRleAgwQWNjb3VudEtleTIwAQAIHG5ldHdvcmthAQxrZXllAThQYWxsZXRJbnN0YW5jZQEBAjBHZW5lcmFsSW5kZXgBAQMoR2VuZXJhbEtleQEACBhsZW5ndGgEEGRhdGEgJE9ubHlDaGlsZAEBBSRQbHVyYWxpdHkBAAgIaWRpARBwYXJ0bQE8R2xvYmFsQ29uc2Vuc3VzAQIsJEJ5R2VuZXNpcwEFAYAYQnlGb3JrAQAIMGJsb2NrX251bWJlcggoYmxvY2tfaGFzaCAgUG9sa2Fkb3QBAQUYS3VzYW1hAQEFHFdlc3RlbmQBAQUYUm9jb2NvAQEFGFdvY29jbwEBBSBFdGhlcmV1bQEABCBjaGFpbl9pZAgsQml0Y29pbkNvcmUBAQUsQml0Y29pbkNhc2gBAQVAUG9sa2Fkb3RCdWxsZXRpbgEBBQhYMgEEcQEBCAhYMwEEcQEBDAhYNAEEcQEBEAhYNQEEcQEBFAhYNgEEcQEBGAhYNwEEcQEBHAhYOAEEcQEBIAAIHHBhcmVudHMEIGludGVyaW9ydQECCCBDb25jcmV0ZQEACBxwYXJlbnRzBCBpbnRlcmlvcnUBIEFic3RyYWN0AQUBgAIICFYzAQAIIGxvY2F0aW9ueQEgYXNzZXRfaWR9AQhWNAEACCBsb2NhdGlvbnkBIGFzc2V0X2lkeQECEAxBbnkBAQUUTmFtZWQBBQAgUG9sa2Fkb3QBAQUYS3VzYW1hAQEFAigQVW5pdAEBBRROYW1lZAEFABRJbmRleAEBAiRFeGVjdXRpdmUBAQUkVGVjaG5pY2FsAQEFLExlZ2lzbGF0aXZlAQEFIEp1ZGljaWFsAQEFHERlZmVuc2UBAQU4QWRtaW5pc3RyYXRpb24BAQUgVHJlYXN1cnkBAQUCJCRQYXJhY2hhaW4BAQIsQWNjb3VudElkMzIBAAgcbmV0d29ya4UBCGlkIDhBY2NvdW50SW5kZXg2NAEACBxuZXR3b3JrhQEUaW5kZXgIMEFjY291bnRLZXkyMAEACBxuZXR3b3JrhQEMa2V5ZQE4UGFsbGV0SW5zdGFuY2UBAQIwR2VuZXJhbEluZGV4AQEDKEdlbmVyYWxLZXkBBQAkT25seUNoaWxkAQEFJFBsdXJhbGl0eQEACAhpZIkBEHBhcnRtAQIkEEhlcmUBAQUIWDEBAiQkUGFyYWNoYWluAQECLEFjY291bnRJZDMyAQAIHG5ldHdvcmuFAQhpZCA4QWNjb3VudEluZGV4NjQBAAgcbmV0d29ya4UBFGluZGV4CDBBY2NvdW50S2V5MjABAAgcbmV0d29ya4UBDGtleWUBOFBhbGxldEluc3RhbmNlAQECMEdlbmVyYWxJbmRleAEBAyhHZW5lcmFsS2V5AQUAJE9ubHlDaGlsZAEBBSRQbHVyYWxpdHkBAAgIaWSJARBwYXJ0bQEIWDIBBI0BAQgIWDMBBI0BAQwIWDQBBI0BARAIWDUBBI0BARQIWDYBBI0BARgIWDcBBI0BARwIWDgBBI0BASAACBxwYXJlbnRzBCBpbnRlcmlvcpEBAgwIVjIBAAgccGFyZW50cwQgaW50ZXJpb3KRAQhWMwEACBxwYXJlbnRzBCBpbnRlcmlvcnUBCFY0AQAIHHBhcmVudHMEIGludGVyaW9ydQECMCBTcGVuZGluZwEABEBidWRnZXRfcmVtYWluaW5nCBxBd2FyZGVkAQAMOHByb3Bvc2FsX2luZGV4BBRhd2FyZAgcYWNjb3VudAAUQnVybnQBAAQsYnVybnRfZnVuZHMIIFJvbGxvdmVyAQAEQHJvbGxvdmVyX2JhbGFuY2UIHERlcG9zaXQBAAQUdmFsdWUINFNwZW5kQXBwcm92ZWQBAAw4cHJvcG9zYWxfaW5kZXgEGGFtb3VudAgsYmVuZWZpY2lhcnkAPFVwZGF0ZWRJbmFjdGl2ZQEACCxyZWFjdGl2YXRlZAgsZGVhY3RpdmF0ZWQISEFzc2V0U3BlbmRBcHByb3ZlZAEAGBRpbmRleAQoYXNzZXRfa2luZIEBGGFtb3VudAgsYmVuZWZpY2lhcnmZASh2YWxpZF9mcm9tBCRleHBpcmVfYXQEQEFzc2V0U3BlbmRWb2lkZWQBAAQUaW5kZXgEEFBhaWQBAAgUaW5kZXgEKHBheW1lbnRfaWQINFBheW1lbnRGYWlsZWQBAAgUaW5kZXgEKHBheW1lbnRfaWQIOFNwZW5kUHJvY2Vzc2VkAQAEFGluZGV4BAIIJERlbGVnYXRlZAEEAAEILFVuZGVsZWdhdGVkAQEBAgwYTGVnYWN5AQAEEGhhc2ggGElubGluZQEFABhMb29rdXABAAgQaGFzaCAMbGVuBAAMEGF5ZXMIEG5heXMIHHN1cHBvcnQIAkAkU3VibWl0dGVkAQAMFGluZGV4BBR0cmFjawQgcHJvcG9zYWylAVREZWNpc2lvbkRlcG9zaXRQbGFjZWQBAAwUaW5kZXgEDHdobwAYYW1vdW50CFxEZWNpc2lvbkRlcG9zaXRSZWZ1bmRlZAEADBRpbmRleAQMd2hvABhhbW91bnQIOERlcG9zaXRTbGFzaGVkAQAIDHdobwAYYW1vdW50CDxEZWNpc2lvblN0YXJ0ZWQBABAUaW5kZXgEFHRyYWNrBCBwcm9wb3NhbKUBFHRhbGx5qQE4Q29uZmlybVN0YXJ0ZWQBAAQUaW5kZXgEOENvbmZpcm1BYm9ydGVkAQAEFGluZGV4BCRDb25maXJtZWQBAAgUaW5kZXgEFHRhbGx5qQEgQXBwcm92ZWQBAAQUaW5kZXgEIFJlamVjdGVkAQAIFGluZGV4BBR0YWxseakBIFRpbWVkT3V0AQAIFGluZGV4BBR0YWxseakBJENhbmNlbGxlZAEACBRpbmRleAQUdGFsbHmpARhLaWxsZWQBAAgUaW5kZXgEFHRhbGx5qQFkU3VibWlzc2lvbkRlcG9zaXRSZWZ1bmRlZAEADBRpbmRleAQMd2hvABhhbW91bnQILE1ldGFkYXRhU2V0AQAIFGluZGV4BBBoYXNoIDxNZXRhZGF0YUNsZWFyZWQBAAgUaW5kZXgEEGhhc2ggBhgACDRhY3R1YWxfd2VpZ2h0sQEgcGF5c19mZWU8AAgkcG9zdF9pbmZvtQEUZXJyb3IFAQe1AbkBAgw8Q2FsbFdoaXRlbGlzdGVkAQAEJGNhbGxfaGFzaCBYV2hpdGVsaXN0ZWRDYWxsUmVtb3ZlZAEABCRjYWxsX2hhc2ggZFdoaXRlbGlzdGVkQ2FsbERpc3BhdGNoZWQBAAgkY2FsbF9oYXNoIBhyZXN1bHS9AQIUME1pbkluZmxhdGlvbgEBBTBNYXhJbmZsYXRpb24BAQUoSWRlYWxTdGFrZQEBBRxGYWxsb2ZmAQEFPFVzZUF1Y3Rpb25TbG90cwEBBQIEJEluZmxhdGlvbgECFDBNaW5JbmZsYXRpb24BAQUwTWF4SW5mbGF0aW9uAQEFKElkZWFsU3Rha2UBAQUcRmFsbG9mZgEBBTxVc2VBdWN0aW9uU2xvdHMBAQUCFDBNaW5JbmZsYXRpb24BAQMwTWF4SW5mbGF0aW9uAQEDKElkZWFsU3Rha2UBAQMcRmFsbG9mZgEBAzxVc2VBdWN0aW9uU2xvdHMBAQACBCRJbmZsYXRpb24BAhQwTWluSW5mbGF0aW9uAQEDME1heEluZmxhdGlvbgEBAyhJZGVhbFN0YWtlAQEDHEZhbGxvZmYBAQM8VXNlQXVjdGlvblNsb3RzAQEABtEBAgQcVXBkYXRlZAEADAxrZXnJASRvbGRfdmFsdWXVASRuZXdfdmFsdWXVAQIEHENsYWltZWQBAAwMd2hvAEBldGhlcmV1bV9hZGRyZXNzZQEYYW1vdW50CAIIOFZlc3RpbmdVcGRhdGVkAQAIHGFjY291bnQAIHVudmVzdGVkCEBWZXN0aW5nQ29tcGxldGVkAQAEHGFjY291bnQAAhhAQmF0Y2hJbnRlcnJ1cHRlZAEACBRpbmRleAQUZXJyb3IFAThCYXRjaENvbXBsZXRlZAEBBWBCYXRjaENvbXBsZXRlZFdpdGhFcnJvcnMBAQU0SXRlbUNvbXBsZXRlZAEBBShJdGVtRmFpbGVkAQAEFGVycm9yBQEwRGlzcGF0Y2hlZEFzAQAEGHJlc3VsdBkBAhwMQW55AQEFLE5vblRyYW5zZmVyAQEFKEdvdmVybmFuY2UBAQUcU3Rha2luZwEBBSxDYW5jZWxQcm94eQEBBRxBdWN0aW9uAQEFPE5vbWluYXRpb25Qb29scwEBBQIUNFByb3h5RXhlY3V0ZWQBAAQYcmVzdWx0GQEsUHVyZUNyZWF0ZWQBABAQcHVyZQAMd2hvAChwcm94eV90eXBl6QFQZGlzYW1iaWd1YXRpb25faW5kZXgEJEFubm91bmNlZAEADBByZWFsABRwcm94eQAkY2FsbF9oYXNoIChQcm94eUFkZGVkAQAQJGRlbGVnYXRvcgAkZGVsZWdhdGVlAChwcm94eV90eXBl6QEUZGVsYXkEMFByb3h5UmVtb3ZlZAEAECRkZWxlZ2F0b3IAJGRlbGVnYXRlZQAocHJveHlfdHlwZekBFGRlbGF5BAAIGGhlaWdodAQUaW5kZXgEAhAsTmV3TXVsdGlzaWcBAAwkYXBwcm92aW5nACBtdWx0aXNpZwAkY2FsbF9oYXNoIEBNdWx0aXNpZ0FwcHJvdmFsAQAQJGFwcHJvdmluZwAkdGltZXBvaW508QEgbXVsdGlzaWcAJGNhbGxfaGFzaCBATXVsdGlzaWdFeGVjdXRlZAEAFCRhcHByb3ZpbmcAJHRpbWVwb2ludPEBIG11bHRpc2lnACRjYWxsX2hhc2ggGHJlc3VsdBkBRE11bHRpc2lnQ2FuY2VsbGVkAQAQKGNhbmNlbGxpbmcAJHRpbWVwb2ludPEBIG11bHRpc2lnACRjYWxsX2hhc2ggAiw4Qm91bnR5UHJvcG9zZWQBAAQUaW5kZXgEOEJvdW50eVJlamVjdGVkAQAIFGluZGV4BBBib25kCEhCb3VudHlCZWNhbWVBY3RpdmUBAAQUaW5kZXgENEJvdW50eUF3YXJkZWQBAAgUaW5kZXgELGJlbmVmaWNpYXJ5ADRCb3VudHlDbGFpbWVkAQAMFGluZGV4BBhwYXlvdXQILGJlbmVmaWNpYXJ5ADhCb3VudHlDYW5jZWxlZAEABBRpbmRleAQ4Qm91bnR5RXh0ZW5kZWQBAAQUaW5kZXgEOEJvdW50eUFwcHJvdmVkAQAEFGluZGV4BDxDdXJhdG9yUHJvcG9zZWQBAAgkYm91bnR5X2lkBBxjdXJhdG9yAERDdXJhdG9yVW5hc3NpZ25lZAEABCRib3VudHlfaWQEPEN1cmF0b3JBY2NlcHRlZAEACCRib3VudHlfaWQEHGN1cmF0b3IAAhAUQWRkZWQBAAgUaW5kZXgELGNoaWxkX2luZGV4BBxBd2FyZGVkAQAMFGluZGV4BCxjaGlsZF9pbmRleAQsYmVuZWZpY2lhcnkAHENsYWltZWQBABAUaW5kZXgELGNoaWxkX2luZGV4BBhwYXlvdXQILGJlbmVmaWNpYXJ5ACBDYW5jZWxlZAEACBRpbmRleAQsY2hpbGRfaW5kZXgEAhQcT25DaGFpbgEBBRhTaWduZWQBAQUgVW5zaWduZWQBAQUgRmFsbGJhY2sBAQUkRW1lcmdlbmN5AQEFBgAADDRtaW5pbWFsX3N0YWtlCCRzdW1fc3Rha2UIRHN1bV9zdGFrZV9zcXVhcmVkCAMIFAQCEAxPZmYBAQUYU2lnbmVkAQEFIFVuc2lnbmVkAQMIFAQkRW1lcmdlbmN5AQEFAhg4U29sdXRpb25TdG9yZWQBAAwcY29tcHV0ZQECGG9yaWdpbgUCMHByZXZfZWplY3RlZBRERWxlY3Rpb25GaW5hbGl6ZWQBAAgcY29tcHV0ZQECFHNjb3JlCQI4RWxlY3Rpb25GYWlsZWQBAQUgUmV3YXJkZWQBAAgcYWNjb3VudAAUdmFsdWUIHFNsYXNoZWQBAAgcYWNjb3VudAAUdmFsdWUIRFBoYXNlVHJhbnNpdGlvbmVkAQAMEGZyb20RAgh0bxECFHJvdW5kBAIIIFJlYmFnZ2VkAQAMDHdobwAQZnJvbQgIdG8IMFNjb3JlVXBkYXRlZAEACAx3aG8AJG5ld19zY29yZQgCDBBPcGVuAQEFHEJsb2NrZWQBAQUoRGVzdHJveWluZwEBBQMIBAAGIQIACDBtYXhfaW5jcmVhc2UEJG1pbl9kZWxheQQCCDhQZXJtaXNzaW9ubGVzcwEBBRxBY2NvdW50AQEBBi0CAkgcQ3JlYXRlZAEACCRkZXBvc2l0b3IAHHBvb2xfaWQEGEJvbmRlZAEAEBhtZW1iZXIAHHBvb2xfaWQEGGJvbmRlZAgYam9pbmVkFBxQYWlkT3V0AQAMGG1lbWJlcgAccG9vbF9pZAQYcGF5b3V0CCBVbmJvbmRlZAEAFBhtZW1iZXIAHHBvb2xfaWQEHGJhbGFuY2UIGHBvaW50cwgMZXJhBCRXaXRoZHJhd24BABAYbWVtYmVyABxwb29sX2lkBBxiYWxhbmNlCBhwb2ludHMIJERlc3Ryb3llZAEABBxwb29sX2lkBDBTdGF0ZUNoYW5nZWQBAAgccG9vbF9pZAQkbmV3X3N0YXRlHQI0TWVtYmVyUmVtb3ZlZAEACBxwb29sX2lkBBhtZW1iZXIAMFJvbGVzVXBkYXRlZAEADBByb290BQIcYm91bmNlcgUCJG5vbWluYXRvcgUCLFBvb2xTbGFzaGVkAQAIHHBvb2xfaWQEHGJhbGFuY2UIUFVuYm9uZGluZ1Bvb2xTbGFzaGVkAQAMHHBvb2xfaWQEDGVyYQQcYmFsYW5jZQhUUG9vbENvbW1pc3Npb25VcGRhdGVkAQAIHHBvb2xfaWQEHGN1cnJlbnQlAmBQb29sTWF4Q29tbWlzc2lvblVwZGF0ZWQBAAgccG9vbF9pZAQ4bWF4X2NvbW1pc3Npb24EfFBvb2xDb21taXNzaW9uQ2hhbmdlUmF0ZVVwZGF0ZWQBAAgccG9vbF9pZAQsY2hhbmdlX3JhdGUpApBQb29sQ29tbWlzc2lvbkNsYWltUGVybWlzc2lvblVwZGF0ZWQBAAgccG9vbF9pZAQocGVybWlzc2lvbjECVFBvb2xDb21taXNzaW9uQ2xhaW1lZAEACBxwb29sX2lkBChjb21taXNzaW9uCGRNaW5CYWxhbmNlRGVmaWNpdEFkanVzdGVkAQAIHHBvb2xfaWQEGGFtb3VudAhgTWluQmFsYW5jZUV4Y2Vzc0FkanVzdGVkAQAIHHBvb2xfaWQEGGFtb3VudAgEBAACFCBVbnN0YWtlZAEACBRzdGFzaAAYcmVzdWx0GQEcU2xhc2hlZAEACBRzdGFzaAAYYW1vdW50CDBCYXRjaENoZWNrZWQBAAQQZXJhczkCNEJhdGNoRmluaXNoZWQBAAQQc2l6ZQQ0SW50ZXJuYWxFcnJvcgEBBQUBAQEAJBxwYXJhX2lkBDByZWxheV9wYXJlbnQgIGNvbGxhdG9yIHhwZXJzaXN0ZWRfdmFsaWRhdGlvbl9kYXRhX2hhc2ggIHBvdl9oYXNoIDBlcmFzdXJlX3Jvb3QgJHNpZ25hdHVyZUECJHBhcmFfaGVhZCBQdmFsaWRhdGlvbl9jb2RlX2hhc2ggAAgoZGVzY3JpcHRvckUCQGNvbW1pdG1lbnRzX2hhc2ggAhA8Q2FuZGlkYXRlQmFja2VkAQMQSQIkBAREQ2FuZGlkYXRlSW5jbHVkZWQBAxBJAiQEBERDYW5kaWRhdGVUaW1lZE91dAEDDEkCJARYVXB3YXJkTWVzc2FnZXNSZWNlaXZlZAEACBBmcm9tBBRjb3VudAQCIEhDdXJyZW50Q29kZVVwZGF0ZWQBAQJIQ3VycmVudEhlYWRVcGRhdGVkAQECUENvZGVVcGdyYWRlU2NoZWR1bGVkAQECME5ld0hlYWROb3RlZAEBAjBBY3Rpb25RdWV1ZWQBBAQBCDxQdmZDaGVja1N0YXJ0ZWQBAwggBEBQdmZDaGVja0FjY2VwdGVkAQMIIARAUHZmQ2hlY2tSZWplY3RlZAEDCCAEAAgYc2VuZGVyBCRyZWNpcGllbnQEAhxQT3BlbkNoYW5uZWxSZXF1ZXN0ZWQBABAYc2VuZGVyBCRyZWNpcGllbnQEVHByb3Bvc2VkX21heF9jYXBhY2l0eQRkcHJvcG9zZWRfbWF4X21lc3NhZ2Vfc2l6ZQRMT3BlbkNoYW5uZWxDYW5jZWxlZAEACDBieV9wYXJhY2hhaW4EKGNoYW5uZWxfaWRVAkxPcGVuQ2hhbm5lbEFjY2VwdGVkAQAIGHNlbmRlcgQkcmVjaXBpZW50BDRDaGFubmVsQ2xvc2VkAQAIMGJ5X3BhcmFjaGFpbgQoY2hhbm5lbF9pZFUCWEhybXBDaGFubmVsRm9yY2VPcGVuZWQBABAYc2VuZGVyBCRyZWNpcGllbnQEVHByb3Bvc2VkX21heF9jYXBhY2l0eQRkcHJvcG9zZWRfbWF4X21lc3NhZ2Vfc2l6ZQRcSHJtcFN5c3RlbUNoYW5uZWxPcGVuZWQBABAYc2VuZGVyBCRyZWNpcGllbnQEVHByb3Bvc2VkX21heF9jYXBhY2l0eQRkcHJvcG9zZWRfbWF4X21lc3NhZ2Vfc2l6ZQRoT3BlbkNoYW5uZWxEZXBvc2l0c1VwZGF0ZWQBAAgYc2VuZGVyBCRyZWNpcGllbnQEAggUTG9jYWwBAQUYUmVtb3RlAQEFAggUVmFsaWQBAQUcSW52YWxpZAEBBQIMQERpc3B1dGVJbml0aWF0ZWQBAwggXQJARGlzcHV0ZUNvbmNsdWRlZAEDCCBhAhhSZXZlcnQBAQICCExPbkRlbWFuZE9yZGVyUGxhY2VkAQAMHHBhcmFfaWQEKHNwb3RfcHJpY2UIKG9yZGVyZWRfYnkAMFNwb3RQcmljZVNldAEABChzcG90X3ByaWNlCAIQKFJlZ2lzdGVyZWQBAAgccGFyYV9pZAQcbWFuYWdlcgAwRGVyZWdpc3RlcmVkAQAEHHBhcmFfaWQEIFJlc2VydmVkAQAIHHBhcmFfaWQEDHdobwAcU3dhcHBlZAEACBxwYXJhX2lkBCBvdGhlcl9pZAQCCDhOZXdMZWFzZVBlcmlvZAEABDBsZWFzZV9wZXJpb2QEGExlYXNlZAEAGBxwYXJhX2lkBBhsZWFzZXIAMHBlcmlvZF9iZWdpbgQwcGVyaW9kX2NvdW50BDhleHRyYV9yZXNlcnZlZAgwdG90YWxfYW1vdW50CAIcOEF1Y3Rpb25TdGFydGVkAQAMNGF1Y3Rpb25faW5kZXgEMGxlYXNlX3BlcmlvZAQYZW5kaW5nBDRBdWN0aW9uQ2xvc2VkAQAENGF1Y3Rpb25faW5kZXgEIFJlc2VydmVkAQAMGGJpZGRlcgA4ZXh0cmFfcmVzZXJ2ZWQIMHRvdGFsX2Ftb3VudAgoVW5yZXNlcnZlZAEACBhiaWRkZXIAGGFtb3VudAhIUmVzZXJ2ZUNvbmZpc2NhdGVkAQAMHHBhcmFfaWQEGGxlYXNlcgAYYW1vdW50CCxCaWRBY2NlcHRlZAEAFBhiaWRkZXIAHHBhcmFfaWQEGGFtb3VudAgoZmlyc3Rfc2xvdAQkbGFzdF9zbG90BDRXaW5uaW5nT2Zmc2V0AQAINGF1Y3Rpb25faW5kZXgEMGJsb2NrX251bWJlcgQCKBxDcmVhdGVkAQAEHHBhcmFfaWQELENvbnRyaWJ1dGVkAQAMDHdobwAoZnVuZF9pbmRleAQYYW1vdW50CCBXaXRoZHJldwEADAx3aG8AKGZ1bmRfaW5kZXgEGGFtb3VudAhEUGFydGlhbGx5UmVmdW5kZWQBAAQccGFyYV9pZAQsQWxsUmVmdW5kZWQBAAQccGFyYV9pZAQkRGlzc29sdmVkAQAEHHBhcmFfaWQEPEhhbmRsZUJpZFJlc3VsdAEACBxwYXJhX2lkBBhyZXN1bHQZARhFZGl0ZWQBAAQccGFyYV9pZAQsTWVtb1VwZGF0ZWQBAAwMd2hvABxwYXJhX2lkBBBtZW1vJDxBZGRlZFRvTmV3UmFpc2UBAAQccGFyYV9pZAQCCFBSZXZlbnVlSW5mb1JlcXVlc3RlZAEABBB3aGVuBDBDb3JlQXNzaWduZWQBAAQQY29yZQQCCBhTaWduZWQBAQUQQXV0bwEBBQIQIE1pZ3JhdGVkAQAMDHRvcAQUY2hpbGQEHGNvbXB1dGWBAhxTbGFzaGVkAQAIDHdobwAYYW1vdW50CFRBdXRvTWlncmF0aW9uRmluaXNoZWQBAQUYSGFsdGVkAQAEFGVycm9y5AKgIE92ZXJmbG93AQEFNFVuaW1wbGVtZW50ZWQBAQVgVW50cnVzdGVkUmVzZXJ2ZUxvY2F0aW9uAQEFZFVudHJ1c3RlZFRlbGVwb3J0TG9jYXRpb24BAQUwTG9jYXRpb25GdWxsAQEFVExvY2F0aW9uTm90SW52ZXJ0aWJsZQEBBSRCYWRPcmlnaW4BAQU8SW52YWxpZExvY2F0aW9uAQEFNEFzc2V0Tm90Rm91bmQBAQVURmFpbGVkVG9UcmFuc2FjdEFzc2V0AQEFPE5vdFdpdGhkcmF3YWJsZQEBBUhMb2NhdGlvbkNhbm5vdEhvbGQBAQVURXhjZWVkc01heE1lc3NhZ2VTaXplAQEFWERlc3RpbmF0aW9uVW5zdXBwb3J0ZWQBAQUkVHJhbnNwb3J0AQEFKFVucm91dGFibGUBAQUwVW5rbm93bkNsYWltAQEFOEZhaWxlZFRvRGVjb2RlAQEFQE1heFdlaWdodEludmFsaWQBAQU4Tm90SG9sZGluZ0ZlZXMBAQUwVG9vRXhwZW5zaXZlAQEFEFRyYXABAQNARXhwZWN0YXRpb25GYWxzZQEBBThQYWxsZXROb3RGb3VuZAEBBTBOYW1lTWlzbWF0Y2gBAQVMVmVyc2lvbkluY29tcGF0aWJsZQEBBVBIb2xkaW5nV291bGRPdmVyZmxvdwEBBSxFeHBvcnRFcnJvcgEBBThSZWFuY2hvckZhaWxlZAEBBRhOb0RlYWwBAQUoRmVlc05vdE1ldAEBBSRMb2NrRXJyb3IBAQUwTm9QZXJtaXNzaW9uAQEFKFVuYW5jaG9yZWQBAQU4Tm90RGVwb3NpdGFibGUBAQVMVW5oYW5kbGVkWGNtVmVyc2lvbgEBBUhXZWlnaHRMaW1pdFJlYWNoZWQBAAggcmVmX3RpbWUIKHByb29mX3NpemUIHEJhcnJpZXIBAQVMV2VpZ2h0Tm90Q29tcHV0YWJsZQEBBURFeGNlZWRzU3RhY2tMaW1pdAEBBQIMIENvbXBsZXRlAQAEEHVzZWQYKEluY29tcGxldGUBAAgQdXNlZBgUZXJyb3KJAhRFcnJvcgEABBRlcnJvcokCBQEgAhgkVW5kZWZpbmVkAQEFFEluZGV4AQEDGEFycmF5NAEFARAYQXJyYXk4AQUBIBxBcnJheTE2AQUBQBxBcnJheTMyAQUBgAIIIEZ1bmdpYmxlAQEDLE5vbkZ1bmdpYmxlAQIYJFVuZGVmaW5lZAEBBRRJbmRleAEBAxhBcnJheTQBBQEQGEFycmF5OAEFASAcQXJyYXkxNgEFAUAcQXJyYXkzMgEFAYAACAhpZHkBDGZ1bpkCBJ0CAAMIBIkCBqUCABgUaW5kZXgEEG5hbWUkLG1vZHVsZV9uYW1lJBRtYWpvcgQUbWlub3IEFHBhdGNoBAStAgACDBxTdWNjZXNzAQEFFEVycm9yAQUAOFRydW5jYXRlZEVycm9yAQUAAhgQTnVsbAEBBRhBc3NldHMBBJ0CADxFeGVjdXRpb25SZXN1bHQBBqUCHFZlcnNpb24BAQIsUGFsbGV0c0luZm8BBK0CADhEaXNwYXRjaFJlc3VsdAECDBxTdWNjZXNzAQEFFEVycm9yAQUAOFRydW5jYXRlZEVycm9yAQUABnkBAhAYTmF0aXZlAQEFQFNvdmVyZWlnbkFjY291bnQBAQUkU3VwZXJ1c2VyAQEFDFhjbQEBBQRxAQEIBHEBAQwEcQEBEARxAQEUBHEBARgEcQEBHARxAQEgAAwsZGVzdGluYXRpb255ASBxdWVyeV9pZAgobWF4X3dlaWdodBgCCCBGdW5naWJsZQEBBSxOb25GdW5naWJsZQEBBQIQDEFsbAEBBRRBbGxPZgEACAhpZHkBDGZ1buUCKEFsbENvdW50ZWQBAQIwQWxsT2ZDb3VudGVkAQAMCGlkeQEMZnVu5QIUY291bnQEAgggRGVmaW5pdGUBBJ0CABBXaWxkAQIQDEFsbAEBBRRBbGxPZgEACAhpZHkBDGZ1buUCKEFsbENvdW50ZWQBAQIwQWxsT2ZDb3VudGVkAQAMCGlkeQEMZnVu5QIUY291bnQEAggkVW5saW1pdGVkAQEFHExpbWl0ZWQBAAggcmVmX3RpbWUIKHByb29mX3NpemUIAsA0V2l0aGRyYXdBc3NldAEEnQIAVFJlc2VydmVBc3NldERlcG9zaXRlZAEEnQIAWFJlY2VpdmVUZWxlcG9ydGVkQXNzZXQBBJ0CADRRdWVyeVJlc3BvbnNlAQAQIHF1ZXJ5X2lkCCByZXNwb25zZbkCKG1heF93ZWlnaHQYHHF1ZXJpZXK9AjRUcmFuc2ZlckFzc2V0AQAIGGFzc2V0c6ECLGJlbmVmaWNpYXJ5eQFQVHJhbnNmZXJSZXNlcnZlQXNzZXQBAAwYYXNzZXRzoQIQZGVzdHkBDHhjbfkCIFRyYW5zYWN0AQAMLG9yaWdpbl9raW5kwQJYcmVxdWlyZV93ZWlnaHRfYXRfbW9zdBgQY2FsbCRkSHJtcE5ld0NoYW5uZWxPcGVuUmVxdWVzdAEADBhzZW5kZXIEQG1heF9tZXNzYWdlX3NpemUEMG1heF9jYXBhY2l0eQRMSHJtcENoYW5uZWxBY2NlcHRlZAEABCRyZWNpcGllbnQESEhybXBDaGFubmVsQ2xvc2luZwEADCRpbml0aWF0b3IEGHNlbmRlcgQkcmVjaXBpZW50BCxDbGVhck9yaWdpbgEBBTREZXNjZW5kT3JpZ2luAQIkEEhlcmUBAQUIWDEBAigkUGFyYWNoYWluAQECLEFjY291bnRJZDMyAQAIHG5ldHdvcmthAQhpZCA4QWNjb3VudEluZGV4NjQBAAgcbmV0d29ya2EBFGluZGV4CDBBY2NvdW50S2V5MjABAAgcbmV0d29ya2EBDGtleWUBOFBhbGxldEluc3RhbmNlAQECMEdlbmVyYWxJbmRleAEBAyhHZW5lcmFsS2V5AQAIGGxlbmd0aAQQZGF0YSAkT25seUNoaWxkAQEFJFBsdXJhbGl0eQEACAhpZGkBEHBhcnRtATxHbG9iYWxDb25zZW5zdXMBAiwkQnlHZW5lc2lzAQUBgBhCeUZvcmsBAAgwYmxvY2tfbnVtYmVyCChibG9ja19oYXNoICBQb2xrYWRvdAEBBRhLdXNhbWEBAQUcV2VzdGVuZAEBBRhSb2NvY28BAQUYV29jb2NvAQEFIEV0aGVyZXVtAQAEIGNoYWluX2lkCCxCaXRjb2luQ29yZQEBBSxCaXRjb2luQ2FzaAEBBUBQb2xrYWRvdEJ1bGxldGluAQEFCFgyAQRxAQEICFgzAQRxAQEMCFg0AQRxAQEQCFg1AQRxAQEUCFg2AQRxAQEYCFg3AQRxAQEcCFg4AQRxAQEgLFJlcG9ydEVycm9yAQAMLGRlc3RpbmF0aW9ueQEgcXVlcnlfaWQIKG1heF93ZWlnaHQYMERlcG9zaXRBc3NldAEACBhhc3NldHPtAixiZW5lZmljaWFyeXkBTERlcG9zaXRSZXNlcnZlQXNzZXQBAAwYYXNzZXRz7QIQZGVzdHkBDHhjbfkCNEV4Y2hhbmdlQXNzZXQBAAwQZ2l2Ze0CEHdhbnShAhxtYXhpbWFsFFxJbml0aWF0ZVJlc2VydmVXaXRoZHJhdwEADBhhc3NldHPtAhxyZXNlcnZleQEMeGNt+QJASW5pdGlhdGVUZWxlcG9ydAEADBhhc3NldHPtAhBkZXN0eQEMeGNt+QI0UmVwb3J0SG9sZGluZwEACDRyZXNwb25zZV9pbmZv4QIYYXNzZXRz7QIwQnV5RXhlY3V0aW9uAQAIEGZlZXOdAjB3ZWlnaHRfbGltaXTxAjRSZWZ1bmRTdXJwbHVzAQEFPFNldEVycm9ySGFuZGxlcgEE9QIALFNldEFwcGVuZGl4AQT1AgAoQ2xlYXJFcnJvcgEBBShDbGFpbUFzc2V0AQAIGGFzc2V0c6ECGHRpY2tldHkBEFRyYXABAQNAU3Vic2NyaWJlVmVyc2lvbgEACCBxdWVyeV9pZAhMbWF4X3Jlc3BvbnNlX3dlaWdodBhIVW5zdWJzY3JpYmVWZXJzaW9uAQEFJEJ1cm5Bc3NldAEEnQIALEV4cGVjdEFzc2V0AQSdAgAwRXhwZWN0T3JpZ2luAQZ5ASxFeHBlY3RFcnJvcgEGpQJQRXhwZWN0VHJhbnNhY3RTdGF0dXMBAgwcU3VjY2VzcwEBBRRFcnJvcgEFADhUcnVuY2F0ZWRFcnJvcgEFACxRdWVyeVBhbGxldAEACCxtb2R1bGVfbmFtZSQ0cmVzcG9uc2VfaW5mb+ECMEV4cGVjdFBhbGxldAEAFBRpbmRleAQQbmFtZSQsbW9kdWxlX25hbWUkLGNyYXRlX21ham9yBDxtaW5fY3JhdGVfbWlub3IEUFJlcG9ydFRyYW5zYWN0U3RhdHVzAQAMLGRlc3RpbmF0aW9ueQEgcXVlcnlfaWQIKG1heF93ZWlnaHQYTENsZWFyVHJhbnNhY3RTdGF0dXMBAQU8VW5pdmVyc2FsT3JpZ2luAQIoJFBhcmFjaGFpbgEBAixBY2NvdW50SWQzMgEACBxuZXR3b3JrYQEIaWQgOEFjY291bnRJbmRleDY0AQAIHG5ldHdvcmthARRpbmRleAgwQWNjb3VudEtleTIwAQAIHG5ldHdvcmthAQxrZXllAThQYWxsZXRJbnN0YW5jZQEBAjBHZW5lcmFsSW5kZXgBAQMoR2VuZXJhbEtleQEACBhsZW5ndGgEEGRhdGEgJE9ubHlDaGlsZAEBBSRQbHVyYWxpdHkBAAgIaWRpARBwYXJ0bQE8R2xvYmFsQ29uc2Vuc3VzAQIsJEJ5R2VuZXNpcwEFAYAYQnlGb3JrAQAIMGJsb2NrX251bWJlcggoYmxvY2tfaGFzaCAgUG9sa2Fkb3QBAQUYS3VzYW1hAQEFHFdlc3RlbmQBAQUYUm9jb2NvAQEFGFdvY29jbwEBBSBFdGhlcmV1bQEABCBjaGFpbl9pZAgsQml0Y29pbkNvcmUBAQUsQml0Y29pbkNhc2gBAQVAUG9sa2Fkb3RCdWxsZXRpbgEBBTRFeHBvcnRNZXNzYWdlAQAMHG5ldHdvcmtdASxkZXN0aW5hdGlvbnUBDHhjbfkCJExvY2tBc3NldAEACBRhc3NldJ0CIHVubG9ja2VyeQEsVW5sb2NrQXNzZXQBAAgUYXNzZXSdAhh0YXJnZXR5AThOb3RlVW5sb2NrYWJsZQEACBRhc3NldJ0CFG93bmVyeQE0UmVxdWVzdFVubG9jawEACBRhc3NldJ0CGGxvY2tlcnkBLFNldEZlZXNNb2RlAQAEMGppdF93aXRoZHJhdxQgU2V0VG9waWMBBQGAKENsZWFyVG9waWMBAQUsQWxpYXNPcmlnaW4BAAgccGFyZW50cwQgaW50ZXJpb3J1ATxVbnBhaWRFeGVjdXRpb24BAAgwd2VpZ2h0X2xpbWl08QIwY2hlY2tfb3JpZ2luvQIE9QIAAgggQ29uY3JldGUBAAgccGFyZW50cwQgaW50ZXJpb3KRASBBYnN0cmFjdAEFAAIcJFVuZGVmaW5lZAEBBRRJbmRleAEBAxhBcnJheTQBBQEQGEFycmF5OAEFASAcQXJyYXkxNgEFAUAcQXJyYXkzMgEFAYAQQmxvYgEFAAIIIEZ1bmdpYmxlAQEDLE5vbkZ1bmdpYmxlAQIcJFVuZGVmaW5lZAEBBRRJbmRleAEBAxhBcnJheTQBBQEQGEFycmF5OAEFASAcQXJyYXkxNgEFAUAcQXJyYXkzMgEFAYAQQmxvYgEFAAAICGlk/QIMZnVuBQMECQMAAAgIaWR9AQxmdW6ZAgQRAwACDAhWMgEECQMACFYzAQQRAwAIVjQBBJ0CAAJgJEF0dGVtcHRlZAEABBxvdXRjb21ljQIQU2VudAEAEBhvcmlnaW55ASxkZXN0aW5hdGlvbnkBHG1lc3NhZ2X5AihtZXNzYWdlX2lkIEhVbmV4cGVjdGVkUmVzcG9uc2UBAAgYb3JpZ2lueQEgcXVlcnlfaWQINFJlc3BvbnNlUmVhZHkBAAggcXVlcnlfaWQIIHJlc3BvbnNluQIgTm90aWZpZWQBAAwgcXVlcnlfaWQIMHBhbGxldF9pbmRleAQoY2FsbF9pbmRleARATm90aWZ5T3ZlcndlaWdodAEAFCBxdWVyeV9pZAgwcGFsbGV0X2luZGV4BChjYWxsX2luZGV4BDRhY3R1YWxfd2VpZ2h0GExtYXhfYnVkZ2V0ZWRfd2VpZ2h0GExOb3RpZnlEaXNwYXRjaEVycm9yAQAMIHF1ZXJ5X2lkCDBwYWxsZXRfaW5kZXgEKGNhbGxfaW5kZXgESE5vdGlmeURlY29kZUZhaWxlZAEADCBxdWVyeV9pZAgwcGFsbGV0X2luZGV4BChjYWxsX2luZGV4BEBJbnZhbGlkUmVzcG9uZGVyAQAMGG9yaWdpbnkBIHF1ZXJ5X2lkCERleHBlY3RlZF9sb2NhdGlvbr0CXEludmFsaWRSZXNwb25kZXJWZXJzaW9uAQAIGG9yaWdpbnkBIHF1ZXJ5X2lkCDRSZXNwb25zZVRha2VuAQAEIHF1ZXJ5X2lkCDRBc3NldHNUcmFwcGVkAQAMEGhhc2ggGG9yaWdpbnkBGGFzc2V0cxkDVFZlcnNpb25DaGFuZ2VOb3RpZmllZAEAECxkZXN0aW5hdGlvbnkBGHJlc3VsdAQQY29zdKECKG1lc3NhZ2VfaWQgXFN1cHBvcnRlZFZlcnNpb25DaGFuZ2VkAQAIIGxvY2F0aW9ueQEcdmVyc2lvbgRQTm90aWZ5VGFyZ2V0U2VuZEZhaWwBAAwgbG9jYXRpb255ASBxdWVyeV9pZAgUZXJyb3KJAmROb3RpZnlUYXJnZXRNaWdyYXRpb25GYWlsAQAIIGxvY2F0aW9umQEgcXVlcnlfaWQIVEludmFsaWRRdWVyaWVyVmVyc2lvbgEACBhvcmlnaW55ASBxdWVyeV9pZAg4SW52YWxpZFF1ZXJpZXIBABAYb3JpZ2lueQEgcXVlcnlfaWQIQGV4cGVjdGVkX3F1ZXJpZXJ5AVBtYXliZV9hY3R1YWxfcXVlcmllcr0CUFZlcnNpb25Ob3RpZnlTdGFydGVkAQAMLGRlc3RpbmF0aW9ueQEQY29zdKECKG1lc3NhZ2VfaWQgWFZlcnNpb25Ob3RpZnlSZXF1ZXN0ZWQBAAwsZGVzdGluYXRpb255ARBjb3N0oQIobWVzc2FnZV9pZCBgVmVyc2lvbk5vdGlmeVVucmVxdWVzdGVkAQAMLGRlc3RpbmF0aW9ueQEQY29zdKECKG1lc3NhZ2VfaWQgIEZlZXNQYWlkAQAIGHBheWluZ3kBEGZlZXOhAjRBc3NldHNDbGFpbWVkAQAMEGhhc2ggGG9yaWdpbnkBGGFzc2V0cxkDYFZlcnNpb25NaWdyYXRpb25GaW5pc2hlZAEABBx2ZXJzaW9uBAIEEFBhcmEBAQICBAxVbXABAgQQUGFyYQEBAgIYJEJhZEZvcm1hdAEBBRxDb3JydXB0AQEFLFVuc3VwcG9ydGVkAQEFKE92ZXJ3ZWlnaHQBAAggcmVmX3RpbWUIKHByb29mX3NpemUIFFlpZWxkAQEFRFN0YWNrTGltaXRSZWFjaGVkAQEFAhBAUHJvY2Vzc2luZ0ZhaWxlZAEADAhpZCAYb3JpZ2luJQMUZXJyb3IpAyRQcm9jZXNzZWQBABAIaWQgGG9yaWdpbiUDLHdlaWdodF91c2VkGBxzdWNjZXNzFEhPdmVyd2VpZ2h0RW5xdWV1ZWQBABAIaWQgGG9yaWdpbiUDKHBhZ2VfaW5kZXgENG1lc3NhZ2VfaW5kZXgEKFBhZ2VSZWFwZWQBAAgYb3JpZ2luJQMUaW5kZXgEAgxAQXNzZXRSYXRlQ3JlYXRlZAEACChhc3NldF9raW5kgQEQcmF0ZQhAQXNzZXRSYXRlUmVtb3ZlZAEABChhc3NldF9raW5kgQFAQXNzZXRSYXRlVXBkYXRlZAEADChhc3NldF9raW5kgQEMb2xkCAxuZXcIAqAYU3lzdGVtAQIcQEV4dHJpbnNpY1N1Y2Nlc3MBAAQ0ZGlzcGF0Y2hfaW5mb0A8RXh0cmluc2ljRmFpbGVkAQAIOGRpc3BhdGNoX2Vycm9yBQE0ZGlzcGF0Y2hfaW5mb0AsQ29kZVVwZGF0ZWQBAQUoTmV3QWNjb3VudAEABBxhY2NvdW50ADRLaWxsZWRBY2NvdW50AQAEHGFjY291bnQAIFJlbWFya2VkAQAIGHNlbmRlcgAQaGFzaCBEVXBncmFkZUF1dGhvcml6ZWQBAAgkY29kZV9oYXNoIDRjaGVja192ZXJzaW9uFCRTY2hlZHVsZXIBAiQkU2NoZWR1bGVkAQAIEHdoZW4EFGluZGV4BCBDYW5jZWxlZAEACBB3aGVuBBRpbmRleAQoRGlzcGF0Y2hlZAEADBB0YXNrDQEIaWQRARhyZXN1bHQZASBSZXRyeVNldAEAEBB0YXNrDQEIaWQRARhwZXJpb2QEHHJldHJpZXMEOFJldHJ5Q2FuY2VsbGVkAQAIEHRhc2sNAQhpZBEBPENhbGxVbmF2YWlsYWJsZQEACBB0YXNrDQEIaWQRAThQZXJpb2RpY0ZhaWxlZAEACBB0YXNrDQEIaWQRASxSZXRyeUZhaWxlZAEACBB0YXNrDQEIaWQRAVRQZXJtYW5lbnRseU92ZXJ3ZWlnaHQBAAgQdGFzaw0BCGlkEQEgUHJlaW1hZ2UBAgwUTm90ZWQBAAQQaGFzaCAkUmVxdWVzdGVkAQAEEGhhc2ggHENsZWFyZWQBAAQQaGFzaCAcSW5kaWNlcwECDDRJbmRleEFzc2lnbmVkAQAIDHdobwAUaW5kZXgEKEluZGV4RnJlZWQBAAQUaW5kZXgELEluZGV4RnJvemVuAQAIFGluZGV4BAx3aG8AIEJhbGFuY2VzAQJYHEVuZG93ZWQBAAgcYWNjb3VudAAwZnJlZV9iYWxhbmNlCCBEdXN0TG9zdAEACBxhY2NvdW50ABhhbW91bnQIIFRyYW5zZmVyAQAMEGZyb20ACHRvABhhbW91bnQIKEJhbGFuY2VTZXQBAAgMd2hvABBmcmVlCCBSZXNlcnZlZAEACAx3aG8AGGFtb3VudAgoVW5yZXNlcnZlZAEACAx3aG8AGGFtb3VudAhIUmVzZXJ2ZVJlcGF0cmlhdGVkAQAQEGZyb20ACHRvABhhbW91bnQISGRlc3RpbmF0aW9uX3N0YXR1cykBHERlcG9zaXQBAAgMd2hvABhhbW91bnQIIFdpdGhkcmF3AQAIDHdobwAYYW1vdW50CBxTbGFzaGVkAQAIDHdobwAYYW1vdW50CBhNaW50ZWQBAAgMd2hvABhhbW91bnQIGEJ1cm5lZAEACAx3aG8AGGFtb3VudAgkU3VzcGVuZGVkAQAIDHdobwAYYW1vdW50CCBSZXN0b3JlZAEACAx3aG8AGGFtb3VudAggVXBncmFkZWQBAAQMd2hvABhJc3N1ZWQBAAQYYW1vdW50CCRSZXNjaW5kZWQBAAQYYW1vdW50CBhMb2NrZWQBAAgMd2hvABhhbW91bnQIIFVubG9ja2VkAQAIDHdobwAYYW1vdW50CBhGcm96ZW4BAAgMd2hvABhhbW91bnQIGFRoYXdlZAEACAx3aG8AGGFtb3VudAhMVG90YWxJc3N1YW5jZUZvcmNlZAEACAxvbGQIDG5ldwhIVHJhbnNhY3Rpb25QYXltZW50AQIESFRyYW5zYWN0aW9uRmVlUGFpZAEADAx3aG8AKGFjdHVhbF9mZWUIDHRpcAgcU3Rha2luZwECSBxFcmFQYWlkAQAMJGVyYV9pbmRleARAdmFsaWRhdG9yX3BheW91dAgkcmVtYWluZGVyCCBSZXdhcmRlZAEADBRzdGFzaAAQZGVzdDUBGGFtb3VudAgcU2xhc2hlZAEACBhzdGFrZXIAGGFtb3VudAg0U2xhc2hSZXBvcnRlZAEADCR2YWxpZGF0b3IAIGZyYWN0aW9uBCRzbGFzaF9lcmEEaE9sZFNsYXNoaW5nUmVwb3J0RGlzY2FyZGVkAQAENHNlc3Npb25faW5kZXgEOFN0YWtlcnNFbGVjdGVkAQEFGEJvbmRlZAEACBRzdGFzaAAYYW1vdW50CCBVbmJvbmRlZAEACBRzdGFzaAAYYW1vdW50CCRXaXRoZHJhd24BAAgUc3Rhc2gAGGFtb3VudAgYS2lja2VkAQAIJG5vbWluYXRvcgAUc3Rhc2gAVFN0YWtpbmdFbGVjdGlvbkZhaWxlZAEBBRxDaGlsbGVkAQAEFHN0YXNoADRQYXlvdXRTdGFydGVkAQAIJGVyYV9pbmRleAQ8dmFsaWRhdG9yX3N0YXNoAERWYWxpZGF0b3JQcmVmc1NldAEACBRzdGFzaAAUcHJlZnM5AWhTbmFwc2hvdFZvdGVyc1NpemVFeGNlZWRlZAEABBBzaXplBGxTbmFwc2hvdFRhcmdldHNTaXplRXhjZWVkZWQBAAQQc2l6ZQQgRm9yY2VFcmEBAAQQbW9kZT0BZENvbnRyb2xsZXJCYXRjaERlcHJlY2F0ZWQBAAQgZmFpbHVyZXMEIE9mZmVuY2VzAQIEHE9mZmVuY2UBAAgQa2luZEUBIHRpbWVzbG90JBxTZXNzaW9uAQIEKE5ld1Nlc3Npb24BAAQ0c2Vzc2lvbl9pbmRleAQcR3JhbmRwYQECDDhOZXdBdXRob3JpdGllcwEABDRhdXRob3JpdHlfc2V0VQEYUGF1c2VkAQEFHFJlc3VtZWQBAQUgVHJlYXN1cnkBAjAgU3BlbmRpbmcBAARAYnVkZ2V0X3JlbWFpbmluZwgcQXdhcmRlZAEADDhwcm9wb3NhbF9pbmRleAQUYXdhcmQIHGFjY291bnQAFEJ1cm50AQAELGJ1cm50X2Z1bmRzCCBSb2xsb3ZlcgEABEByb2xsb3Zlcl9iYWxhbmNlCBxEZXBvc2l0AQAEFHZhbHVlCDRTcGVuZEFwcHJvdmVkAQAMOHByb3Bvc2FsX2luZGV4BBhhbW91bnQILGJlbmVmaWNpYXJ5ADxVcGRhdGVkSW5hY3RpdmUBAAgscmVhY3RpdmF0ZWQILGRlYWN0aXZhdGVkCEhBc3NldFNwZW5kQXBwcm92ZWQBABgUaW5kZXgEKGFzc2V0X2tpbmSBARhhbW91bnQILGJlbmVmaWNpYXJ5mQEodmFsaWRfZnJvbQQkZXhwaXJlX2F0BEBBc3NldFNwZW5kVm9pZGVkAQAEFGluZGV4BBBQYWlkAQAIFGluZGV4BChwYXltZW50X2lkCDRQYXltZW50RmFpbGVkAQAIFGluZGV4BChwYXltZW50X2lkCDhTcGVuZFByb2Nlc3NlZAEABBRpbmRleARAQ29udmljdGlvblZvdGluZwECCCREZWxlZ2F0ZWQBBAABCCxVbmRlbGVnYXRlZAEBASRSZWZlcmVuZGEBAkAkU3VibWl0dGVkAQAMFGluZGV4BBR0cmFjawQgcHJvcG9zYWylAVREZWNpc2lvbkRlcG9zaXRQbGFjZWQBAAwUaW5kZXgEDHdobwAYYW1vdW50CFxEZWNpc2lvbkRlcG9zaXRSZWZ1bmRlZAEADBRpbmRleAQMd2hvABhhbW91bnQIOERlcG9zaXRTbGFzaGVkAQAIDHdobwAYYW1vdW50CDxEZWNpc2lvblN0YXJ0ZWQBABAUaW5kZXgEFHRyYWNrBCBwcm9wb3NhbKUBFHRhbGx5qQE4Q29uZmlybVN0YXJ0ZWQBAAQUaW5kZXgEOENvbmZpcm1BYm9ydGVkAQAEFGluZGV4BCRDb25maXJtZWQBAAgUaW5kZXgEFHRhbGx5qQEgQXBwcm92ZWQBAAQUaW5kZXgEIFJlamVjdGVkAQAIFGluZGV4BBR0YWxseakBIFRpbWVkT3V0AQAIFGluZGV4BBR0YWxseakBJENhbmNlbGxlZAEACBRpbmRleAQUdGFsbHmpARhLaWxsZWQBAAgUaW5kZXgEFHRhbGx5qQFkU3VibWlzc2lvbkRlcG9zaXRSZWZ1bmRlZAEADBRpbmRleAQMd2hvABhhbW91bnQILE1ldGFkYXRhU2V0AQAIFGluZGV4BBBoYXNoIDxNZXRhZGF0YUNsZWFyZWQBAAgUaW5kZXgEEGhhc2ggJFdoaXRlbGlzdAECDDxDYWxsV2hpdGVsaXN0ZWQBAAQkY2FsbF9oYXNoIFhXaGl0ZWxpc3RlZENhbGxSZW1vdmVkAQAEJGNhbGxfaGFzaCBkV2hpdGVsaXN0ZWRDYWxsRGlzcGF0Y2hlZAEACCRjYWxsX2hhc2ggGHJlc3VsdL0BKFBhcmFtZXRlcnMBAgQcVXBkYXRlZAEADAxrZXnJASRvbGRfdmFsdWXVASRuZXdfdmFsdWXVARhDbGFpbXMBAgQcQ2xhaW1lZAEADAx3aG8AQGV0aGVyZXVtX2FkZHJlc3NlARhhbW91bnQIHFZlc3RpbmcBAgg4VmVzdGluZ1VwZGF0ZWQBAAgcYWNjb3VudAAgdW52ZXN0ZWQIQFZlc3RpbmdDb21wbGV0ZWQBAAQcYWNjb3VudAAcVXRpbGl0eQECGEBCYXRjaEludGVycnVwdGVkAQAIFGluZGV4BBRlcnJvcgUBOEJhdGNoQ29tcGxldGVkAQEFYEJhdGNoQ29tcGxldGVkV2l0aEVycm9ycwEBBTRJdGVtQ29tcGxldGVkAQEFKEl0ZW1GYWlsZWQBAAQUZXJyb3IFATBEaXNwYXRjaGVkQXMBAAQYcmVzdWx0GQEUUHJveHkBAhQ0UHJveHlFeGVjdXRlZAEABBhyZXN1bHQZASxQdXJlQ3JlYXRlZAEAEBBwdXJlAAx3aG8AKHByb3h5X3R5cGXpAVBkaXNhbWJpZ3VhdGlvbl9pbmRleAQkQW5ub3VuY2VkAQAMEHJlYWwAFHByb3h5ACRjYWxsX2hhc2ggKFByb3h5QWRkZWQBABAkZGVsZWdhdG9yACRkZWxlZ2F0ZWUAKHByb3h5X3R5cGXpARRkZWxheQQwUHJveHlSZW1vdmVkAQAQJGRlbGVnYXRvcgAkZGVsZWdhdGVlAChwcm94eV90eXBl6QEUZGVsYXkEIE11bHRpc2lnAQIQLE5ld011bHRpc2lnAQAMJGFwcHJvdmluZwAgbXVsdGlzaWcAJGNhbGxfaGFzaCBATXVsdGlzaWdBcHByb3ZhbAEAECRhcHByb3ZpbmcAJHRpbWVwb2ludPEBIG11bHRpc2lnACRjYWxsX2hhc2ggQE11bHRpc2lnRXhlY3V0ZWQBABQkYXBwcm92aW5nACR0aW1lcG9pbnTxASBtdWx0aXNpZwAkY2FsbF9oYXNoIBhyZXN1bHQZAURNdWx0aXNpZ0NhbmNlbGxlZAEAEChjYW5jZWxsaW5nACR0aW1lcG9pbnTxASBtdWx0aXNpZwAkY2FsbF9oYXNoICBCb3VudGllcwECLDhCb3VudHlQcm9wb3NlZAEABBRpbmRleAQ4Qm91bnR5UmVqZWN0ZWQBAAgUaW5kZXgEEGJvbmQISEJvdW50eUJlY2FtZUFjdGl2ZQEABBRpbmRleAQ0Qm91bnR5QXdhcmRlZAEACBRpbmRleAQsYmVuZWZpY2lhcnkANEJvdW50eUNsYWltZWQBAAwUaW5kZXgEGHBheW91dAgsYmVuZWZpY2lhcnkAOEJvdW50eUNhbmNlbGVkAQAEFGluZGV4BDhCb3VudHlFeHRlbmRlZAEABBRpbmRleAQ4Qm91bnR5QXBwcm92ZWQBAAQUaW5kZXgEPEN1cmF0b3JQcm9wb3NlZAEACCRib3VudHlfaWQEHGN1cmF0b3IAREN1cmF0b3JVbmFzc2lnbmVkAQAEJGJvdW50eV9pZAQ8Q3VyYXRvckFjY2VwdGVkAQAIJGJvdW50eV9pZAQcY3VyYXRvcgA0Q2hpbGRCb3VudGllcwECEBRBZGRlZAEACBRpbmRleAQsY2hpbGRfaW5kZXgEHEF3YXJkZWQBAAwUaW5kZXgELGNoaWxkX2luZGV4BCxiZW5lZmljaWFyeQAcQ2xhaW1lZAEAEBRpbmRleAQsY2hpbGRfaW5kZXgEGHBheW91dAgsYmVuZWZpY2lhcnkAIENhbmNlbGVkAQAIFGluZGV4BCxjaGlsZF9pbmRleARoRWxlY3Rpb25Qcm92aWRlck11bHRpUGhhc2UBAhg4U29sdXRpb25TdG9yZWQBAAwcY29tcHV0ZQECGG9yaWdpbgUCMHByZXZfZWplY3RlZBRERWxlY3Rpb25GaW5hbGl6ZWQBAAgcY29tcHV0ZQECFHNjb3JlCQI4RWxlY3Rpb25GYWlsZWQBAQUgUmV3YXJkZWQBAAgcYWNjb3VudAAUdmFsdWUIHFNsYXNoZWQBAAgcYWNjb3VudAAUdmFsdWUIRFBoYXNlVHJhbnNpdGlvbmVkAQAMEGZyb20RAgh0bxECFHJvdW5kBCRWb3Rlckxpc3QBAgggUmViYWdnZWQBAAwMd2hvABBmcm9tCAh0bwgwU2NvcmVVcGRhdGVkAQAIDHdobwAkbmV3X3Njb3JlCDxOb21pbmF0aW9uUG9vbHMBAkgcQ3JlYXRlZAEACCRkZXBvc2l0b3IAHHBvb2xfaWQEGEJvbmRlZAEAEBhtZW1iZXIAHHBvb2xfaWQEGGJvbmRlZAgYam9pbmVkFBxQYWlkT3V0AQAMGG1lbWJlcgAccG9vbF9pZAQYcGF5b3V0CCBVbmJvbmRlZAEAFBhtZW1iZXIAHHBvb2xfaWQEHGJhbGFuY2UIGHBvaW50cwgMZXJhBCRXaXRoZHJhd24BABAYbWVtYmVyABxwb29sX2lkBBxiYWxhbmNlCBhwb2ludHMIJERlc3Ryb3llZAEABBxwb29sX2lkBDBTdGF0ZUNoYW5nZWQBAAgccG9vbF9pZAQkbmV3X3N0YXRlHQI0TWVtYmVyUmVtb3ZlZAEACBxwb29sX2lkBBhtZW1iZXIAMFJvbGVzVXBkYXRlZAEADBByb290BQIcYm91bmNlcgUCJG5vbWluYXRvcgUCLFBvb2xTbGFzaGVkAQAIHHBvb2xfaWQEHGJhbGFuY2UIUFVuYm9uZGluZ1Bvb2xTbGFzaGVkAQAMHHBvb2xfaWQEDGVyYQQcYmFsYW5jZQhUUG9vbENvbW1pc3Npb25VcGRhdGVkAQAIHHBvb2xfaWQEHGN1cnJlbnQlAmBQb29sTWF4Q29tbWlzc2lvblVwZGF0ZWQBAAgccG9vbF9pZAQ4bWF4X2NvbW1pc3Npb24EfFBvb2xDb21taXNzaW9uQ2hhbmdlUmF0ZVVwZGF0ZWQBAAgccG9vbF9pZAQsY2hhbmdlX3JhdGUpApBQb29sQ29tbWlzc2lvbkNsYWltUGVybWlzc2lvblVwZGF0ZWQBAAgccG9vbF9pZAQocGVybWlzc2lvbjECVFBvb2xDb21taXNzaW9uQ2xhaW1lZAEACBxwb29sX2lkBChjb21taXNzaW9uCGRNaW5CYWxhbmNlRGVmaWNpdEFkanVzdGVkAQAIHHBvb2xfaWQEGGFtb3VudAhgTWluQmFsYW5jZUV4Y2Vzc0FkanVzdGVkAQAIHHBvb2xfaWQEGGFtb3VudAgsRmFzdFVuc3Rha2UBAhQgVW5zdGFrZWQBAAgUc3Rhc2gAGHJlc3VsdBkBHFNsYXNoZWQBAAgUc3Rhc2gAGGFtb3VudAgwQmF0Y2hDaGVja2VkAQAEEGVyYXM5AjRCYXRjaEZpbmlzaGVkAQAEEHNpemUENEludGVybmFsRXJyb3IBAQU0UGFyYUluY2x1c2lvbgECEDxDYW5kaWRhdGVCYWNrZWQBAxBJAiQEBERDYW5kaWRhdGVJbmNsdWRlZAEDEEkCJAQERENhbmRpZGF0ZVRpbWVkT3V0AQMMSQIkBFhVcHdhcmRNZXNzYWdlc1JlY2VpdmVkAQAIEGZyb20EFGNvdW50BBRQYXJhcwECIEhDdXJyZW50Q29kZVVwZGF0ZWQBAQJIQ3VycmVudEhlYWRVcGRhdGVkAQECUENvZGVVcGdyYWRlU2NoZWR1bGVkAQECME5ld0hlYWROb3RlZAEBAjBBY3Rpb25RdWV1ZWQBBAQBCDxQdmZDaGVja1N0YXJ0ZWQBAwggBEBQdmZDaGVja0FjY2VwdGVkAQMIIARAUHZmQ2hlY2tSZWplY3RlZAEDCCAEEEhybXABAhxQT3BlbkNoYW5uZWxSZXF1ZXN0ZWQBABAYc2VuZGVyBCRyZWNpcGllbnQEVHByb3Bvc2VkX21heF9jYXBhY2l0eQRkcHJvcG9zZWRfbWF4X21lc3NhZ2Vfc2l6ZQRMT3BlbkNoYW5uZWxDYW5jZWxlZAEACDBieV9wYXJhY2hhaW4EKGNoYW5uZWxfaWRVAkxPcGVuQ2hhbm5lbEFjY2VwdGVkAQAIGHNlbmRlcgQkcmVjaXBpZW50BDRDaGFubmVsQ2xvc2VkAQAIMGJ5X3BhcmFjaGFpbgQoY2hhbm5lbF9pZFUCWEhybXBDaGFubmVsRm9yY2VPcGVuZWQBABAYc2VuZGVyBCRyZWNpcGllbnQEVHByb3Bvc2VkX21heF9jYXBhY2l0eQRkcHJvcG9zZWRfbWF4X21lc3NhZ2Vfc2l6ZQRcSHJtcFN5c3RlbUNoYW5uZWxPcGVuZWQBABAYc2VuZGVyBCRyZWNpcGllbnQEVHByb3Bvc2VkX21heF9jYXBhY2l0eQRkcHJvcG9zZWRfbWF4X21lc3NhZ2Vfc2l6ZQRoT3BlbkNoYW5uZWxEZXBvc2l0c1VwZGF0ZWQBAAgYc2VuZGVyBCRyZWNpcGllbnQENFBhcmFzRGlzcHV0ZXMBAgxARGlzcHV0ZUluaXRpYXRlZAEDCCBdAkBEaXNwdXRlQ29uY2x1ZGVkAQMIIGECGFJldmVydAEBAiBPbkRlbWFuZAECCExPbkRlbWFuZE9yZGVyUGxhY2VkAQAMHHBhcmFfaWQEKHNwb3RfcHJpY2UIKG9yZGVyZWRfYnkAMFNwb3RQcmljZVNldAEABChzcG90X3ByaWNlCCRSZWdpc3RyYXIBAhAoUmVnaXN0ZXJlZAEACBxwYXJhX2lkBBxtYW5hZ2VyADBEZXJlZ2lzdGVyZWQBAAQccGFyYV9pZAQgUmVzZXJ2ZWQBAAgccGFyYV9pZAQMd2hvABxTd2FwcGVkAQAIHHBhcmFfaWQEIG90aGVyX2lkBBRTbG90cwECCDhOZXdMZWFzZVBlcmlvZAEABDBsZWFzZV9wZXJpb2QEGExlYXNlZAEAGBxwYXJhX2lkBBhsZWFzZXIAMHBlcmlvZF9iZWdpbgQwcGVyaW9kX2NvdW50BDhleHRyYV9yZXNlcnZlZAgwdG90YWxfYW1vdW50CCBBdWN0aW9ucwECHDhBdWN0aW9uU3RhcnRlZAEADDRhdWN0aW9uX2luZGV4BDBsZWFzZV9wZXJpb2QEGGVuZGluZwQ0QXVjdGlvbkNsb3NlZAEABDRhdWN0aW9uX2luZGV4BCBSZXNlcnZlZAEADBhiaWRkZXIAOGV4dHJhX3Jlc2VydmVkCDB0b3RhbF9hbW91bnQIKFVucmVzZXJ2ZWQBAAgYYmlkZGVyABhhbW91bnQISFJlc2VydmVDb25maXNjYXRlZAEADBxwYXJhX2lkBBhsZWFzZXIAGGFtb3VudAgsQmlkQWNjZXB0ZWQBABQYYmlkZGVyABxwYXJhX2lkBBhhbW91bnQIKGZpcnN0X3Nsb3QEJGxhc3Rfc2xvdAQ0V2lubmluZ09mZnNldAEACDRhdWN0aW9uX2luZGV4BDBibG9ja19udW1iZXIEJENyb3dkbG9hbgECKBxDcmVhdGVkAQAEHHBhcmFfaWQELENvbnRyaWJ1dGVkAQAMDHdobwAoZnVuZF9pbmRleAQYYW1vdW50CCBXaXRoZHJldwEADAx3aG8AKGZ1bmRfaW5kZXgEGGFtb3VudAhEUGFydGlhbGx5UmVmdW5kZWQBAAQccGFyYV9pZAQsQWxsUmVmdW5kZWQBAAQccGFyYV9pZAQkRGlzc29sdmVkAQAEHHBhcmFfaWQEPEhhbmRsZUJpZFJlc3VsdAEACBxwYXJhX2lkBBhyZXN1bHQZARhFZGl0ZWQBAAQccGFyYV9pZAQsTWVtb1VwZGF0ZWQBAAwMd2hvABxwYXJhX2lkBBBtZW1vJDxBZGRlZFRvTmV3UmFpc2UBAAQccGFyYV9pZAQgQ29yZXRpbWUBAghQUmV2ZW51ZUluZm9SZXF1ZXN0ZWQBAAQQd2hlbgQwQ29yZUFzc2lnbmVkAQAEEGNvcmUESFN0YXRlVHJpZU1pZ3JhdGlvbgECECBNaWdyYXRlZAEADAx0b3AEFGNoaWxkBBxjb21wdXRlgQIcU2xhc2hlZAEACAx3aG8AGGFtb3VudAhUQXV0b01pZ3JhdGlvbkZpbmlzaGVkAQEFGEhhbHRlZAEABBRlcnJvcuQkWGNtUGFsbGV0AQJgJEF0dGVtcHRlZAEABBxvdXRjb21ljQIQU2VudAEAEBhvcmlnaW55ASxkZXN0aW5hdGlvbnkBHG1lc3NhZ2X5AihtZXNzYWdlX2lkIEhVbmV4cGVjdGVkUmVzcG9uc2UBAAgYb3JpZ2lueQEgcXVlcnlfaWQINFJlc3BvbnNlUmVhZHkBAAggcXVlcnlfaWQIIHJlc3BvbnNluQIgTm90aWZpZWQBAAwgcXVlcnlfaWQIMHBhbGxldF9pbmRleAQoY2FsbF9pbmRleARATm90aWZ5T3ZlcndlaWdodAEAFCBxdWVyeV9pZAgwcGFsbGV0X2luZGV4BChjYWxsX2luZGV4BDRhY3R1YWxfd2VpZ2h0GExtYXhfYnVkZ2V0ZWRfd2VpZ2h0GExOb3RpZnlEaXNwYXRjaEVycm9yAQAMIHF1ZXJ5X2lkCDBwYWxsZXRfaW5kZXgEKGNhbGxfaW5kZXgESE5vdGlmeURlY29kZUZhaWxlZAEADCBxdWVyeV9pZAgwcGFsbGV0X2luZGV4BChjYWxsX2luZGV4BEBJbnZhbGlkUmVzcG9uZGVyAQAMGG9yaWdpbnkBIHF1ZXJ5X2lkCERleHBlY3RlZF9sb2NhdGlvbr0CXEludmFsaWRSZXNwb25kZXJWZXJzaW9uAQAIGG9yaWdpbnkBIHF1ZXJ5X2lkCDRSZXNwb25zZVRha2VuAQAEIHF1ZXJ5X2lkCDRBc3NldHNUcmFwcGVkAQAMEGhhc2ggGG9yaWdpbnkBGGFzc2V0cxkDVFZlcnNpb25DaGFuZ2VOb3RpZmllZAEAECxkZXN0aW5hdGlvbnkBGHJlc3VsdAQQY29zdKECKG1lc3NhZ2VfaWQgXFN1cHBvcnRlZFZlcnNpb25DaGFuZ2VkAQAIIGxvY2F0aW9ueQEcdmVyc2lvbgRQTm90aWZ5VGFyZ2V0U2VuZEZhaWwBAAwgbG9jYXRpb255ASBxdWVyeV9pZAgUZXJyb3KJAmROb3RpZnlUYXJnZXRNaWdyYXRpb25GYWlsAQAIIGxvY2F0aW9umQEgcXVlcnlfaWQIVEludmFsaWRRdWVyaWVyVmVyc2lvbgEACBhvcmlnaW55ASBxdWVyeV9pZAg4SW52YWxpZFF1ZXJpZXIBABAYb3JpZ2lueQEgcXVlcnlfaWQIQGV4cGVjdGVkX3F1ZXJpZXJ5AVBtYXliZV9hY3R1YWxfcXVlcmllcr0CUFZlcnNpb25Ob3RpZnlTdGFydGVkAQAMLGRlc3RpbmF0aW9ueQEQY29zdKECKG1lc3NhZ2VfaWQgWFZlcnNpb25Ob3RpZnlSZXF1ZXN0ZWQBAAwsZGVzdGluYXRpb255ARBjb3N0oQIobWVzc2FnZV9pZCBgVmVyc2lvbk5vdGlmeVVucmVxdWVzdGVkAQAMLGRlc3RpbmF0aW9ueQEQY29zdKECKG1lc3NhZ2VfaWQgIEZlZXNQYWlkAQAIGHBheWluZ3kBEGZlZXOhAjRBc3NldHNDbGFpbWVkAQAMEGhhc2ggGG9yaWdpbnkBGGFzc2V0cxkDYFZlcnNpb25NaWdyYXRpb25GaW5pc2hlZAEABBx2ZXJzaW9uBDBNZXNzYWdlUXVldWUBAhBAUHJvY2Vzc2luZ0ZhaWxlZAEADAhpZCAYb3JpZ2luJQMUZXJyb3IpAyRQcm9jZXNzZWQBABAIaWQgGG9yaWdpbiUDLHdlaWdodF91c2VkGBxzdWNjZXNzFEhPdmVyd2VpZ2h0RW5xdWV1ZWQBABAIaWQgGG9yaWdpbiUDKHBhZ2VfaW5kZXgENG1lc3NhZ2VfaW5kZXgEKFBhZ2VSZWFwZWQBAAgYb3JpZ2luJQMUaW5kZXgEJEFzc2V0UmF0ZQECDEBBc3NldFJhdGVDcmVhdGVkAQAIKGFzc2V0X2tpbmSBARByYXRlCEBBc3NldFJhdGVSZW1vdmVkAQAEKGFzc2V0X2tpbmSBAUBBc3NldFJhdGVVcGRhdGVkAQAMKGFzc2V0X2tpbmSBAQxvbGQIDG5ldwgEIAAADBRwaGFzZTQUZXZlbnQ1Axh0b3BpY3M5AwQ9AwAEDQEAAQEACDBzcGVjX3ZlcnNpb24EJHNwZWNfbmFtZUkDAAgkY29kZV9oYXNoIDRjaGVja192ZXJzaW9uFAAQOGJhc2VfZXh0cmluc2ljGDRtYXhfZXh0cmluc2ljsQEkbWF4X3RvdGFssQEgcmVzZXJ2ZWSxAQAMGG5vcm1hbFUDLG9wZXJhdGlvbmFsVQMkbWFuZGF0b3J5VQMADChiYXNlX2Jsb2NrGCRtYXhfYmxvY2sYJHBlcl9jbGFzc1kDAAwYbm9ybWFsBCxvcGVyYXRpb25hbAQkbWFuZGF0b3J5BAAIEHJlYWQIFHdyaXRlCAMIkQIEBGkDAAAgJHNwZWNfbmFtZUkDJGltcGxfbmFtZUkDRGF1dGhvcmluZ192ZXJzaW9uBDBzcGVjX3ZlcnNpb24EMGltcGxfdmVyc2lvbgQQYXBpc20DTHRyYW5zYWN0aW9uX3ZlcnNpb24ENHN0YXRlX3ZlcnNpb24EBCQBCAR1AwAEJAAGDQECDBBSb290AQEFGFNpZ25lZAEBARBOb25lAQEFAjwwU3Rha2luZ0FkbWluAQEFJFRyZWFzdXJlcgEBBTxGZWxsb3dzaGlwQWRtaW4BAQUwR2VuZXJhbEFkbWluAQEFMEF1Y3Rpb25BZG1pbgEBBShMZWFzZUFkbWluAQEFTFJlZmVyZW5kdW1DYW5jZWxsZXIBAQVAUmVmZXJlbmR1bUtpbGxlcgEBBSxTbWFsbFRpcHBlcgEBBSRCaWdUaXBwZXIBAQUwU21hbGxTcGVuZGVyAQEFNE1lZGl1bVNwZW5kZXIBAQUoQmlnU3BlbmRlcgEBBURXaGl0ZWxpc3RlZENhbGxlcgEBBTRXaXNoRm9yQ2hhbmdlAQEFAgQkUGFyYWNoYWluAQECAggMWGNtAQAIHHBhcmVudHMEIGludGVyaW9ydQEgUmVzcG9uc2UBAAgccGFyZW50cwQgaW50ZXJpb3J1AQIUGHN5c3RlbQECDBBSb290AQEFGFNpZ25lZAEBARBOb25lAQEFHE9yaWdpbnMBAjwwU3Rha2luZ0FkbWluAQEFJFRyZWFzdXJlcgEBBTxGZWxsb3dzaGlwQWRtaW4BAQUwR2VuZXJhbEFkbWluAQEFMEF1Y3Rpb25BZG1pbgEBBShMZWFzZUFkbWluAQEFTFJlZmVyZW5kdW1DYW5jZWxsZXIBAQVAUmVmZXJlbmR1bUtpbGxlcgEBBSxTbWFsbFRpcHBlcgEBBSRCaWdUaXBwZXIBAQUwU21hbGxTcGVuZGVyAQEFNE1lZGl1bVNwZW5kZXIBAQUoQmlnU3BlbmRlcgEBBURXaGl0ZWxpc3RlZENhbGxlcgEBBTRXaXNoRm9yQ2hhbmdlAQEFQFBhcmFjaGFpbnNPcmlnaW4BAgQkUGFyYWNoYWluAQECJFhjbVBhbGxldAECCAxYY20BAAgccGFyZW50cwQgaW50ZXJpb3J1ASBSZXNwb25zZQEACBxwYXJlbnRzBCBpbnRlcmlvcnUBEFZvaWQBAQUAFCBtYXliZV9pZBEBIHByaW9yaXR5BBBjYWxspQE4bWF5YmVfcGVyaW9kaWOBAxhvcmlnaW6VAwaZAwSdAwAADDR0b3RhbF9yZXRyaWVzBCRyZW1haW5pbmcEGHBlcmlvZAQCLBhyZW1hcmsBAAQYcmVtYXJrJDhzZXRfaGVhcF9wYWdlcwEABBRwYWdlcwggc2V0X2NvZGUBAAQQY29kZSRcc2V0X2NvZGVfd2l0aG91dF9jaGVja3MBAAQQY29kZSQsc2V0X3N0b3JhZ2UBAAQUaXRlbXN5AzBraWxsX3N0b3JhZ2UBAAQQa2V5c30DLGtpbGxfcHJlZml4AQAIGHByZWZpeCQcc3Via2V5cwREcmVtYXJrX3dpdGhfZXZlbnQBAAQYcmVtYXJrJERhdXRob3JpemVfdXBncmFkZQEABCRjb2RlX2hhc2gggGF1dGhvcml6ZV91cGdyYWRlX3dpdGhvdXRfY2hlY2tzAQAEJGNvZGVfaGFzaCBgYXBwbHlfYXV0aG9yaXplZF91cGdyYWRlAQAEEGNvZGUkAiggc2NoZWR1bGUBABAQd2hlbgQ4bWF5YmVfcGVyaW9kaWOBAyBwcmlvcml0eQQQY2FsbN0GGGNhbmNlbAEACBB3aGVuBBRpbmRleAQ4c2NoZWR1bGVfbmFtZWQBABQIaWQgEHdoZW4EOG1heWJlX3BlcmlvZGljgQMgcHJpb3JpdHkEEGNhbGzdBjBjYW5jZWxfbmFtZWQBAAQIaWQgOHNjaGVkdWxlX2FmdGVyAQAQFGFmdGVyBDhtYXliZV9wZXJpb2RpY4EDIHByaW9yaXR5BBBjYWxs3QZQc2NoZWR1bGVfbmFtZWRfYWZ0ZXIBABQIaWQgFGFmdGVyBDhtYXliZV9wZXJpb2RpY4EDIHByaW9yaXR5BBBjYWxs3QYkc2V0X3JldHJ5AQAMEHRhc2sNARxyZXRyaWVzBBhwZXJpb2QEPHNldF9yZXRyeV9uYW1lZAEADAhpZCAccmV0cmllcwQYcGVyaW9kBDBjYW5jZWxfcmV0cnkBAAQQdGFzaw0BSGNhbmNlbF9yZXRyeV9uYW1lZAEABAhpZCACFDRub3RlX3ByZWltYWdlAQAEFGJ5dGVzJDx1bm5vdGVfcHJlaW1hZ2UBAAQQaGFzaCBAcmVxdWVzdF9wcmVpbWFnZQEABBBoYXNoIEh1bnJlcXVlc3RfcHJlaW1hZ2UBAAQQaGFzaCA4ZW5zdXJlX3VwZGF0ZWQBAAQYaGFzaGVzOQMAFCxwYXJlbnRfaGFzaCAYbnVtYmVyBChzdGF0ZV9yb290IDxleHRyaW5zaWNzX3Jvb3QgGGRpZ2VzdDAAECBvZmZlbmRlciAQc2xvdAgwZmlyc3RfaGVhZGVytQM0c2Vjb25kX2hlYWRlcrUDAAwcc2Vzc2lvbgQodHJpZV9ub2Rlc30DPHZhbGlkYXRvcl9jb3VudAQECAEIAgwwUHJpbWFyeVNsb3RzAQEFdFByaW1hcnlBbmRTZWNvbmRhcnlQbGFpblNsb3RzAQEFbFByaW1hcnlBbmRTZWNvbmRhcnlWUkZTbG90cwEBBQIECFYxAQAIBGPBAzRhbGxvd2VkX3Nsb3RzxQMCDExyZXBvcnRfZXF1aXZvY2F0aW9uAQAISGVxdWl2b2NhdGlvbl9wcm9vZrkDPGtleV9vd25lcl9wcm9vZr0DcHJlcG9ydF9lcXVpdm9jYXRpb25fdW5zaWduZWQBAAhIZXF1aXZvY2F0aW9uX3Byb29muQM8a2V5X293bmVyX3Byb29mvQNIcGxhbl9jb25maWdfY2hhbmdlAQAEGGNvbmZpZ8kDAgQMc2V0AQAEDG5vdwgCFAhJZAEBARRJbmRleAEBBQxSYXcBBQAkQWRkcmVzczMyAQUBgCRBZGRyZXNzMjABBQFQAhQUY2xhaW0BAAQUaW5kZXgEIHRyYW5zZmVyAQAIDG5ld9UDFGluZGV4BBBmcmVlAQAEFGluZGV4BDhmb3JjZV90cmFuc2ZlcgEADAxuZXfVAxRpbmRleAQYZnJlZXplFBhmcmVlemUBAAQUaW5kZXgEBAAAAgggSW5jcmVhc2UBAQUgRGVjcmVhc2UBAQUCJFB0cmFuc2Zlcl9hbGxvd19kZWF0aAEACBBkZXN01QMUdmFsdWUIOGZvcmNlX3RyYW5zZmVyAQAMGHNvdXJjZdUDEGRlc3TVAxR2YWx1ZQhMdHJhbnNmZXJfa2VlcF9hbGl2ZQEACBBkZXN01QMUdmFsdWUIMHRyYW5zZmVyX2FsbAEACBBkZXN01QMoa2VlcF9hbGl2ZRQ8Zm9yY2VfdW5yZXNlcnZlAQAIDHdob9UDGGFtb3VudAhAdXBncmFkZV9hY2NvdW50cwEABAx3aG/dA0Rmb3JjZV9zZXRfYmFsYW5jZQEACAx3aG/VAyBuZXdfZnJlZQhsZm9yY2VfYWRqdXN0X3RvdGFsX2lzc3VhbmNlAQAIJGRpcmVjdGlvbuEDFGRlbHRhCBBidXJuAQAIFHZhbHVlCChrZWVwX2FsaXZlFATVAwACDBBOb29wAQEFDFNldAEBAxhSZW1vdmUBAQUCDBBOb29wAQEFDFNldAEBAhhSZW1vdmUBAQUGCAAIFHZhbHVlCAxlcmEEBPkDAAb9AwJ4EGJvbmQBAAgUdmFsdWUIFHBheWVlNQEoYm9uZF9leHRyYQEABDhtYXhfYWRkaXRpb25hbAgYdW5ib25kAQAEFHZhbHVlCER3aXRoZHJhd191bmJvbmRlZAEABEhudW1fc2xhc2hpbmdfc3BhbnMEIHZhbGlkYXRlAQAEFHByZWZzOQEgbm9taW5hdGUBAAQcdGFyZ2V0c+kDFGNoaWxsAQEFJHNldF9wYXllZQEABBRwYXllZTUBOHNldF9jb250cm9sbGVyAQEFTHNldF92YWxpZGF0b3JfY291bnQBAAQMbmV3BGBpbmNyZWFzZV92YWxpZGF0b3JfY291bnQBAAQoYWRkaXRpb25hbARUc2NhbGVfdmFsaWRhdG9yX2NvdW50AQAEGGZhY3RvcgQ0Zm9yY2Vfbm9fZXJhcwEBBTRmb3JjZV9uZXdfZXJhAQEFRHNldF9pbnZ1bG5lcmFibGVzAQAENGludnVsbmVyYWJsZXPdAzRmb3JjZV91bnN0YWtlAQAIFHN0YXNoAEhudW1fc2xhc2hpbmdfc3BhbnMEUGZvcmNlX25ld19lcmFfYWx3YXlzAQEFVGNhbmNlbF9kZWZlcnJlZF9zbGFzaAEACAxlcmEENHNsYXNoX2luZGljZXM5AjhwYXlvdXRfc3Rha2VycwEACDx2YWxpZGF0b3Jfc3Rhc2gADGVyYQQYcmVib25kAQAEFHZhbHVlCChyZWFwX3N0YXNoAQAIFHN0YXNoAEhudW1fc2xhc2hpbmdfc3BhbnMEEGtpY2sBAAQMd2hv6QNMc2V0X3N0YWtpbmdfY29uZmlncwEAHEhtaW5fbm9taW5hdG9yX2JvbmTtA0htaW5fdmFsaWRhdG9yX2JvbmTtA0xtYXhfbm9taW5hdG9yX2NvdW508QNMbWF4X3ZhbGlkYXRvcl9jb3VudPEDPGNoaWxsX3RocmVzaG9sZPEDOG1pbl9jb21taXNzaW9u8QNIbWF4X3N0YWtlZF9yZXdhcmRz8QMsY2hpbGxfb3RoZXIBAAQUc3Rhc2gAaGZvcmNlX2FwcGx5X21pbl9jb21taXNzaW9uAQAEPHZhbGlkYXRvcl9zdGFzaABIc2V0X21pbl9jb21taXNzaW9uAQAEDG5ldwRYcGF5b3V0X3N0YWtlcnNfYnlfcGFnZQEADDx2YWxpZGF0b3Jfc3Rhc2gADGVyYQQQcGFnZQQwdXBkYXRlX3BheWVlAQAEKGNvbnRyb2xsZXIAaGRlcHJlY2F0ZV9jb250cm9sbGVyX2JhdGNoAQAELGNvbnRyb2xsZXJz3QM4cmVzdG9yZV9sZWRnZXIBABAUc3Rhc2gAQG1heWJlX2NvbnRyb2xsZXIFAixtYXliZV90b3RhbPUDPG1heWJlX3VubG9ja2luZwEEBQGEABgcZ3JhbmRwYSAQYmFiZSA4cGFyYV92YWxpZGF0b3IgPHBhcmFfYXNzaWdubWVudCBMYXV0aG9yaXR5X2Rpc2NvdmVyeSAUYmVlZnkJBAIIIHNldF9rZXlzAQAIEGtleXMNBBRwcm9vZiQocHVyZ2Vfa2V5cwEBBQAILHRhcmdldF9oYXNoIDR0YXJnZXRfbnVtYmVyBAMIFQRBAgAQMHJvdW5kX251bWJlcgggaWRlbnRpdHkgFGZpcnN0GQQYc2Vjb25kGQQCCBxQcmV2b3RlAQAQMHJvdW5kX251bWJlcgggaWRlbnRpdHkgFGZpcnN0GQQYc2Vjb25kGQQkUHJlY29tbWl0AQAQMHJvdW5kX251bWJlcgggaWRlbnRpdHkgFGZpcnN0GQQYc2Vjb25kGQQACBhzZXRfaWQIMGVxdWl2b2NhdGlvbiEEAgxMcmVwb3J0X2VxdWl2b2NhdGlvbgEACEhlcXVpdm9jYXRpb25fcHJvb2YlBDxrZXlfb3duZXJfcHJvb2a9A3ByZXBvcnRfZXF1aXZvY2F0aW9uX3Vuc2lnbmVkAQAISGVxdWl2b2NhdGlvbl9wcm9vZiUEPGtleV9vd25lcl9wcm9vZr0DMG5vdGVfc3RhbGxlZAEACBRkZWxheQRsYmVzdF9maW5hbGl6ZWRfYmxvY2tfbnVtYmVyBAYEAhgsc3BlbmRfbG9jYWwBAAgYYW1vdW50CCxiZW5lZmljaWFyedUDPHJlbW92ZV9hcHByb3ZhbAEABCxwcm9wb3NhbF9pZAQUc3BlbmQBABAoYXNzZXRfa2luZIEBGGFtb3VudAgsYmVuZWZpY2lhcnmZASh2YWxpZF9mcm9tLQQYcGF5b3V0AQAEFGluZGV4BDBjaGVja19zdGF0dXMBAAQUaW5kZXgEKHZvaWRfc3BlbmQBAAQUaW5kZXgEAgwgU3RhbmRhcmQBAAgQdm90ZQQcYmFsYW5jZQgUU3BsaXQBAAgMYXllCAxuYXkIMFNwbGl0QWJzdGFpbgEADAxheWUIDG5heQgcYWJzdGFpbggCHBBOb25lAQEFIExvY2tlZDF4AQEFIExvY2tlZDJ4AQEFIExvY2tlZDN4AQEFIExvY2tlZDR4AQEFIExvY2tlZDV4AQEFIExvY2tlZDZ4AQEFAhgQdm90ZQEACChwb2xsX2luZGV4BBB2b3RlNQQgZGVsZWdhdGUBABAUY2xhc3MECHRv1QMoY29udmljdGlvbjkEHGJhbGFuY2UIKHVuZGVsZWdhdGUBAAQUY2xhc3MEGHVubG9jawEACBRjbGFzcwQYdGFyZ2V01QMscmVtb3ZlX3ZvdGUBAAgUY2xhc3MtBBRpbmRleAREcmVtb3ZlX290aGVyX3ZvdGUBAAwYdGFyZ2V01QMUY2xhc3MEFGluZGV4BAIICEF0AQECFEFmdGVyAQECAiQYc3VibWl0AQAMPHByb3Bvc2FsX29yaWdpbpUDIHByb3Bvc2FspQFAZW5hY3RtZW50X21vbWVudEEEWHBsYWNlX2RlY2lzaW9uX2RlcG9zaXQBAAQUaW5kZXgEXHJlZnVuZF9kZWNpc2lvbl9kZXBvc2l0AQAEFGluZGV4BBhjYW5jZWwBAAQUaW5kZXgEEGtpbGwBAAQUaW5kZXgEQG51ZGdlX3JlZmVyZW5kdW0BAAQUaW5kZXgESG9uZV9mZXdlcl9kZWNpZGluZwEABBR0cmFjawRkcmVmdW5kX3N1Ym1pc3Npb25fZGVwb3NpdAEABBRpbmRleAQwc2V0X21ldGFkYXRhAQAIFGluZGV4BChtYXliZV9oYXNoEQECEDh3aGl0ZWxpc3RfY2FsbAEABCRjYWxsX2hhc2ggXHJlbW92ZV93aGl0ZWxpc3RlZF9jYWxsAQAEJGNhbGxfaGFzaCBkZGlzcGF0Y2hfd2hpdGVsaXN0ZWRfY2FsbAEADCRjYWxsX2hhc2ggQGNhbGxfZW5jb2RlZF9sZW4ETGNhbGxfd2VpZ2h0X3dpdG5lc3MYnGRpc3BhdGNoX3doaXRlbGlzdGVkX2NhbGxfd2l0aF9wcmVpbWFnZQEABBBjYWxs3QYGFAIUME1pbkluZmxhdGlvbgEE9QMBBDBNYXhJbmZsYXRpb24BBPUDAQQoSWRlYWxTdGFrZQEE9QMBBBxGYWxsb2ZmAQT1AwEEPFVzZUF1Y3Rpb25TbG90cwEETQQBBAIEJEluZmxhdGlvbgECFDBNaW5JbmZsYXRpb24BBPUDAQQwTWF4SW5mbGF0aW9uAQT1AwEEKElkZWFsU3Rha2UBBPUDAQQcRmFsbG9mZgEE9QMBBDxVc2VBdWN0aW9uU2xvdHMBBE0EAQQCBDRzZXRfcGFyYW1ldGVyAQAEJGtleV92YWx1ZVUEBQEFAQMMCAgEBmEEAggcUmVndWxhcgEBBRBTYWZ0AQEFBmkEAhQUY2xhaW0BAAgQZGVzdABIZXRoZXJldW1fc2lnbmF0dXJlXQQobWludF9jbGFpbQEAEAx3aG9lARR2YWx1ZQhAdmVzdGluZ19zY2hlZHVsZWUEJHN0YXRlbWVudG0EMGNsYWltX2F0dGVzdAEADBBkZXN0AEhldGhlcmV1bV9zaWduYXR1cmVdBCRzdGF0ZW1lbnQkGGF0dGVzdAEABCRzdGF0ZW1lbnQkKG1vdmVfY2xhaW0BAAwMb2xkZQEMbmV3ZQE4bWF5YmVfcHJlY2xhaW0FAgAMGGxvY2tlZAgkcGVyX2Jsb2NrCDhzdGFydGluZ19ibG9jawQCGBB2ZXN0AQEFKHZlc3Rfb3RoZXIBAAQYdGFyZ2V01QM8dmVzdGVkX3RyYW5zZmVyAQAIGHRhcmdldNUDIHNjaGVkdWxldQRUZm9yY2VfdmVzdGVkX3RyYW5zZmVyAQAMGHNvdXJjZdUDGHRhcmdldNUDIHNjaGVkdWxldQQ8bWVyZ2Vfc2NoZWR1bGVzAQAIPHNjaGVkdWxlMV9pbmRleAQ8c2NoZWR1bGUyX2luZGV4BHRmb3JjZV9yZW1vdmVfdmVzdGluZ19zY2hlZHVsZQEACBh0YXJnZXTVAzhzY2hlZHVsZV9pbmRleAQE3QYAAhgUYmF0Y2gBAAQUY2FsbHN9BDRhc19kZXJpdmF0aXZlAQAIFGluZGV4BBBjYWxs3QYkYmF0Y2hfYWxsAQAEFGNhbGxzfQQsZGlzcGF0Y2hfYXMBAAgkYXNfb3JpZ2lulQMQY2FsbN0GLGZvcmNlX2JhdGNoAQAEFGNhbGxzfQQsd2l0aF93ZWlnaHQBAAgQY2FsbN0GGHdlaWdodBgG6QECKBRwcm94eQEADBByZWFs1QNAZm9yY2VfcHJveHlfdHlwZYUEEGNhbGzdBiRhZGRfcHJveHkBAAwgZGVsZWdhdGXVAyhwcm94eV90eXBl6QEUZGVsYXkEMHJlbW92ZV9wcm94eQEADCBkZWxlZ2F0ZdUDKHByb3h5X3R5cGXpARRkZWxheQQ4cmVtb3ZlX3Byb3hpZXMBAQUsY3JlYXRlX3B1cmUBAAwocHJveHlfdHlwZekBFGRlbGF5BBRpbmRleAQka2lsbF9wdXJlAQAUHHNwYXduZXLVAyhwcm94eV90eXBl6QEUaW5kZXgEGGhlaWdodAQkZXh0X2luZGV4BCBhbm5vdW5jZQEACBByZWFs1QMkY2FsbF9oYXNoIExyZW1vdmVfYW5ub3VuY2VtZW50AQAIEHJlYWzVAyRjYWxsX2hhc2ggTHJlamVjdF9hbm5vdW5jZW1lbnQBAAggZGVsZWdhdGXVAyRjYWxsX2hhc2ggPHByb3h5X2Fubm91bmNlZAEAECBkZWxlZ2F0ZdUDEHJlYWzVA0Bmb3JjZV9wcm94eV90eXBlhQQQY2FsbN0GBvEBAhBQYXNfbXVsdGlfdGhyZXNob2xkXzEBAAhEb3RoZXJfc2lnbmF0b3JpZXPdAxBjYWxs3QYgYXNfbXVsdGkBABQkdGhyZXNob2xkBERvdGhlcl9zaWduYXRvcmllc90DPG1heWJlX3RpbWVwb2ludI0EEGNhbGzdBihtYXhfd2VpZ2h0GEBhcHByb3ZlX2FzX211bHRpAQAUJHRocmVzaG9sZAREb3RoZXJfc2lnbmF0b3JpZXPdAzxtYXliZV90aW1lcG9pbnSNBCRjYWxsX2hhc2ggKG1heF93ZWlnaHQYPGNhbmNlbF9hc19tdWx0aQEAECR0aHJlc2hvbGQERG90aGVyX3NpZ25hdG9yaWVz3QMkdGltZXBvaW508QEkY2FsbF9oYXNoIAIkOHByb3Bvc2VfYm91bnR5AQAIFHZhbHVlCCxkZXNjcmlwdGlvbiQ4YXBwcm92ZV9ib3VudHkBAAQkYm91bnR5X2lkBDxwcm9wb3NlX2N1cmF0b3IBAAwkYm91bnR5X2lkBBxjdXJhdG9y1QMMZmVlCEB1bmFzc2lnbl9jdXJhdG9yAQAEJGJvdW50eV9pZAQ4YWNjZXB0X2N1cmF0b3IBAAQkYm91bnR5X2lkBDBhd2FyZF9ib3VudHkBAAgkYm91bnR5X2lkBCxiZW5lZmljaWFyedUDMGNsYWltX2JvdW50eQEABCRib3VudHlfaWQEMGNsb3NlX2JvdW50eQEABCRib3VudHlfaWQEUGV4dGVuZF9ib3VudHlfZXhwaXJ5AQAIJGJvdW50eV9pZAQYcmVtYXJrJAIcQGFkZF9jaGlsZF9ib3VudHkBAAxAcGFyZW50X2JvdW50eV9pZAQUdmFsdWUILGRlc2NyaXB0aW9uJDxwcm9wb3NlX2N1cmF0b3IBABBAcGFyZW50X2JvdW50eV9pZAQ8Y2hpbGRfYm91bnR5X2lkBBxjdXJhdG9y1QMMZmVlCDhhY2NlcHRfY3VyYXRvcgEACEBwYXJlbnRfYm91bnR5X2lkBDxjaGlsZF9ib3VudHlfaWQEQHVuYXNzaWduX2N1cmF0b3IBAAhAcGFyZW50X2JvdW50eV9pZAQ8Y2hpbGRfYm91bnR5X2lkBEhhd2FyZF9jaGlsZF9ib3VudHkBAAxAcGFyZW50X2JvdW50eV9pZAQ8Y2hpbGRfYm91bnR5X2lkBCxiZW5lZmljaWFyedUDSGNsYWltX2NoaWxkX2JvdW50eQEACEBwYXJlbnRfYm91bnR5X2lkBDxjaGlsZF9ib3VudHlfaWQESGNsb3NlX2NoaWxkX2JvdW50eQEACEBwYXJlbnRfYm91bnR5X2lkBDxjaGlsZF9ib3VudHlfaWQEAwgEBASdBAADDASdBAQEpQQABJ0EAQgDDAStBAQEsQQABJ0EAQwDDAS5BAQEvQQABJ0EARADDATFBAQEyQQABJ0EARQDDATRBAQE1QQABJ0EARgDDATdBAQE4QQABJ0EARwDDATpBAQE7QQABJ0EASADDAT1BAQE+QQABJ0EASQDDAQBBQQEBQUABJ0EASgDDAQNBQQEEQUABJ0EASwDDAQZBQQEHQUABJ0EATADDAQlBQQEKQUABJ0EATQDDAQxBQQENQUABJ0EATgDDAQ9BQQEQQUABJ0EATwDDARJBQQETQUAAEAYdm90ZXMxoQQYdm90ZXMyqQQYdm90ZXMztQQYdm90ZXM0wQQYdm90ZXM1zQQYdm90ZXM22QQYdm90ZXM35QQYdm90ZXM48QQYdm90ZXM5/QQcdm90ZXMxMAkFHHZvdGVzMTEVBRx2b3RlczEyIQUcdm90ZXMxMy0FHHZvdGVzMTQ5BRx2b3RlczE1RQUcdm90ZXMxNlEFAAwgc29sdXRpb25VBRRzY29yZQkCFHJvdW5kBAAIGHZvdGVycwQcdGFyZ2V0cwQGCQIDCAAIBGUFAAAIFHRvdGFsCBh2b3RlcnNpBQMIAG0FBHEFAAIUPHN1Ym1pdF91bnNpZ25lZAEACDByYXdfc29sdXRpb25ZBRx3aXRuZXNzXQVsc2V0X21pbmltdW1fdW50cnVzdGVkX3Njb3JlAQAEQG1heWJlX25leHRfc2NvcmVhBXRzZXRfZW1lcmdlbmN5X2VsZWN0aW9uX3Jlc3VsdAEABCBzdXBwb3J0c3UFGHN1Ym1pdAEABDByYXdfc29sdXRpb25ZBUxnb3Zlcm5hbmNlX2ZhbGxiYWNrAQAIQG1heWJlX21heF92b3RlcnMtBERtYXliZV9tYXhfdGFyZ2V0cy0EAgwUcmViYWcBAAQoZGlzbG9jYXRlZNUDPHB1dF9pbl9mcm9udF9vZgEABBxsaWdodGVy1QNUcHV0X2luX2Zyb250X29mX290aGVyAQAIHGhlYXZpZXLVAxxsaWdodGVy1QMCCCxGcmVlQmFsYW5jZQEBAxxSZXdhcmRzAQEFAgwQTm9vcAEBBQxTZXQBAQEYUmVtb3ZlAQEFAhAwUGVybWlzc2lvbmVkAQEFWFBlcm1pc3Npb25sZXNzQ29tcG91bmQBAQVYUGVybWlzc2lvbmxlc3NXaXRoZHJhdwEBBURQZXJtaXNzaW9ubGVzc0FsbAEBBQJoEGpvaW4BAAgYYW1vdW50CBxwb29sX2lkBChib25kX2V4dHJhAQAEFGV4dHJhgQUwY2xhaW1fcGF5b3V0AQEFGHVuYm9uZAEACDhtZW1iZXJfYWNjb3VudNUDQHVuYm9uZGluZ19wb2ludHMIWHBvb2xfd2l0aGRyYXdfdW5ib25kZWQBAAgccG9vbF9pZARIbnVtX3NsYXNoaW5nX3NwYW5zBER3aXRoZHJhd191bmJvbmRlZAEACDhtZW1iZXJfYWNjb3VudNUDSG51bV9zbGFzaGluZ19zcGFucwQYY3JlYXRlAQAQGGFtb3VudAgQcm9vdNUDJG5vbWluYXRvctUDHGJvdW5jZXLVA0xjcmVhdGVfd2l0aF9wb29sX2lkAQAUGGFtb3VudAgQcm9vdNUDJG5vbWluYXRvctUDHGJvdW5jZXLVAxxwb29sX2lkBCBub21pbmF0ZQEACBxwb29sX2lkBCh2YWxpZGF0b3Jz3QMkc2V0X3N0YXRlAQAIHHBvb2xfaWQEFHN0YXRlHQIwc2V0X21ldGFkYXRhAQAIHHBvb2xfaWQEIG1ldGFkYXRhJCxzZXRfY29uZmlncwEAGDRtaW5fam9pbl9ib25k7QM8bWluX2NyZWF0ZV9ib25k7QMkbWF4X3Bvb2xz8QMsbWF4X21lbWJlcnPxA1BtYXhfbWVtYmVyc19wZXJfcG9vbPEDVGdsb2JhbF9tYXhfY29tbWlzc2lvbvEDMHVwZGF0ZV9yb2xlcwEAEBxwb29sX2lkBCBuZXdfcm9vdIUFNG5ld19ub21pbmF0b3KFBSxuZXdfYm91bmNlcoUFFGNoaWxsAQAEHHBvb2xfaWQEQGJvbmRfZXh0cmFfb3RoZXIBAAgYbWVtYmVy1QMUZXh0cmGBBVBzZXRfY2xhaW1fcGVybWlzc2lvbgEABChwZXJtaXNzaW9uiQVIY2xhaW1fcGF5b3V0X290aGVyAQAEFG90aGVyADhzZXRfY29tbWlzc2lvbgEACBxwb29sX2lkBDhuZXdfY29tbWlzc2lvbiUCSHNldF9jb21taXNzaW9uX21heAEACBxwb29sX2lkBDhtYXhfY29tbWlzc2lvbgRoc2V0X2NvbW1pc3Npb25fY2hhbmdlX3JhdGUBAAgccG9vbF9pZAQsY2hhbmdlX3JhdGUpAkBjbGFpbV9jb21taXNzaW9uAQAEHHBvb2xfaWQETGFkanVzdF9wb29sX2RlcG9zaXQBAAQccG9vbF9pZAR8c2V0X2NvbW1pc3Npb25fY2xhaW1fcGVybWlzc2lvbgEACBxwb29sX2lkBChwZXJtaXNzaW9uMQIsYXBwbHlfc2xhc2gBAAQ4bWVtYmVyX2FjY291bnTVA0htaWdyYXRlX2RlbGVnYXRpb24BAAQ4bWVtYmVyX2FjY291bnTVA3htaWdyYXRlX3Bvb2xfdG9fZGVsZWdhdGVfc3Rha2UBAAQccG9vbF9pZAQCDFRyZWdpc3Rlcl9mYXN0X3Vuc3Rha2UBAQUoZGVyZWdpc3RlcgEBBRxjb250cm9sAQAENGVyYXNfdG9fY2hlY2sEAAhMbWF4X2NhbmRpZGF0ZV9kZXB0aARQYWxsb3dlZF9hbmNlc3RyeV9sZW4EAgggUHJlY2hlY2sBAQUcUHJlcGFyZQEBBQIIHEJhY2tpbmcBAQUgQXBwcm92YWwBAQUCHDhNYXhNZW1vcnlQYWdlcwEBAjxTdGFja0xvZ2ljYWxNYXgBAQI4U3RhY2tOYXRpdmVNYXgBAQJQUHJlY2hlY2tpbmdNYXhNZW1vcnkBAQM4UHZmUHJlcFRpbWVvdXQBAwiZBQg4UHZmRXhlY1RpbWVvdXQBAwidBQhEV2FzbUV4dEJ1bGtNZW1vcnkBAQUEoQUAACxgZ3JvdXBfcm90YXRpb25fZnJlcXVlbmN5BGRwYXJhc19hdmFpbGFiaWxpdHlfcGVyaW9kBFxtYXhfdmFsaWRhdG9yc19wZXJfY29yZS0EJGxvb2thaGVhZAQkbnVtX2NvcmVzBGRtYXhfYXZhaWxhYmlsaXR5X3RpbWVvdXRzBGBvbl9kZW1hbmRfcXVldWVfbWF4X3NpemUEiG9uX2RlbWFuZF90YXJnZXRfcXVldWVfdXRpbGl6YXRpb24EZG9uX2RlbWFuZF9mZWVfdmFyaWFiaWxpdHkESG9uX2RlbWFuZF9iYXNlX2ZlZQgMdHRsBALAfHNldF92YWxpZGF0aW9uX3VwZ3JhZGVfY29vbGRvd24BAAQMbmV3BHBzZXRfdmFsaWRhdGlvbl91cGdyYWRlX2RlbGF5AQAEDG5ldwRkc2V0X2NvZGVfcmV0ZW50aW9uX3BlcmlvZAEABAxuZXcERHNldF9tYXhfY29kZV9zaXplAQAEDG5ldwRAc2V0X21heF9wb3Zfc2l6ZQEABAxuZXcEWHNldF9tYXhfaGVhZF9kYXRhX3NpemUBAAQMbmV3BEhzZXRfY29yZXRpbWVfY29yZXMBAAQMbmV3BHRzZXRfbWF4X2F2YWlsYWJpbGl0eV90aW1lb3V0cwEABAxuZXcEcHNldF9ncm91cF9yb3RhdGlvbl9mcmVxdWVuY3kBAAQMbmV3BHRzZXRfcGFyYXNfYXZhaWxhYmlsaXR5X3BlcmlvZAEABAxuZXcEYHNldF9zY2hlZHVsaW5nX2xvb2thaGVhZAEABAxuZXcEbHNldF9tYXhfdmFsaWRhdG9yc19wZXJfY29yZQEABAxuZXctBEhzZXRfbWF4X3ZhbGlkYXRvcnMBAAQMbmV3LQRIc2V0X2Rpc3B1dGVfcGVyaW9kAQAEDG5ldwS0c2V0X2Rpc3B1dGVfcG9zdF9jb25jbHVzaW9uX2FjY2VwdGFuY2VfcGVyaW9kAQAEDG5ldwREc2V0X25vX3Nob3dfc2xvdHMBAAQMbmV3BFBzZXRfbl9kZWxheV90cmFuY2hlcwEABAxuZXcEeHNldF96ZXJvdGhfZGVsYXlfdHJhbmNoZV93aWR0aAEABAxuZXcEUHNldF9uZWVkZWRfYXBwcm92YWxzAQAEDG5ldwRwc2V0X3JlbGF5X3ZyZl9tb2R1bG9fc2FtcGxlcwEABAxuZXcEaHNldF9tYXhfdXB3YXJkX3F1ZXVlX2NvdW50AQAEDG5ldwRkc2V0X21heF91cHdhcmRfcXVldWVfc2l6ZQEABAxuZXcEdHNldF9tYXhfZG93bndhcmRfbWVzc2FnZV9zaXplAQAEDG5ldwRsc2V0X21heF91cHdhcmRfbWVzc2FnZV9zaXplAQAEDG5ldwSgc2V0X21heF91cHdhcmRfbWVzc2FnZV9udW1fcGVyX2NhbmRpZGF0ZQEABAxuZXcEZHNldF9ocm1wX29wZW5fcmVxdWVzdF90dGwBAAQMbmV3BFxzZXRfaHJtcF9zZW5kZXJfZGVwb3NpdAEABAxuZXcIaHNldF9ocm1wX3JlY2lwaWVudF9kZXBvc2l0AQAEDG5ldwh0c2V0X2hybXBfY2hhbm5lbF9tYXhfY2FwYWNpdHkBAAQMbmV3BHxzZXRfaHJtcF9jaGFubmVsX21heF90b3RhbF9zaXplAQAEDG5ldwScc2V0X2hybXBfbWF4X3BhcmFjaGFpbl9pbmJvdW5kX2NoYW5uZWxzAQAEDG5ldwSEc2V0X2hybXBfY2hhbm5lbF9tYXhfbWVzc2FnZV9zaXplAQAEDG5ldwSgc2V0X2hybXBfbWF4X3BhcmFjaGFpbl9vdXRib3VuZF9jaGFubmVscwEABAxuZXcEmHNldF9ocm1wX21heF9tZXNzYWdlX251bV9wZXJfY2FuZGlkYXRlAQAEDG5ldwRIc2V0X3B2Zl92b3RpbmdfdHRsAQAEDG5ldwSQc2V0X21pbmltdW1fdmFsaWRhdGlvbl91cGdyYWRlX2RlbGF5AQAEDG5ldwRwc2V0X2J5cGFzc19jb25zaXN0ZW5jeV9jaGVjawEABAxuZXcUYHNldF9hc3luY19iYWNraW5nX3BhcmFtcwEABAxuZXeVBUxzZXRfZXhlY3V0b3JfcGFyYW1zAQAEDG5ld6UFWHNldF9vbl9kZW1hbmRfYmFzZV9mZWUBAAQMbmV3CHRzZXRfb25fZGVtYW5kX2ZlZV92YXJpYWJpbGl0eQEABAxuZXcEcHNldF9vbl9kZW1hbmRfcXVldWVfbWF4X3NpemUBAAQMbmV3BJhzZXRfb25fZGVtYW5kX3RhcmdldF9xdWV1ZV91dGlsaXphdGlvbgEABAxuZXcERHNldF9vbl9kZW1hbmRfdHRsAQAEDG5ldwRkc2V0X21pbmltdW1fYmFja2luZ192b3RlcwEABAxuZXcEQHNldF9ub2RlX2ZlYXR1cmUBAAgUaW5kZXgEFHZhbHVlFGhzZXRfYXBwcm92YWxfdm90aW5nX3BhcmFtcwEABAxuZXcEUHNldF9zY2hlZHVsZXJfcGFyYW1zAQAEDG5ld6kFAQQADBxwYXlsb2FksQU8dmFsaWRhdG9yX2luZGV4BCRzaWduYXR1cmVBAgS1BQAACCRyZWNpcGllbnQEEGRhdGEkBL0FAAYkABg8dXB3YXJkX21lc3NhZ2VzfQNMaG9yaXpvbnRhbF9tZXNzYWdlc8EFTG5ld192YWxpZGF0aW9uX2NvZGXFBSRoZWFkX2RhdGEkbHByb2Nlc3NlZF9kb3dud2FyZF9tZXNzYWdlcwQ4aHJtcF93YXRlcm1hcmsEAAgoZGVzY3JpcHRvckUCLGNvbW1pdG1lbnRzyQUCCCBJbXBsaWNpdAEFAQEBIEV4cGxpY2l0AQUBAQEE0QUAAAwkY2FuZGlkYXRlzQU4dmFsaWRpdHlfdm90ZXPVBUR2YWxpZGF0b3JfaW5kaWNlc7EFBNkFAAIUIEV4cGxpY2l0AQEFPEJhY2tpbmdTZWNvbmRlZAEFAYAwQmFja2luZ1ZhbGlkAQUBgEBBcHByb3ZhbENoZWNraW5nAQEFiEFwcHJvdmFsQ2hlY2tpbmdNdWx0aXBsZUNhbmRpZGF0ZXMBBCAAAgQgRXhwbGljaXQBAQUCCBRWYWxpZAECFCBFeHBsaWNpdAEBBTxCYWNraW5nU2Vjb25kZWQBBQGAMEJhY2tpbmdWYWxpZAEFAYBAQXBwcm92YWxDaGVja2luZwEBBYhBcHByb3ZhbENoZWNraW5nTXVsdGlwbGVDYW5kaWRhdGVzAQQgABxJbnZhbGlkAQIEIEV4cGxpY2l0AQEFAwzpBQRBAgTtBQAADDhjYW5kaWRhdGVfaGFzaCAcc2Vzc2lvbgQoc3RhdGVtZW50c/EFBPUFAAAQJGJpdGZpZWxkc7kFRGJhY2tlZF9jYW5kaWRhdGVz3QUgZGlzcHV0ZXP5BTRwYXJlbnRfaGVhZGVytQMCBBRlbnRlcgEABBBkYXRh/QUAEBhhY2NlcHQUHHN1YmplY3QgNHNlc3Npb25faW5kZXgEPHZhbGlkYXRvcl9pbmRleAQCJFhmb3JjZV9zZXRfY3VycmVudF9jb2RlAQAIEHBhcmEEIG5ld19jb2RlJFhmb3JjZV9zZXRfY3VycmVudF9oZWFkAQAIEHBhcmEEIG5ld19oZWFkJGxmb3JjZV9zY2hlZHVsZV9jb2RlX3VwZ3JhZGUBAAwQcGFyYQQgbmV3X2NvZGUkTHJlbGF5X3BhcmVudF9udW1iZXIETGZvcmNlX25vdGVfbmV3X2hlYWQBAAgQcGFyYQQgbmV3X2hlYWQkSGZvcmNlX3F1ZXVlX2FjdGlvbgEABBBwYXJhBGxhZGRfdHJ1c3RlZF92YWxpZGF0aW9uX2NvZGUBAAQ8dmFsaWRhdGlvbl9jb2RlJGxwb2tlX3VudXNlZF92YWxpZGF0aW9uX2NvZGUBAARQdmFsaWRhdGlvbl9jb2RlX2hhc2ggbGluY2x1ZGVfcHZmX2NoZWNrX3N0YXRlbWVudAEACBBzdG10BQYkc2lnbmF0dXJlQQJ0Zm9yY2Vfc2V0X21vc3RfcmVjZW50X2NvbnRleHQBAAgQcGFyYQQcY29udGV4dAQCBDRmb3JjZV9hcHByb3ZlAQAEFHVwX3RvBAIsWGhybXBfaW5pdF9vcGVuX2NoYW5uZWwBAAwkcmVjaXBpZW50BFRwcm9wb3NlZF9tYXhfY2FwYWNpdHkEZHByb3Bvc2VkX21heF9tZXNzYWdlX3NpemUEYGhybXBfYWNjZXB0X29wZW5fY2hhbm5lbAEABBhzZW5kZXIESGhybXBfY2xvc2VfY2hhbm5lbAEABChjaGFubmVsX2lkVQJAZm9yY2VfY2xlYW5faHJtcAEADBBwYXJhBCxudW1faW5ib3VuZAQwbnVtX291dGJvdW5kBFxmb3JjZV9wcm9jZXNzX2hybXBfb3BlbgEABCBjaGFubmVscwRgZm9yY2VfcHJvY2Vzc19ocm1wX2Nsb3NlAQAEIGNoYW5uZWxzBGBocm1wX2NhbmNlbF9vcGVuX3JlcXVlc3QBAAgoY2hhbm5lbF9pZFUCNG9wZW5fcmVxdWVzdHMEXGZvcmNlX29wZW5faHJtcF9jaGFubmVsAQAQGHNlbmRlcgQkcmVjaXBpZW50BDBtYXhfY2FwYWNpdHkEQG1heF9tZXNzYWdlX3NpemUEYGVzdGFibGlzaF9zeXN0ZW1fY2hhbm5lbAEACBhzZW5kZXIEJHJlY2lwaWVudARUcG9rZV9jaGFubmVsX2RlcG9zaXRzAQAIGHNlbmRlcgQkcmVjaXBpZW50BHRlc3RhYmxpc2hfY2hhbm5lbF93aXRoX3N5c3RlbQEABEx0YXJnZXRfc3lzdGVtX2NoYWluBAIEOGZvcmNlX3VuZnJlZXplAQEFAAg0c2Vzc2lvbl9pbmRleAQ4Y2FuZGlkYXRlX2hhc2ggAggoRm9ySW52YWxpZAEBBTBBZ2FpbnN0VmFsaWQBAQUAECR0aW1lX3Nsb3QZBhBraW5kHQY8dmFsaWRhdG9yX2luZGV4BDB2YWxpZGF0b3JfaWQgAgRwcmVwb3J0X2Rpc3B1dGVfbG9zdF91bnNpZ25lZAEACDRkaXNwdXRlX3Byb29mIQY8a2V5X293bmVyX3Byb29mvQMCCFxwbGFjZV9vcmRlcl9hbGxvd19kZWF0aAEACChtYXhfYW1vdW50CBxwYXJhX2lkBFhwbGFjZV9vcmRlcl9rZWVwX2FsaXZlAQAIKG1heF9hbW91bnQIHHBhcmFfaWQEAiQgcmVnaXN0ZXIBAAwIaWQEMGdlbmVzaXNfaGVhZCQ8dmFsaWRhdGlvbl9jb2RlJDhmb3JjZV9yZWdpc3RlcgEAFAx3aG8AHGRlcG9zaXQICGlkBDBnZW5lc2lzX2hlYWQkPHZhbGlkYXRpb25fY29kZSQoZGVyZWdpc3RlcgEABAhpZAQQc3dhcAEACAhpZAQUb3RoZXIELHJlbW92ZV9sb2NrAQAEEHBhcmEEHHJlc2VydmUBAQUgYWRkX2xvY2sBAAQQcGFyYQRUc2NoZWR1bGVfY29kZV91cGdyYWRlAQAIEHBhcmEEIG5ld19jb2RlJEBzZXRfY3VycmVudF9oZWFkAQAIEHBhcmEEIG5ld19oZWFkJAIMLGZvcmNlX2xlYXNlAQAUEHBhcmEEGGxlYXNlcgAYYW1vdW50CDBwZXJpb2RfYmVnaW4EMHBlcmlvZF9jb3VudARAY2xlYXJfYWxsX2xlYXNlcwEABBBwYXJhBDx0cmlnZ2VyX29uYm9hcmQBAAQQcGFyYQQCDCxuZXdfYXVjdGlvbgEACCBkdXJhdGlvbgRIbGVhc2VfcGVyaW9kX2luZGV4BAxiaWQBABQQcGFyYQQ0YXVjdGlvbl9pbmRleAQoZmlyc3Rfc2xvdAQkbGFzdF9zbG90BBhhbW91bnQIOGNhbmNlbF9hdWN0aW9uAQEFAgwcRWQyNTUxOQEFAYAcU3IyNTUxOQEFAYAURWNkc2EBBQGEBjkGAgwcRWQyNTUxOQEFAQEBHFNyMjU1MTkBBQEBARRFY2RzYQEFAQUBBkEGAiQYY3JlYXRlAQAYFGluZGV4BAxjYXAIMGZpcnN0X3BlcmlvZAQsbGFzdF9wZXJpb2QEDGVuZAQgdmVyaWZpZXI9Bihjb250cmlidXRlAQAMFGluZGV4BBR2YWx1ZQgkc2lnbmF0dXJlRQYgd2l0aGRyYXcBAAgMd2hvABRpbmRleAQYcmVmdW5kAQAEFGluZGV4BCBkaXNzb2x2ZQEABBRpbmRleAQQZWRpdAEAGBRpbmRleAQMY2FwCDBmaXJzdF9wZXJpb2QELGxhc3RfcGVyaW9kBAxlbmQEIHZlcmlmaWVyPQYgYWRkX21lbW8BAAgUaW5kZXgEEG1lbW8kEHBva2UBAAQUaW5kZXgEOGNvbnRyaWJ1dGVfYWxsAQAIFGluZGV4BCRzaWduYXR1cmVFBgIMEElkbGUBAQUQUG9vbAEBBRBUYXNrAQECAwhNBgQEUQYAAgxIcmVxdWVzdF9jb3JlX2NvdW50AQAEFGNvdW50BEhyZXF1ZXN0X3JldmVudWVfYXQBAAQQd2hlbgQsYXNzaWduX2NvcmUBABAQY29yZQQUYmVnaW4EKGFzc2lnbm1lbnRVBiBlbmRfaGludC0EAAgQc2l6ZQQQaXRlbQQGXQYCDBxUb1N0YXJ0AQEFHExhc3RLZXkBBQAgQ29tcGxldGUBAQUAFDBwcm9ncmVzc190b3BlBjhwcm9ncmVzc19jaGlsZGUGEHNpemUEJHRvcF9pdGVtcwQsY2hpbGRfaXRlbXMEAhhYY29udHJvbF9hdXRvX21pZ3JhdGlvbgEABDBtYXliZV9jb25maWdhBkBjb250aW51ZV9taWdyYXRlAQAMGGxpbWl0c10GPHJlYWxfc2l6ZV91cHBlcgQwd2l0bmVzc190YXNraQZIbWlncmF0ZV9jdXN0b21fdG9wAQAIEGtleXN9AzB3aXRuZXNzX3NpemUEUG1pZ3JhdGVfY3VzdG9tX2NoaWxkAQAMEHJvb3QkKGNoaWxkX2tleXN9Ayh0b3RhbF9zaXplBFRzZXRfc2lnbmVkX21heF9saW1pdHMBAAQYbGltaXRzXQZIZm9yY2Vfc2V0X3Byb2dyZXNzAQAIMHByb2dyZXNzX3RvcGUGOHByb2dyZXNzX2NoaWxkZQYCaCBPdmVyZmxvdwEBBTRVbmltcGxlbWVudGVkAQEFYFVudHJ1c3RlZFJlc2VydmVMb2NhdGlvbgEBBWRVbnRydXN0ZWRUZWxlcG9ydExvY2F0aW9uAQEFRE11bHRpTG9jYXRpb25GdWxsAQEFaE11bHRpTG9jYXRpb25Ob3RJbnZlcnRpYmxlAQEFJEJhZE9yaWdpbgEBBTxJbnZhbGlkTG9jYXRpb24BAQU0QXNzZXROb3RGb3VuZAEBBVRGYWlsZWRUb1RyYW5zYWN0QXNzZXQBAQU8Tm90V2l0aGRyYXdhYmxlAQEFSExvY2F0aW9uQ2Fubm90SG9sZAEBBVRFeGNlZWRzTWF4TWVzc2FnZVNpemUBAQVYRGVzdGluYXRpb25VbnN1cHBvcnRlZAEBBSRUcmFuc3BvcnQBAQUoVW5yb3V0YWJsZQEBBTBVbmtub3duQ2xhaW0BAQU4RmFpbGVkVG9EZWNvZGUBAQVATWF4V2VpZ2h0SW52YWxpZAEBBThOb3RIb2xkaW5nRmVlcwEBBTBUb29FeHBlbnNpdmUBAQUQVHJhcAEBA0xVbmhhbmRsZWRYY21WZXJzaW9uAQEFSFdlaWdodExpbWl0UmVhY2hlZAEBAxxCYXJyaWVyAQEFTFdlaWdodE5vdENvbXB1dGFibGUBAQUDCARxBgZ1BgIQEE51bGwBAQUYQXNzZXRzAQQJAwA8RXhlY3V0aW9uUmVzdWx0AQZ1BhxWZXJzaW9uAQECAggMQWxsAQEFFEFsbE9mAQAICGlk/QIMZnVu5QICCCBEZWZpbml0ZQEECQMAEFdpbGQBAggMQWxsAQEFFEFsbE9mAQAICGlk/QIMZnVu5QICCCRVbmxpbWl0ZWQBAQUcTGltaXRlZAEBAwJwNFdpdGhkcmF3QXNzZXQBBAkDAFRSZXNlcnZlQXNzZXREZXBvc2l0ZWQBBAkDAFhSZWNlaXZlVGVsZXBvcnRlZEFzc2V0AQQJAwA0UXVlcnlSZXNwb25zZQEADCBxdWVyeV9pZAggcmVzcG9uc2V9BihtYXhfd2VpZ2h0CDRUcmFuc2ZlckFzc2V0AQAIGGFzc2V0cw0DLGJlbmVmaWNpYXJ5lQFQVHJhbnNmZXJSZXNlcnZlQXNzZXQBAAwYYXNzZXRzDQMQZGVzdJUBDHhjbZEGIFRyYW5zYWN0AQAMLG9yaWdpbl90eXBlwQJYcmVxdWlyZV93ZWlnaHRfYXRfbW9zdAgQY2FsbCRkSHJtcE5ld0NoYW5uZWxPcGVuUmVxdWVzdAEADBhzZW5kZXIEQG1heF9tZXNzYWdlX3NpemUEMG1heF9jYXBhY2l0eQRMSHJtcENoYW5uZWxBY2NlcHRlZAEABCRyZWNpcGllbnQESEhybXBDaGFubmVsQ2xvc2luZwEADCRpbml0aWF0b3IEGHNlbmRlcgQkcmVjaXBpZW50BCxDbGVhck9yaWdpbgEBBTREZXNjZW5kT3JpZ2luAQIkEEhlcmUBAQUIWDEBAiQkUGFyYWNoYWluAQECLEFjY291bnRJZDMyAQAIHG5ldHdvcmuFAQhpZCA4QWNjb3VudEluZGV4NjQBAAgcbmV0d29ya4UBFGluZGV4CDBBY2NvdW50S2V5MjABAAgcbmV0d29ya4UBDGtleWUBOFBhbGxldEluc3RhbmNlAQECMEdlbmVyYWxJbmRleAEBAyhHZW5lcmFsS2V5AQUAJE9ubHlDaGlsZAEBBSRQbHVyYWxpdHkBAAgIaWSJARBwYXJ0bQEIWDIBBI0BAQgIWDMBBI0BAQwIWDQBBI0BARAIWDUBBI0BARQIWDYBBI0BARgIWDcBBI0BARwIWDgBBI0BASAsUmVwb3J0RXJyb3IBAAwgcXVlcnlfaWQIEGRlc3SVAUxtYXhfcmVzcG9uc2Vfd2VpZ2h0CDBEZXBvc2l0QXNzZXQBAAwYYXNzZXRzhQYobWF4X2Fzc2V0cwQsYmVuZWZpY2lhcnmVAUxEZXBvc2l0UmVzZXJ2ZUFzc2V0AQAQGGFzc2V0c4UGKG1heF9hc3NldHMEEGRlc3SVAQx4Y22RBjRFeGNoYW5nZUFzc2V0AQAIEGdpdmWFBhxyZWNlaXZlDQNcSW5pdGlhdGVSZXNlcnZlV2l0aGRyYXcBAAwYYXNzZXRzhQYccmVzZXJ2ZZUBDHhjbZEGQEluaXRpYXRlVGVsZXBvcnQBAAwYYXNzZXRzhQYQZGVzdJUBDHhjbZEGMFF1ZXJ5SG9sZGluZwEAECBxdWVyeV9pZAgQZGVzdJUBGGFzc2V0c4UGTG1heF9yZXNwb25zZV93ZWlnaHQIMEJ1eUV4ZWN1dGlvbgEACBBmZWVzCQMwd2VpZ2h0X2xpbWl0iQY0UmVmdW5kU3VycGx1cwEBBTxTZXRFcnJvckhhbmRsZXIBBI0GACxTZXRBcHBlbmRpeAEEjQYAKENsZWFyRXJyb3IBAQUoQ2xhaW1Bc3NldAEACBhhc3NldHMNAxh0aWNrZXSVARBUcmFwAQEDQFN1YnNjcmliZVZlcnNpb24BAAggcXVlcnlfaWQITG1heF9yZXNwb25zZV93ZWlnaHQISFVuc3Vic2NyaWJlVmVyc2lvbgEBBQSNBgACGBBOdWxsAQEFGEFzc2V0cwEEEQMAPEV4ZWN1dGlvblJlc3VsdAEGpQIcVmVyc2lvbgEBAixQYWxsZXRzSW5mbwEErQIAOERpc3BhdGNoUmVzdWx0AQIMHFN1Y2Nlc3MBAQUURXJyb3IBBQA4VHJ1bmNhdGVkRXJyb3IBBQACEAxBbGwBAQUUQWxsT2YBAAgIaWR9AQxmdW7lAihBbGxDb3VudGVkAQECMEFsbE9mQ291bnRlZAEADAhpZH0BDGZ1buUCFGNvdW50BAIIIERlZmluaXRlAQQRAwAQV2lsZAECEAxBbGwBAQUUQWxsT2YBAAgIaWR9AQxmdW7lAihBbGxDb3VudGVkAQECMEFsbE9mQ291bnRlZAEADAhpZH0BDGZ1buUCFGNvdW50BALANFdpdGhkcmF3QXNzZXQBBBEDAFRSZXNlcnZlQXNzZXREZXBvc2l0ZWQBBBEDAFhSZWNlaXZlVGVsZXBvcnRlZEFzc2V0AQQRAwA0UXVlcnlSZXNwb25zZQEAECBxdWVyeV9pZAggcmVzcG9uc2WVBihtYXhfd2VpZ2h0GBxxdWVyaWVyvQI0VHJhbnNmZXJBc3NldAEACBhhc3NldHMVAyxiZW5lZmljaWFyeXkBUFRyYW5zZmVyUmVzZXJ2ZUFzc2V0AQAMGGFzc2V0cxUDEGRlc3R5AQx4Y22lBiBUcmFuc2FjdAEADCxvcmlnaW5fa2luZMECWHJlcXVpcmVfd2VpZ2h0X2F0X21vc3QYEGNhbGwkZEhybXBOZXdDaGFubmVsT3BlblJlcXVlc3QBAAwYc2VuZGVyBEBtYXhfbWVzc2FnZV9zaXplBDBtYXhfY2FwYWNpdHkETEhybXBDaGFubmVsQWNjZXB0ZWQBAAQkcmVjaXBpZW50BEhIcm1wQ2hhbm5lbENsb3NpbmcBAAwkaW5pdGlhdG9yBBhzZW5kZXIEJHJlY2lwaWVudAQsQ2xlYXJPcmlnaW4BAQU0RGVzY2VuZE9yaWdpbgECJBBIZXJlAQEFCFgxAQIoJFBhcmFjaGFpbgEBAixBY2NvdW50SWQzMgEACBxuZXR3b3JrYQEIaWQgOEFjY291bnRJbmRleDY0AQAIHG5ldHdvcmthARRpbmRleAgwQWNjb3VudEtleTIwAQAIHG5ldHdvcmthAQxrZXllAThQYWxsZXRJbnN0YW5jZQEBAjBHZW5lcmFsSW5kZXgBAQMoR2VuZXJhbEtleQEACBhsZW5ndGgEEGRhdGEgJE9ubHlDaGlsZAEBBSRQbHVyYWxpdHkBAAgIaWRpARBwYXJ0bQE8R2xvYmFsQ29uc2Vuc3VzAQIsJEJ5R2VuZXNpcwEFAYAYQnlGb3JrAQAIMGJsb2NrX251bWJlcggoYmxvY2tfaGFzaCAgUG9sa2Fkb3QBAQUYS3VzYW1hAQEFHFdlc3RlbmQBAQUYUm9jb2NvAQEFGFdvY29jbwEBBSBFdGhlcmV1bQEABCBjaGFpbl9pZAgsQml0Y29pbkNvcmUBAQUsQml0Y29pbkNhc2gBAQVAUG9sa2Fkb3RCdWxsZXRpbgEBBQhYMgEEcQEBCAhYMwEEcQEBDAhYNAEEcQEBEAhYNQEEcQEBFAhYNgEEcQEBGAhYNwEEcQEBHAhYOAEEcQEBICxSZXBvcnRFcnJvcgEADCxkZXN0aW5hdGlvbnkBIHF1ZXJ5X2lkCChtYXhfd2VpZ2h0GDBEZXBvc2l0QXNzZXQBAAgYYXNzZXRznQYsYmVuZWZpY2lhcnl5AUxEZXBvc2l0UmVzZXJ2ZUFzc2V0AQAMGGFzc2V0c50GEGRlc3R5AQx4Y22lBjRFeGNoYW5nZUFzc2V0AQAMEGdpdmWdBhB3YW50FQMcbWF4aW1hbBRcSW5pdGlhdGVSZXNlcnZlV2l0aGRyYXcBAAwYYXNzZXRznQYccmVzZXJ2ZXkBDHhjbaUGQEluaXRpYXRlVGVsZXBvcnQBAAwYYXNzZXRznQYQZGVzdHkBDHhjbaUGNFJlcG9ydEhvbGRpbmcBAAg0cmVzcG9uc2VfaW5mb+ECGGFzc2V0c50GMEJ1eUV4ZWN1dGlvbgEACBBmZWVzEQMwd2VpZ2h0X2xpbWl08QI0UmVmdW5kU3VycGx1cwEBBTxTZXRFcnJvckhhbmRsZXIBBKEGACxTZXRBcHBlbmRpeAEEoQYAKENsZWFyRXJyb3IBAQUoQ2xhaW1Bc3NldAEACBhhc3NldHMVAxh0aWNrZXR5ARBUcmFwAQEDQFN1YnNjcmliZVZlcnNpb24BAAggcXVlcnlfaWQITG1heF9yZXNwb25zZV93ZWlnaHQYSFVuc3Vic2NyaWJlVmVyc2lvbgEBBSRCdXJuQXNzZXQBBBEDACxFeHBlY3RBc3NldAEEEQMAMEV4cGVjdE9yaWdpbgEGeQEsRXhwZWN0RXJyb3IBBqUCUEV4cGVjdFRyYW5zYWN0U3RhdHVzAQIMHFN1Y2Nlc3MBAQUURXJyb3IBBQA4VHJ1bmNhdGVkRXJyb3IBBQAsUXVlcnlQYWxsZXQBAAgsbW9kdWxlX25hbWUkNHJlc3BvbnNlX2luZm/hAjBFeHBlY3RQYWxsZXQBABQUaW5kZXgEEG5hbWUkLG1vZHVsZV9uYW1lJCxjcmF0ZV9tYWpvcgQ8bWluX2NyYXRlX21pbm9yBFBSZXBvcnRUcmFuc2FjdFN0YXR1cwEADCxkZXN0aW5hdGlvbnkBIHF1ZXJ5X2lkCChtYXhfd2VpZ2h0GExDbGVhclRyYW5zYWN0U3RhdHVzAQEFPFVuaXZlcnNhbE9yaWdpbgECKCRQYXJhY2hhaW4BAQIsQWNjb3VudElkMzIBAAgcbmV0d29ya2EBCGlkIDhBY2NvdW50SW5kZXg2NAEACBxuZXR3b3JrYQEUaW5kZXgIMEFjY291bnRLZXkyMAEACBxuZXR3b3JrYQEMa2V5ZQE4UGFsbGV0SW5zdGFuY2UBAQIwR2VuZXJhbEluZGV4AQEDKEdlbmVyYWxLZXkBAAgYbGVuZ3RoBBBkYXRhICRPbmx5Q2hpbGQBAQUkUGx1cmFsaXR5AQAICGlkaQEQcGFydG0BPEdsb2JhbENvbnNlbnN1cwECLCRCeUdlbmVzaXMBBQGAGEJ5Rm9yawEACDBibG9ja19udW1iZXIIKGJsb2NrX2hhc2ggIFBvbGthZG90AQEFGEt1c2FtYQEBBRxXZXN0ZW5kAQEFGFJvY29jbwEBBRhXb2NvY28BAQUgRXRoZXJldW0BAAQgY2hhaW5faWQILEJpdGNvaW5Db3JlAQEFLEJpdGNvaW5DYXNoAQEFQFBvbGthZG90QnVsbGV0aW4BAQU0RXhwb3J0TWVzc2FnZQEADBxuZXR3b3JrXQEsZGVzdGluYXRpb251AQx4Y22lBiRMb2NrQXNzZXQBAAgUYXNzZXQRAyB1bmxvY2tlcnkBLFVubG9ja0Fzc2V0AQAIFGFzc2V0EQMYdGFyZ2V0eQE4Tm90ZVVubG9ja2FibGUBAAgUYXNzZXQRAxRvd25lcnkBNFJlcXVlc3RVbmxvY2sBAAgUYXNzZXQRAxhsb2NrZXJ5ASxTZXRGZWVzTW9kZQEABDBqaXRfd2l0aGRyYXcUIFNldFRvcGljAQUBgChDbGVhclRvcGljAQEFLEFsaWFzT3JpZ2luAQAIHHBhcmVudHMEIGludGVyaW9ydQE8VW5wYWlkRXhlY3V0aW9uAQAIMHdlaWdodF9saW1pdPECMGNoZWNrX29yaWdpbr0CBKEGAAIMCFYyAQSNBgAIVjMBBKEGAAhWNAEE9QIAAhAgVGVsZXBvcnQBAQUwTG9jYWxSZXNlcnZlAQEFSERlc3RpbmF0aW9uUmVzZXJ2ZQEBBTRSZW1vdGVSZXNlcnZlAQIMCFYyAQAIHHBhcmVudHMEIGludGVyaW9ykQEIVjMBAAgccGFyZW50cwQgaW50ZXJpb3J1AQhWNAEACBxwYXJlbnRzBCBpbnRlcmlvcnUBAggIVjMBAgggQ29uY3JldGUBAAgccGFyZW50cwQgaW50ZXJpb3J1ASBBYnN0cmFjdAEFAYAIVjQBAAgccGFyZW50cwQgaW50ZXJpb3J1AQI4EHNlbmQBAAgQZGVzdJkBHG1lc3NhZ2WpBjx0ZWxlcG9ydF9hc3NldHMBABAQZGVzdJkBLGJlbmVmaWNpYXJ5mQEYYXNzZXRzGQM4ZmVlX2Fzc2V0X2l0ZW0EXHJlc2VydmVfdHJhbnNmZXJfYXNzZXRzAQAQEGRlc3SZASxiZW5lZmljaWFyeZkBGGFzc2V0cxkDOGZlZV9hc3NldF9pdGVtBBxleGVjdXRlAQAIHG1lc3NhZ2WpBihtYXhfd2VpZ2h0GERmb3JjZV94Y21fdmVyc2lvbgEACCBsb2NhdGlvbnkBHHZlcnNpb24EZGZvcmNlX2RlZmF1bHRfeGNtX3ZlcnNpb24BAAREbWF5YmVfeGNtX3ZlcnNpb24tBHhmb3JjZV9zdWJzY3JpYmVfdmVyc2lvbl9ub3RpZnkBAAQgbG9jYXRpb26ZAYBmb3JjZV91bnN1YnNjcmliZV92ZXJzaW9uX25vdGlmeQEABCBsb2NhdGlvbpkBfGxpbWl0ZWRfcmVzZXJ2ZV90cmFuc2Zlcl9hc3NldHMBABQQZGVzdJkBLGJlbmVmaWNpYXJ5mQEYYXNzZXRzGQM4ZmVlX2Fzc2V0X2l0ZW0EMHdlaWdodF9saW1pdPECXGxpbWl0ZWRfdGVsZXBvcnRfYXNzZXRzAQAUEGRlc3SZASxiZW5lZmljaWFyeZkBGGFzc2V0cxkDOGZlZV9hc3NldF9pdGVtBDB3ZWlnaHRfbGltaXTxAkBmb3JjZV9zdXNwZW5zaW9uAQAEJHN1c3BlbmRlZBQ8dHJhbnNmZXJfYXNzZXRzAQAUEGRlc3SZASxiZW5lZmljaWFyeZkBGGFzc2V0cxkDOGZlZV9hc3NldF9pdGVtBDB3ZWlnaHRfbGltaXTxAjBjbGFpbV9hc3NldHMBAAgYYXNzZXRzGQMsYmVuZWZpY2lhcnmZAYx0cmFuc2Zlcl9hc3NldHNfdXNpbmdfdHlwZV9hbmRfdGhlbgEAHBBkZXN0mQEYYXNzZXRzGQNQYXNzZXRzX3RyYW5zZmVyX3R5cGWtBjhyZW1vdGVfZmVlc19pZLEGSGZlZXNfdHJhbnNmZXJfdHlwZa0GSGN1c3RvbV94Y21fb25fZGVzdKkGMHdlaWdodF9saW1pdPECAggkcmVhcF9wYWdlAQAIOG1lc3NhZ2Vfb3JpZ2luJQMocGFnZV9pbmRleARIZXhlY3V0ZV9vdmVyd2VpZ2h0AQAQOG1lc3NhZ2Vfb3JpZ2luJQMQcGFnZQQUaW5kZXgEMHdlaWdodF9saW1pdBgCDBhjcmVhdGUBAAgoYXNzZXRfa2luZIEBEHJhdGUIGHVwZGF0ZQEACChhc3NldF9raW5kgQEQcmF0ZQgYcmVtb3ZlAQAEKGFzc2V0X2tpbmSBAQUBCAMIwQYkBMUGAAAMHHBheWxvYWTJBjBibG9ja19udW1iZXIEQHZhbGlkYXRvcl9zZXRfaWQIAAwoY29tbWl0bWVudM0GCGlkCQQkc2lnbmF0dXJlXQQACBRmaXJzdNEGGHNlY29uZNEGAgxMcmVwb3J0X2VxdWl2b2NhdGlvbgEACEhlcXVpdm9jYXRpb25fcHJvb2bVBjxrZXlfb3duZXJfcHJvb2a9A3ByZXBvcnRfZXF1aXZvY2F0aW9uX3Vuc2lnbmVkAQAISGVxdWl2b2NhdGlvbl9wcm9vZtUGPGtleV9vd25lcl9wcm9vZr0DPHNldF9uZXdfZ2VuZXNpcwEABDxkZWxheV9pbl9ibG9ja3MEArgYU3lzdGVtAQIsGHJlbWFyawEABBhyZW1hcmskOHNldF9oZWFwX3BhZ2VzAQAEFHBhZ2VzCCBzZXRfY29kZQEABBBjb2RlJFxzZXRfY29kZV93aXRob3V0X2NoZWNrcwEABBBjb2RlJCxzZXRfc3RvcmFnZQEABBRpdGVtc3kDMGtpbGxfc3RvcmFnZQEABBBrZXlzfQMsa2lsbF9wcmVmaXgBAAgYcHJlZml4JBxzdWJrZXlzBERyZW1hcmtfd2l0aF9ldmVudAEABBhyZW1hcmskRGF1dGhvcml6ZV91cGdyYWRlAQAEJGNvZGVfaGFzaCCAYXV0aG9yaXplX3VwZ3JhZGVfd2l0aG91dF9jaGVja3MBAAQkY29kZV9oYXNoIGBhcHBseV9hdXRob3JpemVkX3VwZ3JhZGUBAAQQY29kZSQkU2NoZWR1bGVyAQIoIHNjaGVkdWxlAQAQEHdoZW4EOG1heWJlX3BlcmlvZGljgQMgcHJpb3JpdHkEEGNhbGzdBhhjYW5jZWwBAAgQd2hlbgQUaW5kZXgEOHNjaGVkdWxlX25hbWVkAQAUCGlkIBB3aGVuBDhtYXliZV9wZXJpb2RpY4EDIHByaW9yaXR5BBBjYWxs3QYwY2FuY2VsX25hbWVkAQAECGlkIDhzY2hlZHVsZV9hZnRlcgEAEBRhZnRlcgQ4bWF5YmVfcGVyaW9kaWOBAyBwcmlvcml0eQQQY2FsbN0GUHNjaGVkdWxlX25hbWVkX2FmdGVyAQAUCGlkIBRhZnRlcgQ4bWF5YmVfcGVyaW9kaWOBAyBwcmlvcml0eQQQY2FsbN0GJHNldF9yZXRyeQEADBB0YXNrDQEccmV0cmllcwQYcGVyaW9kBDxzZXRfcmV0cnlfbmFtZWQBAAwIaWQgHHJldHJpZXMEGHBlcmlvZAQwY2FuY2VsX3JldHJ5AQAEEHRhc2sNAUhjYW5jZWxfcmV0cnlfbmFtZWQBAAQIaWQgIFByZWltYWdlAQIUNG5vdGVfcHJlaW1hZ2UBAAQUYnl0ZXMkPHVubm90ZV9wcmVpbWFnZQEABBBoYXNoIEByZXF1ZXN0X3ByZWltYWdlAQAEEGhhc2ggSHVucmVxdWVzdF9wcmVpbWFnZQEABBBoYXNoIDhlbnN1cmVfdXBkYXRlZAEABBhoYXNoZXM5AxBCYWJlAQIMTHJlcG9ydF9lcXVpdm9jYXRpb24BAAhIZXF1aXZvY2F0aW9uX3Byb29muQM8a2V5X293bmVyX3Byb29mvQNwcmVwb3J0X2VxdWl2b2NhdGlvbl91bnNpZ25lZAEACEhlcXVpdm9jYXRpb25fcHJvb2a5AzxrZXlfb3duZXJfcHJvb2a9A0hwbGFuX2NvbmZpZ19jaGFuZ2UBAAQYY29uZmlnyQMkVGltZXN0YW1wAQIEDHNldAEABAxub3cIHEluZGljZXMBAhQUY2xhaW0BAAQUaW5kZXgEIHRyYW5zZmVyAQAIDG5ld9UDFGluZGV4BBBmcmVlAQAEFGluZGV4BDhmb3JjZV90cmFuc2ZlcgEADAxuZXfVAxRpbmRleAQYZnJlZXplFBhmcmVlemUBAAQUaW5kZXgEIEJhbGFuY2VzAQIkUHRyYW5zZmVyX2FsbG93X2RlYXRoAQAIEGRlc3TVAxR2YWx1ZQg4Zm9yY2VfdHJhbnNmZXIBAAwYc291cmNl1QMQZGVzdNUDFHZhbHVlCEx0cmFuc2Zlcl9rZWVwX2FsaXZlAQAIEGRlc3TVAxR2YWx1ZQgwdHJhbnNmZXJfYWxsAQAIEGRlc3TVAyhrZWVwX2FsaXZlFDxmb3JjZV91bnJlc2VydmUBAAgMd2hv1QMYYW1vdW50CEB1cGdyYWRlX2FjY291bnRzAQAEDHdob90DRGZvcmNlX3NldF9iYWxhbmNlAQAIDHdob9UDIG5ld19mcmVlCGxmb3JjZV9hZGp1c3RfdG90YWxfaXNzdWFuY2UBAAgkZGlyZWN0aW9u4QMUZGVsdGEIEGJ1cm4BAAgUdmFsdWUIKGtlZXBfYWxpdmUUHFN0YWtpbmcBAngQYm9uZAEACBR2YWx1ZQgUcGF5ZWU1AShib25kX2V4dHJhAQAEOG1heF9hZGRpdGlvbmFsCBh1bmJvbmQBAAQUdmFsdWUIRHdpdGhkcmF3X3VuYm9uZGVkAQAESG51bV9zbGFzaGluZ19zcGFucwQgdmFsaWRhdGUBAAQUcHJlZnM5ASBub21pbmF0ZQEABBx0YXJnZXRz6QMUY2hpbGwBAQUkc2V0X3BheWVlAQAEFHBheWVlNQE4c2V0X2NvbnRyb2xsZXIBAQVMc2V0X3ZhbGlkYXRvcl9jb3VudAEABAxuZXcEYGluY3JlYXNlX3ZhbGlkYXRvcl9jb3VudAEABChhZGRpdGlvbmFsBFRzY2FsZV92YWxpZGF0b3JfY291bnQBAAQYZmFjdG9yBDRmb3JjZV9ub19lcmFzAQEFNGZvcmNlX25ld19lcmEBAQVEc2V0X2ludnVsbmVyYWJsZXMBAAQ0aW52dWxuZXJhYmxlc90DNGZvcmNlX3Vuc3Rha2UBAAgUc3Rhc2gASG51bV9zbGFzaGluZ19zcGFucwRQZm9yY2VfbmV3X2VyYV9hbHdheXMBAQVUY2FuY2VsX2RlZmVycmVkX3NsYXNoAQAIDGVyYQQ0c2xhc2hfaW5kaWNlczkCOHBheW91dF9zdGFrZXJzAQAIPHZhbGlkYXRvcl9zdGFzaAAMZXJhBBhyZWJvbmQBAAQUdmFsdWUIKHJlYXBfc3Rhc2gBAAgUc3Rhc2gASG51bV9zbGFzaGluZ19zcGFucwQQa2ljawEABAx3aG/pA0xzZXRfc3Rha2luZ19jb25maWdzAQAcSG1pbl9ub21pbmF0b3JfYm9uZO0DSG1pbl92YWxpZGF0b3JfYm9uZO0DTG1heF9ub21pbmF0b3JfY291bnTxA0xtYXhfdmFsaWRhdG9yX2NvdW508QM8Y2hpbGxfdGhyZXNob2xk8QM4bWluX2NvbW1pc3Npb27xA0htYXhfc3Rha2VkX3Jld2FyZHPxAyxjaGlsbF9vdGhlcgEABBRzdGFzaABoZm9yY2VfYXBwbHlfbWluX2NvbW1pc3Npb24BAAQ8dmFsaWRhdG9yX3N0YXNoAEhzZXRfbWluX2NvbW1pc3Npb24BAAQMbmV3BFhwYXlvdXRfc3Rha2Vyc19ieV9wYWdlAQAMPHZhbGlkYXRvcl9zdGFzaAAMZXJhBBBwYWdlBDB1cGRhdGVfcGF5ZWUBAAQoY29udHJvbGxlcgBoZGVwcmVjYXRlX2NvbnRyb2xsZXJfYmF0Y2gBAAQsY29udHJvbGxlcnPdAzhyZXN0b3JlX2xlZGdlcgEAEBRzdGFzaABAbWF5YmVfY29udHJvbGxlcgUCLG1heWJlX3RvdGFs9QM8bWF5YmVfdW5sb2NraW5nAQQcU2Vzc2lvbgECCCBzZXRfa2V5cwEACBBrZXlzDQQUcHJvb2YkKHB1cmdlX2tleXMBAQUcR3JhbmRwYQECDExyZXBvcnRfZXF1aXZvY2F0aW9uAQAISGVxdWl2b2NhdGlvbl9wcm9vZiUEPGtleV9vd25lcl9wcm9vZr0DcHJlcG9ydF9lcXVpdm9jYXRpb25fdW5zaWduZWQBAAhIZXF1aXZvY2F0aW9uX3Byb29mJQQ8a2V5X293bmVyX3Byb29mvQMwbm90ZV9zdGFsbGVkAQAIFGRlbGF5BGxiZXN0X2ZpbmFsaXplZF9ibG9ja19udW1iZXIEIFRyZWFzdXJ5AQIYLHNwZW5kX2xvY2FsAQAIGGFtb3VudAgsYmVuZWZpY2lhcnnVAzxyZW1vdmVfYXBwcm92YWwBAAQscHJvcG9zYWxfaWQEFHNwZW5kAQAQKGFzc2V0X2tpbmSBARhhbW91bnQILGJlbmVmaWNpYXJ5mQEodmFsaWRfZnJvbS0EGHBheW91dAEABBRpbmRleAQwY2hlY2tfc3RhdHVzAQAEFGluZGV4BCh2b2lkX3NwZW5kAQAEFGluZGV4BEBDb252aWN0aW9uVm90aW5nAQIYEHZvdGUBAAgocG9sbF9pbmRleAQQdm90ZTUEIGRlbGVnYXRlAQAQFGNsYXNzBAh0b9UDKGNvbnZpY3Rpb245BBxiYWxhbmNlCCh1bmRlbGVnYXRlAQAEFGNsYXNzBBh1bmxvY2sBAAgUY2xhc3MEGHRhcmdldNUDLHJlbW92ZV92b3RlAQAIFGNsYXNzLQQUaW5kZXgERHJlbW92ZV9vdGhlcl92b3RlAQAMGHRhcmdldNUDFGNsYXNzBBRpbmRleAQkUmVmZXJlbmRhAQIkGHN1Ym1pdAEADDxwcm9wb3NhbF9vcmlnaW6VAyBwcm9wb3NhbKUBQGVuYWN0bWVudF9tb21lbnRBBFhwbGFjZV9kZWNpc2lvbl9kZXBvc2l0AQAEFGluZGV4BFxyZWZ1bmRfZGVjaXNpb25fZGVwb3NpdAEABBRpbmRleAQYY2FuY2VsAQAEFGluZGV4BBBraWxsAQAEFGluZGV4BEBudWRnZV9yZWZlcmVuZHVtAQAEFGluZGV4BEhvbmVfZmV3ZXJfZGVjaWRpbmcBAAQUdHJhY2sEZHJlZnVuZF9zdWJtaXNzaW9uX2RlcG9zaXQBAAQUaW5kZXgEMHNldF9tZXRhZGF0YQEACBRpbmRleAQobWF5YmVfaGFzaBEBJFdoaXRlbGlzdAECEDh3aGl0ZWxpc3RfY2FsbAEABCRjYWxsX2hhc2ggXHJlbW92ZV93aGl0ZWxpc3RlZF9jYWxsAQAEJGNhbGxfaGFzaCBkZGlzcGF0Y2hfd2hpdGVsaXN0ZWRfY2FsbAEADCRjYWxsX2hhc2ggQGNhbGxfZW5jb2RlZF9sZW4ETGNhbGxfd2VpZ2h0X3dpdG5lc3MYnGRpc3BhdGNoX3doaXRlbGlzdGVkX2NhbGxfd2l0aF9wcmVpbWFnZQEABBBjYWxs3QYoUGFyYW1ldGVycwECBDRzZXRfcGFyYW1ldGVyAQAEJGtleV92YWx1ZVUEGENsYWltcwECFBRjbGFpbQEACBBkZXN0AEhldGhlcmV1bV9zaWduYXR1cmVdBChtaW50X2NsYWltAQAQDHdob2UBFHZhbHVlCEB2ZXN0aW5nX3NjaGVkdWxlZQQkc3RhdGVtZW50bQQwY2xhaW1fYXR0ZXN0AQAMEGRlc3QASGV0aGVyZXVtX3NpZ25hdHVyZV0EJHN0YXRlbWVudCQYYXR0ZXN0AQAEJHN0YXRlbWVudCQobW92ZV9jbGFpbQEADAxvbGRlAQxuZXdlAThtYXliZV9wcmVjbGFpbQUCHFZlc3RpbmcBAhgQdmVzdAEBBSh2ZXN0X290aGVyAQAEGHRhcmdldNUDPHZlc3RlZF90cmFuc2ZlcgEACBh0YXJnZXTVAyBzY2hlZHVsZXUEVGZvcmNlX3Zlc3RlZF90cmFuc2ZlcgEADBhzb3VyY2XVAxh0YXJnZXTVAyBzY2hlZHVsZXUEPG1lcmdlX3NjaGVkdWxlcwEACDxzY2hlZHVsZTFfaW5kZXgEPHNjaGVkdWxlMl9pbmRleAR0Zm9yY2VfcmVtb3ZlX3Zlc3Rpbmdfc2NoZWR1bGUBAAgYdGFyZ2V01QM4c2NoZWR1bGVfaW5kZXgEHFV0aWxpdHkBAhgUYmF0Y2gBAAQUY2FsbHN9BDRhc19kZXJpdmF0aXZlAQAIFGluZGV4BBBjYWxs3QYkYmF0Y2hfYWxsAQAEFGNhbGxzfQQsZGlzcGF0Y2hfYXMBAAgkYXNfb3JpZ2lulQMQY2FsbN0GLGZvcmNlX2JhdGNoAQAEFGNhbGxzfQQsd2l0aF93ZWlnaHQBAAgQY2FsbN0GGHdlaWdodBgUUHJveHkBAigUcHJveHkBAAwQcmVhbNUDQGZvcmNlX3Byb3h5X3R5cGWFBBBjYWxs3QYkYWRkX3Byb3h5AQAMIGRlbGVnYXRl1QMocHJveHlfdHlwZekBFGRlbGF5BDByZW1vdmVfcHJveHkBAAwgZGVsZWdhdGXVAyhwcm94eV90eXBl6QEUZGVsYXkEOHJlbW92ZV9wcm94aWVzAQEFLGNyZWF0ZV9wdXJlAQAMKHByb3h5X3R5cGXpARRkZWxheQQUaW5kZXgEJGtpbGxfcHVyZQEAFBxzcGF3bmVy1QMocHJveHlfdHlwZekBFGluZGV4BBhoZWlnaHQEJGV4dF9pbmRleAQgYW5ub3VuY2UBAAgQcmVhbNUDJGNhbGxfaGFzaCBMcmVtb3ZlX2Fubm91bmNlbWVudAEACBByZWFs1QMkY2FsbF9oYXNoIExyZWplY3RfYW5ub3VuY2VtZW50AQAIIGRlbGVnYXRl1QMkY2FsbF9oYXNoIDxwcm94eV9hbm5vdW5jZWQBABAgZGVsZWdhdGXVAxByZWFs1QNAZm9yY2VfcHJveHlfdHlwZYUEEGNhbGzdBiBNdWx0aXNpZwECEFBhc19tdWx0aV90aHJlc2hvbGRfMQEACERvdGhlcl9zaWduYXRvcmllc90DEGNhbGzdBiBhc19tdWx0aQEAFCR0aHJlc2hvbGQERG90aGVyX3NpZ25hdG9yaWVz3QM8bWF5YmVfdGltZXBvaW50jQQQY2FsbN0GKG1heF93ZWlnaHQYQGFwcHJvdmVfYXNfbXVsdGkBABQkdGhyZXNob2xkBERvdGhlcl9zaWduYXRvcmllc90DPG1heWJlX3RpbWVwb2ludI0EJGNhbGxfaGFzaCAobWF4X3dlaWdodBg8Y2FuY2VsX2FzX211bHRpAQAQJHRocmVzaG9sZAREb3RoZXJfc2lnbmF0b3JpZXPdAyR0aW1lcG9pbnTxASRjYWxsX2hhc2ggIEJvdW50aWVzAQIkOHByb3Bvc2VfYm91bnR5AQAIFHZhbHVlCCxkZXNjcmlwdGlvbiQ4YXBwcm92ZV9ib3VudHkBAAQkYm91bnR5X2lkBDxwcm9wb3NlX2N1cmF0b3IBAAwkYm91bnR5X2lkBBxjdXJhdG9y1QMMZmVlCEB1bmFzc2lnbl9jdXJhdG9yAQAEJGJvdW50eV9pZAQ4YWNjZXB0X2N1cmF0b3IBAAQkYm91bnR5X2lkBDBhd2FyZF9ib3VudHkBAAgkYm91bnR5X2lkBCxiZW5lZmljaWFyedUDMGNsYWltX2JvdW50eQEABCRib3VudHlfaWQEMGNsb3NlX2JvdW50eQEABCRib3VudHlfaWQEUGV4dGVuZF9ib3VudHlfZXhwaXJ5AQAIJGJvdW50eV9pZAQYcmVtYXJrJDRDaGlsZEJvdW50aWVzAQIcQGFkZF9jaGlsZF9ib3VudHkBAAxAcGFyZW50X2JvdW50eV9pZAQUdmFsdWUILGRlc2NyaXB0aW9uJDxwcm9wb3NlX2N1cmF0b3IBABBAcGFyZW50X2JvdW50eV9pZAQ8Y2hpbGRfYm91bnR5X2lkBBxjdXJhdG9y1QMMZmVlCDhhY2NlcHRfY3VyYXRvcgEACEBwYXJlbnRfYm91bnR5X2lkBDxjaGlsZF9ib3VudHlfaWQEQHVuYXNzaWduX2N1cmF0b3IBAAhAcGFyZW50X2JvdW50eV9pZAQ8Y2hpbGRfYm91bnR5X2lkBEhhd2FyZF9jaGlsZF9ib3VudHkBAAxAcGFyZW50X2JvdW50eV9pZAQ8Y2hpbGRfYm91bnR5X2lkBCxiZW5lZmljaWFyedUDSGNsYWltX2NoaWxkX2JvdW50eQEACEBwYXJlbnRfYm91bnR5X2lkBDxjaGlsZF9ib3VudHlfaWQESGNsb3NlX2NoaWxkX2JvdW50eQEACEBwYXJlbnRfYm91bnR5X2lkBDxjaGlsZF9ib3VudHlfaWQEaEVsZWN0aW9uUHJvdmlkZXJNdWx0aVBoYXNlAQIUPHN1Ym1pdF91bnNpZ25lZAEACDByYXdfc29sdXRpb25ZBRx3aXRuZXNzXQVsc2V0X21pbmltdW1fdW50cnVzdGVkX3Njb3JlAQAEQG1heWJlX25leHRfc2NvcmVhBXRzZXRfZW1lcmdlbmN5X2VsZWN0aW9uX3Jlc3VsdAEABCBzdXBwb3J0c3UFGHN1Ym1pdAEABDByYXdfc29sdXRpb25ZBUxnb3Zlcm5hbmNlX2ZhbGxiYWNrAQAIQG1heWJlX21heF92b3RlcnMtBERtYXliZV9tYXhfdGFyZ2V0cy0EJFZvdGVyTGlzdAECDBRyZWJhZwEABChkaXNsb2NhdGVk1QM8cHV0X2luX2Zyb250X29mAQAEHGxpZ2h0ZXLVA1RwdXRfaW5fZnJvbnRfb2Zfb3RoZXIBAAgcaGVhdmllctUDHGxpZ2h0ZXLVAzxOb21pbmF0aW9uUG9vbHMBAmgQam9pbgEACBhhbW91bnQIHHBvb2xfaWQEKGJvbmRfZXh0cmEBAAQUZXh0cmGBBTBjbGFpbV9wYXlvdXQBAQUYdW5ib25kAQAIOG1lbWJlcl9hY2NvdW501QNAdW5ib25kaW5nX3BvaW50cwhYcG9vbF93aXRoZHJhd191bmJvbmRlZAEACBxwb29sX2lkBEhudW1fc2xhc2hpbmdfc3BhbnMERHdpdGhkcmF3X3VuYm9uZGVkAQAIOG1lbWJlcl9hY2NvdW501QNIbnVtX3NsYXNoaW5nX3NwYW5zBBhjcmVhdGUBABAYYW1vdW50CBByb2901QMkbm9taW5hdG9y1QMcYm91bmNlctUDTGNyZWF0ZV93aXRoX3Bvb2xfaWQBABQYYW1vdW50CBByb2901QMkbm9taW5hdG9y1QMcYm91bmNlctUDHHBvb2xfaWQEIG5vbWluYXRlAQAIHHBvb2xfaWQEKHZhbGlkYXRvcnPdAyRzZXRfc3RhdGUBAAgccG9vbF9pZAQUc3RhdGUdAjBzZXRfbWV0YWRhdGEBAAgccG9vbF9pZAQgbWV0YWRhdGEkLHNldF9jb25maWdzAQAYNG1pbl9qb2luX2JvbmTtAzxtaW5fY3JlYXRlX2JvbmTtAyRtYXhfcG9vbHPxAyxtYXhfbWVtYmVyc/EDUG1heF9tZW1iZXJzX3Blcl9wb29s8QNUZ2xvYmFsX21heF9jb21taXNzaW9u8QMwdXBkYXRlX3JvbGVzAQAQHHBvb2xfaWQEIG5ld19yb290hQU0bmV3X25vbWluYXRvcoUFLG5ld19ib3VuY2VyhQUUY2hpbGwBAAQccG9vbF9pZARAYm9uZF9leHRyYV9vdGhlcgEACBhtZW1iZXLVAxRleHRyYYEFUHNldF9jbGFpbV9wZXJtaXNzaW9uAQAEKHBlcm1pc3Npb26JBUhjbGFpbV9wYXlvdXRfb3RoZXIBAAQUb3RoZXIAOHNldF9jb21taXNzaW9uAQAIHHBvb2xfaWQEOG5ld19jb21taXNzaW9uJQJIc2V0X2NvbW1pc3Npb25fbWF4AQAIHHBvb2xfaWQEOG1heF9jb21taXNzaW9uBGhzZXRfY29tbWlzc2lvbl9jaGFuZ2VfcmF0ZQEACBxwb29sX2lkBCxjaGFuZ2VfcmF0ZSkCQGNsYWltX2NvbW1pc3Npb24BAAQccG9vbF9pZARMYWRqdXN0X3Bvb2xfZGVwb3NpdAEABBxwb29sX2lkBHxzZXRfY29tbWlzc2lvbl9jbGFpbV9wZXJtaXNzaW9uAQAIHHBvb2xfaWQEKHBlcm1pc3Npb24xAixhcHBseV9zbGFzaAEABDhtZW1iZXJfYWNjb3VudNUDSG1pZ3JhdGVfZGVsZWdhdGlvbgEABDhtZW1iZXJfYWNjb3VudNUDeG1pZ3JhdGVfcG9vbF90b19kZWxlZ2F0ZV9zdGFrZQEABBxwb29sX2lkBCxGYXN0VW5zdGFrZQECDFRyZWdpc3Rlcl9mYXN0X3Vuc3Rha2UBAQUoZGVyZWdpc3RlcgEBBRxjb250cm9sAQAENGVyYXNfdG9fY2hlY2sENENvbmZpZ3VyYXRpb24BAsB8c2V0X3ZhbGlkYXRpb25fdXBncmFkZV9jb29sZG93bgEABAxuZXcEcHNldF92YWxpZGF0aW9uX3VwZ3JhZGVfZGVsYXkBAAQMbmV3BGRzZXRfY29kZV9yZXRlbnRpb25fcGVyaW9kAQAEDG5ldwREc2V0X21heF9jb2RlX3NpemUBAAQMbmV3BEBzZXRfbWF4X3Bvdl9zaXplAQAEDG5ldwRYc2V0X21heF9oZWFkX2RhdGFfc2l6ZQEABAxuZXcESHNldF9jb3JldGltZV9jb3JlcwEABAxuZXcEdHNldF9tYXhfYXZhaWxhYmlsaXR5X3RpbWVvdXRzAQAEDG5ldwRwc2V0X2dyb3VwX3JvdGF0aW9uX2ZyZXF1ZW5jeQEABAxuZXcEdHNldF9wYXJhc19hdmFpbGFiaWxpdHlfcGVyaW9kAQAEDG5ldwRgc2V0X3NjaGVkdWxpbmdfbG9va2FoZWFkAQAEDG5ldwRsc2V0X21heF92YWxpZGF0b3JzX3Blcl9jb3JlAQAEDG5ldy0ESHNldF9tYXhfdmFsaWRhdG9ycwEABAxuZXctBEhzZXRfZGlzcHV0ZV9wZXJpb2QBAAQMbmV3BLRzZXRfZGlzcHV0ZV9wb3N0X2NvbmNsdXNpb25fYWNjZXB0YW5jZV9wZXJpb2QBAAQMbmV3BERzZXRfbm9fc2hvd19zbG90cwEABAxuZXcEUHNldF9uX2RlbGF5X3RyYW5jaGVzAQAEDG5ldwR4c2V0X3plcm90aF9kZWxheV90cmFuY2hlX3dpZHRoAQAEDG5ldwRQc2V0X25lZWRlZF9hcHByb3ZhbHMBAAQMbmV3BHBzZXRfcmVsYXlfdnJmX21vZHVsb19zYW1wbGVzAQAEDG5ldwRoc2V0X21heF91cHdhcmRfcXVldWVfY291bnQBAAQMbmV3BGRzZXRfbWF4X3Vwd2FyZF9xdWV1ZV9zaXplAQAEDG5ldwR0c2V0X21heF9kb3dud2FyZF9tZXNzYWdlX3NpemUBAAQMbmV3BGxzZXRfbWF4X3Vwd2FyZF9tZXNzYWdlX3NpemUBAAQMbmV3BKBzZXRfbWF4X3Vwd2FyZF9tZXNzYWdlX251bV9wZXJfY2FuZGlkYXRlAQAEDG5ldwRkc2V0X2hybXBfb3Blbl9yZXF1ZXN0X3R0bAEABAxuZXcEXHNldF9ocm1wX3NlbmRlcl9kZXBvc2l0AQAEDG5ldwhoc2V0X2hybXBfcmVjaXBpZW50X2RlcG9zaXQBAAQMbmV3CHRzZXRfaHJtcF9jaGFubmVsX21heF9jYXBhY2l0eQEABAxuZXcEfHNldF9ocm1wX2NoYW5uZWxfbWF4X3RvdGFsX3NpemUBAAQMbmV3BJxzZXRfaHJtcF9tYXhfcGFyYWNoYWluX2luYm91bmRfY2hhbm5lbHMBAAQMbmV3BIRzZXRfaHJtcF9jaGFubmVsX21heF9tZXNzYWdlX3NpemUBAAQMbmV3BKBzZXRfaHJtcF9tYXhfcGFyYWNoYWluX291dGJvdW5kX2NoYW5uZWxzAQAEDG5ldwSYc2V0X2hybXBfbWF4X21lc3NhZ2VfbnVtX3Blcl9jYW5kaWRhdGUBAAQMbmV3BEhzZXRfcHZmX3ZvdGluZ190dGwBAAQMbmV3BJBzZXRfbWluaW11bV92YWxpZGF0aW9uX3VwZ3JhZGVfZGVsYXkBAAQMbmV3BHBzZXRfYnlwYXNzX2NvbnNpc3RlbmN5X2NoZWNrAQAEDG5ldxRgc2V0X2FzeW5jX2JhY2tpbmdfcGFyYW1zAQAEDG5ld5UFTHNldF9leGVjdXRvcl9wYXJhbXMBAAQMbmV3pQVYc2V0X29uX2RlbWFuZF9iYXNlX2ZlZQEABAxuZXcIdHNldF9vbl9kZW1hbmRfZmVlX3ZhcmlhYmlsaXR5AQAEDG5ldwRwc2V0X29uX2RlbWFuZF9xdWV1ZV9tYXhfc2l6ZQEABAxuZXcEmHNldF9vbl9kZW1hbmRfdGFyZ2V0X3F1ZXVlX3V0aWxpemF0aW9uAQAEDG5ldwREc2V0X29uX2RlbWFuZF90dGwBAAQMbmV3BGRzZXRfbWluaW11bV9iYWNraW5nX3ZvdGVzAQAEDG5ldwRAc2V0X25vZGVfZmVhdHVyZQEACBRpbmRleAQUdmFsdWUUaHNldF9hcHByb3ZhbF92b3RpbmdfcGFyYW1zAQAEDG5ldwRQc2V0X3NjaGVkdWxlcl9wYXJhbXMBAAQMbmV3qQUsUGFyYXNTaGFyZWQBAQU0UGFyYUluY2x1c2lvbgEBBTBQYXJhSW5oZXJlbnQBAgQUZW50ZXIBAAQQZGF0Yf0FFFBhcmFzAQIkWGZvcmNlX3NldF9jdXJyZW50X2NvZGUBAAgQcGFyYQQgbmV3X2NvZGUkWGZvcmNlX3NldF9jdXJyZW50X2hlYWQBAAgQcGFyYQQgbmV3X2hlYWQkbGZvcmNlX3NjaGVkdWxlX2NvZGVfdXBncmFkZQEADBBwYXJhBCBuZXdfY29kZSRMcmVsYXlfcGFyZW50X251bWJlcgRMZm9yY2Vfbm90ZV9uZXdfaGVhZAEACBBwYXJhBCBuZXdfaGVhZCRIZm9yY2VfcXVldWVfYWN0aW9uAQAEEHBhcmEEbGFkZF90cnVzdGVkX3ZhbGlkYXRpb25fY29kZQEABDx2YWxpZGF0aW9uX2NvZGUkbHBva2VfdW51c2VkX3ZhbGlkYXRpb25fY29kZQEABFB2YWxpZGF0aW9uX2NvZGVfaGFzaCBsaW5jbHVkZV9wdmZfY2hlY2tfc3RhdGVtZW50AQAIEHN0bXQFBiRzaWduYXR1cmVBAnRmb3JjZV9zZXRfbW9zdF9yZWNlbnRfY29udGV4dAEACBBwYXJhBBxjb250ZXh0BCxJbml0aWFsaXplcgECBDRmb3JjZV9hcHByb3ZlAQAEFHVwX3RvBBBIcm1wAQIsWGhybXBfaW5pdF9vcGVuX2NoYW5uZWwBAAwkcmVjaXBpZW50BFRwcm9wb3NlZF9tYXhfY2FwYWNpdHkEZHByb3Bvc2VkX21heF9tZXNzYWdlX3NpemUEYGhybXBfYWNjZXB0X29wZW5fY2hhbm5lbAEABBhzZW5kZXIESGhybXBfY2xvc2VfY2hhbm5lbAEABChjaGFubmVsX2lkVQJAZm9yY2VfY2xlYW5faHJtcAEADBBwYXJhBCxudW1faW5ib3VuZAQwbnVtX291dGJvdW5kBFxmb3JjZV9wcm9jZXNzX2hybXBfb3BlbgEABCBjaGFubmVscwRgZm9yY2VfcHJvY2Vzc19ocm1wX2Nsb3NlAQAEIGNoYW5uZWxzBGBocm1wX2NhbmNlbF9vcGVuX3JlcXVlc3QBAAgoY2hhbm5lbF9pZFUCNG9wZW5fcmVxdWVzdHMEXGZvcmNlX29wZW5faHJtcF9jaGFubmVsAQAQGHNlbmRlcgQkcmVjaXBpZW50BDBtYXhfY2FwYWNpdHkEQG1heF9tZXNzYWdlX3NpemUEYGVzdGFibGlzaF9zeXN0ZW1fY2hhbm5lbAEACBhzZW5kZXIEJHJlY2lwaWVudARUcG9rZV9jaGFubmVsX2RlcG9zaXRzAQAIGHNlbmRlcgQkcmVjaXBpZW50BHRlc3RhYmxpc2hfY2hhbm5lbF93aXRoX3N5c3RlbQEABEx0YXJnZXRfc3lzdGVtX2NoYWluBDRQYXJhc0Rpc3B1dGVzAQIEOGZvcmNlX3VuZnJlZXplAQEFNFBhcmFzU2xhc2hpbmcBAgRwcmVwb3J0X2Rpc3B1dGVfbG9zdF91bnNpZ25lZAEACDRkaXNwdXRlX3Byb29mIQY8a2V5X293bmVyX3Byb29mvQMgT25EZW1hbmQBAghccGxhY2Vfb3JkZXJfYWxsb3dfZGVhdGgBAAgobWF4X2Ftb3VudAgccGFyYV9pZARYcGxhY2Vfb3JkZXJfa2VlcF9hbGl2ZQEACChtYXhfYW1vdW50CBxwYXJhX2lkBCRSZWdpc3RyYXIBAiQgcmVnaXN0ZXIBAAwIaWQEMGdlbmVzaXNfaGVhZCQ8dmFsaWRhdGlvbl9jb2RlJDhmb3JjZV9yZWdpc3RlcgEAFAx3aG8AHGRlcG9zaXQICGlkBDBnZW5lc2lzX2hlYWQkPHZhbGlkYXRpb25fY29kZSQoZGVyZWdpc3RlcgEABAhpZAQQc3dhcAEACAhpZAQUb3RoZXIELHJlbW92ZV9sb2NrAQAEEHBhcmEEHHJlc2VydmUBAQUgYWRkX2xvY2sBAAQQcGFyYQRUc2NoZWR1bGVfY29kZV91cGdyYWRlAQAIEHBhcmEEIG5ld19jb2RlJEBzZXRfY3VycmVudF9oZWFkAQAIEHBhcmEEIG5ld19oZWFkJBRTbG90cwECDCxmb3JjZV9sZWFzZQEAFBBwYXJhBBhsZWFzZXIAGGFtb3VudAgwcGVyaW9kX2JlZ2luBDBwZXJpb2RfY291bnQEQGNsZWFyX2FsbF9sZWFzZXMBAAQQcGFyYQQ8dHJpZ2dlcl9vbmJvYXJkAQAEEHBhcmEEIEF1Y3Rpb25zAQIMLG5ld19hdWN0aW9uAQAIIGR1cmF0aW9uBEhsZWFzZV9wZXJpb2RfaW5kZXgEDGJpZAEAFBBwYXJhBDRhdWN0aW9uX2luZGV4BChmaXJzdF9zbG90BCRsYXN0X3Nsb3QEGGFtb3VudAg4Y2FuY2VsX2F1Y3Rpb24BAQUkQ3Jvd2Rsb2FuAQIkGGNyZWF0ZQEAGBRpbmRleAQMY2FwCDBmaXJzdF9wZXJpb2QELGxhc3RfcGVyaW9kBAxlbmQEIHZlcmlmaWVyPQYoY29udHJpYnV0ZQEADBRpbmRleAQUdmFsdWUIJHNpZ25hdHVyZUUGIHdpdGhkcmF3AQAIDHdobwAUaW5kZXgEGHJlZnVuZAEABBRpbmRleAQgZGlzc29sdmUBAAQUaW5kZXgEEGVkaXQBABgUaW5kZXgEDGNhcAgwZmlyc3RfcGVyaW9kBCxsYXN0X3BlcmlvZAQMZW5kBCB2ZXJpZmllcj0GIGFkZF9tZW1vAQAIFGluZGV4BBBtZW1vJBBwb2tlAQAEFGluZGV4BDhjb250cmlidXRlX2FsbAEACBRpbmRleAQkc2lnbmF0dXJlRQYgQ29yZXRpbWUBAgxIcmVxdWVzdF9jb3JlX2NvdW50AQAEFGNvdW50BEhyZXF1ZXN0X3JldmVudWVfYXQBAAQQd2hlbgQsYXNzaWduX2NvcmUBABAQY29yZQQUYmVnaW4EKGFzc2lnbm1lbnRVBiBlbmRfaGludC0ESFN0YXRlVHJpZU1pZ3JhdGlvbgECGFhjb250cm9sX2F1dG9fbWlncmF0aW9uAQAEMG1heWJlX2NvbmZpZ2EGQGNvbnRpbnVlX21pZ3JhdGUBAAwYbGltaXRzXQY8cmVhbF9zaXplX3VwcGVyBDB3aXRuZXNzX3Rhc2tpBkhtaWdyYXRlX2N1c3RvbV90b3ABAAgQa2V5c30DMHdpdG5lc3Nfc2l6ZQRQbWlncmF0ZV9jdXN0b21fY2hpbGQBAAwQcm9vdCQoY2hpbGRfa2V5c30DKHRvdGFsX3NpemUEVHNldF9zaWduZWRfbWF4X2xpbWl0cwEABBhsaW1pdHNdBkhmb3JjZV9zZXRfcHJvZ3Jlc3MBAAgwcHJvZ3Jlc3NfdG9wZQY4cHJvZ3Jlc3NfY2hpbGRlBiRYY21QYWxsZXQBAjgQc2VuZAEACBBkZXN0mQEcbWVzc2FnZakGPHRlbGVwb3J0X2Fzc2V0cwEAEBBkZXN0mQEsYmVuZWZpY2lhcnmZARhhc3NldHMZAzhmZWVfYXNzZXRfaXRlbQRccmVzZXJ2ZV90cmFuc2Zlcl9hc3NldHMBABAQZGVzdJkBLGJlbmVmaWNpYXJ5mQEYYXNzZXRzGQM4ZmVlX2Fzc2V0X2l0ZW0EHGV4ZWN1dGUBAAgcbWVzc2FnZakGKG1heF93ZWlnaHQYRGZvcmNlX3hjbV92ZXJzaW9uAQAIIGxvY2F0aW9ueQEcdmVyc2lvbgRkZm9yY2VfZGVmYXVsdF94Y21fdmVyc2lvbgEABERtYXliZV94Y21fdmVyc2lvbi0EeGZvcmNlX3N1YnNjcmliZV92ZXJzaW9uX25vdGlmeQEABCBsb2NhdGlvbpkBgGZvcmNlX3Vuc3Vic2NyaWJlX3ZlcnNpb25fbm90aWZ5AQAEIGxvY2F0aW9umQF8bGltaXRlZF9yZXNlcnZlX3RyYW5zZmVyX2Fzc2V0cwEAFBBkZXN0mQEsYmVuZWZpY2lhcnmZARhhc3NldHMZAzhmZWVfYXNzZXRfaXRlbQQwd2VpZ2h0X2xpbWl08QJcbGltaXRlZF90ZWxlcG9ydF9hc3NldHMBABQQZGVzdJkBLGJlbmVmaWNpYXJ5mQEYYXNzZXRzGQM4ZmVlX2Fzc2V0X2l0ZW0EMHdlaWdodF9saW1pdPECQGZvcmNlX3N1c3BlbnNpb24BAAQkc3VzcGVuZGVkFDx0cmFuc2Zlcl9hc3NldHMBABQQZGVzdJkBLGJlbmVmaWNpYXJ5mQEYYXNzZXRzGQM4ZmVlX2Fzc2V0X2l0ZW0EMHdlaWdodF9saW1pdPECMGNsYWltX2Fzc2V0cwEACBhhc3NldHMZAyxiZW5lZmljaWFyeZkBjHRyYW5zZmVyX2Fzc2V0c191c2luZ190eXBlX2FuZF90aGVuAQAcEGRlc3SZARhhc3NldHMZA1Bhc3NldHNfdHJhbnNmZXJfdHlwZa0GOHJlbW90ZV9mZWVzX2lksQZIZmVlc190cmFuc2Zlcl90eXBlrQZIY3VzdG9tX3hjbV9vbl9kZXN0qQYwd2VpZ2h0X2xpbWl08QIwTWVzc2FnZVF1ZXVlAQIIJHJlYXBfcGFnZQEACDhtZXNzYWdlX29yaWdpbiUDKHBhZ2VfaW5kZXgESGV4ZWN1dGVfb3ZlcndlaWdodAEAEDhtZXNzYWdlX29yaWdpbiUDEHBhZ2UEFGluZGV4BDB3ZWlnaHRfbGltaXQYJEFzc2V0UmF0ZQECDBhjcmVhdGUBAAgoYXNzZXRfa2luZIEBEHJhdGUIGHVwZGF0ZQEACChhc3NldF9raW5kgQEQcmF0ZQgYcmVtb3ZlAQAEKGFzc2V0X2tpbmSBARRCZWVmeQECDExyZXBvcnRfZXF1aXZvY2F0aW9uAQAISGVxdWl2b2NhdGlvbl9wcm9vZtUGPGtleV9vd25lcl9wcm9vZr0DcHJlcG9ydF9lcXVpdm9jYXRpb25fdW5zaWduZWQBAAhIZXF1aXZvY2F0aW9uX3Byb29m1QY8a2V5X293bmVyX3Byb29mvQM8c2V0X25ld19nZW5lc2lzAQAEPGRlbGF5X2luX2Jsb2NrcwQGZQUCCCxVbnJlcXVlc3RlZAEACBxkZXBvc2l0ZQUMbGVuBCRSZXF1ZXN0ZWQBAAwcZGVwb3NpdOEGFGNvdW50BAxsZW4tBAIILFVucmVxdWVzdGVkAQAIGHRpY2tldGUFDGxlbgQkUmVxdWVzdGVkAQAMMG1heWJlX3RpY2tldOEGFGNvdW50BCRtYXliZV9sZW4tBAMIIAQACChwcmVfb3V0cHV0IBRwcm9vZkECAAw8YXV0aG9yaXR5X2luZGV4BBBzbG90CDR2cmZfc2lnbmF0dXJl8QYACDxhdXRob3JpdHlfaW5kZXgEEHNsb3QIAgwcUHJpbWFyeQEADDxhdXRob3JpdHlfaW5kZXgEEHNsb3QINHZyZl9zaWduYXR1cmXxBjhTZWNvbmRhcnlQbGFpbgEACDxhdXRob3JpdHlfaW5kZXgEEHNsb3QIMFNlY29uZGFyeVZSRgEADDxhdXRob3JpdHlfaW5kZXgEEHNsb3QINHZyZl9zaWduYXR1cmXxBgb9BgAIBGPBAzRhbGxvd2VkX3Nsb3RzxQMDCAgEBAkHAAMMAAgUAgwMRmVlAQEFEE1pc2MBAQUMQWxsAQEFAAwIaWSRAhhhbW91bnQIHHJlYXNvbnMVBwQZBwAACAhpZJECGGFtb3VudAgEIQcAAgQgUHJlaW1hZ2UBAQUCBDxTbGFzaEZvck1pZ3JhdGUBAQUCCCBQcmVpbWFnZQECBCBQcmVpbWFnZQEBBUhTdGF0ZVRyaWVNaWdyYXRpb24BAgQ8U2xhc2hGb3JNaWdyYXRlAQEFAAgIaWQxBxhhbW91bnQIBDUHAAIEOFBvb2xNaW5CYWxhbmNlAQEFAgQ8Tm9taW5hdGlvblBvb2xzAQIEOFBvb2xNaW5CYWxhbmNlAQEFAAgIaWRBBxhhbW91bnQIBEUHAAIIJFYxQW5jaWVudAEBBQhWMgEBBQAUFHN0YXNoABR0b3RhbAgYYWN0aXZlCCR1bmxvY2tpbmf9A1hsZWdhY3lfY2xhaW1lZF9yZXdhcmRzOQIADBx0YXJnZXRz3QMwc3VibWl0dGVkX2luBChzdXBwcmVzc2VkFAAIFGluZGV4BBRzdGFydPUDAAgMd2hvABR2YWx1ZQgEXQcAAAwUdG90YWwIDG93bggYb3RoZXJzYQcAEBR0b3RhbAgMb3duCDxub21pbmF0b3JfY291bnQEKHBhZ2VfY291bnQEAwwEAAQACChwYWdlX3RvdGFsCBhvdGhlcnNhBwMIAAQEdQcAAAgUdG90YWwEKGluZGl2aWR1YWx5BwAUJHZhbGlkYXRvcgAMb3duCBhvdGhlcnNpBSRyZXBvcnRlcnPdAxhwYXlvdXQIBIEHAAMIBAgAEChzcGFuX2luZGV4BChsYXN0X3N0YXJ0BEhsYXN0X25vbnplcm9fc2xhc2gEFHByaW9yOQIACBxzbGFzaGVkCCBwYWlkX291dAgDCABlBwAIIG9mZmVuZGVylQckcmVwb3J0ZXJz3QMDCEUBJAMIAA0EBKEHAAMIKCQCEBBMaXZlAQEFMFBlbmRpbmdQYXVzZQEACDBzY2hlZHVsZWRfYXQEFGRlbGF5BBhQYXVzZWQBAQU0UGVuZGluZ1Jlc3VtZQEACDBzY2hlZHVsZWRfYXQEFGRlbGF5BAAQMHNjaGVkdWxlZF9hdAQUZGVsYXkEQG5leHRfYXV0aG9yaXRpZXNVARhmb3JjZWQtBAAQIHByb3Bvc2VyABR2YWx1ZQgsYmVuZWZpY2lhcnkAEGJvbmQIAgwcUGVuZGluZwEBBSRBdHRlbXB0ZWQBAAQIaWQIGEZhaWxlZAEBBQAYKGFzc2V0X2tpbmSBARhhbW91bnQILGJlbmVmaWNpYXJ5mQEodmFsaWRfZnJvbQQkZXhwaXJlX2F0BBhzdGF0dXO5BwMIBDUEBMEHAAAIFHZvdGVzCBxjYXBpdGFsCAAMFHZvdGVzxQcsZGVsZWdhdGlvbnPJBxRwcmlvcokHABQcYmFsYW5jZQgYdGFyZ2V0AChjb252aWN0aW9uOQQsZGVsZWdhdGlvbnPJBxRwcmlvcokHAggcQ2FzdGluZwEADBR2b3Rlc8UHLGRlbGVnYXRpb25zyQcUcHJpb3KJByhEZWxlZ2F0aW5nAQAUHGJhbGFuY2UIGHRhcmdldAAoY29udmljdGlvbjkELGRlbGVnYXRpb25zyQcUcHJpb3KJBwSJBwAACAx3aG8AGGFtb3VudAgG3QcACBRzaW5jZQQoY29uZmlybWluZy0EBuUHAwgEDQEG7QcALBR0cmFjawQYb3JpZ2lulQMgcHJvcG9zYWylASRlbmFjdG1lbnRBBCRzdWJtaXR0ZWQESHN1Ym1pc3Npb25fZGVwb3NpdN0HQGRlY2lzaW9uX2RlcG9zaXThByBkZWNpZGluZ+kHFHRhbGx5qQEgaW5fcXVldWUUFGFsYXJt8QcCGBxPbmdvaW5nAQAsFHRyYWNrBBhvcmlnaW6VAyBwcm9wb3NhbKUBJGVuYWN0bWVudEEEJHN1Ym1pdHRlZARIc3VibWlzc2lvbl9kZXBvc2l03QdAZGVjaXNpb25fZGVwb3NpdOEHIGRlY2lkaW5n6QcUdGFsbHmpASBpbl9xdWV1ZRQUYWxhcm3xByBBcHByb3ZlZAEDDAThB+EHIFJlamVjdGVkAQMMBOEH4QckQ2FuY2VsbGVkAQMMBOEH4QcgVGltZWRPdXQBAwwE4QfhBxhLaWxsZWQBAQICDEBMaW5lYXJEZWNyZWFzaW5nAQAMGGxlbmd0aAQUZmxvb3IEEGNlaWwERFN0ZXBwZWREZWNyZWFzaW5nAQAQFGJlZ2luBAxlbmQEEHN0ZXAEGHBlcmlvZAQoUmVjaXByb2NhbAEADBhmYWN0b3IIIHhfb2Zmc2V0CCB5X29mZnNldAgAJBBuYW1lSQMwbWF4X2RlY2lkaW5nBEBkZWNpc2lvbl9kZXBvc2l0CDhwcmVwYXJlX3BlcmlvZAQ8ZGVjaXNpb25fcGVyaW9kBDhjb25maXJtX3BlcmlvZARQbWluX2VuYWN0bWVudF9wZXJpb2QEMG1pbl9hcHByb3ZhbP0HLG1pbl9zdXBwb3J0/QcDCAQBCAQFCAAEdQQAAggIVjABAQUIVjEBAQUADCBkZWxlZ2F0ZQAocHJveHlfdHlwZekBFGRlbGF5BAQVCAADCBkICAAMEHJlYWwAJGNhbGxfaGFzaCAYaGVpZ2h0BAQhCAADCCUICAMIACAAEBB3aGVu8QEcZGVwb3NpdAgkZGVwb3NpdG9yACRhcHByb3ZhbHPdAwIYIFByb3Bvc2VkAQEFIEFwcHJvdmVkAQEFGEZ1bmRlZAEBBTxDdXJhdG9yUHJvcG9zZWQBAAQcY3VyYXRvcgAYQWN0aXZlAQAIHGN1cmF0b3IAKHVwZGF0ZV9kdWUENFBlbmRpbmdQYXlvdXQBAAwcY3VyYXRvcgAsYmVuZWZpY2lhcnkAJHVubG9ja19hdAQAGCBwcm9wb3NlcgAUdmFsdWUIDGZlZQg8Y3VyYXRvcl9kZXBvc2l0CBBib25kCBhzdGF0dXM1CAIQFEFkZGVkAQEFPEN1cmF0b3JQcm9wb3NlZAEABBxjdXJhdG9yABhBY3RpdmUBAAQcY3VyYXRvcgA0UGVuZGluZ1BheW91dAEADBxjdXJhdG9yACxiZW5lZmljaWFyeQAkdW5sb2NrX2F0BAAUNHBhcmVudF9ib3VudHkEFHZhbHVlCAxmZWUIPGN1cmF0b3JfZGVwb3NpdAgYc3RhdHVzPQgADCBzdXBwb3J0c3UFFHNjb3JlCQIcY29tcHV0ZQECAwwACN0DBEkIAAAIGHZvdGVyc00IHHRhcmdldHPdAwMMCQIEBARVCAAAEAx3aG8AHGRlcG9zaXQIMHJhd19zb2x1dGlvblkFIGNhbGxfZmVlCAAUCGlkABBwcmV2BQIQbmV4dAUCJGJhZ191cHBlcggUc2NvcmUIAAgQaGVhZAUCEHRhaWwFAgQIAAAQHHBvb2xfaWQEGHBvaW50cwhwbGFzdF9yZWNvcmRlZF9yZXdhcmRfY291bnRlcgg4dW5ib25kaW5nX2VyYXPZBwYpAgAUHGN1cnJlbnQlAgxtYXgtBCxjaGFuZ2VfcmF0ZXEINHRocm90dGxlX2Zyb20tBEBjbGFpbV9wZXJtaXNzaW9uMQIAECRkZXBvc2l0b3IAEHJvb3QFAiRub21pbmF0b3IFAhxib3VuY2VyBQIAFChjb21taXNzaW9udQg4bWVtYmVyX2NvdW50ZXIEGHBvaW50cwgUcm9sZXN5CBRzdGF0ZR0CABRwbGFzdF9yZWNvcmRlZF9yZXdhcmRfY291bnRlcghsbGFzdF9yZWNvcmRlZF90b3RhbF9wYXlvdXRzCFR0b3RhbF9yZXdhcmRzX2NsYWltZWQIYHRvdGFsX2NvbW1pc3Npb25fcGVuZGluZwhgdG90YWxfY29tbWlzc2lvbl9jbGFpbWVkCAAIGHBvaW50cwgcYmFsYW5jZQgDCASFCASJCAAACBhub19lcmGFCCB3aXRoX2VyYY0IAAgcc3Rhc2hlc2kFHGNoZWNrZWQ5AgCMNG1heF9jb2RlX3NpemUESG1heF9oZWFkX2RhdGFfc2l6ZQRYbWF4X3Vwd2FyZF9xdWV1ZV9jb3VudARUbWF4X3Vwd2FyZF9xdWV1ZV9zaXplBFxtYXhfdXB3YXJkX21lc3NhZ2Vfc2l6ZQSQbWF4X3Vwd2FyZF9tZXNzYWdlX251bV9wZXJfY2FuZGlkYXRlBIhocm1wX21heF9tZXNzYWdlX251bV9wZXJfY2FuZGlkYXRlBGx2YWxpZGF0aW9uX3VwZ3JhZGVfY29vbGRvd24EYHZhbGlkYXRpb25fdXBncmFkZV9kZWxheQRQYXN5bmNfYmFja2luZ19wYXJhbXOVBTBtYXhfcG92X3NpemUEZG1heF9kb3dud2FyZF9tZXNzYWdlX3NpemUEkGhybXBfbWF4X3BhcmFjaGFpbl9vdXRib3VuZF9jaGFubmVscwRMaHJtcF9zZW5kZXJfZGVwb3NpdAhYaHJtcF9yZWNpcGllbnRfZGVwb3NpdAhkaHJtcF9jaGFubmVsX21heF9jYXBhY2l0eQRsaHJtcF9jaGFubmVsX21heF90b3RhbF9zaXplBIxocm1wX21heF9wYXJhY2hhaW5faW5ib3VuZF9jaGFubmVscwR0aHJtcF9jaGFubmVsX21heF9tZXNzYWdlX3NpemUEPGV4ZWN1dG9yX3BhcmFtc6UFVGNvZGVfcmV0ZW50aW9uX3BlcmlvZAQ4bWF4X3ZhbGlkYXRvcnMtBDhkaXNwdXRlX3BlcmlvZASkZGlzcHV0ZV9wb3N0X2NvbmNsdXNpb25fYWNjZXB0YW5jZV9wZXJpb2QENG5vX3Nob3dfc2xvdHMEQG5fZGVsYXlfdHJhbmNoZXMEaHplcm90aF9kZWxheV90cmFuY2hlX3dpZHRoBEBuZWVkZWRfYXBwcm92YWxzBGByZWxheV92cmZfbW9kdWxvX3NhbXBsZXMEOHB2Zl92b3RpbmdfdHRsBIBtaW5pbXVtX3ZhbGlkYXRpb25fdXBncmFkZV9kZWxheQRUbWluaW11bV9iYWNraW5nX3ZvdGVzBDRub2RlX2ZlYXR1cmVzsQVYYXBwcm92YWxfdm90aW5nX3BhcmFtcwRAc2NoZWR1bGVyX3BhcmFtc6kFAwgEmQgEnQgABCABCASlCAAACBhidWZmZXKpCDRsYXRlc3RfbnVtYmVyBAAkEGNvcmUEEGhhc2ggKGRlc2NyaXB0b3JFAixjb21taXRtZW50c8kFSGF2YWlsYWJpbGl0eV92b3Rlc7EFHGJhY2tlcnOxBUxyZWxheV9wYXJlbnRfbnVtYmVyBEBiYWNrZWRfaW5fbnVtYmVyBDRiYWNraW5nX2dyb3VwBASxCAADCATRBQS5CAADCEkCvQgEwQgAAAwcc2Vzc2lvbgSAYmFja2luZ192YWxpZGF0b3JzX3Blcl9jYW5kaWRhdGXFCCBkaXNwdXRlc/kFBDkCAAIIEFBvb2wBAAgccGFyYV9pZAQoY29yZV9pbmRleAQQQnVsawEBAgAMKGFzc2lnbm1lbnTRCFRhdmFpbGFiaWxpdHlfdGltZW91dHMEDHR0bAQCCBBGcmVlAQEFFFBhcmFzAQAMKGFzc2lnbm1lbnTRCFRhdmFpbGFiaWxpdHlfdGltZW91dHMEDHR0bAQE2QgABNUIAAMIBOEIBOUIAAIIQFNldEdvQWhlYWRTaWduYWwBAQVQQXBwbHlBdEV4cGVjdGVkQmxvY2sBAQUCCChPbmJvYXJkaW5nAQECHFVwZ3JhZGUBAAwIaWQELGluY2x1ZGVkX2F0BEB1cGdyYWRlX3N0cmF0ZWd57QgE8QgAABQwdm90ZXNfYWNjZXB0sQUwdm90ZXNfcmVqZWN0sQUMYWdlBChjcmVhdGVkX2F0BBhjYXVzZXP1CAIcKE9uYm9hcmRpbmcBAQUoUGFyYXRocmVhZAEBBSRQYXJhY2hhaW4BAQVMVXBncmFkaW5nUGFyYXRocmVhZAEBBVBEb3duZ3JhZGluZ1BhcmFjaGFpbgEBBVRPZmZib2FyZGluZ1BhcmF0aHJlYWQBAQVQT2ZmYm9hcmRpbmdQYXJhY2hhaW4BAQUACCxleHBlY3RlZF9hdAQwYWN0aXZhdGVkX2F0BAQBCQAACDR1cGdyYWRlX3RpbWVzBQksbGFzdF9wcnVuZWQtBAIIFEFib3J0AQEFHEdvQWhlYWQBAQUCBBxQcmVzZW50AQEFAAwwZ2VuZXNpc19oZWFkJDx2YWxpZGF0aW9uX2NvZGUkJHBhcmFfa2luZBQADCh2YWxpZGF0b3JzOQMYcXVldWVkOQM0c2Vzc2lvbl9pbmRleAQEGQkAAAgcc2VudF9hdAQMbXNnJAQhCQAAGCRjb25maXJtZWQUEF9hZ2UEOHNlbmRlcl9kZXBvc2l0CEBtYXhfbWVzc2FnZV9zaXplBDBtYXhfY2FwYWNpdHkEOG1heF90b3RhbF9zaXplBARVAgAAIDBtYXhfY2FwYWNpdHkEOG1heF90b3RhbF9zaXplBEBtYXhfbWVzc2FnZV9zaXplBCRtc2dfY291bnQEKHRvdGFsX3NpemUEIG1xY19oZWFkEQE4c2VuZGVyX2RlcG9zaXQIRHJlY2lwaWVudF9kZXBvc2l0CAAIHHNlbnRfYXQEEGRhdGEkBDUJAAMIBDkCBD0JAAA0YGFjdGl2ZV92YWxpZGF0b3JfaW5kaWNlczkCLHJhbmRvbV9zZWVkIDhkaXNwdXRlX3BlcmlvZAQodmFsaWRhdG9yczkDOGRpc2NvdmVyeV9rZXlzOQM8YXNzaWdubWVudF9rZXlzOQNAdmFsaWRhdG9yX2dyb3Vwc80IHG5fY29yZXMEaHplcm90aF9kZWxheV90cmFuY2hlX3dpZHRoBGByZWxheV92cmZfbW9kdWxvX3NhbXBsZXMEQG5fZGVsYXlfdHJhbmNoZXMENG5vX3Nob3dfc2xvdHMEQG5lZWRlZF9hcHByb3ZhbHMEAwgEIAAQOHZhbGlkYXRvcnNfZm9ysQVIdmFsaWRhdG9yc19hZ2FpbnN0sQUUc3RhcnQEMGNvbmNsdWRlZF9hdC0EBEkJAAAIEGtleXNRCRBraW5kHQYACChjb3JlX2luZGV4BBRjb3VudAQAEBx0cmFmZmljCChuZXh0X2luZGV4BDhzbWFsbGVzdF9pbmRleAQ0ZnJlZWRfaW5kaWNlczkCAAgccGFyYV9pZAQMaWR4BARhCQAADCxhc3NpZ25tZW50c1UGIGVuZF9oaW50LQQ0bmV4dF9zY2hlZHVsZS0EAAgUZmlyc3QEEGxhc3QEBm0JAAgUcmF0aW8EJHJlbWFpbmluZwQDCE0GdQkEeQkAABAsYXNzaWdubWVudHN9CSBlbmRfaGludC0EDHBvcwQQc3RlcAQGgQkACBRxdWV1ZXEJMGN1cnJlbnRfd29ya4UJAAwcbWFuYWdlcgAcZGVwb3NpdAgYbG9ja2VkTQQE4QYAAwwABAgGlQkEmQkBkAIMFE5ldmVyAQEFJFByZUVuZGluZwEBAhhFbmRpbmcBAQIAKCRkZXBvc2l0b3IAIHZlcmlmaWVyPQYcZGVwb3NpdAgYcmFpc2VkCAxlbmQEDGNhcAhEbGFzdF9jb250cmlidXRpb26hCTBmaXJzdF9wZXJpb2QELGxhc3RfcGVyaW9kBChmdW5kX2luZGV4BAaZAQbBBgIMCFYyAQIQEE51bGwBAQUYQXNzZXRzAQQJAwA8RXhlY3V0aW9uUmVzdWx0AQZ1BhxWZXJzaW9uAQECCFYzAQIYEE51bGwBAQUYQXNzZXRzAQQRAwA8RXhlY3V0aW9uUmVzdWx0AQalAhxWZXJzaW9uAQECLFBhbGxldHNJbmZvAQStAgA4RGlzcGF0Y2hSZXN1bHQBAgwcU3VjY2VzcwEBBRRFcnJvcgEFADhUcnVuY2F0ZWRFcnJvcgEFAAhWNAECGBBOdWxsAQEFGEFzc2V0cwEEnQIAPEV4ZWN1dGlvblJlc3VsdAEGpQIcVmVyc2lvbgEBAixQYWxsZXRzSW5mbwEErQIAOERpc3BhdGNoUmVzdWx0AQIMHFN1Y2Nlc3MBAQUURXJyb3IBBQA4VHJ1bmNhdGVkRXJyb3IBBQACDBxQZW5kaW5nAQAQJHJlc3BvbmRlcpkBTG1heWJlX21hdGNoX3F1ZXJpZXKpCTBtYXliZV9ub3RpZnmtCRx0aW1lb3V0BDxWZXJzaW9uTm90aWZpZXIBAAgYb3JpZ2lumQEkaXNfYWN0aXZlFBRSZWFkeQEACCByZXNwb25zZbEJCGF0BAMIBJkBAwwIGAQDCJkBBATBCQACEFxNaWdyYXRlU3VwcG9ydGVkVmVyc2lvbgEBBVxNaWdyYXRlVmVyc2lvbk5vdGlmaWVycwEBBVBOb3RpZnlDdXJyZW50VGFyZ2V0cwEGJGhNaWdyYXRlQW5kTm90aWZ5T2xkVGFyZ2V0cwEBBQMMBACxBgMIFQEIBNEJAAAQGGFtb3VudAgUb3duZXKZARhsb2NrZXKZASRjb25zdW1lcnPVCQMICJkBBN0JAAAIEHByZXYlAxBuZXh0JQMG5QkAGBRiZWdpbgQMZW5kBBRjb3VudARAcmVhZHlfbmVpZ2hib3Vyc+kJNG1lc3NhZ2VfY291bnQIEHNpemUIAwglAwQAGCRyZW1haW5pbmcEOHJlbWFpbmluZ19zaXplBCxmaXJzdF9pbmRleAQUZmlyc3QEEGxhc3QEEGhlYXAkBAkEAAAMCGlkCAxsZW4ERGtleXNldF9jb21taXRtZW50IAAIJGluZmxhdGlvbggkbmV4dF9taW50wQMACBhoZWFkZXK1AyhleHRyaW5zaWNzfQMCCDRBbGxFeHRyaW5zaWNzAQEFNE9ubHlJbmhlcmVudHMBAQUCLBBDYWxsAQEFHFBheW1lbnQBAQUYRnV0dXJlAQEFFFN0YWxlAQEFIEJhZFByb29mAQEFREFuY2llbnRCaXJ0aEJsb2NrAQEFREV4aGF1c3RzUmVzb3VyY2VzAQEFGEN1c3RvbQEBAjBCYWRNYW5kYXRvcnkBAQVMTWFuZGF0b3J5VmFsaWRhdGlvbgEBBSRCYWRTaWduZXIBAQUCDDBDYW5ub3RMb29rdXABAQVMTm9VbnNpZ25lZFZhbGlkYXRvcgEBBRhDdXN0b20BAQICCBxJbnZhbGlkAQIsEENhbGwBAQUcUGF5bWVudAEBBRhGdXR1cmUBAQUUU3RhbGUBAQUgQmFkUHJvb2YBAQVEQW5jaWVudEJpcnRoQmxvY2sBAQVERXhoYXVzdHNSZXNvdXJjZXMBAQUYQ3VzdG9tAQECMEJhZE1hbmRhdG9yeQEBBUxNYW5kYXRvcnlWYWxpZGF0aW9uAQEFJEJhZFNpZ25lcgEBBRxVbmtub3duAQIMMENhbm5vdExvb2t1cAEBBUxOb1Vuc2lnbmVkVmFsaWRhdG9yAQEFGEN1c3RvbQEBAgcZARUKAwiRAiQEHQoAAAwQb2theRQsZmF0YWxfZXJyb3IUGGVycm9ycyEKAgwcSW5CbG9jawEBBRRMb2NhbAEBBSBFeHRlcm5hbAEBBQAUIHByaW9yaXR5CCByZXF1aXJlc30DIHByb3ZpZGVzfQMkbG9uZ2V2aXR5CCRwcm9wYWdhdGUUBy0KFQoADExzZXNzaW9uX3N0YXJ0X2Jsb2NrBGBncm91cF9yb3RhdGlvbl9mcmVxdWVuY3kEDG5vdwQDCM0INQoACBxwYXJhX2lkBCBjb2xsYXRvchEBBj0KACBQbmV4dF91cF9vbl9hdmFpbGFibGVBCjhvY2N1cGllZF9zaW5jZQQsdGltZV9vdXRfYXQETG5leHRfdXBfb25fdGltZV9vdXRBCjBhdmFpbGFiaWxpdHmxBURncm91cF9yZXNwb25zaWJsZQQ4Y2FuZGlkYXRlX2hhc2ggUGNhbmRpZGF0ZV9kZXNjcmlwdG9yRQICDCBPY2N1cGllZAEAIFBuZXh0X3VwX29uX2F2YWlsYWJsZUEKOG9jY3VwaWVkX3NpbmNlBCx0aW1lX291dF9hdARMbmV4dF91cF9vbl90aW1lX291dEEKMGF2YWlsYWJpbGl0ebEFRGdyb3VwX3Jlc3BvbnNpYmxlBDhjYW5kaWRhdGVfaGFzaCBQY2FuZGlkYXRlX2Rlc2NyaXB0b3JFAiRTY2hlZHVsZWQBAAgccGFyYV9pZAQgY29sbGF0b3IRARBGcmVlAQEFBEkKAAIMIEluY2x1ZGVkAQEFIFRpbWVkT3V0AQEFEEZyZWUBAQUAECxwYXJlbnRfaGVhZCRMcmVsYXlfcGFyZW50X251bWJlcgRkcmVsYXlfcGFyZW50X3N0b3JhZ2Vfcm9vdCAwbWF4X3Bvdl9zaXplBAZVCgMIVQogBl0KBs0FAgw8Q2FuZGlkYXRlQmFja2VkAQMQSQIkBAREQ2FuZGlkYXRlSW5jbHVkZWQBAxBJAiQEBERDYW5kaWRhdGVUaW1lZE91dAEDDEkCJAQEaQoAAwgEOQkEcQoABskIBkUJAwwEIE0JBIEKAAalBQMMBCBVCQSNCgAACDxieXRlc19yZW1haW5pbmcESG1lc3NhZ2VzX3JlbWFpbmluZwQDCASVCgSZCgAGEQkGSQkAOFxtaW5fcmVsYXlfcGFyZW50X251bWJlcgQwbWF4X3Bvdl9zaXplBDRtYXhfY29kZV9zaXplBDR1bXBfcmVtYWluaW5nBEx1bXBfcmVtYWluaW5nX2J5dGVzBGRtYXhfdW1wX251bV9wZXJfY2FuZGlkYXRlBFhkbXBfcmVtYWluaW5nX21lc3NhZ2VzOQIwaHJtcF9pbmJvdW5kOQJEaHJtcF9jaGFubmVsc19vdXSdCmhtYXhfaHJtcF9udW1fcGVyX2NhbmRpZGF0ZQQ8cmVxdWlyZWRfcGFyZW50JFB2YWxpZGF0aW9uX2NvZGVfaGFzaCBMdXBncmFkZV9yZXN0cmljdGlvbqEKWGZ1dHVyZV92YWxpZGF0aW9uX2NvZGWlCgAUOGNhbmRpZGF0ZV9oYXNoIChkZXNjcmlwdG9yRQIsY29tbWl0bWVudHPJBUxyZWxheV9wYXJlbnRfbnVtYmVyBDBtYXhfcG92X3NpemUEBK0KAAAILGNvbnN0cmFpbnRzqQpQcGVuZGluZ19hdmFpbGFiaWxpdHmxCga1CgTNBQAACCh2YWxpZGF0b3Jz+QkIaWQIBsEKAihASW52YWxpZE51bWVyaWNPcAEBBRBQdXNoAQEFHEdldFJvb3QBAQUYQ29tbWl0AQEFNEdlbmVyYXRlUHJvb2YBAQUYVmVyaWZ5AQEFMExlYWZOb3RGb3VuZAEBBURQYWxsZXROb3RJbmNsdWRlZAEBBUBJbnZhbGlkTGVhZkluZGV4AQEFVEludmFsaWRCZXN0S25vd25CbG9jawEBBQcgyQoHCMkKAAwwbGVhZl9pbmRpY2VzaQgobGVhZl9jb3VudAgUaXRlbXM5AwMIfQPVCgfZCskKBxUByQoAGDRzbG90X2R1cmF0aW9uCDBlcG9jaF9sZW5ndGgIBGPBAyxhdXRob3JpdGllc1UBKHJhbmRvbW5lc3MgNGFsbG93ZWRfc2xvdHPFAwAYLGVwb2NoX2luZGV4CChzdGFydF9zbG90CCBkdXJhdGlvbggsYXV0aG9yaXRpZXNVAShyYW5kb21uZXNzIBhjb25maWcFBwMIJCgE7QoABvEKAAwYd2VpZ2h0GBRjbGFzczgscGFydGlhbF9mZWUIAAwgYmFzZV9mZWUIHGxlbl9mZWUITGFkanVzdGVkX3dlaWdodF9mZWUIBv0KAAg0aW5jbHVzaW9uX2ZlZQELDHRpcAgEsQYAAhg0VW5pbXBsZW1lbnRlZAEBBWRWZXJzaW9uZWRDb252ZXJzaW9uRmFpbGVkAQEFTFdlaWdodE5vdENvbXB1dGFibGUBAQVMVW5oYW5kbGVkWGNtVmVyc2lvbgEBBTRBc3NldE5vdEZvdW5kAQEFKFVucm91dGFibGUBAQUHCQsNCwcYDQsHCA0LBxkDDQsENQMABqkGBKkGAAMImQEpCwQtCwAAEEBleGVjdXRpb25fcmVzdWx0vQE4ZW1pdHRlZF9ldmVudHMhCyRsb2NhbF94Y20lCzhmb3J3YXJkZWRfeGNtczELAgg0VW5pbXBsZW1lbnRlZAEBBWRWZXJzaW9uZWRDb252ZXJzaW9uRmFpbGVkAQEFBzULOQsADEBleGVjdXRpb25fcmVzdWx0jQI4ZW1pdHRlZF9ldmVudHMhCzhmb3J3YXJkZWRfeGNtczELB0ELOQsCCCxVbnN1cHBvcnRlZAEBBWRWZXJzaW9uZWRDb252ZXJzaW9uRmFpbGVkAQEFBwBJCwcVAUkDBkkDBEkDAAIsNEFscmVhZHlNZW1iZXIBAQUkTm90TWVtYmVyAQEFKE5vdFBvbGxpbmcBAQUcT25nb2luZwEBBTROb25lUmVtYWluaW5nAQEFKENvcnJ1cHRpb24BAQUoUmFua1Rvb0xvdwEBBThJbnZhbGlkV2l0bmVzcwEBBTBOb1Blcm1pc3Npb24BAQUoU2FtZU1lbWJlcgEBBThUb29NYW55TWVtYmVycwEBBQKAJE5vdE1lbWJlcgEBBTRBbHJlYWR5TWVtYmVyAQEFJFN1c3BlbmRlZAEBBTBOb3RTdXNwZW5kZWQBAQUgTm9QYXlvdXQBAQU4QWxyZWFkeUZvdW5kZWQBAQU8SW5zdWZmaWNpZW50UG90AQEFPEFscmVhZHlWb3VjaGluZwEBBUxOb3RWb3VjaGluZ09uQmlkZGVyAQEFEEhlYWQBAQUcRm91bmRlcgEBBShBbHJlYWR5QmlkAQEFQEFscmVhZHlDYW5kaWRhdGUBAQUwTm90Q2FuZGlkYXRlAQEFKE1heE1lbWJlcnMBAQUoTm90Rm91bmRlcgEBBRxOb3RIZWFkAQEFLE5vdEFwcHJvdmVkAQEFLE5vdFJlamVjdGVkAQEFIEFwcHJvdmVkAQEFIFJlamVjdGVkAQEFKEluUHJvZ3Jlc3MBAQUgVG9vRWFybHkBAQUUVm90ZWQBAQUcRXhwaXJlZAEBBSROb3RCaWRkZXIBAQUoTm9EZWZlbmRlcgEBBSBOb3RHcm91cAEBBTxBbHJlYWR5RWxldmF0ZWQBAQU8QWxyZWFkeVB1bmlzaGVkAQEFREluc3VmZmljaWVudEZ1bmRzAQEFHE5vVm90ZXMBAQUCQChOb3RBbGxvd2VkAQEFNFplcm9UaHJlc2hvbGQBAQVATm90RW5vdWdoRnJpZW5kcwEBBShNYXhGcmllbmRzAQEFJE5vdFNvcnRlZAEBBThOb3RSZWNvdmVyYWJsZQEBBUhBbHJlYWR5UmVjb3ZlcmFibGUBAQU4QWxyZWFkeVN0YXJ0ZWQBAQUoTm90U3RhcnRlZAEBBSROb3RGcmllbmQBAQUsRGVsYXlQZXJpb2QBAQU4QWxyZWFkeVZvdWNoZWQBAQUkVGhyZXNob2xkAQEFLFN0aWxsQWN0aXZlAQEFMEFscmVhZHlQcm94eQEBBSBCYWRTdGF0ZQEBBQI8QER1cmF0aW9uVG9vU21hbGwBAQU4RHVyYXRpb25Ub29CaWcBAQU4QW1vdW50VG9vU21hbGwBAQUkQmlkVG9vTG93AQEFOFVua25vd25SZWNlaXB0AQEFIE5vdE93bmVyAQEFKE5vdEV4cGlyZWQBAQUoVW5rbm93bkJpZAEBBTRQb3J0aW9uVG9vQmlnAQEFIFVuZnVuZGVkAQEFNEFscmVhZHlGdW5kZWQBAQUkVGhyb3R0bGVkAQEFJE1ha2VzRHVzdAEBBTxBbHJlYWR5Q29tbXVuYWwBAQU4QWxyZWFkeVByaXZhdGUBAQUCAQEYU3lzdGVtAQIkPEludmFsaWRTcGVjTmFtZQEBBWhTcGVjVmVyc2lvbk5lZWRzVG9JbmNyZWFzZQEBBXRGYWlsZWRUb0V4dHJhY3RSdW50aW1lVmVyc2lvbgEBBUxOb25EZWZhdWx0Q29tcG9zaXRlAQEFPE5vblplcm9SZWZDb3VudAEBBTBDYWxsRmlsdGVyZWQBAQVsTXVsdGlCbG9ja01pZ3JhdGlvbnNPbmdvaW5nAQEFRE5vdGhpbmdBdXRob3JpemVkAQEFMFVuYXV0aG9yaXplZAEBBRBCYWJlAQIQYEludmFsaWRFcXVpdm9jYXRpb25Qcm9vZgEBBWBJbnZhbGlkS2V5T3duZXJzaGlwUHJvb2YBAQVYRHVwbGljYXRlT2ZmZW5jZVJlcG9ydAEBBVBJbnZhbGlkQ29uZmlndXJhdGlvbgEBBSRUaW1lc3RhbXABAQUcSW5kaWNlcwECFCxOb3RBc3NpZ25lZAEBBSBOb3RPd25lcgEBBRRJblVzZQEBBSxOb3RUcmFuc2ZlcgEBBSRQZXJtYW5lbnQBAQUgQmFsYW5jZXMBAjA4VmVzdGluZ0JhbGFuY2UBAQVUTGlxdWlkaXR5UmVzdHJpY3Rpb25zAQEFTEluc3VmZmljaWVudEJhbGFuY2UBAQVIRXhpc3RlbnRpYWxEZXBvc2l0AQEFNEV4cGVuZGFiaWxpdHkBAQVcRXhpc3RpbmdWZXN0aW5nU2NoZWR1bGUBAQUsRGVhZEFjY291bnQBAQU8VG9vTWFueVJlc2VydmVzAQEFMFRvb01hbnlIb2xkcwEBBThUb29NYW55RnJlZXplcwEBBUxJc3N1YW5jZURlYWN0aXZhdGVkAQEFJERlbHRhWmVybwEBBUhUcmFuc2FjdGlvblBheW1lbnQBAQUoQXV0aG9yc2hpcAEBBRxTdGFraW5nAQJ8NE5vdENvbnRyb2xsZXIBAQUgTm90U3Rhc2gBAQU0QWxyZWFkeUJvbmRlZAEBBTRBbHJlYWR5UGFpcmVkAQEFMEVtcHR5VGFyZ2V0cwEBBThEdXBsaWNhdGVJbmRleAEBBURJbnZhbGlkU2xhc2hJbmRleAEBBUBJbnN1ZmZpY2llbnRCb25kAQEFME5vTW9yZUNodW5rcwEBBTROb1VubG9ja0NodW5rAQEFMEZ1bmRlZFRhcmdldAEBBUhJbnZhbGlkRXJhVG9SZXdhcmQBAQVoSW52YWxpZE51bWJlck9mTm9taW5hdGlvbnMBAQVITm90U29ydGVkQW5kVW5pcXVlAQEFOEFscmVhZHlDbGFpbWVkAQEFLEludmFsaWRQYWdlAQEFVEluY29ycmVjdEhpc3RvcnlEZXB0aAEBBVhJbmNvcnJlY3RTbGFzaGluZ1NwYW5zAQEFIEJhZFN0YXRlAQEFOFRvb01hbnlUYXJnZXRzAQEFJEJhZFRhcmdldAEBBUBDYW5ub3RDaGlsbE90aGVyAQEFRFRvb01hbnlOb21pbmF0b3JzAQEFRFRvb01hbnlWYWxpZGF0b3JzAQEFQENvbW1pc3Npb25Ub29Mb3cBAQUsQm91bmROb3RNZXQBAQVQQ29udHJvbGxlckRlcHJlY2F0ZWQBAQVMQ2Fubm90UmVzdG9yZUxlZGdlcgEBBWxSZXdhcmREZXN0aW5hdGlvblJlc3RyaWN0ZWQBAQU4Tm90RW5vdWdoRnVuZHMBAQVcVmlydHVhbFN0YWtlck5vdEFsbG93ZWQBAQUgT2ZmZW5jZXMBAQUoSGlzdG9yaWNhbAEBBRxTZXNzaW9uAQIUMEludmFsaWRQcm9vZgEBBVxOb0Fzc29jaWF0ZWRWYWxpZGF0b3JJZAEBBTREdXBsaWNhdGVkS2V5AQEFGE5vS2V5cwEBBSROb0FjY291bnQBAQUcR3JhbmRwYQECHCxQYXVzZUZhaWxlZAEBBTBSZXN1bWVGYWlsZWQBAQU0Q2hhbmdlUGVuZGluZwEBBRxUb29Tb29uAQEFYEludmFsaWRLZXlPd25lcnNoaXBQcm9vZgEBBWBJbnZhbGlkRXF1aXZvY2F0aW9uUHJvb2YBAQVYRHVwbGljYXRlT2ZmZW5jZVJlcG9ydAEBBUhBdXRob3JpdHlEaXNjb3ZlcnkBAQUgVHJlYXN1cnkBAiwwSW52YWxpZEluZGV4AQEFQFRvb01hbnlBcHByb3ZhbHMBAQVYSW5zdWZmaWNpZW50UGVybWlzc2lvbgEBBUxQcm9wb3NhbE5vdEFwcHJvdmVkAQEFWEZhaWxlZFRvQ29udmVydEJhbGFuY2UBAQUwU3BlbmRFeHBpcmVkAQEFLEVhcmx5UGF5b3V0AQEFQEFscmVhZHlBdHRlbXB0ZWQBAQUsUGF5b3V0RXJyb3IBAQUwTm90QXR0ZW1wdGVkAQEFMEluY29uY2x1c2l2ZQEBBUBDb252aWN0aW9uVm90aW5nAQIwKE5vdE9uZ29pbmcBAQUgTm90Vm90ZXIBAQUwTm9QZXJtaXNzaW9uAQEFPE5vUGVybWlzc2lvbllldAEBBURBbHJlYWR5RGVsZWdhdGluZwEBBTRBbHJlYWR5Vm90aW5nAQEFREluc3VmZmljaWVudEZ1bmRzAQEFNE5vdERlbGVnYXRpbmcBAQUgTm9uc2Vuc2UBAQU8TWF4Vm90ZXNSZWFjaGVkAQEFLENsYXNzTmVlZGVkAQEFIEJhZENsYXNzAQEFJFJlZmVyZW5kYQECOChOb3RPbmdvaW5nAQEFKEhhc0RlcG9zaXQBAQUgQmFkVHJhY2sBAQUQRnVsbAEBBShRdWV1ZUVtcHR5AQEFNEJhZFJlZmVyZW5kdW0BAQUsTm90aGluZ1RvRG8BAQUcTm9UcmFjawEBBShVbmZpbmlzaGVkAQEFME5vUGVybWlzc2lvbgEBBSROb0RlcG9zaXQBAQUkQmFkU3RhdHVzAQEFQFByZWltYWdlTm90RXhpc3QBAQWEUHJlaW1hZ2VTdG9yZWRXaXRoRGlmZmVyZW50TGVuZ3RoAQEFUEZlbGxvd3NoaXBDb2xsZWN0aXZlAQIsNEFscmVhZHlNZW1iZXIBAQUkTm90TWVtYmVyAQEFKE5vdFBvbGxpbmcBAQUcT25nb2luZwEBBTROb25lUmVtYWluaW5nAQEFKENvcnJ1cHRpb24BAQUoUmFua1Rvb0xvdwEBBThJbnZhbGlkV2l0bmVzcwEBBTBOb1Blcm1pc3Npb24BAQUoU2FtZU1lbWJlcgEBBThUb29NYW55TWVtYmVycwEBBUxGZWxsb3dzaGlwUmVmZXJlbmRhAQI4KE5vdE9uZ29pbmcBAQUoSGFzRGVwb3NpdAEBBSBCYWRUcmFjawEBBRBGdWxsAQEFKFF1ZXVlRW1wdHkBAQU0QmFkUmVmZXJlbmR1bQEBBSxOb3RoaW5nVG9EbwEBBRxOb1RyYWNrAQEFKFVuZmluaXNoZWQBAQUwTm9QZXJtaXNzaW9uAQEFJE5vRGVwb3NpdAEBBSRCYWRTdGF0dXMBAQVAUHJlaW1hZ2VOb3RFeGlzdAEBBYRQcmVpbWFnZVN0b3JlZFdpdGhEaWZmZXJlbnRMZW5ndGgBAQUcT3JpZ2lucwEBBSRXaGl0ZWxpc3QBAhRMVW5hdmFpbGFibGVQcmVJbWFnZQEBBTxVbmRlY29kYWJsZUNhbGwBAQVgSW52YWxpZENhbGxXZWlnaHRXaXRuZXNzAQEFUENhbGxJc05vdFdoaXRlbGlzdGVkAQEFWENhbGxBbHJlYWR5V2hpdGVsaXN0ZWQBAQUoUGFyYW1ldGVycwEBBRhDbGFpbXMBAhhgSW52YWxpZEV0aGVyZXVtU2lnbmF0dXJlAQEFQFNpZ25lckhhc05vQ2xhaW0BAQVAU2VuZGVySGFzTm9DbGFpbQEBBTBQb3RVbmRlcmZsb3cBAQVASW52YWxpZFN0YXRlbWVudAEBBUxWZXN0ZWRCYWxhbmNlRXhpc3RzAQEFHFV0aWxpdHkBAgQwVG9vTWFueUNhbGxzAQEFHFNvY2lldHkBAoAkTm90TWVtYmVyAQEFNEFscmVhZHlNZW1iZXIBAQUkU3VzcGVuZGVkAQEFME5vdFN1c3BlbmRlZAEBBSBOb1BheW91dAEBBThBbHJlYWR5Rm91bmRlZAEBBTxJbnN1ZmZpY2llbnRQb3QBAQU8QWxyZWFkeVZvdWNoaW5nAQEFTE5vdFZvdWNoaW5nT25CaWRkZXIBAQUQSGVhZAEBBRxGb3VuZGVyAQEFKEFscmVhZHlCaWQBAQVAQWxyZWFkeUNhbmRpZGF0ZQEBBTBOb3RDYW5kaWRhdGUBAQUoTWF4TWVtYmVycwEBBShOb3RGb3VuZGVyAQEFHE5vdEhlYWQBAQUsTm90QXBwcm92ZWQBAQUsTm90UmVqZWN0ZWQBAQUgQXBwcm92ZWQBAQUgUmVqZWN0ZWQBAQUoSW5Qcm9ncmVzcwEBBSBUb29FYXJseQEBBRRWb3RlZAEBBRxFeHBpcmVkAQEFJE5vdEJpZGRlcgEBBShOb0RlZmVuZGVyAQEFIE5vdEdyb3VwAQEFPEFscmVhZHlFbGV2YXRlZAEBBTxBbHJlYWR5UHVuaXNoZWQBAQVESW5zdWZmaWNpZW50RnVuZHMBAQUcTm9Wb3RlcwEBBSBSZWNvdmVyeQECQChOb3RBbGxvd2VkAQEFNFplcm9UaHJlc2hvbGQBAQVATm90RW5vdWdoRnJpZW5kcwEBBShNYXhGcmllbmRzAQEFJE5vdFNvcnRlZAEBBThOb3RSZWNvdmVyYWJsZQEBBUhBbHJlYWR5UmVjb3ZlcmFibGUBAQU4QWxyZWFkeVN0YXJ0ZWQBAQUoTm90U3RhcnRlZAEBBSROb3RGcmllbmQBAQUsRGVsYXlQZXJpb2QBAQU4QWxyZWFkeVZvdWNoZWQBAQUkVGhyZXNob2xkAQEFLFN0aWxsQWN0aXZlAQEFMEFscmVhZHlQcm94eQEBBSBCYWRTdGF0ZQEBBRxWZXN0aW5nAQIUKE5vdFZlc3RpbmcBAQVUQXRNYXhWZXN0aW5nU2NoZWR1bGVzAQEFJEFtb3VudExvdwEBBWBTY2hlZHVsZUluZGV4T3V0T2ZCb3VuZHMBAQVUSW52YWxpZFNjaGVkdWxlUGFyYW1zAQEFJFNjaGVkdWxlcgECFEBGYWlsZWRUb1NjaGVkdWxlAQEFIE5vdEZvdW5kAQEFXFRhcmdldEJsb2NrTnVtYmVySW5QYXN0AQEFSFJlc2NoZWR1bGVOb0NoYW5nZQEBBRROYW1lZAEBBRRQcm94eQECIBxUb29NYW55AQEFIE5vdEZvdW5kAQEFIE5vdFByb3h5AQEFLFVucHJveHlhYmxlAQEFJER1cGxpY2F0ZQEBBTBOb1Blcm1pc3Npb24BAQUsVW5hbm5vdW5jZWQBAQUsTm9TZWxmUHJveHkBAQUgTXVsdGlzaWcBAjhATWluaW11bVRocmVzaG9sZAEBBTxBbHJlYWR5QXBwcm92ZWQBAQVETm9BcHByb3ZhbHNOZWVkZWQBAQVEVG9vRmV3U2lnbmF0b3JpZXMBAQVIVG9vTWFueVNpZ25hdG9yaWVzAQEFVFNpZ25hdG9yaWVzT3V0T2ZPcmRlcgEBBUxTZW5kZXJJblNpZ25hdG9yaWVzAQEFIE5vdEZvdW5kAQEFIE5vdE93bmVyAQEFLE5vVGltZXBvaW50AQEFOFdyb25nVGltZXBvaW50AQEFTFVuZXhwZWN0ZWRUaW1lcG9pbnQBAQU8TWF4V2VpZ2h0VG9vTG93AQEFNEFscmVhZHlTdG9yZWQBAQUgUHJlaW1hZ2UBAiQYVG9vQmlnAQEFMEFscmVhZHlOb3RlZAEBBTROb3RBdXRob3JpemVkAQEFIE5vdE5vdGVkAQEFJFJlcXVlc3RlZAEBBTBOb3RSZXF1ZXN0ZWQBAQUcVG9vTWFueQEBBRhUb29GZXcBAQUYTm9Db3N0AQEFIEJvdW50aWVzAQIscEluc3VmZmljaWVudFByb3Bvc2Vyc0JhbGFuY2UBAQUwSW52YWxpZEluZGV4AQEFMFJlYXNvblRvb0JpZwEBBUBVbmV4cGVjdGVkU3RhdHVzAQEFOFJlcXVpcmVDdXJhdG9yAQEFMEludmFsaWRWYWx1ZQEBBShJbnZhbGlkRmVlAQEFNFBlbmRpbmdQYXlvdXQBAQUkUHJlbWF0dXJlAQEFUEhhc0FjdGl2ZUNoaWxkQm91bnR5AQEFNFRvb01hbnlRdWV1ZWQBAQU0Q2hpbGRCb3VudGllcwECDFRQYXJlbnRCb3VudHlOb3RBY3RpdmUBAQVkSW5zdWZmaWNpZW50Qm91bnR5QmFsYW5jZQEBBVBUb29NYW55Q2hpbGRCb3VudGllcwEBBWhFbGVjdGlvblByb3ZpZGVyTXVsdGlQaGFzZQECPGhQcmVEaXNwYXRjaEVhcmx5U3VibWlzc2lvbgEBBWxQcmVEaXNwYXRjaFdyb25nV2lubmVyQ291bnQBAQVkUHJlRGlzcGF0Y2hXZWFrU3VibWlzc2lvbgEBBTxTaWduZWRRdWV1ZUZ1bGwBAQVYU2lnbmVkQ2Fubm90UGF5RGVwb3NpdAEBBVBTaWduZWRJbnZhbGlkV2l0bmVzcwEBBUxTaWduZWRUb29NdWNoV2VpZ2h0AQEFPE9jd0NhbGxXcm9uZ0VyYQEBBVxNaXNzaW5nU25hcHNob3RNZXRhZGF0YQEBBVhJbnZhbGlkU3VibWlzc2lvbkluZGV4AQEFOENhbGxOb3RBbGxvd2VkAQEFOEZhbGxiYWNrRmFpbGVkAQEFLEJvdW5kTm90TWV0AQEFOFRvb01hbnlXaW5uZXJzAQEFZFByZURpc3BhdGNoRGlmZmVyZW50Um91bmQBAQUMTmlzAQI8QER1cmF0aW9uVG9vU21hbGwBAQU4RHVyYXRpb25Ub29CaWcBAQU4QW1vdW50VG9vU21hbGwBAQUkQmlkVG9vTG93AQEFOFVua25vd25SZWNlaXB0AQEFIE5vdE93bmVyAQEFKE5vdEV4cGlyZWQBAQUoVW5rbm93bkJpZAEBBTRQb3J0aW9uVG9vQmlnAQEFIFVuZnVuZGVkAQEFNEFscmVhZHlGdW5kZWQBAQUkVGhyb3R0bGVkAQEFJE1ha2VzRHVzdAEBBTxBbHJlYWR5Q29tbXVuYWwBAQU4QWxyZWFkeVByaXZhdGUBAQVYTmlzQ291bnRlcnBhcnRCYWxhbmNlcwECMDhWZXN0aW5nQmFsYW5jZQEBBVRMaXF1aWRpdHlSZXN0cmljdGlvbnMBAQVMSW5zdWZmaWNpZW50QmFsYW5jZQEBBUhFeGlzdGVudGlhbERlcG9zaXQBAQU0RXhwZW5kYWJpbGl0eQEBBVxFeGlzdGluZ1Zlc3RpbmdTY2hlZHVsZQEBBSxEZWFkQWNjb3VudAEBBTxUb29NYW55UmVzZXJ2ZXMBAQUwVG9vTWFueUhvbGRzAQEFOFRvb01hbnlGcmVlemVzAQEFTElzc3VhbmNlRGVhY3RpdmF0ZWQBAQUkRGVsdGFaZXJvAQEFJFZvdGVyTGlzdAECBBBMaXN0AQIQJER1cGxpY2F0ZQEBBShOb3RIZWF2aWVyAQEFME5vdEluU2FtZUJhZwEBBTBOb2RlTm90Rm91bmQBAQU8Tm9taW5hdGlvblBvb2xzAQKQMFBvb2xOb3RGb3VuZAEBBUhQb29sTWVtYmVyTm90Rm91bmQBAQVIUmV3YXJkUG9vbE5vdEZvdW5kAQEFQFN1YlBvb2xzTm90Rm91bmQBAQVkQWNjb3VudEJlbG9uZ3NUb090aGVyUG9vbAEBBThGdWxseVVuYm9uZGluZwEBBURNYXhVbmJvbmRpbmdMaW1pdAEBBURDYW5ub3RXaXRoZHJhd0FueQEBBURNaW5pbXVtQm9uZE5vdE1ldAEBBTBPdmVyZmxvd1Jpc2sBAQU0Tm90RGVzdHJveWluZwEBBTBOb3ROb21pbmF0b3IBAQVUTm90S2lja2VyT3JEZXN0cm95aW5nAQEFHE5vdE9wZW4BAQUgTWF4UG9vbHMBAQU4TWF4UG9vbE1lbWJlcnMBAQVEQ2FuTm90Q2hhbmdlU3RhdGUBAQVURG9lc05vdEhhdmVQZXJtaXNzaW9uAQEFVE1ldGFkYXRhRXhjZWVkc01heExlbgEBBSREZWZlbnNpdmUBAhxoTm90RW5vdWdoU3BhY2VJblVuYm9uZFBvb2wBAQUwUG9vbE5vdEZvdW5kAQEFSFJld2FyZFBvb2xOb3RGb3VuZAEBBUBTdWJQb29sc05vdEZvdW5kAQEFcEJvbmRlZFN0YXNoS2lsbGVkUHJlbWF0dXJlbHkBAQVURGVsZWdhdGlvblVuc3VwcG9ydGVkAQEFPFNsYXNoTm90QXBwbGllZAEBBZxQYXJ0aWFsVW5ib25kTm90QWxsb3dlZFBlcm1pc3Npb25sZXNzbHkBAQVcTWF4Q29tbWlzc2lvblJlc3RyaWN0ZWQBAQVgQ29tbWlzc2lvbkV4Y2VlZHNNYXhpbXVtAQEFeENvbW1pc3Npb25FeGNlZWRzR2xvYmFsTWF4aW11bQEBBWRDb21taXNzaW9uQ2hhbmdlVGhyb3R0bGVkAQEFeENvbW1pc3Npb25DaGFuZ2VSYXRlTm90QWxsb3dlZAEBBUxOb1BlbmRpbmdDb21taXNzaW9uAQEFWE5vQ29tbWlzc2lvbkN1cnJlbnRTZXQBAQUsUG9vbElkSW5Vc2UBAQU0SW52YWxpZFBvb2xJZAEBBUxCb25kRXh0cmFSZXN0cmljdGVkAQEFPE5vdGhpbmdUb0FkanVzdAEBBThOb3RoaW5nVG9TbGFzaAEBBTxBbHJlYWR5TWlncmF0ZWQBAQUsTm90TWlncmF0ZWQBAQUwTm90U3VwcG9ydGVkAQEFLEZhc3RVbnN0YWtlAQIYNE5vdENvbnRyb2xsZXIBAQU0QWxyZWFkeVF1ZXVlZAEBBThOb3RGdWxseUJvbmRlZAEBBSROb3RRdWV1ZWQBAQUsQWxyZWFkeUhlYWQBAQU4Q2FsbE5vdEFsbG93ZWQBAQVAUGFyYWNoYWluc09yaWdpbgEBBTRDb25maWd1cmF0aW9uAQIEPEludmFsaWROZXdWYWx1ZQEBBSxQYXJhc1NoYXJlZAEBBTRQYXJhSW5jbHVzaW9uAQJIZFZhbGlkYXRvckluZGV4T3V0T2ZCb3VuZHMBAQVQVW5zY2hlZHVsZWRDYW5kaWRhdGUBAQVASGVhZERhdGFUb29MYXJnZQEBBVBQcmVtYXR1cmVDb2RlVXBncmFkZQEBBTxOZXdDb2RlVG9vTGFyZ2UBAQVURGlzYWxsb3dlZFJlbGF5UGFyZW50AQEFREludmFsaWRBc3NpZ25tZW50AQEFREludmFsaWRHcm91cEluZGV4AQEFTEluc3VmZmljaWVudEJhY2tpbmcBAQU4SW52YWxpZEJhY2tpbmcBAQVETm90Q29sbGF0b3JTaWduZWQBAQVoVmFsaWRhdGlvbkRhdGFIYXNoTWlzbWF0Y2gBAQWASW5jb3JyZWN0RG93bndhcmRNZXNzYWdlSGFuZGxpbmcBAQVUSW52YWxpZFVwd2FyZE1lc3NhZ2VzAQEFYEhybXBXYXRlcm1hcmtNaXNoYW5kbGluZwEBBUxJbnZhbGlkT3V0Ym91bmRIcm1wAQEFZEludmFsaWRWYWxpZGF0aW9uQ29kZUhhc2gBAQVAUGFyYUhlYWRNaXNtYXRjaAEBBTBQYXJhSW5oZXJlbnQBAhRkVG9vTWFueUluY2x1c2lvbkluaGVyZW50cwEBBUxJbnZhbGlkUGFyZW50SGVhZGVyAQEFSEluaGVyZW50T3ZlcndlaWdodAEBBYRDYW5kaWRhdGVzRmlsdGVyZWREdXJpbmdFeGVjdXRpb24BAQVQVW5zY2hlZHVsZWRDYW5kaWRhdGUBAQU0UGFyYVNjaGVkdWxlcgEBBRRQYXJhcwECNDROb3RSZWdpc3RlcmVkAQEFNENhbm5vdE9uYm9hcmQBAQU4Q2Fubm90T2ZmYm9hcmQBAQU0Q2Fubm90VXBncmFkZQEBBTxDYW5ub3REb3duZ3JhZGUBAQVYUHZmQ2hlY2tTdGF0ZW1lbnRTdGFsZQEBBVxQdmZDaGVja1N0YXRlbWVudEZ1dHVyZQEBBYRQdmZDaGVja1ZhbGlkYXRvckluZGV4T3V0T2ZCb3VuZHMBAQVgUHZmQ2hlY2tJbnZhbGlkU2lnbmF0dXJlAQEFSFB2ZkNoZWNrRG91YmxlVm90ZQEBBVhQdmZDaGVja1N1YmplY3RJbnZhbGlkAQEFRENhbm5vdFVwZ3JhZGVDb2RlAQEFLEludmFsaWRDb2RlAQEFLEluaXRpYWxpemVyAQEFDERtcAEBBRBIcm1wAQJQVE9wZW5Icm1wQ2hhbm5lbFRvU2VsZgEBBXxPcGVuSHJtcENoYW5uZWxJbnZhbGlkUmVjaXBpZW50AQEFbE9wZW5Icm1wQ2hhbm5lbFplcm9DYXBhY2l0eQEBBYxPcGVuSHJtcENoYW5uZWxDYXBhY2l0eUV4Y2VlZHNMaW1pdAEBBXhPcGVuSHJtcENoYW5uZWxaZXJvTWVzc2FnZVNpemUBAQWYT3BlbkhybXBDaGFubmVsTWVzc2FnZVNpemVFeGNlZWRzTGltaXQBAQVwT3BlbkhybXBDaGFubmVsQWxyZWFkeUV4aXN0cwEBBXxPcGVuSHJtcENoYW5uZWxBbHJlYWR5UmVxdWVzdGVkAQEFcE9wZW5Icm1wQ2hhbm5lbExpbWl0RXhjZWVkZWQBAQVwQWNjZXB0SHJtcENoYW5uZWxEb2VzbnRFeGlzdAEBBYRBY2NlcHRIcm1wQ2hhbm5lbEFscmVhZHlDb25maXJtZWQBAQV4QWNjZXB0SHJtcENoYW5uZWxMaW1pdEV4Y2VlZGVkAQEFcENsb3NlSHJtcENoYW5uZWxVbmF1dGhvcml6ZWQBAQVsQ2xvc2VIcm1wQ2hhbm5lbERvZXNudEV4aXN0AQEFfENsb3NlSHJtcENoYW5uZWxBbHJlYWR5VW5kZXJ3YXkBAQWEQ2FuY2VsSHJtcE9wZW5DaGFubmVsVW5hdXRob3JpemVkAQEFaE9wZW5Icm1wQ2hhbm5lbERvZXNudEV4aXN0AQEFfE9wZW5Icm1wQ2hhbm5lbEFscmVhZHlDb25maXJtZWQBAQUwV3JvbmdXaXRuZXNzAQEFcENoYW5uZWxDcmVhdGlvbk5vdEF1dGhvcml6ZWQBAQU8UGFyYVNlc3Npb25JbmZvAQEFNFBhcmFzRGlzcHV0ZXMBAiR0RHVwbGljYXRlRGlzcHV0ZVN0YXRlbWVudFNldHMBAQVcQW5jaWVudERpc3B1dGVTdGF0ZW1lbnQBAQVkVmFsaWRhdG9ySW5kZXhPdXRPZkJvdW5kcwEBBUBJbnZhbGlkU2lnbmF0dXJlAQEFSER1cGxpY2F0ZVN0YXRlbWVudAEBBUhTaW5nbGVTaWRlZERpc3B1dGUBAQU8TWFsaWNpb3VzQmFja2VyAQEFTE1pc3NpbmdCYWNraW5nVm90ZXMBAQVIVW5jb25maXJtZWREaXNwdXRlAQEFNFBhcmFzU2xhc2hpbmcBAhhgSW52YWxpZEtleU93bmVyc2hpcFByb29mAQEFTEludmFsaWRTZXNzaW9uSW5kZXgBAQVQSW52YWxpZENhbmRpZGF0ZUhhc2gBAQVUSW52YWxpZFZhbGlkYXRvckluZGV4AQEFYFZhbGlkYXRvckluZGV4SWRNaXNtYXRjaAEBBVxEdXBsaWNhdGVTbGFzaGluZ1JlcG9ydAEBBWhPbkRlbWFuZEFzc2lnbm1lbnRQcm92aWRlcgECCCRRdWV1ZUZ1bGwBAQVwU3BvdFByaWNlSGlnaGVyVGhhbk1heEFtb3VudAEBBWhDb3JldGltZUFzc2lnbm1lbnRQcm92aWRlcgECGEBBc3NpZ25tZW50c0VtcHR5AQEFNE92ZXJTY2hlZHVsZWQBAQU4VW5kZXJTY2hlZHVsZWQBAQVARGlzYWxsb3dlZEluc2VydAEBBTxEdXBsaWNhdGVJbnNlcnQBAQVQQXNzaWdubWVudHNOb3RTb3J0ZWQBAQUkUmVnaXN0cmFyAQI4NE5vdFJlZ2lzdGVyZWQBAQVEQWxyZWFkeVJlZ2lzdGVyZWQBAQUgTm90T3duZXIBAQUwQ29kZVRvb0xhcmdlAQEFQEhlYWREYXRhVG9vTGFyZ2UBAQUwTm90UGFyYWNoYWluAQEFNE5vdFBhcmF0aHJlYWQBAQVAQ2Fubm90RGVyZWdpc3RlcgEBBTxDYW5ub3REb3duZ3JhZGUBAQU0Q2Fubm90VXBncmFkZQEBBShQYXJhTG9ja2VkAQEFLE5vdFJlc2VydmVkAQEFLEludmFsaWRDb2RlAQEFKENhbm5vdFN3YXABAQUUU2xvdHMBAghEUGFyYU5vdE9uYm9hcmRpbmcBAQUoTGVhc2VFcnJvcgEBBSBBdWN0aW9ucwECHERBdWN0aW9uSW5Qcm9ncmVzcwEBBURMZWFzZVBlcmlvZEluUGFzdAEBBURQYXJhTm90UmVnaXN0ZXJlZAEBBUROb3RDdXJyZW50QXVjdGlvbgEBBShOb3RBdWN0aW9uAQEFMEF1Y3Rpb25FbmRlZAEBBUBBbHJlYWR5TGVhc2VkT3V0AQEFJENyb3dkbG9hbgECXERGaXJzdFBlcmlvZEluUGFzdAEBBWRGaXJzdFBlcmlvZFRvb0ZhckluRnV0dXJlAQEFbExhc3RQZXJpb2RCZWZvcmVGaXJzdFBlcmlvZAEBBWBMYXN0UGVyaW9kVG9vRmFySW5GdXR1cmUBAQU8Q2Fubm90RW5kSW5QYXN0AQEFREVuZFRvb0ZhckluRnV0dXJlAQEFIE92ZXJmbG93AQEFUENvbnRyaWJ1dGlvblRvb1NtYWxsAQEFNEludmFsaWRQYXJhSWQBAQUsQ2FwRXhjZWVkZWQBAQVYQ29udHJpYnV0aW9uUGVyaW9kT3ZlcgEBBTRJbnZhbGlkT3JpZ2luAQEFME5vdFBhcmFjaGFpbgEBBSxMZWFzZUFjdGl2ZQEBBUBCaWRPckxlYXNlQWN0aXZlAQEFMEZ1bmROb3RFbmRlZAEBBTxOb0NvbnRyaWJ1dGlvbnMBAQVITm90UmVhZHlUb0Rpc3NvbHZlAQEFQEludmFsaWRTaWduYXR1cmUBAQUwTWVtb1Rvb0xhcmdlAQEFREFscmVhZHlJbk5ld1JhaXNlAQEFSFZyZkRlbGF5SW5Qcm9ncmVzcwEBBTROb0xlYXNlUGVyaW9kAQEFIENvcmV0aW1lAQIMJE5vdEJyb2tlcgEBBVhSZXF1ZXN0ZWRGdXR1cmVSZXZlbnVlAQEFTEFzc2V0VHJhbnNmZXJGYWlsZWQBAQUkWGNtUGFsbGV0AQJgLFVucmVhY2hhYmxlAQEFLFNlbmRGYWlsdXJlAQEFIEZpbHRlcmVkAQEFSFVud2VpZ2hhYmxlTWVzc2FnZQEBBWBEZXN0aW5hdGlvbk5vdEludmVydGlibGUBAQUURW1wdHkBAQU4Q2Fubm90UmVhbmNob3IBAQU0VG9vTWFueUFzc2V0cwEBBTRJbnZhbGlkT3JpZ2luAQEFKEJhZFZlcnNpb24BAQUsQmFkTG9jYXRpb24BAQU4Tm9TdWJzY3JpcHRpb24BAQVEQWxyZWFkeVN1YnNjcmliZWQBAQVYQ2Fubm90Q2hlY2tPdXRUZWxlcG9ydAEBBShMb3dCYWxhbmNlAQEFMFRvb01hbnlMb2NrcwEBBUxBY2NvdW50Tm90U292ZXJlaWduAQEFKEZlZXNOb3RNZXQBAQUwTG9ja05vdEZvdW5kAQEFFEluVXNlAQEFaEludmFsaWRBc3NldFVua25vd25SZXNlcnZlAQEFeEludmFsaWRBc3NldFVuc3VwcG9ydGVkUmVzZXJ2ZQEBBTxUb29NYW55UmVzZXJ2ZXMBAQVgTG9jYWxFeGVjdXRpb25JbmNvbXBsZXRlAQEFME1lc3NhZ2VRdWV1ZQECJCxOb3RSZWFwYWJsZQEBBRhOb1BhZ2UBAQUkTm9NZXNzYWdlAQEFQEFscmVhZHlQcm9jZXNzZWQBAQUYUXVldWVkAQEFSEluc3VmZmljaWVudFdlaWdodAEBBWBUZW1wb3JhcmlseVVucHJvY2Vzc2FibGUBAQUsUXVldWVQYXVzZWQBAQVMUmVjdXJzaXZlRGlzYWxsb3dlZAEBBSRBc3NldFJhdGUBAgxAVW5rbm93bkFzc2V0S2luZAEBBTRBbHJlYWR5RXhpc3RzAQEFIE92ZXJmbG93AQEFFEJlZWZ5AQIQYEludmFsaWRLZXlPd25lcnNoaXBQcm9vZgEBBWBJbnZhbGlkRXF1aXZvY2F0aW9uUHJvb2YBAQVYRHVwbGljYXRlT2ZmZW5jZVJlcG9ydAEBBVBJbnZhbGlkQ29uZmlndXJhdGlvbgEBBQxNbXIBAQUwQmVlZnlNbXJMZWFmAQEFAjgUT3RoZXIBAQUwQ2Fubm90TG9va3VwAQEFJEJhZE9yaWdpbgEBBRhNb2R1bGUBAgEBGFN5c3RlbQECJDxJbnZhbGlkU3BlY05hbWUBAQVoU3BlY1ZlcnNpb25OZWVkc1RvSW5jcmVhc2UBAQV0RmFpbGVkVG9FeHRyYWN0UnVudGltZVZlcnNpb24BAQVMTm9uRGVmYXVsdENvbXBvc2l0ZQEBBTxOb25aZXJvUmVmQ291bnQBAQUwQ2FsbEZpbHRlcmVkAQEFbE11bHRpQmxvY2tNaWdyYXRpb25zT25nb2luZwEBBUROb3RoaW5nQXV0aG9yaXplZAEBBTBVbmF1dGhvcml6ZWQBAQUQQmFiZQECEGBJbnZhbGlkRXF1aXZvY2F0aW9uUHJvb2YBAQVgSW52YWxpZEtleU93bmVyc2hpcFByb29mAQEFWER1cGxpY2F0ZU9mZmVuY2VSZXBvcnQBAQVQSW52YWxpZENvbmZpZ3VyYXRpb24BAQUkVGltZXN0YW1wAQEFHEluZGljZXMBAhQsTm90QXNzaWduZWQBAQUgTm90T3duZXIBAQUUSW5Vc2UBAQUsTm90VHJhbnNmZXIBAQUkUGVybWFuZW50AQEFIEJhbGFuY2VzAQIwOFZlc3RpbmdCYWxhbmNlAQEFVExpcXVpZGl0eVJlc3RyaWN0aW9ucwEBBUxJbnN1ZmZpY2llbnRCYWxhbmNlAQEFSEV4aXN0ZW50aWFsRGVwb3NpdAEBBTRFeHBlbmRhYmlsaXR5AQEFXEV4aXN0aW5nVmVzdGluZ1NjaGVkdWxlAQEFLERlYWRBY2NvdW50AQEFPFRvb01hbnlSZXNlcnZlcwEBBTBUb29NYW55SG9sZHMBAQU4VG9vTWFueUZyZWV6ZXMBAQVMSXNzdWFuY2VEZWFjdGl2YXRlZAEBBSREZWx0YVplcm8BAQVIVHJhbnNhY3Rpb25QYXltZW50AQEFKEF1dGhvcnNoaXABAQUcU3Rha2luZwECfDROb3RDb250cm9sbGVyAQEFIE5vdFN0YXNoAQEFNEFscmVhZHlCb25kZWQBAQU0QWxyZWFkeVBhaXJlZAEBBTBFbXB0eVRhcmdldHMBAQU4RHVwbGljYXRlSW5kZXgBAQVESW52YWxpZFNsYXNoSW5kZXgBAQVASW5zdWZmaWNpZW50Qm9uZAEBBTBOb01vcmVDaHVua3MBAQU0Tm9VbmxvY2tDaHVuawEBBTBGdW5kZWRUYXJnZXQBAQVISW52YWxpZEVyYVRvUmV3YXJkAQEFaEludmFsaWROdW1iZXJPZk5vbWluYXRpb25zAQEFSE5vdFNvcnRlZEFuZFVuaXF1ZQEBBThBbHJlYWR5Q2xhaW1lZAEBBSxJbnZhbGlkUGFnZQEBBVRJbmNvcnJlY3RIaXN0b3J5RGVwdGgBAQVYSW5jb3JyZWN0U2xhc2hpbmdTcGFucwEBBSBCYWRTdGF0ZQEBBThUb29NYW55VGFyZ2V0cwEBBSRCYWRUYXJnZXQBAQVAQ2Fubm90Q2hpbGxPdGhlcgEBBURUb29NYW55Tm9taW5hdG9ycwEBBURUb29NYW55VmFsaWRhdG9ycwEBBUBDb21taXNzaW9uVG9vTG93AQEFLEJvdW5kTm90TWV0AQEFUENvbnRyb2xsZXJEZXByZWNhdGVkAQEFTENhbm5vdFJlc3RvcmVMZWRnZXIBAQVsUmV3YXJkRGVzdGluYXRpb25SZXN0cmljdGVkAQEFOE5vdEVub3VnaEZ1bmRzAQEFXFZpcnR1YWxTdGFrZXJOb3RBbGxvd2VkAQEFIE9mZmVuY2VzAQEFKEhpc3RvcmljYWwBAQUcU2Vzc2lvbgECFDBJbnZhbGlkUHJvb2YBAQVcTm9Bc3NvY2lhdGVkVmFsaWRhdG9ySWQBAQU0RHVwbGljYXRlZEtleQEBBRhOb0tleXMBAQUkTm9BY2NvdW50AQEFHEdyYW5kcGEBAhwsUGF1c2VGYWlsZWQBAQUwUmVzdW1lRmFpbGVkAQEFNENoYW5nZVBlbmRpbmcBAQUcVG9vU29vbgEBBWBJbnZhbGlkS2V5T3duZXJzaGlwUHJvb2YBAQVgSW52YWxpZEVxdWl2b2NhdGlvblByb29mAQEFWER1cGxpY2F0ZU9mZmVuY2VSZXBvcnQBAQVIQXV0aG9yaXR5RGlzY292ZXJ5AQEFIFRyZWFzdXJ5AQIsMEludmFsaWRJbmRleAEBBUBUb29NYW55QXBwcm92YWxzAQEFWEluc3VmZmljaWVudFBlcm1pc3Npb24BAQVMUHJvcG9zYWxOb3RBcHByb3ZlZAEBBVhGYWlsZWRUb0NvbnZlcnRCYWxhbmNlAQEFMFNwZW5kRXhwaXJlZAEBBSxFYXJseVBheW91dAEBBUBBbHJlYWR5QXR0ZW1wdGVkAQEFLFBheW91dEVycm9yAQEFME5vdEF0dGVtcHRlZAEBBTBJbmNvbmNsdXNpdmUBAQVAQ29udmljdGlvblZvdGluZwECMChOb3RPbmdvaW5nAQEFIE5vdFZvdGVyAQEFME5vUGVybWlzc2lvbgEBBTxOb1Blcm1pc3Npb25ZZXQBAQVEQWxyZWFkeURlbGVnYXRpbmcBAQU0QWxyZWFkeVZvdGluZwEBBURJbnN1ZmZpY2llbnRGdW5kcwEBBTROb3REZWxlZ2F0aW5nAQEFIE5vbnNlbnNlAQEFPE1heFZvdGVzUmVhY2hlZAEBBSxDbGFzc05lZWRlZAEBBSBCYWRDbGFzcwEBBSRSZWZlcmVuZGEBAjgoTm90T25nb2luZwEBBShIYXNEZXBvc2l0AQEFIEJhZFRyYWNrAQEFEEZ1bGwBAQUoUXVldWVFbXB0eQEBBTRCYWRSZWZlcmVuZHVtAQEFLE5vdGhpbmdUb0RvAQEFHE5vVHJhY2sBAQUoVW5maW5pc2hlZAEBBTBOb1Blcm1pc3Npb24BAQUkTm9EZXBvc2l0AQEFJEJhZFN0YXR1cwEBBUBQcmVpbWFnZU5vdEV4aXN0AQEFhFByZWltYWdlU3RvcmVkV2l0aERpZmZlcmVudExlbmd0aAEBBVBGZWxsb3dzaGlwQ29sbGVjdGl2ZQECLDRBbHJlYWR5TWVtYmVyAQEFJE5vdE1lbWJlcgEBBShOb3RQb2xsaW5nAQEFHE9uZ29pbmcBAQU0Tm9uZVJlbWFpbmluZwEBBShDb3JydXB0aW9uAQEFKFJhbmtUb29Mb3cBAQU4SW52YWxpZFdpdG5lc3MBAQUwTm9QZXJtaXNzaW9uAQEFKFNhbWVNZW1iZXIBAQU4VG9vTWFueU1lbWJlcnMBAQVMRmVsbG93c2hpcFJlZmVyZW5kYQECOChOb3RPbmdvaW5nAQEFKEhhc0RlcG9zaXQBAQUgQmFkVHJhY2sBAQUQRnVsbAEBBShRdWV1ZUVtcHR5AQEFNEJhZFJlZmVyZW5kdW0BAQUsTm90aGluZ1RvRG8BAQUcTm9UcmFjawEBBShVbmZpbmlzaGVkAQEFME5vUGVybWlzc2lvbgEBBSROb0RlcG9zaXQBAQUkQmFkU3RhdHVzAQEFQFByZWltYWdlTm90RXhpc3QBAQWEUHJlaW1hZ2VTdG9yZWRXaXRoRGlmZmVyZW50TGVuZ3RoAQEFHE9yaWdpbnMBAQUkV2hpdGVsaXN0AQIUTFVuYXZhaWxhYmxlUHJlSW1hZ2UBAQU8VW5kZWNvZGFibGVDYWxsAQEFYEludmFsaWRDYWxsV2VpZ2h0V2l0bmVzcwEBBVBDYWxsSXNOb3RXaGl0ZWxpc3RlZAEBBVhDYWxsQWxyZWFkeVdoaXRlbGlzdGVkAQEFKFBhcmFtZXRlcnMBAQUYQ2xhaW1zAQIYYEludmFsaWRFdGhlcmV1bVNpZ25hdHVyZQEBBUBTaWduZXJIYXNOb0NsYWltAQEFQFNlbmRlckhhc05vQ2xhaW0BAQUwUG90VW5kZXJmbG93AQEFQEludmFsaWRTdGF0ZW1lbnQBAQVMVmVzdGVkQmFsYW5jZUV4aXN0cwEBBRxVdGlsaXR5AQIEMFRvb01hbnlDYWxscwEBBRxTb2NpZXR5AQKAJE5vdE1lbWJlcgEBBTRBbHJlYWR5TWVtYmVyAQEFJFN1c3BlbmRlZAEBBTBOb3RTdXNwZW5kZWQBAQUgTm9QYXlvdXQBAQU4QWxyZWFkeUZvdW5kZWQBAQU8SW5zdWZmaWNpZW50UG90AQEFPEFscmVhZHlWb3VjaGluZwEBBUxOb3RWb3VjaGluZ09uQmlkZGVyAQEFEEhlYWQBAQUcRm91bmRlcgEBBShBbHJlYWR5QmlkAQEFQEFscmVhZHlDYW5kaWRhdGUBAQUwTm90Q2FuZGlkYXRlAQEFKE1heE1lbWJlcnMBAQUoTm90Rm91bmRlcgEBBRxOb3RIZWFkAQEFLE5vdEFwcHJvdmVkAQEFLE5vdFJlamVjdGVkAQEFIEFwcHJvdmVkAQEFIFJlamVjdGVkAQEFKEluUHJvZ3Jlc3MBAQUgVG9vRWFybHkBAQUUVm90ZWQBAQUcRXhwaXJlZAEBBSROb3RCaWRkZXIBAQUoTm9EZWZlbmRlcgEBBSBOb3RHcm91cAEBBTxBbHJlYWR5RWxldmF0ZWQBAQU8QWxyZWFkeVB1bmlzaGVkAQEFREluc3VmZmljaWVudEZ1bmRzAQEFHE5vVm90ZXMBAQUgUmVjb3ZlcnkBAkAoTm90QWxsb3dlZAEBBTRaZXJvVGhyZXNob2xkAQEFQE5vdEVub3VnaEZyaWVuZHMBAQUoTWF4RnJpZW5kcwEBBSROb3RTb3J0ZWQBAQU4Tm90UmVjb3ZlcmFibGUBAQVIQWxyZWFkeVJlY292ZXJhYmxlAQEFOEFscmVhZHlTdGFydGVkAQEFKE5vdFN0YXJ0ZWQBAQUkTm90RnJpZW5kAQEFLERlbGF5UGVyaW9kAQEFOEFscmVhZHlWb3VjaGVkAQEFJFRocmVzaG9sZAEBBSxTdGlsbEFjdGl2ZQEBBTBBbHJlYWR5UHJveHkBAQUgQmFkU3RhdGUBAQUcVmVzdGluZwECFChOb3RWZXN0aW5nAQEFVEF0TWF4VmVzdGluZ1NjaGVkdWxlcwEBBSRBbW91bnRMb3cBAQVgU2NoZWR1bGVJbmRleE91dE9mQm91bmRzAQEFVEludmFsaWRTY2hlZHVsZVBhcmFtcwEBBSRTY2hlZHVsZXIBAhRARmFpbGVkVG9TY2hlZHVsZQEBBSBOb3RGb3VuZAEBBVxUYXJnZXRCbG9ja051bWJlckluUGFzdAEBBUhSZXNjaGVkdWxlTm9DaGFuZ2UBAQUUTmFtZWQBAQUUUHJveHkBAiAcVG9vTWFueQEBBSBOb3RGb3VuZAEBBSBOb3RQcm94eQEBBSxVbnByb3h5YWJsZQEBBSREdXBsaWNhdGUBAQUwTm9QZXJtaXNzaW9uAQEFLFVuYW5ub3VuY2VkAQEFLE5vU2VsZlByb3h5AQEFIE11bHRpc2lnAQI4QE1pbmltdW1UaHJlc2hvbGQBAQU8QWxyZWFkeUFwcHJvdmVkAQEFRE5vQXBwcm92YWxzTmVlZGVkAQEFRFRvb0Zld1NpZ25hdG9yaWVzAQEFSFRvb01hbnlTaWduYXRvcmllcwEBBVRTaWduYXRvcmllc091dE9mT3JkZXIBAQVMU2VuZGVySW5TaWduYXRvcmllcwEBBSBOb3RGb3VuZAEBBSBOb3RPd25lcgEBBSxOb1RpbWVwb2ludAEBBThXcm9uZ1RpbWVwb2ludAEBBUxVbmV4cGVjdGVkVGltZXBvaW50AQEFPE1heFdlaWdodFRvb0xvdwEBBTRBbHJlYWR5U3RvcmVkAQEFIFByZWltYWdlAQIkGFRvb0JpZwEBBTBBbHJlYWR5Tm90ZWQBAQU0Tm90QXV0aG9yaXplZAEBBSBOb3ROb3RlZAEBBSRSZXF1ZXN0ZWQBAQUwTm90UmVxdWVzdGVkAQEFHFRvb01hbnkBAQUYVG9vRmV3AQEFGE5vQ29zdAEBBSBCb3VudGllcwECLHBJbnN1ZmZpY2llbnRQcm9wb3NlcnNCYWxhbmNlAQEFMEludmFsaWRJbmRleAEBBTBSZWFzb25Ub29CaWcBAQVAVW5leHBlY3RlZFN0YXR1cwEBBThSZXF1aXJlQ3VyYXRvcgEBBTBJbnZhbGlkVmFsdWUBAQUoSW52YWxpZEZlZQEBBTRQZW5kaW5nUGF5b3V0AQEFJFByZW1hdHVyZQEBBVBIYXNBY3RpdmVDaGlsZEJvdW50eQEBBTRUb29NYW55UXVldWVkAQEFNENoaWxkQm91bnRpZXMBAgxUUGFyZW50Qm91bnR5Tm90QWN0aXZlAQEFZEluc3VmZmljaWVudEJvdW50eUJhbGFuY2UBAQVQVG9vTWFueUNoaWxkQm91bnRpZXMBAQVoRWxlY3Rpb25Qcm92aWRlck11bHRpUGhhc2UBAjxoUHJlRGlzcGF0Y2hFYXJseVN1Ym1pc3Npb24BAQVsUHJlRGlzcGF0Y2hXcm9uZ1dpbm5lckNvdW50AQEFZFByZURpc3BhdGNoV2Vha1N1Ym1pc3Npb24BAQU8U2lnbmVkUXVldWVGdWxsAQEFWFNpZ25lZENhbm5vdFBheURlcG9zaXQBAQVQU2lnbmVkSW52YWxpZFdpdG5lc3MBAQVMU2lnbmVkVG9vTXVjaFdlaWdodAEBBTxPY3dDYWxsV3JvbmdFcmEBAQVcTWlzc2luZ1NuYXBzaG90TWV0YWRhdGEBAQVYSW52YWxpZFN1Ym1pc3Npb25JbmRleAEBBThDYWxsTm90QWxsb3dlZAEBBThGYWxsYmFja0ZhaWxlZAEBBSxCb3VuZE5vdE1ldAEBBThUb29NYW55V2lubmVycwEBBWRQcmVEaXNwYXRjaERpZmZlcmVudFJvdW5kAQEFDE5pcwECPEBEdXJhdGlvblRvb1NtYWxsAQEFOER1cmF0aW9uVG9vQmlnAQEFOEFtb3VudFRvb1NtYWxsAQEFJEJpZFRvb0xvdwEBBThVbmtub3duUmVjZWlwdAEBBSBOb3RPd25lcgEBBShOb3RFeHBpcmVkAQEFKFVua25vd25CaWQBAQU0UG9ydGlvblRvb0JpZwEBBSBVbmZ1bmRlZAEBBTRBbHJlYWR5RnVuZGVkAQEFJFRocm90dGxlZAEBBSRNYWtlc0R1c3QBAQU8QWxyZWFkeUNvbW11bmFsAQEFOEFscmVhZHlQcml2YXRlAQEFWE5pc0NvdW50ZXJwYXJ0QmFsYW5jZXMBAjA4VmVzdGluZ0JhbGFuY2UBAQVUTGlxdWlkaXR5UmVzdHJpY3Rpb25zAQEFTEluc3VmZmljaWVudEJhbGFuY2UBAQVIRXhpc3RlbnRpYWxEZXBvc2l0AQEFNEV4cGVuZGFiaWxpdHkBAQVcRXhpc3RpbmdWZXN0aW5nU2NoZWR1bGUBAQUsRGVhZEFjY291bnQBAQU8VG9vTWFueVJlc2VydmVzAQEFMFRvb01hbnlIb2xkcwEBBThUb29NYW55RnJlZXplcwEBBUxJc3N1YW5jZURlYWN0aXZhdGVkAQEFJERlbHRhWmVybwEBBSRWb3Rlckxpc3QBAgQQTGlzdAECECREdXBsaWNhdGUBAQUoTm90SGVhdmllcgEBBTBOb3RJblNhbWVCYWcBAQUwTm9kZU5vdEZvdW5kAQEFPE5vbWluYXRpb25Qb29scwECkDBQb29sTm90Rm91bmQBAQVIUG9vbE1lbWJlck5vdEZvdW5kAQEFSFJld2FyZFBvb2xOb3RGb3VuZAEBBUBTdWJQb29sc05vdEZvdW5kAQEFZEFjY291bnRCZWxvbmdzVG9PdGhlclBvb2wBAQU4RnVsbHlVbmJvbmRpbmcBAQVETWF4VW5ib25kaW5nTGltaXQBAQVEQ2Fubm90V2l0aGRyYXdBbnkBAQVETWluaW11bUJvbmROb3RNZXQBAQUwT3ZlcmZsb3dSaXNrAQEFNE5vdERlc3Ryb3lpbmcBAQUwTm90Tm9taW5hdG9yAQEFVE5vdEtpY2tlck9yRGVzdHJveWluZwEBBRxOb3RPcGVuAQEFIE1heFBvb2xzAQEFOE1heFBvb2xNZW1iZXJzAQEFRENhbk5vdENoYW5nZVN0YXRlAQEFVERvZXNOb3RIYXZlUGVybWlzc2lvbgEBBVRNZXRhZGF0YUV4Y2VlZHNNYXhMZW4BAQUkRGVmZW5zaXZlAQIcaE5vdEVub3VnaFNwYWNlSW5VbmJvbmRQb29sAQEFMFBvb2xOb3RGb3VuZAEBBUhSZXdhcmRQb29sTm90Rm91bmQBAQVAU3ViUG9vbHNOb3RGb3VuZAEBBXBCb25kZWRTdGFzaEtpbGxlZFByZW1hdHVyZWx5AQEFVERlbGVnYXRpb25VbnN1cHBvcnRlZAEBBTxTbGFzaE5vdEFwcGxpZWQBAQWcUGFydGlhbFVuYm9uZE5vdEFsbG93ZWRQZXJtaXNzaW9ubGVzc2x5AQEFXE1heENvbW1pc3Npb25SZXN0cmljdGVkAQEFYENvbW1pc3Npb25FeGNlZWRzTWF4aW11bQEBBXhDb21taXNzaW9uRXhjZWVkc0dsb2JhbE1heGltdW0BAQVkQ29tbWlzc2lvbkNoYW5nZVRocm90dGxlZAEBBXhDb21taXNzaW9uQ2hhbmdlUmF0ZU5vdEFsbG93ZWQBAQVMTm9QZW5kaW5nQ29tbWlzc2lvbgEBBVhOb0NvbW1pc3Npb25DdXJyZW50U2V0AQEFLFBvb2xJZEluVXNlAQEFNEludmFsaWRQb29sSWQBAQVMQm9uZEV4dHJhUmVzdHJpY3RlZAEBBTxOb3RoaW5nVG9BZGp1c3QBAQU4Tm90aGluZ1RvU2xhc2gBAQU8QWxyZWFkeU1pZ3JhdGVkAQEFLE5vdE1pZ3JhdGVkAQEFME5vdFN1cHBvcnRlZAEBBSxGYXN0VW5zdGFrZQECGDROb3RDb250cm9sbGVyAQEFNEFscmVhZHlRdWV1ZWQBAQU4Tm90RnVsbHlCb25kZWQBAQUkTm90UXVldWVkAQEFLEFscmVhZHlIZWFkAQEFOENhbGxOb3RBbGxvd2VkAQEFQFBhcmFjaGFpbnNPcmlnaW4BAQU0Q29uZmlndXJhdGlvbgECBDxJbnZhbGlkTmV3VmFsdWUBAQUsUGFyYXNTaGFyZWQBAQU0UGFyYUluY2x1c2lvbgECSGRWYWxpZGF0b3JJbmRleE91dE9mQm91bmRzAQEFUFVuc2NoZWR1bGVkQ2FuZGlkYXRlAQEFQEhlYWREYXRhVG9vTGFyZ2UBAQVQUHJlbWF0dXJlQ29kZVVwZ3JhZGUBAQU8TmV3Q29kZVRvb0xhcmdlAQEFVERpc2FsbG93ZWRSZWxheVBhcmVudAEBBURJbnZhbGlkQXNzaWdubWVudAEBBURJbnZhbGlkR3JvdXBJbmRleAEBBUxJbnN1ZmZpY2llbnRCYWNraW5nAQEFOEludmFsaWRCYWNraW5nAQEFRE5vdENvbGxhdG9yU2lnbmVkAQEFaFZhbGlkYXRpb25EYXRhSGFzaE1pc21hdGNoAQEFgEluY29ycmVjdERvd253YXJkTWVzc2FnZUhhbmRsaW5nAQEFVEludmFsaWRVcHdhcmRNZXNzYWdlcwEBBWBIcm1wV2F0ZXJtYXJrTWlzaGFuZGxpbmcBAQVMSW52YWxpZE91dGJvdW5kSHJtcAEBBWRJbnZhbGlkVmFsaWRhdGlvbkNvZGVIYXNoAQEFQFBhcmFIZWFkTWlzbWF0Y2gBAQUwUGFyYUluaGVyZW50AQIUZFRvb01hbnlJbmNsdXNpb25JbmhlcmVudHMBAQVMSW52YWxpZFBhcmVudEhlYWRlcgEBBUhJbmhlcmVudE92ZXJ3ZWlnaHQBAQWEQ2FuZGlkYXRlc0ZpbHRlcmVkRHVyaW5nRXhlY3V0aW9uAQEFUFVuc2NoZWR1bGVkQ2FuZGlkYXRlAQEFNFBhcmFTY2hlZHVsZXIBAQUUUGFyYXMBAjQ0Tm90UmVnaXN0ZXJlZAEBBTRDYW5ub3RPbmJvYXJkAQEFOENhbm5vdE9mZmJvYXJkAQEFNENhbm5vdFVwZ3JhZGUBAQU8Q2Fubm90RG93bmdyYWRlAQEFWFB2ZkNoZWNrU3RhdGVtZW50U3RhbGUBAQVcUHZmQ2hlY2tTdGF0ZW1lbnRGdXR1cmUBAQWEUHZmQ2hlY2tWYWxpZGF0b3JJbmRleE91dE9mQm91bmRzAQEFYFB2ZkNoZWNrSW52YWxpZFNpZ25hdHVyZQEBBUhQdmZDaGVja0RvdWJsZVZvdGUBAQVYUHZmQ2hlY2tTdWJqZWN0SW52YWxpZAEBBURDYW5ub3RVcGdyYWRlQ29kZQEBBSxJbnZhbGlkQ29kZQEBBSxJbml0aWFsaXplcgEBBQxEbXABAQUQSHJtcAECUFRPcGVuSHJtcENoYW5uZWxUb1NlbGYBAQV8T3BlbkhybXBDaGFubmVsSW52YWxpZFJlY2lwaWVudAEBBWxPcGVuSHJtcENoYW5uZWxaZXJvQ2FwYWNpdHkBAQWMT3BlbkhybXBDaGFubmVsQ2FwYWNpdHlFeGNlZWRzTGltaXQBAQV4T3BlbkhybXBDaGFubmVsWmVyb01lc3NhZ2VTaXplAQEFmE9wZW5Icm1wQ2hhbm5lbE1lc3NhZ2VTaXplRXhjZWVkc0xpbWl0AQEFcE9wZW5Icm1wQ2hhbm5lbEFscmVhZHlFeGlzdHMBAQV8T3BlbkhybXBDaGFubmVsQWxyZWFkeVJlcXVlc3RlZAEBBXBPcGVuSHJtcENoYW5uZWxMaW1pdEV4Y2VlZGVkAQEFcEFjY2VwdEhybXBDaGFubmVsRG9lc250RXhpc3QBAQWEQWNjZXB0SHJtcENoYW5uZWxBbHJlYWR5Q29uZmlybWVkAQEFeEFjY2VwdEhybXBDaGFubmVsTGltaXRFeGNlZWRlZAEBBXBDbG9zZUhybXBDaGFubmVsVW5hdXRob3JpemVkAQEFbENsb3NlSHJtcENoYW5uZWxEb2VzbnRFeGlzdAEBBXxDbG9zZUhybXBDaGFubmVsQWxyZWFkeVVuZGVyd2F5AQEFhENhbmNlbEhybXBPcGVuQ2hhbm5lbFVuYXV0aG9yaXplZAEBBWhPcGVuSHJtcENoYW5uZWxEb2VzbnRFeGlzdAEBBXxPcGVuSHJtcENoYW5uZWxBbHJlYWR5Q29uZmlybWVkAQEFMFdyb25nV2l0bmVzcwEBBXBDaGFubmVsQ3JlYXRpb25Ob3RBdXRob3JpemVkAQEFPFBhcmFTZXNzaW9uSW5mbwEBBTRQYXJhc0Rpc3B1dGVzAQIkdER1cGxpY2F0ZURpc3B1dGVTdGF0ZW1lbnRTZXRzAQEFXEFuY2llbnREaXNwdXRlU3RhdGVtZW50AQEFZFZhbGlkYXRvckluZGV4T3V0T2ZCb3VuZHMBAQVASW52YWxpZFNpZ25hdHVyZQEBBUhEdXBsaWNhdGVTdGF0ZW1lbnQBAQVIU2luZ2xlU2lkZWREaXNwdXRlAQEFPE1hbGljaW91c0JhY2tlcgEBBUxNaXNzaW5nQmFja2luZ1ZvdGVzAQEFSFVuY29uZmlybWVkRGlzcHV0ZQEBBTRQYXJhc1NsYXNoaW5nAQIYYEludmFsaWRLZXlPd25lcnNoaXBQcm9vZgEBBUxJbnZhbGlkU2Vzc2lvbkluZGV4AQEFUEludmFsaWRDYW5kaWRhdGVIYXNoAQEFVEludmFsaWRWYWxpZGF0b3JJbmRleAEBBWBWYWxpZGF0b3JJbmRleElkTWlzbWF0Y2gBAQVcRHVwbGljYXRlU2xhc2hpbmdSZXBvcnQBAQVoT25EZW1hbmRBc3NpZ25tZW50UHJvdmlkZXIBAggkUXVldWVGdWxsAQEFcFNwb3RQcmljZUhpZ2hlclRoYW5NYXhBbW91bnQBAQVoQ29yZXRpbWVBc3NpZ25tZW50UHJvdmlkZXIBAhhAQXNzaWdubWVudHNFbXB0eQEBBTRPdmVyU2NoZWR1bGVkAQEFOFVuZGVyU2NoZWR1bGVkAQEFQERpc2FsbG93ZWRJbnNlcnQBAQU8RHVwbGljYXRlSW5zZXJ0AQEFUEFzc2lnbm1lbnRzTm90U29ydGVkAQEFJFJlZ2lzdHJhcgECODROb3RSZWdpc3RlcmVkAQEFREFscmVhZHlSZWdpc3RlcmVkAQEFIE5vdE93bmVyAQEFMENvZGVUb29MYXJnZQEBBUBIZWFkRGF0YVRvb0xhcmdlAQEFME5vdFBhcmFjaGFpbgEBBTROb3RQYXJhdGhyZWFkAQEFQENhbm5vdERlcmVnaXN0ZXIBAQU8Q2Fubm90RG93bmdyYWRlAQEFNENhbm5vdFVwZ3JhZGUBAQUoUGFyYUxvY2tlZAEBBSxOb3RSZXNlcnZlZAEBBSxJbnZhbGlkQ29kZQEBBShDYW5ub3RTd2FwAQEFFFNsb3RzAQIIRFBhcmFOb3RPbmJvYXJkaW5nAQEFKExlYXNlRXJyb3IBAQUgQXVjdGlvbnMBAhxEQXVjdGlvbkluUHJvZ3Jlc3MBAQVETGVhc2VQZXJpb2RJblBhc3QBAQVEUGFyYU5vdFJlZ2lzdGVyZWQBAQVETm90Q3VycmVudEF1Y3Rpb24BAQUoTm90QXVjdGlvbgEBBTBBdWN0aW9uRW5kZWQBAQVAQWxyZWFkeUxlYXNlZE91dAEBBSRDcm93ZGxvYW4BAlxERmlyc3RQZXJpb2RJblBhc3QBAQVkRmlyc3RQZXJpb2RUb29GYXJJbkZ1dHVyZQEBBWxMYXN0UGVyaW9kQmVmb3JlRmlyc3RQZXJpb2QBAQVgTGFzdFBlcmlvZFRvb0ZhckluRnV0dXJlAQEFPENhbm5vdEVuZEluUGFzdAEBBURFbmRUb29GYXJJbkZ1dHVyZQEBBSBPdmVyZmxvdwEBBVBDb250cmlidXRpb25Ub29TbWFsbAEBBTRJbnZhbGlkUGFyYUlkAQEFLENhcEV4Y2VlZGVkAQEFWENvbnRyaWJ1dGlvblBlcmlvZE92ZXIBAQU0SW52YWxpZE9yaWdpbgEBBTBOb3RQYXJhY2hhaW4BAQUsTGVhc2VBY3RpdmUBAQVAQmlkT3JMZWFzZUFjdGl2ZQEBBTBGdW5kTm90RW5kZWQBAQU8Tm9Db250cmlidXRpb25zAQEFSE5vdFJlYWR5VG9EaXNzb2x2ZQEBBUBJbnZhbGlkU2lnbmF0dXJlAQEFME1lbW9Ub29MYXJnZQEBBURBbHJlYWR5SW5OZXdSYWlzZQEBBUhWcmZEZWxheUluUHJvZ3Jlc3MBAQU0Tm9MZWFzZVBlcmlvZAEBBSBDb3JldGltZQECDCROb3RCcm9rZXIBAQVYUmVxdWVzdGVkRnV0dXJlUmV2ZW51ZQEBBUxBc3NldFRyYW5zZmVyRmFpbGVkAQEFJFhjbVBhbGxldAECYCxVbnJlYWNoYWJsZQEBBSxTZW5kRmFpbHVyZQEBBSBGaWx0ZXJlZAEBBUhVbndlaWdoYWJsZU1lc3NhZ2UBAQVgRGVzdGluYXRpb25Ob3RJbnZlcnRpYmxlAQEFFEVtcHR5AQEFOENhbm5vdFJlYW5jaG9yAQEFNFRvb01hbnlBc3NldHMBAQU0SW52YWxpZE9yaWdpbgEBBShCYWRWZXJzaW9uAQEFLEJhZExvY2F0aW9uAQEFOE5vU3Vic2NyaXB0aW9uAQEFREFscmVhZHlTdWJzY3JpYmVkAQEFWENhbm5vdENoZWNrT3V0VGVsZXBvcnQBAQUoTG93QmFsYW5jZQEBBTBUb29NYW55TG9ja3MBAQVMQWNjb3VudE5vdFNvdmVyZWlnbgEBBShGZWVzTm90TWV0AQEFMExvY2tOb3RGb3VuZAEBBRRJblVzZQEBBWhJbnZhbGlkQXNzZXRVbmtub3duUmVzZXJ2ZQEBBXhJbnZhbGlkQXNzZXRVbnN1cHBvcnRlZFJlc2VydmUBAQU8VG9vTWFueVJlc2VydmVzAQEFYExvY2FsRXhlY3V0aW9uSW5jb21wbGV0ZQEBBTBNZXNzYWdlUXVldWUBAiQsTm90UmVhcGFibGUBAQUYTm9QYWdlAQEFJE5vTWVzc2FnZQEBBUBBbHJlYWR5UHJvY2Vzc2VkAQEFGFF1ZXVlZAEBBUhJbnN1ZmZpY2llbnRXZWlnaHQBAQVgVGVtcG9yYXJpbHlVbnByb2Nlc3NhYmxlAQEFLFF1ZXVlUGF1c2VkAQEFTFJlY3Vyc2l2ZURpc2FsbG93ZWQBAQUkQXNzZXRSYXRlAQIMQFVua25vd25Bc3NldEtpbmQBAQU0QWxyZWFkeUV4aXN0cwEBBSBPdmVyZmxvdwEBBRRCZWVmeQECEGBJbnZhbGlkS2V5T3duZXJzaGlwUHJvb2YBAQVgSW52YWxpZEVxdWl2b2NhdGlvblByb29mAQEFWER1cGxpY2F0ZU9mZmVuY2VSZXBvcnQBAQVQSW52YWxpZENvbmZpZ3VyYXRpb24BAQUMTW1yAQEFMEJlZWZ5TW1yTGVhZgEBBURDb25zdW1lclJlbWFpbmluZwEBBSxOb1Byb3ZpZGVycwEBBUBUb29NYW55Q29uc3VtZXJzAQEFFFRva2VuAQIoQEZ1bmRzVW5hdmFpbGFibGUBAQUwT25seVByb3ZpZGVyAQEFMEJlbG93TWluaW11bQEBBTBDYW5ub3RDcmVhdGUBAQUwVW5rbm93bkFzc2V0AQEFGEZyb3plbgEBBSxVbnN1cHBvcnRlZAEBBUBDYW5ub3RDcmVhdGVIb2xkAQEFNE5vdEV4cGVuZGFibGUBAQUcQmxvY2tlZAEBBShBcml0aG1ldGljAQIMJFVuZGVyZmxvdwEBBSBPdmVyZmxvdwEBBThEaXZpc2lvbkJ5WmVybwEBBTRUcmFuc2FjdGlvbmFsAQIIMExpbWl0UmVhY2hlZAEBBRxOb0xheWVyAQEFJEV4aGF1c3RlZAEBBShDb3JydXB0aW9uAQEFLFVuYXZhaWxhYmxlAQEFOFJvb3ROb3RBbGxvd2VkAQEFAhxARXh0cmluc2ljU3VjY2VzcwEABDRkaXNwYXRjaF9pbmZvQDxFeHRyaW5zaWNGYWlsZWQBAAg4ZGlzcGF0Y2hfZXJyb3JxCzRkaXNwYXRjaF9pbmZvQCxDb2RlVXBkYXRlZAEBBShOZXdBY2NvdW50AQAEHGFjY291bnQANEtpbGxlZEFjY291bnQBAAQcYWNjb3VudAAgUmVtYXJrZWQBAAgYc2VuZGVyABBoYXNoIERVcGdyYWRlQXV0aG9yaXplZAEACCRjb2RlX2hhc2ggNGNoZWNrX3ZlcnNpb24UAggMQXllAQECDE5heQEBAgAMJGJhcmVfYXllcwQQYXllcwQQbmF5cwQCFCxNZW1iZXJBZGRlZAEABAx3aG8ALFJhbmtDaGFuZ2VkAQAIDHdobwAQcmFuawQ0TWVtYmVyUmVtb3ZlZAEACAx3aG8AEHJhbmsEFFZvdGVkAQAQDHdobwAQcG9sbAQQdm90ZXkLFHRhbGx5fQs8TWVtYmVyRXhjaGFuZ2VkAQAIDHdobwAcbmV3X3dobwACQCRTdWJtaXR0ZWQBAAwUaW5kZXgEFHRyYWNrBCBwcm9wb3NhbKUBVERlY2lzaW9uRGVwb3NpdFBsYWNlZAEADBRpbmRleAQMd2hvABhhbW91bnQIXERlY2lzaW9uRGVwb3NpdFJlZnVuZGVkAQAMFGluZGV4BAx3aG8AGGFtb3VudAg4RGVwb3NpdFNsYXNoZWQBAAgMd2hvABhhbW91bnQIPERlY2lzaW9uU3RhcnRlZAEAEBRpbmRleAQUdHJhY2sEIHByb3Bvc2FspQEUdGFsbHl9CzhDb25maXJtU3RhcnRlZAEABBRpbmRleAQ4Q29uZmlybUFib3J0ZWQBAAQUaW5kZXgEJENvbmZpcm1lZAEACBRpbmRleAQUdGFsbHl9CyBBcHByb3ZlZAEABBRpbmRleAQgUmVqZWN0ZWQBAAgUaW5kZXgEFHRhbGx5fQsgVGltZWRPdXQBAAgUaW5kZXgEFHRhbGx5fQskQ2FuY2VsbGVkAQAIFGluZGV4BBR0YWxseX0LGEtpbGxlZAEACBRpbmRleAQUdGFsbHl9C2RTdWJtaXNzaW9uRGVwb3NpdFJlZnVuZGVkAQAMFGluZGV4BAx3aG8AGGFtb3VudAgsTWV0YWRhdGFTZXQBAAgUaW5kZXgEEGhhc2ggPE1ldGFkYXRhQ2xlYXJlZAEACBRpbmRleAQQaGFzaCAACCRwb3N0X2luZm+1ARRlcnJvcnELB7UBiQsCDDxDYWxsV2hpdGVsaXN0ZWQBAAQkY2FsbF9oYXNoIFhXaGl0ZWxpc3RlZENhbGxSZW1vdmVkAQAEJGNhbGxfaGFzaCBkV2hpdGVsaXN0ZWRDYWxsRGlzcGF0Y2hlZAEACCRjYWxsX2hhc2ggGHJlc3VsdI0LBxUBcQsCGEBCYXRjaEludGVycnVwdGVkAQAIFGluZGV4BBRlcnJvcnELOEJhdGNoQ29tcGxldGVkAQEFYEJhdGNoQ29tcGxldGVkV2l0aEVycm9ycwEBBTRJdGVtQ29tcGxldGVkAQEFKEl0ZW1GYWlsZWQBAAQUZXJyb3JxCzBEaXNwYXRjaGVkQXMBAAQYcmVzdWx0lQsAECxtYXhfbWVtYmVycwQobWF4X2ludGFrZQQsbWF4X3N0cmlrZXMERGNhbmRpZGF0ZV9kZXBvc2l0CAJEHEZvdW5kZWQBAAQcZm91bmRlcgAMQmlkAQAIMGNhbmRpZGF0ZV9pZAAUb2ZmZXIIFFZvdWNoAQAMMGNhbmRpZGF0ZV9pZAAUb2ZmZXIIIHZvdWNoaW5nACRBdXRvVW5iaWQBAAQkY2FuZGlkYXRlABRVbmJpZAEABCRjYW5kaWRhdGUAHFVudm91Y2gBAAQkY2FuZGlkYXRlACBJbmR1Y3RlZAEACBxwcmltYXJ5AChjYW5kaWRhdGVz3QNgU3VzcGVuZGVkTWVtYmVySnVkZ2VtZW50AQAIDHdobwAYanVkZ2VkFEhDYW5kaWRhdGVTdXNwZW5kZWQBAAQkY2FuZGlkYXRlADxNZW1iZXJTdXNwZW5kZWQBAAQYbWVtYmVyAChDaGFsbGVuZ2VkAQAEGG1lbWJlcgAQVm90ZQEADCRjYW5kaWRhdGUAFHZvdGVyABB2b3RlFDBEZWZlbmRlclZvdGUBAAgUdm90ZXIAEHZvdGUUJE5ld1BhcmFtcwEABBhwYXJhbXOdCyRVbmZvdW5kZWQBAAQcZm91bmRlcgAcRGVwb3NpdAEABBR2YWx1ZQggRWxldmF0ZWQBAAgYbWVtYmVyABByYW5rBAIYPFJlY292ZXJ5Q3JlYXRlZAEABBxhY2NvdW50AERSZWNvdmVyeUluaXRpYXRlZAEACDBsb3N0X2FjY291bnQAPHJlc2N1ZXJfYWNjb3VudAA8UmVjb3ZlcnlWb3VjaGVkAQAMMGxvc3RfYWNjb3VudAA8cmVzY3Vlcl9hY2NvdW50ABhzZW5kZXIAOFJlY292ZXJ5Q2xvc2VkAQAIMGxvc3RfYWNjb3VudAA8cmVzY3Vlcl9hY2NvdW50AEBBY2NvdW50UmVjb3ZlcmVkAQAIMGxvc3RfYWNjb3VudAA8cmVzY3Vlcl9hY2NvdW50ADxSZWNvdmVyeVJlbW92ZWQBAAQwbG9zdF9hY2NvdW50AAIkJFNjaGVkdWxlZAEACBB3aGVuBBRpbmRleAQgQ2FuY2VsZWQBAAgQd2hlbgQUaW5kZXgEKERpc3BhdGNoZWQBAAwQdGFzaw0BCGlkEQEYcmVzdWx0lQsgUmV0cnlTZXQBABAQdGFzaw0BCGlkEQEYcGVyaW9kBBxyZXRyaWVzBDhSZXRyeUNhbmNlbGxlZAEACBB0YXNrDQEIaWQRATxDYWxsVW5hdmFpbGFibGUBAAgQdGFzaw0BCGlkEQE4UGVyaW9kaWNGYWlsZWQBAAgQdGFzaw0BCGlkEQEsUmV0cnlGYWlsZWQBAAgQdGFzaw0BCGlkEQFUUGVybWFuZW50bHlPdmVyd2VpZ2h0AQAIEHRhc2sNAQhpZBEBAiQMQW55AQEFLE5vblRyYW5zZmVyAQEFKEdvdmVybmFuY2UBAQUcU3Rha2luZwEBBSxDYW5jZWxQcm94eQEBBRxBdWN0aW9uAQEFHFNvY2lldHkBAQU8Tm9taW5hdGlvblBvb2xzAQEFMFNwb2tlc3BlcnNvbgEBBQIUNFByb3h5RXhlY3V0ZWQBAAQYcmVzdWx0lQssUHVyZUNyZWF0ZWQBABAQcHVyZQAMd2hvAChwcm94eV90eXBlrQtQZGlzYW1iaWd1YXRpb25faW5kZXgEJEFubm91bmNlZAEADBByZWFsABRwcm94eQAkY2FsbF9oYXNoIChQcm94eUFkZGVkAQAQJGRlbGVnYXRvcgAkZGVsZWdhdGVlAChwcm94eV90eXBlrQsUZGVsYXkEMFByb3h5UmVtb3ZlZAEAECRkZWxlZ2F0b3IAJGRlbGVnYXRlZQAocHJveHlfdHlwZa0LFGRlbGF5BAIQLE5ld011bHRpc2lnAQAMJGFwcHJvdmluZwAgbXVsdGlzaWcAJGNhbGxfaGFzaCBATXVsdGlzaWdBcHByb3ZhbAEAECRhcHByb3ZpbmcAJHRpbWVwb2ludPEBIG11bHRpc2lnACRjYWxsX2hhc2ggQE11bHRpc2lnRXhlY3V0ZWQBABQkYXBwcm92aW5nACR0aW1lcG9pbnTxASBtdWx0aXNpZwAkY2FsbF9oYXNoIBhyZXN1bHSVC0RNdWx0aXNpZ0NhbmNlbGxlZAEAEChjYW5jZWxsaW5nACR0aW1lcG9pbnTxASBtdWx0aXNpZwAkY2FsbF9oYXNoIAIcJEJpZFBsYWNlZAEADAx3aG8AGGFtb3VudAggZHVyYXRpb24EMEJpZFJldHJhY3RlZAEADAx3aG8AGGFtb3VudAggZHVyYXRpb24EKEJpZERyb3BwZWQBAAwMd2hvABhhbW91bnQIIGR1cmF0aW9uBBhJc3N1ZWQBABQUaW5kZXgEGGV4cGlyeQQMd2hvAChwcm9wb3J0aW9uCBhhbW91bnQIGFRoYXdlZAEAFBRpbmRleAQMd2hvAChwcm9wb3J0aW9uCBhhbW91bnQIHGRyb3BwZWQUGEZ1bmRlZAEABBxkZWZpY2l0CCxUcmFuc2ZlcnJlZAEADBBmcm9tAAh0bwAUaW5kZXgEAhQgVW5zdGFrZWQBAAgUc3Rhc2gAGHJlc3VsdJULHFNsYXNoZWQBAAgUc3Rhc2gAGGFtb3VudAgwQmF0Y2hDaGVja2VkAQAEEGVyYXM5AjRCYXRjaEZpbmlzaGVkAQAEEHNpemUENEludGVybmFsRXJyb3IBAQUCKBxDcmVhdGVkAQAEHHBhcmFfaWQELENvbnRyaWJ1dGVkAQAMDHdobwAoZnVuZF9pbmRleAQYYW1vdW50CCBXaXRoZHJldwEADAx3aG8AKGZ1bmRfaW5kZXgEGGFtb3VudAhEUGFydGlhbGx5UmVmdW5kZWQBAAQccGFyYV9pZAQsQWxsUmVmdW5kZWQBAAQccGFyYV9pZAQkRGlzc29sdmVkAQAEHHBhcmFfaWQEPEhhbmRsZUJpZFJlc3VsdAEACBxwYXJhX2lkBBhyZXN1bHSVCxhFZGl0ZWQBAAQccGFyYV9pZAQsTWVtb1VwZGF0ZWQBAAwMd2hvABxwYXJhX2lkBBBtZW1vJDxBZGRlZFRvTmV3UmFpc2UBAAQccGFyYV9pZAQCtBhTeXN0ZW0BAhxARXh0cmluc2ljU3VjY2VzcwEABDRkaXNwYXRjaF9pbmZvQDxFeHRyaW5zaWNGYWlsZWQBAAg4ZGlzcGF0Y2hfZXJyb3JxCzRkaXNwYXRjaF9pbmZvQCxDb2RlVXBkYXRlZAEBBShOZXdBY2NvdW50AQAEHGFjY291bnQANEtpbGxlZEFjY291bnQBAAQcYWNjb3VudAAgUmVtYXJrZWQBAAgYc2VuZGVyABBoYXNoIERVcGdyYWRlQXV0aG9yaXplZAEACCRjb2RlX2hhc2ggNGNoZWNrX3ZlcnNpb24UHEluZGljZXMBAgw0SW5kZXhBc3NpZ25lZAEACAx3aG8AFGluZGV4BChJbmRleEZyZWVkAQAEFGluZGV4BCxJbmRleEZyb3plbgEACBRpbmRleAQMd2hvACBCYWxhbmNlcwECWBxFbmRvd2VkAQAIHGFjY291bnQAMGZyZWVfYmFsYW5jZQggRHVzdExvc3QBAAgcYWNjb3VudAAYYW1vdW50CCBUcmFuc2ZlcgEADBBmcm9tAAh0bwAYYW1vdW50CChCYWxhbmNlU2V0AQAIDHdobwAQZnJlZQggUmVzZXJ2ZWQBAAgMd2hvABhhbW91bnQIKFVucmVzZXJ2ZWQBAAgMd2hvABhhbW91bnQISFJlc2VydmVSZXBhdHJpYXRlZAEAEBBmcm9tAAh0bwAYYW1vdW50CEhkZXN0aW5hdGlvbl9zdGF0dXMpARxEZXBvc2l0AQAIDHdobwAYYW1vdW50CCBXaXRoZHJhdwEACAx3aG8AGGFtb3VudAgcU2xhc2hlZAEACAx3aG8AGGFtb3VudAgYTWludGVkAQAIDHdobwAYYW1vdW50CBhCdXJuZWQBAAgMd2hvABhhbW91bnQIJFN1c3BlbmRlZAEACAx3aG8AGGFtb3VudAggUmVzdG9yZWQBAAgMd2hvABhhbW91bnQIIFVwZ3JhZGVkAQAEDHdobwAYSXNzdWVkAQAEGGFtb3VudAgkUmVzY2luZGVkAQAEGGFtb3VudAgYTG9ja2VkAQAIDHdobwAYYW1vdW50CCBVbmxvY2tlZAEACAx3aG8AGGFtb3VudAgYRnJvemVuAQAIDHdobwAYYW1vdW50CBhUaGF3ZWQBAAgMd2hvABhhbW91bnQITFRvdGFsSXNzdWFuY2VGb3JjZWQBAAgMb2xkCAxuZXcISFRyYW5zYWN0aW9uUGF5bWVudAECBEhUcmFuc2FjdGlvbkZlZVBhaWQBAAwMd2hvAChhY3R1YWxfZmVlCAx0aXAIHFN0YWtpbmcBAkgcRXJhUGFpZAEADCRlcmFfaW5kZXgEQHZhbGlkYXRvcl9wYXlvdXQIJHJlbWFpbmRlcgggUmV3YXJkZWQBAAwUc3Rhc2gAEGRlc3Q1ARhhbW91bnQIHFNsYXNoZWQBAAgYc3Rha2VyABhhbW91bnQINFNsYXNoUmVwb3J0ZWQBAAwkdmFsaWRhdG9yACBmcmFjdGlvbgQkc2xhc2hfZXJhBGhPbGRTbGFzaGluZ1JlcG9ydERpc2NhcmRlZAEABDRzZXNzaW9uX2luZGV4BDhTdGFrZXJzRWxlY3RlZAEBBRhCb25kZWQBAAgUc3Rhc2gAGGFtb3VudAggVW5ib25kZWQBAAgUc3Rhc2gAGGFtb3VudAgkV2l0aGRyYXduAQAIFHN0YXNoABhhbW91bnQIGEtpY2tlZAEACCRub21pbmF0b3IAFHN0YXNoAFRTdGFraW5nRWxlY3Rpb25GYWlsZWQBAQUcQ2hpbGxlZAEABBRzdGFzaAA0UGF5b3V0U3RhcnRlZAEACCRlcmFfaW5kZXgEPHZhbGlkYXRvcl9zdGFzaABEVmFsaWRhdG9yUHJlZnNTZXQBAAgUc3Rhc2gAFHByZWZzOQFoU25hcHNob3RWb3RlcnNTaXplRXhjZWVkZWQBAAQQc2l6ZQRsU25hcHNob3RUYXJnZXRzU2l6ZUV4Y2VlZGVkAQAEEHNpemUEIEZvcmNlRXJhAQAEEG1vZGU9AWRDb250cm9sbGVyQmF0Y2hEZXByZWNhdGVkAQAEIGZhaWx1cmVzBCBPZmZlbmNlcwECBBxPZmZlbmNlAQAIEGtpbmRFASB0aW1lc2xvdCQcU2Vzc2lvbgECBChOZXdTZXNzaW9uAQAENHNlc3Npb25faW5kZXgEHEdyYW5kcGEBAgw4TmV3QXV0aG9yaXRpZXMBAAQ0YXV0aG9yaXR5X3NldFUBGFBhdXNlZAEBBRxSZXN1bWVkAQEFIFRyZWFzdXJ5AQIwIFNwZW5kaW5nAQAEQGJ1ZGdldF9yZW1haW5pbmcIHEF3YXJkZWQBAAw4cHJvcG9zYWxfaW5kZXgEFGF3YXJkCBxhY2NvdW50ABRCdXJudAEABCxidXJudF9mdW5kcwggUm9sbG92ZXIBAARAcm9sbG92ZXJfYmFsYW5jZQgcRGVwb3NpdAEABBR2YWx1ZQg0U3BlbmRBcHByb3ZlZAEADDhwcm9wb3NhbF9pbmRleAQYYW1vdW50CCxiZW5lZmljaWFyeQA8VXBkYXRlZEluYWN0aXZlAQAILHJlYWN0aXZhdGVkCCxkZWFjdGl2YXRlZAhIQXNzZXRTcGVuZEFwcHJvdmVkAQAYFGluZGV4BChhc3NldF9raW5kgQEYYW1vdW50CCxiZW5lZmljaWFyeZkBKHZhbGlkX2Zyb20EJGV4cGlyZV9hdARAQXNzZXRTcGVuZFZvaWRlZAEABBRpbmRleAQQUGFpZAEACBRpbmRleAQocGF5bWVudF9pZAg0UGF5bWVudEZhaWxlZAEACBRpbmRleAQocGF5bWVudF9pZAg4U3BlbmRQcm9jZXNzZWQBAAQUaW5kZXgEQENvbnZpY3Rpb25Wb3RpbmcBAggkRGVsZWdhdGVkAQQAAQgsVW5kZWxlZ2F0ZWQBAQEkUmVmZXJlbmRhAQJAJFN1Ym1pdHRlZAEADBRpbmRleAQUdHJhY2sEIHByb3Bvc2FspQFURGVjaXNpb25EZXBvc2l0UGxhY2VkAQAMFGluZGV4BAx3aG8AGGFtb3VudAhcRGVjaXNpb25EZXBvc2l0UmVmdW5kZWQBAAwUaW5kZXgEDHdobwAYYW1vdW50CDhEZXBvc2l0U2xhc2hlZAEACAx3aG8AGGFtb3VudAg8RGVjaXNpb25TdGFydGVkAQAQFGluZGV4BBR0cmFjawQgcHJvcG9zYWylARR0YWxseakBOENvbmZpcm1TdGFydGVkAQAEFGluZGV4BDhDb25maXJtQWJvcnRlZAEABBRpbmRleAQkQ29uZmlybWVkAQAIFGluZGV4BBR0YWxseakBIEFwcHJvdmVkAQAEFGluZGV4BCBSZWplY3RlZAEACBRpbmRleAQUdGFsbHmpASBUaW1lZE91dAEACBRpbmRleAQUdGFsbHmpASRDYW5jZWxsZWQBAAgUaW5kZXgEFHRhbGx5qQEYS2lsbGVkAQAIFGluZGV4BBR0YWxseakBZFN1Ym1pc3Npb25EZXBvc2l0UmVmdW5kZWQBAAwUaW5kZXgEDHdobwAYYW1vdW50CCxNZXRhZGF0YVNldAEACBRpbmRleAQQaGFzaCA8TWV0YWRhdGFDbGVhcmVkAQAIFGluZGV4BBBoYXNoIFBGZWxsb3dzaGlwQ29sbGVjdGl2ZQECFCxNZW1iZXJBZGRlZAEABAx3aG8ALFJhbmtDaGFuZ2VkAQAIDHdobwAQcmFuawQ0TWVtYmVyUmVtb3ZlZAEACAx3aG8AEHJhbmsEFFZvdGVkAQAQDHdobwAQcG9sbAQQdm90ZXkLFHRhbGx5fQs8TWVtYmVyRXhjaGFuZ2VkAQAIDHdobwAcbmV3X3dobwBMRmVsbG93c2hpcFJlZmVyZW5kYQECQCRTdWJtaXR0ZWQBAAwUaW5kZXgEFHRyYWNrBCBwcm9wb3NhbKUBVERlY2lzaW9uRGVwb3NpdFBsYWNlZAEADBRpbmRleAQMd2hvABhhbW91bnQIXERlY2lzaW9uRGVwb3NpdFJlZnVuZGVkAQAMFGluZGV4BAx3aG8AGGFtb3VudAg4RGVwb3NpdFNsYXNoZWQBAAgMd2hvABhhbW91bnQIPERlY2lzaW9uU3RhcnRlZAEAEBRpbmRleAQUdHJhY2sEIHByb3Bvc2FspQEUdGFsbHl9CzhDb25maXJtU3RhcnRlZAEABBRpbmRleAQ4Q29uZmlybUFib3J0ZWQBAAQUaW5kZXgEJENvbmZpcm1lZAEACBRpbmRleAQUdGFsbHl9CyBBcHByb3ZlZAEABBRpbmRleAQgUmVqZWN0ZWQBAAgUaW5kZXgEFHRhbGx5fQsgVGltZWRPdXQBAAgUaW5kZXgEFHRhbGx5fQskQ2FuY2VsbGVkAQAIFGluZGV4BBR0YWxseX0LGEtpbGxlZAEACBRpbmRleAQUdGFsbHl9C2RTdWJtaXNzaW9uRGVwb3NpdFJlZnVuZGVkAQAMFGluZGV4BAx3aG8AGGFtb3VudAgsTWV0YWRhdGFTZXQBAAgUaW5kZXgEEGhhc2ggPE1ldGFkYXRhQ2xlYXJlZAEACBRpbmRleAQQaGFzaCAkV2hpdGVsaXN0AQIMPENhbGxXaGl0ZWxpc3RlZAEABCRjYWxsX2hhc2ggWFdoaXRlbGlzdGVkQ2FsbFJlbW92ZWQBAAQkY2FsbF9oYXNoIGRXaGl0ZWxpc3RlZENhbGxEaXNwYXRjaGVkAQAIJGNhbGxfaGFzaCAYcmVzdWx0jQsoUGFyYW1ldGVycwECBBxVcGRhdGVkAQAMDGtleckBJG9sZF92YWx1ZdUBJG5ld192YWx1ZdUBGENsYWltcwECBBxDbGFpbWVkAQAMDHdobwBAZXRoZXJldW1fYWRkcmVzc2UBGGFtb3VudAgcVXRpbGl0eQECGEBCYXRjaEludGVycnVwdGVkAQAIFGluZGV4BBRlcnJvcnELOEJhdGNoQ29tcGxldGVkAQEFYEJhdGNoQ29tcGxldGVkV2l0aEVycm9ycwEBBTRJdGVtQ29tcGxldGVkAQEFKEl0ZW1GYWlsZWQBAAQUZXJyb3JxCzBEaXNwYXRjaGVkQXMBAAQYcmVzdWx0lQscU29jaWV0eQECRBxGb3VuZGVkAQAEHGZvdW5kZXIADEJpZAEACDBjYW5kaWRhdGVfaWQAFG9mZmVyCBRWb3VjaAEADDBjYW5kaWRhdGVfaWQAFG9mZmVyCCB2b3VjaGluZwAkQXV0b1VuYmlkAQAEJGNhbmRpZGF0ZQAUVW5iaWQBAAQkY2FuZGlkYXRlABxVbnZvdWNoAQAEJGNhbmRpZGF0ZQAgSW5kdWN0ZWQBAAgccHJpbWFyeQAoY2FuZGlkYXRlc90DYFN1c3BlbmRlZE1lbWJlckp1ZGdlbWVudAEACAx3aG8AGGp1ZGdlZBRIQ2FuZGlkYXRlU3VzcGVuZGVkAQAEJGNhbmRpZGF0ZQA8TWVtYmVyU3VzcGVuZGVkAQAEGG1lbWJlcgAoQ2hhbGxlbmdlZAEABBhtZW1iZXIAEFZvdGUBAAwkY2FuZGlkYXRlABR2b3RlcgAQdm90ZRQwRGVmZW5kZXJWb3RlAQAIFHZvdGVyABB2b3RlFCROZXdQYXJhbXMBAAQYcGFyYW1znQskVW5mb3VuZGVkAQAEHGZvdW5kZXIAHERlcG9zaXQBAAQUdmFsdWUIIEVsZXZhdGVkAQAIGG1lbWJlcgAQcmFuawQgUmVjb3ZlcnkBAhg8UmVjb3ZlcnlDcmVhdGVkAQAEHGFjY291bnQARFJlY292ZXJ5SW5pdGlhdGVkAQAIMGxvc3RfYWNjb3VudAA8cmVzY3Vlcl9hY2NvdW50ADxSZWNvdmVyeVZvdWNoZWQBAAwwbG9zdF9hY2NvdW50ADxyZXNjdWVyX2FjY291bnQAGHNlbmRlcgA4UmVjb3ZlcnlDbG9zZWQBAAgwbG9zdF9hY2NvdW50ADxyZXNjdWVyX2FjY291bnQAQEFjY291bnRSZWNvdmVyZWQBAAgwbG9zdF9hY2NvdW50ADxyZXNjdWVyX2FjY291bnQAPFJlY292ZXJ5UmVtb3ZlZAEABDBsb3N0X2FjY291bnQAHFZlc3RpbmcBAgg4VmVzdGluZ1VwZGF0ZWQBAAgcYWNjb3VudAAgdW52ZXN0ZWQIQFZlc3RpbmdDb21wbGV0ZWQBAAQcYWNjb3VudAAkU2NoZWR1bGVyAQIkJFNjaGVkdWxlZAEACBB3aGVuBBRpbmRleAQgQ2FuY2VsZWQBAAgQd2hlbgQUaW5kZXgEKERpc3BhdGNoZWQBAAwQdGFzaw0BCGlkEQEYcmVzdWx0lQsgUmV0cnlTZXQBABAQdGFzaw0BCGlkEQEYcGVyaW9kBBxyZXRyaWVzBDhSZXRyeUNhbmNlbGxlZAEACBB0YXNrDQEIaWQRATxDYWxsVW5hdmFpbGFibGUBAAgQdGFzaw0BCGlkEQE4UGVyaW9kaWNGYWlsZWQBAAgQdGFzaw0BCGlkEQEsUmV0cnlGYWlsZWQBAAgQdGFzaw0BCGlkEQFUUGVybWFuZW50bHlPdmVyd2VpZ2h0AQAIEHRhc2sNAQhpZBEBFFByb3h5AQIUNFByb3h5RXhlY3V0ZWQBAAQYcmVzdWx0lQssUHVyZUNyZWF0ZWQBABAQcHVyZQAMd2hvAChwcm94eV90eXBlrQtQZGlzYW1iaWd1YXRpb25faW5kZXgEJEFubm91bmNlZAEADBByZWFsABRwcm94eQAkY2FsbF9oYXNoIChQcm94eUFkZGVkAQAQJGRlbGVnYXRvcgAkZGVsZWdhdGVlAChwcm94eV90eXBlrQsUZGVsYXkEMFByb3h5UmVtb3ZlZAEAECRkZWxlZ2F0b3IAJGRlbGVnYXRlZQAocHJveHlfdHlwZa0LFGRlbGF5BCBNdWx0aXNpZwECECxOZXdNdWx0aXNpZwEADCRhcHByb3ZpbmcAIG11bHRpc2lnACRjYWxsX2hhc2ggQE11bHRpc2lnQXBwcm92YWwBABAkYXBwcm92aW5nACR0aW1lcG9pbnTxASBtdWx0aXNpZwAkY2FsbF9oYXNoIEBNdWx0aXNpZ0V4ZWN1dGVkAQAUJGFwcHJvdmluZwAkdGltZXBvaW508QEgbXVsdGlzaWcAJGNhbGxfaGFzaCAYcmVzdWx0lQtETXVsdGlzaWdDYW5jZWxsZWQBABAoY2FuY2VsbGluZwAkdGltZXBvaW508QEgbXVsdGlzaWcAJGNhbGxfaGFzaCAgUHJlaW1hZ2UBAgwUTm90ZWQBAAQQaGFzaCAkUmVxdWVzdGVkAQAEEGhhc2ggHENsZWFyZWQBAAQQaGFzaCAgQm91bnRpZXMBAiw4Qm91bnR5UHJvcG9zZWQBAAQUaW5kZXgEOEJvdW50eVJlamVjdGVkAQAIFGluZGV4BBBib25kCEhCb3VudHlCZWNhbWVBY3RpdmUBAAQUaW5kZXgENEJvdW50eUF3YXJkZWQBAAgUaW5kZXgELGJlbmVmaWNpYXJ5ADRCb3VudHlDbGFpbWVkAQAMFGluZGV4BBhwYXlvdXQILGJlbmVmaWNpYXJ5ADhCb3VudHlDYW5jZWxlZAEABBRpbmRleAQ4Qm91bnR5RXh0ZW5kZWQBAAQUaW5kZXgEOEJvdW50eUFwcHJvdmVkAQAEFGluZGV4BDxDdXJhdG9yUHJvcG9zZWQBAAgkYm91bnR5X2lkBBxjdXJhdG9yAERDdXJhdG9yVW5hc3NpZ25lZAEABCRib3VudHlfaWQEPEN1cmF0b3JBY2NlcHRlZAEACCRib3VudHlfaWQEHGN1cmF0b3IANENoaWxkQm91bnRpZXMBAhAUQWRkZWQBAAgUaW5kZXgELGNoaWxkX2luZGV4BBxBd2FyZGVkAQAMFGluZGV4BCxjaGlsZF9pbmRleAQsYmVuZWZpY2lhcnkAHENsYWltZWQBABAUaW5kZXgELGNoaWxkX2luZGV4BBhwYXlvdXQILGJlbmVmaWNpYXJ5ACBDYW5jZWxlZAEACBRpbmRleAQsY2hpbGRfaW5kZXgEaEVsZWN0aW9uUHJvdmlkZXJNdWx0aVBoYXNlAQIYOFNvbHV0aW9uU3RvcmVkAQAMHGNvbXB1dGUBAhhvcmlnaW4FAjBwcmV2X2VqZWN0ZWQUREVsZWN0aW9uRmluYWxpemVkAQAIHGNvbXB1dGUBAhRzY29yZQkCOEVsZWN0aW9uRmFpbGVkAQEFIFJld2FyZGVkAQAIHGFjY291bnQAFHZhbHVlCBxTbGFzaGVkAQAIHGFjY291bnQAFHZhbHVlCERQaGFzZVRyYW5zaXRpb25lZAEADBBmcm9tEQIIdG8RAhRyb3VuZAQMTmlzAQIcJEJpZFBsYWNlZAEADAx3aG8AGGFtb3VudAggZHVyYXRpb24EMEJpZFJldHJhY3RlZAEADAx3aG8AGGFtb3VudAggZHVyYXRpb24EKEJpZERyb3BwZWQBAAwMd2hvABhhbW91bnQIIGR1cmF0aW9uBBhJc3N1ZWQBABQUaW5kZXgEGGV4cGlyeQQMd2hvAChwcm9wb3J0aW9uCBhhbW91bnQIGFRoYXdlZAEAFBRpbmRleAQMd2hvAChwcm9wb3J0aW9uCBhhbW91bnQIHGRyb3BwZWQUGEZ1bmRlZAEABBxkZWZpY2l0CCxUcmFuc2ZlcnJlZAEADBBmcm9tAAh0bwAUaW5kZXgEWE5pc0NvdW50ZXJwYXJ0QmFsYW5jZXMBAlgcRW5kb3dlZAEACBxhY2NvdW50ADBmcmVlX2JhbGFuY2UIIER1c3RMb3N0AQAIHGFjY291bnQAGGFtb3VudAggVHJhbnNmZXIBAAwQZnJvbQAIdG8AGGFtb3VudAgoQmFsYW5jZVNldAEACAx3aG8AEGZyZWUIIFJlc2VydmVkAQAIDHdobwAYYW1vdW50CChVbnJlc2VydmVkAQAIDHdobwAYYW1vdW50CEhSZXNlcnZlUmVwYXRyaWF0ZWQBABAQZnJvbQAIdG8AGGFtb3VudAhIZGVzdGluYXRpb25fc3RhdHVzKQEcRGVwb3NpdAEACAx3aG8AGGFtb3VudAggV2l0aGRyYXcBAAgMd2hvABhhbW91bnQIHFNsYXNoZWQBAAgMd2hvABhhbW91bnQIGE1pbnRlZAEACAx3aG8AGGFtb3VudAgYQnVybmVkAQAIDHdobwAYYW1vdW50CCRTdXNwZW5kZWQBAAgMd2hvABhhbW91bnQIIFJlc3RvcmVkAQAIDHdobwAYYW1vdW50CCBVcGdyYWRlZAEABAx3aG8AGElzc3VlZAEABBhhbW91bnQIJFJlc2NpbmRlZAEABBhhbW91bnQIGExvY2tlZAEACAx3aG8AGGFtb3VudAggVW5sb2NrZWQBAAgMd2hvABhhbW91bnQIGEZyb3plbgEACAx3aG8AGGFtb3VudAgYVGhhd2VkAQAIDHdobwAYYW1vdW50CExUb3RhbElzc3VhbmNlRm9yY2VkAQAIDG9sZAgMbmV3CCRWb3Rlckxpc3QBAgggUmViYWdnZWQBAAwMd2hvABBmcm9tCAh0bwgwU2NvcmVVcGRhdGVkAQAIDHdobwAkbmV3X3Njb3JlCDxOb21pbmF0aW9uUG9vbHMBAkgcQ3JlYXRlZAEACCRkZXBvc2l0b3IAHHBvb2xfaWQEGEJvbmRlZAEAEBhtZW1iZXIAHHBvb2xfaWQEGGJvbmRlZAgYam9pbmVkFBxQYWlkT3V0AQAMGG1lbWJlcgAccG9vbF9pZAQYcGF5b3V0CCBVbmJvbmRlZAEAFBhtZW1iZXIAHHBvb2xfaWQEHGJhbGFuY2UIGHBvaW50cwgMZXJhBCRXaXRoZHJhd24BABAYbWVtYmVyABxwb29sX2lkBBxiYWxhbmNlCBhwb2ludHMIJERlc3Ryb3llZAEABBxwb29sX2lkBDBTdGF0ZUNoYW5nZWQBAAgccG9vbF9pZAQkbmV3X3N0YXRlHQI0TWVtYmVyUmVtb3ZlZAEACBxwb29sX2lkBBhtZW1iZXIAMFJvbGVzVXBkYXRlZAEADBByb290BQIcYm91bmNlcgUCJG5vbWluYXRvcgUCLFBvb2xTbGFzaGVkAQAIHHBvb2xfaWQEHGJhbGFuY2UIUFVuYm9uZGluZ1Bvb2xTbGFzaGVkAQAMHHBvb2xfaWQEDGVyYQQcYmFsYW5jZQhUUG9vbENvbW1pc3Npb25VcGRhdGVkAQAIHHBvb2xfaWQEHGN1cnJlbnQlAmBQb29sTWF4Q29tbWlzc2lvblVwZGF0ZWQBAAgccG9vbF9pZAQ4bWF4X2NvbW1pc3Npb24EfFBvb2xDb21taXNzaW9uQ2hhbmdlUmF0ZVVwZGF0ZWQBAAgccG9vbF9pZAQsY2hhbmdlX3JhdGUpApBQb29sQ29tbWlzc2lvbkNsYWltUGVybWlzc2lvblVwZGF0ZWQBAAgccG9vbF9pZAQocGVybWlzc2lvbjECVFBvb2xDb21taXNzaW9uQ2xhaW1lZAEACBxwb29sX2lkBChjb21taXNzaW9uCGRNaW5CYWxhbmNlRGVmaWNpdEFkanVzdGVkAQAIHHBvb2xfaWQEGGFtb3VudAhgTWluQmFsYW5jZUV4Y2Vzc0FkanVzdGVkAQAIHHBvb2xfaWQEGGFtb3VudAgsRmFzdFVuc3Rha2UBAhQgVW5zdGFrZWQBAAgUc3Rhc2gAGHJlc3VsdJULHFNsYXNoZWQBAAgUc3Rhc2gAGGFtb3VudAgwQmF0Y2hDaGVja2VkAQAEEGVyYXM5AjRCYXRjaEZpbmlzaGVkAQAEEHNpemUENEludGVybmFsRXJyb3IBAQU0UGFyYUluY2x1c2lvbgECEDxDYW5kaWRhdGVCYWNrZWQBAxBJAiQEBERDYW5kaWRhdGVJbmNsdWRlZAEDEEkCJAQERENhbmRpZGF0ZVRpbWVkT3V0AQMMSQIkBFhVcHdhcmRNZXNzYWdlc1JlY2VpdmVkAQAIEGZyb20EFGNvdW50BBRQYXJhcwECIEhDdXJyZW50Q29kZVVwZGF0ZWQBAQJIQ3VycmVudEhlYWRVcGRhdGVkAQECUENvZGVVcGdyYWRlU2NoZWR1bGVkAQECME5ld0hlYWROb3RlZAEBAjBBY3Rpb25RdWV1ZWQBBAQBCDxQdmZDaGVja1N0YXJ0ZWQBAwggBEBQdmZDaGVja0FjY2VwdGVkAQMIIARAUHZmQ2hlY2tSZWplY3RlZAEDCCAEEEhybXABAhxQT3BlbkNoYW5uZWxSZXF1ZXN0ZWQBABAYc2VuZGVyBCRyZWNpcGllbnQEVHByb3Bvc2VkX21heF9jYXBhY2l0eQRkcHJvcG9zZWRfbWF4X21lc3NhZ2Vfc2l6ZQRMT3BlbkNoYW5uZWxDYW5jZWxlZAEACDBieV9wYXJhY2hhaW4EKGNoYW5uZWxfaWRVAkxPcGVuQ2hhbm5lbEFjY2VwdGVkAQAIGHNlbmRlcgQkcmVjaXBpZW50BDRDaGFubmVsQ2xvc2VkAQAIMGJ5X3BhcmFjaGFpbgQoY2hhbm5lbF9pZFUCWEhybXBDaGFubmVsRm9yY2VPcGVuZWQBABAYc2VuZGVyBCRyZWNpcGllbnQEVHByb3Bvc2VkX21heF9jYXBhY2l0eQRkcHJvcG9zZWRfbWF4X21lc3NhZ2Vfc2l6ZQRcSHJtcFN5c3RlbUNoYW5uZWxPcGVuZWQBABAYc2VuZGVyBCRyZWNpcGllbnQEVHByb3Bvc2VkX21heF9jYXBhY2l0eQRkcHJvcG9zZWRfbWF4X21lc3NhZ2Vfc2l6ZQRoT3BlbkNoYW5uZWxEZXBvc2l0c1VwZGF0ZWQBAAgYc2VuZGVyBCRyZWNpcGllbnQENFBhcmFzRGlzcHV0ZXMBAgxARGlzcHV0ZUluaXRpYXRlZAEDCCBdAkBEaXNwdXRlQ29uY2x1ZGVkAQMIIGECGFJldmVydAEBAmhPbkRlbWFuZEFzc2lnbm1lbnRQcm92aWRlcgECCExPbkRlbWFuZE9yZGVyUGxhY2VkAQAMHHBhcmFfaWQEKHNwb3RfcHJpY2UIKG9yZGVyZWRfYnkAMFNwb3RQcmljZVNldAEABChzcG90X3ByaWNlCCRSZWdpc3RyYXIBAhAoUmVnaXN0ZXJlZAEACBxwYXJhX2lkBBxtYW5hZ2VyADBEZXJlZ2lzdGVyZWQBAAQccGFyYV9pZAQgUmVzZXJ2ZWQBAAgccGFyYV9pZAQMd2hvABxTd2FwcGVkAQAIHHBhcmFfaWQEIG90aGVyX2lkBBRTbG90cwECCDhOZXdMZWFzZVBlcmlvZAEABDBsZWFzZV9wZXJpb2QEGExlYXNlZAEAGBxwYXJhX2lkBBhsZWFzZXIAMHBlcmlvZF9iZWdpbgQwcGVyaW9kX2NvdW50BDhleHRyYV9yZXNlcnZlZAgwdG90YWxfYW1vdW50CCBBdWN0aW9ucwECHDhBdWN0aW9uU3RhcnRlZAEADDRhdWN0aW9uX2luZGV4BDBsZWFzZV9wZXJpb2QEGGVuZGluZwQ0QXVjdGlvbkNsb3NlZAEABDRhdWN0aW9uX2luZGV4BCBSZXNlcnZlZAEADBhiaWRkZXIAOGV4dHJhX3Jlc2VydmVkCDB0b3RhbF9hbW91bnQIKFVucmVzZXJ2ZWQBAAgYYmlkZGVyABhhbW91bnQISFJlc2VydmVDb25maXNjYXRlZAEADBxwYXJhX2lkBBhsZWFzZXIAGGFtb3VudAgsQmlkQWNjZXB0ZWQBABQYYmlkZGVyABxwYXJhX2lkBBhhbW91bnQIKGZpcnN0X3Nsb3QEJGxhc3Rfc2xvdAQ0V2lubmluZ09mZnNldAEACDRhdWN0aW9uX2luZGV4BDBibG9ja19udW1iZXIEJENyb3dkbG9hbgECKBxDcmVhdGVkAQAEHHBhcmFfaWQELENvbnRyaWJ1dGVkAQAMDHdobwAoZnVuZF9pbmRleAQYYW1vdW50CCBXaXRoZHJldwEADAx3aG8AKGZ1bmRfaW5kZXgEGGFtb3VudAhEUGFydGlhbGx5UmVmdW5kZWQBAAQccGFyYV9pZAQsQWxsUmVmdW5kZWQBAAQccGFyYV9pZAQkRGlzc29sdmVkAQAEHHBhcmFfaWQEPEhhbmRsZUJpZFJlc3VsdAEACBxwYXJhX2lkBBhyZXN1bHSVCxhFZGl0ZWQBAAQccGFyYV9pZAQsTWVtb1VwZGF0ZWQBAAwMd2hvABxwYXJhX2lkBBBtZW1vJDxBZGRlZFRvTmV3UmFpc2UBAAQccGFyYV9pZAQgQ29yZXRpbWUBAghQUmV2ZW51ZUluZm9SZXF1ZXN0ZWQBAAQQd2hlbgQwQ29yZUFzc2lnbmVkAQAEEGNvcmUEJFhjbVBhbGxldAECYCRBdHRlbXB0ZWQBAAQcb3V0Y29tZY0CEFNlbnQBABAYb3JpZ2lueQEsZGVzdGluYXRpb255ARxtZXNzYWdl+QIobWVzc2FnZV9pZCBIVW5leHBlY3RlZFJlc3BvbnNlAQAIGG9yaWdpbnkBIHF1ZXJ5X2lkCDRSZXNwb25zZVJlYWR5AQAIIHF1ZXJ5X2lkCCByZXNwb25zZbkCIE5vdGlmaWVkAQAMIHF1ZXJ5X2lkCDBwYWxsZXRfaW5kZXgEKGNhbGxfaW5kZXgEQE5vdGlmeU92ZXJ3ZWlnaHQBABQgcXVlcnlfaWQIMHBhbGxldF9pbmRleAQoY2FsbF9pbmRleAQ0YWN0dWFsX3dlaWdodBhMbWF4X2J1ZGdldGVkX3dlaWdodBhMTm90aWZ5RGlzcGF0Y2hFcnJvcgEADCBxdWVyeV9pZAgwcGFsbGV0X2luZGV4BChjYWxsX2luZGV4BEhOb3RpZnlEZWNvZGVGYWlsZWQBAAwgcXVlcnlfaWQIMHBhbGxldF9pbmRleAQoY2FsbF9pbmRleARASW52YWxpZFJlc3BvbmRlcgEADBhvcmlnaW55ASBxdWVyeV9pZAhEZXhwZWN0ZWRfbG9jYXRpb269AlxJbnZhbGlkUmVzcG9uZGVyVmVyc2lvbgEACBhvcmlnaW55ASBxdWVyeV9pZAg0UmVzcG9uc2VUYWtlbgEABCBxdWVyeV9pZAg0QXNzZXRzVHJhcHBlZAEADBBoYXNoIBhvcmlnaW55ARhhc3NldHMZA1RWZXJzaW9uQ2hhbmdlTm90aWZpZWQBABAsZGVzdGluYXRpb255ARhyZXN1bHQEEGNvc3ShAihtZXNzYWdlX2lkIFxTdXBwb3J0ZWRWZXJzaW9uQ2hhbmdlZAEACCBsb2NhdGlvbnkBHHZlcnNpb24EUE5vdGlmeVRhcmdldFNlbmRGYWlsAQAMIGxvY2F0aW9ueQEgcXVlcnlfaWQIFGVycm9yiQJkTm90aWZ5VGFyZ2V0TWlncmF0aW9uRmFpbAEACCBsb2NhdGlvbpkBIHF1ZXJ5X2lkCFRJbnZhbGlkUXVlcmllclZlcnNpb24BAAgYb3JpZ2lueQEgcXVlcnlfaWQIOEludmFsaWRRdWVyaWVyAQAQGG9yaWdpbnkBIHF1ZXJ5X2lkCEBleHBlY3RlZF9xdWVyaWVyeQFQbWF5YmVfYWN0dWFsX3F1ZXJpZXK9AlBWZXJzaW9uTm90aWZ5U3RhcnRlZAEADCxkZXN0aW5hdGlvbnkBEGNvc3ShAihtZXNzYWdlX2lkIFhWZXJzaW9uTm90aWZ5UmVxdWVzdGVkAQAMLGRlc3RpbmF0aW9ueQEQY29zdKECKG1lc3NhZ2VfaWQgYFZlcnNpb25Ob3RpZnlVbnJlcXVlc3RlZAEADCxkZXN0aW5hdGlvbnkBEGNvc3ShAihtZXNzYWdlX2lkICBGZWVzUGFpZAEACBhwYXlpbmd5ARBmZWVzoQI0QXNzZXRzQ2xhaW1lZAEADBBoYXNoIBhvcmlnaW55ARhhc3NldHMZA2BWZXJzaW9uTWlncmF0aW9uRmluaXNoZWQBAAQcdmVyc2lvbgQwTWVzc2FnZVF1ZXVlAQIQQFByb2Nlc3NpbmdGYWlsZWQBAAwIaWQgGG9yaWdpbiUDFGVycm9yKQMkUHJvY2Vzc2VkAQAQCGlkIBhvcmlnaW4lAyx3ZWlnaHRfdXNlZBgcc3VjY2VzcxRIT3ZlcndlaWdodEVucXVldWVkAQAQCGlkIBhvcmlnaW4lAyhwYWdlX2luZGV4BDRtZXNzYWdlX2luZGV4BChQYWdlUmVhcGVkAQAIGG9yaWdpbiUDFGluZGV4BCRBc3NldFJhdGUBAgxAQXNzZXRSYXRlQ3JlYXRlZAEACChhc3NldF9raW5kgQEQcmF0ZQhAQXNzZXRSYXRlUmVtb3ZlZAEABChhc3NldF9raW5kgQFAQXNzZXRSYXRlVXBkYXRlZAEADChhc3NldF9raW5kgQEMb2xkCAxuZXcIAAwUcGhhc2U0FGV2ZW50xQsYdG9waWNzOQMEyQsAAgQoTmZ0UmVjZWlwdAEBBQIIIFByZWltYWdlAQIEIFByZWltYWdlAQEFDE5pcwECBChOZnRSZWNlaXB0AQEFAAgIaWTVCxhhbW91bnQIBNkLAAJwMFN0YWtpbmdBZG1pbgEBBSRUcmVhc3VyZXIBAQU8RmVsbG93c2hpcEFkbWluAQEFMEdlbmVyYWxBZG1pbgEBBTBBdWN0aW9uQWRtaW4BAQUoTGVhc2VBZG1pbgEBBUxSZWZlcmVuZHVtQ2FuY2VsbGVyAQEFQFJlZmVyZW5kdW1LaWxsZXIBAQUsU21hbGxUaXBwZXIBAQUkQmlnVGlwcGVyAQEFMFNtYWxsU3BlbmRlcgEBBTRNZWRpdW1TcGVuZGVyAQEFKEJpZ1NwZW5kZXIBAQVEV2hpdGVsaXN0ZWRDYWxsZXIBAQVMRmVsbG93c2hpcEluaXRpYXRlcwEBBRxGZWxsb3dzAQEFREZlbGxvd3NoaXBFeHBlcnRzAQEFREZlbGxvd3NoaXBNYXN0ZXJzAQEFOEZlbGxvd3NoaXAxRGFuAQEFOEZlbGxvd3NoaXAyRGFuAQEFOEZlbGxvd3NoaXAzRGFuAQEFOEZlbGxvd3NoaXA0RGFuAQEFOEZlbGxvd3NoaXA1RGFuAQEFOEZlbGxvd3NoaXA2RGFuAQEFOEZlbGxvd3NoaXA3RGFuAQEFOEZlbGxvd3NoaXA4RGFuAQEFOEZlbGxvd3NoaXA5RGFuAQEFNFdpc2hGb3JDaGFuZ2UBAQUCFBhzeXN0ZW0BAgwQUm9vdAEBBRhTaWduZWQBAQEQTm9uZQEBBRxPcmlnaW5zAQJwMFN0YWtpbmdBZG1pbgEBBSRUcmVhc3VyZXIBAQU8RmVsbG93c2hpcEFkbWluAQEFMEdlbmVyYWxBZG1pbgEBBTBBdWN0aW9uQWRtaW4BAQUoTGVhc2VBZG1pbgEBBUxSZWZlcmVuZHVtQ2FuY2VsbGVyAQEFQFJlZmVyZW5kdW1LaWxsZXIBAQUsU21hbGxUaXBwZXIBAQUkQmlnVGlwcGVyAQEFMFNtYWxsU3BlbmRlcgEBBTRNZWRpdW1TcGVuZGVyAQEFKEJpZ1NwZW5kZXIBAQVEV2hpdGVsaXN0ZWRDYWxsZXIBAQVMRmVsbG93c2hpcEluaXRpYXRlcwEBBRxGZWxsb3dzAQEFREZlbGxvd3NoaXBFeHBlcnRzAQEFREZlbGxvd3NoaXBNYXN0ZXJzAQEFOEZlbGxvd3NoaXAxRGFuAQEFOEZlbGxvd3NoaXAyRGFuAQEFOEZlbGxvd3NoaXAzRGFuAQEFOEZlbGxvd3NoaXA0RGFuAQEFOEZlbGxvd3NoaXA1RGFuAQEFOEZlbGxvd3NoaXA2RGFuAQEFOEZlbGxvd3NoaXA3RGFuAQEFOEZlbGxvd3NoaXA4RGFuAQEFOEZlbGxvd3NoaXA5RGFuAQEFNFdpc2hGb3JDaGFuZ2UBAQVAUGFyYWNoYWluc09yaWdpbgECBCRQYXJhY2hhaW4BAQIkWGNtUGFsbGV0AQIIDFhjbQEACBxwYXJlbnRzBCBpbnRlcmlvcnUBIFJlc3BvbnNlAQAIHHBhcmVudHMEIGludGVyaW9ydQEQVm9pZAEBBQAsFHRyYWNrBBhvcmlnaW7lCyBwcm9wb3NhbKUBJGVuYWN0bWVudEEEJHN1Ym1pdHRlZARIc3VibWlzc2lvbl9kZXBvc2l03QdAZGVjaXNpb25fZGVwb3NpdOEHIGRlY2lkaW5n6QcUdGFsbHmpASBpbl9xdWV1ZRQUYWxhcm3xBwIYHE9uZ29pbmcBACwUdHJhY2sEGG9yaWdpbuULIHByb3Bvc2FspQEkZW5hY3RtZW50QQQkc3VibWl0dGVkBEhzdWJtaXNzaW9uX2RlcG9zaXTdB0BkZWNpc2lvbl9kZXBvc2l04QcgZGVjaWRpbmfpBxR0YWxseakBIGluX3F1ZXVlFBRhbGFybfEHIEFwcHJvdmVkAQMMBOEH4QcgUmVqZWN0ZWQBAwwE4QfhByRDYW5jZWxsZWQBAwwE4QfhByBUaW1lZE91dAEDDAThB+EHGEtpbGxlZAEBAgAsFHRyYWNrBBhvcmlnaW7lCyBwcm9wb3NhbKUBJGVuYWN0bWVudEEEJHN1Ym1pdHRlZARIc3VibWlzc2lvbl9kZXBvc2l03QdAZGVjaXNpb25fZGVwb3NpdOEHIGRlY2lkaW5n6QcUdGFsbHl9CyBpbl9xdWV1ZRQUYWxhcm3xBwIYHE9uZ29pbmcBACwUdHJhY2sEGG9yaWdpbuULIHByb3Bvc2FspQEkZW5hY3RtZW50QQQkc3VibWl0dGVkBEhzdWJtaXNzaW9uX2RlcG9zaXTdB0BkZWNpc2lvbl9kZXBvc2l04QcgZGVjaWRpbmfpBxR0YWxseX0LIGluX3F1ZXVlFBRhbGFybfEHIEFwcHJvdmVkAQMMBOEH4QcgUmVqZWN0ZWQBAwwE4QfhByRDYW5jZWxsZWQBAwwE4QfhByBUaW1lZE91dAEDDAThB+EHGEtpbGxlZAEBAgIkGHN1Ym1pdAEADDxwcm9wb3NhbF9vcmlnaW7lCyBwcm9wb3NhbKUBQGVuYWN0bWVudF9tb21lbnRBBFhwbGFjZV9kZWNpc2lvbl9kZXBvc2l0AQAEFGluZGV4BFxyZWZ1bmRfZGVjaXNpb25fZGVwb3NpdAEABBRpbmRleAQYY2FuY2VsAQAEFGluZGV4BBBraWxsAQAEFGluZGV4BEBudWRnZV9yZWZlcmVuZHVtAQAEFGluZGV4BEhvbmVfZmV3ZXJfZGVjaWRpbmcBAAQUdHJhY2sEZHJlZnVuZF9zdWJtaXNzaW9uX2RlcG9zaXQBAAQUaW5kZXgEMHNldF9tZXRhZGF0YQEACBRpbmRleAQobWF5YmVfaGFzaBEBAhwoYWRkX21lbWJlcgEABAx3aG/VAzhwcm9tb3RlX21lbWJlcgEABAx3aG/VAzRkZW1vdGVfbWVtYmVyAQAEDHdob9UDNHJlbW92ZV9tZW1iZXIBAAgMd2hv1QMgbWluX3JhbmsEEHZvdGUBAAgQcG9sbAQMYXllFDBjbGVhbnVwX3BvbGwBAAgocG9sbF9pbmRleAQMbWF4BDxleGNoYW5nZV9tZW1iZXIBAAgMd2hv1QMcbmV3X3dob9UDAhA4d2hpdGVsaXN0X2NhbGwBAAQkY2FsbF9oYXNoIFxyZW1vdmVfd2hpdGVsaXN0ZWRfY2FsbAEABCRjYWxsX2hhc2ggZGRpc3BhdGNoX3doaXRlbGlzdGVkX2NhbGwBAAwkY2FsbF9oYXNoIEBjYWxsX2VuY29kZWRfbGVuBExjYWxsX3dlaWdodF93aXRuZXNzGJxkaXNwYXRjaF93aGl0ZWxpc3RlZF9jYWxsX3dpdGhfcHJlaW1hZ2UBAAQQY2FsbJUMBJUMAAIYFGJhdGNoAQAEFGNhbGxzBQw0YXNfZGVyaXZhdGl2ZQEACBRpbmRleAQQY2FsbJUMJGJhdGNoX2FsbAEABBRjYWxscwUMLGRpc3BhdGNoX2FzAQAIJGFzX29yaWdpbuULEGNhbGyVDCxmb3JjZV9iYXRjaAEABBRjYWxscwUMLHdpdGhfd2VpZ2h0AQAIEGNhbGyVDBh3ZWlnaHQYAlAMYmlkAQAEFHZhbHVlCBR1bmJpZAEBBRR2b3VjaAEADAx3aG/VAxR2YWx1ZQgMdGlwCBx1bnZvdWNoAQEFEHZvdGUBAAgkY2FuZGlkYXRl1QMcYXBwcm92ZRQ0ZGVmZW5kZXJfdm90ZQEABBxhcHByb3ZlFBhwYXlvdXQBAQUsd2FpdmVfcmVwYXkBAAQYYW1vdW50CDRmb3VuZF9zb2NpZXR5AQAYHGZvdW5kZXLVAyxtYXhfbWVtYmVycwQobWF4X2ludGFrZQQsbWF4X3N0cmlrZXMERGNhbmRpZGF0ZV9kZXBvc2l0CBRydWxlcyQgZGlzc29sdmUBAQVYanVkZ2Vfc3VzcGVuZGVkX21lbWJlcgEACAx3aG/VAxxmb3JnaXZlFDhzZXRfcGFyYW1ldGVycwEAECxtYXhfbWVtYmVycwQobWF4X2ludGFrZQQsbWF4X3N0cmlrZXMERGNhbmRpZGF0ZV9kZXBvc2l0CDhwdW5pc2hfc2tlcHRpYwEBBUBjbGFpbV9tZW1iZXJzaGlwAQEFRGJlc3Rvd19tZW1iZXJzaGlwAQAEJGNhbmRpZGF0ZQA4a2lja19jYW5kaWRhdGUBAAQkY2FuZGlkYXRlAEByZXNpZ25fY2FuZGlkYWN5AQEFOGRyb3BfY2FuZGlkYXRlAQAEJGNhbmRpZGF0ZQBEY2xlYW51cF9jYW5kaWRhY3kBAAgkY2FuZGlkYXRlAAxtYXgERGNsZWFudXBfY2hhbGxlbmdlAQAIPGNoYWxsZW5nZV9yb3VuZAQMbWF4BAIkMGFzX3JlY292ZXJlZAEACBxhY2NvdW501QMQY2FsbJUMNHNldF9yZWNvdmVyZWQBAAgQbG9zdNUDHHJlc2N1ZXLVAzxjcmVhdGVfcmVjb3ZlcnkBAAwcZnJpZW5kc90DJHRocmVzaG9sZAQwZGVsYXlfcGVyaW9kBERpbml0aWF0ZV9yZWNvdmVyeQEABBxhY2NvdW501QM4dm91Y2hfcmVjb3ZlcnkBAAgQbG9zdNUDHHJlc2N1ZXLVAzhjbGFpbV9yZWNvdmVyeQEABBxhY2NvdW501QM4Y2xvc2VfcmVjb3ZlcnkBAAQccmVzY3VlctUDPHJlbW92ZV9yZWNvdmVyeQEBBUBjYW5jZWxfcmVjb3ZlcmVkAQAEHGFjY291bnTVAwIoIHNjaGVkdWxlAQAQEHdoZW4EOG1heWJlX3BlcmlvZGljgQMgcHJpb3JpdHkEEGNhbGyVDBhjYW5jZWwBAAgQd2hlbgQUaW5kZXgEOHNjaGVkdWxlX25hbWVkAQAUCGlkIBB3aGVuBDhtYXliZV9wZXJpb2RpY4EDIHByaW9yaXR5BBBjYWxslQwwY2FuY2VsX25hbWVkAQAECGlkIDhzY2hlZHVsZV9hZnRlcgEAEBRhZnRlcgQ4bWF5YmVfcGVyaW9kaWOBAyBwcmlvcml0eQQQY2FsbJUMUHNjaGVkdWxlX25hbWVkX2FmdGVyAQAUCGlkIBRhZnRlcgQ4bWF5YmVfcGVyaW9kaWOBAyBwcmlvcml0eQQQY2FsbJUMJHNldF9yZXRyeQEADBB0YXNrDQEccmV0cmllcwQYcGVyaW9kBDxzZXRfcmV0cnlfbmFtZWQBAAwIaWQgHHJldHJpZXMEGHBlcmlvZAQwY2FuY2VsX3JldHJ5AQAEEHRhc2sNAUhjYW5jZWxfcmV0cnlfbmFtZWQBAAQIaWQgBq0LAigUcHJveHkBAAwQcmVhbNUDQGZvcmNlX3Byb3h5X3R5cGUZDBBjYWxslQwkYWRkX3Byb3h5AQAMIGRlbGVnYXRl1QMocHJveHlfdHlwZa0LFGRlbGF5BDByZW1vdmVfcHJveHkBAAwgZGVsZWdhdGXVAyhwcm94eV90eXBlrQsUZGVsYXkEOHJlbW92ZV9wcm94aWVzAQEFLGNyZWF0ZV9wdXJlAQAMKHByb3h5X3R5cGWtCxRkZWxheQQUaW5kZXgEJGtpbGxfcHVyZQEAFBxzcGF3bmVy1QMocHJveHlfdHlwZa0LFGluZGV4BBhoZWlnaHQEJGV4dF9pbmRleAQgYW5ub3VuY2UBAAgQcmVhbNUDJGNhbGxfaGFzaCBMcmVtb3ZlX2Fubm91bmNlbWVudAEACBByZWFs1QMkY2FsbF9oYXNoIExyZWplY3RfYW5ub3VuY2VtZW50AQAIIGRlbGVnYXRl1QMkY2FsbF9oYXNoIDxwcm94eV9hbm5vdW5jZWQBABAgZGVsZWdhdGXVAxByZWFs1QNAZm9yY2VfcHJveHlfdHlwZRkMEGNhbGyVDAIQUGFzX211bHRpX3RocmVzaG9sZF8xAQAIRG90aGVyX3NpZ25hdG9yaWVz3QMQY2FsbJUMIGFzX211bHRpAQAUJHRocmVzaG9sZAREb3RoZXJfc2lnbmF0b3JpZXPdAzxtYXliZV90aW1lcG9pbnSNBBBjYWxslQwobWF4X3dlaWdodBhAYXBwcm92ZV9hc19tdWx0aQEAFCR0aHJlc2hvbGQERG90aGVyX3NpZ25hdG9yaWVz3QM8bWF5YmVfdGltZXBvaW50jQQkY2FsbF9oYXNoIChtYXhfd2VpZ2h0GDxjYW5jZWxfYXNfbXVsdGkBABAkdGhyZXNob2xkBERvdGhlcl9zaWduYXRvcmllc90DJHRpbWVwb2ludPEBJGNhbGxfaGFzaCAEnQQBQAMMBCUMBAQpDAAEnQQBRAMMBDEMBAQ1DAAEnQQBSAMMBD0MBARBDAAEnQQBTAMMBEkMBARNDAAEnQQBUAMMBFUMBARZDAAEnQQBVAMMBGEMBARlDAAEnQQBWAMMBG0MBARxDAAEnQQBXAMMBHkMBAR9DAAAYBh2b3RlczGhBBh2b3RlczKpBBh2b3RlczO1BBh2b3RlczTBBBh2b3RlczXNBBh2b3RlczbZBBh2b3RlczflBBh2b3RlczjxBBh2b3Rlczn9BBx2b3RlczEwCQUcdm90ZXMxMRUFHHZvdGVzMTIhBRx2b3RlczEzLQUcdm90ZXMxNDkFHHZvdGVzMTVFBRx2b3RlczE2UQUcdm90ZXMxNy0MHHZvdGVzMTg5DBx2b3RlczE5RQwcdm90ZXMyMFEMHHZvdGVzMjFdDBx2b3RlczIyaQwcdm90ZXMyM3UMHHZvdGVzMjSBDAAMIHNvbHV0aW9uhQwUc2NvcmUJAhRyb3VuZAQCFDxzdWJtaXRfdW5zaWduZWQBAAgwcmF3X3NvbHV0aW9uiQwcd2l0bmVzc10FbHNldF9taW5pbXVtX3VudHJ1c3RlZF9zY29yZQEABEBtYXliZV9uZXh0X3Njb3JlYQV0c2V0X2VtZXJnZW5jeV9lbGVjdGlvbl9yZXN1bHQBAAQgc3VwcG9ydHN1BRhzdWJtaXQBAAQwcmF3X3NvbHV0aW9uiQxMZ292ZXJuYW5jZV9mYWxsYmFjawEACEBtYXliZV9tYXhfdm90ZXJzLQREbWF5YmVfbWF4X3RhcmdldHMtBAIcJHBsYWNlX2JpZAEACBhhbW91bnQIIGR1cmF0aW9uBCxyZXRyYWN0X2JpZAEACBhhbW91bnQIIGR1cmF0aW9uBDBmdW5kX2RlZmljaXQBAQUwdGhhd19wcml2YXRlAQAIFGluZGV4BEBtYXliZV9wcm9wb3J0aW9u9QM0dGhhd19jb21tdW5hbAEABBRpbmRleAQkY29tbXVuaWZ5AQAEFGluZGV4BCRwcml2YXRpemUBAAQUaW5kZXgEAswYU3lzdGVtAQIsGHJlbWFyawEABBhyZW1hcmskOHNldF9oZWFwX3BhZ2VzAQAEFHBhZ2VzCCBzZXRfY29kZQEABBBjb2RlJFxzZXRfY29kZV93aXRob3V0X2NoZWNrcwEABBBjb2RlJCxzZXRfc3RvcmFnZQEABBRpdGVtc3kDMGtpbGxfc3RvcmFnZQEABBBrZXlzfQMsa2lsbF9wcmVmaXgBAAgYcHJlZml4JBxzdWJrZXlzBERyZW1hcmtfd2l0aF9ldmVudAEABBhyZW1hcmskRGF1dGhvcml6ZV91cGdyYWRlAQAEJGNvZGVfaGFzaCCAYXV0aG9yaXplX3VwZ3JhZGVfd2l0aG91dF9jaGVja3MBAAQkY29kZV9oYXNoIGBhcHBseV9hdXRob3JpemVkX3VwZ3JhZGUBAAQQY29kZSQQQmFiZQECDExyZXBvcnRfZXF1aXZvY2F0aW9uAQAISGVxdWl2b2NhdGlvbl9wcm9vZrkDPGtleV9vd25lcl9wcm9vZr0DcHJlcG9ydF9lcXVpdm9jYXRpb25fdW5zaWduZWQBAAhIZXF1aXZvY2F0aW9uX3Byb29muQM8a2V5X293bmVyX3Byb29mvQNIcGxhbl9jb25maWdfY2hhbmdlAQAEGGNvbmZpZ8kDJFRpbWVzdGFtcAECBAxzZXQBAAQMbm93CBxJbmRpY2VzAQIUFGNsYWltAQAEFGluZGV4BCB0cmFuc2ZlcgEACAxuZXfVAxRpbmRleAQQZnJlZQEABBRpbmRleAQ4Zm9yY2VfdHJhbnNmZXIBAAwMbmV31QMUaW5kZXgEGGZyZWV6ZRQYZnJlZXplAQAEFGluZGV4BCBCYWxhbmNlcwECJFB0cmFuc2Zlcl9hbGxvd19kZWF0aAEACBBkZXN01QMUdmFsdWUIOGZvcmNlX3RyYW5zZmVyAQAMGHNvdXJjZdUDEGRlc3TVAxR2YWx1ZQhMdHJhbnNmZXJfa2VlcF9hbGl2ZQEACBBkZXN01QMUdmFsdWUIMHRyYW5zZmVyX2FsbAEACBBkZXN01QMoa2VlcF9hbGl2ZRQ8Zm9yY2VfdW5yZXNlcnZlAQAIDHdob9UDGGFtb3VudAhAdXBncmFkZV9hY2NvdW50cwEABAx3aG/dA0Rmb3JjZV9zZXRfYmFsYW5jZQEACAx3aG/VAyBuZXdfZnJlZQhsZm9yY2VfYWRqdXN0X3RvdGFsX2lzc3VhbmNlAQAIJGRpcmVjdGlvbuEDFGRlbHRhCBBidXJuAQAIFHZhbHVlCChrZWVwX2FsaXZlFBxTdGFraW5nAQJ4EGJvbmQBAAgUdmFsdWUIFHBheWVlNQEoYm9uZF9leHRyYQEABDhtYXhfYWRkaXRpb25hbAgYdW5ib25kAQAEFHZhbHVlCER3aXRoZHJhd191bmJvbmRlZAEABEhudW1fc2xhc2hpbmdfc3BhbnMEIHZhbGlkYXRlAQAEFHByZWZzOQEgbm9taW5hdGUBAAQcdGFyZ2V0c+kDFGNoaWxsAQEFJHNldF9wYXllZQEABBRwYXllZTUBOHNldF9jb250cm9sbGVyAQEFTHNldF92YWxpZGF0b3JfY291bnQBAAQMbmV3BGBpbmNyZWFzZV92YWxpZGF0b3JfY291bnQBAAQoYWRkaXRpb25hbARUc2NhbGVfdmFsaWRhdG9yX2NvdW50AQAEGGZhY3RvcgQ0Zm9yY2Vfbm9fZXJhcwEBBTRmb3JjZV9uZXdfZXJhAQEFRHNldF9pbnZ1bG5lcmFibGVzAQAENGludnVsbmVyYWJsZXPdAzRmb3JjZV91bnN0YWtlAQAIFHN0YXNoAEhudW1fc2xhc2hpbmdfc3BhbnMEUGZvcmNlX25ld19lcmFfYWx3YXlzAQEFVGNhbmNlbF9kZWZlcnJlZF9zbGFzaAEACAxlcmEENHNsYXNoX2luZGljZXM5AjhwYXlvdXRfc3Rha2VycwEACDx2YWxpZGF0b3Jfc3Rhc2gADGVyYQQYcmVib25kAQAEFHZhbHVlCChyZWFwX3N0YXNoAQAIFHN0YXNoAEhudW1fc2xhc2hpbmdfc3BhbnMEEGtpY2sBAAQMd2hv6QNMc2V0X3N0YWtpbmdfY29uZmlncwEAHEhtaW5fbm9taW5hdG9yX2JvbmTtA0htaW5fdmFsaWRhdG9yX2JvbmTtA0xtYXhfbm9taW5hdG9yX2NvdW508QNMbWF4X3ZhbGlkYXRvcl9jb3VudPEDPGNoaWxsX3RocmVzaG9sZPEDOG1pbl9jb21taXNzaW9u8QNIbWF4X3N0YWtlZF9yZXdhcmRz8QMsY2hpbGxfb3RoZXIBAAQUc3Rhc2gAaGZvcmNlX2FwcGx5X21pbl9jb21taXNzaW9uAQAEPHZhbGlkYXRvcl9zdGFzaABIc2V0X21pbl9jb21taXNzaW9uAQAEDG5ldwRYcGF5b3V0X3N0YWtlcnNfYnlfcGFnZQEADDx2YWxpZGF0b3Jfc3Rhc2gADGVyYQQQcGFnZQQwdXBkYXRlX3BheWVlAQAEKGNvbnRyb2xsZXIAaGRlcHJlY2F0ZV9jb250cm9sbGVyX2JhdGNoAQAELGNvbnRyb2xsZXJz3QM4cmVzdG9yZV9sZWRnZXIBABAUc3Rhc2gAQG1heWJlX2NvbnRyb2xsZXIFAixtYXliZV90b3RhbPUDPG1heWJlX3VubG9ja2luZwEEHFNlc3Npb24BAgggc2V0X2tleXMBAAgQa2V5cw0EFHByb29mJChwdXJnZV9rZXlzAQEFHEdyYW5kcGEBAgxMcmVwb3J0X2VxdWl2b2NhdGlvbgEACEhlcXVpdm9jYXRpb25fcHJvb2YlBDxrZXlfb3duZXJfcHJvb2a9A3ByZXBvcnRfZXF1aXZvY2F0aW9uX3Vuc2lnbmVkAQAISGVxdWl2b2NhdGlvbl9wcm9vZiUEPGtleV9vd25lcl9wcm9vZr0DMG5vdGVfc3RhbGxlZAEACBRkZWxheQRsYmVzdF9maW5hbGl6ZWRfYmxvY2tfbnVtYmVyBCBUcmVhc3VyeQECGCxzcGVuZF9sb2NhbAEACBhhbW91bnQILGJlbmVmaWNpYXJ51QM8cmVtb3ZlX2FwcHJvdmFsAQAELHByb3Bvc2FsX2lkBBRzcGVuZAEAEChhc3NldF9raW5kgQEYYW1vdW50CCxiZW5lZmljaWFyeZkBKHZhbGlkX2Zyb20tBBhwYXlvdXQBAAQUaW5kZXgEMGNoZWNrX3N0YXR1cwEABBRpbmRleAQodm9pZF9zcGVuZAEABBRpbmRleARAQ29udmljdGlvblZvdGluZwECGBB2b3RlAQAIKHBvbGxfaW5kZXgEEHZvdGU1BCBkZWxlZ2F0ZQEAEBRjbGFzcwQIdG/VAyhjb252aWN0aW9uOQQcYmFsYW5jZQgodW5kZWxlZ2F0ZQEABBRjbGFzcwQYdW5sb2NrAQAIFGNsYXNzBBh0YXJnZXTVAyxyZW1vdmVfdm90ZQEACBRjbGFzcy0EFGluZGV4BERyZW1vdmVfb3RoZXJfdm90ZQEADBh0YXJnZXTVAxRjbGFzcwQUaW5kZXgEJFJlZmVyZW5kYQECJBhzdWJtaXQBAAw8cHJvcG9zYWxfb3JpZ2lu5QsgcHJvcG9zYWylAUBlbmFjdG1lbnRfbW9tZW50QQRYcGxhY2VfZGVjaXNpb25fZGVwb3NpdAEABBRpbmRleARccmVmdW5kX2RlY2lzaW9uX2RlcG9zaXQBAAQUaW5kZXgEGGNhbmNlbAEABBRpbmRleAQQa2lsbAEABBRpbmRleARAbnVkZ2VfcmVmZXJlbmR1bQEABBRpbmRleARIb25lX2Zld2VyX2RlY2lkaW5nAQAEFHRyYWNrBGRyZWZ1bmRfc3VibWlzc2lvbl9kZXBvc2l0AQAEFGluZGV4BDBzZXRfbWV0YWRhdGEBAAgUaW5kZXgEKG1heWJlX2hhc2gRAVBGZWxsb3dzaGlwQ29sbGVjdGl2ZQECHChhZGRfbWVtYmVyAQAEDHdob9UDOHByb21vdGVfbWVtYmVyAQAEDHdob9UDNGRlbW90ZV9tZW1iZXIBAAQMd2hv1QM0cmVtb3ZlX21lbWJlcgEACAx3aG/VAyBtaW5fcmFuawQQdm90ZQEACBBwb2xsBAxheWUUMGNsZWFudXBfcG9sbAEACChwb2xsX2luZGV4BAxtYXgEPGV4Y2hhbmdlX21lbWJlcgEACAx3aG/VAxxuZXdfd2hv1QNMRmVsbG93c2hpcFJlZmVyZW5kYQECJBhzdWJtaXQBAAw8cHJvcG9zYWxfb3JpZ2lu5QsgcHJvcG9zYWylAUBlbmFjdG1lbnRfbW9tZW50QQRYcGxhY2VfZGVjaXNpb25fZGVwb3NpdAEABBRpbmRleARccmVmdW5kX2RlY2lzaW9uX2RlcG9zaXQBAAQUaW5kZXgEGGNhbmNlbAEABBRpbmRleAQQa2lsbAEABBRpbmRleARAbnVkZ2VfcmVmZXJlbmR1bQEABBRpbmRleARIb25lX2Zld2VyX2RlY2lkaW5nAQAEFHRyYWNrBGRyZWZ1bmRfc3VibWlzc2lvbl9kZXBvc2l0AQAEFGluZGV4BDBzZXRfbWV0YWRhdGEBAAgUaW5kZXgEKG1heWJlX2hhc2gRASRXaGl0ZWxpc3QBAhA4d2hpdGVsaXN0X2NhbGwBAAQkY2FsbF9oYXNoIFxyZW1vdmVfd2hpdGVsaXN0ZWRfY2FsbAEABCRjYWxsX2hhc2ggZGRpc3BhdGNoX3doaXRlbGlzdGVkX2NhbGwBAAwkY2FsbF9oYXNoIEBjYWxsX2VuY29kZWRfbGVuBExjYWxsX3dlaWdodF93aXRuZXNzGJxkaXNwYXRjaF93aGl0ZWxpc3RlZF9jYWxsX3dpdGhfcHJlaW1hZ2UBAAQQY2FsbJUMKFBhcmFtZXRlcnMBAgQ0c2V0X3BhcmFtZXRlcgEABCRrZXlfdmFsdWVVBBhDbGFpbXMBAhQUY2xhaW0BAAgQZGVzdABIZXRoZXJldW1fc2lnbmF0dXJlXQQobWludF9jbGFpbQEAEAx3aG9lARR2YWx1ZQhAdmVzdGluZ19zY2hlZHVsZWUEJHN0YXRlbWVudG0EMGNsYWltX2F0dGVzdAEADBBkZXN0AEhldGhlcmV1bV9zaWduYXR1cmVdBCRzdGF0ZW1lbnQkGGF0dGVzdAEABCRzdGF0ZW1lbnQkKG1vdmVfY2xhaW0BAAwMb2xkZQEMbmV3ZQE4bWF5YmVfcHJlY2xhaW0FAhxVdGlsaXR5AQIYFGJhdGNoAQAEFGNhbGxzBQw0YXNfZGVyaXZhdGl2ZQEACBRpbmRleAQQY2FsbJUMJGJhdGNoX2FsbAEABBRjYWxscwUMLGRpc3BhdGNoX2FzAQAIJGFzX29yaWdpbuULEGNhbGyVDCxmb3JjZV9iYXRjaAEABBRjYWxscwUMLHdpdGhfd2VpZ2h0AQAIEGNhbGyVDBh3ZWlnaHQYHFNvY2lldHkBAlAMYmlkAQAEFHZhbHVlCBR1bmJpZAEBBRR2b3VjaAEADAx3aG/VAxR2YWx1ZQgMdGlwCBx1bnZvdWNoAQEFEHZvdGUBAAgkY2FuZGlkYXRl1QMcYXBwcm92ZRQ0ZGVmZW5kZXJfdm90ZQEABBxhcHByb3ZlFBhwYXlvdXQBAQUsd2FpdmVfcmVwYXkBAAQYYW1vdW50CDRmb3VuZF9zb2NpZXR5AQAYHGZvdW5kZXLVAyxtYXhfbWVtYmVycwQobWF4X2ludGFrZQQsbWF4X3N0cmlrZXMERGNhbmRpZGF0ZV9kZXBvc2l0CBRydWxlcyQgZGlzc29sdmUBAQVYanVkZ2Vfc3VzcGVuZGVkX21lbWJlcgEACAx3aG/VAxxmb3JnaXZlFDhzZXRfcGFyYW1ldGVycwEAECxtYXhfbWVtYmVycwQobWF4X2ludGFrZQQsbWF4X3N0cmlrZXMERGNhbmRpZGF0ZV9kZXBvc2l0CDhwdW5pc2hfc2tlcHRpYwEBBUBjbGFpbV9tZW1iZXJzaGlwAQEFRGJlc3Rvd19tZW1iZXJzaGlwAQAEJGNhbmRpZGF0ZQA4a2lja19jYW5kaWRhdGUBAAQkY2FuZGlkYXRlAEByZXNpZ25fY2FuZGlkYWN5AQEFOGRyb3BfY2FuZGlkYXRlAQAEJGNhbmRpZGF0ZQBEY2xlYW51cF9jYW5kaWRhY3kBAAgkY2FuZGlkYXRlAAxtYXgERGNsZWFudXBfY2hhbGxlbmdlAQAIPGNoYWxsZW5nZV9yb3VuZAQMbWF4BCBSZWNvdmVyeQECJDBhc19yZWNvdmVyZWQBAAgcYWNjb3VudNUDEGNhbGyVDDRzZXRfcmVjb3ZlcmVkAQAIEGxvc3TVAxxyZXNjdWVy1QM8Y3JlYXRlX3JlY292ZXJ5AQAMHGZyaWVuZHPdAyR0aHJlc2hvbGQEMGRlbGF5X3BlcmlvZAREaW5pdGlhdGVfcmVjb3ZlcnkBAAQcYWNjb3VudNUDOHZvdWNoX3JlY292ZXJ5AQAIEGxvc3TVAxxyZXNjdWVy1QM4Y2xhaW1fcmVjb3ZlcnkBAAQcYWNjb3VudNUDOGNsb3NlX3JlY292ZXJ5AQAEHHJlc2N1ZXLVAzxyZW1vdmVfcmVjb3ZlcnkBAQVAY2FuY2VsX3JlY292ZXJlZAEABBxhY2NvdW501QMcVmVzdGluZwECGBB2ZXN0AQEFKHZlc3Rfb3RoZXIBAAQYdGFyZ2V01QM8dmVzdGVkX3RyYW5zZmVyAQAIGHRhcmdldNUDIHNjaGVkdWxldQRUZm9yY2VfdmVzdGVkX3RyYW5zZmVyAQAMGHNvdXJjZdUDGHRhcmdldNUDIHNjaGVkdWxldQQ8bWVyZ2Vfc2NoZWR1bGVzAQAIPHNjaGVkdWxlMV9pbmRleAQ8c2NoZWR1bGUyX2luZGV4BHRmb3JjZV9yZW1vdmVfdmVzdGluZ19zY2hlZHVsZQEACBh0YXJnZXTVAzhzY2hlZHVsZV9pbmRleAQkU2NoZWR1bGVyAQIoIHNjaGVkdWxlAQAQEHdoZW4EOG1heWJlX3BlcmlvZGljgQMgcHJpb3JpdHkEEGNhbGyVDBhjYW5jZWwBAAgQd2hlbgQUaW5kZXgEOHNjaGVkdWxlX25hbWVkAQAUCGlkIBB3aGVuBDhtYXliZV9wZXJpb2RpY4EDIHByaW9yaXR5BBBjYWxslQwwY2FuY2VsX25hbWVkAQAECGlkIDhzY2hlZHVsZV9hZnRlcgEAEBRhZnRlcgQ4bWF5YmVfcGVyaW9kaWOBAyBwcmlvcml0eQQQY2FsbJUMUHNjaGVkdWxlX25hbWVkX2FmdGVyAQAUCGlkIBRhZnRlcgQ4bWF5YmVfcGVyaW9kaWOBAyBwcmlvcml0eQQQY2FsbJUMJHNldF9yZXRyeQEADBB0YXNrDQEccmV0cmllcwQYcGVyaW9kBDxzZXRfcmV0cnlfbmFtZWQBAAwIaWQgHHJldHJpZXMEGHBlcmlvZAQwY2FuY2VsX3JldHJ5AQAEEHRhc2sNAUhjYW5jZWxfcmV0cnlfbmFtZWQBAAQIaWQgFFByb3h5AQIoFHByb3h5AQAMEHJlYWzVA0Bmb3JjZV9wcm94eV90eXBlGQwQY2FsbJUMJGFkZF9wcm94eQEADCBkZWxlZ2F0ZdUDKHByb3h5X3R5cGWtCxRkZWxheQQwcmVtb3ZlX3Byb3h5AQAMIGRlbGVnYXRl1QMocHJveHlfdHlwZa0LFGRlbGF5BDhyZW1vdmVfcHJveGllcwEBBSxjcmVhdGVfcHVyZQEADChwcm94eV90eXBlrQsUZGVsYXkEFGluZGV4BCRraWxsX3B1cmUBABQcc3Bhd25lctUDKHByb3h5X3R5cGWtCxRpbmRleAQYaGVpZ2h0BCRleHRfaW5kZXgEIGFubm91bmNlAQAIEHJlYWzVAyRjYWxsX2hhc2ggTHJlbW92ZV9hbm5vdW5jZW1lbnQBAAgQcmVhbNUDJGNhbGxfaGFzaCBMcmVqZWN0X2Fubm91bmNlbWVudAEACCBkZWxlZ2F0ZdUDJGNhbGxfaGFzaCA8cHJveHlfYW5ub3VuY2VkAQAQIGRlbGVnYXRl1QMQcmVhbNUDQGZvcmNlX3Byb3h5X3R5cGUZDBBjYWxslQwgTXVsdGlzaWcBAhBQYXNfbXVsdGlfdGhyZXNob2xkXzEBAAhEb3RoZXJfc2lnbmF0b3JpZXPdAxBjYWxslQwgYXNfbXVsdGkBABQkdGhyZXNob2xkBERvdGhlcl9zaWduYXRvcmllc90DPG1heWJlX3RpbWVwb2ludI0EEGNhbGyVDChtYXhfd2VpZ2h0GEBhcHByb3ZlX2FzX211bHRpAQAUJHRocmVzaG9sZAREb3RoZXJfc2lnbmF0b3JpZXPdAzxtYXliZV90aW1lcG9pbnSNBCRjYWxsX2hhc2ggKG1heF93ZWlnaHQYPGNhbmNlbF9hc19tdWx0aQEAECR0aHJlc2hvbGQERG90aGVyX3NpZ25hdG9yaWVz3QMkdGltZXBvaW508QEkY2FsbF9oYXNoICBQcmVpbWFnZQECFDRub3RlX3ByZWltYWdlAQAEFGJ5dGVzJDx1bm5vdGVfcHJlaW1hZ2UBAAQQaGFzaCBAcmVxdWVzdF9wcmVpbWFnZQEABBBoYXNoIEh1bnJlcXVlc3RfcHJlaW1hZ2UBAAQQaGFzaCA4ZW5zdXJlX3VwZGF0ZWQBAAQYaGFzaGVzOQMgQm91bnRpZXMBAiQ4cHJvcG9zZV9ib3VudHkBAAgUdmFsdWUILGRlc2NyaXB0aW9uJDhhcHByb3ZlX2JvdW50eQEABCRib3VudHlfaWQEPHByb3Bvc2VfY3VyYXRvcgEADCRib3VudHlfaWQEHGN1cmF0b3LVAwxmZWUIQHVuYXNzaWduX2N1cmF0b3IBAAQkYm91bnR5X2lkBDhhY2NlcHRfY3VyYXRvcgEABCRib3VudHlfaWQEMGF3YXJkX2JvdW50eQEACCRib3VudHlfaWQELGJlbmVmaWNpYXJ51QMwY2xhaW1fYm91bnR5AQAEJGJvdW50eV9pZAQwY2xvc2VfYm91bnR5AQAEJGJvdW50eV9pZARQZXh0ZW5kX2JvdW50eV9leHBpcnkBAAgkYm91bnR5X2lkBBhyZW1hcmskNENoaWxkQm91bnRpZXMBAhxAYWRkX2NoaWxkX2JvdW50eQEADEBwYXJlbnRfYm91bnR5X2lkBBR2YWx1ZQgsZGVzY3JpcHRpb24kPHByb3Bvc2VfY3VyYXRvcgEAEEBwYXJlbnRfYm91bnR5X2lkBDxjaGlsZF9ib3VudHlfaWQEHGN1cmF0b3LVAwxmZWUIOGFjY2VwdF9jdXJhdG9yAQAIQHBhcmVudF9ib3VudHlfaWQEPGNoaWxkX2JvdW50eV9pZARAdW5hc3NpZ25fY3VyYXRvcgEACEBwYXJlbnRfYm91bnR5X2lkBDxjaGlsZF9ib3VudHlfaWQESGF3YXJkX2NoaWxkX2JvdW50eQEADEBwYXJlbnRfYm91bnR5X2lkBDxjaGlsZF9ib3VudHlfaWQELGJlbmVmaWNpYXJ51QNIY2xhaW1fY2hpbGRfYm91bnR5AQAIQHBhcmVudF9ib3VudHlfaWQEPGNoaWxkX2JvdW50eV9pZARIY2xvc2VfY2hpbGRfYm91bnR5AQAIQHBhcmVudF9ib3VudHlfaWQEPGNoaWxkX2JvdW50eV9pZARoRWxlY3Rpb25Qcm92aWRlck11bHRpUGhhc2UBAhQ8c3VibWl0X3Vuc2lnbmVkAQAIMHJhd19zb2x1dGlvbokMHHdpdG5lc3NdBWxzZXRfbWluaW11bV91bnRydXN0ZWRfc2NvcmUBAARAbWF5YmVfbmV4dF9zY29yZWEFdHNldF9lbWVyZ2VuY3lfZWxlY3Rpb25fcmVzdWx0AQAEIHN1cHBvcnRzdQUYc3VibWl0AQAEMHJhd19zb2x1dGlvbokMTGdvdmVybmFuY2VfZmFsbGJhY2sBAAhAbWF5YmVfbWF4X3ZvdGVycy0ERG1heWJlX21heF90YXJnZXRzLQQMTmlzAQIcJHBsYWNlX2JpZAEACBhhbW91bnQIIGR1cmF0aW9uBCxyZXRyYWN0X2JpZAEACBhhbW91bnQIIGR1cmF0aW9uBDBmdW5kX2RlZmljaXQBAQUwdGhhd19wcml2YXRlAQAIFGluZGV4BEBtYXliZV9wcm9wb3J0aW9u9QM0dGhhd19jb21tdW5hbAEABBRpbmRleAQkY29tbXVuaWZ5AQAEFGluZGV4BCRwcml2YXRpemUBAAQUaW5kZXgEWE5pc0NvdW50ZXJwYXJ0QmFsYW5jZXMBAiRQdHJhbnNmZXJfYWxsb3dfZGVhdGgBAAgQZGVzdNUDFHZhbHVlCDhmb3JjZV90cmFuc2ZlcgEADBhzb3VyY2XVAxBkZXN01QMUdmFsdWUITHRyYW5zZmVyX2tlZXBfYWxpdmUBAAgQZGVzdNUDFHZhbHVlCDB0cmFuc2Zlcl9hbGwBAAgQZGVzdNUDKGtlZXBfYWxpdmUUPGZvcmNlX3VucmVzZXJ2ZQEACAx3aG/VAxhhbW91bnQIQHVwZ3JhZGVfYWNjb3VudHMBAAQMd2hv3QNEZm9yY2Vfc2V0X2JhbGFuY2UBAAgMd2hv1QMgbmV3X2ZyZWUIbGZvcmNlX2FkanVzdF90b3RhbF9pc3N1YW5jZQEACCRkaXJlY3Rpb27hAxRkZWx0YQgQYnVybgEACBR2YWx1ZQgoa2VlcF9hbGl2ZRQkVm90ZXJMaXN0AQIMFHJlYmFnAQAEKGRpc2xvY2F0ZWTVAzxwdXRfaW5fZnJvbnRfb2YBAAQcbGlnaHRlctUDVHB1dF9pbl9mcm9udF9vZl9vdGhlcgEACBxoZWF2aWVy1QMcbGlnaHRlctUDPE5vbWluYXRpb25Qb29scwECaBBqb2luAQAIGGFtb3VudAgccG9vbF9pZAQoYm9uZF9leHRyYQEABBRleHRyYYEFMGNsYWltX3BheW91dAEBBRh1bmJvbmQBAAg4bWVtYmVyX2FjY291bnTVA0B1bmJvbmRpbmdfcG9pbnRzCFhwb29sX3dpdGhkcmF3X3VuYm9uZGVkAQAIHHBvb2xfaWQESG51bV9zbGFzaGluZ19zcGFucwREd2l0aGRyYXdfdW5ib25kZWQBAAg4bWVtYmVyX2FjY291bnTVA0hudW1fc2xhc2hpbmdfc3BhbnMEGGNyZWF0ZQEAEBhhbW91bnQIEHJvb3TVAyRub21pbmF0b3LVAxxib3VuY2Vy1QNMY3JlYXRlX3dpdGhfcG9vbF9pZAEAFBhhbW91bnQIEHJvb3TVAyRub21pbmF0b3LVAxxib3VuY2Vy1QMccG9vbF9pZAQgbm9taW5hdGUBAAgccG9vbF9pZAQodmFsaWRhdG9yc90DJHNldF9zdGF0ZQEACBxwb29sX2lkBBRzdGF0ZR0CMHNldF9tZXRhZGF0YQEACBxwb29sX2lkBCBtZXRhZGF0YSQsc2V0X2NvbmZpZ3MBABg0bWluX2pvaW5fYm9uZO0DPG1pbl9jcmVhdGVfYm9uZO0DJG1heF9wb29sc/EDLG1heF9tZW1iZXJz8QNQbWF4X21lbWJlcnNfcGVyX3Bvb2zxA1RnbG9iYWxfbWF4X2NvbW1pc3Npb27xAzB1cGRhdGVfcm9sZXMBABAccG9vbF9pZAQgbmV3X3Jvb3SFBTRuZXdfbm9taW5hdG9yhQUsbmV3X2JvdW5jZXKFBRRjaGlsbAEABBxwb29sX2lkBEBib25kX2V4dHJhX290aGVyAQAIGG1lbWJlctUDFGV4dHJhgQVQc2V0X2NsYWltX3Blcm1pc3Npb24BAAQocGVybWlzc2lvbokFSGNsYWltX3BheW91dF9vdGhlcgEABBRvdGhlcgA4c2V0X2NvbW1pc3Npb24BAAgccG9vbF9pZAQ4bmV3X2NvbW1pc3Npb24lAkhzZXRfY29tbWlzc2lvbl9tYXgBAAgccG9vbF9pZAQ4bWF4X2NvbW1pc3Npb24EaHNldF9jb21taXNzaW9uX2NoYW5nZV9yYXRlAQAIHHBvb2xfaWQELGNoYW5nZV9yYXRlKQJAY2xhaW1fY29tbWlzc2lvbgEABBxwb29sX2lkBExhZGp1c3RfcG9vbF9kZXBvc2l0AQAEHHBvb2xfaWQEfHNldF9jb21taXNzaW9uX2NsYWltX3Blcm1pc3Npb24BAAgccG9vbF9pZAQocGVybWlzc2lvbjECLGFwcGx5X3NsYXNoAQAEOG1lbWJlcl9hY2NvdW501QNIbWlncmF0ZV9kZWxlZ2F0aW9uAQAEOG1lbWJlcl9hY2NvdW501QN4bWlncmF0ZV9wb29sX3RvX2RlbGVnYXRlX3N0YWtlAQAEHHBvb2xfaWQELEZhc3RVbnN0YWtlAQIMVHJlZ2lzdGVyX2Zhc3RfdW5zdGFrZQEBBShkZXJlZ2lzdGVyAQEFHGNvbnRyb2wBAAQ0ZXJhc190b19jaGVjawQ0Q29uZmlndXJhdGlvbgECwHxzZXRfdmFsaWRhdGlvbl91cGdyYWRlX2Nvb2xkb3duAQAEDG5ldwRwc2V0X3ZhbGlkYXRpb25fdXBncmFkZV9kZWxheQEABAxuZXcEZHNldF9jb2RlX3JldGVudGlvbl9wZXJpb2QBAAQMbmV3BERzZXRfbWF4X2NvZGVfc2l6ZQEABAxuZXcEQHNldF9tYXhfcG92X3NpemUBAAQMbmV3BFhzZXRfbWF4X2hlYWRfZGF0YV9zaXplAQAEDG5ldwRIc2V0X2NvcmV0aW1lX2NvcmVzAQAEDG5ldwR0c2V0X21heF9hdmFpbGFiaWxpdHlfdGltZW91dHMBAAQMbmV3BHBzZXRfZ3JvdXBfcm90YXRpb25fZnJlcXVlbmN5AQAEDG5ldwR0c2V0X3BhcmFzX2F2YWlsYWJpbGl0eV9wZXJpb2QBAAQMbmV3BGBzZXRfc2NoZWR1bGluZ19sb29rYWhlYWQBAAQMbmV3BGxzZXRfbWF4X3ZhbGlkYXRvcnNfcGVyX2NvcmUBAAQMbmV3LQRIc2V0X21heF92YWxpZGF0b3JzAQAEDG5ldy0ESHNldF9kaXNwdXRlX3BlcmlvZAEABAxuZXcEtHNldF9kaXNwdXRlX3Bvc3RfY29uY2x1c2lvbl9hY2NlcHRhbmNlX3BlcmlvZAEABAxuZXcERHNldF9ub19zaG93X3Nsb3RzAQAEDG5ldwRQc2V0X25fZGVsYXlfdHJhbmNoZXMBAAQMbmV3BHhzZXRfemVyb3RoX2RlbGF5X3RyYW5jaGVfd2lkdGgBAAQMbmV3BFBzZXRfbmVlZGVkX2FwcHJvdmFscwEABAxuZXcEcHNldF9yZWxheV92cmZfbW9kdWxvX3NhbXBsZXMBAAQMbmV3BGhzZXRfbWF4X3Vwd2FyZF9xdWV1ZV9jb3VudAEABAxuZXcEZHNldF9tYXhfdXB3YXJkX3F1ZXVlX3NpemUBAAQMbmV3BHRzZXRfbWF4X2Rvd253YXJkX21lc3NhZ2Vfc2l6ZQEABAxuZXcEbHNldF9tYXhfdXB3YXJkX21lc3NhZ2Vfc2l6ZQEABAxuZXcEoHNldF9tYXhfdXB3YXJkX21lc3NhZ2VfbnVtX3Blcl9jYW5kaWRhdGUBAAQMbmV3BGRzZXRfaHJtcF9vcGVuX3JlcXVlc3RfdHRsAQAEDG5ldwRcc2V0X2hybXBfc2VuZGVyX2RlcG9zaXQBAAQMbmV3CGhzZXRfaHJtcF9yZWNpcGllbnRfZGVwb3NpdAEABAxuZXcIdHNldF9ocm1wX2NoYW5uZWxfbWF4X2NhcGFjaXR5AQAEDG5ldwR8c2V0X2hybXBfY2hhbm5lbF9tYXhfdG90YWxfc2l6ZQEABAxuZXcEnHNldF9ocm1wX21heF9wYXJhY2hhaW5faW5ib3VuZF9jaGFubmVscwEABAxuZXcEhHNldF9ocm1wX2NoYW5uZWxfbWF4X21lc3NhZ2Vfc2l6ZQEABAxuZXcEoHNldF9ocm1wX21heF9wYXJhY2hhaW5fb3V0Ym91bmRfY2hhbm5lbHMBAAQMbmV3BJhzZXRfaHJtcF9tYXhfbWVzc2FnZV9udW1fcGVyX2NhbmRpZGF0ZQEABAxuZXcESHNldF9wdmZfdm90aW5nX3R0bAEABAxuZXcEkHNldF9taW5pbXVtX3ZhbGlkYXRpb25fdXBncmFkZV9kZWxheQEABAxuZXcEcHNldF9ieXBhc3NfY29uc2lzdGVuY3lfY2hlY2sBAAQMbmV3FGBzZXRfYXN5bmNfYmFja2luZ19wYXJhbXMBAAQMbmV3lQVMc2V0X2V4ZWN1dG9yX3BhcmFtcwEABAxuZXelBVhzZXRfb25fZGVtYW5kX2Jhc2VfZmVlAQAEDG5ldwh0c2V0X29uX2RlbWFuZF9mZWVfdmFyaWFiaWxpdHkBAAQMbmV3BHBzZXRfb25fZGVtYW5kX3F1ZXVlX21heF9zaXplAQAEDG5ldwSYc2V0X29uX2RlbWFuZF90YXJnZXRfcXVldWVfdXRpbGl6YXRpb24BAAQMbmV3BERzZXRfb25fZGVtYW5kX3R0bAEABAxuZXcEZHNldF9taW5pbXVtX2JhY2tpbmdfdm90ZXMBAAQMbmV3BEBzZXRfbm9kZV9mZWF0dXJlAQAIFGluZGV4BBR2YWx1ZRRoc2V0X2FwcHJvdmFsX3ZvdGluZ19wYXJhbXMBAAQMbmV3BFBzZXRfc2NoZWR1bGVyX3BhcmFtcwEABAxuZXepBSxQYXJhc1NoYXJlZAEBBTRQYXJhSW5jbHVzaW9uAQEFMFBhcmFJbmhlcmVudAECBBRlbnRlcgEABBBkYXRh/QUUUGFyYXMBAiRYZm9yY2Vfc2V0X2N1cnJlbnRfY29kZQEACBBwYXJhBCBuZXdfY29kZSRYZm9yY2Vfc2V0X2N1cnJlbnRfaGVhZAEACBBwYXJhBCBuZXdfaGVhZCRsZm9yY2Vfc2NoZWR1bGVfY29kZV91cGdyYWRlAQAMEHBhcmEEIG5ld19jb2RlJExyZWxheV9wYXJlbnRfbnVtYmVyBExmb3JjZV9ub3RlX25ld19oZWFkAQAIEHBhcmEEIG5ld19oZWFkJEhmb3JjZV9xdWV1ZV9hY3Rpb24BAAQQcGFyYQRsYWRkX3RydXN0ZWRfdmFsaWRhdGlvbl9jb2RlAQAEPHZhbGlkYXRpb25fY29kZSRscG9rZV91bnVzZWRfdmFsaWRhdGlvbl9jb2RlAQAEUHZhbGlkYXRpb25fY29kZV9oYXNoIGxpbmNsdWRlX3B2Zl9jaGVja19zdGF0ZW1lbnQBAAgQc3RtdAUGJHNpZ25hdHVyZUECdGZvcmNlX3NldF9tb3N0X3JlY2VudF9jb250ZXh0AQAIEHBhcmEEHGNvbnRleHQELEluaXRpYWxpemVyAQIENGZvcmNlX2FwcHJvdmUBAAQUdXBfdG8EEEhybXABAixYaHJtcF9pbml0X29wZW5fY2hhbm5lbAEADCRyZWNpcGllbnQEVHByb3Bvc2VkX21heF9jYXBhY2l0eQRkcHJvcG9zZWRfbWF4X21lc3NhZ2Vfc2l6ZQRgaHJtcF9hY2NlcHRfb3Blbl9jaGFubmVsAQAEGHNlbmRlcgRIaHJtcF9jbG9zZV9jaGFubmVsAQAEKGNoYW5uZWxfaWRVAkBmb3JjZV9jbGVhbl9ocm1wAQAMEHBhcmEELG51bV9pbmJvdW5kBDBudW1fb3V0Ym91bmQEXGZvcmNlX3Byb2Nlc3NfaHJtcF9vcGVuAQAEIGNoYW5uZWxzBGBmb3JjZV9wcm9jZXNzX2hybXBfY2xvc2UBAAQgY2hhbm5lbHMEYGhybXBfY2FuY2VsX29wZW5fcmVxdWVzdAEACChjaGFubmVsX2lkVQI0b3Blbl9yZXF1ZXN0cwRcZm9yY2Vfb3Blbl9ocm1wX2NoYW5uZWwBABAYc2VuZGVyBCRyZWNpcGllbnQEMG1heF9jYXBhY2l0eQRAbWF4X21lc3NhZ2Vfc2l6ZQRgZXN0YWJsaXNoX3N5c3RlbV9jaGFubmVsAQAIGHNlbmRlcgQkcmVjaXBpZW50BFRwb2tlX2NoYW5uZWxfZGVwb3NpdHMBAAgYc2VuZGVyBCRyZWNpcGllbnQEdGVzdGFibGlzaF9jaGFubmVsX3dpdGhfc3lzdGVtAQAETHRhcmdldF9zeXN0ZW1fY2hhaW4ENFBhcmFzRGlzcHV0ZXMBAgQ4Zm9yY2VfdW5mcmVlemUBAQU0UGFyYXNTbGFzaGluZwECBHByZXBvcnRfZGlzcHV0ZV9sb3N0X3Vuc2lnbmVkAQAINGRpc3B1dGVfcHJvb2YhBjxrZXlfb3duZXJfcHJvb2a9A2hPbkRlbWFuZEFzc2lnbm1lbnRQcm92aWRlcgECCFxwbGFjZV9vcmRlcl9hbGxvd19kZWF0aAEACChtYXhfYW1vdW50CBxwYXJhX2lkBFhwbGFjZV9vcmRlcl9rZWVwX2FsaXZlAQAIKG1heF9hbW91bnQIHHBhcmFfaWQEJFJlZ2lzdHJhcgECJCByZWdpc3RlcgEADAhpZAQwZ2VuZXNpc19oZWFkJDx2YWxpZGF0aW9uX2NvZGUkOGZvcmNlX3JlZ2lzdGVyAQAUDHdobwAcZGVwb3NpdAgIaWQEMGdlbmVzaXNfaGVhZCQ8dmFsaWRhdGlvbl9jb2RlJChkZXJlZ2lzdGVyAQAECGlkBBBzd2FwAQAICGlkBBRvdGhlcgQscmVtb3ZlX2xvY2sBAAQQcGFyYQQccmVzZXJ2ZQEBBSBhZGRfbG9jawEABBBwYXJhBFRzY2hlZHVsZV9jb2RlX3VwZ3JhZGUBAAgQcGFyYQQgbmV3X2NvZGUkQHNldF9jdXJyZW50X2hlYWQBAAgQcGFyYQQgbmV3X2hlYWQkFFNsb3RzAQIMLGZvcmNlX2xlYXNlAQAUEHBhcmEEGGxlYXNlcgAYYW1vdW50CDBwZXJpb2RfYmVnaW4EMHBlcmlvZF9jb3VudARAY2xlYXJfYWxsX2xlYXNlcwEABBBwYXJhBDx0cmlnZ2VyX29uYm9hcmQBAAQQcGFyYQQgQXVjdGlvbnMBAgwsbmV3X2F1Y3Rpb24BAAggZHVyYXRpb24ESGxlYXNlX3BlcmlvZF9pbmRleAQMYmlkAQAUEHBhcmEENGF1Y3Rpb25faW5kZXgEKGZpcnN0X3Nsb3QEJGxhc3Rfc2xvdAQYYW1vdW50CDhjYW5jZWxfYXVjdGlvbgEBBSRDcm93ZGxvYW4BAiQYY3JlYXRlAQAYFGluZGV4BAxjYXAIMGZpcnN0X3BlcmlvZAQsbGFzdF9wZXJpb2QEDGVuZAQgdmVyaWZpZXI9Bihjb250cmlidXRlAQAMFGluZGV4BBR2YWx1ZQgkc2lnbmF0dXJlRQYgd2l0aGRyYXcBAAgMd2hvABRpbmRleAQYcmVmdW5kAQAEFGluZGV4BCBkaXNzb2x2ZQEABBRpbmRleAQQZWRpdAEAGBRpbmRleAQMY2FwCDBmaXJzdF9wZXJpb2QELGxhc3RfcGVyaW9kBAxlbmQEIHZlcmlmaWVyPQYgYWRkX21lbW8BAAgUaW5kZXgEEG1lbW8kEHBva2UBAAQUaW5kZXgEOGNvbnRyaWJ1dGVfYWxsAQAIFGluZGV4BCRzaWduYXR1cmVFBiBDb3JldGltZQECDEhyZXF1ZXN0X2NvcmVfY291bnQBAAQUY291bnQESHJlcXVlc3RfcmV2ZW51ZV9hdAEABBB3aGVuBCxhc3NpZ25fY29yZQEAEBBjb3JlBBRiZWdpbgQoYXNzaWdubWVudFUGIGVuZF9oaW50LQQkWGNtUGFsbGV0AQI4EHNlbmQBAAgQZGVzdJkBHG1lc3NhZ2WpBjx0ZWxlcG9ydF9hc3NldHMBABAQZGVzdJkBLGJlbmVmaWNpYXJ5mQEYYXNzZXRzGQM4ZmVlX2Fzc2V0X2l0ZW0EXHJlc2VydmVfdHJhbnNmZXJfYXNzZXRzAQAQEGRlc3SZASxiZW5lZmljaWFyeZkBGGFzc2V0cxkDOGZlZV9hc3NldF9pdGVtBBxleGVjdXRlAQAIHG1lc3NhZ2WpBihtYXhfd2VpZ2h0GERmb3JjZV94Y21fdmVyc2lvbgEACCBsb2NhdGlvbnkBHHZlcnNpb24EZGZvcmNlX2RlZmF1bHRfeGNtX3ZlcnNpb24BAAREbWF5YmVfeGNtX3ZlcnNpb24tBHhmb3JjZV9zdWJzY3JpYmVfdmVyc2lvbl9ub3RpZnkBAAQgbG9jYXRpb26ZAYBmb3JjZV91bnN1YnNjcmliZV92ZXJzaW9uX25vdGlmeQEABCBsb2NhdGlvbpkBfGxpbWl0ZWRfcmVzZXJ2ZV90cmFuc2Zlcl9hc3NldHMBABQQZGVzdJkBLGJlbmVmaWNpYXJ5mQEYYXNzZXRzGQM4ZmVlX2Fzc2V0X2l0ZW0EMHdlaWdodF9saW1pdPECXGxpbWl0ZWRfdGVsZXBvcnRfYXNzZXRzAQAUEGRlc3SZASxiZW5lZmljaWFyeZkBGGFzc2V0cxkDOGZlZV9hc3NldF9pdGVtBDB3ZWlnaHRfbGltaXTxAkBmb3JjZV9zdXNwZW5zaW9uAQAEJHN1c3BlbmRlZBQ8dHJhbnNmZXJfYXNzZXRzAQAUEGRlc3SZASxiZW5lZmljaWFyeZkBGGFzc2V0cxkDOGZlZV9hc3NldF9pdGVtBDB3ZWlnaHRfbGltaXTxAjBjbGFpbV9hc3NldHMBAAgYYXNzZXRzGQMsYmVuZWZpY2lhcnmZAYx0cmFuc2Zlcl9hc3NldHNfdXNpbmdfdHlwZV9hbmRfdGhlbgEAHBBkZXN0mQEYYXNzZXRzGQNQYXNzZXRzX3RyYW5zZmVyX3R5cGWtBjhyZW1vdGVfZmVlc19pZLEGSGZlZXNfdHJhbnNmZXJfdHlwZa0GSGN1c3RvbV94Y21fb25fZGVzdKkGMHdlaWdodF9saW1pdPECME1lc3NhZ2VRdWV1ZQECCCRyZWFwX3BhZ2UBAAg4bWVzc2FnZV9vcmlnaW4lAyhwYWdlX2luZGV4BEhleGVjdXRlX292ZXJ3ZWlnaHQBABA4bWVzc2FnZV9vcmlnaW4lAxBwYWdlBBRpbmRleAQwd2VpZ2h0X2xpbWl0GCRBc3NldFJhdGUBAgwYY3JlYXRlAQAIKGFzc2V0X2tpbmSBARByYXRlCBh1cGRhdGUBAAgoYXNzZXRfa2luZIEBEHJhdGUIGHJlbW92ZQEABChhc3NldF9raW5kgQEUQmVlZnkBAgxMcmVwb3J0X2VxdWl2b2NhdGlvbgEACEhlcXVpdm9jYXRpb25fcHJvb2bVBjxrZXlfb3duZXJfcHJvb2a9A3ByZXBvcnRfZXF1aXZvY2F0aW9uX3Vuc2lnbmVkAQAISGVxdWl2b2NhdGlvbl9wcm9vZtUGPGtleV9vd25lcl9wcm9vZr0DPHNldF9uZXdfZ2VuZXNpcwEABDxkZWxheV9pbl9ibG9ja3MEAgggVm91Y2hpbmcBAQUYQmFubmVkAQEFBpkMABAQcmFuawQcc3RyaWtlcwQgdm91Y2hpbmedDBRpbmRleAQACBBwYWlkCBxwYXlvdXRz2QcCCBxEZXBvc2l0AQEDFFZvdWNoAQMIAAgADAx3aG8AEGtpbmSpDBR2YWx1ZQgErQwAAAgkYXBwcm92YWxzBChyZWplY3Rpb25zBAAUFHJvdW5kBBBraW5kqQwMYmlkCBR0YWxsebUMOHNrZXB0aWNfc3RydWNrFAQAAQgACBxhcHByb3ZlFBh3ZWlnaHQEAAwMd2hvAAxiaWQIFHJvdW5kBAMMAAC1DAAQMGRlbGF5X3BlcmlvZAQcZGVwb3NpdAgcZnJpZW5kc90DJHRocmVzaG9sZAQADBxjcmVhdGVkBBxkZXBvc2l0CBxmcmllbmRz3QMAFCBtYXliZV9pZBEBIHByaW9yaXR5BBBjYWxspQE4bWF5YmVfcGVyaW9kaWOBAxhvcmlnaW7lCwbVDATZDAAADCBkZWxlZ2F0ZQAocHJveHlfdHlwZa0LFGRlbGF5BAThDAADCOUMCAAQDHdobwAcZGVwb3NpdAgwcmF3X3NvbHV0aW9uiQwgY2FsbF9mZWUIBN0HAAAUPHByb3BvcnRpb25fb3dlZAgUaW5kZXgEGHRoYXdlZAgsbGFzdF9wZXJpb2QEQHJlY2VpcHRzX29uX2hvbGQIAAwocHJvcG9ydGlvbggUb3duZXLhBhhleHBpcnkEAAQYYW1vdW50CAT9DAAHlQsVCgTFCwAAEEBleGVjdXRpb25fcmVzdWx0jQs4ZW1pdHRlZF9ldmVudHMJDSRsb2NhbF94Y20lCzhmb3J3YXJkZWRfeGNtczELBw0NOQsADEBleGVjdXRpb25fcmVzdWx0jQI4ZW1pdHRlZF9ldmVudHMJDThmb3J3YXJkZWRfeGNtczELBxUNOQsCJDxQYXJhRG9lc250RXhpc3QBAQVEUGFyYUFscmVhZHlFeGlzdHMBAQVURXhjZWVkc01heE1lc3NhZ2VTaXplAQEFOENvdWxkbnRDbGVhbnVwAQEFNE5vdFBhcmF0aHJlYWQBAQUwTm90UGFyYWNoYWluAQEFNENhbm5vdFVwZ3JhZGUBAQU8Q2Fubm90RG93bmdyYWRlAQEFMFRvb01hbnlDb3JlcwEBBQIELFJlcXVpcmVTdWRvAQEFAvQYU3lzdGVtAQIkPEludmFsaWRTcGVjTmFtZQEBBWhTcGVjVmVyc2lvbk5lZWRzVG9JbmNyZWFzZQEBBXRGYWlsZWRUb0V4dHJhY3RSdW50aW1lVmVyc2lvbgEBBUxOb25EZWZhdWx0Q29tcG9zaXRlAQEFPE5vblplcm9SZWZDb3VudAEBBTBDYWxsRmlsdGVyZWQBAQVsTXVsdGlCbG9ja01pZ3JhdGlvbnNPbmdvaW5nAQEFRE5vdGhpbmdBdXRob3JpemVkAQEFMFVuYXV0aG9yaXplZAEBBSRTY2hlZHVsZXIBAhRARmFpbGVkVG9TY2hlZHVsZQEBBSBOb3RGb3VuZAEBBVxUYXJnZXRCbG9ja051bWJlckluUGFzdAEBBUhSZXNjaGVkdWxlTm9DaGFuZ2UBAQUUTmFtZWQBAQUgUHJlaW1hZ2UBAiQYVG9vQmlnAQEFMEFscmVhZHlOb3RlZAEBBTROb3RBdXRob3JpemVkAQEFIE5vdE5vdGVkAQEFJFJlcXVlc3RlZAEBBTBOb3RSZXF1ZXN0ZWQBAQUcVG9vTWFueQEBBRhUb29GZXcBAQUYTm9Db3N0AQEFEEJhYmUBAhBgSW52YWxpZEVxdWl2b2NhdGlvblByb29mAQEFYEludmFsaWRLZXlPd25lcnNoaXBQcm9vZgEBBVhEdXBsaWNhdGVPZmZlbmNlUmVwb3J0AQEFUEludmFsaWRDb25maWd1cmF0aW9uAQEFJFRpbWVzdGFtcAEBBRxJbmRpY2VzAQIULE5vdEFzc2lnbmVkAQEFIE5vdE93bmVyAQEFFEluVXNlAQEFLE5vdFRyYW5zZmVyAQEFJFBlcm1hbmVudAEBBSBCYWxhbmNlcwECMDhWZXN0aW5nQmFsYW5jZQEBBVRMaXF1aWRpdHlSZXN0cmljdGlvbnMBAQVMSW5zdWZmaWNpZW50QmFsYW5jZQEBBUhFeGlzdGVudGlhbERlcG9zaXQBAQU0RXhwZW5kYWJpbGl0eQEBBVxFeGlzdGluZ1Zlc3RpbmdTY2hlZHVsZQEBBSxEZWFkQWNjb3VudAEBBTxUb29NYW55UmVzZXJ2ZXMBAQUwVG9vTWFueUhvbGRzAQEFOFRvb01hbnlGcmVlemVzAQEFTElzc3VhbmNlRGVhY3RpdmF0ZWQBAQUkRGVsdGFaZXJvAQEFSFRyYW5zYWN0aW9uUGF5bWVudAEBBShBdXRob3JzaGlwAQEFHFN0YWtpbmcBAnw0Tm90Q29udHJvbGxlcgEBBSBOb3RTdGFzaAEBBTRBbHJlYWR5Qm9uZGVkAQEFNEFscmVhZHlQYWlyZWQBAQUwRW1wdHlUYXJnZXRzAQEFOER1cGxpY2F0ZUluZGV4AQEFREludmFsaWRTbGFzaEluZGV4AQEFQEluc3VmZmljaWVudEJvbmQBAQUwTm9Nb3JlQ2h1bmtzAQEFNE5vVW5sb2NrQ2h1bmsBAQUwRnVuZGVkVGFyZ2V0AQEFSEludmFsaWRFcmFUb1Jld2FyZAEBBWhJbnZhbGlkTnVtYmVyT2ZOb21pbmF0aW9ucwEBBUhOb3RTb3J0ZWRBbmRVbmlxdWUBAQU4QWxyZWFkeUNsYWltZWQBAQUsSW52YWxpZFBhZ2UBAQVUSW5jb3JyZWN0SGlzdG9yeURlcHRoAQEFWEluY29ycmVjdFNsYXNoaW5nU3BhbnMBAQUgQmFkU3RhdGUBAQU4VG9vTWFueVRhcmdldHMBAQUkQmFkVGFyZ2V0AQEFQENhbm5vdENoaWxsT3RoZXIBAQVEVG9vTWFueU5vbWluYXRvcnMBAQVEVG9vTWFueVZhbGlkYXRvcnMBAQVAQ29tbWlzc2lvblRvb0xvdwEBBSxCb3VuZE5vdE1ldAEBBVBDb250cm9sbGVyRGVwcmVjYXRlZAEBBUxDYW5ub3RSZXN0b3JlTGVkZ2VyAQEFbFJld2FyZERlc3RpbmF0aW9uUmVzdHJpY3RlZAEBBThOb3RFbm91Z2hGdW5kcwEBBVxWaXJ0dWFsU3Rha2VyTm90QWxsb3dlZAEBBSBPZmZlbmNlcwEBBShIaXN0b3JpY2FsAQEFHFNlc3Npb24BAhQwSW52YWxpZFByb29mAQEFXE5vQXNzb2NpYXRlZFZhbGlkYXRvcklkAQEFNER1cGxpY2F0ZWRLZXkBAQUYTm9LZXlzAQEFJE5vQWNjb3VudAEBBRxHcmFuZHBhAQIcLFBhdXNlRmFpbGVkAQEFMFJlc3VtZUZhaWxlZAEBBTRDaGFuZ2VQZW5kaW5nAQEFHFRvb1Nvb24BAQVgSW52YWxpZEtleU93bmVyc2hpcFByb29mAQEFYEludmFsaWRFcXVpdm9jYXRpb25Qcm9vZgEBBVhEdXBsaWNhdGVPZmZlbmNlUmVwb3J0AQEFSEF1dGhvcml0eURpc2NvdmVyeQEBBSBUcmVhc3VyeQECLDBJbnZhbGlkSW5kZXgBAQVAVG9vTWFueUFwcHJvdmFscwEBBVhJbnN1ZmZpY2llbnRQZXJtaXNzaW9uAQEFTFByb3Bvc2FsTm90QXBwcm92ZWQBAQVYRmFpbGVkVG9Db252ZXJ0QmFsYW5jZQEBBTBTcGVuZEV4cGlyZWQBAQUsRWFybHlQYXlvdXQBAQVAQWxyZWFkeUF0dGVtcHRlZAEBBSxQYXlvdXRFcnJvcgEBBTBOb3RBdHRlbXB0ZWQBAQUwSW5jb25jbHVzaXZlAQEFQENvbnZpY3Rpb25Wb3RpbmcBAjAoTm90T25nb2luZwEBBSBOb3RWb3RlcgEBBTBOb1Blcm1pc3Npb24BAQU8Tm9QZXJtaXNzaW9uWWV0AQEFREFscmVhZHlEZWxlZ2F0aW5nAQEFNEFscmVhZHlWb3RpbmcBAQVESW5zdWZmaWNpZW50RnVuZHMBAQU0Tm90RGVsZWdhdGluZwEBBSBOb25zZW5zZQEBBTxNYXhWb3Rlc1JlYWNoZWQBAQUsQ2xhc3NOZWVkZWQBAQUgQmFkQ2xhc3MBAQUkUmVmZXJlbmRhAQI4KE5vdE9uZ29pbmcBAQUoSGFzRGVwb3NpdAEBBSBCYWRUcmFjawEBBRBGdWxsAQEFKFF1ZXVlRW1wdHkBAQU0QmFkUmVmZXJlbmR1bQEBBSxOb3RoaW5nVG9EbwEBBRxOb1RyYWNrAQEFKFVuZmluaXNoZWQBAQUwTm9QZXJtaXNzaW9uAQEFJE5vRGVwb3NpdAEBBSRCYWRTdGF0dXMBAQVAUHJlaW1hZ2VOb3RFeGlzdAEBBYRQcmVpbWFnZVN0b3JlZFdpdGhEaWZmZXJlbnRMZW5ndGgBAQUcT3JpZ2lucwEBBSRXaGl0ZWxpc3QBAhRMVW5hdmFpbGFibGVQcmVJbWFnZQEBBTxVbmRlY29kYWJsZUNhbGwBAQVgSW52YWxpZENhbGxXZWlnaHRXaXRuZXNzAQEFUENhbGxJc05vdFdoaXRlbGlzdGVkAQEFWENhbGxBbHJlYWR5V2hpdGVsaXN0ZWQBAQUoUGFyYW1ldGVycwEBBRhDbGFpbXMBAhhgSW52YWxpZEV0aGVyZXVtU2lnbmF0dXJlAQEFQFNpZ25lckhhc05vQ2xhaW0BAQVAU2VuZGVySGFzTm9DbGFpbQEBBTBQb3RVbmRlcmZsb3cBAQVASW52YWxpZFN0YXRlbWVudAEBBUxWZXN0ZWRCYWxhbmNlRXhpc3RzAQEFHFZlc3RpbmcBAhQoTm90VmVzdGluZwEBBVRBdE1heFZlc3RpbmdTY2hlZHVsZXMBAQUkQW1vdW50TG93AQEFYFNjaGVkdWxlSW5kZXhPdXRPZkJvdW5kcwEBBVRJbnZhbGlkU2NoZWR1bGVQYXJhbXMBAQUcVXRpbGl0eQECBDBUb29NYW55Q2FsbHMBAQUUUHJveHkBAiAcVG9vTWFueQEBBSBOb3RGb3VuZAEBBSBOb3RQcm94eQEBBSxVbnByb3h5YWJsZQEBBSREdXBsaWNhdGUBAQUwTm9QZXJtaXNzaW9uAQEFLFVuYW5ub3VuY2VkAQEFLE5vU2VsZlByb3h5AQEFIE11bHRpc2lnAQI4QE1pbmltdW1UaHJlc2hvbGQBAQU8QWxyZWFkeUFwcHJvdmVkAQEFRE5vQXBwcm92YWxzTmVlZGVkAQEFRFRvb0Zld1NpZ25hdG9yaWVzAQEFSFRvb01hbnlTaWduYXRvcmllcwEBBVRTaWduYXRvcmllc091dE9mT3JkZXIBAQVMU2VuZGVySW5TaWduYXRvcmllcwEBBSBOb3RGb3VuZAEBBSBOb3RPd25lcgEBBSxOb1RpbWVwb2ludAEBBThXcm9uZ1RpbWVwb2ludAEBBUxVbmV4cGVjdGVkVGltZXBvaW50AQEFPE1heFdlaWdodFRvb0xvdwEBBTRBbHJlYWR5U3RvcmVkAQEFIEJvdW50aWVzAQIscEluc3VmZmljaWVudFByb3Bvc2Vyc0JhbGFuY2UBAQUwSW52YWxpZEluZGV4AQEFMFJlYXNvblRvb0JpZwEBBUBVbmV4cGVjdGVkU3RhdHVzAQEFOFJlcXVpcmVDdXJhdG9yAQEFMEludmFsaWRWYWx1ZQEBBShJbnZhbGlkRmVlAQEFNFBlbmRpbmdQYXlvdXQBAQUkUHJlbWF0dXJlAQEFUEhhc0FjdGl2ZUNoaWxkQm91bnR5AQEFNFRvb01hbnlRdWV1ZWQBAQU0Q2hpbGRCb3VudGllcwECDFRQYXJlbnRCb3VudHlOb3RBY3RpdmUBAQVkSW5zdWZmaWNpZW50Qm91bnR5QmFsYW5jZQEBBVBUb29NYW55Q2hpbGRCb3VudGllcwEBBWhFbGVjdGlvblByb3ZpZGVyTXVsdGlQaGFzZQECPGhQcmVEaXNwYXRjaEVhcmx5U3VibWlzc2lvbgEBBWxQcmVEaXNwYXRjaFdyb25nV2lubmVyQ291bnQBAQVkUHJlRGlzcGF0Y2hXZWFrU3VibWlzc2lvbgEBBTxTaWduZWRRdWV1ZUZ1bGwBAQVYU2lnbmVkQ2Fubm90UGF5RGVwb3NpdAEBBVBTaWduZWRJbnZhbGlkV2l0bmVzcwEBBUxTaWduZWRUb29NdWNoV2VpZ2h0AQEFPE9jd0NhbGxXcm9uZ0VyYQEBBVxNaXNzaW5nU25hcHNob3RNZXRhZGF0YQEBBVhJbnZhbGlkU3VibWlzc2lvbkluZGV4AQEFOENhbGxOb3RBbGxvd2VkAQEFOEZhbGxiYWNrRmFpbGVkAQEFLEJvdW5kTm90TWV0AQEFOFRvb01hbnlXaW5uZXJzAQEFZFByZURpc3BhdGNoRGlmZmVyZW50Um91bmQBAQUkVm90ZXJMaXN0AQIEEExpc3QBAhAkRHVwbGljYXRlAQEFKE5vdEhlYXZpZXIBAQUwTm90SW5TYW1lQmFnAQEFME5vZGVOb3RGb3VuZAEBBTxOb21pbmF0aW9uUG9vbHMBApAwUG9vbE5vdEZvdW5kAQEFSFBvb2xNZW1iZXJOb3RGb3VuZAEBBUhSZXdhcmRQb29sTm90Rm91bmQBAQVAU3ViUG9vbHNOb3RGb3VuZAEBBWRBY2NvdW50QmVsb25nc1RvT3RoZXJQb29sAQEFOEZ1bGx5VW5ib25kaW5nAQEFRE1heFVuYm9uZGluZ0xpbWl0AQEFRENhbm5vdFdpdGhkcmF3QW55AQEFRE1pbmltdW1Cb25kTm90TWV0AQEFME92ZXJmbG93UmlzawEBBTROb3REZXN0cm95aW5nAQEFME5vdE5vbWluYXRvcgEBBVROb3RLaWNrZXJPckRlc3Ryb3lpbmcBAQUcTm90T3BlbgEBBSBNYXhQb29scwEBBThNYXhQb29sTWVtYmVycwEBBURDYW5Ob3RDaGFuZ2VTdGF0ZQEBBVREb2VzTm90SGF2ZVBlcm1pc3Npb24BAQVUTWV0YWRhdGFFeGNlZWRzTWF4TGVuAQEFJERlZmVuc2l2ZQECHGhOb3RFbm91Z2hTcGFjZUluVW5ib25kUG9vbAEBBTBQb29sTm90Rm91bmQBAQVIUmV3YXJkUG9vbE5vdEZvdW5kAQEFQFN1YlBvb2xzTm90Rm91bmQBAQVwQm9uZGVkU3Rhc2hLaWxsZWRQcmVtYXR1cmVseQEBBVREZWxlZ2F0aW9uVW5zdXBwb3J0ZWQBAQU8U2xhc2hOb3RBcHBsaWVkAQEFnFBhcnRpYWxVbmJvbmROb3RBbGxvd2VkUGVybWlzc2lvbmxlc3NseQEBBVxNYXhDb21taXNzaW9uUmVzdHJpY3RlZAEBBWBDb21taXNzaW9uRXhjZWVkc01heGltdW0BAQV4Q29tbWlzc2lvbkV4Y2VlZHNHbG9iYWxNYXhpbXVtAQEFZENvbW1pc3Npb25DaGFuZ2VUaHJvdHRsZWQBAQV4Q29tbWlzc2lvbkNoYW5nZVJhdGVOb3RBbGxvd2VkAQEFTE5vUGVuZGluZ0NvbW1pc3Npb24BAQVYTm9Db21taXNzaW9uQ3VycmVudFNldAEBBSxQb29sSWRJblVzZQEBBTRJbnZhbGlkUG9vbElkAQEFTEJvbmRFeHRyYVJlc3RyaWN0ZWQBAQU8Tm90aGluZ1RvQWRqdXN0AQEFOE5vdGhpbmdUb1NsYXNoAQEFPEFscmVhZHlNaWdyYXRlZAEBBSxOb3RNaWdyYXRlZAEBBTBOb3RTdXBwb3J0ZWQBAQUsRmFzdFVuc3Rha2UBAhg0Tm90Q29udHJvbGxlcgEBBTRBbHJlYWR5UXVldWVkAQEFOE5vdEZ1bGx5Qm9uZGVkAQEFJE5vdFF1ZXVlZAEBBSxBbHJlYWR5SGVhZAEBBThDYWxsTm90QWxsb3dlZAEBBUBQYXJhY2hhaW5zT3JpZ2luAQEFNENvbmZpZ3VyYXRpb24BAgQ8SW52YWxpZE5ld1ZhbHVlAQEFLFBhcmFzU2hhcmVkAQEFNFBhcmFJbmNsdXNpb24BAkhkVmFsaWRhdG9ySW5kZXhPdXRPZkJvdW5kcwEBBVBVbnNjaGVkdWxlZENhbmRpZGF0ZQEBBUBIZWFkRGF0YVRvb0xhcmdlAQEFUFByZW1hdHVyZUNvZGVVcGdyYWRlAQEFPE5ld0NvZGVUb29MYXJnZQEBBVREaXNhbGxvd2VkUmVsYXlQYXJlbnQBAQVESW52YWxpZEFzc2lnbm1lbnQBAQVESW52YWxpZEdyb3VwSW5kZXgBAQVMSW5zdWZmaWNpZW50QmFja2luZwEBBThJbnZhbGlkQmFja2luZwEBBUROb3RDb2xsYXRvclNpZ25lZAEBBWhWYWxpZGF0aW9uRGF0YUhhc2hNaXNtYXRjaAEBBYBJbmNvcnJlY3REb3dud2FyZE1lc3NhZ2VIYW5kbGluZwEBBVRJbnZhbGlkVXB3YXJkTWVzc2FnZXMBAQVgSHJtcFdhdGVybWFya01pc2hhbmRsaW5nAQEFTEludmFsaWRPdXRib3VuZEhybXABAQVkSW52YWxpZFZhbGlkYXRpb25Db2RlSGFzaAEBBUBQYXJhSGVhZE1pc21hdGNoAQEFMFBhcmFJbmhlcmVudAECFGRUb29NYW55SW5jbHVzaW9uSW5oZXJlbnRzAQEFTEludmFsaWRQYXJlbnRIZWFkZXIBAQVISW5oZXJlbnRPdmVyd2VpZ2h0AQEFhENhbmRpZGF0ZXNGaWx0ZXJlZER1cmluZ0V4ZWN1dGlvbgEBBVBVbnNjaGVkdWxlZENhbmRpZGF0ZQEBBTRQYXJhU2NoZWR1bGVyAQEFFFBhcmFzAQI0NE5vdFJlZ2lzdGVyZWQBAQU0Q2Fubm90T25ib2FyZAEBBThDYW5ub3RPZmZib2FyZAEBBTRDYW5ub3RVcGdyYWRlAQEFPENhbm5vdERvd25ncmFkZQEBBVhQdmZDaGVja1N0YXRlbWVudFN0YWxlAQEFXFB2ZkNoZWNrU3RhdGVtZW50RnV0dXJlAQEFhFB2ZkNoZWNrVmFsaWRhdG9ySW5kZXhPdXRPZkJvdW5kcwEBBWBQdmZDaGVja0ludmFsaWRTaWduYXR1cmUBAQVIUHZmQ2hlY2tEb3VibGVWb3RlAQEFWFB2ZkNoZWNrU3ViamVjdEludmFsaWQBAQVEQ2Fubm90VXBncmFkZUNvZGUBAQUsSW52YWxpZENvZGUBAQUsSW5pdGlhbGl6ZXIBAQUMRG1wAQEFEEhybXABAlBUT3BlbkhybXBDaGFubmVsVG9TZWxmAQEFfE9wZW5Icm1wQ2hhbm5lbEludmFsaWRSZWNpcGllbnQBAQVsT3BlbkhybXBDaGFubmVsWmVyb0NhcGFjaXR5AQEFjE9wZW5Icm1wQ2hhbm5lbENhcGFjaXR5RXhjZWVkc0xpbWl0AQEFeE9wZW5Icm1wQ2hhbm5lbFplcm9NZXNzYWdlU2l6ZQEBBZhPcGVuSHJtcENoYW5uZWxNZXNzYWdlU2l6ZUV4Y2VlZHNMaW1pdAEBBXBPcGVuSHJtcENoYW5uZWxBbHJlYWR5RXhpc3RzAQEFfE9wZW5Icm1wQ2hhbm5lbEFscmVhZHlSZXF1ZXN0ZWQBAQVwT3BlbkhybXBDaGFubmVsTGltaXRFeGNlZWRlZAEBBXBBY2NlcHRIcm1wQ2hhbm5lbERvZXNudEV4aXN0AQEFhEFjY2VwdEhybXBDaGFubmVsQWxyZWFkeUNvbmZpcm1lZAEBBXhBY2NlcHRIcm1wQ2hhbm5lbExpbWl0RXhjZWVkZWQBAQVwQ2xvc2VIcm1wQ2hhbm5lbFVuYXV0aG9yaXplZAEBBWxDbG9zZUhybXBDaGFubmVsRG9lc250RXhpc3QBAQV8Q2xvc2VIcm1wQ2hhbm5lbEFscmVhZHlVbmRlcndheQEBBYRDYW5jZWxIcm1wT3BlbkNoYW5uZWxVbmF1dGhvcml6ZWQBAQVoT3BlbkhybXBDaGFubmVsRG9lc250RXhpc3QBAQV8T3BlbkhybXBDaGFubmVsQWxyZWFkeUNvbmZpcm1lZAEBBTBXcm9uZ1dpdG5lc3MBAQVwQ2hhbm5lbENyZWF0aW9uTm90QXV0aG9yaXplZAEBBTxQYXJhU2Vzc2lvbkluZm8BAQU0UGFyYXNEaXNwdXRlcwECJHREdXBsaWNhdGVEaXNwdXRlU3RhdGVtZW50U2V0cwEBBVxBbmNpZW50RGlzcHV0ZVN0YXRlbWVudAEBBWRWYWxpZGF0b3JJbmRleE91dE9mQm91bmRzAQEFQEludmFsaWRTaWduYXR1cmUBAQVIRHVwbGljYXRlU3RhdGVtZW50AQEFSFNpbmdsZVNpZGVkRGlzcHV0ZQEBBTxNYWxpY2lvdXNCYWNrZXIBAQVMTWlzc2luZ0JhY2tpbmdWb3RlcwEBBUhVbmNvbmZpcm1lZERpc3B1dGUBAQU0UGFyYXNTbGFzaGluZwECGGBJbnZhbGlkS2V5T3duZXJzaGlwUHJvb2YBAQVMSW52YWxpZFNlc3Npb25JbmRleAEBBVBJbnZhbGlkQ2FuZGlkYXRlSGFzaAEBBVRJbnZhbGlkVmFsaWRhdG9ySW5kZXgBAQVgVmFsaWRhdG9ySW5kZXhJZE1pc21hdGNoAQEFXER1cGxpY2F0ZVNsYXNoaW5nUmVwb3J0AQEFIE9uRGVtYW5kAQIIJFF1ZXVlRnVsbAEBBXBTcG90UHJpY2VIaWdoZXJUaGFuTWF4QW1vdW50AQEFaENvcmV0aW1lQXNzaWdubWVudFByb3ZpZGVyAQIYQEFzc2lnbm1lbnRzRW1wdHkBAQU0T3ZlclNjaGVkdWxlZAEBBThVbmRlclNjaGVkdWxlZAEBBUBEaXNhbGxvd2VkSW5zZXJ0AQEFPER1cGxpY2F0ZUluc2VydAEBBVBBc3NpZ25tZW50c05vdFNvcnRlZAEBBSRSZWdpc3RyYXIBAjg0Tm90UmVnaXN0ZXJlZAEBBURBbHJlYWR5UmVnaXN0ZXJlZAEBBSBOb3RPd25lcgEBBTBDb2RlVG9vTGFyZ2UBAQVASGVhZERhdGFUb29MYXJnZQEBBTBOb3RQYXJhY2hhaW4BAQU0Tm90UGFyYXRocmVhZAEBBUBDYW5ub3REZXJlZ2lzdGVyAQEFPENhbm5vdERvd25ncmFkZQEBBTRDYW5ub3RVcGdyYWRlAQEFKFBhcmFMb2NrZWQBAQUsTm90UmVzZXJ2ZWQBAQUsSW52YWxpZENvZGUBAQUoQ2Fubm90U3dhcAEBBRRTbG90cwECCERQYXJhTm90T25ib2FyZGluZwEBBShMZWFzZUVycm9yAQEFIEF1Y3Rpb25zAQIcREF1Y3Rpb25JblByb2dyZXNzAQEFRExlYXNlUGVyaW9kSW5QYXN0AQEFRFBhcmFOb3RSZWdpc3RlcmVkAQEFRE5vdEN1cnJlbnRBdWN0aW9uAQEFKE5vdEF1Y3Rpb24BAQUwQXVjdGlvbkVuZGVkAQEFQEFscmVhZHlMZWFzZWRPdXQBAQUkQ3Jvd2Rsb2FuAQJcREZpcnN0UGVyaW9kSW5QYXN0AQEFZEZpcnN0UGVyaW9kVG9vRmFySW5GdXR1cmUBAQVsTGFzdFBlcmlvZEJlZm9yZUZpcnN0UGVyaW9kAQEFYExhc3RQZXJpb2RUb29GYXJJbkZ1dHVyZQEBBTxDYW5ub3RFbmRJblBhc3QBAQVERW5kVG9vRmFySW5GdXR1cmUBAQUgT3ZlcmZsb3cBAQVQQ29udHJpYnV0aW9uVG9vU21hbGwBAQU0SW52YWxpZFBhcmFJZAEBBSxDYXBFeGNlZWRlZAEBBVhDb250cmlidXRpb25QZXJpb2RPdmVyAQEFNEludmFsaWRPcmlnaW4BAQUwTm90UGFyYWNoYWluAQEFLExlYXNlQWN0aXZlAQEFQEJpZE9yTGVhc2VBY3RpdmUBAQUwRnVuZE5vdEVuZGVkAQEFPE5vQ29udHJpYnV0aW9ucwEBBUhOb3RSZWFkeVRvRGlzc29sdmUBAQVASW52YWxpZFNpZ25hdHVyZQEBBTBNZW1vVG9vTGFyZ2UBAQVEQWxyZWFkeUluTmV3UmFpc2UBAQVIVnJmRGVsYXlJblByb2dyZXNzAQEFNE5vTGVhc2VQZXJpb2QBAQUgQ29yZXRpbWUBAgwkTm90QnJva2VyAQEFWFJlcXVlc3RlZEZ1dHVyZVJldmVudWUBAQVMQXNzZXRUcmFuc2ZlckZhaWxlZAEBBUhTdGF0ZVRyaWVNaWdyYXRpb24BAhg8TWF4U2lnbmVkTGltaXRzAQEFKEtleVRvb0xvbmcBAQU4Tm90RW5vdWdoRnVuZHMBAQUoQmFkV2l0bmVzcwEBBWRTaWduZWRNaWdyYXRpb25Ob3RBbGxvd2VkAQEFMEJhZENoaWxkUm9vdAEBBSRYY21QYWxsZXQBAmAsVW5yZWFjaGFibGUBAQUsU2VuZEZhaWx1cmUBAQUgRmlsdGVyZWQBAQVIVW53ZWlnaGFibGVNZXNzYWdlAQEFYERlc3RpbmF0aW9uTm90SW52ZXJ0aWJsZQEBBRRFbXB0eQEBBThDYW5ub3RSZWFuY2hvcgEBBTRUb29NYW55QXNzZXRzAQEFNEludmFsaWRPcmlnaW4BAQUoQmFkVmVyc2lvbgEBBSxCYWRMb2NhdGlvbgEBBThOb1N1YnNjcmlwdGlvbgEBBURBbHJlYWR5U3Vic2NyaWJlZAEBBVhDYW5ub3RDaGVja091dFRlbGVwb3J0AQEFKExvd0JhbGFuY2UBAQUwVG9vTWFueUxvY2tzAQEFTEFjY291bnROb3RTb3ZlcmVpZ24BAQUoRmVlc05vdE1ldAEBBTBMb2NrTm90Rm91bmQBAQUUSW5Vc2UBAQVoSW52YWxpZEFzc2V0VW5rbm93blJlc2VydmUBAQV4SW52YWxpZEFzc2V0VW5zdXBwb3J0ZWRSZXNlcnZlAQEFPFRvb01hbnlSZXNlcnZlcwEBBWBMb2NhbEV4ZWN1dGlvbkluY29tcGxldGUBAQUwTWVzc2FnZVF1ZXVlAQIkLE5vdFJlYXBhYmxlAQEFGE5vUGFnZQEBBSROb01lc3NhZ2UBAQVAQWxyZWFkeVByb2Nlc3NlZAEBBRhRdWV1ZWQBAQVISW5zdWZmaWNpZW50V2VpZ2h0AQEFYFRlbXBvcmFyaWx5VW5wcm9jZXNzYWJsZQEBBSxRdWV1ZVBhdXNlZAEBBUxSZWN1cnNpdmVEaXNhbGxvd2VkAQEFJEFzc2V0UmF0ZQECDEBVbmtub3duQXNzZXRLaW5kAQEFNEFscmVhZHlFeGlzdHMBAQUgT3ZlcmZsb3cBAQUUQmVlZnkBAhBgSW52YWxpZEtleU93bmVyc2hpcFByb29mAQEFYEludmFsaWRFcXVpdm9jYXRpb25Qcm9vZgEBBVhEdXBsaWNhdGVPZmZlbmNlUmVwb3J0AQEFUEludmFsaWRDb25maWd1cmF0aW9uAQEFDE1tcgEBBTBCZWVmeU1tckxlYWYBAQU8UGFyYVN1ZG9XcmFwcGVyAQIkPFBhcmFEb2VzbnRFeGlzdAEBBURQYXJhQWxyZWFkeUV4aXN0cwEBBVRFeGNlZWRzTWF4TWVzc2FnZVNpemUBAQU4Q291bGRudENsZWFudXABAQU0Tm90UGFyYXRocmVhZAEBBTBOb3RQYXJhY2hhaW4BAQU0Q2Fubm90VXBncmFkZQEBBTxDYW5ub3REb3duZ3JhZGUBAQUwVG9vTWFueUNvcmVzAQEFEFN1ZG8BAgQsUmVxdWlyZVN1ZG8BAQUCOBRPdGhlcgEBBTBDYW5ub3RMb29rdXABAQUkQmFkT3JpZ2luAQEFGE1vZHVsZQEC9BhTeXN0ZW0BAiQ8SW52YWxpZFNwZWNOYW1lAQEFaFNwZWNWZXJzaW9uTmVlZHNUb0luY3JlYXNlAQEFdEZhaWxlZFRvRXh0cmFjdFJ1bnRpbWVWZXJzaW9uAQEFTE5vbkRlZmF1bHRDb21wb3NpdGUBAQU8Tm9uWmVyb1JlZkNvdW50AQEFMENhbGxGaWx0ZXJlZAEBBWxNdWx0aUJsb2NrTWlncmF0aW9uc09uZ29pbmcBAQVETm90aGluZ0F1dGhvcml6ZWQBAQUwVW5hdXRob3JpemVkAQEFJFNjaGVkdWxlcgECFEBGYWlsZWRUb1NjaGVkdWxlAQEFIE5vdEZvdW5kAQEFXFRhcmdldEJsb2NrTnVtYmVySW5QYXN0AQEFSFJlc2NoZWR1bGVOb0NoYW5nZQEBBRROYW1lZAEBBSBQcmVpbWFnZQECJBhUb29CaWcBAQUwQWxyZWFkeU5vdGVkAQEFNE5vdEF1dGhvcml6ZWQBAQUgTm90Tm90ZWQBAQUkUmVxdWVzdGVkAQEFME5vdFJlcXVlc3RlZAEBBRxUb29NYW55AQEFGFRvb0ZldwEBBRhOb0Nvc3QBAQUQQmFiZQECEGBJbnZhbGlkRXF1aXZvY2F0aW9uUHJvb2YBAQVgSW52YWxpZEtleU93bmVyc2hpcFByb29mAQEFWER1cGxpY2F0ZU9mZmVuY2VSZXBvcnQBAQVQSW52YWxpZENvbmZpZ3VyYXRpb24BAQUkVGltZXN0YW1wAQEFHEluZGljZXMBAhQsTm90QXNzaWduZWQBAQUgTm90T3duZXIBAQUUSW5Vc2UBAQUsTm90VHJhbnNmZXIBAQUkUGVybWFuZW50AQEFIEJhbGFuY2VzAQIwOFZlc3RpbmdCYWxhbmNlAQEFVExpcXVpZGl0eVJlc3RyaWN0aW9ucwEBBUxJbnN1ZmZpY2llbnRCYWxhbmNlAQEFSEV4aXN0ZW50aWFsRGVwb3NpdAEBBTRFeHBlbmRhYmlsaXR5AQEFXEV4aXN0aW5nVmVzdGluZ1NjaGVkdWxlAQEFLERlYWRBY2NvdW50AQEFPFRvb01hbnlSZXNlcnZlcwEBBTBUb29NYW55SG9sZHMBAQU4VG9vTWFueUZyZWV6ZXMBAQVMSXNzdWFuY2VEZWFjdGl2YXRlZAEBBSREZWx0YVplcm8BAQVIVHJhbnNhY3Rpb25QYXltZW50AQEFKEF1dGhvcnNoaXABAQUcU3Rha2luZwECfDROb3RDb250cm9sbGVyAQEFIE5vdFN0YXNoAQEFNEFscmVhZHlCb25kZWQBAQU0QWxyZWFkeVBhaXJlZAEBBTBFbXB0eVRhcmdldHMBAQU4RHVwbGljYXRlSW5kZXgBAQVESW52YWxpZFNsYXNoSW5kZXgBAQVASW5zdWZmaWNpZW50Qm9uZAEBBTBOb01vcmVDaHVua3MBAQU0Tm9VbmxvY2tDaHVuawEBBTBGdW5kZWRUYXJnZXQBAQVISW52YWxpZEVyYVRvUmV3YXJkAQEFaEludmFsaWROdW1iZXJPZk5vbWluYXRpb25zAQEFSE5vdFNvcnRlZEFuZFVuaXF1ZQEBBThBbHJlYWR5Q2xhaW1lZAEBBSxJbnZhbGlkUGFnZQEBBVRJbmNvcnJlY3RIaXN0b3J5RGVwdGgBAQVYSW5jb3JyZWN0U2xhc2hpbmdTcGFucwEBBSBCYWRTdGF0ZQEBBThUb29NYW55VGFyZ2V0cwEBBSRCYWRUYXJnZXQBAQVAQ2Fubm90Q2hpbGxPdGhlcgEBBURUb29NYW55Tm9taW5hdG9ycwEBBURUb29NYW55VmFsaWRhdG9ycwEBBUBDb21taXNzaW9uVG9vTG93AQEFLEJvdW5kTm90TWV0AQEFUENvbnRyb2xsZXJEZXByZWNhdGVkAQEFTENhbm5vdFJlc3RvcmVMZWRnZXIBAQVsUmV3YXJkRGVzdGluYXRpb25SZXN0cmljdGVkAQEFOE5vdEVub3VnaEZ1bmRzAQEFXFZpcnR1YWxTdGFrZXJOb3RBbGxvd2VkAQEFIE9mZmVuY2VzAQEFKEhpc3RvcmljYWwBAQUcU2Vzc2lvbgECFDBJbnZhbGlkUHJvb2YBAQVcTm9Bc3NvY2lhdGVkVmFsaWRhdG9ySWQBAQU0RHVwbGljYXRlZEtleQEBBRhOb0tleXMBAQUkTm9BY2NvdW50AQEFHEdyYW5kcGEBAhwsUGF1c2VGYWlsZWQBAQUwUmVzdW1lRmFpbGVkAQEFNENoYW5nZVBlbmRpbmcBAQUcVG9vU29vbgEBBWBJbnZhbGlkS2V5T3duZXJzaGlwUHJvb2YBAQVgSW52YWxpZEVxdWl2b2NhdGlvblByb29mAQEFWER1cGxpY2F0ZU9mZmVuY2VSZXBvcnQBAQVIQXV0aG9yaXR5RGlzY292ZXJ5AQEFIFRyZWFzdXJ5AQIsMEludmFsaWRJbmRleAEBBUBUb29NYW55QXBwcm92YWxzAQEFWEluc3VmZmljaWVudFBlcm1pc3Npb24BAQVMUHJvcG9zYWxOb3RBcHByb3ZlZAEBBVhGYWlsZWRUb0NvbnZlcnRCYWxhbmNlAQEFMFNwZW5kRXhwaXJlZAEBBSxFYXJseVBheW91dAEBBUBBbHJlYWR5QXR0ZW1wdGVkAQEFLFBheW91dEVycm9yAQEFME5vdEF0dGVtcHRlZAEBBTBJbmNvbmNsdXNpdmUBAQVAQ29udmljdGlvblZvdGluZwECMChOb3RPbmdvaW5nAQEFIE5vdFZvdGVyAQEFME5vUGVybWlzc2lvbgEBBTxOb1Blcm1pc3Npb25ZZXQBAQVEQWxyZWFkeURlbGVnYXRpbmcBAQU0QWxyZWFkeVZvdGluZwEBBURJbnN1ZmZpY2llbnRGdW5kcwEBBTROb3REZWxlZ2F0aW5nAQEFIE5vbnNlbnNlAQEFPE1heFZvdGVzUmVhY2hlZAEBBSxDbGFzc05lZWRlZAEBBSBCYWRDbGFzcwEBBSRSZWZlcmVuZGEBAjgoTm90T25nb2luZwEBBShIYXNEZXBvc2l0AQEFIEJhZFRyYWNrAQEFEEZ1bGwBAQUoUXVldWVFbXB0eQEBBTRCYWRSZWZlcmVuZHVtAQEFLE5vdGhpbmdUb0RvAQEFHE5vVHJhY2sBAQUoVW5maW5pc2hlZAEBBTBOb1Blcm1pc3Npb24BAQUkTm9EZXBvc2l0AQEFJEJhZFN0YXR1cwEBBUBQcmVpbWFnZU5vdEV4aXN0AQEFhFByZWltYWdlU3RvcmVkV2l0aERpZmZlcmVudExlbmd0aAEBBRxPcmlnaW5zAQEFJFdoaXRlbGlzdAECFExVbmF2YWlsYWJsZVByZUltYWdlAQEFPFVuZGVjb2RhYmxlQ2FsbAEBBWBJbnZhbGlkQ2FsbFdlaWdodFdpdG5lc3MBAQVQQ2FsbElzTm90V2hpdGVsaXN0ZWQBAQVYQ2FsbEFscmVhZHlXaGl0ZWxpc3RlZAEBBShQYXJhbWV0ZXJzAQEFGENsYWltcwECGGBJbnZhbGlkRXRoZXJldW1TaWduYXR1cmUBAQVAU2lnbmVySGFzTm9DbGFpbQEBBUBTZW5kZXJIYXNOb0NsYWltAQEFMFBvdFVuZGVyZmxvdwEBBUBJbnZhbGlkU3RhdGVtZW50AQEFTFZlc3RlZEJhbGFuY2VFeGlzdHMBAQUcVmVzdGluZwECFChOb3RWZXN0aW5nAQEFVEF0TWF4VmVzdGluZ1NjaGVkdWxlcwEBBSRBbW91bnRMb3cBAQVgU2NoZWR1bGVJbmRleE91dE9mQm91bmRzAQEFVEludmFsaWRTY2hlZHVsZVBhcmFtcwEBBRxVdGlsaXR5AQIEMFRvb01hbnlDYWxscwEBBRRQcm94eQECIBxUb29NYW55AQEFIE5vdEZvdW5kAQEFIE5vdFByb3h5AQEFLFVucHJveHlhYmxlAQEFJER1cGxpY2F0ZQEBBTBOb1Blcm1pc3Npb24BAQUsVW5hbm5vdW5jZWQBAQUsTm9TZWxmUHJveHkBAQUgTXVsdGlzaWcBAjhATWluaW11bVRocmVzaG9sZAEBBTxBbHJlYWR5QXBwcm92ZWQBAQVETm9BcHByb3ZhbHNOZWVkZWQBAQVEVG9vRmV3U2lnbmF0b3JpZXMBAQVIVG9vTWFueVNpZ25hdG9yaWVzAQEFVFNpZ25hdG9yaWVzT3V0T2ZPcmRlcgEBBUxTZW5kZXJJblNpZ25hdG9yaWVzAQEFIE5vdEZvdW5kAQEFIE5vdE93bmVyAQEFLE5vVGltZXBvaW50AQEFOFdyb25nVGltZXBvaW50AQEFTFVuZXhwZWN0ZWRUaW1lcG9pbnQBAQU8TWF4V2VpZ2h0VG9vTG93AQEFNEFscmVhZHlTdG9yZWQBAQUgQm91bnRpZXMBAixwSW5zdWZmaWNpZW50UHJvcG9zZXJzQmFsYW5jZQEBBTBJbnZhbGlkSW5kZXgBAQUwUmVhc29uVG9vQmlnAQEFQFVuZXhwZWN0ZWRTdGF0dXMBAQU4UmVxdWlyZUN1cmF0b3IBAQUwSW52YWxpZFZhbHVlAQEFKEludmFsaWRGZWUBAQU0UGVuZGluZ1BheW91dAEBBSRQcmVtYXR1cmUBAQVQSGFzQWN0aXZlQ2hpbGRCb3VudHkBAQU0VG9vTWFueVF1ZXVlZAEBBTRDaGlsZEJvdW50aWVzAQIMVFBhcmVudEJvdW50eU5vdEFjdGl2ZQEBBWRJbnN1ZmZpY2llbnRCb3VudHlCYWxhbmNlAQEFUFRvb01hbnlDaGlsZEJvdW50aWVzAQEFaEVsZWN0aW9uUHJvdmlkZXJNdWx0aVBoYXNlAQI8aFByZURpc3BhdGNoRWFybHlTdWJtaXNzaW9uAQEFbFByZURpc3BhdGNoV3JvbmdXaW5uZXJDb3VudAEBBWRQcmVEaXNwYXRjaFdlYWtTdWJtaXNzaW9uAQEFPFNpZ25lZFF1ZXVlRnVsbAEBBVhTaWduZWRDYW5ub3RQYXlEZXBvc2l0AQEFUFNpZ25lZEludmFsaWRXaXRuZXNzAQEFTFNpZ25lZFRvb011Y2hXZWlnaHQBAQU8T2N3Q2FsbFdyb25nRXJhAQEFXE1pc3NpbmdTbmFwc2hvdE1ldGFkYXRhAQEFWEludmFsaWRTdWJtaXNzaW9uSW5kZXgBAQU4Q2FsbE5vdEFsbG93ZWQBAQU4RmFsbGJhY2tGYWlsZWQBAQUsQm91bmROb3RNZXQBAQU4VG9vTWFueVdpbm5lcnMBAQVkUHJlRGlzcGF0Y2hEaWZmZXJlbnRSb3VuZAEBBSRWb3Rlckxpc3QBAgQQTGlzdAECECREdXBsaWNhdGUBAQUoTm90SGVhdmllcgEBBTBOb3RJblNhbWVCYWcBAQUwTm9kZU5vdEZvdW5kAQEFPE5vbWluYXRpb25Qb29scwECkDBQb29sTm90Rm91bmQBAQVIUG9vbE1lbWJlck5vdEZvdW5kAQEFSFJld2FyZFBvb2xOb3RGb3VuZAEBBUBTdWJQb29sc05vdEZvdW5kAQEFZEFjY291bnRCZWxvbmdzVG9PdGhlclBvb2wBAQU4RnVsbHlVbmJvbmRpbmcBAQVETWF4VW5ib25kaW5nTGltaXQBAQVEQ2Fubm90V2l0aGRyYXdBbnkBAQVETWluaW11bUJvbmROb3RNZXQBAQUwT3ZlcmZsb3dSaXNrAQEFNE5vdERlc3Ryb3lpbmcBAQUwTm90Tm9taW5hdG9yAQEFVE5vdEtpY2tlck9yRGVzdHJveWluZwEBBRxOb3RPcGVuAQEFIE1heFBvb2xzAQEFOE1heFBvb2xNZW1iZXJzAQEFRENhbk5vdENoYW5nZVN0YXRlAQEFVERvZXNOb3RIYXZlUGVybWlzc2lvbgEBBVRNZXRhZGF0YUV4Y2VlZHNNYXhMZW4BAQUkRGVmZW5zaXZlAQIcaE5vdEVub3VnaFNwYWNlSW5VbmJvbmRQb29sAQEFMFBvb2xOb3RGb3VuZAEBBUhSZXdhcmRQb29sTm90Rm91bmQBAQVAU3ViUG9vbHNOb3RGb3VuZAEBBXBCb25kZWRTdGFzaEtpbGxlZFByZW1hdHVyZWx5AQEFVERlbGVnYXRpb25VbnN1cHBvcnRlZAEBBTxTbGFzaE5vdEFwcGxpZWQBAQWcUGFydGlhbFVuYm9uZE5vdEFsbG93ZWRQZXJtaXNzaW9ubGVzc2x5AQEFXE1heENvbW1pc3Npb25SZXN0cmljdGVkAQEFYENvbW1pc3Npb25FeGNlZWRzTWF4aW11bQEBBXhDb21taXNzaW9uRXhjZWVkc0dsb2JhbE1heGltdW0BAQVkQ29tbWlzc2lvbkNoYW5nZVRocm90dGxlZAEBBXhDb21taXNzaW9uQ2hhbmdlUmF0ZU5vdEFsbG93ZWQBAQVMTm9QZW5kaW5nQ29tbWlzc2lvbgEBBVhOb0NvbW1pc3Npb25DdXJyZW50U2V0AQEFLFBvb2xJZEluVXNlAQEFNEludmFsaWRQb29sSWQBAQVMQm9uZEV4dHJhUmVzdHJpY3RlZAEBBTxOb3RoaW5nVG9BZGp1c3QBAQU4Tm90aGluZ1RvU2xhc2gBAQU8QWxyZWFkeU1pZ3JhdGVkAQEFLE5vdE1pZ3JhdGVkAQEFME5vdFN1cHBvcnRlZAEBBSxGYXN0VW5zdGFrZQECGDROb3RDb250cm9sbGVyAQEFNEFscmVhZHlRdWV1ZWQBAQU4Tm90RnVsbHlCb25kZWQBAQUkTm90UXVldWVkAQEFLEFscmVhZHlIZWFkAQEFOENhbGxOb3RBbGxvd2VkAQEFQFBhcmFjaGFpbnNPcmlnaW4BAQU0Q29uZmlndXJhdGlvbgECBDxJbnZhbGlkTmV3VmFsdWUBAQUsUGFyYXNTaGFyZWQBAQU0UGFyYUluY2x1c2lvbgECSGRWYWxpZGF0b3JJbmRleE91dE9mQm91bmRzAQEFUFVuc2NoZWR1bGVkQ2FuZGlkYXRlAQEFQEhlYWREYXRhVG9vTGFyZ2UBAQVQUHJlbWF0dXJlQ29kZVVwZ3JhZGUBAQU8TmV3Q29kZVRvb0xhcmdlAQEFVERpc2FsbG93ZWRSZWxheVBhcmVudAEBBURJbnZhbGlkQXNzaWdubWVudAEBBURJbnZhbGlkR3JvdXBJbmRleAEBBUxJbnN1ZmZpY2llbnRCYWNraW5nAQEFOEludmFsaWRCYWNraW5nAQEFRE5vdENvbGxhdG9yU2lnbmVkAQEFaFZhbGlkYXRpb25EYXRhSGFzaE1pc21hdGNoAQEFgEluY29ycmVjdERvd253YXJkTWVzc2FnZUhhbmRsaW5nAQEFVEludmFsaWRVcHdhcmRNZXNzYWdlcwEBBWBIcm1wV2F0ZXJtYXJrTWlzaGFuZGxpbmcBAQVMSW52YWxpZE91dGJvdW5kSHJtcAEBBWRJbnZhbGlkVmFsaWRhdGlvbkNvZGVIYXNoAQEFQFBhcmFIZWFkTWlzbWF0Y2gBAQUwUGFyYUluaGVyZW50AQIUZFRvb01hbnlJbmNsdXNpb25JbmhlcmVudHMBAQVMSW52YWxpZFBhcmVudEhlYWRlcgEBBUhJbmhlcmVudE92ZXJ3ZWlnaHQBAQWEQ2FuZGlkYXRlc0ZpbHRlcmVkRHVyaW5nRXhlY3V0aW9uAQEFUFVuc2NoZWR1bGVkQ2FuZGlkYXRlAQEFNFBhcmFTY2hlZHVsZXIBAQUUUGFyYXMBAjQ0Tm90UmVnaXN0ZXJlZAEBBTRDYW5ub3RPbmJvYXJkAQEFOENhbm5vdE9mZmJvYXJkAQEFNENhbm5vdFVwZ3JhZGUBAQU8Q2Fubm90RG93bmdyYWRlAQEFWFB2ZkNoZWNrU3RhdGVtZW50U3RhbGUBAQVcUHZmQ2hlY2tTdGF0ZW1lbnRGdXR1cmUBAQWEUHZmQ2hlY2tWYWxpZGF0b3JJbmRleE91dE9mQm91bmRzAQEFYFB2ZkNoZWNrSW52YWxpZFNpZ25hdHVyZQEBBUhQdmZDaGVja0RvdWJsZVZvdGUBAQVYUHZmQ2hlY2tTdWJqZWN0SW52YWxpZAEBBURDYW5ub3RVcGdyYWRlQ29kZQEBBSxJbnZhbGlkQ29kZQEBBSxJbml0aWFsaXplcgEBBQxEbXABAQUQSHJtcAECUFRPcGVuSHJtcENoYW5uZWxUb1NlbGYBAQV8T3BlbkhybXBDaGFubmVsSW52YWxpZFJlY2lwaWVudAEBBWxPcGVuSHJtcENoYW5uZWxaZXJvQ2FwYWNpdHkBAQWMT3BlbkhybXBDaGFubmVsQ2FwYWNpdHlFeGNlZWRzTGltaXQBAQV4T3BlbkhybXBDaGFubmVsWmVyb01lc3NhZ2VTaXplAQEFmE9wZW5Icm1wQ2hhbm5lbE1lc3NhZ2VTaXplRXhjZWVkc0xpbWl0AQEFcE9wZW5Icm1wQ2hhbm5lbEFscmVhZHlFeGlzdHMBAQV8T3BlbkhybXBDaGFubmVsQWxyZWFkeVJlcXVlc3RlZAEBBXBPcGVuSHJtcENoYW5uZWxMaW1pdEV4Y2VlZGVkAQEFcEFjY2VwdEhybXBDaGFubmVsRG9lc250RXhpc3QBAQWEQWNjZXB0SHJtcENoYW5uZWxBbHJlYWR5Q29uZmlybWVkAQEFeEFjY2VwdEhybXBDaGFubmVsTGltaXRFeGNlZWRlZAEBBXBDbG9zZUhybXBDaGFubmVsVW5hdXRob3JpemVkAQEFbENsb3NlSHJtcENoYW5uZWxEb2VzbnRFeGlzdAEBBXxDbG9zZUhybXBDaGFubmVsQWxyZWFkeVVuZGVyd2F5AQEFhENhbmNlbEhybXBPcGVuQ2hhbm5lbFVuYXV0aG9yaXplZAEBBWhPcGVuSHJtcENoYW5uZWxEb2VzbnRFeGlzdAEBBXxPcGVuSHJtcENoYW5uZWxBbHJlYWR5Q29uZmlybWVkAQEFMFdyb25nV2l0bmVzcwEBBXBDaGFubmVsQ3JlYXRpb25Ob3RBdXRob3JpemVkAQEFPFBhcmFTZXNzaW9uSW5mbwEBBTRQYXJhc0Rpc3B1dGVzAQIkdER1cGxpY2F0ZURpc3B1dGVTdGF0ZW1lbnRTZXRzAQEFXEFuY2llbnREaXNwdXRlU3RhdGVtZW50AQEFZFZhbGlkYXRvckluZGV4T3V0T2ZCb3VuZHMBAQVASW52YWxpZFNpZ25hdHVyZQEBBUhEdXBsaWNhdGVTdGF0ZW1lbnQBAQVIU2luZ2xlU2lkZWREaXNwdXRlAQEFPE1hbGljaW91c0JhY2tlcgEBBUxNaXNzaW5nQmFja2luZ1ZvdGVzAQEFSFVuY29uZmlybWVkRGlzcHV0ZQEBBTRQYXJhc1NsYXNoaW5nAQIYYEludmFsaWRLZXlPd25lcnNoaXBQcm9vZgEBBUxJbnZhbGlkU2Vzc2lvbkluZGV4AQEFUEludmFsaWRDYW5kaWRhdGVIYXNoAQEFVEludmFsaWRWYWxpZGF0b3JJbmRleAEBBWBWYWxpZGF0b3JJbmRleElkTWlzbWF0Y2gBAQVcRHVwbGljYXRlU2xhc2hpbmdSZXBvcnQBAQUgT25EZW1hbmQBAggkUXVldWVGdWxsAQEFcFNwb3RQcmljZUhpZ2hlclRoYW5NYXhBbW91bnQBAQVoQ29yZXRpbWVBc3NpZ25tZW50UHJvdmlkZXIBAhhAQXNzaWdubWVudHNFbXB0eQEBBTRPdmVyU2NoZWR1bGVkAQEFOFVuZGVyU2NoZWR1bGVkAQEFQERpc2FsbG93ZWRJbnNlcnQBAQU8RHVwbGljYXRlSW5zZXJ0AQEFUEFzc2lnbm1lbnRzTm90U29ydGVkAQEFJFJlZ2lzdHJhcgECODROb3RSZWdpc3RlcmVkAQEFREFscmVhZHlSZWdpc3RlcmVkAQEFIE5vdE93bmVyAQEFMENvZGVUb29MYXJnZQEBBUBIZWFkRGF0YVRvb0xhcmdlAQEFME5vdFBhcmFjaGFpbgEBBTROb3RQYXJhdGhyZWFkAQEFQENhbm5vdERlcmVnaXN0ZXIBAQU8Q2Fubm90RG93bmdyYWRlAQEFNENhbm5vdFVwZ3JhZGUBAQUoUGFyYUxvY2tlZAEBBSxOb3RSZXNlcnZlZAEBBSxJbnZhbGlkQ29kZQEBBShDYW5ub3RTd2FwAQEFFFNsb3RzAQIIRFBhcmFOb3RPbmJvYXJkaW5nAQEFKExlYXNlRXJyb3IBAQUgQXVjdGlvbnMBAhxEQXVjdGlvbkluUHJvZ3Jlc3MBAQVETGVhc2VQZXJpb2RJblBhc3QBAQVEUGFyYU5vdFJlZ2lzdGVyZWQBAQVETm90Q3VycmVudEF1Y3Rpb24BAQUoTm90QXVjdGlvbgEBBTBBdWN0aW9uRW5kZWQBAQVAQWxyZWFkeUxlYXNlZE91dAEBBSRDcm93ZGxvYW4BAlxERmlyc3RQZXJpb2RJblBhc3QBAQVkRmlyc3RQZXJpb2RUb29GYXJJbkZ1dHVyZQEBBWxMYXN0UGVyaW9kQmVmb3JlRmlyc3RQZXJpb2QBAQVgTGFzdFBlcmlvZFRvb0ZhckluRnV0dXJlAQEFPENhbm5vdEVuZEluUGFzdAEBBURFbmRUb29GYXJJbkZ1dHVyZQEBBSBPdmVyZmxvdwEBBVBDb250cmlidXRpb25Ub29TbWFsbAEBBTRJbnZhbGlkUGFyYUlkAQEFLENhcEV4Y2VlZGVkAQEFWENvbnRyaWJ1dGlvblBlcmlvZE92ZXIBAQU0SW52YWxpZE9yaWdpbgEBBTBOb3RQYXJhY2hhaW4BAQUsTGVhc2VBY3RpdmUBAQVAQmlkT3JMZWFzZUFjdGl2ZQEBBTBGdW5kTm90RW5kZWQBAQU8Tm9Db250cmlidXRpb25zAQEFSE5vdFJlYWR5VG9EaXNzb2x2ZQEBBUBJbnZhbGlkU2lnbmF0dXJlAQEFME1lbW9Ub29MYXJnZQEBBURBbHJlYWR5SW5OZXdSYWlzZQEBBUhWcmZEZWxheUluUHJvZ3Jlc3MBAQU0Tm9MZWFzZVBlcmlvZAEBBSBDb3JldGltZQECDCROb3RCcm9rZXIBAQVYUmVxdWVzdGVkRnV0dXJlUmV2ZW51ZQEBBUxBc3NldFRyYW5zZmVyRmFpbGVkAQEFSFN0YXRlVHJpZU1pZ3JhdGlvbgECGDxNYXhTaWduZWRMaW1pdHMBAQUoS2V5VG9vTG9uZwEBBThOb3RFbm91Z2hGdW5kcwEBBShCYWRXaXRuZXNzAQEFZFNpZ25lZE1pZ3JhdGlvbk5vdEFsbG93ZWQBAQUwQmFkQ2hpbGRSb290AQEFJFhjbVBhbGxldAECYCxVbnJlYWNoYWJsZQEBBSxTZW5kRmFpbHVyZQEBBSBGaWx0ZXJlZAEBBUhVbndlaWdoYWJsZU1lc3NhZ2UBAQVgRGVzdGluYXRpb25Ob3RJbnZlcnRpYmxlAQEFFEVtcHR5AQEFOENhbm5vdFJlYW5jaG9yAQEFNFRvb01hbnlBc3NldHMBAQU0SW52YWxpZE9yaWdpbgEBBShCYWRWZXJzaW9uAQEFLEJhZExvY2F0aW9uAQEFOE5vU3Vic2NyaXB0aW9uAQEFREFscmVhZHlTdWJzY3JpYmVkAQEFWENhbm5vdENoZWNrT3V0VGVsZXBvcnQBAQUoTG93QmFsYW5jZQEBBTBUb29NYW55TG9ja3MBAQVMQWNjb3VudE5vdFNvdmVyZWlnbgEBBShGZWVzTm90TWV0AQEFMExvY2tOb3RGb3VuZAEBBRRJblVzZQEBBWhJbnZhbGlkQXNzZXRVbmtub3duUmVzZXJ2ZQEBBXhJbnZhbGlkQXNzZXRVbnN1cHBvcnRlZFJlc2VydmUBAQU8VG9vTWFueVJlc2VydmVzAQEFYExvY2FsRXhlY3V0aW9uSW5jb21wbGV0ZQEBBTBNZXNzYWdlUXVldWUBAiQsTm90UmVhcGFibGUBAQUYTm9QYWdlAQEFJE5vTWVzc2FnZQEBBUBBbHJlYWR5UHJvY2Vzc2VkAQEFGFF1ZXVlZAEBBUhJbnN1ZmZpY2llbnRXZWlnaHQBAQVgVGVtcG9yYXJpbHlVbnByb2Nlc3NhYmxlAQEFLFF1ZXVlUGF1c2VkAQEFTFJlY3Vyc2l2ZURpc2FsbG93ZWQBAQUkQXNzZXRSYXRlAQIMQFVua25vd25Bc3NldEtpbmQBAQU0QWxyZWFkeUV4aXN0cwEBBSBPdmVyZmxvdwEBBRRCZWVmeQECEGBJbnZhbGlkS2V5T3duZXJzaGlwUHJvb2YBAQVgSW52YWxpZEVxdWl2b2NhdGlvblByb29mAQEFWER1cGxpY2F0ZU9mZmVuY2VSZXBvcnQBAQVQSW52YWxpZENvbmZpZ3VyYXRpb24BAQUMTW1yAQEFMEJlZWZ5TW1yTGVhZgEBBTxQYXJhU3Vkb1dyYXBwZXIBAiQ8UGFyYURvZXNudEV4aXN0AQEFRFBhcmFBbHJlYWR5RXhpc3RzAQEFVEV4Y2VlZHNNYXhNZXNzYWdlU2l6ZQEBBThDb3VsZG50Q2xlYW51cAEBBTROb3RQYXJhdGhyZWFkAQEFME5vdFBhcmFjaGFpbgEBBTRDYW5ub3RVcGdyYWRlAQEFPENhbm5vdERvd25ncmFkZQEBBTBUb29NYW55Q29yZXMBAQUQU3VkbwECBCxSZXF1aXJlU3VkbwEBBURDb25zdW1lclJlbWFpbmluZwEBBSxOb1Byb3ZpZGVycwEBBUBUb29NYW55Q29uc3VtZXJzAQEFFFRva2VuAQIoQEZ1bmRzVW5hdmFpbGFibGUBAQUwT25seVByb3ZpZGVyAQEFMEJlbG93TWluaW11bQEBBTBDYW5ub3RDcmVhdGUBAQUwVW5rbm93bkFzc2V0AQEFGEZyb3plbgEBBSxVbnN1cHBvcnRlZAEBBUBDYW5ub3RDcmVhdGVIb2xkAQEFNE5vdEV4cGVuZGFibGUBAQUcQmxvY2tlZAEBBShBcml0aG1ldGljAQIMJFVuZGVyZmxvdwEBBSBPdmVyZmxvdwEBBThEaXZpc2lvbkJ5WmVybwEBBTRUcmFuc2FjdGlvbmFsAQIIMExpbWl0UmVhY2hlZAEBBRxOb0xheWVyAQEFJEV4aGF1c3RlZAEBBShDb3JydXB0aW9uAQEFLFVuYXZhaWxhYmxlAQEFOFJvb3ROb3RBbGxvd2VkAQEFAhxARXh0cmluc2ljU3VjY2VzcwEABDRkaXNwYXRjaF9pbmZvQDxFeHRyaW5zaWNGYWlsZWQBAAg4ZGlzcGF0Y2hfZXJyb3IpDTRkaXNwYXRjaF9pbmZvQCxDb2RlVXBkYXRlZAEBBShOZXdBY2NvdW50AQAEHGFjY291bnQANEtpbGxlZEFjY291bnQBAAQcYWNjb3VudAAgUmVtYXJrZWQBAAgYc2VuZGVyABBoYXNoIERVcGdyYWRlQXV0aG9yaXplZAEACCRjb2RlX2hhc2ggNGNoZWNrX3ZlcnNpb24UBxUBKQ0CJCRTY2hlZHVsZWQBAAgQd2hlbgQUaW5kZXgEIENhbmNlbGVkAQAIEHdoZW4EFGluZGV4BChEaXNwYXRjaGVkAQAMEHRhc2sNAQhpZBEBGHJlc3VsdDENIFJldHJ5U2V0AQAQEHRhc2sNAQhpZBEBGHBlcmlvZAQccmV0cmllcwQ4UmV0cnlDYW5jZWxsZWQBAAgQdGFzaw0BCGlkEQE8Q2FsbFVuYXZhaWxhYmxlAQAIEHRhc2sNAQhpZBEBOFBlcmlvZGljRmFpbGVkAQAIEHRhc2sNAQhpZBEBLFJldHJ5RmFpbGVkAQAIEHRhc2sNAQhpZBEBVFBlcm1hbmVudGx5T3ZlcndlaWdodAEACBB0YXNrDQEIaWQRAQAIJHBvc3RfaW5mb7UBFGVycm9yKQ0HtQE5DQIMPENhbGxXaGl0ZWxpc3RlZAEABCRjYWxsX2hhc2ggWFdoaXRlbGlzdGVkQ2FsbFJlbW92ZWQBAAQkY2FsbF9oYXNoIGRXaGl0ZWxpc3RlZENhbGxEaXNwYXRjaGVkAQAIJGNhbGxfaGFzaCAYcmVzdWx0PQ0CGEBCYXRjaEludGVycnVwdGVkAQAIFGluZGV4BBRlcnJvcikNOEJhdGNoQ29tcGxldGVkAQEFYEJhdGNoQ29tcGxldGVkV2l0aEVycm9ycwEBBTRJdGVtQ29tcGxldGVkAQEFKEl0ZW1GYWlsZWQBAAQUZXJyb3IpDTBEaXNwYXRjaGVkQXMBAAQYcmVzdWx0MQ0CFDRQcm94eUV4ZWN1dGVkAQAEGHJlc3VsdDENLFB1cmVDcmVhdGVkAQAQEHB1cmUADHdobwAocHJveHlfdHlwZekBUGRpc2FtYmlndWF0aW9uX2luZGV4BCRBbm5vdW5jZWQBAAwQcmVhbAAUcHJveHkAJGNhbGxfaGFzaCAoUHJveHlBZGRlZAEAECRkZWxlZ2F0b3IAJGRlbGVnYXRlZQAocHJveHlfdHlwZekBFGRlbGF5BDBQcm94eVJlbW92ZWQBABAkZGVsZWdhdG9yACRkZWxlZ2F0ZWUAKHByb3h5X3R5cGXpARRkZWxheQQCECxOZXdNdWx0aXNpZwEADCRhcHByb3ZpbmcAIG11bHRpc2lnACRjYWxsX2hhc2ggQE11bHRpc2lnQXBwcm92YWwBABAkYXBwcm92aW5nACR0aW1lcG9pbnTxASBtdWx0aXNpZwAkY2FsbF9oYXNoIEBNdWx0aXNpZ0V4ZWN1dGVkAQAUJGFwcHJvdmluZwAkdGltZXBvaW508QEgbXVsdGlzaWcAJGNhbGxfaGFzaCAYcmVzdWx0MQ1ETXVsdGlzaWdDYW5jZWxsZWQBABAoY2FuY2VsbGluZwAkdGltZXBvaW508QEgbXVsdGlzaWcAJGNhbGxfaGFzaCACFCBVbnN0YWtlZAEACBRzdGFzaAAYcmVzdWx0MQ0cU2xhc2hlZAEACBRzdGFzaAAYYW1vdW50CDBCYXRjaENoZWNrZWQBAAQQZXJhczkCNEJhdGNoRmluaXNoZWQBAAQQc2l6ZQQ0SW50ZXJuYWxFcnJvcgEBBQIoHENyZWF0ZWQBAAQccGFyYV9pZAQsQ29udHJpYnV0ZWQBAAwMd2hvAChmdW5kX2luZGV4BBhhbW91bnQIIFdpdGhkcmV3AQAMDHdobwAoZnVuZF9pbmRleAQYYW1vdW50CERQYXJ0aWFsbHlSZWZ1bmRlZAEABBxwYXJhX2lkBCxBbGxSZWZ1bmRlZAEABBxwYXJhX2lkBCREaXNzb2x2ZWQBAAQccGFyYV9pZAQ8SGFuZGxlQmlkUmVzdWx0AQAIHHBhcmFfaWQEGHJlc3VsdDENGEVkaXRlZAEABBxwYXJhX2lkBCxNZW1vVXBkYXRlZAEADAx3aG8AHHBhcmFfaWQEEG1lbW8kPEFkZGVkVG9OZXdSYWlzZQEABBxwYXJhX2lkBAIQFFN1ZGlkAQAELHN1ZG9fcmVzdWx0MQ0oS2V5Q2hhbmdlZAEACAxvbGQFAgxuZXcAKEtleVJlbW92ZWQBAQUoU3Vkb0FzRG9uZQEABCxzdWRvX3Jlc3VsdDENAqQYU3lzdGVtAQIcQEV4dHJpbnNpY1N1Y2Nlc3MBAAQ0ZGlzcGF0Y2hfaW5mb0A8RXh0cmluc2ljRmFpbGVkAQAIOGRpc3BhdGNoX2Vycm9yKQ00ZGlzcGF0Y2hfaW5mb0AsQ29kZVVwZGF0ZWQBAQUoTmV3QWNjb3VudAEABBxhY2NvdW50ADRLaWxsZWRBY2NvdW50AQAEHGFjY291bnQAIFJlbWFya2VkAQAIGHNlbmRlcgAQaGFzaCBEVXBncmFkZUF1dGhvcml6ZWQBAAgkY29kZV9oYXNoIDRjaGVja192ZXJzaW9uFCRTY2hlZHVsZXIBAiQkU2NoZWR1bGVkAQAIEHdoZW4EFGluZGV4BCBDYW5jZWxlZAEACBB3aGVuBBRpbmRleAQoRGlzcGF0Y2hlZAEADBB0YXNrDQEIaWQRARhyZXN1bHQxDSBSZXRyeVNldAEAEBB0YXNrDQEIaWQRARhwZXJpb2QEHHJldHJpZXMEOFJldHJ5Q2FuY2VsbGVkAQAIEHRhc2sNAQhpZBEBPENhbGxVbmF2YWlsYWJsZQEACBB0YXNrDQEIaWQRAThQZXJpb2RpY0ZhaWxlZAEACBB0YXNrDQEIaWQRASxSZXRyeUZhaWxlZAEACBB0YXNrDQEIaWQRAVRQZXJtYW5lbnRseU92ZXJ3ZWlnaHQBAAgQdGFzaw0BCGlkEQEgUHJlaW1hZ2UBAgwUTm90ZWQBAAQQaGFzaCAkUmVxdWVzdGVkAQAEEGhhc2ggHENsZWFyZWQBAAQQaGFzaCAcSW5kaWNlcwECDDRJbmRleEFzc2lnbmVkAQAIDHdobwAUaW5kZXgEKEluZGV4RnJlZWQBAAQUaW5kZXgELEluZGV4RnJvemVuAQAIFGluZGV4BAx3aG8AIEJhbGFuY2VzAQJYHEVuZG93ZWQBAAgcYWNjb3VudAAwZnJlZV9iYWxhbmNlCCBEdXN0TG9zdAEACBxhY2NvdW50ABhhbW91bnQIIFRyYW5zZmVyAQAMEGZyb20ACHRvABhhbW91bnQIKEJhbGFuY2VTZXQBAAgMd2hvABBmcmVlCCBSZXNlcnZlZAEACAx3aG8AGGFtb3VudAgoVW5yZXNlcnZlZAEACAx3aG8AGGFtb3VudAhIUmVzZXJ2ZVJlcGF0cmlhdGVkAQAQEGZyb20ACHRvABhhbW91bnQISGRlc3RpbmF0aW9uX3N0YXR1cykBHERlcG9zaXQBAAgMd2hvABhhbW91bnQIIFdpdGhkcmF3AQAIDHdobwAYYW1vdW50CBxTbGFzaGVkAQAIDHdobwAYYW1vdW50CBhNaW50ZWQBAAgMd2hvABhhbW91bnQIGEJ1cm5lZAEACAx3aG8AGGFtb3VudAgkU3VzcGVuZGVkAQAIDHdobwAYYW1vdW50CCBSZXN0b3JlZAEACAx3aG8AGGFtb3VudAggVXBncmFkZWQBAAQMd2hvABhJc3N1ZWQBAAQYYW1vdW50CCRSZXNjaW5kZWQBAAQYYW1vdW50CBhMb2NrZWQBAAgMd2hvABhhbW91bnQIIFVubG9ja2VkAQAIDHdobwAYYW1vdW50CBhGcm96ZW4BAAgMd2hvABhhbW91bnQIGFRoYXdlZAEACAx3aG8AGGFtb3VudAhMVG90YWxJc3N1YW5jZUZvcmNlZAEACAxvbGQIDG5ldwhIVHJhbnNhY3Rpb25QYXltZW50AQIESFRyYW5zYWN0aW9uRmVlUGFpZAEADAx3aG8AKGFjdHVhbF9mZWUIDHRpcAgcU3Rha2luZwECSBxFcmFQYWlkAQAMJGVyYV9pbmRleARAdmFsaWRhdG9yX3BheW91dAgkcmVtYWluZGVyCCBSZXdhcmRlZAEADBRzdGFzaAAQZGVzdDUBGGFtb3VudAgcU2xhc2hlZAEACBhzdGFrZXIAGGFtb3VudAg0U2xhc2hSZXBvcnRlZAEADCR2YWxpZGF0b3IAIGZyYWN0aW9uBCRzbGFzaF9lcmEEaE9sZFNsYXNoaW5nUmVwb3J0RGlzY2FyZGVkAQAENHNlc3Npb25faW5kZXgEOFN0YWtlcnNFbGVjdGVkAQEFGEJvbmRlZAEACBRzdGFzaAAYYW1vdW50CCBVbmJvbmRlZAEACBRzdGFzaAAYYW1vdW50CCRXaXRoZHJhd24BAAgUc3Rhc2gAGGFtb3VudAgYS2lja2VkAQAIJG5vbWluYXRvcgAUc3Rhc2gAVFN0YWtpbmdFbGVjdGlvbkZhaWxlZAEBBRxDaGlsbGVkAQAEFHN0YXNoADRQYXlvdXRTdGFydGVkAQAIJGVyYV9pbmRleAQ8dmFsaWRhdG9yX3N0YXNoAERWYWxpZGF0b3JQcmVmc1NldAEACBRzdGFzaAAUcHJlZnM5AWhTbmFwc2hvdFZvdGVyc1NpemVFeGNlZWRlZAEABBBzaXplBGxTbmFwc2hvdFRhcmdldHNTaXplRXhjZWVkZWQBAAQQc2l6ZQQgRm9yY2VFcmEBAAQQbW9kZT0BZENvbnRyb2xsZXJCYXRjaERlcHJlY2F0ZWQBAAQgZmFpbHVyZXMEIE9mZmVuY2VzAQIEHE9mZmVuY2UBAAgQa2luZEUBIHRpbWVzbG90JBxTZXNzaW9uAQIEKE5ld1Nlc3Npb24BAAQ0c2Vzc2lvbl9pbmRleAQcR3JhbmRwYQECDDhOZXdBdXRob3JpdGllcwEABDRhdXRob3JpdHlfc2V0VQEYUGF1c2VkAQEFHFJlc3VtZWQBAQUgVHJlYXN1cnkBAjAgU3BlbmRpbmcBAARAYnVkZ2V0X3JlbWFpbmluZwgcQXdhcmRlZAEADDhwcm9wb3NhbF9pbmRleAQUYXdhcmQIHGFjY291bnQAFEJ1cm50AQAELGJ1cm50X2Z1bmRzCCBSb2xsb3ZlcgEABEByb2xsb3Zlcl9iYWxhbmNlCBxEZXBvc2l0AQAEFHZhbHVlCDRTcGVuZEFwcHJvdmVkAQAMOHByb3Bvc2FsX2luZGV4BBhhbW91bnQILGJlbmVmaWNpYXJ5ADxVcGRhdGVkSW5hY3RpdmUBAAgscmVhY3RpdmF0ZWQILGRlYWN0aXZhdGVkCEhBc3NldFNwZW5kQXBwcm92ZWQBABgUaW5kZXgEKGFzc2V0X2tpbmSBARhhbW91bnQILGJlbmVmaWNpYXJ5mQEodmFsaWRfZnJvbQQkZXhwaXJlX2F0BEBBc3NldFNwZW5kVm9pZGVkAQAEFGluZGV4BBBQYWlkAQAIFGluZGV4BChwYXltZW50X2lkCDRQYXltZW50RmFpbGVkAQAIFGluZGV4BChwYXltZW50X2lkCDhTcGVuZFByb2Nlc3NlZAEABBRpbmRleARAQ29udmljdGlvblZvdGluZwECCCREZWxlZ2F0ZWQBBAABCCxVbmRlbGVnYXRlZAEBASRSZWZlcmVuZGEBAkAkU3VibWl0dGVkAQAMFGluZGV4BBR0cmFjawQgcHJvcG9zYWylAVREZWNpc2lvbkRlcG9zaXRQbGFjZWQBAAwUaW5kZXgEDHdobwAYYW1vdW50CFxEZWNpc2lvbkRlcG9zaXRSZWZ1bmRlZAEADBRpbmRleAQMd2hvABhhbW91bnQIOERlcG9zaXRTbGFzaGVkAQAIDHdobwAYYW1vdW50CDxEZWNpc2lvblN0YXJ0ZWQBABAUaW5kZXgEFHRyYWNrBCBwcm9wb3NhbKUBFHRhbGx5qQE4Q29uZmlybVN0YXJ0ZWQBAAQUaW5kZXgEOENvbmZpcm1BYm9ydGVkAQAEFGluZGV4BCRDb25maXJtZWQBAAgUaW5kZXgEFHRhbGx5qQEgQXBwcm92ZWQBAAQUaW5kZXgEIFJlamVjdGVkAQAIFGluZGV4BBR0YWxseakBIFRpbWVkT3V0AQAIFGluZGV4BBR0YWxseakBJENhbmNlbGxlZAEACBRpbmRleAQUdGFsbHmpARhLaWxsZWQBAAgUaW5kZXgEFHRhbGx5qQFkU3VibWlzc2lvbkRlcG9zaXRSZWZ1bmRlZAEADBRpbmRleAQMd2hvABhhbW91bnQILE1ldGFkYXRhU2V0AQAIFGluZGV4BBBoYXNoIDxNZXRhZGF0YUNsZWFyZWQBAAgUaW5kZXgEEGhhc2ggJFdoaXRlbGlzdAECDDxDYWxsV2hpdGVsaXN0ZWQBAAQkY2FsbF9oYXNoIFhXaGl0ZWxpc3RlZENhbGxSZW1vdmVkAQAEJGNhbGxfaGFzaCBkV2hpdGVsaXN0ZWRDYWxsRGlzcGF0Y2hlZAEACCRjYWxsX2hhc2ggGHJlc3VsdD0NKFBhcmFtZXRlcnMBAgQcVXBkYXRlZAEADAxrZXnJASRvbGRfdmFsdWXVASRuZXdfdmFsdWXVARhDbGFpbXMBAgQcQ2xhaW1lZAEADAx3aG8AQGV0aGVyZXVtX2FkZHJlc3NlARhhbW91bnQIHFZlc3RpbmcBAgg4VmVzdGluZ1VwZGF0ZWQBAAgcYWNjb3VudAAgdW52ZXN0ZWQIQFZlc3RpbmdDb21wbGV0ZWQBAAQcYWNjb3VudAAcVXRpbGl0eQECGEBCYXRjaEludGVycnVwdGVkAQAIFGluZGV4BBRlcnJvcikNOEJhdGNoQ29tcGxldGVkAQEFYEJhdGNoQ29tcGxldGVkV2l0aEVycm9ycwEBBTRJdGVtQ29tcGxldGVkAQEFKEl0ZW1GYWlsZWQBAAQUZXJyb3IpDTBEaXNwYXRjaGVkQXMBAAQYcmVzdWx0MQ0UUHJveHkBAhQ0UHJveHlFeGVjdXRlZAEABBhyZXN1bHQxDSxQdXJlQ3JlYXRlZAEAEBBwdXJlAAx3aG8AKHByb3h5X3R5cGXpAVBkaXNhbWJpZ3VhdGlvbl9pbmRleAQkQW5ub3VuY2VkAQAMEHJlYWwAFHByb3h5ACRjYWxsX2hhc2ggKFByb3h5QWRkZWQBABAkZGVsZWdhdG9yACRkZWxlZ2F0ZWUAKHByb3h5X3R5cGXpARRkZWxheQQwUHJveHlSZW1vdmVkAQAQJGRlbGVnYXRvcgAkZGVsZWdhdGVlAChwcm94eV90eXBl6QEUZGVsYXkEIE11bHRpc2lnAQIQLE5ld011bHRpc2lnAQAMJGFwcHJvdmluZwAgbXVsdGlzaWcAJGNhbGxfaGFzaCBATXVsdGlzaWdBcHByb3ZhbAEAECRhcHByb3ZpbmcAJHRpbWVwb2ludPEBIG11bHRpc2lnACRjYWxsX2hhc2ggQE11bHRpc2lnRXhlY3V0ZWQBABQkYXBwcm92aW5nACR0aW1lcG9pbnTxASBtdWx0aXNpZwAkY2FsbF9oYXNoIBhyZXN1bHQxDURNdWx0aXNpZ0NhbmNlbGxlZAEAEChjYW5jZWxsaW5nACR0aW1lcG9pbnTxASBtdWx0aXNpZwAkY2FsbF9oYXNoICBCb3VudGllcwECLDhCb3VudHlQcm9wb3NlZAEABBRpbmRleAQ4Qm91bnR5UmVqZWN0ZWQBAAgUaW5kZXgEEGJvbmQISEJvdW50eUJlY2FtZUFjdGl2ZQEABBRpbmRleAQ0Qm91bnR5QXdhcmRlZAEACBRpbmRleAQsYmVuZWZpY2lhcnkANEJvdW50eUNsYWltZWQBAAwUaW5kZXgEGHBheW91dAgsYmVuZWZpY2lhcnkAOEJvdW50eUNhbmNlbGVkAQAEFGluZGV4BDhCb3VudHlFeHRlbmRlZAEABBRpbmRleAQ4Qm91bnR5QXBwcm92ZWQBAAQUaW5kZXgEPEN1cmF0b3JQcm9wb3NlZAEACCRib3VudHlfaWQEHGN1cmF0b3IAREN1cmF0b3JVbmFzc2lnbmVkAQAEJGJvdW50eV9pZAQ8Q3VyYXRvckFjY2VwdGVkAQAIJGJvdW50eV9pZAQcY3VyYXRvcgA0Q2hpbGRCb3VudGllcwECEBRBZGRlZAEACBRpbmRleAQsY2hpbGRfaW5kZXgEHEF3YXJkZWQBAAwUaW5kZXgELGNoaWxkX2luZGV4BCxiZW5lZmljaWFyeQAcQ2xhaW1lZAEAEBRpbmRleAQsY2hpbGRfaW5kZXgEGHBheW91dAgsYmVuZWZpY2lhcnkAIENhbmNlbGVkAQAIFGluZGV4BCxjaGlsZF9pbmRleARoRWxlY3Rpb25Qcm92aWRlck11bHRpUGhhc2UBAhg4U29sdXRpb25TdG9yZWQBAAwcY29tcHV0ZQECGG9yaWdpbgUCMHByZXZfZWplY3RlZBRERWxlY3Rpb25GaW5hbGl6ZWQBAAgcY29tcHV0ZQECFHNjb3JlCQI4RWxlY3Rpb25GYWlsZWQBAQUgUmV3YXJkZWQBAAgcYWNjb3VudAAUdmFsdWUIHFNsYXNoZWQBAAgcYWNjb3VudAAUdmFsdWUIRFBoYXNlVHJhbnNpdGlvbmVkAQAMEGZyb20RAgh0bxECFHJvdW5kBCRWb3Rlckxpc3QBAgggUmViYWdnZWQBAAwMd2hvABBmcm9tCAh0bwgwU2NvcmVVcGRhdGVkAQAIDHdobwAkbmV3X3Njb3JlCDxOb21pbmF0aW9uUG9vbHMBAkgcQ3JlYXRlZAEACCRkZXBvc2l0b3IAHHBvb2xfaWQEGEJvbmRlZAEAEBhtZW1iZXIAHHBvb2xfaWQEGGJvbmRlZAgYam9pbmVkFBxQYWlkT3V0AQAMGG1lbWJlcgAccG9vbF9pZAQYcGF5b3V0CCBVbmJvbmRlZAEAFBhtZW1iZXIAHHBvb2xfaWQEHGJhbGFuY2UIGHBvaW50cwgMZXJhBCRXaXRoZHJhd24BABAYbWVtYmVyABxwb29sX2lkBBxiYWxhbmNlCBhwb2ludHMIJERlc3Ryb3llZAEABBxwb29sX2lkBDBTdGF0ZUNoYW5nZWQBAAgccG9vbF9pZAQkbmV3X3N0YXRlHQI0TWVtYmVyUmVtb3ZlZAEACBxwb29sX2lkBBhtZW1iZXIAMFJvbGVzVXBkYXRlZAEADBByb290BQIcYm91bmNlcgUCJG5vbWluYXRvcgUCLFBvb2xTbGFzaGVkAQAIHHBvb2xfaWQEHGJhbGFuY2UIUFVuYm9uZGluZ1Bvb2xTbGFzaGVkAQAMHHBvb2xfaWQEDGVyYQQcYmFsYW5jZQhUUG9vbENvbW1pc3Npb25VcGRhdGVkAQAIHHBvb2xfaWQEHGN1cnJlbnQlAmBQb29sTWF4Q29tbWlzc2lvblVwZGF0ZWQBAAgccG9vbF9pZAQ4bWF4X2NvbW1pc3Npb24EfFBvb2xDb21taXNzaW9uQ2hhbmdlUmF0ZVVwZGF0ZWQBAAgccG9vbF9pZAQsY2hhbmdlX3JhdGUpApBQb29sQ29tbWlzc2lvbkNsYWltUGVybWlzc2lvblVwZGF0ZWQBAAgccG9vbF9pZAQocGVybWlzc2lvbjECVFBvb2xDb21taXNzaW9uQ2xhaW1lZAEACBxwb29sX2lkBChjb21taXNzaW9uCGRNaW5CYWxhbmNlRGVmaWNpdEFkanVzdGVkAQAIHHBvb2xfaWQEGGFtb3VudAhgTWluQmFsYW5jZUV4Y2Vzc0FkanVzdGVkAQAIHHBvb2xfaWQEGGFtb3VudAgsRmFzdFVuc3Rha2UBAhQgVW5zdGFrZWQBAAgUc3Rhc2gAGHJlc3VsdDENHFNsYXNoZWQBAAgUc3Rhc2gAGGFtb3VudAgwQmF0Y2hDaGVja2VkAQAEEGVyYXM5AjRCYXRjaEZpbmlzaGVkAQAEEHNpemUENEludGVybmFsRXJyb3IBAQU0UGFyYUluY2x1c2lvbgECEDxDYW5kaWRhdGVCYWNrZWQBAxBJAiQEBERDYW5kaWRhdGVJbmNsdWRlZAEDEEkCJAQERENhbmRpZGF0ZVRpbWVkT3V0AQMMSQIkBFhVcHdhcmRNZXNzYWdlc1JlY2VpdmVkAQAIEGZyb20EFGNvdW50BBRQYXJhcwECIEhDdXJyZW50Q29kZVVwZGF0ZWQBAQJIQ3VycmVudEhlYWRVcGRhdGVkAQECUENvZGVVcGdyYWRlU2NoZWR1bGVkAQECME5ld0hlYWROb3RlZAEBAjBBY3Rpb25RdWV1ZWQBBAQBCDxQdmZDaGVja1N0YXJ0ZWQBAwggBEBQdmZDaGVja0FjY2VwdGVkAQMIIARAUHZmQ2hlY2tSZWplY3RlZAEDCCAEEEhybXABAhxQT3BlbkNoYW5uZWxSZXF1ZXN0ZWQBABAYc2VuZGVyBCRyZWNpcGllbnQEVHByb3Bvc2VkX21heF9jYXBhY2l0eQRkcHJvcG9zZWRfbWF4X21lc3NhZ2Vfc2l6ZQRMT3BlbkNoYW5uZWxDYW5jZWxlZAEACDBieV9wYXJhY2hhaW4EKGNoYW5uZWxfaWRVAkxPcGVuQ2hhbm5lbEFjY2VwdGVkAQAIGHNlbmRlcgQkcmVjaXBpZW50BDRDaGFubmVsQ2xvc2VkAQAIMGJ5X3BhcmFjaGFpbgQoY2hhbm5lbF9pZFUCWEhybXBDaGFubmVsRm9yY2VPcGVuZWQBABAYc2VuZGVyBCRyZWNpcGllbnQEVHByb3Bvc2VkX21heF9jYXBhY2l0eQRkcHJvcG9zZWRfbWF4X21lc3NhZ2Vfc2l6ZQRcSHJtcFN5c3RlbUNoYW5uZWxPcGVuZWQBABAYc2VuZGVyBCRyZWNpcGllbnQEVHByb3Bvc2VkX21heF9jYXBhY2l0eQRkcHJvcG9zZWRfbWF4X21lc3NhZ2Vfc2l6ZQRoT3BlbkNoYW5uZWxEZXBvc2l0c1VwZGF0ZWQBAAgYc2VuZGVyBCRyZWNpcGllbnQENFBhcmFzRGlzcHV0ZXMBAgxARGlzcHV0ZUluaXRpYXRlZAEDCCBdAkBEaXNwdXRlQ29uY2x1ZGVkAQMIIGECGFJldmVydAEBAiBPbkRlbWFuZAECCExPbkRlbWFuZE9yZGVyUGxhY2VkAQAMHHBhcmFfaWQEKHNwb3RfcHJpY2UIKG9yZGVyZWRfYnkAMFNwb3RQcmljZVNldAEABChzcG90X3ByaWNlCCRSZWdpc3RyYXIBAhAoUmVnaXN0ZXJlZAEACBxwYXJhX2lkBBxtYW5hZ2VyADBEZXJlZ2lzdGVyZWQBAAQccGFyYV9pZAQgUmVzZXJ2ZWQBAAgccGFyYV9pZAQMd2hvABxTd2FwcGVkAQAIHHBhcmFfaWQEIG90aGVyX2lkBBRTbG90cwECCDhOZXdMZWFzZVBlcmlvZAEABDBsZWFzZV9wZXJpb2QEGExlYXNlZAEAGBxwYXJhX2lkBBhsZWFzZXIAMHBlcmlvZF9iZWdpbgQwcGVyaW9kX2NvdW50BDhleHRyYV9yZXNlcnZlZAgwdG90YWxfYW1vdW50CCBBdWN0aW9ucwECHDhBdWN0aW9uU3RhcnRlZAEADDRhdWN0aW9uX2luZGV4BDBsZWFzZV9wZXJpb2QEGGVuZGluZwQ0QXVjdGlvbkNsb3NlZAEABDRhdWN0aW9uX2luZGV4BCBSZXNlcnZlZAEADBhiaWRkZXIAOGV4dHJhX3Jlc2VydmVkCDB0b3RhbF9hbW91bnQIKFVucmVzZXJ2ZWQBAAgYYmlkZGVyABhhbW91bnQISFJlc2VydmVDb25maXNjYXRlZAEADBxwYXJhX2lkBBhsZWFzZXIAGGFtb3VudAgsQmlkQWNjZXB0ZWQBABQYYmlkZGVyABxwYXJhX2lkBBhhbW91bnQIKGZpcnN0X3Nsb3QEJGxhc3Rfc2xvdAQ0V2lubmluZ09mZnNldAEACDRhdWN0aW9uX2luZGV4BDBibG9ja19udW1iZXIEJENyb3dkbG9hbgECKBxDcmVhdGVkAQAEHHBhcmFfaWQELENvbnRyaWJ1dGVkAQAMDHdobwAoZnVuZF9pbmRleAQYYW1vdW50CCBXaXRoZHJldwEADAx3aG8AKGZ1bmRfaW5kZXgEGGFtb3VudAhEUGFydGlhbGx5UmVmdW5kZWQBAAQccGFyYV9pZAQsQWxsUmVmdW5kZWQBAAQccGFyYV9pZAQkRGlzc29sdmVkAQAEHHBhcmFfaWQEPEhhbmRsZUJpZFJlc3VsdAEACBxwYXJhX2lkBBhyZXN1bHQxDRhFZGl0ZWQBAAQccGFyYV9pZAQsTWVtb1VwZGF0ZWQBAAwMd2hvABxwYXJhX2lkBBBtZW1vJDxBZGRlZFRvTmV3UmFpc2UBAAQccGFyYV9pZAQgQ29yZXRpbWUBAghQUmV2ZW51ZUluZm9SZXF1ZXN0ZWQBAAQQd2hlbgQwQ29yZUFzc2lnbmVkAQAEEGNvcmUESFN0YXRlVHJpZU1pZ3JhdGlvbgECECBNaWdyYXRlZAEADAx0b3AEFGNoaWxkBBxjb21wdXRlgQIcU2xhc2hlZAEACAx3aG8AGGFtb3VudAhUQXV0b01pZ3JhdGlvbkZpbmlzaGVkAQEFGEhhbHRlZAEABBRlcnJvcuQkWGNtUGFsbGV0AQJgJEF0dGVtcHRlZAEABBxvdXRjb21ljQIQU2VudAEAEBhvcmlnaW55ASxkZXN0aW5hdGlvbnkBHG1lc3NhZ2X5AihtZXNzYWdlX2lkIEhVbmV4cGVjdGVkUmVzcG9uc2UBAAgYb3JpZ2lueQEgcXVlcnlfaWQINFJlc3BvbnNlUmVhZHkBAAggcXVlcnlfaWQIIHJlc3BvbnNluQIgTm90aWZpZWQBAAwgcXVlcnlfaWQIMHBhbGxldF9pbmRleAQoY2FsbF9pbmRleARATm90aWZ5T3ZlcndlaWdodAEAFCBxdWVyeV9pZAgwcGFsbGV0X2luZGV4BChjYWxsX2luZGV4BDRhY3R1YWxfd2VpZ2h0GExtYXhfYnVkZ2V0ZWRfd2VpZ2h0GExOb3RpZnlEaXNwYXRjaEVycm9yAQAMIHF1ZXJ5X2lkCDBwYWxsZXRfaW5kZXgEKGNhbGxfaW5kZXgESE5vdGlmeURlY29kZUZhaWxlZAEADCBxdWVyeV9pZAgwcGFsbGV0X2luZGV4BChjYWxsX2luZGV4BEBJbnZhbGlkUmVzcG9uZGVyAQAMGG9yaWdpbnkBIHF1ZXJ5X2lkCERleHBlY3RlZF9sb2NhdGlvbr0CXEludmFsaWRSZXNwb25kZXJWZXJzaW9uAQAIGG9yaWdpbnkBIHF1ZXJ5X2lkCDRSZXNwb25zZVRha2VuAQAEIHF1ZXJ5X2lkCDRBc3NldHNUcmFwcGVkAQAMEGhhc2ggGG9yaWdpbnkBGGFzc2V0cxkDVFZlcnNpb25DaGFuZ2VOb3RpZmllZAEAECxkZXN0aW5hdGlvbnkBGHJlc3VsdAQQY29zdKECKG1lc3NhZ2VfaWQgXFN1cHBvcnRlZFZlcnNpb25DaGFuZ2VkAQAIIGxvY2F0aW9ueQEcdmVyc2lvbgRQTm90aWZ5VGFyZ2V0U2VuZEZhaWwBAAwgbG9jYXRpb255ASBxdWVyeV9pZAgUZXJyb3KJAmROb3RpZnlUYXJnZXRNaWdyYXRpb25GYWlsAQAIIGxvY2F0aW9umQEgcXVlcnlfaWQIVEludmFsaWRRdWVyaWVyVmVyc2lvbgEACBhvcmlnaW55ASBxdWVyeV9pZAg4SW52YWxpZFF1ZXJpZXIBABAYb3JpZ2lueQEgcXVlcnlfaWQIQGV4cGVjdGVkX3F1ZXJpZXJ5AVBtYXliZV9hY3R1YWxfcXVlcmllcr0CUFZlcnNpb25Ob3RpZnlTdGFydGVkAQAMLGRlc3RpbmF0aW9ueQEQY29zdKECKG1lc3NhZ2VfaWQgWFZlcnNpb25Ob3RpZnlSZXF1ZXN0ZWQBAAwsZGVzdGluYXRpb255ARBjb3N0oQIobWVzc2FnZV9pZCBgVmVyc2lvbk5vdGlmeVVucmVxdWVzdGVkAQAMLGRlc3RpbmF0aW9ueQEQY29zdKECKG1lc3NhZ2VfaWQgIEZlZXNQYWlkAQAIGHBheWluZ3kBEGZlZXOhAjRBc3NldHNDbGFpbWVkAQAMEGhhc2ggGG9yaWdpbnkBGGFzc2V0cxkDYFZlcnNpb25NaWdyYXRpb25GaW5pc2hlZAEABBx2ZXJzaW9uBDBNZXNzYWdlUXVldWUBAhBAUHJvY2Vzc2luZ0ZhaWxlZAEADAhpZCAYb3JpZ2luJQMUZXJyb3IpAyRQcm9jZXNzZWQBABAIaWQgGG9yaWdpbiUDLHdlaWdodF91c2VkGBxzdWNjZXNzFEhPdmVyd2VpZ2h0RW5xdWV1ZWQBABAIaWQgGG9yaWdpbiUDKHBhZ2VfaW5kZXgENG1lc3NhZ2VfaW5kZXgEKFBhZ2VSZWFwZWQBAAgYb3JpZ2luJQMUaW5kZXgEJEFzc2V0UmF0ZQECDEBBc3NldFJhdGVDcmVhdGVkAQAIKGFzc2V0X2tpbmSBARByYXRlCEBBc3NldFJhdGVSZW1vdmVkAQAEKGFzc2V0X2tpbmSBAUBBc3NldFJhdGVVcGRhdGVkAQAMKGFzc2V0X2tpbmSBAQxvbGQIDG5ldwgQU3VkbwECEBRTdWRpZAEABCxzdWRvX3Jlc3VsdDENKEtleUNoYW5nZWQBAAgMb2xkBQIMbmV3AChLZXlSZW1vdmVkAQEFKFN1ZG9Bc0RvbmUBAAQsc3Vkb19yZXN1bHQxDQAMFHBoYXNlNBRldmVudF0NGHRvcGljczkDBGENAAIoIHNjaGVkdWxlAQAQEHdoZW4EOG1heWJlX3BlcmlvZGljgQMgcHJpb3JpdHkEEGNhbGyJDRhjYW5jZWwBAAgQd2hlbgQUaW5kZXgEOHNjaGVkdWxlX25hbWVkAQAUCGlkIBB3aGVuBDhtYXliZV9wZXJpb2RpY4EDIHByaW9yaXR5BBBjYWxsiQ0wY2FuY2VsX25hbWVkAQAECGlkIDhzY2hlZHVsZV9hZnRlcgEAEBRhZnRlcgQ4bWF5YmVfcGVyaW9kaWOBAyBwcmlvcml0eQQQY2FsbIkNUHNjaGVkdWxlX25hbWVkX2FmdGVyAQAUCGlkIBRhZnRlcgQ4bWF5YmVfcGVyaW9kaWOBAyBwcmlvcml0eQQQY2FsbIkNJHNldF9yZXRyeQEADBB0YXNrDQEccmV0cmllcwQYcGVyaW9kBDxzZXRfcmV0cnlfbmFtZWQBAAwIaWQgHHJldHJpZXMEGHBlcmlvZAQwY2FuY2VsX3JldHJ5AQAEEHRhc2sNAUhjYW5jZWxfcmV0cnlfbmFtZWQBAAQIaWQgAhA4d2hpdGVsaXN0X2NhbGwBAAQkY2FsbF9oYXNoIFxyZW1vdmVfd2hpdGVsaXN0ZWRfY2FsbAEABCRjYWxsX2hhc2ggZGRpc3BhdGNoX3doaXRlbGlzdGVkX2NhbGwBAAwkY2FsbF9oYXNoIEBjYWxsX2VuY29kZWRfbGVuBExjYWxsX3dlaWdodF93aXRuZXNzGJxkaXNwYXRjaF93aGl0ZWxpc3RlZF9jYWxsX3dpdGhfcHJlaW1hZ2UBAAQQY2FsbIkNBIkNAAIYFGJhdGNoAQAEFGNhbGxzcQ00YXNfZGVyaXZhdGl2ZQEACBRpbmRleAQQY2FsbIkNJGJhdGNoX2FsbAEABBRjYWxsc3ENLGRpc3BhdGNoX2FzAQAIJGFzX29yaWdpbpUDEGNhbGyJDSxmb3JjZV9iYXRjaAEABBRjYWxsc3ENLHdpdGhfd2VpZ2h0AQAIEGNhbGyJDRh3ZWlnaHQYAigUcHJveHkBAAwQcmVhbNUDQGZvcmNlX3Byb3h5X3R5cGWFBBBjYWxsiQ0kYWRkX3Byb3h5AQAMIGRlbGVnYXRl1QMocHJveHlfdHlwZekBFGRlbGF5BDByZW1vdmVfcHJveHkBAAwgZGVsZWdhdGXVAyhwcm94eV90eXBl6QEUZGVsYXkEOHJlbW92ZV9wcm94aWVzAQEFLGNyZWF0ZV9wdXJlAQAMKHByb3h5X3R5cGXpARRkZWxheQQUaW5kZXgEJGtpbGxfcHVyZQEAFBxzcGF3bmVy1QMocHJveHlfdHlwZekBFGluZGV4BBhoZWlnaHQEJGV4dF9pbmRleAQgYW5ub3VuY2UBAAgQcmVhbNUDJGNhbGxfaGFzaCBMcmVtb3ZlX2Fubm91bmNlbWVudAEACBByZWFs1QMkY2FsbF9oYXNoIExyZWplY3RfYW5ub3VuY2VtZW50AQAIIGRlbGVnYXRl1QMkY2FsbF9oYXNoIDxwcm94eV9hbm5vdW5jZWQBABAgZGVsZWdhdGXVAxByZWFs1QNAZm9yY2VfcHJveHlfdHlwZYUEEGNhbGyJDQIQUGFzX211bHRpX3RocmVzaG9sZF8xAQAIRG90aGVyX3NpZ25hdG9yaWVz3QMQY2FsbIkNIGFzX211bHRpAQAUJHRocmVzaG9sZAREb3RoZXJfc2lnbmF0b3JpZXPdAzxtYXliZV90aW1lcG9pbnSNBBBjYWxsiQ0obWF4X3dlaWdodBhAYXBwcm92ZV9hc19tdWx0aQEAFCR0aHJlc2hvbGQERG90aGVyX3NpZ25hdG9yaWVz3QM8bWF5YmVfdGltZXBvaW50jQQkY2FsbF9oYXNoIChtYXhfd2VpZ2h0GDxjYW5jZWxfYXNfbXVsdGkBABAkdGhyZXNob2xkBERvdGhlcl9zaWduYXRvcmllc90DJHRpbWVwb2ludPEBJGNhbGxfaGFzaCACGHRzdWRvX3NjaGVkdWxlX3BhcmFfaW5pdGlhbGl6ZQEACAhpZAQcZ2VuZXNpcxUJaHN1ZG9fc2NoZWR1bGVfcGFyYV9jbGVhbnVwAQAECGlkBIBzdWRvX3NjaGVkdWxlX3BhcmF0aHJlYWRfdXBncmFkZQEABAhpZASEc3Vkb19zY2hlZHVsZV9wYXJhY2hhaW5fZG93bmdyYWRlAQAECGlkBFxzdWRvX3F1ZXVlX2Rvd253YXJkX3hjbQEACAhpZAQMeGNtqQZsc3Vkb19lc3RhYmxpc2hfaHJtcF9jaGFubmVsAQAQGHNlbmRlcgQkcmVjaXBpZW50BDBtYXhfY2FwYWNpdHkEQG1heF9tZXNzYWdlX3NpemUEAhQQc3VkbwEABBBjYWxsiQ1Uc3Vkb191bmNoZWNrZWRfd2VpZ2h0AQAIEGNhbGyJDRh3ZWlnaHQYHHNldF9rZXkBAAQMbmV31QMcc3Vkb19hcwEACAx3aG/VAxBjYWxsiQ0ocmVtb3ZlX2tleQEBBQLAGFN5c3RlbQECLBhyZW1hcmsBAAQYcmVtYXJrJDhzZXRfaGVhcF9wYWdlcwEABBRwYWdlcwggc2V0X2NvZGUBAAQQY29kZSRcc2V0X2NvZGVfd2l0aG91dF9jaGVja3MBAAQQY29kZSQsc2V0X3N0b3JhZ2UBAAQUaXRlbXN5AzBraWxsX3N0b3JhZ2UBAAQQa2V5c30DLGtpbGxfcHJlZml4AQAIGHByZWZpeCQcc3Via2V5cwREcmVtYXJrX3dpdGhfZXZlbnQBAAQYcmVtYXJrJERhdXRob3JpemVfdXBncmFkZQEABCRjb2RlX2hhc2gggGF1dGhvcml6ZV91cGdyYWRlX3dpdGhvdXRfY2hlY2tzAQAEJGNvZGVfaGFzaCBgYXBwbHlfYXV0aG9yaXplZF91cGdyYWRlAQAEEGNvZGUkJFNjaGVkdWxlcgECKCBzY2hlZHVsZQEAEBB3aGVuBDhtYXliZV9wZXJpb2RpY4EDIHByaW9yaXR5BBBjYWxsiQ0YY2FuY2VsAQAIEHdoZW4EFGluZGV4BDhzY2hlZHVsZV9uYW1lZAEAFAhpZCAQd2hlbgQ4bWF5YmVfcGVyaW9kaWOBAyBwcmlvcml0eQQQY2FsbIkNMGNhbmNlbF9uYW1lZAEABAhpZCA4c2NoZWR1bGVfYWZ0ZXIBABAUYWZ0ZXIEOG1heWJlX3BlcmlvZGljgQMgcHJpb3JpdHkEEGNhbGyJDVBzY2hlZHVsZV9uYW1lZF9hZnRlcgEAFAhpZCAUYWZ0ZXIEOG1heWJlX3BlcmlvZGljgQMgcHJpb3JpdHkEEGNhbGyJDSRzZXRfcmV0cnkBAAwQdGFzaw0BHHJldHJpZXMEGHBlcmlvZAQ8c2V0X3JldHJ5X25hbWVkAQAMCGlkIBxyZXRyaWVzBBhwZXJpb2QEMGNhbmNlbF9yZXRyeQEABBB0YXNrDQFIY2FuY2VsX3JldHJ5X25hbWVkAQAECGlkICBQcmVpbWFnZQECFDRub3RlX3ByZWltYWdlAQAEFGJ5dGVzJDx1bm5vdGVfcHJlaW1hZ2UBAAQQaGFzaCBAcmVxdWVzdF9wcmVpbWFnZQEABBBoYXNoIEh1bnJlcXVlc3RfcHJlaW1hZ2UBAAQQaGFzaCA4ZW5zdXJlX3VwZGF0ZWQBAAQYaGFzaGVzOQMQQmFiZQECDExyZXBvcnRfZXF1aXZvY2F0aW9uAQAISGVxdWl2b2NhdGlvbl9wcm9vZrkDPGtleV9vd25lcl9wcm9vZr0DcHJlcG9ydF9lcXVpdm9jYXRpb25fdW5zaWduZWQBAAhIZXF1aXZvY2F0aW9uX3Byb29muQM8a2V5X293bmVyX3Byb29mvQNIcGxhbl9jb25maWdfY2hhbmdlAQAEGGNvbmZpZ8kDJFRpbWVzdGFtcAECBAxzZXQBAAQMbm93CBxJbmRpY2VzAQIUFGNsYWltAQAEFGluZGV4BCB0cmFuc2ZlcgEACAxuZXfVAxRpbmRleAQQZnJlZQEABBRpbmRleAQ4Zm9yY2VfdHJhbnNmZXIBAAwMbmV31QMUaW5kZXgEGGZyZWV6ZRQYZnJlZXplAQAEFGluZGV4BCBCYWxhbmNlcwECJFB0cmFuc2Zlcl9hbGxvd19kZWF0aAEACBBkZXN01QMUdmFsdWUIOGZvcmNlX3RyYW5zZmVyAQAMGHNvdXJjZdUDEGRlc3TVAxR2YWx1ZQhMdHJhbnNmZXJfa2VlcF9hbGl2ZQEACBBkZXN01QMUdmFsdWUIMHRyYW5zZmVyX2FsbAEACBBkZXN01QMoa2VlcF9hbGl2ZRQ8Zm9yY2VfdW5yZXNlcnZlAQAIDHdob9UDGGFtb3VudAhAdXBncmFkZV9hY2NvdW50cwEABAx3aG/dA0Rmb3JjZV9zZXRfYmFsYW5jZQEACAx3aG/VAyBuZXdfZnJlZQhsZm9yY2VfYWRqdXN0X3RvdGFsX2lzc3VhbmNlAQAIJGRpcmVjdGlvbuEDFGRlbHRhCBBidXJuAQAIFHZhbHVlCChrZWVwX2FsaXZlFBxTdGFraW5nAQJ4EGJvbmQBAAgUdmFsdWUIFHBheWVlNQEoYm9uZF9leHRyYQEABDhtYXhfYWRkaXRpb25hbAgYdW5ib25kAQAEFHZhbHVlCER3aXRoZHJhd191bmJvbmRlZAEABEhudW1fc2xhc2hpbmdfc3BhbnMEIHZhbGlkYXRlAQAEFHByZWZzOQEgbm9taW5hdGUBAAQcdGFyZ2V0c+kDFGNoaWxsAQEFJHNldF9wYXllZQEABBRwYXllZTUBOHNldF9jb250cm9sbGVyAQEFTHNldF92YWxpZGF0b3JfY291bnQBAAQMbmV3BGBpbmNyZWFzZV92YWxpZGF0b3JfY291bnQBAAQoYWRkaXRpb25hbARUc2NhbGVfdmFsaWRhdG9yX2NvdW50AQAEGGZhY3RvcgQ0Zm9yY2Vfbm9fZXJhcwEBBTRmb3JjZV9uZXdfZXJhAQEFRHNldF9pbnZ1bG5lcmFibGVzAQAENGludnVsbmVyYWJsZXPdAzRmb3JjZV91bnN0YWtlAQAIFHN0YXNoAEhudW1fc2xhc2hpbmdfc3BhbnMEUGZvcmNlX25ld19lcmFfYWx3YXlzAQEFVGNhbmNlbF9kZWZlcnJlZF9zbGFzaAEACAxlcmEENHNsYXNoX2luZGljZXM5AjhwYXlvdXRfc3Rha2VycwEACDx2YWxpZGF0b3Jfc3Rhc2gADGVyYQQYcmVib25kAQAEFHZhbHVlCChyZWFwX3N0YXNoAQAIFHN0YXNoAEhudW1fc2xhc2hpbmdfc3BhbnMEEGtpY2sBAAQMd2hv6QNMc2V0X3N0YWtpbmdfY29uZmlncwEAHEhtaW5fbm9taW5hdG9yX2JvbmTtA0htaW5fdmFsaWRhdG9yX2JvbmTtA0xtYXhfbm9taW5hdG9yX2NvdW508QNMbWF4X3ZhbGlkYXRvcl9jb3VudPEDPGNoaWxsX3RocmVzaG9sZPEDOG1pbl9jb21taXNzaW9u8QNIbWF4X3N0YWtlZF9yZXdhcmRz8QMsY2hpbGxfb3RoZXIBAAQUc3Rhc2gAaGZvcmNlX2FwcGx5X21pbl9jb21taXNzaW9uAQAEPHZhbGlkYXRvcl9zdGFzaABIc2V0X21pbl9jb21taXNzaW9uAQAEDG5ldwRYcGF5b3V0X3N0YWtlcnNfYnlfcGFnZQEADDx2YWxpZGF0b3Jfc3Rhc2gADGVyYQQQcGFnZQQwdXBkYXRlX3BheWVlAQAEKGNvbnRyb2xsZXIAaGRlcHJlY2F0ZV9jb250cm9sbGVyX2JhdGNoAQAELGNvbnRyb2xsZXJz3QM4cmVzdG9yZV9sZWRnZXIBABAUc3Rhc2gAQG1heWJlX2NvbnRyb2xsZXIFAixtYXliZV90b3RhbPUDPG1heWJlX3VubG9ja2luZwEEHFNlc3Npb24BAgggc2V0X2tleXMBAAgQa2V5cw0EFHByb29mJChwdXJnZV9rZXlzAQEFHEdyYW5kcGEBAgxMcmVwb3J0X2VxdWl2b2NhdGlvbgEACEhlcXVpdm9jYXRpb25fcHJvb2YlBDxrZXlfb3duZXJfcHJvb2a9A3ByZXBvcnRfZXF1aXZvY2F0aW9uX3Vuc2lnbmVkAQAISGVxdWl2b2NhdGlvbl9wcm9vZiUEPGtleV9vd25lcl9wcm9vZr0DMG5vdGVfc3RhbGxlZAEACBRkZWxheQRsYmVzdF9maW5hbGl6ZWRfYmxvY2tfbnVtYmVyBCBUcmVhc3VyeQECGCxzcGVuZF9sb2NhbAEACBhhbW91bnQILGJlbmVmaWNpYXJ51QM8cmVtb3ZlX2FwcHJvdmFsAQAELHByb3Bvc2FsX2lkBBRzcGVuZAEAEChhc3NldF9raW5kgQEYYW1vdW50CCxiZW5lZmljaWFyeZkBKHZhbGlkX2Zyb20tBBhwYXlvdXQBAAQUaW5kZXgEMGNoZWNrX3N0YXR1cwEABBRpbmRleAQodm9pZF9zcGVuZAEABBRpbmRleARAQ29udmljdGlvblZvdGluZwECGBB2b3RlAQAIKHBvbGxfaW5kZXgEEHZvdGU1BCBkZWxlZ2F0ZQEAEBRjbGFzcwQIdG/VAyhjb252aWN0aW9uOQQcYmFsYW5jZQgodW5kZWxlZ2F0ZQEABBRjbGFzcwQYdW5sb2NrAQAIFGNsYXNzBBh0YXJnZXTVAyxyZW1vdmVfdm90ZQEACBRjbGFzcy0EFGluZGV4BERyZW1vdmVfb3RoZXJfdm90ZQEADBh0YXJnZXTVAxRjbGFzcwQUaW5kZXgEJFJlZmVyZW5kYQECJBhzdWJtaXQBAAw8cHJvcG9zYWxfb3JpZ2lulQMgcHJvcG9zYWylAUBlbmFjdG1lbnRfbW9tZW50QQRYcGxhY2VfZGVjaXNpb25fZGVwb3NpdAEABBRpbmRleARccmVmdW5kX2RlY2lzaW9uX2RlcG9zaXQBAAQUaW5kZXgEGGNhbmNlbAEABBRpbmRleAQQa2lsbAEABBRpbmRleARAbnVkZ2VfcmVmZXJlbmR1bQEABBRpbmRleARIb25lX2Zld2VyX2RlY2lkaW5nAQAEFHRyYWNrBGRyZWZ1bmRfc3VibWlzc2lvbl9kZXBvc2l0AQAEFGluZGV4BDBzZXRfbWV0YWRhdGEBAAgUaW5kZXgEKG1heWJlX2hhc2gRASRXaGl0ZWxpc3QBAhA4d2hpdGVsaXN0X2NhbGwBAAQkY2FsbF9oYXNoIFxyZW1vdmVfd2hpdGVsaXN0ZWRfY2FsbAEABCRjYWxsX2hhc2ggZGRpc3BhdGNoX3doaXRlbGlzdGVkX2NhbGwBAAwkY2FsbF9oYXNoIEBjYWxsX2VuY29kZWRfbGVuBExjYWxsX3dlaWdodF93aXRuZXNzGJxkaXNwYXRjaF93aGl0ZWxpc3RlZF9jYWxsX3dpdGhfcHJlaW1hZ2UBAAQQY2FsbIkNKFBhcmFtZXRlcnMBAgQ0c2V0X3BhcmFtZXRlcgEABCRrZXlfdmFsdWVVBBhDbGFpbXMBAhQUY2xhaW0BAAgQZGVzdABIZXRoZXJldW1fc2lnbmF0dXJlXQQobWludF9jbGFpbQEAEAx3aG9lARR2YWx1ZQhAdmVzdGluZ19zY2hlZHVsZWUEJHN0YXRlbWVudG0EMGNsYWltX2F0dGVzdAEADBBkZXN0AEhldGhlcmV1bV9zaWduYXR1cmVdBCRzdGF0ZW1lbnQkGGF0dGVzdAEABCRzdGF0ZW1lbnQkKG1vdmVfY2xhaW0BAAwMb2xkZQEMbmV3ZQE4bWF5YmVfcHJlY2xhaW0FAhxWZXN0aW5nAQIYEHZlc3QBAQUodmVzdF9vdGhlcgEABBh0YXJnZXTVAzx2ZXN0ZWRfdHJhbnNmZXIBAAgYdGFyZ2V01QMgc2NoZWR1bGV1BFRmb3JjZV92ZXN0ZWRfdHJhbnNmZXIBAAwYc291cmNl1QMYdGFyZ2V01QMgc2NoZWR1bGV1BDxtZXJnZV9zY2hlZHVsZXMBAAg8c2NoZWR1bGUxX2luZGV4BDxzY2hlZHVsZTJfaW5kZXgEdGZvcmNlX3JlbW92ZV92ZXN0aW5nX3NjaGVkdWxlAQAIGHRhcmdldNUDOHNjaGVkdWxlX2luZGV4BBxVdGlsaXR5AQIYFGJhdGNoAQAEFGNhbGxzcQ00YXNfZGVyaXZhdGl2ZQEACBRpbmRleAQQY2FsbIkNJGJhdGNoX2FsbAEABBRjYWxsc3ENLGRpc3BhdGNoX2FzAQAIJGFzX29yaWdpbpUDEGNhbGyJDSxmb3JjZV9iYXRjaAEABBRjYWxsc3ENLHdpdGhfd2VpZ2h0AQAIEGNhbGyJDRh3ZWlnaHQYFFByb3h5AQIoFHByb3h5AQAMEHJlYWzVA0Bmb3JjZV9wcm94eV90eXBlhQQQY2FsbIkNJGFkZF9wcm94eQEADCBkZWxlZ2F0ZdUDKHByb3h5X3R5cGXpARRkZWxheQQwcmVtb3ZlX3Byb3h5AQAMIGRlbGVnYXRl1QMocHJveHlfdHlwZekBFGRlbGF5BDhyZW1vdmVfcHJveGllcwEBBSxjcmVhdGVfcHVyZQEADChwcm94eV90eXBl6QEUZGVsYXkEFGluZGV4BCRraWxsX3B1cmUBABQcc3Bhd25lctUDKHByb3h5X3R5cGXpARRpbmRleAQYaGVpZ2h0BCRleHRfaW5kZXgEIGFubm91bmNlAQAIEHJlYWzVAyRjYWxsX2hhc2ggTHJlbW92ZV9hbm5vdW5jZW1lbnQBAAgQcmVhbNUDJGNhbGxfaGFzaCBMcmVqZWN0X2Fubm91bmNlbWVudAEACCBkZWxlZ2F0ZdUDJGNhbGxfaGFzaCA8cHJveHlfYW5ub3VuY2VkAQAQIGRlbGVnYXRl1QMQcmVhbNUDQGZvcmNlX3Byb3h5X3R5cGWFBBBjYWxsiQ0gTXVsdGlzaWcBAhBQYXNfbXVsdGlfdGhyZXNob2xkXzEBAAhEb3RoZXJfc2lnbmF0b3JpZXPdAxBjYWxsiQ0gYXNfbXVsdGkBABQkdGhyZXNob2xkBERvdGhlcl9zaWduYXRvcmllc90DPG1heWJlX3RpbWVwb2ludI0EEGNhbGyJDShtYXhfd2VpZ2h0GEBhcHByb3ZlX2FzX211bHRpAQAUJHRocmVzaG9sZAREb3RoZXJfc2lnbmF0b3JpZXPdAzxtYXliZV90aW1lcG9pbnSNBCRjYWxsX2hhc2ggKG1heF93ZWlnaHQYPGNhbmNlbF9hc19tdWx0aQEAECR0aHJlc2hvbGQERG90aGVyX3NpZ25hdG9yaWVz3QMkdGltZXBvaW508QEkY2FsbF9oYXNoICBCb3VudGllcwECJDhwcm9wb3NlX2JvdW50eQEACBR2YWx1ZQgsZGVzY3JpcHRpb24kOGFwcHJvdmVfYm91bnR5AQAEJGJvdW50eV9pZAQ8cHJvcG9zZV9jdXJhdG9yAQAMJGJvdW50eV9pZAQcY3VyYXRvctUDDGZlZQhAdW5hc3NpZ25fY3VyYXRvcgEABCRib3VudHlfaWQEOGFjY2VwdF9jdXJhdG9yAQAEJGJvdW50eV9pZAQwYXdhcmRfYm91bnR5AQAIJGJvdW50eV9pZAQsYmVuZWZpY2lhcnnVAzBjbGFpbV9ib3VudHkBAAQkYm91bnR5X2lkBDBjbG9zZV9ib3VudHkBAAQkYm91bnR5X2lkBFBleHRlbmRfYm91bnR5X2V4cGlyeQEACCRib3VudHlfaWQEGHJlbWFyayQ0Q2hpbGRCb3VudGllcwECHEBhZGRfY2hpbGRfYm91bnR5AQAMQHBhcmVudF9ib3VudHlfaWQEFHZhbHVlCCxkZXNjcmlwdGlvbiQ8cHJvcG9zZV9jdXJhdG9yAQAQQHBhcmVudF9ib3VudHlfaWQEPGNoaWxkX2JvdW50eV9pZAQcY3VyYXRvctUDDGZlZQg4YWNjZXB0X2N1cmF0b3IBAAhAcGFyZW50X2JvdW50eV9pZAQ8Y2hpbGRfYm91bnR5X2lkBEB1bmFzc2lnbl9jdXJhdG9yAQAIQHBhcmVudF9ib3VudHlfaWQEPGNoaWxkX2JvdW50eV9pZARIYXdhcmRfY2hpbGRfYm91bnR5AQAMQHBhcmVudF9ib3VudHlfaWQEPGNoaWxkX2JvdW50eV9pZAQsYmVuZWZpY2lhcnnVA0hjbGFpbV9jaGlsZF9ib3VudHkBAAhAcGFyZW50X2JvdW50eV9pZAQ8Y2hpbGRfYm91bnR5X2lkBEhjbG9zZV9jaGlsZF9ib3VudHkBAAhAcGFyZW50X2JvdW50eV9pZAQ8Y2hpbGRfYm91bnR5X2lkBGhFbGVjdGlvblByb3ZpZGVyTXVsdGlQaGFzZQECFDxzdWJtaXRfdW5zaWduZWQBAAgwcmF3X3NvbHV0aW9uWQUcd2l0bmVzc10FbHNldF9taW5pbXVtX3VudHJ1c3RlZF9zY29yZQEABEBtYXliZV9uZXh0X3Njb3JlYQV0c2V0X2VtZXJnZW5jeV9lbGVjdGlvbl9yZXN1bHQBAAQgc3VwcG9ydHN1BRhzdWJtaXQBAAQwcmF3X3NvbHV0aW9uWQVMZ292ZXJuYW5jZV9mYWxsYmFjawEACEBtYXliZV9tYXhfdm90ZXJzLQREbWF5YmVfbWF4X3RhcmdldHMtBCRWb3Rlckxpc3QBAgwUcmViYWcBAAQoZGlzbG9jYXRlZNUDPHB1dF9pbl9mcm9udF9vZgEABBxsaWdodGVy1QNUcHV0X2luX2Zyb250X29mX290aGVyAQAIHGhlYXZpZXLVAxxsaWdodGVy1QM8Tm9taW5hdGlvblBvb2xzAQJoEGpvaW4BAAgYYW1vdW50CBxwb29sX2lkBChib25kX2V4dHJhAQAEFGV4dHJhgQUwY2xhaW1fcGF5b3V0AQEFGHVuYm9uZAEACDhtZW1iZXJfYWNjb3VudNUDQHVuYm9uZGluZ19wb2ludHMIWHBvb2xfd2l0aGRyYXdfdW5ib25kZWQBAAgccG9vbF9pZARIbnVtX3NsYXNoaW5nX3NwYW5zBER3aXRoZHJhd191bmJvbmRlZAEACDhtZW1iZXJfYWNjb3VudNUDSG51bV9zbGFzaGluZ19zcGFucwQYY3JlYXRlAQAQGGFtb3VudAgQcm9vdNUDJG5vbWluYXRvctUDHGJvdW5jZXLVA0xjcmVhdGVfd2l0aF9wb29sX2lkAQAUGGFtb3VudAgQcm9vdNUDJG5vbWluYXRvctUDHGJvdW5jZXLVAxxwb29sX2lkBCBub21pbmF0ZQEACBxwb29sX2lkBCh2YWxpZGF0b3Jz3QMkc2V0X3N0YXRlAQAIHHBvb2xfaWQEFHN0YXRlHQIwc2V0X21ldGFkYXRhAQAIHHBvb2xfaWQEIG1ldGFkYXRhJCxzZXRfY29uZmlncwEAGDRtaW5fam9pbl9ib25k7QM8bWluX2NyZWF0ZV9ib25k7QMkbWF4X3Bvb2xz8QMsbWF4X21lbWJlcnPxA1BtYXhfbWVtYmVyc19wZXJfcG9vbPEDVGdsb2JhbF9tYXhfY29tbWlzc2lvbvEDMHVwZGF0ZV9yb2xlcwEAEBxwb29sX2lkBCBuZXdfcm9vdIUFNG5ld19ub21pbmF0b3KFBSxuZXdfYm91bmNlcoUFFGNoaWxsAQAEHHBvb2xfaWQEQGJvbmRfZXh0cmFfb3RoZXIBAAgYbWVtYmVy1QMUZXh0cmGBBVBzZXRfY2xhaW1fcGVybWlzc2lvbgEABChwZXJtaXNzaW9uiQVIY2xhaW1fcGF5b3V0X290aGVyAQAEFG90aGVyADhzZXRfY29tbWlzc2lvbgEACBxwb29sX2lkBDhuZXdfY29tbWlzc2lvbiUCSHNldF9jb21taXNzaW9uX21heAEACBxwb29sX2lkBDhtYXhfY29tbWlzc2lvbgRoc2V0X2NvbW1pc3Npb25fY2hhbmdlX3JhdGUBAAgccG9vbF9pZAQsY2hhbmdlX3JhdGUpAkBjbGFpbV9jb21taXNzaW9uAQAEHHBvb2xfaWQETGFkanVzdF9wb29sX2RlcG9zaXQBAAQccG9vbF9pZAR8c2V0X2NvbW1pc3Npb25fY2xhaW1fcGVybWlzc2lvbgEACBxwb29sX2lkBChwZXJtaXNzaW9uMQIsYXBwbHlfc2xhc2gBAAQ4bWVtYmVyX2FjY291bnTVA0htaWdyYXRlX2RlbGVnYXRpb24BAAQ4bWVtYmVyX2FjY291bnTVA3htaWdyYXRlX3Bvb2xfdG9fZGVsZWdhdGVfc3Rha2UBAAQccG9vbF9pZAQsRmFzdFVuc3Rha2UBAgxUcmVnaXN0ZXJfZmFzdF91bnN0YWtlAQEFKGRlcmVnaXN0ZXIBAQUcY29udHJvbAEABDRlcmFzX3RvX2NoZWNrBDRDb25maWd1cmF0aW9uAQLAfHNldF92YWxpZGF0aW9uX3VwZ3JhZGVfY29vbGRvd24BAAQMbmV3BHBzZXRfdmFsaWRhdGlvbl91cGdyYWRlX2RlbGF5AQAEDG5ldwRkc2V0X2NvZGVfcmV0ZW50aW9uX3BlcmlvZAEABAxuZXcERHNldF9tYXhfY29kZV9zaXplAQAEDG5ldwRAc2V0X21heF9wb3Zfc2l6ZQEABAxuZXcEWHNldF9tYXhfaGVhZF9kYXRhX3NpemUBAAQMbmV3BEhzZXRfY29yZXRpbWVfY29yZXMBAAQMbmV3BHRzZXRfbWF4X2F2YWlsYWJpbGl0eV90aW1lb3V0cwEABAxuZXcEcHNldF9ncm91cF9yb3RhdGlvbl9mcmVxdWVuY3kBAAQMbmV3BHRzZXRfcGFyYXNfYXZhaWxhYmlsaXR5X3BlcmlvZAEABAxuZXcEYHNldF9zY2hlZHVsaW5nX2xvb2thaGVhZAEABAxuZXcEbHNldF9tYXhfdmFsaWRhdG9yc19wZXJfY29yZQEABAxuZXctBEhzZXRfbWF4X3ZhbGlkYXRvcnMBAAQMbmV3LQRIc2V0X2Rpc3B1dGVfcGVyaW9kAQAEDG5ldwS0c2V0X2Rpc3B1dGVfcG9zdF9jb25jbHVzaW9uX2FjY2VwdGFuY2VfcGVyaW9kAQAEDG5ldwREc2V0X25vX3Nob3dfc2xvdHMBAAQMbmV3BFBzZXRfbl9kZWxheV90cmFuY2hlcwEABAxuZXcEeHNldF96ZXJvdGhfZGVsYXlfdHJhbmNoZV93aWR0aAEABAxuZXcEUHNldF9uZWVkZWRfYXBwcm92YWxzAQAEDG5ldwRwc2V0X3JlbGF5X3ZyZl9tb2R1bG9fc2FtcGxlcwEABAxuZXcEaHNldF9tYXhfdXB3YXJkX3F1ZXVlX2NvdW50AQAEDG5ldwRkc2V0X21heF91cHdhcmRfcXVldWVfc2l6ZQEABAxuZXcEdHNldF9tYXhfZG93bndhcmRfbWVzc2FnZV9zaXplAQAEDG5ldwRsc2V0X21heF91cHdhcmRfbWVzc2FnZV9zaXplAQAEDG5ldwSgc2V0X21heF91cHdhcmRfbWVzc2FnZV9udW1fcGVyX2NhbmRpZGF0ZQEABAxuZXcEZHNldF9ocm1wX29wZW5fcmVxdWVzdF90dGwBAAQMbmV3BFxzZXRfaHJtcF9zZW5kZXJfZGVwb3NpdAEABAxuZXcIaHNldF9ocm1wX3JlY2lwaWVudF9kZXBvc2l0AQAEDG5ldwh0c2V0X2hybXBfY2hhbm5lbF9tYXhfY2FwYWNpdHkBAAQMbmV3BHxzZXRfaHJtcF9jaGFubmVsX21heF90b3RhbF9zaXplAQAEDG5ldwScc2V0X2hybXBfbWF4X3BhcmFjaGFpbl9pbmJvdW5kX2NoYW5uZWxzAQAEDG5ldwSEc2V0X2hybXBfY2hhbm5lbF9tYXhfbWVzc2FnZV9zaXplAQAEDG5ldwSgc2V0X2hybXBfbWF4X3BhcmFjaGFpbl9vdXRib3VuZF9jaGFubmVscwEABAxuZXcEmHNldF9ocm1wX21heF9tZXNzYWdlX251bV9wZXJfY2FuZGlkYXRlAQAEDG5ldwRIc2V0X3B2Zl92b3RpbmdfdHRsAQAEDG5ldwSQc2V0X21pbmltdW1fdmFsaWRhdGlvbl91cGdyYWRlX2RlbGF5AQAEDG5ldwRwc2V0X2J5cGFzc19jb25zaXN0ZW5jeV9jaGVjawEABAxuZXcUYHNldF9hc3luY19iYWNraW5nX3BhcmFtcwEABAxuZXeVBUxzZXRfZXhlY3V0b3JfcGFyYW1zAQAEDG5ld6UFWHNldF9vbl9kZW1hbmRfYmFzZV9mZWUBAAQMbmV3CHRzZXRfb25fZGVtYW5kX2ZlZV92YXJpYWJpbGl0eQEABAxuZXcEcHNldF9vbl9kZW1hbmRfcXVldWVfbWF4X3NpemUBAAQMbmV3BJhzZXRfb25fZGVtYW5kX3RhcmdldF9xdWV1ZV91dGlsaXphdGlvbgEABAxuZXcERHNldF9vbl9kZW1hbmRfdHRsAQAEDG5ldwRkc2V0X21pbmltdW1fYmFja2luZ192b3RlcwEABAxuZXcEQHNldF9ub2RlX2ZlYXR1cmUBAAgUaW5kZXgEFHZhbHVlFGhzZXRfYXBwcm92YWxfdm90aW5nX3BhcmFtcwEABAxuZXcEUHNldF9zY2hlZHVsZXJfcGFyYW1zAQAEDG5ld6kFLFBhcmFzU2hhcmVkAQEFNFBhcmFJbmNsdXNpb24BAQUwUGFyYUluaGVyZW50AQIEFGVudGVyAQAEEGRhdGH9BRRQYXJhcwECJFhmb3JjZV9zZXRfY3VycmVudF9jb2RlAQAIEHBhcmEEIG5ld19jb2RlJFhmb3JjZV9zZXRfY3VycmVudF9oZWFkAQAIEHBhcmEEIG5ld19oZWFkJGxmb3JjZV9zY2hlZHVsZV9jb2RlX3VwZ3JhZGUBAAwQcGFyYQQgbmV3X2NvZGUkTHJlbGF5X3BhcmVudF9udW1iZXIETGZvcmNlX25vdGVfbmV3X2hlYWQBAAgQcGFyYQQgbmV3X2hlYWQkSGZvcmNlX3F1ZXVlX2FjdGlvbgEABBBwYXJhBGxhZGRfdHJ1c3RlZF92YWxpZGF0aW9uX2NvZGUBAAQ8dmFsaWRhdGlvbl9jb2RlJGxwb2tlX3VudXNlZF92YWxpZGF0aW9uX2NvZGUBAARQdmFsaWRhdGlvbl9jb2RlX2hhc2ggbGluY2x1ZGVfcHZmX2NoZWNrX3N0YXRlbWVudAEACBBzdG10BQYkc2lnbmF0dXJlQQJ0Zm9yY2Vfc2V0X21vc3RfcmVjZW50X2NvbnRleHQBAAgQcGFyYQQcY29udGV4dAQsSW5pdGlhbGl6ZXIBAgQ0Zm9yY2VfYXBwcm92ZQEABBR1cF90bwQQSHJtcAECLFhocm1wX2luaXRfb3Blbl9jaGFubmVsAQAMJHJlY2lwaWVudARUcHJvcG9zZWRfbWF4X2NhcGFjaXR5BGRwcm9wb3NlZF9tYXhfbWVzc2FnZV9zaXplBGBocm1wX2FjY2VwdF9vcGVuX2NoYW5uZWwBAAQYc2VuZGVyBEhocm1wX2Nsb3NlX2NoYW5uZWwBAAQoY2hhbm5lbF9pZFUCQGZvcmNlX2NsZWFuX2hybXABAAwQcGFyYQQsbnVtX2luYm91bmQEMG51bV9vdXRib3VuZARcZm9yY2VfcHJvY2Vzc19ocm1wX29wZW4BAAQgY2hhbm5lbHMEYGZvcmNlX3Byb2Nlc3NfaHJtcF9jbG9zZQEABCBjaGFubmVscwRgaHJtcF9jYW5jZWxfb3Blbl9yZXF1ZXN0AQAIKGNoYW5uZWxfaWRVAjRvcGVuX3JlcXVlc3RzBFxmb3JjZV9vcGVuX2hybXBfY2hhbm5lbAEAEBhzZW5kZXIEJHJlY2lwaWVudAQwbWF4X2NhcGFjaXR5BEBtYXhfbWVzc2FnZV9zaXplBGBlc3RhYmxpc2hfc3lzdGVtX2NoYW5uZWwBAAgYc2VuZGVyBCRyZWNpcGllbnQEVHBva2VfY2hhbm5lbF9kZXBvc2l0cwEACBhzZW5kZXIEJHJlY2lwaWVudAR0ZXN0YWJsaXNoX2NoYW5uZWxfd2l0aF9zeXN0ZW0BAARMdGFyZ2V0X3N5c3RlbV9jaGFpbgQ0UGFyYXNEaXNwdXRlcwECBDhmb3JjZV91bmZyZWV6ZQEBBTRQYXJhc1NsYXNoaW5nAQIEcHJlcG9ydF9kaXNwdXRlX2xvc3RfdW5zaWduZWQBAAg0ZGlzcHV0ZV9wcm9vZiEGPGtleV9vd25lcl9wcm9vZr0DIE9uRGVtYW5kAQIIXHBsYWNlX29yZGVyX2FsbG93X2RlYXRoAQAIKG1heF9hbW91bnQIHHBhcmFfaWQEWHBsYWNlX29yZGVyX2tlZXBfYWxpdmUBAAgobWF4X2Ftb3VudAgccGFyYV9pZAQkUmVnaXN0cmFyAQIkIHJlZ2lzdGVyAQAMCGlkBDBnZW5lc2lzX2hlYWQkPHZhbGlkYXRpb25fY29kZSQ4Zm9yY2VfcmVnaXN0ZXIBABQMd2hvABxkZXBvc2l0CAhpZAQwZ2VuZXNpc19oZWFkJDx2YWxpZGF0aW9uX2NvZGUkKGRlcmVnaXN0ZXIBAAQIaWQEEHN3YXABAAgIaWQEFG90aGVyBCxyZW1vdmVfbG9jawEABBBwYXJhBBxyZXNlcnZlAQEFIGFkZF9sb2NrAQAEEHBhcmEEVHNjaGVkdWxlX2NvZGVfdXBncmFkZQEACBBwYXJhBCBuZXdfY29kZSRAc2V0X2N1cnJlbnRfaGVhZAEACBBwYXJhBCBuZXdfaGVhZCQUU2xvdHMBAgwsZm9yY2VfbGVhc2UBABQQcGFyYQQYbGVhc2VyABhhbW91bnQIMHBlcmlvZF9iZWdpbgQwcGVyaW9kX2NvdW50BEBjbGVhcl9hbGxfbGVhc2VzAQAEEHBhcmEEPHRyaWdnZXJfb25ib2FyZAEABBBwYXJhBCBBdWN0aW9ucwECDCxuZXdfYXVjdGlvbgEACCBkdXJhdGlvbgRIbGVhc2VfcGVyaW9kX2luZGV4BAxiaWQBABQQcGFyYQQ0YXVjdGlvbl9pbmRleAQoZmlyc3Rfc2xvdAQkbGFzdF9zbG90BBhhbW91bnQIOGNhbmNlbF9hdWN0aW9uAQEFJENyb3dkbG9hbgECJBhjcmVhdGUBABgUaW5kZXgEDGNhcAgwZmlyc3RfcGVyaW9kBCxsYXN0X3BlcmlvZAQMZW5kBCB2ZXJpZmllcj0GKGNvbnRyaWJ1dGUBAAwUaW5kZXgEFHZhbHVlCCRzaWduYXR1cmVFBiB3aXRoZHJhdwEACAx3aG8AFGluZGV4BBhyZWZ1bmQBAAQUaW5kZXgEIGRpc3NvbHZlAQAEFGluZGV4BBBlZGl0AQAYFGluZGV4BAxjYXAIMGZpcnN0X3BlcmlvZAQsbGFzdF9wZXJpb2QEDGVuZAQgdmVyaWZpZXI9BiBhZGRfbWVtbwEACBRpbmRleAQQbWVtbyQQcG9rZQEABBRpbmRleAQ4Y29udHJpYnV0ZV9hbGwBAAgUaW5kZXgEJHNpZ25hdHVyZUUGIENvcmV0aW1lAQIMSHJlcXVlc3RfY29yZV9jb3VudAEABBRjb3VudARIcmVxdWVzdF9yZXZlbnVlX2F0AQAEEHdoZW4ELGFzc2lnbl9jb3JlAQAQEGNvcmUEFGJlZ2luBChhc3NpZ25tZW50VQYgZW5kX2hpbnQtBEhTdGF0ZVRyaWVNaWdyYXRpb24BAhhYY29udHJvbF9hdXRvX21pZ3JhdGlvbgEABDBtYXliZV9jb25maWdhBkBjb250aW51ZV9taWdyYXRlAQAMGGxpbWl0c10GPHJlYWxfc2l6ZV91cHBlcgQwd2l0bmVzc190YXNraQZIbWlncmF0ZV9jdXN0b21fdG9wAQAIEGtleXN9AzB3aXRuZXNzX3NpemUEUG1pZ3JhdGVfY3VzdG9tX2NoaWxkAQAMEHJvb3QkKGNoaWxkX2tleXN9Ayh0b3RhbF9zaXplBFRzZXRfc2lnbmVkX21heF9saW1pdHMBAAQYbGltaXRzXQZIZm9yY2Vfc2V0X3Byb2dyZXNzAQAIMHByb2dyZXNzX3RvcGUGOHByb2dyZXNzX2NoaWxkZQYkWGNtUGFsbGV0AQI4EHNlbmQBAAgQZGVzdJkBHG1lc3NhZ2WpBjx0ZWxlcG9ydF9hc3NldHMBABAQZGVzdJkBLGJlbmVmaWNpYXJ5mQEYYXNzZXRzGQM4ZmVlX2Fzc2V0X2l0ZW0EXHJlc2VydmVfdHJhbnNmZXJfYXNzZXRzAQAQEGRlc3SZASxiZW5lZmljaWFyeZkBGGFzc2V0cxkDOGZlZV9hc3NldF9pdGVtBBxleGVjdXRlAQAIHG1lc3NhZ2WpBihtYXhfd2VpZ2h0GERmb3JjZV94Y21fdmVyc2lvbgEACCBsb2NhdGlvbnkBHHZlcnNpb24EZGZvcmNlX2RlZmF1bHRfeGNtX3ZlcnNpb24BAAREbWF5YmVfeGNtX3ZlcnNpb24tBHhmb3JjZV9zdWJzY3JpYmVfdmVyc2lvbl9ub3RpZnkBAAQgbG9jYXRpb26ZAYBmb3JjZV91bnN1YnNjcmliZV92ZXJzaW9uX25vdGlmeQEABCBsb2NhdGlvbpkBfGxpbWl0ZWRfcmVzZXJ2ZV90cmFuc2Zlcl9hc3NldHMBABQQZGVzdJkBLGJlbmVmaWNpYXJ5mQEYYXNzZXRzGQM4ZmVlX2Fzc2V0X2l0ZW0EMHdlaWdodF9saW1pdPECXGxpbWl0ZWRfdGVsZXBvcnRfYXNzZXRzAQAUEGRlc3SZASxiZW5lZmljaWFyeZkBGGFzc2V0cxkDOGZlZV9hc3NldF9pdGVtBDB3ZWlnaHRfbGltaXTxAkBmb3JjZV9zdXNwZW5zaW9uAQAEJHN1c3BlbmRlZBQ8dHJhbnNmZXJfYXNzZXRzAQAUEGRlc3SZASxiZW5lZmljaWFyeZkBGGFzc2V0cxkDOGZlZV9hc3NldF9pdGVtBDB3ZWlnaHRfbGltaXTxAjBjbGFpbV9hc3NldHMBAAgYYXNzZXRzGQMsYmVuZWZpY2lhcnmZAYx0cmFuc2Zlcl9hc3NldHNfdXNpbmdfdHlwZV9hbmRfdGhlbgEAHBBkZXN0mQEYYXNzZXRzGQNQYXNzZXRzX3RyYW5zZmVyX3R5cGWtBjhyZW1vdGVfZmVlc19pZLEGSGZlZXNfdHJhbnNmZXJfdHlwZa0GSGN1c3RvbV94Y21fb25fZGVzdKkGMHdlaWdodF9saW1pdPECME1lc3NhZ2VRdWV1ZQECCCRyZWFwX3BhZ2UBAAg4bWVzc2FnZV9vcmlnaW4lAyhwYWdlX2luZGV4BEhleGVjdXRlX292ZXJ3ZWlnaHQBABA4bWVzc2FnZV9vcmlnaW4lAxBwYWdlBBRpbmRleAQwd2VpZ2h0X2xpbWl0GCRBc3NldFJhdGUBAgwYY3JlYXRlAQAIKGFzc2V0X2tpbmSBARByYXRlCBh1cGRhdGUBAAgoYXNzZXRfa2luZIEBEHJhdGUIGHJlbW92ZQEABChhc3NldF9raW5kgQEUQmVlZnkBAgxMcmVwb3J0X2VxdWl2b2NhdGlvbgEACEhlcXVpdm9jYXRpb25fcHJvb2bVBjxrZXlfb3duZXJfcHJvb2a9A3ByZXBvcnRfZXF1aXZvY2F0aW9uX3Vuc2lnbmVkAQAISGVxdWl2b2NhdGlvbl9wcm9vZtUGPGtleV9vd25lcl9wcm9vZr0DPHNldF9uZXdfZ2VuZXNpcwEABDxkZWxheV9pbl9ibG9ja3MEPFBhcmFTdWRvV3JhcHBlcgECGHRzdWRvX3NjaGVkdWxlX3BhcmFfaW5pdGlhbGl6ZQEACAhpZAQcZ2VuZXNpcxUJaHN1ZG9fc2NoZWR1bGVfcGFyYV9jbGVhbnVwAQAECGlkBIBzdWRvX3NjaGVkdWxlX3BhcmF0aHJlYWRfdXBncmFkZQEABAhpZASEc3Vkb19zY2hlZHVsZV9wYXJhY2hhaW5fZG93bmdyYWRlAQAECGlkBFxzdWRvX3F1ZXVlX2Rvd253YXJkX3hjbQEACAhpZAQMeGNtqQZsc3Vkb19lc3RhYmxpc2hfaHJtcF9jaGFubmVsAQAQGHNlbmRlcgQkcmVjaXBpZW50BDBtYXhfY2FwYWNpdHkEQG1heF9tZXNzYWdlX3NpemUEEFN1ZG8BAhQQc3VkbwEABBBjYWxsiQ1Uc3Vkb191bmNoZWNrZWRfd2VpZ2h0AQAIEGNhbGyJDRh3ZWlnaHQYHHNldF9rZXkBAAQMbmV31QMcc3Vkb19hcwEACAx3aG/VAxBjYWxsiQ0ocmVtb3ZlX2tleQEBBQcxDRUKBF0NAAAQQGV4ZWN1dGlvbl9yZXN1bHQ9DThlbWl0dGVkX2V2ZW50c5ENJGxvY2FsX3hjbSULOGZvcndhcmRlZF94Y21zMQsHlQ05CwAMQGV4ZWN1dGlvbl9yZXN1bHSNAjhlbWl0dGVkX2V2ZW50c5ENOGZvcndhcmRlZF94Y21zMQsHnQ05CwKINE5vdENvbnRyb2xsZXIBAQUgTm90U3Rhc2gBAQU0QWxyZWFkeUJvbmRlZAEBBTRBbHJlYWR5UGFpcmVkAQEFMEVtcHR5VGFyZ2V0cwEBBThEdXBsaWNhdGVJbmRleAEBBURJbnZhbGlkU2xhc2hJbmRleAEBBUBJbnN1ZmZpY2llbnRCb25kAQEFME5vTW9yZUNodW5rcwEBBTROb1VubG9ja0NodW5rAQEFMEZ1bmRlZFRhcmdldAEBBUhJbnZhbGlkRXJhVG9SZXdhcmQBAQVoSW52YWxpZE51bWJlck9mTm9taW5hdGlvbnMBAQVITm90U29ydGVkQW5kVW5pcXVlAQEFOEFscmVhZHlDbGFpbWVkAQEFLEludmFsaWRQYWdlAQEFVEluY29ycmVjdEhpc3RvcnlEZXB0aAEBBVhJbmNvcnJlY3RTbGFzaGluZ1NwYW5zAQEFIEJhZFN0YXRlAQEFOFRvb01hbnlUYXJnZXRzAQEFJEJhZFRhcmdldAEBBUBDYW5ub3RDaGlsbE90aGVyAQEFRFRvb01hbnlOb21pbmF0b3JzAQEFRFRvb01hbnlWYWxpZGF0b3JzAQEFQENvbW1pc3Npb25Ub29Mb3cBAQUsQm91bmROb3RNZXQBAQVQQ29udHJvbGxlckRlcHJlY2F0ZWQBAQVMQ2Fubm90UmVzdG9yZUxlZGdlcgEBBWxSZXdhcmREZXN0aW5hdGlvblJlc3RyaWN0ZWQBAQU4Tm90RW5vdWdoRnVuZHMBAQVcVmlydHVhbFN0YWtlck5vdEFsbG93ZWQBAQU8Q2Fubm90UmVhcFN0YXNoAQEFPEFscmVhZHlNaWdyYXRlZAEBBShSZXN0cmljdGVkAQEFAnhIVG9vTWFueVN1YkFjY291bnRzAQEFIE5vdEZvdW5kAQEFIE5vdE5hbWVkAQEFKEVtcHR5SW5kZXgBAQUoRmVlQ2hhbmdlZAEBBShOb0lkZW50aXR5AQEFPFN0aWNreUp1ZGdlbWVudAEBBThKdWRnZW1lbnRHaXZlbgEBBUBJbnZhbGlkSnVkZ2VtZW50AQEFMEludmFsaWRJbmRleAEBBTRJbnZhbGlkVGFyZ2V0AQEFRFRvb01hbnlSZWdpc3RyYXJzAQEFOEFscmVhZHlDbGFpbWVkAQEFGE5vdFN1YgEBBSBOb3RPd25lZAEBBXRKdWRnZW1lbnRGb3JEaWZmZXJlbnRJZGVudGl0eQEBBVhKdWRnZW1lbnRQYXltZW50RmFpbGVkAQEFNEludmFsaWRTdWZmaXgBAQVQTm90VXNlcm5hbWVBdXRob3JpdHkBAQUwTm9BbGxvY2F0aW9uAQEFQEludmFsaWRTaWduYXR1cmUBAQVEUmVxdWlyZXNTaWduYXR1cmUBAQU8SW52YWxpZFVzZXJuYW1lAQEFNFVzZXJuYW1lVGFrZW4BAQUoTm9Vc2VybmFtZQEBBShOb3RFeHBpcmVkAQEFIFRvb0Vhcmx5AQEFME5vdFVuYmluZGluZwEBBUBBbHJlYWR5VW5iaW5kaW5nAQEFWEluc3VmZmljaWVudFByaXZpbGVnZXMBAQUCIBhUb29CaWcBAQUwQWxyZWFkeU5vdGVkAQEFNE5vdEF1dGhvcml6ZWQBAQUgTm90Tm90ZWQBAQUkUmVxdWVzdGVkAQEFME5vdFJlcXVlc3RlZAEBBRxUb29NYW55AQEFGFRvb0ZldwEBBQIUJER1cGxpY2F0ZQEBBShOb3RIZWF2aWVyAQEFME5vdEluU2FtZUJhZwEBBTBOb2RlTm90Rm91bmQBAQUYTG9ja2VkAQEFAggQTGlzdAECFCREdXBsaWNhdGUBAQUoTm90SGVhdmllcgEBBTBOb3RJblNhbWVCYWcBAQUwTm9kZU5vdEZvdW5kAQEFGExvY2tlZAEBBRhMb2NrZWQBAQUCmDBQb29sTm90Rm91bmQBAQVIUG9vbE1lbWJlck5vdEZvdW5kAQEFSFJld2FyZFBvb2xOb3RGb3VuZAEBBUBTdWJQb29sc05vdEZvdW5kAQEFZEFjY291bnRCZWxvbmdzVG9PdGhlclBvb2wBAQU4RnVsbHlVbmJvbmRpbmcBAQVETWF4VW5ib25kaW5nTGltaXQBAQVEQ2Fubm90V2l0aGRyYXdBbnkBAQVETWluaW11bUJvbmROb3RNZXQBAQUwT3ZlcmZsb3dSaXNrAQEFNE5vdERlc3Ryb3lpbmcBAQUwTm90Tm9taW5hdG9yAQEFVE5vdEtpY2tlck9yRGVzdHJveWluZwEBBRxOb3RPcGVuAQEFIE1heFBvb2xzAQEFOE1heFBvb2xNZW1iZXJzAQEFRENhbk5vdENoYW5nZVN0YXRlAQEFVERvZXNOb3RIYXZlUGVybWlzc2lvbgEBBVRNZXRhZGF0YUV4Y2VlZHNNYXhMZW4BAQUkRGVmZW5zaXZlAQIcaE5vdEVub3VnaFNwYWNlSW5VbmJvbmRQb29sAQEFMFBvb2xOb3RGb3VuZAEBBUhSZXdhcmRQb29sTm90Rm91bmQBAQVAU3ViUG9vbHNOb3RGb3VuZAEBBXBCb25kZWRTdGFzaEtpbGxlZFByZW1hdHVyZWx5AQEFVERlbGVnYXRpb25VbnN1cHBvcnRlZAEBBTxTbGFzaE5vdEFwcGxpZWQBAQWcUGFydGlhbFVuYm9uZE5vdEFsbG93ZWRQZXJtaXNzaW9ubGVzc2x5AQEFXE1heENvbW1pc3Npb25SZXN0cmljdGVkAQEFYENvbW1pc3Npb25FeGNlZWRzTWF4aW11bQEBBXhDb21taXNzaW9uRXhjZWVkc0dsb2JhbE1heGltdW0BAQVkQ29tbWlzc2lvbkNoYW5nZVRocm90dGxlZAEBBXhDb21taXNzaW9uQ2hhbmdlUmF0ZU5vdEFsbG93ZWQBAQVMTm9QZW5kaW5nQ29tbWlzc2lvbgEBBVhOb0NvbW1pc3Npb25DdXJyZW50U2V0AQEFLFBvb2xJZEluVXNlAQEFNEludmFsaWRQb29sSWQBAQVMQm9uZEV4dHJhUmVzdHJpY3RlZAEBBTxOb3RoaW5nVG9BZGp1c3QBAQU4Tm90aGluZ1RvU2xhc2gBAQUsU2xhc2hUb29Mb3cBAQU8QWxyZWFkeU1pZ3JhdGVkAQEFLE5vdE1pZ3JhdGVkAQEFME5vdFN1cHBvcnRlZAEBBShSZXN0cmljdGVkAQEFAjAoTm90QWxsb3dlZAEBBThBbHJlYWR5U3Rha2luZwEBBWBJbnZhbGlkUmV3YXJkRGVzdGluYXRpb24BAQVESW52YWxpZERlbGVnYXRpb24BAQU4Tm90RW5vdWdoRnVuZHMBAQUgTm90QWdlbnQBAQUwTm90RGVsZWdhdG9yAQEFIEJhZFN0YXRlAQEFOFVuYXBwbGllZFNsYXNoAQEFOE5vdGhpbmdUb1NsYXNoAQEFOFdpdGhkcmF3RmFpbGVkAQEFME5vdFN1cHBvcnRlZAEBBQJEZFZhbGlkYXRvckluZGV4T3V0T2ZCb3VuZHMBAQVQVW5zY2hlZHVsZWRDYW5kaWRhdGUBAQVASGVhZERhdGFUb29MYXJnZQEBBVBQcmVtYXR1cmVDb2RlVXBncmFkZQEBBTxOZXdDb2RlVG9vTGFyZ2UBAQVURGlzYWxsb3dlZFJlbGF5UGFyZW50AQEFREludmFsaWRBc3NpZ25tZW50AQEFREludmFsaWRHcm91cEluZGV4AQEFTEluc3VmZmljaWVudEJhY2tpbmcBAQU4SW52YWxpZEJhY2tpbmcBAQVoVmFsaWRhdGlvbkRhdGFIYXNoTWlzbWF0Y2gBAQWASW5jb3JyZWN0RG93bndhcmRNZXNzYWdlSGFuZGxpbmcBAQVUSW52YWxpZFVwd2FyZE1lc3NhZ2VzAQEFYEhybXBXYXRlcm1hcmtNaXNoYW5kbGluZwEBBUxJbnZhbGlkT3V0Ym91bmRIcm1wAQEFZEludmFsaWRWYWxpZGF0aW9uQ29kZUhhc2gBAQVAUGFyYUhlYWRNaXNtYXRjaAEBBQIQZFRvb01hbnlJbmNsdXNpb25JbmhlcmVudHMBAQVMSW52YWxpZFBhcmVudEhlYWRlcgEBBYxJbmhlcmVudERhdGFGaWx0ZXJlZER1cmluZ0V4ZWN1dGlvbgEBBVBVbnNjaGVkdWxlZENhbmRpZGF0ZQEBBQJANE5vdFJlZ2lzdGVyZWQBAQU0Q2Fubm90T25ib2FyZAEBBThDYW5ub3RPZmZib2FyZAEBBTRDYW5ub3RVcGdyYWRlAQEFPENhbm5vdERvd25ncmFkZQEBBVhQdmZDaGVja1N0YXRlbWVudFN0YWxlAQEFXFB2ZkNoZWNrU3RhdGVtZW50RnV0dXJlAQEFhFB2ZkNoZWNrVmFsaWRhdG9ySW5kZXhPdXRPZkJvdW5kcwEBBWBQdmZDaGVja0ludmFsaWRTaWduYXR1cmUBAQVIUHZmQ2hlY2tEb3VibGVWb3RlAQEFWFB2ZkNoZWNrU3ViamVjdEludmFsaWQBAQVEQ2Fubm90VXBncmFkZUNvZGUBAQUsSW52YWxpZENvZGUBAQVETm90aGluZ0F1dGhvcml6ZWQBAQUwVW5hdXRob3JpemVkAQEFSEludmFsaWRCbG9ja051bWJlcgEBBQIMJFF1ZXVlRnVsbAEBBXBTcG90UHJpY2VIaWdoZXJUaGFuTWF4QW1vdW50AQEFTEluc3VmZmljaWVudENyZWRpdHMBAQUCCEBBc3NpZ25tZW50c0VtcHR5AQEFQERpc2FsbG93ZWRJbnNlcnQBAQUCKDxQYXJhRG9lc250RXhpc3QBAQVEUGFyYUFscmVhZHlFeGlzdHMBAQVURXhjZWVkc01heE1lc3NhZ2VTaXplAQEFKFVucm91dGFibGUBAQU4Q291bGRudENsZWFudXABAQU0Tm90UGFyYXRocmVhZAEBBTBOb3RQYXJhY2hhaW4BAQU0Q2Fubm90VXBncmFkZQEBBTxDYW5ub3REb3duZ3JhZGUBAQUwVG9vTWFueUNvcmVzAQEFAiQ8UGFyYURvZXNudEV4aXN0AQEFNE5vdFBhcmF0aHJlYWQBAQU0Q2Fubm90VXBncmFkZQEBBTxDYW5ub3REb3duZ3JhZGUBAQVMU2xvdEFscmVhZHlBc3NpZ25lZAEBBTxTbG90Tm90QXNzaWduZWQBAQVIT25nb2luZ0xlYXNlRXhpc3RzAQEFZE1heFBlcm1hbmVudFNsb3RzRXhjZWVkZWQBAQVkTWF4VGVtcG9yYXJ5U2xvdHNFeGNlZWRlZAEBBQIEHEJsb2NrZWQBAQUCBBxPbmdvaW5nAQEFAqQgT3ZlcmZsb3cBAQU0VW5pbXBsZW1lbnRlZAEBBWBVbnRydXN0ZWRSZXNlcnZlTG9jYXRpb24BAQVkVW50cnVzdGVkVGVsZXBvcnRMb2NhdGlvbgEBBTBMb2NhdGlvbkZ1bGwBAQVUTG9jYXRpb25Ob3RJbnZlcnRpYmxlAQEFJEJhZE9yaWdpbgEBBTxJbnZhbGlkTG9jYXRpb24BAQU0QXNzZXROb3RGb3VuZAEBBVRGYWlsZWRUb1RyYW5zYWN0QXNzZXQBAQU8Tm90V2l0aGRyYXdhYmxlAQEFSExvY2F0aW9uQ2Fubm90SG9sZAEBBVRFeGNlZWRzTWF4TWVzc2FnZVNpemUBAQVYRGVzdGluYXRpb25VbnN1cHBvcnRlZAEBBSRUcmFuc3BvcnQBAQUoVW5yb3V0YWJsZQEBBTBVbmtub3duQ2xhaW0BAQU4RmFpbGVkVG9EZWNvZGUBAQVATWF4V2VpZ2h0SW52YWxpZAEBBThOb3RIb2xkaW5nRmVlcwEBBTBUb29FeHBlbnNpdmUBAQUQVHJhcAEBBUBFeHBlY3RhdGlvbkZhbHNlAQEFOFBhbGxldE5vdEZvdW5kAQEFME5hbWVNaXNtYXRjaAEBBUxWZXJzaW9uSW5jb21wYXRpYmxlAQEFUEhvbGRpbmdXb3VsZE92ZXJmbG93AQEFLEV4cG9ydEVycm9yAQEFOFJlYW5jaG9yRmFpbGVkAQEFGE5vRGVhbAEBBShGZWVzTm90TWV0AQEFJExvY2tFcnJvcgEBBTBOb1Blcm1pc3Npb24BAQUoVW5hbmNob3JlZAEBBThOb3REZXBvc2l0YWJsZQEBBTRUb29NYW55QXNzZXRzAQEFTFVuaGFuZGxlZFhjbVZlcnNpb24BAQVIV2VpZ2h0TGltaXRSZWFjaGVkAQEFHEJhcnJpZXIBAQVMV2VpZ2h0Tm90Q29tcHV0YWJsZQEBBURFeGNlZWRzU3RhY2tMaW1pdAEBBQJwLFVucmVhY2hhYmxlAQEFLFNlbmRGYWlsdXJlAQEFIEZpbHRlcmVkAQEFSFVud2VpZ2hhYmxlTWVzc2FnZQEBBWBEZXN0aW5hdGlvbk5vdEludmVydGlibGUBAQUURW1wdHkBAQU4Q2Fubm90UmVhbmNob3IBAQU0VG9vTWFueUFzc2V0cwEBBTRJbnZhbGlkT3JpZ2luAQEFKEJhZFZlcnNpb24BAQUsQmFkTG9jYXRpb24BAQU4Tm9TdWJzY3JpcHRpb24BAQVEQWxyZWFkeVN1YnNjcmliZWQBAQVYQ2Fubm90Q2hlY2tPdXRUZWxlcG9ydAEBBShMb3dCYWxhbmNlAQEFMFRvb01hbnlMb2NrcwEBBUxBY2NvdW50Tm90U292ZXJlaWduAQEFKEZlZXNOb3RNZXQBAQUwTG9ja05vdEZvdW5kAQEFFEluVXNlAQEFaEludmFsaWRBc3NldFVua25vd25SZXNlcnZlAQEFeEludmFsaWRBc3NldFVuc3VwcG9ydGVkUmVzZXJ2ZQEBBTxUb29NYW55UmVzZXJ2ZXMBAQVgTG9jYWxFeGVjdXRpb25JbmNvbXBsZXRlAQEFYFRvb01hbnlBdXRob3JpemVkQWxpYXNlcwEBBTRFeHBpcmVzSW5QYXN0AQEFNEFsaWFzTm90Rm91bmQBAQWETG9jYWxFeGVjdXRpb25JbmNvbXBsZXRlV2l0aEVycm9yAQAIFGluZGV4BBRlcnJvcuUNAhggQmFkUHJvb2YBAQUYRnV0dXJlAQEFFFN0YWxlAQEFREFuY2llbnRCaXJ0aEJsb2NrAQEFNFVua25vd25PcmlnaW4BAQUcSW52YWxpZAEBBQIcYEludmFsaWRLZXlPd25lcnNoaXBQcm9vZgEBBWBJbnZhbGlkRG91YmxlVm90aW5nUHJvb2YBAQVYSW52YWxpZEZvcmtWb3RpbmdQcm9vZgEBBXRJbnZhbGlkRnV0dXJlQmxvY2tWb3RpbmdQcm9vZgEBBXxJbnZhbGlkRXF1aXZvY2F0aW9uUHJvb2ZTZXNzaW9uAQEFWER1cGxpY2F0ZU9mZmVuY2VSZXBvcnQBAQVQSW52YWxpZENvbmZpZ3VyYXRpb24BAQUCDQEYU3lzdGVtAQIkPEludmFsaWRTcGVjTmFtZQEBBWhTcGVjVmVyc2lvbk5lZWRzVG9JbmNyZWFzZQEBBXRGYWlsZWRUb0V4dHJhY3RSdW50aW1lVmVyc2lvbgEBBUxOb25EZWZhdWx0Q29tcG9zaXRlAQEFPE5vblplcm9SZWZDb3VudAEBBTBDYWxsRmlsdGVyZWQBAQVsTXVsdGlCbG9ja01pZ3JhdGlvbnNPbmdvaW5nAQEFRE5vdGhpbmdBdXRob3JpemVkAQEFMFVuYXV0aG9yaXplZAEBBRBCYWJlAQIQYEludmFsaWRFcXVpdm9jYXRpb25Qcm9vZgEBBWBJbnZhbGlkS2V5T3duZXJzaGlwUHJvb2YBAQVYRHVwbGljYXRlT2ZmZW5jZVJlcG9ydAEBBVBJbnZhbGlkQ29uZmlndXJhdGlvbgEBBSRUaW1lc3RhbXABAQUcSW5kaWNlcwECFCxOb3RBc3NpZ25lZAEBBSBOb3RPd25lcgEBBRRJblVzZQEBBSxOb3RUcmFuc2ZlcgEBBSRQZXJtYW5lbnQBAQUgQmFsYW5jZXMBAjA4VmVzdGluZ0JhbGFuY2UBAQVUTGlxdWlkaXR5UmVzdHJpY3Rpb25zAQEFTEluc3VmZmljaWVudEJhbGFuY2UBAQVIRXhpc3RlbnRpYWxEZXBvc2l0AQEFNEV4cGVuZGFiaWxpdHkBAQVcRXhpc3RpbmdWZXN0aW5nU2NoZWR1bGUBAQUsRGVhZEFjY291bnQBAQU8VG9vTWFueVJlc2VydmVzAQEFMFRvb01hbnlIb2xkcwEBBThUb29NYW55RnJlZXplcwEBBUxJc3N1YW5jZURlYWN0aXZhdGVkAQEFJERlbHRhWmVybwEBBUhUcmFuc2FjdGlvblBheW1lbnQBAQUoQXV0aG9yc2hpcAEBBRxTdGFraW5nAQKINE5vdENvbnRyb2xsZXIBAQUgTm90U3Rhc2gBAQU0QWxyZWFkeUJvbmRlZAEBBTRBbHJlYWR5UGFpcmVkAQEFMEVtcHR5VGFyZ2V0cwEBBThEdXBsaWNhdGVJbmRleAEBBURJbnZhbGlkU2xhc2hJbmRleAEBBUBJbnN1ZmZpY2llbnRCb25kAQEFME5vTW9yZUNodW5rcwEBBTROb1VubG9ja0NodW5rAQEFMEZ1bmRlZFRhcmdldAEBBUhJbnZhbGlkRXJhVG9SZXdhcmQBAQVoSW52YWxpZE51bWJlck9mTm9taW5hdGlvbnMBAQVITm90U29ydGVkQW5kVW5pcXVlAQEFOEFscmVhZHlDbGFpbWVkAQEFLEludmFsaWRQYWdlAQEFVEluY29ycmVjdEhpc3RvcnlEZXB0aAEBBVhJbmNvcnJlY3RTbGFzaGluZ1NwYW5zAQEFIEJhZFN0YXRlAQEFOFRvb01hbnlUYXJnZXRzAQEFJEJhZFRhcmdldAEBBUBDYW5ub3RDaGlsbE90aGVyAQEFRFRvb01hbnlOb21pbmF0b3JzAQEFRFRvb01hbnlWYWxpZGF0b3JzAQEFQENvbW1pc3Npb25Ub29Mb3cBAQUsQm91bmROb3RNZXQBAQVQQ29udHJvbGxlckRlcHJlY2F0ZWQBAQVMQ2Fubm90UmVzdG9yZUxlZGdlcgEBBWxSZXdhcmREZXN0aW5hdGlvblJlc3RyaWN0ZWQBAQU4Tm90RW5vdWdoRnVuZHMBAQVcVmlydHVhbFN0YWtlck5vdEFsbG93ZWQBAQU8Q2Fubm90UmVhcFN0YXNoAQEFPEFscmVhZHlNaWdyYXRlZAEBBShSZXN0cmljdGVkAQEFIE9mZmVuY2VzAQEFKEhpc3RvcmljYWwBAQUoUGFyYW1ldGVycwEBBRxTZXNzaW9uAQIUMEludmFsaWRQcm9vZgEBBVxOb0Fzc29jaWF0ZWRWYWxpZGF0b3JJZAEBBTREdXBsaWNhdGVkS2V5AQEFGE5vS2V5cwEBBSROb0FjY291bnQBAQUcR3JhbmRwYQECHCxQYXVzZUZhaWxlZAEBBTBSZXN1bWVGYWlsZWQBAQU0Q2hhbmdlUGVuZGluZwEBBRxUb29Tb29uAQEFYEludmFsaWRLZXlPd25lcnNoaXBQcm9vZgEBBWBJbnZhbGlkRXF1aXZvY2F0aW9uUHJvb2YBAQVYRHVwbGljYXRlT2ZmZW5jZVJlcG9ydAEBBUhBdXRob3JpdHlEaXNjb3ZlcnkBAQUcVXRpbGl0eQECBDBUb29NYW55Q2FsbHMBAQUgSWRlbnRpdHkBAnhIVG9vTWFueVN1YkFjY291bnRzAQEFIE5vdEZvdW5kAQEFIE5vdE5hbWVkAQEFKEVtcHR5SW5kZXgBAQUoRmVlQ2hhbmdlZAEBBShOb0lkZW50aXR5AQEFPFN0aWNreUp1ZGdlbWVudAEBBThKdWRnZW1lbnRHaXZlbgEBBUBJbnZhbGlkSnVkZ2VtZW50AQEFMEludmFsaWRJbmRleAEBBTRJbnZhbGlkVGFyZ2V0AQEFRFRvb01hbnlSZWdpc3RyYXJzAQEFOEFscmVhZHlDbGFpbWVkAQEFGE5vdFN1YgEBBSBOb3RPd25lZAEBBXRKdWRnZW1lbnRGb3JEaWZmZXJlbnRJZGVudGl0eQEBBVhKdWRnZW1lbnRQYXltZW50RmFpbGVkAQEFNEludmFsaWRTdWZmaXgBAQVQTm90VXNlcm5hbWVBdXRob3JpdHkBAQUwTm9BbGxvY2F0aW9uAQEFQEludmFsaWRTaWduYXR1cmUBAQVEUmVxdWlyZXNTaWduYXR1cmUBAQU8SW52YWxpZFVzZXJuYW1lAQEFNFVzZXJuYW1lVGFrZW4BAQUoTm9Vc2VybmFtZQEBBShOb3RFeHBpcmVkAQEFIFRvb0Vhcmx5AQEFME5vdFVuYmluZGluZwEBBUBBbHJlYWR5VW5iaW5kaW5nAQEFWEluc3VmZmljaWVudFByaXZpbGVnZXMBAQUgUmVjb3ZlcnkBAkAoTm90QWxsb3dlZAEBBTRaZXJvVGhyZXNob2xkAQEFQE5vdEVub3VnaEZyaWVuZHMBAQUoTWF4RnJpZW5kcwEBBSROb3RTb3J0ZWQBAQU4Tm90UmVjb3ZlcmFibGUBAQVIQWxyZWFkeVJlY292ZXJhYmxlAQEFOEFscmVhZHlTdGFydGVkAQEFKE5vdFN0YXJ0ZWQBAQUkTm90RnJpZW5kAQEFLERlbGF5UGVyaW9kAQEFOEFscmVhZHlWb3VjaGVkAQEFJFRocmVzaG9sZAEBBSxTdGlsbEFjdGl2ZQEBBTBBbHJlYWR5UHJveHkBAQUgQmFkU3RhdGUBAQUcVmVzdGluZwECFChOb3RWZXN0aW5nAQEFVEF0TWF4VmVzdGluZ1NjaGVkdWxlcwEBBSRBbW91bnRMb3cBAQVgU2NoZWR1bGVJbmRleE91dE9mQm91bmRzAQEFVEludmFsaWRTY2hlZHVsZVBhcmFtcwEBBSRTY2hlZHVsZXIBAhRARmFpbGVkVG9TY2hlZHVsZQEBBSBOb3RGb3VuZAEBBVxUYXJnZXRCbG9ja051bWJlckluUGFzdAEBBUhSZXNjaGVkdWxlTm9DaGFuZ2UBAQUUTmFtZWQBAQUgUHJlaW1hZ2UBAiAYVG9vQmlnAQEFMEFscmVhZHlOb3RlZAEBBTROb3RBdXRob3JpemVkAQEFIE5vdE5vdGVkAQEFJFJlcXVlc3RlZAEBBTBOb3RSZXF1ZXN0ZWQBAQUcVG9vTWFueQEBBRhUb29GZXcBAQUQU3VkbwECBCxSZXF1aXJlU3VkbwEBBRRQcm94eQECIBxUb29NYW55AQEFIE5vdEZvdW5kAQEFIE5vdFByb3h5AQEFLFVucHJveHlhYmxlAQEFJER1cGxpY2F0ZQEBBTBOb1Blcm1pc3Npb24BAQUsVW5hbm5vdW5jZWQBAQUsTm9TZWxmUHJveHkBAQUgTXVsdGlzaWcBAjhATWluaW11bVRocmVzaG9sZAEBBTxBbHJlYWR5QXBwcm92ZWQBAQVETm9BcHByb3ZhbHNOZWVkZWQBAQVEVG9vRmV3U2lnbmF0b3JpZXMBAQVIVG9vTWFueVNpZ25hdG9yaWVzAQEFVFNpZ25hdG9yaWVzT3V0T2ZPcmRlcgEBBUxTZW5kZXJJblNpZ25hdG9yaWVzAQEFIE5vdEZvdW5kAQEFIE5vdE93bmVyAQEFLE5vVGltZXBvaW50AQEFOFdyb25nVGltZXBvaW50AQEFTFVuZXhwZWN0ZWRUaW1lcG9pbnQBAQU8TWF4V2VpZ2h0VG9vTG93AQEFNEFscmVhZHlTdG9yZWQBAQVoRWxlY3Rpb25Qcm92aWRlck11bHRpUGhhc2UBAjxoUHJlRGlzcGF0Y2hFYXJseVN1Ym1pc3Npb24BAQVsUHJlRGlzcGF0Y2hXcm9uZ1dpbm5lckNvdW50AQEFZFByZURpc3BhdGNoV2Vha1N1Ym1pc3Npb24BAQU8U2lnbmVkUXVldWVGdWxsAQEFWFNpZ25lZENhbm5vdFBheURlcG9zaXQBAQVQU2lnbmVkSW52YWxpZFdpdG5lc3MBAQVMU2lnbmVkVG9vTXVjaFdlaWdodAEBBTxPY3dDYWxsV3JvbmdFcmEBAQVcTWlzc2luZ1NuYXBzaG90TWV0YWRhdGEBAQVYSW52YWxpZFN1Ym1pc3Npb25JbmRleAEBBThDYWxsTm90QWxsb3dlZAEBBThGYWxsYmFja0ZhaWxlZAEBBSxCb3VuZE5vdE1ldAEBBThUb29NYW55V2lubmVycwEBBWRQcmVEaXNwYXRjaERpZmZlcmVudFJvdW5kAQEFJFZvdGVyTGlzdAECCBBMaXN0AQIUJER1cGxpY2F0ZQEBBShOb3RIZWF2aWVyAQEFME5vdEluU2FtZUJhZwEBBTBOb2RlTm90Rm91bmQBAQUYTG9ja2VkAQEFGExvY2tlZAEBBTxOb21pbmF0aW9uUG9vbHMBApgwUG9vbE5vdEZvdW5kAQEFSFBvb2xNZW1iZXJOb3RGb3VuZAEBBUhSZXdhcmRQb29sTm90Rm91bmQBAQVAU3ViUG9vbHNOb3RGb3VuZAEBBWRBY2NvdW50QmVsb25nc1RvT3RoZXJQb29sAQEFOEZ1bGx5VW5ib25kaW5nAQEFRE1heFVuYm9uZGluZ0xpbWl0AQEFRENhbm5vdFdpdGhkcmF3QW55AQEFRE1pbmltdW1Cb25kTm90TWV0AQEFME92ZXJmbG93UmlzawEBBTROb3REZXN0cm95aW5nAQEFME5vdE5vbWluYXRvcgEBBVROb3RLaWNrZXJPckRlc3Ryb3lpbmcBAQUcTm90T3BlbgEBBSBNYXhQb29scwEBBThNYXhQb29sTWVtYmVycwEBBURDYW5Ob3RDaGFuZ2VTdGF0ZQEBBVREb2VzTm90SGF2ZVBlcm1pc3Npb24BAQVUTWV0YWRhdGFFeGNlZWRzTWF4TGVuAQEFJERlZmVuc2l2ZQECHGhOb3RFbm91Z2hTcGFjZUluVW5ib25kUG9vbAEBBTBQb29sTm90Rm91bmQBAQVIUmV3YXJkUG9vbE5vdEZvdW5kAQEFQFN1YlBvb2xzTm90Rm91bmQBAQVwQm9uZGVkU3Rhc2hLaWxsZWRQcmVtYXR1cmVseQEBBVREZWxlZ2F0aW9uVW5zdXBwb3J0ZWQBAQU8U2xhc2hOb3RBcHBsaWVkAQEFnFBhcnRpYWxVbmJvbmROb3RBbGxvd2VkUGVybWlzc2lvbmxlc3NseQEBBVxNYXhDb21taXNzaW9uUmVzdHJpY3RlZAEBBWBDb21taXNzaW9uRXhjZWVkc01heGltdW0BAQV4Q29tbWlzc2lvbkV4Y2VlZHNHbG9iYWxNYXhpbXVtAQEFZENvbW1pc3Npb25DaGFuZ2VUaHJvdHRsZWQBAQV4Q29tbWlzc2lvbkNoYW5nZVJhdGVOb3RBbGxvd2VkAQEFTE5vUGVuZGluZ0NvbW1pc3Npb24BAQVYTm9Db21taXNzaW9uQ3VycmVudFNldAEBBSxQb29sSWRJblVzZQEBBTRJbnZhbGlkUG9vbElkAQEFTEJvbmRFeHRyYVJlc3RyaWN0ZWQBAQU8Tm90aGluZ1RvQWRqdXN0AQEFOE5vdGhpbmdUb1NsYXNoAQEFLFNsYXNoVG9vTG93AQEFPEFscmVhZHlNaWdyYXRlZAEBBSxOb3RNaWdyYXRlZAEBBTBOb3RTdXBwb3J0ZWQBAQUoUmVzdHJpY3RlZAEBBSxGYXN0VW5zdGFrZQECGDROb3RDb250cm9sbGVyAQEFNEFscmVhZHlRdWV1ZWQBAQU4Tm90RnVsbHlCb25kZWQBAQUkTm90UXVldWVkAQEFLEFscmVhZHlIZWFkAQEFOENhbGxOb3RBbGxvd2VkAQEFQENvbnZpY3Rpb25Wb3RpbmcBAjAoTm90T25nb2luZwEBBSBOb3RWb3RlcgEBBTBOb1Blcm1pc3Npb24BAQU8Tm9QZXJtaXNzaW9uWWV0AQEFREFscmVhZHlEZWxlZ2F0aW5nAQEFNEFscmVhZHlWb3RpbmcBAQVESW5zdWZmaWNpZW50RnVuZHMBAQU0Tm90RGVsZWdhdGluZwEBBSBOb25zZW5zZQEBBTxNYXhWb3Rlc1JlYWNoZWQBAQUsQ2xhc3NOZWVkZWQBAQUgQmFkQ2xhc3MBAQUkUmVmZXJlbmRhAQI4KE5vdE9uZ29pbmcBAQUoSGFzRGVwb3NpdAEBBSBCYWRUcmFjawEBBRBGdWxsAQEFKFF1ZXVlRW1wdHkBAQU0QmFkUmVmZXJlbmR1bQEBBSxOb3RoaW5nVG9EbwEBBRxOb1RyYWNrAQEFKFVuZmluaXNoZWQBAQUwTm9QZXJtaXNzaW9uAQEFJE5vRGVwb3NpdAEBBSRCYWRTdGF0dXMBAQVAUHJlaW1hZ2VOb3RFeGlzdAEBBYRQcmVpbWFnZVN0b3JlZFdpdGhEaWZmZXJlbnRMZW5ndGgBAQUcT3JpZ2lucwEBBSRXaGl0ZWxpc3QBAhRMVW5hdmFpbGFibGVQcmVJbWFnZQEBBTxVbmRlY29kYWJsZUNhbGwBAQVgSW52YWxpZENhbGxXZWlnaHRXaXRuZXNzAQEFUENhbGxJc05vdFdoaXRlbGlzdGVkAQEFWENhbGxBbHJlYWR5V2hpdGVsaXN0ZWQBAQUgVHJlYXN1cnkBAiwwSW52YWxpZEluZGV4AQEFQFRvb01hbnlBcHByb3ZhbHMBAQVYSW5zdWZmaWNpZW50UGVybWlzc2lvbgEBBUxQcm9wb3NhbE5vdEFwcHJvdmVkAQEFWEZhaWxlZFRvQ29udmVydEJhbGFuY2UBAQUwU3BlbmRFeHBpcmVkAQEFLEVhcmx5UGF5b3V0AQEFQEFscmVhZHlBdHRlbXB0ZWQBAQUsUGF5b3V0RXJyb3IBAQUwTm90QXR0ZW1wdGVkAQEFMEluY29uY2x1c2l2ZQEBBUBEZWxlZ2F0ZWRTdGFraW5nAQIwKE5vdEFsbG93ZWQBAQU4QWxyZWFkeVN0YWtpbmcBAQVgSW52YWxpZFJld2FyZERlc3RpbmF0aW9uAQEFREludmFsaWREZWxlZ2F0aW9uAQEFOE5vdEVub3VnaEZ1bmRzAQEFIE5vdEFnZW50AQEFME5vdERlbGVnYXRvcgEBBSBCYWRTdGF0ZQEBBThVbmFwcGxpZWRTbGFzaAEBBThOb3RoaW5nVG9TbGFzaAEBBThXaXRoZHJhd0ZhaWxlZAEBBTBOb3RTdXBwb3J0ZWQBAQVAUGFyYWNoYWluc09yaWdpbgEBBTRDb25maWd1cmF0aW9uAQIEPEludmFsaWROZXdWYWx1ZQEBBSxQYXJhc1NoYXJlZAEBBTRQYXJhSW5jbHVzaW9uAQJEZFZhbGlkYXRvckluZGV4T3V0T2ZCb3VuZHMBAQVQVW5zY2hlZHVsZWRDYW5kaWRhdGUBAQVASGVhZERhdGFUb29MYXJnZQEBBVBQcmVtYXR1cmVDb2RlVXBncmFkZQEBBTxOZXdDb2RlVG9vTGFyZ2UBAQVURGlzYWxsb3dlZFJlbGF5UGFyZW50AQEFREludmFsaWRBc3NpZ25tZW50AQEFREludmFsaWRHcm91cEluZGV4AQEFTEluc3VmZmljaWVudEJhY2tpbmcBAQU4SW52YWxpZEJhY2tpbmcBAQVoVmFsaWRhdGlvbkRhdGFIYXNoTWlzbWF0Y2gBAQWASW5jb3JyZWN0RG93bndhcmRNZXNzYWdlSGFuZGxpbmcBAQVUSW52YWxpZFVwd2FyZE1lc3NhZ2VzAQEFYEhybXBXYXRlcm1hcmtNaXNoYW5kbGluZwEBBUxJbnZhbGlkT3V0Ym91bmRIcm1wAQEFZEludmFsaWRWYWxpZGF0aW9uQ29kZUhhc2gBAQVAUGFyYUhlYWRNaXNtYXRjaAEBBTBQYXJhSW5oZXJlbnQBAhBkVG9vTWFueUluY2x1c2lvbkluaGVyZW50cwEBBUxJbnZhbGlkUGFyZW50SGVhZGVyAQEFjEluaGVyZW50RGF0YUZpbHRlcmVkRHVyaW5nRXhlY3V0aW9uAQEFUFVuc2NoZWR1bGVkQ2FuZGlkYXRlAQEFNFBhcmFTY2hlZHVsZXIBAQUUUGFyYXMBAkA0Tm90UmVnaXN0ZXJlZAEBBTRDYW5ub3RPbmJvYXJkAQEFOENhbm5vdE9mZmJvYXJkAQEFNENhbm5vdFVwZ3JhZGUBAQU8Q2Fubm90RG93bmdyYWRlAQEFWFB2ZkNoZWNrU3RhdGVtZW50U3RhbGUBAQVcUHZmQ2hlY2tTdGF0ZW1lbnRGdXR1cmUBAQWEUHZmQ2hlY2tWYWxpZGF0b3JJbmRleE91dE9mQm91bmRzAQEFYFB2ZkNoZWNrSW52YWxpZFNpZ25hdHVyZQEBBUhQdmZDaGVja0RvdWJsZVZvdGUBAQVYUHZmQ2hlY2tTdWJqZWN0SW52YWxpZAEBBURDYW5ub3RVcGdyYWRlQ29kZQEBBSxJbnZhbGlkQ29kZQEBBUROb3RoaW5nQXV0aG9yaXplZAEBBTBVbmF1dGhvcml6ZWQBAQVISW52YWxpZEJsb2NrTnVtYmVyAQEFLEluaXRpYWxpemVyAQEFDERtcAEBBRBIcm1wAQJQVE9wZW5Icm1wQ2hhbm5lbFRvU2VsZgEBBXxPcGVuSHJtcENoYW5uZWxJbnZhbGlkUmVjaXBpZW50AQEFbE9wZW5Icm1wQ2hhbm5lbFplcm9DYXBhY2l0eQEBBYxPcGVuSHJtcENoYW5uZWxDYXBhY2l0eUV4Y2VlZHNMaW1pdAEBBXhPcGVuSHJtcENoYW5uZWxaZXJvTWVzc2FnZVNpemUBAQWYT3BlbkhybXBDaGFubmVsTWVzc2FnZVNpemVFeGNlZWRzTGltaXQBAQVwT3BlbkhybXBDaGFubmVsQWxyZWFkeUV4aXN0cwEBBXxPcGVuSHJtcENoYW5uZWxBbHJlYWR5UmVxdWVzdGVkAQEFcE9wZW5Icm1wQ2hhbm5lbExpbWl0RXhjZWVkZWQBAQVwQWNjZXB0SHJtcENoYW5uZWxEb2VzbnRFeGlzdAEBBYRBY2NlcHRIcm1wQ2hhbm5lbEFscmVhZHlDb25maXJtZWQBAQV4QWNjZXB0SHJtcENoYW5uZWxMaW1pdEV4Y2VlZGVkAQEFcENsb3NlSHJtcENoYW5uZWxVbmF1dGhvcml6ZWQBAQVsQ2xvc2VIcm1wQ2hhbm5lbERvZXNudEV4aXN0AQEFfENsb3NlSHJtcENoYW5uZWxBbHJlYWR5VW5kZXJ3YXkBAQWEQ2FuY2VsSHJtcE9wZW5DaGFubmVsVW5hdXRob3JpemVkAQEFaE9wZW5Icm1wQ2hhbm5lbERvZXNudEV4aXN0AQEFfE9wZW5Icm1wQ2hhbm5lbEFscmVhZHlDb25maXJtZWQBAQUwV3JvbmdXaXRuZXNzAQEFcENoYW5uZWxDcmVhdGlvbk5vdEF1dGhvcml6ZWQBAQU8UGFyYVNlc3Npb25JbmZvAQEFNFBhcmFzRGlzcHV0ZXMBAiR0RHVwbGljYXRlRGlzcHV0ZVN0YXRlbWVudFNldHMBAQVcQW5jaWVudERpc3B1dGVTdGF0ZW1lbnQBAQVkVmFsaWRhdG9ySW5kZXhPdXRPZkJvdW5kcwEBBUBJbnZhbGlkU2lnbmF0dXJlAQEFSER1cGxpY2F0ZVN0YXRlbWVudAEBBUhTaW5nbGVTaWRlZERpc3B1dGUBAQU8TWFsaWNpb3VzQmFja2VyAQEFTE1pc3NpbmdCYWNraW5nVm90ZXMBAQVIVW5jb25maXJtZWREaXNwdXRlAQEFNFBhcmFzU2xhc2hpbmcBAhhgSW52YWxpZEtleU93bmVyc2hpcFByb29mAQEFTEludmFsaWRTZXNzaW9uSW5kZXgBAQVQSW52YWxpZENhbmRpZGF0ZUhhc2gBAQVUSW52YWxpZFZhbGlkYXRvckluZGV4AQEFYFZhbGlkYXRvckluZGV4SWRNaXNtYXRjaAEBBVxEdXBsaWNhdGVTbGFzaGluZ1JlcG9ydAEBBWhPbkRlbWFuZEFzc2lnbm1lbnRQcm92aWRlcgECDCRRdWV1ZUZ1bGwBAQVwU3BvdFByaWNlSGlnaGVyVGhhbk1heEFtb3VudAEBBUxJbnN1ZmZpY2llbnRDcmVkaXRzAQEFaENvcmV0aW1lQXNzaWdubWVudFByb3ZpZGVyAQIIQEFzc2lnbm1lbnRzRW1wdHkBAQVARGlzYWxsb3dlZEluc2VydAEBBSRSZWdpc3RyYXIBAjg0Tm90UmVnaXN0ZXJlZAEBBURBbHJlYWR5UmVnaXN0ZXJlZAEBBSBOb3RPd25lcgEBBTBDb2RlVG9vTGFyZ2UBAQVASGVhZERhdGFUb29MYXJnZQEBBTBOb3RQYXJhY2hhaW4BAQU0Tm90UGFyYXRocmVhZAEBBUBDYW5ub3REZXJlZ2lzdGVyAQEFPENhbm5vdERvd25ncmFkZQEBBTRDYW5ub3RVcGdyYWRlAQEFKFBhcmFMb2NrZWQBAQUsTm90UmVzZXJ2ZWQBAQUsSW52YWxpZENvZGUBAQUoQ2Fubm90U3dhcAEBBRRTbG90cwECCERQYXJhTm90T25ib2FyZGluZwEBBShMZWFzZUVycm9yAQEFQFBhcmFzU3Vkb1dyYXBwZXIBAig8UGFyYURvZXNudEV4aXN0AQEFRFBhcmFBbHJlYWR5RXhpc3RzAQEFVEV4Y2VlZHNNYXhNZXNzYWdlU2l6ZQEBBShVbnJvdXRhYmxlAQEFOENvdWxkbnRDbGVhbnVwAQEFNE5vdFBhcmF0aHJlYWQBAQUwTm90UGFyYWNoYWluAQEFNENhbm5vdFVwZ3JhZGUBAQU8Q2Fubm90RG93bmdyYWRlAQEFMFRvb01hbnlDb3JlcwEBBSBBdWN0aW9ucwECHERBdWN0aW9uSW5Qcm9ncmVzcwEBBURMZWFzZVBlcmlvZEluUGFzdAEBBURQYXJhTm90UmVnaXN0ZXJlZAEBBUROb3RDdXJyZW50QXVjdGlvbgEBBShOb3RBdWN0aW9uAQEFMEF1Y3Rpb25FbmRlZAEBBUBBbHJlYWR5TGVhc2VkT3V0AQEFJENyb3dkbG9hbgECXERGaXJzdFBlcmlvZEluUGFzdAEBBWRGaXJzdFBlcmlvZFRvb0ZhckluRnV0dXJlAQEFbExhc3RQZXJpb2RCZWZvcmVGaXJzdFBlcmlvZAEBBWBMYXN0UGVyaW9kVG9vRmFySW5GdXR1cmUBAQU8Q2Fubm90RW5kSW5QYXN0AQEFREVuZFRvb0ZhckluRnV0dXJlAQEFIE92ZXJmbG93AQEFUENvbnRyaWJ1dGlvblRvb1NtYWxsAQEFNEludmFsaWRQYXJhSWQBAQUsQ2FwRXhjZWVkZWQBAQVYQ29udHJpYnV0aW9uUGVyaW9kT3ZlcgEBBTRJbnZhbGlkT3JpZ2luAQEFME5vdFBhcmFjaGFpbgEBBSxMZWFzZUFjdGl2ZQEBBUBCaWRPckxlYXNlQWN0aXZlAQEFMEZ1bmROb3RFbmRlZAEBBTxOb0NvbnRyaWJ1dGlvbnMBAQVITm90UmVhZHlUb0Rpc3NvbHZlAQEFQEludmFsaWRTaWduYXR1cmUBAQUwTWVtb1Rvb0xhcmdlAQEFREFscmVhZHlJbk5ld1JhaXNlAQEFSFZyZkRlbGF5SW5Qcm9ncmVzcwEBBTROb0xlYXNlUGVyaW9kAQEFNEFzc2lnbmVkU2xvdHMBAiQ8UGFyYURvZXNudEV4aXN0AQEFNE5vdFBhcmF0aHJlYWQBAQU0Q2Fubm90VXBncmFkZQEBBTxDYW5ub3REb3duZ3JhZGUBAQVMU2xvdEFscmVhZHlBc3NpZ25lZAEBBTxTbG90Tm90QXNzaWduZWQBAQVIT25nb2luZ0xlYXNlRXhpc3RzAQEFZE1heFBlcm1hbmVudFNsb3RzRXhjZWVkZWQBAQVkTWF4VGVtcG9yYXJ5U2xvdHNFeGNlZWRlZAEBBSBDb3JldGltZQECDCROb3RCcm9rZXIBAQVYUmVxdWVzdGVkRnV0dXJlUmV2ZW51ZQEBBUxBc3NldFRyYW5zZmVyRmFpbGVkAQEFPFN0YWtpbmdBaENsaWVudAECBBxCbG9ja2VkAQEFUE11bHRpQmxvY2tNaWdyYXRpb25zAQIEHE9uZ29pbmcBAQUkWGNtUGFsbGV0AQJwLFVucmVhY2hhYmxlAQEFLFNlbmRGYWlsdXJlAQEFIEZpbHRlcmVkAQEFSFVud2VpZ2hhYmxlTWVzc2FnZQEBBWBEZXN0aW5hdGlvbk5vdEludmVydGlibGUBAQUURW1wdHkBAQU4Q2Fubm90UmVhbmNob3IBAQU0VG9vTWFueUFzc2V0cwEBBTRJbnZhbGlkT3JpZ2luAQEFKEJhZFZlcnNpb24BAQUsQmFkTG9jYXRpb24BAQU4Tm9TdWJzY3JpcHRpb24BAQVEQWxyZWFkeVN1YnNjcmliZWQBAQVYQ2Fubm90Q2hlY2tPdXRUZWxlcG9ydAEBBShMb3dCYWxhbmNlAQEFMFRvb01hbnlMb2NrcwEBBUxBY2NvdW50Tm90U292ZXJlaWduAQEFKEZlZXNOb3RNZXQBAQUwTG9ja05vdEZvdW5kAQEFFEluVXNlAQEFaEludmFsaWRBc3NldFVua25vd25SZXNlcnZlAQEFeEludmFsaWRBc3NldFVuc3VwcG9ydGVkUmVzZXJ2ZQEBBTxUb29NYW55UmVzZXJ2ZXMBAQVgTG9jYWxFeGVjdXRpb25JbmNvbXBsZXRlAQEFYFRvb01hbnlBdXRob3JpemVkQWxpYXNlcwEBBTRFeHBpcmVzSW5QYXN0AQEFNEFsaWFzTm90Rm91bmQBAQWETG9jYWxFeGVjdXRpb25JbmNvbXBsZXRlV2l0aEVycm9yAQAIFGluZGV4BBRlcnJvcuUNME1lc3NhZ2VRdWV1ZQECJCxOb3RSZWFwYWJsZQEBBRhOb1BhZ2UBAQUkTm9NZXNzYWdlAQEFQEFscmVhZHlQcm9jZXNzZWQBAQUYUXVldWVkAQEFSEluc3VmZmljaWVudFdlaWdodAEBBWBUZW1wb3JhcmlseVVucHJvY2Vzc2FibGUBAQUsUXVldWVQYXVzZWQBAQVMUmVjdXJzaXZlRGlzYWxsb3dlZAEBBSRBc3NldFJhdGUBAgxAVW5rbm93bkFzc2V0S2luZAEBBTRBbHJlYWR5RXhpc3RzAQEFIE92ZXJmbG93AQEFLFJvb3RUZXN0aW5nAQEFGE1ldGFUeAECGCBCYWRQcm9vZgEBBRhGdXR1cmUBAQUUU3RhbGUBAQVEQW5jaWVudEJpcnRoQmxvY2sBAQU0VW5rbm93bk9yaWdpbgEBBRxJbnZhbGlkAQEFPFZlcmlmeVNpZ25hdHVyZQEBBRRCZWVmeQECHGBJbnZhbGlkS2V5T3duZXJzaGlwUHJvb2YBAQVgSW52YWxpZERvdWJsZVZvdGluZ1Byb29mAQEFWEludmFsaWRGb3JrVm90aW5nUHJvb2YBAQV0SW52YWxpZEZ1dHVyZUJsb2NrVm90aW5nUHJvb2YBAQV8SW52YWxpZEVxdWl2b2NhdGlvblByb29mU2Vzc2lvbgEBBVhEdXBsaWNhdGVPZmZlbmNlUmVwb3J0AQEFUEludmFsaWRDb25maWd1cmF0aW9uAQEFDE1tcgEBBTBCZWVmeU1tckxlYWYBAQVASWRlbnRpdHlNaWdyYXRvcgEBBQI4QEludmFsaWRTdGF0ZVJvb3QBAQVISW5jb21wbGV0ZURhdGFiYXNlAQEFUFZhbHVlQXRJbmNvbXBsZXRlS2V5AQEFMERlY29kZXJFcnJvcgEBBSxJbnZhbGlkSGFzaAEBBTBEdXBsaWNhdGVLZXkBAQU4RXh0cmFuZW91c05vZGUBAQU8RXh0cmFuZW91c1ZhbHVlAQEFXEV4dHJhbmVvdXNIYXNoUmVmZXJlbmNlAQEFVEludmFsaWRDaGlsZFJlZmVyZW5jZQEBBTRWYWx1ZU1pc21hdGNoAQEFPEluY29tcGxldGVQcm9vZgEBBTBSb290TWlzbWF0Y2gBAQUsRGVjb2RlRXJyb3IBAQUCPBRPdGhlcgEBBTBDYW5ub3RMb29rdXABAQUkQmFkT3JpZ2luAQEFGE1vZHVsZQECDQEYU3lzdGVtAQIkPEludmFsaWRTcGVjTmFtZQEBBWhTcGVjVmVyc2lvbk5lZWRzVG9JbmNyZWFzZQEBBXRGYWlsZWRUb0V4dHJhY3RSdW50aW1lVmVyc2lvbgEBBUxOb25EZWZhdWx0Q29tcG9zaXRlAQEFPE5vblplcm9SZWZDb3VudAEBBTBDYWxsRmlsdGVyZWQBAQVsTXVsdGlCbG9ja01pZ3JhdGlvbnNPbmdvaW5nAQEFRE5vdGhpbmdBdXRob3JpemVkAQEFMFVuYXV0aG9yaXplZAEBBRBCYWJlAQIQYEludmFsaWRFcXVpdm9jYXRpb25Qcm9vZgEBBWBJbnZhbGlkS2V5T3duZXJzaGlwUHJvb2YBAQVYRHVwbGljYXRlT2ZmZW5jZVJlcG9ydAEBBVBJbnZhbGlkQ29uZmlndXJhdGlvbgEBBSRUaW1lc3RhbXABAQUcSW5kaWNlcwECFCxOb3RBc3NpZ25lZAEBBSBOb3RPd25lcgEBBRRJblVzZQEBBSxOb3RUcmFuc2ZlcgEBBSRQZXJtYW5lbnQBAQUgQmFsYW5jZXMBAjA4VmVzdGluZ0JhbGFuY2UBAQVUTGlxdWlkaXR5UmVzdHJpY3Rpb25zAQEFTEluc3VmZmljaWVudEJhbGFuY2UBAQVIRXhpc3RlbnRpYWxEZXBvc2l0AQEFNEV4cGVuZGFiaWxpdHkBAQVcRXhpc3RpbmdWZXN0aW5nU2NoZWR1bGUBAQUsRGVhZEFjY291bnQBAQU8VG9vTWFueVJlc2VydmVzAQEFMFRvb01hbnlIb2xkcwEBBThUb29NYW55RnJlZXplcwEBBUxJc3N1YW5jZURlYWN0aXZhdGVkAQEFJERlbHRhWmVybwEBBUhUcmFuc2FjdGlvblBheW1lbnQBAQUoQXV0aG9yc2hpcAEBBRxTdGFraW5nAQKINE5vdENvbnRyb2xsZXIBAQUgTm90U3Rhc2gBAQU0QWxyZWFkeUJvbmRlZAEBBTRBbHJlYWR5UGFpcmVkAQEFMEVtcHR5VGFyZ2V0cwEBBThEdXBsaWNhdGVJbmRleAEBBURJbnZhbGlkU2xhc2hJbmRleAEBBUBJbnN1ZmZpY2llbnRCb25kAQEFME5vTW9yZUNodW5rcwEBBTROb1VubG9ja0NodW5rAQEFMEZ1bmRlZFRhcmdldAEBBUhJbnZhbGlkRXJhVG9SZXdhcmQBAQVoSW52YWxpZE51bWJlck9mTm9taW5hdGlvbnMBAQVITm90U29ydGVkQW5kVW5pcXVlAQEFOEFscmVhZHlDbGFpbWVkAQEFLEludmFsaWRQYWdlAQEFVEluY29ycmVjdEhpc3RvcnlEZXB0aAEBBVhJbmNvcnJlY3RTbGFzaGluZ1NwYW5zAQEFIEJhZFN0YXRlAQEFOFRvb01hbnlUYXJnZXRzAQEFJEJhZFRhcmdldAEBBUBDYW5ub3RDaGlsbE90aGVyAQEFRFRvb01hbnlOb21pbmF0b3JzAQEFRFRvb01hbnlWYWxpZGF0b3JzAQEFQENvbW1pc3Npb25Ub29Mb3cBAQUsQm91bmROb3RNZXQBAQVQQ29udHJvbGxlckRlcHJlY2F0ZWQBAQVMQ2Fubm90UmVzdG9yZUxlZGdlcgEBBWxSZXdhcmREZXN0aW5hdGlvblJlc3RyaWN0ZWQBAQU4Tm90RW5vdWdoRnVuZHMBAQVcVmlydHVhbFN0YWtlck5vdEFsbG93ZWQBAQU8Q2Fubm90UmVhcFN0YXNoAQEFPEFscmVhZHlNaWdyYXRlZAEBBShSZXN0cmljdGVkAQEFIE9mZmVuY2VzAQEFKEhpc3RvcmljYWwBAQUoUGFyYW1ldGVycwEBBRxTZXNzaW9uAQIUMEludmFsaWRQcm9vZgEBBVxOb0Fzc29jaWF0ZWRWYWxpZGF0b3JJZAEBBTREdXBsaWNhdGVkS2V5AQEFGE5vS2V5cwEBBSROb0FjY291bnQBAQUcR3JhbmRwYQECHCxQYXVzZUZhaWxlZAEBBTBSZXN1bWVGYWlsZWQBAQU0Q2hhbmdlUGVuZGluZwEBBRxUb29Tb29uAQEFYEludmFsaWRLZXlPd25lcnNoaXBQcm9vZgEBBWBJbnZhbGlkRXF1aXZvY2F0aW9uUHJvb2YBAQVYRHVwbGljYXRlT2ZmZW5jZVJlcG9ydAEBBUhBdXRob3JpdHlEaXNjb3ZlcnkBAQUcVXRpbGl0eQECBDBUb29NYW55Q2FsbHMBAQUgSWRlbnRpdHkBAnhIVG9vTWFueVN1YkFjY291bnRzAQEFIE5vdEZvdW5kAQEFIE5vdE5hbWVkAQEFKEVtcHR5SW5kZXgBAQUoRmVlQ2hhbmdlZAEBBShOb0lkZW50aXR5AQEFPFN0aWNreUp1ZGdlbWVudAEBBThKdWRnZW1lbnRHaXZlbgEBBUBJbnZhbGlkSnVkZ2VtZW50AQEFMEludmFsaWRJbmRleAEBBTRJbnZhbGlkVGFyZ2V0AQEFRFRvb01hbnlSZWdpc3RyYXJzAQEFOEFscmVhZHlDbGFpbWVkAQEFGE5vdFN1YgEBBSBOb3RPd25lZAEBBXRKdWRnZW1lbnRGb3JEaWZmZXJlbnRJZGVudGl0eQEBBVhKdWRnZW1lbnRQYXltZW50RmFpbGVkAQEFNEludmFsaWRTdWZmaXgBAQVQTm90VXNlcm5hbWVBdXRob3JpdHkBAQUwTm9BbGxvY2F0aW9uAQEFQEludmFsaWRTaWduYXR1cmUBAQVEUmVxdWlyZXNTaWduYXR1cmUBAQU8SW52YWxpZFVzZXJuYW1lAQEFNFVzZXJuYW1lVGFrZW4BAQUoTm9Vc2VybmFtZQEBBShOb3RFeHBpcmVkAQEFIFRvb0Vhcmx5AQEFME5vdFVuYmluZGluZwEBBUBBbHJlYWR5VW5iaW5kaW5nAQEFWEluc3VmZmljaWVudFByaXZpbGVnZXMBAQUgUmVjb3ZlcnkBAkAoTm90QWxsb3dlZAEBBTRaZXJvVGhyZXNob2xkAQEFQE5vdEVub3VnaEZyaWVuZHMBAQUoTWF4RnJpZW5kcwEBBSROb3RTb3J0ZWQBAQU4Tm90UmVjb3ZlcmFibGUBAQVIQWxyZWFkeVJlY292ZXJhYmxlAQEFOEFscmVhZHlTdGFydGVkAQEFKE5vdFN0YXJ0ZWQBAQUkTm90RnJpZW5kAQEFLERlbGF5UGVyaW9kAQEFOEFscmVhZHlWb3VjaGVkAQEFJFRocmVzaG9sZAEBBSxTdGlsbEFjdGl2ZQEBBTBBbHJlYWR5UHJveHkBAQUgQmFkU3RhdGUBAQUcVmVzdGluZwECFChOb3RWZXN0aW5nAQEFVEF0TWF4VmVzdGluZ1NjaGVkdWxlcwEBBSRBbW91bnRMb3cBAQVgU2NoZWR1bGVJbmRleE91dE9mQm91bmRzAQEFVEludmFsaWRTY2hlZHVsZVBhcmFtcwEBBSRTY2hlZHVsZXIBAhRARmFpbGVkVG9TY2hlZHVsZQEBBSBOb3RGb3VuZAEBBVxUYXJnZXRCbG9ja051bWJlckluUGFzdAEBBUhSZXNjaGVkdWxlTm9DaGFuZ2UBAQUUTmFtZWQBAQUgUHJlaW1hZ2UBAiAYVG9vQmlnAQEFMEFscmVhZHlOb3RlZAEBBTROb3RBdXRob3JpemVkAQEFIE5vdE5vdGVkAQEFJFJlcXVlc3RlZAEBBTBOb3RSZXF1ZXN0ZWQBAQUcVG9vTWFueQEBBRhUb29GZXcBAQUQU3VkbwECBCxSZXF1aXJlU3VkbwEBBRRQcm94eQECIBxUb29NYW55AQEFIE5vdEZvdW5kAQEFIE5vdFByb3h5AQEFLFVucHJveHlhYmxlAQEFJER1cGxpY2F0ZQEBBTBOb1Blcm1pc3Npb24BAQUsVW5hbm5vdW5jZWQBAQUsTm9TZWxmUHJveHkBAQUgTXVsdGlzaWcBAjhATWluaW11bVRocmVzaG9sZAEBBTxBbHJlYWR5QXBwcm92ZWQBAQVETm9BcHByb3ZhbHNOZWVkZWQBAQVEVG9vRmV3U2lnbmF0b3JpZXMBAQVIVG9vTWFueVNpZ25hdG9yaWVzAQEFVFNpZ25hdG9yaWVzT3V0T2ZPcmRlcgEBBUxTZW5kZXJJblNpZ25hdG9yaWVzAQEFIE5vdEZvdW5kAQEFIE5vdE93bmVyAQEFLE5vVGltZXBvaW50AQEFOFdyb25nVGltZXBvaW50AQEFTFVuZXhwZWN0ZWRUaW1lcG9pbnQBAQU8TWF4V2VpZ2h0VG9vTG93AQEFNEFscmVhZHlTdG9yZWQBAQVoRWxlY3Rpb25Qcm92aWRlck11bHRpUGhhc2UBAjxoUHJlRGlzcGF0Y2hFYXJseVN1Ym1pc3Npb24BAQVsUHJlRGlzcGF0Y2hXcm9uZ1dpbm5lckNvdW50AQEFZFByZURpc3BhdGNoV2Vha1N1Ym1pc3Npb24BAQU8U2lnbmVkUXVldWVGdWxsAQEFWFNpZ25lZENhbm5vdFBheURlcG9zaXQBAQVQU2lnbmVkSW52YWxpZFdpdG5lc3MBAQVMU2lnbmVkVG9vTXVjaFdlaWdodAEBBTxPY3dDYWxsV3JvbmdFcmEBAQVcTWlzc2luZ1NuYXBzaG90TWV0YWRhdGEBAQVYSW52YWxpZFN1Ym1pc3Npb25JbmRleAEBBThDYWxsTm90QWxsb3dlZAEBBThGYWxsYmFja0ZhaWxlZAEBBSxCb3VuZE5vdE1ldAEBBThUb29NYW55V2lubmVycwEBBWRQcmVEaXNwYXRjaERpZmZlcmVudFJvdW5kAQEFJFZvdGVyTGlzdAECCBBMaXN0AQIUJER1cGxpY2F0ZQEBBShOb3RIZWF2aWVyAQEFME5vdEluU2FtZUJhZwEBBTBOb2RlTm90Rm91bmQBAQUYTG9ja2VkAQEFGExvY2tlZAEBBTxOb21pbmF0aW9uUG9vbHMBApgwUG9vbE5vdEZvdW5kAQEFSFBvb2xNZW1iZXJOb3RGb3VuZAEBBUhSZXdhcmRQb29sTm90Rm91bmQBAQVAU3ViUG9vbHNOb3RGb3VuZAEBBWRBY2NvdW50QmVsb25nc1RvT3RoZXJQb29sAQEFOEZ1bGx5VW5ib25kaW5nAQEFRE1heFVuYm9uZGluZ0xpbWl0AQEFRENhbm5vdFdpdGhkcmF3QW55AQEFRE1pbmltdW1Cb25kTm90TWV0AQEFME92ZXJmbG93UmlzawEBBTROb3REZXN0cm95aW5nAQEFME5vdE5vbWluYXRvcgEBBVROb3RLaWNrZXJPckRlc3Ryb3lpbmcBAQUcTm90T3BlbgEBBSBNYXhQb29scwEBBThNYXhQb29sTWVtYmVycwEBBURDYW5Ob3RDaGFuZ2VTdGF0ZQEBBVREb2VzTm90SGF2ZVBlcm1pc3Npb24BAQVUTWV0YWRhdGFFeGNlZWRzTWF4TGVuAQEFJERlZmVuc2l2ZQECHGhOb3RFbm91Z2hTcGFjZUluVW5ib25kUG9vbAEBBTBQb29sTm90Rm91bmQBAQVIUmV3YXJkUG9vbE5vdEZvdW5kAQEFQFN1YlBvb2xzTm90Rm91bmQBAQVwQm9uZGVkU3Rhc2hLaWxsZWRQcmVtYXR1cmVseQEBBVREZWxlZ2F0aW9uVW5zdXBwb3J0ZWQBAQU8U2xhc2hOb3RBcHBsaWVkAQEFnFBhcnRpYWxVbmJvbmROb3RBbGxvd2VkUGVybWlzc2lvbmxlc3NseQEBBVxNYXhDb21taXNzaW9uUmVzdHJpY3RlZAEBBWBDb21taXNzaW9uRXhjZWVkc01heGltdW0BAQV4Q29tbWlzc2lvbkV4Y2VlZHNHbG9iYWxNYXhpbXVtAQEFZENvbW1pc3Npb25DaGFuZ2VUaHJvdHRsZWQBAQV4Q29tbWlzc2lvbkNoYW5nZVJhdGVOb3RBbGxvd2VkAQEFTE5vUGVuZGluZ0NvbW1pc3Npb24BAQVYTm9Db21taXNzaW9uQ3VycmVudFNldAEBBSxQb29sSWRJblVzZQEBBTRJbnZhbGlkUG9vbElkAQEFTEJvbmRFeHRyYVJlc3RyaWN0ZWQBAQU8Tm90aGluZ1RvQWRqdXN0AQEFOE5vdGhpbmdUb1NsYXNoAQEFLFNsYXNoVG9vTG93AQEFPEFscmVhZHlNaWdyYXRlZAEBBSxOb3RNaWdyYXRlZAEBBTBOb3RTdXBwb3J0ZWQBAQUoUmVzdHJpY3RlZAEBBSxGYXN0VW5zdGFrZQECGDROb3RDb250cm9sbGVyAQEFNEFscmVhZHlRdWV1ZWQBAQU4Tm90RnVsbHlCb25kZWQBAQUkTm90UXVldWVkAQEFLEFscmVhZHlIZWFkAQEFOENhbGxOb3RBbGxvd2VkAQEFQENvbnZpY3Rpb25Wb3RpbmcBAjAoTm90T25nb2luZwEBBSBOb3RWb3RlcgEBBTBOb1Blcm1pc3Npb24BAQU8Tm9QZXJtaXNzaW9uWWV0AQEFREFscmVhZHlEZWxlZ2F0aW5nAQEFNEFscmVhZHlWb3RpbmcBAQVESW5zdWZmaWNpZW50RnVuZHMBAQU0Tm90RGVsZWdhdGluZwEBBSBOb25zZW5zZQEBBTxNYXhWb3Rlc1JlYWNoZWQBAQUsQ2xhc3NOZWVkZWQBAQUgQmFkQ2xhc3MBAQUkUmVmZXJlbmRhAQI4KE5vdE9uZ29pbmcBAQUoSGFzRGVwb3NpdAEBBSBCYWRUcmFjawEBBRBGdWxsAQEFKFF1ZXVlRW1wdHkBAQU0QmFkUmVmZXJlbmR1bQEBBSxOb3RoaW5nVG9EbwEBBRxOb1RyYWNrAQEFKFVuZmluaXNoZWQBAQUwTm9QZXJtaXNzaW9uAQEFJE5vRGVwb3NpdAEBBSRCYWRTdGF0dXMBAQVAUHJlaW1hZ2VOb3RFeGlzdAEBBYRQcmVpbWFnZVN0b3JlZFdpdGhEaWZmZXJlbnRMZW5ndGgBAQUcT3JpZ2lucwEBBSRXaGl0ZWxpc3QBAhRMVW5hdmFpbGFibGVQcmVJbWFnZQEBBTxVbmRlY29kYWJsZUNhbGwBAQVgSW52YWxpZENhbGxXZWlnaHRXaXRuZXNzAQEFUENhbGxJc05vdFdoaXRlbGlzdGVkAQEFWENhbGxBbHJlYWR5V2hpdGVsaXN0ZWQBAQUgVHJlYXN1cnkBAiwwSW52YWxpZEluZGV4AQEFQFRvb01hbnlBcHByb3ZhbHMBAQVYSW5zdWZmaWNpZW50UGVybWlzc2lvbgEBBUxQcm9wb3NhbE5vdEFwcHJvdmVkAQEFWEZhaWxlZFRvQ29udmVydEJhbGFuY2UBAQUwU3BlbmRFeHBpcmVkAQEFLEVhcmx5UGF5b3V0AQEFQEFscmVhZHlBdHRlbXB0ZWQBAQUsUGF5b3V0RXJyb3IBAQUwTm90QXR0ZW1wdGVkAQEFMEluY29uY2x1c2l2ZQEBBUBEZWxlZ2F0ZWRTdGFraW5nAQIwKE5vdEFsbG93ZWQBAQU4QWxyZWFkeVN0YWtpbmcBAQVgSW52YWxpZFJld2FyZERlc3RpbmF0aW9uAQEFREludmFsaWREZWxlZ2F0aW9uAQEFOE5vdEVub3VnaEZ1bmRzAQEFIE5vdEFnZW50AQEFME5vdERlbGVnYXRvcgEBBSBCYWRTdGF0ZQEBBThVbmFwcGxpZWRTbGFzaAEBBThOb3RoaW5nVG9TbGFzaAEBBThXaXRoZHJhd0ZhaWxlZAEBBTBOb3RTdXBwb3J0ZWQBAQVAUGFyYWNoYWluc09yaWdpbgEBBTRDb25maWd1cmF0aW9uAQIEPEludmFsaWROZXdWYWx1ZQEBBSxQYXJhc1NoYXJlZAEBBTRQYXJhSW5jbHVzaW9uAQJEZFZhbGlkYXRvckluZGV4T3V0T2ZCb3VuZHMBAQVQVW5zY2hlZHVsZWRDYW5kaWRhdGUBAQVASGVhZERhdGFUb29MYXJnZQEBBVBQcmVtYXR1cmVDb2RlVXBncmFkZQEBBTxOZXdDb2RlVG9vTGFyZ2UBAQVURGlzYWxsb3dlZFJlbGF5UGFyZW50AQEFREludmFsaWRBc3NpZ25tZW50AQEFREludmFsaWRHcm91cEluZGV4AQEFTEluc3VmZmljaWVudEJhY2tpbmcBAQU4SW52YWxpZEJhY2tpbmcBAQVoVmFsaWRhdGlvbkRhdGFIYXNoTWlzbWF0Y2gBAQWASW5jb3JyZWN0RG93bndhcmRNZXNzYWdlSGFuZGxpbmcBAQVUSW52YWxpZFVwd2FyZE1lc3NhZ2VzAQEFYEhybXBXYXRlcm1hcmtNaXNoYW5kbGluZwEBBUxJbnZhbGlkT3V0Ym91bmRIcm1wAQEFZEludmFsaWRWYWxpZGF0aW9uQ29kZUhhc2gBAQVAUGFyYUhlYWRNaXNtYXRjaAEBBTBQYXJhSW5oZXJlbnQBAhBkVG9vTWFueUluY2x1c2lvbkluaGVyZW50cwEBBUxJbnZhbGlkUGFyZW50SGVhZGVyAQEFjEluaGVyZW50RGF0YUZpbHRlcmVkRHVyaW5nRXhlY3V0aW9uAQEFUFVuc2NoZWR1bGVkQ2FuZGlkYXRlAQEFNFBhcmFTY2hlZHVsZXIBAQUUUGFyYXMBAkA0Tm90UmVnaXN0ZXJlZAEBBTRDYW5ub3RPbmJvYXJkAQEFOENhbm5vdE9mZmJvYXJkAQEFNENhbm5vdFVwZ3JhZGUBAQU8Q2Fubm90RG93bmdyYWRlAQEFWFB2ZkNoZWNrU3RhdGVtZW50U3RhbGUBAQVcUHZmQ2hlY2tTdGF0ZW1lbnRGdXR1cmUBAQWEUHZmQ2hlY2tWYWxpZGF0b3JJbmRleE91dE9mQm91bmRzAQEFYFB2ZkNoZWNrSW52YWxpZFNpZ25hdHVyZQEBBUhQdmZDaGVja0RvdWJsZVZvdGUBAQVYUHZmQ2hlY2tTdWJqZWN0SW52YWxpZAEBBURDYW5ub3RVcGdyYWRlQ29kZQEBBSxJbnZhbGlkQ29kZQEBBUROb3RoaW5nQXV0aG9yaXplZAEBBTBVbmF1dGhvcml6ZWQBAQVISW52YWxpZEJsb2NrTnVtYmVyAQEFLEluaXRpYWxpemVyAQEFDERtcAEBBRBIcm1wAQJQVE9wZW5Icm1wQ2hhbm5lbFRvU2VsZgEBBXxPcGVuSHJtcENoYW5uZWxJbnZhbGlkUmVjaXBpZW50AQEFbE9wZW5Icm1wQ2hhbm5lbFplcm9DYXBhY2l0eQEBBYxPcGVuSHJtcENoYW5uZWxDYXBhY2l0eUV4Y2VlZHNMaW1pdAEBBXhPcGVuSHJtcENoYW5uZWxaZXJvTWVzc2FnZVNpemUBAQWYT3BlbkhybXBDaGFubmVsTWVzc2FnZVNpemVFeGNlZWRzTGltaXQBAQVwT3BlbkhybXBDaGFubmVsQWxyZWFkeUV4aXN0cwEBBXxPcGVuSHJtcENoYW5uZWxBbHJlYWR5UmVxdWVzdGVkAQEFcE9wZW5Icm1wQ2hhbm5lbExpbWl0RXhjZWVkZWQBAQVwQWNjZXB0SHJtcENoYW5uZWxEb2VzbnRFeGlzdAEBBYRBY2NlcHRIcm1wQ2hhbm5lbEFscmVhZHlDb25maXJtZWQBAQV4QWNjZXB0SHJtcENoYW5uZWxMaW1pdEV4Y2VlZGVkAQEFcENsb3NlSHJtcENoYW5uZWxVbmF1dGhvcml6ZWQBAQVsQ2xvc2VIcm1wQ2hhbm5lbERvZXNudEV4aXN0AQEFfENsb3NlSHJtcENoYW5uZWxBbHJlYWR5VW5kZXJ3YXkBAQWEQ2FuY2VsSHJtcE9wZW5DaGFubmVsVW5hdXRob3JpemVkAQEFaE9wZW5Icm1wQ2hhbm5lbERvZXNudEV4aXN0AQEFfE9wZW5Icm1wQ2hhbm5lbEFscmVhZHlDb25maXJtZWQBAQUwV3JvbmdXaXRuZXNzAQEFcENoYW5uZWxDcmVhdGlvbk5vdEF1dGhvcml6ZWQBAQU8UGFyYVNlc3Npb25JbmZvAQEFNFBhcmFzRGlzcHV0ZXMBAiR0RHVwbGljYXRlRGlzcHV0ZVN0YXRlbWVudFNldHMBAQVcQW5jaWVudERpc3B1dGVTdGF0ZW1lbnQBAQVkVmFsaWRhdG9ySW5kZXhPdXRPZkJvdW5kcwEBBUBJbnZhbGlkU2lnbmF0dXJlAQEFSER1cGxpY2F0ZVN0YXRlbWVudAEBBUhTaW5nbGVTaWRlZERpc3B1dGUBAQU8TWFsaWNpb3VzQmFja2VyAQEFTE1pc3NpbmdCYWNraW5nVm90ZXMBAQVIVW5jb25maXJtZWREaXNwdXRlAQEFNFBhcmFzU2xhc2hpbmcBAhhgSW52YWxpZEtleU93bmVyc2hpcFByb29mAQEFTEludmFsaWRTZXNzaW9uSW5kZXgBAQVQSW52YWxpZENhbmRpZGF0ZUhhc2gBAQVUSW52YWxpZFZhbGlkYXRvckluZGV4AQEFYFZhbGlkYXRvckluZGV4SWRNaXNtYXRjaAEBBVxEdXBsaWNhdGVTbGFzaGluZ1JlcG9ydAEBBWhPbkRlbWFuZEFzc2lnbm1lbnRQcm92aWRlcgECDCRRdWV1ZUZ1bGwBAQVwU3BvdFByaWNlSGlnaGVyVGhhbk1heEFtb3VudAEBBUxJbnN1ZmZpY2llbnRDcmVkaXRzAQEFaENvcmV0aW1lQXNzaWdubWVudFByb3ZpZGVyAQIIQEFzc2lnbm1lbnRzRW1wdHkBAQVARGlzYWxsb3dlZEluc2VydAEBBSRSZWdpc3RyYXIBAjg0Tm90UmVnaXN0ZXJlZAEBBURBbHJlYWR5UmVnaXN0ZXJlZAEBBSBOb3RPd25lcgEBBTBDb2RlVG9vTGFyZ2UBAQVASGVhZERhdGFUb29MYXJnZQEBBTBOb3RQYXJhY2hhaW4BAQU0Tm90UGFyYXRocmVhZAEBBUBDYW5ub3REZXJlZ2lzdGVyAQEFPENhbm5vdERvd25ncmFkZQEBBTRDYW5ub3RVcGdyYWRlAQEFKFBhcmFMb2NrZWQBAQUsTm90UmVzZXJ2ZWQBAQUsSW52YWxpZENvZGUBAQUoQ2Fubm90U3dhcAEBBRRTbG90cwECCERQYXJhTm90T25ib2FyZGluZwEBBShMZWFzZUVycm9yAQEFQFBhcmFzU3Vkb1dyYXBwZXIBAig8UGFyYURvZXNudEV4aXN0AQEFRFBhcmFBbHJlYWR5RXhpc3RzAQEFVEV4Y2VlZHNNYXhNZXNzYWdlU2l6ZQEBBShVbnJvdXRhYmxlAQEFOENvdWxkbnRDbGVhbnVwAQEFNE5vdFBhcmF0aHJlYWQBAQUwTm90UGFyYWNoYWluAQEFNENhbm5vdFVwZ3JhZGUBAQU8Q2Fubm90RG93bmdyYWRlAQEFMFRvb01hbnlDb3JlcwEBBSBBdWN0aW9ucwECHERBdWN0aW9uSW5Qcm9ncmVzcwEBBURMZWFzZVBlcmlvZEluUGFzdAEBBURQYXJhTm90UmVnaXN0ZXJlZAEBBUROb3RDdXJyZW50QXVjdGlvbgEBBShOb3RBdWN0aW9uAQEFMEF1Y3Rpb25FbmRlZAEBBUBBbHJlYWR5TGVhc2VkT3V0AQEFJENyb3dkbG9hbgECXERGaXJzdFBlcmlvZEluUGFzdAEBBWRGaXJzdFBlcmlvZFRvb0ZhckluRnV0dXJlAQEFbExhc3RQZXJpb2RCZWZvcmVGaXJzdFBlcmlvZAEBBWBMYXN0UGVyaW9kVG9vRmFySW5GdXR1cmUBAQU8Q2Fubm90RW5kSW5QYXN0AQEFREVuZFRvb0ZhckluRnV0dXJlAQEFIE92ZXJmbG93AQEFUENvbnRyaWJ1dGlvblRvb1NtYWxsAQEFNEludmFsaWRQYXJhSWQBAQUsQ2FwRXhjZWVkZWQBAQVYQ29udHJpYnV0aW9uUGVyaW9kT3ZlcgEBBTRJbnZhbGlkT3JpZ2luAQEFME5vdFBhcmFjaGFpbgEBBSxMZWFzZUFjdGl2ZQEBBUBCaWRPckxlYXNlQWN0aXZlAQEFMEZ1bmROb3RFbmRlZAEBBTxOb0NvbnRyaWJ1dGlvbnMBAQVITm90UmVhZHlUb0Rpc3NvbHZlAQEFQEludmFsaWRTaWduYXR1cmUBAQUwTWVtb1Rvb0xhcmdlAQEFREFscmVhZHlJbk5ld1JhaXNlAQEFSFZyZkRlbGF5SW5Qcm9ncmVzcwEBBTROb0xlYXNlUGVyaW9kAQEFNEFzc2lnbmVkU2xvdHMBAiQ8UGFyYURvZXNudEV4aXN0AQEFNE5vdFBhcmF0aHJlYWQBAQU0Q2Fubm90VXBncmFkZQEBBTxDYW5ub3REb3duZ3JhZGUBAQVMU2xvdEFscmVhZHlBc3NpZ25lZAEBBTxTbG90Tm90QXNzaWduZWQBAQVIT25nb2luZ0xlYXNlRXhpc3RzAQEFZE1heFBlcm1hbmVudFNsb3RzRXhjZWVkZWQBAQVkTWF4VGVtcG9yYXJ5U2xvdHNFeGNlZWRlZAEBBSBDb3JldGltZQECDCROb3RCcm9rZXIBAQVYUmVxdWVzdGVkRnV0dXJlUmV2ZW51ZQEBBUxBc3NldFRyYW5zZmVyRmFpbGVkAQEFPFN0YWtpbmdBaENsaWVudAECBBxCbG9ja2VkAQEFUE11bHRpQmxvY2tNaWdyYXRpb25zAQIEHE9uZ29pbmcBAQUkWGNtUGFsbGV0AQJwLFVucmVhY2hhYmxlAQEFLFNlbmRGYWlsdXJlAQEFIEZpbHRlcmVkAQEFSFVud2VpZ2hhYmxlTWVzc2FnZQEBBWBEZXN0aW5hdGlvbk5vdEludmVydGlibGUBAQUURW1wdHkBAQU4Q2Fubm90UmVhbmNob3IBAQU0VG9vTWFueUFzc2V0cwEBBTRJbnZhbGlkT3JpZ2luAQEFKEJhZFZlcnNpb24BAQUsQmFkTG9jYXRpb24BAQU4Tm9TdWJzY3JpcHRpb24BAQVEQWxyZWFkeVN1YnNjcmliZWQBAQVYQ2Fubm90Q2hlY2tPdXRUZWxlcG9ydAEBBShMb3dCYWxhbmNlAQEFMFRvb01hbnlMb2NrcwEBBUxBY2NvdW50Tm90U292ZXJlaWduAQEFKEZlZXNOb3RNZXQBAQUwTG9ja05vdEZvdW5kAQEFFEluVXNlAQEFaEludmFsaWRBc3NldFVua25vd25SZXNlcnZlAQEFeEludmFsaWRBc3NldFVuc3VwcG9ydGVkUmVzZXJ2ZQEBBTxUb29NYW55UmVzZXJ2ZXMBAQVgTG9jYWxFeGVjdXRpb25JbmNvbXBsZXRlAQEFYFRvb01hbnlBdXRob3JpemVkQWxpYXNlcwEBBTRFeHBpcmVzSW5QYXN0AQEFNEFsaWFzTm90Rm91bmQBAQWETG9jYWxFeGVjdXRpb25JbmNvbXBsZXRlV2l0aEVycm9yAQAIFGluZGV4BBRlcnJvcuUNME1lc3NhZ2VRdWV1ZQECJCxOb3RSZWFwYWJsZQEBBRhOb1BhZ2UBAQUkTm9NZXNzYWdlAQEFQEFscmVhZHlQcm9jZXNzZWQBAQUYUXVldWVkAQEFSEluc3VmZmljaWVudFdlaWdodAEBBWBUZW1wb3JhcmlseVVucHJvY2Vzc2FibGUBAQUsUXVldWVQYXVzZWQBAQVMUmVjdXJzaXZlRGlzYWxsb3dlZAEBBSRBc3NldFJhdGUBAgxAVW5rbm93bkFzc2V0S2luZAEBBTRBbHJlYWR5RXhpc3RzAQEFIE92ZXJmbG93AQEFLFJvb3RUZXN0aW5nAQEFGE1ldGFUeAECGCBCYWRQcm9vZgEBBRhGdXR1cmUBAQUUU3RhbGUBAQVEQW5jaWVudEJpcnRoQmxvY2sBAQU0VW5rbm93bk9yaWdpbgEBBRxJbnZhbGlkAQEFPFZlcmlmeVNpZ25hdHVyZQEBBRRCZWVmeQECHGBJbnZhbGlkS2V5T3duZXJzaGlwUHJvb2YBAQVgSW52YWxpZERvdWJsZVZvdGluZ1Byb29mAQEFWEludmFsaWRGb3JrVm90aW5nUHJvb2YBAQV0SW52YWxpZEZ1dHVyZUJsb2NrVm90aW5nUHJvb2YBAQV8SW52YWxpZEVxdWl2b2NhdGlvblByb29mU2Vzc2lvbgEBBVhEdXBsaWNhdGVPZmZlbmNlUmVwb3J0AQEFUEludmFsaWRDb25maWd1cmF0aW9uAQEFDE1tcgEBBTBCZWVmeU1tckxlYWYBAQVASWRlbnRpdHlNaWdyYXRvcgEBBURDb25zdW1lclJlbWFpbmluZwEBBSxOb1Byb3ZpZGVycwEBBUBUb29NYW55Q29uc3VtZXJzAQEFFFRva2VuAQIoQEZ1bmRzVW5hdmFpbGFibGUBAQUwT25seVByb3ZpZGVyAQEFMEJlbG93TWluaW11bQEBBTBDYW5ub3RDcmVhdGUBAQUwVW5rbm93bkFzc2V0AQEFGEZyb3plbgEBBSxVbnN1cHBvcnRlZAEBBUBDYW5ub3RDcmVhdGVIb2xkAQEFNE5vdEV4cGVuZGFibGUBAQUcQmxvY2tlZAEBBShBcml0aG1ldGljAQIMJFVuZGVyZmxvdwEBBSBPdmVyZmxvdwEBBThEaXZpc2lvbkJ5WmVybwEBBTRUcmFuc2FjdGlvbmFsAQIIMExpbWl0UmVhY2hlZAEBBRxOb0xheWVyAQEFJEV4aGF1c3RlZAEBBShDb3JydXB0aW9uAQEFLFVuYXZhaWxhYmxlAQEFOFJvb3ROb3RBbGxvd2VkAQEFEFRyaWUBAjhASW52YWxpZFN0YXRlUm9vdAEBBUhJbmNvbXBsZXRlRGF0YWJhc2UBAQVQVmFsdWVBdEluY29tcGxldGVLZXkBAQUwRGVjb2RlckVycm9yAQEFLEludmFsaWRIYXNoAQEFMER1cGxpY2F0ZUtleQEBBThFeHRyYW5lb3VzTm9kZQEBBTxFeHRyYW5lb3VzVmFsdWUBAQVcRXh0cmFuZW91c0hhc2hSZWZlcmVuY2UBAQVUSW52YWxpZENoaWxkUmVmZXJlbmNlAQEFNFZhbHVlTWlzbWF0Y2gBAQU8SW5jb21wbGV0ZVByb29mAQEFMFJvb3RNaXNtYXRjaAEBBSxEZWNvZGVFcnJvcgEBBQIgQEV4dHJpbnNpY1N1Y2Nlc3MBAAQ0ZGlzcGF0Y2hfaW5mb0A8RXh0cmluc2ljRmFpbGVkAQAIOGRpc3BhdGNoX2Vycm9y/Q00ZGlzcGF0Y2hfaW5mb0AsQ29kZVVwZGF0ZWQBAQUoTmV3QWNjb3VudAEABBxhY2NvdW50ADRLaWxsZWRBY2NvdW50AQAEHGFjY291bnQAIFJlbWFya2VkAQAIGHNlbmRlcgAQaGFzaCBEVXBncmFkZUF1dGhvcml6ZWQBAAgkY29kZV9oYXNoIDRjaGVja192ZXJzaW9uFIBSZWplY3RlZEludmFsaWRBdXRob3JpemVkVXBncmFkZQEACCRjb2RlX2hhc2ggFGVycm9y/Q0CEDRJbmRleEFzc2lnbmVkAQAIDHdobwAUaW5kZXgEKEluZGV4RnJlZWQBAAQUaW5kZXgELEluZGV4RnJvemVuAQAIFGluZGV4BAx3aG8AMERlcG9zaXRQb2tlZAEAEAx3aG8AFGluZGV4BCxvbGRfZGVwb3NpdAgsbmV3X2RlcG9zaXQIAkwcRXJhUGFpZAEADCRlcmFfaW5kZXgEQHZhbGlkYXRvcl9wYXlvdXQIJHJlbWFpbmRlcgggUmV3YXJkZWQBAAwUc3Rhc2gAEGRlc3Q1ARhhbW91bnQIHFNsYXNoZWQBAAgYc3Rha2VyABhhbW91bnQINFNsYXNoUmVwb3J0ZWQBAAwkdmFsaWRhdG9yACBmcmFjdGlvbgQkc2xhc2hfZXJhBGhPbGRTbGFzaGluZ1JlcG9ydERpc2NhcmRlZAEABDRzZXNzaW9uX2luZGV4BDhTdGFrZXJzRWxlY3RlZAEBBRhCb25kZWQBAAgUc3Rhc2gAGGFtb3VudAggVW5ib25kZWQBAAgUc3Rhc2gAGGFtb3VudAgkV2l0aGRyYXduAQAIFHN0YXNoABhhbW91bnQIGEtpY2tlZAEACCRub21pbmF0b3IAFHN0YXNoAFRTdGFraW5nRWxlY3Rpb25GYWlsZWQBAQUcQ2hpbGxlZAEABBRzdGFzaAA0UGF5b3V0U3RhcnRlZAEAECRlcmFfaW5kZXgEPHZhbGlkYXRvcl9zdGFzaAAQcGFnZQQQbmV4dC0ERFZhbGlkYXRvclByZWZzU2V0AQAIFHN0YXNoABRwcmVmczkBaFNuYXBzaG90Vm90ZXJzU2l6ZUV4Y2VlZGVkAQAEEHNpemUEbFNuYXBzaG90VGFyZ2V0c1NpemVFeGNlZWRlZAEABBBzaXplBCBGb3JjZUVyYQEABBBtb2RlPQFkQ29udHJvbGxlckJhdGNoRGVwcmVjYXRlZAEABCBmYWlsdXJlcwRAQ3VycmVuY3lNaWdyYXRlZAEACBRzdGFzaAA4Zm9yY2Vfd2l0aGRyYXcIAggoUm9vdFN0b3JlZAEABBRpbmRleAQsUm9vdHNQcnVuZWQBAAQUdXBfdG8EAhAoTmV3U2Vzc2lvbgEABDRzZXNzaW9uX2luZGV4BCROZXdRdWV1ZWQBAQVEVmFsaWRhdG9yRGlzYWJsZWQBAAQkdmFsaWRhdG9yAEhWYWxpZGF0b3JSZWVuYWJsZWQBAAQkdmFsaWRhdG9yAAcVAf0NAiBAQmF0Y2hJbnRlcnJ1cHRlZAEACBRpbmRleAQUZXJyb3L9DThCYXRjaENvbXBsZXRlZAEBBWBCYXRjaENvbXBsZXRlZFdpdGhFcnJvcnMBAQU0SXRlbUNvbXBsZXRlZAEBBShJdGVtRmFpbGVkAQAEFGVycm9y/Q0wRGlzcGF0Y2hlZEFzAQAEGHJlc3VsdBUORElmRWxzZU1haW5TdWNjZXNzAQEFUElmRWxzZUZhbGxiYWNrQ2FsbGVkAQAEKG1haW5fZXJyb3L9DQJYLElkZW50aXR5U2V0AQAEDHdobwA8SWRlbnRpdHlDbGVhcmVkAQAIDHdobwAcZGVwb3NpdAg4SWRlbnRpdHlLaWxsZWQBAAgMd2hvABxkZXBvc2l0CEhKdWRnZW1lbnRSZXF1ZXN0ZWQBAAgMd2hvADxyZWdpc3RyYXJfaW5kZXgEUEp1ZGdlbWVudFVucmVxdWVzdGVkAQAIDHdobwA8cmVnaXN0cmFyX2luZGV4BDhKdWRnZW1lbnRHaXZlbgEACBh0YXJnZXQAPHJlZ2lzdHJhcl9pbmRleAQ4UmVnaXN0cmFyQWRkZWQBAAQ8cmVnaXN0cmFyX2luZGV4BEBTdWJJZGVudGl0eUFkZGVkAQAMDHN1YgAQbWFpbgAcZGVwb3NpdAhAU3ViSWRlbnRpdGllc1NldAEADBBtYWluADhudW1iZXJfb2Zfc3VicwQsbmV3X2RlcG9zaXQISFN1YklkZW50aXR5UmVuYW1lZAEACAxzdWIAEG1haW4ASFN1YklkZW50aXR5UmVtb3ZlZAEADAxzdWIAEG1haW4AHGRlcG9zaXQISFN1YklkZW50aXR5UmV2b2tlZAEADAxzdWIAEG1haW4AHGRlcG9zaXQIOEF1dGhvcml0eUFkZGVkAQAEJGF1dGhvcml0eQBAQXV0aG9yaXR5UmVtb3ZlZAEABCRhdXRob3JpdHkALFVzZXJuYW1lU2V0AQAIDHdobwAgdXNlcm5hbWUkOFVzZXJuYW1lUXVldWVkAQAMDHdobwAgdXNlcm5hbWUkKGV4cGlyYXRpb24ESFByZWFwcHJvdmFsRXhwaXJlZAEABBR3aG9zZQBIUHJpbWFyeVVzZXJuYW1lU2V0AQAIDHdobwAgdXNlcm5hbWUkXERhbmdsaW5nVXNlcm5hbWVSZW1vdmVkAQAIDHdobwAgdXNlcm5hbWUkPFVzZXJuYW1lVW5ib3VuZAEABCB1c2VybmFtZSQ8VXNlcm5hbWVSZW1vdmVkAQAEIHVzZXJuYW1lJDhVc2VybmFtZUtpbGxlZAEABCB1c2VybmFtZSQCCDhSZWNvdmVyeUNvbmZpZwEBBURBY3RpdmVSZWNvdmVyeUZvcgEBAQIcPFJlY292ZXJ5Q3JlYXRlZAEABBxhY2NvdW50AERSZWNvdmVyeUluaXRpYXRlZAEACDBsb3N0X2FjY291bnQAPHJlc2N1ZXJfYWNjb3VudAA8UmVjb3ZlcnlWb3VjaGVkAQAMMGxvc3RfYWNjb3VudAA8cmVzY3Vlcl9hY2NvdW50ABhzZW5kZXIAOFJlY292ZXJ5Q2xvc2VkAQAIMGxvc3RfYWNjb3VudAA8cmVzY3Vlcl9hY2NvdW50AEBBY2NvdW50UmVjb3ZlcmVkAQAIMGxvc3RfYWNjb3VudAA8cmVzY3Vlcl9hY2NvdW50ADxSZWNvdmVyeVJlbW92ZWQBAAQwbG9zdF9hY2NvdW50ADBEZXBvc2l0UG9rZWQBABAMd2hvABBraW5kIQ4sb2xkX2RlcG9zaXQILG5ld19kZXBvc2l0CAIMOFZlc3RpbmdDcmVhdGVkAQAIHGFjY291bnQAOHNjaGVkdWxlX2luZGV4BDhWZXN0aW5nVXBkYXRlZAEACBxhY2NvdW50ACB1bnZlc3RlZAhAVmVzdGluZ0NvbXBsZXRlZAEABBxhY2NvdW50AAIoJFNjaGVkdWxlZAEACBB3aGVuBBRpbmRleAQgQ2FuY2VsZWQBAAgQd2hlbgQUaW5kZXgEKERpc3BhdGNoZWQBAAwQdGFzaw0BCGlkEQEYcmVzdWx0FQ4gUmV0cnlTZXQBABAQdGFzaw0BCGlkEQEYcGVyaW9kBBxyZXRyaWVzBDhSZXRyeUNhbmNlbGxlZAEACBB0YXNrDQEIaWQRATxDYWxsVW5hdmFpbGFibGUBAAgQdGFzaw0BCGlkEQE4UGVyaW9kaWNGYWlsZWQBAAgQdGFzaw0BCGlkEQEsUmV0cnlGYWlsZWQBAAgQdGFzaw0BCGlkEQFUUGVybWFuZW50bHlPdmVyd2VpZ2h0AQAIEHRhc2sNAQhpZBEBQEFnZW5kYUluY29tcGxldGUBAAQQd2hlbgQCEBRTdWRpZAEABCxzdWRvX3Jlc3VsdBUOKEtleUNoYW5nZWQBAAgMb2xkBQIMbmV3AChLZXlSZW1vdmVkAQEFKFN1ZG9Bc0RvbmUBAAQsc3Vkb19yZXN1bHQVDgIoDEFueQEBBSxOb25UcmFuc2ZlcgEBBShHb3Zlcm5hbmNlAQEFHFN0YWtpbmcBAQUwU3Vkb0JhbGFuY2VzAQEFRElkZW50aXR5SnVkZ2VtZW50AQEFLENhbmNlbFByb3h5AQEFHEF1Y3Rpb24BAQU8Tm9taW5hdGlvblBvb2xzAQEFQFBhcmFSZWdpc3RyYXRpb24BAQUCCBxQcm94aWVzAQEFNEFubm91bmNlbWVudHMBAQUCHDRQcm94eUV4ZWN1dGVkAQAEGHJlc3VsdBUOLFB1cmVDcmVhdGVkAQAQEHB1cmUADHdobwAocHJveHlfdHlwZTUOUGRpc2FtYmlndWF0aW9uX2luZGV4BChQdXJlS2lsbGVkAQAQEHB1cmUAHHNwYXduZXIAKHByb3h5X3R5cGU1DlBkaXNhbWJpZ3VhdGlvbl9pbmRleAQkQW5ub3VuY2VkAQAMEHJlYWwAFHByb3h5ACRjYWxsX2hhc2ggKFByb3h5QWRkZWQBABAkZGVsZWdhdG9yACRkZWxlZ2F0ZWUAKHByb3h5X3R5cGU1DhRkZWxheQQwUHJveHlSZW1vdmVkAQAQJGRlbGVnYXRvcgAkZGVsZWdhdGVlAChwcm94eV90eXBlNQ4UZGVsYXkEMERlcG9zaXRQb2tlZAEAEAx3aG8AEGtpbmQ5DixvbGRfZGVwb3NpdAgsbmV3X2RlcG9zaXQIAhQsTmV3TXVsdGlzaWcBAAwkYXBwcm92aW5nACBtdWx0aXNpZwAkY2FsbF9oYXNoIEBNdWx0aXNpZ0FwcHJvdmFsAQAQJGFwcHJvdmluZwAkdGltZXBvaW508QEgbXVsdGlzaWcAJGNhbGxfaGFzaCBATXVsdGlzaWdFeGVjdXRlZAEAFCRhcHByb3ZpbmcAJHRpbWVwb2ludPEBIG11bHRpc2lnACRjYWxsX2hhc2ggGHJlc3VsdBUORE11bHRpc2lnQ2FuY2VsbGVkAQAQKGNhbmNlbGxpbmcAJHRpbWVwb2ludPEBIG11bHRpc2lnACRjYWxsX2hhc2ggMERlcG9zaXRQb2tlZAEAEAx3aG8AJGNhbGxfaGFzaCAsb2xkX2RlcG9zaXQILG5ld19kZXBvc2l0CAJcHENyZWF0ZWQBAAgkZGVwb3NpdG9yABxwb29sX2lkBBhCb25kZWQBABAYbWVtYmVyABxwb29sX2lkBBhib25kZWQIGGpvaW5lZBQcUGFpZE91dAEADBhtZW1iZXIAHHBvb2xfaWQEGHBheW91dAggVW5ib25kZWQBABQYbWVtYmVyABxwb29sX2lkBBxiYWxhbmNlCBhwb2ludHMIDGVyYQQkV2l0aGRyYXduAQAQGG1lbWJlcgAccG9vbF9pZAQcYmFsYW5jZQgYcG9pbnRzCCREZXN0cm95ZWQBAAQccG9vbF9pZAQwU3RhdGVDaGFuZ2VkAQAIHHBvb2xfaWQEJG5ld19zdGF0ZR0CNE1lbWJlclJlbW92ZWQBAAwccG9vbF9pZAQYbWVtYmVyAEByZWxlYXNlZF9iYWxhbmNlCDBSb2xlc1VwZGF0ZWQBAAwQcm9vdAUCHGJvdW5jZXIFAiRub21pbmF0b3IFAixQb29sU2xhc2hlZAEACBxwb29sX2lkBBxiYWxhbmNlCFBVbmJvbmRpbmdQb29sU2xhc2hlZAEADBxwb29sX2lkBAxlcmEEHGJhbGFuY2UIVFBvb2xDb21taXNzaW9uVXBkYXRlZAEACBxwb29sX2lkBBxjdXJyZW50JQJgUG9vbE1heENvbW1pc3Npb25VcGRhdGVkAQAIHHBvb2xfaWQEOG1heF9jb21taXNzaW9uBHxQb29sQ29tbWlzc2lvbkNoYW5nZVJhdGVVcGRhdGVkAQAIHHBvb2xfaWQELGNoYW5nZV9yYXRlKQKQUG9vbENvbW1pc3Npb25DbGFpbVBlcm1pc3Npb25VcGRhdGVkAQAIHHBvb2xfaWQEKHBlcm1pc3Npb24xAlRQb29sQ29tbWlzc2lvbkNsYWltZWQBAAgccG9vbF9pZAQoY29tbWlzc2lvbghkTWluQmFsYW5jZURlZmljaXRBZGp1c3RlZAEACBxwb29sX2lkBBhhbW91bnQIYE1pbkJhbGFuY2VFeGNlc3NBZGp1c3RlZAEACBxwb29sX2lkBBhhbW91bnQIcE1lbWJlckNsYWltUGVybWlzc2lvblVwZGF0ZWQBAAgYbWVtYmVyAChwZXJtaXNzaW9uiQU8TWV0YWRhdGFVcGRhdGVkAQAIHHBvb2xfaWQEGGNhbGxlcgBIUG9vbE5vbWluYXRpb25NYWRlAQAIHHBvb2xfaWQEGGNhbGxlcgBQUG9vbE5vbWluYXRvckNoaWxsZWQBAAgccG9vbF9pZAQYY2FsbGVyAExHbG9iYWxQYXJhbXNVcGRhdGVkAQAYNG1pbl9qb2luX2JvbmQIPG1pbl9jcmVhdGVfYm9uZAgkbWF4X3Bvb2xzLQQsbWF4X21lbWJlcnMtBFBtYXhfbWVtYmVyc19wZXJfcG9vbC0EVGdsb2JhbF9tYXhfY29tbWlzc2lvbi0EAhQgVW5zdGFrZWQBAAgUc3Rhc2gAGHJlc3VsdBUOHFNsYXNoZWQBAAgUc3Rhc2gAGGFtb3VudAgwQmF0Y2hDaGVja2VkAQAEEGVyYXM5AjRCYXRjaEZpbmlzaGVkAQAEEHNpemUENEludGVybmFsRXJyb3IBAQUCFCREZWxlZ2F0ZWQBBAABCCxVbmRlbGVnYXRlZAEBARRWb3RlZAEACAx3aG8AEHZvdGU1BCxWb3RlUmVtb3ZlZAEACAx3aG8AEHZvdGU1BDBWb3RlVW5sb2NrZWQBAAgMd2hvABRjbGFzcwQACCRwb3N0X2luZm+1ARRlcnJvcv0NB7UBUQ4CDDxDYWxsV2hpdGVsaXN0ZWQBAAQkY2FsbF9oYXNoIFhXaGl0ZWxpc3RlZENhbGxSZW1vdmVkAQAEJGNhbGxfaGFzaCBkV2hpdGVsaXN0ZWRDYWxsRGlzcGF0Y2hlZAEACCRjYWxsX2hhc2ggGHJlc3VsdFUOAiAkQnlHZW5lc2lzAQUBgBhCeUZvcmsBAAgwYmxvY2tfbnVtYmVyCChibG9ja19oYXNoICBQb2xrYWRvdAEBBRhLdXNhbWEBAQUgRXRoZXJldW0BAAQgY2hhaW5faWQILEJpdGNvaW5Db3JlAQEFLEJpdGNvaW5DYXNoAQEFQFBvbGthZG90QnVsbGV0aW4BAQUGXQ4CKCRQYXJhY2hhaW4BAQIsQWNjb3VudElkMzIBAAgcbmV0d29ya2EOCGlkIDhBY2NvdW50SW5kZXg2NAEACBxuZXR3b3JrYQ4UaW5kZXgIMEFjY291bnRLZXkyMAEACBxuZXR3b3JrYQ4Ma2V5ZQE4UGFsbGV0SW5zdGFuY2UBAQIwR2VuZXJhbEluZGV4AQEDKEdlbmVyYWxLZXkBAAgYbGVuZ3RoBBBkYXRhICRPbmx5Q2hpbGQBAQUkUGx1cmFsaXR5AQAICGlkaQEQcGFydG0BPEdsb2JhbENvbnNlbnN1cwECICRCeUdlbmVzaXMBBQGAGEJ5Rm9yawEACDBibG9ja19udW1iZXIIKGJsb2NrX2hhc2ggIFBvbGthZG90AQEFGEt1c2FtYQEBBSBFdGhlcmV1bQEABCBjaGFpbl9pZAgsQml0Y29pbkNvcmUBAQUsQml0Y29pbkNhc2gBAQVAUG9sa2Fkb3RCdWxsZXRpbgEBBQRlDgEIBGUOAQwEZQ4BEARlDgEUBGUOARgEZQ4BHARlDgEgAiQQSGVyZQEBBQhYMQECKCRQYXJhY2hhaW4BAQIsQWNjb3VudElkMzIBAAgcbmV0d29ya2EOCGlkIDhBY2NvdW50SW5kZXg2NAEACBxuZXR3b3JrYQ4UaW5kZXgIMEFjY291bnRLZXkyMAEACBxuZXR3b3JrYQ4Ma2V5ZQE4UGFsbGV0SW5zdGFuY2UBAQIwR2VuZXJhbEluZGV4AQEDKEdlbmVyYWxLZXkBAAgYbGVuZ3RoBBBkYXRhICRPbmx5Q2hpbGQBAQUkUGx1cmFsaXR5AQAICGlkaQEQcGFydG0BPEdsb2JhbENvbnNlbnN1cwECICRCeUdlbmVzaXMBBQGAGEJ5Rm9yawEACDBibG9ja19udW1iZXIIKGJsb2NrX2hhc2ggIFBvbGthZG90AQEFGEt1c2FtYQEBBSBFdGhlcmV1bQEABCBjaGFpbl9pZAgsQml0Y29pbkNvcmUBAQUsQml0Y29pbkNhc2gBAQVAUG9sa2Fkb3RCdWxsZXRpbgEBBQhYMgEEZQ4BCAhYMwEEZQ4BDAhYNAEEZQ4BEAhYNQEEZQ4BFAhYNgEEZQ4BGAhYNwEEZQ4BHAhYOAEEZQ4BIAAIHHBhcmVudHMEIGludGVyaW9yhQ4CDAhWMwEACCBsb2NhdGlvbnkBIGFzc2V0X2lkfQEIVjQBAAggbG9jYXRpb255ASBhc3NldF9pZHkBCFY1AQAIIGxvY2F0aW9uiQ4gYXNzZXRfaWSJDgIMCFYzAQAIHHBhcmVudHMEIGludGVyaW9ydQEIVjQBAAgccGFyZW50cwQgaW50ZXJpb3J1AQhWNQEACBxwYXJlbnRzBCBpbnRlcmlvcoUOAjAgU3BlbmRpbmcBAARAYnVkZ2V0X3JlbWFpbmluZwgcQXdhcmRlZAEADDhwcm9wb3NhbF9pbmRleAQUYXdhcmQIHGFjY291bnQAFEJ1cm50AQAELGJ1cm50X2Z1bmRzCCBSb2xsb3ZlcgEABEByb2xsb3Zlcl9iYWxhbmNlCBxEZXBvc2l0AQAEFHZhbHVlCDRTcGVuZEFwcHJvdmVkAQAMOHByb3Bvc2FsX2luZGV4BBhhbW91bnQILGJlbmVmaWNpYXJ5ADxVcGRhdGVkSW5hY3RpdmUBAAgscmVhY3RpdmF0ZWQILGRlYWN0aXZhdGVkCEhBc3NldFNwZW5kQXBwcm92ZWQBABgUaW5kZXgEKGFzc2V0X2tpbmSNDhhhbW91bnQILGJlbmVmaWNpYXJ5kQ4odmFsaWRfZnJvbQQkZXhwaXJlX2F0BEBBc3NldFNwZW5kVm9pZGVkAQAEFGluZGV4BBBQYWlkAQAIFGluZGV4BChwYXltZW50X2lkCDRQYXltZW50RmFpbGVkAQAIFGluZGV4BChwYXltZW50X2lkCDhTcGVuZFByb2Nlc3NlZAEABBRpbmRleAQCECREZWxlZ2F0ZWQBAAwUYWdlbnQAJGRlbGVnYXRvcgAYYW1vdW50CCBSZWxlYXNlZAEADBRhZ2VudAAkZGVsZWdhdG9yABhhbW91bnQIHFNsYXNoZWQBAAwUYWdlbnQAJGRlbGVnYXRvcgAYYW1vdW50CEhNaWdyYXRlZERlbGVnYXRpb24BAAwUYWdlbnQAJGRlbGVnYXRvcgAYYW1vdW50CAUBZAAwHHBhcmFfaWQEMHJlbGF5X3BhcmVudCAcdmVyc2lvbgQoY29yZV9pbmRleAQ0c2Vzc2lvbl9pbmRleAQkcmVzZXJ2ZWQxnQ54cGVyc2lzdGVkX3ZhbGlkYXRpb25fZGF0YV9oYXNoICBwb3ZfaGFzaCAwZXJhc3VyZV9yb290ICRyZXNlcnZlZDJBAiRwYXJhX2hlYWQgUHZhbGlkYXRpb25fY29kZV9oYXNoIAAIKGRlc2NyaXB0b3KhDkBjb21taXRtZW50c19oYXNoIAIQPENhbmRpZGF0ZUJhY2tlZAEDEKUOJAQERENhbmRpZGF0ZUluY2x1ZGVkAQMQpQ4kBAREQ2FuZGlkYXRlVGltZWRPdXQBAwylDiQEWFVwd2FyZE1lc3NhZ2VzUmVjZWl2ZWQBAAgQZnJvbQQUY291bnQEAihIQ3VycmVudENvZGVVcGRhdGVkAQECSEN1cnJlbnRIZWFkVXBkYXRlZAEBAlBDb2RlVXBncmFkZVNjaGVkdWxlZAEBAjBOZXdIZWFkTm90ZWQBAQIwQWN0aW9uUXVldWVkAQQEAQg8UHZmQ2hlY2tTdGFydGVkAQMIIARAUHZmQ2hlY2tBY2NlcHRlZAEDCCAEQFB2ZkNoZWNrUmVqZWN0ZWQBAwggBFhVcGdyYWRlQ29vbGRvd25SZW1vdmVkAQAEHHBhcmFfaWQEOENvZGVBdXRob3JpemVkAQAMHHBhcmFfaWQEJGNvZGVfaGFzaCAkZXhwaXJlX2F0BAIMTE9uRGVtYW5kT3JkZXJQbGFjZWQBAAwccGFyYV9pZAQoc3BvdF9wcmljZQgob3JkZXJlZF9ieQAwU3BvdFByaWNlU2V0AQAEKHNwb3RfcHJpY2UIPEFjY291bnRDcmVkaXRlZAEACAx3aG8AGGFtb3VudAgCKBxDcmVhdGVkAQAEHHBhcmFfaWQELENvbnRyaWJ1dGVkAQAMDHdobwAoZnVuZF9pbmRleAQYYW1vdW50CCBXaXRoZHJldwEADAx3aG8AKGZ1bmRfaW5kZXgEGGFtb3VudAhEUGFydGlhbGx5UmVmdW5kZWQBAAQccGFyYV9pZAQsQWxsUmVmdW5kZWQBAAQccGFyYV9pZAQkRGlzc29sdmVkAQAEHHBhcmFfaWQEPEhhbmRsZUJpZFJlc3VsdAEACBxwYXJhX2lkBBhyZXN1bHQVDhhFZGl0ZWQBAAQccGFyYV9pZAQsTWVtb1VwZGF0ZWQBAAwMd2hvABxwYXJhX2lkBBBtZW1vJDxBZGRlZFRvTmV3UmFpc2UBAAQccGFyYV9pZAQCEFRQZXJtYW5lbnRTbG90QXNzaWduZWQBAQJUVGVtcG9yYXJ5U2xvdEFzc2lnbmVkAQECYE1heFBlcm1hbmVudFNsb3RzQ2hhbmdlZAEABBRzbG90cwRgTWF4VGVtcG9yYXJ5U2xvdHNDaGFuZ2VkAQAEFHNsb3RzBAIIgFJlY2VpdmVkVmFsaWRhdG9yU2V0V2hpbGVQYXNzaXZlAQEFYFVuZXhwZWN0ZWRNb2RlVHJhbnNpdGlvbgEBBQIQUFZhbGlkYXRvclNldFJlY2VpdmVkAQAQCGlkBFxuZXdfdmFsaWRhdG9yX3NldF9jb3VudAQscHJ1bmVfdXBfdG8tBCBsZWZ0b3ZlchRcQ291bGROb3RNZXJnZUFuZERyb3BwZWQBAQVUU2V0VG9vU21hbGxBbmREcm9wcGVkAQEFKFVuZXhwZWN0ZWQBAgiAUmVjZWl2ZWRWYWxpZGF0b3JTZXRXaGlsZVBhc3NpdmUBAQVgVW5leHBlY3RlZE1vZGVUcmFuc2l0aW9uAQEFAiA4VXBncmFkZVN0YXJ0ZWQBAAQobWlncmF0aW9ucwRAVXBncmFkZUNvbXBsZXRlZAEBBTRVcGdyYWRlRmFpbGVkAQEFQE1pZ3JhdGlvblNraXBwZWQBAAQUaW5kZXgERE1pZ3JhdGlvbkFkdmFuY2VkAQAIFGluZGV4BBB0b29rBEhNaWdyYXRpb25Db21wbGV0ZWQBAAgUaW5kZXgEEHRvb2sEPE1pZ3JhdGlvbkZhaWxlZAEACBRpbmRleAQQdG9vawQ8SGlzdG9yaWNDbGVhcmVkAQAELG5leHRfY3Vyc29yxQUCpCBPdmVyZmxvdwEBBTRVbmltcGxlbWVudGVkAQEFYFVudHJ1c3RlZFJlc2VydmVMb2NhdGlvbgEBBWRVbnRydXN0ZWRUZWxlcG9ydExvY2F0aW9uAQEFMExvY2F0aW9uRnVsbAEBBVRMb2NhdGlvbk5vdEludmVydGlibGUBAQUkQmFkT3JpZ2luAQEFPEludmFsaWRMb2NhdGlvbgEBBTRBc3NldE5vdEZvdW5kAQEFVEZhaWxlZFRvVHJhbnNhY3RBc3NldAEBBTxOb3RXaXRoZHJhd2FibGUBAQVITG9jYXRpb25DYW5ub3RIb2xkAQEFVEV4Y2VlZHNNYXhNZXNzYWdlU2l6ZQEBBVhEZXN0aW5hdGlvblVuc3VwcG9ydGVkAQEFJFRyYW5zcG9ydAEBBShVbnJvdXRhYmxlAQEFMFVua25vd25DbGFpbQEBBThGYWlsZWRUb0RlY29kZQEBBUBNYXhXZWlnaHRJbnZhbGlkAQEFOE5vdEhvbGRpbmdGZWVzAQEFMFRvb0V4cGVuc2l2ZQEBBRBUcmFwAQEDQEV4cGVjdGF0aW9uRmFsc2UBAQU4UGFsbGV0Tm90Rm91bmQBAQUwTmFtZU1pc21hdGNoAQEFTFZlcnNpb25JbmNvbXBhdGlibGUBAQVQSG9sZGluZ1dvdWxkT3ZlcmZsb3cBAQUsRXhwb3J0RXJyb3IBAQU4UmVhbmNob3JGYWlsZWQBAQUYTm9EZWFsAQEFKEZlZXNOb3RNZXQBAQUkTG9ja0Vycm9yAQEFME5vUGVybWlzc2lvbgEBBShVbmFuY2hvcmVkAQEFOE5vdERlcG9zaXRhYmxlAQEFNFRvb01hbnlBc3NldHMBAQVMVW5oYW5kbGVkWGNtVmVyc2lvbgEBBUhXZWlnaHRMaW1pdFJlYWNoZWQBAAggcmVmX3RpbWUIKHByb29mX3NpemUIHEJhcnJpZXIBAQVMV2VpZ2h0Tm90Q29tcHV0YWJsZQEBBURFeGNlZWRzU3RhY2tMaW1pdAEBBQAIFGluZGV4BBRlcnJvcskOAgwgQ29tcGxldGUBAAQQdXNlZBgoSW5jb21wbGV0ZQEACBB1c2VkGBRlcnJvcs0OFEVycm9yAQAIFGluZGV4BBRlcnJvcskOAAgIaWSJDgxmdW6ZAgTVDgADCATJDgbdDgIYEE51bGwBAQUYQXNzZXRzAQTVDgA8RXhlY3V0aW9uUmVzdWx0AQbdDhxWZXJzaW9uAQECLFBhbGxldHNJbmZvAQStAgA4RGlzcGF0Y2hSZXN1bHQBAgwcU3VjY2VzcwEBBRRFcnJvcgEFADhUcnVuY2F0ZWRFcnJvcgEFAAaJDgAMLGRlc3RpbmF0aW9uiQ4gcXVlcnlfaWQIKG1heF93ZWlnaHQYAhAMQWxsAQEFFEFsbE9mAQAICGlkiQ4MZnVu5QIoQWxsQ291bnRlZAEBAjBBbGxPZkNvdW50ZWQBAAwIaWSJDgxmdW7lAhRjb3VudAQCCCBEZWZpbml0ZQEE1Q4AEFdpbGQBAhAMQWxsAQEFFEFsbE9mAQAICGlkiQ4MZnVu5QIoQWxsQ291bnRlZAEBAjBBbGxPZkNvdW50ZWQBAAwIaWSJDgxmdW7lAhRjb3VudAQCDCBUZWxlcG9ydAECCCBEZWZpbml0ZQEE1Q4AEFdpbGQBAhAMQWxsAQEFFEFsbE9mAQAICGlkiQ4MZnVu5QIoQWxsQ291bnRlZAEBAjBBbGxPZkNvdW50ZWQBAAwIaWSJDgxmdW7lAhRjb3VudAQ4UmVzZXJ2ZURlcG9zaXQBAgggRGVmaW5pdGUBBNUOABBXaWxkAQIQDEFsbAEBBRRBbGxPZgEACAhpZIkODGZ1buUCKEFsbENvdW50ZWQBAQIwQWxsT2ZDb3VudGVkAQAMCGlkiQ4MZnVu5QIUY291bnQEPFJlc2VydmVXaXRoZHJhdwECCCBEZWZpbml0ZQEE1Q4AEFdpbGQBAhAMQWxsAQEFFEFsbE9mAQAICGlkiQ4MZnVu5QIoQWxsQ291bnRlZAEBAjBBbGxPZkNvdW50ZWQBAAwIaWSJDgxmdW7lAhRjb3VudAQG+Q4E+Q4ABoUOAgQwQXNzZXRDbGFpbWVyAQAEIGxvY2F0aW9uiQ4ECQ8AAtA0V2l0aGRyYXdBc3NldAEE1Q4AVFJlc2VydmVBc3NldERlcG9zaXRlZAEE1Q4AWFJlY2VpdmVUZWxlcG9ydGVkQXNzZXQBBNUOADRRdWVyeVJlc3BvbnNlAQAQIHF1ZXJ5X2lkCCByZXNwb25zZeUOKG1heF93ZWlnaHQYHHF1ZXJpZXLpDjRUcmFuc2ZlckFzc2V0AQAIGGFzc2V0c9kOLGJlbmVmaWNpYXJ5iQ5QVHJhbnNmZXJSZXNlcnZlQXNzZXQBAAwYYXNzZXRz2Q4QZGVzdIkODHhjbRUPIFRyYW5zYWN0AQAMLG9yaWdpbl9raW5kwQJMZmFsbGJhY2tfbWF4X3dlaWdodLEBEGNhbGwkZEhybXBOZXdDaGFubmVsT3BlblJlcXVlc3QBAAwYc2VuZGVyBEBtYXhfbWVzc2FnZV9zaXplBDBtYXhfY2FwYWNpdHkETEhybXBDaGFubmVsQWNjZXB0ZWQBAAQkcmVjaXBpZW50BEhIcm1wQ2hhbm5lbENsb3NpbmcBAAwkaW5pdGlhdG9yBBhzZW5kZXIEJHJlY2lwaWVudAQsQ2xlYXJPcmlnaW4BAQU0RGVzY2VuZE9yaWdpbgECJBBIZXJlAQEFCFgxAQIoJFBhcmFjaGFpbgEBAixBY2NvdW50SWQzMgEACBxuZXR3b3JrYQ4IaWQgOEFjY291bnRJbmRleDY0AQAIHG5ldHdvcmthDhRpbmRleAgwQWNjb3VudEtleTIwAQAIHG5ldHdvcmthDgxrZXllAThQYWxsZXRJbnN0YW5jZQEBAjBHZW5lcmFsSW5kZXgBAQMoR2VuZXJhbEtleQEACBhsZW5ndGgEEGRhdGEgJE9ubHlDaGlsZAEBBSRQbHVyYWxpdHkBAAgIaWRpARBwYXJ0bQE8R2xvYmFsQ29uc2Vuc3VzAQIgJEJ5R2VuZXNpcwEFAYAYQnlGb3JrAQAIMGJsb2NrX251bWJlcggoYmxvY2tfaGFzaCAgUG9sa2Fkb3QBAQUYS3VzYW1hAQEFIEV0aGVyZXVtAQAEIGNoYWluX2lkCCxCaXRjb2luQ29yZQEBBSxCaXRjb2luQ2FzaAEBBUBQb2xrYWRvdEJ1bGxldGluAQEFCFgyAQRlDgEICFgzAQRlDgEMCFg0AQRlDgEQCFg1AQRlDgEUCFg2AQRlDgEYCFg3AQRlDgEcCFg4AQRlDgEgLFJlcG9ydEVycm9yAQAMLGRlc3RpbmF0aW9uiQ4gcXVlcnlfaWQIKG1heF93ZWlnaHQYMERlcG9zaXRBc3NldAEACBhhc3NldHP1DixiZW5lZmljaWFyeYkOTERlcG9zaXRSZXNlcnZlQXNzZXQBAAwYYXNzZXRz9Q4QZGVzdIkODHhjbRUPNEV4Y2hhbmdlQXNzZXQBAAwQZ2l2ZfUOEHdhbnTZDhxtYXhpbWFsFFxJbml0aWF0ZVJlc2VydmVXaXRoZHJhdwEADBhhc3NldHP1DhxyZXNlcnZliQ4MeGNtFQ9ASW5pdGlhdGVUZWxlcG9ydAEADBhhc3NldHP1DhBkZXN0iQ4MeGNtFQ80UmVwb3J0SG9sZGluZwEACDRyZXNwb25zZV9pbmZv7Q4YYXNzZXRz9Q4wQnV5RXhlY3V0aW9uAQAIEGZlZXPVDjB3ZWlnaHRfbGltaXTxAjRSZWZ1bmRTdXJwbHVzAQEFPFNldEVycm9ySGFuZGxlcgEEEQ8ALFNldEFwcGVuZGl4AQQRDwAoQ2xlYXJFcnJvcgEBBShDbGFpbUFzc2V0AQAIGGFzc2V0c9kOGHRpY2tldIkOEFRyYXABAQNAU3Vic2NyaWJlVmVyc2lvbgEACCBxdWVyeV9pZAhMbWF4X3Jlc3BvbnNlX3dlaWdodBhIVW5zdWJzY3JpYmVWZXJzaW9uAQEFJEJ1cm5Bc3NldAEE1Q4ALEV4cGVjdEFzc2V0AQTVDgAwRXhwZWN0T3JpZ2luAQaJDixFeHBlY3RFcnJvcgEG3Q5QRXhwZWN0VHJhbnNhY3RTdGF0dXMBAgwcU3VjY2VzcwEBBRRFcnJvcgEFADhUcnVuY2F0ZWRFcnJvcgEFACxRdWVyeVBhbGxldAEACCxtb2R1bGVfbmFtZSQ0cmVzcG9uc2VfaW5mb+0OMEV4cGVjdFBhbGxldAEAFBRpbmRleAQQbmFtZSQsbW9kdWxlX25hbWUkLGNyYXRlX21ham9yBDxtaW5fY3JhdGVfbWlub3IEUFJlcG9ydFRyYW5zYWN0U3RhdHVzAQAMLGRlc3RpbmF0aW9uiQ4gcXVlcnlfaWQIKG1heF93ZWlnaHQYTENsZWFyVHJhbnNhY3RTdGF0dXMBAQU8VW5pdmVyc2FsT3JpZ2luAQIoJFBhcmFjaGFpbgEBAixBY2NvdW50SWQzMgEACBxuZXR3b3JrYQ4IaWQgOEFjY291bnRJbmRleDY0AQAIHG5ldHdvcmthDhRpbmRleAgwQWNjb3VudEtleTIwAQAIHG5ldHdvcmthDgxrZXllAThQYWxsZXRJbnN0YW5jZQEBAjBHZW5lcmFsSW5kZXgBAQMoR2VuZXJhbEtleQEACBhsZW5ndGgEEGRhdGEgJE9ubHlDaGlsZAEBBSRQbHVyYWxpdHkBAAgIaWRpARBwYXJ0bQE8R2xvYmFsQ29uc2Vuc3VzAQIgJEJ5R2VuZXNpcwEFAYAYQnlGb3JrAQAIMGJsb2NrX251bWJlcggoYmxvY2tfaGFzaCAgUG9sa2Fkb3QBAQUYS3VzYW1hAQEFIEV0aGVyZXVtAQAEIGNoYWluX2lkCCxCaXRjb2luQ29yZQEBBSxCaXRjb2luQ2FzaAEBBUBQb2xrYWRvdEJ1bGxldGluAQEFNEV4cG9ydE1lc3NhZ2UBAAwcbmV0d29ya10OLGRlc3RpbmF0aW9uhQ4MeGNtFQ8kTG9ja0Fzc2V0AQAIFGFzc2V01Q4gdW5sb2NrZXKJDixVbmxvY2tBc3NldAEACBRhc3NldNUOGHRhcmdldIkOOE5vdGVVbmxvY2thYmxlAQAIFGFzc2V01Q4Ub3duZXKJDjRSZXF1ZXN0VW5sb2NrAQAIFGFzc2V01Q4YbG9ja2VyiQ4sU2V0RmVlc01vZGUBAAQwaml0X3dpdGhkcmF3FCBTZXRUb3BpYwEFAYAoQ2xlYXJUb3BpYwEBBSxBbGlhc09yaWdpbgEACBxwYXJlbnRzBCBpbnRlcmlvcoUOPFVucGFpZEV4ZWN1dGlvbgEACDB3ZWlnaHRfbGltaXTxAjBjaGVja19vcmlnaW7pDhxQYXlGZWVzAQAEFGFzc2V01Q5ASW5pdGlhdGVUcmFuc2ZlcgEAFCxkZXN0aW5hdGlvbokOLHJlbW90ZV9mZWVz/Q48cHJlc2VydmVfb3JpZ2luFBhhc3NldHMBDyhyZW1vdGVfeGNtFQ9ERXhlY3V0ZVdpdGhPcmlnaW4BAAhEZGVzY2VuZGFudF9vcmlnaW4FDwx4Y20VDyBTZXRIaW50cwEABBRoaW50cw0PBBEPAAIcNE5vdEFwcGxpY2FibGUBAQUkVHJhbnNwb3J0AQEFKFVucm91dGFibGUBAQVYRGVzdGluYXRpb25VbnN1cHBvcnRlZAEBBVRFeGNlZWRzTWF4TWVzc2FnZVNpemUBAQU8TWlzc2luZ0FyZ3VtZW50AQEFEEZlZXMBAQUCDAhWMwEEEQMACFY0AQSdAgAIVjUBBNUOAAJ0JEF0dGVtcHRlZAEABBxvdXRjb21l0Q4QU2VudAEAEBhvcmlnaW6JDixkZXN0aW5hdGlvbokOHG1lc3NhZ2UVDyhtZXNzYWdlX2lkIChTZW5kRmFpbGVkAQAQGG9yaWdpbokOLGRlc3RpbmF0aW9uiQ4UZXJyb3IZDyhtZXNzYWdlX2lkIDxQcm9jZXNzWGNtRXJyb3IBAAwYb3JpZ2luiQ4UZXJyb3LJDihtZXNzYWdlX2lkIEhVbmV4cGVjdGVkUmVzcG9uc2UBAAgYb3JpZ2luiQ4gcXVlcnlfaWQINFJlc3BvbnNlUmVhZHkBAAggcXVlcnlfaWQIIHJlc3BvbnNl5Q4gTm90aWZpZWQBAAwgcXVlcnlfaWQIMHBhbGxldF9pbmRleAQoY2FsbF9pbmRleARATm90aWZ5T3ZlcndlaWdodAEAFCBxdWVyeV9pZAgwcGFsbGV0X2luZGV4BChjYWxsX2luZGV4BDRhY3R1YWxfd2VpZ2h0GExtYXhfYnVkZ2V0ZWRfd2VpZ2h0GExOb3RpZnlEaXNwYXRjaEVycm9yAQAMIHF1ZXJ5X2lkCDBwYWxsZXRfaW5kZXgEKGNhbGxfaW5kZXgESE5vdGlmeURlY29kZUZhaWxlZAEADCBxdWVyeV9pZAgwcGFsbGV0X2luZGV4BChjYWxsX2luZGV4BEBJbnZhbGlkUmVzcG9uZGVyAQAMGG9yaWdpbokOIHF1ZXJ5X2lkCERleHBlY3RlZF9sb2NhdGlvbukOXEludmFsaWRSZXNwb25kZXJWZXJzaW9uAQAIGG9yaWdpbokOIHF1ZXJ5X2lkCDRSZXNwb25zZVRha2VuAQAEIHF1ZXJ5X2lkCDRBc3NldHNUcmFwcGVkAQAMEGhhc2ggGG9yaWdpbokOGGFzc2V0cx0PVFZlcnNpb25DaGFuZ2VOb3RpZmllZAEAECxkZXN0aW5hdGlvbokOGHJlc3VsdAQQY29zdNkOKG1lc3NhZ2VfaWQgXFN1cHBvcnRlZFZlcnNpb25DaGFuZ2VkAQAIIGxvY2F0aW9uiQ4cdmVyc2lvbgRQTm90aWZ5VGFyZ2V0U2VuZEZhaWwBAAwgbG9jYXRpb26JDiBxdWVyeV9pZAgUZXJyb3LJDmROb3RpZnlUYXJnZXRNaWdyYXRpb25GYWlsAQAIIGxvY2F0aW9ukQ4gcXVlcnlfaWQIVEludmFsaWRRdWVyaWVyVmVyc2lvbgEACBhvcmlnaW6JDiBxdWVyeV9pZAg4SW52YWxpZFF1ZXJpZXIBABAYb3JpZ2luiQ4gcXVlcnlfaWQIQGV4cGVjdGVkX3F1ZXJpZXKJDlBtYXliZV9hY3R1YWxfcXVlcmllcukOUFZlcnNpb25Ob3RpZnlTdGFydGVkAQAMLGRlc3RpbmF0aW9uiQ4QY29zdNkOKG1lc3NhZ2VfaWQgWFZlcnNpb25Ob3RpZnlSZXF1ZXN0ZWQBAAwsZGVzdGluYXRpb26JDhBjb3N02Q4obWVzc2FnZV9pZCBgVmVyc2lvbk5vdGlmeVVucmVxdWVzdGVkAQAMLGRlc3RpbmF0aW9uiQ4QY29zdNkOKG1lc3NhZ2VfaWQgIEZlZXNQYWlkAQAIGHBheWluZ4kOEGZlZXPZDjRBc3NldHNDbGFpbWVkAQAMEGhhc2ggGG9yaWdpbokOGGFzc2V0cx0PYFZlcnNpb25NaWdyYXRpb25GaW5pc2hlZAEABBx2ZXJzaW9uBDxBbGlhc0F1dGhvcml6ZWQBAAwcYWxpYXNlcokOGHRhcmdldIkOGGV4cGlyefUDZEFsaWFzQXV0aG9yaXphdGlvblJlbW92ZWQBAAgcYWxpYXNlcokOGHRhcmdldIkOcEFsaWFzZXNBdXRob3JpemF0aW9uc1JlbW92ZWQBAAQYdGFyZ2V0iQ4CDEBBc3NldFJhdGVDcmVhdGVkAQAIKGFzc2V0X2tpbmSNDhByYXRlCEBBc3NldFJhdGVSZW1vdmVkAQAEKGFzc2V0X2tpbmSNDkBBc3NldFJhdGVVcGRhdGVkAQAMKGFzc2V0X2tpbmSNDgxvbGQIDG5ldwgCBEREZWZlbnNpdmVUZXN0Q2FsbAEBBQIEKERpc3BhdGNoZWQBAAQYcmVzdWx0VQ4CCDhJZGVudGl0eVJlYXBlZAEABAx3aG8AOERlcG9zaXRVcGRhdGVkAQAMDHdobwAgaWRlbnRpdHkIEHN1YnMIArwYU3lzdGVtAQIgQEV4dHJpbnNpY1N1Y2Nlc3MBAAQ0ZGlzcGF0Y2hfaW5mb0A8RXh0cmluc2ljRmFpbGVkAQAIOGRpc3BhdGNoX2Vycm9y/Q00ZGlzcGF0Y2hfaW5mb0AsQ29kZVVwZGF0ZWQBAQUoTmV3QWNjb3VudAEABBxhY2NvdW50ADRLaWxsZWRBY2NvdW50AQAEHGFjY291bnQAIFJlbWFya2VkAQAIGHNlbmRlcgAQaGFzaCBEVXBncmFkZUF1dGhvcml6ZWQBAAgkY29kZV9oYXNoIDRjaGVja192ZXJzaW9uFIBSZWplY3RlZEludmFsaWRBdXRob3JpemVkVXBncmFkZQEACCRjb2RlX2hhc2ggFGVycm9y/Q0cSW5kaWNlcwECEDRJbmRleEFzc2lnbmVkAQAIDHdobwAUaW5kZXgEKEluZGV4RnJlZWQBAAQUaW5kZXgELEluZGV4RnJvemVuAQAIFGluZGV4BAx3aG8AMERlcG9zaXRQb2tlZAEAEAx3aG8AFGluZGV4BCxvbGRfZGVwb3NpdAgsbmV3X2RlcG9zaXQIIEJhbGFuY2VzAQJYHEVuZG93ZWQBAAgcYWNjb3VudAAwZnJlZV9iYWxhbmNlCCBEdXN0TG9zdAEACBxhY2NvdW50ABhhbW91bnQIIFRyYW5zZmVyAQAMEGZyb20ACHRvABhhbW91bnQIKEJhbGFuY2VTZXQBAAgMd2hvABBmcmVlCCBSZXNlcnZlZAEACAx3aG8AGGFtb3VudAgoVW5yZXNlcnZlZAEACAx3aG8AGGFtb3VudAhIUmVzZXJ2ZVJlcGF0cmlhdGVkAQAQEGZyb20ACHRvABhhbW91bnQISGRlc3RpbmF0aW9uX3N0YXR1cykBHERlcG9zaXQBAAgMd2hvABhhbW91bnQIIFdpdGhkcmF3AQAIDHdobwAYYW1vdW50CBxTbGFzaGVkAQAIDHdobwAYYW1vdW50CBhNaW50ZWQBAAgMd2hvABhhbW91bnQIGEJ1cm5lZAEACAx3aG8AGGFtb3VudAgkU3VzcGVuZGVkAQAIDHdobwAYYW1vdW50CCBSZXN0b3JlZAEACAx3aG8AGGFtb3VudAggVXBncmFkZWQBAAQMd2hvABhJc3N1ZWQBAAQYYW1vdW50CCRSZXNjaW5kZWQBAAQYYW1vdW50CBhMb2NrZWQBAAgMd2hvABhhbW91bnQIIFVubG9ja2VkAQAIDHdobwAYYW1vdW50CBhGcm96ZW4BAAgMd2hvABhhbW91bnQIGFRoYXdlZAEACAx3aG8AGGFtb3VudAhMVG90YWxJc3N1YW5jZUZvcmNlZAEACAxvbGQIDG5ldwhIVHJhbnNhY3Rpb25QYXltZW50AQIESFRyYW5zYWN0aW9uRmVlUGFpZAEADAx3aG8AKGFjdHVhbF9mZWUIDHRpcAgcU3Rha2luZwECTBxFcmFQYWlkAQAMJGVyYV9pbmRleARAdmFsaWRhdG9yX3BheW91dAgkcmVtYWluZGVyCCBSZXdhcmRlZAEADBRzdGFzaAAQZGVzdDUBGGFtb3VudAgcU2xhc2hlZAEACBhzdGFrZXIAGGFtb3VudAg0U2xhc2hSZXBvcnRlZAEADCR2YWxpZGF0b3IAIGZyYWN0aW9uBCRzbGFzaF9lcmEEaE9sZFNsYXNoaW5nUmVwb3J0RGlzY2FyZGVkAQAENHNlc3Npb25faW5kZXgEOFN0YWtlcnNFbGVjdGVkAQEFGEJvbmRlZAEACBRzdGFzaAAYYW1vdW50CCBVbmJvbmRlZAEACBRzdGFzaAAYYW1vdW50CCRXaXRoZHJhd24BAAgUc3Rhc2gAGGFtb3VudAgYS2lja2VkAQAIJG5vbWluYXRvcgAUc3Rhc2gAVFN0YWtpbmdFbGVjdGlvbkZhaWxlZAEBBRxDaGlsbGVkAQAEFHN0YXNoADRQYXlvdXRTdGFydGVkAQAQJGVyYV9pbmRleAQ8dmFsaWRhdG9yX3N0YXNoABBwYWdlBBBuZXh0LQREVmFsaWRhdG9yUHJlZnNTZXQBAAgUc3Rhc2gAFHByZWZzOQFoU25hcHNob3RWb3RlcnNTaXplRXhjZWVkZWQBAAQQc2l6ZQRsU25hcHNob3RUYXJnZXRzU2l6ZUV4Y2VlZGVkAQAEEHNpemUEIEZvcmNlRXJhAQAEEG1vZGU9AWRDb250cm9sbGVyQmF0Y2hEZXByZWNhdGVkAQAEIGZhaWx1cmVzBEBDdXJyZW5jeU1pZ3JhdGVkAQAIFHN0YXNoADhmb3JjZV93aXRoZHJhdwggT2ZmZW5jZXMBAgQcT2ZmZW5jZQEACBBraW5kRQEgdGltZXNsb3QkKEhpc3RvcmljYWwBAggoUm9vdFN0b3JlZAEABBRpbmRleAQsUm9vdHNQcnVuZWQBAAQUdXBfdG8EKFBhcmFtZXRlcnMBAgQcVXBkYXRlZAEADAxrZXnJASRvbGRfdmFsdWXVASRuZXdfdmFsdWXVARxTZXNzaW9uAQIQKE5ld1Nlc3Npb24BAAQ0c2Vzc2lvbl9pbmRleAQkTmV3UXVldWVkAQEFRFZhbGlkYXRvckRpc2FibGVkAQAEJHZhbGlkYXRvcgBIVmFsaWRhdG9yUmVlbmFibGVkAQAEJHZhbGlkYXRvcgAcR3JhbmRwYQECDDhOZXdBdXRob3JpdGllcwEABDRhdXRob3JpdHlfc2V0VQEYUGF1c2VkAQEFHFJlc3VtZWQBAQUcVXRpbGl0eQECIEBCYXRjaEludGVycnVwdGVkAQAIFGluZGV4BBRlcnJvcv0NOEJhdGNoQ29tcGxldGVkAQEFYEJhdGNoQ29tcGxldGVkV2l0aEVycm9ycwEBBTRJdGVtQ29tcGxldGVkAQEFKEl0ZW1GYWlsZWQBAAQUZXJyb3L9DTBEaXNwYXRjaGVkQXMBAAQYcmVzdWx0FQ5ESWZFbHNlTWFpblN1Y2Nlc3MBAQVQSWZFbHNlRmFsbGJhY2tDYWxsZWQBAAQobWFpbl9lcnJvcv0NIElkZW50aXR5AQJYLElkZW50aXR5U2V0AQAEDHdobwA8SWRlbnRpdHlDbGVhcmVkAQAIDHdobwAcZGVwb3NpdAg4SWRlbnRpdHlLaWxsZWQBAAgMd2hvABxkZXBvc2l0CEhKdWRnZW1lbnRSZXF1ZXN0ZWQBAAgMd2hvADxyZWdpc3RyYXJfaW5kZXgEUEp1ZGdlbWVudFVucmVxdWVzdGVkAQAIDHdobwA8cmVnaXN0cmFyX2luZGV4BDhKdWRnZW1lbnRHaXZlbgEACBh0YXJnZXQAPHJlZ2lzdHJhcl9pbmRleAQ4UmVnaXN0cmFyQWRkZWQBAAQ8cmVnaXN0cmFyX2luZGV4BEBTdWJJZGVudGl0eUFkZGVkAQAMDHN1YgAQbWFpbgAcZGVwb3NpdAhAU3ViSWRlbnRpdGllc1NldAEADBBtYWluADhudW1iZXJfb2Zfc3VicwQsbmV3X2RlcG9zaXQISFN1YklkZW50aXR5UmVuYW1lZAEACAxzdWIAEG1haW4ASFN1YklkZW50aXR5UmVtb3ZlZAEADAxzdWIAEG1haW4AHGRlcG9zaXQISFN1YklkZW50aXR5UmV2b2tlZAEADAxzdWIAEG1haW4AHGRlcG9zaXQIOEF1dGhvcml0eUFkZGVkAQAEJGF1dGhvcml0eQBAQXV0aG9yaXR5UmVtb3ZlZAEABCRhdXRob3JpdHkALFVzZXJuYW1lU2V0AQAIDHdobwAgdXNlcm5hbWUkOFVzZXJuYW1lUXVldWVkAQAMDHdobwAgdXNlcm5hbWUkKGV4cGlyYXRpb24ESFByZWFwcHJvdmFsRXhwaXJlZAEABBR3aG9zZQBIUHJpbWFyeVVzZXJuYW1lU2V0AQAIDHdobwAgdXNlcm5hbWUkXERhbmdsaW5nVXNlcm5hbWVSZW1vdmVkAQAIDHdobwAgdXNlcm5hbWUkPFVzZXJuYW1lVW5ib3VuZAEABCB1c2VybmFtZSQ8VXNlcm5hbWVSZW1vdmVkAQAEIHVzZXJuYW1lJDhVc2VybmFtZUtpbGxlZAEABCB1c2VybmFtZSQgUmVjb3ZlcnkBAhw8UmVjb3ZlcnlDcmVhdGVkAQAEHGFjY291bnQARFJlY292ZXJ5SW5pdGlhdGVkAQAIMGxvc3RfYWNjb3VudAA8cmVzY3Vlcl9hY2NvdW50ADxSZWNvdmVyeVZvdWNoZWQBAAwwbG9zdF9hY2NvdW50ADxyZXNjdWVyX2FjY291bnQAGHNlbmRlcgA4UmVjb3ZlcnlDbG9zZWQBAAgwbG9zdF9hY2NvdW50ADxyZXNjdWVyX2FjY291bnQAQEFjY291bnRSZWNvdmVyZWQBAAgwbG9zdF9hY2NvdW50ADxyZXNjdWVyX2FjY291bnQAPFJlY292ZXJ5UmVtb3ZlZAEABDBsb3N0X2FjY291bnQAMERlcG9zaXRQb2tlZAEAEAx3aG8AEGtpbmQhDixvbGRfZGVwb3NpdAgsbmV3X2RlcG9zaXQIHFZlc3RpbmcBAgw4VmVzdGluZ0NyZWF0ZWQBAAgcYWNjb3VudAA4c2NoZWR1bGVfaW5kZXgEOFZlc3RpbmdVcGRhdGVkAQAIHGFjY291bnQAIHVudmVzdGVkCEBWZXN0aW5nQ29tcGxldGVkAQAEHGFjY291bnQAJFNjaGVkdWxlcgECKCRTY2hlZHVsZWQBAAgQd2hlbgQUaW5kZXgEIENhbmNlbGVkAQAIEHdoZW4EFGluZGV4BChEaXNwYXRjaGVkAQAMEHRhc2sNAQhpZBEBGHJlc3VsdBUOIFJldHJ5U2V0AQAQEHRhc2sNAQhpZBEBGHBlcmlvZAQccmV0cmllcwQ4UmV0cnlDYW5jZWxsZWQBAAgQdGFzaw0BCGlkEQE8Q2FsbFVuYXZhaWxhYmxlAQAIEHRhc2sNAQhpZBEBOFBlcmlvZGljRmFpbGVkAQAIEHRhc2sNAQhpZBEBLFJldHJ5RmFpbGVkAQAIEHRhc2sNAQhpZBEBVFBlcm1hbmVudGx5T3ZlcndlaWdodAEACBB0YXNrDQEIaWQRAUBBZ2VuZGFJbmNvbXBsZXRlAQAEEHdoZW4EIFByZWltYWdlAQIMFE5vdGVkAQAEEGhhc2ggJFJlcXVlc3RlZAEABBBoYXNoIBxDbGVhcmVkAQAEEGhhc2ggEFN1ZG8BAhAUU3VkaWQBAAQsc3Vkb19yZXN1bHQVDihLZXlDaGFuZ2VkAQAIDG9sZAUCDG5ldwAoS2V5UmVtb3ZlZAEBBShTdWRvQXNEb25lAQAELHN1ZG9fcmVzdWx0FQ4UUHJveHkBAhw0UHJveHlFeGVjdXRlZAEABBhyZXN1bHQVDixQdXJlQ3JlYXRlZAEAEBBwdXJlAAx3aG8AKHByb3h5X3R5cGU1DlBkaXNhbWJpZ3VhdGlvbl9pbmRleAQoUHVyZUtpbGxlZAEAEBBwdXJlABxzcGF3bmVyAChwcm94eV90eXBlNQ5QZGlzYW1iaWd1YXRpb25faW5kZXgEJEFubm91bmNlZAEADBByZWFsABRwcm94eQAkY2FsbF9oYXNoIChQcm94eUFkZGVkAQAQJGRlbGVnYXRvcgAkZGVsZWdhdGVlAChwcm94eV90eXBlNQ4UZGVsYXkEMFByb3h5UmVtb3ZlZAEAECRkZWxlZ2F0b3IAJGRlbGVnYXRlZQAocHJveHlfdHlwZTUOFGRlbGF5BDBEZXBvc2l0UG9rZWQBABAMd2hvABBraW5kOQ4sb2xkX2RlcG9zaXQILG5ld19kZXBvc2l0CCBNdWx0aXNpZwECFCxOZXdNdWx0aXNpZwEADCRhcHByb3ZpbmcAIG11bHRpc2lnACRjYWxsX2hhc2ggQE11bHRpc2lnQXBwcm92YWwBABAkYXBwcm92aW5nACR0aW1lcG9pbnTxASBtdWx0aXNpZwAkY2FsbF9oYXNoIEBNdWx0aXNpZ0V4ZWN1dGVkAQAUJGFwcHJvdmluZwAkdGltZXBvaW508QEgbXVsdGlzaWcAJGNhbGxfaGFzaCAYcmVzdWx0FQ5ETXVsdGlzaWdDYW5jZWxsZWQBABAoY2FuY2VsbGluZwAkdGltZXBvaW508QEgbXVsdGlzaWcAJGNhbGxfaGFzaCAwRGVwb3NpdFBva2VkAQAQDHdobwAkY2FsbF9oYXNoICxvbGRfZGVwb3NpdAgsbmV3X2RlcG9zaXQIaEVsZWN0aW9uUHJvdmlkZXJNdWx0aVBoYXNlAQIYOFNvbHV0aW9uU3RvcmVkAQAMHGNvbXB1dGUBAhhvcmlnaW4FAjBwcmV2X2VqZWN0ZWQUREVsZWN0aW9uRmluYWxpemVkAQAIHGNvbXB1dGUBAhRzY29yZQkCOEVsZWN0aW9uRmFpbGVkAQEFIFJld2FyZGVkAQAIHGFjY291bnQAFHZhbHVlCBxTbGFzaGVkAQAIHGFjY291bnQAFHZhbHVlCERQaGFzZVRyYW5zaXRpb25lZAEADBBmcm9tEQIIdG8RAhRyb3VuZAQkVm90ZXJMaXN0AQIIIFJlYmFnZ2VkAQAMDHdobwAQZnJvbQgIdG8IMFNjb3JlVXBkYXRlZAEACAx3aG8AJG5ld19zY29yZQg8Tm9taW5hdGlvblBvb2xzAQJcHENyZWF0ZWQBAAgkZGVwb3NpdG9yABxwb29sX2lkBBhCb25kZWQBABAYbWVtYmVyABxwb29sX2lkBBhib25kZWQIGGpvaW5lZBQcUGFpZE91dAEADBhtZW1iZXIAHHBvb2xfaWQEGHBheW91dAggVW5ib25kZWQBABQYbWVtYmVyABxwb29sX2lkBBxiYWxhbmNlCBhwb2ludHMIDGVyYQQkV2l0aGRyYXduAQAQGG1lbWJlcgAccG9vbF9pZAQcYmFsYW5jZQgYcG9pbnRzCCREZXN0cm95ZWQBAAQccG9vbF9pZAQwU3RhdGVDaGFuZ2VkAQAIHHBvb2xfaWQEJG5ld19zdGF0ZR0CNE1lbWJlclJlbW92ZWQBAAwccG9vbF9pZAQYbWVtYmVyAEByZWxlYXNlZF9iYWxhbmNlCDBSb2xlc1VwZGF0ZWQBAAwQcm9vdAUCHGJvdW5jZXIFAiRub21pbmF0b3IFAixQb29sU2xhc2hlZAEACBxwb29sX2lkBBxiYWxhbmNlCFBVbmJvbmRpbmdQb29sU2xhc2hlZAEADBxwb29sX2lkBAxlcmEEHGJhbGFuY2UIVFBvb2xDb21taXNzaW9uVXBkYXRlZAEACBxwb29sX2lkBBxjdXJyZW50JQJgUG9vbE1heENvbW1pc3Npb25VcGRhdGVkAQAIHHBvb2xfaWQEOG1heF9jb21taXNzaW9uBHxQb29sQ29tbWlzc2lvbkNoYW5nZVJhdGVVcGRhdGVkAQAIHHBvb2xfaWQELGNoYW5nZV9yYXRlKQKQUG9vbENvbW1pc3Npb25DbGFpbVBlcm1pc3Npb25VcGRhdGVkAQAIHHBvb2xfaWQEKHBlcm1pc3Npb24xAlRQb29sQ29tbWlzc2lvbkNsYWltZWQBAAgccG9vbF9pZAQoY29tbWlzc2lvbghkTWluQmFsYW5jZURlZmljaXRBZGp1c3RlZAEACBxwb29sX2lkBBhhbW91bnQIYE1pbkJhbGFuY2VFeGNlc3NBZGp1c3RlZAEACBxwb29sX2lkBBhhbW91bnQIcE1lbWJlckNsYWltUGVybWlzc2lvblVwZGF0ZWQBAAgYbWVtYmVyAChwZXJtaXNzaW9uiQU8TWV0YWRhdGFVcGRhdGVkAQAIHHBvb2xfaWQEGGNhbGxlcgBIUG9vbE5vbWluYXRpb25NYWRlAQAIHHBvb2xfaWQEGGNhbGxlcgBQUG9vbE5vbWluYXRvckNoaWxsZWQBAAgccG9vbF9pZAQYY2FsbGVyAExHbG9iYWxQYXJhbXNVcGRhdGVkAQAYNG1pbl9qb2luX2JvbmQIPG1pbl9jcmVhdGVfYm9uZAgkbWF4X3Bvb2xzLQQsbWF4X21lbWJlcnMtBFBtYXhfbWVtYmVyc19wZXJfcG9vbC0EVGdsb2JhbF9tYXhfY29tbWlzc2lvbi0ELEZhc3RVbnN0YWtlAQIUIFVuc3Rha2VkAQAIFHN0YXNoABhyZXN1bHQVDhxTbGFzaGVkAQAIFHN0YXNoABhhbW91bnQIMEJhdGNoQ2hlY2tlZAEABBBlcmFzOQI0QmF0Y2hGaW5pc2hlZAEABBBzaXplBDRJbnRlcm5hbEVycm9yAQEFQENvbnZpY3Rpb25Wb3RpbmcBAhQkRGVsZWdhdGVkAQQAAQgsVW5kZWxlZ2F0ZWQBAQEUVm90ZWQBAAgMd2hvABB2b3RlNQQsVm90ZVJlbW92ZWQBAAgMd2hvABB2b3RlNQQwVm90ZVVubG9ja2VkAQAIDHdobwAUY2xhc3MEJFJlZmVyZW5kYQECQCRTdWJtaXR0ZWQBAAwUaW5kZXgEFHRyYWNrBCBwcm9wb3NhbKUBVERlY2lzaW9uRGVwb3NpdFBsYWNlZAEADBRpbmRleAQMd2hvABhhbW91bnQIXERlY2lzaW9uRGVwb3NpdFJlZnVuZGVkAQAMFGluZGV4BAx3aG8AGGFtb3VudAg4RGVwb3NpdFNsYXNoZWQBAAgMd2hvABhhbW91bnQIPERlY2lzaW9uU3RhcnRlZAEAEBRpbmRleAQUdHJhY2sEIHByb3Bvc2FspQEUdGFsbHmpAThDb25maXJtU3RhcnRlZAEABBRpbmRleAQ4Q29uZmlybUFib3J0ZWQBAAQUaW5kZXgEJENvbmZpcm1lZAEACBRpbmRleAQUdGFsbHmpASBBcHByb3ZlZAEABBRpbmRleAQgUmVqZWN0ZWQBAAgUaW5kZXgEFHRhbGx5qQEgVGltZWRPdXQBAAgUaW5kZXgEFHRhbGx5qQEkQ2FuY2VsbGVkAQAIFGluZGV4BBR0YWxseakBGEtpbGxlZAEACBRpbmRleAQUdGFsbHmpAWRTdWJtaXNzaW9uRGVwb3NpdFJlZnVuZGVkAQAMFGluZGV4BAx3aG8AGGFtb3VudAgsTWV0YWRhdGFTZXQBAAgUaW5kZXgEEGhhc2ggPE1ldGFkYXRhQ2xlYXJlZAEACBRpbmRleAQQaGFzaCAkV2hpdGVsaXN0AQIMPENhbGxXaGl0ZWxpc3RlZAEABCRjYWxsX2hhc2ggWFdoaXRlbGlzdGVkQ2FsbFJlbW92ZWQBAAQkY2FsbF9oYXNoIGRXaGl0ZWxpc3RlZENhbGxEaXNwYXRjaGVkAQAIJGNhbGxfaGFzaCAYcmVzdWx0VQ4gVHJlYXN1cnkBAjAgU3BlbmRpbmcBAARAYnVkZ2V0X3JlbWFpbmluZwgcQXdhcmRlZAEADDhwcm9wb3NhbF9pbmRleAQUYXdhcmQIHGFjY291bnQAFEJ1cm50AQAELGJ1cm50X2Z1bmRzCCBSb2xsb3ZlcgEABEByb2xsb3Zlcl9iYWxhbmNlCBxEZXBvc2l0AQAEFHZhbHVlCDRTcGVuZEFwcHJvdmVkAQAMOHByb3Bvc2FsX2luZGV4BBhhbW91bnQILGJlbmVmaWNpYXJ5ADxVcGRhdGVkSW5hY3RpdmUBAAgscmVhY3RpdmF0ZWQILGRlYWN0aXZhdGVkCEhBc3NldFNwZW5kQXBwcm92ZWQBABgUaW5kZXgEKGFzc2V0X2tpbmSNDhhhbW91bnQILGJlbmVmaWNpYXJ5kQ4odmFsaWRfZnJvbQQkZXhwaXJlX2F0BEBBc3NldFNwZW5kVm9pZGVkAQAEFGluZGV4BBBQYWlkAQAIFGluZGV4BChwYXltZW50X2lkCDRQYXltZW50RmFpbGVkAQAIFGluZGV4BChwYXltZW50X2lkCDhTcGVuZFByb2Nlc3NlZAEABBRpbmRleARARGVsZWdhdGVkU3Rha2luZwECECREZWxlZ2F0ZWQBAAwUYWdlbnQAJGRlbGVnYXRvcgAYYW1vdW50CCBSZWxlYXNlZAEADBRhZ2VudAAkZGVsZWdhdG9yABhhbW91bnQIHFNsYXNoZWQBAAwUYWdlbnQAJGRlbGVnYXRvcgAYYW1vdW50CEhNaWdyYXRlZERlbGVnYXRpb24BAAwUYWdlbnQAJGRlbGVnYXRvcgAYYW1vdW50CDRQYXJhSW5jbHVzaW9uAQIQPENhbmRpZGF0ZUJhY2tlZAEDEKUOJAQERENhbmRpZGF0ZUluY2x1ZGVkAQMQpQ4kBAREQ2FuZGlkYXRlVGltZWRPdXQBAwylDiQEWFVwd2FyZE1lc3NhZ2VzUmVjZWl2ZWQBAAgQZnJvbQQUY291bnQEFFBhcmFzAQIoSEN1cnJlbnRDb2RlVXBkYXRlZAEBAkhDdXJyZW50SGVhZFVwZGF0ZWQBAQJQQ29kZVVwZ3JhZGVTY2hlZHVsZWQBAQIwTmV3SGVhZE5vdGVkAQECMEFjdGlvblF1ZXVlZAEEBAEIPFB2ZkNoZWNrU3RhcnRlZAEDCCAEQFB2ZkNoZWNrQWNjZXB0ZWQBAwggBEBQdmZDaGVja1JlamVjdGVkAQMIIARYVXBncmFkZUNvb2xkb3duUmVtb3ZlZAEABBxwYXJhX2lkBDhDb2RlQXV0aG9yaXplZAEADBxwYXJhX2lkBCRjb2RlX2hhc2ggJGV4cGlyZV9hdAQQSHJtcAECHFBPcGVuQ2hhbm5lbFJlcXVlc3RlZAEAEBhzZW5kZXIEJHJlY2lwaWVudARUcHJvcG9zZWRfbWF4X2NhcGFjaXR5BGRwcm9wb3NlZF9tYXhfbWVzc2FnZV9zaXplBExPcGVuQ2hhbm5lbENhbmNlbGVkAQAIMGJ5X3BhcmFjaGFpbgQoY2hhbm5lbF9pZFUCTE9wZW5DaGFubmVsQWNjZXB0ZWQBAAgYc2VuZGVyBCRyZWNpcGllbnQENENoYW5uZWxDbG9zZWQBAAgwYnlfcGFyYWNoYWluBChjaGFubmVsX2lkVQJYSHJtcENoYW5uZWxGb3JjZU9wZW5lZAEAEBhzZW5kZXIEJHJlY2lwaWVudARUcHJvcG9zZWRfbWF4X2NhcGFjaXR5BGRwcm9wb3NlZF9tYXhfbWVzc2FnZV9zaXplBFxIcm1wU3lzdGVtQ2hhbm5lbE9wZW5lZAEAEBhzZW5kZXIEJHJlY2lwaWVudARUcHJvcG9zZWRfbWF4X2NhcGFjaXR5BGRwcm9wb3NlZF9tYXhfbWVzc2FnZV9zaXplBGhPcGVuQ2hhbm5lbERlcG9zaXRzVXBkYXRlZAEACBhzZW5kZXIEJHJlY2lwaWVudAQ0UGFyYXNEaXNwdXRlcwECDEBEaXNwdXRlSW5pdGlhdGVkAQMIIF0CQERpc3B1dGVDb25jbHVkZWQBAwggYQIYUmV2ZXJ0AQECaE9uRGVtYW5kQXNzaWdubWVudFByb3ZpZGVyAQIMTE9uRGVtYW5kT3JkZXJQbGFjZWQBAAwccGFyYV9pZAQoc3BvdF9wcmljZQgob3JkZXJlZF9ieQAwU3BvdFByaWNlU2V0AQAEKHNwb3RfcHJpY2UIPEFjY291bnRDcmVkaXRlZAEACAx3aG8AGGFtb3VudAgkUmVnaXN0cmFyAQIQKFJlZ2lzdGVyZWQBAAgccGFyYV9pZAQcbWFuYWdlcgAwRGVyZWdpc3RlcmVkAQAEHHBhcmFfaWQEIFJlc2VydmVkAQAIHHBhcmFfaWQEDHdobwAcU3dhcHBlZAEACBxwYXJhX2lkBCBvdGhlcl9pZAQUU2xvdHMBAgg4TmV3TGVhc2VQZXJpb2QBAAQwbGVhc2VfcGVyaW9kBBhMZWFzZWQBABgccGFyYV9pZAQYbGVhc2VyADBwZXJpb2RfYmVnaW4EMHBlcmlvZF9jb3VudAQ4ZXh0cmFfcmVzZXJ2ZWQIMHRvdGFsX2Ftb3VudAggQXVjdGlvbnMBAhw4QXVjdGlvblN0YXJ0ZWQBAAw0YXVjdGlvbl9pbmRleAQwbGVhc2VfcGVyaW9kBBhlbmRpbmcENEF1Y3Rpb25DbG9zZWQBAAQ0YXVjdGlvbl9pbmRleAQgUmVzZXJ2ZWQBAAwYYmlkZGVyADhleHRyYV9yZXNlcnZlZAgwdG90YWxfYW1vdW50CChVbnJlc2VydmVkAQAIGGJpZGRlcgAYYW1vdW50CEhSZXNlcnZlQ29uZmlzY2F0ZWQBAAwccGFyYV9pZAQYbGVhc2VyABhhbW91bnQILEJpZEFjY2VwdGVkAQAUGGJpZGRlcgAccGFyYV9pZAQYYW1vdW50CChmaXJzdF9zbG90BCRsYXN0X3Nsb3QENFdpbm5pbmdPZmZzZXQBAAg0YXVjdGlvbl9pbmRleAQwYmxvY2tfbnVtYmVyBCRDcm93ZGxvYW4BAigcQ3JlYXRlZAEABBxwYXJhX2lkBCxDb250cmlidXRlZAEADAx3aG8AKGZ1bmRfaW5kZXgEGGFtb3VudAggV2l0aGRyZXcBAAwMd2hvAChmdW5kX2luZGV4BBhhbW91bnQIRFBhcnRpYWxseVJlZnVuZGVkAQAEHHBhcmFfaWQELEFsbFJlZnVuZGVkAQAEHHBhcmFfaWQEJERpc3NvbHZlZAEABBxwYXJhX2lkBDxIYW5kbGVCaWRSZXN1bHQBAAgccGFyYV9pZAQYcmVzdWx0FQ4YRWRpdGVkAQAEHHBhcmFfaWQELE1lbW9VcGRhdGVkAQAMDHdobwAccGFyYV9pZAQQbWVtbyQ8QWRkZWRUb05ld1JhaXNlAQAEHHBhcmFfaWQENEFzc2lnbmVkU2xvdHMBAhBUUGVybWFuZW50U2xvdEFzc2lnbmVkAQECVFRlbXBvcmFyeVNsb3RBc3NpZ25lZAEBAmBNYXhQZXJtYW5lbnRTbG90c0NoYW5nZWQBAAQUc2xvdHMEYE1heFRlbXBvcmFyeVNsb3RzQ2hhbmdlZAEABBRzbG90cwQgQ29yZXRpbWUBAghQUmV2ZW51ZUluZm9SZXF1ZXN0ZWQBAAQQd2hlbgQwQ29yZUFzc2lnbmVkAQAEEGNvcmUEPFN0YWtpbmdBaENsaWVudAECEFBWYWxpZGF0b3JTZXRSZWNlaXZlZAEAEAhpZARcbmV3X3ZhbGlkYXRvcl9zZXRfY291bnQELHBydW5lX3VwX3RvLQQgbGVmdG92ZXIUXENvdWxkTm90TWVyZ2VBbmREcm9wcGVkAQEFVFNldFRvb1NtYWxsQW5kRHJvcHBlZAEBBShVbmV4cGVjdGVkAQIIgFJlY2VpdmVkVmFsaWRhdG9yU2V0V2hpbGVQYXNzaXZlAQEFYFVuZXhwZWN0ZWRNb2RlVHJhbnNpdGlvbgEBBVBNdWx0aUJsb2NrTWlncmF0aW9ucwECIDhVcGdyYWRlU3RhcnRlZAEABChtaWdyYXRpb25zBEBVcGdyYWRlQ29tcGxldGVkAQEFNFVwZ3JhZGVGYWlsZWQBAQVATWlncmF0aW9uU2tpcHBlZAEABBRpbmRleARETWlncmF0aW9uQWR2YW5jZWQBAAgUaW5kZXgEEHRvb2sESE1pZ3JhdGlvbkNvbXBsZXRlZAEACBRpbmRleAQQdG9vawQ8TWlncmF0aW9uRmFpbGVkAQAIFGluZGV4BBB0b29rBDxIaXN0b3JpY0NsZWFyZWQBAAQsbmV4dF9jdXJzb3LFBSRYY21QYWxsZXQBAnQkQXR0ZW1wdGVkAQAEHG91dGNvbWXRDhBTZW50AQAQGG9yaWdpbokOLGRlc3RpbmF0aW9uiQ4cbWVzc2FnZRUPKG1lc3NhZ2VfaWQgKFNlbmRGYWlsZWQBABAYb3JpZ2luiQ4sZGVzdGluYXRpb26JDhRlcnJvchkPKG1lc3NhZ2VfaWQgPFByb2Nlc3NYY21FcnJvcgEADBhvcmlnaW6JDhRlcnJvcskOKG1lc3NhZ2VfaWQgSFVuZXhwZWN0ZWRSZXNwb25zZQEACBhvcmlnaW6JDiBxdWVyeV9pZAg0UmVzcG9uc2VSZWFkeQEACCBxdWVyeV9pZAggcmVzcG9uc2XlDiBOb3RpZmllZAEADCBxdWVyeV9pZAgwcGFsbGV0X2luZGV4BChjYWxsX2luZGV4BEBOb3RpZnlPdmVyd2VpZ2h0AQAUIHF1ZXJ5X2lkCDBwYWxsZXRfaW5kZXgEKGNhbGxfaW5kZXgENGFjdHVhbF93ZWlnaHQYTG1heF9idWRnZXRlZF93ZWlnaHQYTE5vdGlmeURpc3BhdGNoRXJyb3IBAAwgcXVlcnlfaWQIMHBhbGxldF9pbmRleAQoY2FsbF9pbmRleARITm90aWZ5RGVjb2RlRmFpbGVkAQAMIHF1ZXJ5X2lkCDBwYWxsZXRfaW5kZXgEKGNhbGxfaW5kZXgEQEludmFsaWRSZXNwb25kZXIBAAwYb3JpZ2luiQ4gcXVlcnlfaWQIRGV4cGVjdGVkX2xvY2F0aW9u6Q5cSW52YWxpZFJlc3BvbmRlclZlcnNpb24BAAgYb3JpZ2luiQ4gcXVlcnlfaWQINFJlc3BvbnNlVGFrZW4BAAQgcXVlcnlfaWQINEFzc2V0c1RyYXBwZWQBAAwQaGFzaCAYb3JpZ2luiQ4YYXNzZXRzHQ9UVmVyc2lvbkNoYW5nZU5vdGlmaWVkAQAQLGRlc3RpbmF0aW9uiQ4YcmVzdWx0BBBjb3N02Q4obWVzc2FnZV9pZCBcU3VwcG9ydGVkVmVyc2lvbkNoYW5nZWQBAAggbG9jYXRpb26JDhx2ZXJzaW9uBFBOb3RpZnlUYXJnZXRTZW5kRmFpbAEADCBsb2NhdGlvbokOIHF1ZXJ5X2lkCBRlcnJvcskOZE5vdGlmeVRhcmdldE1pZ3JhdGlvbkZhaWwBAAggbG9jYXRpb26RDiBxdWVyeV9pZAhUSW52YWxpZFF1ZXJpZXJWZXJzaW9uAQAIGG9yaWdpbokOIHF1ZXJ5X2lkCDhJbnZhbGlkUXVlcmllcgEAEBhvcmlnaW6JDiBxdWVyeV9pZAhAZXhwZWN0ZWRfcXVlcmllcokOUG1heWJlX2FjdHVhbF9xdWVyaWVy6Q5QVmVyc2lvbk5vdGlmeVN0YXJ0ZWQBAAwsZGVzdGluYXRpb26JDhBjb3N02Q4obWVzc2FnZV9pZCBYVmVyc2lvbk5vdGlmeVJlcXVlc3RlZAEADCxkZXN0aW5hdGlvbokOEGNvc3TZDihtZXNzYWdlX2lkIGBWZXJzaW9uTm90aWZ5VW5yZXF1ZXN0ZWQBAAwsZGVzdGluYXRpb26JDhBjb3N02Q4obWVzc2FnZV9pZCAgRmVlc1BhaWQBAAgYcGF5aW5niQ4QZmVlc9kONEFzc2V0c0NsYWltZWQBAAwQaGFzaCAYb3JpZ2luiQ4YYXNzZXRzHQ9gVmVyc2lvbk1pZ3JhdGlvbkZpbmlzaGVkAQAEHHZlcnNpb24EPEFsaWFzQXV0aG9yaXplZAEADBxhbGlhc2VyiQ4YdGFyZ2V0iQ4YZXhwaXJ59QNkQWxpYXNBdXRob3JpemF0aW9uUmVtb3ZlZAEACBxhbGlhc2VyiQ4YdGFyZ2V0iQ5wQWxpYXNlc0F1dGhvcml6YXRpb25zUmVtb3ZlZAEABBh0YXJnZXSJDjBNZXNzYWdlUXVldWUBAhBAUHJvY2Vzc2luZ0ZhaWxlZAEADAhpZCAYb3JpZ2luJQMUZXJyb3IpAyRQcm9jZXNzZWQBABAIaWQgGG9yaWdpbiUDLHdlaWdodF91c2VkGBxzdWNjZXNzFEhPdmVyd2VpZ2h0RW5xdWV1ZWQBABAIaWQgGG9yaWdpbiUDKHBhZ2VfaW5kZXgENG1lc3NhZ2VfaW5kZXgEKFBhZ2VSZWFwZWQBAAgYb3JpZ2luJQMUaW5kZXgEJEFzc2V0UmF0ZQECDEBBc3NldFJhdGVDcmVhdGVkAQAIKGFzc2V0X2tpbmSNDhByYXRlCEBBc3NldFJhdGVSZW1vdmVkAQAEKGFzc2V0X2tpbmSNDkBBc3NldFJhdGVVcGRhdGVkAQAMKGFzc2V0X2tpbmSNDgxvbGQIDG5ldwgsUm9vdFRlc3RpbmcBAgRERGVmZW5zaXZlVGVzdENhbGwBAQUYTWV0YVR4AQIEKERpc3BhdGNoZWQBAAQYcmVzdWx0VQ5ASWRlbnRpdHlNaWdyYXRvcgECCDhJZGVudGl0eVJlYXBlZAEABAx3aG8AOERlcG9zaXRVcGRhdGVkAQAMDHdobwAgaWRlbnRpdHkIEHN1YnMIAAwUcGhhc2U0FGV2ZW50NQ8YdG9waWNzOQMEOQ8AACAkc3BlY19uYW1lSQMkaW1wbF9uYW1lSQNEYXV0aG9yaW5nX3ZlcnNpb24EMHNwZWNfdmVyc2lvbgQwaW1wbF92ZXJzaW9uBBBhcGlzbQNMdHJhbnNhY3Rpb25fdmVyc2lvbgQ4c3lzdGVtX3ZlcnNpb24EAgQcU3Rha2luZwEBBQIEEEtleXMBAQUCBERTdGFraW5nRGVsZWdhdGlvbgEBBQIEOEF1dGhvcml6ZUFsaWFzAQEFAhQcU3Rha2luZwECBBxTdGFraW5nAQEFHFNlc3Npb24BAgQQS2V5cwEBBSBQcmVpbWFnZQECBCBQcmVpbWFnZQEBBUBEZWxlZ2F0ZWRTdGFraW5nAQIERFN0YWtpbmdEZWxlZ2F0aW9uAQEFJFhjbVBhbGxldAECBDhBdXRob3JpemVBbGlhcwEBBQAICGlkVQ8YYW1vdW50CARZDwACGBRjbGFpbQEABBRpbmRleAQgdHJhbnNmZXIBAAgMbmV31QMUaW5kZXgEEGZyZWUBAAQUaW5kZXgEOGZvcmNlX3RyYW5zZmVyAQAMDG5ld9UDFGluZGV4BBhmcmVlemUUGGZyZWV6ZQEABBRpbmRleAQwcG9rZV9kZXBvc2l0AQAEFGluZGV4BAKAEGJvbmQBAAgUdmFsdWUIFHBheWVlNQEoYm9uZF9leHRyYQEABDhtYXhfYWRkaXRpb25hbAgYdW5ib25kAQAEFHZhbHVlCER3aXRoZHJhd191bmJvbmRlZAEABEhudW1fc2xhc2hpbmdfc3BhbnMEIHZhbGlkYXRlAQAEFHByZWZzOQEgbm9taW5hdGUBAAQcdGFyZ2V0c+kDFGNoaWxsAQEFJHNldF9wYXllZQEABBRwYXllZTUBOHNldF9jb250cm9sbGVyAQEFTHNldF92YWxpZGF0b3JfY291bnQBAAQMbmV3BGBpbmNyZWFzZV92YWxpZGF0b3JfY291bnQBAAQoYWRkaXRpb25hbARUc2NhbGVfdmFsaWRhdG9yX2NvdW50AQAEGGZhY3RvcgQ0Zm9yY2Vfbm9fZXJhcwEBBTRmb3JjZV9uZXdfZXJhAQEFRHNldF9pbnZ1bG5lcmFibGVzAQAENGludnVsbmVyYWJsZXPdAzRmb3JjZV91bnN0YWtlAQAIFHN0YXNoAEhudW1fc2xhc2hpbmdfc3BhbnMEUGZvcmNlX25ld19lcmFfYWx3YXlzAQEFVGNhbmNlbF9kZWZlcnJlZF9zbGFzaAEACAxlcmEENHNsYXNoX2luZGljZXM5AjhwYXlvdXRfc3Rha2VycwEACDx2YWxpZGF0b3Jfc3Rhc2gADGVyYQQYcmVib25kAQAEFHZhbHVlCChyZWFwX3N0YXNoAQAIFHN0YXNoAEhudW1fc2xhc2hpbmdfc3BhbnMEEGtpY2sBAAQMd2hv6QNMc2V0X3N0YWtpbmdfY29uZmlncwEAHEhtaW5fbm9taW5hdG9yX2JvbmTtA0htaW5fdmFsaWRhdG9yX2JvbmTtA0xtYXhfbm9taW5hdG9yX2NvdW508QNMbWF4X3ZhbGlkYXRvcl9jb3VudPEDPGNoaWxsX3RocmVzaG9sZPEDOG1pbl9jb21taXNzaW9u8QNIbWF4X3N0YWtlZF9yZXdhcmRz8QMsY2hpbGxfb3RoZXIBAAQUc3Rhc2gAaGZvcmNlX2FwcGx5X21pbl9jb21taXNzaW9uAQAEPHZhbGlkYXRvcl9zdGFzaABIc2V0X21pbl9jb21taXNzaW9uAQAEDG5ldwRYcGF5b3V0X3N0YWtlcnNfYnlfcGFnZQEADDx2YWxpZGF0b3Jfc3Rhc2gADGVyYQQQcGFnZQQwdXBkYXRlX3BheWVlAQAEKGNvbnRyb2xsZXIAaGRlcHJlY2F0ZV9jb250cm9sbGVyX2JhdGNoAQAELGNvbnRyb2xsZXJz3QM4cmVzdG9yZV9sZWRnZXIBABAUc3Rhc2gAQG1heWJlX2NvbnRyb2xsZXIFAixtYXliZV90b3RhbPUDPG1heWJlX3VubG9ja2luZwEEQG1pZ3JhdGVfY3VycmVuY3kBAAQUc3Rhc2gAMG1hbnVhbF9zbGFzaAEADDx2YWxpZGF0b3Jfc3Rhc2gADGVyYQQ4c2xhc2hfZnJhY3Rpb24EAhAQUm9vdAEBBRhTaWduZWQBAQEQTm9uZQEBBShBdXRob3JpemVkAQEFAmwwU3Rha2luZ0FkbWluAQEFJFRyZWFzdXJlcgEBBTxGZWxsb3dzaGlwQWRtaW4BAQUwR2VuZXJhbEFkbWluAQEFMEF1Y3Rpb25BZG1pbgEBBShMZWFzZUFkbWluAQEFTFJlZmVyZW5kdW1DYW5jZWxsZXIBAQVAUmVmZXJlbmR1bUtpbGxlcgEBBSxTbWFsbFRpcHBlcgEBBSRCaWdUaXBwZXIBAQUwU21hbGxTcGVuZGVyAQEFNE1lZGl1bVNwZW5kZXIBAQUoQmlnU3BlbmRlcgEBBURXaGl0ZWxpc3RlZENhbGxlcgEBBUxGZWxsb3dzaGlwSW5pdGlhdGVzAQEFHEZlbGxvd3MBAQVERmVsbG93c2hpcEV4cGVydHMBAQVERmVsbG93c2hpcE1hc3RlcnMBAQU4RmVsbG93c2hpcDFEYW4BAQU4RmVsbG93c2hpcDJEYW4BAQU4RmVsbG93c2hpcDNEYW4BAQU4RmVsbG93c2hpcDREYW4BAQU4RmVsbG93c2hpcDVEYW4BAQU4RmVsbG93c2hpcDZEYW4BAQU4RmVsbG93c2hpcDdEYW4BAQU4RmVsbG93c2hpcDhEYW4BAQU4RmVsbG93c2hpcDlEYW4BAQUCCAxYY20BAAgccGFyZW50cwQgaW50ZXJpb3KFDiBSZXNwb25zZQEACBxwYXJlbnRzBCBpbnRlcmlvcoUOAhAYc3lzdGVtAQIQEFJvb3QBAQUYU2lnbmVkAQEBEE5vbmUBAQUoQXV0aG9yaXplZAEBBRxPcmlnaW5zAQJsMFN0YWtpbmdBZG1pbgEBBSRUcmVhc3VyZXIBAQU8RmVsbG93c2hpcEFkbWluAQEFMEdlbmVyYWxBZG1pbgEBBTBBdWN0aW9uQWRtaW4BAQUoTGVhc2VBZG1pbgEBBUxSZWZlcmVuZHVtQ2FuY2VsbGVyAQEFQFJlZmVyZW5kdW1LaWxsZXIBAQUsU21hbGxUaXBwZXIBAQUkQmlnVGlwcGVyAQEFMFNtYWxsU3BlbmRlcgEBBTRNZWRpdW1TcGVuZGVyAQEFKEJpZ1NwZW5kZXIBAQVEV2hpdGVsaXN0ZWRDYWxsZXIBAQVMRmVsbG93c2hpcEluaXRpYXRlcwEBBRxGZWxsb3dzAQEFREZlbGxvd3NoaXBFeHBlcnRzAQEFREZlbGxvd3NoaXBNYXN0ZXJzAQEFOEZlbGxvd3NoaXAxRGFuAQEFOEZlbGxvd3NoaXAyRGFuAQEFOEZlbGxvd3NoaXAzRGFuAQEFOEZlbGxvd3NoaXA0RGFuAQEFOEZlbGxvd3NoaXA1RGFuAQEFOEZlbGxvd3NoaXA2RGFuAQEFOEZlbGxvd3NoaXA3RGFuAQEFOEZlbGxvd3NoaXA4RGFuAQEFOEZlbGxvd3NoaXA5RGFuAQEFQFBhcmFjaGFpbnNPcmlnaW4BAgQkUGFyYWNoYWluAQECJFhjbVBhbGxldAECCAxYY20BAAgccGFyZW50cwQgaW50ZXJpb3KFDiBSZXNwb25zZQEACBxwYXJlbnRzBCBpbnRlcmlvcoUOAiAUYmF0Y2gBAAQUY2FsbHPVEDRhc19kZXJpdmF0aXZlAQAIFGluZGV4BBBjYWxs0RAkYmF0Y2hfYWxsAQAEFGNhbGxz1RAsZGlzcGF0Y2hfYXMBAAgkYXNfb3JpZ2ludQ8QY2FsbNEQLGZvcmNlX2JhdGNoAQAEFGNhbGxz1RAsd2l0aF93ZWlnaHQBAAgQY2FsbNEQGHdlaWdodBgcaWZfZWxzZQEACBBtYWlu0RAgZmFsbGJhY2vREFBkaXNwYXRjaF9hc19mYWxsaWJsZQEACCRhc19vcmlnaW51DxBjYWxs0RAFAQwFARQFARgFARwFASQFASgFASwFATAFATQFATgFATwFAUQFAUgFAUwFAVQFAVgFAVwFAWAFAWgFAWwFAXAFAXQFAXgFAXwCmBBOb25lAQEFEFJhdzABAQUQUmF3MQEBAhBSYXcyAQUBCBBSYXczAQUBDBBSYXc0AQUBEBBSYXc1AQUBFBBSYXc2AQUBGBBSYXc3AQUBHBBSYXc4AQUBIBBSYXc5AQUBJBRSYXcxMAEFASgUUmF3MTEBBQEsFFJhdzEyAQUBMBRSYXcxMwEFATQUUmF3MTQBBQE4FFJhdzE1AQUBPBRSYXcxNgEFAUAUUmF3MTcBBQFEFFJhdzE4AQUBSBRSYXcxOQEFAUwUUmF3MjABBQFQFFJhdzIxAQUBVBRSYXcyMgEFAVgUUmF3MjMBBQFcFFJhdzI0AQUBYBRSYXcyNQEFAWQUUmF3MjYBBQFoFFJhdzI3AQUBbBRSYXcyOAEFAXAUUmF3MjkBBQF0FFJhdzMwAQUBeBRSYXczMQEFAXwUUmF3MzIBBQGALEJsYWtlVHdvMjU2AQUBgBhTaGEyNTYBBQGAJEtlY2NhazI1NgEFAYAsU2hhVGhyZWUyNTYBBQGABN0PAQgE4Q8ABmUBACQoYWRkaXRpb25hbOUPHGRpc3BsYXndDxRsZWdhbN0PDHdlYt0PEHJpb3TdDxRlbWFpbN0PPHBncF9maW5nZXJwcmludOkPFGltYWdl3Q8cdHdpdHRlct0PAwgA3Q8E8Q8AAhwcVW5rbm93bgEBBRxGZWVQYWlkAQEDKFJlYXNvbmFibGUBAQUkS25vd25Hb29kAQEFJE91dE9mRGF0ZQEBBShMb3dRdWFsaXR5AQEFJEVycm9uZW91cwEBBQJgNGFkZF9yZWdpc3RyYXIBAAQcYWNjb3VudNUDMHNldF9pZGVudGl0eQEABBBpbmZv7Q8gc2V0X3N1YnMBAAQQc3Vic/UPOGNsZWFyX2lkZW50aXR5AQEFRHJlcXVlc3RfanVkZ2VtZW50AQAIJHJlZ19pbmRleAQcbWF4X2ZlZQg4Y2FuY2VsX3JlcXVlc3QBAAQkcmVnX2luZGV4BBxzZXRfZmVlAQAIFGluZGV4BAxmZWUIOHNldF9hY2NvdW50X2lkAQAIFGluZGV4BAxuZXfVAyhzZXRfZmllbGRzAQAIFGluZGV4BBhmaWVsZHMIRHByb3ZpZGVfanVkZ2VtZW50AQAQJHJlZ19pbmRleAQYdGFyZ2V01QMkanVkZ2VtZW50+Q8gaWRlbnRpdHkgNGtpbGxfaWRlbnRpdHkBAAQYdGFyZ2V01QMcYWRkX3N1YgEACAxzdWLVAxBkYXRh3Q8ocmVuYW1lX3N1YgEACAxzdWLVAxBkYXRh3Q8ocmVtb3ZlX3N1YgEABAxzdWLVAyBxdWl0X3N1YgEBBVhhZGRfdXNlcm5hbWVfYXV0aG9yaXR5AQAMJGF1dGhvcml0edUDGHN1ZmZpeCQoYWxsb2NhdGlvbgRkcmVtb3ZlX3VzZXJuYW1lX2F1dGhvcml0eQEACBhzdWZmaXgkJGF1dGhvcml0edUDQHNldF91c2VybmFtZV9mb3IBABAMd2hv1QMgdXNlcm5hbWUkJHNpZ25hdHVyZUUGOHVzZV9hbGxvY2F0aW9uFDxhY2NlcHRfdXNlcm5hbWUBAAQgdXNlcm5hbWUkXHJlbW92ZV9leHBpcmVkX2FwcHJvdmFsAQAEIHVzZXJuYW1lJFBzZXRfcHJpbWFyeV91c2VybmFtZQEABCB1c2VybmFtZSQ8dW5iaW5kX3VzZXJuYW1lAQAEIHVzZXJuYW1lJDxyZW1vdmVfdXNlcm5hbWUBAAQgdXNlcm5hbWUkNGtpbGxfdXNlcm5hbWUBAAQgdXNlcm5hbWUkBtUDAigwYXNfcmVjb3ZlcmVkAQAIHGFjY291bnTVAxBjYWxs0RA0c2V0X3JlY292ZXJlZAEACBBsb3N01QMccmVzY3VlctUDPGNyZWF0ZV9yZWNvdmVyeQEADBxmcmllbmRz3QMkdGhyZXNob2xkBDBkZWxheV9wZXJpb2QERGluaXRpYXRlX3JlY292ZXJ5AQAEHGFjY291bnTVAzh2b3VjaF9yZWNvdmVyeQEACBBsb3N01QMccmVzY3VlctUDOGNsYWltX3JlY292ZXJ5AQAEHGFjY291bnTVAzhjbG9zZV9yZWNvdmVyeQEABBxyZXNjdWVy1QM8cmVtb3ZlX3JlY292ZXJ5AQEFQGNhbmNlbF9yZWNvdmVyZWQBAAQcYWNjb3VudNUDMHBva2VfZGVwb3NpdAEABDRtYXliZV9hY2NvdW50ARACKCBzY2hlZHVsZQEAEBB3aGVuBDhtYXliZV9wZXJpb2RpY4EDIHByaW9yaXR5BBBjYWxs0RAYY2FuY2VsAQAIEHdoZW4EFGluZGV4BDhzY2hlZHVsZV9uYW1lZAEAFAhpZCAQd2hlbgQ4bWF5YmVfcGVyaW9kaWOBAyBwcmlvcml0eQQQY2FsbNEQMGNhbmNlbF9uYW1lZAEABAhpZCA4c2NoZWR1bGVfYWZ0ZXIBABAUYWZ0ZXIEOG1heWJlX3BlcmlvZGljgQMgcHJpb3JpdHkEEGNhbGzREFBzY2hlZHVsZV9uYW1lZF9hZnRlcgEAFAhpZCAUYWZ0ZXIEOG1heWJlX3BlcmlvZGljgQMgcHJpb3JpdHkEEGNhbGzRECRzZXRfcmV0cnkBAAwQdGFzaw0BHHJldHJpZXMEGHBlcmlvZAQ8c2V0X3JldHJ5X25hbWVkAQAMCGlkIBxyZXRyaWVzBBhwZXJpb2QEMGNhbmNlbF9yZXRyeQEABBB0YXNrDQFIY2FuY2VsX3JldHJ5X25hbWVkAQAECGlkIAIUEHN1ZG8BAAQQY2FsbNEQVHN1ZG9fdW5jaGVja2VkX3dlaWdodAEACBBjYWxs0RAYd2VpZ2h0GBxzZXRfa2V5AQAEDG5ld9UDHHN1ZG9fYXMBAAgMd2hv1QMQY2FsbNEQKHJlbW92ZV9rZXkBAQUGNQ4CLBRwcm94eQEADBByZWFs1QNAZm9yY2VfcHJveHlfdHlwZREQEGNhbGzRECRhZGRfcHJveHkBAAwgZGVsZWdhdGXVAyhwcm94eV90eXBlNQ4UZGVsYXkEMHJlbW92ZV9wcm94eQEADCBkZWxlZ2F0ZdUDKHByb3h5X3R5cGU1DhRkZWxheQQ4cmVtb3ZlX3Byb3hpZXMBAQUsY3JlYXRlX3B1cmUBAAwocHJveHlfdHlwZTUOFGRlbGF5BBRpbmRleAQka2lsbF9wdXJlAQAUHHNwYXduZXLVAyhwcm94eV90eXBlNQ4UaW5kZXgEGGhlaWdodAQkZXh0X2luZGV4BCBhbm5vdW5jZQEACBByZWFs1QMkY2FsbF9oYXNoIExyZW1vdmVfYW5ub3VuY2VtZW50AQAIEHJlYWzVAyRjYWxsX2hhc2ggTHJlamVjdF9hbm5vdW5jZW1lbnQBAAggZGVsZWdhdGXVAyRjYWxsX2hhc2ggPHByb3h5X2Fubm91bmNlZAEAECBkZWxlZ2F0ZdUDEHJlYWzVA0Bmb3JjZV9wcm94eV90eXBlERAQY2FsbNEQMHBva2VfZGVwb3NpdAEBBQIUUGFzX211bHRpX3RocmVzaG9sZF8xAQAIRG90aGVyX3NpZ25hdG9yaWVz3QMQY2FsbNEQIGFzX211bHRpAQAUJHRocmVzaG9sZAREb3RoZXJfc2lnbmF0b3JpZXPdAzxtYXliZV90aW1lcG9pbnSNBBBjYWxs0RAobWF4X3dlaWdodBhAYXBwcm92ZV9hc19tdWx0aQEAFCR0aHJlc2hvbGQERG90aGVyX3NpZ25hdG9yaWVz3QM8bWF5YmVfdGltZXBvaW50jQQkY2FsbF9oYXNoIChtYXhfd2VpZ2h0GDxjYW5jZWxfYXNfbXVsdGkBABAkdGhyZXNob2xkBERvdGhlcl9zaWduYXRvcmllc90DJHRpbWVwb2ludPEBJGNhbGxfaGFzaCAwcG9rZV9kZXBvc2l0AQAMJHRocmVzaG9sZAREb3RoZXJfc2lnbmF0b3JpZXPdAyRjYWxsX2hhc2ggAhQ8c3VibWl0X3Vuc2lnbmVkAQAIMHJhd19zb2x1dGlvblkFHHdpdG5lc3NdBWxzZXRfbWluaW11bV91bnRydXN0ZWRfc2NvcmUBAARAbWF5YmVfbmV4dF9zY29yZWEFdHNldF9lbWVyZ2VuY3lfZWxlY3Rpb25fcmVzdWx0AQAEIHN1cHBvcnRzdQUYc3VibWl0AQAEMHJhd19zb2x1dGlvblkFTGdvdmVybmFuY2VfZmFsbGJhY2sBAQUCJBhzdWJtaXQBAAw8cHJvcG9zYWxfb3JpZ2ludQ8gcHJvcG9zYWylAUBlbmFjdG1lbnRfbW9tZW50QQRYcGxhY2VfZGVjaXNpb25fZGVwb3NpdAEABBRpbmRleARccmVmdW5kX2RlY2lzaW9uX2RlcG9zaXQBAAQUaW5kZXgEGGNhbmNlbAEABBRpbmRleAQQa2lsbAEABBRpbmRleARAbnVkZ2VfcmVmZXJlbmR1bQEABBRpbmRleARIb25lX2Zld2VyX2RlY2lkaW5nAQAEFHRyYWNrBGRyZWZ1bmRfc3VibWlzc2lvbl9kZXBvc2l0AQAEFGluZGV4BDBzZXRfbWV0YWRhdGEBAAgUaW5kZXgEKG1heWJlX2hhc2gRAQIQOHdoaXRlbGlzdF9jYWxsAQAEJGNhbGxfaGFzaCBccmVtb3ZlX3doaXRlbGlzdGVkX2NhbGwBAAQkY2FsbF9oYXNoIGRkaXNwYXRjaF93aGl0ZWxpc3RlZF9jYWxsAQAMJGNhbGxfaGFzaCBAY2FsbF9lbmNvZGVkX2xlbgRMY2FsbF93ZWlnaHRfd2l0bmVzcxicZGlzcGF0Y2hfd2hpdGVsaXN0ZWRfY2FsbF93aXRoX3ByZWltYWdlAQAEEGNhbGzREAIYLHNwZW5kX2xvY2FsAQAIGGFtb3VudAgsYmVuZWZpY2lhcnnVAzxyZW1vdmVfYXBwcm92YWwBAAQscHJvcG9zYWxfaWQEFHNwZW5kAQAQKGFzc2V0X2tpbmSNDhhhbW91bnQILGJlbmVmaWNpYXJ5kQ4odmFsaWRfZnJvbS0EGHBheW91dAEABBRpbmRleAQwY2hlY2tfc3RhdHVzAQAEFGluZGV4BCh2b2lkX3NwZW5kAQAEFGluZGV4BAK4fHNldF92YWxpZGF0aW9uX3VwZ3JhZGVfY29vbGRvd24BAAQMbmV3BHBzZXRfdmFsaWRhdGlvbl91cGdyYWRlX2RlbGF5AQAEDG5ldwRkc2V0X2NvZGVfcmV0ZW50aW9uX3BlcmlvZAEABAxuZXcERHNldF9tYXhfY29kZV9zaXplAQAEDG5ldwRAc2V0X21heF9wb3Zfc2l6ZQEABAxuZXcEWHNldF9tYXhfaGVhZF9kYXRhX3NpemUBAAQMbmV3BEhzZXRfY29yZXRpbWVfY29yZXMBAAQMbmV3BHBzZXRfZ3JvdXBfcm90YXRpb25fZnJlcXVlbmN5AQAEDG5ldwR0c2V0X3BhcmFzX2F2YWlsYWJpbGl0eV9wZXJpb2QBAAQMbmV3BGBzZXRfc2NoZWR1bGluZ19sb29rYWhlYWQBAAQMbmV3BGxzZXRfbWF4X3ZhbGlkYXRvcnNfcGVyX2NvcmUBAAQMbmV3LQRIc2V0X21heF92YWxpZGF0b3JzAQAEDG5ldy0ESHNldF9kaXNwdXRlX3BlcmlvZAEABAxuZXcEtHNldF9kaXNwdXRlX3Bvc3RfY29uY2x1c2lvbl9hY2NlcHRhbmNlX3BlcmlvZAEABAxuZXcERHNldF9ub19zaG93X3Nsb3RzAQAEDG5ldwRQc2V0X25fZGVsYXlfdHJhbmNoZXMBAAQMbmV3BHhzZXRfemVyb3RoX2RlbGF5X3RyYW5jaGVfd2lkdGgBAAQMbmV3BFBzZXRfbmVlZGVkX2FwcHJvdmFscwEABAxuZXcEcHNldF9yZWxheV92cmZfbW9kdWxvX3NhbXBsZXMBAAQMbmV3BGhzZXRfbWF4X3Vwd2FyZF9xdWV1ZV9jb3VudAEABAxuZXcEZHNldF9tYXhfdXB3YXJkX3F1ZXVlX3NpemUBAAQMbmV3BHRzZXRfbWF4X2Rvd253YXJkX21lc3NhZ2Vfc2l6ZQEABAxuZXcEbHNldF9tYXhfdXB3YXJkX21lc3NhZ2Vfc2l6ZQEABAxuZXcEoHNldF9tYXhfdXB3YXJkX21lc3NhZ2VfbnVtX3Blcl9jYW5kaWRhdGUBAAQMbmV3BGRzZXRfaHJtcF9vcGVuX3JlcXVlc3RfdHRsAQAEDG5ldwRcc2V0X2hybXBfc2VuZGVyX2RlcG9zaXQBAAQMbmV3CGhzZXRfaHJtcF9yZWNpcGllbnRfZGVwb3NpdAEABAxuZXcIdHNldF9ocm1wX2NoYW5uZWxfbWF4X2NhcGFjaXR5AQAEDG5ldwR8c2V0X2hybXBfY2hhbm5lbF9tYXhfdG90YWxfc2l6ZQEABAxuZXcEnHNldF9ocm1wX21heF9wYXJhY2hhaW5faW5ib3VuZF9jaGFubmVscwEABAxuZXcEhHNldF9ocm1wX2NoYW5uZWxfbWF4X21lc3NhZ2Vfc2l6ZQEABAxuZXcEoHNldF9ocm1wX21heF9wYXJhY2hhaW5fb3V0Ym91bmRfY2hhbm5lbHMBAAQMbmV3BJhzZXRfaHJtcF9tYXhfbWVzc2FnZV9udW1fcGVyX2NhbmRpZGF0ZQEABAxuZXcESHNldF9wdmZfdm90aW5nX3R0bAEABAxuZXcEkHNldF9taW5pbXVtX3ZhbGlkYXRpb25fdXBncmFkZV9kZWxheQEABAxuZXcEcHNldF9ieXBhc3NfY29uc2lzdGVuY3lfY2hlY2sBAAQMbmV3FGBzZXRfYXN5bmNfYmFja2luZ19wYXJhbXMBAAQMbmV3lQVMc2V0X2V4ZWN1dG9yX3BhcmFtcwEABAxuZXelBVhzZXRfb25fZGVtYW5kX2Jhc2VfZmVlAQAEDG5ldwh0c2V0X29uX2RlbWFuZF9mZWVfdmFyaWFiaWxpdHkBAAQMbmV3BHBzZXRfb25fZGVtYW5kX3F1ZXVlX21heF9zaXplAQAEDG5ldwSYc2V0X29uX2RlbWFuZF90YXJnZXRfcXVldWVfdXRpbGl6YXRpb24BAAQMbmV3BGRzZXRfbWluaW11bV9iYWNraW5nX3ZvdGVzAQAEDG5ldwRAc2V0X25vZGVfZmVhdHVyZQEACBRpbmRleAQUdmFsdWUUaHNldF9hcHByb3ZhbF92b3RpbmdfcGFyYW1zAQAEDG5ldwRQc2V0X3NjaGVkdWxlcl9wYXJhbXMBAAQMbmV3qQUACChkZXNjcmlwdG9yoQ4sY29tbWl0bWVudHPJBQAMJGNhbmRpZGF0ZTEQOHZhbGlkaXR5X3ZvdGVz1QVEdmFsaWRhdG9yX2luZGljZXOxBQQ1EAAAECRiaXRmaWVsZHO5BURiYWNrZWRfY2FuZGlkYXRlczkQIGRpc3B1dGVz+QU0cGFyZW50X2hlYWRlcrUDAgQUZW50ZXIBAAQQZGF0YT0QAjBYZm9yY2Vfc2V0X2N1cnJlbnRfY29kZQEACBBwYXJhBCBuZXdfY29kZSRYZm9yY2Vfc2V0X2N1cnJlbnRfaGVhZAEACBBwYXJhBCBuZXdfaGVhZCRsZm9yY2Vfc2NoZWR1bGVfY29kZV91cGdyYWRlAQAMEHBhcmEEIG5ld19jb2RlJExyZWxheV9wYXJlbnRfbnVtYmVyBExmb3JjZV9ub3RlX25ld19oZWFkAQAIEHBhcmEEIG5ld19oZWFkJEhmb3JjZV9xdWV1ZV9hY3Rpb24BAAQQcGFyYQRsYWRkX3RydXN0ZWRfdmFsaWRhdGlvbl9jb2RlAQAEPHZhbGlkYXRpb25fY29kZSRscG9rZV91bnVzZWRfdmFsaWRhdGlvbl9jb2RlAQAEUHZhbGlkYXRpb25fY29kZV9oYXNoIGxpbmNsdWRlX3B2Zl9jaGVja19zdGF0ZW1lbnQBAAgQc3RtdAUGJHNpZ25hdHVyZUECdGZvcmNlX3NldF9tb3N0X3JlY2VudF9jb250ZXh0AQAIEHBhcmEEHGNvbnRleHQEXHJlbW92ZV91cGdyYWRlX2Nvb2xkb3duAQAEEHBhcmEElGF1dGhvcml6ZV9mb3JjZV9zZXRfY3VycmVudF9jb2RlX2hhc2gBAAwQcGFyYQQ0bmV3X2NvZGVfaGFzaCAwdmFsaWRfcGVyaW9kBJxhcHBseV9hdXRob3JpemVkX2ZvcmNlX3NldF9jdXJyZW50X2NvZGUBAAgQcGFyYQQgbmV3X2NvZGUkAgxARm9ySW52YWxpZEJhY2tlZAEBBTBBZ2FpbnN0VmFsaWQBAQVIRm9ySW52YWxpZEFwcHJvdmVkAQEFABAkdGltZV9zbG90GQYQa2luZEkQPHZhbGlkYXRvcl9pbmRleAQwdmFsaWRhdG9yX2lkIAIEcHJlcG9ydF9kaXNwdXRlX2xvc3RfdW5zaWduZWQBAAg0ZGlzcHV0ZV9wcm9vZk0QPGtleV9vd25lcl9wcm9vZr0DAgxccGxhY2Vfb3JkZXJfYWxsb3dfZGVhdGgBAAgobWF4X2Ftb3VudAgccGFyYV9pZARYcGxhY2Vfb3JkZXJfa2VlcF9hbGl2ZQEACChtYXhfYW1vdW50CBxwYXJhX2lkBGBwbGFjZV9vcmRlcl93aXRoX2NyZWRpdHMBAAgobWF4X2Ftb3VudAgccGFyYV9pZAQCDAhWMwEEoQYACFY0AQT1AgAIVjUBBBEPAAIYdHN1ZG9fc2NoZWR1bGVfcGFyYV9pbml0aWFsaXplAQAICGlkBBxnZW5lc2lzFQloc3Vkb19zY2hlZHVsZV9wYXJhX2NsZWFudXABAAQIaWQEgHN1ZG9fc2NoZWR1bGVfcGFyYXRocmVhZF91cGdyYWRlAQAECGlkBIRzdWRvX3NjaGVkdWxlX3BhcmFjaGFpbl9kb3duZ3JhZGUBAAQIaWQEXHN1ZG9fcXVldWVfZG93bndhcmRfeGNtAQAICGlkBAx4Y21ZEGxzdWRvX2VzdGFibGlzaF9ocm1wX2NoYW5uZWwBABAYc2VuZGVyBCRyZWNpcGllbnQEMG1heF9jYXBhY2l0eQRAbWF4X21lc3NhZ2Vfc2l6ZQQCCBxDdXJyZW50AQEFEE5leHQBAQUCFGhhc3NpZ25fcGVybV9wYXJhY2hhaW5fc2xvdAEABAhpZARoYXNzaWduX3RlbXBfcGFyYWNoYWluX3Nsb3QBAAgIaWQESGxlYXNlX3BlcmlvZF9zdGFydGEQXHVuYXNzaWduX3BhcmFjaGFpbl9zbG90AQAECGlkBFxzZXRfbWF4X3Blcm1hbmVudF9zbG90cwEABBRzbG90cwRcc2V0X21heF90ZW1wb3Jhcnlfc2xvdHMBAAQUc2xvdHMEAhBIcmVxdWVzdF9jb3JlX2NvdW50AQAEFGNvdW50BEhyZXF1ZXN0X3JldmVudWVfYXQBAAQQd2hlbgQ4Y3JlZGl0X2FjY291bnQBAAgMd2hvABhhbW91bnQILGFzc2lnbl9jb3JlAQAQEGNvcmUEFGJlZ2luBChhc3NpZ25tZW50VQYgZW5kX2hpbnQtBAAQRG5ld192YWxpZGF0b3Jfc2V03QMIaWQELHBydW5lX3VwX3RvLQQgbGVmdG92ZXIUAgwcUGFzc2l2ZQEBBSBCdWZmZXJlZAEBBRhBY3RpdmUBAQUCDDR2YWxpZGF0b3Jfc2V0AQAEGHJlcG9ydG0QIHNldF9tb2RlAQAEEG1vZGVxEFhmb3JjZV9vbl9taWdyYXRpb25fZW5kAQEFAAwUaW5kZXgEMGlubmVyX2N1cnNvcsUFKHN0YXJ0ZWRfYXQEAggYQWN0aXZlAQAMFGluZGV4BDBpbm5lcl9jdXJzb3LFBShzdGFydGVkX2F0BBRTdHVjawEBBQZ9EAIIIFNwZWNpZmljAQQkACBXaWxkY2FyZAEACBRsaW1pdC0EPHByZXZpb3VzX2N1cnNvcsUFAhBAZm9yY2Vfc2V0X2N1cnNvcgEABBhjdXJzb3KBEFxmb3JjZV9zZXRfYWN0aXZlX2N1cnNvcgEADBRpbmRleAQwaW5uZXJfY3Vyc29yxQUoc3RhcnRlZF9hdC0ESGZvcmNlX29uYm9hcmRfbWJtcwEBBThjbGVhcl9oaXN0b3JpYwEABCBzZWxlY3RvcoUQAhAgVGVsZXBvcnQBAQUwTG9jYWxSZXNlcnZlAQEFSERlc3RpbmF0aW9uUmVzZXJ2ZQEBBTRSZW1vdGVSZXNlcnZlAQIMCFYzAQAIHHBhcmVudHMEIGludGVyaW9ydQEIVjQBAAgccGFyZW50cwQgaW50ZXJpb3J1AQhWNQEACBxwYXJlbnRzBCBpbnRlcmlvcoUOAgwIVjMBAgggQ29uY3JldGUBAAgccGFyZW50cwQgaW50ZXJpb3J1ASBBYnN0cmFjdAEFAYAIVjQBAAgccGFyZW50cwQgaW50ZXJpb3J1AQhWNQEACBxwYXJlbnRzBCBpbnRlcmlvcoUOAkQQc2VuZAEACBBkZXN0kQ4cbWVzc2FnZVkQPHRlbGVwb3J0X2Fzc2V0cwEAEBBkZXN0kQ4sYmVuZWZpY2lhcnmRDhhhc3NldHMdDzhmZWVfYXNzZXRfaXRlbQRccmVzZXJ2ZV90cmFuc2Zlcl9hc3NldHMBABAQZGVzdJEOLGJlbmVmaWNpYXJ5kQ4YYXNzZXRzHQ84ZmVlX2Fzc2V0X2l0ZW0EHGV4ZWN1dGUBAAgcbWVzc2FnZVkQKG1heF93ZWlnaHQYRGZvcmNlX3hjbV92ZXJzaW9uAQAIIGxvY2F0aW9uiQ4cdmVyc2lvbgRkZm9yY2VfZGVmYXVsdF94Y21fdmVyc2lvbgEABERtYXliZV94Y21fdmVyc2lvbi0EeGZvcmNlX3N1YnNjcmliZV92ZXJzaW9uX25vdGlmeQEABCBsb2NhdGlvbpEOgGZvcmNlX3Vuc3Vic2NyaWJlX3ZlcnNpb25fbm90aWZ5AQAEIGxvY2F0aW9ukQ58bGltaXRlZF9yZXNlcnZlX3RyYW5zZmVyX2Fzc2V0cwEAFBBkZXN0kQ4sYmVuZWZpY2lhcnmRDhhhc3NldHMdDzhmZWVfYXNzZXRfaXRlbQQwd2VpZ2h0X2xpbWl08QJcbGltaXRlZF90ZWxlcG9ydF9hc3NldHMBABQQZGVzdJEOLGJlbmVmaWNpYXJ5kQ4YYXNzZXRzHQ84ZmVlX2Fzc2V0X2l0ZW0EMHdlaWdodF9saW1pdPECQGZvcmNlX3N1c3BlbnNpb24BAAQkc3VzcGVuZGVkFDx0cmFuc2Zlcl9hc3NldHMBABQQZGVzdJEOLGJlbmVmaWNpYXJ5kQ4YYXNzZXRzHQ84ZmVlX2Fzc2V0X2l0ZW0EMHdlaWdodF9saW1pdPECMGNsYWltX2Fzc2V0cwEACBhhc3NldHMdDyxiZW5lZmljaWFyeZEOjHRyYW5zZmVyX2Fzc2V0c191c2luZ190eXBlX2FuZF90aGVuAQAcEGRlc3SRDhhhc3NldHMdD1Bhc3NldHNfdHJhbnNmZXJfdHlwZY0QOHJlbW90ZV9mZWVzX2lkkRBIZmVlc190cmFuc2Zlcl90eXBljRBIY3VzdG9tX3hjbV9vbl9kZXN0WRAwd2VpZ2h0X2xpbWl08QJQYWRkX2F1dGhvcml6ZWRfYWxpYXMBAAgcYWxpYXNlcpEOHGV4cGlyZXP1A1xyZW1vdmVfYXV0aG9yaXplZF9hbGlhcwEABBxhbGlhc2VykQ50cmVtb3ZlX2FsbF9hdXRob3JpemVkX2FsaWFzZXMBAQUCDBhjcmVhdGUBAAgoYXNzZXRfa2luZI0OEHJhdGUIGHVwZGF0ZQEACChhc3NldF9raW5kjQ4QcmF0ZQgYcmVtb3ZlAQAEKGFzc2V0X2tpbmSNDgIIKGZpbGxfYmxvY2sBAAQUcmF0aW8ERHRyaWdnZXJfZGVmZW5zaXZlAQEFAggYU2lnbmVkAQAIJHNpZ25hdHVyZUEGHGFjY291bnQAIERpc2FibGVkAQEFAgEEIEltbW9ydGFsAQEFHE1vcnRhbDEBAQIcTW9ydGFsMgEBAhxNb3J0YWwzAQECHE1vcnRhbDQBAQIcTW9ydGFsNQEBAhxNb3J0YWw2AQECHE1vcnRhbDcBAQIcTW9ydGFsOAEBAhxNb3J0YWw5AQECIE1vcnRhbDEwAQECIE1vcnRhbDExAQECIE1vcnRhbDEyAQECIE1vcnRhbDEzAQECIE1vcnRhbDE0AQECIE1vcnRhbDE1AQECIE1vcnRhbDE2AQECIE1vcnRhbDE3AQECIE1vcnRhbDE4AQECIE1vcnRhbDE5AQECIE1vcnRhbDIwAQECIE1vcnRhbDIxAQECIE1vcnRhbDIyAQECIE1vcnRhbDIzAQECIE1vcnRhbDI0AQECIE1vcnRhbDI1AQECIE1vcnRhbDI2AQECIE1vcnRhbDI3AQECIE1vcnRhbDI4AQECIE1vcnRhbDI5AQECIE1vcnRhbDMwAQECIE1vcnRhbDMxAQECIE1vcnRhbDMyAQECIE1vcnRhbDMzAQECIE1vcnRhbDM0AQECIE1vcnRhbDM1AQECIE1vcnRhbDM2AQECIE1vcnRhbDM3AQECIE1vcnRhbDM4AQECIE1vcnRhbDM5AQECIE1vcnRhbDQwAQECIE1vcnRhbDQxAQECIE1vcnRhbDQyAQECIE1vcnRhbDQzAQECIE1vcnRhbDQ0AQECIE1vcnRhbDQ1AQECIE1vcnRhbDQ2AQECIE1vcnRhbDQ3AQECIE1vcnRhbDQ4AQECIE1vcnRhbDQ5AQECIE1vcnRhbDUwAQECIE1vcnRhbDUxAQECIE1vcnRhbDUyAQECIE1vcnRhbDUzAQECIE1vcnRhbDU0AQECIE1vcnRhbDU1AQECIE1vcnRhbDU2AQECIE1vcnRhbDU3AQECIE1vcnRhbDU4AQECIE1vcnRhbDU5AQECIE1vcnRhbDYwAQECIE1vcnRhbDYxAQECIE1vcnRhbDYyAQECIE1vcnRhbDYzAQECIE1vcnRhbDY0AQECIE1vcnRhbDY1AQECIE1vcnRhbDY2AQECIE1vcnRhbDY3AQECIE1vcnRhbDY4AQECIE1vcnRhbDY5AQECIE1vcnRhbDcwAQECIE1vcnRhbDcxAQECIE1vcnRhbDcyAQECIE1vcnRhbDczAQECIE1vcnRhbDc0AQECIE1vcnRhbDc1AQECIE1vcnRhbDc2AQECIE1vcnRhbDc3AQECIE1vcnRhbDc4AQECIE1vcnRhbDc5AQECIE1vcnRhbDgwAQECIE1vcnRhbDgxAQECIE1vcnRhbDgyAQECIE1vcnRhbDgzAQECIE1vcnRhbDg0AQECIE1vcnRhbDg1AQECIE1vcnRhbDg2AQECIE1vcnRhbDg3AQECIE1vcnRhbDg4AQECIE1vcnRhbDg5AQECIE1vcnRhbDkwAQECIE1vcnRhbDkxAQECIE1vcnRhbDkyAQECIE1vcnRhbDkzAQECIE1vcnRhbDk0AQECIE1vcnRhbDk1AQECIE1vcnRhbDk2AQECIE1vcnRhbDk3AQECIE1vcnRhbDk4AQECIE1vcnRhbDk5AQECJE1vcnRhbDEwMAEBAiRNb3J0YWwxMDEBAQIkTW9ydGFsMTAyAQECJE1vcnRhbDEwMwEBAiRNb3J0YWwxMDQBAQIkTW9ydGFsMTA1AQECJE1vcnRhbDEwNgEBAiRNb3J0YWwxMDcBAQIkTW9ydGFsMTA4AQECJE1vcnRhbDEwOQEBAiRNb3J0YWwxMTABAQIkTW9ydGFsMTExAQECJE1vcnRhbDExMgEBAiRNb3J0YWwxMTMBAQIkTW9ydGFsMTE0AQECJE1vcnRhbDExNQEBAiRNb3J0YWwxMTYBAQIkTW9ydGFsMTE3AQECJE1vcnRhbDExOAEBAiRNb3J0YWwxMTkBAQIkTW9ydGFsMTIwAQECJE1vcnRhbDEyMQEBAiRNb3J0YWwxMjIBAQIkTW9ydGFsMTIzAQECJE1vcnRhbDEyNAEBAiRNb3J0YWwxMjUBAQIkTW9ydGFsMTI2AQECJE1vcnRhbDEyNwEBAiRNb3J0YWwxMjgBAQIkTW9ydGFsMTI5AQECJE1vcnRhbDEzMAEBAiRNb3J0YWwxMzEBAQIkTW9ydGFsMTMyAQECJE1vcnRhbDEzMwEBAiRNb3J0YWwxMzQBAQIkTW9ydGFsMTM1AQECJE1vcnRhbDEzNgEBAiRNb3J0YWwxMzcBAQIkTW9ydGFsMTM4AQECJE1vcnRhbDEzOQEBAiRNb3J0YWwxNDABAQIkTW9ydGFsMTQxAQECJE1vcnRhbDE0MgEBAiRNb3J0YWwxNDMBAQIkTW9ydGFsMTQ0AQECJE1vcnRhbDE0NQEBAiRNb3J0YWwxNDYBAQIkTW9ydGFsMTQ3AQECJE1vcnRhbDE0OAEBAiRNb3J0YWwxNDkBAQIkTW9ydGFsMTUwAQECJE1vcnRhbDE1MQEBAiRNb3J0YWwxNTIBAQIkTW9ydGFsMTUzAQECJE1vcnRhbDE1NAEBAiRNb3J0YWwxNTUBAQIkTW9ydGFsMTU2AQECJE1vcnRhbDE1NwEBAiRNb3J0YWwxNTgBAQIkTW9ydGFsMTU5AQECJE1vcnRhbDE2MAEBAiRNb3J0YWwxNjEBAQIkTW9ydGFsMTYyAQECJE1vcnRhbDE2MwEBAiRNb3J0YWwxNjQBAQIkTW9ydGFsMTY1AQECJE1vcnRhbDE2NgEBAiRNb3J0YWwxNjcBAQIkTW9ydGFsMTY4AQECJE1vcnRhbDE2OQEBAiRNb3J0YWwxNzABAQIkTW9ydGFsMTcxAQECJE1vcnRhbDE3MgEBAiRNb3J0YWwxNzMBAQIkTW9ydGFsMTc0AQECJE1vcnRhbDE3NQEBAiRNb3J0YWwxNzYBAQIkTW9ydGFsMTc3AQECJE1vcnRhbDE3OAEBAiRNb3J0YWwxNzkBAQIkTW9ydGFsMTgwAQECJE1vcnRhbDE4MQEBAiRNb3J0YWwxODIBAQIkTW9ydGFsMTgzAQECJE1vcnRhbDE4NAEBAiRNb3J0YWwxODUBAQIkTW9ydGFsMTg2AQECJE1vcnRhbDE4NwEBAiRNb3J0YWwxODgBAQIkTW9ydGFsMTg5AQECJE1vcnRhbDE5MAEBAiRNb3J0YWwxOTEBAQIkTW9ydGFsMTkyAQECJE1vcnRhbDE5MwEBAiRNb3J0YWwxOTQBAQIkTW9ydGFsMTk1AQECJE1vcnRhbDE5NgEBAiRNb3J0YWwxOTcBAQIkTW9ydGFsMTk4AQECJE1vcnRhbDE5OQEBAiRNb3J0YWwyMDABAQIkTW9ydGFsMjAxAQECJE1vcnRhbDIwMgEBAiRNb3J0YWwyMDMBAQIkTW9ydGFsMjA0AQECJE1vcnRhbDIwNQEBAiRNb3J0YWwyMDYBAQIkTW9ydGFsMjA3AQECJE1vcnRhbDIwOAEBAiRNb3J0YWwyMDkBAQIkTW9ydGFsMjEwAQECJE1vcnRhbDIxMQEBAiRNb3J0YWwyMTIBAQIkTW9ydGFsMjEzAQECJE1vcnRhbDIxNAEBAiRNb3J0YWwyMTUBAQIkTW9ydGFsMjE2AQECJE1vcnRhbDIxNwEBAiRNb3J0YWwyMTgBAQIkTW9ydGFsMjE5AQECJE1vcnRhbDIyMAEBAiRNb3J0YWwyMjEBAQIkTW9ydGFsMjIyAQECJE1vcnRhbDIyMwEBAiRNb3J0YWwyMjQBAQIkTW9ydGFsMjI1AQECJE1vcnRhbDIyNgEBAiRNb3J0YWwyMjcBAQIkTW9ydGFsMjI4AQECJE1vcnRhbDIyOQEBAiRNb3J0YWwyMzABAQIkTW9ydGFsMjMxAQECJE1vcnRhbDIzMgEBAiRNb3J0YWwyMzMBAQIkTW9ydGFsMjM0AQECJE1vcnRhbDIzNQEBAiRNb3J0YWwyMzYBAQIkTW9ydGFsMjM3AQECJE1vcnRhbDIzOAEBAiRNb3J0YWwyMzkBAQIkTW9ydGFsMjQwAQECJE1vcnRhbDI0MQEBAiRNb3J0YWwyNDIBAQIkTW9ydGFsMjQzAQECJE1vcnRhbDI0NAEBAiRNb3J0YWwyNDUBAQIkTW9ydGFsMjQ2AQECJE1vcnRhbDI0NwEBAiRNb3J0YWwyNDgBAQIkTW9ydGFsMjQ5AQECJE1vcnRhbDI1MAEBAiRNb3J0YWwyNTEBAQIkTW9ydGFsMjUyAQECJE1vcnRhbDI1MwEBAiRNb3J0YWwyNTQBAQIkTW9ydGFsMjU1AQECAgggRGlzYWJsZWQBAQUcRW5hYmxlZAEBBQMkoRAVARUBFQEVARUBpRAEqRAADBBjYWxs0RBEZXh0ZW5zaW9uX3ZlcnNpb24EJGV4dGVuc2lvbq0QAgQgZGlzcGF0Y2gBAAQcbWV0YV90eLEQAwgIIAS5EAAAEChwcmV2X3BlYWtzOQM8cHJldl9sZWFmX2NvdW50CChsZWFmX2NvdW50CBRpdGVtc70QAAwQdm90ZdEGOGFuY2VzdHJ5X3Byb29mwRAYaGVhZGVytQMCHFByZXBvcnRfZG91YmxlX3ZvdGluZwEACEhlcXVpdm9jYXRpb25fcHJvb2bVBjxrZXlfb3duZXJfcHJvb2a9A3RyZXBvcnRfZG91YmxlX3ZvdGluZ191bnNpZ25lZAEACEhlcXVpdm9jYXRpb25fcHJvb2bVBjxrZXlfb3duZXJfcHJvb2a9AzxzZXRfbmV3X2dlbmVzaXMBAAQ8ZGVsYXlfaW5fYmxvY2tzBEhyZXBvcnRfZm9ya192b3RpbmcBAAhIZXF1aXZvY2F0aW9uX3Byb29mxRA8a2V5X293bmVyX3Byb29mvQNscmVwb3J0X2Zvcmtfdm90aW5nX3Vuc2lnbmVkAQAISGVxdWl2b2NhdGlvbl9wcm9vZsUQPGtleV9vd25lcl9wcm9vZr0DaHJlcG9ydF9mdXR1cmVfYmxvY2tfdm90aW5nAQAISGVxdWl2b2NhdGlvbl9wcm9vZtEGPGtleV9vd25lcl9wcm9vZr0DjHJlcG9ydF9mdXR1cmVfYmxvY2tfdm90aW5nX3Vuc2lnbmVkAQAISGVxdWl2b2NhdGlvbl9wcm9vZtEGPGtleV9vd25lcl9wcm9vZr0DAgg0cmVhcF9pZGVudGl0eQEABAx3aG8AMHBva2VfZGVwb3NpdAEABAx3aG8AAtAYU3lzdGVtAQIsGHJlbWFyawEABBhyZW1hcmskOHNldF9oZWFwX3BhZ2VzAQAEFHBhZ2VzCCBzZXRfY29kZQEABBBjb2RlJFxzZXRfY29kZV93aXRob3V0X2NoZWNrcwEABBBjb2RlJCxzZXRfc3RvcmFnZQEABBRpdGVtc3kDMGtpbGxfc3RvcmFnZQEABBBrZXlzfQMsa2lsbF9wcmVmaXgBAAgYcHJlZml4JBxzdWJrZXlzBERyZW1hcmtfd2l0aF9ldmVudAEABBhyZW1hcmskRGF1dGhvcml6ZV91cGdyYWRlAQAEJGNvZGVfaGFzaCCAYXV0aG9yaXplX3VwZ3JhZGVfd2l0aG91dF9jaGVja3MBAAQkY29kZV9oYXNoIGBhcHBseV9hdXRob3JpemVkX3VwZ3JhZGUBAAQQY29kZSQQQmFiZQECDExyZXBvcnRfZXF1aXZvY2F0aW9uAQAISGVxdWl2b2NhdGlvbl9wcm9vZrkDPGtleV9vd25lcl9wcm9vZr0DcHJlcG9ydF9lcXVpdm9jYXRpb25fdW5zaWduZWQBAAhIZXF1aXZvY2F0aW9uX3Byb29muQM8a2V5X293bmVyX3Byb29mvQNIcGxhbl9jb25maWdfY2hhbmdlAQAEGGNvbmZpZ8kDJFRpbWVzdGFtcAECBAxzZXQBAAQMbm93CBxJbmRpY2VzAQIYFGNsYWltAQAEFGluZGV4BCB0cmFuc2ZlcgEACAxuZXfVAxRpbmRleAQQZnJlZQEABBRpbmRleAQ4Zm9yY2VfdHJhbnNmZXIBAAwMbmV31QMUaW5kZXgEGGZyZWV6ZRQYZnJlZXplAQAEFGluZGV4BDBwb2tlX2RlcG9zaXQBAAQUaW5kZXgEIEJhbGFuY2VzAQIkUHRyYW5zZmVyX2FsbG93X2RlYXRoAQAIEGRlc3TVAxR2YWx1ZQg4Zm9yY2VfdHJhbnNmZXIBAAwYc291cmNl1QMQZGVzdNUDFHZhbHVlCEx0cmFuc2Zlcl9rZWVwX2FsaXZlAQAIEGRlc3TVAxR2YWx1ZQgwdHJhbnNmZXJfYWxsAQAIEGRlc3TVAyhrZWVwX2FsaXZlFDxmb3JjZV91bnJlc2VydmUBAAgMd2hv1QMYYW1vdW50CEB1cGdyYWRlX2FjY291bnRzAQAEDHdob90DRGZvcmNlX3NldF9iYWxhbmNlAQAIDHdob9UDIG5ld19mcmVlCGxmb3JjZV9hZGp1c3RfdG90YWxfaXNzdWFuY2UBAAgkZGlyZWN0aW9u4QMUZGVsdGEIEGJ1cm4BAAgUdmFsdWUIKGtlZXBfYWxpdmUUHFN0YWtpbmcBAoAQYm9uZAEACBR2YWx1ZQgUcGF5ZWU1AShib25kX2V4dHJhAQAEOG1heF9hZGRpdGlvbmFsCBh1bmJvbmQBAAQUdmFsdWUIRHdpdGhkcmF3X3VuYm9uZGVkAQAESG51bV9zbGFzaGluZ19zcGFucwQgdmFsaWRhdGUBAAQUcHJlZnM5ASBub21pbmF0ZQEABBx0YXJnZXRz6QMUY2hpbGwBAQUkc2V0X3BheWVlAQAEFHBheWVlNQE4c2V0X2NvbnRyb2xsZXIBAQVMc2V0X3ZhbGlkYXRvcl9jb3VudAEABAxuZXcEYGluY3JlYXNlX3ZhbGlkYXRvcl9jb3VudAEABChhZGRpdGlvbmFsBFRzY2FsZV92YWxpZGF0b3JfY291bnQBAAQYZmFjdG9yBDRmb3JjZV9ub19lcmFzAQEFNGZvcmNlX25ld19lcmEBAQVEc2V0X2ludnVsbmVyYWJsZXMBAAQ0aW52dWxuZXJhYmxlc90DNGZvcmNlX3Vuc3Rha2UBAAgUc3Rhc2gASG51bV9zbGFzaGluZ19zcGFucwRQZm9yY2VfbmV3X2VyYV9hbHdheXMBAQVUY2FuY2VsX2RlZmVycmVkX3NsYXNoAQAIDGVyYQQ0c2xhc2hfaW5kaWNlczkCOHBheW91dF9zdGFrZXJzAQAIPHZhbGlkYXRvcl9zdGFzaAAMZXJhBBhyZWJvbmQBAAQUdmFsdWUIKHJlYXBfc3Rhc2gBAAgUc3Rhc2gASG51bV9zbGFzaGluZ19zcGFucwQQa2ljawEABAx3aG/pA0xzZXRfc3Rha2luZ19jb25maWdzAQAcSG1pbl9ub21pbmF0b3JfYm9uZO0DSG1pbl92YWxpZGF0b3JfYm9uZO0DTG1heF9ub21pbmF0b3JfY291bnTxA0xtYXhfdmFsaWRhdG9yX2NvdW508QM8Y2hpbGxfdGhyZXNob2xk8QM4bWluX2NvbW1pc3Npb27xA0htYXhfc3Rha2VkX3Jld2FyZHPxAyxjaGlsbF9vdGhlcgEABBRzdGFzaABoZm9yY2VfYXBwbHlfbWluX2NvbW1pc3Npb24BAAQ8dmFsaWRhdG9yX3N0YXNoAEhzZXRfbWluX2NvbW1pc3Npb24BAAQMbmV3BFhwYXlvdXRfc3Rha2Vyc19ieV9wYWdlAQAMPHZhbGlkYXRvcl9zdGFzaAAMZXJhBBBwYWdlBDB1cGRhdGVfcGF5ZWUBAAQoY29udHJvbGxlcgBoZGVwcmVjYXRlX2NvbnRyb2xsZXJfYmF0Y2gBAAQsY29udHJvbGxlcnPdAzhyZXN0b3JlX2xlZGdlcgEAEBRzdGFzaABAbWF5YmVfY29udHJvbGxlcgUCLG1heWJlX3RvdGFs9QM8bWF5YmVfdW5sb2NraW5nAQRAbWlncmF0ZV9jdXJyZW5jeQEABBRzdGFzaAAwbWFudWFsX3NsYXNoAQAMPHZhbGlkYXRvcl9zdGFzaAAMZXJhBDhzbGFzaF9mcmFjdGlvbgQoUGFyYW1ldGVycwECBDRzZXRfcGFyYW1ldGVyAQAEJGtleV92YWx1ZVUEHFNlc3Npb24BAgggc2V0X2tleXMBAAgQa2V5cw0EFHByb29mJChwdXJnZV9rZXlzAQEFHEdyYW5kcGEBAgxMcmVwb3J0X2VxdWl2b2NhdGlvbgEACEhlcXVpdm9jYXRpb25fcHJvb2YlBDxrZXlfb3duZXJfcHJvb2a9A3ByZXBvcnRfZXF1aXZvY2F0aW9uX3Vuc2lnbmVkAQAISGVxdWl2b2NhdGlvbl9wcm9vZiUEPGtleV9vd25lcl9wcm9vZr0DMG5vdGVfc3RhbGxlZAEACBRkZWxheQRsYmVzdF9maW5hbGl6ZWRfYmxvY2tfbnVtYmVyBBxVdGlsaXR5AQIgFGJhdGNoAQAEFGNhbGxz1RA0YXNfZGVyaXZhdGl2ZQEACBRpbmRleAQQY2FsbNEQJGJhdGNoX2FsbAEABBRjYWxsc9UQLGRpc3BhdGNoX2FzAQAIJGFzX29yaWdpbnUPEGNhbGzRECxmb3JjZV9iYXRjaAEABBRjYWxsc9UQLHdpdGhfd2VpZ2h0AQAIEGNhbGzREBh3ZWlnaHQYHGlmX2Vsc2UBAAgQbWFpbtEQIGZhbGxiYWNr0RBQZGlzcGF0Y2hfYXNfZmFsbGlibGUBAAgkYXNfb3JpZ2ludQ8QY2FsbNEQIElkZW50aXR5AQJgNGFkZF9yZWdpc3RyYXIBAAQcYWNjb3VudNUDMHNldF9pZGVudGl0eQEABBBpbmZv7Q8gc2V0X3N1YnMBAAQQc3Vic/UPOGNsZWFyX2lkZW50aXR5AQEFRHJlcXVlc3RfanVkZ2VtZW50AQAIJHJlZ19pbmRleAQcbWF4X2ZlZQg4Y2FuY2VsX3JlcXVlc3QBAAQkcmVnX2luZGV4BBxzZXRfZmVlAQAIFGluZGV4BAxmZWUIOHNldF9hY2NvdW50X2lkAQAIFGluZGV4BAxuZXfVAyhzZXRfZmllbGRzAQAIFGluZGV4BBhmaWVsZHMIRHByb3ZpZGVfanVkZ2VtZW50AQAQJHJlZ19pbmRleAQYdGFyZ2V01QMkanVkZ2VtZW50+Q8gaWRlbnRpdHkgNGtpbGxfaWRlbnRpdHkBAAQYdGFyZ2V01QMcYWRkX3N1YgEACAxzdWLVAxBkYXRh3Q8ocmVuYW1lX3N1YgEACAxzdWLVAxBkYXRh3Q8ocmVtb3ZlX3N1YgEABAxzdWLVAyBxdWl0X3N1YgEBBVhhZGRfdXNlcm5hbWVfYXV0aG9yaXR5AQAMJGF1dGhvcml0edUDGHN1ZmZpeCQoYWxsb2NhdGlvbgRkcmVtb3ZlX3VzZXJuYW1lX2F1dGhvcml0eQEACBhzdWZmaXgkJGF1dGhvcml0edUDQHNldF91c2VybmFtZV9mb3IBABAMd2hv1QMgdXNlcm5hbWUkJHNpZ25hdHVyZUUGOHVzZV9hbGxvY2F0aW9uFDxhY2NlcHRfdXNlcm5hbWUBAAQgdXNlcm5hbWUkXHJlbW92ZV9leHBpcmVkX2FwcHJvdmFsAQAEIHVzZXJuYW1lJFBzZXRfcHJpbWFyeV91c2VybmFtZQEABCB1c2VybmFtZSQ8dW5iaW5kX3VzZXJuYW1lAQAEIHVzZXJuYW1lJDxyZW1vdmVfdXNlcm5hbWUBAAQgdXNlcm5hbWUkNGtpbGxfdXNlcm5hbWUBAAQgdXNlcm5hbWUkIFJlY292ZXJ5AQIoMGFzX3JlY292ZXJlZAEACBxhY2NvdW501QMQY2FsbNEQNHNldF9yZWNvdmVyZWQBAAgQbG9zdNUDHHJlc2N1ZXLVAzxjcmVhdGVfcmVjb3ZlcnkBAAwcZnJpZW5kc90DJHRocmVzaG9sZAQwZGVsYXlfcGVyaW9kBERpbml0aWF0ZV9yZWNvdmVyeQEABBxhY2NvdW501QM4dm91Y2hfcmVjb3ZlcnkBAAgQbG9zdNUDHHJlc2N1ZXLVAzhjbGFpbV9yZWNvdmVyeQEABBxhY2NvdW501QM4Y2xvc2VfcmVjb3ZlcnkBAAQccmVzY3VlctUDPHJlbW92ZV9yZWNvdmVyeQEBBUBjYW5jZWxfcmVjb3ZlcmVkAQAEHGFjY291bnTVAzBwb2tlX2RlcG9zaXQBAAQ0bWF5YmVfYWNjb3VudAEQHFZlc3RpbmcBAhgQdmVzdAEBBSh2ZXN0X290aGVyAQAEGHRhcmdldNUDPHZlc3RlZF90cmFuc2ZlcgEACBh0YXJnZXTVAyBzY2hlZHVsZXUEVGZvcmNlX3Zlc3RlZF90cmFuc2ZlcgEADBhzb3VyY2XVAxh0YXJnZXTVAyBzY2hlZHVsZXUEPG1lcmdlX3NjaGVkdWxlcwEACDxzY2hlZHVsZTFfaW5kZXgEPHNjaGVkdWxlMl9pbmRleAR0Zm9yY2VfcmVtb3ZlX3Zlc3Rpbmdfc2NoZWR1bGUBAAgYdGFyZ2V01QM4c2NoZWR1bGVfaW5kZXgEJFNjaGVkdWxlcgECKCBzY2hlZHVsZQEAEBB3aGVuBDhtYXliZV9wZXJpb2RpY4EDIHByaW9yaXR5BBBjYWxs0RAYY2FuY2VsAQAIEHdoZW4EFGluZGV4BDhzY2hlZHVsZV9uYW1lZAEAFAhpZCAQd2hlbgQ4bWF5YmVfcGVyaW9kaWOBAyBwcmlvcml0eQQQY2FsbNEQMGNhbmNlbF9uYW1lZAEABAhpZCA4c2NoZWR1bGVfYWZ0ZXIBABAUYWZ0ZXIEOG1heWJlX3BlcmlvZGljgQMgcHJpb3JpdHkEEGNhbGzREFBzY2hlZHVsZV9uYW1lZF9hZnRlcgEAFAhpZCAUYWZ0ZXIEOG1heWJlX3BlcmlvZGljgQMgcHJpb3JpdHkEEGNhbGzRECRzZXRfcmV0cnkBAAwQdGFzaw0BHHJldHJpZXMEGHBlcmlvZAQ8c2V0X3JldHJ5X25hbWVkAQAMCGlkIBxyZXRyaWVzBBhwZXJpb2QEMGNhbmNlbF9yZXRyeQEABBB0YXNrDQFIY2FuY2VsX3JldHJ5X25hbWVkAQAECGlkICBQcmVpbWFnZQECFDRub3RlX3ByZWltYWdlAQAEFGJ5dGVzJDx1bm5vdGVfcHJlaW1hZ2UBAAQQaGFzaCBAcmVxdWVzdF9wcmVpbWFnZQEABBBoYXNoIEh1bnJlcXVlc3RfcHJlaW1hZ2UBAAQQaGFzaCA4ZW5zdXJlX3VwZGF0ZWQBAAQYaGFzaGVzOQMQU3VkbwECFBBzdWRvAQAEEGNhbGzREFRzdWRvX3VuY2hlY2tlZF93ZWlnaHQBAAgQY2FsbNEQGHdlaWdodBgcc2V0X2tleQEABAxuZXfVAxxzdWRvX2FzAQAIDHdob9UDEGNhbGzREChyZW1vdmVfa2V5AQEFFFByb3h5AQIsFHByb3h5AQAMEHJlYWzVA0Bmb3JjZV9wcm94eV90eXBlERAQY2FsbNEQJGFkZF9wcm94eQEADCBkZWxlZ2F0ZdUDKHByb3h5X3R5cGU1DhRkZWxheQQwcmVtb3ZlX3Byb3h5AQAMIGRlbGVnYXRl1QMocHJveHlfdHlwZTUOFGRlbGF5BDhyZW1vdmVfcHJveGllcwEBBSxjcmVhdGVfcHVyZQEADChwcm94eV90eXBlNQ4UZGVsYXkEFGluZGV4BCRraWxsX3B1cmUBABQcc3Bhd25lctUDKHByb3h5X3R5cGU1DhRpbmRleAQYaGVpZ2h0BCRleHRfaW5kZXgEIGFubm91bmNlAQAIEHJlYWzVAyRjYWxsX2hhc2ggTHJlbW92ZV9hbm5vdW5jZW1lbnQBAAgQcmVhbNUDJGNhbGxfaGFzaCBMcmVqZWN0X2Fubm91bmNlbWVudAEACCBkZWxlZ2F0ZdUDJGNhbGxfaGFzaCA8cHJveHlfYW5ub3VuY2VkAQAQIGRlbGVnYXRl1QMQcmVhbNUDQGZvcmNlX3Byb3h5X3R5cGUREBBjYWxs0RAwcG9rZV9kZXBvc2l0AQEFIE11bHRpc2lnAQIUUGFzX211bHRpX3RocmVzaG9sZF8xAQAIRG90aGVyX3NpZ25hdG9yaWVz3QMQY2FsbNEQIGFzX211bHRpAQAUJHRocmVzaG9sZAREb3RoZXJfc2lnbmF0b3JpZXPdAzxtYXliZV90aW1lcG9pbnSNBBBjYWxs0RAobWF4X3dlaWdodBhAYXBwcm92ZV9hc19tdWx0aQEAFCR0aHJlc2hvbGQERG90aGVyX3NpZ25hdG9yaWVz3QM8bWF5YmVfdGltZXBvaW50jQQkY2FsbF9oYXNoIChtYXhfd2VpZ2h0GDxjYW5jZWxfYXNfbXVsdGkBABAkdGhyZXNob2xkBERvdGhlcl9zaWduYXRvcmllc90DJHRpbWVwb2ludPEBJGNhbGxfaGFzaCAwcG9rZV9kZXBvc2l0AQAMJHRocmVzaG9sZAREb3RoZXJfc2lnbmF0b3JpZXPdAyRjYWxsX2hhc2ggaEVsZWN0aW9uUHJvdmlkZXJNdWx0aVBoYXNlAQIUPHN1Ym1pdF91bnNpZ25lZAEACDByYXdfc29sdXRpb25ZBRx3aXRuZXNzXQVsc2V0X21pbmltdW1fdW50cnVzdGVkX3Njb3JlAQAEQG1heWJlX25leHRfc2NvcmVhBXRzZXRfZW1lcmdlbmN5X2VsZWN0aW9uX3Jlc3VsdAEABCBzdXBwb3J0c3UFGHN1Ym1pdAEABDByYXdfc29sdXRpb25ZBUxnb3Zlcm5hbmNlX2ZhbGxiYWNrAQEFJFZvdGVyTGlzdAECDBRyZWJhZwEABChkaXNsb2NhdGVk1QM8cHV0X2luX2Zyb250X29mAQAEHGxpZ2h0ZXLVA1RwdXRfaW5fZnJvbnRfb2Zfb3RoZXIBAAgcaGVhdmllctUDHGxpZ2h0ZXLVAzxOb21pbmF0aW9uUG9vbHMBAmgQam9pbgEACBhhbW91bnQIHHBvb2xfaWQEKGJvbmRfZXh0cmEBAAQUZXh0cmGBBTBjbGFpbV9wYXlvdXQBAQUYdW5ib25kAQAIOG1lbWJlcl9hY2NvdW501QNAdW5ib25kaW5nX3BvaW50cwhYcG9vbF93aXRoZHJhd191bmJvbmRlZAEACBxwb29sX2lkBEhudW1fc2xhc2hpbmdfc3BhbnMERHdpdGhkcmF3X3VuYm9uZGVkAQAIOG1lbWJlcl9hY2NvdW501QNIbnVtX3NsYXNoaW5nX3NwYW5zBBhjcmVhdGUBABAYYW1vdW50CBByb2901QMkbm9taW5hdG9y1QMcYm91bmNlctUDTGNyZWF0ZV93aXRoX3Bvb2xfaWQBABQYYW1vdW50CBByb2901QMkbm9taW5hdG9y1QMcYm91bmNlctUDHHBvb2xfaWQEIG5vbWluYXRlAQAIHHBvb2xfaWQEKHZhbGlkYXRvcnPdAyRzZXRfc3RhdGUBAAgccG9vbF9pZAQUc3RhdGUdAjBzZXRfbWV0YWRhdGEBAAgccG9vbF9pZAQgbWV0YWRhdGEkLHNldF9jb25maWdzAQAYNG1pbl9qb2luX2JvbmTtAzxtaW5fY3JlYXRlX2JvbmTtAyRtYXhfcG9vbHPxAyxtYXhfbWVtYmVyc/EDUG1heF9tZW1iZXJzX3Blcl9wb29s8QNUZ2xvYmFsX21heF9jb21taXNzaW9u8QMwdXBkYXRlX3JvbGVzAQAQHHBvb2xfaWQEIG5ld19yb290hQU0bmV3X25vbWluYXRvcoUFLG5ld19ib3VuY2VyhQUUY2hpbGwBAAQccG9vbF9pZARAYm9uZF9leHRyYV9vdGhlcgEACBhtZW1iZXLVAxRleHRyYYEFUHNldF9jbGFpbV9wZXJtaXNzaW9uAQAEKHBlcm1pc3Npb26JBUhjbGFpbV9wYXlvdXRfb3RoZXIBAAQUb3RoZXIAOHNldF9jb21taXNzaW9uAQAIHHBvb2xfaWQEOG5ld19jb21taXNzaW9uJQJIc2V0X2NvbW1pc3Npb25fbWF4AQAIHHBvb2xfaWQEOG1heF9jb21taXNzaW9uBGhzZXRfY29tbWlzc2lvbl9jaGFuZ2VfcmF0ZQEACBxwb29sX2lkBCxjaGFuZ2VfcmF0ZSkCQGNsYWltX2NvbW1pc3Npb24BAAQccG9vbF9pZARMYWRqdXN0X3Bvb2xfZGVwb3NpdAEABBxwb29sX2lkBHxzZXRfY29tbWlzc2lvbl9jbGFpbV9wZXJtaXNzaW9uAQAIHHBvb2xfaWQEKHBlcm1pc3Npb24xAixhcHBseV9zbGFzaAEABDhtZW1iZXJfYWNjb3VudNUDSG1pZ3JhdGVfZGVsZWdhdGlvbgEABDhtZW1iZXJfYWNjb3VudNUDeG1pZ3JhdGVfcG9vbF90b19kZWxlZ2F0ZV9zdGFrZQEABBxwb29sX2lkBCxGYXN0VW5zdGFrZQECDFRyZWdpc3Rlcl9mYXN0X3Vuc3Rha2UBAQUoZGVyZWdpc3RlcgEBBRxjb250cm9sAQAENGVyYXNfdG9fY2hlY2sEQENvbnZpY3Rpb25Wb3RpbmcBAhgQdm90ZQEACChwb2xsX2luZGV4BBB2b3RlNQQgZGVsZWdhdGUBABAUY2xhc3MECHRv1QMoY29udmljdGlvbjkEHGJhbGFuY2UIKHVuZGVsZWdhdGUBAAQUY2xhc3MEGHVubG9jawEACBRjbGFzcwQYdGFyZ2V01QMscmVtb3ZlX3ZvdGUBAAgUY2xhc3MtBBRpbmRleAREcmVtb3ZlX290aGVyX3ZvdGUBAAwYdGFyZ2V01QMUY2xhc3MEFGluZGV4BCRSZWZlcmVuZGEBAiQYc3VibWl0AQAMPHByb3Bvc2FsX29yaWdpbnUPIHByb3Bvc2FspQFAZW5hY3RtZW50X21vbWVudEEEWHBsYWNlX2RlY2lzaW9uX2RlcG9zaXQBAAQUaW5kZXgEXHJlZnVuZF9kZWNpc2lvbl9kZXBvc2l0AQAEFGluZGV4BBhjYW5jZWwBAAQUaW5kZXgEEGtpbGwBAAQUaW5kZXgEQG51ZGdlX3JlZmVyZW5kdW0BAAQUaW5kZXgESG9uZV9mZXdlcl9kZWNpZGluZwEABBR0cmFjawRkcmVmdW5kX3N1Ym1pc3Npb25fZGVwb3NpdAEABBRpbmRleAQwc2V0X21ldGFkYXRhAQAIFGluZGV4BChtYXliZV9oYXNoEQEkV2hpdGVsaXN0AQIQOHdoaXRlbGlzdF9jYWxsAQAEJGNhbGxfaGFzaCBccmVtb3ZlX3doaXRlbGlzdGVkX2NhbGwBAAQkY2FsbF9oYXNoIGRkaXNwYXRjaF93aGl0ZWxpc3RlZF9jYWxsAQAMJGNhbGxfaGFzaCBAY2FsbF9lbmNvZGVkX2xlbgRMY2FsbF93ZWlnaHRfd2l0bmVzcxicZGlzcGF0Y2hfd2hpdGVsaXN0ZWRfY2FsbF93aXRoX3ByZWltYWdlAQAEEGNhbGzRECBUcmVhc3VyeQECGCxzcGVuZF9sb2NhbAEACBhhbW91bnQILGJlbmVmaWNpYXJ51QM8cmVtb3ZlX2FwcHJvdmFsAQAELHByb3Bvc2FsX2lkBBRzcGVuZAEAEChhc3NldF9raW5kjQ4YYW1vdW50CCxiZW5lZmljaWFyeZEOKHZhbGlkX2Zyb20tBBhwYXlvdXQBAAQUaW5kZXgEMGNoZWNrX3N0YXR1cwEABBRpbmRleAQodm9pZF9zcGVuZAEABBRpbmRleAQ0Q29uZmlndXJhdGlvbgECuHxzZXRfdmFsaWRhdGlvbl91cGdyYWRlX2Nvb2xkb3duAQAEDG5ldwRwc2V0X3ZhbGlkYXRpb25fdXBncmFkZV9kZWxheQEABAxuZXcEZHNldF9jb2RlX3JldGVudGlvbl9wZXJpb2QBAAQMbmV3BERzZXRfbWF4X2NvZGVfc2l6ZQEABAxuZXcEQHNldF9tYXhfcG92X3NpemUBAAQMbmV3BFhzZXRfbWF4X2hlYWRfZGF0YV9zaXplAQAEDG5ldwRIc2V0X2NvcmV0aW1lX2NvcmVzAQAEDG5ldwRwc2V0X2dyb3VwX3JvdGF0aW9uX2ZyZXF1ZW5jeQEABAxuZXcEdHNldF9wYXJhc19hdmFpbGFiaWxpdHlfcGVyaW9kAQAEDG5ldwRgc2V0X3NjaGVkdWxpbmdfbG9va2FoZWFkAQAEDG5ldwRsc2V0X21heF92YWxpZGF0b3JzX3Blcl9jb3JlAQAEDG5ldy0ESHNldF9tYXhfdmFsaWRhdG9ycwEABAxuZXctBEhzZXRfZGlzcHV0ZV9wZXJpb2QBAAQMbmV3BLRzZXRfZGlzcHV0ZV9wb3N0X2NvbmNsdXNpb25fYWNjZXB0YW5jZV9wZXJpb2QBAAQMbmV3BERzZXRfbm9fc2hvd19zbG90cwEABAxuZXcEUHNldF9uX2RlbGF5X3RyYW5jaGVzAQAEDG5ldwR4c2V0X3plcm90aF9kZWxheV90cmFuY2hlX3dpZHRoAQAEDG5ldwRQc2V0X25lZWRlZF9hcHByb3ZhbHMBAAQMbmV3BHBzZXRfcmVsYXlfdnJmX21vZHVsb19zYW1wbGVzAQAEDG5ldwRoc2V0X21heF91cHdhcmRfcXVldWVfY291bnQBAAQMbmV3BGRzZXRfbWF4X3Vwd2FyZF9xdWV1ZV9zaXplAQAEDG5ldwR0c2V0X21heF9kb3dud2FyZF9tZXNzYWdlX3NpemUBAAQMbmV3BGxzZXRfbWF4X3Vwd2FyZF9tZXNzYWdlX3NpemUBAAQMbmV3BKBzZXRfbWF4X3Vwd2FyZF9tZXNzYWdlX251bV9wZXJfY2FuZGlkYXRlAQAEDG5ldwRkc2V0X2hybXBfb3Blbl9yZXF1ZXN0X3R0bAEABAxuZXcEXHNldF9ocm1wX3NlbmRlcl9kZXBvc2l0AQAEDG5ldwhoc2V0X2hybXBfcmVjaXBpZW50X2RlcG9zaXQBAAQMbmV3CHRzZXRfaHJtcF9jaGFubmVsX21heF9jYXBhY2l0eQEABAxuZXcEfHNldF9ocm1wX2NoYW5uZWxfbWF4X3RvdGFsX3NpemUBAAQMbmV3BJxzZXRfaHJtcF9tYXhfcGFyYWNoYWluX2luYm91bmRfY2hhbm5lbHMBAAQMbmV3BIRzZXRfaHJtcF9jaGFubmVsX21heF9tZXNzYWdlX3NpemUBAAQMbmV3BKBzZXRfaHJtcF9tYXhfcGFyYWNoYWluX291dGJvdW5kX2NoYW5uZWxzAQAEDG5ldwSYc2V0X2hybXBfbWF4X21lc3NhZ2VfbnVtX3Blcl9jYW5kaWRhdGUBAAQMbmV3BEhzZXRfcHZmX3ZvdGluZ190dGwBAAQMbmV3BJBzZXRfbWluaW11bV92YWxpZGF0aW9uX3VwZ3JhZGVfZGVsYXkBAAQMbmV3BHBzZXRfYnlwYXNzX2NvbnNpc3RlbmN5X2NoZWNrAQAEDG5ldxRgc2V0X2FzeW5jX2JhY2tpbmdfcGFyYW1zAQAEDG5ld5UFTHNldF9leGVjdXRvcl9wYXJhbXMBAAQMbmV3pQVYc2V0X29uX2RlbWFuZF9iYXNlX2ZlZQEABAxuZXcIdHNldF9vbl9kZW1hbmRfZmVlX3ZhcmlhYmlsaXR5AQAEDG5ldwRwc2V0X29uX2RlbWFuZF9xdWV1ZV9tYXhfc2l6ZQEABAxuZXcEmHNldF9vbl9kZW1hbmRfdGFyZ2V0X3F1ZXVlX3V0aWxpemF0aW9uAQAEDG5ldwRkc2V0X21pbmltdW1fYmFja2luZ192b3RlcwEABAxuZXcEQHNldF9ub2RlX2ZlYXR1cmUBAAgUaW5kZXgEFHZhbHVlFGhzZXRfYXBwcm92YWxfdm90aW5nX3BhcmFtcwEABAxuZXcEUHNldF9zY2hlZHVsZXJfcGFyYW1zAQAEDG5ld6kFLFBhcmFzU2hhcmVkAQEFNFBhcmFJbmNsdXNpb24BAQUwUGFyYUluaGVyZW50AQIEFGVudGVyAQAEEGRhdGE9EBRQYXJhcwECMFhmb3JjZV9zZXRfY3VycmVudF9jb2RlAQAIEHBhcmEEIG5ld19jb2RlJFhmb3JjZV9zZXRfY3VycmVudF9oZWFkAQAIEHBhcmEEIG5ld19oZWFkJGxmb3JjZV9zY2hlZHVsZV9jb2RlX3VwZ3JhZGUBAAwQcGFyYQQgbmV3X2NvZGUkTHJlbGF5X3BhcmVudF9udW1iZXIETGZvcmNlX25vdGVfbmV3X2hlYWQBAAgQcGFyYQQgbmV3X2hlYWQkSGZvcmNlX3F1ZXVlX2FjdGlvbgEABBBwYXJhBGxhZGRfdHJ1c3RlZF92YWxpZGF0aW9uX2NvZGUBAAQ8dmFsaWRhdGlvbl9jb2RlJGxwb2tlX3VudXNlZF92YWxpZGF0aW9uX2NvZGUBAARQdmFsaWRhdGlvbl9jb2RlX2hhc2ggbGluY2x1ZGVfcHZmX2NoZWNrX3N0YXRlbWVudAEACBBzdG10BQYkc2lnbmF0dXJlQQJ0Zm9yY2Vfc2V0X21vc3RfcmVjZW50X2NvbnRleHQBAAgQcGFyYQQcY29udGV4dARccmVtb3ZlX3VwZ3JhZGVfY29vbGRvd24BAAQQcGFyYQSUYXV0aG9yaXplX2ZvcmNlX3NldF9jdXJyZW50X2NvZGVfaGFzaAEADBBwYXJhBDRuZXdfY29kZV9oYXNoIDB2YWxpZF9wZXJpb2QEnGFwcGx5X2F1dGhvcml6ZWRfZm9yY2Vfc2V0X2N1cnJlbnRfY29kZQEACBBwYXJhBCBuZXdfY29kZSQsSW5pdGlhbGl6ZXIBAgQ0Zm9yY2VfYXBwcm92ZQEABBR1cF90bwQQSHJtcAECLFhocm1wX2luaXRfb3Blbl9jaGFubmVsAQAMJHJlY2lwaWVudARUcHJvcG9zZWRfbWF4X2NhcGFjaXR5BGRwcm9wb3NlZF9tYXhfbWVzc2FnZV9zaXplBGBocm1wX2FjY2VwdF9vcGVuX2NoYW5uZWwBAAQYc2VuZGVyBEhocm1wX2Nsb3NlX2NoYW5uZWwBAAQoY2hhbm5lbF9pZFUCQGZvcmNlX2NsZWFuX2hybXABAAwQcGFyYQQsbnVtX2luYm91bmQEMG51bV9vdXRib3VuZARcZm9yY2VfcHJvY2Vzc19ocm1wX29wZW4BAAQgY2hhbm5lbHMEYGZvcmNlX3Byb2Nlc3NfaHJtcF9jbG9zZQEABCBjaGFubmVscwRgaHJtcF9jYW5jZWxfb3Blbl9yZXF1ZXN0AQAIKGNoYW5uZWxfaWRVAjRvcGVuX3JlcXVlc3RzBFxmb3JjZV9vcGVuX2hybXBfY2hhbm5lbAEAEBhzZW5kZXIEJHJlY2lwaWVudAQwbWF4X2NhcGFjaXR5BEBtYXhfbWVzc2FnZV9zaXplBGBlc3RhYmxpc2hfc3lzdGVtX2NoYW5uZWwBAAgYc2VuZGVyBCRyZWNpcGllbnQEVHBva2VfY2hhbm5lbF9kZXBvc2l0cwEACBhzZW5kZXIEJHJlY2lwaWVudAR0ZXN0YWJsaXNoX2NoYW5uZWxfd2l0aF9zeXN0ZW0BAARMdGFyZ2V0X3N5c3RlbV9jaGFpbgQ0UGFyYXNEaXNwdXRlcwECBDhmb3JjZV91bmZyZWV6ZQEBBTRQYXJhc1NsYXNoaW5nAQIEcHJlcG9ydF9kaXNwdXRlX2xvc3RfdW5zaWduZWQBAAg0ZGlzcHV0ZV9wcm9vZk0QPGtleV9vd25lcl9wcm9vZr0DaE9uRGVtYW5kQXNzaWdubWVudFByb3ZpZGVyAQIMXHBsYWNlX29yZGVyX2FsbG93X2RlYXRoAQAIKG1heF9hbW91bnQIHHBhcmFfaWQEWHBsYWNlX29yZGVyX2tlZXBfYWxpdmUBAAgobWF4X2Ftb3VudAgccGFyYV9pZARgcGxhY2Vfb3JkZXJfd2l0aF9jcmVkaXRzAQAIKG1heF9hbW91bnQIHHBhcmFfaWQEJFJlZ2lzdHJhcgECJCByZWdpc3RlcgEADAhpZAQwZ2VuZXNpc19oZWFkJDx2YWxpZGF0aW9uX2NvZGUkOGZvcmNlX3JlZ2lzdGVyAQAUDHdobwAcZGVwb3NpdAgIaWQEMGdlbmVzaXNfaGVhZCQ8dmFsaWRhdGlvbl9jb2RlJChkZXJlZ2lzdGVyAQAECGlkBBBzd2FwAQAICGlkBBRvdGhlcgQscmVtb3ZlX2xvY2sBAAQQcGFyYQQccmVzZXJ2ZQEBBSBhZGRfbG9jawEABBBwYXJhBFRzY2hlZHVsZV9jb2RlX3VwZ3JhZGUBAAgQcGFyYQQgbmV3X2NvZGUkQHNldF9jdXJyZW50X2hlYWQBAAgQcGFyYQQgbmV3X2hlYWQkFFNsb3RzAQIMLGZvcmNlX2xlYXNlAQAUEHBhcmEEGGxlYXNlcgAYYW1vdW50CDBwZXJpb2RfYmVnaW4EMHBlcmlvZF9jb3VudARAY2xlYXJfYWxsX2xlYXNlcwEABBBwYXJhBDx0cmlnZ2VyX29uYm9hcmQBAAQQcGFyYQRAUGFyYXNTdWRvV3JhcHBlcgECGHRzdWRvX3NjaGVkdWxlX3BhcmFfaW5pdGlhbGl6ZQEACAhpZAQcZ2VuZXNpcxUJaHN1ZG9fc2NoZWR1bGVfcGFyYV9jbGVhbnVwAQAECGlkBIBzdWRvX3NjaGVkdWxlX3BhcmF0aHJlYWRfdXBncmFkZQEABAhpZASEc3Vkb19zY2hlZHVsZV9wYXJhY2hhaW5fZG93bmdyYWRlAQAECGlkBFxzdWRvX3F1ZXVlX2Rvd253YXJkX3hjbQEACAhpZAQMeGNtWRBsc3Vkb19lc3RhYmxpc2hfaHJtcF9jaGFubmVsAQAQGHNlbmRlcgQkcmVjaXBpZW50BDBtYXhfY2FwYWNpdHkEQG1heF9tZXNzYWdlX3NpemUEIEF1Y3Rpb25zAQIMLG5ld19hdWN0aW9uAQAIIGR1cmF0aW9uBEhsZWFzZV9wZXJpb2RfaW5kZXgEDGJpZAEAFBBwYXJhBDRhdWN0aW9uX2luZGV4BChmaXJzdF9zbG90BCRsYXN0X3Nsb3QEGGFtb3VudAg4Y2FuY2VsX2F1Y3Rpb24BAQUkQ3Jvd2Rsb2FuAQIkGGNyZWF0ZQEAGBRpbmRleAQMY2FwCDBmaXJzdF9wZXJpb2QELGxhc3RfcGVyaW9kBAxlbmQEIHZlcmlmaWVyPQYoY29udHJpYnV0ZQEADBRpbmRleAQUdmFsdWUIJHNpZ25hdHVyZUUGIHdpdGhkcmF3AQAIDHdobwAUaW5kZXgEGHJlZnVuZAEABBRpbmRleAQgZGlzc29sdmUBAAQUaW5kZXgEEGVkaXQBABgUaW5kZXgEDGNhcAgwZmlyc3RfcGVyaW9kBCxsYXN0X3BlcmlvZAQMZW5kBCB2ZXJpZmllcj0GIGFkZF9tZW1vAQAIFGluZGV4BBBtZW1vJBBwb2tlAQAEFGluZGV4BDhjb250cmlidXRlX2FsbAEACBRpbmRleAQkc2lnbmF0dXJlRQY0QXNzaWduZWRTbG90cwECFGhhc3NpZ25fcGVybV9wYXJhY2hhaW5fc2xvdAEABAhpZARoYXNzaWduX3RlbXBfcGFyYWNoYWluX3Nsb3QBAAgIaWQESGxlYXNlX3BlcmlvZF9zdGFydGEQXHVuYXNzaWduX3BhcmFjaGFpbl9zbG90AQAECGlkBFxzZXRfbWF4X3Blcm1hbmVudF9zbG90cwEABBRzbG90cwRcc2V0X21heF90ZW1wb3Jhcnlfc2xvdHMBAAQUc2xvdHMEIENvcmV0aW1lAQIQSHJlcXVlc3RfY29yZV9jb3VudAEABBRjb3VudARIcmVxdWVzdF9yZXZlbnVlX2F0AQAEEHdoZW4EOGNyZWRpdF9hY2NvdW50AQAIDHdobwAYYW1vdW50CCxhc3NpZ25fY29yZQEAEBBjb3JlBBRiZWdpbgQoYXNzaWdubWVudFUGIGVuZF9oaW50LQQ8U3Rha2luZ0FoQ2xpZW50AQIMNHZhbGlkYXRvcl9zZXQBAAQYcmVwb3J0bRAgc2V0X21vZGUBAAQQbW9kZXEQWGZvcmNlX29uX21pZ3JhdGlvbl9lbmQBAQVQTXVsdGlCbG9ja01pZ3JhdGlvbnMBAhBAZm9yY2Vfc2V0X2N1cnNvcgEABBhjdXJzb3KBEFxmb3JjZV9zZXRfYWN0aXZlX2N1cnNvcgEADBRpbmRleAQwaW5uZXJfY3Vyc29yxQUoc3RhcnRlZF9hdC0ESGZvcmNlX29uYm9hcmRfbWJtcwEBBThjbGVhcl9oaXN0b3JpYwEABCBzZWxlY3RvcoUQJFhjbVBhbGxldAECRBBzZW5kAQAIEGRlc3SRDhxtZXNzYWdlWRA8dGVsZXBvcnRfYXNzZXRzAQAQEGRlc3SRDixiZW5lZmljaWFyeZEOGGFzc2V0cx0POGZlZV9hc3NldF9pdGVtBFxyZXNlcnZlX3RyYW5zZmVyX2Fzc2V0cwEAEBBkZXN0kQ4sYmVuZWZpY2lhcnmRDhhhc3NldHMdDzhmZWVfYXNzZXRfaXRlbQQcZXhlY3V0ZQEACBxtZXNzYWdlWRAobWF4X3dlaWdodBhEZm9yY2VfeGNtX3ZlcnNpb24BAAggbG9jYXRpb26JDhx2ZXJzaW9uBGRmb3JjZV9kZWZhdWx0X3hjbV92ZXJzaW9uAQAERG1heWJlX3hjbV92ZXJzaW9uLQR4Zm9yY2Vfc3Vic2NyaWJlX3ZlcnNpb25fbm90aWZ5AQAEIGxvY2F0aW9ukQ6AZm9yY2VfdW5zdWJzY3JpYmVfdmVyc2lvbl9ub3RpZnkBAAQgbG9jYXRpb26RDnxsaW1pdGVkX3Jlc2VydmVfdHJhbnNmZXJfYXNzZXRzAQAUEGRlc3SRDixiZW5lZmljaWFyeZEOGGFzc2V0cx0POGZlZV9hc3NldF9pdGVtBDB3ZWlnaHRfbGltaXTxAlxsaW1pdGVkX3RlbGVwb3J0X2Fzc2V0cwEAFBBkZXN0kQ4sYmVuZWZpY2lhcnmRDhhhc3NldHMdDzhmZWVfYXNzZXRfaXRlbQQwd2VpZ2h0X2xpbWl08QJAZm9yY2Vfc3VzcGVuc2lvbgEABCRzdXNwZW5kZWQUPHRyYW5zZmVyX2Fzc2V0cwEAFBBkZXN0kQ4sYmVuZWZpY2lhcnmRDhhhc3NldHMdDzhmZWVfYXNzZXRfaXRlbQQwd2VpZ2h0X2xpbWl08QIwY2xhaW1fYXNzZXRzAQAIGGFzc2V0cx0PLGJlbmVmaWNpYXJ5kQ6MdHJhbnNmZXJfYXNzZXRzX3VzaW5nX3R5cGVfYW5kX3RoZW4BABwQZGVzdJEOGGFzc2V0cx0PUGFzc2V0c190cmFuc2Zlcl90eXBljRA4cmVtb3RlX2ZlZXNfaWSREEhmZWVzX3RyYW5zZmVyX3R5cGWNEEhjdXN0b21feGNtX29uX2Rlc3RZEDB3ZWlnaHRfbGltaXTxAlBhZGRfYXV0aG9yaXplZF9hbGlhcwEACBxhbGlhc2VykQ4cZXhwaXJlc/UDXHJlbW92ZV9hdXRob3JpemVkX2FsaWFzAQAEHGFsaWFzZXKRDnRyZW1vdmVfYWxsX2F1dGhvcml6ZWRfYWxpYXNlcwEBBTBNZXNzYWdlUXVldWUBAggkcmVhcF9wYWdlAQAIOG1lc3NhZ2Vfb3JpZ2luJQMocGFnZV9pbmRleARIZXhlY3V0ZV9vdmVyd2VpZ2h0AQAQOG1lc3NhZ2Vfb3JpZ2luJQMQcGFnZQQUaW5kZXgEMHdlaWdodF9saW1pdBgkQXNzZXRSYXRlAQIMGGNyZWF0ZQEACChhc3NldF9raW5kjQ4QcmF0ZQgYdXBkYXRlAQAIKGFzc2V0X2tpbmSNDhByYXRlCBhyZW1vdmUBAAQoYXNzZXRfa2luZI0OLFJvb3RUZXN0aW5nAQIIKGZpbGxfYmxvY2sBAAQUcmF0aW8ERHRyaWdnZXJfZGVmZW5zaXZlAQEFGE1ldGFUeAECBCBkaXNwYXRjaAEABBxtZXRhX3R4sRAUQmVlZnkBAhxQcmVwb3J0X2RvdWJsZV92b3RpbmcBAAhIZXF1aXZvY2F0aW9uX3Byb29m1QY8a2V5X293bmVyX3Byb29mvQN0cmVwb3J0X2RvdWJsZV92b3RpbmdfdW5zaWduZWQBAAhIZXF1aXZvY2F0aW9uX3Byb29m1QY8a2V5X293bmVyX3Byb29mvQM8c2V0X25ld19nZW5lc2lzAQAEPGRlbGF5X2luX2Jsb2NrcwRIcmVwb3J0X2Zvcmtfdm90aW5nAQAISGVxdWl2b2NhdGlvbl9wcm9vZsUQPGtleV9vd25lcl9wcm9vZr0DbHJlcG9ydF9mb3JrX3ZvdGluZ191bnNpZ25lZAEACEhlcXVpdm9jYXRpb25fcHJvb2bFEDxrZXlfb3duZXJfcHJvb2a9A2hyZXBvcnRfZnV0dXJlX2Jsb2NrX3ZvdGluZwEACEhlcXVpdm9jYXRpb25fcHJvb2bRBjxrZXlfb3duZXJfcHJvb2a9A4xyZXBvcnRfZnV0dXJlX2Jsb2NrX3ZvdGluZ191bnNpZ25lZAEACEhlcXVpdm9jYXRpb25fcHJvb2bRBjxrZXlfb3duZXJfcHJvb2a9A0BJZGVudGl0eU1pZ3JhdG9yAQIINHJlYXBfaWRlbnRpdHkBAAQMd2hvADBwb2tlX2RlcG9zaXQBAAQMd2hvAATREAADCAT5DwTZEAAADChqdWRnZW1lbnRz3RAcZGVwb3NpdAgQaW5mb+0PAwgI3QMADBxhY2NvdW50AAxmZWUIGGZpZWxkcwgG6RAE7RAAAAgoYWNjb3VudF9pZAAoYWxsb2NhdGlvbgQCDChBbGxvY2F0aW9uAQEFQEF1dGhvcml0eURlcG9zaXQBAQMYU3lzdGVtAQEFAAgUb3duZXIAIHByb3ZpZGVy+RADDAAE+RAAFCBtYXliZV9pZBEBIHByaW9yaXR5BBBjYWxspQE4bWF5YmVfcGVyaW9kaWOBAxhvcmlnaW51DwYFEQQJEQAADCBkZWxlZ2F0ZQAocHJveHlfdHlwZTUOFGRlbGF5BAQREQADCBURCAAsFHRyYWNrBBhvcmlnaW51DyBwcm9wb3NhbKUBJGVuYWN0bWVudEEEJHN1Ym1pdHRlZARIc3VibWlzc2lvbl9kZXBvc2l03QdAZGVjaXNpb25fZGVwb3NpdOEHIGRlY2lkaW5n6QcUdGFsbHmpASBpbl9xdWV1ZRQUYWxhcm3xBwIYHE9uZ29pbmcBACwUdHJhY2sEGG9yaWdpbnUPIHByb3Bvc2FspQEkZW5hY3RtZW50QQQkc3VibWl0dGVkBEhzdWJtaXNzaW9uX2RlcG9zaXTdB0BkZWNpc2lvbl9kZXBvc2l04QcgZGVjaWRpbmfpBxR0YWxseakBIGluX3F1ZXVlFBRhbGFybfEHIEFwcHJvdmVkAQMMBOEH4QcgUmVqZWN0ZWQBAwwE4QfhByRDYW5jZWxsZWQBAwwE4QfhByBUaW1lZE91dAEDDAThB+EHGEtpbGxlZAEBAgAYKGFzc2V0X2tpbmSNDhhhbW91bnQILGJlbmVmaWNpYXJ5kQ4odmFsaWRfZnJvbQQkZXhwaXJlX2F0BBhzdGF0dXO5BwAIFGFnZW50ABhhbW91bnQIABAUcGF5ZWUAPHRvdGFsX2RlbGVnYXRlZAhUdW5jbGFpbWVkX3dpdGhkcmF3YWxzCDRwZW5kaW5nX3NsYXNoCAMIBEEJBDERAAAMMHJlbGF5X3BhcmVudCAoc3RhdGVfcm9vdCAsY2xhaW1fcXVldWU1EQQ5EQAACBhidWZmZXI9ETRsYXRlc3RfbnVtYmVyBAAkEGNvcmUEEGhhc2ggKGRlc2NyaXB0b3KhDixjb21taXRtZW50c8kFSGF2YWlsYWJpbGl0eV92b3Rlc7EFHGJhY2tlcnOxBUxyZWxheV9wYXJlbnRfbnVtYmVyBEBiYWNrZWRfaW5fbnVtYmVyBDRiYWNraW5nX2dyb3VwBARFEQADCKUOvQgETREAAAwcc2Vzc2lvbgSAYmFja2luZ192YWxpZGF0b3JzX3Blcl9jYW5kaWRhdGVRESBkaXNwdXRlc/kFBNEIAAMIBFkRBF0RAAAIJGNvZGVfaGFzaCAkZXhwaXJlX2F0BAAIEGtleXNRCRBraW5kSRAAFBxtYW5hZ2VyADBwZXJpb2RfYmVnaW4EMHBlcmlvZF9jb3VudAQobGFzdF9sZWFzZS0ELGxlYXNlX2NvdW50BAMIBN0DAAggcmVwb3J0ZXIFAjhzbGFzaF9mcmFjdGlvbgQDCAB1EQR5EQADCAR9EQSBEQAGkQ4CDAhWMwECGBBOdWxsAQEFGEFzc2V0cwEEEQMAPEV4ZWN1dGlvblJlc3VsdAEGpQIcVmVyc2lvbgEBAixQYWxsZXRzSW5mbwEErQIAOERpc3BhdGNoUmVzdWx0AQIMHFN1Y2Nlc3MBAQUURXJyb3IBBQA4VHJ1bmNhdGVkRXJyb3IBBQAIVjQBAhgQTnVsbAEBBRhBc3NldHMBBJ0CADxFeGVjdXRpb25SZXN1bHQBBqUCHFZlcnNpb24BAQIsUGFsbGV0c0luZm8BBK0CADhEaXNwYXRjaFJlc3VsdAECDBxTdWNjZXNzAQEFFEVycm9yAQUAOFRydW5jYXRlZEVycm9yAQUACFY1AQIYEE51bGwBAQUYQXNzZXRzAQTVDgA8RXhlY3V0aW9uUmVzdWx0AQbdDhxWZXJzaW9uAQECLFBhbGxldHNJbmZvAQStAgA4RGlzcGF0Y2hSZXN1bHQBAgwcU3VjY2VzcwEBBRRFcnJvcgEFADhUcnVuY2F0ZWRFcnJvcgEFAAIMHFBlbmRpbmcBABAkcmVzcG9uZGVykQ5MbWF5YmVfbWF0Y2hfcXVlcmllcokRMG1heWJlX25vdGlmea0JHHRpbWVvdXQEPFZlcnNpb25Ob3RpZmllcgEACBhvcmlnaW6RDiRpc19hY3RpdmUUFFJlYWR5AQAIIHJlc3BvbnNljREIYXQEAwgEkQ4DCJEOBASZEQADDAQAkRAAEBhhbW91bnQIFG93bmVykQ4YbG9ja2VykQ4kY29uc3VtZXJz1QkDCAiRDgSpEQAACCBsb2NhdGlvbpEOGGV4cGlyefUDBLERAAAEIGFsaWFzZXJztREACBhwcmVmaXhFARhzdWZmaXhFAQIMOE5vdEltcGxlbWVudGVkAQEFIE5vdEZvdW5kAQAIGHByZWZpeEUBGHN1ZmZpeEUBFENvZGVjAQEFByTBEQI0EENhbGwBAQUcUGF5bWVudAEBBRhGdXR1cmUBAQUUU3RhbGUBAQUgQmFkUHJvb2YBAQVEQW5jaWVudEJpcnRoQmxvY2sBAQVERXhoYXVzdHNSZXNvdXJjZXMBAQUYQ3VzdG9tAQECMEJhZE1hbmRhdG9yeQEBBUxNYW5kYXRvcnlWYWxpZGF0aW9uAQEFJEJhZFNpZ25lcgEBBVRJbmRldGVybWluYXRlSW1wbGljaXQBAQU0VW5rbm93bk9yaWdpbgEBBQIIHEludmFsaWQBAjQQQ2FsbAEBBRxQYXltZW50AQEFGEZ1dHVyZQEBBRRTdGFsZQEBBSBCYWRQcm9vZgEBBURBbmNpZW50QmlydGhCbG9jawEBBURFeGhhdXN0c1Jlc291cmNlcwEBBRhDdXN0b20BAQIwQmFkTWFuZGF0b3J5AQEFTE1hbmRhdG9yeVZhbGlkYXRpb24BAQUkQmFkU2lnbmVyAQEFVEluZGV0ZXJtaW5hdGVJbXBsaWNpdAEBBTRVbmtub3duT3JpZ2luAQEFHFVua25vd24BAgwwQ2Fubm90TG9va3VwAQEFTE5vVW5zaWduZWRWYWxpZGF0b3IBAQUYQ3VzdG9tAQECBxUOzREHLQrNEQAgUG5leHRfdXBfb25fYXZhaWxhYmxlQQo4b2NjdXBpZWRfc2luY2UELHRpbWVfb3V0X2F0BExuZXh0X3VwX29uX3RpbWVfb3V0QQowYXZhaWxhYmlsaXR5sQVEZ3JvdXBfcmVzcG9uc2libGUEOGNhbmRpZGF0ZV9oYXNoIFBjYW5kaWRhdGVfZGVzY3JpcHRvcqEOAgwgT2NjdXBpZWQBACBQbmV4dF91cF9vbl9hdmFpbGFibGVBCjhvY2N1cGllZF9zaW5jZQQsdGltZV9vdXRfYXQETG5leHRfdXBfb25fdGltZV9vdXRBCjBhdmFpbGFiaWxpdHmxBURncm91cF9yZXNwb25zaWJsZQQ4Y2FuZGlkYXRlX2hhc2ggUGNhbmRpZGF0ZV9kZXNjcmlwdG9yoQ4kU2NoZWR1bGVkAQAIHHBhcmFfaWQEIGNvbGxhdG9yEQEQRnJlZQEBBQTdEQAGMRACDDxDYW5kaWRhdGVCYWNrZWQBAxClDiQEBERDYW5kaWRhdGVJbmNsdWRlZAEDEKUOJAQERENhbmRpZGF0ZVRpbWVkT3V0AQMMpQ4kBATpEQAGVREAFDhjYW5kaWRhdGVfaGFzaCAoZGVzY3JpcHRvcqEOLGNvbW1pdG1lbnRzyQVMcmVsYXlfcGFyZW50X251bWJlcgQwbWF4X3Bvdl9zaXplBAT1EQAACCxjb25zdHJhaW50c6kKUHBlbmRpbmdfYXZhaWxhYmlsaXR5+REG/REEMRAAADxcbWluX3JlbGF5X3BhcmVudF9udW1iZXIEMG1heF9wb3Zfc2l6ZQQ0bWF4X2NvZGVfc2l6ZQRIbWF4X2hlYWRfZGF0YV9zaXplBDR1bXBfcmVtYWluaW5nBEx1bXBfcmVtYWluaW5nX2J5dGVzBGRtYXhfdW1wX251bV9wZXJfY2FuZGlkYXRlBFhkbXBfcmVtYWluaW5nX21lc3NhZ2VzOQIwaHJtcF9pbmJvdW5kOQJEaHJtcF9jaGFubmVsc19vdXSdCmhtYXhfaHJtcF9udW1fcGVyX2NhbmRpZGF0ZQQ8cmVxdWlyZWRfcGFyZW50JFB2YWxpZGF0aW9uX2NvZGVfaGFzaCBMdXBncmFkZV9yZXN0cmljdGlvbqEKWGZ1dHVyZV92YWxpZGF0aW9uX2NvZGWlCgYJEgAMEHZvdGXRBjhhbmNlc3RyeV9wcm9vZiQYaGVhZGVytQMEkRAABxUSDQsHHQ8NCwQ1DwAGWRAEWRAAAwiRDikSBC0SAAAQQGV4ZWN1dGlvbl9yZXN1bHRVDjhlbWl0dGVkX2V2ZW50cyESJGxvY2FsX3hjbSUSOGZvcndhcmRlZF94Y21zMRIHNRI5CwAMQGV4ZWN1dGlvbl9yZXN1bHTRDjhlbWl0dGVkX2V2ZW50cyESOGZvcndhcmRlZF94Y21zMRIHPRI5CwIMCFYzAQAICGlkfQEMZnVumQIIVjQBAAgIaWR5AQxmdW6ZAghWNQEACAhpZIkODGZ1bpkCAgh4VmVyc2lvbmVkQXNzZXRDb252ZXJzaW9uRmFpbGVkAQEFhFZlcnNpb25lZExvY2F0aW9uQ29udmVyc2lvbkZhaWxlZAEBBQcUSRI="; +export default content; diff --git a/examples/with-vite-papi/.papi/descriptors/dist/paseo.d.ts b/examples/with-vite-papi/.papi/descriptors/dist/paseo.d.ts new file mode 100644 index 0000000..7a0b903 --- /dev/null +++ b/examples/with-vite-papi/.papi/descriptors/dist/paseo.d.ts @@ -0,0 +1,10185 @@ +import { StorageDescriptor, PlainDescriptor, TxDescriptor, RuntimeDescriptor, Enum, QueryFromPalletsDef, TxFromPalletsDef, EventsFromPalletsDef, ErrorsFromPalletsDef, ConstFromPalletsDef, SS58String, FixedSizeBinary, Binary, FixedSizeArray } from "polkadot-api"; +import { I5sesotjlssv2d, Iffmde3ekjedi9, I4mddgoa69c0a2, Ia5993kjv8a1tl, I95g6i7ilua7lq, Ieniouoqkq4icf, Phase, Ibgl04rn6nbfm6, I9tv51sgspensk, I56u24ncejr5kt, I9jd27rnpm8ttv, PreimageOldRequestStatus, PreimageRequestStatus, I4pact7n2e9a0i, I3geksg000c171, BabeDigestsNextConfigDescriptor, Ic5m5lp1oioo8r, Idq7or56ds2f13, I4s6vifaf8k998, I8jnd4d8ip6djo, Ifip05kcrl65am, Iff9heri56m1mb, I1q8tnt1cluu5j, I8ds64oj6581v0, Ia7pdug7cdsg8g, I3oiqtmlj7klbr, I2l1ctuihi2mfd, TransactionPaymentReleases, Ia2lhg7l2hilo3, Ic12aht5vh2sen, StakingRewardDestination, I9o7ssi9vmhmgr, Ic3m9d6tdl6gi2, Ib3j7gb0jgs38u, Ifekshcrgkl12g, I7svnfko10tq2e, I6flrronqs3l6n, I97fulj5h3ik95, Ia8896dq44k9m4, Icgljjb6j82uhn, Iff9p3c7k6pfoi, StakingForcing, Iafq6t4rgheait, I4ojmnsk1dchql, Iinkhfdlka9ch, I2kj4j6mp68hf8, I6ouflveob4eli, I2bqvqrg0sbrdj, I23nq3fsgtejt, Idt624nf41g34e, I9kr8cseidc66h, I82jm9g7pufuel, GrandpaStoredState, I7pe2me3i3vtn9, Iegmj7n48sc3am, I5v9a2mdqq4t8u, ConvictionVotingVoteVoting, If9jidduiuq7vv, Idu11e295qqjep, I22o1tjs56dvi2, I9h43amtitrqum, I2phecamkn3pej, ClaimsStatementKind, Ifble4juuml5ig, Version, I6piac7omi5lpd, I9p9lq3rej5bhc, Iag146hmjgqfgj, I8uo3fpd3bcc6f, I8phqps8r3of7e, Ibofbvvaehln4e, ElectionProviderMultiPhasePhase, Ictkaqdbfabuek, Ia7o65280hur3p, Iasd2iat48n080, Ic8d01sg6acf60, Irl37q7erstrb, I8s6n43okuj2b1, Ic5t26f9cp3tvk, I39k39h6vu4hbq, Idphjddn2h69vc, Idhh9vuu2bderg, If6qa32dj75gu1, I7oo2mprv1qd1s, NominationPoolsClaimPermission, I2eh80qovrl7h2, Idinvj2ldfa0k7, I78k2970vpbt1t, I27il479s8gsv0, Id375uoldedict, Ilg2fqs6cjgs3, Iarlj3qd8u1v13, I2ng2krd94ceva, Ie18mk3nmrn3nr, I4vk12npmr8ll0, ParachainsParasParaLifecycle, I79cs1p3m59mo7, UpgradeGoAhead, UpgradeRestriction, I2duhnt686rv0q, I7ulu3h1ibu60i, I6ljjd4b5fa4ov, Ibhmrlkcu01imb, I50mrcbubp554e, Id43g4eveajpkl, I7iua3ehrgl4va, Iev3u09i2vqn93, I9olhgo2o08h7b, I9m4rd2a7lc9md, I80rnntpog8qp6, I87u7jalc0lhah, I4p5t2krb1gmvp, I4arjljr6dpflb, I5kqchhvguhfvt, I4akf1ifqeclef, Ido5stnsbghtpd, I3ndpvu09rj685, Iafqnechp3omqg, I9dasmua8326io, I3g90iebhds6kb, I3av628q6dt6mq, Ifmaahl40gom3g, I70iuri2ilha1f, I6gun5k9fbb4s0, If354jrdedj0pj, Ib17t3992hb64n, I215mkl885p4da, XcmPalletQueryStatus, Ic4qvh5df9s5gp, I7vlvrrl2pnbgk, I50sjs3s5lud21, XcmPalletVersionMigrationStage, I50qp0ij7h62g2, Iteuj23is2ed5, I3rp19gb4dadaa, Iegrepoo0c1jc5, I260m120dp9sbk, ParachainsInclusionAggregateMessageOrigin, I53esa2ms463bk, I1lfimt2mpej64, VersionedLocatableAsset, I2fb54desdqd9n, Idjett00s2gd, In7a38730s6qs, If15el53dd76v9, I9s0ave7t0vnrk, Ic6nglu2db2c36, I4q39t5hn830vp, Ibafpkl9hhno69, I35p85j063s0il, XcmV3Junctions, Iasb8k6ash5mjn, I8ofcg5rbj0g2c, I4adgbll7gku4i, I6pjjpfvhvcfru, I9pj91mj79qekl, I39uah9nss64h9, Ik64dknsq7k08, Ib51vk42m1po4n, I3p13kido05bum, I5n4sebgkfr760, Idi2o3quauop42, Ifs1i5fk9cqvr6, Ie0v9n6or5lh9r, I1eosriit8hpo3, Ieg3fd8p4pkt10, I8kg5ll427kfqq, I467333262q1l9, I82nfqfkd48n10, I1jm8m1rh9e20v, I3o5j3bli1pd8e, I50ppnqasq4tjq, I9fin09kkg0jaj, Idcr6u6361oad9, I666bl2fqjkejo, I6o1er683vod1j, I5bq561t4gpfva, I4ktuaksf5i1gk, I9bqtpv2ii35mp, I9j7pagd6d4bda, I2h9pmio37r7fb, Ibmr18suc9ikh9, I9iq22t0burs89, I5u8olqbbvfnvf, I5utcetro501ir, I2eip8tc75dpje, I564va64vtidbq, Ie5v6njpckr05b, I328av3j0bgmjb, I4tuqm9ato907i, Iagi89qt4h1lqg, I9dgmcnuamt5p8, I3vh014cqgmrfd, Ifhs60omlhvt3, If34udpd5e57vi, I39t01nnod9109, Ie5vbnd9198quk, I3h6murn8bd4v5, I6k6jf8ncesuu3, I3qhk481i120pk, If1qr0kbbl298c, Idl3umm12u5pa, I5ont0141q9ss5, Ie6j49utvii126, I3v6ks33uluhnj, I3kiiim1cds68i, I4k60mkh2r6jjg, I5oi8saufice6j, I7ne83r38c2sqq, I2hviml3snvhhn, Icnrv1mfbd3in1, Icm9m0qeemu66d, Ibv74ul0c0qf0f, Idnsr2pndm36h0, Ia1pvdcbhuqf8m, I8steo882k7qns, I4pa4q37gj6fua, I5f178ab6b89t3, I4nakhtbsk3c5s, Ici1c3ahlkpcj1, Icbio0e1f0034b, I8c0vkqjjipnuj, I1adbcfi5uc62r, Ibf6ucefn8fh49, I3dq5m6mb8ta46, I9j2r9vmc9atsu, I6uag8j5aql8q, Isq3k9rh2c0l4, I1dqiovk0tpoah, I1ntko0oih7v1a, I2tf5qmg09624f, Id9uqtigc0il3v, Iaa2o6cgjdpdn5, Iam6hrl7ptd85l, Ict9ivhr2c5hv0, I8t4vv03357lk9, I4qgdq1nsq1ldf, Id6nml1be4ntg1, Id4coi5m2c4fbi, Ic81m9070nb7fh, Idpsmkk8cmveiu, Ifhl1ihpl9i99m, Iav2q7hjio8n98, I1m2ifb0h8d0r8, I2eb501t8s6hsq, Ianmuoljk2sk1u, I8nstg9vo0fosk, Icg17asei4oejt, I4sp01qlh6rkhp, Ideaemvoneh309, I3d9o9d7epp66v, I2a839vbf5817q, Ia9p5bg6p18r0i, I42bqh279uf7oa, I4p6v96cffstms, I90n6nnkpdahrh, I8mk5kjgn02hi8, Ieqvq91sbe02ko, I2gr10p66od9ch, I9mcq66cm3gibo, I31k9f0jol8ko4, I80q14um2s2ckg, I5qs1t1erfi7u8, I9et13knvdvgpb, Ifsme8miqq9006, Id9js0aucdivjk, I1vj3e1a62je3o, I6c1t14l6giceg, Ieg1oc56mamrl5, I2vu5vj7173ik9, I6galqkn58q3bl, I36uoc8t9liv80, Ibunghsg9qa7f7, I8qnouj2c0igph, Ic30e2k517a3ns, I47a2tsd2o2b1c, Ifc9k1s0e9nv8e, I4ihj26hl75e5p, I2dl8ekhm2t22h, I13us5e5h5645o, I931cottvong90, I7sujb8gfvuo7n, I1ors0vru14it3, I40s11r8nagn2g, I6bjj87fr5g9nl, I8cbluptqo8kbp, I81cc4plffa1dm, I3ihan8icf0c5k, I7ibh0fckqou49, I9j0ul7nh7b8jv, Id581arok0b1nj, I9jsikd1ghmc7l, I2f6mha3v4ooda, Iasqjdhasi408s, I6krn2lsleo87n, Iaid4btmkr5thp, I559fv6um7nmhd, Ibbf0j7ol2abrv, I1k3urvkqqshbc, I2ff0ffsh15vej, I1orfg86bkg123, Iaus4cb3drhu9q, Ivnsat10lv9d6, Ibncli8qttt2c2, I33rft6ag34efs, I9tmok5kceg2bg, I85icj2qbjeqbe, Ibuhbp68e6tkct, Idrevppfiubhve, I9s2h36kr71vk9, I4lkbiubo9ogq9, Id1baei7m8gkhk, I96ftepqm4vs7m, Ic3430470j4mbv, Ic3n7nqb6fffo0, I437u7rqtshfms, Iaa7g3f5tlv3gf, I7mf0sij342109, Ibvirp862qkkup, Ic5b47dj4coa3r, Idehabrqi23sc0, Idfpo6162k0hq, I19hvnphoaj44l, I1ng31ej27mh4k, I85qkvekflgteq, I1qt5nua7ua655, Ia1u3jll6a06ae, I7cl9esn1l72m7, Id68sq6o2gm8qi, Iafscmv8tjf0ou, Ibtsa3docbr9el, I2gpmmfdqv3cdc, I7psec5e6ghc64, I2psb0sladd863, I585tk8khua0gk, I3ut99di214ru2, Iemkp87d26vsbh, I4ahfrt5dscf6q, I9paqujeb1fpv6, Iakevv83i18n4r, If2ssl12kcglhg, Iabk8ljl5g8c86, Ic76kfh5ebqkpl, Icrujen33bbibf, I5gi8h3e5lkbeq, Ibgm4rnf22lal1, I8mmaab8je28oo, I6r0pr82pbiftt, Ibv4ep0hngvn9e, Ieoqregtp7b00, I6nmp4rhqla35, I8ndstn7sf4kek, I3pirohb0sp3ic, Iemqna2uucuei9, I9geq5evbpu4im, I7mlkc61s5tj4l, I8k3rnvpeeh4hv, Id3ingc7s7iq1i, Ia82mnkmeo2rhc, I9d21uli0ks815, Icbccs0ug47ilf, I855j4i3kr8ko1, Ifr47nm7thgrp4, Ia3c82eadg79bj, Ienusoeb625ftq, Icv68aq8841478, Ic262ibdoec56a, Iflcfm9b6nlmdd, Ijrsf4mnp3eka, Id5fm4p8lj5qgi, I8tjvj9uq4b7hi, I4cbvqmqadhrea, I3qt1hgg4djhgb, I4fooe9dun9o0t, Ier2cke86dqbr2, I1au3fq4n84nv3, Iejaj7m7qka9tr, Idnak900lt5lm8, I27n7lbd66730p, I2hq50pu2kdjpo, Ifk8eme5o7mukf, Iau4cgm6ih61cf, I6ir616rur362k, Ic19as7nbst738, I54umskavgc9du, I2ip7o9e2tc5sf, I5egvk6hadac5h, Iempvdlhc5ih6g, I5768ac424h061, I8iksqi3eani0a, I16enopmju1p0q, I43kq8qudg7pq9, I76riseemre533, I38bmcrmh852rk, I4hcillge8de5f, If52u7u3r3ve0n, Iek7v4hrgnq6iv, I2na29tt2afp0j, I229ijht536qdu, I62nte77gksm0f, I9cg2delv92pvq, Ilhp45uime5tp, I4f1hv034jf1dt, Iag65bq4k2ea97, I9f0v9ntn9g19p, Ie3hcrrq6r18fs, Ievr89968437gm, I8h7evu8bnn18n, Iev8df16vlcnrm, I1hl4th07hmok3, Ifqt0l2jtnansm, I2ur0oeqg495j8, Ib5do5c9nfeb64, Iep27ialq4a7o7, Iasu5jvoqr43mv, I6aucqi8p470ta, I5qolde99acmd1, Id9idaj83175f9, Ie1semicfuv5uu, If25fjs9o37co1, I70sc1pdo8vtos, I60p8l86a8cm59, I3m3sk2lgcabvp, I5pf572duh4oeg, I4mol6k10mv0io, Iec90vukseit9e, I7j4m7a3pkvsf4, Ic2n50kpnu5mae, I37454vatvmm1l, Iblau1qa7u7fet, I1ti389kf8t6oi, If4nnre373amul, I55kbor0ocqk6h, Idsj9cg7j96kpc, Ido4u9drncfaml, Ie8c7ctks8ur2p, I7vqogd77mmdlm, I6mik29s5073td, I2m0sqmb75cnpb, I49agc5b62mehu, Iatq9jda4hq6pg, I2g87evcjlgmqi, I9tpbs57uqggl, Ic0he9tlf9ll0u, Icdu1nb48l753j, I618m2uag0aopg, Ic8i89mfkmn3n7, Id2bej717ckub0, I545vo2e86o5i4, I3i09nus3ku37s, I2e447aa6a0imh, I82n7gg49bvucn, I58qkru548f7dl, Ibs22tt76qp5bi, I37r4bdai8o9mp, Idn2ghub1o4i40, I48u78djt89dod, Ib85m5kfbepu2t, Idaml5bdhsfcsl, Ieec0cu336gteb, I815d5k4ij85nv, Ifi98fgi9o46v7, Ic0oj9tok33uap, I3tdutpfjuk32j, I1esdujrkdacpb, I9g1d820jf9m2s, I8ve4g3egaln6a, I648p81puvbjcl, If4hvqaeoqq5us, Iaiqv5prlisjkg, Iagqcb06kbevb1, Iec8defeh924b6, I2aatv5i0cb96a, Ib9msr5sr8t3dn, I3le5tr7ugg6l2, I3iun9sig164po, I2uqmls7kcdnii, Idg69klialbkb8, I13jboebjcbglr, I30pg328m00nr3, I381dkhrurdhrs, Ic8hi3qr11vngc, Ibjdlecumfu7q7, Ia9ems1kg7laoc, I92fq0fa45vi3, Id01dpp0dn2cj0, I6nu8k62ck9o8o, I6s1nbislhk619, I218fa3heih67o, I1tf93k54ltg1v, I6ove5at7hfiur, I9c0urppp07b8b, I1a3ecmnlnvr59, Idja5vsh7mfgto, I5rtkmhm2dng4u, BagsListListListError, Ie2db4l6126rkt, I3he5stuuhiokq, Iaqet9jc3ihboe, Ic952bubvq4k7d, I2v50gu3s1aqk6, Iabpgqcjikia83, Ikgci99ap0ffp, If7uv525tdvv7a, Itom7fk49o0c9, I2an1fs2eiebjp, TransactionValidityTransactionSource, Iajbob6uln5jct, I5985kfq7sspta, I4jmodim0td97u, OccupiedCoreAssumption, I9kavsa730sjfr, Ifn3gc8nc1jruq, Ic1d4u2opv3fst, Ic5plng3kq7oc8, Iajdik7eaq7pn0, I2pf0b05mc7sdr, I7n1him6iq79fv, Ialuks4a6iupcs, I36e6rra3ikq65, Idv6tqqnmb3i1j, Iekan13fn586c2, Idrp5a1qbbi2au, I943rhn463avqr, Iacuu7pfj40eo5, Iavuvfkop6318c, I3cs5lehnlql7v, Ifogo2hpqpe6b4, Ifiofttj73fsk1, I7rj2bnb76oko1, I4o356o7eq06ms, I46e127tr8ma2h, I38ee9is0n4jn9, Ie88mmnuvmuvp5, I9puqgoda8ofk4, Iems84l8lk2v0c, I1r5ke30ueqo0r, I68ii5ik8avr9o, Icerf8h8pdu8ss, I6spmpef2c7svf, Iei2mvq0mjvt81, Ibqu3kf8ifskue, I1p1369d52j8jd, DotXcmVersionedXcm, Ic0c3req3mlc1l, DotXcmVersionedAssetId, I7ocn4njqde3v5, DotXcmVersionedLocation, I5rlt6h8ph553n, PolkadotRuntimeOriginCaller, I399nsqbaqlr2u, Ib0m46eqe594fl, Ieh6nis3hdbtgi, Ie9sr1iqcg3cgm, I1mqgk2tmnn9i2, I6lr8sctk0bi4e, I50ikjune0gg0u } from "./common-types"; +type AnonymousEnum = T & { + __anonymous: true; +}; +type MyTuple = [T, ...T[]]; +type SeparateUndefined = undefined extends T ? undefined | Exclude : T; +type Anonymize = SeparateUndefined ? number extends L ? Binary : FixedSizeBinary : T extends string | number | bigint | boolean | void | undefined | null | symbol | Uint8Array | Enum ? T : T extends AnonymousEnum ? Enum : T extends MyTuple ? { + [K in keyof T]: T[K]; +} : T extends [] ? [] : T extends FixedSizeArray ? number extends L ? Array : FixedSizeArray : { + [K in keyof T & string]: T[K]; +}>; +type IStorage = { + System: { + /** + * The full account information for a particular account ID. + */ + Account: StorageDescriptor<[Key: SS58String], Anonymize, false, never>; + /** + * Total extrinsics count for the current block. + */ + ExtrinsicCount: StorageDescriptor<[], number, true, never>; + /** + * Whether all inherents have been applied. + */ + InherentsApplied: StorageDescriptor<[], boolean, false, never>; + /** + * The current weight for the block. + */ + BlockWeight: StorageDescriptor<[], Anonymize, false, never>; + /** + * Total length (in bytes) for all extrinsics put together, for the current block. + */ + AllExtrinsicsLen: StorageDescriptor<[], number, true, never>; + /** + * Map of block numbers to block hashes. + */ + BlockHash: StorageDescriptor<[Key: number], FixedSizeBinary<32>, false, never>; + /** + * Extrinsics data for the current block (maps an extrinsic's index to its data). + */ + ExtrinsicData: StorageDescriptor<[Key: number], Binary, false, never>; + /** + * The current block number being processed. Set by `execute_block`. + */ + Number: StorageDescriptor<[], number, false, never>; + /** + * Hash of the previous block. + */ + ParentHash: StorageDescriptor<[], FixedSizeBinary<32>, false, never>; + /** + * Digest of the current block, also part of the block header. + */ + Digest: StorageDescriptor<[], Anonymize, false, never>; + /** + * Events deposited for the current block. + * + * NOTE: The item is unbound and should therefore never be read on chain. + * It could otherwise inflate the PoV size of a block. + * + * Events have a large in-memory size. Box the events to not go out-of-memory + * just in case someone still reads them from within the runtime. + */ + Events: StorageDescriptor<[], Anonymize, false, never>; + /** + * The number of events in the `Events` list. + */ + EventCount: StorageDescriptor<[], number, false, never>; + /** + * Mapping between a topic (represented by T::Hash) and a vector of indexes + * of events in the `>` list. + * + * All topic vectors have deterministic storage locations depending on the topic. This + * allows light-clients to leverage the changes trie storage tracking mechanism and + * in case of changes fetch the list of events of interest. + * + * The value has the type `(BlockNumberFor, EventIndex)` because if we used only just + * the `EventIndex` then in case if the topic has the same contents on the next block + * no notification will be triggered thus the event might be lost. + */ + EventTopics: StorageDescriptor<[Key: FixedSizeBinary<32>], Anonymize, false, never>; + /** + * Stores the `spec_version` and `spec_name` of when the last runtime upgrade happened. + */ + LastRuntimeUpgrade: StorageDescriptor<[], Anonymize, true, never>; + /** + * True if we have upgraded so that `type RefCount` is `u32`. False (default) if not. + */ + UpgradedToU32RefCount: StorageDescriptor<[], boolean, false, never>; + /** + * True if we have upgraded so that AccountInfo contains three types of `RefCount`. False + * (default) if not. + */ + UpgradedToTripleRefCount: StorageDescriptor<[], boolean, false, never>; + /** + * The execution phase of the block. + */ + ExecutionPhase: StorageDescriptor<[], Phase, true, never>; + /** + * `Some` if a code upgrade has been authorized. + */ + AuthorizedUpgrade: StorageDescriptor<[], Anonymize, true, never>; + }; + Scheduler: { + /** + + */ + IncompleteSince: StorageDescriptor<[], number, true, never>; + /** + * Items to be executed, indexed by the block number that they should be executed on. + */ + Agenda: StorageDescriptor<[Key: number], Anonymize, false, never>; + /** + * Retry configurations for items to be executed, indexed by task address. + */ + Retries: StorageDescriptor<[Key: Anonymize], Anonymize, true, never>; + /** + * Lookup from a name to the block number and index of the task. + * + * For v3 -> v4 the previously unbounded identities are Blake2-256 hashed to form the v4 + * identities. + */ + Lookup: StorageDescriptor<[Key: FixedSizeBinary<32>], Anonymize, true, never>; + }; + Preimage: { + /** + * The request status of a given hash. + */ + StatusFor: StorageDescriptor<[Key: FixedSizeBinary<32>], PreimageOldRequestStatus, true, never>; + /** + * The request status of a given hash. + */ + RequestStatusFor: StorageDescriptor<[Key: FixedSizeBinary<32>], PreimageRequestStatus, true, never>; + /** + + */ + PreimageFor: StorageDescriptor<[Key: Anonymize], Binary, true, never>; + }; + Babe: { + /** + * Current epoch index. + */ + EpochIndex: StorageDescriptor<[], bigint, false, never>; + /** + * Current epoch authorities. + */ + Authorities: StorageDescriptor<[], Anonymize, false, never>; + /** + * The slot at which the first epoch actually started. This is 0 + * until the first block of the chain. + */ + GenesisSlot: StorageDescriptor<[], bigint, false, never>; + /** + * Current slot number. + */ + CurrentSlot: StorageDescriptor<[], bigint, false, never>; + /** + * The epoch randomness for the *current* epoch. + * + * # Security + * + * This MUST NOT be used for gambling, as it can be influenced by a + * malicious validator in the short term. It MAY be used in many + * cryptographic protocols, however, so long as one remembers that this + * (like everything else on-chain) it is public. For example, it can be + * used where a number is needed that cannot have been chosen by an + * adversary, for purposes such as public-coin zero-knowledge proofs. + */ + Randomness: StorageDescriptor<[], FixedSizeBinary<32>, false, never>; + /** + * Pending epoch configuration change that will be applied when the next epoch is enacted. + */ + PendingEpochConfigChange: StorageDescriptor<[], BabeDigestsNextConfigDescriptor, true, never>; + /** + * Next epoch randomness. + */ + NextRandomness: StorageDescriptor<[], FixedSizeBinary<32>, false, never>; + /** + * Next epoch authorities. + */ + NextAuthorities: StorageDescriptor<[], Anonymize, false, never>; + /** + * Randomness under construction. + * + * We make a trade-off between storage accesses and list length. + * We store the under-construction randomness in segments of up to + * `UNDER_CONSTRUCTION_SEGMENT_LENGTH`. + * + * Once a segment reaches this length, we begin the next one. + * We reset all segments and return to `0` at the beginning of every + * epoch. + */ + SegmentIndex: StorageDescriptor<[], number, false, never>; + /** + * TWOX-NOTE: `SegmentIndex` is an increasing integer, so this is okay. + */ + UnderConstruction: StorageDescriptor<[Key: number], Anonymize, false, never>; + /** + * Temporary value (cleared at block finalization) which is `Some` + * if per-block initialization has already been called for current block. + */ + Initialized: StorageDescriptor<[], Anonymize, true, never>; + /** + * This field should always be populated during block processing unless + * secondary plain slots are enabled (which don't contain a VRF output). + * + * It is set in `on_finalize`, before it will contain the value from the last block. + */ + AuthorVrfRandomness: StorageDescriptor<[], Anonymize, false, never>; + /** + * The block numbers when the last and current epoch have started, respectively `N-1` and + * `N`. + * NOTE: We track this is in order to annotate the block number when a given pool of + * entropy was fixed (i.e. it was known to chain observers). Since epochs are defined in + * slots, which may be skipped, the block numbers may not line up with the slot numbers. + */ + EpochStart: StorageDescriptor<[], Anonymize, false, never>; + /** + * How late the current block is compared to its parent. + * + * This entry is populated as part of block execution and is cleaned up + * on block finalization. Querying this storage entry outside of block + * execution context should always yield zero. + */ + Lateness: StorageDescriptor<[], number, false, never>; + /** + * The configuration for the current epoch. Should never be `None` as it is initialized in + * genesis. + */ + EpochConfig: StorageDescriptor<[], Anonymize, true, never>; + /** + * The configuration for the next epoch, `None` if the config will not change + * (you can fallback to `EpochConfig` instead in that case). + */ + NextEpochConfig: StorageDescriptor<[], Anonymize, true, never>; + /** + * A list of the last 100 skipped epochs and the corresponding session index + * when the epoch was skipped. + * + * This is only used for validating equivocation proofs. An equivocation proof + * must contains a key-ownership proof for a given session, therefore we need a + * way to tie together sessions and epoch indices, i.e. we need to validate that + * a validator was the owner of a given key on a given session, and what the + * active epoch index was during that session. + */ + SkippedEpochs: StorageDescriptor<[], Anonymize, false, never>; + }; + Timestamp: { + /** + * The current time for the current block. + */ + Now: StorageDescriptor<[], bigint, false, never>; + /** + * Whether the timestamp has been updated in this block. + * + * This value is updated to `true` upon successful submission of a timestamp by a node. + * It is then checked at the end of each block execution in the `on_finalize` hook. + */ + DidUpdate: StorageDescriptor<[], boolean, false, never>; + }; + Indices: { + /** + * The lookup from index to account. + */ + Accounts: StorageDescriptor<[Key: number], Anonymize, true, never>; + }; + Balances: { + /** + * The total units issued in the system. + */ + TotalIssuance: StorageDescriptor<[], bigint, false, never>; + /** + * The total units of outstanding deactivated balance in the system. + */ + InactiveIssuance: StorageDescriptor<[], bigint, false, never>; + /** + * The Balances pallet example of storing the balance of an account. + * + * # Example + * + * ```nocompile + * impl pallet_balances::Config for Runtime { + * type AccountStore = StorageMapShim, frame_system::Provider, AccountId, Self::AccountData> + * } + * ``` + * + * You can also store the balance of an account in the `System` pallet. + * + * # Example + * + * ```nocompile + * impl pallet_balances::Config for Runtime { + * type AccountStore = System + * } + * ``` + * + * But this comes with tradeoffs, storing account balances in the system pallet stores + * `frame_system` data alongside the account data contrary to storing account balances in the + * `Balances` pallet, which uses a `StorageMap` to store balances data only. + * NOTE: This is only used in the case that this pallet is used to store balances. + */ + Account: StorageDescriptor<[Key: SS58String], Anonymize, false, never>; + /** + * Any liquidity locks on some account balances. + * NOTE: Should only be accessed when setting, changing and freeing a lock. + * + * Use of locks is deprecated in favour of freezes. See `https://github.com/paritytech/substrate/pull/12951/` + */ + Locks: StorageDescriptor<[Key: SS58String], Anonymize, false, never>; + /** + * Named reserves on some account balances. + * + * Use of reserves is deprecated in favour of holds. See `https://github.com/paritytech/substrate/pull/12951/` + */ + Reserves: StorageDescriptor<[Key: SS58String], Anonymize, false, never>; + /** + * Holds on account balances. + */ + Holds: StorageDescriptor<[Key: SS58String], Anonymize, false, never>; + /** + * Freeze locks on account balances. + */ + Freezes: StorageDescriptor<[Key: SS58String], Anonymize, false, never>; + }; + TransactionPayment: { + /** + + */ + NextFeeMultiplier: StorageDescriptor<[], bigint, false, never>; + /** + + */ + StorageVersion: StorageDescriptor<[], TransactionPaymentReleases, false, never>; + }; + Authorship: { + /** + * Author of current block. + */ + Author: StorageDescriptor<[], SS58String, true, never>; + }; + Staking: { + /** + * The ideal number of active validators. + */ + ValidatorCount: StorageDescriptor<[], number, false, never>; + /** + * Minimum number of staking participants before emergency conditions are imposed. + */ + MinimumValidatorCount: StorageDescriptor<[], number, false, never>; + /** + * Any validators that may never be slashed or forcibly kicked. It's a Vec since they're + * easy to initialize and the performance hit is minimal (we expect no more than four + * invulnerables) and restricted to testnets. + */ + Invulnerables: StorageDescriptor<[], Anonymize, false, never>; + /** + * Map from all locked "stash" accounts to the controller account. + * + * TWOX-NOTE: SAFE since `AccountId` is a secure hash. + */ + Bonded: StorageDescriptor<[Key: SS58String], SS58String, true, never>; + /** + * The minimum active bond to become and maintain the role of a nominator. + */ + MinNominatorBond: StorageDescriptor<[], bigint, false, never>; + /** + * The minimum active bond to become and maintain the role of a validator. + */ + MinValidatorBond: StorageDescriptor<[], bigint, false, never>; + /** + * The minimum active nominator stake of the last successful election. + */ + MinimumActiveStake: StorageDescriptor<[], bigint, false, never>; + /** + * The minimum amount of commission that validators can set. + * + * If set to `0`, no limit exists. + */ + MinCommission: StorageDescriptor<[], number, false, never>; + /** + * Map from all (unlocked) "controller" accounts to the info regarding the staking. + * + * Note: All the reads and mutations to this storage *MUST* be done through the methods exposed + * by [`StakingLedger`] to ensure data and lock consistency. + */ + Ledger: StorageDescriptor<[Key: SS58String], Anonymize, true, never>; + /** + * Where the reward payment should be made. Keyed by stash. + * + * TWOX-NOTE: SAFE since `AccountId` is a secure hash. + */ + Payee: StorageDescriptor<[Key: SS58String], StakingRewardDestination, true, never>; + /** + * The map from (wannabe) validator stash key to the preferences of that validator. + * + * TWOX-NOTE: SAFE since `AccountId` is a secure hash. + */ + Validators: StorageDescriptor<[Key: SS58String], Anonymize, false, never>; + /** + *Counter for the related counted storage map + */ + CounterForValidators: StorageDescriptor<[], number, false, never>; + /** + * The maximum validator count before we stop allowing new validators to join. + * + * When this value is not set, no limits are enforced. + */ + MaxValidatorsCount: StorageDescriptor<[], number, true, never>; + /** + * The map from nominator stash key to their nomination preferences, namely the validators that + * they wish to support. + * + * Note that the keys of this storage map might become non-decodable in case the + * account's [`NominationsQuota::MaxNominations`] configuration is decreased. + * In this rare case, these nominators + * are still existent in storage, their key is correct and retrievable (i.e. `contains_key` + * indicates that they exist), but their value cannot be decoded. Therefore, the non-decodable + * nominators will effectively not-exist, until they re-submit their preferences such that it + * is within the bounds of the newly set `Config::MaxNominations`. + * + * This implies that `::iter_keys().count()` and `::iter().count()` might return different + * values for this map. Moreover, the main `::count()` is aligned with the former, namely the + * number of keys that exist. + * + * Lastly, if any of the nominators become non-decodable, they can be chilled immediately via + * [`Call::chill_other`] dispatchable by anyone. + * + * TWOX-NOTE: SAFE since `AccountId` is a secure hash. + */ + Nominators: StorageDescriptor<[Key: SS58String], Anonymize, true, never>; + /** + *Counter for the related counted storage map + */ + CounterForNominators: StorageDescriptor<[], number, false, never>; + /** + * Stakers whose funds are managed by other pallets. + * + * This pallet does not apply any locks on them, therefore they are only virtually bonded. They + * are expected to be keyless accounts and hence should not be allowed to mutate their ledger + * directly via this pallet. Instead, these accounts are managed by other pallets and accessed + * via low level apis. We keep track of them to do minimal integrity checks. + */ + VirtualStakers: StorageDescriptor<[Key: SS58String], undefined, true, never>; + /** + *Counter for the related counted storage map + */ + CounterForVirtualStakers: StorageDescriptor<[], number, false, never>; + /** + * The maximum nominator count before we stop allowing new validators to join. + * + * When this value is not set, no limits are enforced. + */ + MaxNominatorsCount: StorageDescriptor<[], number, true, never>; + /** + * The current era index. + * + * This is the latest planned era, depending on how the Session pallet queues the validator + * set, it might be active or not. + */ + CurrentEra: StorageDescriptor<[], number, true, never>; + /** + * The active era information, it holds index and start. + * + * The active era is the era being currently rewarded. Validator set of this era must be + * equal to [`SessionInterface::validators`]. + */ + ActiveEra: StorageDescriptor<[], Anonymize, true, never>; + /** + * The session index at which the era start for the last [`Config::HistoryDepth`] eras. + * + * Note: This tracks the starting session (i.e. session index when era start being active) + * for the eras in `[CurrentEra - HISTORY_DEPTH, CurrentEra]`. + */ + ErasStartSessionIndex: StorageDescriptor<[Key: number], number, true, never>; + /** + * Exposure of validator at era. + * + * This is keyed first by the era index to allow bulk deletion and then the stash account. + * + * Is it removed after [`Config::HistoryDepth`] eras. + * If stakers hasn't been set or has been removed then empty exposure is returned. + * + * Note: Deprecated since v14. Use `EraInfo` instead to work with exposures. + */ + ErasStakers: StorageDescriptor, Anonymize, false, never>; + /** + * Summary of validator exposure at a given era. + * + * This contains the total stake in support of the validator and their own stake. In addition, + * it can also be used to get the number of nominators backing this validator and the number of + * exposure pages they are divided into. The page count is useful to determine the number of + * pages of rewards that needs to be claimed. + * + * This is keyed first by the era index to allow bulk deletion and then the stash account. + * Should only be accessed through `EraInfo`. + * + * Is it removed after [`Config::HistoryDepth`] eras. + * If stakers hasn't been set or has been removed then empty overview is returned. + */ + ErasStakersOverview: StorageDescriptor, Anonymize, true, never>; + /** + * Clipped Exposure of validator at era. + * + * Note: This is deprecated, should be used as read-only and will be removed in the future. + * New `Exposure`s are stored in a paged manner in `ErasStakersPaged` instead. + * + * This is similar to [`ErasStakers`] but number of nominators exposed is reduced to the + * `T::MaxExposurePageSize` biggest stakers. + * (Note: the field `total` and `own` of the exposure remains unchanged). + * This is used to limit the i/o cost for the nominator payout. + * + * This is keyed fist by the era index to allow bulk deletion and then the stash account. + * + * It is removed after [`Config::HistoryDepth`] eras. + * If stakers hasn't been set or has been removed then empty exposure is returned. + * + * Note: Deprecated since v14. Use `EraInfo` instead to work with exposures. + */ + ErasStakersClipped: StorageDescriptor, Anonymize, false, never>; + /** + * Paginated exposure of a validator at given era. + * + * This is keyed first by the era index to allow bulk deletion, then stash account and finally + * the page. Should only be accessed through `EraInfo`. + * + * This is cleared after [`Config::HistoryDepth`] eras. + */ + ErasStakersPaged: StorageDescriptor, Anonymize, true, never>; + /** + * History of claimed paged rewards by era and validator. + * + * This is keyed by era and validator stash which maps to the set of page indexes which have + * been claimed. + * + * It is removed after [`Config::HistoryDepth`] eras. + */ + ClaimedRewards: StorageDescriptor, Anonymize, false, never>; + /** + * Similar to `ErasStakers`, this holds the preferences of validators. + * + * This is keyed first by the era index to allow bulk deletion and then the stash account. + * + * Is it removed after [`Config::HistoryDepth`] eras. + */ + ErasValidatorPrefs: StorageDescriptor, Anonymize, false, never>; + /** + * The total validator era payout for the last [`Config::HistoryDepth`] eras. + * + * Eras that haven't finished yet or has been removed doesn't have reward. + */ + ErasValidatorReward: StorageDescriptor<[Key: number], bigint, true, never>; + /** + * Rewards for the last [`Config::HistoryDepth`] eras. + * If reward hasn't been set or has been removed then 0 reward is returned. + */ + ErasRewardPoints: StorageDescriptor<[Key: number], Anonymize, false, never>; + /** + * The total amount staked for the last [`Config::HistoryDepth`] eras. + * If total hasn't been set or has been removed then 0 stake is returned. + */ + ErasTotalStake: StorageDescriptor<[Key: number], bigint, false, never>; + /** + * Mode of era forcing. + */ + ForceEra: StorageDescriptor<[], StakingForcing, false, never>; + /** + * Maximum staked rewards, i.e. the percentage of the era inflation that + * is used for stake rewards. + * See [Era payout](./index.html#era-payout). + */ + MaxStakedRewards: StorageDescriptor<[], number, true, never>; + /** + * The percentage of the slash that is distributed to reporters. + * + * The rest of the slashed value is handled by the `Slash`. + */ + SlashRewardFraction: StorageDescriptor<[], number, false, never>; + /** + * The amount of currency given to reporters of a slash event which was + * canceled by extraordinary circumstances (e.g. governance). + */ + CanceledSlashPayout: StorageDescriptor<[], bigint, false, never>; + /** + * All unapplied slashes that are queued for later. + */ + UnappliedSlashes: StorageDescriptor<[Key: number], Anonymize, false, never>; + /** + * A mapping from still-bonded eras to the first session index of that era. + * + * Must contains information for eras for the range: + * `[active_era - bounding_duration; active_era]` + */ + BondedEras: StorageDescriptor<[], Anonymize, false, never>; + /** + * All slashing events on validators, mapped by era to the highest slash proportion + * and slash value of the era. + */ + ValidatorSlashInEra: StorageDescriptor, Anonymize, true, never>; + /** + * All slashing events on nominators, mapped by era to the highest slash value of the era. + */ + NominatorSlashInEra: StorageDescriptor, bigint, true, never>; + /** + * Slashing spans for stash accounts. + */ + SlashingSpans: StorageDescriptor<[Key: SS58String], Anonymize, true, never>; + /** + * Records information about the maximum slash of a stash within a slashing span, + * as well as how much reward has been paid out. + */ + SpanSlash: StorageDescriptor<[Key: Anonymize], Anonymize, false, never>; + /** + * The last planned session scheduled by the session pallet. + * + * This is basically in sync with the call to [`pallet_session::SessionManager::new_session`]. + */ + CurrentPlannedSession: StorageDescriptor<[], number, false, never>; + /** + * Indices of validators that have offended in the active era. The offenders are disabled for a + * whole era. For this reason they are kept here - only staking pallet knows about eras. The + * implementor of [`DisablingStrategy`] defines if a validator should be disabled which + * implicitly means that the implementor also controls the max number of disabled validators. + * + * The vec is always kept sorted so that we can find whether a given validator has previously + * offended using binary search. + */ + DisabledValidators: StorageDescriptor<[], Anonymize, false, never>; + /** + * The threshold for when users can start calling `chill_other` for other validators / + * nominators. The threshold is compared to the actual number of validators / nominators + * (`CountFor*`) in the system compared to the configured max (`Max*Count`). + */ + ChillThreshold: StorageDescriptor<[], number, true, never>; + }; + Offences: { + /** + * The primary structure that holds all offence records keyed by report identifiers. + */ + Reports: StorageDescriptor<[Key: FixedSizeBinary<32>], Anonymize, true, never>; + /** + * A vector of reports of the same kind that happened at the same time slot. + */ + ConcurrentReportsIndex: StorageDescriptor, Anonymize, false, never>; + }; + Historical: { + /** + * Mapping from historical session indices to session-data root hash and validator count. + */ + HistoricalSessions: StorageDescriptor<[Key: number], Anonymize, true, never>; + /** + * The range of historical sessions we store. [first, last) + */ + StoredRange: StorageDescriptor<[], Anonymize, true, never>; + }; + Session: { + /** + * The current set of validators. + */ + Validators: StorageDescriptor<[], Anonymize, false, never>; + /** + * Current index of the session. + */ + CurrentIndex: StorageDescriptor<[], number, false, never>; + /** + * True if the underlying economic identities or weighting behind the validators + * has changed in the queued validator set. + */ + QueuedChanged: StorageDescriptor<[], boolean, false, never>; + /** + * The queued keys for the next session. When the next session begins, these keys + * will be used to determine the validator's session keys. + */ + QueuedKeys: StorageDescriptor<[], Anonymize, false, never>; + /** + * Indices of disabled validators. + * + * The vec is always kept sorted so that we can find whether a given validator is + * disabled using binary search. It gets cleared when `on_session_ending` returns + * a new set of identities. + */ + DisabledValidators: StorageDescriptor<[], Anonymize, false, never>; + /** + * The next session keys for a validator. + */ + NextKeys: StorageDescriptor<[Key: SS58String], Anonymize, true, never>; + /** + * The owner of a key. The key is the `KeyTypeId` + the encoded key. + */ + KeyOwner: StorageDescriptor<[Key: Anonymize], SS58String, true, never>; + }; + Grandpa: { + /** + * State of the current authority set. + */ + State: StorageDescriptor<[], GrandpaStoredState, false, never>; + /** + * Pending change: (signaled at, scheduled change). + */ + PendingChange: StorageDescriptor<[], Anonymize, true, never>; + /** + * next block number where we can force a change. + */ + NextForced: StorageDescriptor<[], number, true, never>; + /** + * `true` if we are currently stalled. + */ + Stalled: StorageDescriptor<[], Anonymize, true, never>; + /** + * The number of changes (both in terms of keys and underlying economic responsibilities) + * in the "set" of Grandpa validators from genesis. + */ + CurrentSetId: StorageDescriptor<[], bigint, false, never>; + /** + * A mapping from grandpa set ID to the index of the *most recent* session for which its + * members were responsible. + * + * This is only used for validating equivocation proofs. An equivocation proof must + * contains a key-ownership proof for a given session, therefore we need a way to tie + * together sessions and GRANDPA set ids, i.e. we need to validate that a validator + * was the owner of a given key on a given session, and what the active set ID was + * during that session. + * + * TWOX-NOTE: `SetId` is not under user control. + */ + SetIdSession: StorageDescriptor<[Key: bigint], number, true, never>; + /** + * The current list of authorities. + */ + Authorities: StorageDescriptor<[], Anonymize, false, never>; + }; + AuthorityDiscovery: { + /** + * Keys of the current authority set. + */ + Keys: StorageDescriptor<[], Anonymize, false, never>; + /** + * Keys of the next authority set. + */ + NextKeys: StorageDescriptor<[], Anonymize, false, never>; + }; + Treasury: { + /** + * Number of proposals that have been made. + */ + ProposalCount: StorageDescriptor<[], number, false, never>; + /** + * Proposals that have been made. + */ + Proposals: StorageDescriptor<[Key: number], Anonymize, true, never>; + /** + * The amount which has been reported as inactive to Currency. + */ + Deactivated: StorageDescriptor<[], bigint, false, never>; + /** + * Proposal indices that have been approved but not yet awarded. + */ + Approvals: StorageDescriptor<[], Anonymize, false, never>; + /** + * The count of spends that have been made. + */ + SpendCount: StorageDescriptor<[], number, false, never>; + /** + * Spends that have been approved and being processed. + */ + Spends: StorageDescriptor<[Key: number], Anonymize, true, never>; + }; + ConvictionVoting: { + /** + * All voting for a particular voter in a particular voting class. We store the balance for the + * number of votes that we have recorded. + */ + VotingFor: StorageDescriptor, ConvictionVotingVoteVoting, false, never>; + /** + * The voting classes which have a non-zero lock requirement and the lock amounts which they + * require. The actual amount locked on behalf of this pallet should always be the maximum of + * this list. + */ + ClassLocksFor: StorageDescriptor<[Key: SS58String], Anonymize, false, never>; + }; + Referenda: { + /** + * The next free referendum index, aka the number of referenda started so far. + */ + ReferendumCount: StorageDescriptor<[], number, false, never>; + /** + * Information concerning any given referendum. + */ + ReferendumInfoFor: StorageDescriptor<[Key: number], Anonymize, true, never>; + /** + * The sorted list of referenda ready to be decided but not yet being decided, ordered by + * conviction-weighted approvals. + * + * This should be empty if `DecidingCount` is less than `TrackInfo::max_deciding`. + */ + TrackQueue: StorageDescriptor<[Key: number], Anonymize, false, never>; + /** + * The number of referenda being decided currently. + */ + DecidingCount: StorageDescriptor<[Key: number], number, false, never>; + /** + * The metadata is a general information concerning the referendum. + * The `Hash` refers to the preimage of the `Preimages` provider which can be a JSON + * dump or IPFS hash of a JSON file. + * + * Consider a garbage collection for a metadata of finished referendums to `unrequest` (remove) + * large preimages. + */ + MetadataOf: StorageDescriptor<[Key: number], FixedSizeBinary<32>, true, never>; + }; + Whitelist: { + /** + + */ + WhitelistedCall: StorageDescriptor<[Key: FixedSizeBinary<32>], undefined, true, never>; + }; + Parameters: { + /** + * Stored parameters. + */ + Parameters: StorageDescriptor<[Key: Anonymize], Anonymize, true, never>; + }; + Claims: { + /** + + */ + Claims: StorageDescriptor<[Key: FixedSizeBinary<20>], bigint, true, never>; + /** + + */ + Total: StorageDescriptor<[], bigint, false, never>; + /** + * Vesting schedule for a claim. + * First balance is the total amount that should be held for vesting. + * Second balance is how much should be unlocked per block. + * The block number is when the vesting should start. + */ + Vesting: StorageDescriptor<[Key: FixedSizeBinary<20>], Anonymize, true, never>; + /** + * The statement kind that must be signed, if any. + */ + Signing: StorageDescriptor<[Key: FixedSizeBinary<20>], ClaimsStatementKind, true, never>; + /** + * Pre-claimed Ethereum accounts, by the Account ID that they are claimed to. + */ + Preclaims: StorageDescriptor<[Key: SS58String], FixedSizeBinary<20>, true, never>; + }; + Vesting: { + /** + * Information regarding the vesting of a given account. + */ + Vesting: StorageDescriptor<[Key: SS58String], Anonymize, true, never>; + /** + * Storage version of the pallet. + * + * New networks start with latest version, as determined by the genesis build. + */ + StorageVersion: StorageDescriptor<[], Version, false, never>; + }; + Proxy: { + /** + * The set of account proxies. Maps the account which has delegated to the accounts + * which are being delegated to, together with the amount held on deposit. + */ + Proxies: StorageDescriptor<[Key: SS58String], Anonymize, false, never>; + /** + * The announcements made by the proxy (key). + */ + Announcements: StorageDescriptor<[Key: SS58String], Anonymize, false, never>; + }; + Multisig: { + /** + * The set of open multisig operations. + */ + Multisigs: StorageDescriptor, Anonymize, true, never>; + }; + Bounties: { + /** + * Number of bounty proposals that have been made. + */ + BountyCount: StorageDescriptor<[], number, false, never>; + /** + * Bounties that have been made. + */ + Bounties: StorageDescriptor<[Key: number], Anonymize, true, never>; + /** + * The description of each bounty. + */ + BountyDescriptions: StorageDescriptor<[Key: number], Binary, true, never>; + /** + * Bounty indices that have been approved but not yet funded. + */ + BountyApprovals: StorageDescriptor<[], Anonymize, false, never>; + }; + ChildBounties: { + /** + * Number of total child bounties. + */ + ChildBountyCount: StorageDescriptor<[], number, false, never>; + /** + * Number of child bounties per parent bounty. + * Map of parent bounty index to number of child bounties. + */ + ParentChildBounties: StorageDescriptor<[Key: number], number, false, never>; + /** + * Child bounties that have been added. + */ + ChildBounties: StorageDescriptor, Anonymize, true, never>; + /** + * The description of each child-bounty. + */ + ChildBountyDescriptions: StorageDescriptor<[Key: number], Binary, true, never>; + /** + * The cumulative child-bounty curator fee for each parent bounty. + */ + ChildrenCuratorFees: StorageDescriptor<[Key: number], bigint, false, never>; + }; + ElectionProviderMultiPhase: { + /** + * Internal counter for the number of rounds. + * + * This is useful for de-duplication of transactions submitted to the pool, and general + * diagnostics of the pallet. + * + * This is merely incremented once per every time that an upstream `elect` is called. + */ + Round: StorageDescriptor<[], number, false, never>; + /** + * Current phase. + */ + CurrentPhase: StorageDescriptor<[], ElectionProviderMultiPhasePhase, false, never>; + /** + * Current best solution, signed or unsigned, queued to be returned upon `elect`. + * + * Always sorted by score. + */ + QueuedSolution: StorageDescriptor<[], Anonymize, true, never>; + /** + * Snapshot data of the round. + * + * This is created at the beginning of the signed phase and cleared upon calling `elect`. + * Note: This storage type must only be mutated through [`SnapshotWrapper`]. + */ + Snapshot: StorageDescriptor<[], Anonymize, true, never>; + /** + * Desired number of targets to elect for this round. + * + * Only exists when [`Snapshot`] is present. + * Note: This storage type must only be mutated through [`SnapshotWrapper`]. + */ + DesiredTargets: StorageDescriptor<[], number, true, never>; + /** + * The metadata of the [`RoundSnapshot`] + * + * Only exists when [`Snapshot`] is present. + * Note: This storage type must only be mutated through [`SnapshotWrapper`]. + */ + SnapshotMetadata: StorageDescriptor<[], Anonymize, true, never>; + /** + * The next index to be assigned to an incoming signed submission. + * + * Every accepted submission is assigned a unique index; that index is bound to that particular + * submission for the duration of the election. On election finalization, the next index is + * reset to 0. + * + * We can't just use `SignedSubmissionIndices.len()`, because that's a bounded set; past its + * capacity, it will simply saturate. We can't just iterate over `SignedSubmissionsMap`, + * because iteration is slow. Instead, we store the value here. + */ + SignedSubmissionNextIndex: StorageDescriptor<[], number, false, never>; + /** + * A sorted, bounded vector of `(score, block_number, index)`, where each `index` points to a + * value in `SignedSubmissions`. + * + * We never need to process more than a single signed submission at a time. Signed submissions + * can be quite large, so we're willing to pay the cost of multiple database accesses to access + * them one at a time instead of reading and decoding all of them at once. + */ + SignedSubmissionIndices: StorageDescriptor<[], Anonymize, false, never>; + /** + * Unchecked, signed solutions. + * + * Together with `SubmissionIndices`, this stores a bounded set of `SignedSubmissions` while + * allowing us to keep only a single one in memory at a time. + * + * Twox note: the key of the map is an auto-incrementing index which users cannot inspect or + * affect; we shouldn't need a cryptographically secure hasher. + */ + SignedSubmissionsMap: StorageDescriptor<[Key: number], Anonymize, true, never>; + /** + * The minimum score that each 'untrusted' solution must attain in order to be considered + * feasible. + * + * Can be set via `set_minimum_untrusted_score`. + */ + MinimumUntrustedScore: StorageDescriptor<[], Anonymize, true, never>; + }; + VoterList: { + /** + * A single node, within some bag. + * + * Nodes store links forward and back within their respective bags. + */ + ListNodes: StorageDescriptor<[Key: SS58String], Anonymize, true, never>; + /** + *Counter for the related counted storage map + */ + CounterForListNodes: StorageDescriptor<[], number, false, never>; + /** + * A bag stored in storage. + * + * Stores a `Bag` struct, which stores head and tail pointers to itself. + */ + ListBags: StorageDescriptor<[Key: bigint], Anonymize, true, never>; + }; + NominationPools: { + /** + * The sum of funds across all pools. + * + * This might be lower but never higher than the sum of `total_balance` of all [`PoolMembers`] + * because calling `pool_withdraw_unbonded` might decrease the total stake of the pool's + * `bonded_account` without adjusting the pallet-internal `UnbondingPool`'s. + */ + TotalValueLocked: StorageDescriptor<[], bigint, false, never>; + /** + * Minimum amount to bond to join a pool. + */ + MinJoinBond: StorageDescriptor<[], bigint, false, never>; + /** + * Minimum bond required to create a pool. + * + * This is the amount that the depositor must put as their initial stake in the pool, as an + * indication of "skin in the game". + * + * This is the value that will always exist in the staking ledger of the pool bonded account + * while all other accounts leave. + */ + MinCreateBond: StorageDescriptor<[], bigint, false, never>; + /** + * Maximum number of nomination pools that can exist. If `None`, then an unbounded number of + * pools can exist. + */ + MaxPools: StorageDescriptor<[], number, true, never>; + /** + * Maximum number of members that can exist in the system. If `None`, then the count + * members are not bound on a system wide basis. + */ + MaxPoolMembers: StorageDescriptor<[], number, true, never>; + /** + * Maximum number of members that may belong to pool. If `None`, then the count of + * members is not bound on a per pool basis. + */ + MaxPoolMembersPerPool: StorageDescriptor<[], number, true, never>; + /** + * The maximum commission that can be charged by a pool. Used on commission payouts to bound + * pool commissions that are > `GlobalMaxCommission`, necessary if a future + * `GlobalMaxCommission` is lower than some current pool commissions. + */ + GlobalMaxCommission: StorageDescriptor<[], number, true, never>; + /** + * Active members. + * + * TWOX-NOTE: SAFE since `AccountId` is a secure hash. + */ + PoolMembers: StorageDescriptor<[Key: SS58String], Anonymize, true, never>; + /** + *Counter for the related counted storage map + */ + CounterForPoolMembers: StorageDescriptor<[], number, false, never>; + /** + * Storage for bonded pools. + */ + BondedPools: StorageDescriptor<[Key: number], Anonymize, true, never>; + /** + *Counter for the related counted storage map + */ + CounterForBondedPools: StorageDescriptor<[], number, false, never>; + /** + * Reward pools. This is where there rewards for each pool accumulate. When a members payout is + * claimed, the balance comes out of the reward pool. Keyed by the bonded pools account. + */ + RewardPools: StorageDescriptor<[Key: number], Anonymize, true, never>; + /** + *Counter for the related counted storage map + */ + CounterForRewardPools: StorageDescriptor<[], number, false, never>; + /** + * Groups of unbonding pools. Each group of unbonding pools belongs to a + * bonded pool, hence the name sub-pools. Keyed by the bonded pools account. + */ + SubPoolsStorage: StorageDescriptor<[Key: number], Anonymize, true, never>; + /** + *Counter for the related counted storage map + */ + CounterForSubPoolsStorage: StorageDescriptor<[], number, false, never>; + /** + * Metadata for the pool. + */ + Metadata: StorageDescriptor<[Key: number], Binary, false, never>; + /** + *Counter for the related counted storage map + */ + CounterForMetadata: StorageDescriptor<[], number, false, never>; + /** + * Ever increasing number of all pools created so far. + */ + LastPoolId: StorageDescriptor<[], number, false, never>; + /** + * A reverse lookup from the pool's account id to its id. + * + * This is only used for slashing and on automatic withdraw update. In all other instances, the + * pool id is used, and the accounts are deterministically derived from it. + */ + ReversePoolIdLookup: StorageDescriptor<[Key: SS58String], number, true, never>; + /** + *Counter for the related counted storage map + */ + CounterForReversePoolIdLookup: StorageDescriptor<[], number, false, never>; + /** + * Map from a pool member account to their opted claim permission. + */ + ClaimPermissions: StorageDescriptor<[Key: SS58String], NominationPoolsClaimPermission, false, never>; + }; + FastUnstake: { + /** + * The current "head of the queue" being unstaked. + * + * The head in itself can be a batch of up to [`Config::BatchSize`] stakers. + */ + Head: StorageDescriptor<[], Anonymize, true, never>; + /** + * The map of all accounts wishing to be unstaked. + * + * Keeps track of `AccountId` wishing to unstake and it's corresponding deposit. + */ + Queue: StorageDescriptor<[Key: SS58String], bigint, true, never>; + /** + *Counter for the related counted storage map + */ + CounterForQueue: StorageDescriptor<[], number, false, never>; + /** + * Number of eras to check per block. + * + * If set to 0, this pallet does absolutely nothing. Cannot be set to more than + * [`Config::MaxErasToCheckPerBlock`]. + * + * Based on the amount of weight available at [`Pallet::on_idle`], up to this many eras are + * checked. The checking is represented by updating [`UnstakeRequest::checked`], which is + * stored in [`Head`]. + */ + ErasToCheckPerBlock: StorageDescriptor<[], number, false, never>; + }; + Configuration: { + /** + * The active configuration for the current session. + */ + ActiveConfig: StorageDescriptor<[], Anonymize, false, never>; + /** + * Pending configuration changes. + * + * This is a list of configuration changes, each with a session index at which it should + * be applied. + * + * The list is sorted ascending by session index. Also, this list can only contain at most + * 2 items: for the next session and for the `scheduled_session`. + */ + PendingConfigs: StorageDescriptor<[], Anonymize, false, never>; + /** + * If this is set, then the configuration setters will bypass the consistency checks. This + * is meant to be used only as the last resort. + */ + BypassConsistencyCheck: StorageDescriptor<[], boolean, false, never>; + }; + ParasShared: { + /** + * The current session index. + */ + CurrentSessionIndex: StorageDescriptor<[], number, false, never>; + /** + * All the validators actively participating in parachain consensus. + * Indices are into the broader validator set. + */ + ActiveValidatorIndices: StorageDescriptor<[], Anonymize, false, never>; + /** + * The parachain attestation keys of the validators actively participating in parachain + * consensus. This should be the same length as `ActiveValidatorIndices`. + */ + ActiveValidatorKeys: StorageDescriptor<[], Anonymize, false, never>; + /** + * All allowed relay-parents. + */ + AllowedRelayParents: StorageDescriptor<[], Anonymize, false, never>; + }; + ParaInclusion: { + /** + * Candidates pending availability by `ParaId`. They form a chain starting from the latest + * included head of the para. + * Use a different prefix post-migration to v1, since the v0 `PendingAvailability` storage + * would otherwise have the exact same prefix which could cause undefined behaviour when doing + * the migration. + */ + V1: StorageDescriptor<[Key: number], Anonymize, true, never>; + }; + ParaInherent: { + /** + * Whether the paras inherent was included within this block. + * + * The `Option<()>` is effectively a `bool`, but it never hits storage in the `None` variant + * due to the guarantees of FRAME's storage APIs. + * + * If this is `None` at the end of the block, we panic and render the block invalid. + */ + Included: StorageDescriptor<[], undefined, true, never>; + /** + * Scraped on chain data for extracting resolved disputes as well as backing votes. + */ + OnChainVotes: StorageDescriptor<[], Anonymize, true, never>; + }; + ParaScheduler: { + /** + * All the validator groups. One for each core. Indices are into `ActiveValidators` - not the + * broader set of Polkadot validators, but instead just the subset used for parachains during + * this session. + * + * Bound: The number of cores is the sum of the numbers of parachains and parathread + * multiplexers. Reasonably, 100-1000. The dominant factor is the number of validators: safe + * upper bound at 10k. + */ + ValidatorGroups: StorageDescriptor<[], Anonymize, false, never>; + /** + * One entry for each availability core. The i'th parachain belongs to the i'th core, with the + * remaining cores all being on demand parachain multiplexers. + * + * Bounded by the maximum of either of these two values: + * * The number of parachains and parathread multiplexers + * * The number of validators divided by `configuration.max_validators_per_core`. + */ + AvailabilityCores: StorageDescriptor<[], Anonymize, false, never>; + /** + * The block number where the session start occurred. Used to track how many group rotations + * have occurred. + * + * Note that in the context of parachains modules the session change is signaled during + * the block and enacted at the end of the block (at the finalization stage, to be exact). + * Thus for all intents and purposes the effect of the session change is observed at the + * block following the session change, block number of which we save in this storage value. + */ + SessionStartBlock: StorageDescriptor<[], number, false, never>; + /** + * One entry for each availability core. The `VecDeque` represents the assignments to be + * scheduled on that core. The value contained here will not be valid after the end of + * a block. Runtime APIs should be used to determine scheduled cores for the upcoming block. + */ + ClaimQueue: StorageDescriptor<[], Anonymize, false, never>; + }; + Paras: { + /** + * All currently active PVF pre-checking votes. + * + * Invariant: + * - There are no PVF pre-checking votes that exists in list but not in the set and vice versa. + */ + PvfActiveVoteMap: StorageDescriptor<[Key: FixedSizeBinary<32>], Anonymize, true, never>; + /** + * The list of all currently active PVF votes. Auxiliary to `PvfActiveVoteMap`. + */ + PvfActiveVoteList: StorageDescriptor<[], Anonymize, false, never>; + /** + * All lease holding parachains. Ordered ascending by `ParaId`. On demand parachains are not + * included. + * + * Consider using the [`ParachainsCache`] type of modifying. + */ + Parachains: StorageDescriptor<[], Anonymize, false, never>; + /** + * The current lifecycle of a all known Para IDs. + */ + ParaLifecycles: StorageDescriptor<[Key: number], ParachainsParasParaLifecycle, true, never>; + /** + * The head-data of every registered para. + */ + Heads: StorageDescriptor<[Key: number], Binary, true, never>; + /** + * The context (relay-chain block number) of the most recent parachain head. + */ + MostRecentContext: StorageDescriptor<[Key: number], number, true, never>; + /** + * The validation code hash of every live para. + * + * Corresponding code can be retrieved with [`CodeByHash`]. + */ + CurrentCodeHash: StorageDescriptor<[Key: number], FixedSizeBinary<32>, true, never>; + /** + * Actual past code hash, indicated by the para id as well as the block number at which it + * became outdated. + * + * Corresponding code can be retrieved with [`CodeByHash`]. + */ + PastCodeHash: StorageDescriptor<[Key: Anonymize], FixedSizeBinary<32>, true, never>; + /** + * Past code of parachains. The parachains themselves may not be registered anymore, + * but we also keep their code on-chain for the same amount of time as outdated code + * to keep it available for approval checkers. + */ + PastCodeMeta: StorageDescriptor<[Key: number], Anonymize, false, never>; + /** + * Which paras have past code that needs pruning and the relay-chain block at which the code + * was replaced. Note that this is the actual height of the included block, not the expected + * height at which the code upgrade would be applied, although they may be equal. + * This is to ensure the entire acceptance period is covered, not an offset acceptance period + * starting from the time at which the parachain perceives a code upgrade as having occurred. + * Multiple entries for a single para are permitted. Ordered ascending by block number. + */ + PastCodePruning: StorageDescriptor<[], Anonymize, false, never>; + /** + * The block number at which the planned code change is expected for a parachain. + * + * The change will be applied after the first parablock for this ID included which executes + * in the context of a relay chain block with a number >= `expected_at`. + */ + FutureCodeUpgrades: StorageDescriptor<[Key: number], number, true, never>; + /** + * The list of upcoming future code upgrades. + * + * Each item is a pair of the parachain and the expected block at which the upgrade should be + * applied. The upgrade will be applied at the given relay chain block. In contrast to + * [`FutureCodeUpgrades`] this code upgrade will be applied regardless the parachain making any + * progress or not. + * + * Ordered ascending by block number. + */ + FutureCodeUpgradesAt: StorageDescriptor<[], Anonymize, false, never>; + /** + * The actual future code hash of a para. + * + * Corresponding code can be retrieved with [`CodeByHash`]. + */ + FutureCodeHash: StorageDescriptor<[Key: number], FixedSizeBinary<32>, true, never>; + /** + * This is used by the relay-chain to communicate to a parachain a go-ahead with in the upgrade + * procedure. + * + * This value is absent when there are no upgrades scheduled or during the time the relay chain + * performs the checks. It is set at the first relay-chain block when the corresponding + * parachain can switch its upgrade function. As soon as the parachain's block is included, the + * value gets reset to `None`. + * + * NOTE that this field is used by parachains via merkle storage proofs, therefore changing + * the format will require migration of parachains. + */ + UpgradeGoAheadSignal: StorageDescriptor<[Key: number], UpgradeGoAhead, true, never>; + /** + * This is used by the relay-chain to communicate that there are restrictions for performing + * an upgrade for this parachain. + * + * This may be a because the parachain waits for the upgrade cooldown to expire. Another + * potential use case is when we want to perform some maintenance (such as storage migration) + * we could restrict upgrades to make the process simpler. + * + * NOTE that this field is used by parachains via merkle storage proofs, therefore changing + * the format will require migration of parachains. + */ + UpgradeRestrictionSignal: StorageDescriptor<[Key: number], UpgradeRestriction, true, never>; + /** + * The list of parachains that are awaiting for their upgrade restriction to cooldown. + * + * Ordered ascending by block number. + */ + UpgradeCooldowns: StorageDescriptor<[], Anonymize, false, never>; + /** + * The list of upcoming code upgrades. + * + * Each item is a pair of which para performs a code upgrade and at which relay-chain block it + * is expected at. + * + * Ordered ascending by block number. + */ + UpcomingUpgrades: StorageDescriptor<[], Anonymize, false, never>; + /** + * The actions to perform during the start of a specific session index. + */ + ActionsQueue: StorageDescriptor<[Key: number], Anonymize, false, never>; + /** + * Upcoming paras instantiation arguments. + * + * NOTE that after PVF pre-checking is enabled the para genesis arg will have it's code set + * to empty. Instead, the code will be saved into the storage right away via `CodeByHash`. + */ + UpcomingParasGenesis: StorageDescriptor<[Key: number], Anonymize, true, never>; + /** + * The number of reference on the validation code in [`CodeByHash`] storage. + */ + CodeByHashRefs: StorageDescriptor<[Key: FixedSizeBinary<32>], number, false, never>; + /** + * Validation code stored by its hash. + * + * This storage is consistent with [`FutureCodeHash`], [`CurrentCodeHash`] and + * [`PastCodeHash`]. + */ + CodeByHash: StorageDescriptor<[Key: FixedSizeBinary<32>], Binary, true, never>; + }; + Initializer: { + /** + * Whether the parachains modules have been initialized within this block. + * + * Semantically a `bool`, but this guarantees it should never hit the trie, + * as this is cleared in `on_finalize` and Frame optimizes `None` values to be empty values. + * + * As a `bool`, `set(false)` and `remove()` both lead to the next `get()` being false, but one + * of them writes to the trie and one does not. This confusion makes `Option<()>` more suitable + * for the semantics of this variable. + */ + HasInitialized: StorageDescriptor<[], undefined, true, never>; + /** + * Buffered session changes along with the block number at which they should be applied. + * + * Typically this will be empty or one element long. Apart from that this item never hits + * the storage. + * + * However this is a `Vec` regardless to handle various edge cases that may occur at runtime + * upgrade boundaries or if governance intervenes. + */ + BufferedSessionChanges: StorageDescriptor<[], Anonymize, false, never>; + }; + Dmp: { + /** + * The downward messages addressed for a certain para. + */ + DownwardMessageQueues: StorageDescriptor<[Key: number], Anonymize, false, never>; + /** + * A mapping that stores the downward message queue MQC head for each para. + * + * Each link in this chain has a form: + * `(prev_head, B, H(M))`, where + * - `prev_head`: is the previous head hash or zero if none. + * - `B`: is the relay-chain block number in which a message was appended. + * - `H(M)`: is the hash of the message being appended. + */ + DownwardMessageQueueHeads: StorageDescriptor<[Key: number], FixedSizeBinary<32>, false, never>; + /** + * The factor to multiply the base delivery fee by. + */ + DeliveryFeeFactor: StorageDescriptor<[Key: number], bigint, false, never>; + }; + Hrmp: { + /** + * The set of pending HRMP open channel requests. + * + * The set is accompanied by a list for iteration. + * + * Invariant: + * - There are no channels that exists in list but not in the set and vice versa. + */ + HrmpOpenChannelRequests: StorageDescriptor<[Key: Anonymize], Anonymize, true, never>; + /** + + */ + HrmpOpenChannelRequestsList: StorageDescriptor<[], Anonymize, false, never>; + /** + * This mapping tracks how many open channel requests are initiated by a given sender para. + * Invariant: `HrmpOpenChannelRequests` should contain the same number of items that has + * `(X, _)` as the number of `HrmpOpenChannelRequestCount` for `X`. + */ + HrmpOpenChannelRequestCount: StorageDescriptor<[Key: number], number, false, never>; + /** + * This mapping tracks how many open channel requests were accepted by a given recipient para. + * Invariant: `HrmpOpenChannelRequests` should contain the same number of items `(_, X)` with + * `confirmed` set to true, as the number of `HrmpAcceptedChannelRequestCount` for `X`. + */ + HrmpAcceptedChannelRequestCount: StorageDescriptor<[Key: number], number, false, never>; + /** + * A set of pending HRMP close channel requests that are going to be closed during the session + * change. Used for checking if a given channel is registered for closure. + * + * The set is accompanied by a list for iteration. + * + * Invariant: + * - There are no channels that exists in list but not in the set and vice versa. + */ + HrmpCloseChannelRequests: StorageDescriptor<[Key: Anonymize], undefined, true, never>; + /** + + */ + HrmpCloseChannelRequestsList: StorageDescriptor<[], Anonymize, false, never>; + /** + * The HRMP watermark associated with each para. + * Invariant: + * - each para `P` used here as a key should satisfy `Paras::is_valid_para(P)` within a + * session. + */ + HrmpWatermarks: StorageDescriptor<[Key: number], number, true, never>; + /** + * HRMP channel data associated with each para. + * Invariant: + * - each participant in the channel should satisfy `Paras::is_valid_para(P)` within a session. + */ + HrmpChannels: StorageDescriptor<[Key: Anonymize], Anonymize, true, never>; + /** + * Ingress/egress indexes allow to find all the senders and receivers given the opposite side. + * I.e. + * + * (a) ingress index allows to find all the senders for a given recipient. + * (b) egress index allows to find all the recipients for a given sender. + * + * Invariants: + * - for each ingress index entry for `P` each item `I` in the index should present in + * `HrmpChannels` as `(I, P)`. + * - for each egress index entry for `P` each item `E` in the index should present in + * `HrmpChannels` as `(P, E)`. + * - there should be no other dangling channels in `HrmpChannels`. + * - the vectors are sorted. + */ + HrmpIngressChannelsIndex: StorageDescriptor<[Key: number], Anonymize, false, never>; + /** + + */ + HrmpEgressChannelsIndex: StorageDescriptor<[Key: number], Anonymize, false, never>; + /** + * Storage for the messages for each channel. + * Invariant: cannot be non-empty if the corresponding channel in `HrmpChannels` is `None`. + */ + HrmpChannelContents: StorageDescriptor<[Key: Anonymize], Anonymize, false, never>; + /** + * Maintains a mapping that can be used to answer the question: What paras sent a message at + * the given block number for a given receiver. Invariants: + * - The inner `Vec` is never empty. + * - The inner `Vec` cannot store two same `ParaId`. + * - The outer vector is sorted ascending by block number and cannot store two items with the + * same block number. + */ + HrmpChannelDigests: StorageDescriptor<[Key: number], Anonymize, false, never>; + }; + ParaSessionInfo: { + /** + * Assignment keys for the current session. + * Note that this API is private due to it being prone to 'off-by-one' at session boundaries. + * When in doubt, use `Sessions` API instead. + */ + AssignmentKeysUnsafe: StorageDescriptor<[], Anonymize, false, never>; + /** + * The earliest session for which previous session info is stored. + */ + EarliestStoredSession: StorageDescriptor<[], number, false, never>; + /** + * Session information in a rolling window. + * Should have an entry in range `EarliestStoredSession..=CurrentSessionIndex`. + * Does not have any entries before the session index in the first session change notification. + */ + Sessions: StorageDescriptor<[Key: number], Anonymize, true, never>; + /** + * The validator account keys of the validators actively participating in parachain consensus. + */ + AccountKeys: StorageDescriptor<[Key: number], Anonymize, true, never>; + /** + * Executor parameter set for a given session index + */ + SessionExecutorParams: StorageDescriptor<[Key: number], Anonymize, true, never>; + }; + ParasDisputes: { + /** + * The last pruned session, if any. All data stored by this module + * references sessions. + */ + LastPrunedSession: StorageDescriptor<[], number, true, never>; + /** + * All ongoing or concluded disputes for the last several sessions. + */ + Disputes: StorageDescriptor, Anonymize, true, never>; + /** + * Backing votes stored for each dispute. + * This storage is used for slashing. + */ + BackersOnDisputes: StorageDescriptor, Anonymize, true, never>; + /** + * All included blocks on the chain, as well as the block number in this chain that + * should be reverted back to if the candidate is disputed and determined to be invalid. + */ + Included: StorageDescriptor, number, true, never>; + /** + * Whether the chain is frozen. Starts as `None`. When this is `Some`, + * the chain will not accept any new parachain blocks for backing or inclusion, + * and its value indicates the last valid block number in the chain. + * It can only be set back to `None` by governance intervention. + */ + Frozen: StorageDescriptor<[], Anonymize, false, never>; + }; + ParasSlashing: { + /** + * Validators pending dispute slashes. + */ + UnappliedSlashes: StorageDescriptor, Anonymize, true, never>; + /** + * `ValidatorSetCount` per session. + */ + ValidatorSetCounts: StorageDescriptor<[Key: number], number, true, never>; + }; + OnDemand: { + /** + * Maps a `ParaId` to `CoreIndex` and keeps track of how many assignments the scheduler has in + * it's lookahead. Keeping track of this affinity prevents parallel execution of the same + * `ParaId` on two or more `CoreIndex`es. + */ + ParaIdAffinity: StorageDescriptor<[Key: number], Anonymize, true, never>; + /** + * Overall status of queue (both free + affinity entries) + */ + QueueStatus: StorageDescriptor<[], Anonymize, false, never>; + /** + * Priority queue for all orders which don't yet (or not any more) have any core affinity. + */ + FreeEntries: StorageDescriptor<[], Anonymize, false, never>; + /** + * Queue entries that are currently bound to a particular core due to core affinity. + */ + AffinityEntries: StorageDescriptor<[Key: number], Anonymize, false, never>; + /** + * Keeps track of accumulated revenue from on demand order sales. + */ + Revenue: StorageDescriptor<[], Anonymize, false, never>; + }; + CoretimeAssignmentProvider: { + /** + * Scheduled assignment sets. + * + * Assignments as of the given block number. They will go into state once the block number is + * reached (and replace whatever was in there before). + */ + CoreSchedules: StorageDescriptor<[Key: Anonymize], Anonymize, true, "0">; + /** + * Assignments which are currently active. + * + * They will be picked from `PendingAssignments` once we reach the scheduled block number in + * `PendingAssignments`. + */ + CoreDescriptors: StorageDescriptor<[Key: number], Anonymize, false, "0">; + }; + Registrar: { + /** + * Pending swap operations. + */ + PendingSwap: StorageDescriptor<[Key: number], number, true, never>; + /** + * Amount held on deposit for each para and the original depositor. + * + * The given account ID is responsible for registering the code and initial head data, but may + * only do so if it isn't yet registered. (After that, it's up to governance to do so.) + */ + Paras: StorageDescriptor<[Key: number], Anonymize, true, never>; + /** + * The next free `ParaId`. + */ + NextFreeParaId: StorageDescriptor<[], number, false, never>; + }; + Slots: { + /** + * Amounts held on deposit for each (possibly future) leased parachain. + * + * The actual amount locked on its behalf by any account at any time is the maximum of the + * second values of the items in this list whose first value is the account. + * + * The first item in the list is the amount locked for the current Lease Period. Following + * items are for the subsequent lease periods. + * + * The default value (an empty list) implies that the parachain no longer exists (or never + * existed) as far as this pallet is concerned. + * + * If a parachain doesn't exist *yet* but is scheduled to exist in the future, then it + * will be left-padded with one or more `None`s to denote the fact that nothing is held on + * deposit for the non-existent chain currently, but is held at some point in the future. + * + * It is illegal for a `None` value to trail in the list. + */ + Leases: StorageDescriptor<[Key: number], Anonymize, false, never>; + }; + Auctions: { + /** + * Number of auctions started so far. + */ + AuctionCounter: StorageDescriptor<[], number, false, never>; + /** + * Information relating to the current auction, if there is one. + * + * The first item in the tuple is the lease period index that the first of the four + * contiguous lease periods on auction is for. The second is the block number when the + * auction will "begin to end", i.e. the first block of the Ending Period of the auction. + */ + AuctionInfo: StorageDescriptor<[], Anonymize, true, never>; + /** + * Amounts currently reserved in the accounts of the bidders currently winning + * (sub-)ranges. + */ + ReservedAmounts: StorageDescriptor<[Key: Anonymize], bigint, true, never>; + /** + * The winning bids for each of the 10 ranges at each sample in the final Ending Period of + * the current auction. The map's key is the 0-based index into the Sample Size. The + * first sample of the ending period is 0; the last is `Sample Size - 1`. + */ + Winning: StorageDescriptor<[Key: number], Anonymize, true, never>; + }; + Crowdloan: { + /** + * Info on all of the funds. + */ + Funds: StorageDescriptor<[Key: number], Anonymize, true, never>; + /** + * The funds that have had additional contributions during the last block. This is used + * in order to determine which funds should submit new or updated bids. + */ + NewRaise: StorageDescriptor<[], Anonymize, false, never>; + /** + * The number of auctions that have entered into their ending period so far. + */ + EndingsCount: StorageDescriptor<[], number, false, never>; + /** + * Tracker for the next available fund index + */ + NextFundIndex: StorageDescriptor<[], number, false, never>; + }; + StateTrieMigration: { + /** + * Migration progress. + * + * This stores the snapshot of the last migrated keys. It can be set into motion and move + * forward by any of the means provided by this pallet. + */ + MigrationProcess: StorageDescriptor<[], Anonymize, false, never>; + /** + * The limits that are imposed on automatic migrations. + * + * If set to None, then no automatic migration happens. + */ + AutoLimits: StorageDescriptor<[], Anonymize, false, never>; + /** + * The maximum limits that the signed migration could use. + * + * If not set, no signed submission is allowed. + */ + SignedMigrationMaxLimits: StorageDescriptor<[], Anonymize, true, never>; + }; + XcmPallet: { + /** + * The latest available query index. + */ + QueryCounter: StorageDescriptor<[], bigint, false, never>; + /** + * The ongoing queries. + */ + Queries: StorageDescriptor<[Key: bigint], XcmPalletQueryStatus, true, never>; + /** + * The existing asset traps. + * + * Key is the blake2 256 hash of (origin, versioned `Assets`) pair. Value is the number of + * times this pair has been trapped (usually just 1 if it exists at all). + */ + AssetTraps: StorageDescriptor<[Key: FixedSizeBinary<32>], number, false, never>; + /** + * Default version to encode XCM when latest version of destination is unknown. If `None`, + * then the destinations whose XCM version is unknown are considered unreachable. + */ + SafeXcmVersion: StorageDescriptor<[], number, true, never>; + /** + * The Latest versions that we know various locations support. + */ + SupportedVersion: StorageDescriptor, number, true, never>; + /** + * All locations that we have requested version notifications from. + */ + VersionNotifiers: StorageDescriptor, bigint, true, never>; + /** + * The target locations that are subscribed to our version changes, as well as the most recent + * of our versions we informed them of. + */ + VersionNotifyTargets: StorageDescriptor, Anonymize, true, never>; + /** + * Destinations whose latest XCM version we would like to know. Duplicates not allowed, and + * the `u32` counter is the number of times that a send to the destination has been attempted, + * which is used as a prioritization. + */ + VersionDiscoveryQueue: StorageDescriptor<[], Anonymize, false, never>; + /** + * The current migration's stage, if any. + */ + CurrentMigration: StorageDescriptor<[], XcmPalletVersionMigrationStage, true, never>; + /** + * Fungible assets which we know are locked on a remote chain. + */ + RemoteLockedFungibles: StorageDescriptor, Anonymize, true, never>; + /** + * Fungible assets which we know are locked on this chain. + */ + LockedFungibles: StorageDescriptor<[Key: SS58String], Anonymize, true, never>; + /** + * Global suspension state of the XCM executor. + */ + XcmExecutionSuspended: StorageDescriptor<[], boolean, false, never>; + /** + * Whether or not incoming XCMs (both executed locally and received) should be recorded. + * Only one XCM program will be recorded at a time. + * This is meant to be used in runtime APIs, and it's advised it stays false + * for all other use cases, so as to not degrade regular performance. + * + * Only relevant if this pallet is being used as the [`xcm_executor::traits::RecordXcm`] + * implementation in the XCM executor configuration. + */ + ShouldRecordXcm: StorageDescriptor<[], boolean, false, never>; + /** + * If [`ShouldRecordXcm`] is set to true, then the last XCM program executed locally + * will be stored here. + * Runtime APIs can fetch the XCM that was executed by accessing this value. + * + * Only relevant if this pallet is being used as the [`xcm_executor::traits::RecordXcm`] + * implementation in the XCM executor configuration. + */ + RecordedXcm: StorageDescriptor<[], Anonymize, true, never>; + }; + MessageQueue: { + /** + * The index of the first and last (non-empty) pages. + */ + BookStateFor: StorageDescriptor<[Key: ParachainsInclusionAggregateMessageOrigin], Anonymize, false, never>; + /** + * The origin at which we should begin servicing. + */ + ServiceHead: StorageDescriptor<[], ParachainsInclusionAggregateMessageOrigin, true, never>; + /** + * The map of page indices to pages. + */ + Pages: StorageDescriptor, Anonymize, true, never>; + }; + AssetRate: { + /** + * Maps an asset to its fixed point representation in the native balance. + * + * E.g. `native_amount = asset_amount * ConversionRateToNative::::get(asset_kind)` + */ + ConversionRateToNative: StorageDescriptor<[Key: VersionedLocatableAsset], bigint, true, never>; + }; + Beefy: { + /** + * The current authorities set + */ + Authorities: StorageDescriptor<[], Anonymize, false, never>; + /** + * The current validator set id + */ + ValidatorSetId: StorageDescriptor<[], bigint, false, never>; + /** + * Authorities set scheduled to be used with the next session + */ + NextAuthorities: StorageDescriptor<[], Anonymize, false, never>; + /** + * A mapping from BEEFY set ID to the index of the *most recent* session for which its + * members were responsible. + * + * This is only used for validating equivocation proofs. An equivocation proof must + * contains a key-ownership proof for a given session, therefore we need a way to tie + * together sessions and BEEFY set ids, i.e. we need to validate that a validator + * was the owner of a given key on a given session, and what the active set ID was + * during that session. + * + * TWOX-NOTE: `ValidatorSetId` is not under user control. + */ + SetIdSession: StorageDescriptor<[Key: bigint], number, true, never>; + /** + * Block number where BEEFY consensus is enabled/started. + * By changing this (through privileged `set_new_genesis()`), BEEFY consensus is effectively + * restarted from the newly set block number. + */ + GenesisBlock: StorageDescriptor<[], Anonymize, false, never>; + }; + Mmr: { + /** + * Latest MMR Root hash. + */ + RootHash: StorageDescriptor<[], FixedSizeBinary<32>, false, never>; + /** + * Current size of the MMR (number of leaves). + */ + NumberOfLeaves: StorageDescriptor<[], bigint, false, never>; + /** + * Hashes of the nodes in the MMR. + * + * Note this collection only contains MMR peaks, the inner nodes (and leaves) + * are pruned and only stored in the Offchain DB. + */ + Nodes: StorageDescriptor<[Key: bigint], FixedSizeBinary<32>, true, never>; + }; + BeefyMmrLeaf: { + /** + * Details of current BEEFY authority set. + */ + BeefyAuthorities: StorageDescriptor<[], Anonymize, false, never>; + /** + * Details of next BEEFY authority set. + * + * This storage entry is used as cache for calls to `update_beefy_next_authority_set`. + */ + BeefyNextAuthorities: StorageDescriptor<[], Anonymize, false, never>; + }; + Sudo: { + /** + * The `AccountId` of the sudo key. + */ + Key: StorageDescriptor<[], SS58String, true, never>; + }; +}; +type ICalls = { + System: { + /** + *Make some on-chain remark. + * + *Can be executed by every `origin`. + */ + remark: TxDescriptor>; + /** + *Set the number of pages in the WebAssembly environment's heap. + */ + set_heap_pages: TxDescriptor>; + /** + *Set the new runtime code. + */ + set_code: TxDescriptor>; + /** + *Set the new runtime code without doing any checks of the given `code`. + * + *Note that runtime upgrades will not run if this is called with a not-increasing spec + *version! + */ + set_code_without_checks: TxDescriptor>; + /** + *Set some items of storage. + */ + set_storage: TxDescriptor>; + /** + *Kill some items from storage. + */ + kill_storage: TxDescriptor>; + /** + *Kill all storage items with a key that starts with the given prefix. + * + ***NOTE:** We rely on the Root origin to provide us the number of subkeys under + *the prefix we are removing to accurately calculate the weight of this function. + */ + kill_prefix: TxDescriptor>; + /** + *Make some on-chain remark and emit event. + */ + remark_with_event: TxDescriptor>; + /** + *Authorize an upgrade to a given `code_hash` for the runtime. The runtime can be supplied + *later. + * + *This call requires Root origin. + */ + authorize_upgrade: TxDescriptor>; + /** + *Authorize an upgrade to a given `code_hash` for the runtime. The runtime can be supplied + *later. + * + *WARNING: This authorizes an upgrade that will take place without any safety checks, for + *example that the spec name remains the same and that the version number increases. Not + *recommended for normal use. Use `authorize_upgrade` instead. + * + *This call requires Root origin. + */ + authorize_upgrade_without_checks: TxDescriptor>; + /** + *Provide the preimage (runtime binary) `code` for an upgrade that has been authorized. + * + *If the authorization required a version check, this call will ensure the spec name + *remains unchanged and that the spec version has increased. + * + *Depending on the runtime's `OnSetCode` configuration, this function may directly apply + *the new `code` in the same block or attempt to schedule the upgrade. + * + *All origins are allowed. + */ + apply_authorized_upgrade: TxDescriptor>; + }; + Scheduler: { + /** + *Anonymously schedule a task. + */ + schedule: TxDescriptor>; + /** + *Cancel an anonymously scheduled task. + */ + cancel: TxDescriptor>; + /** + *Schedule a named task. + */ + schedule_named: TxDescriptor>; + /** + *Cancel a named scheduled task. + */ + cancel_named: TxDescriptor>; + /** + *Anonymously schedule a task after a delay. + */ + schedule_after: TxDescriptor>; + /** + *Schedule a named task after a delay. + */ + schedule_named_after: TxDescriptor>; + /** + *Set a retry configuration for a task so that, in case its scheduled run fails, it will + *be retried after `period` blocks, for a total amount of `retries` retries or until it + *succeeds. + * + *Tasks which need to be scheduled for a retry are still subject to weight metering and + *agenda space, same as a regular task. If a periodic task fails, it will be scheduled + *normally while the task is retrying. + * + *Tasks scheduled as a result of a retry for a periodic task are unnamed, non-periodic + *clones of the original task. Their retry configuration will be derived from the + *original task's configuration, but will have a lower value for `remaining` than the + *original `total_retries`. + */ + set_retry: TxDescriptor>; + /** + *Set a retry configuration for a named task so that, in case its scheduled run fails, it + *will be retried after `period` blocks, for a total amount of `retries` retries or until + *it succeeds. + * + *Tasks which need to be scheduled for a retry are still subject to weight metering and + *agenda space, same as a regular task. If a periodic task fails, it will be scheduled + *normally while the task is retrying. + * + *Tasks scheduled as a result of a retry for a periodic task are unnamed, non-periodic + *clones of the original task. Their retry configuration will be derived from the + *original task's configuration, but will have a lower value for `remaining` than the + *original `total_retries`. + */ + set_retry_named: TxDescriptor>; + /** + *Removes the retry configuration of a task. + */ + cancel_retry: TxDescriptor>; + /** + *Cancel the retry configuration of a named task. + */ + cancel_retry_named: TxDescriptor>; + }; + Preimage: { + /** + *Register a preimage on-chain. + * + *If the preimage was previously requested, no fees or deposits are taken for providing + *the preimage. Otherwise, a deposit is taken proportional to the size of the preimage. + */ + note_preimage: TxDescriptor>; + /** + *Clear an unrequested preimage from the runtime storage. + * + *If `len` is provided, then it will be a much cheaper operation. + * + *- `hash`: The hash of the preimage to be removed from the store. + *- `len`: The length of the preimage of `hash`. + */ + unnote_preimage: TxDescriptor>; + /** + *Request a preimage be uploaded to the chain without paying any fees or deposits. + * + *If the preimage requests has already been provided on-chain, we unreserve any deposit + *a user may have paid, and take the control of the preimage out of their hands. + */ + request_preimage: TxDescriptor>; + /** + *Clear a previously made request for a preimage. + * + *NOTE: THIS MUST NOT BE CALLED ON `hash` MORE TIMES THAN `request_preimage`. + */ + unrequest_preimage: TxDescriptor>; + /** + *Ensure that the a bulk of pre-images is upgraded. + * + *The caller pays no fee if at least 90% of pre-images were successfully updated. + */ + ensure_updated: TxDescriptor>; + }; + Babe: { + /** + *Report authority equivocation/misbehavior. This method will verify + *the equivocation proof and validate the given key ownership proof + *against the extracted offender. If both are valid, the offence will + *be reported. + */ + report_equivocation: TxDescriptor>; + /** + *Report authority equivocation/misbehavior. This method will verify + *the equivocation proof and validate the given key ownership proof + *against the extracted offender. If both are valid, the offence will + *be reported. + *This extrinsic must be called unsigned and it is expected that only + *block authors will call it (validated in `ValidateUnsigned`), as such + *if the block author is defined it will be defined as the equivocation + *reporter. + */ + report_equivocation_unsigned: TxDescriptor>; + /** + *Plan an epoch config change. The epoch config change is recorded and will be enacted on + *the next call to `enact_epoch_change`. The config will be activated one epoch after. + *Multiple calls to this method will replace any existing planned config change that had + *not been enacted yet. + */ + plan_config_change: TxDescriptor>; + }; + Timestamp: { + /** + *Set the current time. + * + *This call should be invoked exactly once per block. It will panic at the finalization + *phase, if this call hasn't been invoked by that time. + * + *The timestamp should be greater than the previous one by the amount specified by + *[`Config::MinimumPeriod`]. + * + *The dispatch origin for this call must be _None_. + * + *This dispatch class is _Mandatory_ to ensure it gets executed in the block. Be aware + *that changing the complexity of this call could result exhausting the resources in a + *block to execute any other calls. + * + *## Complexity + *- `O(1)` (Note that implementations of `OnTimestampSet` must also be `O(1)`) + *- 1 storage read and 1 storage mutation (codec `O(1)` because of `DidUpdate::take` in + * `on_finalize`) + *- 1 event handler `on_timestamp_set`. Must be `O(1)`. + */ + set: TxDescriptor>; + }; + Indices: { + /** + *Assign an previously unassigned index. + * + *Payment: `Deposit` is reserved from the sender account. + * + *The dispatch origin for this call must be _Signed_. + * + *- `index`: the index to be claimed. This must not be in use. + * + *Emits `IndexAssigned` if successful. + * + *## Complexity + *- `O(1)`. + */ + claim: TxDescriptor>; + /** + *Assign an index already owned by the sender to another account. The balance reservation + *is effectively transferred to the new account. + * + *The dispatch origin for this call must be _Signed_. + * + *- `index`: the index to be re-assigned. This must be owned by the sender. + *- `new`: the new owner of the index. This function is a no-op if it is equal to sender. + * + *Emits `IndexAssigned` if successful. + * + *## Complexity + *- `O(1)`. + */ + transfer: TxDescriptor>; + /** + *Free up an index owned by the sender. + * + *Payment: Any previous deposit placed for the index is unreserved in the sender account. + * + *The dispatch origin for this call must be _Signed_ and the sender must own the index. + * + *- `index`: the index to be freed. This must be owned by the sender. + * + *Emits `IndexFreed` if successful. + * + *## Complexity + *- `O(1)`. + */ + free: TxDescriptor>; + /** + *Force an index to an account. This doesn't require a deposit. If the index is already + *held, then any deposit is reimbursed to its current owner. + * + *The dispatch origin for this call must be _Root_. + * + *- `index`: the index to be (re-)assigned. + *- `new`: the new owner of the index. This function is a no-op if it is equal to sender. + *- `freeze`: if set to `true`, will freeze the index so it cannot be transferred. + * + *Emits `IndexAssigned` if successful. + * + *## Complexity + *- `O(1)`. + */ + force_transfer: TxDescriptor>; + /** + *Freeze an index so it will always point to the sender account. This consumes the + *deposit. + * + *The dispatch origin for this call must be _Signed_ and the signing account must have a + *non-frozen account `index`. + * + *- `index`: the index to be frozen in place. + * + *Emits `IndexFrozen` if successful. + * + *## Complexity + *- `O(1)`. + */ + freeze: TxDescriptor>; + }; + Balances: { + /** + *Transfer some liquid free balance to another account. + * + *`transfer_allow_death` will set the `FreeBalance` of the sender and receiver. + *If the sender's account is below the existential deposit as a result + *of the transfer, the account will be reaped. + * + *The dispatch origin for this call must be `Signed` by the transactor. + */ + transfer_allow_death: TxDescriptor>; + /** + *Exactly as `transfer_allow_death`, except the origin must be root and the source account + *may be specified. + */ + force_transfer: TxDescriptor>; + /** + *Same as the [`transfer_allow_death`] call, but with a check that the transfer will not + *kill the origin account. + * + *99% of the time you want [`transfer_allow_death`] instead. + * + *[`transfer_allow_death`]: struct.Pallet.html#method.transfer + */ + transfer_keep_alive: TxDescriptor>; + /** + *Transfer the entire transferable balance from the caller account. + * + *NOTE: This function only attempts to transfer _transferable_ balances. This means that + *any locked, reserved, or existential deposits (when `keep_alive` is `true`), will not be + *transferred by this function. To ensure that this function results in a killed account, + *you might need to prepare the account by removing any reference counters, storage + *deposits, etc... + * + *The dispatch origin of this call must be Signed. + * + *- `dest`: The recipient of the transfer. + *- `keep_alive`: A boolean to determine if the `transfer_all` operation should send all + * of the funds the account has, causing the sender account to be killed (false), or + * transfer everything except at least the existential deposit, which will guarantee to + * keep the sender account alive (true). + */ + transfer_all: TxDescriptor>; + /** + *Unreserve some balance from a user by force. + * + *Can only be called by ROOT. + */ + force_unreserve: TxDescriptor>; + /** + *Upgrade a specified account. + * + *- `origin`: Must be `Signed`. + *- `who`: The account to be upgraded. + * + *This will waive the transaction fee if at least all but 10% of the accounts needed to + *be upgraded. (We let some not have to be upgraded just in order to allow for the + *possibility of churn). + */ + upgrade_accounts: TxDescriptor>; + /** + *Set the regular balance of a given account. + * + *The dispatch origin for this call is `root`. + */ + force_set_balance: TxDescriptor>; + /** + *Adjust the total issuance in a saturating way. + * + *Can only be called by root and always needs a positive `delta`. + * + *# Example + */ + force_adjust_total_issuance: TxDescriptor>; + /** + *Burn the specified liquid free balance from the origin account. + * + *If the origin's account ends up below the existential deposit as a result + *of the burn and `keep_alive` is false, the account will be reaped. + * + *Unlike sending funds to a _burn_ address, which merely makes the funds inaccessible, + *this `burn` operation will reduce total issuance by the amount _burned_. + */ + burn: TxDescriptor>; + }; + Staking: { + /** + *Take the origin account as a stash and lock up `value` of its balance. `controller` will + *be the account that controls it. + * + *`value` must be more than the `minimum_balance` specified by `T::Currency`. + * + *The dispatch origin for this call must be _Signed_ by the stash account. + * + *Emits `Bonded`. + *## Complexity + *- Independent of the arguments. Moderate complexity. + *- O(1). + *- Three extra DB entries. + * + *NOTE: Two of the storage writes (`Self::bonded`, `Self::payee`) are _never_ cleaned + *unless the `origin` falls below _existential deposit_ (or equal to 0) and gets removed + *as dust. + */ + bond: TxDescriptor>; + /** + *Add some extra amount that have appeared in the stash `free_balance` into the balance up + *for staking. + * + *The dispatch origin for this call must be _Signed_ by the stash, not the controller. + * + *Use this if there are additional funds in your stash account that you wish to bond. + *Unlike [`bond`](Self::bond) or [`unbond`](Self::unbond) this function does not impose + *any limitation on the amount that can be added. + * + *Emits `Bonded`. + * + *## Complexity + *- Independent of the arguments. Insignificant complexity. + *- O(1). + */ + bond_extra: TxDescriptor>; + /** + *Schedule a portion of the stash to be unlocked ready for transfer out after the bond + *period ends. If this leaves an amount actively bonded less than + *T::Currency::minimum_balance(), then it is increased to the full amount. + * + *The dispatch origin for this call must be _Signed_ by the controller, not the stash. + * + *Once the unlock period is done, you can call `withdraw_unbonded` to actually move + *the funds out of management ready for transfer. + * + *No more than a limited number of unlocking chunks (see `MaxUnlockingChunks`) + *can co-exists at the same time. If there are no unlocking chunks slots available + *[`Call::withdraw_unbonded`] is called to remove some of the chunks (if possible). + * + *If a user encounters the `InsufficientBond` error when calling this extrinsic, + *they should call `chill` first in order to free up their bonded funds. + * + *Emits `Unbonded`. + * + *See also [`Call::withdraw_unbonded`]. + */ + unbond: TxDescriptor>; + /** + *Remove any unlocked chunks from the `unlocking` queue from our management. + * + *This essentially frees up that balance to be used by the stash account to do whatever + *it wants. + * + *The dispatch origin for this call must be _Signed_ by the controller. + * + *Emits `Withdrawn`. + * + *See also [`Call::unbond`]. + * + *## Parameters + * + *- `num_slashing_spans` indicates the number of metadata slashing spans to clear when + *this call results in a complete removal of all the data related to the stash account. + *In this case, the `num_slashing_spans` must be larger or equal to the number of + *slashing spans associated with the stash account in the [`SlashingSpans`] storage type, + *otherwise the call will fail. The call weight is directly proportional to + *`num_slashing_spans`. + * + *## Complexity + *O(S) where S is the number of slashing spans to remove + *NOTE: Weight annotation is the kill scenario, we refund otherwise. + */ + withdraw_unbonded: TxDescriptor>; + /** + *Declare the desire to validate for the origin controller. + * + *Effects will be felt at the beginning of the next era. + * + *The dispatch origin for this call must be _Signed_ by the controller, not the stash. + */ + validate: TxDescriptor>; + /** + *Declare the desire to nominate `targets` for the origin controller. + * + *Effects will be felt at the beginning of the next era. + * + *The dispatch origin for this call must be _Signed_ by the controller, not the stash. + * + *## Complexity + *- The transaction's complexity is proportional to the size of `targets` (N) + *which is capped at CompactAssignments::LIMIT (T::MaxNominations). + *- Both the reads and writes follow a similar pattern. + */ + nominate: TxDescriptor>; + /** + *Declare no desire to either validate or nominate. + * + *Effects will be felt at the beginning of the next era. + * + *The dispatch origin for this call must be _Signed_ by the controller, not the stash. + * + *## Complexity + *- Independent of the arguments. Insignificant complexity. + *- Contains one read. + *- Writes are limited to the `origin` account key. + */ + chill: TxDescriptor; + /** + *(Re-)set the payment target for a controller. + * + *Effects will be felt instantly (as soon as this function is completed successfully). + * + *The dispatch origin for this call must be _Signed_ by the controller, not the stash. + * + *## Complexity + *- O(1) + *- Independent of the arguments. Insignificant complexity. + *- Contains a limited number of reads. + *- Writes are limited to the `origin` account key. + *--------- + */ + set_payee: TxDescriptor>; + /** + *(Re-)sets the controller of a stash to the stash itself. This function previously + *accepted a `controller` argument to set the controller to an account other than the + *stash itself. This functionality has now been removed, now only setting the controller + *to the stash, if it is not already. + * + *Effects will be felt instantly (as soon as this function is completed successfully). + * + *The dispatch origin for this call must be _Signed_ by the stash, not the controller. + * + *## Complexity + *O(1) + *- Independent of the arguments. Insignificant complexity. + *- Contains a limited number of reads. + *- Writes are limited to the `origin` account key. + */ + set_controller: TxDescriptor; + /** + *Sets the ideal number of validators. + * + *The dispatch origin must be Root. + * + *## Complexity + *O(1) + */ + set_validator_count: TxDescriptor>; + /** + *Increments the ideal number of validators up to maximum of + *`ElectionProviderBase::MaxWinners`. + * + *The dispatch origin must be Root. + * + *## Complexity + *Same as [`Self::set_validator_count`]. + */ + increase_validator_count: TxDescriptor>; + /** + *Scale up the ideal number of validators by a factor up to maximum of + *`ElectionProviderBase::MaxWinners`. + * + *The dispatch origin must be Root. + * + *## Complexity + *Same as [`Self::set_validator_count`]. + */ + scale_validator_count: TxDescriptor>; + /** + *Force there to be no new eras indefinitely. + * + *The dispatch origin must be Root. + * + *# Warning + * + *The election process starts multiple blocks before the end of the era. + *Thus the election process may be ongoing when this is called. In this case the + *election will continue until the next era is triggered. + * + *## Complexity + *- No arguments. + *- Weight: O(1) + */ + force_no_eras: TxDescriptor; + /** + *Force there to be a new era at the end of the next session. After this, it will be + *reset to normal (non-forced) behaviour. + * + *The dispatch origin must be Root. + * + *# Warning + * + *The election process starts multiple blocks before the end of the era. + *If this is called just before a new era is triggered, the election process may not + *have enough blocks to get a result. + * + *## Complexity + *- No arguments. + *- Weight: O(1) + */ + force_new_era: TxDescriptor; + /** + *Set the validators who cannot be slashed (if any). + * + *The dispatch origin must be Root. + */ + set_invulnerables: TxDescriptor>; + /** + *Force a current staker to become completely unstaked, immediately. + * + *The dispatch origin must be Root. + * + *## Parameters + * + *- `num_slashing_spans`: Refer to comments on [`Call::withdraw_unbonded`] for more + *details. + */ + force_unstake: TxDescriptor>; + /** + *Force there to be a new era at the end of sessions indefinitely. + * + *The dispatch origin must be Root. + * + *# Warning + * + *The election process starts multiple blocks before the end of the era. + *If this is called just before a new era is triggered, the election process may not + *have enough blocks to get a result. + */ + force_new_era_always: TxDescriptor; + /** + *Cancel enactment of a deferred slash. + * + *Can be called by the `T::AdminOrigin`. + * + *Parameters: era and indices of the slashes for that era to kill. + */ + cancel_deferred_slash: TxDescriptor>; + /** + *Pay out next page of the stakers behind a validator for the given era. + * + *- `validator_stash` is the stash account of the validator. + *- `era` may be any era between `[current_era - history_depth; current_era]`. + * + *The origin of this call must be _Signed_. Any account can call this function, even if + *it is not one of the stakers. + * + *The reward payout could be paged in case there are too many nominators backing the + *`validator_stash`. This call will payout unpaid pages in an ascending order. To claim a + *specific page, use `payout_stakers_by_page`.` + * + *If all pages are claimed, it returns an error `InvalidPage`. + */ + payout_stakers: TxDescriptor>; + /** + *Rebond a portion of the stash scheduled to be unlocked. + * + *The dispatch origin must be signed by the controller. + * + *## Complexity + *- Time complexity: O(L), where L is unlocking chunks + *- Bounded by `MaxUnlockingChunks`. + */ + rebond: TxDescriptor>; + /** + *Remove all data structures concerning a staker/stash once it is at a state where it can + *be considered `dust` in the staking system. The requirements are: + * + *1. the `total_balance` of the stash is below existential deposit. + *2. or, the `ledger.total` of the stash is below existential deposit. + *3. or, existential deposit is zero and either `total_balance` or `ledger.total` is zero. + * + *The former can happen in cases like a slash; the latter when a fully unbonded account + *is still receiving staking rewards in `RewardDestination::Staked`. + * + *It can be called by anyone, as long as `stash` meets the above requirements. + * + *Refunds the transaction fees upon successful execution. + * + *## Parameters + * + *- `num_slashing_spans`: Refer to comments on [`Call::withdraw_unbonded`] for more + *details. + */ + reap_stash: TxDescriptor>; + /** + *Remove the given nominations from the calling validator. + * + *Effects will be felt at the beginning of the next era. + * + *The dispatch origin for this call must be _Signed_ by the controller, not the stash. + * + *- `who`: A list of nominator stash accounts who are nominating this validator which + * should no longer be nominating this validator. + * + *Note: Making this call only makes sense if you first set the validator preferences to + *block any further nominations. + */ + kick: TxDescriptor>; + /** + *Update the various staking configurations . + * + ** `min_nominator_bond`: The minimum active bond needed to be a nominator. + ** `min_validator_bond`: The minimum active bond needed to be a validator. + ** `max_nominator_count`: The max number of users who can be a nominator at once. When + * set to `None`, no limit is enforced. + ** `max_validator_count`: The max number of users who can be a validator at once. When + * set to `None`, no limit is enforced. + ** `chill_threshold`: The ratio of `max_nominator_count` or `max_validator_count` which + * should be filled in order for the `chill_other` transaction to work. + ** `min_commission`: The minimum amount of commission that each validators must maintain. + * This is checked only upon calling `validate`. Existing validators are not affected. + * + *RuntimeOrigin must be Root to call this function. + * + *NOTE: Existing nominators and validators will not be affected by this update. + *to kick people under the new limits, `chill_other` should be called. + */ + set_staking_configs: TxDescriptor>; + /** + *Declare a `controller` to stop participating as either a validator or nominator. + * + *Effects will be felt at the beginning of the next era. + * + *The dispatch origin for this call must be _Signed_, but can be called by anyone. + * + *If the caller is the same as the controller being targeted, then no further checks are + *enforced, and this function behaves just like `chill`. + * + *If the caller is different than the controller being targeted, the following conditions + *must be met: + * + ** `controller` must belong to a nominator who has become non-decodable, + * + *Or: + * + ** A `ChillThreshold` must be set and checked which defines how close to the max + * nominators or validators we must reach before users can start chilling one-another. + ** A `MaxNominatorCount` and `MaxValidatorCount` must be set which is used to determine + * how close we are to the threshold. + ** A `MinNominatorBond` and `MinValidatorBond` must be set and checked, which determines + * if this is a person that should be chilled because they have not met the threshold + * bond required. + * + *This can be helpful if bond requirements are updated, and we need to remove old users + *who do not satisfy these requirements. + */ + chill_other: TxDescriptor>; + /** + *Force a validator to have at least the minimum commission. This will not affect a + *validator who already has a commission greater than or equal to the minimum. Any account + *can call this. + */ + force_apply_min_commission: TxDescriptor>; + /** + *Sets the minimum amount of commission that each validators must maintain. + * + *This call has lower privilege requirements than `set_staking_config` and can be called + *by the `T::AdminOrigin`. Root can always call this. + */ + set_min_commission: TxDescriptor>; + /** + *Pay out a page of the stakers behind a validator for the given era and page. + * + *- `validator_stash` is the stash account of the validator. + *- `era` may be any era between `[current_era - history_depth; current_era]`. + *- `page` is the page index of nominators to pay out with value between 0 and + * `num_nominators / T::MaxExposurePageSize`. + * + *The origin of this call must be _Signed_. Any account can call this function, even if + *it is not one of the stakers. + * + *If a validator has more than [`Config::MaxExposurePageSize`] nominators backing + *them, then the list of nominators is paged, with each page being capped at + *[`Config::MaxExposurePageSize`.] If a validator has more than one page of nominators, + *the call needs to be made for each page separately in order for all the nominators + *backing a validator to receive the reward. The nominators are not sorted across pages + *and so it should not be assumed the highest staker would be on the topmost page and vice + *versa. If rewards are not claimed in [`Config::HistoryDepth`] eras, they are lost. + */ + payout_stakers_by_page: TxDescriptor>; + /** + *Migrates an account's `RewardDestination::Controller` to + *`RewardDestination::Account(controller)`. + * + *Effects will be felt instantly (as soon as this function is completed successfully). + * + *This will waive the transaction fee if the `payee` is successfully migrated. + */ + update_payee: TxDescriptor>; + /** + *Updates a batch of controller accounts to their corresponding stash account if they are + *not the same. Ignores any controller accounts that do not exist, and does not operate if + *the stash and controller are already the same. + * + *Effects will be felt instantly (as soon as this function is completed successfully). + * + *The dispatch origin must be `T::AdminOrigin`. + */ + deprecate_controller_batch: TxDescriptor>; + /** + *Restores the state of a ledger which is in an inconsistent state. + * + *The requirements to restore a ledger are the following: + ** The stash is bonded; or + ** The stash is not bonded but it has a staking lock left behind; or + ** If the stash has an associated ledger and its state is inconsistent; or + ** If the ledger is not corrupted *but* its staking lock is out of sync. + * + *The `maybe_*` input parameters will overwrite the corresponding data and metadata of the + *ledger associated with the stash. If the input parameters are not set, the ledger will + *be reset values from on-chain state. + */ + restore_ledger: TxDescriptor>; + }; + Session: { + /** + *Sets the session key(s) of the function caller to `keys`. + *Allows an account to set its session key prior to becoming a validator. + *This doesn't take effect until the next session. + * + *The dispatch origin of this function must be signed. + * + *## Complexity + *- `O(1)`. Actual cost depends on the number of length of `T::Keys::key_ids()` which is + * fixed. + */ + set_keys: TxDescriptor>; + /** + *Removes any session key(s) of the function caller. + * + *This doesn't take effect until the next session. + * + *The dispatch origin of this function must be Signed and the account must be either be + *convertible to a validator ID using the chain's typical addressing system (this usually + *means being a controller account) or directly convertible into a validator ID (which + *usually means being a stash account). + * + *## Complexity + *- `O(1)` in number of key types. Actual cost depends on the number of length of + * `T::Keys::key_ids()` which is fixed. + */ + purge_keys: TxDescriptor; + }; + Grandpa: { + /** + *Report voter equivocation/misbehavior. This method will verify the + *equivocation proof and validate the given key ownership proof + *against the extracted offender. If both are valid, the offence + *will be reported. + */ + report_equivocation: TxDescriptor>; + /** + *Report voter equivocation/misbehavior. This method will verify the + *equivocation proof and validate the given key ownership proof + *against the extracted offender. If both are valid, the offence + *will be reported. + * + *This extrinsic must be called unsigned and it is expected that only + *block authors will call it (validated in `ValidateUnsigned`), as such + *if the block author is defined it will be defined as the equivocation + *reporter. + */ + report_equivocation_unsigned: TxDescriptor>; + /** + *Note that the current authority set of the GRANDPA finality gadget has stalled. + * + *This will trigger a forced authority set change at the beginning of the next session, to + *be enacted `delay` blocks after that. The `delay` should be high enough to safely assume + *that the block signalling the forced change will not be re-orged e.g. 1000 blocks. + *The block production rate (which may be slowed down because of finality lagging) should + *be taken into account when choosing the `delay`. The GRANDPA voters based on the new + *authority will start voting on top of `best_finalized_block_number` for new finalized + *blocks. `best_finalized_block_number` should be the highest of the latest finalized + *block of all validators of the new authority set. + * + *Only callable by root. + */ + note_stalled: TxDescriptor>; + }; + Treasury: { + /** + *Propose and approve a spend of treasury funds. + * + *## Dispatch Origin + * + *Must be [`Config::SpendOrigin`] with the `Success` value being at least `amount`. + * + *### Details + *NOTE: For record-keeping purposes, the proposer is deemed to be equivalent to the + *beneficiary. + * + *### Parameters + *- `amount`: The amount to be transferred from the treasury to the `beneficiary`. + *- `beneficiary`: The destination account for the transfer. + * + *## Events + * + *Emits [`Event::SpendApproved`] if successful. + */ + spend_local: TxDescriptor>; + /** + *Force a previously approved proposal to be removed from the approval queue. + * + *## Dispatch Origin + * + *Must be [`Config::RejectOrigin`]. + * + *## Details + * + *The original deposit will no longer be returned. + * + *### Parameters + *- `proposal_id`: The index of a proposal + * + *### Complexity + *- O(A) where `A` is the number of approvals + * + *### Errors + *- [`Error::ProposalNotApproved`]: The `proposal_id` supplied was not found in the + * approval queue, i.e., the proposal has not been approved. This could also mean the + * proposal does not exist altogether, thus there is no way it would have been approved + * in the first place. + */ + remove_approval: TxDescriptor>; + /** + *Propose and approve a spend of treasury funds. + * + *## Dispatch Origin + * + *Must be [`Config::SpendOrigin`] with the `Success` value being at least + *`amount` of `asset_kind` in the native asset. The amount of `asset_kind` is converted + *for assertion using the [`Config::BalanceConverter`]. + * + *## Details + * + *Create an approved spend for transferring a specific `amount` of `asset_kind` to a + *designated beneficiary. The spend must be claimed using the `payout` dispatchable within + *the [`Config::PayoutPeriod`]. + * + *### Parameters + *- `asset_kind`: An indicator of the specific asset class to be spent. + *- `amount`: The amount to be transferred from the treasury to the `beneficiary`. + *- `beneficiary`: The beneficiary of the spend. + *- `valid_from`: The block number from which the spend can be claimed. It can refer to + * the past if the resulting spend has not yet expired according to the + * [`Config::PayoutPeriod`]. If `None`, the spend can be claimed immediately after + * approval. + * + *## Events + * + *Emits [`Event::AssetSpendApproved`] if successful. + */ + spend: TxDescriptor>; + /** + *Claim a spend. + * + *## Dispatch Origin + * + *Must be signed + * + *## Details + * + *Spends must be claimed within some temporal bounds. A spend may be claimed within one + *[`Config::PayoutPeriod`] from the `valid_from` block. + *In case of a payout failure, the spend status must be updated with the `check_status` + *dispatchable before retrying with the current function. + * + *### Parameters + *- `index`: The spend index. + * + *## Events + * + *Emits [`Event::Paid`] if successful. + */ + payout: TxDescriptor>; + /** + *Check the status of the spend and remove it from the storage if processed. + * + *## Dispatch Origin + * + *Must be signed. + * + *## Details + * + *The status check is a prerequisite for retrying a failed payout. + *If a spend has either succeeded or expired, it is removed from the storage by this + *function. In such instances, transaction fees are refunded. + * + *### Parameters + *- `index`: The spend index. + * + *## Events + * + *Emits [`Event::PaymentFailed`] if the spend payout has failed. + *Emits [`Event::SpendProcessed`] if the spend payout has succeed. + */ + check_status: TxDescriptor>; + /** + *Void previously approved spend. + * + *## Dispatch Origin + * + *Must be [`Config::RejectOrigin`]. + * + *## Details + * + *A spend void is only possible if the payout has not been attempted yet. + * + *### Parameters + *- `index`: The spend index. + * + *## Events + * + *Emits [`Event::AssetSpendVoided`] if successful. + */ + void_spend: TxDescriptor>; + }; + ConvictionVoting: { + /** + *Vote in a poll. If `vote.is_aye()`, the vote is to enact the proposal; + *otherwise it is a vote to keep the status quo. + * + *The dispatch origin of this call must be _Signed_. + * + *- `poll_index`: The index of the poll to vote for. + *- `vote`: The vote configuration. + * + *Weight: `O(R)` where R is the number of polls the voter has voted on. + */ + vote: TxDescriptor>; + /** + *Delegate the voting power (with some given conviction) of the sending account for a + *particular class of polls. + * + *The balance delegated is locked for as long as it's delegated, and thereafter for the + *time appropriate for the conviction's lock period. + * + *The dispatch origin of this call must be _Signed_, and the signing account must either: + * - be delegating already; or + * - have no voting activity (if there is, then it will need to be removed through + * `remove_vote`). + * + *- `to`: The account whose voting the `target` account's voting power will follow. + *- `class`: The class of polls to delegate. To delegate multiple classes, multiple calls + * to this function are required. + *- `conviction`: The conviction that will be attached to the delegated votes. When the + * account is undelegated, the funds will be locked for the corresponding period. + *- `balance`: The amount of the account's balance to be used in delegating. This must not + * be more than the account's current balance. + * + *Emits `Delegated`. + * + *Weight: `O(R)` where R is the number of polls the voter delegating to has + * voted on. Weight is initially charged as if maximum votes, but is refunded later. + */ + delegate: TxDescriptor>; + /** + *Undelegate the voting power of the sending account for a particular class of polls. + * + *Tokens may be unlocked following once an amount of time consistent with the lock period + *of the conviction with which the delegation was issued has passed. + * + *The dispatch origin of this call must be _Signed_ and the signing account must be + *currently delegating. + * + *- `class`: The class of polls to remove the delegation from. + * + *Emits `Undelegated`. + * + *Weight: `O(R)` where R is the number of polls the voter delegating to has + * voted on. Weight is initially charged as if maximum votes, but is refunded later. + */ + undelegate: TxDescriptor>; + /** + *Remove the lock caused by prior voting/delegating which has expired within a particular + *class. + * + *The dispatch origin of this call must be _Signed_. + * + *- `class`: The class of polls to unlock. + *- `target`: The account to remove the lock on. + * + *Weight: `O(R)` with R number of vote of target. + */ + unlock: TxDescriptor>; + /** + *Remove a vote for a poll. + * + *If: + *- the poll was cancelled, or + *- the poll is ongoing, or + *- the poll has ended such that + * - the vote of the account was in opposition to the result; or + * - there was no conviction to the account's vote; or + * - the account made a split vote + *...then the vote is removed cleanly and a following call to `unlock` may result in more + *funds being available. + * + *If, however, the poll has ended and: + *- it finished corresponding to the vote of the account, and + *- the account made a standard vote with conviction, and + *- the lock period of the conviction is not over + *...then the lock will be aggregated into the overall account's lock, which may involve + **overlocking* (where the two locks are combined into a single lock that is the maximum + *of both the amount locked and the time is it locked for). + * + *The dispatch origin of this call must be _Signed_, and the signer must have a vote + *registered for poll `index`. + * + *- `index`: The index of poll of the vote to be removed. + *- `class`: Optional parameter, if given it indicates the class of the poll. For polls + * which have finished or are cancelled, this must be `Some`. + * + *Weight: `O(R + log R)` where R is the number of polls that `target` has voted on. + * Weight is calculated for the maximum number of vote. + */ + remove_vote: TxDescriptor>; + /** + *Remove a vote for a poll. + * + *If the `target` is equal to the signer, then this function is exactly equivalent to + *`remove_vote`. If not equal to the signer, then the vote must have expired, + *either because the poll was cancelled, because the voter lost the poll or + *because the conviction period is over. + * + *The dispatch origin of this call must be _Signed_. + * + *- `target`: The account of the vote to be removed; this account must have voted for poll + * `index`. + *- `index`: The index of poll of the vote to be removed. + *- `class`: The class of the poll. + * + *Weight: `O(R + log R)` where R is the number of polls that `target` has voted on. + * Weight is calculated for the maximum number of vote. + */ + remove_other_vote: TxDescriptor>; + }; + Referenda: { + /** + *Propose a referendum on a privileged action. + * + *- `origin`: must be `SubmitOrigin` and the account must have `SubmissionDeposit` funds + * available. + *- `proposal_origin`: The origin from which the proposal should be executed. + *- `proposal`: The proposal. + *- `enactment_moment`: The moment that the proposal should be enacted. + * + *Emits `Submitted`. + */ + submit: TxDescriptor>; + /** + *Post the Decision Deposit for a referendum. + * + *- `origin`: must be `Signed` and the account must have funds available for the + * referendum's track's Decision Deposit. + *- `index`: The index of the submitted referendum whose Decision Deposit is yet to be + * posted. + * + *Emits `DecisionDepositPlaced`. + */ + place_decision_deposit: TxDescriptor>; + /** + *Refund the Decision Deposit for a closed referendum back to the depositor. + * + *- `origin`: must be `Signed` or `Root`. + *- `index`: The index of a closed referendum whose Decision Deposit has not yet been + * refunded. + * + *Emits `DecisionDepositRefunded`. + */ + refund_decision_deposit: TxDescriptor>; + /** + *Cancel an ongoing referendum. + * + *- `origin`: must be the `CancelOrigin`. + *- `index`: The index of the referendum to be cancelled. + * + *Emits `Cancelled`. + */ + cancel: TxDescriptor>; + /** + *Cancel an ongoing referendum and slash the deposits. + * + *- `origin`: must be the `KillOrigin`. + *- `index`: The index of the referendum to be cancelled. + * + *Emits `Killed` and `DepositSlashed`. + */ + kill: TxDescriptor>; + /** + *Advance a referendum onto its next logical state. Only used internally. + * + *- `origin`: must be `Root`. + *- `index`: the referendum to be advanced. + */ + nudge_referendum: TxDescriptor>; + /** + *Advance a track onto its next logical state. Only used internally. + * + *- `origin`: must be `Root`. + *- `track`: the track to be advanced. + * + *Action item for when there is now one fewer referendum in the deciding phase and the + *`DecidingCount` is not yet updated. This means that we should either: + *- begin deciding another referendum (and leave `DecidingCount` alone); or + *- decrement `DecidingCount`. + */ + one_fewer_deciding: TxDescriptor>; + /** + *Refund the Submission Deposit for a closed referendum back to the depositor. + * + *- `origin`: must be `Signed` or `Root`. + *- `index`: The index of a closed referendum whose Submission Deposit has not yet been + * refunded. + * + *Emits `SubmissionDepositRefunded`. + */ + refund_submission_deposit: TxDescriptor>; + /** + *Set or clear metadata of a referendum. + * + *Parameters: + *- `origin`: Must be `Signed` by a creator of a referendum or by anyone to clear a + * metadata of a finished referendum. + *- `index`: The index of a referendum to set or clear metadata for. + *- `maybe_hash`: The hash of an on-chain stored preimage. `None` to clear a metadata. + */ + set_metadata: TxDescriptor>; + }; + Whitelist: { + /** + + */ + whitelist_call: TxDescriptor>; + /** + + */ + remove_whitelisted_call: TxDescriptor>; + /** + + */ + dispatch_whitelisted_call: TxDescriptor>; + /** + + */ + dispatch_whitelisted_call_with_preimage: TxDescriptor>; + }; + Parameters: { + /** + *Set the value of a parameter. + * + *The dispatch origin of this call must be `AdminOrigin` for the given `key`. Values be + *deleted by setting them to `None`. + */ + set_parameter: TxDescriptor>; + }; + Claims: { + /** + *Make a claim to collect your DOTs. + * + *The dispatch origin for this call must be _None_. + * + *Unsigned Validation: + *A call to claim is deemed valid if the signature provided matches + *the expected signed message of: + * + *> Ethereum Signed Message: + *> (configured prefix string)(address) + * + *and `address` matches the `dest` account. + * + *Parameters: + *- `dest`: The destination account to payout the claim. + *- `ethereum_signature`: The signature of an ethereum signed message matching the format + * described above. + * + * + *The weight of this call is invariant over the input parameters. + *Weight includes logic to validate unsigned `claim` call. + * + *Total Complexity: O(1) + * + */ + claim: TxDescriptor>; + /** + *Mint a new claim to collect DOTs. + * + *The dispatch origin for this call must be _Root_. + * + *Parameters: + *- `who`: The Ethereum address allowed to collect this claim. + *- `value`: The number of DOTs that will be claimed. + *- `vesting_schedule`: An optional vesting schedule for these DOTs. + * + * + *The weight of this call is invariant over the input parameters. + *We assume worst case that both vesting and statement is being inserted. + * + *Total Complexity: O(1) + * + */ + mint_claim: TxDescriptor>; + /** + *Make a claim to collect your DOTs by signing a statement. + * + *The dispatch origin for this call must be _None_. + * + *Unsigned Validation: + *A call to `claim_attest` is deemed valid if the signature provided matches + *the expected signed message of: + * + *> Ethereum Signed Message: + *> (configured prefix string)(address)(statement) + * + *and `address` matches the `dest` account; the `statement` must match that which is + *expected according to your purchase arrangement. + * + *Parameters: + *- `dest`: The destination account to payout the claim. + *- `ethereum_signature`: The signature of an ethereum signed message matching the format + * described above. + *- `statement`: The identity of the statement which is being attested to in the + * signature. + * + * + *The weight of this call is invariant over the input parameters. + *Weight includes logic to validate unsigned `claim_attest` call. + * + *Total Complexity: O(1) + * + */ + claim_attest: TxDescriptor>; + /** + *Attest to a statement, needed to finalize the claims process. + * + *WARNING: Insecure unless your chain includes `PrevalidateAttests` as a + *`SignedExtension`. + * + *Unsigned Validation: + *A call to attest is deemed valid if the sender has a `Preclaim` registered + *and provides a `statement` which is expected for the account. + * + *Parameters: + *- `statement`: The identity of the statement which is being attested to in the + * signature. + * + * + *The weight of this call is invariant over the input parameters. + *Weight includes logic to do pre-validation on `attest` call. + * + *Total Complexity: O(1) + * + */ + attest: TxDescriptor>; + /** + + */ + move_claim: TxDescriptor>; + }; + Vesting: { + /** + *Unlock any vested funds of the sender account. + * + *The dispatch origin for this call must be _Signed_ and the sender must have funds still + *locked under this pallet. + * + *Emits either `VestingCompleted` or `VestingUpdated`. + * + *## Complexity + *- `O(1)`. + */ + vest: TxDescriptor; + /** + *Unlock any vested funds of a `target` account. + * + *The dispatch origin for this call must be _Signed_. + * + *- `target`: The account whose vested funds should be unlocked. Must have funds still + *locked under this pallet. + * + *Emits either `VestingCompleted` or `VestingUpdated`. + * + *## Complexity + *- `O(1)`. + */ + vest_other: TxDescriptor>; + /** + *Create a vested transfer. + * + *The dispatch origin for this call must be _Signed_. + * + *- `target`: The account receiving the vested funds. + *- `schedule`: The vesting schedule attached to the transfer. + * + *Emits `VestingCreated`. + * + *NOTE: This will unlock all schedules through the current block. + * + *## Complexity + *- `O(1)`. + */ + vested_transfer: TxDescriptor>; + /** + *Force a vested transfer. + * + *The dispatch origin for this call must be _Root_. + * + *- `source`: The account whose funds should be transferred. + *- `target`: The account that should be transferred the vested funds. + *- `schedule`: The vesting schedule attached to the transfer. + * + *Emits `VestingCreated`. + * + *NOTE: This will unlock all schedules through the current block. + * + *## Complexity + *- `O(1)`. + */ + force_vested_transfer: TxDescriptor>; + /** + *Merge two vesting schedules together, creating a new vesting schedule that unlocks over + *the highest possible start and end blocks. If both schedules have already started the + *current block will be used as the schedule start; with the caveat that if one schedule + *is finished by the current block, the other will be treated as the new merged schedule, + *unmodified. + * + *NOTE: If `schedule1_index == schedule2_index` this is a no-op. + *NOTE: This will unlock all schedules through the current block prior to merging. + *NOTE: If both schedules have ended by the current block, no new schedule will be created + *and both will be removed. + * + *Merged schedule attributes: + *- `starting_block`: `MAX(schedule1.starting_block, scheduled2.starting_block, + * current_block)`. + *- `ending_block`: `MAX(schedule1.ending_block, schedule2.ending_block)`. + *- `locked`: `schedule1.locked_at(current_block) + schedule2.locked_at(current_block)`. + * + *The dispatch origin for this call must be _Signed_. + * + *- `schedule1_index`: index of the first schedule to merge. + *- `schedule2_index`: index of the second schedule to merge. + */ + merge_schedules: TxDescriptor>; + /** + *Force remove a vesting schedule + * + *The dispatch origin for this call must be _Root_. + * + *- `target`: An account that has a vesting schedule + *- `schedule_index`: The vesting schedule index that should be removed + */ + force_remove_vesting_schedule: TxDescriptor>; + }; + Utility: { + /** + *Send a batch of dispatch calls. + * + *May be called from any origin except `None`. + * + *- `calls`: The calls to be dispatched from the same origin. The number of call must not + * exceed the constant: `batched_calls_limit` (available in constant metadata). + * + *If origin is root then the calls are dispatched without checking origin filter. (This + *includes bypassing `frame_system::Config::BaseCallFilter`). + * + *## Complexity + *- O(C) where C is the number of calls to be batched. + * + *This will return `Ok` in all circumstances. To determine the success of the batch, an + *event is deposited. If a call failed and the batch was interrupted, then the + *`BatchInterrupted` event is deposited, along with the number of successful calls made + *and the error of the failed call. If all were successful, then the `BatchCompleted` + *event is deposited. + */ + batch: TxDescriptor>; + /** + *Send a call through an indexed pseudonym of the sender. + * + *Filter from origin are passed along. The call will be dispatched with an origin which + *use the same filter as the origin of this call. + * + *NOTE: If you need to ensure that any account-based filtering is not honored (i.e. + *because you expect `proxy` to have been used prior in the call stack and you do not want + *the call restrictions to apply to any sub-accounts), then use `as_multi_threshold_1` + *in the Multisig pallet instead. + * + *NOTE: Prior to version *12, this was called `as_limited_sub`. + * + *The dispatch origin for this call must be _Signed_. + */ + as_derivative: TxDescriptor>; + /** + *Send a batch of dispatch calls and atomically execute them. + *The whole transaction will rollback and fail if any of the calls failed. + * + *May be called from any origin except `None`. + * + *- `calls`: The calls to be dispatched from the same origin. The number of call must not + * exceed the constant: `batched_calls_limit` (available in constant metadata). + * + *If origin is root then the calls are dispatched without checking origin filter. (This + *includes bypassing `frame_system::Config::BaseCallFilter`). + * + *## Complexity + *- O(C) where C is the number of calls to be batched. + */ + batch_all: TxDescriptor>; + /** + *Dispatches a function call with a provided origin. + * + *The dispatch origin for this call must be _Root_. + * + *## Complexity + *- O(1). + */ + dispatch_as: TxDescriptor>; + /** + *Send a batch of dispatch calls. + *Unlike `batch`, it allows errors and won't interrupt. + * + *May be called from any origin except `None`. + * + *- `calls`: The calls to be dispatched from the same origin. The number of call must not + * exceed the constant: `batched_calls_limit` (available in constant metadata). + * + *If origin is root then the calls are dispatch without checking origin filter. (This + *includes bypassing `frame_system::Config::BaseCallFilter`). + * + *## Complexity + *- O(C) where C is the number of calls to be batched. + */ + force_batch: TxDescriptor>; + /** + *Dispatch a function call with a specified weight. + * + *This function does not check the weight of the call, and instead allows the + *Root origin to specify the weight of the call. + * + *The dispatch origin for this call must be _Root_. + */ + with_weight: TxDescriptor>; + }; + Proxy: { + /** + *Dispatch the given `call` from an account that the sender is authorised for through + *`add_proxy`. + * + *The dispatch origin for this call must be _Signed_. + * + *Parameters: + *- `real`: The account that the proxy will make a call on behalf of. + *- `force_proxy_type`: Specify the exact proxy type to be used and checked for this call. + *- `call`: The call to be made by the `real` account. + */ + proxy: TxDescriptor>; + /** + *Register a proxy account for the sender that is able to make calls on its behalf. + * + *The dispatch origin for this call must be _Signed_. + * + *Parameters: + *- `proxy`: The account that the `caller` would like to make a proxy. + *- `proxy_type`: The permissions allowed for this proxy account. + *- `delay`: The announcement period required of the initial proxy. Will generally be + *zero. + */ + add_proxy: TxDescriptor>; + /** + *Unregister a proxy account for the sender. + * + *The dispatch origin for this call must be _Signed_. + * + *Parameters: + *- `proxy`: The account that the `caller` would like to remove as a proxy. + *- `proxy_type`: The permissions currently enabled for the removed proxy account. + */ + remove_proxy: TxDescriptor>; + /** + *Unregister all proxy accounts for the sender. + * + *The dispatch origin for this call must be _Signed_. + * + *WARNING: This may be called on accounts created by `pure`, however if done, then + *the unreserved fees will be inaccessible. **All access to this account will be lost.** + */ + remove_proxies: TxDescriptor; + /** + *Spawn a fresh new account that is guaranteed to be otherwise inaccessible, and + *initialize it with a proxy of `proxy_type` for `origin` sender. + * + *Requires a `Signed` origin. + * + *- `proxy_type`: The type of the proxy that the sender will be registered as over the + *new account. This will almost always be the most permissive `ProxyType` possible to + *allow for maximum flexibility. + *- `index`: A disambiguation index, in case this is called multiple times in the same + *transaction (e.g. with `utility::batch`). Unless you're using `batch` you probably just + *want to use `0`. + *- `delay`: The announcement period required of the initial proxy. Will generally be + *zero. + * + *Fails with `Duplicate` if this has already been called in this transaction, from the + *same sender, with the same parameters. + * + *Fails if there are insufficient funds to pay for deposit. + */ + create_pure: TxDescriptor>; + /** + *Removes a previously spawned pure proxy. + * + *WARNING: **All access to this account will be lost.** Any funds held in it will be + *inaccessible. + * + *Requires a `Signed` origin, and the sender account must have been created by a call to + *`pure` with corresponding parameters. + * + *- `spawner`: The account that originally called `pure` to create this account. + *- `index`: The disambiguation index originally passed to `pure`. Probably `0`. + *- `proxy_type`: The proxy type originally passed to `pure`. + *- `height`: The height of the chain when the call to `pure` was processed. + *- `ext_index`: The extrinsic index in which the call to `pure` was processed. + * + *Fails with `NoPermission` in case the caller is not a previously created pure + *account whose `pure` call has corresponding parameters. + */ + kill_pure: TxDescriptor>; + /** + *Publish the hash of a proxy-call that will be made in the future. + * + *This must be called some number of blocks before the corresponding `proxy` is attempted + *if the delay associated with the proxy relationship is greater than zero. + * + *No more than `MaxPending` announcements may be made at any one time. + * + *This will take a deposit of `AnnouncementDepositFactor` as well as + *`AnnouncementDepositBase` if there are no other pending announcements. + * + *The dispatch origin for this call must be _Signed_ and a proxy of `real`. + * + *Parameters: + *- `real`: The account that the proxy will make a call on behalf of. + *- `call_hash`: The hash of the call to be made by the `real` account. + */ + announce: TxDescriptor>; + /** + *Remove a given announcement. + * + *May be called by a proxy account to remove a call they previously announced and return + *the deposit. + * + *The dispatch origin for this call must be _Signed_. + * + *Parameters: + *- `real`: The account that the proxy will make a call on behalf of. + *- `call_hash`: The hash of the call to be made by the `real` account. + */ + remove_announcement: TxDescriptor>; + /** + *Remove the given announcement of a delegate. + * + *May be called by a target (proxied) account to remove a call that one of their delegates + *(`delegate`) has announced they want to execute. The deposit is returned. + * + *The dispatch origin for this call must be _Signed_. + * + *Parameters: + *- `delegate`: The account that previously announced the call. + *- `call_hash`: The hash of the call to be made. + */ + reject_announcement: TxDescriptor>; + /** + *Dispatch the given `call` from an account that the sender is authorized for through + *`add_proxy`. + * + *Removes any corresponding announcement(s). + * + *The dispatch origin for this call must be _Signed_. + * + *Parameters: + *- `real`: The account that the proxy will make a call on behalf of. + *- `force_proxy_type`: Specify the exact proxy type to be used and checked for this call. + *- `call`: The call to be made by the `real` account. + */ + proxy_announced: TxDescriptor>; + }; + Multisig: { + /** + *Immediately dispatch a multi-signature call using a single approval from the caller. + * + *The dispatch origin for this call must be _Signed_. + * + *- `other_signatories`: The accounts (other than the sender) who are part of the + *multi-signature, but do not participate in the approval process. + *- `call`: The call to be executed. + * + *Result is equivalent to the dispatched result. + * + *## Complexity + *O(Z + C) where Z is the length of the call and C its execution weight. + */ + as_multi_threshold_1: TxDescriptor>; + /** + *Register approval for a dispatch to be made from a deterministic composite account if + *approved by a total of `threshold - 1` of `other_signatories`. + * + *If there are enough, then dispatch the call. + * + *Payment: `DepositBase` will be reserved if this is the first approval, plus + *`threshold` times `DepositFactor`. It is returned once this dispatch happens or + *is cancelled. + * + *The dispatch origin for this call must be _Signed_. + * + *- `threshold`: The total number of approvals for this dispatch before it is executed. + *- `other_signatories`: The accounts (other than the sender) who can approve this + *dispatch. May not be empty. + *- `maybe_timepoint`: If this is the first approval, then this must be `None`. If it is + *not the first approval, then it must be `Some`, with the timepoint (block number and + *transaction index) of the first approval transaction. + *- `call`: The call to be executed. + * + *NOTE: Unless this is the final approval, you will generally want to use + *`approve_as_multi` instead, since it only requires a hash of the call. + * + *Result is equivalent to the dispatched result if `threshold` is exactly `1`. Otherwise + *on success, result is `Ok` and the result from the interior call, if it was executed, + *may be found in the deposited `MultisigExecuted` event. + * + *## Complexity + *- `O(S + Z + Call)`. + *- Up to one balance-reserve or unreserve operation. + *- One passthrough operation, one insert, both `O(S)` where `S` is the number of + * signatories. `S` is capped by `MaxSignatories`, with weight being proportional. + *- One call encode & hash, both of complexity `O(Z)` where `Z` is tx-len. + *- One encode & hash, both of complexity `O(S)`. + *- Up to one binary search and insert (`O(logS + S)`). + *- I/O: 1 read `O(S)`, up to 1 mutate `O(S)`. Up to one remove. + *- One event. + *- The weight of the `call`. + *- Storage: inserts one item, value size bounded by `MaxSignatories`, with a deposit + * taken for its lifetime of `DepositBase + threshold * DepositFactor`. + */ + as_multi: TxDescriptor>; + /** + *Register approval for a dispatch to be made from a deterministic composite account if + *approved by a total of `threshold - 1` of `other_signatories`. + * + *Payment: `DepositBase` will be reserved if this is the first approval, plus + *`threshold` times `DepositFactor`. It is returned once this dispatch happens or + *is cancelled. + * + *The dispatch origin for this call must be _Signed_. + * + *- `threshold`: The total number of approvals for this dispatch before it is executed. + *- `other_signatories`: The accounts (other than the sender) who can approve this + *dispatch. May not be empty. + *- `maybe_timepoint`: If this is the first approval, then this must be `None`. If it is + *not the first approval, then it must be `Some`, with the timepoint (block number and + *transaction index) of the first approval transaction. + *- `call_hash`: The hash of the call to be executed. + * + *NOTE: If this is the final approval, you will want to use `as_multi` instead. + * + *## Complexity + *- `O(S)`. + *- Up to one balance-reserve or unreserve operation. + *- One passthrough operation, one insert, both `O(S)` where `S` is the number of + * signatories. `S` is capped by `MaxSignatories`, with weight being proportional. + *- One encode & hash, both of complexity `O(S)`. + *- Up to one binary search and insert (`O(logS + S)`). + *- I/O: 1 read `O(S)`, up to 1 mutate `O(S)`. Up to one remove. + *- One event. + *- Storage: inserts one item, value size bounded by `MaxSignatories`, with a deposit + * taken for its lifetime of `DepositBase + threshold * DepositFactor`. + */ + approve_as_multi: TxDescriptor>; + /** + *Cancel a pre-existing, on-going multisig transaction. Any deposit reserved previously + *for this operation will be unreserved on success. + * + *The dispatch origin for this call must be _Signed_. + * + *- `threshold`: The total number of approvals for this dispatch before it is executed. + *- `other_signatories`: The accounts (other than the sender) who can approve this + *dispatch. May not be empty. + *- `timepoint`: The timepoint (block number and transaction index) of the first approval + *transaction for this dispatch. + *- `call_hash`: The hash of the call to be executed. + * + *## Complexity + *- `O(S)`. + *- Up to one balance-reserve or unreserve operation. + *- One passthrough operation, one insert, both `O(S)` where `S` is the number of + * signatories. `S` is capped by `MaxSignatories`, with weight being proportional. + *- One encode & hash, both of complexity `O(S)`. + *- One event. + *- I/O: 1 read `O(S)`, one remove. + *- Storage: removes one item. + */ + cancel_as_multi: TxDescriptor>; + }; + Bounties: { + /** + *Propose a new bounty. + * + *The dispatch origin for this call must be _Signed_. + * + *Payment: `TipReportDepositBase` will be reserved from the origin account, as well as + *`DataDepositPerByte` for each byte in `reason`. It will be unreserved upon approval, + *or slashed when rejected. + * + *- `curator`: The curator account whom will manage this bounty. + *- `fee`: The curator fee. + *- `value`: The total payment amount of this bounty, curator fee included. + *- `description`: The description of this bounty. + */ + propose_bounty: TxDescriptor>; + /** + *Approve a bounty proposal. At a later time, the bounty will be funded and become active + *and the original deposit will be returned. + * + *May only be called from `T::SpendOrigin`. + * + *## Complexity + *- O(1). + */ + approve_bounty: TxDescriptor>; + /** + *Propose a curator to a funded bounty. + * + *May only be called from `T::SpendOrigin`. + * + *## Complexity + *- O(1). + */ + propose_curator: TxDescriptor>; + /** + *Unassign curator from a bounty. + * + *This function can only be called by the `RejectOrigin` a signed origin. + * + *If this function is called by the `RejectOrigin`, we assume that the curator is + *malicious or inactive. As a result, we will slash the curator when possible. + * + *If the origin is the curator, we take this as a sign they are unable to do their job and + *they willingly give up. We could slash them, but for now we allow them to recover their + *deposit and exit without issue. (We may want to change this if it is abused.) + * + *Finally, the origin can be anyone if and only if the curator is "inactive". This allows + *anyone in the community to call out that a curator is not doing their due diligence, and + *we should pick a new curator. In this case the curator should also be slashed. + * + *## Complexity + *- O(1). + */ + unassign_curator: TxDescriptor>; + /** + *Accept the curator role for a bounty. + *A deposit will be reserved from curator and refund upon successful payout. + * + *May only be called from the curator. + * + *## Complexity + *- O(1). + */ + accept_curator: TxDescriptor>; + /** + *Award bounty to a beneficiary account. The beneficiary will be able to claim the funds + *after a delay. + * + *The dispatch origin for this call must be the curator of this bounty. + * + *- `bounty_id`: Bounty ID to award. + *- `beneficiary`: The beneficiary account whom will receive the payout. + * + *## Complexity + *- O(1). + */ + award_bounty: TxDescriptor>; + /** + *Claim the payout from an awarded bounty after payout delay. + * + *The dispatch origin for this call must be the beneficiary of this bounty. + * + *- `bounty_id`: Bounty ID to claim. + * + *## Complexity + *- O(1). + */ + claim_bounty: TxDescriptor>; + /** + *Cancel a proposed or active bounty. All the funds will be sent to treasury and + *the curator deposit will be unreserved if possible. + * + *Only `T::RejectOrigin` is able to cancel a bounty. + * + *- `bounty_id`: Bounty ID to cancel. + * + *## Complexity + *- O(1). + */ + close_bounty: TxDescriptor>; + /** + *Extend the expiry time of an active bounty. + * + *The dispatch origin for this call must be the curator of this bounty. + * + *- `bounty_id`: Bounty ID to extend. + *- `remark`: additional information. + * + *## Complexity + *- O(1). + */ + extend_bounty_expiry: TxDescriptor>; + }; + ChildBounties: { + /** + *Add a new child-bounty. + * + *The dispatch origin for this call must be the curator of parent + *bounty and the parent bounty must be in "active" state. + * + *Child-bounty gets added successfully & fund gets transferred from + *parent bounty to child-bounty account, if parent bounty has enough + *funds, else the call fails. + * + *Upper bound to maximum number of active child bounties that can be + *added are managed via runtime trait config + *[`Config::MaxActiveChildBountyCount`]. + * + *If the call is success, the status of child-bounty is updated to + *"Added". + * + *- `parent_bounty_id`: Index of parent bounty for which child-bounty is being added. + *- `value`: Value for executing the proposal. + *- `description`: Text description for the child-bounty. + */ + add_child_bounty: TxDescriptor>; + /** + *Propose curator for funded child-bounty. + * + *The dispatch origin for this call must be curator of parent bounty. + * + *Parent bounty must be in active state, for this child-bounty call to + *work. + * + *Child-bounty must be in "Added" state, for processing the call. And + *state of child-bounty is moved to "CuratorProposed" on successful + *call completion. + * + *- `parent_bounty_id`: Index of parent bounty. + *- `child_bounty_id`: Index of child bounty. + *- `curator`: Address of child-bounty curator. + *- `fee`: payment fee to child-bounty curator for execution. + */ + propose_curator: TxDescriptor>; + /** + *Accept the curator role for the child-bounty. + * + *The dispatch origin for this call must be the curator of this + *child-bounty. + * + *A deposit will be reserved from the curator and refund upon + *successful payout or cancellation. + * + *Fee for curator is deducted from curator fee of parent bounty. + * + *Parent bounty must be in active state, for this child-bounty call to + *work. + * + *Child-bounty must be in "CuratorProposed" state, for processing the + *call. And state of child-bounty is moved to "Active" on successful + *call completion. + * + *- `parent_bounty_id`: Index of parent bounty. + *- `child_bounty_id`: Index of child bounty. + */ + accept_curator: TxDescriptor>; + /** + *Unassign curator from a child-bounty. + * + *The dispatch origin for this call can be either `RejectOrigin`, or + *the curator of the parent bounty, or any signed origin. + * + *For the origin other than T::RejectOrigin and the child-bounty + *curator, parent bounty must be in active state, for this call to + *work. We allow child-bounty curator and T::RejectOrigin to execute + *this call irrespective of the parent bounty state. + * + *If this function is called by the `RejectOrigin` or the + *parent bounty curator, we assume that the child-bounty curator is + *malicious or inactive. As a result, child-bounty curator deposit is + *slashed. + * + *If the origin is the child-bounty curator, we take this as a sign + *that they are unable to do their job, and are willingly giving up. + *We could slash the deposit, but for now we allow them to unreserve + *their deposit and exit without issue. (We may want to change this if + *it is abused.) + * + *Finally, the origin can be anyone iff the child-bounty curator is + *"inactive". Expiry update due of parent bounty is used to estimate + *inactive state of child-bounty curator. + * + *This allows anyone in the community to call out that a child-bounty + *curator is not doing their due diligence, and we should pick a new + *one. In this case the child-bounty curator deposit is slashed. + * + *State of child-bounty is moved to Added state on successful call + *completion. + * + *- `parent_bounty_id`: Index of parent bounty. + *- `child_bounty_id`: Index of child bounty. + */ + unassign_curator: TxDescriptor>; + /** + *Award child-bounty to a beneficiary. + * + *The beneficiary will be able to claim the funds after a delay. + * + *The dispatch origin for this call must be the parent curator or + *curator of this child-bounty. + * + *Parent bounty must be in active state, for this child-bounty call to + *work. + * + *Child-bounty must be in active state, for processing the call. And + *state of child-bounty is moved to "PendingPayout" on successful call + *completion. + * + *- `parent_bounty_id`: Index of parent bounty. + *- `child_bounty_id`: Index of child bounty. + *- `beneficiary`: Beneficiary account. + */ + award_child_bounty: TxDescriptor>; + /** + *Claim the payout from an awarded child-bounty after payout delay. + * + *The dispatch origin for this call may be any signed origin. + * + *Call works independent of parent bounty state, No need for parent + *bounty to be in active state. + * + *The Beneficiary is paid out with agreed bounty value. Curator fee is + *paid & curator deposit is unreserved. + * + *Child-bounty must be in "PendingPayout" state, for processing the + *call. And instance of child-bounty is removed from the state on + *successful call completion. + * + *- `parent_bounty_id`: Index of parent bounty. + *- `child_bounty_id`: Index of child bounty. + */ + claim_child_bounty: TxDescriptor>; + /** + *Cancel a proposed or active child-bounty. Child-bounty account funds + *are transferred to parent bounty account. The child-bounty curator + *deposit may be unreserved if possible. + * + *The dispatch origin for this call must be either parent curator or + *`T::RejectOrigin`. + * + *If the state of child-bounty is `Active`, curator deposit is + *unreserved. + * + *If the state of child-bounty is `PendingPayout`, call fails & + *returns `PendingPayout` error. + * + *For the origin other than T::RejectOrigin, parent bounty must be in + *active state, for this child-bounty call to work. For origin + *T::RejectOrigin execution is forced. + * + *Instance of child-bounty is removed from the state on successful + *call completion. + * + *- `parent_bounty_id`: Index of parent bounty. + *- `child_bounty_id`: Index of child bounty. + */ + close_child_bounty: TxDescriptor>; + }; + ElectionProviderMultiPhase: { + /** + *Submit a solution for the unsigned phase. + * + *The dispatch origin fo this call must be __none__. + * + *This submission is checked on the fly. Moreover, this unsigned solution is only + *validated when submitted to the pool from the **local** node. Effectively, this means + *that only active validators can submit this transaction when authoring a block (similar + *to an inherent). + * + *To prevent any incorrect solution (and thus wasted time/weight), this transaction will + *panic if the solution submitted by the validator is invalid in any way, effectively + *putting their authoring reward at risk. + * + *No deposit or reward is associated with this submission. + */ + submit_unsigned: TxDescriptor>; + /** + *Set a new value for `MinimumUntrustedScore`. + * + *Dispatch origin must be aligned with `T::ForceOrigin`. + * + *This check can be turned off by setting the value to `None`. + */ + set_minimum_untrusted_score: TxDescriptor>; + /** + *Set a solution in the queue, to be handed out to the client of this pallet in the next + *call to `ElectionProvider::elect`. + * + *This can only be set by `T::ForceOrigin`, and only when the phase is `Emergency`. + * + *The solution is not checked for any feasibility and is assumed to be trustworthy, as any + *feasibility check itself can in principle cause the election process to fail (due to + *memory/weight constrains). + */ + set_emergency_election_result: TxDescriptor>; + /** + *Submit a solution for the signed phase. + * + *The dispatch origin fo this call must be __signed__. + * + *The solution is potentially queued, based on the claimed score and processed at the end + *of the signed phase. + * + *A deposit is reserved and recorded for the solution. Based on the outcome, the solution + *might be rewarded, slashed, or get all or a part of the deposit back. + */ + submit: TxDescriptor>; + /** + *Trigger the governance fallback. + * + *This can only be called when [`Phase::Emergency`] is enabled, as an alternative to + *calling [`Call::set_emergency_election_result`]. + */ + governance_fallback: TxDescriptor>; + }; + VoterList: { + /** + *Declare that some `dislocated` account has, through rewards or penalties, sufficiently + *changed its score that it should properly fall into a different bag than its current + *one. + * + *Anyone can call this function about any potentially dislocated account. + * + *Will always update the stored score of `dislocated` to the correct score, based on + *`ScoreProvider`. + * + *If `dislocated` does not exists, it returns an error. + */ + rebag: TxDescriptor>; + /** + *Move the caller's Id directly in front of `lighter`. + * + *The dispatch origin for this call must be _Signed_ and can only be called by the Id of + *the account going in front of `lighter`. Fee is payed by the origin under all + *circumstances. + * + *Only works if: + * + *- both nodes are within the same bag, + *- and `origin` has a greater `Score` than `lighter`. + */ + put_in_front_of: TxDescriptor>; + /** + *Same as [`Pallet::put_in_front_of`], but it can be called by anyone. + * + *Fee is paid by the origin under all circumstances. + */ + put_in_front_of_other: TxDescriptor>; + }; + NominationPools: { + /** + *Stake funds with a pool. The amount to bond is transferred from the member to the + *pools account and immediately increases the pools bond. + * + *# Note + * + ** An account can only be a member of a single pool. + ** An account cannot join the same pool multiple times. + ** This call will *not* dust the member account, so the member must have at least + * `existential deposit + amount` in their account. + ** Only a pool with [`PoolState::Open`] can be joined + */ + join: TxDescriptor>; + /** + *Bond `extra` more funds from `origin` into the pool to which they already belong. + * + *Additional funds can come from either the free balance of the account, of from the + *accumulated rewards, see [`BondExtra`]. + * + *Bonding extra funds implies an automatic payout of all pending rewards as well. + *See `bond_extra_other` to bond pending rewards of `other` members. + */ + bond_extra: TxDescriptor>; + /** + *A bonded member can use this to claim their payout based on the rewards that the pool + *has accumulated since their last claimed payout (OR since joining if this is their first + *time claiming rewards). The payout will be transferred to the member's account. + * + *The member will earn rewards pro rata based on the members stake vs the sum of the + *members in the pools stake. Rewards do not "expire". + * + *See `claim_payout_other` to claim rewards on behalf of some `other` pool member. + */ + claim_payout: TxDescriptor; + /** + *Unbond up to `unbonding_points` of the `member_account`'s funds from the pool. It + *implicitly collects the rewards one last time, since not doing so would mean some + *rewards would be forfeited. + * + *Under certain conditions, this call can be dispatched permissionlessly (i.e. by any + *account). + * + *# Conditions for a permissionless dispatch. + * + ** The pool is blocked and the caller is either the root or bouncer. This is refereed to + * as a kick. + ** The pool is destroying and the member is not the depositor. + ** The pool is destroying, the member is the depositor and no other members are in the + * pool. + * + *## Conditions for permissioned dispatch (i.e. the caller is also the + *`member_account`): + * + ** The caller is not the depositor. + ** The caller is the depositor, the pool is destroying and no other members are in the + * pool. + * + *# Note + * + *If there are too many unlocking chunks to unbond with the pool account, + *[`Call::pool_withdraw_unbonded`] can be called to try and minimize unlocking chunks. + *The [`StakingInterface::unbond`] will implicitly call [`Call::pool_withdraw_unbonded`] + *to try to free chunks if necessary (ie. if unbound was called and no unlocking chunks + *are available). However, it may not be possible to release the current unlocking chunks, + *in which case, the result of this call will likely be the `NoMoreChunks` error from the + *staking system. + */ + unbond: TxDescriptor>; + /** + *Call `withdraw_unbonded` for the pools account. This call can be made by any account. + * + *This is useful if there are too many unlocking chunks to call `unbond`, and some + *can be cleared by withdrawing. In the case there are too many unlocking chunks, the user + *would probably see an error like `NoMoreChunks` emitted from the staking system when + *they attempt to unbond. + */ + pool_withdraw_unbonded: TxDescriptor>; + /** + *Withdraw unbonded funds from `member_account`. If no bonded funds can be unbonded, an + *error is returned. + * + *Under certain conditions, this call can be dispatched permissionlessly (i.e. by any + *account). + * + *# Conditions for a permissionless dispatch + * + ** The pool is in destroy mode and the target is not the depositor. + ** The target is the depositor and they are the only member in the sub pools. + ** The pool is blocked and the caller is either the root or bouncer. + * + *# Conditions for permissioned dispatch + * + ** The caller is the target and they are not the depositor. + * + *# Note + * + *- If the target is the depositor, the pool will be destroyed. + *- If the pool has any pending slash, we also try to slash the member before letting them + *withdraw. This calculation adds some weight overhead and is only defensive. In reality, + *pool slashes must have been already applied via permissionless [`Call::apply_slash`]. + */ + withdraw_unbonded: TxDescriptor>; + /** + *Create a new delegation pool. + * + *# Arguments + * + ** `amount` - The amount of funds to delegate to the pool. This also acts of a sort of + * deposit since the pools creator cannot fully unbond funds until the pool is being + * destroyed. + ** `index` - A disambiguation index for creating the account. Likely only useful when + * creating multiple pools in the same extrinsic. + ** `root` - The account to set as [`PoolRoles::root`]. + ** `nominator` - The account to set as the [`PoolRoles::nominator`]. + ** `bouncer` - The account to set as the [`PoolRoles::bouncer`]. + * + *# Note + * + *In addition to `amount`, the caller will transfer the existential deposit; so the caller + *needs at have at least `amount + existential_deposit` transferable. + */ + create: TxDescriptor>; + /** + *Create a new delegation pool with a previously used pool id + * + *# Arguments + * + *same as `create` with the inclusion of + ** `pool_id` - `A valid PoolId. + */ + create_with_pool_id: TxDescriptor>; + /** + *Nominate on behalf of the pool. + * + *The dispatch origin of this call must be signed by the pool nominator or the pool + *root role. + * + *This directly forward the call to the staking pallet, on behalf of the pool bonded + *account. + * + *# Note + * + *In addition to a `root` or `nominator` role of `origin`, pool's depositor needs to have + *at least `depositor_min_bond` in the pool to start nominating. + */ + nominate: TxDescriptor>; + /** + *Set a new state for the pool. + * + *If a pool is already in the `Destroying` state, then under no condition can its state + *change again. + * + *The dispatch origin of this call must be either: + * + *1. signed by the bouncer, or the root role of the pool, + *2. if the pool conditions to be open are NOT met (as described by `ok_to_be_open`), and + * then the state of the pool can be permissionlessly changed to `Destroying`. + */ + set_state: TxDescriptor>; + /** + *Set a new metadata for the pool. + * + *The dispatch origin of this call must be signed by the bouncer, or the root role of the + *pool. + */ + set_metadata: TxDescriptor>; + /** + *Update configurations for the nomination pools. The origin for this call must be + *[`Config::AdminOrigin`]. + * + *# Arguments + * + ** `min_join_bond` - Set [`MinJoinBond`]. + ** `min_create_bond` - Set [`MinCreateBond`]. + ** `max_pools` - Set [`MaxPools`]. + ** `max_members` - Set [`MaxPoolMembers`]. + ** `max_members_per_pool` - Set [`MaxPoolMembersPerPool`]. + ** `global_max_commission` - Set [`GlobalMaxCommission`]. + */ + set_configs: TxDescriptor>; + /** + *Update the roles of the pool. + * + *The root is the only entity that can change any of the roles, including itself, + *excluding the depositor, who can never change. + * + *It emits an event, notifying UIs of the role change. This event is quite relevant to + *most pool members and they should be informed of changes to pool roles. + */ + update_roles: TxDescriptor>; + /** + *Chill on behalf of the pool. + * + *The dispatch origin of this call can be signed by the pool nominator or the pool + *root role, same as [`Pallet::nominate`]. + * + *Under certain conditions, this call can be dispatched permissionlessly (i.e. by any + *account). + * + *# Conditions for a permissionless dispatch: + ** When pool depositor has less than `MinNominatorBond` staked, otherwise pool members + * are unable to unbond. + * + *# Conditions for permissioned dispatch: + ** The caller has a nominator or root role of the pool. + *This directly forward the call to the staking pallet, on behalf of the pool bonded + *account. + */ + chill: TxDescriptor>; + /** + *`origin` bonds funds from `extra` for some pool member `member` into their respective + *pools. + * + *`origin` can bond extra funds from free balance or pending rewards when `origin == + *other`. + * + *In the case of `origin != other`, `origin` can only bond extra pending rewards of + *`other` members assuming set_claim_permission for the given member is + *`PermissionlessCompound` or `PermissionlessAll`. + */ + bond_extra_other: TxDescriptor>; + /** + *Allows a pool member to set a claim permission to allow or disallow permissionless + *bonding and withdrawing. + * + *# Arguments + * + ** `origin` - Member of a pool. + ** `permission` - The permission to be applied. + */ + set_claim_permission: TxDescriptor>; + /** + *`origin` can claim payouts on some pool member `other`'s behalf. + * + *Pool member `other` must have a `PermissionlessWithdraw` or `PermissionlessAll` claim + *permission for this call to be successful. + */ + claim_payout_other: TxDescriptor>; + /** + *Set the commission of a pool. + *Both a commission percentage and a commission payee must be provided in the `current` + *tuple. Where a `current` of `None` is provided, any current commission will be removed. + * + *- If a `None` is supplied to `new_commission`, existing commission will be removed. + */ + set_commission: TxDescriptor>; + /** + *Set the maximum commission of a pool. + * + *- Initial max can be set to any `Perbill`, and only smaller values thereafter. + *- Current commission will be lowered in the event it is higher than a new max + * commission. + */ + set_commission_max: TxDescriptor>; + /** + *Set the commission change rate for a pool. + * + *Initial change rate is not bounded, whereas subsequent updates can only be more + *restrictive than the current. + */ + set_commission_change_rate: TxDescriptor>; + /** + *Claim pending commission. + * + *The dispatch origin of this call must be signed by the `root` role of the pool. Pending + *commission is paid out and added to total claimed commission`. Total pending commission + *is reset to zero. the current. + */ + claim_commission: TxDescriptor>; + /** + *Top up the deficit or withdraw the excess ED from the pool. + * + *When a pool is created, the pool depositor transfers ED to the reward account of the + *pool. ED is subject to change and over time, the deposit in the reward account may be + *insufficient to cover the ED deficit of the pool or vice-versa where there is excess + *deposit to the pool. This call allows anyone to adjust the ED deposit of the + *pool by either topping up the deficit or claiming the excess. + */ + adjust_pool_deposit: TxDescriptor>; + /** + *Set or remove a pool's commission claim permission. + * + *Determines who can claim the pool's pending commission. Only the `Root` role of the pool + *is able to configure commission claim permissions. + */ + set_commission_claim_permission: TxDescriptor>; + /** + *Apply a pending slash on a member. + * + *Fails unless [`crate::pallet::Config::StakeAdapter`] is of strategy type: + *[`adapter::StakeStrategyType::Delegate`]. + * + *This call can be dispatched permissionlessly (i.e. by any account). If the member has + *slash to be applied, caller may be rewarded with the part of the slash. + */ + apply_slash: TxDescriptor>; + /** + *Migrates delegated funds from the pool account to the `member_account`. + * + *Fails unless [`crate::pallet::Config::StakeAdapter`] is of strategy type: + *[`adapter::StakeStrategyType::Delegate`]. + * + *This is a permission-less call and refunds any fee if claim is successful. + * + *If the pool has migrated to delegation based staking, the staked tokens of pool members + *can be moved and held in their own account. See [`adapter::DelegateStake`] + */ + migrate_delegation: TxDescriptor>; + /** + *Migrate pool from [`adapter::StakeStrategyType::Transfer`] to + *[`adapter::StakeStrategyType::Delegate`]. + * + *Fails unless [`crate::pallet::Config::StakeAdapter`] is of strategy type: + *[`adapter::StakeStrategyType::Delegate`]. + * + *This call can be dispatched permissionlessly, and refunds any fee if successful. + * + *If the pool has already migrated to delegation based staking, this call will fail. + */ + migrate_pool_to_delegate_stake: TxDescriptor>; + }; + FastUnstake: { + /** + *Register oneself for fast-unstake. + * + *## Dispatch Origin + * + *The dispatch origin of this call must be *signed* by whoever is permitted to call + *unbond funds by the staking system. See [`Config::Staking`]. + * + *## Details + * + *The stash associated with the origin must have no ongoing unlocking chunks. If + *successful, this will fully unbond and chill the stash. Then, it will enqueue the stash + *to be checked in further blocks. + * + *If by the time this is called, the stash is actually eligible for fast-unstake, then + *they are guaranteed to remain eligible, because the call will chill them as well. + * + *If the check works, the entire staking data is removed, i.e. the stash is fully + *unstaked. + * + *If the check fails, the stash remains chilled and waiting for being unbonded as in with + *the normal staking system, but they lose part of their unbonding chunks due to consuming + *the chain's resources. + * + *## Events + * + *Some events from the staking and currency system might be emitted. + */ + register_fast_unstake: TxDescriptor; + /** + *Deregister oneself from the fast-unstake. + * + *## Dispatch Origin + * + *The dispatch origin of this call must be *signed* by whoever is permitted to call + *unbond funds by the staking system. See [`Config::Staking`]. + * + *## Details + * + *This is useful if one is registered, they are still waiting, and they change their mind. + * + *Note that the associated stash is still fully unbonded and chilled as a consequence of + *calling [`Pallet::register_fast_unstake`]. Therefore, this should probably be followed + *by a call to `rebond` in the staking system. + * + *## Events + * + *Some events from the staking and currency system might be emitted. + */ + deregister: TxDescriptor; + /** + *Control the operation of this pallet. + * + *## Dispatch Origin + * + *The dispatch origin of this call must be [`Config::ControlOrigin`]. + * + *## Details + * + *Can set the number of eras to check per block, and potentially other admin work. + * + *## Events + * + *No events are emitted from this dispatch. + */ + control: TxDescriptor>; + }; + Configuration: { + /** + *Set the validation upgrade cooldown. + */ + set_validation_upgrade_cooldown: TxDescriptor>; + /** + *Set the validation upgrade delay. + */ + set_validation_upgrade_delay: TxDescriptor>; + /** + *Set the acceptance period for an included candidate. + */ + set_code_retention_period: TxDescriptor>; + /** + *Set the max validation code size for incoming upgrades. + */ + set_max_code_size: TxDescriptor>; + /** + *Set the max POV block size for incoming upgrades. + */ + set_max_pov_size: TxDescriptor>; + /** + *Set the max head data size for paras. + */ + set_max_head_data_size: TxDescriptor>; + /** + *Set the number of coretime execution cores. + * + *NOTE: that this configuration is managed by the coretime chain. Only manually change + *this, if you really know what you are doing! + */ + set_coretime_cores: TxDescriptor>; + /** + *Set the max number of times a claim may timeout on a core before it is abandoned + */ + set_max_availability_timeouts: TxDescriptor>; + /** + *Set the parachain validator-group rotation frequency + */ + set_group_rotation_frequency: TxDescriptor>; + /** + *Set the availability period for paras. + */ + set_paras_availability_period: TxDescriptor>; + /** + *Set the scheduling lookahead, in expected number of blocks at peak throughput. + */ + set_scheduling_lookahead: TxDescriptor>; + /** + *Set the maximum number of validators to assign to any core. + */ + set_max_validators_per_core: TxDescriptor>; + /** + *Set the maximum number of validators to use in parachain consensus. + */ + set_max_validators: TxDescriptor>; + /** + *Set the dispute period, in number of sessions to keep for disputes. + */ + set_dispute_period: TxDescriptor>; + /** + *Set the dispute post conclusion acceptance period. + */ + set_dispute_post_conclusion_acceptance_period: TxDescriptor>; + /** + *Set the no show slots, in number of number of consensus slots. + *Must be at least 1. + */ + set_no_show_slots: TxDescriptor>; + /** + *Set the total number of delay tranches. + */ + set_n_delay_tranches: TxDescriptor>; + /** + *Set the zeroth delay tranche width. + */ + set_zeroth_delay_tranche_width: TxDescriptor>; + /** + *Set the number of validators needed to approve a block. + */ + set_needed_approvals: TxDescriptor>; + /** + *Set the number of samples to do of the `RelayVRFModulo` approval assignment criterion. + */ + set_relay_vrf_modulo_samples: TxDescriptor>; + /** + *Sets the maximum items that can present in a upward dispatch queue at once. + */ + set_max_upward_queue_count: TxDescriptor>; + /** + *Sets the maximum total size of items that can present in a upward dispatch queue at + *once. + */ + set_max_upward_queue_size: TxDescriptor>; + /** + *Set the critical downward message size. + */ + set_max_downward_message_size: TxDescriptor>; + /** + *Sets the maximum size of an upward message that can be sent by a candidate. + */ + set_max_upward_message_size: TxDescriptor>; + /** + *Sets the maximum number of messages that a candidate can contain. + */ + set_max_upward_message_num_per_candidate: TxDescriptor>; + /** + *Sets the number of sessions after which an HRMP open channel request expires. + */ + set_hrmp_open_request_ttl: TxDescriptor>; + /** + *Sets the amount of funds that the sender should provide for opening an HRMP channel. + */ + set_hrmp_sender_deposit: TxDescriptor>; + /** + *Sets the amount of funds that the recipient should provide for accepting opening an HRMP + *channel. + */ + set_hrmp_recipient_deposit: TxDescriptor>; + /** + *Sets the maximum number of messages allowed in an HRMP channel at once. + */ + set_hrmp_channel_max_capacity: TxDescriptor>; + /** + *Sets the maximum total size of messages in bytes allowed in an HRMP channel at once. + */ + set_hrmp_channel_max_total_size: TxDescriptor>; + /** + *Sets the maximum number of inbound HRMP channels a parachain is allowed to accept. + */ + set_hrmp_max_parachain_inbound_channels: TxDescriptor>; + /** + *Sets the maximum size of a message that could ever be put into an HRMP channel. + */ + set_hrmp_channel_max_message_size: TxDescriptor>; + /** + *Sets the maximum number of outbound HRMP channels a parachain is allowed to open. + */ + set_hrmp_max_parachain_outbound_channels: TxDescriptor>; + /** + *Sets the maximum number of outbound HRMP messages can be sent by a candidate. + */ + set_hrmp_max_message_num_per_candidate: TxDescriptor>; + /** + *Set the number of session changes after which a PVF pre-checking voting is rejected. + */ + set_pvf_voting_ttl: TxDescriptor>; + /** + *Sets the minimum delay between announcing the upgrade block for a parachain until the + *upgrade taking place. + * + *See the field documentation for information and constraints for the new value. + */ + set_minimum_validation_upgrade_delay: TxDescriptor>; + /** + *Setting this to true will disable consistency checks for the configuration setters. + *Use with caution. + */ + set_bypass_consistency_check: TxDescriptor>; + /** + *Set the asynchronous backing parameters. + */ + set_async_backing_params: TxDescriptor>; + /** + *Set PVF executor parameters. + */ + set_executor_params: TxDescriptor>; + /** + *Set the on demand (parathreads) base fee. + */ + set_on_demand_base_fee: TxDescriptor>; + /** + *Set the on demand (parathreads) fee variability. + */ + set_on_demand_fee_variability: TxDescriptor>; + /** + *Set the on demand (parathreads) queue max size. + */ + set_on_demand_queue_max_size: TxDescriptor>; + /** + *Set the on demand (parathreads) fee variability. + */ + set_on_demand_target_queue_utilization: TxDescriptor>; + /** + *Set the on demand (parathreads) ttl in the claimqueue. + */ + set_on_demand_ttl: TxDescriptor>; + /** + *Set the minimum backing votes threshold. + */ + set_minimum_backing_votes: TxDescriptor>; + /** + *Set/Unset a node feature. + */ + set_node_feature: TxDescriptor>; + /** + *Set approval-voting-params. + */ + set_approval_voting_params: TxDescriptor>; + /** + *Set scheduler-params. + */ + set_scheduler_params: TxDescriptor>; + }; + ParaInherent: { + /** + *Enter the paras inherent. This will process bitfields and backed candidates. + */ + enter: TxDescriptor>; + }; + Paras: { + /** + *Set the storage for the parachain validation code immediately. + */ + force_set_current_code: TxDescriptor>; + /** + *Set the storage for the current parachain head data immediately. + */ + force_set_current_head: TxDescriptor>; + /** + *Schedule an upgrade as if it was scheduled in the given relay parent block. + */ + force_schedule_code_upgrade: TxDescriptor>; + /** + *Note a new block head for para within the context of the current block. + */ + force_note_new_head: TxDescriptor>; + /** + *Put a parachain directly into the next session's action queue. + *We can't queue it any sooner than this without going into the + *initializer... + */ + force_queue_action: TxDescriptor>; + /** + *Adds the validation code to the storage. + * + *The code will not be added if it is already present. Additionally, if PVF pre-checking + *is running for that code, it will be instantly accepted. + * + *Otherwise, the code will be added into the storage. Note that the code will be added + *into storage with reference count 0. This is to account the fact that there are no users + *for this code yet. The caller will have to make sure that this code eventually gets + *used by some parachain or removed from the storage to avoid storage leaks. For the + *latter prefer to use the `poke_unused_validation_code` dispatchable to raw storage + *manipulation. + * + *This function is mainly meant to be used for upgrading parachains that do not follow + *the go-ahead signal while the PVF pre-checking feature is enabled. + */ + add_trusted_validation_code: TxDescriptor>; + /** + *Remove the validation code from the storage iff the reference count is 0. + * + *This is better than removing the storage directly, because it will not remove the code + *that was suddenly got used by some parachain while this dispatchable was pending + *dispatching. + */ + poke_unused_validation_code: TxDescriptor>; + /** + *Includes a statement for a PVF pre-checking vote. Potentially, finalizes the vote and + *enacts the results if that was the last vote before achieving the supermajority. + */ + include_pvf_check_statement: TxDescriptor>; + /** + *Set the storage for the current parachain head data immediately. + */ + force_set_most_recent_context: TxDescriptor>; + }; + Initializer: { + /** + *Issue a signal to the consensus engine to forcibly act as though all parachain + *blocks in all relay chain blocks up to and including the given number in the current + *chain are valid and should be finalized. + */ + force_approve: TxDescriptor>; + }; + Hrmp: { + /** + *Initiate opening a channel from a parachain to a given recipient with given channel + *parameters. + * + *- `proposed_max_capacity` - specifies how many messages can be in the channel at once. + *- `proposed_max_message_size` - specifies the maximum size of the messages. + * + *These numbers are a subject to the relay-chain configuration limits. + * + *The channel can be opened only after the recipient confirms it and only on a session + *change. + */ + hrmp_init_open_channel: TxDescriptor>; + /** + *Accept a pending open channel request from the given sender. + * + *The channel will be opened only on the next session boundary. + */ + hrmp_accept_open_channel: TxDescriptor>; + /** + *Initiate unilateral closing of a channel. The origin must be either the sender or the + *recipient in the channel being closed. + * + *The closure can only happen on a session change. + */ + hrmp_close_channel: TxDescriptor>; + /** + *This extrinsic triggers the cleanup of all the HRMP storage items that a para may have. + *Normally this happens once per session, but this allows you to trigger the cleanup + *immediately for a specific parachain. + * + *Number of inbound and outbound channels for `para` must be provided as witness data. + * + *Origin must be the `ChannelManager`. + */ + force_clean_hrmp: TxDescriptor>; + /** + *Force process HRMP open channel requests. + * + *If there are pending HRMP open channel requests, you can use this function to process + *all of those requests immediately. + * + *Total number of opening channels must be provided as witness data. + * + *Origin must be the `ChannelManager`. + */ + force_process_hrmp_open: TxDescriptor>; + /** + *Force process HRMP close channel requests. + * + *If there are pending HRMP close channel requests, you can use this function to process + *all of those requests immediately. + * + *Total number of closing channels must be provided as witness data. + * + *Origin must be the `ChannelManager`. + */ + force_process_hrmp_close: TxDescriptor>; + /** + *This cancels a pending open channel request. It can be canceled by either of the sender + *or the recipient for that request. The origin must be either of those. + * + *The cancellation happens immediately. It is not possible to cancel the request if it is + *already accepted. + * + *Total number of open requests (i.e. `HrmpOpenChannelRequestsList`) must be provided as + *witness data. + */ + hrmp_cancel_open_request: TxDescriptor>; + /** + *Open a channel from a `sender` to a `recipient` `ParaId`. Although opened by governance, + *the `max_capacity` and `max_message_size` are still subject to the Relay Chain's + *configured limits. + * + *Expected use is when one (and only one) of the `ParaId`s involved in the channel is + *governed by the system, e.g. a system parachain. + * + *Origin must be the `ChannelManager`. + */ + force_open_hrmp_channel: TxDescriptor>; + /** + *Establish an HRMP channel between two system chains. If the channel does not already + *exist, the transaction fees will be refunded to the caller. The system does not take + *deposits for channels between system chains, and automatically sets the message number + *and size limits to the maximum allowed by the network's configuration. + * + *Arguments: + * + *- `sender`: A system chain, `ParaId`. + *- `recipient`: A system chain, `ParaId`. + * + *Any signed origin can call this function, but _both_ inputs MUST be system chains. If + *the channel does not exist yet, there is no fee. + */ + establish_system_channel: TxDescriptor>; + /** + *Update the deposits held for an HRMP channel to the latest `Configuration`. Channels + *with system chains do not require a deposit. + * + *Arguments: + * + *- `sender`: A chain, `ParaId`. + *- `recipient`: A chain, `ParaId`. + * + *Any signed origin can call this function. + */ + poke_channel_deposits: TxDescriptor>; + /** + *Establish a bidirectional HRMP channel between a parachain and a system chain. + * + *Arguments: + * + *- `target_system_chain`: A system chain, `ParaId`. + * + *The origin needs to be the parachain origin. + */ + establish_channel_with_system: TxDescriptor>; + }; + ParasDisputes: { + /** + + */ + force_unfreeze: TxDescriptor; + }; + ParasSlashing: { + /** + + */ + report_dispute_lost_unsigned: TxDescriptor>; + }; + OnDemand: { + /** + *Create a single on demand core order. + *Will use the spot price for the current block and will reap the account if needed. + * + *Parameters: + *- `origin`: The sender of the call, funds will be withdrawn from this account. + *- `max_amount`: The maximum balance to withdraw from the origin to place an order. + *- `para_id`: A `ParaId` the origin wants to provide blockspace for. + * + *Errors: + *- `InsufficientBalance`: from the Currency implementation + *- `QueueFull` + *- `SpotPriceHigherThanMaxAmount` + * + *Events: + *- `OnDemandOrderPlaced` + */ + place_order_allow_death: TxDescriptor>; + /** + *Same as the [`place_order_allow_death`](Self::place_order_allow_death) call , but with a + *check that placing the order will not reap the account. + * + *Parameters: + *- `origin`: The sender of the call, funds will be withdrawn from this account. + *- `max_amount`: The maximum balance to withdraw from the origin to place an order. + *- `para_id`: A `ParaId` the origin wants to provide blockspace for. + * + *Errors: + *- `InsufficientBalance`: from the Currency implementation + *- `QueueFull` + *- `SpotPriceHigherThanMaxAmount` + * + *Events: + *- `OnDemandOrderPlaced` + */ + place_order_keep_alive: TxDescriptor>; + }; + Registrar: { + /** + *Register head data and validation code for a reserved Para Id. + * + *## Arguments + *- `origin`: Must be called by a `Signed` origin. + *- `id`: The para ID. Must be owned/managed by the `origin` signing account. + *- `genesis_head`: The genesis head data of the parachain/thread. + *- `validation_code`: The initial validation code of the parachain/thread. + * + *## Deposits/Fees + *The account with the originating signature must reserve a deposit. + * + *The deposit is required to cover the costs associated with storing the genesis head + *data and the validation code. + *This accounts for the potential to store validation code of a size up to the + *`max_code_size`, as defined in the configuration pallet + * + *Anything already reserved previously for this para ID is accounted for. + * + *## Events + *The `Registered` event is emitted in case of success. + */ + register: TxDescriptor>; + /** + *Force the registration of a Para Id on the relay chain. + * + *This function must be called by a Root origin. + * + *The deposit taken can be specified for this registration. Any `ParaId` + *can be registered, including sub-1000 IDs which are System Parachains. + */ + force_register: TxDescriptor>; + /** + *Deregister a Para Id, freeing all data and returning any deposit. + * + *The caller must be Root, the `para` owner, or the `para` itself. The para must be an + *on-demand parachain. + */ + deregister: TxDescriptor>; + /** + *Swap a lease holding parachain with another parachain, either on-demand or lease + *holding. + * + *The origin must be Root, the `para` owner, or the `para` itself. + * + *The swap will happen only if there is already an opposite swap pending. If there is not, + *the swap will be stored in the pending swaps map, ready for a later confirmatory swap. + * + *The `ParaId`s remain mapped to the same head data and code so external code can rely on + *`ParaId` to be a long-term identifier of a notional "parachain". However, their + *scheduling info (i.e. whether they're an on-demand parachain or lease holding + *parachain), auction information and the auction deposit are switched. + */ + swap: TxDescriptor>; + /** + *Remove a manager lock from a para. This will allow the manager of a + *previously locked para to deregister or swap a para without using governance. + * + *Can only be called by the Root origin or the parachain. + */ + remove_lock: TxDescriptor>; + /** + *Reserve a Para Id on the relay chain. + * + *This function will reserve a new Para Id to be owned/managed by the origin account. + *The origin account is able to register head data and validation code using `register` to + *create an on-demand parachain. Using the Slots pallet, an on-demand parachain can then + *be upgraded to a lease holding parachain. + * + *## Arguments + *- `origin`: Must be called by a `Signed` origin. Becomes the manager/owner of the new + * para ID. + * + *## Deposits/Fees + *The origin must reserve a deposit of `ParaDeposit` for the registration. + * + *## Events + *The `Reserved` event is emitted in case of success, which provides the ID reserved for + *use. + */ + reserve: TxDescriptor; + /** + *Add a manager lock from a para. This will prevent the manager of a + *para to deregister or swap a para. + * + *Can be called by Root, the parachain, or the parachain manager if the parachain is + *unlocked. + */ + add_lock: TxDescriptor>; + /** + *Schedule a parachain upgrade. + * + *This will kick off a check of `new_code` by all validators. After the majority of the + *validators have reported on the validity of the code, the code will either be enacted + *or the upgrade will be rejected. If the code will be enacted, the current code of the + *parachain will be overwritten directly. This means that any PoV will be checked by this + *new code. The parachain itself will not be informed explicitly that the validation code + *has changed. + * + *Can be called by Root, the parachain, or the parachain manager if the parachain is + *unlocked. + */ + schedule_code_upgrade: TxDescriptor>; + /** + *Set the parachain's current head. + * + *Can be called by Root, the parachain, or the parachain manager if the parachain is + *unlocked. + */ + set_current_head: TxDescriptor>; + }; + Slots: { + /** + *Just a connect into the `lease_out` call, in case Root wants to force some lease to + *happen independently of any other on-chain mechanism to use it. + * + *The dispatch origin for this call must match `T::ForceOrigin`. + */ + force_lease: TxDescriptor>; + /** + *Clear all leases for a Para Id, refunding any deposits back to the original owners. + * + *The dispatch origin for this call must match `T::ForceOrigin`. + */ + clear_all_leases: TxDescriptor>; + /** + *Try to onboard a parachain that has a lease for the current lease period. + * + *This function can be useful if there was some state issue with a para that should + *have onboarded, but was unable to. As long as they have a lease period, we can + *let them onboard from here. + * + *Origin must be signed, but can be called by anyone. + */ + trigger_onboard: TxDescriptor>; + }; + Auctions: { + /** + *Create a new auction. + * + *This can only happen when there isn't already an auction in progress and may only be + *called by the root origin. Accepts the `duration` of this auction and the + *`lease_period_index` of the initial lease period of the four that are to be auctioned. + */ + new_auction: TxDescriptor>; + /** + *Make a new bid from an account (including a parachain account) for deploying a new + *parachain. + * + *Multiple simultaneous bids from the same bidder are allowed only as long as all active + *bids overlap each other (i.e. are mutually exclusive). Bids cannot be redacted. + * + *- `sub` is the sub-bidder ID, allowing for multiple competing bids to be made by (and + *funded by) the same account. + *- `auction_index` is the index of the auction to bid on. Should just be the present + *value of `AuctionCounter`. + *- `first_slot` is the first lease period index of the range to bid on. This is the + *absolute lease period index value, not an auction-specific offset. + *- `last_slot` is the last lease period index of the range to bid on. This is the + *absolute lease period index value, not an auction-specific offset. + *- `amount` is the amount to bid to be held as deposit for the parachain should the + *bid win. This amount is held throughout the range. + */ + bid: TxDescriptor>; + /** + *Cancel an in-progress auction. + * + *Can only be called by Root origin. + */ + cancel_auction: TxDescriptor; + }; + Crowdloan: { + /** + *Create a new crowdloaning campaign for a parachain slot with the given lease period + *range. + * + *This applies a lock to your parachain configuration, ensuring that it cannot be changed + *by the parachain manager. + */ + create: TxDescriptor>; + /** + *Contribute to a crowd sale. This will transfer some balance over to fund a parachain + *slot. It will be withdrawable when the crowdloan has ended and the funds are unused. + */ + contribute: TxDescriptor>; + /** + *Withdraw full balance of a specific contributor. + * + *Origin must be signed, but can come from anyone. + * + *The fund must be either in, or ready for, retirement. For a fund to be *in* retirement, + *then the retirement flag must be set. For a fund to be ready for retirement, then: + *- it must not already be in retirement; + *- the amount of raised funds must be bigger than the _free_ balance of the account; + *- and either: + * - the block number must be at least `end`; or + * - the current lease period must be greater than the fund's `last_period`. + * + *In this case, the fund's retirement flag is set and its `end` is reset to the current + *block number. + * + *- `who`: The account whose contribution should be withdrawn. + *- `index`: The parachain to whose crowdloan the contribution was made. + */ + withdraw: TxDescriptor>; + /** + *Automatically refund contributors of an ended crowdloan. + *Due to weight restrictions, this function may need to be called multiple + *times to fully refund all users. We will refund `RemoveKeysLimit` users at a time. + * + *Origin must be signed, but can come from anyone. + */ + refund: TxDescriptor>; + /** + *Remove a fund after the retirement period has ended and all funds have been returned. + */ + dissolve: TxDescriptor>; + /** + *Edit the configuration for an in-progress crowdloan. + * + *Can only be called by Root origin. + */ + edit: TxDescriptor>; + /** + *Add an optional memo to an existing crowdloan contribution. + * + *Origin must be Signed, and the user must have contributed to the crowdloan. + */ + add_memo: TxDescriptor>; + /** + *Poke the fund into `NewRaise` + * + *Origin must be Signed, and the fund has non-zero raise. + */ + poke: TxDescriptor>; + /** + *Contribute your entire balance to a crowd sale. This will transfer the entire balance of + *a user over to fund a parachain slot. It will be withdrawable when the crowdloan has + *ended and the funds are unused. + */ + contribute_all: TxDescriptor>; + }; + Coretime: { + /** + *Request the configuration to be updated with the specified number of cores. Warning: + *Since this only schedules a configuration update, it takes two sessions to come into + *effect. + * + *- `origin`: Root or the Coretime Chain + *- `count`: total number of cores + */ + request_core_count: TxDescriptor>; + /** + *Request to claim the instantaneous coretime sales revenue starting from the block it was + *last claimed until and up to the block specified. The claimed amount value is sent back + *to the Coretime chain in a `notify_revenue` message. At the same time, the amount is + *teleported to the Coretime chain. + */ + request_revenue_at: TxDescriptor>; + /** + *Receive instructions from the `ExternalBrokerOrigin`, detailing how a specific core is + *to be used. + * + *Parameters: + *-`origin`: The `ExternalBrokerOrigin`, assumed to be the coretime chain. + *-`core`: The core that should be scheduled. + *-`begin`: The starting blockheight of the instruction. + *-`assignment`: How the blockspace should be utilised. + *-`end_hint`: An optional hint as to when this particular set of instructions will end. + */ + assign_core: TxDescriptor>; + }; + StateTrieMigration: { + /** + *Control the automatic migration. + * + *The dispatch origin of this call must be [`Config::ControlOrigin`]. + */ + control_auto_migration: TxDescriptor>; + /** + *Continue the migration for the given `limits`. + * + *The dispatch origin of this call can be any signed account. + * + *This transaction has NO MONETARY INCENTIVES. calling it will not reward anyone. Albeit, + *Upon successful execution, the transaction fee is returned. + * + *The (potentially over-estimated) of the byte length of all the data read must be + *provided for up-front fee-payment and weighing. In essence, the caller is guaranteeing + *that executing the current `MigrationTask` with the given `limits` will not exceed + *`real_size_upper` bytes of read data. + * + *The `witness_task` is merely a helper to prevent the caller from being slashed or + *generally trigger a migration that they do not intend. This parameter is just a message + *from caller, saying that they believed `witness_task` was the last state of the + *migration, and they only wish for their transaction to do anything, if this assumption + *holds. In case `witness_task` does not match, the transaction fails. + * + *Based on the documentation of [`MigrationTask::migrate_until_exhaustion`], the + *recommended way of doing this is to pass a `limit` that only bounds `count`, as the + *`size` limit can always be overwritten. + */ + continue_migrate: TxDescriptor>; + /** + *Migrate the list of top keys by iterating each of them one by one. + * + *This does not affect the global migration process tracker ([`MigrationProcess`]), and + *should only be used in case any keys are leftover due to a bug. + */ + migrate_custom_top: TxDescriptor>; + /** + *Migrate the list of child keys by iterating each of them one by one. + * + *All of the given child keys must be present under one `child_root`. + * + *This does not affect the global migration process tracker ([`MigrationProcess`]), and + *should only be used in case any keys are leftover due to a bug. + */ + migrate_custom_child: TxDescriptor>; + /** + *Set the maximum limit of the signed migration. + */ + set_signed_max_limits: TxDescriptor>; + /** + *Forcefully set the progress the running migration. + * + *This is only useful in one case: the next key to migrate is too big to be migrated with + *a signed account, in a parachain context, and we simply want to skip it. A reasonable + *example of this would be `:code:`, which is both very expensive to migrate, and commonly + *used, so probably it is already migrated. + * + *In case you mess things up, you can also, in principle, use this to reset the migration + *process. + */ + force_set_progress: TxDescriptor>; + }; + XcmPallet: { + /** + + */ + send: TxDescriptor>; + /** + *Teleport some assets from the local chain to some destination chain. + * + ***This function is deprecated: Use `limited_teleport_assets` instead.** + * + *Fee payment on the destination side is made from the asset in the `assets` vector of + *index `fee_asset_item`. The weight limit for fees is not provided and thus is unlimited, + *with all fees taken as needed from the asset. + * + *- `origin`: Must be capable of withdrawing the `assets` and executing XCM. + *- `dest`: Destination context for the assets. Will typically be `[Parent, + * Parachain(..)]` to send from parachain to parachain, or `[Parachain(..)]` to send from + * relay to parachain. + *- `beneficiary`: A beneficiary location for the assets in the context of `dest`. Will + * generally be an `AccountId32` value. + *- `assets`: The assets to be withdrawn. This should include the assets used to pay the + * fee on the `dest` chain. + *- `fee_asset_item`: The index into `assets` of the item which should be used to pay + * fees. + */ + teleport_assets: TxDescriptor>; + /** + *Transfer some assets from the local chain to the destination chain through their local, + *destination or remote reserve. + * + *`assets` must have same reserve location and may not be teleportable to `dest`. + * - `assets` have local reserve: transfer assets to sovereign account of destination + * chain and forward a notification XCM to `dest` to mint and deposit reserve-based + * assets to `beneficiary`. + * - `assets` have destination reserve: burn local assets and forward a notification to + * `dest` chain to withdraw the reserve assets from this chain's sovereign account and + * deposit them to `beneficiary`. + * - `assets` have remote reserve: burn local assets, forward XCM to reserve chain to move + * reserves from this chain's SA to `dest` chain's SA, and forward another XCM to `dest` + * to mint and deposit reserve-based assets to `beneficiary`. + * + ***This function is deprecated: Use `limited_reserve_transfer_assets` instead.** + * + *Fee payment on the destination side is made from the asset in the `assets` vector of + *index `fee_asset_item`. The weight limit for fees is not provided and thus is unlimited, + *with all fees taken as needed from the asset. + * + *- `origin`: Must be capable of withdrawing the `assets` and executing XCM. + *- `dest`: Destination context for the assets. Will typically be `[Parent, + * Parachain(..)]` to send from parachain to parachain, or `[Parachain(..)]` to send from + * relay to parachain. + *- `beneficiary`: A beneficiary location for the assets in the context of `dest`. Will + * generally be an `AccountId32` value. + *- `assets`: The assets to be withdrawn. This should include the assets used to pay the + * fee on the `dest` (and possibly reserve) chains. + *- `fee_asset_item`: The index into `assets` of the item which should be used to pay + * fees. + */ + reserve_transfer_assets: TxDescriptor>; + /** + *Execute an XCM message from a local, signed, origin. + * + *An event is deposited indicating whether `msg` could be executed completely or only + *partially. + * + *No more than `max_weight` will be used in its attempted execution. If this is less than + *the maximum amount of weight that the message could take to be executed, then no + *execution attempt will be made. + */ + execute: TxDescriptor>; + /** + *Extoll that a particular destination can be communicated with through a particular + *version of XCM. + * + *- `origin`: Must be an origin specified by AdminOrigin. + *- `location`: The destination that is being described. + *- `xcm_version`: The latest version of XCM that `location` supports. + */ + force_xcm_version: TxDescriptor>; + /** + *Set a safe XCM version (the version that XCM should be encoded with if the most recent + *version a destination can accept is unknown). + * + *- `origin`: Must be an origin specified by AdminOrigin. + *- `maybe_xcm_version`: The default XCM encoding version, or `None` to disable. + */ + force_default_xcm_version: TxDescriptor>; + /** + *Ask a location to notify us regarding their XCM version and any changes to it. + * + *- `origin`: Must be an origin specified by AdminOrigin. + *- `location`: The location to which we should subscribe for XCM version notifications. + */ + force_subscribe_version_notify: TxDescriptor>; + /** + *Require that a particular destination should no longer notify us regarding any XCM + *version changes. + * + *- `origin`: Must be an origin specified by AdminOrigin. + *- `location`: The location to which we are currently subscribed for XCM version + * notifications which we no longer desire. + */ + force_unsubscribe_version_notify: TxDescriptor>; + /** + *Transfer some assets from the local chain to the destination chain through their local, + *destination or remote reserve. + * + *`assets` must have same reserve location and may not be teleportable to `dest`. + * - `assets` have local reserve: transfer assets to sovereign account of destination + * chain and forward a notification XCM to `dest` to mint and deposit reserve-based + * assets to `beneficiary`. + * - `assets` have destination reserve: burn local assets and forward a notification to + * `dest` chain to withdraw the reserve assets from this chain's sovereign account and + * deposit them to `beneficiary`. + * - `assets` have remote reserve: burn local assets, forward XCM to reserve chain to move + * reserves from this chain's SA to `dest` chain's SA, and forward another XCM to `dest` + * to mint and deposit reserve-based assets to `beneficiary`. + * + *Fee payment on the destination side is made from the asset in the `assets` vector of + *index `fee_asset_item`, up to enough to pay for `weight_limit` of weight. If more weight + *is needed than `weight_limit`, then the operation will fail and the sent assets may be + *at risk. + * + *- `origin`: Must be capable of withdrawing the `assets` and executing XCM. + *- `dest`: Destination context for the assets. Will typically be `[Parent, + * Parachain(..)]` to send from parachain to parachain, or `[Parachain(..)]` to send from + * relay to parachain. + *- `beneficiary`: A beneficiary location for the assets in the context of `dest`. Will + * generally be an `AccountId32` value. + *- `assets`: The assets to be withdrawn. This should include the assets used to pay the + * fee on the `dest` (and possibly reserve) chains. + *- `fee_asset_item`: The index into `assets` of the item which should be used to pay + * fees. + *- `weight_limit`: The remote-side weight limit, if any, for the XCM fee purchase. + */ + limited_reserve_transfer_assets: TxDescriptor>; + /** + *Teleport some assets from the local chain to some destination chain. + * + *Fee payment on the destination side is made from the asset in the `assets` vector of + *index `fee_asset_item`, up to enough to pay for `weight_limit` of weight. If more weight + *is needed than `weight_limit`, then the operation will fail and the sent assets may be + *at risk. + * + *- `origin`: Must be capable of withdrawing the `assets` and executing XCM. + *- `dest`: Destination context for the assets. Will typically be `[Parent, + * Parachain(..)]` to send from parachain to parachain, or `[Parachain(..)]` to send from + * relay to parachain. + *- `beneficiary`: A beneficiary location for the assets in the context of `dest`. Will + * generally be an `AccountId32` value. + *- `assets`: The assets to be withdrawn. This should include the assets used to pay the + * fee on the `dest` chain. + *- `fee_asset_item`: The index into `assets` of the item which should be used to pay + * fees. + *- `weight_limit`: The remote-side weight limit, if any, for the XCM fee purchase. + */ + limited_teleport_assets: TxDescriptor>; + /** + *Set or unset the global suspension state of the XCM executor. + * + *- `origin`: Must be an origin specified by AdminOrigin. + *- `suspended`: `true` to suspend, `false` to resume. + */ + force_suspension: TxDescriptor>; + /** + *Transfer some assets from the local chain to the destination chain through their local, + *destination or remote reserve, or through teleports. + * + *Fee payment on the destination side is made from the asset in the `assets` vector of + *index `fee_asset_item` (hence referred to as `fees`), up to enough to pay for + *`weight_limit` of weight. If more weight is needed than `weight_limit`, then the + *operation will fail and the sent assets may be at risk. + * + *`assets` (excluding `fees`) must have same reserve location or otherwise be teleportable + *to `dest`, no limitations imposed on `fees`. + * - for local reserve: transfer assets to sovereign account of destination chain and + * forward a notification XCM to `dest` to mint and deposit reserve-based assets to + * `beneficiary`. + * - for destination reserve: burn local assets and forward a notification to `dest` chain + * to withdraw the reserve assets from this chain's sovereign account and deposit them + * to `beneficiary`. + * - for remote reserve: burn local assets, forward XCM to reserve chain to move reserves + * from this chain's SA to `dest` chain's SA, and forward another XCM to `dest` to mint + * and deposit reserve-based assets to `beneficiary`. + * - for teleports: burn local assets and forward XCM to `dest` chain to mint/teleport + * assets and deposit them to `beneficiary`. + * + *- `origin`: Must be capable of withdrawing the `assets` and executing XCM. + *- `dest`: Destination context for the assets. Will typically be `X2(Parent, + * Parachain(..))` to send from parachain to parachain, or `X1(Parachain(..))` to send + * from relay to parachain. + *- `beneficiary`: A beneficiary location for the assets in the context of `dest`. Will + * generally be an `AccountId32` value. + *- `assets`: The assets to be withdrawn. This should include the assets used to pay the + * fee on the `dest` (and possibly reserve) chains. + *- `fee_asset_item`: The index into `assets` of the item which should be used to pay + * fees. + *- `weight_limit`: The remote-side weight limit, if any, for the XCM fee purchase. + */ + transfer_assets: TxDescriptor>; + /** + *Claims assets trapped on this pallet because of leftover assets during XCM execution. + * + *- `origin`: Anyone can call this extrinsic. + *- `assets`: The exact assets that were trapped. Use the version to specify what version + *was the latest when they were trapped. + *- `beneficiary`: The location/account where the claimed assets will be deposited. + */ + claim_assets: TxDescriptor>; + /** + *Transfer assets from the local chain to the destination chain using explicit transfer + *types for assets and fees. + * + *`assets` must have same reserve location or may be teleportable to `dest`. Caller must + *provide the `assets_transfer_type` to be used for `assets`: + * - `TransferType::LocalReserve`: transfer assets to sovereign account of destination + * chain and forward a notification XCM to `dest` to mint and deposit reserve-based + * assets to `beneficiary`. + * - `TransferType::DestinationReserve`: burn local assets and forward a notification to + * `dest` chain to withdraw the reserve assets from this chain's sovereign account and + * deposit them to `beneficiary`. + * - `TransferType::RemoteReserve(reserve)`: burn local assets, forward XCM to `reserve` + * chain to move reserves from this chain's SA to `dest` chain's SA, and forward another + * XCM to `dest` to mint and deposit reserve-based assets to `beneficiary`. Typically + * the remote `reserve` is Asset Hub. + * - `TransferType::Teleport`: burn local assets and forward XCM to `dest` chain to + * mint/teleport assets and deposit them to `beneficiary`. + * + *On the destination chain, as well as any intermediary hops, `BuyExecution` is used to + *buy execution using transferred `assets` identified by `remote_fees_id`. + *Make sure enough of the specified `remote_fees_id` asset is included in the given list + *of `assets`. `remote_fees_id` should be enough to pay for `weight_limit`. If more weight + *is needed than `weight_limit`, then the operation will fail and the sent assets may be + *at risk. + * + *`remote_fees_id` may use different transfer type than rest of `assets` and can be + *specified through `fees_transfer_type`. + * + *The caller needs to specify what should happen to the transferred assets once they reach + *the `dest` chain. This is done through the `custom_xcm_on_dest` parameter, which + *contains the instructions to execute on `dest` as a final step. + * This is usually as simple as: + * `Xcm(vec![DepositAsset { assets: Wild(AllCounted(assets.len())), beneficiary }])`, + * but could be something more exotic like sending the `assets` even further. + * + *- `origin`: Must be capable of withdrawing the `assets` and executing XCM. + *- `dest`: Destination context for the assets. Will typically be `[Parent, + * Parachain(..)]` to send from parachain to parachain, or `[Parachain(..)]` to send from + * relay to parachain, or `(parents: 2, (GlobalConsensus(..), ..))` to send from + * parachain across a bridge to another ecosystem destination. + *- `assets`: The assets to be withdrawn. This should include the assets used to pay the + * fee on the `dest` (and possibly reserve) chains. + *- `assets_transfer_type`: The XCM `TransferType` used to transfer the `assets`. + *- `remote_fees_id`: One of the included `assets` to be used to pay fees. + *- `fees_transfer_type`: The XCM `TransferType` used to transfer the `fees` assets. + *- `custom_xcm_on_dest`: The XCM to be executed on `dest` chain as the last step of the + * transfer, which also determines what happens to the assets on the destination chain. + *- `weight_limit`: The remote-side weight limit, if any, for the XCM fee purchase. + */ + transfer_assets_using_type_and_then: TxDescriptor>; + }; + MessageQueue: { + /** + *Remove a page which has no more messages remaining to be processed or is stale. + */ + reap_page: TxDescriptor>; + /** + *Execute an overweight message. + * + *Temporary processing errors will be propagated whereas permanent errors are treated + *as success condition. + * + *- `origin`: Must be `Signed`. + *- `message_origin`: The origin from which the message to be executed arrived. + *- `page`: The page in the queue in which the message to be executed is sitting. + *- `index`: The index into the queue of the message to be executed. + *- `weight_limit`: The maximum amount of weight allowed to be consumed in the execution + * of the message. + * + *Benchmark complexity considerations: O(index + weight_limit). + */ + execute_overweight: TxDescriptor>; + }; + AssetRate: { + /** + *Initialize a conversion rate to native balance for the given asset. + * + *## Complexity + *- O(1) + */ + create: TxDescriptor>; + /** + *Update the conversion rate to native balance for the given asset. + * + *## Complexity + *- O(1) + */ + update: TxDescriptor>; + /** + *Remove an existing conversion rate to native balance for the given asset. + * + *## Complexity + *- O(1) + */ + remove: TxDescriptor>; + }; + Beefy: { + /** + *Report voter equivocation/misbehavior. This method will verify the + *equivocation proof and validate the given key ownership proof + *against the extracted offender. If both are valid, the offence + *will be reported. + */ + report_equivocation: TxDescriptor>; + /** + *Report voter equivocation/misbehavior. This method will verify the + *equivocation proof and validate the given key ownership proof + *against the extracted offender. If both are valid, the offence + *will be reported. + * + *This extrinsic must be called unsigned and it is expected that only + *block authors will call it (validated in `ValidateUnsigned`), as such + *if the block author is defined it will be defined as the equivocation + *reporter. + */ + report_equivocation_unsigned: TxDescriptor>; + /** + *Reset BEEFY consensus by setting a new BEEFY genesis at `delay_in_blocks` blocks in the + *future. + * + *Note: `delay_in_blocks` has to be at least 1. + */ + set_new_genesis: TxDescriptor>; + }; + ParaSudoWrapper: { + /** + *Schedule a para to be initialized at the start of the next session. + * + *This should only be used for TESTING and not on PRODUCTION chains. It automatically + *assigns Coretime to the chain and increases the number of cores. Thus, there is no + *running coretime chain required. + */ + sudo_schedule_para_initialize: TxDescriptor>; + /** + *Schedule a para to be cleaned up at the start of the next session. + */ + sudo_schedule_para_cleanup: TxDescriptor>; + /** + *Upgrade a parathread (on-demand parachain) to a lease holding parachain + */ + sudo_schedule_parathread_upgrade: TxDescriptor>; + /** + *Downgrade a lease holding parachain to an on-demand parachain + */ + sudo_schedule_parachain_downgrade: TxDescriptor>; + /** + *Send a downward XCM to the given para. + * + *The given parachain should exist and the payload should not exceed the preconfigured + *size `config.max_downward_message_size`. + */ + sudo_queue_downward_xcm: TxDescriptor>; + /** + *Forcefully establish a channel from the sender to the recipient. + * + *This is equivalent to sending an `Hrmp::hrmp_init_open_channel` extrinsic followed by + *`Hrmp::hrmp_accept_open_channel`. + */ + sudo_establish_hrmp_channel: TxDescriptor>; + }; + Sudo: { + /** + *Authenticates the sudo key and dispatches a function call with `Root` origin. + */ + sudo: TxDescriptor>; + /** + *Authenticates the sudo key and dispatches a function call with `Root` origin. + *This function does not check the weight of the call, and instead allows the + *Sudo user to specify the weight of the call. + * + *The dispatch origin for this call must be _Signed_. + */ + sudo_unchecked_weight: TxDescriptor>; + /** + *Authenticates the current sudo key and sets the given AccountId (`new`) as the new sudo + *key. + */ + set_key: TxDescriptor>; + /** + *Authenticates the sudo key and dispatches a function call with `Signed` origin from + *a given account. + * + *The dispatch origin for this call must be _Signed_. + */ + sudo_as: TxDescriptor>; + /** + *Permanently removes the sudo key. + * + ***This cannot be un-done.** + */ + remove_key: TxDescriptor; + }; +}; +type IEvent = { + System: { + /** + *An extrinsic completed successfully. + */ + ExtrinsicSuccess: PlainDescriptor>; + /** + *An extrinsic failed. + */ + ExtrinsicFailed: PlainDescriptor>; + /** + *`:code` was updated. + */ + CodeUpdated: PlainDescriptor; + /** + *A new account was created. + */ + NewAccount: PlainDescriptor>; + /** + *An account was reaped. + */ + KilledAccount: PlainDescriptor>; + /** + *On on-chain remark happened. + */ + Remarked: PlainDescriptor>; + /** + *An upgrade was authorized. + */ + UpgradeAuthorized: PlainDescriptor>; + }; + Scheduler: { + /** + *Scheduled some task. + */ + Scheduled: PlainDescriptor>; + /** + *Canceled some task. + */ + Canceled: PlainDescriptor>; + /** + *Dispatched some task. + */ + Dispatched: PlainDescriptor>; + /** + *Set a retry configuration for some task. + */ + RetrySet: PlainDescriptor>; + /** + *Cancel a retry configuration for some task. + */ + RetryCancelled: PlainDescriptor>; + /** + *The call for the provided hash was not found so the task has been aborted. + */ + CallUnavailable: PlainDescriptor>; + /** + *The given task was unable to be renewed since the agenda is full at that block. + */ + PeriodicFailed: PlainDescriptor>; + /** + *The given task was unable to be retried since the agenda is full at that block or there + *was not enough weight to reschedule it. + */ + RetryFailed: PlainDescriptor>; + /** + *The given task can never be executed since it is overweight. + */ + PermanentlyOverweight: PlainDescriptor>; + }; + Preimage: { + /** + *A preimage has been noted. + */ + Noted: PlainDescriptor>; + /** + *A preimage has been requested. + */ + Requested: PlainDescriptor>; + /** + *A preimage has ben cleared. + */ + Cleared: PlainDescriptor>; + }; + Indices: { + /** + *A account index was assigned. + */ + IndexAssigned: PlainDescriptor>; + /** + *A account index has been freed up (unassigned). + */ + IndexFreed: PlainDescriptor>; + /** + *A account index has been frozen to its current account ID. + */ + IndexFrozen: PlainDescriptor>; + }; + Balances: { + /** + *An account was created with some free balance. + */ + Endowed: PlainDescriptor>; + /** + *An account was removed whose balance was non-zero but below ExistentialDeposit, + *resulting in an outright loss. + */ + DustLost: PlainDescriptor>; + /** + *Transfer succeeded. + */ + Transfer: PlainDescriptor>; + /** + *A balance was set by root. + */ + BalanceSet: PlainDescriptor>; + /** + *Some balance was reserved (moved from free to reserved). + */ + Reserved: PlainDescriptor>; + /** + *Some balance was unreserved (moved from reserved to free). + */ + Unreserved: PlainDescriptor>; + /** + *Some balance was moved from the reserve of the first account to the second account. + *Final argument indicates the destination balance type. + */ + ReserveRepatriated: PlainDescriptor>; + /** + *Some amount was deposited (e.g. for transaction fees). + */ + Deposit: PlainDescriptor>; + /** + *Some amount was withdrawn from the account (e.g. for transaction fees). + */ + Withdraw: PlainDescriptor>; + /** + *Some amount was removed from the account (e.g. for misbehavior). + */ + Slashed: PlainDescriptor>; + /** + *Some amount was minted into an account. + */ + Minted: PlainDescriptor>; + /** + *Some amount was burned from an account. + */ + Burned: PlainDescriptor>; + /** + *Some amount was suspended from an account (it can be restored later). + */ + Suspended: PlainDescriptor>; + /** + *Some amount was restored into an account. + */ + Restored: PlainDescriptor>; + /** + *An account was upgraded. + */ + Upgraded: PlainDescriptor>; + /** + *Total issuance was increased by `amount`, creating a credit to be balanced. + */ + Issued: PlainDescriptor>; + /** + *Total issuance was decreased by `amount`, creating a debt to be balanced. + */ + Rescinded: PlainDescriptor>; + /** + *Some balance was locked. + */ + Locked: PlainDescriptor>; + /** + *Some balance was unlocked. + */ + Unlocked: PlainDescriptor>; + /** + *Some balance was frozen. + */ + Frozen: PlainDescriptor>; + /** + *Some balance was thawed. + */ + Thawed: PlainDescriptor>; + /** + *The `TotalIssuance` was forcefully changed. + */ + TotalIssuanceForced: PlainDescriptor>; + }; + TransactionPayment: { + /** + *A transaction fee `actual_fee`, of which `tip` was added to the minimum inclusion fee, + *has been paid by `who`. + */ + TransactionFeePaid: PlainDescriptor>; + }; + Staking: { + /** + *The era payout has been set; the first balance is the validator-payout; the second is + *the remainder from the maximum amount of reward. + */ + EraPaid: PlainDescriptor>; + /** + *The nominator has been rewarded by this amount to this destination. + */ + Rewarded: PlainDescriptor>; + /** + *A staker (validator or nominator) has been slashed by the given amount. + */ + Slashed: PlainDescriptor>; + /** + *A slash for the given validator, for the given percentage of their stake, at the given + *era as been reported. + */ + SlashReported: PlainDescriptor>; + /** + *An old slashing report from a prior era was discarded because it could + *not be processed. + */ + OldSlashingReportDiscarded: PlainDescriptor>; + /** + *A new set of stakers was elected. + */ + StakersElected: PlainDescriptor; + /** + *An account has bonded this amount. \[stash, amount\] + * + *NOTE: This event is only emitted when funds are bonded via a dispatchable. Notably, + *it will not be emitted for staking rewards when they are added to stake. + */ + Bonded: PlainDescriptor>; + /** + *An account has unbonded this amount. + */ + Unbonded: PlainDescriptor>; + /** + *An account has called `withdraw_unbonded` and removed unbonding chunks worth `Balance` + *from the unlocking queue. + */ + Withdrawn: PlainDescriptor>; + /** + *A nominator has been kicked from a validator. + */ + Kicked: PlainDescriptor>; + /** + *The election failed. No new era is planned. + */ + StakingElectionFailed: PlainDescriptor; + /** + *An account has stopped participating as either a validator or nominator. + */ + Chilled: PlainDescriptor>; + /** + *The stakers' rewards are getting paid. + */ + PayoutStarted: PlainDescriptor>; + /** + *A validator has set their preferences. + */ + ValidatorPrefsSet: PlainDescriptor>; + /** + *Voters size limit reached. + */ + SnapshotVotersSizeExceeded: PlainDescriptor>; + /** + *Targets size limit reached. + */ + SnapshotTargetsSizeExceeded: PlainDescriptor>; + /** + *A new force era mode was set. + */ + ForceEra: PlainDescriptor>; + /** + *Report of a controller batch deprecation. + */ + ControllerBatchDeprecated: PlainDescriptor>; + }; + Offences: { + /** + *There is an offence reported of the given `kind` happened at the `session_index` and + *(kind-specific) time slot. This event is not deposited for duplicate slashes. + *\[kind, timeslot\]. + */ + Offence: PlainDescriptor>; + }; + Session: { + /** + *New session has happened. Note that the argument is the session index, not the + *block number as the type might suggest. + */ + NewSession: PlainDescriptor>; + }; + Grandpa: { + /** + *New authority set has been applied. + */ + NewAuthorities: PlainDescriptor>; + /** + *Current authority set has been paused. + */ + Paused: PlainDescriptor; + /** + *Current authority set has been resumed. + */ + Resumed: PlainDescriptor; + }; + Treasury: { + /** + *We have ended a spend period and will now allocate funds. + */ + Spending: PlainDescriptor>; + /** + *Some funds have been allocated. + */ + Awarded: PlainDescriptor>; + /** + *Some of our funds have been burnt. + */ + Burnt: PlainDescriptor>; + /** + *Spending has finished; this is the amount that rolls over until next spend. + */ + Rollover: PlainDescriptor>; + /** + *Some funds have been deposited. + */ + Deposit: PlainDescriptor>; + /** + *A new spend proposal has been approved. + */ + SpendApproved: PlainDescriptor>; + /** + *The inactive funds of the pallet have been updated. + */ + UpdatedInactive: PlainDescriptor>; + /** + *A new asset spend proposal has been approved. + */ + AssetSpendApproved: PlainDescriptor>; + /** + *An approved spend was voided. + */ + AssetSpendVoided: PlainDescriptor>; + /** + *A payment happened. + */ + Paid: PlainDescriptor>; + /** + *A payment failed and can be retried. + */ + PaymentFailed: PlainDescriptor>; + /** + *A spend was processed and removed from the storage. It might have been successfully + *paid or it may have expired. + */ + SpendProcessed: PlainDescriptor>; + }; + ConvictionVoting: { + /** + *An account has delegated their vote to another account. \[who, target\] + */ + Delegated: PlainDescriptor>; + /** + *An \[account\] has cancelled a previous delegation operation. + */ + Undelegated: PlainDescriptor; + }; + Referenda: { + /** + *A referendum has been submitted. + */ + Submitted: PlainDescriptor>; + /** + *The decision deposit has been placed. + */ + DecisionDepositPlaced: PlainDescriptor>; + /** + *The decision deposit has been refunded. + */ + DecisionDepositRefunded: PlainDescriptor>; + /** + *A deposit has been slashed. + */ + DepositSlashed: PlainDescriptor>; + /** + *A referendum has moved into the deciding phase. + */ + DecisionStarted: PlainDescriptor>; + /** + + */ + ConfirmStarted: PlainDescriptor>; + /** + + */ + ConfirmAborted: PlainDescriptor>; + /** + *A referendum has ended its confirmation phase and is ready for approval. + */ + Confirmed: PlainDescriptor>; + /** + *A referendum has been approved and its proposal has been scheduled. + */ + Approved: PlainDescriptor>; + /** + *A proposal has been rejected by referendum. + */ + Rejected: PlainDescriptor>; + /** + *A referendum has been timed out without being decided. + */ + TimedOut: PlainDescriptor>; + /** + *A referendum has been cancelled. + */ + Cancelled: PlainDescriptor>; + /** + *A referendum has been killed. + */ + Killed: PlainDescriptor>; + /** + *The submission deposit has been refunded. + */ + SubmissionDepositRefunded: PlainDescriptor>; + /** + *Metadata for a referendum has been set. + */ + MetadataSet: PlainDescriptor>; + /** + *Metadata for a referendum has been cleared. + */ + MetadataCleared: PlainDescriptor>; + }; + Whitelist: { + /** + + */ + CallWhitelisted: PlainDescriptor>; + /** + + */ + WhitelistedCallRemoved: PlainDescriptor>; + /** + + */ + WhitelistedCallDispatched: PlainDescriptor>; + }; + Parameters: { + /** + *A Parameter was set. + * + *Is also emitted when the value was not changed. + */ + Updated: PlainDescriptor>; + }; + Claims: { + /** + *Someone claimed some DOTs. + */ + Claimed: PlainDescriptor>; + }; + Vesting: { + /** + *The amount vested has been updated. This could indicate a change in funds available. + *The balance given is the amount which is left unvested (and thus locked). + */ + VestingUpdated: PlainDescriptor>; + /** + *An \[account\] has become fully vested. + */ + VestingCompleted: PlainDescriptor>; + }; + Utility: { + /** + *Batch of dispatches did not complete fully. Index of first failing dispatch given, as + *well as the error. + */ + BatchInterrupted: PlainDescriptor>; + /** + *Batch of dispatches completed fully with no error. + */ + BatchCompleted: PlainDescriptor; + /** + *Batch of dispatches completed but has errors. + */ + BatchCompletedWithErrors: PlainDescriptor; + /** + *A single item within a Batch of dispatches has completed with no error. + */ + ItemCompleted: PlainDescriptor; + /** + *A single item within a Batch of dispatches has completed with error. + */ + ItemFailed: PlainDescriptor>; + /** + *A call was dispatched. + */ + DispatchedAs: PlainDescriptor>; + }; + Proxy: { + /** + *A proxy was executed correctly, with the given. + */ + ProxyExecuted: PlainDescriptor>; + /** + *A pure account has been created by new proxy with given + *disambiguation index and proxy type. + */ + PureCreated: PlainDescriptor>; + /** + *An announcement was placed to make a call in the future. + */ + Announced: PlainDescriptor>; + /** + *A proxy was added. + */ + ProxyAdded: PlainDescriptor>; + /** + *A proxy was removed. + */ + ProxyRemoved: PlainDescriptor>; + }; + Multisig: { + /** + *A new multisig operation has begun. + */ + NewMultisig: PlainDescriptor>; + /** + *A multisig operation has been approved by someone. + */ + MultisigApproval: PlainDescriptor>; + /** + *A multisig operation has been executed. + */ + MultisigExecuted: PlainDescriptor>; + /** + *A multisig operation has been cancelled. + */ + MultisigCancelled: PlainDescriptor>; + }; + Bounties: { + /** + *New bounty proposal. + */ + BountyProposed: PlainDescriptor>; + /** + *A bounty proposal was rejected; funds were slashed. + */ + BountyRejected: PlainDescriptor>; + /** + *A bounty proposal is funded and became active. + */ + BountyBecameActive: PlainDescriptor>; + /** + *A bounty is awarded to a beneficiary. + */ + BountyAwarded: PlainDescriptor>; + /** + *A bounty is claimed by beneficiary. + */ + BountyClaimed: PlainDescriptor>; + /** + *A bounty is cancelled. + */ + BountyCanceled: PlainDescriptor>; + /** + *A bounty expiry is extended. + */ + BountyExtended: PlainDescriptor>; + /** + *A bounty is approved. + */ + BountyApproved: PlainDescriptor>; + /** + *A bounty curator is proposed. + */ + CuratorProposed: PlainDescriptor>; + /** + *A bounty curator is unassigned. + */ + CuratorUnassigned: PlainDescriptor>; + /** + *A bounty curator is accepted. + */ + CuratorAccepted: PlainDescriptor>; + }; + ChildBounties: { + /** + *A child-bounty is added. + */ + Added: PlainDescriptor>; + /** + *A child-bounty is awarded to a beneficiary. + */ + Awarded: PlainDescriptor>; + /** + *A child-bounty is claimed by beneficiary. + */ + Claimed: PlainDescriptor>; + /** + *A child-bounty is cancelled. + */ + Canceled: PlainDescriptor>; + }; + ElectionProviderMultiPhase: { + /** + *A solution was stored with the given compute. + * + *The `origin` indicates the origin of the solution. If `origin` is `Some(AccountId)`, + *the stored solution was submitted in the signed phase by a miner with the `AccountId`. + *Otherwise, the solution was stored either during the unsigned phase or by + *`T::ForceOrigin`. The `bool` is `true` when a previous solution was ejected to make + *room for this one. + */ + SolutionStored: PlainDescriptor>; + /** + *The election has been finalized, with the given computation and score. + */ + ElectionFinalized: PlainDescriptor>; + /** + *An election failed. + * + *Not much can be said about which computes failed in the process. + */ + ElectionFailed: PlainDescriptor; + /** + *An account has been rewarded for their signed submission being finalized. + */ + Rewarded: PlainDescriptor>; + /** + *An account has been slashed for submitting an invalid signed submission. + */ + Slashed: PlainDescriptor>; + /** + *There was a phase transition in a given round. + */ + PhaseTransitioned: PlainDescriptor>; + }; + VoterList: { + /** + *Moved an account from one bag to another. + */ + Rebagged: PlainDescriptor>; + /** + *Updated the score of some account to the given amount. + */ + ScoreUpdated: PlainDescriptor>; + }; + NominationPools: { + /** + *A pool has been created. + */ + Created: PlainDescriptor>; + /** + *A member has became bonded in a pool. + */ + Bonded: PlainDescriptor>; + /** + *A payout has been made to a member. + */ + PaidOut: PlainDescriptor>; + /** + *A member has unbonded from their pool. + * + *- `balance` is the corresponding balance of the number of points that has been + * requested to be unbonded (the argument of the `unbond` transaction) from the bonded + * pool. + *- `points` is the number of points that are issued as a result of `balance` being + *dissolved into the corresponding unbonding pool. + *- `era` is the era in which the balance will be unbonded. + *In the absence of slashing, these values will match. In the presence of slashing, the + *number of points that are issued in the unbonding pool will be less than the amount + *requested to be unbonded. + */ + Unbonded: PlainDescriptor>; + /** + *A member has withdrawn from their pool. + * + *The given number of `points` have been dissolved in return of `balance`. + * + *Similar to `Unbonded` event, in the absence of slashing, the ratio of point to balance + *will be 1. + */ + Withdrawn: PlainDescriptor>; + /** + *A pool has been destroyed. + */ + Destroyed: PlainDescriptor>; + /** + *The state of a pool has changed + */ + StateChanged: PlainDescriptor>; + /** + *A member has been removed from a pool. + * + *The removal can be voluntary (withdrawn all unbonded funds) or involuntary (kicked). + */ + MemberRemoved: PlainDescriptor>; + /** + *The roles of a pool have been updated to the given new roles. Note that the depositor + *can never change. + */ + RolesUpdated: PlainDescriptor>; + /** + *The active balance of pool `pool_id` has been slashed to `balance`. + */ + PoolSlashed: PlainDescriptor>; + /** + *The unbond pool at `era` of pool `pool_id` has been slashed to `balance`. + */ + UnbondingPoolSlashed: PlainDescriptor>; + /** + *A pool's commission setting has been changed. + */ + PoolCommissionUpdated: PlainDescriptor>; + /** + *A pool's maximum commission setting has been changed. + */ + PoolMaxCommissionUpdated: PlainDescriptor>; + /** + *A pool's commission `change_rate` has been changed. + */ + PoolCommissionChangeRateUpdated: PlainDescriptor>; + /** + *Pool commission claim permission has been updated. + */ + PoolCommissionClaimPermissionUpdated: PlainDescriptor>; + /** + *Pool commission has been claimed. + */ + PoolCommissionClaimed: PlainDescriptor>; + /** + *Topped up deficit in frozen ED of the reward pool. + */ + MinBalanceDeficitAdjusted: PlainDescriptor>; + /** + *Claimed excess frozen ED of af the reward pool. + */ + MinBalanceExcessAdjusted: PlainDescriptor>; + }; + FastUnstake: { + /** + *A staker was unstaked. + */ + Unstaked: PlainDescriptor>; + /** + *A staker was slashed for requesting fast-unstake whilst being exposed. + */ + Slashed: PlainDescriptor>; + /** + *A batch was partially checked for the given eras, but the process did not finish. + */ + BatchChecked: PlainDescriptor>; + /** + *A batch of a given size was terminated. + * + *This is always follows by a number of `Unstaked` or `Slashed` events, marking the end + *of the batch. A new batch will be created upon next block. + */ + BatchFinished: PlainDescriptor>; + /** + *An internal error happened. Operations will be paused now. + */ + InternalError: PlainDescriptor; + }; + ParaInclusion: { + /** + *A candidate was backed. `[candidate, head_data]` + */ + CandidateBacked: PlainDescriptor>; + /** + *A candidate was included. `[candidate, head_data]` + */ + CandidateIncluded: PlainDescriptor>; + /** + *A candidate timed out. `[candidate, head_data]` + */ + CandidateTimedOut: PlainDescriptor>; + /** + *Some upward messages have been received and will be processed. + */ + UpwardMessagesReceived: PlainDescriptor>; + }; + Paras: { + /** + *Current code has been updated for a Para. `para_id` + */ + CurrentCodeUpdated: PlainDescriptor; + /** + *Current head has been updated for a Para. `para_id` + */ + CurrentHeadUpdated: PlainDescriptor; + /** + *A code upgrade has been scheduled for a Para. `para_id` + */ + CodeUpgradeScheduled: PlainDescriptor; + /** + *A new head has been noted for a Para. `para_id` + */ + NewHeadNoted: PlainDescriptor; + /** + *A para has been queued to execute pending actions. `para_id` + */ + ActionQueued: PlainDescriptor>; + /** + *The given para either initiated or subscribed to a PVF check for the given validation + *code. `code_hash` `para_id` + */ + PvfCheckStarted: PlainDescriptor>; + /** + *The given validation code was accepted by the PVF pre-checking vote. + *`code_hash` `para_id` + */ + PvfCheckAccepted: PlainDescriptor>; + /** + *The given validation code was rejected by the PVF pre-checking vote. + *`code_hash` `para_id` + */ + PvfCheckRejected: PlainDescriptor>; + }; + Hrmp: { + /** + *Open HRMP channel requested. + */ + OpenChannelRequested: PlainDescriptor>; + /** + *An HRMP channel request sent by the receiver was canceled by either party. + */ + OpenChannelCanceled: PlainDescriptor>; + /** + *Open HRMP channel accepted. + */ + OpenChannelAccepted: PlainDescriptor>; + /** + *HRMP channel closed. + */ + ChannelClosed: PlainDescriptor>; + /** + *An HRMP channel was opened via Root origin. + */ + HrmpChannelForceOpened: PlainDescriptor>; + /** + *An HRMP channel was opened with a system chain. + */ + HrmpSystemChannelOpened: PlainDescriptor>; + /** + *An HRMP channel's deposits were updated. + */ + OpenChannelDepositsUpdated: PlainDescriptor>; + }; + ParasDisputes: { + /** + *A dispute has been initiated. \[candidate hash, dispute location\] + */ + DisputeInitiated: PlainDescriptor>; + /** + *A dispute has concluded for or against a candidate. + *`\[para id, candidate hash, dispute result\]` + */ + DisputeConcluded: PlainDescriptor>; + /** + *A dispute has concluded with supermajority against a candidate. + *Block authors should no longer build on top of this head and should + *instead revert the block at the given height. This should be the + *number of the child of the last known valid block in the chain. + */ + Revert: PlainDescriptor; + }; + OnDemand: { + /** + *An order was placed at some spot price amount by orderer ordered_by + */ + OnDemandOrderPlaced: PlainDescriptor>; + /** + *The value of the spot price has likely changed + */ + SpotPriceSet: PlainDescriptor>; + }; + Registrar: { + /** + + */ + Registered: PlainDescriptor>; + /** + + */ + Deregistered: PlainDescriptor>; + /** + + */ + Reserved: PlainDescriptor>; + /** + + */ + Swapped: PlainDescriptor>; + }; + Slots: { + /** + *A new `[lease_period]` is beginning. + */ + NewLeasePeriod: PlainDescriptor>; + /** + *A para has won the right to a continuous set of lease periods as a parachain. + *First balance is any extra amount reserved on top of the para's existing deposit. + *Second balance is the total amount reserved. + */ + Leased: PlainDescriptor>; + }; + Auctions: { + /** + *An auction started. Provides its index and the block number where it will begin to + *close and the first lease period of the quadruplet that is auctioned. + */ + AuctionStarted: PlainDescriptor>; + /** + *An auction ended. All funds become unreserved. + */ + AuctionClosed: PlainDescriptor>; + /** + *Funds were reserved for a winning bid. First balance is the extra amount reserved. + *Second is the total. + */ + Reserved: PlainDescriptor>; + /** + *Funds were unreserved since bidder is no longer active. `[bidder, amount]` + */ + Unreserved: PlainDescriptor>; + /** + *Someone attempted to lease the same slot twice for a parachain. The amount is held in + *reserve but no parachain slot has been leased. + */ + ReserveConfiscated: PlainDescriptor>; + /** + *A new bid has been accepted as the current winner. + */ + BidAccepted: PlainDescriptor>; + /** + *The winning offset was chosen for an auction. This will map into the `Winning` storage + *map. + */ + WinningOffset: PlainDescriptor>; + }; + Crowdloan: { + /** + *Create a new crowdloaning campaign. + */ + Created: PlainDescriptor>; + /** + *Contributed to a crowd sale. + */ + Contributed: PlainDescriptor>; + /** + *Withdrew full balance of a contributor. + */ + Withdrew: PlainDescriptor>; + /** + *The loans in a fund have been partially dissolved, i.e. there are some left + *over child keys that still need to be killed. + */ + PartiallyRefunded: PlainDescriptor>; + /** + *All loans in a fund have been refunded. + */ + AllRefunded: PlainDescriptor>; + /** + *Fund is dissolved. + */ + Dissolved: PlainDescriptor>; + /** + *The result of trying to submit a new bid to the Slots pallet. + */ + HandleBidResult: PlainDescriptor>; + /** + *The configuration to a crowdloan has been edited. + */ + Edited: PlainDescriptor>; + /** + *A memo has been updated. + */ + MemoUpdated: PlainDescriptor>; + /** + *A parachain has been moved to `NewRaise` + */ + AddedToNewRaise: PlainDescriptor>; + }; + Coretime: { + /** + *The broker chain has asked for revenue information for a specific block. + */ + RevenueInfoRequested: PlainDescriptor>; + /** + *A core has received a new assignment from the broker chain. + */ + CoreAssigned: PlainDescriptor>; + }; + StateTrieMigration: { + /** + *Given number of `(top, child)` keys were migrated respectively, with the given + *`compute`. + */ + Migrated: PlainDescriptor>; + /** + *Some account got slashed by the given amount. + */ + Slashed: PlainDescriptor>; + /** + *The auto migration task finished. + */ + AutoMigrationFinished: PlainDescriptor; + /** + *Migration got halted due to an error or miss-configuration. + */ + Halted: PlainDescriptor>; + }; + XcmPallet: { + /** + *Execution of an XCM message was attempted. + */ + Attempted: PlainDescriptor>; + /** + *A XCM message was sent. + */ + Sent: PlainDescriptor>; + /** + *Query response received which does not match a registered query. This may be because a + *matching query was never registered, it may be because it is a duplicate response, or + *because the query timed out. + */ + UnexpectedResponse: PlainDescriptor>; + /** + *Query response has been received and is ready for taking with `take_response`. There is + *no registered notification call. + */ + ResponseReady: PlainDescriptor>; + /** + *Query response has been received and query is removed. The registered notification has + *been dispatched and executed successfully. + */ + Notified: PlainDescriptor>; + /** + *Query response has been received and query is removed. The registered notification + *could not be dispatched because the dispatch weight is greater than the maximum weight + *originally budgeted by this runtime for the query result. + */ + NotifyOverweight: PlainDescriptor>; + /** + *Query response has been received and query is removed. There was a general error with + *dispatching the notification call. + */ + NotifyDispatchError: PlainDescriptor>; + /** + *Query response has been received and query is removed. The dispatch was unable to be + *decoded into a `Call`; this might be due to dispatch function having a signature which + *is not `(origin, QueryId, Response)`. + */ + NotifyDecodeFailed: PlainDescriptor>; + /** + *Expected query response has been received but the origin location of the response does + *not match that expected. The query remains registered for a later, valid, response to + *be received and acted upon. + */ + InvalidResponder: PlainDescriptor>; + /** + *Expected query response has been received but the expected origin location placed in + *storage by this runtime previously cannot be decoded. The query remains registered. + * + *This is unexpected (since a location placed in storage in a previously executing + *runtime should be readable prior to query timeout) and dangerous since the possibly + *valid response will be dropped. Manual governance intervention is probably going to be + *needed. + */ + InvalidResponderVersion: PlainDescriptor>; + /** + *Received query response has been read and removed. + */ + ResponseTaken: PlainDescriptor>; + /** + *Some assets have been placed in an asset trap. + */ + AssetsTrapped: PlainDescriptor>; + /** + *An XCM version change notification message has been attempted to be sent. + * + *The cost of sending it (borne by the chain) is included. + */ + VersionChangeNotified: PlainDescriptor>; + /** + *The supported version of a location has been changed. This might be through an + *automatic notification or a manual intervention. + */ + SupportedVersionChanged: PlainDescriptor>; + /** + *A given location which had a version change subscription was dropped owing to an error + *sending the notification to it. + */ + NotifyTargetSendFail: PlainDescriptor>; + /** + *A given location which had a version change subscription was dropped owing to an error + *migrating the location to our new XCM format. + */ + NotifyTargetMigrationFail: PlainDescriptor>; + /** + *Expected query response has been received but the expected querier location placed in + *storage by this runtime previously cannot be decoded. The query remains registered. + * + *This is unexpected (since a location placed in storage in a previously executing + *runtime should be readable prior to query timeout) and dangerous since the possibly + *valid response will be dropped. Manual governance intervention is probably going to be + *needed. + */ + InvalidQuerierVersion: PlainDescriptor>; + /** + *Expected query response has been received but the querier location of the response does + *not match the expected. The query remains registered for a later, valid, response to + *be received and acted upon. + */ + InvalidQuerier: PlainDescriptor>; + /** + *A remote has requested XCM version change notification from us and we have honored it. + *A version information message is sent to them and its cost is included. + */ + VersionNotifyStarted: PlainDescriptor>; + /** + *We have requested that a remote chain send us XCM version change notifications. + */ + VersionNotifyRequested: PlainDescriptor>; + /** + *We have requested that a remote chain stops sending us XCM version change + *notifications. + */ + VersionNotifyUnrequested: PlainDescriptor>; + /** + *Fees were paid from a location for an operation (often for using `SendXcm`). + */ + FeesPaid: PlainDescriptor>; + /** + *Some assets have been claimed from an asset trap + */ + AssetsClaimed: PlainDescriptor>; + /** + *A XCM version migration finished. + */ + VersionMigrationFinished: PlainDescriptor>; + }; + MessageQueue: { + /** + *Message discarded due to an error in the `MessageProcessor` (usually a format error). + */ + ProcessingFailed: PlainDescriptor>; + /** + *Message is processed. + */ + Processed: PlainDescriptor>; + /** + *Message placed in overweight queue. + */ + OverweightEnqueued: PlainDescriptor>; + /** + *This page was reaped. + */ + PageReaped: PlainDescriptor>; + }; + AssetRate: { + /** + + */ + AssetRateCreated: PlainDescriptor>; + /** + + */ + AssetRateRemoved: PlainDescriptor>; + /** + + */ + AssetRateUpdated: PlainDescriptor>; + }; + Sudo: { + /** + *A sudo call just took place. + */ + Sudid: PlainDescriptor>; + /** + *The sudo key has been updated. + */ + KeyChanged: PlainDescriptor>; + /** + *The key was permanently removed. + */ + KeyRemoved: PlainDescriptor; + /** + *A [sudo_as](Pallet::sudo_as) call just took place. + */ + SudoAsDone: PlainDescriptor>; + }; +}; +type IError = { + System: { + /** + *The name of specification does not match between the current runtime + *and the new runtime. + */ + InvalidSpecName: PlainDescriptor; + /** + *The specification version is not allowed to decrease between the current runtime + *and the new runtime. + */ + SpecVersionNeedsToIncrease: PlainDescriptor; + /** + *Failed to extract the runtime version from the new runtime. + * + *Either calling `Core_version` or decoding `RuntimeVersion` failed. + */ + FailedToExtractRuntimeVersion: PlainDescriptor; + /** + *Suicide called when the account has non-default composite data. + */ + NonDefaultComposite: PlainDescriptor; + /** + *There is a non-zero reference count preventing the account from being purged. + */ + NonZeroRefCount: PlainDescriptor; + /** + *The origin filter prevent the call to be dispatched. + */ + CallFiltered: PlainDescriptor; + /** + *A multi-block migration is ongoing and prevents the current code from being replaced. + */ + MultiBlockMigrationsOngoing: PlainDescriptor; + /** + *No upgrade authorized. + */ + NothingAuthorized: PlainDescriptor; + /** + *The submitted code is not authorized. + */ + Unauthorized: PlainDescriptor; + }; + Scheduler: { + /** + *Failed to schedule a call + */ + FailedToSchedule: PlainDescriptor; + /** + *Cannot find the scheduled call. + */ + NotFound: PlainDescriptor; + /** + *Given target block number is in the past. + */ + TargetBlockNumberInPast: PlainDescriptor; + /** + *Reschedule failed because it does not change scheduled time. + */ + RescheduleNoChange: PlainDescriptor; + /** + *Attempt to use a non-named function on a named task. + */ + Named: PlainDescriptor; + }; + Preimage: { + /** + *Preimage is too large to store on-chain. + */ + TooBig: PlainDescriptor; + /** + *Preimage has already been noted on-chain. + */ + AlreadyNoted: PlainDescriptor; + /** + *The user is not authorized to perform this action. + */ + NotAuthorized: PlainDescriptor; + /** + *The preimage cannot be removed since it has not yet been noted. + */ + NotNoted: PlainDescriptor; + /** + *A preimage may not be removed when there are outstanding requests. + */ + Requested: PlainDescriptor; + /** + *The preimage request cannot be removed since no outstanding requests exist. + */ + NotRequested: PlainDescriptor; + /** + *More than `MAX_HASH_UPGRADE_BULK_COUNT` hashes were requested to be upgraded at once. + */ + TooMany: PlainDescriptor; + /** + *Too few hashes were requested to be upgraded (i.e. zero). + */ + TooFew: PlainDescriptor; + /** + *No ticket with a cost was returned by [`Config::Consideration`] to store the preimage. + */ + NoCost: PlainDescriptor; + }; + Babe: { + /** + *An equivocation proof provided as part of an equivocation report is invalid. + */ + InvalidEquivocationProof: PlainDescriptor; + /** + *A key ownership proof provided as part of an equivocation report is invalid. + */ + InvalidKeyOwnershipProof: PlainDescriptor; + /** + *A given equivocation report is valid but already previously reported. + */ + DuplicateOffenceReport: PlainDescriptor; + /** + *Submitted configuration is invalid. + */ + InvalidConfiguration: PlainDescriptor; + }; + Indices: { + /** + *The index was not already assigned. + */ + NotAssigned: PlainDescriptor; + /** + *The index is assigned to another account. + */ + NotOwner: PlainDescriptor; + /** + *The index was not available. + */ + InUse: PlainDescriptor; + /** + *The source and destination accounts are identical. + */ + NotTransfer: PlainDescriptor; + /** + *The index is permanent and may not be freed/changed. + */ + Permanent: PlainDescriptor; + }; + Balances: { + /** + *Vesting balance too high to send value. + */ + VestingBalance: PlainDescriptor; + /** + *Account liquidity restrictions prevent withdrawal. + */ + LiquidityRestrictions: PlainDescriptor; + /** + *Balance too low to send value. + */ + InsufficientBalance: PlainDescriptor; + /** + *Value too low to create account due to existential deposit. + */ + ExistentialDeposit: PlainDescriptor; + /** + *Transfer/payment would kill account. + */ + Expendability: PlainDescriptor; + /** + *A vesting schedule already exists for this account. + */ + ExistingVestingSchedule: PlainDescriptor; + /** + *Beneficiary account must pre-exist. + */ + DeadAccount: PlainDescriptor; + /** + *Number of named reserves exceed `MaxReserves`. + */ + TooManyReserves: PlainDescriptor; + /** + *Number of holds exceed `VariantCountOf`. + */ + TooManyHolds: PlainDescriptor; + /** + *Number of freezes exceed `MaxFreezes`. + */ + TooManyFreezes: PlainDescriptor; + /** + *The issuance cannot be modified since it is already deactivated. + */ + IssuanceDeactivated: PlainDescriptor; + /** + *The delta cannot be zero. + */ + DeltaZero: PlainDescriptor; + }; + Staking: { + /** + *Not a controller account. + */ + NotController: PlainDescriptor; + /** + *Not a stash account. + */ + NotStash: PlainDescriptor; + /** + *Stash is already bonded. + */ + AlreadyBonded: PlainDescriptor; + /** + *Controller is already paired. + */ + AlreadyPaired: PlainDescriptor; + /** + *Targets cannot be empty. + */ + EmptyTargets: PlainDescriptor; + /** + *Duplicate index. + */ + DuplicateIndex: PlainDescriptor; + /** + *Slash record index out of bounds. + */ + InvalidSlashIndex: PlainDescriptor; + /** + *Cannot have a validator or nominator role, with value less than the minimum defined by + *governance (see `MinValidatorBond` and `MinNominatorBond`). If unbonding is the + *intention, `chill` first to remove one's role as validator/nominator. + */ + InsufficientBond: PlainDescriptor; + /** + *Can not schedule more unlock chunks. + */ + NoMoreChunks: PlainDescriptor; + /** + *Can not rebond without unlocking chunks. + */ + NoUnlockChunk: PlainDescriptor; + /** + *Attempting to target a stash that still has funds. + */ + FundedTarget: PlainDescriptor; + /** + *Invalid era to reward. + */ + InvalidEraToReward: PlainDescriptor; + /** + *Invalid number of nominations. + */ + InvalidNumberOfNominations: PlainDescriptor; + /** + *Items are not sorted and unique. + */ + NotSortedAndUnique: PlainDescriptor; + /** + *Rewards for this era have already been claimed for this validator. + */ + AlreadyClaimed: PlainDescriptor; + /** + *No nominators exist on this page. + */ + InvalidPage: PlainDescriptor; + /** + *Incorrect previous history depth input provided. + */ + IncorrectHistoryDepth: PlainDescriptor; + /** + *Incorrect number of slashing spans provided. + */ + IncorrectSlashingSpans: PlainDescriptor; + /** + *Internal state has become somehow corrupted and the operation cannot continue. + */ + BadState: PlainDescriptor; + /** + *Too many nomination targets supplied. + */ + TooManyTargets: PlainDescriptor; + /** + *A nomination target was supplied that was blocked or otherwise not a validator. + */ + BadTarget: PlainDescriptor; + /** + *The user has enough bond and thus cannot be chilled forcefully by an external person. + */ + CannotChillOther: PlainDescriptor; + /** + *There are too many nominators in the system. Governance needs to adjust the staking + *settings to keep things safe for the runtime. + */ + TooManyNominators: PlainDescriptor; + /** + *There are too many validator candidates in the system. Governance needs to adjust the + *staking settings to keep things safe for the runtime. + */ + TooManyValidators: PlainDescriptor; + /** + *Commission is too low. Must be at least `MinCommission`. + */ + CommissionTooLow: PlainDescriptor; + /** + *Some bound is not met. + */ + BoundNotMet: PlainDescriptor; + /** + *Used when attempting to use deprecated controller account logic. + */ + ControllerDeprecated: PlainDescriptor; + /** + *Cannot reset a ledger. + */ + CannotRestoreLedger: PlainDescriptor; + /** + *Provided reward destination is not allowed. + */ + RewardDestinationRestricted: PlainDescriptor; + /** + *Not enough funds available to withdraw. + */ + NotEnoughFunds: PlainDescriptor; + /** + *Operation not allowed for virtual stakers. + */ + VirtualStakerNotAllowed: PlainDescriptor; + }; + Session: { + /** + *Invalid ownership proof. + */ + InvalidProof: PlainDescriptor; + /** + *No associated validator ID for account. + */ + NoAssociatedValidatorId: PlainDescriptor; + /** + *Registered duplicate key. + */ + DuplicatedKey: PlainDescriptor; + /** + *No keys are associated with this account. + */ + NoKeys: PlainDescriptor; + /** + *Key setting account is not live, so it's impossible to associate keys. + */ + NoAccount: PlainDescriptor; + }; + Grandpa: { + /** + *Attempt to signal GRANDPA pause when the authority set isn't live + *(either paused or already pending pause). + */ + PauseFailed: PlainDescriptor; + /** + *Attempt to signal GRANDPA resume when the authority set isn't paused + *(either live or already pending resume). + */ + ResumeFailed: PlainDescriptor; + /** + *Attempt to signal GRANDPA change with one already pending. + */ + ChangePending: PlainDescriptor; + /** + *Cannot signal forced change so soon after last. + */ + TooSoon: PlainDescriptor; + /** + *A key ownership proof provided as part of an equivocation report is invalid. + */ + InvalidKeyOwnershipProof: PlainDescriptor; + /** + *An equivocation proof provided as part of an equivocation report is invalid. + */ + InvalidEquivocationProof: PlainDescriptor; + /** + *A given equivocation report is valid but already previously reported. + */ + DuplicateOffenceReport: PlainDescriptor; + }; + Treasury: { + /** + *No proposal, bounty or spend at that index. + */ + InvalidIndex: PlainDescriptor; + /** + *Too many approvals in the queue. + */ + TooManyApprovals: PlainDescriptor; + /** + *The spend origin is valid but the amount it is allowed to spend is lower than the + *amount to be spent. + */ + InsufficientPermission: PlainDescriptor; + /** + *Proposal has not been approved. + */ + ProposalNotApproved: PlainDescriptor; + /** + *The balance of the asset kind is not convertible to the balance of the native asset. + */ + FailedToConvertBalance: PlainDescriptor; + /** + *The spend has expired and cannot be claimed. + */ + SpendExpired: PlainDescriptor; + /** + *The spend is not yet eligible for payout. + */ + EarlyPayout: PlainDescriptor; + /** + *The payment has already been attempted. + */ + AlreadyAttempted: PlainDescriptor; + /** + *There was some issue with the mechanism of payment. + */ + PayoutError: PlainDescriptor; + /** + *The payout was not yet attempted/claimed. + */ + NotAttempted: PlainDescriptor; + /** + *The payment has neither failed nor succeeded yet. + */ + Inconclusive: PlainDescriptor; + }; + ConvictionVoting: { + /** + *Poll is not ongoing. + */ + NotOngoing: PlainDescriptor; + /** + *The given account did not vote on the poll. + */ + NotVoter: PlainDescriptor; + /** + *The actor has no permission to conduct the action. + */ + NoPermission: PlainDescriptor; + /** + *The actor has no permission to conduct the action right now but will do in the future. + */ + NoPermissionYet: PlainDescriptor; + /** + *The account is already delegating. + */ + AlreadyDelegating: PlainDescriptor; + /** + *The account currently has votes attached to it and the operation cannot succeed until + *these are removed through `remove_vote`. + */ + AlreadyVoting: PlainDescriptor; + /** + *Too high a balance was provided that the account cannot afford. + */ + InsufficientFunds: PlainDescriptor; + /** + *The account is not currently delegating. + */ + NotDelegating: PlainDescriptor; + /** + *Delegation to oneself makes no sense. + */ + Nonsense: PlainDescriptor; + /** + *Maximum number of votes reached. + */ + MaxVotesReached: PlainDescriptor; + /** + *The class must be supplied since it is not easily determinable from the state. + */ + ClassNeeded: PlainDescriptor; + /** + *The class ID supplied is invalid. + */ + BadClass: PlainDescriptor; + }; + Referenda: { + /** + *Referendum is not ongoing. + */ + NotOngoing: PlainDescriptor; + /** + *Referendum's decision deposit is already paid. + */ + HasDeposit: PlainDescriptor; + /** + *The track identifier given was invalid. + */ + BadTrack: PlainDescriptor; + /** + *There are already a full complement of referenda in progress for this track. + */ + Full: PlainDescriptor; + /** + *The queue of the track is empty. + */ + QueueEmpty: PlainDescriptor; + /** + *The referendum index provided is invalid in this context. + */ + BadReferendum: PlainDescriptor; + /** + *There was nothing to do in the advancement. + */ + NothingToDo: PlainDescriptor; + /** + *No track exists for the proposal origin. + */ + NoTrack: PlainDescriptor; + /** + *Any deposit cannot be refunded until after the decision is over. + */ + Unfinished: PlainDescriptor; + /** + *The deposit refunder is not the depositor. + */ + NoPermission: PlainDescriptor; + /** + *The deposit cannot be refunded since none was made. + */ + NoDeposit: PlainDescriptor; + /** + *The referendum status is invalid for this operation. + */ + BadStatus: PlainDescriptor; + /** + *The preimage does not exist. + */ + PreimageNotExist: PlainDescriptor; + /** + *The preimage is stored with a different length than the one provided. + */ + PreimageStoredWithDifferentLength: PlainDescriptor; + }; + Whitelist: { + /** + *The preimage of the call hash could not be loaded. + */ + UnavailablePreImage: PlainDescriptor; + /** + *The call could not be decoded. + */ + UndecodableCall: PlainDescriptor; + /** + *The weight of the decoded call was higher than the witness. + */ + InvalidCallWeightWitness: PlainDescriptor; + /** + *The call was not whitelisted. + */ + CallIsNotWhitelisted: PlainDescriptor; + /** + *The call was already whitelisted; No-Op. + */ + CallAlreadyWhitelisted: PlainDescriptor; + }; + Claims: { + /** + *Invalid Ethereum signature. + */ + InvalidEthereumSignature: PlainDescriptor; + /** + *Ethereum address has no claim. + */ + SignerHasNoClaim: PlainDescriptor; + /** + *Account ID sending transaction has no claim. + */ + SenderHasNoClaim: PlainDescriptor; + /** + *There's not enough in the pot to pay out some unvested amount. Generally implies a + *logic error. + */ + PotUnderflow: PlainDescriptor; + /** + *A needed statement was not included. + */ + InvalidStatement: PlainDescriptor; + /** + *The account already has a vested balance. + */ + VestedBalanceExists: PlainDescriptor; + }; + Vesting: { + /** + *The account given is not vesting. + */ + NotVesting: PlainDescriptor; + /** + *The account already has `MaxVestingSchedules` count of schedules and thus + *cannot add another one. Consider merging existing schedules in order to add another. + */ + AtMaxVestingSchedules: PlainDescriptor; + /** + *Amount being transferred is too low to create a vesting schedule. + */ + AmountLow: PlainDescriptor; + /** + *An index was out of bounds of the vesting schedules. + */ + ScheduleIndexOutOfBounds: PlainDescriptor; + /** + *Failed to create a new schedule because some parameter was invalid. + */ + InvalidScheduleParams: PlainDescriptor; + }; + Utility: { + /** + *Too many calls batched. + */ + TooManyCalls: PlainDescriptor; + }; + Proxy: { + /** + *There are too many proxies registered or too many announcements pending. + */ + TooMany: PlainDescriptor; + /** + *Proxy registration not found. + */ + NotFound: PlainDescriptor; + /** + *Sender is not a proxy of the account to be proxied. + */ + NotProxy: PlainDescriptor; + /** + *A call which is incompatible with the proxy type's filter was attempted. + */ + Unproxyable: PlainDescriptor; + /** + *Account is already a proxy. + */ + Duplicate: PlainDescriptor; + /** + *Call may not be made by proxy because it may escalate its privileges. + */ + NoPermission: PlainDescriptor; + /** + *Announcement, if made at all, was made too recently. + */ + Unannounced: PlainDescriptor; + /** + *Cannot add self as proxy. + */ + NoSelfProxy: PlainDescriptor; + }; + Multisig: { + /** + *Threshold must be 2 or greater. + */ + MinimumThreshold: PlainDescriptor; + /** + *Call is already approved by this signatory. + */ + AlreadyApproved: PlainDescriptor; + /** + *Call doesn't need any (more) approvals. + */ + NoApprovalsNeeded: PlainDescriptor; + /** + *There are too few signatories in the list. + */ + TooFewSignatories: PlainDescriptor; + /** + *There are too many signatories in the list. + */ + TooManySignatories: PlainDescriptor; + /** + *The signatories were provided out of order; they should be ordered. + */ + SignatoriesOutOfOrder: PlainDescriptor; + /** + *The sender was contained in the other signatories; it shouldn't be. + */ + SenderInSignatories: PlainDescriptor; + /** + *Multisig operation not found when attempting to cancel. + */ + NotFound: PlainDescriptor; + /** + *Only the account that originally created the multisig is able to cancel it. + */ + NotOwner: PlainDescriptor; + /** + *No timepoint was given, yet the multisig operation is already underway. + */ + NoTimepoint: PlainDescriptor; + /** + *A different timepoint was given to the multisig operation that is underway. + */ + WrongTimepoint: PlainDescriptor; + /** + *A timepoint was given, yet no multisig operation is underway. + */ + UnexpectedTimepoint: PlainDescriptor; + /** + *The maximum weight information provided was too low. + */ + MaxWeightTooLow: PlainDescriptor; + /** + *The data to be stored is already stored. + */ + AlreadyStored: PlainDescriptor; + }; + Bounties: { + /** + *Proposer's balance is too low. + */ + InsufficientProposersBalance: PlainDescriptor; + /** + *No proposal or bounty at that index. + */ + InvalidIndex: PlainDescriptor; + /** + *The reason given is just too big. + */ + ReasonTooBig: PlainDescriptor; + /** + *The bounty status is unexpected. + */ + UnexpectedStatus: PlainDescriptor; + /** + *Require bounty curator. + */ + RequireCurator: PlainDescriptor; + /** + *Invalid bounty value. + */ + InvalidValue: PlainDescriptor; + /** + *Invalid bounty fee. + */ + InvalidFee: PlainDescriptor; + /** + *A bounty payout is pending. + *To cancel the bounty, you must unassign and slash the curator. + */ + PendingPayout: PlainDescriptor; + /** + *The bounties cannot be claimed/closed because it's still in the countdown period. + */ + Premature: PlainDescriptor; + /** + *The bounty cannot be closed because it has active child bounties. + */ + HasActiveChildBounty: PlainDescriptor; + /** + *Too many approvals are already queued. + */ + TooManyQueued: PlainDescriptor; + }; + ChildBounties: { + /** + *The parent bounty is not in active state. + */ + ParentBountyNotActive: PlainDescriptor; + /** + *The bounty balance is not enough to add new child-bounty. + */ + InsufficientBountyBalance: PlainDescriptor; + /** + *Number of child bounties exceeds limit `MaxActiveChildBountyCount`. + */ + TooManyChildBounties: PlainDescriptor; + }; + ElectionProviderMultiPhase: { + /** + *Submission was too early. + */ + PreDispatchEarlySubmission: PlainDescriptor; + /** + *Wrong number of winners presented. + */ + PreDispatchWrongWinnerCount: PlainDescriptor; + /** + *Submission was too weak, score-wise. + */ + PreDispatchWeakSubmission: PlainDescriptor; + /** + *The queue was full, and the solution was not better than any of the existing ones. + */ + SignedQueueFull: PlainDescriptor; + /** + *The origin failed to pay the deposit. + */ + SignedCannotPayDeposit: PlainDescriptor; + /** + *Witness data to dispatchable is invalid. + */ + SignedInvalidWitness: PlainDescriptor; + /** + *The signed submission consumes too much weight + */ + SignedTooMuchWeight: PlainDescriptor; + /** + *OCW submitted solution for wrong round + */ + OcwCallWrongEra: PlainDescriptor; + /** + *Snapshot metadata should exist but didn't. + */ + MissingSnapshotMetadata: PlainDescriptor; + /** + *`Self::insert_submission` returned an invalid index. + */ + InvalidSubmissionIndex: PlainDescriptor; + /** + *The call is not allowed at this point. + */ + CallNotAllowed: PlainDescriptor; + /** + *The fallback failed + */ + FallbackFailed: PlainDescriptor; + /** + *Some bound not met + */ + BoundNotMet: PlainDescriptor; + /** + *Submitted solution has too many winners + */ + TooManyWinners: PlainDescriptor; + /** + *Submission was prepared for a different round. + */ + PreDispatchDifferentRound: PlainDescriptor; + }; + VoterList: { + /** + *A error in the list interface implementation. + */ + List: PlainDescriptor; + }; + NominationPools: { + /** + *A (bonded) pool id does not exist. + */ + PoolNotFound: PlainDescriptor; + /** + *An account is not a member. + */ + PoolMemberNotFound: PlainDescriptor; + /** + *A reward pool does not exist. In all cases this is a system logic error. + */ + RewardPoolNotFound: PlainDescriptor; + /** + *A sub pool does not exist. + */ + SubPoolsNotFound: PlainDescriptor; + /** + *An account is already delegating in another pool. An account may only belong to one + *pool at a time. + */ + AccountBelongsToOtherPool: PlainDescriptor; + /** + *The member is fully unbonded (and thus cannot access the bonded and reward pool + *anymore to, for example, collect rewards). + */ + FullyUnbonding: PlainDescriptor; + /** + *The member cannot unbond further chunks due to reaching the limit. + */ + MaxUnbondingLimit: PlainDescriptor; + /** + *None of the funds can be withdrawn yet because the bonding duration has not passed. + */ + CannotWithdrawAny: PlainDescriptor; + /** + *The amount does not meet the minimum bond to either join or create a pool. + * + *The depositor can never unbond to a value less than `Pallet::depositor_min_bond`. The + *caller does not have nominating permissions for the pool. Members can never unbond to a + *value below `MinJoinBond`. + */ + MinimumBondNotMet: PlainDescriptor; + /** + *The transaction could not be executed due to overflow risk for the pool. + */ + OverflowRisk: PlainDescriptor; + /** + *A pool must be in [`PoolState::Destroying`] in order for the depositor to unbond or for + *other members to be permissionlessly unbonded. + */ + NotDestroying: PlainDescriptor; + /** + *The caller does not have nominating permissions for the pool. + */ + NotNominator: PlainDescriptor; + /** + *Either a) the caller cannot make a valid kick or b) the pool is not destroying. + */ + NotKickerOrDestroying: PlainDescriptor; + /** + *The pool is not open to join + */ + NotOpen: PlainDescriptor; + /** + *The system is maxed out on pools. + */ + MaxPools: PlainDescriptor; + /** + *Too many members in the pool or system. + */ + MaxPoolMembers: PlainDescriptor; + /** + *The pools state cannot be changed. + */ + CanNotChangeState: PlainDescriptor; + /** + *The caller does not have adequate permissions. + */ + DoesNotHavePermission: PlainDescriptor; + /** + *Metadata exceeds [`Config::MaxMetadataLen`] + */ + MetadataExceedsMaxLen: PlainDescriptor; + /** + *Some error occurred that should never happen. This should be reported to the + *maintainers. + */ + Defensive: PlainDescriptor>; + /** + *Partial unbonding now allowed permissionlessly. + */ + PartialUnbondNotAllowedPermissionlessly: PlainDescriptor; + /** + *The pool's max commission cannot be set higher than the existing value. + */ + MaxCommissionRestricted: PlainDescriptor; + /** + *The supplied commission exceeds the max allowed commission. + */ + CommissionExceedsMaximum: PlainDescriptor; + /** + *The supplied commission exceeds global maximum commission. + */ + CommissionExceedsGlobalMaximum: PlainDescriptor; + /** + *Not enough blocks have surpassed since the last commission update. + */ + CommissionChangeThrottled: PlainDescriptor; + /** + *The submitted changes to commission change rate are not allowed. + */ + CommissionChangeRateNotAllowed: PlainDescriptor; + /** + *There is no pending commission to claim. + */ + NoPendingCommission: PlainDescriptor; + /** + *No commission current has been set. + */ + NoCommissionCurrentSet: PlainDescriptor; + /** + *Pool id currently in use. + */ + PoolIdInUse: PlainDescriptor; + /** + *Pool id provided is not correct/usable. + */ + InvalidPoolId: PlainDescriptor; + /** + *Bonding extra is restricted to the exact pending reward amount. + */ + BondExtraRestricted: PlainDescriptor; + /** + *No imbalance in the ED deposit for the pool. + */ + NothingToAdjust: PlainDescriptor; + /** + *No slash pending that can be applied to the member. + */ + NothingToSlash: PlainDescriptor; + /** + *The pool or member delegation has already migrated to delegate stake. + */ + AlreadyMigrated: PlainDescriptor; + /** + *The pool or member delegation has not migrated yet to delegate stake. + */ + NotMigrated: PlainDescriptor; + /** + *This call is not allowed in the current state of the pallet. + */ + NotSupported: PlainDescriptor; + }; + FastUnstake: { + /** + *The provided Controller account was not found. + * + *This means that the given account is not bonded. + */ + NotController: PlainDescriptor; + /** + *The bonded account has already been queued. + */ + AlreadyQueued: PlainDescriptor; + /** + *The bonded account has active unlocking chunks. + */ + NotFullyBonded: PlainDescriptor; + /** + *The provided un-staker is not in the `Queue`. + */ + NotQueued: PlainDescriptor; + /** + *The provided un-staker is already in Head, and cannot deregister. + */ + AlreadyHead: PlainDescriptor; + /** + *The call is not allowed at this point because the pallet is not active. + */ + CallNotAllowed: PlainDescriptor; + }; + Configuration: { + /** + *The new value for a configuration parameter is invalid. + */ + InvalidNewValue: PlainDescriptor; + }; + ParaInclusion: { + /** + *Validator index out of bounds. + */ + ValidatorIndexOutOfBounds: PlainDescriptor; + /** + *Candidate submitted but para not scheduled. + */ + UnscheduledCandidate: PlainDescriptor; + /** + *Head data exceeds the configured maximum. + */ + HeadDataTooLarge: PlainDescriptor; + /** + *Code upgrade prematurely. + */ + PrematureCodeUpgrade: PlainDescriptor; + /** + *Output code is too large + */ + NewCodeTooLarge: PlainDescriptor; + /** + *The candidate's relay-parent was not allowed. Either it was + *not recent enough or it didn't advance based on the last parachain block. + */ + DisallowedRelayParent: PlainDescriptor; + /** + *Failed to compute group index for the core: either it's out of bounds + *or the relay parent doesn't belong to the current session. + */ + InvalidAssignment: PlainDescriptor; + /** + *Invalid group index in core assignment. + */ + InvalidGroupIndex: PlainDescriptor; + /** + *Insufficient (non-majority) backing. + */ + InsufficientBacking: PlainDescriptor; + /** + *Invalid (bad signature, unknown validator, etc.) backing. + */ + InvalidBacking: PlainDescriptor; + /** + *Collator did not sign PoV. + */ + NotCollatorSigned: PlainDescriptor; + /** + *The validation data hash does not match expected. + */ + ValidationDataHashMismatch: PlainDescriptor; + /** + *The downward message queue is not processed correctly. + */ + IncorrectDownwardMessageHandling: PlainDescriptor; + /** + *At least one upward message sent does not pass the acceptance criteria. + */ + InvalidUpwardMessages: PlainDescriptor; + /** + *The candidate didn't follow the rules of HRMP watermark advancement. + */ + HrmpWatermarkMishandling: PlainDescriptor; + /** + *The HRMP messages sent by the candidate is not valid. + */ + InvalidOutboundHrmp: PlainDescriptor; + /** + *The validation code hash of the candidate is not valid. + */ + InvalidValidationCodeHash: PlainDescriptor; + /** + *The `para_head` hash in the candidate descriptor doesn't match the hash of the actual + *para head in the commitments. + */ + ParaHeadMismatch: PlainDescriptor; + }; + ParaInherent: { + /** + *Inclusion inherent called more than once per block. + */ + TooManyInclusionInherents: PlainDescriptor; + /** + *The hash of the submitted parent header doesn't correspond to the saved block hash of + *the parent. + */ + InvalidParentHeader: PlainDescriptor; + /** + *The data given to the inherent will result in an overweight block. + */ + InherentOverweight: PlainDescriptor; + /** + *A candidate was filtered during inherent execution. This should have only been done + *during creation. + */ + CandidatesFilteredDuringExecution: PlainDescriptor; + /** + *Too many candidates supplied. + */ + UnscheduledCandidate: PlainDescriptor; + }; + Paras: { + /** + *Para is not registered in our system. + */ + NotRegistered: PlainDescriptor; + /** + *Para cannot be onboarded because it is already tracked by our system. + */ + CannotOnboard: PlainDescriptor; + /** + *Para cannot be offboarded at this time. + */ + CannotOffboard: PlainDescriptor; + /** + *Para cannot be upgraded to a lease holding parachain. + */ + CannotUpgrade: PlainDescriptor; + /** + *Para cannot be downgraded to an on-demand parachain. + */ + CannotDowngrade: PlainDescriptor; + /** + *The statement for PVF pre-checking is stale. + */ + PvfCheckStatementStale: PlainDescriptor; + /** + *The statement for PVF pre-checking is for a future session. + */ + PvfCheckStatementFuture: PlainDescriptor; + /** + *Claimed validator index is out of bounds. + */ + PvfCheckValidatorIndexOutOfBounds: PlainDescriptor; + /** + *The signature for the PVF pre-checking is invalid. + */ + PvfCheckInvalidSignature: PlainDescriptor; + /** + *The given validator already has cast a vote. + */ + PvfCheckDoubleVote: PlainDescriptor; + /** + *The given PVF does not exist at the moment of process a vote. + */ + PvfCheckSubjectInvalid: PlainDescriptor; + /** + *Parachain cannot currently schedule a code upgrade. + */ + CannotUpgradeCode: PlainDescriptor; + /** + *Invalid validation code size. + */ + InvalidCode: PlainDescriptor; + }; + Hrmp: { + /** + *The sender tried to open a channel to themselves. + */ + OpenHrmpChannelToSelf: PlainDescriptor; + /** + *The recipient is not a valid para. + */ + OpenHrmpChannelInvalidRecipient: PlainDescriptor; + /** + *The requested capacity is zero. + */ + OpenHrmpChannelZeroCapacity: PlainDescriptor; + /** + *The requested capacity exceeds the global limit. + */ + OpenHrmpChannelCapacityExceedsLimit: PlainDescriptor; + /** + *The requested maximum message size is 0. + */ + OpenHrmpChannelZeroMessageSize: PlainDescriptor; + /** + *The open request requested the message size that exceeds the global limit. + */ + OpenHrmpChannelMessageSizeExceedsLimit: PlainDescriptor; + /** + *The channel already exists + */ + OpenHrmpChannelAlreadyExists: PlainDescriptor; + /** + *There is already a request to open the same channel. + */ + OpenHrmpChannelAlreadyRequested: PlainDescriptor; + /** + *The sender already has the maximum number of allowed outbound channels. + */ + OpenHrmpChannelLimitExceeded: PlainDescriptor; + /** + *The channel from the sender to the origin doesn't exist. + */ + AcceptHrmpChannelDoesntExist: PlainDescriptor; + /** + *The channel is already confirmed. + */ + AcceptHrmpChannelAlreadyConfirmed: PlainDescriptor; + /** + *The recipient already has the maximum number of allowed inbound channels. + */ + AcceptHrmpChannelLimitExceeded: PlainDescriptor; + /** + *The origin tries to close a channel where it is neither the sender nor the recipient. + */ + CloseHrmpChannelUnauthorized: PlainDescriptor; + /** + *The channel to be closed doesn't exist. + */ + CloseHrmpChannelDoesntExist: PlainDescriptor; + /** + *The channel close request is already requested. + */ + CloseHrmpChannelAlreadyUnderway: PlainDescriptor; + /** + *Canceling is requested by neither the sender nor recipient of the open channel request. + */ + CancelHrmpOpenChannelUnauthorized: PlainDescriptor; + /** + *The open request doesn't exist. + */ + OpenHrmpChannelDoesntExist: PlainDescriptor; + /** + *Cannot cancel an HRMP open channel request because it is already confirmed. + */ + OpenHrmpChannelAlreadyConfirmed: PlainDescriptor; + /** + *The provided witness data is wrong. + */ + WrongWitness: PlainDescriptor; + /** + *The channel between these two chains cannot be authorized. + */ + ChannelCreationNotAuthorized: PlainDescriptor; + }; + ParasDisputes: { + /** + *Duplicate dispute statement sets provided. + */ + DuplicateDisputeStatementSets: PlainDescriptor; + /** + *Ancient dispute statement provided. + */ + AncientDisputeStatement: PlainDescriptor; + /** + *Validator index on statement is out of bounds for session. + */ + ValidatorIndexOutOfBounds: PlainDescriptor; + /** + *Invalid signature on statement. + */ + InvalidSignature: PlainDescriptor; + /** + *Validator vote submitted more than once to dispute. + */ + DuplicateStatement: PlainDescriptor; + /** + *A dispute where there are only votes on one side. + */ + SingleSidedDispute: PlainDescriptor; + /** + *A dispute vote from a malicious backer. + */ + MaliciousBacker: PlainDescriptor; + /** + *No backing votes were provides along dispute statements. + */ + MissingBackingVotes: PlainDescriptor; + /** + *Unconfirmed dispute statement sets provided. + */ + UnconfirmedDispute: PlainDescriptor; + }; + ParasSlashing: { + /** + *The key ownership proof is invalid. + */ + InvalidKeyOwnershipProof: PlainDescriptor; + /** + *The session index is too old or invalid. + */ + InvalidSessionIndex: PlainDescriptor; + /** + *The candidate hash is invalid. + */ + InvalidCandidateHash: PlainDescriptor; + /** + *There is no pending slash for the given validator index and time + *slot. + */ + InvalidValidatorIndex: PlainDescriptor; + /** + *The validator index does not match the validator id. + */ + ValidatorIndexIdMismatch: PlainDescriptor; + /** + *The given slashing report is valid but already previously reported. + */ + DuplicateSlashingReport: PlainDescriptor; + }; + OnDemand: { + /** + *The order queue is full, `place_order` will not continue. + */ + QueueFull: PlainDescriptor; + /** + *The current spot price is higher than the max amount specified in the `place_order` + *call, making it invalid. + */ + SpotPriceHigherThanMaxAmount: PlainDescriptor; + }; + CoretimeAssignmentProvider: { + /** + + */ + AssignmentsEmpty: PlainDescriptor; + /** + *Assignments together exceeded 57600. + */ + OverScheduled: PlainDescriptor; + /** + *Assignments together less than 57600 + */ + UnderScheduled: PlainDescriptor; + /** + *assign_core is only allowed to append new assignments at the end of already existing + *ones. + */ + DisallowedInsert: PlainDescriptor; + /** + *Tried to insert a schedule for the same core and block number as an existing schedule + */ + DuplicateInsert: PlainDescriptor; + /** + *Tried to add an unsorted set of assignments + */ + AssignmentsNotSorted: PlainDescriptor; + }; + Registrar: { + /** + *The ID is not registered. + */ + NotRegistered: PlainDescriptor; + /** + *The ID is already registered. + */ + AlreadyRegistered: PlainDescriptor; + /** + *The caller is not the owner of this Id. + */ + NotOwner: PlainDescriptor; + /** + *Invalid para code size. + */ + CodeTooLarge: PlainDescriptor; + /** + *Invalid para head data size. + */ + HeadDataTooLarge: PlainDescriptor; + /** + *Para is not a Parachain. + */ + NotParachain: PlainDescriptor; + /** + *Para is not a Parathread (on-demand parachain). + */ + NotParathread: PlainDescriptor; + /** + *Cannot deregister para + */ + CannotDeregister: PlainDescriptor; + /** + *Cannot schedule downgrade of lease holding parachain to on-demand parachain + */ + CannotDowngrade: PlainDescriptor; + /** + *Cannot schedule upgrade of on-demand parachain to lease holding parachain + */ + CannotUpgrade: PlainDescriptor; + /** + *Para is locked from manipulation by the manager. Must use parachain or relay chain + *governance. + */ + ParaLocked: PlainDescriptor; + /** + *The ID given for registration has not been reserved. + */ + NotReserved: PlainDescriptor; + /** + *The validation code is invalid. + */ + InvalidCode: PlainDescriptor; + /** + *Cannot perform a parachain slot / lifecycle swap. Check that the state of both paras + *are correct for the swap to work. + */ + CannotSwap: PlainDescriptor; + }; + Slots: { + /** + *The parachain ID is not onboarding. + */ + ParaNotOnboarding: PlainDescriptor; + /** + *There was an error with the lease. + */ + LeaseError: PlainDescriptor; + }; + Auctions: { + /** + *This auction is already in progress. + */ + AuctionInProgress: PlainDescriptor; + /** + *The lease period is in the past. + */ + LeasePeriodInPast: PlainDescriptor; + /** + *Para is not registered + */ + ParaNotRegistered: PlainDescriptor; + /** + *Not a current auction. + */ + NotCurrentAuction: PlainDescriptor; + /** + *Not an auction. + */ + NotAuction: PlainDescriptor; + /** + *Auction has already ended. + */ + AuctionEnded: PlainDescriptor; + /** + *The para is already leased out for part of this range. + */ + AlreadyLeasedOut: PlainDescriptor; + }; + Crowdloan: { + /** + *The current lease period is more than the first lease period. + */ + FirstPeriodInPast: PlainDescriptor; + /** + *The first lease period needs to at least be less than 3 `max_value`. + */ + FirstPeriodTooFarInFuture: PlainDescriptor; + /** + *Last lease period must be greater than first lease period. + */ + LastPeriodBeforeFirstPeriod: PlainDescriptor; + /** + *The last lease period cannot be more than 3 periods after the first period. + */ + LastPeriodTooFarInFuture: PlainDescriptor; + /** + *The campaign ends before the current block number. The end must be in the future. + */ + CannotEndInPast: PlainDescriptor; + /** + *The end date for this crowdloan is not sensible. + */ + EndTooFarInFuture: PlainDescriptor; + /** + *There was an overflow. + */ + Overflow: PlainDescriptor; + /** + *The contribution was below the minimum, `MinContribution`. + */ + ContributionTooSmall: PlainDescriptor; + /** + *Invalid fund index. + */ + InvalidParaId: PlainDescriptor; + /** + *Contributions exceed maximum amount. + */ + CapExceeded: PlainDescriptor; + /** + *The contribution period has already ended. + */ + ContributionPeriodOver: PlainDescriptor; + /** + *The origin of this call is invalid. + */ + InvalidOrigin: PlainDescriptor; + /** + *This crowdloan does not correspond to a parachain. + */ + NotParachain: PlainDescriptor; + /** + *This parachain lease is still active and retirement cannot yet begin. + */ + LeaseActive: PlainDescriptor; + /** + *This parachain's bid or lease is still active and withdraw cannot yet begin. + */ + BidOrLeaseActive: PlainDescriptor; + /** + *The crowdloan has not yet ended. + */ + FundNotEnded: PlainDescriptor; + /** + *There are no contributions stored in this crowdloan. + */ + NoContributions: PlainDescriptor; + /** + *The crowdloan is not ready to dissolve. Potentially still has a slot or in retirement + *period. + */ + NotReadyToDissolve: PlainDescriptor; + /** + *Invalid signature. + */ + InvalidSignature: PlainDescriptor; + /** + *The provided memo is too large. + */ + MemoTooLarge: PlainDescriptor; + /** + *The fund is already in `NewRaise` + */ + AlreadyInNewRaise: PlainDescriptor; + /** + *No contributions allowed during the VRF delay + */ + VrfDelayInProgress: PlainDescriptor; + /** + *A lease period has not started yet, due to an offset in the starting block. + */ + NoLeasePeriod: PlainDescriptor; + }; + Coretime: { + /** + *The paraid making the call is not the coretime brokerage system parachain. + */ + NotBroker: PlainDescriptor; + /** + *Requested revenue information `when` parameter was in the future from the current + *block height. + */ + RequestedFutureRevenue: PlainDescriptor; + /** + *Failed to transfer assets to the coretime chain + */ + AssetTransferFailed: PlainDescriptor; + }; + StateTrieMigration: { + /** + *Max signed limits not respected. + */ + MaxSignedLimits: PlainDescriptor; + /** + *A key was longer than the configured maximum. + * + *This means that the migration halted at the current [`Progress`] and + *can be resumed with a larger [`crate::Config::MaxKeyLen`] value. + *Retrying with the same [`crate::Config::MaxKeyLen`] value will not work. + *The value should only be increased to avoid a storage migration for the currently + *stored [`crate::Progress::LastKey`]. + */ + KeyTooLong: PlainDescriptor; + /** + *submitter does not have enough funds. + */ + NotEnoughFunds: PlainDescriptor; + /** + *Bad witness data provided. + */ + BadWitness: PlainDescriptor; + /** + *Signed migration is not allowed because the maximum limit is not set yet. + */ + SignedMigrationNotAllowed: PlainDescriptor; + /** + *Bad child root provided. + */ + BadChildRoot: PlainDescriptor; + }; + XcmPallet: { + /** + *The desired destination was unreachable, generally because there is a no way of routing + *to it. + */ + Unreachable: PlainDescriptor; + /** + *There was some other issue (i.e. not to do with routing) in sending the message. + *Perhaps a lack of space for buffering the message. + */ + SendFailure: PlainDescriptor; + /** + *The message execution fails the filter. + */ + Filtered: PlainDescriptor; + /** + *The message's weight could not be determined. + */ + UnweighableMessage: PlainDescriptor; + /** + *The destination `Location` provided cannot be inverted. + */ + DestinationNotInvertible: PlainDescriptor; + /** + *The assets to be sent are empty. + */ + Empty: PlainDescriptor; + /** + *Could not re-anchor the assets to declare the fees for the destination chain. + */ + CannotReanchor: PlainDescriptor; + /** + *Too many assets have been attempted for transfer. + */ + TooManyAssets: PlainDescriptor; + /** + *Origin is invalid for sending. + */ + InvalidOrigin: PlainDescriptor; + /** + *The version of the `Versioned` value used is not able to be interpreted. + */ + BadVersion: PlainDescriptor; + /** + *The given location could not be used (e.g. because it cannot be expressed in the + *desired version of XCM). + */ + BadLocation: PlainDescriptor; + /** + *The referenced subscription could not be found. + */ + NoSubscription: PlainDescriptor; + /** + *The location is invalid since it already has a subscription from us. + */ + AlreadySubscribed: PlainDescriptor; + /** + *Could not check-out the assets for teleportation to the destination chain. + */ + CannotCheckOutTeleport: PlainDescriptor; + /** + *The owner does not own (all) of the asset that they wish to do the operation on. + */ + LowBalance: PlainDescriptor; + /** + *The asset owner has too many locks on the asset. + */ + TooManyLocks: PlainDescriptor; + /** + *The given account is not an identifiable sovereign account for any location. + */ + AccountNotSovereign: PlainDescriptor; + /** + *The operation required fees to be paid which the initiator could not meet. + */ + FeesNotMet: PlainDescriptor; + /** + *A remote lock with the corresponding data could not be found. + */ + LockNotFound: PlainDescriptor; + /** + *The unlock operation cannot succeed because there are still consumers of the lock. + */ + InUse: PlainDescriptor; + /** + *Invalid asset, reserve chain could not be determined for it. + */ + InvalidAssetUnknownReserve: PlainDescriptor; + /** + *Invalid asset, do not support remote asset reserves with different fees reserves. + */ + InvalidAssetUnsupportedReserve: PlainDescriptor; + /** + *Too many assets with different reserve locations have been attempted for transfer. + */ + TooManyReserves: PlainDescriptor; + /** + *Local XCM execution incomplete. + */ + LocalExecutionIncomplete: PlainDescriptor; + }; + MessageQueue: { + /** + *Page is not reapable because it has items remaining to be processed and is not old + *enough. + */ + NotReapable: PlainDescriptor; + /** + *Page to be reaped does not exist. + */ + NoPage: PlainDescriptor; + /** + *The referenced message could not be found. + */ + NoMessage: PlainDescriptor; + /** + *The message was already processed and cannot be processed again. + */ + AlreadyProcessed: PlainDescriptor; + /** + *The message is queued for future execution. + */ + Queued: PlainDescriptor; + /** + *There is temporarily not enough weight to continue servicing messages. + */ + InsufficientWeight: PlainDescriptor; + /** + *This message is temporarily unprocessable. + * + *Such errors are expected, but not guaranteed, to resolve themselves eventually through + *retrying. + */ + TemporarilyUnprocessable: PlainDescriptor; + /** + *The queue is paused and no message can be executed from it. + * + *This can change at any time and may resolve in the future by re-trying. + */ + QueuePaused: PlainDescriptor; + /** + *Another call is in progress and needs to finish before this call can happen. + */ + RecursiveDisallowed: PlainDescriptor; + }; + AssetRate: { + /** + *The given asset ID is unknown. + */ + UnknownAssetKind: PlainDescriptor; + /** + *The given asset ID already has an assigned conversion rate and cannot be re-created. + */ + AlreadyExists: PlainDescriptor; + /** + *Overflow ocurred when calculating the inverse rate. + */ + Overflow: PlainDescriptor; + }; + Beefy: { + /** + *A key ownership proof provided as part of an equivocation report is invalid. + */ + InvalidKeyOwnershipProof: PlainDescriptor; + /** + *An equivocation proof provided as part of an equivocation report is invalid. + */ + InvalidEquivocationProof: PlainDescriptor; + /** + *A given equivocation report is valid but already previously reported. + */ + DuplicateOffenceReport: PlainDescriptor; + /** + *Submitted configuration is invalid. + */ + InvalidConfiguration: PlainDescriptor; + }; + ParaSudoWrapper: { + /** + *The specified parachain is not registered. + */ + ParaDoesntExist: PlainDescriptor; + /** + *The specified parachain is already registered. + */ + ParaAlreadyExists: PlainDescriptor; + /** + *A DMP message couldn't be sent because it exceeds the maximum size allowed for a + *downward message. + */ + ExceedsMaxMessageSize: PlainDescriptor; + /** + *Could not schedule para cleanup. + */ + CouldntCleanup: PlainDescriptor; + /** + *Not a parathread (on-demand parachain). + */ + NotParathread: PlainDescriptor; + /** + *Not a lease holding parachain. + */ + NotParachain: PlainDescriptor; + /** + *Cannot upgrade on-demand parachain to lease holding parachain. + */ + CannotUpgrade: PlainDescriptor; + /** + *Cannot downgrade lease holding parachain to on-demand. + */ + CannotDowngrade: PlainDescriptor; + /** + *There are more cores than supported by the runtime. + */ + TooManyCores: PlainDescriptor; + }; + Sudo: { + /** + *Sender must be the Sudo account. + */ + RequireSudo: PlainDescriptor; + }; +}; +type IConstants = { + System: { + /** + * Block & extrinsics weights: base values and limits. + */ + BlockWeights: PlainDescriptor>; + /** + * The maximum length of a block (in bytes). + */ + BlockLength: PlainDescriptor>; + /** + * Maximum number of block number to block hash mappings to keep (oldest pruned first). + */ + BlockHashCount: PlainDescriptor; + /** + * The weight of runtime database operations the runtime can invoke. + */ + DbWeight: PlainDescriptor>; + /** + * Get the chain's in-code version. + */ + Version: PlainDescriptor>; + /** + * The designated SS58 prefix of this chain. + * + * This replaces the "ss58Format" property declared in the chain spec. Reason is + * that the runtime should know about the prefix in order to make use of it as + * an identifier of the chain. + */ + SS58Prefix: PlainDescriptor; + }; + Scheduler: { + /** + * The maximum weight that may be scheduled per block for any dispatchables. + */ + MaximumWeight: PlainDescriptor>; + /** + * The maximum number of scheduled calls in the queue for a single block. + * + * NOTE: + * + Dependent pallets' benchmarks might require a higher limit for the setting. Set a + * higher limit under `runtime-benchmarks` feature. + */ + MaxScheduledPerBlock: PlainDescriptor; + }; + Babe: { + /** + * The amount of time, in slots, that each epoch should last. + * NOTE: Currently it is not possible to change the epoch duration after + * the chain has started. Attempting to do so will brick block production. + */ + EpochDuration: PlainDescriptor; + /** + * The expected average block time at which BABE should be creating + * blocks. Since BABE is probabilistic it is not trivial to figure out + * what the expected average block time should be based on the slot + * duration and the security parameter `c` (where `1 - c` represents + * the probability of a slot being empty). + */ + ExpectedBlockTime: PlainDescriptor; + /** + * Max number of authorities allowed + */ + MaxAuthorities: PlainDescriptor; + /** + * The maximum number of nominators for each validator. + */ + MaxNominators: PlainDescriptor; + }; + Timestamp: { + /** + * The minimum period between blocks. + * + * Be aware that this is different to the *expected* period that the block production + * apparatus provides. Your chosen consensus system will generally work with this to + * determine a sensible block time. For example, in the Aura pallet it will be double this + * period on default settings. + */ + MinimumPeriod: PlainDescriptor; + }; + Indices: { + /** + * The deposit needed for reserving an index. + */ + Deposit: PlainDescriptor; + }; + Balances: { + /** + * The minimum amount required to keep an account open. MUST BE GREATER THAN ZERO! + * + * If you *really* need it to be zero, you can enable the feature `insecure_zero_ed` for + * this pallet. However, you do so at your own risk: this will open up a major DoS vector. + * In case you have multiple sources of provider references, you may also get unexpected + * behaviour if you set this to zero. + * + * Bottom line: Do yourself a favour and make it at least one! + */ + ExistentialDeposit: PlainDescriptor; + /** + * The maximum number of locks that should exist on an account. + * Not strictly enforced, but used for weight estimation. + * + * Use of locks is deprecated in favour of freezes. See `https://github.com/paritytech/substrate/pull/12951/` + */ + MaxLocks: PlainDescriptor; + /** + * The maximum number of named reserves that can exist on an account. + * + * Use of reserves is deprecated in favour of holds. See `https://github.com/paritytech/substrate/pull/12951/` + */ + MaxReserves: PlainDescriptor; + /** + * The maximum number of individual freeze locks that can exist on an account at any time. + */ + MaxFreezes: PlainDescriptor; + }; + TransactionPayment: { + /** + * A fee multiplier for `Operational` extrinsics to compute "virtual tip" to boost their + * `priority` + * + * This value is multiplied by the `final_fee` to obtain a "virtual tip" that is later + * added to a tip component in regular `priority` calculations. + * It means that a `Normal` transaction can front-run a similarly-sized `Operational` + * extrinsic (with no tip), by including a tip value greater than the virtual tip. + * + * ```rust,ignore + * // For `Normal` + * let priority = priority_calc(tip); + * + * // For `Operational` + * let virtual_tip = (inclusion_fee + tip) * OperationalFeeMultiplier; + * let priority = priority_calc(tip + virtual_tip); + * ``` + * + * Note that since we use `final_fee` the multiplier applies also to the regular `tip` + * sent with the transaction. So, not only does the transaction get a priority bump based + * on the `inclusion_fee`, but we also amplify the impact of tips applied to `Operational` + * transactions. + */ + OperationalFeeMultiplier: PlainDescriptor; + }; + Staking: { + /** + * Number of eras to keep in history. + * + * Following information is kept for eras in `[current_era - + * HistoryDepth, current_era]`: `ErasStakers`, `ErasStakersClipped`, + * `ErasValidatorPrefs`, `ErasValidatorReward`, `ErasRewardPoints`, + * `ErasTotalStake`, `ErasStartSessionIndex`, `ClaimedRewards`, `ErasStakersPaged`, + * `ErasStakersOverview`. + * + * Must be more than the number of eras delayed by session. + * I.e. active era must always be in history. I.e. `active_era > + * current_era - history_depth` must be guaranteed. + * + * If migrating an existing pallet from storage value to config value, + * this should be set to same value or greater as in storage. + * + * Note: `HistoryDepth` is used as the upper bound for the `BoundedVec` + * item `StakingLedger.legacy_claimed_rewards`. Setting this value lower than + * the existing value can lead to inconsistencies in the + * `StakingLedger` and will need to be handled properly in a migration. + * The test `reducing_history_depth_abrupt` shows this effect. + */ + HistoryDepth: PlainDescriptor; + /** + * Number of sessions per era. + */ + SessionsPerEra: PlainDescriptor; + /** + * Number of eras that staked funds must remain bonded for. + */ + BondingDuration: PlainDescriptor; + /** + * Number of eras that slashes are deferred by, after computation. + * + * This should be less than the bonding duration. Set to 0 if slashes + * should be applied immediately, without opportunity for intervention. + */ + SlashDeferDuration: PlainDescriptor; + /** + * The maximum size of each `T::ExposurePage`. + * + * An `ExposurePage` is weakly bounded to a maximum of `MaxExposurePageSize` + * nominators. + * + * For older non-paged exposure, a reward payout was restricted to the top + * `MaxExposurePageSize` nominators. This is to limit the i/o cost for the + * nominator payout. + * + * Note: `MaxExposurePageSize` is used to bound `ClaimedRewards` and is unsafe to reduce + * without handling it in a migration. + */ + MaxExposurePageSize: PlainDescriptor; + /** + * The maximum number of `unlocking` chunks a [`StakingLedger`] can + * have. Effectively determines how many unique eras a staker may be + * unbonding in. + * + * Note: `MaxUnlockingChunks` is used as the upper bound for the + * `BoundedVec` item `StakingLedger.unlocking`. Setting this value + * lower than the existing value can lead to inconsistencies in the + * `StakingLedger` and will need to be handled properly in a runtime + * migration. The test `reducing_max_unlocking_chunks_abrupt` shows + * this effect. + */ + MaxUnlockingChunks: PlainDescriptor; + }; + Grandpa: { + /** + * Max Authorities in use + */ + MaxAuthorities: PlainDescriptor; + /** + * The maximum number of nominators for each validator. + */ + MaxNominators: PlainDescriptor; + /** + * The maximum number of entries to keep in the set id to session index mapping. + * + * Since the `SetIdSession` map is only used for validating equivocations this + * value should relate to the bonding duration of whatever staking system is + * being used (if any). If equivocation handling is not enabled then this value + * can be zero. + */ + MaxSetIdSessionEntries: PlainDescriptor; + }; + Treasury: { + /** + * Period between successive spends. + */ + SpendPeriod: PlainDescriptor; + /** + * Percentage of spare funds (if any) that are burnt per spend period. + */ + Burn: PlainDescriptor; + /** + * The treasury's pallet id, used for deriving its sovereign account ID. + */ + PalletId: PlainDescriptor>; + /** + * The maximum number of approvals that can wait in the spending queue. + * + * NOTE: This parameter is also used within the Bounties Pallet extension if enabled. + */ + MaxApprovals: PlainDescriptor; + /** + * The period during which an approved treasury spend has to be claimed. + */ + PayoutPeriod: PlainDescriptor; + }; + ConvictionVoting: { + /** + * The maximum number of concurrent votes an account may have. + * + * Also used to compute weight, an overly large value can lead to extrinsics with large + * weight estimation: see `delegate` for instance. + */ + MaxVotes: PlainDescriptor; + /** + * The minimum period of vote locking. + * + * It should be no shorter than enactment period to ensure that in the case of an approval, + * those successful voters are locked into the consequences that their votes entail. + */ + VoteLockingPeriod: PlainDescriptor; + }; + Referenda: { + /** + * The minimum amount to be used as a deposit for a public referendum proposal. + */ + SubmissionDeposit: PlainDescriptor; + /** + * Maximum size of the referendum queue for a single track. + */ + MaxQueued: PlainDescriptor; + /** + * The number of blocks after submission that a referendum must begin being decided by. + * Once this passes, then anyone may cancel the referendum. + */ + UndecidingTimeout: PlainDescriptor; + /** + * Quantization level for the referendum wakeup scheduler. A higher number will result in + * fewer storage reads/writes needed for smaller voters, but also result in delays to the + * automatic referendum status changes. Explicit servicing instructions are unaffected. + */ + AlarmInterval: PlainDescriptor; + /** + * Information concerning the different referendum tracks. + */ + Tracks: PlainDescriptor>; + }; + Claims: { + /** + + */ + Prefix: PlainDescriptor; + }; + Vesting: { + /** + * The minimum amount transferred to call `vested_transfer`. + */ + MinVestedTransfer: PlainDescriptor; + /** + + */ + MaxVestingSchedules: PlainDescriptor; + }; + Utility: { + /** + * The limit on the number of batched calls. + */ + batched_calls_limit: PlainDescriptor; + }; + Proxy: { + /** + * The base amount of currency needed to reserve for creating a proxy. + * + * This is held for an additional storage item whose value size is + * `sizeof(Balance)` bytes and whose key size is `sizeof(AccountId)` bytes. + */ + ProxyDepositBase: PlainDescriptor; + /** + * The amount of currency needed per proxy added. + * + * This is held for adding 32 bytes plus an instance of `ProxyType` more into a + * pre-existing storage value. Thus, when configuring `ProxyDepositFactor` one should take + * into account `32 + proxy_type.encode().len()` bytes of data. + */ + ProxyDepositFactor: PlainDescriptor; + /** + * The maximum amount of proxies allowed for a single account. + */ + MaxProxies: PlainDescriptor; + /** + * The maximum amount of time-delayed announcements that are allowed to be pending. + */ + MaxPending: PlainDescriptor; + /** + * The base amount of currency needed to reserve for creating an announcement. + * + * This is held when a new storage item holding a `Balance` is created (typically 16 + * bytes). + */ + AnnouncementDepositBase: PlainDescriptor; + /** + * The amount of currency needed per announcement made. + * + * This is held for adding an `AccountId`, `Hash` and `BlockNumber` (typically 68 bytes) + * into a pre-existing storage value. + */ + AnnouncementDepositFactor: PlainDescriptor; + }; + Multisig: { + /** + * The base amount of currency needed to reserve for creating a multisig execution or to + * store a dispatch call for later. + * + * This is held for an additional storage item whose value size is + * `4 + sizeof((BlockNumber, Balance, AccountId))` bytes and whose key size is + * `32 + sizeof(AccountId)` bytes. + */ + DepositBase: PlainDescriptor; + /** + * The amount of currency needed per unit threshold when creating a multisig execution. + * + * This is held for adding 32 bytes more into a pre-existing storage value. + */ + DepositFactor: PlainDescriptor; + /** + * The maximum amount of signatories allowed in the multisig. + */ + MaxSignatories: PlainDescriptor; + }; + Bounties: { + /** + * The amount held on deposit for placing a bounty proposal. + */ + BountyDepositBase: PlainDescriptor; + /** + * The delay period for which a bounty beneficiary need to wait before claim the payout. + */ + BountyDepositPayoutDelay: PlainDescriptor; + /** + * Bounty duration in blocks. + */ + BountyUpdatePeriod: PlainDescriptor; + /** + * The curator deposit is calculated as a percentage of the curator fee. + * + * This deposit has optional upper and lower bounds with `CuratorDepositMax` and + * `CuratorDepositMin`. + */ + CuratorDepositMultiplier: PlainDescriptor; + /** + * Maximum amount of funds that should be placed in a deposit for making a proposal. + */ + CuratorDepositMax: PlainDescriptor>; + /** + * Minimum amount of funds that should be placed in a deposit for making a proposal. + */ + CuratorDepositMin: PlainDescriptor>; + /** + * Minimum value for a bounty. + */ + BountyValueMinimum: PlainDescriptor; + /** + * The amount held on deposit per byte within the tip report reason or bounty description. + */ + DataDepositPerByte: PlainDescriptor; + /** + * Maximum acceptable reason length. + * + * Benchmarks depend on this value, be sure to update weights file when changing this value + */ + MaximumReasonLength: PlainDescriptor; + }; + ChildBounties: { + /** + * Maximum number of child bounties that can be added to a parent bounty. + */ + MaxActiveChildBountyCount: PlainDescriptor; + /** + * Minimum value for a child-bounty. + */ + ChildBountyValueMinimum: PlainDescriptor; + }; + ElectionProviderMultiPhase: { + /** + * The minimum amount of improvement to the solution score that defines a solution as + * "better" in the Signed phase. + */ + BetterSignedThreshold: PlainDescriptor; + /** + * The repeat threshold of the offchain worker. + * + * For example, if it is 5, that means that at least 5 blocks will elapse between attempts + * to submit the worker's solution. + */ + OffchainRepeat: PlainDescriptor; + /** + * The priority of the unsigned transaction submitted in the unsigned-phase + */ + MinerTxPriority: PlainDescriptor; + /** + * Maximum number of signed submissions that can be queued. + * + * It is best to avoid adjusting this during an election, as it impacts downstream data + * structures. In particular, `SignedSubmissionIndices` is bounded on this value. If you + * update this value during an election, you _must_ ensure that + * `SignedSubmissionIndices.len()` is less than or equal to the new value. Otherwise, + * attempts to submit new solutions may cause a runtime panic. + */ + SignedMaxSubmissions: PlainDescriptor; + /** + * Maximum weight of a signed solution. + * + * If [`Config::MinerConfig`] is being implemented to submit signed solutions (outside of + * this pallet), then [`MinerConfig::solution_weight`] is used to compare against + * this value. + */ + SignedMaxWeight: PlainDescriptor>; + /** + * The maximum amount of unchecked solutions to refund the call fee for. + */ + SignedMaxRefunds: PlainDescriptor; + /** + * Base reward for a signed solution + */ + SignedRewardBase: PlainDescriptor; + /** + * Per-byte deposit for a signed solution. + */ + SignedDepositByte: PlainDescriptor; + /** + * Per-weight deposit for a signed solution. + */ + SignedDepositWeight: PlainDescriptor; + /** + * The maximum number of winners that can be elected by this `ElectionProvider` + * implementation. + * + * Note: This must always be greater or equal to `T::DataProvider::desired_targets()`. + */ + MaxWinners: PlainDescriptor; + /** + + */ + MinerMaxLength: PlainDescriptor; + /** + + */ + MinerMaxWeight: PlainDescriptor>; + /** + + */ + MinerMaxVotesPerVoter: PlainDescriptor; + /** + + */ + MinerMaxWinners: PlainDescriptor; + }; + VoterList: { + /** + * The list of thresholds separating the various bags. + * + * Ids are separated into unsorted bags according to their score. This specifies the + * thresholds separating the bags. An id's bag is the largest bag for which the id's score + * is less than or equal to its upper threshold. + * + * When ids are iterated, higher bags are iterated completely before lower bags. This means + * that iteration is _semi-sorted_: ids of higher score tend to come before ids of lower + * score, but peer ids within a particular bag are sorted in insertion order. + * + * # Expressing the constant + * + * This constant must be sorted in strictly increasing order. Duplicate items are not + * permitted. + * + * There is an implied upper limit of `Score::MAX`; that value does not need to be + * specified within the bag. For any two threshold lists, if one ends with + * `Score::MAX`, the other one does not, and they are otherwise equal, the two + * lists will behave identically. + * + * # Calculation + * + * It is recommended to generate the set of thresholds in a geometric series, such that + * there exists some constant ratio such that `threshold[k + 1] == (threshold[k] * + * constant_ratio).max(threshold[k] + 1)` for all `k`. + * + * The helpers in the `/utils/frame/generate-bags` module can simplify this calculation. + * + * # Examples + * + * - If `BagThresholds::get().is_empty()`, then all ids are put into the same bag, and + * iteration is strictly in insertion order. + * - If `BagThresholds::get().len() == 64`, and the thresholds are determined according to + * the procedure given above, then the constant ratio is equal to 2. + * - If `BagThresholds::get().len() == 200`, and the thresholds are determined according to + * the procedure given above, then the constant ratio is approximately equal to 1.248. + * - If the threshold list begins `[1, 2, 3, ...]`, then an id with score 0 or 1 will fall + * into bag 0, an id with score 2 will fall into bag 1, etc. + * + * # Migration + * + * In the event that this list ever changes, a copy of the old bags list must be retained. + * With that `List::migrate` can be called, which will perform the appropriate migration. + */ + BagThresholds: PlainDescriptor>; + }; + NominationPools: { + /** + * The nomination pool's pallet id. + */ + PalletId: PlainDescriptor>; + /** + * The maximum pool points-to-balance ratio that an `open` pool can have. + * + * This is important in the event slashing takes place and the pool's points-to-balance + * ratio becomes disproportional. + * + * Moreover, this relates to the `RewardCounter` type as well, as the arithmetic operations + * are a function of number of points, and by setting this value to e.g. 10, you ensure + * that the total number of points in the system are at most 10 times the total_issuance of + * the chain, in the absolute worse case. + * + * For a value of 10, the threshold would be a pool points-to-balance ratio of 10:1. + * Such a scenario would also be the equivalent of the pool being 90% slashed. + */ + MaxPointsToBalance: PlainDescriptor; + /** + * The maximum number of simultaneous unbonding chunks that can exist per member. + */ + MaxUnbonding: PlainDescriptor; + }; + FastUnstake: { + /** + * Deposit to take for unstaking, to make sure we're able to slash the it in order to cover + * the costs of resources on unsuccessful unstake. + */ + Deposit: PlainDescriptor; + }; + Paras: { + /** + + */ + UnsignedPriority: PlainDescriptor; + }; + OnDemand: { + /** + * The default value for the spot traffic multiplier. + */ + TrafficDefaultValue: PlainDescriptor; + /** + * The maximum number of blocks some historical revenue + * information stored for. + */ + MaxHistoricalRevenue: PlainDescriptor; + /** + * Identifier for the internal revenue balance. + */ + PalletId: PlainDescriptor>; + }; + Registrar: { + /** + * The deposit to be paid to run a on-demand parachain. + * This should include the cost for storing the genesis head and validation code. + */ + ParaDeposit: PlainDescriptor; + /** + * The deposit to be paid per byte stored on chain. + */ + DataDepositPerByte: PlainDescriptor; + }; + Slots: { + /** + * The number of blocks over which a single period lasts. + */ + LeasePeriod: PlainDescriptor; + /** + * The number of blocks to offset each lease period by. + */ + LeaseOffset: PlainDescriptor; + }; + Auctions: { + /** + * The number of blocks over which an auction may be retroactively ended. + */ + EndingPeriod: PlainDescriptor; + /** + * The length of each sample to take during the ending period. + * + * `EndingPeriod` / `SampleLength` = Total # of Samples + */ + SampleLength: PlainDescriptor; + /** + + */ + SlotRangeCount: PlainDescriptor; + /** + + */ + LeasePeriodsPerSlot: PlainDescriptor; + }; + Crowdloan: { + /** + * `PalletId` for the crowdloan pallet. An appropriate value could be + * `PalletId(*b"py/cfund")` + */ + PalletId: PlainDescriptor>; + /** + * The minimum amount that may be contributed into a crowdloan. Should almost certainly be + * at least `ExistentialDeposit`. + */ + MinContribution: PlainDescriptor; + /** + * Max number of storage keys to remove per extrinsic call. + */ + RemoveKeysLimit: PlainDescriptor; + }; + Coretime: { + /** + * The ParaId of the coretime chain. + */ + BrokerId: PlainDescriptor; + /** + * The coretime chain pot location. + */ + BrokerPotLocation: PlainDescriptor; + }; + StateTrieMigration: { + /** + * Maximal number of bytes that a key can have. + * + * FRAME itself does not limit the key length. + * The concrete value must therefore depend on your storage usage. + * A [`frame_support::storage::StorageNMap`] for example can have an arbitrary number of + * keys which are then hashed and concatenated, resulting in arbitrarily long keys. + * + * Use the *state migration RPC* to retrieve the length of the longest key in your + * storage: + * + * The migration will halt with a `Halted` event if this value is too small. + * Since there is no real penalty from over-estimating, it is advised to use a large + * value. The default is 512 byte. + * + * Some key lengths for reference: + * - [`frame_support::storage::StorageValue`]: 32 byte + * - [`frame_support::storage::StorageMap`]: 64 byte + * - [`frame_support::storage::StorageDoubleMap`]: 96 byte + * + * For more info see + * + */ + MaxKeyLen: PlainDescriptor; + }; + MessageQueue: { + /** + * The size of the page; this implies the maximum message size which can be sent. + * + * A good value depends on the expected message sizes, their weights, the weight that is + * available for processing them and the maximal needed message size. The maximal message + * size is slightly lower than this as defined by [`MaxMessageLenOf`]. + */ + HeapSize: PlainDescriptor; + /** + * The maximum number of stale pages (i.e. of overweight messages) allowed before culling + * can happen. Once there are more stale pages than this, then historical pages may be + * dropped, even if they contain unprocessed overweight messages. + */ + MaxStale: PlainDescriptor; + /** + * The amount of weight (if any) which should be provided to the message queue for + * servicing enqueued items `on_initialize`. + * + * This may be legitimately `None` in the case that you will call + * `ServiceQueues::service_queues` manually or set [`Self::IdleMaxServiceWeight`] to have + * it run in `on_idle`. + */ + ServiceWeight: PlainDescriptor>; + /** + * The maximum amount of weight (if any) to be used from remaining weight `on_idle` which + * should be provided to the message queue for servicing enqueued items `on_idle`. + * Useful for parachains to process messages at the same block they are received. + * + * If `None`, it will not call `ServiceQueues::service_queues` in `on_idle`. + */ + IdleMaxServiceWeight: PlainDescriptor>; + }; + Beefy: { + /** + * The maximum number of authorities that can be added. + */ + MaxAuthorities: PlainDescriptor; + /** + * The maximum number of nominators for each validator. + */ + MaxNominators: PlainDescriptor; + /** + * The maximum number of entries to keep in the set id to session index mapping. + * + * Since the `SetIdSession` map is only used for validating equivocations this + * value should relate to the bonding duration of whatever staking system is + * being used (if any). If equivocation handling is not enabled then this value + * can be zero. + */ + MaxSetIdSessionEntries: PlainDescriptor; + }; +}; +type IRuntimeCalls = { + /** + + */ + Inflation: { + /** + * Return the current estimates of the inflation amount. + * + * This is marked as experimental in light of RFC#89. Nonetheless, its usage is highly + * recommended over trying to read-storage, or re-create the onchain logic. + */ + experimental_inflation_prediction_info: RuntimeDescriptor<[], Anonymize>; + }; + /** + * The `Core` runtime api that every Substrate runtime needs to implement. + */ + Core: { + /** + * Returns the version of the runtime. + */ + version: RuntimeDescriptor<[], Anonymize>; + /** + * Execute the given block. + */ + execute_block: RuntimeDescriptor<[block: Anonymize], undefined>; + /** + * Initialize a block with the given header and return the runtime executive mode. + */ + initialize_block: RuntimeDescriptor<[header: Anonymize], Anonymize>; + }; + /** + * The `Metadata` api trait that returns metadata for the runtime. + */ + Metadata: { + /** + * Returns the metadata of a runtime. + */ + metadata: RuntimeDescriptor<[], Binary>; + /** + * Returns the metadata at a given version. + * + * If the given `version` isn't supported, this will return `None`. + * Use [`Self::metadata_versions`] to find out about supported metadata version of the runtime. + */ + metadata_at_version: RuntimeDescriptor<[version: number], Anonymize>; + /** + * Returns the supported metadata versions. + * + * This can be used to call `metadata_at_version`. + */ + metadata_versions: RuntimeDescriptor<[], Anonymize>; + }; + /** + * The `BlockBuilder` api trait that provides the required functionality for building a block. + */ + BlockBuilder: { + /** + * Apply the given extrinsic. + * + * Returns an inclusion outcome which specifies if this extrinsic is included in + * this block or not. + */ + apply_extrinsic: RuntimeDescriptor<[extrinsic: Binary], Anonymize>; + /** + * Finish the current block. + */ + finalize_block: RuntimeDescriptor<[], Anonymize>; + /** + * Generate inherent extrinsics. The inherent data will vary from chain to chain. + */ + inherent_extrinsics: RuntimeDescriptor<[inherent: Anonymize], Anonymize>; + /** + * Check that the inherents are valid. The inherent data will vary from chain to chain. + */ + check_inherents: RuntimeDescriptor<[block: Anonymize, data: Anonymize], Anonymize>; + }; + /** + * Runtime api for accessing information about nomination pools. + */ + NominationPoolsApi: { + /** + * Returns the pending rewards for the member that the AccountId was given for. + */ + pending_rewards: RuntimeDescriptor<[who: SS58String], bigint>; + /** + * Returns the equivalent balance of `points` for a given pool. + */ + points_to_balance: RuntimeDescriptor<[pool_id: number, points: bigint], bigint>; + /** + * Returns the equivalent points of `new_funds` for a given pool. + */ + balance_to_points: RuntimeDescriptor<[pool_id: number, new_funds: bigint], bigint>; + /** + * Returns the pending slash for a given pool. + */ + pool_pending_slash: RuntimeDescriptor<[pool_id: number], bigint>; + /** + * Returns the pending slash for a given pool member. + */ + member_pending_slash: RuntimeDescriptor<[member: SS58String], bigint>; + /** + * Returns true if the pool with `pool_id` needs migration. + * + * This can happen when the `pallet-nomination-pools` has switched to using strategy + * [`DelegateStake`](pallet_nomination_pools::adapter::DelegateStake) but the pool + * still has funds that were staked using the older strategy + * [TransferStake](pallet_nomination_pools::adapter::TransferStake). Use + * [`migrate_pool_to_delegate_stake`](pallet_nomination_pools::Call::migrate_pool_to_delegate_stake) + * to migrate the pool. + */ + pool_needs_delegate_migration: RuntimeDescriptor<[pool_id: number], boolean>; + /** + * Returns true if the delegated funds of the pool `member` needs migration. + * + * Once a pool has successfully migrated to the strategy + * [`DelegateStake`](pallet_nomination_pools::adapter::DelegateStake), the funds of the + * member can be migrated from pool account to the member's account. Use + * [`migrate_delegation`](pallet_nomination_pools::Call::migrate_delegation) + * to migrate the funds of the pool member. + */ + member_needs_delegate_migration: RuntimeDescriptor<[member: SS58String], boolean>; + }; + /** + + */ + StakingApi: { + /** + * Returns the nominations quota for a nominator with a given balance. + */ + nominations_quota: RuntimeDescriptor<[balance: bigint], number>; + /** + * Returns the page count of exposures for a validator `account` in a given era. + */ + eras_stakers_page_count: RuntimeDescriptor<[era: number, account: SS58String], number>; + /** + * Returns true if validator `account` has pages to be claimed for the given era. + */ + pending_rewards: RuntimeDescriptor<[era: number, account: SS58String], boolean>; + }; + /** + * The `TaggedTransactionQueue` api trait for interfering with the transaction queue. + */ + TaggedTransactionQueue: { + /** + * Validate the transaction. + * + * This method is invoked by the transaction pool to learn details about given transaction. + * The implementation should make sure to verify the correctness of the transaction + * against current state. The given `block_hash` corresponds to the hash of the block + * that is used as current state. + * + * Note that this call may be performed by the pool multiple times and transactions + * might be verified in any possible order. + */ + validate_transaction: RuntimeDescriptor<[source: TransactionValidityTransactionSource, tx: Binary, block_hash: FixedSizeBinary<32>], Anonymize>; + }; + /** + * The offchain worker api. + */ + OffchainWorkerApi: { + /** + * Starts the off-chain task for given block header. + */ + offchain_worker: RuntimeDescriptor<[header: Anonymize], undefined>; + }; + /** + * The API for querying the state of parachains on-chain. + */ + ParachainHost: { + /** + * Get the current validators. + */ + validators: RuntimeDescriptor<[], Anonymize>; + /** + * Returns the validator groups and rotation info localized based on the hypothetical child + * of a block whose state this is invoked on. Note that `now` in the `GroupRotationInfo` + * should be the successor of the number of the block. + */ + validator_groups: RuntimeDescriptor<[], Anonymize>; + /** + * Yields information on all availability cores as relevant to the child block. + * Cores are either free or occupied. Free cores can have paras assigned to them. + */ + availability_cores: RuntimeDescriptor<[], Anonymize>; + /** + * Yields the persisted validation data for the given `ParaId` along with an assumption that + * should be used if the para currently occupies a core. + * + * Returns `None` if either the para is not registered or the assumption is `Freed` + * and the para already occupies a core. + */ + persisted_validation_data: RuntimeDescriptor<[para_id: number, assumption: OccupiedCoreAssumption], Anonymize>; + /** + * Returns the persisted validation data for the given `ParaId` along with the corresponding + * validation code hash. Instead of accepting assumption about the para, matches the validation + * data hash against an expected one and yields `None` if they're not equal. + */ + assumed_validation_data: RuntimeDescriptor<[para_id: number, expected_persisted_validation_data_hash: FixedSizeBinary<32>], Anonymize>; + /** + * Checks if the given validation outputs pass the acceptance criteria. + */ + check_validation_outputs: RuntimeDescriptor<[para_id: number, outputs: Anonymize], boolean>; + /** + * Returns the session index expected at a child of the block. + * + * This can be used to instantiate a `SigningContext`. + */ + session_index_for_child: RuntimeDescriptor<[], number>; + /** + * Fetch the validation code used by a para, making the given `OccupiedCoreAssumption`. + * + * Returns `None` if either the para is not registered or the assumption is `Freed` + * and the para already occupies a core. + */ + validation_code: RuntimeDescriptor<[para_id: number, assumption: OccupiedCoreAssumption], Anonymize>; + /** + * Get the receipt of a candidate pending availability. This returns `Some` for any paras + * assigned to occupied cores in `availability_cores` and `None` otherwise. + */ + candidate_pending_availability: RuntimeDescriptor<[para_id: number], Anonymize>; + /** + * Get a vector of events concerning candidates that occurred within a block. + */ + candidate_events: RuntimeDescriptor<[], Anonymize>; + /** + * Get all the pending inbound messages in the downward message queue for a para. + */ + dmq_contents: RuntimeDescriptor<[recipient: number], Anonymize>; + /** + * Get the contents of all channels addressed to the given recipient. Channels that have no + * messages in them are also included. + */ + inbound_hrmp_channels_contents: RuntimeDescriptor<[recipient: number], Anonymize>; + /** + * Get the validation code from its hash. + */ + validation_code_by_hash: RuntimeDescriptor<[hash: FixedSizeBinary<32>], Anonymize>; + /** + * Scrape dispute relevant from on-chain, backing votes and resolved disputes. + */ + on_chain_votes: RuntimeDescriptor<[], Anonymize>; + /** + * Get the session info for the given session, if stored. + * + * NOTE: This function is only available since parachain host version 2. + */ + session_info: RuntimeDescriptor<[index: number], Anonymize>; + /** + * Submits a PVF pre-checking statement into the transaction pool. + * + * NOTE: This function is only available since parachain host version 2. + */ + submit_pvf_check_statement: RuntimeDescriptor<[stmt: Anonymize, signature: FixedSizeBinary<64>], undefined>; + /** + * Returns code hashes of PVFs that require pre-checking by validators in the active set. + * + * NOTE: This function is only available since parachain host version 2. + */ + pvfs_require_precheck: RuntimeDescriptor<[], Anonymize>; + /** + * Fetch the hash of the validation code used by a para, making the given `OccupiedCoreAssumption`. + * + * NOTE: This function is only available since parachain host version 2. + */ + validation_code_hash: RuntimeDescriptor<[para_id: number, assumption: OccupiedCoreAssumption], Anonymize>; + /** + * Returns all onchain disputes. + */ + disputes: RuntimeDescriptor<[], Anonymize>; + /** + * Returns execution parameters for the session. + */ + session_executor_params: RuntimeDescriptor<[session_index: number], Anonymize>; + /** + * Returns a list of validators that lost a past session dispute and need to be slashed. + * NOTE: This function is only available since parachain host version 5. + */ + unapplied_slashes: RuntimeDescriptor<[], Anonymize>; + /** + * Returns a merkle proof of a validator session key. + * NOTE: This function is only available since parachain host version 5. + */ + key_ownership_proof: RuntimeDescriptor<[validator_id: FixedSizeBinary<32>], Anonymize>; + /** + * Submit an unsigned extrinsic to slash validators who lost a dispute about + * a candidate of a past session. + * NOTE: This function is only available since parachain host version 5. + */ + submit_report_dispute_lost: RuntimeDescriptor<[dispute_proof: Anonymize, key_ownership_proof: Binary], boolean>; + /** + * Get the minimum number of backing votes for a parachain candidate. + * This is a staging method! Do not use on production runtimes! + */ + minimum_backing_votes: RuntimeDescriptor<[], number>; + /** + * Returns the state of parachain backing for a given para. + */ + para_backing_state: RuntimeDescriptor<[_: number], Anonymize>; + /** + * Returns candidate's acceptance limitations for asynchronous backing for a relay parent. + */ + async_backing_params: RuntimeDescriptor<[], Anonymize>; + /** + * Returns a list of all disabled validators at the given block. + */ + disabled_validators: RuntimeDescriptor<[], Anonymize>; + /** + * Get node features. + * This is a staging method! Do not use on production runtimes! + */ + node_features: RuntimeDescriptor<[], { + bytes: Uint8Array; + bitsLen: number; + }>; + /** + * Approval voting configuration parameters + */ + approval_voting_params: RuntimeDescriptor<[], number>; + /** + * Claim queue + */ + claim_queue: RuntimeDescriptor<[], Anonymize>; + /** + * Elastic scaling support + */ + candidates_pending_availability: RuntimeDescriptor<[para_id: number], Anonymize>; + }; + /** + * API necessary for BEEFY voters. + */ + BeefyApi: { + /** + * Return the block number where BEEFY consensus is enabled/started + */ + beefy_genesis: RuntimeDescriptor<[], Anonymize>; + /** + * Return the current active BEEFY validator set + */ + validator_set: RuntimeDescriptor<[], Anonymize>; + /** + * Submits an unsigned extrinsic to report an equivocation. The caller + * must provide the equivocation proof and a key ownership proof + * (should be obtained using `generate_key_ownership_proof`). The + * extrinsic will be unsigned and should only be accepted for local + * authorship (not to be broadcast to the network). This method returns + * `None` when creation of the extrinsic fails, e.g. if equivocation + * reporting is disabled for the given runtime (i.e. this method is + * hardcoded to return `None`). Only useful in an offchain context. + */ + submit_report_equivocation_unsigned_extrinsic: RuntimeDescriptor<[equivocation_proof: Anonymize, key_owner_proof: Binary], boolean>; + /** + * Generates a proof of key ownership for the given authority in the + * given set. An example usage of this module is coupled with the + * session historical module to prove that a given authority key is + * tied to a given staking identity during a specific session. Proofs + * of key ownership are necessary for submitting equivocation reports. + * NOTE: even though the API takes a `set_id` as parameter the current + * implementations ignores this parameter and instead relies on this + * method being called at the correct block height, i.e. any point at + * which the given set id is live on-chain. Future implementations will + * instead use indexed data through an offchain worker, not requiring + * older states to be available. + */ + generate_key_ownership_proof: RuntimeDescriptor<[set_id: bigint, authority_id: FixedSizeBinary<33>], Anonymize>; + }; + /** + * API to interact with MMR pallet. + */ + MmrApi: { + /** + * Return the on-chain MMR root hash. + */ + mmr_root: RuntimeDescriptor<[], Anonymize>; + /** + * Return the number of MMR blocks in the chain. + */ + mmr_leaf_count: RuntimeDescriptor<[], Anonymize>; + /** + * Generate MMR proof for a series of block numbers. If `best_known_block_number = Some(n)`, + * use historical MMR state at given block height `n`. Else, use current MMR state. + */ + generate_proof: RuntimeDescriptor<[block_numbers: Anonymize, best_known_block_number: Anonymize], Anonymize>; + /** + * Verify MMR proof against on-chain MMR for a batch of leaves. + * + * Note this function will use on-chain MMR root hash and check if the proof matches the hash. + * Note, the leaves should be sorted such that corresponding leaves and leaf indices have the + * same position in both the `leaves` vector and the `leaf_indices` vector contained in the [LeafProof] + */ + verify_proof: RuntimeDescriptor<[leaves: Anonymize, proof: Anonymize], Anonymize>; + /** + * Verify MMR proof against given root hash for a batch of leaves. + * + * Note this function does not require any on-chain storage - the + * proof is verified against given MMR root hash. + * + * Note, the leaves should be sorted such that corresponding leaves and leaf indices have the + * same position in both the `leaves` vector and the `leaf_indices` vector contained in the [LeafProof] + */ + verify_proof_stateless: RuntimeDescriptor<[root: FixedSizeBinary<32>, leaves: Anonymize, proof: Anonymize], Anonymize>; + }; + /** + * API useful for BEEFY light clients. + */ + BeefyMmrApi: { + /** + * Return the currently active BEEFY authority set proof. + */ + authority_set_proof: RuntimeDescriptor<[], Anonymize>; + /** + * Return the next/queued BEEFY authority set proof. + */ + next_authority_set_proof: RuntimeDescriptor<[], Anonymize>; + }; + /** + * APIs for integrating the GRANDPA finality gadget into runtimes. + * This should be implemented on the runtime side. + * + * This is primarily used for negotiating authority-set changes for the + * gadget. GRANDPA uses a signaling model of changing authority sets: + * changes should be signaled with a delay of N blocks, and then automatically + * applied in the runtime after those N blocks have passed. + * + * The consensus protocol will coordinate the handoff externally. + */ + GrandpaApi: { + /** + * Get the current GRANDPA authorities and weights. This should not change except + * for when changes are scheduled and the corresponding delay has passed. + * + * When called at block B, it will return the set of authorities that should be + * used to finalize descendants of this block (B+1, B+2, ...). The block B itself + * is finalized by the authorities from block B-1. + */ + grandpa_authorities: RuntimeDescriptor<[], Anonymize>; + /** + * Submits an unsigned extrinsic to report an equivocation. The caller + * must provide the equivocation proof and a key ownership proof + * (should be obtained using `generate_key_ownership_proof`). The + * extrinsic will be unsigned and should only be accepted for local + * authorship (not to be broadcast to the network). This method returns + * `None` when creation of the extrinsic fails, e.g. if equivocation + * reporting is disabled for the given runtime (i.e. this method is + * hardcoded to return `None`). Only useful in an offchain context. + */ + submit_report_equivocation_unsigned_extrinsic: RuntimeDescriptor<[equivocation_proof: Anonymize, key_owner_proof: Binary], boolean>; + /** + * Generates a proof of key ownership for the given authority in the + * given set. An example usage of this module is coupled with the + * session historical module to prove that a given authority key is + * tied to a given staking identity during a specific session. Proofs + * of key ownership are necessary for submitting equivocation reports. + * NOTE: even though the API takes a `set_id` as parameter the current + * implementations ignore this parameter and instead rely on this + * method being called at the correct block height, i.e. any point at + * which the given set id is live on-chain. Future implementations will + * instead use indexed data through an offchain worker, not requiring + * older states to be available. + */ + generate_key_ownership_proof: RuntimeDescriptor<[set_id: bigint, authority_id: FixedSizeBinary<32>], Anonymize>; + /** + * Get current GRANDPA authority set id. + */ + current_set_id: RuntimeDescriptor<[], bigint>; + }; + /** + * API necessary for block authorship with BABE. + */ + BabeApi: { + /** + * Return the configuration for BABE. + */ + configuration: RuntimeDescriptor<[], Anonymize>; + /** + * Returns the slot that started the current epoch. + */ + current_epoch_start: RuntimeDescriptor<[], bigint>; + /** + * Returns information regarding the current epoch. + */ + current_epoch: RuntimeDescriptor<[], Anonymize>; + /** + * Returns information regarding the next epoch (which was already + * previously announced). + */ + next_epoch: RuntimeDescriptor<[], Anonymize>; + /** + * Generates a proof of key ownership for the given authority in the + * current epoch. An example usage of this module is coupled with the + * session historical module to prove that a given authority key is + * tied to a given staking identity during a specific session. Proofs + * of key ownership are necessary for submitting equivocation reports. + * NOTE: even though the API takes a `slot` as parameter the current + * implementations ignores this parameter and instead relies on this + * method being called at the correct block height, i.e. any point at + * which the epoch for the given slot is live on-chain. Future + * implementations will instead use indexed data through an offchain + * worker, not requiring older states to be available. + */ + generate_key_ownership_proof: RuntimeDescriptor<[slot: bigint, authority_id: FixedSizeBinary<32>], Anonymize>; + /** + * Submits an unsigned extrinsic to report an equivocation. The caller + * must provide the equivocation proof and a key ownership proof + * (should be obtained using `generate_key_ownership_proof`). The + * extrinsic will be unsigned and should only be accepted for local + * authorship (not to be broadcast to the network). This method returns + * `None` when creation of the extrinsic fails, e.g. if equivocation + * reporting is disabled for the given runtime (i.e. this method is + * hardcoded to return `None`). Only useful in an offchain context. + */ + submit_report_equivocation_unsigned_extrinsic: RuntimeDescriptor<[equivocation_proof: Anonymize, key_owner_proof: Binary], boolean>; + }; + /** + * The authority discovery api. + * + * This api is used by the `client/authority-discovery` module to retrieve identifiers + * of the current and next authority set. + */ + AuthorityDiscoveryApi: { + /** + * Retrieve authority identifiers of the current and next authority set. + */ + authorities: RuntimeDescriptor<[], Anonymize>; + }; + /** + * Session keys runtime api. + */ + SessionKeys: { + /** + * Generate a set of session keys with optionally using the given seed. + * The keys should be stored within the keystore exposed via runtime + * externalities. + * + * The seed needs to be a valid `utf8` string. + * + * Returns the concatenated SCALE encoded public keys. + */ + generate_session_keys: RuntimeDescriptor<[seed: Anonymize], Binary>; + /** + * Decode the given public session keys. + * + * Returns the list of public raw public keys + key type. + */ + decode_session_keys: RuntimeDescriptor<[encoded: Binary], Anonymize>; + }; + /** + * The API to query account nonce. + */ + AccountNonceApi: { + /** + * Get current account nonce of given `AccountId`. + */ + account_nonce: RuntimeDescriptor<[account: SS58String], number>; + }; + /** + + */ + TransactionPaymentApi: { + /** + + */ + query_info: RuntimeDescriptor<[uxt: Binary, len: number], Anonymize>; + /** + + */ + query_fee_details: RuntimeDescriptor<[uxt: Binary, len: number], Anonymize>; + /** + + */ + query_weight_to_fee: RuntimeDescriptor<[weight: Anonymize], bigint>; + /** + + */ + query_length_to_fee: RuntimeDescriptor<[length: number], bigint>; + }; + /** + + */ + TransactionPaymentCallApi: { + /** + * Query information of a dispatch class, weight, and fee of a given encoded `Call`. + */ + query_call_info: RuntimeDescriptor<[call: Anonymize, len: number], Anonymize>; + /** + * Query fee details of a given encoded `Call`. + */ + query_call_fee_details: RuntimeDescriptor<[call: Anonymize, len: number], Anonymize>; + /** + * Query the output of the current `WeightToFee` given some input. + */ + query_weight_to_fee: RuntimeDescriptor<[weight: Anonymize], bigint>; + /** + * Query the output of the current `LengthToFee` given some input. + */ + query_length_to_fee: RuntimeDescriptor<[length: number], bigint>; + }; + /** + * A trait of XCM payment API. + * + * API provides functionality for obtaining: + * + * * the weight required to execute an XCM message, + * * a list of acceptable `AssetId`s for message execution payment, + * * the cost of the weight in the specified acceptable `AssetId`. + * * the fees for an XCM message delivery. + * + * To determine the execution weight of the calls required for + * [`xcm::latest::Instruction::Transact`] instruction, `TransactionPaymentCallApi` can be used. + */ + XcmPaymentApi: { + /** + * Returns a list of acceptable payment assets. + * + * # Arguments + * + * * `xcm_version`: Version. + */ + query_acceptable_payment_assets: RuntimeDescriptor<[xcm_version: number], Anonymize>; + /** + * Returns a weight needed to execute a XCM. + * + * # Arguments + * + * * `message`: `VersionedXcm`. + */ + query_xcm_weight: RuntimeDescriptor<[message: DotXcmVersionedXcm], Anonymize>; + /** + * Converts a weight into a fee for the specified `AssetId`. + * + * # Arguments + * + * * `weight`: convertible `Weight`. + * * `asset`: `VersionedAssetId`. + */ + query_weight_to_asset_fee: RuntimeDescriptor<[weight: Anonymize, asset: DotXcmVersionedAssetId], Anonymize>; + /** + * Get delivery fees for sending a specific `message` to a `destination`. + * These always come in a specific asset, defined by the chain. + * + * # Arguments + * * `message`: The message that'll be sent, necessary because most delivery fees are based on the + * size of the message. + * * `destination`: The destination to send the message to. Different destinations may use + * different senders that charge different fees. + */ + query_delivery_fees: RuntimeDescriptor<[destination: DotXcmVersionedLocation, message: DotXcmVersionedXcm], Anonymize>; + }; + /** + * API for dry-running extrinsics and XCM programs to get the programs that need to be passed to the fees API. + * + * All calls return a vector of tuples (location, xcm) where each "xcm" is executed in "location". + * If there's local execution, the location will be "Here". + * This vector can be used to calculate both execution and delivery fees. + * + * Calls or XCMs might fail when executed, this doesn't mean the result of these calls will be an `Err`. + * In those cases, there might still be a valid result, with the execution error inside it. + * The only reasons why these calls might return an error are listed in the [`Error`] enum. + */ + DryRunApi: { + /** + * Dry run call. + */ + dry_run_call: RuntimeDescriptor<[origin: PolkadotRuntimeOriginCaller, call: Anonymize], Anonymize>; + /** + * Dry run XCM program + */ + dry_run_xcm: RuntimeDescriptor<[origin_location: DotXcmVersionedLocation, xcm: DotXcmVersionedXcm], Anonymize>; + }; + /** + * API for useful conversions between XCM `Location` and `AccountId`. + */ + LocationToAccountApi: { + /** + * Converts `Location` to `AccountId`. + */ + convert_location: RuntimeDescriptor<[location: DotXcmVersionedLocation], Anonymize>; + }; + /** + * API to interact with RuntimeGenesisConfig for the runtime + */ + GenesisBuilder: { + /** + * Build `RuntimeGenesisConfig` from a JSON blob not using any defaults and store it in the + * storage. + * + * In the case of a FRAME-based runtime, this function deserializes the full `RuntimeGenesisConfig` from the given JSON blob and + * puts it into the storage. If the provided JSON blob is incorrect or incomplete or the + * deserialization fails, an error is returned. + * + * Please note that provided JSON blob must contain all `RuntimeGenesisConfig` fields, no + * defaults will be used. + */ + build_state: RuntimeDescriptor<[json: Binary], Anonymize>; + /** + * Returns a JSON blob representation of the built-in `RuntimeGenesisConfig` identified by + * `id`. + * + * If `id` is `None` the function returns JSON blob representation of the default + * `RuntimeGenesisConfig` struct of the runtime. Implementation must provide default + * `RuntimeGenesisConfig`. + * + * Otherwise function returns a JSON representation of the built-in, named + * `RuntimeGenesisConfig` preset identified by `id`, or `None` if such preset does not + * exists. Returned `Vec` contains bytes of JSON blob (patch) which comprises a list of + * (potentially nested) key-value pairs that are intended for customizing the default + * runtime genesis config. The patch shall be merged (rfc7386) with the JSON representation + * of the default `RuntimeGenesisConfig` to create a comprehensive genesis config that can + * be used in `build_state` method. + */ + get_preset: RuntimeDescriptor<[id: Anonymize], Anonymize>; + /** + * Returns a list of identifiers for available builtin `RuntimeGenesisConfig` presets. + * + * The presets from the list can be queried with [`GenesisBuilder::get_preset`] method. If + * no named presets are provided by the runtime the list is empty. + */ + preset_names: RuntimeDescriptor<[], Anonymize>; + }; +}; +type IAsset = PlainDescriptor; +export type PaseoDispatchError = Anonymize; +type PalletsTypedef = { + __storage: IStorage; + __tx: ICalls; + __event: IEvent; + __error: IError; + __const: IConstants; +}; +type IDescriptors = { + descriptors: { + pallets: PalletsTypedef; + apis: IRuntimeCalls; + } & Promise; + metadataTypes: Promise; + asset: IAsset; + getMetadata: () => Promise; + genesis: string | undefined; +}; +declare const _allDescriptors: IDescriptors; +export default _allDescriptors; +export type PaseoQueries = QueryFromPalletsDef; +export type PaseoCalls = TxFromPalletsDef; +export type PaseoEvents = EventsFromPalletsDef; +export type PaseoErrors = ErrorsFromPalletsDef; +export type PaseoConstants = ConstFromPalletsDef; +export type PaseoCallData = Anonymize & { + value: { + type: string; + }; +}; +export type PaseoWhitelistEntry = PalletKey | ApiKey | `query.${NestedKey}` | `tx.${NestedKey}` | `event.${NestedKey}` | `error.${NestedKey}` | `const.${NestedKey}`; +type PalletKey = `*.${keyof (IStorage & ICalls & IEvent & IError & IConstants & IRuntimeCalls)}`; +type NestedKey>> = "*" | { + [P in keyof D & string]: `${P}.*` | { + [N in keyof D[P] & string]: `${P}.${N}`; + }[keyof D[P] & string]; +}[keyof D & string]; +type ApiKey>> = "api.*" | { + [P in keyof D & string]: `api.${P}.*` | { + [N in keyof D[P] & string]: `api.${P}.${N}`; + }[keyof D[P] & string]; +}[keyof D & string]; diff --git a/examples/with-vite-papi/.papi/descriptors/dist/paseo_metadata-F2XWSS56.mjs b/examples/with-vite-papi/.papi/descriptors/dist/paseo_metadata-F2XWSS56.mjs new file mode 100644 index 0000000..895f4b6 --- /dev/null +++ b/examples/with-vite-papi/.papi/descriptors/dist/paseo_metadata-F2XWSS56.mjs @@ -0,0 +1,6 @@ +// .papi/descriptors/src/paseo_metadata.ts +var binMeta = "bWV0YQ81DwAMHHNwX2NvcmUYY3J5cHRvLEFjY291bnRJZDMyAAAEAAQBIFt1ODsgMzJdAAAEAAADIAAAAAgACAAABQMADAgwZnJhbWVfc3lzdGVtLEFjY291bnRJbmZvCBROb25jZQEQLEFjY291bnREYXRhARQAFAEUbm9uY2UQARROb25jZQABJGNvbnN1bWVycxABIFJlZkNvdW50AAEkcHJvdmlkZXJzEAEgUmVmQ291bnQAASxzdWZmaWNpZW50cxABIFJlZkNvdW50AAEQZGF0YRQBLEFjY291bnREYXRhAAAQAAAFBQAUDDxwYWxsZXRfYmFsYW5jZXMUdHlwZXMsQWNjb3VudERhdGEEHEJhbGFuY2UBGAAQARBmcmVlGAEcQmFsYW5jZQABIHJlc2VydmVkGAEcQmFsYW5jZQABGGZyb3plbhgBHEJhbGFuY2UAARRmbGFncxwBKEV4dHJhRmxhZ3MAABgAAAUHABwMPHBhbGxldF9iYWxhbmNlcxR0eXBlcyhFeHRyYUZsYWdzAAAEABgBEHUxMjgAACAAAAUAACQMNGZyYW1lX3N1cHBvcnQgZGlzcGF0Y2hAUGVyRGlzcGF0Y2hDbGFzcwQEVAEoAAwBGG5vcm1hbCgBBFQAASxvcGVyYXRpb25hbCgBBFQAASRtYW5kYXRvcnkoAQRUAAAoDChzcF93ZWlnaHRzJHdlaWdodF92MhhXZWlnaHQAAAgBIHJlZl90aW1lLAEMdTY0AAEocHJvb2Zfc2l6ZSwBDHU2NAAALAAABjAAMAAABQYANAg8cHJpbWl0aXZlX3R5cGVzEEgyNTYAAAQABAEgW3U4OyAzMl0AADgAAAIIADwQKHNwX3J1bnRpbWUcZ2VuZXJpYxhkaWdlc3QYRGlnZXN0AAAEARBsb2dzQAE8VmVjPERpZ2VzdEl0ZW0+AABAAAACRABEEChzcF9ydW50aW1lHGdlbmVyaWMYZGlnZXN0KERpZ2VzdEl0ZW0AARQoUHJlUnVudGltZQgASAFEQ29uc2Vuc3VzRW5naW5lSWQAADgBHFZlYzx1OD4ABgAkQ29uc2Vuc3VzCABIAURDb25zZW5zdXNFbmdpbmVJZAAAOAEcVmVjPHU4PgAEABBTZWFsCABIAURDb25zZW5zdXNFbmdpbmVJZAAAOAEcVmVjPHU4PgAFABRPdGhlcgQAOAEcVmVjPHU4PgAAAGRSdW50aW1lRW52aXJvbm1lbnRVcGRhdGVkAAgAAEgAAAMEAAAACABMAAACUABQCDBmcmFtZV9zeXN0ZW0sRXZlbnRSZWNvcmQIBEUBVARUATQADAEUcGhhc2XVBwEUUGhhc2UAARRldmVudFQBBEUAARh0b3BpY3OVAQEYVmVjPFQ+AABUCDRwYXNlb19ydW50aW1lMFJ1bnRpbWVFdmVudAABpBhTeXN0ZW0EAFgBcGZyYW1lX3N5c3RlbTo6RXZlbnQ8UnVudGltZT4AAAAkU2NoZWR1bGVyBAB8AYBwYWxsZXRfc2NoZWR1bGVyOjpFdmVudDxSdW50aW1lPgABACBQcmVpbWFnZQQAkAF8cGFsbGV0X3ByZWltYWdlOjpFdmVudDxSdW50aW1lPgAKABxJbmRpY2VzBACUAXhwYWxsZXRfaW5kaWNlczo6RXZlbnQ8UnVudGltZT4ABAAgQmFsYW5jZXMEAJgBfHBhbGxldF9iYWxhbmNlczo6RXZlbnQ8UnVudGltZT4ABQBIVHJhbnNhY3Rpb25QYXltZW50BACgAahwYWxsZXRfdHJhbnNhY3Rpb25fcGF5bWVudDo6RXZlbnQ8UnVudGltZT4AIAAcU3Rha2luZwQApAF4cGFsbGV0X3N0YWtpbmc6OkV2ZW50PFJ1bnRpbWU+AAcAIE9mZmVuY2VzBAC8AVhwYWxsZXRfb2ZmZW5jZXM6OkV2ZW50AAgAHFNlc3Npb24EAMQBVHBhbGxldF9zZXNzaW9uOjpFdmVudAAJABxHcmFuZHBhBADIAVRwYWxsZXRfZ3JhbmRwYTo6RXZlbnQACwAgVHJlYXN1cnkEANgBfHBhbGxldF90cmVhc3VyeTo6RXZlbnQ8UnVudGltZT4AEwBAQ29udmljdGlvblZvdGluZwQAZQEBoHBhbGxldF9jb252aWN0aW9uX3ZvdGluZzo6RXZlbnQ8UnVudGltZT4AFAAkUmVmZXJlbmRhBABpAQGAcGFsbGV0X3JlZmVyZW5kYTo6RXZlbnQ8UnVudGltZT4AFQAkV2hpdGVsaXN0BAARBwGAcGFsbGV0X3doaXRlbGlzdDo6RXZlbnQ8UnVudGltZT4AFwAoUGFyYW1ldGVycwQAJQcBhHBhbGxldF9wYXJhbWV0ZXJzOjpFdmVudDxSdW50aW1lPgAbABhDbGFpbXMEAD0HAVhjbGFpbXM6OkV2ZW50PFJ1bnRpbWU+ABgAHFZlc3RpbmcEAEEHAXhwYWxsZXRfdmVzdGluZzo6RXZlbnQ8UnVudGltZT4AGQAcVXRpbGl0eQQARQcBVHBhbGxldF91dGlsaXR5OjpFdmVudAAaABRQcm94eQQASQcBcHBhbGxldF9wcm94eTo6RXZlbnQ8UnVudGltZT4AHQAgTXVsdGlzaWcEAE0HAXxwYWxsZXRfbXVsdGlzaWc6OkV2ZW50PFJ1bnRpbWU+AB4AIEJvdW50aWVzBABRBwF8cGFsbGV0X2JvdW50aWVzOjpFdmVudDxSdW50aW1lPgAiADRDaGlsZEJvdW50aWVzBABVBwGUcGFsbGV0X2NoaWxkX2JvdW50aWVzOjpFdmVudDxSdW50aW1lPgAmAGhFbGVjdGlvblByb3ZpZGVyTXVsdGlQaGFzZQQAWQcB0HBhbGxldF9lbGVjdGlvbl9wcm92aWRlcl9tdWx0aV9waGFzZTo6RXZlbnQ8UnVudGltZT4AJAAkVm90ZXJMaXN0BABpBwH0cGFsbGV0X2JhZ3NfbGlzdDo6RXZlbnQ8UnVudGltZSwgcGFsbGV0X2JhZ3NfbGlzdDo6SW5zdGFuY2UxPgAlADxOb21pbmF0aW9uUG9vbHMEAG0HAZxwYWxsZXRfbm9taW5hdGlvbl9wb29sczo6RXZlbnQ8UnVudGltZT4AJwAsRmFzdFVuc3Rha2UEAHEHAYxwYWxsZXRfZmFzdF91bnN0YWtlOjpFdmVudDxSdW50aW1lPgAoADRQYXJhSW5jbHVzaW9uBAB1BwGQcGFyYWNoYWluc19pbmNsdXNpb246OkV2ZW50PFJ1bnRpbWU+ADUAFFBhcmFzBACFBwFccGFyYWNoYWluc19wYXJhczo6RXZlbnQAOAAQSHJtcAQAiQcBfHBhcmFjaGFpbnNfaHJtcDo6RXZlbnQ8UnVudGltZT4APAA0UGFyYXNEaXNwdXRlcwQAjQcBjHBhcmFjaGFpbnNfZGlzcHV0ZXM6OkV2ZW50PFJ1bnRpbWU+AD4AIE9uRGVtYW5kBACZBwG0cGFyYWNoYWluc19hc3NpZ25lcl9vbl9kZW1hbmQ6OkV2ZW50PFJ1bnRpbWU+AEAAJFJlZ2lzdHJhcgQAnQcBfHBhcmFzX3JlZ2lzdHJhcjo6RXZlbnQ8UnVudGltZT4ARgAUU2xvdHMEAKEHAVRzbG90czo6RXZlbnQ8UnVudGltZT4ARwAgQXVjdGlvbnMEAKUHAWBhdWN0aW9uczo6RXZlbnQ8UnVudGltZT4ASAAkQ3Jvd2Rsb2FuBACpBwFkY3Jvd2Rsb2FuOjpFdmVudDxSdW50aW1lPgBJACBDb3JldGltZQQArQcBYGNvcmV0aW1lOjpFdmVudDxSdW50aW1lPgBKAEhTdGF0ZVRyaWVNaWdyYXRpb24EALEHAaxwYWxsZXRfc3RhdGVfdHJpZV9taWdyYXRpb246OkV2ZW50PFJ1bnRpbWU+AGIAJFhjbVBhbGxldAQAvQcBaHBhbGxldF94Y206OkV2ZW50PFJ1bnRpbWU+AGMAME1lc3NhZ2VRdWV1ZQQAxQcBkHBhbGxldF9tZXNzYWdlX3F1ZXVlOjpFdmVudDxSdW50aW1lPgBkACRBc3NldFJhdGUEAM0HAYRwYWxsZXRfYXNzZXRfcmF0ZTo6RXZlbnQ8UnVudGltZT4AZQAQU3VkbwQA0QcBbHBhbGxldF9zdWRvOjpFdmVudDxSdW50aW1lPgD/AABYDDBmcmFtZV9zeXN0ZW0YcGFsbGV0FEV2ZW50BARUAAEcQEV4dHJpbnNpY1N1Y2Nlc3MEATRkaXNwYXRjaF9pbmZvXAEwRGlzcGF0Y2hJbmZvAAAEkEFuIGV4dHJpbnNpYyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LjxFeHRyaW5zaWNGYWlsZWQIAThkaXNwYXRjaF9lcnJvcmgBNERpc3BhdGNoRXJyb3IAATRkaXNwYXRjaF9pbmZvXAEwRGlzcGF0Y2hJbmZvAAEEUEFuIGV4dHJpbnNpYyBmYWlsZWQuLENvZGVVcGRhdGVkAAIEUGA6Y29kZWAgd2FzIHVwZGF0ZWQuKE5ld0FjY291bnQEARxhY2NvdW50AAEwVDo6QWNjb3VudElkAAMEaEEgbmV3IGFjY291bnQgd2FzIGNyZWF0ZWQuNEtpbGxlZEFjY291bnQEARxhY2NvdW50AAEwVDo6QWNjb3VudElkAAQEWEFuIGFjY291bnQgd2FzIHJlYXBlZC4gUmVtYXJrZWQIARhzZW5kZXIAATBUOjpBY2NvdW50SWQAARBoYXNoNAEcVDo6SGFzaAAFBHBPbiBvbi1jaGFpbiByZW1hcmsgaGFwcGVuZWQuRFVwZ3JhZGVBdXRob3JpemVkCAEkY29kZV9oYXNoNAEcVDo6SGFzaAABNGNoZWNrX3ZlcnNpb24gARBib29sAAYEaEFuIHVwZ3JhZGUgd2FzIGF1dGhvcml6ZWQuBHBFdmVudCBmb3IgdGhlIFN5c3RlbSBwYWxsZXQuXAw0ZnJhbWVfc3VwcG9ydCBkaXNwYXRjaDBEaXNwYXRjaEluZm8AAAwBGHdlaWdodCgBGFdlaWdodAABFGNsYXNzYAE0RGlzcGF0Y2hDbGFzcwABIHBheXNfZmVlZAEQUGF5cwAAYAw0ZnJhbWVfc3VwcG9ydCBkaXNwYXRjaDREaXNwYXRjaENsYXNzAAEMGE5vcm1hbAAAACxPcGVyYXRpb25hbAABACRNYW5kYXRvcnkAAgAAZAw0ZnJhbWVfc3VwcG9ydCBkaXNwYXRjaBBQYXlzAAEIDFllcwAAAAhObwABAABoCChzcF9ydW50aW1lNERpc3BhdGNoRXJyb3IAATgUT3RoZXIAAAAwQ2Fubm90TG9va3VwAAEAJEJhZE9yaWdpbgACABhNb2R1bGUEAGwBLE1vZHVsZUVycm9yAAMARENvbnN1bWVyUmVtYWluaW5nAAQALE5vUHJvdmlkZXJzAAUAQFRvb01hbnlDb25zdW1lcnMABgAUVG9rZW4EAHABKFRva2VuRXJyb3IABwAoQXJpdGhtZXRpYwQAdAE8QXJpdGhtZXRpY0Vycm9yAAgANFRyYW5zYWN0aW9uYWwEAHgBSFRyYW5zYWN0aW9uYWxFcnJvcgAJACRFeGhhdXN0ZWQACgAoQ29ycnVwdGlvbgALACxVbmF2YWlsYWJsZQAMADhSb290Tm90QWxsb3dlZAANAABsCChzcF9ydW50aW1lLE1vZHVsZUVycm9yAAAIARRpbmRleAgBCHU4AAEUZXJyb3JIAYxbdTg7IE1BWF9NT0RVTEVfRVJST1JfRU5DT0RFRF9TSVpFXQAAcAgoc3BfcnVudGltZShUb2tlbkVycm9yAAEoQEZ1bmRzVW5hdmFpbGFibGUAAAAwT25seVByb3ZpZGVyAAEAMEJlbG93TWluaW11bQACADBDYW5ub3RDcmVhdGUAAwAwVW5rbm93bkFzc2V0AAQAGEZyb3plbgAFACxVbnN1cHBvcnRlZAAGAEBDYW5ub3RDcmVhdGVIb2xkAAcANE5vdEV4cGVuZGFibGUACAAcQmxvY2tlZAAJAAB0CDRzcF9hcml0aG1ldGljPEFyaXRobWV0aWNFcnJvcgABDCRVbmRlcmZsb3cAAAAgT3ZlcmZsb3cAAQA4RGl2aXNpb25CeVplcm8AAgAAeAgoc3BfcnVudGltZUhUcmFuc2FjdGlvbmFsRXJyb3IAAQgwTGltaXRSZWFjaGVkAAAAHE5vTGF5ZXIAAQAAfAxAcGFsbGV0X3NjaGVkdWxlchhwYWxsZXQURXZlbnQEBFQAASQkU2NoZWR1bGVkCAEQd2hlbhABREJsb2NrTnVtYmVyRm9yPFQ+AAEUaW5kZXgQAQx1MzIAAARQU2NoZWR1bGVkIHNvbWUgdGFzay4gQ2FuY2VsZWQIARB3aGVuEAFEQmxvY2tOdW1iZXJGb3I8VD4AARRpbmRleBABDHUzMgABBExDYW5jZWxlZCBzb21lIHRhc2suKERpc3BhdGNoZWQMARB0YXNrgAF4VGFza0FkZHJlc3M8QmxvY2tOdW1iZXJGb3I8VD4+AAEIaWSEAUBPcHRpb248VGFza05hbWU+AAEYcmVzdWx0iAE4RGlzcGF0Y2hSZXN1bHQAAgRURGlzcGF0Y2hlZCBzb21lIHRhc2suIFJldHJ5U2V0EAEQdGFza4ABeFRhc2tBZGRyZXNzPEJsb2NrTnVtYmVyRm9yPFQ+PgABCGlkhAFAT3B0aW9uPFRhc2tOYW1lPgABGHBlcmlvZBABREJsb2NrTnVtYmVyRm9yPFQ+AAEccmV0cmllcwgBCHU4AAMEoFNldCBhIHJldHJ5IGNvbmZpZ3VyYXRpb24gZm9yIHNvbWUgdGFzay44UmV0cnlDYW5jZWxsZWQIARB0YXNrgAF4VGFza0FkZHJlc3M8QmxvY2tOdW1iZXJGb3I8VD4+AAEIaWSEAUBPcHRpb248VGFza05hbWU+AAQErENhbmNlbCBhIHJldHJ5IGNvbmZpZ3VyYXRpb24gZm9yIHNvbWUgdGFzay48Q2FsbFVuYXZhaWxhYmxlCAEQdGFza4ABeFRhc2tBZGRyZXNzPEJsb2NrTnVtYmVyRm9yPFQ+PgABCGlkhAFAT3B0aW9uPFRhc2tOYW1lPgAFBCkBVGhlIGNhbGwgZm9yIHRoZSBwcm92aWRlZCBoYXNoIHdhcyBub3QgZm91bmQgc28gdGhlIHRhc2sgaGFzIGJlZW4gYWJvcnRlZC44UGVyaW9kaWNGYWlsZWQIARB0YXNrgAF4VGFza0FkZHJlc3M8QmxvY2tOdW1iZXJGb3I8VD4+AAEIaWSEAUBPcHRpb248VGFza05hbWU+AAYEPQFUaGUgZ2l2ZW4gdGFzayB3YXMgdW5hYmxlIHRvIGJlIHJlbmV3ZWQgc2luY2UgdGhlIGFnZW5kYSBpcyBmdWxsIGF0IHRoYXQgYmxvY2suLFJldHJ5RmFpbGVkCAEQdGFza4ABeFRhc2tBZGRyZXNzPEJsb2NrTnVtYmVyRm9yPFQ+PgABCGlkhAFAT3B0aW9uPFRhc2tOYW1lPgAHCF0BVGhlIGdpdmVuIHRhc2sgd2FzIHVuYWJsZSB0byBiZSByZXRyaWVkIHNpbmNlIHRoZSBhZ2VuZGEgaXMgZnVsbCBhdCB0aGF0IGJsb2NrIG9yIHRoZXJlnHdhcyBub3QgZW5vdWdoIHdlaWdodCB0byByZXNjaGVkdWxlIGl0LlRQZXJtYW5lbnRseU92ZXJ3ZWlnaHQIARB0YXNrgAF4VGFza0FkZHJlc3M8QmxvY2tOdW1iZXJGb3I8VD4+AAEIaWSEAUBPcHRpb248VGFza05hbWU+AAgE8FRoZSBnaXZlbiB0YXNrIGNhbiBuZXZlciBiZSBleGVjdXRlZCBzaW5jZSBpdCBpcyBvdmVyd2VpZ2h0LgQwRXZlbnRzIHR5cGUugAAABAgQEACEBBhPcHRpb24EBFQBBAEIEE5vbmUAAAAQU29tZQQABAAAAQAAiAQYUmVzdWx0CARUAYwERQFoAQgIT2sEAIwAAAAADEVycgQAaAAAAQAAjAAABAAAkAw8cGFsbGV0X3ByZWltYWdlGHBhbGxldBRFdmVudAQEVAABDBROb3RlZAQBEGhhc2g0ARxUOjpIYXNoAAAEaEEgcHJlaW1hZ2UgaGFzIGJlZW4gbm90ZWQuJFJlcXVlc3RlZAQBEGhhc2g0ARxUOjpIYXNoAAEEeEEgcHJlaW1hZ2UgaGFzIGJlZW4gcmVxdWVzdGVkLhxDbGVhcmVkBAEQaGFzaDQBHFQ6Okhhc2gAAgRsQSBwcmVpbWFnZSBoYXMgYmVuIGNsZWFyZWQuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0lAw4cGFsbGV0X2luZGljZXMYcGFsbGV0FEV2ZW50BARUAAEMNEluZGV4QXNzaWduZWQIAQx3aG8AATBUOjpBY2NvdW50SWQAARRpbmRleBABPFQ6OkFjY291bnRJbmRleAAABHRBIGFjY291bnQgaW5kZXggd2FzIGFzc2lnbmVkLihJbmRleEZyZWVkBAEUaW5kZXgQATxUOjpBY2NvdW50SW5kZXgAAQS8QSBhY2NvdW50IGluZGV4IGhhcyBiZWVuIGZyZWVkIHVwICh1bmFzc2lnbmVkKS4sSW5kZXhGcm96ZW4IARRpbmRleBABPFQ6OkFjY291bnRJbmRleAABDHdobwABMFQ6OkFjY291bnRJZAACBOhBIGFjY291bnQgaW5kZXggaGFzIGJlZW4gZnJvemVuIHRvIGl0cyBjdXJyZW50IGFjY291bnQgSUQuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0mAw8cGFsbGV0X2JhbGFuY2VzGHBhbGxldBRFdmVudAgEVAAESQABWBxFbmRvd2VkCAEcYWNjb3VudAABMFQ6OkFjY291bnRJZAABMGZyZWVfYmFsYW5jZRgBKFQ6OkJhbGFuY2UAAAS4QW4gYWNjb3VudCB3YXMgY3JlYXRlZCB3aXRoIHNvbWUgZnJlZSBiYWxhbmNlLiBEdXN0TG9zdAgBHGFjY291bnQAATBUOjpBY2NvdW50SWQAARhhbW91bnQYAShUOjpCYWxhbmNlAAEIPQFBbiBhY2NvdW50IHdhcyByZW1vdmVkIHdob3NlIGJhbGFuY2Ugd2FzIG5vbi16ZXJvIGJ1dCBiZWxvdyBFeGlzdGVudGlhbERlcG9zaXQseHJlc3VsdGluZyBpbiBhbiBvdXRyaWdodCBsb3NzLiBUcmFuc2ZlcgwBEGZyb20AATBUOjpBY2NvdW50SWQAAQh0bwABMFQ6OkFjY291bnRJZAABGGFtb3VudBgBKFQ6OkJhbGFuY2UAAgRMVHJhbnNmZXIgc3VjY2VlZGVkLihCYWxhbmNlU2V0CAEMd2hvAAEwVDo6QWNjb3VudElkAAEQZnJlZRgBKFQ6OkJhbGFuY2UAAwRoQSBiYWxhbmNlIHdhcyBzZXQgYnkgcm9vdC4gUmVzZXJ2ZWQIAQx3aG8AATBUOjpBY2NvdW50SWQAARhhbW91bnQYAShUOjpCYWxhbmNlAAQE4FNvbWUgYmFsYW5jZSB3YXMgcmVzZXJ2ZWQgKG1vdmVkIGZyb20gZnJlZSB0byByZXNlcnZlZCkuKFVucmVzZXJ2ZWQIAQx3aG8AATBUOjpBY2NvdW50SWQAARhhbW91bnQYAShUOjpCYWxhbmNlAAUE6FNvbWUgYmFsYW5jZSB3YXMgdW5yZXNlcnZlZCAobW92ZWQgZnJvbSByZXNlcnZlZCB0byBmcmVlKS5IUmVzZXJ2ZVJlcGF0cmlhdGVkEAEQZnJvbQABMFQ6OkFjY291bnRJZAABCHRvAAEwVDo6QWNjb3VudElkAAEYYW1vdW50GAEoVDo6QmFsYW5jZQABSGRlc3RpbmF0aW9uX3N0YXR1c5wBGFN0YXR1cwAGCE0BU29tZSBiYWxhbmNlIHdhcyBtb3ZlZCBmcm9tIHRoZSByZXNlcnZlIG9mIHRoZSBmaXJzdCBhY2NvdW50IHRvIHRoZSBzZWNvbmQgYWNjb3VudC7YRmluYWwgYXJndW1lbnQgaW5kaWNhdGVzIHRoZSBkZXN0aW5hdGlvbiBiYWxhbmNlIHR5cGUuHERlcG9zaXQIAQx3aG8AATBUOjpBY2NvdW50SWQAARhhbW91bnQYAShUOjpCYWxhbmNlAAcE2FNvbWUgYW1vdW50IHdhcyBkZXBvc2l0ZWQgKGUuZy4gZm9yIHRyYW5zYWN0aW9uIGZlZXMpLiBXaXRoZHJhdwgBDHdobwABMFQ6OkFjY291bnRJZAABGGFtb3VudBgBKFQ6OkJhbGFuY2UACAQdAVNvbWUgYW1vdW50IHdhcyB3aXRoZHJhd24gZnJvbSB0aGUgYWNjb3VudCAoZS5nLiBmb3IgdHJhbnNhY3Rpb24gZmVlcykuHFNsYXNoZWQIAQx3aG8AATBUOjpBY2NvdW50SWQAARhhbW91bnQYAShUOjpCYWxhbmNlAAkEAQFTb21lIGFtb3VudCB3YXMgcmVtb3ZlZCBmcm9tIHRoZSBhY2NvdW50IChlLmcuIGZvciBtaXNiZWhhdmlvcikuGE1pbnRlZAgBDHdobwABMFQ6OkFjY291bnRJZAABGGFtb3VudBgBKFQ6OkJhbGFuY2UACgScU29tZSBhbW91bnQgd2FzIG1pbnRlZCBpbnRvIGFuIGFjY291bnQuGEJ1cm5lZAgBDHdobwABMFQ6OkFjY291bnRJZAABGGFtb3VudBgBKFQ6OkJhbGFuY2UACwScU29tZSBhbW91bnQgd2FzIGJ1cm5lZCBmcm9tIGFuIGFjY291bnQuJFN1c3BlbmRlZAgBDHdobwABMFQ6OkFjY291bnRJZAABGGFtb3VudBgBKFQ6OkJhbGFuY2UADAQVAVNvbWUgYW1vdW50IHdhcyBzdXNwZW5kZWQgZnJvbSBhbiBhY2NvdW50IChpdCBjYW4gYmUgcmVzdG9yZWQgbGF0ZXIpLiBSZXN0b3JlZAgBDHdobwABMFQ6OkFjY291bnRJZAABGGFtb3VudBgBKFQ6OkJhbGFuY2UADQSkU29tZSBhbW91bnQgd2FzIHJlc3RvcmVkIGludG8gYW4gYWNjb3VudC4gVXBncmFkZWQEAQx3aG8AATBUOjpBY2NvdW50SWQADgRgQW4gYWNjb3VudCB3YXMgdXBncmFkZWQuGElzc3VlZAQBGGFtb3VudBgBKFQ6OkJhbGFuY2UADwQtAVRvdGFsIGlzc3VhbmNlIHdhcyBpbmNyZWFzZWQgYnkgYGFtb3VudGAsIGNyZWF0aW5nIGEgY3JlZGl0IHRvIGJlIGJhbGFuY2VkLiRSZXNjaW5kZWQEARhhbW91bnQYAShUOjpCYWxhbmNlABAEJQFUb3RhbCBpc3N1YW5jZSB3YXMgZGVjcmVhc2VkIGJ5IGBhbW91bnRgLCBjcmVhdGluZyBhIGRlYnQgdG8gYmUgYmFsYW5jZWQuGExvY2tlZAgBDHdobwABMFQ6OkFjY291bnRJZAABGGFtb3VudBgBKFQ6OkJhbGFuY2UAEQRgU29tZSBiYWxhbmNlIHdhcyBsb2NrZWQuIFVubG9ja2VkCAEMd2hvAAEwVDo6QWNjb3VudElkAAEYYW1vdW50GAEoVDo6QmFsYW5jZQASBGhTb21lIGJhbGFuY2Ugd2FzIHVubG9ja2VkLhhGcm96ZW4IAQx3aG8AATBUOjpBY2NvdW50SWQAARhhbW91bnQYAShUOjpCYWxhbmNlABMEYFNvbWUgYmFsYW5jZSB3YXMgZnJvemVuLhhUaGF3ZWQIAQx3aG8AATBUOjpBY2NvdW50SWQAARhhbW91bnQYAShUOjpCYWxhbmNlABQEYFNvbWUgYmFsYW5jZSB3YXMgdGhhd2VkLkxUb3RhbElzc3VhbmNlRm9yY2VkCAEMb2xkGAEoVDo6QmFsYW5jZQABDG5ldxgBKFQ6OkJhbGFuY2UAFQSsVGhlIGBUb3RhbElzc3VhbmNlYCB3YXMgZm9yY2VmdWxseSBjaGFuZ2VkLgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldJwUNGZyYW1lX3N1cHBvcnQYdHJhaXRzGHRva2VucxBtaXNjNEJhbGFuY2VTdGF0dXMAAQgQRnJlZQAAACBSZXNlcnZlZAABAACgDGhwYWxsZXRfdHJhbnNhY3Rpb25fcGF5bWVudBhwYWxsZXQURXZlbnQEBFQAAQRIVHJhbnNhY3Rpb25GZWVQYWlkDAEMd2hvAAEwVDo6QWNjb3VudElkAAEoYWN0dWFsX2ZlZRgBMEJhbGFuY2VPZjxUPgABDHRpcBgBMEJhbGFuY2VPZjxUPgAACFkBQSB0cmFuc2FjdGlvbiBmZWUgYGFjdHVhbF9mZWVgLCBvZiB3aGljaCBgdGlwYCB3YXMgYWRkZWQgdG8gdGhlIG1pbmltdW0gaW5jbHVzaW9uIGZlZSxcaGFzIGJlZW4gcGFpZCBieSBgd2hvYC4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXSkEDhwYWxsZXRfc3Rha2luZxhwYWxsZXQYcGFsbGV0FEV2ZW50BARUAAFIHEVyYVBhaWQMASRlcmFfaW5kZXgQASBFcmFJbmRleAABQHZhbGlkYXRvcl9wYXlvdXQYATBCYWxhbmNlT2Y8VD4AASRyZW1haW5kZXIYATBCYWxhbmNlT2Y8VD4AAAhVAVRoZSBlcmEgcGF5b3V0IGhhcyBiZWVuIHNldDsgdGhlIGZpcnN0IGJhbGFuY2UgaXMgdGhlIHZhbGlkYXRvci1wYXlvdXQ7IHRoZSBzZWNvbmQgaXPAdGhlIHJlbWFpbmRlciBmcm9tIHRoZSBtYXhpbXVtIGFtb3VudCBvZiByZXdhcmQuIFJld2FyZGVkDAEUc3Rhc2gAATBUOjpBY2NvdW50SWQAARBkZXN0qAF8UmV3YXJkRGVzdGluYXRpb248VDo6QWNjb3VudElkPgABGGFtb3VudBgBMEJhbGFuY2VPZjxUPgABBA0BVGhlIG5vbWluYXRvciBoYXMgYmVlbiByZXdhcmRlZCBieSB0aGlzIGFtb3VudCB0byB0aGlzIGRlc3RpbmF0aW9uLhxTbGFzaGVkCAEYc3Rha2VyAAEwVDo6QWNjb3VudElkAAEYYW1vdW50GAEwQmFsYW5jZU9mPFQ+AAIEHQFBIHN0YWtlciAodmFsaWRhdG9yIG9yIG5vbWluYXRvcikgaGFzIGJlZW4gc2xhc2hlZCBieSB0aGUgZ2l2ZW4gYW1vdW50LjRTbGFzaFJlcG9ydGVkDAEkdmFsaWRhdG9yAAEwVDo6QWNjb3VudElkAAEgZnJhY3Rpb26sARxQZXJiaWxsAAEkc2xhc2hfZXJhEAEgRXJhSW5kZXgAAwhZAUEgc2xhc2ggZm9yIHRoZSBnaXZlbiB2YWxpZGF0b3IsIGZvciB0aGUgZ2l2ZW4gcGVyY2VudGFnZSBvZiB0aGVpciBzdGFrZSwgYXQgdGhlIGdpdmVuVGVyYSBhcyBiZWVuIHJlcG9ydGVkLmhPbGRTbGFzaGluZ1JlcG9ydERpc2NhcmRlZAQBNHNlc3Npb25faW5kZXgQATBTZXNzaW9uSW5kZXgABAgZAUFuIG9sZCBzbGFzaGluZyByZXBvcnQgZnJvbSBhIHByaW9yIGVyYSB3YXMgZGlzY2FyZGVkIGJlY2F1c2UgaXQgY291bGREbm90IGJlIHByb2Nlc3NlZC44U3Rha2Vyc0VsZWN0ZWQABQSEQSBuZXcgc2V0IG9mIHN0YWtlcnMgd2FzIGVsZWN0ZWQuGEJvbmRlZAgBFHN0YXNoAAEwVDo6QWNjb3VudElkAAEYYW1vdW50GAEwQmFsYW5jZU9mPFQ+AAYQ0EFuIGFjY291bnQgaGFzIGJvbmRlZCB0aGlzIGFtb3VudC4gXFtzdGFzaCwgYW1vdW50XF0ATQFOT1RFOiBUaGlzIGV2ZW50IGlzIG9ubHkgZW1pdHRlZCB3aGVuIGZ1bmRzIGFyZSBib25kZWQgdmlhIGEgZGlzcGF0Y2hhYmxlLiBOb3RhYmx5LCEBaXQgd2lsbCBub3QgYmUgZW1pdHRlZCBmb3Igc3Rha2luZyByZXdhcmRzIHdoZW4gdGhleSBhcmUgYWRkZWQgdG8gc3Rha2UuIFVuYm9uZGVkCAEUc3Rhc2gAATBUOjpBY2NvdW50SWQAARhhbW91bnQYATBCYWxhbmNlT2Y8VD4ABwSQQW4gYWNjb3VudCBoYXMgdW5ib25kZWQgdGhpcyBhbW91bnQuJFdpdGhkcmF3bggBFHN0YXNoAAEwVDo6QWNjb3VudElkAAEYYW1vdW50GAEwQmFsYW5jZU9mPFQ+AAgIWQFBbiBhY2NvdW50IGhhcyBjYWxsZWQgYHdpdGhkcmF3X3VuYm9uZGVkYCBhbmQgcmVtb3ZlZCB1bmJvbmRpbmcgY2h1bmtzIHdvcnRoIGBCYWxhbmNlYGRmcm9tIHRoZSB1bmxvY2tpbmcgcXVldWUuGEtpY2tlZAgBJG5vbWluYXRvcgABMFQ6OkFjY291bnRJZAABFHN0YXNoAAEwVDo6QWNjb3VudElkAAkEtEEgbm9taW5hdG9yIGhhcyBiZWVuIGtpY2tlZCBmcm9tIGEgdmFsaWRhdG9yLlRTdGFraW5nRWxlY3Rpb25GYWlsZWQACgSsVGhlIGVsZWN0aW9uIGZhaWxlZC4gTm8gbmV3IGVyYSBpcyBwbGFubmVkLhxDaGlsbGVkBAEUc3Rhc2gAATBUOjpBY2NvdW50SWQACwQhAUFuIGFjY291bnQgaGFzIHN0b3BwZWQgcGFydGljaXBhdGluZyBhcyBlaXRoZXIgYSB2YWxpZGF0b3Igb3Igbm9taW5hdG9yLjRQYXlvdXRTdGFydGVkCAEkZXJhX2luZGV4EAEgRXJhSW5kZXgAATx2YWxpZGF0b3Jfc3Rhc2gAATBUOjpBY2NvdW50SWQADASYVGhlIHN0YWtlcnMnIHJld2FyZHMgYXJlIGdldHRpbmcgcGFpZC5EVmFsaWRhdG9yUHJlZnNTZXQIARRzdGFzaAABMFQ6OkFjY291bnRJZAABFHByZWZzsAE4VmFsaWRhdG9yUHJlZnMADQSYQSB2YWxpZGF0b3IgaGFzIHNldCB0aGVpciBwcmVmZXJlbmNlcy5oU25hcHNob3RWb3RlcnNTaXplRXhjZWVkZWQEARBzaXplEAEMdTMyAA4EaFZvdGVycyBzaXplIGxpbWl0IHJlYWNoZWQubFNuYXBzaG90VGFyZ2V0c1NpemVFeGNlZWRlZAQBEHNpemUQAQx1MzIADwRsVGFyZ2V0cyBzaXplIGxpbWl0IHJlYWNoZWQuIEZvcmNlRXJhBAEQbW9kZbgBHEZvcmNpbmcAEAR0QSBuZXcgZm9yY2UgZXJhIG1vZGUgd2FzIHNldC5kQ29udHJvbGxlckJhdGNoRGVwcmVjYXRlZAQBIGZhaWx1cmVzEAEMdTMyABEEpFJlcG9ydCBvZiBhIGNvbnRyb2xsZXIgYmF0Y2ggZGVwcmVjYXRpb24uBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0qAg4cGFsbGV0X3N0YWtpbmdEUmV3YXJkRGVzdGluYXRpb24EJEFjY291bnRJZAEAARQYU3Rha2VkAAAAFFN0YXNoAAEAKENvbnRyb2xsZXIAAgAcQWNjb3VudAQAAAEkQWNjb3VudElkAAMAEE5vbmUABAAArAw0c3BfYXJpdGhtZXRpYyhwZXJfdGhpbmdzHFBlcmJpbGwAAAQAEAEMdTMyAACwCDhwYWxsZXRfc3Rha2luZzhWYWxpZGF0b3JQcmVmcwAACAEoY29tbWlzc2lvbrQBHFBlcmJpbGwAARxibG9ja2VkIAEQYm9vbAAAtAAABqwAuAg4cGFsbGV0X3N0YWtpbmccRm9yY2luZwABEChOb3RGb3JjaW5nAAAAIEZvcmNlTmV3AAEAJEZvcmNlTm9uZQACACxGb3JjZUFsd2F5cwADAAC8DDxwYWxsZXRfb2ZmZW5jZXMYcGFsbGV0FEV2ZW50AAEEHE9mZmVuY2UIARBraW5kwAEQS2luZAABIHRpbWVzbG90OAE4T3BhcXVlVGltZVNsb3QAAAxRAVRoZXJlIGlzIGFuIG9mZmVuY2UgcmVwb3J0ZWQgb2YgdGhlIGdpdmVuIGBraW5kYCBoYXBwZW5lZCBhdCB0aGUgYHNlc3Npb25faW5kZXhgIGFuZDUBKGtpbmQtc3BlY2lmaWMpIHRpbWUgc2xvdC4gVGhpcyBldmVudCBpcyBub3QgZGVwb3NpdGVkIGZvciBkdXBsaWNhdGUgc2xhc2hlcy5MXFtraW5kLCB0aW1lc2xvdFxdLgQwRXZlbnRzIHR5cGUuwAAAAxAAAAAIAMQMOHBhbGxldF9zZXNzaW9uGHBhbGxldBRFdmVudAABBChOZXdTZXNzaW9uBAE0c2Vzc2lvbl9pbmRleBABMFNlc3Npb25JbmRleAAACDkBTmV3IHNlc3Npb24gaGFzIGhhcHBlbmVkLiBOb3RlIHRoYXQgdGhlIGFyZ3VtZW50IGlzIHRoZSBzZXNzaW9uIGluZGV4LCBub3QgdGhlnGJsb2NrIG51bWJlciBhcyB0aGUgdHlwZSBtaWdodCBzdWdnZXN0LgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldMgMOHBhbGxldF9ncmFuZHBhGHBhbGxldBRFdmVudAABDDhOZXdBdXRob3JpdGllcwQBNGF1dGhvcml0eV9zZXTMATRBdXRob3JpdHlMaXN0AAAEjE5ldyBhdXRob3JpdHkgc2V0IGhhcyBiZWVuIGFwcGxpZWQuGFBhdXNlZAABBJhDdXJyZW50IGF1dGhvcml0eSBzZXQgaGFzIGJlZW4gcGF1c2VkLhxSZXN1bWVkAAIEnEN1cnJlbnQgYXV0aG9yaXR5IHNldCBoYXMgYmVlbiByZXN1bWVkLgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldMwAAALQANAAAAQI1DAA1AxQc3BfY29uc2Vuc3VzX2dyYW5kcGEMYXBwGFB1YmxpYwAABAAEATxlZDI1NTE5OjpQdWJsaWMAANgMPHBhbGxldF90cmVhc3VyeRhwYWxsZXQURXZlbnQIBFQABEkAATAgU3BlbmRpbmcEAUBidWRnZXRfcmVtYWluaW5nGAE8QmFsYW5jZU9mPFQsIEk+AAAE5FdlIGhhdmUgZW5kZWQgYSBzcGVuZCBwZXJpb2QgYW5kIHdpbGwgbm93IGFsbG9jYXRlIGZ1bmRzLhxBd2FyZGVkDAE4cHJvcG9zYWxfaW5kZXgQATRQcm9wb3NhbEluZGV4AAEUYXdhcmQYATxCYWxhbmNlT2Y8VCwgST4AARxhY2NvdW50AAEwVDo6QWNjb3VudElkAAEEfFNvbWUgZnVuZHMgaGF2ZSBiZWVuIGFsbG9jYXRlZC4UQnVybnQEASxidXJudF9mdW5kcxgBPEJhbGFuY2VPZjxULCBJPgACBIhTb21lIG9mIG91ciBmdW5kcyBoYXZlIGJlZW4gYnVybnQuIFJvbGxvdmVyBAFAcm9sbG92ZXJfYmFsYW5jZRgBPEJhbGFuY2VPZjxULCBJPgADBC0BU3BlbmRpbmcgaGFzIGZpbmlzaGVkOyB0aGlzIGlzIHRoZSBhbW91bnQgdGhhdCByb2xscyBvdmVyIHVudGlsIG5leHQgc3BlbmQuHERlcG9zaXQEARR2YWx1ZRgBPEJhbGFuY2VPZjxULCBJPgAEBHxTb21lIGZ1bmRzIGhhdmUgYmVlbiBkZXBvc2l0ZWQuNFNwZW5kQXBwcm92ZWQMAThwcm9wb3NhbF9pbmRleBABNFByb3Bvc2FsSW5kZXgAARhhbW91bnQYATxCYWxhbmNlT2Y8VCwgST4AASxiZW5lZmljaWFyeQABMFQ6OkFjY291bnRJZAAFBJxBIG5ldyBzcGVuZCBwcm9wb3NhbCBoYXMgYmVlbiBhcHByb3ZlZC48VXBkYXRlZEluYWN0aXZlCAEscmVhY3RpdmF0ZWQYATxCYWxhbmNlT2Y8VCwgST4AASxkZWFjdGl2YXRlZBgBPEJhbGFuY2VPZjxULCBJPgAGBMxUaGUgaW5hY3RpdmUgZnVuZHMgb2YgdGhlIHBhbGxldCBoYXZlIGJlZW4gdXBkYXRlZC5IQXNzZXRTcGVuZEFwcHJvdmVkGAEUaW5kZXgQAShTcGVuZEluZGV4AAEoYXNzZXRfa2luZNwBMFQ6OkFzc2V0S2luZAABGGFtb3VudBgBUEFzc2V0QmFsYW5jZU9mPFQsIEk+AAEsYmVuZWZpY2lhcnlFAQE4VDo6QmVuZWZpY2lhcnkAASh2YWxpZF9mcm9tEAFEQmxvY2tOdW1iZXJGb3I8VD4AASRleHBpcmVfYXQQAURCbG9ja051bWJlckZvcjxUPgAHBLRBIG5ldyBhc3NldCBzcGVuZCBwcm9wb3NhbCBoYXMgYmVlbiBhcHByb3ZlZC5AQXNzZXRTcGVuZFZvaWRlZAQBFGluZGV4EAEoU3BlbmRJbmRleAAIBHRBbiBhcHByb3ZlZCBzcGVuZCB3YXMgdm9pZGVkLhBQYWlkCAEUaW5kZXgQAShTcGVuZEluZGV4AAEocGF5bWVudF9pZDABZDxUOjpQYXltYXN0ZXIgYXMgUGF5Pjo6SWQACQRMQSBwYXltZW50IGhhcHBlbmVkLjRQYXltZW50RmFpbGVkCAEUaW5kZXgQAShTcGVuZEluZGV4AAEocGF5bWVudF9pZDABZDxUOjpQYXltYXN0ZXIgYXMgUGF5Pjo6SWQACgSQQSBwYXltZW50IGZhaWxlZCBhbmQgY2FuIGJlIHJldHJpZWQuOFNwZW5kUHJvY2Vzc2VkBAEUaW5kZXgQAShTcGVuZEluZGV4AAsITQFBIHNwZW5kIHdhcyBwcm9jZXNzZWQgYW5kIHJlbW92ZWQgZnJvbSB0aGUgc3RvcmFnZS4gSXQgbWlnaHQgaGF2ZSBiZWVuIHN1Y2Nlc3NmdWxseXBwYWlkIG9yIGl0IG1heSBoYXZlIGV4cGlyZWQuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV03AxccG9sa2Fkb3RfcnVudGltZV9jb21tb24UaW1wbHNcVmVyc2lvbmVkTG9jYXRhYmxlQXNzZXQAAQgIVjMIASBsb2NhdGlvbuABRHhjbTo6djM6OkxvY2F0aW9uAAEgYXNzZXRfaWQJAQFAeGNtOjp2Mzo6QXNzZXRJZAADAAhWNAgBIGxvY2F0aW9uDQEBRHhjbTo6djQ6OkxvY2F0aW9uAAEgYXNzZXRfaWRBAQFAeGNtOjp2NDo6QXNzZXRJZAAEAADgECxzdGFnaW5nX3hjbQh2MzRtdWx0aWxvY2F0aW9uNE11bHRpTG9jYXRpb24AAAgBHHBhcmVudHMIAQh1OAABIGludGVyaW9y5AEkSnVuY3Rpb25zAADkEAx4Y20IdjMkanVuY3Rpb25zJEp1bmN0aW9ucwABJBBIZXJlAAAACFgxBADoASBKdW5jdGlvbgABAAhYMggA6AEgSnVuY3Rpb24AAOgBIEp1bmN0aW9uAAIACFgzDADoASBKdW5jdGlvbgAA6AEgSnVuY3Rpb24AAOgBIEp1bmN0aW9uAAMACFg0EADoASBKdW5jdGlvbgAA6AEgSnVuY3Rpb24AAOgBIEp1bmN0aW9uAADoASBKdW5jdGlvbgAEAAhYNRQA6AEgSnVuY3Rpb24AAOgBIEp1bmN0aW9uAADoASBKdW5jdGlvbgAA6AEgSnVuY3Rpb24AAOgBIEp1bmN0aW9uAAUACFg2GADoASBKdW5jdGlvbgAA6AEgSnVuY3Rpb24AAOgBIEp1bmN0aW9uAADoASBKdW5jdGlvbgAA6AEgSnVuY3Rpb24AAOgBIEp1bmN0aW9uAAYACFg3HADoASBKdW5jdGlvbgAA6AEgSnVuY3Rpb24AAOgBIEp1bmN0aW9uAADoASBKdW5jdGlvbgAA6AEgSnVuY3Rpb24AAOgBIEp1bmN0aW9uAADoASBKdW5jdGlvbgAHAAhYOCAA6AEgSnVuY3Rpb24AAOgBIEp1bmN0aW9uAADoASBKdW5jdGlvbgAA6AEgSnVuY3Rpb24AAOgBIEp1bmN0aW9uAADoASBKdW5jdGlvbgAA6AEgSnVuY3Rpb24AAOgBIEp1bmN0aW9uAAgAAOgQDHhjbQh2MyBqdW5jdGlvbiBKdW5jdGlvbgABKCRQYXJhY2hhaW4EAOwBDHUzMgAAACxBY2NvdW50SWQzMggBHG5ldHdvcmvwAURPcHRpb248TmV0d29ya0lkPgABCGlkBAEgW3U4OyAzMl0AAQA4QWNjb3VudEluZGV4NjQIARxuZXR3b3Jr8AFET3B0aW9uPE5ldHdvcmtJZD4AARRpbmRleCwBDHU2NAACADBBY2NvdW50S2V5MjAIARxuZXR3b3Jr8AFET3B0aW9uPE5ldHdvcmtJZD4AAQxrZXn4ASBbdTg7IDIwXQADADhQYWxsZXRJbnN0YW5jZQQACAEIdTgABAAwR2VuZXJhbEluZGV4BAD8ARB1MTI4AAUAKEdlbmVyYWxLZXkIARhsZW5ndGgIAQh1OAABEGRhdGEEASBbdTg7IDMyXQAGACRPbmx5Q2hpbGQABwAkUGx1cmFsaXR5CAEIaWQBAQEYQm9keUlkAAEQcGFydAUBASBCb2R5UGFydAAIADxHbG9iYWxDb25zZW5zdXMEAPQBJE5ldHdvcmtJZAAJAADsAAAGEADwBBhPcHRpb24EBFQB9AEIEE5vbmUAAAAQU29tZQQA9AAAAQAA9BAMeGNtCHYzIGp1bmN0aW9uJE5ldHdvcmtJZAABLCRCeUdlbmVzaXMEAAQBIFt1ODsgMzJdAAAAGEJ5Rm9yawgBMGJsb2NrX251bWJlcjABDHU2NAABKGJsb2NrX2hhc2gEASBbdTg7IDMyXQABACBQb2xrYWRvdAACABhLdXNhbWEAAwAcV2VzdGVuZAAEABhSb2NvY28ABQAYV29jb2NvAAYAIEV0aGVyZXVtBAEgY2hhaW5faWQsAQx1NjQABwAsQml0Y29pbkNvcmUACAAsQml0Y29pbkNhc2gACQBAUG9sa2Fkb3RCdWxsZXRpbgAKAAD4AAADFAAAAAgA/AAABhgAAQEQDHhjbQh2MyBqdW5jdGlvbhhCb2R5SWQAASgQVW5pdAAAABxNb25pa2VyBABIARxbdTg7IDRdAAEAFEluZGV4BADsAQx1MzIAAgAkRXhlY3V0aXZlAAMAJFRlY2huaWNhbAAEACxMZWdpc2xhdGl2ZQAFACBKdWRpY2lhbAAGABxEZWZlbnNlAAcAOEFkbWluaXN0cmF0aW9uAAgAIFRyZWFzdXJ5AAkAAAUBEAx4Y20IdjMganVuY3Rpb24gQm9keVBhcnQAARQUVm9pY2UAAAAcTWVtYmVycwQBFGNvdW507AEMdTMyAAEAIEZyYWN0aW9uCAEMbm9t7AEMdTMyAAEUZGVub23sAQx1MzIAAgBEQXRMZWFzdFByb3BvcnRpb24IAQxub23sAQx1MzIAARRkZW5vbewBDHUzMgADAEhNb3JlVGhhblByb3BvcnRpb24IAQxub23sAQx1MzIAARRkZW5vbewBDHUzMgAEAAAJARAMeGNtCHYzKG11bHRpYXNzZXQcQXNzZXRJZAABCCBDb25jcmV0ZQQA4AE0TXVsdGlMb2NhdGlvbgAAACBBYnN0cmFjdAQABAEgW3U4OyAzMl0AAQAADQEQLHN0YWdpbmdfeGNtCHY0IGxvY2F0aW9uIExvY2F0aW9uAAAIARxwYXJlbnRzCAEIdTgAASBpbnRlcmlvchEBASRKdW5jdGlvbnMAABEBECxzdGFnaW5nX3hjbQh2NCRqdW5jdGlvbnMkSnVuY3Rpb25zAAEkEEhlcmUAAAAIWDEEABUBAUhBcmM8W0p1bmN0aW9uOyAxXT4AAQAIWDIEACUBAUhBcmM8W0p1bmN0aW9uOyAyXT4AAgAIWDMEACkBAUhBcmM8W0p1bmN0aW9uOyAzXT4AAwAIWDQEAC0BAUhBcmM8W0p1bmN0aW9uOyA0XT4ABAAIWDUEADEBAUhBcmM8W0p1bmN0aW9uOyA1XT4ABQAIWDYEADUBAUhBcmM8W0p1bmN0aW9uOyA2XT4ABgAIWDcEADkBAUhBcmM8W0p1bmN0aW9uOyA3XT4ABwAIWDgEAD0BAUhBcmM8W0p1bmN0aW9uOyA4XT4ACAAAFQEAAAMBAAAAGQEAGQEQLHN0YWdpbmdfeGNtCHY0IGp1bmN0aW9uIEp1bmN0aW9uAAEoJFBhcmFjaGFpbgQA7AEMdTMyAAAALEFjY291bnRJZDMyCAEcbmV0d29yax0BAURPcHRpb248TmV0d29ya0lkPgABCGlkBAEgW3U4OyAzMl0AAQA4QWNjb3VudEluZGV4NjQIARxuZXR3b3JrHQEBRE9wdGlvbjxOZXR3b3JrSWQ+AAEUaW5kZXgsAQx1NjQAAgAwQWNjb3VudEtleTIwCAEcbmV0d29yax0BAURPcHRpb248TmV0d29ya0lkPgABDGtlefgBIFt1ODsgMjBdAAMAOFBhbGxldEluc3RhbmNlBAAIAQh1OAAEADBHZW5lcmFsSW5kZXgEAPwBEHUxMjgABQAoR2VuZXJhbEtleQgBGGxlbmd0aAgBCHU4AAEQZGF0YQQBIFt1ODsgMzJdAAYAJE9ubHlDaGlsZAAHACRQbHVyYWxpdHkIAQhpZAEBARhCb2R5SWQAARBwYXJ0BQEBIEJvZHlQYXJ0AAgAPEdsb2JhbENvbnNlbnN1cwQAIQEBJE5ldHdvcmtJZAAJAAAdAQQYT3B0aW9uBARUASEBAQgQTm9uZQAAABBTb21lBAAhAQAAAQAAIQEQLHN0YWdpbmdfeGNtCHY0IGp1bmN0aW9uJE5ldHdvcmtJZAABLCRCeUdlbmVzaXMEAAQBIFt1ODsgMzJdAAAAGEJ5Rm9yawgBMGJsb2NrX251bWJlcjABDHU2NAABKGJsb2NrX2hhc2gEASBbdTg7IDMyXQABACBQb2xrYWRvdAACABhLdXNhbWEAAwAcV2VzdGVuZAAEABhSb2NvY28ABQAYV29jb2NvAAYAIEV0aGVyZXVtBAEgY2hhaW5faWQsAQx1NjQABwAsQml0Y29pbkNvcmUACAAsQml0Y29pbkNhc2gACQBAUG9sa2Fkb3RCdWxsZXRpbgAKAAAlAQAAAwIAAAAZAQApAQAAAwMAAAAZAQAtAQAAAwQAAAAZAQAxAQAAAwUAAAAZAQA1AQAAAwYAAAAZAQA5AQAAAwcAAAAZAQA9AQAAAwgAAAAZAQBBARAsc3RhZ2luZ194Y20IdjQUYXNzZXQcQXNzZXRJZAAABAANAQEgTG9jYXRpb24AAEUBCAx4Y21EVmVyc2lvbmVkTG9jYXRpb24AAQwIVjIEAEkBAUR2Mjo6TXVsdGlMb2NhdGlvbgABAAhWMwQA4AFEdjM6Ok11bHRpTG9jYXRpb24AAwAIVjQEAA0BATB2NDo6TG9jYXRpb24ABAAASQEQDHhjbQh2MjRtdWx0aWxvY2F0aW9uNE11bHRpTG9jYXRpb24AAAgBHHBhcmVudHMIAQh1OAABIGludGVyaW9yTQEBJEp1bmN0aW9ucwAATQEQDHhjbQh2MjRtdWx0aWxvY2F0aW9uJEp1bmN0aW9ucwABJBBIZXJlAAAACFgxBABRAQEgSnVuY3Rpb24AAQAIWDIIAFEBASBKdW5jdGlvbgAAUQEBIEp1bmN0aW9uAAIACFgzDABRAQEgSnVuY3Rpb24AAFEBASBKdW5jdGlvbgAAUQEBIEp1bmN0aW9uAAMACFg0EABRAQEgSnVuY3Rpb24AAFEBASBKdW5jdGlvbgAAUQEBIEp1bmN0aW9uAABRAQEgSnVuY3Rpb24ABAAIWDUUAFEBASBKdW5jdGlvbgAAUQEBIEp1bmN0aW9uAABRAQEgSnVuY3Rpb24AAFEBASBKdW5jdGlvbgAAUQEBIEp1bmN0aW9uAAUACFg2GABRAQEgSnVuY3Rpb24AAFEBASBKdW5jdGlvbgAAUQEBIEp1bmN0aW9uAABRAQEgSnVuY3Rpb24AAFEBASBKdW5jdGlvbgAAUQEBIEp1bmN0aW9uAAYACFg3HABRAQEgSnVuY3Rpb24AAFEBASBKdW5jdGlvbgAAUQEBIEp1bmN0aW9uAABRAQEgSnVuY3Rpb24AAFEBASBKdW5jdGlvbgAAUQEBIEp1bmN0aW9uAABRAQEgSnVuY3Rpb24ABwAIWDggAFEBASBKdW5jdGlvbgAAUQEBIEp1bmN0aW9uAABRAQEgSnVuY3Rpb24AAFEBASBKdW5jdGlvbgAAUQEBIEp1bmN0aW9uAABRAQEgSnVuY3Rpb24AAFEBASBKdW5jdGlvbgAAUQEBIEp1bmN0aW9uAAgAAFEBEAx4Y20IdjIganVuY3Rpb24gSnVuY3Rpb24AASQkUGFyYWNoYWluBADsAQx1MzIAAAAsQWNjb3VudElkMzIIARxuZXR3b3JrVQEBJE5ldHdvcmtJZAABCGlkBAEgW3U4OyAzMl0AAQA4QWNjb3VudEluZGV4NjQIARxuZXR3b3JrVQEBJE5ldHdvcmtJZAABFGluZGV4LAEMdTY0AAIAMEFjY291bnRLZXkyMAgBHG5ldHdvcmtVAQEkTmV0d29ya0lkAAEMa2V5+AEgW3U4OyAyMF0AAwA4UGFsbGV0SW5zdGFuY2UEAAgBCHU4AAQAMEdlbmVyYWxJbmRleAQA/AEQdTEyOAAFAChHZW5lcmFsS2V5BABZAQGAV2Vha0JvdW5kZWRWZWM8dTgsIENvbnN0VTMyPDMyPj4ABgAkT25seUNoaWxkAAcAJFBsdXJhbGl0eQgBCGlkXQEBGEJvZHlJZAABEHBhcnRhAQEgQm9keVBhcnQACAAAVQEMDHhjbQh2MiROZXR3b3JrSWQAARAMQW55AAAAFE5hbWVkBABZAQGAV2Vha0JvdW5kZWRWZWM8dTgsIENvbnN0VTMyPDMyPj4AAQAgUG9sa2Fkb3QAAgAYS3VzYW1hAAMAAFkBDExib3VuZGVkX2NvbGxlY3Rpb25zQHdlYWtfYm91bmRlZF92ZWM4V2Vha0JvdW5kZWRWZWMIBFQBCARTAAAEADgBGFZlYzxUPgAAXQEMDHhjbQh2MhhCb2R5SWQAASgQVW5pdAAAABROYW1lZAQAWQEBgFdlYWtCb3VuZGVkVmVjPHU4LCBDb25zdFUzMjwzMj4+AAEAFEluZGV4BADsAQx1MzIAAgAkRXhlY3V0aXZlAAMAJFRlY2huaWNhbAAEACxMZWdpc2xhdGl2ZQAFACBKdWRpY2lhbAAGABxEZWZlbnNlAAcAOEFkbWluaXN0cmF0aW9uAAgAIFRyZWFzdXJ5AAkAAGEBDAx4Y20IdjIgQm9keVBhcnQAARQUVm9pY2UAAAAcTWVtYmVycwQBFGNvdW507AEMdTMyAAEAIEZyYWN0aW9uCAEMbm9t7AEMdTMyAAEUZGVub23sAQx1MzIAAgBEQXRMZWFzdFByb3BvcnRpb24IAQxub23sAQx1MzIAARRkZW5vbewBDHUzMgADAEhNb3JlVGhhblByb3BvcnRpb24IAQxub23sAQx1MzIAARRkZW5vbewBDHUzMgAEAABlAQxgcGFsbGV0X2NvbnZpY3Rpb25fdm90aW5nGHBhbGxldBRFdmVudAgEVAAESQABCCREZWxlZ2F0ZWQIAAABMFQ6OkFjY291bnRJZAAAAAEwVDo6QWNjb3VudElkAAAEHQFBbiBhY2NvdW50IGhhcyBkZWxlZ2F0ZWQgdGhlaXIgdm90ZSB0byBhbm90aGVyIGFjY291bnQuIFxbd2hvLCB0YXJnZXRcXSxVbmRlbGVnYXRlZAQAAAEwVDo6QWNjb3VudElkAAEE9EFuIFxbYWNjb3VudFxdIGhhcyBjYW5jZWxsZWQgYSBwcmV2aW91cyBkZWxlZ2F0aW9uIG9wZXJhdGlvbi4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXRpAQxAcGFsbGV0X3JlZmVyZW5kYRhwYWxsZXQURXZlbnQIBFQABEkAAUAkU3VibWl0dGVkDAEUaW5kZXgQATxSZWZlcmVuZHVtSW5kZXgEYEluZGV4IG9mIHRoZSByZWZlcmVuZHVtLgEUdHJhY2ttAQE8VHJhY2tJZE9mPFQsIEk+BCUBVGhlIHRyYWNrIChhbmQgYnkgZXh0ZW5zaW9uIHByb3Bvc2FsIGRpc3BhdGNoIG9yaWdpbikgb2YgdGhpcyByZWZlcmVuZHVtLgEgcHJvcG9zYWxxAQFMQm91bmRlZENhbGxPZjxULCBJPgSAVGhlIHByb3Bvc2FsIGZvciB0aGUgcmVmZXJlbmR1bS4ABIBBIHJlZmVyZW5kdW0gaGFzIGJlZW4gc3VibWl0dGVkLlREZWNpc2lvbkRlcG9zaXRQbGFjZWQMARRpbmRleBABPFJlZmVyZW5kdW1JbmRleARgSW5kZXggb2YgdGhlIHJlZmVyZW5kdW0uAQx3aG8AATBUOjpBY2NvdW50SWQEjFRoZSBhY2NvdW50IHdobyBwbGFjZWQgdGhlIGRlcG9zaXQuARhhbW91bnQYATxCYWxhbmNlT2Y8VCwgST4EhFRoZSBhbW91bnQgcGxhY2VkIGJ5IHRoZSBhY2NvdW50LgEElFRoZSBkZWNpc2lvbiBkZXBvc2l0IGhhcyBiZWVuIHBsYWNlZC5cRGVjaXNpb25EZXBvc2l0UmVmdW5kZWQMARRpbmRleBABPFJlZmVyZW5kdW1JbmRleARgSW5kZXggb2YgdGhlIHJlZmVyZW5kdW0uAQx3aG8AATBUOjpBY2NvdW50SWQEjFRoZSBhY2NvdW50IHdobyBwbGFjZWQgdGhlIGRlcG9zaXQuARhhbW91bnQYATxCYWxhbmNlT2Y8VCwgST4EhFRoZSBhbW91bnQgcGxhY2VkIGJ5IHRoZSBhY2NvdW50LgIEnFRoZSBkZWNpc2lvbiBkZXBvc2l0IGhhcyBiZWVuIHJlZnVuZGVkLjhEZXBvc2l0U2xhc2hlZAgBDHdobwABMFQ6OkFjY291bnRJZASMVGhlIGFjY291bnQgd2hvIHBsYWNlZCB0aGUgZGVwb3NpdC4BGGFtb3VudBgBPEJhbGFuY2VPZjxULCBJPgSEVGhlIGFtb3VudCBwbGFjZWQgYnkgdGhlIGFjY291bnQuAwRsQSBkZXBvc2l0IGhhcyBiZWVuIHNsYXNoZWQuPERlY2lzaW9uU3RhcnRlZBABFGluZGV4EAE8UmVmZXJlbmR1bUluZGV4BGBJbmRleCBvZiB0aGUgcmVmZXJlbmR1bS4BFHRyYWNrbQEBPFRyYWNrSWRPZjxULCBJPgQlAVRoZSB0cmFjayAoYW5kIGJ5IGV4dGVuc2lvbiBwcm9wb3NhbCBkaXNwYXRjaCBvcmlnaW4pIG9mIHRoaXMgcmVmZXJlbmR1bS4BIHByb3Bvc2FscQEBTEJvdW5kZWRDYWxsT2Y8VCwgST4EgFRoZSBwcm9wb3NhbCBmb3IgdGhlIHJlZmVyZW5kdW0uARR0YWxseQ0HASBUOjpUYWxseQS4VGhlIGN1cnJlbnQgdGFsbHkgb2Ygdm90ZXMgaW4gdGhpcyByZWZlcmVuZHVtLgQEvEEgcmVmZXJlbmR1bSBoYXMgbW92ZWQgaW50byB0aGUgZGVjaWRpbmcgcGhhc2UuOENvbmZpcm1TdGFydGVkBAEUaW5kZXgQATxSZWZlcmVuZHVtSW5kZXgEYEluZGV4IG9mIHRoZSByZWZlcmVuZHVtLgUAOENvbmZpcm1BYm9ydGVkBAEUaW5kZXgQATxSZWZlcmVuZHVtSW5kZXgEYEluZGV4IG9mIHRoZSByZWZlcmVuZHVtLgYAJENvbmZpcm1lZAgBFGluZGV4EAE8UmVmZXJlbmR1bUluZGV4BGBJbmRleCBvZiB0aGUgcmVmZXJlbmR1bS4BFHRhbGx5DQcBIFQ6OlRhbGx5BLBUaGUgZmluYWwgdGFsbHkgb2Ygdm90ZXMgaW4gdGhpcyByZWZlcmVuZHVtLgcEIQFBIHJlZmVyZW5kdW0gaGFzIGVuZGVkIGl0cyBjb25maXJtYXRpb24gcGhhc2UgYW5kIGlzIHJlYWR5IGZvciBhcHByb3ZhbC4gQXBwcm92ZWQEARRpbmRleBABPFJlZmVyZW5kdW1JbmRleARgSW5kZXggb2YgdGhlIHJlZmVyZW5kdW0uCAQNAUEgcmVmZXJlbmR1bSBoYXMgYmVlbiBhcHByb3ZlZCBhbmQgaXRzIHByb3Bvc2FsIGhhcyBiZWVuIHNjaGVkdWxlZC4gUmVqZWN0ZWQIARRpbmRleBABPFJlZmVyZW5kdW1JbmRleARgSW5kZXggb2YgdGhlIHJlZmVyZW5kdW0uARR0YWxseQ0HASBUOjpUYWxseQSwVGhlIGZpbmFsIHRhbGx5IG9mIHZvdGVzIGluIHRoaXMgcmVmZXJlbmR1bS4JBKxBIHByb3Bvc2FsIGhhcyBiZWVuIHJlamVjdGVkIGJ5IHJlZmVyZW5kdW0uIFRpbWVkT3V0CAEUaW5kZXgQATxSZWZlcmVuZHVtSW5kZXgEYEluZGV4IG9mIHRoZSByZWZlcmVuZHVtLgEUdGFsbHkNBwEgVDo6VGFsbHkEsFRoZSBmaW5hbCB0YWxseSBvZiB2b3RlcyBpbiB0aGlzIHJlZmVyZW5kdW0uCgTYQSByZWZlcmVuZHVtIGhhcyBiZWVuIHRpbWVkIG91dCB3aXRob3V0IGJlaW5nIGRlY2lkZWQuJENhbmNlbGxlZAgBFGluZGV4EAE8UmVmZXJlbmR1bUluZGV4BGBJbmRleCBvZiB0aGUgcmVmZXJlbmR1bS4BFHRhbGx5DQcBIFQ6OlRhbGx5BLBUaGUgZmluYWwgdGFsbHkgb2Ygdm90ZXMgaW4gdGhpcyByZWZlcmVuZHVtLgsEgEEgcmVmZXJlbmR1bSBoYXMgYmVlbiBjYW5jZWxsZWQuGEtpbGxlZAgBFGluZGV4EAE8UmVmZXJlbmR1bUluZGV4BGBJbmRleCBvZiB0aGUgcmVmZXJlbmR1bS4BFHRhbGx5DQcBIFQ6OlRhbGx5BLBUaGUgZmluYWwgdGFsbHkgb2Ygdm90ZXMgaW4gdGhpcyByZWZlcmVuZHVtLgwEdEEgcmVmZXJlbmR1bSBoYXMgYmVlbiBraWxsZWQuZFN1Ym1pc3Npb25EZXBvc2l0UmVmdW5kZWQMARRpbmRleBABPFJlZmVyZW5kdW1JbmRleARgSW5kZXggb2YgdGhlIHJlZmVyZW5kdW0uAQx3aG8AATBUOjpBY2NvdW50SWQEjFRoZSBhY2NvdW50IHdobyBwbGFjZWQgdGhlIGRlcG9zaXQuARhhbW91bnQYATxCYWxhbmNlT2Y8VCwgST4EhFRoZSBhbW91bnQgcGxhY2VkIGJ5IHRoZSBhY2NvdW50Lg0EpFRoZSBzdWJtaXNzaW9uIGRlcG9zaXQgaGFzIGJlZW4gcmVmdW5kZWQuLE1ldGFkYXRhU2V0CAEUaW5kZXgQATxSZWZlcmVuZHVtSW5kZXgEYEluZGV4IG9mIHRoZSByZWZlcmVuZHVtLgEQaGFzaDQBHFQ6Okhhc2gEOFByZWltYWdlIGhhc2guDgScTWV0YWRhdGEgZm9yIGEgcmVmZXJlbmR1bSBoYXMgYmVlbiBzZXQuPE1ldGFkYXRhQ2xlYXJlZAgBFGluZGV4EAE8UmVmZXJlbmR1bUluZGV4BGBJbmRleCBvZiB0aGUgcmVmZXJlbmR1bS4BEGhhc2g0ARxUOjpIYXNoBDhQcmVpbWFnZSBoYXNoLg8ErE1ldGFkYXRhIGZvciBhIHJlZmVyZW5kdW0gaGFzIGJlZW4gY2xlYXJlZC4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXRtAQAABQQAcQEQNGZyYW1lX3N1cHBvcnQYdHJhaXRzJHByZWltYWdlcxxCb3VuZGVkCARUAXUBBEgBBQcBDBhMZWdhY3kEARBoYXNoNAEkSDo6T3V0cHV0AAAAGElubGluZQQACQcBNEJvdW5kZWRJbmxpbmUAAQAYTG9va3VwCAEQaGFzaDQBJEg6Ok91dHB1dAABDGxlbhABDHUzMgACAAB1AQg0cGFzZW9fcnVudGltZSxSdW50aW1lQ2FsbAABwBhTeXN0ZW0EAHkBAa0Bc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPFN5c3RlbSwgUnVudGltZT4AAAAkU2NoZWR1bGVyBACJAQG5AXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxTY2hlZHVsZXIsIFJ1bnRpbWU+AAEAIFByZWltYWdlBACRAQG1AXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxQcmVpbWFnZSwgUnVudGltZT4ACgAQQmFiZQQAmQEBpQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8QmFiZSwgUnVudGltZT4AAgAkVGltZXN0YW1wBAC9AQG5AXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxUaW1lc3RhbXAsIFJ1bnRpbWU+AAMAHEluZGljZXMEAMEBAbEBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPEluZGljZXMsIFJ1bnRpbWU+AAQAIEJhbGFuY2VzBADNAQG1AXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxCYWxhbmNlcywgUnVudGltZT4ABQAcU3Rha2luZwQA2QEBsQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8U3Rha2luZywgUnVudGltZT4ABwAcU2Vzc2lvbgQAFQIBsQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8U2Vzc2lvbiwgUnVudGltZT4ACQAcR3JhbmRwYQQAMQIBsQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8R3JhbmRwYSwgUnVudGltZT4ACwAgVHJlYXN1cnkEAF0CAbUBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPFRyZWFzdXJ5LCBSdW50aW1lPgATAEBDb252aWN0aW9uVm90aW5nBABlAgHVAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxDb252aWN0aW9uVm90aW5nLCBSdW50aW1lPgAUACRSZWZlcmVuZGEEAHkCAbkBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPFJlZmVyZW5kYSwgUnVudGltZT4AFQAkV2hpdGVsaXN0BAChAgG5AXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxXaGl0ZWxpc3QsIFJ1bnRpbWU+ABcAKFBhcmFtZXRlcnMEAKUCAb0Bc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPFBhcmFtZXRlcnMsIFJ1bnRpbWU+ABsAGENsYWltcwQA0QIBrQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8Q2xhaW1zLCBSdW50aW1lPgAYABxWZXN0aW5nBADxAgGxAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxWZXN0aW5nLCBSdW50aW1lPgAZABxVdGlsaXR5BAD5AgGxAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxVdGlsaXR5LCBSdW50aW1lPgAaABRQcm94eQQAAQMBqQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8UHJveHksIFJ1bnRpbWU+AB0AIE11bHRpc2lnBAANAwG1AXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxNdWx0aXNpZywgUnVudGltZT4AHgAgQm91bnRpZXMEABkDAbUBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPEJvdW50aWVzLCBSdW50aW1lPgAiADRDaGlsZEJvdW50aWVzBAAdAwHJAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxDaGlsZEJvdW50aWVzLCBSdW50aW1lPgAmAGhFbGVjdGlvblByb3ZpZGVyTXVsdGlQaGFzZQQAIQMB/QFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8RWxlY3Rpb25Qcm92aWRlck11bHRpUGhhc2UsIFJ1bnRpbWU+ACQAJFZvdGVyTGlzdAQAFQQBuQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8Vm90ZXJMaXN0LCBSdW50aW1lPgAlADxOb21pbmF0aW9uUG9vbHMEABkEAdEBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPE5vbWluYXRpb25Qb29scywgUnVudGltZT4AJwAsRmFzdFVuc3Rha2UEAE0EAcEBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPEZhc3RVbnN0YWtlLCBSdW50aW1lPgAoADRDb25maWd1cmF0aW9uBABRBAHJAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxDb25maWd1cmF0aW9uLCBSdW50aW1lPgAzACxQYXJhc1NoYXJlZAQAdQQBwQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8UGFyYXNTaGFyZWQsIFJ1bnRpbWU+ADQANFBhcmFJbmNsdXNpb24EAHkEAckBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPFBhcmFJbmNsdXNpb24sIFJ1bnRpbWU+ADUAMFBhcmFJbmhlcmVudAQAfQQBxQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8UGFyYUluaGVyZW50LCBSdW50aW1lPgA2ABRQYXJhcwQACQUBqQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8UGFyYXMsIFJ1bnRpbWU+ADgALEluaXRpYWxpemVyBAARBQHBAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxJbml0aWFsaXplciwgUnVudGltZT4AOQAQSHJtcAQAFQUBpQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8SHJtcCwgUnVudGltZT4APAA0UGFyYXNEaXNwdXRlcwQAHQUByQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8UGFyYXNEaXNwdXRlcywgUnVudGltZT4APgA0UGFyYXNTbGFzaGluZwQAIQUByQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8UGFyYXNTbGFzaGluZywgUnVudGltZT4APwAgT25EZW1hbmQEADEFAbUBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPE9uRGVtYW5kLCBSdW50aW1lPgBAACRSZWdpc3RyYXIEADUFAbkBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPFJlZ2lzdHJhciwgUnVudGltZT4ARgAUU2xvdHMEADkFAakBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPFNsb3RzLCBSdW50aW1lPgBHACBBdWN0aW9ucwQAPQUBtQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8QXVjdGlvbnMsIFJ1bnRpbWU+AEgAJENyb3dkbG9hbgQARQUBuQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8Q3Jvd2Rsb2FuLCBSdW50aW1lPgBJACBDb3JldGltZQQAWQUBtQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8Q29yZXRpbWUsIFJ1bnRpbWU+AEoASFN0YXRlVHJpZU1pZ3JhdGlvbgQAbQUB3QFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8U3RhdGVUcmllTWlncmF0aW9uLCBSdW50aW1lPgBiACRYY21QYWxsZXQEAIUFAbkBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPFhjbVBhbGxldCwgUnVudGltZT4AYwAwTWVzc2FnZVF1ZXVlBADBBgHFAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxNZXNzYWdlUXVldWUsIFJ1bnRpbWU+AGQAJEFzc2V0UmF0ZQQAzQYBuQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8QXNzZXRSYXRlLCBSdW50aW1lPgBlABRCZWVmeQQA1QYBqQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8QmVlZnksIFJ1bnRpbWU+AMgAPFBhcmFTdWRvV3JhcHBlcgQA+QYB0QFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8UGFyYVN1ZG9XcmFwcGVyLCBSdW50aW1lPgD6ABBTdWRvBAABBwGlAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxTdWRvLCBSdW50aW1lPgD/AAB5AQwwZnJhbWVfc3lzdGVtGHBhbGxldBBDYWxsBARUAAEsGHJlbWFyawQBGHJlbWFyazgBHFZlYzx1OD4AAAxoTWFrZSBzb21lIG9uLWNoYWluIHJlbWFyay4AiENhbiBiZSBleGVjdXRlZCBieSBldmVyeSBgb3JpZ2luYC44c2V0X2hlYXBfcGFnZXMEARRwYWdlczABDHU2NAABBPhTZXQgdGhlIG51bWJlciBvZiBwYWdlcyBpbiB0aGUgV2ViQXNzZW1ibHkgZW52aXJvbm1lbnQncyBoZWFwLiBzZXRfY29kZQQBEGNvZGU4ARxWZWM8dTg+AAIEZFNldCB0aGUgbmV3IHJ1bnRpbWUgY29kZS5cc2V0X2NvZGVfd2l0aG91dF9jaGVja3MEARBjb2RlOAEcVmVjPHU4PgADEBkBU2V0IHRoZSBuZXcgcnVudGltZSBjb2RlIHdpdGhvdXQgZG9pbmcgYW55IGNoZWNrcyBvZiB0aGUgZ2l2ZW4gYGNvZGVgLgBRAU5vdGUgdGhhdCBydW50aW1lIHVwZ3JhZGVzIHdpbGwgbm90IHJ1biBpZiB0aGlzIGlzIGNhbGxlZCB3aXRoIGEgbm90LWluY3JlYXNpbmcgc3BlYyB2ZXJzaW9uISxzZXRfc3RvcmFnZQQBFGl0ZW1zfQEBNFZlYzxLZXlWYWx1ZT4ABARoU2V0IHNvbWUgaXRlbXMgb2Ygc3RvcmFnZS4wa2lsbF9zdG9yYWdlBAEQa2V5c4UBASBWZWM8S2V5PgAFBHRLaWxsIHNvbWUgaXRlbXMgZnJvbSBzdG9yYWdlLixraWxsX3ByZWZpeAgBGHByZWZpeDgBDEtleQABHHN1YmtleXMQAQx1MzIABhARAUtpbGwgYWxsIHN0b3JhZ2UgaXRlbXMgd2l0aCBhIGtleSB0aGF0IHN0YXJ0cyB3aXRoIHRoZSBnaXZlbiBwcmVmaXguADkBKipOT1RFOioqIFdlIHJlbHkgb24gdGhlIFJvb3Qgb3JpZ2luIHRvIHByb3ZpZGUgdXMgdGhlIG51bWJlciBvZiBzdWJrZXlzIHVuZGVyPQF0aGUgcHJlZml4IHdlIGFyZSByZW1vdmluZyB0byBhY2N1cmF0ZWx5IGNhbGN1bGF0ZSB0aGUgd2VpZ2h0IG9mIHRoaXMgZnVuY3Rpb24uRHJlbWFya193aXRoX2V2ZW50BAEYcmVtYXJrOAEcVmVjPHU4PgAHBKRNYWtlIHNvbWUgb24tY2hhaW4gcmVtYXJrIGFuZCBlbWl0IGV2ZW50LkRhdXRob3JpemVfdXBncmFkZQQBJGNvZGVfaGFzaDQBHFQ6Okhhc2gACRBhAUF1dGhvcml6ZSBhbiB1cGdyYWRlIHRvIGEgZ2l2ZW4gYGNvZGVfaGFzaGAgZm9yIHRoZSBydW50aW1lLiBUaGUgcnVudGltZSBjYW4gYmUgc3VwcGxpZWQYbGF0ZXIuAHxUaGlzIGNhbGwgcmVxdWlyZXMgUm9vdCBvcmlnaW4ugGF1dGhvcml6ZV91cGdyYWRlX3dpdGhvdXRfY2hlY2tzBAEkY29kZV9oYXNoNAEcVDo6SGFzaAAKIGEBQXV0aG9yaXplIGFuIHVwZ3JhZGUgdG8gYSBnaXZlbiBgY29kZV9oYXNoYCBmb3IgdGhlIHJ1bnRpbWUuIFRoZSBydW50aW1lIGNhbiBiZSBzdXBwbGllZBhsYXRlci4AXQFXQVJOSU5HOiBUaGlzIGF1dGhvcml6ZXMgYW4gdXBncmFkZSB0aGF0IHdpbGwgdGFrZSBwbGFjZSB3aXRob3V0IGFueSBzYWZldHkgY2hlY2tzLCBmb3JZAWV4YW1wbGUgdGhhdCB0aGUgc3BlYyBuYW1lIHJlbWFpbnMgdGhlIHNhbWUgYW5kIHRoYXQgdGhlIHZlcnNpb24gbnVtYmVyIGluY3JlYXNlcy4gTm908HJlY29tbWVuZGVkIGZvciBub3JtYWwgdXNlLiBVc2UgYGF1dGhvcml6ZV91cGdyYWRlYCBpbnN0ZWFkLgB8VGhpcyBjYWxsIHJlcXVpcmVzIFJvb3Qgb3JpZ2luLmBhcHBseV9hdXRob3JpemVkX3VwZ3JhZGUEARBjb2RlOAEcVmVjPHU4PgALJFUBUHJvdmlkZSB0aGUgcHJlaW1hZ2UgKHJ1bnRpbWUgYmluYXJ5KSBgY29kZWAgZm9yIGFuIHVwZ3JhZGUgdGhhdCBoYXMgYmVlbiBhdXRob3JpemVkLgBJAUlmIHRoZSBhdXRob3JpemF0aW9uIHJlcXVpcmVkIGEgdmVyc2lvbiBjaGVjaywgdGhpcyBjYWxsIHdpbGwgZW5zdXJlIHRoZSBzcGVjIG5hbWXocmVtYWlucyB1bmNoYW5nZWQgYW5kIHRoYXQgdGhlIHNwZWMgdmVyc2lvbiBoYXMgaW5jcmVhc2VkLgBZAURlcGVuZGluZyBvbiB0aGUgcnVudGltZSdzIGBPblNldENvZGVgIGNvbmZpZ3VyYXRpb24sIHRoaXMgZnVuY3Rpb24gbWF5IGRpcmVjdGx5IGFwcGx5EQF0aGUgbmV3IGBjb2RlYCBpbiB0aGUgc2FtZSBibG9jayBvciBhdHRlbXB0IHRvIHNjaGVkdWxlIHRoZSB1cGdyYWRlLgBgQWxsIG9yaWdpbnMgYXJlIGFsbG93ZWQuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLn0BAAACgQEAgQEAAAQIODgAhQEAAAI4AIkBDEBwYWxsZXRfc2NoZWR1bGVyGHBhbGxldBBDYWxsBARUAAEoIHNjaGVkdWxlEAEQd2hlbhABREJsb2NrTnVtYmVyRm9yPFQ+AAE4bWF5YmVfcGVyaW9kaWONAQGsT3B0aW9uPHNjaGVkdWxlOjpQZXJpb2Q8QmxvY2tOdW1iZXJGb3I8VD4+PgABIHByaW9yaXR5CAFIc2NoZWR1bGU6OlByaW9yaXR5AAEQY2FsbHUBAXxCb3g8PFQgYXMgQ29uZmlnPjo6UnVudGltZUNhbGw+AAAEcEFub255bW91c2x5IHNjaGVkdWxlIGEgdGFzay4YY2FuY2VsCAEQd2hlbhABREJsb2NrTnVtYmVyRm9yPFQ+AAEUaW5kZXgQAQx1MzIAAQSUQ2FuY2VsIGFuIGFub255bW91c2x5IHNjaGVkdWxlZCB0YXNrLjhzY2hlZHVsZV9uYW1lZBQBCGlkBAEgVGFza05hbWUAARB3aGVuEAFEQmxvY2tOdW1iZXJGb3I8VD4AAThtYXliZV9wZXJpb2RpY40BAaxPcHRpb248c2NoZWR1bGU6OlBlcmlvZDxCbG9ja051bWJlckZvcjxUPj4+AAEgcHJpb3JpdHkIAUhzY2hlZHVsZTo6UHJpb3JpdHkAARBjYWxsdQEBfEJveDw8VCBhcyBDb25maWc+OjpSdW50aW1lQ2FsbD4AAgRYU2NoZWR1bGUgYSBuYW1lZCB0YXNrLjBjYW5jZWxfbmFtZWQEAQhpZAQBIFRhc2tOYW1lAAMEeENhbmNlbCBhIG5hbWVkIHNjaGVkdWxlZCB0YXNrLjhzY2hlZHVsZV9hZnRlchABFGFmdGVyEAFEQmxvY2tOdW1iZXJGb3I8VD4AAThtYXliZV9wZXJpb2RpY40BAaxPcHRpb248c2NoZWR1bGU6OlBlcmlvZDxCbG9ja051bWJlckZvcjxUPj4+AAEgcHJpb3JpdHkIAUhzY2hlZHVsZTo6UHJpb3JpdHkAARBjYWxsdQEBfEJveDw8VCBhcyBDb25maWc+OjpSdW50aW1lQ2FsbD4ABASoQW5vbnltb3VzbHkgc2NoZWR1bGUgYSB0YXNrIGFmdGVyIGEgZGVsYXkuUHNjaGVkdWxlX25hbWVkX2FmdGVyFAEIaWQEASBUYXNrTmFtZQABFGFmdGVyEAFEQmxvY2tOdW1iZXJGb3I8VD4AAThtYXliZV9wZXJpb2RpY40BAaxPcHRpb248c2NoZWR1bGU6OlBlcmlvZDxCbG9ja051bWJlckZvcjxUPj4+AAEgcHJpb3JpdHkIAUhzY2hlZHVsZTo6UHJpb3JpdHkAARBjYWxsdQEBfEJveDw8VCBhcyBDb25maWc+OjpSdW50aW1lQ2FsbD4ABQSQU2NoZWR1bGUgYSBuYW1lZCB0YXNrIGFmdGVyIGEgZGVsYXkuJHNldF9yZXRyeQwBEHRhc2uAAXhUYXNrQWRkcmVzczxCbG9ja051bWJlckZvcjxUPj4AARxyZXRyaWVzCAEIdTgAARhwZXJpb2QQAURCbG9ja051bWJlckZvcjxUPgAGMFkBU2V0IGEgcmV0cnkgY29uZmlndXJhdGlvbiBmb3IgYSB0YXNrIHNvIHRoYXQsIGluIGNhc2UgaXRzIHNjaGVkdWxlZCBydW4gZmFpbHMsIGl0IHdpbGxVAWJlIHJldHJpZWQgYWZ0ZXIgYHBlcmlvZGAgYmxvY2tzLCBmb3IgYSB0b3RhbCBhbW91bnQgb2YgYHJldHJpZXNgIHJldHJpZXMgb3IgdW50aWwgaXQkc3VjY2VlZHMuAFUBVGFza3Mgd2hpY2ggbmVlZCB0byBiZSBzY2hlZHVsZWQgZm9yIGEgcmV0cnkgYXJlIHN0aWxsIHN1YmplY3QgdG8gd2VpZ2h0IG1ldGVyaW5nIGFuZFEBYWdlbmRhIHNwYWNlLCBzYW1lIGFzIGEgcmVndWxhciB0YXNrLiBJZiBhIHBlcmlvZGljIHRhc2sgZmFpbHMsIGl0IHdpbGwgYmUgc2NoZWR1bGVkkG5vcm1hbGx5IHdoaWxlIHRoZSB0YXNrIGlzIHJldHJ5aW5nLgBRAVRhc2tzIHNjaGVkdWxlZCBhcyBhIHJlc3VsdCBvZiBhIHJldHJ5IGZvciBhIHBlcmlvZGljIHRhc2sgYXJlIHVubmFtZWQsIG5vbi1wZXJpb2RpYz0BY2xvbmVzIG9mIHRoZSBvcmlnaW5hbCB0YXNrLiBUaGVpciByZXRyeSBjb25maWd1cmF0aW9uIHdpbGwgYmUgZGVyaXZlZCBmcm9tIHRoZU0Bb3JpZ2luYWwgdGFzaydzIGNvbmZpZ3VyYXRpb24sIGJ1dCB3aWxsIGhhdmUgYSBsb3dlciB2YWx1ZSBmb3IgYHJlbWFpbmluZ2AgdGhhbiB0aGVkb3JpZ2luYWwgYHRvdGFsX3JldHJpZXNgLjxzZXRfcmV0cnlfbmFtZWQMAQhpZAQBIFRhc2tOYW1lAAEccmV0cmllcwgBCHU4AAEYcGVyaW9kEAFEQmxvY2tOdW1iZXJGb3I8VD4ABzBdAVNldCBhIHJldHJ5IGNvbmZpZ3VyYXRpb24gZm9yIGEgbmFtZWQgdGFzayBzbyB0aGF0LCBpbiBjYXNlIGl0cyBzY2hlZHVsZWQgcnVuIGZhaWxzLCBpdF0Bd2lsbCBiZSByZXRyaWVkIGFmdGVyIGBwZXJpb2RgIGJsb2NrcywgZm9yIGEgdG90YWwgYW1vdW50IG9mIGByZXRyaWVzYCByZXRyaWVzIG9yIHVudGlsMGl0IHN1Y2NlZWRzLgBVAVRhc2tzIHdoaWNoIG5lZWQgdG8gYmUgc2NoZWR1bGVkIGZvciBhIHJldHJ5IGFyZSBzdGlsbCBzdWJqZWN0IHRvIHdlaWdodCBtZXRlcmluZyBhbmRRAWFnZW5kYSBzcGFjZSwgc2FtZSBhcyBhIHJlZ3VsYXIgdGFzay4gSWYgYSBwZXJpb2RpYyB0YXNrIGZhaWxzLCBpdCB3aWxsIGJlIHNjaGVkdWxlZJBub3JtYWxseSB3aGlsZSB0aGUgdGFzayBpcyByZXRyeWluZy4AUQFUYXNrcyBzY2hlZHVsZWQgYXMgYSByZXN1bHQgb2YgYSByZXRyeSBmb3IgYSBwZXJpb2RpYyB0YXNrIGFyZSB1bm5hbWVkLCBub24tcGVyaW9kaWM9AWNsb25lcyBvZiB0aGUgb3JpZ2luYWwgdGFzay4gVGhlaXIgcmV0cnkgY29uZmlndXJhdGlvbiB3aWxsIGJlIGRlcml2ZWQgZnJvbSB0aGVNAW9yaWdpbmFsIHRhc2sncyBjb25maWd1cmF0aW9uLCBidXQgd2lsbCBoYXZlIGEgbG93ZXIgdmFsdWUgZm9yIGByZW1haW5pbmdgIHRoYW4gdGhlZG9yaWdpbmFsIGB0b3RhbF9yZXRyaWVzYC4wY2FuY2VsX3JldHJ5BAEQdGFza4ABeFRhc2tBZGRyZXNzPEJsb2NrTnVtYmVyRm9yPFQ+PgAIBKhSZW1vdmVzIHRoZSByZXRyeSBjb25maWd1cmF0aW9uIG9mIGEgdGFzay5IY2FuY2VsX3JldHJ5X25hbWVkBAEIaWQEASBUYXNrTmFtZQAJBLxDYW5jZWwgdGhlIHJldHJ5IGNvbmZpZ3VyYXRpb24gb2YgYSBuYW1lZCB0YXNrLgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy6NAQQYT3B0aW9uBARUAYABCBBOb25lAAAAEFNvbWUEAIAAAAEAAJEBDDxwYWxsZXRfcHJlaW1hZ2UYcGFsbGV0EENhbGwEBFQAARQ0bm90ZV9wcmVpbWFnZQQBFGJ5dGVzOAEcVmVjPHU4PgAAEHRSZWdpc3RlciBhIHByZWltYWdlIG9uLWNoYWluLgBVAUlmIHRoZSBwcmVpbWFnZSB3YXMgcHJldmlvdXNseSByZXF1ZXN0ZWQsIG5vIGZlZXMgb3IgZGVwb3NpdHMgYXJlIHRha2VuIGZvciBwcm92aWRpbmdVAXRoZSBwcmVpbWFnZS4gT3RoZXJ3aXNlLCBhIGRlcG9zaXQgaXMgdGFrZW4gcHJvcG9ydGlvbmFsIHRvIHRoZSBzaXplIG9mIHRoZSBwcmVpbWFnZS48dW5ub3RlX3ByZWltYWdlBAEQaGFzaDQBHFQ6Okhhc2gAARjcQ2xlYXIgYW4gdW5yZXF1ZXN0ZWQgcHJlaW1hZ2UgZnJvbSB0aGUgcnVudGltZSBzdG9yYWdlLgD8SWYgYGxlbmAgaXMgcHJvdmlkZWQsIHRoZW4gaXQgd2lsbCBiZSBhIG11Y2ggY2hlYXBlciBvcGVyYXRpb24uAAEBLSBgaGFzaGA6IFRoZSBoYXNoIG9mIHRoZSBwcmVpbWFnZSB0byBiZSByZW1vdmVkIGZyb20gdGhlIHN0b3JlLrgtIGBsZW5gOiBUaGUgbGVuZ3RoIG9mIHRoZSBwcmVpbWFnZSBvZiBgaGFzaGAuQHJlcXVlc3RfcHJlaW1hZ2UEARBoYXNoNAEcVDo6SGFzaAACEEEBUmVxdWVzdCBhIHByZWltYWdlIGJlIHVwbG9hZGVkIHRvIHRoZSBjaGFpbiB3aXRob3V0IHBheWluZyBhbnkgZmVlcyBvciBkZXBvc2l0cy4AVQFJZiB0aGUgcHJlaW1hZ2UgcmVxdWVzdHMgaGFzIGFscmVhZHkgYmVlbiBwcm92aWRlZCBvbi1jaGFpbiwgd2UgdW5yZXNlcnZlIGFueSBkZXBvc2l0OQFhIHVzZXIgbWF5IGhhdmUgcGFpZCwgYW5kIHRha2UgdGhlIGNvbnRyb2wgb2YgdGhlIHByZWltYWdlIG91dCBvZiB0aGVpciBoYW5kcy5IdW5yZXF1ZXN0X3ByZWltYWdlBAEQaGFzaDQBHFQ6Okhhc2gAAwy8Q2xlYXIgYSBwcmV2aW91c2x5IG1hZGUgcmVxdWVzdCBmb3IgYSBwcmVpbWFnZS4ALQFOT1RFOiBUSElTIE1VU1QgTk9UIEJFIENBTExFRCBPTiBgaGFzaGAgTU9SRSBUSU1FUyBUSEFOIGByZXF1ZXN0X3ByZWltYWdlYC44ZW5zdXJlX3VwZGF0ZWQEARhoYXNoZXOVAQEwVmVjPFQ6Okhhc2g+AAQMxEVuc3VyZSB0aGF0IHRoZSBhIGJ1bGsgb2YgcHJlLWltYWdlcyBpcyB1cGdyYWRlZC4APQFUaGUgY2FsbGVyIHBheXMgbm8gZmVlIGlmIGF0IGxlYXN0IDkwJSBvZiBwcmUtaW1hZ2VzIHdlcmUgc3VjY2Vzc2Z1bGx5IHVwZGF0ZWQuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLpUBAAACNACZAQwscGFsbGV0X2JhYmUYcGFsbGV0EENhbGwEBFQAAQxMcmVwb3J0X2VxdWl2b2NhdGlvbggBSGVxdWl2b2NhdGlvbl9wcm9vZp0BAZBCb3g8RXF1aXZvY2F0aW9uUHJvb2Y8SGVhZGVyRm9yPFQ+Pj4AATxrZXlfb3duZXJfcHJvb2atAQFAVDo6S2V5T3duZXJQcm9vZgAAEAkBUmVwb3J0IGF1dGhvcml0eSBlcXVpdm9jYXRpb24vbWlzYmVoYXZpb3IuIFRoaXMgbWV0aG9kIHdpbGwgdmVyaWZ5BQF0aGUgZXF1aXZvY2F0aW9uIHByb29mIGFuZCB2YWxpZGF0ZSB0aGUgZ2l2ZW4ga2V5IG93bmVyc2hpcCBwcm9vZg0BYWdhaW5zdCB0aGUgZXh0cmFjdGVkIG9mZmVuZGVyLiBJZiBib3RoIGFyZSB2YWxpZCwgdGhlIG9mZmVuY2Ugd2lsbDBiZSByZXBvcnRlZC5wcmVwb3J0X2VxdWl2b2NhdGlvbl91bnNpZ25lZAgBSGVxdWl2b2NhdGlvbl9wcm9vZp0BAZBCb3g8RXF1aXZvY2F0aW9uUHJvb2Y8SGVhZGVyRm9yPFQ+Pj4AATxrZXlfb3duZXJfcHJvb2atAQFAVDo6S2V5T3duZXJQcm9vZgABIAkBUmVwb3J0IGF1dGhvcml0eSBlcXVpdm9jYXRpb24vbWlzYmVoYXZpb3IuIFRoaXMgbWV0aG9kIHdpbGwgdmVyaWZ5BQF0aGUgZXF1aXZvY2F0aW9uIHByb29mIGFuZCB2YWxpZGF0ZSB0aGUgZ2l2ZW4ga2V5IG93bmVyc2hpcCBwcm9vZg0BYWdhaW5zdCB0aGUgZXh0cmFjdGVkIG9mZmVuZGVyLiBJZiBib3RoIGFyZSB2YWxpZCwgdGhlIG9mZmVuY2Ugd2lsbDBiZSByZXBvcnRlZC4NAVRoaXMgZXh0cmluc2ljIG11c3QgYmUgY2FsbGVkIHVuc2lnbmVkIGFuZCBpdCBpcyBleHBlY3RlZCB0aGF0IG9ubHkVAWJsb2NrIGF1dGhvcnMgd2lsbCBjYWxsIGl0ICh2YWxpZGF0ZWQgaW4gYFZhbGlkYXRlVW5zaWduZWRgKSwgYXMgc3VjaBUBaWYgdGhlIGJsb2NrIGF1dGhvciBpcyBkZWZpbmVkIGl0IHdpbGwgYmUgZGVmaW5lZCBhcyB0aGUgZXF1aXZvY2F0aW9uJHJlcG9ydGVyLkhwbGFuX2NvbmZpZ19jaGFuZ2UEARhjb25maWexAQFQTmV4dENvbmZpZ0Rlc2NyaXB0b3IAAhBdAVBsYW4gYW4gZXBvY2ggY29uZmlnIGNoYW5nZS4gVGhlIGVwb2NoIGNvbmZpZyBjaGFuZ2UgaXMgcmVjb3JkZWQgYW5kIHdpbGwgYmUgZW5hY3RlZCBvblEBdGhlIG5leHQgY2FsbCB0byBgZW5hY3RfZXBvY2hfY2hhbmdlYC4gVGhlIGNvbmZpZyB3aWxsIGJlIGFjdGl2YXRlZCBvbmUgZXBvY2ggYWZ0ZXIuWQFNdWx0aXBsZSBjYWxscyB0byB0aGlzIG1ldGhvZCB3aWxsIHJlcGxhY2UgYW55IGV4aXN0aW5nIHBsYW5uZWQgY29uZmlnIGNoYW5nZSB0aGF0IGhhZFRub3QgYmVlbiBlbmFjdGVkIHlldC4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMunQEISHNwX2NvbnNlbnN1c19zbG90c0RFcXVpdm9jYXRpb25Qcm9vZggYSGVhZGVyAaEBCElkAaUBABABIG9mZmVuZGVypQEBCElkAAEQc2xvdKkBARBTbG90AAEwZmlyc3RfaGVhZGVyoQEBGEhlYWRlcgABNHNlY29uZF9oZWFkZXKhAQEYSGVhZGVyAAChARAoc3BfcnVudGltZRxnZW5lcmljGGhlYWRlchhIZWFkZXIIGE51bWJlcgEQEEhhc2gAABQBLHBhcmVudF9oYXNoNAEwSGFzaDo6T3V0cHV0AAEYbnVtYmVy7AEYTnVtYmVyAAEoc3RhdGVfcm9vdDQBMEhhc2g6Ok91dHB1dAABPGV4dHJpbnNpY3Nfcm9vdDQBMEhhc2g6Ok91dHB1dAABGGRpZ2VzdDwBGERpZ2VzdAAApQEMRHNwX2NvbnNlbnN1c19iYWJlDGFwcBhQdWJsaWMAAAQABAE8c3IyNTUxOTo6UHVibGljAACpAQhIc3BfY29uc2Vuc3VzX3Nsb3RzEFNsb3QAAAQAMAEMdTY0AACtAQgoc3Bfc2Vzc2lvbjxNZW1iZXJzaGlwUHJvb2YAAAwBHHNlc3Npb24QATBTZXNzaW9uSW5kZXgAASh0cmllX25vZGVzhQEBMFZlYzxWZWM8dTg+PgABPHZhbGlkYXRvcl9jb3VudBABOFZhbGlkYXRvckNvdW50AACxAQxEc3BfY29uc2Vuc3VzX2JhYmUcZGlnZXN0c1BOZXh0Q29uZmlnRGVzY3JpcHRvcgABBAhWMQgBBGO1AQEoKHU2NCwgdTY0KQABNGFsbG93ZWRfc2xvdHO5AQEwQWxsb3dlZFNsb3RzAAEAALUBAAAECDAwALkBCERzcF9jb25zZW5zdXNfYmFiZTBBbGxvd2VkU2xvdHMAAQwwUHJpbWFyeVNsb3RzAAAAdFByaW1hcnlBbmRTZWNvbmRhcnlQbGFpblNsb3RzAAEAbFByaW1hcnlBbmRTZWNvbmRhcnlWUkZTbG90cwACAAC9AQxAcGFsbGV0X3RpbWVzdGFtcBhwYWxsZXQQQ2FsbAQEVAABBAxzZXQEAQxub3csASRUOjpNb21lbnQAAExUU2V0IHRoZSBjdXJyZW50IHRpbWUuAFUBVGhpcyBjYWxsIHNob3VsZCBiZSBpbnZva2VkIGV4YWN0bHkgb25jZSBwZXIgYmxvY2suIEl0IHdpbGwgcGFuaWMgYXQgdGhlIGZpbmFsaXphdGlvbtRwaGFzZSwgaWYgdGhpcyBjYWxsIGhhc24ndCBiZWVuIGludm9rZWQgYnkgdGhhdCB0aW1lLgBBAVRoZSB0aW1lc3RhbXAgc2hvdWxkIGJlIGdyZWF0ZXIgdGhhbiB0aGUgcHJldmlvdXMgb25lIGJ5IHRoZSBhbW91bnQgc3BlY2lmaWVkIGJ5aFtgQ29uZmlnOjpNaW5pbXVtUGVyaW9kYF0uAMRUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfTm9uZV8uAFEBVGhpcyBkaXNwYXRjaCBjbGFzcyBpcyBfTWFuZGF0b3J5XyB0byBlbnN1cmUgaXQgZ2V0cyBleGVjdXRlZCBpbiB0aGUgYmxvY2suIEJlIGF3YXJlUQF0aGF0IGNoYW5naW5nIHRoZSBjb21wbGV4aXR5IG9mIHRoaXMgY2FsbCBjb3VsZCByZXN1bHQgZXhoYXVzdGluZyB0aGUgcmVzb3VyY2VzIGluIGGEYmxvY2sgdG8gZXhlY3V0ZSBhbnkgb3RoZXIgY2FsbHMuADQjIyBDb21wbGV4aXR5MQEtIGBPKDEpYCAoTm90ZSB0aGF0IGltcGxlbWVudGF0aW9ucyBvZiBgT25UaW1lc3RhbXBTZXRgIG11c3QgYWxzbyBiZSBgTygxKWApVQEtIDEgc3RvcmFnZSByZWFkIGFuZCAxIHN0b3JhZ2UgbXV0YXRpb24gKGNvZGVjIGBPKDEpYCBiZWNhdXNlIG9mIGBEaWRVcGRhdGU6OnRha2VgIGluQCAgYG9uX2ZpbmFsaXplYCnULSAxIGV2ZW50IGhhbmRsZXIgYG9uX3RpbWVzdGFtcF9zZXRgLiBNdXN0IGJlIGBPKDEpYC4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMuwQEMOHBhbGxldF9pbmRpY2VzGHBhbGxldBBDYWxsBARUAAEUFGNsYWltBAEUaW5kZXgQATxUOjpBY2NvdW50SW5kZXgAADCYQXNzaWduIGFuIHByZXZpb3VzbHkgdW5hc3NpZ25lZCBpbmRleC4A3FBheW1lbnQ6IGBEZXBvc2l0YCBpcyByZXNlcnZlZCBmcm9tIHRoZSBzZW5kZXIgYWNjb3VudC4AzFRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfLgDwLSBgaW5kZXhgOiB0aGUgaW5kZXggdG8gYmUgY2xhaW1lZC4gVGhpcyBtdXN0IG5vdCBiZSBpbiB1c2UuAJBFbWl0cyBgSW5kZXhBc3NpZ25lZGAgaWYgc3VjY2Vzc2Z1bC4ANCMjIENvbXBsZXhpdHkkLSBgTygxKWAuIHRyYW5zZmVyCAEMbmV3xQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEUaW5kZXgQATxUOjpBY2NvdW50SW5kZXgAATBdAUFzc2lnbiBhbiBpbmRleCBhbHJlYWR5IG93bmVkIGJ5IHRoZSBzZW5kZXIgdG8gYW5vdGhlciBhY2NvdW50LiBUaGUgYmFsYW5jZSByZXNlcnZhdGlvbrhpcyBlZmZlY3RpdmVseSB0cmFuc2ZlcnJlZCB0byB0aGUgbmV3IGFjY291bnQuAMxUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXy4AJQEtIGBpbmRleGA6IHRoZSBpbmRleCB0byBiZSByZS1hc3NpZ25lZC4gVGhpcyBtdXN0IGJlIG93bmVkIGJ5IHRoZSBzZW5kZXIuXQEtIGBuZXdgOiB0aGUgbmV3IG93bmVyIG9mIHRoZSBpbmRleC4gVGhpcyBmdW5jdGlvbiBpcyBhIG5vLW9wIGlmIGl0IGlzIGVxdWFsIHRvIHNlbmRlci4AkEVtaXRzIGBJbmRleEFzc2lnbmVkYCBpZiBzdWNjZXNzZnVsLgA0IyMgQ29tcGxleGl0eSQtIGBPKDEpYC4QZnJlZQQBFGluZGV4EAE8VDo6QWNjb3VudEluZGV4AAIwlEZyZWUgdXAgYW4gaW5kZXggb3duZWQgYnkgdGhlIHNlbmRlci4AXQFQYXltZW50OiBBbnkgcHJldmlvdXMgZGVwb3NpdCBwbGFjZWQgZm9yIHRoZSBpbmRleCBpcyB1bnJlc2VydmVkIGluIHRoZSBzZW5kZXIgYWNjb3VudC4AVQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXyBhbmQgdGhlIHNlbmRlciBtdXN0IG93biB0aGUgaW5kZXguAA0BLSBgaW5kZXhgOiB0aGUgaW5kZXggdG8gYmUgZnJlZWQuIFRoaXMgbXVzdCBiZSBvd25lZCBieSB0aGUgc2VuZGVyLgCERW1pdHMgYEluZGV4RnJlZWRgIGlmIHN1Y2Nlc3NmdWwuADQjIyBDb21wbGV4aXR5JC0gYE8oMSlgLjhmb3JjZV90cmFuc2ZlcgwBDG5ld8UBAVBBY2NvdW50SWRMb29rdXBPZjxUPgABFGluZGV4EAE8VDo6QWNjb3VudEluZGV4AAEYZnJlZXplIAEQYm9vbAADNFUBRm9yY2UgYW4gaW5kZXggdG8gYW4gYWNjb3VudC4gVGhpcyBkb2Vzbid0IHJlcXVpcmUgYSBkZXBvc2l0LiBJZiB0aGUgaW5kZXggaXMgYWxyZWFkeehoZWxkLCB0aGVuIGFueSBkZXBvc2l0IGlzIHJlaW1idXJzZWQgdG8gaXRzIGN1cnJlbnQgb3duZXIuAMRUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfUm9vdF8uAKQtIGBpbmRleGA6IHRoZSBpbmRleCB0byBiZSAocmUtKWFzc2lnbmVkLl0BLSBgbmV3YDogdGhlIG5ldyBvd25lciBvZiB0aGUgaW5kZXguIFRoaXMgZnVuY3Rpb24gaXMgYSBuby1vcCBpZiBpdCBpcyBlcXVhbCB0byBzZW5kZXIuQQEtIGBmcmVlemVgOiBpZiBzZXQgdG8gYHRydWVgLCB3aWxsIGZyZWV6ZSB0aGUgaW5kZXggc28gaXQgY2Fubm90IGJlIHRyYW5zZmVycmVkLgCQRW1pdHMgYEluZGV4QXNzaWduZWRgIGlmIHN1Y2Nlc3NmdWwuADQjIyBDb21wbGV4aXR5JC0gYE8oMSlgLhhmcmVlemUEARRpbmRleBABPFQ6OkFjY291bnRJbmRleAAEMEEBRnJlZXplIGFuIGluZGV4IHNvIGl0IHdpbGwgYWx3YXlzIHBvaW50IHRvIHRoZSBzZW5kZXIgYWNjb3VudC4gVGhpcyBjb25zdW1lcyB0aGUgZGVwb3NpdC4AWQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXyBhbmQgdGhlIHNpZ25pbmcgYWNjb3VudCBtdXN0IGhhdmUgYWxub24tZnJvemVuIGFjY291bnQgYGluZGV4YC4ArC0gYGluZGV4YDogdGhlIGluZGV4IHRvIGJlIGZyb3plbiBpbiBwbGFjZS4AiEVtaXRzIGBJbmRleEZyb3plbmAgaWYgc3VjY2Vzc2Z1bC4ANCMjIENvbXBsZXhpdHkkLSBgTygxKWAuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLsUBDChzcF9ydW50aW1lMG11bHRpYWRkcmVzczBNdWx0aUFkZHJlc3MIJEFjY291bnRJZAEAMEFjY291bnRJbmRleAGMARQISWQEAAABJEFjY291bnRJZAAAABRJbmRleAQAyQEBMEFjY291bnRJbmRleAABAAxSYXcEADgBHFZlYzx1OD4AAgAkQWRkcmVzczMyBAAEASBbdTg7IDMyXQADACRBZGRyZXNzMjAEAPgBIFt1ODsgMjBdAAQAAMkBAAAGjADNAQw8cGFsbGV0X2JhbGFuY2VzGHBhbGxldBBDYWxsCARUAARJAAEkUHRyYW5zZmVyX2FsbG93X2RlYXRoCAEQZGVzdMUBAVBBY2NvdW50SWRMb29rdXBPZjxUPgABFHZhbHVl/AEoVDo6QmFsYW5jZQAAHNRUcmFuc2ZlciBzb21lIGxpcXVpZCBmcmVlIGJhbGFuY2UgdG8gYW5vdGhlciBhY2NvdW50LgA1AWB0cmFuc2Zlcl9hbGxvd19kZWF0aGAgd2lsbCBzZXQgdGhlIGBGcmVlQmFsYW5jZWAgb2YgdGhlIHNlbmRlciBhbmQgcmVjZWl2ZXIuEQFJZiB0aGUgc2VuZGVyJ3MgYWNjb3VudCBpcyBiZWxvdyB0aGUgZXhpc3RlbnRpYWwgZGVwb3NpdCBhcyBhIHJlc3VsdLBvZiB0aGUgdHJhbnNmZXIsIHRoZSBhY2NvdW50IHdpbGwgYmUgcmVhcGVkLgAVAVRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIGBTaWduZWRgIGJ5IHRoZSB0cmFuc2FjdG9yLjhmb3JjZV90cmFuc2ZlcgwBGHNvdXJjZcUBAVBBY2NvdW50SWRMb29rdXBPZjxUPgABEGRlc3TFAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AARR2YWx1ZfwBKFQ6OkJhbGFuY2UAAghhAUV4YWN0bHkgYXMgYHRyYW5zZmVyX2FsbG93X2RlYXRoYCwgZXhjZXB0IHRoZSBvcmlnaW4gbXVzdCBiZSByb290IGFuZCB0aGUgc291cmNlIGFjY291bnREbWF5IGJlIHNwZWNpZmllZC5MdHJhbnNmZXJfa2VlcF9hbGl2ZQgBEGRlc3TFAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AARR2YWx1ZfwBKFQ6OkJhbGFuY2UAAxhZAVNhbWUgYXMgdGhlIFtgdHJhbnNmZXJfYWxsb3dfZGVhdGhgXSBjYWxsLCBidXQgd2l0aCBhIGNoZWNrIHRoYXQgdGhlIHRyYW5zZmVyIHdpbGwgbm90YGtpbGwgdGhlIG9yaWdpbiBhY2NvdW50LgDoOTklIG9mIHRoZSB0aW1lIHlvdSB3YW50IFtgdHJhbnNmZXJfYWxsb3dfZGVhdGhgXSBpbnN0ZWFkLgDwW2B0cmFuc2Zlcl9hbGxvd19kZWF0aGBdOiBzdHJ1Y3QuUGFsbGV0Lmh0bWwjbWV0aG9kLnRyYW5zZmVyMHRyYW5zZmVyX2FsbAgBEGRlc3TFAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AAShrZWVwX2FsaXZlIAEQYm9vbAAEPAUBVHJhbnNmZXIgdGhlIGVudGlyZSB0cmFuc2ZlcmFibGUgYmFsYW5jZSBmcm9tIHRoZSBjYWxsZXIgYWNjb3VudC4AWQFOT1RFOiBUaGlzIGZ1bmN0aW9uIG9ubHkgYXR0ZW1wdHMgdG8gdHJhbnNmZXIgX3RyYW5zZmVyYWJsZV8gYmFsYW5jZXMuIFRoaXMgbWVhbnMgdGhhdGEBYW55IGxvY2tlZCwgcmVzZXJ2ZWQsIG9yIGV4aXN0ZW50aWFsIGRlcG9zaXRzICh3aGVuIGBrZWVwX2FsaXZlYCBpcyBgdHJ1ZWApLCB3aWxsIG5vdCBiZV0BdHJhbnNmZXJyZWQgYnkgdGhpcyBmdW5jdGlvbi4gVG8gZW5zdXJlIHRoYXQgdGhpcyBmdW5jdGlvbiByZXN1bHRzIGluIGEga2lsbGVkIGFjY291bnQsRQF5b3UgbWlnaHQgbmVlZCB0byBwcmVwYXJlIHRoZSBhY2NvdW50IGJ5IHJlbW92aW5nIGFueSByZWZlcmVuY2UgY291bnRlcnMsIHN0b3JhZ2VAZGVwb3NpdHMsIGV0Yy4uLgDAVGhlIGRpc3BhdGNoIG9yaWdpbiBvZiB0aGlzIGNhbGwgbXVzdCBiZSBTaWduZWQuAKAtIGBkZXN0YDogVGhlIHJlY2lwaWVudCBvZiB0aGUgdHJhbnNmZXIuWQEtIGBrZWVwX2FsaXZlYDogQSBib29sZWFuIHRvIGRldGVybWluZSBpZiB0aGUgYHRyYW5zZmVyX2FsbGAgb3BlcmF0aW9uIHNob3VsZCBzZW5kIGFsbE0BICBvZiB0aGUgZnVuZHMgdGhlIGFjY291bnQgaGFzLCBjYXVzaW5nIHRoZSBzZW5kZXIgYWNjb3VudCB0byBiZSBraWxsZWQgKGZhbHNlKSwgb3JZASAgdHJhbnNmZXIgZXZlcnl0aGluZyBleGNlcHQgYXQgbGVhc3QgdGhlIGV4aXN0ZW50aWFsIGRlcG9zaXQsIHdoaWNoIHdpbGwgZ3VhcmFudGVlIHRvnCAga2VlcCB0aGUgc2VuZGVyIGFjY291bnQgYWxpdmUgKHRydWUpLjxmb3JjZV91bnJlc2VydmUIAQx3aG/FAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AARhhbW91bnQYAShUOjpCYWxhbmNlAAUMsFVucmVzZXJ2ZSBzb21lIGJhbGFuY2UgZnJvbSBhIHVzZXIgYnkgZm9yY2UuAGxDYW4gb25seSBiZSBjYWxsZWQgYnkgUk9PVC5AdXBncmFkZV9hY2NvdW50cwQBDHdob9EBAURWZWM8VDo6QWNjb3VudElkPgAGIHBVcGdyYWRlIGEgc3BlY2lmaWVkIGFjY291bnQuAHQtIGBvcmlnaW5gOiBNdXN0IGJlIGBTaWduZWRgLpAtIGB3aG9gOiBUaGUgYWNjb3VudCB0byBiZSB1cGdyYWRlZC4AVQFUaGlzIHdpbGwgd2FpdmUgdGhlIHRyYW5zYWN0aW9uIGZlZSBpZiBhdCBsZWFzdCBhbGwgYnV0IDEwJSBvZiB0aGUgYWNjb3VudHMgbmVlZGVkIHRvQQFiZSB1cGdyYWRlZC4gKFdlIGxldCBzb21lIG5vdCBoYXZlIHRvIGJlIHVwZ3JhZGVkIGp1c3QgaW4gb3JkZXIgdG8gYWxsb3cgZm9yIHRoZVhwb3NzaWJpbGl0eSBvZiBjaHVybikuRGZvcmNlX3NldF9iYWxhbmNlCAEMd2hvxQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEgbmV3X2ZyZWX8AShUOjpCYWxhbmNlAAgMrFNldCB0aGUgcmVndWxhciBiYWxhbmNlIG9mIGEgZ2l2ZW4gYWNjb3VudC4AsFRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBpcyBgcm9vdGAubGZvcmNlX2FkanVzdF90b3RhbF9pc3N1YW5jZQgBJGRpcmVjdGlvbtUBAUxBZGp1c3RtZW50RGlyZWN0aW9uAAEUZGVsdGH8AShUOjpCYWxhbmNlAAkUuEFkanVzdCB0aGUgdG90YWwgaXNzdWFuY2UgaW4gYSBzYXR1cmF0aW5nIHdheS4A/ENhbiBvbmx5IGJlIGNhbGxlZCBieSByb290IGFuZCBhbHdheXMgbmVlZHMgYSBwb3NpdGl2ZSBgZGVsdGFgLgAkIyBFeGFtcGxlEGJ1cm4IARR2YWx1ZfwBKFQ6OkJhbGFuY2UAAShrZWVwX2FsaXZlIAEQYm9vbAAKHPxCdXJuIHRoZSBzcGVjaWZpZWQgbGlxdWlkIGZyZWUgYmFsYW5jZSBmcm9tIHRoZSBvcmlnaW4gYWNjb3VudC4AJQFJZiB0aGUgb3JpZ2luJ3MgYWNjb3VudCBlbmRzIHVwIGJlbG93IHRoZSBleGlzdGVudGlhbCBkZXBvc2l0IGFzIGEgcmVzdWx0CQFvZiB0aGUgYnVybiBhbmQgYGtlZXBfYWxpdmVgIGlzIGZhbHNlLCB0aGUgYWNjb3VudCB3aWxsIGJlIHJlYXBlZC4AUQFVbmxpa2Ugc2VuZGluZyBmdW5kcyB0byBhIF9idXJuXyBhZGRyZXNzLCB3aGljaCBtZXJlbHkgbWFrZXMgdGhlIGZ1bmRzIGluYWNjZXNzaWJsZSwhAXRoaXMgYGJ1cm5gIG9wZXJhdGlvbiB3aWxsIHJlZHVjZSB0b3RhbCBpc3N1YW5jZSBieSB0aGUgYW1vdW50IF9idXJuZWRfLgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy7RAQAAAgAA1QEMPHBhbGxldF9iYWxhbmNlcxR0eXBlc0xBZGp1c3RtZW50RGlyZWN0aW9uAAEIIEluY3JlYXNlAAAAIERlY3JlYXNlAAEAANkBEDhwYWxsZXRfc3Rha2luZxhwYWxsZXQYcGFsbGV0EENhbGwEBFQAAXgQYm9uZAgBFHZhbHVl/AEwQmFsYW5jZU9mPFQ+AAEUcGF5ZWWoAXxSZXdhcmREZXN0aW5hdGlvbjxUOjpBY2NvdW50SWQ+AABAYQFUYWtlIHRoZSBvcmlnaW4gYWNjb3VudCBhcyBhIHN0YXNoIGFuZCBsb2NrIHVwIGB2YWx1ZWAgb2YgaXRzIGJhbGFuY2UuIGBjb250cm9sbGVyYCB3aWxsgGJlIHRoZSBhY2NvdW50IHRoYXQgY29udHJvbHMgaXQuAC0BYHZhbHVlYCBtdXN0IGJlIG1vcmUgdGhhbiB0aGUgYG1pbmltdW1fYmFsYW5jZWAgc3BlY2lmaWVkIGJ5IGBUOjpDdXJyZW5jeWAuACEBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8gYnkgdGhlIHN0YXNoIGFjY291bnQuADxFbWl0cyBgQm9uZGVkYC40IyMgQ29tcGxleGl0edAtIEluZGVwZW5kZW50IG9mIHRoZSBhcmd1bWVudHMuIE1vZGVyYXRlIGNvbXBsZXhpdHkuHC0gTygxKS5kLSBUaHJlZSBleHRyYSBEQiBlbnRyaWVzLgBNAU5PVEU6IFR3byBvZiB0aGUgc3RvcmFnZSB3cml0ZXMgKGBTZWxmOjpib25kZWRgLCBgU2VsZjo6cGF5ZWVgKSBhcmUgX25ldmVyXyBjbGVhbmVkWQF1bmxlc3MgdGhlIGBvcmlnaW5gIGZhbGxzIGJlbG93IF9leGlzdGVudGlhbCBkZXBvc2l0XyAob3IgZXF1YWwgdG8gMCkgYW5kIGdldHMgcmVtb3ZlZCBhcyBkdXN0Lihib25kX2V4dHJhBAE4bWF4X2FkZGl0aW9uYWz8ATBCYWxhbmNlT2Y8VD4AAThhAUFkZCBzb21lIGV4dHJhIGFtb3VudCB0aGF0IGhhdmUgYXBwZWFyZWQgaW4gdGhlIHN0YXNoIGBmcmVlX2JhbGFuY2VgIGludG8gdGhlIGJhbGFuY2UgdXAwZm9yIHN0YWtpbmcuAFEBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8gYnkgdGhlIHN0YXNoLCBub3QgdGhlIGNvbnRyb2xsZXIuAE0BVXNlIHRoaXMgaWYgdGhlcmUgYXJlIGFkZGl0aW9uYWwgZnVuZHMgaW4geW91ciBzdGFzaCBhY2NvdW50IHRoYXQgeW91IHdpc2ggdG8gYm9uZC5VAVVubGlrZSBbYGJvbmRgXShTZWxmOjpib25kKSBvciBbYHVuYm9uZGBdKFNlbGY6OnVuYm9uZCkgdGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBpbXBvc2W8YW55IGxpbWl0YXRpb24gb24gdGhlIGFtb3VudCB0aGF0IGNhbiBiZSBhZGRlZC4APEVtaXRzIGBCb25kZWRgLgA0IyMgQ29tcGxleGl0eeQtIEluZGVwZW5kZW50IG9mIHRoZSBhcmd1bWVudHMuIEluc2lnbmlmaWNhbnQgY29tcGxleGl0eS4cLSBPKDEpLhh1bmJvbmQEARR2YWx1ZfwBMEJhbGFuY2VPZjxUPgACTFEBU2NoZWR1bGUgYSBwb3J0aW9uIG9mIHRoZSBzdGFzaCB0byBiZSB1bmxvY2tlZCByZWFkeSBmb3IgdHJhbnNmZXIgb3V0IGFmdGVyIHRoZSBib25k/HBlcmlvZCBlbmRzLiBJZiB0aGlzIGxlYXZlcyBhbiBhbW91bnQgYWN0aXZlbHkgYm9uZGVkIGxlc3MgdGhhbiEBVDo6Q3VycmVuY3k6Om1pbmltdW1fYmFsYW5jZSgpLCB0aGVuIGl0IGlzIGluY3JlYXNlZCB0byB0aGUgZnVsbCBhbW91bnQuAFEBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8gYnkgdGhlIGNvbnRyb2xsZXIsIG5vdCB0aGUgc3Rhc2guAEUBT25jZSB0aGUgdW5sb2NrIHBlcmlvZCBpcyBkb25lLCB5b3UgY2FuIGNhbGwgYHdpdGhkcmF3X3VuYm9uZGVkYCB0byBhY3R1YWxseSBtb3ZlvHRoZSBmdW5kcyBvdXQgb2YgbWFuYWdlbWVudCByZWFkeSBmb3IgdHJhbnNmZXIuADEBTm8gbW9yZSB0aGFuIGEgbGltaXRlZCBudW1iZXIgb2YgdW5sb2NraW5nIGNodW5rcyAoc2VlIGBNYXhVbmxvY2tpbmdDaHVua3NgKUEBY2FuIGNvLWV4aXN0cyBhdCB0aGUgc2FtZSB0aW1lLiBJZiB0aGVyZSBhcmUgbm8gdW5sb2NraW5nIGNodW5rcyBzbG90cyBhdmFpbGFibGVFAVtgQ2FsbDo6d2l0aGRyYXdfdW5ib25kZWRgXSBpcyBjYWxsZWQgdG8gcmVtb3ZlIHNvbWUgb2YgdGhlIGNodW5rcyAoaWYgcG9zc2libGUpLgA5AUlmIGEgdXNlciBlbmNvdW50ZXJzIHRoZSBgSW5zdWZmaWNpZW50Qm9uZGAgZXJyb3Igd2hlbiBjYWxsaW5nIHRoaXMgZXh0cmluc2ljLBkBdGhleSBzaG91bGQgY2FsbCBgY2hpbGxgIGZpcnN0IGluIG9yZGVyIHRvIGZyZWUgdXAgdGhlaXIgYm9uZGVkIGZ1bmRzLgBERW1pdHMgYFVuYm9uZGVkYC4AlFNlZSBhbHNvIFtgQ2FsbDo6d2l0aGRyYXdfdW5ib25kZWRgXS5Ed2l0aGRyYXdfdW5ib25kZWQEAUhudW1fc2xhc2hpbmdfc3BhbnMQAQx1MzIAA1wpAVJlbW92ZSBhbnkgdW5sb2NrZWQgY2h1bmtzIGZyb20gdGhlIGB1bmxvY2tpbmdgIHF1ZXVlIGZyb20gb3VyIG1hbmFnZW1lbnQuAFUBVGhpcyBlc3NlbnRpYWxseSBmcmVlcyB1cCB0aGF0IGJhbGFuY2UgdG8gYmUgdXNlZCBieSB0aGUgc3Rhc2ggYWNjb3VudCB0byBkbyB3aGF0ZXZlciRpdCB3YW50cy4AFQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXyBieSB0aGUgY29udHJvbGxlci4ASEVtaXRzIGBXaXRoZHJhd25gLgBoU2VlIGFsc28gW2BDYWxsOjp1bmJvbmRgXS4ANCMjIFBhcmFtZXRlcnMAUQEtIGBudW1fc2xhc2hpbmdfc3BhbnNgIGluZGljYXRlcyB0aGUgbnVtYmVyIG9mIG1ldGFkYXRhIHNsYXNoaW5nIHNwYW5zIHRvIGNsZWFyIHdoZW5VAXRoaXMgY2FsbCByZXN1bHRzIGluIGEgY29tcGxldGUgcmVtb3ZhbCBvZiBhbGwgdGhlIGRhdGEgcmVsYXRlZCB0byB0aGUgc3Rhc2ggYWNjb3VudC49AUluIHRoaXMgY2FzZSwgdGhlIGBudW1fc2xhc2hpbmdfc3BhbnNgIG11c3QgYmUgbGFyZ2VyIG9yIGVxdWFsIHRvIHRoZSBudW1iZXIgb2ZdAXNsYXNoaW5nIHNwYW5zIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3Rhc2ggYWNjb3VudCBpbiB0aGUgW2BTbGFzaGluZ1NwYW5zYF0gc3RvcmFnZSB0eXBlLCUBb3RoZXJ3aXNlIHRoZSBjYWxsIHdpbGwgZmFpbC4gVGhlIGNhbGwgd2VpZ2h0IGlzIGRpcmVjdGx5IHByb3BvcnRpb25hbCB0b1RgbnVtX3NsYXNoaW5nX3NwYW5zYC4ANCMjIENvbXBsZXhpdHnYTyhTKSB3aGVyZSBTIGlzIHRoZSBudW1iZXIgb2Ygc2xhc2hpbmcgc3BhbnMgdG8gcmVtb3ZlCQFOT1RFOiBXZWlnaHQgYW5ub3RhdGlvbiBpcyB0aGUga2lsbCBzY2VuYXJpbywgd2UgcmVmdW5kIG90aGVyd2lzZS4gdmFsaWRhdGUEARRwcmVmc7ABOFZhbGlkYXRvclByZWZzAAQU5ERlY2xhcmUgdGhlIGRlc2lyZSB0byB2YWxpZGF0ZSBmb3IgdGhlIG9yaWdpbiBjb250cm9sbGVyLgDYRWZmZWN0cyB3aWxsIGJlIGZlbHQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbmV4dCBlcmEuAFEBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8gYnkgdGhlIGNvbnRyb2xsZXIsIG5vdCB0aGUgc3Rhc2guIG5vbWluYXRlBAEcdGFyZ2V0c90BAWRWZWM8QWNjb3VudElkTG9va3VwT2Y8VD4+AAUoDQFEZWNsYXJlIHRoZSBkZXNpcmUgdG8gbm9taW5hdGUgYHRhcmdldHNgIGZvciB0aGUgb3JpZ2luIGNvbnRyb2xsZXIuANhFZmZlY3RzIHdpbGwgYmUgZmVsdCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBuZXh0IGVyYS4AUQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXyBieSB0aGUgY29udHJvbGxlciwgbm90IHRoZSBzdGFzaC4ANCMjIENvbXBsZXhpdHktAS0gVGhlIHRyYW5zYWN0aW9uJ3MgY29tcGxleGl0eSBpcyBwcm9wb3J0aW9uYWwgdG8gdGhlIHNpemUgb2YgYHRhcmdldHNgIChOKQUBd2hpY2ggaXMgY2FwcGVkIGF0IENvbXBhY3RBc3NpZ25tZW50czo6TElNSVQgKFQ6Ok1heE5vbWluYXRpb25zKS7ULSBCb3RoIHRoZSByZWFkcyBhbmQgd3JpdGVzIGZvbGxvdyBhIHNpbWlsYXIgcGF0dGVybi4UY2hpbGwABijERGVjbGFyZSBubyBkZXNpcmUgdG8gZWl0aGVyIHZhbGlkYXRlIG9yIG5vbWluYXRlLgDYRWZmZWN0cyB3aWxsIGJlIGZlbHQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbmV4dCBlcmEuAFEBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8gYnkgdGhlIGNvbnRyb2xsZXIsIG5vdCB0aGUgc3Rhc2guADQjIyBDb21wbGV4aXR55C0gSW5kZXBlbmRlbnQgb2YgdGhlIGFyZ3VtZW50cy4gSW5zaWduaWZpY2FudCBjb21wbGV4aXR5LlAtIENvbnRhaW5zIG9uZSByZWFkLsQtIFdyaXRlcyBhcmUgbGltaXRlZCB0byB0aGUgYG9yaWdpbmAgYWNjb3VudCBrZXkuJHNldF9wYXllZQQBFHBheWVlqAF8UmV3YXJkRGVzdGluYXRpb248VDo6QWNjb3VudElkPgAHMLQoUmUtKXNldCB0aGUgcGF5bWVudCB0YXJnZXQgZm9yIGEgY29udHJvbGxlci4AUQFFZmZlY3RzIHdpbGwgYmUgZmVsdCBpbnN0YW50bHkgKGFzIHNvb24gYXMgdGhpcyBmdW5jdGlvbiBpcyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5KS4AUQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXyBieSB0aGUgY29udHJvbGxlciwgbm90IHRoZSBzdGFzaC4ANCMjIENvbXBsZXhpdHkYLSBPKDEp5C0gSW5kZXBlbmRlbnQgb2YgdGhlIGFyZ3VtZW50cy4gSW5zaWduaWZpY2FudCBjb21wbGV4aXR5LpQtIENvbnRhaW5zIGEgbGltaXRlZCBudW1iZXIgb2YgcmVhZHMuxC0gV3JpdGVzIGFyZSBsaW1pdGVkIHRvIHRoZSBgb3JpZ2luYCBhY2NvdW50IGtleS4kLS0tLS0tLS0tOHNldF9jb250cm9sbGVyAAg4RQEoUmUtKXNldHMgdGhlIGNvbnRyb2xsZXIgb2YgYSBzdGFzaCB0byB0aGUgc3Rhc2ggaXRzZWxmLiBUaGlzIGZ1bmN0aW9uIHByZXZpb3VzbHlNAWFjY2VwdGVkIGEgYGNvbnRyb2xsZXJgIGFyZ3VtZW50IHRvIHNldCB0aGUgY29udHJvbGxlciB0byBhbiBhY2NvdW50IG90aGVyIHRoYW4gdGhlWQFzdGFzaCBpdHNlbGYuIFRoaXMgZnVuY3Rpb25hbGl0eSBoYXMgbm93IGJlZW4gcmVtb3ZlZCwgbm93IG9ubHkgc2V0dGluZyB0aGUgY29udHJvbGxlcox0byB0aGUgc3Rhc2gsIGlmIGl0IGlzIG5vdCBhbHJlYWR5LgBRAUVmZmVjdHMgd2lsbCBiZSBmZWx0IGluc3RhbnRseSAoYXMgc29vbiBhcyB0aGlzIGZ1bmN0aW9uIGlzIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkpLgBRAVRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfIGJ5IHRoZSBzdGFzaCwgbm90IHRoZSBjb250cm9sbGVyLgA0IyMgQ29tcGxleGl0eRBPKDEp5C0gSW5kZXBlbmRlbnQgb2YgdGhlIGFyZ3VtZW50cy4gSW5zaWduaWZpY2FudCBjb21wbGV4aXR5LpQtIENvbnRhaW5zIGEgbGltaXRlZCBudW1iZXIgb2YgcmVhZHMuxC0gV3JpdGVzIGFyZSBsaW1pdGVkIHRvIHRoZSBgb3JpZ2luYCBhY2NvdW50IGtleS5Mc2V0X3ZhbGlkYXRvcl9jb3VudAQBDG5ld+wBDHUzMgAJGJBTZXRzIHRoZSBpZGVhbCBudW1iZXIgb2YgdmFsaWRhdG9ycy4AhFRoZSBkaXNwYXRjaCBvcmlnaW4gbXVzdCBiZSBSb290LgA0IyMgQ29tcGxleGl0eRBPKDEpYGluY3JlYXNlX3ZhbGlkYXRvcl9jb3VudAQBKGFkZGl0aW9uYWzsAQx1MzIAChzoSW5jcmVtZW50cyB0aGUgaWRlYWwgbnVtYmVyIG9mIHZhbGlkYXRvcnMgdXAgdG8gbWF4aW11bSBvZoxgRWxlY3Rpb25Qcm92aWRlckJhc2U6Ok1heFdpbm5lcnNgLgCEVGhlIGRpc3BhdGNoIG9yaWdpbiBtdXN0IGJlIFJvb3QuADQjIyBDb21wbGV4aXR5mFNhbWUgYXMgW2BTZWxmOjpzZXRfdmFsaWRhdG9yX2NvdW50YF0uVHNjYWxlX3ZhbGlkYXRvcl9jb3VudAQBGGZhY3RvcuEBARxQZXJjZW50AAscEQFTY2FsZSB1cCB0aGUgaWRlYWwgbnVtYmVyIG9mIHZhbGlkYXRvcnMgYnkgYSBmYWN0b3IgdXAgdG8gbWF4aW11bSBvZoxgRWxlY3Rpb25Qcm92aWRlckJhc2U6Ok1heFdpbm5lcnNgLgCEVGhlIGRpc3BhdGNoIG9yaWdpbiBtdXN0IGJlIFJvb3QuADQjIyBDb21wbGV4aXR5mFNhbWUgYXMgW2BTZWxmOjpzZXRfdmFsaWRhdG9yX2NvdW50YF0uNGZvcmNlX25vX2VyYXMADDSsRm9yY2UgdGhlcmUgdG8gYmUgbm8gbmV3IGVyYXMgaW5kZWZpbml0ZWx5LgCEVGhlIGRpc3BhdGNoIG9yaWdpbiBtdXN0IGJlIFJvb3QuACQjIFdhcm5pbmcAGQFUaGUgZWxlY3Rpb24gcHJvY2VzcyBzdGFydHMgbXVsdGlwbGUgYmxvY2tzIGJlZm9yZSB0aGUgZW5kIG9mIHRoZSBlcmEuOQFUaHVzIHRoZSBlbGVjdGlvbiBwcm9jZXNzIG1heSBiZSBvbmdvaW5nIHdoZW4gdGhpcyBpcyBjYWxsZWQuIEluIHRoaXMgY2FzZSB0aGXcZWxlY3Rpb24gd2lsbCBjb250aW51ZSB1bnRpbCB0aGUgbmV4dCBlcmEgaXMgdHJpZ2dlcmVkLgA0IyMgQ29tcGxleGl0eTwtIE5vIGFyZ3VtZW50cy44LSBXZWlnaHQ6IE8oMSk0Zm9yY2VfbmV3X2VyYQANOEkBRm9yY2UgdGhlcmUgdG8gYmUgYSBuZXcgZXJhIGF0IHRoZSBlbmQgb2YgdGhlIG5leHQgc2Vzc2lvbi4gQWZ0ZXIgdGhpcywgaXQgd2lsbCBiZZxyZXNldCB0byBub3JtYWwgKG5vbi1mb3JjZWQpIGJlaGF2aW91ci4AhFRoZSBkaXNwYXRjaCBvcmlnaW4gbXVzdCBiZSBSb290LgAkIyBXYXJuaW5nABkBVGhlIGVsZWN0aW9uIHByb2Nlc3Mgc3RhcnRzIG11bHRpcGxlIGJsb2NrcyBiZWZvcmUgdGhlIGVuZCBvZiB0aGUgZXJhLkkBSWYgdGhpcyBpcyBjYWxsZWQganVzdCBiZWZvcmUgYSBuZXcgZXJhIGlzIHRyaWdnZXJlZCwgdGhlIGVsZWN0aW9uIHByb2Nlc3MgbWF5IG5vdIxoYXZlIGVub3VnaCBibG9ja3MgdG8gZ2V0IGEgcmVzdWx0LgA0IyMgQ29tcGxleGl0eTwtIE5vIGFyZ3VtZW50cy44LSBXZWlnaHQ6IE8oMSlEc2V0X2ludnVsbmVyYWJsZXMEATRpbnZ1bG5lcmFibGVz0QEBRFZlYzxUOjpBY2NvdW50SWQ+AA4MyFNldCB0aGUgdmFsaWRhdG9ycyB3aG8gY2Fubm90IGJlIHNsYXNoZWQgKGlmIGFueSkuAIRUaGUgZGlzcGF0Y2ggb3JpZ2luIG11c3QgYmUgUm9vdC40Zm9yY2VfdW5zdGFrZQgBFHN0YXNoAAEwVDo6QWNjb3VudElkAAFIbnVtX3NsYXNoaW5nX3NwYW5zEAEMdTMyAA8gCQFGb3JjZSBhIGN1cnJlbnQgc3Rha2VyIHRvIGJlY29tZSBjb21wbGV0ZWx5IHVuc3Rha2VkLCBpbW1lZGlhdGVseS4AhFRoZSBkaXNwYXRjaCBvcmlnaW4gbXVzdCBiZSBSb290LgA0IyMgUGFyYW1ldGVycwBFAS0gYG51bV9zbGFzaGluZ19zcGFuc2A6IFJlZmVyIHRvIGNvbW1lbnRzIG9uIFtgQ2FsbDo6d2l0aGRyYXdfdW5ib25kZWRgXSBmb3IgbW9yZSBkZXRhaWxzLlBmb3JjZV9uZXdfZXJhX2Fsd2F5cwAQJAEBRm9yY2UgdGhlcmUgdG8gYmUgYSBuZXcgZXJhIGF0IHRoZSBlbmQgb2Ygc2Vzc2lvbnMgaW5kZWZpbml0ZWx5LgCEVGhlIGRpc3BhdGNoIG9yaWdpbiBtdXN0IGJlIFJvb3QuACQjIFdhcm5pbmcAGQFUaGUgZWxlY3Rpb24gcHJvY2VzcyBzdGFydHMgbXVsdGlwbGUgYmxvY2tzIGJlZm9yZSB0aGUgZW5kIG9mIHRoZSBlcmEuSQFJZiB0aGlzIGlzIGNhbGxlZCBqdXN0IGJlZm9yZSBhIG5ldyBlcmEgaXMgdHJpZ2dlcmVkLCB0aGUgZWxlY3Rpb24gcHJvY2VzcyBtYXkgbm90jGhhdmUgZW5vdWdoIGJsb2NrcyB0byBnZXQgYSByZXN1bHQuVGNhbmNlbF9kZWZlcnJlZF9zbGFzaAgBDGVyYRABIEVyYUluZGV4AAE0c2xhc2hfaW5kaWNlc+UBASBWZWM8dTMyPgARFJRDYW5jZWwgZW5hY3RtZW50IG9mIGEgZGVmZXJyZWQgc2xhc2guAJhDYW4gYmUgY2FsbGVkIGJ5IHRoZSBgVDo6QWRtaW5PcmlnaW5gLgABAVBhcmFtZXRlcnM6IGVyYSBhbmQgaW5kaWNlcyBvZiB0aGUgc2xhc2hlcyBmb3IgdGhhdCBlcmEgdG8ga2lsbC44cGF5b3V0X3N0YWtlcnMIATx2YWxpZGF0b3Jfc3Rhc2gAATBUOjpBY2NvdW50SWQAAQxlcmEQASBFcmFJbmRleAASNBkBUGF5IG91dCBuZXh0IHBhZ2Ugb2YgdGhlIHN0YWtlcnMgYmVoaW5kIGEgdmFsaWRhdG9yIGZvciB0aGUgZ2l2ZW4gZXJhLgDoLSBgdmFsaWRhdG9yX3N0YXNoYCBpcyB0aGUgc3Rhc2ggYWNjb3VudCBvZiB0aGUgdmFsaWRhdG9yLjEBLSBgZXJhYCBtYXkgYmUgYW55IGVyYSBiZXR3ZWVuIGBbY3VycmVudF9lcmEgLSBoaXN0b3J5X2RlcHRoOyBjdXJyZW50X2VyYV1gLgBVAVRoZSBvcmlnaW4gb2YgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uIEFueSBhY2NvdW50IGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24sIGV2ZW4gaWZ0aXQgaXMgbm90IG9uZSBvZiB0aGUgc3Rha2Vycy4ASQFUaGUgcmV3YXJkIHBheW91dCBjb3VsZCBiZSBwYWdlZCBpbiBjYXNlIHRoZXJlIGFyZSB0b28gbWFueSBub21pbmF0b3JzIGJhY2tpbmcgdGhlXQFgdmFsaWRhdG9yX3N0YXNoYC4gVGhpcyBjYWxsIHdpbGwgcGF5b3V0IHVucGFpZCBwYWdlcyBpbiBhbiBhc2NlbmRpbmcgb3JkZXIuIFRvIGNsYWltIGG0c3BlY2lmaWMgcGFnZSwgdXNlIGBwYXlvdXRfc3Rha2Vyc19ieV9wYWdlYC5gAPBJZiBhbGwgcGFnZXMgYXJlIGNsYWltZWQsIGl0IHJldHVybnMgYW4gZXJyb3IgYEludmFsaWRQYWdlYC4YcmVib25kBAEUdmFsdWX8ATBCYWxhbmNlT2Y8VD4AExzcUmVib25kIGEgcG9ydGlvbiBvZiB0aGUgc3Rhc2ggc2NoZWR1bGVkIHRvIGJlIHVubG9ja2VkLgDUVGhlIGRpc3BhdGNoIG9yaWdpbiBtdXN0IGJlIHNpZ25lZCBieSB0aGUgY29udHJvbGxlci4ANCMjIENvbXBsZXhpdHnQLSBUaW1lIGNvbXBsZXhpdHk6IE8oTCksIHdoZXJlIEwgaXMgdW5sb2NraW5nIGNodW5rc4gtIEJvdW5kZWQgYnkgYE1heFVubG9ja2luZ0NodW5rc2AuKHJlYXBfc3Rhc2gIARRzdGFzaAABMFQ6OkFjY291bnRJZAABSG51bV9zbGFzaGluZ19zcGFucxABDHUzMgAUSF0BUmVtb3ZlIGFsbCBkYXRhIHN0cnVjdHVyZXMgY29uY2VybmluZyBhIHN0YWtlci9zdGFzaCBvbmNlIGl0IGlzIGF0IGEgc3RhdGUgd2hlcmUgaXQgY2FuBQFiZSBjb25zaWRlcmVkIGBkdXN0YCBpbiB0aGUgc3Rha2luZyBzeXN0ZW0uIFRoZSByZXF1aXJlbWVudHMgYXJlOgAFATEuIHRoZSBgdG90YWxfYmFsYW5jZWAgb2YgdGhlIHN0YXNoIGlzIGJlbG93IGV4aXN0ZW50aWFsIGRlcG9zaXQuEQEyLiBvciwgdGhlIGBsZWRnZXIudG90YWxgIG9mIHRoZSBzdGFzaCBpcyBiZWxvdyBleGlzdGVudGlhbCBkZXBvc2l0LmEBMy4gb3IsIGV4aXN0ZW50aWFsIGRlcG9zaXQgaXMgemVybyBhbmQgZWl0aGVyIGB0b3RhbF9iYWxhbmNlYCBvciBgbGVkZ2VyLnRvdGFsYCBpcyB6ZXJvLgBVAVRoZSBmb3JtZXIgY2FuIGhhcHBlbiBpbiBjYXNlcyBsaWtlIGEgc2xhc2g7IHRoZSBsYXR0ZXIgd2hlbiBhIGZ1bGx5IHVuYm9uZGVkIGFjY291bnQJAWlzIHN0aWxsIHJlY2VpdmluZyBzdGFraW5nIHJld2FyZHMgaW4gYFJld2FyZERlc3RpbmF0aW9uOjpTdGFrZWRgLgAxAUl0IGNhbiBiZSBjYWxsZWQgYnkgYW55b25lLCBhcyBsb25nIGFzIGBzdGFzaGAgbWVldHMgdGhlIGFib3ZlIHJlcXVpcmVtZW50cy4A3FJlZnVuZHMgdGhlIHRyYW5zYWN0aW9uIGZlZXMgdXBvbiBzdWNjZXNzZnVsIGV4ZWN1dGlvbi4ANCMjIFBhcmFtZXRlcnMARQEtIGBudW1fc2xhc2hpbmdfc3BhbnNgOiBSZWZlciB0byBjb21tZW50cyBvbiBbYENhbGw6OndpdGhkcmF3X3VuYm9uZGVkYF0gZm9yIG1vcmUgZGV0YWlscy4Qa2ljawQBDHdob90BAWRWZWM8QWNjb3VudElkTG9va3VwT2Y8VD4+ABUs4FJlbW92ZSB0aGUgZ2l2ZW4gbm9taW5hdGlvbnMgZnJvbSB0aGUgY2FsbGluZyB2YWxpZGF0b3IuANhFZmZlY3RzIHdpbGwgYmUgZmVsdCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBuZXh0IGVyYS4AUQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXyBieSB0aGUgY29udHJvbGxlciwgbm90IHRoZSBzdGFzaC4ATQEtIGB3aG9gOiBBIGxpc3Qgb2Ygbm9taW5hdG9yIHN0YXNoIGFjY291bnRzIHdobyBhcmUgbm9taW5hdGluZyB0aGlzIHZhbGlkYXRvciB3aGljaMAgIHNob3VsZCBubyBsb25nZXIgYmUgbm9taW5hdGluZyB0aGlzIHZhbGlkYXRvci4AVQFOb3RlOiBNYWtpbmcgdGhpcyBjYWxsIG9ubHkgbWFrZXMgc2Vuc2UgaWYgeW91IGZpcnN0IHNldCB0aGUgdmFsaWRhdG9yIHByZWZlcmVuY2VzIHRveGJsb2NrIGFueSBmdXJ0aGVyIG5vbWluYXRpb25zLkxzZXRfc3Rha2luZ19jb25maWdzHAFIbWluX25vbWluYXRvcl9ib25k6QEBWENvbmZpZ09wPEJhbGFuY2VPZjxUPj4AAUhtaW5fdmFsaWRhdG9yX2JvbmTpAQFYQ29uZmlnT3A8QmFsYW5jZU9mPFQ+PgABTG1heF9ub21pbmF0b3JfY291bnTtAQE0Q29uZmlnT3A8dTMyPgABTG1heF92YWxpZGF0b3JfY291bnTtAQE0Q29uZmlnT3A8dTMyPgABPGNoaWxsX3RocmVzaG9sZPEBAURDb25maWdPcDxQZXJjZW50PgABOG1pbl9jb21taXNzaW9u9QEBRENvbmZpZ09wPFBlcmJpbGw+AAFIbWF4X3N0YWtlZF9yZXdhcmRz8QEBRENvbmZpZ09wPFBlcmNlbnQ+ABZErFVwZGF0ZSB0aGUgdmFyaW91cyBzdGFraW5nIGNvbmZpZ3VyYXRpb25zIC4AJQEqIGBtaW5fbm9taW5hdG9yX2JvbmRgOiBUaGUgbWluaW11bSBhY3RpdmUgYm9uZCBuZWVkZWQgdG8gYmUgYSBub21pbmF0b3IuJQEqIGBtaW5fdmFsaWRhdG9yX2JvbmRgOiBUaGUgbWluaW11bSBhY3RpdmUgYm9uZCBuZWVkZWQgdG8gYmUgYSB2YWxpZGF0b3IuVQEqIGBtYXhfbm9taW5hdG9yX2NvdW50YDogVGhlIG1heCBudW1iZXIgb2YgdXNlcnMgd2hvIGNhbiBiZSBhIG5vbWluYXRvciBhdCBvbmNlLiBXaGVumCAgc2V0IHRvIGBOb25lYCwgbm8gbGltaXQgaXMgZW5mb3JjZWQuVQEqIGBtYXhfdmFsaWRhdG9yX2NvdW50YDogVGhlIG1heCBudW1iZXIgb2YgdXNlcnMgd2hvIGNhbiBiZSBhIHZhbGlkYXRvciBhdCBvbmNlLiBXaGVumCAgc2V0IHRvIGBOb25lYCwgbm8gbGltaXQgaXMgZW5mb3JjZWQuWQEqIGBjaGlsbF90aHJlc2hvbGRgOiBUaGUgcmF0aW8gb2YgYG1heF9ub21pbmF0b3JfY291bnRgIG9yIGBtYXhfdmFsaWRhdG9yX2NvdW50YCB3aGljaBkBICBzaG91bGQgYmUgZmlsbGVkIGluIG9yZGVyIGZvciB0aGUgYGNoaWxsX290aGVyYCB0cmFuc2FjdGlvbiB0byB3b3JrLmEBKiBgbWluX2NvbW1pc3Npb25gOiBUaGUgbWluaW11bSBhbW91bnQgb2YgY29tbWlzc2lvbiB0aGF0IGVhY2ggdmFsaWRhdG9ycyBtdXN0IG1haW50YWluLlUBICBUaGlzIGlzIGNoZWNrZWQgb25seSB1cG9uIGNhbGxpbmcgYHZhbGlkYXRlYC4gRXhpc3RpbmcgdmFsaWRhdG9ycyBhcmUgbm90IGFmZmVjdGVkLgDEUnVudGltZU9yaWdpbiBtdXN0IGJlIFJvb3QgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uLgA1AU5PVEU6IEV4aXN0aW5nIG5vbWluYXRvcnMgYW5kIHZhbGlkYXRvcnMgd2lsbCBub3QgYmUgYWZmZWN0ZWQgYnkgdGhpcyB1cGRhdGUuEQF0byBraWNrIHBlb3BsZSB1bmRlciB0aGUgbmV3IGxpbWl0cywgYGNoaWxsX290aGVyYCBzaG91bGQgYmUgY2FsbGVkLixjaGlsbF9vdGhlcgQBFHN0YXNoAAEwVDo6QWNjb3VudElkABdoQQFEZWNsYXJlIGEgYGNvbnRyb2xsZXJgIHRvIHN0b3AgcGFydGljaXBhdGluZyBhcyBlaXRoZXIgYSB2YWxpZGF0b3Igb3Igbm9taW5hdG9yLgDYRWZmZWN0cyB3aWxsIGJlIGZlbHQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbmV4dCBlcmEuAEEBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8sIGJ1dCBjYW4gYmUgY2FsbGVkIGJ5IGFueW9uZS4AWQFJZiB0aGUgY2FsbGVyIGlzIHRoZSBzYW1lIGFzIHRoZSBjb250cm9sbGVyIGJlaW5nIHRhcmdldGVkLCB0aGVuIG5vIGZ1cnRoZXIgY2hlY2tzIGFyZdhlbmZvcmNlZCwgYW5kIHRoaXMgZnVuY3Rpb24gYmVoYXZlcyBqdXN0IGxpa2UgYGNoaWxsYC4AXQFJZiB0aGUgY2FsbGVyIGlzIGRpZmZlcmVudCB0aGFuIHRoZSBjb250cm9sbGVyIGJlaW5nIHRhcmdldGVkLCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMwbXVzdCBiZSBtZXQ6AB0BKiBgY29udHJvbGxlcmAgbXVzdCBiZWxvbmcgdG8gYSBub21pbmF0b3Igd2hvIGhhcyBiZWNvbWUgbm9uLWRlY29kYWJsZSwADE9yOgA9ASogQSBgQ2hpbGxUaHJlc2hvbGRgIG11c3QgYmUgc2V0IGFuZCBjaGVja2VkIHdoaWNoIGRlZmluZXMgaG93IGNsb3NlIHRvIHRoZSBtYXhVASAgbm9taW5hdG9ycyBvciB2YWxpZGF0b3JzIHdlIG11c3QgcmVhY2ggYmVmb3JlIHVzZXJzIGNhbiBzdGFydCBjaGlsbGluZyBvbmUtYW5vdGhlci5ZASogQSBgTWF4Tm9taW5hdG9yQ291bnRgIGFuZCBgTWF4VmFsaWRhdG9yQ291bnRgIG11c3QgYmUgc2V0IHdoaWNoIGlzIHVzZWQgdG8gZGV0ZXJtaW5lkCAgaG93IGNsb3NlIHdlIGFyZSB0byB0aGUgdGhyZXNob2xkLl0BKiBBIGBNaW5Ob21pbmF0b3JCb25kYCBhbmQgYE1pblZhbGlkYXRvckJvbmRgIG11c3QgYmUgc2V0IGFuZCBjaGVja2VkLCB3aGljaCBkZXRlcm1pbmVzUQEgIGlmIHRoaXMgaXMgYSBwZXJzb24gdGhhdCBzaG91bGQgYmUgY2hpbGxlZCBiZWNhdXNlIHRoZXkgaGF2ZSBub3QgbWV0IHRoZSB0aHJlc2hvbGRAICBib25kIHJlcXVpcmVkLgBVAVRoaXMgY2FuIGJlIGhlbHBmdWwgaWYgYm9uZCByZXF1aXJlbWVudHMgYXJlIHVwZGF0ZWQsIGFuZCB3ZSBuZWVkIHRvIHJlbW92ZSBvbGQgdXNlcnOYd2hvIGRvIG5vdCBzYXRpc2Z5IHRoZXNlIHJlcXVpcmVtZW50cy5oZm9yY2VfYXBwbHlfbWluX2NvbW1pc3Npb24EATx2YWxpZGF0b3Jfc3Rhc2gAATBUOjpBY2NvdW50SWQAGAxFAUZvcmNlIGEgdmFsaWRhdG9yIHRvIGhhdmUgYXQgbGVhc3QgdGhlIG1pbmltdW0gY29tbWlzc2lvbi4gVGhpcyB3aWxsIG5vdCBhZmZlY3QgYWEBdmFsaWRhdG9yIHdobyBhbHJlYWR5IGhhcyBhIGNvbW1pc3Npb24gZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBtaW5pbXVtLiBBbnkgYWNjb3VudDhjYW4gY2FsbCB0aGlzLkhzZXRfbWluX2NvbW1pc3Npb24EAQxuZXesARxQZXJiaWxsABkQJQFTZXRzIHRoZSBtaW5pbXVtIGFtb3VudCBvZiBjb21taXNzaW9uIHRoYXQgZWFjaCB2YWxpZGF0b3JzIG11c3QgbWFpbnRhaW4uAFkBVGhpcyBjYWxsIGhhcyBsb3dlciBwcml2aWxlZ2UgcmVxdWlyZW1lbnRzIHRoYW4gYHNldF9zdGFraW5nX2NvbmZpZ2AgYW5kIGNhbiBiZSBjYWxsZWTMYnkgdGhlIGBUOjpBZG1pbk9yaWdpbmAuIFJvb3QgY2FuIGFsd2F5cyBjYWxsIHRoaXMuWHBheW91dF9zdGFrZXJzX2J5X3BhZ2UMATx2YWxpZGF0b3Jfc3Rhc2gAATBUOjpBY2NvdW50SWQAAQxlcmEQASBFcmFJbmRleAABEHBhZ2UQARBQYWdlABpEMQFQYXkgb3V0IGEgcGFnZSBvZiB0aGUgc3Rha2VycyBiZWhpbmQgYSB2YWxpZGF0b3IgZm9yIHRoZSBnaXZlbiBlcmEgYW5kIHBhZ2UuAOgtIGB2YWxpZGF0b3Jfc3Rhc2hgIGlzIHRoZSBzdGFzaCBhY2NvdW50IG9mIHRoZSB2YWxpZGF0b3IuMQEtIGBlcmFgIG1heSBiZSBhbnkgZXJhIGJldHdlZW4gYFtjdXJyZW50X2VyYSAtIGhpc3RvcnlfZGVwdGg7IGN1cnJlbnRfZXJhXWAuMQEtIGBwYWdlYCBpcyB0aGUgcGFnZSBpbmRleCBvZiBub21pbmF0b3JzIHRvIHBheSBvdXQgd2l0aCB2YWx1ZSBiZXR3ZWVuIDAgYW5ksCAgYG51bV9ub21pbmF0b3JzIC8gVDo6TWF4RXhwb3N1cmVQYWdlU2l6ZWAuAFUBVGhlIG9yaWdpbiBvZiB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXy4gQW55IGFjY291bnQgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbiwgZXZlbiBpZnRpdCBpcyBub3Qgb25lIG9mIHRoZSBzdGFrZXJzLgA9AUlmIGEgdmFsaWRhdG9yIGhhcyBtb3JlIHRoYW4gW2BDb25maWc6Ok1heEV4cG9zdXJlUGFnZVNpemVgXSBub21pbmF0b3JzIGJhY2tpbmcpAXRoZW0sIHRoZW4gdGhlIGxpc3Qgb2Ygbm9taW5hdG9ycyBpcyBwYWdlZCwgd2l0aCBlYWNoIHBhZ2UgYmVpbmcgY2FwcGVkIGF0VQFbYENvbmZpZzo6TWF4RXhwb3N1cmVQYWdlU2l6ZWAuXSBJZiBhIHZhbGlkYXRvciBoYXMgbW9yZSB0aGFuIG9uZSBwYWdlIG9mIG5vbWluYXRvcnMsSQF0aGUgY2FsbCBuZWVkcyB0byBiZSBtYWRlIGZvciBlYWNoIHBhZ2Ugc2VwYXJhdGVseSBpbiBvcmRlciBmb3IgYWxsIHRoZSBub21pbmF0b3JzVQFiYWNraW5nIGEgdmFsaWRhdG9yIHRvIHJlY2VpdmUgdGhlIHJld2FyZC4gVGhlIG5vbWluYXRvcnMgYXJlIG5vdCBzb3J0ZWQgYWNyb3NzIHBhZ2VzYQFhbmQgc28gaXQgc2hvdWxkIG5vdCBiZSBhc3N1bWVkIHRoZSBoaWdoZXN0IHN0YWtlciB3b3VsZCBiZSBvbiB0aGUgdG9wbW9zdCBwYWdlIGFuZCB2aWNlSQF2ZXJzYS4gSWYgcmV3YXJkcyBhcmUgbm90IGNsYWltZWQgaW4gW2BDb25maWc6Okhpc3RvcnlEZXB0aGBdIGVyYXMsIHRoZXkgYXJlIGxvc3QuMHVwZGF0ZV9wYXllZQQBKGNvbnRyb2xsZXIAATBUOjpBY2NvdW50SWQAGxjgTWlncmF0ZXMgYW4gYWNjb3VudCdzIGBSZXdhcmREZXN0aW5hdGlvbjo6Q29udHJvbGxlcmAgdG+kYFJld2FyZERlc3RpbmF0aW9uOjpBY2NvdW50KGNvbnRyb2xsZXIpYC4AUQFFZmZlY3RzIHdpbGwgYmUgZmVsdCBpbnN0YW50bHkgKGFzIHNvb24gYXMgdGhpcyBmdW5jdGlvbiBpcyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5KS4AMQFUaGlzIHdpbGwgd2FpdmUgdGhlIHRyYW5zYWN0aW9uIGZlZSBpZiB0aGUgYHBheWVlYCBpcyBzdWNjZXNzZnVsbHkgbWlncmF0ZWQuaGRlcHJlY2F0ZV9jb250cm9sbGVyX2JhdGNoBAEsY29udHJvbGxlcnP5AQH0Qm91bmRlZFZlYzxUOjpBY2NvdW50SWQsIFQ6Ok1heENvbnRyb2xsZXJzSW5EZXByZWNhdGlvbkJhdGNoPgAcHF0BVXBkYXRlcyBhIGJhdGNoIG9mIGNvbnRyb2xsZXIgYWNjb3VudHMgdG8gdGhlaXIgY29ycmVzcG9uZGluZyBzdGFzaCBhY2NvdW50IGlmIHRoZXkgYXJlYQFub3QgdGhlIHNhbWUuIElnbm9yZXMgYW55IGNvbnRyb2xsZXIgYWNjb3VudHMgdGhhdCBkbyBub3QgZXhpc3QsIGFuZCBkb2VzIG5vdCBvcGVyYXRlIGlmuHRoZSBzdGFzaCBhbmQgY29udHJvbGxlciBhcmUgYWxyZWFkeSB0aGUgc2FtZS4AUQFFZmZlY3RzIHdpbGwgYmUgZmVsdCBpbnN0YW50bHkgKGFzIHNvb24gYXMgdGhpcyBmdW5jdGlvbiBpcyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5KS4AtFRoZSBkaXNwYXRjaCBvcmlnaW4gbXVzdCBiZSBgVDo6QWRtaW5PcmlnaW5gLjhyZXN0b3JlX2xlZGdlchABFHN0YXNoAAEwVDo6QWNjb3VudElkAAFAbWF5YmVfY29udHJvbGxlcv0BAVBPcHRpb248VDo6QWNjb3VudElkPgABLG1heWJlX3RvdGFsAQIBUE9wdGlvbjxCYWxhbmNlT2Y8VD4+AAE8bWF5YmVfdW5sb2NraW5nBQIBFQFPcHRpb248Qm91bmRlZFZlYzxVbmxvY2tDaHVuazxCYWxhbmNlT2Y8VD4+LCBUOjoKTWF4VW5sb2NraW5nQ2h1bmtzPj4AHSwFAVJlc3RvcmVzIHRoZSBzdGF0ZSBvZiBhIGxlZGdlciB3aGljaCBpcyBpbiBhbiBpbmNvbnNpc3RlbnQgc3RhdGUuANxUaGUgcmVxdWlyZW1lbnRzIHRvIHJlc3RvcmUgYSBsZWRnZXIgYXJlIHRoZSBmb2xsb3dpbmc6ZCogVGhlIHN0YXNoIGlzIGJvbmRlZDsgb3INASogVGhlIHN0YXNoIGlzIG5vdCBib25kZWQgYnV0IGl0IGhhcyBhIHN0YWtpbmcgbG9jayBsZWZ0IGJlaGluZDsgb3IlASogSWYgdGhlIHN0YXNoIGhhcyBhbiBhc3NvY2lhdGVkIGxlZGdlciBhbmQgaXRzIHN0YXRlIGlzIGluY29uc2lzdGVudDsgb3IdASogSWYgdGhlIGxlZGdlciBpcyBub3QgY29ycnVwdGVkICpidXQqIGl0cyBzdGFraW5nIGxvY2sgaXMgb3V0IG9mIHN5bmMuAGEBVGhlIGBtYXliZV8qYCBpbnB1dCBwYXJhbWV0ZXJzIHdpbGwgb3ZlcndyaXRlIHRoZSBjb3JyZXNwb25kaW5nIGRhdGEgYW5kIG1ldGFkYXRhIG9mIHRoZVkBbGVkZ2VyIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3Rhc2guIElmIHRoZSBpbnB1dCBwYXJhbWV0ZXJzIGFyZSBub3Qgc2V0LCB0aGUgbGVkZ2VyIHdpbGyQYmUgcmVzZXQgdmFsdWVzIGZyb20gb24tY2hhaW4gc3RhdGUuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLt0BAAACxQEA4QEMNHNwX2FyaXRobWV0aWMocGVyX3RoaW5ncxxQZXJjZW50AAAEAAgBCHU4AADlAQAAAhAA6QEQOHBhbGxldF9zdGFraW5nGHBhbGxldBhwYWxsZXQgQ29uZmlnT3AEBFQBGAEMEE5vb3AAAAAMU2V0BAAYAQRUAAEAGFJlbW92ZQACAADtARA4cGFsbGV0X3N0YWtpbmcYcGFsbGV0GHBhbGxldCBDb25maWdPcAQEVAEQAQwQTm9vcAAAAAxTZXQEABABBFQAAQAYUmVtb3ZlAAIAAPEBEDhwYWxsZXRfc3Rha2luZxhwYWxsZXQYcGFsbGV0IENvbmZpZ09wBARUAeEBAQwQTm9vcAAAAAxTZXQEAOEBAQRUAAEAGFJlbW92ZQACAAD1ARA4cGFsbGV0X3N0YWtpbmcYcGFsbGV0GHBhbGxldCBDb25maWdPcAQEVAGsAQwQTm9vcAAAAAxTZXQEAKwBBFQAAQAYUmVtb3ZlAAIAAPkBDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBAARTAAAEANEBARhWZWM8VD4AAP0BBBhPcHRpb24EBFQBAAEIEE5vbmUAAAAQU29tZQQAAAAAAQAAAQIEGE9wdGlvbgQEVAEYAQgQTm9uZQAAABBTb21lBAAYAAABAAAFAgQYT3B0aW9uBARUAQkCAQgQTm9uZQAAABBTb21lBAAJAgAAAQAACQIMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAENAgRTAAAEABECARhWZWM8VD4AAA0CCDhwYWxsZXRfc3Rha2luZyxVbmxvY2tDaHVuawQcQmFsYW5jZQEYAAgBFHZhbHVl/AEcQmFsYW5jZQABDGVyYewBIEVyYUluZGV4AAARAgAAAg0CABUCDDhwYWxsZXRfc2Vzc2lvbhhwYWxsZXQQQ2FsbAQEVAABCCBzZXRfa2V5cwgBEGtleXMZAgEcVDo6S2V5cwABFHByb29mOAEcVmVjPHU4PgAAJORTZXRzIHRoZSBzZXNzaW9uIGtleShzKSBvZiB0aGUgZnVuY3Rpb24gY2FsbGVyIHRvIGBrZXlzYC4dAUFsbG93cyBhbiBhY2NvdW50IHRvIHNldCBpdHMgc2Vzc2lvbiBrZXkgcHJpb3IgdG8gYmVjb21pbmcgYSB2YWxpZGF0b3IuwFRoaXMgZG9lc24ndCB0YWtlIGVmZmVjdCB1bnRpbCB0aGUgbmV4dCBzZXNzaW9uLgDQVGhlIGRpc3BhdGNoIG9yaWdpbiBvZiB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgc2lnbmVkLgA0IyMgQ29tcGxleGl0eVkBLSBgTygxKWAuIEFjdHVhbCBjb3N0IGRlcGVuZHMgb24gdGhlIG51bWJlciBvZiBsZW5ndGggb2YgYFQ6OktleXM6OmtleV9pZHMoKWAgd2hpY2ggaXMgICBmaXhlZC4ocHVyZ2Vfa2V5cwABMMhSZW1vdmVzIGFueSBzZXNzaW9uIGtleShzKSBvZiB0aGUgZnVuY3Rpb24gY2FsbGVyLgDAVGhpcyBkb2Vzbid0IHRha2UgZWZmZWN0IHVudGlsIHRoZSBuZXh0IHNlc3Npb24uAFUBVGhlIGRpc3BhdGNoIG9yaWdpbiBvZiB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgU2lnbmVkIGFuZCB0aGUgYWNjb3VudCBtdXN0IGJlIGVpdGhlciBiZV0BY29udmVydGlibGUgdG8gYSB2YWxpZGF0b3IgSUQgdXNpbmcgdGhlIGNoYWluJ3MgdHlwaWNhbCBhZGRyZXNzaW5nIHN5c3RlbSAodGhpcyB1c3VhbGx5UQFtZWFucyBiZWluZyBhIGNvbnRyb2xsZXIgYWNjb3VudCkgb3IgZGlyZWN0bHkgY29udmVydGlibGUgaW50byBhIHZhbGlkYXRvciBJRCAod2hpY2iUdXN1YWxseSBtZWFucyBiZWluZyBhIHN0YXNoIGFjY291bnQpLgA0IyMgQ29tcGxleGl0eT0BLSBgTygxKWAgaW4gbnVtYmVyIG9mIGtleSB0eXBlcy4gQWN0dWFsIGNvc3QgZGVwZW5kcyBvbiB0aGUgbnVtYmVyIG9mIGxlbmd0aCBvZpggIGBUOjpLZXlzOjprZXlfaWRzKClgIHdoaWNoIGlzIGZpeGVkLgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy4ZAgg0cGFzZW9fcnVudGltZSxTZXNzaW9uS2V5cwAAGAEcZ3JhbmRwYdQB0DxHcmFuZHBhIGFzICRjcmF0ZTo6Qm91bmRUb1J1bnRpbWVBcHBQdWJsaWM+OjpQdWJsaWMAARBiYWJlpQEBxDxCYWJlIGFzICRjcmF0ZTo6Qm91bmRUb1J1bnRpbWVBcHBQdWJsaWM+OjpQdWJsaWMAAThwYXJhX3ZhbGlkYXRvch0CAeA8SW5pdGlhbGl6ZXIgYXMgJGNyYXRlOjpCb3VuZFRvUnVudGltZUFwcFB1YmxpYz46OlB1YmxpYwABPHBhcmFfYXNzaWdubWVudCECAfA8UGFyYVNlc3Npb25JbmZvIGFzICRjcmF0ZTo6Qm91bmRUb1J1bnRpbWVBcHBQdWJsaWM+OjpQdWJsaWMAAUxhdXRob3JpdHlfZGlzY292ZXJ5JQIB/DxBdXRob3JpdHlEaXNjb3ZlcnkgYXMgJGNyYXRlOjpCb3VuZFRvUnVudGltZUFwcFB1YmxpYz46OlB1YmxpYwABFGJlZWZ5KQIByDxCZWVmeSBhcyAkY3JhdGU6OkJvdW5kVG9SdW50aW1lQXBwUHVibGljPjo6UHVibGljAAAdAhBMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2NzR2YWxpZGF0b3JfYXBwGFB1YmxpYwAABAAEATxzcjI1NTE5OjpQdWJsaWMAACECEExwb2xrYWRvdF9wcmltaXRpdmVzCHY3OGFzc2lnbm1lbnRfYXBwGFB1YmxpYwAABAAEATxzcjI1NTE5OjpQdWJsaWMAACUCDFhzcF9hdXRob3JpdHlfZGlzY292ZXJ5DGFwcBhQdWJsaWMAAAQABAE8c3IyNTUxOTo6UHVibGljAAApAgxIc3BfY29uc2Vuc3VzX2JlZWZ5MGVjZHNhX2NyeXB0bxhQdWJsaWMAAAQALQIBNGVjZHNhOjpQdWJsaWMAAC0CAAADIQAAAAgAMQIMOHBhbGxldF9ncmFuZHBhGHBhbGxldBBDYWxsBARUAAEMTHJlcG9ydF9lcXVpdm9jYXRpb24IAUhlcXVpdm9jYXRpb25fcHJvb2Y1AgHIQm94PEVxdWl2b2NhdGlvblByb29mPFQ6Okhhc2gsIEJsb2NrTnVtYmVyRm9yPFQ+Pj4AATxrZXlfb3duZXJfcHJvb2atAQFAVDo6S2V5T3duZXJQcm9vZgAAEAkBUmVwb3J0IHZvdGVyIGVxdWl2b2NhdGlvbi9taXNiZWhhdmlvci4gVGhpcyBtZXRob2Qgd2lsbCB2ZXJpZnkgdGhl9GVxdWl2b2NhdGlvbiBwcm9vZiBhbmQgdmFsaWRhdGUgdGhlIGdpdmVuIGtleSBvd25lcnNoaXAgcHJvb2b4YWdhaW5zdCB0aGUgZXh0cmFjdGVkIG9mZmVuZGVyLiBJZiBib3RoIGFyZSB2YWxpZCwgdGhlIG9mZmVuY2VEd2lsbCBiZSByZXBvcnRlZC5wcmVwb3J0X2VxdWl2b2NhdGlvbl91bnNpZ25lZAgBSGVxdWl2b2NhdGlvbl9wcm9vZjUCAchCb3g8RXF1aXZvY2F0aW9uUHJvb2Y8VDo6SGFzaCwgQmxvY2tOdW1iZXJGb3I8VD4+PgABPGtleV9vd25lcl9wcm9vZq0BAUBUOjpLZXlPd25lclByb29mAAEkCQFSZXBvcnQgdm90ZXIgZXF1aXZvY2F0aW9uL21pc2JlaGF2aW9yLiBUaGlzIG1ldGhvZCB3aWxsIHZlcmlmeSB0aGX0ZXF1aXZvY2F0aW9uIHByb29mIGFuZCB2YWxpZGF0ZSB0aGUgZ2l2ZW4ga2V5IG93bmVyc2hpcCBwcm9vZvhhZ2FpbnN0IHRoZSBleHRyYWN0ZWQgb2ZmZW5kZXIuIElmIGJvdGggYXJlIHZhbGlkLCB0aGUgb2ZmZW5jZUR3aWxsIGJlIHJlcG9ydGVkLgANAVRoaXMgZXh0cmluc2ljIG11c3QgYmUgY2FsbGVkIHVuc2lnbmVkIGFuZCBpdCBpcyBleHBlY3RlZCB0aGF0IG9ubHkVAWJsb2NrIGF1dGhvcnMgd2lsbCBjYWxsIGl0ICh2YWxpZGF0ZWQgaW4gYFZhbGlkYXRlVW5zaWduZWRgKSwgYXMgc3VjaBUBaWYgdGhlIGJsb2NrIGF1dGhvciBpcyBkZWZpbmVkIGl0IHdpbGwgYmUgZGVmaW5lZCBhcyB0aGUgZXF1aXZvY2F0aW9uJHJlcG9ydGVyLjBub3RlX3N0YWxsZWQIARRkZWxheRABREJsb2NrTnVtYmVyRm9yPFQ+AAFsYmVzdF9maW5hbGl6ZWRfYmxvY2tfbnVtYmVyEAFEQmxvY2tOdW1iZXJGb3I8VD4AAjA9AU5vdGUgdGhhdCB0aGUgY3VycmVudCBhdXRob3JpdHkgc2V0IG9mIHRoZSBHUkFORFBBIGZpbmFsaXR5IGdhZGdldCBoYXMgc3RhbGxlZC4AYQFUaGlzIHdpbGwgdHJpZ2dlciBhIGZvcmNlZCBhdXRob3JpdHkgc2V0IGNoYW5nZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBuZXh0IHNlc3Npb24sIHRvYQFiZSBlbmFjdGVkIGBkZWxheWAgYmxvY2tzIGFmdGVyIHRoYXQuIFRoZSBgZGVsYXlgIHNob3VsZCBiZSBoaWdoIGVub3VnaCB0byBzYWZlbHkgYXNzdW1lSQF0aGF0IHRoZSBibG9jayBzaWduYWxsaW5nIHRoZSBmb3JjZWQgY2hhbmdlIHdpbGwgbm90IGJlIHJlLW9yZ2VkIGUuZy4gMTAwMCBibG9ja3MuXQFUaGUgYmxvY2sgcHJvZHVjdGlvbiByYXRlICh3aGljaCBtYXkgYmUgc2xvd2VkIGRvd24gYmVjYXVzZSBvZiBmaW5hbGl0eSBsYWdnaW5nKSBzaG91bGRRAWJlIHRha2VuIGludG8gYWNjb3VudCB3aGVuIGNob29zaW5nIHRoZSBgZGVsYXlgLiBUaGUgR1JBTkRQQSB2b3RlcnMgYmFzZWQgb24gdGhlIG5ld1UBYXV0aG9yaXR5IHdpbGwgc3RhcnQgdm90aW5nIG9uIHRvcCBvZiBgYmVzdF9maW5hbGl6ZWRfYmxvY2tfbnVtYmVyYCBmb3IgbmV3IGZpbmFsaXplZE0BYmxvY2tzLiBgYmVzdF9maW5hbGl6ZWRfYmxvY2tfbnVtYmVyYCBzaG91bGQgYmUgdGhlIGhpZ2hlc3Qgb2YgdGhlIGxhdGVzdCBmaW5hbGl6ZWTEYmxvY2sgb2YgYWxsIHZhbGlkYXRvcnMgb2YgdGhlIG5ldyBhdXRob3JpdHkgc2V0LgBYT25seSBjYWxsYWJsZSBieSByb290LgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy41AghQc3BfY29uc2Vuc3VzX2dyYW5kcGFERXF1aXZvY2F0aW9uUHJvb2YIBEgBNAROARAACAEYc2V0X2lkMAEUU2V0SWQAATBlcXVpdm9jYXRpb245AgFIRXF1aXZvY2F0aW9uPEgsIE4+AAA5AghQc3BfY29uc2Vuc3VzX2dyYW5kcGEwRXF1aXZvY2F0aW9uCARIATQETgEQAQgcUHJldm90ZQQAPQIBiQFmaW5hbGl0eV9ncmFuZHBhOjpFcXVpdm9jYXRpb248QXV0aG9yaXR5SWQsIGZpbmFsaXR5X2dyYW5kcGE6OlByZXZvdGU8CkgsIE4+LCBBdXRob3JpdHlTaWduYXR1cmUsPgAAACRQcmVjb21taXQEAFECAZEBZmluYWxpdHlfZ3JhbmRwYTo6RXF1aXZvY2F0aW9uPEF1dGhvcml0eUlkLCBmaW5hbGl0eV9ncmFuZHBhOjpQcmVjb21taXQKPEgsIE4+LCBBdXRob3JpdHlTaWduYXR1cmUsPgABAAA9AghAZmluYWxpdHlfZ3JhbmRwYTBFcXVpdm9jYXRpb24MCElkAdQEVgFBAgRTAUUCABABMHJvdW5kX251bWJlcjABDHU2NAABIGlkZW50aXR51AEISWQAARRmaXJzdE0CARgoViwgUykAARhzZWNvbmRNAgEYKFYsIFMpAABBAghAZmluYWxpdHlfZ3JhbmRwYRxQcmV2b3RlCARIATQETgEQAAgBLHRhcmdldF9oYXNoNAEESAABNHRhcmdldF9udW1iZXIQAQROAABFAgxQc3BfY29uc2Vuc3VzX2dyYW5kcGEMYXBwJFNpZ25hdHVyZQAABABJAgFIZWQyNTUxOTo6U2lnbmF0dXJlAABJAgAAA0AAAAAIAE0CAAAECEECRQIAUQIIQGZpbmFsaXR5X2dyYW5kcGEwRXF1aXZvY2F0aW9uDAhJZAHUBFYBVQIEUwFFAgAQATByb3VuZF9udW1iZXIwAQx1NjQAASBpZGVudGl0edQBCElkAAEUZmlyc3RZAgEYKFYsIFMpAAEYc2Vjb25kWQIBGChWLCBTKQAAVQIIQGZpbmFsaXR5X2dyYW5kcGEkUHJlY29tbWl0CARIATQETgEQAAgBLHRhcmdldF9oYXNoNAEESAABNHRhcmdldF9udW1iZXIQAQROAABZAgAABAhVAkUCAF0CDDxwYWxsZXRfdHJlYXN1cnkYcGFsbGV0EENhbGwIBFQABEkAARgsc3BlbmRfbG9jYWwIARhhbW91bnT8ATxCYWxhbmNlT2Y8VCwgST4AASxiZW5lZmljaWFyecUBAVBBY2NvdW50SWRMb29rdXBPZjxUPgADRLhQcm9wb3NlIGFuZCBhcHByb3ZlIGEgc3BlbmQgb2YgdHJlYXN1cnkgZnVuZHMuAEgjIyBEaXNwYXRjaCBPcmlnaW4ARQFNdXN0IGJlIFtgQ29uZmlnOjpTcGVuZE9yaWdpbmBdIHdpdGggdGhlIGBTdWNjZXNzYCB2YWx1ZSBiZWluZyBhdCBsZWFzdCBgYW1vdW50YC4ALCMjIyBEZXRhaWxzRQFOT1RFOiBGb3IgcmVjb3JkLWtlZXBpbmcgcHVycG9zZXMsIHRoZSBwcm9wb3NlciBpcyBkZWVtZWQgdG8gYmUgZXF1aXZhbGVudCB0byB0aGUwYmVuZWZpY2lhcnkuADgjIyMgUGFyYW1ldGVyc0EBLSBgYW1vdW50YDogVGhlIGFtb3VudCB0byBiZSB0cmFuc2ZlcnJlZCBmcm9tIHRoZSB0cmVhc3VyeSB0byB0aGUgYGJlbmVmaWNpYXJ5YC7oLSBgYmVuZWZpY2lhcnlgOiBUaGUgZGVzdGluYXRpb24gYWNjb3VudCBmb3IgdGhlIHRyYW5zZmVyLgAkIyMgRXZlbnRzALRFbWl0cyBbYEV2ZW50OjpTcGVuZEFwcHJvdmVkYF0gaWYgc3VjY2Vzc2Z1bC48cmVtb3ZlX2FwcHJvdmFsBAEscHJvcG9zYWxfaWTsATRQcm9wb3NhbEluZGV4AARULQFGb3JjZSBhIHByZXZpb3VzbHkgYXBwcm92ZWQgcHJvcG9zYWwgdG8gYmUgcmVtb3ZlZCBmcm9tIHRoZSBhcHByb3ZhbCBxdWV1ZS4ASCMjIERpc3BhdGNoIE9yaWdpbgCETXVzdCBiZSBbYENvbmZpZzo6UmVqZWN0T3JpZ2luYF0uACgjIyBEZXRhaWxzAMBUaGUgb3JpZ2luYWwgZGVwb3NpdCB3aWxsIG5vIGxvbmdlciBiZSByZXR1cm5lZC4AOCMjIyBQYXJhbWV0ZXJzoC0gYHByb3Bvc2FsX2lkYDogVGhlIGluZGV4IG9mIGEgcHJvcG9zYWwAOCMjIyBDb21wbGV4aXR5rC0gTyhBKSB3aGVyZSBgQWAgaXMgdGhlIG51bWJlciBvZiBhcHByb3ZhbHMAKCMjIyBFcnJvcnNFAS0gW2BFcnJvcjo6UHJvcG9zYWxOb3RBcHByb3ZlZGBdOiBUaGUgYHByb3Bvc2FsX2lkYCBzdXBwbGllZCB3YXMgbm90IGZvdW5kIGluIHRoZVEBICBhcHByb3ZhbCBxdWV1ZSwgaS5lLiwgdGhlIHByb3Bvc2FsIGhhcyBub3QgYmVlbiBhcHByb3ZlZC4gVGhpcyBjb3VsZCBhbHNvIG1lYW4gdGhlWQEgIHByb3Bvc2FsIGRvZXMgbm90IGV4aXN0IGFsdG9nZXRoZXIsIHRodXMgdGhlcmUgaXMgbm8gd2F5IGl0IHdvdWxkIGhhdmUgYmVlbiBhcHByb3ZlZFQgIGluIHRoZSBmaXJzdCBwbGFjZS4Uc3BlbmQQAShhc3NldF9raW5k3AFEQm94PFQ6OkFzc2V0S2luZD4AARhhbW91bnT8AVBBc3NldEJhbGFuY2VPZjxULCBJPgABLGJlbmVmaWNpYXJ5RQEBeEJveDxCZW5lZmljaWFyeUxvb2t1cE9mPFQsIEk+PgABKHZhbGlkX2Zyb21hAgFkT3B0aW9uPEJsb2NrTnVtYmVyRm9yPFQ+PgAFaLhQcm9wb3NlIGFuZCBhcHByb3ZlIGEgc3BlbmQgb2YgdHJlYXN1cnkgZnVuZHMuAEgjIyBEaXNwYXRjaCBPcmlnaW4AHQFNdXN0IGJlIFtgQ29uZmlnOjpTcGVuZE9yaWdpbmBdIHdpdGggdGhlIGBTdWNjZXNzYCB2YWx1ZSBiZWluZyBhdCBsZWFzdFUBYGFtb3VudGAgb2YgYGFzc2V0X2tpbmRgIGluIHRoZSBuYXRpdmUgYXNzZXQuIFRoZSBhbW91bnQgb2YgYGFzc2V0X2tpbmRgIGlzIGNvbnZlcnRlZNRmb3IgYXNzZXJ0aW9uIHVzaW5nIHRoZSBbYENvbmZpZzo6QmFsYW5jZUNvbnZlcnRlcmBdLgAoIyMgRGV0YWlscwBJAUNyZWF0ZSBhbiBhcHByb3ZlZCBzcGVuZCBmb3IgdHJhbnNmZXJyaW5nIGEgc3BlY2lmaWMgYGFtb3VudGAgb2YgYGFzc2V0X2tpbmRgIHRvIGFhAWRlc2lnbmF0ZWQgYmVuZWZpY2lhcnkuIFRoZSBzcGVuZCBtdXN0IGJlIGNsYWltZWQgdXNpbmcgdGhlIGBwYXlvdXRgIGRpc3BhdGNoYWJsZSB3aXRoaW50dGhlIFtgQ29uZmlnOjpQYXlvdXRQZXJpb2RgXS4AOCMjIyBQYXJhbWV0ZXJzFQEtIGBhc3NldF9raW5kYDogQW4gaW5kaWNhdG9yIG9mIHRoZSBzcGVjaWZpYyBhc3NldCBjbGFzcyB0byBiZSBzcGVudC5BAS0gYGFtb3VudGA6IFRoZSBhbW91bnQgdG8gYmUgdHJhbnNmZXJyZWQgZnJvbSB0aGUgdHJlYXN1cnkgdG8gdGhlIGBiZW5lZmljaWFyeWAuuC0gYGJlbmVmaWNpYXJ5YDogVGhlIGJlbmVmaWNpYXJ5IG9mIHRoZSBzcGVuZC5VAS0gYHZhbGlkX2Zyb21gOiBUaGUgYmxvY2sgbnVtYmVyIGZyb20gd2hpY2ggdGhlIHNwZW5kIGNhbiBiZSBjbGFpbWVkLiBJdCBjYW4gcmVmZXIgdG8ZASAgdGhlIHBhc3QgaWYgdGhlIHJlc3VsdGluZyBzcGVuZCBoYXMgbm90IHlldCBleHBpcmVkIGFjY29yZGluZyB0byB0aGVFASAgW2BDb25maWc6OlBheW91dFBlcmlvZGBdLiBJZiBgTm9uZWAsIHRoZSBzcGVuZCBjYW4gYmUgY2xhaW1lZCBpbW1lZGlhdGVseSBhZnRlciwgIGFwcHJvdmFsLgAkIyMgRXZlbnRzAMhFbWl0cyBbYEV2ZW50OjpBc3NldFNwZW5kQXBwcm92ZWRgXSBpZiBzdWNjZXNzZnVsLhhwYXlvdXQEARRpbmRleBABKFNwZW5kSW5kZXgABkw4Q2xhaW0gYSBzcGVuZC4ASCMjIERpc3BhdGNoIE9yaWdpbgA4TXVzdCBiZSBzaWduZWQAKCMjIERldGFpbHMAVQFTcGVuZHMgbXVzdCBiZSBjbGFpbWVkIHdpdGhpbiBzb21lIHRlbXBvcmFsIGJvdW5kcy4gQSBzcGVuZCBtYXkgYmUgY2xhaW1lZCB3aXRoaW4gb25l1FtgQ29uZmlnOjpQYXlvdXRQZXJpb2RgXSBmcm9tIHRoZSBgdmFsaWRfZnJvbWAgYmxvY2suVQFJbiBjYXNlIG9mIGEgcGF5b3V0IGZhaWx1cmUsIHRoZSBzcGVuZCBzdGF0dXMgbXVzdCBiZSB1cGRhdGVkIHdpdGggdGhlIGBjaGVja19zdGF0dXNg3GRpc3BhdGNoYWJsZSBiZWZvcmUgcmV0cnlpbmcgd2l0aCB0aGUgY3VycmVudCBmdW5jdGlvbi4AOCMjIyBQYXJhbWV0ZXJzbC0gYGluZGV4YDogVGhlIHNwZW5kIGluZGV4LgAkIyMgRXZlbnRzAJBFbWl0cyBbYEV2ZW50OjpQYWlkYF0gaWYgc3VjY2Vzc2Z1bC4wY2hlY2tfc3RhdHVzBAEUaW5kZXgQAShTcGVuZEluZGV4AAdMKQFDaGVjayB0aGUgc3RhdHVzIG9mIHRoZSBzcGVuZCBhbmQgcmVtb3ZlIGl0IGZyb20gdGhlIHN0b3JhZ2UgaWYgcHJvY2Vzc2VkLgBIIyMgRGlzcGF0Y2ggT3JpZ2luADxNdXN0IGJlIHNpZ25lZC4AKCMjIERldGFpbHMAAQFUaGUgc3RhdHVzIGNoZWNrIGlzIGEgcHJlcmVxdWlzaXRlIGZvciByZXRyeWluZyBhIGZhaWxlZCBwYXlvdXQuSQFJZiBhIHNwZW5kIGhhcyBlaXRoZXIgc3VjY2VlZGVkIG9yIGV4cGlyZWQsIGl0IGlzIHJlbW92ZWQgZnJvbSB0aGUgc3RvcmFnZSBieSB0aGlz7GZ1bmN0aW9uLiBJbiBzdWNoIGluc3RhbmNlcywgdHJhbnNhY3Rpb24gZmVlcyBhcmUgcmVmdW5kZWQuADgjIyMgUGFyYW1ldGVyc2wtIGBpbmRleGA6IFRoZSBzcGVuZCBpbmRleC4AJCMjIEV2ZW50cwD4RW1pdHMgW2BFdmVudDo6UGF5bWVudEZhaWxlZGBdIGlmIHRoZSBzcGVuZCBwYXlvdXQgaGFzIGZhaWxlZC4BAUVtaXRzIFtgRXZlbnQ6OlNwZW5kUHJvY2Vzc2VkYF0gaWYgdGhlIHNwZW5kIHBheW91dCBoYXMgc3VjY2VlZC4odm9pZF9zcGVuZAQBFGluZGV4EAEoU3BlbmRJbmRleAAIQHxWb2lkIHByZXZpb3VzbHkgYXBwcm92ZWQgc3BlbmQuAEgjIyBEaXNwYXRjaCBPcmlnaW4AhE11c3QgYmUgW2BDb25maWc6OlJlamVjdE9yaWdpbmBdLgAoIyMgRGV0YWlscwAdAUEgc3BlbmQgdm9pZCBpcyBvbmx5IHBvc3NpYmxlIGlmIHRoZSBwYXlvdXQgaGFzIG5vdCBiZWVuIGF0dGVtcHRlZCB5ZXQuADgjIyMgUGFyYW1ldGVyc2wtIGBpbmRleGA6IFRoZSBzcGVuZCBpbmRleC4AJCMjIEV2ZW50cwDARW1pdHMgW2BFdmVudDo6QXNzZXRTcGVuZFZvaWRlZGBdIGlmIHN1Y2Nlc3NmdWwuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLmECBBhPcHRpb24EBFQBEAEIEE5vbmUAAAAQU29tZQQAEAAAAQAAZQIMYHBhbGxldF9jb252aWN0aW9uX3ZvdGluZxhwYWxsZXQQQ2FsbAgEVAAESQABGBB2b3RlCAEocG9sbF9pbmRleOwBRFBvbGxJbmRleE9mPFQsIEk+AAEQdm90ZWkCAXBBY2NvdW50Vm90ZTxCYWxhbmNlT2Y8VCwgST4+AAAkGQFWb3RlIGluIGEgcG9sbC4gSWYgYHZvdGUuaXNfYXllKClgLCB0aGUgdm90ZSBpcyB0byBlbmFjdCB0aGUgcHJvcG9zYWw7uG90aGVyd2lzZSBpdCBpcyBhIHZvdGUgdG8ga2VlcCB0aGUgc3RhdHVzIHF1by4AyFRoZSBkaXNwYXRjaCBvcmlnaW4gb2YgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uAMgtIGBwb2xsX2luZGV4YDogVGhlIGluZGV4IG9mIHRoZSBwb2xsIHRvIHZvdGUgZm9yLoQtIGB2b3RlYDogVGhlIHZvdGUgY29uZmlndXJhdGlvbi4AFQFXZWlnaHQ6IGBPKFIpYCB3aGVyZSBSIGlzIHRoZSBudW1iZXIgb2YgcG9sbHMgdGhlIHZvdGVyIGhhcyB2b3RlZCBvbi4gZGVsZWdhdGUQARRjbGFzc20BATRDbGFzc09mPFQsIEk+AAEIdG/FAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AAShjb252aWN0aW9ucQIBKENvbnZpY3Rpb24AARxiYWxhbmNlGAE8QmFsYW5jZU9mPFQsIEk+AAFcTQFEZWxlZ2F0ZSB0aGUgdm90aW5nIHBvd2VyICh3aXRoIHNvbWUgZ2l2ZW4gY29udmljdGlvbikgb2YgdGhlIHNlbmRpbmcgYWNjb3VudCBmb3IgYWhwYXJ0aWN1bGFyIGNsYXNzIG9mIHBvbGxzLgBVAVRoZSBiYWxhbmNlIGRlbGVnYXRlZCBpcyBsb2NrZWQgZm9yIGFzIGxvbmcgYXMgaXQncyBkZWxlZ2F0ZWQsIGFuZCB0aGVyZWFmdGVyIGZvciB0aGXIdGltZSBhcHByb3ByaWF0ZSBmb3IgdGhlIGNvbnZpY3Rpb24ncyBsb2NrIHBlcmlvZC4AXQFUaGUgZGlzcGF0Y2ggb3JpZ2luIG9mIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfLCBhbmQgdGhlIHNpZ25pbmcgYWNjb3VudCBtdXN0IGVpdGhlcjp0ICAtIGJlIGRlbGVnYXRpbmcgYWxyZWFkeTsgb3JFASAgLSBoYXZlIG5vIHZvdGluZyBhY3Rpdml0eSAoaWYgdGhlcmUgaXMsIHRoZW4gaXQgd2lsbCBuZWVkIHRvIGJlIHJlbW92ZWQgdGhyb3VnaEwgICAgYHJlbW92ZV92b3RlYCkuAEUBLSBgdG9gOiBUaGUgYWNjb3VudCB3aG9zZSB2b3RpbmcgdGhlIGB0YXJnZXRgIGFjY291bnQncyB2b3RpbmcgcG93ZXIgd2lsbCBmb2xsb3cuXQEtIGBjbGFzc2A6IFRoZSBjbGFzcyBvZiBwb2xscyB0byBkZWxlZ2F0ZS4gVG8gZGVsZWdhdGUgbXVsdGlwbGUgY2xhc3NlcywgbXVsdGlwbGUgY2FsbHOAICB0byB0aGlzIGZ1bmN0aW9uIGFyZSByZXF1aXJlZC5VAS0gYGNvbnZpY3Rpb25gOiBUaGUgY29udmljdGlvbiB0aGF0IHdpbGwgYmUgYXR0YWNoZWQgdG8gdGhlIGRlbGVnYXRlZCB2b3Rlcy4gV2hlbiB0aGVBASAgYWNjb3VudCBpcyB1bmRlbGVnYXRlZCwgdGhlIGZ1bmRzIHdpbGwgYmUgbG9ja2VkIGZvciB0aGUgY29ycmVzcG9uZGluZyBwZXJpb2QuYQEtIGBiYWxhbmNlYDogVGhlIGFtb3VudCBvZiB0aGUgYWNjb3VudCdzIGJhbGFuY2UgdG8gYmUgdXNlZCBpbiBkZWxlZ2F0aW5nLiBUaGlzIG11c3Qgbm90tCAgYmUgbW9yZSB0aGFuIHRoZSBhY2NvdW50J3MgY3VycmVudCBiYWxhbmNlLgBIRW1pdHMgYERlbGVnYXRlZGAuACUBV2VpZ2h0OiBgTyhSKWAgd2hlcmUgUiBpcyB0aGUgbnVtYmVyIG9mIHBvbGxzIHRoZSB2b3RlciBkZWxlZ2F0aW5nIHRvIGhhc00BICB2b3RlZCBvbi4gV2VpZ2h0IGlzIGluaXRpYWxseSBjaGFyZ2VkIGFzIGlmIG1heGltdW0gdm90ZXMsIGJ1dCBpcyByZWZ1bmRlZCBsYXRlci4odW5kZWxlZ2F0ZQQBFGNsYXNzbQEBNENsYXNzT2Y8VCwgST4AAjhNAVVuZGVsZWdhdGUgdGhlIHZvdGluZyBwb3dlciBvZiB0aGUgc2VuZGluZyBhY2NvdW50IGZvciBhIHBhcnRpY3VsYXIgY2xhc3Mgb2YgcG9sbHMuAF0BVG9rZW5zIG1heSBiZSB1bmxvY2tlZCBmb2xsb3dpbmcgb25jZSBhbiBhbW91bnQgb2YgdGltZSBjb25zaXN0ZW50IHdpdGggdGhlIGxvY2sgcGVyaW9kCQFvZiB0aGUgY29udmljdGlvbiB3aXRoIHdoaWNoIHRoZSBkZWxlZ2F0aW9uIHdhcyBpc3N1ZWQgaGFzIHBhc3NlZC4ARQFUaGUgZGlzcGF0Y2ggb3JpZ2luIG9mIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfIGFuZCB0aGUgc2lnbmluZyBhY2NvdW50IG11c3QgYmVUY3VycmVudGx5IGRlbGVnYXRpbmcuAPAtIGBjbGFzc2A6IFRoZSBjbGFzcyBvZiBwb2xscyB0byByZW1vdmUgdGhlIGRlbGVnYXRpb24gZnJvbS4AUEVtaXRzIGBVbmRlbGVnYXRlZGAuACUBV2VpZ2h0OiBgTyhSKWAgd2hlcmUgUiBpcyB0aGUgbnVtYmVyIG9mIHBvbGxzIHRoZSB2b3RlciBkZWxlZ2F0aW5nIHRvIGhhc00BICB2b3RlZCBvbi4gV2VpZ2h0IGlzIGluaXRpYWxseSBjaGFyZ2VkIGFzIGlmIG1heGltdW0gdm90ZXMsIGJ1dCBpcyByZWZ1bmRlZCBsYXRlci4YdW5sb2NrCAEUY2xhc3NtAQE0Q2xhc3NPZjxULCBJPgABGHRhcmdldMUBAVBBY2NvdW50SWRMb29rdXBPZjxUPgADJF0BUmVtb3ZlIHRoZSBsb2NrIGNhdXNlZCBieSBwcmlvciB2b3RpbmcvZGVsZWdhdGluZyB3aGljaCBoYXMgZXhwaXJlZCB3aXRoaW4gYSBwYXJ0aWN1bGFyGGNsYXNzLgDIVGhlIGRpc3BhdGNoIG9yaWdpbiBvZiB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXy4AoC0gYGNsYXNzYDogVGhlIGNsYXNzIG9mIHBvbGxzIHRvIHVubG9jay64LSBgdGFyZ2V0YDogVGhlIGFjY291bnQgdG8gcmVtb3ZlIHRoZSBsb2NrIG9uLgC8V2VpZ2h0OiBgTyhSKWAgd2l0aCBSIG51bWJlciBvZiB2b3RlIG9mIHRhcmdldC4scmVtb3ZlX3ZvdGUIARRjbGFzc3UCAVRPcHRpb248Q2xhc3NPZjxULCBJPj4AARRpbmRleBABRFBvbGxJbmRleE9mPFQsIEk+AAR0ZFJlbW92ZSBhIHZvdGUgZm9yIGEgcG9sbC4ADElmOnAtIHRoZSBwb2xsIHdhcyBjYW5jZWxsZWQsIG9yZC0gdGhlIHBvbGwgaXMgb25nb2luZywgb3J4LSB0aGUgcG9sbCBoYXMgZW5kZWQgc3VjaCB0aGF0/CAgLSB0aGUgdm90ZSBvZiB0aGUgYWNjb3VudCB3YXMgaW4gb3Bwb3NpdGlvbiB0byB0aGUgcmVzdWx0OyBvctQgIC0gdGhlcmUgd2FzIG5vIGNvbnZpY3Rpb24gdG8gdGhlIGFjY291bnQncyB2b3RlOyBvcoQgIC0gdGhlIGFjY291bnQgbWFkZSBhIHNwbGl0IHZvdGVdAS4uLnRoZW4gdGhlIHZvdGUgaXMgcmVtb3ZlZCBjbGVhbmx5IGFuZCBhIGZvbGxvd2luZyBjYWxsIHRvIGB1bmxvY2tgIG1heSByZXN1bHQgaW4gbW9yZVhmdW5kcyBiZWluZyBhdmFpbGFibGUuAJBJZiwgaG93ZXZlciwgdGhlIHBvbGwgaGFzIGVuZGVkIGFuZDrsLSBpdCBmaW5pc2hlZCBjb3JyZXNwb25kaW5nIHRvIHRoZSB2b3RlIG9mIHRoZSBhY2NvdW50LCBhbmTcLSB0aGUgYWNjb3VudCBtYWRlIGEgc3RhbmRhcmQgdm90ZSB3aXRoIGNvbnZpY3Rpb24sIGFuZLwtIHRoZSBsb2NrIHBlcmlvZCBvZiB0aGUgY29udmljdGlvbiBpcyBub3Qgb3ZlclkBLi4udGhlbiB0aGUgbG9jayB3aWxsIGJlIGFnZ3JlZ2F0ZWQgaW50byB0aGUgb3ZlcmFsbCBhY2NvdW50J3MgbG9jaywgd2hpY2ggbWF5IGludm9sdmVZASpvdmVybG9ja2luZyogKHdoZXJlIHRoZSB0d28gbG9ja3MgYXJlIGNvbWJpbmVkIGludG8gYSBzaW5nbGUgbG9jayB0aGF0IGlzIHRoZSBtYXhpbXVt5G9mIGJvdGggdGhlIGFtb3VudCBsb2NrZWQgYW5kIHRoZSB0aW1lIGlzIGl0IGxvY2tlZCBmb3IpLgBJAVRoZSBkaXNwYXRjaCBvcmlnaW4gb2YgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8sIGFuZCB0aGUgc2lnbmVyIG11c3QgaGF2ZSBhIHZvdGVwcmVnaXN0ZXJlZCBmb3IgcG9sbCBgaW5kZXhgLgDcLSBgaW5kZXhgOiBUaGUgaW5kZXggb2YgcG9sbCBvZiB0aGUgdm90ZSB0byBiZSByZW1vdmVkLlUBLSBgY2xhc3NgOiBPcHRpb25hbCBwYXJhbWV0ZXIsIGlmIGdpdmVuIGl0IGluZGljYXRlcyB0aGUgY2xhc3Mgb2YgdGhlIHBvbGwuIEZvciBwb2xsc/AgIHdoaWNoIGhhdmUgZmluaXNoZWQgb3IgYXJlIGNhbmNlbGxlZCwgdGhpcyBtdXN0IGJlIGBTb21lYC4ARQFXZWlnaHQ6IGBPKFIgKyBsb2cgUilgIHdoZXJlIFIgaXMgdGhlIG51bWJlciBvZiBwb2xscyB0aGF0IGB0YXJnZXRgIGhhcyB2b3RlZCBvbi7YICBXZWlnaHQgaXMgY2FsY3VsYXRlZCBmb3IgdGhlIG1heGltdW0gbnVtYmVyIG9mIHZvdGUuRHJlbW92ZV9vdGhlcl92b3RlDAEYdGFyZ2V0xQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEUY2xhc3NtAQE0Q2xhc3NPZjxULCBJPgABFGluZGV4EAFEUG9sbEluZGV4T2Y8VCwgST4ABUBkUmVtb3ZlIGEgdm90ZSBmb3IgYSBwb2xsLgBNAUlmIHRoZSBgdGFyZ2V0YCBpcyBlcXVhbCB0byB0aGUgc2lnbmVyLCB0aGVuIHRoaXMgZnVuY3Rpb24gaXMgZXhhY3RseSBlcXVpdmFsZW50IHRvLQFgcmVtb3ZlX3ZvdGVgLiBJZiBub3QgZXF1YWwgdG8gdGhlIHNpZ25lciwgdGhlbiB0aGUgdm90ZSBtdXN0IGhhdmUgZXhwaXJlZCwlAWVpdGhlciBiZWNhdXNlIHRoZSBwb2xsIHdhcyBjYW5jZWxsZWQsIGJlY2F1c2UgdGhlIHZvdGVyIGxvc3QgdGhlIHBvbGwgb3KYYmVjYXVzZSB0aGUgY29udmljdGlvbiBwZXJpb2QgaXMgb3Zlci4AyFRoZSBkaXNwYXRjaCBvcmlnaW4gb2YgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uAGEBLSBgdGFyZ2V0YDogVGhlIGFjY291bnQgb2YgdGhlIHZvdGUgdG8gYmUgcmVtb3ZlZDsgdGhpcyBhY2NvdW50IG11c3QgaGF2ZSB2b3RlZCBmb3IgcG9sbCggIGBpbmRleGAu3C0gYGluZGV4YDogVGhlIGluZGV4IG9mIHBvbGwgb2YgdGhlIHZvdGUgdG8gYmUgcmVtb3ZlZC6ELSBgY2xhc3NgOiBUaGUgY2xhc3Mgb2YgdGhlIHBvbGwuAEUBV2VpZ2h0OiBgTyhSICsgbG9nIFIpYCB3aGVyZSBSIGlzIHRoZSBudW1iZXIgb2YgcG9sbHMgdGhhdCBgdGFyZ2V0YCBoYXMgdm90ZWQgb24u2CAgV2VpZ2h0IGlzIGNhbGN1bGF0ZWQgZm9yIHRoZSBtYXhpbXVtIG51bWJlciBvZiB2b3RlLgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy5pAgxgcGFsbGV0X2NvbnZpY3Rpb25fdm90aW5nEHZvdGUsQWNjb3VudFZvdGUEHEJhbGFuY2UBGAEMIFN0YW5kYXJkCAEQdm90ZW0CARBWb3RlAAEcYmFsYW5jZRgBHEJhbGFuY2UAAAAUU3BsaXQIAQxheWUYARxCYWxhbmNlAAEMbmF5GAEcQmFsYW5jZQABADBTcGxpdEFic3RhaW4MAQxheWUYARxCYWxhbmNlAAEMbmF5GAEcQmFsYW5jZQABHGFic3RhaW4YARxCYWxhbmNlAAIAAG0CDGBwYWxsZXRfY29udmljdGlvbl92b3RpbmcQdm90ZRBWb3RlAAAEAAgAAABxAgxgcGFsbGV0X2NvbnZpY3Rpb25fdm90aW5nKGNvbnZpY3Rpb24oQ29udmljdGlvbgABHBBOb25lAAAAIExvY2tlZDF4AAEAIExvY2tlZDJ4AAIAIExvY2tlZDN4AAMAIExvY2tlZDR4AAQAIExvY2tlZDV4AAUAIExvY2tlZDZ4AAYAAHUCBBhPcHRpb24EBFQBbQEBCBBOb25lAAAAEFNvbWUEAG0BAAABAAB5AgxAcGFsbGV0X3JlZmVyZW5kYRhwYWxsZXQQQ2FsbAgEVAAESQABJBhzdWJtaXQMATxwcm9wb3NhbF9vcmlnaW59AgFcQm94PFBhbGxldHNPcmlnaW5PZjxUPj4AASBwcm9wb3NhbHEBAUxCb3VuZGVkQ2FsbE9mPFQsIEk+AAFAZW5hY3RtZW50X21vbWVudJkCAXxEaXNwYXRjaFRpbWU8QmxvY2tOdW1iZXJGb3I8VD4+AAAksFByb3Bvc2UgYSByZWZlcmVuZHVtIG9uIGEgcHJpdmlsZWdlZCBhY3Rpb24uAFkBLSBgb3JpZ2luYDogbXVzdCBiZSBgU3VibWl0T3JpZ2luYCBhbmQgdGhlIGFjY291bnQgbXVzdCBoYXZlIGBTdWJtaXNzaW9uRGVwb3NpdGAgZnVuZHMwICBhdmFpbGFibGUuLQEtIGBwcm9wb3NhbF9vcmlnaW5gOiBUaGUgb3JpZ2luIGZyb20gd2hpY2ggdGhlIHByb3Bvc2FsIHNob3VsZCBiZSBleGVjdXRlZC5sLSBgcHJvcG9zYWxgOiBUaGUgcHJvcG9zYWwuFQEtIGBlbmFjdG1lbnRfbW9tZW50YDogVGhlIG1vbWVudCB0aGF0IHRoZSBwcm9wb3NhbCBzaG91bGQgYmUgZW5hY3RlZC4ASEVtaXRzIGBTdWJtaXR0ZWRgLlhwbGFjZV9kZWNpc2lvbl9kZXBvc2l0BAEUaW5kZXgQATxSZWZlcmVuZHVtSW5kZXgAASCsUG9zdCB0aGUgRGVjaXNpb24gRGVwb3NpdCBmb3IgYSByZWZlcmVuZHVtLgA5AS0gYG9yaWdpbmA6IG11c3QgYmUgYFNpZ25lZGAgYW5kIHRoZSBhY2NvdW50IG11c3QgaGF2ZSBmdW5kcyBhdmFpbGFibGUgZm9yIHRoZaAgIHJlZmVyZW5kdW0ncyB0cmFjaydzIERlY2lzaW9uIERlcG9zaXQuUQEtIGBpbmRleGA6IFRoZSBpbmRleCBvZiB0aGUgc3VibWl0dGVkIHJlZmVyZW5kdW0gd2hvc2UgRGVjaXNpb24gRGVwb3NpdCBpcyB5ZXQgdG8gYmUkICBwb3N0ZWQuAHhFbWl0cyBgRGVjaXNpb25EZXBvc2l0UGxhY2VkYC5ccmVmdW5kX2RlY2lzaW9uX2RlcG9zaXQEARRpbmRleBABPFJlZmVyZW5kdW1JbmRleAACHCkBUmVmdW5kIHRoZSBEZWNpc2lvbiBEZXBvc2l0IGZvciBhIGNsb3NlZCByZWZlcmVuZHVtIGJhY2sgdG8gdGhlIGRlcG9zaXRvci4AnC0gYG9yaWdpbmA6IG11c3QgYmUgYFNpZ25lZGAgb3IgYFJvb3RgLk0BLSBgaW5kZXhgOiBUaGUgaW5kZXggb2YgYSBjbG9zZWQgcmVmZXJlbmR1bSB3aG9zZSBEZWNpc2lvbiBEZXBvc2l0IGhhcyBub3QgeWV0IGJlZW4sICByZWZ1bmRlZC4AgEVtaXRzIGBEZWNpc2lvbkRlcG9zaXRSZWZ1bmRlZGAuGGNhbmNlbAQBFGluZGV4EAE8UmVmZXJlbmR1bUluZGV4AAMYdENhbmNlbCBhbiBvbmdvaW5nIHJlZmVyZW5kdW0uAJwtIGBvcmlnaW5gOiBtdXN0IGJlIHRoZSBgQ2FuY2VsT3JpZ2luYC7cLSBgaW5kZXhgOiBUaGUgaW5kZXggb2YgdGhlIHJlZmVyZW5kdW0gdG8gYmUgY2FuY2VsbGVkLgBIRW1pdHMgYENhbmNlbGxlZGAuEGtpbGwEARRpbmRleBABPFJlZmVyZW5kdW1JbmRleAAEGNBDYW5jZWwgYW4gb25nb2luZyByZWZlcmVuZHVtIGFuZCBzbGFzaCB0aGUgZGVwb3NpdHMuAJQtIGBvcmlnaW5gOiBtdXN0IGJlIHRoZSBgS2lsbE9yaWdpbmAu3C0gYGluZGV4YDogVGhlIGluZGV4IG9mIHRoZSByZWZlcmVuZHVtIHRvIGJlIGNhbmNlbGxlZC4AkEVtaXRzIGBLaWxsZWRgIGFuZCBgRGVwb3NpdFNsYXNoZWRgLkBudWRnZV9yZWZlcmVuZHVtBAEUaW5kZXgQATxSZWZlcmVuZHVtSW5kZXgABRAdAUFkdmFuY2UgYSByZWZlcmVuZHVtIG9udG8gaXRzIG5leHQgbG9naWNhbCBzdGF0ZS4gT25seSB1c2VkIGludGVybmFsbHkuAGwtIGBvcmlnaW5gOiBtdXN0IGJlIGBSb290YC6kLSBgaW5kZXhgOiB0aGUgcmVmZXJlbmR1bSB0byBiZSBhZHZhbmNlZC5Ib25lX2Zld2VyX2RlY2lkaW5nBAEUdHJhY2ttAQE8VHJhY2tJZE9mPFQsIEk+AAYkCQFBZHZhbmNlIGEgdHJhY2sgb250byBpdHMgbmV4dCBsb2dpY2FsIHN0YXRlLiBPbmx5IHVzZWQgaW50ZXJuYWxseS4AbC0gYG9yaWdpbmA6IG11c3QgYmUgYFJvb3RgLpAtIGB0cmFja2A6IHRoZSB0cmFjayB0byBiZSBhZHZhbmNlZC4AUQFBY3Rpb24gaXRlbSBmb3Igd2hlbiB0aGVyZSBpcyBub3cgb25lIGZld2VyIHJlZmVyZW5kdW0gaW4gdGhlIGRlY2lkaW5nIHBoYXNlIGFuZCB0aGUVAWBEZWNpZGluZ0NvdW50YCBpcyBub3QgeWV0IHVwZGF0ZWQuIFRoaXMgbWVhbnMgdGhhdCB3ZSBzaG91bGQgZWl0aGVyOiUBLSBiZWdpbiBkZWNpZGluZyBhbm90aGVyIHJlZmVyZW5kdW0gKGFuZCBsZWF2ZSBgRGVjaWRpbmdDb3VudGAgYWxvbmUpOyBvcnAtIGRlY3JlbWVudCBgRGVjaWRpbmdDb3VudGAuZHJlZnVuZF9zdWJtaXNzaW9uX2RlcG9zaXQEARRpbmRleBABPFJlZmVyZW5kdW1JbmRleAAHHDEBUmVmdW5kIHRoZSBTdWJtaXNzaW9uIERlcG9zaXQgZm9yIGEgY2xvc2VkIHJlZmVyZW5kdW0gYmFjayB0byB0aGUgZGVwb3NpdG9yLgCcLSBgb3JpZ2luYDogbXVzdCBiZSBgU2lnbmVkYCBvciBgUm9vdGAuVQEtIGBpbmRleGA6IFRoZSBpbmRleCBvZiBhIGNsb3NlZCByZWZlcmVuZHVtIHdob3NlIFN1Ym1pc3Npb24gRGVwb3NpdCBoYXMgbm90IHlldCBiZWVuLCAgcmVmdW5kZWQuAIhFbWl0cyBgU3VibWlzc2lvbkRlcG9zaXRSZWZ1bmRlZGAuMHNldF9tZXRhZGF0YQgBFGluZGV4EAE8UmVmZXJlbmR1bUluZGV4AAEobWF5YmVfaGFzaJ0CATxPcHRpb248VDo6SGFzaD4ACByYU2V0IG9yIGNsZWFyIG1ldGFkYXRhIG9mIGEgcmVmZXJlbmR1bS4ALFBhcmFtZXRlcnM6RQEtIGBvcmlnaW5gOiBNdXN0IGJlIGBTaWduZWRgIGJ5IGEgY3JlYXRvciBvZiBhIHJlZmVyZW5kdW0gb3IgYnkgYW55b25lIHRvIGNsZWFyIGGQICBtZXRhZGF0YSBvZiBhIGZpbmlzaGVkIHJlZmVyZW5kdW0uDQEtIGBpbmRleGA6ICBUaGUgaW5kZXggb2YgYSByZWZlcmVuZHVtIHRvIHNldCBvciBjbGVhciBtZXRhZGF0YSBmb3IuUQEtIGBtYXliZV9oYXNoYDogVGhlIGhhc2ggb2YgYW4gb24tY2hhaW4gc3RvcmVkIHByZWltYWdlLiBgTm9uZWAgdG8gY2xlYXIgYSBtZXRhZGF0YS4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMufQIINHBhc2VvX3J1bnRpbWUwT3JpZ2luQ2FsbGVyAAEUGHN5c3RlbQQAgQIBdGZyYW1lX3N5c3RlbTo6T3JpZ2luPFJ1bnRpbWU+AAAAHE9yaWdpbnMEAIUCAXRwYWxsZXRfY3VzdG9tX29yaWdpbnM6Ok9yaWdpbgAWAEBQYXJhY2hhaW5zT3JpZ2luBACJAgFkcGFyYWNoYWluc19vcmlnaW46Ok9yaWdpbgAyACRYY21QYWxsZXQEAJECAUhwYWxsZXRfeGNtOjpPcmlnaW4AYwAQVm9pZAQAlQIBQQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6Cl9fcHJpdmF0ZTo6Vm9pZAAEAACBAgw0ZnJhbWVfc3VwcG9ydCBkaXNwYXRjaCRSYXdPcmlnaW4EJEFjY291bnRJZAEAAQwQUm9vdAAAABhTaWduZWQEAAABJEFjY291bnRJZAABABBOb25lAAIAAIUCFDRwYXNlb19ydW50aW1lKGdvdmVybmFuY2Ucb3JpZ2luc1RwYWxsZXRfY3VzdG9tX29yaWdpbnMYT3JpZ2luAAE8MFN0YWtpbmdBZG1pbgAAACRUcmVhc3VyZXIAAQA8RmVsbG93c2hpcEFkbWluAAIAMEdlbmVyYWxBZG1pbgADADBBdWN0aW9uQWRtaW4ABAAoTGVhc2VBZG1pbgAFAExSZWZlcmVuZHVtQ2FuY2VsbGVyAAYAQFJlZmVyZW5kdW1LaWxsZXIABwAsU21hbGxUaXBwZXIACAAkQmlnVGlwcGVyAAkAMFNtYWxsU3BlbmRlcgAKADRNZWRpdW1TcGVuZGVyAAsAKEJpZ1NwZW5kZXIADABEV2hpdGVsaXN0ZWRDYWxsZXIADQA0V2lzaEZvckNoYW5nZQAOAACJAhBscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zGG9yaWdpbhhwYWxsZXQYT3JpZ2luAAEEJFBhcmFjaGFpbgQAjQIBGFBhcmFJZAAAAACNAgx0cG9sa2Fkb3RfcGFyYWNoYWluX3ByaW1pdGl2ZXMocHJpbWl0aXZlcwhJZAAABAAQAQx1MzIAAJECDChwYWxsZXRfeGNtGHBhbGxldBhPcmlnaW4AAQgMWGNtBAANAQEgTG9jYXRpb24AAAAgUmVzcG9uc2UEAA0BASBMb2NhdGlvbgABAACVAggcc3BfY29yZRBWb2lkAAEAAJkCEDRmcmFtZV9zdXBwb3J0GHRyYWl0cyBzY2hlZHVsZTBEaXNwYXRjaFRpbWUELEJsb2NrTnVtYmVyARABCAhBdAQAEAEsQmxvY2tOdW1iZXIAAAAUQWZ0ZXIEABABLEJsb2NrTnVtYmVyAAEAAJ0CBBhPcHRpb24EBFQBNAEIEE5vbmUAAAAQU29tZQQANAAAAQAAoQIMQHBhbGxldF93aGl0ZWxpc3QYcGFsbGV0EENhbGwEBFQAARA4d2hpdGVsaXN0X2NhbGwEASRjYWxsX2hhc2g0ARxUOjpIYXNoAAAAXHJlbW92ZV93aGl0ZWxpc3RlZF9jYWxsBAEkY2FsbF9oYXNoNAEcVDo6SGFzaAABAGRkaXNwYXRjaF93aGl0ZWxpc3RlZF9jYWxsDAEkY2FsbF9oYXNoNAEcVDo6SGFzaAABQGNhbGxfZW5jb2RlZF9sZW4QAQx1MzIAAUxjYWxsX3dlaWdodF93aXRuZXNzKAEYV2VpZ2h0AAIAnGRpc3BhdGNoX3doaXRlbGlzdGVkX2NhbGxfd2l0aF9wcmVpbWFnZQQBEGNhbGx1AQF8Qm94PDxUIGFzIENvbmZpZz46OlJ1bnRpbWVDYWxsPgADAAQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy6lAgxEcGFsbGV0X3BhcmFtZXRlcnMYcGFsbGV0EENhbGwEBFQAAQQ0c2V0X3BhcmFtZXRlcgQBJGtleV92YWx1ZakCAVBUOjpSdW50aW1lUGFyYW1ldGVycwAAEHRTZXQgdGhlIHZhbHVlIG9mIGEgcGFyYW1ldGVyLgBVAVRoZSBkaXNwYXRjaCBvcmlnaW4gb2YgdGhpcyBjYWxsIG11c3QgYmUgYEFkbWluT3JpZ2luYCBmb3IgdGhlIGdpdmVuIGBrZXlgLiBWYWx1ZXMgYmWIZGVsZXRlZCBieSBzZXR0aW5nIHRoZW0gdG8gYE5vbmVgLgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy6pAgg0cGFzZW9fcnVudGltZURSdW50aW1lUGFyYW1ldGVycwABBCRJbmZsYXRpb24EAK0CAZRkeW5hbWljX3BhcmFtczo6aW5mbGF0aW9uOjpQYXJhbWV0ZXJzAAAAAK0CEDRwYXNlb19ydW50aW1lOGR5bmFtaWNfcGFyYW1zJGluZmxhdGlvbihQYXJhbWV0ZXJzAAEUME1pbkluZmxhdGlvbggAsQIBME1pbkluZmxhdGlvbgAAtQIBTE9wdGlvbjxQZXJxdWludGlsbD4AAAAwTWF4SW5mbGF0aW9uCAC9AgEwTWF4SW5mbGF0aW9uAAC1AgFMT3B0aW9uPFBlcnF1aW50aWxsPgABAChJZGVhbFN0YWtlCADBAgEoSWRlYWxTdGFrZQAAtQIBTE9wdGlvbjxQZXJxdWludGlsbD4AAgAcRmFsbG9mZggAxQIBHEZhbGxvZmYAALUCAUxPcHRpb248UGVycXVpbnRpbGw+AAMAPFVzZUF1Y3Rpb25TbG90cwgAyQIBPFVzZUF1Y3Rpb25TbG90cwAAzQIBME9wdGlvbjxib29sPgAEAACxAhA0cGFzZW9fcnVudGltZThkeW5hbWljX3BhcmFtcyRpbmZsYXRpb24wTWluSW5mbGF0aW9uAAAAALUCBBhPcHRpb24EBFQBuQIBCBBOb25lAAAAEFNvbWUEALkCAAABAAC5Agw0c3BfYXJpdGhtZXRpYyhwZXJfdGhpbmdzLFBlcnF1aW50aWxsAAAEADABDHU2NAAAvQIQNHBhc2VvX3J1bnRpbWU4ZHluYW1pY19wYXJhbXMkaW5mbGF0aW9uME1heEluZmxhdGlvbgAAAADBAhA0cGFzZW9fcnVudGltZThkeW5hbWljX3BhcmFtcyRpbmZsYXRpb24oSWRlYWxTdGFrZQAAAADFAhA0cGFzZW9fcnVudGltZThkeW5hbWljX3BhcmFtcyRpbmZsYXRpb24cRmFsbG9mZgAAAADJAhA0cGFzZW9fcnVudGltZThkeW5hbWljX3BhcmFtcyRpbmZsYXRpb248VXNlQXVjdGlvblNsb3RzAAAAAM0CBBhPcHRpb24EBFQBIAEIEE5vbmUAAAAQU29tZQQAIAAAAQAA0QIQXHBvbGthZG90X3J1bnRpbWVfY29tbW9uGGNsYWltcxhwYWxsZXQQQ2FsbAQEVAABFBRjbGFpbQgBEGRlc3QAATBUOjpBY2NvdW50SWQAAUhldGhlcmV1bV9zaWduYXR1cmXVAgE4RWNkc2FTaWduYXR1cmUAAGCITWFrZSBhIGNsYWltIHRvIGNvbGxlY3QgeW91ciBET1RzLgDEVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX05vbmVfLgBQVW5zaWduZWQgVmFsaWRhdGlvbjoFAUEgY2FsbCB0byBjbGFpbSBpcyBkZWVtZWQgdmFsaWQgaWYgdGhlIHNpZ25hdHVyZSBwcm92aWRlZCBtYXRjaGVzfHRoZSBleHBlY3RlZCBzaWduZWQgbWVzc2FnZSBvZjoAaD4gRXRoZXJldW0gU2lnbmVkIE1lc3NhZ2U6lD4gKGNvbmZpZ3VyZWQgcHJlZml4IHN0cmluZykoYWRkcmVzcykApGFuZCBgYWRkcmVzc2AgbWF0Y2hlcyB0aGUgYGRlc3RgIGFjY291bnQuACxQYXJhbWV0ZXJzOtgtIGBkZXN0YDogVGhlIGRlc3RpbmF0aW9uIGFjY291bnQgdG8gcGF5b3V0IHRoZSBjbGFpbS5dAS0gYGV0aGVyZXVtX3NpZ25hdHVyZWA6IFRoZSBzaWduYXR1cmUgb2YgYW4gZXRoZXJldW0gc2lnbmVkIG1lc3NhZ2UgbWF0Y2hpbmcgdGhlIGZvcm1hdEggIGRlc2NyaWJlZCBhYm92ZS4AIDx3ZWlnaHQ+/FRoZSB3ZWlnaHQgb2YgdGhpcyBjYWxsIGlzIGludmFyaWFudCBvdmVyIHRoZSBpbnB1dCBwYXJhbWV0ZXJzLuBXZWlnaHQgaW5jbHVkZXMgbG9naWMgdG8gdmFsaWRhdGUgdW5zaWduZWQgYGNsYWltYCBjYWxsLgBYVG90YWwgQ29tcGxleGl0eTogTygxKSQ8L3dlaWdodD4obWludF9jbGFpbRABDHdob90CATxFdGhlcmV1bUFkZHJlc3MAARR2YWx1ZRgBMEJhbGFuY2VPZjxUPgABQHZlc3Rpbmdfc2NoZWR1bGXhAgHcT3B0aW9uPChCYWxhbmNlT2Y8VD4sIEJhbGFuY2VPZjxUPiwgQmxvY2tOdW1iZXJGb3I8VD4pPgABJHN0YXRlbWVudOkCAVRPcHRpb248U3RhdGVtZW50S2luZD4AATyETWludCBhIG5ldyBjbGFpbSB0byBjb2xsZWN0IERPVHMuAMRUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfUm9vdF8uACxQYXJhbWV0ZXJzOvAtIGB3aG9gOiBUaGUgRXRoZXJldW0gYWRkcmVzcyBhbGxvd2VkIHRvIGNvbGxlY3QgdGhpcyBjbGFpbS7MLSBgdmFsdWVgOiBUaGUgbnVtYmVyIG9mIERPVHMgdGhhdCB3aWxsIGJlIGNsYWltZWQuCQEtIGB2ZXN0aW5nX3NjaGVkdWxlYDogQW4gb3B0aW9uYWwgdmVzdGluZyBzY2hlZHVsZSBmb3IgdGhlc2UgRE9Ucy4AIDx3ZWlnaHQ+/FRoZSB3ZWlnaHQgb2YgdGhpcyBjYWxsIGlzIGludmFyaWFudCBvdmVyIHRoZSBpbnB1dCBwYXJhbWV0ZXJzLh0BV2UgYXNzdW1lIHdvcnN0IGNhc2UgdGhhdCBib3RoIHZlc3RpbmcgYW5kIHN0YXRlbWVudCBpcyBiZWluZyBpbnNlcnRlZC4AWFRvdGFsIENvbXBsZXhpdHk6IE8oMSkkPC93ZWlnaHQ+MGNsYWltX2F0dGVzdAwBEGRlc3QAATBUOjpBY2NvdW50SWQAAUhldGhlcmV1bV9zaWduYXR1cmXVAgE4RWNkc2FTaWduYXR1cmUAASRzdGF0ZW1lbnQ4ARxWZWM8dTg+AAJs5E1ha2UgYSBjbGFpbSB0byBjb2xsZWN0IHlvdXIgRE9UcyBieSBzaWduaW5nIGEgc3RhdGVtZW50LgDEVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX05vbmVfLgBQVW5zaWduZWQgVmFsaWRhdGlvbjopAUEgY2FsbCB0byBgY2xhaW1fYXR0ZXN0YCBpcyBkZWVtZWQgdmFsaWQgaWYgdGhlIHNpZ25hdHVyZSBwcm92aWRlZCBtYXRjaGVzfHRoZSBleHBlY3RlZCBzaWduZWQgbWVzc2FnZSBvZjoAaD4gRXRoZXJldW0gU2lnbmVkIE1lc3NhZ2U6wD4gKGNvbmZpZ3VyZWQgcHJlZml4IHN0cmluZykoYWRkcmVzcykoc3RhdGVtZW50KQBJAWFuZCBgYWRkcmVzc2AgbWF0Y2hlcyB0aGUgYGRlc3RgIGFjY291bnQ7IHRoZSBgc3RhdGVtZW50YCBtdXN0IG1hdGNoIHRoYXQgd2hpY2ggaXPAZXhwZWN0ZWQgYWNjb3JkaW5nIHRvIHlvdXIgcHVyY2hhc2UgYXJyYW5nZW1lbnQuACxQYXJhbWV0ZXJzOtgtIGBkZXN0YDogVGhlIGRlc3RpbmF0aW9uIGFjY291bnQgdG8gcGF5b3V0IHRoZSBjbGFpbS5dAS0gYGV0aGVyZXVtX3NpZ25hdHVyZWA6IFRoZSBzaWduYXR1cmUgb2YgYW4gZXRoZXJldW0gc2lnbmVkIG1lc3NhZ2UgbWF0Y2hpbmcgdGhlIGZvcm1hdEggIGRlc2NyaWJlZCBhYm92ZS45AS0gYHN0YXRlbWVudGA6IFRoZSBpZGVudGl0eSBvZiB0aGUgc3RhdGVtZW50IHdoaWNoIGlzIGJlaW5nIGF0dGVzdGVkIHRvIGluIHRoZTAgIHNpZ25hdHVyZS4AIDx3ZWlnaHQ+/FRoZSB3ZWlnaHQgb2YgdGhpcyBjYWxsIGlzIGludmFyaWFudCBvdmVyIHRoZSBpbnB1dCBwYXJhbWV0ZXJzLvxXZWlnaHQgaW5jbHVkZXMgbG9naWMgdG8gdmFsaWRhdGUgdW5zaWduZWQgYGNsYWltX2F0dGVzdGAgY2FsbC4AWFRvdGFsIENvbXBsZXhpdHk6IE8oMSkkPC93ZWlnaHQ+GGF0dGVzdAQBJHN0YXRlbWVudDgBHFZlYzx1OD4AA0z0QXR0ZXN0IHRvIGEgc3RhdGVtZW50LCBuZWVkZWQgdG8gZmluYWxpemUgdGhlIGNsYWltcyBwcm9jZXNzLgAZAVdBUk5JTkc6IEluc2VjdXJlIHVubGVzcyB5b3VyIGNoYWluIGluY2x1ZGVzIGBQcmV2YWxpZGF0ZUF0dGVzdHNgIGFzIGFIYFNpZ25lZEV4dGVuc2lvbmAuAFBVbnNpZ25lZCBWYWxpZGF0aW9uOikBQSBjYWxsIHRvIGF0dGVzdCBpcyBkZWVtZWQgdmFsaWQgaWYgdGhlIHNlbmRlciBoYXMgYSBgUHJlY2xhaW1gIHJlZ2lzdGVyZWT0YW5kIHByb3ZpZGVzIGEgYHN0YXRlbWVudGAgd2hpY2ggaXMgZXhwZWN0ZWQgZm9yIHRoZSBhY2NvdW50LgAsUGFyYW1ldGVyczo5AS0gYHN0YXRlbWVudGA6IFRoZSBpZGVudGl0eSBvZiB0aGUgc3RhdGVtZW50IHdoaWNoIGlzIGJlaW5nIGF0dGVzdGVkIHRvIGluIHRoZTAgIHNpZ25hdHVyZS4AIDx3ZWlnaHQ+/FRoZSB3ZWlnaHQgb2YgdGhpcyBjYWxsIGlzIGludmFyaWFudCBvdmVyIHRoZSBpbnB1dCBwYXJhbWV0ZXJzLvBXZWlnaHQgaW5jbHVkZXMgbG9naWMgdG8gZG8gcHJlLXZhbGlkYXRpb24gb24gYGF0dGVzdGAgY2FsbC4AWFRvdGFsIENvbXBsZXhpdHk6IE8oMSkkPC93ZWlnaHQ+KG1vdmVfY2xhaW0MAQxvbGTdAgE8RXRoZXJldW1BZGRyZXNzAAEMbmV33QIBPEV0aGVyZXVtQWRkcmVzcwABOG1heWJlX3ByZWNsYWlt/QEBUE9wdGlvbjxUOjpBY2NvdW50SWQ+AAQABA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLtUCDFxwb2xrYWRvdF9ydW50aW1lX2NvbW1vbhhjbGFpbXM4RWNkc2FTaWduYXR1cmUAAAQA2QIBIFt1ODsgNjVdAADZAgAAA0EAAAAIAN0CDFxwb2xrYWRvdF9ydW50aW1lX2NvbW1vbhhjbGFpbXM8RXRoZXJldW1BZGRyZXNzAAAEAPgBIFt1ODsgMjBdAADhAgQYT3B0aW9uBARUAeUCAQgQTm9uZQAAABBTb21lBADlAgAAAQAA5QIAAAQMGBgQAOkCBBhPcHRpb24EBFQB7QIBCBBOb25lAAAAEFNvbWUEAO0CAAABAADtAgxccG9sa2Fkb3RfcnVudGltZV9jb21tb24YY2xhaW1zNFN0YXRlbWVudEtpbmQAAQgcUmVndWxhcgAAABBTYWZ0AAEAAPECDDhwYWxsZXRfdmVzdGluZxhwYWxsZXQQQ2FsbAQEVAABGBB2ZXN0AAAkuFVubG9jayBhbnkgdmVzdGVkIGZ1bmRzIG9mIHRoZSBzZW5kZXIgYWNjb3VudC4AXQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXyBhbmQgdGhlIHNlbmRlciBtdXN0IGhhdmUgZnVuZHMgc3RpbGxkbG9ja2VkIHVuZGVyIHRoaXMgcGFsbGV0LgDQRW1pdHMgZWl0aGVyIGBWZXN0aW5nQ29tcGxldGVkYCBvciBgVmVzdGluZ1VwZGF0ZWRgLgA0IyMgQ29tcGxleGl0eSQtIGBPKDEpYC4odmVzdF9vdGhlcgQBGHRhcmdldMUBAVBBY2NvdW50SWRMb29rdXBPZjxUPgABLLhVbmxvY2sgYW55IHZlc3RlZCBmdW5kcyBvZiBhIGB0YXJnZXRgIGFjY291bnQuAMxUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXy4AUQEtIGB0YXJnZXRgOiBUaGUgYWNjb3VudCB3aG9zZSB2ZXN0ZWQgZnVuZHMgc2hvdWxkIGJlIHVubG9ja2VkLiBNdXN0IGhhdmUgZnVuZHMgc3RpbGxkbG9ja2VkIHVuZGVyIHRoaXMgcGFsbGV0LgDQRW1pdHMgZWl0aGVyIGBWZXN0aW5nQ29tcGxldGVkYCBvciBgVmVzdGluZ1VwZGF0ZWRgLgA0IyMgQ29tcGxleGl0eSQtIGBPKDEpYC48dmVzdGVkX3RyYW5zZmVyCAEYdGFyZ2V0xQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEgc2NoZWR1bGX1AgGwVmVzdGluZ0luZm88QmFsYW5jZU9mPFQ+LCBCbG9ja051bWJlckZvcjxUPj4AAjRkQ3JlYXRlIGEgdmVzdGVkIHRyYW5zZmVyLgDMVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uAMwtIGB0YXJnZXRgOiBUaGUgYWNjb3VudCByZWNlaXZpbmcgdGhlIHZlc3RlZCBmdW5kcy7wLSBgc2NoZWR1bGVgOiBUaGUgdmVzdGluZyBzY2hlZHVsZSBhdHRhY2hlZCB0byB0aGUgdHJhbnNmZXIuAFxFbWl0cyBgVmVzdGluZ0NyZWF0ZWRgLgD8Tk9URTogVGhpcyB3aWxsIHVubG9jayBhbGwgc2NoZWR1bGVzIHRocm91Z2ggdGhlIGN1cnJlbnQgYmxvY2suADQjIyBDb21wbGV4aXR5JC0gYE8oMSlgLlRmb3JjZV92ZXN0ZWRfdHJhbnNmZXIMARhzb3VyY2XFAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AARh0YXJnZXTFAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AASBzY2hlZHVsZfUCAbBWZXN0aW5nSW5mbzxCYWxhbmNlT2Y8VD4sIEJsb2NrTnVtYmVyRm9yPFQ+PgADOGBGb3JjZSBhIHZlc3RlZCB0cmFuc2Zlci4AxFRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9Sb290Xy4A6C0gYHNvdXJjZWA6IFRoZSBhY2NvdW50IHdob3NlIGZ1bmRzIHNob3VsZCBiZSB0cmFuc2ZlcnJlZC4RAS0gYHRhcmdldGA6IFRoZSBhY2NvdW50IHRoYXQgc2hvdWxkIGJlIHRyYW5zZmVycmVkIHRoZSB2ZXN0ZWQgZnVuZHMu8C0gYHNjaGVkdWxlYDogVGhlIHZlc3Rpbmcgc2NoZWR1bGUgYXR0YWNoZWQgdG8gdGhlIHRyYW5zZmVyLgBcRW1pdHMgYFZlc3RpbmdDcmVhdGVkYC4A/E5PVEU6IFRoaXMgd2lsbCB1bmxvY2sgYWxsIHNjaGVkdWxlcyB0aHJvdWdoIHRoZSBjdXJyZW50IGJsb2NrLgA0IyMgQ29tcGxleGl0eSQtIGBPKDEpYC48bWVyZ2Vfc2NoZWR1bGVzCAE8c2NoZWR1bGUxX2luZGV4EAEMdTMyAAE8c2NoZWR1bGUyX2luZGV4EAEMdTMyAARUXQFNZXJnZSB0d28gdmVzdGluZyBzY2hlZHVsZXMgdG9nZXRoZXIsIGNyZWF0aW5nIGEgbmV3IHZlc3Rpbmcgc2NoZWR1bGUgdGhhdCB1bmxvY2tzIG92ZXJVAXRoZSBoaWdoZXN0IHBvc3NpYmxlIHN0YXJ0IGFuZCBlbmQgYmxvY2tzLiBJZiBib3RoIHNjaGVkdWxlcyBoYXZlIGFscmVhZHkgc3RhcnRlZCB0aGVZAWN1cnJlbnQgYmxvY2sgd2lsbCBiZSB1c2VkIGFzIHRoZSBzY2hlZHVsZSBzdGFydDsgd2l0aCB0aGUgY2F2ZWF0IHRoYXQgaWYgb25lIHNjaGVkdWxlXQFpcyBmaW5pc2hlZCBieSB0aGUgY3VycmVudCBibG9jaywgdGhlIG90aGVyIHdpbGwgYmUgdHJlYXRlZCBhcyB0aGUgbmV3IG1lcmdlZCBzY2hlZHVsZSwsdW5tb2RpZmllZC4A+E5PVEU6IElmIGBzY2hlZHVsZTFfaW5kZXggPT0gc2NoZWR1bGUyX2luZGV4YCB0aGlzIGlzIGEgbm8tb3AuQQFOT1RFOiBUaGlzIHdpbGwgdW5sb2NrIGFsbCBzY2hlZHVsZXMgdGhyb3VnaCB0aGUgY3VycmVudCBibG9jayBwcmlvciB0byBtZXJnaW5nLmEBTk9URTogSWYgYm90aCBzY2hlZHVsZXMgaGF2ZSBlbmRlZCBieSB0aGUgY3VycmVudCBibG9jaywgbm8gbmV3IHNjaGVkdWxlIHdpbGwgYmUgY3JlYXRlZGRhbmQgYm90aCB3aWxsIGJlIHJlbW92ZWQuAGxNZXJnZWQgc2NoZWR1bGUgYXR0cmlidXRlczo1AS0gYHN0YXJ0aW5nX2Jsb2NrYDogYE1BWChzY2hlZHVsZTEuc3RhcnRpbmdfYmxvY2ssIHNjaGVkdWxlZDIuc3RhcnRpbmdfYmxvY2ssSCAgY3VycmVudF9ibG9jaylgLiEBLSBgZW5kaW5nX2Jsb2NrYDogYE1BWChzY2hlZHVsZTEuZW5kaW5nX2Jsb2NrLCBzY2hlZHVsZTIuZW5kaW5nX2Jsb2NrKWAuWQEtIGBsb2NrZWRgOiBgc2NoZWR1bGUxLmxvY2tlZF9hdChjdXJyZW50X2Jsb2NrKSArIHNjaGVkdWxlMi5sb2NrZWRfYXQoY3VycmVudF9ibG9jaylgLgDMVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uAOgtIGBzY2hlZHVsZTFfaW5kZXhgOiBpbmRleCBvZiB0aGUgZmlyc3Qgc2NoZWR1bGUgdG8gbWVyZ2Uu7C0gYHNjaGVkdWxlMl9pbmRleGA6IGluZGV4IG9mIHRoZSBzZWNvbmQgc2NoZWR1bGUgdG8gbWVyZ2UudGZvcmNlX3JlbW92ZV92ZXN0aW5nX3NjaGVkdWxlCAEYdGFyZ2V0xQEBjDxUOjpMb29rdXAgYXMgU3RhdGljTG9va3VwPjo6U291cmNlAAE4c2NoZWR1bGVfaW5kZXgQAQx1MzIABRh8Rm9yY2UgcmVtb3ZlIGEgdmVzdGluZyBzY2hlZHVsZQDEVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1Jvb3RfLgDILSBgdGFyZ2V0YDogQW4gYWNjb3VudCB0aGF0IGhhcyBhIHZlc3Rpbmcgc2NoZWR1bGUVAS0gYHNjaGVkdWxlX2luZGV4YDogVGhlIHZlc3Rpbmcgc2NoZWR1bGUgaW5kZXggdGhhdCBzaG91bGQgYmUgcmVtb3ZlZAQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy71Agw4cGFsbGV0X3Zlc3RpbmcwdmVzdGluZ19pbmZvLFZlc3RpbmdJbmZvCBxCYWxhbmNlARgsQmxvY2tOdW1iZXIBEAAMARhsb2NrZWQYARxCYWxhbmNlAAEkcGVyX2Jsb2NrGAEcQmFsYW5jZQABOHN0YXJ0aW5nX2Jsb2NrEAEsQmxvY2tOdW1iZXIAAPkCDDhwYWxsZXRfdXRpbGl0eRhwYWxsZXQQQ2FsbAQEVAABGBRiYXRjaAQBFGNhbGxz/QIBfFZlYzw8VCBhcyBDb25maWc+OjpSdW50aW1lQ2FsbD4AAEh8U2VuZCBhIGJhdGNoIG9mIGRpc3BhdGNoIGNhbGxzLgCwTWF5IGJlIGNhbGxlZCBmcm9tIGFueSBvcmlnaW4gZXhjZXB0IGBOb25lYC4AXQEtIGBjYWxsc2A6IFRoZSBjYWxscyB0byBiZSBkaXNwYXRjaGVkIGZyb20gdGhlIHNhbWUgb3JpZ2luLiBUaGUgbnVtYmVyIG9mIGNhbGwgbXVzdCBub3Q5ASAgZXhjZWVkIHRoZSBjb25zdGFudDogYGJhdGNoZWRfY2FsbHNfbGltaXRgIChhdmFpbGFibGUgaW4gY29uc3RhbnQgbWV0YWRhdGEpLgBVAUlmIG9yaWdpbiBpcyByb290IHRoZW4gdGhlIGNhbGxzIGFyZSBkaXNwYXRjaGVkIHdpdGhvdXQgY2hlY2tpbmcgb3JpZ2luIGZpbHRlci4gKFRoaXPsaW5jbHVkZXMgYnlwYXNzaW5nIGBmcmFtZV9zeXN0ZW06OkNvbmZpZzo6QmFzZUNhbGxGaWx0ZXJgKS4ANCMjIENvbXBsZXhpdHnQLSBPKEMpIHdoZXJlIEMgaXMgdGhlIG51bWJlciBvZiBjYWxscyB0byBiZSBiYXRjaGVkLgBVAVRoaXMgd2lsbCByZXR1cm4gYE9rYCBpbiBhbGwgY2lyY3Vtc3RhbmNlcy4gVG8gZGV0ZXJtaW5lIHRoZSBzdWNjZXNzIG9mIHRoZSBiYXRjaCwgYW4xAWV2ZW50IGlzIGRlcG9zaXRlZC4gSWYgYSBjYWxsIGZhaWxlZCBhbmQgdGhlIGJhdGNoIHdhcyBpbnRlcnJ1cHRlZCwgdGhlbiB0aGVVAWBCYXRjaEludGVycnVwdGVkYCBldmVudCBpcyBkZXBvc2l0ZWQsIGFsb25nIHdpdGggdGhlIG51bWJlciBvZiBzdWNjZXNzZnVsIGNhbGxzIG1hZGVNAWFuZCB0aGUgZXJyb3Igb2YgdGhlIGZhaWxlZCBjYWxsLiBJZiBhbGwgd2VyZSBzdWNjZXNzZnVsLCB0aGVuIHRoZSBgQmF0Y2hDb21wbGV0ZWRgTGV2ZW50IGlzIGRlcG9zaXRlZC40YXNfZGVyaXZhdGl2ZQgBFGluZGV4bQEBDHUxNgABEGNhbGx1AQF8Qm94PDxUIGFzIENvbmZpZz46OlJ1bnRpbWVDYWxsPgABNNxTZW5kIGEgY2FsbCB0aHJvdWdoIGFuIGluZGV4ZWQgcHNldWRvbnltIG9mIHRoZSBzZW5kZXIuAFUBRmlsdGVyIGZyb20gb3JpZ2luIGFyZSBwYXNzZWQgYWxvbmcuIFRoZSBjYWxsIHdpbGwgYmUgZGlzcGF0Y2hlZCB3aXRoIGFuIG9yaWdpbiB3aGljaLx1c2UgdGhlIHNhbWUgZmlsdGVyIGFzIHRoZSBvcmlnaW4gb2YgdGhpcyBjYWxsLgBFAU5PVEU6IElmIHlvdSBuZWVkIHRvIGVuc3VyZSB0aGF0IGFueSBhY2NvdW50LWJhc2VkIGZpbHRlcmluZyBpcyBub3QgaG9ub3JlZCAoaS5lLmEBYmVjYXVzZSB5b3UgZXhwZWN0IGBwcm94eWAgdG8gaGF2ZSBiZWVuIHVzZWQgcHJpb3IgaW4gdGhlIGNhbGwgc3RhY2sgYW5kIHlvdSBkbyBub3Qgd2FudFEBdGhlIGNhbGwgcmVzdHJpY3Rpb25zIHRvIGFwcGx5IHRvIGFueSBzdWItYWNjb3VudHMpLCB0aGVuIHVzZSBgYXNfbXVsdGlfdGhyZXNob2xkXzFgfGluIHRoZSBNdWx0aXNpZyBwYWxsZXQgaW5zdGVhZC4A9E5PVEU6IFByaW9yIHRvIHZlcnNpb24gKjEyLCB0aGlzIHdhcyBjYWxsZWQgYGFzX2xpbWl0ZWRfc3ViYC4AzFRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfLiRiYXRjaF9hbGwEARRjYWxsc/0CAXxWZWM8PFQgYXMgQ29uZmlnPjo6UnVudGltZUNhbGw+AAI07FNlbmQgYSBiYXRjaCBvZiBkaXNwYXRjaCBjYWxscyBhbmQgYXRvbWljYWxseSBleGVjdXRlIHRoZW0uIQFUaGUgd2hvbGUgdHJhbnNhY3Rpb24gd2lsbCByb2xsYmFjayBhbmQgZmFpbCBpZiBhbnkgb2YgdGhlIGNhbGxzIGZhaWxlZC4AsE1heSBiZSBjYWxsZWQgZnJvbSBhbnkgb3JpZ2luIGV4Y2VwdCBgTm9uZWAuAF0BLSBgY2FsbHNgOiBUaGUgY2FsbHMgdG8gYmUgZGlzcGF0Y2hlZCBmcm9tIHRoZSBzYW1lIG9yaWdpbi4gVGhlIG51bWJlciBvZiBjYWxsIG11c3Qgbm90OQEgIGV4Y2VlZCB0aGUgY29uc3RhbnQ6IGBiYXRjaGVkX2NhbGxzX2xpbWl0YCAoYXZhaWxhYmxlIGluIGNvbnN0YW50IG1ldGFkYXRhKS4AVQFJZiBvcmlnaW4gaXMgcm9vdCB0aGVuIHRoZSBjYWxscyBhcmUgZGlzcGF0Y2hlZCB3aXRob3V0IGNoZWNraW5nIG9yaWdpbiBmaWx0ZXIuIChUaGlz7GluY2x1ZGVzIGJ5cGFzc2luZyBgZnJhbWVfc3lzdGVtOjpDb25maWc6OkJhc2VDYWxsRmlsdGVyYCkuADQjIyBDb21wbGV4aXR50C0gTyhDKSB3aGVyZSBDIGlzIHRoZSBudW1iZXIgb2YgY2FsbHMgdG8gYmUgYmF0Y2hlZC4sZGlzcGF0Y2hfYXMIASRhc19vcmlnaW59AgFUQm94PFQ6OlBhbGxldHNPcmlnaW4+AAEQY2FsbHUBAXxCb3g8PFQgYXMgQ29uZmlnPjo6UnVudGltZUNhbGw+AAMYyERpc3BhdGNoZXMgYSBmdW5jdGlvbiBjYWxsIHdpdGggYSBwcm92aWRlZCBvcmlnaW4uAMRUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfUm9vdF8uADQjIyBDb21wbGV4aXR5HC0gTygxKS4sZm9yY2VfYmF0Y2gEARRjYWxsc/0CAXxWZWM8PFQgYXMgQ29uZmlnPjo6UnVudGltZUNhbGw+AAQ0fFNlbmQgYSBiYXRjaCBvZiBkaXNwYXRjaCBjYWxscy7UVW5saWtlIGBiYXRjaGAsIGl0IGFsbG93cyBlcnJvcnMgYW5kIHdvbid0IGludGVycnVwdC4AsE1heSBiZSBjYWxsZWQgZnJvbSBhbnkgb3JpZ2luIGV4Y2VwdCBgTm9uZWAuAF0BLSBgY2FsbHNgOiBUaGUgY2FsbHMgdG8gYmUgZGlzcGF0Y2hlZCBmcm9tIHRoZSBzYW1lIG9yaWdpbi4gVGhlIG51bWJlciBvZiBjYWxsIG11c3Qgbm90OQEgIGV4Y2VlZCB0aGUgY29uc3RhbnQ6IGBiYXRjaGVkX2NhbGxzX2xpbWl0YCAoYXZhaWxhYmxlIGluIGNvbnN0YW50IG1ldGFkYXRhKS4ATQFJZiBvcmlnaW4gaXMgcm9vdCB0aGVuIHRoZSBjYWxscyBhcmUgZGlzcGF0Y2ggd2l0aG91dCBjaGVja2luZyBvcmlnaW4gZmlsdGVyLiAoVGhpc+xpbmNsdWRlcyBieXBhc3NpbmcgYGZyYW1lX3N5c3RlbTo6Q29uZmlnOjpCYXNlQ2FsbEZpbHRlcmApLgA0IyMgQ29tcGxleGl0edAtIE8oQykgd2hlcmUgQyBpcyB0aGUgbnVtYmVyIG9mIGNhbGxzIHRvIGJlIGJhdGNoZWQuLHdpdGhfd2VpZ2h0CAEQY2FsbHUBAXxCb3g8PFQgYXMgQ29uZmlnPjo6UnVudGltZUNhbGw+AAEYd2VpZ2h0KAEYV2VpZ2h0AAUYxERpc3BhdGNoIGEgZnVuY3Rpb24gY2FsbCB3aXRoIGEgc3BlY2lmaWVkIHdlaWdodC4ALQFUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IGNoZWNrIHRoZSB3ZWlnaHQgb2YgdGhlIGNhbGwsIGFuZCBpbnN0ZWFkIGFsbG93cyB0aGW4Um9vdCBvcmlnaW4gdG8gc3BlY2lmeSB0aGUgd2VpZ2h0IG9mIHRoZSBjYWxsLgDEVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1Jvb3RfLgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy79AgAAAnUBAAEDDDBwYWxsZXRfcHJveHkYcGFsbGV0EENhbGwEBFQAASgUcHJveHkMARByZWFsxQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAFAZm9yY2VfcHJveHlfdHlwZQUDAVBPcHRpb248VDo6UHJveHlUeXBlPgABEGNhbGx1AQF8Qm94PDxUIGFzIENvbmZpZz46OlJ1bnRpbWVDYWxsPgAAJE0BRGlzcGF0Y2ggdGhlIGdpdmVuIGBjYWxsYCBmcm9tIGFuIGFjY291bnQgdGhhdCB0aGUgc2VuZGVyIGlzIGF1dGhvcmlzZWQgZm9yIHRocm91Z2gwYGFkZF9wcm94eWAuAMxUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXy4ALFBhcmFtZXRlcnM6DQEtIGByZWFsYDogVGhlIGFjY291bnQgdGhhdCB0aGUgcHJveHkgd2lsbCBtYWtlIGEgY2FsbCBvbiBiZWhhbGYgb2YuYQEtIGBmb3JjZV9wcm94eV90eXBlYDogU3BlY2lmeSB0aGUgZXhhY3QgcHJveHkgdHlwZSB0byBiZSB1c2VkIGFuZCBjaGVja2VkIGZvciB0aGlzIGNhbGwu0C0gYGNhbGxgOiBUaGUgY2FsbCB0byBiZSBtYWRlIGJ5IHRoZSBgcmVhbGAgYWNjb3VudC4kYWRkX3Byb3h5DAEgZGVsZWdhdGXFAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AAShwcm94eV90eXBlCQMBMFQ6OlByb3h5VHlwZQABFGRlbGF5EAFEQmxvY2tOdW1iZXJGb3I8VD4AASRFAVJlZ2lzdGVyIGEgcHJveHkgYWNjb3VudCBmb3IgdGhlIHNlbmRlciB0aGF0IGlzIGFibGUgdG8gbWFrZSBjYWxscyBvbiBpdHMgYmVoYWxmLgDMVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uACxQYXJhbWV0ZXJzOhEBLSBgcHJveHlgOiBUaGUgYWNjb3VudCB0aGF0IHRoZSBgY2FsbGVyYCB3b3VsZCBsaWtlIHRvIG1ha2UgYSBwcm94eS78LSBgcHJveHlfdHlwZWA6IFRoZSBwZXJtaXNzaW9ucyBhbGxvd2VkIGZvciB0aGlzIHByb3h5IGFjY291bnQuTQEtIGBkZWxheWA6IFRoZSBhbm5vdW5jZW1lbnQgcGVyaW9kIHJlcXVpcmVkIG9mIHRoZSBpbml0aWFsIHByb3h5LiBXaWxsIGdlbmVyYWxseSBiZRR6ZXJvLjByZW1vdmVfcHJveHkMASBkZWxlZ2F0ZcUBAVBBY2NvdW50SWRMb29rdXBPZjxUPgABKHByb3h5X3R5cGUJAwEwVDo6UHJveHlUeXBlAAEUZGVsYXkQAURCbG9ja051bWJlckZvcjxUPgACHKhVbnJlZ2lzdGVyIGEgcHJveHkgYWNjb3VudCBmb3IgdGhlIHNlbmRlci4AzFRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfLgAsUGFyYW1ldGVyczolAS0gYHByb3h5YDogVGhlIGFjY291bnQgdGhhdCB0aGUgYGNhbGxlcmAgd291bGQgbGlrZSB0byByZW1vdmUgYXMgYSBwcm94eS5BAS0gYHByb3h5X3R5cGVgOiBUaGUgcGVybWlzc2lvbnMgY3VycmVudGx5IGVuYWJsZWQgZm9yIHRoZSByZW1vdmVkIHByb3h5IGFjY291bnQuOHJlbW92ZV9wcm94aWVzAAMYtFVucmVnaXN0ZXIgYWxsIHByb3h5IGFjY291bnRzIGZvciB0aGUgc2VuZGVyLgDMVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uAEEBV0FSTklORzogVGhpcyBtYXkgYmUgY2FsbGVkIG9uIGFjY291bnRzIGNyZWF0ZWQgYnkgYHB1cmVgLCBob3dldmVyIGlmIGRvbmUsIHRoZW5ZAXRoZSB1bnJlc2VydmVkIGZlZXMgd2lsbCBiZSBpbmFjY2Vzc2libGUuICoqQWxsIGFjY2VzcyB0byB0aGlzIGFjY291bnQgd2lsbCBiZSBsb3N0LioqLGNyZWF0ZV9wdXJlDAEocHJveHlfdHlwZQkDATBUOjpQcm94eVR5cGUAARRkZWxheRABREJsb2NrTnVtYmVyRm9yPFQ+AAEUaW5kZXhtAQEMdTE2AARIOQFTcGF3biBhIGZyZXNoIG5ldyBhY2NvdW50IHRoYXQgaXMgZ3VhcmFudGVlZCB0byBiZSBvdGhlcndpc2UgaW5hY2Nlc3NpYmxlLCBhbmT8aW5pdGlhbGl6ZSBpdCB3aXRoIGEgcHJveHkgb2YgYHByb3h5X3R5cGVgIGZvciBgb3JpZ2luYCBzZW5kZXIuAGxSZXF1aXJlcyBhIGBTaWduZWRgIG9yaWdpbi4AUQEtIGBwcm94eV90eXBlYDogVGhlIHR5cGUgb2YgdGhlIHByb3h5IHRoYXQgdGhlIHNlbmRlciB3aWxsIGJlIHJlZ2lzdGVyZWQgYXMgb3ZlciB0aGVNAW5ldyBhY2NvdW50LiBUaGlzIHdpbGwgYWxtb3N0IGFsd2F5cyBiZSB0aGUgbW9zdCBwZXJtaXNzaXZlIGBQcm94eVR5cGVgIHBvc3NpYmxlIHRveGFsbG93IGZvciBtYXhpbXVtIGZsZXhpYmlsaXR5LlEBLSBgaW5kZXhgOiBBIGRpc2FtYmlndWF0aW9uIGluZGV4LCBpbiBjYXNlIHRoaXMgaXMgY2FsbGVkIG11bHRpcGxlIHRpbWVzIGluIHRoZSBzYW1lXQF0cmFuc2FjdGlvbiAoZS5nLiB3aXRoIGB1dGlsaXR5OjpiYXRjaGApLiBVbmxlc3MgeW91J3JlIHVzaW5nIGBiYXRjaGAgeW91IHByb2JhYmx5IGp1c3RAd2FudCB0byB1c2UgYDBgLk0BLSBgZGVsYXlgOiBUaGUgYW5ub3VuY2VtZW50IHBlcmlvZCByZXF1aXJlZCBvZiB0aGUgaW5pdGlhbCBwcm94eS4gV2lsbCBnZW5lcmFsbHkgYmUUemVyby4AUQFGYWlscyB3aXRoIGBEdXBsaWNhdGVgIGlmIHRoaXMgaGFzIGFscmVhZHkgYmVlbiBjYWxsZWQgaW4gdGhpcyB0cmFuc2FjdGlvbiwgZnJvbSB0aGWYc2FtZSBzZW5kZXIsIHdpdGggdGhlIHNhbWUgcGFyYW1ldGVycy4A5EZhaWxzIGlmIHRoZXJlIGFyZSBpbnN1ZmZpY2llbnQgZnVuZHMgdG8gcGF5IGZvciBkZXBvc2l0LiRraWxsX3B1cmUUARxzcGF3bmVyxQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEocHJveHlfdHlwZQkDATBUOjpQcm94eVR5cGUAARRpbmRleG0BAQx1MTYAARhoZWlnaHTsAURCbG9ja051bWJlckZvcjxUPgABJGV4dF9pbmRleOwBDHUzMgAFQKBSZW1vdmVzIGEgcHJldmlvdXNseSBzcGF3bmVkIHB1cmUgcHJveHkuAEkBV0FSTklORzogKipBbGwgYWNjZXNzIHRvIHRoaXMgYWNjb3VudCB3aWxsIGJlIGxvc3QuKiogQW55IGZ1bmRzIGhlbGQgaW4gaXQgd2lsbCBiZTRpbmFjY2Vzc2libGUuAFkBUmVxdWlyZXMgYSBgU2lnbmVkYCBvcmlnaW4sIGFuZCB0aGUgc2VuZGVyIGFjY291bnQgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCBieSBhIGNhbGwgdG+UYHB1cmVgIHdpdGggY29ycmVzcG9uZGluZyBwYXJhbWV0ZXJzLgA5AS0gYHNwYXduZXJgOiBUaGUgYWNjb3VudCB0aGF0IG9yaWdpbmFsbHkgY2FsbGVkIGBwdXJlYCB0byBjcmVhdGUgdGhpcyBhY2NvdW50LjkBLSBgaW5kZXhgOiBUaGUgZGlzYW1iaWd1YXRpb24gaW5kZXggb3JpZ2luYWxseSBwYXNzZWQgdG8gYHB1cmVgLiBQcm9iYWJseSBgMGAu7C0gYHByb3h5X3R5cGVgOiBUaGUgcHJveHkgdHlwZSBvcmlnaW5hbGx5IHBhc3NlZCB0byBgcHVyZWAuKQEtIGBoZWlnaHRgOiBUaGUgaGVpZ2h0IG9mIHRoZSBjaGFpbiB3aGVuIHRoZSBjYWxsIHRvIGBwdXJlYCB3YXMgcHJvY2Vzc2VkLjUBLSBgZXh0X2luZGV4YDogVGhlIGV4dHJpbnNpYyBpbmRleCBpbiB3aGljaCB0aGUgY2FsbCB0byBgcHVyZWAgd2FzIHByb2Nlc3NlZC4ANQFGYWlscyB3aXRoIGBOb1Blcm1pc3Npb25gIGluIGNhc2UgdGhlIGNhbGxlciBpcyBub3QgYSBwcmV2aW91c2x5IGNyZWF0ZWQgcHVyZdxhY2NvdW50IHdob3NlIGBwdXJlYCBjYWxsIGhhcyBjb3JyZXNwb25kaW5nIHBhcmFtZXRlcnMuIGFubm91bmNlCAEQcmVhbMUBAVBBY2NvdW50SWRMb29rdXBPZjxUPgABJGNhbGxfaGFzaDQBNENhbGxIYXNoT2Y8VD4ABjwFAVB1Ymxpc2ggdGhlIGhhc2ggb2YgYSBwcm94eS1jYWxsIHRoYXQgd2lsbCBiZSBtYWRlIGluIHRoZSBmdXR1cmUuAF0BVGhpcyBtdXN0IGJlIGNhbGxlZCBzb21lIG51bWJlciBvZiBibG9ja3MgYmVmb3JlIHRoZSBjb3JyZXNwb25kaW5nIGBwcm94eWAgaXMgYXR0ZW1wdGVkJQFpZiB0aGUgZGVsYXkgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm94eSByZWxhdGlvbnNoaXAgaXMgZ3JlYXRlciB0aGFuIHplcm8uABEBTm8gbW9yZSB0aGFuIGBNYXhQZW5kaW5nYCBhbm5vdW5jZW1lbnRzIG1heSBiZSBtYWRlIGF0IGFueSBvbmUgdGltZS4ACQFUaGlzIHdpbGwgdGFrZSBhIGRlcG9zaXQgb2YgYEFubm91bmNlbWVudERlcG9zaXRGYWN0b3JgIGFzIHdlbGwgYXMZAWBBbm5vdW5jZW1lbnREZXBvc2l0QmFzZWAgaWYgdGhlcmUgYXJlIG5vIG90aGVyIHBlbmRpbmcgYW5ub3VuY2VtZW50cy4AJQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXyBhbmQgYSBwcm94eSBvZiBgcmVhbGAuACxQYXJhbWV0ZXJzOg0BLSBgcmVhbGA6IFRoZSBhY2NvdW50IHRoYXQgdGhlIHByb3h5IHdpbGwgbWFrZSBhIGNhbGwgb24gYmVoYWxmIG9mLhUBLSBgY2FsbF9oYXNoYDogVGhlIGhhc2ggb2YgdGhlIGNhbGwgdG8gYmUgbWFkZSBieSB0aGUgYHJlYWxgIGFjY291bnQuTHJlbW92ZV9hbm5vdW5jZW1lbnQIARByZWFsxQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEkY2FsbF9oYXNoNAE0Q2FsbEhhc2hPZjxUPgAHKHBSZW1vdmUgYSBnaXZlbiBhbm5vdW5jZW1lbnQuAFkBTWF5IGJlIGNhbGxlZCBieSBhIHByb3h5IGFjY291bnQgdG8gcmVtb3ZlIGEgY2FsbCB0aGV5IHByZXZpb3VzbHkgYW5ub3VuY2VkIGFuZCByZXR1cm4wdGhlIGRlcG9zaXQuAMxUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXy4ALFBhcmFtZXRlcnM6DQEtIGByZWFsYDogVGhlIGFjY291bnQgdGhhdCB0aGUgcHJveHkgd2lsbCBtYWtlIGEgY2FsbCBvbiBiZWhhbGYgb2YuFQEtIGBjYWxsX2hhc2hgOiBUaGUgaGFzaCBvZiB0aGUgY2FsbCB0byBiZSBtYWRlIGJ5IHRoZSBgcmVhbGAgYWNjb3VudC5McmVqZWN0X2Fubm91bmNlbWVudAgBIGRlbGVnYXRlxQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEkY2FsbF9oYXNoNAE0Q2FsbEhhc2hPZjxUPgAIKLBSZW1vdmUgdGhlIGdpdmVuIGFubm91bmNlbWVudCBvZiBhIGRlbGVnYXRlLgBhAU1heSBiZSBjYWxsZWQgYnkgYSB0YXJnZXQgKHByb3hpZWQpIGFjY291bnQgdG8gcmVtb3ZlIGEgY2FsbCB0aGF0IG9uZSBvZiB0aGVpciBkZWxlZ2F0ZXMlAShgZGVsZWdhdGVgKSBoYXMgYW5ub3VuY2VkIHRoZXkgd2FudCB0byBleGVjdXRlLiBUaGUgZGVwb3NpdCBpcyByZXR1cm5lZC4AzFRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfLgAsUGFyYW1ldGVyczr0LSBgZGVsZWdhdGVgOiBUaGUgYWNjb3VudCB0aGF0IHByZXZpb3VzbHkgYW5ub3VuY2VkIHRoZSBjYWxsLrwtIGBjYWxsX2hhc2hgOiBUaGUgaGFzaCBvZiB0aGUgY2FsbCB0byBiZSBtYWRlLjxwcm94eV9hbm5vdW5jZWQQASBkZWxlZ2F0ZcUBAVBBY2NvdW50SWRMb29rdXBPZjxUPgABEHJlYWzFAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AAUBmb3JjZV9wcm94eV90eXBlBQMBUE9wdGlvbjxUOjpQcm94eVR5cGU+AAEQY2FsbHUBAXxCb3g8PFQgYXMgQ29uZmlnPjo6UnVudGltZUNhbGw+AAksTQFEaXNwYXRjaCB0aGUgZ2l2ZW4gYGNhbGxgIGZyb20gYW4gYWNjb3VudCB0aGF0IHRoZSBzZW5kZXIgaXMgYXV0aG9yaXplZCBmb3IgdGhyb3VnaDBgYWRkX3Byb3h5YC4AqFJlbW92ZXMgYW55IGNvcnJlc3BvbmRpbmcgYW5ub3VuY2VtZW50KHMpLgDMVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uACxQYXJhbWV0ZXJzOg0BLSBgcmVhbGA6IFRoZSBhY2NvdW50IHRoYXQgdGhlIHByb3h5IHdpbGwgbWFrZSBhIGNhbGwgb24gYmVoYWxmIG9mLmEBLSBgZm9yY2VfcHJveHlfdHlwZWA6IFNwZWNpZnkgdGhlIGV4YWN0IHByb3h5IHR5cGUgdG8gYmUgdXNlZCBhbmQgY2hlY2tlZCBmb3IgdGhpcyBjYWxsLtAtIGBjYWxsYDogVGhlIGNhbGwgdG8gYmUgbWFkZSBieSB0aGUgYHJlYWxgIGFjY291bnQuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLgUDBBhPcHRpb24EBFQBCQMBCBBOb25lAAAAEFNvbWUEAAkDAAABAAAJAwg0cGFzZW9fcnVudGltZSRQcm94eVR5cGUAARwMQW55AAAALE5vblRyYW5zZmVyAAEAKEdvdmVybmFuY2UAAgAcU3Rha2luZwADACxDYW5jZWxQcm94eQAGABxBdWN0aW9uAAcAPE5vbWluYXRpb25Qb29scwAIAAANAww8cGFsbGV0X211bHRpc2lnGHBhbGxldBBDYWxsBARUAAEQUGFzX211bHRpX3RocmVzaG9sZF8xCAFEb3RoZXJfc2lnbmF0b3JpZXPRAQFEVmVjPFQ6OkFjY291bnRJZD4AARBjYWxsdQEBfEJveDw8VCBhcyBDb25maWc+OjpSdW50aW1lQ2FsbD4AADBRAUltbWVkaWF0ZWx5IGRpc3BhdGNoIGEgbXVsdGktc2lnbmF0dXJlIGNhbGwgdXNpbmcgYSBzaW5nbGUgYXBwcm92YWwgZnJvbSB0aGUgY2FsbGVyLgDMVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uAD0BLSBgb3RoZXJfc2lnbmF0b3JpZXNgOiBUaGUgYWNjb3VudHMgKG90aGVyIHRoYW4gdGhlIHNlbmRlcikgd2hvIGFyZSBwYXJ0IG9mIHRoZQEBbXVsdGktc2lnbmF0dXJlLCBidXQgZG8gbm90IHBhcnRpY2lwYXRlIGluIHRoZSBhcHByb3ZhbCBwcm9jZXNzLogtIGBjYWxsYDogVGhlIGNhbGwgdG8gYmUgZXhlY3V0ZWQuALhSZXN1bHQgaXMgZXF1aXZhbGVudCB0byB0aGUgZGlzcGF0Y2hlZCByZXN1bHQuADQjIyBDb21wbGV4aXR5GQFPKFogKyBDKSB3aGVyZSBaIGlzIHRoZSBsZW5ndGggb2YgdGhlIGNhbGwgYW5kIEMgaXRzIGV4ZWN1dGlvbiB3ZWlnaHQuIGFzX211bHRpFAEkdGhyZXNob2xkbQEBDHUxNgABRG90aGVyX3NpZ25hdG9yaWVz0QEBRFZlYzxUOjpBY2NvdW50SWQ+AAE8bWF5YmVfdGltZXBvaW50EQMBkE9wdGlvbjxUaW1lcG9pbnQ8QmxvY2tOdW1iZXJGb3I8VD4+PgABEGNhbGx1AQF8Qm94PDxUIGFzIENvbmZpZz46OlJ1bnRpbWVDYWxsPgABKG1heF93ZWlnaHQoARhXZWlnaHQAAZxVAVJlZ2lzdGVyIGFwcHJvdmFsIGZvciBhIGRpc3BhdGNoIHRvIGJlIG1hZGUgZnJvbSBhIGRldGVybWluaXN0aWMgY29tcG9zaXRlIGFjY291bnQgaWb4YXBwcm92ZWQgYnkgYSB0b3RhbCBvZiBgdGhyZXNob2xkIC0gMWAgb2YgYG90aGVyX3NpZ25hdG9yaWVzYC4AsElmIHRoZXJlIGFyZSBlbm91Z2gsIHRoZW4gZGlzcGF0Y2ggdGhlIGNhbGwuAC0BUGF5bWVudDogYERlcG9zaXRCYXNlYCB3aWxsIGJlIHJlc2VydmVkIGlmIHRoaXMgaXMgdGhlIGZpcnN0IGFwcHJvdmFsLCBwbHVzPQFgdGhyZXNob2xkYCB0aW1lcyBgRGVwb3NpdEZhY3RvcmAuIEl0IGlzIHJldHVybmVkIG9uY2UgdGhpcyBkaXNwYXRjaCBoYXBwZW5zIG9yNGlzIGNhbmNlbGxlZC4AzFRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfLgBVAS0gYHRocmVzaG9sZGA6IFRoZSB0b3RhbCBudW1iZXIgb2YgYXBwcm92YWxzIGZvciB0aGlzIGRpc3BhdGNoIGJlZm9yZSBpdCBpcyBleGVjdXRlZC5BAS0gYG90aGVyX3NpZ25hdG9yaWVzYDogVGhlIGFjY291bnRzIChvdGhlciB0aGFuIHRoZSBzZW5kZXIpIHdobyBjYW4gYXBwcm92ZSB0aGlzbGRpc3BhdGNoLiBNYXkgbm90IGJlIGVtcHR5LlkBLSBgbWF5YmVfdGltZXBvaW50YDogSWYgdGhpcyBpcyB0aGUgZmlyc3QgYXBwcm92YWwsIHRoZW4gdGhpcyBtdXN0IGJlIGBOb25lYC4gSWYgaXQgaXNRAW5vdCB0aGUgZmlyc3QgYXBwcm92YWwsIHRoZW4gaXQgbXVzdCBiZSBgU29tZWAsIHdpdGggdGhlIHRpbWVwb2ludCAoYmxvY2sgbnVtYmVyIGFuZNR0cmFuc2FjdGlvbiBpbmRleCkgb2YgdGhlIGZpcnN0IGFwcHJvdmFsIHRyYW5zYWN0aW9uLogtIGBjYWxsYDogVGhlIGNhbGwgdG8gYmUgZXhlY3V0ZWQuAB0BTk9URTogVW5sZXNzIHRoaXMgaXMgdGhlIGZpbmFsIGFwcHJvdmFsLCB5b3Ugd2lsbCBnZW5lcmFsbHkgd2FudCB0byB1c2UZAWBhcHByb3ZlX2FzX211bHRpYCBpbnN0ZWFkLCBzaW5jZSBpdCBvbmx5IHJlcXVpcmVzIGEgaGFzaCBvZiB0aGUgY2FsbC4AWQFSZXN1bHQgaXMgZXF1aXZhbGVudCB0byB0aGUgZGlzcGF0Y2hlZCByZXN1bHQgaWYgYHRocmVzaG9sZGAgaXMgZXhhY3RseSBgMWAuIE90aGVyd2lzZVUBb24gc3VjY2VzcywgcmVzdWx0IGlzIGBPa2AgYW5kIHRoZSByZXN1bHQgZnJvbSB0aGUgaW50ZXJpb3IgY2FsbCwgaWYgaXQgd2FzIGV4ZWN1dGVkLNxtYXkgYmUgZm91bmQgaW4gdGhlIGRlcG9zaXRlZCBgTXVsdGlzaWdFeGVjdXRlZGAgZXZlbnQuADQjIyBDb21wbGV4aXR5UC0gYE8oUyArIFogKyBDYWxsKWAuzC0gVXAgdG8gb25lIGJhbGFuY2UtcmVzZXJ2ZSBvciB1bnJlc2VydmUgb3BlcmF0aW9uLj0BLSBPbmUgcGFzc3Rocm91Z2ggb3BlcmF0aW9uLCBvbmUgaW5zZXJ0LCBib3RoIGBPKFMpYCB3aGVyZSBgU2AgaXMgdGhlIG51bWJlciBvZkUBICBzaWduYXRvcmllcy4gYFNgIGlzIGNhcHBlZCBieSBgTWF4U2lnbmF0b3JpZXNgLCB3aXRoIHdlaWdodCBiZWluZyBwcm9wb3J0aW9uYWwuIQEtIE9uZSBjYWxsIGVuY29kZSAmIGhhc2gsIGJvdGggb2YgY29tcGxleGl0eSBgTyhaKWAgd2hlcmUgYFpgIGlzIHR4LWxlbi68LSBPbmUgZW5jb2RlICYgaGFzaCwgYm90aCBvZiBjb21wbGV4aXR5IGBPKFMpYC7ULSBVcCB0byBvbmUgYmluYXJ5IHNlYXJjaCBhbmQgaW5zZXJ0IChgTyhsb2dTICsgUylgKS74LSBJL086IDEgcmVhZCBgTyhTKWAsIHVwIHRvIDEgbXV0YXRlIGBPKFMpYC4gVXAgdG8gb25lIHJlbW92ZS4wLSBPbmUgZXZlbnQubC0gVGhlIHdlaWdodCBvZiB0aGUgYGNhbGxgLk0BLSBTdG9yYWdlOiBpbnNlcnRzIG9uZSBpdGVtLCB2YWx1ZSBzaXplIGJvdW5kZWQgYnkgYE1heFNpZ25hdG9yaWVzYCwgd2l0aCBhIGRlcG9zaXQZASAgdGFrZW4gZm9yIGl0cyBsaWZldGltZSBvZiBgRGVwb3NpdEJhc2UgKyB0aHJlc2hvbGQgKiBEZXBvc2l0RmFjdG9yYC5AYXBwcm92ZV9hc19tdWx0aRQBJHRocmVzaG9sZG0BAQx1MTYAAURvdGhlcl9zaWduYXRvcmllc9EBAURWZWM8VDo6QWNjb3VudElkPgABPG1heWJlX3RpbWVwb2ludBEDAZBPcHRpb248VGltZXBvaW50PEJsb2NrTnVtYmVyRm9yPFQ+Pj4AASRjYWxsX2hhc2gEASBbdTg7IDMyXQABKG1heF93ZWlnaHQoARhXZWlnaHQAAnhVAVJlZ2lzdGVyIGFwcHJvdmFsIGZvciBhIGRpc3BhdGNoIHRvIGJlIG1hZGUgZnJvbSBhIGRldGVybWluaXN0aWMgY29tcG9zaXRlIGFjY291bnQgaWb4YXBwcm92ZWQgYnkgYSB0b3RhbCBvZiBgdGhyZXNob2xkIC0gMWAgb2YgYG90aGVyX3NpZ25hdG9yaWVzYC4ALQFQYXltZW50OiBgRGVwb3NpdEJhc2VgIHdpbGwgYmUgcmVzZXJ2ZWQgaWYgdGhpcyBpcyB0aGUgZmlyc3QgYXBwcm92YWwsIHBsdXM9AWB0aHJlc2hvbGRgIHRpbWVzIGBEZXBvc2l0RmFjdG9yYC4gSXQgaXMgcmV0dXJuZWQgb25jZSB0aGlzIGRpc3BhdGNoIGhhcHBlbnMgb3I0aXMgY2FuY2VsbGVkLgDMVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uAFUBLSBgdGhyZXNob2xkYDogVGhlIHRvdGFsIG51bWJlciBvZiBhcHByb3ZhbHMgZm9yIHRoaXMgZGlzcGF0Y2ggYmVmb3JlIGl0IGlzIGV4ZWN1dGVkLkEBLSBgb3RoZXJfc2lnbmF0b3JpZXNgOiBUaGUgYWNjb3VudHMgKG90aGVyIHRoYW4gdGhlIHNlbmRlcikgd2hvIGNhbiBhcHByb3ZlIHRoaXNsZGlzcGF0Y2guIE1heSBub3QgYmUgZW1wdHkuWQEtIGBtYXliZV90aW1lcG9pbnRgOiBJZiB0aGlzIGlzIHRoZSBmaXJzdCBhcHByb3ZhbCwgdGhlbiB0aGlzIG11c3QgYmUgYE5vbmVgLiBJZiBpdCBpc1EBbm90IHRoZSBmaXJzdCBhcHByb3ZhbCwgdGhlbiBpdCBtdXN0IGJlIGBTb21lYCwgd2l0aCB0aGUgdGltZXBvaW50IChibG9jayBudW1iZXIgYW5k1HRyYW5zYWN0aW9uIGluZGV4KSBvZiB0aGUgZmlyc3QgYXBwcm92YWwgdHJhbnNhY3Rpb24uzC0gYGNhbGxfaGFzaGA6IFRoZSBoYXNoIG9mIHRoZSBjYWxsIHRvIGJlIGV4ZWN1dGVkLgA1AU5PVEU6IElmIHRoaXMgaXMgdGhlIGZpbmFsIGFwcHJvdmFsLCB5b3Ugd2lsbCB3YW50IHRvIHVzZSBgYXNfbXVsdGlgIGluc3RlYWQuADQjIyBDb21wbGV4aXR5JC0gYE8oUylgLswtIFVwIHRvIG9uZSBiYWxhbmNlLXJlc2VydmUgb3IgdW5yZXNlcnZlIG9wZXJhdGlvbi49AS0gT25lIHBhc3N0aHJvdWdoIG9wZXJhdGlvbiwgb25lIGluc2VydCwgYm90aCBgTyhTKWAgd2hlcmUgYFNgIGlzIHRoZSBudW1iZXIgb2ZFASAgc2lnbmF0b3JpZXMuIGBTYCBpcyBjYXBwZWQgYnkgYE1heFNpZ25hdG9yaWVzYCwgd2l0aCB3ZWlnaHQgYmVpbmcgcHJvcG9ydGlvbmFsLrwtIE9uZSBlbmNvZGUgJiBoYXNoLCBib3RoIG9mIGNvbXBsZXhpdHkgYE8oUylgLtQtIFVwIHRvIG9uZSBiaW5hcnkgc2VhcmNoIGFuZCBpbnNlcnQgKGBPKGxvZ1MgKyBTKWApLvgtIEkvTzogMSByZWFkIGBPKFMpYCwgdXAgdG8gMSBtdXRhdGUgYE8oUylgLiBVcCB0byBvbmUgcmVtb3ZlLjAtIE9uZSBldmVudC5NAS0gU3RvcmFnZTogaW5zZXJ0cyBvbmUgaXRlbSwgdmFsdWUgc2l6ZSBib3VuZGVkIGJ5IGBNYXhTaWduYXRvcmllc2AsIHdpdGggYSBkZXBvc2l0GQEgIHRha2VuIGZvciBpdHMgbGlmZXRpbWUgb2YgYERlcG9zaXRCYXNlICsgdGhyZXNob2xkICogRGVwb3NpdEZhY3RvcmAuPGNhbmNlbF9hc19tdWx0aRABJHRocmVzaG9sZG0BAQx1MTYAAURvdGhlcl9zaWduYXRvcmllc9EBAURWZWM8VDo6QWNjb3VudElkPgABJHRpbWVwb2ludBUDAXBUaW1lcG9pbnQ8QmxvY2tOdW1iZXJGb3I8VD4+AAEkY2FsbF9oYXNoBAEgW3U4OyAzMl0AA1RVAUNhbmNlbCBhIHByZS1leGlzdGluZywgb24tZ29pbmcgbXVsdGlzaWcgdHJhbnNhY3Rpb24uIEFueSBkZXBvc2l0IHJlc2VydmVkIHByZXZpb3VzbHnEZm9yIHRoaXMgb3BlcmF0aW9uIHdpbGwgYmUgdW5yZXNlcnZlZCBvbiBzdWNjZXNzLgDMVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uAFUBLSBgdGhyZXNob2xkYDogVGhlIHRvdGFsIG51bWJlciBvZiBhcHByb3ZhbHMgZm9yIHRoaXMgZGlzcGF0Y2ggYmVmb3JlIGl0IGlzIGV4ZWN1dGVkLkEBLSBgb3RoZXJfc2lnbmF0b3JpZXNgOiBUaGUgYWNjb3VudHMgKG90aGVyIHRoYW4gdGhlIHNlbmRlcikgd2hvIGNhbiBhcHByb3ZlIHRoaXNsZGlzcGF0Y2guIE1heSBub3QgYmUgZW1wdHkuXQEtIGB0aW1lcG9pbnRgOiBUaGUgdGltZXBvaW50IChibG9jayBudW1iZXIgYW5kIHRyYW5zYWN0aW9uIGluZGV4KSBvZiB0aGUgZmlyc3QgYXBwcm92YWx4dHJhbnNhY3Rpb24gZm9yIHRoaXMgZGlzcGF0Y2guzC0gYGNhbGxfaGFzaGA6IFRoZSBoYXNoIG9mIHRoZSBjYWxsIHRvIGJlIGV4ZWN1dGVkLgA0IyMgQ29tcGxleGl0eSQtIGBPKFMpYC7MLSBVcCB0byBvbmUgYmFsYW5jZS1yZXNlcnZlIG9yIHVucmVzZXJ2ZSBvcGVyYXRpb24uPQEtIE9uZSBwYXNzdGhyb3VnaCBvcGVyYXRpb24sIG9uZSBpbnNlcnQsIGJvdGggYE8oUylgIHdoZXJlIGBTYCBpcyB0aGUgbnVtYmVyIG9mRQEgIHNpZ25hdG9yaWVzLiBgU2AgaXMgY2FwcGVkIGJ5IGBNYXhTaWduYXRvcmllc2AsIHdpdGggd2VpZ2h0IGJlaW5nIHByb3BvcnRpb25hbC68LSBPbmUgZW5jb2RlICYgaGFzaCwgYm90aCBvZiBjb21wbGV4aXR5IGBPKFMpYC4wLSBPbmUgZXZlbnQuhC0gSS9POiAxIHJlYWQgYE8oUylgLCBvbmUgcmVtb3ZlLnAtIFN0b3JhZ2U6IHJlbW92ZXMgb25lIGl0ZW0uBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLhEDBBhPcHRpb24EBFQBFQMBCBBOb25lAAAAEFNvbWUEABUDAAABAAAVAwg8cGFsbGV0X211bHRpc2lnJFRpbWVwb2ludAQsQmxvY2tOdW1iZXIBEAAIARhoZWlnaHQQASxCbG9ja051bWJlcgABFGluZGV4EAEMdTMyAAAZAww8cGFsbGV0X2JvdW50aWVzGHBhbGxldBBDYWxsCARUAARJAAEkOHByb3Bvc2VfYm91bnR5CAEUdmFsdWX8ATxCYWxhbmNlT2Y8VCwgST4AASxkZXNjcmlwdGlvbjgBHFZlYzx1OD4AADBUUHJvcG9zZSBhIG5ldyBib3VudHkuAMxUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXy4AUQFQYXltZW50OiBgVGlwUmVwb3J0RGVwb3NpdEJhc2VgIHdpbGwgYmUgcmVzZXJ2ZWQgZnJvbSB0aGUgb3JpZ2luIGFjY291bnQsIGFzIHdlbGwgYXNRAWBEYXRhRGVwb3NpdFBlckJ5dGVgIGZvciBlYWNoIGJ5dGUgaW4gYHJlYXNvbmAuIEl0IHdpbGwgYmUgdW5yZXNlcnZlZCB1cG9uIGFwcHJvdmFsLGRvciBzbGFzaGVkIHdoZW4gcmVqZWN0ZWQuAPgtIGBjdXJhdG9yYDogVGhlIGN1cmF0b3IgYWNjb3VudCB3aG9tIHdpbGwgbWFuYWdlIHRoaXMgYm91bnR5LmQtIGBmZWVgOiBUaGUgY3VyYXRvciBmZWUuJQEtIGB2YWx1ZWA6IFRoZSB0b3RhbCBwYXltZW50IGFtb3VudCBvZiB0aGlzIGJvdW50eSwgY3VyYXRvciBmZWUgaW5jbHVkZWQuwC0gYGRlc2NyaXB0aW9uYDogVGhlIGRlc2NyaXB0aW9uIG9mIHRoaXMgYm91bnR5LjhhcHByb3ZlX2JvdW50eQQBJGJvdW50eV9pZOwBLEJvdW50eUluZGV4AAEcXQFBcHByb3ZlIGEgYm91bnR5IHByb3Bvc2FsLiBBdCBhIGxhdGVyIHRpbWUsIHRoZSBib3VudHkgd2lsbCBiZSBmdW5kZWQgYW5kIGJlY29tZSBhY3RpdmWoYW5kIHRoZSBvcmlnaW5hbCBkZXBvc2l0IHdpbGwgYmUgcmV0dXJuZWQuAKRNYXkgb25seSBiZSBjYWxsZWQgZnJvbSBgVDo6U3BlbmRPcmlnaW5gLgA0IyMgQ29tcGxleGl0eRwtIE8oMSkuPHByb3Bvc2VfY3VyYXRvcgwBJGJvdW50eV9pZOwBLEJvdW50eUluZGV4AAEcY3VyYXRvcsUBAVBBY2NvdW50SWRMb29rdXBPZjxUPgABDGZlZfwBPEJhbGFuY2VPZjxULCBJPgACGJRQcm9wb3NlIGEgY3VyYXRvciB0byBhIGZ1bmRlZCBib3VudHkuAKRNYXkgb25seSBiZSBjYWxsZWQgZnJvbSBgVDo6U3BlbmRPcmlnaW5gLgA0IyMgQ29tcGxleGl0eRwtIE8oMSkuQHVuYXNzaWduX2N1cmF0b3IEASRib3VudHlfaWTsASxCb3VudHlJbmRleAADRHxVbmFzc2lnbiBjdXJhdG9yIGZyb20gYSBib3VudHkuAB0BVGhpcyBmdW5jdGlvbiBjYW4gb25seSBiZSBjYWxsZWQgYnkgdGhlIGBSZWplY3RPcmlnaW5gIGEgc2lnbmVkIG9yaWdpbi4APQFJZiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgYFJlamVjdE9yaWdpbmAsIHdlIGFzc3VtZSB0aGF0IHRoZSBjdXJhdG9yIGlzMQFtYWxpY2lvdXMgb3IgaW5hY3RpdmUuIEFzIGEgcmVzdWx0LCB3ZSB3aWxsIHNsYXNoIHRoZSBjdXJhdG9yIHdoZW4gcG9zc2libGUuAGEBSWYgdGhlIG9yaWdpbiBpcyB0aGUgY3VyYXRvciwgd2UgdGFrZSB0aGlzIGFzIGEgc2lnbiB0aGV5IGFyZSB1bmFibGUgdG8gZG8gdGhlaXIgam9iIGFuZF0BdGhleSB3aWxsaW5nbHkgZ2l2ZSB1cC4gV2UgY291bGQgc2xhc2ggdGhlbSwgYnV0IGZvciBub3cgd2UgYWxsb3cgdGhlbSB0byByZWNvdmVyIHRoZWlyNQFkZXBvc2l0IGFuZCBleGl0IHdpdGhvdXQgaXNzdWUuIChXZSBtYXkgd2FudCB0byBjaGFuZ2UgdGhpcyBpZiBpdCBpcyBhYnVzZWQuKQBdAUZpbmFsbHksIHRoZSBvcmlnaW4gY2FuIGJlIGFueW9uZSBpZiBhbmQgb25seSBpZiB0aGUgY3VyYXRvciBpcyAiaW5hY3RpdmUiLiBUaGlzIGFsbG93c2EBYW55b25lIGluIHRoZSBjb21tdW5pdHkgdG8gY2FsbCBvdXQgdGhhdCBhIGN1cmF0b3IgaXMgbm90IGRvaW5nIHRoZWlyIGR1ZSBkaWxpZ2VuY2UsIGFuZDkBd2Ugc2hvdWxkIHBpY2sgYSBuZXcgY3VyYXRvci4gSW4gdGhpcyBjYXNlIHRoZSBjdXJhdG9yIHNob3VsZCBhbHNvIGJlIHNsYXNoZWQuADQjIyBDb21wbGV4aXR5HC0gTygxKS44YWNjZXB0X2N1cmF0b3IEASRib3VudHlfaWTsASxCb3VudHlJbmRleAAEHJRBY2NlcHQgdGhlIGN1cmF0b3Igcm9sZSBmb3IgYSBib3VudHkuKQFBIGRlcG9zaXQgd2lsbCBiZSByZXNlcnZlZCBmcm9tIGN1cmF0b3IgYW5kIHJlZnVuZCB1cG9uIHN1Y2Nlc3NmdWwgcGF5b3V0LgCQTWF5IG9ubHkgYmUgY2FsbGVkIGZyb20gdGhlIGN1cmF0b3IuADQjIyBDb21wbGV4aXR5HC0gTygxKS4wYXdhcmRfYm91bnR5CAEkYm91bnR5X2lk7AEsQm91bnR5SW5kZXgAASxiZW5lZmljaWFyecUBAVBBY2NvdW50SWRMb29rdXBPZjxUPgAFKFkBQXdhcmQgYm91bnR5IHRvIGEgYmVuZWZpY2lhcnkgYWNjb3VudC4gVGhlIGJlbmVmaWNpYXJ5IHdpbGwgYmUgYWJsZSB0byBjbGFpbSB0aGUgZnVuZHM4YWZ0ZXIgYSBkZWxheS4AFQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSB0aGUgY3VyYXRvciBvZiB0aGlzIGJvdW50eS4AiC0gYGJvdW50eV9pZGA6IEJvdW50eSBJRCB0byBhd2FyZC4ZAS0gYGJlbmVmaWNpYXJ5YDogVGhlIGJlbmVmaWNpYXJ5IGFjY291bnQgd2hvbSB3aWxsIHJlY2VpdmUgdGhlIHBheW91dC4ANCMjIENvbXBsZXhpdHkcLSBPKDEpLjBjbGFpbV9ib3VudHkEASRib3VudHlfaWTsASxCb3VudHlJbmRleAAGIOxDbGFpbSB0aGUgcGF5b3V0IGZyb20gYW4gYXdhcmRlZCBib3VudHkgYWZ0ZXIgcGF5b3V0IGRlbGF5LgAlAVRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIHRoZSBiZW5lZmljaWFyeSBvZiB0aGlzIGJvdW50eS4AiC0gYGJvdW50eV9pZGA6IEJvdW50eSBJRCB0byBjbGFpbS4ANCMjIENvbXBsZXhpdHkcLSBPKDEpLjBjbG9zZV9ib3VudHkEASRib3VudHlfaWTsASxCb3VudHlJbmRleAAHJDkBQ2FuY2VsIGEgcHJvcG9zZWQgb3IgYWN0aXZlIGJvdW50eS4gQWxsIHRoZSBmdW5kcyB3aWxsIGJlIHNlbnQgdG8gdHJlYXN1cnkgYW5kzHRoZSBjdXJhdG9yIGRlcG9zaXQgd2lsbCBiZSB1bnJlc2VydmVkIGlmIHBvc3NpYmxlLgDIT25seSBgVDo6UmVqZWN0T3JpZ2luYCBpcyBhYmxlIHRvIGNhbmNlbCBhIGJvdW50eS4AjC0gYGJvdW50eV9pZGA6IEJvdW50eSBJRCB0byBjYW5jZWwuADQjIyBDb21wbGV4aXR5HC0gTygxKS5QZXh0ZW5kX2JvdW50eV9leHBpcnkIASRib3VudHlfaWTsASxCb3VudHlJbmRleAABGHJlbWFyazgBHFZlYzx1OD4ACCSsRXh0ZW5kIHRoZSBleHBpcnkgdGltZSBvZiBhbiBhY3RpdmUgYm91bnR5LgAVAVRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIHRoZSBjdXJhdG9yIG9mIHRoaXMgYm91bnR5LgCMLSBgYm91bnR5X2lkYDogQm91bnR5IElEIHRvIGV4dGVuZC6MLSBgcmVtYXJrYDogYWRkaXRpb25hbCBpbmZvcm1hdGlvbi4ANCMjIENvbXBsZXhpdHkcLSBPKDEpLgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy4dAwxUcGFsbGV0X2NoaWxkX2JvdW50aWVzGHBhbGxldBBDYWxsBARUAAEcQGFkZF9jaGlsZF9ib3VudHkMAUBwYXJlbnRfYm91bnR5X2lk7AEsQm91bnR5SW5kZXgAARR2YWx1ZfwBMEJhbGFuY2VPZjxUPgABLGRlc2NyaXB0aW9uOAEcVmVjPHU4PgAATFxBZGQgYSBuZXcgY2hpbGQtYm91bnR5LgD8VGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgdGhlIGN1cmF0b3Igb2YgcGFyZW503GJvdW50eSBhbmQgdGhlIHBhcmVudCBib3VudHkgbXVzdCBiZSBpbiAiYWN0aXZlIiBzdGF0ZS4ABQFDaGlsZC1ib3VudHkgZ2V0cyBhZGRlZCBzdWNjZXNzZnVsbHkgJiBmdW5kIGdldHMgdHJhbnNmZXJyZWQgZnJvbQkBcGFyZW50IGJvdW50eSB0byBjaGlsZC1ib3VudHkgYWNjb3VudCwgaWYgcGFyZW50IGJvdW50eSBoYXMgZW5vdWdobGZ1bmRzLCBlbHNlIHRoZSBjYWxsIGZhaWxzLgANAVVwcGVyIGJvdW5kIHRvIG1heGltdW0gbnVtYmVyIG9mIGFjdGl2ZSAgY2hpbGQgYm91bnRpZXMgdGhhdCBjYW4gYmWoYWRkZWQgYXJlIG1hbmFnZWQgdmlhIHJ1bnRpbWUgdHJhaXQgY29uZmlnmFtgQ29uZmlnOjpNYXhBY3RpdmVDaGlsZEJvdW50eUNvdW50YF0uAAEBSWYgdGhlIGNhbGwgaXMgc3VjY2VzcywgdGhlIHN0YXR1cyBvZiBjaGlsZC1ib3VudHkgaXMgdXBkYXRlZCB0byAiQWRkZWQiLgBNAS0gYHBhcmVudF9ib3VudHlfaWRgOiBJbmRleCBvZiBwYXJlbnQgYm91bnR5IGZvciB3aGljaCBjaGlsZC1ib3VudHkgaXMgYmVpbmcgYWRkZWQusC0gYHZhbHVlYDogVmFsdWUgZm9yIGV4ZWN1dGluZyB0aGUgcHJvcG9zYWwu3C0gYGRlc2NyaXB0aW9uYDogVGV4dCBkZXNjcmlwdGlvbiBmb3IgdGhlIGNoaWxkLWJvdW50eS48cHJvcG9zZV9jdXJhdG9yEAFAcGFyZW50X2JvdW50eV9pZOwBLEJvdW50eUluZGV4AAE8Y2hpbGRfYm91bnR5X2lk7AEsQm91bnR5SW5kZXgAARxjdXJhdG9yxQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEMZmVl/AEwQmFsYW5jZU9mPFQ+AAE8oFByb3Bvc2UgY3VyYXRvciBmb3IgZnVuZGVkIGNoaWxkLWJvdW50eS4ADQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBjdXJhdG9yIG9mIHBhcmVudCBib3VudHkuABEBUGFyZW50IGJvdW50eSBtdXN0IGJlIGluIGFjdGl2ZSBzdGF0ZSwgZm9yIHRoaXMgY2hpbGQtYm91bnR5IGNhbGwgdG8Ud29yay4ADQFDaGlsZC1ib3VudHkgbXVzdCBiZSBpbiAiQWRkZWQiIHN0YXRlLCBmb3IgcHJvY2Vzc2luZyB0aGUgY2FsbC4gQW5kBQFzdGF0ZSBvZiBjaGlsZC1ib3VudHkgaXMgbW92ZWQgdG8gIkN1cmF0b3JQcm9wb3NlZCIgb24gc3VjY2Vzc2Z1bEBjYWxsIGNvbXBsZXRpb24uALQtIGBwYXJlbnRfYm91bnR5X2lkYDogSW5kZXggb2YgcGFyZW50IGJvdW50eS6sLSBgY2hpbGRfYm91bnR5X2lkYDogSW5kZXggb2YgY2hpbGQgYm91bnR5LrQtIGBjdXJhdG9yYDogQWRkcmVzcyBvZiBjaGlsZC1ib3VudHkgY3VyYXRvci7sLSBgZmVlYDogcGF5bWVudCBmZWUgdG8gY2hpbGQtYm91bnR5IGN1cmF0b3IgZm9yIGV4ZWN1dGlvbi44YWNjZXB0X2N1cmF0b3IIAUBwYXJlbnRfYm91bnR5X2lk7AEsQm91bnR5SW5kZXgAATxjaGlsZF9ib3VudHlfaWTsASxCb3VudHlJbmRleAACTLRBY2NlcHQgdGhlIGN1cmF0b3Igcm9sZSBmb3IgdGhlIGNoaWxkLWJvdW50eS4A9FRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIHRoZSBjdXJhdG9yIG9mIHRoaXM0Y2hpbGQtYm91bnR5LgDsQSBkZXBvc2l0IHdpbGwgYmUgcmVzZXJ2ZWQgZnJvbSB0aGUgY3VyYXRvciBhbmQgcmVmdW5kIHVwb26Ic3VjY2Vzc2Z1bCBwYXlvdXQgb3IgY2FuY2VsbGF0aW9uLgD4RmVlIGZvciBjdXJhdG9yIGlzIGRlZHVjdGVkIGZyb20gY3VyYXRvciBmZWUgb2YgcGFyZW50IGJvdW50eS4AEQFQYXJlbnQgYm91bnR5IG11c3QgYmUgaW4gYWN0aXZlIHN0YXRlLCBmb3IgdGhpcyBjaGlsZC1ib3VudHkgY2FsbCB0bxR3b3JrLgANAUNoaWxkLWJvdW50eSBtdXN0IGJlIGluICJDdXJhdG9yUHJvcG9zZWQiIHN0YXRlLCBmb3IgcHJvY2Vzc2luZyB0aGUJAWNhbGwuIEFuZCBzdGF0ZSBvZiBjaGlsZC1ib3VudHkgaXMgbW92ZWQgdG8gIkFjdGl2ZSIgb24gc3VjY2Vzc2Z1bEBjYWxsIGNvbXBsZXRpb24uALQtIGBwYXJlbnRfYm91bnR5X2lkYDogSW5kZXggb2YgcGFyZW50IGJvdW50eS6sLSBgY2hpbGRfYm91bnR5X2lkYDogSW5kZXggb2YgY2hpbGQgYm91bnR5LkB1bmFzc2lnbl9jdXJhdG9yCAFAcGFyZW50X2JvdW50eV9pZOwBLEJvdW50eUluZGV4AAE8Y2hpbGRfYm91bnR5X2lk7AEsQm91bnR5SW5kZXgAA4iUVW5hc3NpZ24gY3VyYXRvciBmcm9tIGEgY2hpbGQtYm91bnR5LgAJAVRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBjYW4gYmUgZWl0aGVyIGBSZWplY3RPcmlnaW5gLCBvctx0aGUgY3VyYXRvciBvZiB0aGUgcGFyZW50IGJvdW50eSwgb3IgYW55IHNpZ25lZCBvcmlnaW4uAPhGb3IgdGhlIG9yaWdpbiBvdGhlciB0aGFuIFQ6OlJlamVjdE9yaWdpbiBhbmQgdGhlIGNoaWxkLWJvdW50eQEBY3VyYXRvciwgcGFyZW50IGJvdW50eSBtdXN0IGJlIGluIGFjdGl2ZSBzdGF0ZSwgZm9yIHRoaXMgY2FsbCB0bwkBd29yay4gV2UgYWxsb3cgY2hpbGQtYm91bnR5IGN1cmF0b3IgYW5kIFQ6OlJlamVjdE9yaWdpbiB0byBleGVjdXRlyHRoaXMgY2FsbCBpcnJlc3BlY3RpdmUgb2YgdGhlIHBhcmVudCBib3VudHkgc3RhdGUuANxJZiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSB0aGUgYFJlamVjdE9yaWdpbmAgb3IgdGhlBQFwYXJlbnQgYm91bnR5IGN1cmF0b3IsIHdlIGFzc3VtZSB0aGF0IHRoZSBjaGlsZC1ib3VudHkgY3VyYXRvciBpcw0BbWFsaWNpb3VzIG9yIGluYWN0aXZlLiBBcyBhIHJlc3VsdCwgY2hpbGQtYm91bnR5IGN1cmF0b3IgZGVwb3NpdCBpcyBzbGFzaGVkLgAFAUlmIHRoZSBvcmlnaW4gaXMgdGhlIGNoaWxkLWJvdW50eSBjdXJhdG9yLCB3ZSB0YWtlIHRoaXMgYXMgYSBzaWduCQF0aGF0IHRoZXkgYXJlIHVuYWJsZSB0byBkbyB0aGVpciBqb2IsIGFuZCBhcmUgd2lsbGluZ2x5IGdpdmluZyB1cC4JAVdlIGNvdWxkIHNsYXNoIHRoZSBkZXBvc2l0LCBidXQgZm9yIG5vdyB3ZSBhbGxvdyB0aGVtIHRvIHVucmVzZXJ2ZREBdGhlaXIgZGVwb3NpdCBhbmQgZXhpdCB3aXRob3V0IGlzc3VlLiAoV2UgbWF5IHdhbnQgdG8gY2hhbmdlIHRoaXMgaWY4aXQgaXMgYWJ1c2VkLikABQFGaW5hbGx5LCB0aGUgb3JpZ2luIGNhbiBiZSBhbnlvbmUgaWZmIHRoZSBjaGlsZC1ib3VudHkgY3VyYXRvciBpcwkBImluYWN0aXZlIi4gRXhwaXJ5IHVwZGF0ZSBkdWUgb2YgcGFyZW50IGJvdW50eSBpcyB1c2VkIHRvIGVzdGltYXRlnGluYWN0aXZlIHN0YXRlIG9mIGNoaWxkLWJvdW50eSBjdXJhdG9yLgANAVRoaXMgYWxsb3dzIGFueW9uZSBpbiB0aGUgY29tbXVuaXR5IHRvIGNhbGwgb3V0IHRoYXQgYSBjaGlsZC1ib3VudHkJAWN1cmF0b3IgaXMgbm90IGRvaW5nIHRoZWlyIGR1ZSBkaWxpZ2VuY2UsIGFuZCB3ZSBzaG91bGQgcGljayBhIG5ld/hvbmUuIEluIHRoaXMgY2FzZSB0aGUgY2hpbGQtYm91bnR5IGN1cmF0b3IgZGVwb3NpdCBpcyBzbGFzaGVkLgABAVN0YXRlIG9mIGNoaWxkLWJvdW50eSBpcyBtb3ZlZCB0byBBZGRlZCBzdGF0ZSBvbiBzdWNjZXNzZnVsIGNhbGwsY29tcGxldGlvbi4AtC0gYHBhcmVudF9ib3VudHlfaWRgOiBJbmRleCBvZiBwYXJlbnQgYm91bnR5LqwtIGBjaGlsZF9ib3VudHlfaWRgOiBJbmRleCBvZiBjaGlsZCBib3VudHkuSGF3YXJkX2NoaWxkX2JvdW50eQwBQHBhcmVudF9ib3VudHlfaWTsASxCb3VudHlJbmRleAABPGNoaWxkX2JvdW50eV9pZOwBLEJvdW50eUluZGV4AAEsYmVuZWZpY2lhcnnFAQFQQWNjb3VudElkTG9va3VwT2Y8VD4ABESQQXdhcmQgY2hpbGQtYm91bnR5IHRvIGEgYmVuZWZpY2lhcnkuAPhUaGUgYmVuZWZpY2lhcnkgd2lsbCBiZSBhYmxlIHRvIGNsYWltIHRoZSBmdW5kcyBhZnRlciBhIGRlbGF5LgD8VGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgdGhlIHBhcmVudCBjdXJhdG9yIG9ydGN1cmF0b3Igb2YgdGhpcyBjaGlsZC1ib3VudHkuABEBUGFyZW50IGJvdW50eSBtdXN0IGJlIGluIGFjdGl2ZSBzdGF0ZSwgZm9yIHRoaXMgY2hpbGQtYm91bnR5IGNhbGwgdG8Ud29yay4ACQFDaGlsZC1ib3VudHkgbXVzdCBiZSBpbiBhY3RpdmUgc3RhdGUsIGZvciBwcm9jZXNzaW5nIHRoZSBjYWxsLiBBbmQRAXN0YXRlIG9mIGNoaWxkLWJvdW50eSBpcyBtb3ZlZCB0byAiUGVuZGluZ1BheW91dCIgb24gc3VjY2Vzc2Z1bCBjYWxsLGNvbXBsZXRpb24uALQtIGBwYXJlbnRfYm91bnR5X2lkYDogSW5kZXggb2YgcGFyZW50IGJvdW50eS6sLSBgY2hpbGRfYm91bnR5X2lkYDogSW5kZXggb2YgY2hpbGQgYm91bnR5LpQtIGBiZW5lZmljaWFyeWA6IEJlbmVmaWNpYXJ5IGFjY291bnQuSGNsYWltX2NoaWxkX2JvdW50eQgBQHBhcmVudF9ib3VudHlfaWTsASxCb3VudHlJbmRleAABPGNoaWxkX2JvdW50eV9pZOwBLEJvdW50eUluZGV4AAVABQFDbGFpbSB0aGUgcGF5b3V0IGZyb20gYW4gYXdhcmRlZCBjaGlsZC1ib3VudHkgYWZ0ZXIgcGF5b3V0IGRlbGF5LgDsVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG1heSBiZSBhbnkgc2lnbmVkIG9yaWdpbi4ABQFDYWxsIHdvcmtzIGluZGVwZW5kZW50IG9mIHBhcmVudCBib3VudHkgc3RhdGUsIE5vIG5lZWQgZm9yIHBhcmVudHRib3VudHkgdG8gYmUgaW4gYWN0aXZlIHN0YXRlLgARAVRoZSBCZW5lZmljaWFyeSBpcyBwYWlkIG91dCB3aXRoIGFncmVlZCBib3VudHkgdmFsdWUuIEN1cmF0b3IgZmVlIGlzlHBhaWQgJiBjdXJhdG9yIGRlcG9zaXQgaXMgdW5yZXNlcnZlZC4ABQFDaGlsZC1ib3VudHkgbXVzdCBiZSBpbiAiUGVuZGluZ1BheW91dCIgc3RhdGUsIGZvciBwcm9jZXNzaW5nIHRoZfxjYWxsLiBBbmQgaW5zdGFuY2Ugb2YgY2hpbGQtYm91bnR5IGlzIHJlbW92ZWQgZnJvbSB0aGUgc3RhdGUgb25sc3VjY2Vzc2Z1bCBjYWxsIGNvbXBsZXRpb24uALQtIGBwYXJlbnRfYm91bnR5X2lkYDogSW5kZXggb2YgcGFyZW50IGJvdW50eS6sLSBgY2hpbGRfYm91bnR5X2lkYDogSW5kZXggb2YgY2hpbGQgYm91bnR5LkhjbG9zZV9jaGlsZF9ib3VudHkIAUBwYXJlbnRfYm91bnR5X2lk7AEsQm91bnR5SW5kZXgAATxjaGlsZF9ib3VudHlfaWTsASxCb3VudHlJbmRleAAGWBEBQ2FuY2VsIGEgcHJvcG9zZWQgb3IgYWN0aXZlIGNoaWxkLWJvdW50eS4gQ2hpbGQtYm91bnR5IGFjY291bnQgZnVuZHMJAWFyZSB0cmFuc2ZlcnJlZCB0byBwYXJlbnQgYm91bnR5IGFjY291bnQuIFRoZSBjaGlsZC1ib3VudHkgY3VyYXRvcphkZXBvc2l0IG1heSBiZSB1bnJlc2VydmVkIGlmIHBvc3NpYmxlLgAJAVRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIGVpdGhlciBwYXJlbnQgY3VyYXRvciBvckhgVDo6UmVqZWN0T3JpZ2luYC4A8ElmIHRoZSBzdGF0ZSBvZiBjaGlsZC1ib3VudHkgaXMgYEFjdGl2ZWAsIGN1cmF0b3IgZGVwb3NpdCBpcyx1bnJlc2VydmVkLgD0SWYgdGhlIHN0YXRlIG9mIGNoaWxkLWJvdW50eSBpcyBgUGVuZGluZ1BheW91dGAsIGNhbGwgZmFpbHMgJnhyZXR1cm5zIGBQZW5kaW5nUGF5b3V0YCBlcnJvci4ADQFGb3IgdGhlIG9yaWdpbiBvdGhlciB0aGFuIFQ6OlJlamVjdE9yaWdpbiwgcGFyZW50IGJvdW50eSBtdXN0IGJlIGlu8GFjdGl2ZSBzdGF0ZSwgZm9yIHRoaXMgY2hpbGQtYm91bnR5IGNhbGwgdG8gd29yay4gRm9yIG9yaWdpbpBUOjpSZWplY3RPcmlnaW4gZXhlY3V0aW9uIGlzIGZvcmNlZC4AAQFJbnN0YW5jZSBvZiBjaGlsZC1ib3VudHkgaXMgcmVtb3ZlZCBmcm9tIHRoZSBzdGF0ZSBvbiBzdWNjZXNzZnVsQGNhbGwgY29tcGxldGlvbi4AtC0gYHBhcmVudF9ib3VudHlfaWRgOiBJbmRleCBvZiBwYXJlbnQgYm91bnR5LqwtIGBjaGlsZF9ib3VudHlfaWRgOiBJbmRleCBvZiBjaGlsZCBib3VudHkuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLiEDDJBwYWxsZXRfZWxlY3Rpb25fcHJvdmlkZXJfbXVsdGlfcGhhc2UYcGFsbGV0EENhbGwEBFQAARQ8c3VibWl0X3Vuc2lnbmVkCAEwcmF3X3NvbHV0aW9uJQMBsEJveDxSYXdTb2x1dGlvbjxTb2x1dGlvbk9mPFQ6Ok1pbmVyQ29uZmlnPj4+AAEcd2l0bmVzc/kDAVhTb2x1dGlvbk9yU25hcHNob3RTaXplAAA4pFN1Ym1pdCBhIHNvbHV0aW9uIGZvciB0aGUgdW5zaWduZWQgcGhhc2UuAMhUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvIHRoaXMgY2FsbCBtdXN0IGJlIF9fbm9uZV9fLgA9AVRoaXMgc3VibWlzc2lvbiBpcyBjaGVja2VkIG9uIHRoZSBmbHkuIE1vcmVvdmVyLCB0aGlzIHVuc2lnbmVkIHNvbHV0aW9uIGlzIG9ubHlVAXZhbGlkYXRlZCB3aGVuIHN1Ym1pdHRlZCB0byB0aGUgcG9vbCBmcm9tIHRoZSAqKmxvY2FsKiogbm9kZS4gRWZmZWN0aXZlbHksIHRoaXMgbWVhbnNdAXRoYXQgb25seSBhY3RpdmUgdmFsaWRhdG9ycyBjYW4gc3VibWl0IHRoaXMgdHJhbnNhY3Rpb24gd2hlbiBhdXRob3JpbmcgYSBibG9jayAoc2ltaWxhckB0byBhbiBpbmhlcmVudCkuAFkBVG8gcHJldmVudCBhbnkgaW5jb3JyZWN0IHNvbHV0aW9uIChhbmQgdGh1cyB3YXN0ZWQgdGltZS93ZWlnaHQpLCB0aGlzIHRyYW5zYWN0aW9uIHdpbGxNAXBhbmljIGlmIHRoZSBzb2x1dGlvbiBzdWJtaXR0ZWQgYnkgdGhlIHZhbGlkYXRvciBpcyBpbnZhbGlkIGluIGFueSB3YXksIGVmZmVjdGl2ZWx5nHB1dHRpbmcgdGhlaXIgYXV0aG9yaW5nIHJld2FyZCBhdCByaXNrLgDgTm8gZGVwb3NpdCBvciByZXdhcmQgaXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc3VibWlzc2lvbi5sc2V0X21pbmltdW1fdW50cnVzdGVkX3Njb3JlBAFAbWF5YmVfbmV4dF9zY29yZf0DAVRPcHRpb248RWxlY3Rpb25TY29yZT4AARSwU2V0IGEgbmV3IHZhbHVlIGZvciBgTWluaW11bVVudHJ1c3RlZFNjb3JlYC4A2ERpc3BhdGNoIG9yaWdpbiBtdXN0IGJlIGFsaWduZWQgd2l0aCBgVDo6Rm9yY2VPcmlnaW5gLgDwVGhpcyBjaGVjayBjYW4gYmUgdHVybmVkIG9mZiBieSBzZXR0aW5nIHRoZSB2YWx1ZSB0byBgTm9uZWAudHNldF9lbWVyZ2VuY3lfZWxlY3Rpb25fcmVzdWx0BAEgc3VwcG9ydHMBBAFYU3VwcG9ydHM8VDo6QWNjb3VudElkPgACIFkBU2V0IGEgc29sdXRpb24gaW4gdGhlIHF1ZXVlLCB0byBiZSBoYW5kZWQgb3V0IHRvIHRoZSBjbGllbnQgb2YgdGhpcyBwYWxsZXQgaW4gdGhlIG5leHSIY2FsbCB0byBgRWxlY3Rpb25Qcm92aWRlcjo6ZWxlY3RgLgBFAVRoaXMgY2FuIG9ubHkgYmUgc2V0IGJ5IGBUOjpGb3JjZU9yaWdpbmAsIGFuZCBvbmx5IHdoZW4gdGhlIHBoYXNlIGlzIGBFbWVyZ2VuY3lgLgBhAVRoZSBzb2x1dGlvbiBpcyBub3QgY2hlY2tlZCBmb3IgYW55IGZlYXNpYmlsaXR5IGFuZCBpcyBhc3N1bWVkIHRvIGJlIHRydXN0d29ydGh5LCBhcyBhbnlRAWZlYXNpYmlsaXR5IGNoZWNrIGl0c2VsZiBjYW4gaW4gcHJpbmNpcGxlIGNhdXNlIHRoZSBlbGVjdGlvbiBwcm9jZXNzIHRvIGZhaWwgKGR1ZSB0b2htZW1vcnkvd2VpZ2h0IGNvbnN0cmFpbnMpLhhzdWJtaXQEATByYXdfc29sdXRpb24lAwGwQm94PFJhd1NvbHV0aW9uPFNvbHV0aW9uT2Y8VDo6TWluZXJDb25maWc+Pj4AAyScU3VibWl0IGEgc29sdXRpb24gZm9yIHRoZSBzaWduZWQgcGhhc2UuANBUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvIHRoaXMgY2FsbCBtdXN0IGJlIF9fc2lnbmVkX18uAF0BVGhlIHNvbHV0aW9uIGlzIHBvdGVudGlhbGx5IHF1ZXVlZCwgYmFzZWQgb24gdGhlIGNsYWltZWQgc2NvcmUgYW5kIHByb2Nlc3NlZCBhdCB0aGUgZW5kUG9mIHRoZSBzaWduZWQgcGhhc2UuAF0BQSBkZXBvc2l0IGlzIHJlc2VydmVkIGFuZCByZWNvcmRlZCBmb3IgdGhlIHNvbHV0aW9uLiBCYXNlZCBvbiB0aGUgb3V0Y29tZSwgdGhlIHNvbHV0aW9uFQFtaWdodCBiZSByZXdhcmRlZCwgc2xhc2hlZCwgb3IgZ2V0IGFsbCBvciBhIHBhcnQgb2YgdGhlIGRlcG9zaXQgYmFjay5MZ292ZXJuYW5jZV9mYWxsYmFjawgBQG1heWJlX21heF92b3RlcnNhAgEsT3B0aW9uPHUzMj4AAURtYXliZV9tYXhfdGFyZ2V0c2ECASxPcHRpb248dTMyPgAEEIBUcmlnZ2VyIHRoZSBnb3Zlcm5hbmNlIGZhbGxiYWNrLgBJAVRoaXMgY2FuIG9ubHkgYmUgY2FsbGVkIHdoZW4gW2BQaGFzZTo6RW1lcmdlbmN5YF0gaXMgZW5hYmxlZCwgYXMgYW4gYWx0ZXJuYXRpdmUgdG/AY2FsbGluZyBbYENhbGw6OnNldF9lbWVyZ2VuY3lfZWxlY3Rpb25fcmVzdWx0YF0uBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLiUDCJBwYWxsZXRfZWxlY3Rpb25fcHJvdmlkZXJfbXVsdGlfcGhhc2UsUmF3U29sdXRpb24EBFMBKQMADAEgc29sdXRpb24pAwEEUwABFHNjb3Jl9QMBNEVsZWN0aW9uU2NvcmUAARRyb3VuZBABDHUzMgAAKQMINHBhc2VvX3J1bnRpbWVUTnBvc0NvbXBhY3RTb2x1dGlvbjE2AABAARh2b3RlczEtAwAAARh2b3RlczI5AwAAARh2b3RlczNNAwAAARh2b3RlczRZAwAAARh2b3RlczVlAwAAARh2b3RlczZxAwAAARh2b3Rlczd9AwAAARh2b3RlcziJAwAAARh2b3RlczmVAwAAARx2b3RlczEwoQMAAAEcdm90ZXMxMa0DAAABHHZvdGVzMTK5AwAAARx2b3RlczEzxQMAAAEcdm90ZXMxNNEDAAABHHZvdGVzMTXdAwAAARx2b3RlczE26QMAAAAtAwAAAjEDADEDAAAECOw1AwA1AwAABm0BADkDAAACPQMAPQMAAAQM7EEDNQMAQQMAAAQINQNFAwBFAwAABkkDAEkDDDRzcF9hcml0aG1ldGljKHBlcl90aGluZ3MYUGVyVTE2AAAEAG0BAQx1MTYAAE0DAAACUQMAUQMAAAQM7FUDNQMAVQMAAAMCAAAAQQMAWQMAAAJdAwBdAwAABAzsYQM1AwBhAwAAAwMAAABBAwBlAwAAAmkDAGkDAAAEDOxtAzUDAG0DAAADBAAAAEEDAHEDAAACdQMAdQMAAAQM7HkDNQMAeQMAAAMFAAAAQQMAfQMAAAKBAwCBAwAABAzshQM1AwCFAwAAAwYAAABBAwCJAwAAAo0DAI0DAAAEDOyRAzUDAJEDAAADBwAAAEEDAJUDAAACmQMAmQMAAAQM7J0DNQMAnQMAAAMIAAAAQQMAoQMAAAKlAwClAwAABAzsqQM1AwCpAwAAAwkAAABBAwCtAwAAArEDALEDAAAEDOy1AzUDALUDAAADCgAAAEEDALkDAAACvQMAvQMAAAQM7MEDNQMAwQMAAAMLAAAAQQMAxQMAAALJAwDJAwAABAzszQM1AwDNAwAAAwwAAABBAwDRAwAAAtUDANUDAAAEDOzZAzUDANkDAAADDQAAAEEDAN0DAAAC4QMA4QMAAAQM7OUDNQMA5QMAAAMOAAAAQQMA6QMAAALtAwDtAwAABAzs8QM1AwDxAwAAAw8AAABBAwD1AwhEc3BfbnBvc19lbGVjdGlvbnM0RWxlY3Rpb25TY29yZQAADAE0bWluaW1hbF9zdGFrZRgBPEV4dGVuZGVkQmFsYW5jZQABJHN1bV9zdGFrZRgBPEV4dGVuZGVkQmFsYW5jZQABRHN1bV9zdGFrZV9zcXVhcmVkGAE8RXh0ZW5kZWRCYWxhbmNlAAD5AwiQcGFsbGV0X2VsZWN0aW9uX3Byb3ZpZGVyX211bHRpX3BoYXNlWFNvbHV0aW9uT3JTbmFwc2hvdFNpemUAAAgBGHZvdGVyc+wBDHUzMgABHHRhcmdldHPsAQx1MzIAAP0DBBhPcHRpb24EBFQB9QMBCBBOb25lAAAAEFNvbWUEAPUDAAABAAABBAAAAgUEAAUEAAAECAAJBAAJBAhEc3BfbnBvc19lbGVjdGlvbnMcU3VwcG9ydAQkQWNjb3VudElkAQAACAEUdG90YWwYATxFeHRlbmRlZEJhbGFuY2UAARh2b3RlcnMNBAGEVmVjPChBY2NvdW50SWQsIEV4dGVuZGVkQmFsYW5jZSk+AAANBAAAAhEEABEEAAAECAAYABUEDEBwYWxsZXRfYmFnc19saXN0GHBhbGxldBBDYWxsCARUAARJAAEMFHJlYmFnBAEoZGlzbG9jYXRlZMUBAVBBY2NvdW50SWRMb29rdXBPZjxUPgAAKFkBRGVjbGFyZSB0aGF0IHNvbWUgYGRpc2xvY2F0ZWRgIGFjY291bnQgaGFzLCB0aHJvdWdoIHJld2FyZHMgb3IgcGVuYWx0aWVzLCBzdWZmaWNpZW50bHlRAWNoYW5nZWQgaXRzIHNjb3JlIHRoYXQgaXQgc2hvdWxkIHByb3Blcmx5IGZhbGwgaW50byBhIGRpZmZlcmVudCBiYWcgdGhhbiBpdHMgY3VycmVudBBvbmUuAB0BQW55b25lIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24gYWJvdXQgYW55IHBvdGVudGlhbGx5IGRpc2xvY2F0ZWQgYWNjb3VudC4ASQFXaWxsIGFsd2F5cyB1cGRhdGUgdGhlIHN0b3JlZCBzY29yZSBvZiBgZGlzbG9jYXRlZGAgdG8gdGhlIGNvcnJlY3Qgc2NvcmUsIGJhc2VkIG9uQGBTY29yZVByb3ZpZGVyYC4A1ElmIGBkaXNsb2NhdGVkYCBkb2VzIG5vdCBleGlzdHMsIGl0IHJldHVybnMgYW4gZXJyb3IuPHB1dF9pbl9mcm9udF9vZgQBHGxpZ2h0ZXLFAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AASjQTW92ZSB0aGUgY2FsbGVyJ3MgSWQgZGlyZWN0bHkgaW4gZnJvbnQgb2YgYGxpZ2h0ZXJgLgBZAVRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfIGFuZCBjYW4gb25seSBiZSBjYWxsZWQgYnkgdGhlIElkIG9mNQF0aGUgYWNjb3VudCBnb2luZyBpbiBmcm9udCBvZiBgbGlnaHRlcmAuIEZlZSBpcyBwYXllZCBieSB0aGUgb3JpZ2luIHVuZGVyIGFsbDhjaXJjdW1zdGFuY2VzLgA4T25seSB3b3JrcyBpZjoAlC0gYm90aCBub2RlcyBhcmUgd2l0aGluIHRoZSBzYW1lIGJhZyzQLSBhbmQgYG9yaWdpbmAgaGFzIGEgZ3JlYXRlciBgU2NvcmVgIHRoYW4gYGxpZ2h0ZXJgLlRwdXRfaW5fZnJvbnRfb2Zfb3RoZXIIARxoZWF2aWVyxQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEcbGlnaHRlcsUBAVBBY2NvdW50SWRMb29rdXBPZjxUPgACDBEBU2FtZSBhcyBbYFBhbGxldDo6cHV0X2luX2Zyb250X29mYF0sIGJ1dCBpdCBjYW4gYmUgY2FsbGVkIGJ5IGFueW9uZS4AyEZlZSBpcyBwYWlkIGJ5IHRoZSBvcmlnaW4gdW5kZXIgYWxsIGNpcmN1bXN0YW5jZXMuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLhkEDFxwYWxsZXRfbm9taW5hdGlvbl9wb29scxhwYWxsZXQQQ2FsbAQEVAABaBBqb2luCAEYYW1vdW50/AEwQmFsYW5jZU9mPFQ+AAEccG9vbF9pZBABGFBvb2xJZAAAKEUBU3Rha2UgZnVuZHMgd2l0aCBhIHBvb2wuIFRoZSBhbW91bnQgdG8gYm9uZCBpcyB0cmFuc2ZlcnJlZCBmcm9tIHRoZSBtZW1iZXIgdG8gdGhl3HBvb2xzIGFjY291bnQgYW5kIGltbWVkaWF0ZWx5IGluY3JlYXNlcyB0aGUgcG9vbHMgYm9uZC4AGCMgTm90ZQDMKiBBbiBhY2NvdW50IGNhbiBvbmx5IGJlIGEgbWVtYmVyIG9mIGEgc2luZ2xlIHBvb2wu2CogQW4gYWNjb3VudCBjYW5ub3Qgam9pbiB0aGUgc2FtZSBwb29sIG11bHRpcGxlIHRpbWVzLkEBKiBUaGlzIGNhbGwgd2lsbCAqbm90KiBkdXN0IHRoZSBtZW1iZXIgYWNjb3VudCwgc28gdGhlIG1lbWJlciBtdXN0IGhhdmUgYXQgbGVhc3TIICBgZXhpc3RlbnRpYWwgZGVwb3NpdCArIGFtb3VudGAgaW4gdGhlaXIgYWNjb3VudC7QKiBPbmx5IGEgcG9vbCB3aXRoIFtgUG9vbFN0YXRlOjpPcGVuYF0gY2FuIGJlIGpvaW5lZChib25kX2V4dHJhBAEUZXh0cmEdBAFcQm9uZEV4dHJhPEJhbGFuY2VPZjxUPj4AARxFAUJvbmQgYGV4dHJhYCBtb3JlIGZ1bmRzIGZyb20gYG9yaWdpbmAgaW50byB0aGUgcG9vbCB0byB3aGljaCB0aGV5IGFscmVhZHkgYmVsb25nLgBJAUFkZGl0aW9uYWwgZnVuZHMgY2FuIGNvbWUgZnJvbSBlaXRoZXIgdGhlIGZyZWUgYmFsYW5jZSBvZiB0aGUgYWNjb3VudCwgb2YgZnJvbSB0aGWcYWNjdW11bGF0ZWQgcmV3YXJkcywgc2VlIFtgQm9uZEV4dHJhYF0uAD0BQm9uZGluZyBleHRyYSBmdW5kcyBpbXBsaWVzIGFuIGF1dG9tYXRpYyBwYXlvdXQgb2YgYWxsIHBlbmRpbmcgcmV3YXJkcyBhcyB3ZWxsLgkBU2VlIGBib25kX2V4dHJhX290aGVyYCB0byBib25kIHBlbmRpbmcgcmV3YXJkcyBvZiBgb3RoZXJgIG1lbWJlcnMuMGNsYWltX3BheW91dAACIFUBQSBib25kZWQgbWVtYmVyIGNhbiB1c2UgdGhpcyB0byBjbGFpbSB0aGVpciBwYXlvdXQgYmFzZWQgb24gdGhlIHJld2FyZHMgdGhhdCB0aGUgcG9vbGEBaGFzIGFjY3VtdWxhdGVkIHNpbmNlIHRoZWlyIGxhc3QgY2xhaW1lZCBwYXlvdXQgKE9SIHNpbmNlIGpvaW5pbmcgaWYgdGhpcyBpcyB0aGVpciBmaXJzdD0BdGltZSBjbGFpbWluZyByZXdhcmRzKS4gVGhlIHBheW91dCB3aWxsIGJlIHRyYW5zZmVycmVkIHRvIHRoZSBtZW1iZXIncyBhY2NvdW50LgBJAVRoZSBtZW1iZXIgd2lsbCBlYXJuIHJld2FyZHMgcHJvIHJhdGEgYmFzZWQgb24gdGhlIG1lbWJlcnMgc3Rha2UgdnMgdGhlIHN1bSBvZiB0aGXQbWVtYmVycyBpbiB0aGUgcG9vbHMgc3Rha2UuIFJld2FyZHMgZG8gbm90ICJleHBpcmUiLgBBAVNlZSBgY2xhaW1fcGF5b3V0X290aGVyYCB0byBjbGFpbSByZXdhcmRzIG9uIGJlaGFsZiBvZiBzb21lIGBvdGhlcmAgcG9vbCBtZW1iZXIuGHVuYm9uZAgBOG1lbWJlcl9hY2NvdW50xQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAFAdW5ib25kaW5nX3BvaW50c/wBMEJhbGFuY2VPZjxUPgADfEUBVW5ib25kIHVwIHRvIGB1bmJvbmRpbmdfcG9pbnRzYCBvZiB0aGUgYG1lbWJlcl9hY2NvdW50YCdzIGZ1bmRzIGZyb20gdGhlIHBvb2wuIEl0RQFpbXBsaWNpdGx5IGNvbGxlY3RzIHRoZSByZXdhcmRzIG9uZSBsYXN0IHRpbWUsIHNpbmNlIG5vdCBkb2luZyBzbyB3b3VsZCBtZWFuIHNvbWVscmV3YXJkcyB3b3VsZCBiZSBmb3JmZWl0ZWQuAE0BVW5kZXIgY2VydGFpbiBjb25kaXRpb25zLCB0aGlzIGNhbGwgY2FuIGJlIGRpc3BhdGNoZWQgcGVybWlzc2lvbmxlc3NseSAoaS5lLiBieSBhbnkkYWNjb3VudCkuAKwjIENvbmRpdGlvbnMgZm9yIGEgcGVybWlzc2lvbmxlc3MgZGlzcGF0Y2guAF0BKiBUaGUgcG9vbCBpcyBibG9ja2VkIGFuZCB0aGUgY2FsbGVyIGlzIGVpdGhlciB0aGUgcm9vdCBvciBib3VuY2VyLiBUaGlzIGlzIHJlZmVyZWVkIHRvMCAgYXMgYSBraWNrLvQqIFRoZSBwb29sIGlzIGRlc3Ryb3lpbmcgYW5kIHRoZSBtZW1iZXIgaXMgbm90IHRoZSBkZXBvc2l0b3IuVQEqIFRoZSBwb29sIGlzIGRlc3Ryb3lpbmcsIHRoZSBtZW1iZXIgaXMgdGhlIGRlcG9zaXRvciBhbmQgbm8gb3RoZXIgbWVtYmVycyBhcmUgaW4gdGhlHCAgcG9vbC4AEQEjIyBDb25kaXRpb25zIGZvciBwZXJtaXNzaW9uZWQgZGlzcGF0Y2ggKGkuZS4gdGhlIGNhbGxlciBpcyBhbHNvIHRoZUhgbWVtYmVyX2FjY291bnRgKToAiCogVGhlIGNhbGxlciBpcyBub3QgdGhlIGRlcG9zaXRvci5VASogVGhlIGNhbGxlciBpcyB0aGUgZGVwb3NpdG9yLCB0aGUgcG9vbCBpcyBkZXN0cm95aW5nIGFuZCBubyBvdGhlciBtZW1iZXJzIGFyZSBpbiB0aGUcICBwb29sLgAYIyBOb3RlAB0BSWYgdGhlcmUgYXJlIHRvbyBtYW55IHVubG9ja2luZyBjaHVua3MgdG8gdW5ib25kIHdpdGggdGhlIHBvb2wgYWNjb3VudCxRAVtgQ2FsbDo6cG9vbF93aXRoZHJhd191bmJvbmRlZGBdIGNhbiBiZSBjYWxsZWQgdG8gdHJ5IGFuZCBtaW5pbWl6ZSB1bmxvY2tpbmcgY2h1bmtzLlkBVGhlIFtgU3Rha2luZ0ludGVyZmFjZTo6dW5ib25kYF0gd2lsbCBpbXBsaWNpdGx5IGNhbGwgW2BDYWxsOjpwb29sX3dpdGhkcmF3X3VuYm9uZGVkYF1VAXRvIHRyeSB0byBmcmVlIGNodW5rcyBpZiBuZWNlc3NhcnkgKGllLiBpZiB1bmJvdW5kIHdhcyBjYWxsZWQgYW5kIG5vIHVubG9ja2luZyBjaHVua3NhAWFyZSBhdmFpbGFibGUpLiBIb3dldmVyLCBpdCBtYXkgbm90IGJlIHBvc3NpYmxlIHRvIHJlbGVhc2UgdGhlIGN1cnJlbnQgdW5sb2NraW5nIGNodW5rcyxdAWluIHdoaWNoIGNhc2UsIHRoZSByZXN1bHQgb2YgdGhpcyBjYWxsIHdpbGwgbGlrZWx5IGJlIHRoZSBgTm9Nb3JlQ2h1bmtzYCBlcnJvciBmcm9tIHRoZTxzdGFraW5nIHN5c3RlbS5YcG9vbF93aXRoZHJhd191bmJvbmRlZAgBHHBvb2xfaWQQARhQb29sSWQAAUhudW1fc2xhc2hpbmdfc3BhbnMQAQx1MzIABBhVAUNhbGwgYHdpdGhkcmF3X3VuYm9uZGVkYCBmb3IgdGhlIHBvb2xzIGFjY291bnQuIFRoaXMgY2FsbCBjYW4gYmUgbWFkZSBieSBhbnkgYWNjb3VudC4AQQFUaGlzIGlzIHVzZWZ1bCBpZiB0aGVyZSBhcmUgdG9vIG1hbnkgdW5sb2NraW5nIGNodW5rcyB0byBjYWxsIGB1bmJvbmRgLCBhbmQgc29tZWEBY2FuIGJlIGNsZWFyZWQgYnkgd2l0aGRyYXdpbmcuIEluIHRoZSBjYXNlIHRoZXJlIGFyZSB0b28gbWFueSB1bmxvY2tpbmcgY2h1bmtzLCB0aGUgdXNlclEBd291bGQgcHJvYmFibHkgc2VlIGFuIGVycm9yIGxpa2UgYE5vTW9yZUNodW5rc2AgZW1pdHRlZCBmcm9tIHRoZSBzdGFraW5nIHN5c3RlbSB3aGVuXHRoZXkgYXR0ZW1wdCB0byB1bmJvbmQuRHdpdGhkcmF3X3VuYm9uZGVkCAE4bWVtYmVyX2FjY291bnTFAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AAUhudW1fc2xhc2hpbmdfc3BhbnMQAQx1MzIABVhVAVdpdGhkcmF3IHVuYm9uZGVkIGZ1bmRzIGZyb20gYG1lbWJlcl9hY2NvdW50YC4gSWYgbm8gYm9uZGVkIGZ1bmRzIGNhbiBiZSB1bmJvbmRlZCwgYW5IZXJyb3IgaXMgcmV0dXJuZWQuAE0BVW5kZXIgY2VydGFpbiBjb25kaXRpb25zLCB0aGlzIGNhbGwgY2FuIGJlIGRpc3BhdGNoZWQgcGVybWlzc2lvbmxlc3NseSAoaS5lLiBieSBhbnkkYWNjb3VudCkuAKgjIENvbmRpdGlvbnMgZm9yIGEgcGVybWlzc2lvbmxlc3MgZGlzcGF0Y2gACQEqIFRoZSBwb29sIGlzIGluIGRlc3Ryb3kgbW9kZSBhbmQgdGhlIHRhcmdldCBpcyBub3QgdGhlIGRlcG9zaXRvci4xASogVGhlIHRhcmdldCBpcyB0aGUgZGVwb3NpdG9yIGFuZCB0aGV5IGFyZSB0aGUgb25seSBtZW1iZXIgaW4gdGhlIHN1YiBwb29scy4NASogVGhlIHBvb2wgaXMgYmxvY2tlZCBhbmQgdGhlIGNhbGxlciBpcyBlaXRoZXIgdGhlIHJvb3Qgb3IgYm91bmNlci4AmCMgQ29uZGl0aW9ucyBmb3IgcGVybWlzc2lvbmVkIGRpc3BhdGNoAOgqIFRoZSBjYWxsZXIgaXMgdGhlIHRhcmdldCBhbmQgdGhleSBhcmUgbm90IHRoZSBkZXBvc2l0b3IuABgjIE5vdGUA9C0gSWYgdGhlIHRhcmdldCBpcyB0aGUgZGVwb3NpdG9yLCB0aGUgcG9vbCB3aWxsIGJlIGRlc3Ryb3llZC5hAS0gSWYgdGhlIHBvb2wgaGFzIGFueSBwZW5kaW5nIHNsYXNoLCB3ZSBhbHNvIHRyeSB0byBzbGFzaCB0aGUgbWVtYmVyIGJlZm9yZSBsZXR0aW5nIHRoZW1dAXdpdGhkcmF3LiBUaGlzIGNhbGN1bGF0aW9uIGFkZHMgc29tZSB3ZWlnaHQgb3ZlcmhlYWQgYW5kIGlzIG9ubHkgZGVmZW5zaXZlLiBJbiByZWFsaXR5LFUBcG9vbCBzbGFzaGVzIG11c3QgaGF2ZSBiZWVuIGFscmVhZHkgYXBwbGllZCB2aWEgcGVybWlzc2lvbmxlc3MgW2BDYWxsOjphcHBseV9zbGFzaGBdLhhjcmVhdGUQARhhbW91bnT8ATBCYWxhbmNlT2Y8VD4AARByb290xQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEkbm9taW5hdG9yxQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEcYm91bmNlcsUBAVBBY2NvdW50SWRMb29rdXBPZjxUPgAGRHRDcmVhdGUgYSBuZXcgZGVsZWdhdGlvbiBwb29sLgAsIyBBcmd1bWVudHMAVQEqIGBhbW91bnRgIC0gVGhlIGFtb3VudCBvZiBmdW5kcyB0byBkZWxlZ2F0ZSB0byB0aGUgcG9vbC4gVGhpcyBhbHNvIGFjdHMgb2YgYSBzb3J0IG9mTQEgIGRlcG9zaXQgc2luY2UgdGhlIHBvb2xzIGNyZWF0b3IgY2Fubm90IGZ1bGx5IHVuYm9uZCBmdW5kcyB1bnRpbCB0aGUgcG9vbCBpcyBiZWluZzAgIGRlc3Ryb3llZC5RASogYGluZGV4YCAtIEEgZGlzYW1iaWd1YXRpb24gaW5kZXggZm9yIGNyZWF0aW5nIHRoZSBhY2NvdW50LiBMaWtlbHkgb25seSB1c2VmdWwgd2hlbsAgIGNyZWF0aW5nIG11bHRpcGxlIHBvb2xzIGluIHRoZSBzYW1lIGV4dHJpbnNpYy7UKiBgcm9vdGAgLSBUaGUgYWNjb3VudCB0byBzZXQgYXMgW2BQb29sUm9sZXM6OnJvb3RgXS4NASogYG5vbWluYXRvcmAgLSBUaGUgYWNjb3VudCB0byBzZXQgYXMgdGhlIFtgUG9vbFJvbGVzOjpub21pbmF0b3JgXS78KiBgYm91bmNlcmAgLSBUaGUgYWNjb3VudCB0byBzZXQgYXMgdGhlIFtgUG9vbFJvbGVzOjpib3VuY2VyYF0uABgjIE5vdGUAYQFJbiBhZGRpdGlvbiB0byBgYW1vdW50YCwgdGhlIGNhbGxlciB3aWxsIHRyYW5zZmVyIHRoZSBleGlzdGVudGlhbCBkZXBvc2l0OyBzbyB0aGUgY2FsbGVyDQFuZWVkcyBhdCBoYXZlIGF0IGxlYXN0IGBhbW91bnQgKyBleGlzdGVudGlhbF9kZXBvc2l0YCB0cmFuc2ZlcmFibGUuTGNyZWF0ZV93aXRoX3Bvb2xfaWQUARhhbW91bnT8ATBCYWxhbmNlT2Y8VD4AARByb290xQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEkbm9taW5hdG9yxQEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEcYm91bmNlcsUBAVBBY2NvdW50SWRMb29rdXBPZjxUPgABHHBvb2xfaWQQARhQb29sSWQABxjsQ3JlYXRlIGEgbmV3IGRlbGVnYXRpb24gcG9vbCB3aXRoIGEgcHJldmlvdXNseSB1c2VkIHBvb2wgaWQALCMgQXJndW1lbnRzAJhzYW1lIGFzIGBjcmVhdGVgIHdpdGggdGhlIGluY2x1c2lvbiBvZngqIGBwb29sX2lkYCAtIGBBIHZhbGlkIFBvb2xJZC4gbm9taW5hdGUIARxwb29sX2lkEAEYUG9vbElkAAEodmFsaWRhdG9yc9EBAURWZWM8VDo6QWNjb3VudElkPgAIMHxOb21pbmF0ZSBvbiBiZWhhbGYgb2YgdGhlIHBvb2wuAEUBVGhlIGRpc3BhdGNoIG9yaWdpbiBvZiB0aGlzIGNhbGwgbXVzdCBiZSBzaWduZWQgYnkgdGhlIHBvb2wgbm9taW5hdG9yIG9yIHRoZSBwb29sKHJvb3Qgcm9sZS4ASQFUaGlzIGRpcmVjdGx5IGZvcndhcmQgdGhlIGNhbGwgdG8gdGhlIHN0YWtpbmcgcGFsbGV0LCBvbiBiZWhhbGYgb2YgdGhlIHBvb2wgYm9uZGVkIGFjY291bnQuABgjIE5vdGUAXQFJbiBhZGRpdGlvbiB0byBhIGByb290YCBvciBgbm9taW5hdG9yYCByb2xlIG9mIGBvcmlnaW5gLCBwb29sJ3MgZGVwb3NpdG9yIG5lZWRzIHRvIGhhdmX4YXQgbGVhc3QgYGRlcG9zaXRvcl9taW5fYm9uZGAgaW4gdGhlIHBvb2wgdG8gc3RhcnQgbm9taW5hdGluZy4kc2V0X3N0YXRlCAEccG9vbF9pZBABGFBvb2xJZAABFHN0YXRlIQQBJFBvb2xTdGF0ZQAJKHRTZXQgYSBuZXcgc3RhdGUgZm9yIHRoZSBwb29sLgBVAUlmIGEgcG9vbCBpcyBhbHJlYWR5IGluIHRoZSBgRGVzdHJveWluZ2Agc3RhdGUsIHRoZW4gdW5kZXIgbm8gY29uZGl0aW9uIGNhbiBpdHMgc3RhdGU0Y2hhbmdlIGFnYWluLgDAVGhlIGRpc3BhdGNoIG9yaWdpbiBvZiB0aGlzIGNhbGwgbXVzdCBiZSBlaXRoZXI6ANwxLiBzaWduZWQgYnkgdGhlIGJvdW5jZXIsIG9yIHRoZSByb290IHJvbGUgb2YgdGhlIHBvb2wsXQEyLiBpZiB0aGUgcG9vbCBjb25kaXRpb25zIHRvIGJlIG9wZW4gYXJlIE5PVCBtZXQgKGFzIGRlc2NyaWJlZCBieSBgb2tfdG9fYmVfb3BlbmApLCBhbmQ5ASAgIHRoZW4gdGhlIHN0YXRlIG9mIHRoZSBwb29sIGNhbiBiZSBwZXJtaXNzaW9ubGVzc2x5IGNoYW5nZWQgdG8gYERlc3Ryb3lpbmdgLjBzZXRfbWV0YWRhdGEIARxwb29sX2lkEAEYUG9vbElkAAEgbWV0YWRhdGE4ARxWZWM8dTg+AAoQgFNldCBhIG5ldyBtZXRhZGF0YSBmb3IgdGhlIHBvb2wuAF0BVGhlIGRpc3BhdGNoIG9yaWdpbiBvZiB0aGlzIGNhbGwgbXVzdCBiZSBzaWduZWQgYnkgdGhlIGJvdW5jZXIsIG9yIHRoZSByb290IHJvbGUgb2YgdGhlFHBvb2wuLHNldF9jb25maWdzGAE0bWluX2pvaW5fYm9uZCUEAVhDb25maWdPcDxCYWxhbmNlT2Y8VD4+AAE8bWluX2NyZWF0ZV9ib25kJQQBWENvbmZpZ09wPEJhbGFuY2VPZjxUPj4AASRtYXhfcG9vbHMpBAE0Q29uZmlnT3A8dTMyPgABLG1heF9tZW1iZXJzKQQBNENvbmZpZ09wPHUzMj4AAVBtYXhfbWVtYmVyc19wZXJfcG9vbCkEATRDb25maWdPcDx1MzI+AAFUZ2xvYmFsX21heF9jb21taXNzaW9uLQQBRENvbmZpZ09wPFBlcmJpbGw+AAssQQFVcGRhdGUgY29uZmlndXJhdGlvbnMgZm9yIHRoZSBub21pbmF0aW9uIHBvb2xzLiBUaGUgb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZWBbYENvbmZpZzo6QWRtaW5PcmlnaW5gXS4ALCMgQXJndW1lbnRzAKAqIGBtaW5fam9pbl9ib25kYCAtIFNldCBbYE1pbkpvaW5Cb25kYF0usCogYG1pbl9jcmVhdGVfYm9uZGAgLSBTZXQgW2BNaW5DcmVhdGVCb25kYF0uhCogYG1heF9wb29sc2AgLSBTZXQgW2BNYXhQb29sc2BdLqQqIGBtYXhfbWVtYmVyc2AgLSBTZXQgW2BNYXhQb29sTWVtYmVyc2BdLuQqIGBtYXhfbWVtYmVyc19wZXJfcG9vbGAgLSBTZXQgW2BNYXhQb29sTWVtYmVyc1BlclBvb2xgXS7gKiBgZ2xvYmFsX21heF9jb21taXNzaW9uYCAtIFNldCBbYEdsb2JhbE1heENvbW1pc3Npb25gXS4wdXBkYXRlX3JvbGVzEAEccG9vbF9pZBABGFBvb2xJZAABIG5ld19yb290MQQBWENvbmZpZ09wPFQ6OkFjY291bnRJZD4AATRuZXdfbm9taW5hdG9yMQQBWENvbmZpZ09wPFQ6OkFjY291bnRJZD4AASxuZXdfYm91bmNlcjEEAVhDb25maWdPcDxUOjpBY2NvdW50SWQ+AAwcdFVwZGF0ZSB0aGUgcm9sZXMgb2YgdGhlIHBvb2wuAD0BVGhlIHJvb3QgaXMgdGhlIG9ubHkgZW50aXR5IHRoYXQgY2FuIGNoYW5nZSBhbnkgb2YgdGhlIHJvbGVzLCBpbmNsdWRpbmcgaXRzZWxmLLhleGNsdWRpbmcgdGhlIGRlcG9zaXRvciwgd2hvIGNhbiBuZXZlciBjaGFuZ2UuAFEBSXQgZW1pdHMgYW4gZXZlbnQsIG5vdGlmeWluZyBVSXMgb2YgdGhlIHJvbGUgY2hhbmdlLiBUaGlzIGV2ZW50IGlzIHF1aXRlIHJlbGV2YW50IHRvHQFtb3N0IHBvb2wgbWVtYmVycyBhbmQgdGhleSBzaG91bGQgYmUgaW5mb3JtZWQgb2YgY2hhbmdlcyB0byBwb29sIHJvbGVzLhRjaGlsbAQBHHBvb2xfaWQQARhQb29sSWQADUBwQ2hpbGwgb24gYmVoYWxmIG9mIHRoZSBwb29sLgBBAVRoZSBkaXNwYXRjaCBvcmlnaW4gb2YgdGhpcyBjYWxsIGNhbiBiZSBzaWduZWQgYnkgdGhlIHBvb2wgbm9taW5hdG9yIG9yIHRoZSBwb29soHJvb3Qgcm9sZSwgc2FtZSBhcyBbYFBhbGxldDo6bm9taW5hdGVgXS4ATQFVbmRlciBjZXJ0YWluIGNvbmRpdGlvbnMsIHRoaXMgY2FsbCBjYW4gYmUgZGlzcGF0Y2hlZCBwZXJtaXNzaW9ubGVzc2x5IChpLmUuIGJ5IGFueSRhY2NvdW50KS4ArCMgQ29uZGl0aW9ucyBmb3IgYSBwZXJtaXNzaW9ubGVzcyBkaXNwYXRjaDpZASogV2hlbiBwb29sIGRlcG9zaXRvciBoYXMgbGVzcyB0aGFuIGBNaW5Ob21pbmF0b3JCb25kYCBzdGFrZWQsIG90aGVyd2lzZSAgcG9vbCBtZW1iZXJzXCAgYXJlIHVuYWJsZSB0byB1bmJvbmQuAJwjIENvbmRpdGlvbnMgZm9yIHBlcm1pc3Npb25lZCBkaXNwYXRjaDrYKiBUaGUgY2FsbGVyIGhhcyBhIG5vbWluYXRvciBvciByb290IHJvbGUgb2YgdGhlIHBvb2wuSQFUaGlzIGRpcmVjdGx5IGZvcndhcmQgdGhlIGNhbGwgdG8gdGhlIHN0YWtpbmcgcGFsbGV0LCBvbiBiZWhhbGYgb2YgdGhlIHBvb2wgYm9uZGVkIGFjY291bnQuQGJvbmRfZXh0cmFfb3RoZXIIARhtZW1iZXLFAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AARRleHRyYR0EAVxCb25kRXh0cmE8QmFsYW5jZU9mPFQ+PgAOJFUBYG9yaWdpbmAgYm9uZHMgZnVuZHMgZnJvbSBgZXh0cmFgIGZvciBzb21lIHBvb2wgbWVtYmVyIGBtZW1iZXJgIGludG8gdGhlaXIgcmVzcGVjdGl2ZRhwb29scy4ASQFgb3JpZ2luYCBjYW4gYm9uZCBleHRyYSBmdW5kcyBmcm9tIGZyZWUgYmFsYW5jZSBvciBwZW5kaW5nIHJld2FyZHMgd2hlbiBgb3JpZ2luID09HG90aGVyYC4ARQFJbiB0aGUgY2FzZSBvZiBgb3JpZ2luICE9IG90aGVyYCwgYG9yaWdpbmAgY2FuIG9ubHkgYm9uZCBleHRyYSBwZW5kaW5nIHJld2FyZHMgb2YVAWBvdGhlcmAgbWVtYmVycyBhc3N1bWluZyBzZXRfY2xhaW1fcGVybWlzc2lvbiBmb3IgdGhlIGdpdmVuIG1lbWJlciBpc8BgUGVybWlzc2lvbmxlc3NDb21wb3VuZGAgb3IgYFBlcm1pc3Npb25sZXNzQWxsYC5Qc2V0X2NsYWltX3Blcm1pc3Npb24EAShwZXJtaXNzaW9uNQQBPENsYWltUGVybWlzc2lvbgAPHEkBQWxsb3dzIGEgcG9vbCBtZW1iZXIgdG8gc2V0IGEgY2xhaW0gcGVybWlzc2lvbiB0byBhbGxvdyBvciBkaXNhbGxvdyBwZXJtaXNzaW9ubGVzc2Bib25kaW5nIGFuZCB3aXRoZHJhd2luZy4ALCMgQXJndW1lbnRzAHgqIGBvcmlnaW5gIC0gTWVtYmVyIG9mIGEgcG9vbC64KiBgcGVybWlzc2lvbmAgLSBUaGUgcGVybWlzc2lvbiB0byBiZSBhcHBsaWVkLkhjbGFpbV9wYXlvdXRfb3RoZXIEARRvdGhlcgABMFQ6OkFjY291bnRJZAAQEAEBYG9yaWdpbmAgY2FuIGNsYWltIHBheW91dHMgb24gc29tZSBwb29sIG1lbWJlciBgb3RoZXJgJ3MgYmVoYWxmLgBVAVBvb2wgbWVtYmVyIGBvdGhlcmAgbXVzdCBoYXZlIGEgYFBlcm1pc3Npb25sZXNzV2l0aGRyYXdgIG9yIGBQZXJtaXNzaW9ubGVzc0FsbGAgY2xhaW2ocGVybWlzc2lvbiBmb3IgdGhpcyBjYWxsIHRvIGJlIHN1Y2Nlc3NmdWwuOHNldF9jb21taXNzaW9uCAEccG9vbF9pZBABGFBvb2xJZAABOG5ld19jb21taXNzaW9uOQQBfE9wdGlvbjwoUGVyYmlsbCwgVDo6QWNjb3VudElkKT4AERR0U2V0IHRoZSBjb21taXNzaW9uIG9mIGEgcG9vbC5VAUJvdGggYSBjb21taXNzaW9uIHBlcmNlbnRhZ2UgYW5kIGEgY29tbWlzc2lvbiBwYXllZSBtdXN0IGJlIHByb3ZpZGVkIGluIHRoZSBgY3VycmVudGBdAXR1cGxlLiBXaGVyZSBhIGBjdXJyZW50YCBvZiBgTm9uZWAgaXMgcHJvdmlkZWQsIGFueSBjdXJyZW50IGNvbW1pc3Npb24gd2lsbCBiZSByZW1vdmVkLgBNAS0gSWYgYSBgTm9uZWAgaXMgc3VwcGxpZWQgdG8gYG5ld19jb21taXNzaW9uYCwgZXhpc3RpbmcgY29tbWlzc2lvbiB3aWxsIGJlIHJlbW92ZWQuSHNldF9jb21taXNzaW9uX21heAgBHHBvb2xfaWQQARhQb29sSWQAAThtYXhfY29tbWlzc2lvbqwBHFBlcmJpbGwAEhSUU2V0IHRoZSBtYXhpbXVtIGNvbW1pc3Npb24gb2YgYSBwb29sLgA5AS0gSW5pdGlhbCBtYXggY2FuIGJlIHNldCB0byBhbnkgYFBlcmJpbGxgLCBhbmQgb25seSBzbWFsbGVyIHZhbHVlcyB0aGVyZWFmdGVyLjUBLSBDdXJyZW50IGNvbW1pc3Npb24gd2lsbCBiZSBsb3dlcmVkIGluIHRoZSBldmVudCBpdCBpcyBoaWdoZXIgdGhhbiBhIG5ldyBtYXg0ICBjb21taXNzaW9uLmhzZXRfY29tbWlzc2lvbl9jaGFuZ2VfcmF0ZQgBHHBvb2xfaWQQARhQb29sSWQAASxjaGFuZ2VfcmF0ZUEEAZxDb21taXNzaW9uQ2hhbmdlUmF0ZTxCbG9ja051bWJlckZvcjxUPj4AExCoU2V0IHRoZSBjb21taXNzaW9uIGNoYW5nZSByYXRlIGZvciBhIHBvb2wuAD0BSW5pdGlhbCBjaGFuZ2UgcmF0ZSBpcyBub3QgYm91bmRlZCwgd2hlcmVhcyBzdWJzZXF1ZW50IHVwZGF0ZXMgY2FuIG9ubHkgYmUgbW9yZXRyZXN0cmljdGl2ZSB0aGFuIHRoZSBjdXJyZW50LkBjbGFpbV9jb21taXNzaW9uBAEccG9vbF9pZBABGFBvb2xJZAAUFGRDbGFpbSBwZW5kaW5nIGNvbW1pc3Npb24uAF0BVGhlIGRpc3BhdGNoIG9yaWdpbiBvZiB0aGlzIGNhbGwgbXVzdCBiZSBzaWduZWQgYnkgdGhlIGByb290YCByb2xlIG9mIHRoZSBwb29sLiBQZW5kaW5nXQFjb21taXNzaW9uIGlzIHBhaWQgb3V0IGFuZCBhZGRlZCB0byB0b3RhbCBjbGFpbWVkIGNvbW1pc3Npb25gLiBUb3RhbCBwZW5kaW5nIGNvbW1pc3Npb254aXMgcmVzZXQgdG8gemVyby4gdGhlIGN1cnJlbnQuTGFkanVzdF9wb29sX2RlcG9zaXQEARxwb29sX2lkEAEYUG9vbElkABUc7FRvcCB1cCB0aGUgZGVmaWNpdCBvciB3aXRoZHJhdyB0aGUgZXhjZXNzIEVEIGZyb20gdGhlIHBvb2wuAFEBV2hlbiBhIHBvb2wgaXMgY3JlYXRlZCwgdGhlIHBvb2wgZGVwb3NpdG9yIHRyYW5zZmVycyBFRCB0byB0aGUgcmV3YXJkIGFjY291bnQgb2YgdGhlVQFwb29sLiBFRCBpcyBzdWJqZWN0IHRvIGNoYW5nZSBhbmQgb3ZlciB0aW1lLCB0aGUgZGVwb3NpdCBpbiB0aGUgcmV3YXJkIGFjY291bnQgbWF5IGJlUQFpbnN1ZmZpY2llbnQgdG8gY292ZXIgdGhlIEVEIGRlZmljaXQgb2YgdGhlIHBvb2wgb3IgdmljZS12ZXJzYSB3aGVyZSB0aGVyZSBpcyBleGNlc3MxAWRlcG9zaXQgdG8gdGhlIHBvb2wuIFRoaXMgY2FsbCBhbGxvd3MgYW55b25lIHRvIGFkanVzdCB0aGUgRUQgZGVwb3NpdCBvZiB0aGX0cG9vbCBieSBlaXRoZXIgdG9wcGluZyB1cCB0aGUgZGVmaWNpdCBvciBjbGFpbWluZyB0aGUgZXhjZXNzLnxzZXRfY29tbWlzc2lvbl9jbGFpbV9wZXJtaXNzaW9uCAEccG9vbF9pZBABGFBvb2xJZAABKHBlcm1pc3Npb25FBAG8T3B0aW9uPENvbW1pc3Npb25DbGFpbVBlcm1pc3Npb248VDo6QWNjb3VudElkPj4AFhDMU2V0IG9yIHJlbW92ZSBhIHBvb2wncyBjb21taXNzaW9uIGNsYWltIHBlcm1pc3Npb24uAGEBRGV0ZXJtaW5lcyB3aG8gY2FuIGNsYWltIHRoZSBwb29sJ3MgcGVuZGluZyBjb21taXNzaW9uLiBPbmx5IHRoZSBgUm9vdGAgcm9sZSBvZiB0aGUgcG9vbMhpcyBhYmxlIHRvIGNvbmZpZ3VyZSBjb21taXNzaW9uIGNsYWltIHBlcm1pc3Npb25zLixhcHBseV9zbGFzaAQBOG1lbWJlcl9hY2NvdW50xQEBUEFjY291bnRJZExvb2t1cE9mPFQ+ABcciEFwcGx5IGEgcGVuZGluZyBzbGFzaCBvbiBhIG1lbWJlci4AJQFGYWlscyB1bmxlc3MgW2BjcmF0ZTo6cGFsbGV0OjpDb25maWc6OlN0YWtlQWRhcHRlcmBdIGlzIG9mIHN0cmF0ZWd5IHR5cGU6pFtgYWRhcHRlcjo6U3Rha2VTdHJhdGVneVR5cGU6OkRlbGVnYXRlYF0uAFUBVGhpcyBjYWxsIGNhbiBiZSBkaXNwYXRjaGVkIHBlcm1pc3Npb25sZXNzbHkgKGkuZS4gYnkgYW55IGFjY291bnQpLiBJZiB0aGUgbWVtYmVyIGhhcx0Bc2xhc2ggdG8gYmUgYXBwbGllZCwgY2FsbGVyIG1heSBiZSByZXdhcmRlZCB3aXRoIHRoZSBwYXJ0IG9mIHRoZSBzbGFzaC5IbWlncmF0ZV9kZWxlZ2F0aW9uBAE4bWVtYmVyX2FjY291bnTFAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AGCQdAU1pZ3JhdGVzIGRlbGVnYXRlZCBmdW5kcyBmcm9tIHRoZSBwb29sIGFjY291bnQgdG8gdGhlIGBtZW1iZXJfYWNjb3VudGAuACUBRmFpbHMgdW5sZXNzIFtgY3JhdGU6OnBhbGxldDo6Q29uZmlnOjpTdGFrZUFkYXB0ZXJgXSBpcyBvZiBzdHJhdGVneSB0eXBlOqRbYGFkYXB0ZXI6OlN0YWtlU3RyYXRlZ3lUeXBlOjpEZWxlZ2F0ZWBdLgApAVRoaXMgaXMgYSBwZXJtaXNzaW9uLWxlc3MgY2FsbCBhbmQgcmVmdW5kcyBhbnkgZmVlIGlmIGNsYWltIGlzIHN1Y2Nlc3NmdWwuAF0BSWYgdGhlIHBvb2wgaGFzIG1pZ3JhdGVkIHRvIGRlbGVnYXRpb24gYmFzZWQgc3Rha2luZywgdGhlIHN0YWtlZCB0b2tlbnMgb2YgcG9vbCBtZW1iZXJzKQFjYW4gYmUgbW92ZWQgYW5kIGhlbGQgaW4gdGhlaXIgb3duIGFjY291bnQuIFNlZSBbYGFkYXB0ZXI6OkRlbGVnYXRlU3Rha2VgXXhtaWdyYXRlX3Bvb2xfdG9fZGVsZWdhdGVfc3Rha2UEARxwb29sX2lkEAEYUG9vbElkABkk9E1pZ3JhdGUgcG9vbCBmcm9tIFtgYWRhcHRlcjo6U3Rha2VTdHJhdGVneVR5cGU6OlRyYW5zZmVyYF0gdG+kW2BhZGFwdGVyOjpTdGFrZVN0cmF0ZWd5VHlwZTo6RGVsZWdhdGVgXS4AJQFGYWlscyB1bmxlc3MgW2BjcmF0ZTo6cGFsbGV0OjpDb25maWc6OlN0YWtlQWRhcHRlcmBdIGlzIG9mIHN0cmF0ZWd5IHR5cGU6pFtgYWRhcHRlcjo6U3Rha2VTdHJhdGVneVR5cGU6OkRlbGVnYXRlYF0uAEEBVGhpcyBjYWxsIGNhbiBiZSBkaXNwYXRjaGVkIHBlcm1pc3Npb25sZXNzbHksIGFuZCByZWZ1bmRzIGFueSBmZWUgaWYgc3VjY2Vzc2Z1bC4ASQFJZiB0aGUgcG9vbCBoYXMgYWxyZWFkeSBtaWdyYXRlZCB0byBkZWxlZ2F0aW9uIGJhc2VkIHN0YWtpbmcsIHRoaXMgY2FsbCB3aWxsIGZhaWwuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLh0ECFxwYWxsZXRfbm9taW5hdGlvbl9wb29scyRCb25kRXh0cmEEHEJhbGFuY2UBGAEILEZyZWVCYWxhbmNlBAAYARxCYWxhbmNlAAAAHFJld2FyZHMAAQAAIQQIXHBhbGxldF9ub21pbmF0aW9uX3Bvb2xzJFBvb2xTdGF0ZQABDBBPcGVuAAAAHEJsb2NrZWQAAQAoRGVzdHJveWluZwACAAAlBAhccGFsbGV0X25vbWluYXRpb25fcG9vbHMgQ29uZmlnT3AEBFQBGAEMEE5vb3AAAAAMU2V0BAAYAQRUAAEAGFJlbW92ZQACAAApBAhccGFsbGV0X25vbWluYXRpb25fcG9vbHMgQ29uZmlnT3AEBFQBEAEMEE5vb3AAAAAMU2V0BAAQAQRUAAEAGFJlbW92ZQACAAAtBAhccGFsbGV0X25vbWluYXRpb25fcG9vbHMgQ29uZmlnT3AEBFQBrAEMEE5vb3AAAAAMU2V0BACsAQRUAAEAGFJlbW92ZQACAAAxBAhccGFsbGV0X25vbWluYXRpb25fcG9vbHMgQ29uZmlnT3AEBFQBAAEMEE5vb3AAAAAMU2V0BAAAAQRUAAEAGFJlbW92ZQACAAA1BAhccGFsbGV0X25vbWluYXRpb25fcG9vbHM8Q2xhaW1QZXJtaXNzaW9uAAEQMFBlcm1pc3Npb25lZAAAAFhQZXJtaXNzaW9ubGVzc0NvbXBvdW5kAAEAWFBlcm1pc3Npb25sZXNzV2l0aGRyYXcAAgBEUGVybWlzc2lvbmxlc3NBbGwAAwAAOQQEGE9wdGlvbgQEVAE9BAEIEE5vbmUAAAAQU29tZQQAPQQAAAEAAD0EAAAECKwAAEEECFxwYWxsZXRfbm9taW5hdGlvbl9wb29sc1BDb21taXNzaW9uQ2hhbmdlUmF0ZQQsQmxvY2tOdW1iZXIBEAAIATBtYXhfaW5jcmVhc2WsARxQZXJiaWxsAAEkbWluX2RlbGF5EAEsQmxvY2tOdW1iZXIAAEUEBBhPcHRpb24EBFQBSQQBCBBOb25lAAAAEFNvbWUEAEkEAAABAABJBAhccGFsbGV0X25vbWluYXRpb25fcG9vbHNkQ29tbWlzc2lvbkNsYWltUGVybWlzc2lvbgQkQWNjb3VudElkAQABCDhQZXJtaXNzaW9ubGVzcwAAABxBY2NvdW50BAAAASRBY2NvdW50SWQAAQAATQQMTHBhbGxldF9mYXN0X3Vuc3Rha2UYcGFsbGV0EENhbGwEBFQAAQxUcmVnaXN0ZXJfZmFzdF91bnN0YWtlAABoiFJlZ2lzdGVyIG9uZXNlbGYgZm9yIGZhc3QtdW5zdGFrZS4ASCMjIERpc3BhdGNoIE9yaWdpbgBFAVRoZSBkaXNwYXRjaCBvcmlnaW4gb2YgdGhpcyBjYWxsIG11c3QgYmUgKnNpZ25lZCogYnkgd2hvZXZlciBpcyBwZXJtaXR0ZWQgdG8gY2FsbPB1bmJvbmQgZnVuZHMgYnkgdGhlIHN0YWtpbmcgc3lzdGVtLiBTZWUgW2BDb25maWc6OlN0YWtpbmdgXS4AKCMjIERldGFpbHMAOQFUaGUgc3Rhc2ggYXNzb2NpYXRlZCB3aXRoIHRoZSBvcmlnaW4gbXVzdCBoYXZlIG5vIG9uZ29pbmcgdW5sb2NraW5nIGNodW5rcy4gSWZdAXN1Y2Nlc3NmdWwsIHRoaXMgd2lsbCBmdWxseSB1bmJvbmQgYW5kIGNoaWxsIHRoZSBzdGFzaC4gVGhlbiwgaXQgd2lsbCBlbnF1ZXVlIHRoZSBzdGFzaIB0byBiZSBjaGVja2VkIGluIGZ1cnRoZXIgYmxvY2tzLgBRAUlmIGJ5IHRoZSB0aW1lIHRoaXMgaXMgY2FsbGVkLCB0aGUgc3Rhc2ggaXMgYWN0dWFsbHkgZWxpZ2libGUgZm9yIGZhc3QtdW5zdGFrZSwgdGhlbkUBdGhleSBhcmUgZ3VhcmFudGVlZCB0byByZW1haW4gZWxpZ2libGUsIGJlY2F1c2UgdGhlIGNhbGwgd2lsbCBjaGlsbCB0aGVtIGFzIHdlbGwuAD0BSWYgdGhlIGNoZWNrIHdvcmtzLCB0aGUgZW50aXJlIHN0YWtpbmcgZGF0YSBpcyByZW1vdmVkLCBpLmUuIHRoZSBzdGFzaCBpcyBmdWxseSR1bnN0YWtlZC4AXQFJZiB0aGUgY2hlY2sgZmFpbHMsIHRoZSBzdGFzaCByZW1haW5zIGNoaWxsZWQgYW5kIHdhaXRpbmcgZm9yIGJlaW5nIHVuYm9uZGVkIGFzIGluIHdpdGhhAXRoZSBub3JtYWwgc3Rha2luZyBzeXN0ZW0sIGJ1dCB0aGV5IGxvc2UgcGFydCBvZiB0aGVpciB1bmJvbmRpbmcgY2h1bmtzIGR1ZSB0byBjb25zdW1pbmdYdGhlIGNoYWluJ3MgcmVzb3VyY2VzLgAkIyMgRXZlbnRzAAkBU29tZSBldmVudHMgZnJvbSB0aGUgc3Rha2luZyBhbmQgY3VycmVuY3kgc3lzdGVtIG1pZ2h0IGJlIGVtaXR0ZWQuKGRlcmVnaXN0ZXIAAUikRGVyZWdpc3RlciBvbmVzZWxmIGZyb20gdGhlIGZhc3QtdW5zdGFrZS4ASCMjIERpc3BhdGNoIE9yaWdpbgBFAVRoZSBkaXNwYXRjaCBvcmlnaW4gb2YgdGhpcyBjYWxsIG11c3QgYmUgKnNpZ25lZCogYnkgd2hvZXZlciBpcyBwZXJtaXR0ZWQgdG8gY2FsbPB1bmJvbmQgZnVuZHMgYnkgdGhlIHN0YWtpbmcgc3lzdGVtLiBTZWUgW2BDb25maWc6OlN0YWtpbmdgXS4AKCMjIERldGFpbHMAYQFUaGlzIGlzIHVzZWZ1bCBpZiBvbmUgaXMgcmVnaXN0ZXJlZCwgdGhleSBhcmUgc3RpbGwgd2FpdGluZywgYW5kIHRoZXkgY2hhbmdlIHRoZWlyIG1pbmQuAFkBTm90ZSB0aGF0IHRoZSBhc3NvY2lhdGVkIHN0YXNoIGlzIHN0aWxsIGZ1bGx5IHVuYm9uZGVkIGFuZCBjaGlsbGVkIGFzIGEgY29uc2VxdWVuY2Ugb2ZZAWNhbGxpbmcgW2BQYWxsZXQ6OnJlZ2lzdGVyX2Zhc3RfdW5zdGFrZWBdLiBUaGVyZWZvcmUsIHRoaXMgc2hvdWxkIHByb2JhYmx5IGJlIGZvbGxvd2VksGJ5IGEgY2FsbCB0byBgcmVib25kYCBpbiB0aGUgc3Rha2luZyBzeXN0ZW0uACQjIyBFdmVudHMACQFTb21lIGV2ZW50cyBmcm9tIHRoZSBzdGFraW5nIGFuZCBjdXJyZW5jeSBzeXN0ZW0gbWlnaHQgYmUgZW1pdHRlZC4cY29udHJvbAQBNGVyYXNfdG9fY2hlY2sQASBFcmFJbmRleAACNJRDb250cm9sIHRoZSBvcGVyYXRpb24gb2YgdGhpcyBwYWxsZXQuAEgjIyBEaXNwYXRjaCBPcmlnaW4ADQFUaGUgZGlzcGF0Y2ggb3JpZ2luIG9mIHRoaXMgY2FsbCBtdXN0IGJlIFtgQ29uZmlnOjpDb250cm9sT3JpZ2luYF0uACgjIyBEZXRhaWxzAEEBQ2FuIHNldCB0aGUgbnVtYmVyIG9mIGVyYXMgdG8gY2hlY2sgcGVyIGJsb2NrLCBhbmQgcG90ZW50aWFsbHkgb3RoZXIgYWRtaW4gd29yay4AJCMjIEV2ZW50cwCkTm8gZXZlbnRzIGFyZSBlbWl0dGVkIGZyb20gdGhpcyBkaXNwYXRjaC4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMuUQQQbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWluczRjb25maWd1cmF0aW9uGHBhbGxldBBDYWxsBARUAAHAfHNldF92YWxpZGF0aW9uX3VwZ3JhZGVfY29vbGRvd24EAQxuZXcQAURCbG9ja051bWJlckZvcjxUPgAABJBTZXQgdGhlIHZhbGlkYXRpb24gdXBncmFkZSBjb29sZG93bi5wc2V0X3ZhbGlkYXRpb25fdXBncmFkZV9kZWxheQQBDG5ldxABREJsb2NrTnVtYmVyRm9yPFQ+AAEEhFNldCB0aGUgdmFsaWRhdGlvbiB1cGdyYWRlIGRlbGF5LmRzZXRfY29kZV9yZXRlbnRpb25fcGVyaW9kBAEMbmV3EAFEQmxvY2tOdW1iZXJGb3I8VD4AAgTQU2V0IHRoZSBhY2NlcHRhbmNlIHBlcmlvZCBmb3IgYW4gaW5jbHVkZWQgY2FuZGlkYXRlLkRzZXRfbWF4X2NvZGVfc2l6ZQQBDG5ldxABDHUzMgADBNxTZXQgdGhlIG1heCB2YWxpZGF0aW9uIGNvZGUgc2l6ZSBmb3IgaW5jb21pbmcgdXBncmFkZXMuQHNldF9tYXhfcG92X3NpemUEAQxuZXcQAQx1MzIABATEU2V0IHRoZSBtYXggUE9WIGJsb2NrIHNpemUgZm9yIGluY29taW5nIHVwZ3JhZGVzLlhzZXRfbWF4X2hlYWRfZGF0YV9zaXplBAEMbmV3EAEMdTMyAAUElFNldCB0aGUgbWF4IGhlYWQgZGF0YSBzaXplIGZvciBwYXJhcy5Ic2V0X2NvcmV0aW1lX2NvcmVzBAEMbmV3EAEMdTMyAAYQrFNldCB0aGUgbnVtYmVyIG9mIGNvcmV0aW1lIGV4ZWN1dGlvbiBjb3Jlcy4AUQFOT1RFOiB0aGF0IHRoaXMgY29uZmlndXJhdGlvbiBpcyBtYW5hZ2VkIGJ5IHRoZSBjb3JldGltZSBjaGFpbi4gT25seSBtYW51YWxseSBjaGFuZ2WwdGhpcywgaWYgeW91IHJlYWxseSBrbm93IHdoYXQgeW91IGFyZSBkb2luZyF0c2V0X21heF9hdmFpbGFiaWxpdHlfdGltZW91dHMEAQxuZXcQAQx1MzIABwRBAVNldCB0aGUgbWF4IG51bWJlciBvZiB0aW1lcyBhIGNsYWltIG1heSB0aW1lb3V0IG9uIGEgY29yZSBiZWZvcmUgaXQgaXMgYWJhbmRvbmVkcHNldF9ncm91cF9yb3RhdGlvbl9mcmVxdWVuY3kEAQxuZXcQAURCbG9ja051bWJlckZvcjxUPgAIBNBTZXQgdGhlIHBhcmFjaGFpbiB2YWxpZGF0b3ItZ3JvdXAgcm90YXRpb24gZnJlcXVlbmN5dHNldF9wYXJhc19hdmFpbGFiaWxpdHlfcGVyaW9kBAEMbmV3EAFEQmxvY2tOdW1iZXJGb3I8VD4ACQSYU2V0IHRoZSBhdmFpbGFiaWxpdHkgcGVyaW9kIGZvciBwYXJhcy5gc2V0X3NjaGVkdWxpbmdfbG9va2FoZWFkBAEMbmV3EAEMdTMyAAsEOQFTZXQgdGhlIHNjaGVkdWxpbmcgbG9va2FoZWFkLCBpbiBleHBlY3RlZCBudW1iZXIgb2YgYmxvY2tzIGF0IHBlYWsgdGhyb3VnaHB1dC5sc2V0X21heF92YWxpZGF0b3JzX3Blcl9jb3JlBAEMbmV3YQIBLE9wdGlvbjx1MzI+AAwE7FNldCB0aGUgbWF4aW11bSBudW1iZXIgb2YgdmFsaWRhdG9ycyB0byBhc3NpZ24gdG8gYW55IGNvcmUuSHNldF9tYXhfdmFsaWRhdG9ycwQBDG5ld2ECASxPcHRpb248dTMyPgANBA0BU2V0IHRoZSBtYXhpbXVtIG51bWJlciBvZiB2YWxpZGF0b3JzIHRvIHVzZSBpbiBwYXJhY2hhaW4gY29uc2Vuc3VzLkhzZXRfZGlzcHV0ZV9wZXJpb2QEAQxuZXcQATBTZXNzaW9uSW5kZXgADgQNAVNldCB0aGUgZGlzcHV0ZSBwZXJpb2QsIGluIG51bWJlciBvZiBzZXNzaW9ucyB0byBrZWVwIGZvciBkaXNwdXRlcy60c2V0X2Rpc3B1dGVfcG9zdF9jb25jbHVzaW9uX2FjY2VwdGFuY2VfcGVyaW9kBAEMbmV3EAFEQmxvY2tOdW1iZXJGb3I8VD4ADwTIU2V0IHRoZSBkaXNwdXRlIHBvc3QgY29uY2x1c2lvbiBhY2NlcHRhbmNlIHBlcmlvZC5Ec2V0X25vX3Nob3dfc2xvdHMEAQxuZXcQAQx1MzIAEgj4U2V0IHRoZSBubyBzaG93IHNsb3RzLCBpbiBudW1iZXIgb2YgbnVtYmVyIG9mIGNvbnNlbnN1cyBzbG90cy5MTXVzdCBiZSBhdCBsZWFzdCAxLlBzZXRfbl9kZWxheV90cmFuY2hlcwQBDG5ldxABDHUzMgATBJxTZXQgdGhlIHRvdGFsIG51bWJlciBvZiBkZWxheSB0cmFuY2hlcy54c2V0X3plcm90aF9kZWxheV90cmFuY2hlX3dpZHRoBAEMbmV3EAEMdTMyABQEjFNldCB0aGUgemVyb3RoIGRlbGF5IHRyYW5jaGUgd2lkdGguUHNldF9uZWVkZWRfYXBwcm92YWxzBAEMbmV3EAEMdTMyABUE3FNldCB0aGUgbnVtYmVyIG9mIHZhbGlkYXRvcnMgbmVlZGVkIHRvIGFwcHJvdmUgYSBibG9jay5wc2V0X3JlbGF5X3ZyZl9tb2R1bG9fc2FtcGxlcwQBDG5ldxABDHUzMgAWBFkBU2V0IHRoZSBudW1iZXIgb2Ygc2FtcGxlcyB0byBkbyBvZiB0aGUgYFJlbGF5VlJGTW9kdWxvYCBhcHByb3ZhbCBhc3NpZ25tZW50IGNyaXRlcmlvbi5oc2V0X21heF91cHdhcmRfcXVldWVfY291bnQEAQxuZXcQAQx1MzIAFwQtAVNldHMgdGhlIG1heGltdW0gaXRlbXMgdGhhdCBjYW4gcHJlc2VudCBpbiBhIHVwd2FyZCBkaXNwYXRjaCBxdWV1ZSBhdCBvbmNlLmRzZXRfbWF4X3Vwd2FyZF9xdWV1ZV9zaXplBAEMbmV3EAEMdTMyABgITQFTZXRzIHRoZSBtYXhpbXVtIHRvdGFsIHNpemUgb2YgaXRlbXMgdGhhdCBjYW4gcHJlc2VudCBpbiBhIHVwd2FyZCBkaXNwYXRjaCBxdWV1ZSBhdBRvbmNlLnRzZXRfbWF4X2Rvd253YXJkX21lc3NhZ2Vfc2l6ZQQBDG5ldxABDHUzMgAZBJxTZXQgdGhlIGNyaXRpY2FsIGRvd253YXJkIG1lc3NhZ2Ugc2l6ZS5sc2V0X21heF91cHdhcmRfbWVzc2FnZV9zaXplBAEMbmV3EAEMdTMyABsELQFTZXRzIHRoZSBtYXhpbXVtIHNpemUgb2YgYW4gdXB3YXJkIG1lc3NhZ2UgdGhhdCBjYW4gYmUgc2VudCBieSBhIGNhbmRpZGF0ZS6gc2V0X21heF91cHdhcmRfbWVzc2FnZV9udW1fcGVyX2NhbmRpZGF0ZQQBDG5ldxABDHUzMgAcBAUBU2V0cyB0aGUgbWF4aW11bSBudW1iZXIgb2YgbWVzc2FnZXMgdGhhdCBhIGNhbmRpZGF0ZSBjYW4gY29udGFpbi5kc2V0X2hybXBfb3Blbl9yZXF1ZXN0X3R0bAQBDG5ldxABDHUzMgAdBDUBU2V0cyB0aGUgbnVtYmVyIG9mIHNlc3Npb25zIGFmdGVyIHdoaWNoIGFuIEhSTVAgb3BlbiBjaGFubmVsIHJlcXVlc3QgZXhwaXJlcy5cc2V0X2hybXBfc2VuZGVyX2RlcG9zaXQEAQxuZXcYARxCYWxhbmNlAB4EUQFTZXRzIHRoZSBhbW91bnQgb2YgZnVuZHMgdGhhdCB0aGUgc2VuZGVyIHNob3VsZCBwcm92aWRlIGZvciBvcGVuaW5nIGFuIEhSTVAgY2hhbm5lbC5oc2V0X2hybXBfcmVjaXBpZW50X2RlcG9zaXQEAQxuZXcYARxCYWxhbmNlAB8IYQFTZXRzIHRoZSBhbW91bnQgb2YgZnVuZHMgdGhhdCB0aGUgcmVjaXBpZW50IHNob3VsZCBwcm92aWRlIGZvciBhY2NlcHRpbmcgb3BlbmluZyBhbiBIUk1QIGNoYW5uZWwudHNldF9ocm1wX2NoYW5uZWxfbWF4X2NhcGFjaXR5BAEMbmV3EAEMdTMyACAEHQFTZXRzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBtZXNzYWdlcyBhbGxvd2VkIGluIGFuIEhSTVAgY2hhbm5lbCBhdCBvbmNlLnxzZXRfaHJtcF9jaGFubmVsX21heF90b3RhbF9zaXplBAEMbmV3EAEMdTMyACEEUQFTZXRzIHRoZSBtYXhpbXVtIHRvdGFsIHNpemUgb2YgbWVzc2FnZXMgaW4gYnl0ZXMgYWxsb3dlZCBpbiBhbiBIUk1QIGNoYW5uZWwgYXQgb25jZS6cc2V0X2hybXBfbWF4X3BhcmFjaGFpbl9pbmJvdW5kX2NoYW5uZWxzBAEMbmV3EAEMdTMyACIESQFTZXRzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBpbmJvdW5kIEhSTVAgY2hhbm5lbHMgYSBwYXJhY2hhaW4gaXMgYWxsb3dlZCB0byBhY2NlcHQuhHNldF9ocm1wX2NoYW5uZWxfbWF4X21lc3NhZ2Vfc2l6ZQQBDG5ldxABDHUzMgAkBD0BU2V0cyB0aGUgbWF4aW11bSBzaXplIG9mIGEgbWVzc2FnZSB0aGF0IGNvdWxkIGV2ZXIgYmUgcHV0IGludG8gYW4gSFJNUCBjaGFubmVsLqBzZXRfaHJtcF9tYXhfcGFyYWNoYWluX291dGJvdW5kX2NoYW5uZWxzBAEMbmV3EAEMdTMyACUERQFTZXRzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBvdXRib3VuZCBIUk1QIGNoYW5uZWxzIGEgcGFyYWNoYWluIGlzIGFsbG93ZWQgdG8gb3Blbi6Yc2V0X2hybXBfbWF4X21lc3NhZ2VfbnVtX3Blcl9jYW5kaWRhdGUEAQxuZXcQAQx1MzIAJwQ1AVNldHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIG91dGJvdW5kIEhSTVAgbWVzc2FnZXMgY2FuIGJlIHNlbnQgYnkgYSBjYW5kaWRhdGUuSHNldF9wdmZfdm90aW5nX3R0bAQBDG5ldxABMFNlc3Npb25JbmRleAAqBFEBU2V0IHRoZSBudW1iZXIgb2Ygc2Vzc2lvbiBjaGFuZ2VzIGFmdGVyIHdoaWNoIGEgUFZGIHByZS1jaGVja2luZyB2b3RpbmcgaXMgcmVqZWN0ZWQukHNldF9taW5pbXVtX3ZhbGlkYXRpb25fdXBncmFkZV9kZWxheQQBDG5ldxABREJsb2NrTnVtYmVyRm9yPFQ+ACsQVQFTZXRzIHRoZSBtaW5pbXVtIGRlbGF5IGJldHdlZW4gYW5ub3VuY2luZyB0aGUgdXBncmFkZSBibG9jayBmb3IgYSBwYXJhY2hhaW4gdW50aWwgdGhlVHVwZ3JhZGUgdGFraW5nIHBsYWNlLgA5AVNlZSB0aGUgZmllbGQgZG9jdW1lbnRhdGlvbiBmb3IgaW5mb3JtYXRpb24gYW5kIGNvbnN0cmFpbnRzIGZvciB0aGUgbmV3IHZhbHVlLnBzZXRfYnlwYXNzX2NvbnNpc3RlbmN5X2NoZWNrBAEMbmV3IAEQYm9vbAAsCE0BU2V0dGluZyB0aGlzIHRvIHRydWUgd2lsbCBkaXNhYmxlIGNvbnNpc3RlbmN5IGNoZWNrcyBmb3IgdGhlIGNvbmZpZ3VyYXRpb24gc2V0dGVycy5EVXNlIHdpdGggY2F1dGlvbi5gc2V0X2FzeW5jX2JhY2tpbmdfcGFyYW1zBAEMbmV3VQQBSEFzeW5jQmFja2luZ1BhcmFtcwAtBKBTZXQgdGhlIGFzeW5jaHJvbm91cyBiYWNraW5nIHBhcmFtZXRlcnMuTHNldF9leGVjdXRvcl9wYXJhbXMEAQxuZXdZBAE4RXhlY3V0b3JQYXJhbXMALgRwU2V0IFBWRiBleGVjdXRvciBwYXJhbWV0ZXJzLlhzZXRfb25fZGVtYW5kX2Jhc2VfZmVlBAEMbmV3GAEcQmFsYW5jZQAvBKRTZXQgdGhlIG9uIGRlbWFuZCAocGFyYXRocmVhZHMpIGJhc2UgZmVlLnRzZXRfb25fZGVtYW5kX2ZlZV92YXJpYWJpbGl0eQQBDG5ld6wBHFBlcmJpbGwAMATAU2V0IHRoZSBvbiBkZW1hbmQgKHBhcmF0aHJlYWRzKSBmZWUgdmFyaWFiaWxpdHkucHNldF9vbl9kZW1hbmRfcXVldWVfbWF4X3NpemUEAQxuZXcQAQx1MzIAMQS8U2V0IHRoZSBvbiBkZW1hbmQgKHBhcmF0aHJlYWRzKSBxdWV1ZSBtYXggc2l6ZS6Yc2V0X29uX2RlbWFuZF90YXJnZXRfcXVldWVfdXRpbGl6YXRpb24EAQxuZXesARxQZXJiaWxsADIEwFNldCB0aGUgb24gZGVtYW5kIChwYXJhdGhyZWFkcykgZmVlIHZhcmlhYmlsaXR5LkRzZXRfb25fZGVtYW5kX3R0bAQBDG5ldxABREJsb2NrTnVtYmVyRm9yPFQ+ADME2FNldCB0aGUgb24gZGVtYW5kIChwYXJhdGhyZWFkcykgdHRsIGluIHRoZSBjbGFpbXF1ZXVlLmRzZXRfbWluaW11bV9iYWNraW5nX3ZvdGVzBAEMbmV3EAEMdTMyADQEoFNldCB0aGUgbWluaW11bSBiYWNraW5nIHZvdGVzIHRocmVzaG9sZC5Ac2V0X25vZGVfZmVhdHVyZQgBFGluZGV4CAEIdTgAARR2YWx1ZSABEGJvb2wANQRkU2V0L1Vuc2V0IGEgbm9kZSBmZWF0dXJlLmhzZXRfYXBwcm92YWxfdm90aW5nX3BhcmFtcwQBDG5ld20EAVBBcHByb3ZhbFZvdGluZ1BhcmFtcwA2BGxTZXQgYXBwcm92YWwtdm90aW5nLXBhcmFtcy5Qc2V0X3NjaGVkdWxlcl9wYXJhbXMEAQxuZXdxBAGIU2NoZWR1bGVyUGFyYW1zPEJsb2NrTnVtYmVyRm9yPFQ+PgA3BFRTZXQgc2NoZWR1bGVyLXBhcmFtcy4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMuVQQQTHBvbGthZG90X3ByaW1pdGl2ZXMIdjc0YXN5bmNfYmFja2luZ0hBc3luY0JhY2tpbmdQYXJhbXMAAAgBTG1heF9jYW5kaWRhdGVfZGVwdGgQAQx1MzIAAVBhbGxvd2VkX2FuY2VzdHJ5X2xlbhABDHUzMgAAWQQQTHBvbGthZG90X3ByaW1pdGl2ZXMIdjc8ZXhlY3V0b3JfcGFyYW1zOEV4ZWN1dG9yUGFyYW1zAAAEAF0EAUhWZWM8RXhlY3V0b3JQYXJhbT4AAF0EAAACYQQAYQQQTHBvbGthZG90X3ByaW1pdGl2ZXMIdjc8ZXhlY3V0b3JfcGFyYW1zNEV4ZWN1dG9yUGFyYW0AARw4TWF4TWVtb3J5UGFnZXMEABABDHUzMgABADxTdGFja0xvZ2ljYWxNYXgEABABDHUzMgACADhTdGFja05hdGl2ZU1heAQAEAEMdTMyAAMAUFByZWNoZWNraW5nTWF4TWVtb3J5BAAwAQx1NjQABAA4UHZmUHJlcFRpbWVvdXQIAGUEASxQdmZQcmVwS2luZAAAMAEMdTY0AAUAOFB2ZkV4ZWNUaW1lb3V0CABpBAEsUHZmRXhlY0tpbmQAADABDHU2NAAGAERXYXNtRXh0QnVsa01lbW9yeQAHAABlBAxMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2NyxQdmZQcmVwS2luZAABCCBQcmVjaGVjawAAABxQcmVwYXJlAAEAAGkEDExwb2xrYWRvdF9wcmltaXRpdmVzCHY3LFB2ZkV4ZWNLaW5kAAEIHEJhY2tpbmcAAAAgQXBwcm92YWwAAQAAbQQMTHBvbGthZG90X3ByaW1pdGl2ZXMIdjdQQXBwcm92YWxWb3RpbmdQYXJhbXMAAAQBbG1heF9hcHByb3ZhbF9jb2FsZXNjZV9jb3VudBABDHUzMgAAcQQMTHBvbGthZG90X3ByaW1pdGl2ZXMgdnN0YWdpbmc8U2NoZWR1bGVyUGFyYW1zBCxCbG9ja051bWJlcgEQACwBYGdyb3VwX3JvdGF0aW9uX2ZyZXF1ZW5jeRABLEJsb2NrTnVtYmVyAAFkcGFyYXNfYXZhaWxhYmlsaXR5X3BlcmlvZBABLEJsb2NrTnVtYmVyAAFcbWF4X3ZhbGlkYXRvcnNfcGVyX2NvcmVhAgEsT3B0aW9uPHUzMj4AASRsb29rYWhlYWQQAQx1MzIAASRudW1fY29yZXMQAQx1MzIAAWRtYXhfYXZhaWxhYmlsaXR5X3RpbWVvdXRzEAEMdTMyAAFgb25fZGVtYW5kX3F1ZXVlX21heF9zaXplEAEMdTMyAAGIb25fZGVtYW5kX3RhcmdldF9xdWV1ZV91dGlsaXphdGlvbqwBHFBlcmJpbGwAAWRvbl9kZW1hbmRfZmVlX3ZhcmlhYmlsaXR5rAEcUGVyYmlsbAABSG9uX2RlbWFuZF9iYXNlX2ZlZRgBHEJhbGFuY2UAAQx0dGwQASxCbG9ja051bWJlcgAAdQQQbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucxhzaGFyZWQYcGFsbGV0EENhbGwEBFQAAQAEDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMueQQQbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucyRpbmNsdXNpb24YcGFsbGV0EENhbGwEBFQAAQAEDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMufQQQbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWluczhwYXJhc19pbmhlcmVudBhwYWxsZXQQQ2FsbAQEVAABBBRlbnRlcgQBEGRhdGGBBAGQUGFyYWNoYWluc0luaGVyZW50RGF0YTxIZWFkZXJGb3I8VD4+AAAEMQFFbnRlciB0aGUgcGFyYXMgaW5oZXJlbnQuIFRoaXMgd2lsbCBwcm9jZXNzIGJpdGZpZWxkcyBhbmQgYmFja2VkIGNhbmRpZGF0ZXMuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLoEEDExwb2xrYWRvdF9wcmltaXRpdmVzCHY3MEluaGVyZW50RGF0YQQMSERSAaEBABABJGJpdGZpZWxkc4UEAZBVbmNoZWNrZWRTaWduZWRBdmFpbGFiaWxpdHlCaXRmaWVsZHMAAURiYWNrZWRfY2FuZGlkYXRlc6EEAXxWZWM8QmFja2VkQ2FuZGlkYXRlPEhEUjo6SGFzaD4+AAEgZGlzcHV0ZXPlBAFgTXVsdGlEaXNwdXRlU3RhdGVtZW50U2V0AAE0cGFyZW50X2hlYWRlcqEBAQxIRFIAAIUEAAACiQQAiQQQTHBvbGthZG90X3ByaW1pdGl2ZXMIdjcYc2lnbmVkPFVuY2hlY2tlZFNpZ25lZAgcUGF5bG9hZAGNBCxSZWFsUGF5bG9hZAGNBAAMARxwYXlsb2FkjQQBHFBheWxvYWQAATx2YWxpZGF0b3JfaW5kZXiZBAE4VmFsaWRhdG9ySW5kZXgAASRzaWduYXR1cmWdBAFIVmFsaWRhdG9yU2lnbmF0dXJlAACNBAxMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2N1BBdmFpbGFiaWxpdHlCaXRmaWVsZAAABACRBAF8Qml0VmVjPHU4LCBiaXR2ZWM6Om9yZGVyOjpMc2IwPgAAkQQAAAcIlQQAlQQMGGJpdHZlYxRvcmRlchBMc2IwAAAAAJkEDExwb2xrYWRvdF9wcmltaXRpdmVzCHY3OFZhbGlkYXRvckluZGV4AAAEABABDHUzMgAAnQQQTHBvbGthZG90X3ByaW1pdGl2ZXMIdjc0dmFsaWRhdG9yX2FwcCRTaWduYXR1cmUAAAQASQIBSHNyMjU1MTk6OlNpZ25hdHVyZQAAoQQAAAKlBAClBAxMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2NzxCYWNrZWRDYW5kaWRhdGUEBEgBNAAMASRjYW5kaWRhdGWpBAFwQ29tbWl0dGVkQ2FuZGlkYXRlUmVjZWlwdDxIPgABOHZhbGlkaXR5X3ZvdGVz3QQBYFZlYzxWYWxpZGl0eUF0dGVzdGF0aW9uPgABRHZhbGlkYXRvcl9pbmRpY2VzkQQBfEJpdFZlYzx1OCwgYml0dmVjOjpvcmRlcjo6THNiMD4AAKkEDExwb2xrYWRvdF9wcmltaXRpdmVzCHY3ZENvbW1pdHRlZENhbmRpZGF0ZVJlY2VpcHQEBEgBNAAIAShkZXNjcmlwdG9yrQQBWENhbmRpZGF0ZURlc2NyaXB0b3I8SD4AASxjb21taXRtZW50c70EAVBDYW5kaWRhdGVDb21taXRtZW50cwAArQQMTHBvbGthZG90X3ByaW1pdGl2ZXMIdjdMQ2FuZGlkYXRlRGVzY3JpcHRvcgQESAE0ACQBHHBhcmFfaWSNAgEISWQAATByZWxheV9wYXJlbnQ0AQRIAAEgY29sbGF0b3KxBAEoQ29sbGF0b3JJZAABeHBlcnNpc3RlZF92YWxpZGF0aW9uX2RhdGFfaGFzaDQBEEhhc2gAASBwb3ZfaGFzaDQBEEhhc2gAATBlcmFzdXJlX3Jvb3Q0ARBIYXNoAAEkc2lnbmF0dXJltQQBRENvbGxhdG9yU2lnbmF0dXJlAAEkcGFyYV9oZWFkNAEQSGFzaAABUHZhbGlkYXRpb25fY29kZV9oYXNouQQBSFZhbGlkYXRpb25Db2RlSGFzaAAAsQQQTHBvbGthZG90X3ByaW1pdGl2ZXMIdjcwY29sbGF0b3JfYXBwGFB1YmxpYwAABAAEATxzcjI1NTE5OjpQdWJsaWMAALUEEExwb2xrYWRvdF9wcmltaXRpdmVzCHY3MGNvbGxhdG9yX2FwcCRTaWduYXR1cmUAAAQASQIBSHNyMjU1MTk6OlNpZ25hdHVyZQAAuQQMdHBvbGthZG90X3BhcmFjaGFpbl9wcmltaXRpdmVzKHByaW1pdGl2ZXNIVmFsaWRhdGlvbkNvZGVIYXNoAAAEADQBEEhhc2gAAL0EDExwb2xrYWRvdF9wcmltaXRpdmVzCHY3UENhbmRpZGF0ZUNvbW1pdG1lbnRzBAROARAAGAE8dXB3YXJkX21lc3NhZ2VzwQQBOFVwd2FyZE1lc3NhZ2VzAAFMaG9yaXpvbnRhbF9tZXNzYWdlc8UEAUhIb3Jpem9udGFsTWVzc2FnZXMAAUxuZXdfdmFsaWRhdGlvbl9jb2Rl0QQBWE9wdGlvbjxWYWxpZGF0aW9uQ29kZT4AASRoZWFkX2RhdGHZBAEgSGVhZERhdGEAAWxwcm9jZXNzZWRfZG93bndhcmRfbWVzc2FnZXMQAQx1MzIAAThocm1wX3dhdGVybWFyaxABBE4AAMEEDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBOARTAAAEAIUBARhWZWM8VD4AAMUEDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQByQQEUwAABADNBAEYVmVjPFQ+AADJBAhgcG9sa2Fkb3RfY29yZV9wcmltaXRpdmVzTE91dGJvdW5kSHJtcE1lc3NhZ2UECElkAY0CAAgBJHJlY2lwaWVudI0CAQhJZAABEGRhdGE4AVBzcF9zdGQ6OnZlYzo6VmVjPHU4PgAAzQQAAALJBADRBAQYT3B0aW9uBARUAdUEAQgQTm9uZQAAABBTb21lBADVBAAAAQAA1QQMdHBvbGthZG90X3BhcmFjaGFpbl9wcmltaXRpdmVzKHByaW1pdGl2ZXM4VmFsaWRhdGlvbkNvZGUAAAQAOAEcVmVjPHU4PgAA2QQMdHBvbGthZG90X3BhcmFjaGFpbl9wcmltaXRpdmVzKHByaW1pdGl2ZXMgSGVhZERhdGEAAAQAOAEcVmVjPHU4PgAA3QQAAALhBADhBAxMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2N0xWYWxpZGl0eUF0dGVzdGF0aW9uAAEIIEltcGxpY2l0BACdBAFIVmFsaWRhdG9yU2lnbmF0dXJlAAEAIEV4cGxpY2l0BACdBAFIVmFsaWRhdG9yU2lnbmF0dXJlAAIAAOUEAAAC6QQA6QQMTHBvbGthZG90X3ByaW1pdGl2ZXMIdjdMRGlzcHV0ZVN0YXRlbWVudFNldAAADAE4Y2FuZGlkYXRlX2hhc2jtBAE0Q2FuZGlkYXRlSGFzaAABHHNlc3Npb24QATBTZXNzaW9uSW5kZXgAAShzdGF0ZW1lbnRz8QQB7FZlYzwoRGlzcHV0ZVN0YXRlbWVudCwgVmFsaWRhdG9ySW5kZXgsIFZhbGlkYXRvclNpZ25hdHVyZSk+AADtBAhgcG9sa2Fkb3RfY29yZV9wcmltaXRpdmVzNENhbmRpZGF0ZUhhc2gAAAQANAEQSGFzaAAA8QQAAAL1BAD1BAAABAz5BJkEnQQA+QQMTHBvbGthZG90X3ByaW1pdGl2ZXMIdjdARGlzcHV0ZVN0YXRlbWVudAABCBRWYWxpZAQA/QQBZFZhbGlkRGlzcHV0ZVN0YXRlbWVudEtpbmQAAAAcSW52YWxpZAQABQUBbEludmFsaWREaXNwdXRlU3RhdGVtZW50S2luZAABAAD9BAxMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2N2RWYWxpZERpc3B1dGVTdGF0ZW1lbnRLaW5kAAEUIEV4cGxpY2l0AAAAPEJhY2tpbmdTZWNvbmRlZAQANAEQSGFzaAABADBCYWNraW5nVmFsaWQEADQBEEhhc2gAAgBAQXBwcm92YWxDaGVja2luZwADAIhBcHByb3ZhbENoZWNraW5nTXVsdGlwbGVDYW5kaWRhdGVzBAABBQFIVmVjPENhbmRpZGF0ZUhhc2g+AAQAAAEFAAAC7QQABQUMTHBvbGthZG90X3ByaW1pdGl2ZXMIdjdsSW52YWxpZERpc3B1dGVTdGF0ZW1lbnRLaW5kAAEEIEV4cGxpY2l0AAAAAAkFEGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMUcGFyYXMYcGFsbGV0EENhbGwEBFQAASRYZm9yY2Vfc2V0X2N1cnJlbnRfY29kZQgBEHBhcmGNAgEYUGFyYUlkAAEgbmV3X2NvZGXVBAE4VmFsaWRhdGlvbkNvZGUAAAT4U2V0IHRoZSBzdG9yYWdlIGZvciB0aGUgcGFyYWNoYWluIHZhbGlkYXRpb24gY29kZSBpbW1lZGlhdGVseS5YZm9yY2Vfc2V0X2N1cnJlbnRfaGVhZAgBEHBhcmGNAgEYUGFyYUlkAAEgbmV3X2hlYWTZBAEgSGVhZERhdGEAAQQBAVNldCB0aGUgc3RvcmFnZSBmb3IgdGhlIGN1cnJlbnQgcGFyYWNoYWluIGhlYWQgZGF0YSBpbW1lZGlhdGVseS5sZm9yY2Vfc2NoZWR1bGVfY29kZV91cGdyYWRlDAEQcGFyYY0CARhQYXJhSWQAASBuZXdfY29kZdUEAThWYWxpZGF0aW9uQ29kZQABTHJlbGF5X3BhcmVudF9udW1iZXIQAURCbG9ja051bWJlckZvcjxUPgACBC0BU2NoZWR1bGUgYW4gdXBncmFkZSBhcyBpZiBpdCB3YXMgc2NoZWR1bGVkIGluIHRoZSBnaXZlbiByZWxheSBwYXJlbnQgYmxvY2suTGZvcmNlX25vdGVfbmV3X2hlYWQIARBwYXJhjQIBGFBhcmFJZAABIG5ld19oZWFk2QQBIEhlYWREYXRhAAMEHQFOb3RlIGEgbmV3IGJsb2NrIGhlYWQgZm9yIHBhcmEgd2l0aGluIHRoZSBjb250ZXh0IG9mIHRoZSBjdXJyZW50IGJsb2NrLkhmb3JjZV9xdWV1ZV9hY3Rpb24EARBwYXJhjQIBGFBhcmFJZAAEDPhQdXQgYSBwYXJhY2hhaW4gZGlyZWN0bHkgaW50byB0aGUgbmV4dCBzZXNzaW9uJ3MgYWN0aW9uIHF1ZXVlLvRXZSBjYW4ndCBxdWV1ZSBpdCBhbnkgc29vbmVyIHRoYW4gdGhpcyB3aXRob3V0IGdvaW5nIGludG8gdGhlOGluaXRpYWxpemVyLi4ubGFkZF90cnVzdGVkX3ZhbGlkYXRpb25fY29kZQQBPHZhbGlkYXRpb25fY29kZdUEAThWYWxpZGF0aW9uQ29kZQAFOKBBZGRzIHRoZSB2YWxpZGF0aW9uIGNvZGUgdG8gdGhlIHN0b3JhZ2UuAFkBVGhlIGNvZGUgd2lsbCBub3QgYmUgYWRkZWQgaWYgaXQgaXMgYWxyZWFkeSBwcmVzZW50LiBBZGRpdGlvbmFsbHksIGlmIFBWRiBwcmUtY2hlY2tpbmfgaXMgcnVubmluZyBmb3IgdGhhdCBjb2RlLCBpdCB3aWxsIGJlIGluc3RhbnRseSBhY2NlcHRlZC4AUQFPdGhlcndpc2UsIHRoZSBjb2RlIHdpbGwgYmUgYWRkZWQgaW50byB0aGUgc3RvcmFnZS4gTm90ZSB0aGF0IHRoZSBjb2RlIHdpbGwgYmUgYWRkZWRhAWludG8gc3RvcmFnZSB3aXRoIHJlZmVyZW5jZSBjb3VudCAwLiBUaGlzIGlzIHRvIGFjY291bnQgdGhlIGZhY3QgdGhhdCB0aGVyZSBhcmUgbm8gdXNlcnNNAWZvciB0aGlzIGNvZGUgeWV0LiBUaGUgY2FsbGVyIHdpbGwgaGF2ZSB0byBtYWtlIHN1cmUgdGhhdCB0aGlzIGNvZGUgZXZlbnR1YWxseSBnZXRzSQF1c2VkIGJ5IHNvbWUgcGFyYWNoYWluIG9yIHJlbW92ZWQgZnJvbSB0aGUgc3RvcmFnZSB0byBhdm9pZCBzdG9yYWdlIGxlYWtzLiBGb3IgdGhlSQFsYXR0ZXIgcHJlZmVyIHRvIHVzZSB0aGUgYHBva2VfdW51c2VkX3ZhbGlkYXRpb25fY29kZWAgZGlzcGF0Y2hhYmxlIHRvIHJhdyBzdG9yYWdlNG1hbmlwdWxhdGlvbi4AUQFUaGlzIGZ1bmN0aW9uIGlzIG1haW5seSBtZWFudCB0byBiZSB1c2VkIGZvciB1cGdyYWRpbmcgcGFyYWNoYWlucyB0aGF0IGRvIG5vdCBmb2xsb3cJAXRoZSBnby1haGVhZCBzaWduYWwgd2hpbGUgdGhlIFBWRiBwcmUtY2hlY2tpbmcgZmVhdHVyZSBpcyBlbmFibGVkLmxwb2tlX3VudXNlZF92YWxpZGF0aW9uX2NvZGUEAVB2YWxpZGF0aW9uX2NvZGVfaGFzaLkEAUhWYWxpZGF0aW9uQ29kZUhhc2gABhQlAVJlbW92ZSB0aGUgdmFsaWRhdGlvbiBjb2RlIGZyb20gdGhlIHN0b3JhZ2UgaWZmIHRoZSByZWZlcmVuY2UgY291bnQgaXMgMC4AWQFUaGlzIGlzIGJldHRlciB0aGFuIHJlbW92aW5nIHRoZSBzdG9yYWdlIGRpcmVjdGx5LCBiZWNhdXNlIGl0IHdpbGwgbm90IHJlbW92ZSB0aGUgY29kZUEBdGhhdCB3YXMgc3VkZGVubHkgZ290IHVzZWQgYnkgc29tZSBwYXJhY2hhaW4gd2hpbGUgdGhpcyBkaXNwYXRjaGFibGUgd2FzIHBlbmRpbmcwZGlzcGF0Y2hpbmcubGluY2x1ZGVfcHZmX2NoZWNrX3N0YXRlbWVudAgBEHN0bXQNBQFEUHZmQ2hlY2tTdGF0ZW1lbnQAASRzaWduYXR1cmWdBAFIVmFsaWRhdG9yU2lnbmF0dXJlAAcIVQFJbmNsdWRlcyBhIHN0YXRlbWVudCBmb3IgYSBQVkYgcHJlLWNoZWNraW5nIHZvdGUuIFBvdGVudGlhbGx5LCBmaW5hbGl6ZXMgdGhlIHZvdGUgYW5kQQFlbmFjdHMgdGhlIHJlc3VsdHMgaWYgdGhhdCB3YXMgdGhlIGxhc3Qgdm90ZSBiZWZvcmUgYWNoaWV2aW5nIHRoZSBzdXBlcm1ham9yaXR5LnRmb3JjZV9zZXRfbW9zdF9yZWNlbnRfY29udGV4dAgBEHBhcmGNAgEYUGFyYUlkAAEcY29udGV4dBABREJsb2NrTnVtYmVyRm9yPFQ+AAgEAQFTZXQgdGhlIHN0b3JhZ2UgZm9yIHRoZSBjdXJyZW50IHBhcmFjaGFpbiBoZWFkIGRhdGEgaW1tZWRpYXRlbHkuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLg0FDExwb2xrYWRvdF9wcmltaXRpdmVzCHY3RFB2ZkNoZWNrU3RhdGVtZW50AAAQARhhY2NlcHQgARBib29sAAEcc3ViamVjdLkEAUhWYWxpZGF0aW9uQ29kZUhhc2gAATRzZXNzaW9uX2luZGV4EAEwU2Vzc2lvbkluZGV4AAE8dmFsaWRhdG9yX2luZGV4mQQBOFZhbGlkYXRvckluZGV4AAARBRBscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zLGluaXRpYWxpemVyGHBhbGxldBBDYWxsBARUAAEENGZvcmNlX2FwcHJvdmUEARR1cF90bxABLEJsb2NrTnVtYmVyAAAMOQFJc3N1ZSBhIHNpZ25hbCB0byB0aGUgY29uc2Vuc3VzIGVuZ2luZSB0byBmb3JjaWJseSBhY3QgYXMgdGhvdWdoIGFsbCBwYXJhY2hhaW5RAWJsb2NrcyBpbiBhbGwgcmVsYXkgY2hhaW4gYmxvY2tzIHVwIHRvIGFuZCBpbmNsdWRpbmcgdGhlIGdpdmVuIG51bWJlciBpbiB0aGUgY3VycmVudKBjaGFpbiBhcmUgdmFsaWQgYW5kIHNob3VsZCBiZSBmaW5hbGl6ZWQuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLhUFEGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMQaHJtcBhwYWxsZXQQQ2FsbAQEVAABLFhocm1wX2luaXRfb3Blbl9jaGFubmVsDAEkcmVjaXBpZW50jQIBGFBhcmFJZAABVHByb3Bvc2VkX21heF9jYXBhY2l0eRABDHUzMgABZHByb3Bvc2VkX21heF9tZXNzYWdlX3NpemUQAQx1MzIAAChNAUluaXRpYXRlIG9wZW5pbmcgYSBjaGFubmVsIGZyb20gYSBwYXJhY2hhaW4gdG8gYSBnaXZlbiByZWNpcGllbnQgd2l0aCBnaXZlbiBjaGFubmVsLHBhcmFtZXRlcnMuAFkBLSBgcHJvcG9zZWRfbWF4X2NhcGFjaXR5YCAtIHNwZWNpZmllcyBob3cgbWFueSBtZXNzYWdlcyBjYW4gYmUgaW4gdGhlIGNoYW5uZWwgYXQgb25jZS4tAS0gYHByb3Bvc2VkX21heF9tZXNzYWdlX3NpemVgIC0gc3BlY2lmaWVzIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIG1lc3NhZ2VzLgARAVRoZXNlIG51bWJlcnMgYXJlIGEgc3ViamVjdCB0byB0aGUgcmVsYXktY2hhaW4gY29uZmlndXJhdGlvbiBsaW1pdHMuAFEBVGhlIGNoYW5uZWwgY2FuIGJlIG9wZW5lZCBvbmx5IGFmdGVyIHRoZSByZWNpcGllbnQgY29uZmlybXMgaXQgYW5kIG9ubHkgb24gYSBzZXNzaW9uHGNoYW5nZS5gaHJtcF9hY2NlcHRfb3Blbl9jaGFubmVsBAEYc2VuZGVyjQIBGFBhcmFJZAABDPBBY2NlcHQgYSBwZW5kaW5nIG9wZW4gY2hhbm5lbCByZXF1ZXN0IGZyb20gdGhlIGdpdmVuIHNlbmRlci4A9FRoZSBjaGFubmVsIHdpbGwgYmUgb3BlbmVkIG9ubHkgb24gdGhlIG5leHQgc2Vzc2lvbiBib3VuZGFyeS5IaHJtcF9jbG9zZV9jaGFubmVsBAEoY2hhbm5lbF9pZBkFATRIcm1wQ2hhbm5lbElkAAIQVQFJbml0aWF0ZSB1bmlsYXRlcmFsIGNsb3Npbmcgb2YgYSBjaGFubmVsLiBUaGUgb3JpZ2luIG11c3QgYmUgZWl0aGVyIHRoZSBzZW5kZXIgb3IgdGhlmHJlY2lwaWVudCBpbiB0aGUgY2hhbm5lbCBiZWluZyBjbG9zZWQuAMBUaGUgY2xvc3VyZSBjYW4gb25seSBoYXBwZW4gb24gYSBzZXNzaW9uIGNoYW5nZS5AZm9yY2VfY2xlYW5faHJtcAwBEHBhcmGNAgEYUGFyYUlkAAEsbnVtX2luYm91bmQQAQx1MzIAATBudW1fb3V0Ym91bmQQAQx1MzIAAxxdAVRoaXMgZXh0cmluc2ljIHRyaWdnZXJzIHRoZSBjbGVhbnVwIG9mIGFsbCB0aGUgSFJNUCBzdG9yYWdlIGl0ZW1zIHRoYXQgYSBwYXJhIG1heSBoYXZlLkkBTm9ybWFsbHkgdGhpcyBoYXBwZW5zIG9uY2UgcGVyIHNlc3Npb24sIGJ1dCB0aGlzIGFsbG93cyB5b3UgdG8gdHJpZ2dlciB0aGUgY2xlYW51cJRpbW1lZGlhdGVseSBmb3IgYSBzcGVjaWZpYyBwYXJhY2hhaW4uAFEBTnVtYmVyIG9mIGluYm91bmQgYW5kIG91dGJvdW5kIGNoYW5uZWxzIGZvciBgcGFyYWAgbXVzdCBiZSBwcm92aWRlZCBhcyB3aXRuZXNzIGRhdGEuAJBPcmlnaW4gbXVzdCBiZSB0aGUgYENoYW5uZWxNYW5hZ2VyYC5cZm9yY2VfcHJvY2Vzc19ocm1wX29wZW4EASBjaGFubmVscxABDHUzMgAEIKRGb3JjZSBwcm9jZXNzIEhSTVAgb3BlbiBjaGFubmVsIHJlcXVlc3RzLgBVAUlmIHRoZXJlIGFyZSBwZW5kaW5nIEhSTVAgb3BlbiBjaGFubmVsIHJlcXVlc3RzLCB5b3UgY2FuIHVzZSB0aGlzIGZ1bmN0aW9uIHRvIHByb2Nlc3OIYWxsIG9mIHRob3NlIHJlcXVlc3RzIGltbWVkaWF0ZWx5LgAJAVRvdGFsIG51bWJlciBvZiBvcGVuaW5nIGNoYW5uZWxzIG11c3QgYmUgcHJvdmlkZWQgYXMgd2l0bmVzcyBkYXRhLgCQT3JpZ2luIG11c3QgYmUgdGhlIGBDaGFubmVsTWFuYWdlcmAuYGZvcmNlX3Byb2Nlc3NfaHJtcF9jbG9zZQQBIGNoYW5uZWxzEAEMdTMyAAUgqEZvcmNlIHByb2Nlc3MgSFJNUCBjbG9zZSBjaGFubmVsIHJlcXVlc3RzLgBZAUlmIHRoZXJlIGFyZSBwZW5kaW5nIEhSTVAgY2xvc2UgY2hhbm5lbCByZXF1ZXN0cywgeW91IGNhbiB1c2UgdGhpcyBmdW5jdGlvbiB0byBwcm9jZXNziGFsbCBvZiB0aG9zZSByZXF1ZXN0cyBpbW1lZGlhdGVseS4ACQFUb3RhbCBudW1iZXIgb2YgY2xvc2luZyBjaGFubmVscyBtdXN0IGJlIHByb3ZpZGVkIGFzIHdpdG5lc3MgZGF0YS4AkE9yaWdpbiBtdXN0IGJlIHRoZSBgQ2hhbm5lbE1hbmFnZXJgLmBocm1wX2NhbmNlbF9vcGVuX3JlcXVlc3QIAShjaGFubmVsX2lkGQUBNEhybXBDaGFubmVsSWQAATRvcGVuX3JlcXVlc3RzEAEMdTMyAAYgXQFUaGlzIGNhbmNlbHMgYSBwZW5kaW5nIG9wZW4gY2hhbm5lbCByZXF1ZXN0LiBJdCBjYW4gYmUgY2FuY2VsZWQgYnkgZWl0aGVyIG9mIHRoZSBzZW5kZXIZAW9yIHRoZSByZWNpcGllbnQgZm9yIHRoYXQgcmVxdWVzdC4gVGhlIG9yaWdpbiBtdXN0IGJlIGVpdGhlciBvZiB0aG9zZS4AXQFUaGUgY2FuY2VsbGF0aW9uIGhhcHBlbnMgaW1tZWRpYXRlbHkuIEl0IGlzIG5vdCBwb3NzaWJsZSB0byBjYW5jZWwgdGhlIHJlcXVlc3QgaWYgaXQgaXNEYWxyZWFkeSBhY2NlcHRlZC4AWQFUb3RhbCBudW1iZXIgb2Ygb3BlbiByZXF1ZXN0cyAoaS5lLiBgSHJtcE9wZW5DaGFubmVsUmVxdWVzdHNMaXN0YCkgbXVzdCBiZSBwcm92aWRlZCBhczR3aXRuZXNzIGRhdGEuXGZvcmNlX29wZW5faHJtcF9jaGFubmVsEAEYc2VuZGVyjQIBGFBhcmFJZAABJHJlY2lwaWVudI0CARhQYXJhSWQAATBtYXhfY2FwYWNpdHkQAQx1MzIAAUBtYXhfbWVzc2FnZV9zaXplEAEMdTMyAAcgYQFPcGVuIGEgY2hhbm5lbCBmcm9tIGEgYHNlbmRlcmAgdG8gYSBgcmVjaXBpZW50YCBgUGFyYUlkYC4gQWx0aG91Z2ggb3BlbmVkIGJ5IGdvdmVybmFuY2UsQQF0aGUgYG1heF9jYXBhY2l0eWAgYW5kIGBtYXhfbWVzc2FnZV9zaXplYCBhcmUgc3RpbGwgc3ViamVjdCB0byB0aGUgUmVsYXkgQ2hhaW4nc0hjb25maWd1cmVkIGxpbWl0cy4ATQFFeHBlY3RlZCB1c2UgaXMgd2hlbiBvbmUgKGFuZCBvbmx5IG9uZSkgb2YgdGhlIGBQYXJhSWRgcyBpbnZvbHZlZCBpbiB0aGUgY2hhbm5lbCBpc8Bnb3Zlcm5lZCBieSB0aGUgc3lzdGVtLCBlLmcuIGEgc3lzdGVtIHBhcmFjaGFpbi4AkE9yaWdpbiBtdXN0IGJlIHRoZSBgQ2hhbm5lbE1hbmFnZXJgLmBlc3RhYmxpc2hfc3lzdGVtX2NoYW5uZWwIARhzZW5kZXKNAgEYUGFyYUlkAAEkcmVjaXBpZW50jQIBGFBhcmFJZAAIMFEBRXN0YWJsaXNoIGFuIEhSTVAgY2hhbm5lbCBiZXR3ZWVuIHR3byBzeXN0ZW0gY2hhaW5zLiBJZiB0aGUgY2hhbm5lbCBkb2VzIG5vdCBhbHJlYWR5UQFleGlzdCwgdGhlIHRyYW5zYWN0aW9uIGZlZXMgd2lsbCBiZSByZWZ1bmRlZCB0byB0aGUgY2FsbGVyLiBUaGUgc3lzdGVtIGRvZXMgbm90IHRha2VZAWRlcG9zaXRzIGZvciBjaGFubmVscyBiZXR3ZWVuIHN5c3RlbSBjaGFpbnMsIGFuZCBhdXRvbWF0aWNhbGx5IHNldHMgdGhlIG1lc3NhZ2UgbnVtYmVyGQFhbmQgc2l6ZSBsaW1pdHMgdG8gdGhlIG1heGltdW0gYWxsb3dlZCBieSB0aGUgbmV0d29yaydzIGNvbmZpZ3VyYXRpb24uAChBcmd1bWVudHM6AJQtIGBzZW5kZXJgOiBBIHN5c3RlbSBjaGFpbiwgYFBhcmFJZGAuoC0gYHJlY2lwaWVudGA6IEEgc3lzdGVtIGNoYWluLCBgUGFyYUlkYC4AVQFBbnkgc2lnbmVkIG9yaWdpbiBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uLCBidXQgX2JvdGhfIGlucHV0cyBNVVNUIGJlIHN5c3RlbSBjaGFpbnMuIElmwHRoZSBjaGFubmVsIGRvZXMgbm90IGV4aXN0IHlldCwgdGhlcmUgaXMgbm8gZmVlLlRwb2tlX2NoYW5uZWxfZGVwb3NpdHMIARhzZW5kZXKNAgEYUGFyYUlkAAEkcmVjaXBpZW50jQIBGFBhcmFJZAAJJFEBVXBkYXRlIHRoZSBkZXBvc2l0cyBoZWxkIGZvciBhbiBIUk1QIGNoYW5uZWwgdG8gdGhlIGxhdGVzdCBgQ29uZmlndXJhdGlvbmAuIENoYW5uZWxzsHdpdGggc3lzdGVtIGNoYWlucyBkbyBub3QgcmVxdWlyZSBhIGRlcG9zaXQuAChBcmd1bWVudHM6AHgtIGBzZW5kZXJgOiBBIGNoYWluLCBgUGFyYUlkYC6ELSBgcmVjaXBpZW50YDogQSBjaGFpbiwgYFBhcmFJZGAuAKRBbnkgc2lnbmVkIG9yaWdpbiBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uLnRlc3RhYmxpc2hfY2hhbm5lbF93aXRoX3N5c3RlbQQBTHRhcmdldF9zeXN0ZW1fY2hhaW6NAgEYUGFyYUlkAAocOQFFc3RhYmxpc2ggYSBiaWRpcmVjdGlvbmFsIEhSTVAgY2hhbm5lbCBiZXR3ZWVuIGEgcGFyYWNoYWluIGFuZCBhIHN5c3RlbSBjaGFpbi4AKEFyZ3VtZW50czoAyC0gYHRhcmdldF9zeXN0ZW1fY2hhaW5gOiBBIHN5c3RlbSBjaGFpbiwgYFBhcmFJZGAuALBUaGUgb3JpZ2luIG5lZWRzIHRvIGJlIHRoZSBwYXJhY2hhaW4gb3JpZ2luLgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy4ZBQx0cG9sa2Fkb3RfcGFyYWNoYWluX3ByaW1pdGl2ZXMocHJpbWl0aXZlczRIcm1wQ2hhbm5lbElkAAAIARhzZW5kZXKNAgEISWQAASRyZWNpcGllbnSNAgEISWQAAB0FEGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMgZGlzcHV0ZXMYcGFsbGV0EENhbGwEBFQAAQQ4Zm9yY2VfdW5mcmVlemUAAAAEDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMuIQUUbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucyBkaXNwdXRlcyBzbGFzaGluZxhwYWxsZXQQQ2FsbAQEVAABBHByZXBvcnRfZGlzcHV0ZV9sb3N0X3Vuc2lnbmVkCAE0ZGlzcHV0ZV9wcm9vZiUFAURCb3g8RGlzcHV0ZVByb29mPgABPGtleV9vd25lcl9wcm9vZq0BAUBUOjpLZXlPd25lclByb29mAAAABA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLiUFEExwb2xrYWRvdF9wcmltaXRpdmVzCHY3IHNsYXNoaW5nMERpc3B1dGVQcm9vZgAAEAEkdGltZV9zbG90KQUBQERpc3B1dGVzVGltZVNsb3QAARBraW5kLQUBTFNsYXNoaW5nT2ZmZW5jZUtpbmQAATx2YWxpZGF0b3JfaW5kZXiZBAE4VmFsaWRhdG9ySW5kZXgAATB2YWxpZGF0b3JfaWQdAgEsVmFsaWRhdG9ySWQAACkFEExwb2xrYWRvdF9wcmltaXRpdmVzCHY3IHNsYXNoaW5nQERpc3B1dGVzVGltZVNsb3QAAAgBNHNlc3Npb25faW5kZXgQATBTZXNzaW9uSW5kZXgAAThjYW5kaWRhdGVfaGFzaO0EATRDYW5kaWRhdGVIYXNoAAAtBRBMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2NyBzbGFzaGluZ0xTbGFzaGluZ09mZmVuY2VLaW5kAAEIKEZvckludmFsaWQAAAAwQWdhaW5zdFZhbGlkAAEAADEFEGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnNIYXNzaWduZXJfb25fZGVtYW5kGHBhbGxldBBDYWxsBARUAAEIXHBsYWNlX29yZGVyX2FsbG93X2RlYXRoCAEobWF4X2Ftb3VudBgBMEJhbGFuY2VPZjxUPgABHHBhcmFfaWSNAgEYUGFyYUlkAAA8lENyZWF0ZSBhIHNpbmdsZSBvbiBkZW1hbmQgY29yZSBvcmRlci5JAVdpbGwgdXNlIHRoZSBzcG90IHByaWNlIGZvciB0aGUgY3VycmVudCBibG9jayBhbmQgd2lsbCByZWFwIHRoZSBhY2NvdW50IGlmIG5lZWRlZC4ALFBhcmFtZXRlcnM6OQEtIGBvcmlnaW5gOiBUaGUgc2VuZGVyIG9mIHRoZSBjYWxsLCBmdW5kcyB3aWxsIGJlIHdpdGhkcmF3biBmcm9tIHRoaXMgYWNjb3VudC5JAS0gYG1heF9hbW91bnRgOiBUaGUgbWF4aW11bSBiYWxhbmNlIHRvIHdpdGhkcmF3IGZyb20gdGhlIG9yaWdpbiB0byBwbGFjZSBhbiBvcmRlci4NAS0gYHBhcmFfaWRgOiBBIGBQYXJhSWRgIHRoZSBvcmlnaW4gd2FudHMgdG8gcHJvdmlkZSBibG9ja3NwYWNlIGZvci4AHEVycm9yczrkLSBgSW5zdWZmaWNpZW50QmFsYW5jZWA6IGZyb20gdGhlIEN1cnJlbmN5IGltcGxlbWVudGF0aW9uNC0gYFF1ZXVlRnVsbGCALSBgU3BvdFByaWNlSGlnaGVyVGhhbk1heEFtb3VudGAAHEV2ZW50czpcLSBgT25EZW1hbmRPcmRlclBsYWNlZGBYcGxhY2Vfb3JkZXJfa2VlcF9hbGl2ZQgBKG1heF9hbW91bnQYATBCYWxhbmNlT2Y8VD4AARxwYXJhX2lkjQIBGFBhcmFJZAABPGEBU2FtZSBhcyB0aGUgW2BwbGFjZV9vcmRlcl9hbGxvd19kZWF0aGBdKFNlbGY6OnBsYWNlX29yZGVyX2FsbG93X2RlYXRoKSBjYWxsICwgYnV0IHdpdGggYdxjaGVjayB0aGF0IHBsYWNpbmcgdGhlIG9yZGVyIHdpbGwgbm90IHJlYXAgdGhlIGFjY291bnQuACxQYXJhbWV0ZXJzOjkBLSBgb3JpZ2luYDogVGhlIHNlbmRlciBvZiB0aGUgY2FsbCwgZnVuZHMgd2lsbCBiZSB3aXRoZHJhd24gZnJvbSB0aGlzIGFjY291bnQuSQEtIGBtYXhfYW1vdW50YDogVGhlIG1heGltdW0gYmFsYW5jZSB0byB3aXRoZHJhdyBmcm9tIHRoZSBvcmlnaW4gdG8gcGxhY2UgYW4gb3JkZXIuDQEtIGBwYXJhX2lkYDogQSBgUGFyYUlkYCB0aGUgb3JpZ2luIHdhbnRzIHRvIHByb3ZpZGUgYmxvY2tzcGFjZSBmb3IuABxFcnJvcnM65C0gYEluc3VmZmljaWVudEJhbGFuY2VgOiBmcm9tIHRoZSBDdXJyZW5jeSBpbXBsZW1lbnRhdGlvbjQtIGBRdWV1ZUZ1bGxggC0gYFNwb3RQcmljZUhpZ2hlclRoYW5NYXhBbW91bnRgABxFdmVudHM6XC0gYE9uRGVtYW5kT3JkZXJQbGFjZWRgBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLjUFEFxwb2xrYWRvdF9ydW50aW1lX2NvbW1vbjxwYXJhc19yZWdpc3RyYXIYcGFsbGV0EENhbGwEBFQAASQgcmVnaXN0ZXIMAQhpZI0CARhQYXJhSWQAATBnZW5lc2lzX2hlYWTZBAEgSGVhZERhdGEAATx2YWxpZGF0aW9uX2NvZGXVBAE4VmFsaWRhdGlvbkNvZGUAAFD4UmVnaXN0ZXIgaGVhZCBkYXRhIGFuZCB2YWxpZGF0aW9uIGNvZGUgZm9yIGEgcmVzZXJ2ZWQgUGFyYSBJZC4AMCMjIEFyZ3VtZW50c8AtIGBvcmlnaW5gOiBNdXN0IGJlIGNhbGxlZCBieSBhIGBTaWduZWRgIG9yaWdpbi4tAS0gYGlkYDogVGhlIHBhcmEgSUQuIE11c3QgYmUgb3duZWQvbWFuYWdlZCBieSB0aGUgYG9yaWdpbmAgc2lnbmluZyBhY2NvdW50LgEBLSBgZ2VuZXNpc19oZWFkYDogVGhlIGdlbmVzaXMgaGVhZCBkYXRhIG9mIHRoZSBwYXJhY2hhaW4vdGhyZWFkLiUBLSBgdmFsaWRhdGlvbl9jb2RlYDogVGhlIGluaXRpYWwgdmFsaWRhdGlvbiBjb2RlIG9mIHRoZSBwYXJhY2hhaW4vdGhyZWFkLgBAIyMgRGVwb3NpdHMvRmVlcwkBVGhlIGFjY291bnQgd2l0aCB0aGUgb3JpZ2luYXRpbmcgc2lnbmF0dXJlIG11c3QgcmVzZXJ2ZSBhIGRlcG9zaXQuAE0BVGhlIGRlcG9zaXQgaXMgcmVxdWlyZWQgdG8gY292ZXIgdGhlIGNvc3RzIGFzc29jaWF0ZWQgd2l0aCBzdG9yaW5nIHRoZSBnZW5lc2lzIGhlYWR0ZGF0YSBhbmQgdGhlIHZhbGlkYXRpb24gY29kZS4xAVRoaXMgYWNjb3VudHMgZm9yIHRoZSBwb3RlbnRpYWwgdG8gc3RvcmUgdmFsaWRhdGlvbiBjb2RlIG9mIGEgc2l6ZSB1cCB0byB0aGXcYG1heF9jb2RlX3NpemVgLCBhcyBkZWZpbmVkIGluIHRoZSBjb25maWd1cmF0aW9uIHBhbGxldAAdAUFueXRoaW5nIGFscmVhZHkgcmVzZXJ2ZWQgcHJldmlvdXNseSBmb3IgdGhpcyBwYXJhIElEIGlzIGFjY291bnRlZCBmb3IuACQjIyBFdmVudHPUVGhlIGBSZWdpc3RlcmVkYCBldmVudCBpcyBlbWl0dGVkIGluIGNhc2Ugb2Ygc3VjY2Vzcy44Zm9yY2VfcmVnaXN0ZXIUAQx3aG8AATBUOjpBY2NvdW50SWQAARxkZXBvc2l0GAEwQmFsYW5jZU9mPFQ+AAEIaWSNAgEYUGFyYUlkAAEwZ2VuZXNpc19oZWFk2QQBIEhlYWREYXRhAAE8dmFsaWRhdGlvbl9jb2Rl1QQBOFZhbGlkYXRpb25Db2RlAAEY3EZvcmNlIHRoZSByZWdpc3RyYXRpb24gb2YgYSBQYXJhIElkIG9uIHRoZSByZWxheSBjaGFpbi4AuFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgYnkgYSBSb290IG9yaWdpbi4AGQFUaGUgZGVwb3NpdCB0YWtlbiBjYW4gYmUgc3BlY2lmaWVkIGZvciB0aGlzIHJlZ2lzdHJhdGlvbi4gQW55IGBQYXJhSWRgGQFjYW4gYmUgcmVnaXN0ZXJlZCwgaW5jbHVkaW5nIHN1Yi0xMDAwIElEcyB3aGljaCBhcmUgU3lzdGVtIFBhcmFjaGFpbnMuKGRlcmVnaXN0ZXIEAQhpZI0CARhQYXJhSWQAAhAFAURlcmVnaXN0ZXIgYSBQYXJhIElkLCBmcmVlaW5nIGFsbCBkYXRhIGFuZCByZXR1cm5pbmcgYW55IGRlcG9zaXQuAFEBVGhlIGNhbGxlciBtdXN0IGJlIFJvb3QsIHRoZSBgcGFyYWAgb3duZXIsIG9yIHRoZSBgcGFyYWAgaXRzZWxmLiBUaGUgcGFyYSBtdXN0IGJlIGFuUG9uLWRlbWFuZCBwYXJhY2hhaW4uEHN3YXAIAQhpZI0CARhQYXJhSWQAARRvdGhlco0CARhQYXJhSWQAAzBBAVN3YXAgYSBsZWFzZSBob2xkaW5nIHBhcmFjaGFpbiB3aXRoIGFub3RoZXIgcGFyYWNoYWluLCBlaXRoZXIgb24tZGVtYW5kIG9yIGxlYXNlIGhvbGRpbmcuAAEBVGhlIG9yaWdpbiBtdXN0IGJlIFJvb3QsIHRoZSBgcGFyYWAgb3duZXIsIG9yIHRoZSBgcGFyYWAgaXRzZWxmLgBhAVRoZSBzd2FwIHdpbGwgaGFwcGVuIG9ubHkgaWYgdGhlcmUgaXMgYWxyZWFkeSBhbiBvcHBvc2l0ZSBzd2FwIHBlbmRpbmcuIElmIHRoZXJlIGlzIG5vdCxZAXRoZSBzd2FwIHdpbGwgYmUgc3RvcmVkIGluIHRoZSBwZW5kaW5nIHN3YXBzIG1hcCwgcmVhZHkgZm9yIGEgbGF0ZXIgY29uZmlybWF0b3J5IHN3YXAuAF0BVGhlIGBQYXJhSWRgcyByZW1haW4gbWFwcGVkIHRvIHRoZSBzYW1lIGhlYWQgZGF0YSBhbmQgY29kZSBzbyBleHRlcm5hbCBjb2RlIGNhbiByZWx5IG9uPQFgUGFyYUlkYCB0byBiZSBhIGxvbmctdGVybSBpZGVudGlmaWVyIG9mIGEgbm90aW9uYWwgInBhcmFjaGFpbiIuIEhvd2V2ZXIsIHRoZWlyNQFzY2hlZHVsaW5nIGluZm8gKGkuZS4gd2hldGhlciB0aGV5J3JlIGFuIG9uLWRlbWFuZCBwYXJhY2hhaW4gb3IgbGVhc2UgaG9sZGluZxUBcGFyYWNoYWluKSwgYXVjdGlvbiBpbmZvcm1hdGlvbiBhbmQgdGhlIGF1Y3Rpb24gZGVwb3NpdCBhcmUgc3dpdGNoZWQuLHJlbW92ZV9sb2NrBAEQcGFyYY0CARhQYXJhSWQABBANAVJlbW92ZSBhIG1hbmFnZXIgbG9jayBmcm9tIGEgcGFyYS4gVGhpcyB3aWxsIGFsbG93IHRoZSBtYW5hZ2VyIG9mIGE1AXByZXZpb3VzbHkgbG9ja2VkIHBhcmEgdG8gZGVyZWdpc3RlciBvciBzd2FwIGEgcGFyYSB3aXRob3V0IHVzaW5nIGdvdmVybmFuY2UuANxDYW4gb25seSBiZSBjYWxsZWQgYnkgdGhlIFJvb3Qgb3JpZ2luIG9yIHRoZSBwYXJhY2hhaW4uHHJlc2VydmUABUSUUmVzZXJ2ZSBhIFBhcmEgSWQgb24gdGhlIHJlbGF5IGNoYWluLgBNAVRoaXMgZnVuY3Rpb24gd2lsbCByZXNlcnZlIGEgbmV3IFBhcmEgSWQgdG8gYmUgb3duZWQvbWFuYWdlZCBieSB0aGUgb3JpZ2luIGFjY291bnQuYQFUaGUgb3JpZ2luIGFjY291bnQgaXMgYWJsZSB0byByZWdpc3RlciBoZWFkIGRhdGEgYW5kIHZhbGlkYXRpb24gY29kZSB1c2luZyBgcmVnaXN0ZXJgIHRvWQFjcmVhdGUgYW4gb24tZGVtYW5kIHBhcmFjaGFpbi4gVXNpbmcgdGhlIFNsb3RzIHBhbGxldCwgYW4gb24tZGVtYW5kIHBhcmFjaGFpbiBjYW4gdGhlbqRiZSB1cGdyYWRlZCB0byBhIGxlYXNlIGhvbGRpbmcgcGFyYWNoYWluLgAwIyMgQXJndW1lbnRzVQEtIGBvcmlnaW5gOiBNdXN0IGJlIGNhbGxlZCBieSBhIGBTaWduZWRgIG9yaWdpbi4gQmVjb21lcyB0aGUgbWFuYWdlci9vd25lciBvZiB0aGUgbmV3KCAgcGFyYSBJRC4AQCMjIERlcG9zaXRzL0ZlZXMhAVRoZSBvcmlnaW4gbXVzdCByZXNlcnZlIGEgZGVwb3NpdCBvZiBgUGFyYURlcG9zaXRgIGZvciB0aGUgcmVnaXN0cmF0aW9uLgAkIyMgRXZlbnRzWQFUaGUgYFJlc2VydmVkYCBldmVudCBpcyBlbWl0dGVkIGluIGNhc2Ugb2Ygc3VjY2Vzcywgd2hpY2ggcHJvdmlkZXMgdGhlIElEIHJlc2VydmVkIGZvchB1c2UuIGFkZF9sb2NrBAEQcGFyYY0CARhQYXJhSWQABhQJAUFkZCBhIG1hbmFnZXIgbG9jayBmcm9tIGEgcGFyYS4gVGhpcyB3aWxsIHByZXZlbnQgdGhlIG1hbmFnZXIgb2YgYYhwYXJhIHRvIGRlcmVnaXN0ZXIgb3Igc3dhcCBhIHBhcmEuAEkBQ2FuIGJlIGNhbGxlZCBieSBSb290LCB0aGUgcGFyYWNoYWluLCBvciB0aGUgcGFyYWNoYWluIG1hbmFnZXIgaWYgdGhlIHBhcmFjaGFpbiBpcyR1bmxvY2tlZC5Uc2NoZWR1bGVfY29kZV91cGdyYWRlCAEQcGFyYY0CARhQYXJhSWQAASBuZXdfY29kZdUEAThWYWxpZGF0aW9uQ29kZQAHLHRTY2hlZHVsZSBhIHBhcmFjaGFpbiB1cGdyYWRlLgBVAVRoaXMgd2lsbCBraWNrIG9mZiBhIGNoZWNrIG9mIGBuZXdfY29kZWAgYnkgYWxsIHZhbGlkYXRvcnMuIEFmdGVyIHRoZSBtYWpvcml0eSBvZiB0aGVVAXZhbGlkYXRvcnMgaGF2ZSByZXBvcnRlZCBvbiB0aGUgdmFsaWRpdHkgb2YgdGhlIGNvZGUsIHRoZSBjb2RlIHdpbGwgZWl0aGVyIGJlIGVuYWN0ZWRVAW9yIHRoZSB1cGdyYWRlIHdpbGwgYmUgcmVqZWN0ZWQuIElmIHRoZSBjb2RlIHdpbGwgYmUgZW5hY3RlZCwgdGhlIGN1cnJlbnQgY29kZSBvZiB0aGVdAXBhcmFjaGFpbiB3aWxsIGJlIG92ZXJ3cml0dGVuIGRpcmVjdGx5LiBUaGlzIG1lYW5zIHRoYXQgYW55IFBvViB3aWxsIGJlIGNoZWNrZWQgYnkgdGhpc10BbmV3IGNvZGUuIFRoZSBwYXJhY2hhaW4gaXRzZWxmIHdpbGwgbm90IGJlIGluZm9ybWVkIGV4cGxpY2l0bHkgdGhhdCB0aGUgdmFsaWRhdGlvbiBjb2RlMGhhcyBjaGFuZ2VkLgBJAUNhbiBiZSBjYWxsZWQgYnkgUm9vdCwgdGhlIHBhcmFjaGFpbiwgb3IgdGhlIHBhcmFjaGFpbiBtYW5hZ2VyIGlmIHRoZSBwYXJhY2hhaW4gaXMkdW5sb2NrZWQuQHNldF9jdXJyZW50X2hlYWQIARBwYXJhjQIBGFBhcmFJZAABIG5ld19oZWFk2QQBIEhlYWREYXRhAAgQhFNldCB0aGUgcGFyYWNoYWluJ3MgY3VycmVudCBoZWFkLgBJAUNhbiBiZSBjYWxsZWQgYnkgUm9vdCwgdGhlIHBhcmFjaGFpbiwgb3IgdGhlIHBhcmFjaGFpbiBtYW5hZ2VyIGlmIHRoZSBwYXJhY2hhaW4gaXMkdW5sb2NrZWQuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLjkFEFxwb2xrYWRvdF9ydW50aW1lX2NvbW1vbhRzbG90cxhwYWxsZXQQQ2FsbAQEVAABDCxmb3JjZV9sZWFzZRQBEHBhcmGNAgEYUGFyYUlkAAEYbGVhc2VyAAEwVDo6QWNjb3VudElkAAEYYW1vdW50GAEwQmFsYW5jZU9mPFQ+AAEwcGVyaW9kX2JlZ2luEAFATGVhc2VQZXJpb2RPZjxUPgABMHBlcmlvZF9jb3VudBABQExlYXNlUGVyaW9kT2Y8VD4AABBNAUp1c3QgYSBjb25uZWN0IGludG8gdGhlIGBsZWFzZV9vdXRgIGNhbGwsIGluIGNhc2UgUm9vdCB3YW50cyB0byBmb3JjZSBzb21lIGxlYXNlIHRv/GhhcHBlbiBpbmRlcGVuZGVudGx5IG9mIGFueSBvdGhlciBvbi1jaGFpbiBtZWNoYW5pc20gdG8gdXNlIGl0LgD4VGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgbWF0Y2ggYFQ6OkZvcmNlT3JpZ2luYC5AY2xlYXJfYWxsX2xlYXNlcwQBEHBhcmGNAgEYUGFyYUlkAAEMTQFDbGVhciBhbGwgbGVhc2VzIGZvciBhIFBhcmEgSWQsIHJlZnVuZGluZyBhbnkgZGVwb3NpdHMgYmFjayB0byB0aGUgb3JpZ2luYWwgb3duZXJzLgD4VGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgbWF0Y2ggYFQ6OkZvcmNlT3JpZ2luYC48dHJpZ2dlcl9vbmJvYXJkBAEQcGFyYY0CARhQYXJhSWQAAhwlAVRyeSB0byBvbmJvYXJkIGEgcGFyYWNoYWluIHRoYXQgaGFzIGEgbGVhc2UgZm9yIHRoZSBjdXJyZW50IGxlYXNlIHBlcmlvZC4ARQFUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VmdWwgaWYgdGhlcmUgd2FzIHNvbWUgc3RhdGUgaXNzdWUgd2l0aCBhIHBhcmEgdGhhdCBzaG91bGQ5AWhhdmUgb25ib2FyZGVkLCBidXQgd2FzIHVuYWJsZSB0by4gQXMgbG9uZyBhcyB0aGV5IGhhdmUgYSBsZWFzZSBwZXJpb2QsIHdlIGNhbmxsZXQgdGhlbSBvbmJvYXJkIGZyb20gaGVyZS4AzE9yaWdpbiBtdXN0IGJlIHNpZ25lZCwgYnV0IGNhbiBiZSBjYWxsZWQgYnkgYW55b25lLgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy49BRBccG9sa2Fkb3RfcnVudGltZV9jb21tb24gYXVjdGlvbnMYcGFsbGV0EENhbGwEBFQAAQwsbmV3X2F1Y3Rpb24IASBkdXJhdGlvbuwBREJsb2NrTnVtYmVyRm9yPFQ+AAFIbGVhc2VfcGVyaW9kX2luZGV47AFATGVhc2VQZXJpb2RPZjxUPgAAFFRDcmVhdGUgYSBuZXcgYXVjdGlvbi4AUQFUaGlzIGNhbiBvbmx5IGhhcHBlbiB3aGVuIHRoZXJlIGlzbid0IGFscmVhZHkgYW4gYXVjdGlvbiBpbiBwcm9ncmVzcyBhbmQgbWF5IG9ubHkgYmUlAWNhbGxlZCBieSB0aGUgcm9vdCBvcmlnaW4uIEFjY2VwdHMgdGhlIGBkdXJhdGlvbmAgb2YgdGhpcyBhdWN0aW9uIGFuZCB0aGVZAWBsZWFzZV9wZXJpb2RfaW5kZXhgIG9mIHRoZSBpbml0aWFsIGxlYXNlIHBlcmlvZCBvZiB0aGUgZm91ciB0aGF0IGFyZSB0byBiZSBhdWN0aW9uZWQuDGJpZBQBEHBhcmFBBQEYUGFyYUlkAAE0YXVjdGlvbl9pbmRleOwBMEF1Y3Rpb25JbmRleAABKGZpcnN0X3Nsb3TsAUBMZWFzZVBlcmlvZE9mPFQ+AAEkbGFzdF9zbG907AFATGVhc2VQZXJpb2RPZjxUPgABGGFtb3VudPwBMEJhbGFuY2VPZjxUPgABQEkBTWFrZSBhIG5ldyBiaWQgZnJvbSBhbiBhY2NvdW50IChpbmNsdWRpbmcgYSBwYXJhY2hhaW4gYWNjb3VudCkgZm9yIGRlcGxveWluZyBhIG5ldyhwYXJhY2hhaW4uAFkBTXVsdGlwbGUgc2ltdWx0YW5lb3VzIGJpZHMgZnJvbSB0aGUgc2FtZSBiaWRkZXIgYXJlIGFsbG93ZWQgb25seSBhcyBsb25nIGFzIGFsbCBhY3RpdmU9AWJpZHMgb3ZlcmxhcCBlYWNoIG90aGVyIChpLmUuIGFyZSBtdXR1YWxseSBleGNsdXNpdmUpLiBCaWRzIGNhbm5vdCBiZSByZWRhY3RlZC4AVQEtIGBzdWJgIGlzIHRoZSBzdWItYmlkZGVyIElELCBhbGxvd2luZyBmb3IgbXVsdGlwbGUgY29tcGV0aW5nIGJpZHMgdG8gYmUgbWFkZSBieSAoYW5kcGZ1bmRlZCBieSkgdGhlIHNhbWUgYWNjb3VudC5NAS0gYGF1Y3Rpb25faW5kZXhgIGlzIHRoZSBpbmRleCBvZiB0aGUgYXVjdGlvbiB0byBiaWQgb24uIFNob3VsZCBqdXN0IGJlIHRoZSBwcmVzZW50aHZhbHVlIG9mIGBBdWN0aW9uQ291bnRlcmAuSQEtIGBmaXJzdF9zbG90YCBpcyB0aGUgZmlyc3QgbGVhc2UgcGVyaW9kIGluZGV4IG9mIHRoZSByYW5nZSB0byBiaWQgb24uIFRoaXMgaXMgdGhlCQFhYnNvbHV0ZSBsZWFzZSBwZXJpb2QgaW5kZXggdmFsdWUsIG5vdCBhbiBhdWN0aW9uLXNwZWNpZmljIG9mZnNldC5BAS0gYGxhc3Rfc2xvdGAgaXMgdGhlIGxhc3QgbGVhc2UgcGVyaW9kIGluZGV4IG9mIHRoZSByYW5nZSB0byBiaWQgb24uIFRoaXMgaXMgdGhlCQFhYnNvbHV0ZSBsZWFzZSBwZXJpb2QgaW5kZXggdmFsdWUsIG5vdCBhbiBhdWN0aW9uLXNwZWNpZmljIG9mZnNldC5JAS0gYGFtb3VudGAgaXMgdGhlIGFtb3VudCB0byBiaWQgdG8gYmUgaGVsZCBhcyBkZXBvc2l0IGZvciB0aGUgcGFyYWNoYWluIHNob3VsZCB0aGXIYmlkIHdpbi4gVGhpcyBhbW91bnQgaXMgaGVsZCB0aHJvdWdob3V0IHRoZSByYW5nZS44Y2FuY2VsX2F1Y3Rpb24AAgx4Q2FuY2VsIGFuIGluLXByb2dyZXNzIGF1Y3Rpb24uAIhDYW4gb25seSBiZSBjYWxsZWQgYnkgUm9vdCBvcmlnaW4uBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLkEFAAAGjQIARQUQXHBvbGthZG90X3J1bnRpbWVfY29tbW9uJGNyb3dkbG9hbhhwYWxsZXQQQ2FsbAQEVAABJBhjcmVhdGUYARRpbmRleEEFARhQYXJhSWQAAQxjYXD8ATBCYWxhbmNlT2Y8VD4AATBmaXJzdF9wZXJpb2TsAUBMZWFzZVBlcmlvZE9mPFQ+AAEsbGFzdF9wZXJpb2TsAUBMZWFzZVBlcmlvZE9mPFQ+AAEMZW5k7AFEQmxvY2tOdW1iZXJGb3I8VD4AASB2ZXJpZmllckkFAUxPcHRpb248TXVsdGlTaWduZXI+AAAUTQFDcmVhdGUgYSBuZXcgY3Jvd2Rsb2FuaW5nIGNhbXBhaWduIGZvciBhIHBhcmFjaGFpbiBzbG90IHdpdGggdGhlIGdpdmVuIGxlYXNlIHBlcmlvZBhyYW5nZS4AXQFUaGlzIGFwcGxpZXMgYSBsb2NrIHRvIHlvdXIgcGFyYWNoYWluIGNvbmZpZ3VyYXRpb24sIGVuc3VyaW5nIHRoYXQgaXQgY2Fubm90IGJlIGNoYW5nZWRkYnkgdGhlIHBhcmFjaGFpbiBtYW5hZ2VyLihjb250cmlidXRlDAEUaW5kZXhBBQEYUGFyYUlkAAEUdmFsdWX8ATBCYWxhbmNlT2Y8VD4AASRzaWduYXR1cmVRBQFYT3B0aW9uPE11bHRpU2lnbmF0dXJlPgABCFEBQ29udHJpYnV0ZSB0byBhIGNyb3dkIHNhbGUuIFRoaXMgd2lsbCB0cmFuc2ZlciBzb21lIGJhbGFuY2Ugb3ZlciB0byBmdW5kIGEgcGFyYWNoYWluUQFzbG90LiBJdCB3aWxsIGJlIHdpdGhkcmF3YWJsZSB3aGVuIHRoZSBjcm93ZGxvYW4gaGFzIGVuZGVkIGFuZCB0aGUgZnVuZHMgYXJlIHVudXNlZC4gd2l0aGRyYXcIAQx3aG8AATBUOjpBY2NvdW50SWQAARRpbmRleEEFARhQYXJhSWQAAkTAV2l0aGRyYXcgZnVsbCBiYWxhbmNlIG9mIGEgc3BlY2lmaWMgY29udHJpYnV0b3IuAMBPcmlnaW4gbXVzdCBiZSBzaWduZWQsIGJ1dCBjYW4gY29tZSBmcm9tIGFueW9uZS4AXQFUaGUgZnVuZCBtdXN0IGJlIGVpdGhlciBpbiwgb3IgcmVhZHkgZm9yLCByZXRpcmVtZW50LiBGb3IgYSBmdW5kIHRvIGJlICppbiogcmV0aXJlbWVudCxJAXRoZW4gdGhlIHJldGlyZW1lbnQgZmxhZyBtdXN0IGJlIHNldC4gRm9yIGEgZnVuZCB0byBiZSByZWFkeSBmb3IgcmV0aXJlbWVudCwgdGhlbjqcLSBpdCBtdXN0IG5vdCBhbHJlYWR5IGJlIGluIHJldGlyZW1lbnQ7TQEtIHRoZSBhbW91bnQgb2YgcmFpc2VkIGZ1bmRzIG11c3QgYmUgYmlnZ2VyIHRoYW4gdGhlIF9mcmVlXyBiYWxhbmNlIG9mIHRoZSBhY2NvdW50OzQtIGFuZCBlaXRoZXI6vCAgLSB0aGUgYmxvY2sgbnVtYmVyIG11c3QgYmUgYXQgbGVhc3QgYGVuZGA7IG9yLQEgIC0gdGhlIGN1cnJlbnQgbGVhc2UgcGVyaW9kIG11c3QgYmUgZ3JlYXRlciB0aGFuIHRoZSBmdW5kJ3MgYGxhc3RfcGVyaW9kYC4AVQFJbiB0aGlzIGNhc2UsIHRoZSBmdW5kJ3MgcmV0aXJlbWVudCBmbGFnIGlzIHNldCBhbmQgaXRzIGBlbmRgIGlzIHJlc2V0IHRvIHRoZSBjdXJyZW50NGJsb2NrIG51bWJlci4A8C0gYHdob2A6IFRoZSBhY2NvdW50IHdob3NlIGNvbnRyaWJ1dGlvbiBzaG91bGQgYmUgd2l0aGRyYXduLhkBLSBgaW5kZXhgOiBUaGUgcGFyYWNoYWluIHRvIHdob3NlIGNyb3dkbG9hbiB0aGUgY29udHJpYnV0aW9uIHdhcyBtYWRlLhhyZWZ1bmQEARRpbmRleEEFARhQYXJhSWQAAxTgQXV0b21hdGljYWxseSByZWZ1bmQgY29udHJpYnV0b3JzIG9mIGFuIGVuZGVkIGNyb3dkbG9hbi4hAUR1ZSB0byB3ZWlnaHQgcmVzdHJpY3Rpb25zLCB0aGlzIGZ1bmN0aW9uIG1heSBuZWVkIHRvIGJlIGNhbGxlZCBtdWx0aXBsZUkBdGltZXMgdG8gZnVsbHkgcmVmdW5kIGFsbCB1c2Vycy4gV2Ugd2lsbCByZWZ1bmQgYFJlbW92ZUtleXNMaW1pdGAgdXNlcnMgYXQgYSB0aW1lLgDAT3JpZ2luIG11c3QgYmUgc2lnbmVkLCBidXQgY2FuIGNvbWUgZnJvbSBhbnlvbmUuIGRpc3NvbHZlBAEUaW5kZXhBBQEYUGFyYUlkAAQEVQFSZW1vdmUgYSBmdW5kIGFmdGVyIHRoZSByZXRpcmVtZW50IHBlcmlvZCBoYXMgZW5kZWQgYW5kIGFsbCBmdW5kcyBoYXZlIGJlZW4gcmV0dXJuZWQuEGVkaXQYARRpbmRleEEFARhQYXJhSWQAAQxjYXD8ATBCYWxhbmNlT2Y8VD4AATBmaXJzdF9wZXJpb2TsAUBMZWFzZVBlcmlvZE9mPFQ+AAEsbGFzdF9wZXJpb2TsAUBMZWFzZVBlcmlvZE9mPFQ+AAEMZW5k7AFEQmxvY2tOdW1iZXJGb3I8VD4AASB2ZXJpZmllckkFAUxPcHRpb248TXVsdGlTaWduZXI+AAUM0EVkaXQgdGhlIGNvbmZpZ3VyYXRpb24gZm9yIGFuIGluLXByb2dyZXNzIGNyb3dkbG9hbi4AiENhbiBvbmx5IGJlIGNhbGxlZCBieSBSb290IG9yaWdpbi4gYWRkX21lbW8IARRpbmRleI0CARhQYXJhSWQAARBtZW1vOAEcVmVjPHU4PgAGDOxBZGQgYW4gb3B0aW9uYWwgbWVtbyB0byBhbiBleGlzdGluZyBjcm93ZGxvYW4gY29udHJpYnV0aW9uLgAtAU9yaWdpbiBtdXN0IGJlIFNpZ25lZCwgYW5kIHRoZSB1c2VyIG11c3QgaGF2ZSBjb250cmlidXRlZCB0byB0aGUgY3Jvd2Rsb2FuLhBwb2tlBAEUaW5kZXiNAgEYUGFyYUlkAAcMdFBva2UgdGhlIGZ1bmQgaW50byBgTmV3UmFpc2VgANxPcmlnaW4gbXVzdCBiZSBTaWduZWQsIGFuZCB0aGUgZnVuZCBoYXMgbm9uLXplcm8gcmFpc2UuOGNvbnRyaWJ1dGVfYWxsCAEUaW5kZXhBBQEYUGFyYUlkAAEkc2lnbmF0dXJlUQUBWE9wdGlvbjxNdWx0aVNpZ25hdHVyZT4ACAxhAUNvbnRyaWJ1dGUgeW91ciBlbnRpcmUgYmFsYW5jZSB0byBhIGNyb3dkIHNhbGUuIFRoaXMgd2lsbCB0cmFuc2ZlciB0aGUgZW50aXJlIGJhbGFuY2Ugb2ZRAWEgdXNlciBvdmVyIHRvIGZ1bmQgYSBwYXJhY2hhaW4gc2xvdC4gSXQgd2lsbCBiZSB3aXRoZHJhd2FibGUgd2hlbiB0aGUgY3Jvd2Rsb2FuIGhhc3xlbmRlZCBhbmQgdGhlIGZ1bmRzIGFyZSB1bnVzZWQuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLkkFBBhPcHRpb24EBFQBTQUBCBBOb25lAAAAEFNvbWUEAE0FAAABAABNBQgoc3BfcnVudGltZSxNdWx0aVNpZ25lcgABDBxFZDI1NTE5BAAEATxlZDI1NTE5OjpQdWJsaWMAAAAcU3IyNTUxOQQABAE8c3IyNTUxOTo6UHVibGljAAEAFEVjZHNhBAAtAgE0ZWNkc2E6OlB1YmxpYwACAABRBQQYT3B0aW9uBARUAVUFAQgQTm9uZQAAABBTb21lBABVBQAAAQAAVQUIKHNwX3J1bnRpbWU4TXVsdGlTaWduYXR1cmUAAQwcRWQyNTUxOQQASQIBSGVkMjU1MTk6OlNpZ25hdHVyZQAAABxTcjI1NTE5BABJAgFIc3IyNTUxOTo6U2lnbmF0dXJlAAEAFEVjZHNhBADZAgFAZWNkc2E6OlNpZ25hdHVyZQACAABZBRBscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zIGNvcmV0aW1lGHBhbGxldBBDYWxsBARUAAEMSHJlcXVlc3RfY29yZV9jb3VudAQBFGNvdW50bQEBDHUxNgABGFEBUmVxdWVzdCB0aGUgY29uZmlndXJhdGlvbiB0byBiZSB1cGRhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgY29yZXMuIFdhcm5pbmc6UQFTaW5jZSB0aGlzIG9ubHkgc2NoZWR1bGVzIGEgY29uZmlndXJhdGlvbiB1cGRhdGUsIGl0IHRha2VzIHR3byBzZXNzaW9ucyB0byBjb21lIGludG8cZWZmZWN0LgCYLSBgb3JpZ2luYDogUm9vdCBvciB0aGUgQ29yZXRpbWUgQ2hhaW6ALSBgY291bnRgOiB0b3RhbCBudW1iZXIgb2YgY29yZXNIcmVxdWVzdF9yZXZlbnVlX2F0BAEQd2hlbhABLEJsb2NrTnVtYmVyAAIQYQFSZXF1ZXN0IHRvIGNsYWltIHRoZSBpbnN0YW50YW5lb3VzIGNvcmV0aW1lIHNhbGVzIHJldmVudWUgc3RhcnRpbmcgZnJvbSB0aGUgYmxvY2sgaXQgd2FzXQFsYXN0IGNsYWltZWQgdW50aWwgYW5kIHVwIHRvIHRoZSBibG9jayBzcGVjaWZpZWQuIFRoZSBjbGFpbWVkIGFtb3VudCB2YWx1ZSBpcyBzZW50IGJhY2tRAXRvIHRoZSBDb3JldGltZSBjaGFpbiBpbiBhIGBub3RpZnlfcmV2ZW51ZWAgbWVzc2FnZS4gQXQgdGhlIHNhbWUgdGltZSwgdGhlIGFtb3VudCBpc4R0ZWxlcG9ydGVkIHRvIHRoZSBDb3JldGltZSBjaGFpbi4sYXNzaWduX2NvcmUQARBjb3JlbQEBPEJyb2tlckNvcmVJbmRleAABFGJlZ2luEAFEQmxvY2tOdW1iZXJGb3I8VD4AAShhc3NpZ25tZW50XQUBjFZlYzwoQ29yZUFzc2lnbm1lbnQsIFBhcnRzT2Y1NzYwMCk+AAEgZW5kX2hpbnRhAgFkT3B0aW9uPEJsb2NrTnVtYmVyRm9yPFQ+PgAEJFkBUmVjZWl2ZSBpbnN0cnVjdGlvbnMgZnJvbSB0aGUgYEV4dGVybmFsQnJva2VyT3JpZ2luYCwgZGV0YWlsaW5nIGhvdyBhIHNwZWNpZmljIGNvcmUgaXMsdG8gYmUgdXNlZC4ALFBhcmFtZXRlcnM6IQEtYG9yaWdpbmA6IFRoZSBgRXh0ZXJuYWxCcm9rZXJPcmlnaW5gLCBhc3N1bWVkIHRvIGJlIHRoZSBjb3JldGltZSBjaGFpbi6sLWBjb3JlYDogVGhlIGNvcmUgdGhhdCBzaG91bGQgYmUgc2NoZWR1bGVkLtgtYGJlZ2luYDogVGhlIHN0YXJ0aW5nIGJsb2NraGVpZ2h0IG9mIHRoZSBpbnN0cnVjdGlvbi7ULWBhc3NpZ25tZW50YDogSG93IHRoZSBibG9ja3NwYWNlIHNob3VsZCBiZSB1dGlsaXNlZC5ZAS1gZW5kX2hpbnRgOiBBbiBvcHRpb25hbCBoaW50IGFzIHRvIHdoZW4gdGhpcyBwYXJ0aWN1bGFyIHNldCBvZiBpbnN0cnVjdGlvbnMgd2lsbCBlbmQuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLl0FAAACYQUAYQUAAAQIZQVpBQBlBQw0cGFsbGV0X2Jyb2tlckhjb3JldGltZV9pbnRlcmZhY2U4Q29yZUFzc2lnbm1lbnQAAQwQSWRsZQAAABBQb29sAAEAEFRhc2sEABABGFRhc2tJZAACAABpBQxscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zRGFzc2lnbmVyX2NvcmV0aW1lMFBhcnRzT2Y1NzYwMAAABABtAQEMdTE2AABtBQxscGFsbGV0X3N0YXRlX3RyaWVfbWlncmF0aW9uGHBhbGxldBBDYWxsBARUAAEYWGNvbnRyb2xfYXV0b19taWdyYXRpb24EATBtYXliZV9jb25maWdxBQFcT3B0aW9uPE1pZ3JhdGlvbkxpbWl0cz4AAAyAQ29udHJvbCB0aGUgYXV0b21hdGljIG1pZ3JhdGlvbi4ADQFUaGUgZGlzcGF0Y2ggb3JpZ2luIG9mIHRoaXMgY2FsbCBtdXN0IGJlIFtgQ29uZmlnOjpDb250cm9sT3JpZ2luYF0uQGNvbnRpbnVlX21pZ3JhdGUMARhsaW1pdHN1BQE8TWlncmF0aW9uTGltaXRzAAE8cmVhbF9zaXplX3VwcGVyEAEMdTMyAAEwd2l0bmVzc190YXNreQUBQE1pZ3JhdGlvblRhc2s8VD4AAVS4Q29udGludWUgdGhlIG1pZ3JhdGlvbiBmb3IgdGhlIGdpdmVuIGBsaW1pdHNgLgDsVGhlIGRpc3BhdGNoIG9yaWdpbiBvZiB0aGlzIGNhbGwgY2FuIGJlIGFueSBzaWduZWQgYWNjb3VudC4AXQFUaGlzIHRyYW5zYWN0aW9uIGhhcyBOTyBNT05FVEFSWSBJTkNFTlRJVkVTLiBjYWxsaW5nIGl0IHdpbGwgbm90IHJld2FyZCBhbnlvbmUuIEFsYmVpdCzsVXBvbiBzdWNjZXNzZnVsIGV4ZWN1dGlvbiwgdGhlIHRyYW5zYWN0aW9uIGZlZSBpcyByZXR1cm5lZC4AQQFUaGUgKHBvdGVudGlhbGx5IG92ZXItZXN0aW1hdGVkKSBvZiB0aGUgYnl0ZSBsZW5ndGggb2YgYWxsIHRoZSBkYXRhIHJlYWQgbXVzdCBiZVkBcHJvdmlkZWQgZm9yIHVwLWZyb250IGZlZS1wYXltZW50IGFuZCB3ZWlnaGluZy4gSW4gZXNzZW5jZSwgdGhlIGNhbGxlciBpcyBndWFyYW50ZWVpbmdJAXRoYXQgZXhlY3V0aW5nIHRoZSBjdXJyZW50IGBNaWdyYXRpb25UYXNrYCB3aXRoIHRoZSBnaXZlbiBgbGltaXRzYCB3aWxsIG5vdCBleGNlZWSUYHJlYWxfc2l6ZV91cHBlcmAgYnl0ZXMgb2YgcmVhZCBkYXRhLgBFAVRoZSBgd2l0bmVzc190YXNrYCBpcyBtZXJlbHkgYSBoZWxwZXIgdG8gcHJldmVudCB0aGUgY2FsbGVyIGZyb20gYmVpbmcgc2xhc2hlZCBvcl0BZ2VuZXJhbGx5IHRyaWdnZXIgYSBtaWdyYXRpb24gdGhhdCB0aGV5IGRvIG5vdCBpbnRlbmQuIFRoaXMgcGFyYW1ldGVyIGlzIGp1c3QgYSBtZXNzYWdlPQFmcm9tIGNhbGxlciwgc2F5aW5nIHRoYXQgdGhleSBiZWxpZXZlZCBgd2l0bmVzc190YXNrYCB3YXMgdGhlIGxhc3Qgc3RhdGUgb2YgdGhlWQFtaWdyYXRpb24sIGFuZCB0aGV5IG9ubHkgd2lzaCBmb3IgdGhlaXIgdHJhbnNhY3Rpb24gdG8gZG8gYW55dGhpbmcsIGlmIHRoaXMgYXNzdW1wdGlvbhEBaG9sZHMuIEluIGNhc2UgYHdpdG5lc3NfdGFza2AgZG9lcyBub3QgbWF0Y2gsIHRoZSB0cmFuc2FjdGlvbiBmYWlscy4AOQFCYXNlZCBvbiB0aGUgZG9jdW1lbnRhdGlvbiBvZiBbYE1pZ3JhdGlvblRhc2s6Om1pZ3JhdGVfdW50aWxfZXhoYXVzdGlvbmBdLCB0aGVNAXJlY29tbWVuZGVkIHdheSBvZiBkb2luZyB0aGlzIGlzIHRvIHBhc3MgYSBgbGltaXRgIHRoYXQgb25seSBib3VuZHMgYGNvdW50YCwgYXMgdGhlnGBzaXplYCBsaW1pdCBjYW4gYWx3YXlzIGJlIG92ZXJ3cml0dGVuLkhtaWdyYXRlX2N1c3RvbV90b3AIARBrZXlzhQEBMFZlYzxWZWM8dTg+PgABMHdpdG5lc3Nfc2l6ZRABDHUzMgACEAkBTWlncmF0ZSB0aGUgbGlzdCBvZiB0b3Aga2V5cyBieSBpdGVyYXRpbmcgZWFjaCBvZiB0aGVtIG9uZSBieSBvbmUuAFUBVGhpcyBkb2VzIG5vdCBhZmZlY3QgdGhlIGdsb2JhbCBtaWdyYXRpb24gcHJvY2VzcyB0cmFja2VyIChbYE1pZ3JhdGlvblByb2Nlc3NgXSksIGFuZPxzaG91bGQgb25seSBiZSB1c2VkIGluIGNhc2UgYW55IGtleXMgYXJlIGxlZnRvdmVyIGR1ZSB0byBhIGJ1Zy5QbWlncmF0ZV9jdXN0b21fY2hpbGQMARByb290OAEcVmVjPHU4PgABKGNoaWxkX2tleXOFAQEwVmVjPFZlYzx1OD4+AAEodG90YWxfc2l6ZRABDHUzMgADGBEBTWlncmF0ZSB0aGUgbGlzdCBvZiBjaGlsZCBrZXlzIGJ5IGl0ZXJhdGluZyBlYWNoIG9mIHRoZW0gb25lIGJ5IG9uZS4ADQFBbGwgb2YgdGhlIGdpdmVuIGNoaWxkIGtleXMgbXVzdCBiZSBwcmVzZW50IHVuZGVyIG9uZSBgY2hpbGRfcm9vdGAuAFUBVGhpcyBkb2VzIG5vdCBhZmZlY3QgdGhlIGdsb2JhbCBtaWdyYXRpb24gcHJvY2VzcyB0cmFja2VyIChbYE1pZ3JhdGlvblByb2Nlc3NgXSksIGFuZPxzaG91bGQgb25seSBiZSB1c2VkIGluIGNhc2UgYW55IGtleXMgYXJlIGxlZnRvdmVyIGR1ZSB0byBhIGJ1Zy5Uc2V0X3NpZ25lZF9tYXhfbGltaXRzBAEYbGltaXRzdQUBPE1pZ3JhdGlvbkxpbWl0cwAEBLhTZXQgdGhlIG1heGltdW0gbGltaXQgb2YgdGhlIHNpZ25lZCBtaWdyYXRpb24uSGZvcmNlX3NldF9wcm9ncmVzcwgBMHByb2dyZXNzX3RvcH0FATRQcm9ncmVzc09mPFQ+AAE4cHJvZ3Jlc3NfY2hpbGR9BQE0UHJvZ3Jlc3NPZjxUPgAFJMhGb3JjZWZ1bGx5IHNldCB0aGUgcHJvZ3Jlc3MgdGhlIHJ1bm5pbmcgbWlncmF0aW9uLgBdAVRoaXMgaXMgb25seSB1c2VmdWwgaW4gb25lIGNhc2U6IHRoZSBuZXh0IGtleSB0byBtaWdyYXRlIGlzIHRvbyBiaWcgdG8gYmUgbWlncmF0ZWQgd2l0aFUBYSBzaWduZWQgYWNjb3VudCwgaW4gYSBwYXJhY2hhaW4gY29udGV4dCwgYW5kIHdlIHNpbXBseSB3YW50IHRvIHNraXAgaXQuIEEgcmVhc29uYWJsZWEBZXhhbXBsZSBvZiB0aGlzIHdvdWxkIGJlIGA6Y29kZTpgLCB3aGljaCBpcyBib3RoIHZlcnkgZXhwZW5zaXZlIHRvIG1pZ3JhdGUsIGFuZCBjb21tb25seaR1c2VkLCBzbyBwcm9iYWJseSBpdCBpcyBhbHJlYWR5IG1pZ3JhdGVkLgBdAUluIGNhc2UgeW91IG1lc3MgdGhpbmdzIHVwLCB5b3UgY2FuIGFsc28sIGluIHByaW5jaXBsZSwgdXNlIHRoaXMgdG8gcmVzZXQgdGhlIG1pZ3JhdGlvbiBwcm9jZXNzLgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy5xBQQYT3B0aW9uBARUAXUFAQgQTm9uZQAAABBTb21lBAB1BQAAAQAAdQUMbHBhbGxldF9zdGF0ZV90cmllX21pZ3JhdGlvbhhwYWxsZXQ8TWlncmF0aW9uTGltaXRzAAAIARBzaXplEAEMdTMyAAEQaXRlbRABDHUzMgAAeQUMbHBhbGxldF9zdGF0ZV90cmllX21pZ3JhdGlvbhhwYWxsZXQ0TWlncmF0aW9uVGFzawQEVAAAFAEwcHJvZ3Jlc3NfdG9wfQUBNFByb2dyZXNzT2Y8VD4AAThwcm9ncmVzc19jaGlsZH0FATRQcm9ncmVzc09mPFQ+AAEQc2l6ZRABDHUzMgABJHRvcF9pdGVtcxABDHUzMgABLGNoaWxkX2l0ZW1zEAEMdTMyAAB9BQxscGFsbGV0X3N0YXRlX3RyaWVfbWlncmF0aW9uGHBhbGxldCBQcm9ncmVzcwQkTWF4S2V5TGVuAAEMHFRvU3RhcnQAAAAcTGFzdEtleQQAgQUBZEJvdW5kZWRWZWM8dTgsIE1heEtleUxlbj4AAQAgQ29tcGxldGUAAgAAgQUMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAEIBFMAAAQAOAEYVmVjPFQ+AACFBQwocGFsbGV0X3hjbRhwYWxsZXQQQ2FsbAQEVAABOBBzZW5kCAEQZGVzdEUBAVhCb3g8VmVyc2lvbmVkTG9jYXRpb24+AAEcbWVzc2FnZYkFAVRCb3g8VmVyc2lvbmVkWGNtPCgpPj4AAAA8dGVsZXBvcnRfYXNzZXRzEAEQZGVzdEUBAVhCb3g8VmVyc2lvbmVkTG9jYXRpb24+AAEsYmVuZWZpY2lhcnlFAQFYQm94PFZlcnNpb25lZExvY2F0aW9uPgABGGFzc2V0c4kGAVBCb3g8VmVyc2lvbmVkQXNzZXRzPgABOGZlZV9hc3NldF9pdGVtEAEMdTMyAAFIEQFUZWxlcG9ydCBzb21lIGFzc2V0cyBmcm9tIHRoZSBsb2NhbCBjaGFpbiB0byBzb21lIGRlc3RpbmF0aW9uIGNoYWluLgAdASoqVGhpcyBmdW5jdGlvbiBpcyBkZXByZWNhdGVkOiBVc2UgYGxpbWl0ZWRfdGVsZXBvcnRfYXNzZXRzYCBpbnN0ZWFkLioqAFEBRmVlIHBheW1lbnQgb24gdGhlIGRlc3RpbmF0aW9uIHNpZGUgaXMgbWFkZSBmcm9tIHRoZSBhc3NldCBpbiB0aGUgYGFzc2V0c2AgdmVjdG9yIG9mYQFpbmRleCBgZmVlX2Fzc2V0X2l0ZW1gLiBUaGUgd2VpZ2h0IGxpbWl0IGZvciBmZWVzIGlzIG5vdCBwcm92aWRlZCBhbmQgdGh1cyBpcyB1bmxpbWl0ZWQstHdpdGggYWxsIGZlZXMgdGFrZW4gYXMgbmVlZGVkIGZyb20gdGhlIGFzc2V0LgApAS0gYG9yaWdpbmA6IE11c3QgYmUgY2FwYWJsZSBvZiB3aXRoZHJhd2luZyB0aGUgYGFzc2V0c2AgYW5kIGV4ZWN1dGluZyBYQ00uJQEtIGBkZXN0YDogRGVzdGluYXRpb24gY29udGV4dCBmb3IgdGhlIGFzc2V0cy4gV2lsbCB0eXBpY2FsbHkgYmUgYFtQYXJlbnQsYQEgIFBhcmFjaGFpbiguLildYCB0byBzZW5kIGZyb20gcGFyYWNoYWluIHRvIHBhcmFjaGFpbiwgb3IgYFtQYXJhY2hhaW4oLi4pXWAgdG8gc2VuZCBmcm9tVCAgcmVsYXkgdG8gcGFyYWNoYWluLlUBLSBgYmVuZWZpY2lhcnlgOiBBIGJlbmVmaWNpYXJ5IGxvY2F0aW9uIGZvciB0aGUgYXNzZXRzIGluIHRoZSBjb250ZXh0IG9mIGBkZXN0YC4gV2lsbJggIGdlbmVyYWxseSBiZSBhbiBgQWNjb3VudElkMzJgIHZhbHVlLlkBLSBgYXNzZXRzYDogVGhlIGFzc2V0cyB0byBiZSB3aXRoZHJhd24uIFRoaXMgc2hvdWxkIGluY2x1ZGUgdGhlIGFzc2V0cyB1c2VkIHRvIHBheSB0aGVoICBmZWUgb24gdGhlIGBkZXN0YCBjaGFpbi5NAS0gYGZlZV9hc3NldF9pdGVtYDogVGhlIGluZGV4IGludG8gYGFzc2V0c2Agb2YgdGhlIGl0ZW0gd2hpY2ggc2hvdWxkIGJlIHVzZWQgdG8gcGF5HCAgZmVlcy5ccmVzZXJ2ZV90cmFuc2Zlcl9hc3NldHMQARBkZXN0RQEBWEJveDxWZXJzaW9uZWRMb2NhdGlvbj4AASxiZW5lZmljaWFyeUUBAVhCb3g8VmVyc2lvbmVkTG9jYXRpb24+AAEYYXNzZXRziQYBUEJveDxWZXJzaW9uZWRBc3NldHM+AAE4ZmVlX2Fzc2V0X2l0ZW0QAQx1MzIAAnhdAVRyYW5zZmVyIHNvbWUgYXNzZXRzIGZyb20gdGhlIGxvY2FsIGNoYWluIHRvIHRoZSBkZXN0aW5hdGlvbiBjaGFpbiB0aHJvdWdoIHRoZWlyIGxvY2FsLHhkZXN0aW5hdGlvbiBvciByZW1vdGUgcmVzZXJ2ZS4APQFgYXNzZXRzYCBtdXN0IGhhdmUgc2FtZSByZXNlcnZlIGxvY2F0aW9uIGFuZCBtYXkgbm90IGJlIHRlbGVwb3J0YWJsZSB0byBgZGVzdGAuTQEgLSBgYXNzZXRzYCBoYXZlIGxvY2FsIHJlc2VydmU6IHRyYW5zZmVyIGFzc2V0cyB0byBzb3ZlcmVpZ24gYWNjb3VudCBvZiBkZXN0aW5hdGlvbk0BICAgY2hhaW4gYW5kIGZvcndhcmQgYSBub3RpZmljYXRpb24gWENNIHRvIGBkZXN0YCB0byBtaW50IGFuZCBkZXBvc2l0IHJlc2VydmUtYmFzZWRsICAgYXNzZXRzIHRvIGBiZW5lZmljaWFyeWAuVQEgLSBgYXNzZXRzYCBoYXZlIGRlc3RpbmF0aW9uIHJlc2VydmU6IGJ1cm4gbG9jYWwgYXNzZXRzIGFuZCBmb3J3YXJkIGEgbm90aWZpY2F0aW9uIHRvWQEgICBgZGVzdGAgY2hhaW4gdG8gd2l0aGRyYXcgdGhlIHJlc2VydmUgYXNzZXRzIGZyb20gdGhpcyBjaGFpbidzIHNvdmVyZWlnbiBhY2NvdW50IGFuZIQgICBkZXBvc2l0IHRoZW0gdG8gYGJlbmVmaWNpYXJ5YC5hASAtIGBhc3NldHNgIGhhdmUgcmVtb3RlIHJlc2VydmU6IGJ1cm4gbG9jYWwgYXNzZXRzLCBmb3J3YXJkIFhDTSB0byByZXNlcnZlIGNoYWluIHRvIG1vdmVhASAgIHJlc2VydmVzIGZyb20gdGhpcyBjaGFpbidzIFNBIHRvIGBkZXN0YCBjaGFpbidzIFNBLCBhbmQgZm9yd2FyZCBhbm90aGVyIFhDTSB0byBgZGVzdGD0ICAgdG8gbWludCBhbmQgZGVwb3NpdCByZXNlcnZlLWJhc2VkIGFzc2V0cyB0byBgYmVuZWZpY2lhcnlgLgA9ASoqVGhpcyBmdW5jdGlvbiBpcyBkZXByZWNhdGVkOiBVc2UgYGxpbWl0ZWRfcmVzZXJ2ZV90cmFuc2Zlcl9hc3NldHNgIGluc3RlYWQuKioAUQFGZWUgcGF5bWVudCBvbiB0aGUgZGVzdGluYXRpb24gc2lkZSBpcyBtYWRlIGZyb20gdGhlIGFzc2V0IGluIHRoZSBgYXNzZXRzYCB2ZWN0b3Igb2ZhAWluZGV4IGBmZWVfYXNzZXRfaXRlbWAuIFRoZSB3ZWlnaHQgbGltaXQgZm9yIGZlZXMgaXMgbm90IHByb3ZpZGVkIGFuZCB0aHVzIGlzIHVubGltaXRlZCy0d2l0aCBhbGwgZmVlcyB0YWtlbiBhcyBuZWVkZWQgZnJvbSB0aGUgYXNzZXQuACkBLSBgb3JpZ2luYDogTXVzdCBiZSBjYXBhYmxlIG9mIHdpdGhkcmF3aW5nIHRoZSBgYXNzZXRzYCBhbmQgZXhlY3V0aW5nIFhDTS4lAS0gYGRlc3RgOiBEZXN0aW5hdGlvbiBjb250ZXh0IGZvciB0aGUgYXNzZXRzLiBXaWxsIHR5cGljYWxseSBiZSBgW1BhcmVudCxhASAgUGFyYWNoYWluKC4uKV1gIHRvIHNlbmQgZnJvbSBwYXJhY2hhaW4gdG8gcGFyYWNoYWluLCBvciBgW1BhcmFjaGFpbiguLildYCB0byBzZW5kIGZyb21UICByZWxheSB0byBwYXJhY2hhaW4uVQEtIGBiZW5lZmljaWFyeWA6IEEgYmVuZWZpY2lhcnkgbG9jYXRpb24gZm9yIHRoZSBhc3NldHMgaW4gdGhlIGNvbnRleHQgb2YgYGRlc3RgLiBXaWxsmCAgZ2VuZXJhbGx5IGJlIGFuIGBBY2NvdW50SWQzMmAgdmFsdWUuWQEtIGBhc3NldHNgOiBUaGUgYXNzZXRzIHRvIGJlIHdpdGhkcmF3bi4gVGhpcyBzaG91bGQgaW5jbHVkZSB0aGUgYXNzZXRzIHVzZWQgdG8gcGF5IHRoZcggIGZlZSBvbiB0aGUgYGRlc3RgIChhbmQgcG9zc2libHkgcmVzZXJ2ZSkgY2hhaW5zLk0BLSBgZmVlX2Fzc2V0X2l0ZW1gOiBUaGUgaW5kZXggaW50byBgYXNzZXRzYCBvZiB0aGUgaXRlbSB3aGljaCBzaG91bGQgYmUgdXNlZCB0byBwYXkcICBmZWVzLhxleGVjdXRlCAEcbWVzc2FnZY0GAbRCb3g8VmVyc2lvbmVkWGNtPDxUIGFzIENvbmZpZz46OlJ1bnRpbWVDYWxsPj4AAShtYXhfd2VpZ2h0KAEYV2VpZ2h0AAMg0EV4ZWN1dGUgYW4gWENNIG1lc3NhZ2UgZnJvbSBhIGxvY2FsLCBzaWduZWQsIG9yaWdpbi4ATQFBbiBldmVudCBpcyBkZXBvc2l0ZWQgaW5kaWNhdGluZyB3aGV0aGVyIGBtc2dgIGNvdWxkIGJlIGV4ZWN1dGVkIGNvbXBsZXRlbHkgb3Igb25seShwYXJ0aWFsbHkuAF0BTm8gbW9yZSB0aGFuIGBtYXhfd2VpZ2h0YCB3aWxsIGJlIHVzZWQgaW4gaXRzIGF0dGVtcHRlZCBleGVjdXRpb24uIElmIHRoaXMgaXMgbGVzcyB0aGFuQQF0aGUgbWF4aW11bSBhbW91bnQgb2Ygd2VpZ2h0IHRoYXQgdGhlIG1lc3NhZ2UgY291bGQgdGFrZSB0byBiZSBleGVjdXRlZCwgdGhlbiBub3xleGVjdXRpb24gYXR0ZW1wdCB3aWxsIGJlIG1hZGUuRGZvcmNlX3hjbV92ZXJzaW9uCAEgbG9jYXRpb24NAQE0Qm94PExvY2F0aW9uPgABHHZlcnNpb24QAShYY21WZXJzaW9uAAQYSQFFeHRvbGwgdGhhdCBhIHBhcnRpY3VsYXIgZGVzdGluYXRpb24gY2FuIGJlIGNvbW11bmljYXRlZCB3aXRoIHRocm91Z2ggYSBwYXJ0aWN1bGFyPHZlcnNpb24gb2YgWENNLgDcLSBgb3JpZ2luYDogTXVzdCBiZSBhbiBvcmlnaW4gc3BlY2lmaWVkIGJ5IEFkbWluT3JpZ2luLtgtIGBsb2NhdGlvbmA6IFRoZSBkZXN0aW5hdGlvbiB0aGF0IGlzIGJlaW5nIGRlc2NyaWJlZC4RAS0gYHhjbV92ZXJzaW9uYDogVGhlIGxhdGVzdCB2ZXJzaW9uIG9mIFhDTSB0aGF0IGBsb2NhdGlvbmAgc3VwcG9ydHMuZGZvcmNlX2RlZmF1bHRfeGNtX3ZlcnNpb24EAURtYXliZV94Y21fdmVyc2lvbmECAUhPcHRpb248WGNtVmVyc2lvbj4ABRRZAVNldCBhIHNhZmUgWENNIHZlcnNpb24gKHRoZSB2ZXJzaW9uIHRoYXQgWENNIHNob3VsZCBiZSBlbmNvZGVkIHdpdGggaWYgdGhlIG1vc3QgcmVjZW50tHZlcnNpb24gYSBkZXN0aW5hdGlvbiBjYW4gYWNjZXB0IGlzIHVua25vd24pLgDcLSBgb3JpZ2luYDogTXVzdCBiZSBhbiBvcmlnaW4gc3BlY2lmaWVkIGJ5IEFkbWluT3JpZ2luLjkBLSBgbWF5YmVfeGNtX3ZlcnNpb25gOiBUaGUgZGVmYXVsdCBYQ00gZW5jb2RpbmcgdmVyc2lvbiwgb3IgYE5vbmVgIHRvIGRpc2FibGUueGZvcmNlX3N1YnNjcmliZV92ZXJzaW9uX25vdGlmeQQBIGxvY2F0aW9uRQEBWEJveDxWZXJzaW9uZWRMb2NhdGlvbj4ABhA5AUFzayBhIGxvY2F0aW9uIHRvIG5vdGlmeSB1cyByZWdhcmRpbmcgdGhlaXIgWENNIHZlcnNpb24gYW5kIGFueSBjaGFuZ2VzIHRvIGl0LgDcLSBgb3JpZ2luYDogTXVzdCBiZSBhbiBvcmlnaW4gc3BlY2lmaWVkIGJ5IEFkbWluT3JpZ2luLlkBLSBgbG9jYXRpb25gOiBUaGUgbG9jYXRpb24gdG8gd2hpY2ggd2Ugc2hvdWxkIHN1YnNjcmliZSBmb3IgWENNIHZlcnNpb24gbm90aWZpY2F0aW9ucy6AZm9yY2VfdW5zdWJzY3JpYmVfdmVyc2lvbl9ub3RpZnkEASBsb2NhdGlvbkUBAVhCb3g8VmVyc2lvbmVkTG9jYXRpb24+AAcYSQFSZXF1aXJlIHRoYXQgYSBwYXJ0aWN1bGFyIGRlc3RpbmF0aW9uIHNob3VsZCBubyBsb25nZXIgbm90aWZ5IHVzIHJlZ2FyZGluZyBhbnkgWENNQHZlcnNpb24gY2hhbmdlcy4A3C0gYG9yaWdpbmA6IE11c3QgYmUgYW4gb3JpZ2luIHNwZWNpZmllZCBieSBBZG1pbk9yaWdpbi49AS0gYGxvY2F0aW9uYDogVGhlIGxvY2F0aW9uIHRvIHdoaWNoIHdlIGFyZSBjdXJyZW50bHkgc3Vic2NyaWJlZCBmb3IgWENNIHZlcnNpb26oICBub3RpZmljYXRpb25zIHdoaWNoIHdlIG5vIGxvbmdlciBkZXNpcmUufGxpbWl0ZWRfcmVzZXJ2ZV90cmFuc2Zlcl9hc3NldHMUARBkZXN0RQEBWEJveDxWZXJzaW9uZWRMb2NhdGlvbj4AASxiZW5lZmljaWFyeUUBAVhCb3g8VmVyc2lvbmVkTG9jYXRpb24+AAEYYXNzZXRziQYBUEJveDxWZXJzaW9uZWRBc3NldHM+AAE4ZmVlX2Fzc2V0X2l0ZW0QAQx1MzIAATB3ZWlnaHRfbGltaXQ9BgEsV2VpZ2h0TGltaXQACHhdAVRyYW5zZmVyIHNvbWUgYXNzZXRzIGZyb20gdGhlIGxvY2FsIGNoYWluIHRvIHRoZSBkZXN0aW5hdGlvbiBjaGFpbiB0aHJvdWdoIHRoZWlyIGxvY2FsLHhkZXN0aW5hdGlvbiBvciByZW1vdGUgcmVzZXJ2ZS4APQFgYXNzZXRzYCBtdXN0IGhhdmUgc2FtZSByZXNlcnZlIGxvY2F0aW9uIGFuZCBtYXkgbm90IGJlIHRlbGVwb3J0YWJsZSB0byBgZGVzdGAuTQEgLSBgYXNzZXRzYCBoYXZlIGxvY2FsIHJlc2VydmU6IHRyYW5zZmVyIGFzc2V0cyB0byBzb3ZlcmVpZ24gYWNjb3VudCBvZiBkZXN0aW5hdGlvbk0BICAgY2hhaW4gYW5kIGZvcndhcmQgYSBub3RpZmljYXRpb24gWENNIHRvIGBkZXN0YCB0byBtaW50IGFuZCBkZXBvc2l0IHJlc2VydmUtYmFzZWRsICAgYXNzZXRzIHRvIGBiZW5lZmljaWFyeWAuVQEgLSBgYXNzZXRzYCBoYXZlIGRlc3RpbmF0aW9uIHJlc2VydmU6IGJ1cm4gbG9jYWwgYXNzZXRzIGFuZCBmb3J3YXJkIGEgbm90aWZpY2F0aW9uIHRvWQEgICBgZGVzdGAgY2hhaW4gdG8gd2l0aGRyYXcgdGhlIHJlc2VydmUgYXNzZXRzIGZyb20gdGhpcyBjaGFpbidzIHNvdmVyZWlnbiBhY2NvdW50IGFuZIQgICBkZXBvc2l0IHRoZW0gdG8gYGJlbmVmaWNpYXJ5YC5hASAtIGBhc3NldHNgIGhhdmUgcmVtb3RlIHJlc2VydmU6IGJ1cm4gbG9jYWwgYXNzZXRzLCBmb3J3YXJkIFhDTSB0byByZXNlcnZlIGNoYWluIHRvIG1vdmVhASAgIHJlc2VydmVzIGZyb20gdGhpcyBjaGFpbidzIFNBIHRvIGBkZXN0YCBjaGFpbidzIFNBLCBhbmQgZm9yd2FyZCBhbm90aGVyIFhDTSB0byBgZGVzdGD0ICAgdG8gbWludCBhbmQgZGVwb3NpdCByZXNlcnZlLWJhc2VkIGFzc2V0cyB0byBgYmVuZWZpY2lhcnlgLgBRAUZlZSBwYXltZW50IG9uIHRoZSBkZXN0aW5hdGlvbiBzaWRlIGlzIG1hZGUgZnJvbSB0aGUgYXNzZXQgaW4gdGhlIGBhc3NldHNgIHZlY3RvciBvZmEBaW5kZXggYGZlZV9hc3NldF9pdGVtYCwgdXAgdG8gZW5vdWdoIHRvIHBheSBmb3IgYHdlaWdodF9saW1pdGAgb2Ygd2VpZ2h0LiBJZiBtb3JlIHdlaWdodFkBaXMgbmVlZGVkIHRoYW4gYHdlaWdodF9saW1pdGAsIHRoZW4gdGhlIG9wZXJhdGlvbiB3aWxsIGZhaWwgYW5kIHRoZSBzZW50IGFzc2V0cyBtYXkgYmUgYXQgcmlzay4AKQEtIGBvcmlnaW5gOiBNdXN0IGJlIGNhcGFibGUgb2Ygd2l0aGRyYXdpbmcgdGhlIGBhc3NldHNgIGFuZCBleGVjdXRpbmcgWENNLiUBLSBgZGVzdGA6IERlc3RpbmF0aW9uIGNvbnRleHQgZm9yIHRoZSBhc3NldHMuIFdpbGwgdHlwaWNhbGx5IGJlIGBbUGFyZW50LGEBICBQYXJhY2hhaW4oLi4pXWAgdG8gc2VuZCBmcm9tIHBhcmFjaGFpbiB0byBwYXJhY2hhaW4sIG9yIGBbUGFyYWNoYWluKC4uKV1gIHRvIHNlbmQgZnJvbVQgIHJlbGF5IHRvIHBhcmFjaGFpbi5VAS0gYGJlbmVmaWNpYXJ5YDogQSBiZW5lZmljaWFyeSBsb2NhdGlvbiBmb3IgdGhlIGFzc2V0cyBpbiB0aGUgY29udGV4dCBvZiBgZGVzdGAuIFdpbGyYICBnZW5lcmFsbHkgYmUgYW4gYEFjY291bnRJZDMyYCB2YWx1ZS5ZAS0gYGFzc2V0c2A6IFRoZSBhc3NldHMgdG8gYmUgd2l0aGRyYXduLiBUaGlzIHNob3VsZCBpbmNsdWRlIHRoZSBhc3NldHMgdXNlZCB0byBwYXkgdGhlyCAgZmVlIG9uIHRoZSBgZGVzdGAgKGFuZCBwb3NzaWJseSByZXNlcnZlKSBjaGFpbnMuTQEtIGBmZWVfYXNzZXRfaXRlbWA6IFRoZSBpbmRleCBpbnRvIGBhc3NldHNgIG9mIHRoZSBpdGVtIHdoaWNoIHNob3VsZCBiZSB1c2VkIHRvIHBheRwgIGZlZXMuRQEtIGB3ZWlnaHRfbGltaXRgOiBUaGUgcmVtb3RlLXNpZGUgd2VpZ2h0IGxpbWl0LCBpZiBhbnksIGZvciB0aGUgWENNIGZlZSBwdXJjaGFzZS5cbGltaXRlZF90ZWxlcG9ydF9hc3NldHMUARBkZXN0RQEBWEJveDxWZXJzaW9uZWRMb2NhdGlvbj4AASxiZW5lZmljaWFyeUUBAVhCb3g8VmVyc2lvbmVkTG9jYXRpb24+AAEYYXNzZXRziQYBUEJveDxWZXJzaW9uZWRBc3NldHM+AAE4ZmVlX2Fzc2V0X2l0ZW0QAQx1MzIAATB3ZWlnaHRfbGltaXQ9BgEsV2VpZ2h0TGltaXQACUgRAVRlbGVwb3J0IHNvbWUgYXNzZXRzIGZyb20gdGhlIGxvY2FsIGNoYWluIHRvIHNvbWUgZGVzdGluYXRpb24gY2hhaW4uAFEBRmVlIHBheW1lbnQgb24gdGhlIGRlc3RpbmF0aW9uIHNpZGUgaXMgbWFkZSBmcm9tIHRoZSBhc3NldCBpbiB0aGUgYGFzc2V0c2AgdmVjdG9yIG9mYQFpbmRleCBgZmVlX2Fzc2V0X2l0ZW1gLCB1cCB0byBlbm91Z2ggdG8gcGF5IGZvciBgd2VpZ2h0X2xpbWl0YCBvZiB3ZWlnaHQuIElmIG1vcmUgd2VpZ2h0WQFpcyBuZWVkZWQgdGhhbiBgd2VpZ2h0X2xpbWl0YCwgdGhlbiB0aGUgb3BlcmF0aW9uIHdpbGwgZmFpbCBhbmQgdGhlIHNlbnQgYXNzZXRzIG1heSBiZSBhdCByaXNrLgApAS0gYG9yaWdpbmA6IE11c3QgYmUgY2FwYWJsZSBvZiB3aXRoZHJhd2luZyB0aGUgYGFzc2V0c2AgYW5kIGV4ZWN1dGluZyBYQ00uJQEtIGBkZXN0YDogRGVzdGluYXRpb24gY29udGV4dCBmb3IgdGhlIGFzc2V0cy4gV2lsbCB0eXBpY2FsbHkgYmUgYFtQYXJlbnQsYQEgIFBhcmFjaGFpbiguLildYCB0byBzZW5kIGZyb20gcGFyYWNoYWluIHRvIHBhcmFjaGFpbiwgb3IgYFtQYXJhY2hhaW4oLi4pXWAgdG8gc2VuZCBmcm9tVCAgcmVsYXkgdG8gcGFyYWNoYWluLlUBLSBgYmVuZWZpY2lhcnlgOiBBIGJlbmVmaWNpYXJ5IGxvY2F0aW9uIGZvciB0aGUgYXNzZXRzIGluIHRoZSBjb250ZXh0IG9mIGBkZXN0YC4gV2lsbJggIGdlbmVyYWxseSBiZSBhbiBgQWNjb3VudElkMzJgIHZhbHVlLlkBLSBgYXNzZXRzYDogVGhlIGFzc2V0cyB0byBiZSB3aXRoZHJhd24uIFRoaXMgc2hvdWxkIGluY2x1ZGUgdGhlIGFzc2V0cyB1c2VkIHRvIHBheSB0aGVoICBmZWUgb24gdGhlIGBkZXN0YCBjaGFpbi5NAS0gYGZlZV9hc3NldF9pdGVtYDogVGhlIGluZGV4IGludG8gYGFzc2V0c2Agb2YgdGhlIGl0ZW0gd2hpY2ggc2hvdWxkIGJlIHVzZWQgdG8gcGF5HCAgZmVlcy5FAS0gYHdlaWdodF9saW1pdGA6IFRoZSByZW1vdGUtc2lkZSB3ZWlnaHQgbGltaXQsIGlmIGFueSwgZm9yIHRoZSBYQ00gZmVlIHB1cmNoYXNlLkBmb3JjZV9zdXNwZW5zaW9uBAEkc3VzcGVuZGVkIAEQYm9vbAAKEPRTZXQgb3IgdW5zZXQgdGhlIGdsb2JhbCBzdXNwZW5zaW9uIHN0YXRlIG9mIHRoZSBYQ00gZXhlY3V0b3IuANwtIGBvcmlnaW5gOiBNdXN0IGJlIGFuIG9yaWdpbiBzcGVjaWZpZWQgYnkgQWRtaW5PcmlnaW4u0C0gYHN1c3BlbmRlZGA6IGB0cnVlYCB0byBzdXNwZW5kLCBgZmFsc2VgIHRvIHJlc3VtZS48dHJhbnNmZXJfYXNzZXRzFAEQZGVzdEUBAVhCb3g8VmVyc2lvbmVkTG9jYXRpb24+AAEsYmVuZWZpY2lhcnlFAQFYQm94PFZlcnNpb25lZExvY2F0aW9uPgABGGFzc2V0c4kGAVBCb3g8VmVyc2lvbmVkQXNzZXRzPgABOGZlZV9hc3NldF9pdGVtEAEMdTMyAAEwd2VpZ2h0X2xpbWl0PQYBLFdlaWdodExpbWl0AAuEXQFUcmFuc2ZlciBzb21lIGFzc2V0cyBmcm9tIHRoZSBsb2NhbCBjaGFpbiB0byB0aGUgZGVzdGluYXRpb24gY2hhaW4gdGhyb3VnaCB0aGVpciBsb2NhbCzQZGVzdGluYXRpb24gb3IgcmVtb3RlIHJlc2VydmUsIG9yIHRocm91Z2ggdGVsZXBvcnRzLgBRAUZlZSBwYXltZW50IG9uIHRoZSBkZXN0aW5hdGlvbiBzaWRlIGlzIG1hZGUgZnJvbSB0aGUgYXNzZXQgaW4gdGhlIGBhc3NldHNgIHZlY3RvciBvZjUBaW5kZXggYGZlZV9hc3NldF9pdGVtYCAoaGVuY2UgcmVmZXJyZWQgdG8gYXMgYGZlZXNgKSwgdXAgdG8gZW5vdWdoIHRvIHBheSBmb3JBAWB3ZWlnaHRfbGltaXRgIG9mIHdlaWdodC4gSWYgbW9yZSB3ZWlnaHQgaXMgbmVlZGVkIHRoYW4gYHdlaWdodF9saW1pdGAsIHRoZW4gdGhl3G9wZXJhdGlvbiB3aWxsIGZhaWwgYW5kIHRoZSBzZW50IGFzc2V0cyBtYXkgYmUgYXQgcmlzay4AYQFgYXNzZXRzYCAoZXhjbHVkaW5nIGBmZWVzYCkgbXVzdCBoYXZlIHNhbWUgcmVzZXJ2ZSBsb2NhdGlvbiBvciBvdGhlcndpc2UgYmUgdGVsZXBvcnRhYmxlsHRvIGBkZXN0YCwgbm8gbGltaXRhdGlvbnMgaW1wb3NlZCBvbiBgZmVlc2AuTQEgLSBmb3IgbG9jYWwgcmVzZXJ2ZTogdHJhbnNmZXIgYXNzZXRzIHRvIHNvdmVyZWlnbiBhY2NvdW50IG9mIGRlc3RpbmF0aW9uIGNoYWluIGFuZE0BICAgZm9yd2FyZCBhIG5vdGlmaWNhdGlvbiBYQ00gdG8gYGRlc3RgIHRvIG1pbnQgYW5kIGRlcG9zaXQgcmVzZXJ2ZS1iYXNlZCBhc3NldHMgdG9EICAgYGJlbmVmaWNpYXJ5YC5hASAtIGZvciBkZXN0aW5hdGlvbiByZXNlcnZlOiBidXJuIGxvY2FsIGFzc2V0cyBhbmQgZm9yd2FyZCBhIG5vdGlmaWNhdGlvbiB0byBgZGVzdGAgY2hhaW5ZASAgIHRvIHdpdGhkcmF3IHRoZSByZXNlcnZlIGFzc2V0cyBmcm9tIHRoaXMgY2hhaW4ncyBzb3ZlcmVpZ24gYWNjb3VudCBhbmQgZGVwb3NpdCB0aGVtUCAgIHRvIGBiZW5lZmljaWFyeWAuXQEgLSBmb3IgcmVtb3RlIHJlc2VydmU6IGJ1cm4gbG9jYWwgYXNzZXRzLCBmb3J3YXJkIFhDTSB0byByZXNlcnZlIGNoYWluIHRvIG1vdmUgcmVzZXJ2ZXNdASAgIGZyb20gdGhpcyBjaGFpbidzIFNBIHRvIGBkZXN0YCBjaGFpbidzIFNBLCBhbmQgZm9yd2FyZCBhbm90aGVyIFhDTSB0byBgZGVzdGAgdG8gbWludNQgICBhbmQgZGVwb3NpdCByZXNlcnZlLWJhc2VkIGFzc2V0cyB0byBgYmVuZWZpY2lhcnlgLlEBIC0gZm9yIHRlbGVwb3J0czogYnVybiBsb2NhbCBhc3NldHMgYW5kIGZvcndhcmQgWENNIHRvIGBkZXN0YCBjaGFpbiB0byBtaW50L3RlbGVwb3J0sCAgIGFzc2V0cyBhbmQgZGVwb3NpdCB0aGVtIHRvIGBiZW5lZmljaWFyeWAuACkBLSBgb3JpZ2luYDogTXVzdCBiZSBjYXBhYmxlIG9mIHdpdGhkcmF3aW5nIHRoZSBgYXNzZXRzYCBhbmQgZXhlY3V0aW5nIFhDTS4tAS0gYGRlc3RgOiBEZXN0aW5hdGlvbiBjb250ZXh0IGZvciB0aGUgYXNzZXRzLiBXaWxsIHR5cGljYWxseSBiZSBgWDIoUGFyZW50LFUBICBQYXJhY2hhaW4oLi4pKWAgdG8gc2VuZCBmcm9tIHBhcmFjaGFpbiB0byBwYXJhY2hhaW4sIG9yIGBYMShQYXJhY2hhaW4oLi4pKWAgdG8gc2VuZGggIGZyb20gcmVsYXkgdG8gcGFyYWNoYWluLlUBLSBgYmVuZWZpY2lhcnlgOiBBIGJlbmVmaWNpYXJ5IGxvY2F0aW9uIGZvciB0aGUgYXNzZXRzIGluIHRoZSBjb250ZXh0IG9mIGBkZXN0YC4gV2lsbJggIGdlbmVyYWxseSBiZSBhbiBgQWNjb3VudElkMzJgIHZhbHVlLlkBLSBgYXNzZXRzYDogVGhlIGFzc2V0cyB0byBiZSB3aXRoZHJhd24uIFRoaXMgc2hvdWxkIGluY2x1ZGUgdGhlIGFzc2V0cyB1c2VkIHRvIHBheSB0aGXIICBmZWUgb24gdGhlIGBkZXN0YCAoYW5kIHBvc3NpYmx5IHJlc2VydmUpIGNoYWlucy5NAS0gYGZlZV9hc3NldF9pdGVtYDogVGhlIGluZGV4IGludG8gYGFzc2V0c2Agb2YgdGhlIGl0ZW0gd2hpY2ggc2hvdWxkIGJlIHVzZWQgdG8gcGF5HCAgZmVlcy5FAS0gYHdlaWdodF9saW1pdGA6IFRoZSByZW1vdGUtc2lkZSB3ZWlnaHQgbGltaXQsIGlmIGFueSwgZm9yIHRoZSBYQ00gZmVlIHB1cmNoYXNlLjBjbGFpbV9hc3NldHMIARhhc3NldHOJBgFQQm94PFZlcnNpb25lZEFzc2V0cz4AASxiZW5lZmljaWFyeUUBAVhCb3g8VmVyc2lvbmVkTG9jYXRpb24+AAwYVQFDbGFpbXMgYXNzZXRzIHRyYXBwZWQgb24gdGhpcyBwYWxsZXQgYmVjYXVzZSBvZiBsZWZ0b3ZlciBhc3NldHMgZHVyaW5nIFhDTSBleGVjdXRpb24uAKwtIGBvcmlnaW5gOiBBbnlvbmUgY2FuIGNhbGwgdGhpcyBleHRyaW5zaWMuXQEtIGBhc3NldHNgOiBUaGUgZXhhY3QgYXNzZXRzIHRoYXQgd2VyZSB0cmFwcGVkLiBVc2UgdGhlIHZlcnNpb24gdG8gc3BlY2lmeSB3aGF0IHZlcnNpb26Yd2FzIHRoZSBsYXRlc3Qgd2hlbiB0aGV5IHdlcmUgdHJhcHBlZC5FAS0gYGJlbmVmaWNpYXJ5YDogVGhlIGxvY2F0aW9uL2FjY291bnQgd2hlcmUgdGhlIGNsYWltZWQgYXNzZXRzIHdpbGwgYmUgZGVwb3NpdGVkLox0cmFuc2Zlcl9hc3NldHNfdXNpbmdfdHlwZV9hbmRfdGhlbhwBEGRlc3RFAQFYQm94PFZlcnNpb25lZExvY2F0aW9uPgABGGFzc2V0c4kGAVBCb3g8VmVyc2lvbmVkQXNzZXRzPgABUGFzc2V0c190cmFuc2Zlcl90eXBluQYBREJveDxUcmFuc2ZlclR5cGU+AAE4cmVtb3RlX2ZlZXNfaWS9BgFUQm94PFZlcnNpb25lZEFzc2V0SWQ+AAFIZmVlc190cmFuc2Zlcl90eXBluQYBREJveDxUcmFuc2ZlclR5cGU+AAFIY3VzdG9tX3hjbV9vbl9kZXN0iQUBVEJveDxWZXJzaW9uZWRYY208KCk+PgABMHdlaWdodF9saW1pdD0GASxXZWlnaHRMaW1pdAANwFUBVHJhbnNmZXIgYXNzZXRzIGZyb20gdGhlIGxvY2FsIGNoYWluIHRvIHRoZSBkZXN0aW5hdGlvbiBjaGFpbiB1c2luZyBleHBsaWNpdCB0cmFuc2Zlcmh0eXBlcyBmb3IgYXNzZXRzIGFuZCBmZWVzLgBZAWBhc3NldHNgIG11c3QgaGF2ZSBzYW1lIHJlc2VydmUgbG9jYXRpb24gb3IgbWF5IGJlIHRlbGVwb3J0YWJsZSB0byBgZGVzdGAuIENhbGxlciBtdXN07HByb3ZpZGUgdGhlIGBhc3NldHNfdHJhbnNmZXJfdHlwZWAgdG8gYmUgdXNlZCBmb3IgYGFzc2V0c2A6UQEgLSBgVHJhbnNmZXJUeXBlOjpMb2NhbFJlc2VydmVgOiB0cmFuc2ZlciBhc3NldHMgdG8gc292ZXJlaWduIGFjY291bnQgb2YgZGVzdGluYXRpb25NASAgIGNoYWluIGFuZCBmb3J3YXJkIGEgbm90aWZpY2F0aW9uIFhDTSB0byBgZGVzdGAgdG8gbWludCBhbmQgZGVwb3NpdCByZXNlcnZlLWJhc2VkbCAgIGFzc2V0cyB0byBgYmVuZWZpY2lhcnlgLlkBIC0gYFRyYW5zZmVyVHlwZTo6RGVzdGluYXRpb25SZXNlcnZlYDogYnVybiBsb2NhbCBhc3NldHMgYW5kIGZvcndhcmQgYSBub3RpZmljYXRpb24gdG9ZASAgIGBkZXN0YCBjaGFpbiB0byB3aXRoZHJhdyB0aGUgcmVzZXJ2ZSBhc3NldHMgZnJvbSB0aGlzIGNoYWluJ3Mgc292ZXJlaWduIGFjY291bnQgYW5khCAgIGRlcG9zaXQgdGhlbSB0byBgYmVuZWZpY2lhcnlgLlkBIC0gYFRyYW5zZmVyVHlwZTo6UmVtb3RlUmVzZXJ2ZShyZXNlcnZlKWA6IGJ1cm4gbG9jYWwgYXNzZXRzLCBmb3J3YXJkIFhDTSB0byBgcmVzZXJ2ZWBhASAgIGNoYWluIHRvIG1vdmUgcmVzZXJ2ZXMgZnJvbSB0aGlzIGNoYWluJ3MgU0EgdG8gYGRlc3RgIGNoYWluJ3MgU0EsIGFuZCBmb3J3YXJkIGFub3RoZXJVASAgIFhDTSB0byBgZGVzdGAgdG8gbWludCBhbmQgZGVwb3NpdCByZXNlcnZlLWJhc2VkIGFzc2V0cyB0byBgYmVuZWZpY2lhcnlgLiBUeXBpY2FsbHmUICAgdGhlIHJlbW90ZSBgcmVzZXJ2ZWAgaXMgQXNzZXQgSHViLkUBIC0gYFRyYW5zZmVyVHlwZTo6VGVsZXBvcnRgOiBidXJuIGxvY2FsIGFzc2V0cyBhbmQgZm9yd2FyZCBYQ00gdG8gYGRlc3RgIGNoYWluIHRv6CAgIG1pbnQvdGVsZXBvcnQgYXNzZXRzIGFuZCBkZXBvc2l0IHRoZW0gdG8gYGJlbmVmaWNpYXJ5YC4AVQFPbiB0aGUgZGVzdGluYXRpb24gY2hhaW4sIGFzIHdlbGwgYXMgYW55IGludGVybWVkaWFyeSBob3BzLCBgQnV5RXhlY3V0aW9uYCBpcyB1c2VkIHRvIQFidXkgZXhlY3V0aW9uIHVzaW5nIHRyYW5zZmVycmVkIGBhc3NldHNgIGlkZW50aWZpZWQgYnkgYHJlbW90ZV9mZWVzX2lkYC5ZAU1ha2Ugc3VyZSBlbm91Z2ggb2YgdGhlIHNwZWNpZmllZCBgcmVtb3RlX2ZlZXNfaWRgIGFzc2V0IGlzIGluY2x1ZGVkIGluIHRoZSBnaXZlbiBsaXN0YQFvZiBgYXNzZXRzYC4gYHJlbW90ZV9mZWVzX2lkYCBzaG91bGQgYmUgZW5vdWdoIHRvIHBheSBmb3IgYHdlaWdodF9saW1pdGAuIElmIG1vcmUgd2VpZ2h0WQFpcyBuZWVkZWQgdGhhbiBgd2VpZ2h0X2xpbWl0YCwgdGhlbiB0aGUgb3BlcmF0aW9uIHdpbGwgZmFpbCBhbmQgdGhlIHNlbnQgYXNzZXRzIG1heSBiZSBhdCByaXNrLgBFAWByZW1vdGVfZmVlc19pZGAgbWF5IHVzZSBkaWZmZXJlbnQgdHJhbnNmZXIgdHlwZSB0aGFuIHJlc3Qgb2YgYGFzc2V0c2AgYW5kIGNhbiBiZZxzcGVjaWZpZWQgdGhyb3VnaCBgZmVlc190cmFuc2Zlcl90eXBlYC4AYQFUaGUgY2FsbGVyIG5lZWRzIHRvIHNwZWNpZnkgd2hhdCBzaG91bGQgaGFwcGVuIHRvIHRoZSB0cmFuc2ZlcnJlZCBhc3NldHMgb25jZSB0aGV5IHJlYWNoQQF0aGUgYGRlc3RgIGNoYWluLiBUaGlzIGlzIGRvbmUgdGhyb3VnaCB0aGUgYGN1c3RvbV94Y21fb25fZGVzdGAgcGFyYW1ldGVyLCB3aGljaPxjb250YWlucyB0aGUgaW5zdHJ1Y3Rpb25zIHRvIGV4ZWN1dGUgb24gYGRlc3RgIGFzIGEgZmluYWwgc3RlcC58ICBUaGlzIGlzIHVzdWFsbHkgYXMgc2ltcGxlIGFzOlEBICBgWGNtKHZlYyFbRGVwb3NpdEFzc2V0IHsgYXNzZXRzOiBXaWxkKEFsbENvdW50ZWQoYXNzZXRzLmxlbigpKSksIGJlbmVmaWNpYXJ5IH1dKWAsMQEgIGJ1dCBjb3VsZCBiZSBzb21ldGhpbmcgbW9yZSBleG90aWMgbGlrZSBzZW5kaW5nIHRoZSBgYXNzZXRzYCBldmVuIGZ1cnRoZXIuACkBLSBgb3JpZ2luYDogTXVzdCBiZSBjYXBhYmxlIG9mIHdpdGhkcmF3aW5nIHRoZSBgYXNzZXRzYCBhbmQgZXhlY3V0aW5nIFhDTS4lAS0gYGRlc3RgOiBEZXN0aW5hdGlvbiBjb250ZXh0IGZvciB0aGUgYXNzZXRzLiBXaWxsIHR5cGljYWxseSBiZSBgW1BhcmVudCxhASAgUGFyYWNoYWluKC4uKV1gIHRvIHNlbmQgZnJvbSBwYXJhY2hhaW4gdG8gcGFyYWNoYWluLCBvciBgW1BhcmFjaGFpbiguLildYCB0byBzZW5kIGZyb209ASAgcmVsYXkgdG8gcGFyYWNoYWluLCBvciBgKHBhcmVudHM6IDIsIChHbG9iYWxDb25zZW5zdXMoLi4pLCAuLikpYCB0byBzZW5kIGZyb230ICBwYXJhY2hhaW4gYWNyb3NzIGEgYnJpZGdlIHRvIGFub3RoZXIgZWNvc3lzdGVtIGRlc3RpbmF0aW9uLlkBLSBgYXNzZXRzYDogVGhlIGFzc2V0cyB0byBiZSB3aXRoZHJhd24uIFRoaXMgc2hvdWxkIGluY2x1ZGUgdGhlIGFzc2V0cyB1c2VkIHRvIHBheSB0aGXIICBmZWUgb24gdGhlIGBkZXN0YCAoYW5kIHBvc3NpYmx5IHJlc2VydmUpIGNoYWlucy49AS0gYGFzc2V0c190cmFuc2Zlcl90eXBlYDogVGhlIFhDTSBgVHJhbnNmZXJUeXBlYCB1c2VkIHRvIHRyYW5zZmVyIHRoZSBgYXNzZXRzYC4hAS0gYHJlbW90ZV9mZWVzX2lkYDogT25lIG9mIHRoZSBpbmNsdWRlZCBgYXNzZXRzYCB0byBiZSB1c2VkIHRvIHBheSBmZWVzLkkBLSBgZmVlc190cmFuc2Zlcl90eXBlYDogVGhlIFhDTSBgVHJhbnNmZXJUeXBlYCB1c2VkIHRvIHRyYW5zZmVyIHRoZSBgZmVlc2AgYXNzZXRzLlkBLSBgY3VzdG9tX3hjbV9vbl9kZXN0YDogVGhlIFhDTSB0byBiZSBleGVjdXRlZCBvbiBgZGVzdGAgY2hhaW4gYXMgdGhlIGxhc3Qgc3RlcCBvZiB0aGVZASAgdHJhbnNmZXIsIHdoaWNoIGFsc28gZGV0ZXJtaW5lcyB3aGF0IGhhcHBlbnMgdG8gdGhlIGFzc2V0cyBvbiB0aGUgZGVzdGluYXRpb24gY2hhaW4uRQEtIGB3ZWlnaHRfbGltaXRgOiBUaGUgcmVtb3RlLXNpZGUgd2VpZ2h0IGxpbWl0LCBpZiBhbnksIGZvciB0aGUgWENNIGZlZSBwdXJjaGFzZS4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMuiQUIDHhjbTBWZXJzaW9uZWRYY20ELFJ1bnRpbWVDYWxsAAEMCFYyBACNBQFQdjI6OlhjbTxSdW50aW1lQ2FsbD4AAgAIVjMEAN0FAVB2Mzo6WGNtPFJ1bnRpbWVDYWxsPgADAAhWNAQAQQYBUHY0OjpYY208UnVudGltZUNhbGw+AAQAAI0FDAx4Y20IdjIMWGNtBCxSdW50aW1lQ2FsbAAABACRBQF0VmVjPEluc3RydWN0aW9uPFJ1bnRpbWVDYWxsPj4AAJEFAAAClQUAlQUMDHhjbQh2MixJbnN0cnVjdGlvbgQsUnVudGltZUNhbGwAAXA0V2l0aGRyYXdBc3NldAQAmQUBLE11bHRpQXNzZXRzAAAAVFJlc2VydmVBc3NldERlcG9zaXRlZAQAmQUBLE11bHRpQXNzZXRzAAEAWFJlY2VpdmVUZWxlcG9ydGVkQXNzZXQEAJkFASxNdWx0aUFzc2V0cwACADRRdWVyeVJlc3BvbnNlDAEgcXVlcnlfaWQsARxRdWVyeUlkAAEgcmVzcG9uc2W1BQEgUmVzcG9uc2UAAShtYXhfd2VpZ2h0LAEMdTY0AAMANFRyYW5zZmVyQXNzZXQIARhhc3NldHOZBQEsTXVsdGlBc3NldHMAASxiZW5lZmljaWFyeUkBATRNdWx0aUxvY2F0aW9uAAQAUFRyYW5zZmVyUmVzZXJ2ZUFzc2V0DAEYYXNzZXRzmQUBLE11bHRpQXNzZXRzAAEQZGVzdEkBATRNdWx0aUxvY2F0aW9uAAEMeGNtjQUBHFhjbTwoKT4ABQAgVHJhbnNhY3QMASxvcmlnaW5fdHlwZcUFAShPcmlnaW5LaW5kAAFYcmVxdWlyZV93ZWlnaHRfYXRfbW9zdCwBDHU2NAABEGNhbGzJBQFoRG91YmxlRW5jb2RlZDxSdW50aW1lQ2FsbD4ABgBkSHJtcE5ld0NoYW5uZWxPcGVuUmVxdWVzdAwBGHNlbmRlcuwBDHUzMgABQG1heF9tZXNzYWdlX3NpemXsAQx1MzIAATBtYXhfY2FwYWNpdHnsAQx1MzIABwBMSHJtcENoYW5uZWxBY2NlcHRlZAQBJHJlY2lwaWVudOwBDHUzMgAIAEhIcm1wQ2hhbm5lbENsb3NpbmcMASRpbml0aWF0b3LsAQx1MzIAARhzZW5kZXLsAQx1MzIAASRyZWNpcGllbnTsAQx1MzIACQAsQ2xlYXJPcmlnaW4ACgA0RGVzY2VuZE9yaWdpbgQATQEBVEludGVyaW9yTXVsdGlMb2NhdGlvbgALACxSZXBvcnRFcnJvcgwBIHF1ZXJ5X2lkLAEcUXVlcnlJZAABEGRlc3RJAQE0TXVsdGlMb2NhdGlvbgABTG1heF9yZXNwb25zZV93ZWlnaHQsAQx1NjQADAAwRGVwb3NpdEFzc2V0DAEYYXNzZXRzzQUBQE11bHRpQXNzZXRGaWx0ZXIAAShtYXhfYXNzZXRz7AEMdTMyAAEsYmVuZWZpY2lhcnlJAQE0TXVsdGlMb2NhdGlvbgANAExEZXBvc2l0UmVzZXJ2ZUFzc2V0EAEYYXNzZXRzzQUBQE11bHRpQXNzZXRGaWx0ZXIAAShtYXhfYXNzZXRz7AEMdTMyAAEQZGVzdEkBATRNdWx0aUxvY2F0aW9uAAEMeGNtjQUBHFhjbTwoKT4ADgA0RXhjaGFuZ2VBc3NldAgBEGdpdmXNBQFATXVsdGlBc3NldEZpbHRlcgABHHJlY2VpdmWZBQEsTXVsdGlBc3NldHMADwBcSW5pdGlhdGVSZXNlcnZlV2l0aGRyYXcMARhhc3NldHPNBQFATXVsdGlBc3NldEZpbHRlcgABHHJlc2VydmVJAQE0TXVsdGlMb2NhdGlvbgABDHhjbY0FARxYY208KCk+ABAAQEluaXRpYXRlVGVsZXBvcnQMARhhc3NldHPNBQFATXVsdGlBc3NldEZpbHRlcgABEGRlc3RJAQE0TXVsdGlMb2NhdGlvbgABDHhjbY0FARxYY208KCk+ABEAMFF1ZXJ5SG9sZGluZxABIHF1ZXJ5X2lkLAEcUXVlcnlJZAABEGRlc3RJAQE0TXVsdGlMb2NhdGlvbgABGGFzc2V0c80FAUBNdWx0aUFzc2V0RmlsdGVyAAFMbWF4X3Jlc3BvbnNlX3dlaWdodCwBDHU2NAASADBCdXlFeGVjdXRpb24IARBmZWVzoQUBKE11bHRpQXNzZXQAATB3ZWlnaHRfbGltaXTZBQEsV2VpZ2h0TGltaXQAEwA0UmVmdW5kU3VycGx1cwAUADxTZXRFcnJvckhhbmRsZXIEAI0FAUBYY208UnVudGltZUNhbGw+ABUALFNldEFwcGVuZGl4BACNBQFAWGNtPFJ1bnRpbWVDYWxsPgAWAChDbGVhckVycm9yABcAKENsYWltQXNzZXQIARhhc3NldHOZBQEsTXVsdGlBc3NldHMAARh0aWNrZXRJAQE0TXVsdGlMb2NhdGlvbgAYABBUcmFwBAAsAQx1NjQAGQBAU3Vic2NyaWJlVmVyc2lvbggBIHF1ZXJ5X2lkLAEcUXVlcnlJZAABTG1heF9yZXNwb25zZV93ZWlnaHQsAQx1NjQAGgBIVW5zdWJzY3JpYmVWZXJzaW9uABsAAJkFEAx4Y20IdjIobXVsdGlhc3NldCxNdWx0aUFzc2V0cwAABACdBQE8VmVjPE11bHRpQXNzZXQ+AACdBQAAAqEFAKEFEAx4Y20IdjIobXVsdGlhc3NldChNdWx0aUFzc2V0AAAIAQhpZKUFARxBc3NldElkAAEMZnVuqQUBLEZ1bmdpYmlsaXR5AAClBRAMeGNtCHYyKG11bHRpYXNzZXQcQXNzZXRJZAABCCBDb25jcmV0ZQQASQEBNE11bHRpTG9jYXRpb24AAAAgQWJzdHJhY3QEADgBHFZlYzx1OD4AAQAAqQUQDHhjbQh2MihtdWx0aWFzc2V0LEZ1bmdpYmlsaXR5AAEIIEZ1bmdpYmxlBAD8ARB1MTI4AAAALE5vbkZ1bmdpYmxlBACtBQE0QXNzZXRJbnN0YW5jZQABAACtBRAMeGNtCHYyKG11bHRpYXNzZXQ0QXNzZXRJbnN0YW5jZQABHCRVbmRlZmluZWQAAAAUSW5kZXgEAPwBEHUxMjgAAQAYQXJyYXk0BABIARxbdTg7IDRdAAIAGEFycmF5OAQAsQUBHFt1ODsgOF0AAwAcQXJyYXkxNgQAwAEgW3U4OyAxNl0ABAAcQXJyYXkzMgQABAEgW3U4OyAzMl0ABQAQQmxvYgQAOAEcVmVjPHU4PgAGAACxBQAAAwgAAAAIALUFDAx4Y20IdjIgUmVzcG9uc2UAARAQTnVsbAAAABhBc3NldHMEAJkFASxNdWx0aUFzc2V0cwABADxFeGVjdXRpb25SZXN1bHQEALkFAVBPcHRpb248KHUzMiwgRXJyb3IpPgACABxWZXJzaW9uBAAQAThzdXBlcjo6VmVyc2lvbgADAAC5BQQYT3B0aW9uBARUAb0FAQgQTm9uZQAAABBTb21lBAC9BQAAAQAAvQUAAAQIEMEFAMEFEAx4Y20IdjIYdHJhaXRzFEVycm9yAAFoIE92ZXJmbG93AAAANFVuaW1wbGVtZW50ZWQAAQBgVW50cnVzdGVkUmVzZXJ2ZUxvY2F0aW9uAAIAZFVudHJ1c3RlZFRlbGVwb3J0TG9jYXRpb24AAwBETXVsdGlMb2NhdGlvbkZ1bGwABABoTXVsdGlMb2NhdGlvbk5vdEludmVydGlibGUABQAkQmFkT3JpZ2luAAYAPEludmFsaWRMb2NhdGlvbgAHADRBc3NldE5vdEZvdW5kAAgAVEZhaWxlZFRvVHJhbnNhY3RBc3NldAAJADxOb3RXaXRoZHJhd2FibGUACgBITG9jYXRpb25DYW5ub3RIb2xkAAsAVEV4Y2VlZHNNYXhNZXNzYWdlU2l6ZQAMAFhEZXN0aW5hdGlvblVuc3VwcG9ydGVkAA0AJFRyYW5zcG9ydAAOAChVbnJvdXRhYmxlAA8AMFVua25vd25DbGFpbQAQADhGYWlsZWRUb0RlY29kZQARAEBNYXhXZWlnaHRJbnZhbGlkABIAOE5vdEhvbGRpbmdGZWVzABMAMFRvb0V4cGVuc2l2ZQAUABBUcmFwBAAwAQx1NjQAFQBMVW5oYW5kbGVkWGNtVmVyc2lvbgAWAEhXZWlnaHRMaW1pdFJlYWNoZWQEADABGFdlaWdodAAXABxCYXJyaWVyABgATFdlaWdodE5vdENvbXB1dGFibGUAGQAAxQUMDHhjbQh2MihPcmlnaW5LaW5kAAEQGE5hdGl2ZQAAAEBTb3ZlcmVpZ25BY2NvdW50AAEAJFN1cGVydXNlcgACAAxYY20AAwAAyQUMDHhjbThkb3VibGVfZW5jb2RlZDREb3VibGVFbmNvZGVkBARUAAAEARxlbmNvZGVkOAEcVmVjPHU4PgAAzQUQDHhjbQh2MihtdWx0aWFzc2V0QE11bHRpQXNzZXRGaWx0ZXIAAQggRGVmaW5pdGUEAJkFASxNdWx0aUFzc2V0cwAAABBXaWxkBADRBQE4V2lsZE11bHRpQXNzZXQAAQAA0QUQDHhjbQh2MihtdWx0aWFzc2V0OFdpbGRNdWx0aUFzc2V0AAEIDEFsbAAAABRBbGxPZggBCGlkpQUBHEFzc2V0SWQAAQxmdW7VBQE8V2lsZEZ1bmdpYmlsaXR5AAEAANUFEAx4Y20IdjIobXVsdGlhc3NldDxXaWxkRnVuZ2liaWxpdHkAAQggRnVuZ2libGUAAAAsTm9uRnVuZ2libGUAAQAA2QUMDHhjbQh2MixXZWlnaHRMaW1pdAABCCRVbmxpbWl0ZWQAAAAcTGltaXRlZAQALAEMdTY0AAEAAN0FDAx4Y20IdjMMWGNtBBBDYWxsAAAEAOEFAVhWZWM8SW5zdHJ1Y3Rpb248Q2FsbD4+AADhBQAAAuUFAOUFDAx4Y20IdjMsSW5zdHJ1Y3Rpb24EEENhbGwAAcA0V2l0aGRyYXdBc3NldAQA6QUBLE11bHRpQXNzZXRzAAAAVFJlc2VydmVBc3NldERlcG9zaXRlZAQA6QUBLE11bHRpQXNzZXRzAAEAWFJlY2VpdmVUZWxlcG9ydGVkQXNzZXQEAOkFASxNdWx0aUFzc2V0cwACADRRdWVyeVJlc3BvbnNlEAEgcXVlcnlfaWQsARxRdWVyeUlkAAEgcmVzcG9uc2X9BQEgUmVzcG9uc2UAAShtYXhfd2VpZ2h0KAEYV2VpZ2h0AAEccXVlcmllciUGAVRPcHRpb248TXVsdGlMb2NhdGlvbj4AAwA0VHJhbnNmZXJBc3NldAgBGGFzc2V0c+kFASxNdWx0aUFzc2V0cwABLGJlbmVmaWNpYXJ54AE0TXVsdGlMb2NhdGlvbgAEAFBUcmFuc2ZlclJlc2VydmVBc3NldAwBGGFzc2V0c+kFASxNdWx0aUFzc2V0cwABEGRlc3TgATRNdWx0aUxvY2F0aW9uAAEMeGNt3QUBHFhjbTwoKT4ABQAgVHJhbnNhY3QMASxvcmlnaW5fa2luZCkGAShPcmlnaW5LaW5kAAFYcmVxdWlyZV93ZWlnaHRfYXRfbW9zdCgBGFdlaWdodAABEGNhbGzJBQFMRG91YmxlRW5jb2RlZDxDYWxsPgAGAGRIcm1wTmV3Q2hhbm5lbE9wZW5SZXF1ZXN0DAEYc2VuZGVy7AEMdTMyAAFAbWF4X21lc3NhZ2Vfc2l6ZewBDHUzMgABMG1heF9jYXBhY2l0eewBDHUzMgAHAExIcm1wQ2hhbm5lbEFjY2VwdGVkBAEkcmVjaXBpZW507AEMdTMyAAgASEhybXBDaGFubmVsQ2xvc2luZwwBJGluaXRpYXRvcuwBDHUzMgABGHNlbmRlcuwBDHUzMgABJHJlY2lwaWVudOwBDHUzMgAJACxDbGVhck9yaWdpbgAKADREZXNjZW5kT3JpZ2luBADkAVRJbnRlcmlvck11bHRpTG9jYXRpb24ACwAsUmVwb3J0RXJyb3IEAC0GAURRdWVyeVJlc3BvbnNlSW5mbwAMADBEZXBvc2l0QXNzZXQIARhhc3NldHMxBgFATXVsdGlBc3NldEZpbHRlcgABLGJlbmVmaWNpYXJ54AE0TXVsdGlMb2NhdGlvbgANAExEZXBvc2l0UmVzZXJ2ZUFzc2V0DAEYYXNzZXRzMQYBQE11bHRpQXNzZXRGaWx0ZXIAARBkZXN04AE0TXVsdGlMb2NhdGlvbgABDHhjbd0FARxYY208KCk+AA4ANEV4Y2hhbmdlQXNzZXQMARBnaXZlMQYBQE11bHRpQXNzZXRGaWx0ZXIAARB3YW506QUBLE11bHRpQXNzZXRzAAEcbWF4aW1hbCABEGJvb2wADwBcSW5pdGlhdGVSZXNlcnZlV2l0aGRyYXcMARhhc3NldHMxBgFATXVsdGlBc3NldEZpbHRlcgABHHJlc2VydmXgATRNdWx0aUxvY2F0aW9uAAEMeGNt3QUBHFhjbTwoKT4AEABASW5pdGlhdGVUZWxlcG9ydAwBGGFzc2V0czEGAUBNdWx0aUFzc2V0RmlsdGVyAAEQZGVzdOABNE11bHRpTG9jYXRpb24AAQx4Y23dBQEcWGNtPCgpPgARADRSZXBvcnRIb2xkaW5nCAE0cmVzcG9uc2VfaW5mby0GAURRdWVyeVJlc3BvbnNlSW5mbwABGGFzc2V0czEGAUBNdWx0aUFzc2V0RmlsdGVyABIAMEJ1eUV4ZWN1dGlvbggBEGZlZXPxBQEoTXVsdGlBc3NldAABMHdlaWdodF9saW1pdD0GASxXZWlnaHRMaW1pdAATADRSZWZ1bmRTdXJwbHVzABQAPFNldEVycm9ySGFuZGxlcgQA3QUBJFhjbTxDYWxsPgAVACxTZXRBcHBlbmRpeAQA3QUBJFhjbTxDYWxsPgAWAChDbGVhckVycm9yABcAKENsYWltQXNzZXQIARhhc3NldHPpBQEsTXVsdGlBc3NldHMAARh0aWNrZXTgATRNdWx0aUxvY2F0aW9uABgAEFRyYXAEACwBDHU2NAAZAEBTdWJzY3JpYmVWZXJzaW9uCAEgcXVlcnlfaWQsARxRdWVyeUlkAAFMbWF4X3Jlc3BvbnNlX3dlaWdodCgBGFdlaWdodAAaAEhVbnN1YnNjcmliZVZlcnNpb24AGwAkQnVybkFzc2V0BADpBQEsTXVsdGlBc3NldHMAHAAsRXhwZWN0QXNzZXQEAOkFASxNdWx0aUFzc2V0cwAdADBFeHBlY3RPcmlnaW4EACUGAVRPcHRpb248TXVsdGlMb2NhdGlvbj4AHgAsRXhwZWN0RXJyb3IEAAEGAVBPcHRpb248KHUzMiwgRXJyb3IpPgAfAFBFeHBlY3RUcmFuc2FjdFN0YXR1cwQAHQYBOE1heWJlRXJyb3JDb2RlACAALFF1ZXJ5UGFsbGV0CAEsbW9kdWxlX25hbWU4ARxWZWM8dTg+AAE0cmVzcG9uc2VfaW5mby0GAURRdWVyeVJlc3BvbnNlSW5mbwAhADBFeHBlY3RQYWxsZXQUARRpbmRleOwBDHUzMgABEG5hbWU4ARxWZWM8dTg+AAEsbW9kdWxlX25hbWU4ARxWZWM8dTg+AAEsY3JhdGVfbWFqb3LsAQx1MzIAATxtaW5fY3JhdGVfbWlub3LsAQx1MzIAIgBQUmVwb3J0VHJhbnNhY3RTdGF0dXMEAC0GAURRdWVyeVJlc3BvbnNlSW5mbwAjAExDbGVhclRyYW5zYWN0U3RhdHVzACQAPFVuaXZlcnNhbE9yaWdpbgQA6AEgSnVuY3Rpb24AJQA0RXhwb3J0TWVzc2FnZQwBHG5ldHdvcmv0ASROZXR3b3JrSWQAASxkZXN0aW5hdGlvbuQBVEludGVyaW9yTXVsdGlMb2NhdGlvbgABDHhjbd0FARxYY208KCk+ACYAJExvY2tBc3NldAgBFGFzc2V08QUBKE11bHRpQXNzZXQAASB1bmxvY2tlcuABNE11bHRpTG9jYXRpb24AJwAsVW5sb2NrQXNzZXQIARRhc3NldPEFAShNdWx0aUFzc2V0AAEYdGFyZ2V04AE0TXVsdGlMb2NhdGlvbgAoADhOb3RlVW5sb2NrYWJsZQgBFGFzc2V08QUBKE11bHRpQXNzZXQAARRvd25lcuABNE11bHRpTG9jYXRpb24AKQA0UmVxdWVzdFVubG9jawgBFGFzc2V08QUBKE11bHRpQXNzZXQAARhsb2NrZXLgATRNdWx0aUxvY2F0aW9uACoALFNldEZlZXNNb2RlBAEwaml0X3dpdGhkcmF3IAEQYm9vbAArACBTZXRUb3BpYwQABAEgW3U4OyAzMl0ALAAoQ2xlYXJUb3BpYwAtACxBbGlhc09yaWdpbgQA4AE0TXVsdGlMb2NhdGlvbgAuADxVbnBhaWRFeGVjdXRpb24IATB3ZWlnaHRfbGltaXQ9BgEsV2VpZ2h0TGltaXQAATBjaGVja19vcmlnaW4lBgFUT3B0aW9uPE11bHRpTG9jYXRpb24+AC8AAOkFEAx4Y20IdjMobXVsdGlhc3NldCxNdWx0aUFzc2V0cwAABADtBQE8VmVjPE11bHRpQXNzZXQ+AADtBQAAAvEFAPEFEAx4Y20IdjMobXVsdGlhc3NldChNdWx0aUFzc2V0AAAIAQhpZAkBARxBc3NldElkAAEMZnVu9QUBLEZ1bmdpYmlsaXR5AAD1BRAMeGNtCHYzKG11bHRpYXNzZXQsRnVuZ2liaWxpdHkAAQggRnVuZ2libGUEAPwBEHUxMjgAAAAsTm9uRnVuZ2libGUEAPkFATRBc3NldEluc3RhbmNlAAEAAPkFEAx4Y20IdjMobXVsdGlhc3NldDRBc3NldEluc3RhbmNlAAEYJFVuZGVmaW5lZAAAABRJbmRleAQA/AEQdTEyOAABABhBcnJheTQEAEgBHFt1ODsgNF0AAgAYQXJyYXk4BACxBQEcW3U4OyA4XQADABxBcnJheTE2BADAASBbdTg7IDE2XQAEABxBcnJheTMyBAAEASBbdTg7IDMyXQAFAAD9BQwMeGNtCHYzIFJlc3BvbnNlAAEYEE51bGwAAAAYQXNzZXRzBADpBQEsTXVsdGlBc3NldHMAAQA8RXhlY3V0aW9uUmVzdWx0BAABBgFQT3B0aW9uPCh1MzIsIEVycm9yKT4AAgAcVmVyc2lvbgQAEAE4c3VwZXI6OlZlcnNpb24AAwAsUGFsbGV0c0luZm8EAA0GAZhCb3VuZGVkVmVjPFBhbGxldEluZm8sIE1heFBhbGxldHNJbmZvPgAEADhEaXNwYXRjaFJlc3VsdAQAHQYBOE1heWJlRXJyb3JDb2RlAAUAAAEGBBhPcHRpb24EBFQBBQYBCBBOb25lAAAAEFNvbWUEAAUGAAABAAAFBgAABAgQCQYACQYQDHhjbQh2Mxh0cmFpdHMURXJyb3IAAaAgT3ZlcmZsb3cAAAA0VW5pbXBsZW1lbnRlZAABAGBVbnRydXN0ZWRSZXNlcnZlTG9jYXRpb24AAgBkVW50cnVzdGVkVGVsZXBvcnRMb2NhdGlvbgADADBMb2NhdGlvbkZ1bGwABABUTG9jYXRpb25Ob3RJbnZlcnRpYmxlAAUAJEJhZE9yaWdpbgAGADxJbnZhbGlkTG9jYXRpb24ABwA0QXNzZXROb3RGb3VuZAAIAFRGYWlsZWRUb1RyYW5zYWN0QXNzZXQACQA8Tm90V2l0aGRyYXdhYmxlAAoASExvY2F0aW9uQ2Fubm90SG9sZAALAFRFeGNlZWRzTWF4TWVzc2FnZVNpemUADABYRGVzdGluYXRpb25VbnN1cHBvcnRlZAANACRUcmFuc3BvcnQADgAoVW5yb3V0YWJsZQAPADBVbmtub3duQ2xhaW0AEAA4RmFpbGVkVG9EZWNvZGUAEQBATWF4V2VpZ2h0SW52YWxpZAASADhOb3RIb2xkaW5nRmVlcwATADBUb29FeHBlbnNpdmUAFAAQVHJhcAQAMAEMdTY0ABUAQEV4cGVjdGF0aW9uRmFsc2UAFgA4UGFsbGV0Tm90Rm91bmQAFwAwTmFtZU1pc21hdGNoABgATFZlcnNpb25JbmNvbXBhdGlibGUAGQBQSG9sZGluZ1dvdWxkT3ZlcmZsb3cAGgAsRXhwb3J0RXJyb3IAGwA4UmVhbmNob3JGYWlsZWQAHAAYTm9EZWFsAB0AKEZlZXNOb3RNZXQAHgAkTG9ja0Vycm9yAB8AME5vUGVybWlzc2lvbgAgAChVbmFuY2hvcmVkACEAOE5vdERlcG9zaXRhYmxlACIATFVuaGFuZGxlZFhjbVZlcnNpb24AIwBIV2VpZ2h0TGltaXRSZWFjaGVkBAAoARhXZWlnaHQAJAAcQmFycmllcgAlAExXZWlnaHROb3RDb21wdXRhYmxlACYAREV4Y2VlZHNTdGFja0xpbWl0ACcAAA0GDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBEQYEUwAABAAZBgEYVmVjPFQ+AAARBgwMeGNtCHYzKFBhbGxldEluZm8AABgBFGluZGV47AEMdTMyAAEQbmFtZRUGAYBCb3VuZGVkVmVjPHU4LCBNYXhQYWxsZXROYW1lTGVuPgABLG1vZHVsZV9uYW1lFQYBgEJvdW5kZWRWZWM8dTgsIE1heFBhbGxldE5hbWVMZW4+AAEUbWFqb3LsAQx1MzIAARRtaW5vcuwBDHUzMgABFHBhdGNo7AEMdTMyAAAVBgxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAQgEUwAABAA4ARhWZWM8VD4AABkGAAACEQYAHQYMDHhjbQh2MzhNYXliZUVycm9yQ29kZQABDBxTdWNjZXNzAAAAFEVycm9yBAAhBgGMQm91bmRlZFZlYzx1OCwgTWF4RGlzcGF0Y2hFcnJvckxlbj4AAQA4VHJ1bmNhdGVkRXJyb3IEACEGAYxCb3VuZGVkVmVjPHU4LCBNYXhEaXNwYXRjaEVycm9yTGVuPgACAAAhBgxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAQgEUwAABAA4ARhWZWM8VD4AACUGBBhPcHRpb24EBFQB4AEIEE5vbmUAAAAQU29tZQQA4AAAAQAAKQYMDHhjbQh2MyhPcmlnaW5LaW5kAAEQGE5hdGl2ZQAAAEBTb3ZlcmVpZ25BY2NvdW50AAEAJFN1cGVydXNlcgACAAxYY20AAwAALQYMDHhjbQh2M0RRdWVyeVJlc3BvbnNlSW5mbwAADAEsZGVzdGluYXRpb27gATRNdWx0aUxvY2F0aW9uAAEgcXVlcnlfaWQsARxRdWVyeUlkAAEobWF4X3dlaWdodCgBGFdlaWdodAAAMQYQDHhjbQh2MyhtdWx0aWFzc2V0QE11bHRpQXNzZXRGaWx0ZXIAAQggRGVmaW5pdGUEAOkFASxNdWx0aUFzc2V0cwAAABBXaWxkBAA1BgE4V2lsZE11bHRpQXNzZXQAAQAANQYQDHhjbQh2MyhtdWx0aWFzc2V0OFdpbGRNdWx0aUFzc2V0AAEQDEFsbAAAABRBbGxPZggBCGlkCQEBHEFzc2V0SWQAAQxmdW45BgE8V2lsZEZ1bmdpYmlsaXR5AAEAKEFsbENvdW50ZWQEAOwBDHUzMgACADBBbGxPZkNvdW50ZWQMAQhpZAkBARxBc3NldElkAAEMZnVuOQYBPFdpbGRGdW5naWJpbGl0eQABFGNvdW507AEMdTMyAAMAADkGEAx4Y20IdjMobXVsdGlhc3NldDxXaWxkRnVuZ2liaWxpdHkAAQggRnVuZ2libGUAAAAsTm9uRnVuZ2libGUAAQAAPQYMDHhjbQh2MyxXZWlnaHRMaW1pdAABCCRVbmxpbWl0ZWQAAAAcTGltaXRlZAQAKAEYV2VpZ2h0AAEAAEEGDCxzdGFnaW5nX3hjbQh2NAxYY20EEENhbGwAAAQARQYBWFZlYzxJbnN0cnVjdGlvbjxDYWxsPj4AAEUGAAACSQYASQYMLHN0YWdpbmdfeGNtCHY0LEluc3RydWN0aW9uBBBDYWxsAAHANFdpdGhkcmF3QXNzZXQEAE0GARhBc3NldHMAAABUUmVzZXJ2ZUFzc2V0RGVwb3NpdGVkBABNBgEYQXNzZXRzAAEAWFJlY2VpdmVUZWxlcG9ydGVkQXNzZXQEAE0GARhBc3NldHMAAgA0UXVlcnlSZXNwb25zZRABIHF1ZXJ5X2lkLAEcUXVlcnlJZAABIHJlc3BvbnNlYQYBIFJlc3BvbnNlAAEobWF4X3dlaWdodCgBGFdlaWdodAABHHF1ZXJpZXJ1BgFAT3B0aW9uPExvY2F0aW9uPgADADRUcmFuc2ZlckFzc2V0CAEYYXNzZXRzTQYBGEFzc2V0cwABLGJlbmVmaWNpYXJ5DQEBIExvY2F0aW9uAAQAUFRyYW5zZmVyUmVzZXJ2ZUFzc2V0DAEYYXNzZXRzTQYBGEFzc2V0cwABEGRlc3QNAQEgTG9jYXRpb24AAQx4Y21BBgEcWGNtPCgpPgAFACBUcmFuc2FjdAwBLG9yaWdpbl9raW5kKQYBKE9yaWdpbktpbmQAAVhyZXF1aXJlX3dlaWdodF9hdF9tb3N0KAEYV2VpZ2h0AAEQY2FsbMkFAUxEb3VibGVFbmNvZGVkPENhbGw+AAYAZEhybXBOZXdDaGFubmVsT3BlblJlcXVlc3QMARhzZW5kZXLsAQx1MzIAAUBtYXhfbWVzc2FnZV9zaXpl7AEMdTMyAAEwbWF4X2NhcGFjaXR57AEMdTMyAAcATEhybXBDaGFubmVsQWNjZXB0ZWQEASRyZWNpcGllbnTsAQx1MzIACABISHJtcENoYW5uZWxDbG9zaW5nDAEkaW5pdGlhdG9y7AEMdTMyAAEYc2VuZGVy7AEMdTMyAAEkcmVjaXBpZW507AEMdTMyAAkALENsZWFyT3JpZ2luAAoANERlc2NlbmRPcmlnaW4EABEBAUBJbnRlcmlvckxvY2F0aW9uAAsALFJlcG9ydEVycm9yBAB5BgFEUXVlcnlSZXNwb25zZUluZm8ADAAwRGVwb3NpdEFzc2V0CAEYYXNzZXRzfQYBLEFzc2V0RmlsdGVyAAEsYmVuZWZpY2lhcnkNAQEgTG9jYXRpb24ADQBMRGVwb3NpdFJlc2VydmVBc3NldAwBGGFzc2V0c30GASxBc3NldEZpbHRlcgABEGRlc3QNAQEgTG9jYXRpb24AAQx4Y21BBgEcWGNtPCgpPgAOADRFeGNoYW5nZUFzc2V0DAEQZ2l2ZX0GASxBc3NldEZpbHRlcgABEHdhbnRNBgEYQXNzZXRzAAEcbWF4aW1hbCABEGJvb2wADwBcSW5pdGlhdGVSZXNlcnZlV2l0aGRyYXcMARhhc3NldHN9BgEsQXNzZXRGaWx0ZXIAARxyZXNlcnZlDQEBIExvY2F0aW9uAAEMeGNtQQYBHFhjbTwoKT4AEABASW5pdGlhdGVUZWxlcG9ydAwBGGFzc2V0c30GASxBc3NldEZpbHRlcgABEGRlc3QNAQEgTG9jYXRpb24AAQx4Y21BBgEcWGNtPCgpPgARADRSZXBvcnRIb2xkaW5nCAE0cmVzcG9uc2VfaW5mb3kGAURRdWVyeVJlc3BvbnNlSW5mbwABGGFzc2V0c30GASxBc3NldEZpbHRlcgASADBCdXlFeGVjdXRpb24IARBmZWVzVQYBFEFzc2V0AAEwd2VpZ2h0X2xpbWl0PQYBLFdlaWdodExpbWl0ABMANFJlZnVuZFN1cnBsdXMAFAA8U2V0RXJyb3JIYW5kbGVyBABBBgEkWGNtPENhbGw+ABUALFNldEFwcGVuZGl4BABBBgEkWGNtPENhbGw+ABYAKENsZWFyRXJyb3IAFwAoQ2xhaW1Bc3NldAgBGGFzc2V0c00GARhBc3NldHMAARh0aWNrZXQNAQEgTG9jYXRpb24AGAAQVHJhcAQALAEMdTY0ABkAQFN1YnNjcmliZVZlcnNpb24IASBxdWVyeV9pZCwBHFF1ZXJ5SWQAAUxtYXhfcmVzcG9uc2Vfd2VpZ2h0KAEYV2VpZ2h0ABoASFVuc3Vic2NyaWJlVmVyc2lvbgAbACRCdXJuQXNzZXQEAE0GARhBc3NldHMAHAAsRXhwZWN0QXNzZXQEAE0GARhBc3NldHMAHQAwRXhwZWN0T3JpZ2luBAB1BgFAT3B0aW9uPExvY2F0aW9uPgAeACxFeHBlY3RFcnJvcgQAAQYBUE9wdGlvbjwodTMyLCBFcnJvcik+AB8AUEV4cGVjdFRyYW5zYWN0U3RhdHVzBAAdBgE4TWF5YmVFcnJvckNvZGUAIAAsUXVlcnlQYWxsZXQIASxtb2R1bGVfbmFtZTgBHFZlYzx1OD4AATRyZXNwb25zZV9pbmZveQYBRFF1ZXJ5UmVzcG9uc2VJbmZvACEAMEV4cGVjdFBhbGxldBQBFGluZGV47AEMdTMyAAEQbmFtZTgBHFZlYzx1OD4AASxtb2R1bGVfbmFtZTgBHFZlYzx1OD4AASxjcmF0ZV9tYWpvcuwBDHUzMgABPG1pbl9jcmF0ZV9taW5vcuwBDHUzMgAiAFBSZXBvcnRUcmFuc2FjdFN0YXR1cwQAeQYBRFF1ZXJ5UmVzcG9uc2VJbmZvACMATENsZWFyVHJhbnNhY3RTdGF0dXMAJAA8VW5pdmVyc2FsT3JpZ2luBAAZAQEgSnVuY3Rpb24AJQA0RXhwb3J0TWVzc2FnZQwBHG5ldHdvcmshAQEkTmV0d29ya0lkAAEsZGVzdGluYXRpb24RAQFASW50ZXJpb3JMb2NhdGlvbgABDHhjbUEGARxYY208KCk+ACYAJExvY2tBc3NldAgBFGFzc2V0VQYBFEFzc2V0AAEgdW5sb2NrZXINAQEgTG9jYXRpb24AJwAsVW5sb2NrQXNzZXQIARRhc3NldFUGARRBc3NldAABGHRhcmdldA0BASBMb2NhdGlvbgAoADhOb3RlVW5sb2NrYWJsZQgBFGFzc2V0VQYBFEFzc2V0AAEUb3duZXINAQEgTG9jYXRpb24AKQA0UmVxdWVzdFVubG9jawgBFGFzc2V0VQYBFEFzc2V0AAEYbG9ja2VyDQEBIExvY2F0aW9uACoALFNldEZlZXNNb2RlBAEwaml0X3dpdGhkcmF3IAEQYm9vbAArACBTZXRUb3BpYwQABAEgW3U4OyAzMl0ALAAoQ2xlYXJUb3BpYwAtACxBbGlhc09yaWdpbgQADQEBIExvY2F0aW9uAC4APFVucGFpZEV4ZWN1dGlvbggBMHdlaWdodF9saW1pdD0GASxXZWlnaHRMaW1pdAABMGNoZWNrX29yaWdpbnUGAUBPcHRpb248TG9jYXRpb24+AC8AAE0GECxzdGFnaW5nX3hjbQh2NBRhc3NldBhBc3NldHMAAAQAUQYBKFZlYzxBc3NldD4AAFEGAAACVQYAVQYQLHN0YWdpbmdfeGNtCHY0FGFzc2V0FEFzc2V0AAAIAQhpZEEBARxBc3NldElkAAEMZnVuWQYBLEZ1bmdpYmlsaXR5AABZBhAsc3RhZ2luZ194Y20IdjQUYXNzZXQsRnVuZ2liaWxpdHkAAQggRnVuZ2libGUEAPwBEHUxMjgAAAAsTm9uRnVuZ2libGUEAF0GATRBc3NldEluc3RhbmNlAAEAAF0GECxzdGFnaW5nX3hjbQh2NBRhc3NldDRBc3NldEluc3RhbmNlAAEYJFVuZGVmaW5lZAAAABRJbmRleAQA/AEQdTEyOAABABhBcnJheTQEAEgBHFt1ODsgNF0AAgAYQXJyYXk4BACxBQEcW3U4OyA4XQADABxBcnJheTE2BADAASBbdTg7IDE2XQAEABxBcnJheTMyBAAEASBbdTg7IDMyXQAFAABhBgwsc3RhZ2luZ194Y20IdjQgUmVzcG9uc2UAARgQTnVsbAAAABhBc3NldHMEAE0GARhBc3NldHMAAQA8RXhlY3V0aW9uUmVzdWx0BAABBgFQT3B0aW9uPCh1MzIsIEVycm9yKT4AAgAcVmVyc2lvbgQAEAE4c3VwZXI6OlZlcnNpb24AAwAsUGFsbGV0c0luZm8EAGUGAZhCb3VuZGVkVmVjPFBhbGxldEluZm8sIE1heFBhbGxldHNJbmZvPgAEADhEaXNwYXRjaFJlc3VsdAQAHQYBOE1heWJlRXJyb3JDb2RlAAUAAGUGDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBaQYEUwAABABxBgEYVmVjPFQ+AABpBgwsc3RhZ2luZ194Y20IdjQoUGFsbGV0SW5mbwAAGAEUaW5kZXjsAQx1MzIAARBuYW1lbQYBgEJvdW5kZWRWZWM8dTgsIE1heFBhbGxldE5hbWVMZW4+AAEsbW9kdWxlX25hbWVtBgGAQm91bmRlZFZlYzx1OCwgTWF4UGFsbGV0TmFtZUxlbj4AARRtYWpvcuwBDHUzMgABFG1pbm9y7AEMdTMyAAEUcGF0Y2jsAQx1MzIAAG0GDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBCARTAAAEADgBGFZlYzxUPgAAcQYAAAJpBgB1BgQYT3B0aW9uBARUAQ0BAQgQTm9uZQAAABBTb21lBAANAQAAAQAAeQYMLHN0YWdpbmdfeGNtCHY0RFF1ZXJ5UmVzcG9uc2VJbmZvAAAMASxkZXN0aW5hdGlvbg0BASBMb2NhdGlvbgABIHF1ZXJ5X2lkLAEcUXVlcnlJZAABKG1heF93ZWlnaHQoARhXZWlnaHQAAH0GECxzdGFnaW5nX3hjbQh2NBRhc3NldCxBc3NldEZpbHRlcgABCCBEZWZpbml0ZQQATQYBGEFzc2V0cwAAABBXaWxkBACBBgEkV2lsZEFzc2V0AAEAAIEGECxzdGFnaW5nX3hjbQh2NBRhc3NldCRXaWxkQXNzZXQAARAMQWxsAAAAFEFsbE9mCAEIaWRBAQEcQXNzZXRJZAABDGZ1boUGATxXaWxkRnVuZ2liaWxpdHkAAQAoQWxsQ291bnRlZAQA7AEMdTMyAAIAMEFsbE9mQ291bnRlZAwBCGlkQQEBHEFzc2V0SWQAAQxmdW6FBgE8V2lsZEZ1bmdpYmlsaXR5AAEUY291bnTsAQx1MzIAAwAAhQYQLHN0YWdpbmdfeGNtCHY0FGFzc2V0PFdpbGRGdW5naWJpbGl0eQABCCBGdW5naWJsZQAAACxOb25GdW5naWJsZQABAACJBggMeGNtPFZlcnNpb25lZEFzc2V0cwABDAhWMgQAmQUBPHYyOjpNdWx0aUFzc2V0cwABAAhWMwQA6QUBPHYzOjpNdWx0aUFzc2V0cwADAAhWNAQATQYBKHY0OjpBc3NldHMABAAAjQYIDHhjbTBWZXJzaW9uZWRYY20ELFJ1bnRpbWVDYWxsAAEMCFYyBACRBgFQdjI6OlhjbTxSdW50aW1lQ2FsbD4AAgAIVjMEAKEGAVB2Mzo6WGNtPFJ1bnRpbWVDYWxsPgADAAhWNAQArQYBUHY0OjpYY208UnVudGltZUNhbGw+AAQAAJEGDAx4Y20IdjIMWGNtBCxSdW50aW1lQ2FsbAAABACVBgF0VmVjPEluc3RydWN0aW9uPFJ1bnRpbWVDYWxsPj4AAJUGAAACmQYAmQYMDHhjbQh2MixJbnN0cnVjdGlvbgQsUnVudGltZUNhbGwAAXA0V2l0aGRyYXdBc3NldAQAmQUBLE11bHRpQXNzZXRzAAAAVFJlc2VydmVBc3NldERlcG9zaXRlZAQAmQUBLE11bHRpQXNzZXRzAAEAWFJlY2VpdmVUZWxlcG9ydGVkQXNzZXQEAJkFASxNdWx0aUFzc2V0cwACADRRdWVyeVJlc3BvbnNlDAEgcXVlcnlfaWQsARxRdWVyeUlkAAEgcmVzcG9uc2W1BQEgUmVzcG9uc2UAAShtYXhfd2VpZ2h0LAEMdTY0AAMANFRyYW5zZmVyQXNzZXQIARhhc3NldHOZBQEsTXVsdGlBc3NldHMAASxiZW5lZmljaWFyeUkBATRNdWx0aUxvY2F0aW9uAAQAUFRyYW5zZmVyUmVzZXJ2ZUFzc2V0DAEYYXNzZXRzmQUBLE11bHRpQXNzZXRzAAEQZGVzdEkBATRNdWx0aUxvY2F0aW9uAAEMeGNtjQUBHFhjbTwoKT4ABQAgVHJhbnNhY3QMASxvcmlnaW5fdHlwZcUFAShPcmlnaW5LaW5kAAFYcmVxdWlyZV93ZWlnaHRfYXRfbW9zdCwBDHU2NAABEGNhbGydBgFoRG91YmxlRW5jb2RlZDxSdW50aW1lQ2FsbD4ABgBkSHJtcE5ld0NoYW5uZWxPcGVuUmVxdWVzdAwBGHNlbmRlcuwBDHUzMgABQG1heF9tZXNzYWdlX3NpemXsAQx1MzIAATBtYXhfY2FwYWNpdHnsAQx1MzIABwBMSHJtcENoYW5uZWxBY2NlcHRlZAQBJHJlY2lwaWVudOwBDHUzMgAIAEhIcm1wQ2hhbm5lbENsb3NpbmcMASRpbml0aWF0b3LsAQx1MzIAARhzZW5kZXLsAQx1MzIAASRyZWNpcGllbnTsAQx1MzIACQAsQ2xlYXJPcmlnaW4ACgA0RGVzY2VuZE9yaWdpbgQATQEBVEludGVyaW9yTXVsdGlMb2NhdGlvbgALACxSZXBvcnRFcnJvcgwBIHF1ZXJ5X2lkLAEcUXVlcnlJZAABEGRlc3RJAQE0TXVsdGlMb2NhdGlvbgABTG1heF9yZXNwb25zZV93ZWlnaHQsAQx1NjQADAAwRGVwb3NpdEFzc2V0DAEYYXNzZXRzzQUBQE11bHRpQXNzZXRGaWx0ZXIAAShtYXhfYXNzZXRz7AEMdTMyAAEsYmVuZWZpY2lhcnlJAQE0TXVsdGlMb2NhdGlvbgANAExEZXBvc2l0UmVzZXJ2ZUFzc2V0EAEYYXNzZXRzzQUBQE11bHRpQXNzZXRGaWx0ZXIAAShtYXhfYXNzZXRz7AEMdTMyAAEQZGVzdEkBATRNdWx0aUxvY2F0aW9uAAEMeGNtjQUBHFhjbTwoKT4ADgA0RXhjaGFuZ2VBc3NldAgBEGdpdmXNBQFATXVsdGlBc3NldEZpbHRlcgABHHJlY2VpdmWZBQEsTXVsdGlBc3NldHMADwBcSW5pdGlhdGVSZXNlcnZlV2l0aGRyYXcMARhhc3NldHPNBQFATXVsdGlBc3NldEZpbHRlcgABHHJlc2VydmVJAQE0TXVsdGlMb2NhdGlvbgABDHhjbY0FARxYY208KCk+ABAAQEluaXRpYXRlVGVsZXBvcnQMARhhc3NldHPNBQFATXVsdGlBc3NldEZpbHRlcgABEGRlc3RJAQE0TXVsdGlMb2NhdGlvbgABDHhjbY0FARxYY208KCk+ABEAMFF1ZXJ5SG9sZGluZxABIHF1ZXJ5X2lkLAEcUXVlcnlJZAABEGRlc3RJAQE0TXVsdGlMb2NhdGlvbgABGGFzc2V0c80FAUBNdWx0aUFzc2V0RmlsdGVyAAFMbWF4X3Jlc3BvbnNlX3dlaWdodCwBDHU2NAASADBCdXlFeGVjdXRpb24IARBmZWVzoQUBKE11bHRpQXNzZXQAATB3ZWlnaHRfbGltaXTZBQEsV2VpZ2h0TGltaXQAEwA0UmVmdW5kU3VycGx1cwAUADxTZXRFcnJvckhhbmRsZXIEAJEGAUBYY208UnVudGltZUNhbGw+ABUALFNldEFwcGVuZGl4BACRBgFAWGNtPFJ1bnRpbWVDYWxsPgAWAChDbGVhckVycm9yABcAKENsYWltQXNzZXQIARhhc3NldHOZBQEsTXVsdGlBc3NldHMAARh0aWNrZXRJAQE0TXVsdGlMb2NhdGlvbgAYABBUcmFwBAAsAQx1NjQAGQBAU3Vic2NyaWJlVmVyc2lvbggBIHF1ZXJ5X2lkLAEcUXVlcnlJZAABTG1heF9yZXNwb25zZV93ZWlnaHQsAQx1NjQAGgBIVW5zdWJzY3JpYmVWZXJzaW9uABsAAJ0GDAx4Y204ZG91YmxlX2VuY29kZWQ0RG91YmxlRW5jb2RlZAQEVAAABAEcZW5jb2RlZDgBHFZlYzx1OD4AAKEGDAx4Y20IdjMMWGNtBBBDYWxsAAAEAKUGAVhWZWM8SW5zdHJ1Y3Rpb248Q2FsbD4+AAClBgAAAqkGAKkGDAx4Y20IdjMsSW5zdHJ1Y3Rpb24EEENhbGwAAcA0V2l0aGRyYXdBc3NldAQA6QUBLE11bHRpQXNzZXRzAAAAVFJlc2VydmVBc3NldERlcG9zaXRlZAQA6QUBLE11bHRpQXNzZXRzAAEAWFJlY2VpdmVUZWxlcG9ydGVkQXNzZXQEAOkFASxNdWx0aUFzc2V0cwACADRRdWVyeVJlc3BvbnNlEAEgcXVlcnlfaWQsARxRdWVyeUlkAAEgcmVzcG9uc2X9BQEgUmVzcG9uc2UAAShtYXhfd2VpZ2h0KAEYV2VpZ2h0AAEccXVlcmllciUGAVRPcHRpb248TXVsdGlMb2NhdGlvbj4AAwA0VHJhbnNmZXJBc3NldAgBGGFzc2V0c+kFASxNdWx0aUFzc2V0cwABLGJlbmVmaWNpYXJ54AE0TXVsdGlMb2NhdGlvbgAEAFBUcmFuc2ZlclJlc2VydmVBc3NldAwBGGFzc2V0c+kFASxNdWx0aUFzc2V0cwABEGRlc3TgATRNdWx0aUxvY2F0aW9uAAEMeGNt3QUBHFhjbTwoKT4ABQAgVHJhbnNhY3QMASxvcmlnaW5fa2luZCkGAShPcmlnaW5LaW5kAAFYcmVxdWlyZV93ZWlnaHRfYXRfbW9zdCgBGFdlaWdodAABEGNhbGydBgFMRG91YmxlRW5jb2RlZDxDYWxsPgAGAGRIcm1wTmV3Q2hhbm5lbE9wZW5SZXF1ZXN0DAEYc2VuZGVy7AEMdTMyAAFAbWF4X21lc3NhZ2Vfc2l6ZewBDHUzMgABMG1heF9jYXBhY2l0eewBDHUzMgAHAExIcm1wQ2hhbm5lbEFjY2VwdGVkBAEkcmVjaXBpZW507AEMdTMyAAgASEhybXBDaGFubmVsQ2xvc2luZwwBJGluaXRpYXRvcuwBDHUzMgABGHNlbmRlcuwBDHUzMgABJHJlY2lwaWVudOwBDHUzMgAJACxDbGVhck9yaWdpbgAKADREZXNjZW5kT3JpZ2luBADkAVRJbnRlcmlvck11bHRpTG9jYXRpb24ACwAsUmVwb3J0RXJyb3IEAC0GAURRdWVyeVJlc3BvbnNlSW5mbwAMADBEZXBvc2l0QXNzZXQIARhhc3NldHMxBgFATXVsdGlBc3NldEZpbHRlcgABLGJlbmVmaWNpYXJ54AE0TXVsdGlMb2NhdGlvbgANAExEZXBvc2l0UmVzZXJ2ZUFzc2V0DAEYYXNzZXRzMQYBQE11bHRpQXNzZXRGaWx0ZXIAARBkZXN04AE0TXVsdGlMb2NhdGlvbgABDHhjbd0FARxYY208KCk+AA4ANEV4Y2hhbmdlQXNzZXQMARBnaXZlMQYBQE11bHRpQXNzZXRGaWx0ZXIAARB3YW506QUBLE11bHRpQXNzZXRzAAEcbWF4aW1hbCABEGJvb2wADwBcSW5pdGlhdGVSZXNlcnZlV2l0aGRyYXcMARhhc3NldHMxBgFATXVsdGlBc3NldEZpbHRlcgABHHJlc2VydmXgATRNdWx0aUxvY2F0aW9uAAEMeGNt3QUBHFhjbTwoKT4AEABASW5pdGlhdGVUZWxlcG9ydAwBGGFzc2V0czEGAUBNdWx0aUFzc2V0RmlsdGVyAAEQZGVzdOABNE11bHRpTG9jYXRpb24AAQx4Y23dBQEcWGNtPCgpPgARADRSZXBvcnRIb2xkaW5nCAE0cmVzcG9uc2VfaW5mby0GAURRdWVyeVJlc3BvbnNlSW5mbwABGGFzc2V0czEGAUBNdWx0aUFzc2V0RmlsdGVyABIAMEJ1eUV4ZWN1dGlvbggBEGZlZXPxBQEoTXVsdGlBc3NldAABMHdlaWdodF9saW1pdD0GASxXZWlnaHRMaW1pdAATADRSZWZ1bmRTdXJwbHVzABQAPFNldEVycm9ySGFuZGxlcgQAoQYBJFhjbTxDYWxsPgAVACxTZXRBcHBlbmRpeAQAoQYBJFhjbTxDYWxsPgAWAChDbGVhckVycm9yABcAKENsYWltQXNzZXQIARhhc3NldHPpBQEsTXVsdGlBc3NldHMAARh0aWNrZXTgATRNdWx0aUxvY2F0aW9uABgAEFRyYXAEACwBDHU2NAAZAEBTdWJzY3JpYmVWZXJzaW9uCAEgcXVlcnlfaWQsARxRdWVyeUlkAAFMbWF4X3Jlc3BvbnNlX3dlaWdodCgBGFdlaWdodAAaAEhVbnN1YnNjcmliZVZlcnNpb24AGwAkQnVybkFzc2V0BADpBQEsTXVsdGlBc3NldHMAHAAsRXhwZWN0QXNzZXQEAOkFASxNdWx0aUFzc2V0cwAdADBFeHBlY3RPcmlnaW4EACUGAVRPcHRpb248TXVsdGlMb2NhdGlvbj4AHgAsRXhwZWN0RXJyb3IEAAEGAVBPcHRpb248KHUzMiwgRXJyb3IpPgAfAFBFeHBlY3RUcmFuc2FjdFN0YXR1cwQAHQYBOE1heWJlRXJyb3JDb2RlACAALFF1ZXJ5UGFsbGV0CAEsbW9kdWxlX25hbWU4ARxWZWM8dTg+AAE0cmVzcG9uc2VfaW5mby0GAURRdWVyeVJlc3BvbnNlSW5mbwAhADBFeHBlY3RQYWxsZXQUARRpbmRleOwBDHUzMgABEG5hbWU4ARxWZWM8dTg+AAEsbW9kdWxlX25hbWU4ARxWZWM8dTg+AAEsY3JhdGVfbWFqb3LsAQx1MzIAATxtaW5fY3JhdGVfbWlub3LsAQx1MzIAIgBQUmVwb3J0VHJhbnNhY3RTdGF0dXMEAC0GAURRdWVyeVJlc3BvbnNlSW5mbwAjAExDbGVhclRyYW5zYWN0U3RhdHVzACQAPFVuaXZlcnNhbE9yaWdpbgQA6AEgSnVuY3Rpb24AJQA0RXhwb3J0TWVzc2FnZQwBHG5ldHdvcmv0ASROZXR3b3JrSWQAASxkZXN0aW5hdGlvbuQBVEludGVyaW9yTXVsdGlMb2NhdGlvbgABDHhjbd0FARxYY208KCk+ACYAJExvY2tBc3NldAgBFGFzc2V08QUBKE11bHRpQXNzZXQAASB1bmxvY2tlcuABNE11bHRpTG9jYXRpb24AJwAsVW5sb2NrQXNzZXQIARRhc3NldPEFAShNdWx0aUFzc2V0AAEYdGFyZ2V04AE0TXVsdGlMb2NhdGlvbgAoADhOb3RlVW5sb2NrYWJsZQgBFGFzc2V08QUBKE11bHRpQXNzZXQAARRvd25lcuABNE11bHRpTG9jYXRpb24AKQA0UmVxdWVzdFVubG9jawgBFGFzc2V08QUBKE11bHRpQXNzZXQAARhsb2NrZXLgATRNdWx0aUxvY2F0aW9uACoALFNldEZlZXNNb2RlBAEwaml0X3dpdGhkcmF3IAEQYm9vbAArACBTZXRUb3BpYwQABAEgW3U4OyAzMl0ALAAoQ2xlYXJUb3BpYwAtACxBbGlhc09yaWdpbgQA4AE0TXVsdGlMb2NhdGlvbgAuADxVbnBhaWRFeGVjdXRpb24IATB3ZWlnaHRfbGltaXQ9BgEsV2VpZ2h0TGltaXQAATBjaGVja19vcmlnaW4lBgFUT3B0aW9uPE11bHRpTG9jYXRpb24+AC8AAK0GDCxzdGFnaW5nX3hjbQh2NAxYY20EEENhbGwAAAQAsQYBWFZlYzxJbnN0cnVjdGlvbjxDYWxsPj4AALEGAAACtQYAtQYMLHN0YWdpbmdfeGNtCHY0LEluc3RydWN0aW9uBBBDYWxsAAHANFdpdGhkcmF3QXNzZXQEAE0GARhBc3NldHMAAABUUmVzZXJ2ZUFzc2V0RGVwb3NpdGVkBABNBgEYQXNzZXRzAAEAWFJlY2VpdmVUZWxlcG9ydGVkQXNzZXQEAE0GARhBc3NldHMAAgA0UXVlcnlSZXNwb25zZRABIHF1ZXJ5X2lkLAEcUXVlcnlJZAABIHJlc3BvbnNlYQYBIFJlc3BvbnNlAAEobWF4X3dlaWdodCgBGFdlaWdodAABHHF1ZXJpZXJ1BgFAT3B0aW9uPExvY2F0aW9uPgADADRUcmFuc2ZlckFzc2V0CAEYYXNzZXRzTQYBGEFzc2V0cwABLGJlbmVmaWNpYXJ5DQEBIExvY2F0aW9uAAQAUFRyYW5zZmVyUmVzZXJ2ZUFzc2V0DAEYYXNzZXRzTQYBGEFzc2V0cwABEGRlc3QNAQEgTG9jYXRpb24AAQx4Y21BBgEcWGNtPCgpPgAFACBUcmFuc2FjdAwBLG9yaWdpbl9raW5kKQYBKE9yaWdpbktpbmQAAVhyZXF1aXJlX3dlaWdodF9hdF9tb3N0KAEYV2VpZ2h0AAEQY2FsbJ0GAUxEb3VibGVFbmNvZGVkPENhbGw+AAYAZEhybXBOZXdDaGFubmVsT3BlblJlcXVlc3QMARhzZW5kZXLsAQx1MzIAAUBtYXhfbWVzc2FnZV9zaXpl7AEMdTMyAAEwbWF4X2NhcGFjaXR57AEMdTMyAAcATEhybXBDaGFubmVsQWNjZXB0ZWQEASRyZWNpcGllbnTsAQx1MzIACABISHJtcENoYW5uZWxDbG9zaW5nDAEkaW5pdGlhdG9y7AEMdTMyAAEYc2VuZGVy7AEMdTMyAAEkcmVjaXBpZW507AEMdTMyAAkALENsZWFyT3JpZ2luAAoANERlc2NlbmRPcmlnaW4EABEBAUBJbnRlcmlvckxvY2F0aW9uAAsALFJlcG9ydEVycm9yBAB5BgFEUXVlcnlSZXNwb25zZUluZm8ADAAwRGVwb3NpdEFzc2V0CAEYYXNzZXRzfQYBLEFzc2V0RmlsdGVyAAEsYmVuZWZpY2lhcnkNAQEgTG9jYXRpb24ADQBMRGVwb3NpdFJlc2VydmVBc3NldAwBGGFzc2V0c30GASxBc3NldEZpbHRlcgABEGRlc3QNAQEgTG9jYXRpb24AAQx4Y21BBgEcWGNtPCgpPgAOADRFeGNoYW5nZUFzc2V0DAEQZ2l2ZX0GASxBc3NldEZpbHRlcgABEHdhbnRNBgEYQXNzZXRzAAEcbWF4aW1hbCABEGJvb2wADwBcSW5pdGlhdGVSZXNlcnZlV2l0aGRyYXcMARhhc3NldHN9BgEsQXNzZXRGaWx0ZXIAARxyZXNlcnZlDQEBIExvY2F0aW9uAAEMeGNtQQYBHFhjbTwoKT4AEABASW5pdGlhdGVUZWxlcG9ydAwBGGFzc2V0c30GASxBc3NldEZpbHRlcgABEGRlc3QNAQEgTG9jYXRpb24AAQx4Y21BBgEcWGNtPCgpPgARADRSZXBvcnRIb2xkaW5nCAE0cmVzcG9uc2VfaW5mb3kGAURRdWVyeVJlc3BvbnNlSW5mbwABGGFzc2V0c30GASxBc3NldEZpbHRlcgASADBCdXlFeGVjdXRpb24IARBmZWVzVQYBFEFzc2V0AAEwd2VpZ2h0X2xpbWl0PQYBLFdlaWdodExpbWl0ABMANFJlZnVuZFN1cnBsdXMAFAA8U2V0RXJyb3JIYW5kbGVyBACtBgEkWGNtPENhbGw+ABUALFNldEFwcGVuZGl4BACtBgEkWGNtPENhbGw+ABYAKENsZWFyRXJyb3IAFwAoQ2xhaW1Bc3NldAgBGGFzc2V0c00GARhBc3NldHMAARh0aWNrZXQNAQEgTG9jYXRpb24AGAAQVHJhcAQALAEMdTY0ABkAQFN1YnNjcmliZVZlcnNpb24IASBxdWVyeV9pZCwBHFF1ZXJ5SWQAAUxtYXhfcmVzcG9uc2Vfd2VpZ2h0KAEYV2VpZ2h0ABoASFVuc3Vic2NyaWJlVmVyc2lvbgAbACRCdXJuQXNzZXQEAE0GARhBc3NldHMAHAAsRXhwZWN0QXNzZXQEAE0GARhBc3NldHMAHQAwRXhwZWN0T3JpZ2luBAB1BgFAT3B0aW9uPExvY2F0aW9uPgAeACxFeHBlY3RFcnJvcgQAAQYBUE9wdGlvbjwodTMyLCBFcnJvcik+AB8AUEV4cGVjdFRyYW5zYWN0U3RhdHVzBAAdBgE4TWF5YmVFcnJvckNvZGUAIAAsUXVlcnlQYWxsZXQIASxtb2R1bGVfbmFtZTgBHFZlYzx1OD4AATRyZXNwb25zZV9pbmZveQYBRFF1ZXJ5UmVzcG9uc2VJbmZvACEAMEV4cGVjdFBhbGxldBQBFGluZGV47AEMdTMyAAEQbmFtZTgBHFZlYzx1OD4AASxtb2R1bGVfbmFtZTgBHFZlYzx1OD4AASxjcmF0ZV9tYWpvcuwBDHUzMgABPG1pbl9jcmF0ZV9taW5vcuwBDHUzMgAiAFBSZXBvcnRUcmFuc2FjdFN0YXR1cwQAeQYBRFF1ZXJ5UmVzcG9uc2VJbmZvACMATENsZWFyVHJhbnNhY3RTdGF0dXMAJAA8VW5pdmVyc2FsT3JpZ2luBAAZAQEgSnVuY3Rpb24AJQA0RXhwb3J0TWVzc2FnZQwBHG5ldHdvcmshAQEkTmV0d29ya0lkAAEsZGVzdGluYXRpb24RAQFASW50ZXJpb3JMb2NhdGlvbgABDHhjbUEGARxYY208KCk+ACYAJExvY2tBc3NldAgBFGFzc2V0VQYBFEFzc2V0AAEgdW5sb2NrZXINAQEgTG9jYXRpb24AJwAsVW5sb2NrQXNzZXQIARRhc3NldFUGARRBc3NldAABGHRhcmdldA0BASBMb2NhdGlvbgAoADhOb3RlVW5sb2NrYWJsZQgBFGFzc2V0VQYBFEFzc2V0AAEUb3duZXINAQEgTG9jYXRpb24AKQA0UmVxdWVzdFVubG9jawgBFGFzc2V0VQYBFEFzc2V0AAEYbG9ja2VyDQEBIExvY2F0aW9uACoALFNldEZlZXNNb2RlBAEwaml0X3dpdGhkcmF3IAEQYm9vbAArACBTZXRUb3BpYwQABAEgW3U4OyAzMl0ALAAoQ2xlYXJUb3BpYwAtACxBbGlhc09yaWdpbgQADQEBIExvY2F0aW9uAC4APFVucGFpZEV4ZWN1dGlvbggBMHdlaWdodF9saW1pdD0GASxXZWlnaHRMaW1pdAABMGNoZWNrX29yaWdpbnUGAUBPcHRpb248TG9jYXRpb24+AC8AALkGEFBzdGFnaW5nX3hjbV9leGVjdXRvchh0cmFpdHM4YXNzZXRfdHJhbnNmZXIwVHJhbnNmZXJUeXBlAAEQIFRlbGVwb3J0AAAAMExvY2FsUmVzZXJ2ZQABAEhEZXN0aW5hdGlvblJlc2VydmUAAgA0UmVtb3RlUmVzZXJ2ZQQARQEBRFZlcnNpb25lZExvY2F0aW9uAAMAAL0GCAx4Y21AVmVyc2lvbmVkQXNzZXRJZAABCAhWMwQACQEBLHYzOjpBc3NldElkAAMACFY0BABBAQEsdjQ6OkFzc2V0SWQABAAAwQYMUHBhbGxldF9tZXNzYWdlX3F1ZXVlGHBhbGxldBBDYWxsBARUAAEIJHJlYXBfcGFnZQgBOG1lc3NhZ2Vfb3JpZ2luxQYBSE1lc3NhZ2VPcmlnaW5PZjxUPgABKHBhZ2VfaW5kZXgQASRQYWdlSW5kZXgAAAQ9AVJlbW92ZSBhIHBhZ2Ugd2hpY2ggaGFzIG5vIG1vcmUgbWVzc2FnZXMgcmVtYWluaW5nIHRvIGJlIHByb2Nlc3NlZCBvciBpcyBzdGFsZS5IZXhlY3V0ZV9vdmVyd2VpZ2h0EAE4bWVzc2FnZV9vcmlnaW7FBgFITWVzc2FnZU9yaWdpbk9mPFQ+AAEQcGFnZRABJFBhZ2VJbmRleAABFGluZGV4EAEcVDo6U2l6ZQABMHdlaWdodF9saW1pdCgBGFdlaWdodAABNHhFeGVjdXRlIGFuIG92ZXJ3ZWlnaHQgbWVzc2FnZS4ATQFUZW1wb3JhcnkgcHJvY2Vzc2luZyBlcnJvcnMgd2lsbCBiZSBwcm9wYWdhdGVkIHdoZXJlYXMgcGVybWFuZW50IGVycm9ycyBhcmUgdHJlYXRlZFRhcyBzdWNjZXNzIGNvbmRpdGlvbi4AdC0gYG9yaWdpbmA6IE11c3QgYmUgYFNpZ25lZGAuNQEtIGBtZXNzYWdlX29yaWdpbmA6IFRoZSBvcmlnaW4gZnJvbSB3aGljaCB0aGUgbWVzc2FnZSB0byBiZSBleGVjdXRlZCBhcnJpdmVkLj0BLSBgcGFnZWA6IFRoZSBwYWdlIGluIHRoZSBxdWV1ZSBpbiB3aGljaCB0aGUgbWVzc2FnZSB0byBiZSBleGVjdXRlZCBpcyBzaXR0aW5nLgkBLSBgaW5kZXhgOiBUaGUgaW5kZXggaW50byB0aGUgcXVldWUgb2YgdGhlIG1lc3NhZ2UgdG8gYmUgZXhlY3V0ZWQuWQEtIGB3ZWlnaHRfbGltaXRgOiBUaGUgbWF4aW11bSBhbW91bnQgb2Ygd2VpZ2h0IGFsbG93ZWQgdG8gYmUgY29uc3VtZWQgaW4gdGhlIGV4ZWN1dGlvbkQgIG9mIHRoZSBtZXNzYWdlLgD0QmVuY2htYXJrIGNvbXBsZXhpdHkgY29uc2lkZXJhdGlvbnM6IE8oaW5kZXggKyB3ZWlnaHRfbGltaXQpLgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy7FBgxscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zJGluY2x1c2lvblhBZ2dyZWdhdGVNZXNzYWdlT3JpZ2luAAEEDFVtcAQAyQYBKFVtcFF1ZXVlSWQAAAAAyQYMbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucyRpbmNsdXNpb24oVW1wUXVldWVJZAABBBBQYXJhBACNAgEYUGFyYUlkAAAAAM0GDERwYWxsZXRfYXNzZXRfcmF0ZRhwYWxsZXQQQ2FsbAQEVAABDBhjcmVhdGUIAShhc3NldF9raW5k3AFEQm94PFQ6OkFzc2V0S2luZD4AARByYXRl0QYBJEZpeGVkVTEyOAAAEA0BSW5pdGlhbGl6ZSBhIGNvbnZlcnNpb24gcmF0ZSB0byBuYXRpdmUgYmFsYW5jZSBmb3IgdGhlIGdpdmVuIGFzc2V0LgA0IyMgQ29tcGxleGl0eRgtIE8oMSkYdXBkYXRlCAEoYXNzZXRfa2luZNwBREJveDxUOjpBc3NldEtpbmQ+AAEQcmF0ZdEGASRGaXhlZFUxMjgAARAFAVVwZGF0ZSB0aGUgY29udmVyc2lvbiByYXRlIHRvIG5hdGl2ZSBiYWxhbmNlIGZvciB0aGUgZ2l2ZW4gYXNzZXQuADQjIyBDb21wbGV4aXR5GC0gTygxKRhyZW1vdmUEAShhc3NldF9raW5k3AFEQm94PFQ6OkFzc2V0S2luZD4AAhAlAVJlbW92ZSBhbiBleGlzdGluZyBjb252ZXJzaW9uIHJhdGUgdG8gbmF0aXZlIGJhbGFuY2UgZm9yIHRoZSBnaXZlbiBhc3NldC4ANCMjIENvbXBsZXhpdHkYLSBPKDEpBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLtEGDDRzcF9hcml0aG1ldGljLGZpeGVkX3BvaW50JEZpeGVkVTEyOAAABAAYARB1MTI4AADVBgwwcGFsbGV0X2JlZWZ5GHBhbGxldBBDYWxsBARUAAEMTHJlcG9ydF9lcXVpdm9jYXRpb24IAUhlcXVpdm9jYXRpb25fcHJvb2bZBgGNAUJveDxEb3VibGVWb3RpbmdQcm9vZjxCbG9ja051bWJlckZvcjxUPiwgVDo6QmVlZnlJZCw8VDo6QmVlZnlJZAphcyBSdW50aW1lQXBwUHVibGljPjo6U2lnbmF0dXJlLD4sPgABPGtleV9vd25lcl9wcm9vZq0BAUBUOjpLZXlPd25lclByb29mAAAQCQFSZXBvcnQgdm90ZXIgZXF1aXZvY2F0aW9uL21pc2JlaGF2aW9yLiBUaGlzIG1ldGhvZCB3aWxsIHZlcmlmeSB0aGX0ZXF1aXZvY2F0aW9uIHByb29mIGFuZCB2YWxpZGF0ZSB0aGUgZ2l2ZW4ga2V5IG93bmVyc2hpcCBwcm9vZvhhZ2FpbnN0IHRoZSBleHRyYWN0ZWQgb2ZmZW5kZXIuIElmIGJvdGggYXJlIHZhbGlkLCB0aGUgb2ZmZW5jZUR3aWxsIGJlIHJlcG9ydGVkLnByZXBvcnRfZXF1aXZvY2F0aW9uX3Vuc2lnbmVkCAFIZXF1aXZvY2F0aW9uX3Byb29m2QYBjQFCb3g8RG91YmxlVm90aW5nUHJvb2Y8QmxvY2tOdW1iZXJGb3I8VD4sIFQ6OkJlZWZ5SWQsPFQ6OkJlZWZ5SWQKYXMgUnVudGltZUFwcFB1YmxpYz46OlNpZ25hdHVyZSw+LD4AATxrZXlfb3duZXJfcHJvb2atAQFAVDo6S2V5T3duZXJQcm9vZgABJAkBUmVwb3J0IHZvdGVyIGVxdWl2b2NhdGlvbi9taXNiZWhhdmlvci4gVGhpcyBtZXRob2Qgd2lsbCB2ZXJpZnkgdGhl9GVxdWl2b2NhdGlvbiBwcm9vZiBhbmQgdmFsaWRhdGUgdGhlIGdpdmVuIGtleSBvd25lcnNoaXAgcHJvb2b4YWdhaW5zdCB0aGUgZXh0cmFjdGVkIG9mZmVuZGVyLiBJZiBib3RoIGFyZSB2YWxpZCwgdGhlIG9mZmVuY2VEd2lsbCBiZSByZXBvcnRlZC4ADQFUaGlzIGV4dHJpbnNpYyBtdXN0IGJlIGNhbGxlZCB1bnNpZ25lZCBhbmQgaXQgaXMgZXhwZWN0ZWQgdGhhdCBvbmx5FQFibG9jayBhdXRob3JzIHdpbGwgY2FsbCBpdCAodmFsaWRhdGVkIGluIGBWYWxpZGF0ZVVuc2lnbmVkYCksIGFzIHN1Y2gVAWlmIHRoZSBibG9jayBhdXRob3IgaXMgZGVmaW5lZCBpdCB3aWxsIGJlIGRlZmluZWQgYXMgdGhlIGVxdWl2b2NhdGlvbiRyZXBvcnRlci48c2V0X25ld19nZW5lc2lzBAE8ZGVsYXlfaW5fYmxvY2tzEAFEQmxvY2tOdW1iZXJGb3I8VD4AAhBdAVJlc2V0IEJFRUZZIGNvbnNlbnN1cyBieSBzZXR0aW5nIGEgbmV3IEJFRUZZIGdlbmVzaXMgYXQgYGRlbGF5X2luX2Jsb2Nrc2AgYmxvY2tzIGluIHRoZRxmdXR1cmUuALROb3RlOiBgZGVsYXlfaW5fYmxvY2tzYCBoYXMgdG8gYmUgYXQgbGVhc3QgMS4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMu2QYISHNwX2NvbnNlbnN1c19iZWVmeUREb3VibGVWb3RpbmdQcm9vZgwYTnVtYmVyARAISWQBKQIkU2lnbmF0dXJlAd0GAAgBFGZpcnN04QYBiFZvdGVNZXNzYWdlPE51bWJlciwgSWQsIFNpZ25hdHVyZT4AARhzZWNvbmThBgGIVm90ZU1lc3NhZ2U8TnVtYmVyLCBJZCwgU2lnbmF0dXJlPgAA3QYMSHNwX2NvbnNlbnN1c19iZWVmeTBlY2RzYV9jcnlwdG8kU2lnbmF0dXJlAAAEANkCAUBlY2RzYTo6U2lnbmF0dXJlAADhBghIc3BfY29uc2Vuc3VzX2JlZWZ5LFZvdGVNZXNzYWdlDBhOdW1iZXIBEAhJZAEpAiRTaWduYXR1cmUB3QYADAEoY29tbWl0bWVudOUGAUhDb21taXRtZW50PE51bWJlcj4AAQhpZCkCAQhJZAABJHNpZ25hdHVyZd0GASRTaWduYXR1cmUAAOUGDEhzcF9jb25zZW5zdXNfYmVlZnkoY29tbWl0bWVudChDb21taXRtZW50BDBUQmxvY2tOdW1iZXIBEAAMARxwYXlsb2Fk6QYBHFBheWxvYWQAATBibG9ja19udW1iZXIQATBUQmxvY2tOdW1iZXIAAUB2YWxpZGF0b3Jfc2V0X2lkMAE4VmFsaWRhdG9yU2V0SWQAAOkGDEhzcF9jb25zZW5zdXNfYmVlZnkccGF5bG9hZBxQYXlsb2FkAAAEAO0GAXhWZWM8KEJlZWZ5UGF5bG9hZElkLCBWZWM8dTg+KT4AAO0GAAAC8QYA8QYAAAQI9QY4APUGAAADAgAAAAgA+QYQXHBvbGthZG90X3J1bnRpbWVfY29tbW9uSHBhcmFzX3N1ZG9fd3JhcHBlchhwYWxsZXQQQ2FsbAQEVAABGHRzdWRvX3NjaGVkdWxlX3BhcmFfaW5pdGlhbGl6ZQgBCGlkjQIBGFBhcmFJZAABHGdlbmVzaXP9BgE8UGFyYUdlbmVzaXNBcmdzAAAUDQFTY2hlZHVsZSBhIHBhcmEgdG8gYmUgaW5pdGlhbGl6ZWQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBuZXh0IHNlc3Npb24uAE0BVGhpcyBzaG91bGQgb25seSBiZSB1c2VkIGZvciBURVNUSU5HIGFuZCBub3Qgb24gUFJPRFVDVElPTiBjaGFpbnMuIEl0IGF1dG9tYXRpY2FsbHlJAWFzc2lnbnMgQ29yZXRpbWUgdG8gdGhlIGNoYWluIGFuZCBpbmNyZWFzZXMgdGhlIG51bWJlciBvZiBjb3Jlcy4gVGh1cywgdGhlcmUgaXMgbm+AcnVubmluZyBjb3JldGltZSBjaGFpbiByZXF1aXJlZC5oc3Vkb19zY2hlZHVsZV9wYXJhX2NsZWFudXAEAQhpZI0CARhQYXJhSWQAAQQJAVNjaGVkdWxlIGEgcGFyYSB0byBiZSBjbGVhbmVkIHVwIGF0IHRoZSBzdGFydCBvZiB0aGUgbmV4dCBzZXNzaW9uLoBzdWRvX3NjaGVkdWxlX3BhcmF0aHJlYWRfdXBncmFkZQQBCGlkjQIBGFBhcmFJZAACBB0BVXBncmFkZSBhIHBhcmF0aHJlYWQgKG9uLWRlbWFuZCBwYXJhY2hhaW4pIHRvIGEgbGVhc2UgaG9sZGluZyBwYXJhY2hhaW6Ec3Vkb19zY2hlZHVsZV9wYXJhY2hhaW5fZG93bmdyYWRlBAEIaWSNAgEYUGFyYUlkAAME9ERvd25ncmFkZSBhIGxlYXNlIGhvbGRpbmcgcGFyYWNoYWluIHRvIGFuIG9uLWRlbWFuZCBwYXJhY2hhaW5cc3Vkb19xdWV1ZV9kb3dud2FyZF94Y20IAQhpZI0CARhQYXJhSWQAAQx4Y22JBQF4Qm94PHhjbTo6b3BhcXVlOjpWZXJzaW9uZWRYY20+AAQQmFNlbmQgYSBkb3dud2FyZCBYQ00gdG8gdGhlIGdpdmVuIHBhcmEuAFEBVGhlIGdpdmVuIHBhcmFjaGFpbiBzaG91bGQgZXhpc3QgYW5kIHRoZSBwYXlsb2FkIHNob3VsZCBub3QgZXhjZWVkIHRoZSBwcmVjb25maWd1cmVkoHNpemUgYGNvbmZpZy5tYXhfZG93bndhcmRfbWVzc2FnZV9zaXplYC5sc3Vkb19lc3RhYmxpc2hfaHJtcF9jaGFubmVsEAEYc2VuZGVyjQIBGFBhcmFJZAABJHJlY2lwaWVudI0CARhQYXJhSWQAATBtYXhfY2FwYWNpdHkQAQx1MzIAAUBtYXhfbWVzc2FnZV9zaXplEAEMdTMyAAUQAQFGb3JjZWZ1bGx5IGVzdGFibGlzaCBhIGNoYW5uZWwgZnJvbSB0aGUgc2VuZGVyIHRvIHRoZSByZWNpcGllbnQuAFUBVGhpcyBpcyBlcXVpdmFsZW50IHRvIHNlbmRpbmcgYW4gYEhybXA6OmhybXBfaW5pdF9vcGVuX2NoYW5uZWxgIGV4dHJpbnNpYyBmb2xsb3dlZCBieYRgSHJtcDo6aHJtcF9hY2NlcHRfb3Blbl9jaGFubmVsYC4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMu/QYMbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucxRwYXJhczxQYXJhR2VuZXNpc0FyZ3MAAAwBMGdlbmVzaXNfaGVhZNkEASBIZWFkRGF0YQABPHZhbGlkYXRpb25fY29kZdUEAThWYWxpZGF0aW9uQ29kZQABJHBhcmFfa2luZCABIFBhcmFLaW5kAAABBwwscGFsbGV0X3N1ZG8YcGFsbGV0EENhbGwEBFQAARQQc3VkbwQBEGNhbGx1AQF8Qm94PDxUIGFzIENvbmZpZz46OlJ1bnRpbWVDYWxsPgAABDUBQXV0aGVudGljYXRlcyB0aGUgc3VkbyBrZXkgYW5kIGRpc3BhdGNoZXMgYSBmdW5jdGlvbiBjYWxsIHdpdGggYFJvb3RgIG9yaWdpbi5Uc3Vkb191bmNoZWNrZWRfd2VpZ2h0CAEQY2FsbHUBAXxCb3g8PFQgYXMgQ29uZmlnPjo6UnVudGltZUNhbGw+AAEYd2VpZ2h0KAEYV2VpZ2h0AAEUNQFBdXRoZW50aWNhdGVzIHRoZSBzdWRvIGtleSBhbmQgZGlzcGF0Y2hlcyBhIGZ1bmN0aW9uIGNhbGwgd2l0aCBgUm9vdGAgb3JpZ2luLi0BVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBjaGVjayB0aGUgd2VpZ2h0IG9mIHRoZSBjYWxsLCBhbmQgaW5zdGVhZCBhbGxvd3MgdGhlsFN1ZG8gdXNlciB0byBzcGVjaWZ5IHRoZSB3ZWlnaHQgb2YgdGhlIGNhbGwuAMxUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXy4cc2V0X2tleQQBDG5ld8UBAVBBY2NvdW50SWRMb29rdXBPZjxUPgACCF0BQXV0aGVudGljYXRlcyB0aGUgY3VycmVudCBzdWRvIGtleSBhbmQgc2V0cyB0aGUgZ2l2ZW4gQWNjb3VudElkIChgbmV3YCkgYXMgdGhlIG5ldyBzdWRvEGtleS4cc3Vkb19hcwgBDHdob8UBAVBBY2NvdW50SWRMb29rdXBPZjxUPgABEGNhbGx1AQF8Qm94PDxUIGFzIENvbmZpZz46OlJ1bnRpbWVDYWxsPgADEE0BQXV0aGVudGljYXRlcyB0aGUgc3VkbyBrZXkgYW5kIGRpc3BhdGNoZXMgYSBmdW5jdGlvbiBjYWxsIHdpdGggYFNpZ25lZGAgb3JpZ2luIGZyb21AYSBnaXZlbiBhY2NvdW50LgDMVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uKHJlbW92ZV9rZXkABAyEUGVybWFuZW50bHkgcmVtb3ZlcyB0aGUgc3VkbyBrZXkuAGwqKlRoaXMgY2Fubm90IGJlIHVuLWRvbmUuKioEDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMuBQcMKHNwX3J1bnRpbWUYdHJhaXRzLEJsYWtlVHdvMjU2AAAAAAkHDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBCARTAAAEADgBGFZlYzxUPgAADQcMYHBhbGxldF9jb252aWN0aW9uX3ZvdGluZxR0eXBlcxRUYWxseQgUVm90ZXMBGBRUb3RhbAAADAEQYXllcxgBFFZvdGVzAAEQbmF5cxgBFFZvdGVzAAEcc3VwcG9ydBgBFFZvdGVzAAARBwxAcGFsbGV0X3doaXRlbGlzdBhwYWxsZXQURXZlbnQEBFQAAQw8Q2FsbFdoaXRlbGlzdGVkBAEkY2FsbF9oYXNoNAEcVDo6SGFzaAAAAFhXaGl0ZWxpc3RlZENhbGxSZW1vdmVkBAEkY2FsbF9oYXNoNAEcVDo6SGFzaAABAGRXaGl0ZWxpc3RlZENhbGxEaXNwYXRjaGVkCAEkY2FsbF9oYXNoNAEcVDo6SGFzaAABGHJlc3VsdBUHAWhEaXNwYXRjaFJlc3VsdFdpdGhQb3N0SW5mbwACAAR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldBUHBBhSZXN1bHQIBFQBGQcERQEhBwEICE9rBAAZBwAAAAAMRXJyBAAhBwAAAQAAGQcMNGZyYW1lX3N1cHBvcnQgZGlzcGF0Y2hAUG9zdERpc3BhdGNoSW5mbwAACAE0YWN0dWFsX3dlaWdodB0HAThPcHRpb248V2VpZ2h0PgABIHBheXNfZmVlZAEQUGF5cwAAHQcEGE9wdGlvbgQEVAEoAQgQTm9uZQAAABBTb21lBAAoAAABAAAhBwgoc3BfcnVudGltZWREaXNwYXRjaEVycm9yV2l0aFBvc3RJbmZvBBBJbmZvARkHAAgBJHBvc3RfaW5mbxkHARBJbmZvAAEUZXJyb3JoATREaXNwYXRjaEVycm9yAAAlBwxEcGFsbGV0X3BhcmFtZXRlcnMYcGFsbGV0FEV2ZW50BARUAAEEHFVwZGF0ZWQMAQxrZXkpBwHEPFQ6OlJ1bnRpbWVQYXJhbWV0ZXJzIGFzIEFnZ3JlZ2F0ZWRLZXlWYWx1ZT46OktleQRkVGhlIGtleSB0aGF0IHdhcyB1cGRhdGVkLgEkb2xkX3ZhbHVlMQcB7E9wdGlvbjw8VDo6UnVudGltZVBhcmFtZXRlcnMgYXMgQWdncmVnYXRlZEtleVZhbHVlPjo6VmFsdWU+BHxUaGUgb2xkIHZhbHVlIGJlZm9yZSB0aGlzIGNhbGwuASRuZXdfdmFsdWUxBwHsT3B0aW9uPDxUOjpSdW50aW1lUGFyYW1ldGVycyBhcyBBZ2dyZWdhdGVkS2V5VmFsdWU+OjpWYWx1ZT4EeFRoZSBuZXcgdmFsdWUgYWZ0ZXIgdGhpcyBjYWxsLgAMUEEgUGFyYW1ldGVyIHdhcyBzZXQuALxJcyBhbHNvIGVtaXR0ZWQgd2hlbiB0aGUgdmFsdWUgd2FzIG5vdCBjaGFuZ2VkLgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldCkHCDRwYXNlb19ydW50aW1lUFJ1bnRpbWVQYXJhbWV0ZXJzS2V5AAEEJEluZmxhdGlvbgQALQcBqQE8ZHluYW1pY19wYXJhbXM6OmluZmxhdGlvbjo6UGFyYW1ldGVycyBhcyBmcmFtZV9zdXBwb3J0Ojp0cmFpdHM6OgpkeW5hbWljX3BhcmFtczo6QWdncmVnYXRlZEtleVZhbHVlPjo6S2V5AAAAAC0HEDRwYXNlb19ydW50aW1lOGR5bmFtaWNfcGFyYW1zJGluZmxhdGlvbjRQYXJhbWV0ZXJzS2V5AAEUME1pbkluZmxhdGlvbgQAsQIBME1pbkluZmxhdGlvbgAAADBNYXhJbmZsYXRpb24EAL0CATBNYXhJbmZsYXRpb24AAQAoSWRlYWxTdGFrZQQAwQIBKElkZWFsU3Rha2UAAgAcRmFsbG9mZgQAxQIBHEZhbGxvZmYAAwA8VXNlQXVjdGlvblNsb3RzBADJAgE8VXNlQXVjdGlvblNsb3RzAAQAADEHBBhPcHRpb24EBFQBNQcBCBBOb25lAAAAEFNvbWUEADUHAAABAAA1Bwg0cGFzZW9fcnVudGltZVhSdW50aW1lUGFyYW1ldGVyc1ZhbHVlAAEEJEluZmxhdGlvbgQAOQcBsQE8ZHluYW1pY19wYXJhbXM6OmluZmxhdGlvbjo6UGFyYW1ldGVycyBhcyBmcmFtZV9zdXBwb3J0Ojp0cmFpdHM6OgpkeW5hbWljX3BhcmFtczo6QWdncmVnYXRlZEtleVZhbHVlPjo6VmFsdWUAAAAAOQcQNHBhc2VvX3J1bnRpbWU4ZHluYW1pY19wYXJhbXMkaW5mbGF0aW9uPFBhcmFtZXRlcnNWYWx1ZQABFDBNaW5JbmZsYXRpb24EALkCASxQZXJxdWludGlsbAAAADBNYXhJbmZsYXRpb24EALkCASxQZXJxdWludGlsbAABAChJZGVhbFN0YWtlBAC5AgEsUGVycXVpbnRpbGwAAgAcRmFsbG9mZgQAuQIBLFBlcnF1aW50aWxsAAMAPFVzZUF1Y3Rpb25TbG90cwQAIAEQYm9vbAAEAAA9BxBccG9sa2Fkb3RfcnVudGltZV9jb21tb24YY2xhaW1zGHBhbGxldBRFdmVudAQEVAABBBxDbGFpbWVkDAEMd2hvAAEwVDo6QWNjb3VudElkAAFAZXRoZXJldW1fYWRkcmVzc90CATxFdGhlcmV1bUFkZHJlc3MAARhhbW91bnQYATBCYWxhbmNlT2Y8VD4AAARoU29tZW9uZSBjbGFpbWVkIHNvbWUgRE9Ucy4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXRBBww4cGFsbGV0X3Zlc3RpbmcYcGFsbGV0FEV2ZW50BARUAAEIOFZlc3RpbmdVcGRhdGVkCAEcYWNjb3VudAABMFQ6OkFjY291bnRJZAABIHVudmVzdGVkGAEwQmFsYW5jZU9mPFQ+AAAIUQFUaGUgYW1vdW50IHZlc3RlZCBoYXMgYmVlbiB1cGRhdGVkLiBUaGlzIGNvdWxkIGluZGljYXRlIGEgY2hhbmdlIGluIGZ1bmRzIGF2YWlsYWJsZS4lAVRoZSBiYWxhbmNlIGdpdmVuIGlzIHRoZSBhbW91bnQgd2hpY2ggaXMgbGVmdCB1bnZlc3RlZCAoYW5kIHRodXMgbG9ja2VkKS5AVmVzdGluZ0NvbXBsZXRlZAQBHGFjY291bnQAATBUOjpBY2NvdW50SWQAAQScQW4gXFthY2NvdW50XF0gaGFzIGJlY29tZSBmdWxseSB2ZXN0ZWQuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0RQcMOHBhbGxldF91dGlsaXR5GHBhbGxldBRFdmVudAABGEBCYXRjaEludGVycnVwdGVkCAEUaW5kZXgQAQx1MzIAARRlcnJvcmgBNERpc3BhdGNoRXJyb3IAAAhVAUJhdGNoIG9mIGRpc3BhdGNoZXMgZGlkIG5vdCBjb21wbGV0ZSBmdWxseS4gSW5kZXggb2YgZmlyc3QgZmFpbGluZyBkaXNwYXRjaCBnaXZlbiwgYXNId2VsbCBhcyB0aGUgZXJyb3IuOEJhdGNoQ29tcGxldGVkAAEEyEJhdGNoIG9mIGRpc3BhdGNoZXMgY29tcGxldGVkIGZ1bGx5IHdpdGggbm8gZXJyb3IuYEJhdGNoQ29tcGxldGVkV2l0aEVycm9ycwACBLRCYXRjaCBvZiBkaXNwYXRjaGVzIGNvbXBsZXRlZCBidXQgaGFzIGVycm9ycy40SXRlbUNvbXBsZXRlZAADBB0BQSBzaW5nbGUgaXRlbSB3aXRoaW4gYSBCYXRjaCBvZiBkaXNwYXRjaGVzIGhhcyBjb21wbGV0ZWQgd2l0aCBubyBlcnJvci4oSXRlbUZhaWxlZAQBFGVycm9yaAE0RGlzcGF0Y2hFcnJvcgAEBBEBQSBzaW5nbGUgaXRlbSB3aXRoaW4gYSBCYXRjaCBvZiBkaXNwYXRjaGVzIGhhcyBjb21wbGV0ZWQgd2l0aCBlcnJvci4wRGlzcGF0Y2hlZEFzBAEYcmVzdWx0iAE4RGlzcGF0Y2hSZXN1bHQABQRYQSBjYWxsIHdhcyBkaXNwYXRjaGVkLgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldEkHDDBwYWxsZXRfcHJveHkYcGFsbGV0FEV2ZW50BARUAAEUNFByb3h5RXhlY3V0ZWQEARhyZXN1bHSIAThEaXNwYXRjaFJlc3VsdAAABLxBIHByb3h5IHdhcyBleGVjdXRlZCBjb3JyZWN0bHksIHdpdGggdGhlIGdpdmVuLixQdXJlQ3JlYXRlZBABEHB1cmUAATBUOjpBY2NvdW50SWQAAQx3aG8AATBUOjpBY2NvdW50SWQAAShwcm94eV90eXBlCQMBMFQ6OlByb3h5VHlwZQABUGRpc2FtYmlndWF0aW9uX2luZGV4bQEBDHUxNgABCNxBIHB1cmUgYWNjb3VudCBoYXMgYmVlbiBjcmVhdGVkIGJ5IG5ldyBwcm94eSB3aXRoIGdpdmVukGRpc2FtYmlndWF0aW9uIGluZGV4IGFuZCBwcm94eSB0eXBlLiRBbm5vdW5jZWQMARByZWFsAAEwVDo6QWNjb3VudElkAAEUcHJveHkAATBUOjpBY2NvdW50SWQAASRjYWxsX2hhc2g0ATRDYWxsSGFzaE9mPFQ+AAIE4EFuIGFubm91bmNlbWVudCB3YXMgcGxhY2VkIHRvIG1ha2UgYSBjYWxsIGluIHRoZSBmdXR1cmUuKFByb3h5QWRkZWQQASRkZWxlZ2F0b3IAATBUOjpBY2NvdW50SWQAASRkZWxlZ2F0ZWUAATBUOjpBY2NvdW50SWQAAShwcm94eV90eXBlCQMBMFQ6OlByb3h5VHlwZQABFGRlbGF5EAFEQmxvY2tOdW1iZXJGb3I8VD4AAwRIQSBwcm94eSB3YXMgYWRkZWQuMFByb3h5UmVtb3ZlZBABJGRlbGVnYXRvcgABMFQ6OkFjY291bnRJZAABJGRlbGVnYXRlZQABMFQ6OkFjY291bnRJZAABKHByb3h5X3R5cGUJAwEwVDo6UHJveHlUeXBlAAEUZGVsYXkQAURCbG9ja051bWJlckZvcjxUPgAEBFBBIHByb3h5IHdhcyByZW1vdmVkLgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldE0HDDxwYWxsZXRfbXVsdGlzaWcYcGFsbGV0FEV2ZW50BARUAAEQLE5ld011bHRpc2lnDAEkYXBwcm92aW5nAAEwVDo6QWNjb3VudElkAAEgbXVsdGlzaWcAATBUOjpBY2NvdW50SWQAASRjYWxsX2hhc2gEASBDYWxsSGFzaAAABIxBIG5ldyBtdWx0aXNpZyBvcGVyYXRpb24gaGFzIGJlZ3VuLkBNdWx0aXNpZ0FwcHJvdmFsEAEkYXBwcm92aW5nAAEwVDo6QWNjb3VudElkAAEkdGltZXBvaW50FQMBcFRpbWVwb2ludDxCbG9ja051bWJlckZvcjxUPj4AASBtdWx0aXNpZwABMFQ6OkFjY291bnRJZAABJGNhbGxfaGFzaAQBIENhbGxIYXNoAAEEyEEgbXVsdGlzaWcgb3BlcmF0aW9uIGhhcyBiZWVuIGFwcHJvdmVkIGJ5IHNvbWVvbmUuQE11bHRpc2lnRXhlY3V0ZWQUASRhcHByb3ZpbmcAATBUOjpBY2NvdW50SWQAASR0aW1lcG9pbnQVAwFwVGltZXBvaW50PEJsb2NrTnVtYmVyRm9yPFQ+PgABIG11bHRpc2lnAAEwVDo6QWNjb3VudElkAAEkY2FsbF9oYXNoBAEgQ2FsbEhhc2gAARhyZXN1bHSIAThEaXNwYXRjaFJlc3VsdAACBJxBIG11bHRpc2lnIG9wZXJhdGlvbiBoYXMgYmVlbiBleGVjdXRlZC5ETXVsdGlzaWdDYW5jZWxsZWQQAShjYW5jZWxsaW5nAAEwVDo6QWNjb3VudElkAAEkdGltZXBvaW50FQMBcFRpbWVwb2ludDxCbG9ja051bWJlckZvcjxUPj4AASBtdWx0aXNpZwABMFQ6OkFjY291bnRJZAABJGNhbGxfaGFzaAQBIENhbGxIYXNoAAMEoEEgbXVsdGlzaWcgb3BlcmF0aW9uIGhhcyBiZWVuIGNhbmNlbGxlZC4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXRRBww8cGFsbGV0X2JvdW50aWVzGHBhbGxldBRFdmVudAgEVAAESQABLDhCb3VudHlQcm9wb3NlZAQBFGluZGV4EAEsQm91bnR5SW5kZXgAAARQTmV3IGJvdW50eSBwcm9wb3NhbC44Qm91bnR5UmVqZWN0ZWQIARRpbmRleBABLEJvdW50eUluZGV4AAEQYm9uZBgBPEJhbGFuY2VPZjxULCBJPgABBMxBIGJvdW50eSBwcm9wb3NhbCB3YXMgcmVqZWN0ZWQ7IGZ1bmRzIHdlcmUgc2xhc2hlZC5IQm91bnR5QmVjYW1lQWN0aXZlBAEUaW5kZXgQASxCb3VudHlJbmRleAACBLhBIGJvdW50eSBwcm9wb3NhbCBpcyBmdW5kZWQgYW5kIGJlY2FtZSBhY3RpdmUuNEJvdW50eUF3YXJkZWQIARRpbmRleBABLEJvdW50eUluZGV4AAEsYmVuZWZpY2lhcnkAATBUOjpBY2NvdW50SWQAAwSUQSBib3VudHkgaXMgYXdhcmRlZCB0byBhIGJlbmVmaWNpYXJ5LjRCb3VudHlDbGFpbWVkDAEUaW5kZXgQASxCb3VudHlJbmRleAABGHBheW91dBgBPEJhbGFuY2VPZjxULCBJPgABLGJlbmVmaWNpYXJ5AAEwVDo6QWNjb3VudElkAAQEjEEgYm91bnR5IGlzIGNsYWltZWQgYnkgYmVuZWZpY2lhcnkuOEJvdW50eUNhbmNlbGVkBAEUaW5kZXgQASxCb3VudHlJbmRleAAFBFhBIGJvdW50eSBpcyBjYW5jZWxsZWQuOEJvdW50eUV4dGVuZGVkBAEUaW5kZXgQASxCb3VudHlJbmRleAAGBHBBIGJvdW50eSBleHBpcnkgaXMgZXh0ZW5kZWQuOEJvdW50eUFwcHJvdmVkBAEUaW5kZXgQASxCb3VudHlJbmRleAAHBFRBIGJvdW50eSBpcyBhcHByb3ZlZC48Q3VyYXRvclByb3Bvc2VkCAEkYm91bnR5X2lkEAEsQm91bnR5SW5kZXgAARxjdXJhdG9yAAEwVDo6QWNjb3VudElkAAgEdEEgYm91bnR5IGN1cmF0b3IgaXMgcHJvcG9zZWQuREN1cmF0b3JVbmFzc2lnbmVkBAEkYm91bnR5X2lkEAEsQm91bnR5SW5kZXgACQR8QSBib3VudHkgY3VyYXRvciBpcyB1bmFzc2lnbmVkLjxDdXJhdG9yQWNjZXB0ZWQIASRib3VudHlfaWQQASxCb3VudHlJbmRleAABHGN1cmF0b3IAATBUOjpBY2NvdW50SWQACgR0QSBib3VudHkgY3VyYXRvciBpcyBhY2NlcHRlZC4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXRVBwxUcGFsbGV0X2NoaWxkX2JvdW50aWVzGHBhbGxldBRFdmVudAQEVAABEBRBZGRlZAgBFGluZGV4EAEsQm91bnR5SW5kZXgAASxjaGlsZF9pbmRleBABLEJvdW50eUluZGV4AAAEYEEgY2hpbGQtYm91bnR5IGlzIGFkZGVkLhxBd2FyZGVkDAEUaW5kZXgQASxCb3VudHlJbmRleAABLGNoaWxkX2luZGV4EAEsQm91bnR5SW5kZXgAASxiZW5lZmljaWFyeQABMFQ6OkFjY291bnRJZAABBKxBIGNoaWxkLWJvdW50eSBpcyBhd2FyZGVkIHRvIGEgYmVuZWZpY2lhcnkuHENsYWltZWQQARRpbmRleBABLEJvdW50eUluZGV4AAEsY2hpbGRfaW5kZXgQASxCb3VudHlJbmRleAABGHBheW91dBgBMEJhbGFuY2VPZjxUPgABLGJlbmVmaWNpYXJ5AAEwVDo6QWNjb3VudElkAAIEpEEgY2hpbGQtYm91bnR5IGlzIGNsYWltZWQgYnkgYmVuZWZpY2lhcnkuIENhbmNlbGVkCAEUaW5kZXgQASxCb3VudHlJbmRleAABLGNoaWxkX2luZGV4EAEsQm91bnR5SW5kZXgAAwRwQSBjaGlsZC1ib3VudHkgaXMgY2FuY2VsbGVkLgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldFkHDJBwYWxsZXRfZWxlY3Rpb25fcHJvdmlkZXJfbXVsdGlfcGhhc2UYcGFsbGV0FEV2ZW50BARUAAEYOFNvbHV0aW9uU3RvcmVkDAEcY29tcHV0ZV0HATxFbGVjdGlvbkNvbXB1dGUAARhvcmlnaW79AQFQT3B0aW9uPFQ6OkFjY291bnRJZD4AATBwcmV2X2VqZWN0ZWQgARBib29sAAActEEgc29sdXRpb24gd2FzIHN0b3JlZCB3aXRoIHRoZSBnaXZlbiBjb21wdXRlLgBRAVRoZSBgb3JpZ2luYCBpbmRpY2F0ZXMgdGhlIG9yaWdpbiBvZiB0aGUgc29sdXRpb24uIElmIGBvcmlnaW5gIGlzIGBTb21lKEFjY291bnRJZClgLFkBdGhlIHN0b3JlZCBzb2x1dGlvbiB3YXMgc3VibWl0dGVkIGluIHRoZSBzaWduZWQgcGhhc2UgYnkgYSBtaW5lciB3aXRoIHRoZSBgQWNjb3VudElkYC4lAU90aGVyd2lzZSwgdGhlIHNvbHV0aW9uIHdhcyBzdG9yZWQgZWl0aGVyIGR1cmluZyB0aGUgdW5zaWduZWQgcGhhc2Ugb3IgYnlNAWBUOjpGb3JjZU9yaWdpbmAuIFRoZSBgYm9vbGAgaXMgYHRydWVgIHdoZW4gYSBwcmV2aW91cyBzb2x1dGlvbiB3YXMgZWplY3RlZCB0byBtYWtlSHJvb20gZm9yIHRoaXMgb25lLkRFbGVjdGlvbkZpbmFsaXplZAgBHGNvbXB1dGVdBwE8RWxlY3Rpb25Db21wdXRlAAEUc2NvcmX1AwE0RWxlY3Rpb25TY29yZQABBBkBVGhlIGVsZWN0aW9uIGhhcyBiZWVuIGZpbmFsaXplZCwgd2l0aCB0aGUgZ2l2ZW4gY29tcHV0YXRpb24gYW5kIHNjb3JlLjhFbGVjdGlvbkZhaWxlZAACDExBbiBlbGVjdGlvbiBmYWlsZWQuAAEBTm90IG11Y2ggY2FuIGJlIHNhaWQgYWJvdXQgd2hpY2ggY29tcHV0ZXMgZmFpbGVkIGluIHRoZSBwcm9jZXNzLiBSZXdhcmRlZAgBHGFjY291bnQAAZg8VCBhcyBmcmFtZV9zeXN0ZW06OkNvbmZpZz46OkFjY291bnRJZAABFHZhbHVlGAEwQmFsYW5jZU9mPFQ+AAMEJQFBbiBhY2NvdW50IGhhcyBiZWVuIHJld2FyZGVkIGZvciB0aGVpciBzaWduZWQgc3VibWlzc2lvbiBiZWluZyBmaW5hbGl6ZWQuHFNsYXNoZWQIARxhY2NvdW50AAGYPFQgYXMgZnJhbWVfc3lzdGVtOjpDb25maWc+OjpBY2NvdW50SWQAARR2YWx1ZRgBMEJhbGFuY2VPZjxUPgAEBCEBQW4gYWNjb3VudCBoYXMgYmVlbiBzbGFzaGVkIGZvciBzdWJtaXR0aW5nIGFuIGludmFsaWQgc2lnbmVkIHN1Ym1pc3Npb24uRFBoYXNlVHJhbnNpdGlvbmVkDAEQZnJvbWEHAWBQaGFzZTxCbG9ja051bWJlckZvcjxUPj4AAQh0b2EHAWBQaGFzZTxCbG9ja051bWJlckZvcjxUPj4AARRyb3VuZBABDHUzMgAFBLhUaGVyZSB3YXMgYSBwaGFzZSB0cmFuc2l0aW9uIGluIGEgZ2l2ZW4gcm91bmQuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0XQcIkHBhbGxldF9lbGVjdGlvbl9wcm92aWRlcl9tdWx0aV9waGFzZTxFbGVjdGlvbkNvbXB1dGUAARQcT25DaGFpbgAAABhTaWduZWQAAQAgVW5zaWduZWQAAgAgRmFsbGJhY2sAAwAkRW1lcmdlbmN5AAQAAGEHCJBwYWxsZXRfZWxlY3Rpb25fcHJvdmlkZXJfbXVsdGlfcGhhc2UUUGhhc2UECEJuARABEAxPZmYAAAAYU2lnbmVkAAEAIFVuc2lnbmVkBABlBwEoKGJvb2wsIEJuKQACACRFbWVyZ2VuY3kAAwAAZQcAAAQIIBAAaQcMQHBhbGxldF9iYWdzX2xpc3QYcGFsbGV0FEV2ZW50CARUAARJAAEIIFJlYmFnZ2VkDAEMd2hvAAEwVDo6QWNjb3VudElkAAEQZnJvbTABIFQ6OlNjb3JlAAEIdG8wASBUOjpTY29yZQAABKRNb3ZlZCBhbiBhY2NvdW50IGZyb20gb25lIGJhZyB0byBhbm90aGVyLjBTY29yZVVwZGF0ZWQIAQx3aG8AATBUOjpBY2NvdW50SWQAASRuZXdfc2NvcmUwASBUOjpTY29yZQABBNhVcGRhdGVkIHRoZSBzY29yZSBvZiBzb21lIGFjY291bnQgdG8gdGhlIGdpdmVuIGFtb3VudC4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXRtBwxccGFsbGV0X25vbWluYXRpb25fcG9vbHMYcGFsbGV0FEV2ZW50BARUAAFIHENyZWF0ZWQIASRkZXBvc2l0b3IAATBUOjpBY2NvdW50SWQAARxwb29sX2lkEAEYUG9vbElkAAAEYEEgcG9vbCBoYXMgYmVlbiBjcmVhdGVkLhhCb25kZWQQARhtZW1iZXIAATBUOjpBY2NvdW50SWQAARxwb29sX2lkEAEYUG9vbElkAAEYYm9uZGVkGAEwQmFsYW5jZU9mPFQ+AAEYam9pbmVkIAEQYm9vbAABBJRBIG1lbWJlciBoYXMgYmVjYW1lIGJvbmRlZCBpbiBhIHBvb2wuHFBhaWRPdXQMARhtZW1iZXIAATBUOjpBY2NvdW50SWQAARxwb29sX2lkEAEYUG9vbElkAAEYcGF5b3V0GAEwQmFsYW5jZU9mPFQ+AAIEjEEgcGF5b3V0IGhhcyBiZWVuIG1hZGUgdG8gYSBtZW1iZXIuIFVuYm9uZGVkFAEYbWVtYmVyAAEwVDo6QWNjb3VudElkAAEccG9vbF9pZBABGFBvb2xJZAABHGJhbGFuY2UYATBCYWxhbmNlT2Y8VD4AARhwb2ludHMYATBCYWxhbmNlT2Y8VD4AAQxlcmEQASBFcmFJbmRleAADLJhBIG1lbWJlciBoYXMgdW5ib25kZWQgZnJvbSB0aGVpciBwb29sLgA5AS0gYGJhbGFuY2VgIGlzIHRoZSBjb3JyZXNwb25kaW5nIGJhbGFuY2Ugb2YgdGhlIG51bWJlciBvZiBwb2ludHMgdGhhdCBoYXMgYmVlblUBICByZXF1ZXN0ZWQgdG8gYmUgdW5ib25kZWQgKHRoZSBhcmd1bWVudCBvZiB0aGUgYHVuYm9uZGAgdHJhbnNhY3Rpb24pIGZyb20gdGhlIGJvbmRlZBwgIHBvb2wuRQEtIGBwb2ludHNgIGlzIHRoZSBudW1iZXIgb2YgcG9pbnRzIHRoYXQgYXJlIGlzc3VlZCBhcyBhIHJlc3VsdCBvZiBgYmFsYW5jZWAgYmVpbmfAZGlzc29sdmVkIGludG8gdGhlIGNvcnJlc3BvbmRpbmcgdW5ib25kaW5nIHBvb2wu5C0gYGVyYWAgaXMgdGhlIGVyYSBpbiB3aGljaCB0aGUgYmFsYW5jZSB3aWxsIGJlIHVuYm9uZGVkLlUBSW4gdGhlIGFic2VuY2Ugb2Ygc2xhc2hpbmcsIHRoZXNlIHZhbHVlcyB3aWxsIG1hdGNoLiBJbiB0aGUgcHJlc2VuY2Ugb2Ygc2xhc2hpbmcsIHRoZU0BbnVtYmVyIG9mIHBvaW50cyB0aGF0IGFyZSBpc3N1ZWQgaW4gdGhlIHVuYm9uZGluZyBwb29sIHdpbGwgYmUgbGVzcyB0aGFuIHRoZSBhbW91bnRkcmVxdWVzdGVkIHRvIGJlIHVuYm9uZGVkLiRXaXRoZHJhd24QARhtZW1iZXIAATBUOjpBY2NvdW50SWQAARxwb29sX2lkEAEYUG9vbElkAAEcYmFsYW5jZRgBMEJhbGFuY2VPZjxUPgABGHBvaW50cxgBMEJhbGFuY2VPZjxUPgAEGJxBIG1lbWJlciBoYXMgd2l0aGRyYXduIGZyb20gdGhlaXIgcG9vbC4AIQFUaGUgZ2l2ZW4gbnVtYmVyIG9mIGBwb2ludHNgIGhhdmUgYmVlbiBkaXNzb2x2ZWQgaW4gcmV0dXJuIG9mIGBiYWxhbmNlYC4AWQFTaW1pbGFyIHRvIGBVbmJvbmRlZGAgZXZlbnQsIGluIHRoZSBhYnNlbmNlIG9mIHNsYXNoaW5nLCB0aGUgcmF0aW8gb2YgcG9pbnQgdG8gYmFsYW5jZSh3aWxsIGJlIDEuJERlc3Ryb3llZAQBHHBvb2xfaWQQARhQb29sSWQABQRoQSBwb29sIGhhcyBiZWVuIGRlc3Ryb3llZC4wU3RhdGVDaGFuZ2VkCAEccG9vbF9pZBABGFBvb2xJZAABJG5ld19zdGF0ZSEEASRQb29sU3RhdGUABgR8VGhlIHN0YXRlIG9mIGEgcG9vbCBoYXMgY2hhbmdlZDRNZW1iZXJSZW1vdmVkCAEccG9vbF9pZBABGFBvb2xJZAABGG1lbWJlcgABMFQ6OkFjY291bnRJZAAHDJhBIG1lbWJlciBoYXMgYmVlbiByZW1vdmVkIGZyb20gYSBwb29sLgBRAVRoZSByZW1vdmFsIGNhbiBiZSB2b2x1bnRhcnkgKHdpdGhkcmF3biBhbGwgdW5ib25kZWQgZnVuZHMpIG9yIGludm9sdW50YXJ5IChraWNrZWQpLjBSb2xlc1VwZGF0ZWQMARByb290/QEBUE9wdGlvbjxUOjpBY2NvdW50SWQ+AAEcYm91bmNlcv0BAVBPcHRpb248VDo6QWNjb3VudElkPgABJG5vbWluYXRvcv0BAVBPcHRpb248VDo6QWNjb3VudElkPgAICFUBVGhlIHJvbGVzIG9mIGEgcG9vbCBoYXZlIGJlZW4gdXBkYXRlZCB0byB0aGUgZ2l2ZW4gbmV3IHJvbGVzLiBOb3RlIHRoYXQgdGhlIGRlcG9zaXRvckRjYW4gbmV2ZXIgY2hhbmdlLixQb29sU2xhc2hlZAgBHHBvb2xfaWQQARhQb29sSWQAARxiYWxhbmNlGAEwQmFsYW5jZU9mPFQ+AAkEDQFUaGUgYWN0aXZlIGJhbGFuY2Ugb2YgcG9vbCBgcG9vbF9pZGAgaGFzIGJlZW4gc2xhc2hlZCB0byBgYmFsYW5jZWAuUFVuYm9uZGluZ1Bvb2xTbGFzaGVkDAEccG9vbF9pZBABGFBvb2xJZAABDGVyYRABIEVyYUluZGV4AAEcYmFsYW5jZRgBMEJhbGFuY2VPZjxUPgAKBCUBVGhlIHVuYm9uZCBwb29sIGF0IGBlcmFgIG9mIHBvb2wgYHBvb2xfaWRgIGhhcyBiZWVuIHNsYXNoZWQgdG8gYGJhbGFuY2VgLlRQb29sQ29tbWlzc2lvblVwZGF0ZWQIARxwb29sX2lkEAEYUG9vbElkAAEcY3VycmVudDkEAXxPcHRpb248KFBlcmJpbGwsIFQ6OkFjY291bnRJZCk+AAsEtEEgcG9vbCdzIGNvbW1pc3Npb24gc2V0dGluZyBoYXMgYmVlbiBjaGFuZ2VkLmBQb29sTWF4Q29tbWlzc2lvblVwZGF0ZWQIARxwb29sX2lkEAEYUG9vbElkAAE4bWF4X2NvbW1pc3Npb26sARxQZXJiaWxsAAwE1EEgcG9vbCdzIG1heGltdW0gY29tbWlzc2lvbiBzZXR0aW5nIGhhcyBiZWVuIGNoYW5nZWQufFBvb2xDb21taXNzaW9uQ2hhbmdlUmF0ZVVwZGF0ZWQIARxwb29sX2lkEAEYUG9vbElkAAEsY2hhbmdlX3JhdGVBBAGcQ29tbWlzc2lvbkNoYW5nZVJhdGU8QmxvY2tOdW1iZXJGb3I8VD4+AA0EzEEgcG9vbCdzIGNvbW1pc3Npb24gYGNoYW5nZV9yYXRlYCBoYXMgYmVlbiBjaGFuZ2VkLpBQb29sQ29tbWlzc2lvbkNsYWltUGVybWlzc2lvblVwZGF0ZWQIARxwb29sX2lkEAEYUG9vbElkAAEocGVybWlzc2lvbkUEAbxPcHRpb248Q29tbWlzc2lvbkNsYWltUGVybWlzc2lvbjxUOjpBY2NvdW50SWQ+PgAOBMhQb29sIGNvbW1pc3Npb24gY2xhaW0gcGVybWlzc2lvbiBoYXMgYmVlbiB1cGRhdGVkLlRQb29sQ29tbWlzc2lvbkNsYWltZWQIARxwb29sX2lkEAEYUG9vbElkAAEoY29tbWlzc2lvbhgBMEJhbGFuY2VPZjxUPgAPBIRQb29sIGNvbW1pc3Npb24gaGFzIGJlZW4gY2xhaW1lZC5kTWluQmFsYW5jZURlZmljaXRBZGp1c3RlZAgBHHBvb2xfaWQQARhQb29sSWQAARhhbW91bnQYATBCYWxhbmNlT2Y8VD4AEATIVG9wcGVkIHVwIGRlZmljaXQgaW4gZnJvemVuIEVEIG9mIHRoZSByZXdhcmQgcG9vbC5gTWluQmFsYW5jZUV4Y2Vzc0FkanVzdGVkCAEccG9vbF9pZBABGFBvb2xJZAABGGFtb3VudBgBMEJhbGFuY2VPZjxUPgARBLxDbGFpbWVkIGV4Y2VzcyBmcm96ZW4gRUQgb2YgYWYgdGhlIHJld2FyZCBwb29sLgRYRXZlbnRzIG9mIHRoaXMgcGFsbGV0LnEHDExwYWxsZXRfZmFzdF91bnN0YWtlGHBhbGxldBRFdmVudAQEVAABFCBVbnN0YWtlZAgBFHN0YXNoAAEwVDo6QWNjb3VudElkAAEYcmVzdWx0iAE4RGlzcGF0Y2hSZXN1bHQAAARYQSBzdGFrZXIgd2FzIHVuc3Rha2VkLhxTbGFzaGVkCAEUc3Rhc2gAATBUOjpBY2NvdW50SWQAARhhbW91bnQYATBCYWxhbmNlT2Y8VD4AAQQZAUEgc3Rha2VyIHdhcyBzbGFzaGVkIGZvciByZXF1ZXN0aW5nIGZhc3QtdW5zdGFrZSB3aGlsc3QgYmVpbmcgZXhwb3NlZC4wQmF0Y2hDaGVja2VkBAEQZXJhc+UBATRWZWM8RXJhSW5kZXg+AAIERQFBIGJhdGNoIHdhcyBwYXJ0aWFsbHkgY2hlY2tlZCBmb3IgdGhlIGdpdmVuIGVyYXMsIGJ1dCB0aGUgcHJvY2VzcyBkaWQgbm90IGZpbmlzaC40QmF0Y2hGaW5pc2hlZAQBEHNpemUQAQx1MzIAAxCcQSBiYXRjaCBvZiBhIGdpdmVuIHNpemUgd2FzIHRlcm1pbmF0ZWQuAFUBVGhpcyBpcyBhbHdheXMgZm9sbG93cyBieSBhIG51bWJlciBvZiBgVW5zdGFrZWRgIG9yIGBTbGFzaGVkYCBldmVudHMsIG1hcmtpbmcgdGhlIGVuZOhvZiB0aGUgYmF0Y2guIEEgbmV3IGJhdGNoIHdpbGwgYmUgY3JlYXRlZCB1cG9uIG5leHQgYmxvY2suNEludGVybmFsRXJyb3IABAToQW4gaW50ZXJuYWwgZXJyb3IgaGFwcGVuZWQuIE9wZXJhdGlvbnMgd2lsbCBiZSBwYXVzZWQgbm93LgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldHUHEGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMkaW5jbHVzaW9uGHBhbGxldBRFdmVudAQEVAABEDxDYW5kaWRhdGVCYWNrZWQQAHkHAWRDYW5kaWRhdGVSZWNlaXB0PFQ6Okhhc2g+AADZBAEgSGVhZERhdGEAAH0HASRDb3JlSW5kZXgAAIEHAShHcm91cEluZGV4AAAEwEEgY2FuZGlkYXRlIHdhcyBiYWNrZWQuIGBbY2FuZGlkYXRlLCBoZWFkX2RhdGFdYERDYW5kaWRhdGVJbmNsdWRlZBAAeQcBZENhbmRpZGF0ZVJlY2VpcHQ8VDo6SGFzaD4AANkEASBIZWFkRGF0YQAAfQcBJENvcmVJbmRleAAAgQcBKEdyb3VwSW5kZXgAAQTIQSBjYW5kaWRhdGUgd2FzIGluY2x1ZGVkLiBgW2NhbmRpZGF0ZSwgaGVhZF9kYXRhXWBEQ2FuZGlkYXRlVGltZWRPdXQMAHkHAWRDYW5kaWRhdGVSZWNlaXB0PFQ6Okhhc2g+AADZBAEgSGVhZERhdGEAAH0HASRDb3JlSW5kZXgAAgS8QSBjYW5kaWRhdGUgdGltZWQgb3V0LiBgW2NhbmRpZGF0ZSwgaGVhZF9kYXRhXWBYVXB3YXJkTWVzc2FnZXNSZWNlaXZlZAgBEGZyb22NAgEYUGFyYUlkAAEUY291bnQQAQx1MzIAAwT4U29tZSB1cHdhcmQgbWVzc2FnZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIGFuZCB3aWxsIGJlIHByb2Nlc3NlZC4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXR5BwxMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2N0BDYW5kaWRhdGVSZWNlaXB0BARIATQACAEoZGVzY3JpcHRvcq0EAVhDYW5kaWRhdGVEZXNjcmlwdG9yPEg+AAFAY29tbWl0bWVudHNfaGFzaDQBEEhhc2gAAH0HDExwb2xrYWRvdF9wcmltaXRpdmVzCHY3JENvcmVJbmRleAAABAAQAQx1MzIAAIEHDExwb2xrYWRvdF9wcmltaXRpdmVzCHY3KEdyb3VwSW5kZXgAAAQAEAEMdTMyAACFBxBscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zFHBhcmFzGHBhbGxldBRFdmVudAABIEhDdXJyZW50Q29kZVVwZGF0ZWQEAI0CARhQYXJhSWQAAATMQ3VycmVudCBjb2RlIGhhcyBiZWVuIHVwZGF0ZWQgZm9yIGEgUGFyYS4gYHBhcmFfaWRgSEN1cnJlbnRIZWFkVXBkYXRlZAQAjQIBGFBhcmFJZAABBMxDdXJyZW50IGhlYWQgaGFzIGJlZW4gdXBkYXRlZCBmb3IgYSBQYXJhLiBgcGFyYV9pZGBQQ29kZVVwZ3JhZGVTY2hlZHVsZWQEAI0CARhQYXJhSWQAAgTcQSBjb2RlIHVwZ3JhZGUgaGFzIGJlZW4gc2NoZWR1bGVkIGZvciBhIFBhcmEuIGBwYXJhX2lkYDBOZXdIZWFkTm90ZWQEAI0CARhQYXJhSWQAAwS8QSBuZXcgaGVhZCBoYXMgYmVlbiBub3RlZCBmb3IgYSBQYXJhLiBgcGFyYV9pZGAwQWN0aW9uUXVldWVkCACNAgEYUGFyYUlkAAAQATBTZXNzaW9uSW5kZXgABATwQSBwYXJhIGhhcyBiZWVuIHF1ZXVlZCB0byBleGVjdXRlIHBlbmRpbmcgYWN0aW9ucy4gYHBhcmFfaWRgPFB2ZkNoZWNrU3RhcnRlZAgAuQQBSFZhbGlkYXRpb25Db2RlSGFzaAAAjQIBGFBhcmFJZAAFCFUBVGhlIGdpdmVuIHBhcmEgZWl0aGVyIGluaXRpYXRlZCBvciBzdWJzY3JpYmVkIHRvIGEgUFZGIGNoZWNrIGZvciB0aGUgZ2l2ZW4gdmFsaWRhdGlvbmxjb2RlLiBgY29kZV9oYXNoYCBgcGFyYV9pZGBAUHZmQ2hlY2tBY2NlcHRlZAgAuQQBSFZhbGlkYXRpb25Db2RlSGFzaAAAjQIBGFBhcmFJZAAGCBEBVGhlIGdpdmVuIHZhbGlkYXRpb24gY29kZSB3YXMgYWNjZXB0ZWQgYnkgdGhlIFBWRiBwcmUtY2hlY2tpbmcgdm90ZS5UYGNvZGVfaGFzaGAgYHBhcmFfaWRgQFB2ZkNoZWNrUmVqZWN0ZWQIALkEAUhWYWxpZGF0aW9uQ29kZUhhc2gAAI0CARhQYXJhSWQABwgRAVRoZSBnaXZlbiB2YWxpZGF0aW9uIGNvZGUgd2FzIHJlamVjdGVkIGJ5IHRoZSBQVkYgcHJlLWNoZWNraW5nIHZvdGUuVGBjb2RlX2hhc2hgIGBwYXJhX2lkYAR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldIkHEGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMQaHJtcBhwYWxsZXQURXZlbnQEBFQAARxQT3BlbkNoYW5uZWxSZXF1ZXN0ZWQQARhzZW5kZXKNAgEYUGFyYUlkAAEkcmVjaXBpZW50jQIBGFBhcmFJZAABVHByb3Bvc2VkX21heF9jYXBhY2l0eRABDHUzMgABZHByb3Bvc2VkX21heF9tZXNzYWdlX3NpemUQAQx1MzIAAARwT3BlbiBIUk1QIGNoYW5uZWwgcmVxdWVzdGVkLkxPcGVuQ2hhbm5lbENhbmNlbGVkCAEwYnlfcGFyYWNoYWlujQIBGFBhcmFJZAABKGNoYW5uZWxfaWQZBQE0SHJtcENoYW5uZWxJZAABBCkBQW4gSFJNUCBjaGFubmVsIHJlcXVlc3Qgc2VudCBieSB0aGUgcmVjZWl2ZXIgd2FzIGNhbmNlbGVkIGJ5IGVpdGhlciBwYXJ0eS5MT3BlbkNoYW5uZWxBY2NlcHRlZAgBGHNlbmRlco0CARhQYXJhSWQAASRyZWNpcGllbnSNAgEYUGFyYUlkAAIEbE9wZW4gSFJNUCBjaGFubmVsIGFjY2VwdGVkLjRDaGFubmVsQ2xvc2VkCAEwYnlfcGFyYWNoYWlujQIBGFBhcmFJZAABKGNoYW5uZWxfaWQZBQE0SHJtcENoYW5uZWxJZAADBFBIUk1QIGNoYW5uZWwgY2xvc2VkLlhIcm1wQ2hhbm5lbEZvcmNlT3BlbmVkEAEYc2VuZGVyjQIBGFBhcmFJZAABJHJlY2lwaWVudI0CARhQYXJhSWQAAVRwcm9wb3NlZF9tYXhfY2FwYWNpdHkQAQx1MzIAAWRwcm9wb3NlZF9tYXhfbWVzc2FnZV9zaXplEAEMdTMyAAQErEFuIEhSTVAgY2hhbm5lbCB3YXMgb3BlbmVkIHZpYSBSb290IG9yaWdpbi5cSHJtcFN5c3RlbUNoYW5uZWxPcGVuZWQQARhzZW5kZXKNAgEYUGFyYUlkAAEkcmVjaXBpZW50jQIBGFBhcmFJZAABVHByb3Bvc2VkX21heF9jYXBhY2l0eRABDHUzMgABZHByb3Bvc2VkX21heF9tZXNzYWdlX3NpemUQAQx1MzIABQS8QW4gSFJNUCBjaGFubmVsIHdhcyBvcGVuZWQgd2l0aCBhIHN5c3RlbSBjaGFpbi5oT3BlbkNoYW5uZWxEZXBvc2l0c1VwZGF0ZWQIARhzZW5kZXKNAgEYUGFyYUlkAAEkcmVjaXBpZW50jQIBGFBhcmFJZAAGBKBBbiBIUk1QIGNoYW5uZWwncyBkZXBvc2l0cyB3ZXJlIHVwZGF0ZWQuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0jQcQbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucyBkaXNwdXRlcxhwYWxsZXQURXZlbnQEBFQAAQxARGlzcHV0ZUluaXRpYXRlZAgA7QQBNENhbmRpZGF0ZUhhc2gAAJEHATxEaXNwdXRlTG9jYXRpb24AAAQJAUEgZGlzcHV0ZSBoYXMgYmVlbiBpbml0aWF0ZWQuIFxbY2FuZGlkYXRlIGhhc2gsIGRpc3B1dGUgbG9jYXRpb25cXUBEaXNwdXRlQ29uY2x1ZGVkCADtBAE0Q2FuZGlkYXRlSGFzaAAAlQcBNERpc3B1dGVSZXN1bHQAAQjMQSBkaXNwdXRlIGhhcyBjb25jbHVkZWQgZm9yIG9yIGFnYWluc3QgYSBjYW5kaWRhdGUutGBcW3BhcmEgaWQsIGNhbmRpZGF0ZSBoYXNoLCBkaXNwdXRlIHJlc3VsdFxdYBhSZXZlcnQEABABREJsb2NrTnVtYmVyRm9yPFQ+AAIQ/EEgZGlzcHV0ZSBoYXMgY29uY2x1ZGVkIHdpdGggc3VwZXJtYWpvcml0eSBhZ2FpbnN0IGEgY2FuZGlkYXRlLg0BQmxvY2sgYXV0aG9ycyBzaG91bGQgbm8gbG9uZ2VyIGJ1aWxkIG9uIHRvcCBvZiB0aGlzIGhlYWQgYW5kIHNob3VsZAEBaW5zdGVhZCByZXZlcnQgdGhlIGJsb2NrIGF0IHRoZSBnaXZlbiBoZWlnaHQuIFRoaXMgc2hvdWxkIGJlIHRoZfxudW1iZXIgb2YgdGhlIGNoaWxkIG9mIHRoZSBsYXN0IGtub3duIHZhbGlkIGJsb2NrIGluIHRoZSBjaGFpbi4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXSRBwxscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zIGRpc3B1dGVzPERpc3B1dGVMb2NhdGlvbgABCBRMb2NhbAAAABhSZW1vdGUAAQAAlQcMbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucyBkaXNwdXRlczREaXNwdXRlUmVzdWx0AAEIFFZhbGlkAAAAHEludmFsaWQAAQAAmQcQbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWluc0hhc3NpZ25lcl9vbl9kZW1hbmQYcGFsbGV0FEV2ZW50BARUAAEITE9uRGVtYW5kT3JkZXJQbGFjZWQMARxwYXJhX2lkjQIBGFBhcmFJZAABKHNwb3RfcHJpY2UYATBCYWxhbmNlT2Y8VD4AAShvcmRlcmVkX2J5AAEwVDo6QWNjb3VudElkAAAEDQFBbiBvcmRlciB3YXMgcGxhY2VkIGF0IHNvbWUgc3BvdCBwcmljZSBhbW91bnQgYnkgb3JkZXJlciBvcmRlcmVkX2J5MFNwb3RQcmljZVNldAQBKHNwb3RfcHJpY2UYATBCYWxhbmNlT2Y8VD4AAQS4VGhlIHZhbHVlIG9mIHRoZSBzcG90IHByaWNlIGhhcyBsaWtlbHkgY2hhbmdlZAR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldJ0HEFxwb2xrYWRvdF9ydW50aW1lX2NvbW1vbjxwYXJhc19yZWdpc3RyYXIYcGFsbGV0FEV2ZW50BARUAAEQKFJlZ2lzdGVyZWQIARxwYXJhX2lkjQIBGFBhcmFJZAABHG1hbmFnZXIAATBUOjpBY2NvdW50SWQAAAAwRGVyZWdpc3RlcmVkBAEccGFyYV9pZI0CARhQYXJhSWQAAQAgUmVzZXJ2ZWQIARxwYXJhX2lkjQIBGFBhcmFJZAABDHdobwABMFQ6OkFjY291bnRJZAACABxTd2FwcGVkCAEccGFyYV9pZI0CARhQYXJhSWQAASBvdGhlcl9pZI0CARhQYXJhSWQAAwAEfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXShBxBccG9sa2Fkb3RfcnVudGltZV9jb21tb24Uc2xvdHMYcGFsbGV0FEV2ZW50BARUAAEIOE5ld0xlYXNlUGVyaW9kBAEwbGVhc2VfcGVyaW9kEAFATGVhc2VQZXJpb2RPZjxUPgAABJBBIG5ldyBgW2xlYXNlX3BlcmlvZF1gIGlzIGJlZ2lubmluZy4YTGVhc2VkGAEccGFyYV9pZI0CARhQYXJhSWQAARhsZWFzZXIAATBUOjpBY2NvdW50SWQAATBwZXJpb2RfYmVnaW4QAUBMZWFzZVBlcmlvZE9mPFQ+AAEwcGVyaW9kX2NvdW50EAFATGVhc2VQZXJpb2RPZjxUPgABOGV4dHJhX3Jlc2VydmVkGAEwQmFsYW5jZU9mPFQ+AAEwdG90YWxfYW1vdW50GAEwQmFsYW5jZU9mPFQ+AAEMNQFBIHBhcmEgaGFzIHdvbiB0aGUgcmlnaHQgdG8gYSBjb250aW51b3VzIHNldCBvZiBsZWFzZSBwZXJpb2RzIGFzIGEgcGFyYWNoYWluLkUBRmlyc3QgYmFsYW5jZSBpcyBhbnkgZXh0cmEgYW1vdW50IHJlc2VydmVkIG9uIHRvcCBvZiB0aGUgcGFyYSdzIGV4aXN0aW5nIGRlcG9zaXQusFNlY29uZCBiYWxhbmNlIGlzIHRoZSB0b3RhbCBhbW91bnQgcmVzZXJ2ZWQuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0pQcQXHBvbGthZG90X3J1bnRpbWVfY29tbW9uIGF1Y3Rpb25zGHBhbGxldBRFdmVudAQEVAABHDhBdWN0aW9uU3RhcnRlZAwBNGF1Y3Rpb25faW5kZXgQATBBdWN0aW9uSW5kZXgAATBsZWFzZV9wZXJpb2QQAUBMZWFzZVBlcmlvZE9mPFQ+AAEYZW5kaW5nEAFEQmxvY2tOdW1iZXJGb3I8VD4AAAhJAUFuIGF1Y3Rpb24gc3RhcnRlZC4gUHJvdmlkZXMgaXRzIGluZGV4IGFuZCB0aGUgYmxvY2sgbnVtYmVyIHdoZXJlIGl0IHdpbGwgYmVnaW4gdG8VAWNsb3NlIGFuZCB0aGUgZmlyc3QgbGVhc2UgcGVyaW9kIG9mIHRoZSBxdWFkcnVwbGV0IHRoYXQgaXMgYXVjdGlvbmVkLjRBdWN0aW9uQ2xvc2VkBAE0YXVjdGlvbl9pbmRleBABMEF1Y3Rpb25JbmRleAABBLhBbiBhdWN0aW9uIGVuZGVkLiBBbGwgZnVuZHMgYmVjb21lIHVucmVzZXJ2ZWQuIFJlc2VydmVkDAEYYmlkZGVyAAEwVDo6QWNjb3VudElkAAE4ZXh0cmFfcmVzZXJ2ZWQYATBCYWxhbmNlT2Y8VD4AATB0b3RhbF9hbW91bnQYATBCYWxhbmNlT2Y8VD4AAghJAUZ1bmRzIHdlcmUgcmVzZXJ2ZWQgZm9yIGEgd2lubmluZyBiaWQuIEZpcnN0IGJhbGFuY2UgaXMgdGhlIGV4dHJhIGFtb3VudCByZXNlcnZlZC5QU2Vjb25kIGlzIHRoZSB0b3RhbC4oVW5yZXNlcnZlZAgBGGJpZGRlcgABMFQ6OkFjY291bnRJZAABGGFtb3VudBgBMEJhbGFuY2VPZjxUPgADBCkBRnVuZHMgd2VyZSB1bnJlc2VydmVkIHNpbmNlIGJpZGRlciBpcyBubyBsb25nZXIgYWN0aXZlLiBgW2JpZGRlciwgYW1vdW50XWBIUmVzZXJ2ZUNvbmZpc2NhdGVkDAEccGFyYV9pZI0CARhQYXJhSWQAARhsZWFzZXIAATBUOjpBY2NvdW50SWQAARhhbW91bnQYATBCYWxhbmNlT2Y8VD4ABAhVAVNvbWVvbmUgYXR0ZW1wdGVkIHRvIGxlYXNlIHRoZSBzYW1lIHNsb3QgdHdpY2UgZm9yIGEgcGFyYWNoYWluLiBUaGUgYW1vdW50IGlzIGhlbGQgaW64cmVzZXJ2ZSBidXQgbm8gcGFyYWNoYWluIHNsb3QgaGFzIGJlZW4gbGVhc2VkLixCaWRBY2NlcHRlZBQBGGJpZGRlcgABMFQ6OkFjY291bnRJZAABHHBhcmFfaWSNAgEYUGFyYUlkAAEYYW1vdW50GAEwQmFsYW5jZU9mPFQ+AAEoZmlyc3Rfc2xvdBABQExlYXNlUGVyaW9kT2Y8VD4AASRsYXN0X3Nsb3QQAUBMZWFzZVBlcmlvZE9mPFQ+AAUEyEEgbmV3IGJpZCBoYXMgYmVlbiBhY2NlcHRlZCBhcyB0aGUgY3VycmVudCB3aW5uZXIuNFdpbm5pbmdPZmZzZXQIATRhdWN0aW9uX2luZGV4EAEwQXVjdGlvbkluZGV4AAEwYmxvY2tfbnVtYmVyEAFEQmxvY2tOdW1iZXJGb3I8VD4ABghZAVRoZSB3aW5uaW5nIG9mZnNldCB3YXMgY2hvc2VuIGZvciBhbiBhdWN0aW9uLiBUaGlzIHdpbGwgbWFwIGludG8gdGhlIGBXaW5uaW5nYCBzdG9yYWdlEG1hcC4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXSpBxBccG9sa2Fkb3RfcnVudGltZV9jb21tb24kY3Jvd2Rsb2FuGHBhbGxldBRFdmVudAQEVAABKBxDcmVhdGVkBAEccGFyYV9pZI0CARhQYXJhSWQAAASMQ3JlYXRlIGEgbmV3IGNyb3dkbG9hbmluZyBjYW1wYWlnbi4sQ29udHJpYnV0ZWQMAQx3aG8AATBUOjpBY2NvdW50SWQAAShmdW5kX2luZGV4jQIBGFBhcmFJZAABGGFtb3VudBgBMEJhbGFuY2VPZjxUPgABBHBDb250cmlidXRlZCB0byBhIGNyb3dkIHNhbGUuIFdpdGhkcmV3DAEMd2hvAAEwVDo6QWNjb3VudElkAAEoZnVuZF9pbmRleI0CARhQYXJhSWQAARhhbW91bnQYATBCYWxhbmNlT2Y8VD4AAgScV2l0aGRyZXcgZnVsbCBiYWxhbmNlIG9mIGEgY29udHJpYnV0b3IuRFBhcnRpYWxseVJlZnVuZGVkBAEccGFyYV9pZI0CARhQYXJhSWQAAwgtAVRoZSBsb2FucyBpbiBhIGZ1bmQgaGF2ZSBiZWVuIHBhcnRpYWxseSBkaXNzb2x2ZWQsIGkuZS4gdGhlcmUgYXJlIHNvbWUgbGVmdLRvdmVyIGNoaWxkIGtleXMgdGhhdCBzdGlsbCBuZWVkIHRvIGJlIGtpbGxlZC4sQWxsUmVmdW5kZWQEARxwYXJhX2lkjQIBGFBhcmFJZAAEBJxBbGwgbG9hbnMgaW4gYSBmdW5kIGhhdmUgYmVlbiByZWZ1bmRlZC4kRGlzc29sdmVkBAEccGFyYV9pZI0CARhQYXJhSWQABQRIRnVuZCBpcyBkaXNzb2x2ZWQuPEhhbmRsZUJpZFJlc3VsdAgBHHBhcmFfaWSNAgEYUGFyYUlkAAEYcmVzdWx0iAE4RGlzcGF0Y2hSZXN1bHQABgT0VGhlIHJlc3VsdCBvZiB0cnlpbmcgdG8gc3VibWl0IGEgbmV3IGJpZCB0byB0aGUgU2xvdHMgcGFsbGV0LhhFZGl0ZWQEARxwYXJhX2lkjQIBGFBhcmFJZAAHBMRUaGUgY29uZmlndXJhdGlvbiB0byBhIGNyb3dkbG9hbiBoYXMgYmVlbiBlZGl0ZWQuLE1lbW9VcGRhdGVkDAEMd2hvAAEwVDo6QWNjb3VudElkAAEccGFyYV9pZI0CARhQYXJhSWQAARBtZW1vOAEcVmVjPHU4PgAIBGBBIG1lbW8gaGFzIGJlZW4gdXBkYXRlZC48QWRkZWRUb05ld1JhaXNlBAEccGFyYV9pZI0CARhQYXJhSWQACQSgQSBwYXJhY2hhaW4gaGFzIGJlZW4gbW92ZWQgdG8gYE5ld1JhaXNlYAR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldK0HEGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMgY29yZXRpbWUYcGFsbGV0FEV2ZW50BARUAAEIUFJldmVudWVJbmZvUmVxdWVzdGVkBAEQd2hlbhABREJsb2NrTnVtYmVyRm9yPFQ+AAAEIQFUaGUgYnJva2VyIGNoYWluIGhhcyBhc2tlZCBmb3IgcmV2ZW51ZSBpbmZvcm1hdGlvbiBmb3IgYSBzcGVjaWZpYyBibG9jay4wQ29yZUFzc2lnbmVkBAEQY29yZX0HASRDb3JlSW5kZXgAAQTsQSBjb3JlIGhhcyByZWNlaXZlZCBhIG5ldyBhc3NpZ25tZW50IGZyb20gdGhlIGJyb2tlciBjaGFpbi4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXSxBwxscGFsbGV0X3N0YXRlX3RyaWVfbWlncmF0aW9uGHBhbGxldBRFdmVudAQEVAABECBNaWdyYXRlZAwBDHRvcBABDHUzMgABFGNoaWxkEAEMdTMyAAEcY29tcHV0ZbUHAUBNaWdyYXRpb25Db21wdXRlAAAIOQFHaXZlbiBudW1iZXIgb2YgYCh0b3AsIGNoaWxkKWAga2V5cyB3ZXJlIG1pZ3JhdGVkIHJlc3BlY3RpdmVseSwgd2l0aCB0aGUgZ2l2ZW4oYGNvbXB1dGVgLhxTbGFzaGVkCAEMd2hvAAEwVDo6QWNjb3VudElkAAEYYW1vdW50GAEwQmFsYW5jZU9mPFQ+AAEEtFNvbWUgYWNjb3VudCBnb3Qgc2xhc2hlZCBieSB0aGUgZ2l2ZW4gYW1vdW50LlRBdXRvTWlncmF0aW9uRmluaXNoZWQAAgSEVGhlIGF1dG8gbWlncmF0aW9uIHRhc2sgZmluaXNoZWQuGEhhbHRlZAQBFGVycm9yuQcBIEVycm9yPFQ+AAME7E1pZ3JhdGlvbiBnb3QgaGFsdGVkIGR1ZSB0byBhbiBlcnJvciBvciBtaXNzLWNvbmZpZ3VyYXRpb24uBHBJbm5lciBldmVudHMgb2YgdGhpcyBwYWxsZXQutQcMbHBhbGxldF9zdGF0ZV90cmllX21pZ3JhdGlvbhhwYWxsZXRATWlncmF0aW9uQ29tcHV0ZQABCBhTaWduZWQAAAAQQXV0bwABAAC5BwxscGFsbGV0X3N0YXRlX3RyaWVfbWlncmF0aW9uGHBhbGxldBRFcnJvcgQEVAABGDxNYXhTaWduZWRMaW1pdHMAAASATWF4IHNpZ25lZCBsaW1pdHMgbm90IHJlc3BlY3RlZC4oS2V5VG9vTG9uZwABHLRBIGtleSB3YXMgbG9uZ2VyIHRoYW4gdGhlIGNvbmZpZ3VyZWQgbWF4aW11bS4AEQFUaGlzIG1lYW5zIHRoYXQgdGhlIG1pZ3JhdGlvbiBoYWx0ZWQgYXQgdGhlIGN1cnJlbnQgW2BQcm9ncmVzc2BdIGFuZAEBY2FuIGJlIHJlc3VtZWQgd2l0aCBhIGxhcmdlciBbYGNyYXRlOjpDb25maWc6Ok1heEtleUxlbmBdIHZhbHVlLiEBUmV0cnlpbmcgd2l0aCB0aGUgc2FtZSBbYGNyYXRlOjpDb25maWc6Ok1heEtleUxlbmBdIHZhbHVlIHdpbGwgbm90IHdvcmsuRQFUaGUgdmFsdWUgc2hvdWxkIG9ubHkgYmUgaW5jcmVhc2VkIHRvIGF2b2lkIGEgc3RvcmFnZSBtaWdyYXRpb24gZm9yIHRoZSBjdXJyZW50bHmQc3RvcmVkIFtgY3JhdGU6OlByb2dyZXNzOjpMYXN0S2V5YF0uOE5vdEVub3VnaEZ1bmRzAAIElHN1Ym1pdHRlciBkb2VzIG5vdCBoYXZlIGVub3VnaCBmdW5kcy4oQmFkV2l0bmVzcwADBGhCYWQgd2l0bmVzcyBkYXRhIHByb3ZpZGVkLmRTaWduZWRNaWdyYXRpb25Ob3RBbGxvd2VkAAQEJQFTaWduZWQgbWlncmF0aW9uIGlzIG5vdCBhbGxvd2VkIGJlY2F1c2UgdGhlIG1heGltdW0gbGltaXQgaXMgbm90IHNldCB5ZXQuMEJhZENoaWxkUm9vdAAFBGBCYWQgY2hpbGQgcm9vdCBwcm92aWRlZC4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQuvQcMKHBhbGxldF94Y20YcGFsbGV0FEV2ZW50BARUAAFgJEF0dGVtcHRlZAQBHG91dGNvbWXBBwFQeGNtOjpsYXRlc3Q6Ok91dGNvbWUAAASoRXhlY3V0aW9uIG9mIGFuIFhDTSBtZXNzYWdlIHdhcyBhdHRlbXB0ZWQuEFNlbnQQARhvcmlnaW4NAQEgTG9jYXRpb24AASxkZXN0aW5hdGlvbg0BASBMb2NhdGlvbgABHG1lc3NhZ2VBBgEcWGNtPCgpPgABKG1lc3NhZ2VfaWQEARxYY21IYXNoAAEEXEEgWENNIG1lc3NhZ2Ugd2FzIHNlbnQuSFVuZXhwZWN0ZWRSZXNwb25zZQgBGG9yaWdpbg0BASBMb2NhdGlvbgABIHF1ZXJ5X2lkMAEcUXVlcnlJZAACDFkBUXVlcnkgcmVzcG9uc2UgcmVjZWl2ZWQgd2hpY2ggZG9lcyBub3QgbWF0Y2ggYSByZWdpc3RlcmVkIHF1ZXJ5LiBUaGlzIG1heSBiZSBiZWNhdXNlIGFVAW1hdGNoaW5nIHF1ZXJ5IHdhcyBuZXZlciByZWdpc3RlcmVkLCBpdCBtYXkgYmUgYmVjYXVzZSBpdCBpcyBhIGR1cGxpY2F0ZSByZXNwb25zZSwgb3JwYmVjYXVzZSB0aGUgcXVlcnkgdGltZWQgb3V0LjRSZXNwb25zZVJlYWR5CAEgcXVlcnlfaWQwARxRdWVyeUlkAAEgcmVzcG9uc2VhBgEgUmVzcG9uc2UAAwhdAVF1ZXJ5IHJlc3BvbnNlIGhhcyBiZWVuIHJlY2VpdmVkIGFuZCBpcyByZWFkeSBmb3IgdGFraW5nIHdpdGggYHRha2VfcmVzcG9uc2VgLiBUaGVyZSBpc4BubyByZWdpc3RlcmVkIG5vdGlmaWNhdGlvbiBjYWxsLiBOb3RpZmllZAwBIHF1ZXJ5X2lkMAEcUXVlcnlJZAABMHBhbGxldF9pbmRleAgBCHU4AAEoY2FsbF9pbmRleAgBCHU4AAQIWQFRdWVyeSByZXNwb25zZSBoYXMgYmVlbiByZWNlaXZlZCBhbmQgcXVlcnkgaXMgcmVtb3ZlZC4gVGhlIHJlZ2lzdGVyZWQgbm90aWZpY2F0aW9uIGhhc6hiZWVuIGRpc3BhdGNoZWQgYW5kIGV4ZWN1dGVkIHN1Y2Nlc3NmdWxseS5ATm90aWZ5T3ZlcndlaWdodBQBIHF1ZXJ5X2lkMAEcUXVlcnlJZAABMHBhbGxldF9pbmRleAgBCHU4AAEoY2FsbF9pbmRleAgBCHU4AAE0YWN0dWFsX3dlaWdodCgBGFdlaWdodAABTG1heF9idWRnZXRlZF93ZWlnaHQoARhXZWlnaHQABQxJAVF1ZXJ5IHJlc3BvbnNlIGhhcyBiZWVuIHJlY2VpdmVkIGFuZCBxdWVyeSBpcyByZW1vdmVkLiBUaGUgcmVnaXN0ZXJlZCBub3RpZmljYXRpb25ZAWNvdWxkIG5vdCBiZSBkaXNwYXRjaGVkIGJlY2F1c2UgdGhlIGRpc3BhdGNoIHdlaWdodCBpcyBncmVhdGVyIHRoYW4gdGhlIG1heGltdW0gd2VpZ2h05G9yaWdpbmFsbHkgYnVkZ2V0ZWQgYnkgdGhpcyBydW50aW1lIGZvciB0aGUgcXVlcnkgcmVzdWx0LkxOb3RpZnlEaXNwYXRjaEVycm9yDAEgcXVlcnlfaWQwARxRdWVyeUlkAAEwcGFsbGV0X2luZGV4CAEIdTgAAShjYWxsX2luZGV4CAEIdTgABghVAVF1ZXJ5IHJlc3BvbnNlIGhhcyBiZWVuIHJlY2VpdmVkIGFuZCBxdWVyeSBpcyByZW1vdmVkLiBUaGVyZSB3YXMgYSBnZW5lcmFsIGVycm9yIHdpdGiIZGlzcGF0Y2hpbmcgdGhlIG5vdGlmaWNhdGlvbiBjYWxsLkhOb3RpZnlEZWNvZGVGYWlsZWQMASBxdWVyeV9pZDABHFF1ZXJ5SWQAATBwYWxsZXRfaW5kZXgIAQh1OAABKGNhbGxfaW5kZXgIAQh1OAAHDFEBUXVlcnkgcmVzcG9uc2UgaGFzIGJlZW4gcmVjZWl2ZWQgYW5kIHF1ZXJ5IGlzIHJlbW92ZWQuIFRoZSBkaXNwYXRjaCB3YXMgdW5hYmxlIHRvIGJlWQFkZWNvZGVkIGludG8gYSBgQ2FsbGA7IHRoaXMgbWlnaHQgYmUgZHVlIHRvIGRpc3BhdGNoIGZ1bmN0aW9uIGhhdmluZyBhIHNpZ25hdHVyZSB3aGljaJRpcyBub3QgYChvcmlnaW4sIFF1ZXJ5SWQsIFJlc3BvbnNlKWAuQEludmFsaWRSZXNwb25kZXIMARhvcmlnaW4NAQEgTG9jYXRpb24AASBxdWVyeV9pZDABHFF1ZXJ5SWQAAURleHBlY3RlZF9sb2NhdGlvbnUGAUBPcHRpb248TG9jYXRpb24+AAgMWQFFeHBlY3RlZCBxdWVyeSByZXNwb25zZSBoYXMgYmVlbiByZWNlaXZlZCBidXQgdGhlIG9yaWdpbiBsb2NhdGlvbiBvZiB0aGUgcmVzcG9uc2UgZG9lc1UBbm90IG1hdGNoIHRoYXQgZXhwZWN0ZWQuIFRoZSBxdWVyeSByZW1haW5zIHJlZ2lzdGVyZWQgZm9yIGEgbGF0ZXIsIHZhbGlkLCByZXNwb25zZSB0b2xiZSByZWNlaXZlZCBhbmQgYWN0ZWQgdXBvbi5cSW52YWxpZFJlc3BvbmRlclZlcnNpb24IARhvcmlnaW4NAQEgTG9jYXRpb24AASBxdWVyeV9pZDABHFF1ZXJ5SWQACRxRAUV4cGVjdGVkIHF1ZXJ5IHJlc3BvbnNlIGhhcyBiZWVuIHJlY2VpdmVkIGJ1dCB0aGUgZXhwZWN0ZWQgb3JpZ2luIGxvY2F0aW9uIHBsYWNlZCBpbk0Bc3RvcmFnZSBieSB0aGlzIHJ1bnRpbWUgcHJldmlvdXNseSBjYW5ub3QgYmUgZGVjb2RlZC4gVGhlIHF1ZXJ5IHJlbWFpbnMgcmVnaXN0ZXJlZC4AQQFUaGlzIGlzIHVuZXhwZWN0ZWQgKHNpbmNlIGEgbG9jYXRpb24gcGxhY2VkIGluIHN0b3JhZ2UgaW4gYSBwcmV2aW91c2x5IGV4ZWN1dGluZ00BcnVudGltZSBzaG91bGQgYmUgcmVhZGFibGUgcHJpb3IgdG8gcXVlcnkgdGltZW91dCkgYW5kIGRhbmdlcm91cyBzaW5jZSB0aGUgcG9zc2libHlZAXZhbGlkIHJlc3BvbnNlIHdpbGwgYmUgZHJvcHBlZC4gTWFudWFsIGdvdmVybmFuY2UgaW50ZXJ2ZW50aW9uIGlzIHByb2JhYmx5IGdvaW5nIHRvIGJlHG5lZWRlZC40UmVzcG9uc2VUYWtlbgQBIHF1ZXJ5X2lkMAEcUXVlcnlJZAAKBMhSZWNlaXZlZCBxdWVyeSByZXNwb25zZSBoYXMgYmVlbiByZWFkIGFuZCByZW1vdmVkLjRBc3NldHNUcmFwcGVkDAEQaGFzaDQBEEgyNTYAARhvcmlnaW4NAQEgTG9jYXRpb24AARhhc3NldHOJBgE8VmVyc2lvbmVkQXNzZXRzAAsEuFNvbWUgYXNzZXRzIGhhdmUgYmVlbiBwbGFjZWQgaW4gYW4gYXNzZXQgdHJhcC5UVmVyc2lvbkNoYW5nZU5vdGlmaWVkEAEsZGVzdGluYXRpb24NAQEgTG9jYXRpb24AARhyZXN1bHQQAShYY21WZXJzaW9uAAEQY29zdE0GARhBc3NldHMAAShtZXNzYWdlX2lkBAEcWGNtSGFzaAAMDCUBQW4gWENNIHZlcnNpb24gY2hhbmdlIG5vdGlmaWNhdGlvbiBtZXNzYWdlIGhhcyBiZWVuIGF0dGVtcHRlZCB0byBiZSBzZW50LgDgVGhlIGNvc3Qgb2Ygc2VuZGluZyBpdCAoYm9ybmUgYnkgdGhlIGNoYWluKSBpcyBpbmNsdWRlZC5cU3VwcG9ydGVkVmVyc2lvbkNoYW5nZWQIASBsb2NhdGlvbg0BASBMb2NhdGlvbgABHHZlcnNpb24QAShYY21WZXJzaW9uAA0IOQFUaGUgc3VwcG9ydGVkIHZlcnNpb24gb2YgYSBsb2NhdGlvbiBoYXMgYmVlbiBjaGFuZ2VkLiBUaGlzIG1pZ2h0IGJlIHRocm91Z2ggYW7AYXV0b21hdGljIG5vdGlmaWNhdGlvbiBvciBhIG1hbnVhbCBpbnRlcnZlbnRpb24uUE5vdGlmeVRhcmdldFNlbmRGYWlsDAEgbG9jYXRpb24NAQEgTG9jYXRpb24AASBxdWVyeV9pZDABHFF1ZXJ5SWQAARRlcnJvcgkGASBYY21FcnJvcgAOCFkBQSBnaXZlbiBsb2NhdGlvbiB3aGljaCBoYWQgYSB2ZXJzaW9uIGNoYW5nZSBzdWJzY3JpcHRpb24gd2FzIGRyb3BwZWQgb3dpbmcgdG8gYW4gZXJyb3J8c2VuZGluZyB0aGUgbm90aWZpY2F0aW9uIHRvIGl0LmROb3RpZnlUYXJnZXRNaWdyYXRpb25GYWlsCAEgbG9jYXRpb25FAQFEVmVyc2lvbmVkTG9jYXRpb24AASBxdWVyeV9pZDABHFF1ZXJ5SWQADwhZAUEgZ2l2ZW4gbG9jYXRpb24gd2hpY2ggaGFkIGEgdmVyc2lvbiBjaGFuZ2Ugc3Vic2NyaXB0aW9uIHdhcyBkcm9wcGVkIG93aW5nIHRvIGFuIGVycm9ytG1pZ3JhdGluZyB0aGUgbG9jYXRpb24gdG8gb3VyIG5ldyBYQ00gZm9ybWF0LlRJbnZhbGlkUXVlcmllclZlcnNpb24IARhvcmlnaW4NAQEgTG9jYXRpb24AASBxdWVyeV9pZDABHFF1ZXJ5SWQAEBxVAUV4cGVjdGVkIHF1ZXJ5IHJlc3BvbnNlIGhhcyBiZWVuIHJlY2VpdmVkIGJ1dCB0aGUgZXhwZWN0ZWQgcXVlcmllciBsb2NhdGlvbiBwbGFjZWQgaW5NAXN0b3JhZ2UgYnkgdGhpcyBydW50aW1lIHByZXZpb3VzbHkgY2Fubm90IGJlIGRlY29kZWQuIFRoZSBxdWVyeSByZW1haW5zIHJlZ2lzdGVyZWQuAEEBVGhpcyBpcyB1bmV4cGVjdGVkIChzaW5jZSBhIGxvY2F0aW9uIHBsYWNlZCBpbiBzdG9yYWdlIGluIGEgcHJldmlvdXNseSBleGVjdXRpbmdNAXJ1bnRpbWUgc2hvdWxkIGJlIHJlYWRhYmxlIHByaW9yIHRvIHF1ZXJ5IHRpbWVvdXQpIGFuZCBkYW5nZXJvdXMgc2luY2UgdGhlIHBvc3NpYmx5WQF2YWxpZCByZXNwb25zZSB3aWxsIGJlIGRyb3BwZWQuIE1hbnVhbCBnb3Zlcm5hbmNlIGludGVydmVudGlvbiBpcyBwcm9iYWJseSBnb2luZyB0byBiZRxuZWVkZWQuOEludmFsaWRRdWVyaWVyEAEYb3JpZ2luDQEBIExvY2F0aW9uAAEgcXVlcnlfaWQwARxRdWVyeUlkAAFAZXhwZWN0ZWRfcXVlcmllcg0BASBMb2NhdGlvbgABUG1heWJlX2FjdHVhbF9xdWVyaWVydQYBQE9wdGlvbjxMb2NhdGlvbj4AEQxdAUV4cGVjdGVkIHF1ZXJ5IHJlc3BvbnNlIGhhcyBiZWVuIHJlY2VpdmVkIGJ1dCB0aGUgcXVlcmllciBsb2NhdGlvbiBvZiB0aGUgcmVzcG9uc2UgZG9lc1EBbm90IG1hdGNoIHRoZSBleHBlY3RlZC4gVGhlIHF1ZXJ5IHJlbWFpbnMgcmVnaXN0ZXJlZCBmb3IgYSBsYXRlciwgdmFsaWQsIHJlc3BvbnNlIHRvbGJlIHJlY2VpdmVkIGFuZCBhY3RlZCB1cG9uLlBWZXJzaW9uTm90aWZ5U3RhcnRlZAwBLGRlc3RpbmF0aW9uDQEBIExvY2F0aW9uAAEQY29zdE0GARhBc3NldHMAAShtZXNzYWdlX2lkBAEcWGNtSGFzaAASCFkBQSByZW1vdGUgaGFzIHJlcXVlc3RlZCBYQ00gdmVyc2lvbiBjaGFuZ2Ugbm90aWZpY2F0aW9uIGZyb20gdXMgYW5kIHdlIGhhdmUgaG9ub3JlZCBpdC4dAUEgdmVyc2lvbiBpbmZvcm1hdGlvbiBtZXNzYWdlIGlzIHNlbnQgdG8gdGhlbSBhbmQgaXRzIGNvc3QgaXMgaW5jbHVkZWQuWFZlcnNpb25Ob3RpZnlSZXF1ZXN0ZWQMASxkZXN0aW5hdGlvbg0BASBMb2NhdGlvbgABEGNvc3RNBgEYQXNzZXRzAAEobWVzc2FnZV9pZAQBHFhjbUhhc2gAEwQ9AVdlIGhhdmUgcmVxdWVzdGVkIHRoYXQgYSByZW1vdGUgY2hhaW4gc2VuZCB1cyBYQ00gdmVyc2lvbiBjaGFuZ2Ugbm90aWZpY2F0aW9ucy5gVmVyc2lvbk5vdGlmeVVucmVxdWVzdGVkDAEsZGVzdGluYXRpb24NAQEgTG9jYXRpb24AARBjb3N0TQYBGEFzc2V0cwABKG1lc3NhZ2VfaWQEARxYY21IYXNoABQIJQFXZSBoYXZlIHJlcXVlc3RlZCB0aGF0IGEgcmVtb3RlIGNoYWluIHN0b3BzIHNlbmRpbmcgdXMgWENNIHZlcnNpb24gY2hhbmdlOG5vdGlmaWNhdGlvbnMuIEZlZXNQYWlkCAEYcGF5aW5nDQEBIExvY2F0aW9uAAEQZmVlc00GARhBc3NldHMAFQQxAUZlZXMgd2VyZSBwYWlkIGZyb20gYSBsb2NhdGlvbiBmb3IgYW4gb3BlcmF0aW9uIChvZnRlbiBmb3IgdXNpbmcgYFNlbmRYY21gKS40QXNzZXRzQ2xhaW1lZAwBEGhhc2g0ARBIMjU2AAEYb3JpZ2luDQEBIExvY2F0aW9uAAEYYXNzZXRziQYBPFZlcnNpb25lZEFzc2V0cwAWBMBTb21lIGFzc2V0cyBoYXZlIGJlZW4gY2xhaW1lZCBmcm9tIGFuIGFzc2V0IHRyYXBgVmVyc2lvbk1pZ3JhdGlvbkZpbmlzaGVkBAEcdmVyc2lvbhABKFhjbVZlcnNpb24AFwSEQSBYQ00gdmVyc2lvbiBtaWdyYXRpb24gZmluaXNoZWQuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0wQcQLHN0YWdpbmdfeGNtCHY0GHRyYWl0cxxPdXRjb21lAAEMIENvbXBsZXRlBAEQdXNlZCgBGFdlaWdodAAAAChJbmNvbXBsZXRlCAEQdXNlZCgBGFdlaWdodAABFGVycm9yCQYBFEVycm9yAAEAFEVycm9yBAEUZXJyb3IJBgEURXJyb3IAAgAAxQcMUHBhbGxldF9tZXNzYWdlX3F1ZXVlGHBhbGxldBRFdmVudAQEVAABEEBQcm9jZXNzaW5nRmFpbGVkDAEIaWQ0ARBIMjU2BJRUaGUgYGJsYWtlMl8yNTZgIGhhc2ggb2YgdGhlIG1lc3NhZ2UuARhvcmlnaW7FBgFITWVzc2FnZU9yaWdpbk9mPFQ+BGRUaGUgcXVldWUgb2YgdGhlIG1lc3NhZ2UuARRlcnJvcskHAUxQcm9jZXNzTWVzc2FnZUVycm9yEGBUaGUgZXJyb3IgdGhhdCBvY2N1cnJlZC4ASQFUaGlzIGVycm9yIGlzIHByZXR0eSBvcGFxdWUuIE1vcmUgZmluZS1ncmFpbmVkIGVycm9ycyBuZWVkIHRvIGJlIGVtaXR0ZWQgYXMgZXZlbnRzaGJ5IHRoZSBgTWVzc2FnZVByb2Nlc3NvcmAuAARVAU1lc3NhZ2UgZGlzY2FyZGVkIGR1ZSB0byBhbiBlcnJvciBpbiB0aGUgYE1lc3NhZ2VQcm9jZXNzb3JgICh1c3VhbGx5IGEgZm9ybWF0IGVycm9yKS4kUHJvY2Vzc2VkEAEIaWQ0ARBIMjU2BJRUaGUgYGJsYWtlMl8yNTZgIGhhc2ggb2YgdGhlIG1lc3NhZ2UuARhvcmlnaW7FBgFITWVzc2FnZU9yaWdpbk9mPFQ+BGRUaGUgcXVldWUgb2YgdGhlIG1lc3NhZ2UuASx3ZWlnaHRfdXNlZCgBGFdlaWdodATASG93IG11Y2ggd2VpZ2h0IHdhcyB1c2VkIHRvIHByb2Nlc3MgdGhlIG1lc3NhZ2UuARxzdWNjZXNzIAEQYm9vbBiIV2hldGhlciB0aGUgbWVzc2FnZSB3YXMgcHJvY2Vzc2VkLgBJAU5vdGUgdGhhdCB0aGlzIGRvZXMgbm90IG1lYW4gdGhhdCB0aGUgdW5kZXJseWluZyBgTWVzc2FnZVByb2Nlc3NvcmAgd2FzIGludGVybmFsbHk1AXN1Y2Nlc3NmdWwuIEl0ICpzb2xlbHkqIG1lYW5zIHRoYXQgdGhlIE1RIHBhbGxldCB3aWxsIHRyZWF0IHRoaXMgYXMgYSBzdWNjZXNzTQFjb25kaXRpb24gYW5kIGRpc2NhcmQgdGhlIG1lc3NhZ2UuIEFueSBpbnRlcm5hbCBlcnJvciBuZWVkcyB0byBiZSBlbWl0dGVkIGFzIGV2ZW50c2hieSB0aGUgYE1lc3NhZ2VQcm9jZXNzb3JgLgEEVE1lc3NhZ2UgaXMgcHJvY2Vzc2VkLkhPdmVyd2VpZ2h0RW5xdWV1ZWQQAQhpZAQBIFt1ODsgMzJdBJRUaGUgYGJsYWtlMl8yNTZgIGhhc2ggb2YgdGhlIG1lc3NhZ2UuARhvcmlnaW7FBgFITWVzc2FnZU9yaWdpbk9mPFQ+BGRUaGUgcXVldWUgb2YgdGhlIG1lc3NhZ2UuAShwYWdlX2luZGV4EAEkUGFnZUluZGV4BGBUaGUgcGFnZSBvZiB0aGUgbWVzc2FnZS4BNG1lc3NhZ2VfaW5kZXgQARxUOjpTaXplBKRUaGUgaW5kZXggb2YgdGhlIG1lc3NhZ2Ugd2l0aGluIHRoZSBwYWdlLgIEjE1lc3NhZ2UgcGxhY2VkIGluIG92ZXJ3ZWlnaHQgcXVldWUuKFBhZ2VSZWFwZWQIARhvcmlnaW7FBgFITWVzc2FnZU9yaWdpbk9mPFQ+BFhUaGUgcXVldWUgb2YgdGhlIHBhZ2UuARRpbmRleBABJFBhZ2VJbmRleARYVGhlIGluZGV4IG9mIHRoZSBwYWdlLgMEVFRoaXMgcGFnZSB3YXMgcmVhcGVkLgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldMkHEDRmcmFtZV9zdXBwb3J0GHRyYWl0cyBtZXNzYWdlc0xQcm9jZXNzTWVzc2FnZUVycm9yAAEYJEJhZEZvcm1hdAAAABxDb3JydXB0AAEALFVuc3VwcG9ydGVkAAIAKE92ZXJ3ZWlnaHQEACgBGFdlaWdodAADABRZaWVsZAAEAERTdGFja0xpbWl0UmVhY2hlZAAFAADNBwxEcGFsbGV0X2Fzc2V0X3JhdGUYcGFsbGV0FEV2ZW50BARUAAEMQEFzc2V0UmF0ZUNyZWF0ZWQIAShhc3NldF9raW5k3AEwVDo6QXNzZXRLaW5kAAEQcmF0ZdEGASRGaXhlZFUxMjgAAABAQXNzZXRSYXRlUmVtb3ZlZAQBKGFzc2V0X2tpbmTcATBUOjpBc3NldEtpbmQAAQBAQXNzZXRSYXRlVXBkYXRlZAwBKGFzc2V0X2tpbmTcATBUOjpBc3NldEtpbmQAAQxvbGTRBgEkRml4ZWRVMTI4AAEMbmV30QYBJEZpeGVkVTEyOAACAAR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldNEHDCxwYWxsZXRfc3VkbxhwYWxsZXQURXZlbnQEBFQAARAUU3VkaWQEASxzdWRvX3Jlc3VsdIgBOERpc3BhdGNoUmVzdWx0BLRUaGUgcmVzdWx0IG9mIHRoZSBjYWxsIG1hZGUgYnkgdGhlIHN1ZG8gdXNlci4ABHBBIHN1ZG8gY2FsbCBqdXN0IHRvb2sgcGxhY2UuKEtleUNoYW5nZWQIAQxvbGT9AQFQT3B0aW9uPFQ6OkFjY291bnRJZD4EtFRoZSBvbGQgc3VkbyBrZXkgKGlmIG9uZSB3YXMgcHJldmlvdXNseSBzZXQpLgEMbmV3AAEwVDo6QWNjb3VudElkBIhUaGUgbmV3IHN1ZG8ga2V5IChpZiBvbmUgd2FzIHNldCkuAQR4VGhlIHN1ZG8ga2V5IGhhcyBiZWVuIHVwZGF0ZWQuKEtleVJlbW92ZWQAAgSAVGhlIGtleSB3YXMgcGVybWFuZW50bHkgcmVtb3ZlZC4oU3Vkb0FzRG9uZQQBLHN1ZG9fcmVzdWx0iAE4RGlzcGF0Y2hSZXN1bHQEtFRoZSByZXN1bHQgb2YgdGhlIGNhbGwgbWFkZSBieSB0aGUgc3VkbyB1c2VyLgMEyEEgW3N1ZG9fYXNdKFBhbGxldDo6c3Vkb19hcykgY2FsbCBqdXN0IHRvb2sgcGxhY2UuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV01QcIMGZyYW1lX3N5c3RlbRRQaGFzZQABDDhBcHBseUV4dHJpbnNpYwQAEAEMdTMyAAAAMEZpbmFsaXphdGlvbgABADhJbml0aWFsaXphdGlvbgACAADZBwAAAoAA3QcIMGZyYW1lX3N5c3RlbVhMYXN0UnVudGltZVVwZ3JhZGVJbmZvAAAIATBzcGVjX3ZlcnNpb27sAUxjb2RlYzo6Q29tcGFjdDx1MzI+AAEkc3BlY19uYW1l4QcBZHNwX3J1bnRpbWU6OlJ1bnRpbWVTdHJpbmcAAOEHAAAFAgDlBwgwZnJhbWVfc3lzdGVtYENvZGVVcGdyYWRlQXV0aG9yaXphdGlvbgQEVAAACAEkY29kZV9oYXNoNAEcVDo6SGFzaAABNGNoZWNrX3ZlcnNpb24gARBib29sAADpBwwwZnJhbWVfc3lzdGVtGGxpbWl0czBCbG9ja1dlaWdodHMAAAwBKGJhc2VfYmxvY2soARhXZWlnaHQAASRtYXhfYmxvY2soARhXZWlnaHQAASRwZXJfY2xhc3PtBwGEUGVyRGlzcGF0Y2hDbGFzczxXZWlnaHRzUGVyQ2xhc3M+AADtBww0ZnJhbWVfc3VwcG9ydCBkaXNwYXRjaEBQZXJEaXNwYXRjaENsYXNzBARUAfEHAAwBGG5vcm1hbPEHAQRUAAEsb3BlcmF0aW9uYWzxBwEEVAABJG1hbmRhdG9yefEHAQRUAADxBwwwZnJhbWVfc3lzdGVtGGxpbWl0czxXZWlnaHRzUGVyQ2xhc3MAABABOGJhc2VfZXh0cmluc2ljKAEYV2VpZ2h0AAE0bWF4X2V4dHJpbnNpYx0HAThPcHRpb248V2VpZ2h0PgABJG1heF90b3RhbB0HAThPcHRpb248V2VpZ2h0PgABIHJlc2VydmVkHQcBOE9wdGlvbjxXZWlnaHQ+AAD1BwwwZnJhbWVfc3lzdGVtGGxpbWl0cyxCbG9ja0xlbmd0aAAABAEMbWF4+QcBVFBlckRpc3BhdGNoQ2xhc3M8dTMyPgAA+QcMNGZyYW1lX3N1cHBvcnQgZGlzcGF0Y2hAUGVyRGlzcGF0Y2hDbGFzcwQEVAEQAAwBGG5vcm1hbBABBFQAASxvcGVyYXRpb25hbBABBFQAASRtYW5kYXRvcnkQAQRUAAD9Bwgoc3Bfd2VpZ2h0czxSdW50aW1lRGJXZWlnaHQAAAgBEHJlYWQwAQx1NjQAARR3cml0ZTABDHU2NAAAAQgIKHNwX3ZlcnNpb244UnVudGltZVZlcnNpb24AACABJHNwZWNfbmFtZeEHATRSdW50aW1lU3RyaW5nAAEkaW1wbF9uYW1l4QcBNFJ1bnRpbWVTdHJpbmcAAURhdXRob3JpbmdfdmVyc2lvbhABDHUzMgABMHNwZWNfdmVyc2lvbhABDHUzMgABMGltcGxfdmVyc2lvbhABDHUzMgABEGFwaXMFCAEcQXBpc1ZlYwABTHRyYW5zYWN0aW9uX3ZlcnNpb24QAQx1MzIAATRzdGF0ZV92ZXJzaW9uCAEIdTgAAAUIBAxDb3cEBFQBCQgABAAJCAAAAAkIAAACDQgADQgAAAQIsQUQABEIDDBmcmFtZV9zeXN0ZW0YcGFsbGV0FEVycm9yBARUAAEkPEludmFsaWRTcGVjTmFtZQAACBEBVGhlIG5hbWUgb2Ygc3BlY2lmaWNhdGlvbiBkb2VzIG5vdCBtYXRjaCBiZXR3ZWVuIHRoZSBjdXJyZW50IHJ1bnRpbWVQYW5kIHRoZSBuZXcgcnVudGltZS5oU3BlY1ZlcnNpb25OZWVkc1RvSW5jcmVhc2UAAQhBAVRoZSBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaXMgbm90IGFsbG93ZWQgdG8gZGVjcmVhc2UgYmV0d2VlbiB0aGUgY3VycmVudCBydW50aW1lUGFuZCB0aGUgbmV3IHJ1bnRpbWUudEZhaWxlZFRvRXh0cmFjdFJ1bnRpbWVWZXJzaW9uAAIM7EZhaWxlZCB0byBleHRyYWN0IHRoZSBydW50aW1lIHZlcnNpb24gZnJvbSB0aGUgbmV3IHJ1bnRpbWUuAAkBRWl0aGVyIGNhbGxpbmcgYENvcmVfdmVyc2lvbmAgb3IgZGVjb2RpbmcgYFJ1bnRpbWVWZXJzaW9uYCBmYWlsZWQuTE5vbkRlZmF1bHRDb21wb3NpdGUAAwT8U3VpY2lkZSBjYWxsZWQgd2hlbiB0aGUgYWNjb3VudCBoYXMgbm9uLWRlZmF1bHQgY29tcG9zaXRlIGRhdGEuPE5vblplcm9SZWZDb3VudAAEBDUBVGhlcmUgaXMgYSBub24temVybyByZWZlcmVuY2UgY291bnQgcHJldmVudGluZyB0aGUgYWNjb3VudCBmcm9tIGJlaW5nIHB1cmdlZC4wQ2FsbEZpbHRlcmVkAAUE0FRoZSBvcmlnaW4gZmlsdGVyIHByZXZlbnQgdGhlIGNhbGwgdG8gYmUgZGlzcGF0Y2hlZC5sTXVsdGlCbG9ja01pZ3JhdGlvbnNPbmdvaW5nAAYEVQFBIG11bHRpLWJsb2NrIG1pZ3JhdGlvbiBpcyBvbmdvaW5nIGFuZCBwcmV2ZW50cyB0aGUgY3VycmVudCBjb2RlIGZyb20gYmVpbmcgcmVwbGFjZWQuRE5vdGhpbmdBdXRob3JpemVkAAcEWE5vIHVwZ3JhZGUgYXV0aG9yaXplZC4wVW5hdXRob3JpemVkAAgElFRoZSBzdWJtaXR0ZWQgY29kZSBpcyBub3QgYXV0aG9yaXplZC4EbEVycm9yIGZvciB0aGUgU3lzdGVtIHBhbGxldBUIDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBGQgEUwAABAAhCAEYVmVjPFQ+AAAZCAQYT3B0aW9uBARUAR0IAQgQTm9uZQAAABBTb21lBAAdCAAAAQAAHQgIQHBhbGxldF9zY2hlZHVsZXIkU2NoZWR1bGVkFBBOYW1lAQQQQ2FsbAFxASxCbG9ja051bWJlcgEQNFBhbGxldHNPcmlnaW4BfQIkQWNjb3VudElkAQAAFAEgbWF5YmVfaWSEATBPcHRpb248TmFtZT4AASBwcmlvcml0eQgBSHNjaGVkdWxlOjpQcmlvcml0eQABEGNhbGxxAQEQQ2FsbAABOG1heWJlX3BlcmlvZGljjQEBlE9wdGlvbjxzY2hlZHVsZTo6UGVyaW9kPEJsb2NrTnVtYmVyPj4AARhvcmlnaW59AgE0UGFsbGV0c09yaWdpbgAAIQgAAAIZCAAlCAhAcGFsbGV0X3NjaGVkdWxlcixSZXRyeUNvbmZpZwQYUGVyaW9kARAADAE0dG90YWxfcmV0cmllcwgBCHU4AAEkcmVtYWluaW5nCAEIdTgAARhwZXJpb2QQARhQZXJpb2QAACkIDEBwYWxsZXRfc2NoZWR1bGVyGHBhbGxldBRFcnJvcgQEVAABFEBGYWlsZWRUb1NjaGVkdWxlAAAEZEZhaWxlZCB0byBzY2hlZHVsZSBhIGNhbGwgTm90Rm91bmQAAQR8Q2Fubm90IGZpbmQgdGhlIHNjaGVkdWxlZCBjYWxsLlxUYXJnZXRCbG9ja051bWJlckluUGFzdAACBKRHaXZlbiB0YXJnZXQgYmxvY2sgbnVtYmVyIGlzIGluIHRoZSBwYXN0LkhSZXNjaGVkdWxlTm9DaGFuZ2UAAwTwUmVzY2hlZHVsZSBmYWlsZWQgYmVjYXVzZSBpdCBkb2VzIG5vdCBjaGFuZ2Ugc2NoZWR1bGVkIHRpbWUuFE5hbWVkAAQE0EF0dGVtcHQgdG8gdXNlIGEgbm9uLW5hbWVkIGZ1bmN0aW9uIG9uIGEgbmFtZWQgdGFzay4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQuLQgIPHBhbGxldF9wcmVpbWFnZUBPbGRSZXF1ZXN0U3RhdHVzCCRBY2NvdW50SWQBABxCYWxhbmNlARgBCCxVbnJlcXVlc3RlZAgBHGRlcG9zaXQRBAFQKEFjY291bnRJZCwgQmFsYW5jZSkAAQxsZW4QAQx1MzIAAAAkUmVxdWVzdGVkDAEcZGVwb3NpdDEIAXBPcHRpb248KEFjY291bnRJZCwgQmFsYW5jZSk+AAEUY291bnQQAQx1MzIAAQxsZW5hAgEsT3B0aW9uPHUzMj4AAQAAMQgEGE9wdGlvbgQEVAERBAEIEE5vbmUAAAAQU29tZQQAEQQAAAEAADUICDxwYWxsZXRfcHJlaW1hZ2U0UmVxdWVzdFN0YXR1cwgkQWNjb3VudElkAQAYVGlja2V0ATkIAQgsVW5yZXF1ZXN0ZWQIARh0aWNrZXQ9CAFMKEFjY291bnRJZCwgVGlja2V0KQABDGxlbhABDHUzMgAAACRSZXF1ZXN0ZWQMATBtYXliZV90aWNrZXRBCAFsT3B0aW9uPChBY2NvdW50SWQsIFRpY2tldCk+AAEUY291bnQQAQx1MzIAASRtYXliZV9sZW5hAgEsT3B0aW9uPHUzMj4AAQAAOQgUNGZyYW1lX3N1cHBvcnQYdHJhaXRzGHRva2VucyBmdW5naWJsZURIb2xkQ29uc2lkZXJhdGlvbhQEQQAERgAEUgAERAAIRnAAAAQAGAEoRjo6QmFsYW5jZQAAPQgAAAQIADkIAEEIBBhPcHRpb24EBFQBPQgBCBBOb25lAAAAEFNvbWUEAD0IAAABAABFCAAABAg0EABJCAxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAQgEUwAABAA4ARhWZWM8VD4AAE0IDDxwYWxsZXRfcHJlaW1hZ2UYcGFsbGV0FEVycm9yBARUAAEkGFRvb0JpZwAABKBQcmVpbWFnZSBpcyB0b28gbGFyZ2UgdG8gc3RvcmUgb24tY2hhaW4uMEFscmVhZHlOb3RlZAABBKRQcmVpbWFnZSBoYXMgYWxyZWFkeSBiZWVuIG5vdGVkIG9uLWNoYWluLjROb3RBdXRob3JpemVkAAIEyFRoZSB1c2VyIGlzIG5vdCBhdXRob3JpemVkIHRvIHBlcmZvcm0gdGhpcyBhY3Rpb24uIE5vdE5vdGVkAAME/FRoZSBwcmVpbWFnZSBjYW5ub3QgYmUgcmVtb3ZlZCBzaW5jZSBpdCBoYXMgbm90IHlldCBiZWVuIG5vdGVkLiRSZXF1ZXN0ZWQABAQJAUEgcHJlaW1hZ2UgbWF5IG5vdCBiZSByZW1vdmVkIHdoZW4gdGhlcmUgYXJlIG91dHN0YW5kaW5nIHJlcXVlc3RzLjBOb3RSZXF1ZXN0ZWQABQQtAVRoZSBwcmVpbWFnZSByZXF1ZXN0IGNhbm5vdCBiZSByZW1vdmVkIHNpbmNlIG5vIG91dHN0YW5kaW5nIHJlcXVlc3RzIGV4aXN0LhxUb29NYW55AAYEVQFNb3JlIHRoYW4gYE1BWF9IQVNIX1VQR1JBREVfQlVMS19DT1VOVGAgaGFzaGVzIHdlcmUgcmVxdWVzdGVkIHRvIGJlIHVwZ3JhZGVkIGF0IG9uY2UuGFRvb0ZldwAHBORUb28gZmV3IGhhc2hlcyB3ZXJlIHJlcXVlc3RlZCB0byBiZSB1cGdyYWRlZCAoaS5lLiB6ZXJvKS4YTm9Db3N0AAgEWQFObyB0aWNrZXQgd2l0aCBhIGNvc3Qgd2FzIHJldHVybmVkIGJ5IFtgQ29uZmlnOjpDb25zaWRlcmF0aW9uYF0gdG8gc3RvcmUgdGhlIHByZWltYWdlLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC5RCAxMYm91bmRlZF9jb2xsZWN0aW9uc0B3ZWFrX2JvdW5kZWRfdmVjOFdlYWtCb3VuZGVkVmVjCARUAVUIBFMAAAQAWQgBGFZlYzxUPgAAVQgAAAQIpQEwAFkIAAACVQgAXQgMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAEEBFMAAAQAYQgBGFZlYzxUPgAAYQgAAAIEAGUIBBhPcHRpb24EBFQBaQgBCBBOb25lAAAAEFNvbWUEAGkIAAABAABpCAxEc3BfY29uc2Vuc3VzX2JhYmUcZGlnZXN0cyRQcmVEaWdlc3QAAQwcUHJpbWFyeQQAbQgBQFByaW1hcnlQcmVEaWdlc3QAAQA4U2Vjb25kYXJ5UGxhaW4EAHUIAVxTZWNvbmRhcnlQbGFpblByZURpZ2VzdAACADBTZWNvbmRhcnlWUkYEAHkIAVRTZWNvbmRhcnlWUkZQcmVEaWdlc3QAAwAAbQgMRHNwX2NvbnNlbnN1c19iYWJlHGRpZ2VzdHNAUHJpbWFyeVByZURpZ2VzdAAADAE8YXV0aG9yaXR5X2luZGV4EAFUc3VwZXI6OkF1dGhvcml0eUluZGV4AAEQc2xvdKkBARBTbG90AAE0dnJmX3NpZ25hdHVyZXEIATBWcmZTaWduYXR1cmUAAHEIEBxzcF9jb3JlHHNyMjU1MTkMdnJmMFZyZlNpZ25hdHVyZQAACAEocHJlX291dHB1dAQBMFZyZlByZU91dHB1dAABFHByb29mSQIBIFZyZlByb29mAAB1CAxEc3BfY29uc2Vuc3VzX2JhYmUcZGlnZXN0c1xTZWNvbmRhcnlQbGFpblByZURpZ2VzdAAACAE8YXV0aG9yaXR5X2luZGV4EAFUc3VwZXI6OkF1dGhvcml0eUluZGV4AAEQc2xvdKkBARBTbG90AAB5CAxEc3BfY29uc2Vuc3VzX2JhYmUcZGlnZXN0c1RTZWNvbmRhcnlWUkZQcmVEaWdlc3QAAAwBPGF1dGhvcml0eV9pbmRleBABVHN1cGVyOjpBdXRob3JpdHlJbmRleAABEHNsb3SpAQEQU2xvdAABNHZyZl9zaWduYXR1cmVxCAEwVnJmU2lnbmF0dXJlAAB9CAhEc3BfY29uc2Vuc3VzX2JhYmVYQmFiZUVwb2NoQ29uZmlndXJhdGlvbgAACAEEY7UBASgodTY0LCB1NjQpAAE0YWxsb3dlZF9zbG90c7kBATBBbGxvd2VkU2xvdHMAAIEIDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBhQgEUwAABACJCAEYVmVjPFQ+AACFCAAABAgwEACJCAAAAoUIAI0IDCxwYWxsZXRfYmFiZRhwYWxsZXQURXJyb3IEBFQAARBgSW52YWxpZEVxdWl2b2NhdGlvblByb29mAAAEMQFBbiBlcXVpdm9jYXRpb24gcHJvb2YgcHJvdmlkZWQgYXMgcGFydCBvZiBhbiBlcXVpdm9jYXRpb24gcmVwb3J0IGlzIGludmFsaWQuYEludmFsaWRLZXlPd25lcnNoaXBQcm9vZgABBDEBQSBrZXkgb3duZXJzaGlwIHByb29mIHByb3ZpZGVkIGFzIHBhcnQgb2YgYW4gZXF1aXZvY2F0aW9uIHJlcG9ydCBpcyBpbnZhbGlkLlhEdXBsaWNhdGVPZmZlbmNlUmVwb3J0AAIEFQFBIGdpdmVuIGVxdWl2b2NhdGlvbiByZXBvcnQgaXMgdmFsaWQgYnV0IGFscmVhZHkgcHJldmlvdXNseSByZXBvcnRlZC5QSW52YWxpZENvbmZpZ3VyYXRpb24AAwSMU3VibWl0dGVkIGNvbmZpZ3VyYXRpb24gaXMgaW52YWxpZC4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQukQgAAAQMABggAJUIDDhwYWxsZXRfaW5kaWNlcxhwYWxsZXQURXJyb3IEBFQAARQsTm90QXNzaWduZWQAAASMVGhlIGluZGV4IHdhcyBub3QgYWxyZWFkeSBhc3NpZ25lZC4gTm90T3duZXIAAQSkVGhlIGluZGV4IGlzIGFzc2lnbmVkIHRvIGFub3RoZXIgYWNjb3VudC4USW5Vc2UAAgRwVGhlIGluZGV4IHdhcyBub3QgYXZhaWxhYmxlLixOb3RUcmFuc2ZlcgADBMhUaGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBhY2NvdW50cyBhcmUgaWRlbnRpY2FsLiRQZXJtYW5lbnQABATQVGhlIGluZGV4IGlzIHBlcm1hbmVudCBhbmQgbWF5IG5vdCBiZSBmcmVlZC9jaGFuZ2VkLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC6ZCAxMYm91bmRlZF9jb2xsZWN0aW9uc0B3ZWFrX2JvdW5kZWRfdmVjOFdlYWtCb3VuZGVkVmVjCARUAZ0IBFMAAAQApQgBGFZlYzxUPgAAnQgMPHBhbGxldF9iYWxhbmNlcxR0eXBlcyxCYWxhbmNlTG9jawQcQmFsYW5jZQEYAAwBCGlksQUBOExvY2tJZGVudGlmaWVyAAEYYW1vdW50GAEcQmFsYW5jZQABHHJlYXNvbnOhCAEcUmVhc29ucwAAoQgMPHBhbGxldF9iYWxhbmNlcxR0eXBlcxxSZWFzb25zAAEMDEZlZQAAABBNaXNjAAEADEFsbAACAAClCAAAAp0IAKkIDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBrQgEUwAABACxCAEYVmVjPFQ+AACtCAw8cGFsbGV0X2JhbGFuY2VzFHR5cGVzLFJlc2VydmVEYXRhCERSZXNlcnZlSWRlbnRpZmllcgGxBRxCYWxhbmNlARgACAEIaWSxBQFEUmVzZXJ2ZUlkZW50aWZpZXIAARhhbW91bnQYARxCYWxhbmNlAACxCAAAAq0IALUIDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBuQgEUwAABADJCAEYVmVjPFQ+AAC5CBQ0ZnJhbWVfc3VwcG9ydBh0cmFpdHMYdG9rZW5zEG1pc2MgSWRBbW91bnQICElkAb0IHEJhbGFuY2UBGAAIAQhpZL0IAQhJZAABGGFtb3VudBgBHEJhbGFuY2UAAL0ICDRwYXNlb19ydW50aW1lRFJ1bnRpbWVIb2xkUmVhc29uAAEIIFByZWltYWdlBADBCAFscGFsbGV0X3ByZWltYWdlOjpIb2xkUmVhc29uAAoASFN0YXRlVHJpZU1pZ3JhdGlvbgQAxQgBnHBhbGxldF9zdGF0ZV90cmllX21pZ3JhdGlvbjo6SG9sZFJlYXNvbgBiAADBCAw8cGFsbGV0X3ByZWltYWdlGHBhbGxldChIb2xkUmVhc29uAAEEIFByZWltYWdlAAAAAMUIDGxwYWxsZXRfc3RhdGVfdHJpZV9taWdyYXRpb24YcGFsbGV0KEhvbGRSZWFzb24AAQQ8U2xhc2hGb3JNaWdyYXRlAAAAAMkIAAACuQgAzQgMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAHRCARTAAAEAN0IARhWZWM8VD4AANEIFDRmcmFtZV9zdXBwb3J0GHRyYWl0cxh0b2tlbnMQbWlzYyBJZEFtb3VudAgISWQB1QgcQmFsYW5jZQEYAAgBCGlk1QgBCElkAAEYYW1vdW50GAEcQmFsYW5jZQAA1QgINHBhc2VvX3J1bnRpbWVMUnVudGltZUZyZWV6ZVJlYXNvbgABBDxOb21pbmF0aW9uUG9vbHMEANkIAZRwYWxsZXRfbm9taW5hdGlvbl9wb29sczo6RnJlZXplUmVhc29uACcAANkIDFxwYWxsZXRfbm9taW5hdGlvbl9wb29scxhwYWxsZXQwRnJlZXplUmVhc29uAAEEOFBvb2xNaW5CYWxhbmNlAAAAAN0IAAAC0QgA4QgMPHBhbGxldF9iYWxhbmNlcxhwYWxsZXQURXJyb3IIBFQABEkAATA4VmVzdGluZ0JhbGFuY2UAAAScVmVzdGluZyBiYWxhbmNlIHRvbyBoaWdoIHRvIHNlbmQgdmFsdWUuVExpcXVpZGl0eVJlc3RyaWN0aW9ucwABBMhBY2NvdW50IGxpcXVpZGl0eSByZXN0cmljdGlvbnMgcHJldmVudCB3aXRoZHJhd2FsLkxJbnN1ZmZpY2llbnRCYWxhbmNlAAIEeEJhbGFuY2UgdG9vIGxvdyB0byBzZW5kIHZhbHVlLkhFeGlzdGVudGlhbERlcG9zaXQAAwTsVmFsdWUgdG9vIGxvdyB0byBjcmVhdGUgYWNjb3VudCBkdWUgdG8gZXhpc3RlbnRpYWwgZGVwb3NpdC40RXhwZW5kYWJpbGl0eQAEBJBUcmFuc2Zlci9wYXltZW50IHdvdWxkIGtpbGwgYWNjb3VudC5cRXhpc3RpbmdWZXN0aW5nU2NoZWR1bGUABQTMQSB2ZXN0aW5nIHNjaGVkdWxlIGFscmVhZHkgZXhpc3RzIGZvciB0aGlzIGFjY291bnQuLERlYWRBY2NvdW50AAYEjEJlbmVmaWNpYXJ5IGFjY291bnQgbXVzdCBwcmUtZXhpc3QuPFRvb01hbnlSZXNlcnZlcwAHBLhOdW1iZXIgb2YgbmFtZWQgcmVzZXJ2ZXMgZXhjZWVkIGBNYXhSZXNlcnZlc2AuMFRvb01hbnlIb2xkcwAIBPhOdW1iZXIgb2YgaG9sZHMgZXhjZWVkIGBWYXJpYW50Q291bnRPZjxUOjpSdW50aW1lSG9sZFJlYXNvbj5gLjhUb29NYW55RnJlZXplcwAJBJhOdW1iZXIgb2YgZnJlZXplcyBleGNlZWQgYE1heEZyZWV6ZXNgLkxJc3N1YW5jZURlYWN0aXZhdGVkAAoEAQFUaGUgaXNzdWFuY2UgY2Fubm90IGJlIG1vZGlmaWVkIHNpbmNlIGl0IGlzIGFscmVhZHkgZGVhY3RpdmF0ZWQuJERlbHRhWmVybwALBGRUaGUgZGVsdGEgY2Fubm90IGJlIHplcm8uBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LuUICGhwYWxsZXRfdHJhbnNhY3Rpb25fcGF5bWVudCBSZWxlYXNlcwABCCRWMUFuY2llbnQAAAAIVjIAAQAA6QgIOHBhbGxldF9zdGFraW5nNFN0YWtpbmdMZWRnZXIEBFQAABQBFHN0YXNoAAEwVDo6QWNjb3VudElkAAEUdG90YWz8ATBCYWxhbmNlT2Y8VD4AARhhY3RpdmX8ATBCYWxhbmNlT2Y8VD4AASR1bmxvY2tpbmcJAgHwQm91bmRlZFZlYzxVbmxvY2tDaHVuazxCYWxhbmNlT2Y8VD4+LCBUOjpNYXhVbmxvY2tpbmdDaHVua3M+AAFYbGVnYWN5X2NsYWltZWRfcmV3YXJkc+0IAZRCb3VuZGVkVmVjPEVyYUluZGV4LCBUOjpIaXN0b3J5RGVwdGg+AADtCAxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUARAEUwAABADlAQEYVmVjPFQ+AADxCAg4cGFsbGV0X3N0YWtpbmcsTm9taW5hdGlvbnMEBFQAAAwBHHRhcmdldHP1CAG0Qm91bmRlZFZlYzxUOjpBY2NvdW50SWQsIE1heE5vbWluYXRpb25zT2Y8VD4+AAEwc3VibWl0dGVkX2luEAEgRXJhSW5kZXgAAShzdXBwcmVzc2VkIAEQYm9vbAAA9QgMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAEABFMAAAQA0QEBGFZlYzxUPgAA+QgIOHBhbGxldF9zdGFraW5nNEFjdGl2ZUVyYUluZm8AAAgBFGluZGV4EAEgRXJhSW5kZXgAARRzdGFydP0IASxPcHRpb248dTY0PgAA/QgEGE9wdGlvbgQEVAEwAQgQTm9uZQAAABBTb21lBAAwAAABAAABCQAABAgQAAAFCQgoc3Bfc3Rha2luZyBFeHBvc3VyZQgkQWNjb3VudElkAQAcQmFsYW5jZQEYAAwBFHRvdGFs/AEcQmFsYW5jZQABDG93bvwBHEJhbGFuY2UAARhvdGhlcnMJCQGsVmVjPEluZGl2aWR1YWxFeHBvc3VyZTxBY2NvdW50SWQsIEJhbGFuY2U+PgAACQkAAAINCQANCQgoc3Bfc3Rha2luZ0hJbmRpdmlkdWFsRXhwb3N1cmUIJEFjY291bnRJZAEAHEJhbGFuY2UBGAAIAQx3aG8AASRBY2NvdW50SWQAARR2YWx1ZfwBHEJhbGFuY2UAABEJCChzcF9zdGFraW5nVFBhZ2VkRXhwb3N1cmVNZXRhZGF0YQQcQmFsYW5jZQEYABABFHRvdGFs/AEcQmFsYW5jZQABDG93bvwBHEJhbGFuY2UAATxub21pbmF0b3JfY291bnQQAQx1MzIAAShwYWdlX2NvdW50EAEQUGFnZQAAFQkAAAQMEAAQABkJCChzcF9zdGFraW5nMEV4cG9zdXJlUGFnZQgkQWNjb3VudElkAQAcQmFsYW5jZQEYAAgBKHBhZ2VfdG90YWz8ARxCYWxhbmNlAAEYb3RoZXJzCQkBrFZlYzxJbmRpdmlkdWFsRXhwb3N1cmU8QWNjb3VudElkLCBCYWxhbmNlPj4AAB0JCDhwYWxsZXRfc3Rha2luZzxFcmFSZXdhcmRQb2ludHMEJEFjY291bnRJZAEAAAgBFHRvdGFsEAEsUmV3YXJkUG9pbnQAAShpbmRpdmlkdWFsIQkBgEJUcmVlTWFwPEFjY291bnRJZCwgUmV3YXJkUG9pbnQ+AAAhCQQgQlRyZWVNYXAIBEsBAARWARAABAAlCQAAACUJAAACKQkAKQkAAAQIABAALQkAAAIxCQAxCQg4cGFsbGV0X3N0YWtpbmc4VW5hcHBsaWVkU2xhc2gIJEFjY291bnRJZAEAHEJhbGFuY2UBGAAUASR2YWxpZGF0b3IAASRBY2NvdW50SWQAAQxvd24YARxCYWxhbmNlAAEYb3RoZXJzDQQBZFZlYzwoQWNjb3VudElkLCBCYWxhbmNlKT4AASRyZXBvcnRlcnPRAQE4VmVjPEFjY291bnRJZD4AARhwYXlvdXQYARxCYWxhbmNlAAA1CQAABAisGAA5CQw4cGFsbGV0X3N0YWtpbmcgc2xhc2hpbmc0U2xhc2hpbmdTcGFucwAAEAEoc3Bhbl9pbmRleBABJFNwYW5JbmRleAABKGxhc3Rfc3RhcnQQASBFcmFJbmRleAABSGxhc3Rfbm9uemVyb19zbGFzaBABIEVyYUluZGV4AAEUcHJpb3LlAQE0VmVjPEVyYUluZGV4PgAAPQkMOHBhbGxldF9zdGFraW5nIHNsYXNoaW5nKFNwYW5SZWNvcmQEHEJhbGFuY2UBGAAIARxzbGFzaGVkGAEcQmFsYW5jZQABIHBhaWRfb3V0GAEcQmFsYW5jZQAAQQkQOHBhbGxldF9zdGFraW5nGHBhbGxldBhwYWxsZXQURXJyb3IEBFQAAXw0Tm90Q29udHJvbGxlcgAABGROb3QgYSBjb250cm9sbGVyIGFjY291bnQuIE5vdFN0YXNoAAEEUE5vdCBhIHN0YXNoIGFjY291bnQuNEFscmVhZHlCb25kZWQAAgRgU3Rhc2ggaXMgYWxyZWFkeSBib25kZWQuNEFscmVhZHlQYWlyZWQAAwR0Q29udHJvbGxlciBpcyBhbHJlYWR5IHBhaXJlZC4wRW1wdHlUYXJnZXRzAAQEYFRhcmdldHMgY2Fubm90IGJlIGVtcHR5LjhEdXBsaWNhdGVJbmRleAAFBEBEdXBsaWNhdGUgaW5kZXguREludmFsaWRTbGFzaEluZGV4AAYEhFNsYXNoIHJlY29yZCBpbmRleCBvdXQgb2YgYm91bmRzLkBJbnN1ZmZpY2llbnRCb25kAAcMWQFDYW5ub3QgaGF2ZSBhIHZhbGlkYXRvciBvciBub21pbmF0b3Igcm9sZSwgd2l0aCB2YWx1ZSBsZXNzIHRoYW4gdGhlIG1pbmltdW0gZGVmaW5lZCBieT0BZ292ZXJuYW5jZSAoc2VlIGBNaW5WYWxpZGF0b3JCb25kYCBhbmQgYE1pbk5vbWluYXRvckJvbmRgKS4gSWYgdW5ib25kaW5nIGlzIHRoZRUBaW50ZW50aW9uLCBgY2hpbGxgIGZpcnN0IHRvIHJlbW92ZSBvbmUncyByb2xlIGFzIHZhbGlkYXRvci9ub21pbmF0b3IuME5vTW9yZUNodW5rcwAIBJBDYW4gbm90IHNjaGVkdWxlIG1vcmUgdW5sb2NrIGNodW5rcy40Tm9VbmxvY2tDaHVuawAJBKBDYW4gbm90IHJlYm9uZCB3aXRob3V0IHVubG9ja2luZyBjaHVua3MuMEZ1bmRlZFRhcmdldAAKBMhBdHRlbXB0aW5nIHRvIHRhcmdldCBhIHN0YXNoIHRoYXQgc3RpbGwgaGFzIGZ1bmRzLkhJbnZhbGlkRXJhVG9SZXdhcmQACwRYSW52YWxpZCBlcmEgdG8gcmV3YXJkLmhJbnZhbGlkTnVtYmVyT2ZOb21pbmF0aW9ucwAMBHhJbnZhbGlkIG51bWJlciBvZiBub21pbmF0aW9ucy5ITm90U29ydGVkQW5kVW5pcXVlAA0EgEl0ZW1zIGFyZSBub3Qgc29ydGVkIGFuZCB1bmlxdWUuOEFscmVhZHlDbGFpbWVkAA4ECQFSZXdhcmRzIGZvciB0aGlzIGVyYSBoYXZlIGFscmVhZHkgYmVlbiBjbGFpbWVkIGZvciB0aGlzIHZhbGlkYXRvci4sSW52YWxpZFBhZ2UADwSETm8gbm9taW5hdG9ycyBleGlzdCBvbiB0aGlzIHBhZ2UuVEluY29ycmVjdEhpc3RvcnlEZXB0aAAQBMBJbmNvcnJlY3QgcHJldmlvdXMgaGlzdG9yeSBkZXB0aCBpbnB1dCBwcm92aWRlZC5YSW5jb3JyZWN0U2xhc2hpbmdTcGFucwARBLBJbmNvcnJlY3QgbnVtYmVyIG9mIHNsYXNoaW5nIHNwYW5zIHByb3ZpZGVkLiBCYWRTdGF0ZQASBDkBSW50ZXJuYWwgc3RhdGUgaGFzIGJlY29tZSBzb21laG93IGNvcnJ1cHRlZCBhbmQgdGhlIG9wZXJhdGlvbiBjYW5ub3QgY29udGludWUuOFRvb01hbnlUYXJnZXRzABMElFRvbyBtYW55IG5vbWluYXRpb24gdGFyZ2V0cyBzdXBwbGllZC4kQmFkVGFyZ2V0ABQEPQFBIG5vbWluYXRpb24gdGFyZ2V0IHdhcyBzdXBwbGllZCB0aGF0IHdhcyBibG9ja2VkIG9yIG90aGVyd2lzZSBub3QgYSB2YWxpZGF0b3IuQENhbm5vdENoaWxsT3RoZXIAFQRVAVRoZSB1c2VyIGhhcyBlbm91Z2ggYm9uZCBhbmQgdGh1cyBjYW5ub3QgYmUgY2hpbGxlZCBmb3JjZWZ1bGx5IGJ5IGFuIGV4dGVybmFsIHBlcnNvbi5EVG9vTWFueU5vbWluYXRvcnMAFghNAVRoZXJlIGFyZSB0b28gbWFueSBub21pbmF0b3JzIGluIHRoZSBzeXN0ZW0uIEdvdmVybmFuY2UgbmVlZHMgdG8gYWRqdXN0IHRoZSBzdGFraW5ntHNldHRpbmdzIHRvIGtlZXAgdGhpbmdzIHNhZmUgZm9yIHRoZSBydW50aW1lLkRUb29NYW55VmFsaWRhdG9ycwAXCFUBVGhlcmUgYXJlIHRvbyBtYW55IHZhbGlkYXRvciBjYW5kaWRhdGVzIGluIHRoZSBzeXN0ZW0uIEdvdmVybmFuY2UgbmVlZHMgdG8gYWRqdXN0IHRoZdRzdGFraW5nIHNldHRpbmdzIHRvIGtlZXAgdGhpbmdzIHNhZmUgZm9yIHRoZSBydW50aW1lLkBDb21taXNzaW9uVG9vTG93ABgE4ENvbW1pc3Npb24gaXMgdG9vIGxvdy4gTXVzdCBiZSBhdCBsZWFzdCBgTWluQ29tbWlzc2lvbmAuLEJvdW5kTm90TWV0ABkEWFNvbWUgYm91bmQgaXMgbm90IG1ldC5QQ29udHJvbGxlckRlcHJlY2F0ZWQAGgQBAVVzZWQgd2hlbiBhdHRlbXB0aW5nIHRvIHVzZSBkZXByZWNhdGVkIGNvbnRyb2xsZXIgYWNjb3VudCBsb2dpYy5MQ2Fubm90UmVzdG9yZUxlZGdlcgAbBFhDYW5ub3QgcmVzZXQgYSBsZWRnZXIubFJld2FyZERlc3RpbmF0aW9uUmVzdHJpY3RlZAAcBKxQcm92aWRlZCByZXdhcmQgZGVzdGluYXRpb24gaXMgbm90IGFsbG93ZWQuOE5vdEVub3VnaEZ1bmRzAB0EnE5vdCBlbm91Z2ggZnVuZHMgYXZhaWxhYmxlIHRvIHdpdGhkcmF3LlxWaXJ0dWFsU3Rha2VyTm90QWxsb3dlZAAeBKhPcGVyYXRpb24gbm90IGFsbG93ZWQgZm9yIHZpcnR1YWwgc3Rha2Vycy4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQuRQkMKHNwX3N0YWtpbmccb2ZmZW5jZThPZmZlbmNlRGV0YWlscwggUmVwb3J0ZXIBACBPZmZlbmRlcgFJCQAIASBvZmZlbmRlckkJASBPZmZlbmRlcgABJHJlcG9ydGVyc9EBATRWZWM8UmVwb3J0ZXI+AABJCQAABAgABQkATQkAAAQIwDgAUQkAAAJVCQBVCQAABAgAGQIAWQkAAAQIXQk4AF0JDBxzcF9jb3JlGGNyeXB0byRLZXlUeXBlSWQAAAQASAEcW3U4OyA0XQAAYQkMOHBhbGxldF9zZXNzaW9uGHBhbGxldBRFcnJvcgQEVAABFDBJbnZhbGlkUHJvb2YAAARgSW52YWxpZCBvd25lcnNoaXAgcHJvb2YuXE5vQXNzb2NpYXRlZFZhbGlkYXRvcklkAAEEnE5vIGFzc29jaWF0ZWQgdmFsaWRhdG9yIElEIGZvciBhY2NvdW50LjREdXBsaWNhdGVkS2V5AAIEZFJlZ2lzdGVyZWQgZHVwbGljYXRlIGtleS4YTm9LZXlzAAMEpE5vIGtleXMgYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGFjY291bnQuJE5vQWNjb3VudAAEBBkBS2V5IHNldHRpbmcgYWNjb3VudCBpcyBub3QgbGl2ZSwgc28gaXQncyBpbXBvc3NpYmxlIHRvIGFzc29jaWF0ZSBrZXlzLgR0RXJyb3IgZm9yIHRoZSBzZXNzaW9uIHBhbGxldC5lCQg4cGFsbGV0X2dyYW5kcGEsU3RvcmVkU3RhdGUEBE4BEAEQEExpdmUAAAAwUGVuZGluZ1BhdXNlCAEwc2NoZWR1bGVkX2F0EAEETgABFGRlbGF5EAEETgABABhQYXVzZWQAAgA0UGVuZGluZ1Jlc3VtZQgBMHNjaGVkdWxlZF9hdBABBE4AARRkZWxheRABBE4AAwAAaQkIOHBhbGxldF9ncmFuZHBhTFN0b3JlZFBlbmRpbmdDaGFuZ2UIBE4BEBRMaW1pdAAAEAEwc2NoZWR1bGVkX2F0EAEETgABFGRlbGF5EAEETgABQG5leHRfYXV0aG9yaXRpZXNtCQFsQm91bmRlZEF1dGhvcml0eUxpc3Q8TGltaXQ+AAEYZm9yY2VkYQIBJE9wdGlvbjxOPgAAbQkMTGJvdW5kZWRfY29sbGVjdGlvbnNAd2Vha19ib3VuZGVkX3ZlYzhXZWFrQm91bmRlZFZlYwgEVAHQBFMAAAQAzAEYVmVjPFQ+AABxCQw4cGFsbGV0X2dyYW5kcGEYcGFsbGV0FEVycm9yBARUAAEcLFBhdXNlRmFpbGVkAAAIBQFBdHRlbXB0IHRvIHNpZ25hbCBHUkFORFBBIHBhdXNlIHdoZW4gdGhlIGF1dGhvcml0eSBzZXQgaXNuJ3QgbGl2ZaQoZWl0aGVyIHBhdXNlZCBvciBhbHJlYWR5IHBlbmRpbmcgcGF1c2UpLjBSZXN1bWVGYWlsZWQAAQgRAUF0dGVtcHQgdG8gc2lnbmFsIEdSQU5EUEEgcmVzdW1lIHdoZW4gdGhlIGF1dGhvcml0eSBzZXQgaXNuJ3QgcGF1c2VkoChlaXRoZXIgbGl2ZSBvciBhbHJlYWR5IHBlbmRpbmcgcmVzdW1lKS40Q2hhbmdlUGVuZGluZwACBOhBdHRlbXB0IHRvIHNpZ25hbCBHUkFORFBBIGNoYW5nZSB3aXRoIG9uZSBhbHJlYWR5IHBlbmRpbmcuHFRvb1Nvb24AAwS8Q2Fubm90IHNpZ25hbCBmb3JjZWQgY2hhbmdlIHNvIHNvb24gYWZ0ZXIgbGFzdC5gSW52YWxpZEtleU93bmVyc2hpcFByb29mAAQEMQFBIGtleSBvd25lcnNoaXAgcHJvb2YgcHJvdmlkZWQgYXMgcGFydCBvZiBhbiBlcXVpdm9jYXRpb24gcmVwb3J0IGlzIGludmFsaWQuYEludmFsaWRFcXVpdm9jYXRpb25Qcm9vZgAFBDEBQW4gZXF1aXZvY2F0aW9uIHByb29mIHByb3ZpZGVkIGFzIHBhcnQgb2YgYW4gZXF1aXZvY2F0aW9uIHJlcG9ydCBpcyBpbnZhbGlkLlhEdXBsaWNhdGVPZmZlbmNlUmVwb3J0AAYEFQFBIGdpdmVuIGVxdWl2b2NhdGlvbiByZXBvcnQgaXMgdmFsaWQgYnV0IGFscmVhZHkgcHJldmlvdXNseSByZXBvcnRlZC4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQudQkMTGJvdW5kZWRfY29sbGVjdGlvbnNAd2Vha19ib3VuZGVkX3ZlYzhXZWFrQm91bmRlZFZlYwgEVAElAgRTAAAEAHkJARhWZWM8VD4AAHkJAAACJQIAfQkIPHBhbGxldF90cmVhc3VyeSBQcm9wb3NhbAgkQWNjb3VudElkAQAcQmFsYW5jZQEYABABIHByb3Bvc2VyAAEkQWNjb3VudElkAAEUdmFsdWUYARxCYWxhbmNlAAEsYmVuZWZpY2lhcnkAASRBY2NvdW50SWQAARBib25kGAEcQmFsYW5jZQAAgQkMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAEQBFMAAAQA5QEBGFZlYzxUPgAAhQkIPHBhbGxldF90cmVhc3VyeSxTcGVuZFN0YXR1cxQkQXNzZXRLaW5kAdwwQXNzZXRCYWxhbmNlARgsQmVuZWZpY2lhcnkBRQEsQmxvY2tOdW1iZXIBECRQYXltZW50SWQBMAAYAShhc3NldF9raW5k3AEkQXNzZXRLaW5kAAEYYW1vdW50GAEwQXNzZXRCYWxhbmNlAAEsYmVuZWZpY2lhcnlFAQEsQmVuZWZpY2lhcnkAASh2YWxpZF9mcm9tEAEsQmxvY2tOdW1iZXIAASRleHBpcmVfYXQQASxCbG9ja051bWJlcgABGHN0YXR1c4kJAVxQYXltZW50U3RhdGU8UGF5bWVudElkPgAAiQkIPHBhbGxldF90cmVhc3VyeTBQYXltZW50U3RhdGUECElkATABDBxQZW5kaW5nAAAAJEF0dGVtcHRlZAQBCGlkMAEISWQAAQAYRmFpbGVkAAIAAI0JDDRzcF9hcml0aG1ldGljKHBlcl90aGluZ3McUGVybWlsbAAABAAQAQx1MzIAAJEJCDRmcmFtZV9zdXBwb3J0IFBhbGxldElkAAAEALEFARxbdTg7IDhdAACVCQw8cGFsbGV0X3RyZWFzdXJ5GHBhbGxldBRFcnJvcggEVAAESQABLDBJbnZhbGlkSW5kZXgAAASsTm8gcHJvcG9zYWwsIGJvdW50eSBvciBzcGVuZCBhdCB0aGF0IGluZGV4LkBUb29NYW55QXBwcm92YWxzAAEEgFRvbyBtYW55IGFwcHJvdmFscyBpbiB0aGUgcXVldWUuWEluc3VmZmljaWVudFBlcm1pc3Npb24AAghFAVRoZSBzcGVuZCBvcmlnaW4gaXMgdmFsaWQgYnV0IHRoZSBhbW91bnQgaXQgaXMgYWxsb3dlZCB0byBzcGVuZCBpcyBsb3dlciB0aGFuIHRoZUxhbW91bnQgdG8gYmUgc3BlbnQuTFByb3Bvc2FsTm90QXBwcm92ZWQAAwR8UHJvcG9zYWwgaGFzIG5vdCBiZWVuIGFwcHJvdmVkLlhGYWlsZWRUb0NvbnZlcnRCYWxhbmNlAAQEUQFUaGUgYmFsYW5jZSBvZiB0aGUgYXNzZXQga2luZCBpcyBub3QgY29udmVydGlibGUgdG8gdGhlIGJhbGFuY2Ugb2YgdGhlIG5hdGl2ZSBhc3NldC4wU3BlbmRFeHBpcmVkAAUEsFRoZSBzcGVuZCBoYXMgZXhwaXJlZCBhbmQgY2Fubm90IGJlIGNsYWltZWQuLEVhcmx5UGF5b3V0AAYEpFRoZSBzcGVuZCBpcyBub3QgeWV0IGVsaWdpYmxlIGZvciBwYXlvdXQuQEFscmVhZHlBdHRlbXB0ZWQABwScVGhlIHBheW1lbnQgaGFzIGFscmVhZHkgYmVlbiBhdHRlbXB0ZWQuLFBheW91dEVycm9yAAgEzFRoZXJlIHdhcyBzb21lIGlzc3VlIHdpdGggdGhlIG1lY2hhbmlzbSBvZiBwYXltZW50LjBOb3RBdHRlbXB0ZWQACQSkVGhlIHBheW91dCB3YXMgbm90IHlldCBhdHRlbXB0ZWQvY2xhaW1lZC4wSW5jb25jbHVzaXZlAAoExFRoZSBwYXltZW50IGhhcyBuZWl0aGVyIGZhaWxlZCBub3Igc3VjY2VlZGVkIHlldC4EeEVycm9yIGZvciB0aGUgdHJlYXN1cnkgcGFsbGV0LpkJAAAECABtAQCdCQxgcGFsbGV0X2NvbnZpY3Rpb25fdm90aW5nEHZvdGUYVm90aW5nFBxCYWxhbmNlARgkQWNjb3VudElkAQAsQmxvY2tOdW1iZXIBECRQb2xsSW5kZXgBECBNYXhWb3RlcwABCBxDYXN0aW5nBAChCQHIQ2FzdGluZzxCYWxhbmNlLCBCbG9ja051bWJlciwgUG9sbEluZGV4LCBNYXhWb3Rlcz4AAAAoRGVsZWdhdGluZwQAuQkBrERlbGVnYXRpbmc8QmFsYW5jZSwgQWNjb3VudElkLCBCbG9ja051bWJlcj4AAQAAoQkMYHBhbGxldF9jb252aWN0aW9uX3ZvdGluZxB2b3RlHENhc3RpbmcQHEJhbGFuY2UBGCxCbG9ja051bWJlcgEQJFBvbGxJbmRleAEQIE1heFZvdGVzAAAMARR2b3Rlc6UJAdxCb3VuZGVkVmVjPChQb2xsSW5kZXgsIEFjY291bnRWb3RlPEJhbGFuY2U+KSwgTWF4Vm90ZXM+AAEsZGVsZWdhdGlvbnOxCQFQRGVsZWdhdGlvbnM8QmFsYW5jZT4AARRwcmlvcrUJAXxQcmlvckxvY2s8QmxvY2tOdW1iZXIsIEJhbGFuY2U+AAClCQxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAakJBFMAAAQArQkBGFZlYzxUPgAAqQkAAAQIEGkCAK0JAAACqQkAsQkMYHBhbGxldF9jb252aWN0aW9uX3ZvdGluZxR0eXBlcyxEZWxlZ2F0aW9ucwQcQmFsYW5jZQEYAAgBFHZvdGVzGAEcQmFsYW5jZQABHGNhcGl0YWwYARxCYWxhbmNlAAC1CQxgcGFsbGV0X2NvbnZpY3Rpb25fdm90aW5nEHZvdGUkUHJpb3JMb2NrCCxCbG9ja051bWJlcgEQHEJhbGFuY2UBGAAIABABLEJsb2NrTnVtYmVyAAAYARxCYWxhbmNlAAC5CQxgcGFsbGV0X2NvbnZpY3Rpb25fdm90aW5nEHZvdGUoRGVsZWdhdGluZwwcQmFsYW5jZQEYJEFjY291bnRJZAEALEJsb2NrTnVtYmVyARAAFAEcYmFsYW5jZRgBHEJhbGFuY2UAARh0YXJnZXQAASRBY2NvdW50SWQAAShjb252aWN0aW9ucQIBKENvbnZpY3Rpb24AASxkZWxlZ2F0aW9uc7EJAVBEZWxlZ2F0aW9uczxCYWxhbmNlPgABFHByaW9ytQkBfFByaW9yTG9jazxCbG9ja051bWJlciwgQmFsYW5jZT4AAL0JDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBwQkEUwAABADFCQEYVmVjPFQ+AADBCQAABAhtARgAxQkAAALBCQDJCQxgcGFsbGV0X2NvbnZpY3Rpb25fdm90aW5nGHBhbGxldBRFcnJvcggEVAAESQABMChOb3RPbmdvaW5nAAAEUFBvbGwgaXMgbm90IG9uZ29pbmcuIE5vdFZvdGVyAAEErFRoZSBnaXZlbiBhY2NvdW50IGRpZCBub3Qgdm90ZSBvbiB0aGUgcG9sbC4wTm9QZXJtaXNzaW9uAAIEyFRoZSBhY3RvciBoYXMgbm8gcGVybWlzc2lvbiB0byBjb25kdWN0IHRoZSBhY3Rpb24uPE5vUGVybWlzc2lvbllldAADBFkBVGhlIGFjdG9yIGhhcyBubyBwZXJtaXNzaW9uIHRvIGNvbmR1Y3QgdGhlIGFjdGlvbiByaWdodCBub3cgYnV0IHdpbGwgZG8gaW4gdGhlIGZ1dHVyZS5EQWxyZWFkeURlbGVnYXRpbmcABASIVGhlIGFjY291bnQgaXMgYWxyZWFkeSBkZWxlZ2F0aW5nLjRBbHJlYWR5Vm90aW5nAAUIVQFUaGUgYWNjb3VudCBjdXJyZW50bHkgaGFzIHZvdGVzIGF0dGFjaGVkIHRvIGl0IGFuZCB0aGUgb3BlcmF0aW9uIGNhbm5vdCBzdWNjZWVkIHVudGlsoHRoZXNlIGFyZSByZW1vdmVkIHRocm91Z2ggYHJlbW92ZV92b3RlYC5ESW5zdWZmaWNpZW50RnVuZHMABgT8VG9vIGhpZ2ggYSBiYWxhbmNlIHdhcyBwcm92aWRlZCB0aGF0IHRoZSBhY2NvdW50IGNhbm5vdCBhZmZvcmQuNE5vdERlbGVnYXRpbmcABwSgVGhlIGFjY291bnQgaXMgbm90IGN1cnJlbnRseSBkZWxlZ2F0aW5nLiBOb25zZW5zZQAIBJREZWxlZ2F0aW9uIHRvIG9uZXNlbGYgbWFrZXMgbm8gc2Vuc2UuPE1heFZvdGVzUmVhY2hlZAAJBIBNYXhpbXVtIG51bWJlciBvZiB2b3RlcyByZWFjaGVkLixDbGFzc05lZWRlZAAKBDkBVGhlIGNsYXNzIG11c3QgYmUgc3VwcGxpZWQgc2luY2UgaXQgaXMgbm90IGVhc2lseSBkZXRlcm1pbmFibGUgZnJvbSB0aGUgc3RhdGUuIEJhZENsYXNzAAsEhFRoZSBjbGFzcyBJRCBzdXBwbGllZCBpcyBpbnZhbGlkLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC7NCQxAcGFsbGV0X3JlZmVyZW5kYRR0eXBlczhSZWZlcmVuZHVtSW5mbyAcVHJhY2tJZAFtATRSdW50aW1lT3JpZ2luAX0CGE1vbWVudAEQEENhbGwBcQEcQmFsYW5jZQEYFFRhbGx5AQ0HJEFjY291bnRJZAEAPFNjaGVkdWxlQWRkcmVzcwGAARgcT25nb2luZwQA0QkBjQFSZWZlcmVuZHVtU3RhdHVzPFRyYWNrSWQsIFJ1bnRpbWVPcmlnaW4sIE1vbWVudCwgQ2FsbCwgQmFsYW5jZSwgVGFsbHksCkFjY291bnRJZCwgU2NoZWR1bGVBZGRyZXNzLD4AAAAgQXBwcm92ZWQMABABGE1vbWVudAAA2QkBjE9wdGlvbjxEZXBvc2l0PEFjY291bnRJZCwgQmFsYW5jZT4+AADZCQGMT3B0aW9uPERlcG9zaXQ8QWNjb3VudElkLCBCYWxhbmNlPj4AAQAgUmVqZWN0ZWQMABABGE1vbWVudAAA2QkBjE9wdGlvbjxEZXBvc2l0PEFjY291bnRJZCwgQmFsYW5jZT4+AADZCQGMT3B0aW9uPERlcG9zaXQ8QWNjb3VudElkLCBCYWxhbmNlPj4AAgAkQ2FuY2VsbGVkDAAQARhNb21lbnQAANkJAYxPcHRpb248RGVwb3NpdDxBY2NvdW50SWQsIEJhbGFuY2U+PgAA2QkBjE9wdGlvbjxEZXBvc2l0PEFjY291bnRJZCwgQmFsYW5jZT4+AAMAIFRpbWVkT3V0DAAQARhNb21lbnQAANkJAYxPcHRpb248RGVwb3NpdDxBY2NvdW50SWQsIEJhbGFuY2U+PgAA2QkBjE9wdGlvbjxEZXBvc2l0PEFjY291bnRJZCwgQmFsYW5jZT4+AAQAGEtpbGxlZAQAEAEYTW9tZW50AAUAANEJDEBwYWxsZXRfcmVmZXJlbmRhFHR5cGVzQFJlZmVyZW5kdW1TdGF0dXMgHFRyYWNrSWQBbQE0UnVudGltZU9yaWdpbgF9AhhNb21lbnQBEBBDYWxsAXEBHEJhbGFuY2UBGBRUYWxseQENByRBY2NvdW50SWQBADxTY2hlZHVsZUFkZHJlc3MBgAAsARR0cmFja20BARxUcmFja0lkAAEYb3JpZ2lufQIBNFJ1bnRpbWVPcmlnaW4AASBwcm9wb3NhbHEBARBDYWxsAAEkZW5hY3RtZW50mQIBUERpc3BhdGNoVGltZTxNb21lbnQ+AAEkc3VibWl0dGVkEAEYTW9tZW50AAFIc3VibWlzc2lvbl9kZXBvc2l01QkBbERlcG9zaXQ8QWNjb3VudElkLCBCYWxhbmNlPgABQGRlY2lzaW9uX2RlcG9zaXTZCQGMT3B0aW9uPERlcG9zaXQ8QWNjb3VudElkLCBCYWxhbmNlPj4AASBkZWNpZGluZ90JAXhPcHRpb248RGVjaWRpbmdTdGF0dXM8TW9tZW50Pj4AARR0YWxseQ0HARRUYWxseQABIGluX3F1ZXVlIAEQYm9vbAABFGFsYXJt5QkBhE9wdGlvbjwoTW9tZW50LCBTY2hlZHVsZUFkZHJlc3MpPgAA1QkMQHBhbGxldF9yZWZlcmVuZGEUdHlwZXMcRGVwb3NpdAgkQWNjb3VudElkAQAcQmFsYW5jZQEYAAgBDHdobwABJEFjY291bnRJZAABGGFtb3VudBgBHEJhbGFuY2UAANkJBBhPcHRpb24EBFQB1QkBCBBOb25lAAAAEFNvbWUEANUJAAABAADdCQQYT3B0aW9uBARUAeEJAQgQTm9uZQAAABBTb21lBADhCQAAAQAA4QkMQHBhbGxldF9yZWZlcmVuZGEUdHlwZXM4RGVjaWRpbmdTdGF0dXMELEJsb2NrTnVtYmVyARAACAEUc2luY2UQASxCbG9ja051bWJlcgABKGNvbmZpcm1pbmdhAgFMT3B0aW9uPEJsb2NrTnVtYmVyPgAA5QkEGE9wdGlvbgQEVAHpCQEIEE5vbmUAAAAQU29tZQQA6QkAAAEAAOkJAAAECBCAAO0JDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQB8QkEUwAABAD1CQEYVmVjPFQ+AADxCQAABAgQGAD1CQAAAvEJAPkJAAAC/QkA/QkAAAQIbQEBCgABCgxAcGFsbGV0X3JlZmVyZW5kYRR0eXBlcyRUcmFja0luZm8IHEJhbGFuY2UBGBhNb21lbnQBEAAkARBuYW1l4QcBMCYnc3RhdGljIHN0cgABMG1heF9kZWNpZGluZxABDHUzMgABQGRlY2lzaW9uX2RlcG9zaXQYARxCYWxhbmNlAAE4cHJlcGFyZV9wZXJpb2QQARhNb21lbnQAATxkZWNpc2lvbl9wZXJpb2QQARhNb21lbnQAAThjb25maXJtX3BlcmlvZBABGE1vbWVudAABUG1pbl9lbmFjdG1lbnRfcGVyaW9kEAEYTW9tZW50AAEwbWluX2FwcHJvdmFsBQoBFEN1cnZlAAEsbWluX3N1cHBvcnQFCgEUQ3VydmUAAAUKDEBwYWxsZXRfcmVmZXJlbmRhFHR5cGVzFEN1cnZlAAEMQExpbmVhckRlY3JlYXNpbmcMARhsZW5ndGisARxQZXJiaWxsAAEUZmxvb3KsARxQZXJiaWxsAAEQY2VpbKwBHFBlcmJpbGwAAABEU3RlcHBlZERlY3JlYXNpbmcQARRiZWdpbqwBHFBlcmJpbGwAAQxlbmSsARxQZXJiaWxsAAEQc3RlcKwBHFBlcmJpbGwAARhwZXJpb2SsARxQZXJiaWxsAAEAKFJlY2lwcm9jYWwMARhmYWN0b3IJCgEgRml4ZWRJNjQAASB4X29mZnNldAkKASBGaXhlZEk2NAABIHlfb2Zmc2V0CQoBIEZpeGVkSTY0AAIAAAkKDDRzcF9hcml0aG1ldGljLGZpeGVkX3BvaW50IEZpeGVkSTY0AAAEAA0KAQxpNjQAAA0KAAAFDAARCgxAcGFsbGV0X3JlZmVyZW5kYRhwYWxsZXQURXJyb3IIBFQABEkAATgoTm90T25nb2luZwAABGhSZWZlcmVuZHVtIGlzIG5vdCBvbmdvaW5nLihIYXNEZXBvc2l0AAEEuFJlZmVyZW5kdW0ncyBkZWNpc2lvbiBkZXBvc2l0IGlzIGFscmVhZHkgcGFpZC4gQmFkVHJhY2sAAgScVGhlIHRyYWNrIGlkZW50aWZpZXIgZ2l2ZW4gd2FzIGludmFsaWQuEEZ1bGwAAwQxAVRoZXJlIGFyZSBhbHJlYWR5IGEgZnVsbCBjb21wbGVtZW50IG9mIHJlZmVyZW5kYSBpbiBwcm9ncmVzcyBmb3IgdGhpcyB0cmFjay4oUXVldWVFbXB0eQAEBIBUaGUgcXVldWUgb2YgdGhlIHRyYWNrIGlzIGVtcHR5LjRCYWRSZWZlcmVuZHVtAAUE5FRoZSByZWZlcmVuZHVtIGluZGV4IHByb3ZpZGVkIGlzIGludmFsaWQgaW4gdGhpcyBjb250ZXh0LixOb3RoaW5nVG9EbwAGBKxUaGVyZSB3YXMgbm90aGluZyB0byBkbyBpbiB0aGUgYWR2YW5jZW1lbnQuHE5vVHJhY2sABwSgTm8gdHJhY2sgZXhpc3RzIGZvciB0aGUgcHJvcG9zYWwgb3JpZ2luLihVbmZpbmlzaGVkAAgEAQFBbnkgZGVwb3NpdCBjYW5ub3QgYmUgcmVmdW5kZWQgdW50aWwgYWZ0ZXIgdGhlIGRlY2lzaW9uIGlzIG92ZXIuME5vUGVybWlzc2lvbgAJBKhUaGUgZGVwb3NpdCByZWZ1bmRlciBpcyBub3QgdGhlIGRlcG9zaXRvci4kTm9EZXBvc2l0AAoEzFRoZSBkZXBvc2l0IGNhbm5vdCBiZSByZWZ1bmRlZCBzaW5jZSBub25lIHdhcyBtYWRlLiRCYWRTdGF0dXMACwTQVGhlIHJlZmVyZW5kdW0gc3RhdHVzIGlzIGludmFsaWQgZm9yIHRoaXMgb3BlcmF0aW9uLkBQcmVpbWFnZU5vdEV4aXN0AAwEcFRoZSBwcmVpbWFnZSBkb2VzIG5vdCBleGlzdC6EUHJlaW1hZ2VTdG9yZWRXaXRoRGlmZmVyZW50TGVuZ3RoAA0EFQFUaGUgcHJlaW1hZ2UgaXMgc3RvcmVkIHdpdGggYSBkaWZmZXJlbnQgbGVuZ3RoIHRoYW4gdGhlIG9uZSBwcm92aWRlZC4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQuFQoMQHBhbGxldF93aGl0ZWxpc3QYcGFsbGV0FEVycm9yBARUAAEUTFVuYXZhaWxhYmxlUHJlSW1hZ2UAAATIVGhlIHByZWltYWdlIG9mIHRoZSBjYWxsIGhhc2ggY291bGQgbm90IGJlIGxvYWRlZC48VW5kZWNvZGFibGVDYWxsAAEEeFRoZSBjYWxsIGNvdWxkIG5vdCBiZSBkZWNvZGVkLmBJbnZhbGlkQ2FsbFdlaWdodFdpdG5lc3MAAgTsVGhlIHdlaWdodCBvZiB0aGUgZGVjb2RlZCBjYWxsIHdhcyBoaWdoZXIgdGhhbiB0aGUgd2l0bmVzcy5QQ2FsbElzTm90V2hpdGVsaXN0ZWQAAwR0VGhlIGNhbGwgd2FzIG5vdCB3aGl0ZWxpc3RlZC5YQ2FsbEFscmVhZHlXaGl0ZWxpc3RlZAAEBKBUaGUgY2FsbCB3YXMgYWxyZWFkeSB3aGl0ZWxpc3RlZDsgTm8tT3AuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LhkKEFxwb2xrYWRvdF9ydW50aW1lX2NvbW1vbhhjbGFpbXMYcGFsbGV0FEVycm9yBARUAAEYYEludmFsaWRFdGhlcmV1bVNpZ25hdHVyZQAABGxJbnZhbGlkIEV0aGVyZXVtIHNpZ25hdHVyZS5AU2lnbmVySGFzTm9DbGFpbQABBHhFdGhlcmV1bSBhZGRyZXNzIGhhcyBubyBjbGFpbS5AU2VuZGVySGFzTm9DbGFpbQACBLBBY2NvdW50IElEIHNlbmRpbmcgdHJhbnNhY3Rpb24gaGFzIG5vIGNsYWltLjBQb3RVbmRlcmZsb3cAAwhJAVRoZXJlJ3Mgbm90IGVub3VnaCBpbiB0aGUgcG90IHRvIHBheSBvdXQgc29tZSB1bnZlc3RlZCBhbW91bnQuIEdlbmVyYWxseSBpbXBsaWVzIGEwbG9naWMgZXJyb3IuQEludmFsaWRTdGF0ZW1lbnQABASQQSBuZWVkZWQgc3RhdGVtZW50IHdhcyBub3QgaW5jbHVkZWQuTFZlc3RlZEJhbGFuY2VFeGlzdHMABQSkVGhlIGFjY291bnQgYWxyZWFkeSBoYXMgYSB2ZXN0ZWQgYmFsYW5jZS4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQuHQoMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAH1AgRTAAAEACEKARhWZWM8VD4AACEKAAAC9QIAJQoIOHBhbGxldF92ZXN0aW5nIFJlbGVhc2VzAAEICFYwAAAACFYxAAEAACkKDDhwYWxsZXRfdmVzdGluZxhwYWxsZXQURXJyb3IEBFQAARQoTm90VmVzdGluZwAABIRUaGUgYWNjb3VudCBnaXZlbiBpcyBub3QgdmVzdGluZy5UQXRNYXhWZXN0aW5nU2NoZWR1bGVzAAEIJQFUaGUgYWNjb3VudCBhbHJlYWR5IGhhcyBgTWF4VmVzdGluZ1NjaGVkdWxlc2AgY291bnQgb2Ygc2NoZWR1bGVzIGFuZCB0aHVzUQFjYW5ub3QgYWRkIGFub3RoZXIgb25lLiBDb25zaWRlciBtZXJnaW5nIGV4aXN0aW5nIHNjaGVkdWxlcyBpbiBvcmRlciB0byBhZGQgYW5vdGhlci4kQW1vdW50TG93AAIEBQFBbW91bnQgYmVpbmcgdHJhbnNmZXJyZWQgaXMgdG9vIGxvdyB0byBjcmVhdGUgYSB2ZXN0aW5nIHNjaGVkdWxlLmBTY2hlZHVsZUluZGV4T3V0T2ZCb3VuZHMAAwTQQW4gaW5kZXggd2FzIG91dCBvZiBib3VuZHMgb2YgdGhlIHZlc3Rpbmcgc2NoZWR1bGVzLlRJbnZhbGlkU2NoZWR1bGVQYXJhbXMABAQNAUZhaWxlZCB0byBjcmVhdGUgYSBuZXcgc2NoZWR1bGUgYmVjYXVzZSBzb21lIHBhcmFtZXRlciB3YXMgaW52YWxpZC4EdEVycm9yIGZvciB0aGUgdmVzdGluZyBwYWxsZXQuLQoMOHBhbGxldF91dGlsaXR5GHBhbGxldBRFcnJvcgQEVAABBDBUb29NYW55Q2FsbHMAAARcVG9vIG1hbnkgY2FsbHMgYmF0Y2hlZC4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQuMQoAAAQINQoYADUKDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBOQoEUwAABAA9CgEYVmVjPFQ+AAA5CggwcGFsbGV0X3Byb3h5PFByb3h5RGVmaW5pdGlvbgwkQWNjb3VudElkAQAkUHJveHlUeXBlAQkDLEJsb2NrTnVtYmVyARAADAEgZGVsZWdhdGUAASRBY2NvdW50SWQAAShwcm94eV90eXBlCQMBJFByb3h5VHlwZQABFGRlbGF5EAEsQmxvY2tOdW1iZXIAAD0KAAACOQoAQQoAAAQIRQoYAEUKDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBSQoEUwAABABNCgEYVmVjPFQ+AABJCggwcGFsbGV0X3Byb3h5MEFubm91bmNlbWVudAwkQWNjb3VudElkAQAQSGFzaAE0LEJsb2NrTnVtYmVyARAADAEQcmVhbAABJEFjY291bnRJZAABJGNhbGxfaGFzaDQBEEhhc2gAARhoZWlnaHQQASxCbG9ja051bWJlcgAATQoAAAJJCgBRCgwwcGFsbGV0X3Byb3h5GHBhbGxldBRFcnJvcgQEVAABIBxUb29NYW55AAAEIQFUaGVyZSBhcmUgdG9vIG1hbnkgcHJveGllcyByZWdpc3RlcmVkIG9yIHRvbyBtYW55IGFubm91bmNlbWVudHMgcGVuZGluZy4gTm90Rm91bmQAAQR0UHJveHkgcmVnaXN0cmF0aW9uIG5vdCBmb3VuZC4gTm90UHJveHkAAgTMU2VuZGVyIGlzIG5vdCBhIHByb3h5IG9mIHRoZSBhY2NvdW50IHRvIGJlIHByb3hpZWQuLFVucHJveHlhYmxlAAMEIQFBIGNhbGwgd2hpY2ggaXMgaW5jb21wYXRpYmxlIHdpdGggdGhlIHByb3h5IHR5cGUncyBmaWx0ZXIgd2FzIGF0dGVtcHRlZC4kRHVwbGljYXRlAAQEbEFjY291bnQgaXMgYWxyZWFkeSBhIHByb3h5LjBOb1Blcm1pc3Npb24ABQQVAUNhbGwgbWF5IG5vdCBiZSBtYWRlIGJ5IHByb3h5IGJlY2F1c2UgaXQgbWF5IGVzY2FsYXRlIGl0cyBwcml2aWxlZ2VzLixVbmFubm91bmNlZAAGBNBBbm5vdW5jZW1lbnQsIGlmIG1hZGUgYXQgYWxsLCB3YXMgbWFkZSB0b28gcmVjZW50bHkuLE5vU2VsZlByb3h5AAcEZENhbm5vdCBhZGQgc2VsZiBhcyBwcm94eS4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQuVQoAAAQIAAQAWQoIPHBhbGxldF9tdWx0aXNpZyBNdWx0aXNpZxAsQmxvY2tOdW1iZXIBEBxCYWxhbmNlARgkQWNjb3VudElkAQAwTWF4QXBwcm92YWxzAAAQARB3aGVuFQMBWFRpbWVwb2ludDxCbG9ja051bWJlcj4AARxkZXBvc2l0GAEcQmFsYW5jZQABJGRlcG9zaXRvcgABJEFjY291bnRJZAABJGFwcHJvdmFsc10KAYxCb3VuZGVkVmVjPEFjY291bnRJZCwgTWF4QXBwcm92YWxzPgAAXQoMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAEABFMAAAQA0QEBGFZlYzxUPgAAYQoMPHBhbGxldF9tdWx0aXNpZxhwYWxsZXQURXJyb3IEBFQAAThATWluaW11bVRocmVzaG9sZAAABHxUaHJlc2hvbGQgbXVzdCBiZSAyIG9yIGdyZWF0ZXIuPEFscmVhZHlBcHByb3ZlZAABBKxDYWxsIGlzIGFscmVhZHkgYXBwcm92ZWQgYnkgdGhpcyBzaWduYXRvcnkuRE5vQXBwcm92YWxzTmVlZGVkAAIEnENhbGwgZG9lc24ndCBuZWVkIGFueSAobW9yZSkgYXBwcm92YWxzLkRUb29GZXdTaWduYXRvcmllcwADBKhUaGVyZSBhcmUgdG9vIGZldyBzaWduYXRvcmllcyBpbiB0aGUgbGlzdC5IVG9vTWFueVNpZ25hdG9yaWVzAAQErFRoZXJlIGFyZSB0b28gbWFueSBzaWduYXRvcmllcyBpbiB0aGUgbGlzdC5UU2lnbmF0b3JpZXNPdXRPZk9yZGVyAAUEDQFUaGUgc2lnbmF0b3JpZXMgd2VyZSBwcm92aWRlZCBvdXQgb2Ygb3JkZXI7IHRoZXkgc2hvdWxkIGJlIG9yZGVyZWQuTFNlbmRlckluU2lnbmF0b3JpZXMABgQNAVRoZSBzZW5kZXIgd2FzIGNvbnRhaW5lZCBpbiB0aGUgb3RoZXIgc2lnbmF0b3JpZXM7IGl0IHNob3VsZG4ndCBiZS4gTm90Rm91bmQABwTcTXVsdGlzaWcgb3BlcmF0aW9uIG5vdCBmb3VuZCB3aGVuIGF0dGVtcHRpbmcgdG8gY2FuY2VsLiBOb3RPd25lcgAIBC0BT25seSB0aGUgYWNjb3VudCB0aGF0IG9yaWdpbmFsbHkgY3JlYXRlZCB0aGUgbXVsdGlzaWcgaXMgYWJsZSB0byBjYW5jZWwgaXQuLE5vVGltZXBvaW50AAkEHQFObyB0aW1lcG9pbnQgd2FzIGdpdmVuLCB5ZXQgdGhlIG11bHRpc2lnIG9wZXJhdGlvbiBpcyBhbHJlYWR5IHVuZGVyd2F5LjhXcm9uZ1RpbWVwb2ludAAKBC0BQSBkaWZmZXJlbnQgdGltZXBvaW50IHdhcyBnaXZlbiB0byB0aGUgbXVsdGlzaWcgb3BlcmF0aW9uIHRoYXQgaXMgdW5kZXJ3YXkuTFVuZXhwZWN0ZWRUaW1lcG9pbnQACwT0QSB0aW1lcG9pbnQgd2FzIGdpdmVuLCB5ZXQgbm8gbXVsdGlzaWcgb3BlcmF0aW9uIGlzIHVuZGVyd2F5LjxNYXhXZWlnaHRUb29Mb3cADATQVGhlIG1heGltdW0gd2VpZ2h0IGluZm9ybWF0aW9uIHByb3ZpZGVkIHdhcyB0b28gbG93LjRBbHJlYWR5U3RvcmVkAA0EoFRoZSBkYXRhIHRvIGJlIHN0b3JlZCBpcyBhbHJlYWR5IHN0b3JlZC4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQuZQoIPHBhbGxldF9ib3VudGllcxhCb3VudHkMJEFjY291bnRJZAEAHEJhbGFuY2UBGCxCbG9ja051bWJlcgEQABgBIHByb3Bvc2VyAAEkQWNjb3VudElkAAEUdmFsdWUYARxCYWxhbmNlAAEMZmVlGAEcQmFsYW5jZQABPGN1cmF0b3JfZGVwb3NpdBgBHEJhbGFuY2UAARBib25kGAEcQmFsYW5jZQABGHN0YXR1c2kKAZBCb3VudHlTdGF0dXM8QWNjb3VudElkLCBCbG9ja051bWJlcj4AAGkKCDxwYWxsZXRfYm91bnRpZXMwQm91bnR5U3RhdHVzCCRBY2NvdW50SWQBACxCbG9ja051bWJlcgEQARggUHJvcG9zZWQAAAAgQXBwcm92ZWQAAQAYRnVuZGVkAAIAPEN1cmF0b3JQcm9wb3NlZAQBHGN1cmF0b3IAASRBY2NvdW50SWQAAwAYQWN0aXZlCAEcY3VyYXRvcgABJEFjY291bnRJZAABKHVwZGF0ZV9kdWUQASxCbG9ja051bWJlcgAEADRQZW5kaW5nUGF5b3V0DAEcY3VyYXRvcgABJEFjY291bnRJZAABLGJlbmVmaWNpYXJ5AAEkQWNjb3VudElkAAEkdW5sb2NrX2F0EAEsQmxvY2tOdW1iZXIABQAAbQoMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAEIBFMAAAQAOAEYVmVjPFQ+AABxCgw8cGFsbGV0X2JvdW50aWVzGHBhbGxldBRFcnJvcggEVAAESQABLHBJbnN1ZmZpY2llbnRQcm9wb3NlcnNCYWxhbmNlAAAEeFByb3Bvc2VyJ3MgYmFsYW5jZSBpcyB0b28gbG93LjBJbnZhbGlkSW5kZXgAAQSQTm8gcHJvcG9zYWwgb3IgYm91bnR5IGF0IHRoYXQgaW5kZXguMFJlYXNvblRvb0JpZwACBIRUaGUgcmVhc29uIGdpdmVuIGlzIGp1c3QgdG9vIGJpZy5AVW5leHBlY3RlZFN0YXR1cwADBIBUaGUgYm91bnR5IHN0YXR1cyBpcyB1bmV4cGVjdGVkLjhSZXF1aXJlQ3VyYXRvcgAEBFxSZXF1aXJlIGJvdW50eSBjdXJhdG9yLjBJbnZhbGlkVmFsdWUABQRUSW52YWxpZCBib3VudHkgdmFsdWUuKEludmFsaWRGZWUABgRMSW52YWxpZCBib3VudHkgZmVlLjRQZW5kaW5nUGF5b3V0AAcIbEEgYm91bnR5IHBheW91dCBpcyBwZW5kaW5nLvhUbyBjYW5jZWwgdGhlIGJvdW50eSwgeW91IG11c3QgdW5hc3NpZ24gYW5kIHNsYXNoIHRoZSBjdXJhdG9yLiRQcmVtYXR1cmUACARFAVRoZSBib3VudGllcyBjYW5ub3QgYmUgY2xhaW1lZC9jbG9zZWQgYmVjYXVzZSBpdCdzIHN0aWxsIGluIHRoZSBjb3VudGRvd24gcGVyaW9kLlBIYXNBY3RpdmVDaGlsZEJvdW50eQAJBAUBVGhlIGJvdW50eSBjYW5ub3QgYmUgY2xvc2VkIGJlY2F1c2UgaXQgaGFzIGFjdGl2ZSBjaGlsZCBib3VudGllcy40VG9vTWFueVF1ZXVlZAAKBJhUb28gbWFueSBhcHByb3ZhbHMgYXJlIGFscmVhZHkgcXVldWVkLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC51CghUcGFsbGV0X2NoaWxkX2JvdW50aWVzLENoaWxkQm91bnR5DCRBY2NvdW50SWQBABxCYWxhbmNlARgsQmxvY2tOdW1iZXIBEAAUATRwYXJlbnRfYm91bnR5EAEsQm91bnR5SW5kZXgAARR2YWx1ZRgBHEJhbGFuY2UAAQxmZWUYARxCYWxhbmNlAAE8Y3VyYXRvcl9kZXBvc2l0GAEcQmFsYW5jZQABGHN0YXR1c3kKAaRDaGlsZEJvdW50eVN0YXR1czxBY2NvdW50SWQsIEJsb2NrTnVtYmVyPgAAeQoIVHBhbGxldF9jaGlsZF9ib3VudGllc0RDaGlsZEJvdW50eVN0YXR1cwgkQWNjb3VudElkAQAsQmxvY2tOdW1iZXIBEAEQFEFkZGVkAAAAPEN1cmF0b3JQcm9wb3NlZAQBHGN1cmF0b3IAASRBY2NvdW50SWQAAQAYQWN0aXZlBAEcY3VyYXRvcgABJEFjY291bnRJZAACADRQZW5kaW5nUGF5b3V0DAEcY3VyYXRvcgABJEFjY291bnRJZAABLGJlbmVmaWNpYXJ5AAEkQWNjb3VudElkAAEkdW5sb2NrX2F0EAEsQmxvY2tOdW1iZXIAAwAAfQoMVHBhbGxldF9jaGlsZF9ib3VudGllcxhwYWxsZXQURXJyb3IEBFQAAQxUUGFyZW50Qm91bnR5Tm90QWN0aXZlAAAEpFRoZSBwYXJlbnQgYm91bnR5IGlzIG5vdCBpbiBhY3RpdmUgc3RhdGUuZEluc3VmZmljaWVudEJvdW50eUJhbGFuY2UAAQTkVGhlIGJvdW50eSBiYWxhbmNlIGlzIG5vdCBlbm91Z2ggdG8gYWRkIG5ldyBjaGlsZC1ib3VudHkuUFRvb01hbnlDaGlsZEJvdW50aWVzAAIEDQFOdW1iZXIgb2YgY2hpbGQgYm91bnRpZXMgZXhjZWVkcyBsaW1pdCBgTWF4QWN0aXZlQ2hpbGRCb3VudHlDb3VudGAuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LoEKCJBwYWxsZXRfZWxlY3Rpb25fcHJvdmlkZXJfbXVsdGlfcGhhc2U0UmVhZHlTb2x1dGlvbggkQWNjb3VudElkAChNYXhXaW5uZXJzAAAMASBzdXBwb3J0c4UKAZhCb3VuZGVkU3VwcG9ydHM8QWNjb3VudElkLCBNYXhXaW5uZXJzPgABFHNjb3Jl9QMBNEVsZWN0aW9uU2NvcmUAARxjb21wdXRlXQcBPEVsZWN0aW9uQ29tcHV0ZQAAhQoMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAEFBARTAAAEAAEEARhWZWM8VD4AAIkKCJBwYWxsZXRfZWxlY3Rpb25fcHJvdmlkZXJfbXVsdGlfcGhhc2U0Um91bmRTbmFwc2hvdAgkQWNjb3VudElkAQAwRGF0YVByb3ZpZGVyAY0KAAgBGHZvdGVyc5EKAURWZWM8RGF0YVByb3ZpZGVyPgABHHRhcmdldHPRAQE4VmVjPEFjY291bnRJZD4AAI0KAAAEDAAw9QgAkQoAAAKNCgCVCgxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAZkKBFMAAAQAnQoBGFZlYzxUPgAAmQoAAAQM9QMQEACdCgAAApkKAKEKDJBwYWxsZXRfZWxlY3Rpb25fcHJvdmlkZXJfbXVsdGlfcGhhc2UYc2lnbmVkQFNpZ25lZFN1Ym1pc3Npb24MJEFjY291bnRJZAEAHEJhbGFuY2UBGCBTb2x1dGlvbgEpAwAQAQx3aG8AASRBY2NvdW50SWQAARxkZXBvc2l0GAEcQmFsYW5jZQABMHJhd19zb2x1dGlvbiUDAVRSYXdTb2x1dGlvbjxTb2x1dGlvbj4AASBjYWxsX2ZlZRgBHEJhbGFuY2UAAKUKDJBwYWxsZXRfZWxlY3Rpb25fcHJvdmlkZXJfbXVsdGlfcGhhc2UYcGFsbGV0FEVycm9yBARUAAE8aFByZURpc3BhdGNoRWFybHlTdWJtaXNzaW9uAAAEZFN1Ym1pc3Npb24gd2FzIHRvbyBlYXJseS5sUHJlRGlzcGF0Y2hXcm9uZ1dpbm5lckNvdW50AAEEiFdyb25nIG51bWJlciBvZiB3aW5uZXJzIHByZXNlbnRlZC5kUHJlRGlzcGF0Y2hXZWFrU3VibWlzc2lvbgACBJBTdWJtaXNzaW9uIHdhcyB0b28gd2Vhaywgc2NvcmUtd2lzZS48U2lnbmVkUXVldWVGdWxsAAMESQFUaGUgcXVldWUgd2FzIGZ1bGwsIGFuZCB0aGUgc29sdXRpb24gd2FzIG5vdCBiZXR0ZXIgdGhhbiBhbnkgb2YgdGhlIGV4aXN0aW5nIG9uZXMuWFNpZ25lZENhbm5vdFBheURlcG9zaXQABASUVGhlIG9yaWdpbiBmYWlsZWQgdG8gcGF5IHRoZSBkZXBvc2l0LlBTaWduZWRJbnZhbGlkV2l0bmVzcwAFBKBXaXRuZXNzIGRhdGEgdG8gZGlzcGF0Y2hhYmxlIGlzIGludmFsaWQuTFNpZ25lZFRvb011Y2hXZWlnaHQABgS4VGhlIHNpZ25lZCBzdWJtaXNzaW9uIGNvbnN1bWVzIHRvbyBtdWNoIHdlaWdodDxPY3dDYWxsV3JvbmdFcmEABwSYT0NXIHN1Ym1pdHRlZCBzb2x1dGlvbiBmb3Igd3Jvbmcgcm91bmRcTWlzc2luZ1NuYXBzaG90TWV0YWRhdGEACASoU25hcHNob3QgbWV0YWRhdGEgc2hvdWxkIGV4aXN0IGJ1dCBkaWRuJ3QuWEludmFsaWRTdWJtaXNzaW9uSW5kZXgACQTQYFNlbGY6Omluc2VydF9zdWJtaXNzaW9uYCByZXR1cm5lZCBhbiBpbnZhbGlkIGluZGV4LjhDYWxsTm90QWxsb3dlZAAKBJhUaGUgY2FsbCBpcyBub3QgYWxsb3dlZCBhdCB0aGlzIHBvaW50LjhGYWxsYmFja0ZhaWxlZAALBExUaGUgZmFsbGJhY2sgZmFpbGVkLEJvdW5kTm90TWV0AAwESFNvbWUgYm91bmQgbm90IG1ldDhUb29NYW55V2lubmVycwANBJxTdWJtaXR0ZWQgc29sdXRpb24gaGFzIHRvbyBtYW55IHdpbm5lcnNkUHJlRGlzcGF0Y2hEaWZmZXJlbnRSb3VuZAAOBLhTdWJtaXNzaW9uIHdhcyBwcmVwYXJlZCBmb3IgYSBkaWZmZXJlbnQgcm91bmQuBA0BRXJyb3Igb2YgdGhlIHBhbGxldCB0aGF0IGNhbiBiZSByZXR1cm5lZCBpbiByZXNwb25zZSB0byBkaXNwYXRjaGVzLqkKDEBwYWxsZXRfYmFnc19saXN0EGxpc3QQTm9kZQgEVAAESQAAFAEIaWQAATBUOjpBY2NvdW50SWQAARBwcmV2/QEBUE9wdGlvbjxUOjpBY2NvdW50SWQ+AAEQbmV4dP0BAVBPcHRpb248VDo6QWNjb3VudElkPgABJGJhZ191cHBlcjABIFQ6OlNjb3JlAAEUc2NvcmUwASBUOjpTY29yZQAArQoMQHBhbGxldF9iYWdzX2xpc3QQbGlzdAxCYWcIBFQABEkAAAgBEGhlYWT9AQFQT3B0aW9uPFQ6OkFjY291bnRJZD4AARB0YWls/QEBUE9wdGlvbjxUOjpBY2NvdW50SWQ+AACxCgAAAjAAtQoMQHBhbGxldF9iYWdzX2xpc3QYcGFsbGV0FEVycm9yCARUAARJAAEEEExpc3QEALkKASRMaXN0RXJyb3IAAAS0QSBlcnJvciBpbiB0aGUgbGlzdCBpbnRlcmZhY2UgaW1wbGVtZW50YXRpb24uBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LrkKDEBwYWxsZXRfYmFnc19saXN0EGxpc3QkTGlzdEVycm9yAAEQJER1cGxpY2F0ZQAAAChOb3RIZWF2aWVyAAEAME5vdEluU2FtZUJhZwACADBOb2RlTm90Rm91bmQAAwAAvQoIXHBhbGxldF9ub21pbmF0aW9uX3Bvb2xzKFBvb2xNZW1iZXIEBFQAABABHHBvb2xfaWQQARhQb29sSWQAARhwb2ludHMYATBCYWxhbmNlT2Y8VD4AAXBsYXN0X3JlY29yZGVkX3Jld2FyZF9jb3VudGVy0QYBQFQ6OlJld2FyZENvdW50ZXIAATh1bmJvbmRpbmdfZXJhc8EKAeBCb3VuZGVkQlRyZWVNYXA8RXJhSW5kZXgsIEJhbGFuY2VPZjxUPiwgVDo6TWF4VW5ib25kaW5nPgAAwQoMTGJvdW5kZWRfY29sbGVjdGlvbnNEYm91bmRlZF9idHJlZV9tYXA8Qm91bmRlZEJUcmVlTWFwDARLARAEVgEYBFMAAAQAxQoBOEJUcmVlTWFwPEssIFY+AADFCgQgQlRyZWVNYXAIBEsBEARWARgABAD1CQAAAMkKCFxwYWxsZXRfbm9taW5hdGlvbl9wb29sczxCb25kZWRQb29sSW5uZXIEBFQAABQBKGNvbW1pc3Npb27NCgE0Q29tbWlzc2lvbjxUPgABOG1lbWJlcl9jb3VudGVyEAEMdTMyAAEYcG9pbnRzGAEwQmFsYW5jZU9mPFQ+AAEUcm9sZXPZCgFcUG9vbFJvbGVzPFQ6OkFjY291bnRJZD4AARRzdGF0ZSEEASRQb29sU3RhdGUAAM0KCFxwYWxsZXRfbm9taW5hdGlvbl9wb29scyhDb21taXNzaW9uBARUAAAUARxjdXJyZW50OQQBfE9wdGlvbjwoUGVyYmlsbCwgVDo6QWNjb3VudElkKT4AAQxtYXjRCgE8T3B0aW9uPFBlcmJpbGw+AAEsY2hhbmdlX3JhdGXVCgG8T3B0aW9uPENvbW1pc3Npb25DaGFuZ2VSYXRlPEJsb2NrTnVtYmVyRm9yPFQ+Pj4AATR0aHJvdHRsZV9mcm9tYQIBZE9wdGlvbjxCbG9ja051bWJlckZvcjxUPj4AAUBjbGFpbV9wZXJtaXNzaW9uRQQBvE9wdGlvbjxDb21taXNzaW9uQ2xhaW1QZXJtaXNzaW9uPFQ6OkFjY291bnRJZD4+AADRCgQYT3B0aW9uBARUAawBCBBOb25lAAAAEFNvbWUEAKwAAAEAANUKBBhPcHRpb24EBFQBQQQBCBBOb25lAAAAEFNvbWUEAEEEAAABAADZCghccGFsbGV0X25vbWluYXRpb25fcG9vbHMkUG9vbFJvbGVzBCRBY2NvdW50SWQBAAAQASRkZXBvc2l0b3IAASRBY2NvdW50SWQAARByb290/QEBRE9wdGlvbjxBY2NvdW50SWQ+AAEkbm9taW5hdG9y/QEBRE9wdGlvbjxBY2NvdW50SWQ+AAEcYm91bmNlcv0BAURPcHRpb248QWNjb3VudElkPgAA3QoIXHBhbGxldF9ub21pbmF0aW9uX3Bvb2xzKFJld2FyZFBvb2wEBFQAABQBcGxhc3RfcmVjb3JkZWRfcmV3YXJkX2NvdW50ZXLRBgFAVDo6UmV3YXJkQ291bnRlcgABbGxhc3RfcmVjb3JkZWRfdG90YWxfcGF5b3V0cxgBMEJhbGFuY2VPZjxUPgABVHRvdGFsX3Jld2FyZHNfY2xhaW1lZBgBMEJhbGFuY2VPZjxUPgABYHRvdGFsX2NvbW1pc3Npb25fcGVuZGluZxgBMEJhbGFuY2VPZjxUPgABYHRvdGFsX2NvbW1pc3Npb25fY2xhaW1lZBgBMEJhbGFuY2VPZjxUPgAA4QoIXHBhbGxldF9ub21pbmF0aW9uX3Bvb2xzIFN1YlBvb2xzBARUAAAIARhub19lcmHlCgE0VW5ib25kUG9vbDxUPgABIHdpdGhfZXJh6QoBAQFCb3VuZGVkQlRyZWVNYXA8RXJhSW5kZXgsIFVuYm9uZFBvb2w8VD4sIFRvdGFsVW5ib25kaW5nUG9vbHM8VD4+AADlCghccGFsbGV0X25vbWluYXRpb25fcG9vbHMoVW5ib25kUG9vbAQEVAAACAEYcG9pbnRzGAEwQmFsYW5jZU9mPFQ+AAEcYmFsYW5jZRgBMEJhbGFuY2VPZjxUPgAA6QoMTGJvdW5kZWRfY29sbGVjdGlvbnNEYm91bmRlZF9idHJlZV9tYXA8Qm91bmRlZEJUcmVlTWFwDARLARAEVgHlCgRTAAAEAO0KAThCVHJlZU1hcDxLLCBWPgAA7QoEIEJUcmVlTWFwCARLARAEVgHlCgAEAPEKAAAA8QoAAAL1CgD1CgAABAgQ5QoA+QoMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAEIBFMAAAQAOAEYVmVjPFQ+AAD9CgxccGFsbGV0X25vbWluYXRpb25fcG9vbHMYcGFsbGV0FEVycm9yBARUAAGQMFBvb2xOb3RGb3VuZAAABIhBIChib25kZWQpIHBvb2wgaWQgZG9lcyBub3QgZXhpc3QuSFBvb2xNZW1iZXJOb3RGb3VuZAABBGxBbiBhY2NvdW50IGlzIG5vdCBhIG1lbWJlci5IUmV3YXJkUG9vbE5vdEZvdW5kAAIEIQFBIHJld2FyZCBwb29sIGRvZXMgbm90IGV4aXN0LiBJbiBhbGwgY2FzZXMgdGhpcyBpcyBhIHN5c3RlbSBsb2dpYyBlcnJvci5AU3ViUG9vbHNOb3RGb3VuZAADBGhBIHN1YiBwb29sIGRvZXMgbm90IGV4aXN0LmRBY2NvdW50QmVsb25nc1RvT3RoZXJQb29sAAQITQFBbiBhY2NvdW50IGlzIGFscmVhZHkgZGVsZWdhdGluZyBpbiBhbm90aGVyIHBvb2wuIEFuIGFjY291bnQgbWF5IG9ubHkgYmVsb25nIHRvIG9uZTxwb29sIGF0IGEgdGltZS44RnVsbHlVbmJvbmRpbmcABQg9AVRoZSBtZW1iZXIgaXMgZnVsbHkgdW5ib25kZWQgKGFuZCB0aHVzIGNhbm5vdCBhY2Nlc3MgdGhlIGJvbmRlZCBhbmQgcmV3YXJkIHBvb2yoYW55bW9yZSB0bywgZm9yIGV4YW1wbGUsIGNvbGxlY3QgcmV3YXJkcykuRE1heFVuYm9uZGluZ0xpbWl0AAYECQFUaGUgbWVtYmVyIGNhbm5vdCB1bmJvbmQgZnVydGhlciBjaHVua3MgZHVlIHRvIHJlYWNoaW5nIHRoZSBsaW1pdC5EQ2Fubm90V2l0aGRyYXdBbnkABwRNAU5vbmUgb2YgdGhlIGZ1bmRzIGNhbiBiZSB3aXRoZHJhd24geWV0IGJlY2F1c2UgdGhlIGJvbmRpbmcgZHVyYXRpb24gaGFzIG5vdCBwYXNzZWQuRE1pbmltdW1Cb25kTm90TWV0AAgUKQFUaGUgYW1vdW50IGRvZXMgbm90IG1lZXQgdGhlIG1pbmltdW0gYm9uZCB0byBlaXRoZXIgam9pbiBvciBjcmVhdGUgYSBwb29sLgBVAVRoZSBkZXBvc2l0b3IgY2FuIG5ldmVyIHVuYm9uZCB0byBhIHZhbHVlIGxlc3MgdGhhbiBgUGFsbGV0OjpkZXBvc2l0b3JfbWluX2JvbmRgLiBUaGVdAWNhbGxlciBkb2VzIG5vdCBoYXZlIG5vbWluYXRpbmcgcGVybWlzc2lvbnMgZm9yIHRoZSBwb29sLiBNZW1iZXJzIGNhbiBuZXZlciB1bmJvbmQgdG8gYWh2YWx1ZSBiZWxvdyBgTWluSm9pbkJvbmRgLjBPdmVyZmxvd1Jpc2sACQQhAVRoZSB0cmFuc2FjdGlvbiBjb3VsZCBub3QgYmUgZXhlY3V0ZWQgZHVlIHRvIG92ZXJmbG93IHJpc2sgZm9yIHRoZSBwb29sLjROb3REZXN0cm95aW5nAAoIXQFBIHBvb2wgbXVzdCBiZSBpbiBbYFBvb2xTdGF0ZTo6RGVzdHJveWluZ2BdIGluIG9yZGVyIGZvciB0aGUgZGVwb3NpdG9yIHRvIHVuYm9uZCBvciBmb3K4b3RoZXIgbWVtYmVycyB0byBiZSBwZXJtaXNzaW9ubGVzc2x5IHVuYm9uZGVkLjBOb3ROb21pbmF0b3IACwT0VGhlIGNhbGxlciBkb2VzIG5vdCBoYXZlIG5vbWluYXRpbmcgcGVybWlzc2lvbnMgZm9yIHRoZSBwb29sLlROb3RLaWNrZXJPckRlc3Ryb3lpbmcADAQ9AUVpdGhlciBhKSB0aGUgY2FsbGVyIGNhbm5vdCBtYWtlIGEgdmFsaWQga2ljayBvciBiKSB0aGUgcG9vbCBpcyBub3QgZGVzdHJveWluZy4cTm90T3BlbgANBHBUaGUgcG9vbCBpcyBub3Qgb3BlbiB0byBqb2luIE1heFBvb2xzAA4EhFRoZSBzeXN0ZW0gaXMgbWF4ZWQgb3V0IG9uIHBvb2xzLjhNYXhQb29sTWVtYmVycwAPBJxUb28gbWFueSBtZW1iZXJzIGluIHRoZSBwb29sIG9yIHN5c3RlbS5EQ2FuTm90Q2hhbmdlU3RhdGUAEASIVGhlIHBvb2xzIHN0YXRlIGNhbm5vdCBiZSBjaGFuZ2VkLlREb2VzTm90SGF2ZVBlcm1pc3Npb24AEQS4VGhlIGNhbGxlciBkb2VzIG5vdCBoYXZlIGFkZXF1YXRlIHBlcm1pc3Npb25zLlRNZXRhZGF0YUV4Y2VlZHNNYXhMZW4AEgSsTWV0YWRhdGEgZXhjZWVkcyBbYENvbmZpZzo6TWF4TWV0YWRhdGFMZW5gXSREZWZlbnNpdmUEAAELAThEZWZlbnNpdmVFcnJvcgATCDEBU29tZSBlcnJvciBvY2N1cnJlZCB0aGF0IHNob3VsZCBuZXZlciBoYXBwZW4uIFRoaXMgc2hvdWxkIGJlIHJlcG9ydGVkIHRvIHRoZTBtYWludGFpbmVycy6cUGFydGlhbFVuYm9uZE5vdEFsbG93ZWRQZXJtaXNzaW9ubGVzc2x5ABQEvFBhcnRpYWwgdW5ib25kaW5nIG5vdyBhbGxvd2VkIHBlcm1pc3Npb25sZXNzbHkuXE1heENvbW1pc3Npb25SZXN0cmljdGVkABUEHQFUaGUgcG9vbCdzIG1heCBjb21taXNzaW9uIGNhbm5vdCBiZSBzZXQgaGlnaGVyIHRoYW4gdGhlIGV4aXN0aW5nIHZhbHVlLmBDb21taXNzaW9uRXhjZWVkc01heGltdW0AFgTsVGhlIHN1cHBsaWVkIGNvbW1pc3Npb24gZXhjZWVkcyB0aGUgbWF4IGFsbG93ZWQgY29tbWlzc2lvbi54Q29tbWlzc2lvbkV4Y2VlZHNHbG9iYWxNYXhpbXVtABcE6FRoZSBzdXBwbGllZCBjb21taXNzaW9uIGV4Y2VlZHMgZ2xvYmFsIG1heGltdW0gY29tbWlzc2lvbi5kQ29tbWlzc2lvbkNoYW5nZVRocm90dGxlZAAYBAkBTm90IGVub3VnaCBibG9ja3MgaGF2ZSBzdXJwYXNzZWQgc2luY2UgdGhlIGxhc3QgY29tbWlzc2lvbiB1cGRhdGUueENvbW1pc3Npb25DaGFuZ2VSYXRlTm90QWxsb3dlZAAZBAEBVGhlIHN1Ym1pdHRlZCBjaGFuZ2VzIHRvIGNvbW1pc3Npb24gY2hhbmdlIHJhdGUgYXJlIG5vdCBhbGxvd2VkLkxOb1BlbmRpbmdDb21taXNzaW9uABoEoFRoZXJlIGlzIG5vIHBlbmRpbmcgY29tbWlzc2lvbiB0byBjbGFpbS5YTm9Db21taXNzaW9uQ3VycmVudFNldAAbBIxObyBjb21taXNzaW9uIGN1cnJlbnQgaGFzIGJlZW4gc2V0LixQb29sSWRJblVzZQAcBGRQb29sIGlkIGN1cnJlbnRseSBpbiB1c2UuNEludmFsaWRQb29sSWQAHQScUG9vbCBpZCBwcm92aWRlZCBpcyBub3QgY29ycmVjdC91c2FibGUuTEJvbmRFeHRyYVJlc3RyaWN0ZWQAHgT8Qm9uZGluZyBleHRyYSBpcyByZXN0cmljdGVkIHRvIHRoZSBleGFjdCBwZW5kaW5nIHJld2FyZCBhbW91bnQuPE5vdGhpbmdUb0FkanVzdAAfBLBObyBpbWJhbGFuY2UgaW4gdGhlIEVEIGRlcG9zaXQgZm9yIHRoZSBwb29sLjhOb3RoaW5nVG9TbGFzaAAgBMxObyBzbGFzaCBwZW5kaW5nIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gdGhlIG1lbWJlci48QWxyZWFkeU1pZ3JhdGVkACEEFQFUaGUgcG9vbCBvciBtZW1iZXIgZGVsZWdhdGlvbiBoYXMgYWxyZWFkeSBtaWdyYXRlZCB0byBkZWxlZ2F0ZSBzdGFrZS4sTm90TWlncmF0ZWQAIgQVAVRoZSBwb29sIG9yIG1lbWJlciBkZWxlZ2F0aW9uIGhhcyBub3QgbWlncmF0ZWQgeWV0IHRvIGRlbGVnYXRlIHN0YWtlLjBOb3RTdXBwb3J0ZWQAIwTwVGhpcyBjYWxsIGlzIG5vdCBhbGxvd2VkIGluIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBwYWxsZXQuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LgELDFxwYWxsZXRfbm9taW5hdGlvbl9wb29scxhwYWxsZXQ4RGVmZW5zaXZlRXJyb3IAARxoTm90RW5vdWdoU3BhY2VJblVuYm9uZFBvb2wAAAAwUG9vbE5vdEZvdW5kAAEASFJld2FyZFBvb2xOb3RGb3VuZAACAEBTdWJQb29sc05vdEZvdW5kAAMAcEJvbmRlZFN0YXNoS2lsbGVkUHJlbWF0dXJlbHkABABURGVsZWdhdGlvblVuc3VwcG9ydGVkAAUAPFNsYXNoTm90QXBwbGllZAAGAAAFCwxMcGFsbGV0X2Zhc3RfdW5zdGFrZRR0eXBlczhVbnN0YWtlUmVxdWVzdAQEVAAACAEcc3Rhc2hlcwkLAdhCb3VuZGVkVmVjPChUOjpBY2NvdW50SWQsIEJhbGFuY2VPZjxUPiksIFQ6OkJhdGNoU2l6ZT4AARxjaGVja2VkDQsBkEJvdW5kZWRWZWM8RXJhSW5kZXgsIE1heENoZWNraW5nPFQ+PgAACQsMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAERBARTAAAEAA0EARhWZWM8VD4AAA0LDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBEARTAAAEAOUBARhWZWM8VD4AABELDExwYWxsZXRfZmFzdF91bnN0YWtlGHBhbGxldBRFcnJvcgQEVAABGDROb3RDb250cm9sbGVyAAAMuFRoZSBwcm92aWRlZCBDb250cm9sbGVyIGFjY291bnQgd2FzIG5vdCBmb3VuZC4AwFRoaXMgbWVhbnMgdGhhdCB0aGUgZ2l2ZW4gYWNjb3VudCBpcyBub3QgYm9uZGVkLjRBbHJlYWR5UXVldWVkAAEErFRoZSBib25kZWQgYWNjb3VudCBoYXMgYWxyZWFkeSBiZWVuIHF1ZXVlZC44Tm90RnVsbHlCb25kZWQAAgS8VGhlIGJvbmRlZCBhY2NvdW50IGhhcyBhY3RpdmUgdW5sb2NraW5nIGNodW5rcy4kTm90UXVldWVkAAMEtFRoZSBwcm92aWRlZCB1bi1zdGFrZXIgaXMgbm90IGluIHRoZSBgUXVldWVgLixBbHJlYWR5SGVhZAAEBAUBVGhlIHByb3ZpZGVkIHVuLXN0YWtlciBpcyBhbHJlYWR5IGluIEhlYWQsIGFuZCBjYW5ub3QgZGVyZWdpc3Rlci44Q2FsbE5vdEFsbG93ZWQABQQdAVRoZSBjYWxsIGlzIG5vdCBhbGxvd2VkIGF0IHRoaXMgcG9pbnQgYmVjYXVzZSB0aGUgcGFsbGV0IGlzIG5vdCBhY3RpdmUuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LhULDGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnM0Y29uZmlndXJhdGlvbkRIb3N0Q29uZmlndXJhdGlvbgQsQmxvY2tOdW1iZXIBEACMATRtYXhfY29kZV9zaXplEAEMdTMyAAFIbWF4X2hlYWRfZGF0YV9zaXplEAEMdTMyAAFYbWF4X3Vwd2FyZF9xdWV1ZV9jb3VudBABDHUzMgABVG1heF91cHdhcmRfcXVldWVfc2l6ZRABDHUzMgABXG1heF91cHdhcmRfbWVzc2FnZV9zaXplEAEMdTMyAAGQbWF4X3Vwd2FyZF9tZXNzYWdlX251bV9wZXJfY2FuZGlkYXRlEAEMdTMyAAGIaHJtcF9tYXhfbWVzc2FnZV9udW1fcGVyX2NhbmRpZGF0ZRABDHUzMgABbHZhbGlkYXRpb25fdXBncmFkZV9jb29sZG93bhABLEJsb2NrTnVtYmVyAAFgdmFsaWRhdGlvbl91cGdyYWRlX2RlbGF5EAEsQmxvY2tOdW1iZXIAAVBhc3luY19iYWNraW5nX3BhcmFtc1UEAUhBc3luY0JhY2tpbmdQYXJhbXMAATBtYXhfcG92X3NpemUQAQx1MzIAAWRtYXhfZG93bndhcmRfbWVzc2FnZV9zaXplEAEMdTMyAAGQaHJtcF9tYXhfcGFyYWNoYWluX291dGJvdW5kX2NoYW5uZWxzEAEMdTMyAAFMaHJtcF9zZW5kZXJfZGVwb3NpdBgBHEJhbGFuY2UAAVhocm1wX3JlY2lwaWVudF9kZXBvc2l0GAEcQmFsYW5jZQABZGhybXBfY2hhbm5lbF9tYXhfY2FwYWNpdHkQAQx1MzIAAWxocm1wX2NoYW5uZWxfbWF4X3RvdGFsX3NpemUQAQx1MzIAAYxocm1wX21heF9wYXJhY2hhaW5faW5ib3VuZF9jaGFubmVscxABDHUzMgABdGhybXBfY2hhbm5lbF9tYXhfbWVzc2FnZV9zaXplEAEMdTMyAAE8ZXhlY3V0b3JfcGFyYW1zWQQBOEV4ZWN1dG9yUGFyYW1zAAFUY29kZV9yZXRlbnRpb25fcGVyaW9kEAEsQmxvY2tOdW1iZXIAAThtYXhfdmFsaWRhdG9yc2ECASxPcHRpb248dTMyPgABOGRpc3B1dGVfcGVyaW9kEAEwU2Vzc2lvbkluZGV4AAGkZGlzcHV0ZV9wb3N0X2NvbmNsdXNpb25fYWNjZXB0YW5jZV9wZXJpb2QQASxCbG9ja051bWJlcgABNG5vX3Nob3dfc2xvdHMQAQx1MzIAAUBuX2RlbGF5X3RyYW5jaGVzEAEMdTMyAAFoemVyb3RoX2RlbGF5X3RyYW5jaGVfd2lkdGgQAQx1MzIAAUBuZWVkZWRfYXBwcm92YWxzEAEMdTMyAAFgcmVsYXlfdnJmX21vZHVsb19zYW1wbGVzEAEMdTMyAAE4cHZmX3ZvdGluZ190dGwQATBTZXNzaW9uSW5kZXgAAYBtaW5pbXVtX3ZhbGlkYXRpb25fdXBncmFkZV9kZWxheRABLEJsb2NrTnVtYmVyAAFUbWluaW11bV9iYWNraW5nX3ZvdGVzEAEMdTMyAAE0bm9kZV9mZWF0dXJlc5EEATBOb2RlRmVhdHVyZXMAAVhhcHByb3ZhbF92b3RpbmdfcGFyYW1zbQQBUEFwcHJvdmFsVm90aW5nUGFyYW1zAAFAc2NoZWR1bGVyX3BhcmFtc3EEAXBTY2hlZHVsZXJQYXJhbXM8QmxvY2tOdW1iZXI+AAAZCwAAAh0LAB0LAAAECBAVCwAhCxBscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zNGNvbmZpZ3VyYXRpb24YcGFsbGV0FEVycm9yBARUAAEEPEludmFsaWROZXdWYWx1ZQAABNxUaGUgbmV3IHZhbHVlIGZvciBhIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyIGlzIGludmFsaWQuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LiULAAACmQQAKQsAAAIdAgAtCwxscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zGHNoYXJlZGhBbGxvd2VkUmVsYXlQYXJlbnRzVHJhY2tlcggQSGFzaAE0LEJsb2NrTnVtYmVyARAACAEYYnVmZmVyMQsBWFZlY0RlcXVlPChIYXNoLCBIYXNoKT4AATRsYXRlc3RfbnVtYmVyEAEsQmxvY2tOdW1iZXIAADELAAACNQsANQsAAAQINDQAOQsAAAI9CwA9CwxscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zJGluY2x1c2lvbnBDYW5kaWRhdGVQZW5kaW5nQXZhaWxhYmlsaXR5CARIATQETgEQACQBEGNvcmV9BwEkQ29yZUluZGV4AAEQaGFzaO0EATRDYW5kaWRhdGVIYXNoAAEoZGVzY3JpcHRvcq0EAVhDYW5kaWRhdGVEZXNjcmlwdG9yPEg+AAEsY29tbWl0bWVudHO9BAFQQ2FuZGlkYXRlQ29tbWl0bWVudHMAAUhhdmFpbGFiaWxpdHlfdm90ZXORBAFgQml0VmVjPHU4LCBCaXRPcmRlckxzYjA+AAEcYmFja2Vyc5EEAWBCaXRWZWM8dTgsIEJpdE9yZGVyTHNiMD4AAUxyZWxheV9wYXJlbnRfbnVtYmVyEAEETgABQGJhY2tlZF9pbl9udW1iZXIQAQROAAE0YmFja2luZ19ncm91cIEHAShHcm91cEluZGV4AABBCxBscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zJGluY2x1c2lvbhhwYWxsZXQURXJyb3IEBFQAAUhkVmFsaWRhdG9ySW5kZXhPdXRPZkJvdW5kcwAABHhWYWxpZGF0b3IgaW5kZXggb3V0IG9mIGJvdW5kcy5QVW5zY2hlZHVsZWRDYW5kaWRhdGUAAQSsQ2FuZGlkYXRlIHN1Ym1pdHRlZCBidXQgcGFyYSBub3Qgc2NoZWR1bGVkLkBIZWFkRGF0YVRvb0xhcmdlAAIEpEhlYWQgZGF0YSBleGNlZWRzIHRoZSBjb25maWd1cmVkIG1heGltdW0uUFByZW1hdHVyZUNvZGVVcGdyYWRlAAMEZENvZGUgdXBncmFkZSBwcmVtYXR1cmVseS48TmV3Q29kZVRvb0xhcmdlAAQEYE91dHB1dCBjb2RlIGlzIHRvbyBsYXJnZVREaXNhbGxvd2VkUmVsYXlQYXJlbnQABQjsVGhlIGNhbmRpZGF0ZSdzIHJlbGF5LXBhcmVudCB3YXMgbm90IGFsbG93ZWQuIEVpdGhlciBpdCB3YXMlAW5vdCByZWNlbnQgZW5vdWdoIG9yIGl0IGRpZG4ndCBhZHZhbmNlIGJhc2VkIG9uIHRoZSBsYXN0IHBhcmFjaGFpbiBibG9jay5ESW52YWxpZEFzc2lnbm1lbnQABggVAUZhaWxlZCB0byBjb21wdXRlIGdyb3VwIGluZGV4IGZvciB0aGUgY29yZTogZWl0aGVyIGl0J3Mgb3V0IG9mIGJvdW5kc+hvciB0aGUgcmVsYXkgcGFyZW50IGRvZXNuJ3QgYmVsb25nIHRvIHRoZSBjdXJyZW50IHNlc3Npb24uREludmFsaWRHcm91cEluZGV4AAcEnEludmFsaWQgZ3JvdXAgaW5kZXggaW4gY29yZSBhc3NpZ25tZW50LkxJbnN1ZmZpY2llbnRCYWNraW5nAAgEkEluc3VmZmljaWVudCAobm9uLW1ham9yaXR5KSBiYWNraW5nLjhJbnZhbGlkQmFja2luZwAJBORJbnZhbGlkIChiYWQgc2lnbmF0dXJlLCB1bmtub3duIHZhbGlkYXRvciwgZXRjLikgYmFja2luZy5ETm90Q29sbGF0b3JTaWduZWQACgRoQ29sbGF0b3IgZGlkIG5vdCBzaWduIFBvVi5oVmFsaWRhdGlvbkRhdGFIYXNoTWlzbWF0Y2gACwTEVGhlIHZhbGlkYXRpb24gZGF0YSBoYXNoIGRvZXMgbm90IG1hdGNoIGV4cGVjdGVkLoBJbmNvcnJlY3REb3dud2FyZE1lc3NhZ2VIYW5kbGluZwAMBNhUaGUgZG93bndhcmQgbWVzc2FnZSBxdWV1ZSBpcyBub3QgcHJvY2Vzc2VkIGNvcnJlY3RseS5USW52YWxpZFVwd2FyZE1lc3NhZ2VzAA0EHQFBdCBsZWFzdCBvbmUgdXB3YXJkIG1lc3NhZ2Ugc2VudCBkb2VzIG5vdCBwYXNzIHRoZSBhY2NlcHRhbmNlIGNyaXRlcmlhLmBIcm1wV2F0ZXJtYXJrTWlzaGFuZGxpbmcADgQRAVRoZSBjYW5kaWRhdGUgZGlkbid0IGZvbGxvdyB0aGUgcnVsZXMgb2YgSFJNUCB3YXRlcm1hcmsgYWR2YW5jZW1lbnQuTEludmFsaWRPdXRib3VuZEhybXAADwTUVGhlIEhSTVAgbWVzc2FnZXMgc2VudCBieSB0aGUgY2FuZGlkYXRlIGlzIG5vdCB2YWxpZC5kSW52YWxpZFZhbGlkYXRpb25Db2RlSGFzaAAQBNxUaGUgdmFsaWRhdGlvbiBjb2RlIGhhc2ggb2YgdGhlIGNhbmRpZGF0ZSBpcyBub3QgdmFsaWQuQFBhcmFIZWFkTWlzbWF0Y2gAEQhVAVRoZSBgcGFyYV9oZWFkYCBoYXNoIGluIHRoZSBjYW5kaWRhdGUgZGVzY3JpcHRvciBkb2Vzbid0IG1hdGNoIHRoZSBoYXNoIG9mIHRoZSBhY3R1YWx0cGFyYSBoZWFkIGluIHRoZSBjb21taXRtZW50cy4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQuRQsMTHBvbGthZG90X3ByaW1pdGl2ZXMIdjdMU2NyYXBlZE9uQ2hhaW5Wb3RlcwQESAE0AAwBHHNlc3Npb24QATBTZXNzaW9uSW5kZXgAAYBiYWNraW5nX3ZhbGlkYXRvcnNfcGVyX2NhbmRpZGF0ZUkLAR0BVmVjPChDYW5kaWRhdGVSZWNlaXB0PEg+LCBWZWM8KFZhbGlkYXRvckluZGV4LCBWYWxpZGl0eUF0dGVzdGF0aW9uKT4pCj4AASBkaXNwdXRlc+UEAWBNdWx0aURpc3B1dGVTdGF0ZW1lbnRTZXQAAEkLAAACTQsATQsAAAQIeQdRCwBRCwAAAlULAFULAAAECJkE4QQAWQsQbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWluczhwYXJhc19pbmhlcmVudBhwYWxsZXQURXJyb3IEBFQAARRkVG9vTWFueUluY2x1c2lvbkluaGVyZW50cwAABMxJbmNsdXNpb24gaW5oZXJlbnQgY2FsbGVkIG1vcmUgdGhhbiBvbmNlIHBlciBibG9jay5MSW52YWxpZFBhcmVudEhlYWRlcgABCFUBVGhlIGhhc2ggb2YgdGhlIHN1Ym1pdHRlZCBwYXJlbnQgaGVhZGVyIGRvZXNuJ3QgY29ycmVzcG9uZCB0byB0aGUgc2F2ZWQgYmxvY2sgaGFzaCBvZix0aGUgcGFyZW50LkhJbmhlcmVudE92ZXJ3ZWlnaHQAAgQJAVRoZSBkYXRhIGdpdmVuIHRvIHRoZSBpbmhlcmVudCB3aWxsIHJlc3VsdCBpbiBhbiBvdmVyd2VpZ2h0IGJsb2NrLoRDYW5kaWRhdGVzRmlsdGVyZWREdXJpbmdFeGVjdXRpb24AAwhNAUEgY2FuZGlkYXRlIHdhcyBmaWx0ZXJlZCBkdXJpbmcgaW5oZXJlbnQgZXhlY3V0aW9uLiBUaGlzIHNob3VsZCBoYXZlIG9ubHkgYmVlbiBkb25lQGR1cmluZyBjcmVhdGlvbi5QVW5zY2hlZHVsZWRDYW5kaWRhdGUABAR0VG9vIG1hbnkgY2FuZGlkYXRlcyBzdXBwbGllZC4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQuXQsAAAIlCwBhCwAAAmULAGULEGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMkc2NoZWR1bGVyGHBhbGxldDBDb3JlT2NjdXBpZWQEBE4BEAEIEEZyZWUAAAAUUGFyYXMEAGkLATRQYXJhc0VudHJ5PE4+AAEAAGkLEGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMkc2NoZWR1bGVyGHBhbGxldChQYXJhc0VudHJ5BAROARAADAEoYXNzaWdubWVudG0LAShBc3NpZ25tZW50AAFUYXZhaWxhYmlsaXR5X3RpbWVvdXRzEAEMdTMyAAEMdHRsEAEETgAAbQsQbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucyRzY2hlZHVsZXIYY29tbW9uKEFzc2lnbm1lbnQAAQgQUG9vbAgBHHBhcmFfaWSNAgEYUGFyYUlkAAEoY29yZV9pbmRleH0HASRDb3JlSW5kZXgAAAAQQnVsawQAjQIBGFBhcmFJZAABAABxCwQgQlRyZWVNYXAIBEsBfQcEVgF1CwAEAHkLAAAAdQsAAAJpCwB5CwAAAn0LAH0LAAAECH0HdQsAgQsMbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucxRwYXJhc1xQdmZDaGVja0FjdGl2ZVZvdGVTdGF0ZQQsQmxvY2tOdW1iZXIBEAAUATB2b3Rlc19hY2NlcHSRBAFgQml0VmVjPHU4LCBCaXRPcmRlckxzYjA+AAEwdm90ZXNfcmVqZWN0kQQBYEJpdFZlYzx1OCwgQml0T3JkZXJMc2IwPgABDGFnZRABMFNlc3Npb25JbmRleAABKGNyZWF0ZWRfYXQQASxCbG9ja051bWJlcgABGGNhdXNlc4ULAXxWZWM8UHZmQ2hlY2tDYXVzZTxCbG9ja051bWJlcj4+AACFCwAAAokLAIkLDGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMUcGFyYXM0UHZmQ2hlY2tDYXVzZQQsQmxvY2tOdW1iZXIBEAEIKE9uYm9hcmRpbmcEAI0CARhQYXJhSWQAAAAcVXBncmFkZQwBCGlkjQIBGFBhcmFJZAABLGluY2x1ZGVkX2F0EAEsQmxvY2tOdW1iZXIAAUB1cGdyYWRlX3N0cmF0ZWd5jQsBPFVwZ3JhZGVTdHJhdGVneQABAACNCwxscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zFHBhcmFzPFVwZ3JhZGVTdHJhdGVneQABCEBTZXRHb0FoZWFkU2lnbmFsAAAAUEFwcGx5QXRFeHBlY3RlZEJsb2NrAAEAAJELAAACuQQAlQsAAAKNAgCZCwxscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zFHBhcmFzNFBhcmFMaWZlY3ljbGUAARwoT25ib2FyZGluZwAAAChQYXJhdGhyZWFkAAEAJFBhcmFjaGFpbgACAExVcGdyYWRpbmdQYXJhdGhyZWFkAAMAUERvd25ncmFkaW5nUGFyYWNoYWluAAQAVE9mZmJvYXJkaW5nUGFyYXRocmVhZAAFAFBPZmZib2FyZGluZ1BhcmFjaGFpbgAGAACdCwAABAiNAhAAoQsMbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucxRwYXJhc0BQYXJhUGFzdENvZGVNZXRhBAROARAACAE0dXBncmFkZV90aW1lc6ULAWBWZWM8UmVwbGFjZW1lbnRUaW1lczxOPj4AASxsYXN0X3BydW5lZGECASRPcHRpb248Tj4AAKULAAACqQsAqQsMbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucxRwYXJhc0BSZXBsYWNlbWVudFRpbWVzBAROARAACAEsZXhwZWN0ZWRfYXQQAQROAAEwYWN0aXZhdGVkX2F0EAEETgAArQsAAAKdCwCxCwxMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2NzhVcGdyYWRlR29BaGVhZAABCBRBYm9ydAAAABxHb0FoZWFkAAEAALULDExwb2xrYWRvdF9wcmltaXRpdmVzCHY3SFVwZ3JhZGVSZXN0cmljdGlvbgABBBxQcmVzZW50AAAAALkLEGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMUcGFyYXMYcGFsbGV0FEVycm9yBARUAAE0NE5vdFJlZ2lzdGVyZWQAAASUUGFyYSBpcyBub3QgcmVnaXN0ZXJlZCBpbiBvdXIgc3lzdGVtLjRDYW5ub3RPbmJvYXJkAAEEFQFQYXJhIGNhbm5vdCBiZSBvbmJvYXJkZWQgYmVjYXVzZSBpdCBpcyBhbHJlYWR5IHRyYWNrZWQgYnkgb3VyIHN5c3RlbS44Q2Fubm90T2ZmYm9hcmQAAgScUGFyYSBjYW5ub3QgYmUgb2ZmYm9hcmRlZCBhdCB0aGlzIHRpbWUuNENhbm5vdFVwZ3JhZGUAAwTUUGFyYSBjYW5ub3QgYmUgdXBncmFkZWQgdG8gYSBsZWFzZSBob2xkaW5nIHBhcmFjaGFpbi48Q2Fubm90RG93bmdyYWRlAAQE0FBhcmEgY2Fubm90IGJlIGRvd25ncmFkZWQgdG8gYW4gb24tZGVtYW5kIHBhcmFjaGFpbi5YUHZmQ2hlY2tTdGF0ZW1lbnRTdGFsZQAFBLBUaGUgc3RhdGVtZW50IGZvciBQVkYgcHJlLWNoZWNraW5nIGlzIHN0YWxlLlxQdmZDaGVja1N0YXRlbWVudEZ1dHVyZQAGBOxUaGUgc3RhdGVtZW50IGZvciBQVkYgcHJlLWNoZWNraW5nIGlzIGZvciBhIGZ1dHVyZSBzZXNzaW9uLoRQdmZDaGVja1ZhbGlkYXRvckluZGV4T3V0T2ZCb3VuZHMABwSkQ2xhaW1lZCB2YWxpZGF0b3IgaW5kZXggaXMgb3V0IG9mIGJvdW5kcy5gUHZmQ2hlY2tJbnZhbGlkU2lnbmF0dXJlAAgEyFRoZSBzaWduYXR1cmUgZm9yIHRoZSBQVkYgcHJlLWNoZWNraW5nIGlzIGludmFsaWQuSFB2ZkNoZWNrRG91YmxlVm90ZQAJBLBUaGUgZ2l2ZW4gdmFsaWRhdG9yIGFscmVhZHkgaGFzIGNhc3QgYSB2b3RlLlhQdmZDaGVja1N1YmplY3RJbnZhbGlkAAoE9FRoZSBnaXZlbiBQVkYgZG9lcyBub3QgZXhpc3QgYXQgdGhlIG1vbWVudCBvZiBwcm9jZXNzIGEgdm90ZS5EQ2Fubm90VXBncmFkZUNvZGUACwTMUGFyYWNoYWluIGNhbm5vdCBjdXJyZW50bHkgc2NoZWR1bGUgYSBjb2RlIHVwZ3JhZGUuLEludmFsaWRDb2RlAAwEdEludmFsaWQgdmFsaWRhdGlvbiBjb2RlIHNpemUuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0Lr0LAAACwQsAwQsMbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucyxpbml0aWFsaXplclRCdWZmZXJlZFNlc3Npb25DaGFuZ2UAAAwBKHZhbGlkYXRvcnMpCwFAVmVjPFZhbGlkYXRvcklkPgABGHF1ZXVlZCkLAUBWZWM8VmFsaWRhdG9ySWQ+AAE0c2Vzc2lvbl9pbmRleBABMFNlc3Npb25JbmRleAAAxQsAAALJCwDJCwhgcG9sa2Fkb3RfY29yZV9wcmltaXRpdmVzWEluYm91bmREb3dud2FyZE1lc3NhZ2UELEJsb2NrTnVtYmVyARAACAEcc2VudF9hdBABLEJsb2NrTnVtYmVyAAEMbXNnOAE8RG93bndhcmRNZXNzYWdlAADNCwxscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zEGhybXBYSHJtcE9wZW5DaGFubmVsUmVxdWVzdAAAGAEkY29uZmlybWVkIAEQYm9vbAABEF9hZ2UQATBTZXNzaW9uSW5kZXgAAThzZW5kZXJfZGVwb3NpdBgBHEJhbGFuY2UAAUBtYXhfbWVzc2FnZV9zaXplEAEMdTMyAAEwbWF4X2NhcGFjaXR5EAEMdTMyAAE4bWF4X3RvdGFsX3NpemUQAQx1MzIAANELAAACGQUA1QsMbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucxBocm1wLEhybXBDaGFubmVsAAAgATBtYXhfY2FwYWNpdHkQAQx1MzIAAThtYXhfdG90YWxfc2l6ZRABDHUzMgABQG1heF9tZXNzYWdlX3NpemUQAQx1MzIAASRtc2dfY291bnQQAQx1MzIAASh0b3RhbF9zaXplEAEMdTMyAAEgbXFjX2hlYWSdAgEwT3B0aW9uPEhhc2g+AAE4c2VuZGVyX2RlcG9zaXQYARxCYWxhbmNlAAFEcmVjaXBpZW50X2RlcG9zaXQYARxCYWxhbmNlAADZCwAAAt0LAN0LCGBwb2xrYWRvdF9jb3JlX3ByaW1pdGl2ZXNISW5ib3VuZEhybXBNZXNzYWdlBCxCbG9ja051bWJlcgEQAAgBHHNlbnRfYXQQASxCbG9ja051bWJlcgABEGRhdGE4AVBzcF9zdGQ6OnZlYzo6VmVjPHU4PgAA4QsAAALlCwDlCwAABAgQlQsA6QsQbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucxBocm1wGHBhbGxldBRFcnJvcgQEVAABUFRPcGVuSHJtcENoYW5uZWxUb1NlbGYAAATEVGhlIHNlbmRlciB0cmllZCB0byBvcGVuIGEgY2hhbm5lbCB0byB0aGVtc2VsdmVzLnxPcGVuSHJtcENoYW5uZWxJbnZhbGlkUmVjaXBpZW50AAEEiFRoZSByZWNpcGllbnQgaXMgbm90IGEgdmFsaWQgcGFyYS5sT3BlbkhybXBDaGFubmVsWmVyb0NhcGFjaXR5AAIEfFRoZSByZXF1ZXN0ZWQgY2FwYWNpdHkgaXMgemVyby6MT3BlbkhybXBDaGFubmVsQ2FwYWNpdHlFeGNlZWRzTGltaXQAAwTAVGhlIHJlcXVlc3RlZCBjYXBhY2l0eSBleGNlZWRzIHRoZSBnbG9iYWwgbGltaXQueE9wZW5Icm1wQ2hhbm5lbFplcm9NZXNzYWdlU2l6ZQAEBKBUaGUgcmVxdWVzdGVkIG1heGltdW0gbWVzc2FnZSBzaXplIGlzIDAumE9wZW5Icm1wQ2hhbm5lbE1lc3NhZ2VTaXplRXhjZWVkc0xpbWl0AAUEKQFUaGUgb3BlbiByZXF1ZXN0IHJlcXVlc3RlZCB0aGUgbWVzc2FnZSBzaXplIHRoYXQgZXhjZWVkcyB0aGUgZ2xvYmFsIGxpbWl0LnBPcGVuSHJtcENoYW5uZWxBbHJlYWR5RXhpc3RzAAYEaFRoZSBjaGFubmVsIGFscmVhZHkgZXhpc3RzfE9wZW5Icm1wQ2hhbm5lbEFscmVhZHlSZXF1ZXN0ZWQABwTQVGhlcmUgaXMgYWxyZWFkeSBhIHJlcXVlc3QgdG8gb3BlbiB0aGUgc2FtZSBjaGFubmVsLnBPcGVuSHJtcENoYW5uZWxMaW1pdEV4Y2VlZGVkAAgEHQFUaGUgc2VuZGVyIGFscmVhZHkgaGFzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBhbGxvd2VkIG91dGJvdW5kIGNoYW5uZWxzLnBBY2NlcHRIcm1wQ2hhbm5lbERvZXNudEV4aXN0AAkE4FRoZSBjaGFubmVsIGZyb20gdGhlIHNlbmRlciB0byB0aGUgb3JpZ2luIGRvZXNuJ3QgZXhpc3QuhEFjY2VwdEhybXBDaGFubmVsQWxyZWFkeUNvbmZpcm1lZAAKBIRUaGUgY2hhbm5lbCBpcyBhbHJlYWR5IGNvbmZpcm1lZC54QWNjZXB0SHJtcENoYW5uZWxMaW1pdEV4Y2VlZGVkAAsEJQFUaGUgcmVjaXBpZW50IGFscmVhZHkgaGFzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBhbGxvd2VkIGluYm91bmQgY2hhbm5lbHMucENsb3NlSHJtcENoYW5uZWxVbmF1dGhvcml6ZWQADARVAVRoZSBvcmlnaW4gdHJpZXMgdG8gY2xvc2UgYSBjaGFubmVsIHdoZXJlIGl0IGlzIG5laXRoZXIgdGhlIHNlbmRlciBub3IgdGhlIHJlY2lwaWVudC5sQ2xvc2VIcm1wQ2hhbm5lbERvZXNudEV4aXN0AA0EnFRoZSBjaGFubmVsIHRvIGJlIGNsb3NlZCBkb2Vzbid0IGV4aXN0LnxDbG9zZUhybXBDaGFubmVsQWxyZWFkeVVuZGVyd2F5AA4EvFRoZSBjaGFubmVsIGNsb3NlIHJlcXVlc3QgaXMgYWxyZWFkeSByZXF1ZXN0ZWQuhENhbmNlbEhybXBPcGVuQ2hhbm5lbFVuYXV0aG9yaXplZAAPBF0BQ2FuY2VsaW5nIGlzIHJlcXVlc3RlZCBieSBuZWl0aGVyIHRoZSBzZW5kZXIgbm9yIHJlY2lwaWVudCBvZiB0aGUgb3BlbiBjaGFubmVsIHJlcXVlc3QuaE9wZW5Icm1wQ2hhbm5lbERvZXNudEV4aXN0ABAEfFRoZSBvcGVuIHJlcXVlc3QgZG9lc24ndCBleGlzdC58T3BlbkhybXBDaGFubmVsQWxyZWFkeUNvbmZpcm1lZAARBC0BQ2Fubm90IGNhbmNlbCBhbiBIUk1QIG9wZW4gY2hhbm5lbCByZXF1ZXN0IGJlY2F1c2UgaXQgaXMgYWxyZWFkeSBjb25maXJtZWQuMFdyb25nV2l0bmVzcwASBIxUaGUgcHJvdmlkZWQgd2l0bmVzcyBkYXRhIGlzIHdyb25nLnBDaGFubmVsQ3JlYXRpb25Ob3RBdXRob3JpemVkABME6FRoZSBjaGFubmVsIGJldHdlZW4gdGhlc2UgdHdvIGNoYWlucyBjYW5ub3QgYmUgYXV0aG9yaXplZC4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQu7QsAAAIhAgDxCwxMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2NyxTZXNzaW9uSW5mbwAANAFgYWN0aXZlX3ZhbGlkYXRvcl9pbmRpY2VzJQsBTFZlYzxWYWxpZGF0b3JJbmRleD4AASxyYW5kb21fc2VlZAQBIFt1ODsgMzJdAAE4ZGlzcHV0ZV9wZXJpb2QQATBTZXNzaW9uSW5kZXgAASh2YWxpZGF0b3Jz9QsBnEluZGV4ZWRWZWM8VmFsaWRhdG9ySW5kZXgsIFZhbGlkYXRvcklkPgABOGRpc2NvdmVyeV9rZXlzeQkBZFZlYzxBdXRob3JpdHlEaXNjb3ZlcnlJZD4AATxhc3NpZ25tZW50X2tleXPtCwFEVmVjPEFzc2lnbm1lbnRJZD4AAUB2YWxpZGF0b3JfZ3JvdXBz+QsBrEluZGV4ZWRWZWM8R3JvdXBJbmRleCwgVmVjPFZhbGlkYXRvckluZGV4Pj4AARxuX2NvcmVzEAEMdTMyAAFoemVyb3RoX2RlbGF5X3RyYW5jaGVfd2lkdGgQAQx1MzIAAWByZWxheV92cmZfbW9kdWxvX3NhbXBsZXMQAQx1MzIAAUBuX2RlbGF5X3RyYW5jaGVzEAEMdTMyAAE0bm9fc2hvd19zbG90cxABDHUzMgABQG5lZWRlZF9hcHByb3ZhbHMQAQx1MzIAAPULDExwb2xrYWRvdF9wcmltaXRpdmVzCHY3KEluZGV4ZWRWZWMIBEsBmQQEVgEdAgAEACkLARhWZWM8Vj4AAPkLDExwb2xrYWRvdF9wcmltaXRpdmVzCHY3KEluZGV4ZWRWZWMIBEsBgQcEVgElCwAEAF0LARhWZWM8Vj4AAP0LAAAECBDtBAABDAxMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2NzBEaXNwdXRlU3RhdGUEBE4BEAAQATh2YWxpZGF0b3JzX2ZvcpEEAXxCaXRWZWM8dTgsIGJpdHZlYzo6b3JkZXI6OkxzYjA+AAFIdmFsaWRhdG9yc19hZ2FpbnN0kQQBfEJpdFZlYzx1OCwgYml0dmVjOjpvcmRlcjo6THNiMD4AARRzdGFydBABBE4AATBjb25jbHVkZWRfYXRhAgEkT3B0aW9uPE4+AAAFDAQgQlRyZWVTZXQEBFQBmQQABAAlCwAAAAkMEGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMgZGlzcHV0ZXMYcGFsbGV0FEVycm9yBARUAAEkdER1cGxpY2F0ZURpc3B1dGVTdGF0ZW1lbnRTZXRzAAAEqER1cGxpY2F0ZSBkaXNwdXRlIHN0YXRlbWVudCBzZXRzIHByb3ZpZGVkLlxBbmNpZW50RGlzcHV0ZVN0YXRlbWVudAABBIxBbmNpZW50IGRpc3B1dGUgc3RhdGVtZW50IHByb3ZpZGVkLmRWYWxpZGF0b3JJbmRleE91dE9mQm91bmRzAAIE6FZhbGlkYXRvciBpbmRleCBvbiBzdGF0ZW1lbnQgaXMgb3V0IG9mIGJvdW5kcyBmb3Igc2Vzc2lvbi5ASW52YWxpZFNpZ25hdHVyZQADBHxJbnZhbGlkIHNpZ25hdHVyZSBvbiBzdGF0ZW1lbnQuSER1cGxpY2F0ZVN0YXRlbWVudAAEBMxWYWxpZGF0b3Igdm90ZSBzdWJtaXR0ZWQgbW9yZSB0aGFuIG9uY2UgdG8gZGlzcHV0ZS5IU2luZ2xlU2lkZWREaXNwdXRlAAUExEEgZGlzcHV0ZSB3aGVyZSB0aGVyZSBhcmUgb25seSB2b3RlcyBvbiBvbmUgc2lkZS48TWFsaWNpb3VzQmFja2VyAAYEnEEgZGlzcHV0ZSB2b3RlIGZyb20gYSBtYWxpY2lvdXMgYmFja2VyLkxNaXNzaW5nQmFja2luZ1ZvdGVzAAcE4E5vIGJhY2tpbmcgdm90ZXMgd2VyZSBwcm92aWRlcyBhbG9uZyBkaXNwdXRlIHN0YXRlbWVudHMuSFVuY29uZmlybWVkRGlzcHV0ZQAIBLBVbmNvbmZpcm1lZCBkaXNwdXRlIHN0YXRlbWVudCBzZXRzIHByb3ZpZGVkLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC4NDBBMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2NyBzbGFzaGluZzhQZW5kaW5nU2xhc2hlcwAACAEQa2V5cxEMAZRCVHJlZU1hcDxWYWxpZGF0b3JJbmRleCwgVmFsaWRhdG9ySWQ+AAEQa2luZC0FAUxTbGFzaGluZ09mZmVuY2VLaW5kAAARDAQgQlRyZWVNYXAIBEsBmQQEVgEdAgAEABUMAAAAFQwAAAIZDAAZDAAABAiZBB0CAB0MFGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMgZGlzcHV0ZXMgc2xhc2hpbmcYcGFsbGV0FEVycm9yBARUAAEYYEludmFsaWRLZXlPd25lcnNoaXBQcm9vZgAABIxUaGUga2V5IG93bmVyc2hpcCBwcm9vZiBpcyBpbnZhbGlkLkxJbnZhbGlkU2Vzc2lvbkluZGV4AAEEoFRoZSBzZXNzaW9uIGluZGV4IGlzIHRvbyBvbGQgb3IgaW52YWxpZC5QSW52YWxpZENhbmRpZGF0ZUhhc2gAAgR4VGhlIGNhbmRpZGF0ZSBoYXNoIGlzIGludmFsaWQuVEludmFsaWRWYWxpZGF0b3JJbmRleAADCAEBVGhlcmUgaXMgbm8gcGVuZGluZyBzbGFzaCBmb3IgdGhlIGdpdmVuIHZhbGlkYXRvciBpbmRleCBhbmQgdGltZRRzbG90LmBWYWxpZGF0b3JJbmRleElkTWlzbWF0Y2gABATQVGhlIHZhbGlkYXRvciBpbmRleCBkb2VzIG5vdCBtYXRjaCB0aGUgdmFsaWRhdG9yIGlkLlxEdXBsaWNhdGVTbGFzaGluZ1JlcG9ydAAFBA0BVGhlIGdpdmVuIHNsYXNoaW5nIHJlcG9ydCBpcyB2YWxpZCBidXQgYWxyZWFkeSBwcmV2aW91c2x5IHJlcG9ydGVkLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC4hDBBscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zSGFzc2lnbmVyX29uX2RlbWFuZBR0eXBlc0RDb3JlQWZmaW5pdHlDb3VudAAACAEoY29yZV9pbmRleH0HASRDb3JlSW5kZXgAARRjb3VudBABDHUzMgAAJQwQbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWluc0hhc3NpZ25lcl9vbl9kZW1hbmQUdHlwZXM8UXVldWVTdGF0dXNUeXBlAAAQARx0cmFmZmlj0QYBJEZpeGVkVTEyOAABKG5leHRfaW5kZXgpDAEoUXVldWVJbmRleAABOHNtYWxsZXN0X2luZGV4KQwBKFF1ZXVlSW5kZXgAATRmcmVlZF9pbmRpY2VzLQwBdEJpbmFyeUhlYXA8UmV2ZXJzZVF1ZXVlSW5kZXg+AAApDBBscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zSGFzc2lnbmVyX29uX2RlbWFuZBR0eXBlcyhRdWV1ZUluZGV4AAAEABABDHUzMgAALQwEKEJpbmFyeUhlYXAEBFQBMQwABAA1DAAAADEMEGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnNIYXNzaWduZXJfb25fZGVtYW5kFHR5cGVzRFJldmVyc2VRdWV1ZUluZGV4AAAEABABDHUzMgAANQwAAAIxDAA5DAQoQmluYXJ5SGVhcAQEVAE9DAAEAEEMAAAAPQwQbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWluc0hhc3NpZ25lcl9vbl9kZW1hbmQUdHlwZXM0RW5xdWV1ZWRPcmRlcgAACAEccGFyYV9pZI0CARhQYXJhSWQAAQxpZHgpDAEoUXVldWVJbmRleAAAQQwAAAI9DABFDAxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUARgEUwAABABJDAEYVmVjPFQ+AABJDAAAAhgATQwQbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWluc0hhc3NpZ25lcl9vbl9kZW1hbmQYcGFsbGV0FEVycm9yBARUAAEIJFF1ZXVlRnVsbAAABORUaGUgb3JkZXIgcXVldWUgaXMgZnVsbCwgYHBsYWNlX29yZGVyYCB3aWxsIG5vdCBjb250aW51ZS5wU3BvdFByaWNlSGlnaGVyVGhhbk1heEFtb3VudAABCE0BVGhlIGN1cnJlbnQgc3BvdCBwcmljZSBpcyBoaWdoZXIgdGhhbiB0aGUgbWF4IGFtb3VudCBzcGVjaWZpZWQgaW4gdGhlIGBwbGFjZV9vcmRlcmBgY2FsbCwgbWFraW5nIGl0IGludmFsaWQuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LlEMAAAECBB9BwBVDAxscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zRGFzc2lnbmVyX2NvcmV0aW1lIFNjaGVkdWxlBAROARAADAEsYXNzaWdubWVudHNdBQGMVmVjPChDb3JlQXNzaWdubWVudCwgUGFydHNPZjU3NjAwKT4AASBlbmRfaGludGECASRPcHRpb248Tj4AATRuZXh0X3NjaGVkdWxlYQIBJE9wdGlvbjxOPgAAWQwMbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWluc0Rhc3NpZ25lcl9jb3JldGltZThDb3JlRGVzY3JpcHRvcgQETgEQAAgBFHF1ZXVlXQwBaE9wdGlvbjxRdWV1ZURlc2NyaXB0b3I8Tj4+AAEwY3VycmVudF93b3JrZQwBUE9wdGlvbjxXb3JrU3RhdGU8Tj4+AABdDAQYT3B0aW9uBARUAWEMAQgQTm9uZQAAABBTb21lBABhDAAAAQAAYQwMbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWluc0Rhc3NpZ25lcl9jb3JldGltZTxRdWV1ZURlc2NyaXB0b3IEBE4BEAAIARRmaXJzdBABBE4AARBsYXN0EAEETgAAZQwEGE9wdGlvbgQEVAFpDAEIEE5vbmUAAAAQU29tZQQAaQwAAAEAAGkMDGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnNEYXNzaWduZXJfY29yZXRpbWUkV29ya1N0YXRlBAROARAAEAEsYXNzaWdubWVudHNtDAGYVmVjPChDb3JlQXNzaWdubWVudCwgQXNzaWdubWVudFN0YXRlKT4AASBlbmRfaGludGECASRPcHRpb248Tj4AAQxwb3NtAQEMdTE2AAEQc3RlcGkFATBQYXJ0c09mNTc2MDAAAG0MAAACcQwAcQwAAAQIZQV1DAB1DAxscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zRGFzc2lnbmVyX2NvcmV0aW1lPEFzc2lnbm1lbnRTdGF0ZQAACAEUcmF0aW9pBQEwUGFydHNPZjU3NjAwAAEkcmVtYWluaW5naQUBMFBhcnRzT2Y1NzYwMAAAeQwQbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWluc0Rhc3NpZ25lcl9jb3JldGltZRhwYWxsZXQURXJyb3IEBFQAARhAQXNzaWdubWVudHNFbXB0eQAAADRPdmVyU2NoZWR1bGVkAAEEkEFzc2lnbm1lbnRzIHRvZ2V0aGVyIGV4Y2VlZGVkIDU3NjAwLjhVbmRlclNjaGVkdWxlZAACBJBBc3NpZ25tZW50cyB0b2dldGhlciBsZXNzIHRoYW4gNTc2MDBARGlzYWxsb3dlZEluc2VydAADCFEBYXNzaWduX2NvcmUgaXMgb25seSBhbGxvd2VkIHRvIGFwcGVuZCBuZXcgYXNzaWdubWVudHMgYXQgdGhlIGVuZCBvZiBhbHJlYWR5IGV4aXN0aW5nFG9uZXMuPER1cGxpY2F0ZUluc2VydAAEBFUBVHJpZWQgdG8gaW5zZXJ0IGEgc2NoZWR1bGUgZm9yIHRoZSBzYW1lIGNvcmUgYW5kIGJsb2NrIG51bWJlciBhcyBhbiBleGlzdGluZyBzY2hlZHVsZVBBc3NpZ25tZW50c05vdFNvcnRlZAAFBKxUcmllZCB0byBhZGQgYW4gdW5zb3J0ZWQgc2V0IG9mIGFzc2lnbm1lbnRzBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0Ln0MDFxwb2xrYWRvdF9ydW50aW1lX2NvbW1vbjxwYXJhc19yZWdpc3RyYXIgUGFyYUluZm8IHEFjY291bnQBABxCYWxhbmNlARgADAEcbWFuYWdlcgABHEFjY291bnQAARxkZXBvc2l0GAEcQmFsYW5jZQABGGxvY2tlZM0CATBPcHRpb248Ym9vbD4AAIEMEFxwb2xrYWRvdF9ydW50aW1lX2NvbW1vbjxwYXJhc19yZWdpc3RyYXIYcGFsbGV0FEVycm9yBARUAAE4NE5vdFJlZ2lzdGVyZWQAAARkVGhlIElEIGlzIG5vdCByZWdpc3RlcmVkLkRBbHJlYWR5UmVnaXN0ZXJlZAABBHRUaGUgSUQgaXMgYWxyZWFkeSByZWdpc3RlcmVkLiBOb3RPd25lcgACBJxUaGUgY2FsbGVyIGlzIG5vdCB0aGUgb3duZXIgb2YgdGhpcyBJZC4wQ29kZVRvb0xhcmdlAAMEXEludmFsaWQgcGFyYSBjb2RlIHNpemUuQEhlYWREYXRhVG9vTGFyZ2UABARwSW52YWxpZCBwYXJhIGhlYWQgZGF0YSBzaXplLjBOb3RQYXJhY2hhaW4ABQRgUGFyYSBpcyBub3QgYSBQYXJhY2hhaW4uNE5vdFBhcmF0aHJlYWQABgS8UGFyYSBpcyBub3QgYSBQYXJhdGhyZWFkIChvbi1kZW1hbmQgcGFyYWNoYWluKS5AQ2Fubm90RGVyZWdpc3RlcgAHBFhDYW5ub3QgZGVyZWdpc3RlciBwYXJhPENhbm5vdERvd25ncmFkZQAIBC0BQ2Fubm90IHNjaGVkdWxlIGRvd25ncmFkZSBvZiBsZWFzZSBob2xkaW5nIHBhcmFjaGFpbiB0byBvbi1kZW1hbmQgcGFyYWNoYWluNENhbm5vdFVwZ3JhZGUACQQlAUNhbm5vdCBzY2hlZHVsZSB1cGdyYWRlIG9mIG9uLWRlbWFuZCBwYXJhY2hhaW4gdG8gbGVhc2UgaG9sZGluZyBwYXJhY2hhaW4oUGFyYUxvY2tlZAAKCEkBUGFyYSBpcyBsb2NrZWQgZnJvbSBtYW5pcHVsYXRpb24gYnkgdGhlIG1hbmFnZXIuIE11c3QgdXNlIHBhcmFjaGFpbiBvciByZWxheSBjaGFpbixnb3Zlcm5hbmNlLixOb3RSZXNlcnZlZAALBNBUaGUgSUQgZ2l2ZW4gZm9yIHJlZ2lzdHJhdGlvbiBoYXMgbm90IGJlZW4gcmVzZXJ2ZWQuLEludmFsaWRDb2RlAAwEfFRoZSB2YWxpZGF0aW9uIGNvZGUgaXMgaW52YWxpZC4oQ2Fubm90U3dhcAANCFEBQ2Fubm90IHBlcmZvcm0gYSBwYXJhY2hhaW4gc2xvdCAvIGxpZmVjeWNsZSBzd2FwLiBDaGVjayB0aGF0IHRoZSBzdGF0ZSBvZiBib3RoIHBhcmFzhGFyZSBjb3JyZWN0IGZvciB0aGUgc3dhcCB0byB3b3JrLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC6FDAAAAjEIAIkMEFxwb2xrYWRvdF9ydW50aW1lX2NvbW1vbhRzbG90cxhwYWxsZXQURXJyb3IEBFQAAQhEUGFyYU5vdE9uYm9hcmRpbmcAAASMVGhlIHBhcmFjaGFpbiBJRCBpcyBub3Qgb25ib2FyZGluZy4oTGVhc2VFcnJvcgABBIhUaGVyZSB3YXMgYW4gZXJyb3Igd2l0aCB0aGUgbGVhc2UuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0Lo0MAAAECACNAgCRDAAAAyQAAACVDACVDAQYT3B0aW9uBARUAZkMAQgQTm9uZQAAABBTb21lBACZDAAAAQAAmQwAAAQMAI0CGACdDBBccG9sa2Fkb3RfcnVudGltZV9jb21tb24gYXVjdGlvbnMYcGFsbGV0FEVycm9yBARUAAEcREF1Y3Rpb25JblByb2dyZXNzAAAEkFRoaXMgYXVjdGlvbiBpcyBhbHJlYWR5IGluIHByb2dyZXNzLkRMZWFzZVBlcmlvZEluUGFzdAABBIBUaGUgbGVhc2UgcGVyaW9kIGlzIGluIHRoZSBwYXN0LkRQYXJhTm90UmVnaXN0ZXJlZAACBFhQYXJhIGlzIG5vdCByZWdpc3RlcmVkRE5vdEN1cnJlbnRBdWN0aW9uAAMEWE5vdCBhIGN1cnJlbnQgYXVjdGlvbi4oTm90QXVjdGlvbgAEBDxOb3QgYW4gYXVjdGlvbi4wQXVjdGlvbkVuZGVkAAUEaEF1Y3Rpb24gaGFzIGFscmVhZHkgZW5kZWQuQEFscmVhZHlMZWFzZWRPdXQABgTYVGhlIHBhcmEgaXMgYWxyZWFkeSBsZWFzZWQgb3V0IGZvciBwYXJ0IG9mIHRoaXMgcmFuZ2UuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LqEMDFxwb2xrYWRvdF9ydW50aW1lX2NvbW1vbiRjcm93ZGxvYW4gRnVuZEluZm8QJEFjY291bnRJZAEAHEJhbGFuY2UBGCxCbG9ja051bWJlcgEQLExlYXNlUGVyaW9kARAAKAEkZGVwb3NpdG9yAAEkQWNjb3VudElkAAEgdmVyaWZpZXJJBQFMT3B0aW9uPE11bHRpU2lnbmVyPgABHGRlcG9zaXQYARxCYWxhbmNlAAEYcmFpc2VkGAEcQmFsYW5jZQABDGVuZBABLEJsb2NrTnVtYmVyAAEMY2FwGAEcQmFsYW5jZQABRGxhc3RfY29udHJpYnV0aW9upQwBdExhc3RDb250cmlidXRpb248QmxvY2tOdW1iZXI+AAEwZmlyc3RfcGVyaW9kEAEsTGVhc2VQZXJpb2QAASxsYXN0X3BlcmlvZBABLExlYXNlUGVyaW9kAAEoZnVuZF9pbmRleBABJEZ1bmRJbmRleAAApQwMXHBvbGthZG90X3J1bnRpbWVfY29tbW9uJGNyb3dkbG9hbkBMYXN0Q29udHJpYnV0aW9uBCxCbG9ja051bWJlcgEQAQwUTmV2ZXIAAAAkUHJlRW5kaW5nBAAQAQx1MzIAAQAYRW5kaW5nBAAQASxCbG9ja051bWJlcgACAACpDBBccG9sa2Fkb3RfcnVudGltZV9jb21tb24kY3Jvd2Rsb2FuGHBhbGxldBRFcnJvcgQEVAABXERGaXJzdFBlcmlvZEluUGFzdAAABPRUaGUgY3VycmVudCBsZWFzZSBwZXJpb2QgaXMgbW9yZSB0aGFuIHRoZSBmaXJzdCBsZWFzZSBwZXJpb2QuZEZpcnN0UGVyaW9kVG9vRmFySW5GdXR1cmUAAQQRAVRoZSBmaXJzdCBsZWFzZSBwZXJpb2QgbmVlZHMgdG8gYXQgbGVhc3QgYmUgbGVzcyB0aGFuIDMgYG1heF92YWx1ZWAubExhc3RQZXJpb2RCZWZvcmVGaXJzdFBlcmlvZAACBOhMYXN0IGxlYXNlIHBlcmlvZCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBmaXJzdCBsZWFzZSBwZXJpb2QuYExhc3RQZXJpb2RUb29GYXJJbkZ1dHVyZQADBC0BVGhlIGxhc3QgbGVhc2UgcGVyaW9kIGNhbm5vdCBiZSBtb3JlIHRoYW4gMyBwZXJpb2RzIGFmdGVyIHRoZSBmaXJzdCBwZXJpb2QuPENhbm5vdEVuZEluUGFzdAAEBEUBVGhlIGNhbXBhaWduIGVuZHMgYmVmb3JlIHRoZSBjdXJyZW50IGJsb2NrIG51bWJlci4gVGhlIGVuZCBtdXN0IGJlIGluIHRoZSBmdXR1cmUuREVuZFRvb0ZhckluRnV0dXJlAAUEwFRoZSBlbmQgZGF0ZSBmb3IgdGhpcyBjcm93ZGxvYW4gaXMgbm90IHNlbnNpYmxlLiBPdmVyZmxvdwAGBFhUaGVyZSB3YXMgYW4gb3ZlcmZsb3cuUENvbnRyaWJ1dGlvblRvb1NtYWxsAAcE6FRoZSBjb250cmlidXRpb24gd2FzIGJlbG93IHRoZSBtaW5pbXVtLCBgTWluQ29udHJpYnV0aW9uYC40SW52YWxpZFBhcmFJZAAIBExJbnZhbGlkIGZ1bmQgaW5kZXguLENhcEV4Y2VlZGVkAAkEkENvbnRyaWJ1dGlvbnMgZXhjZWVkIG1heGltdW0gYW1vdW50LlhDb250cmlidXRpb25QZXJpb2RPdmVyAAoEqFRoZSBjb250cmlidXRpb24gcGVyaW9kIGhhcyBhbHJlYWR5IGVuZGVkLjRJbnZhbGlkT3JpZ2luAAsEjFRoZSBvcmlnaW4gb2YgdGhpcyBjYWxsIGlzIGludmFsaWQuME5vdFBhcmFjaGFpbgAMBMhUaGlzIGNyb3dkbG9hbiBkb2VzIG5vdCBjb3JyZXNwb25kIHRvIGEgcGFyYWNoYWluLixMZWFzZUFjdGl2ZQANBBUBVGhpcyBwYXJhY2hhaW4gbGVhc2UgaXMgc3RpbGwgYWN0aXZlIGFuZCByZXRpcmVtZW50IGNhbm5vdCB5ZXQgYmVnaW4uQEJpZE9yTGVhc2VBY3RpdmUADgQxAVRoaXMgcGFyYWNoYWluJ3MgYmlkIG9yIGxlYXNlIGlzIHN0aWxsIGFjdGl2ZSBhbmQgd2l0aGRyYXcgY2Fubm90IHlldCBiZWdpbi4wRnVuZE5vdEVuZGVkAA8EgFRoZSBjcm93ZGxvYW4gaGFzIG5vdCB5ZXQgZW5kZWQuPE5vQ29udHJpYnV0aW9ucwAQBNBUaGVyZSBhcmUgbm8gY29udHJpYnV0aW9ucyBzdG9yZWQgaW4gdGhpcyBjcm93ZGxvYW4uSE5vdFJlYWR5VG9EaXNzb2x2ZQARCFUBVGhlIGNyb3dkbG9hbiBpcyBub3QgcmVhZHkgdG8gZGlzc29sdmUuIFBvdGVudGlhbGx5IHN0aWxsIGhhcyBhIHNsb3Qgb3IgaW4gcmV0aXJlbWVudBxwZXJpb2QuQEludmFsaWRTaWduYXR1cmUAEgRISW52YWxpZCBzaWduYXR1cmUuME1lbW9Ub29MYXJnZQATBHxUaGUgcHJvdmlkZWQgbWVtbyBpcyB0b28gbGFyZ2UuREFscmVhZHlJbk5ld1JhaXNlABQEhFRoZSBmdW5kIGlzIGFscmVhZHkgaW4gYE5ld1JhaXNlYEhWcmZEZWxheUluUHJvZ3Jlc3MAFQS0Tm8gY29udHJpYnV0aW9ucyBhbGxvd2VkIGR1cmluZyB0aGUgVlJGIGRlbGF5NE5vTGVhc2VQZXJpb2QAFgQtAUEgbGVhc2UgcGVyaW9kIGhhcyBub3Qgc3RhcnRlZCB5ZXQsIGR1ZSB0byBhbiBvZmZzZXQgaW4gdGhlIHN0YXJ0aW5nIGJsb2NrLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC6tDBBscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zIGNvcmV0aW1lGHBhbGxldBRFcnJvcgQEVAABDCROb3RCcm9rZXIAAAQpAVRoZSBwYXJhaWQgbWFraW5nIHRoZSBjYWxsIGlzIG5vdCB0aGUgY29yZXRpbWUgYnJva2VyYWdlIHN5c3RlbSBwYXJhY2hhaW4uWFJlcXVlc3RlZEZ1dHVyZVJldmVudWUAAQhFAVJlcXVlc3RlZCByZXZlbnVlIGluZm9ybWF0aW9uIGB3aGVuYCBwYXJhbWV0ZXIgd2FzIGluIHRoZSBmdXR1cmUgZnJvbSB0aGUgY3VycmVudDRibG9jayBoZWlnaHQuTEFzc2V0VHJhbnNmZXJGYWlsZWQAAgS8RmFpbGVkIHRvIHRyYW5zZmVyIGFzc2V0cyB0byB0aGUgY29yZXRpbWUgY2hhaW4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQusQwMKHBhbGxldF94Y20YcGFsbGV0LFF1ZXJ5U3RhdHVzBCxCbG9ja051bWJlcgEQAQwcUGVuZGluZxABJHJlc3BvbmRlckUBAURWZXJzaW9uZWRMb2NhdGlvbgABTG1heWJlX21hdGNoX3F1ZXJpZXK1DAFkT3B0aW9uPFZlcnNpb25lZExvY2F0aW9uPgABMG1heWJlX25vdGlmebkMAUBPcHRpb248KHU4LCB1OCk+AAEcdGltZW91dBABLEJsb2NrTnVtYmVyAAAAPFZlcnNpb25Ob3RpZmllcggBGG9yaWdpbkUBAURWZXJzaW9uZWRMb2NhdGlvbgABJGlzX2FjdGl2ZSABEGJvb2wAAQAUUmVhZHkIASByZXNwb25zZcEMAURWZXJzaW9uZWRSZXNwb25zZQABCGF0EAEsQmxvY2tOdW1iZXIAAgAAtQwEGE9wdGlvbgQEVAFFAQEIEE5vbmUAAAAQU29tZQQARQEAAAEAALkMBBhPcHRpb24EBFQBvQwBCBBOb25lAAAAEFNvbWUEAL0MAAABAAC9DAAABAgICADBDAgMeGNtRFZlcnNpb25lZFJlc3BvbnNlAAEMCFYyBAC1BQEwdjI6OlJlc3BvbnNlAAIACFYzBAD9BQEwdjM6OlJlc3BvbnNlAAMACFY0BABhBgEwdjQ6OlJlc3BvbnNlAAQAAMUMAAAECBBFAQDJDAAABAwwKBAAzQwMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAHRDARTAAAEANUMARhWZWM8VD4AANEMAAAECEUBEADVDAAAAtEMANkMDChwYWxsZXRfeGNtGHBhbGxldFRWZXJzaW9uTWlncmF0aW9uU3RhZ2UAARBcTWlncmF0ZVN1cHBvcnRlZFZlcnNpb24AAABcTWlncmF0ZVZlcnNpb25Ob3RpZmllcnMAAQBQTm90aWZ5Q3VycmVudFRhcmdldHMEAN0MATxPcHRpb248VmVjPHU4Pj4AAgBoTWlncmF0ZUFuZE5vdGlmeU9sZFRhcmdldHMAAwAA3QwEGE9wdGlvbgQEVAE4AQgQTm9uZQAAABBTb21lBAA4AAABAADhDAAABAwQAL0GAOUMDChwYWxsZXRfeGNtGHBhbGxldGhSZW1vdGVMb2NrZWRGdW5naWJsZVJlY29yZAhIQ29uc3VtZXJJZGVudGlmaWVyAYwwTWF4Q29uc3VtZXJzAAAQARhhbW91bnQYARB1MTI4AAEUb3duZXJFAQFEVmVyc2lvbmVkTG9jYXRpb24AARhsb2NrZXJFAQFEVmVyc2lvbmVkTG9jYXRpb24AASRjb25zdW1lcnPpDAHQQm91bmRlZFZlYzwoQ29uc3VtZXJJZGVudGlmaWVyLCB1MTI4KSwgTWF4Q29uc3VtZXJzPgAA6QwMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAHtDARTAAAEAPEMARhWZWM8VD4AAO0MAAAECIwYAPEMAAAC7QwA9QwMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAH5DARTAAAEAP0MARhWZWM8VD4AAPkMAAAECBhFAQD9DAAAAvkMAAENDChwYWxsZXRfeGNtGHBhbGxldBRFcnJvcgQEVAABYCxVbnJlYWNoYWJsZQAACF0BVGhlIGRlc2lyZWQgZGVzdGluYXRpb24gd2FzIHVucmVhY2hhYmxlLCBnZW5lcmFsbHkgYmVjYXVzZSB0aGVyZSBpcyBhIG5vIHdheSBvZiByb3V0aW5nGHRvIGl0LixTZW5kRmFpbHVyZQABCEEBVGhlcmUgd2FzIHNvbWUgb3RoZXIgaXNzdWUgKGkuZS4gbm90IHRvIGRvIHdpdGggcm91dGluZykgaW4gc2VuZGluZyB0aGUgbWVzc2FnZS7IUGVyaGFwcyBhIGxhY2sgb2Ygc3BhY2UgZm9yIGJ1ZmZlcmluZyB0aGUgbWVzc2FnZS4gRmlsdGVyZWQAAgScVGhlIG1lc3NhZ2UgZXhlY3V0aW9uIGZhaWxzIHRoZSBmaWx0ZXIuSFVud2VpZ2hhYmxlTWVzc2FnZQADBLRUaGUgbWVzc2FnZSdzIHdlaWdodCBjb3VsZCBub3QgYmUgZGV0ZXJtaW5lZC5gRGVzdGluYXRpb25Ob3RJbnZlcnRpYmxlAAQE3FRoZSBkZXN0aW5hdGlvbiBgTG9jYXRpb25gIHByb3ZpZGVkIGNhbm5vdCBiZSBpbnZlcnRlZC4URW1wdHkABQSAVGhlIGFzc2V0cyB0byBiZSBzZW50IGFyZSBlbXB0eS44Q2Fubm90UmVhbmNob3IABgQ1AUNvdWxkIG5vdCByZS1hbmNob3IgdGhlIGFzc2V0cyB0byBkZWNsYXJlIHRoZSBmZWVzIGZvciB0aGUgZGVzdGluYXRpb24gY2hhaW4uNFRvb01hbnlBc3NldHMABwTEVG9vIG1hbnkgYXNzZXRzIGhhdmUgYmVlbiBhdHRlbXB0ZWQgZm9yIHRyYW5zZmVyLjRJbnZhbGlkT3JpZ2luAAgEeE9yaWdpbiBpcyBpbnZhbGlkIGZvciBzZW5kaW5nLihCYWRWZXJzaW9uAAkEIQFUaGUgdmVyc2lvbiBvZiB0aGUgYFZlcnNpb25lZGAgdmFsdWUgdXNlZCBpcyBub3QgYWJsZSB0byBiZSBpbnRlcnByZXRlZC4sQmFkTG9jYXRpb24ACghBAVRoZSBnaXZlbiBsb2NhdGlvbiBjb3VsZCBub3QgYmUgdXNlZCAoZS5nLiBiZWNhdXNlIGl0IGNhbm5vdCBiZSBleHByZXNzZWQgaW4gdGhlYGRlc2lyZWQgdmVyc2lvbiBvZiBYQ00pLjhOb1N1YnNjcmlwdGlvbgALBLxUaGUgcmVmZXJlbmNlZCBzdWJzY3JpcHRpb24gY291bGQgbm90IGJlIGZvdW5kLkRBbHJlYWR5U3Vic2NyaWJlZAAMBBEBVGhlIGxvY2F0aW9uIGlzIGludmFsaWQgc2luY2UgaXQgYWxyZWFkeSBoYXMgYSBzdWJzY3JpcHRpb24gZnJvbSB1cy5YQ2Fubm90Q2hlY2tPdXRUZWxlcG9ydAANBCkBQ291bGQgbm90IGNoZWNrLW91dCB0aGUgYXNzZXRzIGZvciB0ZWxlcG9ydGF0aW9uIHRvIHRoZSBkZXN0aW5hdGlvbiBjaGFpbi4oTG93QmFsYW5jZQAOBEEBVGhlIG93bmVyIGRvZXMgbm90IG93biAoYWxsKSBvZiB0aGUgYXNzZXQgdGhhdCB0aGV5IHdpc2ggdG8gZG8gdGhlIG9wZXJhdGlvbiBvbi4wVG9vTWFueUxvY2tzAA8EwFRoZSBhc3NldCBvd25lciBoYXMgdG9vIG1hbnkgbG9ja3Mgb24gdGhlIGFzc2V0LkxBY2NvdW50Tm90U292ZXJlaWduABAEMQFUaGUgZ2l2ZW4gYWNjb3VudCBpcyBub3QgYW4gaWRlbnRpZmlhYmxlIHNvdmVyZWlnbiBhY2NvdW50IGZvciBhbnkgbG9jYXRpb24uKEZlZXNOb3RNZXQAEQQpAVRoZSBvcGVyYXRpb24gcmVxdWlyZWQgZmVlcyB0byBiZSBwYWlkIHdoaWNoIHRoZSBpbml0aWF0b3IgY291bGQgbm90IG1lZXQuMExvY2tOb3RGb3VuZAASBPRBIHJlbW90ZSBsb2NrIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgZGF0YSBjb3VsZCBub3QgYmUgZm91bmQuFEluVXNlABMESQFUaGUgdW5sb2NrIG9wZXJhdGlvbiBjYW5ub3Qgc3VjY2VlZCBiZWNhdXNlIHRoZXJlIGFyZSBzdGlsbCBjb25zdW1lcnMgb2YgdGhlIGxvY2suaEludmFsaWRBc3NldFVua25vd25SZXNlcnZlABUE8EludmFsaWQgYXNzZXQsIHJlc2VydmUgY2hhaW4gY291bGQgbm90IGJlIGRldGVybWluZWQgZm9yIGl0LnhJbnZhbGlkQXNzZXRVbnN1cHBvcnRlZFJlc2VydmUAFgRFAUludmFsaWQgYXNzZXQsIGRvIG5vdCBzdXBwb3J0IHJlbW90ZSBhc3NldCByZXNlcnZlcyB3aXRoIGRpZmZlcmVudCBmZWVzIHJlc2VydmVzLjxUb29NYW55UmVzZXJ2ZXMAFwRJAVRvbyBtYW55IGFzc2V0cyB3aXRoIGRpZmZlcmVudCByZXNlcnZlIGxvY2F0aW9ucyBoYXZlIGJlZW4gYXR0ZW1wdGVkIGZvciB0cmFuc2Zlci5gTG9jYWxFeGVjdXRpb25JbmNvbXBsZXRlABgEfExvY2FsIFhDTSBleGVjdXRpb24gaW5jb21wbGV0ZS4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQuBQ0IUHBhbGxldF9tZXNzYWdlX3F1ZXVlJEJvb2tTdGF0ZQQ0TWVzc2FnZU9yaWdpbgHFBgAYARRiZWdpbhABJFBhZ2VJbmRleAABDGVuZBABJFBhZ2VJbmRleAABFGNvdW50EAEkUGFnZUluZGV4AAFAcmVhZHlfbmVpZ2hib3VycwkNAYRPcHRpb248TmVpZ2hib3VyczxNZXNzYWdlT3JpZ2luPj4AATRtZXNzYWdlX2NvdW50MAEMdTY0AAEQc2l6ZTABDHU2NAAACQ0EGE9wdGlvbgQEVAENDQEIEE5vbmUAAAAQU29tZQQADQ0AAAEAAA0NCFBwYWxsZXRfbWVzc2FnZV9xdWV1ZShOZWlnaGJvdXJzBDRNZXNzYWdlT3JpZ2luAcUGAAgBEHByZXbFBgE0TWVzc2FnZU9yaWdpbgABEG5leHTFBgE0TWVzc2FnZU9yaWdpbgAAEQ0AAAQIxQYQABUNCFBwYWxsZXRfbWVzc2FnZV9xdWV1ZRBQYWdlCBBTaXplARAgSGVhcFNpemUAABgBJHJlbWFpbmluZxABEFNpemUAAThyZW1haW5pbmdfc2l6ZRABEFNpemUAASxmaXJzdF9pbmRleBABEFNpemUAARRmaXJzdBABEFNpemUAARBsYXN0EAEQU2l6ZQABEGhlYXAZDQGcQm91bmRlZFZlYzx1OCwgSW50b1UzMjxIZWFwU2l6ZSwgU2l6ZT4+AAAZDQxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAQgEUwAABAA4ARhWZWM8VD4AAB0NDFBwYWxsZXRfbWVzc2FnZV9xdWV1ZRhwYWxsZXQURXJyb3IEBFQAASQsTm90UmVhcGFibGUAAAhJAVBhZ2UgaXMgbm90IHJlYXBhYmxlIGJlY2F1c2UgaXQgaGFzIGl0ZW1zIHJlbWFpbmluZyB0byBiZSBwcm9jZXNzZWQgYW5kIGlzIG5vdCBvbGQcZW5vdWdoLhhOb1BhZ2UAAQSEUGFnZSB0byBiZSByZWFwZWQgZG9lcyBub3QgZXhpc3QuJE5vTWVzc2FnZQACBKhUaGUgcmVmZXJlbmNlZCBtZXNzYWdlIGNvdWxkIG5vdCBiZSBmb3VuZC5AQWxyZWFkeVByb2Nlc3NlZAADBAEBVGhlIG1lc3NhZ2Ugd2FzIGFscmVhZHkgcHJvY2Vzc2VkIGFuZCBjYW5ub3QgYmUgcHJvY2Vzc2VkIGFnYWluLhhRdWV1ZWQABASsVGhlIG1lc3NhZ2UgaXMgcXVldWVkIGZvciBmdXR1cmUgZXhlY3V0aW9uLkhJbnN1ZmZpY2llbnRXZWlnaHQABQQZAVRoZXJlIGlzIHRlbXBvcmFyaWx5IG5vdCBlbm91Z2ggd2VpZ2h0IHRvIGNvbnRpbnVlIHNlcnZpY2luZyBtZXNzYWdlcy5gVGVtcG9yYXJpbHlVbnByb2Nlc3NhYmxlAAYQqFRoaXMgbWVzc2FnZSBpcyB0ZW1wb3JhcmlseSB1bnByb2Nlc3NhYmxlLgBZAVN1Y2ggZXJyb3JzIGFyZSBleHBlY3RlZCwgYnV0IG5vdCBndWFyYW50ZWVkLCB0byByZXNvbHZlIHRoZW1zZWx2ZXMgZXZlbnR1YWxseSB0aHJvdWdoJHJldHJ5aW5nLixRdWV1ZVBhdXNlZAAHDOxUaGUgcXVldWUgaXMgcGF1c2VkIGFuZCBubyBtZXNzYWdlIGNhbiBiZSBleGVjdXRlZCBmcm9tIGl0LgAdAVRoaXMgY2FuIGNoYW5nZSBhdCBhbnkgdGltZSBhbmQgbWF5IHJlc29sdmUgaW4gdGhlIGZ1dHVyZSBieSByZS10cnlpbmcuTFJlY3Vyc2l2ZURpc2FsbG93ZWQACAQxAUFub3RoZXIgY2FsbCBpcyBpbiBwcm9ncmVzcyBhbmQgbmVlZHMgdG8gZmluaXNoIGJlZm9yZSB0aGlzIGNhbGwgY2FuIGhhcHBlbi4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQuIQ0MRHBhbGxldF9hc3NldF9yYXRlGHBhbGxldBRFcnJvcgQEVAABDEBVbmtub3duQXNzZXRLaW5kAAAEeFRoZSBnaXZlbiBhc3NldCBJRCBpcyB1bmtub3duLjRBbHJlYWR5RXhpc3RzAAEEUQFUaGUgZ2l2ZW4gYXNzZXQgSUQgYWxyZWFkeSBoYXMgYW4gYXNzaWduZWQgY29udmVyc2lvbiByYXRlIGFuZCBjYW5ub3QgYmUgcmUtY3JlYXRlZC4gT3ZlcmZsb3cAAgTMT3ZlcmZsb3cgb2N1cnJlZCB3aGVuIGNhbGN1bGF0aW5nIHRoZSBpbnZlcnNlIHJhdGUuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LiUNDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBKQIEUwAABAApDQEYVmVjPFQ+AAApDQAAAikCAC0NDDBwYWxsZXRfYmVlZnkYcGFsbGV0FEVycm9yBARUAAEQYEludmFsaWRLZXlPd25lcnNoaXBQcm9vZgAABDEBQSBrZXkgb3duZXJzaGlwIHByb29mIHByb3ZpZGVkIGFzIHBhcnQgb2YgYW4gZXF1aXZvY2F0aW9uIHJlcG9ydCBpcyBpbnZhbGlkLmBJbnZhbGlkRXF1aXZvY2F0aW9uUHJvb2YAAQQxAUFuIGVxdWl2b2NhdGlvbiBwcm9vZiBwcm92aWRlZCBhcyBwYXJ0IG9mIGFuIGVxdWl2b2NhdGlvbiByZXBvcnQgaXMgaW52YWxpZC5YRHVwbGljYXRlT2ZmZW5jZVJlcG9ydAACBBUBQSBnaXZlbiBlcXVpdm9jYXRpb24gcmVwb3J0IGlzIHZhbGlkIGJ1dCBhbHJlYWR5IHByZXZpb3VzbHkgcmVwb3J0ZWQuUEludmFsaWRDb25maWd1cmF0aW9uAAMEjFN1Ym1pdHRlZCBjb25maWd1cmF0aW9uIGlzIGludmFsaWQuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LjENDEhzcF9jb25zZW5zdXNfYmVlZnkMbW1yREJlZWZ5QXV0aG9yaXR5U2V0BFhBdXRob3JpdHlTZXRDb21taXRtZW50ATQADAEIaWQwAVRjcmF0ZTo6VmFsaWRhdG9yU2V0SWQAAQxsZW4QAQx1MzIAAURrZXlzZXRfY29tbWl0bWVudDQBWEF1dGhvcml0eVNldENvbW1pdG1lbnQAADUNEFxwb2xrYWRvdF9ydW50aW1lX2NvbW1vbkhwYXJhc19zdWRvX3dyYXBwZXIYcGFsbGV0FEVycm9yBARUAAEkPFBhcmFEb2VzbnRFeGlzdAAABKhUaGUgc3BlY2lmaWVkIHBhcmFjaGFpbiBpcyBub3QgcmVnaXN0ZXJlZC5EUGFyYUFscmVhZHlFeGlzdHMAAQS4VGhlIHNwZWNpZmllZCBwYXJhY2hhaW4gaXMgYWxyZWFkeSByZWdpc3RlcmVkLlRFeGNlZWRzTWF4TWVzc2FnZVNpemUAAghBAUEgRE1QIG1lc3NhZ2UgY291bGRuJ3QgYmUgc2VudCBiZWNhdXNlIGl0IGV4Y2VlZHMgdGhlIG1heGltdW0gc2l6ZSBhbGxvd2VkIGZvciBhRGRvd253YXJkIG1lc3NhZ2UuOENvdWxkbnRDbGVhbnVwAAMEgENvdWxkIG5vdCBzY2hlZHVsZSBwYXJhIGNsZWFudXAuNE5vdFBhcmF0aHJlYWQABAScTm90IGEgcGFyYXRocmVhZCAob24tZGVtYW5kIHBhcmFjaGFpbikuME5vdFBhcmFjaGFpbgAFBHhOb3QgYSBsZWFzZSBob2xkaW5nIHBhcmFjaGFpbi40Q2Fubm90VXBncmFkZQAGBPhDYW5ub3QgdXBncmFkZSBvbi1kZW1hbmQgcGFyYWNoYWluIHRvIGxlYXNlIGhvbGRpbmcgcGFyYWNoYWluLjxDYW5ub3REb3duZ3JhZGUABwTYQ2Fubm90IGRvd25ncmFkZSBsZWFzZSBob2xkaW5nIHBhcmFjaGFpbiB0byBvbi1kZW1hbmQuMFRvb01hbnlDb3JlcwAIBMxUaGVyZSBhcmUgbW9yZSBjb3JlcyB0aGFuIHN1cHBvcnRlZCBieSB0aGUgcnVudGltZS4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQuOQ0MLHBhbGxldF9zdWRvGHBhbGxldBRFcnJvcgQEVAABBCxSZXF1aXJlU3VkbwAABIBTZW5kZXIgbXVzdCBiZSB0aGUgU3VkbyBhY2NvdW50LgRoRXJyb3IgZm9yIHRoZSBTdWRvIHBhbGxldC49DQAABChBDUUNSQ1NDVENWQ1dDWENZQ1pDQBBDRAwZnJhbWVfc3lzdGVtKGV4dGVuc2lvbnNUY2hlY2tfbm9uX3plcm9fc2VuZGVySENoZWNrTm9uWmVyb1NlbmRlcgQEVAAAAABFDRAwZnJhbWVfc3lzdGVtKGV4dGVuc2lvbnNIY2hlY2tfc3BlY192ZXJzaW9uQENoZWNrU3BlY1ZlcnNpb24EBFQAAAAASQ0QMGZyYW1lX3N5c3RlbShleHRlbnNpb25zQGNoZWNrX3R4X3ZlcnNpb244Q2hlY2tUeFZlcnNpb24EBFQAAAAATQ0QMGZyYW1lX3N5c3RlbShleHRlbnNpb25zNGNoZWNrX2dlbmVzaXMwQ2hlY2tHZW5lc2lzBARUAAAAAFENEDBmcmFtZV9zeXN0ZW0oZXh0ZW5zaW9uczxjaGVja19tb3J0YWxpdHk4Q2hlY2tNb3J0YWxpdHkEBFQAAAQAVQ0BDEVyYQAAVQ0QKHNwX3J1bnRpbWUcZ2VuZXJpYwxlcmEMRXJhAAEBBCBJbW1vcnRhbAAAABxNb3J0YWwxBAAIAAABABxNb3J0YWwyBAAIAAACABxNb3J0YWwzBAAIAAADABxNb3J0YWw0BAAIAAAEABxNb3J0YWw1BAAIAAAFABxNb3J0YWw2BAAIAAAGABxNb3J0YWw3BAAIAAAHABxNb3J0YWw4BAAIAAAIABxNb3J0YWw5BAAIAAAJACBNb3J0YWwxMAQACAAACgAgTW9ydGFsMTEEAAgAAAsAIE1vcnRhbDEyBAAIAAAMACBNb3J0YWwxMwQACAAADQAgTW9ydGFsMTQEAAgAAA4AIE1vcnRhbDE1BAAIAAAPACBNb3J0YWwxNgQACAAAEAAgTW9ydGFsMTcEAAgAABEAIE1vcnRhbDE4BAAIAAASACBNb3J0YWwxOQQACAAAEwAgTW9ydGFsMjAEAAgAABQAIE1vcnRhbDIxBAAIAAAVACBNb3J0YWwyMgQACAAAFgAgTW9ydGFsMjMEAAgAABcAIE1vcnRhbDI0BAAIAAAYACBNb3J0YWwyNQQACAAAGQAgTW9ydGFsMjYEAAgAABoAIE1vcnRhbDI3BAAIAAAbACBNb3J0YWwyOAQACAAAHAAgTW9ydGFsMjkEAAgAAB0AIE1vcnRhbDMwBAAIAAAeACBNb3J0YWwzMQQACAAAHwAgTW9ydGFsMzIEAAgAACAAIE1vcnRhbDMzBAAIAAAhACBNb3J0YWwzNAQACAAAIgAgTW9ydGFsMzUEAAgAACMAIE1vcnRhbDM2BAAIAAAkACBNb3J0YWwzNwQACAAAJQAgTW9ydGFsMzgEAAgAACYAIE1vcnRhbDM5BAAIAAAnACBNb3J0YWw0MAQACAAAKAAgTW9ydGFsNDEEAAgAACkAIE1vcnRhbDQyBAAIAAAqACBNb3J0YWw0MwQACAAAKwAgTW9ydGFsNDQEAAgAACwAIE1vcnRhbDQ1BAAIAAAtACBNb3J0YWw0NgQACAAALgAgTW9ydGFsNDcEAAgAAC8AIE1vcnRhbDQ4BAAIAAAwACBNb3J0YWw0OQQACAAAMQAgTW9ydGFsNTAEAAgAADIAIE1vcnRhbDUxBAAIAAAzACBNb3J0YWw1MgQACAAANAAgTW9ydGFsNTMEAAgAADUAIE1vcnRhbDU0BAAIAAA2ACBNb3J0YWw1NQQACAAANwAgTW9ydGFsNTYEAAgAADgAIE1vcnRhbDU3BAAIAAA5ACBNb3J0YWw1OAQACAAAOgAgTW9ydGFsNTkEAAgAADsAIE1vcnRhbDYwBAAIAAA8ACBNb3J0YWw2MQQACAAAPQAgTW9ydGFsNjIEAAgAAD4AIE1vcnRhbDYzBAAIAAA/ACBNb3J0YWw2NAQACAAAQAAgTW9ydGFsNjUEAAgAAEEAIE1vcnRhbDY2BAAIAABCACBNb3J0YWw2NwQACAAAQwAgTW9ydGFsNjgEAAgAAEQAIE1vcnRhbDY5BAAIAABFACBNb3J0YWw3MAQACAAARgAgTW9ydGFsNzEEAAgAAEcAIE1vcnRhbDcyBAAIAABIACBNb3J0YWw3MwQACAAASQAgTW9ydGFsNzQEAAgAAEoAIE1vcnRhbDc1BAAIAABLACBNb3J0YWw3NgQACAAATAAgTW9ydGFsNzcEAAgAAE0AIE1vcnRhbDc4BAAIAABOACBNb3J0YWw3OQQACAAATwAgTW9ydGFsODAEAAgAAFAAIE1vcnRhbDgxBAAIAABRACBNb3J0YWw4MgQACAAAUgAgTW9ydGFsODMEAAgAAFMAIE1vcnRhbDg0BAAIAABUACBNb3J0YWw4NQQACAAAVQAgTW9ydGFsODYEAAgAAFYAIE1vcnRhbDg3BAAIAABXACBNb3J0YWw4OAQACAAAWAAgTW9ydGFsODkEAAgAAFkAIE1vcnRhbDkwBAAIAABaACBNb3J0YWw5MQQACAAAWwAgTW9ydGFsOTIEAAgAAFwAIE1vcnRhbDkzBAAIAABdACBNb3J0YWw5NAQACAAAXgAgTW9ydGFsOTUEAAgAAF8AIE1vcnRhbDk2BAAIAABgACBNb3J0YWw5NwQACAAAYQAgTW9ydGFsOTgEAAgAAGIAIE1vcnRhbDk5BAAIAABjACRNb3J0YWwxMDAEAAgAAGQAJE1vcnRhbDEwMQQACAAAZQAkTW9ydGFsMTAyBAAIAABmACRNb3J0YWwxMDMEAAgAAGcAJE1vcnRhbDEwNAQACAAAaAAkTW9ydGFsMTA1BAAIAABpACRNb3J0YWwxMDYEAAgAAGoAJE1vcnRhbDEwNwQACAAAawAkTW9ydGFsMTA4BAAIAABsACRNb3J0YWwxMDkEAAgAAG0AJE1vcnRhbDExMAQACAAAbgAkTW9ydGFsMTExBAAIAABvACRNb3J0YWwxMTIEAAgAAHAAJE1vcnRhbDExMwQACAAAcQAkTW9ydGFsMTE0BAAIAAByACRNb3J0YWwxMTUEAAgAAHMAJE1vcnRhbDExNgQACAAAdAAkTW9ydGFsMTE3BAAIAAB1ACRNb3J0YWwxMTgEAAgAAHYAJE1vcnRhbDExOQQACAAAdwAkTW9ydGFsMTIwBAAIAAB4ACRNb3J0YWwxMjEEAAgAAHkAJE1vcnRhbDEyMgQACAAAegAkTW9ydGFsMTIzBAAIAAB7ACRNb3J0YWwxMjQEAAgAAHwAJE1vcnRhbDEyNQQACAAAfQAkTW9ydGFsMTI2BAAIAAB+ACRNb3J0YWwxMjcEAAgAAH8AJE1vcnRhbDEyOAQACAAAgAAkTW9ydGFsMTI5BAAIAACBACRNb3J0YWwxMzAEAAgAAIIAJE1vcnRhbDEzMQQACAAAgwAkTW9ydGFsMTMyBAAIAACEACRNb3J0YWwxMzMEAAgAAIUAJE1vcnRhbDEzNAQACAAAhgAkTW9ydGFsMTM1BAAIAACHACRNb3J0YWwxMzYEAAgAAIgAJE1vcnRhbDEzNwQACAAAiQAkTW9ydGFsMTM4BAAIAACKACRNb3J0YWwxMzkEAAgAAIsAJE1vcnRhbDE0MAQACAAAjAAkTW9ydGFsMTQxBAAIAACNACRNb3J0YWwxNDIEAAgAAI4AJE1vcnRhbDE0MwQACAAAjwAkTW9ydGFsMTQ0BAAIAACQACRNb3J0YWwxNDUEAAgAAJEAJE1vcnRhbDE0NgQACAAAkgAkTW9ydGFsMTQ3BAAIAACTACRNb3J0YWwxNDgEAAgAAJQAJE1vcnRhbDE0OQQACAAAlQAkTW9ydGFsMTUwBAAIAACWACRNb3J0YWwxNTEEAAgAAJcAJE1vcnRhbDE1MgQACAAAmAAkTW9ydGFsMTUzBAAIAACZACRNb3J0YWwxNTQEAAgAAJoAJE1vcnRhbDE1NQQACAAAmwAkTW9ydGFsMTU2BAAIAACcACRNb3J0YWwxNTcEAAgAAJ0AJE1vcnRhbDE1OAQACAAAngAkTW9ydGFsMTU5BAAIAACfACRNb3J0YWwxNjAEAAgAAKAAJE1vcnRhbDE2MQQACAAAoQAkTW9ydGFsMTYyBAAIAACiACRNb3J0YWwxNjMEAAgAAKMAJE1vcnRhbDE2NAQACAAApAAkTW9ydGFsMTY1BAAIAAClACRNb3J0YWwxNjYEAAgAAKYAJE1vcnRhbDE2NwQACAAApwAkTW9ydGFsMTY4BAAIAACoACRNb3J0YWwxNjkEAAgAAKkAJE1vcnRhbDE3MAQACAAAqgAkTW9ydGFsMTcxBAAIAACrACRNb3J0YWwxNzIEAAgAAKwAJE1vcnRhbDE3MwQACAAArQAkTW9ydGFsMTc0BAAIAACuACRNb3J0YWwxNzUEAAgAAK8AJE1vcnRhbDE3NgQACAAAsAAkTW9ydGFsMTc3BAAIAACxACRNb3J0YWwxNzgEAAgAALIAJE1vcnRhbDE3OQQACAAAswAkTW9ydGFsMTgwBAAIAAC0ACRNb3J0YWwxODEEAAgAALUAJE1vcnRhbDE4MgQACAAAtgAkTW9ydGFsMTgzBAAIAAC3ACRNb3J0YWwxODQEAAgAALgAJE1vcnRhbDE4NQQACAAAuQAkTW9ydGFsMTg2BAAIAAC6ACRNb3J0YWwxODcEAAgAALsAJE1vcnRhbDE4OAQACAAAvAAkTW9ydGFsMTg5BAAIAAC9ACRNb3J0YWwxOTAEAAgAAL4AJE1vcnRhbDE5MQQACAAAvwAkTW9ydGFsMTkyBAAIAADAACRNb3J0YWwxOTMEAAgAAMEAJE1vcnRhbDE5NAQACAAAwgAkTW9ydGFsMTk1BAAIAADDACRNb3J0YWwxOTYEAAgAAMQAJE1vcnRhbDE5NwQACAAAxQAkTW9ydGFsMTk4BAAIAADGACRNb3J0YWwxOTkEAAgAAMcAJE1vcnRhbDIwMAQACAAAyAAkTW9ydGFsMjAxBAAIAADJACRNb3J0YWwyMDIEAAgAAMoAJE1vcnRhbDIwMwQACAAAywAkTW9ydGFsMjA0BAAIAADMACRNb3J0YWwyMDUEAAgAAM0AJE1vcnRhbDIwNgQACAAAzgAkTW9ydGFsMjA3BAAIAADPACRNb3J0YWwyMDgEAAgAANAAJE1vcnRhbDIwOQQACAAA0QAkTW9ydGFsMjEwBAAIAADSACRNb3J0YWwyMTEEAAgAANMAJE1vcnRhbDIxMgQACAAA1AAkTW9ydGFsMjEzBAAIAADVACRNb3J0YWwyMTQEAAgAANYAJE1vcnRhbDIxNQQACAAA1wAkTW9ydGFsMjE2BAAIAADYACRNb3J0YWwyMTcEAAgAANkAJE1vcnRhbDIxOAQACAAA2gAkTW9ydGFsMjE5BAAIAADbACRNb3J0YWwyMjAEAAgAANwAJE1vcnRhbDIyMQQACAAA3QAkTW9ydGFsMjIyBAAIAADeACRNb3J0YWwyMjMEAAgAAN8AJE1vcnRhbDIyNAQACAAA4AAkTW9ydGFsMjI1BAAIAADhACRNb3J0YWwyMjYEAAgAAOIAJE1vcnRhbDIyNwQACAAA4wAkTW9ydGFsMjI4BAAIAADkACRNb3J0YWwyMjkEAAgAAOUAJE1vcnRhbDIzMAQACAAA5gAkTW9ydGFsMjMxBAAIAADnACRNb3J0YWwyMzIEAAgAAOgAJE1vcnRhbDIzMwQACAAA6QAkTW9ydGFsMjM0BAAIAADqACRNb3J0YWwyMzUEAAgAAOsAJE1vcnRhbDIzNgQACAAA7AAkTW9ydGFsMjM3BAAIAADtACRNb3J0YWwyMzgEAAgAAO4AJE1vcnRhbDIzOQQACAAA7wAkTW9ydGFsMjQwBAAIAADwACRNb3J0YWwyNDEEAAgAAPEAJE1vcnRhbDI0MgQACAAA8gAkTW9ydGFsMjQzBAAIAADzACRNb3J0YWwyNDQEAAgAAPQAJE1vcnRhbDI0NQQACAAA9QAkTW9ydGFsMjQ2BAAIAAD2ACRNb3J0YWwyNDcEAAgAAPcAJE1vcnRhbDI0OAQACAAA+AAkTW9ydGFsMjQ5BAAIAAD5ACRNb3J0YWwyNTAEAAgAAPoAJE1vcnRhbDI1MQQACAAA+wAkTW9ydGFsMjUyBAAIAAD8ACRNb3J0YWwyNTMEAAgAAP0AJE1vcnRhbDI1NAQACAAA/gAkTW9ydGFsMjU1BAAIAAD/AABZDRAwZnJhbWVfc3lzdGVtKGV4dGVuc2lvbnMsY2hlY2tfbm9uY2UoQ2hlY2tOb25jZQQEVAAABADsASBUOjpOb25jZQAAXQ0QMGZyYW1lX3N5c3RlbShleHRlbnNpb25zMGNoZWNrX3dlaWdodCxDaGVja1dlaWdodAQEVAAAAABhDQhocGFsbGV0X3RyYW5zYWN0aW9uX3BheW1lbnRgQ2hhcmdlVHJhbnNhY3Rpb25QYXltZW50BARUAAAEAPwBMEJhbGFuY2VPZjxUPgAAZQ0MXHBvbGthZG90X3J1bnRpbWVfY29tbW9uGGNsYWltc0hQcmV2YWxpZGF0ZUF0dGVzdHMEBFQAAAAAaQ0IdGZyYW1lX21ldGFkYXRhX2hhc2hfZXh0ZW5zaW9uRENoZWNrTWV0YWRhdGFIYXNoBARUAAAEARBtb2RlbQ0BEE1vZGUAAG0NCHRmcmFtZV9tZXRhZGF0YV9oYXNoX2V4dGVuc2lvbhBNb2RlAAEIIERpc2FibGVkAAAAHEVuYWJsZWQAAQAAcQ0INHBhc2VvX3J1bnRpbWUcUnVudGltZQAAAAB1DQwwcmVsYXlfY29tbW9uEGFwaXM0SW5mbGF0aW9uSW5mbwAACAEkaW5mbGF0aW9uuQIBXHNwX3J1bnRpbWU6OlBlcnF1aW50aWxsAAEkbmV4dF9taW50eQ0B8Chwb2xrYWRvdF9wcmltaXRpdmVzOjpCYWxhbmNlLCBwb2xrYWRvdF9wcmltaXRpdmVzOjpCYWxhbmNlKQAAeQ0AAAQIGBgAfQ0QKHNwX3J1bnRpbWUcZ2VuZXJpYxRibG9jaxRCbG9jawgYSGVhZGVyAaEBJEV4dHJpbnNpYwGBDQAIARhoZWFkZXKhAQEYSGVhZGVyAAEoZXh0cmluc2ljc4UNAThWZWM8RXh0cmluc2ljPgAAgQ0QKHNwX3J1bnRpbWUcZ2VuZXJpY0x1bmNoZWNrZWRfZXh0cmluc2ljSFVuY2hlY2tlZEV4dHJpbnNpYxAcQWRkcmVzcwHFARBDYWxsAXUBJFNpZ25hdHVyZQFVBRRFeHRyYQE9DQAEADgAAACFDQAAAoENAIkNCChzcF9ydW50aW1lWEV4dHJpbnNpY0luY2x1c2lvbk1vZGUAAQg0QWxsRXh0cmluc2ljcwAAADRPbmx5SW5oZXJlbnRzAAEAAI0NCBxzcF9jb3JlOE9wYXF1ZU1ldGFkYXRhAAAEADgBHFZlYzx1OD4AAJENBBhPcHRpb24EBFQBjQ0BCBBOb25lAAAAEFNvbWUEAI0NAAABAACVDQQYUmVzdWx0CARUAYgERQGZDQEICE9rBACIAAAAAAxFcnIEAJkNAAABAACZDQwoc3BfcnVudGltZVB0cmFuc2FjdGlvbl92YWxpZGl0eWBUcmFuc2FjdGlvblZhbGlkaXR5RXJyb3IAAQgcSW52YWxpZAQAnQ0BSEludmFsaWRUcmFuc2FjdGlvbgAAABxVbmtub3duBAChDQFIVW5rbm93blRyYW5zYWN0aW9uAAEAAJ0NDChzcF9ydW50aW1lUHRyYW5zYWN0aW9uX3ZhbGlkaXR5SEludmFsaWRUcmFuc2FjdGlvbgABLBBDYWxsAAAAHFBheW1lbnQAAQAYRnV0dXJlAAIAFFN0YWxlAAMAIEJhZFByb29mAAQAREFuY2llbnRCaXJ0aEJsb2NrAAUAREV4aGF1c3RzUmVzb3VyY2VzAAYAGEN1c3RvbQQACAEIdTgABwAwQmFkTWFuZGF0b3J5AAgATE1hbmRhdG9yeVZhbGlkYXRpb24ACQAkQmFkU2lnbmVyAAoAAKENDChzcF9ydW50aW1lUHRyYW5zYWN0aW9uX3ZhbGlkaXR5SFVua25vd25UcmFuc2FjdGlvbgABDDBDYW5ub3RMb29rdXAAAABMTm9VbnNpZ25lZFZhbGlkYXRvcgABABhDdXN0b20EAAgBCHU4AAIAAKUNCDBzcF9pbmhlcmVudHMwSW5oZXJlbnREYXRhAAAEARBkYXRhqQ0BlEJUcmVlTWFwPEluaGVyZW50SWRlbnRpZmllciwgVmVjPHU4Pj4AAKkNBCBCVHJlZU1hcAgESwGxBQRWATgABACtDQAAAK0NAAACsQ0AsQ0AAAQIsQU4ALUNCDBzcF9pbmhlcmVudHNQQ2hlY2tJbmhlcmVudHNSZXN1bHQAAAwBEG9rYXkgARBib29sAAEsZmF0YWxfZXJyb3IgARBib29sAAEYZXJyb3JzpQ0BMEluaGVyZW50RGF0YQAAuQ0MKHNwX3J1bnRpbWVQdHJhbnNhY3Rpb25fdmFsaWRpdHlEVHJhbnNhY3Rpb25Tb3VyY2UAAQwcSW5CbG9jawAAABRMb2NhbAABACBFeHRlcm5hbAACAAC9DQQYUmVzdWx0CARUAcENBEUBmQ0BCAhPawQAwQ0AAAAADEVycgQAmQ0AAAEAAMENDChzcF9ydW50aW1lUHRyYW5zYWN0aW9uX3ZhbGlkaXR5QFZhbGlkVHJhbnNhY3Rpb24AABQBIHByaW9yaXR5MAFMVHJhbnNhY3Rpb25Qcmlvcml0eQABIHJlcXVpcmVzhQEBTFZlYzxUcmFuc2FjdGlvblRhZz4AASBwcm92aWRlc4UBAUxWZWM8VHJhbnNhY3Rpb25UYWc+AAEkbG9uZ2V2aXR5MAFQVHJhbnNhY3Rpb25Mb25nZXZpdHkAASRwcm9wYWdhdGUgARBib29sAADFDQAABAhdC8kNAMkNDExwb2xrYWRvdF9wcmltaXRpdmVzCHY3REdyb3VwUm90YXRpb25JbmZvBAROARAADAFMc2Vzc2lvbl9zdGFydF9ibG9jaxABBE4AAWBncm91cF9yb3RhdGlvbl9mcmVxdWVuY3kQAQROAAEMbm93EAEETgAAzQ0AAALRDQDRDQxMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2NyRDb3JlU3RhdGUIBEgBNAROARABDCBPY2N1cGllZAQA1Q0BSE9jY3VwaWVkQ29yZTxILCBOPgAAACRTY2hlZHVsZWQEAN0NATRTY2hlZHVsZWRDb3JlAAEAEEZyZWUAAgAA1Q0MTHBvbGthZG90X3ByaW1pdGl2ZXMIdjcwT2NjdXBpZWRDb3JlCARIATQETgEQACABUG5leHRfdXBfb25fYXZhaWxhYmxl2Q0BVE9wdGlvbjxTY2hlZHVsZWRDb3JlPgABOG9jY3VwaWVkX3NpbmNlEAEETgABLHRpbWVfb3V0X2F0EAEETgABTG5leHRfdXBfb25fdGltZV9vdXTZDQFUT3B0aW9uPFNjaGVkdWxlZENvcmU+AAEwYXZhaWxhYmlsaXR5kQQBfEJpdFZlYzx1OCwgYml0dmVjOjpvcmRlcjo6THNiMD4AAURncm91cF9yZXNwb25zaWJsZYEHAShHcm91cEluZGV4AAE4Y2FuZGlkYXRlX2hhc2jtBAE0Q2FuZGlkYXRlSGFzaAABUGNhbmRpZGF0ZV9kZXNjcmlwdG9yrQQBWENhbmRpZGF0ZURlc2NyaXB0b3I8SD4AANkNBBhPcHRpb24EBFQB3Q0BCBBOb25lAAAAEFNvbWUEAN0NAAABAADdDQxMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2NzRTY2hlZHVsZWRDb3JlAAAIARxwYXJhX2lkjQIBCElkAAEgY29sbGF0b3LhDQFIT3B0aW9uPENvbGxhdG9ySWQ+AADhDQQYT3B0aW9uBARUAbEEAQgQTm9uZQAAABBTb21lBACxBAAAAQAA5Q0MTHBvbGthZG90X3ByaW1pdGl2ZXMIdjdYT2NjdXBpZWRDb3JlQXNzdW1wdGlvbgABDCBJbmNsdWRlZAAAACBUaW1lZE91dAABABBGcmVlAAIAAOkNBBhPcHRpb24EBFQB7Q0BCBBOb25lAAAAEFNvbWUEAO0NAAABAADtDQxMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2N1xQZXJzaXN0ZWRWYWxpZGF0aW9uRGF0YQgESAE0BE4BEAAQASxwYXJlbnRfaGVhZNkEASBIZWFkRGF0YQABTHJlbGF5X3BhcmVudF9udW1iZXIQAQROAAFkcmVsYXlfcGFyZW50X3N0b3JhZ2Vfcm9vdDQBBEgAATBtYXhfcG92X3NpemUQAQx1MzIAAPENBBhPcHRpb24EBFQB9Q0BCBBOb25lAAAAEFNvbWUEAPUNAAABAAD1DQAABAjtDbkEAPkNBBhPcHRpb24EBFQBqQQBCBBOb25lAAAAEFNvbWUEAKkEAAABAAD9DQAAAgEOAAEODExwb2xrYWRvdF9wcmltaXRpdmVzCHY3OENhbmRpZGF0ZUV2ZW50BARIATQBDDxDYW5kaWRhdGVCYWNrZWQQAHkHAUxDYW5kaWRhdGVSZWNlaXB0PEg+AADZBAEgSGVhZERhdGEAAH0HASRDb3JlSW5kZXgAAIEHAShHcm91cEluZGV4AAAARENhbmRpZGF0ZUluY2x1ZGVkEAB5BwFMQ2FuZGlkYXRlUmVjZWlwdDxIPgAA2QQBIEhlYWREYXRhAAB9BwEkQ29yZUluZGV4AACBBwEoR3JvdXBJbmRleAABAERDYW5kaWRhdGVUaW1lZE91dAwAeQcBTENhbmRpZGF0ZVJlY2VpcHQ8SD4AANkEASBIZWFkRGF0YQAAfQcBJENvcmVJbmRleAACAAAFDgQgQlRyZWVNYXAIBEsBjQIEVgHZCwAEAAkOAAAACQ4AAAINDgANDgAABAiNAtkLABEOBBhPcHRpb24EBFQBRQsBCBBOb25lAAAAEFNvbWUEAEULAAABAAAVDgQYT3B0aW9uBARUAfELAQgQTm9uZQAAABBTb21lBADxCwAAAQAAGQ4EGE9wdGlvbgQEVAG5BAEIEE5vbmUAAAAQU29tZQQAuQQAAAEAAB0OAAACIQ4AIQ4AAAQMEO0EAQwAJQ4EGE9wdGlvbgQEVAFZBAEIEE5vbmUAAAAQU29tZQQAWQQAAAEAACkOAAACLQ4ALQ4AAAQMEO0EDQwAMQ4EGE9wdGlvbgQEVAE1DgEIEE5vbmUAAAAQU29tZQQANQ4AAAEAADUOEExwb2xrYWRvdF9wcmltaXRpdmVzCHY3IHNsYXNoaW5nXE9wYXF1ZUtleU93bmVyc2hpcFByb29mAAAEADgBHFZlYzx1OD4AADkOBBhPcHRpb24EBFQBjAEIEE5vbmUAAAAQU29tZQQAjAAAAQAAPQ4EGE9wdGlvbgQEVAFBDgEIEE5vbmUAAAAQU29tZQQAQQ4AAAEAAEEOEExwb2xrYWRvdF9wcmltaXRpdmVzCHY3NGFzeW5jX2JhY2tpbmcwQmFja2luZ1N0YXRlCARIATQETgEQAAgBLGNvbnN0cmFpbnRzRQ4BOENvbnN0cmFpbnRzPE4+AAFQcGVuZGluZ19hdmFpbGFiaWxpdHllDgGcVmVjPENhbmRpZGF0ZVBlbmRpbmdBdmFpbGFiaWxpdHk8SCwgTj4+AABFDhBMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2NzRhc3luY19iYWNraW5nLENvbnN0cmFpbnRzBAROARAAOAFcbWluX3JlbGF5X3BhcmVudF9udW1iZXIQAQROAAEwbWF4X3Bvdl9zaXplEAEMdTMyAAE0bWF4X2NvZGVfc2l6ZRABDHUzMgABNHVtcF9yZW1haW5pbmcQAQx1MzIAAUx1bXBfcmVtYWluaW5nX2J5dGVzEAEMdTMyAAFkbWF4X3VtcF9udW1fcGVyX2NhbmRpZGF0ZRABDHUzMgABWGRtcF9yZW1haW5pbmdfbWVzc2FnZXPlAQEYVmVjPE4+AAEwaHJtcF9pbmJvdW5kSQ4BZEluYm91bmRIcm1wTGltaXRhdGlvbnM8Tj4AAURocm1wX2NoYW5uZWxzX291dE0OAaRWZWM8KElkLCBPdXRib3VuZEhybXBDaGFubmVsTGltaXRhdGlvbnMpPgABaG1heF9ocm1wX251bV9wZXJfY2FuZGlkYXRlEAEMdTMyAAE8cmVxdWlyZWRfcGFyZW502QQBIEhlYWREYXRhAAFQdmFsaWRhdGlvbl9jb2RlX2hhc2i5BAFIVmFsaWRhdGlvbkNvZGVIYXNoAAFMdXBncmFkZV9yZXN0cmljdGlvblkOAWhPcHRpb248VXBncmFkZVJlc3RyaWN0aW9uPgABWGZ1dHVyZV92YWxpZGF0aW9uX2NvZGVdDgF8T3B0aW9uPChOLCBWYWxpZGF0aW9uQ29kZUhhc2gpPgAASQ4QTHBvbGthZG90X3ByaW1pdGl2ZXMIdjc0YXN5bmNfYmFja2luZ1hJbmJvdW5kSHJtcExpbWl0YXRpb25zBAROARAABAFAdmFsaWRfd2F0ZXJtYXJrc+UBARhWZWM8Tj4AAE0OAAACUQ4AUQ4AAAQIjQJVDgBVDhBMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2NzRhc3luY19iYWNraW5neE91dGJvdW5kSHJtcENoYW5uZWxMaW1pdGF0aW9ucwAACAE8Ynl0ZXNfcmVtYWluaW5nEAEMdTMyAAFIbWVzc2FnZXNfcmVtYWluaW5nEAEMdTMyAABZDgQYT3B0aW9uBARUAbULAQgQTm9uZQAAABBTb21lBAC1CwAAAQAAXQ4EGE9wdGlvbgQEVAFhDgEIEE5vbmUAAAAQU29tZQQAYQ4AAAEAAGEOAAAECBC5BABlDgAAAmkOAGkOEExwb2xrYWRvdF9wcmltaXRpdmVzCHY3NGFzeW5jX2JhY2tpbmdwQ2FuZGlkYXRlUGVuZGluZ0F2YWlsYWJpbGl0eQgESAE0BE4BEAAUAThjYW5kaWRhdGVfaGFzaO0EATRDYW5kaWRhdGVIYXNoAAEoZGVzY3JpcHRvcq0EAVhDYW5kaWRhdGVEZXNjcmlwdG9yPEg+AAEsY29tbWl0bWVudHO9BAFQQ2FuZGlkYXRlQ29tbWl0bWVudHMAAUxyZWxheV9wYXJlbnRfbnVtYmVyEAEETgABMG1heF9wb3Zfc2l6ZRABDHUzMgAAbQ4EIEJUcmVlTWFwCARLAX0HBFYBlQsABABxDgAAAHEOAAACdQ4AdQ4AAAQIfQeVCwB5DgAAAqkEAH0OBBhPcHRpb24EBFQBgQ4BCBBOb25lAAAAEFNvbWUEAIEOAAABAACBDghIc3BfY29uc2Vuc3VzX2JlZWZ5MFZhbGlkYXRvclNldAQsQXV0aG9yaXR5SWQBKQIACAEodmFsaWRhdG9ycykNAUBWZWM8QXV0aG9yaXR5SWQ+AAEIaWQwAThWYWxpZGF0b3JTZXRJZAAAhQ4IKHNwX3J1bnRpbWUsT3BhcXVlVmFsdWUAAAQAOAEcVmVjPHU4PgAAiQ4EGE9wdGlvbgQEVAGFDgEIEE5vbmUAAAAQU29tZQQAhQ4AAAEAAI0OBBhSZXN1bHQIBFQBNARFAZEOAQgIT2sEADQAAAAADEVycgQAkQ4AAAEAAJEOCERzcF9tbXJfcHJpbWl0aXZlcxRFcnJvcgABKEBJbnZhbGlkTnVtZXJpY09wAAAAEFB1c2gAAQAcR2V0Um9vdAACABhDb21taXQAAwA0R2VuZXJhdGVQcm9vZgAEABhWZXJpZnkABQAwTGVhZk5vdEZvdW5kAAYARFBhbGxldE5vdEluY2x1ZGVkAAcAQEludmFsaWRMZWFmSW5kZXgACABUSW52YWxpZEJlc3RLbm93bkJsb2NrAAkAAJUOBBhSZXN1bHQIBFQBMARFAZEOAQgIT2sEADAAAAAADEVycgQAkQ4AAAEAAJkOBBhSZXN1bHQIBFQBnQ4ERQGRDgEICE9rBACdDgAAAAAMRXJyBACRDgAAAQAAnQ4AAAQIoQ6pDgChDgAAAqUOAKUOCERzcF9tbXJfcHJpbWl0aXZlc0xFbmNvZGFibGVPcGFxdWVMZWFmAAAEADgBHFZlYzx1OD4AAKkOCERzcF9tbXJfcHJpbWl0aXZlcyRMZWFmUHJvb2YEEEhhc2gBNAAMATBsZWFmX2luZGljZXOxCgE4VmVjPExlYWZJbmRleD4AAShsZWFmX2NvdW50MAEkTm9kZUluZGV4AAEUaXRlbXOVAQEkVmVjPEhhc2g+AACtDgQYUmVzdWx0CARUAYwERQGRDgEICE9rBACMAAAAAAxFcnIEAJEOAAABAACxDghEc3BfY29uc2Vuc3VzX2JhYmVEQmFiZUNvbmZpZ3VyYXRpb24AABgBNHNsb3RfZHVyYXRpb24wAQx1NjQAATBlcG9jaF9sZW5ndGgwAQx1NjQAAQRjtQEBKCh1NjQsIHU2NCkAASxhdXRob3JpdGllc1kIAZxWZWM8KEF1dGhvcml0eUlkLCBCYWJlQXV0aG9yaXR5V2VpZ2h0KT4AAShyYW5kb21uZXNzBAEoUmFuZG9tbmVzcwABNGFsbG93ZWRfc2xvdHO5AQEwQWxsb3dlZFNsb3RzAAC1DghEc3BfY29uc2Vuc3VzX2JhYmUURXBvY2gAABgBLGVwb2NoX2luZGV4MAEMdTY0AAEoc3RhcnRfc2xvdKkBARBTbG90AAEgZHVyYXRpb24wAQx1NjQAASxhdXRob3JpdGllc1kIAZxWZWM8KEF1dGhvcml0eUlkLCBCYWJlQXV0aG9yaXR5V2VpZ2h0KT4AAShyYW5kb21uZXNzBAEoUmFuZG9tbmVzcwABGGNvbmZpZ30IAVhCYWJlRXBvY2hDb25maWd1cmF0aW9uAAC5DgQYT3B0aW9uBARUAb0OAQgQTm9uZQAAABBTb21lBAC9DgAAAQAAvQ4IRHNwX2NvbnNlbnN1c19iYWJlXE9wYXF1ZUtleU93bmVyc2hpcFByb29mAAAEADgBHFZlYzx1OD4AAMEOBBhPcHRpb24EBFQBxQ4BCBBOb25lAAAAEFNvbWUEAMUOAAABAADFDgAAAskOAMkOAAAECDhdCQDNDgxocGFsbGV0X3RyYW5zYWN0aW9uX3BheW1lbnQUdHlwZXNMUnVudGltZURpc3BhdGNoSW5mbwgcQmFsYW5jZQEYGFdlaWdodAEoAAwBGHdlaWdodCgBGFdlaWdodAABFGNsYXNzYAE0RGlzcGF0Y2hDbGFzcwABLHBhcnRpYWxfZmVlGAEcQmFsYW5jZQAA0Q4MaHBhbGxldF90cmFuc2FjdGlvbl9wYXltZW50FHR5cGVzKEZlZURldGFpbHMEHEJhbGFuY2UBGAAIATRpbmNsdXNpb25fZmVl1Q4BdE9wdGlvbjxJbmNsdXNpb25GZWU8QmFsYW5jZT4+AAEMdGlwGAEcQmFsYW5jZQAA1Q4EGE9wdGlvbgQEVAHZDgEIEE5vbmUAAAAQU29tZQQA2Q4AAAEAANkODGhwYWxsZXRfdHJhbnNhY3Rpb25fcGF5bWVudBR0eXBlczBJbmNsdXNpb25GZWUEHEJhbGFuY2UBGAAMASBiYXNlX2ZlZRgBHEJhbGFuY2UAARxsZW5fZmVlGAEcQmFsYW5jZQABTGFkanVzdGVkX3dlaWdodF9mZWUYARxCYWxhbmNlAADdDgQYUmVzdWx0CARUAeEOBEUB5Q4BCAhPawQA4Q4AAAAADEVycgQA5Q4AAAEAAOEOAAACvQYA5Q4MQHhjbV9ydW50aW1lX2FwaXMQZmVlcxRFcnJvcgABGDRVbmltcGxlbWVudGVkAAAAZFZlcnNpb25lZENvbnZlcnNpb25GYWlsZWQAAQBMV2VpZ2h0Tm90Q29tcHV0YWJsZQACAExVbmhhbmRsZWRYY21WZXJzaW9uAAMANEFzc2V0Tm90Rm91bmQABAAoVW5yb3V0YWJsZQAFAADpDgQYUmVzdWx0CARUASgERQHlDgEICE9rBAAoAAAAAAxFcnIEAOUOAAABAADtDgQYUmVzdWx0CARUARgERQHlDgEICE9rBAAYAAAAAAxFcnIEAOUOAAABAADxDgQYUmVzdWx0CARUAYkGBEUB5Q4BCAhPawQAiQYAAAAADEVycgQA5Q4AAAEAAPUOBBhSZXN1bHQIBFQB+Q4ERQERDwEICE9rBAD5DgAAAAAMRXJyBAARDwAAAQAA+Q4MQHhjbV9ydW50aW1lX2FwaXMcZHJ5X3J1bkRDYWxsRHJ5UnVuRWZmZWN0cwQURXZlbnQBVAAQAUBleGVjdXRpb25fcmVzdWx0FQcBaERpc3BhdGNoUmVzdWx0V2l0aFBvc3RJbmZvAAE4ZW1pdHRlZF9ldmVudHP9DgEoVmVjPEV2ZW50PgABJGxvY2FsX3hjbQEPAWBPcHRpb248VmVyc2lvbmVkWGNtPCgpPj4AAThmb3J3YXJkZWRfeGNtcwUPAbxWZWM8KFZlcnNpb25lZExvY2F0aW9uLCBWZWM8VmVyc2lvbmVkWGNtPCgpPj4pPgAA/Q4AAAJUAAEPBBhPcHRpb24EBFQBiQUBCBBOb25lAAAAEFNvbWUEAIkFAAABAAAFDwAAAgkPAAkPAAAECEUBDQ8ADQ8AAAKJBQARDwxAeGNtX3J1bnRpbWVfYXBpcxxkcnlfcnVuFEVycm9yAAEINFVuaW1wbGVtZW50ZWQAAABkVmVyc2lvbmVkQ29udmVyc2lvbkZhaWxlZAABAAAVDwQYUmVzdWx0CARUARkPBEUBEQ8BCAhPawQAGQ8AAAAADEVycgQAEQ8AAAEAABkPDEB4Y21fcnVudGltZV9hcGlzHGRyeV9ydW5AWGNtRHJ5UnVuRWZmZWN0cwQURXZlbnQBVAAMAUBleGVjdXRpb25fcmVzdWx0wQcBHE91dGNvbWUAAThlbWl0dGVkX2V2ZW50c/0OAShWZWM8RXZlbnQ+AAE4Zm9yd2FyZGVkX3hjbXMFDwG8VmVjPChWZXJzaW9uZWRMb2NhdGlvbiwgVmVjPFZlcnNpb25lZFhjbTwoKT4+KT4AAB0PBBhSZXN1bHQIBFQBAARFASEPAQgIT2sEAAAAAAAADEVycgQAIQ8AAAEAACEPDEB4Y21fcnVudGltZV9hcGlzLGNvbnZlcnNpb25zFEVycm9yAAEILFVuc3VwcG9ydGVkAAAAZFZlcnNpb25lZENvbnZlcnNpb25GYWlsZWQAAQAAJQ8EGFJlc3VsdAgEVAGMBEUB4QcBCAhPawQAjAAAAAAMRXJyBADhBwAAAQAAKQ8EGE9wdGlvbgQEVAHhBwEIEE5vbmUAAAAQU29tZQQA4QcAAAEAAC0PAAAC4QcAMQ8INHBhc2VvX3J1bnRpbWUwUnVudGltZUVycm9yAAG0GFN5c3RlbQQAEQgBcGZyYW1lX3N5c3RlbTo6RXJyb3I8UnVudGltZT4AAAAkU2NoZWR1bGVyBAApCAGAcGFsbGV0X3NjaGVkdWxlcjo6RXJyb3I8UnVudGltZT4AAQAgUHJlaW1hZ2UEAE0IAXxwYWxsZXRfcHJlaW1hZ2U6OkVycm9yPFJ1bnRpbWU+AAoAEEJhYmUEAI0IAWxwYWxsZXRfYmFiZTo6RXJyb3I8UnVudGltZT4AAgAcSW5kaWNlcwQAlQgBeHBhbGxldF9pbmRpY2VzOjpFcnJvcjxSdW50aW1lPgAEACBCYWxhbmNlcwQA4QgBfHBhbGxldF9iYWxhbmNlczo6RXJyb3I8UnVudGltZT4ABQAcU3Rha2luZwQAQQkBeHBhbGxldF9zdGFraW5nOjpFcnJvcjxSdW50aW1lPgAHABxTZXNzaW9uBABhCQF4cGFsbGV0X3Nlc3Npb246OkVycm9yPFJ1bnRpbWU+AAkAHEdyYW5kcGEEAHEJAXhwYWxsZXRfZ3JhbmRwYTo6RXJyb3I8UnVudGltZT4ACwAgVHJlYXN1cnkEAJUJAXxwYWxsZXRfdHJlYXN1cnk6OkVycm9yPFJ1bnRpbWU+ABMAQENvbnZpY3Rpb25Wb3RpbmcEAMkJAaBwYWxsZXRfY29udmljdGlvbl92b3Rpbmc6OkVycm9yPFJ1bnRpbWU+ABQAJFJlZmVyZW5kYQQAEQoBgHBhbGxldF9yZWZlcmVuZGE6OkVycm9yPFJ1bnRpbWU+ABUAJFdoaXRlbGlzdAQAFQoBgHBhbGxldF93aGl0ZWxpc3Q6OkVycm9yPFJ1bnRpbWU+ABcAGENsYWltcwQAGQoBWGNsYWltczo6RXJyb3I8UnVudGltZT4AGAAcVmVzdGluZwQAKQoBeHBhbGxldF92ZXN0aW5nOjpFcnJvcjxSdW50aW1lPgAZABxVdGlsaXR5BAAtCgF4cGFsbGV0X3V0aWxpdHk6OkVycm9yPFJ1bnRpbWU+ABoAFFByb3h5BABRCgFwcGFsbGV0X3Byb3h5OjpFcnJvcjxSdW50aW1lPgAdACBNdWx0aXNpZwQAYQoBfHBhbGxldF9tdWx0aXNpZzo6RXJyb3I8UnVudGltZT4AHgAgQm91bnRpZXMEAHEKAXxwYWxsZXRfYm91bnRpZXM6OkVycm9yPFJ1bnRpbWU+ACIANENoaWxkQm91bnRpZXMEAH0KAZRwYWxsZXRfY2hpbGRfYm91bnRpZXM6OkVycm9yPFJ1bnRpbWU+ACYAaEVsZWN0aW9uUHJvdmlkZXJNdWx0aVBoYXNlBAClCgHQcGFsbGV0X2VsZWN0aW9uX3Byb3ZpZGVyX211bHRpX3BoYXNlOjpFcnJvcjxSdW50aW1lPgAkACRWb3Rlckxpc3QEALUKAfRwYWxsZXRfYmFnc19saXN0OjpFcnJvcjxSdW50aW1lLCBwYWxsZXRfYmFnc19saXN0OjpJbnN0YW5jZTE+ACUAPE5vbWluYXRpb25Qb29scwQA/QoBnHBhbGxldF9ub21pbmF0aW9uX3Bvb2xzOjpFcnJvcjxSdW50aW1lPgAnACxGYXN0VW5zdGFrZQQAEQsBjHBhbGxldF9mYXN0X3Vuc3Rha2U6OkVycm9yPFJ1bnRpbWU+ACgANENvbmZpZ3VyYXRpb24EACELAaBwYXJhY2hhaW5zX2NvbmZpZ3VyYXRpb246OkVycm9yPFJ1bnRpbWU+ADMANFBhcmFJbmNsdXNpb24EAEELAZBwYXJhY2hhaW5zX2luY2x1c2lvbjo6RXJyb3I8UnVudGltZT4ANQAwUGFyYUluaGVyZW50BABZCwGkcGFyYWNoYWluc19wYXJhc19pbmhlcmVudDo6RXJyb3I8UnVudGltZT4ANgAUUGFyYXMEALkLAYBwYXJhY2hhaW5zX3BhcmFzOjpFcnJvcjxSdW50aW1lPgA4ABBIcm1wBADpCwF8cGFyYWNoYWluc19ocm1wOjpFcnJvcjxSdW50aW1lPgA8ADRQYXJhc0Rpc3B1dGVzBAAJDAGMcGFyYWNoYWluc19kaXNwdXRlczo6RXJyb3I8UnVudGltZT4APgA0UGFyYXNTbGFzaGluZwQAHQwBjHBhcmFjaGFpbnNfc2xhc2hpbmc6OkVycm9yPFJ1bnRpbWU+AD8AIE9uRGVtYW5kBABNDAG0cGFyYWNoYWluc19hc3NpZ25lcl9vbl9kZW1hbmQ6OkVycm9yPFJ1bnRpbWU+AEAAaENvcmV0aW1lQXNzaWdubWVudFByb3ZpZGVyBAB5DAGwcGFyYWNoYWluc19hc3NpZ25lcl9jb3JldGltZTo6RXJyb3I8UnVudGltZT4AQQAkUmVnaXN0cmFyBACBDAF8cGFyYXNfcmVnaXN0cmFyOjpFcnJvcjxSdW50aW1lPgBGABRTbG90cwQAiQwBVHNsb3RzOjpFcnJvcjxSdW50aW1lPgBHACBBdWN0aW9ucwQAnQwBYGF1Y3Rpb25zOjpFcnJvcjxSdW50aW1lPgBIACRDcm93ZGxvYW4EAKkMAWRjcm93ZGxvYW46OkVycm9yPFJ1bnRpbWU+AEkAIENvcmV0aW1lBACtDAFgY29yZXRpbWU6OkVycm9yPFJ1bnRpbWU+AEoASFN0YXRlVHJpZU1pZ3JhdGlvbgQAuQcBrHBhbGxldF9zdGF0ZV90cmllX21pZ3JhdGlvbjo6RXJyb3I8UnVudGltZT4AYgAkWGNtUGFsbGV0BAABDQFocGFsbGV0X3hjbTo6RXJyb3I8UnVudGltZT4AYwAwTWVzc2FnZVF1ZXVlBAAdDQGQcGFsbGV0X21lc3NhZ2VfcXVldWU6OkVycm9yPFJ1bnRpbWU+AGQAJEFzc2V0UmF0ZQQAIQ0BhHBhbGxldF9hc3NldF9yYXRlOjpFcnJvcjxSdW50aW1lPgBlABRCZWVmeQQALQ0BcHBhbGxldF9iZWVmeTo6RXJyb3I8UnVudGltZT4AyAA8UGFyYVN1ZG9XcmFwcGVyBAA1DQGIcGFyYXNfc3Vkb193cmFwcGVyOjpFcnJvcjxSdW50aW1lPgD6ABBTdWRvBAA5DQFscGFsbGV0X3N1ZG86OkVycm9yPFJ1bnRpbWU+AP8AAPQYU3lzdGVtARhTeXN0ZW1IHEFjY291bnQBAQQCAAxBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACABOggVGhlIGZ1bGwgYWNjb3VudCBpbmZvcm1hdGlvbiBmb3IgYSBwYXJ0aWN1bGFyIGFjY291bnQgSUQuOEV4dHJpbnNpY0NvdW50AAAQBAAEuCBUb3RhbCBleHRyaW5zaWNzIGNvdW50IGZvciB0aGUgY3VycmVudCBibG9jay5ASW5oZXJlbnRzQXBwbGllZAEAIAQABKQgV2hldGhlciBhbGwgaW5oZXJlbnRzIGhhdmUgYmVlbiBhcHBsaWVkLixCbG9ja1dlaWdodAEAJBgAAAAAAAAEiCBUaGUgY3VycmVudCB3ZWlnaHQgZm9yIHRoZSBibG9jay5AQWxsRXh0cmluc2ljc0xlbgAAEAQABEEBIFRvdGFsIGxlbmd0aCAoaW4gYnl0ZXMpIGZvciBhbGwgZXh0cmluc2ljcyBwdXQgdG9nZXRoZXIsIGZvciB0aGUgY3VycmVudCBibG9jay4kQmxvY2tIYXNoAQEEBRA0gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABJggTWFwIG9mIGJsb2NrIG51bWJlcnMgdG8gYmxvY2sgaGFzaGVzLjRFeHRyaW5zaWNEYXRhAQEEBRA4BAAEPQEgRXh0cmluc2ljcyBkYXRhIGZvciB0aGUgY3VycmVudCBibG9jayAobWFwcyBhbiBleHRyaW5zaWMncyBpbmRleCB0byBpdHMgZGF0YSkuGE51bWJlcgEAEBAAAAAABAkBIFRoZSBjdXJyZW50IGJsb2NrIG51bWJlciBiZWluZyBwcm9jZXNzZWQuIFNldCBieSBgZXhlY3V0ZV9ibG9ja2AuKFBhcmVudEhhc2gBADSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEcCBIYXNoIG9mIHRoZSBwcmV2aW91cyBibG9jay4YRGlnZXN0AQA8BAAE8CBEaWdlc3Qgb2YgdGhlIGN1cnJlbnQgYmxvY2ssIGFsc28gcGFydCBvZiB0aGUgYmxvY2sgaGVhZGVyLhhFdmVudHMBAEwEABygIEV2ZW50cyBkZXBvc2l0ZWQgZm9yIHRoZSBjdXJyZW50IGJsb2NrLgAdASBOT1RFOiBUaGUgaXRlbSBpcyB1bmJvdW5kIGFuZCBzaG91bGQgdGhlcmVmb3JlIG5ldmVyIGJlIHJlYWQgb24gY2hhaW4u0CBJdCBjb3VsZCBvdGhlcndpc2UgaW5mbGF0ZSB0aGUgUG9WIHNpemUgb2YgYSBibG9jay4ALQEgRXZlbnRzIGhhdmUgYSBsYXJnZSBpbi1tZW1vcnkgc2l6ZS4gQm94IHRoZSBldmVudHMgdG8gbm90IGdvIG91dC1vZi1tZW1vcnn8IGp1c3QgaW4gY2FzZSBzb21lb25lIHN0aWxsIHJlYWRzIHRoZW0gZnJvbSB3aXRoaW4gdGhlIHJ1bnRpbWUuKEV2ZW50Q291bnQBABAQAAAAAAS4IFRoZSBudW1iZXIgb2YgZXZlbnRzIGluIHRoZSBgRXZlbnRzPFQ+YCBsaXN0LixFdmVudFRvcGljcwEBBAI02QcEACglASBNYXBwaW5nIGJldHdlZW4gYSB0b3BpYyAocmVwcmVzZW50ZWQgYnkgVDo6SGFzaCkgYW5kIGEgdmVjdG9yIG9mIGluZGV4ZXOUIG9mIGV2ZW50cyBpbiB0aGUgYDxFdmVudHM8VD4+YCBsaXN0LgBRASBBbGwgdG9waWMgdmVjdG9ycyBoYXZlIGRldGVybWluaXN0aWMgc3RvcmFnZSBsb2NhdGlvbnMgZGVwZW5kaW5nIG9uIHRoZSB0b3BpYy4gVGhpc0UBIGFsbG93cyBsaWdodC1jbGllbnRzIHRvIGxldmVyYWdlIHRoZSBjaGFuZ2VzIHRyaWUgc3RvcmFnZSB0cmFja2luZyBtZWNoYW5pc20gYW5k5CBpbiBjYXNlIG9mIGNoYW5nZXMgZmV0Y2ggdGhlIGxpc3Qgb2YgZXZlbnRzIG9mIGludGVyZXN0LgBZASBUaGUgdmFsdWUgaGFzIHRoZSB0eXBlIGAoQmxvY2tOdW1iZXJGb3I8VD4sIEV2ZW50SW5kZXgpYCBiZWNhdXNlIGlmIHdlIHVzZWQgb25seSBqdXN0TQEgdGhlIGBFdmVudEluZGV4YCB0aGVuIGluIGNhc2UgaWYgdGhlIHRvcGljIGhhcyB0aGUgc2FtZSBjb250ZW50cyBvbiB0aGUgbmV4dCBibG9jawEBIG5vIG5vdGlmaWNhdGlvbiB3aWxsIGJlIHRyaWdnZXJlZCB0aHVzIHRoZSBldmVudCBtaWdodCBiZSBsb3N0LkhMYXN0UnVudGltZVVwZ3JhZGUAAN0HBAAEVQEgU3RvcmVzIHRoZSBgc3BlY192ZXJzaW9uYCBhbmQgYHNwZWNfbmFtZWAgb2Ygd2hlbiB0aGUgbGFzdCBydW50aW1lIHVwZ3JhZGUgaGFwcGVuZWQuVFVwZ3JhZGVkVG9VMzJSZWZDb3VudAEAIAQABE0BIFRydWUgaWYgd2UgaGF2ZSB1cGdyYWRlZCBzbyB0aGF0IGB0eXBlIFJlZkNvdW50YCBpcyBgdTMyYC4gRmFsc2UgKGRlZmF1bHQpIGlmIG5vdC5gVXBncmFkZWRUb1RyaXBsZVJlZkNvdW50AQAgBAAIXQEgVHJ1ZSBpZiB3ZSBoYXZlIHVwZ3JhZGVkIHNvIHRoYXQgQWNjb3VudEluZm8gY29udGFpbnMgdGhyZWUgdHlwZXMgb2YgYFJlZkNvdW50YC4gRmFsc2VIIChkZWZhdWx0KSBpZiBub3QuOEV4ZWN1dGlvblBoYXNlAADVBwQABIggVGhlIGV4ZWN1dGlvbiBwaGFzZSBvZiB0aGUgYmxvY2suREF1dGhvcml6ZWRVcGdyYWRlAADlBwQABLggYFNvbWVgIGlmIGEgY29kZSB1cGdyYWRlIGhhcyBiZWVuIGF1dGhvcml6ZWQuAXkBAVgYMEJsb2NrV2VpZ2h0c+kHAQIHsL3pNgMACwAgSqnRARP//////////yItDR4AAQu4hFyPWAETo3A9CtejcL0BCwCY9z5dARP/////////vwEAACItDR4AAQu4DK/5zAETo3A9CtejcP0BCwAgSqnRARP//////////wEHAIhSanQTAAAAAAAAAEAiLQ0eAAAAAATQIEJsb2NrICYgZXh0cmluc2ljcyB3ZWlnaHRzOiBiYXNlIHZhbHVlcyBhbmQgbGltaXRzLixCbG9ja0xlbmd0aPUHMAAAPAAAAFAAAABQAASoIFRoZSBtYXhpbXVtIGxlbmd0aCBvZiBhIGJsb2NrIChpbiBieXRlcykuOEJsb2NrSGFzaENvdW50EBAAEAAABFUBIE1heGltdW0gbnVtYmVyIG9mIGJsb2NrIG51bWJlciB0byBibG9jayBoYXNoIG1hcHBpbmdzIHRvIGtlZXAgKG9sZGVzdCBwcnVuZWQgZmlyc3QpLiBEYldlaWdodP0HQDjKOAEAAAAAmKr5BAAAAAAECQEgVGhlIHdlaWdodCBvZiBydW50aW1lIGRhdGFiYXNlIG9wZXJhdGlvbnMgdGhlIHJ1bnRpbWUgY2FuIGludm9rZS4cVmVyc2lvbgEI6QQUcGFzZW80cGFzZW8tdGVzdG5ldAAAAAD8TQ8AAAAAAFzFH/H6P10MygEAAADfastomQdgmwUAAAA345f8fJH15AIAAABA/jrUAfiVmgYAAAAXprwNAGKuswEAAAAY71ijtnuncAEAAADSvJiX7tCPFQMAAAD3iyeL5T9FTAIAAACvLAKXoj5tPQsAAABJ6q8bVIoMsAMAAACR1d8YsNLPWAIAAAAqXpJGVTmeYAEAAADtmcWssl7t9QMAAADLyiXjnxQjhwIAAABoetRK038DwgEAAACrPAVyKR/riwEAAAC8nYmQT1uSPwEAAAA3yLsTUKmiqAQAAADz/xTVq1JwWQMAAABv9S7oWObFvQEAAACRscixYyjrkgEAAACf+1BapzjWnAEAAAD7xXe510fv1gEAAAAaAAAAAQSEIEdldCB0aGUgY2hhaW4ncyBpbi1jb2RlIHZlcnNpb24uKFNTNThQcmVmaXhtAQgAABSoIFRoZSBkZXNpZ25hdGVkIFNTNTggcHJlZml4IG9mIHRoaXMgY2hhaW4uADkBIFRoaXMgcmVwbGFjZXMgdGhlICJzczU4Rm9ybWF0IiBwcm9wZXJ0eSBkZWNsYXJlZCBpbiB0aGUgY2hhaW4gc3BlYy4gUmVhc29uIGlzMQEgdGhhdCB0aGUgcnVudGltZSBzaG91bGQga25vdyBhYm91dCB0aGUgcHJlZml4IGluIG9yZGVyIHRvIG1ha2UgdXNlIG9mIGl0IGFzcCBhbiBpZGVudGlmaWVyIG9mIHRoZSBjaGFpbi4BEQgAACRTY2hlZHVsZXIBJFNjaGVkdWxlchA8SW5jb21wbGV0ZVNpbmNlAAAQBAAAGEFnZW5kYQEBBAUQFQgEAARNASBJdGVtcyB0byBiZSBleGVjdXRlZCwgaW5kZXhlZCBieSB0aGUgYmxvY2sgbnVtYmVyIHRoYXQgdGhleSBzaG91bGQgYmUgZXhlY3V0ZWQgb24uHFJldHJpZXMAAQQCgCUIBAAEIQEgUmV0cnkgY29uZmlndXJhdGlvbnMgZm9yIGl0ZW1zIHRvIGJlIGV4ZWN1dGVkLCBpbmRleGVkIGJ5IHRhc2sgYWRkcmVzcy4YTG9va3VwAAEEBQSABAAQ+CBMb29rdXAgZnJvbSBhIG5hbWUgdG8gdGhlIGJsb2NrIG51bWJlciBhbmQgaW5kZXggb2YgdGhlIHRhc2suAFkBIEZvciB2MyAtPiB2NCB0aGUgcHJldmlvdXNseSB1bmJvdW5kZWQgaWRlbnRpdGllcyBhcmUgQmxha2UyLTI1NiBoYXNoZWQgdG8gZm9ybSB0aGUgdjQwIGlkZW50aXRpZXMuAYkBAXwINE1heGltdW1XZWlnaHQoQAsAgG6HdAETzMzMzMzMzMwEKQEgVGhlIG1heGltdW0gd2VpZ2h0IHRoYXQgbWF5IGJlIHNjaGVkdWxlZCBwZXIgYmxvY2sgZm9yIGFueSBkaXNwYXRjaGFibGVzLlBNYXhTY2hlZHVsZWRQZXJCbG9jaxAQMgAAABQdASBUaGUgbWF4aW11bSBudW1iZXIgb2Ygc2NoZWR1bGVkIGNhbGxzIGluIHRoZSBxdWV1ZSBmb3IgYSBzaW5nbGUgYmxvY2suABggTk9URTpRASArIERlcGVuZGVudCBwYWxsZXRzJyBiZW5jaG1hcmtzIG1pZ2h0IHJlcXVpcmUgYSBoaWdoZXIgbGltaXQgZm9yIHRoZSBzZXR0aW5nLiBTZXQgYcQgaGlnaGVyIGxpbWl0IHVuZGVyIGBydW50aW1lLWJlbmNobWFya3NgIGZlYXR1cmUuASkIAQAgUHJlaW1hZ2UBIFByZWltYWdlDCRTdGF0dXNGb3IAAQQGNC0IBAAEkCBUaGUgcmVxdWVzdCBzdGF0dXMgb2YgYSBnaXZlbiBoYXNoLkBSZXF1ZXN0U3RhdHVzRm9yAAEEBjQ1CAQABJAgVGhlIHJlcXVlc3Qgc3RhdHVzIG9mIGEgZ2l2ZW4gaGFzaC4sUHJlaW1hZ2VGb3IAAQQGRQhJCAQAAAGRAQGQAAFNCAoAEEJhYmUBEEJhYmVEKEVwb2NoSW5kZXgBADAgAAAAAAAAAAAEVCBDdXJyZW50IGVwb2NoIGluZGV4LixBdXRob3JpdGllcwEAUQgEAARsIEN1cnJlbnQgZXBvY2ggYXV0aG9yaXRpZXMuLEdlbmVzaXNTbG90AQCpASAAAAAAAAAAAAj4IFRoZSBzbG90IGF0IHdoaWNoIHRoZSBmaXJzdCBlcG9jaCBhY3R1YWxseSBzdGFydGVkLiBUaGlzIGlzIDCQIHVudGlsIHRoZSBmaXJzdCBibG9jayBvZiB0aGUgY2hhaW4uLEN1cnJlbnRTbG90AQCpASAAAAAAAAAAAARUIEN1cnJlbnQgc2xvdCBudW1iZXIuKFJhbmRvbW5lc3MBAASAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAouCBUaGUgZXBvY2ggcmFuZG9tbmVzcyBmb3IgdGhlICpjdXJyZW50KiBlcG9jaC4ALCAjIFNlY3VyaXR5AAUBIFRoaXMgTVVTVCBOT1QgYmUgdXNlZCBmb3IgZ2FtYmxpbmcsIGFzIGl0IGNhbiBiZSBpbmZsdWVuY2VkIGJ5IGH4IG1hbGljaW91cyB2YWxpZGF0b3IgaW4gdGhlIHNob3J0IHRlcm0uIEl0IE1BWSBiZSB1c2VkIGluIG1hbnkVASBjcnlwdG9ncmFwaGljIHByb3RvY29scywgaG93ZXZlciwgc28gbG9uZyBhcyBvbmUgcmVtZW1iZXJzIHRoYXQgdGhpcxUBIChsaWtlIGV2ZXJ5dGhpbmcgZWxzZSBvbi1jaGFpbikgaXQgaXMgcHVibGljLiBGb3IgZXhhbXBsZSwgaXQgY2FuIGJlBQEgdXNlZCB3aGVyZSBhIG51bWJlciBpcyBuZWVkZWQgdGhhdCBjYW5ub3QgaGF2ZSBiZWVuIGNob3NlbiBieSBhbg0BIGFkdmVyc2FyeSwgZm9yIHB1cnBvc2VzIHN1Y2ggYXMgcHVibGljLWNvaW4gemVyby1rbm93bGVkZ2UgcHJvb2ZzLmBQZW5kaW5nRXBvY2hDb25maWdDaGFuZ2UAALEBBAAEYQEgUGVuZGluZyBlcG9jaCBjb25maWd1cmF0aW9uIGNoYW5nZSB0aGF0IHdpbGwgYmUgYXBwbGllZCB3aGVuIHRoZSBuZXh0IGVwb2NoIGlzIGVuYWN0ZWQuOE5leHRSYW5kb21uZXNzAQAEgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFwgTmV4dCBlcG9jaCByYW5kb21uZXNzLjxOZXh0QXV0aG9yaXRpZXMBAFEIBAAEYCBOZXh0IGVwb2NoIGF1dGhvcml0aWVzLjBTZWdtZW50SW5kZXgBABAQAAAAACR8IFJhbmRvbW5lc3MgdW5kZXIgY29uc3RydWN0aW9uLgD4IFdlIG1ha2UgYSB0cmFkZS1vZmYgYmV0d2VlbiBzdG9yYWdlIGFjY2Vzc2VzIGFuZCBsaXN0IGxlbmd0aC4BASBXZSBzdG9yZSB0aGUgdW5kZXItY29uc3RydWN0aW9uIHJhbmRvbW5lc3MgaW4gc2VnbWVudHMgb2YgdXAgdG+UIGBVTkRFUl9DT05TVFJVQ1RJT05fU0VHTUVOVF9MRU5HVEhgLgDsIE9uY2UgYSBzZWdtZW50IHJlYWNoZXMgdGhpcyBsZW5ndGgsIHdlIGJlZ2luIHRoZSBuZXh0IG9uZS4JASBXZSByZXNldCBhbGwgc2VnbWVudHMgYW5kIHJldHVybiB0byBgMGAgYXQgdGhlIGJlZ2lubmluZyBvZiBldmVyeRwgZXBvY2guRFVuZGVyQ29uc3RydWN0aW9uAQEEBRBdCAQABBUBIFRXT1gtTk9URTogYFNlZ21lbnRJbmRleGAgaXMgYW4gaW5jcmVhc2luZyBpbnRlZ2VyLCBzbyB0aGlzIGlzIG9rYXkuLEluaXRpYWxpemVkAABlCAQACAEBIFRlbXBvcmFyeSB2YWx1ZSAoY2xlYXJlZCBhdCBibG9jayBmaW5hbGl6YXRpb24pIHdoaWNoIGlzIGBTb21lYB0BIGlmIHBlci1ibG9jayBpbml0aWFsaXphdGlvbiBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZCBmb3IgY3VycmVudCBibG9jay5MQXV0aG9yVnJmUmFuZG9tbmVzcwEAhAQAEBUBIFRoaXMgZmllbGQgc2hvdWxkIGFsd2F5cyBiZSBwb3B1bGF0ZWQgZHVyaW5nIGJsb2NrIHByb2Nlc3NpbmcgdW5sZXNzGQEgc2Vjb25kYXJ5IHBsYWluIHNsb3RzIGFyZSBlbmFibGVkICh3aGljaCBkb24ndCBjb250YWluIGEgVlJGIG91dHB1dCkuAEkBIEl0IGlzIHNldCBpbiBgb25fZmluYWxpemVgLCBiZWZvcmUgaXQgd2lsbCBjb250YWluIHRoZSB2YWx1ZSBmcm9tIHRoZSBsYXN0IGJsb2NrLihFcG9jaFN0YXJ0AQCAIAAAAAAAAAAAFF0BIFRoZSBibG9jayBudW1iZXJzIHdoZW4gdGhlIGxhc3QgYW5kIGN1cnJlbnQgZXBvY2ggaGF2ZSBzdGFydGVkLCByZXNwZWN0aXZlbHkgYE4tMWAgYW5kFCBgTmAuSQEgTk9URTogV2UgdHJhY2sgdGhpcyBpcyBpbiBvcmRlciB0byBhbm5vdGF0ZSB0aGUgYmxvY2sgbnVtYmVyIHdoZW4gYSBnaXZlbiBwb29sIG9mWQEgZW50cm9weSB3YXMgZml4ZWQgKGkuZS4gaXQgd2FzIGtub3duIHRvIGNoYWluIG9ic2VydmVycykuIFNpbmNlIGVwb2NocyBhcmUgZGVmaW5lZCBpblkBIHNsb3RzLCB3aGljaCBtYXkgYmUgc2tpcHBlZCwgdGhlIGJsb2NrIG51bWJlcnMgbWF5IG5vdCBsaW5lIHVwIHdpdGggdGhlIHNsb3QgbnVtYmVycy4gTGF0ZW5lc3MBABAQAAAAABTYIEhvdyBsYXRlIHRoZSBjdXJyZW50IGJsb2NrIGlzIGNvbXBhcmVkIHRvIGl0cyBwYXJlbnQuABUBIFRoaXMgZW50cnkgaXMgcG9wdWxhdGVkIGFzIHBhcnQgb2YgYmxvY2sgZXhlY3V0aW9uIGFuZCBpcyBjbGVhbmVkIHVwEQEgb24gYmxvY2sgZmluYWxpemF0aW9uLiBRdWVyeWluZyB0aGlzIHN0b3JhZ2UgZW50cnkgb3V0c2lkZSBvZiBibG9ja7AgZXhlY3V0aW9uIGNvbnRleHQgc2hvdWxkIGFsd2F5cyB5aWVsZCB6ZXJvLixFcG9jaENvbmZpZwAAfQgEAAhhASBUaGUgY29uZmlndXJhdGlvbiBmb3IgdGhlIGN1cnJlbnQgZXBvY2guIFNob3VsZCBuZXZlciBiZSBgTm9uZWAgYXMgaXQgaXMgaW5pdGlhbGl6ZWQgaW4kIGdlbmVzaXMuPE5leHRFcG9jaENvbmZpZwAAfQgEAAgtASBUaGUgY29uZmlndXJhdGlvbiBmb3IgdGhlIG5leHQgZXBvY2gsIGBOb25lYCBpZiB0aGUgY29uZmlnIHdpbGwgbm90IGNoYW5nZeggKHlvdSBjYW4gZmFsbGJhY2sgdG8gYEVwb2NoQ29uZmlnYCBpbnN0ZWFkIGluIHRoYXQgY2FzZSkuNFNraXBwZWRFcG9jaHMBAIEIBAAgKQEgQSBsaXN0IG9mIHRoZSBsYXN0IDEwMCBza2lwcGVkIGVwb2NocyBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgc2Vzc2lvbiBpbmRleHAgd2hlbiB0aGUgZXBvY2ggd2FzIHNraXBwZWQuADEBIFRoaXMgaXMgb25seSB1c2VkIGZvciB2YWxpZGF0aW5nIGVxdWl2b2NhdGlvbiBwcm9vZnMuIEFuIGVxdWl2b2NhdGlvbiBwcm9vZjUBIG11c3QgY29udGFpbnMgYSBrZXktb3duZXJzaGlwIHByb29mIGZvciBhIGdpdmVuIHNlc3Npb24sIHRoZXJlZm9yZSB3ZSBuZWVkIGE5ASB3YXkgdG8gdGllIHRvZ2V0aGVyIHNlc3Npb25zIGFuZCBlcG9jaCBpbmRpY2VzLCBpLmUuIHdlIG5lZWQgdG8gdmFsaWRhdGUgdGhhdCkBIGEgdmFsaWRhdG9yIHdhcyB0aGUgb3duZXIgb2YgYSBnaXZlbiBrZXkgb24gYSBnaXZlbiBzZXNzaW9uLCBhbmQgd2hhdCB0aGWwIGFjdGl2ZSBlcG9jaCBpbmRleCB3YXMgZHVyaW5nIHRoYXQgc2Vzc2lvbi4BmQEAEDRFcG9jaER1cmF0aW9uMCBYAgAAAAAAAAzsIFRoZSBhbW91bnQgb2YgdGltZSwgaW4gc2xvdHMsIHRoYXQgZWFjaCBlcG9jaCBzaG91bGQgbGFzdC4ZASBOT1RFOiBDdXJyZW50bHkgaXQgaXMgbm90IHBvc3NpYmxlIHRvIGNoYW5nZSB0aGUgZXBvY2ggZHVyYXRpb24gYWZ0ZXIhASB0aGUgY2hhaW4gaGFzIHN0YXJ0ZWQuIEF0dGVtcHRpbmcgdG8gZG8gc28gd2lsbCBicmljayBibG9jayBwcm9kdWN0aW9uLkRFeHBlY3RlZEJsb2NrVGltZTAgcBcAAAAAAAAUBQEgVGhlIGV4cGVjdGVkIGF2ZXJhZ2UgYmxvY2sgdGltZSBhdCB3aGljaCBCQUJFIHNob3VsZCBiZSBjcmVhdGluZxEBIGJsb2Nrcy4gU2luY2UgQkFCRSBpcyBwcm9iYWJpbGlzdGljIGl0IGlzIG5vdCB0cml2aWFsIHRvIGZpZ3VyZSBvdXQFASB3aGF0IHRoZSBleHBlY3RlZCBhdmVyYWdlIGJsb2NrIHRpbWUgc2hvdWxkIGJlIGJhc2VkIG9uIHRoZSBzbG90CQEgZHVyYXRpb24gYW5kIHRoZSBzZWN1cml0eSBwYXJhbWV0ZXIgYGNgICh3aGVyZSBgMSAtIGNgIHJlcHJlc2VudHOgIHRoZSBwcm9iYWJpbGl0eSBvZiBhIHNsb3QgYmVpbmcgZW1wdHkpLjhNYXhBdXRob3JpdGllcxAQoIYBAASIIE1heCBudW1iZXIgb2YgYXV0aG9yaXRpZXMgYWxsb3dlZDRNYXhOb21pbmF0b3JzEBAAAgAABNQgVGhlIG1heGltdW0gbnVtYmVyIG9mIG5vbWluYXRvcnMgZm9yIGVhY2ggdmFsaWRhdG9yLgGNCAIAJFRpbWVzdGFtcAEkVGltZXN0YW1wCAxOb3cBADAgAAAAAAAAAAAEoCBUaGUgY3VycmVudCB0aW1lIGZvciB0aGUgY3VycmVudCBibG9jay4kRGlkVXBkYXRlAQAgBAAQ2CBXaGV0aGVyIHRoZSB0aW1lc3RhbXAgaGFzIGJlZW4gdXBkYXRlZCBpbiB0aGlzIGJsb2NrLgBVASBUaGlzIHZhbHVlIGlzIHVwZGF0ZWQgdG8gYHRydWVgIHVwb24gc3VjY2Vzc2Z1bCBzdWJtaXNzaW9uIG9mIGEgdGltZXN0YW1wIGJ5IGEgbm9kZS5FASBJdCBpcyB0aGVuIGNoZWNrZWQgYXQgdGhlIGVuZCBvZiBlYWNoIGJsb2NrIGV4ZWN1dGlvbiBpbiB0aGUgYG9uX2ZpbmFsaXplYCBob29rLgG9AQAENE1pbmltdW1QZXJpb2QwILgLAAAAAAAAGIwgVGhlIG1pbmltdW0gcGVyaW9kIGJldHdlZW4gYmxvY2tzLgBNASBCZSBhd2FyZSB0aGF0IHRoaXMgaXMgZGlmZmVyZW50IHRvIHRoZSAqZXhwZWN0ZWQqIHBlcmlvZCB0aGF0IHRoZSBibG9jayBwcm9kdWN0aW9uSQEgYXBwYXJhdHVzIHByb3ZpZGVzLiBZb3VyIGNob3NlbiBjb25zZW5zdXMgc3lzdGVtIHdpbGwgZ2VuZXJhbGx5IHdvcmsgd2l0aCB0aGlzIHRvYQEgZGV0ZXJtaW5lIGEgc2Vuc2libGUgYmxvY2sgdGltZS4gRm9yIGV4YW1wbGUsIGluIHRoZSBBdXJhIHBhbGxldCBpdCB3aWxsIGJlIGRvdWJsZSB0aGlzcCBwZXJpb2Qgb24gZGVmYXVsdCBzZXR0aW5ncy4AAwAcSW5kaWNlcwEcSW5kaWNlcwQgQWNjb3VudHMAAQQCEJEIBAAEiCBUaGUgbG9va3VwIGZyb20gaW5kZXggdG8gYWNjb3VudC4BwQEBlAQcRGVwb3NpdBhAAOh2SBcAAAAAAAAAAAAAAASsIFRoZSBkZXBvc2l0IG5lZWRlZCBmb3IgcmVzZXJ2aW5nIGFuIGluZGV4LgGVCAQAIEJhbGFuY2VzASBCYWxhbmNlcxw0VG90YWxJc3N1YW5jZQEAGEAAAAAAAAAAAAAAAAAAAAAABJggVGhlIHRvdGFsIHVuaXRzIGlzc3VlZCBpbiB0aGUgc3lzdGVtLkBJbmFjdGl2ZUlzc3VhbmNlAQAYQAAAAAAAAAAAAAAAAAAAAAAECQEgVGhlIHRvdGFsIHVuaXRzIG9mIG91dHN0YW5kaW5nIGRlYWN0aXZhdGVkIGJhbGFuY2UgaW4gdGhlIHN5c3RlbS4cQWNjb3VudAEBBAIAFAEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgGAJASBUaGUgQmFsYW5jZXMgcGFsbGV0IGV4YW1wbGUgb2Ygc3RvcmluZyB0aGUgYmFsYW5jZSBvZiBhbiBhY2NvdW50LgAoICMgRXhhbXBsZQA0IGBgYG5vY29tcGlsZbAgIGltcGwgcGFsbGV0X2JhbGFuY2VzOjpDb25maWcgZm9yIFJ1bnRpbWUgexkCICAgIHR5cGUgQWNjb3VudFN0b3JlID0gU3RvcmFnZU1hcFNoaW08U2VsZjo6QWNjb3VudDxSdW50aW1lPiwgZnJhbWVfc3lzdGVtOjpQcm92aWRlcjxSdW50aW1lPiwgQWNjb3VudElkLCBTZWxmOjpBY2NvdW50RGF0YTxCYWxhbmNlPj4MICB9ECBgYGAAFQEgWW91IGNhbiBhbHNvIHN0b3JlIHRoZSBiYWxhbmNlIG9mIGFuIGFjY291bnQgaW4gdGhlIGBTeXN0ZW1gIHBhbGxldC4AKCAjIEV4YW1wbGUANCBgYGBub2NvbXBpbGWwICBpbXBsIHBhbGxldF9iYWxhbmNlczo6Q29uZmlnIGZvciBSdW50aW1lIHt0ICAgdHlwZSBBY2NvdW50U3RvcmUgPSBTeXN0ZW0MICB9ECBgYGAAUQEgQnV0IHRoaXMgY29tZXMgd2l0aCB0cmFkZW9mZnMsIHN0b3JpbmcgYWNjb3VudCBiYWxhbmNlcyBpbiB0aGUgc3lzdGVtIHBhbGxldCBzdG9yZXNtASBgZnJhbWVfc3lzdGVtYCBkYXRhIGFsb25nc2lkZSB0aGUgYWNjb3VudCBkYXRhIGNvbnRyYXJ5IHRvIHN0b3JpbmcgYWNjb3VudCBiYWxhbmNlcyBpbiB0aGUpASBgQmFsYW5jZXNgIHBhbGxldCwgd2hpY2ggdXNlcyBhIGBTdG9yYWdlTWFwYCB0byBzdG9yZSBiYWxhbmNlcyBkYXRhIG9ubHkuQQEgTk9URTogVGhpcyBpcyBvbmx5IHVzZWQgaW4gdGhlIGNhc2UgdGhhdCB0aGlzIHBhbGxldCBpcyB1c2VkIHRvIHN0b3JlIGJhbGFuY2VzLhRMb2NrcwEBBAIAmQgEABC4IEFueSBsaXF1aWRpdHkgbG9ja3Mgb24gc29tZSBhY2NvdW50IGJhbGFuY2VzLiUBIE5PVEU6IFNob3VsZCBvbmx5IGJlIGFjY2Vzc2VkIHdoZW4gc2V0dGluZywgY2hhbmdpbmcgYW5kIGZyZWVpbmcgYSBsb2NrLgCtASBVc2Ugb2YgbG9ja3MgaXMgZGVwcmVjYXRlZCBpbiBmYXZvdXIgb2YgZnJlZXplcy4gU2VlIGBodHRwczovL2dpdGh1Yi5jb20vcGFyaXR5dGVjaC9zdWJzdHJhdGUvcHVsbC8xMjk1MS9gIFJlc2VydmVzAQEEAgCpCAQADKQgTmFtZWQgcmVzZXJ2ZXMgb24gc29tZSBhY2NvdW50IGJhbGFuY2VzLgCxASBVc2Ugb2YgcmVzZXJ2ZXMgaXMgZGVwcmVjYXRlZCBpbiBmYXZvdXIgb2YgaG9sZHMuIFNlZSBgaHR0cHM6Ly9naXRodWIuY29tL3Bhcml0eXRlY2gvc3Vic3RyYXRlL3B1bGwvMTI5NTEvYBRIb2xkcwEBBAIAtQgEAARsIEhvbGRzIG9uIGFjY291bnQgYmFsYW5jZXMuHEZyZWV6ZXMBAQQCAM0IBAAEiCBGcmVlemUgbG9ja3Mgb24gYWNjb3VudCBiYWxhbmNlcy4BzQEBmBBIRXhpc3RlbnRpYWxEZXBvc2l0GEAA5AtUAgAAAAAAAAAAAAAAIEEBIFRoZSBtaW5pbXVtIGFtb3VudCByZXF1aXJlZCB0byBrZWVwIGFuIGFjY291bnQgb3Blbi4gTVVTVCBCRSBHUkVBVEVSIFRIQU4gWkVSTyEAWQEgSWYgeW91ICpyZWFsbHkqIG5lZWQgaXQgdG8gYmUgemVybywgeW91IGNhbiBlbmFibGUgdGhlIGZlYXR1cmUgYGluc2VjdXJlX3plcm9fZWRgIGZvcmEBIHRoaXMgcGFsbGV0LiBIb3dldmVyLCB5b3UgZG8gc28gYXQgeW91ciBvd24gcmlzazogdGhpcyB3aWxsIG9wZW4gdXAgYSBtYWpvciBEb1MgdmVjdG9yLlkBIEluIGNhc2UgeW91IGhhdmUgbXVsdGlwbGUgc291cmNlcyBvZiBwcm92aWRlciByZWZlcmVuY2VzLCB5b3UgbWF5IGFsc28gZ2V0IHVuZXhwZWN0ZWSMIGJlaGF2aW91ciBpZiB5b3Ugc2V0IHRoaXMgdG8gemVyby4A8CBCb3R0b20gbGluZTogRG8geW91cnNlbGYgYSBmYXZvdXIgYW5kIG1ha2UgaXQgYXQgbGVhc3Qgb25lISBNYXhMb2NrcxAQMgAAABD0IFRoZSBtYXhpbXVtIG51bWJlciBvZiBsb2NrcyB0aGF0IHNob3VsZCBleGlzdCBvbiBhbiBhY2NvdW50LtwgTm90IHN0cmljdGx5IGVuZm9yY2VkLCBidXQgdXNlZCBmb3Igd2VpZ2h0IGVzdGltYXRpb24uAK0BIFVzZSBvZiBsb2NrcyBpcyBkZXByZWNhdGVkIGluIGZhdm91ciBvZiBmcmVlemVzLiBTZWUgYGh0dHBzOi8vZ2l0aHViLmNvbS9wYXJpdHl0ZWNoL3N1YnN0cmF0ZS9wdWxsLzEyOTUxL2AsTWF4UmVzZXJ2ZXMQEDIAAAAMDQEgVGhlIG1heGltdW0gbnVtYmVyIG9mIG5hbWVkIHJlc2VydmVzIHRoYXQgY2FuIGV4aXN0IG9uIGFuIGFjY291bnQuALEBIFVzZSBvZiByZXNlcnZlcyBpcyBkZXByZWNhdGVkIGluIGZhdm91ciBvZiBob2xkcy4gU2VlIGBodHRwczovL2dpdGh1Yi5jb20vcGFyaXR5dGVjaC9zdWJzdHJhdGUvcHVsbC8xMjk1MS9gKE1heEZyZWV6ZXMQEAgAAAAEYQEgVGhlIG1heGltdW0gbnVtYmVyIG9mIGluZGl2aWR1YWwgZnJlZXplIGxvY2tzIHRoYXQgY2FuIGV4aXN0IG9uIGFuIGFjY291bnQgYXQgYW55IHRpbWUuAeEIBQBIVHJhbnNhY3Rpb25QYXltZW50AUhUcmFuc2FjdGlvblBheW1lbnQIRE5leHRGZWVNdWx0aXBsaWVyAQDRBkAAAGSns7bgDQAAAAAAAAAAADhTdG9yYWdlVmVyc2lvbgEA5QgEAAAAAaAEYE9wZXJhdGlvbmFsRmVlTXVsdGlwbGllcggEBVRZASBBIGZlZSBtdWx0aXBsaWVyIGZvciBgT3BlcmF0aW9uYWxgIGV4dHJpbnNpY3MgdG8gY29tcHV0ZSAidmlydHVhbCB0aXAiIHRvIGJvb3N0IHRoZWlyLCBgcHJpb3JpdHlgAFEBIFRoaXMgdmFsdWUgaXMgbXVsdGlwbGllZCBieSB0aGUgYGZpbmFsX2ZlZWAgdG8gb2J0YWluIGEgInZpcnR1YWwgdGlwIiB0aGF0IGlzIGxhdGVy9CBhZGRlZCB0byBhIHRpcCBjb21wb25lbnQgaW4gcmVndWxhciBgcHJpb3JpdHlgIGNhbGN1bGF0aW9ucy5NASBJdCBtZWFucyB0aGF0IGEgYE5vcm1hbGAgdHJhbnNhY3Rpb24gY2FuIGZyb250LXJ1biBhIHNpbWlsYXJseS1zaXplZCBgT3BlcmF0aW9uYWxgQQEgZXh0cmluc2ljICh3aXRoIG5vIHRpcCksIGJ5IGluY2x1ZGluZyBhIHRpcCB2YWx1ZSBncmVhdGVyIHRoYW4gdGhlIHZpcnR1YWwgdGlwLgA8IGBgYHJ1c3QsaWdub3JlQCAvLyBGb3IgYE5vcm1hbGCMIGxldCBwcmlvcml0eSA9IHByaW9yaXR5X2NhbGModGlwKTsAVCAvLyBGb3IgYE9wZXJhdGlvbmFsYBEBIGxldCB2aXJ0dWFsX3RpcCA9IChpbmNsdXNpb25fZmVlICsgdGlwKSAqIE9wZXJhdGlvbmFsRmVlTXVsdGlwbGllcjvEIGxldCBwcmlvcml0eSA9IHByaW9yaXR5X2NhbGModGlwICsgdmlydHVhbF90aXApOxAgYGBgAFEBIE5vdGUgdGhhdCBzaW5jZSB3ZSB1c2UgYGZpbmFsX2ZlZWAgdGhlIG11bHRpcGxpZXIgYXBwbGllcyBhbHNvIHRvIHRoZSByZWd1bGFyIGB0aXBgXQEgc2VudCB3aXRoIHRoZSB0cmFuc2FjdGlvbi4gU28sIG5vdCBvbmx5IGRvZXMgdGhlIHRyYW5zYWN0aW9uIGdldCBhIHByaW9yaXR5IGJ1bXAgYmFzZWRhASBvbiB0aGUgYGluY2x1c2lvbl9mZWVgLCBidXQgd2UgYWxzbyBhbXBsaWZ5IHRoZSBpbXBhY3Qgb2YgdGlwcyBhcHBsaWVkIHRvIGBPcGVyYXRpb25hbGA4IHRyYW5zYWN0aW9ucy4AIAAoQXV0aG9yc2hpcAEoQXV0aG9yc2hpcAQYQXV0aG9yAAAABAAEZCBBdXRob3Igb2YgY3VycmVudCBibG9jay4AAAAABgAcU3Rha2luZwEcU3Rha2luZ6w4VmFsaWRhdG9yQ291bnQBABAQAAAAAAScIFRoZSBpZGVhbCBudW1iZXIgb2YgYWN0aXZlIHZhbGlkYXRvcnMuVE1pbmltdW1WYWxpZGF0b3JDb3VudAEAEBAAAAAABEEBIE1pbmltdW0gbnVtYmVyIG9mIHN0YWtpbmcgcGFydGljaXBhbnRzIGJlZm9yZSBlbWVyZ2VuY3kgY29uZGl0aW9ucyBhcmUgaW1wb3NlZC40SW52dWxuZXJhYmxlcwEA0QEEAAxZASBBbnkgdmFsaWRhdG9ycyB0aGF0IG1heSBuZXZlciBiZSBzbGFzaGVkIG9yIGZvcmNpYmx5IGtpY2tlZC4gSXQncyBhIFZlYyBzaW5jZSB0aGV5J3JlTQEgZWFzeSB0byBpbml0aWFsaXplIGFuZCB0aGUgcGVyZm9ybWFuY2UgaGl0IGlzIG1pbmltYWwgKHdlIGV4cGVjdCBubyBtb3JlIHRoYW4gZm91cqwgaW52dWxuZXJhYmxlcykgYW5kIHJlc3RyaWN0ZWQgdG8gdGVzdG5ldHMuGEJvbmRlZAABBAUAAAQADAEBIE1hcCBmcm9tIGFsbCBsb2NrZWQgInN0YXNoIiBhY2NvdW50cyB0byB0aGUgY29udHJvbGxlciBhY2NvdW50LgDQIFRXT1gtTk9URTogU0FGRSBzaW5jZSBgQWNjb3VudElkYCBpcyBhIHNlY3VyZSBoYXNoLkBNaW5Ob21pbmF0b3JCb25kAQAYQAAAAAAAAAAAAAAAAAAAAAAEIQEgVGhlIG1pbmltdW0gYWN0aXZlIGJvbmQgdG8gYmVjb21lIGFuZCBtYWludGFpbiB0aGUgcm9sZSBvZiBhIG5vbWluYXRvci5ATWluVmFsaWRhdG9yQm9uZAEAGEAAAAAAAAAAAAAAAAAAAAAABCEBIFRoZSBtaW5pbXVtIGFjdGl2ZSBib25kIHRvIGJlY29tZSBhbmQgbWFpbnRhaW4gdGhlIHJvbGUgb2YgYSB2YWxpZGF0b3IuSE1pbmltdW1BY3RpdmVTdGFrZQEAGEAAAAAAAAAAAAAAAAAAAAAABBEBIFRoZSBtaW5pbXVtIGFjdGl2ZSBub21pbmF0b3Igc3Rha2Ugb2YgdGhlIGxhc3Qgc3VjY2Vzc2Z1bCBlbGVjdGlvbi40TWluQ29tbWlzc2lvbgEArBAAAAAADOggVGhlIG1pbmltdW0gYW1vdW50IG9mIGNvbW1pc3Npb24gdGhhdCB2YWxpZGF0b3JzIGNhbiBzZXQuAIAgSWYgc2V0IHRvIGAwYCwgbm8gbGltaXQgZXhpc3RzLhhMZWRnZXIAAQQCAOkIBAAQRQEgTWFwIGZyb20gYWxsICh1bmxvY2tlZCkgImNvbnRyb2xsZXIiIGFjY291bnRzIHRvIHRoZSBpbmZvIHJlZ2FyZGluZyB0aGUgc3Rha2luZy4AdQEgTm90ZTogQWxsIHRoZSByZWFkcyBhbmQgbXV0YXRpb25zIHRvIHRoaXMgc3RvcmFnZSAqTVVTVCogYmUgZG9uZSB0aHJvdWdoIHRoZSBtZXRob2RzIGV4cG9zZWToIGJ5IFtgU3Rha2luZ0xlZGdlcmBdIHRvIGVuc3VyZSBkYXRhIGFuZCBsb2NrIGNvbnNpc3RlbmN5LhRQYXllZQABBAUAqAQADOQgV2hlcmUgdGhlIHJld2FyZCBwYXltZW50IHNob3VsZCBiZSBtYWRlLiBLZXllZCBieSBzdGFzaC4A0CBUV09YLU5PVEU6IFNBRkUgc2luY2UgYEFjY291bnRJZGAgaXMgYSBzZWN1cmUgaGFzaC4oVmFsaWRhdG9ycwEBBAUAsAgAAAxFASBUaGUgbWFwIGZyb20gKHdhbm5hYmUpIHZhbGlkYXRvciBzdGFzaCBrZXkgdG8gdGhlIHByZWZlcmVuY2VzIG9mIHRoYXQgdmFsaWRhdG9yLgDQIFRXT1gtTk9URTogU0FGRSBzaW5jZSBgQWNjb3VudElkYCBpcyBhIHNlY3VyZSBoYXNoLlBDb3VudGVyRm9yVmFsaWRhdG9ycwEAEBAAAAAABKxDb3VudGVyIGZvciB0aGUgcmVsYXRlZCBjb3VudGVkIHN0b3JhZ2UgbWFwSE1heFZhbGlkYXRvcnNDb3VudAAAEAQADDEBIFRoZSBtYXhpbXVtIHZhbGlkYXRvciBjb3VudCBiZWZvcmUgd2Ugc3RvcCBhbGxvd2luZyBuZXcgdmFsaWRhdG9ycyB0byBqb2luLgDQIFdoZW4gdGhpcyB2YWx1ZSBpcyBub3Qgc2V0LCBubyBsaW1pdHMgYXJlIGVuZm9yY2VkLihOb21pbmF0b3JzAAEEBQDxCAQATHUBIFRoZSBtYXAgZnJvbSBub21pbmF0b3Igc3Rhc2gga2V5IHRvIHRoZWlyIG5vbWluYXRpb24gcHJlZmVyZW5jZXMsIG5hbWVseSB0aGUgdmFsaWRhdG9ycyB0aGF0WCB0aGV5IHdpc2ggdG8gc3VwcG9ydC4AOQEgTm90ZSB0aGF0IHRoZSBrZXlzIG9mIHRoaXMgc3RvcmFnZSBtYXAgbWlnaHQgYmVjb21lIG5vbi1kZWNvZGFibGUgaW4gY2FzZSB0aGUtASBhY2NvdW50J3MgW2BOb21pbmF0aW9uc1F1b3RhOjpNYXhOb21pbmF0aW9uc2BdIGNvbmZpZ3VyYXRpb24gaXMgZGVjcmVhc2VkLpAgSW4gdGhpcyByYXJlIGNhc2UsIHRoZXNlIG5vbWluYXRvcnNlASBhcmUgc3RpbGwgZXhpc3RlbnQgaW4gc3RvcmFnZSwgdGhlaXIga2V5IGlzIGNvcnJlY3QgYW5kIHJldHJpZXZhYmxlIChpLmUuIGBjb250YWluc19rZXlgcQEgaW5kaWNhdGVzIHRoYXQgdGhleSBleGlzdCksIGJ1dCB0aGVpciB2YWx1ZSBjYW5ub3QgYmUgZGVjb2RlZC4gVGhlcmVmb3JlLCB0aGUgbm9uLWRlY29kYWJsZW0BIG5vbWluYXRvcnMgd2lsbCBlZmZlY3RpdmVseSBub3QtZXhpc3QsIHVudGlsIHRoZXkgcmUtc3VibWl0IHRoZWlyIHByZWZlcmVuY2VzIHN1Y2ggdGhhdCBpdAEBIGlzIHdpdGhpbiB0aGUgYm91bmRzIG9mIHRoZSBuZXdseSBzZXQgYENvbmZpZzo6TWF4Tm9taW5hdGlvbnNgLgBhASBUaGlzIGltcGxpZXMgdGhhdCBgOjppdGVyX2tleXMoKS5jb3VudCgpYCBhbmQgYDo6aXRlcigpLmNvdW50KClgIG1pZ2h0IHJldHVybiBkaWZmZXJlbnRtASB2YWx1ZXMgZm9yIHRoaXMgbWFwLiBNb3Jlb3ZlciwgdGhlIG1haW4gYDo6Y291bnQoKWAgaXMgYWxpZ25lZCB3aXRoIHRoZSBmb3JtZXIsIG5hbWVseSB0aGVsIG51bWJlciBvZiBrZXlzIHRoYXQgZXhpc3QuAG0BIExhc3RseSwgaWYgYW55IG9mIHRoZSBub21pbmF0b3JzIGJlY29tZSBub24tZGVjb2RhYmxlLCB0aGV5IGNhbiBiZSBjaGlsbGVkIGltbWVkaWF0ZWx5IHZpYbggW2BDYWxsOjpjaGlsbF9vdGhlcmBdIGRpc3BhdGNoYWJsZSBieSBhbnlvbmUuANAgVFdPWC1OT1RFOiBTQUZFIHNpbmNlIGBBY2NvdW50SWRgIGlzIGEgc2VjdXJlIGhhc2guUENvdW50ZXJGb3JOb21pbmF0b3JzAQAQEAAAAAAErENvdW50ZXIgZm9yIHRoZSByZWxhdGVkIGNvdW50ZWQgc3RvcmFnZSBtYXA4VmlydHVhbFN0YWtlcnMAAQQFAIwEABjIIFN0YWtlcnMgd2hvc2UgZnVuZHMgYXJlIG1hbmFnZWQgYnkgb3RoZXIgcGFsbGV0cy4AdQEgVGhpcyBwYWxsZXQgZG9lcyBub3QgYXBwbHkgYW55IGxvY2tzIG9uIHRoZW0sIHRoZXJlZm9yZSB0aGV5IGFyZSBvbmx5IHZpcnR1YWxseSBib25kZWQuIFRoZXltASBhcmUgZXhwZWN0ZWQgdG8gYmUga2V5bGVzcyBhY2NvdW50cyBhbmQgaGVuY2Ugc2hvdWxkIG5vdCBiZSBhbGxvd2VkIHRvIG11dGF0ZSB0aGVpciBsZWRnZXJxASBkaXJlY3RseSB2aWEgdGhpcyBwYWxsZXQuIEluc3RlYWQsIHRoZXNlIGFjY291bnRzIGFyZSBtYW5hZ2VkIGJ5IG90aGVyIHBhbGxldHMgYW5kIGFjY2Vzc2VkKQEgdmlhIGxvdyBsZXZlbCBhcGlzLiBXZSBrZWVwIHRyYWNrIG9mIHRoZW0gdG8gZG8gbWluaW1hbCBpbnRlZ3JpdHkgY2hlY2tzLmBDb3VudGVyRm9yVmlydHVhbFN0YWtlcnMBABAQAAAAAASsQ291bnRlciBmb3IgdGhlIHJlbGF0ZWQgY291bnRlZCBzdG9yYWdlIG1hcEhNYXhOb21pbmF0b3JzQ291bnQAABAEAAwxASBUaGUgbWF4aW11bSBub21pbmF0b3IgY291bnQgYmVmb3JlIHdlIHN0b3AgYWxsb3dpbmcgbmV3IHZhbGlkYXRvcnMgdG8gam9pbi4A0CBXaGVuIHRoaXMgdmFsdWUgaXMgbm90IHNldCwgbm8gbGltaXRzIGFyZSBlbmZvcmNlZC4oQ3VycmVudEVyYQAAEAQAEFwgVGhlIGN1cnJlbnQgZXJhIGluZGV4LgBlASBUaGlzIGlzIHRoZSBsYXRlc3QgcGxhbm5lZCBlcmEsIGRlcGVuZGluZyBvbiBob3cgdGhlIFNlc3Npb24gcGFsbGV0IHF1ZXVlcyB0aGUgdmFsaWRhdG9ygCBzZXQsIGl0IG1pZ2h0IGJlIGFjdGl2ZSBvciBub3QuJEFjdGl2ZUVyYQAA+QgEABDYIFRoZSBhY3RpdmUgZXJhIGluZm9ybWF0aW9uLCBpdCBob2xkcyBpbmRleCBhbmQgc3RhcnQuAFkBIFRoZSBhY3RpdmUgZXJhIGlzIHRoZSBlcmEgYmVpbmcgY3VycmVudGx5IHJld2FyZGVkLiBWYWxpZGF0b3Igc2V0IG9mIHRoaXMgZXJhIG11c3QgYmWsIGVxdWFsIHRvIFtgU2Vzc2lvbkludGVyZmFjZTo6dmFsaWRhdG9yc2BdLlRFcmFzU3RhcnRTZXNzaW9uSW5kZXgAAQQFEBAEABBVASBUaGUgc2Vzc2lvbiBpbmRleCBhdCB3aGljaCB0aGUgZXJhIHN0YXJ0IGZvciB0aGUgbGFzdCBbYENvbmZpZzo6SGlzdG9yeURlcHRoYF0gZXJhcy4AYQEgTm90ZTogVGhpcyB0cmFja3MgdGhlIHN0YXJ0aW5nIHNlc3Npb24gKGkuZS4gc2Vzc2lvbiBpbmRleCB3aGVuIGVyYSBzdGFydCBiZWluZyBhY3RpdmUp8CBmb3IgdGhlIGVyYXMgaW4gYFtDdXJyZW50RXJhIC0gSElTVE9SWV9ERVBUSCwgQ3VycmVudEVyYV1gLixFcmFzU3Rha2VycwEBCAUFAQkFCQwAAAAgeCBFeHBvc3VyZSBvZiB2YWxpZGF0b3IgYXQgZXJhLgBhASBUaGlzIGlzIGtleWVkIGZpcnN0IGJ5IHRoZSBlcmEgaW5kZXggdG8gYWxsb3cgYnVsayBkZWxldGlvbiBhbmQgdGhlbiB0aGUgc3Rhc2ggYWNjb3VudC4AzCBJcyBpdCByZW1vdmVkIGFmdGVyIFtgQ29uZmlnOjpIaXN0b3J5RGVwdGhgXSBlcmFzLkEBIElmIHN0YWtlcnMgaGFzbid0IGJlZW4gc2V0IG9yIGhhcyBiZWVuIHJlbW92ZWQgdGhlbiBlbXB0eSBleHBvc3VyZSBpcyByZXR1cm5lZC4AKQEgTm90ZTogRGVwcmVjYXRlZCBzaW5jZSB2MTQuIFVzZSBgRXJhSW5mb2AgaW5zdGVhZCB0byB3b3JrIHdpdGggZXhwb3N1cmVzLkxFcmFzU3Rha2Vyc092ZXJ2aWV3AAEIBQUBCREJBAAwuCBTdW1tYXJ5IG9mIHZhbGlkYXRvciBleHBvc3VyZSBhdCBhIGdpdmVuIGVyYS4AcQEgVGhpcyBjb250YWlucyB0aGUgdG90YWwgc3Rha2UgaW4gc3VwcG9ydCBvZiB0aGUgdmFsaWRhdG9yIGFuZCB0aGVpciBvd24gc3Rha2UuIEluIGFkZGl0aW9uLHUBIGl0IGNhbiBhbHNvIGJlIHVzZWQgdG8gZ2V0IHRoZSBudW1iZXIgb2Ygbm9taW5hdG9ycyBiYWNraW5nIHRoaXMgdmFsaWRhdG9yIGFuZCB0aGUgbnVtYmVyIG9maQEgZXhwb3N1cmUgcGFnZXMgdGhleSBhcmUgZGl2aWRlZCBpbnRvLiBUaGUgcGFnZSBjb3VudCBpcyB1c2VmdWwgdG8gZGV0ZXJtaW5lIHRoZSBudW1iZXIgb2asIHBhZ2VzIG9mIHJld2FyZHMgdGhhdCBuZWVkcyB0byBiZSBjbGFpbWVkLgBhASBUaGlzIGlzIGtleWVkIGZpcnN0IGJ5IHRoZSBlcmEgaW5kZXggdG8gYWxsb3cgYnVsayBkZWxldGlvbiBhbmQgdGhlbiB0aGUgc3Rhc2ggYWNjb3VudC6sIFNob3VsZCBvbmx5IGJlIGFjY2Vzc2VkIHRocm91Z2ggYEVyYUluZm9gLgDMIElzIGl0IHJlbW92ZWQgYWZ0ZXIgW2BDb25maWc6Okhpc3RvcnlEZXB0aGBdIGVyYXMuQQEgSWYgc3Rha2VycyBoYXNuJ3QgYmVlbiBzZXQgb3IgaGFzIGJlZW4gcmVtb3ZlZCB0aGVuIGVtcHR5IG92ZXJ2aWV3IGlzIHJldHVybmVkLkhFcmFzU3Rha2Vyc0NsaXBwZWQBAQgFBQEJBQkMAAAAQJggQ2xpcHBlZCBFeHBvc3VyZSBvZiB2YWxpZGF0b3IgYXQgZXJhLgBlASBOb3RlOiBUaGlzIGlzIGRlcHJlY2F0ZWQsIHNob3VsZCBiZSB1c2VkIGFzIHJlYWQtb25seSBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUuMQEgTmV3IGBFeHBvc3VyZWBzIGFyZSBzdG9yZWQgaW4gYSBwYWdlZCBtYW5uZXIgaW4gYEVyYXNTdGFrZXJzUGFnZWRgIGluc3RlYWQuAFkBIFRoaXMgaXMgc2ltaWxhciB0byBbYEVyYXNTdGFrZXJzYF0gYnV0IG51bWJlciBvZiBub21pbmF0b3JzIGV4cG9zZWQgaXMgcmVkdWNlZCB0byB0aGWoIGBUOjpNYXhFeHBvc3VyZVBhZ2VTaXplYCBiaWdnZXN0IHN0YWtlcnMuHQEgKE5vdGU6IHRoZSBmaWVsZCBgdG90YWxgIGFuZCBgb3duYCBvZiB0aGUgZXhwb3N1cmUgcmVtYWlucyB1bmNoYW5nZWQpLvQgVGhpcyBpcyB1c2VkIHRvIGxpbWl0IHRoZSBpL28gY29zdCBmb3IgdGhlIG5vbWluYXRvciBwYXlvdXQuAF0BIFRoaXMgaXMga2V5ZWQgZmlzdCBieSB0aGUgZXJhIGluZGV4IHRvIGFsbG93IGJ1bGsgZGVsZXRpb24gYW5kIHRoZW4gdGhlIHN0YXNoIGFjY291bnQuAMwgSXQgaXMgcmVtb3ZlZCBhZnRlciBbYENvbmZpZzo6SGlzdG9yeURlcHRoYF0gZXJhcy5BASBJZiBzdGFrZXJzIGhhc24ndCBiZWVuIHNldCBvciBoYXMgYmVlbiByZW1vdmVkIHRoZW4gZW1wdHkgZXhwb3N1cmUgaXMgcmV0dXJuZWQuACkBIE5vdGU6IERlcHJlY2F0ZWQgc2luY2UgdjE0LiBVc2UgYEVyYUluZm9gIGluc3RlYWQgdG8gd29yayB3aXRoIGV4cG9zdXJlcy5ARXJhc1N0YWtlcnNQYWdlZAABDAUFBRUJGQkEABjAIFBhZ2luYXRlZCBleHBvc3VyZSBvZiBhIHZhbGlkYXRvciBhdCBnaXZlbiBlcmEuAHEBIFRoaXMgaXMga2V5ZWQgZmlyc3QgYnkgdGhlIGVyYSBpbmRleCB0byBhbGxvdyBidWxrIGRlbGV0aW9uLCB0aGVuIHN0YXNoIGFjY291bnQgYW5kIGZpbmFsbHnUIHRoZSBwYWdlLiBTaG91bGQgb25seSBiZSBhY2Nlc3NlZCB0aHJvdWdoIGBFcmFJbmZvYC4A1CBUaGlzIGlzIGNsZWFyZWQgYWZ0ZXIgW2BDb25maWc6Okhpc3RvcnlEZXB0aGBdIGVyYXMuOENsYWltZWRSZXdhcmRzAQEIBQUBCeUBBAAY3CBIaXN0b3J5IG9mIGNsYWltZWQgcGFnZWQgcmV3YXJkcyBieSBlcmEgYW5kIHZhbGlkYXRvci4AaQEgVGhpcyBpcyBrZXllZCBieSBlcmEgYW5kIHZhbGlkYXRvciBzdGFzaCB3aGljaCBtYXBzIHRvIHRoZSBzZXQgb2YgcGFnZSBpbmRleGVzIHdoaWNoIGhhdmU4IGJlZW4gY2xhaW1lZC4AzCBJdCBpcyByZW1vdmVkIGFmdGVyIFtgQ29uZmlnOjpIaXN0b3J5RGVwdGhgXSBlcmFzLkhFcmFzVmFsaWRhdG9yUHJlZnMBAQgFBQEJsAgAABQRASBTaW1pbGFyIHRvIGBFcmFzU3Rha2Vyc2AsIHRoaXMgaG9sZHMgdGhlIHByZWZlcmVuY2VzIG9mIHZhbGlkYXRvcnMuAGEBIFRoaXMgaXMga2V5ZWQgZmlyc3QgYnkgdGhlIGVyYSBpbmRleCB0byBhbGxvdyBidWxrIGRlbGV0aW9uIGFuZCB0aGVuIHRoZSBzdGFzaCBhY2NvdW50LgDMIElzIGl0IHJlbW92ZWQgYWZ0ZXIgW2BDb25maWc6Okhpc3RvcnlEZXB0aGBdIGVyYXMuTEVyYXNWYWxpZGF0b3JSZXdhcmQAAQQFEBgEAAwtASBUaGUgdG90YWwgdmFsaWRhdG9yIGVyYSBwYXlvdXQgZm9yIHRoZSBsYXN0IFtgQ29uZmlnOjpIaXN0b3J5RGVwdGhgXSBlcmFzLgAhASBFcmFzIHRoYXQgaGF2ZW4ndCBmaW5pc2hlZCB5ZXQgb3IgaGFzIGJlZW4gcmVtb3ZlZCBkb2Vzbid0IGhhdmUgcmV3YXJkLkBFcmFzUmV3YXJkUG9pbnRzAQEEBRAdCRQAAAAAAAjQIFJld2FyZHMgZm9yIHRoZSBsYXN0IFtgQ29uZmlnOjpIaXN0b3J5RGVwdGhgXSBlcmFzLiUBIElmIHJld2FyZCBoYXNuJ3QgYmVlbiBzZXQgb3IgaGFzIGJlZW4gcmVtb3ZlZCB0aGVuIDAgcmV3YXJkIGlzIHJldHVybmVkLjhFcmFzVG90YWxTdGFrZQEBBAUQGEAAAAAAAAAAAAAAAAAAAAAACBEBIFRoZSB0b3RhbCBhbW91bnQgc3Rha2VkIGZvciB0aGUgbGFzdCBbYENvbmZpZzo6SGlzdG9yeURlcHRoYF0gZXJhcy4dASBJZiB0b3RhbCBoYXNuJ3QgYmVlbiBzZXQgb3IgaGFzIGJlZW4gcmVtb3ZlZCB0aGVuIDAgc3Rha2UgaXMgcmV0dXJuZWQuIEZvcmNlRXJhAQC4BAAEVCBNb2RlIG9mIGVyYSBmb3JjaW5nLkBNYXhTdGFrZWRSZXdhcmRzAADhAQQADBkBIE1heGltdW0gc3Rha2VkIHJld2FyZHMsIGkuZS4gdGhlIHBlcmNlbnRhZ2Ugb2YgdGhlIGVyYSBpbmZsYXRpb24gdGhhdGwgaXMgdXNlZCBmb3Igc3Rha2UgcmV3YXJkcy6sIFNlZSBbRXJhIHBheW91dF0oLi9pbmRleC5odG1sI2VyYS1wYXlvdXQpLkxTbGFzaFJld2FyZEZyYWN0aW9uAQCsEAAAAAAM+CBUaGUgcGVyY2VudGFnZSBvZiB0aGUgc2xhc2ggdGhhdCBpcyBkaXN0cmlidXRlZCB0byByZXBvcnRlcnMuAOQgVGhlIHJlc3Qgb2YgdGhlIHNsYXNoZWQgdmFsdWUgaXMgaGFuZGxlZCBieSB0aGUgYFNsYXNoYC5MQ2FuY2VsZWRTbGFzaFBheW91dAEAGEAAAAAAAAAAAAAAAAAAAAAACBUBIFRoZSBhbW91bnQgb2YgY3VycmVuY3kgZ2l2ZW4gdG8gcmVwb3J0ZXJzIG9mIGEgc2xhc2ggZXZlbnQgd2hpY2ggd2Fz7CBjYW5jZWxlZCBieSBleHRyYW9yZGluYXJ5IGNpcmN1bXN0YW5jZXMgKGUuZy4gZ292ZXJuYW5jZSkuQFVuYXBwbGllZFNsYXNoZXMBAQQFEC0JBAAExCBBbGwgdW5hcHBsaWVkIHNsYXNoZXMgdGhhdCBhcmUgcXVldWVkIGZvciBsYXRlci4oQm9uZGVkRXJhcwEA2QcEABAlASBBIG1hcHBpbmcgZnJvbSBzdGlsbC1ib25kZWQgZXJhcyB0byB0aGUgZmlyc3Qgc2Vzc2lvbiBpbmRleCBvZiB0aGF0IGVyYS4AyCBNdXN0IGNvbnRhaW5zIGluZm9ybWF0aW9uIGZvciBlcmFzIGZvciB0aGUgcmFuZ2U6vCBgW2FjdGl2ZV9lcmEgLSBib3VuZGluZ19kdXJhdGlvbjsgYWN0aXZlX2VyYV1gTFZhbGlkYXRvclNsYXNoSW5FcmEAAQgFBQEJNQkEAAhFASBBbGwgc2xhc2hpbmcgZXZlbnRzIG9uIHZhbGlkYXRvcnMsIG1hcHBlZCBieSBlcmEgdG8gdGhlIGhpZ2hlc3Qgc2xhc2ggcHJvcG9ydGlvbnAgYW5kIHNsYXNoIHZhbHVlIG9mIHRoZSBlcmEuTE5vbWluYXRvclNsYXNoSW5FcmEAAQgFBQEJGAQABGEBIEFsbCBzbGFzaGluZyBldmVudHMgb24gbm9taW5hdG9ycywgbWFwcGVkIGJ5IGVyYSB0byB0aGUgaGlnaGVzdCBzbGFzaCB2YWx1ZSBvZiB0aGUgZXJhLjRTbGFzaGluZ1NwYW5zAAEEBQA5CQQABIwgU2xhc2hpbmcgc3BhbnMgZm9yIHN0YXNoIGFjY291bnRzLiRTcGFuU2xhc2gBAQQFKQk9CYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAg9ASBSZWNvcmRzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBtYXhpbXVtIHNsYXNoIG9mIGEgc3Rhc2ggd2l0aGluIGEgc2xhc2hpbmcgc3Bhbiy4IGFzIHdlbGwgYXMgaG93IG11Y2ggcmV3YXJkIGhhcyBiZWVuIHBhaWQgb3V0LlRDdXJyZW50UGxhbm5lZFNlc3Npb24BABAQAAAAAAzoIFRoZSBsYXN0IHBsYW5uZWQgc2Vzc2lvbiBzY2hlZHVsZWQgYnkgdGhlIHNlc3Npb24gcGFsbGV0LgBxASBUaGlzIGlzIGJhc2ljYWxseSBpbiBzeW5jIHdpdGggdGhlIGNhbGwgdG8gW2BwYWxsZXRfc2Vzc2lvbjo6U2Vzc2lvbk1hbmFnZXI6Om5ld19zZXNzaW9uYF0uSERpc2FibGVkVmFsaWRhdG9ycwEA5QEEABx1ASBJbmRpY2VzIG9mIHZhbGlkYXRvcnMgdGhhdCBoYXZlIG9mZmVuZGVkIGluIHRoZSBhY3RpdmUgZXJhLiBUaGUgb2ZmZW5kZXJzIGFyZSBkaXNhYmxlZCBmb3IgYWkBIHdob2xlIGVyYS4gRm9yIHRoaXMgcmVhc29uIHRoZXkgYXJlIGtlcHQgaGVyZSAtIG9ubHkgc3Rha2luZyBwYWxsZXQga25vd3MgYWJvdXQgZXJhcy4gVGhlVQEgaW1wbGVtZW50b3Igb2YgW2BEaXNhYmxpbmdTdHJhdGVneWBdIGRlZmluZXMgaWYgYSB2YWxpZGF0b3Igc2hvdWxkIGJlIGRpc2FibGVkIHdoaWNobQEgaW1wbGljaXRseSBtZWFucyB0aGF0IHRoZSBpbXBsZW1lbnRvciBhbHNvIGNvbnRyb2xzIHRoZSBtYXggbnVtYmVyIG9mIGRpc2FibGVkIHZhbGlkYXRvcnMuAG0BIFRoZSB2ZWMgaXMgYWx3YXlzIGtlcHQgc29ydGVkIHNvIHRoYXQgd2UgY2FuIGZpbmQgd2hldGhlciBhIGdpdmVuIHZhbGlkYXRvciBoYXMgcHJldmlvdXNseXggb2ZmZW5kZWQgdXNpbmcgYmluYXJ5IHNlYXJjaC44Q2hpbGxUaHJlc2hvbGQAAOEBBAAMUQEgVGhlIHRocmVzaG9sZCBmb3Igd2hlbiB1c2VycyBjYW4gc3RhcnQgY2FsbGluZyBgY2hpbGxfb3RoZXJgIGZvciBvdGhlciB2YWxpZGF0b3JzIC9ZASBub21pbmF0b3JzLiBUaGUgdGhyZXNob2xkIGlzIGNvbXBhcmVkIHRvIHRoZSBhY3R1YWwgbnVtYmVyIG9mIHZhbGlkYXRvcnMgLyBub21pbmF0b3JzKQEgKGBDb3VudEZvcipgKSBpbiB0aGUgc3lzdGVtIGNvbXBhcmVkIHRvIHRoZSBjb25maWd1cmVkIG1heCAoYE1heCpDb3VudGApLgHZAQGkGDBIaXN0b3J5RGVwdGgQEFQAAABQjCBOdW1iZXIgb2YgZXJhcyB0byBrZWVwIGluIGhpc3RvcnkuAOggRm9sbG93aW5nIGluZm9ybWF0aW9uIGlzIGtlcHQgZm9yIGVyYXMgaW4gYFtjdXJyZW50X2VyYSAtCQEgSGlzdG9yeURlcHRoLCBjdXJyZW50X2VyYV1gOiBgRXJhc1N0YWtlcnNgLCBgRXJhc1N0YWtlcnNDbGlwcGVkYCwFASBgRXJhc1ZhbGlkYXRvclByZWZzYCwgYEVyYXNWYWxpZGF0b3JSZXdhcmRgLCBgRXJhc1Jld2FyZFBvaW50c2AsRQEgYEVyYXNUb3RhbFN0YWtlYCwgYEVyYXNTdGFydFNlc3Npb25JbmRleGAsIGBDbGFpbWVkUmV3YXJkc2AsIGBFcmFzU3Rha2Vyc1BhZ2VkYCxcIGBFcmFzU3Rha2Vyc092ZXJ2aWV3YC4A5CBNdXN0IGJlIG1vcmUgdGhhbiB0aGUgbnVtYmVyIG9mIGVyYXMgZGVsYXllZCBieSBzZXNzaW9uLvggSS5lLiBhY3RpdmUgZXJhIG11c3QgYWx3YXlzIGJlIGluIGhpc3RvcnkuIEkuZS4gYGFjdGl2ZV9lcmEgPsQgY3VycmVudF9lcmEgLSBoaXN0b3J5X2RlcHRoYCBtdXN0IGJlIGd1YXJhbnRlZWQuABEBIElmIG1pZ3JhdGluZyBhbiBleGlzdGluZyBwYWxsZXQgZnJvbSBzdG9yYWdlIHZhbHVlIHRvIGNvbmZpZyB2YWx1ZSzsIHRoaXMgc2hvdWxkIGJlIHNldCB0byBzYW1lIHZhbHVlIG9yIGdyZWF0ZXIgYXMgaW4gc3RvcmFnZS4AFQEgTm90ZTogYEhpc3RvcnlEZXB0aGAgaXMgdXNlZCBhcyB0aGUgdXBwZXIgYm91bmQgZm9yIHRoZSBgQm91bmRlZFZlY2AtASBpdGVtIGBTdGFraW5nTGVkZ2VyLmxlZ2FjeV9jbGFpbWVkX3Jld2FyZHNgLiBTZXR0aW5nIHRoaXMgdmFsdWUgbG93ZXIgdGhhbtggdGhlIGV4aXN0aW5nIHZhbHVlIGNhbiBsZWFkIHRvIGluY29uc2lzdGVuY2llcyBpbiB0aGUVASBgU3Rha2luZ0xlZGdlcmAgYW5kIHdpbGwgbmVlZCB0byBiZSBoYW5kbGVkIHByb3Blcmx5IGluIGEgbWlncmF0aW9uLvAgVGhlIHRlc3QgYHJlZHVjaW5nX2hpc3RvcnlfZGVwdGhfYWJydXB0YCBzaG93cyB0aGlzIGVmZmVjdC44U2Vzc2lvbnNQZXJFcmEQEAYAAAAEcCBOdW1iZXIgb2Ygc2Vzc2lvbnMgcGVyIGVyYS48Qm9uZGluZ0R1cmF0aW9uEBAcAAAABOQgTnVtYmVyIG9mIGVyYXMgdGhhdCBzdGFrZWQgZnVuZHMgbXVzdCByZW1haW4gYm9uZGVkIGZvci5IU2xhc2hEZWZlckR1cmF0aW9uEBAbAAAAEAEBIE51bWJlciBvZiBlcmFzIHRoYXQgc2xhc2hlcyBhcmUgZGVmZXJyZWQgYnksIGFmdGVyIGNvbXB1dGF0aW9uLgANASBUaGlzIHNob3VsZCBiZSBsZXNzIHRoYW4gdGhlIGJvbmRpbmcgZHVyYXRpb24uIFNldCB0byAwIGlmIHNsYXNoZXMVASBzaG91bGQgYmUgYXBwbGllZCBpbW1lZGlhdGVseSwgd2l0aG91dCBvcHBvcnR1bml0eSBmb3IgaW50ZXJ2ZW50aW9uLkxNYXhFeHBvc3VyZVBhZ2VTaXplEBAAAgAALLAgVGhlIG1heGltdW0gc2l6ZSBvZiBlYWNoIGBUOjpFeHBvc3VyZVBhZ2VgLgApASBBbiBgRXhwb3N1cmVQYWdlYCBpcyB3ZWFrbHkgYm91bmRlZCB0byBhIG1heGltdW0gb2YgYE1heEV4cG9zdXJlUGFnZVNpemVgMCBub21pbmF0b3JzLgAhASBGb3Igb2xkZXIgbm9uLXBhZ2VkIGV4cG9zdXJlLCBhIHJld2FyZCBwYXlvdXQgd2FzIHJlc3RyaWN0ZWQgdG8gdGhlIHRvcCEBIGBNYXhFeHBvc3VyZVBhZ2VTaXplYCBub21pbmF0b3JzLiBUaGlzIGlzIHRvIGxpbWl0IHRoZSBpL28gY29zdCBmb3IgdGhlSCBub21pbmF0b3IgcGF5b3V0LgBZASBOb3RlOiBgTWF4RXhwb3N1cmVQYWdlU2l6ZWAgaXMgdXNlZCB0byBib3VuZCBgQ2xhaW1lZFJld2FyZHNgIGFuZCBpcyB1bnNhZmUgdG8gcmVkdWNlkCB3aXRob3V0IGhhbmRsaW5nIGl0IGluIGEgbWlncmF0aW9uLkhNYXhVbmxvY2tpbmdDaHVua3MQECAAAAAoBQEgVGhlIG1heGltdW0gbnVtYmVyIG9mIGB1bmxvY2tpbmdgIGNodW5rcyBhIFtgU3Rha2luZ0xlZGdlcmBdIGNhbgkBIGhhdmUuIEVmZmVjdGl2ZWx5IGRldGVybWluZXMgaG93IG1hbnkgdW5pcXVlIGVyYXMgYSBzdGFrZXIgbWF5IGJlOCB1bmJvbmRpbmcgaW4uAPggTm90ZTogYE1heFVubG9ja2luZ0NodW5rc2AgaXMgdXNlZCBhcyB0aGUgdXBwZXIgYm91bmQgZm9yIHRoZQEBIGBCb3VuZGVkVmVjYCBpdGVtIGBTdGFraW5nTGVkZ2VyLnVubG9ja2luZ2AuIFNldHRpbmcgdGhpcyB2YWx1ZQUBIGxvd2VyIHRoYW4gdGhlIGV4aXN0aW5nIHZhbHVlIGNhbiBsZWFkIHRvIGluY29uc2lzdGVuY2llcyBpbiB0aGUJASBgU3Rha2luZ0xlZGdlcmAgYW5kIHdpbGwgbmVlZCB0byBiZSBoYW5kbGVkIHByb3Blcmx5IGluIGEgcnVudGltZQUBIG1pZ3JhdGlvbi4gVGhlIHRlc3QgYHJlZHVjaW5nX21heF91bmxvY2tpbmdfY2h1bmtzX2FicnVwdGAgc2hvd3M0IHRoaXMgZWZmZWN0LgFBCQcAIE9mZmVuY2VzASBPZmZlbmNlcwgcUmVwb3J0cwABBAU0RQkEAARJASBUaGUgcHJpbWFyeSBzdHJ1Y3R1cmUgdGhhdCBob2xkcyBhbGwgb2ZmZW5jZSByZWNvcmRzIGtleWVkIGJ5IHJlcG9ydCBpZGVudGlmaWVycy5YQ29uY3VycmVudFJlcG9ydHNJbmRleAEBCAUFTQmVAQQABCkBIEEgdmVjdG9yIG9mIHJlcG9ydHMgb2YgdGhlIHNhbWUga2luZCB0aGF0IGhhcHBlbmVkIGF0IHRoZSBzYW1lIHRpbWUgc2xvdC4AAbwAAAgAKEhpc3RvcmljYWwBKEhpc3RvcmljYWwISEhpc3RvcmljYWxTZXNzaW9ucwABBAUQRQgEAARdASBNYXBwaW5nIGZyb20gaGlzdG9yaWNhbCBzZXNzaW9uIGluZGljZXMgdG8gc2Vzc2lvbi1kYXRhIHJvb3QgaGFzaCBhbmQgdmFsaWRhdG9yIGNvdW50LixTdG9yZWRSYW5nZQAAgAQABOQgVGhlIHJhbmdlIG9mIGhpc3RvcmljYWwgc2Vzc2lvbnMgd2Ugc3RvcmUuIFtmaXJzdCwgbGFzdCkAAAAAIQAcU2Vzc2lvbgEcU2Vzc2lvbhwoVmFsaWRhdG9ycwEA0QEEAAR8IFRoZSBjdXJyZW50IHNldCBvZiB2YWxpZGF0b3JzLjBDdXJyZW50SW5kZXgBABAQAAAAAAR4IEN1cnJlbnQgaW5kZXggb2YgdGhlIHNlc3Npb24uNFF1ZXVlZENoYW5nZWQBACAEAAg5ASBUcnVlIGlmIHRoZSB1bmRlcmx5aW5nIGVjb25vbWljIGlkZW50aXRpZXMgb3Igd2VpZ2h0aW5nIGJlaGluZCB0aGUgdmFsaWRhdG9yc6QgaGFzIGNoYW5nZWQgaW4gdGhlIHF1ZXVlZCB2YWxpZGF0b3Igc2V0LihRdWV1ZWRLZXlzAQBRCQQACD0BIFRoZSBxdWV1ZWQga2V5cyBmb3IgdGhlIG5leHQgc2Vzc2lvbi4gV2hlbiB0aGUgbmV4dCBzZXNzaW9uIGJlZ2lucywgdGhlc2Uga2V5c+Agd2lsbCBiZSB1c2VkIHRvIGRldGVybWluZSB0aGUgdmFsaWRhdG9yJ3Mgc2Vzc2lvbiBrZXlzLkhEaXNhYmxlZFZhbGlkYXRvcnMBAOUBBAAUgCBJbmRpY2VzIG9mIGRpc2FibGVkIHZhbGlkYXRvcnMuAD0BIFRoZSB2ZWMgaXMgYWx3YXlzIGtlcHQgc29ydGVkIHNvIHRoYXQgd2UgY2FuIGZpbmQgd2hldGhlciBhIGdpdmVuIHZhbGlkYXRvciBpcz0BIGRpc2FibGVkIHVzaW5nIGJpbmFyeSBzZWFyY2guIEl0IGdldHMgY2xlYXJlZCB3aGVuIGBvbl9zZXNzaW9uX2VuZGluZ2AgcmV0dXJuc2QgYSBuZXcgc2V0IG9mIGlkZW50aXRpZXMuIE5leHRLZXlzAAEEBQAZAgQABJwgVGhlIG5leHQgc2Vzc2lvbiBrZXlzIGZvciBhIHZhbGlkYXRvci4gS2V5T3duZXIAAQQFWQkABAAECQEgVGhlIG93bmVyIG9mIGEga2V5LiBUaGUga2V5IGlzIHRoZSBgS2V5VHlwZUlkYCArIHRoZSBlbmNvZGVkIGtleS4BFQIBxAABYQkJABxHcmFuZHBhARxHcmFuZHBhHBRTdGF0ZQEAZQkEAASQIFN0YXRlIG9mIHRoZSBjdXJyZW50IGF1dGhvcml0eSBzZXQuNFBlbmRpbmdDaGFuZ2UAAGkJBAAExCBQZW5kaW5nIGNoYW5nZTogKHNpZ25hbGVkIGF0LCBzY2hlZHVsZWQgY2hhbmdlKS4oTmV4dEZvcmNlZAAAEAQABLwgbmV4dCBibG9jayBudW1iZXIgd2hlcmUgd2UgY2FuIGZvcmNlIGEgY2hhbmdlLhxTdGFsbGVkAACABAAEkCBgdHJ1ZWAgaWYgd2UgYXJlIGN1cnJlbnRseSBzdGFsbGVkLjBDdXJyZW50U2V0SWQBADAgAAAAAAAAAAAIXQEgVGhlIG51bWJlciBvZiBjaGFuZ2VzIChib3RoIGluIHRlcm1zIG9mIGtleXMgYW5kIHVuZGVybHlpbmcgZWNvbm9taWMgcmVzcG9uc2liaWxpdGllcynEIGluIHRoZSAic2V0IiBvZiBHcmFuZHBhIHZhbGlkYXRvcnMgZnJvbSBnZW5lc2lzLjBTZXRJZFNlc3Npb24AAQQFMBAEAChZASBBIG1hcHBpbmcgZnJvbSBncmFuZHBhIHNldCBJRCB0byB0aGUgaW5kZXggb2YgdGhlICptb3N0IHJlY2VudCogc2Vzc2lvbiBmb3Igd2hpY2ggaXRzaCBtZW1iZXJzIHdlcmUgcmVzcG9uc2libGUuAEUBIFRoaXMgaXMgb25seSB1c2VkIGZvciB2YWxpZGF0aW5nIGVxdWl2b2NhdGlvbiBwcm9vZnMuIEFuIGVxdWl2b2NhdGlvbiBwcm9vZiBtdXN0TQEgY29udGFpbnMgYSBrZXktb3duZXJzaGlwIHByb29mIGZvciBhIGdpdmVuIHNlc3Npb24sIHRoZXJlZm9yZSB3ZSBuZWVkIGEgd2F5IHRvIHRpZUUBIHRvZ2V0aGVyIHNlc3Npb25zIGFuZCBHUkFORFBBIHNldCBpZHMsIGkuZS4gd2UgbmVlZCB0byB2YWxpZGF0ZSB0aGF0IGEgdmFsaWRhdG9yQQEgd2FzIHRoZSBvd25lciBvZiBhIGdpdmVuIGtleSBvbiBhIGdpdmVuIHNlc3Npb24sIGFuZCB3aGF0IHRoZSBhY3RpdmUgc2V0IElEIHdhc1QgZHVyaW5nIHRoYXQgc2Vzc2lvbi4AuCBUV09YLU5PVEU6IGBTZXRJZGAgaXMgbm90IHVuZGVyIHVzZXIgY29udHJvbC4sQXV0aG9yaXRpZXMBAG0JBAAEhCBUaGUgY3VycmVudCBsaXN0IG9mIGF1dGhvcml0aWVzLgExAgHIDDhNYXhBdXRob3JpdGllcxAQoIYBAARcIE1heCBBdXRob3JpdGllcyBpbiB1c2U0TWF4Tm9taW5hdG9ycxAQAAIAAATUIFRoZSBtYXhpbXVtIG51bWJlciBvZiBub21pbmF0b3JzIGZvciBlYWNoIHZhbGlkYXRvci5YTWF4U2V0SWRTZXNzaW9uRW50cmllczAgqAAAAAAAAAAYOQEgVGhlIG1heGltdW0gbnVtYmVyIG9mIGVudHJpZXMgdG8ga2VlcCBpbiB0aGUgc2V0IGlkIHRvIHNlc3Npb24gaW5kZXggbWFwcGluZy4AMQEgU2luY2UgdGhlIGBTZXRJZFNlc3Npb25gIG1hcCBpcyBvbmx5IHVzZWQgZm9yIHZhbGlkYXRpbmcgZXF1aXZvY2F0aW9ucyB0aGlzKQEgdmFsdWUgc2hvdWxkIHJlbGF0ZSB0byB0aGUgYm9uZGluZyBkdXJhdGlvbiBvZiB3aGF0ZXZlciBzdGFraW5nIHN5c3RlbSBpczUBIGJlaW5nIHVzZWQgKGlmIGFueSkuIElmIGVxdWl2b2NhdGlvbiBoYW5kbGluZyBpcyBub3QgZW5hYmxlZCB0aGVuIHRoaXMgdmFsdWU0IGNhbiBiZSB6ZXJvLgFxCQsASEF1dGhvcml0eURpc2NvdmVyeQFIQXV0aG9yaXR5RGlzY292ZXJ5CBBLZXlzAQB1CQQABIwgS2V5cyBvZiB0aGUgY3VycmVudCBhdXRob3JpdHkgc2V0LiBOZXh0S2V5cwEAdQkEAASAIEtleXMgb2YgdGhlIG5leHQgYXV0aG9yaXR5IHNldC4AAAAADQAgVHJlYXN1cnkBIFRyZWFzdXJ5GDRQcm9wb3NhbENvdW50AQAQEAAAAAAEpCBOdW1iZXIgb2YgcHJvcG9zYWxzIHRoYXQgaGF2ZSBiZWVuIG1hZGUuJFByb3Bvc2FscwABBAUQfQkEAAR8IFByb3Bvc2FscyB0aGF0IGhhdmUgYmVlbiBtYWRlLixEZWFjdGl2YXRlZAEAGEAAAAAAAAAAAAAAAAAAAAAABPAgVGhlIGFtb3VudCB3aGljaCBoYXMgYmVlbiByZXBvcnRlZCBhcyBpbmFjdGl2ZSB0byBDdXJyZW5jeS4kQXBwcm92YWxzAQCBCQQABPggUHJvcG9zYWwgaW5kaWNlcyB0aGF0IGhhdmUgYmVlbiBhcHByb3ZlZCBidXQgbm90IHlldCBhd2FyZGVkLihTcGVuZENvdW50AQAQEAAAAAAEpCBUaGUgY291bnQgb2Ygc3BlbmRzIHRoYXQgaGF2ZSBiZWVuIG1hZGUuGFNwZW5kcwABBAUQhQkEAATQIFNwZW5kcyB0aGF0IGhhdmUgYmVlbiBhcHByb3ZlZCBhbmQgYmVpbmcgcHJvY2Vzc2VkLgFdAgHYFCxTcGVuZFBlcmlvZBAQAEYFAASIIFBlcmlvZCBiZXR3ZWVuIHN1Y2Nlc3NpdmUgc3BlbmRzLhBCdXJujQkQECcAAAQRASBQZXJjZW50YWdlIG9mIHNwYXJlIGZ1bmRzIChpZiBhbnkpIHRoYXQgYXJlIGJ1cm50IHBlciBzcGVuZCBwZXJpb2QuIFBhbGxldElkkQkgcHkvdHJzcnkEGQEgVGhlIHRyZWFzdXJ5J3MgcGFsbGV0IGlkLCB1c2VkIGZvciBkZXJpdmluZyBpdHMgc292ZXJlaWduIGFjY291bnQgSUQuME1heEFwcHJvdmFscxAQZAAAAAwVASBUaGUgbWF4aW11bSBudW1iZXIgb2YgYXBwcm92YWxzIHRoYXQgY2FuIHdhaXQgaW4gdGhlIHNwZW5kaW5nIHF1ZXVlLgBNASBOT1RFOiBUaGlzIHBhcmFtZXRlciBpcyBhbHNvIHVzZWQgd2l0aGluIHRoZSBCb3VudGllcyBQYWxsZXQgZXh0ZW5zaW9uIGlmIGVuYWJsZWQuMFBheW91dFBlcmlvZBAQgJcGAAQZASBUaGUgcGVyaW9kIGR1cmluZyB3aGljaCBhbiBhcHByb3ZlZCB0cmVhc3VyeSBzcGVuZCBoYXMgdG8gYmUgY2xhaW1lZC4BlQkTAEBDb252aWN0aW9uVm90aW5nAUBDb252aWN0aW9uVm90aW5nCCRWb3RpbmdGb3IBAQgFBZkJnQnYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACHUBIEFsbCB2b3RpbmcgZm9yIGEgcGFydGljdWxhciB2b3RlciBpbiBhIHBhcnRpY3VsYXIgdm90aW5nIGNsYXNzLiBXZSBzdG9yZSB0aGUgYmFsYW5jZSBmb3IgdGhlnCBudW1iZXIgb2Ygdm90ZXMgdGhhdCB3ZSBoYXZlIHJlY29yZGVkLjRDbGFzc0xvY2tzRm9yAQEEBQC9CQQADGkBIFRoZSB2b3RpbmcgY2xhc3NlcyB3aGljaCBoYXZlIGEgbm9uLXplcm8gbG9jayByZXF1aXJlbWVudCBhbmQgdGhlIGxvY2sgYW1vdW50cyB3aGljaCB0aGV5bQEgcmVxdWlyZS4gVGhlIGFjdHVhbCBhbW91bnQgbG9ja2VkIG9uIGJlaGFsZiBvZiB0aGlzIHBhbGxldCBzaG91bGQgYWx3YXlzIGJlIHRoZSBtYXhpbXVtIG9mLCB0aGlzIGxpc3QuAWUCAWUBCCBNYXhWb3RlcxAQAAIAABDwIFRoZSBtYXhpbXVtIG51bWJlciBvZiBjb25jdXJyZW50IHZvdGVzIGFuIGFjY291bnQgbWF5IGhhdmUuAFUBIEFsc28gdXNlZCB0byBjb21wdXRlIHdlaWdodCwgYW4gb3Zlcmx5IGxhcmdlIHZhbHVlIGNhbiBsZWFkIHRvIGV4dHJpbnNpY3Mgd2l0aCBsYXJnZcAgd2VpZ2h0IGVzdGltYXRpb246IHNlZSBgZGVsZWdhdGVgIGZvciBpbnN0YW5jZS5EVm90ZUxvY2tpbmdQZXJpb2QQEMCJAQAQkCBUaGUgbWluaW11bSBwZXJpb2Qgb2Ygdm90ZSBsb2NraW5nLgBlASBJdCBzaG91bGQgYmUgbm8gc2hvcnRlciB0aGFuIGVuYWN0bWVudCBwZXJpb2QgdG8gZW5zdXJlIHRoYXQgaW4gdGhlIGNhc2Ugb2YgYW4gYXBwcm92YWwsSQEgdGhvc2Ugc3VjY2Vzc2Z1bCB2b3RlcnMgYXJlIGxvY2tlZCBpbnRvIHRoZSBjb25zZXF1ZW5jZXMgdGhhdCB0aGVpciB2b3RlcyBlbnRhaWwuAckJFAAkUmVmZXJlbmRhASRSZWZlcmVuZGEUPFJlZmVyZW5kdW1Db3VudAEAEBAAAAAABDEBIFRoZSBuZXh0IGZyZWUgcmVmZXJlbmR1bSBpbmRleCwgYWthIHRoZSBudW1iZXIgb2YgcmVmZXJlbmRhIHN0YXJ0ZWQgc28gZmFyLkRSZWZlcmVuZHVtSW5mb0ZvcgABBAIQzQkEAAS0IEluZm9ybWF0aW9uIGNvbmNlcm5pbmcgYW55IGdpdmVuIHJlZmVyZW5kdW0uKFRyYWNrUXVldWUBAQQFbQHtCQQAEF0BIFRoZSBzb3J0ZWQgbGlzdCBvZiByZWZlcmVuZGEgcmVhZHkgdG8gYmUgZGVjaWRlZCBidXQgbm90IHlldCBiZWluZyBkZWNpZGVkLCBvcmRlcmVkIGJ5fCBjb252aWN0aW9uLXdlaWdodGVkIGFwcHJvdmFscy4AQQEgVGhpcyBzaG91bGQgYmUgZW1wdHkgaWYgYERlY2lkaW5nQ291bnRgIGlzIGxlc3MgdGhhbiBgVHJhY2tJbmZvOjptYXhfZGVjaWRpbmdgLjREZWNpZGluZ0NvdW50AQEEBW0BEBAAAAAABMQgVGhlIG51bWJlciBvZiByZWZlcmVuZGEgYmVpbmcgZGVjaWRlZCBjdXJyZW50bHkuKE1ldGFkYXRhT2YAAQQCEDQEABgFASBUaGUgbWV0YWRhdGEgaXMgYSBnZW5lcmFsIGluZm9ybWF0aW9uIGNvbmNlcm5pbmcgdGhlIHJlZmVyZW5kdW0uSQEgVGhlIGBIYXNoYCByZWZlcnMgdG8gdGhlIHByZWltYWdlIG9mIHRoZSBgUHJlaW1hZ2VzYCBwcm92aWRlciB3aGljaCBjYW4gYmUgYSBKU09OiCBkdW1wIG9yIElQRlMgaGFzaCBvZiBhIEpTT04gZmlsZS4AdQEgQ29uc2lkZXIgYSBnYXJiYWdlIGNvbGxlY3Rpb24gZm9yIGEgbWV0YWRhdGEgb2YgZmluaXNoZWQgcmVmZXJlbmR1bXMgdG8gYHVucmVxdWVzdGAgKHJlbW92ZSlEIGxhcmdlIHByZWltYWdlcy4BeQIBaQEURFN1Ym1pc3Npb25EZXBvc2l0GEAA5AtUAgAAAAAAAAAAAAAABDUBIFRoZSBtaW5pbXVtIGFtb3VudCB0byBiZSB1c2VkIGFzIGEgZGVwb3NpdCBmb3IgYSBwdWJsaWMgcmVmZXJlbmR1bSBwcm9wb3NhbC4kTWF4UXVldWVkEBBkAAAABOQgTWF4aW11bSBzaXplIG9mIHRoZSByZWZlcmVuZHVtIHF1ZXVlIGZvciBhIHNpbmdsZSB0cmFjay5EVW5kZWNpZGluZ1RpbWVvdXQQEIATAwAIVQEgVGhlIG51bWJlciBvZiBibG9ja3MgYWZ0ZXIgc3VibWlzc2lvbiB0aGF0IGEgcmVmZXJlbmR1bSBtdXN0IGJlZ2luIGJlaW5nIGRlY2lkZWQgYnku5CBPbmNlIHRoaXMgcGFzc2VzLCB0aGVuIGFueW9uZSBtYXkgY2FuY2VsIHRoZSByZWZlcmVuZHVtLjRBbGFybUludGVydmFsEBABAAAADF0BIFF1YW50aXphdGlvbiBsZXZlbCBmb3IgdGhlIHJlZmVyZW5kdW0gd2FrZXVwIHNjaGVkdWxlci4gQSBoaWdoZXIgbnVtYmVyIHdpbGwgcmVzdWx0IGluXQEgZmV3ZXIgc3RvcmFnZSByZWFkcy93cml0ZXMgbmVlZGVkIGZvciBzbWFs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BAAETCBTdG9yZWQgcGFyYW1ldGVycy4BpQIBJQcAABsAGENsYWltcwEYQ2xhaW1zFBhDbGFpbXMAAQQG3QIYBAAAFFRvdGFsAQAYQAAAAAAAAAAAAAAAAAAAAAAAHFZlc3RpbmcAAQQG3QLlAgQAEHggVmVzdGluZyBzY2hlZHVsZSBmb3IgYSBjbGFpbS4NASBGaXJzdCBiYWxhbmNlIGlzIHRoZSB0b3RhbCBhbW91bnQgdGhhdCBzaG91bGQgYmUgaGVsZCBmb3IgdmVzdGluZy7kIFNlY29uZCBiYWxhbmNlIGlzIGhvdyBtdWNoIHNob3VsZCBiZSB1bmxvY2tlZCBwZXIgYmxvY2suzCBUaGUgYmxvY2sgbnVtYmVyIGlzIHdoZW4gdGhlIHZlc3Rpbmcgc2hvdWxkIHN0YXJ0LhxTaWduaW5nAAEEBt0C7QIEAATAIFRoZSBzdGF0ZW1lbnQga2luZCB0aGF0IG11c3QgYmUgc2lnbmVkLCBpZiBhbnkuJFByZWNsYWltcwABBAYA3QIEAAQtASBQcmUtY2xhaW1lZCBFdGhlcmV1bSBhY2NvdW50cywgYnkgdGhlIEFjY291bnQgSUQgdGhhdCB0aGV5IGFyZSBjbGFpbWVkIHRvLgHRAgE9BwQYUHJlZml4OHx4UGF5IFBBU3MgdG8gdGhlIFBhc2VvIGFjY291bnQ6AAEZChgAHFZlc3RpbmcBHFZlc3RpbmcIHFZlc3RpbmcAAQQCAB0KBAAE2CBJbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhlIHZlc3Rpbmcgb2YgYSBnaXZlbiBhY2NvdW50LjhTdG9yYWdlVmVyc2lvbgEAJQoEAAx8IFN0b3JhZ2UgdmVyc2lvbiBvZiB0aGUgcGFsbGV0LgAxASBOZXcgbmV0d29ya3Mgc3RhcnQgd2l0aCBsYXRlc3QgdmVyc2lvbiwgYXMgZGV0ZXJtaW5lZCBieSB0aGUgZ2VuZXNpcyBidWlsZC4B8QIBQQcIRE1pblZlc3RlZFRyYW5zZmVyGEAA5AtUAgAAAAAAAAAAAAAABOggVGhlIG1pbmltdW0gYW1vdW50IHRyYW5zZmVycmVkIHRvIGNhbGwgYHZlc3RlZF90cmFuc2ZlcmAuTE1heFZlc3RpbmdTY2hlZHVsZXMQEBwAAAAAASkKGQAcVXRpbGl0eQAB+QIBRQcETGJhdGNoZWRfY2FsbHNfbGltaXQQEKoqAAAEqCBUaGUgbGltaXQgb24gdGhlIG51bWJlciBvZiBiYXRjaGVkIGNhbGxzLgEtChoAFFByb3h5ARRQcm94eQgcUHJveGllcwEBBAUAMQpEAAAAAAAAAAAAAAAAAAAAAAAIRQEgVGhlIHNldCBvZiBhY2NvdW50IHByb3hpZXMuIE1hcHMgdGhlIGFjY291bnQgd2hpY2ggaGFzIGRlbGVnYXRlZCB0byB0aGUgYWNjb3VudHMhASB3aGljaCBhcmUgYmVpbmcgZGVsZWdhdGVkIHRvLCB0b2dldGhlciB3aXRoIHRoZSBhbW91bnQgaGVsZCBvbiBkZXBvc2l0LjRBbm5vdW5jZW1lbnRzAQEEBQBBCkQAAAAAAAAAAAAAAAAAAAAAAASsIFRoZSBhbm5vdW5jZW1lbnRzIG1hZGUgYnkgdGhlIHByb3h5IChrZXkpLgEBAwFJBxhAUHJveHlEZXBvc2l0QmFzZRhAAISylS4AAAAAAAAAAAAAABARASBUaGUgYmFzZSBhbW91bnQgb2YgY3VycmVuY3kgbmVlZGVkIHRvIHJlc2VydmUgZm9yIGNyZWF0aW5nIGEgcHJveHkuAAEBIFRoaXMgaXMgaGVsZCBmb3IgYW4gYWRkaXRpb25hbCBzdG9yYWdlIGl0ZW0gd2hvc2UgdmFsdWUgc2l6ZSBpcyUBIGBzaXplb2YoQmFsYW5jZSlgIGJ5dGVzIGFuZCB3aG9zZSBrZXkgc2l6ZSBpcyBgc2l6ZW9mKEFjY291bnRJZClgIGJ5dGVzLkhQcm94eURlcG9zaXRGYWN0b3IYQIBmqxMAAAAAAAAAAAAAAAAUvCBUaGUgYW1vdW50IG9mIGN1cnJlbmN5IG5lZWRlZCBwZXIgcHJveHkgYWRkZWQuADUBIFRoaXMgaXMgaGVsZCBmb3IgYWRkaW5nIDMyIGJ5dGVzIHBsdXMgYW4gaW5zdGFuY2Ugb2YgYFByb3h5VHlwZWAgbW9yZSBpbnRvIGFhASBwcmUtZXhpc3Rpbmcgc3RvcmFnZSB2YWx1ZS4gVGh1cywgd2hlbiBjb25maWd1cmluZyBgUHJveHlEZXBvc2l0RmFjdG9yYCBvbmUgc2hvdWxkIHRha2X0IGludG8gYWNjb3VudCBgMzIgKyBwcm94eV90eXBlLmVuY29kZSgpLmxlbigpYCBieXRlcyBvZiBkYXRhLihNYXhQcm94aWVzEBAgAAAABPAgVGhlIG1heGltdW0gYW1vdW50IG9mIHByb3hpZXMgYWxsb3dlZCBmb3IgYSBzaW5nbGUgYWNjb3VudC4oTWF4UGVuZGluZxAQIAAAAARFASBUaGUgbWF4aW11bSBhbW91bnQgb2YgdGltZS1kZWxheWVkIGFubm91bmNlbWVudHMgdGhhdCBhcmUgYWxsb3dlZCB0byBiZSBwZW5kaW5nLlxBbm5vdW5jZW1lbnREZXBvc2l0QmFzZRhAAISylS4AAAAAAAAAAAAAABAxASBUaGUgYmFzZSBhbW91bnQgb2YgY3VycmVuY3kgbmVlZGVkIHRvIHJlc2VydmUgZm9yIGNyZWF0aW5nIGFuIGFubm91bmNlbWVudC4ASQEgVGhpcyBpcyBoZWxkIHdoZW4gYSBuZXcgc3RvcmFnZSBpdGVtIGhvbGRpbmcgYSBgQmFsYW5jZWAgaXMgY3JlYXRlZCAodHlwaWNhbGx5IDE2ICBieXRlcykuZEFubm91bmNlbWVudERlcG9zaXRGYWN0b3IYQADNVicAAAAAAAAAAAAAAAAQ1CBUaGUgYW1vdW50IG9mIGN1cnJlbmN5IG5lZWRlZCBwZXIgYW5ub3VuY2VtZW50IG1hZGUuAFkBIFRoaXMgaXMgaGVsZCBmb3IgYWRkaW5nIGFuIGBBY2NvdW50SWRgLCBgSGFzaGAgYW5kIGBCbG9ja051bWJlcmAgKHR5cGljYWxseSA2OCBieXRlcymMIGludG8gYSBwcmUtZXhpc3Rpbmcgc3RvcmFnZSB2YWx1ZS4BUQodACBNdWx0aXNpZwEgTXVsdGlzaWcEJE11bHRpc2lncwABCAUCVQpZCgQABJQgVGhlIHNldCBvZiBvcGVuIG11bHRpc2lnIG9wZXJhdGlvbnMuAQ0DAU0HDCxEZXBvc2l0QmFzZRhAAIxhxS4AAAAAAAAAAAAAABhZASBUaGUgYmFzZSBhbW91bnQgb2YgY3VycmVuY3kgbmVlZGVkIHRvIHJlc2VydmUgZm9yIGNyZWF0aW5nIGEgbXVsdGlzaWcgZXhlY3V0aW9uIG9yIHRvhCBzdG9yZSBhIGRpc3BhdGNoIGNhbGwgZm9yIGxhdGVyLgABASBUaGlzIGlzIGhlbGQgZm9yIGFuIGFkZGl0aW9uYWwgc3RvcmFnZSBpdGVtIHdob3NlIHZhbHVlIHNpemUgaXMxASBgNCArIHNpemVvZigoQmxvY2tOdW1iZXIsIEJhbGFuY2UsIEFjY291bnRJZCkpYCBieXRlcyBhbmQgd2hvc2Uga2V5IHNpemUgaXOAIGAzMiArIHNpemVvZihBY2NvdW50SWQpYCBieXRlcy40RGVwb3NpdEZhY3RvchhAANASEwAAAAAAAAAAAAAAAAxVASBUaGUgYW1vdW50IG9mIGN1cnJlbmN5IG5lZWRlZCBwZXIgdW5pdCB0aHJlc2hvbGQgd2hlbiBjcmVhdGluZyBhIG11bHRpc2lnIGV4ZWN1dGlvbi4AJQEgVGhpcyBpcyBoZWxkIGZvciBhZGRpbmcgMzIgYnl0ZXMgbW9yZSBpbnRvIGEgcHJlLWV4aXN0aW5nIHN0b3JhZ2UgdmFsdWUuOE1heFNpZ25hdG9yaWVzEBBkAAAABOwgVGhlIG1heGltdW0gYW1vdW50IG9mIHNpZ25hdG9yaWVzIGFsbG93ZWQgaW4gdGhlIG11bHRpc2lnLgFhCh4AIEJvdW50aWVzASBCb3VudGllcxAsQm91bnR5Q291bnQBABAQAAAAAATAIE51bWJlciBvZiBib3VudHkgcHJvcG9zYWxzIHRoYXQgaGF2ZSBiZWVuIG1hZGUuIEJvdW50aWVzAAEEBRBlCgQABHggQm91bnRpZXMgdGhhdCBoYXZlIGJlZW4gbWFkZS5IQm91bnR5RGVzY3JpcHRpb25zAAEEBRBtCgQABIAgVGhlIGRlc2NyaXB0aW9uIG9mIGVhY2ggYm91bnR5LjxCb3VudHlBcHByb3ZhbHMBAIEJBAAE7CBCb3VudHkgaW5kaWNlcyB0aGF0IGhhdmUgYmVlbiBhcHByb3ZlZCBidXQgbm90IHlldCBmdW5kZWQuARkDAVEHJERCb3VudHlEZXBvc2l0QmFzZRhAAOQLVAIAAAAAAAAAAAAAAAToIFRoZSBhbW91bnQgaGVsZCBvbiBkZXBvc2l0IGZvciBwbGFjaW5nIGEgYm91bnR5IHByb3Bvc2FsLmBCb3VudHlEZXBvc2l0UGF5b3V0RGVsYXkQEAAAAAAEWQEgVGhlIGRlbGF5IHBlcmlvZCBmb3Igd2hpY2ggYSBib3VudHkgYmVuZWZpY2lhcnkgbmVlZCB0byB3YWl0IGJlZm9yZSBjbGFpbSB0aGUgcGF5b3V0LkhCb3VudHlVcGRhdGVQZXJpb2QQEIDGEwAEbCBCb3VudHkgZHVyYXRpb24gaW4gYmxvY2tzLmBDdXJhdG9yRGVwb3NpdE11bHRpcGxpZXKNCRAgoQcAEBkBIFRoZSBjdXJhdG9yIGRlcG9zaXQgaXMgY2FsY3VsYXRlZCBhcyBhIHBlcmNlbnRhZ2Ugb2YgdGhlIGN1cmF0b3IgZmVlLgA5ASBUaGlzIGRlcG9zaXQgaGFzIG9wdGlvbmFsIHVwcGVyIGFuZCBsb3dlciBib3VuZHMgd2l0aCBgQ3VyYXRvckRlcG9zaXRNYXhgIGFuZFQgYEN1cmF0b3JEZXBvc2l0TWluYC5EQ3VyYXRvckRlcG9zaXRNYXgBAkQBACBKqdEBAAAAAAAAAAAAAARJASBNYXhpbXVtIGFtb3VudCBvZiBmdW5kcyB0aGF0IHNob3VsZCBiZSBwbGFjZWQgaW4gYSBkZXBvc2l0IGZvciBtYWtpbmcgYSBwcm9wb3NhbC5EQ3VyYXRvckRlcG9zaXRNaW4BAkQBAOh2SBcAAAAAAAAAAAAAAARJASBNaW5pbXVtIGFtb3VudCBvZiBmdW5kcyB0aGF0IHNob3VsZCBiZSBwbGFjZWQgaW4gYSBkZXBvc2l0IGZvciBtYWtpbmcgYSBwcm9wb3NhbC5IQm91bnR5VmFsdWVNaW5pbXVtGEAA6HZIFwAAAAAAAAAAAAAABHAgTWluaW11bSB2YWx1ZSBmb3IgYSBib3VudHkuSERhdGFEZXBvc2l0UGVyQnl0ZRhAAOH1BQAAAAAAAAAAAAAAAARhASBUaGUgYW1vdW50IGhlbGQgb24gZGVwb3NpdCBwZXIgYnl0ZSB3aXRoaW4gdGhlIHRpcCByZXBvcnQgcmVhc29uIG9yIGJvdW50eSBkZXNjcmlwdGlvbi5MTWF4aW11bVJlYXNvbkxlbmd0aBAQAEAAAAyIIE1heGltdW0gYWNjZXB0YWJsZSByZWFzb24gbGVuZ3RoLgBlASBCZW5jaG1hcmtzIGRlcGVuZCBvbiB0aGlzIHZhbHVlLCBiZSBzdXJlIHRvIHVwZGF0ZSB3ZWlnaHRzIGZpbGUgd2hlbiBjaGFuZ2luZyB0aGlzIHZhbHVlAXEKIgA0Q2hpbGRCb3VudGllcwE0Q2hpbGRCb3VudGllcxRAQ2hpbGRCb3VudHlDb3VudAEAEBAAAAAABIAgTnVtYmVyIG9mIHRvdGFsIGNoaWxkIGJvdW50aWVzLkxQYXJlbnRDaGlsZEJvdW50aWVzAQEEBRAQEAAAAAAIsCBOdW1iZXIgb2YgY2hpbGQgYm91bnRpZXMgcGVyIHBhcmVudCBib3VudHku4CBNYXAgb2YgcGFyZW50IGJvdW50eSBpbmRleCB0byBudW1iZXIgb2YgY2hpbGQgYm91bnRpZXMuNENoaWxkQm91bnRpZXMAAQgFBYB1CgQABJQgQ2hpbGQgYm91bnRpZXMgdGhhdCBoYXZlIGJlZW4gYWRkZWQuXENoaWxkQm91bnR5RGVzY3JpcHRpb25zAAEEBRBtCgQABJggVGhlIGRlc2NyaXB0aW9uIG9mIGVhY2ggY2hpbGQtYm91bnR5LkxDaGlsZHJlbkN1cmF0b3JGZWVzAQEEBRAYQAAAAAAAAAAAAAAAAAAAAAAEAQEgVGhlIGN1bXVsYXRpdmUgY2hpbGQtYm91bnR5IGN1cmF0b3IgZmVlIGZvciBlYWNoIHBhcmVudCBib3VudHkuAR0DAVUHCGRNYXhBY3RpdmVDaGlsZEJvdW50eUNvdW50EBBkAAAABB0BIE1heGltdW0gbnVtYmVyIG9mIGNoaWxkIGJvdW50aWVzIHRoYXQgY2FuIGJlIGFkZGVkIHRvIGEgcGFyZW50IGJvdW50eS5cQ2hpbGRCb3VudHlWYWx1ZU1pbmltdW0YQADkC1QCAAAAAAAAAAAAAAAEiCBNaW5pbXVtIHZhbHVlIGZvciBhIGNoaWxkLWJvdW50eS4BfQomAGhFbGVjdGlvblByb3ZpZGVyTXVsdGlQaGFzZQFoRWxlY3Rpb25Qcm92aWRlck11bHRpUGhhc2UoFFJvdW5kAQAQEAEAAAAYrCBJbnRlcm5hbCBjb3VudGVyIGZvciB0aGUgbnVtYmVyIG9mIHJvdW5kcy4AVQEgVGhpcyBpcyB1c2VmdWwgZm9yIGRlLWR1cGxpY2F0aW9uIG9mIHRyYW5zYWN0aW9ucyBzdWJtaXR0ZWQgdG8gdGhlIHBvb2wsIGFuZCBnZW5lcmFsbCBkaWFnbm9zdGljcyBvZiB0aGUgcGFsbGV0LgBNASBUaGlzIGlzIG1lcmVseSBpbmNyZW1lbnRlZCBvbmNlIHBlciBldmVyeSB0aW1lIHRoYXQgYW4gdXBzdHJlYW0gYGVsZWN0YCBpcyBjYWxsZWQuMEN1cnJlbnRQaGFzZQEAYQcEAAQ8IEN1cnJlbnQgcGhhc2UuOFF1ZXVlZFNvbHV0aW9uAACBCgQADD0BIEN1cnJlbnQgYmVzdCBzb2x1dGlvbiwgc2lnbmVkIG9yIHVuc2lnbmVkLCBxdWV1ZWQgdG8gYmUgcmV0dXJuZWQgdXBvbiBgZWxlY3RgLgBgIEFsd2F5cyBzb3J0ZWQgYnkgc2NvcmUuIFNuYXBzaG90AACJCgQAEHAgU25hcHNob3QgZGF0YSBvZiB0aGUgcm91bmQuAF0BIFRoaXMgaXMgY3JlYXRlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzaWduZWQgcGhhc2UgYW5kIGNsZWFyZWQgdXBvbiBjYWxsaW5nIGBlbGVjdGAuKQEgTm90ZTogVGhpcyBzdG9yYWdlIHR5cGUgbXVzdCBvbmx5IGJlIG11dGF0ZWQgdGhyb3VnaCBbYFNuYXBzaG90V3JhcHBlcmBdLjhEZXNpcmVkVGFyZ2V0cwAAEAQAEMwgRGVzaXJlZCBudW1iZXIgb2YgdGFyZ2V0cyB0byBlbGVjdCBmb3IgdGhpcyByb3VuZC4AqCBPbmx5IGV4aXN0cyB3aGVuIFtgU25hcHNob3RgXSBpcyBwcmVzZW50LikBIE5vdGU6IFRoaXMgc3RvcmFnZSB0eXBlIG11c3Qgb25seSBiZSBtdXRhdGVkIHRocm91Z2ggW2BTbmFwc2hvdFdyYXBwZXJgXS5AU25hcHNob3RNZXRhZGF0YQAA+QMEABCYIFRoZSBtZXRhZGF0YSBvZiB0aGUgW2BSb3VuZFNuYXBzaG90YF0AqCBPbmx5IGV4aXN0cyB3aGVuIFtgU25hcHNob3RgXSBpcyBwcmVzZW50LikBIE5vdGU6IFRoaXMgc3RvcmFnZSB0eXBlIG11c3Qgb25seSBiZSBtdXRhdGVkIHRocm91Z2ggW2BTbmFwc2hvdFdyYXBwZXJgXS5kU2lnbmVkU3VibWlzc2lvbk5leHRJbmRleAEAEBAAAAAAJAEBIFRoZSBuZXh0IGluZGV4IHRvIGJlIGFzc2lnbmVkIHRvIGFuIGluY29taW5nIHNpZ25lZCBzdWJtaXNzaW9uLgB1ASBFdmVyeSBhY2NlcHRlZCBzdWJtaXNzaW9uIGlzIGFzc2lnbmVkIGEgdW5pcXVlIGluZGV4OyB0aGF0IGluZGV4IGlzIGJvdW5kIHRvIHRoYXQgcGFydGljdWxhcmUBIHN1Ym1pc3Npb24gZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgZWxlY3Rpb24uIE9uIGVsZWN0aW9uIGZpbmFsaXphdGlvbiwgdGhlIG5leHQgaW5kZXggaXMwIHJlc2V0IHRvIDAuAGkBIFdlIGNhbid0IGp1c3QgdXNlIGBTaWduZWRTdWJtaXNzaW9uSW5kaWNlcy5sZW4oKWAsIGJlY2F1c2UgdGhhdCdzIGEgYm91bmRlZCBzZXQ7IHBhc3QgaXRzWQEgY2FwYWNpdHksIGl0IHdpbGwgc2ltcGx5IHNhdHVyYXRlLiBXZSBjYW4ndCBqdXN0IGl0ZXJhdGUgb3ZlciBgU2lnbmVkU3VibWlzc2lvbnNNYXBgLPQgYmVjYXVzZSBpdGVyYXRpb24gaXMgc2xvdy4gSW5zdGVhZCwgd2Ugc3RvcmUgdGhlIHZhbHVlIGhlcmUuXFNpZ25lZFN1Ym1pc3Npb25JbmRpY2VzAQCVCgQAGG0BIEEgc29ydGVkLCBib3VuZGVkIHZlY3RvciBvZiBgKHNjb3JlLCBibG9ja19udW1iZXIsIGluZGV4KWAsIHdoZXJlIGVhY2ggYGluZGV4YCBwb2ludHMgdG8gYXggdmFsdWUgaW4gYFNpZ25lZFN1Ym1pc3Npb25zYC4AcQEgV2UgbmV2ZXIgbmVlZCB0byBwcm9jZXNzIG1vcmUgdGhhbiBhIHNpbmdsZSBzaWduZWQgc3VibWlzc2lvbiBhdCBhIHRpbWUuIFNpZ25lZCBzdWJtaXNzaW9uc3UBIGNhbiBiZSBxdWl0ZSBsYXJnZSwgc28gd2UncmUgd2lsbGluZyB0byBwYXkgdGhlIGNvc3Qgb2YgbXVsdGlwbGUgZGF0YWJhc2UgYWNjZXNzZXMgdG8gYWNjZXNzIQEgdGhlbSBvbmUgYXQgYSB0aW1lIGluc3RlYWQgb2YgcmVhZGluZyBhbmQgZGVjb2RpbmcgYWxsIG9mIHRoZW0gYXQgb25jZS5QU2lnbmVkU3VibWlzc2lvbnNNYXAAAQQFEKEKBAAcdCBVbmNoZWNrZWQsIHNpZ25lZCBzb2x1dGlvbnMuAGkBIFRvZ2V0aGVyIHdpdGggYFN1Ym1pc3Npb25JbmRpY2VzYCwgdGhpcyBzdG9yZXMgYSBib3VuZGVkIHNldCBvZiBgU2lnbmVkU3VibWlzc2lvbnNgIHdoaWxl7CBhbGxvd2luZyB1cyB0byBrZWVwIG9ubHkgYSBzaW5nbGUgb25lIGluIG1lbW9yeSBhdCBhIHRpbWUuAGkBIFR3b3ggbm90ZTogdGhlIGtleSBvZiB0aGUgbWFwIGlzIGFuIGF1dG8taW5jcmVtZW50aW5nIGluZGV4IHdoaWNoIHVzZXJzIGNhbm5vdCBpbnNwZWN0IG9y9CBhZmZlY3Q7IHdlIHNob3VsZG4ndCBuZWVkIGEgY3J5cHRvZ3JhcGhpY2FsbHkgc2VjdXJlIGhhc2hlci5UTWluaW11bVVudHJ1c3RlZFNjb3JlAAD1AwQAEF0BIFRoZSBtaW5pbXVtIHNjb3JlIHRoYXQgZWFjaCAndW50cnVzdGVkJyBzb2x1dGlvbiBtdXN0IGF0dGFpbiBpbiBvcmRlciB0byBiZSBjb25zaWRlcmVkKCBmZWFzaWJsZS4AuCBDYW4gYmUgc2V0IHZpYSBgc2V0X21pbmltdW1fdW50cnVzdGVkX3Njb3JlYC4BIQMBWQc4VEJldHRlclNpZ25lZFRocmVzaG9sZKwQAAAAAAhNASBUaGUgbWluaW11bSBhbW91bnQgb2YgaW1wcm92ZW1lbnQgdG8gdGhlIHNvbHV0aW9uIHNjb3JlIHRoYXQgZGVmaW5lcyBhIHNvbHV0aW9uIGFzeCAiYmV0dGVyIiBpbiB0aGUgU2lnbmVkIHBoYXNlLjhPZmZjaGFpblJlcGVhdBAQBAAAABC0IFRoZSByZXBlYXQgdGhyZXNob2xkIG9mIHRoZSBvZmZjaGFpbiB3b3JrZXIuAGEBIEZvciBleGFtcGxlLCBpZiBpdCBpcyA1LCB0aGF0IG1lYW5zIHRoYXQgYXQgbGVhc3QgNSBibG9ja3Mgd2lsbCBlbGFwc2UgYmV0d2VlbiBhdHRlbXB0c4QgdG8gc3VibWl0IHRoZSB3b3JrZXIncyBzb2x1dGlvbi48TWluZXJUeFByaW9yaXR5MCBlZmZmZmZm5gQlASBUaGUgcHJpb3JpdHkgb2YgdGhlIHVuc2lnbmVkIHRyYW5zYWN0aW9uIHN1Ym1pdHRlZCBpbiB0aGUgdW5zaWduZWQtcGhhc2VQU2lnbmVkTWF4U3VibWlzc2lvbnMQEBAAAAAc5CBNYXhpbXVtIG51bWJlciBvZiBzaWduZWQgc3VibWlzc2lvbnMgdGhhdCBjYW4gYmUgcXVldWVkLgBVASBJdCBpcyBiZXN0IHRvIGF2b2lkIGFkanVzdGluZyB0aGlzIGR1cmluZyBhbiBlbGVjdGlvbiwgYXMgaXQgaW1wYWN0cyBkb3duc3RyZWFtIGRhdGFlASBzdHJ1Y3R1cmVzLiBJbiBwYXJ0aWN1bGFyLCBgU2lnbmVkU3VibWlzc2lvbkluZGljZXM8VD5gIGlzIGJvdW5kZWQgb24gdGhpcyB2YWx1ZS4gSWYgeW919CB1cGRhdGUgdGhpcyB2YWx1ZSBkdXJpbmcgYW4gZWxlY3Rpb24sIHlvdSBfbXVzdF8gZW5zdXJlIHRoYXRNASBgU2lnbmVkU3VibWlzc2lvbkluZGljZXMubGVuKClgIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgbmV3IHZhbHVlLiBPdGhlcndpc2Us8CBhdHRlbXB0cyB0byBzdWJtaXQgbmV3IHNvbHV0aW9ucyBtYXkgY2F1c2UgYSBydW50aW1lIHBhbmljLjxTaWduZWRNYXhXZWlnaHQoQAsIx3JYVQETo3A9CtejcL0UlCBNYXhpbXVtIHdlaWdodCBvZiBhIHNpZ25lZCBzb2x1dGlvbi4AXQEgSWYgW2BDb25maWc6Ok1pbmVyQ29uZmlnYF0gaXMgYmVpbmcgaW1wbGVtZW50ZWQgdG8gc3VibWl0IHNpZ25lZCBzb2x1dGlvbnMgKG91dHNpZGUgb2Y9ASB0aGlzIHBhbGxldCksIHRoZW4gW2BNaW5lckNvbmZpZzo6c29sdXRpb25fd2VpZ2h0YF0gaXMgdXNlZCB0byBjb21wYXJlIGFnYWluc3QwIHRoaXMgdmFsdWUuQFNpZ25lZE1heFJlZnVuZHMQEAQAAAAEGQEgVGhlIG1heGltdW0gYW1vdW50IG9mIHVuY2hlY2tlZCBzb2x1dGlvbnMgdG8gcmVmdW5kIHRoZSBjYWxsIGZlZSBmb3IuQFNpZ25lZFJld2FyZEJhc2UYQADkC1QCAAAAAAAAAAAAAAAEiCBCYXNlIHJld2FyZCBmb3IgYSBzaWduZWQgc29sdXRpb25EU2lnbmVkRGVwb3NpdEJ5dGUYQHh9AQAAAAAAAAAAAAAAAAAEoCBQZXItYnl0ZSBkZXBvc2l0IGZvciBhIHNpZ25lZCBzb2x1dGlvbi5MU2lnbmVkRGVwb3NpdFdlaWdodBhAAAAAAAAAAAAAAAAAAAAAAASoIFBlci13ZWlnaHQgZGVwb3NpdCBmb3IgYSBzaWduZWQgc29sdXRpb24uKE1heFdpbm5lcnMQELAEAAAQNQEgVGhlIG1heGltdW0gbnVtYmVyIG9mIHdpbm5lcnMgdGhhdCBjYW4gYmUgZWxlY3RlZCBieSB0aGlzIGBFbGVjdGlvblByb3ZpZGVyYEAgaW1wbGVtZW50YXRpb24uAFEBIE5vdGU6IFRoaXMgbXVzdCBhbHdheXMgYmUgZ3JlYXRlciBvciBlcXVhbCB0byBgVDo6RGF0YVByb3ZpZGVyOjpkZXNpcmVkX3RhcmdldHMoKWAuOE1pbmVyTWF4TGVuZ3RoEBAAADYAADhNaW5lck1heFdlaWdodChACwjHclhVAROjcD0K16NwvQBUTWluZXJNYXhWb3Rlc1BlclZvdGVyEBAQAAAAADxNaW5lck1heFdpbm5lcnMQELAEAAAAAaUKJAAkVm90ZXJMaXN0ASRWb3Rlckxpc3QMJExpc3ROb2RlcwABBAUAqQoEAAyAIEEgc2luZ2xlIG5vZGUsIHdpdGhpbiBzb21lIGJhZy4ABQEgTm9kZXMgc3RvcmUgbGlua3MgZm9yd2FyZCBhbmQgYmFjayB3aXRoaW4gdGhlaXIgcmVzcGVjdGl2ZSBiYWdzLkxDb3VudGVyRm9yTGlzdE5vZGVzAQAQEAAAAAAErENvdW50ZXIgZm9yIHRoZSByZWxhdGVkIGNvdW50ZWQgc3RvcmFnZSBtYXAgTGlzdEJhZ3MAAQQFMK0KBAAMZCBBIGJhZyBzdG9yZWQgaW4gc3RvcmFnZS4AGQEgU3RvcmVzIGEgYEJhZ2Agc3RydWN0LCB3aGlj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ZmllcyB0aGVhASB0aHJlc2hvbGRzIHNlcGFyYXRpbmcgdGhlIGJhZ3MuIEFuIGlkJ3MgYmFnIGlzIHRoZSBsYXJnZXN0IGJhZyBmb3Igd2hpY2ggdGhlIGlkJ3Mgc2NvcmW4IGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byBpdHMgdXBwZXIgdGhyZXNob2xkLgBlASBXaGVuIGlkcyBhcmUgaXRlcmF0ZWQsIGhpZ2hlciBiYWdzIGFyZSBpdGVyYXRlZCBjb21wbGV0ZWx5IGJlZm9yZSBsb3dlciBiYWdzLiBUaGlzIG1lYW5zWQEgdGhhdCBpdGVyYXRpb24gaXMgX3NlbWktc29ydGVkXzogaWRzIG9mIGhpZ2hlciBzY29yZSB0ZW5kIHRvIGNvbWUgYmVmb3JlIGlkcyBvZiBsb3dlci0BIHNjb3JlLCBidXQgcGVlciBpZHMgd2l0aGluIGEgcGFydGljdWxhciBiYWcgYXJlIHNvcnRlZCBpbiBpbnNlcnRpb24gb3JkZXIuAGggIyBFeHByZXNzaW5nIHRoZSBjb25zdGFudABNASBUaGlzIGNvbnN0YW50IG11c3QgYmUgc29ydGVkIGluIHN0cmljdGx5IGluY3JlYXNpbmcgb3JkZXIuIER1cGxpY2F0ZSBpdGVtcyBhcmUgbm90LCBwZXJtaXR0ZWQuAEEBIFRoZXJlIGlzIGFuIGltcGxpZWQgdXBwZXIgbGltaXQgb2YgYFNjb3JlOjpNQVhgOyB0aGF0IHZhbHVlIGRvZXMgbm90IG5lZWQgdG8gYmUhASBzcGVjaWZpZWQgd2l0aGluIHRoZSBiYWcuIEZvciBhbnkgdHdvIHRocmVzaG9sZCBsaXN0cywgaWYgb25lIGVuZHMgd2l0aDEBIGBTY29yZTo6TUFYYCwgdGhlIG90aGVyIG9uZSBkb2VzIG5vdCwgYW5kIHRoZXkgYXJlIG90aGVyd2lzZSBlcXVhbCwgdGhlIHR3b3wgbGlzdHMgd2lsbCBiZWhhdmUgaWRlbnRpY2FsbHkuADggIyBDYWxjdWxhdGlvbgBVASBJdCBpcyByZWNvbW1lbmRlZCB0byBnZW5lcmF0ZSB0aGUgc2V0IG9mIHRocmVzaG9sZHMgaW4gYSBnZW9tZXRyaWMgc2VyaWVzLCBzdWNoIHRoYXRBASB0aGVyZSBleGlzdHMgc29tZSBjb25zdGFudCByYXRpbyBzdWNoIHRoYXQgYHRocmVzaG9sZFtrICsgMV0gPT0gKHRocmVzaG9sZFtrXSAq0CBjb25zdGFudF9yYXRpbykubWF4KHRocmVzaG9sZFtrXSArIDEpYCBmb3IgYWxsIGBrYC4AWQEgVGhlIGhlbHBlcnMgaW4gdGhlIGAvdXRpbHMvZnJhbWUvZ2VuZXJhdGUtYmFnc2AgbW9kdWxlIGNhbiBzaW1wbGlmeSB0aGlzIGNhbGN1bGF0aW9uLgAsICMgRXhhbXBsZXMAUQEgLSBJZiBgQmFnVGhyZXNob2xkczo6Z2V0KCkuaXNfZW1wdHkoKWAsIHRoZW4gYWxsIGlkcyBhcmUgcHV0IGludG8gdGhlIHNhbWUgYmFnLCBhbmSwICAgaXRlcmF0aW9uIGlzIHN0cmljdGx5IGluIGluc2VydGlvbiBvcmRlci5hASAtIElmIGBCYWdUaHJlc2hvbGRzOjpnZXQoKS5sZW4oKSA9PSA2NGAsIGFuZCB0aGUgdGhyZXNob2xkcyBhcmUgZGV0ZXJtaW5lZCBhY2NvcmRpbmcgdG8RASAgIHRoZSBwcm9jZWR1cmUgZ2l2ZW4gYWJvdmUsIHRoZW4gdGhlIGNvbnN0YW50IHJhdGlvIGlzIGVxdWFsIHRvIDIuZQEgLSBJZiBgQmFnVGhyZXNob2xkczo6Z2V0KCkubGVuKCkgPT0gMjAwYCwgYW5kIHRoZSB0aHJlc2hvbGRzIGFyZSBkZXRlcm1pbmVkIGFjY29yZGluZyB0b1kBICAgdGhlIHByb2NlZHVyZSBnaXZlbiBhYm92ZSwgdGhlbiB0aGUgY29uc3RhbnQgcmF0aW8gaXMgYXBwcm94aW1hdGVseSBlcXVhbCB0byAxLjI0OC5hASAtIElmIHRoZSB0aHJlc2hvbGQgbGlzdCBiZWdpbnMgYFsxLCAyLCAzLCAuLi5dYCwgdGhlbiBhbiBpZCB3aXRoIHNjb3JlIDAgb3IgMSB3aWxsIGZhbGzwICAgaW50byBiYWcgMCwgYW4gaWQgd2l0aCBzY29yZSAyIHdpbGwgZmFsbCBpbnRvIGJhZyAxLCBldGMuADAgIyBNaWdyYXRpb24AYQEgSW4gdGhlIGV2ZW50IHRoYXQgdGhpcyBsaXN0IGV2ZXIgY2hhbmdlcywgYSBjb3B5IG9mIHRoZSBvbGQgYmFncyBsaXN0IG11c3QgYmUgcmV0YWluZWQuXQEgV2l0aCB0aGF0IGBMaXN0OjptaWdyYXRlYCBjYW4gYmUgY2FsbGVkLCB3aGljaCB3aWxsIHBlcmZvcm0gdGhlIGFwcHJvcHJpYXRlIG1pZ3JhdGlvbi4BtQolADxOb21pbmF0aW9uUG9vbHMBPE5vbWluYXRpb25Qb29sc1RAVG90YWxWYWx1ZUxvY2tlZAEAGEAAAAAAAAAAAAAAAAAAAAAAFIwgVGhlIHN1bSBvZiBmdW5kcyBhY3Jvc3MgYWxsIHBvb2xzLgBxASBUaGlzIG1pZ2h0IGJlIGxvd2VyIGJ1dCBuZXZlciBoaWdoZXIgdGhhbiB0aGUgc3VtIG9mIGB0b3RhbF9iYWxhbmNlYCBvZiBhbGwgW2BQb29sTWVtYmVyc2BdWQEgYmVjYXVzZSBjYWxsaW5nIGBwb29sX3dpdGhkcmF3X3VuYm9uZGVkYCBtaWdodCBkZWNyZWFzZSB0aGUgdG90YWwgc3Rha2Ugb2YgdGhlIHBvb2wncykBIGBib25kZWRfYWNjb3VudGAgd2l0aG91dCBhZGp1c3RpbmcgdGhlIHBhbGxldC1pbnRlcm5hbCBgVW5ib25kaW5nUG9vbGAncy4sTWluSm9pbkJvbmQBABhAAAAAAAAAAAAAAAAAAAAAAAScIE1pbmltdW0gYW1vdW50IHRvIGJvbmQgdG8gam9pbiBhIHBvb2wuNE1pbkNyZWF0ZUJvbmQBABhAAAAAAAAAAAAAAAAAAAAAABygIE1pbmltdW0gYm9uZCByZXF1aXJlZCB0byBjcmVhdGUgYSBwb29sLgBlASBUaGlzIGlzIHRoZSBhbW91bnQgdGhhdCB0aGUgZGVwb3NpdG9yIG11c3QgcHV0IGFzIHRoZWlyIGluaXRpYWwgc3Rha2UgaW4gdGhlIHBvb2wsIGFzIGFuiCBpbmRpY2F0aW9uIG9mICJza2luIGluIHRoZSBnYW1lIi4AaQEgVGhpcyBpcyB0aGUgdmFsdWUgdGhhdCB3aWxsIGFsd2F5cyBleGlzdCBpbiB0aGUgc3Rha2luZyBsZWRnZXIgb2YgdGhlIHBvb2wgYm9uZGVkIGFjY291bnSAIHdoaWxlIGFsbCBvdGhlciBhY2NvdW50cyBsZWF2ZS4gTWF4UG9vbHMAABAEAAhpASBNYXhpbXVtIG51bWJlciBvZiBub21pbmF0aW9uIHBvb2xzIHRoYXQgY2FuIGV4aXN0LiBJZiBgTm9uZWAsIHRoZW4gYW4gdW5ib3VuZGVkIG51bWJlciBvZkQgcG9vbHMgY2FuIGV4aXN0LjhNYXhQb29sTWVtYmVycwAAEAQACEkBIE1heGltdW0gbnVtYmVyIG9mIG1lbWJlcnMgdGhhdCBjYW4gZXhpc3QgaW4gdGhlIHN5c3RlbS4gSWYgYE5vbmVgLCB0aGVuIHRoZSBjb3VudLggbWVtYmVycyBhcmUgbm90IGJvdW5kIG9uIGEgc3lzdGVtIHdpZGUgYmFzaXMuVE1heFBvb2xNZW1iZXJzUGVyUG9vbAAAEAQACEEBIE1heGltdW0gbnVtYmVyIG9mIG1lbWJlcnMgdGhhdCBtYXkgYmVsb25nIHRvIHBvb2wuIElmIGBOb25lYCwgdGhlbiB0aGUgY291bnQgb2aoIG1lbWJlcnMgaXMgbm90IGJvdW5kIG9uIGEgcGVyIHBvb2wgYmFzaXMuTEdsb2JhbE1heENvbW1pc3Npb24AAKwEAAxpASBUaGUgbWF4aW11bSBjb21taXNzaW9uIHRoYXQgY2FuIGJlIGNoYXJnZWQgYnkgYSBwb29sLiBVc2VkIG9uIGNvbW1pc3Npb24gcGF5b3V0cyB0byBib3VuZCUBIHBvb2wgY29tbWlzc2lvbnMgdGhhdCBhcmUgPiBgR2xvYmFsTWF4Q29tbWlzc2lvbmAsIG5lY2Vzc2FyeSBpZiBhIGZ1dHVyZQ0BIGBHbG9iYWxNYXhDb21taXNzaW9uYCBpcyBsb3dlciB0aGFuIHNvbWUgY3VycmVudCBwb29sIGNvbW1pc3Npb25zLixQb29sTWVtYmVycwABBAUAvQoEAAxAIEFjdGl2ZSBtZW1iZXJzLgDQIFRXT1gtTk9URTogU0FGRSBzaW5jZSBgQWNjb3VudElkYCBpcyBhIHNlY3VyZSBoYXNoLlRDb3VudGVyRm9yUG9vbE1lbWJlcnMBABAQAAAAAASsQ291bnRlciBmb3IgdGhlIHJlbGF0ZWQgY291bnRlZCBzdG9yYWdlIG1hcCxCb25kZWRQb29scwABBAUQyQoEAARoIFN0b3JhZ2UgZm9yIGJvbmRlZCBwb29scy5UQ291bnRlckZvckJvbmRlZFBvb2xzAQAQEAAAAAAErENvdW50ZXIgZm9yIHRoZSByZWxhdGVkIGNvdW50ZWQgc3RvcmFnZSBtYXAsUmV3YXJkUG9vbHMAAQQFEN0KBAAIdQEgUmV3YXJkIHBvb2xzLiBUaGlzIGlzIHdoZXJlIHRoZXJlIHJld2FyZHMgZm9yIGVhY2ggcG9vbCBhY2N1bXVsYXRlLiBXaGVuIGEgbWVtYmVycyBwYXlvdXQgaXNZASBjbGFpbWVkLCB0aGUgYmFsYW5jZSBjb21lcyBvdXQgb2YgdGhlIHJld2FyZCBwb29sLiBLZXllZCBieSB0aGUgYm9uZGVkIHBvb2xzIGFjY291bnQuVENvdW50ZXJGb3JSZXdhcmRQb29scwEAEBAAAAAABKxDb3VudGVyIGZvciB0aGUgcmVsYXRlZCBjb3VudGVkIHN0b3JhZ2UgbWFwPFN1YlBvb2xzU3RvcmFnZQABBAUQ4QoEAAgZASBHcm91cHMgb2YgdW5ib25kaW5nIHBvb2xzLiBFYWNoIGdyb3VwIG9mIHVuYm9uZGluZyBwb29scyBiZWxvbmdzIHRvIGEpASBib25kZWQgcG9vbCwgaGVuY2UgdGhlIG5hbWUgc3ViLXBvb2xzLiBLZXllZCBieSB0aGUgYm9uZGVkIHBvb2xzIGFjY291bnQuZENvdW50ZXJGb3JTdWJQb29sc1N0b3JhZ2UBABAQAAAAAASsQ291bnRlciBmb3IgdGhlIHJlbGF0ZWQgY291bnRlZCBzdG9yYWdlIG1hcCBNZXRhZGF0YQEBBAUQ+QoEAARcIE1ldGFkYXRhIGZvciB0aGUgcG9vbC5IQ291bnRlckZvck1ldGFkYXRhAQAQEAAAAAAErENvdW50ZXIgZm9yIHRoZSByZWxhdGVkIGNvdW50ZWQgc3RvcmFnZSBtYXAoTGFzdFBvb2xJZAEAEBAAAAAABNAgRXZlciBpbmNyZWFzaW5nIG51bWJlciBvZiBhbGwgcG9vbHMgY3JlYXRlZCBzbyBmYXIuTFJldmVyc2VQb29sSWRMb29rdXAAAQQFABAEABDcIEEgcmV2ZXJzZSBsb29rdXAgZnJvbSB0aGUgcG9vbCdzIGFjY291bnQgaWQgdG8gaXRzIGlkLgB1ASBUaGlzIGlzIG9ubHkgdXNlZCBmb3Igc2xhc2hpbmcgYW5kIG9uIGF1dG9tYXRpYyB3aXRoZHJhdyB1cGRhdGUuIEluIGFsbCBvdGhlciBpbnN0YW5jZXMsIHRoZSUBIHBvb2wgaWQgaXMgdXNlZCwgYW5kIHRoZSBhY2NvdW50cyBhcmUgZGV0ZXJtaW5pc3RpY2FsbHkgZGVyaXZlZCBmcm9tIGl0LnRDb3VudGVyRm9yUmV2ZXJzZVBvb2xJZExvb2t1cAEAEBAAAAAABKxDb3VudGVyIGZvciB0aGUgcmVsYXRlZCBjb3VudGVkIHN0b3JhZ2UgbWFwQENsYWltUGVybWlzc2lvbnMBAQQFADUEBAIEAQEgTWFwIGZyb20gYSBwb29sIG1lbWJlciBhY2NvdW50IHRvIHRoZWlyIG9wdGVkIGNsYWltIHBlcm1pc3Npb24uARkEAW0HDCBQYWxsZXRJZJEJIHB5L25vcGxzBIQgVGhlIG5vbWluYXRpb24gcG9vbCdzIHBhbGxldCBpZC5ITWF4UG9pbnRzVG9CYWxhbmNlCAQKMB0BIFRoZSBtYXhpbXVtIHBvb2wgcG9pbnRzLXRvLWJhbGFuY2UgcmF0aW8gdGhhdCBhbiBgb3BlbmAgcG9vbCBjYW4gaGF2ZS4AVQEgVGhpcyBpcyBpbXBvcnRhbnQgaW4gdGhlIGV2ZW50IHNsYXNoaW5nIHRha2VzIHBsYWNlIGFuZCB0aGUgcG9vbCdzIHBvaW50cy10by1iYWxhbmNlfCByYXRpbyBiZWNvbWVzIGRpc3Byb3BvcnRpb25hbC4AZQEgTW9yZW92ZXIsIHRoaXMgcmVsYXRlcyB0byB0aGUgYFJld2FyZENvdW50ZXJgIHR5cGUgYXMgd2VsbCwgYXMgdGhlIGFyaXRobWV0aWMgb3BlcmF0aW9uc1UBIGFyZSBhIGZ1bmN0aW9uIG9mIG51bWJlciBvZiBwb2ludHMsIGFuZCBieSBzZXR0aW5nIHRoaXMgdmFsdWUgdG8gZS5nLiAxMCwgeW91IGVuc3VyZWUBIHRoYXQgdGhlIHRvdGFsIG51bWJlciBvZiBwb2ludHMgaW4gdGhlIHN5c3RlbSBhcmUgYXQgbW9zdCAxMCB0aW1lcyB0aGUgdG90YWxfaXNzdWFuY2Ugb2acIHRoZSBjaGFpbiwgaW4gdGhlIGFic29sdXRlIHdvcnNlIGNhc2UuAEkBIEZvciBhIHZhbHVlIG9mIDEwLCB0aGUgdGhyZXNob2xkIHdvdWxkIGJlIGEgcG9vbCBwb2ludHMtdG8tYmFsYW5jZSByYXRpbyBvZiAxMDoxLjEBIFN1Y2ggYSBzY2VuYXJpbyB3b3VsZCBhbHNvIGJlIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBwb29sIGJlaW5nIDkwJSBzbGFzaGVkLjBNYXhVbmJvbmRpbmcQECAAAAAEPQEgVGhlIG1heGltdW0gbnVtYmVyIG9mIHNpbXVsdGFuZW91cyB1bmJvbmRpbmcgY2h1bmtzIHRoYXQgY2FuIGV4aXN0IHBlciBtZW1iZXIuAf0KJwAsRmFzdFVuc3Rha2UBLEZhc3RVbnN0YWtlEBBIZWFkAAAFCwQADMAgVGhlIGN1cnJlbnQgImhlYWQgb2YgdGhlIHF1ZXVlIiBiZWluZyB1bnN0YWtlZC4AKQEgVGhlIGhlYWQgaW4gaXRzZWxmIGNhbiBiZSBhIGJhdGNoIG9mIHVwIHRvIFtgQ29uZmlnOjpCYXRjaFNpemVgXSBzdGFrZXJzLhRRdWV1ZQABBAUAGAQADMAgVGhlIG1hcCBvZiBhbGwgYWNjb3VudHMgd2lzaGluZyB0byBiZSB1bnN0YWtlZC4AOQEgS2VlcHMgdHJhY2sgb2YgYEFjY291bnRJZGAgd2lzaGluZyB0byB1bnN0YWtlIGFuZCBpdCdzIGNvcnJlc3BvbmRpbmcgZGVwb3NpdC48Q291bnRlckZvclF1ZXVlAQAQEAAAAAAErENvdW50ZXIgZm9yIHRoZSByZWxhdGVkIGNvdW50ZWQgc3RvcmFnZSBtYXBMRXJhc1RvQ2hlY2tQZXJCbG9jawEAEBAAAAAAIIwgTnVtYmVyIG9mIGVyYXMgdG8gY2hlY2sgcGVyIGJsb2NrLgA1ASBJZiBzZXQgdG8gMCwgdGhpcyBwYWxsZXQgZG9lcyBhYnNvbHV0ZWx5IG5vdGhpbmcuIENhbm5vdCBiZSBzZXQgdG8gbW9yZSB0aGFukCBbYENvbmZpZzo6TWF4RXJhc1RvQ2hlY2tQZXJCbG9ja2BdLgBlASBCYXNlZCBvbiB0aGUgYW1vdW50IG9mIHdlaWdodCBhdmFpbGFibGUgYXQgW2BQYWxsZXQ6Om9uX2lkbGVgXSwgdXAgdG8gdGhpcyBtYW55IGVyYXMgYXJlXQEgY2hlY2tlZC4gVGhlIGNoZWNraW5nIGlzIHJlcHJlc2VudGVkIGJ5IHVwZGF0aW5nIFtgVW5zdGFrZVJlcXVlc3Q6OmNoZWNrZWRgXSwgd2hpY2ggaXNQIHN0b3JlZCBpbiBbYEhlYWRgXS4BTQQBcQcEHERlcG9zaXQYQADkC1QCAAAAAAAAAAAAAAAIZQEgRGVwb3NpdCB0byB0YWtlIGZvciB1bnN0YWtpbmcsIHRvIG1ha2Ugc3VyZSB3ZSdyZSBhYmxlIHRvIHNsYXNoIHRoZSBpdCBpbiBvcmRlciB0byBjb3ZlcsAgdGhlIGNvc3RzIG9mIHJlc291cmNlcyBvbiB1bnN1Y2Nlc3NmdWwgdW5zdGFrZS4BEQsoAEBQYXJhY2hhaW5zT3JpZ2luAAAAAAAyEHkBIFRoZXJlIGlzIG5vIHdheSB0byByZWdpc3RlciBhbiBvcmlnaW4gdHlwZSBpbiBgY29uc3RydWN0X3J1bnRpbWVgIHdpdGhvdXQgYSBwYWxsZXQgdGhlIG9yaWdpbjAgYmVsb25ncyB0by4AdQEgVGhpcyBtb2R1bGUgZnVsZmlsbHMgb25seSB0aGUgc2luZ2xlIHB1cnBvc2Ugb2YgaG91c2luZyB0aGUgYE9yaWdpbmAgaW4gYGNvbnN0cnVjdF9ydW50aW1lYC40Q29uZmlndXJhdGlvbgE0Q29uZmlndXJhdGlvbgwwQWN0aXZlQ29uZmlnAQAVC0EDAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAAZAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAgAAAAIAAAACAAAAAAEAAAABAAAAAQAAAAABAAAAAAAAAAAAAAAQJwAAgLLmDoDDyQGAlpgAAAAAAAAAAAAAAAAABQAAAATIIFRoZSBhY3RpdmUgY29uZmlndXJhdGlvbiBmb3IgdGhlIGN1cnJlbnQgc2Vzc2lvbi44UGVuZGluZ0NvbmZpZ3MBABkLBAAcfCBQZW5kaW5nIGNvbmZpZ3VyYXRpb24gY2hhbmdlcy4AWQEgVGhpcyBpcyBhIGxpc3Qgb2YgY29uZmlndXJhdGlvbiBjaGFuZ2VzLCBlYWNoIHdpdGggYSBzZXNzaW9uIGluZGV4IGF0IHdoaWNoIGl0IHNob3VsZDAgYmUgYXBwbGllZC4AYQEgVGhlIGxpc3QgaXMgc29ydGVkIGFzY2VuZGluZyBieSBzZXNzaW9uIGluZGV4LiBBbHNvLCB0aGlzIGxpc3QgY2FuIG9ubHkgY29udGFpbiBhdCBtb3N0/CAyIGl0ZW1zOiBmb3IgdGhlIG5leHQgc2Vzc2lvbiBhbmQgZm9yIHRoZSBgc2NoZWR1bGVkX3Nlc3Npb25gLlhCeXBhc3NDb25zaXN0ZW5jeUNoZWNrAQAgBAAIYQEgSWYgdGhpcyBpcyBzZXQsIHRoZW4gdGhlIGNvbmZpZ3VyYXRpb24gc2V0dGVycyB3aWxsIGJ5cGFzcyB0aGUgY29uc2lzdGVuY3kgY2hlY2tzLiBUaGlztCBpcyBtZWFudCB0byBiZSB1c2VkIG9ubHkgYXMgdGhlIGxhc3QgcmVzb3J0LgFRBAAAASELMwAsUGFyYXNTaGFyZWQBLFBhcmFzU2hhcmVkEExDdXJyZW50U2Vzc2lvbkluZGV4AQAQEAAAAAAEbCBUaGUgY3VycmVudCBzZXNzaW9uIGluZGV4LlhBY3RpdmVWYWxpZGF0b3JJbmRpY2VzAQAlCwQACAkBIEFsbCB0aGUgdmFsaWRhdG9ycyBhY3RpdmVseSBwYXJ0aWNpcGF0aW5nIGluIHBhcmFjaGFpbiBjb25zZW5zdXMusCBJbmRpY2VzIGFyZSBpbnRvIHRoZSBicm9hZGVyIHZhbGlkYXRvciBzZXQuTEFjdGl2ZVZhbGlkYXRvcktleXMBACkLBAAIVQEgVGhlIHBhcmFjaGFpbiBhdHRlc3RhdGlvbiBrZXlzIG9mIHRoZSB2YWxpZGF0b3JzIGFjdGl2ZWx5IHBhcnRpY2lwYXRpbmcgaW4gcGFyYWNoYWluHQEgY29uc2Vuc3VzLiBUaGlzIHNob3VsZCBiZSB0aGUgc2FtZSBsZW5ndGggYXMgYEFjdGl2ZVZhbGlkYXRvckluZGljZXNgLkxBbGxvd2VkUmVsYXlQYXJlbnRzAQAtCxQAAAAAAARsIEFsbCBhbGxvd2VkIHJlbGF5LXBhcmVudHMuAXUEAAAANAA0UGFyYUluY2x1c2lvbgE0UGFyYUluY2x1c2lvbgQIVjEAAQQFjQI5CwQAFGEBIENhbmRpZGF0ZXMgcGVuZGluZyBhdmFpbGFiaWxpdHkgYnkgYFBhcmFJZGAuIFRoZXkgZm9ybSBhIGNoYWluIHN0YXJ0aW5nIGZyb20gdGhlIGxhdGVzdGwgaW5jbHVkZWQgaGVhZCBvZiB0aGUgcGFyYS5hASBVc2UgYSBkaWZmZXJlbnQgcHJlZml4IHBvc3QtbWlncmF0aW9uIHRvIHYxLCBzaW5jZSB0aGUgdjAgYFBlbmRpbmdBdmFpbGFiaWxpdHlgIHN0b3JhZ2VxASB3b3VsZCBvdGhlcndpc2UgaGF2ZSB0aGUgZXhhY3Qgc2FtZSBwcmVmaXggd2hpY2ggY291bGQgY2F1c2UgdW5kZWZpbmVkIGJlaGF2aW91ciB3aGVuIGRvaW5nPCB0aGUgbWlncmF0aW9uLgF5BAF1BwABQQs1ADBQYXJhSW5oZXJlbnQBMFBhcmFJbmhlcmVudAggSW5jbHVkZWQAAIwEABjsIFdoZXRoZXIgdGhlIHBhcmFzIGluaGVyZW50IHdhcyBpbmNsdWRlZCB3aXRoaW4gdGhpcyBibG9jay4AaQEgVGhlIGBPcHRpb248KCk+YCBpcyBlZmZlY3RpdmVseSBhIGBib29sYCwgYnV0IGl0IG5ldmVyIGhpdHMgc3RvcmFnZSBpbiB0aGUgYE5vbmVgIHZhcmlhbnS8IGR1ZSB0byB0aGUgZ3VhcmFudGVlcyBvZiBGUkFNRSdzIHN0b3JhZ2UgQVBJcy4ASQEgSWYgdGhpcyBpcyBgTm9uZWAgYXQgdGhlIGVuZCBvZiB0aGUgYmxvY2ssIHdlIHBhbmljIGFuZCByZW5kZXIgdGhlIGJsb2NrIGludmFsaWQuME9uQ2hhaW5Wb3RlcwAARQsEAARFASBTY3JhcGVkIG9uIGNoYWluIGRhdGEgZm9yIGV4dHJhY3RpbmcgcmVzb2x2ZWQgZGlzcHV0ZXMgYXMgd2VsbCBhcyBiYWNraW5nIHZvdGVzLgF9BAAAAVkLNgA0UGFyYVNjaGVkdWxlcgE0UGFyYVNjaGVkdWxlchA8VmFsaWRhdG9yR3JvdXBzAQBdCwQAHG0BIEFsbCB0aGUgdmFsaWRhdG9yIGdyb3Vwcy4gT25lIGZvciBlYWNoIGNvcmUuIEluZGljZXMgYXJlIGludG8gYEFjdGl2ZVZhbGlkYXRvcnNgIC0gbm90IHRoZW0BIGJyb2FkZXIgc2V0IG9mIFBvbGthZG90IHZhbGlkYXRvcnMsIGJ1dCBpbnN0ZWFkIGp1c3QgdGhlIHN1YnNldCB1c2VkIGZvciBwYXJhY2hhaW5zIGR1cmluZzggdGhpcyBzZXNzaW9uLgBJASBCb3VuZDogVGhlIG51bWJlciBvZiBjb3JlcyBpcyB0aGUgc3VtIG9mIHRoZSBudW1iZXJzIG9mIHBhcmFjaGFpbnMgYW5kIHBhcmF0aHJlYWRpASBtdWx0aXBsZXhlcnMuIFJlYXNvbmFibHksIDEwMC0xMDAwLiBUaGUgZG9taW5hbnQgZmFjdG9yIGlzIHRoZSBudW1iZXIgb2YgdmFsaWRhdG9yczogc2FmZVAgdXBwZXIgYm91bmQgYXQgMTBrLkRBdmFpbGFiaWxpdHlDb3JlcwEAYQsEABhxASBPbmUgZW50cnkgZm9yIGVhY2ggYXZhaWxhYmlsaXR5IGNvcmUuIFRoZSBpJ3RoIHBhcmFjaGFpbiBiZWxvbmdzIHRvIHRoZSBpJ3RoIGNvcmUsIHdpdGggdGhl8CByZW1haW5pbmcgY29yZXMgYWxsIGJlaW5nIG9uIGRlbWFuZCBwYXJhY2hhaW4gbXVsdGlwbGV4ZXJzLgDYIEJvdW5kZWQgYnkgdGhlIG1heGltdW0gb2YgZWl0aGVyIG9mIHRoZXNlIHR3byB2YWx1ZXM65CAgICogVGhlIG51bWJlciBvZiBwYXJhY2hhaW5zIGFuZCBwYXJhdGhyZWFkIG11bHRpcGxleGVyc0UBICAgKiBUaGUgbnVtYmVyIG9mIHZhbGlkYXRvcnMgZGl2aWRlZCBieSBgY29uZmlndXJhdGlvbi5tYXhfdmFsaWRhdG9yc19wZXJfY29yZWAuRFNlc3Npb25TdGFydEJsb2NrAQAQEAAAAAAcaQEgVGhlIGJsb2NrIG51bWJlciB3aGVyZSB0aGUgc2Vzc2lvbiBzdGFydCBvY2N1cnJlZC4gVXNlZCB0byB0cmFjayBob3cgbWFueSBncm91cCByb3RhdGlvbnM8IGhhdmUgb2NjdXJyZWQuAFUBIE5vdGUgdGhhdCBpbiB0aGUgY29udGV4dCBvZiBwYXJhY2hhaW5zIG1vZHVsZXMgdGhlIHNlc3Npb24gY2hhbmdlIGlzIHNpZ25hbGVkIGR1cmluZ2EBIHRoZSBibG9jayBhbmQgZW5hY3RlZCBhdCB0aGUgZW5kIG9mIHRoZSBibG9jayAoYXQgdGhlIGZpbmFsaXphdGlvbiBzdGFnZSwgdG8gYmUgZXhhY3QpLlkBIFRodXMgZm9yIGFsbCBpbnRlbnRzIGFuZCBwdXJwb3NlcyB0aGUgZWZmZWN0IG9mIHRoZSBzZXNzaW9uIGNoYW5nZSBpcyBvYnNlcnZlZCBhdCB0aGVlASBibG9jayBmb2xsb3dpbmcgdGhlIHNlc3Npb24gY2hhbmdlLCBibG9jayBudW1iZXIgb2Ygd2hpY2ggd2Ugc2F2ZSBpbiB0aGlzIHN0b3JhZ2UgdmFsdWUuKENsYWltUXVldWUBAHELBAAMWQEgT25lIGVudHJ5IGZvciBlYWNoIGF2YWlsYWJpbGl0eSBjb3JlLiBUaGUgYFZlY0RlcXVlYCByZXByZXNlbnRzIHRoZSBhc3NpZ25tZW50cyB0byBiZVEBIHNjaGVkdWxlZCBvbiB0aGF0IGNvcmUuIFRoZSB2YWx1ZSBjb250YWluZWQgaGVyZSB3aWxsIG5vdCBiZSB2YWxpZCBhZnRlciB0aGUgZW5kIG9maQEgYSBibG9jay4gUnVudGltZSBBUElzIHNob3VsZCBiZSB1c2VkIHRvIGRldGVybWluZSBzY2hlZHVsZWQgY29yZXMgZm9yIHRoZSB1cGNvbWluZyBibG9jay4AAAAANwAUUGFyYXMBFFBhcmFzVEBQdmZBY3RpdmVWb3RlTWFwAAEEBbkEgQsEABC0IEFsbCBjdXJyZW50bHkgYWN0aXZlIFBWRiBwcmUtY2hlY2tpbmcgdm90ZXMuACwgSW52YXJpYW50OnUBIC0gVGhlcmUgYXJlIG5vIFBWRiBwcmUtY2hlY2tpbmcgdm90ZXMgdGhhdCBleGlzdHMgaW4gbGlzdCBidXQgbm90IGluIHRoZSBzZXQgYW5kIHZpY2UgdmVyc2EuRFB2ZkFjdGl2ZVZvdGVMaXN0AQCRCwQABDUBIFRoZSBsaXN0IG9mIGFsbCBjdXJyZW50bHkgYWN0aXZlIFBWRiB2b3Rlcy4gQXV4aWxpYXJ5IHRvIGBQdmZBY3RpdmVWb3RlTWFwYC4oUGFyYWNoYWlucwEAlQsEABBpASBBbGwgbGVhc2UgaG9sZGluZyBwYXJhY2hhaW5zLiBPcmRlcmVkIGFzY2VuZGluZyBieSBgUGFyYUlkYC4gT24gZGVtYW5kIHBhcmFjaGFpbnMgYXJlIG5vdCggaW5jbHVkZWQuAOggQ29uc2lkZXIgdXNpbmcgdGhlIFtgUGFyYWNoYWluc0NhY2hlYF0gdHlwZSBvZiBtb2RpZnlpbmcuOFBhcmFMaWZlY3ljbGVzAAEEBY0CmQsEAAS8IFRoZSBjdXJyZW50IGxpZmVjeWNsZSBvZiBhIGFsbCBrbm93biBQYXJhIElEcy4USGVhZHMAAQQFjQLZBAQABKAgVGhlIGhlYWQtZGF0YSBvZiBldmVyeSByZWdpc3RlcmVkIHBhcmEuRE1vc3RSZWNlbnRDb250ZXh0AAEEBY0CEAQABCkBIFRoZSBjb250ZXh0IChyZWxheS1jaGFpbiBibG9jayBudW1iZXIpIG9mIHRoZSBtb3N0IHJlY2VudCBwYXJhY2hhaW4gaGVhZC48Q3VycmVudENvZGVIYXNoAAEEBY0CuQQEAAy0IFRoZSB2YWxpZGF0aW9uIGNvZGUgaGFzaCBvZiBldmVyeSBsaXZlIHBhcmEuAOQgQ29ycmVzcG9uZGluZyBjb2RlIGNhbiBiZSByZXRyaWV2ZWQgd2l0aCBbYENvZGVCeUhhc2hgXS4wUGFzdENvZGVIYXNoAAEEBZ0LuQQEABBhASBBY3R1YWwgcGFzdCBjb2RlIGhhc2gsIGluZGljYXRlZCBieSB0aGUgcGFyYSBpZCBhcyB3ZWxsIGFzIHRoZSBibG9jayBudW1iZXIgYXQgd2hpY2ggaXREIGJlY2FtZSBvdXRkYXRlZC4A5CBDb3JyZXNwb25kaW5nIGNvZGUgY2FuIGJlIHJldHJpZXZlZCB3aXRoIFtgQ29kZUJ5SGFzaGBdLjBQYXN0Q29kZU1ldGEBAQQFjQKhCwgAAAxJASBQYXN0IGNvZGUgb2YgcGFyYWNoYWlucy4gVGhlIHBhcmFjaGFpbnMgdGhlbXNlbHZlcyBtYXkgbm90IGJlIHJlZ2lzdGVyZWQgYW55bW9yZSxJASBidXQgd2UgYWxzbyBrZWVwIHRoZWlyIGNvZGUgb24tY2hhaW4gZm9yIHRoZSBzYW1lIGFtb3VudCBvZiB0aW1lIGFzIG91dGRhdGVkIGNvZGWwIHRvIGtlZXAgaXQgYXZhaWxhYmxlIGZvciBhcHByb3ZhbCBjaGVja2Vycy48UGFzdENvZGVQcnVuaW5nAQCtCwQAGGkBIFdoaWNoIHBhcmFzIGhhdmUgcGFzdCBjb2RlIHRoYXQgbmVlZHMgcHJ1bmluZyBhbmQgdGhlIHJlbGF5LWNoYWluIGJsb2NrIGF0IHdoaWNoIHRoZSBjb2RlaQEgd2FzIHJlcGxhY2VkLiBOb3RlIHRoYXQgdGhpcyBpcyB0aGUgYWN0dWFsIGhlaWdodCBvZiB0aGUgaW5jbHVkZWQgYmxvY2ssIG5vdCB0aGUgZXhwZWN0ZWQ9ASBoZWlnaHQgYXQgd2hpY2ggdGhlIGNvZGUgdXBncmFkZSB3b3VsZCBiZSBhcHBsaWVkLCBhbHRob3VnaCB0aGV5IG1heSBiZSBlcXVhbC5tASBUaGlzIGlzIHRvIGVuc3VyZSB0aGUgZW50aXJlIGFjY2VwdGFuY2UgcGVyaW9kIGlzIGNvdmVyZWQsIG5vdCBhbiBvZmZzZXQgYWNjZXB0YW5jZSBwZXJpb2RtASBzdGFydGluZyBmcm9tIHRoZSB0aW1lIGF0IHdoaWNoIHRoZSBwYXJhY2hhaW4gcGVyY2VpdmVzIGEgY29kZSB1cGdyYWRlIGFzIGhhdmluZyBvY2N1cnJlZC5VASBNdWx0aXBsZSBlbnRyaWVzIGZvciBhIHNpbmdsZSBwYXJhIGFyZSBwZXJtaXR0ZWQuIE9yZGVyZWQgYXNjZW5kaW5nIGJ5IGJsb2NrIG51bWJlci5IRnV0dXJlQ29kZVVwZ3JhZGVzAAEEBY0CEAQAED0BIFRoZSBibG9jayBudW1iZXIgYXQgd2hpY2ggdGhlIHBsYW5uZWQgY29kZSBjaGFuZ2UgaXMgZXhwZWN0ZWQgZm9yIGEgcGFyYWNoYWluLgBlASBUaGUgY2hhbmdlIHdpbGwgYmUgYXBwbGllZCBhZnRlciB0aGUgZmlyc3QgcGFyYWJsb2NrIGZvciB0aGlzIElEIGluY2x1ZGVkIHdoaWNoIGV4ZWN1dGVzGQEgaW4gdGhlIGNvbnRleHQgb2YgYSByZWxheSBjaGFpbiBibG9jayB3aXRoIGEgbnVtYmVyID49IGBleHBlY3RlZF9hdGAuUEZ1dHVyZUNvZGVVcGdyYWRlc0F0AQCtCwQAIKwgVGhlIGxpc3Qgb2YgdXBjb21pbmcgZnV0dXJlIGNvZGUgdXBncmFkZXMuAG0BIEVhY2ggaXRlbSBpcyBhIHBhaXIgb2YgdGhlIHBhcmFjaGFpbiBhbmQgdGhlIGV4cGVjdGVkIGJsb2NrIGF0IHdoaWNoIHRoZSB1cGdyYWRlIHNob3VsZCBiZVEBIGFwcGxpZWQuIFRoZSB1cGdyYWRlIHdpbGwgYmUgYXBwbGllZCBhdCB0aGUgZ2l2ZW4gcmVsYXkgY2hhaW4gYmxvY2suIEluIGNvbnRyYXN0IHRvdQEgW2BGdXR1cmVDb2RlVXBncmFkZXNgXSB0aGlzIGNvZGUgdXBncmFkZSB3aWxsIGJlIGFwcGxpZWQgcmVnYXJkbGVzcyB0aGUgcGFyYWNoYWluIG1ha2luZyBhbnlEIHByb2dyZXNzIG9yIG5vdC4AjCBPcmRlcmVkIGFzY2VuZGluZyBieSBibG9jayBudW1iZXIuOEZ1dHVyZUNvZGVIYXNoAAEEBY0CuQQEAAycIFRoZSBhY3R1YWwgZnV0dXJlIGNvZGUgaGFzaCBvZiBhIHBhcmEuAOQgQ29ycmVzcG9uZGluZyBjb2RlIGNhbiBiZSByZXRyaWV2ZWQgd2l0aCBbYENvZGVCeUhhc2hgXS5QVXBncmFkZUdvQWhlYWRTaWduYWwAAQQFjQKxCwQAKHUBIFRoaXMgaXMgdXNlZCBieSB0aGUgcmVsYXktY2hhaW4gdG8gY29tbXVuaWNhdGUgdG8gYSBwYXJhY2hhaW4gYSBnby1haGVhZCB3aXRoIGluIHRoZSB1cGdyYWRlLCBwcm9jZWR1cmUuAHUBIFRoaXMgdmFsdWUgaXMgYWJzZW50IHdoZW4gdGhlcmUgYXJlIG5vIHVwZ3JhZGVzIHNjaGVkdWxlZCBvciBkdXJpbmcgdGhlIHRpbWUgdGhlIHJlbGF5IGNoYWluVQEgcGVyZm9ybXMgdGhlIGNoZWNrcy4gSXQgaXMgc2V0IGF0IHRoZSBmaXJzdCByZWxheS1jaGFpbiBibG9jayB3aGVuIHRoZSBjb3JyZXNwb25kaW5ndQEgcGFyYWNoYWluIGNhbiBzd2l0Y2ggaXRzIHVwZ3JhZGUgZnVuY3Rpb24uIEFzIHNvb24gYXMgdGhlIHBhcmFjaGFpbidzIGJsb2NrIGlzIGluY2x1ZGVkLCB0aGVwIHZhbHVlIGdldHMgcmVzZXQgdG8gYE5vbmVgLgBlASBOT1RFIHRoYXQgdGhpcyBmaWVsZCBpcyB1c2VkIGJ5IHBhcmFjaGFpbnMgdmlhIG1lcmtsZSBzdG9yYWdlIHByb29mcywgdGhlcmVmb3JlIGNoYW5naW5nxCB0aGUgZm9ybWF0IHdpbGwgcmVxdWlyZSBtaWdyYXRpb24gb2YgcGFyYWNoYWlucy5gVXBncmFkZVJlc3RyaWN0aW9uU2lnbmFsAAEEBY0CtQsEACRpASBUaGlzIGlzIHVzZWQgYnkgdGhlIHJlbGF5LWNoYWluIHRvIGNvbW11bmljYXRlIHRoYXQgdGhlcmUgYXJlIHJlc3RyaWN0aW9ucyBmb3IgcGVyZm9ybWluZ3wgYW4gdXBncmFkZSBmb3IgdGhpcyBwYXJhY2hhaW4uAFkBIFRoaXMgbWF5IGJlIGEgYmVjYXVzZSB0aGUgcGFyYWNoYWluIHdhaXRzIGZvciB0aGUgdXBncmFkZSBjb29sZG93biB0byBleHBpcmUuIEFub3RoZXJtASBwb3RlbnRpYWwgdXNlIGNhc2UgaXMgd2hlbiB3ZSB3YW50IHRvIHBlcmZvcm0gc29tZSBtYWludGVuYW5jZSAoc3VjaCBhcyBzdG9yYWdlIG1pZ3JhdGlvbingIHdlIGNvdWxkIHJlc3RyaWN0IHVwZ3JhZGVzIHRvIG1ha2UgdGhlIHByb2Nlc3Mgc2ltcGxlci4AZQEgTk9URSB0aGF0IHRoaXMgZmllbGQgaXMgdXNlZCBieSBwYXJhY2hhaW5zIHZpYSBtZXJrbGUgc3RvcmFnZSBwcm9vZnMsIHRoZXJlZm9yZSBjaGFuZ2luZ8QgdGhlIGZvcm1hdCB3aWxsIHJlcXVpcmUgbWlncmF0aW9uIG9mIHBhcmFjaGFpbnMuQFVwZ3JhZGVDb29sZG93bnMBAK0LBAAMUQEgVGhlIGxpc3Qgb2YgcGFyYWNoYWlucyB0aGF0IGFyZSBhd2FpdGluZyBmb3IgdGhlaXIgdXBncmFkZSByZXN0cmljdGlvbiB0byBjb29sZG93bi4AjCBPcmRlcmVkIGFzY2VuZGluZyBieSBibG9jayBudW1iZXIuQFVwY29taW5nVXBncmFkZXMBAK0LBAAYkCBUaGUgbGlzdCBvZiB1cGNvbWluZyBjb2RlIHVwZ3JhZGVzLgBxASBFYWNoIGl0ZW0gaXMgYSBwYWlyIG9mIHdoaWNoIHBhcmEgcGVyZm9ybXMgYSBjb2RlIHVwZ3JhZGUgYW5kIGF0IHdoaWNoIHJlbGF5LWNoYWluIGJsb2NrIGl0QCBpcyBleHBlY3RlZCBhdC4AjCBPcmRlcmVkIGFzY2VuZGluZyBieSBibG9jayBudW1iZXIuMEFjdGlvbnNRdWV1ZQEBBAUQlQsEAAQVASBUaGUgYWN0aW9ucyB0byBwZXJmb3JtIGR1cmluZyB0aGUgc3RhcnQgb2YgYSBzcGVjaWZpYyBzZXNzaW9uIGluZGV4LlBVcGNvbWluZ1BhcmFzR2VuZXNpcwABBAWNAv0GBAAQoCBVcGNvbWluZyBwYXJhcyBpbnN0YW50aWF0aW9uIGFyZ3VtZW50cy4AZQEgTk9URSB0aGF0IGFmdGVyIFBWRiBwcmUtY2hlY2tpbmcgaXMgZW5hYmxlZCB0aGUgcGFyYSBnZW5lc2lzIGFyZyB3aWxsIGhhdmUgaXQncyBjb2RlIHNldGEBIHRvIGVtcHR5LiBJbnN0ZWFkLCB0aGUgY29kZSB3aWxsIGJlIHNhdmVkIGludG8gdGhlIHN0b3JhZ2UgcmlnaHQgYXdheSB2aWEgYENvZGVCeUhhc2hgLjhDb2RlQnlIYXNoUmVmcwEBBAa5BBAQAAAAAAQpASBUaGUgbnVtYmVyIG9mIHJlZmVyZW5jZSBvbiB0aGUgdmFsaWRhdGlvbiBjb2RlIGluIFtgQ29kZUJ5SGFzaGBdIHN0b3JhZ2UuKENvZGVCeUhhc2gAAQQGuQTVBAQAEJAgVmFsaWRhdGlvbiBjb2RlIHN0b3JlZCBieSBpdHMgaGFzaC4AMQEgVGhpcyBzdG9yYWdlIGlzIGNvbnNpc3RlbnQgd2l0aCBbYEZ1dHVyZUNvZGVIYXNoYF0sIFtgQ3VycmVudENvZGVIYXNoYF0gYW5kSCBbYFBhc3RDb2RlSGFzaGBdLgEJBQGFBwRAVW5zaWduZWRQcmlvcml0eTAg//////////8AAbkLOAAsSW5pdGlhbGl6ZXIBLEluaXRpYWxpemVyCDhIYXNJbml0aWFsaXplZAAAjAQAICEBIFdoZXRoZXIgdGhlIHBhcmFjaGFpbnMgbW9kdWxlcyBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQgd2l0aGluIHRoaXMgYmxvY2suACUBIFNlbWFudGljYWxseSBhIGBib29sYCwgYnV0IHRoaXMgZ3VhcmFudGVlcyBpdCBzaG91bGQgbmV2ZXIgaGl0IHRoZSB0cmllLGkBIGFzIHRoaXMgaXMgY2xlYXJlZCBpbiBgb25fZmluYWxpemVgIGFuZCBGcmFtZSBvcHRpbWl6ZXMgYE5vbmVgIHZhbHVlcyB0byBiZSBlbXB0eSB2YWx1ZXMuAHEBIEFzIGEgYGJvb2xgLCBgc2V0KGZhbHNlKWAgYW5kIGByZW1vdmUoKWAgYm90aCBsZWFkIHRvIHRoZSBuZXh0IGBnZXQoKWAgYmVpbmcgZmFsc2UsIGJ1dCBvbmV1ASBvZiB0aGVtIHdyaXRlcyB0byB0aGUgdHJpZSBhbmQgb25lIGRvZXMgbm90LiBUaGlzIGNvbmZ1c2lvbiBtYWtlcyBgT3B0aW9uPCgpPmAgbW9yZSBzdWl0YWJsZZAgZm9yIHRoZSBzZW1hbnRpY3Mgb2YgdGhpcyB2YXJpYWJsZS5YQnVmZmVyZWRTZXNzaW9uQ2hhbmdlcwEAvQsEABxZASBCdWZmZXJlZCBzZXNzaW9uIGNoYW5nZXMgYWxvbmcgd2l0aCB0aGUgYmxvY2sgbnVtYmVyIGF0IHdoaWNoIHRoZXkgc2hvdWxkIGJlIGFwcGxpZWQuAF0BIFR5cGljYWxseSB0aGlzIHdpbGwgYmUgZW1wdHkgb3Igb25lIGVsZW1lbnQgbG9uZy4gQXBhcnQgZnJvbSB0aGF0IHRoaXMgaXRlbSBuZXZlciBoaXRzNCB0aGUgc3RvcmFnZS4AaQEgSG93ZXZlciB0aGlzIGlzIGEgYFZlY2AgcmVnYXJkbGVzcyB0byBoYW5kbGUgdmFyaW91cyBlZGdlIGNhc2VzIHRoYXQgbWF5IG9jY3VyIGF0IHJ1bnRpbWXAIHVwZ3JhZGUgYm91bmRhcmllcyBvciBpZiBnb3Zlcm5hbmNlIGludGVydmVuZXMuAREFAAAAOQAMRG1wAQxEbXAMVERvd253YXJkTWVzc2FnZVF1ZXVlcwEBBAWNAsULBAAE0CBUaGUgZG93bndhcmQgbWVzc2FnZXMgYWRkcmVzc2VkIGZvciBhIGNlcnRhaW4gcGFyYS5kRG93bndhcmRNZXNzYWdlUXVldWVIZWFkcwEBBAWNAjSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcJQEgQSBtYXBwaW5nIHRoYXQgc3RvcmVzIHRoZSBkb3dud2FyZCBtZXNzYWdlIHF1ZXVlIE1RQyBoZWFkIGZvciBlYWNoIHBhcmEuAJAgRWFjaCBsaW5rIGluIHRoaXMgY2hhaW4gaGFzIGEgZm9ybTp4IGAocHJldl9oZWFkLCBCLCBIKE0pKWAsIHdoZXJl6CAtIGBwcmV2X2hlYWRgOiBpcyB0aGUgcHJldmlvdXMgaGVhZCBoYXNoIG9yIHplcm8gaWYgbm9uZS4hASAtIGBCYDogaXMgdGhlIHJlbGF5LWNoYWluIGJsb2NrIG51bWJlciBpbiB3aGljaCBhIG1lc3NhZ2Ugd2FzIGFwcGVuZGVkLtQgLSBgSChNKWA6IGlzIHRoZSBoYXNoIG9mIHRoZSBtZXNzYWdlIGJlaW5nIGFwcGVuZGVkLkREZWxpdmVyeUZlZUZhY3RvcgEBBAWNAtEGQAAAZKeztuANAAAAAAAAAAAExCBUaGUgZmFjdG9yIHRvIG11bHRpcGx5IHRoZSBiYXNlIGRlbGl2ZXJ5IGZlZSBieS4AAAAAOgAQSHJtcAEQSHJtcDBcSHJtcE9wZW5DaGFubmVsUmVxdWVzdHMAAQQFGQXNCwQAGLwgVGhlIHNldCBvZiBwZW5kaW5nIEhSTVAgb3BlbiBjaGFubmVsIHJlcXVlc3RzLgDAIFRoZSBzZXQgaXMgYWNjb21wYW5pZWQgYnkgYSBsaXN0IGZvciBpdGVyYXRpb24uACwgSW52YXJpYW50Oj0BIC0gVGhlcmUgYXJlIG5vIGNoYW5uZWxzIHRoYXQgZXhpc3RzIGluIGxpc3QgYnV0IG5vdCBpbiB0aGUgc2V0IGFuZCB2aWNlIHZlcnNhLmxIcm1wT3BlbkNoYW5uZWxSZXF1ZXN0c0xpc3QBANELBAAAbEhybXBPcGVuQ2hhbm5lbFJlcXVlc3RDb3VudAEBBAWNAhAQAAAAAAxlASBUaGlzIG1hcHBpbmcgdHJhY2tzIGhvdyBtYW55IG9wZW4gY2hhbm5lbCByZXF1ZXN0cyBhcmUgaW5pdGlhdGVkIGJ5IGEgZ2l2ZW4gc2VuZGVyIHBhcmEuWQEgSW52YXJpYW50OiBgSHJtcE9wZW5DaGFubmVsUmVxdWVzdHNgIHNob3VsZCBjb250YWluIHRoZSBzYW1lIG51bWJlciBvZiBpdGVtcyB0aGF0IGhhcwUBIGAoWCwgXylgIGFzIHRoZSBudW1iZXIgb2YgYEhybXBPcGVuQ2hhbm5lbFJlcXVlc3RDb3VudGAgZm9yIGBYYC58SHJtcEFjY2VwdGVkQ2hhbm5lbFJlcXVlc3RDb3VudAEBBAWNAhAQAAAAAAxxASBUaGlzIG1hcHBpbmcgdHJhY2tzIGhvdyBtYW55IG9wZW4gY2hhbm5lbCByZXF1ZXN0cyB3ZXJlIGFjY2VwdGVkIGJ5IGEgZ2l2ZW4gcmVjaXBpZW50IHBhcmEubQEgSW52YXJpYW50OiBgSHJtcE9wZW5DaGFubmVsUmVxdWVzdHNgIHNob3VsZCBjb250YWluIHRoZSBzYW1lIG51bWJlciBvZiBpdGVtcyBgKF8sIFgpYCB3aXRoVQEgYGNvbmZpcm1lZGAgc2V0IHRvIHRydWUsIGFzIHRoZSBudW1iZXIgb2YgYEhybXBBY2NlcHRlZENoYW5uZWxSZXF1ZXN0Q291bnRgIGZvciBgWGAuYEhybXBDbG9zZUNoYW5uZWxSZXF1ZXN0cwABBAUZBYwEABxxASBBIHNldCBvZiBwZW5kaW5nIEhSTVAgY2xvc2UgY2hhbm5lbCByZXF1ZXN0cyB0aGF0IGFyZSBnb2luZyB0byBiZSBjbG9zZWQgZHVyaW5nIHRoZSBzZXNzaW9uIQEgY2hhbmdlLiBVc2VkIGZvciBjaGVja2luZyBpZiBhIGdpdmVuIGNoYW5uZWwgaXMgcmVnaXN0ZXJlZCBmb3IgY2xvc3VyZS4AwCBUaGUgc2V0IGlzIGFjY29tcGFuaWVkIGJ5IGEgbGlzdCBmb3IgaXRlcmF0aW9uLgAsIEludmFyaWFudDo9ASAtIFRoZXJlIGFyZSBubyBjaGFubmVscyB0aGF0IGV4aXN0cyBpbiBsaXN0IGJ1dCBub3QgaW4gdGhlIHNldCBhbmQgdmljZSB2ZXJzYS5wSHJtcENsb3NlQ2hhbm5lbFJlcXVlc3RzTGlzdAEA0QsEAAA4SHJtcFdhdGVybWFya3MAAQQFjQIQBAAQuCBUaGUgSFJNUCB3YXRlcm1hcmsgYXNzb2NpYXRlZCB3aXRoIGVhY2ggcGFyYS4sIEludmFyaWFudDpVASAtIGVhY2ggcGFyYSBgUGAgdXNlZCBoZXJlIGFzIGEga2V5IHNob3VsZCBzYXRpc2Z5IGBQYXJhczo6aXNfdmFsaWRfcGFyYShQKWAgd2l0aGluIGEsICAgc2Vzc2lvbi4wSHJtcENoYW5uZWxzAAEEBRkF1QsEAAy0IEhSTVAgY2hhbm5lbCBkYXRhIGFzc29jaWF0ZWQgd2l0aCBlYWNoIHBhcmEuLCBJbnZhcmlhbnQ6dQEgLSBlYWNoIHBhcnRpY2lwYW50IGluIHRoZSBjaGFubmVsIHNob3VsZCBzYXRpc2Z5IGBQYXJhczo6aXNfdmFsaWRfcGFyYShQKWAgd2l0aGluIGEgc2Vzc2lvbi5gSHJtcEluZ3Jlc3NDaGFubmVsc0luZGV4AQEEBY0ClQsEADRxASBJbmdyZXNzL2VncmVzcyBpbmRleGVzIGFsbG93IHRvIGZpbmQgYWxsIHRoZSBzZW5kZXJzIGFuZCByZWNlaXZlcnMgZ2l2ZW4gdGhlIG9wcG9zaXRlIHNpZGUuFCBJLmUuACEBIChhKSBpbmdyZXNzIGluZGV4IGFsbG93cyB0byBmaW5kIGFsbCB0aGUgc2VuZGVycyBmb3IgYSBnaXZlbiByZWNpcGllbnQuHQEgKGIpIGVncmVzcyBpbmRleCBhbGxvd3MgdG8gZmluZCBhbGwgdGhlIHJlY2lwaWVudHMgZm9yIGEgZ2l2ZW4gc2VuZGVyLgAwIEludmFyaWFudHM6UQEgLSBmb3IgZWFjaCBpbmdyZXNzIGluZGV4IGVudHJ5IGZvciBgUGAgZWFjaCBpdGVtIGBJYCBpbiB0aGUgaW5kZXggc2hvdWxkIHByZXNlbnQgaW54ICAgYEhybXBDaGFubmVsc2AgYXMgYChJLCBQKWAuTQEgLSBmb3IgZWFjaCBlZ3Jlc3MgaW5kZXggZW50cnkgZm9yIGBQYCBlYWNoIGl0ZW0gYEVgIGluIHRoZSBpbmRleCBzaG91bGQgcHJlc2VudCBpbnggICBgSHJtcENoYW5uZWxzYCBhcyBgKFAsIEUpYC4BASAtIHRoZXJlIHNob3VsZCBiZSBubyBvdGhlciBkYW5nbGluZyBjaGFubmVscyBpbiBgSHJtcENoYW5uZWxzYC5oIC0gdGhlIHZlY3RvcnMgYXJlIHNvcnRlZC5cSHJtcEVncmVzc0NoYW5uZWxzSW5kZXgBAQQFjQKVCwQAAExIcm1wQ2hhbm5lbENvbnRlbnRzAQEEBRkF2QsEAAisIFN0b3JhZ2UgZm9yIHRoZSBtZXNzYWdlcyBmb3IgZWFjaCBjaGFubmVsLmUBIEludmFyaWFudDogY2Fubm90IGJlIG5vbi1lbXB0eSBpZiB0aGUgY29ycmVzcG9uZGluZyBjaGFubmVsIGluIGBIcm1wQ2hhbm5lbHNgIGlzIGBOb25lYC5ISHJtcENoYW5uZWxEaWdlc3RzAQEEBY0C4QsEABhpASBNYWludGFpbnMgYSBtYXBwaW5nIHRoYXQgY2FuIGJlIHVzZWQgdG8gYW5zd2VyIHRoZSBxdWVzdGlvbjogV2hhdCBwYXJhcyBzZW50IGEgbWVzc2FnZSBhdOQgdGhlIGdpdmVuIGJsb2NrIG51bWJlciBmb3IgYSBnaXZlbiByZWNlaXZlci4gSW52YXJpYW50czqoIC0gVGhlIGlubmVyIGBWZWM8UGFyYUlkPmAgaXMgbmV2ZXIgZW1wdHku6CAtIFRoZSBpbm5lciBgVmVjPFBhcmFJZD5gIGNhbm5vdCBzdG9yZSB0d28gc2FtZSBgUGFyYUlkYC5tASAtIFRoZSBvdXRlciB2ZWN0b3IgaXMgc29ydGVkIGFzY2VuZGluZyBieSBibG9jayBudW1iZXIgYW5kIGNhbm5vdCBzdG9yZSB0d28gaXRlbXMgd2l0aCB0aGVUICAgc2FtZSBibG9jayBudW1iZXIuARUFAYkHAAHpCzwAPFBhcmFTZXNzaW9uSW5mbwE8UGFyYVNlc3Npb25JbmZvFFBBc3NpZ25tZW50S2V5c1Vuc2FmZQEA7QsEAAykIEFzc2lnbm1lbnQga2V5cyBmb3IgdGhlIGN1cnJlbnQgc2Vzc2lvbi5tASBOb3RlIHRoYXQgdGhpcyBBUEkgaXMgcHJpdmF0ZSBkdWUgdG8gaXQgYmVpbmcgcHJvbmUgdG8gJ29mZi1ieS1vbmUnIGF0IHNlc3Npb24gYm91bmRhcmllcy6sIFdoZW4gaW4gZG91YnQsIHVzZSBgU2Vzc2lvbnNgIEFQSSBpbnN0ZWFkLlRFYXJsaWVzdFN0b3JlZFNlc3Npb24BABAQAAAAAAQBASBUaGUgZWFybGllc3Qgc2Vzc2lvbiBmb3Igd2hpY2ggcHJldmlvdXMgc2Vzc2lvbiBpbmZvIGlzIHN0b3JlZC4gU2Vzc2lvbnMAAQQGEPELBAAMpCBTZXNzaW9uIGluZm9ybWF0aW9uIGluIGEgcm9sbGluZyB3aW5kb3cuNQEgU2hvdWxkIGhhdmUgYW4gZW50cnkgaW4gcmFuZ2UgYEVhcmxpZXN0U3RvcmVkU2Vzc2lvbi4uPUN1cnJlbnRTZXNzaW9uSW5kZXhgLnUBIERvZXMgbm90IGhhdmUgYW55IGVudHJpZXMgYmVmb3JlIHRoZSBzZXNzaW9uIGluZGV4IGluIHRoZSBmaXJzdCBzZXNzaW9uIGNoYW5nZSBub3RpZmljYXRpb24uLEFjY291bnRLZXlzAAEEBhDRAQQABHEBIFRoZSB2YWxpZGF0b3IgYWNjb3VudCBrZXlzIG9mIHRoZSB2YWxpZGF0b3JzIGFjdGl2ZWx5IHBhcnRpY2lwYXRpbmcgaW4gcGFyYWNoYWluIGNvbnNlbnN1cy5UU2Vzc2lvbkV4ZWN1dG9yUGFyYW1zAAEEBhBZBAQABMQgRXhlY3V0b3IgcGFyYW1ldGVyIHNldCBmb3IgYSBnaXZlbiBzZXNzaW9uIGluZGV4AAAAAD0ANFBhcmFzRGlzcHV0ZXMBNFBhcmFzRGlzcHV0ZXMURExhc3RQcnVuZWRTZXNzaW9uAAAQBAAIAQEgVGhlIGxhc3QgcHJ1bmVkIHNlc3Npb24sIGlmIGFueS4gQWxsIGRhdGEgc3RvcmVkIGJ5IHRoaXMgbW9kdWxlVCByZWZlcmVuY2VzIHNlc3Npb25zLiBEaXNwdXRlcwABCAUC/QsBDAQABAUBIEFsbCBvbmdvaW5nIG9yIGNvbmNsdWRlZCBkaXNwdXRlcyBmb3IgdGhlIGxhc3Qgc2V2ZXJhbCBzZXNzaW9ucy5EQmFja2Vyc09uRGlzcHV0ZXMAAQgFAv0LBQwEAAicIEJhY2tpbmcgdm90ZXMgc3RvcmVkIGZvciBlYWNoIGRpc3B1dGUujCBUaGlzIHN0b3JhZ2UgaXMgdXNlZCBmb3Igc2xhc2hpbmcuIEluY2x1ZGVkAAEIBQL9CxAEAAhFASBBbGwgaW5jbHVkZWQgYmxvY2tzIG9uIHRoZSBjaGFpbiwgYXMgd2VsbCBhcyB0aGUgYmxvY2sgbnVtYmVyIGluIHRoaXMgY2hhaW4gdGhhdFkBIHNob3VsZCBiZSByZXZlcnRlZCBiYWNrIHRvIGlmIHRoZSBjYW5kaWRhdGUgaXMgZGlzcHV0ZWQgYW5kIGRldGVybWluZWQgdG8gYmUgaW52YWxpZC4YRnJvemVuAQBhAgQAEBEBIFdoZXRoZXIgdGhlIGNoYWluIGlzIGZyb3plbi4gU3RhcnRzIGFzIGBOb25lYC4gV2hlbiB0aGlzIGlzIGBTb21lYCw1ASB0aGUgY2hhaW4gd2lsbCBub3QgYWNjZXB0IGFueSBuZXcgcGFyYWNoYWluIGJsb2NrcyBmb3IgYmFja2luZyBvciBpbmNsdXNpb24sCQEgYW5kIGl0cyB2YWx1ZSBpbmRpY2F0ZXMgdGhlIGxhc3QgdmFsaWQgYmxvY2sgbnVtYmVyIGluIHRoZSBjaGFpbi74IEl0IGNhbiBvbmx5IGJlIHNldCBiYWNrIHRvIGBOb25lYCBieSBnb3Zlcm5hbmNlIGludGVydmVudGlvbi4BHQUBjQcAAQkMPgA0UGFyYXNTbGFzaGluZwE0UGFyYXNTbGFzaGluZwhAVW5hcHBsaWVkU2xhc2hlcwABCAUC/QsNDAQABJAgVmFsaWRhdG9ycyBwZW5kaW5nIGRpc3B1dGUgc2xhc2hlcy5IVmFsaWRhdG9yU2V0Q291bnRzAAEEBRAQBAAEhCBgVmFsaWRhdG9yU2V0Q291bnRgIHBlciBzZXNzaW9uLgEhBQAAAR0MPwAgT25EZW1hbmQBIE9uRGVtYW5kFDhQYXJhSWRBZmZpbml0eQABBAWNAiEMBAAMcQEgTWFwcyBhIGBQYXJhSWRgIHRvIGBDb3JlSW5kZXhgIGFuZCBrZWVwcyB0cmFjayBvZiBob3cgbWFueSBhc3NpZ25tZW50cyB0aGUgc2NoZWR1bGVyIGhhcyBpbl0BIGl0J3MgbG9va2FoZWFkLiBLZWVwaW5nIHRyYWNrIG9mIHRoaXMgYWZmaW5pdHkgcHJldmVudHMgcGFyYWxsZWwgZXhlY3V0aW9uIG9mIHRoZSBzYW1lnCBgUGFyYUlkYCBvbiB0d28gb3IgbW9yZSBgQ29yZUluZGV4YGVzLixRdWV1ZVN0YXR1cwEAJQxkAABkp7O24A0AAAAAAAAAAAAAAAAAAAAAAATcIE92ZXJhbGwgc3RhdHVzIG9mIHF1ZXVlIChib3RoIGZyZWUgKyBhZmZpbml0eSBlbnRyaWVzKSxGcmVlRW50cmllcwEAOQwEAARhASBQcmlvcml0eSBxdWV1ZSBmb3IgYWxsIG9yZGVycyB3aGljaCBkb24ndCB5ZXQgKG9yIG5vdCBhbnkgbW9yZSkgaGF2ZSBhbnkgY29yZSBhZmZpbml0eS48QWZmaW5pdHlFbnRyaWVzAQEEBX0HOQwEAARJASBRdWV1ZSBlbnRyaWVzIHRoYXQgYXJlIGN1cnJlbnRseSBib3VuZCB0byBhIHBhcnRpY3VsYXIgY29yZSBkdWUgdG8gY29yZSBhZmZpbml0eS4cUmV2ZW51ZQEARQwEAAT8IEtlZXBzIHRyYWNrIG9mIGFjY3VtdWxhdGVkIHJldmVudWUgZnJvbSBvbiBkZW1hbmQgb3JkZXIgc2FsZXMuATEFAZkHDExUcmFmZmljRGVmYXVsdFZhbHVl0QZAAABkp7O24A0AAAAAAAAAAATMIFRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgc3BvdCB0cmFmZmljIG11bHRpcGxpZXIuUE1heEhpc3RvcmljYWxSZXZlbnVlEBCgAAAACNQgVGhlIG1heGltdW0gbnVtYmVyIG9mIGJsb2NrcyBzb21lIGhpc3RvcmljYWwgcmV2ZW51ZWAgaW5mb3JtYXRpb24gc3RvcmVkIGZvci4gUGFsbGV0SWSRCSBweS9vbmRtZAS0IElkZW50aWZpZXIgZm9yIHRoZSBpbnRlcm5hbCByZXZlbnVlIGJhbGFuY2UuAU0MQABoQ29yZXRpbWVBc3NpZ25tZW50UHJvdmlkZXIBaENvcmV0aW1lQXNzaWdubWVudFByb3ZpZGVyCDRDb3JlU2NoZWR1bGVzAAEEBFEMVQwEABBsIFNjaGVkdWxlZCBhc3NpZ25tZW50IHNldHMuAG0BIEFzc2lnbm1lbnRzIGFzIG9mIHRoZSBnaXZlbiBibG9jayBudW1iZXIuIFRoZXkgd2lsbCBnbyBpbnRvIHN0YXRlIG9uY2UgdGhlIGJsb2NrIG51bWJlciBpc9AgcmVhY2hlZCAoYW5kIHJlcGxhY2Ugd2hhdGV2ZXIgd2FzIGluIHRoZXJlIGJlZm9yZSkuPENvcmVEZXNjcmlwdG9ycwEBBAR9B1kMCAAAEKAgQXNzaWdubWVudHMgd2hpY2ggYXJlIGN1cnJlbnRseSBhY3RpdmUuAGkBIFRoZXkgd2lsbCBiZSBwaWNrZWQgZnJvbSBgUGVuZGluZ0Fzc2lnbm1lbnRzYCBvbmNlIHdlIHJlYWNoIHRoZSBzY2hlZHVsZWQgYmxvY2sgbnVtYmVyIGluWCBgUGVuZGluZ0Fzc2lnbm1lbnRzYC4AAAABeQxBACRSZWdpc3RyYXIBJFJlZ2lzdHJhcgwsUGVuZGluZ1N3YXAAAQQFjQKNAgQABGQgUGVuZGluZyBzd2FwIG9wZXJhdGlvbnMuFFBhcmFzAAEEBY0CfQwEABAFASBBbW91bnQgaGVsZCBvbiBkZXBvc2l0IGZvciBlYWNoIHBhcmEgYW5kIHRoZSBvcmlnaW5hbCBkZXBvc2l0b3IuAHEBIFRoZSBnaXZlbiBhY2NvdW50IElEIGlzIHJlc3BvbnNpYmxlIGZvciByZWdpc3RlcmluZyB0aGUgY29kZSBhbmQgaW5pdGlhbCBoZWFkIGRhdGEsIGJ1dCBtYXlVASBvbmx5IGRvIHNvIGlmIGl0IGlzbid0IHlldCByZWdpc3RlcmVkLiAoQWZ0ZXIgdGhhdCwgaXQncyB1cCB0byBnb3Zlcm5hbmNlIHRvIGRvIHNvLik4TmV4dEZyZWVQYXJhSWQBAI0CEAAAAAAEYCBUaGUgbmV4dCBmcmVlIGBQYXJhSWRgLgE1BQGdBwgsUGFyYURlcG9zaXQYQAAQpdToAAAAAAAAAAAAAAAI1CBUaGUgZGVwb3NpdCB0byBiZSBwYWlkIHRvIHJ1biBhIG9uLWRlbWFuZCBwYXJhY2hhaW4uPQEgVGhpcyBzaG91bGQgaW5jbHVkZSB0aGUgY29zdCBmb3Igc3RvcmluZyB0aGUgZ2VuZXNpcyBoZWFkIGFuZCB2YWxpZGF0aW9uIGNvZGUuSERhdGFEZXBvc2l0UGVyQnl0ZRhAgJaYAAAAAAAAAAAAAAAAAATEIFRoZSBkZXBvc2l0IHRvIGJlIHBhaWQgcGVyIGJ5dGUgc3RvcmVkIG9uIGNoYWluLgGBDEYAFFNsb3RzARRTbG90cwQYTGVhc2VzAQEEBY0ChQwEAEAVASBBbW91bnRzIGhlbGQgb24gZGVwb3NpdCBmb3IgZWFjaCAocG9zc2libHkgZnV0dXJlKSBsZWFzZWQgcGFyYWNoYWluLgBhASBUaGUgYWN0dWFsIGFtb3VudCBsb2NrZWQgb24gaXRzIGJlaGFsZiBieSBhbnkgYWNjb3VudCBhdCBhbnkgdGltZSBpcyB0aGUgbWF4aW11bSBvZiB0aGUpASBzZWNvbmQgdmFsdWVzIG9mIHRoZSBpdGVtcyBpbiB0aGlzIGxpc3Qgd2hvc2UgZmlyc3QgdmFsdWUgaXMgdGhlIGFjY291bnQuAGEBIFRoZSBmaXJzdCBpdGVtIGluIHRoZSBsaXN0IGlzIHRoZSBhbW91bnQgbG9ja2VkIGZvciB0aGUgY3VycmVudCBMZWFzZSBQZXJpb2QuIEZvbGxvd2luZ7AgaXRlbXMgYXJlIGZvciB0aGUgc3Vic2VxdWVudCBsZWFzZSBwZXJpb2RzLgBhASBUaGUgZGVmYXVsdCB2YWx1ZSAoYW4gZW1wdHkgbGlzdCkgaW1wbGllcyB0aGF0IHRoZSBwYXJhY2hhaW4gbm8gbG9uZ2VyIGV4aXN0cyAob3IgbmV2ZXK0IGV4aXN0ZWQpIGFzIGZhciBhcyB0aGlzIHBhbGxldCBpcyBjb25jZXJuZWQuAFEBIElmIGEgcGFyYWNoYWluIGRvZXNuJ3QgZXhpc3QgKnlldCogYnV0IGlzIHNjaGVkdWxlZCB0byBleGlzdCBpbiB0aGUgZnV0dXJlLCB0aGVuIGl0YQEgd2lsbCBiZSBsZWZ0LXBhZGRlZCB3aXRoIG9uZSBvciBtb3JlIGBOb25lYHMgdG8gZGVub3RlIHRoZSBmYWN0IHRoYXQgbm90aGluZyBpcyBoZWxkIG9uXQEgZGVwb3NpdCBmb3IgdGhlIG5vbi1leGlzdGVudCBjaGFpbiBjdXJyZW50bHksIGJ1dCBpcyBoZWxkIGF0IHNvbWUgcG9pbnQgaW4gdGhlIGZ1dHVyZS4A3CBJdCBpcyBpbGxlZ2FsIGZvciBhIGBOb25lYCB2YWx1ZSB0byB0cmFpbCBpbiB0aGUgbGlzdC4BOQUBoQcILExlYXNlUGVyaW9kEBDAiQEABNwgVGhlIG51bWJlciBvZiBibG9ja3Mgb3ZlciB3aGljaCBhIHNpbmdsZSBwZXJpb2QgbGFzdHMuLExlYXNlT2Zmc2V0EBAAAAAABNQgVGhlIG51bWJlciBvZiBibG9ja3MgdG8gb2Zmc2V0IGVhY2ggbGVhc2UgcGVyaW9kIGJ5LgGJDEcAIEF1Y3Rpb25zASBBdWN0aW9ucxA4QXVjdGlvbkNvdW50ZXIBABAQAAAAAASMIE51bWJlciBvZiBhdWN0aW9ucyBzdGFydGVkIHNvIGZhci4sQXVjdGlvbkluZm8AAIAEABT4IEluZm9ybWF0aW9uIHJlbGF0aW5nIHRvIHRoZSBjdXJyZW50IGF1Y3Rpb24sIGlmIHRoZXJlIGlzIG9uZS4ARQEgVGhlIGZpcnN0IGl0ZW0gaW4gdGhlIHR1cGxlIGlzIHRoZSBsZWFzZSBwZXJpb2QgaW5kZXggdGhhdCB0aGUgZmlyc3Qgb2YgdGhlIGZvdXJRASBjb250aWd1b3VzIGxlYXNlIHBlcmlvZHMgb24gYXVjdGlvbiBpcyBmb3IuIFRoZSBzZWNvbmQgaXMgdGhlIGJsb2NrIG51bWJlciB3aGVuIHRoZV0BIGF1Y3Rpb24gd2lsbCAiYmVnaW4gdG8gZW5kIiwgaS5lLiB0aGUgZmlyc3QgYmxvY2sgb2YgdGhlIEVuZGluZyBQZXJpb2Qgb2YgdGhlIGF1Y3Rpb24uPFJlc2VydmVkQW1vdW50cwABBAWNDBgEAAgxASBBbW91bnRzIGN1cnJlbnRseSByZXNlcnZlZCBpbiB0aGUgYWNjb3VudHMgb2YgdGhlIGJpZGRlcnMgY3VycmVudGx5IHdpbm5pbmc4IChzdWItKXJhbmdlcy4cV2lubmluZwABBAUQkQwEAAxhASBUaGUgd2lubmluZyBiaWRzIGZvciBlYWNoIG9mIHRoZSAxMCByYW5nZXMgYXQgZWFjaCBzYW1wbGUgaW4gdGhlIGZpbmFsIEVuZGluZyBQZXJpb2Qgb2ZJASB0aGUgY3VycmVudCBhdWN0aW9uLiBUaGUgbWFwJ3Mga2V5IGlzIHRoZSAwLWJhc2VkIGluZGV4IGludG8gdGhlIFNhbXBsZSBTaXplLiBUaGUdASBmaXJzdCBzYW1wbGUgb2YgdGhlIGVuZGluZyBwZXJpb2QgaXMgMDsgdGhlIGxhc3QgaXMgYFNhbXBsZSBTaXplIC0gMWAuAT0FAaUHEDBFbmRpbmdQZXJpb2QQEEAZAQAEHQEgVGhlIG51bWJlciBvZiBibG9ja3Mgb3ZlciB3aGljaCBhbiBhdWN0aW9uIG1heSBiZSByZXRyb2FjdGl2ZWx5IGVuZGVkLjBTYW1wbGVMZW5ndGgQEBQAAAAM8CBUaGUgbGVuZ3RoIG9mIGVhY2ggc2FtcGxlIHRvIHRha2UgZHVyaW5nIHRoZSBlbmRpbmcgcGVyaW9kLgDUIGBFbmRpbmdQZXJpb2RgIC8gYFNhbXBsZUxlbmd0aGAgPSBUb3RhbCAjIG9mIFNhbXBsZXM4U2xvdFJhbmdlQ291bnQQECQAAAAATExlYXNlUGVyaW9kc1BlclNsb3QQEAgAAAAAAZ0MSAAkQ3Jvd2Rsb2FuASRDcm93ZGxvYW4QFEZ1bmRzAAEEBY0CoQwEAARoIEluZm8gb24gYWxsIG9mIHRoZSBmdW5kcy4gTmV3UmFpc2UBAJULBAAIVQEgVGhlIGZ1bmRzIHRoYXQgaGF2ZSBoYWQgYWRkaXRpb25hbCBjb250cmlidXRpb25zIGR1cmluZyB0aGUgbGFzdCBibG9jay4gVGhpcyBpcyB1c2VkFQEgaW4gb3JkZXIgdG8gZGV0ZXJtaW5lIHdoaWNoIGZ1bmRzIHNob3VsZCBzdWJtaXQgbmV3IG9yIHVwZGF0ZWQgYmlkcy4wRW5kaW5nc0NvdW50AQAQEAAAAAAEKQEgVGhlIG51bWJlciBvZiBhdWN0aW9ucyB0aGF0IGhhdmUgZW50ZXJlZCBpbnRvIHRoZWlyIGVuZGluZyBwZXJpb2Qgc28gZmFyLjROZXh0RnVuZEluZGV4AQAQEAAAAAAEqCBUcmFja2VyIGZvciB0aGUgbmV4dCBhdmFpbGFibGUgZnVuZCBpbmRleAFFBQGpBwwgUGFsbGV0SWSRCSBweS9jZnVuZAgNASBgUGFsbGV0SWRgIGZvciB0aGUgY3Jvd2Rsb2FuIHBhbGxldC4gQW4gYXBwcm9wcmlhdGUgdmFsdWUgY291bGQgYmVkIGBQYWxsZXRJZCgqYiJweS9jZnVuZCIpYDxNaW5Db250cmlidXRpb24YQAB0O6QLAAAAAAAAAAAAAAAIYQEgVGhlIG1pbmltdW0gYW1vdW50IHRoYXQgbWF5IGJlIGNvbnRyaWJ1dGVkIGludG8gYSBjcm93ZGxvYW4uIFNob3VsZCBhbG1vc3QgY2VydGFpbmx5IGJlfCBhdCBsZWFzdCBgRXhpc3RlbnRpYWxEZXBvc2l0YC48UmVtb3ZlS2V5c0xpbWl0EBDoAwAABOQgTWF4IG51bWJlciBvZiBzdG9yYWdlIGtleXMgdG8gcmVtb3ZlIHBlciBleHRyaW5zaWMgY2FsbC4BqQxJACBDb3JldGltZQABWQUBrQcIIEJyb2tlcklkEBDtAwAABIggVGhlIFBhcmFJZCBvZiB0aGUgY29yZXRpbWUgY2hhaW4uREJyb2tlclBvdExvY2F0aW9uEQGMAQEAbW9kbHB5L2Jyb2tlAAAAAAAAAAAAAAAAAAAAAAAAAAAEhCBUaGUgY29yZXRpbWUgY2hhaW4gcG90IGxvY2F0aW9uLgGtDEoASFN0YXRlVHJpZU1pZ3JhdGlvbgFIU3RhdGVUcmllTWlncmF0aW9uDEBNaWdyYXRpb25Qcm9jZXNzAQB5BTgAAAAAAAAAAAAAAAAAABBQIE1pZ3JhdGlvbiBwcm9ncmVzcy4AXQEgVGhpcyBzdG9yZXMgdGhlIHNuYXBzaG90IG9mIHRoZSBsYXN0IG1pZ3JhdGVkIGtleXMuIEl0IGNhbiBiZSBzZXQgaW50byBtb3Rpb24gYW5kIG1vdmXUIGZvcndhcmQgYnkgYW55IG9mIHRoZSBtZWFucyBwcm92aWRlZCBieSB0aGlzIHBhbGxldC4oQXV0b0xpbWl0cwEAcQUEAAzUIFRoZSBsaW1pdHMgdGhhdCBhcmUgaW1wb3NlZCBvbiBhdXRvbWF0aWMgbWlncmF0aW9ucy4A1CBJZiBzZXQgdG8gTm9uZSwgdGhlbiBubyBhdXRvbWF0aWMgbWlncmF0aW9uIGhhcHBlbnMuYFNpZ25lZE1pZ3JhdGlvbk1heExpbWl0cwAAdQUEAAzgIFRoZSBtYXhpbXVtIGxpbWl0cyB0aGF0IHRoZSBzaWduZWQgbWlncmF0aW9uIGNvdWxkIHVzZS4AtCBJZiBub3Qgc2V0LCBubyBzaWduZWQgc3VibWlzc2lvbiBpcyBhbGxvd2VkLgFtBQGxBwQkTWF4S2V5TGVuEBAAAgAAVLQgTWF4aW1hbCBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhIGtleSBjYW4gaGF2ZS4AsCBGUkFNRSBpdHNlbGYgZG9lcyBub3QgbGltaXQgdGhlIGtleSBsZW5ndGguAQEgVGhlIGNvbmNyZXRlIHZhbHVlIG11c3QgdGhlcmVmb3JlIGRlcGVuZCBvbiB5b3VyIHN0b3JhZ2UgdXNhZ2UuWQEgQSBbYGZyYW1lX3N1cHBvcnQ6OnN0b3JhZ2U6OlN0b3JhZ2VOTWFwYF0gZm9yIGV4YW1wbGUgY2FuIGhhdmUgYW4gYXJiaXRyYXJ5IG51bWJlciBvZkUBIGtleXMgd2hpY2ggYXJlIHRoZW4gaGFzaGVkIGFuZCBjb25jYXRlbmF0ZWQsIHJlc3VsdGluZyBpbiBhcmJpdHJhcmlseSBsb25nIGtleXMuAEEBIFVzZSB0aGUgKnN0YXRlIG1pZ3JhdGlvbiBSUEMqIHRvIHJldHJpZXZlIHRoZSBsZW5ndGggb2YgdGhlIGxvbmdlc3Qga2V5IGluIHlvdXIBASBzdG9yYWdlOiA8aHR0cHM6Ly9naXRodWIuY29tL3Bhcml0eXRlY2gvc3Vic3RyYXRlL2lzc3Vlcy8xMTY0Mj4AKQEgVGhlIG1pZ3JhdGlvbiB3aWxsIGhhbHQgd2l0aCBhIGBIYWx0ZWRgIGV2ZW50IGlmIHRoaXMgdmFsdWUgaXMgdG9vIHNtYWxsLkkBIFNpbmNlIHRoZXJlIGlzIG5vIHJlYWwgcGVuYWx0eSBmcm9tIG92ZXItZXN0aW1hdGluZywgaXQgaXMgYWR2aXNlZCB0byB1c2UgYSBsYXJnZYAgdmFsdWUuIFRoZSBkZWZhdWx0IGlzIDUxMiBieXRlLgCAIFNvbWUga2V5IGxlbmd0aHMgZm9yIHJlZmVyZW5jZTrQIC0gW2BmcmFtZV9zdXBwb3J0OjpzdG9yYWdlOjpTdG9yYWdlVmFsdWVgXTogMzIgYnl0ZcggLSBbYGZyYW1lX3N1cHBvcnQ6OnN0b3JhZ2U6OlN0b3JhZ2VNYXBgXTogNjQgYnl0ZeAgLSBbYGZyYW1lX3N1cHBvcnQ6OnN0b3JhZ2U6OlN0b3JhZ2VEb3VibGVNYXBgXTogOTYgYnl0ZQBIIEZvciBtb3JlIGluZm8gc2VlSQEgPGh0dHBzOi8vd3d3LnNoYXdudGFicml6aS5jb20vYmxvZy9zdWJzdHJhdGUvcXVlcnlpbmctc3Vic3RyYXRlLXN0b3JhZ2UtdmlhLXJwYy8+AbkHYgAkWGNtUGFsbGV0ASRYY21QYWxsZXQ4MFF1ZXJ5Q291bnRlcgEAMCAAAAAAAAAAAASIIFRoZSBsYXRlc3QgYXZhaWxhYmxlIHF1ZXJ5IGluZGV4LhxRdWVyaWVzAAEEAjCxDAQABFQgVGhlIG9uZ29pbmcgcXVlcmllcy4oQXNzZXRUcmFwcwEBBAY0EBAAAAAAEGggVGhlIGV4aXN0aW5nIGFzc2V0IHRyYXBzLgBhASBLZXkgaXMgdGhlIGJsYWtlMiAyNTYgaGFzaCBvZiAob3JpZ2luLCB2ZXJzaW9uZWQgYEFzc2V0c2ApIHBhaXIuIFZhbHVlIGlzIHRoZSBudW1iZXIgb2YdASB0aW1lcyB0aGlzIHBhaXIgaGFzIGJlZW4gdHJhcHBlZCAodXN1YWxseSBqdXN0IDEgaWYgaXQgZXhpc3RzIGF0IGFsbCkuOFNhZmVYY21WZXJzaW9uAAAQBAAIYQEgRGVmYXVsdCB2ZXJzaW9uIHRvIGVuY29kZSBYQ00gd2hlbiBsYXRlc3QgdmVyc2lvbiBvZiBkZXN0aW5hdGlvbiBpcyB1bmtub3duLiBJZiBgTm9uZWAsPQEgdGhlbiB0aGUgZGVzdGluYXRpb25zIHdob3NlIFhDTSB2ZXJzaW9uIGlzIHVua25vd24gYXJlIGNvbnNpZGVyZWQgdW5yZWFjaGFibGUuQFN1cHBvcnRlZFZlcnNpb24AAQgFAsUMEAQABPAgVGhlIExhdGVzdCB2ZXJzaW9ucyB0aGF0IHdlIGtub3cgdmFyaW91cyBsb2NhdGlvbnMgc3VwcG9ydC5AVmVyc2lvbk5vdGlmaWVycwABCAUCxQwwBAAEBQEgQWxsIGxvY2F0aW9ucyB0aGF0IHdlIGhhdmUgcmVxdWVzdGVkIHZlcnNpb24gbm90aWZpY2F0aW9ucyBmcm9tLlBWZXJzaW9uTm90aWZ5VGFyZ2V0cwABCAUCxQzJDAQACHEBIFRoZSB0YXJnZXQgbG9jYXRpb25zIHRoYXQgYXJlIHN1YnNjcmliZWQgdG8gb3VyIHZlcnNpb24gY2hhbmdlcywgYXMgd2VsbCBhcyB0aGUgbW9zdCByZWNlbnSUIG9mIG91ciB2ZXJzaW9ucyB3ZSBpbmZvcm1lZCB0aGVtIG9mLlRWZXJzaW9uRGlzY292ZXJ5UXVldWUBAM0MBAAMZQEgRGVzdGluYXRpb25zIHdob3NlIGxhdGVzdCBYQ00gdmVyc2lvbiB3ZSB3b3VsZCBsaWtlIHRvIGtub3cuIER1cGxpY2F0ZXMgbm90IGFsbG93ZWQsIGFuZHEBIHRoZSBgdTMyYCBjb3VudGVyIGlzIHRoZSBudW1iZXIgb2YgdGltZXMgdGhhdCBhIHNlbmQgdG8gdGhlIGRlc3RpbmF0aW9uIGhhcyBiZWVuIGF0dGVtcHRlZCyMIHdoaWNoIGlzIHVzZWQgYXMgYSBwcmlvcml0aXphdGlvbi5AQ3VycmVudE1pZ3JhdGlvbgAA2QwEAAScIFRoZSBjdXJyZW50IG1pZ3JhdGlvbidzIHN0YWdlLCBpZiBhbnkuVFJlbW90ZUxvY2tlZEZ1bmdpYmxlcwABDAUCAuEM5QwEAATwIEZ1bmdpYmxlIGFzc2V0cyB3aGljaCB3ZSBrbm93IGFyZSBsb2NrZWQgb24gYSByZW1vdGUgY2hhaW4uPExvY2tlZEZ1bmdpYmxlcwABBAIA9QwEAATgIEZ1bmdpYmxlIGFzc2V0cyB3aGljaCB3ZSBrbm93IGFyZSBsb2NrZWQgb24gdGhpcyBjaGFpbi5UWGNtRXhlY3V0aW9uU3VzcGVuZGVkAQAgBAAEtCBHbG9iYWwgc3VzcGVuc2lvbiBzdGF0ZSBvZiB0aGUgWENNIGV4ZWN1dG9yLjxTaG91bGRSZWNvcmRYY20BACAEABxZASBXaGV0aGVyIG9yIG5vdCBpbmNvbWluZyBYQ01zIChib3RoIGV4ZWN1dGVkIGxvY2FsbHkgYW5kIHJlY2VpdmVkKSBzaG91bGQgYmUgcmVjb3JkZWQuxCBPbmx5IG9uZSBYQ00gcHJvZ3JhbSB3aWxsIGJlIHJlY29yZGVkIGF0IGEgdGltZS4pASBUaGlzIGlzIG1lYW50IHRvIGJlIHVzZWQgaW4gcnVudGltZSBBUElzLCBhbmQgaXQncyBhZHZpc2VkIGl0IHN0YXlzIGZhbHNlDQEgZm9yIGFsbCBvdGhlciB1c2UgY2FzZXMsIHNvIGFzIHRvIG5vdCBkZWdyYWRlIHJlZ3VsYXIgcGVyZm9ybWFuY2UuAFkBIE9ubHkgcmVsZXZhbnQgaWYgdGhpcyBwYWxsZXQgaXMgYmVpbmcgdXNlZCBhcyB0aGUgW2B4Y21fZXhlY3V0b3I6OnRyYWl0czo6UmVjb3JkWGNtYF3IIGltcGxlbWVudGF0aW9uIGluIHRoZSBYQ00gZXhlY3V0b3IgY29uZmlndXJhdGlvbi4sUmVjb3JkZWRYY20AAEEGBAAYSQEgSWYgW2BTaG91bGRSZWNvcmRYY21gXSBpcyBzZXQgdG8gdHJ1ZSwgdGhlbiB0aGUgbGFzdCBYQ00gcHJvZ3JhbSBleGVjdXRlZCBsb2NhbGx5VCB3aWxsIGJlIHN0b3JlZCBoZXJlLikBIFJ1bnRpbWUgQVBJcyBjYW4gZmV0Y2ggdGhlIFhDTSB0aGF0IHdhcyBleGVjdXRlZCBieSBhY2Nlc3NpbmcgdGhpcyB2YWx1ZS4AWQEgT25seSByZWxldmFudCBpZiB0aGlzIHBhbGxldCBpcyBiZWluZyB1c2VkIGFzIHRoZSBbYHhjbV9leGVjdXRvcjo6dHJhaXRzOjpSZWNvcmRYY21gXcggaW1wbGVtZW50YXRpb24gaW4gdGhlIFhDTSBleGVjdXRvciBjb25maWd1cmF0aW9uLgGFBQG9BwABAQ1jADBNZXNzYWdlUXVldWUBME1lc3NhZ2VRdWV1ZQwwQm9va1N0YXRlRm9yAQEEBcUGBQ10AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEzCBUaGUgaW5kZXggb2YgdGhlIGZpcnN0IGFuZCBsYXN0IChub24tZW1wdHkpIHBhZ2VzLixTZXJ2aWNlSGVhZAAAxQYEAAS8IFRoZSBvcmlnaW4gYXQgd2hpY2ggd2Ugc2hvdWxkIGJlZ2luIHNlcnZpY2luZy4UUGFnZXMAAQgFBRENFQ0EAASIIFRoZSBtYXAgb2YgcGFnZSBpbmRpY2VzIHRvIHBhZ2VzLgHBBgHFBxAgSGVhcFNpemUQEAAAAQAUPQEgVGhlIHNpemUgb2YgdGhlIHBhZ2U7IHRoaXMgaW1wbGllcyB0aGUgbWF4aW11bSBtZXNzYWdlIHNpemUgd2hpY2ggY2FuIGJlIHNlbnQuAFkBIEEgZ29vZCB2YWx1ZSBkZXBlbmRzIG9uIHRoZSBleHBlY3RlZCBtZXNzYWdlIHNpemVzLCB0aGVpciB3ZWlnaHRzLCB0aGUgd2VpZ2h0IHRoYXQgaXNdASBhdmFpbGFibGUgZm9yIHByb2Nlc3NpbmcgdGhlbSBhbmQgdGhlIG1heGltYWwgbmVlZGVkIG1lc3NhZ2Ugc2l6ZS4gVGhlIG1heGltYWwgbWVzc2FnZREBIHNpemUgaXMgc2xpZ2h0bHkgbG93ZXIgdGhhbiB0aGlzIGFzIGRlZmluZWQgYnkgW2BNYXhNZXNzYWdlTGVuT2ZgXS4gTWF4U3RhbGUQEAgAAAAMXQEgVGhlIG1heGltdW0gbnVtYmVyIG9mIHN0YWxlIHBhZ2VzIChpLmUuIG9mIG92ZXJ3ZWlnaHQgbWVzc2FnZXMpIGFsbG93ZWQgYmVmb3JlIGN1bGxpbmdRASBjYW4gaGFwcGVuLiBPbmNlIHRoZXJlIGFyZSBtb3JlIHN0YWxlIHBhZ2VzIHRoYW4gdGhpcywgdGhlbiBoaXN0b3JpY2FsIHBhZ2VzIG1heSBiZfwgZHJvcHBlZCwgZXZlbiBpZiB0aGV5IGNvbnRhaW4gdW5wcm9jZXNzZWQgb3ZlcndlaWdodCBtZXNzYWdlcy40U2VydmljZVdlaWdodB0HQAEHAKDbIV0TMzMzMzMzMzMYQQEgVGhlIGFtb3VudCBvZiB3ZWlnaHQgKGlmIGFueSkgd2hpY2ggc2hvdWxkIGJlIHByb3ZpZGVkIHRvIHRoZSBtZXNzYWdlIHF1ZXVlIGZvcqggc2VydmljaW5nIGVucXVldWVkIGl0ZW1zIGBvbl9pbml0aWFsaXplYC4A/CBUaGlzIG1heSBiZSBsZWdpdGltYXRlbHkgYE5vbmVgIGluIHRoZSBjYXNlIHRoYXQgeW91IHdpbGwgY2FsbF0BIGBTZXJ2aWNlUXVldWVzOjpzZXJ2aWNlX3F1ZXVlc2AgbWFudWFsbHkgb3Igc2V0IFtgU2VsZjo6SWRsZU1heFNlcnZpY2VXZWlnaHRgXSB0byBoYXZlVCBpdCBydW4gaW4gYG9uX2lkbGVgLlBJZGxlTWF4U2VydmljZVdlaWdodB0HQAEHAKDbIV0TMzMzMzMzMzMUXQEgVGhlIG1heGltdW0gYW1vdW50IG9mIHdlaWdodCAoaWYgYW55KSB0byBiZSB1c2VkIGZyb20gcmVtYWluaW5nIHdlaWdodCBgb25faWRsZWAgd2hpY2hBASBzaG91bGQgYmUgcHJvdmlkZWQgdG8gdGhlIG1lc3NhZ2UgcXVldWUgZm9yIHNlcnZpY2luZyBlbnF1ZXVlZCBpdGVtcyBgb25faWRsZWAuPQEgVXNlZnVsIGZvciBwYXJhY2hhaW5zIHRvIHByb2Nlc3MgbWVzc2FnZXMgYXQgdGhlIHNhbWUgYmxvY2sgdGhleSBhcmUgcmVjZWl2ZWQuACkBIElmIGBOb25lYCwgaXQgd2lsbCBub3QgY2FsbCBgU2VydmljZVF1ZXVlczo6c2VydmljZV9xdWV1ZXNgIGluIGBvbl9pZGxlYC4BHQ1kACRBc3NldFJhdGUBJEFzc2V0UmF0ZQRYQ29udmVyc2lvblJhdGVUb05hdGl2ZQABBALc0QYEAAwdASBNYXBzIGFuIGFzc2V0IHRvIGl0cyBmaXhlZCBwb2ludCByZXByZXNlbnRhdGlvbiBpbiB0aGUgbmF0aXZlIGJhbGFuY2UuAE0BIEUuZy4gYG5hdGl2ZV9hbW91bnQgPSBhc3NldF9hbW91bnQgKiBDb252ZXJzaW9uUmF0ZVRvTmF0aXZlOjo8VD46OmdldChhc3NldF9raW5kKWABzQYBzQcAASENZQAUQmVlZnkBFEJlZWZ5FCxBdXRob3JpdGllcwEAJQ0EAARwIFRoZSBjdXJyZW50IGF1dGhvcml0aWVzIHNldDhWYWxpZGF0b3JTZXRJZAEAMCAAAAAAAAAAAAR0IFRoZSBjdXJyZW50IHZhbGlkYXRvciBzZXQgaWQ8TmV4dEF1dGhvcml0aWVzAQAlDQQABOwgQXV0aG9yaXRpZXMgc2V0IHNjaGVkdWxlZCB0byBiZSB1c2VkIHdpdGggdGhlIG5leHQgc2Vzc2lvbjBTZXRJZFNlc3Npb24AAQQFMBAEAChRASBBIG1hcHBpbmcgZnJvbSBCRUVGWSBzZXQgSUQgdG8gdGhlIGluZGV4IG9mIHRoZSAqbW9zdCByZWNlbnQqIHNlc3Npb24gZm9yIHdoaWNoIGl0c2ggbWVtYmVycyB3ZXJlIHJlc3BvbnNpYmxlLgBFASBUaGlzIGlzIG9ubHkgdXNlZCBmb3IgdmFsaWRhdGluZyBlcXVpdm9jYXRpb24gcHJvb2ZzLiBBbiBlcXVpdm9jYXRpb24gcHJvb2YgbXVzdE0BIGNvbnRhaW5zIGEga2V5LW93bmVyc2hpcCBwcm9vZiBmb3IgYSBnaXZlbiBzZXNzaW9uLCB0aGVyZWZvcmUgd2UgbmVlZCBhIHdheSB0byB0aWU9ASB0b2dldGhlciBzZXNzaW9ucyBhbmQgQkVFRlkgc2V0IGlkcywgaS5lLiB3ZSBuZWVkIHRvIHZhbGlkYXRlIHRoYXQgYSB2YWxpZGF0b3JBASB3YXMgdGhlIG93bmVyIG9mIGEgZ2l2ZW4ga2V5IG9uIGEgZ2l2ZW4gc2Vzc2lvbiwgYW5kIHdoYXQgdGhlIGFjdGl2ZSBzZXQgSUQgd2FzVCBkdXJpbmcgdGhhdCBzZXNzaW9uLgDcIFRXT1gtTk9URTogYFZhbGlkYXRvclNldElkYCBpcyBub3QgdW5kZXIgdXNlciBjb250cm9sLjBHZW5lc2lzQmxvY2sBAGECBAAM3CBCbG9jayBudW1iZXIgd2hlcmUgQkVFRlkgY29uc2Vuc3VzIGlzIGVuYWJsZWQvc3RhcnRlZC5pASBCeSBjaGFuZ2luZyB0aGlzICh0aHJvdWdoIHByaXZpbGVnZWQgYHNldF9uZXdfZ2VuZXNpcygpYCksIEJFRUZZIGNvbnNlbnN1cyBpcyBlZmZlY3RpdmVseawgcmVzdGFydGVkIGZyb20gdGhlIG5ld2x5IHNldCBibG9jayBudW1iZXIuAdUGAAw4TWF4QXV0aG9yaXRpZXMQEKCGAQAE1CBUaGUgbWF4aW11bSBudW1iZXIgb2YgYXV0aG9yaXRpZXMgdGhhdCBjYW4gYmUgYWRkZWQuNE1heE5vbWluYXRvcnMQEAACAAAE1CBUaGUgbWF4aW11bSBudW1iZXIgb2Ygbm9taW5hdG9ycyBmb3IgZWFjaCB2YWxpZGF0b3IuWE1heFNldElkU2Vzc2lvbkVudHJpZXMwIKgAAAAAAAAAGDkBIFRoZSBtYXhpbXVtIG51bWJlciBvZiBlbnRyaWVzIHRvIGtlZXAgaW4gdGhlIHNldCBpZCB0byBzZXNzaW9uIGluZGV4IG1hcHBpbmcuADEBIFNpbmNlIHRoZSBgU2V0SWRTZXNzaW9uYCBtYXAgaXMgb25seSB1c2VkIGZvciB2YWxpZGF0aW5nIGVxdWl2b2NhdGlvbnMgdGhpcykBIHZhbHVlIHNob3VsZCByZWxhdGUgdG8gdGhlIGJvbmRpbmcgZHVyYXRpb24gb2Ygd2hhdGV2ZXIgc3Rha2luZyBzeXN0ZW0gaXM1ASBiZWluZyB1c2VkIChpZiBhbnkpLiBJZiBlcXVpdm9jYXRpb24gaGFuZGxpbmcgaXMgbm90IGVuYWJsZWQgdGhlbiB0aGlzIHZhbHVlNCBjYW4gYmUgemVyby4BLQ3IAAxNbXIBDE1tcgwgUm9vdEhhc2gBADSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEWCBMYXRlc3QgTU1SIFJvb3QgaGFzaC44TnVtYmVyT2ZMZWF2ZXMBADAgAAAAAAAAAAAEsCBDdXJyZW50IHNpemUgb2YgdGhlIE1NUiAobnVtYmVyIG9mIGxlYXZlcykuFE5vZGVzAAEEBjA0BAAQgCBIYXNoZXMgb2YgdGhlIG5vZGVzIGluIHRoZSBNTVIuAC0BIE5vdGUgdGhpcyBjb2xsZWN0aW9uIG9ubHkgY29udGFpbnMgTU1SIHBlYWtzLCB0aGUgaW5uZXIgbm9kZXMgKGFuZCBsZWF2ZXMpvCBhcmUgcHJ1bmVkIGFuZCBvbmx5IHN0b3JlZCBpbiB0aGUgT2ZmY2hhaW4gREIuAAAAAMkAMEJlZWZ5TW1yTGVhZgEwQmVlZnlNbXJMZWFmCEBCZWVmeUF1dGhvcml0aWVzAQAxDbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASgIERldGFpbHMgb2YgY3VycmVudCBCRUVGWSBhdXRob3JpdHkgc2V0LlBCZWVmeU5leHRBdXRob3JpdGllcwEAMQ2wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMlCBEZXRhaWxzIG9mIG5leHQgQkVFRlkgYXV0aG9yaXR5IHNldC4AUQEgVGhpcyBzdG9yYWdlIGVudHJ5IGlzIHVzZWQgYXMgY2FjaGUgZm9yIGNhbGxzIHRvIGB1cGRhdGVfYmVlZnlfbmV4dF9hdXRob3JpdHlfc2V0YC4AAAAAygA8UGFyYVN1ZG9XcmFwcGVyAAH5BgAAATUN+gAQU3VkbwEQU3VkbwQMS2V5AAAABAAEhCBUaGUgYEFjY291bnRJZGAgb2YgdGhlIHN1ZG8ga2V5LgEBBwHRBwABOQ3/AATFAXUBVQU9DShIQ2hlY2tOb25aZXJvU2VuZGVyQQ2MQENoZWNrU3BlY1ZlcnNpb25FDRA4Q2hlY2tUeFZlcnNpb25JDRAwQ2hlY2tHZW5lc2lzTQ00OENoZWNrTW9ydGFsaXR5UQ00KENoZWNrTm9uY2VZDYwsQ2hlY2tXZWlnaHRdDYxgQ2hhcmdlVHJhbnNhY3Rpb25QYXltZW50YQ2MSFByZXZhbGlkYXRlQXR0ZXN0c2UNjERDaGVja01ldGFkYXRhSGFzaGkNhHENXCRJbmZsYXRpb24EmGV4cGVyaW1lbnRhbF9pbmZsYXRpb25fcHJlZGljdGlvbl9pbmZvAHUNENggUmV0dXJuIHRoZSBjdXJyZW50IGVzdGltYXRlcyBvZiB0aGUgaW5mbGF0aW9uIGFtb3VudC4AUQEgVGhpcyBpcyBtYXJrZWQgYXMgZXhwZXJpbWVudGFsIGluIGxpZ2h0IG9mIFJGQyM4OS4gTm9uZXRoZWxlc3MsIGl0cyB1c2FnZSBpcyBoaWdobHklASByZWNvbW1lbmRlZCBvdmVyIHRyeWluZyB0byByZWFkLXN0b3JhZ2UsIG9yIHJlLWNyZWF0ZSB0aGUgb25jaGFpbiBsb2dpYy4AEENvcmUMHHZlcnNpb24AAQgEkCBSZXR1cm5zIHRoZSB2ZXJzaW9uIG9mIHRoZSBydW50aW1lLjRleGVjdXRlX2Jsb2NrBBRibG9ja30NjARkIEV4ZWN1dGUgdGhlIGdpdmVuIGJsb2NrLkBpbml0aWFsaXplX2Jsb2NrBBhoZWFkZXKhAYkNBEEBIEluaXRpYWxpemUgYSBibG9jayB3aXRoIHRoZSBnaXZlbiBoZWFkZXIgYW5kIHJldHVybiB0aGUgcnVudGltZSBleGVjdXRpdmUgbW9kZS4EIQEgVGhlIGBDb3JlYCBydW50aW1lIGFwaSB0aGF0IGV2ZXJ5IFN1YnN0cmF0ZSBydW50aW1lIG5lZWRzIHRvIGltcGxlbWVudC4gTWV0YWRhdGEMIG1ldGFkYXRhAI0NBIwgUmV0dXJucyB0aGUgbWV0YWRhdGEgb2YgYSBydW50aW1lLkxtZXRhZGF0YV9hdF92ZXJzaW9uBBx2ZXJzaW9uEJENEKQgUmV0dXJucyB0aGUgbWV0YWRhdGEgYXQgYSBnaXZlbiB2ZXJzaW9uLgAFASBJZiB0aGUgZ2l2ZW4gYHZlcnNpb25gIGlzbid0IHN1cHBvcnRlZCwgdGhpcyB3aWxsIHJldHVybiBgTm9uZWAudQEgVXNlIFtgU2VsZjo6bWV0YWRhdGFfdmVyc2lvbnNgXSB0byBmaW5kIG91dCBhYm91dCBzdXBwb3J0ZWQgbWV0YWRhdGEgdmVyc2lvbiBvZiB0aGUgcnVudGltZS5EbWV0YWRhdGFfdmVyc2lvbnMA5QEMpCBSZXR1cm5zIHRoZSBzdXBwb3J0ZWQgbWV0YWRhdGEgdmVyc2lvbnMuAMAgVGhpcyBjYW4gYmUgdXNlZCB0byBjYWxsIGBtZXRhZGF0YV9hdF92ZXJzaW9uYC4EAQEgVGhlIGBNZXRhZGF0YWAgYXBpIHRyYWl0IHRoYXQgcmV0dXJucyBtZXRhZGF0YSBmb3IgdGhlIHJ1bnRpbWUuMEJsb2NrQnVpbGRlchA8YXBwbHlfZXh0cmluc2ljBCRleHRyaW5zaWOBDZUNEGwgQXBwbHkgdGhlIGdpdmVuIGV4dHJpbnNpYy4AOQEgUmV0dXJucyBhbiBpbmNsdXNpb24gb3V0Y29tZSB3aGljaCBzcGVjaWZpZXMgaWYgdGhpcyBleHRyaW5zaWMgaXMgaW5jbHVkZWQgaW5MIHRoaXMgYmxvY2sgb3Igbm90LjhmaW5hbGl6ZV9ibG9jawChAQRoIEZpbmlzaCB0aGUgY3VycmVudCBibG9jay5MaW5oZXJlbnRfZXh0cmluc2ljcwQgaW5oZXJlbnSlDYUNBD0BIEdlbmVyYXRlIGluaGVyZW50IGV4dHJpbnNpY3MuIFRoZSBpbmhlcmVudCBkYXRhIHdpbGwgdmFyeSBmcm9tIGNoYWluIHRvIGNoYWluLjxjaGVja19pbmhlcmVudHMIFGJsb2NrfQ0QZGF0YaUNtQ0EVQEgQ2hlY2sgdGhhdCB0aGUgaW5oZXJlbnRzIGFyZSB2YWxpZC4gVGhlIGluaGVyZW50IGRhdGEgd2lsbCB2YXJ5IGZyb20gY2hhaW4gdG8gY2hhaW4uBHEBIFRoZSBgQmxvY2tCdWlsZGVyYCBhcGkgdHJhaXQgdGhhdCBwcm92aWRlcyB0aGUgcmVxdWlyZWQgZnVuY3Rpb25hbGl0eSBmb3IgYnVpbGRpbmcgYSBibG9jay5ITm9taW5hdGlvblBvb2xzQXBpHDxwZW5kaW5nX3Jld2FyZHMEDHdobwAYBDUBIFJldHVybnMgdGhlIHBlbmRpbmcgcmV3YXJkcyBmb3IgdGhlIG1lbWJlciB0aGF0IHRoZSBBY2NvdW50SWQgd2FzIGdpdmVuIGZvci5EcG9pbnRzX3RvX2JhbGFuY2UIHHBvb2xfaWQQGHBvaW50cxgYBPQgUmV0dXJucyB0aGUgZXF1aXZhbGVudCBiYWxhbmNlIG9mIGBwb2ludHNgIGZvciBhIGdpdmVuIHBvb2wuRGJhbGFuY2VfdG9fcG9pbnRzCBxwb29sX2lkECRuZXdfZnVuZHMYGAT8IFJldHVybnMgdGhlIGVxdWl2YWxlbnQgcG9pbnRzIG9mIGBuZXdfZnVuZHNgIGZvciBhIGdpdmVuIHBvb2wuSHBvb2xfcGVuZGluZ19zbGFzaAQccG9vbF9pZBAYBLAgUmV0dXJucyB0aGUgcGVuZGluZyBzbGFzaCBmb3IgYSBnaXZlbiBwb29sLlBtZW1iZXJfcGVuZGluZ19zbGFzaAQYbWVtYmVyABgEzCBSZXR1cm5zIHRoZSBwZW5kaW5nIHNsYXNoIGZvciBhIGdpdmVuIHBvb2wgbWVtYmVyLnRwb29sX25lZWRzX2RlbGVnYXRlX21pZ3JhdGlvbgQccG9vbF9pZBAgIOQgUmV0dXJucyB0cnVlIGlmIHRoZSBwb29sIHdpdGggYHBvb2xfaWRgIG5lZWRzIG1pZ3JhdGlvbi4ASQEgVGhpcyBjYW4gaGFwcGVuIHdoZW4gdGhlIGBwYWxsZXQtbm9taW5hdGlvbi1wb29sc2AgaGFzIHN3aXRjaGVkIHRvIHVzaW5nIHN0cmF0ZWd5QQEgW2BEZWxlZ2F0ZVN0YWtlYF0ocGFsbGV0X25vbWluYXRpb25fcG9vbHM6OmFkYXB0ZXI6OkRlbGVnYXRlU3Rha2UpIGJ1dCB0aGUgcG9vbOggc3RpbGwgaGFzIGZ1bmRzIHRoYXQgd2VyZSBzdGFrZWQgdXNpbmcgdGhlIG9sZGVyIHN0cmF0ZWd5GQEgW1RyYW5zZmVyU3Rha2VdKHBhbGxldF9ub21pbmF0aW9uX3Bvb2xzOjphZGFwdGVyOjpUcmFuc2ZlclN0YWtlKS4gVXNliQEgW2BtaWdyYXRlX3Bvb2xfdG9fZGVsZWdhdGVfc3Rha2VgXShwYWxsZXRfbm9taW5hdGlvbl9wb29sczo6Q2FsbDo6bWlncmF0ZV9wb29sX3RvX2RlbGVnYXRlX3N0YWtlKVQgdG8gbWlncmF0ZSB0aGUgcG9vbC58bWVtYmVyX25lZWRzX2RlbGVnYXRlX21pZ3JhdGlvbgQYbWVtYmVyACAcKQEgUmV0dXJucyB0cnVlIGlmIHRoZSBkZWxlZ2F0ZWQgZnVuZHMgb2YgdGhlIHBvb2wgYG1lbWJlcmAgbmVlZHMgbWlncmF0aW9uLgDYIE9uY2UgYSBwb29sIGhhcyBzdWNjZXNzZnVsbHkgbWlncmF0ZWQgdG8gdGhlIHN0cmF0ZWd5VQEgW2BEZWxlZ2F0ZVN0YWtlYF0ocGFsbGV0X25vbWluYXRpb25fcG9vbHM6OmFkYXB0ZXI6OkRlbGVnYXRlU3Rha2UpLCB0aGUgZnVuZHMgb2YgdGhlGQEgbWVtYmVyIGNhbiBiZSBtaWdyYXRlZCBmcm9tIHBvb2wgYWNjb3VudCB0byB0aGUgbWVtYmVyJ3MgYWNjb3VudC4gVXNlKQEgW2BtaWdyYXRlX2RlbGVnYXRpb25gXShwYWxsZXRfbm9taW5hdGlvbl9wb29sczo6Q2FsbDo6bWlncmF0ZV9kZWxlZ2F0aW9uKaQgdG8gbWlncmF0ZSB0aGUgZnVuZHMgb2YgdGhlIHBvb2wgbWVtYmVyLgT4IFJ1bnRpbWUgYXBpIGZvciBhY2Nlc3NpbmcgaW5mb3JtYXRpb24gYWJvdXQgbm9taW5hdGlvbiBwb29scy4oU3Rha2luZ0FwaQxEbm9taW5hdGlvbnNfcXVvdGEEHGJhbGFuY2UYEAQRASBSZXR1cm5zIHRoZSBub21pbmF0aW9ucyBxdW90YSBmb3IgYSBub21pbmF0b3Igd2l0aCBhIGdpdmVuIGJhbGFuY2UuXGVyYXNfc3Rha2Vyc19wYWdlX2NvdW50CAxlcmEQHGFjY291bnQAEAQ5ASBSZXR1cm5zIHRoZSBwYWdlIGNvdW50IG9mIGV4cG9zdXJlcyBmb3IgYSB2YWxpZGF0b3IgYGFjY291bnRgIGluIGEgZ2l2ZW4gZXJhLjxwZW5kaW5nX3Jld2FyZHMIDGVyYRAcYWNjb3VudAAgBD0BIFJldHVybnMgdHJ1ZSBpZiB2YWxpZGF0b3IgYGFjY291bnRgIGhhcyBwYWdlcyB0byBiZSBjbGFpbWVkIGZvciB0aGUgZ2l2ZW4gZXJhLgBYVGFnZ2VkVHJhbnNhY3Rpb25RdWV1ZQRQdmFsaWRhdGVfdHJhbnNhY3Rpb24MGHNvdXJjZbkNCHR4gQ0oYmxvY2tfaGFzaDS9DSRoIFZhbGlkYXRlIHRoZSB0cmFuc2FjdGlvbi4AZQEgVGhpcyBtZXRob2QgaXMgaW52b2tlZCBieSB0aGUgdHJhbnNhY3Rpb24gcG9vbCB0byBsZWFybiBkZXRhaWxzIGFib3V0IGdpdmVuIHRyYW5zYWN0aW9uLkUBIFRoZSBpbXBsZW1lbnRhdGlvbiBzaG91bGQgbWFrZSBzdXJlIHRvIHZlcmlmeSB0aGUgY29ycmVjdG5lc3Mgb2YgdGhlIHRyYW5zYWN0aW9uTQEgYWdhaW5zdCBjdXJyZW50IHN0YXRlLiBUaGUgZ2l2ZW4gYGJsb2NrX2hhc2hgIGNvcnJlc3BvbmRzIHRvIHRoZSBoYXNoIG9mIHRoZSBibG9ja3wgdGhhdCBpcyB1c2VkIGFzIGN1cnJlbnQgc3RhdGUuAEUBIE5vdGUgdGhhdCB0aGlzIGNhbGwgbWF5IGJlIHBlcmZvcm1lZCBieSB0aGUgcG9vbCBtdWx0aXBsZSB0aW1lcyBhbmQgdHJhbnNhY3Rpb25zpCBtaWdodCBiZSB2ZXJpZmllZCBpbiBhbnkgcG9zc2libGUgb3JkZXIuBE0BIFRoZSBgVGFnZ2VkVHJhbnNhY3Rpb25RdWV1ZWAgYXBpIHRyYWl0IGZvciBpbnRlcmZlcmluZyB3aXRoIHRoZSB0cmFuc2FjdGlvbiBxdWV1ZS5ET2ZmY2hhaW5Xb3JrZXJBcGkEPG9mZmNoYWluX3dvcmtlcgQYaGVhZGVyoQGMBMggU3RhcnRzIHRoZSBvZmYtY2hhaW4gdGFzayBmb3IgZ2l2ZW4gYmxvY2sgaGVhZGVyLgRkIFRoZSBvZmZjaGFpbiB3b3JrZXIgYXBpLjRQYXJhY2hhaW5Ib3N0fCh2YWxpZGF0b3JzACkLBHAgR2V0IHRoZSBjdXJyZW50IHZhbGlkYXRvcnMuQHZhbGlkYXRvcl9ncm91cHMAxQ0MZQEgUmV0dXJucyB0aGUgdmFsaWRhdG9yIGdyb3VwcyBhbmQgcm90YXRpb24gaW5mbyBsb2NhbGl6ZWQgYmFzZWQgb24gdGhlIGh5cG90aGV0aWNhbCBjaGlsZGEBICBvZiBhIGJsb2NrIHdob3NlIHN0YXRlICB0aGlzIGlzIGludm9rZWQgb24uIE5vdGUgdGhhdCBgbm93YCBpbiB0aGUgYEdyb3VwUm90YXRpb25JbmZvYNAgc2hvdWxkIGJlIHRoZSBzdWNjZXNzb3Igb2YgdGhlIG51bWJlciBvZiB0aGUgYmxvY2suSGF2YWlsYWJpbGl0eV9jb3JlcwDNDQg1ASBZaWVsZHMgaW5mb3JtYXRpb24gb24gYWxsIGF2YWlsYWJpbGl0eSBjb3JlcyBhcyByZWxldmFudCB0byB0aGUgY2hpbGQgYmxvY2suPQEgQ29yZXMgYXJlIGVpdGhlciBmcmVlIG9yIG9jY3VwaWVkLiBGcmVlIGNvcmVzIGNhbiBoYXZlIHBhcmFzIGFzc2lnbmVkIHRvIHRoZW0uZHBlcnNpc3RlZF92YWxpZGF0aW9uX2RhdGEIHHBhcmFfaWSNAihhc3N1bXB0aW9u5Q3pDRRpASBZaWVsZHMgdGhlIHBlcnNpc3RlZCB2YWxpZGF0aW9uIGRhdGEgZm9yIHRoZSBnaXZlbiBgUGFyYUlkYCBhbG9uZyB3aXRoIGFuIGFzc3VtcHRpb24gdGhhdNggc2hvdWxkIGJlIHVzZWQgaWYgdGhlIHBhcmEgY3VycmVudGx5IG9jY3VwaWVzIGEgY29yZS4ARQEgUmV0dXJucyBgTm9uZWAgaWYgZWl0aGVyIHRoZSBwYXJhIGlzIG5vdCByZWdpc3RlcmVkIG9yIHRoZSBhc3N1bXB0aW9uIGlzIGBGcmVlZGCYIGFuZCB0aGUgcGFyYSBhbHJlYWR5IG9jY3VwaWVzIGEgY29yZS5cYXNzdW1lZF92YWxpZGF0aW9uX2RhdGEIHHBhcmFfaWSNApxleHBlY3RlZF9wZXJzaXN0ZWRfdmFsaWRhdGlvbl9kYXRhX2hhc2g08Q0MaQEgUmV0dXJucyB0aGUgcGVyc2lzdGVkIHZhbGlkYXRpb24gZGF0YSBmb3IgdGhlIGdpdmVuIGBQYXJhSWRgIGFsb25nIHdpdGggdGhlIGNvcnJlc3BvbmRpbmd1ASB2YWxpZGF0aW9uIGNvZGUgaGFzaC4gSW5zdGVhZCBvZiBhY2NlcHRpbmcgYXNzdW1wdGlvbiBhYm91dCB0aGUgcGFyYSwgbWF0Y2hlcyB0aGUgdmFsaWRhdGlvbikBIGRhdGEgaGFzaCBhZ2FpbnN0IGFuIGV4cGVjdGVkIG9uZSBhbmQgeWllbGRzIGBOb25lYCBpZiB0aGV5J3JlIG5vdCBlcXVhbC5gY2hlY2tfdmFsaWRhdGlvbl9vdXRwdXRzCBxwYXJhX2lkjQIcb3V0cHV0c70EIAQVASBDaGVja3MgaWYgdGhlIGdpdmVuIHZhbGlkYXRpb24gb3V0cHV0cyBwYXNzIHRoZSBhY2NlcHRhbmNlIGNyaXRlcmlhLlxzZXNzaW9uX2luZGV4X2Zvcl9jaGlsZAAQDPAgUmV0dXJucyB0aGUgc2Vzc2lvbiBpbmRleCBleHBlY3RlZCBhdCBhIGNoaWxkIG9mIHRoZSBibG9jay4A0CBUaGlzIGNhbiBiZSB1c2VkIHRvIGluc3RhbnRpYXRlIGEgYFNpZ25pbmdDb250ZXh0YC48dmFsaWRhdGlvbl9jb2RlCBxwYXJhX2lkjQIoYXNzdW1wdGlvbuUN0QQQVQEgRmV0Y2ggdGhlIHZhbGlkYXRpb24gY29kZSB1c2VkIGJ5IGEgcGFyYSwgbWFraW5nIHRoZSBnaXZlbiBgT2NjdXBpZWRDb3JlQXNzdW1wdGlvbmAuAEUBIFJldHVybnMgYE5vbmVgIGlmIGVpdGhlciB0aGUgcGFyYSBpcyBub3QgcmVnaXN0ZXJlZCBvciB0aGUgYXNzdW1wdGlvbiBpcyBgRnJlZWRgmCBhbmQgdGhlIHBhcmEgYWxyZWFkeSBvY2N1cGllcyBhIGNvcmUueGNhbmRpZGF0ZV9wZW5kaW5nX2F2YWlsYWJpbGl0eQQccGFyYV9pZI0C+Q0IXQEgR2V0IHRoZSByZWNlaXB0IG9mIGEgY2FuZGlkYXRlIHBlbmRpbmcgYXZhaWxhYmlsaXR5LiBUaGlzIHJldHVybnMgYFNvbWVgIGZvciBhbnkgcGFyYXMlASBhc3NpZ25lZCB0byBvY2N1cGllZCBjb3JlcyBpbiBgYXZhaWxhYmlsaXR5X2NvcmVzYCBhbmQgYE5vbmVgIG90aGVyd2lzZS5AY2FuZGlkYXRlX2V2ZW50cwD9DQQtASBHZXQgYSB2ZWN0b3Igb2YgZXZlbnRzIGNvbmNlcm5pbmcgY2FuZGlkYXRlcyB0aGF0IG9jY3VycmVkIHdpdGhpbiBhIGJsb2NrLjBkbXFfY29udGVudHMEJHJlY2lwaWVudI0CxQsEPQEgR2V0IGFsbCB0aGUgcGVuZGluZyBpbmJvdW5kIG1lc3NhZ2VzIGluIHRoZSBkb3dud2FyZCBtZXNzYWdlIHF1ZXVlIGZvciBhIHBhcmEueGluYm91bmRfaHJtcF9jaGFubmVsc19jb250ZW50cwQkcmVjaXBpZW50jQIFDghlASBHZXQgdGhlIGNvbnRlbnRzIG9mIGFsbCBjaGFubmVscyBhZGRyZXNzZWQgdG8gdGhlIGdpdmVuIHJlY2lwaWVudC4gQ2hhbm5lbHMgdGhhdCBoYXZlIG5vkCBtZXNzYWdlcyBpbiB0aGVtIGFyZSBhbHNvIGluY2x1ZGVkLlx2YWxpZGF0aW9uX2NvZGVfYnlfaGFzaAQQaGFzaLkE0QQEnCBHZXQgdGhlIHZhbGlkYXRpb24gY29kZSBmcm9tIGl0cyBoYXNoLjhvbl9jaGFpbl92b3RlcwARDgQxASBTY3JhcGUgZGlzcHV0ZSByZWxldmFudCBmcm9tIG9uLWNoYWluLCBiYWNraW5nIHZvdGVzIGFuZCByZXNvbHZlZCBkaXNwdXRlcy4wc2Vzc2lvbl9pbmZvBBRpbmRleBAVDgzcIEdldCB0aGUgc2Vzc2lvbiBpbmZvIGZvciB0aGUgZ2l2ZW4gc2Vzc2lvbiwgaWYgc3RvcmVkLgAZASBOT1RFOiBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgYXZhaWxhYmxlIHNpbmNlIHBhcmFjaGFpbiBob3N0IHZlcnNpb24gMi5oc3VibWl0X3B2Zl9jaGVja19zdGF0ZW1lbnQIEHN0bXQNBSRzaWduYXR1cmWdBIwMAQEgU3VibWl0cyBhIFBWRiBwcmUtY2hlY2tpbmcgc3RhdGVtZW50IGludG8gdGhlIHRyYW5zYWN0aW9uIHBvb2wuABkBIE5PVEU6IFRoaXMgZnVuY3Rpb24gaXMgb25seSBhdmFpbGFibGUgc2luY2UgcGFyYWNoYWluIGhvc3QgdmVyc2lvbiAyLlRwdmZzX3JlcXVpcmVfcHJlY2hlY2sAkQsMXQEgUmV0dXJucyBjb2RlIGhhc2hlcyBvZiBQVkZzIHRoYXQgcmVxdWlyZSBwcmUtY2hlY2tpbmcgYnkgdmFsaWRhdG9ycyBpbiB0aGUgYWN0aXZlIHNldC4AGQEgTk9URTogVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGF2YWlsYWJsZSBzaW5jZSBwYXJhY2hhaW4gaG9zdCB2ZXJzaW9uIDIuUHZhbGlkYXRpb25fY29kZV9oYXNoCBxwYXJhX2lkjQIoYXNzdW1wdGlvbuUNGQ4MhQEgRmV0Y2ggdGhlIGhhc2ggb2YgdGhlIHZhbGlkYXRpb24gY29kZSB1c2VkIGJ5IGEgcGFyYSwgbWFraW5nIHRoZSBnaXZlbiBgT2NjdXBpZWRDb3JlQXNzdW1wdGlvbmAuABkBIE5PVEU6IFRoaXMgZnVuY3Rpb24gaXMgb25seSBhdmFpbGFibGUgc2luY2UgcGFyYWNoYWluIGhvc3QgdmVyc2lvbiAyLiBkaXNwdXRlcwAdDgR4IFJldHVybnMgYWxsIG9uY2hhaW4gZGlzcHV0ZXMuXHNlc3Npb25fZXhlY3V0b3JfcGFyYW1zBDRzZXNzaW9uX2luZGV4ECUOBLggUmV0dXJucyBleGVjdXRpb24gcGFyYW1ldGVycyBmb3IgdGhlIHNlc3Npb24uRHVuYXBwbGllZF9zbGFzaGVzACkOCFkBIFJldHVybnMgYSBsaXN0IG9mIHZhbGlkYXRvcnMgdGhhdCBsb3N0IGEgcGFzdCBzZXNzaW9uIGRpc3B1dGUgYW5kIG5lZWQgdG8gYmUgc2xhc2hlZC4ZASBOT1RFOiBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgYXZhaWxhYmxlIHNpbmNlIHBhcmFjaGFpbiBob3N0IHZlcnNpb24gNS5Ma2V5X293bmVyc2hpcF9wcm9vZgQwdmFsaWRhdG9yX2lkHQIxDgjMIFJldHVybnMgYSBtZXJrbGUgcHJvb2Ygb2YgYSB2YWxpZGF0b3Igc2Vzc2lvbiBrZXkuGQEgTk9URTogVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGF2YWlsYWJsZSBzaW5jZSBwYXJhY2hhaW4gaG9zdCB2ZXJzaW9uIDUuaHN1Ym1pdF9yZXBvcnRfZGlzcHV0ZV9sb3N0CDRkaXNwdXRlX3Byb29mJQVMa2V5X293bmVyc2hpcF9wcm9vZjUOOQ4MKQEgU3VibWl0IGFuIHVuc2lnbmVkIGV4dHJpbnNpYyB0byBzbGFzaCB2YWxpZGF0b3JzIHdobyBsb3N0IGEgZGlzcHV0ZSBhYm91dHwgYSBjYW5kaWRhdGUgb2YgYSBwYXN0IHNlc3Npb24uGQEgTk9URTogVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGF2YWlsYWJsZSBzaW5jZSBwYXJhY2hhaW4gaG9zdCB2ZXJzaW9uIDUuVG1pbmltdW1fYmFja2luZ192b3RlcwAQCA0BIEdldCB0aGUgbWluaW11bSBudW1iZXIgb2YgYmFja2luZyB2b3RlcyBmb3IgYSBwYXJhY2hhaW4gY2FuZGlkYXRlLvQgVGhpcyBpcyBhIHN0YWdpbmcgbWV0aG9kISBEbyBub3QgdXNlIG9uIHByb2R1Y3Rpb24gcnVudGltZXMhSHBhcmFfYmFja2luZ19zdGF0ZQQEX40CPQ4E5CBSZXR1cm5zIHRoZSBzdGF0ZSBvZiBwYXJhY2hhaW4gYmFja2luZyBmb3IgYSBnaXZlbiBwYXJhLlBhc3luY19iYWNraW5nX3BhcmFtcwBVBARhASBSZXR1cm5zIGNhbmRpZGF0ZSdzIGFjY2VwdGFuY2UgbGltaXRhdGlvbnMgZm9yIGFzeW5jaHJvbm91cyBiYWNraW5nIGZvciBhIHJlbGF5IHBhcmVudC5MZGlzYWJsZWRfdmFsaWRhdG9ycwAlCwT4IFJldHVybnMgYSBsaXN0IG9mIGFsbCBkaXNhYmxlZCB2YWxpZGF0b3JzIGF0IHRoZSBnaXZlbiBibG9jay40bm9kZV9mZWF0dXJlcwCRBAhMIEdldCBub2RlIGZlYXR1cmVzLvQgVGhpcyBpcyBhIHN0YWdpbmcgbWV0aG9kISBEbyBub3QgdXNlIG9uIHByb2R1Y3Rpb24gcnVudGltZXMhWGFwcHJvdmFsX3ZvdGluZ19wYXJhbXMAbQQEpCBBcHByb3ZhbCB2b3RpbmcgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzLGNsYWltX3F1ZXVlAG0OBDAgQ2xhaW0gcXVldWV8Y2FuZGlkYXRlc19wZW5kaW5nX2F2YWlsYWJpbGl0eQQccGFyYV9pZI0CeQ4EYCBFbGFzdGljIHNjYWxpbmcgc3VwcG9ydATcIFRoZSBBUEkgZm9yIHF1ZXJ5aW5nIHRoZSBzdGF0ZSBvZiBwYXJhY2hhaW5zIG9uLWNoYWluLiBCZWVmeUFwaRA0YmVlZnlfZ2VuZXNpcwBhAgQFASBSZXR1cm4gdGhlIGJsb2NrIG51bWJlciB3aGVyZSBCRUVGWSBjb25zZW5zdXMgaXMgZW5hYmxlZC9zdGFydGVkNHZhbGlkYXRvcl9zZXQAfQ4EuCBSZXR1cm4gdGhlIGN1cnJlbnQgYWN0aXZlIEJFRUZZIHZhbGlkYXRvciBzZXS0c3VibWl0X3JlcG9ydF9lcXVpdm9jYXRpb25fdW5zaWduZWRfZXh0cmluc2ljCEhlcXVpdm9jYXRpb25fcHJvb2bZBjxrZXlfb3duZXJfcHJvb2aFDjkOIBEBIFN1Ym1pdHMgYW4gdW5zaWduZWQgZXh0cmluc2ljIHRvIHJlcG9ydCBhbiBlcXVpdm9jYXRpb24uIFRoZSBjYWxsZXL4IG11c3QgcHJvdmlkZSB0aGUgZXF1aXZvY2F0aW9uIHByb29mIGFuZCBhIGtleSBvd25lcnNoaXAgcHJvb2b8IChzaG91bGQgYmUgb2J0YWluZWQgdXNpbmcgYGdlbmVyYXRlX2tleV9vd25lcnNoaXBfcHJvb2ZgKS4gVGhlBQEgZXh0cmluc2ljIHdpbGwgYmUgdW5zaWduZWQgYW5kIHNob3VsZCBvbmx5IGJlIGFjY2VwdGVkIGZvciBsb2NhbBUBIGF1dGhvcnNoaXAgKG5vdCB0byBiZSBicm9hZGNhc3QgdG8gdGhlIG5ldHdvcmspLiBUaGlzIG1ldGhvZCByZXR1cm5zCQEgYE5vbmVgIHdoZW4gY3JlYXRpb24gb2YgdGhlIGV4dHJpbnNpYyBmYWlscywgZS5nLiBpZiBlcXVpdm9jYXRpb24FASByZXBvcnRpbmcgaXMgZGlzYWJsZWQgZm9yIHRoZSBnaXZlbiBydW50aW1lIChpLmUuIHRoaXMgbWV0aG9kIGlzBQEgaGFyZGNvZGVkIHRvIHJldHVybiBgTm9uZWApLiBPbmx5IHVzZWZ1bCBpbiBhbiBvZmZjaGFpbiBjb250ZXh0LnBnZW5lcmF0ZV9rZXlfb3duZXJzaGlwX3Byb29mCBhzZXRfaWQwMGF1dGhvcml0eV9pZCkCiQ4sCQEgR2VuZXJhdGVzIGEgcHJvb2Ygb2Yga2V5IG93bmVyc2hpcCBmb3IgdGhlIGdpdmVuIGF1dGhvcml0eSBpbiB0aGX8IGdpdmVuIHNldC4gQW4gZXhhbXBsZSB1c2FnZSBvZiB0aGlzIG1vZHVsZSBpcyBjb3VwbGVkIHdpdGggdGhlBQEgc2Vzc2lvbiBoaXN0b3JpY2FsIG1vZHVsZSB0byBwcm92ZSB0aGF0IGEgZ2l2ZW4gYXV0aG9yaXR5IGtleSBpcw0BIHRpZWQgdG8gYSBnaXZlbiBzdGFraW5nIGlkZW50aXR5IGR1cmluZyBhIHNwZWNpZmljIHNlc3Npb24uIFByb29mcxEBIG9mIGtleSBvd25lcnNoaXAgYXJlIG5lY2Vzc2FyeSBmb3Igc3VibWl0dGluZyBlcXVpdm9jYXRpb24gcmVwb3J0cy4RASBOT1RFOiBldmVuIHRob3VnaCB0aGUgQVBJIHRha2VzIGEgYHNldF9pZGAgYXMgcGFyYW1ldGVyIHRoZSBjdXJyZW50CQEgaW1wbGVtZW50YXRpb25zIGlnbm9yZXMgdGhpcyBwYXJhbWV0ZXIgYW5kIGluc3RlYWQgcmVsaWVzIG9uIHRoaXMNASBtZXRob2QgYmVpbmcgY2FsbGVkIGF0IHRoZSBjb3JyZWN0IGJsb2NrIGhlaWdodCwgaS5lLiBhbnkgcG9pbnQgYXQVASB3aGljaCB0aGUgZ2l2ZW4gc2V0IGlkIGlzIGxpdmUgb24tY2hhaW4uIEZ1dHVyZSBpbXBsZW1lbnRhdGlvbnMgd2lsbA0BIGluc3RlYWQgdXNlIGluZGV4ZWQgZGF0YSB0aHJvdWdoIGFuIG9mZmNoYWluIHdvcmtlciwgbm90IHJlcXVpcmluZ3ggb2xkZXIgc3RhdGVzIHRvIGJlIGF2YWlsYWJsZS4EgCBBUEkgbmVjZXNzYXJ5IGZvciBCRUVGWSB2b3RlcnMuGE1tckFwaRQgbW1yX3Jvb3QAjQ4EjCBSZXR1cm4gdGhlIG9uLWNoYWluIE1NUiByb290IGhhc2guOG1tcl9sZWFmX2NvdW50AJUOBLggUmV0dXJuIHRoZSBudW1iZXIgb2YgTU1SIGJsb2NrcyBpbiB0aGUgY2hhaW4uOGdlbmVyYXRlX3Byb29mCDRibG9ja19udW1iZXJz5QFcYmVzdF9rbm93bl9ibG9ja19udW1iZXJhApkOCGkBIEdlbmVyYXRlIE1NUiBwcm9vZiBmb3IgYSBzZXJpZXMgb2YgYmxvY2sgbnVtYmVycy4gSWYgYGJlc3Rfa25vd25fYmxvY2tfbnVtYmVyID0gU29tZShuKWAsRQEgdXNlIGhpc3RvcmljYWwgTU1SIHN0YXRlIGF0IGdpdmVuIGJsb2NrIGhlaWdodCBgbmAuIEVsc2UsIHVzZSBjdXJyZW50IE1NUiBzdGF0ZS4wdmVyaWZ5X3Byb29mCBhsZWF2ZXOhDhRwcm9vZqkOrQ4U9CBWZXJpZnkgTU1SIHByb29mIGFnYWluc3Qgb24tY2hhaW4gTU1SIGZvciBhIGJhdGNoIG9mIGxlYXZlcy4AcQEgTm90ZSB0aGlzIGZ1bmN0aW9uIHdpbGwgdXNlIG9uLWNoYWluIE1NUiByb290IGhhc2ggYW5kIGNoZWNrIGlmIHRoZSBwcm9vZiBtYXRjaGVzIHRoZSBoYXNoLm0BIE5vdGUsIHRoZSBsZWF2ZXMgc2hvdWxkIGJlIHNvcnRlZCBzdWNoIHRoYXQgY29ycmVzcG9uZGluZyBsZWF2ZXMgYW5kIGxlYWYgaW5kaWNlcyBoYXZlIHRoZZUBIHNhbWUgcG9zaXRpb24gaW4gYm90aCB0aGUgYGxlYXZlc2AgdmVjdG9yIGFuZCB0aGUgYGxlYWZfaW5kaWNlc2AgdmVjdG9yIGNvbnRhaW5lZCBpbiB0aGUgW0xlYWZQcm9vZl1YdmVyaWZ5X3Byb29mX3N0YXRlbGVzcwwQcm9vdDQYbGVhdmVzoQ4UcHJvb2apDq0OHAEBIFZlcmlmeSBNTVIgcHJvb2YgYWdhaW5zdCBnaXZlbiByb290IGhhc2ggZm9yIGEgYmF0Y2ggb2YgbGVhdmVzLgD8IE5vdGUgdGhpcyBmdW5jdGlvbiBkb2VzIG5vdCByZXF1aXJlIGFueSBvbi1jaGFpbiBzdG9yYWdlIC0gdGhlvCBwcm9vZiBpcyB2ZXJpZmllZCBhZ2FpbnN0IGdpdmVuIE1NUiByb290IGhhc2guAG0BIE5vdGUsIHRoZSBsZWF2ZXMgc2hvdWxkIGJlIHNvcnRlZCBzdWNoIHRoYXQgY29ycmVzcG9uZGluZyBsZWF2ZXMgYW5kIGxlYWYgaW5kaWNlcyBoYXZlIHRoZZUBIHNhbWUgcG9zaXRpb24gaW4gYm90aCB0aGUgYGxlYXZlc2AgdmVjdG9yIGFuZCB0aGUgYGxlYWZfaW5kaWNlc2AgdmVjdG9yIGNvbnRhaW5lZCBpbiB0aGUgW0xlYWZQcm9vZl0EhCBBUEkgdG8gaW50ZXJhY3Qgd2l0aCBNTVIgcGFsbGV0LixCZWVmeU1tckFwaQhMYXV0aG9yaXR5X3NldF9wcm9vZgAxDQTcIFJldHVybiB0aGUgY3VycmVudGx5IGFjdGl2ZSBCRUVGWSBhdXRob3JpdHkgc2V0IHByb29mLmBuZXh0X2F1dGhvcml0eV9zZXRfcHJvb2YAMQ0EyCBSZXR1cm4gdGhlIG5leHQvcXVldWVkIEJFRUZZIGF1dGhvcml0eSBzZXQgcHJvb2YuBJAgQVBJIHVzZWZ1bCBmb3IgQkVFRlkgbGlnaHQgY2xpZW50cy4oR3JhbmRwYUFwaRBMZ3JhbmRwYV9hdXRob3JpdGllcwDMGD0BIEdldCB0aGUgY3VycmVudCBHUkFORFBBIGF1dGhvcml0aWVzIGFuZCB3ZWlnaHRzLiBUaGlzIHNob3VsZCBub3QgY2hhbmdlIGV4Y2VwdB0BIGZvciB3aGVuIGNoYW5nZXMgYXJlIHNjaGVkdWxlZCBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgZGVsYXkgaGFzIHBhc3NlZC4ANQEgV2hlbiBjYWxsZWQgYXQgYmxvY2sgQiwgaXQgd2lsbCByZXR1cm4gdGhlIHNldCBvZiBhdXRob3JpdGllcyB0aGF0IHNob3VsZCBiZT0BIHVzZWQgdG8gZmluYWxpemUgZGVzY2VuZGFudHMgb2YgdGhpcyBibG9jayAoQisxLCBCKzIsIC4uLikuIFRoZSBibG9jayBCIGl0c2VsZsAgaXMgZmluYWxpemVkIGJ5IHRoZSBhdXRob3JpdGllcyBmcm9tIGJsb2NrIEItMS60c3VibWl0X3JlcG9ydF9lcXVpdm9jYXRpb25fdW5zaWduZWRfZXh0cmluc2ljCEhlcXVpdm9jYXRpb25fcHJvb2Y1AjxrZXlfb3duZXJfcHJvb2aFDjkOIBEBIFN1Ym1pdHMgYW4gdW5zaWduZWQgZXh0cmluc2ljIHRvIHJlcG9ydCBhbiBlcXVpdm9jYXRpb24uIFRoZSBjYWxsZXL4IG11c3QgcHJvdmlkZSB0aGUgZXF1aXZvY2F0aW9uIHByb29mIGFuZCBhIGtleSBvd25lcnNoaXAgcHJvb2b8IChzaG91bGQgYmUgb2J0YWluZWQgdXNpbmcgYGdlbmVyYXRlX2tleV9vd25lcnNoaXBfcHJvb2ZgKS4gVGhlBQEgZXh0cmluc2ljIHdpbGwgYmUgdW5zaWduZWQgYW5kIHNob3VsZCBvbmx5IGJlIGFjY2VwdGVkIGZvciBsb2NhbBUBIGF1dGhvcnNoaXAgKG5vdCB0byBiZSBicm9hZGNhc3QgdG8gdGhlIG5ldHdvcmspLiBUaGlzIG1ldGhvZCByZXR1cm5zCQEgYE5vbmVgIHdoZW4gY3JlYXRpb24gb2YgdGhlIGV4dHJpbnNpYyBmYWlscywgZS5nLiBpZiBlcXVpdm9jYXRpb24FASByZXBvcnRpbmcgaXMgZGlzYWJsZWQgZm9yIHRoZSBnaXZlbiBydW50aW1lIChpLmUuIHRoaXMgbWV0aG9kIGlzBQEgaGFyZGNvZGVkIHRvIHJldHVybiBgTm9uZWApLiBPbmx5IHVzZWZ1bCBpbiBhbiBvZmZjaGFpbiBjb250ZXh0LnBnZW5lcmF0ZV9rZXlfb3duZXJzaGlwX3Byb29mCBhzZXRfaWQwMGF1dGhvcml0eV9pZNSJDiwJASBHZW5lcmF0ZXMgYSBwcm9vZiBvZiBrZXkgb3duZXJzaGlwIGZvciB0aGUgZ2l2ZW4gYXV0aG9yaXR5IGluIHRoZfwgZ2l2ZW4gc2V0LiBBbiBleGFtcGxlIHVzYWdlIG9mIHRoaXMgbW9kdWxlIGlzIGNvdXBsZWQgd2l0aCB0aGUFASBzZXNzaW9uIGhpc3RvcmljYWwgbW9kdWxlIHRvIHByb3ZlIHRoYXQgYSBnaXZlbiBhdXRob3JpdHkga2V5IGlzDQEgdGllZCB0byBhIGdpdmVuIHN0YWtpbmcgaWRlbnRpdHkgZHVyaW5nIGEgc3BlY2lmaWMgc2Vzc2lvbi4gUHJvb2ZzEQEgb2Yga2V5IG93bmVyc2hpcCBhcmUgbmVjZXNzYXJ5IGZvciBzdWJtaXR0aW5nIGVxdWl2b2NhdGlvbiByZXBvcnRzLhEBIE5PVEU6IGV2ZW4gdGhvdWdoIHRoZSBBUEkgdGFrZXMgYSBgc2V0X2lkYCBhcyBwYXJhbWV0ZXIgdGhlIGN1cnJlbnT8IGltcGxlbWVudGF0aW9ucyBpZ25vcmUgdGhpcyBwYXJhbWV0ZXIgYW5kIGluc3RlYWQgcmVseSBvbiB0aGlzDQEgbWV0aG9kIGJlaW5nIGNhbGxlZCBhdCB0aGUgY29ycmVjdCBibG9jayBoZWlnaHQsIGkuZS4gYW55IHBvaW50IGF0FQEgd2hpY2ggdGhlIGdpdmVuIHNldCBpZCBpcyBsaXZlIG9uLWNoYWluLiBGdXR1cmUgaW1wbGVtZW50YXRpb25zIHdpbGwNASBpbnN0ZWFkIHVzZSBpbmRleGVkIGRhdGEgdGhyb3VnaCBhbiBvZmZjaGFpbiB3b3JrZXIsIG5vdCByZXF1aXJpbmd4IG9sZGVyIHN0YXRlcyB0byBiZSBhdmFpbGFibGUuOGN1cnJlbnRfc2V0X2lkADAEmCBHZXQgY3VycmVudCBHUkFORFBBIGF1dGhvcml0eSBzZXQgaWQuJAEBIEFQSXMgZm9yIGludGVncmF0aW5nIHRoZSBHUkFORFBBIGZpbmFsaXR5IGdhZGdldCBpbnRvIHJ1bnRpbWVzLsAgVGhpcyBzaG91bGQgYmUgaW1wbGVtZW50ZWQgb24gdGhlIHJ1bnRpbWUgc2lkZS4AFQEgVGhpcyBpcyBwcmltYXJpbHkgdXNlZCBmb3IgbmVnb3RpYXRpbmcgYXV0aG9yaXR5LXNldCBjaGFuZ2VzIGZvciB0aGUNASBnYWRnZXQuIEdSQU5EUEEgdXNlcyBhIHNpZ25hbGluZyBtb2RlbCBvZiBjaGFuZ2luZyBhdXRob3JpdHkgc2V0czoxASBjaGFuZ2VzIHNob3VsZCBiZSBzaWduYWxlZCB3aXRoIGEgZGVsYXkgb2YgTiBibG9ja3MsIGFuZCB0aGVuIGF1dG9tYXRpY2FsbHnkIGFwcGxpZWQgaW4gdGhlIHJ1bnRpbWUgYWZ0ZXIgdGhvc2UgTiBibG9ja3MgaGF2ZSBwYXNzZWQuAPwgVGhlIGNvbnNlbnN1cyBwcm90b2NvbCB3aWxsIGNvb3JkaW5hdGUgdGhlIGhhbmRvZmYgZXh0ZXJuYWxseS4cQmFiZUFwaRg0Y29uZmlndXJhdGlvbgCxDgSMIFJldHVybiB0aGUgY29uZmlndXJhdGlvbiBmb3IgQkFCRS5MY3VycmVudF9lcG9jaF9zdGFydACpAQTEIFJldHVybnMgdGhlIHNsb3QgdGhhdCBzdGFydGVkIHRoZSBjdXJyZW50IGVwb2NoLjRjdXJyZW50X2Vwb2NoALUOBMQgUmV0dXJucyBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhlIGN1cnJlbnQgZXBvY2guKG5leHRfZXBvY2gAtQ4IAQEgUmV0dXJucyBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhlIG5leHQgZXBvY2ggKHdoaWNoIHdhcyBhbHJlYWR5XCBwcmV2aW91c2x5IGFubm91bmNlZCkucGdlbmVyYXRlX2tleV9vd25lcnNoaXBfcHJvb2YIEHNsb3SpATBhdXRob3JpdHlfaWSlAbkOLAkBIEdlbmVyYXRlcyBhIHByb29mIG9mIGtleSBvd25lcnNoaXAgZm9yIHRoZSBnaXZlbiBhdXRob3JpdHkgaW4gdGhlDQEgY3VycmVudCBlcG9jaC4gQW4gZXhhbXBsZSB1c2FnZSBvZiB0aGlzIG1vZHVsZSBpcyBjb3VwbGVkIHdpdGggdGhlBQEgc2Vzc2lvbiBoaXN0b3JpY2FsIG1vZHVsZSB0byBwcm92ZSB0aGF0IGEgZ2l2ZW4gYXV0aG9yaXR5IGtleSBpcw0BIHRpZWQgdG8gYSBnaXZlbiBzdGFraW5nIGlkZW50aXR5IGR1cmluZyBhIHNwZWNpZmljIHNlc3Npb24uIFByb29mcxEBIG9mIGtleSBvd25lcnNoaXAgYXJlIG5lY2Vzc2FyeSBmb3Igc3VibWl0dGluZyBlcXVpdm9jYXRpb24gcmVwb3J0cy4JASBOT1RFOiBldmVuIHRob3VnaCB0aGUgQVBJIHRha2VzIGEgYHNsb3RgIGFzIHBhcmFtZXRlciB0aGUgY3VycmVudAkBIGltcGxlbWVudGF0aW9ucyBpZ25vcmVzIHRoaXMgcGFyYW1ldGVyIGFuZCBpbnN0ZWFkIHJlbGllcyBvbiB0aGlzDQEgbWV0aG9kIGJlaW5nIGNhbGxlZCBhdCB0aGUgY29ycmVjdCBibG9jayBoZWlnaHQsIGkuZS4gYW55IHBvaW50IGF08CB3aGljaCB0aGUgZXBvY2ggZm9yIHRoZSBnaXZlbiBzbG90IGlzIGxpdmUgb24tY2hhaW4uIEZ1dHVyZQkBIGltcGxlbWVudGF0aW9ucyB3aWxsIGluc3RlYWQgdXNlIGluZGV4ZWQgZGF0YSB0aHJvdWdoIGFuIG9mZmNoYWlu0CB3b3JrZXIsIG5vdCByZXF1aXJpbmcgb2xkZXIgc3RhdGVzIHRvIGJlIGF2YWlsYWJsZS60c3VibWl0X3JlcG9ydF9lcXVpdm9jYXRpb25fdW5zaWduZWRfZXh0cmluc2ljCEhlcXVpdm9jYXRpb25fcHJvb2adATxrZXlfb3duZXJfcHJvb2a9DjkOIBEBIFN1Ym1pdHMgYW4gdW5zaWduZWQgZXh0cmluc2ljIHRvIHJlcG9ydCBhbiBlcXVpdm9jYXRpb24uIFRoZSBjYWxsZXL4IG11c3QgcHJvdmlkZSB0aGUgZXF1aXZvY2F0aW9uIHByb29mIGFuZCBhIGtleSBvd25lcnNoaXAgcHJvb2b8IChzaG91bGQgYmUgb2J0YWluZWQgdXNpbmcgYGdlbmVyYXRlX2tleV9vd25lcnNoaXBfcHJvb2ZgKS4gVGhlBQEgZXh0cmluc2ljIHdpbGwgYmUgdW5zaWduZWQgYW5kIHNob3VsZCBvbmx5IGJlIGFjY2VwdGVkIGZvciBsb2NhbBUBIGF1dGhvcnNoaXAgKG5vdCB0byBiZSBicm9hZGNhc3QgdG8gdGhlIG5ldHdvcmspLiBUaGlzIG1ldGhvZCByZXR1cm5zCQEgYE5vbmVgIHdoZW4gY3JlYXRpb24gb2YgdGhlIGV4dHJpbnNpYyBmYWlscywgZS5nLiBpZiBlcXVpdm9jYXRpb24FASByZXBvcnRpbmcgaXMgZGlzYWJsZWQgZm9yIHRoZSBnaXZlbiBydW50aW1lIChpLmUuIHRoaXMgbWV0aG9kIGlzBQEgaGFyZGNvZGVkIHRvIHJldHVybiBgTm9uZWApLiBPbmx5IHVzZWZ1bCBpbiBhbiBvZmZjaGFpbiBjb250ZXh0LgS4IEFQSSBuZWNlc3NhcnkgZm9yIGJsb2NrIGF1dGhvcnNoaXAgd2l0aCBCQUJFLlRBdXRob3JpdHlEaXNjb3ZlcnlBcGkELGF1dGhvcml0aWVzAHkJBBkBIFJldHJpZXZlIGF1dGhvcml0eSBpZGVudGlmaWVycyBvZiB0aGUgY3VycmVudCBhbmQgbmV4dCBhdXRob3JpdHkgc2V0LhB0IFRoZSBhdXRob3JpdHkgZGlzY292ZXJ5IGFwaS4AUQEgVGhpcyBhcGkgaXMgdXNlZCBieSB0aGUgYGNsaWVudC9hdXRob3JpdHktZGlzY292ZXJ5YCBtb2R1bGUgdG8gcmV0cmlldmUgaWRlbnRpZmllcnOcIG9mIHRoZSBjdXJyZW50IGFuZCBuZXh0IGF1dGhvcml0eSBzZXQuLFNlc3Npb25LZXlzCFRnZW5lcmF0ZV9zZXNzaW9uX2tleXMEEHNlZWTdDDgcFQEgR2VuZXJhdGUgYSBzZXQgb2Ygc2Vzc2lvbiBrZXlzIHdpdGggb3B0aW9uYWxseSB1c2luZyB0aGUgZ2l2ZW4gc2VlZC4JASBUaGUga2V5cyBzaG91bGQgYmUgc3RvcmVkIHdpdGhpbiB0aGUga2V5c3RvcmUgZXhwb3NlZCB2aWEgcnVudGltZTwgZXh0ZXJuYWxpdGllcy4AsCBUaGUgc2VlZCBuZWVkcyB0byBiZSBhIHZhbGlkIGB1dGY4YCBzdHJpbmcuANAgUmV0dXJucyB0aGUgY29uY2F0ZW5hdGVkIFNDQUxFIGVuY29kZWQgcHVibGljIGtleXMuTGRlY29kZV9zZXNzaW9uX2tleXMEHGVuY29kZWQ4wQ4MmCBEZWNvZGUgdGhlIGdpdmVuIHB1YmxpYyBzZXNzaW9uIGtleXMuANwgUmV0dXJucyB0aGUgbGlzdCBvZiBwdWJsaWMgcmF3IHB1YmxpYyBrZXlzICsga2V5IHR5cGUuBGggU2Vzc2lvbiBrZXlzIHJ1bnRpbWUgYXBpLjxBY2NvdW50Tm9uY2VBcGkENGFjY291bnRfbm9uY2UEHGFjY291bnQAEATAIEdldCBjdXJyZW50IGFjY291bnQgbm9uY2Ugb2YgZ2l2ZW4gYEFjY291bnRJZGAuBIAgVGhlIEFQSSB0byBxdWVyeSBhY2NvdW50IG5vbmNlLlRUcmFuc2FjdGlvblBheW1lbnRBcGkQKHF1ZXJ5X2luZm8IDHV4dIENDGxlbhDNDgBEcXVlcnlfZmVlX2RldGFpbHMIDHV4dIENDGxlbhDRDgBMcXVlcnlfd2VpZ2h0X3RvX2ZlZQQYd2VpZ2h0KBgATHF1ZXJ5X2xlbmd0aF90b19mZWUEGGxlbmd0aBAYAABkVHJhbnNhY3Rpb25QYXltZW50Q2FsbEFwaRA8cXVlcnlfY2FsbF9pbmZvCBBjYWxsdQEMbGVuEM0OBEkBIFF1ZXJ5IGluZm9ybWF0aW9uIG9mIGEgZGlzcGF0Y2ggY2xhc3MsIHdlaWdodCwgYW5kIGZlZSBvZiBhIGdpdmVuIGVuY29kZWQgYENhbGxgLlhxdWVyeV9jYWxsX2ZlZV9kZXRhaWxzCBBjYWxsdQEMbGVuENEOBLQgUXVlcnkgZmVlIGRldGFpbHMgb2YgYSBnaXZlbiBlbmNvZGVkIGBDYWxsYC5McXVlcnlfd2VpZ2h0X3RvX2ZlZQQYd2VpZ2h0KBgEAQEgUXVlcnkgdGhlIG91dHB1dCBvZiB0aGUgY3VycmVudCBgV2VpZ2h0VG9GZWVgIGdpdmVuIHNvbWUgaW5wdXQuTHF1ZXJ5X2xlbmd0aF90b19mZWUEGGxlbmd0aBAYBAEBIFF1ZXJ5IHRoZSBvdXRwdXQgb2YgdGhlIGN1cnJlbnQgYExlbmd0aFRvRmVlYCBnaXZlbiBzb21lIGlucHV0LgA0WGNtUGF5bWVudEFwaRB8cXVlcnlfYWNjZXB0YWJsZV9wYXltZW50X2Fzc2V0cwQseGNtX3ZlcnNpb24Q3Q4UtCBSZXR1cm5zIGEgbGlzdCBvZiBhY2NlcHRhYmxlIHBheW1lbnQgYXNzZXRzLgAwICMgQXJndW1lbnRzAGggKiBgeGNtX3ZlcnNpb25gOiBWZXJzaW9uLkBxdWVyeV94Y21fd2VpZ2h0BBxtZXNzYWdliQXpDhSoIFJldHVybnMgYSB3ZWlnaHQgbmVlZGVkIHRvIGV4ZWN1dGUgYSBYQ00uADAgIyBBcmd1bWVudHMAdCAqIGBtZXNzYWdlYDogYFZlcnNpb25lZFhjbWAuZHF1ZXJ5X3dlaWdodF90b19hc3NldF9mZWUIGHdlaWdodCgUYXNzZXS9Bu0OGOggQ29udmVydHMgYSB3ZWlnaHQgaW50byBhIGZlZSBmb3IgdGhlIHNwZWNpZmllZCBgQXNzZXRJZGAuADAgIyBBcmd1bWVudHMAiCAqIGB3ZWlnaHRgOiBjb252ZXJ0aWJsZSBgV2VpZ2h0YC58ICogYGFzc2V0YDogYFZlcnNpb25lZEFzc2V0SWRgLkxxdWVyeV9kZWxpdmVyeV9mZWVzCCxkZXN0aW5hdGlvbkUBHG1lc3NhZ2WJBfEOIB0BIEdldCBkZWxpdmVyeSBmZWVzIGZvciBzZW5kaW5nIGEgc3BlY2lmaWMgYG1lc3NhZ2VgIHRvIGEgYGRlc3RpbmF0aW9uYC70IFRoZXNlIGFsd2F5cyBjb21lIGluIGEgc3BlY2lmaWMgYXNzZXQsIGRlZmluZWQgYnkgdGhlIGNoYWluLgAwICMgQXJndW1lbnRzgQEgKiBgbWVzc2FnZWA6IFRoZSBtZXNzYWdlIHRoYXQnbGwgYmUgc2VudCwgbmVjZXNzYXJ5IGJlY2F1c2UgbW9zdCBkZWxpdmVyeSBmZWVzIGFyZSBiYXNlZCBvbiB0aGVcICAgc2l6ZSBvZiB0aGUgbWVzc2FnZS5hASAqIGBkZXN0aW5hdGlvbmA6IFRoZSBkZXN0aW5hdGlvbiB0byBzZW5kIHRoZSBtZXNzYWdlIHRvLiBEaWZmZXJlbnQgZGVzdGluYXRpb25zIG1heSB1c2XAICAgZGlmZmVyZW50IHNlbmRlcnMgdGhhdCBjaGFyZ2UgZGlmZmVyZW50IGZlZXMuLHAgQSB0cmFpdCBvZiBYQ00gcGF5bWVudCBBUEkuAKggQVBJIHByb3ZpZGVzIGZ1bmN0aW9uYWxpdHkgZm9yIG9idGFpbmluZzoAxCAqIHRoZSB3ZWlnaHQgcmVxdWlyZWQgdG8gZXhlY3V0ZSBhbiBYQ00gbWVzc2FnZSwFASAqIGEgbGlzdCBvZiBhY2NlcHRhYmxlIGBBc3NldElkYHMgZm9yIG1lc3NhZ2UgZXhlY3V0aW9uIHBheW1lbnQsAQEgKiB0aGUgY29zdCBvZiB0aGUgd2VpZ2h0IGluIHRoZSBzcGVjaWZpZWQgYWNjZXB0YWJsZSBgQXNzZXRJZGAuoCAqIHRoZSBmZWVzIGZvciBhbiBYQ00gbWVzc2FnZSBkZWxpdmVyeS4A8CBUbyBkZXRlcm1pbmUgdGhlIGV4ZWN1dGlvbiB3ZWlnaHQgb2YgdGhlIGNhbGxzIHJlcXVpcmVkIGZvcnUBIFtgeGNtOjpsYXRlc3Q6Okluc3RydWN0aW9uOjpUcmFuc2FjdGBdIGluc3RydWN0aW9uLCBgVHJhbnNhY3Rpb25QYXltZW50Q2FsbEFwaWAgY2FuIGJlIHVzZWQuJERyeVJ1bkFwaQgwZHJ5X3J1bl9jYWxsCBhvcmlnaW59AhBjYWxsdQH1DgQ4IERyeSBydW4gY2FsbC4sZHJ5X3J1bl94Y20IPG9yaWdpbl9sb2NhdGlvbkUBDHhjbY0GFQ8EUCBEcnkgcnVuIFhDTSBwcm9ncmFtJLEBIEFQSSBmb3IgZHJ5LXJ1bm5pbmcgZXh0cmluc2ljcyBhbmQgWENNIHByb2dyYW1zIHRvIGdldCB0aGUgcHJvZ3JhbXMgdGhhdCBuZWVkIHRvIGJlIHBhc3NlZCB0byB0aGUgZmVlcyBBUEkuAIEBIEFsbCBjYWxscyByZXR1cm4gYSB2ZWN0b3Igb2YgdHVwbGVzIChsb2NhdGlvbiwgeGNtKSB3aGVyZSBlYWNoICJ4Y20iIGlzIGV4ZWN1dGVkIGluICJsb2NhdGlvbiIu5CBJZiB0aGVyZSdzIGxvY2FsIGV4ZWN1dGlvbiwgdGhlIGxvY2F0aW9uIHdpbGwgYmUgIkhlcmUiLh0BIFRoaXMgdmVjdG9yIGNhbiBiZSB1c2VkIHRvIGNhbGN1bGF0ZSBib3RoIGV4ZWN1dGlvbiBhbmQgZGVsaXZlcnkgZmVlcy4AmQEgQ2FsbHMgb3IgWENNcyBtaWdodCBmYWlsIHdoZW4gZXhlY3V0ZWQsIHRoaXMgZG9lc24ndCBtZWFuIHRoZSByZXN1bHQgb2YgdGhlc2UgY2FsbHMgd2lsbCBiZSBhbiBgRXJyYC5lASBJbiB0aG9zZSBjYXNlcywgdGhlcmUgbWlnaHQgc3RpbGwgYmUgYSB2YWxpZCByZXN1bHQsIHdpdGggdGhlIGV4ZWN1dGlvbiBlcnJvciBpbnNpZGUgaXQuZQEgVGhlIG9ubHkgcmVhc29ucyB3aHkgdGhlc2UgY2FsbHMgbWlnaHQgcmV0dXJuIGFuIGVycm9yIGFyZSBsaXN0ZWQgaW4gdGhlIFtgRXJyb3JgXSBlbnVtLlBMb2NhdGlvblRvQWNjb3VudEFwaQRAY29udmVydF9sb2NhdGlvbgQgbG9jYXRpb25FAR0PBJAgQ29udmVydHMgYExvY2F0aW9uYCB0byBgQWNjb3VudElkYC4EDQEgQVBJIGZvciB1c2VmdWwgY29udmVyc2lvbnMgYmV0d2VlbiBYQ00gYExvY2F0aW9uYCBhbmQgYEFjY291bnRJZGAuOEdlbmVzaXNCdWlsZGVyDCxidWlsZF9zdGF0ZQQQanNvbjglDyRlASBCdWlsZCBgUnVudGltZUdlbmVzaXNDb25maWdgIGZyb20gYSBKU09OIGJsb2Igbm90IHVzaW5nIGFueSBkZWZhdWx0cyBhbmQgc3RvcmUgaXQgaW4gdGhlJCBzdG9yYWdlLgD5ASBJbiB0aGUgY2FzZSBvZiBhIEZSQU1FLWJhc2VkIHJ1bnRpbWUsIHRoaXMgZnVuY3Rpb24gZGVzZXJpYWxpemVzIHRoZSBmdWxsIGBSdW50aW1lR2VuZXNpc0NvbmZpZ2AgZnJvbSB0aGUgZ2l2ZW4gSlNPTiBibG9iIGFuZFkBIHB1dHMgaXQgaW50byB0aGUgc3RvcmFnZS4gSWYgdGhlIHByb3ZpZGVkIEpTT04gYmxvYiBpcyBpbmNvcnJlY3Qgb3IgaW5jb21wbGV0ZSBvciB0aGW0IGRlc2VyaWFsaXphdGlvbiBmYWlscywgYW4gZXJyb3IgaXMgcmV0dXJuZWQuAF0BIFBsZWFzZSBub3RlIHRoYXQgcHJvdmlkZWQgSlNPTiBibG9iIG11c3QgY29udGFpbiBhbGwgYFJ1bnRpbWVHZW5lc2lzQ29uZmlnYCBmaWVsZHMsIG5vXCBkZWZhdWx0cyB3aWxsIGJlIHVzZWQuKGdldF9wcmVzZXQECGlkKQ/dDDhhASBSZXR1cm5zIGEgSlNPTiBibG9iIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBidWlsdC1pbiBgUnVudGltZUdlbmVzaXNDb25maWdgIGlkZW50aWZpZWQgYnkYIGBpZGAuAD0BIElmIGBpZGAgaXMgYE5vbmVgIHRoZSBmdW5jdGlvbiByZXR1cm5zIEpTT04gYmxvYiByZXByZXNlbnRhdGlvbiBvZiB0aGUgZGVmYXVsdEkBIGBSdW50aW1lR2VuZXNpc0NvbmZpZ2Agc3RydWN0IG9mIHRoZSBydW50aW1lLiBJbXBsZW1lbnRhdGlvbiBtdXN0IHByb3ZpZGUgZGVmYXVsdGAgYFJ1bnRpbWVHZW5lc2lzQ29uZmlnYC4AIQEgT3RoZXJ3aXNlIGZ1bmN0aW9uIHJldHVybnMgYSBKU09OIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBidWlsdC1pbiwgbmFtZWRRASBgUnVudGltZUdlbmVzaXNDb25maWdgIHByZXNldCBpZGVudGlmaWVkIGJ5IGBpZGAsIG9yIGBOb25lYCBpZiBzdWNoIHByZXNldCBkb2VzIG5vdGUBIGV4aXN0cy4gUmV0dXJuZWQgYFZlYzx1OD5gIGNvbnRhaW5zIGJ5dGVzIG9mIEpTT04gYmxvYiAocGF0Y2gpIHdoaWNoIGNvbXByaXNlcyBhIGxpc3Qgb2ZNASAocG90ZW50aWFsbHkgbmVzdGVkKSBrZXktdmFsdWUgcGFpcnMgdGhhdCBhcmUgaW50ZW5kZWQgZm9yIGN1c3RvbWl6aW5nIHRoZSBkZWZhdWx0ZQEgcnVudGltZSBnZW5lc2lzIGNvbmZpZy4gVGhlIHBhdGNoIHNoYWxsIGJlIG1lcmdlZCAocmZjNzM4Nikgd2l0aCB0aGUgSlNPTiByZXByZXNlbnRhdGlvbmEBIG9mIHRoZSBkZWZhdWx0IGBSdW50aW1lR2VuZXNpc0NvbmZpZ2AgdG8gY3JlYXRlIGEgY29tcHJlaGVuc2l2ZSBnZW5lc2lzIGNvbmZpZyB0aGF0IGNhboQgYmUgdXNlZCBpbiBgYnVpbGRfc3RhdGVgIG1ldGhvZC4wcHJlc2V0X25hbWVzAC0PEFEBIFJldHVybnMgYSBsaXN0IG9mIGlkZW50aWZpZXJzIGZvciBhdmFpbGFibGUgYnVpbHRpbiBgUnVudGltZUdlbmVzaXNDb25maWdgIHByZXNldHMuAGEBIFRoZSBwcmVzZXRzIGZyb20gdGhlIGxpc3QgY2FuIGJlIHF1ZXJpZWQgd2l0aCBbYEdlbmVzaXNCdWlsZGVyOjpnZXRfcHJlc2V0YF0gbWV0aG9kLiBJZgEBIG5vIG5hbWVkIHByZXNldHMgYXJlIHByb3ZpZGVkIGJ5IHRoZSBydW50aW1lIHRoZSBsaXN0IGlzIGVtcHR5LgToIEFQSSB0byBpbnRlcmFjdCB3aXRoIFJ1bnRpbWVHZW5lc2lzQ29uZmlnIGZvciB0aGUgcnVudGltZXUBVDEPAA=="; +var paseo_metadata_default = binMeta; +export { + paseo_metadata_default as default +}; diff --git a/examples/with-vite-papi/.papi/descriptors/dist/paseo_metadata.d.ts b/examples/with-vite-papi/.papi/descriptors/dist/paseo_metadata.d.ts new file mode 100644 index 0000000..e54c947 --- /dev/null +++ b/examples/with-vite-papi/.papi/descriptors/dist/paseo_metadata.d.ts @@ -0,0 +1,2 @@ +declare const binMeta: string; +export default binMeta; diff --git a/examples/with-vite-papi/.papi/descriptors/dist/wnd.d.ts b/examples/with-vite-papi/.papi/descriptors/dist/wnd.d.ts new file mode 100644 index 0000000..3b1fb03 --- /dev/null +++ b/examples/with-vite-papi/.papi/descriptors/dist/wnd.d.ts @@ -0,0 +1,11316 @@ +import { StorageDescriptor, PlainDescriptor, TxDescriptor, RuntimeDescriptor, Enum, QueryFromPalletsDef, TxFromPalletsDef, EventsFromPalletsDef, ErrorsFromPalletsDef, ConstFromPalletsDef, SS58String, FixedSizeBinary, Binary, FixedSizeArray } from "polkadot-api"; +import { I5sesotjlssv2d, Iffmde3ekjedi9, I4mddgoa69c0a2, I7l46q2pu39ff3, I95g6i7ilua7lq, Ieniouoqkq4icf, Phase, Ibgl04rn6nbfm6, I4q39t5hn830vp, I3geksg000c171, BabeDigestsNextConfigDescriptor, Ic5m5lp1oioo8r, Idq7or56ds2f13, I4s6vifaf8k998, I9jd27rnpm8ttv, I8jnd4d8ip6djo, Ifip05kcrl65am, Iff9heri56m1mb, I1q8tnt1cluu5j, I8ds64oj6581v0, Ia7pdug7cdsg8g, I9b2c0tao13nvd, I2l1ctuihi2mfd, TransactionPaymentReleases, Ia2lhg7l2hilo3, Ic12aht5vh2sen, StakingRewardDestination, I9o7ssi9vmhmgr, Ic3m9d6tdl6gi2, Ib3j7gb0jgs38u, Ifekshcrgkl12g, I7svnfko10tq2e, I6flrronqs3l6n, I97fulj5h3ik95, Ia8896dq44k9m4, Icgljjb6j82uhn, Iff9p3c7k6pfoi, StakingForcing, Iafq6t4rgheait, I4ojmnsk1dchql, Iinkhfdlka9ch, I2kj4j6mp68hf8, I6ouflveob4eli, I2bqvqrg0sbrdj, I23nq3fsgtejt, I4pact7n2e9a0i, I22o1tjs56dvi2, I9h43amtitrqum, Idt624nf41g34e, I9kr8cseidc66h, I82jm9g7pufuel, GrandpaStoredState, I7pe2me3i3vtn9, I4ftk0glls7946, I910puuahutflf, I4nfjdef0ibh44, I74af64m08r6as, Ic8ann3kre6vdm, I1j72qfgdejqsv, I60biiepd74113, Ibprd8oi8phm62, Idlqqo993i780l, I2na29tt2afp0j, Ifble4juuml5ig, Version, I3c4cvcot9ouo7, I56u24ncejr5kt, PreimageOldRequestStatus, PreimageRequestStatus, I7rqj1laarti4a, I9p9lq3rej5bhc, Iag146hmjgqfgj, I8uo3fpd3bcc6f, ElectionProviderMultiPhasePhase, Ictkaqdbfabuek, Ia7o65280hur3p, Iasd2iat48n080, Ic8d01sg6acf60, Irl37q7erstrb, I8s6n43okuj2b1, Ic5t26f9cp3tvk, I39k39h6vu4hbq, Idphjddn2h69vc, Idhh9vuu2bderg, If6qa32dj75gu1, I7oo2mprv1qd1s, NominationPoolsClaimPermission, I2eh80qovrl7h2, ConvictionVotingVoteVoting, If9jidduiuq7vv, If0jlcnakch6k, Iegmj7n48sc3am, I3s9vvjt0el98d, I542q009qbgt8k, I4e5ujckjq61g8, Idinvj2ldfa0k7, I78k2970vpbt1t, I2d4k4cqluhq5i, I91e9aiuocql92, Ia1viqq9k85bv1, Iarlj3qd8u1v13, Idp9imcf15rli1, I4vk12npmr8ll0, ParachainsParasParaLifecycle, I79cs1p3m59mo7, I5ql12lunltfbi, UpgradeGoAhead, UpgradeRestriction, I2duhnt686rv0q, I7ulu3h1ibu60i, I6ljjd4b5fa4ov, Ibhmrlkcu01imb, I50mrcbubp554e, Id43g4eveajpkl, I7iua3ehrgl4va, Iev3u09i2vqn93, I9olhgo2o08h7b, I9m4rd2a7lc9md, I80rnntpog8qp6, I87u7jalc0lhah, I4p5t2krb1gmvp, I4arjljr6dpflb, Ids3ua6tfbgvj0, I4akf1ifqeclef, Ido5stnsbghtpd, I3ndpvu09rj685, Iafqnechp3omqg, I9dasmua8326io, I3g90iebhds6kb, I3av628q6dt6mq, Ifmaahl40gom3g, I70iuri2ilha1f, I6gun5k9fbb4s0, I6ucbdbrsslk4l, Idned7t7knml6b, I9vjdmm7sufoc, Ianpaq0u393le8, Ic11i4hlj9lv1l, Iepbsvlk3qceij, I5qfubnuvrnqn6, I8t3u2dv73ahbd, I7vlvrrl2pnbgk, Ie0rpl5bahldfk, XcmPalletVersionMigrationStage, I7e5oaj2qi4kl1, Ie849h3gncgvok, Iat62vud7hlod2, Ict03eedr8de9s, Ici7ejds60vj52, XcmVersionedLocation, I260m120dp9sbk, ParachainsInclusionAggregateMessageOrigin, I53esa2ms463bk, I1lfimt2mpej64, I2q3ri6itcjj5u, I2fb54desdqd9n, Idjett00s2gd, In7a38730s6qs, If15el53dd76v9, I9s0ave7t0vnrk, I4fo08joqmcqnm, Ibafpkl9hhno69, XcmV5Junctions, Iasb8k6ash5mjn, I8ofcg5rbj0g2c, I4adgbll7gku4i, I6pjjpfvhvcfru, I9pj91mj79qekl, I39uah9nss64h9, Ik64dknsq7k08, Ib51vk42m1po4n, I50ppnqasq4tjq, I9fin09kkg0jaj, Idcr6u6361oad9, I666bl2fqjkejo, I6o1er683vod1j, I5bq561t4gpfva, I4ktuaksf5i1gk, I9bqtpv2ii35mp, I9j7pagd6d4bda, I2h9pmio37r7fb, Ibmr18suc9ikh9, I9iq22t0burs89, I5u8olqbbvfnvf, I5utcetro501ir, I2eip8tc75dpje, I564va64vtidbq, Ie5v6njpckr05b, I328av3j0bgmjb, I4tuqm9ato907i, Iagi89qt4h1lqg, I9dgmcnuamt5p8, I3vh014cqgmrfd, Ifhs60omlhvt3, If34udpd5e57vi, I39t01nnod9109, Ie5vbnd9198quk, I3h6murn8bd4v5, I6k6jf8ncesuu3, I3qhk481i120pk, If1qr0kbbl298c, Idl3umm12u5pa, I5ont0141q9ss5, Ie6j49utvii126, I3v6ks33uluhnj, I3kiiim1cds68i, I4k60mkh2r6jjg, Ic5njrpnvi3f8g, I9j2r9vmc9atsu, I5oi8saufice6j, I7ne83r38c2sqq, I2hviml3snvhhn, I899s3bea07uhp, Ien4lr4fudcv6n, If4vg1nqgsug9f, I8jelntdlnkiac, I744ski63ogn94, Ic6cqd9g0t65v0, I2kds5jji7slh8, Ia9mkdf6l44shb, I9l2s4klu0831o, I2ctrt5nqb8o7c, I711qahikocb1c, Id6gojh30v9ib2, Ide1bahhh47lj9, Id9uqtigc0il3v, Ic68lsi7chpv5k, Iek0boln8pgnko, I452bkd71b385t, Ie83f0p0ke1f4u, I93hi4ed10h5sc, Ie5l999tf7t2te, I56lg8bnrufikk, I7pqmhr25d3dqq, I6s6ihmfj6j5qq, I7ka1pdlbuevh2, I6i4uaqurusjdc, Iaa2o6cgjdpdn5, Iam6hrl7ptd85l, Ict9ivhr2c5hv0, I8t4vv03357lk9, I4b0ab4u33u43u, I5n4sebgkfr760, I1ac18p6pjahv9, Ifs1i5fk9cqvr6, I80ht5q6a46692, I8lqgni993i7d9, Ieg3fd8p4pkt10, I8kg5ll427kfqq, I467333262q1l9, I82nfqfkd48n10, I1jm8m1rh9e20v, I3o5j3bli1pd8e, If1sr4hm0el5a0, I8k3rnvpeeh4hv, I5n05n33uogjb5, Ifbgj6kc27nn2q, Ie41rr3emcpt2k, I9tuav8vvj7joi, Idp4no4hd72mhv, I2eb501t8s6hsq, Ianmuoljk2sk1u, I9ogfrmgl88pdb, I23foj0lhdkppt, Ic45kejcb5v86h, Ideaemvoneh309, I3d9o9d7epp66v, I6lqh1vgb4mcja, I31k9f0jol8ko4, I80q14um2s2ckg, I5qs1t1erfi7u8, I9et13knvdvgpb, Id9js0aucdivjk, I1vj3e1a62je3o, I6c1t14l6giceg, Ieg1oc56mamrl5, I2vu5vj7173ik9, I6galqkn58q3bl, I36uoc8t9liv80, Ibunghsg9qa7f7, I8qnouj2c0igph, Ic30e2k517a3ns, I47a2tsd2o2b1c, Ifc9k1s0e9nv8e, I4ihj26hl75e5p, I2dl8ekhm2t22h, I13us5e5h5645o, I931cottvong90, I7sujb8gfvuo7n, I1ors0vru14it3, I40s11r8nagn2g, I6bjj87fr5g9nl, I8cbluptqo8kbp, I81cc4plffa1dm, I3ihan8icf0c5k, I7ibh0fckqou49, I9j0ul7nh7b8jv, Idnsr2pndm36h0, Ia1pvdcbhuqf8m, I8steo882k7qns, I4pa4q37gj6fua, I5f178ab6b89t3, I4nakhtbsk3c5s, Ibkc9utma98lms, Icbio0e1f0034b, I8c0vkqjjipnuj, I1adbcfi5uc62r, Ibf6ucefn8fh49, Icnrv1mfbd3in1, Icm9m0qeemu66d, I3pnhorh539dti, Id581arok0b1nj, I9jsikd1ghmc7l, I2f6mha3v4ooda, Iasqjdhasi408s, I6krn2lsleo87n, Iaid4btmkr5thp, I559fv6um7nmhd, I5m2irgeihn4i4, I1k3urvkqqshbc, I2ff0ffsh15vej, I1orfg86bkg123, Iaus4cb3drhu9q, Ivnsat10lv9d6, Ibncli8qttt2c2, I33rft6ag34efs, I9tmok5kceg2bg, I3i9vj5744rff1, I85icj2qbjeqbe, Ibuhbp68e6tkct, Idrevppfiubhve, I9s2h36kr71vk9, I4lkbiubo9ogq9, Id1baei7m8gkhk, I96ftepqm4vs7m, Ic3430470j4mbv, Ic3n7nqb6fffo0, I2ecddbrt3sjqn, Iaa7g3f5tlv3gf, I7mf0sij342109, Ibvirp862qkkup, Ic5b47dj4coa3r, Idehabrqi23sc0, Idfpo6162k0hq, I9geq5evbpu4im, I49ncdugfqno1o, I19hvnphoaj44l, I1ng31ej27mh4k, I85qkvekflgteq, I1qt5nua7ua655, Ia1u3jll6a06ae, I7cl9esn1l72m7, Id68sq6o2gm8qi, I6d2lhsacea7au, I9d5h5irbki7mm, Iafscmv8tjf0ou, Ibtsa3docbr9el, Id5fm4p8lj5qgi, I2gpmmfdqv3cdc, I84bjfgtkoop2c, I1epdupsg8a7gd, Ibou4u1engb441, Id6nbvqoqdj4o2, I95iqep3b8snn9, Ia5cotcvi888ln, I21jsa919m88fd, Iegif7m3upfe1k, I9kt8c221c83ln, Ic76kfh5ebqkpl, Icscpmubum33bq, I21d2olof7eb60, Ibgm4rnf22lal1, Ie68np0vpihith, I9bnv6lu0crf1q, Iauhjqifrdklq7, Ie1uso9m8rt5cf, Ibv4ep0hngvn9e, Ieoqregtp7b00, I9c4d50jrp7as1, Ifplevr9hp8jo3, Ienjibnb78vnl0, I2jj01cl2iqks8, I3pirohb0sp3ic, Iemqna2uucuei9, Idrvp50hbkv2k2, Ie11u326g2gsj3, I4cbvqmqadhrea, Ia82mnkmeo2rhc, Iab150pc00u513, Icbccs0ug47ilf, I855j4i3kr8ko1, I9ol0kobt15obh, Ic9g5lvl9iddc5, Icv68aq8841478, Ic262ibdoec56a, Iflcfm9b6nlmdd, Ijrsf4mnp3eka, I8tjvj9uq4b7hi, I3qt1hgg4djhgb, I4fooe9dun9o0t, Ier2cke86dqbr2, I1au3fq4n84nv3, Iejaj7m7qka9tr, Idnak900lt5lm8, I27n7lbd66730p, I2hq50pu2kdjpo, Ifk8eme5o7mukf, Iau4cgm6ih61cf, Ith132hqfb27q, Ic19as7nbst738, I54umskavgc9du, I2ip7o9e2tc5sf, I5egvk6hadac5h, I1td4upnup9gqv, Iempvdlhc5ih6g, I9f0v9ntn9g19p, I9acqruh7322g2, I5768ac424h061, I513i4g3u308ia, I529op3ifr7ped, I6ak1c6bp7djtf, Ietea96bmm1cg2, Iep1lmt6q3s6r3, I1fac16213rie2, Ifjt77oc391o43, Itvt1jsipv0lc, Ick3mveut33f44, I719lqkkbtikbl, Ie4intrc3n8jfu, I2rg5btjrsqec0, Ibdqerrooruuq9, I8u2ba9jeiu6q0, I7ieadb293k6b4, I9vkkue6cq74et, Ibu56t5h1q49i4, I1dmtl5t34b9g, Ib81hb2akekpfs, Ih04jp733tqqa, Ievr89968437gm, I5jmupb1kai3jj, Ia3c82eadg79bj, Ienusoeb625ftq, Idl66os3793p2c, I5rtkmhm2dng4u, Id55sh701bp4ra, Ie5hfqfo83migv, I2ur0oeqg495j8, I9gonkpdfg3e5v, I1bhd210c3phjj, Iep27ialq4a7o7, Iasu5jvoqr43mv, I965kkmkm4dqqk, I5qolde99acmd1, I8gtde5abn1g9a, I4mol6k10mv0io, Iec90vukseit9e, I7j4m7a3pkvsf4, Ic2n50kpnu5mae, I37454vatvmm1l, Iblau1qa7u7fet, I1ti389kf8t6oi, If4nnre373amul, I55kbor0ocqk6h, Idsj9cg7j96kpc, Ido4u9drncfaml, Ie8c7ctks8ur2p, I6c6fpqmnqijqd, I6mik29s5073td, I2m0sqmb75cnpb, I49agc5b62mehu, Iatq9jda4hq6pg, I2g87evcjlgmqi, I93ajn7brqs8df, Ib2q8vnsr19t9b, If6q1q7op2gvqf, If1bar61j9m2mv, Ic0he9tlf9ll0u, I9qfchhljqsjjl, I7kij8p9kchdjo, I229ijht536qdu, I62nte77gksm0f, I9cg2delv92pvq, Ilhp45uime5tp, I4f1hv034jf1dt, I9q52ail4t02bm, I8iksqi3eani0a, I16enopmju1p0q, I43kq8qudg7pq9, I76riseemre533, I38bmcrmh852rk, I4hcillge8de5f, I2cftk5tgrglaa, Iek7v4hrgnq6iv, Id2aanom2jncf1, I4s0gvfhejmdp2, I9njsgm2qsgnil, Ic8i89mfkmn3n7, I37r4bdai8o9mp, I4iqn2mh49tci5, Id2bej717ckub0, I545vo2e86o5i4, I3i09nus3ku37s, I2e447aa6a0imh, I82n7gg49bvucn, I58qkru548f7dl, Ibs22tt76qp5bi, Idn2ghub1o4i40, I48u78djt89dod, Ib85m5kfbepu2t, Idaml5bdhsfcsl, Ieec0cu336gteb, I815d5k4ij85nv, Ifi98fgi9o46v7, Ic0oj9tok33uap, I3tdutpfjuk32j, I1esdujrkdacpb, I9g1d820jf9m2s, I8ve4g3egaln6a, I524tcsd6dpr31, If4hvqaeoqq5us, Iaiqv5prlisjkg, Ia9t7uh39caaer, I8dnqf005919hm, If1co0pilmi7oq, Iae74gjak1qibn, I3escdojpj0551, I61d51nv4cou88, If8u5kl4h8070m, Ibmuil6p3vl83l, I7lul91g50ae87, Icl7nl1rfeog3i, Iasr6pj6shs0fl, I2uqmls7kcdnii, Idg69klialbkb8, I7r6b7145022pp, I30pg328m00nr3, Icmrn7bogp28cs, I7m9b5plj4h5ot, I9onhk772nfs4f, I3l6bnksrmt56r, Idh09k0l2pmdcg, I7uoiphbm0tj4r, I512p1n7qt24l8, I6s1nbislhk619, I3gghqnh2mj0is, I6iv852roh6t3h, I9oc2o6itbiopq, I218fa3heih67o, I1tf93k54ltg1v, I6ove5at7hfiur, I9c0urppp07b8b, Idrugh2blv81ia, Ibpfoajp33bp2j, I4i3u9uui7ktsd, Ictkqqlhdjt761, Ie2db4l6126rkt, I5r8t4iaend96p, Iaqet9jc3ihboe, Ic952bubvq4k7d, I2v50gu3s1aqk6, Iabpgqcjikia83, I4gil44d08grh, I7u915mvkdsb08, I34cq3ne0l8i73, If7uv525tdvv7a, Itom7fk49o0c9, I2an1fs2eiebjp, TransactionValidityTransactionSource, I9ask1o4tfvcvs, I5985kfq7sspta, I1v2gv5pb5e508, OccupiedCoreAssumption, I9kavsa730sjfr, Ifn3gc8nc1jruq, Ic1d4u2opv3fst, I92i81n5kpcgte, Ifb5bd3f9a1lu8, I2pf0b05mc7sdr, I9aev4k6tfeeom, Ialuks4a6iupcs, I36e6rra3ikq65, Idv6tqqnmb3i1j, Iekan13fn586c2, Idrp5a1qbbi2au, I943rhn463avqr, I2eq6ah7t620fb, Iavuvfkop6318c, Ieskfd0vl6pk5b, I56054ohcnjknc, Ifogo2hpqpe6b4, Ifiofttj73fsk1, I25plekc1moieu, I3eao7ea0kppv8, I7rj2bnb76oko1, I4o356o7eq06ms, I46e127tr8ma2h, I38ee9is0n4jn9, Ie88mmnuvmuvp5, I9puqgoda8ofk4, Iems84l8lk2v0c, I1r5ke30ueqo0r, I68ii5ik8avr9o, Icerf8h8pdu8ss, I6spmpef2c7svf, Iei2mvq0mjvt81, I1ut1enje04g2m, Iftvbctbo05fu4, XcmVersionedXcm, Ic0c3req3mlc1l, XcmVersionedAssetId, I7ocn4njqde3v5, Iek7ha36da9mf5, I16qqgglq4ega1, Ie7s8tm59rggr4, I6e426h0457po1, Ieh6nis3hdbtgi, Ie9sr1iqcg3cgm, I1mqgk2tmnn9i2, I6lr8sctk0bi4e, XcmVersionedAsset, Icujp6hmv35vbn, Icrp2r0j3sbgko } from "./common-types"; +type AnonymousEnum = T & { + __anonymous: true; +}; +type MyTuple = [T, ...T[]]; +type SeparateUndefined = undefined extends T ? undefined | Exclude : T; +type Anonymize = SeparateUndefined ? number extends L ? Binary : FixedSizeBinary : T extends string | number | bigint | boolean | void | undefined | null | symbol | Uint8Array | Enum ? T : T extends AnonymousEnum ? Enum : T extends MyTuple ? { + [K in keyof T]: T[K]; +} : T extends [] ? [] : T extends FixedSizeArray ? number extends L ? Array : FixedSizeArray : { + [K in keyof T & string]: T[K]; +}>; +type IStorage = { + System: { + /** + * The full account information for a particular account ID. + */ + Account: StorageDescriptor<[Key: SS58String], Anonymize, false, never>; + /** + * Total extrinsics count for the current block. + */ + ExtrinsicCount: StorageDescriptor<[], number, true, never>; + /** + * Whether all inherents have been applied. + */ + InherentsApplied: StorageDescriptor<[], boolean, false, never>; + /** + * The current weight for the block. + */ + BlockWeight: StorageDescriptor<[], Anonymize, false, never>; + /** + * Total length (in bytes) for all extrinsics put together, for the current block. + */ + AllExtrinsicsLen: StorageDescriptor<[], number, true, never>; + /** + * Map of block numbers to block hashes. + */ + BlockHash: StorageDescriptor<[Key: number], FixedSizeBinary<32>, false, never>; + /** + * Extrinsics data for the current block (maps an extrinsic's index to its data). + */ + ExtrinsicData: StorageDescriptor<[Key: number], Binary, false, never>; + /** + * The current block number being processed. Set by `execute_block`. + */ + Number: StorageDescriptor<[], number, false, never>; + /** + * Hash of the previous block. + */ + ParentHash: StorageDescriptor<[], FixedSizeBinary<32>, false, never>; + /** + * Digest of the current block, also part of the block header. + */ + Digest: StorageDescriptor<[], Anonymize, false, never>; + /** + * Events deposited for the current block. + * + * NOTE: The item is unbound and should therefore never be read on chain. + * It could otherwise inflate the PoV size of a block. + * + * Events have a large in-memory size. Box the events to not go out-of-memory + * just in case someone still reads them from within the runtime. + */ + Events: StorageDescriptor<[], Anonymize, false, never>; + /** + * The number of events in the `Events` list. + */ + EventCount: StorageDescriptor<[], number, false, never>; + /** + * Mapping between a topic (represented by T::Hash) and a vector of indexes + * of events in the `>` list. + * + * All topic vectors have deterministic storage locations depending on the topic. This + * allows light-clients to leverage the changes trie storage tracking mechanism and + * in case of changes fetch the list of events of interest. + * + * The value has the type `(BlockNumberFor, EventIndex)` because if we used only just + * the `EventIndex` then in case if the topic has the same contents on the next block + * no notification will be triggered thus the event might be lost. + */ + EventTopics: StorageDescriptor<[Key: FixedSizeBinary<32>], Anonymize, false, never>; + /** + * Stores the `spec_version` and `spec_name` of when the last runtime upgrade happened. + */ + LastRuntimeUpgrade: StorageDescriptor<[], Anonymize, true, never>; + /** + * True if we have upgraded so that `type RefCount` is `u32`. False (default) if not. + */ + UpgradedToU32RefCount: StorageDescriptor<[], boolean, false, never>; + /** + * True if we have upgraded so that AccountInfo contains three types of `RefCount`. False + * (default) if not. + */ + UpgradedToTripleRefCount: StorageDescriptor<[], boolean, false, never>; + /** + * The execution phase of the block. + */ + ExecutionPhase: StorageDescriptor<[], Phase, true, never>; + /** + * `Some` if a code upgrade has been authorized. + */ + AuthorizedUpgrade: StorageDescriptor<[], Anonymize, true, never>; + /** + * The weight reclaimed for the extrinsic. + * + * This information is available until the end of the extrinsic execution. + * More precisely this information is removed in `note_applied_extrinsic`. + * + * Logic doing some post dispatch weight reduction must update this storage to avoid duplicate + * reduction. + */ + ExtrinsicWeightReclaimed: StorageDescriptor<[], Anonymize, false, never>; + }; + Babe: { + /** + * Current epoch index. + */ + EpochIndex: StorageDescriptor<[], bigint, false, never>; + /** + * Current epoch authorities. + */ + Authorities: StorageDescriptor<[], Anonymize, false, never>; + /** + * The slot at which the first epoch actually started. This is 0 + * until the first block of the chain. + */ + GenesisSlot: StorageDescriptor<[], bigint, false, never>; + /** + * Current slot number. + */ + CurrentSlot: StorageDescriptor<[], bigint, false, never>; + /** + * The epoch randomness for the *current* epoch. + * + * # Security + * + * This MUST NOT be used for gambling, as it can be influenced by a + * malicious validator in the short term. It MAY be used in many + * cryptographic protocols, however, so long as one remembers that this + * (like everything else on-chain) it is public. For example, it can be + * used where a number is needed that cannot have been chosen by an + * adversary, for purposes such as public-coin zero-knowledge proofs. + */ + Randomness: StorageDescriptor<[], FixedSizeBinary<32>, false, never>; + /** + * Pending epoch configuration change that will be applied when the next epoch is enacted. + */ + PendingEpochConfigChange: StorageDescriptor<[], BabeDigestsNextConfigDescriptor, true, never>; + /** + * Next epoch randomness. + */ + NextRandomness: StorageDescriptor<[], FixedSizeBinary<32>, false, never>; + /** + * Next epoch authorities. + */ + NextAuthorities: StorageDescriptor<[], Anonymize, false, never>; + /** + * Randomness under construction. + * + * We make a trade-off between storage accesses and list length. + * We store the under-construction randomness in segments of up to + * `UNDER_CONSTRUCTION_SEGMENT_LENGTH`. + * + * Once a segment reaches this length, we begin the next one. + * We reset all segments and return to `0` at the beginning of every + * epoch. + */ + SegmentIndex: StorageDescriptor<[], number, false, never>; + /** + * TWOX-NOTE: `SegmentIndex` is an increasing integer, so this is okay. + */ + UnderConstruction: StorageDescriptor<[Key: number], Anonymize, false, never>; + /** + * Temporary value (cleared at block finalization) which is `Some` + * if per-block initialization has already been called for current block. + */ + Initialized: StorageDescriptor<[], Anonymize, true, never>; + /** + * This field should always be populated during block processing unless + * secondary plain slots are enabled (which don't contain a VRF output). + * + * It is set in `on_finalize`, before it will contain the value from the last block. + */ + AuthorVrfRandomness: StorageDescriptor<[], Anonymize, false, never>; + /** + * The block numbers when the last and current epoch have started, respectively `N-1` and + * `N`. + * NOTE: We track this is in order to annotate the block number when a given pool of + * entropy was fixed (i.e. it was known to chain observers). Since epochs are defined in + * slots, which may be skipped, the block numbers may not line up with the slot numbers. + */ + EpochStart: StorageDescriptor<[], Anonymize, false, never>; + /** + * How late the current block is compared to its parent. + * + * This entry is populated as part of block execution and is cleaned up + * on block finalization. Querying this storage entry outside of block + * execution context should always yield zero. + */ + Lateness: StorageDescriptor<[], number, false, never>; + /** + * The configuration for the current epoch. Should never be `None` as it is initialized in + * genesis. + */ + EpochConfig: StorageDescriptor<[], Anonymize, true, never>; + /** + * The configuration for the next epoch, `None` if the config will not change + * (you can fallback to `EpochConfig` instead in that case). + */ + NextEpochConfig: StorageDescriptor<[], Anonymize, true, never>; + /** + * A list of the last 100 skipped epochs and the corresponding session index + * when the epoch was skipped. + * + * This is only used for validating equivocation proofs. An equivocation proof + * must contains a key-ownership proof for a given session, therefore we need a + * way to tie together sessions and epoch indices, i.e. we need to validate that + * a validator was the owner of a given key on a given session, and what the + * active epoch index was during that session. + */ + SkippedEpochs: StorageDescriptor<[], Anonymize, false, never>; + }; + Timestamp: { + /** + * The current time for the current block. + */ + Now: StorageDescriptor<[], bigint, false, never>; + /** + * Whether the timestamp has been updated in this block. + * + * This value is updated to `true` upon successful submission of a timestamp by a node. + * It is then checked at the end of each block execution in the `on_finalize` hook. + */ + DidUpdate: StorageDescriptor<[], boolean, false, never>; + }; + Indices: { + /** + * The lookup from index to account. + */ + Accounts: StorageDescriptor<[Key: number], Anonymize, true, never>; + }; + Balances: { + /** + * The total units issued in the system. + */ + TotalIssuance: StorageDescriptor<[], bigint, false, never>; + /** + * The total units of outstanding deactivated balance in the system. + */ + InactiveIssuance: StorageDescriptor<[], bigint, false, never>; + /** + * The Balances pallet example of storing the balance of an account. + * + * # Example + * + * ```nocompile + * impl pallet_balances::Config for Runtime { + * type AccountStore = StorageMapShim, frame_system::Provider, AccountId, Self::AccountData> + * } + * ``` + * + * You can also store the balance of an account in the `System` pallet. + * + * # Example + * + * ```nocompile + * impl pallet_balances::Config for Runtime { + * type AccountStore = System + * } + * ``` + * + * But this comes with tradeoffs, storing account balances in the system pallet stores + * `frame_system` data alongside the account data contrary to storing account balances in the + * `Balances` pallet, which uses a `StorageMap` to store balances data only. + * NOTE: This is only used in the case that this pallet is used to store balances. + */ + Account: StorageDescriptor<[Key: SS58String], Anonymize, false, never>; + /** + * Any liquidity locks on some account balances. + * NOTE: Should only be accessed when setting, changing and freeing a lock. + * + * Use of locks is deprecated in favour of freezes. See `https://github.com/paritytech/substrate/pull/12951/` + */ + Locks: StorageDescriptor<[Key: SS58String], Anonymize, false, never>; + /** + * Named reserves on some account balances. + * + * Use of reserves is deprecated in favour of holds. See `https://github.com/paritytech/substrate/pull/12951/` + */ + Reserves: StorageDescriptor<[Key: SS58String], Anonymize, false, never>; + /** + * Holds on account balances. + */ + Holds: StorageDescriptor<[Key: SS58String], Anonymize, false, never>; + /** + * Freeze locks on account balances. + */ + Freezes: StorageDescriptor<[Key: SS58String], Anonymize, false, never>; + }; + TransactionPayment: { + /** + + */ + NextFeeMultiplier: StorageDescriptor<[], bigint, false, never>; + /** + + */ + StorageVersion: StorageDescriptor<[], TransactionPaymentReleases, false, never>; + }; + Authorship: { + /** + * Author of current block. + */ + Author: StorageDescriptor<[], SS58String, true, never>; + }; + Staking: { + /** + * The ideal number of active validators. + */ + ValidatorCount: StorageDescriptor<[], number, false, never>; + /** + * Minimum number of staking participants before emergency conditions are imposed. + */ + MinimumValidatorCount: StorageDescriptor<[], number, false, never>; + /** + * Any validators that may never be slashed or forcibly kicked. It's a Vec since they're + * easy to initialize and the performance hit is minimal (we expect no more than four + * invulnerables) and restricted to testnets. + */ + Invulnerables: StorageDescriptor<[], Anonymize, false, never>; + /** + * Map from all locked "stash" accounts to the controller account. + * + * TWOX-NOTE: SAFE since `AccountId` is a secure hash. + */ + Bonded: StorageDescriptor<[Key: SS58String], SS58String, true, never>; + /** + * The minimum active bond to become and maintain the role of a nominator. + */ + MinNominatorBond: StorageDescriptor<[], bigint, false, never>; + /** + * The minimum active bond to become and maintain the role of a validator. + */ + MinValidatorBond: StorageDescriptor<[], bigint, false, never>; + /** + * The minimum active nominator stake of the last successful election. + */ + MinimumActiveStake: StorageDescriptor<[], bigint, false, never>; + /** + * The minimum amount of commission that validators can set. + * + * If set to `0`, no limit exists. + */ + MinCommission: StorageDescriptor<[], number, false, never>; + /** + * Map from all (unlocked) "controller" accounts to the info regarding the staking. + * + * Note: All the reads and mutations to this storage *MUST* be done through the methods exposed + * by [`StakingLedger`] to ensure data and lock consistency. + */ + Ledger: StorageDescriptor<[Key: SS58String], Anonymize, true, never>; + /** + * Where the reward payment should be made. Keyed by stash. + * + * TWOX-NOTE: SAFE since `AccountId` is a secure hash. + */ + Payee: StorageDescriptor<[Key: SS58String], StakingRewardDestination, true, never>; + /** + * The map from (wannabe) validator stash key to the preferences of that validator. + * + * TWOX-NOTE: SAFE since `AccountId` is a secure hash. + */ + Validators: StorageDescriptor<[Key: SS58String], Anonymize, false, never>; + /** + *Counter for the related counted storage map + */ + CounterForValidators: StorageDescriptor<[], number, false, never>; + /** + * The maximum validator count before we stop allowing new validators to join. + * + * When this value is not set, no limits are enforced. + */ + MaxValidatorsCount: StorageDescriptor<[], number, true, never>; + /** + * The map from nominator stash key to their nomination preferences, namely the validators that + * they wish to support. + * + * Note that the keys of this storage map might become non-decodable in case the + * account's [`NominationsQuota::MaxNominations`] configuration is decreased. + * In this rare case, these nominators + * are still existent in storage, their key is correct and retrievable (i.e. `contains_key` + * indicates that they exist), but their value cannot be decoded. Therefore, the non-decodable + * nominators will effectively not-exist, until they re-submit their preferences such that it + * is within the bounds of the newly set `Config::MaxNominations`. + * + * This implies that `::iter_keys().count()` and `::iter().count()` might return different + * values for this map. Moreover, the main `::count()` is aligned with the former, namely the + * number of keys that exist. + * + * Lastly, if any of the nominators become non-decodable, they can be chilled immediately via + * [`Call::chill_other`] dispatchable by anyone. + * + * TWOX-NOTE: SAFE since `AccountId` is a secure hash. + */ + Nominators: StorageDescriptor<[Key: SS58String], Anonymize, true, never>; + /** + *Counter for the related counted storage map + */ + CounterForNominators: StorageDescriptor<[], number, false, never>; + /** + * Stakers whose funds are managed by other pallets. + * + * This pallet does not apply any locks on them, therefore they are only virtually bonded. They + * are expected to be keyless accounts and hence should not be allowed to mutate their ledger + * directly via this pallet. Instead, these accounts are managed by other pallets and accessed + * via low level apis. We keep track of them to do minimal integrity checks. + */ + VirtualStakers: StorageDescriptor<[Key: SS58String], undefined, true, never>; + /** + *Counter for the related counted storage map + */ + CounterForVirtualStakers: StorageDescriptor<[], number, false, never>; + /** + * The maximum nominator count before we stop allowing new validators to join. + * + * When this value is not set, no limits are enforced. + */ + MaxNominatorsCount: StorageDescriptor<[], number, true, never>; + /** + * The current era index. + * + * This is the latest planned era, depending on how the Session pallet queues the validator + * set, it might be active or not. + */ + CurrentEra: StorageDescriptor<[], number, true, never>; + /** + * The active era information, it holds index and start. + * + * The active era is the era being currently rewarded. Validator set of this era must be + * equal to [`SessionInterface::validators`]. + */ + ActiveEra: StorageDescriptor<[], Anonymize, true, never>; + /** + * The session index at which the era start for the last [`Config::HistoryDepth`] eras. + * + * Note: This tracks the starting session (i.e. session index when era start being active) + * for the eras in `[CurrentEra - HISTORY_DEPTH, CurrentEra]`. + */ + ErasStartSessionIndex: StorageDescriptor<[Key: number], number, true, never>; + /** + * Exposure of validator at era. + * + * This is keyed first by the era index to allow bulk deletion and then the stash account. + * + * Is it removed after [`Config::HistoryDepth`] eras. + * If stakers hasn't been set or has been removed then empty exposure is returned. + * + * Note: Deprecated since v14. Use `EraInfo` instead to work with exposures. + */ + ErasStakers: StorageDescriptor, Anonymize, false, never>; + /** + * Summary of validator exposure at a given era. + * + * This contains the total stake in support of the validator and their own stake. In addition, + * it can also be used to get the number of nominators backing this validator and the number of + * exposure pages they are divided into. The page count is useful to determine the number of + * pages of rewards that needs to be claimed. + * + * This is keyed first by the era index to allow bulk deletion and then the stash account. + * Should only be accessed through `EraInfo`. + * + * Is it removed after [`Config::HistoryDepth`] eras. + * If stakers hasn't been set or has been removed then empty overview is returned. + */ + ErasStakersOverview: StorageDescriptor, Anonymize, true, never>; + /** + * Clipped Exposure of validator at era. + * + * Note: This is deprecated, should be used as read-only and will be removed in the future. + * New `Exposure`s are stored in a paged manner in `ErasStakersPaged` instead. + * + * This is similar to [`ErasStakers`] but number of nominators exposed is reduced to the + * `T::MaxExposurePageSize` biggest stakers. + * (Note: the field `total` and `own` of the exposure remains unchanged). + * This is used to limit the i/o cost for the nominator payout. + * + * This is keyed fist by the era index to allow bulk deletion and then the stash account. + * + * It is removed after [`Config::HistoryDepth`] eras. + * If stakers hasn't been set or has been removed then empty exposure is returned. + * + * Note: Deprecated since v14. Use `EraInfo` instead to work with exposures. + */ + ErasStakersClipped: StorageDescriptor, Anonymize, false, never>; + /** + * Paginated exposure of a validator at given era. + * + * This is keyed first by the era index to allow bulk deletion, then stash account and finally + * the page. Should only be accessed through `EraInfo`. + * + * This is cleared after [`Config::HistoryDepth`] eras. + */ + ErasStakersPaged: StorageDescriptor, Anonymize, true, never>; + /** + * History of claimed paged rewards by era and validator. + * + * This is keyed by era and validator stash which maps to the set of page indexes which have + * been claimed. + * + * It is removed after [`Config::HistoryDepth`] eras. + */ + ClaimedRewards: StorageDescriptor, Anonymize, false, never>; + /** + * Similar to `ErasStakers`, this holds the preferences of validators. + * + * This is keyed first by the era index to allow bulk deletion and then the stash account. + * + * Is it removed after [`Config::HistoryDepth`] eras. + */ + ErasValidatorPrefs: StorageDescriptor, Anonymize, false, never>; + /** + * The total validator era payout for the last [`Config::HistoryDepth`] eras. + * + * Eras that haven't finished yet or has been removed doesn't have reward. + */ + ErasValidatorReward: StorageDescriptor<[Key: number], bigint, true, never>; + /** + * Rewards for the last [`Config::HistoryDepth`] eras. + * If reward hasn't been set or has been removed then 0 reward is returned. + */ + ErasRewardPoints: StorageDescriptor<[Key: number], Anonymize, false, never>; + /** + * The total amount staked for the last [`Config::HistoryDepth`] eras. + * If total hasn't been set or has been removed then 0 stake is returned. + */ + ErasTotalStake: StorageDescriptor<[Key: number], bigint, false, never>; + /** + * Mode of era forcing. + */ + ForceEra: StorageDescriptor<[], StakingForcing, false, never>; + /** + * Maximum staked rewards, i.e. the percentage of the era inflation that + * is used for stake rewards. + * See [Era payout](./index.html#era-payout). + */ + MaxStakedRewards: StorageDescriptor<[], number, true, never>; + /** + * The percentage of the slash that is distributed to reporters. + * + * The rest of the slashed value is handled by the `Slash`. + */ + SlashRewardFraction: StorageDescriptor<[], number, false, never>; + /** + * The amount of currency given to reporters of a slash event which was + * canceled by extraordinary circumstances (e.g. governance). + */ + CanceledSlashPayout: StorageDescriptor<[], bigint, false, never>; + /** + * All unapplied slashes that are queued for later. + */ + UnappliedSlashes: StorageDescriptor<[Key: number], Anonymize, false, never>; + /** + * A mapping from still-bonded eras to the first session index of that era. + * + * Must contains information for eras for the range: + * `[active_era - bounding_duration; active_era]` + */ + BondedEras: StorageDescriptor<[], Anonymize, false, never>; + /** + * All slashing events on validators, mapped by era to the highest slash proportion + * and slash value of the era. + */ + ValidatorSlashInEra: StorageDescriptor, Anonymize, true, never>; + /** + * All slashing events on nominators, mapped by era to the highest slash value of the era. + */ + NominatorSlashInEra: StorageDescriptor, bigint, true, never>; + /** + * Slashing spans for stash accounts. + */ + SlashingSpans: StorageDescriptor<[Key: SS58String], Anonymize, true, never>; + /** + * Records information about the maximum slash of a stash within a slashing span, + * as well as how much reward has been paid out. + */ + SpanSlash: StorageDescriptor<[Key: Anonymize], Anonymize, false, never>; + /** + * The last planned session scheduled by the session pallet. + * + * This is basically in sync with the call to [`pallet_session::SessionManager::new_session`]. + */ + CurrentPlannedSession: StorageDescriptor<[], number, false, never>; + /** + * The threshold for when users can start calling `chill_other` for other validators / + * nominators. The threshold is compared to the actual number of validators / nominators + * (`CountFor*`) in the system compared to the configured max (`Max*Count`). + */ + ChillThreshold: StorageDescriptor<[], number, true, never>; + }; + Offences: { + /** + * The primary structure that holds all offence records keyed by report identifiers. + */ + Reports: StorageDescriptor<[Key: FixedSizeBinary<32>], Anonymize, true, never>; + /** + * A vector of reports of the same kind that happened at the same time slot. + */ + ConcurrentReportsIndex: StorageDescriptor, Anonymize, false, never>; + }; + Historical: { + /** + * Mapping from historical session indices to session-data root hash and validator count. + */ + HistoricalSessions: StorageDescriptor<[Key: number], Anonymize, true, never>; + /** + * The range of historical sessions we store. [first, last) + */ + StoredRange: StorageDescriptor<[], Anonymize, true, never>; + }; + Parameters: { + /** + * Stored parameters. + */ + Parameters: StorageDescriptor<[Key: Anonymize], Anonymize, true, never>; + }; + Session: { + /** + * The current set of validators. + */ + Validators: StorageDescriptor<[], Anonymize, false, never>; + /** + * Current index of the session. + */ + CurrentIndex: StorageDescriptor<[], number, false, never>; + /** + * True if the underlying economic identities or weighting behind the validators + * has changed in the queued validator set. + */ + QueuedChanged: StorageDescriptor<[], boolean, false, never>; + /** + * The queued keys for the next session. When the next session begins, these keys + * will be used to determine the validator's session keys. + */ + QueuedKeys: StorageDescriptor<[], Anonymize, false, never>; + /** + * Indices of disabled validators. + * + * The vec is always kept sorted so that we can find whether a given validator is + * disabled using binary search. It gets cleared when `on_session_ending` returns + * a new set of identities. + */ + DisabledValidators: StorageDescriptor<[], Anonymize, false, never>; + /** + * The next session keys for a validator. + */ + NextKeys: StorageDescriptor<[Key: SS58String], Anonymize, true, never>; + /** + * The owner of a key. The key is the `KeyTypeId` + the encoded key. + */ + KeyOwner: StorageDescriptor<[Key: Anonymize], SS58String, true, never>; + }; + Grandpa: { + /** + * State of the current authority set. + */ + State: StorageDescriptor<[], GrandpaStoredState, false, never>; + /** + * Pending change: (signaled at, scheduled change). + */ + PendingChange: StorageDescriptor<[], Anonymize, true, never>; + /** + * next block number where we can force a change. + */ + NextForced: StorageDescriptor<[], number, true, never>; + /** + * `true` if we are currently stalled. + */ + Stalled: StorageDescriptor<[], Anonymize, true, never>; + /** + * The number of changes (both in terms of keys and underlying economic responsibilities) + * in the "set" of Grandpa validators from genesis. + */ + CurrentSetId: StorageDescriptor<[], bigint, false, never>; + /** + * A mapping from grandpa set ID to the index of the *most recent* session for which its + * members were responsible. + * + * This is only used for validating equivocation proofs. An equivocation proof must + * contains a key-ownership proof for a given session, therefore we need a way to tie + * together sessions and GRANDPA set ids, i.e. we need to validate that a validator + * was the owner of a given key on a given session, and what the active set ID was + * during that session. + * + * TWOX-NOTE: `SetId` is not under user control. + */ + SetIdSession: StorageDescriptor<[Key: bigint], number, true, never>; + /** + * The current list of authorities. + */ + Authorities: StorageDescriptor<[], Anonymize, false, never>; + }; + AuthorityDiscovery: { + /** + * Keys of the current authority set. + */ + Keys: StorageDescriptor<[], Anonymize, false, never>; + /** + * Keys of the next authority set. + */ + NextKeys: StorageDescriptor<[], Anonymize, false, never>; + }; + Identity: { + /** + * Information that is pertinent to identify the entity behind an account. First item is the + * registration, second is the account's primary username. + * + * TWOX-NOTE: OK ― `AccountId` is a secure hash. + */ + IdentityOf: StorageDescriptor<[Key: SS58String], Anonymize, true, never>; + /** + * Identifies the primary username of an account. + */ + UsernameOf: StorageDescriptor<[Key: SS58String], Binary, true, never>; + /** + * The super-identity of an alternative "sub" identity together with its name, within that + * context. If the account is not some other account's sub-identity, then just `None`. + */ + SuperOf: StorageDescriptor<[Key: SS58String], Anonymize, true, never>; + /** + * Alternative "sub" identities of this account. + * + * The first item is the deposit, the second is a vector of the accounts. + * + * TWOX-NOTE: OK ― `AccountId` is a secure hash. + */ + SubsOf: StorageDescriptor<[Key: SS58String], Anonymize, false, never>; + /** + * The set of registrars. Not expected to get very big as can only be added through a + * special origin (likely a council motion). + * + * The index into this can be cast to `RegistrarIndex` to get a valid value. + */ + Registrars: StorageDescriptor<[], Anonymize, false, never>; + /** + * A map of the accounts who are authorized to grant usernames. + */ + AuthorityOf: StorageDescriptor<[Key: Binary], Anonymize, true, never>; + /** + * Reverse lookup from `username` to the `AccountId` that has registered it and the provider of + * the username. The `owner` value should be a key in the `UsernameOf` map, but it may not if + * the user has cleared their username or it has been removed. + * + * Multiple usernames may map to the same `AccountId`, but `UsernameOf` will only map to one + * primary username. + */ + UsernameInfoOf: StorageDescriptor<[Key: Binary], Anonymize, true, never>; + /** + * Usernames that an authority has granted, but that the account controller has not confirmed + * that they want it. Used primarily in cases where the `AccountId` cannot provide a signature + * because they are a pure proxy, multisig, etc. In order to confirm it, they should call + * [accept_username](`Call::accept_username`). + * + * First tuple item is the account and second is the acceptance deadline. + */ + PendingUsernames: StorageDescriptor<[Key: Binary], Anonymize, true, never>; + /** + * Usernames for which the authority that granted them has started the removal process by + * unbinding them. Each unbinding username maps to its grace period expiry, which is the first + * block in which the username could be deleted through a + * [remove_username](`Call::remove_username`) call. + */ + UnbindingUsernames: StorageDescriptor<[Key: Binary], number, true, never>; + }; + Recovery: { + /** + * The set of recoverable accounts and their recovery configuration. + */ + Recoverable: StorageDescriptor<[Key: SS58String], Anonymize, true, never>; + /** + * Active recovery attempts. + * + * First account is the account to be recovered, and the second account + * is the user trying to recover the account. + */ + ActiveRecoveries: StorageDescriptor, Anonymize, true, never>; + /** + * The list of allowed proxy accounts. + * + * Map from the user who can access it to the recovered account. + */ + Proxy: StorageDescriptor<[Key: SS58String], SS58String, true, never>; + }; + Vesting: { + /** + * Information regarding the vesting of a given account. + */ + Vesting: StorageDescriptor<[Key: SS58String], Anonymize, true, never>; + /** + * Storage version of the pallet. + * + * New networks start with latest version, as determined by the genesis build. + */ + StorageVersion: StorageDescriptor<[], Version, false, never>; + }; + Scheduler: { + /** + * Block number at which the agenda began incomplete execution. + */ + IncompleteSince: StorageDescriptor<[], number, true, never>; + /** + * Items to be executed, indexed by the block number that they should be executed on. + */ + Agenda: StorageDescriptor<[Key: number], Anonymize, false, never>; + /** + * Retry configurations for items to be executed, indexed by task address. + */ + Retries: StorageDescriptor<[Key: Anonymize], Anonymize, true, never>; + /** + * Lookup from a name to the block number and index of the task. + * + * For v3 -> v4 the previously unbounded identities are Blake2-256 hashed to form the v4 + * identities. + */ + Lookup: StorageDescriptor<[Key: FixedSizeBinary<32>], Anonymize, true, never>; + }; + Preimage: { + /** + * The request status of a given hash. + */ + StatusFor: StorageDescriptor<[Key: FixedSizeBinary<32>], PreimageOldRequestStatus, true, never>; + /** + * The request status of a given hash. + */ + RequestStatusFor: StorageDescriptor<[Key: FixedSizeBinary<32>], PreimageRequestStatus, true, never>; + /** + + */ + PreimageFor: StorageDescriptor<[Key: Anonymize], Binary, true, never>; + }; + Sudo: { + /** + * The `AccountId` of the sudo key. + */ + Key: StorageDescriptor<[], SS58String, true, never>; + }; + Proxy: { + /** + * The set of account proxies. Maps the account which has delegated to the accounts + * which are being delegated to, together with the amount held on deposit. + */ + Proxies: StorageDescriptor<[Key: SS58String], Anonymize, false, never>; + /** + * The announcements made by the proxy (key). + */ + Announcements: StorageDescriptor<[Key: SS58String], Anonymize, false, never>; + }; + Multisig: { + /** + * The set of open multisig operations. + */ + Multisigs: StorageDescriptor, Anonymize, true, never>; + }; + ElectionProviderMultiPhase: { + /** + * Internal counter for the number of rounds. + * + * This is useful for de-duplication of transactions submitted to the pool, and general + * diagnostics of the pallet. + * + * This is merely incremented once per every time that an upstream `elect` is called. + */ + Round: StorageDescriptor<[], number, false, never>; + /** + * Current phase. + */ + CurrentPhase: StorageDescriptor<[], ElectionProviderMultiPhasePhase, false, never>; + /** + * Current best solution, signed or unsigned, queued to be returned upon `elect`. + * + * Always sorted by score. + */ + QueuedSolution: StorageDescriptor<[], Anonymize, true, never>; + /** + * Snapshot data of the round. + * + * This is created at the beginning of the signed phase and cleared upon calling `elect`. + * Note: This storage type must only be mutated through [`SnapshotWrapper`]. + */ + Snapshot: StorageDescriptor<[], Anonymize, true, never>; + /** + * Desired number of targets to elect for this round. + * + * Only exists when [`Snapshot`] is present. + * Note: This storage type must only be mutated through [`SnapshotWrapper`]. + */ + DesiredTargets: StorageDescriptor<[], number, true, never>; + /** + * The metadata of the [`RoundSnapshot`] + * + * Only exists when [`Snapshot`] is present. + * Note: This storage type must only be mutated through [`SnapshotWrapper`]. + */ + SnapshotMetadata: StorageDescriptor<[], Anonymize, true, never>; + /** + * The next index to be assigned to an incoming signed submission. + * + * Every accepted submission is assigned a unique index; that index is bound to that particular + * submission for the duration of the election. On election finalization, the next index is + * reset to 0. + * + * We can't just use `SignedSubmissionIndices.len()`, because that's a bounded set; past its + * capacity, it will simply saturate. We can't just iterate over `SignedSubmissionsMap`, + * because iteration is slow. Instead, we store the value here. + */ + SignedSubmissionNextIndex: StorageDescriptor<[], number, false, never>; + /** + * A sorted, bounded vector of `(score, block_number, index)`, where each `index` points to a + * value in `SignedSubmissions`. + * + * We never need to process more than a single signed submission at a time. Signed submissions + * can be quite large, so we're willing to pay the cost of multiple database accesses to access + * them one at a time instead of reading and decoding all of them at once. + */ + SignedSubmissionIndices: StorageDescriptor<[], Anonymize, false, never>; + /** + * Unchecked, signed solutions. + * + * Together with `SubmissionIndices`, this stores a bounded set of `SignedSubmissions` while + * allowing us to keep only a single one in memory at a time. + * + * Twox note: the key of the map is an auto-incrementing index which users cannot inspect or + * affect; we shouldn't need a cryptographically secure hasher. + */ + SignedSubmissionsMap: StorageDescriptor<[Key: number], Anonymize, true, never>; + /** + * The minimum score that each 'untrusted' solution must attain in order to be considered + * feasible. + * + * Can be set via `set_minimum_untrusted_score`. + */ + MinimumUntrustedScore: StorageDescriptor<[], Anonymize, true, never>; + }; + VoterList: { + /** + * A single node, within some bag. + * + * Nodes store links forward and back within their respective bags. + */ + ListNodes: StorageDescriptor<[Key: SS58String], Anonymize, true, never>; + /** + *Counter for the related counted storage map + */ + CounterForListNodes: StorageDescriptor<[], number, false, never>; + /** + * A bag stored in storage. + * + * Stores a `Bag` struct, which stores head and tail pointers to itself. + */ + ListBags: StorageDescriptor<[Key: bigint], Anonymize, true, never>; + /** + * Pointer that remembers the next node that will be auto-rebagged. + * When `None`, the next scan will start from the list head again. + */ + NextNodeAutoRebagged: StorageDescriptor<[], SS58String, true, never>; + /** + * Lock all updates to this pallet. + * + * If any nodes needs updating, removal or addition due to a temporary lock, the + * [`Call::rebag`] can be used. + */ + Lock: StorageDescriptor<[], undefined, true, never>; + }; + NominationPools: { + /** + * The sum of funds across all pools. + * + * This might be lower but never higher than the sum of `total_balance` of all [`PoolMembers`] + * because calling `pool_withdraw_unbonded` might decrease the total stake of the pool's + * `bonded_account` without adjusting the pallet-internal `UnbondingPool`'s. + */ + TotalValueLocked: StorageDescriptor<[], bigint, false, never>; + /** + * Minimum amount to bond to join a pool. + */ + MinJoinBond: StorageDescriptor<[], bigint, false, never>; + /** + * Minimum bond required to create a pool. + * + * This is the amount that the depositor must put as their initial stake in the pool, as an + * indication of "skin in the game". + * + * This is the value that will always exist in the staking ledger of the pool bonded account + * while all other accounts leave. + */ + MinCreateBond: StorageDescriptor<[], bigint, false, never>; + /** + * Maximum number of nomination pools that can exist. If `None`, then an unbounded number of + * pools can exist. + */ + MaxPools: StorageDescriptor<[], number, true, never>; + /** + * Maximum number of members that can exist in the system. If `None`, then the count + * members are not bound on a system wide basis. + */ + MaxPoolMembers: StorageDescriptor<[], number, true, never>; + /** + * Maximum number of members that may belong to pool. If `None`, then the count of + * members is not bound on a per pool basis. + */ + MaxPoolMembersPerPool: StorageDescriptor<[], number, true, never>; + /** + * The maximum commission that can be charged by a pool. Used on commission payouts to bound + * pool commissions that are > `GlobalMaxCommission`, necessary if a future + * `GlobalMaxCommission` is lower than some current pool commissions. + */ + GlobalMaxCommission: StorageDescriptor<[], number, true, never>; + /** + * Active members. + * + * TWOX-NOTE: SAFE since `AccountId` is a secure hash. + */ + PoolMembers: StorageDescriptor<[Key: SS58String], Anonymize, true, never>; + /** + *Counter for the related counted storage map + */ + CounterForPoolMembers: StorageDescriptor<[], number, false, never>; + /** + * Storage for bonded pools. + */ + BondedPools: StorageDescriptor<[Key: number], Anonymize, true, never>; + /** + *Counter for the related counted storage map + */ + CounterForBondedPools: StorageDescriptor<[], number, false, never>; + /** + * Reward pools. This is where there rewards for each pool accumulate. When a members payout is + * claimed, the balance comes out of the reward pool. Keyed by the bonded pools account. + */ + RewardPools: StorageDescriptor<[Key: number], Anonymize, true, never>; + /** + *Counter for the related counted storage map + */ + CounterForRewardPools: StorageDescriptor<[], number, false, never>; + /** + * Groups of unbonding pools. Each group of unbonding pools belongs to a + * bonded pool, hence the name sub-pools. Keyed by the bonded pools account. + */ + SubPoolsStorage: StorageDescriptor<[Key: number], Anonymize, true, never>; + /** + *Counter for the related counted storage map + */ + CounterForSubPoolsStorage: StorageDescriptor<[], number, false, never>; + /** + * Metadata for the pool. + */ + Metadata: StorageDescriptor<[Key: number], Binary, false, never>; + /** + *Counter for the related counted storage map + */ + CounterForMetadata: StorageDescriptor<[], number, false, never>; + /** + * Ever increasing number of all pools created so far. + */ + LastPoolId: StorageDescriptor<[], number, false, never>; + /** + * A reverse lookup from the pool's account id to its id. + * + * This is only used for slashing and on automatic withdraw update. In all other instances, the + * pool id is used, and the accounts are deterministically derived from it. + */ + ReversePoolIdLookup: StorageDescriptor<[Key: SS58String], number, true, never>; + /** + *Counter for the related counted storage map + */ + CounterForReversePoolIdLookup: StorageDescriptor<[], number, false, never>; + /** + * Map from a pool member account to their opted claim permission. + */ + ClaimPermissions: StorageDescriptor<[Key: SS58String], NominationPoolsClaimPermission, false, never>; + }; + FastUnstake: { + /** + * The current "head of the queue" being unstaked. + * + * The head in itself can be a batch of up to [`Config::BatchSize`] stakers. + */ + Head: StorageDescriptor<[], Anonymize, true, never>; + /** + * The map of all accounts wishing to be unstaked. + * + * Keeps track of `AccountId` wishing to unstake and it's corresponding deposit. + */ + Queue: StorageDescriptor<[Key: SS58String], bigint, true, never>; + /** + *Counter for the related counted storage map + */ + CounterForQueue: StorageDescriptor<[], number, false, never>; + /** + * Number of eras to check per block. + * + * If set to 0, this pallet does absolutely nothing. Cannot be set to more than + * [`Config::MaxErasToCheckPerBlock`]. + * + * Based on the amount of weight available at [`Pallet::on_idle`], up to this many eras are + * checked. The checking is represented by updating [`UnstakeRequest::checked`], which is + * stored in [`Head`]. + */ + ErasToCheckPerBlock: StorageDescriptor<[], number, false, never>; + }; + ConvictionVoting: { + /** + * All voting for a particular voter in a particular voting class. We store the balance for the + * number of votes that we have recorded. + */ + VotingFor: StorageDescriptor, ConvictionVotingVoteVoting, false, never>; + /** + * The voting classes which have a non-zero lock requirement and the lock amounts which they + * require. The actual amount locked on behalf of this pallet should always be the maximum of + * this list. + */ + ClassLocksFor: StorageDescriptor<[Key: SS58String], Anonymize, false, never>; + }; + Referenda: { + /** + * The next free referendum index, aka the number of referenda started so far. + */ + ReferendumCount: StorageDescriptor<[], number, false, never>; + /** + * Information concerning any given referendum. + */ + ReferendumInfoFor: StorageDescriptor<[Key: number], Anonymize, true, never>; + /** + * The sorted list of referenda ready to be decided but not yet being decided, ordered by + * conviction-weighted approvals. + * + * This should be empty if `DecidingCount` is less than `TrackInfo::max_deciding`. + */ + TrackQueue: StorageDescriptor<[Key: number], Anonymize, false, never>; + /** + * The number of referenda being decided currently. + */ + DecidingCount: StorageDescriptor<[Key: number], number, false, never>; + /** + * The metadata is a general information concerning the referendum. + * The `Hash` refers to the preimage of the `Preimages` provider which can be a JSON + * dump or IPFS hash of a JSON file. + * + * Consider a garbage collection for a metadata of finished referendums to `unrequest` (remove) + * large preimages. + */ + MetadataOf: StorageDescriptor<[Key: number], FixedSizeBinary<32>, true, never>; + }; + Whitelist: { + /** + + */ + WhitelistedCall: StorageDescriptor<[Key: FixedSizeBinary<32>], undefined, true, never>; + }; + Treasury: { + /** + * DEPRECATED: associated with `spend_local` call and will be removed in May 2025. + * Refer to for migration to `spend`. + * + * Number of proposals that have been made. + */ + ProposalCount: StorageDescriptor<[], number, false, never>; + /** + * DEPRECATED: associated with `spend_local` call and will be removed in May 2025. + * Refer to for migration to `spend`. + * + * Proposals that have been made. + */ + Proposals: StorageDescriptor<[Key: number], Anonymize, true, never>; + /** + * The amount which has been reported as inactive to Currency. + */ + Deactivated: StorageDescriptor<[], bigint, false, never>; + /** + * DEPRECATED: associated with `spend_local` call and will be removed in May 2025. + * Refer to for migration to `spend`. + * + * Proposal indices that have been approved but not yet awarded. + */ + Approvals: StorageDescriptor<[], Anonymize, false, never>; + /** + * The count of spends that have been made. + */ + SpendCount: StorageDescriptor<[], number, false, never>; + /** + * Spends that have been approved and being processed. + */ + Spends: StorageDescriptor<[Key: number], Anonymize, true, never>; + /** + * The blocknumber for the last triggered spend period. + */ + LastSpendPeriod: StorageDescriptor<[], number, true, never>; + }; + DelegatedStaking: { + /** + * Map of Delegators to their `Delegation`. + * + * Implementation note: We are not using a double map with `delegator` and `agent` account + * as keys since we want to restrict delegators to delegate only to one account at a time. + */ + Delegators: StorageDescriptor<[Key: SS58String], Anonymize, true, never>; + /** + *Counter for the related counted storage map + */ + CounterForDelegators: StorageDescriptor<[], number, false, never>; + /** + * Map of `Agent` to their `Ledger`. + */ + Agents: StorageDescriptor<[Key: SS58String], Anonymize, true, never>; + /** + *Counter for the related counted storage map + */ + CounterForAgents: StorageDescriptor<[], number, false, never>; + }; + Configuration: { + /** + * The active configuration for the current session. + */ + ActiveConfig: StorageDescriptor<[], Anonymize, false, never>; + /** + * Pending configuration changes. + * + * This is a list of configuration changes, each with a session index at which it should + * be applied. + * + * The list is sorted ascending by session index. Also, this list can only contain at most + * 2 items: for the next session and for the `scheduled_session`. + */ + PendingConfigs: StorageDescriptor<[], Anonymize, false, never>; + /** + * If this is set, then the configuration setters will bypass the consistency checks. This + * is meant to be used only as the last resort. + */ + BypassConsistencyCheck: StorageDescriptor<[], boolean, false, never>; + }; + ParasShared: { + /** + * The current session index. + */ + CurrentSessionIndex: StorageDescriptor<[], number, false, never>; + /** + * All the validators actively participating in parachain consensus. + * Indices are into the broader validator set. + */ + ActiveValidatorIndices: StorageDescriptor<[], Anonymize, false, never>; + /** + * The parachain attestation keys of the validators actively participating in parachain + * consensus. This should be the same length as `ActiveValidatorIndices`. + */ + ActiveValidatorKeys: StorageDescriptor<[], Anonymize, false, never>; + /** + * All allowed relay-parents. + */ + AllowedRelayParents: StorageDescriptor<[], Anonymize, false, never>; + }; + ParaInclusion: { + /** + * Candidates pending availability by `ParaId`. They form a chain starting from the latest + * included head of the para. + * Use a different prefix post-migration to v1, since the v0 `PendingAvailability` storage + * would otherwise have the exact same prefix which could cause undefined behaviour when doing + * the migration. + */ + V1: StorageDescriptor<[Key: number], Anonymize, true, never>; + }; + ParaInherent: { + /** + * Whether the paras inherent was included within this block. + * + * The `Option<()>` is effectively a `bool`, but it never hits storage in the `None` variant + * due to the guarantees of FRAME's storage APIs. + * + * If this is `None` at the end of the block, we panic and render the block invalid. + */ + Included: StorageDescriptor<[], undefined, true, never>; + /** + * Scraped on chain data for extracting resolved disputes as well as backing votes. + */ + OnChainVotes: StorageDescriptor<[], Anonymize, true, never>; + }; + ParaScheduler: { + /** + * All the validator groups. One for each core. Indices are into `ActiveValidators` - not the + * broader set of Polkadot validators, but instead just the subset used for parachains during + * this session. + * + * Bound: The number of cores is the sum of the numbers of parachains and parathread + * multiplexers. Reasonably, 100-1000. The dominant factor is the number of validators: safe + * upper bound at 10k. + */ + ValidatorGroups: StorageDescriptor<[], Anonymize, false, never>; + /** + * The block number where the session start occurred. Used to track how many group rotations + * have occurred. + * + * Note that in the context of parachains modules the session change is signaled during + * the block and enacted at the end of the block (at the finalization stage, to be exact). + * Thus for all intents and purposes the effect of the session change is observed at the + * block following the session change, block number of which we save in this storage value. + */ + SessionStartBlock: StorageDescriptor<[], number, false, never>; + /** + * One entry for each availability core. The `VecDeque` represents the assignments to be + * scheduled on that core. + */ + ClaimQueue: StorageDescriptor<[], Anonymize, false, never>; + }; + Paras: { + /** + * All currently active PVF pre-checking votes. + * + * Invariant: + * - There are no PVF pre-checking votes that exists in list but not in the set and vice versa. + */ + PvfActiveVoteMap: StorageDescriptor<[Key: FixedSizeBinary<32>], Anonymize, true, never>; + /** + * The list of all currently active PVF votes. Auxiliary to `PvfActiveVoteMap`. + */ + PvfActiveVoteList: StorageDescriptor<[], Anonymize, false, never>; + /** + * All lease holding parachains. Ordered ascending by `ParaId`. On demand parachains are not + * included. + * + * Consider using the [`ParachainsCache`] type of modifying. + */ + Parachains: StorageDescriptor<[], Anonymize, false, never>; + /** + * The current lifecycle of a all known Para IDs. + */ + ParaLifecycles: StorageDescriptor<[Key: number], ParachainsParasParaLifecycle, true, never>; + /** + * The head-data of every registered para. + */ + Heads: StorageDescriptor<[Key: number], Binary, true, never>; + /** + * The context (relay-chain block number) of the most recent parachain head. + */ + MostRecentContext: StorageDescriptor<[Key: number], number, true, never>; + /** + * The validation code hash of every live para. + * + * Corresponding code can be retrieved with [`CodeByHash`]. + */ + CurrentCodeHash: StorageDescriptor<[Key: number], FixedSizeBinary<32>, true, never>; + /** + * Actual past code hash, indicated by the para id as well as the block number at which it + * became outdated. + * + * Corresponding code can be retrieved with [`CodeByHash`]. + */ + PastCodeHash: StorageDescriptor<[Key: Anonymize], FixedSizeBinary<32>, true, never>; + /** + * Past code of parachains. The parachains themselves may not be registered anymore, + * but we also keep their code on-chain for the same amount of time as outdated code + * to keep it available for approval checkers. + */ + PastCodeMeta: StorageDescriptor<[Key: number], Anonymize, false, never>; + /** + * Which paras have past code that needs pruning and the relay-chain block at which the code + * was replaced. Note that this is the actual height of the included block, not the expected + * height at which the code upgrade would be applied, although they may be equal. + * This is to ensure the entire acceptance period is covered, not an offset acceptance period + * starting from the time at which the parachain perceives a code upgrade as having occurred. + * Multiple entries for a single para are permitted. Ordered ascending by block number. + */ + PastCodePruning: StorageDescriptor<[], Anonymize, false, never>; + /** + * The block number at which the planned code change is expected for a parachain. + * + * The change will be applied after the first parablock for this ID included which executes + * in the context of a relay chain block with a number >= `expected_at`. + */ + FutureCodeUpgrades: StorageDescriptor<[Key: number], number, true, never>; + /** + * The list of upcoming future code upgrades. + * + * Each item is a pair of the parachain and the expected block at which the upgrade should be + * applied. The upgrade will be applied at the given relay chain block. In contrast to + * [`FutureCodeUpgrades`] this code upgrade will be applied regardless the parachain making any + * progress or not. + * + * Ordered ascending by block number. + */ + FutureCodeUpgradesAt: StorageDescriptor<[], Anonymize, false, never>; + /** + * The actual future code hash of a para. + * + * Corresponding code can be retrieved with [`CodeByHash`]. + */ + FutureCodeHash: StorageDescriptor<[Key: number], FixedSizeBinary<32>, true, never>; + /** + * The code hash authorizations for a para which will expire `expire_at` `BlockNumberFor`. + */ + AuthorizedCodeHash: StorageDescriptor<[Key: number], Anonymize, true, never>; + /** + * This is used by the relay-chain to communicate to a parachain a go-ahead with in the upgrade + * procedure. + * + * This value is absent when there are no upgrades scheduled or during the time the relay chain + * performs the checks. It is set at the first relay-chain block when the corresponding + * parachain can switch its upgrade function. As soon as the parachain's block is included, the + * value gets reset to `None`. + * + * NOTE that this field is used by parachains via merkle storage proofs, therefore changing + * the format will require migration of parachains. + */ + UpgradeGoAheadSignal: StorageDescriptor<[Key: number], UpgradeGoAhead, true, never>; + /** + * This is used by the relay-chain to communicate that there are restrictions for performing + * an upgrade for this parachain. + * + * This may be a because the parachain waits for the upgrade cooldown to expire. Another + * potential use case is when we want to perform some maintenance (such as storage migration) + * we could restrict upgrades to make the process simpler. + * + * NOTE that this field is used by parachains via merkle storage proofs, therefore changing + * the format will require migration of parachains. + */ + UpgradeRestrictionSignal: StorageDescriptor<[Key: number], UpgradeRestriction, true, never>; + /** + * The list of parachains that are awaiting for their upgrade restriction to cooldown. + * + * Ordered ascending by block number. + */ + UpgradeCooldowns: StorageDescriptor<[], Anonymize, false, never>; + /** + * The list of upcoming code upgrades. + * + * Each item is a pair of which para performs a code upgrade and at which relay-chain block it + * is expected at. + * + * Ordered ascending by block number. + */ + UpcomingUpgrades: StorageDescriptor<[], Anonymize, false, never>; + /** + * The actions to perform during the start of a specific session index. + */ + ActionsQueue: StorageDescriptor<[Key: number], Anonymize, false, never>; + /** + * Upcoming paras instantiation arguments. + * + * NOTE that after PVF pre-checking is enabled the para genesis arg will have it's code set + * to empty. Instead, the code will be saved into the storage right away via `CodeByHash`. + */ + UpcomingParasGenesis: StorageDescriptor<[Key: number], Anonymize, true, never>; + /** + * The number of reference on the validation code in [`CodeByHash`] storage. + */ + CodeByHashRefs: StorageDescriptor<[Key: FixedSizeBinary<32>], number, false, never>; + /** + * Validation code stored by its hash. + * + * This storage is consistent with [`FutureCodeHash`], [`CurrentCodeHash`] and + * [`PastCodeHash`]. + */ + CodeByHash: StorageDescriptor<[Key: FixedSizeBinary<32>], Binary, true, never>; + }; + Initializer: { + /** + * Whether the parachains modules have been initialized within this block. + * + * Semantically a `bool`, but this guarantees it should never hit the trie, + * as this is cleared in `on_finalize` and Frame optimizes `None` values to be empty values. + * + * As a `bool`, `set(false)` and `remove()` both lead to the next `get()` being false, but one + * of them writes to the trie and one does not. This confusion makes `Option<()>` more suitable + * for the semantics of this variable. + */ + HasInitialized: StorageDescriptor<[], undefined, true, never>; + /** + * Buffered session changes. + * + * Typically this will be empty or one element long. Apart from that this item never hits + * the storage. + * + * However this is a `Vec` regardless to handle various edge cases that may occur at runtime + * upgrade boundaries or if governance intervenes. + */ + BufferedSessionChanges: StorageDescriptor<[], Anonymize, false, never>; + }; + Dmp: { + /** + * The downward messages addressed for a certain para. + */ + DownwardMessageQueues: StorageDescriptor<[Key: number], Anonymize, false, never>; + /** + * A mapping that stores the downward message queue MQC head for each para. + * + * Each link in this chain has a form: + * `(prev_head, B, H(M))`, where + * - `prev_head`: is the previous head hash or zero if none. + * - `B`: is the relay-chain block number in which a message was appended. + * - `H(M)`: is the hash of the message being appended. + */ + DownwardMessageQueueHeads: StorageDescriptor<[Key: number], FixedSizeBinary<32>, false, never>; + /** + * The factor to multiply the base delivery fee by. + */ + DeliveryFeeFactor: StorageDescriptor<[Key: number], bigint, false, never>; + }; + Hrmp: { + /** + * The set of pending HRMP open channel requests. + * + * The set is accompanied by a list for iteration. + * + * Invariant: + * - There are no channels that exists in list but not in the set and vice versa. + */ + HrmpOpenChannelRequests: StorageDescriptor<[Key: Anonymize], Anonymize, true, never>; + /** + + */ + HrmpOpenChannelRequestsList: StorageDescriptor<[], Anonymize, false, never>; + /** + * This mapping tracks how many open channel requests are initiated by a given sender para. + * Invariant: `HrmpOpenChannelRequests` should contain the same number of items that has + * `(X, _)` as the number of `HrmpOpenChannelRequestCount` for `X`. + */ + HrmpOpenChannelRequestCount: StorageDescriptor<[Key: number], number, false, never>; + /** + * This mapping tracks how many open channel requests were accepted by a given recipient para. + * Invariant: `HrmpOpenChannelRequests` should contain the same number of items `(_, X)` with + * `confirmed` set to true, as the number of `HrmpAcceptedChannelRequestCount` for `X`. + */ + HrmpAcceptedChannelRequestCount: StorageDescriptor<[Key: number], number, false, never>; + /** + * A set of pending HRMP close channel requests that are going to be closed during the session + * change. Used for checking if a given channel is registered for closure. + * + * The set is accompanied by a list for iteration. + * + * Invariant: + * - There are no channels that exists in list but not in the set and vice versa. + */ + HrmpCloseChannelRequests: StorageDescriptor<[Key: Anonymize], undefined, true, never>; + /** + + */ + HrmpCloseChannelRequestsList: StorageDescriptor<[], Anonymize, false, never>; + /** + * The HRMP watermark associated with each para. + * Invariant: + * - each para `P` used here as a key should satisfy `Paras::is_valid_para(P)` within a + * session. + */ + HrmpWatermarks: StorageDescriptor<[Key: number], number, true, never>; + /** + * HRMP channel data associated with each para. + * Invariant: + * - each participant in the channel should satisfy `Paras::is_valid_para(P)` within a session. + */ + HrmpChannels: StorageDescriptor<[Key: Anonymize], Anonymize, true, never>; + /** + * Ingress/egress indexes allow to find all the senders and receivers given the opposite side. + * I.e. + * + * (a) ingress index allows to find all the senders for a given recipient. + * (b) egress index allows to find all the recipients for a given sender. + * + * Invariants: + * - for each ingress index entry for `P` each item `I` in the index should present in + * `HrmpChannels` as `(I, P)`. + * - for each egress index entry for `P` each item `E` in the index should present in + * `HrmpChannels` as `(P, E)`. + * - there should be no other dangling channels in `HrmpChannels`. + * - the vectors are sorted. + */ + HrmpIngressChannelsIndex: StorageDescriptor<[Key: number], Anonymize, false, never>; + /** + + */ + HrmpEgressChannelsIndex: StorageDescriptor<[Key: number], Anonymize, false, never>; + /** + * Storage for the messages for each channel. + * Invariant: cannot be non-empty if the corresponding channel in `HrmpChannels` is `None`. + */ + HrmpChannelContents: StorageDescriptor<[Key: Anonymize], Anonymize, false, never>; + /** + * Maintains a mapping that can be used to answer the question: What paras sent a message at + * the given block number for a given receiver. Invariants: + * - The inner `Vec` is never empty. + * - The inner `Vec` cannot store two same `ParaId`. + * - The outer vector is sorted ascending by block number and cannot store two items with the + * same block number. + */ + HrmpChannelDigests: StorageDescriptor<[Key: number], Anonymize, false, never>; + }; + ParaSessionInfo: { + /** + * Assignment keys for the current session. + * Note that this API is private due to it being prone to 'off-by-one' at session boundaries. + * When in doubt, use `Sessions` API instead. + */ + AssignmentKeysUnsafe: StorageDescriptor<[], Anonymize, false, never>; + /** + * The earliest session for which previous session info is stored. + */ + EarliestStoredSession: StorageDescriptor<[], number, false, never>; + /** + * Session information in a rolling window. + * Should have an entry in range `EarliestStoredSession..=CurrentSessionIndex`. + * Does not have any entries before the session index in the first session change notification. + */ + Sessions: StorageDescriptor<[Key: number], Anonymize, true, never>; + /** + * The validator account keys of the validators actively participating in parachain consensus. + */ + AccountKeys: StorageDescriptor<[Key: number], Anonymize, true, never>; + /** + * Executor parameter set for a given session index + */ + SessionExecutorParams: StorageDescriptor<[Key: number], Anonymize, true, never>; + }; + ParasDisputes: { + /** + * The last pruned session, if any. All data stored by this module + * references sessions. + */ + LastPrunedSession: StorageDescriptor<[], number, true, never>; + /** + * All ongoing or concluded disputes for the last several sessions. + */ + Disputes: StorageDescriptor, Anonymize, true, never>; + /** + * Backing votes stored for each dispute. + * This storage is used for slashing. + */ + BackersOnDisputes: StorageDescriptor, Anonymize, true, never>; + /** + * All included blocks on the chain, as well as the block number in this chain that + * should be reverted back to if the candidate is disputed and determined to be invalid. + */ + Included: StorageDescriptor, number, true, never>; + /** + * Whether the chain is frozen. Starts as `None`. When this is `Some`, + * the chain will not accept any new parachain blocks for backing or inclusion, + * and its value indicates the last valid block number in the chain. + * It can only be set back to `None` by governance intervention. + */ + Frozen: StorageDescriptor<[], Anonymize, false, never>; + }; + ParasSlashing: { + /** + * Validators pending dispute slashes. + */ + UnappliedSlashes: StorageDescriptor, Anonymize, true, never>; + /** + * `ValidatorSetCount` per session. + */ + ValidatorSetCounts: StorageDescriptor<[Key: number], number, true, never>; + }; + OnDemandAssignmentProvider: { + /** + * Maps a `ParaId` to `CoreIndex` and keeps track of how many assignments the scheduler has in + * it's lookahead. Keeping track of this affinity prevents parallel execution of the same + * `ParaId` on two or more `CoreIndex`es. + */ + ParaIdAffinity: StorageDescriptor<[Key: number], Anonymize, true, never>; + /** + * Overall status of queue (both free + affinity entries) + */ + QueueStatus: StorageDescriptor<[], Anonymize, false, never>; + /** + * Priority queue for all orders which don't yet (or not any more) have any core affinity. + */ + FreeEntries: StorageDescriptor<[], Anonymize, false, never>; + /** + * Queue entries that are currently bound to a particular core due to core affinity. + */ + AffinityEntries: StorageDescriptor<[Key: number], Anonymize, false, never>; + /** + * Keeps track of accumulated revenue from on demand order sales. + */ + Revenue: StorageDescriptor<[], Anonymize, false, never>; + /** + * Keeps track of credits owned by each account. + */ + Credits: StorageDescriptor<[Key: SS58String], bigint, false, never>; + }; + CoretimeAssignmentProvider: { + /** + * Scheduled assignment sets. + * + * Assignments as of the given block number. They will go into state once the block number is + * reached (and replace whatever was in there before). + */ + CoreSchedules: StorageDescriptor<[Key: Anonymize], Anonymize, true, "0">; + /** + * Assignments which are currently active. + * + * They will be picked from `PendingAssignments` once we reach the scheduled block number in + * `PendingAssignments`. + */ + CoreDescriptors: StorageDescriptor<[Key: number], Anonymize, false, "0">; + }; + Registrar: { + /** + * Pending swap operations. + */ + PendingSwap: StorageDescriptor<[Key: number], number, true, never>; + /** + * Amount held on deposit for each para and the original depositor. + * + * The given account ID is responsible for registering the code and initial head data, but may + * only do so if it isn't yet registered. (After that, it's up to governance to do so.) + */ + Paras: StorageDescriptor<[Key: number], Anonymize, true, never>; + /** + * The next free `ParaId`. + */ + NextFreeParaId: StorageDescriptor<[], number, false, never>; + }; + Slots: { + /** + * Amounts held on deposit for each (possibly future) leased parachain. + * + * The actual amount locked on its behalf by any account at any time is the maximum of the + * second values of the items in this list whose first value is the account. + * + * The first item in the list is the amount locked for the current Lease Period. Following + * items are for the subsequent lease periods. + * + * The default value (an empty list) implies that the parachain no longer exists (or never + * existed) as far as this pallet is concerned. + * + * If a parachain doesn't exist *yet* but is scheduled to exist in the future, then it + * will be left-padded with one or more `None`s to denote the fact that nothing is held on + * deposit for the non-existent chain currently, but is held at some point in the future. + * + * It is illegal for a `None` value to trail in the list. + */ + Leases: StorageDescriptor<[Key: number], Anonymize, false, never>; + }; + Auctions: { + /** + * Number of auctions started so far. + */ + AuctionCounter: StorageDescriptor<[], number, false, never>; + /** + * Information relating to the current auction, if there is one. + * + * The first item in the tuple is the lease period index that the first of the four + * contiguous lease periods on auction is for. The second is the block number when the + * auction will "begin to end", i.e. the first block of the Ending Period of the auction. + */ + AuctionInfo: StorageDescriptor<[], Anonymize, true, never>; + /** + * Amounts currently reserved in the accounts of the bidders currently winning + * (sub-)ranges. + */ + ReservedAmounts: StorageDescriptor<[Key: Anonymize], bigint, true, never>; + /** + * The winning bids for each of the 10 ranges at each sample in the final Ending Period of + * the current auction. The map's key is the 0-based index into the Sample Size. The + * first sample of the ending period is 0; the last is `Sample Size - 1`. + */ + Winning: StorageDescriptor<[Key: number], Anonymize, true, never>; + }; + Crowdloan: { + /** + * Info on all of the funds. + */ + Funds: StorageDescriptor<[Key: number], Anonymize, true, never>; + /** + * The funds that have had additional contributions during the last block. This is used + * in order to determine which funds should submit new or updated bids. + */ + NewRaise: StorageDescriptor<[], Anonymize, false, never>; + /** + * The number of auctions that have entered into their ending period so far. + */ + EndingsCount: StorageDescriptor<[], number, false, never>; + /** + * Tracker for the next available fund index + */ + NextFundIndex: StorageDescriptor<[], number, false, never>; + }; + AssignedSlots: { + /** + * Assigned permanent slots, with their start lease period, and duration. + */ + PermanentSlots: StorageDescriptor<[Key: number], Anonymize, true, never>; + /** + * Number of assigned (and active) permanent slots. + */ + PermanentSlotCount: StorageDescriptor<[], number, false, never>; + /** + * Assigned temporary slots. + */ + TemporarySlots: StorageDescriptor<[Key: number], Anonymize, true, never>; + /** + * Number of assigned temporary slots. + */ + TemporarySlotCount: StorageDescriptor<[], number, false, never>; + /** + * Number of active temporary slots in current slot lease period. + */ + ActiveTemporarySlotCount: StorageDescriptor<[], number, false, never>; + /** + * The max number of temporary slots that can be assigned. + */ + MaxTemporarySlots: StorageDescriptor<[], number, false, never>; + /** + * The max number of permanent slots that can be assigned. + */ + MaxPermanentSlots: StorageDescriptor<[], number, false, never>; + }; + StakingAhClient: { + /** + * The queued validator sets for a given planning session index. + * + * This is received via a call from AssetHub. + */ + ValidatorSet: StorageDescriptor<[], Anonymize, true, never>; + /** + * An incomplete validator set report. + */ + IncompleteValidatorSetReport: StorageDescriptor<[], Anonymize, true, never>; + /** + * All of the points of the validators. + * + * This is populated during a session, and is flushed and sent over via [`SendToAssetHub`] + * at each session end. + */ + ValidatorPoints: StorageDescriptor<[Key: SS58String], number, false, never>; + /** + * Indicates the current operating mode of the pallet. + * + * This value determines how the pallet behaves in response to incoming and outgoing messages, + * particularly whether it should execute logic directly, defer it, or delegate it entirely. + */ + Mode: StorageDescriptor<[], Anonymize, false, never>; + /** + * A storage value that is set when a `new_session` gives a new validator set to the session + * pallet, and is cleared on the next call. + * + * The inner u32 is the id of the said activated validator set. While not relevant here, good + * to know this is the planning era index of staking-async on AH. + * + * Once cleared, we know a validator set has been activated, and therefore we can send a + * timestamp to AH. + */ + NextSessionChangesValidators: StorageDescriptor<[], number, true, never>; + /** + * The session index at which the latest elected validator set was applied. + * + * This is used to determine if an offence, given a session index, is in the current active era + * or not. + */ + ValidatorSetAppliedAt: StorageDescriptor<[], number, true, never>; + /** + * Offences collected while in [`OperatingMode::Buffered`] mode. + * + * These are temporarily stored and sent once the pallet switches to [`OperatingMode::Active`]. + * For each offender, only the highest `slash_fraction` is kept. + * + * Internally stores as a nested BTreeMap: + * `session_index -> (offender -> (reporter, slash_fraction))`. + * + * Note: While the [`rc_client::Offence`] type includes a list of reporters, in practice there + * is only one. In this pallet, we assume this is the case and store only the first reporter. + */ + BufferedOffences: StorageDescriptor<[], Anonymize, false, never>; + }; + MultiBlockMigrations: { + /** + * The currently active migration to run and its cursor. + * + * `None` indicates that no migration is running. + */ + Cursor: StorageDescriptor<[], Anonymize, true, never>; + /** + * Set of all successfully executed migrations. + * + * This is used as blacklist, to not re-execute migrations that have not been removed from the + * codebase yet. Governance can regularly clear this out via `clear_historic`. + */ + Historic: StorageDescriptor<[Key: Binary], undefined, true, never>; + }; + XcmPallet: { + /** + * The latest available query index. + */ + QueryCounter: StorageDescriptor<[], bigint, false, never>; + /** + * The ongoing queries. + */ + Queries: StorageDescriptor<[Key: bigint], Anonymize, true, never>; + /** + * The existing asset traps. + * + * Key is the blake2 256 hash of (origin, versioned `Assets`) pair. Value is the number of + * times this pair has been trapped (usually just 1 if it exists at all). + */ + AssetTraps: StorageDescriptor<[Key: FixedSizeBinary<32>], number, false, never>; + /** + * Default version to encode XCM when latest version of destination is unknown. If `None`, + * then the destinations whose XCM version is unknown are considered unreachable. + */ + SafeXcmVersion: StorageDescriptor<[], number, true, never>; + /** + * The Latest versions that we know various locations support. + */ + SupportedVersion: StorageDescriptor, number, true, never>; + /** + * All locations that we have requested version notifications from. + */ + VersionNotifiers: StorageDescriptor, bigint, true, never>; + /** + * The target locations that are subscribed to our version changes, as well as the most recent + * of our versions we informed them of. + */ + VersionNotifyTargets: StorageDescriptor, Anonymize, true, never>; + /** + * Destinations whose latest XCM version we would like to know. Duplicates not allowed, and + * the `u32` counter is the number of times that a send to the destination has been attempted, + * which is used as a prioritization. + */ + VersionDiscoveryQueue: StorageDescriptor<[], Anonymize, false, never>; + /** + * The current migration's stage, if any. + */ + CurrentMigration: StorageDescriptor<[], XcmPalletVersionMigrationStage, true, never>; + /** + * Fungible assets which we know are locked on a remote chain. + */ + RemoteLockedFungibles: StorageDescriptor, Anonymize, true, never>; + /** + * Fungible assets which we know are locked on this chain. + */ + LockedFungibles: StorageDescriptor<[Key: SS58String], Anonymize, true, never>; + /** + * Global suspension state of the XCM executor. + */ + XcmExecutionSuspended: StorageDescriptor<[], boolean, false, never>; + /** + * Whether or not incoming XCMs (both executed locally and received) should be recorded. + * Only one XCM program will be recorded at a time. + * This is meant to be used in runtime APIs, and it's advised it stays false + * for all other use cases, so as to not degrade regular performance. + * + * Only relevant if this pallet is being used as the [`xcm_executor::traits::RecordXcm`] + * implementation in the XCM executor configuration. + */ + ShouldRecordXcm: StorageDescriptor<[], boolean, false, never>; + /** + * If [`ShouldRecordXcm`] is set to true, then the last XCM program executed locally + * will be stored here. + * Runtime APIs can fetch the XCM that was executed by accessing this value. + * + * Only relevant if this pallet is being used as the [`xcm_executor::traits::RecordXcm`] + * implementation in the XCM executor configuration. + */ + RecordedXcm: StorageDescriptor<[], Anonymize, true, never>; + /** + * Map of authorized aliasers of local origins. Each local location can authorize a list of + * other locations to alias into it. Each aliaser is only valid until its inner `expiry` + * block number. + */ + AuthorizedAliases: StorageDescriptor<[Key: XcmVersionedLocation], Anonymize, true, never>; + }; + MessageQueue: { + /** + * The index of the first and last (non-empty) pages. + */ + BookStateFor: StorageDescriptor<[Key: ParachainsInclusionAggregateMessageOrigin], Anonymize, false, never>; + /** + * The origin at which we should begin servicing. + */ + ServiceHead: StorageDescriptor<[], ParachainsInclusionAggregateMessageOrigin, true, never>; + /** + * The map of page indices to pages. + */ + Pages: StorageDescriptor, Anonymize, true, never>; + }; + AssetRate: { + /** + * Maps an asset to its fixed point representation in the native balance. + * + * E.g. `native_amount = asset_amount * ConversionRateToNative::::get(asset_kind)` + */ + ConversionRateToNative: StorageDescriptor<[Key: Anonymize], bigint, true, never>; + }; + Beefy: { + /** + * The current authorities set + */ + Authorities: StorageDescriptor<[], Anonymize, false, never>; + /** + * The current validator set id + */ + ValidatorSetId: StorageDescriptor<[], bigint, false, never>; + /** + * Authorities set scheduled to be used with the next session + */ + NextAuthorities: StorageDescriptor<[], Anonymize, false, never>; + /** + * A mapping from BEEFY set ID to the index of the *most recent* session for which its + * members were responsible. + * + * This is only used for validating equivocation proofs. An equivocation proof must + * contains a key-ownership proof for a given session, therefore we need a way to tie + * together sessions and BEEFY set ids, i.e. we need to validate that a validator + * was the owner of a given key on a given session, and what the active set ID was + * during that session. + * + * TWOX-NOTE: `ValidatorSetId` is not under user control. + */ + SetIdSession: StorageDescriptor<[Key: bigint], number, true, never>; + /** + * Block number where BEEFY consensus is enabled/started. + * By changing this (through privileged `set_new_genesis()`), BEEFY consensus is effectively + * restarted from the newly set block number. + */ + GenesisBlock: StorageDescriptor<[], Anonymize, false, never>; + }; + Mmr: { + /** + * Latest MMR Root hash. + */ + RootHash: StorageDescriptor<[], FixedSizeBinary<32>, false, never>; + /** + * Current size of the MMR (number of leaves). + */ + NumberOfLeaves: StorageDescriptor<[], bigint, false, never>; + /** + * Hashes of the nodes in the MMR. + * + * Note this collection only contains MMR peaks, the inner nodes (and leaves) + * are pruned and only stored in the Offchain DB. + */ + Nodes: StorageDescriptor<[Key: bigint], FixedSizeBinary<32>, true, never>; + }; + BeefyMmrLeaf: { + /** + * Details of current BEEFY authority set. + */ + BeefyAuthorities: StorageDescriptor<[], Anonymize, false, never>; + /** + * Details of next BEEFY authority set. + * + * This storage entry is used as cache for calls to `update_beefy_next_authority_set`. + */ + BeefyNextAuthorities: StorageDescriptor<[], Anonymize, false, never>; + }; +}; +type ICalls = { + System: { + /** + *Make some on-chain remark. + * + *Can be executed by every `origin`. + */ + remark: TxDescriptor>; + /** + *Set the number of pages in the WebAssembly environment's heap. + */ + set_heap_pages: TxDescriptor>; + /** + *Set the new runtime code. + */ + set_code: TxDescriptor>; + /** + *Set the new runtime code without doing any checks of the given `code`. + * + *Note that runtime upgrades will not run if this is called with a not-increasing spec + *version! + */ + set_code_without_checks: TxDescriptor>; + /** + *Set some items of storage. + */ + set_storage: TxDescriptor>; + /** + *Kill some items from storage. + */ + kill_storage: TxDescriptor>; + /** + *Kill all storage items with a key that starts with the given prefix. + * + ***NOTE:** We rely on the Root origin to provide us the number of subkeys under + *the prefix we are removing to accurately calculate the weight of this function. + */ + kill_prefix: TxDescriptor>; + /** + *Make some on-chain remark and emit event. + */ + remark_with_event: TxDescriptor>; + /** + *Authorize an upgrade to a given `code_hash` for the runtime. The runtime can be supplied + *later. + * + *This call requires Root origin. + */ + authorize_upgrade: TxDescriptor>; + /** + *Authorize an upgrade to a given `code_hash` for the runtime. The runtime can be supplied + *later. + * + *WARNING: This authorizes an upgrade that will take place without any safety checks, for + *example that the spec name remains the same and that the version number increases. Not + *recommended for normal use. Use `authorize_upgrade` instead. + * + *This call requires Root origin. + */ + authorize_upgrade_without_checks: TxDescriptor>; + /** + *Provide the preimage (runtime binary) `code` for an upgrade that has been authorized. + * + *If the authorization required a version check, this call will ensure the spec name + *remains unchanged and that the spec version has increased. + * + *Depending on the runtime's `OnSetCode` configuration, this function may directly apply + *the new `code` in the same block or attempt to schedule the upgrade. + * + *All origins are allowed. + */ + apply_authorized_upgrade: TxDescriptor>; + }; + Babe: { + /** + *Report authority equivocation/misbehavior. This method will verify + *the equivocation proof and validate the given key ownership proof + *against the extracted offender. If both are valid, the offence will + *be reported. + */ + report_equivocation: TxDescriptor>; + /** + *Report authority equivocation/misbehavior. This method will verify + *the equivocation proof and validate the given key ownership proof + *against the extracted offender. If both are valid, the offence will + *be reported. + *This extrinsic must be called unsigned and it is expected that only + *block authors will call it (validated in `ValidateUnsigned`), as such + *if the block author is defined it will be defined as the equivocation + *reporter. + */ + report_equivocation_unsigned: TxDescriptor>; + /** + *Plan an epoch config change. The epoch config change is recorded and will be enacted on + *the next call to `enact_epoch_change`. The config will be activated one epoch after. + *Multiple calls to this method will replace any existing planned config change that had + *not been enacted yet. + */ + plan_config_change: TxDescriptor>; + }; + Timestamp: { + /** + *Set the current time. + * + *This call should be invoked exactly once per block. It will panic at the finalization + *phase, if this call hasn't been invoked by that time. + * + *The timestamp should be greater than the previous one by the amount specified by + *[`Config::MinimumPeriod`]. + * + *The dispatch origin for this call must be _None_. + * + *This dispatch class is _Mandatory_ to ensure it gets executed in the block. Be aware + *that changing the complexity of this call could result exhausting the resources in a + *block to execute any other calls. + * + *## Complexity + *- `O(1)` (Note that implementations of `OnTimestampSet` must also be `O(1)`) + *- 1 storage read and 1 storage mutation (codec `O(1)` because of `DidUpdate::take` in + * `on_finalize`) + *- 1 event handler `on_timestamp_set`. Must be `O(1)`. + */ + set: TxDescriptor>; + }; + Indices: { + /** + *Assign an previously unassigned index. + * + *Payment: `Deposit` is reserved from the sender account. + * + *The dispatch origin for this call must be _Signed_. + * + *- `index`: the index to be claimed. This must not be in use. + * + *Emits `IndexAssigned` if successful. + * + *## Complexity + *- `O(1)`. + */ + claim: TxDescriptor>; + /** + *Assign an index already owned by the sender to another account. The balance reservation + *is effectively transferred to the new account. + * + *The dispatch origin for this call must be _Signed_. + * + *- `index`: the index to be re-assigned. This must be owned by the sender. + *- `new`: the new owner of the index. This function is a no-op if it is equal to sender. + * + *Emits `IndexAssigned` if successful. + * + *## Complexity + *- `O(1)`. + */ + transfer: TxDescriptor>; + /** + *Free up an index owned by the sender. + * + *Payment: Any previous deposit placed for the index is unreserved in the sender account. + * + *The dispatch origin for this call must be _Signed_ and the sender must own the index. + * + *- `index`: the index to be freed. This must be owned by the sender. + * + *Emits `IndexFreed` if successful. + * + *## Complexity + *- `O(1)`. + */ + free: TxDescriptor>; + /** + *Force an index to an account. This doesn't require a deposit. If the index is already + *held, then any deposit is reimbursed to its current owner. + * + *The dispatch origin for this call must be _Root_. + * + *- `index`: the index to be (re-)assigned. + *- `new`: the new owner of the index. This function is a no-op if it is equal to sender. + *- `freeze`: if set to `true`, will freeze the index so it cannot be transferred. + * + *Emits `IndexAssigned` if successful. + * + *## Complexity + *- `O(1)`. + */ + force_transfer: TxDescriptor>; + /** + *Freeze an index so it will always point to the sender account. This consumes the + *deposit. + * + *The dispatch origin for this call must be _Signed_ and the signing account must have a + *non-frozen account `index`. + * + *- `index`: the index to be frozen in place. + * + *Emits `IndexFrozen` if successful. + * + *## Complexity + *- `O(1)`. + */ + freeze: TxDescriptor>; + /** + *Poke the deposit reserved for an index. + * + *The dispatch origin for this call must be _Signed_ and the signing account must have a + *non-frozen account `index`. + * + *The transaction fees is waived if the deposit is changed after poking/reconsideration. + * + *- `index`: the index whose deposit is to be poked/reconsidered. + * + *Emits `DepositPoked` if successful. + */ + poke_deposit: TxDescriptor>; + }; + Balances: { + /** + *Transfer some liquid free balance to another account. + * + *`transfer_allow_death` will set the `FreeBalance` of the sender and receiver. + *If the sender's account is below the existential deposit as a result + *of the transfer, the account will be reaped. + * + *The dispatch origin for this call must be `Signed` by the transactor. + */ + transfer_allow_death: TxDescriptor>; + /** + *Exactly as `transfer_allow_death`, except the origin must be root and the source account + *may be specified. + */ + force_transfer: TxDescriptor>; + /** + *Same as the [`transfer_allow_death`] call, but with a check that the transfer will not + *kill the origin account. + * + *99% of the time you want [`transfer_allow_death`] instead. + * + *[`transfer_allow_death`]: struct.Pallet.html#method.transfer + */ + transfer_keep_alive: TxDescriptor>; + /** + *Transfer the entire transferable balance from the caller account. + * + *NOTE: This function only attempts to transfer _transferable_ balances. This means that + *any locked, reserved, or existential deposits (when `keep_alive` is `true`), will not be + *transferred by this function. To ensure that this function results in a killed account, + *you might need to prepare the account by removing any reference counters, storage + *deposits, etc... + * + *The dispatch origin of this call must be Signed. + * + *- `dest`: The recipient of the transfer. + *- `keep_alive`: A boolean to determine if the `transfer_all` operation should send all + * of the funds the account has, causing the sender account to be killed (false), or + * transfer everything except at least the existential deposit, which will guarantee to + * keep the sender account alive (true). + */ + transfer_all: TxDescriptor>; + /** + *Unreserve some balance from a user by force. + * + *Can only be called by ROOT. + */ + force_unreserve: TxDescriptor>; + /** + *Upgrade a specified account. + * + *- `origin`: Must be `Signed`. + *- `who`: The account to be upgraded. + * + *This will waive the transaction fee if at least all but 10% of the accounts needed to + *be upgraded. (We let some not have to be upgraded just in order to allow for the + *possibility of churn). + */ + upgrade_accounts: TxDescriptor>; + /** + *Set the regular balance of a given account. + * + *The dispatch origin for this call is `root`. + */ + force_set_balance: TxDescriptor>; + /** + *Adjust the total issuance in a saturating way. + * + *Can only be called by root and always needs a positive `delta`. + * + *# Example + */ + force_adjust_total_issuance: TxDescriptor>; + /** + *Burn the specified liquid free balance from the origin account. + * + *If the origin's account ends up below the existential deposit as a result + *of the burn and `keep_alive` is false, the account will be reaped. + * + *Unlike sending funds to a _burn_ address, which merely makes the funds inaccessible, + *this `burn` operation will reduce total issuance by the amount _burned_. + */ + burn: TxDescriptor>; + }; + Staking: { + /** + *Take the origin account as a stash and lock up `value` of its balance. `controller` will + *be the account that controls it. + * + *`value` must be more than the `minimum_balance` specified by `T::Currency`. + * + *The dispatch origin for this call must be _Signed_ by the stash account. + * + *Emits `Bonded`. + *## Complexity + *- Independent of the arguments. Moderate complexity. + *- O(1). + *- Three extra DB entries. + * + *NOTE: Two of the storage writes (`Self::bonded`, `Self::payee`) are _never_ cleaned + *unless the `origin` falls below _existential deposit_ (or equal to 0) and gets removed + *as dust. + */ + bond: TxDescriptor>; + /** + *Add some extra amount that have appeared in the stash `free_balance` into the balance up + *for staking. + * + *The dispatch origin for this call must be _Signed_ by the stash, not the controller. + * + *Use this if there are additional funds in your stash account that you wish to bond. + *Unlike [`bond`](Self::bond) or [`unbond`](Self::unbond) this function does not impose + *any limitation on the amount that can be added. + * + *Emits `Bonded`. + * + *## Complexity + *- Independent of the arguments. Insignificant complexity. + *- O(1). + */ + bond_extra: TxDescriptor>; + /** + *Schedule a portion of the stash to be unlocked ready for transfer out after the bond + *period ends. If this leaves an amount actively bonded less than + *[`asset::existential_deposit`], then it is increased to the full amount. + * + *The stash may be chilled if the ledger total amount falls to 0 after unbonding. + * + *The dispatch origin for this call must be _Signed_ by the controller, not the stash. + * + *Once the unlock period is done, you can call `withdraw_unbonded` to actually move + *the funds out of management ready for transfer. + * + *No more than a limited number of unlocking chunks (see `MaxUnlockingChunks`) + *can co-exists at the same time. If there are no unlocking chunks slots available + *[`Call::withdraw_unbonded`] is called to remove some of the chunks (if possible). + * + *If a user encounters the `InsufficientBond` error when calling this extrinsic, + *they should call `chill` first in order to free up their bonded funds. + * + *Emits `Unbonded`. + * + *See also [`Call::withdraw_unbonded`]. + */ + unbond: TxDescriptor>; + /** + *Remove any unlocked chunks from the `unlocking` queue from our management. + * + *This essentially frees up that balance to be used by the stash account to do whatever + *it wants. + * + *The dispatch origin for this call must be _Signed_ by the controller. + * + *Emits `Withdrawn`. + * + *See also [`Call::unbond`]. + * + *## Parameters + * + *- `num_slashing_spans` indicates the number of metadata slashing spans to clear when + *this call results in a complete removal of all the data related to the stash account. + *In this case, the `num_slashing_spans` must be larger or equal to the number of + *slashing spans associated with the stash account in the [`SlashingSpans`] storage type, + *otherwise the call will fail. The call weight is directly proportional to + *`num_slashing_spans`. + * + *## Complexity + *O(S) where S is the number of slashing spans to remove + *NOTE: Weight annotation is the kill scenario, we refund otherwise. + */ + withdraw_unbonded: TxDescriptor>; + /** + *Declare the desire to validate for the origin controller. + * + *Effects will be felt at the beginning of the next era. + * + *The dispatch origin for this call must be _Signed_ by the controller, not the stash. + */ + validate: TxDescriptor>; + /** + *Declare the desire to nominate `targets` for the origin controller. + * + *Effects will be felt at the beginning of the next era. + * + *The dispatch origin for this call must be _Signed_ by the controller, not the stash. + * + *## Complexity + *- The transaction's complexity is proportional to the size of `targets` (N) + *which is capped at CompactAssignments::LIMIT (T::MaxNominations). + *- Both the reads and writes follow a similar pattern. + */ + nominate: TxDescriptor>; + /** + *Declare no desire to either validate or nominate. + * + *Effects will be felt at the beginning of the next era. + * + *The dispatch origin for this call must be _Signed_ by the controller, not the stash. + * + *## Complexity + *- Independent of the arguments. Insignificant complexity. + *- Contains one read. + *- Writes are limited to the `origin` account key. + */ + chill: TxDescriptor; + /** + *(Re-)set the payment target for a controller. + * + *Effects will be felt instantly (as soon as this function is completed successfully). + * + *The dispatch origin for this call must be _Signed_ by the controller, not the stash. + * + *## Complexity + *- O(1) + *- Independent of the arguments. Insignificant complexity. + *- Contains a limited number of reads. + *- Writes are limited to the `origin` account key. + *--------- + */ + set_payee: TxDescriptor>; + /** + *(Re-)sets the controller of a stash to the stash itself. This function previously + *accepted a `controller` argument to set the controller to an account other than the + *stash itself. This functionality has now been removed, now only setting the controller + *to the stash, if it is not already. + * + *Effects will be felt instantly (as soon as this function is completed successfully). + * + *The dispatch origin for this call must be _Signed_ by the stash, not the controller. + * + *## Complexity + *O(1) + *- Independent of the arguments. Insignificant complexity. + *- Contains a limited number of reads. + *- Writes are limited to the `origin` account key. + */ + set_controller: TxDescriptor; + /** + *Sets the ideal number of validators. + * + *The dispatch origin must be Root. + * + *## Complexity + *O(1) + */ + set_validator_count: TxDescriptor>; + /** + *Increments the ideal number of validators up to maximum of + *`ElectionProviderBase::MaxWinners`. + * + *The dispatch origin must be Root. + * + *## Complexity + *Same as [`Self::set_validator_count`]. + */ + increase_validator_count: TxDescriptor>; + /** + *Scale up the ideal number of validators by a factor up to maximum of + *`ElectionProviderBase::MaxWinners`. + * + *The dispatch origin must be Root. + * + *## Complexity + *Same as [`Self::set_validator_count`]. + */ + scale_validator_count: TxDescriptor>; + /** + *Force there to be no new eras indefinitely. + * + *The dispatch origin must be Root. + * + *# Warning + * + *The election process starts multiple blocks before the end of the era. + *Thus the election process may be ongoing when this is called. In this case the + *election will continue until the next era is triggered. + * + *## Complexity + *- No arguments. + *- Weight: O(1) + */ + force_no_eras: TxDescriptor; + /** + *Force there to be a new era at the end of the next session. After this, it will be + *reset to normal (non-forced) behaviour. + * + *The dispatch origin must be Root. + * + *# Warning + * + *The election process starts multiple blocks before the end of the era. + *If this is called just before a new era is triggered, the election process may not + *have enough blocks to get a result. + * + *## Complexity + *- No arguments. + *- Weight: O(1) + */ + force_new_era: TxDescriptor; + /** + *Set the validators who cannot be slashed (if any). + * + *The dispatch origin must be Root. + */ + set_invulnerables: TxDescriptor>; + /** + *Force a current staker to become completely unstaked, immediately. + * + *The dispatch origin must be Root. + * + *## Parameters + * + *- `num_slashing_spans`: Refer to comments on [`Call::withdraw_unbonded`] for more + *details. + */ + force_unstake: TxDescriptor>; + /** + *Force there to be a new era at the end of sessions indefinitely. + * + *The dispatch origin must be Root. + * + *# Warning + * + *The election process starts multiple blocks before the end of the era. + *If this is called just before a new era is triggered, the election process may not + *have enough blocks to get a result. + */ + force_new_era_always: TxDescriptor; + /** + *Cancel enactment of a deferred slash. + * + *Can be called by the `T::AdminOrigin`. + * + *Parameters: era and indices of the slashes for that era to kill. + *They **must** be sorted in ascending order, *and* unique. + */ + cancel_deferred_slash: TxDescriptor>; + /** + *Pay out next page of the stakers behind a validator for the given era. + * + *- `validator_stash` is the stash account of the validator. + *- `era` may be any era between `[current_era - history_depth; current_era]`. + * + *The origin of this call must be _Signed_. Any account can call this function, even if + *it is not one of the stakers. + * + *The reward payout could be paged in case there are too many nominators backing the + *`validator_stash`. This call will payout unpaid pages in an ascending order. To claim a + *specific page, use `payout_stakers_by_page`.` + * + *If all pages are claimed, it returns an error `InvalidPage`. + */ + payout_stakers: TxDescriptor>; + /** + *Rebond a portion of the stash scheduled to be unlocked. + * + *The dispatch origin must be signed by the controller. + * + *## Complexity + *- Time complexity: O(L), where L is unlocking chunks + *- Bounded by `MaxUnlockingChunks`. + */ + rebond: TxDescriptor>; + /** + *Remove all data structures concerning a staker/stash once it is at a state where it can + *be considered `dust` in the staking system. The requirements are: + * + *1. the `total_balance` of the stash is below existential deposit. + *2. or, the `ledger.total` of the stash is below existential deposit. + *3. or, existential deposit is zero and either `total_balance` or `ledger.total` is zero. + * + *The former can happen in cases like a slash; the latter when a fully unbonded account + *is still receiving staking rewards in `RewardDestination::Staked`. + * + *It can be called by anyone, as long as `stash` meets the above requirements. + * + *Refunds the transaction fees upon successful execution. + * + *## Parameters + * + *- `num_slashing_spans`: Refer to comments on [`Call::withdraw_unbonded`] for more + *details. + */ + reap_stash: TxDescriptor>; + /** + *Remove the given nominations from the calling validator. + * + *Effects will be felt at the beginning of the next era. + * + *The dispatch origin for this call must be _Signed_ by the controller, not the stash. + * + *- `who`: A list of nominator stash accounts who are nominating this validator which + * should no longer be nominating this validator. + * + *Note: Making this call only makes sense if you first set the validator preferences to + *block any further nominations. + */ + kick: TxDescriptor>; + /** + *Update the various staking configurations . + * + ** `min_nominator_bond`: The minimum active bond needed to be a nominator. + ** `min_validator_bond`: The minimum active bond needed to be a validator. + ** `max_nominator_count`: The max number of users who can be a nominator at once. When + * set to `None`, no limit is enforced. + ** `max_validator_count`: The max number of users who can be a validator at once. When + * set to `None`, no limit is enforced. + ** `chill_threshold`: The ratio of `max_nominator_count` or `max_validator_count` which + * should be filled in order for the `chill_other` transaction to work. + ** `min_commission`: The minimum amount of commission that each validators must maintain. + * This is checked only upon calling `validate`. Existing validators are not affected. + * + *RuntimeOrigin must be Root to call this function. + * + *NOTE: Existing nominators and validators will not be affected by this update. + *to kick people under the new limits, `chill_other` should be called. + */ + set_staking_configs: TxDescriptor>; + /** + *Declare a `controller` to stop participating as either a validator or nominator. + * + *Effects will be felt at the beginning of the next era. + * + *The dispatch origin for this call must be _Signed_, but can be called by anyone. + * + *If the caller is the same as the controller being targeted, then no further checks are + *enforced, and this function behaves just like `chill`. + * + *If the caller is different than the controller being targeted, the following conditions + *must be met: + * + ** `controller` must belong to a nominator who has become non-decodable, + * + *Or: + * + ** A `ChillThreshold` must be set and checked which defines how close to the max + * nominators or validators we must reach before users can start chilling one-another. + ** A `MaxNominatorCount` and `MaxValidatorCount` must be set which is used to determine + * how close we are to the threshold. + ** A `MinNominatorBond` and `MinValidatorBond` must be set and checked, which determines + * if this is a person that should be chilled because they have not met the threshold + * bond required. + * + *This can be helpful if bond requirements are updated, and we need to remove old users + *who do not satisfy these requirements. + */ + chill_other: TxDescriptor>; + /** + *Force a validator to have at least the minimum commission. This will not affect a + *validator who already has a commission greater than or equal to the minimum. Any account + *can call this. + */ + force_apply_min_commission: TxDescriptor>; + /** + *Sets the minimum amount of commission that each validators must maintain. + * + *This call has lower privilege requirements than `set_staking_config` and can be called + *by the `T::AdminOrigin`. Root can always call this. + */ + set_min_commission: TxDescriptor>; + /** + *Pay out a page of the stakers behind a validator for the given era and page. + * + *- `validator_stash` is the stash account of the validator. + *- `era` may be any era between `[current_era - history_depth; current_era]`. + *- `page` is the page index of nominators to pay out with value between 0 and + * `num_nominators / T::MaxExposurePageSize`. + * + *The origin of this call must be _Signed_. Any account can call this function, even if + *it is not one of the stakers. + * + *If a validator has more than [`Config::MaxExposurePageSize`] nominators backing + *them, then the list of nominators is paged, with each page being capped at + *[`Config::MaxExposurePageSize`.] If a validator has more than one page of nominators, + *the call needs to be made for each page separately in order for all the nominators + *backing a validator to receive the reward. The nominators are not sorted across pages + *and so it should not be assumed the highest staker would be on the topmost page and vice + *versa. If rewards are not claimed in [`Config::HistoryDepth`] eras, they are lost. + */ + payout_stakers_by_page: TxDescriptor>; + /** + *Migrates an account's `RewardDestination::Controller` to + *`RewardDestination::Account(controller)`. + * + *Effects will be felt instantly (as soon as this function is completed successfully). + * + *This will waive the transaction fee if the `payee` is successfully migrated. + */ + update_payee: TxDescriptor>; + /** + *Updates a batch of controller accounts to their corresponding stash account if they are + *not the same. Ignores any controller accounts that do not exist, and does not operate if + *the stash and controller are already the same. + * + *Effects will be felt instantly (as soon as this function is completed successfully). + * + *The dispatch origin must be `T::AdminOrigin`. + */ + deprecate_controller_batch: TxDescriptor>; + /** + *Restores the state of a ledger which is in an inconsistent state. + * + *The requirements to restore a ledger are the following: + ** The stash is bonded; or + ** The stash is not bonded but it has a staking lock left behind; or + ** If the stash has an associated ledger and its state is inconsistent; or + ** If the ledger is not corrupted *but* its staking lock is out of sync. + * + *The `maybe_*` input parameters will overwrite the corresponding data and metadata of the + *ledger associated with the stash. If the input parameters are not set, the ledger will + *be reset values from on-chain state. + */ + restore_ledger: TxDescriptor>; + /** + *Removes the legacy Staking locks if they exist. + * + *This removes the legacy lock on the stake with [`Config::OldCurrency`] and creates a + *hold on it if needed. If all stake cannot be held, the best effort is made to hold as + *much as possible. The remaining stake is forced withdrawn from the ledger. + * + *The fee is waived if the migration is successful. + */ + migrate_currency: TxDescriptor>; + /** + *This function allows governance to manually slash a validator and is a + ***fallback mechanism**. + * + *The dispatch origin must be `T::AdminOrigin`. + * + *## Parameters + *- `validator_stash` - The stash account of the validator to slash. + *- `era` - The era in which the validator was in the active set. + *- `slash_fraction` - The percentage of the stake to slash, expressed as a Perbill. + * + *## Behavior + * + *The slash will be applied using the standard slashing mechanics, respecting the + *configured `SlashDeferDuration`. + * + *This means: + *- If the validator was already slashed by a higher percentage for the same era, this + * slash will have no additional effect. + *- If the validator was previously slashed by a lower percentage, only the difference + * will be applied. + *- The slash will be deferred by `SlashDeferDuration` eras before being enacted. + */ + manual_slash: TxDescriptor>; + }; + Parameters: { + /** + *Set the value of a parameter. + * + *The dispatch origin of this call must be `AdminOrigin` for the given `key`. Values be + *deleted by setting them to `None`. + */ + set_parameter: TxDescriptor>; + }; + Session: { + /** + *Sets the session key(s) of the function caller to `keys`. + *Allows an account to set its session key prior to becoming a validator. + *This doesn't take effect until the next session. + * + *The dispatch origin of this function must be signed. + * + *## Complexity + *- `O(1)`. Actual cost depends on the number of length of `T::Keys::key_ids()` which is + * fixed. + */ + set_keys: TxDescriptor>; + /** + *Removes any session key(s) of the function caller. + * + *This doesn't take effect until the next session. + * + *The dispatch origin of this function must be Signed and the account must be either be + *convertible to a validator ID using the chain's typical addressing system (this usually + *means being a controller account) or directly convertible into a validator ID (which + *usually means being a stash account). + * + *## Complexity + *- `O(1)` in number of key types. Actual cost depends on the number of length of + * `T::Keys::key_ids()` which is fixed. + */ + purge_keys: TxDescriptor; + }; + Grandpa: { + /** + *Report voter equivocation/misbehavior. This method will verify the + *equivocation proof and validate the given key ownership proof + *against the extracted offender. If both are valid, the offence + *will be reported. + */ + report_equivocation: TxDescriptor>; + /** + *Report voter equivocation/misbehavior. This method will verify the + *equivocation proof and validate the given key ownership proof + *against the extracted offender. If both are valid, the offence + *will be reported. + * + *This extrinsic must be called unsigned and it is expected that only + *block authors will call it (validated in `ValidateUnsigned`), as such + *if the block author is defined it will be defined as the equivocation + *reporter. + */ + report_equivocation_unsigned: TxDescriptor>; + /** + *Note that the current authority set of the GRANDPA finality gadget has stalled. + * + *This will trigger a forced authority set change at the beginning of the next session, to + *be enacted `delay` blocks after that. The `delay` should be high enough to safely assume + *that the block signalling the forced change will not be re-orged e.g. 1000 blocks. + *The block production rate (which may be slowed down because of finality lagging) should + *be taken into account when choosing the `delay`. The GRANDPA voters based on the new + *authority will start voting on top of `best_finalized_block_number` for new finalized + *blocks. `best_finalized_block_number` should be the highest of the latest finalized + *block of all validators of the new authority set. + * + *Only callable by root. + */ + note_stalled: TxDescriptor>; + }; + Utility: { + /** + *Send a batch of dispatch calls. + * + *May be called from any origin except `None`. + * + *- `calls`: The calls to be dispatched from the same origin. The number of call must not + * exceed the constant: `batched_calls_limit` (available in constant metadata). + * + *If origin is root then the calls are dispatched without checking origin filter. (This + *includes bypassing `frame_system::Config::BaseCallFilter`). + * + *## Complexity + *- O(C) where C is the number of calls to be batched. + * + *This will return `Ok` in all circumstances. To determine the success of the batch, an + *event is deposited. If a call failed and the batch was interrupted, then the + *`BatchInterrupted` event is deposited, along with the number of successful calls made + *and the error of the failed call. If all were successful, then the `BatchCompleted` + *event is deposited. + */ + batch: TxDescriptor>; + /** + *Send a call through an indexed pseudonym of the sender. + * + *Filter from origin are passed along. The call will be dispatched with an origin which + *use the same filter as the origin of this call. + * + *NOTE: If you need to ensure that any account-based filtering is not honored (i.e. + *because you expect `proxy` to have been used prior in the call stack and you do not want + *the call restrictions to apply to any sub-accounts), then use `as_multi_threshold_1` + *in the Multisig pallet instead. + * + *NOTE: Prior to version *12, this was called `as_limited_sub`. + * + *The dispatch origin for this call must be _Signed_. + */ + as_derivative: TxDescriptor>; + /** + *Send a batch of dispatch calls and atomically execute them. + *The whole transaction will rollback and fail if any of the calls failed. + * + *May be called from any origin except `None`. + * + *- `calls`: The calls to be dispatched from the same origin. The number of call must not + * exceed the constant: `batched_calls_limit` (available in constant metadata). + * + *If origin is root then the calls are dispatched without checking origin filter. (This + *includes bypassing `frame_system::Config::BaseCallFilter`). + * + *## Complexity + *- O(C) where C is the number of calls to be batched. + */ + batch_all: TxDescriptor>; + /** + *Dispatches a function call with a provided origin. + * + *The dispatch origin for this call must be _Root_. + * + *## Complexity + *- O(1). + */ + dispatch_as: TxDescriptor>; + /** + *Send a batch of dispatch calls. + *Unlike `batch`, it allows errors and won't interrupt. + * + *May be called from any origin except `None`. + * + *- `calls`: The calls to be dispatched from the same origin. The number of call must not + * exceed the constant: `batched_calls_limit` (available in constant metadata). + * + *If origin is root then the calls are dispatch without checking origin filter. (This + *includes bypassing `frame_system::Config::BaseCallFilter`). + * + *## Complexity + *- O(C) where C is the number of calls to be batched. + */ + force_batch: TxDescriptor>; + /** + *Dispatch a function call with a specified weight. + * + *This function does not check the weight of the call, and instead allows the + *Root origin to specify the weight of the call. + * + *The dispatch origin for this call must be _Root_. + */ + with_weight: TxDescriptor>; + /** + *Dispatch a fallback call in the event the main call fails to execute. + *May be called from any origin except `None`. + * + *This function first attempts to dispatch the `main` call. + *If the `main` call fails, the `fallback` is attemted. + *if the fallback is successfully dispatched, the weights of both calls + *are accumulated and an event containing the main call error is deposited. + * + *In the event of a fallback failure the whole call fails + *with the weights returned. + * + *- `main`: The main call to be dispatched. This is the primary action to execute. + *- `fallback`: The fallback call to be dispatched in case the `main` call fails. + * + *## Dispatch Logic + *- If the origin is `root`, both the main and fallback calls are executed without + * applying any origin filters. + *- If the origin is not `root`, the origin filter is applied to both the `main` and + * `fallback` calls. + * + *## Use Case + *- Some use cases might involve submitting a `batch` type call in either main, fallback + * or both. + */ + if_else: TxDescriptor>; + /** + *Dispatches a function call with a provided origin. + * + *Almost the same as [`Pallet::dispatch_as`] but forwards any error of the inner call. + * + *The dispatch origin for this call must be _Root_. + */ + dispatch_as_fallible: TxDescriptor>; + }; + Identity: { + /** + *Add a registrar to the system. + * + *The dispatch origin for this call must be `T::RegistrarOrigin`. + * + *- `account`: the account of the registrar. + * + *Emits `RegistrarAdded` if successful. + */ + add_registrar: TxDescriptor>; + /** + *Set an account's identity information and reserve the appropriate deposit. + * + *If the account already has identity information, the deposit is taken as part payment + *for the new deposit. + * + *The dispatch origin for this call must be _Signed_. + * + *- `info`: The identity information. + * + *Emits `IdentitySet` if successful. + */ + set_identity: TxDescriptor>; + /** + *Set the sub-accounts of the sender. + * + *Payment: Any aggregate balance reserved by previous `set_subs` calls will be returned + *and an amount `SubAccountDeposit` will be reserved for each item in `subs`. + * + *The dispatch origin for this call must be _Signed_ and the sender must have a registered + *identity. + * + *- `subs`: The identity's (new) sub-accounts. + */ + set_subs: TxDescriptor>; + /** + *Clear an account's identity info and all sub-accounts and return all deposits. + * + *Payment: All reserved balances on the account are returned. + * + *The dispatch origin for this call must be _Signed_ and the sender must have a registered + *identity. + * + *Emits `IdentityCleared` if successful. + */ + clear_identity: TxDescriptor; + /** + *Request a judgement from a registrar. + * + *Payment: At most `max_fee` will be reserved for payment to the registrar if judgement + *given. + * + *The dispatch origin for this call must be _Signed_ and the sender must have a + *registered identity. + * + *- `reg_index`: The index of the registrar whose judgement is requested. + *- `max_fee`: The maximum fee that may be paid. This should just be auto-populated as: + * + *```nocompile + *Registrars::::get().get(reg_index).unwrap().fee + *``` + * + *Emits `JudgementRequested` if successful. + */ + request_judgement: TxDescriptor>; + /** + *Cancel a previous request. + * + *Payment: A previously reserved deposit is returned on success. + * + *The dispatch origin for this call must be _Signed_ and the sender must have a + *registered identity. + * + *- `reg_index`: The index of the registrar whose judgement is no longer requested. + * + *Emits `JudgementUnrequested` if successful. + */ + cancel_request: TxDescriptor>; + /** + *Set the fee required for a judgement to be requested from a registrar. + * + *The dispatch origin for this call must be _Signed_ and the sender must be the account + *of the registrar whose index is `index`. + * + *- `index`: the index of the registrar whose fee is to be set. + *- `fee`: the new fee. + */ + set_fee: TxDescriptor>; + /** + *Change the account associated with a registrar. + * + *The dispatch origin for this call must be _Signed_ and the sender must be the account + *of the registrar whose index is `index`. + * + *- `index`: the index of the registrar whose fee is to be set. + *- `new`: the new account ID. + */ + set_account_id: TxDescriptor>; + /** + *Set the field information for a registrar. + * + *The dispatch origin for this call must be _Signed_ and the sender must be the account + *of the registrar whose index is `index`. + * + *- `index`: the index of the registrar whose fee is to be set. + *- `fields`: the fields that the registrar concerns themselves with. + */ + set_fields: TxDescriptor>; + /** + *Provide a judgement for an account's identity. + * + *The dispatch origin for this call must be _Signed_ and the sender must be the account + *of the registrar whose index is `reg_index`. + * + *- `reg_index`: the index of the registrar whose judgement is being made. + *- `target`: the account whose identity the judgement is upon. This must be an account + * with a registered identity. + *- `judgement`: the judgement of the registrar of index `reg_index` about `target`. + *- `identity`: The hash of the [`IdentityInformationProvider`] for that the judgement is + * provided. + * + *Note: Judgements do not apply to a username. + * + *Emits `JudgementGiven` if successful. + */ + provide_judgement: TxDescriptor>; + /** + *Remove an account's identity and sub-account information and slash the deposits. + * + *Payment: Reserved balances from `set_subs` and `set_identity` are slashed and handled by + *`Slash`. Verification request deposits are not returned; they should be cancelled + *manually using `cancel_request`. + * + *The dispatch origin for this call must match `T::ForceOrigin`. + * + *- `target`: the account whose identity the judgement is upon. This must be an account + * with a registered identity. + * + *Emits `IdentityKilled` if successful. + */ + kill_identity: TxDescriptor>; + /** + *Add the given account to the sender's subs. + * + *Payment: Balance reserved by a previous `set_subs` call for one sub will be repatriated + *to the sender. + * + *The dispatch origin for this call must be _Signed_ and the sender must have a registered + *sub identity of `sub`. + */ + add_sub: TxDescriptor>; + /** + *Alter the associated name of the given sub-account. + * + *The dispatch origin for this call must be _Signed_ and the sender must have a registered + *sub identity of `sub`. + */ + rename_sub: TxDescriptor>; + /** + *Remove the given account from the sender's subs. + * + *Payment: Balance reserved by a previous `set_subs` call for one sub will be repatriated + *to the sender. + * + *The dispatch origin for this call must be _Signed_ and the sender must have a registered + *sub identity of `sub`. + */ + remove_sub: TxDescriptor>; + /** + *Remove the sender as a sub-account. + * + *Payment: Balance reserved by a previous `set_subs` call for one sub will be repatriated + *to the sender (*not* the original depositor). + * + *The dispatch origin for this call must be _Signed_ and the sender must have a registered + *super-identity. + * + *NOTE: This should not normally be used, but is provided in the case that the non- + *controller of an account is maliciously registered as a sub-account. + */ + quit_sub: TxDescriptor; + /** + *Add an `AccountId` with permission to grant usernames with a given `suffix` appended. + * + *The authority can grant up to `allocation` usernames. To top up the allocation or + *change the account used to grant usernames, this call can be used with the updated + *parameters to overwrite the existing configuration. + */ + add_username_authority: TxDescriptor>; + /** + *Remove `authority` from the username authorities. + */ + remove_username_authority: TxDescriptor>; + /** + *Set the username for `who`. Must be called by a username authority. + * + *If `use_allocation` is set, the authority must have a username allocation available to + *spend. Otherwise, the authority will need to put up a deposit for registering the + *username. + * + *Users can either pre-sign their usernames or + *accept them later. + * + *Usernames must: + * - Only contain lowercase ASCII characters or digits. + * - When combined with the suffix of the issuing authority be _less than_ the + * `MaxUsernameLength`. + */ + set_username_for: TxDescriptor>; + /** + *Accept a given username that an `authority` granted. The call must include the full + *username, as in `username.suffix`. + */ + accept_username: TxDescriptor>; + /** + *Remove an expired username approval. The username was approved by an authority but never + *accepted by the user and must now be beyond its expiration. The call must include the + *full username, as in `username.suffix`. + */ + remove_expired_approval: TxDescriptor>; + /** + *Set a given username as the primary. The username should include the suffix. + */ + set_primary_username: TxDescriptor>; + /** + *Start the process of removing a username by placing it in the unbinding usernames map. + *Once the grace period has passed, the username can be deleted by calling + *[remove_username](crate::Call::remove_username). + */ + unbind_username: TxDescriptor>; + /** + *Permanently delete a username which has been unbinding for longer than the grace period. + *Caller is refunded the fee if the username expired and the removal was successful. + */ + remove_username: TxDescriptor>; + /** + *Call with [ForceOrigin](crate::Config::ForceOrigin) privileges which deletes a username + *and slashes any deposit associated with it. + */ + kill_username: TxDescriptor>; + }; + Recovery: { + /** + *Send a call through a recovered account. + * + *The dispatch origin for this call must be _Signed_ and registered to + *be able to make calls on behalf of the recovered account. + * + *Parameters: + *- `account`: The recovered account you want to make a call on-behalf-of. + *- `call`: The call you want to make with the recovered account. + */ + as_recovered: TxDescriptor>; + /** + *Allow ROOT to bypass the recovery process and set a rescuer account + *for a lost account directly. + * + *The dispatch origin for this call must be _ROOT_. + * + *Parameters: + *- `lost`: The "lost account" to be recovered. + *- `rescuer`: The "rescuer account" which can call as the lost account. + */ + set_recovered: TxDescriptor>; + /** + *Create a recovery configuration for your account. This makes your account recoverable. + * + *Payment: `ConfigDepositBase` + `FriendDepositFactor` * #_of_friends balance + *will be reserved for storing the recovery configuration. This deposit is returned + *in full when the user calls `remove_recovery`. + * + *The dispatch origin for this call must be _Signed_. + * + *Parameters: + *- `friends`: A list of friends you trust to vouch for recovery attempts. Should be + * ordered and contain no duplicate values. + *- `threshold`: The number of friends that must vouch for a recovery attempt before the + * account can be recovered. Should be less than or equal to the length of the list of + * friends. + *- `delay_period`: The number of blocks after a recovery attempt is initialized that + * needs to pass before the account can be recovered. + */ + create_recovery: TxDescriptor>; + /** + *Initiate the process for recovering a recoverable account. + * + *Payment: `RecoveryDeposit` balance will be reserved for initiating the + *recovery process. This deposit will always be repatriated to the account + *trying to be recovered. See `close_recovery`. + * + *The dispatch origin for this call must be _Signed_. + * + *Parameters: + *- `account`: The lost account that you want to recover. This account needs to be + * recoverable (i.e. have a recovery configuration). + */ + initiate_recovery: TxDescriptor>; + /** + *Allow a "friend" of a recoverable account to vouch for an active recovery + *process for that account. + * + *The dispatch origin for this call must be _Signed_ and must be a "friend" + *for the recoverable account. + * + *Parameters: + *- `lost`: The lost account that you want to recover. + *- `rescuer`: The account trying to rescue the lost account that you want to vouch for. + * + *The combination of these two parameters must point to an active recovery + *process. + */ + vouch_recovery: TxDescriptor>; + /** + *Allow a successful rescuer to claim their recovered account. + * + *The dispatch origin for this call must be _Signed_ and must be a "rescuer" + *who has successfully completed the account recovery process: collected + *`threshold` or more vouches, waited `delay_period` blocks since initiation. + * + *Parameters: + *- `account`: The lost account that you want to claim has been successfully recovered by + * you. + */ + claim_recovery: TxDescriptor>; + /** + *As the controller of a recoverable account, close an active recovery + *process for your account. + * + *Payment: By calling this function, the recoverable account will receive + *the recovery deposit `RecoveryDeposit` placed by the rescuer. + * + *The dispatch origin for this call must be _Signed_ and must be a + *recoverable account with an active recovery process for it. + * + *Parameters: + *- `rescuer`: The account trying to rescue this recoverable account. + */ + close_recovery: TxDescriptor>; + /** + *Remove the recovery process for your account. Recovered accounts are still accessible. + * + *NOTE: The user must make sure to call `close_recovery` on all active + *recovery attempts before calling this function else it will fail. + * + *Payment: By calling this function the recoverable account will unreserve + *their recovery configuration deposit. + *(`ConfigDepositBase` + `FriendDepositFactor` * #_of_friends) + * + *The dispatch origin for this call must be _Signed_ and must be a + *recoverable account (i.e. has a recovery configuration). + */ + remove_recovery: TxDescriptor; + /** + *Cancel the ability to use `as_recovered` for `account`. + * + *The dispatch origin for this call must be _Signed_ and registered to + *be able to make calls on behalf of the recovered account. + * + *Parameters: + *- `account`: The recovered account you are able to call on-behalf-of. + */ + cancel_recovered: TxDescriptor>; + /** + *Poke deposits for recovery configurations and / or active recoveries. + * + *This can be used by accounts to possibly lower their locked amount. + * + *The dispatch origin for this call must be _Signed_. + * + *Parameters: + *- `maybe_account`: Optional recoverable account for which you have an active recovery + *and want to adjust the deposit for the active recovery. + * + *This function checks both recovery configuration deposit and active recovery deposits + *of the caller: + *- If the caller has created a recovery configuration, checks and adjusts its deposit + *- If the caller has initiated any active recoveries, and provides the account in + *`maybe_account`, checks and adjusts those deposits + * + *If any deposit is updated, the difference will be reserved/unreserved from the caller's + *account. + * + *The transaction is made free if any deposit is updated and paid otherwise. + * + *Emits `DepositPoked` if any deposit is updated. + *Multiple events may be emitted in case both types of deposits are updated. + */ + poke_deposit: TxDescriptor>; + }; + Vesting: { + /** + *Unlock any vested funds of the sender account. + * + *The dispatch origin for this call must be _Signed_ and the sender must have funds still + *locked under this pallet. + * + *Emits either `VestingCompleted` or `VestingUpdated`. + * + *## Complexity + *- `O(1)`. + */ + vest: TxDescriptor; + /** + *Unlock any vested funds of a `target` account. + * + *The dispatch origin for this call must be _Signed_. + * + *- `target`: The account whose vested funds should be unlocked. Must have funds still + *locked under this pallet. + * + *Emits either `VestingCompleted` or `VestingUpdated`. + * + *## Complexity + *- `O(1)`. + */ + vest_other: TxDescriptor>; + /** + *Create a vested transfer. + * + *The dispatch origin for this call must be _Signed_. + * + *- `target`: The account receiving the vested funds. + *- `schedule`: The vesting schedule attached to the transfer. + * + *Emits `VestingCreated`. + * + *NOTE: This will unlock all schedules through the current block. + * + *## Complexity + *- `O(1)`. + */ + vested_transfer: TxDescriptor>; + /** + *Force a vested transfer. + * + *The dispatch origin for this call must be _Root_. + * + *- `source`: The account whose funds should be transferred. + *- `target`: The account that should be transferred the vested funds. + *- `schedule`: The vesting schedule attached to the transfer. + * + *Emits `VestingCreated`. + * + *NOTE: This will unlock all schedules through the current block. + * + *## Complexity + *- `O(1)`. + */ + force_vested_transfer: TxDescriptor>; + /** + *Merge two vesting schedules together, creating a new vesting schedule that unlocks over + *the highest possible start and end blocks. If both schedules have already started the + *current block will be used as the schedule start; with the caveat that if one schedule + *is finished by the current block, the other will be treated as the new merged schedule, + *unmodified. + * + *NOTE: If `schedule1_index == schedule2_index` this is a no-op. + *NOTE: This will unlock all schedules through the current block prior to merging. + *NOTE: If both schedules have ended by the current block, no new schedule will be created + *and both will be removed. + * + *Merged schedule attributes: + *- `starting_block`: `MAX(schedule1.starting_block, scheduled2.starting_block, + * current_block)`. + *- `ending_block`: `MAX(schedule1.ending_block, schedule2.ending_block)`. + *- `locked`: `schedule1.locked_at(current_block) + schedule2.locked_at(current_block)`. + * + *The dispatch origin for this call must be _Signed_. + * + *- `schedule1_index`: index of the first schedule to merge. + *- `schedule2_index`: index of the second schedule to merge. + */ + merge_schedules: TxDescriptor>; + /** + *Force remove a vesting schedule + * + *The dispatch origin for this call must be _Root_. + * + *- `target`: An account that has a vesting schedule + *- `schedule_index`: The vesting schedule index that should be removed + */ + force_remove_vesting_schedule: TxDescriptor>; + }; + Scheduler: { + /** + *Anonymously schedule a task. + */ + schedule: TxDescriptor>; + /** + *Cancel an anonymously scheduled task. + */ + cancel: TxDescriptor>; + /** + *Schedule a named task. + */ + schedule_named: TxDescriptor>; + /** + *Cancel a named scheduled task. + */ + cancel_named: TxDescriptor>; + /** + *Anonymously schedule a task after a delay. + */ + schedule_after: TxDescriptor>; + /** + *Schedule a named task after a delay. + */ + schedule_named_after: TxDescriptor>; + /** + *Set a retry configuration for a task so that, in case its scheduled run fails, it will + *be retried after `period` blocks, for a total amount of `retries` retries or until it + *succeeds. + * + *Tasks which need to be scheduled for a retry are still subject to weight metering and + *agenda space, same as a regular task. If a periodic task fails, it will be scheduled + *normally while the task is retrying. + * + *Tasks scheduled as a result of a retry for a periodic task are unnamed, non-periodic + *clones of the original task. Their retry configuration will be derived from the + *original task's configuration, but will have a lower value for `remaining` than the + *original `total_retries`. + */ + set_retry: TxDescriptor>; + /** + *Set a retry configuration for a named task so that, in case its scheduled run fails, it + *will be retried after `period` blocks, for a total amount of `retries` retries or until + *it succeeds. + * + *Tasks which need to be scheduled for a retry are still subject to weight metering and + *agenda space, same as a regular task. If a periodic task fails, it will be scheduled + *normally while the task is retrying. + * + *Tasks scheduled as a result of a retry for a periodic task are unnamed, non-periodic + *clones of the original task. Their retry configuration will be derived from the + *original task's configuration, but will have a lower value for `remaining` than the + *original `total_retries`. + */ + set_retry_named: TxDescriptor>; + /** + *Removes the retry configuration of a task. + */ + cancel_retry: TxDescriptor>; + /** + *Cancel the retry configuration of a named task. + */ + cancel_retry_named: TxDescriptor>; + }; + Preimage: { + /** + *Register a preimage on-chain. + * + *If the preimage was previously requested, no fees or deposits are taken for providing + *the preimage. Otherwise, a deposit is taken proportional to the size of the preimage. + */ + note_preimage: TxDescriptor>; + /** + *Clear an unrequested preimage from the runtime storage. + * + *If `len` is provided, then it will be a much cheaper operation. + * + *- `hash`: The hash of the preimage to be removed from the store. + *- `len`: The length of the preimage of `hash`. + */ + unnote_preimage: TxDescriptor>; + /** + *Request a preimage be uploaded to the chain without paying any fees or deposits. + * + *If the preimage requests has already been provided on-chain, we unreserve any deposit + *a user may have paid, and take the control of the preimage out of their hands. + */ + request_preimage: TxDescriptor>; + /** + *Clear a previously made request for a preimage. + * + *NOTE: THIS MUST NOT BE CALLED ON `hash` MORE TIMES THAN `request_preimage`. + */ + unrequest_preimage: TxDescriptor>; + /** + *Ensure that the bulk of pre-images is upgraded. + * + *The caller pays no fee if at least 90% of pre-images were successfully updated. + */ + ensure_updated: TxDescriptor>; + }; + Sudo: { + /** + *Authenticates the sudo key and dispatches a function call with `Root` origin. + */ + sudo: TxDescriptor>; + /** + *Authenticates the sudo key and dispatches a function call with `Root` origin. + *This function does not check the weight of the call, and instead allows the + *Sudo user to specify the weight of the call. + * + *The dispatch origin for this call must be _Signed_. + */ + sudo_unchecked_weight: TxDescriptor>; + /** + *Authenticates the current sudo key and sets the given AccountId (`new`) as the new sudo + *key. + */ + set_key: TxDescriptor>; + /** + *Authenticates the sudo key and dispatches a function call with `Signed` origin from + *a given account. + * + *The dispatch origin for this call must be _Signed_. + */ + sudo_as: TxDescriptor>; + /** + *Permanently removes the sudo key. + * + ***This cannot be un-done.** + */ + remove_key: TxDescriptor; + }; + Proxy: { + /** + *Dispatch the given `call` from an account that the sender is authorised for through + *`add_proxy`. + * + *The dispatch origin for this call must be _Signed_. + * + *Parameters: + *- `real`: The account that the proxy will make a call on behalf of. + *- `force_proxy_type`: Specify the exact proxy type to be used and checked for this call. + *- `call`: The call to be made by the `real` account. + */ + proxy: TxDescriptor>; + /** + *Register a proxy account for the sender that is able to make calls on its behalf. + * + *The dispatch origin for this call must be _Signed_. + * + *Parameters: + *- `proxy`: The account that the `caller` would like to make a proxy. + *- `proxy_type`: The permissions allowed for this proxy account. + *- `delay`: The announcement period required of the initial proxy. Will generally be + *zero. + */ + add_proxy: TxDescriptor>; + /** + *Unregister a proxy account for the sender. + * + *The dispatch origin for this call must be _Signed_. + * + *Parameters: + *- `proxy`: The account that the `caller` would like to remove as a proxy. + *- `proxy_type`: The permissions currently enabled for the removed proxy account. + */ + remove_proxy: TxDescriptor>; + /** + *Unregister all proxy accounts for the sender. + * + *The dispatch origin for this call must be _Signed_. + * + *WARNING: This may be called on accounts created by `create_pure`, however if done, then + *the unreserved fees will be inaccessible. **All access to this account will be lost.** + */ + remove_proxies: TxDescriptor; + /** + *Spawn a fresh new account that is guaranteed to be otherwise inaccessible, and + *initialize it with a proxy of `proxy_type` for `origin` sender. + * + *Requires a `Signed` origin. + * + *- `proxy_type`: The type of the proxy that the sender will be registered as over the + *new account. This will almost always be the most permissive `ProxyType` possible to + *allow for maximum flexibility. + *- `index`: A disambiguation index, in case this is called multiple times in the same + *transaction (e.g. with `utility::batch`). Unless you're using `batch` you probably just + *want to use `0`. + *- `delay`: The announcement period required of the initial proxy. Will generally be + *zero. + * + *Fails with `Duplicate` if this has already been called in this transaction, from the + *same sender, with the same parameters. + * + *Fails if there are insufficient funds to pay for deposit. + */ + create_pure: TxDescriptor>; + /** + *Removes a previously spawned pure proxy. + * + *WARNING: **All access to this account will be lost.** Any funds held in it will be + *inaccessible. + * + *Requires a `Signed` origin, and the sender account must have been created by a call to + *`create_pure` with corresponding parameters. + * + *- `spawner`: The account that originally called `create_pure` to create this account. + *- `index`: The disambiguation index originally passed to `create_pure`. Probably `0`. + *- `proxy_type`: The proxy type originally passed to `create_pure`. + *- `height`: The height of the chain when the call to `create_pure` was processed. + *- `ext_index`: The extrinsic index in which the call to `create_pure` was processed. + * + *Fails with `NoPermission` in case the caller is not a previously created pure + *account whose `create_pure` call has corresponding parameters. + */ + kill_pure: TxDescriptor>; + /** + *Publish the hash of a proxy-call that will be made in the future. + * + *This must be called some number of blocks before the corresponding `proxy` is attempted + *if the delay associated with the proxy relationship is greater than zero. + * + *No more than `MaxPending` announcements may be made at any one time. + * + *This will take a deposit of `AnnouncementDepositFactor` as well as + *`AnnouncementDepositBase` if there are no other pending announcements. + * + *The dispatch origin for this call must be _Signed_ and a proxy of `real`. + * + *Parameters: + *- `real`: The account that the proxy will make a call on behalf of. + *- `call_hash`: The hash of the call to be made by the `real` account. + */ + announce: TxDescriptor>; + /** + *Remove a given announcement. + * + *May be called by a proxy account to remove a call they previously announced and return + *the deposit. + * + *The dispatch origin for this call must be _Signed_. + * + *Parameters: + *- `real`: The account that the proxy will make a call on behalf of. + *- `call_hash`: The hash of the call to be made by the `real` account. + */ + remove_announcement: TxDescriptor>; + /** + *Remove the given announcement of a delegate. + * + *May be called by a target (proxied) account to remove a call that one of their delegates + *(`delegate`) has announced they want to execute. The deposit is returned. + * + *The dispatch origin for this call must be _Signed_. + * + *Parameters: + *- `delegate`: The account that previously announced the call. + *- `call_hash`: The hash of the call to be made. + */ + reject_announcement: TxDescriptor>; + /** + *Dispatch the given `call` from an account that the sender is authorized for through + *`add_proxy`. + * + *Removes any corresponding announcement(s). + * + *The dispatch origin for this call must be _Signed_. + * + *Parameters: + *- `real`: The account that the proxy will make a call on behalf of. + *- `force_proxy_type`: Specify the exact proxy type to be used and checked for this call. + *- `call`: The call to be made by the `real` account. + */ + proxy_announced: TxDescriptor>; + /** + *Poke / Adjust deposits made for proxies and announcements based on current values. + *This can be used by accounts to possibly lower their locked amount. + * + *The dispatch origin for this call must be _Signed_. + * + *The transaction fee is waived if the deposit amount has changed. + * + *Emits `DepositPoked` if successful. + */ + poke_deposit: TxDescriptor; + }; + Multisig: { + /** + *Immediately dispatch a multi-signature call using a single approval from the caller. + * + *The dispatch origin for this call must be _Signed_. + * + *- `other_signatories`: The accounts (other than the sender) who are part of the + *multi-signature, but do not participate in the approval process. + *- `call`: The call to be executed. + * + *Result is equivalent to the dispatched result. + * + *## Complexity + *O(Z + C) where Z is the length of the call and C its execution weight. + */ + as_multi_threshold_1: TxDescriptor>; + /** + *Register approval for a dispatch to be made from a deterministic composite account if + *approved by a total of `threshold - 1` of `other_signatories`. + * + *If there are enough, then dispatch the call. + * + *Payment: `DepositBase` will be reserved if this is the first approval, plus + *`threshold` times `DepositFactor`. It is returned once this dispatch happens or + *is cancelled. + * + *The dispatch origin for this call must be _Signed_. + * + *- `threshold`: The total number of approvals for this dispatch before it is executed. + *- `other_signatories`: The accounts (other than the sender) who can approve this + *dispatch. May not be empty. + *- `maybe_timepoint`: If this is the first approval, then this must be `None`. If it is + *not the first approval, then it must be `Some`, with the timepoint (block number and + *transaction index) of the first approval transaction. + *- `call`: The call to be executed. + * + *NOTE: Unless this is the final approval, you will generally want to use + *`approve_as_multi` instead, since it only requires a hash of the call. + * + *Result is equivalent to the dispatched result if `threshold` is exactly `1`. Otherwise + *on success, result is `Ok` and the result from the interior call, if it was executed, + *may be found in the deposited `MultisigExecuted` event. + * + *## Complexity + *- `O(S + Z + Call)`. + *- Up to one balance-reserve or unreserve operation. + *- One passthrough operation, one insert, both `O(S)` where `S` is the number of + * signatories. `S` is capped by `MaxSignatories`, with weight being proportional. + *- One call encode & hash, both of complexity `O(Z)` where `Z` is tx-len. + *- One encode & hash, both of complexity `O(S)`. + *- Up to one binary search and insert (`O(logS + S)`). + *- I/O: 1 read `O(S)`, up to 1 mutate `O(S)`. Up to one remove. + *- One event. + *- The weight of the `call`. + *- Storage: inserts one item, value size bounded by `MaxSignatories`, with a deposit + * taken for its lifetime of `DepositBase + threshold * DepositFactor`. + */ + as_multi: TxDescriptor>; + /** + *Register approval for a dispatch to be made from a deterministic composite account if + *approved by a total of `threshold - 1` of `other_signatories`. + * + *Payment: `DepositBase` will be reserved if this is the first approval, plus + *`threshold` times `DepositFactor`. It is returned once this dispatch happens or + *is cancelled. + * + *The dispatch origin for this call must be _Signed_. + * + *- `threshold`: The total number of approvals for this dispatch before it is executed. + *- `other_signatories`: The accounts (other than the sender) who can approve this + *dispatch. May not be empty. + *- `maybe_timepoint`: If this is the first approval, then this must be `None`. If it is + *not the first approval, then it must be `Some`, with the timepoint (block number and + *transaction index) of the first approval transaction. + *- `call_hash`: The hash of the call to be executed. + * + *NOTE: If this is the final approval, you will want to use `as_multi` instead. + * + *## Complexity + *- `O(S)`. + *- Up to one balance-reserve or unreserve operation. + *- One passthrough operation, one insert, both `O(S)` where `S` is the number of + * signatories. `S` is capped by `MaxSignatories`, with weight being proportional. + *- One encode & hash, both of complexity `O(S)`. + *- Up to one binary search and insert (`O(logS + S)`). + *- I/O: 1 read `O(S)`, up to 1 mutate `O(S)`. Up to one remove. + *- One event. + *- Storage: inserts one item, value size bounded by `MaxSignatories`, with a deposit + * taken for its lifetime of `DepositBase + threshold * DepositFactor`. + */ + approve_as_multi: TxDescriptor>; + /** + *Cancel a pre-existing, on-going multisig transaction. Any deposit reserved previously + *for this operation will be unreserved on success. + * + *The dispatch origin for this call must be _Signed_. + * + *- `threshold`: The total number of approvals for this dispatch before it is executed. + *- `other_signatories`: The accounts (other than the sender) who can approve this + *dispatch. May not be empty. + *- `timepoint`: The timepoint (block number and transaction index) of the first approval + *transaction for this dispatch. + *- `call_hash`: The hash of the call to be executed. + * + *## Complexity + *- `O(S)`. + *- Up to one balance-reserve or unreserve operation. + *- One passthrough operation, one insert, both `O(S)` where `S` is the number of + * signatories. `S` is capped by `MaxSignatories`, with weight being proportional. + *- One encode & hash, both of complexity `O(S)`. + *- One event. + *- I/O: 1 read `O(S)`, one remove. + *- Storage: removes one item. + */ + cancel_as_multi: TxDescriptor>; + /** + *Poke the deposit reserved for an existing multisig operation. + * + *The dispatch origin for this call must be _Signed_ and must be the original depositor of + *the multisig operation. + * + *The transaction fee is waived if the deposit amount has changed. + * + *- `threshold`: The total number of approvals needed for this multisig. + *- `other_signatories`: The accounts (other than the sender) who are part of the + * multisig. + *- `call_hash`: The hash of the call this deposit is reserved for. + * + *Emits `DepositPoked` if successful. + */ + poke_deposit: TxDescriptor>; + }; + ElectionProviderMultiPhase: { + /** + *Submit a solution for the unsigned phase. + * + *The dispatch origin fo this call must be __none__. + * + *This submission is checked on the fly. Moreover, this unsigned solution is only + *validated when submitted to the pool from the **local** node. Effectively, this means + *that only active validators can submit this transaction when authoring a block (similar + *to an inherent). + * + *To prevent any incorrect solution (and thus wasted time/weight), this transaction will + *panic if the solution submitted by the validator is invalid in any way, effectively + *putting their authoring reward at risk. + * + *No deposit or reward is associated with this submission. + */ + submit_unsigned: TxDescriptor>; + /** + *Set a new value for `MinimumUntrustedScore`. + * + *Dispatch origin must be aligned with `T::ForceOrigin`. + * + *This check can be turned off by setting the value to `None`. + */ + set_minimum_untrusted_score: TxDescriptor>; + /** + *Set a solution in the queue, to be handed out to the client of this pallet in the next + *call to `ElectionProvider::elect`. + * + *This can only be set by `T::ForceOrigin`, and only when the phase is `Emergency`. + * + *The solution is not checked for any feasibility and is assumed to be trustworthy, as any + *feasibility check itself can in principle cause the election process to fail (due to + *memory/weight constrains). + */ + set_emergency_election_result: TxDescriptor>; + /** + *Submit a solution for the signed phase. + * + *The dispatch origin fo this call must be __signed__. + * + *The solution is potentially queued, based on the claimed score and processed at the end + *of the signed phase. + * + *A deposit is reserved and recorded for the solution. Based on the outcome, the solution + *might be rewarded, slashed, or get all or a part of the deposit back. + */ + submit: TxDescriptor>; + /** + *Trigger the governance fallback. + * + *This can only be called when [`Phase::Emergency`] is enabled, as an alternative to + *calling [`Call::set_emergency_election_result`]. + */ + governance_fallback: TxDescriptor; + }; + VoterList: { + /** + *Declare that some `dislocated` account has, through rewards or penalties, sufficiently + *changed its score that it should properly fall into a different bag than its current + *one. + * + *Anyone can call this function about any potentially dislocated account. + * + *Will always update the stored score of `dislocated` to the correct score, based on + *`ScoreProvider`. + * + *If `dislocated` does not exists, it returns an error. + */ + rebag: TxDescriptor>; + /** + *Move the caller's Id directly in front of `lighter`. + * + *The dispatch origin for this call must be _Signed_ and can only be called by the Id of + *the account going in front of `lighter`. Fee is payed by the origin under all + *circumstances. + * + *Only works if: + * + *- both nodes are within the same bag, + *- and `origin` has a greater `Score` than `lighter`. + */ + put_in_front_of: TxDescriptor>; + /** + *Same as [`Pallet::put_in_front_of`], but it can be called by anyone. + * + *Fee is paid by the origin under all circumstances. + */ + put_in_front_of_other: TxDescriptor>; + }; + NominationPools: { + /** + *Stake funds with a pool. The amount to bond is delegated (or transferred based on + *[`adapter::StakeStrategyType`]) from the member to the pool account and immediately + *increases the pool's bond. + * + *The method of transferring the amount to the pool account is determined by + *[`adapter::StakeStrategyType`]. If the pool is configured to use + *[`adapter::StakeStrategyType::Delegate`], the funds remain in the account of + *the `origin`, while the pool gains the right to use these funds for staking. + * + *# Note + * + ** An account can only be a member of a single pool. + ** An account cannot join the same pool multiple times. + ** This call will *not* dust the member account, so the member must have at least + * `existential deposit + amount` in their account. + ** Only a pool with [`PoolState::Open`] can be joined + */ + join: TxDescriptor>; + /** + *Bond `extra` more funds from `origin` into the pool to which they already belong. + * + *Additional funds can come from either the free balance of the account, of from the + *accumulated rewards, see [`BondExtra`]. + * + *Bonding extra funds implies an automatic payout of all pending rewards as well. + *See `bond_extra_other` to bond pending rewards of `other` members. + */ + bond_extra: TxDescriptor>; + /** + *A bonded member can use this to claim their payout based on the rewards that the pool + *has accumulated since their last claimed payout (OR since joining if this is their first + *time claiming rewards). The payout will be transferred to the member's account. + * + *The member will earn rewards pro rata based on the members stake vs the sum of the + *members in the pools stake. Rewards do not "expire". + * + *See `claim_payout_other` to claim rewards on behalf of some `other` pool member. + */ + claim_payout: TxDescriptor; + /** + *Unbond up to `unbonding_points` of the `member_account`'s funds from the pool. It + *implicitly collects the rewards one last time, since not doing so would mean some + *rewards would be forfeited. + * + *Under certain conditions, this call can be dispatched permissionlessly (i.e. by any + *account). + * + *# Conditions for a permissionless dispatch. + * + ** The pool is blocked and the caller is either the root or bouncer. This is refereed to + * as a kick. + ** The pool is destroying and the member is not the depositor. + ** The pool is destroying, the member is the depositor and no other members are in the + * pool. + * + *## Conditions for permissioned dispatch (i.e. the caller is also the + *`member_account`): + * + ** The caller is not the depositor. + ** The caller is the depositor, the pool is destroying and no other members are in the + * pool. + * + *# Note + * + *If there are too many unlocking chunks to unbond with the pool account, + *[`Call::pool_withdraw_unbonded`] can be called to try and minimize unlocking chunks. + *The [`StakingInterface::unbond`] will implicitly call [`Call::pool_withdraw_unbonded`] + *to try to free chunks if necessary (ie. if unbound was called and no unlocking chunks + *are available). However, it may not be possible to release the current unlocking chunks, + *in which case, the result of this call will likely be the `NoMoreChunks` error from the + *staking system. + */ + unbond: TxDescriptor>; + /** + *Call `withdraw_unbonded` for the pools account. This call can be made by any account. + * + *This is useful if there are too many unlocking chunks to call `unbond`, and some + *can be cleared by withdrawing. In the case there are too many unlocking chunks, the user + *would probably see an error like `NoMoreChunks` emitted from the staking system when + *they attempt to unbond. + */ + pool_withdraw_unbonded: TxDescriptor>; + /** + *Withdraw unbonded funds from `member_account`. If no bonded funds can be unbonded, an + *error is returned. + * + *Under certain conditions, this call can be dispatched permissionlessly (i.e. by any + *account). + * + *# Conditions for a permissionless dispatch + * + ** The pool is in destroy mode and the target is not the depositor. + ** The target is the depositor and they are the only member in the sub pools. + ** The pool is blocked and the caller is either the root or bouncer. + * + *# Conditions for permissioned dispatch + * + ** The caller is the target and they are not the depositor. + * + *# Note + * + *- If the target is the depositor, the pool will be destroyed. + *- If the pool has any pending slash, we also try to slash the member before letting them + *withdraw. This calculation adds some weight overhead and is only defensive. In reality, + *pool slashes must have been already applied via permissionless [`Call::apply_slash`]. + */ + withdraw_unbonded: TxDescriptor>; + /** + *Create a new delegation pool. + * + *# Arguments + * + ** `amount` - The amount of funds to delegate to the pool. This also acts of a sort of + * deposit since the pools creator cannot fully unbond funds until the pool is being + * destroyed. + ** `index` - A disambiguation index for creating the account. Likely only useful when + * creating multiple pools in the same extrinsic. + ** `root` - The account to set as [`PoolRoles::root`]. + ** `nominator` - The account to set as the [`PoolRoles::nominator`]. + ** `bouncer` - The account to set as the [`PoolRoles::bouncer`]. + * + *# Note + * + *In addition to `amount`, the caller will transfer the existential deposit; so the caller + *needs at have at least `amount + existential_deposit` transferable. + */ + create: TxDescriptor>; + /** + *Create a new delegation pool with a previously used pool id + * + *# Arguments + * + *same as `create` with the inclusion of + ** `pool_id` - `A valid PoolId. + */ + create_with_pool_id: TxDescriptor>; + /** + *Nominate on behalf of the pool. + * + *The dispatch origin of this call must be signed by the pool nominator or the pool + *root role. + * + *This directly forwards the call to an implementation of `StakingInterface` (e.g., + *`pallet-staking`) through [`Config::StakeAdapter`], on behalf of the bonded pool. + * + *# Note + * + *In addition to a `root` or `nominator` role of `origin`, the pool's depositor needs to + *have at least `depositor_min_bond` in the pool to start nominating. + */ + nominate: TxDescriptor>; + /** + *Set a new state for the pool. + * + *If a pool is already in the `Destroying` state, then under no condition can its state + *change again. + * + *The dispatch origin of this call must be either: + * + *1. signed by the bouncer, or the root role of the pool, + *2. if the pool conditions to be open are NOT met (as described by `ok_to_be_open`), and + * then the state of the pool can be permissionlessly changed to `Destroying`. + */ + set_state: TxDescriptor>; + /** + *Set a new metadata for the pool. + * + *The dispatch origin of this call must be signed by the bouncer, or the root role of the + *pool. + */ + set_metadata: TxDescriptor>; + /** + *Update configurations for the nomination pools. The origin for this call must be + *[`Config::AdminOrigin`]. + * + *# Arguments + * + ** `min_join_bond` - Set [`MinJoinBond`]. + ** `min_create_bond` - Set [`MinCreateBond`]. + ** `max_pools` - Set [`MaxPools`]. + ** `max_members` - Set [`MaxPoolMembers`]. + ** `max_members_per_pool` - Set [`MaxPoolMembersPerPool`]. + ** `global_max_commission` - Set [`GlobalMaxCommission`]. + */ + set_configs: TxDescriptor>; + /** + *Update the roles of the pool. + * + *The root is the only entity that can change any of the roles, including itself, + *excluding the depositor, who can never change. + * + *It emits an event, notifying UIs of the role change. This event is quite relevant to + *most pool members and they should be informed of changes to pool roles. + */ + update_roles: TxDescriptor>; + /** + *Chill on behalf of the pool. + * + *The dispatch origin of this call can be signed by the pool nominator or the pool + *root role, same as [`Pallet::nominate`]. + * + *This directly forwards the call to an implementation of `StakingInterface` (e.g., + *`pallet-staking`) through [`Config::StakeAdapter`], on behalf of the bonded pool. + * + *Under certain conditions, this call can be dispatched permissionlessly (i.e. by any + *account). + * + *# Conditions for a permissionless dispatch: + ** When pool depositor has less than `MinNominatorBond` staked, otherwise pool members + * are unable to unbond. + * + *# Conditions for permissioned dispatch: + ** The caller is the pool's nominator or root. + */ + chill: TxDescriptor>; + /** + *`origin` bonds funds from `extra` for some pool member `member` into their respective + *pools. + * + *`origin` can bond extra funds from free balance or pending rewards when `origin == + *other`. + * + *In the case of `origin != other`, `origin` can only bond extra pending rewards of + *`other` members assuming set_claim_permission for the given member is + *`PermissionlessCompound` or `PermissionlessAll`. + */ + bond_extra_other: TxDescriptor>; + /** + *Allows a pool member to set a claim permission to allow or disallow permissionless + *bonding and withdrawing. + * + *# Arguments + * + ** `origin` - Member of a pool. + ** `permission` - The permission to be applied. + */ + set_claim_permission: TxDescriptor>; + /** + *`origin` can claim payouts on some pool member `other`'s behalf. + * + *Pool member `other` must have a `PermissionlessWithdraw` or `PermissionlessAll` claim + *permission for this call to be successful. + */ + claim_payout_other: TxDescriptor>; + /** + *Set the commission of a pool. + *Both a commission percentage and a commission payee must be provided in the `current` + *tuple. Where a `current` of `None` is provided, any current commission will be removed. + * + *- If a `None` is supplied to `new_commission`, existing commission will be removed. + */ + set_commission: TxDescriptor>; + /** + *Set the maximum commission of a pool. + * + *- Initial max can be set to any `Perbill`, and only smaller values thereafter. + *- Current commission will be lowered in the event it is higher than a new max + * commission. + */ + set_commission_max: TxDescriptor>; + /** + *Set the commission change rate for a pool. + * + *Initial change rate is not bounded, whereas subsequent updates can only be more + *restrictive than the current. + */ + set_commission_change_rate: TxDescriptor>; + /** + *Claim pending commission. + * + *The `root` role of the pool is _always_ allowed to claim the pool's commission. + * + *If the pool has set `CommissionClaimPermission::Permissionless`, then any account can + *trigger the process of claiming the pool's commission. + * + *If the pool has set its `CommissionClaimPermission` to `Account(acc)`, then only + *accounts + ** `acc`, and + ** the pool's root account + * + *may call this extrinsic on behalf of the pool. + * + *Pending commissions are paid out and added to the total claimed commission. + *The total pending commission is reset to zero. + */ + claim_commission: TxDescriptor>; + /** + *Top up the deficit or withdraw the excess ED from the pool. + * + *When a pool is created, the pool depositor transfers ED to the reward account of the + *pool. ED is subject to change and over time, the deposit in the reward account may be + *insufficient to cover the ED deficit of the pool or vice-versa where there is excess + *deposit to the pool. This call allows anyone to adjust the ED deposit of the + *pool by either topping up the deficit or claiming the excess. + */ + adjust_pool_deposit: TxDescriptor>; + /** + *Set or remove a pool's commission claim permission. + * + *Determines who can claim the pool's pending commission. Only the `Root` role of the pool + *is able to configure commission claim permissions. + */ + set_commission_claim_permission: TxDescriptor>; + /** + *Apply a pending slash on a member. + * + *Fails unless [`crate::pallet::Config::StakeAdapter`] is of strategy type: + *[`adapter::StakeStrategyType::Delegate`]. + * + *The pending slash amount of the member must be equal or more than `ExistentialDeposit`. + *This call can be dispatched permissionlessly (i.e. by any account). If the execution + *is successful, fee is refunded and caller may be rewarded with a part of the slash + *based on the [`crate::pallet::Config::StakeAdapter`] configuration. + */ + apply_slash: TxDescriptor>; + /** + *Migrates delegated funds from the pool account to the `member_account`. + * + *Fails unless [`crate::pallet::Config::StakeAdapter`] is of strategy type: + *[`adapter::StakeStrategyType::Delegate`]. + * + *This is a permission-less call and refunds any fee if claim is successful. + * + *If the pool has migrated to delegation based staking, the staked tokens of pool members + *can be moved and held in their own account. See [`adapter::DelegateStake`] + */ + migrate_delegation: TxDescriptor>; + /** + *Migrate pool from [`adapter::StakeStrategyType::Transfer`] to + *[`adapter::StakeStrategyType::Delegate`]. + * + *Fails unless [`crate::pallet::Config::StakeAdapter`] is of strategy type: + *[`adapter::StakeStrategyType::Delegate`]. + * + *This call can be dispatched permissionlessly, and refunds any fee if successful. + * + *If the pool has already migrated to delegation based staking, this call will fail. + */ + migrate_pool_to_delegate_stake: TxDescriptor>; + }; + FastUnstake: { + /** + *Register oneself for fast-unstake. + * + *## Dispatch Origin + * + *The dispatch origin of this call must be *signed* by whoever is permitted to call + *unbond funds by the staking system. See [`Config::Staking`]. + * + *## Details + * + *The stash associated with the origin must have no ongoing unlocking chunks. If + *successful, this will fully unbond and chill the stash. Then, it will enqueue the stash + *to be checked in further blocks. + * + *If by the time this is called, the stash is actually eligible for fast-unstake, then + *they are guaranteed to remain eligible, because the call will chill them as well. + * + *If the check works, the entire staking data is removed, i.e. the stash is fully + *unstaked. + * + *If the check fails, the stash remains chilled and waiting for being unbonded as in with + *the normal staking system, but they lose part of their unbonding chunks due to consuming + *the chain's resources. + * + *## Events + * + *Some events from the staking and currency system might be emitted. + */ + register_fast_unstake: TxDescriptor; + /** + *Deregister oneself from the fast-unstake. + * + *## Dispatch Origin + * + *The dispatch origin of this call must be *signed* by whoever is permitted to call + *unbond funds by the staking system. See [`Config::Staking`]. + * + *## Details + * + *This is useful if one is registered, they are still waiting, and they change their mind. + * + *Note that the associated stash is still fully unbonded and chilled as a consequence of + *calling [`Pallet::register_fast_unstake`]. Therefore, this should probably be followed + *by a call to `rebond` in the staking system. + * + *## Events + * + *Some events from the staking and currency system might be emitted. + */ + deregister: TxDescriptor; + /** + *Control the operation of this pallet. + * + *## Dispatch Origin + * + *The dispatch origin of this call must be [`Config::ControlOrigin`]. + * + *## Details + * + *Can set the number of eras to check per block, and potentially other admin work. + * + *## Events + * + *No events are emitted from this dispatch. + */ + control: TxDescriptor>; + }; + ConvictionVoting: { + /** + *Vote in a poll. If `vote.is_aye()`, the vote is to enact the proposal; + *otherwise it is a vote to keep the status quo. + * + *The dispatch origin of this call must be _Signed_. + * + *- `poll_index`: The index of the poll to vote for. + *- `vote`: The vote configuration. + * + *Weight: `O(R)` where R is the number of polls the voter has voted on. + */ + vote: TxDescriptor>; + /** + *Delegate the voting power (with some given conviction) of the sending account for a + *particular class of polls. + * + *The balance delegated is locked for as long as it's delegated, and thereafter for the + *time appropriate for the conviction's lock period. + * + *The dispatch origin of this call must be _Signed_, and the signing account must either: + * - be delegating already; or + * - have no voting activity (if there is, then it will need to be removed through + * `remove_vote`). + * + *- `to`: The account whose voting the `target` account's voting power will follow. + *- `class`: The class of polls to delegate. To delegate multiple classes, multiple calls + * to this function are required. + *- `conviction`: The conviction that will be attached to the delegated votes. When the + * account is undelegated, the funds will be locked for the corresponding period. + *- `balance`: The amount of the account's balance to be used in delegating. This must not + * be more than the account's current balance. + * + *Emits `Delegated`. + * + *Weight: `O(R)` where R is the number of polls the voter delegating to has + * voted on. Weight is initially charged as if maximum votes, but is refunded later. + */ + delegate: TxDescriptor>; + /** + *Undelegate the voting power of the sending account for a particular class of polls. + * + *Tokens may be unlocked following once an amount of time consistent with the lock period + *of the conviction with which the delegation was issued has passed. + * + *The dispatch origin of this call must be _Signed_ and the signing account must be + *currently delegating. + * + *- `class`: The class of polls to remove the delegation from. + * + *Emits `Undelegated`. + * + *Weight: `O(R)` where R is the number of polls the voter delegating to has + * voted on. Weight is initially charged as if maximum votes, but is refunded later. + */ + undelegate: TxDescriptor>; + /** + *Remove the lock caused by prior voting/delegating which has expired within a particular + *class. + * + *The dispatch origin of this call must be _Signed_. + * + *- `class`: The class of polls to unlock. + *- `target`: The account to remove the lock on. + * + *Weight: `O(R)` with R number of vote of target. + */ + unlock: TxDescriptor>; + /** + *Remove a vote for a poll. + * + *If: + *- the poll was cancelled, or + *- the poll is ongoing, or + *- the poll has ended such that + * - the vote of the account was in opposition to the result; or + * - there was no conviction to the account's vote; or + * - the account made a split vote + *...then the vote is removed cleanly and a following call to `unlock` may result in more + *funds being available. + * + *If, however, the poll has ended and: + *- it finished corresponding to the vote of the account, and + *- the account made a standard vote with conviction, and + *- the lock period of the conviction is not over + *...then the lock will be aggregated into the overall account's lock, which may involve + **overlocking* (where the two locks are combined into a single lock that is the maximum + *of both the amount locked and the time is it locked for). + * + *The dispatch origin of this call must be _Signed_, and the signer must have a vote + *registered for poll `index`. + * + *- `index`: The index of poll of the vote to be removed. + *- `class`: Optional parameter, if given it indicates the class of the poll. For polls + * which have finished or are cancelled, this must be `Some`. + * + *Weight: `O(R + log R)` where R is the number of polls that `target` has voted on. + * Weight is calculated for the maximum number of vote. + */ + remove_vote: TxDescriptor>; + /** + *Remove a vote for a poll. + * + *If the `target` is equal to the signer, then this function is exactly equivalent to + *`remove_vote`. If not equal to the signer, then the vote must have expired, + *either because the poll was cancelled, because the voter lost the poll or + *because the conviction period is over. + * + *The dispatch origin of this call must be _Signed_. + * + *- `target`: The account of the vote to be removed; this account must have voted for poll + * `index`. + *- `index`: The index of poll of the vote to be removed. + *- `class`: The class of the poll. + * + *Weight: `O(R + log R)` where R is the number of polls that `target` has voted on. + * Weight is calculated for the maximum number of vote. + */ + remove_other_vote: TxDescriptor>; + }; + Referenda: { + /** + *Propose a referendum on a privileged action. + * + *- `origin`: must be `SubmitOrigin` and the account must have `SubmissionDeposit` funds + * available. + *- `proposal_origin`: The origin from which the proposal should be executed. + *- `proposal`: The proposal. + *- `enactment_moment`: The moment that the proposal should be enacted. + * + *Emits `Submitted`. + */ + submit: TxDescriptor>; + /** + *Post the Decision Deposit for a referendum. + * + *- `origin`: must be `Signed` and the account must have funds available for the + * referendum's track's Decision Deposit. + *- `index`: The index of the submitted referendum whose Decision Deposit is yet to be + * posted. + * + *Emits `DecisionDepositPlaced`. + */ + place_decision_deposit: TxDescriptor>; + /** + *Refund the Decision Deposit for a closed referendum back to the depositor. + * + *- `origin`: must be `Signed` or `Root`. + *- `index`: The index of a closed referendum whose Decision Deposit has not yet been + * refunded. + * + *Emits `DecisionDepositRefunded`. + */ + refund_decision_deposit: TxDescriptor>; + /** + *Cancel an ongoing referendum. + * + *- `origin`: must be the `CancelOrigin`. + *- `index`: The index of the referendum to be cancelled. + * + *Emits `Cancelled`. + */ + cancel: TxDescriptor>; + /** + *Cancel an ongoing referendum and slash the deposits. + * + *- `origin`: must be the `KillOrigin`. + *- `index`: The index of the referendum to be cancelled. + * + *Emits `Killed` and `DepositSlashed`. + */ + kill: TxDescriptor>; + /** + *Advance a referendum onto its next logical state. Only used internally. + * + *- `origin`: must be `Root`. + *- `index`: the referendum to be advanced. + */ + nudge_referendum: TxDescriptor>; + /** + *Advance a track onto its next logical state. Only used internally. + * + *- `origin`: must be `Root`. + *- `track`: the track to be advanced. + * + *Action item for when there is now one fewer referendum in the deciding phase and the + *`DecidingCount` is not yet updated. This means that we should either: + *- begin deciding another referendum (and leave `DecidingCount` alone); or + *- decrement `DecidingCount`. + */ + one_fewer_deciding: TxDescriptor>; + /** + *Refund the Submission Deposit for a closed referendum back to the depositor. + * + *- `origin`: must be `Signed` or `Root`. + *- `index`: The index of a closed referendum whose Submission Deposit has not yet been + * refunded. + * + *Emits `SubmissionDepositRefunded`. + */ + refund_submission_deposit: TxDescriptor>; + /** + *Set or clear metadata of a referendum. + * + *Parameters: + *- `origin`: Must be `Signed` by a creator of a referendum or by anyone to clear a + * metadata of a finished referendum. + *- `index`: The index of a referendum to set or clear metadata for. + *- `maybe_hash`: The hash of an on-chain stored preimage. `None` to clear a metadata. + */ + set_metadata: TxDescriptor>; + }; + Whitelist: { + /** + + */ + whitelist_call: TxDescriptor>; + /** + + */ + remove_whitelisted_call: TxDescriptor>; + /** + + */ + dispatch_whitelisted_call: TxDescriptor>; + /** + + */ + dispatch_whitelisted_call_with_preimage: TxDescriptor>; + }; + Treasury: { + /** + *Propose and approve a spend of treasury funds. + * + *## Dispatch Origin + * + *Must be [`Config::SpendOrigin`] with the `Success` value being at least `amount`. + * + *### Details + *NOTE: For record-keeping purposes, the proposer is deemed to be equivalent to the + *beneficiary. + * + *### Parameters + *- `amount`: The amount to be transferred from the treasury to the `beneficiary`. + *- `beneficiary`: The destination account for the transfer. + * + *## Events + * + *Emits [`Event::SpendApproved`] if successful. + */ + spend_local: TxDescriptor>; + /** + *Force a previously approved proposal to be removed from the approval queue. + * + *## Dispatch Origin + * + *Must be [`Config::RejectOrigin`]. + * + *## Details + * + *The original deposit will no longer be returned. + * + *### Parameters + *- `proposal_id`: The index of a proposal + * + *### Complexity + *- O(A) where `A` is the number of approvals + * + *### Errors + *- [`Error::ProposalNotApproved`]: The `proposal_id` supplied was not found in the + * approval queue, i.e., the proposal has not been approved. This could also mean the + * proposal does not exist altogether, thus there is no way it would have been approved + * in the first place. + */ + remove_approval: TxDescriptor>; + /** + *Propose and approve a spend of treasury funds. + * + *## Dispatch Origin + * + *Must be [`Config::SpendOrigin`] with the `Success` value being at least + *`amount` of `asset_kind` in the native asset. The amount of `asset_kind` is converted + *for assertion using the [`Config::BalanceConverter`]. + * + *## Details + * + *Create an approved spend for transferring a specific `amount` of `asset_kind` to a + *designated beneficiary. The spend must be claimed using the `payout` dispatchable within + *the [`Config::PayoutPeriod`]. + * + *### Parameters + *- `asset_kind`: An indicator of the specific asset class to be spent. + *- `amount`: The amount to be transferred from the treasury to the `beneficiary`. + *- `beneficiary`: The beneficiary of the spend. + *- `valid_from`: The block number from which the spend can be claimed. It can refer to + * the past if the resulting spend has not yet expired according to the + * [`Config::PayoutPeriod`]. If `None`, the spend can be claimed immediately after + * approval. + * + *## Events + * + *Emits [`Event::AssetSpendApproved`] if successful. + */ + spend: TxDescriptor>; + /** + *Claim a spend. + * + *## Dispatch Origin + * + *Must be signed + * + *## Details + * + *Spends must be claimed within some temporal bounds. A spend may be claimed within one + *[`Config::PayoutPeriod`] from the `valid_from` block. + *In case of a payout failure, the spend status must be updated with the `check_status` + *dispatchable before retrying with the current function. + * + *### Parameters + *- `index`: The spend index. + * + *## Events + * + *Emits [`Event::Paid`] if successful. + */ + payout: TxDescriptor>; + /** + *Check the status of the spend and remove it from the storage if processed. + * + *## Dispatch Origin + * + *Must be signed. + * + *## Details + * + *The status check is a prerequisite for retrying a failed payout. + *If a spend has either succeeded or expired, it is removed from the storage by this + *function. In such instances, transaction fees are refunded. + * + *### Parameters + *- `index`: The spend index. + * + *## Events + * + *Emits [`Event::PaymentFailed`] if the spend payout has failed. + *Emits [`Event::SpendProcessed`] if the spend payout has succeed. + */ + check_status: TxDescriptor>; + /** + *Void previously approved spend. + * + *## Dispatch Origin + * + *Must be [`Config::RejectOrigin`]. + * + *## Details + * + *A spend void is only possible if the payout has not been attempted yet. + * + *### Parameters + *- `index`: The spend index. + * + *## Events + * + *Emits [`Event::AssetSpendVoided`] if successful. + */ + void_spend: TxDescriptor>; + }; + Configuration: { + /** + *Set the validation upgrade cooldown. + */ + set_validation_upgrade_cooldown: TxDescriptor>; + /** + *Set the validation upgrade delay. + */ + set_validation_upgrade_delay: TxDescriptor>; + /** + *Set the acceptance period for an included candidate. + */ + set_code_retention_period: TxDescriptor>; + /** + *Set the max validation code size for incoming upgrades. + */ + set_max_code_size: TxDescriptor>; + /** + *Set the max POV block size for incoming upgrades. + */ + set_max_pov_size: TxDescriptor>; + /** + *Set the max head data size for paras. + */ + set_max_head_data_size: TxDescriptor>; + /** + *Set the number of coretime execution cores. + * + *NOTE: that this configuration is managed by the coretime chain. Only manually change + *this, if you really know what you are doing! + */ + set_coretime_cores: TxDescriptor>; + /** + *Set the parachain validator-group rotation frequency + */ + set_group_rotation_frequency: TxDescriptor>; + /** + *Set the availability period for paras. + */ + set_paras_availability_period: TxDescriptor>; + /** + *Set the scheduling lookahead, in expected number of blocks at peak throughput. + */ + set_scheduling_lookahead: TxDescriptor>; + /** + *Set the maximum number of validators to assign to any core. + */ + set_max_validators_per_core: TxDescriptor>; + /** + *Set the maximum number of validators to use in parachain consensus. + */ + set_max_validators: TxDescriptor>; + /** + *Set the dispute period, in number of sessions to keep for disputes. + */ + set_dispute_period: TxDescriptor>; + /** + *Set the dispute post conclusion acceptance period. + */ + set_dispute_post_conclusion_acceptance_period: TxDescriptor>; + /** + *Set the no show slots, in number of number of consensus slots. + *Must be at least 1. + */ + set_no_show_slots: TxDescriptor>; + /** + *Set the total number of delay tranches. + */ + set_n_delay_tranches: TxDescriptor>; + /** + *Set the zeroth delay tranche width. + */ + set_zeroth_delay_tranche_width: TxDescriptor>; + /** + *Set the number of validators needed to approve a block. + */ + set_needed_approvals: TxDescriptor>; + /** + *Set the number of samples to do of the `RelayVRFModulo` approval assignment criterion. + */ + set_relay_vrf_modulo_samples: TxDescriptor>; + /** + *Sets the maximum items that can present in a upward dispatch queue at once. + */ + set_max_upward_queue_count: TxDescriptor>; + /** + *Sets the maximum total size of items that can present in a upward dispatch queue at + *once. + */ + set_max_upward_queue_size: TxDescriptor>; + /** + *Set the critical downward message size. + */ + set_max_downward_message_size: TxDescriptor>; + /** + *Sets the maximum size of an upward message that can be sent by a candidate. + */ + set_max_upward_message_size: TxDescriptor>; + /** + *Sets the maximum number of messages that a candidate can contain. + */ + set_max_upward_message_num_per_candidate: TxDescriptor>; + /** + *Sets the number of sessions after which an HRMP open channel request expires. + */ + set_hrmp_open_request_ttl: TxDescriptor>; + /** + *Sets the amount of funds that the sender should provide for opening an HRMP channel. + */ + set_hrmp_sender_deposit: TxDescriptor>; + /** + *Sets the amount of funds that the recipient should provide for accepting opening an HRMP + *channel. + */ + set_hrmp_recipient_deposit: TxDescriptor>; + /** + *Sets the maximum number of messages allowed in an HRMP channel at once. + */ + set_hrmp_channel_max_capacity: TxDescriptor>; + /** + *Sets the maximum total size of messages in bytes allowed in an HRMP channel at once. + */ + set_hrmp_channel_max_total_size: TxDescriptor>; + /** + *Sets the maximum number of inbound HRMP channels a parachain is allowed to accept. + */ + set_hrmp_max_parachain_inbound_channels: TxDescriptor>; + /** + *Sets the maximum size of a message that could ever be put into an HRMP channel. + */ + set_hrmp_channel_max_message_size: TxDescriptor>; + /** + *Sets the maximum number of outbound HRMP channels a parachain is allowed to open. + */ + set_hrmp_max_parachain_outbound_channels: TxDescriptor>; + /** + *Sets the maximum number of outbound HRMP messages can be sent by a candidate. + */ + set_hrmp_max_message_num_per_candidate: TxDescriptor>; + /** + *Set the number of session changes after which a PVF pre-checking voting is rejected. + */ + set_pvf_voting_ttl: TxDescriptor>; + /** + *Sets the minimum delay between announcing the upgrade block for a parachain until the + *upgrade taking place. + * + *See the field documentation for information and constraints for the new value. + */ + set_minimum_validation_upgrade_delay: TxDescriptor>; + /** + *Setting this to true will disable consistency checks for the configuration setters. + *Use with caution. + */ + set_bypass_consistency_check: TxDescriptor>; + /** + *Set the asynchronous backing parameters. + */ + set_async_backing_params: TxDescriptor>; + /** + *Set PVF executor parameters. + */ + set_executor_params: TxDescriptor>; + /** + *Set the on demand (parathreads) base fee. + */ + set_on_demand_base_fee: TxDescriptor>; + /** + *Set the on demand (parathreads) fee variability. + */ + set_on_demand_fee_variability: TxDescriptor>; + /** + *Set the on demand (parathreads) queue max size. + */ + set_on_demand_queue_max_size: TxDescriptor>; + /** + *Set the on demand (parathreads) fee variability. + */ + set_on_demand_target_queue_utilization: TxDescriptor>; + /** + *Set the minimum backing votes threshold. + */ + set_minimum_backing_votes: TxDescriptor>; + /** + *Set/Unset a node feature. + */ + set_node_feature: TxDescriptor>; + /** + *Set approval-voting-params. + */ + set_approval_voting_params: TxDescriptor>; + /** + *Set scheduler-params. + */ + set_scheduler_params: TxDescriptor>; + }; + ParaInherent: { + /** + *Enter the paras inherent. This will process bitfields and backed candidates. + */ + enter: TxDescriptor>; + }; + Paras: { + /** + *Set the storage for the parachain validation code immediately. + */ + force_set_current_code: TxDescriptor>; + /** + *Set the storage for the current parachain head data immediately. + */ + force_set_current_head: TxDescriptor>; + /** + *Schedule an upgrade as if it was scheduled in the given relay parent block. + */ + force_schedule_code_upgrade: TxDescriptor>; + /** + *Note a new block head for para within the context of the current block. + */ + force_note_new_head: TxDescriptor>; + /** + *Put a parachain directly into the next session's action queue. + *We can't queue it any sooner than this without going into the + *initializer... + */ + force_queue_action: TxDescriptor>; + /** + *Adds the validation code to the storage. + * + *The code will not be added if it is already present. Additionally, if PVF pre-checking + *is running for that code, it will be instantly accepted. + * + *Otherwise, the code will be added into the storage. Note that the code will be added + *into storage with reference count 0. This is to account the fact that there are no users + *for this code yet. The caller will have to make sure that this code eventually gets + *used by some parachain or removed from the storage to avoid storage leaks. For the + *latter prefer to use the `poke_unused_validation_code` dispatchable to raw storage + *manipulation. + * + *This function is mainly meant to be used for upgrading parachains that do not follow + *the go-ahead signal while the PVF pre-checking feature is enabled. + */ + add_trusted_validation_code: TxDescriptor>; + /** + *Remove the validation code from the storage iff the reference count is 0. + * + *This is better than removing the storage directly, because it will not remove the code + *that was suddenly got used by some parachain while this dispatchable was pending + *dispatching. + */ + poke_unused_validation_code: TxDescriptor>; + /** + *Includes a statement for a PVF pre-checking vote. Potentially, finalizes the vote and + *enacts the results if that was the last vote before achieving the supermajority. + */ + include_pvf_check_statement: TxDescriptor>; + /** + *Set the storage for the current parachain head data immediately. + */ + force_set_most_recent_context: TxDescriptor>; + /** + *Remove an upgrade cooldown for a parachain. + * + *The cost for removing the cooldown earlier depends on the time left for the cooldown + *multiplied by [`Config::CooldownRemovalMultiplier`]. The paid tokens are burned. + */ + remove_upgrade_cooldown: TxDescriptor>; + /** + *Sets the storage for the authorized current code hash of the parachain. + *If not applied, it will be removed at the `System::block_number() + valid_period` block. + * + *This can be useful, when triggering `Paras::force_set_current_code(para, code)` + *from a different chain than the one where the `Paras` pallet is deployed. + * + *The main purpose is to avoid transferring the entire `code` Wasm blob between chains. + *Instead, we authorize `code_hash` with `root`, which can later be applied by + *`Paras::apply_authorized_force_set_current_code(para, code)` by anyone. + * + *Authorizations are stored in an **overwriting manner**. + */ + authorize_force_set_current_code_hash: TxDescriptor>; + /** + *Applies the already authorized current code for the parachain, + *triggering the same functionality as `force_set_current_code`. + */ + apply_authorized_force_set_current_code: TxDescriptor>; + }; + Initializer: { + /** + *Issue a signal to the consensus engine to forcibly act as though all parachain + *blocks in all relay chain blocks up to and including the given number in the current + *chain are valid and should be finalized. + */ + force_approve: TxDescriptor>; + }; + Hrmp: { + /** + *Initiate opening a channel from a parachain to a given recipient with given channel + *parameters. + * + *- `proposed_max_capacity` - specifies how many messages can be in the channel at once. + *- `proposed_max_message_size` - specifies the maximum size of the messages. + * + *These numbers are a subject to the relay-chain configuration limits. + * + *The channel can be opened only after the recipient confirms it and only on a session + *change. + */ + hrmp_init_open_channel: TxDescriptor>; + /** + *Accept a pending open channel request from the given sender. + * + *The channel will be opened only on the next session boundary. + */ + hrmp_accept_open_channel: TxDescriptor>; + /** + *Initiate unilateral closing of a channel. The origin must be either the sender or the + *recipient in the channel being closed. + * + *The closure can only happen on a session change. + */ + hrmp_close_channel: TxDescriptor>; + /** + *This extrinsic triggers the cleanup of all the HRMP storage items that a para may have. + *Normally this happens once per session, but this allows you to trigger the cleanup + *immediately for a specific parachain. + * + *Number of inbound and outbound channels for `para` must be provided as witness data. + * + *Origin must be the `ChannelManager`. + */ + force_clean_hrmp: TxDescriptor>; + /** + *Force process HRMP open channel requests. + * + *If there are pending HRMP open channel requests, you can use this function to process + *all of those requests immediately. + * + *Total number of opening channels must be provided as witness data. + * + *Origin must be the `ChannelManager`. + */ + force_process_hrmp_open: TxDescriptor>; + /** + *Force process HRMP close channel requests. + * + *If there are pending HRMP close channel requests, you can use this function to process + *all of those requests immediately. + * + *Total number of closing channels must be provided as witness data. + * + *Origin must be the `ChannelManager`. + */ + force_process_hrmp_close: TxDescriptor>; + /** + *This cancels a pending open channel request. It can be canceled by either of the sender + *or the recipient for that request. The origin must be either of those. + * + *The cancellation happens immediately. It is not possible to cancel the request if it is + *already accepted. + * + *Total number of open requests (i.e. `HrmpOpenChannelRequestsList`) must be provided as + *witness data. + */ + hrmp_cancel_open_request: TxDescriptor>; + /** + *Open a channel from a `sender` to a `recipient` `ParaId`. Although opened by governance, + *the `max_capacity` and `max_message_size` are still subject to the Relay Chain's + *configured limits. + * + *Expected use is when one (and only one) of the `ParaId`s involved in the channel is + *governed by the system, e.g. a system parachain. + * + *Origin must be the `ChannelManager`. + */ + force_open_hrmp_channel: TxDescriptor>; + /** + *Establish an HRMP channel between two system chains. If the channel does not already + *exist, the transaction fees will be refunded to the caller. The system does not take + *deposits for channels between system chains, and automatically sets the message number + *and size limits to the maximum allowed by the network's configuration. + * + *Arguments: + * + *- `sender`: A system chain, `ParaId`. + *- `recipient`: A system chain, `ParaId`. + * + *Any signed origin can call this function, but _both_ inputs MUST be system chains. If + *the channel does not exist yet, there is no fee. + */ + establish_system_channel: TxDescriptor>; + /** + *Update the deposits held for an HRMP channel to the latest `Configuration`. Channels + *with system chains do not require a deposit. + * + *Arguments: + * + *- `sender`: A chain, `ParaId`. + *- `recipient`: A chain, `ParaId`. + * + *Any signed origin can call this function. + */ + poke_channel_deposits: TxDescriptor>; + /** + *Establish a bidirectional HRMP channel between a parachain and a system chain. + * + *Arguments: + * + *- `target_system_chain`: A system chain, `ParaId`. + * + *The origin needs to be the parachain origin. + */ + establish_channel_with_system: TxDescriptor>; + }; + ParasDisputes: { + /** + + */ + force_unfreeze: TxDescriptor; + }; + ParasSlashing: { + /** + + */ + report_dispute_lost_unsigned: TxDescriptor>; + }; + OnDemandAssignmentProvider: { + /** + *Create a single on demand core order. + *Will use the spot price for the current block and will reap the account if needed. + * + *Parameters: + *- `origin`: The sender of the call, funds will be withdrawn from this account. + *- `max_amount`: The maximum balance to withdraw from the origin to place an order. + *- `para_id`: A `ParaId` the origin wants to provide blockspace for. + * + *Errors: + *- `InsufficientBalance`: from the Currency implementation + *- `QueueFull` + *- `SpotPriceHigherThanMaxAmount` + * + *Events: + *- `OnDemandOrderPlaced` + */ + place_order_allow_death: TxDescriptor>; + /** + *Same as the [`place_order_allow_death`](Self::place_order_allow_death) call , but with a + *check that placing the order will not reap the account. + * + *Parameters: + *- `origin`: The sender of the call, funds will be withdrawn from this account. + *- `max_amount`: The maximum balance to withdraw from the origin to place an order. + *- `para_id`: A `ParaId` the origin wants to provide blockspace for. + * + *Errors: + *- `InsufficientBalance`: from the Currency implementation + *- `QueueFull` + *- `SpotPriceHigherThanMaxAmount` + * + *Events: + *- `OnDemandOrderPlaced` + */ + place_order_keep_alive: TxDescriptor>; + /** + *Create a single on demand core order with credits. + *Will charge the owner's on-demand credit account the spot price for the current block. + * + *Parameters: + *- `origin`: The sender of the call, on-demand credits will be withdrawn from this + * account. + *- `max_amount`: The maximum number of credits to spend from the origin to place an + * order. + *- `para_id`: A `ParaId` the origin wants to provide blockspace for. + * + *Errors: + *- `InsufficientCredits` + *- `QueueFull` + *- `SpotPriceHigherThanMaxAmount` + * + *Events: + *- `OnDemandOrderPlaced` + */ + place_order_with_credits: TxDescriptor>; + }; + Registrar: { + /** + *Register head data and validation code for a reserved Para Id. + * + *## Arguments + *- `origin`: Must be called by a `Signed` origin. + *- `id`: The para ID. Must be owned/managed by the `origin` signing account. + *- `genesis_head`: The genesis head data of the parachain/thread. + *- `validation_code`: The initial validation code of the parachain/thread. + * + *## Deposits/Fees + *The account with the originating signature must reserve a deposit. + * + *The deposit is required to cover the costs associated with storing the genesis head + *data and the validation code. + *This accounts for the potential to store validation code of a size up to the + *`max_code_size`, as defined in the configuration pallet + * + *Anything already reserved previously for this para ID is accounted for. + * + *## Events + *The `Registered` event is emitted in case of success. + */ + register: TxDescriptor>; + /** + *Force the registration of a Para Id on the relay chain. + * + *This function must be called by a Root origin. + * + *The deposit taken can be specified for this registration. Any `ParaId` + *can be registered, including sub-1000 IDs which are System Parachains. + */ + force_register: TxDescriptor>; + /** + *Deregister a Para Id, freeing all data and returning any deposit. + * + *The caller must be Root, the `para` owner, or the `para` itself. The para must be an + *on-demand parachain. + */ + deregister: TxDescriptor>; + /** + *Swap a lease holding parachain with another parachain, either on-demand or lease + *holding. + * + *The origin must be Root, the `para` owner, or the `para` itself. + * + *The swap will happen only if there is already an opposite swap pending. If there is not, + *the swap will be stored in the pending swaps map, ready for a later confirmatory swap. + * + *The `ParaId`s remain mapped to the same head data and code so external code can rely on + *`ParaId` to be a long-term identifier of a notional "parachain". However, their + *scheduling info (i.e. whether they're an on-demand parachain or lease holding + *parachain), auction information and the auction deposit are switched. + */ + swap: TxDescriptor>; + /** + *Remove a manager lock from a para. This will allow the manager of a + *previously locked para to deregister or swap a para without using governance. + * + *Can only be called by the Root origin or the parachain. + */ + remove_lock: TxDescriptor>; + /** + *Reserve a Para Id on the relay chain. + * + *This function will reserve a new Para Id to be owned/managed by the origin account. + *The origin account is able to register head data and validation code using `register` to + *create an on-demand parachain. Using the Slots pallet, an on-demand parachain can then + *be upgraded to a lease holding parachain. + * + *## Arguments + *- `origin`: Must be called by a `Signed` origin. Becomes the manager/owner of the new + * para ID. + * + *## Deposits/Fees + *The origin must reserve a deposit of `ParaDeposit` for the registration. + * + *## Events + *The `Reserved` event is emitted in case of success, which provides the ID reserved for + *use. + */ + reserve: TxDescriptor; + /** + *Add a manager lock from a para. This will prevent the manager of a + *para to deregister or swap a para. + * + *Can be called by Root, the parachain, or the parachain manager if the parachain is + *unlocked. + */ + add_lock: TxDescriptor>; + /** + *Schedule a parachain upgrade. + * + *This will kick off a check of `new_code` by all validators. After the majority of the + *validators have reported on the validity of the code, the code will either be enacted + *or the upgrade will be rejected. If the code will be enacted, the current code of the + *parachain will be overwritten directly. This means that any PoV will be checked by this + *new code. The parachain itself will not be informed explicitly that the validation code + *has changed. + * + *Can be called by Root, the parachain, or the parachain manager if the parachain is + *unlocked. + */ + schedule_code_upgrade: TxDescriptor>; + /** + *Set the parachain's current head. + * + *Can be called by Root, the parachain, or the parachain manager if the parachain is + *unlocked. + */ + set_current_head: TxDescriptor>; + }; + Slots: { + /** + *Just a connect into the `lease_out` call, in case Root wants to force some lease to + *happen independently of any other on-chain mechanism to use it. + * + *The dispatch origin for this call must match `T::ForceOrigin`. + */ + force_lease: TxDescriptor>; + /** + *Clear all leases for a Para Id, refunding any deposits back to the original owners. + * + *The dispatch origin for this call must match `T::ForceOrigin`. + */ + clear_all_leases: TxDescriptor>; + /** + *Try to onboard a parachain that has a lease for the current lease period. + * + *This function can be useful if there was some state issue with a para that should + *have onboarded, but was unable to. As long as they have a lease period, we can + *let them onboard from here. + * + *Origin must be signed, but can be called by anyone. + */ + trigger_onboard: TxDescriptor>; + }; + ParasSudoWrapper: { + /** + *Schedule a para to be initialized at the start of the next session. + * + *This should only be used for TESTING and not on PRODUCTION chains. It automatically + *assigns Coretime to the chain and increases the number of cores. Thus, there is no + *running coretime chain required. + */ + sudo_schedule_para_initialize: TxDescriptor>; + /** + *Schedule a para to be cleaned up at the start of the next session. + */ + sudo_schedule_para_cleanup: TxDescriptor>; + /** + *Upgrade a parathread (on-demand parachain) to a lease holding parachain + */ + sudo_schedule_parathread_upgrade: TxDescriptor>; + /** + *Downgrade a lease holding parachain to an on-demand parachain + */ + sudo_schedule_parachain_downgrade: TxDescriptor>; + /** + *Send a downward XCM to the given para. + * + *The given parachain should exist and the payload should not exceed the preconfigured + *size `config.max_downward_message_size`. + */ + sudo_queue_downward_xcm: TxDescriptor>; + /** + *Forcefully establish a channel from the sender to the recipient. + * + *This is equivalent to sending an `Hrmp::hrmp_init_open_channel` extrinsic followed by + *`Hrmp::hrmp_accept_open_channel`. + */ + sudo_establish_hrmp_channel: TxDescriptor>; + }; + Auctions: { + /** + *Create a new auction. + * + *This can only happen when there isn't already an auction in progress and may only be + *called by the root origin. Accepts the `duration` of this auction and the + *`lease_period_index` of the initial lease period of the four that are to be auctioned. + */ + new_auction: TxDescriptor>; + /** + *Make a new bid from an account (including a parachain account) for deploying a new + *parachain. + * + *Multiple simultaneous bids from the same bidder are allowed only as long as all active + *bids overlap each other (i.e. are mutually exclusive). Bids cannot be redacted. + * + *- `sub` is the sub-bidder ID, allowing for multiple competing bids to be made by (and + *funded by) the same account. + *- `auction_index` is the index of the auction to bid on. Should just be the present + *value of `AuctionCounter`. + *- `first_slot` is the first lease period index of the range to bid on. This is the + *absolute lease period index value, not an auction-specific offset. + *- `last_slot` is the last lease period index of the range to bid on. This is the + *absolute lease period index value, not an auction-specific offset. + *- `amount` is the amount to bid to be held as deposit for the parachain should the + *bid win. This amount is held throughout the range. + */ + bid: TxDescriptor>; + /** + *Cancel an in-progress auction. + * + *Can only be called by Root origin. + */ + cancel_auction: TxDescriptor; + }; + Crowdloan: { + /** + *Create a new crowdloaning campaign for a parachain slot with the given lease period + *range. + * + *This applies a lock to your parachain configuration, ensuring that it cannot be changed + *by the parachain manager. + */ + create: TxDescriptor>; + /** + *Contribute to a crowd sale. This will transfer some balance over to fund a parachain + *slot. It will be withdrawable when the crowdloan has ended and the funds are unused. + */ + contribute: TxDescriptor>; + /** + *Withdraw full balance of a specific contributor. + * + *Origin must be signed, but can come from anyone. + * + *The fund must be either in, or ready for, retirement. For a fund to be *in* retirement, + *then the retirement flag must be set. For a fund to be ready for retirement, then: + *- it must not already be in retirement; + *- the amount of raised funds must be bigger than the _free_ balance of the account; + *- and either: + * - the block number must be at least `end`; or + * - the current lease period must be greater than the fund's `last_period`. + * + *In this case, the fund's retirement flag is set and its `end` is reset to the current + *block number. + * + *- `who`: The account whose contribution should be withdrawn. + *- `index`: The parachain to whose crowdloan the contribution was made. + */ + withdraw: TxDescriptor>; + /** + *Automatically refund contributors of an ended crowdloan. + *Due to weight restrictions, this function may need to be called multiple + *times to fully refund all users. We will refund `RemoveKeysLimit` users at a time. + * + *Origin must be signed, but can come from anyone. + */ + refund: TxDescriptor>; + /** + *Remove a fund after the retirement period has ended and all funds have been returned. + */ + dissolve: TxDescriptor>; + /** + *Edit the configuration for an in-progress crowdloan. + * + *Can only be called by Root origin. + */ + edit: TxDescriptor>; + /** + *Add an optional memo to an existing crowdloan contribution. + * + *Origin must be Signed, and the user must have contributed to the crowdloan. + */ + add_memo: TxDescriptor>; + /** + *Poke the fund into `NewRaise` + * + *Origin must be Signed, and the fund has non-zero raise. + */ + poke: TxDescriptor>; + /** + *Contribute your entire balance to a crowd sale. This will transfer the entire balance of + *a user over to fund a parachain slot. It will be withdrawable when the crowdloan has + *ended and the funds are unused. + */ + contribute_all: TxDescriptor>; + }; + AssignedSlots: { + /** + *Assign a permanent parachain slot and immediately create a lease for it. + */ + assign_perm_parachain_slot: TxDescriptor>; + /** + *Assign a temporary parachain slot. The function tries to create a lease for it + *immediately if `SlotLeasePeriodStart::Current` is specified, and if the number + *of currently active temporary slots is below `MaxTemporarySlotPerLeasePeriod`. + */ + assign_temp_parachain_slot: TxDescriptor>; + /** + *Unassign a permanent or temporary parachain slot + */ + unassign_parachain_slot: TxDescriptor>; + /** + *Sets the storage value [`MaxPermanentSlots`]. + */ + set_max_permanent_slots: TxDescriptor>; + /** + *Sets the storage value [`MaxTemporarySlots`]. + */ + set_max_temporary_slots: TxDescriptor>; + }; + Coretime: { + /** + *Request the configuration to be updated with the specified number of cores. Warning: + *Since this only schedules a configuration update, it takes two sessions to come into + *effect. + * + *- `origin`: Root or the Coretime Chain + *- `count`: total number of cores + */ + request_core_count: TxDescriptor>; + /** + *Request to claim the instantaneous coretime sales revenue starting from the block it was + *last claimed until and up to the block specified. The claimed amount value is sent back + *to the Coretime chain in a `notify_revenue` message. At the same time, the amount is + *teleported to the Coretime chain. + */ + request_revenue_at: TxDescriptor>; + /** + + */ + credit_account: TxDescriptor>; + /** + *Receive instructions from the `ExternalBrokerOrigin`, detailing how a specific core is + *to be used. + * + *Parameters: + *-`origin`: The `ExternalBrokerOrigin`, assumed to be the coretime chain. + *-`core`: The core that should be scheduled. + *-`begin`: The starting blockheight of the instruction. + *-`assignment`: How the blockspace should be utilised. + *-`end_hint`: An optional hint as to when this particular set of instructions will end. + */ + assign_core: TxDescriptor>; + }; + StakingAhClient: { + /** + + */ + validator_set: TxDescriptor>; + /** + *Allows governance to force set the operating mode of the pallet. + */ + set_mode: TxDescriptor>; + /** + *manually do what this pallet was meant to do at the end of the migration. + */ + force_on_migration_end: TxDescriptor; + }; + MultiBlockMigrations: { + /** + *Allows root to set a cursor to forcefully start, stop or forward the migration process. + * + *Should normally not be needed and is only in place as emergency measure. Note that + *restarting the migration process in this manner will not call the + *[`MigrationStatusHandler::started`] hook or emit an `UpgradeStarted` event. + */ + force_set_cursor: TxDescriptor>; + /** + *Allows root to set an active cursor to forcefully start/forward the migration process. + * + *This is an edge-case version of [`Self::force_set_cursor`] that allows to set the + *`started_at` value to the next block number. Otherwise this would not be possible, since + *`force_set_cursor` takes an absolute block number. Setting `started_at` to `None` + *indicates that the current block number plus one should be used. + */ + force_set_active_cursor: TxDescriptor>; + /** + *Forces the onboarding of the migrations. + * + *This process happens automatically on a runtime upgrade. It is in place as an emergency + *measurement. The cursor needs to be `None` for this to succeed. + */ + force_onboard_mbms: TxDescriptor; + /** + *Clears the `Historic` set. + * + *`map_cursor` must be set to the last value that was returned by the + *`HistoricCleared` event. The first time `None` can be used. `limit` must be chosen in a + *way that will result in a sensible weight. + */ + clear_historic: TxDescriptor>; + }; + XcmPallet: { + /** + + */ + send: TxDescriptor>; + /** + *Teleport some assets from the local chain to some destination chain. + * + ***This function is deprecated: Use `limited_teleport_assets` instead.** + * + *Fee payment on the destination side is made from the asset in the `assets` vector of + *index `fee_asset_item`. The weight limit for fees is not provided and thus is unlimited, + *with all fees taken as needed from the asset. + * + *- `origin`: Must be capable of withdrawing the `assets` and executing XCM. + *- `dest`: Destination context for the assets. Will typically be `[Parent, + * Parachain(..)]` to send from parachain to parachain, or `[Parachain(..)]` to send from + * relay to parachain. + *- `beneficiary`: A beneficiary location for the assets in the context of `dest`. Will + * generally be an `AccountId32` value. + *- `assets`: The assets to be withdrawn. This should include the assets used to pay the + * fee on the `dest` chain. + *- `fee_asset_item`: The index into `assets` of the item which should be used to pay + * fees. + */ + teleport_assets: TxDescriptor>; + /** + *Transfer some assets from the local chain to the destination chain through their local, + *destination or remote reserve. + * + *`assets` must have same reserve location and may not be teleportable to `dest`. + * - `assets` have local reserve: transfer assets to sovereign account of destination + * chain and forward a notification XCM to `dest` to mint and deposit reserve-based + * assets to `beneficiary`. + * - `assets` have destination reserve: burn local assets and forward a notification to + * `dest` chain to withdraw the reserve assets from this chain's sovereign account and + * deposit them to `beneficiary`. + * - `assets` have remote reserve: burn local assets, forward XCM to reserve chain to move + * reserves from this chain's SA to `dest` chain's SA, and forward another XCM to `dest` + * to mint and deposit reserve-based assets to `beneficiary`. + * + ***This function is deprecated: Use `limited_reserve_transfer_assets` instead.** + * + *Fee payment on the destination side is made from the asset in the `assets` vector of + *index `fee_asset_item`. The weight limit for fees is not provided and thus is unlimited, + *with all fees taken as needed from the asset. + * + *- `origin`: Must be capable of withdrawing the `assets` and executing XCM. + *- `dest`: Destination context for the assets. Will typically be `[Parent, + * Parachain(..)]` to send from parachain to parachain, or `[Parachain(..)]` to send from + * relay to parachain. + *- `beneficiary`: A beneficiary location for the assets in the context of `dest`. Will + * generally be an `AccountId32` value. + *- `assets`: The assets to be withdrawn. This should include the assets used to pay the + * fee on the `dest` (and possibly reserve) chains. + *- `fee_asset_item`: The index into `assets` of the item which should be used to pay + * fees. + */ + reserve_transfer_assets: TxDescriptor>; + /** + *Execute an XCM message from a local, signed, origin. + * + *An event is deposited indicating whether `msg` could be executed completely or only + *partially. + * + *No more than `max_weight` will be used in its attempted execution. If this is less than + *the maximum amount of weight that the message could take to be executed, then no + *execution attempt will be made. + */ + execute: TxDescriptor>; + /** + *Extoll that a particular destination can be communicated with through a particular + *version of XCM. + * + *- `origin`: Must be an origin specified by AdminOrigin. + *- `location`: The destination that is being described. + *- `xcm_version`: The latest version of XCM that `location` supports. + */ + force_xcm_version: TxDescriptor>; + /** + *Set a safe XCM version (the version that XCM should be encoded with if the most recent + *version a destination can accept is unknown). + * + *- `origin`: Must be an origin specified by AdminOrigin. + *- `maybe_xcm_version`: The default XCM encoding version, or `None` to disable. + */ + force_default_xcm_version: TxDescriptor>; + /** + *Ask a location to notify us regarding their XCM version and any changes to it. + * + *- `origin`: Must be an origin specified by AdminOrigin. + *- `location`: The location to which we should subscribe for XCM version notifications. + */ + force_subscribe_version_notify: TxDescriptor>; + /** + *Require that a particular destination should no longer notify us regarding any XCM + *version changes. + * + *- `origin`: Must be an origin specified by AdminOrigin. + *- `location`: The location to which we are currently subscribed for XCM version + * notifications which we no longer desire. + */ + force_unsubscribe_version_notify: TxDescriptor>; + /** + *Transfer some assets from the local chain to the destination chain through their local, + *destination or remote reserve. + * + *`assets` must have same reserve location and may not be teleportable to `dest`. + * - `assets` have local reserve: transfer assets to sovereign account of destination + * chain and forward a notification XCM to `dest` to mint and deposit reserve-based + * assets to `beneficiary`. + * - `assets` have destination reserve: burn local assets and forward a notification to + * `dest` chain to withdraw the reserve assets from this chain's sovereign account and + * deposit them to `beneficiary`. + * - `assets` have remote reserve: burn local assets, forward XCM to reserve chain to move + * reserves from this chain's SA to `dest` chain's SA, and forward another XCM to `dest` + * to mint and deposit reserve-based assets to `beneficiary`. + * + *Fee payment on the destination side is made from the asset in the `assets` vector of + *index `fee_asset_item`, up to enough to pay for `weight_limit` of weight. If more weight + *is needed than `weight_limit`, then the operation will fail and the sent assets may be + *at risk. + * + *- `origin`: Must be capable of withdrawing the `assets` and executing XCM. + *- `dest`: Destination context for the assets. Will typically be `[Parent, + * Parachain(..)]` to send from parachain to parachain, or `[Parachain(..)]` to send from + * relay to parachain. + *- `beneficiary`: A beneficiary location for the assets in the context of `dest`. Will + * generally be an `AccountId32` value. + *- `assets`: The assets to be withdrawn. This should include the assets used to pay the + * fee on the `dest` (and possibly reserve) chains. + *- `fee_asset_item`: The index into `assets` of the item which should be used to pay + * fees. + *- `weight_limit`: The remote-side weight limit, if any, for the XCM fee purchase. + */ + limited_reserve_transfer_assets: TxDescriptor>; + /** + *Teleport some assets from the local chain to some destination chain. + * + *Fee payment on the destination side is made from the asset in the `assets` vector of + *index `fee_asset_item`, up to enough to pay for `weight_limit` of weight. If more weight + *is needed than `weight_limit`, then the operation will fail and the sent assets may be + *at risk. + * + *- `origin`: Must be capable of withdrawing the `assets` and executing XCM. + *- `dest`: Destination context for the assets. Will typically be `[Parent, + * Parachain(..)]` to send from parachain to parachain, or `[Parachain(..)]` to send from + * relay to parachain. + *- `beneficiary`: A beneficiary location for the assets in the context of `dest`. Will + * generally be an `AccountId32` value. + *- `assets`: The assets to be withdrawn. This should include the assets used to pay the + * fee on the `dest` chain. + *- `fee_asset_item`: The index into `assets` of the item which should be used to pay + * fees. + *- `weight_limit`: The remote-side weight limit, if any, for the XCM fee purchase. + */ + limited_teleport_assets: TxDescriptor>; + /** + *Set or unset the global suspension state of the XCM executor. + * + *- `origin`: Must be an origin specified by AdminOrigin. + *- `suspended`: `true` to suspend, `false` to resume. + */ + force_suspension: TxDescriptor>; + /** + *Transfer some assets from the local chain to the destination chain through their local, + *destination or remote reserve, or through teleports. + * + *Fee payment on the destination side is made from the asset in the `assets` vector of + *index `fee_asset_item` (hence referred to as `fees`), up to enough to pay for + *`weight_limit` of weight. If more weight is needed than `weight_limit`, then the + *operation will fail and the sent assets may be at risk. + * + *`assets` (excluding `fees`) must have same reserve location or otherwise be teleportable + *to `dest`, no limitations imposed on `fees`. + * - for local reserve: transfer assets to sovereign account of destination chain and + * forward a notification XCM to `dest` to mint and deposit reserve-based assets to + * `beneficiary`. + * - for destination reserve: burn local assets and forward a notification to `dest` chain + * to withdraw the reserve assets from this chain's sovereign account and deposit them + * to `beneficiary`. + * - for remote reserve: burn local assets, forward XCM to reserve chain to move reserves + * from this chain's SA to `dest` chain's SA, and forward another XCM to `dest` to mint + * and deposit reserve-based assets to `beneficiary`. + * - for teleports: burn local assets and forward XCM to `dest` chain to mint/teleport + * assets and deposit them to `beneficiary`. + * + *- `origin`: Must be capable of withdrawing the `assets` and executing XCM. + *- `dest`: Destination context for the assets. Will typically be `X2(Parent, + * Parachain(..))` to send from parachain to parachain, or `X1(Parachain(..))` to send + * from relay to parachain. + *- `beneficiary`: A beneficiary location for the assets in the context of `dest`. Will + * generally be an `AccountId32` value. + *- `assets`: The assets to be withdrawn. This should include the assets used to pay the + * fee on the `dest` (and possibly reserve) chains. + *- `fee_asset_item`: The index into `assets` of the item which should be used to pay + * fees. + *- `weight_limit`: The remote-side weight limit, if any, for the XCM fee purchase. + */ + transfer_assets: TxDescriptor>; + /** + *Claims assets trapped on this pallet because of leftover assets during XCM execution. + * + *- `origin`: Anyone can call this extrinsic. + *- `assets`: The exact assets that were trapped. Use the version to specify what version + *was the latest when they were trapped. + *- `beneficiary`: The location/account where the claimed assets will be deposited. + */ + claim_assets: TxDescriptor>; + /** + *Transfer assets from the local chain to the destination chain using explicit transfer + *types for assets and fees. + * + *`assets` must have same reserve location or may be teleportable to `dest`. Caller must + *provide the `assets_transfer_type` to be used for `assets`: + * - `TransferType::LocalReserve`: transfer assets to sovereign account of destination + * chain and forward a notification XCM to `dest` to mint and deposit reserve-based + * assets to `beneficiary`. + * - `TransferType::DestinationReserve`: burn local assets and forward a notification to + * `dest` chain to withdraw the reserve assets from this chain's sovereign account and + * deposit them to `beneficiary`. + * - `TransferType::RemoteReserve(reserve)`: burn local assets, forward XCM to `reserve` + * chain to move reserves from this chain's SA to `dest` chain's SA, and forward another + * XCM to `dest` to mint and deposit reserve-based assets to `beneficiary`. Typically + * the remote `reserve` is Asset Hub. + * - `TransferType::Teleport`: burn local assets and forward XCM to `dest` chain to + * mint/teleport assets and deposit them to `beneficiary`. + * + *On the destination chain, as well as any intermediary hops, `BuyExecution` is used to + *buy execution using transferred `assets` identified by `remote_fees_id`. + *Make sure enough of the specified `remote_fees_id` asset is included in the given list + *of `assets`. `remote_fees_id` should be enough to pay for `weight_limit`. If more weight + *is needed than `weight_limit`, then the operation will fail and the sent assets may be + *at risk. + * + *`remote_fees_id` may use different transfer type than rest of `assets` and can be + *specified through `fees_transfer_type`. + * + *The caller needs to specify what should happen to the transferred assets once they reach + *the `dest` chain. This is done through the `custom_xcm_on_dest` parameter, which + *contains the instructions to execute on `dest` as a final step. + * This is usually as simple as: + * `Xcm(vec![DepositAsset { assets: Wild(AllCounted(assets.len())), beneficiary }])`, + * but could be something more exotic like sending the `assets` even further. + * + *- `origin`: Must be capable of withdrawing the `assets` and executing XCM. + *- `dest`: Destination context for the assets. Will typically be `[Parent, + * Parachain(..)]` to send from parachain to parachain, or `[Parachain(..)]` to send from + * relay to parachain, or `(parents: 2, (GlobalConsensus(..), ..))` to send from + * parachain across a bridge to another ecosystem destination. + *- `assets`: The assets to be withdrawn. This should include the assets used to pay the + * fee on the `dest` (and possibly reserve) chains. + *- `assets_transfer_type`: The XCM `TransferType` used to transfer the `assets`. + *- `remote_fees_id`: One of the included `assets` to be used to pay fees. + *- `fees_transfer_type`: The XCM `TransferType` used to transfer the `fees` assets. + *- `custom_xcm_on_dest`: The XCM to be executed on `dest` chain as the last step of the + * transfer, which also determines what happens to the assets on the destination chain. + *- `weight_limit`: The remote-side weight limit, if any, for the XCM fee purchase. + */ + transfer_assets_using_type_and_then: TxDescriptor>; + /** + *Authorize another `aliaser` location to alias into the local `origin` making this call. + *The `aliaser` is only authorized until the provided `expiry` block number. + *The call can also be used for a previously authorized alias in order to update its + *`expiry` block number. + * + *Usually useful to allow your local account to be aliased into from a remote location + *also under your control (like your account on another chain). + * + *WARNING: make sure the caller `origin` (you) trusts the `aliaser` location to act in + *their/your name. Once authorized using this call, the `aliaser` can freely impersonate + *`origin` in XCM programs executed on the local chain. + */ + add_authorized_alias: TxDescriptor>; + /** + *Remove a previously authorized `aliaser` from the list of locations that can alias into + *the local `origin` making this call. + */ + remove_authorized_alias: TxDescriptor>; + /** + *Remove all previously authorized `aliaser`s that can alias into the local `origin` + *making this call. + */ + remove_all_authorized_aliases: TxDescriptor; + }; + MessageQueue: { + /** + *Remove a page which has no more messages remaining to be processed or is stale. + */ + reap_page: TxDescriptor>; + /** + *Execute an overweight message. + * + *Temporary processing errors will be propagated whereas permanent errors are treated + *as success condition. + * + *- `origin`: Must be `Signed`. + *- `message_origin`: The origin from which the message to be executed arrived. + *- `page`: The page in the queue in which the message to be executed is sitting. + *- `index`: The index into the queue of the message to be executed. + *- `weight_limit`: The maximum amount of weight allowed to be consumed in the execution + * of the message. + * + *Benchmark complexity considerations: O(index + weight_limit). + */ + execute_overweight: TxDescriptor>; + }; + AssetRate: { + /** + *Initialize a conversion rate to native balance for the given asset. + * + *## Complexity + *- O(1) + */ + create: TxDescriptor>; + /** + *Update the conversion rate to native balance for the given asset. + * + *## Complexity + *- O(1) + */ + update: TxDescriptor>; + /** + *Remove an existing conversion rate to native balance for the given asset. + * + *## Complexity + *- O(1) + */ + remove: TxDescriptor>; + }; + RootTesting: { + /** + *A dispatch that will fill the block weight up to the given ratio. + */ + fill_block: TxDescriptor>; + /** + + */ + trigger_defensive: TxDescriptor; + }; + MetaTx: { + /** + *Dispatch a given meta transaction. + * + *- `_origin`: Can be any kind of origin. + *- `meta_tx`: Meta Transaction with a target call to be dispatched. + */ + dispatch: TxDescriptor>; + }; + Beefy: { + /** + *Report voter equivocation/misbehavior. This method will verify the + *equivocation proof and validate the given key ownership proof + *against the extracted offender. If both are valid, the offence + *will be reported. + */ + report_double_voting: TxDescriptor>; + /** + *Report voter equivocation/misbehavior. This method will verify the + *equivocation proof and validate the given key ownership proof + *against the extracted offender. If both are valid, the offence + *will be reported. + * + *This extrinsic must be called unsigned and it is expected that only + *block authors will call it (validated in `ValidateUnsigned`), as such + *if the block author is defined it will be defined as the equivocation + *reporter. + */ + report_double_voting_unsigned: TxDescriptor>; + /** + *Reset BEEFY consensus by setting a new BEEFY genesis at `delay_in_blocks` blocks in the + *future. + * + *Note: `delay_in_blocks` has to be at least 1. + */ + set_new_genesis: TxDescriptor>; + /** + *Report fork voting equivocation. This method will verify the equivocation proof + *and validate the given key ownership proof against the extracted offender. + *If both are valid, the offence will be reported. + */ + report_fork_voting: TxDescriptor>; + /** + *Report fork voting equivocation. This method will verify the equivocation proof + *and validate the given key ownership proof against the extracted offender. + *If both are valid, the offence will be reported. + * + *This extrinsic must be called unsigned and it is expected that only + *block authors will call it (validated in `ValidateUnsigned`), as such + *if the block author is defined it will be defined as the equivocation + *reporter. + */ + report_fork_voting_unsigned: TxDescriptor>; + /** + *Report future block voting equivocation. This method will verify the equivocation proof + *and validate the given key ownership proof against the extracted offender. + *If both are valid, the offence will be reported. + */ + report_future_block_voting: TxDescriptor>; + /** + *Report future block voting equivocation. This method will verify the equivocation proof + *and validate the given key ownership proof against the extracted offender. + *If both are valid, the offence will be reported. + * + *This extrinsic must be called unsigned and it is expected that only + *block authors will call it (validated in `ValidateUnsigned`), as such + *if the block author is defined it will be defined as the equivocation + *reporter. + */ + report_future_block_voting_unsigned: TxDescriptor>; + }; + IdentityMigrator: { + /** + *Reap the `IdentityInfo` of `who` from the Identity pallet of `T`, unreserving any + *deposits held and removing storage items associated with `who`. + */ + reap_identity: TxDescriptor>; + /** + *Update the deposit of `who`. Meant to be called by the system with an XCM `Transact` + *Instruction. + */ + poke_deposit: TxDescriptor>; + }; +}; +type IEvent = { + System: { + /** + *An extrinsic completed successfully. + */ + ExtrinsicSuccess: PlainDescriptor>; + /** + *An extrinsic failed. + */ + ExtrinsicFailed: PlainDescriptor>; + /** + *`:code` was updated. + */ + CodeUpdated: PlainDescriptor; + /** + *A new account was created. + */ + NewAccount: PlainDescriptor>; + /** + *An account was reaped. + */ + KilledAccount: PlainDescriptor>; + /** + *On on-chain remark happened. + */ + Remarked: PlainDescriptor>; + /** + *An upgrade was authorized. + */ + UpgradeAuthorized: PlainDescriptor>; + /** + *An invalid authorized upgrade was rejected while trying to apply it. + */ + RejectedInvalidAuthorizedUpgrade: PlainDescriptor>; + }; + Indices: { + /** + *A account index was assigned. + */ + IndexAssigned: PlainDescriptor>; + /** + *A account index has been freed up (unassigned). + */ + IndexFreed: PlainDescriptor>; + /** + *A account index has been frozen to its current account ID. + */ + IndexFrozen: PlainDescriptor>; + /** + *A deposit to reserve an index has been poked/reconsidered. + */ + DepositPoked: PlainDescriptor>; + }; + Balances: { + /** + *An account was created with some free balance. + */ + Endowed: PlainDescriptor>; + /** + *An account was removed whose balance was non-zero but below ExistentialDeposit, + *resulting in an outright loss. + */ + DustLost: PlainDescriptor>; + /** + *Transfer succeeded. + */ + Transfer: PlainDescriptor>; + /** + *A balance was set by root. + */ + BalanceSet: PlainDescriptor>; + /** + *Some balance was reserved (moved from free to reserved). + */ + Reserved: PlainDescriptor>; + /** + *Some balance was unreserved (moved from reserved to free). + */ + Unreserved: PlainDescriptor>; + /** + *Some balance was moved from the reserve of the first account to the second account. + *Final argument indicates the destination balance type. + */ + ReserveRepatriated: PlainDescriptor>; + /** + *Some amount was deposited (e.g. for transaction fees). + */ + Deposit: PlainDescriptor>; + /** + *Some amount was withdrawn from the account (e.g. for transaction fees). + */ + Withdraw: PlainDescriptor>; + /** + *Some amount was removed from the account (e.g. for misbehavior). + */ + Slashed: PlainDescriptor>; + /** + *Some amount was minted into an account. + */ + Minted: PlainDescriptor>; + /** + *Some amount was burned from an account. + */ + Burned: PlainDescriptor>; + /** + *Some amount was suspended from an account (it can be restored later). + */ + Suspended: PlainDescriptor>; + /** + *Some amount was restored into an account. + */ + Restored: PlainDescriptor>; + /** + *An account was upgraded. + */ + Upgraded: PlainDescriptor>; + /** + *Total issuance was increased by `amount`, creating a credit to be balanced. + */ + Issued: PlainDescriptor>; + /** + *Total issuance was decreased by `amount`, creating a debt to be balanced. + */ + Rescinded: PlainDescriptor>; + /** + *Some balance was locked. + */ + Locked: PlainDescriptor>; + /** + *Some balance was unlocked. + */ + Unlocked: PlainDescriptor>; + /** + *Some balance was frozen. + */ + Frozen: PlainDescriptor>; + /** + *Some balance was thawed. + */ + Thawed: PlainDescriptor>; + /** + *The `TotalIssuance` was forcefully changed. + */ + TotalIssuanceForced: PlainDescriptor>; + }; + TransactionPayment: { + /** + *A transaction fee `actual_fee`, of which `tip` was added to the minimum inclusion fee, + *has been paid by `who`. + */ + TransactionFeePaid: PlainDescriptor>; + }; + Staking: { + /** + *The era payout has been set; the first balance is the validator-payout; the second is + *the remainder from the maximum amount of reward. + */ + EraPaid: PlainDescriptor>; + /** + *The nominator has been rewarded by this amount to this destination. + */ + Rewarded: PlainDescriptor>; + /** + *A staker (validator or nominator) has been slashed by the given amount. + */ + Slashed: PlainDescriptor>; + /** + *A slash for the given validator, for the given percentage of their stake, at the given + *era as been reported. + */ + SlashReported: PlainDescriptor>; + /** + *An old slashing report from a prior era was discarded because it could + *not be processed. + */ + OldSlashingReportDiscarded: PlainDescriptor>; + /** + *A new set of stakers was elected. + */ + StakersElected: PlainDescriptor; + /** + *An account has bonded this amount. \[stash, amount\] + * + *NOTE: This event is only emitted when funds are bonded via a dispatchable. Notably, + *it will not be emitted for staking rewards when they are added to stake. + */ + Bonded: PlainDescriptor>; + /** + *An account has unbonded this amount. + */ + Unbonded: PlainDescriptor>; + /** + *An account has called `withdraw_unbonded` and removed unbonding chunks worth `Balance` + *from the unlocking queue. + */ + Withdrawn: PlainDescriptor>; + /** + *A nominator has been kicked from a validator. + */ + Kicked: PlainDescriptor>; + /** + *The election failed. No new era is planned. + */ + StakingElectionFailed: PlainDescriptor; + /** + *An account has stopped participating as either a validator or nominator. + */ + Chilled: PlainDescriptor>; + /** + *A Page of stakers rewards are getting paid. `next` is `None` if all pages are claimed. + */ + PayoutStarted: PlainDescriptor>; + /** + *A validator has set their preferences. + */ + ValidatorPrefsSet: PlainDescriptor>; + /** + *Voters size limit reached. + */ + SnapshotVotersSizeExceeded: PlainDescriptor>; + /** + *Targets size limit reached. + */ + SnapshotTargetsSizeExceeded: PlainDescriptor>; + /** + *A new force era mode was set. + */ + ForceEra: PlainDescriptor>; + /** + *Report of a controller batch deprecation. + */ + ControllerBatchDeprecated: PlainDescriptor>; + /** + *Staking balance migrated from locks to holds, with any balance that could not be held + *is force withdrawn. + */ + CurrencyMigrated: PlainDescriptor>; + }; + Offences: { + /** + *There is an offence reported of the given `kind` happened at the `session_index` and + *(kind-specific) time slot. This event is not deposited for duplicate slashes. + *\[kind, timeslot\]. + */ + Offence: PlainDescriptor>; + }; + Historical: { + /** + *The merkle root of the validators of the said session were stored + */ + RootStored: PlainDescriptor>; + /** + *The merkle roots of up to this session index were pruned + */ + RootsPruned: PlainDescriptor>; + }; + Parameters: { + /** + *A Parameter was set. + * + *Is also emitted when the value was not changed. + */ + Updated: PlainDescriptor>; + }; + Session: { + /** + *New session has happened. Note that the argument is the session index, not the + *block number as the type might suggest. + */ + NewSession: PlainDescriptor>; + /** + *The `NewSession` event in the current block also implies a new validator set to be + *queued. + */ + NewQueued: PlainDescriptor; + /** + *Validator has been disabled. + */ + ValidatorDisabled: PlainDescriptor>; + /** + *Validator has been re-enabled. + */ + ValidatorReenabled: PlainDescriptor>; + }; + Grandpa: { + /** + *New authority set has been applied. + */ + NewAuthorities: PlainDescriptor>; + /** + *Current authority set has been paused. + */ + Paused: PlainDescriptor; + /** + *Current authority set has been resumed. + */ + Resumed: PlainDescriptor; + }; + Utility: { + /** + *Batch of dispatches did not complete fully. Index of first failing dispatch given, as + *well as the error. + */ + BatchInterrupted: PlainDescriptor>; + /** + *Batch of dispatches completed fully with no error. + */ + BatchCompleted: PlainDescriptor; + /** + *Batch of dispatches completed but has errors. + */ + BatchCompletedWithErrors: PlainDescriptor; + /** + *A single item within a Batch of dispatches has completed with no error. + */ + ItemCompleted: PlainDescriptor; + /** + *A single item within a Batch of dispatches has completed with error. + */ + ItemFailed: PlainDescriptor>; + /** + *A call was dispatched. + */ + DispatchedAs: PlainDescriptor>; + /** + *Main call was dispatched. + */ + IfElseMainSuccess: PlainDescriptor; + /** + *The fallback call was dispatched. + */ + IfElseFallbackCalled: PlainDescriptor>; + }; + Identity: { + /** + *A name was set or reset (which will remove all judgements). + */ + IdentitySet: PlainDescriptor>; + /** + *A name was cleared, and the given balance returned. + */ + IdentityCleared: PlainDescriptor>; + /** + *A name was removed and the given balance slashed. + */ + IdentityKilled: PlainDescriptor>; + /** + *A judgement was asked from a registrar. + */ + JudgementRequested: PlainDescriptor>; + /** + *A judgement request was retracted. + */ + JudgementUnrequested: PlainDescriptor>; + /** + *A judgement was given by a registrar. + */ + JudgementGiven: PlainDescriptor>; + /** + *A registrar was added. + */ + RegistrarAdded: PlainDescriptor>; + /** + *A sub-identity was added to an identity and the deposit paid. + */ + SubIdentityAdded: PlainDescriptor>; + /** + *An account's sub-identities were set (in bulk). + */ + SubIdentitiesSet: PlainDescriptor>; + /** + *A given sub-account's associated name was changed by its super-identity. + */ + SubIdentityRenamed: PlainDescriptor>; + /** + *A sub-identity was removed from an identity and the deposit freed. + */ + SubIdentityRemoved: PlainDescriptor>; + /** + *A sub-identity was cleared, and the given deposit repatriated from the + *main identity account to the sub-identity account. + */ + SubIdentityRevoked: PlainDescriptor>; + /** + *A username authority was added. + */ + AuthorityAdded: PlainDescriptor>; + /** + *A username authority was removed. + */ + AuthorityRemoved: PlainDescriptor>; + /** + *A username was set for `who`. + */ + UsernameSet: PlainDescriptor>; + /** + *A username was queued, but `who` must accept it prior to `expiration`. + */ + UsernameQueued: PlainDescriptor>; + /** + *A queued username passed its expiration without being claimed and was removed. + */ + PreapprovalExpired: PlainDescriptor>; + /** + *A username was set as a primary and can be looked up from `who`. + */ + PrimaryUsernameSet: PlainDescriptor>; + /** + *A dangling username (as in, a username corresponding to an account that has removed its + *identity) has been removed. + */ + DanglingUsernameRemoved: PlainDescriptor>; + /** + *A username has been unbound. + */ + UsernameUnbound: PlainDescriptor>; + /** + *A username has been removed. + */ + UsernameRemoved: PlainDescriptor>; + /** + *A username has been killed. + */ + UsernameKilled: PlainDescriptor>; + }; + Recovery: { + /** + *A recovery process has been set up for an account. + */ + RecoveryCreated: PlainDescriptor>; + /** + *A recovery process has been initiated for lost account by rescuer account. + */ + RecoveryInitiated: PlainDescriptor>; + /** + *A recovery process for lost account by rescuer account has been vouched for by sender. + */ + RecoveryVouched: PlainDescriptor>; + /** + *A recovery process for lost account by rescuer account has been closed. + */ + RecoveryClosed: PlainDescriptor>; + /** + *Lost account has been successfully recovered by rescuer account. + */ + AccountRecovered: PlainDescriptor>; + /** + *A recovery process has been removed for an account. + */ + RecoveryRemoved: PlainDescriptor>; + /** + *A deposit has been updated. + */ + DepositPoked: PlainDescriptor>; + }; + Vesting: { + /** + *A vesting schedule has been created. + */ + VestingCreated: PlainDescriptor>; + /** + *The amount vested has been updated. This could indicate a change in funds available. + *The balance given is the amount which is left unvested (and thus locked). + */ + VestingUpdated: PlainDescriptor>; + /** + *An \[account\] has become fully vested. + */ + VestingCompleted: PlainDescriptor>; + }; + Scheduler: { + /** + *Scheduled some task. + */ + Scheduled: PlainDescriptor>; + /** + *Canceled some task. + */ + Canceled: PlainDescriptor>; + /** + *Dispatched some task. + */ + Dispatched: PlainDescriptor>; + /** + *Set a retry configuration for some task. + */ + RetrySet: PlainDescriptor>; + /** + *Cancel a retry configuration for some task. + */ + RetryCancelled: PlainDescriptor>; + /** + *The call for the provided hash was not found so the task has been aborted. + */ + CallUnavailable: PlainDescriptor>; + /** + *The given task was unable to be renewed since the agenda is full at that block. + */ + PeriodicFailed: PlainDescriptor>; + /** + *The given task was unable to be retried since the agenda is full at that block or there + *was not enough weight to reschedule it. + */ + RetryFailed: PlainDescriptor>; + /** + *The given task can never be executed since it is overweight. + */ + PermanentlyOverweight: PlainDescriptor>; + /** + *Agenda is incomplete from `when`. + */ + AgendaIncomplete: PlainDescriptor>; + }; + Preimage: { + /** + *A preimage has been noted. + */ + Noted: PlainDescriptor>; + /** + *A preimage has been requested. + */ + Requested: PlainDescriptor>; + /** + *A preimage has ben cleared. + */ + Cleared: PlainDescriptor>; + }; + Sudo: { + /** + *A sudo call just took place. + */ + Sudid: PlainDescriptor>; + /** + *The sudo key has been updated. + */ + KeyChanged: PlainDescriptor>; + /** + *The key was permanently removed. + */ + KeyRemoved: PlainDescriptor; + /** + *A [sudo_as](Pallet::sudo_as) call just took place. + */ + SudoAsDone: PlainDescriptor>; + }; + Proxy: { + /** + *A proxy was executed correctly, with the given. + */ + ProxyExecuted: PlainDescriptor>; + /** + *A pure account has been created by new proxy with given + *disambiguation index and proxy type. + */ + PureCreated: PlainDescriptor>; + /** + *A pure proxy was killed by its spawner. + */ + PureKilled: PlainDescriptor>; + /** + *An announcement was placed to make a call in the future. + */ + Announced: PlainDescriptor>; + /** + *A proxy was added. + */ + ProxyAdded: PlainDescriptor>; + /** + *A proxy was removed. + */ + ProxyRemoved: PlainDescriptor>; + /** + *A deposit stored for proxies or announcements was poked / updated. + */ + DepositPoked: PlainDescriptor>; + }; + Multisig: { + /** + *A new multisig operation has begun. + */ + NewMultisig: PlainDescriptor>; + /** + *A multisig operation has been approved by someone. + */ + MultisigApproval: PlainDescriptor>; + /** + *A multisig operation has been executed. + */ + MultisigExecuted: PlainDescriptor>; + /** + *A multisig operation has been cancelled. + */ + MultisigCancelled: PlainDescriptor>; + /** + *The deposit for a multisig operation has been updated/poked. + */ + DepositPoked: PlainDescriptor>; + }; + ElectionProviderMultiPhase: { + /** + *A solution was stored with the given compute. + * + *The `origin` indicates the origin of the solution. If `origin` is `Some(AccountId)`, + *the stored solution was submitted in the signed phase by a miner with the `AccountId`. + *Otherwise, the solution was stored either during the unsigned phase or by + *`T::ForceOrigin`. The `bool` is `true` when a previous solution was ejected to make + *room for this one. + */ + SolutionStored: PlainDescriptor>; + /** + *The election has been finalized, with the given computation and score. + */ + ElectionFinalized: PlainDescriptor>; + /** + *An election failed. + * + *Not much can be said about which computes failed in the process. + */ + ElectionFailed: PlainDescriptor; + /** + *An account has been rewarded for their signed submission being finalized. + */ + Rewarded: PlainDescriptor>; + /** + *An account has been slashed for submitting an invalid signed submission. + */ + Slashed: PlainDescriptor>; + /** + *There was a phase transition in a given round. + */ + PhaseTransitioned: PlainDescriptor>; + }; + VoterList: { + /** + *Moved an account from one bag to another. + */ + Rebagged: PlainDescriptor>; + /** + *Updated the score of some account to the given amount. + */ + ScoreUpdated: PlainDescriptor>; + }; + NominationPools: { + /** + *A pool has been created. + */ + Created: PlainDescriptor>; + /** + *A member has became bonded in a pool. + */ + Bonded: PlainDescriptor>; + /** + *A payout has been made to a member. + */ + PaidOut: PlainDescriptor>; + /** + *A member has unbonded from their pool. + * + *- `balance` is the corresponding balance of the number of points that has been + * requested to be unbonded (the argument of the `unbond` transaction) from the bonded + * pool. + *- `points` is the number of points that are issued as a result of `balance` being + *dissolved into the corresponding unbonding pool. + *- `era` is the era in which the balance will be unbonded. + *In the absence of slashing, these values will match. In the presence of slashing, the + *number of points that are issued in the unbonding pool will be less than the amount + *requested to be unbonded. + */ + Unbonded: PlainDescriptor>; + /** + *A member has withdrawn from their pool. + * + *The given number of `points` have been dissolved in return of `balance`. + * + *Similar to `Unbonded` event, in the absence of slashing, the ratio of point to balance + *will be 1. + */ + Withdrawn: PlainDescriptor>; + /** + *A pool has been destroyed. + */ + Destroyed: PlainDescriptor>; + /** + *The state of a pool has changed + */ + StateChanged: PlainDescriptor>; + /** + *A member has been removed from a pool. + * + *The removal can be voluntary (withdrawn all unbonded funds) or involuntary (kicked). + *Any funds that are still delegated (i.e. dangling delegation) are released and are + *represented by `released_balance`. + */ + MemberRemoved: PlainDescriptor>; + /** + *The roles of a pool have been updated to the given new roles. Note that the depositor + *can never change. + */ + RolesUpdated: PlainDescriptor>; + /** + *The active balance of pool `pool_id` has been slashed to `balance`. + */ + PoolSlashed: PlainDescriptor>; + /** + *The unbond pool at `era` of pool `pool_id` has been slashed to `balance`. + */ + UnbondingPoolSlashed: PlainDescriptor>; + /** + *A pool's commission setting has been changed. + */ + PoolCommissionUpdated: PlainDescriptor>; + /** + *A pool's maximum commission setting has been changed. + */ + PoolMaxCommissionUpdated: PlainDescriptor>; + /** + *A pool's commission `change_rate` has been changed. + */ + PoolCommissionChangeRateUpdated: PlainDescriptor>; + /** + *Pool commission claim permission has been updated. + */ + PoolCommissionClaimPermissionUpdated: PlainDescriptor>; + /** + *Pool commission has been claimed. + */ + PoolCommissionClaimed: PlainDescriptor>; + /** + *Topped up deficit in frozen ED of the reward pool. + */ + MinBalanceDeficitAdjusted: PlainDescriptor>; + /** + *Claimed excess frozen ED of af the reward pool. + */ + MinBalanceExcessAdjusted: PlainDescriptor>; + /** + *A pool member's claim permission has been updated. + */ + MemberClaimPermissionUpdated: PlainDescriptor>; + /** + *A pool's metadata was updated. + */ + MetadataUpdated: PlainDescriptor>; + /** + *A pool's nominating account (or the pool's root account) has nominated a validator set + *on behalf of the pool. + */ + PoolNominationMade: PlainDescriptor>; + /** + *The pool is chilled i.e. no longer nominating. + */ + PoolNominatorChilled: PlainDescriptor>; + /** + *Global parameters regulating nomination pools have been updated. + */ + GlobalParamsUpdated: PlainDescriptor>; + }; + FastUnstake: { + /** + *A staker was unstaked. + */ + Unstaked: PlainDescriptor>; + /** + *A staker was slashed for requesting fast-unstake whilst being exposed. + */ + Slashed: PlainDescriptor>; + /** + *A batch was partially checked for the given eras, but the process did not finish. + */ + BatchChecked: PlainDescriptor>; + /** + *A batch of a given size was terminated. + * + *This is always follows by a number of `Unstaked` or `Slashed` events, marking the end + *of the batch. A new batch will be created upon next block. + */ + BatchFinished: PlainDescriptor>; + /** + *An internal error happened. Operations will be paused now. + */ + InternalError: PlainDescriptor; + }; + ConvictionVoting: { + /** + *An account has delegated their vote to another account. \[who, target\] + */ + Delegated: PlainDescriptor>; + /** + *An \[account\] has cancelled a previous delegation operation. + */ + Undelegated: PlainDescriptor; + /** + *An account has voted + */ + Voted: PlainDescriptor>; + /** + *A vote has been removed + */ + VoteRemoved: PlainDescriptor>; + /** + *The lockup period of a conviction vote expired, and the funds have been unlocked. + */ + VoteUnlocked: PlainDescriptor>; + }; + Referenda: { + /** + *A referendum has been submitted. + */ + Submitted: PlainDescriptor>; + /** + *The decision deposit has been placed. + */ + DecisionDepositPlaced: PlainDescriptor>; + /** + *The decision deposit has been refunded. + */ + DecisionDepositRefunded: PlainDescriptor>; + /** + *A deposit has been slashed. + */ + DepositSlashed: PlainDescriptor>; + /** + *A referendum has moved into the deciding phase. + */ + DecisionStarted: PlainDescriptor>; + /** + + */ + ConfirmStarted: PlainDescriptor>; + /** + + */ + ConfirmAborted: PlainDescriptor>; + /** + *A referendum has ended its confirmation phase and is ready for approval. + */ + Confirmed: PlainDescriptor>; + /** + *A referendum has been approved and its proposal has been scheduled. + */ + Approved: PlainDescriptor>; + /** + *A proposal has been rejected by referendum. + */ + Rejected: PlainDescriptor>; + /** + *A referendum has been timed out without being decided. + */ + TimedOut: PlainDescriptor>; + /** + *A referendum has been cancelled. + */ + Cancelled: PlainDescriptor>; + /** + *A referendum has been killed. + */ + Killed: PlainDescriptor>; + /** + *The submission deposit has been refunded. + */ + SubmissionDepositRefunded: PlainDescriptor>; + /** + *Metadata for a referendum has been set. + */ + MetadataSet: PlainDescriptor>; + /** + *Metadata for a referendum has been cleared. + */ + MetadataCleared: PlainDescriptor>; + }; + Whitelist: { + /** + + */ + CallWhitelisted: PlainDescriptor>; + /** + + */ + WhitelistedCallRemoved: PlainDescriptor>; + /** + + */ + WhitelistedCallDispatched: PlainDescriptor>; + }; + Treasury: { + /** + *We have ended a spend period and will now allocate funds. + */ + Spending: PlainDescriptor>; + /** + *Some funds have been allocated. + */ + Awarded: PlainDescriptor>; + /** + *Some of our funds have been burnt. + */ + Burnt: PlainDescriptor>; + /** + *Spending has finished; this is the amount that rolls over until next spend. + */ + Rollover: PlainDescriptor>; + /** + *Some funds have been deposited. + */ + Deposit: PlainDescriptor>; + /** + *A new spend proposal has been approved. + */ + SpendApproved: PlainDescriptor>; + /** + *The inactive funds of the pallet have been updated. + */ + UpdatedInactive: PlainDescriptor>; + /** + *A new asset spend proposal has been approved. + */ + AssetSpendApproved: PlainDescriptor>; + /** + *An approved spend was voided. + */ + AssetSpendVoided: PlainDescriptor>; + /** + *A payment happened. + */ + Paid: PlainDescriptor>; + /** + *A payment failed and can be retried. + */ + PaymentFailed: PlainDescriptor>; + /** + *A spend was processed and removed from the storage. It might have been successfully + *paid or it may have expired. + */ + SpendProcessed: PlainDescriptor>; + }; + DelegatedStaking: { + /** + *Funds delegated by a delegator. + */ + Delegated: PlainDescriptor>; + /** + *Funds released to a delegator. + */ + Released: PlainDescriptor>; + /** + *Funds slashed from a delegator. + */ + Slashed: PlainDescriptor>; + /** + *Unclaimed delegation funds migrated to delegator. + */ + MigratedDelegation: PlainDescriptor>; + }; + ParaInclusion: { + /** + *A candidate was backed. `[candidate, head_data]` + */ + CandidateBacked: PlainDescriptor>; + /** + *A candidate was included. `[candidate, head_data]` + */ + CandidateIncluded: PlainDescriptor>; + /** + *A candidate timed out. `[candidate, head_data]` + */ + CandidateTimedOut: PlainDescriptor>; + /** + *Some upward messages have been received and will be processed. + */ + UpwardMessagesReceived: PlainDescriptor>; + }; + Paras: { + /** + *Current code has been updated for a Para. `para_id` + */ + CurrentCodeUpdated: PlainDescriptor; + /** + *Current head has been updated for a Para. `para_id` + */ + CurrentHeadUpdated: PlainDescriptor; + /** + *A code upgrade has been scheduled for a Para. `para_id` + */ + CodeUpgradeScheduled: PlainDescriptor; + /** + *A new head has been noted for a Para. `para_id` + */ + NewHeadNoted: PlainDescriptor; + /** + *A para has been queued to execute pending actions. `para_id` + */ + ActionQueued: PlainDescriptor>; + /** + *The given para either initiated or subscribed to a PVF check for the given validation + *code. `code_hash` `para_id` + */ + PvfCheckStarted: PlainDescriptor>; + /** + *The given validation code was accepted by the PVF pre-checking vote. + *`code_hash` `para_id` + */ + PvfCheckAccepted: PlainDescriptor>; + /** + *The given validation code was rejected by the PVF pre-checking vote. + *`code_hash` `para_id` + */ + PvfCheckRejected: PlainDescriptor>; + /** + *The upgrade cooldown was removed. + */ + UpgradeCooldownRemoved: PlainDescriptor>; + /** + *A new code hash has been authorized for a Para. + */ + CodeAuthorized: PlainDescriptor>; + }; + Hrmp: { + /** + *Open HRMP channel requested. + */ + OpenChannelRequested: PlainDescriptor>; + /** + *An HRMP channel request sent by the receiver was canceled by either party. + */ + OpenChannelCanceled: PlainDescriptor>; + /** + *Open HRMP channel accepted. + */ + OpenChannelAccepted: PlainDescriptor>; + /** + *HRMP channel closed. + */ + ChannelClosed: PlainDescriptor>; + /** + *An HRMP channel was opened via Root origin. + */ + HrmpChannelForceOpened: PlainDescriptor>; + /** + *An HRMP channel was opened with a system chain. + */ + HrmpSystemChannelOpened: PlainDescriptor>; + /** + *An HRMP channel's deposits were updated. + */ + OpenChannelDepositsUpdated: PlainDescriptor>; + }; + ParasDisputes: { + /** + *A dispute has been initiated. \[candidate hash, dispute location\] + */ + DisputeInitiated: PlainDescriptor>; + /** + *A dispute has concluded for or against a candidate. + *`\[para id, candidate hash, dispute result\]` + */ + DisputeConcluded: PlainDescriptor>; + /** + *A dispute has concluded with supermajority against a candidate. + *Block authors should no longer build on top of this head and should + *instead revert the block at the given height. This should be the + *number of the child of the last known valid block in the chain. + */ + Revert: PlainDescriptor; + }; + OnDemandAssignmentProvider: { + /** + *An order was placed at some spot price amount by orderer ordered_by + */ + OnDemandOrderPlaced: PlainDescriptor>; + /** + *The value of the spot price has likely changed + */ + SpotPriceSet: PlainDescriptor>; + /** + *An account was given credits. + */ + AccountCredited: PlainDescriptor>; + }; + Registrar: { + /** + + */ + Registered: PlainDescriptor>; + /** + + */ + Deregistered: PlainDescriptor>; + /** + + */ + Reserved: PlainDescriptor>; + /** + + */ + Swapped: PlainDescriptor>; + }; + Slots: { + /** + *A new `[lease_period]` is beginning. + */ + NewLeasePeriod: PlainDescriptor>; + /** + *A para has won the right to a continuous set of lease periods as a parachain. + *First balance is any extra amount reserved on top of the para's existing deposit. + *Second balance is the total amount reserved. + */ + Leased: PlainDescriptor>; + }; + Auctions: { + /** + *An auction started. Provides its index and the block number where it will begin to + *close and the first lease period of the quadruplet that is auctioned. + */ + AuctionStarted: PlainDescriptor>; + /** + *An auction ended. All funds become unreserved. + */ + AuctionClosed: PlainDescriptor>; + /** + *Funds were reserved for a winning bid. First balance is the extra amount reserved. + *Second is the total. + */ + Reserved: PlainDescriptor>; + /** + *Funds were unreserved since bidder is no longer active. `[bidder, amount]` + */ + Unreserved: PlainDescriptor>; + /** + *Someone attempted to lease the same slot twice for a parachain. The amount is held in + *reserve but no parachain slot has been leased. + */ + ReserveConfiscated: PlainDescriptor>; + /** + *A new bid has been accepted as the current winner. + */ + BidAccepted: PlainDescriptor>; + /** + *The winning offset was chosen for an auction. This will map into the `Winning` storage + *map. + */ + WinningOffset: PlainDescriptor>; + }; + Crowdloan: { + /** + *Create a new crowdloaning campaign. + */ + Created: PlainDescriptor>; + /** + *Contributed to a crowd sale. + */ + Contributed: PlainDescriptor>; + /** + *Withdrew full balance of a contributor. + */ + Withdrew: PlainDescriptor>; + /** + *The loans in a fund have been partially dissolved, i.e. there are some left + *over child keys that still need to be killed. + */ + PartiallyRefunded: PlainDescriptor>; + /** + *All loans in a fund have been refunded. + */ + AllRefunded: PlainDescriptor>; + /** + *Fund is dissolved. + */ + Dissolved: PlainDescriptor>; + /** + *The result of trying to submit a new bid to the Slots pallet. + */ + HandleBidResult: PlainDescriptor>; + /** + *The configuration to a crowdloan has been edited. + */ + Edited: PlainDescriptor>; + /** + *A memo has been updated. + */ + MemoUpdated: PlainDescriptor>; + /** + *A parachain has been moved to `NewRaise` + */ + AddedToNewRaise: PlainDescriptor>; + }; + AssignedSlots: { + /** + *A parachain was assigned a permanent parachain slot + */ + PermanentSlotAssigned: PlainDescriptor; + /** + *A parachain was assigned a temporary parachain slot + */ + TemporarySlotAssigned: PlainDescriptor; + /** + *The maximum number of permanent slots has been changed + */ + MaxPermanentSlotsChanged: PlainDescriptor>; + /** + *The maximum number of temporary slots has been changed + */ + MaxTemporarySlotsChanged: PlainDescriptor>; + }; + Coretime: { + /** + *The broker chain has asked for revenue information for a specific block. + */ + RevenueInfoRequested: PlainDescriptor>; + /** + *A core has received a new assignment from the broker chain. + */ + CoreAssigned: PlainDescriptor>; + }; + StakingAhClient: { + /** + *A new validator set has been received. + */ + ValidatorSetReceived: PlainDescriptor>; + /** + *We could not merge, and therefore dropped a buffered message. + * + *Note that this event is more resembling an error, but we use an event because in this + *pallet we need to mutate storage upon some failures. + */ + CouldNotMergeAndDropped: PlainDescriptor; + /** + *The validator set received is way too small, as per + *[`Config::MinimumValidatorSetSize`]. + */ + SetTooSmallAndDropped: PlainDescriptor; + /** + *Something occurred that should never happen under normal operation. Logged as an event + *for fail-safe observability. + */ + Unexpected: PlainDescriptor>; + }; + MultiBlockMigrations: { + /** + *A Runtime upgrade started. + * + *Its end is indicated by `UpgradeCompleted` or `UpgradeFailed`. + */ + UpgradeStarted: PlainDescriptor>; + /** + *The current runtime upgrade completed. + * + *This implies that all of its migrations completed successfully as well. + */ + UpgradeCompleted: PlainDescriptor; + /** + *Runtime upgrade failed. + * + *This is very bad and will require governance intervention. + */ + UpgradeFailed: PlainDescriptor; + /** + *A migration was skipped since it was already executed in the past. + */ + MigrationSkipped: PlainDescriptor>; + /** + *A migration progressed. + */ + MigrationAdvanced: PlainDescriptor>; + /** + *A Migration completed. + */ + MigrationCompleted: PlainDescriptor>; + /** + *A Migration failed. + * + *This implies that the whole upgrade failed and governance intervention is required. + */ + MigrationFailed: PlainDescriptor>; + /** + *The set of historical migrations has been cleared. + */ + HistoricCleared: PlainDescriptor>; + }; + XcmPallet: { + /** + *Execution of an XCM message was attempted. + */ + Attempted: PlainDescriptor>; + /** + *An XCM message was sent. + */ + Sent: PlainDescriptor>; + /** + *An XCM message failed to send. + */ + SendFailed: PlainDescriptor>; + /** + *An XCM message failed to process. + */ + ProcessXcmError: PlainDescriptor>; + /** + *Query response received which does not match a registered query. This may be because a + *matching query was never registered, it may be because it is a duplicate response, or + *because the query timed out. + */ + UnexpectedResponse: PlainDescriptor>; + /** + *Query response has been received and is ready for taking with `take_response`. There is + *no registered notification call. + */ + ResponseReady: PlainDescriptor>; + /** + *Query response has been received and query is removed. The registered notification has + *been dispatched and executed successfully. + */ + Notified: PlainDescriptor>; + /** + *Query response has been received and query is removed. The registered notification + *could not be dispatched because the dispatch weight is greater than the maximum weight + *originally budgeted by this runtime for the query result. + */ + NotifyOverweight: PlainDescriptor>; + /** + *Query response has been received and query is removed. There was a general error with + *dispatching the notification call. + */ + NotifyDispatchError: PlainDescriptor>; + /** + *Query response has been received and query is removed. The dispatch was unable to be + *decoded into a `Call`; this might be due to dispatch function having a signature which + *is not `(origin, QueryId, Response)`. + */ + NotifyDecodeFailed: PlainDescriptor>; + /** + *Expected query response has been received but the origin location of the response does + *not match that expected. The query remains registered for a later, valid, response to + *be received and acted upon. + */ + InvalidResponder: PlainDescriptor>; + /** + *Expected query response has been received but the expected origin location placed in + *storage by this runtime previously cannot be decoded. The query remains registered. + * + *This is unexpected (since a location placed in storage in a previously executing + *runtime should be readable prior to query timeout) and dangerous since the possibly + *valid response will be dropped. Manual governance intervention is probably going to be + *needed. + */ + InvalidResponderVersion: PlainDescriptor>; + /** + *Received query response has been read and removed. + */ + ResponseTaken: PlainDescriptor>; + /** + *Some assets have been placed in an asset trap. + */ + AssetsTrapped: PlainDescriptor>; + /** + *An XCM version change notification message has been attempted to be sent. + * + *The cost of sending it (borne by the chain) is included. + */ + VersionChangeNotified: PlainDescriptor>; + /** + *The supported version of a location has been changed. This might be through an + *automatic notification or a manual intervention. + */ + SupportedVersionChanged: PlainDescriptor>; + /** + *A given location which had a version change subscription was dropped owing to an error + *sending the notification to it. + */ + NotifyTargetSendFail: PlainDescriptor>; + /** + *A given location which had a version change subscription was dropped owing to an error + *migrating the location to our new XCM format. + */ + NotifyTargetMigrationFail: PlainDescriptor>; + /** + *Expected query response has been received but the expected querier location placed in + *storage by this runtime previously cannot be decoded. The query remains registered. + * + *This is unexpected (since a location placed in storage in a previously executing + *runtime should be readable prior to query timeout) and dangerous since the possibly + *valid response will be dropped. Manual governance intervention is probably going to be + *needed. + */ + InvalidQuerierVersion: PlainDescriptor>; + /** + *Expected query response has been received but the querier location of the response does + *not match the expected. The query remains registered for a later, valid, response to + *be received and acted upon. + */ + InvalidQuerier: PlainDescriptor>; + /** + *A remote has requested XCM version change notification from us and we have honored it. + *A version information message is sent to them and its cost is included. + */ + VersionNotifyStarted: PlainDescriptor>; + /** + *We have requested that a remote chain send us XCM version change notifications. + */ + VersionNotifyRequested: PlainDescriptor>; + /** + *We have requested that a remote chain stops sending us XCM version change + *notifications. + */ + VersionNotifyUnrequested: PlainDescriptor>; + /** + *Fees were paid from a location for an operation (often for using `SendXcm`). + */ + FeesPaid: PlainDescriptor>; + /** + *Some assets have been claimed from an asset trap + */ + AssetsClaimed: PlainDescriptor>; + /** + *A XCM version migration finished. + */ + VersionMigrationFinished: PlainDescriptor>; + /** + *An `aliaser` location was authorized by `target` to alias it, authorization valid until + *`expiry` block number. + */ + AliasAuthorized: PlainDescriptor>; + /** + *`target` removed alias authorization for `aliaser`. + */ + AliasAuthorizationRemoved: PlainDescriptor>; + /** + *`target` removed all alias authorizations. + */ + AliasesAuthorizationsRemoved: PlainDescriptor>; + }; + MessageQueue: { + /** + *Message discarded due to an error in the `MessageProcessor` (usually a format error). + */ + ProcessingFailed: PlainDescriptor>; + /** + *Message is processed. + */ + Processed: PlainDescriptor>; + /** + *Message placed in overweight queue. + */ + OverweightEnqueued: PlainDescriptor>; + /** + *This page was reaped. + */ + PageReaped: PlainDescriptor>; + }; + AssetRate: { + /** + + */ + AssetRateCreated: PlainDescriptor>; + /** + + */ + AssetRateRemoved: PlainDescriptor>; + /** + + */ + AssetRateUpdated: PlainDescriptor>; + }; + RootTesting: { + /** + *Event dispatched when the trigger_defensive extrinsic is called. + */ + DefensiveTestCall: PlainDescriptor; + }; + MetaTx: { + /** + *A meta transaction has been dispatched. + * + *Contains the dispatch result of the meta transaction along with post-dispatch + *information. + */ + Dispatched: PlainDescriptor>; + }; + IdentityMigrator: { + /** + *The identity and all sub accounts were reaped for `who`. + */ + IdentityReaped: PlainDescriptor>; + /** + *The deposits held for `who` were updated. `identity` is the new deposit held for + *identity info, and `subs` is the new deposit held for the sub-accounts. + */ + DepositUpdated: PlainDescriptor>; + }; +}; +type IError = { + System: { + /** + *The name of specification does not match between the current runtime + *and the new runtime. + */ + InvalidSpecName: PlainDescriptor; + /** + *The specification version is not allowed to decrease between the current runtime + *and the new runtime. + */ + SpecVersionNeedsToIncrease: PlainDescriptor; + /** + *Failed to extract the runtime version from the new runtime. + * + *Either calling `Core_version` or decoding `RuntimeVersion` failed. + */ + FailedToExtractRuntimeVersion: PlainDescriptor; + /** + *Suicide called when the account has non-default composite data. + */ + NonDefaultComposite: PlainDescriptor; + /** + *There is a non-zero reference count preventing the account from being purged. + */ + NonZeroRefCount: PlainDescriptor; + /** + *The origin filter prevent the call to be dispatched. + */ + CallFiltered: PlainDescriptor; + /** + *A multi-block migration is ongoing and prevents the current code from being replaced. + */ + MultiBlockMigrationsOngoing: PlainDescriptor; + /** + *No upgrade authorized. + */ + NothingAuthorized: PlainDescriptor; + /** + *The submitted code is not authorized. + */ + Unauthorized: PlainDescriptor; + }; + Babe: { + /** + *An equivocation proof provided as part of an equivocation report is invalid. + */ + InvalidEquivocationProof: PlainDescriptor; + /** + *A key ownership proof provided as part of an equivocation report is invalid. + */ + InvalidKeyOwnershipProof: PlainDescriptor; + /** + *A given equivocation report is valid but already previously reported. + */ + DuplicateOffenceReport: PlainDescriptor; + /** + *Submitted configuration is invalid. + */ + InvalidConfiguration: PlainDescriptor; + }; + Indices: { + /** + *The index was not already assigned. + */ + NotAssigned: PlainDescriptor; + /** + *The index is assigned to another account. + */ + NotOwner: PlainDescriptor; + /** + *The index was not available. + */ + InUse: PlainDescriptor; + /** + *The source and destination accounts are identical. + */ + NotTransfer: PlainDescriptor; + /** + *The index is permanent and may not be freed/changed. + */ + Permanent: PlainDescriptor; + }; + Balances: { + /** + *Vesting balance too high to send value. + */ + VestingBalance: PlainDescriptor; + /** + *Account liquidity restrictions prevent withdrawal. + */ + LiquidityRestrictions: PlainDescriptor; + /** + *Balance too low to send value. + */ + InsufficientBalance: PlainDescriptor; + /** + *Value too low to create account due to existential deposit. + */ + ExistentialDeposit: PlainDescriptor; + /** + *Transfer/payment would kill account. + */ + Expendability: PlainDescriptor; + /** + *A vesting schedule already exists for this account. + */ + ExistingVestingSchedule: PlainDescriptor; + /** + *Beneficiary account must pre-exist. + */ + DeadAccount: PlainDescriptor; + /** + *Number of named reserves exceed `MaxReserves`. + */ + TooManyReserves: PlainDescriptor; + /** + *Number of holds exceed `VariantCountOf`. + */ + TooManyHolds: PlainDescriptor; + /** + *Number of freezes exceed `MaxFreezes`. + */ + TooManyFreezes: PlainDescriptor; + /** + *The issuance cannot be modified since it is already deactivated. + */ + IssuanceDeactivated: PlainDescriptor; + /** + *The delta cannot be zero. + */ + DeltaZero: PlainDescriptor; + }; + Staking: { + /** + *Not a controller account. + */ + NotController: PlainDescriptor; + /** + *Not a stash account. + */ + NotStash: PlainDescriptor; + /** + *Stash is already bonded. + */ + AlreadyBonded: PlainDescriptor; + /** + *Controller is already paired. + */ + AlreadyPaired: PlainDescriptor; + /** + *Targets cannot be empty. + */ + EmptyTargets: PlainDescriptor; + /** + *Duplicate index. + */ + DuplicateIndex: PlainDescriptor; + /** + *Slash record index out of bounds. + */ + InvalidSlashIndex: PlainDescriptor; + /** + *Cannot have a validator or nominator role, with value less than the minimum defined by + *governance (see `MinValidatorBond` and `MinNominatorBond`). If unbonding is the + *intention, `chill` first to remove one's role as validator/nominator. + */ + InsufficientBond: PlainDescriptor; + /** + *Can not schedule more unlock chunks. + */ + NoMoreChunks: PlainDescriptor; + /** + *Can not rebond without unlocking chunks. + */ + NoUnlockChunk: PlainDescriptor; + /** + *Attempting to target a stash that still has funds. + */ + FundedTarget: PlainDescriptor; + /** + *Invalid era to reward. + */ + InvalidEraToReward: PlainDescriptor; + /** + *Invalid number of nominations. + */ + InvalidNumberOfNominations: PlainDescriptor; + /** + *Items are not sorted and unique. + */ + NotSortedAndUnique: PlainDescriptor; + /** + *Rewards for this era have already been claimed for this validator. + */ + AlreadyClaimed: PlainDescriptor; + /** + *No nominators exist on this page. + */ + InvalidPage: PlainDescriptor; + /** + *Incorrect previous history depth input provided. + */ + IncorrectHistoryDepth: PlainDescriptor; + /** + *Incorrect number of slashing spans provided. + */ + IncorrectSlashingSpans: PlainDescriptor; + /** + *Internal state has become somehow corrupted and the operation cannot continue. + */ + BadState: PlainDescriptor; + /** + *Too many nomination targets supplied. + */ + TooManyTargets: PlainDescriptor; + /** + *A nomination target was supplied that was blocked or otherwise not a validator. + */ + BadTarget: PlainDescriptor; + /** + *The user has enough bond and thus cannot be chilled forcefully by an external person. + */ + CannotChillOther: PlainDescriptor; + /** + *There are too many nominators in the system. Governance needs to adjust the staking + *settings to keep things safe for the runtime. + */ + TooManyNominators: PlainDescriptor; + /** + *There are too many validator candidates in the system. Governance needs to adjust the + *staking settings to keep things safe for the runtime. + */ + TooManyValidators: PlainDescriptor; + /** + *Commission is too low. Must be at least `MinCommission`. + */ + CommissionTooLow: PlainDescriptor; + /** + *Some bound is not met. + */ + BoundNotMet: PlainDescriptor; + /** + *Used when attempting to use deprecated controller account logic. + */ + ControllerDeprecated: PlainDescriptor; + /** + *Cannot reset a ledger. + */ + CannotRestoreLedger: PlainDescriptor; + /** + *Provided reward destination is not allowed. + */ + RewardDestinationRestricted: PlainDescriptor; + /** + *Not enough funds available to withdraw. + */ + NotEnoughFunds: PlainDescriptor; + /** + *Operation not allowed for virtual stakers. + */ + VirtualStakerNotAllowed: PlainDescriptor; + /** + *Stash could not be reaped as other pallet might depend on it. + */ + CannotReapStash: PlainDescriptor; + /** + *The stake of this account is already migrated to `Fungible` holds. + */ + AlreadyMigrated: PlainDescriptor; + /** + *Account is restricted from participation in staking. This may happen if the account is + *staking in another way already, such as via pool. + */ + Restricted: PlainDescriptor; + }; + Session: { + /** + *Invalid ownership proof. + */ + InvalidProof: PlainDescriptor; + /** + *No associated validator ID for account. + */ + NoAssociatedValidatorId: PlainDescriptor; + /** + *Registered duplicate key. + */ + DuplicatedKey: PlainDescriptor; + /** + *No keys are associated with this account. + */ + NoKeys: PlainDescriptor; + /** + *Key setting account is not live, so it's impossible to associate keys. + */ + NoAccount: PlainDescriptor; + }; + Grandpa: { + /** + *Attempt to signal GRANDPA pause when the authority set isn't live + *(either paused or already pending pause). + */ + PauseFailed: PlainDescriptor; + /** + *Attempt to signal GRANDPA resume when the authority set isn't paused + *(either live or already pending resume). + */ + ResumeFailed: PlainDescriptor; + /** + *Attempt to signal GRANDPA change with one already pending. + */ + ChangePending: PlainDescriptor; + /** + *Cannot signal forced change so soon after last. + */ + TooSoon: PlainDescriptor; + /** + *A key ownership proof provided as part of an equivocation report is invalid. + */ + InvalidKeyOwnershipProof: PlainDescriptor; + /** + *An equivocation proof provided as part of an equivocation report is invalid. + */ + InvalidEquivocationProof: PlainDescriptor; + /** + *A given equivocation report is valid but already previously reported. + */ + DuplicateOffenceReport: PlainDescriptor; + }; + Utility: { + /** + *Too many calls batched. + */ + TooManyCalls: PlainDescriptor; + }; + Identity: { + /** + *Too many subs-accounts. + */ + TooManySubAccounts: PlainDescriptor; + /** + *Account isn't found. + */ + NotFound: PlainDescriptor; + /** + *Account isn't named. + */ + NotNamed: PlainDescriptor; + /** + *Empty index. + */ + EmptyIndex: PlainDescriptor; + /** + *Fee is changed. + */ + FeeChanged: PlainDescriptor; + /** + *No identity found. + */ + NoIdentity: PlainDescriptor; + /** + *Sticky judgement. + */ + StickyJudgement: PlainDescriptor; + /** + *Judgement given. + */ + JudgementGiven: PlainDescriptor; + /** + *Invalid judgement. + */ + InvalidJudgement: PlainDescriptor; + /** + *The index is invalid. + */ + InvalidIndex: PlainDescriptor; + /** + *The target is invalid. + */ + InvalidTarget: PlainDescriptor; + /** + *Maximum amount of registrars reached. Cannot add any more. + */ + TooManyRegistrars: PlainDescriptor; + /** + *Account ID is already named. + */ + AlreadyClaimed: PlainDescriptor; + /** + *Sender is not a sub-account. + */ + NotSub: PlainDescriptor; + /** + *Sub-account isn't owned by sender. + */ + NotOwned: PlainDescriptor; + /** + *The provided judgement was for a different identity. + */ + JudgementForDifferentIdentity: PlainDescriptor; + /** + *Error that occurs when there is an issue paying for judgement. + */ + JudgementPaymentFailed: PlainDescriptor; + /** + *The provided suffix is too long. + */ + InvalidSuffix: PlainDescriptor; + /** + *The sender does not have permission to issue a username. + */ + NotUsernameAuthority: PlainDescriptor; + /** + *The authority cannot allocate any more usernames. + */ + NoAllocation: PlainDescriptor; + /** + *The signature on a username was not valid. + */ + InvalidSignature: PlainDescriptor; + /** + *Setting this username requires a signature, but none was provided. + */ + RequiresSignature: PlainDescriptor; + /** + *The username does not meet the requirements. + */ + InvalidUsername: PlainDescriptor; + /** + *The username is already taken. + */ + UsernameTaken: PlainDescriptor; + /** + *The requested username does not exist. + */ + NoUsername: PlainDescriptor; + /** + *The username cannot be forcefully removed because it can still be accepted. + */ + NotExpired: PlainDescriptor; + /** + *The username cannot be removed because it's still in the grace period. + */ + TooEarly: PlainDescriptor; + /** + *The username cannot be removed because it is not unbinding. + */ + NotUnbinding: PlainDescriptor; + /** + *The username cannot be unbound because it is already unbinding. + */ + AlreadyUnbinding: PlainDescriptor; + /** + *The action cannot be performed because of insufficient privileges (e.g. authority + *trying to unbind a username provided by the system). + */ + InsufficientPrivileges: PlainDescriptor; + }; + Recovery: { + /** + *User is not allowed to make a call on behalf of this account + */ + NotAllowed: PlainDescriptor; + /** + *Threshold must be greater than zero + */ + ZeroThreshold: PlainDescriptor; + /** + *Friends list must be greater than zero and threshold + */ + NotEnoughFriends: PlainDescriptor; + /** + *Friends list must be less than max friends + */ + MaxFriends: PlainDescriptor; + /** + *Friends list must be sorted and free of duplicates + */ + NotSorted: PlainDescriptor; + /** + *This account is not set up for recovery + */ + NotRecoverable: PlainDescriptor; + /** + *This account is already set up for recovery + */ + AlreadyRecoverable: PlainDescriptor; + /** + *A recovery process has already started for this account + */ + AlreadyStarted: PlainDescriptor; + /** + *A recovery process has not started for this rescuer + */ + NotStarted: PlainDescriptor; + /** + *This account is not a friend who can vouch + */ + NotFriend: PlainDescriptor; + /** + *The friend must wait until the delay period to vouch for this recovery + */ + DelayPeriod: PlainDescriptor; + /** + *This user has already vouched for this recovery + */ + AlreadyVouched: PlainDescriptor; + /** + *The threshold for recovering this account has not been met + */ + Threshold: PlainDescriptor; + /** + *There are still active recovery attempts that need to be closed + */ + StillActive: PlainDescriptor; + /** + *This account is already set up for recovery + */ + AlreadyProxy: PlainDescriptor; + /** + *Some internal state is broken. + */ + BadState: PlainDescriptor; + }; + Vesting: { + /** + *The account given is not vesting. + */ + NotVesting: PlainDescriptor; + /** + *The account already has `MaxVestingSchedules` count of schedules and thus + *cannot add another one. Consider merging existing schedules in order to add another. + */ + AtMaxVestingSchedules: PlainDescriptor; + /** + *Amount being transferred is too low to create a vesting schedule. + */ + AmountLow: PlainDescriptor; + /** + *An index was out of bounds of the vesting schedules. + */ + ScheduleIndexOutOfBounds: PlainDescriptor; + /** + *Failed to create a new schedule because some parameter was invalid. + */ + InvalidScheduleParams: PlainDescriptor; + }; + Scheduler: { + /** + *Failed to schedule a call + */ + FailedToSchedule: PlainDescriptor; + /** + *Cannot find the scheduled call. + */ + NotFound: PlainDescriptor; + /** + *Given target block number is in the past. + */ + TargetBlockNumberInPast: PlainDescriptor; + /** + *Reschedule failed because it does not change scheduled time. + */ + RescheduleNoChange: PlainDescriptor; + /** + *Attempt to use a non-named function on a named task. + */ + Named: PlainDescriptor; + }; + Preimage: { + /** + *Preimage is too large to store on-chain. + */ + TooBig: PlainDescriptor; + /** + *Preimage has already been noted on-chain. + */ + AlreadyNoted: PlainDescriptor; + /** + *The user is not authorized to perform this action. + */ + NotAuthorized: PlainDescriptor; + /** + *The preimage cannot be removed since it has not yet been noted. + */ + NotNoted: PlainDescriptor; + /** + *A preimage may not be removed when there are outstanding requests. + */ + Requested: PlainDescriptor; + /** + *The preimage request cannot be removed since no outstanding requests exist. + */ + NotRequested: PlainDescriptor; + /** + *More than `MAX_HASH_UPGRADE_BULK_COUNT` hashes were requested to be upgraded at once. + */ + TooMany: PlainDescriptor; + /** + *Too few hashes were requested to be upgraded (i.e. zero). + */ + TooFew: PlainDescriptor; + }; + Sudo: { + /** + *Sender must be the Sudo account. + */ + RequireSudo: PlainDescriptor; + }; + Proxy: { + /** + *There are too many proxies registered or too many announcements pending. + */ + TooMany: PlainDescriptor; + /** + *Proxy registration not found. + */ + NotFound: PlainDescriptor; + /** + *Sender is not a proxy of the account to be proxied. + */ + NotProxy: PlainDescriptor; + /** + *A call which is incompatible with the proxy type's filter was attempted. + */ + Unproxyable: PlainDescriptor; + /** + *Account is already a proxy. + */ + Duplicate: PlainDescriptor; + /** + *Call may not be made by proxy because it may escalate its privileges. + */ + NoPermission: PlainDescriptor; + /** + *Announcement, if made at all, was made too recently. + */ + Unannounced: PlainDescriptor; + /** + *Cannot add self as proxy. + */ + NoSelfProxy: PlainDescriptor; + }; + Multisig: { + /** + *Threshold must be 2 or greater. + */ + MinimumThreshold: PlainDescriptor; + /** + *Call is already approved by this signatory. + */ + AlreadyApproved: PlainDescriptor; + /** + *Call doesn't need any (more) approvals. + */ + NoApprovalsNeeded: PlainDescriptor; + /** + *There are too few signatories in the list. + */ + TooFewSignatories: PlainDescriptor; + /** + *There are too many signatories in the list. + */ + TooManySignatories: PlainDescriptor; + /** + *The signatories were provided out of order; they should be ordered. + */ + SignatoriesOutOfOrder: PlainDescriptor; + /** + *The sender was contained in the other signatories; it shouldn't be. + */ + SenderInSignatories: PlainDescriptor; + /** + *Multisig operation not found in storage. + */ + NotFound: PlainDescriptor; + /** + *Only the account that originally created the multisig is able to cancel it or update + *its deposits. + */ + NotOwner: PlainDescriptor; + /** + *No timepoint was given, yet the multisig operation is already underway. + */ + NoTimepoint: PlainDescriptor; + /** + *A different timepoint was given to the multisig operation that is underway. + */ + WrongTimepoint: PlainDescriptor; + /** + *A timepoint was given, yet no multisig operation is underway. + */ + UnexpectedTimepoint: PlainDescriptor; + /** + *The maximum weight information provided was too low. + */ + MaxWeightTooLow: PlainDescriptor; + /** + *The data to be stored is already stored. + */ + AlreadyStored: PlainDescriptor; + }; + ElectionProviderMultiPhase: { + /** + *Submission was too early. + */ + PreDispatchEarlySubmission: PlainDescriptor; + /** + *Wrong number of winners presented. + */ + PreDispatchWrongWinnerCount: PlainDescriptor; + /** + *Submission was too weak, score-wise. + */ + PreDispatchWeakSubmission: PlainDescriptor; + /** + *The queue was full, and the solution was not better than any of the existing ones. + */ + SignedQueueFull: PlainDescriptor; + /** + *The origin failed to pay the deposit. + */ + SignedCannotPayDeposit: PlainDescriptor; + /** + *Witness data to dispatchable is invalid. + */ + SignedInvalidWitness: PlainDescriptor; + /** + *The signed submission consumes too much weight + */ + SignedTooMuchWeight: PlainDescriptor; + /** + *OCW submitted solution for wrong round + */ + OcwCallWrongEra: PlainDescriptor; + /** + *Snapshot metadata should exist but didn't. + */ + MissingSnapshotMetadata: PlainDescriptor; + /** + *`Self::insert_submission` returned an invalid index. + */ + InvalidSubmissionIndex: PlainDescriptor; + /** + *The call is not allowed at this point. + */ + CallNotAllowed: PlainDescriptor; + /** + *The fallback failed + */ + FallbackFailed: PlainDescriptor; + /** + *Some bound not met + */ + BoundNotMet: PlainDescriptor; + /** + *Submitted solution has too many winners + */ + TooManyWinners: PlainDescriptor; + /** + *Submission was prepared for a different round. + */ + PreDispatchDifferentRound: PlainDescriptor; + }; + VoterList: { + /** + *A error in the list interface implementation. + */ + List: PlainDescriptor>; + /** + *Could not update a node, because the pallet is locked. + */ + Locked: PlainDescriptor; + }; + NominationPools: { + /** + *A (bonded) pool id does not exist. + */ + PoolNotFound: PlainDescriptor; + /** + *An account is not a member. + */ + PoolMemberNotFound: PlainDescriptor; + /** + *A reward pool does not exist. In all cases this is a system logic error. + */ + RewardPoolNotFound: PlainDescriptor; + /** + *A sub pool does not exist. + */ + SubPoolsNotFound: PlainDescriptor; + /** + *An account is already delegating in another pool. An account may only belong to one + *pool at a time. + */ + AccountBelongsToOtherPool: PlainDescriptor; + /** + *The member is fully unbonded (and thus cannot access the bonded and reward pool + *anymore to, for example, collect rewards). + */ + FullyUnbonding: PlainDescriptor; + /** + *The member cannot unbond further chunks due to reaching the limit. + */ + MaxUnbondingLimit: PlainDescriptor; + /** + *None of the funds can be withdrawn yet because the bonding duration has not passed. + */ + CannotWithdrawAny: PlainDescriptor; + /** + *The amount does not meet the minimum bond to either join or create a pool. + * + *The depositor can never unbond to a value less than `Pallet::depositor_min_bond`. The + *caller does not have nominating permissions for the pool. Members can never unbond to a + *value below `MinJoinBond`. + */ + MinimumBondNotMet: PlainDescriptor; + /** + *The transaction could not be executed due to overflow risk for the pool. + */ + OverflowRisk: PlainDescriptor; + /** + *A pool must be in [`PoolState::Destroying`] in order for the depositor to unbond or for + *other members to be permissionlessly unbonded. + */ + NotDestroying: PlainDescriptor; + /** + *The caller does not have nominating permissions for the pool. + */ + NotNominator: PlainDescriptor; + /** + *Either a) the caller cannot make a valid kick or b) the pool is not destroying. + */ + NotKickerOrDestroying: PlainDescriptor; + /** + *The pool is not open to join + */ + NotOpen: PlainDescriptor; + /** + *The system is maxed out on pools. + */ + MaxPools: PlainDescriptor; + /** + *Too many members in the pool or system. + */ + MaxPoolMembers: PlainDescriptor; + /** + *The pools state cannot be changed. + */ + CanNotChangeState: PlainDescriptor; + /** + *The caller does not have adequate permissions. + */ + DoesNotHavePermission: PlainDescriptor; + /** + *Metadata exceeds [`Config::MaxMetadataLen`] + */ + MetadataExceedsMaxLen: PlainDescriptor; + /** + *Some error occurred that should never happen. This should be reported to the + *maintainers. + */ + Defensive: PlainDescriptor>; + /** + *Partial unbonding now allowed permissionlessly. + */ + PartialUnbondNotAllowedPermissionlessly: PlainDescriptor; + /** + *The pool's max commission cannot be set higher than the existing value. + */ + MaxCommissionRestricted: PlainDescriptor; + /** + *The supplied commission exceeds the max allowed commission. + */ + CommissionExceedsMaximum: PlainDescriptor; + /** + *The supplied commission exceeds global maximum commission. + */ + CommissionExceedsGlobalMaximum: PlainDescriptor; + /** + *Not enough blocks have surpassed since the last commission update. + */ + CommissionChangeThrottled: PlainDescriptor; + /** + *The submitted changes to commission change rate are not allowed. + */ + CommissionChangeRateNotAllowed: PlainDescriptor; + /** + *There is no pending commission to claim. + */ + NoPendingCommission: PlainDescriptor; + /** + *No commission current has been set. + */ + NoCommissionCurrentSet: PlainDescriptor; + /** + *Pool id currently in use. + */ + PoolIdInUse: PlainDescriptor; + /** + *Pool id provided is not correct/usable. + */ + InvalidPoolId: PlainDescriptor; + /** + *Bonding extra is restricted to the exact pending reward amount. + */ + BondExtraRestricted: PlainDescriptor; + /** + *No imbalance in the ED deposit for the pool. + */ + NothingToAdjust: PlainDescriptor; + /** + *No slash pending that can be applied to the member. + */ + NothingToSlash: PlainDescriptor; + /** + *The slash amount is too low to be applied. + */ + SlashTooLow: PlainDescriptor; + /** + *The pool or member delegation has already migrated to delegate stake. + */ + AlreadyMigrated: PlainDescriptor; + /** + *The pool or member delegation has not migrated yet to delegate stake. + */ + NotMigrated: PlainDescriptor; + /** + *This call is not allowed in the current state of the pallet. + */ + NotSupported: PlainDescriptor; + /** + *Account is restricted from participation in pools. This may happen if the account is + *staking in another way already. + */ + Restricted: PlainDescriptor; + }; + FastUnstake: { + /** + *The provided Controller account was not found. + * + *This means that the given account is not bonded. + */ + NotController: PlainDescriptor; + /** + *The bonded account has already been queued. + */ + AlreadyQueued: PlainDescriptor; + /** + *The bonded account has active unlocking chunks. + */ + NotFullyBonded: PlainDescriptor; + /** + *The provided un-staker is not in the `Queue`. + */ + NotQueued: PlainDescriptor; + /** + *The provided un-staker is already in Head, and cannot deregister. + */ + AlreadyHead: PlainDescriptor; + /** + *The call is not allowed at this point because the pallet is not active. + */ + CallNotAllowed: PlainDescriptor; + }; + ConvictionVoting: { + /** + *Poll is not ongoing. + */ + NotOngoing: PlainDescriptor; + /** + *The given account did not vote on the poll. + */ + NotVoter: PlainDescriptor; + /** + *The actor has no permission to conduct the action. + */ + NoPermission: PlainDescriptor; + /** + *The actor has no permission to conduct the action right now but will do in the future. + */ + NoPermissionYet: PlainDescriptor; + /** + *The account is already delegating. + */ + AlreadyDelegating: PlainDescriptor; + /** + *The account currently has votes attached to it and the operation cannot succeed until + *these are removed through `remove_vote`. + */ + AlreadyVoting: PlainDescriptor; + /** + *Too high a balance was provided that the account cannot afford. + */ + InsufficientFunds: PlainDescriptor; + /** + *The account is not currently delegating. + */ + NotDelegating: PlainDescriptor; + /** + *Delegation to oneself makes no sense. + */ + Nonsense: PlainDescriptor; + /** + *Maximum number of votes reached. + */ + MaxVotesReached: PlainDescriptor; + /** + *The class must be supplied since it is not easily determinable from the state. + */ + ClassNeeded: PlainDescriptor; + /** + *The class ID supplied is invalid. + */ + BadClass: PlainDescriptor; + }; + Referenda: { + /** + *Referendum is not ongoing. + */ + NotOngoing: PlainDescriptor; + /** + *Referendum's decision deposit is already paid. + */ + HasDeposit: PlainDescriptor; + /** + *The track identifier given was invalid. + */ + BadTrack: PlainDescriptor; + /** + *There are already a full complement of referenda in progress for this track. + */ + Full: PlainDescriptor; + /** + *The queue of the track is empty. + */ + QueueEmpty: PlainDescriptor; + /** + *The referendum index provided is invalid in this context. + */ + BadReferendum: PlainDescriptor; + /** + *There was nothing to do in the advancement. + */ + NothingToDo: PlainDescriptor; + /** + *No track exists for the proposal origin. + */ + NoTrack: PlainDescriptor; + /** + *Any deposit cannot be refunded until after the decision is over. + */ + Unfinished: PlainDescriptor; + /** + *The deposit refunder is not the depositor. + */ + NoPermission: PlainDescriptor; + /** + *The deposit cannot be refunded since none was made. + */ + NoDeposit: PlainDescriptor; + /** + *The referendum status is invalid for this operation. + */ + BadStatus: PlainDescriptor; + /** + *The preimage does not exist. + */ + PreimageNotExist: PlainDescriptor; + /** + *The preimage is stored with a different length than the one provided. + */ + PreimageStoredWithDifferentLength: PlainDescriptor; + }; + Whitelist: { + /** + *The preimage of the call hash could not be loaded. + */ + UnavailablePreImage: PlainDescriptor; + /** + *The call could not be decoded. + */ + UndecodableCall: PlainDescriptor; + /** + *The weight of the decoded call was higher than the witness. + */ + InvalidCallWeightWitness: PlainDescriptor; + /** + *The call was not whitelisted. + */ + CallIsNotWhitelisted: PlainDescriptor; + /** + *The call was already whitelisted; No-Op. + */ + CallAlreadyWhitelisted: PlainDescriptor; + }; + Treasury: { + /** + *No proposal, bounty or spend at that index. + */ + InvalidIndex: PlainDescriptor; + /** + *Too many approvals in the queue. + */ + TooManyApprovals: PlainDescriptor; + /** + *The spend origin is valid but the amount it is allowed to spend is lower than the + *amount to be spent. + */ + InsufficientPermission: PlainDescriptor; + /** + *Proposal has not been approved. + */ + ProposalNotApproved: PlainDescriptor; + /** + *The balance of the asset kind is not convertible to the balance of the native asset. + */ + FailedToConvertBalance: PlainDescriptor; + /** + *The spend has expired and cannot be claimed. + */ + SpendExpired: PlainDescriptor; + /** + *The spend is not yet eligible for payout. + */ + EarlyPayout: PlainDescriptor; + /** + *The payment has already been attempted. + */ + AlreadyAttempted: PlainDescriptor; + /** + *There was some issue with the mechanism of payment. + */ + PayoutError: PlainDescriptor; + /** + *The payout was not yet attempted/claimed. + */ + NotAttempted: PlainDescriptor; + /** + *The payment has neither failed nor succeeded yet. + */ + Inconclusive: PlainDescriptor; + }; + DelegatedStaking: { + /** + *The account cannot perform this operation. + */ + NotAllowed: PlainDescriptor; + /** + *An existing staker cannot perform this action. + */ + AlreadyStaking: PlainDescriptor; + /** + *Reward Destination cannot be same as `Agent` account. + */ + InvalidRewardDestination: PlainDescriptor; + /** + *Delegation conditions are not met. + * + *Possible issues are + *1) Cannot delegate to self, + *2) Cannot delegate to multiple delegates. + */ + InvalidDelegation: PlainDescriptor; + /** + *The account does not have enough funds to perform the operation. + */ + NotEnoughFunds: PlainDescriptor; + /** + *Not an existing `Agent` account. + */ + NotAgent: PlainDescriptor; + /** + *Not a Delegator account. + */ + NotDelegator: PlainDescriptor; + /** + *Some corruption in internal state. + */ + BadState: PlainDescriptor; + /** + *Unapplied pending slash restricts operation on `Agent`. + */ + UnappliedSlash: PlainDescriptor; + /** + *`Agent` has no pending slash to be applied. + */ + NothingToSlash: PlainDescriptor; + /** + *Failed to withdraw amount from Core Staking. + */ + WithdrawFailed: PlainDescriptor; + /** + *Operation not supported by this pallet. + */ + NotSupported: PlainDescriptor; + }; + Configuration: { + /** + *The new value for a configuration parameter is invalid. + */ + InvalidNewValue: PlainDescriptor; + }; + ParaInclusion: { + /** + *Validator index out of bounds. + */ + ValidatorIndexOutOfBounds: PlainDescriptor; + /** + *Candidate submitted but para not scheduled. + */ + UnscheduledCandidate: PlainDescriptor; + /** + *Head data exceeds the configured maximum. + */ + HeadDataTooLarge: PlainDescriptor; + /** + *Code upgrade prematurely. + */ + PrematureCodeUpgrade: PlainDescriptor; + /** + *Output code is too large + */ + NewCodeTooLarge: PlainDescriptor; + /** + *The candidate's relay-parent was not allowed. Either it was + *not recent enough or it didn't advance based on the last parachain block. + */ + DisallowedRelayParent: PlainDescriptor; + /** + *Failed to compute group index for the core: either it's out of bounds + *or the relay parent doesn't belong to the current session. + */ + InvalidAssignment: PlainDescriptor; + /** + *Invalid group index in core assignment. + */ + InvalidGroupIndex: PlainDescriptor; + /** + *Insufficient (non-majority) backing. + */ + InsufficientBacking: PlainDescriptor; + /** + *Invalid (bad signature, unknown validator, etc.) backing. + */ + InvalidBacking: PlainDescriptor; + /** + *The validation data hash does not match expected. + */ + ValidationDataHashMismatch: PlainDescriptor; + /** + *The downward message queue is not processed correctly. + */ + IncorrectDownwardMessageHandling: PlainDescriptor; + /** + *At least one upward message sent does not pass the acceptance criteria. + */ + InvalidUpwardMessages: PlainDescriptor; + /** + *The candidate didn't follow the rules of HRMP watermark advancement. + */ + HrmpWatermarkMishandling: PlainDescriptor; + /** + *The HRMP messages sent by the candidate is not valid. + */ + InvalidOutboundHrmp: PlainDescriptor; + /** + *The validation code hash of the candidate is not valid. + */ + InvalidValidationCodeHash: PlainDescriptor; + /** + *The `para_head` hash in the candidate descriptor doesn't match the hash of the actual + *para head in the commitments. + */ + ParaHeadMismatch: PlainDescriptor; + }; + ParaInherent: { + /** + *Inclusion inherent called more than once per block. + */ + TooManyInclusionInherents: PlainDescriptor; + /** + *The hash of the submitted parent header doesn't correspond to the saved block hash of + *the parent. + */ + InvalidParentHeader: PlainDescriptor; + /** + *Inherent data was filtered during execution. This should have only been done + *during creation. + */ + InherentDataFilteredDuringExecution: PlainDescriptor; + /** + *Too many candidates supplied. + */ + UnscheduledCandidate: PlainDescriptor; + }; + Paras: { + /** + *Para is not registered in our system. + */ + NotRegistered: PlainDescriptor; + /** + *Para cannot be onboarded because it is already tracked by our system. + */ + CannotOnboard: PlainDescriptor; + /** + *Para cannot be offboarded at this time. + */ + CannotOffboard: PlainDescriptor; + /** + *Para cannot be upgraded to a lease holding parachain. + */ + CannotUpgrade: PlainDescriptor; + /** + *Para cannot be downgraded to an on-demand parachain. + */ + CannotDowngrade: PlainDescriptor; + /** + *The statement for PVF pre-checking is stale. + */ + PvfCheckStatementStale: PlainDescriptor; + /** + *The statement for PVF pre-checking is for a future session. + */ + PvfCheckStatementFuture: PlainDescriptor; + /** + *Claimed validator index is out of bounds. + */ + PvfCheckValidatorIndexOutOfBounds: PlainDescriptor; + /** + *The signature for the PVF pre-checking is invalid. + */ + PvfCheckInvalidSignature: PlainDescriptor; + /** + *The given validator already has cast a vote. + */ + PvfCheckDoubleVote: PlainDescriptor; + /** + *The given PVF does not exist at the moment of process a vote. + */ + PvfCheckSubjectInvalid: PlainDescriptor; + /** + *Parachain cannot currently schedule a code upgrade. + */ + CannotUpgradeCode: PlainDescriptor; + /** + *Invalid validation code size. + */ + InvalidCode: PlainDescriptor; + /** + *No upgrade authorized. + */ + NothingAuthorized: PlainDescriptor; + /** + *The submitted code is not authorized. + */ + Unauthorized: PlainDescriptor; + /** + *Invalid block number. + */ + InvalidBlockNumber: PlainDescriptor; + }; + Hrmp: { + /** + *The sender tried to open a channel to themselves. + */ + OpenHrmpChannelToSelf: PlainDescriptor; + /** + *The recipient is not a valid para. + */ + OpenHrmpChannelInvalidRecipient: PlainDescriptor; + /** + *The requested capacity is zero. + */ + OpenHrmpChannelZeroCapacity: PlainDescriptor; + /** + *The requested capacity exceeds the global limit. + */ + OpenHrmpChannelCapacityExceedsLimit: PlainDescriptor; + /** + *The requested maximum message size is 0. + */ + OpenHrmpChannelZeroMessageSize: PlainDescriptor; + /** + *The open request requested the message size that exceeds the global limit. + */ + OpenHrmpChannelMessageSizeExceedsLimit: PlainDescriptor; + /** + *The channel already exists + */ + OpenHrmpChannelAlreadyExists: PlainDescriptor; + /** + *There is already a request to open the same channel. + */ + OpenHrmpChannelAlreadyRequested: PlainDescriptor; + /** + *The sender already has the maximum number of allowed outbound channels. + */ + OpenHrmpChannelLimitExceeded: PlainDescriptor; + /** + *The channel from the sender to the origin doesn't exist. + */ + AcceptHrmpChannelDoesntExist: PlainDescriptor; + /** + *The channel is already confirmed. + */ + AcceptHrmpChannelAlreadyConfirmed: PlainDescriptor; + /** + *The recipient already has the maximum number of allowed inbound channels. + */ + AcceptHrmpChannelLimitExceeded: PlainDescriptor; + /** + *The origin tries to close a channel where it is neither the sender nor the recipient. + */ + CloseHrmpChannelUnauthorized: PlainDescriptor; + /** + *The channel to be closed doesn't exist. + */ + CloseHrmpChannelDoesntExist: PlainDescriptor; + /** + *The channel close request is already requested. + */ + CloseHrmpChannelAlreadyUnderway: PlainDescriptor; + /** + *Canceling is requested by neither the sender nor recipient of the open channel request. + */ + CancelHrmpOpenChannelUnauthorized: PlainDescriptor; + /** + *The open request doesn't exist. + */ + OpenHrmpChannelDoesntExist: PlainDescriptor; + /** + *Cannot cancel an HRMP open channel request because it is already confirmed. + */ + OpenHrmpChannelAlreadyConfirmed: PlainDescriptor; + /** + *The provided witness data is wrong. + */ + WrongWitness: PlainDescriptor; + /** + *The channel between these two chains cannot be authorized. + */ + ChannelCreationNotAuthorized: PlainDescriptor; + }; + ParasDisputes: { + /** + *Duplicate dispute statement sets provided. + */ + DuplicateDisputeStatementSets: PlainDescriptor; + /** + *Ancient dispute statement provided. + */ + AncientDisputeStatement: PlainDescriptor; + /** + *Validator index on statement is out of bounds for session. + */ + ValidatorIndexOutOfBounds: PlainDescriptor; + /** + *Invalid signature on statement. + */ + InvalidSignature: PlainDescriptor; + /** + *Validator vote submitted more than once to dispute. + */ + DuplicateStatement: PlainDescriptor; + /** + *A dispute where there are only votes on one side. + */ + SingleSidedDispute: PlainDescriptor; + /** + *A dispute vote from a malicious backer. + */ + MaliciousBacker: PlainDescriptor; + /** + *No backing votes were provides along dispute statements. + */ + MissingBackingVotes: PlainDescriptor; + /** + *Unconfirmed dispute statement sets provided. + */ + UnconfirmedDispute: PlainDescriptor; + }; + ParasSlashing: { + /** + *The key ownership proof is invalid. + */ + InvalidKeyOwnershipProof: PlainDescriptor; + /** + *The session index is too old or invalid. + */ + InvalidSessionIndex: PlainDescriptor; + /** + *The candidate hash is invalid. + */ + InvalidCandidateHash: PlainDescriptor; + /** + *There is no pending slash for the given validator index and time + *slot. + */ + InvalidValidatorIndex: PlainDescriptor; + /** + *The validator index does not match the validator id. + */ + ValidatorIndexIdMismatch: PlainDescriptor; + /** + *The given slashing report is valid but already previously reported. + */ + DuplicateSlashingReport: PlainDescriptor; + }; + OnDemandAssignmentProvider: { + /** + *The order queue is full, `place_order` will not continue. + */ + QueueFull: PlainDescriptor; + /** + *The current spot price is higher than the max amount specified in the `place_order` + *call, making it invalid. + */ + SpotPriceHigherThanMaxAmount: PlainDescriptor; + /** + *The account doesn't have enough credits to purchase on-demand coretime. + */ + InsufficientCredits: PlainDescriptor; + }; + CoretimeAssignmentProvider: { + /** + + */ + AssignmentsEmpty: PlainDescriptor; + /** + *assign_core is only allowed to append new assignments at the end of already existing + *ones or update the last entry. + */ + DisallowedInsert: PlainDescriptor; + }; + Registrar: { + /** + *The ID is not registered. + */ + NotRegistered: PlainDescriptor; + /** + *The ID is already registered. + */ + AlreadyRegistered: PlainDescriptor; + /** + *The caller is not the owner of this Id. + */ + NotOwner: PlainDescriptor; + /** + *Invalid para code size. + */ + CodeTooLarge: PlainDescriptor; + /** + *Invalid para head data size. + */ + HeadDataTooLarge: PlainDescriptor; + /** + *Para is not a Parachain. + */ + NotParachain: PlainDescriptor; + /** + *Para is not a Parathread (on-demand parachain). + */ + NotParathread: PlainDescriptor; + /** + *Cannot deregister para + */ + CannotDeregister: PlainDescriptor; + /** + *Cannot schedule downgrade of lease holding parachain to on-demand parachain + */ + CannotDowngrade: PlainDescriptor; + /** + *Cannot schedule upgrade of on-demand parachain to lease holding parachain + */ + CannotUpgrade: PlainDescriptor; + /** + *Para is locked from manipulation by the manager. Must use parachain or relay chain + *governance. + */ + ParaLocked: PlainDescriptor; + /** + *The ID given for registration has not been reserved. + */ + NotReserved: PlainDescriptor; + /** + *The validation code is invalid. + */ + InvalidCode: PlainDescriptor; + /** + *Cannot perform a parachain slot / lifecycle swap. Check that the state of both paras + *are correct for the swap to work. + */ + CannotSwap: PlainDescriptor; + }; + Slots: { + /** + *The parachain ID is not onboarding. + */ + ParaNotOnboarding: PlainDescriptor; + /** + *There was an error with the lease. + */ + LeaseError: PlainDescriptor; + }; + ParasSudoWrapper: { + /** + *The specified parachain is not registered. + */ + ParaDoesntExist: PlainDescriptor; + /** + *The specified parachain is already registered. + */ + ParaAlreadyExists: PlainDescriptor; + /** + *A DMP message couldn't be sent because it exceeds the maximum size allowed for a + *downward message. + */ + ExceedsMaxMessageSize: PlainDescriptor; + /** + *A DMP message couldn't be sent because the destination is unreachable. + */ + Unroutable: PlainDescriptor; + /** + *Could not schedule para cleanup. + */ + CouldntCleanup: PlainDescriptor; + /** + *Not a parathread (on-demand parachain). + */ + NotParathread: PlainDescriptor; + /** + *Not a lease holding parachain. + */ + NotParachain: PlainDescriptor; + /** + *Cannot upgrade on-demand parachain to lease holding parachain. + */ + CannotUpgrade: PlainDescriptor; + /** + *Cannot downgrade lease holding parachain to on-demand. + */ + CannotDowngrade: PlainDescriptor; + /** + *There are more cores than supported by the runtime. + */ + TooManyCores: PlainDescriptor; + }; + Auctions: { + /** + *This auction is already in progress. + */ + AuctionInProgress: PlainDescriptor; + /** + *The lease period is in the past. + */ + LeasePeriodInPast: PlainDescriptor; + /** + *Para is not registered + */ + ParaNotRegistered: PlainDescriptor; + /** + *Not a current auction. + */ + NotCurrentAuction: PlainDescriptor; + /** + *Not an auction. + */ + NotAuction: PlainDescriptor; + /** + *Auction has already ended. + */ + AuctionEnded: PlainDescriptor; + /** + *The para is already leased out for part of this range. + */ + AlreadyLeasedOut: PlainDescriptor; + }; + Crowdloan: { + /** + *The current lease period is more than the first lease period. + */ + FirstPeriodInPast: PlainDescriptor; + /** + *The first lease period needs to at least be less than 3 `max_value`. + */ + FirstPeriodTooFarInFuture: PlainDescriptor; + /** + *Last lease period must be greater than first lease period. + */ + LastPeriodBeforeFirstPeriod: PlainDescriptor; + /** + *The last lease period cannot be more than 3 periods after the first period. + */ + LastPeriodTooFarInFuture: PlainDescriptor; + /** + *The campaign ends before the current block number. The end must be in the future. + */ + CannotEndInPast: PlainDescriptor; + /** + *The end date for this crowdloan is not sensible. + */ + EndTooFarInFuture: PlainDescriptor; + /** + *There was an overflow. + */ + Overflow: PlainDescriptor; + /** + *The contribution was below the minimum, `MinContribution`. + */ + ContributionTooSmall: PlainDescriptor; + /** + *Invalid fund index. + */ + InvalidParaId: PlainDescriptor; + /** + *Contributions exceed maximum amount. + */ + CapExceeded: PlainDescriptor; + /** + *The contribution period has already ended. + */ + ContributionPeriodOver: PlainDescriptor; + /** + *The origin of this call is invalid. + */ + InvalidOrigin: PlainDescriptor; + /** + *This crowdloan does not correspond to a parachain. + */ + NotParachain: PlainDescriptor; + /** + *This parachain lease is still active and retirement cannot yet begin. + */ + LeaseActive: PlainDescriptor; + /** + *This parachain's bid or lease is still active and withdraw cannot yet begin. + */ + BidOrLeaseActive: PlainDescriptor; + /** + *The crowdloan has not yet ended. + */ + FundNotEnded: PlainDescriptor; + /** + *There are no contributions stored in this crowdloan. + */ + NoContributions: PlainDescriptor; + /** + *The crowdloan is not ready to dissolve. Potentially still has a slot or in retirement + *period. + */ + NotReadyToDissolve: PlainDescriptor; + /** + *Invalid signature. + */ + InvalidSignature: PlainDescriptor; + /** + *The provided memo is too large. + */ + MemoTooLarge: PlainDescriptor; + /** + *The fund is already in `NewRaise` + */ + AlreadyInNewRaise: PlainDescriptor; + /** + *No contributions allowed during the VRF delay + */ + VrfDelayInProgress: PlainDescriptor; + /** + *A lease period has not started yet, due to an offset in the starting block. + */ + NoLeasePeriod: PlainDescriptor; + }; + AssignedSlots: { + /** + *The specified parachain is not registered. + */ + ParaDoesntExist: PlainDescriptor; + /** + *Not a parathread (on-demand parachain). + */ + NotParathread: PlainDescriptor; + /** + *Cannot upgrade on-demand parachain to lease holding + *parachain. + */ + CannotUpgrade: PlainDescriptor; + /** + *Cannot downgrade lease holding parachain to + *on-demand. + */ + CannotDowngrade: PlainDescriptor; + /** + *Permanent or Temporary slot already assigned. + */ + SlotAlreadyAssigned: PlainDescriptor; + /** + *Permanent or Temporary slot has not been assigned. + */ + SlotNotAssigned: PlainDescriptor; + /** + *An ongoing lease already exists. + */ + OngoingLeaseExists: PlainDescriptor; + /** + + */ + MaxPermanentSlotsExceeded: PlainDescriptor; + /** + + */ + MaxTemporarySlotsExceeded: PlainDescriptor; + }; + Coretime: { + /** + *The paraid making the call is not the coretime brokerage system parachain. + */ + NotBroker: PlainDescriptor; + /** + *Requested revenue information `when` parameter was in the future from the current + *block height. + */ + RequestedFutureRevenue: PlainDescriptor; + /** + *Failed to transfer assets to the coretime chain + */ + AssetTransferFailed: PlainDescriptor; + }; + StakingAhClient: { + /** + *Could not process incoming message because incoming messages are blocked. + */ + Blocked: PlainDescriptor; + }; + MultiBlockMigrations: { + /** + *The operation cannot complete since some MBMs are ongoing. + */ + Ongoing: PlainDescriptor; + }; + XcmPallet: { + /** + *The desired destination was unreachable, generally because there is a no way of routing + *to it. + */ + Unreachable: PlainDescriptor; + /** + *There was some other issue (i.e. not to do with routing) in sending the message. + *Perhaps a lack of space for buffering the message. + */ + SendFailure: PlainDescriptor; + /** + *The message execution fails the filter. + */ + Filtered: PlainDescriptor; + /** + *The message's weight could not be determined. + */ + UnweighableMessage: PlainDescriptor; + /** + *The destination `Location` provided cannot be inverted. + */ + DestinationNotInvertible: PlainDescriptor; + /** + *The assets to be sent are empty. + */ + Empty: PlainDescriptor; + /** + *Could not re-anchor the assets to declare the fees for the destination chain. + */ + CannotReanchor: PlainDescriptor; + /** + *Too many assets have been attempted for transfer. + */ + TooManyAssets: PlainDescriptor; + /** + *Origin is invalid for sending. + */ + InvalidOrigin: PlainDescriptor; + /** + *The version of the `Versioned` value used is not able to be interpreted. + */ + BadVersion: PlainDescriptor; + /** + *The given location could not be used (e.g. because it cannot be expressed in the + *desired version of XCM). + */ + BadLocation: PlainDescriptor; + /** + *The referenced subscription could not be found. + */ + NoSubscription: PlainDescriptor; + /** + *The location is invalid since it already has a subscription from us. + */ + AlreadySubscribed: PlainDescriptor; + /** + *Could not check-out the assets for teleportation to the destination chain. + */ + CannotCheckOutTeleport: PlainDescriptor; + /** + *The owner does not own (all) of the asset that they wish to do the operation on. + */ + LowBalance: PlainDescriptor; + /** + *The asset owner has too many locks on the asset. + */ + TooManyLocks: PlainDescriptor; + /** + *The given account is not an identifiable sovereign account for any location. + */ + AccountNotSovereign: PlainDescriptor; + /** + *The operation required fees to be paid which the initiator could not meet. + */ + FeesNotMet: PlainDescriptor; + /** + *A remote lock with the corresponding data could not be found. + */ + LockNotFound: PlainDescriptor; + /** + *The unlock operation cannot succeed because there are still consumers of the lock. + */ + InUse: PlainDescriptor; + /** + *Invalid asset, reserve chain could not be determined for it. + */ + InvalidAssetUnknownReserve: PlainDescriptor; + /** + *Invalid asset, do not support remote asset reserves with different fees reserves. + */ + InvalidAssetUnsupportedReserve: PlainDescriptor; + /** + *Too many assets with different reserve locations have been attempted for transfer. + */ + TooManyReserves: PlainDescriptor; + /** + *Local XCM execution incomplete. + */ + LocalExecutionIncomplete: PlainDescriptor; + /** + *Too many locations authorized to alias origin. + */ + TooManyAuthorizedAliases: PlainDescriptor; + /** + *Expiry block number is in the past. + */ + ExpiresInPast: PlainDescriptor; + /** + *The alias to remove authorization for was not found. + */ + AliasNotFound: PlainDescriptor; + /** + *Local XCM execution incomplete with the actual XCM error and the index of the + *instruction that caused the error. + */ + LocalExecutionIncompleteWithError: PlainDescriptor>; + }; + MessageQueue: { + /** + *Page is not reapable because it has items remaining to be processed and is not old + *enough. + */ + NotReapable: PlainDescriptor; + /** + *Page to be reaped does not exist. + */ + NoPage: PlainDescriptor; + /** + *The referenced message could not be found. + */ + NoMessage: PlainDescriptor; + /** + *The message was already processed and cannot be processed again. + */ + AlreadyProcessed: PlainDescriptor; + /** + *The message is queued for future execution. + */ + Queued: PlainDescriptor; + /** + *There is temporarily not enough weight to continue servicing messages. + */ + InsufficientWeight: PlainDescriptor; + /** + *This message is temporarily unprocessable. + * + *Such errors are expected, but not guaranteed, to resolve themselves eventually through + *retrying. + */ + TemporarilyUnprocessable: PlainDescriptor; + /** + *The queue is paused and no message can be executed from it. + * + *This can change at any time and may resolve in the future by re-trying. + */ + QueuePaused: PlainDescriptor; + /** + *Another call is in progress and needs to finish before this call can happen. + */ + RecursiveDisallowed: PlainDescriptor; + }; + AssetRate: { + /** + *The given asset ID is unknown. + */ + UnknownAssetKind: PlainDescriptor; + /** + *The given asset ID already has an assigned conversion rate and cannot be re-created. + */ + AlreadyExists: PlainDescriptor; + /** + *Overflow ocurred when calculating the inverse rate. + */ + Overflow: PlainDescriptor; + }; + MetaTx: { + /** + *Invalid proof (e.g. signature). + */ + BadProof: PlainDescriptor; + /** + *The meta transaction is not yet valid (e.g. nonce too high). + */ + Future: PlainDescriptor; + /** + *The meta transaction is outdated (e.g. nonce too low). + */ + Stale: PlainDescriptor; + /** + *The meta transactions's birth block is ancient. + */ + AncientBirthBlock: PlainDescriptor; + /** + *The transaction extension did not authorize any origin. + */ + UnknownOrigin: PlainDescriptor; + /** + *The meta transaction is invalid. + */ + Invalid: PlainDescriptor; + }; + Beefy: { + /** + *A key ownership proof provided as part of an equivocation report is invalid. + */ + InvalidKeyOwnershipProof: PlainDescriptor; + /** + *A double voting proof provided as part of an equivocation report is invalid. + */ + InvalidDoubleVotingProof: PlainDescriptor; + /** + *A fork voting proof provided as part of an equivocation report is invalid. + */ + InvalidForkVotingProof: PlainDescriptor; + /** + *A future block voting proof provided as part of an equivocation report is invalid. + */ + InvalidFutureBlockVotingProof: PlainDescriptor; + /** + *The session of the equivocation proof is invalid + */ + InvalidEquivocationProofSession: PlainDescriptor; + /** + *A given equivocation report is valid but already previously reported. + */ + DuplicateOffenceReport: PlainDescriptor; + /** + *Submitted configuration is invalid. + */ + InvalidConfiguration: PlainDescriptor; + }; +}; +type IConstants = { + System: { + /** + * Block & extrinsics weights: base values and limits. + */ + BlockWeights: PlainDescriptor>; + /** + * The maximum length of a block (in bytes). + */ + BlockLength: PlainDescriptor>; + /** + * Maximum number of block number to block hash mappings to keep (oldest pruned first). + */ + BlockHashCount: PlainDescriptor; + /** + * The weight of runtime database operations the runtime can invoke. + */ + DbWeight: PlainDescriptor>; + /** + * Get the chain's in-code version. + */ + Version: PlainDescriptor>; + /** + * The designated SS58 prefix of this chain. + * + * This replaces the "ss58Format" property declared in the chain spec. Reason is + * that the runtime should know about the prefix in order to make use of it as + * an identifier of the chain. + */ + SS58Prefix: PlainDescriptor; + }; + Babe: { + /** + * The amount of time, in slots, that each epoch should last. + * NOTE: Currently it is not possible to change the epoch duration after + * the chain has started. Attempting to do so will brick block production. + */ + EpochDuration: PlainDescriptor; + /** + * The expected average block time at which BABE should be creating + * blocks. Since BABE is probabilistic it is not trivial to figure out + * what the expected average block time should be based on the slot + * duration and the security parameter `c` (where `1 - c` represents + * the probability of a slot being empty). + */ + ExpectedBlockTime: PlainDescriptor; + /** + * Max number of authorities allowed + */ + MaxAuthorities: PlainDescriptor; + /** + * The maximum number of nominators for each validator. + */ + MaxNominators: PlainDescriptor; + }; + Timestamp: { + /** + * The minimum period between blocks. + * + * Be aware that this is different to the *expected* period that the block production + * apparatus provides. Your chosen consensus system will generally work with this to + * determine a sensible block time. For example, in the Aura pallet it will be double this + * period on default settings. + */ + MinimumPeriod: PlainDescriptor; + }; + Indices: { + /** + * The deposit needed for reserving an index. + */ + Deposit: PlainDescriptor; + }; + Balances: { + /** + * The minimum amount required to keep an account open. MUST BE GREATER THAN ZERO! + * + * If you *really* need it to be zero, you can enable the feature `insecure_zero_ed` for + * this pallet. However, you do so at your own risk: this will open up a major DoS vector. + * In case you have multiple sources of provider references, you may also get unexpected + * behaviour if you set this to zero. + * + * Bottom line: Do yourself a favour and make it at least one! + */ + ExistentialDeposit: PlainDescriptor; + /** + * The maximum number of locks that should exist on an account. + * Not strictly enforced, but used for weight estimation. + * + * Use of locks is deprecated in favour of freezes. See `https://github.com/paritytech/substrate/pull/12951/` + */ + MaxLocks: PlainDescriptor; + /** + * The maximum number of named reserves that can exist on an account. + * + * Use of reserves is deprecated in favour of holds. See `https://github.com/paritytech/substrate/pull/12951/` + */ + MaxReserves: PlainDescriptor; + /** + * The maximum number of individual freeze locks that can exist on an account at any time. + */ + MaxFreezes: PlainDescriptor; + }; + TransactionPayment: { + /** + * A fee multiplier for `Operational` extrinsics to compute "virtual tip" to boost their + * `priority` + * + * This value is multiplied by the `final_fee` to obtain a "virtual tip" that is later + * added to a tip component in regular `priority` calculations. + * It means that a `Normal` transaction can front-run a similarly-sized `Operational` + * extrinsic (with no tip), by including a tip value greater than the virtual tip. + * + * ```rust,ignore + * // For `Normal` + * let priority = priority_calc(tip); + * + * // For `Operational` + * let virtual_tip = (inclusion_fee + tip) * OperationalFeeMultiplier; + * let priority = priority_calc(tip + virtual_tip); + * ``` + * + * Note that since we use `final_fee` the multiplier applies also to the regular `tip` + * sent with the transaction. So, not only does the transaction get a priority bump based + * on the `inclusion_fee`, but we also amplify the impact of tips applied to `Operational` + * transactions. + */ + OperationalFeeMultiplier: PlainDescriptor; + }; + Staking: { + /** + * Number of eras to keep in history. + * + * Following information is kept for eras in `[current_era - + * HistoryDepth, current_era]`: `ErasStakers`, `ErasStakersClipped`, + * `ErasValidatorPrefs`, `ErasValidatorReward`, `ErasRewardPoints`, + * `ErasTotalStake`, `ErasStartSessionIndex`, `ClaimedRewards`, `ErasStakersPaged`, + * `ErasStakersOverview`. + * + * Must be more than the number of eras delayed by session. + * I.e. active era must always be in history. I.e. `active_era > + * current_era - history_depth` must be guaranteed. + * + * If migrating an existing pallet from storage value to config value, + * this should be set to same value or greater as in storage. + * + * Note: `HistoryDepth` is used as the upper bound for the `BoundedVec` + * item `StakingLedger.legacy_claimed_rewards`. Setting this value lower than + * the existing value can lead to inconsistencies in the + * `StakingLedger` and will need to be handled properly in a migration. + * The test `reducing_history_depth_abrupt` shows this effect. + */ + HistoryDepth: PlainDescriptor; + /** + * Number of sessions per era. + */ + SessionsPerEra: PlainDescriptor; + /** + * Number of eras that staked funds must remain bonded for. + */ + BondingDuration: PlainDescriptor; + /** + * Number of eras that slashes are deferred by, after computation. + * + * This should be less than the bonding duration. Set to 0 if slashes + * should be applied immediately, without opportunity for intervention. + */ + SlashDeferDuration: PlainDescriptor; + /** + * The maximum size of each `T::ExposurePage`. + * + * An `ExposurePage` is weakly bounded to a maximum of `MaxExposurePageSize` + * nominators. + * + * For older non-paged exposure, a reward payout was restricted to the top + * `MaxExposurePageSize` nominators. This is to limit the i/o cost for the + * nominator payout. + * + * Note: `MaxExposurePageSize` is used to bound `ClaimedRewards` and is unsafe to reduce + * without handling it in a migration. + */ + MaxExposurePageSize: PlainDescriptor; + /** + * The absolute maximum of winner validators this pallet should return. + */ + MaxValidatorSet: PlainDescriptor; + /** + * The maximum number of `unlocking` chunks a [`StakingLedger`] can + * have. Effectively determines how many unique eras a staker may be + * unbonding in. + * + * Note: `MaxUnlockingChunks` is used as the upper bound for the + * `BoundedVec` item `StakingLedger.unlocking`. Setting this value + * lower than the existing value can lead to inconsistencies in the + * `StakingLedger` and will need to be handled properly in a runtime + * migration. The test `reducing_max_unlocking_chunks_abrupt` shows + * this effect. + */ + MaxUnlockingChunks: PlainDescriptor; + }; + Session: { + /** + * The amount to be held when setting keys. + */ + KeyDeposit: PlainDescriptor; + }; + Grandpa: { + /** + * Max Authorities in use + */ + MaxAuthorities: PlainDescriptor; + /** + * The maximum number of nominators for each validator. + */ + MaxNominators: PlainDescriptor; + /** + * The maximum number of entries to keep in the set id to session index mapping. + * + * Since the `SetIdSession` map is only used for validating equivocations this + * value should relate to the bonding duration of whatever staking system is + * being used (if any). If equivocation handling is not enabled then this value + * can be zero. + */ + MaxSetIdSessionEntries: PlainDescriptor; + }; + Utility: { + /** + * The limit on the number of batched calls. + */ + batched_calls_limit: PlainDescriptor; + }; + Identity: { + /** + * The amount held on deposit for a registered identity. + */ + BasicDeposit: PlainDescriptor; + /** + * The amount held on deposit per encoded byte for a registered identity. + */ + ByteDeposit: PlainDescriptor; + /** + * The amount held on deposit per registered username. This value should change only in + * runtime upgrades with proper migration of existing deposits. + */ + UsernameDeposit: PlainDescriptor; + /** + * The amount held on deposit for a registered subaccount. This should account for the fact + * that one storage item's value will increase by the size of an account ID, and there will + * be another trie item whose value is the size of an account ID plus 32 bytes. + */ + SubAccountDeposit: PlainDescriptor; + /** + * The maximum number of sub-accounts allowed per identified account. + */ + MaxSubAccounts: PlainDescriptor; + /** + * Maximum number of registrars allowed in the system. Needed to bound the complexity + * of, e.g., updating judgements. + */ + MaxRegistrars: PlainDescriptor; + /** + * The number of blocks within which a username grant must be accepted. + */ + PendingUsernameExpiration: PlainDescriptor; + /** + * The number of blocks that must pass to enable the permanent deletion of a username by + * its respective authority. + */ + UsernameGracePeriod: PlainDescriptor; + /** + * The maximum length of a suffix. + */ + MaxSuffixLength: PlainDescriptor; + /** + * The maximum length of a username, including its suffix and any system-added delimiters. + */ + MaxUsernameLength: PlainDescriptor; + }; + Recovery: { + /** + * The base amount of currency needed to reserve for creating a recovery configuration. + * + * This is held for an additional storage item whose value size is + * `2 + sizeof(BlockNumber, Balance)` bytes. + */ + ConfigDepositBase: PlainDescriptor; + /** + * The amount of currency needed per additional user when creating a recovery + * configuration. + * + * This is held for adding `sizeof(AccountId)` bytes more into a pre-existing storage + * value. + */ + FriendDepositFactor: PlainDescriptor; + /** + * The maximum amount of friends allowed in a recovery configuration. + * + * NOTE: The threshold programmed in this Pallet uses u16, so it does + * not really make sense to have a limit here greater than u16::MAX. + * But also, that is a lot more than you should probably set this value + * to anyway... + */ + MaxFriends: PlainDescriptor; + /** + * The base amount of currency needed to reserve for starting a recovery. + * + * This is primarily held for deterring malicious recovery attempts, and should + * have a value large enough that a bad actor would choose not to place this + * deposit. It also acts to fund additional storage item whose value size is + * `sizeof(BlockNumber, Balance + T * AccountId)` bytes. Where T is a configurable + * threshold. + */ + RecoveryDeposit: PlainDescriptor; + }; + Vesting: { + /** + * The minimum amount transferred to call `vested_transfer`. + */ + MinVestedTransfer: PlainDescriptor; + /** + + */ + MaxVestingSchedules: PlainDescriptor; + }; + Scheduler: { + /** + * The maximum weight that may be scheduled per block for any dispatchables. + */ + MaximumWeight: PlainDescriptor>; + /** + * The maximum number of scheduled calls in the queue for a single block. + * + * NOTE: + * + Dependent pallets' benchmarks might require a higher limit for the setting. Set a + * higher limit under `runtime-benchmarks` feature. + */ + MaxScheduledPerBlock: PlainDescriptor; + }; + Proxy: { + /** + * The base amount of currency needed to reserve for creating a proxy. + * + * This is held for an additional storage item whose value size is + * `sizeof(Balance)` bytes and whose key size is `sizeof(AccountId)` bytes. + */ + ProxyDepositBase: PlainDescriptor; + /** + * The amount of currency needed per proxy added. + * + * This is held for adding 32 bytes plus an instance of `ProxyType` more into a + * pre-existing storage value. Thus, when configuring `ProxyDepositFactor` one should take + * into account `32 + proxy_type.encode().len()` bytes of data. + */ + ProxyDepositFactor: PlainDescriptor; + /** + * The maximum amount of proxies allowed for a single account. + */ + MaxProxies: PlainDescriptor; + /** + * The maximum amount of time-delayed announcements that are allowed to be pending. + */ + MaxPending: PlainDescriptor; + /** + * The base amount of currency needed to reserve for creating an announcement. + * + * This is held when a new storage item holding a `Balance` is created (typically 16 + * bytes). + */ + AnnouncementDepositBase: PlainDescriptor; + /** + * The amount of currency needed per announcement made. + * + * This is held for adding an `AccountId`, `Hash` and `BlockNumber` (typically 68 bytes) + * into a pre-existing storage value. + */ + AnnouncementDepositFactor: PlainDescriptor; + }; + Multisig: { + /** + * The base amount of currency needed to reserve for creating a multisig execution or to + * store a dispatch call for later. + * + * This is held for an additional storage item whose value size is + * `4 + sizeof((BlockNumber, Balance, AccountId))` bytes and whose key size is + * `32 + sizeof(AccountId)` bytes. + */ + DepositBase: PlainDescriptor; + /** + * The amount of currency needed per unit threshold when creating a multisig execution. + * + * This is held for adding 32 bytes more into a pre-existing storage value. + */ + DepositFactor: PlainDescriptor; + /** + * The maximum amount of signatories allowed in the multisig. + */ + MaxSignatories: PlainDescriptor; + }; + ElectionProviderMultiPhase: { + /** + * The minimum amount of improvement to the solution score that defines a solution as + * "better" in the Signed phase. + */ + BetterSignedThreshold: PlainDescriptor; + /** + * The repeat threshold of the offchain worker. + * + * For example, if it is 5, that means that at least 5 blocks will elapse between attempts + * to submit the worker's solution. + */ + OffchainRepeat: PlainDescriptor; + /** + * The priority of the unsigned transaction submitted in the unsigned-phase + */ + MinerTxPriority: PlainDescriptor; + /** + * Maximum number of signed submissions that can be queued. + * + * It is best to avoid adjusting this during an election, as it impacts downstream data + * structures. In particular, `SignedSubmissionIndices` is bounded on this value. If you + * update this value during an election, you _must_ ensure that + * `SignedSubmissionIndices.len()` is less than or equal to the new value. Otherwise, + * attempts to submit new solutions may cause a runtime panic. + */ + SignedMaxSubmissions: PlainDescriptor; + /** + * Maximum weight of a signed solution. + * + * If [`Config::MinerConfig`] is being implemented to submit signed solutions (outside of + * this pallet), then [`MinerConfig::solution_weight`] is used to compare against + * this value. + */ + SignedMaxWeight: PlainDescriptor>; + /** + * The maximum amount of unchecked solutions to refund the call fee for. + */ + SignedMaxRefunds: PlainDescriptor; + /** + * Base reward for a signed solution + */ + SignedRewardBase: PlainDescriptor; + /** + * Per-byte deposit for a signed solution. + */ + SignedDepositByte: PlainDescriptor; + /** + * Per-weight deposit for a signed solution. + */ + SignedDepositWeight: PlainDescriptor; + /** + * Maximum number of winners that an election supports. + * + * Note: This must always be greater or equal to `T::DataProvider::desired_targets()`. + */ + MaxWinners: PlainDescriptor; + /** + * Maximum number of voters that can support a winner in an election solution. + * + * This is needed to ensure election computation is bounded. + */ + MaxBackersPerWinner: PlainDescriptor; + /** + + */ + MinerMaxLength: PlainDescriptor; + /** + + */ + MinerMaxWeight: PlainDescriptor>; + /** + + */ + MinerMaxVotesPerVoter: PlainDescriptor; + /** + + */ + MinerMaxWinners: PlainDescriptor; + }; + VoterList: { + /** + * The list of thresholds separating the various bags. + * + * Ids are separated into unsorted bags according to their score. This specifies the + * thresholds separating the bags. An id's bag is the largest bag for which the id's score + * is less than or equal to its upper threshold. + * + * When ids are iterated, higher bags are iterated completely before lower bags. This means + * that iteration is _semi-sorted_: ids of higher score tend to come before ids of lower + * score, but peer ids within a particular bag are sorted in insertion order. + * + * # Expressing the constant + * + * This constant must be sorted in strictly increasing order. Duplicate items are not + * permitted. + * + * There is an implied upper limit of `Score::MAX`; that value does not need to be + * specified within the bag. For any two threshold lists, if one ends with + * `Score::MAX`, the other one does not, and they are otherwise equal, the two + * lists will behave identically. + * + * # Calculation + * + * It is recommended to generate the set of thresholds in a geometric series, such that + * there exists some constant ratio such that `threshold[k + 1] == (threshold[k] * + * constant_ratio).max(threshold[k] + 1)` for all `k`. + * + * The helpers in the `/utils/frame/generate-bags` module can simplify this calculation. + * + * # Examples + * + * - If `BagThresholds::get().is_empty()`, then all ids are put into the same bag, and + * iteration is strictly in insertion order. + * - If `BagThresholds::get().len() == 64`, and the thresholds are determined according to + * the procedure given above, then the constant ratio is equal to 2. + * - If `BagThresholds::get().len() == 200`, and the thresholds are determined according to + * the procedure given above, then the constant ratio is approximately equal to 1.248. + * - If the threshold list begins `[1, 2, 3, ...]`, then an id with score 0 or 1 will fall + * into bag 0, an id with score 2 will fall into bag 1, etc. + * + * # Migration + * + * In the event that this list ever changes, a copy of the old bags list must be retained. + * With that `List::migrate` can be called, which will perform the appropriate migration. + */ + BagThresholds: PlainDescriptor>; + /** + * Maximum number of accounts that may be re-bagged automatically in `on_idle`. + * + * A value of `0` (obtained by configuring `type MaxAutoRebagPerBlock = ();`) disables + * the feature. + */ + MaxAutoRebagPerBlock: PlainDescriptor; + }; + NominationPools: { + /** + * The nomination pool's pallet id. + */ + PalletId: PlainDescriptor>; + /** + * The maximum pool points-to-balance ratio that an `open` pool can have. + * + * This is important in the event slashing takes place and the pool's points-to-balance + * ratio becomes disproportional. + * + * Moreover, this relates to the `RewardCounter` type as well, as the arithmetic operations + * are a function of number of points, and by setting this value to e.g. 10, you ensure + * that the total number of points in the system are at most 10 times the total_issuance of + * the chain, in the absolute worse case. + * + * For a value of 10, the threshold would be a pool points-to-balance ratio of 10:1. + * Such a scenario would also be the equivalent of the pool being 90% slashed. + */ + MaxPointsToBalance: PlainDescriptor; + /** + * The maximum number of simultaneous unbonding chunks that can exist per member. + */ + MaxUnbonding: PlainDescriptor; + }; + FastUnstake: { + /** + * Deposit to take for unstaking, to make sure we're able to slash the it in order to cover + * the costs of resources on unsuccessful unstake. + */ + Deposit: PlainDescriptor; + }; + ConvictionVoting: { + /** + * The maximum number of concurrent votes an account may have. + * + * Also used to compute weight, an overly large value can lead to extrinsics with large + * weight estimation: see `delegate` for instance. + */ + MaxVotes: PlainDescriptor; + /** + * The minimum period of vote locking. + * + * It should be no shorter than enactment period to ensure that in the case of an approval, + * those successful voters are locked into the consequences that their votes entail. + */ + VoteLockingPeriod: PlainDescriptor; + }; + Referenda: { + /** + * The minimum amount to be used as a deposit for a public referendum proposal. + */ + SubmissionDeposit: PlainDescriptor; + /** + * Maximum size of the referendum queue for a single track. + */ + MaxQueued: PlainDescriptor; + /** + * The number of blocks after submission that a referendum must begin being decided by. + * Once this passes, then anyone may cancel the referendum. + */ + UndecidingTimeout: PlainDescriptor; + /** + * Quantization level for the referendum wakeup scheduler. A higher number will result in + * fewer storage reads/writes needed for smaller voters, but also result in delays to the + * automatic referendum status changes. Explicit servicing instructions are unaffected. + */ + AlarmInterval: PlainDescriptor; + /** + * A list of tracks. + * + * Note: if the tracks are dynamic, the value in the static metadata might be inaccurate. + */ + Tracks: PlainDescriptor>; + }; + Treasury: { + /** + * Period between successive spends. + */ + SpendPeriod: PlainDescriptor; + /** + * Percentage of spare funds (if any) that are burnt per spend period. + */ + Burn: PlainDescriptor; + /** + * The treasury's pallet id, used for deriving its sovereign account ID. + */ + PalletId: PlainDescriptor>; + /** + * DEPRECATED: associated with `spend_local` call and will be removed in May 2025. + * Refer to for migration to `spend`. + * + * The maximum number of approvals that can wait in the spending queue. + * + * NOTE: This parameter is also used within the Bounties Pallet extension if enabled. + */ + MaxApprovals: PlainDescriptor; + /** + * The period during which an approved treasury spend has to be claimed. + */ + PayoutPeriod: PlainDescriptor; + /** + * Gets this pallet's derived pot account. + */ + pot_account: PlainDescriptor; + }; + DelegatedStaking: { + /** + * Injected identifier for the pallet. + */ + PalletId: PlainDescriptor>; + /** + * Fraction of the slash that is rewarded to the caller of pending slash to the agent. + */ + SlashRewardFraction: PlainDescriptor; + }; + Paras: { + /** + + */ + UnsignedPriority: PlainDescriptor; + }; + OnDemandAssignmentProvider: { + /** + * The default value for the spot traffic multiplier. + */ + TrafficDefaultValue: PlainDescriptor; + /** + * The maximum number of blocks some historical revenue + * information stored for. + */ + MaxHistoricalRevenue: PlainDescriptor; + /** + * Identifier for the internal revenue balance. + */ + PalletId: PlainDescriptor>; + }; + Registrar: { + /** + * The deposit to be paid to run a on-demand parachain. + * This should include the cost for storing the genesis head and validation code. + */ + ParaDeposit: PlainDescriptor; + /** + * The deposit to be paid per byte stored on chain. + */ + DataDepositPerByte: PlainDescriptor; + }; + Slots: { + /** + * The number of blocks over which a single period lasts. + */ + LeasePeriod: PlainDescriptor; + /** + * The number of blocks to offset each lease period by. + */ + LeaseOffset: PlainDescriptor; + }; + Auctions: { + /** + * The number of blocks over which an auction may be retroactively ended. + */ + EndingPeriod: PlainDescriptor; + /** + * The length of each sample to take during the ending period. + * + * `EndingPeriod` / `SampleLength` = Total # of Samples + */ + SampleLength: PlainDescriptor; + /** + + */ + SlotRangeCount: PlainDescriptor; + /** + + */ + LeasePeriodsPerSlot: PlainDescriptor; + }; + Crowdloan: { + /** + * `PalletId` for the crowdloan pallet. An appropriate value could be + * `PalletId(*b"py/cfund")` + */ + PalletId: PlainDescriptor>; + /** + * The minimum amount that may be contributed into a crowdloan. Should almost certainly be + * at least `ExistentialDeposit`. + */ + MinContribution: PlainDescriptor; + /** + * Max number of storage keys to remove per extrinsic call. + */ + RemoveKeysLimit: PlainDescriptor; + }; + AssignedSlots: { + /** + * The number of lease periods a permanent parachain slot lasts. + */ + PermanentSlotLeasePeriodLength: PlainDescriptor; + /** + * The number of lease periods a temporary parachain slot lasts. + */ + TemporarySlotLeasePeriodLength: PlainDescriptor; + /** + * The max number of temporary slots to be scheduled per lease periods. + */ + MaxTemporarySlotPerLeasePeriod: PlainDescriptor; + }; + Coretime: { + /** + * The ParaId of the coretime chain. + */ + BrokerId: PlainDescriptor; + /** + * The coretime chain pot location. + */ + BrokerPotLocation: PlainDescriptor; + }; + MultiBlockMigrations: { + /** + * The maximal length of an encoded cursor. + * + * A good default needs to selected such that no migration will ever have a cursor with MEL + * above this limit. This is statically checked in `integrity_test`. + */ + CursorMaxLen: PlainDescriptor; + /** + * The maximal length of an encoded identifier. + * + * A good default needs to selected such that no migration will ever have an identifier + * with MEL above this limit. This is statically checked in `integrity_test`. + */ + IdentifierMaxLen: PlainDescriptor; + }; + XcmPallet: { + /** + * This chain's Universal Location. + */ + UniversalLocation: PlainDescriptor; + /** + * The latest supported version that we advertise. Generally just set it to + * `pallet_xcm::CurrentXcmVersion`. + */ + AdvertisedXcmVersion: PlainDescriptor; + /** + * The maximum number of local XCM locks that a single account may have. + */ + MaxLockers: PlainDescriptor; + /** + * The maximum number of consumers a single remote lock may have. + */ + MaxRemoteLockConsumers: PlainDescriptor; + }; + MessageQueue: { + /** + * The size of the page; this implies the maximum message size which can be sent. + * + * A good value depends on the expected message sizes, their weights, the weight that is + * available for processing them and the maximal needed message size. The maximal message + * size is slightly lower than this as defined by [`MaxMessageLenOf`]. + */ + HeapSize: PlainDescriptor; + /** + * The maximum number of stale pages (i.e. of overweight messages) allowed before culling + * can happen. Once there are more stale pages than this, then historical pages may be + * dropped, even if they contain unprocessed overweight messages. + */ + MaxStale: PlainDescriptor; + /** + * The amount of weight (if any) which should be provided to the message queue for + * servicing enqueued items `on_initialize`. + * + * This may be legitimately `None` in the case that you will call + * `ServiceQueues::service_queues` manually or set [`Self::IdleMaxServiceWeight`] to have + * it run in `on_idle`. + */ + ServiceWeight: PlainDescriptor>; + /** + * The maximum amount of weight (if any) to be used from remaining weight `on_idle` which + * should be provided to the message queue for servicing enqueued items `on_idle`. + * Useful for parachains to process messages at the same block they are received. + * + * If `None`, it will not call `ServiceQueues::service_queues` in `on_idle`. + */ + IdleMaxServiceWeight: PlainDescriptor>; + }; + Beefy: { + /** + * The maximum number of authorities that can be added. + */ + MaxAuthorities: PlainDescriptor; + /** + * The maximum number of nominators for each validator. + */ + MaxNominators: PlainDescriptor; + /** + * The maximum number of entries to keep in the set id to session index mapping. + * + * Since the `SetIdSession` map is only used for validating equivocations this + * value should relate to the bonding duration of whatever staking system is + * being used (if any). If equivocation handling is not enabled then this value + * can be zero. + */ + MaxSetIdSessionEntries: PlainDescriptor; + }; +}; +type IRuntimeCalls = { + /** + * The `Core` runtime api that every Substrate runtime needs to implement. + */ + Core: { + /** + * Returns the version of the runtime. + */ + version: RuntimeDescriptor<[], Anonymize>; + /** + * Execute the given block. + */ + execute_block: RuntimeDescriptor<[block: Anonymize], undefined>; + /** + * Initialize a block with the given header and return the runtime executive mode. + */ + initialize_block: RuntimeDescriptor<[header: Anonymize], Anonymize>; + }; + /** + * The `Metadata` api trait that returns metadata for the runtime. + */ + Metadata: { + /** + * Returns the metadata of a runtime. + */ + metadata: RuntimeDescriptor<[], Binary>; + /** + * Returns the metadata at a given version. + * + * If the given `version` isn't supported, this will return `None`. + * Use [`Self::metadata_versions`] to find out about supported metadata version of the runtime. + */ + metadata_at_version: RuntimeDescriptor<[version: number], Anonymize>; + /** + * Returns the supported metadata versions. + * + * This can be used to call `metadata_at_version`. + */ + metadata_versions: RuntimeDescriptor<[], Anonymize>; + }; + /** + * Runtime API for executing view functions + */ + RuntimeViewFunction: { + /** + * Execute a view function query. + */ + execute_view_function: RuntimeDescriptor<[query_id: Anonymize, input: Binary], Anonymize>; + }; + /** + * The `BlockBuilder` api trait that provides the required functionality for building a block. + */ + BlockBuilder: { + /** + * Apply the given extrinsic. + * + * Returns an inclusion outcome which specifies if this extrinsic is included in + * this block or not. + */ + apply_extrinsic: RuntimeDescriptor<[extrinsic: Binary], Anonymize>; + /** + * Finish the current block. + */ + finalize_block: RuntimeDescriptor<[], Anonymize>; + /** + * Generate inherent extrinsics. The inherent data will vary from chain to chain. + */ + inherent_extrinsics: RuntimeDescriptor<[inherent: Anonymize], Anonymize>; + /** + * Check that the inherents are valid. The inherent data will vary from chain to chain. + */ + check_inherents: RuntimeDescriptor<[block: Anonymize, data: Anonymize], Anonymize>; + }; + /** + * The `TaggedTransactionQueue` api trait for interfering with the transaction queue. + */ + TaggedTransactionQueue: { + /** + * Validate the transaction. + * + * This method is invoked by the transaction pool to learn details about given transaction. + * The implementation should make sure to verify the correctness of the transaction + * against current state. The given `block_hash` corresponds to the hash of the block + * that is used as current state. + * + * Note that this call may be performed by the pool multiple times and transactions + * might be verified in any possible order. + */ + validate_transaction: RuntimeDescriptor<[source: TransactionValidityTransactionSource, tx: Binary, block_hash: FixedSizeBinary<32>], Anonymize>; + }; + /** + * The offchain worker api. + */ + OffchainWorkerApi: { + /** + * Starts the off-chain task for given block header. + */ + offchain_worker: RuntimeDescriptor<[header: Anonymize], undefined>; + }; + /** + * The API for querying the state of parachains on-chain. + */ + ParachainHost: { + /** + * Get the current validators. + */ + validators: RuntimeDescriptor<[], Anonymize>; + /** + * Returns the validator groups and rotation info localized based on the hypothetical child + * of a block whose state this is invoked on. Note that `now` in the `GroupRotationInfo` + * should be the successor of the number of the block. + */ + validator_groups: RuntimeDescriptor<[], Anonymize>; + /** + * Yields information on all availability cores as relevant to the child block. + * Cores are either free or occupied. Free cores can have paras assigned to them. + */ + availability_cores: RuntimeDescriptor<[], Anonymize>; + /** + * Yields the persisted validation data for the given `ParaId` along with an assumption that + * should be used if the para currently occupies a core. + * + * Returns `None` if either the para is not registered or the assumption is `Freed` + * and the para already occupies a core. + */ + persisted_validation_data: RuntimeDescriptor<[para_id: number, assumption: OccupiedCoreAssumption], Anonymize>; + /** + * Returns the persisted validation data for the given `ParaId` along with the corresponding + * validation code hash. Instead of accepting assumption about the para, matches the validation + * data hash against an expected one and yields `None` if they're not equal. + */ + assumed_validation_data: RuntimeDescriptor<[para_id: number, expected_persisted_validation_data_hash: FixedSizeBinary<32>], Anonymize>; + /** + * Checks if the given validation outputs pass the acceptance criteria. + */ + check_validation_outputs: RuntimeDescriptor<[para_id: number, outputs: Anonymize], boolean>; + /** + * Returns the session index expected at a child of the block. + * + * This can be used to instantiate a `SigningContext`. + */ + session_index_for_child: RuntimeDescriptor<[], number>; + /** + * Fetch the validation code used by a para, making the given `OccupiedCoreAssumption`. + * + * Returns `None` if either the para is not registered or the assumption is `Freed` + * and the para already occupies a core. + */ + validation_code: RuntimeDescriptor<[para_id: number, assumption: OccupiedCoreAssumption], Anonymize>; + /** + * Get the receipt of a candidate pending availability. This returns `Some` for any paras + * assigned to occupied cores in `availability_cores` and `None` otherwise. + */ + candidate_pending_availability: RuntimeDescriptor<[para_id: number], Anonymize>; + /** + * Get a vector of events concerning candidates that occurred within a block. + */ + candidate_events: RuntimeDescriptor<[], Anonymize>; + /** + * Get all the pending inbound messages in the downward message queue for a para. + */ + dmq_contents: RuntimeDescriptor<[recipient: number], Anonymize>; + /** + * Get the contents of all channels addressed to the given recipient. Channels that have no + * messages in them are also included. + */ + inbound_hrmp_channels_contents: RuntimeDescriptor<[recipient: number], Anonymize>; + /** + * Get the validation code from its hash. + */ + validation_code_by_hash: RuntimeDescriptor<[hash: FixedSizeBinary<32>], Anonymize>; + /** + * Scrape dispute relevant from on-chain, backing votes and resolved disputes. + */ + on_chain_votes: RuntimeDescriptor<[], Anonymize>; + /** + * Get the session info for the given session, if stored. + * + * NOTE: This function is only available since parachain host version 2. + */ + session_info: RuntimeDescriptor<[index: number], Anonymize>; + /** + * Submits a PVF pre-checking statement into the transaction pool. + * + * NOTE: This function is only available since parachain host version 2. + */ + submit_pvf_check_statement: RuntimeDescriptor<[stmt: Anonymize, signature: FixedSizeBinary<64>], undefined>; + /** + * Returns code hashes of PVFs that require pre-checking by validators in the active set. + * + * NOTE: This function is only available since parachain host version 2. + */ + pvfs_require_precheck: RuntimeDescriptor<[], Anonymize>; + /** + * Fetch the hash of the validation code used by a para, making the given `OccupiedCoreAssumption`. + * + * NOTE: This function is only available since parachain host version 2. + */ + validation_code_hash: RuntimeDescriptor<[para_id: number, assumption: OccupiedCoreAssumption], Anonymize>; + /** + * Returns all onchain disputes. + */ + disputes: RuntimeDescriptor<[], Anonymize>; + /** + * Returns execution parameters for the session. + */ + session_executor_params: RuntimeDescriptor<[session_index: number], Anonymize>; + /** + * Returns a list of validators that lost a past session dispute and need to be slashed. + * NOTE: This function is only available since parachain host version 5. + */ + unapplied_slashes: RuntimeDescriptor<[], Anonymize>; + /** + * Returns a merkle proof of a validator session key. + * NOTE: This function is only available since parachain host version 5. + */ + key_ownership_proof: RuntimeDescriptor<[validator_id: FixedSizeBinary<32>], Anonymize>; + /** + * Submit an unsigned extrinsic to slash validators who lost a dispute about + * a candidate of a past session. + * NOTE: This function is only available since parachain host version 5. + */ + submit_report_dispute_lost: RuntimeDescriptor<[dispute_proof: Anonymize, key_ownership_proof: Binary], boolean>; + /** + * Get the minimum number of backing votes for a parachain candidate. + * This is a staging method! Do not use on production runtimes! + */ + minimum_backing_votes: RuntimeDescriptor<[], number>; + /** + * Returns the state of parachain backing for a given para. + */ + para_backing_state: RuntimeDescriptor<[__runtime_api_generated_name_0__: number], Anonymize>; + /** + * Returns candidate's acceptance limitations for asynchronous backing for a relay parent. + */ + async_backing_params: RuntimeDescriptor<[], Anonymize>; + /** + * Returns a list of all disabled validators at the given block. + */ + disabled_validators: RuntimeDescriptor<[], Anonymize>; + /** + * Get node features. + * This is a staging method! Do not use on production runtimes! + */ + node_features: RuntimeDescriptor<[], { + bytes: Uint8Array; + bitsLen: number; + }>; + /** + * Approval voting configuration parameters + */ + approval_voting_params: RuntimeDescriptor<[], number>; + /** + * Claim queue + */ + claim_queue: RuntimeDescriptor<[], Anonymize>; + /** + * Elastic scaling support + */ + candidates_pending_availability: RuntimeDescriptor<[para_id: number], Anonymize>; + /** + * Retrieve the maximum uncompressed code size. + */ + validation_code_bomb_limit: RuntimeDescriptor<[], number>; + /** + * Returns the constraints on the actions that can be taken by a new parachain + * block. + */ + backing_constraints: RuntimeDescriptor<[para_id: number], Anonymize>; + /** + * Retrieve the scheduling lookahead + */ + scheduling_lookahead: RuntimeDescriptor<[], number>; + /** + * Retrieve paraids at relay parent + */ + para_ids: RuntimeDescriptor<[], Anonymize>; + }; + /** + * API necessary for BEEFY voters. + */ + BeefyApi: { + /** + * Return the block number where BEEFY consensus is enabled/started + */ + beefy_genesis: RuntimeDescriptor<[], Anonymize>; + /** + * Return the current active BEEFY validator set + */ + validator_set: RuntimeDescriptor<[], Anonymize>; + /** + * Submits an unsigned extrinsic to report a double voting equivocation. The caller + * must provide the double voting proof and a key ownership proof + * (should be obtained using `generate_key_ownership_proof`). The + * extrinsic will be unsigned and should only be accepted for local + * authorship (not to be broadcast to the network). This method returns + * `None` when creation of the extrinsic fails, e.g. if equivocation + * reporting is disabled for the given runtime (i.e. this method is + * hardcoded to return `None`). Only useful in an offchain context. + */ + submit_report_double_voting_unsigned_extrinsic: RuntimeDescriptor<[equivocation_proof: Anonymize, key_owner_proof: Binary], boolean>; + /** + * Submits an unsigned extrinsic to report a fork voting equivocation. The caller + * must provide the fork voting proof (the ancestry proof should be obtained using + * `generate_ancestry_proof`) and a key ownership proof (should be obtained using + * `generate_key_ownership_proof`). The extrinsic will be unsigned and should only + * be accepted for local authorship (not to be broadcast to the network). This method + * returns `None` when creation of the extrinsic fails, e.g. if equivocation + * reporting is disabled for the given runtime (i.e. this method is + * hardcoded to return `None`). Only useful in an offchain context. + */ + submit_report_fork_voting_unsigned_extrinsic: RuntimeDescriptor<[equivocation_proof: Anonymize, key_owner_proof: Binary], boolean>; + /** + * Submits an unsigned extrinsic to report a future block voting equivocation. The caller + * must provide the future block voting proof and a key ownership proof + * (should be obtained using `generate_key_ownership_proof`). + * The extrinsic will be unsigned and should only be accepted for local + * authorship (not to be broadcast to the network). This method returns + * `None` when creation of the extrinsic fails, e.g. if equivocation + * reporting is disabled for the given runtime (i.e. this method is + * hardcoded to return `None`). Only useful in an offchain context. + */ + submit_report_future_block_voting_unsigned_extrinsic: RuntimeDescriptor<[equivocation_proof: Anonymize, key_owner_proof: Binary], boolean>; + /** + * Generates a proof of key ownership for the given authority in the + * given set. An example usage of this module is coupled with the + * session historical module to prove that a given authority key is + * tied to a given staking identity during a specific session. Proofs + * of key ownership are necessary for submitting equivocation reports. + * NOTE: even though the API takes a `set_id` as parameter the current + * implementations ignores this parameter and instead relies on this + * method being called at the correct block height, i.e. any point at + * which the given set id is live on-chain. Future implementations will + * instead use indexed data through an offchain worker, not requiring + * older states to be available. + */ + generate_key_ownership_proof: RuntimeDescriptor<[set_id: bigint, authority_id: FixedSizeBinary<33>], Anonymize>; + /** + * Generates a proof that the `prev_block_number` is part of the canonical chain at + * `best_known_block_number`. + */ + generate_ancestry_proof: RuntimeDescriptor<[prev_block_number: number, best_known_block_number: Anonymize], Anonymize>; + }; + /** + * API to interact with MMR pallet. + */ + MmrApi: { + /** + * Return the on-chain MMR root hash. + */ + mmr_root: RuntimeDescriptor<[], Anonymize>; + /** + * Return the number of MMR blocks in the chain. + */ + mmr_leaf_count: RuntimeDescriptor<[], Anonymize>; + /** + * Generate MMR proof for a series of block numbers. If `best_known_block_number = Some(n)`, + * use historical MMR state at given block height `n`. Else, use current MMR state. + */ + generate_proof: RuntimeDescriptor<[block_numbers: Anonymize, best_known_block_number: Anonymize], Anonymize>; + /** + * Verify MMR proof against on-chain MMR for a batch of leaves. + * + * Note this function will use on-chain MMR root hash and check if the proof matches the hash. + * Note, the leaves should be sorted such that corresponding leaves and leaf indices have the + * same position in both the `leaves` vector and the `leaf_indices` vector contained in the [LeafProof] + */ + verify_proof: RuntimeDescriptor<[leaves: Anonymize, proof: Anonymize], Anonymize>; + /** + * Verify MMR proof against given root hash for a batch of leaves. + * + * Note this function does not require any on-chain storage - the + * proof is verified against given MMR root hash. + * + * Note, the leaves should be sorted such that corresponding leaves and leaf indices have the + * same position in both the `leaves` vector and the `leaf_indices` vector contained in the [LeafProof] + */ + verify_proof_stateless: RuntimeDescriptor<[root: FixedSizeBinary<32>, leaves: Anonymize, proof: Anonymize], Anonymize>; + }; + /** + * API useful for BEEFY light clients. + */ + BeefyMmrApi: { + /** + * Return the currently active BEEFY authority set proof. + */ + authority_set_proof: RuntimeDescriptor<[], Anonymize>; + /** + * Return the next/queued BEEFY authority set proof. + */ + next_authority_set_proof: RuntimeDescriptor<[], Anonymize>; + }; + /** + * APIs for integrating the GRANDPA finality gadget into runtimes. + * This should be implemented on the runtime side. + * + * This is primarily used for negotiating authority-set changes for the + * gadget. GRANDPA uses a signaling model of changing authority sets: + * changes should be signaled with a delay of N blocks, and then automatically + * applied in the runtime after those N blocks have passed. + * + * The consensus protocol will coordinate the handoff externally. + */ + GrandpaApi: { + /** + * Get the current GRANDPA authorities and weights. This should not change except + * for when changes are scheduled and the corresponding delay has passed. + * + * When called at block B, it will return the set of authorities that should be + * used to finalize descendants of this block (B+1, B+2, ...). The block B itself + * is finalized by the authorities from block B-1. + */ + grandpa_authorities: RuntimeDescriptor<[], Anonymize>; + /** + * Submits an unsigned extrinsic to report an equivocation. The caller + * must provide the equivocation proof and a key ownership proof + * (should be obtained using `generate_key_ownership_proof`). The + * extrinsic will be unsigned and should only be accepted for local + * authorship (not to be broadcast to the network). This method returns + * `None` when creation of the extrinsic fails, e.g. if equivocation + * reporting is disabled for the given runtime (i.e. this method is + * hardcoded to return `None`). Only useful in an offchain context. + */ + submit_report_equivocation_unsigned_extrinsic: RuntimeDescriptor<[equivocation_proof: Anonymize, key_owner_proof: Binary], boolean>; + /** + * Generates a proof of key ownership for the given authority in the + * given set. An example usage of this module is coupled with the + * session historical module to prove that a given authority key is + * tied to a given staking identity during a specific session. Proofs + * of key ownership are necessary for submitting equivocation reports. + * NOTE: even though the API takes a `set_id` as parameter the current + * implementations ignore this parameter and instead rely on this + * method being called at the correct block height, i.e. any point at + * which the given set id is live on-chain. Future implementations will + * instead use indexed data through an offchain worker, not requiring + * older states to be available. + */ + generate_key_ownership_proof: RuntimeDescriptor<[set_id: bigint, authority_id: FixedSizeBinary<32>], Anonymize>; + /** + * Get current GRANDPA authority set id. + */ + current_set_id: RuntimeDescriptor<[], bigint>; + }; + /** + * API necessary for block authorship with BABE. + */ + BabeApi: { + /** + * Return the configuration for BABE. + */ + configuration: RuntimeDescriptor<[], Anonymize>; + /** + * Returns the slot that started the current epoch. + */ + current_epoch_start: RuntimeDescriptor<[], bigint>; + /** + * Returns information regarding the current epoch. + */ + current_epoch: RuntimeDescriptor<[], Anonymize>; + /** + * Returns information regarding the next epoch (which was already + * previously announced). + */ + next_epoch: RuntimeDescriptor<[], Anonymize>; + /** + * Generates a proof of key ownership for the given authority in the + * current epoch. An example usage of this module is coupled with the + * session historical module to prove that a given authority key is + * tied to a given staking identity during a specific session. Proofs + * of key ownership are necessary for submitting equivocation reports. + * NOTE: even though the API takes a `slot` as parameter the current + * implementations ignores this parameter and instead relies on this + * method being called at the correct block height, i.e. any point at + * which the epoch for the given slot is live on-chain. Future + * implementations will instead use indexed data through an offchain + * worker, not requiring older states to be available. + */ + generate_key_ownership_proof: RuntimeDescriptor<[slot: bigint, authority_id: FixedSizeBinary<32>], Anonymize>; + /** + * Submits an unsigned extrinsic to report an equivocation. The caller + * must provide the equivocation proof and a key ownership proof + * (should be obtained using `generate_key_ownership_proof`). The + * extrinsic will be unsigned and should only be accepted for local + * authorship (not to be broadcast to the network). This method returns + * `None` when creation of the extrinsic fails, e.g. if equivocation + * reporting is disabled for the given runtime (i.e. this method is + * hardcoded to return `None`). Only useful in an offchain context. + */ + submit_report_equivocation_unsigned_extrinsic: RuntimeDescriptor<[equivocation_proof: Anonymize, key_owner_proof: Binary], boolean>; + }; + /** + * The authority discovery api. + * + * This api is used by the `client/authority-discovery` module to retrieve identifiers + * of the current and next authority set. + */ + AuthorityDiscoveryApi: { + /** + * Retrieve authority identifiers of the current and next authority set. + */ + authorities: RuntimeDescriptor<[], Anonymize>; + }; + /** + * Session keys runtime api. + */ + SessionKeys: { + /** + * Generate a set of session keys with optionally using the given seed. + * The keys should be stored within the keystore exposed via runtime + * externalities. + * + * The seed needs to be a valid `utf8` string. + * + * Returns the concatenated SCALE encoded public keys. + */ + generate_session_keys: RuntimeDescriptor<[seed: Anonymize], Binary>; + /** + * Decode the given public session keys. + * + * Returns the list of public raw public keys + key type. + */ + decode_session_keys: RuntimeDescriptor<[encoded: Binary], Anonymize>; + }; + /** + * The API to query account nonce. + */ + AccountNonceApi: { + /** + * Get current account nonce of given `AccountId`. + */ + account_nonce: RuntimeDescriptor<[account: SS58String], number>; + }; + /** + + */ + TransactionPaymentApi: { + /** + + */ + query_info: RuntimeDescriptor<[uxt: Binary, len: number], Anonymize>; + /** + + */ + query_fee_details: RuntimeDescriptor<[uxt: Binary, len: number], Anonymize>; + /** + + */ + query_weight_to_fee: RuntimeDescriptor<[weight: Anonymize], bigint>; + /** + + */ + query_length_to_fee: RuntimeDescriptor<[length: number], bigint>; + }; + /** + + */ + TransactionPaymentCallApi: { + /** + * Query information of a dispatch class, weight, and fee of a given encoded `Call`. + */ + query_call_info: RuntimeDescriptor<[call: Anonymize, len: number], Anonymize>; + /** + * Query fee details of a given encoded `Call`. + */ + query_call_fee_details: RuntimeDescriptor<[call: Anonymize, len: number], Anonymize>; + /** + * Query the output of the current `WeightToFee` given some input. + */ + query_weight_to_fee: RuntimeDescriptor<[weight: Anonymize], bigint>; + /** + * Query the output of the current `LengthToFee` given some input. + */ + query_length_to_fee: RuntimeDescriptor<[length: number], bigint>; + }; + /** + * A trait of XCM payment API. + * + * API provides functionality for obtaining: + * + * * the weight required to execute an XCM message, + * * a list of acceptable `AssetId`s for message execution payment, + * * the cost of the weight in the specified acceptable `AssetId`. + * * the fees for an XCM message delivery. + * + * To determine the execution weight of the calls required for + * [`xcm::latest::Instruction::Transact`] instruction, `TransactionPaymentCallApi` can be used. + */ + XcmPaymentApi: { + /** + * Returns a list of acceptable payment assets. + * + * # Arguments + * + * * `xcm_version`: Version. + */ + query_acceptable_payment_assets: RuntimeDescriptor<[xcm_version: number], Anonymize>; + /** + * Returns a weight needed to execute a XCM. + * + * # Arguments + * + * * `message`: `VersionedXcm`. + */ + query_xcm_weight: RuntimeDescriptor<[message: XcmVersionedXcm], Anonymize>; + /** + * Converts a weight into a fee for the specified `AssetId`. + * + * # Arguments + * + * * `weight`: convertible `Weight`. + * * `asset`: `VersionedAssetId`. + */ + query_weight_to_asset_fee: RuntimeDescriptor<[weight: Anonymize, asset: XcmVersionedAssetId], Anonymize>; + /** + * Get delivery fees for sending a specific `message` to a `destination`. + * These always come in a specific asset, defined by the chain. + * + * # Arguments + * * `message`: The message that'll be sent, necessary because most delivery fees are based on the + * size of the message. + * * `destination`: The destination to send the message to. Different destinations may use + * different senders that charge different fees. + */ + query_delivery_fees: RuntimeDescriptor<[destination: XcmVersionedLocation, message: XcmVersionedXcm], Anonymize>; + }; + /** + * API for dry-running extrinsics and XCM programs to get the programs that need to be passed to the fees API. + * + * All calls return a vector of tuples (location, xcm) where each "xcm" is executed in "location". + * If there's local execution, the location will be "Here". + * This vector can be used to calculate both execution and delivery fees. + * + * Calls or XCMs might fail when executed, this doesn't mean the result of these calls will be an `Err`. + * In those cases, there might still be a valid result, with the execution error inside it. + * The only reasons why these calls might return an error are listed in the [`Error`] enum. + */ + DryRunApi: { + /** + * Dry run call V2. + */ + dry_run_call: RuntimeDescriptor<[origin: Anonymize, call: Anonymize, result_xcms_version: number], Anonymize>; + /** + * Dry run XCM program + */ + dry_run_xcm: RuntimeDescriptor<[origin_location: XcmVersionedLocation, xcm: XcmVersionedXcm], Anonymize>; + }; + /** + * API for useful conversions between XCM `Location` and `AccountId`. + */ + LocationToAccountApi: { + /** + * Converts `Location` to `AccountId`. + */ + convert_location: RuntimeDescriptor<[location: XcmVersionedLocation], Anonymize>; + }; + /** + * Runtime api for accessing information about nomination pools. + */ + NominationPoolsApi: { + /** + * Returns the pending rewards for the member that the AccountId was given for. + */ + pending_rewards: RuntimeDescriptor<[who: SS58String], bigint>; + /** + * Returns the equivalent balance of `points` for a given pool. + */ + points_to_balance: RuntimeDescriptor<[pool_id: number, points: bigint], bigint>; + /** + * Returns the equivalent points of `new_funds` for a given pool. + */ + balance_to_points: RuntimeDescriptor<[pool_id: number, new_funds: bigint], bigint>; + /** + * Returns the pending slash for a given pool. + */ + pool_pending_slash: RuntimeDescriptor<[pool_id: number], bigint>; + /** + * Returns the pending slash for a given pool member. + * + * If pending slash of the member exceeds `ExistentialDeposit`, it can be reported on + * chain. + */ + member_pending_slash: RuntimeDescriptor<[member: SS58String], bigint>; + /** + * Returns true if the pool with `pool_id` needs migration. + * + * This can happen when the `pallet-nomination-pools` has switched to using strategy + * [`DelegateStake`](pallet_nomination_pools::adapter::DelegateStake) but the pool + * still has funds that were staked using the older strategy + * [TransferStake](pallet_nomination_pools::adapter::TransferStake). Use + * [`migrate_pool_to_delegate_stake`](pallet_nomination_pools::Call::migrate_pool_to_delegate_stake) + * to migrate the pool. + */ + pool_needs_delegate_migration: RuntimeDescriptor<[pool_id: number], boolean>; + /** + * Returns true if the delegated funds of the pool `member` needs migration. + * + * Once a pool has successfully migrated to the strategy + * [`DelegateStake`](pallet_nomination_pools::adapter::DelegateStake), the funds of the + * member can be migrated from pool account to the member's account. Use + * [`migrate_delegation`](pallet_nomination_pools::Call::migrate_delegation) + * to migrate the funds of the pool member. + */ + member_needs_delegate_migration: RuntimeDescriptor<[member: SS58String], boolean>; + /** + * Returns the total contribution of a pool member including any balance that is unbonding. + */ + member_total_balance: RuntimeDescriptor<[who: SS58String], bigint>; + /** + * Total balance contributed to the pool. + */ + pool_balance: RuntimeDescriptor<[pool_id: number], bigint>; + /** + * Returns the bonded account and reward account associated with the pool_id. + */ + pool_accounts: RuntimeDescriptor<[pool_id: number], Anonymize>; + }; + /** + + */ + StakingApi: { + /** + * Returns the nominations quota for a nominator with a given balance. + */ + nominations_quota: RuntimeDescriptor<[balance: bigint], number>; + /** + * Returns the page count of exposures for a validator `account` in a given era. + */ + eras_stakers_page_count: RuntimeDescriptor<[era: number, account: SS58String], number>; + /** + * Returns true if validator `account` has pages to be claimed for the given era. + */ + pending_rewards: RuntimeDescriptor<[era: number, account: SS58String], boolean>; + }; + /** + * API to interact with `RuntimeGenesisConfig` for the runtime + */ + GenesisBuilder: { + /** + * Build `RuntimeGenesisConfig` from a JSON blob not using any defaults and store it in the + * storage. + * + * In the case of a FRAME-based runtime, this function deserializes the full + * `RuntimeGenesisConfig` from the given JSON blob and puts it into the storage. If the + * provided JSON blob is incorrect or incomplete or the deserialization fails, an error + * is returned. + * + * Please note that provided JSON blob must contain all `RuntimeGenesisConfig` fields, no + * defaults will be used. + */ + build_state: RuntimeDescriptor<[json: Binary], Anonymize>; + /** + * Returns a JSON blob representation of the built-in `RuntimeGenesisConfig` identified by + * `id`. + * + * If `id` is `None` the function should return JSON blob representation of the default + * `RuntimeGenesisConfig` struct of the runtime. Implementation must provide default + * `RuntimeGenesisConfig`. + * + * Otherwise function returns a JSON representation of the built-in, named + * `RuntimeGenesisConfig` preset identified by `id`, or `None` if such preset does not + * exist. Returned `Vec` contains bytes of JSON blob (patch) which comprises a list of + * (potentially nested) key-value pairs that are intended for customizing the default + * runtime genesis config. The patch shall be merged (rfc7386) with the JSON representation + * of the default `RuntimeGenesisConfig` to create a comprehensive genesis config that can + * be used in `build_state` method. + */ + get_preset: RuntimeDescriptor<[id: Anonymize], Anonymize>; + /** + * Returns a list of identifiers for available builtin `RuntimeGenesisConfig` presets. + * + * The presets from the list can be queried with [`GenesisBuilder::get_preset`] method. If + * no named presets are provided by the runtime the list is empty. + */ + preset_names: RuntimeDescriptor<[], Anonymize>; + }; + /** + * API for querying trusted reserves and trusted teleporters. + */ + TrustedQueryApi: { + /** + * Returns if the location is a trusted reserve for the asset. + * + * # Arguments + * * `asset`: `VersionedAsset`. + * * `location`: `VersionedLocation`. + */ + is_trusted_reserve: RuntimeDescriptor<[asset: XcmVersionedAsset, location: XcmVersionedLocation], Anonymize>; + /** + * Returns if the asset can be teleported to the location. + * + * # Arguments + * * `asset`: `VersionedAsset`. + * * `location`: `VersionedLocation`. + */ + is_trusted_teleporter: RuntimeDescriptor<[asset: XcmVersionedAsset, location: XcmVersionedLocation], Anonymize>; + }; +}; +type IAsset = PlainDescriptor; +export type WndDispatchError = Anonymize; +type PalletsTypedef = { + __storage: IStorage; + __tx: ICalls; + __event: IEvent; + __error: IError; + __const: IConstants; +}; +type IDescriptors = { + descriptors: { + pallets: PalletsTypedef; + apis: IRuntimeCalls; + } & Promise; + metadataTypes: Promise; + asset: IAsset; + getMetadata: () => Promise; + genesis: string | undefined; +}; +declare const _allDescriptors: IDescriptors; +export default _allDescriptors; +export type WndQueries = QueryFromPalletsDef; +export type WndCalls = TxFromPalletsDef; +export type WndEvents = EventsFromPalletsDef; +export type WndErrors = ErrorsFromPalletsDef; +export type WndConstants = ConstFromPalletsDef; +export type WndCallData = Anonymize & { + value: { + type: string; + }; +}; +export type WndWhitelistEntry = PalletKey | ApiKey | `query.${NestedKey}` | `tx.${NestedKey}` | `event.${NestedKey}` | `error.${NestedKey}` | `const.${NestedKey}`; +type PalletKey = `*.${keyof (IStorage & ICalls & IEvent & IError & IConstants & IRuntimeCalls)}`; +type NestedKey>> = "*" | { + [P in keyof D & string]: `${P}.*` | { + [N in keyof D[P] & string]: `${P}.${N}`; + }[keyof D[P] & string]; +}[keyof D & string]; +type ApiKey>> = "api.*" | { + [P in keyof D & string]: `api.${P}.*` | { + [N in keyof D[P] & string]: `api.${P}.${N}`; + }[keyof D[P] & string]; +}[keyof D & string]; diff --git a/examples/with-vite-papi/.papi/descriptors/dist/wnd_metadata-VUPVFDP2.mjs b/examples/with-vite-papi/.papi/descriptors/dist/wnd_metadata-VUPVFDP2.mjs new file mode 100644 index 0000000..02aff69 --- /dev/null +++ b/examples/with-vite-papi/.papi/descriptors/dist/wnd_metadata-VUPVFDP2.mjs @@ -0,0 +1,6 @@ +// .papi/descriptors/src/wnd_metadata.ts +var binMeta = "bWV0YQ9tEQAMHHNwX2NvcmUYY3J5cHRvLEFjY291bnRJZDMyAAAEAAQBIFt1ODsgMzJdAAAEAAADIAAAAAgACAAABQMADAgwZnJhbWVfc3lzdGVtLEFjY291bnRJbmZvCBROb25jZQEQLEFjY291bnREYXRhARQAFAEUbm9uY2UQARROb25jZQABJGNvbnN1bWVycxABIFJlZkNvdW50AAEkcHJvdmlkZXJzEAEgUmVmQ291bnQAASxzdWZmaWNpZW50cxABIFJlZkNvdW50AAEQZGF0YRQBLEFjY291bnREYXRhAAAQAAAFBQAUDDxwYWxsZXRfYmFsYW5jZXMUdHlwZXMsQWNjb3VudERhdGEEHEJhbGFuY2UBGAAQARBmcmVlGAEcQmFsYW5jZQABIHJlc2VydmVkGAEcQmFsYW5jZQABGGZyb3plbhgBHEJhbGFuY2UAARRmbGFncxwBKEV4dHJhRmxhZ3MAABgAAAUHABwMPHBhbGxldF9iYWxhbmNlcxR0eXBlcyhFeHRyYUZsYWdzAAAEABgBEHUxMjgAACAAAAUAACQMNGZyYW1lX3N1cHBvcnQgZGlzcGF0Y2hAUGVyRGlzcGF0Y2hDbGFzcwQEVAEoAAwBGG5vcm1hbCgBBFQAASxvcGVyYXRpb25hbCgBBFQAASRtYW5kYXRvcnkoAQRUAAAoDChzcF93ZWlnaHRzJHdlaWdodF92MhhXZWlnaHQAAAgBIHJlZl90aW1lLAEMdTY0AAEocHJvb2Zfc2l6ZSwBDHU2NAAALAAABjAAMAAABQYANAg8cHJpbWl0aXZlX3R5cGVzEEgyNTYAAAQABAEgW3U4OyAzMl0AADgAAAIIADwQKHNwX3J1bnRpbWUcZ2VuZXJpYxhkaWdlc3QYRGlnZXN0AAAEARBsb2dzQAE8VmVjPERpZ2VzdEl0ZW0+AABAAAACRABEEChzcF9ydW50aW1lHGdlbmVyaWMYZGlnZXN0KERpZ2VzdEl0ZW0AARQoUHJlUnVudGltZQgASAFEQ29uc2Vuc3VzRW5naW5lSWQAADgBHFZlYzx1OD4ABgAkQ29uc2Vuc3VzCABIAURDb25zZW5zdXNFbmdpbmVJZAAAOAEcVmVjPHU4PgAEABBTZWFsCABIAURDb25zZW5zdXNFbmdpbmVJZAAAOAEcVmVjPHU4PgAFABRPdGhlcgQAOAEcVmVjPHU4PgAAAGRSdW50aW1lRW52aXJvbm1lbnRVcGRhdGVkAAgAAEgAAAMEAAAACABMAAACUABQCDBmcmFtZV9zeXN0ZW0sRXZlbnRSZWNvcmQIBEUBVARUATQADAEUcGhhc2U9CQEUUGhhc2UAARRldmVudFQBBEUAARh0b3BpY3O5AwEYVmVjPFQ+AABUCDx3ZXN0ZW5kX3J1bnRpbWUwUnVudGltZUV2ZW50AAG8GFN5c3RlbQQAWAFwZnJhbWVfc3lzdGVtOjpFdmVudDxSdW50aW1lPgAAABxJbmRpY2VzBACAAXhwYWxsZXRfaW5kaWNlczo6RXZlbnQ8UnVudGltZT4AAwAgQmFsYW5jZXMEAIQBfHBhbGxldF9iYWxhbmNlczo6RXZlbnQ8UnVudGltZT4ABABIVHJhbnNhY3Rpb25QYXltZW50BACMAahwYWxsZXRfdHJhbnNhY3Rpb25fcGF5bWVudDo6RXZlbnQ8UnVudGltZT4AGgAcU3Rha2luZwQAkAF4cGFsbGV0X3N0YWtpbmc6OkV2ZW50PFJ1bnRpbWU+AAYAIE9mZmVuY2VzBACsAVhwYWxsZXRfb2ZmZW5jZXM6OkV2ZW50AAcAKEhpc3RvcmljYWwEALQBiHNlc3Npb25faGlzdG9yaWNhbDo6RXZlbnQ8UnVudGltZT4AGwAoUGFyYW1ldGVycwQAuAGEcGFsbGV0X3BhcmFtZXRlcnM6OkV2ZW50PFJ1bnRpbWU+AEYAHFNlc3Npb24EAOgBeHBhbGxldF9zZXNzaW9uOjpFdmVudDxSdW50aW1lPgAIABxHcmFuZHBhBADsAVRwYWxsZXRfZ3JhbmRwYTo6RXZlbnQACgAcVXRpbGl0eQQA/AFUcGFsbGV0X3V0aWxpdHk6OkV2ZW50ABAAIElkZW50aXR5BAAJAQF8cGFsbGV0X2lkZW50aXR5OjpFdmVudDxSdW50aW1lPgARACBSZWNvdmVyeQQAEQEBfHBhbGxldF9yZWNvdmVyeTo6RXZlbnQ8UnVudGltZT4AEgAcVmVzdGluZwQAHQEBeHBhbGxldF92ZXN0aW5nOjpFdmVudDxSdW50aW1lPgATACRTY2hlZHVsZXIEACEBAYBwYWxsZXRfc2NoZWR1bGVyOjpFdmVudDxSdW50aW1lPgAUACBQcmVpbWFnZQQALQEBfHBhbGxldF9wcmVpbWFnZTo6RXZlbnQ8UnVudGltZT4AHAAQU3VkbwQAMQEBbHBhbGxldF9zdWRvOjpFdmVudDxSdW50aW1lPgAVABRQcm94eQQAOQEBcHBhbGxldF9wcm94eTo6RXZlbnQ8UnVudGltZT4AFgAgTXVsdGlzaWcEAEkBAXxwYWxsZXRfbXVsdGlzaWc6OkV2ZW50PFJ1bnRpbWU+ABcAaEVsZWN0aW9uUHJvdmlkZXJNdWx0aVBoYXNlBABRAQHQcGFsbGV0X2VsZWN0aW9uX3Byb3ZpZGVyX211bHRpX3BoYXNlOjpFdmVudDxSdW50aW1lPgAYACRWb3Rlckxpc3QEAGUBAfRwYWxsZXRfYmFnc19saXN0OjpFdmVudDxSdW50aW1lLCBwYWxsZXRfYmFnc19saXN0OjpJbnN0YW5jZTE+ABkAPE5vbWluYXRpb25Qb29scwQAaQEBnHBhbGxldF9ub21pbmF0aW9uX3Bvb2xzOjpFdmVudDxSdW50aW1lPgAdACxGYXN0VW5zdGFrZQQAjQEBjHBhbGxldF9mYXN0X3Vuc3Rha2U6OkV2ZW50PFJ1bnRpbWU+AB4AQENvbnZpY3Rpb25Wb3RpbmcEAJUBAaBwYWxsZXRfY29udmljdGlvbl92b3Rpbmc6OkV2ZW50PFJ1bnRpbWU+AB8AJFJlZmVyZW5kYQQAoQEBgHBhbGxldF9yZWZlcmVuZGE6OkV2ZW50PFJ1bnRpbWU+ACAAJFdoaXRlbGlzdAQAsQgBgHBhbGxldF93aGl0ZWxpc3Q6OkV2ZW50PFJ1bnRpbWU+ACQAIFRyZWFzdXJ5BADBCAF8cGFsbGV0X3RyZWFzdXJ5OjpFdmVudDxSdW50aW1lPgAlAEBEZWxlZ2F0ZWRTdGFraW5nBADFCAGgcGFsbGV0X2RlbGVnYXRlZF9zdGFraW5nOjpFdmVudDxSdW50aW1lPgAmADRQYXJhSW5jbHVzaW9uBADJCAGQcGFyYWNoYWluc19pbmNsdXNpb246OkV2ZW50PFJ1bnRpbWU+ACwAFFBhcmFzBADZCAGAcGFyYWNoYWluc19wYXJhczo6RXZlbnQ8UnVudGltZT4ALwAQSHJtcAQA3QgBfHBhcmFjaGFpbnNfaHJtcDo6RXZlbnQ8UnVudGltZT4AMwA0UGFyYXNEaXNwdXRlcwQA4QgBjHBhcmFjaGFpbnNfZGlzcHV0ZXM6OkV2ZW50PFJ1bnRpbWU+ADUAaE9uRGVtYW5kQXNzaWdubWVudFByb3ZpZGVyBADtCAGQcGFyYWNoYWluc19vbl9kZW1hbmQ6OkV2ZW50PFJ1bnRpbWU+ADgAJFJlZ2lzdHJhcgQA8QgBfHBhcmFzX3JlZ2lzdHJhcjo6RXZlbnQ8UnVudGltZT4APAAUU2xvdHMEAPUIAVRzbG90czo6RXZlbnQ8UnVudGltZT4APQAgQXVjdGlvbnMEAPkIAWBhdWN0aW9uczo6RXZlbnQ8UnVudGltZT4APwAkQ3Jvd2Rsb2FuBAD9CAFkY3Jvd2Rsb2FuOjpFdmVudDxSdW50aW1lPgBAADRBc3NpZ25lZFNsb3RzBAABCQF4YXNzaWduZWRfc2xvdHM6OkV2ZW50PFJ1bnRpbWU+AEEAIENvcmV0aW1lBAAFCQFgY29yZXRpbWU6OkV2ZW50PFJ1bnRpbWU+AEIAPFN0YWtpbmdBaENsaWVudAQACQkBuHBhbGxldF9zdGFraW5nX2FzeW5jX2FoX2NsaWVudDo6RXZlbnQ8UnVudGltZT4AQwBQTXVsdGlCbG9ja01pZ3JhdGlvbnMEABEJAYRwYWxsZXRfbWlncmF0aW9uczo6RXZlbnQ8UnVudGltZT4AYgAkWGNtUGFsbGV0BAAVCQFocGFsbGV0X3hjbTo6RXZlbnQ8UnVudGltZT4AYwAwTWVzc2FnZVF1ZXVlBAAlCQGQcGFsbGV0X21lc3NhZ2VfcXVldWU6OkV2ZW50PFJ1bnRpbWU+AGQAJEFzc2V0UmF0ZQQALQkBhHBhbGxldF9hc3NldF9yYXRlOjpFdmVudDxSdW50aW1lPgBlACxSb290VGVzdGluZwQAMQkBjHBhbGxldF9yb290X3Rlc3Rpbmc6OkV2ZW50PFJ1bnRpbWU+AGYAGE1ldGFUeAQANQkBeHBhbGxldF9tZXRhX3R4OjpFdmVudDxSdW50aW1lPgBnAEBJZGVudGl0eU1pZ3JhdG9yBAA5CQGEaWRlbnRpdHlfbWlncmF0b3I6OkV2ZW50PFJ1bnRpbWU+APgAAFgMMGZyYW1lX3N5c3RlbRhwYWxsZXQURXZlbnQEBFQAASBARXh0cmluc2ljU3VjY2VzcwQBNGRpc3BhdGNoX2luZm9cAUREaXNwYXRjaEV2ZW50SW5mbwAABJBBbiBleHRyaW5zaWMgY29tcGxldGVkIHN1Y2Nlc3NmdWxseS48RXh0cmluc2ljRmFpbGVkCAE4ZGlzcGF0Y2hfZXJyb3JoATREaXNwYXRjaEVycm9yAAE0ZGlzcGF0Y2hfaW5mb1wBRERpc3BhdGNoRXZlbnRJbmZvAAEEUEFuIGV4dHJpbnNpYyBmYWlsZWQuLENvZGVVcGRhdGVkAAIEUGA6Y29kZWAgd2FzIHVwZGF0ZWQuKE5ld0FjY291bnQEARxhY2NvdW50AAEwVDo6QWNjb3VudElkAAMEaEEgbmV3IGFjY291bnQgd2FzIGNyZWF0ZWQuNEtpbGxlZEFjY291bnQEARxhY2NvdW50AAEwVDo6QWNjb3VudElkAAQEWEFuIGFjY291bnQgd2FzIHJlYXBlZC4gUmVtYXJrZWQIARhzZW5kZXIAATBUOjpBY2NvdW50SWQAARBoYXNoNAEcVDo6SGFzaAAFBHBPbiBvbi1jaGFpbiByZW1hcmsgaGFwcGVuZWQuRFVwZ3JhZGVBdXRob3JpemVkCAEkY29kZV9oYXNoNAEcVDo6SGFzaAABNGNoZWNrX3ZlcnNpb24gARBib29sAAYEaEFuIHVwZ3JhZGUgd2FzIGF1dGhvcml6ZWQugFJlamVjdGVkSW52YWxpZEF1dGhvcml6ZWRVcGdyYWRlCAEkY29kZV9oYXNoNAEcVDo6SGFzaAABFGVycm9yaAE0RGlzcGF0Y2hFcnJvcgAHBBEBQW4gaW52YWxpZCBhdXRob3JpemVkIHVwZ3JhZGUgd2FzIHJlamVjdGVkIHdoaWxlIHRyeWluZyB0byBhcHBseSBpdC4EcEV2ZW50IGZvciB0aGUgU3lzdGVtIHBhbGxldC5cCDBmcmFtZV9zeXN0ZW1ERGlzcGF0Y2hFdmVudEluZm8AAAwBGHdlaWdodCgBGFdlaWdodAABFGNsYXNzYAE0RGlzcGF0Y2hDbGFzcwABIHBheXNfZmVlZAEQUGF5cwAAYAw0ZnJhbWVfc3VwcG9ydCBkaXNwYXRjaDREaXNwYXRjaENsYXNzAAEMGE5vcm1hbAAAACxPcGVyYXRpb25hbAABACRNYW5kYXRvcnkAAgAAZAw0ZnJhbWVfc3VwcG9ydCBkaXNwYXRjaBBQYXlzAAEIDFllcwAAAAhObwABAABoCChzcF9ydW50aW1lNERpc3BhdGNoRXJyb3IAATwUT3RoZXIAAAAwQ2Fubm90TG9va3VwAAEAJEJhZE9yaWdpbgACABhNb2R1bGUEAGwBLE1vZHVsZUVycm9yAAMARENvbnN1bWVyUmVtYWluaW5nAAQALE5vUHJvdmlkZXJzAAUAQFRvb01hbnlDb25zdW1lcnMABgAUVG9rZW4EAHABKFRva2VuRXJyb3IABwAoQXJpdGhtZXRpYwQAdAE8QXJpdGhtZXRpY0Vycm9yAAgANFRyYW5zYWN0aW9uYWwEAHgBSFRyYW5zYWN0aW9uYWxFcnJvcgAJACRFeGhhdXN0ZWQACgAoQ29ycnVwdGlvbgALACxVbmF2YWlsYWJsZQAMADhSb290Tm90QWxsb3dlZAANABBUcmllBAB8ASRUcmllRXJyb3IADgAAbAgoc3BfcnVudGltZSxNb2R1bGVFcnJvcgAACAEUaW5kZXgIAQh1OAABFGVycm9ySAGMW3U4OyBNQVhfTU9EVUxFX0VSUk9SX0VOQ09ERURfU0laRV0AAHAIKHNwX3J1bnRpbWUoVG9rZW5FcnJvcgABKEBGdW5kc1VuYXZhaWxhYmxlAAAAME9ubHlQcm92aWRlcgABADBCZWxvd01pbmltdW0AAgAwQ2Fubm90Q3JlYXRlAAMAMFVua25vd25Bc3NldAAEABhGcm96ZW4ABQAsVW5zdXBwb3J0ZWQABgBAQ2Fubm90Q3JlYXRlSG9sZAAHADROb3RFeHBlbmRhYmxlAAgAHEJsb2NrZWQACQAAdAg0c3BfYXJpdGhtZXRpYzxBcml0aG1ldGljRXJyb3IAAQwkVW5kZXJmbG93AAAAIE92ZXJmbG93AAEAOERpdmlzaW9uQnlaZXJvAAIAAHgIKHNwX3J1bnRpbWVIVHJhbnNhY3Rpb25hbEVycm9yAAEIMExpbWl0UmVhY2hlZAAAABxOb0xheWVyAAEAAHwMKHNwX3J1bnRpbWUwcHJvdmluZ190cmllJFRyaWVFcnJvcgABOEBJbnZhbGlkU3RhdGVSb290AAAASEluY29tcGxldGVEYXRhYmFzZQABAFBWYWx1ZUF0SW5jb21wbGV0ZUtleQACADBEZWNvZGVyRXJyb3IAAwAsSW52YWxpZEhhc2gABAAwRHVwbGljYXRlS2V5AAUAOEV4dHJhbmVvdXNOb2RlAAYAPEV4dHJhbmVvdXNWYWx1ZQAHAFxFeHRyYW5lb3VzSGFzaFJlZmVyZW5jZQAIAFRJbnZhbGlkQ2hpbGRSZWZlcmVuY2UACQA0VmFsdWVNaXNtYXRjaAAKADxJbmNvbXBsZXRlUHJvb2YACwAwUm9vdE1pc21hdGNoAAwALERlY29kZUVycm9yAA0AAIAMOHBhbGxldF9pbmRpY2VzGHBhbGxldBRFdmVudAQEVAABEDRJbmRleEFzc2lnbmVkCAEMd2hvAAEwVDo6QWNjb3VudElkAAEUaW5kZXgQATxUOjpBY2NvdW50SW5kZXgAAAR0QSBhY2NvdW50IGluZGV4IHdhcyBhc3NpZ25lZC4oSW5kZXhGcmVlZAQBFGluZGV4EAE8VDo6QWNjb3VudEluZGV4AAEEvEEgYWNjb3VudCBpbmRleCBoYXMgYmVlbiBmcmVlZCB1cCAodW5hc3NpZ25lZCkuLEluZGV4RnJvemVuCAEUaW5kZXgQATxUOjpBY2NvdW50SW5kZXgAAQx3aG8AATBUOjpBY2NvdW50SWQAAgToQSBhY2NvdW50IGluZGV4IGhhcyBiZWVuIGZyb3plbiB0byBpdHMgY3VycmVudCBhY2NvdW50IElELjBEZXBvc2l0UG9rZWQQAQx3aG8AATBUOjpBY2NvdW50SWQAARRpbmRleBABPFQ6OkFjY291bnRJbmRleAABLG9sZF9kZXBvc2l0GAEwQmFsYW5jZU9mPFQ+AAEsbmV3X2RlcG9zaXQYATBCYWxhbmNlT2Y8VD4AAwToQSBkZXBvc2l0IHRvIHJlc2VydmUgYW4gaW5kZXggaGFzIGJlZW4gcG9rZWQvcmVjb25zaWRlcmVkLgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldIQMPHBhbGxldF9iYWxhbmNlcxhwYWxsZXQURXZlbnQIBFQABEkAAVgcRW5kb3dlZAgBHGFjY291bnQAATBUOjpBY2NvdW50SWQAATBmcmVlX2JhbGFuY2UYAShUOjpCYWxhbmNlAAAEuEFuIGFjY291bnQgd2FzIGNyZWF0ZWQgd2l0aCBzb21lIGZyZWUgYmFsYW5jZS4gRHVzdExvc3QIARxhY2NvdW50AAEwVDo6QWNjb3VudElkAAEYYW1vdW50GAEoVDo6QmFsYW5jZQABCD0BQW4gYWNjb3VudCB3YXMgcmVtb3ZlZCB3aG9zZSBiYWxhbmNlIHdhcyBub24temVybyBidXQgYmVsb3cgRXhpc3RlbnRpYWxEZXBvc2l0LHhyZXN1bHRpbmcgaW4gYW4gb3V0cmlnaHQgbG9zcy4gVHJhbnNmZXIMARBmcm9tAAEwVDo6QWNjb3VudElkAAEIdG8AATBUOjpBY2NvdW50SWQAARhhbW91bnQYAShUOjpCYWxhbmNlAAIETFRyYW5zZmVyIHN1Y2NlZWRlZC4oQmFsYW5jZVNldAgBDHdobwABMFQ6OkFjY291bnRJZAABEGZyZWUYAShUOjpCYWxhbmNlAAMEaEEgYmFsYW5jZSB3YXMgc2V0IGJ5IHJvb3QuIFJlc2VydmVkCAEMd2hvAAEwVDo6QWNjb3VudElkAAEYYW1vdW50GAEoVDo6QmFsYW5jZQAEBOBTb21lIGJhbGFuY2Ugd2FzIHJlc2VydmVkIChtb3ZlZCBmcm9tIGZyZWUgdG8gcmVzZXJ2ZWQpLihVbnJlc2VydmVkCAEMd2hvAAEwVDo6QWNjb3VudElkAAEYYW1vdW50GAEoVDo6QmFsYW5jZQAFBOhTb21lIGJhbGFuY2Ugd2FzIHVucmVzZXJ2ZWQgKG1vdmVkIGZyb20gcmVzZXJ2ZWQgdG8gZnJlZSkuSFJlc2VydmVSZXBhdHJpYXRlZBABEGZyb20AATBUOjpBY2NvdW50SWQAAQh0bwABMFQ6OkFjY291bnRJZAABGGFtb3VudBgBKFQ6OkJhbGFuY2UAAUhkZXN0aW5hdGlvbl9zdGF0dXOIARhTdGF0dXMABghNAVNvbWUgYmFsYW5jZSB3YXMgbW92ZWQgZnJvbSB0aGUgcmVzZXJ2ZSBvZiB0aGUgZmlyc3QgYWNjb3VudCB0byB0aGUgc2Vjb25kIGFjY291bnQu2EZpbmFsIGFyZ3VtZW50IGluZGljYXRlcyB0aGUgZGVzdGluYXRpb24gYmFsYW5jZSB0eXBlLhxEZXBvc2l0CAEMd2hvAAEwVDo6QWNjb3VudElkAAEYYW1vdW50GAEoVDo6QmFsYW5jZQAHBNhTb21lIGFtb3VudCB3YXMgZGVwb3NpdGVkIChlLmcuIGZvciB0cmFuc2FjdGlvbiBmZWVzKS4gV2l0aGRyYXcIAQx3aG8AATBUOjpBY2NvdW50SWQAARhhbW91bnQYAShUOjpCYWxhbmNlAAgEHQFTb21lIGFtb3VudCB3YXMgd2l0aGRyYXduIGZyb20gdGhlIGFjY291bnQgKGUuZy4gZm9yIHRyYW5zYWN0aW9uIGZlZXMpLhxTbGFzaGVkCAEMd2hvAAEwVDo6QWNjb3VudElkAAEYYW1vdW50GAEoVDo6QmFsYW5jZQAJBAEBU29tZSBhbW91bnQgd2FzIHJlbW92ZWQgZnJvbSB0aGUgYWNjb3VudCAoZS5nLiBmb3IgbWlzYmVoYXZpb3IpLhhNaW50ZWQIAQx3aG8AATBUOjpBY2NvdW50SWQAARhhbW91bnQYAShUOjpCYWxhbmNlAAoEnFNvbWUgYW1vdW50IHdhcyBtaW50ZWQgaW50byBhbiBhY2NvdW50LhhCdXJuZWQIAQx3aG8AATBUOjpBY2NvdW50SWQAARhhbW91bnQYAShUOjpCYWxhbmNlAAsEnFNvbWUgYW1vdW50IHdhcyBidXJuZWQgZnJvbSBhbiBhY2NvdW50LiRTdXNwZW5kZWQIAQx3aG8AATBUOjpBY2NvdW50SWQAARhhbW91bnQYAShUOjpCYWxhbmNlAAwEFQFTb21lIGFtb3VudCB3YXMgc3VzcGVuZGVkIGZyb20gYW4gYWNjb3VudCAoaXQgY2FuIGJlIHJlc3RvcmVkIGxhdGVyKS4gUmVzdG9yZWQIAQx3aG8AATBUOjpBY2NvdW50SWQAARhhbW91bnQYAShUOjpCYWxhbmNlAA0EpFNvbWUgYW1vdW50IHdhcyByZXN0b3JlZCBpbnRvIGFuIGFjY291bnQuIFVwZ3JhZGVkBAEMd2hvAAEwVDo6QWNjb3VudElkAA4EYEFuIGFjY291bnQgd2FzIHVwZ3JhZGVkLhhJc3N1ZWQEARhhbW91bnQYAShUOjpCYWxhbmNlAA8ELQFUb3RhbCBpc3N1YW5jZSB3YXMgaW5jcmVhc2VkIGJ5IGBhbW91bnRgLCBjcmVhdGluZyBhIGNyZWRpdCB0byBiZSBiYWxhbmNlZC4kUmVzY2luZGVkBAEYYW1vdW50GAEoVDo6QmFsYW5jZQAQBCUBVG90YWwgaXNzdWFuY2Ugd2FzIGRlY3JlYXNlZCBieSBgYW1vdW50YCwgY3JlYXRpbmcgYSBkZWJ0IHRvIGJlIGJhbGFuY2VkLhhMb2NrZWQIAQx3aG8AATBUOjpBY2NvdW50SWQAARhhbW91bnQYAShUOjpCYWxhbmNlABEEYFNvbWUgYmFsYW5jZSB3YXMgbG9ja2VkLiBVbmxvY2tlZAgBDHdobwABMFQ6OkFjY291bnRJZAABGGFtb3VudBgBKFQ6OkJhbGFuY2UAEgRoU29tZSBiYWxhbmNlIHdhcyB1bmxvY2tlZC4YRnJvemVuCAEMd2hvAAEwVDo6QWNjb3VudElkAAEYYW1vdW50GAEoVDo6QmFsYW5jZQATBGBTb21lIGJhbGFuY2Ugd2FzIGZyb3plbi4YVGhhd2VkCAEMd2hvAAEwVDo6QWNjb3VudElkAAEYYW1vdW50GAEoVDo6QmFsYW5jZQAUBGBTb21lIGJhbGFuY2Ugd2FzIHRoYXdlZC5MVG90YWxJc3N1YW5jZUZvcmNlZAgBDG9sZBgBKFQ6OkJhbGFuY2UAAQxuZXcYAShUOjpCYWxhbmNlABUErFRoZSBgVG90YWxJc3N1YW5jZWAgd2FzIGZvcmNlZnVsbHkgY2hhbmdlZC4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXSIFDRmcmFtZV9zdXBwb3J0GHRyYWl0cxh0b2tlbnMQbWlzYzRCYWxhbmNlU3RhdHVzAAEIEEZyZWUAAAAgUmVzZXJ2ZWQAAQAAjAxocGFsbGV0X3RyYW5zYWN0aW9uX3BheW1lbnQYcGFsbGV0FEV2ZW50BARUAAEESFRyYW5zYWN0aW9uRmVlUGFpZAwBDHdobwABMFQ6OkFjY291bnRJZAABKGFjdHVhbF9mZWUYATBCYWxhbmNlT2Y8VD4AAQx0aXAYATBCYWxhbmNlT2Y8VD4AAAhZAUEgdHJhbnNhY3Rpb24gZmVlIGBhY3R1YWxfZmVlYCwgb2Ygd2hpY2ggYHRpcGAgd2FzIGFkZGVkIHRvIHRoZSBtaW5pbXVtIGluY2x1c2lvbiBmZWUsXGhhcyBiZWVuIHBhaWQgYnkgYHdob2AuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0kBA4cGFsbGV0X3N0YWtpbmcYcGFsbGV0GHBhbGxldBRFdmVudAQEVAABTBxFcmFQYWlkDAEkZXJhX2luZGV4EAEgRXJhSW5kZXgAAUB2YWxpZGF0b3JfcGF5b3V0GAEwQmFsYW5jZU9mPFQ+AAEkcmVtYWluZGVyGAEwQmFsYW5jZU9mPFQ+AAAIVQFUaGUgZXJhIHBheW91dCBoYXMgYmVlbiBzZXQ7IHRoZSBmaXJzdCBiYWxhbmNlIGlzIHRoZSB2YWxpZGF0b3ItcGF5b3V0OyB0aGUgc2Vjb25kIGlzwHRoZSByZW1haW5kZXIgZnJvbSB0aGUgbWF4aW11bSBhbW91bnQgb2YgcmV3YXJkLiBSZXdhcmRlZAwBFHN0YXNoAAEwVDo6QWNjb3VudElkAAEQZGVzdJQBfFJld2FyZERlc3RpbmF0aW9uPFQ6OkFjY291bnRJZD4AARhhbW91bnQYATBCYWxhbmNlT2Y8VD4AAQQNAVRoZSBub21pbmF0b3IgaGFzIGJlZW4gcmV3YXJkZWQgYnkgdGhpcyBhbW91bnQgdG8gdGhpcyBkZXN0aW5hdGlvbi4cU2xhc2hlZAgBGHN0YWtlcgABMFQ6OkFjY291bnRJZAABGGFtb3VudBgBMEJhbGFuY2VPZjxUPgACBB0BQSBzdGFrZXIgKHZhbGlkYXRvciBvciBub21pbmF0b3IpIGhhcyBiZWVuIHNsYXNoZWQgYnkgdGhlIGdpdmVuIGFtb3VudC40U2xhc2hSZXBvcnRlZAwBJHZhbGlkYXRvcgABMFQ6OkFjY291bnRJZAABIGZyYWN0aW9umAEcUGVyYmlsbAABJHNsYXNoX2VyYRABIEVyYUluZGV4AAMIWQFBIHNsYXNoIGZvciB0aGUgZ2l2ZW4gdmFsaWRhdG9yLCBmb3IgdGhlIGdpdmVuIHBlcmNlbnRhZ2Ugb2YgdGhlaXIgc3Rha2UsIGF0IHRoZSBnaXZlblRlcmEgYXMgYmVlbiByZXBvcnRlZC5oT2xkU2xhc2hpbmdSZXBvcnREaXNjYXJkZWQEATRzZXNzaW9uX2luZGV4EAEwU2Vzc2lvbkluZGV4AAQIGQFBbiBvbGQgc2xhc2hpbmcgcmVwb3J0IGZyb20gYSBwcmlvciBlcmEgd2FzIGRpc2NhcmRlZCBiZWNhdXNlIGl0IGNvdWxkRG5vdCBiZSBwcm9jZXNzZWQuOFN0YWtlcnNFbGVjdGVkAAUEhEEgbmV3IHNldCBvZiBzdGFrZXJzIHdhcyBlbGVjdGVkLhhCb25kZWQIARRzdGFzaAABMFQ6OkFjY291bnRJZAABGGFtb3VudBgBMEJhbGFuY2VPZjxUPgAGENBBbiBhY2NvdW50IGhhcyBib25kZWQgdGhpcyBhbW91bnQuIFxbc3Rhc2gsIGFtb3VudFxdAE0BTk9URTogVGhpcyBldmVudCBpcyBvbmx5IGVtaXR0ZWQgd2hlbiBmdW5kcyBhcmUgYm9uZGVkIHZpYSBhIGRpc3BhdGNoYWJsZS4gTm90YWJseSwhAWl0IHdpbGwgbm90IGJlIGVtaXR0ZWQgZm9yIHN0YWtpbmcgcmV3YXJkcyB3aGVuIHRoZXkgYXJlIGFkZGVkIHRvIHN0YWtlLiBVbmJvbmRlZAgBFHN0YXNoAAEwVDo6QWNjb3VudElkAAEYYW1vdW50GAEwQmFsYW5jZU9mPFQ+AAcEkEFuIGFjY291bnQgaGFzIHVuYm9uZGVkIHRoaXMgYW1vdW50LiRXaXRoZHJhd24IARRzdGFzaAABMFQ6OkFjY291bnRJZAABGGFtb3VudBgBMEJhbGFuY2VPZjxUPgAICFkBQW4gYWNjb3VudCBoYXMgY2FsbGVkIGB3aXRoZHJhd191bmJvbmRlZGAgYW5kIHJlbW92ZWQgdW5ib25kaW5nIGNodW5rcyB3b3J0aCBgQmFsYW5jZWBkZnJvbSB0aGUgdW5sb2NraW5nIHF1ZXVlLhhLaWNrZWQIASRub21pbmF0b3IAATBUOjpBY2NvdW50SWQAARRzdGFzaAABMFQ6OkFjY291bnRJZAAJBLRBIG5vbWluYXRvciBoYXMgYmVlbiBraWNrZWQgZnJvbSBhIHZhbGlkYXRvci5UU3Rha2luZ0VsZWN0aW9uRmFpbGVkAAoErFRoZSBlbGVjdGlvbiBmYWlsZWQuIE5vIG5ldyBlcmEgaXMgcGxhbm5lZC4cQ2hpbGxlZAQBFHN0YXNoAAEwVDo6QWNjb3VudElkAAsEIQFBbiBhY2NvdW50IGhhcyBzdG9wcGVkIHBhcnRpY2lwYXRpbmcgYXMgZWl0aGVyIGEgdmFsaWRhdG9yIG9yIG5vbWluYXRvci40UGF5b3V0U3RhcnRlZBABJGVyYV9pbmRleBABIEVyYUluZGV4AAE8dmFsaWRhdG9yX3N0YXNoAAEwVDo6QWNjb3VudElkAAEQcGFnZRABEFBhZ2UAARBuZXh0nAEwT3B0aW9uPFBhZ2U+AAwEWQFBIFBhZ2Ugb2Ygc3Rha2VycyByZXdhcmRzIGFyZSBnZXR0aW5nIHBhaWQuIGBuZXh0YCBpcyBgTm9uZWAgaWYgYWxsIHBhZ2VzIGFyZSBjbGFpbWVkLkRWYWxpZGF0b3JQcmVmc1NldAgBFHN0YXNoAAEwVDo6QWNjb3VudElkAAEUcHJlZnOgAThWYWxpZGF0b3JQcmVmcwANBJhBIHZhbGlkYXRvciBoYXMgc2V0IHRoZWlyIHByZWZlcmVuY2VzLmhTbmFwc2hvdFZvdGVyc1NpemVFeGNlZWRlZAQBEHNpemUQAQx1MzIADgRoVm90ZXJzIHNpemUgbGltaXQgcmVhY2hlZC5sU25hcHNob3RUYXJnZXRzU2l6ZUV4Y2VlZGVkBAEQc2l6ZRABDHUzMgAPBGxUYXJnZXRzIHNpemUgbGltaXQgcmVhY2hlZC4gRm9yY2VFcmEEARBtb2RlqAEcRm9yY2luZwAQBHRBIG5ldyBmb3JjZSBlcmEgbW9kZSB3YXMgc2V0LmRDb250cm9sbGVyQmF0Y2hEZXByZWNhdGVkBAEgZmFpbHVyZXMQAQx1MzIAEQSkUmVwb3J0IG9mIGEgY29udHJvbGxlciBiYXRjaCBkZXByZWNhdGlvbi5AQ3VycmVuY3lNaWdyYXRlZAgBFHN0YXNoAAEwVDo6QWNjb3VudElkAAE4Zm9yY2Vfd2l0aGRyYXcYATBCYWxhbmNlT2Y8VD4AEghVAVN0YWtpbmcgYmFsYW5jZSBtaWdyYXRlZCBmcm9tIGxvY2tzIHRvIGhvbGRzLCB3aXRoIGFueSBiYWxhbmNlIHRoYXQgY291bGQgbm90IGJlIGhlbGRMaXMgZm9yY2Ugd2l0aGRyYXduLgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldJQIOHBhbGxldF9zdGFraW5nRFJld2FyZERlc3RpbmF0aW9uBCRBY2NvdW50SWQBAAEUGFN0YWtlZAAAABRTdGFzaAABAChDb250cm9sbGVyAAIAHEFjY291bnQEAAABJEFjY291bnRJZAADABBOb25lAAQAAJgMNHNwX2FyaXRobWV0aWMocGVyX3RoaW5ncxxQZXJiaWxsAAAEABABDHUzMgAAnAQYT3B0aW9uBARUARABCBBOb25lAAAAEFNvbWUEABAAAAEAAKAIOHBhbGxldF9zdGFraW5nOFZhbGlkYXRvclByZWZzAAAIAShjb21taXNzaW9upAEcUGVyYmlsbAABHGJsb2NrZWQgARBib29sAACkAAAGmACoCDhwYWxsZXRfc3Rha2luZxxGb3JjaW5nAAEQKE5vdEZvcmNpbmcAAAAgRm9yY2VOZXcAAQAkRm9yY2VOb25lAAIALEZvcmNlQWx3YXlzAAMAAKwMPHBhbGxldF9vZmZlbmNlcxhwYWxsZXQURXZlbnQAAQQcT2ZmZW5jZQgBEGtpbmSwARBLaW5kAAEgdGltZXNsb3Q4AThPcGFxdWVUaW1lU2xvdAAADFEBVGhlcmUgaXMgYW4gb2ZmZW5jZSByZXBvcnRlZCBvZiB0aGUgZ2l2ZW4gYGtpbmRgIGhhcHBlbmVkIGF0IHRoZSBgc2Vzc2lvbl9pbmRleGAgYW5kNQEoa2luZC1zcGVjaWZpYykgdGltZSBzbG90LiBUaGlzIGV2ZW50IGlzIG5vdCBkZXBvc2l0ZWQgZm9yIGR1cGxpY2F0ZSBzbGFzaGVzLkxcW2tpbmQsIHRpbWVzbG90XF0uBDBFdmVudHMgdHlwZS6wAAADEAAAAAgAtBA4cGFsbGV0X3Nlc3Npb24oaGlzdG9yaWNhbBhwYWxsZXQURXZlbnQEBFQAAQgoUm9vdFN0b3JlZAQBFGluZGV4EAEwU2Vzc2lvbkluZGV4AAAEBQFUaGUgbWVya2xlIHJvb3Qgb2YgdGhlIHZhbGlkYXRvcnMgb2YgdGhlIHNhaWQgc2Vzc2lvbiB3ZXJlIHN0b3JlZCxSb290c1BydW5lZAQBFHVwX3RvEAEwU2Vzc2lvbkluZGV4AAEE4FRoZSBtZXJrbGUgcm9vdHMgb2YgdXAgdG8gdGhpcyBzZXNzaW9uIGluZGV4IHdlcmUgcHJ1bmVkBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0uAxEcGFsbGV0X3BhcmFtZXRlcnMYcGFsbGV0FEV2ZW50BARUAAEEHFVwZGF0ZWQMAQxrZXm8AcQ8VDo6UnVudGltZVBhcmFtZXRlcnMgYXMgQWdncmVnYXRlZEtleVZhbHVlPjo6S2V5BGRUaGUga2V5IHRoYXQgd2FzIHVwZGF0ZWQuASRvbGRfdmFsdWXYAexPcHRpb248PFQ6OlJ1bnRpbWVQYXJhbWV0ZXJzIGFzIEFnZ3JlZ2F0ZWRLZXlWYWx1ZT46OlZhbHVlPgR8VGhlIG9sZCB2YWx1ZSBiZWZvcmUgdGhpcyBjYWxsLgEkbmV3X3ZhbHVl2AHsT3B0aW9uPDxUOjpSdW50aW1lUGFyYW1ldGVycyBhcyBBZ2dyZWdhdGVkS2V5VmFsdWU+OjpWYWx1ZT4EeFRoZSBuZXcgdmFsdWUgYWZ0ZXIgdGhpcyBjYWxsLgAMUEEgUGFyYW1ldGVyIHdhcyBzZXQuALxJcyBhbHNvIGVtaXR0ZWQgd2hlbiB0aGUgdmFsdWUgd2FzIG5vdCBjaGFuZ2VkLgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldLwIPHdlc3RlbmRfcnVudGltZVBSdW50aW1lUGFyYW1ldGVyc0tleQABBCRJbmZsYXRpb24EAMABqQE8ZHluYW1pY19wYXJhbXM6OmluZmxhdGlvbjo6UGFyYW1ldGVycyBhcyBmcmFtZV9zdXBwb3J0Ojp0cmFpdHM6OgpkeW5hbWljX3BhcmFtczo6QWdncmVnYXRlZEtleVZhbHVlPjo6S2V5AAAAAMAQPHdlc3RlbmRfcnVudGltZThkeW5hbWljX3BhcmFtcyRpbmZsYXRpb240UGFyYW1ldGVyc0tleQABFDBNaW5JbmZsYXRpb24EAMQBME1pbkluZmxhdGlvbgAAADBNYXhJbmZsYXRpb24EAMgBME1heEluZmxhdGlvbgABAChJZGVhbFN0YWtlBADMAShJZGVhbFN0YWtlAAIAHEZhbGxvZmYEANABHEZhbGxvZmYAAwA8VXNlQXVjdGlvblNsb3RzBADUATxVc2VBdWN0aW9uU2xvdHMABAAAxBA8d2VzdGVuZF9ydW50aW1lOGR5bmFtaWNfcGFyYW1zJGluZmxhdGlvbjBNaW5JbmZsYXRpb24AAAAAyBA8d2VzdGVuZF9ydW50aW1lOGR5bmFtaWNfcGFyYW1zJGluZmxhdGlvbjBNYXhJbmZsYXRpb24AAAAAzBA8d2VzdGVuZF9ydW50aW1lOGR5bmFtaWNfcGFyYW1zJGluZmxhdGlvbihJZGVhbFN0YWtlAAAAANAQPHdlc3RlbmRfcnVudGltZThkeW5hbWljX3BhcmFtcyRpbmZsYXRpb24cRmFsbG9mZgAAAADUEDx3ZXN0ZW5kX3J1bnRpbWU4ZHluYW1pY19wYXJhbXMkaW5mbGF0aW9uPFVzZUF1Y3Rpb25TbG90cwAAAADYBBhPcHRpb24EBFQB3AEIEE5vbmUAAAAQU29tZQQA3AAAAQAA3Ag8d2VzdGVuZF9ydW50aW1lWFJ1bnRpbWVQYXJhbWV0ZXJzVmFsdWUAAQQkSW5mbGF0aW9uBADgAbEBPGR5bmFtaWNfcGFyYW1zOjppbmZsYXRpb246OlBhcmFtZXRlcnMgYXMgZnJhbWVfc3VwcG9ydDo6dHJhaXRzOjoKZHluYW1pY19wYXJhbXM6OkFnZ3JlZ2F0ZWRLZXlWYWx1ZT46OlZhbHVlAAAAAOAQPHdlc3RlbmRfcnVudGltZThkeW5hbWljX3BhcmFtcyRpbmZsYXRpb248UGFyYW1ldGVyc1ZhbHVlAAEUME1pbkluZmxhdGlvbgQA5AEsUGVycXVpbnRpbGwAAAAwTWF4SW5mbGF0aW9uBADkASxQZXJxdWludGlsbAABAChJZGVhbFN0YWtlBADkASxQZXJxdWludGlsbAACABxGYWxsb2ZmBADkASxQZXJxdWludGlsbAADADxVc2VBdWN0aW9uU2xvdHMEACABEGJvb2wABAAA5Aw0c3BfYXJpdGhtZXRpYyhwZXJfdGhpbmdzLFBlcnF1aW50aWxsAAAEADABDHU2NAAA6Aw4cGFsbGV0X3Nlc3Npb24YcGFsbGV0FEV2ZW50BARUAAEQKE5ld1Nlc3Npb24EATRzZXNzaW9uX2luZGV4EAEwU2Vzc2lvbkluZGV4AAAIOQFOZXcgc2Vzc2lvbiBoYXMgaGFwcGVuZWQuIE5vdGUgdGhhdCB0aGUgYXJndW1lbnQgaXMgdGhlIHNlc3Npb24gaW5kZXgsIG5vdCB0aGWcYmxvY2sgbnVtYmVyIGFzIHRoZSB0eXBlIG1pZ2h0IHN1Z2dlc3QuJE5ld1F1ZXVlZAABCEkBVGhlIGBOZXdTZXNzaW9uYCBldmVudCBpbiB0aGUgY3VycmVudCBibG9jayBhbHNvIGltcGxpZXMgYSBuZXcgdmFsaWRhdG9yIHNldCB0byBiZRxxdWV1ZWQuRFZhbGlkYXRvckRpc2FibGVkBAEkdmFsaWRhdG9yAAE4VDo6VmFsaWRhdG9ySWQAAgRwVmFsaWRhdG9yIGhhcyBiZWVuIGRpc2FibGVkLkhWYWxpZGF0b3JSZWVuYWJsZWQEASR2YWxpZGF0b3IAAThUOjpWYWxpZGF0b3JJZAADBHhWYWxpZGF0b3IgaGFzIGJlZW4gcmUtZW5hYmxlZC4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXTsDDhwYWxsZXRfZ3JhbmRwYRhwYWxsZXQURXZlbnQAAQw4TmV3QXV0aG9yaXRpZXMEATRhdXRob3JpdHlfc2V08AE0QXV0aG9yaXR5TGlzdAAABIxOZXcgYXV0aG9yaXR5IHNldCBoYXMgYmVlbiBhcHBsaWVkLhhQYXVzZWQAAQSYQ3VycmVudCBhdXRob3JpdHkgc2V0IGhhcyBiZWVuIHBhdXNlZC4cUmVzdW1lZAACBJxDdXJyZW50IGF1dGhvcml0eSBzZXQgaGFzIGJlZW4gcmVzdW1lZC4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXTwAAAC9AD0AAAECPgwAPgMUHNwX2NvbnNlbnN1c19ncmFuZHBhDGFwcBhQdWJsaWMAAAQABAE8ZWQyNTUxOTo6UHVibGljAAD8DDhwYWxsZXRfdXRpbGl0eRhwYWxsZXQURXZlbnQAASBAQmF0Y2hJbnRlcnJ1cHRlZAgBFGluZGV4EAEMdTMyAAEUZXJyb3JoATREaXNwYXRjaEVycm9yAAAIVQFCYXRjaCBvZiBkaXNwYXRjaGVzIGRpZCBub3QgY29tcGxldGUgZnVsbHkuIEluZGV4IG9mIGZpcnN0IGZhaWxpbmcgZGlzcGF0Y2ggZ2l2ZW4sIGFzSHdlbGwgYXMgdGhlIGVycm9yLjhCYXRjaENvbXBsZXRlZAABBMhCYXRjaCBvZiBkaXNwYXRjaGVzIGNvbXBsZXRlZCBmdWxseSB3aXRoIG5vIGVycm9yLmBCYXRjaENvbXBsZXRlZFdpdGhFcnJvcnMAAgS0QmF0Y2ggb2YgZGlzcGF0Y2hlcyBjb21wbGV0ZWQgYnV0IGhhcyBlcnJvcnMuNEl0ZW1Db21wbGV0ZWQAAwQdAUEgc2luZ2xlIGl0ZW0gd2l0aGluIGEgQmF0Y2ggb2YgZGlzcGF0Y2hlcyBoYXMgY29tcGxldGVkIHdpdGggbm8gZXJyb3IuKEl0ZW1GYWlsZWQEARRlcnJvcmgBNERpc3BhdGNoRXJyb3IABAQRAUEgc2luZ2xlIGl0ZW0gd2l0aGluIGEgQmF0Y2ggb2YgZGlzcGF0Y2hlcyBoYXMgY29tcGxldGVkIHdpdGggZXJyb3IuMERpc3BhdGNoZWRBcwQBGHJlc3VsdAEBAThEaXNwYXRjaFJlc3VsdAAFBFhBIGNhbGwgd2FzIGRpc3BhdGNoZWQuRElmRWxzZU1haW5TdWNjZXNzAAYEZE1haW4gY2FsbCB3YXMgZGlzcGF0Y2hlZC5QSWZFbHNlRmFsbGJhY2tDYWxsZWQEAShtYWluX2Vycm9yaAE0RGlzcGF0Y2hFcnJvcgAHBIRUaGUgZmFsbGJhY2sgY2FsbCB3YXMgZGlzcGF0Y2hlZC4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXQBAQQYUmVzdWx0CARUAQUBBEUBaAEICE9rBAAFAQAAAAAMRXJyBABoAAABAAAFAQAABAAACQEMPHBhbGxldF9pZGVudGl0eRhwYWxsZXQURXZlbnQEBFQAAVgsSWRlbnRpdHlTZXQEAQx3aG8AATBUOjpBY2NvdW50SWQAAATsQSBuYW1lIHdhcyBzZXQgb3IgcmVzZXQgKHdoaWNoIHdpbGwgcmVtb3ZlIGFsbCBqdWRnZW1lbnRzKS48SWRlbnRpdHlDbGVhcmVkCAEMd2hvAAEwVDo6QWNjb3VudElkAAEcZGVwb3NpdBgBMEJhbGFuY2VPZjxUPgABBMxBIG5hbWUgd2FzIGNsZWFyZWQsIGFuZCB0aGUgZ2l2ZW4gYmFsYW5jZSByZXR1cm5lZC44SWRlbnRpdHlLaWxsZWQIAQx3aG8AATBUOjpBY2NvdW50SWQAARxkZXBvc2l0GAEwQmFsYW5jZU9mPFQ+AAIExEEgbmFtZSB3YXMgcmVtb3ZlZCBhbmQgdGhlIGdpdmVuIGJhbGFuY2Ugc2xhc2hlZC5ISnVkZ2VtZW50UmVxdWVzdGVkCAEMd2hvAAEwVDo6QWNjb3VudElkAAE8cmVnaXN0cmFyX2luZGV4EAE4UmVnaXN0cmFySW5kZXgAAwScQSBqdWRnZW1lbnQgd2FzIGFza2VkIGZyb20gYSByZWdpc3RyYXIuUEp1ZGdlbWVudFVucmVxdWVzdGVkCAEMd2hvAAEwVDo6QWNjb3VudElkAAE8cmVnaXN0cmFyX2luZGV4EAE4UmVnaXN0cmFySW5kZXgABASIQSBqdWRnZW1lbnQgcmVxdWVzdCB3YXMgcmV0cmFjdGVkLjhKdWRnZW1lbnRHaXZlbggBGHRhcmdldAABMFQ6OkFjY291bnRJZAABPHJlZ2lzdHJhcl9pbmRleBABOFJlZ2lzdHJhckluZGV4AAUElEEganVkZ2VtZW50IHdhcyBnaXZlbiBieSBhIHJlZ2lzdHJhci44UmVnaXN0cmFyQWRkZWQEATxyZWdpc3RyYXJfaW5kZXgQAThSZWdpc3RyYXJJbmRleAAGBFhBIHJlZ2lzdHJhciB3YXMgYWRkZWQuQFN1YklkZW50aXR5QWRkZWQMAQxzdWIAATBUOjpBY2NvdW50SWQAARBtYWluAAEwVDo6QWNjb3VudElkAAEcZGVwb3NpdBgBMEJhbGFuY2VPZjxUPgAHBPRBIHN1Yi1pZGVudGl0eSB3YXMgYWRkZWQgdG8gYW4gaWRlbnRpdHkgYW5kIHRoZSBkZXBvc2l0IHBhaWQuQFN1YklkZW50aXRpZXNTZXQMARBtYWluAAEwVDo6QWNjb3VudElkAAE4bnVtYmVyX29mX3N1YnMQAQx1MzIAASxuZXdfZGVwb3NpdBgBMEJhbGFuY2VPZjxUPgAIBLxBbiBhY2NvdW50J3Mgc3ViLWlkZW50aXRpZXMgd2VyZSBzZXQgKGluIGJ1bGspLkhTdWJJZGVudGl0eVJlbmFtZWQIAQxzdWIAATBUOjpBY2NvdW50SWQAARBtYWluAAEwVDo6QWNjb3VudElkAAkEIQFBIGdpdmVuIHN1Yi1hY2NvdW50J3MgYXNzb2NpYXRlZCBuYW1lIHdhcyBjaGFuZ2VkIGJ5IGl0cyBzdXBlci1pZGVudGl0eS5IU3ViSWRlbnRpdHlSZW1vdmVkDAEMc3ViAAEwVDo6QWNjb3VudElkAAEQbWFpbgABMFQ6OkFjY291bnRJZAABHGRlcG9zaXQYATBCYWxhbmNlT2Y8VD4ACgQJAUEgc3ViLWlkZW50aXR5IHdhcyByZW1vdmVkIGZyb20gYW4gaWRlbnRpdHkgYW5kIHRoZSBkZXBvc2l0IGZyZWVkLkhTdWJJZGVudGl0eVJldm9rZWQMAQxzdWIAATBUOjpBY2NvdW50SWQAARBtYWluAAEwVDo6QWNjb3VudElkAAEcZGVwb3NpdBgBMEJhbGFuY2VPZjxUPgALCBkBQSBzdWItaWRlbnRpdHkgd2FzIGNsZWFyZWQsIGFuZCB0aGUgZ2l2ZW4gZGVwb3NpdCByZXBhdHJpYXRlZCBmcm9tIHRoZchtYWluIGlkZW50aXR5IGFjY291bnQgdG8gdGhlIHN1Yi1pZGVudGl0eSBhY2NvdW50LjhBdXRob3JpdHlBZGRlZAQBJGF1dGhvcml0eQABMFQ6OkFjY291bnRJZAAMBHxBIHVzZXJuYW1lIGF1dGhvcml0eSB3YXMgYWRkZWQuQEF1dGhvcml0eVJlbW92ZWQEASRhdXRob3JpdHkAATBUOjpBY2NvdW50SWQADQSEQSB1c2VybmFtZSBhdXRob3JpdHkgd2FzIHJlbW92ZWQuLFVzZXJuYW1lU2V0CAEMd2hvAAEwVDo6QWNjb3VudElkAAEgdXNlcm5hbWUNAQEsVXNlcm5hbWU8VD4ADgR0QSB1c2VybmFtZSB3YXMgc2V0IGZvciBgd2hvYC44VXNlcm5hbWVRdWV1ZWQMAQx3aG8AATBUOjpBY2NvdW50SWQAASB1c2VybmFtZQ0BASxVc2VybmFtZTxUPgABKGV4cGlyYXRpb24QAURCbG9ja051bWJlckZvcjxUPgAPBBkBQSB1c2VybmFtZSB3YXMgcXVldWVkLCBidXQgYHdob2AgbXVzdCBhY2NlcHQgaXQgcHJpb3IgdG8gYGV4cGlyYXRpb25gLkhQcmVhcHByb3ZhbEV4cGlyZWQEARR3aG9zZQABMFQ6OkFjY291bnRJZAAQBDkBQSBxdWV1ZWQgdXNlcm5hbWUgcGFzc2VkIGl0cyBleHBpcmF0aW9uIHdpdGhvdXQgYmVpbmcgY2xhaW1lZCBhbmQgd2FzIHJlbW92ZWQuSFByaW1hcnlVc2VybmFtZVNldAgBDHdobwABMFQ6OkFjY291bnRJZAABIHVzZXJuYW1lDQEBLFVzZXJuYW1lPFQ+ABEEAQFBIHVzZXJuYW1lIHdhcyBzZXQgYXMgYSBwcmltYXJ5IGFuZCBjYW4gYmUgbG9va2VkIHVwIGZyb20gYHdob2AuXERhbmdsaW5nVXNlcm5hbWVSZW1vdmVkCAEMd2hvAAEwVDo6QWNjb3VudElkAAEgdXNlcm5hbWUNAQEsVXNlcm5hbWU8VD4AEghdAUEgZGFuZ2xpbmcgdXNlcm5hbWUgKGFzIGluLCBhIHVzZXJuYW1lIGNvcnJlc3BvbmRpbmcgdG8gYW4gYWNjb3VudCB0aGF0IGhhcyByZW1vdmVkIGl0c2xpZGVudGl0eSkgaGFzIGJlZW4gcmVtb3ZlZC48VXNlcm5hbWVVbmJvdW5kBAEgdXNlcm5hbWUNAQEsVXNlcm5hbWU8VD4AEwRwQSB1c2VybmFtZSBoYXMgYmVlbiB1bmJvdW5kLjxVc2VybmFtZVJlbW92ZWQEASB1c2VybmFtZQ0BASxVc2VybmFtZTxUPgAUBHBBIHVzZXJuYW1lIGhhcyBiZWVuIHJlbW92ZWQuOFVzZXJuYW1lS2lsbGVkBAEgdXNlcm5hbWUNAQEsVXNlcm5hbWU8VD4AFQRsQSB1c2VybmFtZSBoYXMgYmVlbiBraWxsZWQuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0DQEMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAEIBFMAAAQAOAEYVmVjPFQ+AAARAQw8cGFsbGV0X3JlY292ZXJ5GHBhbGxldBRFdmVudAQEVAABHDxSZWNvdmVyeUNyZWF0ZWQEARxhY2NvdW50AAEwVDo6QWNjb3VudElkAAAEyEEgcmVjb3ZlcnkgcHJvY2VzcyBoYXMgYmVlbiBzZXQgdXAgZm9yIGFuIGFjY291bnQuRFJlY292ZXJ5SW5pdGlhdGVkCAEwbG9zdF9hY2NvdW50AAEwVDo6QWNjb3VudElkAAE8cmVzY3Vlcl9hY2NvdW50AAEwVDo6QWNjb3VudElkAAEEKQFBIHJlY292ZXJ5IHByb2Nlc3MgaGFzIGJlZW4gaW5pdGlhdGVkIGZvciBsb3N0IGFjY291bnQgYnkgcmVzY3VlciBhY2NvdW50LjxSZWNvdmVyeVZvdWNoZWQMATBsb3N0X2FjY291bnQAATBUOjpBY2NvdW50SWQAATxyZXNjdWVyX2FjY291bnQAATBUOjpBY2NvdW50SWQAARhzZW5kZXIAATBUOjpBY2NvdW50SWQAAgRZAUEgcmVjb3ZlcnkgcHJvY2VzcyBmb3IgbG9zdCBhY2NvdW50IGJ5IHJlc2N1ZXIgYWNjb3VudCBoYXMgYmVlbiB2b3VjaGVkIGZvciBieSBzZW5kZXIuOFJlY292ZXJ5Q2xvc2VkCAEwbG9zdF9hY2NvdW50AAEwVDo6QWNjb3VudElkAAE8cmVzY3Vlcl9hY2NvdW50AAEwVDo6QWNjb3VudElkAAMEHQFBIHJlY292ZXJ5IHByb2Nlc3MgZm9yIGxvc3QgYWNjb3VudCBieSByZXNjdWVyIGFjY291bnQgaGFzIGJlZW4gY2xvc2VkLkBBY2NvdW50UmVjb3ZlcmVkCAEwbG9zdF9hY2NvdW50AAEwVDo6QWNjb3VudElkAAE8cmVzY3Vlcl9hY2NvdW50AAEwVDo6QWNjb3VudElkAAQEAQFMb3N0IGFjY291bnQgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHJlY292ZXJlZCBieSByZXNjdWVyIGFjY291bnQuPFJlY292ZXJ5UmVtb3ZlZAQBMGxvc3RfYWNjb3VudAABMFQ6OkFjY291bnRJZAAFBMxBIHJlY292ZXJ5IHByb2Nlc3MgaGFzIGJlZW4gcmVtb3ZlZCBmb3IgYW4gYWNjb3VudC4wRGVwb3NpdFBva2VkEAEMd2hvAAEwVDo6QWNjb3VudElkAAEQa2luZBUBAThEZXBvc2l0S2luZDxUPgABLG9sZF9kZXBvc2l0GAEwQmFsYW5jZU9mPFQ+AAEsbmV3X2RlcG9zaXQYATBCYWxhbmNlT2Y8VD4ABgRsQSBkZXBvc2l0IGhhcyBiZWVuIHVwZGF0ZWQuBDBFdmVudHMgdHlwZS4VAQg8cGFsbGV0X3JlY292ZXJ5LERlcG9zaXRLaW5kBARUARkBAQg4UmVjb3ZlcnlDb25maWcAAABEQWN0aXZlUmVjb3ZlcnlGb3IEAAABmDxUIGFzIGZyYW1lX3N5c3RlbTo6Q29uZmlnPjo6QWNjb3VudElkAAEAABkBCDx3ZXN0ZW5kX3J1bnRpbWUcUnVudGltZQAAAAAdAQw4cGFsbGV0X3Zlc3RpbmcYcGFsbGV0FEV2ZW50BARUAAEMOFZlc3RpbmdDcmVhdGVkCAEcYWNjb3VudAABMFQ6OkFjY291bnRJZAABOHNjaGVkdWxlX2luZGV4EAEMdTMyAAAEkEEgdmVzdGluZyBzY2hlZHVsZSBoYXMgYmVlbiBjcmVhdGVkLjhWZXN0aW5nVXBkYXRlZAgBHGFjY291bnQAATBUOjpBY2NvdW50SWQAASB1bnZlc3RlZBgBMEJhbGFuY2VPZjxUPgABCFEBVGhlIGFtb3VudCB2ZXN0ZWQgaGFzIGJlZW4gdXBkYXRlZC4gVGhpcyBjb3VsZCBpbmRpY2F0ZSBhIGNoYW5nZSBpbiBmdW5kcyBhdmFpbGFibGUuJQFUaGUgYmFsYW5jZSBnaXZlbiBpcyB0aGUgYW1vdW50IHdoaWNoIGlzIGxlZnQgdW52ZXN0ZWQgKGFuZCB0aHVzIGxvY2tlZCkuQFZlc3RpbmdDb21wbGV0ZWQEARxhY2NvdW50AAEwVDo6QWNjb3VudElkAAIEnEFuIFxbYWNjb3VudFxdIGhhcyBiZWNvbWUgZnVsbHkgdmVzdGVkLgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldCEBDEBwYWxsZXRfc2NoZWR1bGVyGHBhbGxldBRFdmVudAQEVAABKCRTY2hlZHVsZWQIARB3aGVuEAFEQmxvY2tOdW1iZXJGb3I8VD4AARRpbmRleBABDHUzMgAABFBTY2hlZHVsZWQgc29tZSB0YXNrLiBDYW5jZWxlZAgBEHdoZW4QAURCbG9ja051bWJlckZvcjxUPgABFGluZGV4EAEMdTMyAAEETENhbmNlbGVkIHNvbWUgdGFzay4oRGlzcGF0Y2hlZAwBEHRhc2slAQF4VGFza0FkZHJlc3M8QmxvY2tOdW1iZXJGb3I8VD4+AAEIaWQpAQFAT3B0aW9uPFRhc2tOYW1lPgABGHJlc3VsdAEBAThEaXNwYXRjaFJlc3VsdAACBFREaXNwYXRjaGVkIHNvbWUgdGFzay4gUmV0cnlTZXQQARB0YXNrJQEBeFRhc2tBZGRyZXNzPEJsb2NrTnVtYmVyRm9yPFQ+PgABCGlkKQEBQE9wdGlvbjxUYXNrTmFtZT4AARhwZXJpb2QQAURCbG9ja051bWJlckZvcjxUPgABHHJldHJpZXMIAQh1OAADBKBTZXQgYSByZXRyeSBjb25maWd1cmF0aW9uIGZvciBzb21lIHRhc2suOFJldHJ5Q2FuY2VsbGVkCAEQdGFzayUBAXhUYXNrQWRkcmVzczxCbG9ja051bWJlckZvcjxUPj4AAQhpZCkBAUBPcHRpb248VGFza05hbWU+AAQErENhbmNlbCBhIHJldHJ5IGNvbmZpZ3VyYXRpb24gZm9yIHNvbWUgdGFzay48Q2FsbFVuYXZhaWxhYmxlCAEQdGFzayUBAXhUYXNrQWRkcmVzczxCbG9ja051bWJlckZvcjxUPj4AAQhpZCkBAUBPcHRpb248VGFza05hbWU+AAUEKQFUaGUgY2FsbCBmb3IgdGhlIHByb3ZpZGVkIGhhc2ggd2FzIG5vdCBmb3VuZCBzbyB0aGUgdGFzayBoYXMgYmVlbiBhYm9ydGVkLjhQZXJpb2RpY0ZhaWxlZAgBEHRhc2slAQF4VGFza0FkZHJlc3M8QmxvY2tOdW1iZXJGb3I8VD4+AAEIaWQpAQFAT3B0aW9uPFRhc2tOYW1lPgAGBD0BVGhlIGdpdmVuIHRhc2sgd2FzIHVuYWJsZSB0byBiZSByZW5ld2VkIHNpbmNlIHRoZSBhZ2VuZGEgaXMgZnVsbCBhdCB0aGF0IGJsb2NrLixSZXRyeUZhaWxlZAgBEHRhc2slAQF4VGFza0FkZHJlc3M8QmxvY2tOdW1iZXJGb3I8VD4+AAEIaWQpAQFAT3B0aW9uPFRhc2tOYW1lPgAHCF0BVGhlIGdpdmVuIHRhc2sgd2FzIHVuYWJsZSB0byBiZSByZXRyaWVkIHNpbmNlIHRoZSBhZ2VuZGEgaXMgZnVsbCBhdCB0aGF0IGJsb2NrIG9yIHRoZXJlnHdhcyBub3QgZW5vdWdoIHdlaWdodCB0byByZXNjaGVkdWxlIGl0LlRQZXJtYW5lbnRseU92ZXJ3ZWlnaHQIARB0YXNrJQEBeFRhc2tBZGRyZXNzPEJsb2NrTnVtYmVyRm9yPFQ+PgABCGlkKQEBQE9wdGlvbjxUYXNrTmFtZT4ACATwVGhlIGdpdmVuIHRhc2sgY2FuIG5ldmVyIGJlIGV4ZWN1dGVkIHNpbmNlIGl0IGlzIG92ZXJ3ZWlnaHQuQEFnZW5kYUluY29tcGxldGUEARB3aGVuEAFEQmxvY2tOdW1iZXJGb3I8VD4ACQSEQWdlbmRhIGlzIGluY29tcGxldGUgZnJvbSBgd2hlbmAuBDBFdmVudHMgdHlwZS4lAQAABAgQEAApAQQYT3B0aW9uBARUAQQBCBBOb25lAAAAEFNvbWUEAAQAAAEAAC0BDDxwYWxsZXRfcHJlaW1hZ2UYcGFsbGV0FEV2ZW50BARUAAEMFE5vdGVkBAEQaGFzaDQBHFQ6Okhhc2gAAARoQSBwcmVpbWFnZSBoYXMgYmVlbiBub3RlZC4kUmVxdWVzdGVkBAEQaGFzaDQBHFQ6Okhhc2gAAQR4QSBwcmVpbWFnZSBoYXMgYmVlbiByZXF1ZXN0ZWQuHENsZWFyZWQEARBoYXNoNAEcVDo6SGFzaAACBGxBIHByZWltYWdlIGhhcyBiZW4gY2xlYXJlZC4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXQxAQwscGFsbGV0X3N1ZG8YcGFsbGV0FEV2ZW50BARUAAEQFFN1ZGlkBAEsc3Vkb19yZXN1bHQBAQE4RGlzcGF0Y2hSZXN1bHQEtFRoZSByZXN1bHQgb2YgdGhlIGNhbGwgbWFkZSBieSB0aGUgc3VkbyB1c2VyLgAEcEEgc3VkbyBjYWxsIGp1c3QgdG9vayBwbGFjZS4oS2V5Q2hhbmdlZAgBDG9sZDUBAVBPcHRpb248VDo6QWNjb3VudElkPgS0VGhlIG9sZCBzdWRvIGtleSAoaWYgb25lIHdhcyBwcmV2aW91c2x5IHNldCkuAQxuZXcAATBUOjpBY2NvdW50SWQEiFRoZSBuZXcgc3VkbyBrZXkgKGlmIG9uZSB3YXMgc2V0KS4BBHhUaGUgc3VkbyBrZXkgaGFzIGJlZW4gdXBkYXRlZC4oS2V5UmVtb3ZlZAACBIBUaGUga2V5IHdhcyBwZXJtYW5lbnRseSByZW1vdmVkLihTdWRvQXNEb25lBAEsc3Vkb19yZXN1bHQBAQE4RGlzcGF0Y2hSZXN1bHQEtFRoZSByZXN1bHQgb2YgdGhlIGNhbGwgbWFkZSBieSB0aGUgc3VkbyB1c2VyLgMEyEEgW3N1ZG9fYXNdKFBhbGxldDo6c3Vkb19hcykgY2FsbCBqdXN0IHRvb2sgcGxhY2UuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0NQEEGE9wdGlvbgQEVAEAAQgQTm9uZQAAABBTb21lBAAAAAABAAA5AQwwcGFsbGV0X3Byb3h5GHBhbGxldBRFdmVudAQEVAABHDRQcm94eUV4ZWN1dGVkBAEYcmVzdWx0AQEBOERpc3BhdGNoUmVzdWx0AAAEvEEgcHJveHkgd2FzIGV4ZWN1dGVkIGNvcnJlY3RseSwgd2l0aCB0aGUgZ2l2ZW4uLFB1cmVDcmVhdGVkEAEQcHVyZQABMFQ6OkFjY291bnRJZAABDHdobwABMFQ6OkFjY291bnRJZAABKHByb3h5X3R5cGU9AQEwVDo6UHJveHlUeXBlAAFQZGlzYW1iaWd1YXRpb25faW5kZXhBAQEMdTE2AAEI3EEgcHVyZSBhY2NvdW50IGhhcyBiZWVuIGNyZWF0ZWQgYnkgbmV3IHByb3h5IHdpdGggZ2l2ZW6QZGlzYW1iaWd1YXRpb24gaW5kZXggYW5kIHByb3h5IHR5cGUuKFB1cmVLaWxsZWQQARBwdXJlAAEwVDo6QWNjb3VudElkAAEcc3Bhd25lcgABMFQ6OkFjY291bnRJZAABKHByb3h5X3R5cGU9AQEwVDo6UHJveHlUeXBlAAFQZGlzYW1iaWd1YXRpb25faW5kZXhBAQEMdTE2AAIEnEEgcHVyZSBwcm94eSB3YXMga2lsbGVkIGJ5IGl0cyBzcGF3bmVyLiRBbm5vdW5jZWQMARByZWFsAAEwVDo6QWNjb3VudElkAAEUcHJveHkAATBUOjpBY2NvdW50SWQAASRjYWxsX2hhc2g0ATRDYWxsSGFzaE9mPFQ+AAME4EFuIGFubm91bmNlbWVudCB3YXMgcGxhY2VkIHRvIG1ha2UgYSBjYWxsIGluIHRoZSBmdXR1cmUuKFByb3h5QWRkZWQQASRkZWxlZ2F0b3IAATBUOjpBY2NvdW50SWQAASRkZWxlZ2F0ZWUAATBUOjpBY2NvdW50SWQAAShwcm94eV90eXBlPQEBMFQ6OlByb3h5VHlwZQABFGRlbGF5EAFEQmxvY2tOdW1iZXJGb3I8VD4ABARIQSBwcm94eSB3YXMgYWRkZWQuMFByb3h5UmVtb3ZlZBABJGRlbGVnYXRvcgABMFQ6OkFjY291bnRJZAABJGRlbGVnYXRlZQABMFQ6OkFjY291bnRJZAABKHByb3h5X3R5cGU9AQEwVDo6UHJveHlUeXBlAAEUZGVsYXkQAURCbG9ja051bWJlckZvcjxUPgAFBFBBIHByb3h5IHdhcyByZW1vdmVkLjBEZXBvc2l0UG9rZWQQAQx3aG8AATBUOjpBY2NvdW50SWQAARBraW5kRQEBLERlcG9zaXRLaW5kAAEsb2xkX2RlcG9zaXQYATBCYWxhbmNlT2Y8VD4AASxuZXdfZGVwb3NpdBgBMEJhbGFuY2VPZjxUPgAGBAkBQSBkZXBvc2l0IHN0b3JlZCBmb3IgcHJveGllcyBvciBhbm5vdW5jZW1lbnRzIHdhcyBwb2tlZCAvIHVwZGF0ZWQuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0PQEIPHdlc3RlbmRfcnVudGltZSRQcm94eVR5cGUAASgMQW55AAAALE5vblRyYW5zZmVyAAEAKEdvdmVybmFuY2UAAgAcU3Rha2luZwADADBTdWRvQmFsYW5jZXMABABESWRlbnRpdHlKdWRnZW1lbnQABQAsQ2FuY2VsUHJveHkABgAcQXVjdGlvbgAHADxOb21pbmF0aW9uUG9vbHMACABAUGFyYVJlZ2lzdHJhdGlvbgAJAABBAQAABQQARQEIMHBhbGxldF9wcm94eSxEZXBvc2l0S2luZAABCBxQcm94aWVzAAAANEFubm91bmNlbWVudHMAAQAASQEMPHBhbGxldF9tdWx0aXNpZxhwYWxsZXQURXZlbnQEBFQAARQsTmV3TXVsdGlzaWcMASRhcHByb3ZpbmcAATBUOjpBY2NvdW50SWQAASBtdWx0aXNpZwABMFQ6OkFjY291bnRJZAABJGNhbGxfaGFzaAQBIENhbGxIYXNoAAAEjEEgbmV3IG11bHRpc2lnIG9wZXJhdGlvbiBoYXMgYmVndW4uQE11bHRpc2lnQXBwcm92YWwQASRhcHByb3ZpbmcAATBUOjpBY2NvdW50SWQAASR0aW1lcG9pbnRNAQFwVGltZXBvaW50PEJsb2NrTnVtYmVyRm9yPFQ+PgABIG11bHRpc2lnAAEwVDo6QWNjb3VudElkAAEkY2FsbF9oYXNoBAEgQ2FsbEhhc2gAAQTIQSBtdWx0aXNpZyBvcGVyYXRpb24gaGFzIGJlZW4gYXBwcm92ZWQgYnkgc29tZW9uZS5ATXVsdGlzaWdFeGVjdXRlZBQBJGFwcHJvdmluZwABMFQ6OkFjY291bnRJZAABJHRpbWVwb2ludE0BAXBUaW1lcG9pbnQ8QmxvY2tOdW1iZXJGb3I8VD4+AAEgbXVsdGlzaWcAATBUOjpBY2NvdW50SWQAASRjYWxsX2hhc2gEASBDYWxsSGFzaAABGHJlc3VsdAEBAThEaXNwYXRjaFJlc3VsdAACBJxBIG11bHRpc2lnIG9wZXJhdGlvbiBoYXMgYmVlbiBleGVjdXRlZC5ETXVsdGlzaWdDYW5jZWxsZWQQAShjYW5jZWxsaW5nAAEwVDo6QWNjb3VudElkAAEkdGltZXBvaW50TQEBcFRpbWVwb2ludDxCbG9ja051bWJlckZvcjxUPj4AASBtdWx0aXNpZwABMFQ6OkFjY291bnRJZAABJGNhbGxfaGFzaAQBIENhbGxIYXNoAAMEoEEgbXVsdGlzaWcgb3BlcmF0aW9uIGhhcyBiZWVuIGNhbmNlbGxlZC4wRGVwb3NpdFBva2VkEAEMd2hvAAEwVDo6QWNjb3VudElkAAEkY2FsbF9oYXNoBAEgQ2FsbEhhc2gAASxvbGRfZGVwb3NpdBgBMEJhbGFuY2VPZjxUPgABLG5ld19kZXBvc2l0GAEwQmFsYW5jZU9mPFQ+AAQE8FRoZSBkZXBvc2l0IGZvciBhIG11bHRpc2lnIG9wZXJhdGlvbiBoYXMgYmVlbiB1cGRhdGVkL3Bva2VkLgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldE0BCDxwYWxsZXRfbXVsdGlzaWckVGltZXBvaW50BCxCbG9ja051bWJlcgEQAAgBGGhlaWdodBABLEJsb2NrTnVtYmVyAAEUaW5kZXgQAQx1MzIAAFEBDJBwYWxsZXRfZWxlY3Rpb25fcHJvdmlkZXJfbXVsdGlfcGhhc2UYcGFsbGV0FEV2ZW50BARUAAEYOFNvbHV0aW9uU3RvcmVkDAEcY29tcHV0ZVUBATxFbGVjdGlvbkNvbXB1dGUAARhvcmlnaW41AQFQT3B0aW9uPFQ6OkFjY291bnRJZD4AATBwcmV2X2VqZWN0ZWQgARBib29sAAActEEgc29sdXRpb24gd2FzIHN0b3JlZCB3aXRoIHRoZSBnaXZlbiBjb21wdXRlLgBRAVRoZSBgb3JpZ2luYCBpbmRpY2F0ZXMgdGhlIG9yaWdpbiBvZiB0aGUgc29sdXRpb24uIElmIGBvcmlnaW5gIGlzIGBTb21lKEFjY291bnRJZClgLFkBdGhlIHN0b3JlZCBzb2x1dGlvbiB3YXMgc3VibWl0dGVkIGluIHRoZSBzaWduZWQgcGhhc2UgYnkgYSBtaW5lciB3aXRoIHRoZSBgQWNjb3VudElkYC4lAU90aGVyd2lzZSwgdGhlIHNvbHV0aW9uIHdhcyBzdG9yZWQgZWl0aGVyIGR1cmluZyB0aGUgdW5zaWduZWQgcGhhc2Ugb3IgYnlNAWBUOjpGb3JjZU9yaWdpbmAuIFRoZSBgYm9vbGAgaXMgYHRydWVgIHdoZW4gYSBwcmV2aW91cyBzb2x1dGlvbiB3YXMgZWplY3RlZCB0byBtYWtlSHJvb20gZm9yIHRoaXMgb25lLkRFbGVjdGlvbkZpbmFsaXplZAgBHGNvbXB1dGVVAQE8RWxlY3Rpb25Db21wdXRlAAEUc2NvcmVZAQE0RWxlY3Rpb25TY29yZQABBBkBVGhlIGVsZWN0aW9uIGhhcyBiZWVuIGZpbmFsaXplZCwgd2l0aCB0aGUgZ2l2ZW4gY29tcHV0YXRpb24gYW5kIHNjb3JlLjhFbGVjdGlvbkZhaWxlZAACDExBbiBlbGVjdGlvbiBmYWlsZWQuAAEBTm90IG11Y2ggY2FuIGJlIHNhaWQgYWJvdXQgd2hpY2ggY29tcHV0ZXMgZmFpbGVkIGluIHRoZSBwcm9jZXNzLiBSZXdhcmRlZAgBHGFjY291bnQAAZg8VCBhcyBmcmFtZV9zeXN0ZW06OkNvbmZpZz46OkFjY291bnRJZAABFHZhbHVlGAEwQmFsYW5jZU9mPFQ+AAMEJQFBbiBhY2NvdW50IGhhcyBiZWVuIHJld2FyZGVkIGZvciB0aGVpciBzaWduZWQgc3VibWlzc2lvbiBiZWluZyBmaW5hbGl6ZWQuHFNsYXNoZWQIARxhY2NvdW50AAGYPFQgYXMgZnJhbWVfc3lzdGVtOjpDb25maWc+OjpBY2NvdW50SWQAARR2YWx1ZRgBMEJhbGFuY2VPZjxUPgAEBCEBQW4gYWNjb3VudCBoYXMgYmVlbiBzbGFzaGVkIGZvciBzdWJtaXR0aW5nIGFuIGludmFsaWQgc2lnbmVkIHN1Ym1pc3Npb24uRFBoYXNlVHJhbnNpdGlvbmVkDAEQZnJvbV0BAWBQaGFzZTxCbG9ja051bWJlckZvcjxUPj4AAQh0b10BAWBQaGFzZTxCbG9ja051bWJlckZvcjxUPj4AARRyb3VuZBABDHUzMgAFBLhUaGVyZSB3YXMgYSBwaGFzZSB0cmFuc2l0aW9uIGluIGEgZ2l2ZW4gcm91bmQuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0VQEIkHBhbGxldF9lbGVjdGlvbl9wcm92aWRlcl9tdWx0aV9waGFzZTxFbGVjdGlvbkNvbXB1dGUAARQcT25DaGFpbgAAABhTaWduZWQAAQAgVW5zaWduZWQAAgAgRmFsbGJhY2sAAwAkRW1lcmdlbmN5AAQAAFkBCERzcF9ucG9zX2VsZWN0aW9uczRFbGVjdGlvblNjb3JlAAAMATRtaW5pbWFsX3N0YWtlGAE8RXh0ZW5kZWRCYWxhbmNlAAEkc3VtX3N0YWtlGAE8RXh0ZW5kZWRCYWxhbmNlAAFEc3VtX3N0YWtlX3NxdWFyZWQYATxFeHRlbmRlZEJhbGFuY2UAAF0BCJBwYWxsZXRfZWxlY3Rpb25fcHJvdmlkZXJfbXVsdGlfcGhhc2UUUGhhc2UECEJuARABEAxPZmYAAAAYU2lnbmVkAAEAIFVuc2lnbmVkBABhAQEoKGJvb2wsIEJuKQACACRFbWVyZ2VuY3kAAwAAYQEAAAQIIBAAZQEMQHBhbGxldF9iYWdzX2xpc3QYcGFsbGV0FEV2ZW50CARUAARJAAEIIFJlYmFnZ2VkDAEMd2hvAAEwVDo6QWNjb3VudElkAAEQZnJvbTABIFQ6OlNjb3JlAAEIdG8wASBUOjpTY29yZQAABKRNb3ZlZCBhbiBhY2NvdW50IGZyb20gb25lIGJhZyB0byBhbm90aGVyLjBTY29yZVVwZGF0ZWQIAQx3aG8AATBUOjpBY2NvdW50SWQAASRuZXdfc2NvcmUwASBUOjpTY29yZQABBNhVcGRhdGVkIHRoZSBzY29yZSBvZiBzb21lIGFjY291bnQgdG8gdGhlIGdpdmVuIGFtb3VudC4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXRpAQxccGFsbGV0X25vbWluYXRpb25fcG9vbHMYcGFsbGV0FEV2ZW50BARUAAFcHENyZWF0ZWQIASRkZXBvc2l0b3IAATBUOjpBY2NvdW50SWQAARxwb29sX2lkEAEYUG9vbElkAAAEYEEgcG9vbCBoYXMgYmVlbiBjcmVhdGVkLhhCb25kZWQQARhtZW1iZXIAATBUOjpBY2NvdW50SWQAARxwb29sX2lkEAEYUG9vbElkAAEYYm9uZGVkGAEwQmFsYW5jZU9mPFQ+AAEYam9pbmVkIAEQYm9vbAABBJRBIG1lbWJlciBoYXMgYmVjYW1lIGJvbmRlZCBpbiBhIHBvb2wuHFBhaWRPdXQMARhtZW1iZXIAATBUOjpBY2NvdW50SWQAARxwb29sX2lkEAEYUG9vbElkAAEYcGF5b3V0GAEwQmFsYW5jZU9mPFQ+AAIEjEEgcGF5b3V0IGhhcyBiZWVuIG1hZGUgdG8gYSBtZW1iZXIuIFVuYm9uZGVkFAEYbWVtYmVyAAEwVDo6QWNjb3VudElkAAEccG9vbF9pZBABGFBvb2xJZAABHGJhbGFuY2UYATBCYWxhbmNlT2Y8VD4AARhwb2ludHMYATBCYWxhbmNlT2Y8VD4AAQxlcmEQASBFcmFJbmRleAADLJhBIG1lbWJlciBoYXMgdW5ib25kZWQgZnJvbSB0aGVpciBwb29sLgA5AS0gYGJhbGFuY2VgIGlzIHRoZSBjb3JyZXNwb25kaW5nIGJhbGFuY2Ugb2YgdGhlIG51bWJlciBvZiBwb2ludHMgdGhhdCBoYXMgYmVlblUBICByZXF1ZXN0ZWQgdG8gYmUgdW5ib25kZWQgKHRoZSBhcmd1bWVudCBvZiB0aGUgYHVuYm9uZGAgdHJhbnNhY3Rpb24pIGZyb20gdGhlIGJvbmRlZBwgIHBvb2wuRQEtIGBwb2ludHNgIGlzIHRoZSBudW1iZXIgb2YgcG9pbnRzIHRoYXQgYXJlIGlzc3VlZCBhcyBhIHJlc3VsdCBvZiBgYmFsYW5jZWAgYmVpbmfAZGlzc29sdmVkIGludG8gdGhlIGNvcnJlc3BvbmRpbmcgdW5ib25kaW5nIHBvb2wu5C0gYGVyYWAgaXMgdGhlIGVyYSBpbiB3aGljaCB0aGUgYmFsYW5jZSB3aWxsIGJlIHVuYm9uZGVkLlUBSW4gdGhlIGFic2VuY2Ugb2Ygc2xhc2hpbmcsIHRoZXNlIHZhbHVlcyB3aWxsIG1hdGNoLiBJbiB0aGUgcHJlc2VuY2Ugb2Ygc2xhc2hpbmcsIHRoZU0BbnVtYmVyIG9mIHBvaW50cyB0aGF0IGFyZSBpc3N1ZWQgaW4gdGhlIHVuYm9uZGluZyBwb29sIHdpbGwgYmUgbGVzcyB0aGFuIHRoZSBhbW91bnRkcmVxdWVzdGVkIHRvIGJlIHVuYm9uZGVkLiRXaXRoZHJhd24QARhtZW1iZXIAATBUOjpBY2NvdW50SWQAARxwb29sX2lkEAEYUG9vbElkAAEcYmFsYW5jZRgBMEJhbGFuY2VPZjxUPgABGHBvaW50cxgBMEJhbGFuY2VPZjxUPgAEGJxBIG1lbWJlciBoYXMgd2l0aGRyYXduIGZyb20gdGhlaXIgcG9vbC4AIQFUaGUgZ2l2ZW4gbnVtYmVyIG9mIGBwb2ludHNgIGhhdmUgYmVlbiBkaXNzb2x2ZWQgaW4gcmV0dXJuIG9mIGBiYWxhbmNlYC4AWQFTaW1pbGFyIHRvIGBVbmJvbmRlZGAgZXZlbnQsIGluIHRoZSBhYnNlbmNlIG9mIHNsYXNoaW5nLCB0aGUgcmF0aW8gb2YgcG9pbnQgdG8gYmFsYW5jZSh3aWxsIGJlIDEuJERlc3Ryb3llZAQBHHBvb2xfaWQQARhQb29sSWQABQRoQSBwb29sIGhhcyBiZWVuIGRlc3Ryb3llZC4wU3RhdGVDaGFuZ2VkCAEccG9vbF9pZBABGFBvb2xJZAABJG5ld19zdGF0ZW0BASRQb29sU3RhdGUABgR8VGhlIHN0YXRlIG9mIGEgcG9vbCBoYXMgY2hhbmdlZDRNZW1iZXJSZW1vdmVkDAEccG9vbF9pZBABGFBvb2xJZAABGG1lbWJlcgABMFQ6OkFjY291bnRJZAABQHJlbGVhc2VkX2JhbGFuY2UYATBCYWxhbmNlT2Y8VD4ABxSYQSBtZW1iZXIgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIGEgcG9vbC4AUQFUaGUgcmVtb3ZhbCBjYW4gYmUgdm9sdW50YXJ5ICh3aXRoZHJhd24gYWxsIHVuYm9uZGVkIGZ1bmRzKSBvciBpbnZvbHVudGFyeSAoa2lja2VkKS5JAUFueSBmdW5kcyB0aGF0IGFyZSBzdGlsbCBkZWxlZ2F0ZWQgKGkuZS4gZGFuZ2xpbmcgZGVsZWdhdGlvbikgYXJlIHJlbGVhc2VkIGFuZCBhcmWIcmVwcmVzZW50ZWQgYnkgYHJlbGVhc2VkX2JhbGFuY2VgLjBSb2xlc1VwZGF0ZWQMARByb290NQEBUE9wdGlvbjxUOjpBY2NvdW50SWQ+AAEcYm91bmNlcjUBAVBPcHRpb248VDo6QWNjb3VudElkPgABJG5vbWluYXRvcjUBAVBPcHRpb248VDo6QWNjb3VudElkPgAICFUBVGhlIHJvbGVzIG9mIGEgcG9vbCBoYXZlIGJlZW4gdXBkYXRlZCB0byB0aGUgZ2l2ZW4gbmV3IHJvbGVzLiBOb3RlIHRoYXQgdGhlIGRlcG9zaXRvckRjYW4gbmV2ZXIgY2hhbmdlLixQb29sU2xhc2hlZAgBHHBvb2xfaWQQARhQb29sSWQAARxiYWxhbmNlGAEwQmFsYW5jZU9mPFQ+AAkEDQFUaGUgYWN0aXZlIGJhbGFuY2Ugb2YgcG9vbCBgcG9vbF9pZGAgaGFzIGJlZW4gc2xhc2hlZCB0byBgYmFsYW5jZWAuUFVuYm9uZGluZ1Bvb2xTbGFzaGVkDAEccG9vbF9pZBABGFBvb2xJZAABDGVyYRABIEVyYUluZGV4AAEcYmFsYW5jZRgBMEJhbGFuY2VPZjxUPgAKBCUBVGhlIHVuYm9uZCBwb29sIGF0IGBlcmFgIG9mIHBvb2wgYHBvb2xfaWRgIGhhcyBiZWVuIHNsYXNoZWQgdG8gYGJhbGFuY2VgLlRQb29sQ29tbWlzc2lvblVwZGF0ZWQIARxwb29sX2lkEAEYUG9vbElkAAEcY3VycmVudHEBAXxPcHRpb248KFBlcmJpbGwsIFQ6OkFjY291bnRJZCk+AAsEtEEgcG9vbCdzIGNvbW1pc3Npb24gc2V0dGluZyBoYXMgYmVlbiBjaGFuZ2VkLmBQb29sTWF4Q29tbWlzc2lvblVwZGF0ZWQIARxwb29sX2lkEAEYUG9vbElkAAE4bWF4X2NvbW1pc3Npb26YARxQZXJiaWxsAAwE1EEgcG9vbCdzIG1heGltdW0gY29tbWlzc2lvbiBzZXR0aW5nIGhhcyBiZWVuIGNoYW5nZWQufFBvb2xDb21taXNzaW9uQ2hhbmdlUmF0ZVVwZGF0ZWQIARxwb29sX2lkEAEYUG9vbElkAAEsY2hhbmdlX3JhdGV5AQGcQ29tbWlzc2lvbkNoYW5nZVJhdGU8QmxvY2tOdW1iZXJGb3I8VD4+AA0EzEEgcG9vbCdzIGNvbW1pc3Npb24gYGNoYW5nZV9yYXRlYCBoYXMgYmVlbiBjaGFuZ2VkLpBQb29sQ29tbWlzc2lvbkNsYWltUGVybWlzc2lvblVwZGF0ZWQIARxwb29sX2lkEAEYUG9vbElkAAEocGVybWlzc2lvbn0BAbxPcHRpb248Q29tbWlzc2lvbkNsYWltUGVybWlzc2lvbjxUOjpBY2NvdW50SWQ+PgAOBMhQb29sIGNvbW1pc3Npb24gY2xhaW0gcGVybWlzc2lvbiBoYXMgYmVlbiB1cGRhdGVkLlRQb29sQ29tbWlzc2lvbkNsYWltZWQIARxwb29sX2lkEAEYUG9vbElkAAEoY29tbWlzc2lvbhgBMEJhbGFuY2VPZjxUPgAPBIRQb29sIGNvbW1pc3Npb24gaGFzIGJlZW4gY2xhaW1lZC5kTWluQmFsYW5jZURlZmljaXRBZGp1c3RlZAgBHHBvb2xfaWQQARhQb29sSWQAARhhbW91bnQYATBCYWxhbmNlT2Y8VD4AEATIVG9wcGVkIHVwIGRlZmljaXQgaW4gZnJvemVuIEVEIG9mIHRoZSByZXdhcmQgcG9vbC5gTWluQmFsYW5jZUV4Y2Vzc0FkanVzdGVkCAEccG9vbF9pZBABGFBvb2xJZAABGGFtb3VudBgBMEJhbGFuY2VPZjxUPgARBLxDbGFpbWVkIGV4Y2VzcyBmcm96ZW4gRUQgb2YgYWYgdGhlIHJld2FyZCBwb29sLnBNZW1iZXJDbGFpbVBlcm1pc3Npb25VcGRhdGVkCAEYbWVtYmVyAAEwVDo6QWNjb3VudElkAAEocGVybWlzc2lvboUBATxDbGFpbVBlcm1pc3Npb24AEgTIQSBwb29sIG1lbWJlcidzIGNsYWltIHBlcm1pc3Npb24gaGFzIGJlZW4gdXBkYXRlZC48TWV0YWRhdGFVcGRhdGVkCAEccG9vbF9pZBABGFBvb2xJZAABGGNhbGxlcgABMFQ6OkFjY291bnRJZAATBHhBIHBvb2wncyBtZXRhZGF0YSB3YXMgdXBkYXRlZC5IUG9vbE5vbWluYXRpb25NYWRlCAEccG9vbF9pZBABGFBvb2xJZAABGGNhbGxlcgABMFQ6OkFjY291bnRJZAAUCFkBQSBwb29sJ3Mgbm9taW5hdGluZyBhY2NvdW50IChvciB0aGUgcG9vbCdzIHJvb3QgYWNjb3VudCkgaGFzIG5vbWluYXRlZCBhIHZhbGlkYXRvciBzZXRYb24gYmVoYWxmIG9mIHRoZSBwb29sLlBQb29sTm9taW5hdG9yQ2hpbGxlZAgBHHBvb2xfaWQQARhQb29sSWQAARhjYWxsZXIAATBUOjpBY2NvdW50SWQAFQS4VGhlIHBvb2wgaXMgY2hpbGxlZCBpLmUuIG5vIGxvbmdlciBub21pbmF0aW5nLkxHbG9iYWxQYXJhbXNVcGRhdGVkGAE0bWluX2pvaW5fYm9uZBgBMEJhbGFuY2VPZjxUPgABPG1pbl9jcmVhdGVfYm9uZBgBMEJhbGFuY2VPZjxUPgABJG1heF9wb29sc5wBLE9wdGlvbjx1MzI+AAEsbWF4X21lbWJlcnOcASxPcHRpb248dTMyPgABUG1heF9tZW1iZXJzX3Blcl9wb29snAEsT3B0aW9uPHUzMj4AAVRnbG9iYWxfbWF4X2NvbW1pc3Npb26JAQE8T3B0aW9uPFBlcmJpbGw+ABYEAQFHbG9iYWwgcGFyYW1ldGVycyByZWd1bGF0aW5nIG5vbWluYXRpb24gcG9vbHMgaGF2ZSBiZWVuIHVwZGF0ZWQuBFhFdmVudHMgb2YgdGhpcyBwYWxsZXQubQEIXHBhbGxldF9ub21pbmF0aW9uX3Bvb2xzJFBvb2xTdGF0ZQABDBBPcGVuAAAAHEJsb2NrZWQAAQAoRGVzdHJveWluZwACAABxAQQYT3B0aW9uBARUAXUBAQgQTm9uZQAAABBTb21lBAB1AQAAAQAAdQEAAAQImAAAeQEIXHBhbGxldF9ub21pbmF0aW9uX3Bvb2xzUENvbW1pc3Npb25DaGFuZ2VSYXRlBCxCbG9ja051bWJlcgEQAAgBMG1heF9pbmNyZWFzZZgBHFBlcmJpbGwAASRtaW5fZGVsYXkQASxCbG9ja051bWJlcgAAfQEEGE9wdGlvbgQEVAGBAQEIEE5vbmUAAAAQU29tZQQAgQEAAAEAAIEBCFxwYWxsZXRfbm9taW5hdGlvbl9wb29sc2RDb21taXNzaW9uQ2xhaW1QZXJtaXNzaW9uBCRBY2NvdW50SWQBAAEIOFBlcm1pc3Npb25sZXNzAAAAHEFjY291bnQEAAABJEFjY291bnRJZAABAACFAQhccGFsbGV0X25vbWluYXRpb25fcG9vbHM8Q2xhaW1QZXJtaXNzaW9uAAEQMFBlcm1pc3Npb25lZAAAAFhQZXJtaXNzaW9ubGVzc0NvbXBvdW5kAAEAWFBlcm1pc3Npb25sZXNzV2l0aGRyYXcAAgBEUGVybWlzc2lvbmxlc3NBbGwAAwAAiQEEGE9wdGlvbgQEVAGYAQgQTm9uZQAAABBTb21lBACYAAABAACNAQxMcGFsbGV0X2Zhc3RfdW5zdGFrZRhwYWxsZXQURXZlbnQEBFQAARQgVW5zdGFrZWQIARRzdGFzaAABMFQ6OkFjY291bnRJZAABGHJlc3VsdAEBAThEaXNwYXRjaFJlc3VsdAAABFhBIHN0YWtlciB3YXMgdW5zdGFrZWQuHFNsYXNoZWQIARRzdGFzaAABMFQ6OkFjY291bnRJZAABGGFtb3VudBgBMEJhbGFuY2VPZjxUPgABBBkBQSBzdGFrZXIgd2FzIHNsYXNoZWQgZm9yIHJlcXVlc3RpbmcgZmFzdC11bnN0YWtlIHdoaWxzdCBiZWluZyBleHBvc2VkLjBCYXRjaENoZWNrZWQEARBlcmFzkQEBNFZlYzxFcmFJbmRleD4AAgRFAUEgYmF0Y2ggd2FzIHBhcnRpYWxseSBjaGVja2VkIGZvciB0aGUgZ2l2ZW4gZXJhcywgYnV0IHRoZSBwcm9jZXNzIGRpZCBub3QgZmluaXNoLjRCYXRjaEZpbmlzaGVkBAEQc2l6ZRABDHUzMgADEJxBIGJhdGNoIG9mIGEgZ2l2ZW4gc2l6ZSB3YXMgdGVybWluYXRlZC4AVQFUaGlzIGlzIGFsd2F5cyBmb2xsb3dzIGJ5IGEgbnVtYmVyIG9mIGBVbnN0YWtlZGAgb3IgYFNsYXNoZWRgIGV2ZW50cywgbWFya2luZyB0aGUgZW5k6G9mIHRoZSBiYXRjaC4gQSBuZXcgYmF0Y2ggd2lsbCBiZSBjcmVhdGVkIHVwb24gbmV4dCBibG9jay40SW50ZXJuYWxFcnJvcgAEBOhBbiBpbnRlcm5hbCBlcnJvciBoYXBwZW5lZC4gT3BlcmF0aW9ucyB3aWxsIGJlIHBhdXNlZCBub3cuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0kQEAAAIQAJUBDGBwYWxsZXRfY29udmljdGlvbl92b3RpbmcYcGFsbGV0FEV2ZW50CARUAARJAAEUJERlbGVnYXRlZAgAAAEwVDo6QWNjb3VudElkAAAAATBUOjpBY2NvdW50SWQAAAQdAUFuIGFjY291bnQgaGFzIGRlbGVnYXRlZCB0aGVpciB2b3RlIHRvIGFub3RoZXIgYWNjb3VudC4gXFt3aG8sIHRhcmdldFxdLFVuZGVsZWdhdGVkBAAAATBUOjpBY2NvdW50SWQAAQT0QW4gXFthY2NvdW50XF0gaGFzIGNhbmNlbGxlZCBhIHByZXZpb3VzIGRlbGVnYXRpb24gb3BlcmF0aW9uLhRWb3RlZAgBDHdobwABMFQ6OkFjY291bnRJZAABEHZvdGWZAQFwQWNjb3VudFZvdGU8QmFsYW5jZU9mPFQsIEk+PgACBFBBbiBhY2NvdW50IGhhcyB2b3RlZCxWb3RlUmVtb3ZlZAgBDHdobwABMFQ6OkFjY291bnRJZAABEHZvdGWZAQFwQWNjb3VudFZvdGU8QmFsYW5jZU9mPFQsIEk+PgADBFxBIHZvdGUgaGFzIGJlZW4gcmVtb3ZlZDBWb3RlVW5sb2NrZWQIAQx3aG8AATBUOjpBY2NvdW50SWQAARRjbGFzc0EBATRDbGFzc09mPFQsIEk+AAQERQFUaGUgbG9ja3VwIHBlcmlvZCBvZiBhIGNvbnZpY3Rpb24gdm90ZSBleHBpcmVkLCBhbmQgdGhlIGZ1bmRzIGhhdmUgYmVlbiB1bmxvY2tlZC4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXSZAQxgcGFsbGV0X2NvbnZpY3Rpb25fdm90aW5nEHZvdGUsQWNjb3VudFZvdGUEHEJhbGFuY2UBGAEMIFN0YW5kYXJkCAEQdm90ZZ0BARBWb3RlAAEcYmFsYW5jZRgBHEJhbGFuY2UAAAAUU3BsaXQIAQxheWUYARxCYWxhbmNlAAEMbmF5GAEcQmFsYW5jZQABADBTcGxpdEFic3RhaW4MAQxheWUYARxCYWxhbmNlAAEMbmF5GAEcQmFsYW5jZQABHGFic3RhaW4YARxCYWxhbmNlAAIAAJ0BDGBwYWxsZXRfY29udmljdGlvbl92b3RpbmcQdm90ZRBWb3RlAAAEAAgAAAChAQxAcGFsbGV0X3JlZmVyZW5kYRhwYWxsZXQURXZlbnQIBFQABEkAAUAkU3VibWl0dGVkDAEUaW5kZXgQATxSZWZlcmVuZHVtSW5kZXgEYEluZGV4IG9mIHRoZSByZWZlcmVuZHVtLgEUdHJhY2tBAQE8VHJhY2tJZE9mPFQsIEk+BCUBVGhlIHRyYWNrIChhbmQgYnkgZXh0ZW5zaW9uIHByb3Bvc2FsIGRpc3BhdGNoIG9yaWdpbikgb2YgdGhpcyByZWZlcmVuZHVtLgEgcHJvcG9zYWylAQFMQm91bmRlZENhbGxPZjxULCBJPgSAVGhlIHByb3Bvc2FsIGZvciB0aGUgcmVmZXJlbmR1bS4ABIBBIHJlZmVyZW5kdW0gaGFzIGJlZW4gc3VibWl0dGVkLlREZWNpc2lvbkRlcG9zaXRQbGFjZWQMARRpbmRleBABPFJlZmVyZW5kdW1JbmRleARgSW5kZXggb2YgdGhlIHJlZmVyZW5kdW0uAQx3aG8AATBUOjpBY2NvdW50SWQEjFRoZSBhY2NvdW50IHdobyBwbGFjZWQgdGhlIGRlcG9zaXQuARhhbW91bnQYATxCYWxhbmNlT2Y8VCwgST4EhFRoZSBhbW91bnQgcGxhY2VkIGJ5IHRoZSBhY2NvdW50LgEElFRoZSBkZWNpc2lvbiBkZXBvc2l0IGhhcyBiZWVuIHBsYWNlZC5cRGVjaXNpb25EZXBvc2l0UmVmdW5kZWQMARRpbmRleBABPFJlZmVyZW5kdW1JbmRleARgSW5kZXggb2YgdGhlIHJlZmVyZW5kdW0uAQx3aG8AATBUOjpBY2NvdW50SWQEjFRoZSBhY2NvdW50IHdobyBwbGFjZWQgdGhlIGRlcG9zaXQuARhhbW91bnQYATxCYWxhbmNlT2Y8VCwgST4EhFRoZSBhbW91bnQgcGxhY2VkIGJ5IHRoZSBhY2NvdW50LgIEnFRoZSBkZWNpc2lvbiBkZXBvc2l0IGhhcyBiZWVuIHJlZnVuZGVkLjhEZXBvc2l0U2xhc2hlZAgBDHdobwABMFQ6OkFjY291bnRJZASMVGhlIGFjY291bnQgd2hvIHBsYWNlZCB0aGUgZGVwb3NpdC4BGGFtb3VudBgBPEJhbGFuY2VPZjxULCBJPgSEVGhlIGFtb3VudCBwbGFjZWQgYnkgdGhlIGFjY291bnQuAwRsQSBkZXBvc2l0IGhhcyBiZWVuIHNsYXNoZWQuPERlY2lzaW9uU3RhcnRlZBABFGluZGV4EAE8UmVmZXJlbmR1bUluZGV4BGBJbmRleCBvZiB0aGUgcmVmZXJlbmR1bS4BFHRyYWNrQQEBPFRyYWNrSWRPZjxULCBJPgQlAVRoZSB0cmFjayAoYW5kIGJ5IGV4dGVuc2lvbiBwcm9wb3NhbCBkaXNwYXRjaCBvcmlnaW4pIG9mIHRoaXMgcmVmZXJlbmR1bS4BIHByb3Bvc2FspQEBTEJvdW5kZWRDYWxsT2Y8VCwgST4EgFRoZSBwcm9wb3NhbCBmb3IgdGhlIHJlZmVyZW5kdW0uARR0YWxsea0IASBUOjpUYWxseQS4VGhlIGN1cnJlbnQgdGFsbHkgb2Ygdm90ZXMgaW4gdGhpcyByZWZlcmVuZHVtLgQEvEEgcmVmZXJlbmR1bSBoYXMgbW92ZWQgaW50byB0aGUgZGVjaWRpbmcgcGhhc2UuOENvbmZpcm1TdGFydGVkBAEUaW5kZXgQATxSZWZlcmVuZHVtSW5kZXgEYEluZGV4IG9mIHRoZSByZWZlcmVuZHVtLgUAOENvbmZpcm1BYm9ydGVkBAEUaW5kZXgQATxSZWZlcmVuZHVtSW5kZXgEYEluZGV4IG9mIHRoZSByZWZlcmVuZHVtLgYAJENvbmZpcm1lZAgBFGluZGV4EAE8UmVmZXJlbmR1bUluZGV4BGBJbmRleCBvZiB0aGUgcmVmZXJlbmR1bS4BFHRhbGx5rQgBIFQ6OlRhbGx5BLBUaGUgZmluYWwgdGFsbHkgb2Ygdm90ZXMgaW4gdGhpcyByZWZlcmVuZHVtLgcEIQFBIHJlZmVyZW5kdW0gaGFzIGVuZGVkIGl0cyBjb25maXJtYXRpb24gcGhhc2UgYW5kIGlzIHJlYWR5IGZvciBhcHByb3ZhbC4gQXBwcm92ZWQEARRpbmRleBABPFJlZmVyZW5kdW1JbmRleARgSW5kZXggb2YgdGhlIHJlZmVyZW5kdW0uCAQNAUEgcmVmZXJlbmR1bSBoYXMgYmVlbiBhcHByb3ZlZCBhbmQgaXRzIHByb3Bvc2FsIGhhcyBiZWVuIHNjaGVkdWxlZC4gUmVqZWN0ZWQIARRpbmRleBABPFJlZmVyZW5kdW1JbmRleARgSW5kZXggb2YgdGhlIHJlZmVyZW5kdW0uARR0YWxsea0IASBUOjpUYWxseQSwVGhlIGZpbmFsIHRhbGx5IG9mIHZvdGVzIGluIHRoaXMgcmVmZXJlbmR1bS4JBKxBIHByb3Bvc2FsIGhhcyBiZWVuIHJlamVjdGVkIGJ5IHJlZmVyZW5kdW0uIFRpbWVkT3V0CAEUaW5kZXgQATxSZWZlcmVuZHVtSW5kZXgEYEluZGV4IG9mIHRoZSByZWZlcmVuZHVtLgEUdGFsbHmtCAEgVDo6VGFsbHkEsFRoZSBmaW5hbCB0YWxseSBvZiB2b3RlcyBpbiB0aGlzIHJlZmVyZW5kdW0uCgTYQSByZWZlcmVuZHVtIGhhcyBiZWVuIHRpbWVkIG91dCB3aXRob3V0IGJlaW5nIGRlY2lkZWQuJENhbmNlbGxlZAgBFGluZGV4EAE8UmVmZXJlbmR1bUluZGV4BGBJbmRleCBvZiB0aGUgcmVmZXJlbmR1bS4BFHRhbGx5rQgBIFQ6OlRhbGx5BLBUaGUgZmluYWwgdGFsbHkgb2Ygdm90ZXMgaW4gdGhpcyByZWZlcmVuZHVtLgsEgEEgcmVmZXJlbmR1bSBoYXMgYmVlbiBjYW5jZWxsZWQuGEtpbGxlZAgBFGluZGV4EAE8UmVmZXJlbmR1bUluZGV4BGBJbmRleCBvZiB0aGUgcmVmZXJlbmR1bS4BFHRhbGx5rQgBIFQ6OlRhbGx5BLBUaGUgZmluYWwgdGFsbHkgb2Ygdm90ZXMgaW4gdGhpcyByZWZlcmVuZHVtLgwEdEEgcmVmZXJlbmR1bSBoYXMgYmVlbiBraWxsZWQuZFN1Ym1pc3Npb25EZXBvc2l0UmVmdW5kZWQMARRpbmRleBABPFJlZmVyZW5kdW1JbmRleARgSW5kZXggb2YgdGhlIHJlZmVyZW5kdW0uAQx3aG8AATBUOjpBY2NvdW50SWQEjFRoZSBhY2NvdW50IHdobyBwbGFjZWQgdGhlIGRlcG9zaXQuARhhbW91bnQYATxCYWxhbmNlT2Y8VCwgST4EhFRoZSBhbW91bnQgcGxhY2VkIGJ5IHRoZSBhY2NvdW50Lg0EpFRoZSBzdWJtaXNzaW9uIGRlcG9zaXQgaGFzIGJlZW4gcmVmdW5kZWQuLE1ldGFkYXRhU2V0CAEUaW5kZXgQATxSZWZlcmVuZHVtSW5kZXgEYEluZGV4IG9mIHRoZSByZWZlcmVuZHVtLgEQaGFzaDQBHFQ6Okhhc2gEOFByZWltYWdlIGhhc2guDgScTWV0YWRhdGEgZm9yIGEgcmVmZXJlbmR1bSBoYXMgYmVlbiBzZXQuPE1ldGFkYXRhQ2xlYXJlZAgBFGluZGV4EAE8UmVmZXJlbmR1bUluZGV4BGBJbmRleCBvZiB0aGUgcmVmZXJlbmR1bS4BEGhhc2g0ARxUOjpIYXNoBDhQcmVpbWFnZSBoYXNoLg8ErE1ldGFkYXRhIGZvciBhIHJlZmVyZW5kdW0gaGFzIGJlZW4gY2xlYXJlZC4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXSlARA0ZnJhbWVfc3VwcG9ydBh0cmFpdHMkcHJlaW1hZ2VzHEJvdW5kZWQIBFQBqQEESAGlCAEMGExlZ2FjeQQBEGhhc2g0ASRIOjpPdXRwdXQAAAAYSW5saW5lBACpCAE0Qm91bmRlZElubGluZQABABhMb29rdXAIARBoYXNoNAEkSDo6T3V0cHV0AAEMbGVuEAEMdTMyAAIAAKkBCDx3ZXN0ZW5kX3J1bnRpbWUsUnVudGltZUNhbGwAAdAYU3lzdGVtBACtAQGtAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxTeXN0ZW0sIFJ1bnRpbWU+AAAAEEJhYmUEAL0BAaUBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPEJhYmUsIFJ1bnRpbWU+AAEAJFRpbWVzdGFtcAQA5QEBuQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8VGltZXN0YW1wLCBSdW50aW1lPgACABxJbmRpY2VzBADpAQGxAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxJbmRpY2VzLCBSdW50aW1lPgADACBCYWxhbmNlcwQA+QEBtQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8QmFsYW5jZXMsIFJ1bnRpbWU+AAQAHFN0YWtpbmcEAAkCAbEBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPFN0YWtpbmcsIFJ1bnRpbWU+AAYAKFBhcmFtZXRlcnMEAD0CAb0Bc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPFBhcmFtZXRlcnMsIFJ1bnRpbWU+AEYAHFNlc3Npb24EAFECAbEBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPFNlc3Npb24sIFJ1bnRpbWU+AAgAHEdyYW5kcGEEAG0CAbEBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPEdyYW5kcGEsIFJ1bnRpbWU+AAoAHFV0aWxpdHkEAJkCAbEBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPFV0aWxpdHksIFJ1bnRpbWU+ABAAIElkZW50aXR5BAD1AgG1AXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxJZGVudGl0eSwgUnVudGltZT4AEQAgUmVjb3ZlcnkEAJ0DAbUBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPFJlY292ZXJ5LCBSdW50aW1lPgASABxWZXN0aW5nBAClAwGxAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxWZXN0aW5nLCBSdW50aW1lPgATACRTY2hlZHVsZXIEAK0DAbkBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPFNjaGVkdWxlciwgUnVudGltZT4AFAAgUHJlaW1hZ2UEALUDAbUBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPFByZWltYWdlLCBSdW50aW1lPgAcABBTdWRvBAC9AwGlAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxTdWRvLCBSdW50aW1lPgAVABRQcm94eQQAwQMBqQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8UHJveHksIFJ1bnRpbWU+ABYAIE11bHRpc2lnBADJAwG1AXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxNdWx0aXNpZywgUnVudGltZT4AFwBoRWxlY3Rpb25Qcm92aWRlck11bHRpUGhhc2UEANEDAf0Bc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPEVsZWN0aW9uUHJvdmlkZXJNdWx0aVBoYXNlLCBSdW50aW1lPgAYACRWb3Rlckxpc3QEAMEEAbkBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPFZvdGVyTGlzdCwgUnVudGltZT4AGQA8Tm9taW5hdGlvblBvb2xzBADFBAHRAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxOb21pbmF0aW9uUG9vbHMsIFJ1bnRpbWU+AB0ALEZhc3RVbnN0YWtlBADdBAHBAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxGYXN0VW5zdGFrZSwgUnVudGltZT4AHgBAQ29udmljdGlvblZvdGluZwQA4QQB1QFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8Q29udmljdGlvblZvdGluZywgUnVudGltZT4AHwAkUmVmZXJlbmRhBADtBAG5AXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxSZWZlcmVuZGEsIFJ1bnRpbWU+ACAAJFdoaXRlbGlzdAQA+QQBuQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8V2hpdGVsaXN0LCBSdW50aW1lPgAkACBUcmVhc3VyeQQA/QQBtQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8VHJlYXN1cnksIFJ1bnRpbWU+ACUANENvbmZpZ3VyYXRpb24EAF0FAckBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPENvbmZpZ3VyYXRpb24sIFJ1bnRpbWU+ACoALFBhcmFzU2hhcmVkBACBBQHBAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxQYXJhc1NoYXJlZCwgUnVudGltZT4AKwA0UGFyYUluY2x1c2lvbgQAhQUByQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8UGFyYUluY2x1c2lvbiwgUnVudGltZT4ALAAwUGFyYUluaGVyZW50BACJBQHFAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxQYXJhSW5oZXJlbnQsIFJ1bnRpbWU+AC0AFFBhcmFzBAARBgGpAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxQYXJhcywgUnVudGltZT4ALwAsSW5pdGlhbGl6ZXIEABkGAcEBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPEluaXRpYWxpemVyLCBSdW50aW1lPgAwABBIcm1wBAAdBgGlAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxIcm1wLCBSdW50aW1lPgAzADRQYXJhc0Rpc3B1dGVzBAAlBgHJAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxQYXJhc0Rpc3B1dGVzLCBSdW50aW1lPgA1ADRQYXJhc1NsYXNoaW5nBAApBgHJAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxQYXJhc1NsYXNoaW5nLCBSdW50aW1lPgA2AGhPbkRlbWFuZEFzc2lnbm1lbnRQcm92aWRlcgQAOQYB/QFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8T25EZW1hbmRBc3NpZ25tZW50UHJvdmlkZXIsIFJ1bnRpbWU+ADgAJFJlZ2lzdHJhcgQAPQYBuQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8UmVnaXN0cmFyLCBSdW50aW1lPgA8ABRTbG90cwQAQQYBqQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8U2xvdHMsIFJ1bnRpbWU+AD0AQFBhcmFzU3Vkb1dyYXBwZXIEAEUGAdUBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPFBhcmFzU3Vkb1dyYXBwZXIsIFJ1bnRpbWU+AD4AIEF1Y3Rpb25zBAB5BwG1AXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxBdWN0aW9ucywgUnVudGltZT4APwAkQ3Jvd2Rsb2FuBACBBwG5AXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxDcm93ZGxvYW4sIFJ1bnRpbWU+AEAANEFzc2lnbmVkU2xvdHMEAI0HAckBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPEFzc2lnbmVkU2xvdHMsIFJ1bnRpbWU+AEEAIENvcmV0aW1lBACVBwG1AXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxDb3JldGltZSwgUnVudGltZT4AQgA8U3Rha2luZ0FoQ2xpZW50BACpBwHRAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxTdGFraW5nQWhDbGllbnQsIFJ1bnRpbWU+AEMAUE11bHRpQmxvY2tNaWdyYXRpb25zBAC1BwHlAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxNdWx0aUJsb2NrTWlncmF0aW9ucywgUnVudGltZT4AYgAkWGNtUGFsbGV0BADdBwG5AXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxYY21QYWxsZXQsIFJ1bnRpbWU+AGMAME1lc3NhZ2VRdWV1ZQQAHQgBxQFzZWxmOjpzcF9hcGlfaGlkZGVuX2luY2x1ZGVzX2NvbnN0cnVjdF9ydW50aW1lOjpoaWRkZW5faW5jbHVkZTo6ZGlzcGF0Y2gKOjpDYWxsYWJsZUNhbGxGb3I8TWVzc2FnZVF1ZXVlLCBSdW50aW1lPgBkACRBc3NldFJhdGUEACkIAbkBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPEFzc2V0UmF0ZSwgUnVudGltZT4AZQAsUm9vdFRlc3RpbmcEADEIAcEBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPFJvb3RUZXN0aW5nLCBSdW50aW1lPgBmABhNZXRhVHgEADUIAa0Bc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPE1ldGFUeCwgUnVudGltZT4AZwAUQmVlZnkEAG0IAakBc2VsZjo6c3BfYXBpX2hpZGRlbl9pbmNsdWRlc19jb25zdHJ1Y3RfcnVudGltZTo6aGlkZGVuX2luY2x1ZGU6OmRpc3BhdGNoCjo6Q2FsbGFibGVDYWxsRm9yPEJlZWZ5LCBSdW50aW1lPgDIAEBJZGVudGl0eU1pZ3JhdG9yBAChCAHVAXNlbGY6OnNwX2FwaV9oaWRkZW5faW5jbHVkZXNfY29uc3RydWN0X3J1bnRpbWU6OmhpZGRlbl9pbmNsdWRlOjpkaXNwYXRjaAo6OkNhbGxhYmxlQ2FsbEZvcjxJZGVudGl0eU1pZ3JhdG9yLCBSdW50aW1lPgD4AACtAQwwZnJhbWVfc3lzdGVtGHBhbGxldBBDYWxsBARUAAEsGHJlbWFyawQBGHJlbWFyazgBHFZlYzx1OD4AAAxoTWFrZSBzb21lIG9uLWNoYWluIHJlbWFyay4AiENhbiBiZSBleGVjdXRlZCBieSBldmVyeSBgb3JpZ2luYC44c2V0X2hlYXBfcGFnZXMEARRwYWdlczABDHU2NAABBPhTZXQgdGhlIG51bWJlciBvZiBwYWdlcyBpbiB0aGUgV2ViQXNzZW1ibHkgZW52aXJvbm1lbnQncyBoZWFwLiBzZXRfY29kZQQBEGNvZGU4ARxWZWM8dTg+AAIEZFNldCB0aGUgbmV3IHJ1bnRpbWUgY29kZS5cc2V0X2NvZGVfd2l0aG91dF9jaGVja3MEARBjb2RlOAEcVmVjPHU4PgADEBkBU2V0IHRoZSBuZXcgcnVudGltZSBjb2RlIHdpdGhvdXQgZG9pbmcgYW55IGNoZWNrcyBvZiB0aGUgZ2l2ZW4gYGNvZGVgLgBRAU5vdGUgdGhhdCBydW50aW1lIHVwZ3JhZGVzIHdpbGwgbm90IHJ1biBpZiB0aGlzIGlzIGNhbGxlZCB3aXRoIGEgbm90LWluY3JlYXNpbmcgc3BlYyB2ZXJzaW9uISxzZXRfc3RvcmFnZQQBFGl0ZW1zsQEBNFZlYzxLZXlWYWx1ZT4ABARoU2V0IHNvbWUgaXRlbXMgb2Ygc3RvcmFnZS4wa2lsbF9zdG9yYWdlBAEQa2V5c7kBASBWZWM8S2V5PgAFBHRLaWxsIHNvbWUgaXRlbXMgZnJvbSBzdG9yYWdlLixraWxsX3ByZWZpeAgBGHByZWZpeDgBDEtleQABHHN1YmtleXMQAQx1MzIABhARAUtpbGwgYWxsIHN0b3JhZ2UgaXRlbXMgd2l0aCBhIGtleSB0aGF0IHN0YXJ0cyB3aXRoIHRoZSBnaXZlbiBwcmVmaXguADkBKipOT1RFOioqIFdlIHJlbHkgb24gdGhlIFJvb3Qgb3JpZ2luIHRvIHByb3ZpZGUgdXMgdGhlIG51bWJlciBvZiBzdWJrZXlzIHVuZGVyPQF0aGUgcHJlZml4IHdlIGFyZSByZW1vdmluZyB0byBhY2N1cmF0ZWx5IGNhbGN1bGF0ZSB0aGUgd2VpZ2h0IG9mIHRoaXMgZnVuY3Rpb24uRHJlbWFya193aXRoX2V2ZW50BAEYcmVtYXJrOAEcVmVjPHU4PgAHBKRNYWtlIHNvbWUgb24tY2hhaW4gcmVtYXJrIGFuZCBlbWl0IGV2ZW50LkRhdXRob3JpemVfdXBncmFkZQQBJGNvZGVfaGFzaDQBHFQ6Okhhc2gACRBhAUF1dGhvcml6ZSBhbiB1cGdyYWRlIHRvIGEgZ2l2ZW4gYGNvZGVfaGFzaGAgZm9yIHRoZSBydW50aW1lLiBUaGUgcnVudGltZSBjYW4gYmUgc3VwcGxpZWQYbGF0ZXIuAHxUaGlzIGNhbGwgcmVxdWlyZXMgUm9vdCBvcmlnaW4ugGF1dGhvcml6ZV91cGdyYWRlX3dpdGhvdXRfY2hlY2tzBAEkY29kZV9oYXNoNAEcVDo6SGFzaAAKIGEBQXV0aG9yaXplIGFuIHVwZ3JhZGUgdG8gYSBnaXZlbiBgY29kZV9oYXNoYCBmb3IgdGhlIHJ1bnRpbWUuIFRoZSBydW50aW1lIGNhbiBiZSBzdXBwbGllZBhsYXRlci4AXQFXQVJOSU5HOiBUaGlzIGF1dGhvcml6ZXMgYW4gdXBncmFkZSB0aGF0IHdpbGwgdGFrZSBwbGFjZSB3aXRob3V0IGFueSBzYWZldHkgY2hlY2tzLCBmb3JZAWV4YW1wbGUgdGhhdCB0aGUgc3BlYyBuYW1lIHJlbWFpbnMgdGhlIHNhbWUgYW5kIHRoYXQgdGhlIHZlcnNpb24gbnVtYmVyIGluY3JlYXNlcy4gTm908HJlY29tbWVuZGVkIGZvciBub3JtYWwgdXNlLiBVc2UgYGF1dGhvcml6ZV91cGdyYWRlYCBpbnN0ZWFkLgB8VGhpcyBjYWxsIHJlcXVpcmVzIFJvb3Qgb3JpZ2luLmBhcHBseV9hdXRob3JpemVkX3VwZ3JhZGUEARBjb2RlOAEcVmVjPHU4PgALJFUBUHJvdmlkZSB0aGUgcHJlaW1hZ2UgKHJ1bnRpbWUgYmluYXJ5KSBgY29kZWAgZm9yIGFuIHVwZ3JhZGUgdGhhdCBoYXMgYmVlbiBhdXRob3JpemVkLgBJAUlmIHRoZSBhdXRob3JpemF0aW9uIHJlcXVpcmVkIGEgdmVyc2lvbiBjaGVjaywgdGhpcyBjYWxsIHdpbGwgZW5zdXJlIHRoZSBzcGVjIG5hbWXocmVtYWlucyB1bmNoYW5nZWQgYW5kIHRoYXQgdGhlIHNwZWMgdmVyc2lvbiBoYXMgaW5jcmVhc2VkLgBZAURlcGVuZGluZyBvbiB0aGUgcnVudGltZSdzIGBPblNldENvZGVgIGNvbmZpZ3VyYXRpb24sIHRoaXMgZnVuY3Rpb24gbWF5IGRpcmVjdGx5IGFwcGx5EQF0aGUgbmV3IGBjb2RlYCBpbiB0aGUgc2FtZSBibG9jayBvciBhdHRlbXB0IHRvIHNjaGVkdWxlIHRoZSB1cGdyYWRlLgBgQWxsIG9yaWdpbnMgYXJlIGFsbG93ZWQuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLrEBAAACtQEAtQEAAAQIODgAuQEAAAI4AL0BDCxwYWxsZXRfYmFiZRhwYWxsZXQQQ2FsbAQEVAABDExyZXBvcnRfZXF1aXZvY2F0aW9uCAFIZXF1aXZvY2F0aW9uX3Byb29mwQEBkEJveDxFcXVpdm9jYXRpb25Qcm9vZjxIZWFkZXJGb3I8VD4+PgABPGtleV9vd25lcl9wcm9vZtUBAUBUOjpLZXlPd25lclByb29mAAAQCQFSZXBvcnQgYXV0aG9yaXR5IGVxdWl2b2NhdGlvbi9taXNiZWhhdmlvci4gVGhpcyBtZXRob2Qgd2lsbCB2ZXJpZnkFAXRoZSBlcXVpdm9jYXRpb24gcHJvb2YgYW5kIHZhbGlkYXRlIHRoZSBnaXZlbiBrZXkgb3duZXJzaGlwIHByb29mDQFhZ2FpbnN0IHRoZSBleHRyYWN0ZWQgb2ZmZW5kZXIuIElmIGJvdGggYXJlIHZhbGlkLCB0aGUgb2ZmZW5jZSB3aWxsMGJlIHJlcG9ydGVkLnByZXBvcnRfZXF1aXZvY2F0aW9uX3Vuc2lnbmVkCAFIZXF1aXZvY2F0aW9uX3Byb29mwQEBkEJveDxFcXVpdm9jYXRpb25Qcm9vZjxIZWFkZXJGb3I8VD4+PgABPGtleV9vd25lcl9wcm9vZtUBAUBUOjpLZXlPd25lclByb29mAAEgCQFSZXBvcnQgYXV0aG9yaXR5IGVxdWl2b2NhdGlvbi9taXNiZWhhdmlvci4gVGhpcyBtZXRob2Qgd2lsbCB2ZXJpZnkFAXRoZSBlcXVpdm9jYXRpb24gcHJvb2YgYW5kIHZhbGlkYXRlIHRoZSBnaXZlbiBrZXkgb3duZXJzaGlwIHByb29mDQFhZ2FpbnN0IHRoZSBleHRyYWN0ZWQgb2ZmZW5kZXIuIElmIGJvdGggYXJlIHZhbGlkLCB0aGUgb2ZmZW5jZSB3aWxsMGJlIHJlcG9ydGVkLg0BVGhpcyBleHRyaW5zaWMgbXVzdCBiZSBjYWxsZWQgdW5zaWduZWQgYW5kIGl0IGlzIGV4cGVjdGVkIHRoYXQgb25seRUBYmxvY2sgYXV0aG9ycyB3aWxsIGNhbGwgaXQgKHZhbGlkYXRlZCBpbiBgVmFsaWRhdGVVbnNpZ25lZGApLCBhcyBzdWNoFQFpZiB0aGUgYmxvY2sgYXV0aG9yIGlzIGRlZmluZWQgaXQgd2lsbCBiZSBkZWZpbmVkIGFzIHRoZSBlcXVpdm9jYXRpb24kcmVwb3J0ZXIuSHBsYW5fY29uZmlnX2NoYW5nZQQBGGNvbmZpZ9kBAVBOZXh0Q29uZmlnRGVzY3JpcHRvcgACEF0BUGxhbiBhbiBlcG9jaCBjb25maWcgY2hhbmdlLiBUaGUgZXBvY2ggY29uZmlnIGNoYW5nZSBpcyByZWNvcmRlZCBhbmQgd2lsbCBiZSBlbmFjdGVkIG9uUQF0aGUgbmV4dCBjYWxsIHRvIGBlbmFjdF9lcG9jaF9jaGFuZ2VgLiBUaGUgY29uZmlnIHdpbGwgYmUgYWN0aXZhdGVkIG9uZSBlcG9jaCBhZnRlci5ZAU11bHRpcGxlIGNhbGxzIHRvIHRoaXMgbWV0aG9kIHdpbGwgcmVwbGFjZSBhbnkgZXhpc3RpbmcgcGxhbm5lZCBjb25maWcgY2hhbmdlIHRoYXQgaGFkVG5vdCBiZWVuIGVuYWN0ZWQgeWV0LgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy7BAQhIc3BfY29uc2Vuc3VzX3Nsb3RzREVxdWl2b2NhdGlvblByb29mCBhIZWFkZXIBxQEISWQBzQEAEAEgb2ZmZW5kZXLNAQEISWQAARBzbG900QEBEFNsb3QAATBmaXJzdF9oZWFkZXLFAQEYSGVhZGVyAAE0c2Vjb25kX2hlYWRlcsUBARhIZWFkZXIAAMUBEChzcF9ydW50aW1lHGdlbmVyaWMYaGVhZGVyGEhlYWRlcggYTnVtYmVyARAQSGFzaAAAFAEscGFyZW50X2hhc2g0ATBIYXNoOjpPdXRwdXQAARhudW1iZXLJAQEYTnVtYmVyAAEoc3RhdGVfcm9vdDQBMEhhc2g6Ok91dHB1dAABPGV4dHJpbnNpY3Nfcm9vdDQBMEhhc2g6Ok91dHB1dAABGGRpZ2VzdDwBGERpZ2VzdAAAyQEAAAYQAM0BDERzcF9jb25zZW5zdXNfYmFiZQxhcHAYUHVibGljAAAEAAQBPHNyMjU1MTk6OlB1YmxpYwAA0QEISHNwX2NvbnNlbnN1c19zbG90cxBTbG90AAAEADABDHU2NAAA1QEIKHNwX3Nlc3Npb248TWVtYmVyc2hpcFByb29mAAAMARxzZXNzaW9uEAEwU2Vzc2lvbkluZGV4AAEodHJpZV9ub2Rlc7kBATBWZWM8VmVjPHU4Pj4AATx2YWxpZGF0b3JfY291bnQQAThWYWxpZGF0b3JDb3VudAAA2QEMRHNwX2NvbnNlbnN1c19iYWJlHGRpZ2VzdHNQTmV4dENvbmZpZ0Rlc2NyaXB0b3IAAQQIVjEIAQRj3QEBKCh1NjQsIHU2NCkAATRhbGxvd2VkX3Nsb3Rz4QEBMEFsbG93ZWRTbG90cwABAADdAQAABAgwMADhAQhEc3BfY29uc2Vuc3VzX2JhYmUwQWxsb3dlZFNsb3RzAAEMMFByaW1hcnlTbG90cwAAAHRQcmltYXJ5QW5kU2Vjb25kYXJ5UGxhaW5TbG90cwABAGxQcmltYXJ5QW5kU2Vjb25kYXJ5VlJGU2xvdHMAAgAA5QEMQHBhbGxldF90aW1lc3RhbXAYcGFsbGV0EENhbGwEBFQAAQQMc2V0BAEMbm93LAEkVDo6TW9tZW50AABMVFNldCB0aGUgY3VycmVudCB0aW1lLgBVAVRoaXMgY2FsbCBzaG91bGQgYmUgaW52b2tlZCBleGFjdGx5IG9uY2UgcGVyIGJsb2NrLiBJdCB3aWxsIHBhbmljIGF0IHRoZSBmaW5hbGl6YXRpb27UcGhhc2UsIGlmIHRoaXMgY2FsbCBoYXNuJ3QgYmVlbiBpbnZva2VkIGJ5IHRoYXQgdGltZS4AQQFUaGUgdGltZXN0YW1wIHNob3VsZCBiZSBncmVhdGVyIHRoYW4gdGhlIHByZXZpb3VzIG9uZSBieSB0aGUgYW1vdW50IHNwZWNpZmllZCBieWhbYENvbmZpZzo6TWluaW11bVBlcmlvZGBdLgDEVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX05vbmVfLgBRAVRoaXMgZGlzcGF0Y2ggY2xhc3MgaXMgX01hbmRhdG9yeV8gdG8gZW5zdXJlIGl0IGdldHMgZXhlY3V0ZWQgaW4gdGhlIGJsb2NrLiBCZSBhd2FyZVEBdGhhdCBjaGFuZ2luZyB0aGUgY29tcGxleGl0eSBvZiB0aGlzIGNhbGwgY291bGQgcmVzdWx0IGV4aGF1c3RpbmcgdGhlIHJlc291cmNlcyBpbiBhhGJsb2NrIHRvIGV4ZWN1dGUgYW55IG90aGVyIGNhbGxzLgA0IyMgQ29tcGxleGl0eTEBLSBgTygxKWAgKE5vdGUgdGhhdCBpbXBsZW1lbnRhdGlvbnMgb2YgYE9uVGltZXN0YW1wU2V0YCBtdXN0IGFsc28gYmUgYE8oMSlgKVUBLSAxIHN0b3JhZ2UgcmVhZCBhbmQgMSBzdG9yYWdlIG11dGF0aW9uIChjb2RlYyBgTygxKWAgYmVjYXVzZSBvZiBgRGlkVXBkYXRlOjp0YWtlYCBpbkAgIGBvbl9maW5hbGl6ZWAp1C0gMSBldmVudCBoYW5kbGVyIGBvbl90aW1lc3RhbXBfc2V0YC4gTXVzdCBiZSBgTygxKWAuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLukBDDhwYWxsZXRfaW5kaWNlcxhwYWxsZXQQQ2FsbAQEVAABGBRjbGFpbQQBFGluZGV4EAE8VDo6QWNjb3VudEluZGV4AAAwmEFzc2lnbiBhbiBwcmV2aW91c2x5IHVuYXNzaWduZWQgaW5kZXguANxQYXltZW50OiBgRGVwb3NpdGAgaXMgcmVzZXJ2ZWQgZnJvbSB0aGUgc2VuZGVyIGFjY291bnQuAMxUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXy4A8C0gYGluZGV4YDogdGhlIGluZGV4IHRvIGJlIGNsYWltZWQuIFRoaXMgbXVzdCBub3QgYmUgaW4gdXNlLgCQRW1pdHMgYEluZGV4QXNzaWduZWRgIGlmIHN1Y2Nlc3NmdWwuADQjIyBDb21wbGV4aXR5JC0gYE8oMSlgLiB0cmFuc2ZlcggBDG5ld+0BAVBBY2NvdW50SWRMb29rdXBPZjxUPgABFGluZGV4EAE8VDo6QWNjb3VudEluZGV4AAEwXQFBc3NpZ24gYW4gaW5kZXggYWxyZWFkeSBvd25lZCBieSB0aGUgc2VuZGVyIHRvIGFub3RoZXIgYWNjb3VudC4gVGhlIGJhbGFuY2UgcmVzZXJ2YXRpb264aXMgZWZmZWN0aXZlbHkgdHJhbnNmZXJyZWQgdG8gdGhlIG5ldyBhY2NvdW50LgDMVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uACUBLSBgaW5kZXhgOiB0aGUgaW5kZXggdG8gYmUgcmUtYXNzaWduZWQuIFRoaXMgbXVzdCBiZSBvd25lZCBieSB0aGUgc2VuZGVyLl0BLSBgbmV3YDogdGhlIG5ldyBvd25lciBvZiB0aGUgaW5kZXguIFRoaXMgZnVuY3Rpb24gaXMgYSBuby1vcCBpZiBpdCBpcyBlcXVhbCB0byBzZW5kZXIuAJBFbWl0cyBgSW5kZXhBc3NpZ25lZGAgaWYgc3VjY2Vzc2Z1bC4ANCMjIENvbXBsZXhpdHkkLSBgTygxKWAuEGZyZWUEARRpbmRleBABPFQ6OkFjY291bnRJbmRleAACMJRGcmVlIHVwIGFuIGluZGV4IG93bmVkIGJ5IHRoZSBzZW5kZXIuAF0BUGF5bWVudDogQW55IHByZXZpb3VzIGRlcG9zaXQgcGxhY2VkIGZvciB0aGUgaW5kZXggaXMgdW5yZXNlcnZlZCBpbiB0aGUgc2VuZGVyIGFjY291bnQuAFUBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8gYW5kIHRoZSBzZW5kZXIgbXVzdCBvd24gdGhlIGluZGV4LgANAS0gYGluZGV4YDogdGhlIGluZGV4IHRvIGJlIGZyZWVkLiBUaGlzIG11c3QgYmUgb3duZWQgYnkgdGhlIHNlbmRlci4AhEVtaXRzIGBJbmRleEZyZWVkYCBpZiBzdWNjZXNzZnVsLgA0IyMgQ29tcGxleGl0eSQtIGBPKDEpYC44Zm9yY2VfdHJhbnNmZXIMAQxuZXftAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AARRpbmRleBABPFQ6OkFjY291bnRJbmRleAABGGZyZWV6ZSABEGJvb2wAAzRVAUZvcmNlIGFuIGluZGV4IHRvIGFuIGFjY291bnQuIFRoaXMgZG9lc24ndCByZXF1aXJlIGEgZGVwb3NpdC4gSWYgdGhlIGluZGV4IGlzIGFscmVhZHnoaGVsZCwgdGhlbiBhbnkgZGVwb3NpdCBpcyByZWltYnVyc2VkIHRvIGl0cyBjdXJyZW50IG93bmVyLgDEVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1Jvb3RfLgCkLSBgaW5kZXhgOiB0aGUgaW5kZXggdG8gYmUgKHJlLSlhc3NpZ25lZC5dAS0gYG5ld2A6IHRoZSBuZXcgb3duZXIgb2YgdGhlIGluZGV4LiBUaGlzIGZ1bmN0aW9uIGlzIGEgbm8tb3AgaWYgaXQgaXMgZXF1YWwgdG8gc2VuZGVyLkEBLSBgZnJlZXplYDogaWYgc2V0IHRvIGB0cnVlYCwgd2lsbCBmcmVlemUgdGhlIGluZGV4IHNvIGl0IGNhbm5vdCBiZSB0cmFuc2ZlcnJlZC4AkEVtaXRzIGBJbmRleEFzc2lnbmVkYCBpZiBzdWNjZXNzZnVsLgA0IyMgQ29tcGxleGl0eSQtIGBPKDEpYC4YZnJlZXplBAEUaW5kZXgQATxUOjpBY2NvdW50SW5kZXgABDBBAUZyZWV6ZSBhbiBpbmRleCBzbyBpdCB3aWxsIGFsd2F5cyBwb2ludCB0byB0aGUgc2VuZGVyIGFjY291bnQuIFRoaXMgY29uc3VtZXMgdGhlIGRlcG9zaXQuAFkBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8gYW5kIHRoZSBzaWduaW5nIGFjY291bnQgbXVzdCBoYXZlIGFsbm9uLWZyb3plbiBhY2NvdW50IGBpbmRleGAuAKwtIGBpbmRleGA6IHRoZSBpbmRleCB0byBiZSBmcm96ZW4gaW4gcGxhY2UuAIhFbWl0cyBgSW5kZXhGcm96ZW5gIGlmIHN1Y2Nlc3NmdWwuADQjIyBDb21wbGV4aXR5JC0gYE8oMSlgLjBwb2tlX2RlcG9zaXQEARRpbmRleBABPFQ6OkFjY291bnRJbmRleAAFKJxQb2tlIHRoZSBkZXBvc2l0IHJlc2VydmVkIGZvciBhbiBpbmRleC4AWQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXyBhbmQgdGhlIHNpZ25pbmcgYWNjb3VudCBtdXN0IGhhdmUgYWxub24tZnJvemVuIGFjY291bnQgYGluZGV4YC4AWQFUaGUgdHJhbnNhY3Rpb24gZmVlcyBpcyB3YWl2ZWQgaWYgdGhlIGRlcG9zaXQgaXMgY2hhbmdlZCBhZnRlciBwb2tpbmcvcmVjb25zaWRlcmF0aW9uLgD8LSBgaW5kZXhgOiB0aGUgaW5kZXggd2hvc2UgZGVwb3NpdCBpcyB0byBiZSBwb2tlZC9yZWNvbnNpZGVyZWQuAIxFbWl0cyBgRGVwb3NpdFBva2VkYCBpZiBzdWNjZXNzZnVsLgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy7tAQwoc3BfcnVudGltZTBtdWx0aWFkZHJlc3MwTXVsdGlBZGRyZXNzCCRBY2NvdW50SWQBADBBY2NvdW50SW5kZXgBBQEBFAhJZAQAAAEkQWNjb3VudElkAAAAFEluZGV4BADxAQEwQWNjb3VudEluZGV4AAEADFJhdwQAOAEcVmVjPHU4PgACACRBZGRyZXNzMzIEAAQBIFt1ODsgMzJdAAMAJEFkZHJlc3MyMAQA9QEBIFt1ODsgMjBdAAQAAPEBAAAGBQEA9QEAAAMUAAAACAD5AQw8cGFsbGV0X2JhbGFuY2VzGHBhbGxldBBDYWxsCARUAARJAAEkUHRyYW5zZmVyX2FsbG93X2RlYXRoCAEQZGVzdO0BAVBBY2NvdW50SWRMb29rdXBPZjxUPgABFHZhbHVl/QEBKFQ6OkJhbGFuY2UAABzUVHJhbnNmZXIgc29tZSBsaXF1aWQgZnJlZSBiYWxhbmNlIHRvIGFub3RoZXIgYWNjb3VudC4ANQFgdHJhbnNmZXJfYWxsb3dfZGVhdGhgIHdpbGwgc2V0IHRoZSBgRnJlZUJhbGFuY2VgIG9mIHRoZSBzZW5kZXIgYW5kIHJlY2VpdmVyLhEBSWYgdGhlIHNlbmRlcidzIGFjY291bnQgaXMgYmVsb3cgdGhlIGV4aXN0ZW50aWFsIGRlcG9zaXQgYXMgYSByZXN1bHSwb2YgdGhlIHRyYW5zZmVyLCB0aGUgYWNjb3VudCB3aWxsIGJlIHJlYXBlZC4AFQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBgU2lnbmVkYCBieSB0aGUgdHJhbnNhY3Rvci44Zm9yY2VfdHJhbnNmZXIMARhzb3VyY2XtAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AARBkZXN07QEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEUdmFsdWX9AQEoVDo6QmFsYW5jZQACCGEBRXhhY3RseSBhcyBgdHJhbnNmZXJfYWxsb3dfZGVhdGhgLCBleGNlcHQgdGhlIG9yaWdpbiBtdXN0IGJlIHJvb3QgYW5kIHRoZSBzb3VyY2UgYWNjb3VudERtYXkgYmUgc3BlY2lmaWVkLkx0cmFuc2Zlcl9rZWVwX2FsaXZlCAEQZGVzdO0BAVBBY2NvdW50SWRMb29rdXBPZjxUPgABFHZhbHVl/QEBKFQ6OkJhbGFuY2UAAxhZAVNhbWUgYXMgdGhlIFtgdHJhbnNmZXJfYWxsb3dfZGVhdGhgXSBjYWxsLCBidXQgd2l0aCBhIGNoZWNrIHRoYXQgdGhlIHRyYW5zZmVyIHdpbGwgbm90YGtpbGwgdGhlIG9yaWdpbiBhY2NvdW50LgDoOTklIG9mIHRoZSB0aW1lIHlvdSB3YW50IFtgdHJhbnNmZXJfYWxsb3dfZGVhdGhgXSBpbnN0ZWFkLgDwW2B0cmFuc2Zlcl9hbGxvd19kZWF0aGBdOiBzdHJ1Y3QuUGFsbGV0Lmh0bWwjbWV0aG9kLnRyYW5zZmVyMHRyYW5zZmVyX2FsbAgBEGRlc3TtAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AAShrZWVwX2FsaXZlIAEQYm9vbAAEPAUBVHJhbnNmZXIgdGhlIGVudGlyZSB0cmFuc2ZlcmFibGUgYmFsYW5jZSBmcm9tIHRoZSBjYWxsZXIgYWNjb3VudC4AWQFOT1RFOiBUaGlzIGZ1bmN0aW9uIG9ubHkgYXR0ZW1wdHMgdG8gdHJhbnNmZXIgX3RyYW5zZmVyYWJsZV8gYmFsYW5jZXMuIFRoaXMgbWVhbnMgdGhhdGEBYW55IGxvY2tlZCwgcmVzZXJ2ZWQsIG9yIGV4aXN0ZW50aWFsIGRlcG9zaXRzICh3aGVuIGBrZWVwX2FsaXZlYCBpcyBgdHJ1ZWApLCB3aWxsIG5vdCBiZV0BdHJhbnNmZXJyZWQgYnkgdGhpcyBmdW5jdGlvbi4gVG8gZW5zdXJlIHRoYXQgdGhpcyBmdW5jdGlvbiByZXN1bHRzIGluIGEga2lsbGVkIGFjY291bnQsRQF5b3UgbWlnaHQgbmVlZCB0byBwcmVwYXJlIHRoZSBhY2NvdW50IGJ5IHJlbW92aW5nIGFueSByZWZlcmVuY2UgY291bnRlcnMsIHN0b3JhZ2VAZGVwb3NpdHMsIGV0Yy4uLgDAVGhlIGRpc3BhdGNoIG9yaWdpbiBvZiB0aGlzIGNhbGwgbXVzdCBiZSBTaWduZWQuAKAtIGBkZXN0YDogVGhlIHJlY2lwaWVudCBvZiB0aGUgdHJhbnNmZXIuWQEtIGBrZWVwX2FsaXZlYDogQSBib29sZWFuIHRvIGRldGVybWluZSBpZiB0aGUgYHRyYW5zZmVyX2FsbGAgb3BlcmF0aW9uIHNob3VsZCBzZW5kIGFsbE0BICBvZiB0aGUgZnVuZHMgdGhlIGFjY291bnQgaGFzLCBjYXVzaW5nIHRoZSBzZW5kZXIgYWNjb3VudCB0byBiZSBraWxsZWQgKGZhbHNlKSwgb3JZASAgdHJhbnNmZXIgZXZlcnl0aGluZyBleGNlcHQgYXQgbGVhc3QgdGhlIGV4aXN0ZW50aWFsIGRlcG9zaXQsIHdoaWNoIHdpbGwgZ3VhcmFudGVlIHRvnCAga2VlcCB0aGUgc2VuZGVyIGFjY291bnQgYWxpdmUgKHRydWUpLjxmb3JjZV91bnJlc2VydmUIAQx3aG/tAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AARhhbW91bnQYAShUOjpCYWxhbmNlAAUMsFVucmVzZXJ2ZSBzb21lIGJhbGFuY2UgZnJvbSBhIHVzZXIgYnkgZm9yY2UuAGxDYW4gb25seSBiZSBjYWxsZWQgYnkgUk9PVC5AdXBncmFkZV9hY2NvdW50cwQBDHdobwECAURWZWM8VDo6QWNjb3VudElkPgAGIHBVcGdyYWRlIGEgc3BlY2lmaWVkIGFjY291bnQuAHQtIGBvcmlnaW5gOiBNdXN0IGJlIGBTaWduZWRgLpAtIGB3aG9gOiBUaGUgYWNjb3VudCB0byBiZSB1cGdyYWRlZC4AVQFUaGlzIHdpbGwgd2FpdmUgdGhlIHRyYW5zYWN0aW9uIGZlZSBpZiBhdCBsZWFzdCBhbGwgYnV0IDEwJSBvZiB0aGUgYWNjb3VudHMgbmVlZGVkIHRvQQFiZSB1cGdyYWRlZC4gKFdlIGxldCBzb21lIG5vdCBoYXZlIHRvIGJlIHVwZ3JhZGVkIGp1c3QgaW4gb3JkZXIgdG8gYWxsb3cgZm9yIHRoZVhwb3NzaWJpbGl0eSBvZiBjaHVybikuRGZvcmNlX3NldF9iYWxhbmNlCAEMd2hv7QEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEgbmV3X2ZyZWX9AQEoVDo6QmFsYW5jZQAIDKxTZXQgdGhlIHJlZ3VsYXIgYmFsYW5jZSBvZiBhIGdpdmVuIGFjY291bnQuALBUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgaXMgYHJvb3RgLmxmb3JjZV9hZGp1c3RfdG90YWxfaXNzdWFuY2UIASRkaXJlY3Rpb24FAgFMQWRqdXN0bWVudERpcmVjdGlvbgABFGRlbHRh/QEBKFQ6OkJhbGFuY2UACRS4QWRqdXN0IHRoZSB0b3RhbCBpc3N1YW5jZSBpbiBhIHNhdHVyYXRpbmcgd2F5LgD8Q2FuIG9ubHkgYmUgY2FsbGVkIGJ5IHJvb3QgYW5kIGFsd2F5cyBuZWVkcyBhIHBvc2l0aXZlIGBkZWx0YWAuACQjIEV4YW1wbGUQYnVybggBFHZhbHVl/QEBKFQ6OkJhbGFuY2UAAShrZWVwX2FsaXZlIAEQYm9vbAAKHPxCdXJuIHRoZSBzcGVjaWZpZWQgbGlxdWlkIGZyZWUgYmFsYW5jZSBmcm9tIHRoZSBvcmlnaW4gYWNjb3VudC4AJQFJZiB0aGUgb3JpZ2luJ3MgYWNjb3VudCBlbmRzIHVwIGJlbG93IHRoZSBleGlzdGVudGlhbCBkZXBvc2l0IGFzIGEgcmVzdWx0CQFvZiB0aGUgYnVybiBhbmQgYGtlZXBfYWxpdmVgIGlzIGZhbHNlLCB0aGUgYWNjb3VudCB3aWxsIGJlIHJlYXBlZC4AUQFVbmxpa2Ugc2VuZGluZyBmdW5kcyB0byBhIF9idXJuXyBhZGRyZXNzLCB3aGljaCBtZXJlbHkgbWFrZXMgdGhlIGZ1bmRzIGluYWNjZXNzaWJsZSwhAXRoaXMgYGJ1cm5gIG9wZXJhdGlvbiB3aWxsIHJlZHVjZSB0b3RhbCBpc3N1YW5jZSBieSB0aGUgYW1vdW50IF9idXJuZWRfLgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy79AQAABhgAAQIAAAIAAAUCDDxwYWxsZXRfYmFsYW5jZXMUdHlwZXNMQWRqdXN0bWVudERpcmVjdGlvbgABCCBJbmNyZWFzZQAAACBEZWNyZWFzZQABAAAJAhA4cGFsbGV0X3N0YWtpbmcYcGFsbGV0GHBhbGxldBBDYWxsBARUAAGAEGJvbmQIARR2YWx1Zf0BATBCYWxhbmNlT2Y8VD4AARRwYXllZZQBfFJld2FyZERlc3RpbmF0aW9uPFQ6OkFjY291bnRJZD4AAEBhAVRha2UgdGhlIG9yaWdpbiBhY2NvdW50IGFzIGEgc3Rhc2ggYW5kIGxvY2sgdXAgYHZhbHVlYCBvZiBpdHMgYmFsYW5jZS4gYGNvbnRyb2xsZXJgIHdpbGyAYmUgdGhlIGFjY291bnQgdGhhdCBjb250cm9scyBpdC4ALQFgdmFsdWVgIG11c3QgYmUgbW9yZSB0aGFuIHRoZSBgbWluaW11bV9iYWxhbmNlYCBzcGVjaWZpZWQgYnkgYFQ6OkN1cnJlbmN5YC4AIQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXyBieSB0aGUgc3Rhc2ggYWNjb3VudC4APEVtaXRzIGBCb25kZWRgLjQjIyBDb21wbGV4aXR50C0gSW5kZXBlbmRlbnQgb2YgdGhlIGFyZ3VtZW50cy4gTW9kZXJhdGUgY29tcGxleGl0eS4cLSBPKDEpLmQtIFRocmVlIGV4dHJhIERCIGVudHJpZXMuAE0BTk9URTogVHdvIG9mIHRoZSBzdG9yYWdlIHdyaXRlcyAoYFNlbGY6OmJvbmRlZGAsIGBTZWxmOjpwYXllZWApIGFyZSBfbmV2ZXJfIGNsZWFuZWRZAXVubGVzcyB0aGUgYG9yaWdpbmAgZmFsbHMgYmVsb3cgX2V4aXN0ZW50aWFsIGRlcG9zaXRfIChvciBlcXVhbCB0byAwKSBhbmQgZ2V0cyByZW1vdmVkIGFzIGR1c3QuKGJvbmRfZXh0cmEEAThtYXhfYWRkaXRpb25hbP0BATBCYWxhbmNlT2Y8VD4AAThhAUFkZCBzb21lIGV4dHJhIGFtb3VudCB0aGF0IGhhdmUgYXBwZWFyZWQgaW4gdGhlIHN0YXNoIGBmcmVlX2JhbGFuY2VgIGludG8gdGhlIGJhbGFuY2UgdXAwZm9yIHN0YWtpbmcuAFEBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8gYnkgdGhlIHN0YXNoLCBub3QgdGhlIGNvbnRyb2xsZXIuAE0BVXNlIHRoaXMgaWYgdGhlcmUgYXJlIGFkZGl0aW9uYWwgZnVuZHMgaW4geW91ciBzdGFzaCBhY2NvdW50IHRoYXQgeW91IHdpc2ggdG8gYm9uZC5VAVVubGlrZSBbYGJvbmRgXShTZWxmOjpib25kKSBvciBbYHVuYm9uZGBdKFNlbGY6OnVuYm9uZCkgdGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBpbXBvc2W8YW55IGxpbWl0YXRpb24gb24gdGhlIGFtb3VudCB0aGF0IGNhbiBiZSBhZGRlZC4APEVtaXRzIGBCb25kZWRgLgA0IyMgQ29tcGxleGl0eeQtIEluZGVwZW5kZW50IG9mIHRoZSBhcmd1bWVudHMuIEluc2lnbmlmaWNhbnQgY29tcGxleGl0eS4cLSBPKDEpLhh1bmJvbmQEARR2YWx1Zf0BATBCYWxhbmNlT2Y8VD4AAlRRAVNjaGVkdWxlIGEgcG9ydGlvbiBvZiB0aGUgc3Rhc2ggdG8gYmUgdW5sb2NrZWQgcmVhZHkgZm9yIHRyYW5zZmVyIG91dCBhZnRlciB0aGUgYm9uZPxwZXJpb2QgZW5kcy4gSWYgdGhpcyBsZWF2ZXMgYW4gYW1vdW50IGFjdGl2ZWx5IGJvbmRlZCBsZXNzIHRoYW4hAVtgYXNzZXQ6OmV4aXN0ZW50aWFsX2RlcG9zaXRgXSwgdGhlbiBpdCBpcyBpbmNyZWFzZWQgdG8gdGhlIGZ1bGwgYW1vdW50LgA9AVRoZSBzdGFzaCBtYXkgYmUgY2hpbGxlZCBpZiB0aGUgbGVkZ2VyIHRvdGFsIGFtb3VudCBmYWxscyB0byAwIGFmdGVyIHVuYm9uZGluZy4AUQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXyBieSB0aGUgY29udHJvbGxlciwgbm90IHRoZSBzdGFzaC4ARQFPbmNlIHRoZSB1bmxvY2sgcGVyaW9kIGlzIGRvbmUsIHlvdSBjYW4gY2FsbCBgd2l0aGRyYXdfdW5ib25kZWRgIHRvIGFjdHVhbGx5IG1vdmW8dGhlIGZ1bmRzIG91dCBvZiBtYW5hZ2VtZW50IHJlYWR5IGZvciB0cmFuc2Zlci4AMQFObyBtb3JlIHRoYW4gYSBsaW1pdGVkIG51bWJlciBvZiB1bmxvY2tpbmcgY2h1bmtzIChzZWUgYE1heFVubG9ja2luZ0NodW5rc2ApQQFjYW4gY28tZXhpc3RzIGF0IHRoZSBzYW1lIHRpbWUuIElmIHRoZXJlIGFyZSBubyB1bmxvY2tpbmcgY2h1bmtzIHNsb3RzIGF2YWlsYWJsZUUBW2BDYWxsOjp3aXRoZHJhd191bmJvbmRlZGBdIGlzIGNhbGxlZCB0byByZW1vdmUgc29tZSBvZiB0aGUgY2h1bmtzIChpZiBwb3NzaWJsZSkuADkBSWYgYSB1c2VyIGVuY291bnRlcnMgdGhlIGBJbnN1ZmZpY2llbnRCb25kYCBlcnJvciB3aGVuIGNhbGxpbmcgdGhpcyBleHRyaW5zaWMsGQF0aGV5IHNob3VsZCBjYWxsIGBjaGlsbGAgZmlyc3QgaW4gb3JkZXIgdG8gZnJlZSB1cCB0aGVpciBib25kZWQgZnVuZHMuAERFbWl0cyBgVW5ib25kZWRgLgCUU2VlIGFsc28gW2BDYWxsOjp3aXRoZHJhd191bmJvbmRlZGBdLkR3aXRoZHJhd191bmJvbmRlZAQBSG51bV9zbGFzaGluZ19zcGFucxABDHUzMgADXCkBUmVtb3ZlIGFueSB1bmxvY2tlZCBjaHVua3MgZnJvbSB0aGUgYHVubG9ja2luZ2AgcXVldWUgZnJvbSBvdXIgbWFuYWdlbWVudC4AVQFUaGlzIGVzc2VudGlhbGx5IGZyZWVzIHVwIHRoYXQgYmFsYW5jZSB0byBiZSB1c2VkIGJ5IHRoZSBzdGFzaCBhY2NvdW50IHRvIGRvIHdoYXRldmVyJGl0IHdhbnRzLgAVAVRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfIGJ5IHRoZSBjb250cm9sbGVyLgBIRW1pdHMgYFdpdGhkcmF3bmAuAGhTZWUgYWxzbyBbYENhbGw6OnVuYm9uZGBdLgA0IyMgUGFyYW1ldGVycwBRAS0gYG51bV9zbGFzaGluZ19zcGFuc2AgaW5kaWNhdGVzIHRoZSBudW1iZXIgb2YgbWV0YWRhdGEgc2xhc2hpbmcgc3BhbnMgdG8gY2xlYXIgd2hlblUBdGhpcyBjYWxsIHJlc3VsdHMgaW4gYSBjb21wbGV0ZSByZW1vdmFsIG9mIGFsbCB0aGUgZGF0YSByZWxhdGVkIHRvIHRoZSBzdGFzaCBhY2NvdW50Lj0BSW4gdGhpcyBjYXNlLCB0aGUgYG51bV9zbGFzaGluZ19zcGFuc2AgbXVzdCBiZSBsYXJnZXIgb3IgZXF1YWwgdG8gdGhlIG51bWJlciBvZl0Bc2xhc2hpbmcgc3BhbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzdGFzaCBhY2NvdW50IGluIHRoZSBbYFNsYXNoaW5nU3BhbnNgXSBzdG9yYWdlIHR5cGUsJQFvdGhlcndpc2UgdGhlIGNhbGwgd2lsbCBmYWlsLiBUaGUgY2FsbCB3ZWlnaHQgaXMgZGlyZWN0bHkgcHJvcG9ydGlvbmFsIHRvVGBudW1fc2xhc2hpbmdfc3BhbnNgLgA0IyMgQ29tcGxleGl0edhPKFMpIHdoZXJlIFMgaXMgdGhlIG51bWJlciBvZiBzbGFzaGluZyBzcGFucyB0byByZW1vdmUJAU5PVEU6IFdlaWdodCBhbm5vdGF0aW9uIGlzIHRoZSBraWxsIHNjZW5hcmlvLCB3ZSByZWZ1bmQgb3RoZXJ3aXNlLiB2YWxpZGF0ZQQBFHByZWZzoAE4VmFsaWRhdG9yUHJlZnMABBTkRGVjbGFyZSB0aGUgZGVzaXJlIHRvIHZhbGlkYXRlIGZvciB0aGUgb3JpZ2luIGNvbnRyb2xsZXIuANhFZmZlY3RzIHdpbGwgYmUgZmVsdCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBuZXh0IGVyYS4AUQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXyBieSB0aGUgY29udHJvbGxlciwgbm90IHRoZSBzdGFzaC4gbm9taW5hdGUEARx0YXJnZXRzDQIBZFZlYzxBY2NvdW50SWRMb29rdXBPZjxUPj4ABSgNAURlY2xhcmUgdGhlIGRlc2lyZSB0byBub21pbmF0ZSBgdGFyZ2V0c2AgZm9yIHRoZSBvcmlnaW4gY29udHJvbGxlci4A2EVmZmVjdHMgd2lsbCBiZSBmZWx0IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIG5leHQgZXJhLgBRAVRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfIGJ5IHRoZSBjb250cm9sbGVyLCBub3QgdGhlIHN0YXNoLgA0IyMgQ29tcGxleGl0eS0BLSBUaGUgdHJhbnNhY3Rpb24ncyBjb21wbGV4aXR5IGlzIHByb3BvcnRpb25hbCB0byB0aGUgc2l6ZSBvZiBgdGFyZ2V0c2AgKE4pBQF3aGljaCBpcyBjYXBwZWQgYXQgQ29tcGFjdEFzc2lnbm1lbnRzOjpMSU1JVCAoVDo6TWF4Tm9taW5hdGlvbnMpLtQtIEJvdGggdGhlIHJlYWRzIGFuZCB3cml0ZXMgZm9sbG93IGEgc2ltaWxhciBwYXR0ZXJuLhRjaGlsbAAGKMREZWNsYXJlIG5vIGRlc2lyZSB0byBlaXRoZXIgdmFsaWRhdGUgb3Igbm9taW5hdGUuANhFZmZlY3RzIHdpbGwgYmUgZmVsdCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBuZXh0IGVyYS4AUQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXyBieSB0aGUgY29udHJvbGxlciwgbm90IHRoZSBzdGFzaC4ANCMjIENvbXBsZXhpdHnkLSBJbmRlcGVuZGVudCBvZiB0aGUgYXJndW1lbnRzLiBJbnNpZ25pZmljYW50IGNvbXBsZXhpdHkuUC0gQ29udGFpbnMgb25lIHJlYWQuxC0gV3JpdGVzIGFyZSBsaW1pdGVkIHRvIHRoZSBgb3JpZ2luYCBhY2NvdW50IGtleS4kc2V0X3BheWVlBAEUcGF5ZWWUAXxSZXdhcmREZXN0aW5hdGlvbjxUOjpBY2NvdW50SWQ+AAcwtChSZS0pc2V0IHRoZSBwYXltZW50IHRhcmdldCBmb3IgYSBjb250cm9sbGVyLgBRAUVmZmVjdHMgd2lsbCBiZSBmZWx0IGluc3RhbnRseSAoYXMgc29vbiBhcyB0aGlzIGZ1bmN0aW9uIGlzIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkpLgBRAVRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfIGJ5IHRoZSBjb250cm9sbGVyLCBub3QgdGhlIHN0YXNoLgA0IyMgQ29tcGxleGl0eRgtIE8oMSnkLSBJbmRlcGVuZGVudCBvZiB0aGUgYXJndW1lbnRzLiBJbnNpZ25pZmljYW50IGNvbXBsZXhpdHkulC0gQ29udGFpbnMgYSBsaW1pdGVkIG51bWJlciBvZiByZWFkcy7ELSBXcml0ZXMgYXJlIGxpbWl0ZWQgdG8gdGhlIGBvcmlnaW5gIGFjY291bnQga2V5LiQtLS0tLS0tLS04c2V0X2NvbnRyb2xsZXIACDhFAShSZS0pc2V0cyB0aGUgY29udHJvbGxlciBvZiBhIHN0YXNoIHRvIHRoZSBzdGFzaCBpdHNlbGYuIFRoaXMgZnVuY3Rpb24gcHJldmlvdXNseU0BYWNjZXB0ZWQgYSBgY29udHJvbGxlcmAgYXJndW1lbnQgdG8gc2V0IHRoZSBjb250cm9sbGVyIHRvIGFuIGFjY291bnQgb3RoZXIgdGhhbiB0aGVZAXN0YXNoIGl0c2VsZi4gVGhpcyBmdW5jdGlvbmFsaXR5IGhhcyBub3cgYmVlbiByZW1vdmVkLCBub3cgb25seSBzZXR0aW5nIHRoZSBjb250cm9sbGVyjHRvIHRoZSBzdGFzaCwgaWYgaXQgaXMgbm90IGFscmVhZHkuAFEBRWZmZWN0cyB3aWxsIGJlIGZlbHQgaW5zdGFudGx5IChhcyBzb29uIGFzIHRoaXMgZnVuY3Rpb24gaXMgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSkuAFEBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8gYnkgdGhlIHN0YXNoLCBub3QgdGhlIGNvbnRyb2xsZXIuADQjIyBDb21wbGV4aXR5EE8oMSnkLSBJbmRlcGVuZGVudCBvZiB0aGUgYXJndW1lbnRzLiBJbnNpZ25pZmljYW50IGNvbXBsZXhpdHkulC0gQ29udGFpbnMgYSBsaW1pdGVkIG51bWJlciBvZiByZWFkcy7ELSBXcml0ZXMgYXJlIGxpbWl0ZWQgdG8gdGhlIGBvcmlnaW5gIGFjY291bnQga2V5LkxzZXRfdmFsaWRhdG9yX2NvdW50BAEMbmV3yQEBDHUzMgAJGJBTZXRzIHRoZSBpZGVhbCBudW1iZXIgb2YgdmFsaWRhdG9ycy4AhFRoZSBkaXNwYXRjaCBvcmlnaW4gbXVzdCBiZSBSb290LgA0IyMgQ29tcGxleGl0eRBPKDEpYGluY3JlYXNlX3ZhbGlkYXRvcl9jb3VudAQBKGFkZGl0aW9uYWzJAQEMdTMyAAoc6EluY3JlbWVudHMgdGhlIGlkZWFsIG51bWJlciBvZiB2YWxpZGF0b3JzIHVwIHRvIG1heGltdW0gb2aMYEVsZWN0aW9uUHJvdmlkZXJCYXNlOjpNYXhXaW5uZXJzYC4AhFRoZSBkaXNwYXRjaCBvcmlnaW4gbXVzdCBiZSBSb290LgA0IyMgQ29tcGxleGl0eZhTYW1lIGFzIFtgU2VsZjo6c2V0X3ZhbGlkYXRvcl9jb3VudGBdLlRzY2FsZV92YWxpZGF0b3JfY291bnQEARhmYWN0b3IRAgEcUGVyY2VudAALHBEBU2NhbGUgdXAgdGhlIGlkZWFsIG51bWJlciBvZiB2YWxpZGF0b3JzIGJ5IGEgZmFjdG9yIHVwIHRvIG1heGltdW0gb2aMYEVsZWN0aW9uUHJvdmlkZXJCYXNlOjpNYXhXaW5uZXJzYC4AhFRoZSBkaXNwYXRjaCBvcmlnaW4gbXVzdCBiZSBSb290LgA0IyMgQ29tcGxleGl0eZhTYW1lIGFzIFtgU2VsZjo6c2V0X3ZhbGlkYXRvcl9jb3VudGBdLjRmb3JjZV9ub19lcmFzAAw0rEZvcmNlIHRoZXJlIHRvIGJlIG5vIG5ldyBlcmFzIGluZGVmaW5pdGVseS4AhFRoZSBkaXNwYXRjaCBvcmlnaW4gbXVzdCBiZSBSb290LgAkIyBXYXJuaW5nABkBVGhlIGVsZWN0aW9uIHByb2Nlc3Mgc3RhcnRzIG11bHRpcGxlIGJsb2NrcyBiZWZvcmUgdGhlIGVuZCBvZiB0aGUgZXJhLjkBVGh1cyB0aGUgZWxlY3Rpb24gcHJvY2VzcyBtYXkgYmUgb25nb2luZyB3aGVuIHRoaXMgaXMgY2FsbGVkLiBJbiB0aGlzIGNhc2UgdGhl3GVsZWN0aW9uIHdpbGwgY29udGludWUgdW50aWwgdGhlIG5leHQgZXJhIGlzIHRyaWdnZXJlZC4ANCMjIENvbXBsZXhpdHk8LSBObyBhcmd1bWVudHMuOC0gV2VpZ2h0OiBPKDEpNGZvcmNlX25ld19lcmEADThJAUZvcmNlIHRoZXJlIHRvIGJlIGEgbmV3IGVyYSBhdCB0aGUgZW5kIG9mIHRoZSBuZXh0IHNlc3Npb24uIEFmdGVyIHRoaXMsIGl0IHdpbGwgYmWccmVzZXQgdG8gbm9ybWFsIChub24tZm9yY2VkKSBiZWhhdmlvdXIuAIRUaGUgZGlzcGF0Y2ggb3JpZ2luIG11c3QgYmUgUm9vdC4AJCMgV2FybmluZwAZAVRoZSBlbGVjdGlvbiBwcm9jZXNzIHN0YXJ0cyBtdWx0aXBsZSBibG9ja3MgYmVmb3JlIHRoZSBlbmQgb2YgdGhlIGVyYS5JAUlmIHRoaXMgaXMgY2FsbGVkIGp1c3QgYmVmb3JlIGEgbmV3IGVyYSBpcyB0cmlnZ2VyZWQsIHRoZSBlbGVjdGlvbiBwcm9jZXNzIG1heSBub3SMaGF2ZSBlbm91Z2ggYmxvY2tzIHRvIGdldCBhIHJlc3VsdC4ANCMjIENvbXBsZXhpdHk8LSBObyBhcmd1bWVudHMuOC0gV2VpZ2h0OiBPKDEpRHNldF9pbnZ1bG5lcmFibGVzBAE0aW52dWxuZXJhYmxlcwECAURWZWM8VDo6QWNjb3VudElkPgAODMhTZXQgdGhlIHZhbGlkYXRvcnMgd2hvIGNhbm5vdCBiZSBzbGFzaGVkIChpZiBhbnkpLgCEVGhlIGRpc3BhdGNoIG9yaWdpbiBtdXN0IGJlIFJvb3QuNGZvcmNlX3Vuc3Rha2UIARRzdGFzaAABMFQ6OkFjY291bnRJZAABSG51bV9zbGFzaGluZ19zcGFucxABDHUzMgAPIAkBRm9yY2UgYSBjdXJyZW50IHN0YWtlciB0byBiZWNvbWUgY29tcGxldGVseSB1bnN0YWtlZCwgaW1tZWRpYXRlbHkuAIRUaGUgZGlzcGF0Y2ggb3JpZ2luIG11c3QgYmUgUm9vdC4ANCMjIFBhcmFtZXRlcnMARQEtIGBudW1fc2xhc2hpbmdfc3BhbnNgOiBSZWZlciB0byBjb21tZW50cyBvbiBbYENhbGw6OndpdGhkcmF3X3VuYm9uZGVkYF0gZm9yIG1vcmUgZGV0YWlscy5QZm9yY2VfbmV3X2VyYV9hbHdheXMAECQBAUZvcmNlIHRoZXJlIHRvIGJlIGEgbmV3IGVyYSBhdCB0aGUgZW5kIG9mIHNlc3Npb25zIGluZGVmaW5pdGVseS4AhFRoZSBkaXNwYXRjaCBvcmlnaW4gbXVzdCBiZSBSb290LgAkIyBXYXJuaW5nABkBVGhlIGVsZWN0aW9uIHByb2Nlc3Mgc3RhcnRzIG11bHRpcGxlIGJsb2NrcyBiZWZvcmUgdGhlIGVuZCBvZiB0aGUgZXJhLkkBSWYgdGhpcyBpcyBjYWxsZWQganVzdCBiZWZvcmUgYSBuZXcgZXJhIGlzIHRyaWdnZXJlZCwgdGhlIGVsZWN0aW9uIHByb2Nlc3MgbWF5IG5vdIxoYXZlIGVub3VnaCBibG9ja3MgdG8gZ2V0IGEgcmVzdWx0LlRjYW5jZWxfZGVmZXJyZWRfc2xhc2gIAQxlcmEQASBFcmFJbmRleAABNHNsYXNoX2luZGljZXORAQEgVmVjPHUzMj4AERiUQ2FuY2VsIGVuYWN0bWVudCBvZiBhIGRlZmVycmVkIHNsYXNoLgCYQ2FuIGJlIGNhbGxlZCBieSB0aGUgYFQ6OkFkbWluT3JpZ2luYC4AAQFQYXJhbWV0ZXJzOiBlcmEgYW5kIGluZGljZXMgb2YgdGhlIHNsYXNoZXMgZm9yIHRoYXQgZXJhIHRvIGtpbGwu5FRoZXkgKiptdXN0KiogYmUgc29ydGVkIGluIGFzY2VuZGluZyBvcmRlciwgKmFuZCogdW5pcXVlLjhwYXlvdXRfc3Rha2VycwgBPHZhbGlkYXRvcl9zdGFzaAABMFQ6OkFjY291bnRJZAABDGVyYRABIEVyYUluZGV4ABI0GQFQYXkgb3V0IG5leHQgcGFnZSBvZiB0aGUgc3Rha2VycyBiZWhpbmQgYSB2YWxpZGF0b3IgZm9yIHRoZSBnaXZlbiBlcmEuAOgtIGB2YWxpZGF0b3Jfc3Rhc2hgIGlzIHRoZSBzdGFzaCBhY2NvdW50IG9mIHRoZSB2YWxpZGF0b3IuMQEtIGBlcmFgIG1heSBiZSBhbnkgZXJhIGJldHdlZW4gYFtjdXJyZW50X2VyYSAtIGhpc3RvcnlfZGVwdGg7IGN1cnJlbnRfZXJhXWAuAFUBVGhlIG9yaWdpbiBvZiB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXy4gQW55IGFjY291bnQgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbiwgZXZlbiBpZnRpdCBpcyBub3Qgb25lIG9mIHRoZSBzdGFrZXJzLgBJAVRoZSByZXdhcmQgcGF5b3V0IGNvdWxkIGJlIHBhZ2VkIGluIGNhc2UgdGhlcmUgYXJlIHRvbyBtYW55IG5vbWluYXRvcnMgYmFja2luZyB0aGVdAWB2YWxpZGF0b3Jfc3Rhc2hgLiBUaGlzIGNhbGwgd2lsbCBwYXlvdXQgdW5wYWlkIHBhZ2VzIGluIGFuIGFzY2VuZGluZyBvcmRlci4gVG8gY2xhaW0gYbRzcGVjaWZpYyBwYWdlLCB1c2UgYHBheW91dF9zdGFrZXJzX2J5X3BhZ2VgLmAA8ElmIGFsbCBwYWdlcyBhcmUgY2xhaW1lZCwgaXQgcmV0dXJucyBhbiBlcnJvciBgSW52YWxpZFBhZ2VgLhhyZWJvbmQEARR2YWx1Zf0BATBCYWxhbmNlT2Y8VD4AExzcUmVib25kIGEgcG9ydGlvbiBvZiB0aGUgc3Rhc2ggc2NoZWR1bGVkIHRvIGJlIHVubG9ja2VkLgDUVGhlIGRpc3BhdGNoIG9yaWdpbiBtdXN0IGJlIHNpZ25lZCBieSB0aGUgY29udHJvbGxlci4ANCMjIENvbXBsZXhpdHnQLSBUaW1lIGNvbXBsZXhpdHk6IE8oTCksIHdoZXJlIEwgaXMgdW5sb2NraW5nIGNodW5rc4gtIEJvdW5kZWQgYnkgYE1heFVubG9ja2luZ0NodW5rc2AuKHJlYXBfc3Rhc2gIARRzdGFzaAABMFQ6OkFjY291bnRJZAABSG51bV9zbGFzaGluZ19zcGFucxABDHUzMgAUSF0BUmVtb3ZlIGFsbCBkYXRhIHN0cnVjdHVyZXMgY29uY2VybmluZyBhIHN0YWtlci9zdGFzaCBvbmNlIGl0IGlzIGF0IGEgc3RhdGUgd2hlcmUgaXQgY2FuBQFiZSBjb25zaWRlcmVkIGBkdXN0YCBpbiB0aGUgc3Rha2luZyBzeXN0ZW0uIFRoZSByZXF1aXJlbWVudHMgYXJlOgAFATEuIHRoZSBgdG90YWxfYmFsYW5jZWAgb2YgdGhlIHN0YXNoIGlzIGJlbG93IGV4aXN0ZW50aWFsIGRlcG9zaXQuEQEyLiBvciwgdGhlIGBsZWRnZXIudG90YWxgIG9mIHRoZSBzdGFzaCBpcyBiZWxvdyBleGlzdGVudGlhbCBkZXBvc2l0LmEBMy4gb3IsIGV4aXN0ZW50aWFsIGRlcG9zaXQgaXMgemVybyBhbmQgZWl0aGVyIGB0b3RhbF9iYWxhbmNlYCBvciBgbGVkZ2VyLnRvdGFsYCBpcyB6ZXJvLgBVAVRoZSBmb3JtZXIgY2FuIGhhcHBlbiBpbiBjYXNlcyBsaWtlIGEgc2xhc2g7IHRoZSBsYXR0ZXIgd2hlbiBhIGZ1bGx5IHVuYm9uZGVkIGFjY291bnQJAWlzIHN0aWxsIHJlY2VpdmluZyBzdGFraW5nIHJld2FyZHMgaW4gYFJld2FyZERlc3RpbmF0aW9uOjpTdGFrZWRgLgAxAUl0IGNhbiBiZSBjYWxsZWQgYnkgYW55b25lLCBhcyBsb25nIGFzIGBzdGFzaGAgbWVldHMgdGhlIGFib3ZlIHJlcXVpcmVtZW50cy4A3FJlZnVuZHMgdGhlIHRyYW5zYWN0aW9uIGZlZXMgdXBvbiBzdWNjZXNzZnVsIGV4ZWN1dGlvbi4ANCMjIFBhcmFtZXRlcnMARQEtIGBudW1fc2xhc2hpbmdfc3BhbnNgOiBSZWZlciB0byBjb21tZW50cyBvbiBbYENhbGw6OndpdGhkcmF3X3VuYm9uZGVkYF0gZm9yIG1vcmUgZGV0YWlscy4Qa2ljawQBDHdobw0CAWRWZWM8QWNjb3VudElkTG9va3VwT2Y8VD4+ABUs4FJlbW92ZSB0aGUgZ2l2ZW4gbm9taW5hdGlvbnMgZnJvbSB0aGUgY2FsbGluZyB2YWxpZGF0b3IuANhFZmZlY3RzIHdpbGwgYmUgZmVsdCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBuZXh0IGVyYS4AUQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXyBieSB0aGUgY29udHJvbGxlciwgbm90IHRoZSBzdGFzaC4ATQEtIGB3aG9gOiBBIGxpc3Qgb2Ygbm9taW5hdG9yIHN0YXNoIGFjY291bnRzIHdobyBhcmUgbm9taW5hdGluZyB0aGlzIHZhbGlkYXRvciB3aGljaMAgIHNob3VsZCBubyBsb25nZXIgYmUgbm9taW5hdGluZyB0aGlzIHZhbGlkYXRvci4AVQFOb3RlOiBNYWtpbmcgdGhpcyBjYWxsIG9ubHkgbWFrZXMgc2Vuc2UgaWYgeW91IGZpcnN0IHNldCB0aGUgdmFsaWRhdG9yIHByZWZlcmVuY2VzIHRveGJsb2NrIGFueSBmdXJ0aGVyIG5vbWluYXRpb25zLkxzZXRfc3Rha2luZ19jb25maWdzHAFIbWluX25vbWluYXRvcl9ib25kFQIBWENvbmZpZ09wPEJhbGFuY2VPZjxUPj4AAUhtaW5fdmFsaWRhdG9yX2JvbmQVAgFYQ29uZmlnT3A8QmFsYW5jZU9mPFQ+PgABTG1heF9ub21pbmF0b3JfY291bnQZAgE0Q29uZmlnT3A8dTMyPgABTG1heF92YWxpZGF0b3JfY291bnQZAgE0Q29uZmlnT3A8dTMyPgABPGNoaWxsX3RocmVzaG9sZB0CAURDb25maWdPcDxQZXJjZW50PgABOG1pbl9jb21taXNzaW9uIQIBRENvbmZpZ09wPFBlcmJpbGw+AAFIbWF4X3N0YWtlZF9yZXdhcmRzHQIBRENvbmZpZ09wPFBlcmNlbnQ+ABZErFVwZGF0ZSB0aGUgdmFyaW91cyBzdGFraW5nIGNvbmZpZ3VyYXRpb25zIC4AJQEqIGBtaW5fbm9taW5hdG9yX2JvbmRgOiBUaGUgbWluaW11bSBhY3RpdmUgYm9uZCBuZWVkZWQgdG8gYmUgYSBub21pbmF0b3IuJQEqIGBtaW5fdmFsaWRhdG9yX2JvbmRgOiBUaGUgbWluaW11bSBhY3RpdmUgYm9uZCBuZWVkZWQgdG8gYmUgYSB2YWxpZGF0b3IuVQEqIGBtYXhfbm9taW5hdG9yX2NvdW50YDogVGhlIG1heCBudW1iZXIgb2YgdXNlcnMgd2hvIGNhbiBiZSBhIG5vbWluYXRvciBhdCBvbmNlLiBXaGVumCAgc2V0IHRvIGBOb25lYCwgbm8gbGltaXQgaXMgZW5mb3JjZWQuVQEqIGBtYXhfdmFsaWRhdG9yX2NvdW50YDogVGhlIG1heCBudW1iZXIgb2YgdXNlcnMgd2hvIGNhbiBiZSBhIHZhbGlkYXRvciBhdCBvbmNlLiBXaGVumCAgc2V0IHRvIGBOb25lYCwgbm8gbGltaXQgaXMgZW5mb3JjZWQuWQEqIGBjaGlsbF90aHJlc2hvbGRgOiBUaGUgcmF0aW8gb2YgYG1heF9ub21pbmF0b3JfY291bnRgIG9yIGBtYXhfdmFsaWRhdG9yX2NvdW50YCB3aGljaBkBICBzaG91bGQgYmUgZmlsbGVkIGluIG9yZGVyIGZvciB0aGUgYGNoaWxsX290aGVyYCB0cmFuc2FjdGlvbiB0byB3b3JrLmEBKiBgbWluX2NvbW1pc3Npb25gOiBUaGUgbWluaW11bSBhbW91bnQgb2YgY29tbWlzc2lvbiB0aGF0IGVhY2ggdmFsaWRhdG9ycyBtdXN0IG1haW50YWluLlUBICBUaGlzIGlzIGNoZWNrZWQgb25seSB1cG9uIGNhbGxpbmcgYHZhbGlkYXRlYC4gRXhpc3RpbmcgdmFsaWRhdG9ycyBhcmUgbm90IGFmZmVjdGVkLgDEUnVudGltZU9yaWdpbiBtdXN0IGJlIFJvb3QgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uLgA1AU5PVEU6IEV4aXN0aW5nIG5vbWluYXRvcnMgYW5kIHZhbGlkYXRvcnMgd2lsbCBub3QgYmUgYWZmZWN0ZWQgYnkgdGhpcyB1cGRhdGUuEQF0byBraWNrIHBlb3BsZSB1bmRlciB0aGUgbmV3IGxpbWl0cywgYGNoaWxsX290aGVyYCBzaG91bGQgYmUgY2FsbGVkLixjaGlsbF9vdGhlcgQBFHN0YXNoAAEwVDo6QWNjb3VudElkABdoQQFEZWNsYXJlIGEgYGNvbnRyb2xsZXJgIHRvIHN0b3AgcGFydGljaXBhdGluZyBhcyBlaXRoZXIgYSB2YWxpZGF0b3Igb3Igbm9taW5hdG9yLgDYRWZmZWN0cyB3aWxsIGJlIGZlbHQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbmV4dCBlcmEuAEEBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8sIGJ1dCBjYW4gYmUgY2FsbGVkIGJ5IGFueW9uZS4AWQFJZiB0aGUgY2FsbGVyIGlzIHRoZSBzYW1lIGFzIHRoZSBjb250cm9sbGVyIGJlaW5nIHRhcmdldGVkLCB0aGVuIG5vIGZ1cnRoZXIgY2hlY2tzIGFyZdhlbmZvcmNlZCwgYW5kIHRoaXMgZnVuY3Rpb24gYmVoYXZlcyBqdXN0IGxpa2UgYGNoaWxsYC4AXQFJZiB0aGUgY2FsbGVyIGlzIGRpZmZlcmVudCB0aGFuIHRoZSBjb250cm9sbGVyIGJlaW5nIHRhcmdldGVkLCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMwbXVzdCBiZSBtZXQ6AB0BKiBgY29udHJvbGxlcmAgbXVzdCBiZWxvbmcgdG8gYSBub21pbmF0b3Igd2hvIGhhcyBiZWNvbWUgbm9uLWRlY29kYWJsZSwADE9yOgA9ASogQSBgQ2hpbGxUaHJlc2hvbGRgIG11c3QgYmUgc2V0IGFuZCBjaGVja2VkIHdoaWNoIGRlZmluZXMgaG93IGNsb3NlIHRvIHRoZSBtYXhVASAgbm9taW5hdG9ycyBvciB2YWxpZGF0b3JzIHdlIG11c3QgcmVhY2ggYmVmb3JlIHVzZXJzIGNhbiBzdGFydCBjaGlsbGluZyBvbmUtYW5vdGhlci5ZASogQSBgTWF4Tm9taW5hdG9yQ291bnRgIGFuZCBgTWF4VmFsaWRhdG9yQ291bnRgIG11c3QgYmUgc2V0IHdoaWNoIGlzIHVzZWQgdG8gZGV0ZXJtaW5lkCAgaG93IGNsb3NlIHdlIGFyZSB0byB0aGUgdGhyZXNob2xkLl0BKiBBIGBNaW5Ob21pbmF0b3JCb25kYCBhbmQgYE1pblZhbGlkYXRvckJvbmRgIG11c3QgYmUgc2V0IGFuZCBjaGVja2VkLCB3aGljaCBkZXRlcm1pbmVzUQEgIGlmIHRoaXMgaXMgYSBwZXJzb24gdGhhdCBzaG91bGQgYmUgY2hpbGxlZCBiZWNhdXNlIHRoZXkgaGF2ZSBub3QgbWV0IHRoZSB0aHJlc2hvbGRAICBib25kIHJlcXVpcmVkLgBVAVRoaXMgY2FuIGJlIGhlbHBmdWwgaWYgYm9uZCByZXF1aXJlbWVudHMgYXJlIHVwZGF0ZWQsIGFuZCB3ZSBuZWVkIHRvIHJlbW92ZSBvbGQgdXNlcnOYd2hvIGRvIG5vdCBzYXRpc2Z5IHRoZXNlIHJlcXVpcmVtZW50cy5oZm9yY2VfYXBwbHlfbWluX2NvbW1pc3Npb24EATx2YWxpZGF0b3Jfc3Rhc2gAATBUOjpBY2NvdW50SWQAGAxFAUZvcmNlIGEgdmFsaWRhdG9yIHRvIGhhdmUgYXQgbGVhc3QgdGhlIG1pbmltdW0gY29tbWlzc2lvbi4gVGhpcyB3aWxsIG5vdCBhZmZlY3QgYWEBdmFsaWRhdG9yIHdobyBhbHJlYWR5IGhhcyBhIGNvbW1pc3Npb24gZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBtaW5pbXVtLiBBbnkgYWNjb3VudDhjYW4gY2FsbCB0aGlzLkhzZXRfbWluX2NvbW1pc3Npb24EAQxuZXeYARxQZXJiaWxsABkQJQFTZXRzIHRoZSBtaW5pbXVtIGFtb3VudCBvZiBjb21taXNzaW9uIHRoYXQgZWFjaCB2YWxpZGF0b3JzIG11c3QgbWFpbnRhaW4uAFkBVGhpcyBjYWxsIGhhcyBsb3dlciBwcml2aWxlZ2UgcmVxdWlyZW1lbnRzIHRoYW4gYHNldF9zdGFraW5nX2NvbmZpZ2AgYW5kIGNhbiBiZSBjYWxsZWTMYnkgdGhlIGBUOjpBZG1pbk9yaWdpbmAuIFJvb3QgY2FuIGFsd2F5cyBjYWxsIHRoaXMuWHBheW91dF9zdGFrZXJzX2J5X3BhZ2UMATx2YWxpZGF0b3Jfc3Rhc2gAATBUOjpBY2NvdW50SWQAAQxlcmEQASBFcmFJbmRleAABEHBhZ2UQARBQYWdlABpEMQFQYXkgb3V0IGEgcGFnZSBvZiB0aGUgc3Rha2VycyBiZWhpbmQgYSB2YWxpZGF0b3IgZm9yIHRoZSBnaXZlbiBlcmEgYW5kIHBhZ2UuAOgtIGB2YWxpZGF0b3Jfc3Rhc2hgIGlzIHRoZSBzdGFzaCBhY2NvdW50IG9mIHRoZSB2YWxpZGF0b3IuMQEtIGBlcmFgIG1heSBiZSBhbnkgZXJhIGJldHdlZW4gYFtjdXJyZW50X2VyYSAtIGhpc3RvcnlfZGVwdGg7IGN1cnJlbnRfZXJhXWAuMQEtIGBwYWdlYCBpcyB0aGUgcGFnZSBpbmRleCBvZiBub21pbmF0b3JzIHRvIHBheSBvdXQgd2l0aCB2YWx1ZSBiZXR3ZWVuIDAgYW5ksCAgYG51bV9ub21pbmF0b3JzIC8gVDo6TWF4RXhwb3N1cmVQYWdlU2l6ZWAuAFUBVGhlIG9yaWdpbiBvZiB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXy4gQW55IGFjY291bnQgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbiwgZXZlbiBpZnRpdCBpcyBub3Qgb25lIG9mIHRoZSBzdGFrZXJzLgA9AUlmIGEgdmFsaWRhdG9yIGhhcyBtb3JlIHRoYW4gW2BDb25maWc6Ok1heEV4cG9zdXJlUGFnZVNpemVgXSBub21pbmF0b3JzIGJhY2tpbmcpAXRoZW0sIHRoZW4gdGhlIGxpc3Qgb2Ygbm9taW5hdG9ycyBpcyBwYWdlZCwgd2l0aCBlYWNoIHBhZ2UgYmVpbmcgY2FwcGVkIGF0VQFbYENvbmZpZzo6TWF4RXhwb3N1cmVQYWdlU2l6ZWAuXSBJZiBhIHZhbGlkYXRvciBoYXMgbW9yZSB0aGFuIG9uZSBwYWdlIG9mIG5vbWluYXRvcnMsSQF0aGUgY2FsbCBuZWVkcyB0byBiZSBtYWRlIGZvciBlYWNoIHBhZ2Ugc2VwYXJhdGVseSBpbiBvcmRlciBmb3IgYWxsIHRoZSBub21pbmF0b3JzVQFiYWNraW5nIGEgdmFsaWRhdG9yIHRvIHJlY2VpdmUgdGhlIHJld2FyZC4gVGhlIG5vbWluYXRvcnMgYXJlIG5vdCBzb3J0ZWQgYWNyb3NzIHBhZ2VzYQFhbmQgc28gaXQgc2hvdWxkIG5vdCBiZSBhc3N1bWVkIHRoZSBoaWdoZXN0IHN0YWtlciB3b3VsZCBiZSBvbiB0aGUgdG9wbW9zdCBwYWdlIGFuZCB2aWNlSQF2ZXJzYS4gSWYgcmV3YXJkcyBhcmUgbm90IGNsYWltZWQgaW4gW2BDb25maWc6Okhpc3RvcnlEZXB0aGBdIGVyYXMsIHRoZXkgYXJlIGxvc3QuMHVwZGF0ZV9wYXllZQQBKGNvbnRyb2xsZXIAATBUOjpBY2NvdW50SWQAGxjgTWlncmF0ZXMgYW4gYWNjb3VudCdzIGBSZXdhcmREZXN0aW5hdGlvbjo6Q29udHJvbGxlcmAgdG+kYFJld2FyZERlc3RpbmF0aW9uOjpBY2NvdW50KGNvbnRyb2xsZXIpYC4AUQFFZmZlY3RzIHdpbGwgYmUgZmVsdCBpbnN0YW50bHkgKGFzIHNvb24gYXMgdGhpcyBmdW5jdGlvbiBpcyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5KS4AMQFUaGlzIHdpbGwgd2FpdmUgdGhlIHRyYW5zYWN0aW9uIGZlZSBpZiB0aGUgYHBheWVlYCBpcyBzdWNjZXNzZnVsbHkgbWlncmF0ZWQuaGRlcHJlY2F0ZV9jb250cm9sbGVyX2JhdGNoBAEsY29udHJvbGxlcnMlAgH0Qm91bmRlZFZlYzxUOjpBY2NvdW50SWQsIFQ6Ok1heENvbnRyb2xsZXJzSW5EZXByZWNhdGlvbkJhdGNoPgAcHF0BVXBkYXRlcyBhIGJhdGNoIG9mIGNvbnRyb2xsZXIgYWNjb3VudHMgdG8gdGhlaXIgY29ycmVzcG9uZGluZyBzdGFzaCBhY2NvdW50IGlmIHRoZXkgYXJlYQFub3QgdGhlIHNhbWUuIElnbm9yZXMgYW55IGNvbnRyb2xsZXIgYWNjb3VudHMgdGhhdCBkbyBub3QgZXhpc3QsIGFuZCBkb2VzIG5vdCBvcGVyYXRlIGlmuHRoZSBzdGFzaCBhbmQgY29udHJvbGxlciBhcmUgYWxyZWFkeSB0aGUgc2FtZS4AUQFFZmZlY3RzIHdpbGwgYmUgZmVsdCBpbnN0YW50bHkgKGFzIHNvb24gYXMgdGhpcyBmdW5jdGlvbiBpcyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5KS4AtFRoZSBkaXNwYXRjaCBvcmlnaW4gbXVzdCBiZSBgVDo6QWRtaW5PcmlnaW5gLjhyZXN0b3JlX2xlZGdlchABFHN0YXNoAAEwVDo6QWNjb3VudElkAAFAbWF5YmVfY29udHJvbGxlcjUBAVBPcHRpb248VDo6QWNjb3VudElkPgABLG1heWJlX3RvdGFsKQIBUE9wdGlvbjxCYWxhbmNlT2Y8VD4+AAE8bWF5YmVfdW5sb2NraW5nLQIBFQFPcHRpb248Qm91bmRlZFZlYzxVbmxvY2tDaHVuazxCYWxhbmNlT2Y8VD4+LCBUOjoKTWF4VW5sb2NraW5nQ2h1bmtzPj4AHSwFAVJlc3RvcmVzIHRoZSBzdGF0ZSBvZiBhIGxlZGdlciB3aGljaCBpcyBpbiBhbiBpbmNvbnNpc3RlbnQgc3RhdGUuANxUaGUgcmVxdWlyZW1lbnRzIHRvIHJlc3RvcmUgYSBsZWRnZXIgYXJlIHRoZSBmb2xsb3dpbmc6ZCogVGhlIHN0YXNoIGlzIGJvbmRlZDsgb3INASogVGhlIHN0YXNoIGlzIG5vdCBib25kZWQgYnV0IGl0IGhhcyBhIHN0YWtpbmcgbG9jayBsZWZ0IGJlaGluZDsgb3IlASogSWYgdGhlIHN0YXNoIGhhcyBhbiBhc3NvY2lhdGVkIGxlZGdlciBhbmQgaXRzIHN0YXRlIGlzIGluY29uc2lzdGVudDsgb3IdASogSWYgdGhlIGxlZGdlciBpcyBub3QgY29ycnVwdGVkICpidXQqIGl0cyBzdGFraW5nIGxvY2sgaXMgb3V0IG9mIHN5bmMuAGEBVGhlIGBtYXliZV8qYCBpbnB1dCBwYXJhbWV0ZXJzIHdpbGwgb3ZlcndyaXRlIHRoZSBjb3JyZXNwb25kaW5nIGRhdGEgYW5kIG1ldGFkYXRhIG9mIHRoZVkBbGVkZ2VyIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3Rhc2guIElmIHRoZSBpbnB1dCBwYXJhbWV0ZXJzIGFyZSBub3Qgc2V0LCB0aGUgbGVkZ2VyIHdpbGyQYmUgcmVzZXQgdmFsdWVzIGZyb20gb24tY2hhaW4gc3RhdGUuQG1pZ3JhdGVfY3VycmVuY3kEARRzdGFzaAABMFQ6OkFjY291bnRJZAAeHLxSZW1vdmVzIHRoZSBsZWdhY3kgU3Rha2luZyBsb2NrcyBpZiB0aGV5IGV4aXN0LgBRAVRoaXMgcmVtb3ZlcyB0aGUgbGVnYWN5IGxvY2sgb24gdGhlIHN0YWtlIHdpdGggW2BDb25maWc6Ok9sZEN1cnJlbmN5YF0gYW5kIGNyZWF0ZXMgYVUBaG9sZCBvbiBpdCBpZiBuZWVkZWQuIElmIGFsbCBzdGFrZSBjYW5ub3QgYmUgaGVsZCwgdGhlIGJlc3QgZWZmb3J0IGlzIG1hZGUgdG8gaG9sZCBhcykBbXVjaCBhcyBwb3NzaWJsZS4gVGhlIHJlbWFpbmluZyBzdGFrZSBpcyBmb3JjZWQgd2l0aGRyYXduIGZyb20gdGhlIGxlZGdlci4AxFRoZSBmZWUgaXMgd2FpdmVkIGlmIHRoZSBtaWdyYXRpb24gaXMgc3VjY2Vzc2Z1bC4wbWFudWFsX3NsYXNoDAE8dmFsaWRhdG9yX3N0YXNoAAEwVDo6QWNjb3VudElkAAEMZXJhEAEgRXJhSW5kZXgAAThzbGFzaF9mcmFjdGlvbpgBHFBlcmJpbGwAIVQZAVRoaXMgZnVuY3Rpb24gYWxsb3dzIGdvdmVybmFuY2UgdG8gbWFudWFsbHkgc2xhc2ggYSB2YWxpZGF0b3IgYW5kIGlzIGFcKipmYWxsYmFjayBtZWNoYW5pc20qKi4AtFRoZSBkaXNwYXRjaCBvcmlnaW4gbXVzdCBiZSBgVDo6QWRtaW5PcmlnaW5gLgA0IyMgUGFyYW1ldGVycwkBLSBgdmFsaWRhdG9yX3N0YXNoYCAtIFRoZSBzdGFzaCBhY2NvdW50IG9mIHRoZSB2YWxpZGF0b3IgdG8gc2xhc2gu/C0gYGVyYWAgLSBUaGUgZXJhIGluIHdoaWNoIHRoZSB2YWxpZGF0b3Igd2FzIGluIHRoZSBhY3RpdmUgc2V0LkkBLSBgc2xhc2hfZnJhY3Rpb25gIC0gVGhlIHBlcmNlbnRhZ2Ugb2YgdGhlIHN0YWtlIHRvIHNsYXNoLCBleHByZXNzZWQgYXMgYSBQZXJiaWxsLgAsIyMgQmVoYXZpb3IAPQFUaGUgc2xhc2ggd2lsbCBiZSBhcHBsaWVkIHVzaW5nIHRoZSBzdGFuZGFyZCBzbGFzaGluZyBtZWNoYW5pY3MsIHJlc3BlY3RpbmcgdGhlgGNvbmZpZ3VyZWQgYFNsYXNoRGVmZXJEdXJhdGlvbmAuACxUaGlzIG1lYW5zOlEBLSBJZiB0aGUgdmFsaWRhdG9yIHdhcyBhbHJlYWR5IHNsYXNoZWQgYnkgYSBoaWdoZXIgcGVyY2VudGFnZSBmb3IgdGhlIHNhbWUgZXJhLCB0aGlznCAgc2xhc2ggd2lsbCBoYXZlIG5vIGFkZGl0aW9uYWwgZWZmZWN0LlEBLSBJZiB0aGUgdmFsaWRhdG9yIHdhcyBwcmV2aW91c2x5IHNsYXNoZWQgYnkgYSBsb3dlciBwZXJjZW50YWdlLCBvbmx5IHRoZSBkaWZmZXJlbmNlSCAgd2lsbCBiZSBhcHBsaWVkLj0BLSBUaGUgc2xhc2ggd2lsbCBiZSBkZWZlcnJlZCBieSBgU2xhc2hEZWZlckR1cmF0aW9uYCBlcmFzIGJlZm9yZSBiZWluZyBlbmFjdGVkLgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy4NAgAAAu0BABECDDRzcF9hcml0aG1ldGljKHBlcl90aGluZ3McUGVyY2VudAAABAAIAQh1OAAAFQIQOHBhbGxldF9zdGFraW5nGHBhbGxldBhwYWxsZXQgQ29uZmlnT3AEBFQBGAEMEE5vb3AAAAAMU2V0BAAYAQRUAAEAGFJlbW92ZQACAAAZAhA4cGFsbGV0X3N0YWtpbmcYcGFsbGV0GHBhbGxldCBDb25maWdPcAQEVAEQAQwQTm9vcAAAAAxTZXQEABABBFQAAQAYUmVtb3ZlAAIAAB0CEDhwYWxsZXRfc3Rha2luZxhwYWxsZXQYcGFsbGV0IENvbmZpZ09wBARUARECAQwQTm9vcAAAAAxTZXQEABECAQRUAAEAGFJlbW92ZQACAAAhAhA4cGFsbGV0X3N0YWtpbmcYcGFsbGV0GHBhbGxldCBDb25maWdPcAQEVAGYAQwQTm9vcAAAAAxTZXQEAJgBBFQAAQAYUmVtb3ZlAAIAACUCDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBAARTAAAEAAECARhWZWM8VD4AACkCBBhPcHRpb24EBFQBGAEIEE5vbmUAAAAQU29tZQQAGAAAAQAALQIEGE9wdGlvbgQEVAExAgEIEE5vbmUAAAAQU29tZQQAMQIAAAEAADECDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBNQIEUwAABAA5AgEYVmVjPFQ+AAA1Agg4cGFsbGV0X3N0YWtpbmcsVW5sb2NrQ2h1bmsEHEJhbGFuY2UBGAAIARR2YWx1Zf0BARxCYWxhbmNlAAEMZXJhyQEBIEVyYUluZGV4AAA5AgAAAjUCAD0CDERwYWxsZXRfcGFyYW1ldGVycxhwYWxsZXQQQ2FsbAQEVAABBDRzZXRfcGFyYW1ldGVyBAEka2V5X3ZhbHVlQQIBUFQ6OlJ1bnRpbWVQYXJhbWV0ZXJzAAAQdFNldCB0aGUgdmFsdWUgb2YgYSBwYXJhbWV0ZXIuAFUBVGhlIGRpc3BhdGNoIG9yaWdpbiBvZiB0aGlzIGNhbGwgbXVzdCBiZSBgQWRtaW5PcmlnaW5gIGZvciB0aGUgZ2l2ZW4gYGtleWAuIFZhbHVlcyBiZYhkZWxldGVkIGJ5IHNldHRpbmcgdGhlbSB0byBgTm9uZWAuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLkECCDx3ZXN0ZW5kX3J1bnRpbWVEUnVudGltZVBhcmFtZXRlcnMAAQQkSW5mbGF0aW9uBABFAgGUZHluYW1pY19wYXJhbXM6OmluZmxhdGlvbjo6UGFyYW1ldGVycwAAAABFAhA8d2VzdGVuZF9ydW50aW1lOGR5bmFtaWNfcGFyYW1zJGluZmxhdGlvbihQYXJhbWV0ZXJzAAEUME1pbkluZmxhdGlvbggAxAEwTWluSW5mbGF0aW9uAABJAgFMT3B0aW9uPFBlcnF1aW50aWxsPgAAADBNYXhJbmZsYXRpb24IAMgBME1heEluZmxhdGlvbgAASQIBTE9wdGlvbjxQZXJxdWludGlsbD4AAQAoSWRlYWxTdGFrZQgAzAEoSWRlYWxTdGFrZQAASQIBTE9wdGlvbjxQZXJxdWludGlsbD4AAgAcRmFsbG9mZggA0AEcRmFsbG9mZgAASQIBTE9wdGlvbjxQZXJxdWludGlsbD4AAwA8VXNlQXVjdGlvblNsb3RzCADUATxVc2VBdWN0aW9uU2xvdHMAAE0CATBPcHRpb248Ym9vbD4ABAAASQIEGE9wdGlvbgQEVAHkAQgQTm9uZQAAABBTb21lBADkAAABAABNAgQYT3B0aW9uBARUASABCBBOb25lAAAAEFNvbWUEACAAAAEAAFECDDhwYWxsZXRfc2Vzc2lvbhhwYWxsZXQQQ2FsbAQEVAABCCBzZXRfa2V5cwgBEGtleXNVAgEcVDo6S2V5cwABFHByb29mOAEcVmVjPHU4PgAAJORTZXRzIHRoZSBzZXNzaW9uIGtleShzKSBvZiB0aGUgZnVuY3Rpb24gY2FsbGVyIHRvIGBrZXlzYC4dAUFsbG93cyBhbiBhY2NvdW50IHRvIHNldCBpdHMgc2Vzc2lvbiBrZXkgcHJpb3IgdG8gYmVjb21pbmcgYSB2YWxpZGF0b3IuwFRoaXMgZG9lc24ndCB0YWtlIGVmZmVjdCB1bnRpbCB0aGUgbmV4dCBzZXNzaW9uLgDQVGhlIGRpc3BhdGNoIG9yaWdpbiBvZiB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgc2lnbmVkLgA0IyMgQ29tcGxleGl0eVkBLSBgTygxKWAuIEFjdHVhbCBjb3N0IGRlcGVuZHMgb24gdGhlIG51bWJlciBvZiBsZW5ndGggb2YgYFQ6OktleXM6OmtleV9pZHMoKWAgd2hpY2ggaXMgICBmaXhlZC4ocHVyZ2Vfa2V5cwABMMhSZW1vdmVzIGFueSBzZXNzaW9uIGtleShzKSBvZiB0aGUgZnVuY3Rpb24gY2FsbGVyLgDAVGhpcyBkb2Vzbid0IHRha2UgZWZmZWN0IHVudGlsIHRoZSBuZXh0IHNlc3Npb24uAFUBVGhlIGRpc3BhdGNoIG9yaWdpbiBvZiB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgU2lnbmVkIGFuZCB0aGUgYWNjb3VudCBtdXN0IGJlIGVpdGhlciBiZV0BY29udmVydGlibGUgdG8gYSB2YWxpZGF0b3IgSUQgdXNpbmcgdGhlIGNoYWluJ3MgdHlwaWNhbCBhZGRyZXNzaW5nIHN5c3RlbSAodGhpcyB1c3VhbGx5UQFtZWFucyBiZWluZyBhIGNvbnRyb2xsZXIgYWNjb3VudCkgb3IgZGlyZWN0bHkgY29udmVydGlibGUgaW50byBhIHZhbGlkYXRvciBJRCAod2hpY2iUdXN1YWxseSBtZWFucyBiZWluZyBhIHN0YXNoIGFjY291bnQpLgA0IyMgQ29tcGxleGl0eT0BLSBgTygxKWAgaW4gbnVtYmVyIG9mIGtleSB0eXBlcy4gQWN0dWFsIGNvc3QgZGVwZW5kcyBvbiB0aGUgbnVtYmVyIG9mIGxlbmd0aCBvZpggIGBUOjpLZXlzOjprZXlfaWRzKClgIHdoaWNoIGlzIGZpeGVkLgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy5VAgg8d2VzdGVuZF9ydW50aW1lLFNlc3Npb25LZXlzAAAYARxncmFuZHBh+AHQPEdyYW5kcGEgYXMgJGNyYXRlOjpCb3VuZFRvUnVudGltZUFwcFB1YmxpYz46OlB1YmxpYwABEGJhYmXNAQHEPEJhYmUgYXMgJGNyYXRlOjpCb3VuZFRvUnVudGltZUFwcFB1YmxpYz46OlB1YmxpYwABOHBhcmFfdmFsaWRhdG9yWQIB4DxJbml0aWFsaXplciBhcyAkY3JhdGU6OkJvdW5kVG9SdW50aW1lQXBwUHVibGljPjo6UHVibGljAAE8cGFyYV9hc3NpZ25tZW50XQIB8DxQYXJhU2Vzc2lvbkluZm8gYXMgJGNyYXRlOjpCb3VuZFRvUnVudGltZUFwcFB1YmxpYz46OlB1YmxpYwABTGF1dGhvcml0eV9kaXNjb3ZlcnlhAgH8PEF1dGhvcml0eURpc2NvdmVyeSBhcyAkY3JhdGU6OkJvdW5kVG9SdW50aW1lQXBwUHVibGljPjo6UHVibGljAAEUYmVlZnllAgHIPEJlZWZ5IGFzICRjcmF0ZTo6Qm91bmRUb1J1bnRpbWVBcHBQdWJsaWM+OjpQdWJsaWMAAFkCEExwb2xrYWRvdF9wcmltaXRpdmVzCHY4NHZhbGlkYXRvcl9hcHAYUHVibGljAAAEAAQBPHNyMjU1MTk6OlB1YmxpYwAAXQIQTHBvbGthZG90X3ByaW1pdGl2ZXMIdjg4YXNzaWdubWVudF9hcHAYUHVibGljAAAEAAQBPHNyMjU1MTk6OlB1YmxpYwAAYQIMWHNwX2F1dGhvcml0eV9kaXNjb3ZlcnkMYXBwGFB1YmxpYwAABAAEATxzcjI1NTE5OjpQdWJsaWMAAGUCDEhzcF9jb25zZW5zdXNfYmVlZnkwZWNkc2FfY3J5cHRvGFB1YmxpYwAABABpAgE0ZWNkc2E6OlB1YmxpYwAAaQIAAAMhAAAACABtAgw4cGFsbGV0X2dyYW5kcGEYcGFsbGV0EENhbGwEBFQAAQxMcmVwb3J0X2VxdWl2b2NhdGlvbggBSGVxdWl2b2NhdGlvbl9wcm9vZnECAchCb3g8RXF1aXZvY2F0aW9uUHJvb2Y8VDo6SGFzaCwgQmxvY2tOdW1iZXJGb3I8VD4+PgABPGtleV9vd25lcl9wcm9vZtUBAUBUOjpLZXlPd25lclByb29mAAAQCQFSZXBvcnQgdm90ZXIgZXF1aXZvY2F0aW9uL21pc2JlaGF2aW9yLiBUaGlzIG1ldGhvZCB3aWxsIHZlcmlmeSB0aGX0ZXF1aXZvY2F0aW9uIHByb29mIGFuZCB2YWxpZGF0ZSB0aGUgZ2l2ZW4ga2V5IG93bmVyc2hpcCBwcm9vZvhhZ2FpbnN0IHRoZSBleHRyYWN0ZWQgb2ZmZW5kZXIuIElmIGJvdGggYXJlIHZhbGlkLCB0aGUgb2ZmZW5jZUR3aWxsIGJlIHJlcG9ydGVkLnByZXBvcnRfZXF1aXZvY2F0aW9uX3Vuc2lnbmVkCAFIZXF1aXZvY2F0aW9uX3Byb29mcQIByEJveDxFcXVpdm9jYXRpb25Qcm9vZjxUOjpIYXNoLCBCbG9ja051bWJlckZvcjxUPj4+AAE8a2V5X293bmVyX3Byb29m1QEBQFQ6OktleU93bmVyUHJvb2YAASQJAVJlcG9ydCB2b3RlciBlcXVpdm9jYXRpb24vbWlzYmVoYXZpb3IuIFRoaXMgbWV0aG9kIHdpbGwgdmVyaWZ5IHRoZfRlcXVpdm9jYXRpb24gcHJvb2YgYW5kIHZhbGlkYXRlIHRoZSBnaXZlbiBrZXkgb3duZXJzaGlwIHByb29m+GFnYWluc3QgdGhlIGV4dHJhY3RlZCBvZmZlbmRlci4gSWYgYm90aCBhcmUgdmFsaWQsIHRoZSBvZmZlbmNlRHdpbGwgYmUgcmVwb3J0ZWQuAA0BVGhpcyBleHRyaW5zaWMgbXVzdCBiZSBjYWxsZWQgdW5zaWduZWQgYW5kIGl0IGlzIGV4cGVjdGVkIHRoYXQgb25seRUBYmxvY2sgYXV0aG9ycyB3aWxsIGNhbGwgaXQgKHZhbGlkYXRlZCBpbiBgVmFsaWRhdGVVbnNpZ25lZGApLCBhcyBzdWNoFQFpZiB0aGUgYmxvY2sgYXV0aG9yIGlzIGRlZmluZWQgaXQgd2lsbCBiZSBkZWZpbmVkIGFzIHRoZSBlcXVpdm9jYXRpb24kcmVwb3J0ZXIuMG5vdGVfc3RhbGxlZAgBFGRlbGF5EAFEQmxvY2tOdW1iZXJGb3I8VD4AAWxiZXN0X2ZpbmFsaXplZF9ibG9ja19udW1iZXIQAURCbG9ja051bWJlckZvcjxUPgACMD0BTm90ZSB0aGF0IHRoZSBjdXJyZW50IGF1dGhvcml0eSBzZXQgb2YgdGhlIEdSQU5EUEEgZmluYWxpdHkgZ2FkZ2V0IGhhcyBzdGFsbGVkLgBhAVRoaXMgd2lsbCB0cmlnZ2VyIGEgZm9yY2VkIGF1dGhvcml0eSBzZXQgY2hhbmdlIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIG5leHQgc2Vzc2lvbiwgdG9hAWJlIGVuYWN0ZWQgYGRlbGF5YCBibG9ja3MgYWZ0ZXIgdGhhdC4gVGhlIGBkZWxheWAgc2hvdWxkIGJlIGhpZ2ggZW5vdWdoIHRvIHNhZmVseSBhc3N1bWVJAXRoYXQgdGhlIGJsb2NrIHNpZ25hbGxpbmcgdGhlIGZvcmNlZCBjaGFuZ2Ugd2lsbCBub3QgYmUgcmUtb3JnZWQgZS5nLiAxMDAwIGJsb2Nrcy5dAVRoZSBibG9jayBwcm9kdWN0aW9uIHJhdGUgKHdoaWNoIG1heSBiZSBzbG93ZWQgZG93biBiZWNhdXNlIG9mIGZpbmFsaXR5IGxhZ2dpbmcpIHNob3VsZFEBYmUgdGFrZW4gaW50byBhY2NvdW50IHdoZW4gY2hvb3NpbmcgdGhlIGBkZWxheWAuIFRoZSBHUkFORFBBIHZvdGVycyBiYXNlZCBvbiB0aGUgbmV3VQFhdXRob3JpdHkgd2lsbCBzdGFydCB2b3Rpbmcgb24gdG9wIG9mIGBiZXN0X2ZpbmFsaXplZF9ibG9ja19udW1iZXJgIGZvciBuZXcgZmluYWxpemVkTQFibG9ja3MuIGBiZXN0X2ZpbmFsaXplZF9ibG9ja19udW1iZXJgIHNob3VsZCBiZSB0aGUgaGlnaGVzdCBvZiB0aGUgbGF0ZXN0IGZpbmFsaXplZMRibG9jayBvZiBhbGwgdmFsaWRhdG9ycyBvZiB0aGUgbmV3IGF1dGhvcml0eSBzZXQuAFhPbmx5IGNhbGxhYmxlIGJ5IHJvb3QuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLnECCFBzcF9jb25zZW5zdXNfZ3JhbmRwYURFcXVpdm9jYXRpb25Qcm9vZggESAE0BE4BEAAIARhzZXRfaWQwARRTZXRJZAABMGVxdWl2b2NhdGlvbnUCAUhFcXVpdm9jYXRpb248SCwgTj4AAHUCCFBzcF9jb25zZW5zdXNfZ3JhbmRwYTBFcXVpdm9jYXRpb24IBEgBNAROARABCBxQcmV2b3RlBAB5AgGJAWZpbmFsaXR5X2dyYW5kcGE6OkVxdWl2b2NhdGlvbjxBdXRob3JpdHlJZCwgZmluYWxpdHlfZ3JhbmRwYTo6UHJldm90ZTwKSCwgTj4sIEF1dGhvcml0eVNpZ25hdHVyZSw+AAAAJFByZWNvbW1pdAQAjQIBkQFmaW5hbGl0eV9ncmFuZHBhOjpFcXVpdm9jYXRpb248QXV0aG9yaXR5SWQsIGZpbmFsaXR5X2dyYW5kcGE6OlByZWNvbW1pdAo8SCwgTj4sIEF1dGhvcml0eVNpZ25hdHVyZSw+AAEAAHkCCEBmaW5hbGl0eV9ncmFuZHBhMEVxdWl2b2NhdGlvbgwISWQB+ARWAX0CBFMBgQIAEAEwcm91bmRfbnVtYmVyMAEMdTY0AAEgaWRlbnRpdHn4AQhJZAABFGZpcnN0iQIBGChWLCBTKQABGHNlY29uZIkCARgoViwgUykAAH0CCEBmaW5hbGl0eV9ncmFuZHBhHFByZXZvdGUIBEgBNAROARAACAEsdGFyZ2V0X2hhc2g0AQRIAAE0dGFyZ2V0X251bWJlchABBE4AAIECDFBzcF9jb25zZW5zdXNfZ3JhbmRwYQxhcHAkU2lnbmF0dXJlAAAEAIUCAUhlZDI1NTE5OjpTaWduYXR1cmUAAIUCAAADQAAAAAgAiQIAAAQIfQKBAgCNAghAZmluYWxpdHlfZ3JhbmRwYTBFcXVpdm9jYXRpb24MCElkAfgEVgGRAgRTAYECABABMHJvdW5kX251bWJlcjABDHU2NAABIGlkZW50aXR5+AEISWQAARRmaXJzdJUCARgoViwgUykAARhzZWNvbmSVAgEYKFYsIFMpAACRAghAZmluYWxpdHlfZ3JhbmRwYSRQcmVjb21taXQIBEgBNAROARAACAEsdGFyZ2V0X2hhc2g0AQRIAAE0dGFyZ2V0X251bWJlchABBE4AAJUCAAAECJECgQIAmQIMOHBhbGxldF91dGlsaXR5GHBhbGxldBBDYWxsBARUAAEgFGJhdGNoBAEUY2FsbHOdAgF8VmVjPDxUIGFzIENvbmZpZz46OlJ1bnRpbWVDYWxsPgAASHxTZW5kIGEgYmF0Y2ggb2YgZGlzcGF0Y2ggY2FsbHMuALBNYXkgYmUgY2FsbGVkIGZyb20gYW55IG9yaWdpbiBleGNlcHQgYE5vbmVgLgBdAS0gYGNhbGxzYDogVGhlIGNhbGxzIHRvIGJlIGRpc3BhdGNoZWQgZnJvbSB0aGUgc2FtZSBvcmlnaW4uIFRoZSBudW1iZXIgb2YgY2FsbCBtdXN0IG5vdDkBICBleGNlZWQgdGhlIGNvbnN0YW50OiBgYmF0Y2hlZF9jYWxsc19saW1pdGAgKGF2YWlsYWJsZSBpbiBjb25zdGFudCBtZXRhZGF0YSkuAFUBSWYgb3JpZ2luIGlzIHJvb3QgdGhlbiB0aGUgY2FsbHMgYXJlIGRpc3BhdGNoZWQgd2l0aG91dCBjaGVja2luZyBvcmlnaW4gZmlsdGVyLiAoVGhpc+xpbmNsdWRlcyBieXBhc3NpbmcgYGZyYW1lX3N5c3RlbTo6Q29uZmlnOjpCYXNlQ2FsbEZpbHRlcmApLgA0IyMgQ29tcGxleGl0edAtIE8oQykgd2hlcmUgQyBpcyB0aGUgbnVtYmVyIG9mIGNhbGxzIHRvIGJlIGJhdGNoZWQuAFUBVGhpcyB3aWxsIHJldHVybiBgT2tgIGluIGFsbCBjaXJjdW1zdGFuY2VzLiBUbyBkZXRlcm1pbmUgdGhlIHN1Y2Nlc3Mgb2YgdGhlIGJhdGNoLCBhbjEBZXZlbnQgaXMgZGVwb3NpdGVkLiBJZiBhIGNhbGwgZmFpbGVkIGFuZCB0aGUgYmF0Y2ggd2FzIGludGVycnVwdGVkLCB0aGVuIHRoZVUBYEJhdGNoSW50ZXJydXB0ZWRgIGV2ZW50IGlzIGRlcG9zaXRlZCwgYWxvbmcgd2l0aCB0aGUgbnVtYmVyIG9mIHN1Y2Nlc3NmdWwgY2FsbHMgbWFkZU0BYW5kIHRoZSBlcnJvciBvZiB0aGUgZmFpbGVkIGNhbGwuIElmIGFsbCB3ZXJlIHN1Y2Nlc3NmdWwsIHRoZW4gdGhlIGBCYXRjaENvbXBsZXRlZGBMZXZlbnQgaXMgZGVwb3NpdGVkLjRhc19kZXJpdmF0aXZlCAEUaW5kZXhBAQEMdTE2AAEQY2FsbKkBAXxCb3g8PFQgYXMgQ29uZmlnPjo6UnVudGltZUNhbGw+AAE03FNlbmQgYSBjYWxsIHRocm91Z2ggYW4gaW5kZXhlZCBwc2V1ZG9ueW0gb2YgdGhlIHNlbmRlci4AVQFGaWx0ZXIgZnJvbSBvcmlnaW4gYXJlIHBhc3NlZCBhbG9uZy4gVGhlIGNhbGwgd2lsbCBiZSBkaXNwYXRjaGVkIHdpdGggYW4gb3JpZ2luIHdoaWNovHVzZSB0aGUgc2FtZSBmaWx0ZXIgYXMgdGhlIG9yaWdpbiBvZiB0aGlzIGNhbGwuAEUBTk9URTogSWYgeW91IG5lZWQgdG8gZW5zdXJlIHRoYXQgYW55IGFjY291bnQtYmFzZWQgZmlsdGVyaW5nIGlzIG5vdCBob25vcmVkIChpLmUuYQFiZWNhdXNlIHlvdSBleHBlY3QgYHByb3h5YCB0byBoYXZlIGJlZW4gdXNlZCBwcmlvciBpbiB0aGUgY2FsbCBzdGFjayBhbmQgeW91IGRvIG5vdCB3YW50UQF0aGUgY2FsbCByZXN0cmljdGlvbnMgdG8gYXBwbHkgdG8gYW55IHN1Yi1hY2NvdW50cyksIHRoZW4gdXNlIGBhc19tdWx0aV90aHJlc2hvbGRfMWB8aW4gdGhlIE11bHRpc2lnIHBhbGxldCBpbnN0ZWFkLgD0Tk9URTogUHJpb3IgdG8gdmVyc2lvbiAqMTIsIHRoaXMgd2FzIGNhbGxlZCBgYXNfbGltaXRlZF9zdWJgLgDMVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uJGJhdGNoX2FsbAQBFGNhbGxznQIBfFZlYzw8VCBhcyBDb25maWc+OjpSdW50aW1lQ2FsbD4AAjTsU2VuZCBhIGJhdGNoIG9mIGRpc3BhdGNoIGNhbGxzIGFuZCBhdG9taWNhbGx5IGV4ZWN1dGUgdGhlbS4hAVRoZSB3aG9sZSB0cmFuc2FjdGlvbiB3aWxsIHJvbGxiYWNrIGFuZCBmYWlsIGlmIGFueSBvZiB0aGUgY2FsbHMgZmFpbGVkLgCwTWF5IGJlIGNhbGxlZCBmcm9tIGFueSBvcmlnaW4gZXhjZXB0IGBOb25lYC4AXQEtIGBjYWxsc2A6IFRoZSBjYWxscyB0byBiZSBkaXNwYXRjaGVkIGZyb20gdGhlIHNhbWUgb3JpZ2luLiBUaGUgbnVtYmVyIG9mIGNhbGwgbXVzdCBub3Q5ASAgZXhjZWVkIHRoZSBjb25zdGFudDogYGJhdGNoZWRfY2FsbHNfbGltaXRgIChhdmFpbGFibGUgaW4gY29uc3RhbnQgbWV0YWRhdGEpLgBVAUlmIG9yaWdpbiBpcyByb290IHRoZW4gdGhlIGNhbGxzIGFyZSBkaXNwYXRjaGVkIHdpdGhvdXQgY2hlY2tpbmcgb3JpZ2luIGZpbHRlci4gKFRoaXPsaW5jbHVkZXMgYnlwYXNzaW5nIGBmcmFtZV9zeXN0ZW06OkNvbmZpZzo6QmFzZUNhbGxGaWx0ZXJgKS4ANCMjIENvbXBsZXhpdHnQLSBPKEMpIHdoZXJlIEMgaXMgdGhlIG51bWJlciBvZiBjYWxscyB0byBiZSBiYXRjaGVkLixkaXNwYXRjaF9hcwgBJGFzX29yaWdpbqECAVRCb3g8VDo6UGFsbGV0c09yaWdpbj4AARBjYWxsqQEBfEJveDw8VCBhcyBDb25maWc+OjpSdW50aW1lQ2FsbD4AAxjIRGlzcGF0Y2hlcyBhIGZ1bmN0aW9uIGNhbGwgd2l0aCBhIHByb3ZpZGVkIG9yaWdpbi4AxFRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9Sb290Xy4ANCMjIENvbXBsZXhpdHkcLSBPKDEpLixmb3JjZV9iYXRjaAQBFGNhbGxznQIBfFZlYzw8VCBhcyBDb25maWc+OjpSdW50aW1lQ2FsbD4ABDR8U2VuZCBhIGJhdGNoIG9mIGRpc3BhdGNoIGNhbGxzLtRVbmxpa2UgYGJhdGNoYCwgaXQgYWxsb3dzIGVycm9ycyBhbmQgd29uJ3QgaW50ZXJydXB0LgCwTWF5IGJlIGNhbGxlZCBmcm9tIGFueSBvcmlnaW4gZXhjZXB0IGBOb25lYC4AXQEtIGBjYWxsc2A6IFRoZSBjYWxscyB0byBiZSBkaXNwYXRjaGVkIGZyb20gdGhlIHNhbWUgb3JpZ2luLiBUaGUgbnVtYmVyIG9mIGNhbGwgbXVzdCBub3Q5ASAgZXhjZWVkIHRoZSBjb25zdGFudDogYGJhdGNoZWRfY2FsbHNfbGltaXRgIChhdmFpbGFibGUgaW4gY29uc3RhbnQgbWV0YWRhdGEpLgBNAUlmIG9yaWdpbiBpcyByb290IHRoZW4gdGhlIGNhbGxzIGFyZSBkaXNwYXRjaCB3aXRob3V0IGNoZWNraW5nIG9yaWdpbiBmaWx0ZXIuIChUaGlz7GluY2x1ZGVzIGJ5cGFzc2luZyBgZnJhbWVfc3lzdGVtOjpDb25maWc6OkJhc2VDYWxsRmlsdGVyYCkuADQjIyBDb21wbGV4aXR50C0gTyhDKSB3aGVyZSBDIGlzIHRoZSBudW1iZXIgb2YgY2FsbHMgdG8gYmUgYmF0Y2hlZC4sd2l0aF93ZWlnaHQIARBjYWxsqQEBfEJveDw8VCBhcyBDb25maWc+OjpSdW50aW1lQ2FsbD4AARh3ZWlnaHQoARhXZWlnaHQABRjERGlzcGF0Y2ggYSBmdW5jdGlvbiBjYWxsIHdpdGggYSBzcGVjaWZpZWQgd2VpZ2h0LgAtAVRoaXMgZnVuY3Rpb24gZG9lcyBub3QgY2hlY2sgdGhlIHdlaWdodCBvZiB0aGUgY2FsbCwgYW5kIGluc3RlYWQgYWxsb3dzIHRoZbhSb290IG9yaWdpbiB0byBzcGVjaWZ5IHRoZSB3ZWlnaHQgb2YgdGhlIGNhbGwuAMRUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfUm9vdF8uHGlmX2Vsc2UIARBtYWluqQEBfEJveDw8VCBhcyBDb25maWc+OjpSdW50aW1lQ2FsbD4AASBmYWxsYmFja6kBAXxCb3g8PFQgYXMgQ29uZmlnPjo6UnVudGltZUNhbGw+AAZcFQFEaXNwYXRjaCBhIGZhbGxiYWNrIGNhbGwgaW4gdGhlIGV2ZW50IHRoZSBtYWluIGNhbGwgZmFpbHMgdG8gZXhlY3V0ZS6wTWF5IGJlIGNhbGxlZCBmcm9tIGFueSBvcmlnaW4gZXhjZXB0IGBOb25lYC4A5FRoaXMgZnVuY3Rpb24gZmlyc3QgYXR0ZW1wdHMgdG8gZGlzcGF0Y2ggdGhlIGBtYWluYCBjYWxsLtRJZiB0aGUgYG1haW5gIGNhbGwgZmFpbHMsIHRoZSBgZmFsbGJhY2tgIGlzIGF0dGVtdGVkLhUBaWYgdGhlIGZhbGxiYWNrIGlzIHN1Y2Nlc3NmdWxseSBkaXNwYXRjaGVkLCB0aGUgd2VpZ2h0cyBvZiBib3RoIGNhbGxzJQFhcmUgYWNjdW11bGF0ZWQgYW5kIGFuIGV2ZW50IGNvbnRhaW5pbmcgdGhlIG1haW4gY2FsbCBlcnJvciBpcyBkZXBvc2l0ZWQuANxJbiB0aGUgZXZlbnQgb2YgYSBmYWxsYmFjayBmYWlsdXJlIHRoZSB3aG9sZSBjYWxsIGZhaWxzaHdpdGggdGhlIHdlaWdodHMgcmV0dXJuZWQuAEEBLSBgbWFpbmA6IFRoZSBtYWluIGNhbGwgdG8gYmUgZGlzcGF0Y2hlZC4gVGhpcyBpcyB0aGUgcHJpbWFyeSBhY3Rpb24gdG8gZXhlY3V0ZS49AS0gYGZhbGxiYWNrYDogVGhlIGZhbGxiYWNrIGNhbGwgdG8gYmUgZGlzcGF0Y2hlZCBpbiBjYXNlIHRoZSBgbWFpbmAgY2FsbCBmYWlscy4ARCMjIERpc3BhdGNoIExvZ2ljQQEtIElmIHRoZSBvcmlnaW4gaXMgYHJvb3RgLCBib3RoIHRoZSBtYWluIGFuZCBmYWxsYmFjayBjYWxscyBhcmUgZXhlY3V0ZWQgd2l0aG91dHggIGFwcGx5aW5nIGFueSBvcmlnaW4gZmlsdGVycy5JAS0gSWYgdGhlIG9yaWdpbiBpcyBub3QgYHJvb3RgLCB0aGUgb3JpZ2luIGZpbHRlciBpcyBhcHBsaWVkIHRvIGJvdGggdGhlIGBtYWluYCBhbmRMICBgZmFsbGJhY2tgIGNhbGxzLgAsIyMgVXNlIENhc2VZAS0gU29tZSB1c2UgY2FzZXMgbWlnaHQgaW52b2x2ZSBzdWJtaXR0aW5nIGEgYGJhdGNoYCB0eXBlIGNhbGwgaW4gZWl0aGVyIG1haW4sIGZhbGxiYWNrKCAgb3IgYm90aC5QZGlzcGF0Y2hfYXNfZmFsbGlibGUIASRhc19vcmlnaW6hAgFUQm94PFQ6OlBhbGxldHNPcmlnaW4+AAEQY2FsbKkBAXxCb3g8PFQgYXMgQ29uZmlnPjo6UnVudGltZUNhbGw+AAcUyERpc3BhdGNoZXMgYSBmdW5jdGlvbiBjYWxsIHdpdGggYSBwcm92aWRlZCBvcmlnaW4uAFEBQWxtb3N0IHRoZSBzYW1lIGFzIFtgUGFsbGV0OjpkaXNwYXRjaF9hc2BdIGJ1dCBmb3J3YXJkcyBhbnkgZXJyb3Igb2YgdGhlIGlubmVyIGNhbGwuAMRUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfUm9vdF8uBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLp0CAAACqQEAoQIIPHdlc3RlbmRfcnVudGltZTBPcmlnaW5DYWxsZXIAARAYc3lzdGVtBAClAgF0ZnJhbWVfc3lzdGVtOjpPcmlnaW48UnVudGltZT4AAAAcT3JpZ2lucwQAqQIBdHBhbGxldF9jdXN0b21fb3JpZ2luczo6T3JpZ2luACMAQFBhcmFjaGFpbnNPcmlnaW4EAK0CAWRwYXJhY2hhaW5zX29yaWdpbjo6T3JpZ2luACkAJFhjbVBhbGxldAQAtQIBSHBhbGxldF94Y206Ok9yaWdpbgBjAAClAgw0ZnJhbWVfc3VwcG9ydCBkaXNwYXRjaCRSYXdPcmlnaW4EJEFjY291bnRJZAEAARAQUm9vdAAAABhTaWduZWQEAAABJEFjY291bnRJZAABABBOb25lAAIAKEF1dGhvcml6ZWQAAwAAqQIUPHdlc3RlbmRfcnVudGltZShnb3Zlcm5hbmNlHG9yaWdpbnNUcGFsbGV0X2N1c3RvbV9vcmlnaW5zGE9yaWdpbgABbDBTdGFraW5nQWRtaW4AAAAkVHJlYXN1cmVyAAEAPEZlbGxvd3NoaXBBZG1pbgACADBHZW5lcmFsQWRtaW4AAwAwQXVjdGlvbkFkbWluAAQAKExlYXNlQWRtaW4ABQBMUmVmZXJlbmR1bUNhbmNlbGxlcgAGAEBSZWZlcmVuZHVtS2lsbGVyAAcALFNtYWxsVGlwcGVyAAgAJEJpZ1RpcHBlcgAJADBTbWFsbFNwZW5kZXIACgA0TWVkaXVtU3BlbmRlcgALAChCaWdTcGVuZGVyAAwARFdoaXRlbGlzdGVkQ2FsbGVyAA0ATEZlbGxvd3NoaXBJbml0aWF0ZXMADgAcRmVsbG93cwAPAERGZWxsb3dzaGlwRXhwZXJ0cwAQAERGZWxsb3dzaGlwTWFzdGVycwARADhGZWxsb3dzaGlwMURhbgASADhGZWxsb3dzaGlwMkRhbgATADhGZWxsb3dzaGlwM0RhbgAUADhGZWxsb3dzaGlwNERhbgAVADhGZWxsb3dzaGlwNURhbgAWADhGZWxsb3dzaGlwNkRhbgAXADhGZWxsb3dzaGlwN0RhbgAYADhGZWxsb3dzaGlwOERhbgAZADhGZWxsb3dzaGlwOURhbgAaAACtAhBscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zGG9yaWdpbhhwYWxsZXQYT3JpZ2luAAEEJFBhcmFjaGFpbgQAsQIBGFBhcmFJZAAAAACxAgx0cG9sa2Fkb3RfcGFyYWNoYWluX3ByaW1pdGl2ZXMocHJpbWl0aXZlcwhJZAAABAAQAQx1MzIAALUCDChwYWxsZXRfeGNtGHBhbGxldBhPcmlnaW4AAQgMWGNtBAC5AgEgTG9jYXRpb24AAAAgUmVzcG9uc2UEALkCASBMb2NhdGlvbgABAAC5AhAsc3RhZ2luZ194Y20IdjUgbG9jYXRpb24gTG9jYXRpb24AAAgBHHBhcmVudHMIAQh1OAABIGludGVyaW9yvQIBJEp1bmN0aW9ucwAAvQIQLHN0YWdpbmdfeGNtCHY1JGp1bmN0aW9ucyRKdW5jdGlvbnMAASQQSGVyZQAAAAhYMQQAwQIBSEFyYzxbSnVuY3Rpb247IDFdPgABAAhYMgQA2QIBSEFyYzxbSnVuY3Rpb247IDJdPgACAAhYMwQA3QIBSEFyYzxbSnVuY3Rpb247IDNdPgADAAhYNAQA4QIBSEFyYzxbSnVuY3Rpb247IDRdPgAEAAhYNQQA5QIBSEFyYzxbSnVuY3Rpb247IDVdPgAFAAhYNgQA6QIBSEFyYzxbSnVuY3Rpb247IDZdPgAGAAhYNwQA7QIBSEFyYzxbSnVuY3Rpb247IDddPgAHAAhYOAQA8QIBSEFyYzxbSnVuY3Rpb247IDhdPgAIAADBAgAAAwEAAADFAgDFAhAsc3RhZ2luZ194Y20IdjUganVuY3Rpb24gSnVuY3Rpb24AASgkUGFyYWNoYWluBADJAQEMdTMyAAAALEFjY291bnRJZDMyCAEcbmV0d29ya8kCAURPcHRpb248TmV0d29ya0lkPgABCGlkBAEgW3U4OyAzMl0AAQA4QWNjb3VudEluZGV4NjQIARxuZXR3b3JryQIBRE9wdGlvbjxOZXR3b3JrSWQ+AAEUaW5kZXgsAQx1NjQAAgAwQWNjb3VudEtleTIwCAEcbmV0d29ya8kCAURPcHRpb248TmV0d29ya0lkPgABDGtlefUBASBbdTg7IDIwXQADADhQYWxsZXRJbnN0YW5jZQQACAEIdTgABAAwR2VuZXJhbEluZGV4BAD9AQEQdTEyOAAFAChHZW5lcmFsS2V5CAEYbGVuZ3RoCAEIdTgAARBkYXRhBAEgW3U4OyAzMl0ABgAkT25seUNoaWxkAAcAJFBsdXJhbGl0eQgBCGlk0QIBGEJvZHlJZAABEHBhcnTVAgEgQm9keVBhcnQACAA8R2xvYmFsQ29uc2Vuc3VzBADNAgEkTmV0d29ya0lkAAkAAMkCBBhPcHRpb24EBFQBzQIBCBBOb25lAAAAEFNvbWUEAM0CAAABAADNAhAsc3RhZ2luZ194Y20IdjUganVuY3Rpb24kTmV0d29ya0lkAAEgJEJ5R2VuZXNpcwQABAEgW3U4OyAzMl0AAAAYQnlGb3JrCAEwYmxvY2tfbnVtYmVyMAEMdTY0AAEoYmxvY2tfaGFzaAQBIFt1ODsgMzJdAAEAIFBvbGthZG90AAIAGEt1c2FtYQADACBFdGhlcmV1bQQBIGNoYWluX2lkLAEMdTY0AAcALEJpdGNvaW5Db3JlAAgALEJpdGNvaW5DYXNoAAkAQFBvbGthZG90QnVsbGV0aW4ACgAA0QIQDHhjbQh2MyBqdW5jdGlvbhhCb2R5SWQAASgQVW5pdAAAABxNb25pa2VyBABIARxbdTg7IDRdAAEAFEluZGV4BADJAQEMdTMyAAIAJEV4ZWN1dGl2ZQADACRUZWNobmljYWwABAAsTGVnaXNsYXRpdmUABQAgSnVkaWNpYWwABgAcRGVmZW5zZQAHADhBZG1pbmlzdHJhdGlvbgAIACBUcmVhc3VyeQAJAADVAhAMeGNtCHYzIGp1bmN0aW9uIEJvZHlQYXJ0AAEUFFZvaWNlAAAAHE1lbWJlcnMEARRjb3VudMkBAQx1MzIAAQAgRnJhY3Rpb24IAQxub23JAQEMdTMyAAEUZGVub23JAQEMdTMyAAIAREF0TGVhc3RQcm9wb3J0aW9uCAEMbm9tyQEBDHUzMgABFGRlbm9tyQEBDHUzMgADAEhNb3JlVGhhblByb3BvcnRpb24IAQxub23JAQEMdTMyAAEUZGVub23JAQEMdTMyAAQAANkCAAADAgAAAMUCAN0CAAADAwAAAMUCAOECAAADBAAAAMUCAOUCAAADBQAAAMUCAOkCAAADBgAAAMUCAO0CAAADBwAAAMUCAPECAAADCAAAAMUCAPUCDDxwYWxsZXRfaWRlbnRpdHkYcGFsbGV0EENhbGwEBFQAAWA0YWRkX3JlZ2lzdHJhcgQBHGFjY291bnTtAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AABx4QWRkIGEgcmVnaXN0cmFyIHRvIHRoZSBzeXN0ZW0uAPxUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBgVDo6UmVnaXN0cmFyT3JpZ2luYC4AqC0gYGFjY291bnRgOiB0aGUgYWNjb3VudCBvZiB0aGUgcmVnaXN0cmFyLgCURW1pdHMgYFJlZ2lzdHJhckFkZGVkYCBpZiBzdWNjZXNzZnVsLjBzZXRfaWRlbnRpdHkEARBpbmZv+QIBbEJveDxUOjpJZGVudGl0eUluZm9ybWF0aW9uPgABKCkBU2V0IGFuIGFjY291bnQncyBpZGVudGl0eSBpbmZvcm1hdGlvbiBhbmQgcmVzZXJ2ZSB0aGUgYXBwcm9wcmlhdGUgZGVwb3NpdC4AVQFJZiB0aGUgYWNjb3VudCBhbHJlYWR5IGhhcyBpZGVudGl0eSBpbmZvcm1hdGlvbiwgdGhlIGRlcG9zaXQgaXMgdGFrZW4gYXMgcGFydCBwYXltZW50UGZvciB0aGUgbmV3IGRlcG9zaXQuAMxUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXy4AjC0gYGluZm9gOiBUaGUgaWRlbnRpdHkgaW5mb3JtYXRpb24uAIhFbWl0cyBgSWRlbnRpdHlTZXRgIGlmIHN1Y2Nlc3NmdWwuIHNldF9zdWJzBAEQc3Vic4UDAWRWZWM8KFQ6OkFjY291bnRJZCwgRGF0YSk+AAIkjFNldCB0aGUgc3ViLWFjY291bnRzIG9mIHRoZSBzZW5kZXIuAFUBUGF5bWVudDogQW55IGFnZ3JlZ2F0ZSBiYWxhbmNlIHJlc2VydmVkIGJ5IHByZXZpb3VzIGBzZXRfc3Vic2AgY2FsbHMgd2lsbCBiZSByZXR1cm5lZC0BYW5kIGFuIGFtb3VudCBgU3ViQWNjb3VudERlcG9zaXRgIHdpbGwgYmUgcmVzZXJ2ZWQgZm9yIGVhY2ggaXRlbSBpbiBgc3Vic2AuAGEBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8gYW5kIHRoZSBzZW5kZXIgbXVzdCBoYXZlIGEgcmVnaXN0ZXJlZCRpZGVudGl0eS4AsC0gYHN1YnNgOiBUaGUgaWRlbnRpdHkncyAobmV3KSBzdWItYWNjb3VudHMuOGNsZWFyX2lkZW50aXR5AAMgOQFDbGVhciBhbiBhY2NvdW50J3MgaWRlbnRpdHkgaW5mbyBhbmQgYWxsIHN1Yi1hY2NvdW50cyBhbmQgcmV0dXJuIGFsbCBkZXBvc2l0cy4A7FBheW1lbnQ6IEFsbCByZXNlcnZlZCBiYWxhbmNlcyBvbiB0aGUgYWNjb3VudCBhcmUgcmV0dXJuZWQuAGEBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8gYW5kIHRoZSBzZW5kZXIgbXVzdCBoYXZlIGEgcmVnaXN0ZXJlZCRpZGVudGl0eS4AmEVtaXRzIGBJZGVudGl0eUNsZWFyZWRgIGlmIHN1Y2Nlc3NmdWwuRHJlcXVlc3RfanVkZ2VtZW50CAEkcmVnX2luZGV4yQEBOFJlZ2lzdHJhckluZGV4AAEcbWF4X2ZlZf0BATBCYWxhbmNlT2Y8VD4ABECUUmVxdWVzdCBhIGp1ZGdlbWVudCBmcm9tIGEgcmVnaXN0cmFyLgBVAVBheW1lbnQ6IEF0IG1vc3QgYG1heF9mZWVgIHdpbGwgYmUgcmVzZXJ2ZWQgZm9yIHBheW1lbnQgdG8gdGhlIHJlZ2lzdHJhciBpZiBqdWRnZW1lbnQYZ2l2ZW4uADUBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8gYW5kIHRoZSBzZW5kZXIgbXVzdCBoYXZlIGFQcmVnaXN0ZXJlZCBpZGVudGl0eS4AHQEtIGByZWdfaW5kZXhgOiBUaGUgaW5kZXggb2YgdGhlIHJlZ2lzdHJhciB3aG9zZSBqdWRnZW1lbnQgaXMgcmVxdWVzdGVkLlUBLSBgbWF4X2ZlZWA6IFRoZSBtYXhpbXVtIGZlZSB0aGF0IG1heSBiZSBwYWlkLiBUaGlzIHNob3VsZCBqdXN0IGJlIGF1dG8tcG9wdWxhdGVkIGFzOgAwYGBgbm9jb21waWxlyFJlZ2lzdHJhcnM6OjxUPjo6Z2V0KCkuZ2V0KHJlZ19pbmRleCkudW53cmFwKCkuZmVlDGBgYACkRW1pdHMgYEp1ZGdlbWVudFJlcXVlc3RlZGAgaWYgc3VjY2Vzc2Z1bC44Y2FuY2VsX3JlcXVlc3QEASRyZWdfaW5kZXgQAThSZWdpc3RyYXJJbmRleAAFKGhDYW5jZWwgYSBwcmV2aW91cyByZXF1ZXN0LgD4UGF5bWVudDogQSBwcmV2aW91c2x5IHJlc2VydmVkIGRlcG9zaXQgaXMgcmV0dXJuZWQgb24gc3VjY2Vzcy4ANQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXyBhbmQgdGhlIHNlbmRlciBtdXN0IGhhdmUgYVByZWdpc3RlcmVkIGlkZW50aXR5LgBFAS0gYHJlZ19pbmRleGA6IFRoZSBpbmRleCBvZiB0aGUgcmVnaXN0cmFyIHdob3NlIGp1ZGdlbWVudCBpcyBubyBsb25nZXIgcmVxdWVzdGVkLgCsRW1pdHMgYEp1ZGdlbWVudFVucmVxdWVzdGVkYCBpZiBzdWNjZXNzZnVsLhxzZXRfZmVlCAEUaW5kZXjJAQE4UmVnaXN0cmFySW5kZXgAAQxmZWX9AQEwQmFsYW5jZU9mPFQ+AAYcGQFTZXQgdGhlIGZlZSByZXF1aXJlZCBmb3IgYSBqdWRnZW1lbnQgdG8gYmUgcmVxdWVzdGVkIGZyb20gYSByZWdpc3RyYXIuAFUBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8gYW5kIHRoZSBzZW5kZXIgbXVzdCBiZSB0aGUgYWNjb3VudKBvZiB0aGUgcmVnaXN0cmFyIHdob3NlIGluZGV4IGlzIGBpbmRleGAuAPQtIGBpbmRleGA6IHRoZSBpbmRleCBvZiB0aGUgcmVnaXN0cmFyIHdob3NlIGZlZSBpcyB0byBiZSBzZXQuVC0gYGZlZWA6IHRoZSBuZXcgZmVlLjhzZXRfYWNjb3VudF9pZAgBFGluZGV4yQEBOFJlZ2lzdHJhckluZGV4AAEMbmV37QEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAccvENoYW5nZSB0aGUgYWNjb3VudCBhc3NvY2lhdGVkIHdpdGggYSByZWdpc3RyYXIuAFUBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8gYW5kIHRoZSBzZW5kZXIgbXVzdCBiZSB0aGUgYWNjb3VudKBvZiB0aGUgcmVnaXN0cmFyIHdob3NlIGluZGV4IGlzIGBpbmRleGAuAPQtIGBpbmRleGA6IHRoZSBpbmRleCBvZiB0aGUgcmVnaXN0cmFyIHdob3NlIGZlZSBpcyB0byBiZSBzZXQucC0gYG5ld2A6IHRoZSBuZXcgYWNjb3VudCBJRC4oc2V0X2ZpZWxkcwgBFGluZGV4yQEBOFJlZ2lzdHJhckluZGV4AAEYZmllbGRzMAEpATxUOjpJZGVudGl0eUluZm9ybWF0aW9uIGFzIElkZW50aXR5SW5mb3JtYXRpb25Qcm92aWRlcj46OgpGaWVsZHNJZGVudGlmaWVyAAgcqFNldCB0aGUgZmllbGQgaW5mb3JtYXRpb24gZm9yIGEgcmVnaXN0cmFyLgBVAVRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfIGFuZCB0aGUgc2VuZGVyIG11c3QgYmUgdGhlIGFjY291bnSgb2YgdGhlIHJlZ2lzdHJhciB3aG9zZSBpbmRleCBpcyBgaW5kZXhgLgD0LSBgaW5kZXhgOiB0aGUgaW5kZXggb2YgdGhlIHJlZ2lzdHJhciB3aG9zZSBmZWUgaXMgdG8gYmUgc2V0Lg0BLSBgZmllbGRzYDogdGhlIGZpZWxkcyB0aGF0IHRoZSByZWdpc3RyYXIgY29uY2VybnMgdGhlbXNlbHZlcyB3aXRoLkRwcm92aWRlX2p1ZGdlbWVudBABJHJlZ19pbmRleMkBAThSZWdpc3RyYXJJbmRleAABGHRhcmdldO0BAVBBY2NvdW50SWRMb29rdXBPZjxUPgABJGp1ZGdlbWVudI0DAVxKdWRnZW1lbnQ8QmFsYW5jZU9mPFQ+PgABIGlkZW50aXR5NAEcVDo6SGFzaAAJPLhQcm92aWRlIGEganVkZ2VtZW50IGZvciBhbiBhY2NvdW50J3MgaWRlbnRpdHkuAFUBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8gYW5kIHRoZSBzZW5kZXIgbXVzdCBiZSB0aGUgYWNjb3VudLBvZiB0aGUgcmVnaXN0cmFyIHdob3NlIGluZGV4IGlzIGByZWdfaW5kZXhgLgAhAS0gYHJlZ19pbmRleGA6IHRoZSBpbmRleCBvZiB0aGUgcmVnaXN0cmFyIHdob3NlIGp1ZGdlbWVudCBpcyBiZWluZyBtYWRlLlUBLSBgdGFyZ2V0YDogdGhlIGFjY291bnQgd2hvc2UgaWRlbnRpdHkgdGhlIGp1ZGdlbWVudCBpcyB1cG9uLiBUaGlzIG11c3QgYmUgYW4gYWNjb3VudHQgIHdpdGggYSByZWdpc3RlcmVkIGlkZW50aXR5LkkBLSBganVkZ2VtZW50YDogdGhlIGp1ZGdlbWVudCBvZiB0aGUgcmVnaXN0cmFyIG9mIGluZGV4IGByZWdfaW5kZXhgIGFib3V0IGB0YXJnZXRgLl0BLSBgaWRlbnRpdHlgOiBUaGUgaGFzaCBvZiB0aGUgW2BJZGVudGl0eUluZm9ybWF0aW9uUHJvdmlkZXJgXSBmb3IgdGhhdCB0aGUganVkZ2VtZW50IGlzLCAgcHJvdmlkZWQuALBOb3RlOiBKdWRnZW1lbnRzIGRvIG5vdCBhcHBseSB0byBhIHVzZXJuYW1lLgCURW1pdHMgYEp1ZGdlbWVudEdpdmVuYCBpZiBzdWNjZXNzZnVsLjRraWxsX2lkZW50aXR5BAEYdGFyZ2V07QEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAowQQFSZW1vdmUgYW4gYWNjb3VudCdzIGlkZW50aXR5IGFuZCBzdWItYWNjb3VudCBpbmZvcm1hdGlvbiBhbmQgc2xhc2ggdGhlIGRlcG9zaXRzLgBhAVBheW1lbnQ6IFJlc2VydmVkIGJhbGFuY2VzIGZyb20gYHNldF9zdWJzYCBhbmQgYHNldF9pZGVudGl0eWAgYXJlIHNsYXNoZWQgYW5kIGhhbmRsZWQgYnlFAWBTbGFzaGAuIFZlcmlmaWNhdGlvbiByZXF1ZXN0IGRlcG9zaXRzIGFyZSBub3QgcmV0dXJuZWQ7IHRoZXkgc2hvdWxkIGJlIGNhbmNlbGxlZIBtYW51YWxseSB1c2luZyBgY2FuY2VsX3JlcXVlc3RgLgD4VGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgbWF0Y2ggYFQ6OkZvcmNlT3JpZ2luYC4AVQEtIGB0YXJnZXRgOiB0aGUgYWNjb3VudCB3aG9zZSBpZGVudGl0eSB0aGUganVkZ2VtZW50IGlzIHVwb24uIFRoaXMgbXVzdCBiZSBhbiBhY2NvdW50dCAgd2l0aCBhIHJlZ2lzdGVyZWQgaWRlbnRpdHkuAJRFbWl0cyBgSWRlbnRpdHlLaWxsZWRgIGlmIHN1Y2Nlc3NmdWwuHGFkZF9zdWIIAQxzdWLtAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AARBkYXRhBQMBEERhdGEACxysQWRkIHRoZSBnaXZlbiBhY2NvdW50IHRvIHRoZSBzZW5kZXIncyBzdWJzLgBdAVBheW1lbnQ6IEJhbGFuY2UgcmVzZXJ2ZWQgYnkgYSBwcmV2aW91cyBgc2V0X3N1YnNgIGNhbGwgZm9yIG9uZSBzdWIgd2lsbCBiZSByZXBhdHJpYXRlZDh0byB0aGUgc2VuZGVyLgBhAVRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfIGFuZCB0aGUgc2VuZGVyIG11c3QgaGF2ZSBhIHJlZ2lzdGVyZWRYc3ViIGlkZW50aXR5IG9mIGBzdWJgLihyZW5hbWVfc3ViCAEMc3Vi7QEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEQZGF0YQUDARBEYXRhAAwQzEFsdGVyIHRoZSBhc3NvY2lhdGVkIG5hbWUgb2YgdGhlIGdpdmVuIHN1Yi1hY2NvdW50LgBhAVRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfIGFuZCB0aGUgc2VuZGVyIG11c3QgaGF2ZSBhIHJlZ2lzdGVyZWRYc3ViIGlkZW50aXR5IG9mIGBzdWJgLihyZW1vdmVfc3ViBAEMc3Vi7QEBUEFjY291bnRJZExvb2t1cE9mPFQ+AA0cwFJlbW92ZSB0aGUgZ2l2ZW4gYWNjb3VudCBmcm9tIHRoZSBzZW5kZXIncyBzdWJzLgBdAVBheW1lbnQ6IEJhbGFuY2UgcmVzZXJ2ZWQgYnkgYSBwcmV2aW91cyBgc2V0X3N1YnNgIGNhbGwgZm9yIG9uZSBzdWIgd2lsbCBiZSByZXBhdHJpYXRlZDh0byB0aGUgc2VuZGVyLgBhAVRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfIGFuZCB0aGUgc2VuZGVyIG11c3QgaGF2ZSBhIHJlZ2lzdGVyZWRYc3ViIGlkZW50aXR5IG9mIGBzdWJgLiBxdWl0X3N1YgAOKIxSZW1vdmUgdGhlIHNlbmRlciBhcyBhIHN1Yi1hY2NvdW50LgBdAVBheW1lbnQ6IEJhbGFuY2UgcmVzZXJ2ZWQgYnkgYSBwcmV2aW91cyBgc2V0X3N1YnNgIGNhbGwgZm9yIG9uZSBzdWIgd2lsbCBiZSByZXBhdHJpYXRlZLR0byB0aGUgc2VuZGVyICgqbm90KiB0aGUgb3JpZ2luYWwgZGVwb3NpdG9yKS4AYQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXyBhbmQgdGhlIHNlbmRlciBtdXN0IGhhdmUgYSByZWdpc3RlcmVkPHN1cGVyLWlkZW50aXR5LgBFAU5PVEU6IFRoaXMgc2hvdWxkIG5vdCBub3JtYWxseSBiZSB1c2VkLCBidXQgaXMgcHJvdmlkZWQgaW4gdGhlIGNhc2UgdGhhdCB0aGUgbm9uLREBY29udHJvbGxlciBvZiBhbiBhY2NvdW50IGlzIG1hbGljaW91c2x5IHJlZ2lzdGVyZWQgYXMgYSBzdWItYWNjb3VudC5YYWRkX3VzZXJuYW1lX2F1dGhvcml0eQwBJGF1dGhvcml0ee0BAVBBY2NvdW50SWRMb29rdXBPZjxUPgABGHN1ZmZpeDgBHFZlYzx1OD4AAShhbGxvY2F0aW9uEAEMdTMyAA8UVQFBZGQgYW4gYEFjY291bnRJZGAgd2l0aCBwZXJtaXNzaW9uIHRvIGdyYW50IHVzZXJuYW1lcyB3aXRoIGEgZ2l2ZW4gYHN1ZmZpeGAgYXBwZW5kZWQuAEUBVGhlIGF1dGhvcml0eSBjYW4gZ3JhbnQgdXAgdG8gYGFsbG9jYXRpb25gIHVzZXJuYW1lcy4gVG8gdG9wIHVwIHRoZSBhbGxvY2F0aW9uIG9ySQFjaGFuZ2UgdGhlIGFjY291bnQgdXNlZCB0byBncmFudCB1c2VybmFtZXMsIHRoaXMgY2FsbCBjYW4gYmUgdXNlZCB3aXRoIHRoZSB1cGRhdGVkzHBhcmFtZXRlcnMgdG8gb3ZlcndyaXRlIHRoZSBleGlzdGluZyBjb25maWd1cmF0aW9uLmRyZW1vdmVfdXNlcm5hbWVfYXV0aG9yaXR5CAEYc3VmZml4OAEcVmVjPHU4PgABJGF1dGhvcml0ee0BAVBBY2NvdW50SWRMb29rdXBPZjxUPgAQBMRSZW1vdmUgYGF1dGhvcml0eWAgZnJvbSB0aGUgdXNlcm5hbWUgYXV0aG9yaXRpZXMuQHNldF91c2VybmFtZV9mb3IQAQx3aG/tAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AASB1c2VybmFtZTgBHFZlYzx1OD4AASRzaWduYXR1cmWRAwFwT3B0aW9uPFQ6Ok9mZmNoYWluU2lnbmF0dXJlPgABOHVzZV9hbGxvY2F0aW9uIAEQYm9vbAARNA0BU2V0IHRoZSB1c2VybmFtZSBmb3IgYHdob2AuIE11c3QgYmUgY2FsbGVkIGJ5IGEgdXNlcm5hbWUgYXV0aG9yaXR5LgBZAUlmIGB1c2VfYWxsb2NhdGlvbmAgaXMgc2V0LCB0aGUgYXV0aG9yaXR5IG11c3QgaGF2ZSBhIHVzZXJuYW1lIGFsbG9jYXRpb24gYXZhaWxhYmxlIHRvRQFzcGVuZC4gT3RoZXJ3aXNlLCB0aGUgYXV0aG9yaXR5IHdpbGwgbmVlZCB0byBwdXQgdXAgYSBkZXBvc2l0IGZvciByZWdpc3RlcmluZyB0aGUkdXNlcm5hbWUuALBVc2VycyBjYW4gZWl0aGVyIHByZS1zaWduIHRoZWlyIHVzZXJuYW1lcyBvckhhY2NlcHQgdGhlbSBsYXRlci4APFVzZXJuYW1lcyBtdXN0OtggIC0gT25seSBjb250YWluIGxvd2VyY2FzZSBBU0NJSSBjaGFyYWN0ZXJzIG9yIGRpZ2l0cy41ASAgLSBXaGVuIGNvbWJpbmVkIHdpdGggdGhlIHN1ZmZpeCBvZiB0aGUgaXNzdWluZyBhdXRob3JpdHkgYmUgX2xlc3MgdGhhbl8gdGhlYCAgICBgTWF4VXNlcm5hbWVMZW5ndGhgLjxhY2NlcHRfdXNlcm5hbWUEASB1c2VybmFtZQ0BASxVc2VybmFtZTxUPgASCE0BQWNjZXB0IGEgZ2l2ZW4gdXNlcm5hbWUgdGhhdCBhbiBgYXV0aG9yaXR5YCBncmFudGVkLiBUaGUgY2FsbCBtdXN0IGluY2x1ZGUgdGhlIGZ1bGyIdXNlcm5hbWUsIGFzIGluIGB1c2VybmFtZS5zdWZmaXhgLlxyZW1vdmVfZXhwaXJlZF9hcHByb3ZhbAQBIHVzZXJuYW1lDQEBLFVzZXJuYW1lPFQ+ABMMYQFSZW1vdmUgYW4gZXhwaXJlZCB1c2VybmFtZSBhcHByb3ZhbC4gVGhlIHVzZXJuYW1lIHdhcyBhcHByb3ZlZCBieSBhbiBhdXRob3JpdHkgYnV0IG5ldmVyVQFhY2NlcHRlZCBieSB0aGUgdXNlciBhbmQgbXVzdCBub3cgYmUgYmV5b25kIGl0cyBleHBpcmF0aW9uLiBUaGUgY2FsbCBtdXN0IGluY2x1ZGUgdGhlnGZ1bGwgdXNlcm5hbWUsIGFzIGluIGB1c2VybmFtZS5zdWZmaXhgLlBzZXRfcHJpbWFyeV91c2VybmFtZQQBIHVzZXJuYW1lDQEBLFVzZXJuYW1lPFQ+ABQEMQFTZXQgYSBnaXZlbiB1c2VybmFtZSBhcyB0aGUgcHJpbWFyeS4gVGhlIHVzZXJuYW1lIHNob3VsZCBpbmNsdWRlIHRoZSBzdWZmaXguPHVuYmluZF91c2VybmFtZQQBIHVzZXJuYW1lDQEBLFVzZXJuYW1lPFQ+ABUMWQFTdGFydCB0aGUgcHJvY2VzcyBvZiByZW1vdmluZyBhIHVzZXJuYW1lIGJ5IHBsYWNpbmcgaXQgaW4gdGhlIHVuYmluZGluZyB1c2VybmFtZXMgbWFwLiEBT25jZSB0aGUgZ3JhY2UgcGVyaW9kIGhhcyBwYXNzZWQsIHRoZSB1c2VybmFtZSBjYW4gYmUgZGVsZXRlZCBieSBjYWxsaW5nwFtyZW1vdmVfdXNlcm5hbWVdKGNyYXRlOjpDYWxsOjpyZW1vdmVfdXNlcm5hbWUpLjxyZW1vdmVfdXNlcm5hbWUEASB1c2VybmFtZQ0BASxVc2VybmFtZTxUPgAWCGEBUGVybWFuZW50bHkgZGVsZXRlIGEgdXNlcm5hbWUgd2hpY2ggaGFzIGJlZW4gdW5iaW5kaW5nIGZvciBsb25nZXIgdGhhbiB0aGUgZ3JhY2UgcGVyaW9kLkkBQ2FsbGVyIGlzIHJlZnVuZGVkIHRoZSBmZWUgaWYgdGhlIHVzZXJuYW1lIGV4cGlyZWQgYW5kIHRoZSByZW1vdmFsIHdhcyBzdWNjZXNzZnVsLjRraWxsX3VzZXJuYW1lBAEgdXNlcm5hbWUNAQEsVXNlcm5hbWU8VD4AFwhdAUNhbGwgd2l0aCBbRm9yY2VPcmlnaW5dKGNyYXRlOjpDb25maWc6OkZvcmNlT3JpZ2luKSBwcml2aWxlZ2VzIHdoaWNoIGRlbGV0ZXMgYSB1c2VybmFtZaxhbmQgc2xhc2hlcyBhbnkgZGVwb3NpdCBhc3NvY2lhdGVkIHdpdGggaXQuBHBJZGVudGl0eSBwYWxsZXQgZGVjbGFyYXRpb24u+QIMPHBhbGxldF9pZGVudGl0eRhsZWdhY3kwSWRlbnRpdHlJbmZvBChGaWVsZExpbWl0AAAkAShhZGRpdGlvbmFs/QIBkEJvdW5kZWRWZWM8KERhdGEsIERhdGEpLCBGaWVsZExpbWl0PgABHGRpc3BsYXkFAwEQRGF0YQABFGxlZ2FsBQMBEERhdGEAAQx3ZWIFAwEQRGF0YQABEHJpb3QFAwEQRGF0YQABFGVtYWlsBQMBEERhdGEAATxwZ3BfZmluZ2VycHJpbnSBAwFAT3B0aW9uPFt1ODsgMjBdPgABFGltYWdlBQMBEERhdGEAARx0d2l0dGVyBQMBEERhdGEAAP0CDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBAQMEUwAABAB9AwEYVmVjPFQ+AAABAwAABAgFAwUDAAUDDDxwYWxsZXRfaWRlbnRpdHkUdHlwZXMQRGF0YQABmBBOb25lAAAAEFJhdzAEAAkDAAABABBSYXcxBAANAwAAAgAQUmF3MgQAEQMAAAMAEFJhdzMEABUDAAAEABBSYXc0BABIAAAFABBSYXc1BAAZAwAABgAQUmF3NgQAHQMAAAcAEFJhdzcEACEDAAAIABBSYXc4BAAlAwAACQAQUmF3OQQAKQMAAAoAFFJhdzEwBAAtAwAACwAUUmF3MTEEADEDAAAMABRSYXcxMgQANQMAAA0AFFJhdzEzBAA5AwAADgAUUmF3MTQEAD0DAAAPABRSYXcxNQQAQQMAABAAFFJhdzE2BACwAAARABRSYXcxNwQARQMAABIAFFJhdzE4BABJAwAAEwAUUmF3MTkEAE0DAAAUABRSYXcyMAQA9QEAABUAFFJhdzIxBABRAwAAFgAUUmF3MjIEAFUDAAAXABRSYXcyMwQAWQMAABgAFFJhdzI0BABdAwAAGQAUUmF3MjUEAGEDAAAaABRSYXcyNgQAZQMAABsAFFJhdzI3BABpAwAAHAAUUmF3MjgEAG0DAAAdABRSYXcyOQQAcQMAAB4AFFJhdzMwBAB1AwAAHwAUUmF3MzEEAHkDAAAgABRSYXczMgQABAAAIQAsQmxha2VUd28yNTYEAAQAACIAGFNoYTI1NgQABAAAIwAkS2VjY2FrMjU2BAAEAAAkACxTaGFUaHJlZTI1NgQABAAAJQAACQMAAAMAAAAACAANAwAAAwEAAAAIABEDAAADAgAAAAgAFQMAAAMDAAAACAAZAwAAAwUAAAAIAB0DAAADBgAAAAgAIQMAAAMHAAAACAAlAwAAAwgAAAAIACkDAAADCQAAAAgALQMAAAMKAAAACAAxAwAAAwsAAAAIADUDAAADDAAAAAgAOQMAAAMNAAAACAA9AwAAAw4AAAAIAEEDAAADDwAAAAgARQMAAAMRAAAACABJAwAAAxIAAAAIAE0DAAADEwAAAAgAUQMAAAMVAAAACABVAwAAAxYAAAAIAFkDAAADFwAAAAgAXQMAAAMYAAAACABhAwAAAxkAAAAIAGUDAAADGgAAAAgAaQMAAAMbAAAACABtAwAAAxwAAAAIAHEDAAADHQAAAAgAdQMAAAMeAAAACAB5AwAAAx8AAAAIAH0DAAACAQMAgQMEGE9wdGlvbgQEVAH1AQEIEE5vbmUAAAAQU29tZQQA9QEAAAEAAIUDAAACiQMAiQMAAAQIAAUDAI0DDDxwYWxsZXRfaWRlbnRpdHkUdHlwZXMkSnVkZ2VtZW50BBxCYWxhbmNlARgBHBxVbmtub3duAAAAHEZlZVBhaWQEABgBHEJhbGFuY2UAAQAoUmVhc29uYWJsZQACACRLbm93bkdvb2QAAwAkT3V0T2ZEYXRlAAQAKExvd1F1YWxpdHkABQAkRXJyb25lb3VzAAYAAJEDBBhPcHRpb24EBFQBlQMBCBBOb25lAAAAEFNvbWUEAJUDAAABAACVAwgoc3BfcnVudGltZThNdWx0aVNpZ25hdHVyZQABDBxFZDI1NTE5BACFAgFIZWQyNTUxOTo6U2lnbmF0dXJlAAAAHFNyMjU1MTkEAIUCAUhzcjI1NTE5OjpTaWduYXR1cmUAAQAURWNkc2EEAJkDAUBlY2RzYTo6U2lnbmF0dXJlAAIAAJkDAAADQQAAAAgAnQMMPHBhbGxldF9yZWNvdmVyeRhwYWxsZXQQQ2FsbAQEVAABKDBhc19yZWNvdmVyZWQIARxhY2NvdW507QEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEQY2FsbKkBAXxCb3g8PFQgYXMgQ29uZmlnPjo6UnVudGltZUNhbGw+AAAgoFNlbmQgYSBjYWxsIHRocm91Z2ggYSByZWNvdmVyZWQgYWNjb3VudC4AEQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXyBhbmQgcmVnaXN0ZXJlZCB0b+RiZSBhYmxlIHRvIG1ha2UgY2FsbHMgb24gYmVoYWxmIG9mIHRoZSByZWNvdmVyZWQgYWNjb3VudC4ALFBhcmFtZXRlcnM6IQEtIGBhY2NvdW50YDogVGhlIHJlY292ZXJlZCBhY2NvdW50IHlvdSB3YW50IHRvIG1ha2UgYSBjYWxsIG9uLWJlaGFsZi1vZi78LSBgY2FsbGA6IFRoZSBjYWxsIHlvdSB3YW50IHRvIG1ha2Ugd2l0aCB0aGUgcmVjb3ZlcmVkIGFjY291bnQuNHNldF9yZWNvdmVyZWQIARBsb3N07QEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEccmVzY3Vlcu0BAVBBY2NvdW50SWRMb29rdXBPZjxUPgABIA0BQWxsb3cgUk9PVCB0byBieXBhc3MgdGhlIHJlY292ZXJ5IHByb2Nlc3MgYW5kIHNldCBhIHJlc2N1ZXIgYWNjb3VudHBmb3IgYSBsb3N0IGFjY291bnQgZGlyZWN0bHkuAMRUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfUk9PVF8uACxQYXJhbWV0ZXJzOrQtIGBsb3N0YDogVGhlICJsb3N0IGFjY291bnQiIHRvIGJlIHJlY292ZXJlZC4ZAS0gYHJlc2N1ZXJgOiBUaGUgInJlc2N1ZXIgYWNjb3VudCIgd2hpY2ggY2FuIGNhbGwgYXMgdGhlIGxvc3QgYWNjb3VudC48Y3JlYXRlX3JlY292ZXJ5DAEcZnJpZW5kcwECAURWZWM8VDo6QWNjb3VudElkPgABJHRocmVzaG9sZEEBAQx1MTYAATBkZWxheV9wZXJpb2QQAXBCbG9ja051bWJlckZyb21Qcm92aWRlck9mPFQ+AAJAWQFDcmVhdGUgYSByZWNvdmVyeSBjb25maWd1cmF0aW9uIGZvciB5b3VyIGFjY291bnQuIFRoaXMgbWFrZXMgeW91ciBhY2NvdW50IHJlY292ZXJhYmxlLgAtAVBheW1lbnQ6IGBDb25maWdEZXBvc2l0QmFzZWAgKyBgRnJpZW5kRGVwb3NpdEZhY3RvcmAgKiAjX29mX2ZyaWVuZHMgYmFsYW5jZUUBd2lsbCBiZSByZXNlcnZlZCBmb3Igc3RvcmluZyB0aGUgcmVjb3ZlcnkgY29uZmlndXJhdGlvbi4gVGhpcyBkZXBvc2l0IGlzIHJldHVybmVkuGluIGZ1bGwgd2hlbiB0aGUgdXNlciBjYWxscyBgcmVtb3ZlX3JlY292ZXJ5YC4AzFRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfLgAsUGFyYW1ldGVyczpJAS0gYGZyaWVuZHNgOiBBIGxpc3Qgb2YgZnJpZW5kcyB5b3UgdHJ1c3QgdG8gdm91Y2ggZm9yIHJlY292ZXJ5IGF0dGVtcHRzLiBTaG91bGQgYmWoICBvcmRlcmVkIGFuZCBjb250YWluIG5vIGR1cGxpY2F0ZSB2YWx1ZXMuWQEtIGB0aHJlc2hvbGRgOiBUaGUgbnVtYmVyIG9mIGZyaWVuZHMgdGhhdCBtdXN0IHZvdWNoIGZvciBhIHJlY292ZXJ5IGF0dGVtcHQgYmVmb3JlIHRoZVUBICBhY2NvdW50IGNhbiBiZSByZWNvdmVyZWQuIFNob3VsZCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGxlbmd0aCBvZiB0aGUgbGlzdCBvZiggIGZyaWVuZHMuTQEtIGBkZWxheV9wZXJpb2RgOiBUaGUgbnVtYmVyIG9mIGJsb2NrcyBhZnRlciBhIHJlY292ZXJ5IGF0dGVtcHQgaXMgaW5pdGlhbGl6ZWQgdGhhdNAgIG5lZWRzIHRvIHBhc3MgYmVmb3JlIHRoZSBhY2NvdW50IGNhbiBiZSByZWNvdmVyZWQuRGluaXRpYXRlX3JlY292ZXJ5BAEcYWNjb3VudO0BAVBBY2NvdW50SWRMb29rdXBPZjxUPgADLOhJbml0aWF0ZSB0aGUgcHJvY2VzcyBmb3IgcmVjb3ZlcmluZyBhIHJlY292ZXJhYmxlIGFjY291bnQuABkBUGF5bWVudDogYFJlY292ZXJ5RGVwb3NpdGAgYmFsYW5jZSB3aWxsIGJlIHJlc2VydmVkIGZvciBpbml0aWF0aW5nIHRoZSEBcmVjb3ZlcnkgcHJvY2Vzcy4gVGhpcyBkZXBvc2l0IHdpbGwgYWx3YXlzIGJlIHJlcGF0cmlhdGVkIHRvIHRoZSBhY2NvdW50tHRyeWluZyB0byBiZSByZWNvdmVyZWQuIFNlZSBgY2xvc2VfcmVjb3ZlcnlgLgDMVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uACxQYXJhbWV0ZXJzOkEBLSBgYWNjb3VudGA6IFRoZSBsb3N0IGFjY291bnQgdGhhdCB5b3Ugd2FudCB0byByZWNvdmVyLiBUaGlzIGFjY291bnQgbmVlZHMgdG8gYmXMICByZWNvdmVyYWJsZSAoaS5lLiBoYXZlIGEgcmVjb3ZlcnkgY29uZmlndXJhdGlvbikuOHZvdWNoX3JlY292ZXJ5CAEQbG9zdO0BAVBBY2NvdW50SWRMb29rdXBPZjxUPgABHHJlc2N1ZXLtAQFQQWNjb3VudElkTG9va3VwT2Y8VD4ABDAlAUFsbG93IGEgImZyaWVuZCIgb2YgYSByZWNvdmVyYWJsZSBhY2NvdW50IHRvIHZvdWNoIGZvciBhbiBhY3RpdmUgcmVjb3ZlcnlkcHJvY2VzcyBmb3IgdGhhdCBhY2NvdW50LgAlAVRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfIGFuZCBtdXN0IGJlIGEgImZyaWVuZCJwZm9yIHRoZSByZWNvdmVyYWJsZSBhY2NvdW50LgAsUGFyYW1ldGVyczrQLSBgbG9zdGA6IFRoZSBsb3N0IGFjY291bnQgdGhhdCB5b3Ugd2FudCB0byByZWNvdmVyLlkBLSBgcmVzY3VlcmA6IFRoZSBhY2NvdW50IHRyeWluZyB0byByZXNjdWUgdGhlIGxvc3QgYWNjb3VudCB0aGF0IHlvdSB3YW50IHRvIHZvdWNoIGZvci4AIQFUaGUgY29tYmluYXRpb24gb2YgdGhlc2UgdHdvIHBhcmFtZXRlcnMgbXVzdCBwb2ludCB0byBhbiBhY3RpdmUgcmVjb3ZlcnkgcHJvY2Vzcy44Y2xhaW1fcmVjb3ZlcnkEARxhY2NvdW507QEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAUk8EFsbG93IGEgc3VjY2Vzc2Z1bCByZXNjdWVyIHRvIGNsYWltIHRoZWlyIHJlY292ZXJlZCBhY2NvdW50LgApAVRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfIGFuZCBtdXN0IGJlIGEgInJlc2N1ZXIiGQF3aG8gaGFzIHN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQgdGhlIGFjY291bnQgcmVjb3ZlcnkgcHJvY2VzczogY29sbGVjdGVkLQFgdGhyZXNob2xkYCBvciBtb3JlIHZvdWNoZXMsIHdhaXRlZCBgZGVsYXlfcGVyaW9kYCBibG9ja3Mgc2luY2UgaW5pdGlhdGlvbi4ALFBhcmFtZXRlcnM6XQEtIGBhY2NvdW50YDogVGhlIGxvc3QgYWNjb3VudCB0aGF0IHlvdSB3YW50IHRvIGNsYWltIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSByZWNvdmVyZWQgYnkYICB5b3UuOGNsb3NlX3JlY292ZXJ5BAEccmVzY3Vlcu0BAVBBY2NvdW50SWRMb29rdXBPZjxUPgAGLBEBQXMgdGhlIGNvbnRyb2xsZXIgb2YgYSByZWNvdmVyYWJsZSBhY2NvdW50LCBjbG9zZSBhbiBhY3RpdmUgcmVjb3ZlcnlkcHJvY2VzcyBmb3IgeW91ciBhY2NvdW50LgAdAVBheW1lbnQ6IEJ5IGNhbGxpbmcgdGhpcyBmdW5jdGlvbiwgdGhlIHJlY292ZXJhYmxlIGFjY291bnQgd2lsbCByZWNlaXZl9HRoZSByZWNvdmVyeSBkZXBvc2l0IGBSZWNvdmVyeURlcG9zaXRgIHBsYWNlZCBieSB0aGUgcmVzY3Vlci4AAQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXyBhbmQgbXVzdCBiZSBh7HJlY292ZXJhYmxlIGFjY291bnQgd2l0aCBhbiBhY3RpdmUgcmVjb3ZlcnkgcHJvY2VzcyBmb3IgaXQuACxQYXJhbWV0ZXJzOg0BLSBgcmVzY3VlcmA6IFRoZSBhY2NvdW50IHRyeWluZyB0byByZXNjdWUgdGhpcyByZWNvdmVyYWJsZSBhY2NvdW50LjxyZW1vdmVfcmVjb3ZlcnkAByxZAVJlbW92ZSB0aGUgcmVjb3ZlcnkgcHJvY2VzcyBmb3IgeW91ciBhY2NvdW50LiBSZWNvdmVyZWQgYWNjb3VudHMgYXJlIHN0aWxsIGFjY2Vzc2libGUuABEBTk9URTogVGhlIHVzZXIgbXVzdCBtYWtlIHN1cmUgdG8gY2FsbCBgY2xvc2VfcmVjb3ZlcnlgIG9uIGFsbCBhY3RpdmUFAXJlY292ZXJ5IGF0dGVtcHRzIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gZWxzZSBpdCB3aWxsIGZhaWwuACEBUGF5bWVudDogQnkgY2FsbGluZyB0aGlzIGZ1bmN0aW9uIHRoZSByZWNvdmVyYWJsZSBhY2NvdW50IHdpbGwgdW5yZXNlcnZllHRoZWlyIHJlY292ZXJ5IGNvbmZpZ3VyYXRpb24gZGVwb3NpdC7wKGBDb25maWdEZXBvc2l0QmFzZWAgKyBgRnJpZW5kRGVwb3NpdEZhY3RvcmAgKiAjX29mX2ZyaWVuZHMpAAEBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8gYW5kIG11c3QgYmUgYeByZWNvdmVyYWJsZSBhY2NvdW50IChpLmUuIGhhcyBhIHJlY292ZXJ5IGNvbmZpZ3VyYXRpb24pLkBjYW5jZWxfcmVjb3ZlcmVkBAEcYWNjb3VudO0BAVBBY2NvdW50SWRMb29rdXBPZjxUPgAIHNxDYW5jZWwgdGhlIGFiaWxpdHkgdG8gdXNlIGBhc19yZWNvdmVyZWRgIGZvciBgYWNjb3VudGAuABEBVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8gYW5kIHJlZ2lzdGVyZWQgdG/kYmUgYWJsZSB0byBtYWtlIGNhbGxzIG9uIGJlaGFsZiBvZiB0aGUgcmVjb3ZlcmVkIGFjY291bnQuACxQYXJhbWV0ZXJzOhUBLSBgYWNjb3VudGA6IFRoZSByZWNvdmVyZWQgYWNjb3VudCB5b3UgYXJlIGFibGUgdG8gY2FsbCBvbi1iZWhhbGYtb2YuMHBva2VfZGVwb3NpdAQBNG1heWJlX2FjY291bnShAwFwT3B0aW9uPEFjY291bnRJZExvb2t1cE9mPFQ+PgAJXBUBUG9rZSBkZXBvc2l0cyBmb3IgcmVjb3ZlcnkgY29uZmlndXJhdGlvbnMgYW5kIC8gb3IgYWN0aXZlIHJlY292ZXJpZXMuAA0BVGhpcyBjYW4gYmUgdXNlZCBieSBhY2NvdW50cyB0byBwb3NzaWJseSBsb3dlciB0aGVpciBsb2NrZWQgYW1vdW50LgDMVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uACxQYXJhbWV0ZXJzOlUBLSBgbWF5YmVfYWNjb3VudGA6IE9wdGlvbmFsIHJlY292ZXJhYmxlIGFjY291bnQgZm9yIHdoaWNoIHlvdSBoYXZlIGFuIGFjdGl2ZSByZWNvdmVyedxhbmQgd2FudCB0byBhZGp1c3QgdGhlIGRlcG9zaXQgZm9yIHRoZSBhY3RpdmUgcmVjb3ZlcnkuAFUBVGhpcyBmdW5jdGlvbiBjaGVja3MgYm90aCByZWNvdmVyeSBjb25maWd1cmF0aW9uIGRlcG9zaXQgYW5kIGFjdGl2ZSByZWNvdmVyeSBkZXBvc2l0czhvZiB0aGUgY2FsbGVyOlEBLSBJZiB0aGUgY2FsbGVyIGhhcyBjcmVhdGVkIGEgcmVjb3ZlcnkgY29uZmlndXJhdGlvbiwgY2hlY2tzIGFuZCBhZGp1c3RzIGl0cyBkZXBvc2l0QQEtIElmIHRoZSBjYWxsZXIgaGFzIGluaXRpYXRlZCBhbnkgYWN0aXZlIHJlY292ZXJpZXMsIGFuZCBwcm92aWRlcyB0aGUgYWNjb3VudCBpbshgbWF5YmVfYWNjb3VudGAsIGNoZWNrcyBhbmQgYWRqdXN0cyB0aG9zZSBkZXBvc2l0cwBdAUlmIGFueSBkZXBvc2l0IGlzIHVwZGF0ZWQsIHRoZSBkaWZmZXJlbmNlIHdpbGwgYmUgcmVzZXJ2ZWQvdW5yZXNlcnZlZCBmcm9tIHRoZSBjYWxsZXIncyBhY2NvdW50LgApAVRoZSB0cmFuc2FjdGlvbiBpcyBtYWRlIGZyZWUgaWYgYW55IGRlcG9zaXQgaXMgdXBkYXRlZCBhbmQgcGFpZCBvdGhlcndpc2UuALxFbWl0cyBgRGVwb3NpdFBva2VkYCBpZiBhbnkgZGVwb3NpdCBpcyB1cGRhdGVkLikBTXVsdGlwbGUgZXZlbnRzIG1heSBiZSBlbWl0dGVkIGluIGNhc2UgYm90aCB0eXBlcyBvZiBkZXBvc2l0cyBhcmUgdXBkYXRlZC4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMuoQMEGE9wdGlvbgQEVAHtAQEIEE5vbmUAAAAQU29tZQQA7QEAAAEAAKUDDDhwYWxsZXRfdmVzdGluZxhwYWxsZXQQQ2FsbAQEVAABGBB2ZXN0AAAkuFVubG9jayBhbnkgdmVzdGVkIGZ1bmRzIG9mIHRoZSBzZW5kZXIgYWNjb3VudC4AXQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXyBhbmQgdGhlIHNlbmRlciBtdXN0IGhhdmUgZnVuZHMgc3RpbGxkbG9ja2VkIHVuZGVyIHRoaXMgcGFsbGV0LgDQRW1pdHMgZWl0aGVyIGBWZXN0aW5nQ29tcGxldGVkYCBvciBgVmVzdGluZ1VwZGF0ZWRgLgA0IyMgQ29tcGxleGl0eSQtIGBPKDEpYC4odmVzdF9vdGhlcgQBGHRhcmdldO0BAVBBY2NvdW50SWRMb29rdXBPZjxUPgABLLhVbmxvY2sgYW55IHZlc3RlZCBmdW5kcyBvZiBhIGB0YXJnZXRgIGFjY291bnQuAMxUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXy4AUQEtIGB0YXJnZXRgOiBUaGUgYWNjb3VudCB3aG9zZSB2ZXN0ZWQgZnVuZHMgc2hvdWxkIGJlIHVubG9ja2VkLiBNdXN0IGhhdmUgZnVuZHMgc3RpbGxkbG9ja2VkIHVuZGVyIHRoaXMgcGFsbGV0LgDQRW1pdHMgZWl0aGVyIGBWZXN0aW5nQ29tcGxldGVkYCBvciBgVmVzdGluZ1VwZGF0ZWRgLgA0IyMgQ29tcGxleGl0eSQtIGBPKDEpYC48dmVzdGVkX3RyYW5zZmVyCAEYdGFyZ2V07QEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEgc2NoZWR1bGWpAwGwVmVzdGluZ0luZm88QmFsYW5jZU9mPFQ+LCBCbG9ja051bWJlckZvcjxUPj4AAjRkQ3JlYXRlIGEgdmVzdGVkIHRyYW5zZmVyLgDMVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uAMwtIGB0YXJnZXRgOiBUaGUgYWNjb3VudCByZWNlaXZpbmcgdGhlIHZlc3RlZCBmdW5kcy7wLSBgc2NoZWR1bGVgOiBUaGUgdmVzdGluZyBzY2hlZHVsZSBhdHRhY2hlZCB0byB0aGUgdHJhbnNmZXIuAFxFbWl0cyBgVmVzdGluZ0NyZWF0ZWRgLgD8Tk9URTogVGhpcyB3aWxsIHVubG9jayBhbGwgc2NoZWR1bGVzIHRocm91Z2ggdGhlIGN1cnJlbnQgYmxvY2suADQjIyBDb21wbGV4aXR5JC0gYE8oMSlgLlRmb3JjZV92ZXN0ZWRfdHJhbnNmZXIMARhzb3VyY2XtAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AARh0YXJnZXTtAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AASBzY2hlZHVsZakDAbBWZXN0aW5nSW5mbzxCYWxhbmNlT2Y8VD4sIEJsb2NrTnVtYmVyRm9yPFQ+PgADOGBGb3JjZSBhIHZlc3RlZCB0cmFuc2Zlci4AxFRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9Sb290Xy4A6C0gYHNvdXJjZWA6IFRoZSBhY2NvdW50IHdob3NlIGZ1bmRzIHNob3VsZCBiZSB0cmFuc2ZlcnJlZC4RAS0gYHRhcmdldGA6IFRoZSBhY2NvdW50IHRoYXQgc2hvdWxkIGJlIHRyYW5zZmVycmVkIHRoZSB2ZXN0ZWQgZnVuZHMu8C0gYHNjaGVkdWxlYDogVGhlIHZlc3Rpbmcgc2NoZWR1bGUgYXR0YWNoZWQgdG8gdGhlIHRyYW5zZmVyLgBcRW1pdHMgYFZlc3RpbmdDcmVhdGVkYC4A/E5PVEU6IFRoaXMgd2lsbCB1bmxvY2sgYWxsIHNjaGVkdWxlcyB0aHJvdWdoIHRoZSBjdXJyZW50IGJsb2NrLgA0IyMgQ29tcGxleGl0eSQtIGBPKDEpYC48bWVyZ2Vfc2NoZWR1bGVzCAE8c2NoZWR1bGUxX2luZGV4EAEMdTMyAAE8c2NoZWR1bGUyX2luZGV4EAEMdTMyAARUXQFNZXJnZSB0d28gdmVzdGluZyBzY2hlZHVsZXMgdG9nZXRoZXIsIGNyZWF0aW5nIGEgbmV3IHZlc3Rpbmcgc2NoZWR1bGUgdGhhdCB1bmxvY2tzIG92ZXJVAXRoZSBoaWdoZXN0IHBvc3NpYmxlIHN0YXJ0IGFuZCBlbmQgYmxvY2tzLiBJZiBib3RoIHNjaGVkdWxlcyBoYXZlIGFscmVhZHkgc3RhcnRlZCB0aGVZAWN1cnJlbnQgYmxvY2sgd2lsbCBiZSB1c2VkIGFzIHRoZSBzY2hlZHVsZSBzdGFydDsgd2l0aCB0aGUgY2F2ZWF0IHRoYXQgaWYgb25lIHNjaGVkdWxlXQFpcyBmaW5pc2hlZCBieSB0aGUgY3VycmVudCBibG9jaywgdGhlIG90aGVyIHdpbGwgYmUgdHJlYXRlZCBhcyB0aGUgbmV3IG1lcmdlZCBzY2hlZHVsZSwsdW5tb2RpZmllZC4A+E5PVEU6IElmIGBzY2hlZHVsZTFfaW5kZXggPT0gc2NoZWR1bGUyX2luZGV4YCB0aGlzIGlzIGEgbm8tb3AuQQFOT1RFOiBUaGlzIHdpbGwgdW5sb2NrIGFsbCBzY2hlZHVsZXMgdGhyb3VnaCB0aGUgY3VycmVudCBibG9jayBwcmlvciB0byBtZXJnaW5nLmEBTk9URTogSWYgYm90aCBzY2hlZHVsZXMgaGF2ZSBlbmRlZCBieSB0aGUgY3VycmVudCBibG9jaywgbm8gbmV3IHNjaGVkdWxlIHdpbGwgYmUgY3JlYXRlZGRhbmQgYm90aCB3aWxsIGJlIHJlbW92ZWQuAGxNZXJnZWQgc2NoZWR1bGUgYXR0cmlidXRlczo1AS0gYHN0YXJ0aW5nX2Jsb2NrYDogYE1BWChzY2hlZHVsZTEuc3RhcnRpbmdfYmxvY2ssIHNjaGVkdWxlZDIuc3RhcnRpbmdfYmxvY2ssSCAgY3VycmVudF9ibG9jaylgLiEBLSBgZW5kaW5nX2Jsb2NrYDogYE1BWChzY2hlZHVsZTEuZW5kaW5nX2Jsb2NrLCBzY2hlZHVsZTIuZW5kaW5nX2Jsb2NrKWAuWQEtIGBsb2NrZWRgOiBgc2NoZWR1bGUxLmxvY2tlZF9hdChjdXJyZW50X2Jsb2NrKSArIHNjaGVkdWxlMi5sb2NrZWRfYXQoY3VycmVudF9ibG9jaylgLgDMVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uAOgtIGBzY2hlZHVsZTFfaW5kZXhgOiBpbmRleCBvZiB0aGUgZmlyc3Qgc2NoZWR1bGUgdG8gbWVyZ2Uu7C0gYHNjaGVkdWxlMl9pbmRleGA6IGluZGV4IG9mIHRoZSBzZWNvbmQgc2NoZWR1bGUgdG8gbWVyZ2UudGZvcmNlX3JlbW92ZV92ZXN0aW5nX3NjaGVkdWxlCAEYdGFyZ2V07QEBjDxUOjpMb29rdXAgYXMgU3RhdGljTG9va3VwPjo6U291cmNlAAE4c2NoZWR1bGVfaW5kZXgQAQx1MzIABRh8Rm9yY2UgcmVtb3ZlIGEgdmVzdGluZyBzY2hlZHVsZQDEVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1Jvb3RfLgDILSBgdGFyZ2V0YDogQW4gYWNjb3VudCB0aGF0IGhhcyBhIHZlc3Rpbmcgc2NoZWR1bGUVAS0gYHNjaGVkdWxlX2luZGV4YDogVGhlIHZlc3Rpbmcgc2NoZWR1bGUgaW5kZXggdGhhdCBzaG91bGQgYmUgcmVtb3ZlZAQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy6pAww4cGFsbGV0X3Zlc3RpbmcwdmVzdGluZ19pbmZvLFZlc3RpbmdJbmZvCBxCYWxhbmNlARgsQmxvY2tOdW1iZXIBEAAMARhsb2NrZWQYARxCYWxhbmNlAAEkcGVyX2Jsb2NrGAEcQmFsYW5jZQABOHN0YXJ0aW5nX2Jsb2NrEAEsQmxvY2tOdW1iZXIAAK0DDEBwYWxsZXRfc2NoZWR1bGVyGHBhbGxldBBDYWxsBARUAAEoIHNjaGVkdWxlEAEQd2hlbhABREJsb2NrTnVtYmVyRm9yPFQ+AAE4bWF5YmVfcGVyaW9kaWOxAwGsT3B0aW9uPHNjaGVkdWxlOjpQZXJpb2Q8QmxvY2tOdW1iZXJGb3I8VD4+PgABIHByaW9yaXR5CAFIc2NoZWR1bGU6OlByaW9yaXR5AAEQY2FsbKkBAXxCb3g8PFQgYXMgQ29uZmlnPjo6UnVudGltZUNhbGw+AAAEcEFub255bW91c2x5IHNjaGVkdWxlIGEgdGFzay4YY2FuY2VsCAEQd2hlbhABREJsb2NrTnVtYmVyRm9yPFQ+AAEUaW5kZXgQAQx1MzIAAQSUQ2FuY2VsIGFuIGFub255bW91c2x5IHNjaGVkdWxlZCB0YXNrLjhzY2hlZHVsZV9uYW1lZBQBCGlkBAEgVGFza05hbWUAARB3aGVuEAFEQmxvY2tOdW1iZXJGb3I8VD4AAThtYXliZV9wZXJpb2RpY7EDAaxPcHRpb248c2NoZWR1bGU6OlBlcmlvZDxCbG9ja051bWJlckZvcjxUPj4+AAEgcHJpb3JpdHkIAUhzY2hlZHVsZTo6UHJpb3JpdHkAARBjYWxsqQEBfEJveDw8VCBhcyBDb25maWc+OjpSdW50aW1lQ2FsbD4AAgRYU2NoZWR1bGUgYSBuYW1lZCB0YXNrLjBjYW5jZWxfbmFtZWQEAQhpZAQBIFRhc2tOYW1lAAMEeENhbmNlbCBhIG5hbWVkIHNjaGVkdWxlZCB0YXNrLjhzY2hlZHVsZV9hZnRlchABFGFmdGVyEAFEQmxvY2tOdW1iZXJGb3I8VD4AAThtYXliZV9wZXJpb2RpY7EDAaxPcHRpb248c2NoZWR1bGU6OlBlcmlvZDxCbG9ja051bWJlckZvcjxUPj4+AAEgcHJpb3JpdHkIAUhzY2hlZHVsZTo6UHJpb3JpdHkAARBjYWxsqQEBfEJveDw8VCBhcyBDb25maWc+OjpSdW50aW1lQ2FsbD4ABASoQW5vbnltb3VzbHkgc2NoZWR1bGUgYSB0YXNrIGFmdGVyIGEgZGVsYXkuUHNjaGVkdWxlX25hbWVkX2FmdGVyFAEIaWQEASBUYXNrTmFtZQABFGFmdGVyEAFEQmxvY2tOdW1iZXJGb3I8VD4AAThtYXliZV9wZXJpb2RpY7EDAaxPcHRpb248c2NoZWR1bGU6OlBlcmlvZDxCbG9ja051bWJlckZvcjxUPj4+AAEgcHJpb3JpdHkIAUhzY2hlZHVsZTo6UHJpb3JpdHkAARBjYWxsqQEBfEJveDw8VCBhcyBDb25maWc+OjpSdW50aW1lQ2FsbD4ABQSQU2NoZWR1bGUgYSBuYW1lZCB0YXNrIGFmdGVyIGEgZGVsYXkuJHNldF9yZXRyeQwBEHRhc2slAQF4VGFza0FkZHJlc3M8QmxvY2tOdW1iZXJGb3I8VD4+AAEccmV0cmllcwgBCHU4AAEYcGVyaW9kEAFEQmxvY2tOdW1iZXJGb3I8VD4ABjBZAVNldCBhIHJldHJ5IGNvbmZpZ3VyYXRpb24gZm9yIGEgdGFzayBzbyB0aGF0LCBpbiBjYXNlIGl0cyBzY2hlZHVsZWQgcnVuIGZhaWxzLCBpdCB3aWxsVQFiZSByZXRyaWVkIGFmdGVyIGBwZXJpb2RgIGJsb2NrcywgZm9yIGEgdG90YWwgYW1vdW50IG9mIGByZXRyaWVzYCByZXRyaWVzIG9yIHVudGlsIGl0JHN1Y2NlZWRzLgBVAVRhc2tzIHdoaWNoIG5lZWQgdG8gYmUgc2NoZWR1bGVkIGZvciBhIHJldHJ5IGFyZSBzdGlsbCBzdWJqZWN0IHRvIHdlaWdodCBtZXRlcmluZyBhbmRRAWFnZW5kYSBzcGFjZSwgc2FtZSBhcyBhIHJlZ3VsYXIgdGFzay4gSWYgYSBwZXJpb2RpYyB0YXNrIGZhaWxzLCBpdCB3aWxsIGJlIHNjaGVkdWxlZJBub3JtYWxseSB3aGlsZSB0aGUgdGFzayBpcyByZXRyeWluZy4AUQFUYXNrcyBzY2hlZHVsZWQgYXMgYSByZXN1bHQgb2YgYSByZXRyeSBmb3IgYSBwZXJpb2RpYyB0YXNrIGFyZSB1bm5hbWVkLCBub24tcGVyaW9kaWM9AWNsb25lcyBvZiB0aGUgb3JpZ2luYWwgdGFzay4gVGhlaXIgcmV0cnkgY29uZmlndXJhdGlvbiB3aWxsIGJlIGRlcml2ZWQgZnJvbSB0aGVNAW9yaWdpbmFsIHRhc2sncyBjb25maWd1cmF0aW9uLCBidXQgd2lsbCBoYXZlIGEgbG93ZXIgdmFsdWUgZm9yIGByZW1haW5pbmdgIHRoYW4gdGhlZG9yaWdpbmFsIGB0b3RhbF9yZXRyaWVzYC48c2V0X3JldHJ5X25hbWVkDAEIaWQEASBUYXNrTmFtZQABHHJldHJpZXMIAQh1OAABGHBlcmlvZBABREJsb2NrTnVtYmVyRm9yPFQ+AAcwXQFTZXQgYSByZXRyeSBjb25maWd1cmF0aW9uIGZvciBhIG5hbWVkIHRhc2sgc28gdGhhdCwgaW4gY2FzZSBpdHMgc2NoZWR1bGVkIHJ1biBmYWlscywgaXRdAXdpbGwgYmUgcmV0cmllZCBhZnRlciBgcGVyaW9kYCBibG9ja3MsIGZvciBhIHRvdGFsIGFtb3VudCBvZiBgcmV0cmllc2AgcmV0cmllcyBvciB1bnRpbDBpdCBzdWNjZWVkcy4AVQFUYXNrcyB3aGljaCBuZWVkIHRvIGJlIHNjaGVkdWxlZCBmb3IgYSByZXRyeSBhcmUgc3RpbGwgc3ViamVjdCB0byB3ZWlnaHQgbWV0ZXJpbmcgYW5kUQFhZ2VuZGEgc3BhY2UsIHNhbWUgYXMgYSByZWd1bGFyIHRhc2suIElmIGEgcGVyaW9kaWMgdGFzayBmYWlscywgaXQgd2lsbCBiZSBzY2hlZHVsZWSQbm9ybWFsbHkgd2hpbGUgdGhlIHRhc2sgaXMgcmV0cnlpbmcuAFEBVGFza3Mgc2NoZWR1bGVkIGFzIGEgcmVzdWx0IG9mIGEgcmV0cnkgZm9yIGEgcGVyaW9kaWMgdGFzayBhcmUgdW5uYW1lZCwgbm9uLXBlcmlvZGljPQFjbG9uZXMgb2YgdGhlIG9yaWdpbmFsIHRhc2suIFRoZWlyIHJldHJ5IGNvbmZpZ3VyYXRpb24gd2lsbCBiZSBkZXJpdmVkIGZyb20gdGhlTQFvcmlnaW5hbCB0YXNrJ3MgY29uZmlndXJhdGlvbiwgYnV0IHdpbGwgaGF2ZSBhIGxvd2VyIHZhbHVlIGZvciBgcmVtYWluaW5nYCB0aGFuIHRoZWRvcmlnaW5hbCBgdG90YWxfcmV0cmllc2AuMGNhbmNlbF9yZXRyeQQBEHRhc2slAQF4VGFza0FkZHJlc3M8QmxvY2tOdW1iZXJGb3I8VD4+AAgEqFJlbW92ZXMgdGhlIHJldHJ5IGNvbmZpZ3VyYXRpb24gb2YgYSB0YXNrLkhjYW5jZWxfcmV0cnlfbmFtZWQEAQhpZAQBIFRhc2tOYW1lAAkEvENhbmNlbCB0aGUgcmV0cnkgY29uZmlndXJhdGlvbiBvZiBhIG5hbWVkIHRhc2suBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLrEDBBhPcHRpb24EBFQBJQEBCBBOb25lAAAAEFNvbWUEACUBAAABAAC1Aww8cGFsbGV0X3ByZWltYWdlGHBhbGxldBBDYWxsBARUAAEUNG5vdGVfcHJlaW1hZ2UEARRieXRlczgBHFZlYzx1OD4AABB0UmVnaXN0ZXIgYSBwcmVpbWFnZSBvbi1jaGFpbi4AVQFJZiB0aGUgcHJlaW1hZ2Ugd2FzIHByZXZpb3VzbHkgcmVxdWVzdGVkLCBubyBmZWVzIG9yIGRlcG9zaXRzIGFyZSB0YWtlbiBmb3IgcHJvdmlkaW5nVQF0aGUgcHJlaW1hZ2UuIE90aGVyd2lzZSwgYSBkZXBvc2l0IGlzIHRha2VuIHByb3BvcnRpb25hbCB0byB0aGUgc2l6ZSBvZiB0aGUgcHJlaW1hZ2UuPHVubm90ZV9wcmVpbWFnZQQBEGhhc2g0ARxUOjpIYXNoAAEY3ENsZWFyIGFuIHVucmVxdWVzdGVkIHByZWltYWdlIGZyb20gdGhlIHJ1bnRpbWUgc3RvcmFnZS4A/ElmIGBsZW5gIGlzIHByb3ZpZGVkLCB0aGVuIGl0IHdpbGwgYmUgYSBtdWNoIGNoZWFwZXIgb3BlcmF0aW9uLgABAS0gYGhhc2hgOiBUaGUgaGFzaCBvZiB0aGUgcHJlaW1hZ2UgdG8gYmUgcmVtb3ZlZCBmcm9tIHRoZSBzdG9yZS64LSBgbGVuYDogVGhlIGxlbmd0aCBvZiB0aGUgcHJlaW1hZ2Ugb2YgYGhhc2hgLkByZXF1ZXN0X3ByZWltYWdlBAEQaGFzaDQBHFQ6Okhhc2gAAhBBAVJlcXVlc3QgYSBwcmVpbWFnZSBiZSB1cGxvYWRlZCB0byB0aGUgY2hhaW4gd2l0aG91dCBwYXlpbmcgYW55IGZlZXMgb3IgZGVwb3NpdHMuAFUBSWYgdGhlIHByZWltYWdlIHJlcXVlc3RzIGhhcyBhbHJlYWR5IGJlZW4gcHJvdmlkZWQgb24tY2hhaW4sIHdlIHVucmVzZXJ2ZSBhbnkgZGVwb3NpdDkBYSB1c2VyIG1heSBoYXZlIHBhaWQsIGFuZCB0YWtlIHRoZSBjb250cm9sIG9mIHRoZSBwcmVpbWFnZSBvdXQgb2YgdGhlaXIgaGFuZHMuSHVucmVxdWVzdF9wcmVpbWFnZQQBEGhhc2g0ARxUOjpIYXNoAAMMvENsZWFyIGEgcHJldmlvdXNseSBtYWRlIHJlcXVlc3QgZm9yIGEgcHJlaW1hZ2UuAC0BTk9URTogVEhJUyBNVVNUIE5PVCBCRSBDQUxMRUQgT04gYGhhc2hgIE1PUkUgVElNRVMgVEhBTiBgcmVxdWVzdF9wcmVpbWFnZWAuOGVuc3VyZV91cGRhdGVkBAEYaGFzaGVzuQMBMFZlYzxUOjpIYXNoPgAEDLxFbnN1cmUgdGhhdCB0aGUgYnVsayBvZiBwcmUtaW1hZ2VzIGlzIHVwZ3JhZGVkLgA9AVRoZSBjYWxsZXIgcGF5cyBubyBmZWUgaWYgYXQgbGVhc3QgOTAlIG9mIHByZS1pbWFnZXMgd2VyZSBzdWNjZXNzZnVsbHkgdXBkYXRlZC4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMuuQMAAAI0AL0DDCxwYWxsZXRfc3VkbxhwYWxsZXQQQ2FsbAQEVAABFBBzdWRvBAEQY2FsbKkBAXxCb3g8PFQgYXMgQ29uZmlnPjo6UnVudGltZUNhbGw+AAAENQFBdXRoZW50aWNhdGVzIHRoZSBzdWRvIGtleSBhbmQgZGlzcGF0Y2hlcyBhIGZ1bmN0aW9uIGNhbGwgd2l0aCBgUm9vdGAgb3JpZ2luLlRzdWRvX3VuY2hlY2tlZF93ZWlnaHQIARBjYWxsqQEBfEJveDw8VCBhcyBDb25maWc+OjpSdW50aW1lQ2FsbD4AARh3ZWlnaHQoARhXZWlnaHQAARQ1AUF1dGhlbnRpY2F0ZXMgdGhlIHN1ZG8ga2V5IGFuZCBkaXNwYXRjaGVzIGEgZnVuY3Rpb24gY2FsbCB3aXRoIGBSb290YCBvcmlnaW4uLQFUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IGNoZWNrIHRoZSB3ZWlnaHQgb2YgdGhlIGNhbGwsIGFuZCBpbnN0ZWFkIGFsbG93cyB0aGWwU3VkbyB1c2VyIHRvIHNwZWNpZnkgdGhlIHdlaWdodCBvZiB0aGUgY2FsbC4AzFRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfLhxzZXRfa2V5BAEMbmV37QEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAIIXQFBdXRoZW50aWNhdGVzIHRoZSBjdXJyZW50IHN1ZG8ga2V5IGFuZCBzZXRzIHRoZSBnaXZlbiBBY2NvdW50SWQgKGBuZXdgKSBhcyB0aGUgbmV3IHN1ZG8Qa2V5LhxzdWRvX2FzCAEMd2hv7QEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEQY2FsbKkBAXxCb3g8PFQgYXMgQ29uZmlnPjo6UnVudGltZUNhbGw+AAMQTQFBdXRoZW50aWNhdGVzIHRoZSBzdWRvIGtleSBhbmQgZGlzcGF0Y2hlcyBhIGZ1bmN0aW9uIGNhbGwgd2l0aCBgU2lnbmVkYCBvcmlnaW4gZnJvbUBhIGdpdmVuIGFjY291bnQuAMxUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXy4ocmVtb3ZlX2tleQAEDIRQZXJtYW5lbnRseSByZW1vdmVzIHRoZSBzdWRvIGtleS4AbCoqVGhpcyBjYW5ub3QgYmUgdW4tZG9uZS4qKgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy7BAwwwcGFsbGV0X3Byb3h5GHBhbGxldBBDYWxsBARUAAEsFHByb3h5DAEQcmVhbO0BAVBBY2NvdW50SWRMb29rdXBPZjxUPgABQGZvcmNlX3Byb3h5X3R5cGXFAwFQT3B0aW9uPFQ6OlByb3h5VHlwZT4AARBjYWxsqQEBfEJveDw8VCBhcyBDb25maWc+OjpSdW50aW1lQ2FsbD4AACRNAURpc3BhdGNoIHRoZSBnaXZlbiBgY2FsbGAgZnJvbSBhbiBhY2NvdW50IHRoYXQgdGhlIHNlbmRlciBpcyBhdXRob3Jpc2VkIGZvciB0aHJvdWdoMGBhZGRfcHJveHlgLgDMVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uACxQYXJhbWV0ZXJzOg0BLSBgcmVhbGA6IFRoZSBhY2NvdW50IHRoYXQgdGhlIHByb3h5IHdpbGwgbWFrZSBhIGNhbGwgb24gYmVoYWxmIG9mLmEBLSBgZm9yY2VfcHJveHlfdHlwZWA6IFNwZWNpZnkgdGhlIGV4YWN0IHByb3h5IHR5cGUgdG8gYmUgdXNlZCBhbmQgY2hlY2tlZCBmb3IgdGhpcyBjYWxsLtAtIGBjYWxsYDogVGhlIGNhbGwgdG8gYmUgbWFkZSBieSB0aGUgYHJlYWxgIGFjY291bnQuJGFkZF9wcm94eQwBIGRlbGVnYXRl7QEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEocHJveHlfdHlwZT0BATBUOjpQcm94eVR5cGUAARRkZWxheRABREJsb2NrTnVtYmVyRm9yPFQ+AAEkRQFSZWdpc3RlciBhIHByb3h5IGFjY291bnQgZm9yIHRoZSBzZW5kZXIgdGhhdCBpcyBhYmxlIHRvIG1ha2UgY2FsbHMgb24gaXRzIGJlaGFsZi4AzFRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfLgAsUGFyYW1ldGVyczoRAS0gYHByb3h5YDogVGhlIGFjY291bnQgdGhhdCB0aGUgYGNhbGxlcmAgd291bGQgbGlrZSB0byBtYWtlIGEgcHJveHku/C0gYHByb3h5X3R5cGVgOiBUaGUgcGVybWlzc2lvbnMgYWxsb3dlZCBmb3IgdGhpcyBwcm94eSBhY2NvdW50Lk0BLSBgZGVsYXlgOiBUaGUgYW5ub3VuY2VtZW50IHBlcmlvZCByZXF1aXJlZCBvZiB0aGUgaW5pdGlhbCBwcm94eS4gV2lsbCBnZW5lcmFsbHkgYmUUemVyby4wcmVtb3ZlX3Byb3h5DAEgZGVsZWdhdGXtAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AAShwcm94eV90eXBlPQEBMFQ6OlByb3h5VHlwZQABFGRlbGF5EAFEQmxvY2tOdW1iZXJGb3I8VD4AAhyoVW5yZWdpc3RlciBhIHByb3h5IGFjY291bnQgZm9yIHRoZSBzZW5kZXIuAMxUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXy4ALFBhcmFtZXRlcnM6JQEtIGBwcm94eWA6IFRoZSBhY2NvdW50IHRoYXQgdGhlIGBjYWxsZXJgIHdvdWxkIGxpa2UgdG8gcmVtb3ZlIGFzIGEgcHJveHkuQQEtIGBwcm94eV90eXBlYDogVGhlIHBlcm1pc3Npb25zIGN1cnJlbnRseSBlbmFibGVkIGZvciB0aGUgcmVtb3ZlZCBwcm94eSBhY2NvdW50LjhyZW1vdmVfcHJveGllcwADGLRVbnJlZ2lzdGVyIGFsbCBwcm94eSBhY2NvdW50cyBmb3IgdGhlIHNlbmRlci4AzFRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfLgBdAVdBUk5JTkc6IFRoaXMgbWF5IGJlIGNhbGxlZCBvbiBhY2NvdW50cyBjcmVhdGVkIGJ5IGBjcmVhdGVfcHVyZWAsIGhvd2V2ZXIgaWYgZG9uZSwgdGhlblkBdGhlIHVucmVzZXJ2ZWQgZmVlcyB3aWxsIGJlIGluYWNjZXNzaWJsZS4gKipBbGwgYWNjZXNzIHRvIHRoaXMgYWNjb3VudCB3aWxsIGJlIGxvc3QuKiosY3JlYXRlX3B1cmUMAShwcm94eV90eXBlPQEBMFQ6OlByb3h5VHlwZQABFGRlbGF5EAFEQmxvY2tOdW1iZXJGb3I8VD4AARRpbmRleEEBAQx1MTYABEg5AVNwYXduIGEgZnJlc2ggbmV3IGFjY291bnQgdGhhdCBpcyBndWFyYW50ZWVkIHRvIGJlIG90aGVyd2lzZSBpbmFjY2Vzc2libGUsIGFuZPxpbml0aWFsaXplIGl0IHdpdGggYSBwcm94eSBvZiBgcHJveHlfdHlwZWAgZm9yIGBvcmlnaW5gIHNlbmRlci4AbFJlcXVpcmVzIGEgYFNpZ25lZGAgb3JpZ2luLgBRAS0gYHByb3h5X3R5cGVgOiBUaGUgdHlwZSBvZiB0aGUgcHJveHkgdGhhdCB0aGUgc2VuZGVyIHdpbGwgYmUgcmVnaXN0ZXJlZCBhcyBvdmVyIHRoZU0BbmV3IGFjY291bnQuIFRoaXMgd2lsbCBhbG1vc3QgYWx3YXlzIGJlIHRoZSBtb3N0IHBlcm1pc3NpdmUgYFByb3h5VHlwZWAgcG9zc2libGUgdG94YWxsb3cgZm9yIG1heGltdW0gZmxleGliaWxpdHkuUQEtIGBpbmRleGA6IEEgZGlzYW1iaWd1YXRpb24gaW5kZXgsIGluIGNhc2UgdGhpcyBpcyBjYWxsZWQgbXVsdGlwbGUgdGltZXMgaW4gdGhlIHNhbWVdAXRyYW5zYWN0aW9uIChlLmcuIHdpdGggYHV0aWxpdHk6OmJhdGNoYCkuIFVubGVzcyB5b3UncmUgdXNpbmcgYGJhdGNoYCB5b3UgcHJvYmFibHkganVzdEB3YW50IHRvIHVzZSBgMGAuTQEtIGBkZWxheWA6IFRoZSBhbm5vdW5jZW1lbnQgcGVyaW9kIHJlcXVpcmVkIG9mIHRoZSBpbml0aWFsIHByb3h5LiBXaWxsIGdlbmVyYWxseSBiZRR6ZXJvLgBRAUZhaWxzIHdpdGggYER1cGxpY2F0ZWAgaWYgdGhpcyBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZCBpbiB0aGlzIHRyYW5zYWN0aW9uLCBmcm9tIHRoZZhzYW1lIHNlbmRlciwgd2l0aCB0aGUgc2FtZSBwYXJhbWV0ZXJzLgDkRmFpbHMgaWYgdGhlcmUgYXJlIGluc3VmZmljaWVudCBmdW5kcyB0byBwYXkgZm9yIGRlcG9zaXQuJGtpbGxfcHVyZRQBHHNwYXduZXLtAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AAShwcm94eV90eXBlPQEBMFQ6OlByb3h5VHlwZQABFGluZGV4QQEBDHUxNgABGGhlaWdodMkBAURCbG9ja051bWJlckZvcjxUPgABJGV4dF9pbmRleMkBAQx1MzIABUCgUmVtb3ZlcyBhIHByZXZpb3VzbHkgc3Bhd25lZCBwdXJlIHByb3h5LgBJAVdBUk5JTkc6ICoqQWxsIGFjY2VzcyB0byB0aGlzIGFjY291bnQgd2lsbCBiZSBsb3N0LioqIEFueSBmdW5kcyBoZWxkIGluIGl0IHdpbGwgYmU0aW5hY2Nlc3NpYmxlLgBZAVJlcXVpcmVzIGEgYFNpZ25lZGAgb3JpZ2luLCBhbmQgdGhlIHNlbmRlciBhY2NvdW50IG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgYnkgYSBjYWxsIHRvsGBjcmVhdGVfcHVyZWAgd2l0aCBjb3JyZXNwb25kaW5nIHBhcmFtZXRlcnMuAFUBLSBgc3Bhd25lcmA6IFRoZSBhY2NvdW50IHRoYXQgb3JpZ2luYWxseSBjYWxsZWQgYGNyZWF0ZV9wdXJlYCB0byBjcmVhdGUgdGhpcyBhY2NvdW50LlUBLSBgaW5kZXhgOiBUaGUgZGlzYW1iaWd1YXRpb24gaW5kZXggb3JpZ2luYWxseSBwYXNzZWQgdG8gYGNyZWF0ZV9wdXJlYC4gUHJvYmFibHkgYDBgLgkBLSBgcHJveHlfdHlwZWA6IFRoZSBwcm94eSB0eXBlIG9yaWdpbmFsbHkgcGFzc2VkIHRvIGBjcmVhdGVfcHVyZWAuRQEtIGBoZWlnaHRgOiBUaGUgaGVpZ2h0IG9mIHRoZSBjaGFpbiB3aGVuIHRoZSBjYWxsIHRvIGBjcmVhdGVfcHVyZWAgd2FzIHByb2Nlc3NlZC5RAS0gYGV4dF9pbmRleGA6IFRoZSBleHRyaW5zaWMgaW5kZXggaW4gd2hpY2ggdGhlIGNhbGwgdG8gYGNyZWF0ZV9wdXJlYCB3YXMgcHJvY2Vzc2VkLgA1AUZhaWxzIHdpdGggYE5vUGVybWlzc2lvbmAgaW4gY2FzZSB0aGUgY2FsbGVyIGlzIG5vdCBhIHByZXZpb3VzbHkgY3JlYXRlZCBwdXJl+GFjY291bnQgd2hvc2UgYGNyZWF0ZV9wdXJlYCBjYWxsIGhhcyBjb3JyZXNwb25kaW5nIHBhcmFtZXRlcnMuIGFubm91bmNlCAEQcmVhbO0BAVBBY2NvdW50SWRMb29rdXBPZjxUPgABJGNhbGxfaGFzaDQBNENhbGxIYXNoT2Y8VD4ABjwFAVB1Ymxpc2ggdGhlIGhhc2ggb2YgYSBwcm94eS1jYWxsIHRoYXQgd2lsbCBiZSBtYWRlIGluIHRoZSBmdXR1cmUuAF0BVGhpcyBtdXN0IGJlIGNhbGxlZCBzb21lIG51bWJlciBvZiBibG9ja3MgYmVmb3JlIHRoZSBjb3JyZXNwb25kaW5nIGBwcm94eWAgaXMgYXR0ZW1wdGVkJQFpZiB0aGUgZGVsYXkgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm94eSByZWxhdGlvbnNoaXAgaXMgZ3JlYXRlciB0aGFuIHplcm8uABEBTm8gbW9yZSB0aGFuIGBNYXhQZW5kaW5nYCBhbm5vdW5jZW1lbnRzIG1heSBiZSBtYWRlIGF0IGFueSBvbmUgdGltZS4ACQFUaGlzIHdpbGwgdGFrZSBhIGRlcG9zaXQgb2YgYEFubm91bmNlbWVudERlcG9zaXRGYWN0b3JgIGFzIHdlbGwgYXMZAWBBbm5vdW5jZW1lbnREZXBvc2l0QmFzZWAgaWYgdGhlcmUgYXJlIG5vIG90aGVyIHBlbmRpbmcgYW5ub3VuY2VtZW50cy4AJQFUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXyBhbmQgYSBwcm94eSBvZiBgcmVhbGAuACxQYXJhbWV0ZXJzOg0BLSBgcmVhbGA6IFRoZSBhY2NvdW50IHRoYXQgdGhlIHByb3h5IHdpbGwgbWFrZSBhIGNhbGwgb24gYmVoYWxmIG9mLhUBLSBgY2FsbF9oYXNoYDogVGhlIGhhc2ggb2YgdGhlIGNhbGwgdG8gYmUgbWFkZSBieSB0aGUgYHJlYWxgIGFjY291bnQuTHJlbW92ZV9hbm5vdW5jZW1lbnQIARByZWFs7QEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEkY2FsbF9oYXNoNAE0Q2FsbEhhc2hPZjxUPgAHKHBSZW1vdmUgYSBnaXZlbiBhbm5vdW5jZW1lbnQuAFkBTWF5IGJlIGNhbGxlZCBieSBhIHByb3h5IGFjY291bnQgdG8gcmVtb3ZlIGEgY2FsbCB0aGV5IHByZXZpb3VzbHkgYW5ub3VuY2VkIGFuZCByZXR1cm4wdGhlIGRlcG9zaXQuAMxUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXy4ALFBhcmFtZXRlcnM6DQEtIGByZWFsYDogVGhlIGFjY291bnQgdGhhdCB0aGUgcHJveHkgd2lsbCBtYWtlIGEgY2FsbCBvbiBiZWhhbGYgb2YuFQEtIGBjYWxsX2hhc2hgOiBUaGUgaGFzaCBvZiB0aGUgY2FsbCB0byBiZSBtYWRlIGJ5IHRoZSBgcmVhbGAgYWNjb3VudC5McmVqZWN0X2Fubm91bmNlbWVudAgBIGRlbGVnYXRl7QEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEkY2FsbF9oYXNoNAE0Q2FsbEhhc2hPZjxUPgAIKLBSZW1vdmUgdGhlIGdpdmVuIGFubm91bmNlbWVudCBvZiBhIGRlbGVnYXRlLgBhAU1heSBiZSBjYWxsZWQgYnkgYSB0YXJnZXQgKHByb3hpZWQpIGFjY291bnQgdG8gcmVtb3ZlIGEgY2FsbCB0aGF0IG9uZSBvZiB0aGVpciBkZWxlZ2F0ZXMlAShgZGVsZWdhdGVgKSBoYXMgYW5ub3VuY2VkIHRoZXkgd2FudCB0byBleGVjdXRlLiBUaGUgZGVwb3NpdCBpcyByZXR1cm5lZC4AzFRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfLgAsUGFyYW1ldGVyczr0LSBgZGVsZWdhdGVgOiBUaGUgYWNjb3VudCB0aGF0IHByZXZpb3VzbHkgYW5ub3VuY2VkIHRoZSBjYWxsLrwtIGBjYWxsX2hhc2hgOiBUaGUgaGFzaCBvZiB0aGUgY2FsbCB0byBiZSBtYWRlLjxwcm94eV9hbm5vdW5jZWQQASBkZWxlZ2F0Ze0BAVBBY2NvdW50SWRMb29rdXBPZjxUPgABEHJlYWztAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AAUBmb3JjZV9wcm94eV90eXBlxQMBUE9wdGlvbjxUOjpQcm94eVR5cGU+AAEQY2FsbKkBAXxCb3g8PFQgYXMgQ29uZmlnPjo6UnVudGltZUNhbGw+AAksTQFEaXNwYXRjaCB0aGUgZ2l2ZW4gYGNhbGxgIGZyb20gYW4gYWNjb3VudCB0aGF0IHRoZSBzZW5kZXIgaXMgYXV0aG9yaXplZCBmb3IgdGhyb3VnaDBgYWRkX3Byb3h5YC4AqFJlbW92ZXMgYW55IGNvcnJlc3BvbmRpbmcgYW5ub3VuY2VtZW50KHMpLgDMVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uACxQYXJhbWV0ZXJzOg0BLSBgcmVhbGA6IFRoZSBhY2NvdW50IHRoYXQgdGhlIHByb3h5IHdpbGwgbWFrZSBhIGNhbGwgb24gYmVoYWxmIG9mLmEBLSBgZm9yY2VfcHJveHlfdHlwZWA6IFNwZWNpZnkgdGhlIGV4YWN0IHByb3h5IHR5cGUgdG8gYmUgdXNlZCBhbmQgY2hlY2tlZCBmb3IgdGhpcyBjYWxsLtAtIGBjYWxsYDogVGhlIGNhbGwgdG8gYmUgbWFkZSBieSB0aGUgYHJlYWxgIGFjY291bnQuMHBva2VfZGVwb3NpdAAKIEkBUG9rZSAvIEFkanVzdCBkZXBvc2l0cyBtYWRlIGZvciBwcm94aWVzIGFuZCBhbm5vdW5jZW1lbnRzIGJhc2VkIG9uIGN1cnJlbnQgdmFsdWVzLg0BVGhpcyBjYW4gYmUgdXNlZCBieSBhY2NvdW50cyB0byBwb3NzaWJseSBsb3dlciB0aGVpciBsb2NrZWQgYW1vdW50LgDMVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uAAEBVGhlIHRyYW5zYWN0aW9uIGZlZSBpcyB3YWl2ZWQgaWYgdGhlIGRlcG9zaXQgYW1vdW50IGhhcyBjaGFuZ2VkLgCMRW1pdHMgYERlcG9zaXRQb2tlZGAgaWYgc3VjY2Vzc2Z1bC4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMuxQMEGE9wdGlvbgQEVAE9AQEIEE5vbmUAAAAQU29tZQQAPQEAAAEAAMkDDDxwYWxsZXRfbXVsdGlzaWcYcGFsbGV0EENhbGwEBFQAARRQYXNfbXVsdGlfdGhyZXNob2xkXzEIAURvdGhlcl9zaWduYXRvcmllcwECAURWZWM8VDo6QWNjb3VudElkPgABEGNhbGypAQF8Qm94PDxUIGFzIENvbmZpZz46OlJ1bnRpbWVDYWxsPgAAMFEBSW1tZWRpYXRlbHkgZGlzcGF0Y2ggYSBtdWx0aS1zaWduYXR1cmUgY2FsbCB1c2luZyBhIHNpbmdsZSBhcHByb3ZhbCBmcm9tIHRoZSBjYWxsZXIuAMxUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXy4APQEtIGBvdGhlcl9zaWduYXRvcmllc2A6IFRoZSBhY2NvdW50cyAob3RoZXIgdGhhbiB0aGUgc2VuZGVyKSB3aG8gYXJlIHBhcnQgb2YgdGhlAQFtdWx0aS1zaWduYXR1cmUsIGJ1dCBkbyBub3QgcGFydGljaXBhdGUgaW4gdGhlIGFwcHJvdmFsIHByb2Nlc3MuiC0gYGNhbGxgOiBUaGUgY2FsbCB0byBiZSBleGVjdXRlZC4AuFJlc3VsdCBpcyBlcXVpdmFsZW50IHRvIHRoZSBkaXNwYXRjaGVkIHJlc3VsdC4ANCMjIENvbXBsZXhpdHkZAU8oWiArIEMpIHdoZXJlIFogaXMgdGhlIGxlbmd0aCBvZiB0aGUgY2FsbCBhbmQgQyBpdHMgZXhlY3V0aW9uIHdlaWdodC4gYXNfbXVsdGkUASR0aHJlc2hvbGRBAQEMdTE2AAFEb3RoZXJfc2lnbmF0b3JpZXMBAgFEVmVjPFQ6OkFjY291bnRJZD4AATxtYXliZV90aW1lcG9pbnTNAwGQT3B0aW9uPFRpbWVwb2ludDxCbG9ja051bWJlckZvcjxUPj4+AAEQY2FsbKkBAXxCb3g8PFQgYXMgQ29uZmlnPjo6UnVudGltZUNhbGw+AAEobWF4X3dlaWdodCgBGFdlaWdodAABnFUBUmVnaXN0ZXIgYXBwcm92YWwgZm9yIGEgZGlzcGF0Y2ggdG8gYmUgbWFkZSBmcm9tIGEgZGV0ZXJtaW5pc3RpYyBjb21wb3NpdGUgYWNjb3VudCBpZvhhcHByb3ZlZCBieSBhIHRvdGFsIG9mIGB0aHJlc2hvbGQgLSAxYCBvZiBgb3RoZXJfc2lnbmF0b3JpZXNgLgCwSWYgdGhlcmUgYXJlIGVub3VnaCwgdGhlbiBkaXNwYXRjaCB0aGUgY2FsbC4ALQFQYXltZW50OiBgRGVwb3NpdEJhc2VgIHdpbGwgYmUgcmVzZXJ2ZWQgaWYgdGhpcyBpcyB0aGUgZmlyc3QgYXBwcm92YWwsIHBsdXM9AWB0aHJlc2hvbGRgIHRpbWVzIGBEZXBvc2l0RmFjdG9yYC4gSXQgaXMgcmV0dXJuZWQgb25jZSB0aGlzIGRpc3BhdGNoIGhhcHBlbnMgb3I0aXMgY2FuY2VsbGVkLgDMVGhlIGRpc3BhdGNoIG9yaWdpbiBmb3IgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8uAFUBLSBgdGhyZXNob2xkYDogVGhlIHRvdGFsIG51bWJlciBvZiBhcHByb3ZhbHMgZm9yIHRoaXMgZGlzcGF0Y2ggYmVmb3JlIGl0IGlzIGV4ZWN1dGVkLkEBLSBgb3RoZXJfc2lnbmF0b3JpZXNgOiBUaGUgYWNjb3VudHMgKG90aGVyIHRoYW4gdGhlIHNlbmRlcikgd2hvIGNhbiBhcHByb3ZlIHRoaXNsZGlzcGF0Y2guIE1heSBub3QgYmUgZW1wdHkuWQEtIGBtYXliZV90aW1lcG9pbnRgOiBJZiB0aGlzIGlzIHRoZSBmaXJzdCBhcHByb3ZhbCwgdGhlbiB0aGlzIG11c3QgYmUgYE5vbmVgLiBJZiBpdCBpc1EBbm90IHRoZSBmaXJzdCBhcHByb3ZhbCwgdGhlbiBpdCBtdXN0IGJlIGBTb21lYCwgd2l0aCB0aGUgdGltZXBvaW50IChibG9jayBudW1iZXIgYW5k1HRyYW5zYWN0aW9uIGluZGV4KSBvZiB0aGUgZmlyc3QgYXBwcm92YWwgdHJhbnNhY3Rpb24uiC0gYGNhbGxgOiBUaGUgY2FsbCB0byBiZSBleGVjdXRlZC4AHQFOT1RFOiBVbmxlc3MgdGhpcyBpcyB0aGUgZmluYWwgYXBwcm92YWwsIHlvdSB3aWxsIGdlbmVyYWxseSB3YW50IHRvIHVzZRkBYGFwcHJvdmVfYXNfbXVsdGlgIGluc3RlYWQsIHNpbmNlIGl0IG9ubHkgcmVxdWlyZXMgYSBoYXNoIG9mIHRoZSBjYWxsLgBZAVJlc3VsdCBpcyBlcXVpdmFsZW50IHRvIHRoZSBkaXNwYXRjaGVkIHJlc3VsdCBpZiBgdGhyZXNob2xkYCBpcyBleGFjdGx5IGAxYC4gT3RoZXJ3aXNlVQFvbiBzdWNjZXNzLCByZXN1bHQgaXMgYE9rYCBhbmQgdGhlIHJlc3VsdCBmcm9tIHRoZSBpbnRlcmlvciBjYWxsLCBpZiBpdCB3YXMgZXhlY3V0ZWQs3G1heSBiZSBmb3VuZCBpbiB0aGUgZGVwb3NpdGVkIGBNdWx0aXNpZ0V4ZWN1dGVkYCBldmVudC4ANCMjIENvbXBsZXhpdHlQLSBgTyhTICsgWiArIENhbGwpYC7MLSBVcCB0byBvbmUgYmFsYW5jZS1yZXNlcnZlIG9yIHVucmVzZXJ2ZSBvcGVyYXRpb24uPQEtIE9uZSBwYXNzdGhyb3VnaCBvcGVyYXRpb24sIG9uZSBpbnNlcnQsIGJvdGggYE8oUylgIHdoZXJlIGBTYCBpcyB0aGUgbnVtYmVyIG9mRQEgIHNpZ25hdG9yaWVzLiBgU2AgaXMgY2FwcGVkIGJ5IGBNYXhTaWduYXRvcmllc2AsIHdpdGggd2VpZ2h0IGJlaW5nIHByb3BvcnRpb25hbC4hAS0gT25lIGNhbGwgZW5jb2RlICYgaGFzaCwgYm90aCBvZiBjb21wbGV4aXR5IGBPKFopYCB3aGVyZSBgWmAgaXMgdHgtbGVuLrwtIE9uZSBlbmNvZGUgJiBoYXNoLCBib3RoIG9mIGNvbXBsZXhpdHkgYE8oUylgLtQtIFVwIHRvIG9uZSBiaW5hcnkgc2VhcmNoIGFuZCBpbnNlcnQgKGBPKGxvZ1MgKyBTKWApLvgtIEkvTzogMSByZWFkIGBPKFMpYCwgdXAgdG8gMSBtdXRhdGUgYE8oUylgLiBVcCB0byBvbmUgcmVtb3ZlLjAtIE9uZSBldmVudC5sLSBUaGUgd2VpZ2h0IG9mIHRoZSBgY2FsbGAuTQEtIFN0b3JhZ2U6IGluc2VydHMgb25lIGl0ZW0sIHZhbHVlIHNpemUgYm91bmRlZCBieSBgTWF4U2lnbmF0b3JpZXNgLCB3aXRoIGEgZGVwb3NpdBkBICB0YWtlbiBmb3IgaXRzIGxpZmV0aW1lIG9mIGBEZXBvc2l0QmFzZSArIHRocmVzaG9sZCAqIERlcG9zaXRGYWN0b3JgLkBhcHByb3ZlX2FzX211bHRpFAEkdGhyZXNob2xkQQEBDHUxNgABRG90aGVyX3NpZ25hdG9yaWVzAQIBRFZlYzxUOjpBY2NvdW50SWQ+AAE8bWF5YmVfdGltZXBvaW50zQMBkE9wdGlvbjxUaW1lcG9pbnQ8QmxvY2tOdW1iZXJGb3I8VD4+PgABJGNhbGxfaGFzaAQBIFt1ODsgMzJdAAEobWF4X3dlaWdodCgBGFdlaWdodAACeFUBUmVnaXN0ZXIgYXBwcm92YWwgZm9yIGEgZGlzcGF0Y2ggdG8gYmUgbWFkZSBmcm9tIGEgZGV0ZXJtaW5pc3RpYyBjb21wb3NpdGUgYWNjb3VudCBpZvhhcHByb3ZlZCBieSBhIHRvdGFsIG9mIGB0aHJlc2hvbGQgLSAxYCBvZiBgb3RoZXJfc2lnbmF0b3JpZXNgLgAtAVBheW1lbnQ6IGBEZXBvc2l0QmFzZWAgd2lsbCBiZSByZXNlcnZlZCBpZiB0aGlzIGlzIHRoZSBmaXJzdCBhcHByb3ZhbCwgcGx1cz0BYHRocmVzaG9sZGAgdGltZXMgYERlcG9zaXRGYWN0b3JgLiBJdCBpcyByZXR1cm5lZCBvbmNlIHRoaXMgZGlzcGF0Y2ggaGFwcGVucyBvcjRpcyBjYW5jZWxsZWQuAMxUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXy4AVQEtIGB0aHJlc2hvbGRgOiBUaGUgdG90YWwgbnVtYmVyIG9mIGFwcHJvdmFscyBmb3IgdGhpcyBkaXNwYXRjaCBiZWZvcmUgaXQgaXMgZXhlY3V0ZWQuQQEtIGBvdGhlcl9zaWduYXRvcmllc2A6IFRoZSBhY2NvdW50cyAob3RoZXIgdGhhbiB0aGUgc2VuZGVyKSB3aG8gY2FuIGFwcHJvdmUgdGhpc2xkaXNwYXRjaC4gTWF5IG5vdCBiZSBlbXB0eS5ZAS0gYG1heWJlX3RpbWVwb2ludGA6IElmIHRoaXMgaXMgdGhlIGZpcnN0IGFwcHJvdmFsLCB0aGVuIHRoaXMgbXVzdCBiZSBgTm9uZWAuIElmIGl0IGlzUQFub3QgdGhlIGZpcnN0IGFwcHJvdmFsLCB0aGVuIGl0IG11c3QgYmUgYFNvbWVgLCB3aXRoIHRoZSB0aW1lcG9pbnQgKGJsb2NrIG51bWJlciBhbmTUdHJhbnNhY3Rpb24gaW5kZXgpIG9mIHRoZSBmaXJzdCBhcHByb3ZhbCB0cmFuc2FjdGlvbi7MLSBgY2FsbF9oYXNoYDogVGhlIGhhc2ggb2YgdGhlIGNhbGwgdG8gYmUgZXhlY3V0ZWQuADUBTk9URTogSWYgdGhpcyBpcyB0aGUgZmluYWwgYXBwcm92YWwsIHlvdSB3aWxsIHdhbnQgdG8gdXNlIGBhc19tdWx0aWAgaW5zdGVhZC4ANCMjIENvbXBsZXhpdHkkLSBgTyhTKWAuzC0gVXAgdG8gb25lIGJhbGFuY2UtcmVzZXJ2ZSBvciB1bnJlc2VydmUgb3BlcmF0aW9uLj0BLSBPbmUgcGFzc3Rocm91Z2ggb3BlcmF0aW9uLCBvbmUgaW5zZXJ0LCBib3RoIGBPKFMpYCB3aGVyZSBgU2AgaXMgdGhlIG51bWJlciBvZkUBICBzaWduYXRvcmllcy4gYFNgIGlzIGNhcHBlZCBieSBgTWF4U2lnbmF0b3JpZXNgLCB3aXRoIHdlaWdodCBiZWluZyBwcm9wb3J0aW9uYWwuvC0gT25lIGVuY29kZSAmIGhhc2gsIGJvdGggb2YgY29tcGxleGl0eSBgTyhTKWAu1C0gVXAgdG8gb25lIGJpbmFyeSBzZWFyY2ggYW5kIGluc2VydCAoYE8obG9nUyArIFMpYCku+C0gSS9POiAxIHJlYWQgYE8oUylgLCB1cCB0byAxIG11dGF0ZSBgTyhTKWAuIFVwIHRvIG9uZSByZW1vdmUuMC0gT25lIGV2ZW50Lk0BLSBTdG9yYWdlOiBpbnNlcnRzIG9uZSBpdGVtLCB2YWx1ZSBzaXplIGJvdW5kZWQgYnkgYE1heFNpZ25hdG9yaWVzYCwgd2l0aCBhIGRlcG9zaXQZASAgdGFrZW4gZm9yIGl0cyBsaWZldGltZSBvZiBgRGVwb3NpdEJhc2UgKyB0aHJlc2hvbGQgKiBEZXBvc2l0RmFjdG9yYC48Y2FuY2VsX2FzX211bHRpEAEkdGhyZXNob2xkQQEBDHUxNgABRG90aGVyX3NpZ25hdG9yaWVzAQIBRFZlYzxUOjpBY2NvdW50SWQ+AAEkdGltZXBvaW50TQEBcFRpbWVwb2ludDxCbG9ja051bWJlckZvcjxUPj4AASRjYWxsX2hhc2gEASBbdTg7IDMyXQADVFUBQ2FuY2VsIGEgcHJlLWV4aXN0aW5nLCBvbi1nb2luZyBtdWx0aXNpZyB0cmFuc2FjdGlvbi4gQW55IGRlcG9zaXQgcmVzZXJ2ZWQgcHJldmlvdXNsecRmb3IgdGhpcyBvcGVyYXRpb24gd2lsbCBiZSB1bnJlc2VydmVkIG9uIHN1Y2Nlc3MuAMxUaGUgZGlzcGF0Y2ggb3JpZ2luIGZvciB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXy4AVQEtIGB0aHJlc2hvbGRgOiBUaGUgdG90YWwgbnVtYmVyIG9mIGFwcHJvdmFscyBmb3IgdGhpcyBkaXNwYXRjaCBiZWZvcmUgaXQgaXMgZXhlY3V0ZWQuQQEtIGBvdGhlcl9zaWduYXRvcmllc2A6IFRoZSBhY2NvdW50cyAob3RoZXIgdGhhbiB0aGUgc2VuZGVyKSB3aG8gY2FuIGFwcHJvdmUgdGhpc2xkaXNwYXRjaC4gTWF5IG5vdCBiZSBlbXB0eS5dAS0gYHRpbWVwb2ludGA6IFRoZSB0aW1lcG9pbnQgKGJsb2NrIG51bWJlciBhbmQgdHJhbnNhY3Rpb24gaW5kZXgpIG9mIHRoZSBmaXJzdCBhcHByb3ZhbHh0cmFuc2FjdGlvbiBmb3IgdGhpcyBkaXNwYXRjaC7MLSBgY2FsbF9oYXNoYDogVGhlIGhhc2ggb2YgdGhlIGNhbGwgdG8gYmUgZXhlY3V0ZWQuADQjIyBDb21wbGV4aXR5JC0gYE8oUylgLswtIFVwIHRvIG9uZSBiYWxhbmNlLXJlc2VydmUgb3IgdW5yZXNlcnZlIG9wZXJhdGlvbi49AS0gT25lIHBhc3N0aHJvdWdoIG9wZXJhdGlvbiwgb25lIGluc2VydCwgYm90aCBgTyhTKWAgd2hlcmUgYFNgIGlzIHRoZSBudW1iZXIgb2ZFASAgc2lnbmF0b3JpZXMuIGBTYCBpcyBjYXBwZWQgYnkgYE1heFNpZ25hdG9yaWVzYCwgd2l0aCB3ZWlnaHQgYmVpbmcgcHJvcG9ydGlvbmFsLrwtIE9uZSBlbmNvZGUgJiBoYXNoLCBib3RoIG9mIGNvbXBsZXhpdHkgYE8oUylgLjAtIE9uZSBldmVudC6ELSBJL086IDEgcmVhZCBgTyhTKWAsIG9uZSByZW1vdmUucC0gU3RvcmFnZTogcmVtb3ZlcyBvbmUgaXRlbS4wcG9rZV9kZXBvc2l0DAEkdGhyZXNob2xkQQEBDHUxNgABRG90aGVyX3NpZ25hdG9yaWVzAQIBRFZlYzxUOjpBY2NvdW50SWQ+AAEkY2FsbF9oYXNoBAEgW3U4OyAzMl0ABDT0UG9rZSB0aGUgZGVwb3NpdCByZXNlcnZlZCBmb3IgYW4gZXhpc3RpbmcgbXVsdGlzaWcgb3BlcmF0aW9uLgBhAVRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfIGFuZCBtdXN0IGJlIHRoZSBvcmlnaW5hbCBkZXBvc2l0b3Igb2ZcdGhlIG11bHRpc2lnIG9wZXJhdGlvbi4AAQFUaGUgdHJhbnNhY3Rpb24gZmVlIGlzIHdhaXZlZCBpZiB0aGUgZGVwb3NpdCBhbW91bnQgaGFzIGNoYW5nZWQuABkBLSBgdGhyZXNob2xkYDogVGhlIHRvdGFsIG51bWJlciBvZiBhcHByb3ZhbHMgbmVlZGVkIGZvciB0aGlzIG11bHRpc2lnLj0BLSBgb3RoZXJfc2lnbmF0b3JpZXNgOiBUaGUgYWNjb3VudHMgKG90aGVyIHRoYW4gdGhlIHNlbmRlcikgd2hvIGFyZSBwYXJ0IG9mIHRoZSwgIG11bHRpc2lnLgUBLSBgY2FsbF9oYXNoYDogVGhlIGhhc2ggb2YgdGhlIGNhbGwgdGhpcyBkZXBvc2l0IGlzIHJlc2VydmVkIGZvci4AjEVtaXRzIGBEZXBvc2l0UG9rZWRgIGlmIHN1Y2Nlc3NmdWwuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLs0DBBhPcHRpb24EBFQBTQEBCBBOb25lAAAAEFNvbWUEAE0BAAABAADRAwyQcGFsbGV0X2VsZWN0aW9uX3Byb3ZpZGVyX211bHRpX3BoYXNlGHBhbGxldBBDYWxsBARUAAEUPHN1Ym1pdF91bnNpZ25lZAgBMHJhd19zb2x1dGlvbtUDAbBCb3g8UmF3U29sdXRpb248U29sdXRpb25PZjxUOjpNaW5lckNvbmZpZz4+PgABHHdpdG5lc3OlBAFYU29sdXRpb25PclNuYXBzaG90U2l6ZQAAOKRTdWJtaXQgYSBzb2x1dGlvbiBmb3IgdGhlIHVuc2lnbmVkIHBoYXNlLgDIVGhlIGRpc3BhdGNoIG9yaWdpbiBmbyB0aGlzIGNhbGwgbXVzdCBiZSBfX25vbmVfXy4APQFUaGlzIHN1Ym1pc3Npb24gaXMgY2hlY2tlZCBvbiB0aGUgZmx5LiBNb3Jlb3ZlciwgdGhpcyB1bnNpZ25lZCBzb2x1dGlvbiBpcyBvbmx5VQF2YWxpZGF0ZWQgd2hlbiBzdWJtaXR0ZWQgdG8gdGhlIHBvb2wgZnJvbSB0aGUgKipsb2NhbCoqIG5vZGUuIEVmZmVjdGl2ZWx5LCB0aGlzIG1lYW5zXQF0aGF0IG9ubHkgYWN0aXZlIHZhbGlkYXRvcnMgY2FuIHN1Ym1pdCB0aGlzIHRyYW5zYWN0aW9uIHdoZW4gYXV0aG9yaW5nIGEgYmxvY2sgKHNpbWlsYXJAdG8gYW4gaW5oZXJlbnQpLgBZAVRvIHByZXZlbnQgYW55IGluY29ycmVjdCBzb2x1dGlvbiAoYW5kIHRodXMgd2FzdGVkIHRpbWUvd2VpZ2h0KSwgdGhpcyB0cmFuc2FjdGlvbiB3aWxsTQFwYW5pYyBpZiB0aGUgc29sdXRpb24gc3VibWl0dGVkIGJ5IHRoZSB2YWxpZGF0b3IgaXMgaW52YWxpZCBpbiBhbnkgd2F5LCBlZmZlY3RpdmVseZxwdXR0aW5nIHRoZWlyIGF1dGhvcmluZyByZXdhcmQgYXQgcmlzay4A4E5vIGRlcG9zaXQgb3IgcmV3YXJkIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHN1Ym1pc3Npb24ubHNldF9taW5pbXVtX3VudHJ1c3RlZF9zY29yZQQBQG1heWJlX25leHRfc2NvcmWpBAFUT3B0aW9uPEVsZWN0aW9uU2NvcmU+AAEUsFNldCBhIG5ldyB2YWx1ZSBmb3IgYE1pbmltdW1VbnRydXN0ZWRTY29yZWAuANhEaXNwYXRjaCBvcmlnaW4gbXVzdCBiZSBhbGlnbmVkIHdpdGggYFQ6OkZvcmNlT3JpZ2luYC4A8FRoaXMgY2hlY2sgY2FuIGJlIHR1cm5lZCBvZmYgYnkgc2V0dGluZyB0aGUgdmFsdWUgdG8gYE5vbmVgLnRzZXRfZW1lcmdlbmN5X2VsZWN0aW9uX3Jlc3VsdAQBIHN1cHBvcnRzrQQBWFN1cHBvcnRzPFQ6OkFjY291bnRJZD4AAiBZAVNldCBhIHNvbHV0aW9uIGluIHRoZSBxdWV1ZSwgdG8gYmUgaGFuZGVkIG91dCB0byB0aGUgY2xpZW50IG9mIHRoaXMgcGFsbGV0IGluIHRoZSBuZXh0iGNhbGwgdG8gYEVsZWN0aW9uUHJvdmlkZXI6OmVsZWN0YC4ARQFUaGlzIGNhbiBvbmx5IGJlIHNldCBieSBgVDo6Rm9yY2VPcmlnaW5gLCBhbmQgb25seSB3aGVuIHRoZSBwaGFzZSBpcyBgRW1lcmdlbmN5YC4AYQFUaGUgc29sdXRpb24gaXMgbm90IGNoZWNrZWQgZm9yIGFueSBmZWFzaWJpbGl0eSBhbmQgaXMgYXNzdW1lZCB0byBiZSB0cnVzdHdvcnRoeSwgYXMgYW55UQFmZWFzaWJpbGl0eSBjaGVjayBpdHNlbGYgY2FuIGluIHByaW5jaXBsZSBjYXVzZSB0aGUgZWxlY3Rpb24gcHJvY2VzcyB0byBmYWlsIChkdWUgdG9obWVtb3J5L3dlaWdodCBjb25zdHJhaW5zKS4Yc3VibWl0BAEwcmF3X3NvbHV0aW9u1QMBsEJveDxSYXdTb2x1dGlvbjxTb2x1dGlvbk9mPFQ6Ok1pbmVyQ29uZmlnPj4+AAMknFN1Ym1pdCBhIHNvbHV0aW9uIGZvciB0aGUgc2lnbmVkIHBoYXNlLgDQVGhlIGRpc3BhdGNoIG9yaWdpbiBmbyB0aGlzIGNhbGwgbXVzdCBiZSBfX3NpZ25lZF9fLgBdAVRoZSBzb2x1dGlvbiBpcyBwb3RlbnRpYWxseSBxdWV1ZWQsIGJhc2VkIG9uIHRoZSBjbGFpbWVkIHNjb3JlIGFuZCBwcm9jZXNzZWQgYXQgdGhlIGVuZFBvZiB0aGUgc2lnbmVkIHBoYXNlLgBdAUEgZGVwb3NpdCBpcyByZXNlcnZlZCBhbmQgcmVjb3JkZWQgZm9yIHRoZSBzb2x1dGlvbi4gQmFzZWQgb24gdGhlIG91dGNvbWUsIHRoZSBzb2x1dGlvbhUBbWlnaHQgYmUgcmV3YXJkZWQsIHNsYXNoZWQsIG9yIGdldCBhbGwgb3IgYSBwYXJ0IG9mIHRoZSBkZXBvc2l0IGJhY2suTGdvdmVybmFuY2VfZmFsbGJhY2sABBCAVHJpZ2dlciB0aGUgZ292ZXJuYW5jZSBmYWxsYmFjay4ASQFUaGlzIGNhbiBvbmx5IGJlIGNhbGxlZCB3aGVuIFtgUGhhc2U6OkVtZXJnZW5jeWBdIGlzIGVuYWJsZWQsIGFzIGFuIGFsdGVybmF0aXZlIHRvwGNhbGxpbmcgW2BDYWxsOjpzZXRfZW1lcmdlbmN5X2VsZWN0aW9uX3Jlc3VsdGBdLgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy7VAwiQcGFsbGV0X2VsZWN0aW9uX3Byb3ZpZGVyX211bHRpX3BoYXNlLFJhd1NvbHV0aW9uBARTAdkDAAwBIHNvbHV0aW9u2QMBBFMAARRzY29yZVkBATRFbGVjdGlvblNjb3JlAAEUcm91bmQQAQx1MzIAANkDCDx3ZXN0ZW5kX3J1bnRpbWVUTnBvc0NvbXBhY3RTb2x1dGlvbjE2AABAARh2b3RlczHdAwAAARh2b3RlczLpAwAAARh2b3RlczP9AwAAARh2b3RlczQJBAAAARh2b3RlczUVBAAAARh2b3RlczYhBAAAARh2b3RlczctBAAAARh2b3Rlczg5BAAAARh2b3RlczlFBAAAARx2b3RlczEwUQQAAAEcdm90ZXMxMV0EAAABHHZvdGVzMTJpBAAAARx2b3RlczEzdQQAAAEcdm90ZXMxNIEEAAABHHZvdGVzMTWNBAAAARx2b3RlczE2mQQAAADdAwAAAuEDAOEDAAAECMkB5QMA5QMAAAZBAQDpAwAAAu0DAO0DAAAEDMkB8QPlAwDxAwAABAjlA/UDAPUDAAAG+QMA+QMMNHNwX2FyaXRobWV0aWMocGVyX3RoaW5ncxhQZXJVMTYAAAQAQQEBDHUxNgAA/QMAAAIBBAABBAAABAzJAQUE5QMABQQAAAMCAAAA8QMACQQAAAINBAANBAAABAzJAREE5QMAEQQAAAMDAAAA8QMAFQQAAAIZBAAZBAAABAzJAR0E5QMAHQQAAAMEAAAA8QMAIQQAAAIlBAAlBAAABAzJASkE5QMAKQQAAAMFAAAA8QMALQQAAAIxBAAxBAAABAzJATUE5QMANQQAAAMGAAAA8QMAOQQAAAI9BAA9BAAABAzJAUEE5QMAQQQAAAMHAAAA8QMARQQAAAJJBABJBAAABAzJAU0E5QMATQQAAAMIAAAA8QMAUQQAAAJVBABVBAAABAzJAVkE5QMAWQQAAAMJAAAA8QMAXQQAAAJhBABhBAAABAzJAWUE5QMAZQQAAAMKAAAA8QMAaQQAAAJtBABtBAAABAzJAXEE5QMAcQQAAAMLAAAA8QMAdQQAAAJ5BAB5BAAABAzJAX0E5QMAfQQAAAMMAAAA8QMAgQQAAAKFBACFBAAABAzJAYkE5QMAiQQAAAMNAAAA8QMAjQQAAAKRBACRBAAABAzJAZUE5QMAlQQAAAMOAAAA8QMAmQQAAAKdBACdBAAABAzJAaEE5QMAoQQAAAMPAAAA8QMApQQIkHBhbGxldF9lbGVjdGlvbl9wcm92aWRlcl9tdWx0aV9waGFzZVhTb2x1dGlvbk9yU25hcHNob3RTaXplAAAIARh2b3RlcnPJAQEMdTMyAAEcdGFyZ2V0c8kBAQx1MzIAAKkEBBhPcHRpb24EBFQBWQEBCBBOb25lAAAAEFNvbWUEAFkBAAABAACtBAAAArEEALEEAAAECAC1BAC1BAhEc3BfbnBvc19lbGVjdGlvbnMcU3VwcG9ydAQkQWNjb3VudElkAQAACAEUdG90YWwYATxFeHRlbmRlZEJhbGFuY2UAARh2b3RlcnO5BAGEVmVjPChBY2NvdW50SWQsIEV4dGVuZGVkQmFsYW5jZSk+AAC5BAAAAr0EAL0EAAAECAAYAMEEDEBwYWxsZXRfYmFnc19saXN0GHBhbGxldBBDYWxsCARUAARJAAEMFHJlYmFnBAEoZGlzbG9jYXRlZO0BAVBBY2NvdW50SWRMb29rdXBPZjxUPgAAKFkBRGVjbGFyZSB0aGF0IHNvbWUgYGRpc2xvY2F0ZWRgIGFjY291bnQgaGFzLCB0aHJvdWdoIHJld2FyZHMgb3IgcGVuYWx0aWVzLCBzdWZmaWNpZW50bHlRAWNoYW5nZWQgaXRzIHNjb3JlIHRoYXQgaXQgc2hvdWxkIHByb3Blcmx5IGZhbGwgaW50byBhIGRpZmZlcmVudCBiYWcgdGhhbiBpdHMgY3VycmVudBBvbmUuAB0BQW55b25lIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24gYWJvdXQgYW55IHBvdGVudGlhbGx5IGRpc2xvY2F0ZWQgYWNjb3VudC4ASQFXaWxsIGFsd2F5cyB1cGRhdGUgdGhlIHN0b3JlZCBzY29yZSBvZiBgZGlzbG9jYXRlZGAgdG8gdGhlIGNvcnJlY3Qgc2NvcmUsIGJhc2VkIG9uQGBTY29yZVByb3ZpZGVyYC4A1ElmIGBkaXNsb2NhdGVkYCBkb2VzIG5vdCBleGlzdHMsIGl0IHJldHVybnMgYW4gZXJyb3IuPHB1dF9pbl9mcm9udF9vZgQBHGxpZ2h0ZXLtAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AASjQTW92ZSB0aGUgY2FsbGVyJ3MgSWQgZGlyZWN0bHkgaW4gZnJvbnQgb2YgYGxpZ2h0ZXJgLgBZAVRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfIGFuZCBjYW4gb25seSBiZSBjYWxsZWQgYnkgdGhlIElkIG9mNQF0aGUgYWNjb3VudCBnb2luZyBpbiBmcm9udCBvZiBgbGlnaHRlcmAuIEZlZSBpcyBwYXllZCBieSB0aGUgb3JpZ2luIHVuZGVyIGFsbDhjaXJjdW1zdGFuY2VzLgA4T25seSB3b3JrcyBpZjoAlC0gYm90aCBub2RlcyBhcmUgd2l0aGluIHRoZSBzYW1lIGJhZyzQLSBhbmQgYG9yaWdpbmAgaGFzIGEgZ3JlYXRlciBgU2NvcmVgIHRoYW4gYGxpZ2h0ZXJgLlRwdXRfaW5fZnJvbnRfb2Zfb3RoZXIIARxoZWF2aWVy7QEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEcbGlnaHRlcu0BAVBBY2NvdW50SWRMb29rdXBPZjxUPgACDBEBU2FtZSBhcyBbYFBhbGxldDo6cHV0X2luX2Zyb250X29mYF0sIGJ1dCBpdCBjYW4gYmUgY2FsbGVkIGJ5IGFueW9uZS4AyEZlZSBpcyBwYWlkIGJ5IHRoZSBvcmlnaW4gdW5kZXIgYWxsIGNpcmN1bXN0YW5jZXMuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLsUEDFxwYWxsZXRfbm9taW5hdGlvbl9wb29scxhwYWxsZXQQQ2FsbAQEVAABaBBqb2luCAEYYW1vdW50/QEBMEJhbGFuY2VPZjxUPgABHHBvb2xfaWQQARhQb29sSWQAAEBFAVN0YWtlIGZ1bmRzIHdpdGggYSBwb29sLiBUaGUgYW1vdW50IHRvIGJvbmQgaXMgZGVsZWdhdGVkIChvciB0cmFuc2ZlcnJlZCBiYXNlZCBvbk0BW2BhZGFwdGVyOjpTdGFrZVN0cmF0ZWd5VHlwZWBdKSBmcm9tIHRoZSBtZW1iZXIgdG8gdGhlIHBvb2wgYWNjb3VudCBhbmQgaW1tZWRpYXRlbHloaW5jcmVhc2VzIHRoZSBwb29sJ3MgYm9uZC4AKQFUaGUgbWV0aG9kIG9mIHRyYW5zZmVycmluZyB0aGUgYW1vdW50IHRvIHRoZSBwb29sIGFjY291bnQgaXMgZGV0ZXJtaW5lZCBieQEBW2BhZGFwdGVyOjpTdGFrZVN0cmF0ZWd5VHlwZWBdLiBJZiB0aGUgcG9vbCBpcyBjb25maWd1cmVkIHRvIHVzZTEBW2BhZGFwdGVyOjpTdGFrZVN0cmF0ZWd5VHlwZTo6RGVsZWdhdGVgXSwgdGhlIGZ1bmRzIHJlbWFpbiBpbiB0aGUgYWNjb3VudCBvZjEBdGhlIGBvcmlnaW5gLCB3aGlsZSB0aGUgcG9vbCBnYWlucyB0aGUgcmlnaHQgdG8gdXNlIHRoZXNlIGZ1bmRzIGZvciBzdGFraW5nLgAYIyBOb3RlAMwqIEFuIGFjY291bnQgY2FuIG9ubHkgYmUgYSBtZW1iZXIgb2YgYSBzaW5nbGUgcG9vbC7YKiBBbiBhY2NvdW50IGNhbm5vdCBqb2luIHRoZSBzYW1lIHBvb2wgbXVsdGlwbGUgdGltZXMuQQEqIFRoaXMgY2FsbCB3aWxsICpub3QqIGR1c3QgdGhlIG1lbWJlciBhY2NvdW50LCBzbyB0aGUgbWVtYmVyIG11c3QgaGF2ZSBhdCBsZWFzdMggIGBleGlzdGVudGlhbCBkZXBvc2l0ICsgYW1vdW50YCBpbiB0aGVpciBhY2NvdW50LtAqIE9ubHkgYSBwb29sIHdpdGggW2BQb29sU3RhdGU6Ok9wZW5gXSBjYW4gYmUgam9pbmVkKGJvbmRfZXh0cmEEARRleHRyYckEAVxCb25kRXh0cmE8QmFsYW5jZU9mPFQ+PgABHEUBQm9uZCBgZXh0cmFgIG1vcmUgZnVuZHMgZnJvbSBgb3JpZ2luYCBpbnRvIHRoZSBwb29sIHRvIHdoaWNoIHRoZXkgYWxyZWFkeSBiZWxvbmcuAEkBQWRkaXRpb25hbCBmdW5kcyBjYW4gY29tZSBmcm9tIGVpdGhlciB0aGUgZnJlZSBiYWxhbmNlIG9mIHRoZSBhY2NvdW50LCBvZiBmcm9tIHRoZZxhY2N1bXVsYXRlZCByZXdhcmRzLCBzZWUgW2BCb25kRXh0cmFgXS4APQFCb25kaW5nIGV4dHJhIGZ1bmRzIGltcGxpZXMgYW4gYXV0b21hdGljIHBheW91dCBvZiBhbGwgcGVuZGluZyByZXdhcmRzIGFzIHdlbGwuCQFTZWUgYGJvbmRfZXh0cmFfb3RoZXJgIHRvIGJvbmQgcGVuZGluZyByZXdhcmRzIG9mIGBvdGhlcmAgbWVtYmVycy4wY2xhaW1fcGF5b3V0AAIgVQFBIGJvbmRlZCBtZW1iZXIgY2FuIHVzZSB0aGlzIHRvIGNsYWltIHRoZWlyIHBheW91dCBiYXNlZCBvbiB0aGUgcmV3YXJkcyB0aGF0IHRoZSBwb29sYQFoYXMgYWNjdW11bGF0ZWQgc2luY2UgdGhlaXIgbGFzdCBjbGFpbWVkIHBheW91dCAoT1Igc2luY2Ugam9pbmluZyBpZiB0aGlzIGlzIHRoZWlyIGZpcnN0PQF0aW1lIGNsYWltaW5nIHJld2FyZHMpLiBUaGUgcGF5b3V0IHdpbGwgYmUgdHJhbnNmZXJyZWQgdG8gdGhlIG1lbWJlcidzIGFjY291bnQuAEkBVGhlIG1lbWJlciB3aWxsIGVhcm4gcmV3YXJkcyBwcm8gcmF0YSBiYXNlZCBvbiB0aGUgbWVtYmVycyBzdGFrZSB2cyB0aGUgc3VtIG9mIHRoZdBtZW1iZXJzIGluIHRoZSBwb29scyBzdGFrZS4gUmV3YXJkcyBkbyBub3QgImV4cGlyZSIuAEEBU2VlIGBjbGFpbV9wYXlvdXRfb3RoZXJgIHRvIGNsYWltIHJld2FyZHMgb24gYmVoYWxmIG9mIHNvbWUgYG90aGVyYCBwb29sIG1lbWJlci4YdW5ib25kCAE4bWVtYmVyX2FjY291bnTtAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AAUB1bmJvbmRpbmdfcG9pbnRz/QEBMEJhbGFuY2VPZjxUPgADfEUBVW5ib25kIHVwIHRvIGB1bmJvbmRpbmdfcG9pbnRzYCBvZiB0aGUgYG1lbWJlcl9hY2NvdW50YCdzIGZ1bmRzIGZyb20gdGhlIHBvb2wuIEl0RQFpbXBsaWNpdGx5IGNvbGxlY3RzIHRoZSByZXdhcmRzIG9uZSBsYXN0IHRpbWUsIHNpbmNlIG5vdCBkb2luZyBzbyB3b3VsZCBtZWFuIHNvbWVscmV3YXJkcyB3b3VsZCBiZSBmb3JmZWl0ZWQuAE0BVW5kZXIgY2VydGFpbiBjb25kaXRpb25zLCB0aGlzIGNhbGwgY2FuIGJlIGRpc3BhdGNoZWQgcGVybWlzc2lvbmxlc3NseSAoaS5lLiBieSBhbnkkYWNjb3VudCkuAKwjIENvbmRpdGlvbnMgZm9yIGEgcGVybWlzc2lvbmxlc3MgZGlzcGF0Y2guAF0BKiBUaGUgcG9vbCBpcyBibG9ja2VkIGFuZCB0aGUgY2FsbGVyIGlzIGVpdGhlciB0aGUgcm9vdCBvciBib3VuY2VyLiBUaGlzIGlzIHJlZmVyZWVkIHRvMCAgYXMgYSBraWNrLvQqIFRoZSBwb29sIGlzIGRlc3Ryb3lpbmcgYW5kIHRoZSBtZW1iZXIgaXMgbm90IHRoZSBkZXBvc2l0b3IuVQEqIFRoZSBwb29sIGlzIGRlc3Ryb3lpbmcsIHRoZSBtZW1iZXIgaXMgdGhlIGRlcG9zaXRvciBhbmQgbm8gb3RoZXIgbWVtYmVycyBhcmUgaW4gdGhlHCAgcG9vbC4AEQEjIyBDb25kaXRpb25zIGZvciBwZXJtaXNzaW9uZWQgZGlzcGF0Y2ggKGkuZS4gdGhlIGNhbGxlciBpcyBhbHNvIHRoZUhgbWVtYmVyX2FjY291bnRgKToAiCogVGhlIGNhbGxlciBpcyBub3QgdGhlIGRlcG9zaXRvci5VASogVGhlIGNhbGxlciBpcyB0aGUgZGVwb3NpdG9yLCB0aGUgcG9vbCBpcyBkZXN0cm95aW5nIGFuZCBubyBvdGhlciBtZW1iZXJzIGFyZSBpbiB0aGUcICBwb29sLgAYIyBOb3RlAB0BSWYgdGhlcmUgYXJlIHRvbyBtYW55IHVubG9ja2luZyBjaHVua3MgdG8gdW5ib25kIHdpdGggdGhlIHBvb2wgYWNjb3VudCxRAVtgQ2FsbDo6cG9vbF93aXRoZHJhd191bmJvbmRlZGBdIGNhbiBiZSBjYWxsZWQgdG8gdHJ5IGFuZCBtaW5pbWl6ZSB1bmxvY2tpbmcgY2h1bmtzLlkBVGhlIFtgU3Rha2luZ0ludGVyZmFjZTo6dW5ib25kYF0gd2lsbCBpbXBsaWNpdGx5IGNhbGwgW2BDYWxsOjpwb29sX3dpdGhkcmF3X3VuYm9uZGVkYF1VAXRvIHRyeSB0byBmcmVlIGNodW5rcyBpZiBuZWNlc3NhcnkgKGllLiBpZiB1bmJvdW5kIHdhcyBjYWxsZWQgYW5kIG5vIHVubG9ja2luZyBjaHVua3NhAWFyZSBhdmFpbGFibGUpLiBIb3dldmVyLCBpdCBtYXkgbm90IGJlIHBvc3NpYmxlIHRvIHJlbGVhc2UgdGhlIGN1cnJlbnQgdW5sb2NraW5nIGNodW5rcyxdAWluIHdoaWNoIGNhc2UsIHRoZSByZXN1bHQgb2YgdGhpcyBjYWxsIHdpbGwgbGlrZWx5IGJlIHRoZSBgTm9Nb3JlQ2h1bmtzYCBlcnJvciBmcm9tIHRoZTxzdGFraW5nIHN5c3RlbS5YcG9vbF93aXRoZHJhd191bmJvbmRlZAgBHHBvb2xfaWQQARhQb29sSWQAAUhudW1fc2xhc2hpbmdfc3BhbnMQAQx1MzIABBhVAUNhbGwgYHdpdGhkcmF3X3VuYm9uZGVkYCBmb3IgdGhlIHBvb2xzIGFjY291bnQuIFRoaXMgY2FsbCBjYW4gYmUgbWFkZSBieSBhbnkgYWNjb3VudC4AQQFUaGlzIGlzIHVzZWZ1bCBpZiB0aGVyZSBhcmUgdG9vIG1hbnkgdW5sb2NraW5nIGNodW5rcyB0byBjYWxsIGB1bmJvbmRgLCBhbmQgc29tZWEBY2FuIGJlIGNsZWFyZWQgYnkgd2l0aGRyYXdpbmcuIEluIHRoZSBjYXNlIHRoZXJlIGFyZSB0b28gbWFueSB1bmxvY2tpbmcgY2h1bmtzLCB0aGUgdXNlclEBd291bGQgcHJvYmFibHkgc2VlIGFuIGVycm9yIGxpa2UgYE5vTW9yZUNodW5rc2AgZW1pdHRlZCBmcm9tIHRoZSBzdGFraW5nIHN5c3RlbSB3aGVuXHRoZXkgYXR0ZW1wdCB0byB1bmJvbmQuRHdpdGhkcmF3X3VuYm9uZGVkCAE4bWVtYmVyX2FjY291bnTtAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AAUhudW1fc2xhc2hpbmdfc3BhbnMQAQx1MzIABVhVAVdpdGhkcmF3IHVuYm9uZGVkIGZ1bmRzIGZyb20gYG1lbWJlcl9hY2NvdW50YC4gSWYgbm8gYm9uZGVkIGZ1bmRzIGNhbiBiZSB1bmJvbmRlZCwgYW5IZXJyb3IgaXMgcmV0dXJuZWQuAE0BVW5kZXIgY2VydGFpbiBjb25kaXRpb25zLCB0aGlzIGNhbGwgY2FuIGJlIGRpc3BhdGNoZWQgcGVybWlzc2lvbmxlc3NseSAoaS5lLiBieSBhbnkkYWNjb3VudCkuAKgjIENvbmRpdGlvbnMgZm9yIGEgcGVybWlzc2lvbmxlc3MgZGlzcGF0Y2gACQEqIFRoZSBwb29sIGlzIGluIGRlc3Ryb3kgbW9kZSBhbmQgdGhlIHRhcmdldCBpcyBub3QgdGhlIGRlcG9zaXRvci4xASogVGhlIHRhcmdldCBpcyB0aGUgZGVwb3NpdG9yIGFuZCB0aGV5IGFyZSB0aGUgb25seSBtZW1iZXIgaW4gdGhlIHN1YiBwb29scy4NASogVGhlIHBvb2wgaXMgYmxvY2tlZCBhbmQgdGhlIGNhbGxlciBpcyBlaXRoZXIgdGhlIHJvb3Qgb3IgYm91bmNlci4AmCMgQ29uZGl0aW9ucyBmb3IgcGVybWlzc2lvbmVkIGRpc3BhdGNoAOgqIFRoZSBjYWxsZXIgaXMgdGhlIHRhcmdldCBhbmQgdGhleSBhcmUgbm90IHRoZSBkZXBvc2l0b3IuABgjIE5vdGUA9C0gSWYgdGhlIHRhcmdldCBpcyB0aGUgZGVwb3NpdG9yLCB0aGUgcG9vbCB3aWxsIGJlIGRlc3Ryb3llZC5hAS0gSWYgdGhlIHBvb2wgaGFzIGFueSBwZW5kaW5nIHNsYXNoLCB3ZSBhbHNvIHRyeSB0byBzbGFzaCB0aGUgbWVtYmVyIGJlZm9yZSBsZXR0aW5nIHRoZW1dAXdpdGhkcmF3LiBUaGlzIGNhbGN1bGF0aW9uIGFkZHMgc29tZSB3ZWlnaHQgb3ZlcmhlYWQgYW5kIGlzIG9ubHkgZGVmZW5zaXZlLiBJbiByZWFsaXR5LFUBcG9vbCBzbGFzaGVzIG11c3QgaGF2ZSBiZWVuIGFscmVhZHkgYXBwbGllZCB2aWEgcGVybWlzc2lvbmxlc3MgW2BDYWxsOjphcHBseV9zbGFzaGBdLhhjcmVhdGUQARhhbW91bnT9AQEwQmFsYW5jZU9mPFQ+AAEQcm9vdO0BAVBBY2NvdW50SWRMb29rdXBPZjxUPgABJG5vbWluYXRvcu0BAVBBY2NvdW50SWRMb29rdXBPZjxUPgABHGJvdW5jZXLtAQFQQWNjb3VudElkTG9va3VwT2Y8VD4ABkR0Q3JlYXRlIGEgbmV3IGRlbGVnYXRpb24gcG9vbC4ALCMgQXJndW1lbnRzAFUBKiBgYW1vdW50YCAtIFRoZSBhbW91bnQgb2YgZnVuZHMgdG8gZGVsZWdhdGUgdG8gdGhlIHBvb2wuIFRoaXMgYWxzbyBhY3RzIG9mIGEgc29ydCBvZk0BICBkZXBvc2l0IHNpbmNlIHRoZSBwb29scyBjcmVhdG9yIGNhbm5vdCBmdWxseSB1bmJvbmQgZnVuZHMgdW50aWwgdGhlIHBvb2wgaXMgYmVpbmcwICBkZXN0cm95ZWQuUQEqIGBpbmRleGAgLSBBIGRpc2FtYmlndWF0aW9uIGluZGV4IGZvciBjcmVhdGluZyB0aGUgYWNjb3VudC4gTGlrZWx5IG9ubHkgdXNlZnVsIHdoZW7AICBjcmVhdGluZyBtdWx0aXBsZSBwb29scyBpbiB0aGUgc2FtZSBleHRyaW5zaWMu1CogYHJvb3RgIC0gVGhlIGFjY291bnQgdG8gc2V0IGFzIFtgUG9vbFJvbGVzOjpyb290YF0uDQEqIGBub21pbmF0b3JgIC0gVGhlIGFjY291bnQgdG8gc2V0IGFzIHRoZSBbYFBvb2xSb2xlczo6bm9taW5hdG9yYF0u/CogYGJvdW5jZXJgIC0gVGhlIGFjY291bnQgdG8gc2V0IGFzIHRoZSBbYFBvb2xSb2xlczo6Ym91bmNlcmBdLgAYIyBOb3RlAGEBSW4gYWRkaXRpb24gdG8gYGFtb3VudGAsIHRoZSBjYWxsZXIgd2lsbCB0cmFuc2ZlciB0aGUgZXhpc3RlbnRpYWwgZGVwb3NpdDsgc28gdGhlIGNhbGxlcg0BbmVlZHMgYXQgaGF2ZSBhdCBsZWFzdCBgYW1vdW50ICsgZXhpc3RlbnRpYWxfZGVwb3NpdGAgdHJhbnNmZXJhYmxlLkxjcmVhdGVfd2l0aF9wb29sX2lkFAEYYW1vdW50/QEBMEJhbGFuY2VPZjxUPgABEHJvb3TtAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AASRub21pbmF0b3LtAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AARxib3VuY2Vy7QEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAEccG9vbF9pZBABGFBvb2xJZAAHGOxDcmVhdGUgYSBuZXcgZGVsZWdhdGlvbiBwb29sIHdpdGggYSBwcmV2aW91c2x5IHVzZWQgcG9vbCBpZAAsIyBBcmd1bWVudHMAmHNhbWUgYXMgYGNyZWF0ZWAgd2l0aCB0aGUgaW5jbHVzaW9uIG9meCogYHBvb2xfaWRgIC0gYEEgdmFsaWQgUG9vbElkLiBub21pbmF0ZQgBHHBvb2xfaWQQARhQb29sSWQAASh2YWxpZGF0b3JzAQIBRFZlYzxUOjpBY2NvdW50SWQ+AAgwfE5vbWluYXRlIG9uIGJlaGFsZiBvZiB0aGUgcG9vbC4ARQFUaGUgZGlzcGF0Y2ggb3JpZ2luIG9mIHRoaXMgY2FsbCBtdXN0IGJlIHNpZ25lZCBieSB0aGUgcG9vbCBub21pbmF0b3Igb3IgdGhlIHBvb2wocm9vdCByb2xlLgBFAVRoaXMgZGlyZWN0bHkgZm9yd2FyZHMgdGhlIGNhbGwgdG8gYW4gaW1wbGVtZW50YXRpb24gb2YgYFN0YWtpbmdJbnRlcmZhY2VgIChlLmcuLEUBYHBhbGxldC1zdGFraW5nYCkgdGhyb3VnaCBbYENvbmZpZzo6U3Rha2VBZGFwdGVyYF0sIG9uIGJlaGFsZiBvZiB0aGUgYm9uZGVkIHBvb2wuABgjIE5vdGUAWQFJbiBhZGRpdGlvbiB0byBhIGByb290YCBvciBgbm9taW5hdG9yYCByb2xlIG9mIGBvcmlnaW5gLCB0aGUgcG9vbCdzIGRlcG9zaXRvciBuZWVkcyB0bw0BaGF2ZSBhdCBsZWFzdCBgZGVwb3NpdG9yX21pbl9ib25kYCBpbiB0aGUgcG9vbCB0byBzdGFydCBub21pbmF0aW5nLiRzZXRfc3RhdGUIARxwb29sX2lkEAEYUG9vbElkAAEUc3RhdGVtAQEkUG9vbFN0YXRlAAkodFNldCBhIG5ldyBzdGF0ZSBmb3IgdGhlIHBvb2wuAFUBSWYgYSBwb29sIGlzIGFscmVhZHkgaW4gdGhlIGBEZXN0cm95aW5nYCBzdGF0ZSwgdGhlbiB1bmRlciBubyBjb25kaXRpb24gY2FuIGl0cyBzdGF0ZTRjaGFuZ2UgYWdhaW4uAMBUaGUgZGlzcGF0Y2ggb3JpZ2luIG9mIHRoaXMgY2FsbCBtdXN0IGJlIGVpdGhlcjoA3DEuIHNpZ25lZCBieSB0aGUgYm91bmNlciwgb3IgdGhlIHJvb3Qgcm9sZSBvZiB0aGUgcG9vbCxdATIuIGlmIHRoZSBwb29sIGNvbmRpdGlvbnMgdG8gYmUgb3BlbiBhcmUgTk9UIG1ldCAoYXMgZGVzY3JpYmVkIGJ5IGBva190b19iZV9vcGVuYCksIGFuZDkBICAgdGhlbiB0aGUgc3RhdGUgb2YgdGhlIHBvb2wgY2FuIGJlIHBlcm1pc3Npb25sZXNzbHkgY2hhbmdlZCB0byBgRGVzdHJveWluZ2AuMHNldF9tZXRhZGF0YQgBHHBvb2xfaWQQARhQb29sSWQAASBtZXRhZGF0YTgBHFZlYzx1OD4AChCAU2V0IGEgbmV3IG1ldGFkYXRhIGZvciB0aGUgcG9vbC4AXQFUaGUgZGlzcGF0Y2ggb3JpZ2luIG9mIHRoaXMgY2FsbCBtdXN0IGJlIHNpZ25lZCBieSB0aGUgYm91bmNlciwgb3IgdGhlIHJvb3Qgcm9sZSBvZiB0aGUUcG9vbC4sc2V0X2NvbmZpZ3MYATRtaW5fam9pbl9ib25kzQQBWENvbmZpZ09wPEJhbGFuY2VPZjxUPj4AATxtaW5fY3JlYXRlX2JvbmTNBAFYQ29uZmlnT3A8QmFsYW5jZU9mPFQ+PgABJG1heF9wb29sc9EEATRDb25maWdPcDx1MzI+AAEsbWF4X21lbWJlcnPRBAE0Q29uZmlnT3A8dTMyPgABUG1heF9tZW1iZXJzX3Blcl9wb29s0QQBNENvbmZpZ09wPHUzMj4AAVRnbG9iYWxfbWF4X2NvbW1pc3Npb27VBAFEQ29uZmlnT3A8UGVyYmlsbD4ACyxBAVVwZGF0ZSBjb25maWd1cmF0aW9ucyBmb3IgdGhlIG5vbWluYXRpb24gcG9vbHMuIFRoZSBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IGJlYFtgQ29uZmlnOjpBZG1pbk9yaWdpbmBdLgAsIyBBcmd1bWVudHMAoCogYG1pbl9qb2luX2JvbmRgIC0gU2V0IFtgTWluSm9pbkJvbmRgXS6wKiBgbWluX2NyZWF0ZV9ib25kYCAtIFNldCBbYE1pbkNyZWF0ZUJvbmRgXS6EKiBgbWF4X3Bvb2xzYCAtIFNldCBbYE1heFBvb2xzYF0upCogYG1heF9tZW1iZXJzYCAtIFNldCBbYE1heFBvb2xNZW1iZXJzYF0u5CogYG1heF9tZW1iZXJzX3Blcl9wb29sYCAtIFNldCBbYE1heFBvb2xNZW1iZXJzUGVyUG9vbGBdLuAqIGBnbG9iYWxfbWF4X2NvbW1pc3Npb25gIC0gU2V0IFtgR2xvYmFsTWF4Q29tbWlzc2lvbmBdLjB1cGRhdGVfcm9sZXMQARxwb29sX2lkEAEYUG9vbElkAAEgbmV3X3Jvb3TZBAFYQ29uZmlnT3A8VDo6QWNjb3VudElkPgABNG5ld19ub21pbmF0b3LZBAFYQ29uZmlnT3A8VDo6QWNjb3VudElkPgABLG5ld19ib3VuY2Vy2QQBWENvbmZpZ09wPFQ6OkFjY291bnRJZD4ADBx0VXBkYXRlIHRoZSByb2xlcyBvZiB0aGUgcG9vbC4APQFUaGUgcm9vdCBpcyB0aGUgb25seSBlbnRpdHkgdGhhdCBjYW4gY2hhbmdlIGFueSBvZiB0aGUgcm9sZXMsIGluY2x1ZGluZyBpdHNlbGYsuGV4Y2x1ZGluZyB0aGUgZGVwb3NpdG9yLCB3aG8gY2FuIG5ldmVyIGNoYW5nZS4AUQFJdCBlbWl0cyBhbiBldmVudCwgbm90aWZ5aW5nIFVJcyBvZiB0aGUgcm9sZSBjaGFuZ2UuIFRoaXMgZXZlbnQgaXMgcXVpdGUgcmVsZXZhbnQgdG8dAW1vc3QgcG9vbCBtZW1iZXJzIGFuZCB0aGV5IHNob3VsZCBiZSBpbmZvcm1lZCBvZiBjaGFuZ2VzIHRvIHBvb2wgcm9sZXMuFGNoaWxsBAEccG9vbF9pZBABGFBvb2xJZAANRHBDaGlsbCBvbiBiZWhhbGYgb2YgdGhlIHBvb2wuAEEBVGhlIGRpc3BhdGNoIG9yaWdpbiBvZiB0aGlzIGNhbGwgY2FuIGJlIHNpZ25lZCBieSB0aGUgcG9vbCBub21pbmF0b3Igb3IgdGhlIHBvb2ygcm9vdCByb2xlLCBzYW1lIGFzIFtgUGFsbGV0Ojpub21pbmF0ZWBdLgBFAVRoaXMgZGlyZWN0bHkgZm9yd2FyZHMgdGhlIGNhbGwgdG8gYW4gaW1wbGVtZW50YXRpb24gb2YgYFN0YWtpbmdJbnRlcmZhY2VgIChlLmcuLEUBYHBhbGxldC1zdGFraW5nYCkgdGhyb3VnaCBbYENvbmZpZzo6U3Rha2VBZGFwdGVyYF0sIG9uIGJlaGFsZiBvZiB0aGUgYm9uZGVkIHBvb2wuAE0BVW5kZXIgY2VydGFpbiBjb25kaXRpb25zLCB0aGlzIGNhbGwgY2FuIGJlIGRpc3BhdGNoZWQgcGVybWlzc2lvbmxlc3NseSAoaS5lLiBieSBhbnkkYWNjb3VudCkuAKwjIENvbmRpdGlvbnMgZm9yIGEgcGVybWlzc2lvbmxlc3MgZGlzcGF0Y2g6VQEqIFdoZW4gcG9vbCBkZXBvc2l0b3IgaGFzIGxlc3MgdGhhbiBgTWluTm9taW5hdG9yQm9uZGAgc3Rha2VkLCBvdGhlcndpc2UgcG9vbCBtZW1iZXJzXCAgYXJlIHVuYWJsZSB0byB1bmJvbmQuAJwjIENvbmRpdGlvbnMgZm9yIHBlcm1pc3Npb25lZCBkaXNwYXRjaDq0KiBUaGUgY2FsbGVyIGlzIHRoZSBwb29sJ3Mgbm9taW5hdG9yIG9yIHJvb3QuQGJvbmRfZXh0cmFfb3RoZXIIARhtZW1iZXLtAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AARRleHRyYckEAVxCb25kRXh0cmE8QmFsYW5jZU9mPFQ+PgAOJFUBYG9yaWdpbmAgYm9uZHMgZnVuZHMgZnJvbSBgZXh0cmFgIGZvciBzb21lIHBvb2wgbWVtYmVyIGBtZW1iZXJgIGludG8gdGhlaXIgcmVzcGVjdGl2ZRhwb29scy4ASQFgb3JpZ2luYCBjYW4gYm9uZCBleHRyYSBmdW5kcyBmcm9tIGZyZWUgYmFsYW5jZSBvciBwZW5kaW5nIHJld2FyZHMgd2hlbiBgb3JpZ2luID09HG90aGVyYC4ARQFJbiB0aGUgY2FzZSBvZiBgb3JpZ2luICE9IG90aGVyYCwgYG9yaWdpbmAgY2FuIG9ubHkgYm9uZCBleHRyYSBwZW5kaW5nIHJld2FyZHMgb2YVAWBvdGhlcmAgbWVtYmVycyBhc3N1bWluZyBzZXRfY2xhaW1fcGVybWlzc2lvbiBmb3IgdGhlIGdpdmVuIG1lbWJlciBpc8BgUGVybWlzc2lvbmxlc3NDb21wb3VuZGAgb3IgYFBlcm1pc3Npb25sZXNzQWxsYC5Qc2V0X2NsYWltX3Blcm1pc3Npb24EAShwZXJtaXNzaW9uhQEBPENsYWltUGVybWlzc2lvbgAPHEkBQWxsb3dzIGEgcG9vbCBtZW1iZXIgdG8gc2V0IGEgY2xhaW0gcGVybWlzc2lvbiB0byBhbGxvdyBvciBkaXNhbGxvdyBwZXJtaXNzaW9ubGVzc2Bib25kaW5nIGFuZCB3aXRoZHJhd2luZy4ALCMgQXJndW1lbnRzAHgqIGBvcmlnaW5gIC0gTWVtYmVyIG9mIGEgcG9vbC64KiBgcGVybWlzc2lvbmAgLSBUaGUgcGVybWlzc2lvbiB0byBiZSBhcHBsaWVkLkhjbGFpbV9wYXlvdXRfb3RoZXIEARRvdGhlcgABMFQ6OkFjY291bnRJZAAQEAEBYG9yaWdpbmAgY2FuIGNsYWltIHBheW91dHMgb24gc29tZSBwb29sIG1lbWJlciBgb3RoZXJgJ3MgYmVoYWxmLgBVAVBvb2wgbWVtYmVyIGBvdGhlcmAgbXVzdCBoYXZlIGEgYFBlcm1pc3Npb25sZXNzV2l0aGRyYXdgIG9yIGBQZXJtaXNzaW9ubGVzc0FsbGAgY2xhaW2ocGVybWlzc2lvbiBmb3IgdGhpcyBjYWxsIHRvIGJlIHN1Y2Nlc3NmdWwuOHNldF9jb21taXNzaW9uCAEccG9vbF9pZBABGFBvb2xJZAABOG5ld19jb21taXNzaW9ucQEBfE9wdGlvbjwoUGVyYmlsbCwgVDo6QWNjb3VudElkKT4AERR0U2V0IHRoZSBjb21taXNzaW9uIG9mIGEgcG9vbC5VAUJvdGggYSBjb21taXNzaW9uIHBlcmNlbnRhZ2UgYW5kIGEgY29tbWlzc2lvbiBwYXllZSBtdXN0IGJlIHByb3ZpZGVkIGluIHRoZSBgY3VycmVudGBdAXR1cGxlLiBXaGVyZSBhIGBjdXJyZW50YCBvZiBgTm9uZWAgaXMgcHJvdmlkZWQsIGFueSBjdXJyZW50IGNvbW1pc3Npb24gd2lsbCBiZSByZW1vdmVkLgBNAS0gSWYgYSBgTm9uZWAgaXMgc3VwcGxpZWQgdG8gYG5ld19jb21taXNzaW9uYCwgZXhpc3RpbmcgY29tbWlzc2lvbiB3aWxsIGJlIHJlbW92ZWQuSHNldF9jb21taXNzaW9uX21heAgBHHBvb2xfaWQQARhQb29sSWQAAThtYXhfY29tbWlzc2lvbpgBHFBlcmJpbGwAEhSUU2V0IHRoZSBtYXhpbXVtIGNvbW1pc3Npb24gb2YgYSBwb29sLgA5AS0gSW5pdGlhbCBtYXggY2FuIGJlIHNldCB0byBhbnkgYFBlcmJpbGxgLCBhbmQgb25seSBzbWFsbGVyIHZhbHVlcyB0aGVyZWFmdGVyLjUBLSBDdXJyZW50IGNvbW1pc3Npb24gd2lsbCBiZSBsb3dlcmVkIGluIHRoZSBldmVudCBpdCBpcyBoaWdoZXIgdGhhbiBhIG5ldyBtYXg0ICBjb21taXNzaW9uLmhzZXRfY29tbWlzc2lvbl9jaGFuZ2VfcmF0ZQgBHHBvb2xfaWQQARhQb29sSWQAASxjaGFuZ2VfcmF0ZXkBAZxDb21taXNzaW9uQ2hhbmdlUmF0ZTxCbG9ja051bWJlckZvcjxUPj4AExCoU2V0IHRoZSBjb21taXNzaW9uIGNoYW5nZSByYXRlIGZvciBhIHBvb2wuAD0BSW5pdGlhbCBjaGFuZ2UgcmF0ZSBpcyBub3QgYm91bmRlZCwgd2hlcmVhcyBzdWJzZXF1ZW50IHVwZGF0ZXMgY2FuIG9ubHkgYmUgbW9yZXRyZXN0cmljdGl2ZSB0aGFuIHRoZSBjdXJyZW50LkBjbGFpbV9jb21taXNzaW9uBAEccG9vbF9pZBABGFBvb2xJZAAUQGRDbGFpbSBwZW5kaW5nIGNvbW1pc3Npb24uAD0BVGhlIGByb290YCByb2xlIG9mIHRoZSBwb29sIGlzIF9hbHdheXNfIGFsbG93ZWQgdG8gY2xhaW0gdGhlIHBvb2wncyBjb21taXNzaW9uLgBVAUlmIHRoZSBwb29sIGhhcyBzZXQgYENvbW1pc3Npb25DbGFpbVBlcm1pc3Npb246OlBlcm1pc3Npb25sZXNzYCwgdGhlbiBhbnkgYWNjb3VudCBjYW7YdHJpZ2dlciB0aGUgcHJvY2VzcyBvZiBjbGFpbWluZyB0aGUgcG9vbCdzIGNvbW1pc3Npb24uAEEBSWYgdGhlIHBvb2wgaGFzIHNldCBpdHMgYENvbW1pc3Npb25DbGFpbVBlcm1pc3Npb25gIHRvIGBBY2NvdW50KGFjYylgLCB0aGVuIG9ubHkgYWNjb3VudHMwKiBgYWNjYCwgYW5kZCogdGhlIHBvb2wncyByb290IGFjY291bnQAuG1heSBjYWxsIHRoaXMgZXh0cmluc2ljIG9uIGJlaGFsZiBvZiB0aGUgcG9vbC4ALQFQZW5kaW5nIGNvbW1pc3Npb25zIGFyZSBwYWlkIG91dCBhbmQgYWRkZWQgdG8gdGhlIHRvdGFsIGNsYWltZWQgY29tbWlzc2lvbi64VGhlIHRvdGFsIHBlbmRpbmcgY29tbWlzc2lvbiBpcyByZXNldCB0byB6ZXJvLkxhZGp1c3RfcG9vbF9kZXBvc2l0BAEccG9vbF9pZBABGFBvb2xJZAAVHOxUb3AgdXAgdGhlIGRlZmljaXQgb3Igd2l0aGRyYXcgdGhlIGV4Y2VzcyBFRCBmcm9tIHRoZSBwb29sLgBRAVdoZW4gYSBwb29sIGlzIGNyZWF0ZWQsIHRoZSBwb29sIGRlcG9zaXRvciB0cmFuc2ZlcnMgRUQgdG8gdGhlIHJld2FyZCBhY2NvdW50IG9mIHRoZVUBcG9vbC4gRUQgaXMgc3ViamVjdCB0byBjaGFuZ2UgYW5kIG92ZXIgdGltZSwgdGhlIGRlcG9zaXQgaW4gdGhlIHJld2FyZCBhY2NvdW50IG1heSBiZVEBaW5zdWZmaWNpZW50IHRvIGNvdmVyIHRoZSBFRCBkZWZpY2l0IG9mIHRoZSBwb29sIG9yIHZpY2UtdmVyc2Egd2hlcmUgdGhlcmUgaXMgZXhjZXNzMQFkZXBvc2l0IHRvIHRoZSBwb29sLiBUaGlzIGNhbGwgYWxsb3dzIGFueW9uZSB0byBhZGp1c3QgdGhlIEVEIGRlcG9zaXQgb2YgdGhl9HBvb2wgYnkgZWl0aGVyIHRvcHBpbmcgdXAgdGhlIGRlZmljaXQgb3IgY2xhaW1pbmcgdGhlIGV4Y2Vzcy58c2V0X2NvbW1pc3Npb25fY2xhaW1fcGVybWlzc2lvbggBHHBvb2xfaWQQARhQb29sSWQAAShwZXJtaXNzaW9ufQEBvE9wdGlvbjxDb21taXNzaW9uQ2xhaW1QZXJtaXNzaW9uPFQ6OkFjY291bnRJZD4+ABYQzFNldCBvciByZW1vdmUgYSBwb29sJ3MgY29tbWlzc2lvbiBjbGFpbSBwZXJtaXNzaW9uLgBhAURldGVybWluZXMgd2hvIGNhbiBjbGFpbSB0aGUgcG9vbCdzIHBlbmRpbmcgY29tbWlzc2lvbi4gT25seSB0aGUgYFJvb3RgIHJvbGUgb2YgdGhlIHBvb2zIaXMgYWJsZSB0byBjb25maWd1cmUgY29tbWlzc2lvbiBjbGFpbSBwZXJtaXNzaW9ucy4sYXBwbHlfc2xhc2gEAThtZW1iZXJfYWNjb3VudO0BAVBBY2NvdW50SWRMb29rdXBPZjxUPgAXJIhBcHBseSBhIHBlbmRpbmcgc2xhc2ggb24gYSBtZW1iZXIuACUBRmFpbHMgdW5sZXNzIFtgY3JhdGU6OnBhbGxldDo6Q29uZmlnOjpTdGFrZUFkYXB0ZXJgXSBpcyBvZiBzdHJhdGVneSB0eXBlOqRbYGFkYXB0ZXI6OlN0YWtlU3RyYXRlZ3lUeXBlOjpEZWxlZ2F0ZWBdLgBdAVRoZSBwZW5kaW5nIHNsYXNoIGFtb3VudCBvZiB0aGUgbWVtYmVyIG11c3QgYmUgZXF1YWwgb3IgbW9yZSB0aGFuIGBFeGlzdGVudGlhbERlcG9zaXRgLlEBVGhpcyBjYWxsIGNhbiBiZSBkaXNwYXRjaGVkIHBlcm1pc3Npb25sZXNzbHkgKGkuZS4gYnkgYW55IGFjY291bnQpLiBJZiB0aGUgZXhlY3V0aW9uSQFpcyBzdWNjZXNzZnVsLCBmZWUgaXMgcmVmdW5kZWQgYW5kIGNhbGxlciBtYXkgYmUgcmV3YXJkZWQgd2l0aCBhIHBhcnQgb2YgdGhlIHNsYXNoDQFiYXNlZCBvbiB0aGUgW2BjcmF0ZTo6cGFsbGV0OjpDb25maWc6OlN0YWtlQWRhcHRlcmBdIGNvbmZpZ3VyYXRpb24uSG1pZ3JhdGVfZGVsZWdhdGlvbgQBOG1lbWJlcl9hY2NvdW507QEBUEFjY291bnRJZExvb2t1cE9mPFQ+ABgkHQFNaWdyYXRlcyBkZWxlZ2F0ZWQgZnVuZHMgZnJvbSB0aGUgcG9vbCBhY2NvdW50IHRvIHRoZSBgbWVtYmVyX2FjY291bnRgLgAlAUZhaWxzIHVubGVzcyBbYGNyYXRlOjpwYWxsZXQ6OkNvbmZpZzo6U3Rha2VBZGFwdGVyYF0gaXMgb2Ygc3RyYXRlZ3kgdHlwZTqkW2BhZGFwdGVyOjpTdGFrZVN0cmF0ZWd5VHlwZTo6RGVsZWdhdGVgXS4AKQFUaGlzIGlzIGEgcGVybWlzc2lvbi1sZXNzIGNhbGwgYW5kIHJlZnVuZHMgYW55IGZlZSBpZiBjbGFpbSBpcyBzdWNjZXNzZnVsLgBdAUlmIHRoZSBwb29sIGhhcyBtaWdyYXRlZCB0byBkZWxlZ2F0aW9uIGJhc2VkIHN0YWtpbmcsIHRoZSBzdGFrZWQgdG9rZW5zIG9mIHBvb2wgbWVtYmVycykBY2FuIGJlIG1vdmVkIGFuZCBoZWxkIGluIHRoZWlyIG93biBhY2NvdW50LiBTZWUgW2BhZGFwdGVyOjpEZWxlZ2F0ZVN0YWtlYF14bWlncmF0ZV9wb29sX3RvX2RlbGVnYXRlX3N0YWtlBAEccG9vbF9pZBABGFBvb2xJZAAZJPRNaWdyYXRlIHBvb2wgZnJvbSBbYGFkYXB0ZXI6OlN0YWtlU3RyYXRlZ3lUeXBlOjpUcmFuc2ZlcmBdIHRvpFtgYWRhcHRlcjo6U3Rha2VTdHJhdGVneVR5cGU6OkRlbGVnYXRlYF0uACUBRmFpbHMgdW5sZXNzIFtgY3JhdGU6OnBhbGxldDo6Q29uZmlnOjpTdGFrZUFkYXB0ZXJgXSBpcyBvZiBzdHJhdGVneSB0eXBlOqRbYGFkYXB0ZXI6OlN0YWtlU3RyYXRlZ3lUeXBlOjpEZWxlZ2F0ZWBdLgBBAVRoaXMgY2FsbCBjYW4gYmUgZGlzcGF0Y2hlZCBwZXJtaXNzaW9ubGVzc2x5LCBhbmQgcmVmdW5kcyBhbnkgZmVlIGlmIHN1Y2Nlc3NmdWwuAEkBSWYgdGhlIHBvb2wgaGFzIGFscmVhZHkgbWlncmF0ZWQgdG8gZGVsZWdhdGlvbiBiYXNlZCBzdGFraW5nLCB0aGlzIGNhbGwgd2lsbCBmYWlsLgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy7JBAhccGFsbGV0X25vbWluYXRpb25fcG9vbHMkQm9uZEV4dHJhBBxCYWxhbmNlARgBCCxGcmVlQmFsYW5jZQQAGAEcQmFsYW5jZQAAABxSZXdhcmRzAAEAAM0ECFxwYWxsZXRfbm9taW5hdGlvbl9wb29scyBDb25maWdPcAQEVAEYAQwQTm9vcAAAAAxTZXQEABgBBFQAAQAYUmVtb3ZlAAIAANEECFxwYWxsZXRfbm9taW5hdGlvbl9wb29scyBDb25maWdPcAQEVAEQAQwQTm9vcAAAAAxTZXQEABABBFQAAQAYUmVtb3ZlAAIAANUECFxwYWxsZXRfbm9taW5hdGlvbl9wb29scyBDb25maWdPcAQEVAGYAQwQTm9vcAAAAAxTZXQEAJgBBFQAAQAYUmVtb3ZlAAIAANkECFxwYWxsZXRfbm9taW5hdGlvbl9wb29scyBDb25maWdPcAQEVAEAAQwQTm9vcAAAAAxTZXQEAAABBFQAAQAYUmVtb3ZlAAIAAN0EDExwYWxsZXRfZmFzdF91bnN0YWtlGHBhbGxldBBDYWxsBARUAAEMVHJlZ2lzdGVyX2Zhc3RfdW5zdGFrZQAAaIhSZWdpc3RlciBvbmVzZWxmIGZvciBmYXN0LXVuc3Rha2UuAEgjIyBEaXNwYXRjaCBPcmlnaW4ARQFUaGUgZGlzcGF0Y2ggb3JpZ2luIG9mIHRoaXMgY2FsbCBtdXN0IGJlICpzaWduZWQqIGJ5IHdob2V2ZXIgaXMgcGVybWl0dGVkIHRvIGNhbGzwdW5ib25kIGZ1bmRzIGJ5IHRoZSBzdGFraW5nIHN5c3RlbS4gU2VlIFtgQ29uZmlnOjpTdGFraW5nYF0uACgjIyBEZXRhaWxzADkBVGhlIHN0YXNoIGFzc29jaWF0ZWQgd2l0aCB0aGUgb3JpZ2luIG11c3QgaGF2ZSBubyBvbmdvaW5nIHVubG9ja2luZyBjaHVua3MuIElmXQFzdWNjZXNzZnVsLCB0aGlzIHdpbGwgZnVsbHkgdW5ib25kIGFuZCBjaGlsbCB0aGUgc3Rhc2guIFRoZW4sIGl0IHdpbGwgZW5xdWV1ZSB0aGUgc3Rhc2iAdG8gYmUgY2hlY2tlZCBpbiBmdXJ0aGVyIGJsb2Nrcy4AUQFJZiBieSB0aGUgdGltZSB0aGlzIGlzIGNhbGxlZCwgdGhlIHN0YXNoIGlzIGFjdHVhbGx5IGVsaWdpYmxlIGZvciBmYXN0LXVuc3Rha2UsIHRoZW5FAXRoZXkgYXJlIGd1YXJhbnRlZWQgdG8gcmVtYWluIGVsaWdpYmxlLCBiZWNhdXNlIHRoZSBjYWxsIHdpbGwgY2hpbGwgdGhlbSBhcyB3ZWxsLgA9AUlmIHRoZSBjaGVjayB3b3JrcywgdGhlIGVudGlyZSBzdGFraW5nIGRhdGEgaXMgcmVtb3ZlZCwgaS5lLiB0aGUgc3Rhc2ggaXMgZnVsbHkkdW5zdGFrZWQuAF0BSWYgdGhlIGNoZWNrIGZhaWxzLCB0aGUgc3Rhc2ggcmVtYWlucyBjaGlsbGVkIGFuZCB3YWl0aW5nIGZvciBiZWluZyB1bmJvbmRlZCBhcyBpbiB3aXRoYQF0aGUgbm9ybWFsIHN0YWtpbmcgc3lzdGVtLCBidXQgdGhleSBsb3NlIHBhcnQgb2YgdGhlaXIgdW5ib25kaW5nIGNodW5rcyBkdWUgdG8gY29uc3VtaW5nWHRoZSBjaGFpbidzIHJlc291cmNlcy4AJCMjIEV2ZW50cwAJAVNvbWUgZXZlbnRzIGZyb20gdGhlIHN0YWtpbmcgYW5kIGN1cnJlbmN5IHN5c3RlbSBtaWdodCBiZSBlbWl0dGVkLihkZXJlZ2lzdGVyAAFIpERlcmVnaXN0ZXIgb25lc2VsZiBmcm9tIHRoZSBmYXN0LXVuc3Rha2UuAEgjIyBEaXNwYXRjaCBPcmlnaW4ARQFUaGUgZGlzcGF0Y2ggb3JpZ2luIG9mIHRoaXMgY2FsbCBtdXN0IGJlICpzaWduZWQqIGJ5IHdob2V2ZXIgaXMgcGVybWl0dGVkIHRvIGNhbGzwdW5ib25kIGZ1bmRzIGJ5IHRoZSBzdGFraW5nIHN5c3RlbS4gU2VlIFtgQ29uZmlnOjpTdGFraW5nYF0uACgjIyBEZXRhaWxzAGEBVGhpcyBpcyB1c2VmdWwgaWYgb25lIGlzIHJlZ2lzdGVyZWQsIHRoZXkgYXJlIHN0aWxsIHdhaXRpbmcsIGFuZCB0aGV5IGNoYW5nZSB0aGVpciBtaW5kLgBZAU5vdGUgdGhhdCB0aGUgYXNzb2NpYXRlZCBzdGFzaCBpcyBzdGlsbCBmdWxseSB1bmJvbmRlZCBhbmQgY2hpbGxlZCBhcyBhIGNvbnNlcXVlbmNlIG9mWQFjYWxsaW5nIFtgUGFsbGV0OjpyZWdpc3Rlcl9mYXN0X3Vuc3Rha2VgXS4gVGhlcmVmb3JlLCB0aGlzIHNob3VsZCBwcm9iYWJseSBiZSBmb2xsb3dlZLBieSBhIGNhbGwgdG8gYHJlYm9uZGAgaW4gdGhlIHN0YWtpbmcgc3lzdGVtLgAkIyMgRXZlbnRzAAkBU29tZSBldmVudHMgZnJvbSB0aGUgc3Rha2luZyBhbmQgY3VycmVuY3kgc3lzdGVtIG1pZ2h0IGJlIGVtaXR0ZWQuHGNvbnRyb2wEATRlcmFzX3RvX2NoZWNrEAEgRXJhSW5kZXgAAjSUQ29udHJvbCB0aGUgb3BlcmF0aW9uIG9mIHRoaXMgcGFsbGV0LgBIIyMgRGlzcGF0Y2ggT3JpZ2luAA0BVGhlIGRpc3BhdGNoIG9yaWdpbiBvZiB0aGlzIGNhbGwgbXVzdCBiZSBbYENvbmZpZzo6Q29udHJvbE9yaWdpbmBdLgAoIyMgRGV0YWlscwBBAUNhbiBzZXQgdGhlIG51bWJlciBvZiBlcmFzIHRvIGNoZWNrIHBlciBibG9jaywgYW5kIHBvdGVudGlhbGx5IG90aGVyIGFkbWluIHdvcmsuACQjIyBFdmVudHMApE5vIGV2ZW50cyBhcmUgZW1pdHRlZCBmcm9tIHRoaXMgZGlzcGF0Y2guBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLuEEDGBwYWxsZXRfY29udmljdGlvbl92b3RpbmcYcGFsbGV0EENhbGwIBFQABEkAARgQdm90ZQgBKHBvbGxfaW5kZXjJAQFEUG9sbEluZGV4T2Y8VCwgST4AARB2b3RlmQEBcEFjY291bnRWb3RlPEJhbGFuY2VPZjxULCBJPj4AACQZAVZvdGUgaW4gYSBwb2xsLiBJZiBgdm90ZS5pc19heWUoKWAsIHRoZSB2b3RlIGlzIHRvIGVuYWN0IHRoZSBwcm9wb3NhbDu4b3RoZXJ3aXNlIGl0IGlzIGEgdm90ZSB0byBrZWVwIHRoZSBzdGF0dXMgcXVvLgDIVGhlIGRpc3BhdGNoIG9yaWdpbiBvZiB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXy4AyC0gYHBvbGxfaW5kZXhgOiBUaGUgaW5kZXggb2YgdGhlIHBvbGwgdG8gdm90ZSBmb3IuhC0gYHZvdGVgOiBUaGUgdm90ZSBjb25maWd1cmF0aW9uLgAVAVdlaWdodDogYE8oUilgIHdoZXJlIFIgaXMgdGhlIG51bWJlciBvZiBwb2xscyB0aGUgdm90ZXIgaGFzIHZvdGVkIG9uLiBkZWxlZ2F0ZRABFGNsYXNzQQEBNENsYXNzT2Y8VCwgST4AAQh0b+0BAVBBY2NvdW50SWRMb29rdXBPZjxUPgABKGNvbnZpY3Rpb27lBAEoQ29udmljdGlvbgABHGJhbGFuY2UYATxCYWxhbmNlT2Y8VCwgST4AAVxNAURlbGVnYXRlIHRoZSB2b3RpbmcgcG93ZXIgKHdpdGggc29tZSBnaXZlbiBjb252aWN0aW9uKSBvZiB0aGUgc2VuZGluZyBhY2NvdW50IGZvciBhaHBhcnRpY3VsYXIgY2xhc3Mgb2YgcG9sbHMuAFUBVGhlIGJhbGFuY2UgZGVsZWdhdGVkIGlzIGxvY2tlZCBmb3IgYXMgbG9uZyBhcyBpdCdzIGRlbGVnYXRlZCwgYW5kIHRoZXJlYWZ0ZXIgZm9yIHRoZch0aW1lIGFwcHJvcHJpYXRlIGZvciB0aGUgY29udmljdGlvbidzIGxvY2sgcGVyaW9kLgBdAVRoZSBkaXNwYXRjaCBvcmlnaW4gb2YgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8sIGFuZCB0aGUgc2lnbmluZyBhY2NvdW50IG11c3QgZWl0aGVyOnQgIC0gYmUgZGVsZWdhdGluZyBhbHJlYWR5OyBvckUBICAtIGhhdmUgbm8gdm90aW5nIGFjdGl2aXR5IChpZiB0aGVyZSBpcywgdGhlbiBpdCB3aWxsIG5lZWQgdG8gYmUgcmVtb3ZlZCB0aHJvdWdoTCAgICBgcmVtb3ZlX3ZvdGVgKS4ARQEtIGB0b2A6IFRoZSBhY2NvdW50IHdob3NlIHZvdGluZyB0aGUgYHRhcmdldGAgYWNjb3VudCdzIHZvdGluZyBwb3dlciB3aWxsIGZvbGxvdy5dAS0gYGNsYXNzYDogVGhlIGNsYXNzIG9mIHBvbGxzIHRvIGRlbGVnYXRlLiBUbyBkZWxlZ2F0ZSBtdWx0aXBsZSBjbGFzc2VzLCBtdWx0aXBsZSBjYWxsc4AgIHRvIHRoaXMgZnVuY3Rpb24gYXJlIHJlcXVpcmVkLlUBLSBgY29udmljdGlvbmA6IFRoZSBjb252aWN0aW9uIHRoYXQgd2lsbCBiZSBhdHRhY2hlZCB0byB0aGUgZGVsZWdhdGVkIHZvdGVzLiBXaGVuIHRoZUEBICBhY2NvdW50IGlzIHVuZGVsZWdhdGVkLCB0aGUgZnVuZHMgd2lsbCBiZSBsb2NrZWQgZm9yIHRoZSBjb3JyZXNwb25kaW5nIHBlcmlvZC5hAS0gYGJhbGFuY2VgOiBUaGUgYW1vdW50IG9mIHRoZSBhY2NvdW50J3MgYmFsYW5jZSB0byBiZSB1c2VkIGluIGRlbGVnYXRpbmcuIFRoaXMgbXVzdCBub3S0ICBiZSBtb3JlIHRoYW4gdGhlIGFjY291bnQncyBjdXJyZW50IGJhbGFuY2UuAEhFbWl0cyBgRGVsZWdhdGVkYC4AJQFXZWlnaHQ6IGBPKFIpYCB3aGVyZSBSIGlzIHRoZSBudW1iZXIgb2YgcG9sbHMgdGhlIHZvdGVyIGRlbGVnYXRpbmcgdG8gaGFzTQEgIHZvdGVkIG9uLiBXZWlnaHQgaXMgaW5pdGlhbGx5IGNoYXJnZWQgYXMgaWYgbWF4aW11bSB2b3RlcywgYnV0IGlzIHJlZnVuZGVkIGxhdGVyLih1bmRlbGVnYXRlBAEUY2xhc3NBAQE0Q2xhc3NPZjxULCBJPgACOE0BVW5kZWxlZ2F0ZSB0aGUgdm90aW5nIHBvd2VyIG9mIHRoZSBzZW5kaW5nIGFjY291bnQgZm9yIGEgcGFydGljdWxhciBjbGFzcyBvZiBwb2xscy4AXQFUb2tlbnMgbWF5IGJlIHVubG9ja2VkIGZvbGxvd2luZyBvbmNlIGFuIGFtb3VudCBvZiB0aW1lIGNvbnNpc3RlbnQgd2l0aCB0aGUgbG9jayBwZXJpb2QJAW9mIHRoZSBjb252aWN0aW9uIHdpdGggd2hpY2ggdGhlIGRlbGVnYXRpb24gd2FzIGlzc3VlZCBoYXMgcGFzc2VkLgBFAVRoZSBkaXNwYXRjaCBvcmlnaW4gb2YgdGhpcyBjYWxsIG11c3QgYmUgX1NpZ25lZF8gYW5kIHRoZSBzaWduaW5nIGFjY291bnQgbXVzdCBiZVRjdXJyZW50bHkgZGVsZWdhdGluZy4A8C0gYGNsYXNzYDogVGhlIGNsYXNzIG9mIHBvbGxzIHRvIHJlbW92ZSB0aGUgZGVsZWdhdGlvbiBmcm9tLgBQRW1pdHMgYFVuZGVsZWdhdGVkYC4AJQFXZWlnaHQ6IGBPKFIpYCB3aGVyZSBSIGlzIHRoZSBudW1iZXIgb2YgcG9sbHMgdGhlIHZvdGVyIGRlbGVnYXRpbmcgdG8gaGFzTQEgIHZvdGVkIG9uLiBXZWlnaHQgaXMgaW5pdGlhbGx5IGNoYXJnZWQgYXMgaWYgbWF4aW11bSB2b3RlcywgYnV0IGlzIHJlZnVuZGVkIGxhdGVyLhh1bmxvY2sIARRjbGFzc0EBATRDbGFzc09mPFQsIEk+AAEYdGFyZ2V07QEBUEFjY291bnRJZExvb2t1cE9mPFQ+AAMkXQFSZW1vdmUgdGhlIGxvY2sgY2F1c2VkIGJ5IHByaW9yIHZvdGluZy9kZWxlZ2F0aW5nIHdoaWNoIGhhcyBleHBpcmVkIHdpdGhpbiBhIHBhcnRpY3VsYXIYY2xhc3MuAMhUaGUgZGlzcGF0Y2ggb3JpZ2luIG9mIHRoaXMgY2FsbCBtdXN0IGJlIF9TaWduZWRfLgCgLSBgY2xhc3NgOiBUaGUgY2xhc3Mgb2YgcG9sbHMgdG8gdW5sb2NrLrgtIGB0YXJnZXRgOiBUaGUgYWNjb3VudCB0byByZW1vdmUgdGhlIGxvY2sgb24uALxXZWlnaHQ6IGBPKFIpYCB3aXRoIFIgbnVtYmVyIG9mIHZvdGUgb2YgdGFyZ2V0LixyZW1vdmVfdm90ZQgBFGNsYXNz6QQBVE9wdGlvbjxDbGFzc09mPFQsIEk+PgABFGluZGV4EAFEUG9sbEluZGV4T2Y8VCwgST4ABHRkUmVtb3ZlIGEgdm90ZSBmb3IgYSBwb2xsLgAMSWY6cC0gdGhlIHBvbGwgd2FzIGNhbmNlbGxlZCwgb3JkLSB0aGUgcG9sbCBpcyBvbmdvaW5nLCBvcngtIHRoZSBwb2xsIGhhcyBlbmRlZCBzdWNoIHRoYXT8ICAtIHRoZSB2b3RlIG9mIHRoZSBhY2NvdW50IHdhcyBpbiBvcHBvc2l0aW9uIHRvIHRoZSByZXN1bHQ7IG9y1CAgLSB0aGVyZSB3YXMgbm8gY29udmljdGlvbiB0byB0aGUgYWNjb3VudCdzIHZvdGU7IG9yhCAgLSB0aGUgYWNjb3VudCBtYWRlIGEgc3BsaXQgdm90ZV0BLi4udGhlbiB0aGUgdm90ZSBpcyByZW1vdmVkIGNsZWFubHkgYW5kIGEgZm9sbG93aW5nIGNhbGwgdG8gYHVubG9ja2AgbWF5IHJlc3VsdCBpbiBtb3JlWGZ1bmRzIGJlaW5nIGF2YWlsYWJsZS4AkElmLCBob3dldmVyLCB0aGUgcG9sbCBoYXMgZW5kZWQgYW5kOuwtIGl0IGZpbmlzaGVkIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHZvdGUgb2YgdGhlIGFjY291bnQsIGFuZNwtIHRoZSBhY2NvdW50IG1hZGUgYSBzdGFuZGFyZCB2b3RlIHdpdGggY29udmljdGlvbiwgYW5kvC0gdGhlIGxvY2sgcGVyaW9kIG9mIHRoZSBjb252aWN0aW9uIGlzIG5vdCBvdmVyWQEuLi50aGVuIHRoZSBsb2NrIHdpbGwgYmUgYWdncmVnYXRlZCBpbnRvIHRoZSBvdmVyYWxsIGFjY291bnQncyBsb2NrLCB3aGljaCBtYXkgaW52b2x2ZVkBKm92ZXJsb2NraW5nKiAod2hlcmUgdGhlIHR3byBsb2NrcyBhcmUgY29tYmluZWQgaW50byBhIHNpbmdsZSBsb2NrIHRoYXQgaXMgdGhlIG1heGltdW3kb2YgYm90aCB0aGUgYW1vdW50IGxvY2tlZCBhbmQgdGhlIHRpbWUgaXMgaXQgbG9ja2VkIGZvcikuAEkBVGhlIGRpc3BhdGNoIG9yaWdpbiBvZiB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXywgYW5kIHRoZSBzaWduZXIgbXVzdCBoYXZlIGEgdm90ZXByZWdpc3RlcmVkIGZvciBwb2xsIGBpbmRleGAuANwtIGBpbmRleGA6IFRoZSBpbmRleCBvZiBwb2xsIG9mIHRoZSB2b3RlIHRvIGJlIHJlbW92ZWQuVQEtIGBjbGFzc2A6IE9wdGlvbmFsIHBhcmFtZXRlciwgaWYgZ2l2ZW4gaXQgaW5kaWNhdGVzIHRoZSBjbGFzcyBvZiB0aGUgcG9sbC4gRm9yIHBvbGxz8CAgd2hpY2ggaGF2ZSBmaW5pc2hlZCBvciBhcmUgY2FuY2VsbGVkLCB0aGlzIG11c3QgYmUgYFNvbWVgLgBFAVdlaWdodDogYE8oUiArIGxvZyBSKWAgd2hlcmUgUiBpcyB0aGUgbnVtYmVyIG9mIHBvbGxzIHRoYXQgYHRhcmdldGAgaGFzIHZvdGVkIG9uLtggIFdlaWdodCBpcyBjYWxjdWxhdGVkIGZvciB0aGUgbWF4aW11bSBudW1iZXIgb2Ygdm90ZS5EcmVtb3ZlX290aGVyX3ZvdGUMARh0YXJnZXTtAQFQQWNjb3VudElkTG9va3VwT2Y8VD4AARRjbGFzc0EBATRDbGFzc09mPFQsIEk+AAEUaW5kZXgQAURQb2xsSW5kZXhPZjxULCBJPgAFQGRSZW1vdmUgYSB2b3RlIGZvciBhIHBvbGwuAE0BSWYgdGhlIGB0YXJnZXRgIGlzIGVxdWFsIHRvIHRoZSBzaWduZXIsIHRoZW4gdGhpcyBmdW5jdGlvbiBpcyBleGFjdGx5IGVxdWl2YWxlbnQgdG8tAWByZW1vdmVfdm90ZWAuIElmIG5vdCBlcXVhbCB0byB0aGUgc2lnbmVyLCB0aGVuIHRoZSB2b3RlIG11c3QgaGF2ZSBleHBpcmVkLCUBZWl0aGVyIGJlY2F1c2UgdGhlIHBvbGwgd2FzIGNhbmNlbGxlZCwgYmVjYXVzZSB0aGUgdm90ZXIgbG9zdCB0aGUgcG9sbCBvcphiZWNhdXNlIHRoZSBjb252aWN0aW9uIHBlcmlvZCBpcyBvdmVyLgDIVGhlIGRpc3BhdGNoIG9yaWdpbiBvZiB0aGlzIGNhbGwgbXVzdCBiZSBfU2lnbmVkXy4AYQEtIGB0YXJnZXRgOiBUaGUgYWNjb3VudCBvZiB0aGUgdm90ZSB0byBiZSByZW1vdmVkOyB0aGlzIGFjY291bnQgbXVzdCBoYXZlIHZvdGVkIGZvciBwb2xsKCAgYGluZGV4YC7cLSBgaW5kZXhgOiBUaGUgaW5kZXggb2YgcG9sbCBvZiB0aGUgdm90ZSB0byBiZSByZW1vdmVkLoQtIGBjbGFzc2A6IFRoZSBjbGFzcyBvZiB0aGUgcG9sbC4ARQFXZWlnaHQ6IGBPKFIgKyBsb2cgUilgIHdoZXJlIFIgaXMgdGhlIG51bWJlciBvZiBwb2xscyB0aGF0IGB0YXJnZXRgIGhhcyB2b3RlZCBvbi7YICBXZWlnaHQgaXMgY2FsY3VsYXRlZCBmb3IgdGhlIG1heGltdW0gbnVtYmVyIG9mIHZvdGUuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLuUEDGBwYWxsZXRfY29udmljdGlvbl92b3RpbmcoY29udmljdGlvbihDb252aWN0aW9uAAEcEE5vbmUAAAAgTG9ja2VkMXgAAQAgTG9ja2VkMngAAgAgTG9ja2VkM3gAAwAgTG9ja2VkNHgABAAgTG9ja2VkNXgABQAgTG9ja2VkNngABgAA6QQEGE9wdGlvbgQEVAFBAQEIEE5vbmUAAAAQU29tZQQAQQEAAAEAAO0EDEBwYWxsZXRfcmVmZXJlbmRhGHBhbGxldBBDYWxsCARUAARJAAEkGHN1Ym1pdAwBPHByb3Bvc2FsX29yaWdpbqECAVxCb3g8UGFsbGV0c09yaWdpbk9mPFQ+PgABIHByb3Bvc2FspQEBTEJvdW5kZWRDYWxsT2Y8VCwgST4AAUBlbmFjdG1lbnRfbW9tZW508QQBiERpc3BhdGNoVGltZTxCbG9ja051bWJlckZvcjxULCBJPj4AACSwUHJvcG9zZSBhIHJlZmVyZW5kdW0gb24gYSBwcml2aWxlZ2VkIGFjdGlvbi4AWQEtIGBvcmlnaW5gOiBtdXN0IGJlIGBTdWJtaXRPcmlnaW5gIGFuZCB0aGUgYWNjb3VudCBtdXN0IGhhdmUgYFN1Ym1pc3Npb25EZXBvc2l0YCBmdW5kczAgIGF2YWlsYWJsZS4tAS0gYHByb3Bvc2FsX29yaWdpbmA6IFRoZSBvcmlnaW4gZnJvbSB3aGljaCB0aGUgcHJvcG9zYWwgc2hvdWxkIGJlIGV4ZWN1dGVkLmwtIGBwcm9wb3NhbGA6IFRoZSBwcm9wb3NhbC4VAS0gYGVuYWN0bWVudF9tb21lbnRgOiBUaGUgbW9tZW50IHRoYXQgdGhlIHByb3Bvc2FsIHNob3VsZCBiZSBlbmFjdGVkLgBIRW1pdHMgYFN1Ym1pdHRlZGAuWHBsYWNlX2RlY2lzaW9uX2RlcG9zaXQEARRpbmRleBABPFJlZmVyZW5kdW1JbmRleAABIKxQb3N0IHRoZSBEZWNpc2lvbiBEZXBvc2l0IGZvciBhIHJlZmVyZW5kdW0uADkBLSBgb3JpZ2luYDogbXVzdCBiZSBgU2lnbmVkYCBhbmQgdGhlIGFjY291bnQgbXVzdCBoYXZlIGZ1bmRzIGF2YWlsYWJsZSBmb3IgdGhloCAgcmVmZXJlbmR1bSdzIHRyYWNrJ3MgRGVjaXNpb24gRGVwb3NpdC5RAS0gYGluZGV4YDogVGhlIGluZGV4IG9mIHRoZSBzdWJtaXR0ZWQgcmVmZXJlbmR1bSB3aG9zZSBEZWNpc2lvbiBEZXBvc2l0IGlzIHlldCB0byBiZSQgIHBvc3RlZC4AeEVtaXRzIGBEZWNpc2lvbkRlcG9zaXRQbGFjZWRgLlxyZWZ1bmRfZGVjaXNpb25fZGVwb3NpdAQBFGluZGV4EAE8UmVmZXJlbmR1bUluZGV4AAIcKQFSZWZ1bmQgdGhlIERlY2lzaW9uIERlcG9zaXQgZm9yIGEgY2xvc2VkIHJlZmVyZW5kdW0gYmFjayB0byB0aGUgZGVwb3NpdG9yLgCcLSBgb3JpZ2luYDogbXVzdCBiZSBgU2lnbmVkYCBvciBgUm9vdGAuTQEtIGBpbmRleGA6IFRoZSBpbmRleCBvZiBhIGNsb3NlZCByZWZlcmVuZHVtIHdob3NlIERlY2lzaW9uIERlcG9zaXQgaGFzIG5vdCB5ZXQgYmVlbiwgIHJlZnVuZGVkLgCARW1pdHMgYERlY2lzaW9uRGVwb3NpdFJlZnVuZGVkYC4YY2FuY2VsBAEUaW5kZXgQATxSZWZlcmVuZHVtSW5kZXgAAxh0Q2FuY2VsIGFuIG9uZ29pbmcgcmVmZXJlbmR1bS4AnC0gYG9yaWdpbmA6IG11c3QgYmUgdGhlIGBDYW5jZWxPcmlnaW5gLtwtIGBpbmRleGA6IFRoZSBpbmRleCBvZiB0aGUgcmVmZXJlbmR1bSB0byBiZSBjYW5jZWxsZWQuAEhFbWl0cyBgQ2FuY2VsbGVkYC4Qa2lsbAQBFGluZGV4EAE8UmVmZXJlbmR1bUluZGV4AAQY0ENhbmNlbCBhbiBvbmdvaW5nIHJlZmVyZW5kdW0gYW5kIHNsYXNoIHRoZSBkZXBvc2l0cy4AlC0gYG9yaWdpbmA6IG11c3QgYmUgdGhlIGBLaWxsT3JpZ2luYC7cLSBgaW5kZXhgOiBUaGUgaW5kZXggb2YgdGhlIHJlZmVyZW5kdW0gdG8gYmUgY2FuY2VsbGVkLgCQRW1pdHMgYEtpbGxlZGAgYW5kIGBEZXBvc2l0U2xhc2hlZGAuQG51ZGdlX3JlZmVyZW5kdW0EARRpbmRleBABPFJlZmVyZW5kdW1JbmRleAAFEB0BQWR2YW5jZSBhIHJlZmVyZW5kdW0gb250byBpdHMgbmV4dCBsb2dpY2FsIHN0YXRlLiBPbmx5IHVzZWQgaW50ZXJuYWxseS4AbC0gYG9yaWdpbmA6IG11c3QgYmUgYFJvb3RgLqQtIGBpbmRleGA6IHRoZSByZWZlcmVuZHVtIHRvIGJlIGFkdmFuY2VkLkhvbmVfZmV3ZXJfZGVjaWRpbmcEARR0cmFja0EBATxUcmFja0lkT2Y8VCwgST4ABiQJAUFkdmFuY2UgYSB0cmFjayBvbnRvIGl0cyBuZXh0IGxvZ2ljYWwgc3RhdGUuIE9ubHkgdXNlZCBpbnRlcm5hbGx5LgBsLSBgb3JpZ2luYDogbXVzdCBiZSBgUm9vdGAukC0gYHRyYWNrYDogdGhlIHRyYWNrIHRvIGJlIGFkdmFuY2VkLgBRAUFjdGlvbiBpdGVtIGZvciB3aGVuIHRoZXJlIGlzIG5vdyBvbmUgZmV3ZXIgcmVmZXJlbmR1bSBpbiB0aGUgZGVjaWRpbmcgcGhhc2UgYW5kIHRoZRUBYERlY2lkaW5nQ291bnRgIGlzIG5vdCB5ZXQgdXBkYXRlZC4gVGhpcyBtZWFucyB0aGF0IHdlIHNob3VsZCBlaXRoZXI6JQEtIGJlZ2luIGRlY2lkaW5nIGFub3RoZXIgcmVmZXJlbmR1bSAoYW5kIGxlYXZlIGBEZWNpZGluZ0NvdW50YCBhbG9uZSk7IG9ycC0gZGVjcmVtZW50IGBEZWNpZGluZ0NvdW50YC5kcmVmdW5kX3N1Ym1pc3Npb25fZGVwb3NpdAQBFGluZGV4EAE8UmVmZXJlbmR1bUluZGV4AAccMQFSZWZ1bmQgdGhlIFN1Ym1pc3Npb24gRGVwb3NpdCBmb3IgYSBjbG9zZWQgcmVmZXJlbmR1bSBiYWNrIHRvIHRoZSBkZXBvc2l0b3IuAJwtIGBvcmlnaW5gOiBtdXN0IGJlIGBTaWduZWRgIG9yIGBSb290YC5VAS0gYGluZGV4YDogVGhlIGluZGV4IG9mIGEgY2xvc2VkIHJlZmVyZW5kdW0gd2hvc2UgU3VibWlzc2lvbiBEZXBvc2l0IGhhcyBub3QgeWV0IGJlZW4sICByZWZ1bmRlZC4AiEVtaXRzIGBTdWJtaXNzaW9uRGVwb3NpdFJlZnVuZGVkYC4wc2V0X21ldGFkYXRhCAEUaW5kZXgQATxSZWZlcmVuZHVtSW5kZXgAAShtYXliZV9oYXNo9QQBPE9wdGlvbjxUOjpIYXNoPgAIHJhTZXQgb3IgY2xlYXIgbWV0YWRhdGEgb2YgYSByZWZlcmVuZHVtLgAsUGFyYW1ldGVyczpFAS0gYG9yaWdpbmA6IE11c3QgYmUgYFNpZ25lZGAgYnkgYSBjcmVhdG9yIG9mIGEgcmVmZXJlbmR1bSBvciBieSBhbnlvbmUgdG8gY2xlYXIgYZAgIG1ldGFkYXRhIG9mIGEgZmluaXNoZWQgcmVmZXJlbmR1bS4NAS0gYGluZGV4YDogIFRoZSBpbmRleCBvZiBhIHJlZmVyZW5kdW0gdG8gc2V0IG9yIGNsZWFyIG1ldGFkYXRhIGZvci5RAS0gYG1heWJlX2hhc2hgOiBUaGUgaGFzaCBvZiBhbiBvbi1jaGFpbiBzdG9yZWQgcHJlaW1hZ2UuIGBOb25lYCB0byBjbGVhciBhIG1ldGFkYXRhLgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy7xBBA0ZnJhbWVfc3VwcG9ydBh0cmFpdHMgc2NoZWR1bGUwRGlzcGF0Y2hUaW1lBCxCbG9ja051bWJlcgEQAQgIQXQEABABLEJsb2NrTnVtYmVyAAAAFEFmdGVyBAAQASxCbG9ja051bWJlcgABAAD1BAQYT3B0aW9uBARUATQBCBBOb25lAAAAEFNvbWUEADQAAAEAAPkEDEBwYWxsZXRfd2hpdGVsaXN0GHBhbGxldBBDYWxsBARUAAEQOHdoaXRlbGlzdF9jYWxsBAEkY2FsbF9oYXNoNAEcVDo6SGFzaAAAAFxyZW1vdmVfd2hpdGVsaXN0ZWRfY2FsbAQBJGNhbGxfaGFzaDQBHFQ6Okhhc2gAAQBkZGlzcGF0Y2hfd2hpdGVsaXN0ZWRfY2FsbAwBJGNhbGxfaGFzaDQBHFQ6Okhhc2gAAUBjYWxsX2VuY29kZWRfbGVuEAEMdTMyAAFMY2FsbF93ZWlnaHRfd2l0bmVzcygBGFdlaWdodAACAJxkaXNwYXRjaF93aGl0ZWxpc3RlZF9jYWxsX3dpdGhfcHJlaW1hZ2UEARBjYWxsqQEBfEJveDw8VCBhcyBDb25maWc+OjpSdW50aW1lQ2FsbD4AAwAEDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMu/QQMPHBhbGxldF90cmVhc3VyeRhwYWxsZXQQQ2FsbAgEVAAESQABGCxzcGVuZF9sb2NhbAgBGGFtb3VudP0BATxCYWxhbmNlT2Y8VCwgST4AASxiZW5lZmljaWFyee0BAVBBY2NvdW50SWRMb29rdXBPZjxUPgADRLhQcm9wb3NlIGFuZCBhcHByb3ZlIGEgc3BlbmQgb2YgdHJlYXN1cnkgZnVuZHMuAEgjIyBEaXNwYXRjaCBPcmlnaW4ARQFNdXN0IGJlIFtgQ29uZmlnOjpTcGVuZE9yaWdpbmBdIHdpdGggdGhlIGBTdWNjZXNzYCB2YWx1ZSBiZWluZyBhdCBsZWFzdCBgYW1vdW50YC4ALCMjIyBEZXRhaWxzRQFOT1RFOiBGb3IgcmVjb3JkLWtlZXBpbmcgcHVycG9zZXMsIHRoZSBwcm9wb3NlciBpcyBkZWVtZWQgdG8gYmUgZXF1aXZhbGVudCB0byB0aGUwYmVuZWZpY2lhcnkuADgjIyMgUGFyYW1ldGVyc0EBLSBgYW1vdW50YDogVGhlIGFtb3VudCB0byBiZSB0cmFuc2ZlcnJlZCBmcm9tIHRoZSB0cmVhc3VyeSB0byB0aGUgYGJlbmVmaWNpYXJ5YC7oLSBgYmVuZWZpY2lhcnlgOiBUaGUgZGVzdGluYXRpb24gYWNjb3VudCBmb3IgdGhlIHRyYW5zZmVyLgAkIyMgRXZlbnRzALRFbWl0cyBbYEV2ZW50OjpTcGVuZEFwcHJvdmVkYF0gaWYgc3VjY2Vzc2Z1bC48cmVtb3ZlX2FwcHJvdmFsBAEscHJvcG9zYWxfaWTJAQE0UHJvcG9zYWxJbmRleAAEVC0BRm9yY2UgYSBwcmV2aW91c2x5IGFwcHJvdmVkIHByb3Bvc2FsIHRvIGJlIHJlbW92ZWQgZnJvbSB0aGUgYXBwcm92YWwgcXVldWUuAEgjIyBEaXNwYXRjaCBPcmlnaW4AhE11c3QgYmUgW2BDb25maWc6OlJlamVjdE9yaWdpbmBdLgAoIyMgRGV0YWlscwDAVGhlIG9yaWdpbmFsIGRlcG9zaXQgd2lsbCBubyBsb25nZXIgYmUgcmV0dXJuZWQuADgjIyMgUGFyYW1ldGVyc6AtIGBwcm9wb3NhbF9pZGA6IFRoZSBpbmRleCBvZiBhIHByb3Bvc2FsADgjIyMgQ29tcGxleGl0eawtIE8oQSkgd2hlcmUgYEFgIGlzIHRoZSBudW1iZXIgb2YgYXBwcm92YWxzACgjIyMgRXJyb3JzRQEtIFtgRXJyb3I6OlByb3Bvc2FsTm90QXBwcm92ZWRgXTogVGhlIGBwcm9wb3NhbF9pZGAgc3VwcGxpZWQgd2FzIG5vdCBmb3VuZCBpbiB0aGVRASAgYXBwcm92YWwgcXVldWUsIGkuZS4sIHRoZSBwcm9wb3NhbCBoYXMgbm90IGJlZW4gYXBwcm92ZWQuIFRoaXMgY291bGQgYWxzbyBtZWFuIHRoZVkBICBwcm9wb3NhbCBkb2VzIG5vdCBleGlzdCBhbHRvZ2V0aGVyLCB0aHVzIHRoZXJlIGlzIG5vIHdheSBpdCB3b3VsZCBoYXZlIGJlZW4gYXBwcm92ZWRUICBpbiB0aGUgZmlyc3QgcGxhY2UuFHNwZW5kEAEoYXNzZXRfa2luZAEFAURCb3g8VDo6QXNzZXRLaW5kPgABGGFtb3VudP0BAVBBc3NldEJhbGFuY2VPZjxULCBJPgABLGJlbmVmaWNpYXJ5WQUBeEJveDxCZW5lZmljaWFyeUxvb2t1cE9mPFQsIEk+PgABKHZhbGlkX2Zyb22cAXBPcHRpb248QmxvY2tOdW1iZXJGb3I8VCwgST4+AAVouFByb3Bvc2UgYW5kIGFwcHJvdmUgYSBzcGVuZCBvZiB0cmVhc3VyeSBmdW5kcy4ASCMjIERpc3BhdGNoIE9yaWdpbgAdAU11c3QgYmUgW2BDb25maWc6OlNwZW5kT3JpZ2luYF0gd2l0aCB0aGUgYFN1Y2Nlc3NgIHZhbHVlIGJlaW5nIGF0IGxlYXN0VQFgYW1vdW50YCBvZiBgYXNzZXRfa2luZGAgaW4gdGhlIG5hdGl2ZSBhc3NldC4gVGhlIGFtb3VudCBvZiBgYXNzZXRfa2luZGAgaXMgY29udmVydGVk1GZvciBhc3NlcnRpb24gdXNpbmcgdGhlIFtgQ29uZmlnOjpCYWxhbmNlQ29udmVydGVyYF0uACgjIyBEZXRhaWxzAEkBQ3JlYXRlIGFuIGFwcHJvdmVkIHNwZW5kIGZvciB0cmFuc2ZlcnJpbmcgYSBzcGVjaWZpYyBgYW1vdW50YCBvZiBgYXNzZXRfa2luZGAgdG8gYWEBZGVzaWduYXRlZCBiZW5lZmljaWFyeS4gVGhlIHNwZW5kIG11c3QgYmUgY2xhaW1lZCB1c2luZyB0aGUgYHBheW91dGAgZGlzcGF0Y2hhYmxlIHdpdGhpbnR0aGUgW2BDb25maWc6OlBheW91dFBlcmlvZGBdLgA4IyMjIFBhcmFtZXRlcnMVAS0gYGFzc2V0X2tpbmRgOiBBbiBpbmRpY2F0b3Igb2YgdGhlIHNwZWNpZmljIGFzc2V0IGNsYXNzIHRvIGJlIHNwZW50LkEBLSBgYW1vdW50YDogVGhlIGFtb3VudCB0byBiZSB0cmFuc2ZlcnJlZCBmcm9tIHRoZSB0cmVhc3VyeSB0byB0aGUgYGJlbmVmaWNpYXJ5YC64LSBgYmVuZWZpY2lhcnlgOiBUaGUgYmVuZWZpY2lhcnkgb2YgdGhlIHNwZW5kLlUBLSBgdmFsaWRfZnJvbWA6IFRoZSBibG9jayBudW1iZXIgZnJvbSB3aGljaCB0aGUgc3BlbmQgY2FuIGJlIGNsYWltZWQuIEl0IGNhbiByZWZlciB0bxkBICB0aGUgcGFzdCBpZiB0aGUgcmVzdWx0aW5nIHNwZW5kIGhhcyBub3QgeWV0IGV4cGlyZWQgYWNjb3JkaW5nIHRvIHRoZUUBICBbYENvbmZpZzo6UGF5b3V0UGVyaW9kYF0uIElmIGBOb25lYCwgdGhlIHNwZW5kIGNhbiBiZSBjbGFpbWVkIGltbWVkaWF0ZWx5IGFmdGVyLCAgYXBwcm92YWwuACQjIyBFdmVudHMAyEVtaXRzIFtgRXZlbnQ6OkFzc2V0U3BlbmRBcHByb3ZlZGBdIGlmIHN1Y2Nlc3NmdWwuGHBheW91dAQBFGluZGV4EAEoU3BlbmRJbmRleAAGTDhDbGFpbSBhIHNwZW5kLgBIIyMgRGlzcGF0Y2ggT3JpZ2luADhNdXN0IGJlIHNpZ25lZAAoIyMgRGV0YWlscwBVAVNwZW5kcyBtdXN0IGJlIGNsYWltZWQgd2l0aGluIHNvbWUgdGVtcG9yYWwgYm91bmRzLiBBIHNwZW5kIG1heSBiZSBjbGFpbWVkIHdpdGhpbiBvbmXUW2BDb25maWc6OlBheW91dFBlcmlvZGBdIGZyb20gdGhlIGB2YWxpZF9mcm9tYCBibG9jay5VAUluIGNhc2Ugb2YgYSBwYXlvdXQgZmFpbHVyZSwgdGhlIHNwZW5kIHN0YXR1cyBtdXN0IGJlIHVwZGF0ZWQgd2l0aCB0aGUgYGNoZWNrX3N0YXR1c2DcZGlzcGF0Y2hhYmxlIGJlZm9yZSByZXRyeWluZyB3aXRoIHRoZSBjdXJyZW50IGZ1bmN0aW9uLgA4IyMjIFBhcmFtZXRlcnNsLSBgaW5kZXhgOiBUaGUgc3BlbmQgaW5kZXguACQjIyBFdmVudHMAkEVtaXRzIFtgRXZlbnQ6OlBhaWRgXSBpZiBzdWNjZXNzZnVsLjBjaGVja19zdGF0dXMEARRpbmRleBABKFNwZW5kSW5kZXgAB0wpAUNoZWNrIHRoZSBzdGF0dXMgb2YgdGhlIHNwZW5kIGFuZCByZW1vdmUgaXQgZnJvbSB0aGUgc3RvcmFnZSBpZiBwcm9jZXNzZWQuAEgjIyBEaXNwYXRjaCBPcmlnaW4APE11c3QgYmUgc2lnbmVkLgAoIyMgRGV0YWlscwABAVRoZSBzdGF0dXMgY2hlY2sgaXMgYSBwcmVyZXF1aXNpdGUgZm9yIHJldHJ5aW5nIGEgZmFpbGVkIHBheW91dC5JAUlmIGEgc3BlbmQgaGFzIGVpdGhlciBzdWNjZWVkZWQgb3IgZXhwaXJlZCwgaXQgaXMgcmVtb3ZlZCBmcm9tIHRoZSBzdG9yYWdlIGJ5IHRoaXPsZnVuY3Rpb24uIEluIHN1Y2ggaW5zdGFuY2VzLCB0cmFuc2FjdGlvbiBmZWVzIGFyZSByZWZ1bmRlZC4AOCMjIyBQYXJhbWV0ZXJzbC0gYGluZGV4YDogVGhlIHNwZW5kIGluZGV4LgAkIyMgRXZlbnRzAPhFbWl0cyBbYEV2ZW50OjpQYXltZW50RmFpbGVkYF0gaWYgdGhlIHNwZW5kIHBheW91dCBoYXMgZmFpbGVkLgEBRW1pdHMgW2BFdmVudDo6U3BlbmRQcm9jZXNzZWRgXSBpZiB0aGUgc3BlbmQgcGF5b3V0IGhhcyBzdWNjZWVkLih2b2lkX3NwZW5kBAEUaW5kZXgQAShTcGVuZEluZGV4AAhAfFZvaWQgcHJldmlvdXNseSBhcHByb3ZlZCBzcGVuZC4ASCMjIERpc3BhdGNoIE9yaWdpbgCETXVzdCBiZSBbYENvbmZpZzo6UmVqZWN0T3JpZ2luYF0uACgjIyBEZXRhaWxzAB0BQSBzcGVuZCB2b2lkIGlzIG9ubHkgcG9zc2libGUgaWYgdGhlIHBheW91dCBoYXMgbm90IGJlZW4gYXR0ZW1wdGVkIHlldC4AOCMjIyBQYXJhbWV0ZXJzbC0gYGluZGV4YDogVGhlIHNwZW5kIGluZGV4LgAkIyMgRXZlbnRzAMBFbWl0cyBbYEV2ZW50OjpBc3NldFNwZW5kVm9pZGVkYF0gaWYgc3VjY2Vzc2Z1bC4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMuAQUMXHBvbGthZG90X3J1bnRpbWVfY29tbW9uFGltcGxzXFZlcnNpb25lZExvY2F0YWJsZUFzc2V0AAEMCFYzCAEgbG9jYXRpb24FBQFEeGNtOjp2Mzo6TG9jYXRpb24AASBhc3NldF9pZBkFAUB4Y206OnYzOjpBc3NldElkAAMACFY0CAEgbG9jYXRpb24dBQFEeGNtOjp2NDo6TG9jYXRpb24AASBhc3NldF9pZFEFAUB4Y206OnY0OjpBc3NldElkAAQACFY1CAEgbG9jYXRpb265AgFEeGNtOjp2NTo6TG9jYXRpb24AASBhc3NldF9pZFUFAUB4Y206OnY1OjpBc3NldElkAAUAAAUFECxzdGFnaW5nX3hjbQh2MzRtdWx0aWxvY2F0aW9uNE11bHRpTG9jYXRpb24AAAgBHHBhcmVudHMIAQh1OAABIGludGVyaW9yCQUBJEp1bmN0aW9ucwAACQUQDHhjbQh2MyRqdW5jdGlvbnMkSnVuY3Rpb25zAAEkEEhlcmUAAAAIWDEEAA0FASBKdW5jdGlvbgABAAhYMggADQUBIEp1bmN0aW9uAAANBQEgSnVuY3Rpb24AAgAIWDMMAA0FASBKdW5jdGlvbgAADQUBIEp1bmN0aW9uAAANBQEgSnVuY3Rpb24AAwAIWDQQAA0FASBKdW5jdGlvbgAADQUBIEp1bmN0aW9uAAANBQEgSnVuY3Rpb24AAA0FASBKdW5jdGlvbgAEAAhYNRQADQUBIEp1bmN0aW9uAAANBQEgSnVuY3Rpb24AAA0FASBKdW5jdGlvbgAADQUBIEp1bmN0aW9uAAANBQEgSnVuY3Rpb24ABQAIWDYYAA0FASBKdW5jdGlvbgAADQUBIEp1bmN0aW9uAAANBQEgSnVuY3Rpb24AAA0FASBKdW5jdGlvbgAADQUBIEp1bmN0aW9uAAANBQEgSnVuY3Rpb24ABgAIWDccAA0FASBKdW5jdGlvbgAADQUBIEp1bmN0aW9uAAANBQEgSnVuY3Rpb24AAA0FASBKdW5jdGlvbgAADQUBIEp1bmN0aW9uAAANBQEgSnVuY3Rpb24AAA0FASBKdW5jdGlvbgAHAAhYOCAADQUBIEp1bmN0aW9uAAANBQEgSnVuY3Rpb24AAA0FASBKdW5jdGlvbgAADQUBIEp1bmN0aW9uAAANBQEgSnVuY3Rpb24AAA0FASBKdW5jdGlvbgAADQUBIEp1bmN0aW9uAAANBQEgSnVuY3Rpb24ACAAADQUQDHhjbQh2MyBqdW5jdGlvbiBKdW5jdGlvbgABKCRQYXJhY2hhaW4EAMkBAQx1MzIAAAAsQWNjb3VudElkMzIIARxuZXR3b3JrEQUBRE9wdGlvbjxOZXR3b3JrSWQ+AAEIaWQEASBbdTg7IDMyXQABADhBY2NvdW50SW5kZXg2NAgBHG5ldHdvcmsRBQFET3B0aW9uPE5ldHdvcmtJZD4AARRpbmRleCwBDHU2NAACADBBY2NvdW50S2V5MjAIARxuZXR3b3JrEQUBRE9wdGlvbjxOZXR3b3JrSWQ+AAEMa2V59QEBIFt1ODsgMjBdAAMAOFBhbGxldEluc3RhbmNlBAAIAQh1OAAEADBHZW5lcmFsSW5kZXgEAP0BARB1MTI4AAUAKEdlbmVyYWxLZXkIARhsZW5ndGgIAQh1OAABEGRhdGEEASBbdTg7IDMyXQAGACRPbmx5Q2hpbGQABwAkUGx1cmFsaXR5CAEIaWTRAgEYQm9keUlkAAEQcGFydNUCASBCb2R5UGFydAAIADxHbG9iYWxDb25zZW5zdXMEABUFASROZXR3b3JrSWQACQAAEQUEGE9wdGlvbgQEVAEVBQEIEE5vbmUAAAAQU29tZQQAFQUAAAEAABUFEAx4Y20IdjMganVuY3Rpb24kTmV0d29ya0lkAAEsJEJ5R2VuZXNpcwQABAEgW3U4OyAzMl0AAAAYQnlGb3JrCAEwYmxvY2tfbnVtYmVyMAEMdTY0AAEoYmxvY2tfaGFzaAQBIFt1ODsgMzJdAAEAIFBvbGthZG90AAIAGEt1c2FtYQADABxXZXN0ZW5kAAQAGFJvY29jbwAFABhXb2NvY28ABgAgRXRoZXJldW0EASBjaGFpbl9pZCwBDHU2NAAHACxCaXRjb2luQ29yZQAIACxCaXRjb2luQ2FzaAAJAEBQb2xrYWRvdEJ1bGxldGluAAoAABkFEAx4Y20IdjMobXVsdGlhc3NldBxBc3NldElkAAEIIENvbmNyZXRlBAAFBQE0TXVsdGlMb2NhdGlvbgAAACBBYnN0cmFjdAQABAEgW3U4OyAzMl0AAQAAHQUQLHN0YWdpbmdfeGNtCHY0IGxvY2F0aW9uIExvY2F0aW9uAAAIARxwYXJlbnRzCAEIdTgAASBpbnRlcmlvciEFASRKdW5jdGlvbnMAACEFECxzdGFnaW5nX3hjbQh2NCRqdW5jdGlvbnMkSnVuY3Rpb25zAAEkEEhlcmUAAAAIWDEEACUFAUhBcmM8W0p1bmN0aW9uOyAxXT4AAQAIWDIEADUFAUhBcmM8W0p1bmN0aW9uOyAyXT4AAgAIWDMEADkFAUhBcmM8W0p1bmN0aW9uOyAzXT4AAwAIWDQEAD0FAUhBcmM8W0p1bmN0aW9uOyA0XT4ABAAIWDUEAEEFAUhBcmM8W0p1bmN0aW9uOyA1XT4ABQAIWDYEAEUFAUhBcmM8W0p1bmN0aW9uOyA2XT4ABgAIWDcEAEkFAUhBcmM8W0p1bmN0aW9uOyA3XT4ABwAIWDgEAE0FAUhBcmM8W0p1bmN0aW9uOyA4XT4ACAAAJQUAAAMBAAAAKQUAKQUQLHN0YWdpbmdfeGNtCHY0IGp1bmN0aW9uIEp1bmN0aW9uAAEoJFBhcmFjaGFpbgQAyQEBDHUzMgAAACxBY2NvdW50SWQzMggBHG5ldHdvcmstBQFET3B0aW9uPE5ldHdvcmtJZD4AAQhpZAQBIFt1ODsgMzJdAAEAOEFjY291bnRJbmRleDY0CAEcbmV0d29yay0FAURPcHRpb248TmV0d29ya0lkPgABFGluZGV4LAEMdTY0AAIAMEFjY291bnRLZXkyMAgBHG5ldHdvcmstBQFET3B0aW9uPE5ldHdvcmtJZD4AAQxrZXn1AQEgW3U4OyAyMF0AAwA4UGFsbGV0SW5zdGFuY2UEAAgBCHU4AAQAMEdlbmVyYWxJbmRleAQA/QEBEHUxMjgABQAoR2VuZXJhbEtleQgBGGxlbmd0aAgBCHU4AAEQZGF0YQQBIFt1ODsgMzJdAAYAJE9ubHlDaGlsZAAHACRQbHVyYWxpdHkIAQhpZNECARhCb2R5SWQAARBwYXJ01QIBIEJvZHlQYXJ0AAgAPEdsb2JhbENvbnNlbnN1cwQAMQUBJE5ldHdvcmtJZAAJAAAtBQQYT3B0aW9uBARUATEFAQgQTm9uZQAAABBTb21lBAAxBQAAAQAAMQUQLHN0YWdpbmdfeGNtCHY0IGp1bmN0aW9uJE5ldHdvcmtJZAABLCRCeUdlbmVzaXMEAAQBIFt1ODsgMzJdAAAAGEJ5Rm9yawgBMGJsb2NrX251bWJlcjABDHU2NAABKGJsb2NrX2hhc2gEASBbdTg7IDMyXQABACBQb2xrYWRvdAACABhLdXNhbWEAAwAcV2VzdGVuZAAEABhSb2NvY28ABQAYV29jb2NvAAYAIEV0aGVyZXVtBAEgY2hhaW5faWQsAQx1NjQABwAsQml0Y29pbkNvcmUACAAsQml0Y29pbkNhc2gACQBAUG9sa2Fkb3RCdWxsZXRpbgAKAAA1BQAAAwIAAAApBQA5BQAAAwMAAAApBQA9BQAAAwQAAAApBQBBBQAAAwUAAAApBQBFBQAAAwYAAAApBQBJBQAAAwcAAAApBQBNBQAAAwgAAAApBQBRBRAsc3RhZ2luZ194Y20IdjQUYXNzZXQcQXNzZXRJZAAABAAdBQEgTG9jYXRpb24AAFUFECxzdGFnaW5nX3hjbQh2NRRhc3NldBxBc3NldElkAAAEALkCASBMb2NhdGlvbgAAWQUIDHhjbURWZXJzaW9uZWRMb2NhdGlvbgABDAhWMwQABQUBRHYzOjpNdWx0aUxvY2F0aW9uAAMACFY0BAAdBQEwdjQ6OkxvY2F0aW9uAAQACFY1BAC5AgEwdjU6OkxvY2F0aW9uAAUAAF0FEGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnM0Y29uZmlndXJhdGlvbhhwYWxsZXQQQ2FsbAQEVAABuHxzZXRfdmFsaWRhdGlvbl91cGdyYWRlX2Nvb2xkb3duBAEMbmV3EAFEQmxvY2tOdW1iZXJGb3I8VD4AAASQU2V0IHRoZSB2YWxpZGF0aW9uIHVwZ3JhZGUgY29vbGRvd24ucHNldF92YWxpZGF0aW9uX3VwZ3JhZGVfZGVsYXkEAQxuZXcQAURCbG9ja051bWJlckZvcjxUPgABBIRTZXQgdGhlIHZhbGlkYXRpb24gdXBncmFkZSBkZWxheS5kc2V0X2NvZGVfcmV0ZW50aW9uX3BlcmlvZAQBDG5ldxABREJsb2NrTnVtYmVyRm9yPFQ+AAIE0FNldCB0aGUgYWNjZXB0YW5jZSBwZXJpb2QgZm9yIGFuIGluY2x1ZGVkIGNhbmRpZGF0ZS5Ec2V0X21heF9jb2RlX3NpemUEAQxuZXcQAQx1MzIAAwTcU2V0IHRoZSBtYXggdmFsaWRhdGlvbiBjb2RlIHNpemUgZm9yIGluY29taW5nIHVwZ3JhZGVzLkBzZXRfbWF4X3Bvdl9zaXplBAEMbmV3EAEMdTMyAAQExFNldCB0aGUgbWF4IFBPViBibG9jayBzaXplIGZvciBpbmNvbWluZyB1cGdyYWRlcy5Yc2V0X21heF9oZWFkX2RhdGFfc2l6ZQQBDG5ldxABDHUzMgAFBJRTZXQgdGhlIG1heCBoZWFkIGRhdGEgc2l6ZSBmb3IgcGFyYXMuSHNldF9jb3JldGltZV9jb3JlcwQBDG5ldxABDHUzMgAGEKxTZXQgdGhlIG51bWJlciBvZiBjb3JldGltZSBleGVjdXRpb24gY29yZXMuAFEBTk9URTogdGhhdCB0aGlzIGNvbmZpZ3VyYXRpb24gaXMgbWFuYWdlZCBieSB0aGUgY29yZXRpbWUgY2hhaW4uIE9ubHkgbWFudWFsbHkgY2hhbmdlsHRoaXMsIGlmIHlvdSByZWFsbHkga25vdyB3aGF0IHlvdSBhcmUgZG9pbmchcHNldF9ncm91cF9yb3RhdGlvbl9mcmVxdWVuY3kEAQxuZXcQAURCbG9ja051bWJlckZvcjxUPgAIBNBTZXQgdGhlIHBhcmFjaGFpbiB2YWxpZGF0b3ItZ3JvdXAgcm90YXRpb24gZnJlcXVlbmN5dHNldF9wYXJhc19hdmFpbGFiaWxpdHlfcGVyaW9kBAEMbmV3EAFEQmxvY2tOdW1iZXJGb3I8VD4ACQSYU2V0IHRoZSBhdmFpbGFiaWxpdHkgcGVyaW9kIGZvciBwYXJhcy5gc2V0X3NjaGVkdWxpbmdfbG9va2FoZWFkBAEMbmV3EAEMdTMyAAsEOQFTZXQgdGhlIHNjaGVkdWxpbmcgbG9va2FoZWFkLCBpbiBleHBlY3RlZCBudW1iZXIgb2YgYmxvY2tzIGF0IHBlYWsgdGhyb3VnaHB1dC5sc2V0X21heF92YWxpZGF0b3JzX3Blcl9jb3JlBAEMbmV3nAEsT3B0aW9uPHUzMj4ADATsU2V0IHRoZSBtYXhpbXVtIG51bWJlciBvZiB2YWxpZGF0b3JzIHRvIGFzc2lnbiB0byBhbnkgY29yZS5Ic2V0X21heF92YWxpZGF0b3JzBAEMbmV3nAEsT3B0aW9uPHUzMj4ADQQNAVNldCB0aGUgbWF4aW11bSBudW1iZXIgb2YgdmFsaWRhdG9ycyB0byB1c2UgaW4gcGFyYWNoYWluIGNvbnNlbnN1cy5Ic2V0X2Rpc3B1dGVfcGVyaW9kBAEMbmV3EAEwU2Vzc2lvbkluZGV4AA4EDQFTZXQgdGhlIGRpc3B1dGUgcGVyaW9kLCBpbiBudW1iZXIgb2Ygc2Vzc2lvbnMgdG8ga2VlcCBmb3IgZGlzcHV0ZXMutHNldF9kaXNwdXRlX3Bvc3RfY29uY2x1c2lvbl9hY2NlcHRhbmNlX3BlcmlvZAQBDG5ldxABREJsb2NrTnVtYmVyRm9yPFQ+AA8EyFNldCB0aGUgZGlzcHV0ZSBwb3N0IGNvbmNsdXNpb24gYWNjZXB0YW5jZSBwZXJpb2QuRHNldF9ub19zaG93X3Nsb3RzBAEMbmV3EAEMdTMyABII+FNldCB0aGUgbm8gc2hvdyBzbG90cywgaW4gbnVtYmVyIG9mIG51bWJlciBvZiBjb25zZW5zdXMgc2xvdHMuTE11c3QgYmUgYXQgbGVhc3QgMS5Qc2V0X25fZGVsYXlfdHJhbmNoZXMEAQxuZXcQAQx1MzIAEwScU2V0IHRoZSB0b3RhbCBudW1iZXIgb2YgZGVsYXkgdHJhbmNoZXMueHNldF96ZXJvdGhfZGVsYXlfdHJhbmNoZV93aWR0aAQBDG5ldxABDHUzMgAUBIxTZXQgdGhlIHplcm90aCBkZWxheSB0cmFuY2hlIHdpZHRoLlBzZXRfbmVlZGVkX2FwcHJvdmFscwQBDG5ldxABDHUzMgAVBNxTZXQgdGhlIG51bWJlciBvZiB2YWxpZGF0b3JzIG5lZWRlZCB0byBhcHByb3ZlIGEgYmxvY2sucHNldF9yZWxheV92cmZfbW9kdWxvX3NhbXBsZXMEAQxuZXcQAQx1MzIAFgRZAVNldCB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgdG8gZG8gb2YgdGhlIGBSZWxheVZSRk1vZHVsb2AgYXBwcm92YWwgYXNzaWdubWVudCBjcml0ZXJpb24uaHNldF9tYXhfdXB3YXJkX3F1ZXVlX2NvdW50BAEMbmV3EAEMdTMyABcELQFTZXRzIHRoZSBtYXhpbXVtIGl0ZW1zIHRoYXQgY2FuIHByZXNlbnQgaW4gYSB1cHdhcmQgZGlzcGF0Y2ggcXVldWUgYXQgb25jZS5kc2V0X21heF91cHdhcmRfcXVldWVfc2l6ZQQBDG5ldxABDHUzMgAYCE0BU2V0cyB0aGUgbWF4aW11bSB0b3RhbCBzaXplIG9mIGl0ZW1zIHRoYXQgY2FuIHByZXNlbnQgaW4gYSB1cHdhcmQgZGlzcGF0Y2ggcXVldWUgYXQUb25jZS50c2V0X21heF9kb3dud2FyZF9tZXNzYWdlX3NpemUEAQxuZXcQAQx1MzIAGQScU2V0IHRoZSBjcml0aWNhbCBkb3dud2FyZCBtZXNzYWdlIHNpemUubHNldF9tYXhfdXB3YXJkX21lc3NhZ2Vfc2l6ZQQBDG5ldxABDHUzMgAbBC0BU2V0cyB0aGUgbWF4aW11bSBzaXplIG9mIGFuIHVwd2FyZCBtZXNzYWdlIHRoYXQgY2FuIGJlIHNlbnQgYnkgYSBjYW5kaWRhdGUuoHNldF9tYXhfdXB3YXJkX21lc3NhZ2VfbnVtX3Blcl9jYW5kaWRhdGUEAQxuZXcQAQx1MzIAHAQFAVNldHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIG1lc3NhZ2VzIHRoYXQgYSBjYW5kaWRhdGUgY2FuIGNvbnRhaW4uZHNldF9ocm1wX29wZW5fcmVxdWVzdF90dGwEAQxuZXcQAQx1MzIAHQQ1AVNldHMgdGhlIG51bWJlciBvZiBzZXNzaW9ucyBhZnRlciB3aGljaCBhbiBIUk1QIG9wZW4gY2hhbm5lbCByZXF1ZXN0IGV4cGlyZXMuXHNldF9ocm1wX3NlbmRlcl9kZXBvc2l0BAEMbmV3GAEcQmFsYW5jZQAeBFEBU2V0cyB0aGUgYW1vdW50IG9mIGZ1bmRzIHRoYXQgdGhlIHNlbmRlciBzaG91bGQgcHJvdmlkZSBmb3Igb3BlbmluZyBhbiBIUk1QIGNoYW5uZWwuaHNldF9ocm1wX3JlY2lwaWVudF9kZXBvc2l0BAEMbmV3GAEcQmFsYW5jZQAfCGEBU2V0cyB0aGUgYW1vdW50IG9mIGZ1bmRzIHRoYXQgdGhlIHJlY2lwaWVudCBzaG91bGQgcHJvdmlkZSBmb3IgYWNjZXB0aW5nIG9wZW5pbmcgYW4gSFJNUCBjaGFubmVsLnRzZXRfaHJtcF9jaGFubmVsX21heF9jYXBhY2l0eQQBDG5ldxABDHUzMgAgBB0BU2V0cyB0aGUgbWF4aW11bSBudW1iZXIgb2YgbWVzc2FnZXMgYWxsb3dlZCBpbiBhbiBIUk1QIGNoYW5uZWwgYXQgb25jZS58c2V0X2hybXBfY2hhbm5lbF9tYXhfdG90YWxfc2l6ZQQBDG5ldxABDHUzMgAhBFEBU2V0cyB0aGUgbWF4aW11bSB0b3RhbCBzaXplIG9mIG1lc3NhZ2VzIGluIGJ5dGVzIGFsbG93ZWQgaW4gYW4gSFJNUCBjaGFubmVsIGF0IG9uY2UunHNldF9ocm1wX21heF9wYXJhY2hhaW5faW5ib3VuZF9jaGFubmVscwQBDG5ldxABDHUzMgAiBEkBU2V0cyB0aGUgbWF4aW11bSBudW1iZXIgb2YgaW5ib3VuZCBIUk1QIGNoYW5uZWxzIGEgcGFyYWNoYWluIGlzIGFsbG93ZWQgdG8gYWNjZXB0LoRzZXRfaHJtcF9jaGFubmVsX21heF9tZXNzYWdlX3NpemUEAQxuZXcQAQx1MzIAJAQ9AVNldHMgdGhlIG1heGltdW0gc2l6ZSBvZiBhIG1lc3NhZ2UgdGhhdCBjb3VsZCBldmVyIGJlIHB1dCBpbnRvIGFuIEhSTVAgY2hhbm5lbC6gc2V0X2hybXBfbWF4X3BhcmFjaGFpbl9vdXRib3VuZF9jaGFubmVscwQBDG5ldxABDHUzMgAlBEUBU2V0cyB0aGUgbWF4aW11bSBudW1iZXIgb2Ygb3V0Ym91bmQgSFJNUCBjaGFubmVscyBhIHBhcmFjaGFpbiBpcyBhbGxvd2VkIHRvIG9wZW4umHNldF9ocm1wX21heF9tZXNzYWdlX251bV9wZXJfY2FuZGlkYXRlBAEMbmV3EAEMdTMyACcENQFTZXRzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBvdXRib3VuZCBIUk1QIG1lc3NhZ2VzIGNhbiBiZSBzZW50IGJ5IGEgY2FuZGlkYXRlLkhzZXRfcHZmX3ZvdGluZ190dGwEAQxuZXcQATBTZXNzaW9uSW5kZXgAKgRRAVNldCB0aGUgbnVtYmVyIG9mIHNlc3Npb24gY2hhbmdlcyBhZnRlciB3aGljaCBhIFBWRiBwcmUtY2hlY2tpbmcgdm90aW5nIGlzIHJlamVjdGVkLpBzZXRfbWluaW11bV92YWxpZGF0aW9uX3VwZ3JhZGVfZGVsYXkEAQxuZXcQAURCbG9ja051bWJlckZvcjxUPgArEFUBU2V0cyB0aGUgbWluaW11bSBkZWxheSBiZXR3ZWVuIGFubm91bmNpbmcgdGhlIHVwZ3JhZGUgYmxvY2sgZm9yIGEgcGFyYWNoYWluIHVudGlsIHRoZVR1cGdyYWRlIHRha2luZyBwbGFjZS4AOQFTZWUgdGhlIGZpZWxkIGRvY3VtZW50YXRpb24gZm9yIGluZm9ybWF0aW9uIGFuZCBjb25zdHJhaW50cyBmb3IgdGhlIG5ldyB2YWx1ZS5wc2V0X2J5cGFzc19jb25zaXN0ZW5jeV9jaGVjawQBDG5ldyABEGJvb2wALAhNAVNldHRpbmcgdGhpcyB0byB0cnVlIHdpbGwgZGlzYWJsZSBjb25zaXN0ZW5jeSBjaGVja3MgZm9yIHRoZSBjb25maWd1cmF0aW9uIHNldHRlcnMuRFVzZSB3aXRoIGNhdXRpb24uYHNldF9hc3luY19iYWNraW5nX3BhcmFtcwQBDG5ld2EFAUhBc3luY0JhY2tpbmdQYXJhbXMALQSgU2V0IHRoZSBhc3luY2hyb25vdXMgYmFja2luZyBwYXJhbWV0ZXJzLkxzZXRfZXhlY3V0b3JfcGFyYW1zBAEMbmV3ZQUBOEV4ZWN1dG9yUGFyYW1zAC4EcFNldCBQVkYgZXhlY3V0b3IgcGFyYW1ldGVycy5Yc2V0X29uX2RlbWFuZF9iYXNlX2ZlZQQBDG5ldxgBHEJhbGFuY2UALwSkU2V0IHRoZSBvbiBkZW1hbmQgKHBhcmF0aHJlYWRzKSBiYXNlIGZlZS50c2V0X29uX2RlbWFuZF9mZWVfdmFyaWFiaWxpdHkEAQxuZXeYARxQZXJiaWxsADAEwFNldCB0aGUgb24gZGVtYW5kIChwYXJhdGhyZWFkcykgZmVlIHZhcmlhYmlsaXR5LnBzZXRfb25fZGVtYW5kX3F1ZXVlX21heF9zaXplBAEMbmV3EAEMdTMyADEEvFNldCB0aGUgb24gZGVtYW5kIChwYXJhdGhyZWFkcykgcXVldWUgbWF4IHNpemUumHNldF9vbl9kZW1hbmRfdGFyZ2V0X3F1ZXVlX3V0aWxpemF0aW9uBAEMbmV3mAEcUGVyYmlsbAAyBMBTZXQgdGhlIG9uIGRlbWFuZCAocGFyYXRocmVhZHMpIGZlZSB2YXJpYWJpbGl0eS5kc2V0X21pbmltdW1fYmFja2luZ192b3RlcwQBDG5ldxABDHUzMgA0BKBTZXQgdGhlIG1pbmltdW0gYmFja2luZyB2b3RlcyB0aHJlc2hvbGQuQHNldF9ub2RlX2ZlYXR1cmUIARRpbmRleAgBCHU4AAEUdmFsdWUgARBib29sADUEZFNldC9VbnNldCBhIG5vZGUgZmVhdHVyZS5oc2V0X2FwcHJvdmFsX3ZvdGluZ19wYXJhbXMEAQxuZXd5BQFQQXBwcm92YWxWb3RpbmdQYXJhbXMANgRsU2V0IGFwcHJvdmFsLXZvdGluZy1wYXJhbXMuUHNldF9zY2hlZHVsZXJfcGFyYW1zBAEMbmV3fQUBiFNjaGVkdWxlclBhcmFtczxCbG9ja051bWJlckZvcjxUPj4ANwRUU2V0IHNjaGVkdWxlci1wYXJhbXMuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLmEFEExwb2xrYWRvdF9wcmltaXRpdmVzCHY4NGFzeW5jX2JhY2tpbmdIQXN5bmNCYWNraW5nUGFyYW1zAAAIAUxtYXhfY2FuZGlkYXRlX2RlcHRoEAEMdTMyAAFQYWxsb3dlZF9hbmNlc3RyeV9sZW4QAQx1MzIAAGUFEExwb2xrYWRvdF9wcmltaXRpdmVzCHY4PGV4ZWN1dG9yX3BhcmFtczhFeGVjdXRvclBhcmFtcwAABABpBQFIVmVjPEV4ZWN1dG9yUGFyYW0+AABpBQAAAm0FAG0FEExwb2xrYWRvdF9wcmltaXRpdmVzCHY4PGV4ZWN1dG9yX3BhcmFtczRFeGVjdXRvclBhcmFtAAEcOE1heE1lbW9yeVBhZ2VzBAAQAQx1MzIAAQA8U3RhY2tMb2dpY2FsTWF4BAAQAQx1MzIAAgA4U3RhY2tOYXRpdmVNYXgEABABDHUzMgADAFBQcmVjaGVja2luZ01heE1lbW9yeQQAMAEMdTY0AAQAOFB2ZlByZXBUaW1lb3V0CABxBQEsUHZmUHJlcEtpbmQAADABDHU2NAAFADhQdmZFeGVjVGltZW91dAgAdQUBLFB2ZkV4ZWNLaW5kAAAwAQx1NjQABgBEV2FzbUV4dEJ1bGtNZW1vcnkABwAAcQUMTHBvbGthZG90X3ByaW1pdGl2ZXMIdjgsUHZmUHJlcEtpbmQAAQggUHJlY2hlY2sAAAAcUHJlcGFyZQABAAB1BQxMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2OCxQdmZFeGVjS2luZAABCBxCYWNraW5nAAAAIEFwcHJvdmFsAAEAAHkFDExwb2xrYWRvdF9wcmltaXRpdmVzCHY4UEFwcHJvdmFsVm90aW5nUGFyYW1zAAAEAWxtYXhfYXBwcm92YWxfY29hbGVzY2VfY291bnQQAQx1MzIAAH0FDExwb2xrYWRvdF9wcmltaXRpdmVzCHY4PFNjaGVkdWxlclBhcmFtcwQsQmxvY2tOdW1iZXIBEAAsAWBncm91cF9yb3RhdGlvbl9mcmVxdWVuY3kQASxCbG9ja051bWJlcgABZHBhcmFzX2F2YWlsYWJpbGl0eV9wZXJpb2QQASxCbG9ja051bWJlcgABXG1heF92YWxpZGF0b3JzX3Blcl9jb3JlnAEsT3B0aW9uPHUzMj4AASRsb29rYWhlYWQQAQx1MzIAASRudW1fY29yZXMQAQx1MzIAAWRtYXhfYXZhaWxhYmlsaXR5X3RpbWVvdXRzEAEMdTMyAAFgb25fZGVtYW5kX3F1ZXVlX21heF9zaXplEAEMdTMyAAGIb25fZGVtYW5kX3RhcmdldF9xdWV1ZV91dGlsaXphdGlvbpgBHFBlcmJpbGwAAWRvbl9kZW1hbmRfZmVlX3ZhcmlhYmlsaXR5mAEcUGVyYmlsbAABSG9uX2RlbWFuZF9iYXNlX2ZlZRgBHEJhbGFuY2UAAQx0dGwQASxCbG9ja051bWJlcgAAgQUQbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucxhzaGFyZWQYcGFsbGV0EENhbGwEBFQAAQAEDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMuhQUQbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucyRpbmNsdXNpb24YcGFsbGV0EENhbGwEBFQAAQAEDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMuiQUQbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWluczhwYXJhc19pbmhlcmVudBhwYWxsZXQQQ2FsbAQEVAABBBRlbnRlcgQBEGRhdGGNBQGQUGFyYWNoYWluc0luaGVyZW50RGF0YTxIZWFkZXJGb3I8VD4+AAAEMQFFbnRlciB0aGUgcGFyYXMgaW5oZXJlbnQuIFRoaXMgd2lsbCBwcm9jZXNzIGJpdGZpZWxkcyBhbmQgYmFja2VkIGNhbmRpZGF0ZXMuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLo0FDExwb2xrYWRvdF9wcmltaXRpdmVzIHZzdGFnaW5nMEluaGVyZW50RGF0YQQMSERSAcUBABABJGJpdGZpZWxkc5EFAZBVbmNoZWNrZWRTaWduZWRBdmFpbGFiaWxpdHlCaXRmaWVsZHMAAURiYWNrZWRfY2FuZGlkYXRlc60FAXxWZWM8QmFja2VkQ2FuZGlkYXRlPEhEUjo6SGFzaD4+AAEgZGlzcHV0ZXPtBQFgTXVsdGlEaXNwdXRlU3RhdGVtZW50U2V0AAE0cGFyZW50X2hlYWRlcsUBAQxIRFIAAJEFAAAClQUAlQUQTHBvbGthZG90X3ByaW1pdGl2ZXMIdjgYc2lnbmVkPFVuY2hlY2tlZFNpZ25lZAgcUGF5bG9hZAGZBSxSZWFsUGF5bG9hZAGZBQAMARxwYXlsb2FkmQUBHFBheWxvYWQAATx2YWxpZGF0b3JfaW5kZXilBQE4VmFsaWRhdG9ySW5kZXgAASRzaWduYXR1cmWpBQFIVmFsaWRhdG9yU2lnbmF0dXJlAACZBQxMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2OFBBdmFpbGFiaWxpdHlCaXRmaWVsZAAABACdBQF8Qml0VmVjPHU4LCBiaXR2ZWM6Om9yZGVyOjpMc2IwPgAAnQUAAAcIoQUAoQUMGGJpdHZlYxRvcmRlchBMc2IwAAAAAKUFDExwb2xrYWRvdF9wcmltaXRpdmVzCHY4OFZhbGlkYXRvckluZGV4AAAEABABDHUzMgAAqQUQTHBvbGthZG90X3ByaW1pdGl2ZXMIdjg0dmFsaWRhdG9yX2FwcCRTaWduYXR1cmUAAAQAhQIBSHNyMjU1MTk6OlNpZ25hdHVyZQAArQUAAAKxBQCxBQxMcG9sa2Fkb3RfcHJpbWl0aXZlcyB2c3RhZ2luZzxCYWNrZWRDYW5kaWRhdGUEBEgBNAAMASRjYW5kaWRhdGW1BQF4Q29tbWl0dGVkQ2FuZGlkYXRlUmVjZWlwdFYyPEg+AAE4dmFsaWRpdHlfdm90ZXPlBQFgVmVjPFZhbGlkaXR5QXR0ZXN0YXRpb24+AAFEdmFsaWRhdG9yX2luZGljZXOdBQF8Qml0VmVjPHU4LCBiaXR2ZWM6Om9yZGVyOjpMc2IwPgAAtQUMTHBvbGthZG90X3ByaW1pdGl2ZXMgdnN0YWdpbmdsQ29tbWl0dGVkQ2FuZGlkYXRlUmVjZWlwdFYyBARIATQACAEoZGVzY3JpcHRvcrkFAWBDYW5kaWRhdGVEZXNjcmlwdG9yVjI8SD4AASxjb21taXRtZW50c8UFAVBDYW5kaWRhdGVDb21taXRtZW50cwAAuQUMTHBvbGthZG90X3ByaW1pdGl2ZXMgdnN0YWdpbmdUQ2FuZGlkYXRlRGVzY3JpcHRvclYyBARIATQAMAEccGFyYV9pZLECARhQYXJhSWQAATByZWxheV9wYXJlbnQ0AQRIAAEcdmVyc2lvbr0FATxJbnRlcm5hbFZlcnNpb24AAShjb3JlX2luZGV4QQEBDHUxNgABNHNlc3Npb25faW5kZXgQATBTZXNzaW9uSW5kZXgAASRyZXNlcnZlZDFhAwEgW3U4OyAyNV0AAXhwZXJzaXN0ZWRfdmFsaWRhdGlvbl9kYXRhX2hhc2g0ARBIYXNoAAEgcG92X2hhc2g0ARBIYXNoAAEwZXJhc3VyZV9yb290NAEQSGFzaAABJHJlc2VydmVkMoUCASBbdTg7IDY0XQABJHBhcmFfaGVhZDQBEEhhc2gAAVB2YWxpZGF0aW9uX2NvZGVfaGFzaMEFAUhWYWxpZGF0aW9uQ29kZUhhc2gAAL0FDExwb2xrYWRvdF9wcmltaXRpdmVzIHZzdGFnaW5nPEludGVybmFsVmVyc2lvbgAABAAIAQh1OAAAwQUMdHBvbGthZG90X3BhcmFjaGFpbl9wcmltaXRpdmVzKHByaW1pdGl2ZXNIVmFsaWRhdGlvbkNvZGVIYXNoAAAEADQBEEhhc2gAAMUFDExwb2xrYWRvdF9wcmltaXRpdmVzCHY4UENhbmRpZGF0ZUNvbW1pdG1lbnRzBAROARAAGAE8dXB3YXJkX21lc3NhZ2VzyQUBOFVwd2FyZE1lc3NhZ2VzAAFMaG9yaXpvbnRhbF9tZXNzYWdlc80FAUhIb3Jpem9udGFsTWVzc2FnZXMAAUxuZXdfdmFsaWRhdGlvbl9jb2Rl2QUBWE9wdGlvbjxWYWxpZGF0aW9uQ29kZT4AASRoZWFkX2RhdGHhBQEgSGVhZERhdGEAAWxwcm9jZXNzZWRfZG93bndhcmRfbWVzc2FnZXMQAQx1MzIAAThocm1wX3dhdGVybWFyaxABBE4AAMkFDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBOARTAAAEALkBARhWZWM8VD4AAM0FDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQB0QUEUwAABADVBQEYVmVjPFQ+AADRBQhgcG9sa2Fkb3RfY29yZV9wcmltaXRpdmVzTE91dGJvdW5kSHJtcE1lc3NhZ2UECElkAbECAAgBJHJlY2lwaWVudLECAQhJZAABEGRhdGE4AUxhbGxvYzo6dmVjOjpWZWM8dTg+AADVBQAAAtEFANkFBBhPcHRpb24EBFQB3QUBCBBOb25lAAAAEFNvbWUEAN0FAAABAADdBQx0cG9sa2Fkb3RfcGFyYWNoYWluX3ByaW1pdGl2ZXMocHJpbWl0aXZlczhWYWxpZGF0aW9uQ29kZQAABAA4ARxWZWM8dTg+AADhBQx0cG9sa2Fkb3RfcGFyYWNoYWluX3ByaW1pdGl2ZXMocHJpbWl0aXZlcyBIZWFkRGF0YQAABAA4ARxWZWM8dTg+AADlBQAAAukFAOkFDExwb2xrYWRvdF9wcmltaXRpdmVzCHY4TFZhbGlkaXR5QXR0ZXN0YXRpb24AAQggSW1wbGljaXQEAKkFAUhWYWxpZGF0b3JTaWduYXR1cmUAAQAgRXhwbGljaXQEAKkFAUhWYWxpZGF0b3JTaWduYXR1cmUAAgAA7QUAAALxBQDxBQxMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2OExEaXNwdXRlU3RhdGVtZW50U2V0AAAMAThjYW5kaWRhdGVfaGFzaPUFATRDYW5kaWRhdGVIYXNoAAEcc2Vzc2lvbhABMFNlc3Npb25JbmRleAABKHN0YXRlbWVudHP5BQHsVmVjPChEaXNwdXRlU3RhdGVtZW50LCBWYWxpZGF0b3JJbmRleCwgVmFsaWRhdG9yU2lnbmF0dXJlKT4AAPUFCGBwb2xrYWRvdF9jb3JlX3ByaW1pdGl2ZXM0Q2FuZGlkYXRlSGFzaAAABAA0ARBIYXNoAAD5BQAAAv0FAP0FAAAEDAEGpQWpBQABBgxMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2OEBEaXNwdXRlU3RhdGVtZW50AAEIFFZhbGlkBAAFBgFkVmFsaWREaXNwdXRlU3RhdGVtZW50S2luZAAAABxJbnZhbGlkBAANBgFsSW52YWxpZERpc3B1dGVTdGF0ZW1lbnRLaW5kAAEAAAUGDExwb2xrYWRvdF9wcmltaXRpdmVzCHY4ZFZhbGlkRGlzcHV0ZVN0YXRlbWVudEtpbmQAARQgRXhwbGljaXQAAAA8QmFja2luZ1NlY29uZGVkBAA0ARBIYXNoAAEAMEJhY2tpbmdWYWxpZAQANAEQSGFzaAACAEBBcHByb3ZhbENoZWNraW5nAAMAiEFwcHJvdmFsQ2hlY2tpbmdNdWx0aXBsZUNhbmRpZGF0ZXMEAAkGAUhWZWM8Q2FuZGlkYXRlSGFzaD4ABAAACQYAAAL1BQANBgxMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2OGxJbnZhbGlkRGlzcHV0ZVN0YXRlbWVudEtpbmQAAQQgRXhwbGljaXQAAAAAEQYQbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucxRwYXJhcxhwYWxsZXQQQ2FsbAQEVAABMFhmb3JjZV9zZXRfY3VycmVudF9jb2RlCAEQcGFyYbECARhQYXJhSWQAASBuZXdfY29kZd0FAThWYWxpZGF0aW9uQ29kZQAABPhTZXQgdGhlIHN0b3JhZ2UgZm9yIHRoZSBwYXJhY2hhaW4gdmFsaWRhdGlvbiBjb2RlIGltbWVkaWF0ZWx5Llhmb3JjZV9zZXRfY3VycmVudF9oZWFkCAEQcGFyYbECARhQYXJhSWQAASBuZXdfaGVhZOEFASBIZWFkRGF0YQABBAEBU2V0IHRoZSBzdG9yYWdlIGZvciB0aGUgY3VycmVudCBwYXJhY2hhaW4gaGVhZCBkYXRhIGltbWVkaWF0ZWx5Lmxmb3JjZV9zY2hlZHVsZV9jb2RlX3VwZ3JhZGUMARBwYXJhsQIBGFBhcmFJZAABIG5ld19jb2Rl3QUBOFZhbGlkYXRpb25Db2RlAAFMcmVsYXlfcGFyZW50X251bWJlchABREJsb2NrTnVtYmVyRm9yPFQ+AAIELQFTY2hlZHVsZSBhbiB1cGdyYWRlIGFzIGlmIGl0IHdhcyBzY2hlZHVsZWQgaW4gdGhlIGdpdmVuIHJlbGF5IHBhcmVudCBibG9jay5MZm9yY2Vfbm90ZV9uZXdfaGVhZAgBEHBhcmGxAgEYUGFyYUlkAAEgbmV3X2hlYWThBQEgSGVhZERhdGEAAwQdAU5vdGUgYSBuZXcgYmxvY2sgaGVhZCBmb3IgcGFyYSB3aXRoaW4gdGhlIGNvbnRleHQgb2YgdGhlIGN1cnJlbnQgYmxvY2suSGZvcmNlX3F1ZXVlX2FjdGlvbgQBEHBhcmGxAgEYUGFyYUlkAAQM+FB1dCBhIHBhcmFjaGFpbiBkaXJlY3RseSBpbnRvIHRoZSBuZXh0IHNlc3Npb24ncyBhY3Rpb24gcXVldWUu9FdlIGNhbid0IHF1ZXVlIGl0IGFueSBzb29uZXIgdGhhbiB0aGlzIHdpdGhvdXQgZ29pbmcgaW50byB0aGU4aW5pdGlhbGl6ZXIuLi5sYWRkX3RydXN0ZWRfdmFsaWRhdGlvbl9jb2RlBAE8dmFsaWRhdGlvbl9jb2Rl3QUBOFZhbGlkYXRpb25Db2RlAAU4oEFkZHMgdGhlIHZhbGlkYXRpb24gY29kZSB0byB0aGUgc3RvcmFnZS4AWQFUaGUgY29kZSB3aWxsIG5vdCBiZSBhZGRlZCBpZiBpdCBpcyBhbHJlYWR5IHByZXNlbnQuIEFkZGl0aW9uYWxseSwgaWYgUFZGIHByZS1jaGVja2luZ+BpcyBydW5uaW5nIGZvciB0aGF0IGNvZGUsIGl0IHdpbGwgYmUgaW5zdGFudGx5IGFjY2VwdGVkLgBRAU90aGVyd2lzZSwgdGhlIGNvZGUgd2lsbCBiZSBhZGRlZCBpbnRvIHRoZSBzdG9yYWdlLiBOb3RlIHRoYXQgdGhlIGNvZGUgd2lsbCBiZSBhZGRlZGEBaW50byBzdG9yYWdlIHdpdGggcmVmZXJlbmNlIGNvdW50IDAuIFRoaXMgaXMgdG8gYWNjb3VudCB0aGUgZmFjdCB0aGF0IHRoZXJlIGFyZSBubyB1c2Vyc00BZm9yIHRoaXMgY29kZSB5ZXQuIFRoZSBjYWxsZXIgd2lsbCBoYXZlIHRvIG1ha2Ugc3VyZSB0aGF0IHRoaXMgY29kZSBldmVudHVhbGx5IGdldHNJAXVzZWQgYnkgc29tZSBwYXJhY2hhaW4gb3IgcmVtb3ZlZCBmcm9tIHRoZSBzdG9yYWdlIHRvIGF2b2lkIHN0b3JhZ2UgbGVha3MuIEZvciB0aGVJAWxhdHRlciBwcmVmZXIgdG8gdXNlIHRoZSBgcG9rZV91bnVzZWRfdmFsaWRhdGlvbl9jb2RlYCBkaXNwYXRjaGFibGUgdG8gcmF3IHN0b3JhZ2U0bWFuaXB1bGF0aW9uLgBRAVRoaXMgZnVuY3Rpb24gaXMgbWFpbmx5IG1lYW50IHRvIGJlIHVzZWQgZm9yIHVwZ3JhZGluZyBwYXJhY2hhaW5zIHRoYXQgZG8gbm90IGZvbGxvdwkBdGhlIGdvLWFoZWFkIHNpZ25hbCB3aGlsZSB0aGUgUFZGIHByZS1jaGVja2luZyBmZWF0dXJlIGlzIGVuYWJsZWQubHBva2VfdW51c2VkX3ZhbGlkYXRpb25fY29kZQQBUHZhbGlkYXRpb25fY29kZV9oYXNowQUBSFZhbGlkYXRpb25Db2RlSGFzaAAGFCUBUmVtb3ZlIHRoZSB2YWxpZGF0aW9uIGNvZGUgZnJvbSB0aGUgc3RvcmFnZSBpZmYgdGhlIHJlZmVyZW5jZSBjb3VudCBpcyAwLgBZAVRoaXMgaXMgYmV0dGVyIHRoYW4gcmVtb3ZpbmcgdGhlIHN0b3JhZ2UgZGlyZWN0bHksIGJlY2F1c2UgaXQgd2lsbCBub3QgcmVtb3ZlIHRoZSBjb2RlQQF0aGF0IHdhcyBzdWRkZW5seSBnb3QgdXNlZCBieSBzb21lIHBhcmFjaGFpbiB3aGlsZSB0aGlzIGRpc3BhdGNoYWJsZSB3YXMgcGVuZGluZzBkaXNwYXRjaGluZy5saW5jbHVkZV9wdmZfY2hlY2tfc3RhdGVtZW50CAEQc3RtdBUGAURQdmZDaGVja1N0YXRlbWVudAABJHNpZ25hdHVyZakFAUhWYWxpZGF0b3JTaWduYXR1cmUABwhVAUluY2x1ZGVzIGEgc3RhdGVtZW50IGZvciBhIFBWRiBwcmUtY2hlY2tpbmcgdm90ZS4gUG90ZW50aWFsbHksIGZpbmFsaXplcyB0aGUgdm90ZSBhbmRBAWVuYWN0cyB0aGUgcmVzdWx0cyBpZiB0aGF0IHdhcyB0aGUgbGFzdCB2b3RlIGJlZm9yZSBhY2hpZXZpbmcgdGhlIHN1cGVybWFqb3JpdHkudGZvcmNlX3NldF9tb3N0X3JlY2VudF9jb250ZXh0CAEQcGFyYbECARhQYXJhSWQAARxjb250ZXh0EAFEQmxvY2tOdW1iZXJGb3I8VD4ACAQBAVNldCB0aGUgc3RvcmFnZSBmb3IgdGhlIGN1cnJlbnQgcGFyYWNoYWluIGhlYWQgZGF0YSBpbW1lZGlhdGVseS5ccmVtb3ZlX3VwZ3JhZGVfY29vbGRvd24EARBwYXJhsQIBGFBhcmFJZAAJEKxSZW1vdmUgYW4gdXBncmFkZSBjb29sZG93biBmb3IgYSBwYXJhY2hhaW4uAFEBVGhlIGNvc3QgZm9yIHJlbW92aW5nIHRoZSBjb29sZG93biBlYXJsaWVyIGRlcGVuZHMgb24gdGhlIHRpbWUgbGVmdCBmb3IgdGhlIGNvb2xkb3duQQFtdWx0aXBsaWVkIGJ5IFtgQ29uZmlnOjpDb29sZG93blJlbW92YWxNdWx0aXBsaWVyYF0uIFRoZSBwYWlkIHRva2VucyBhcmUgYnVybmVkLpRhdXRob3JpemVfZm9yY2Vfc2V0X2N1cnJlbnRfY29kZV9oYXNoDAEQcGFyYbECARhQYXJhSWQAATRuZXdfY29kZV9oYXNowQUBSFZhbGlkYXRpb25Db2RlSGFzaAABMHZhbGlkX3BlcmlvZBABREJsb2NrTnVtYmVyRm9yPFQ+AAosHQFTZXRzIHRoZSBzdG9yYWdlIGZvciB0aGUgYXV0aG9yaXplZCBjdXJyZW50IGNvZGUgaGFzaCBvZiB0aGUgcGFyYWNoYWluLmEBSWYgbm90IGFwcGxpZWQsIGl0IHdpbGwgYmUgcmVtb3ZlZCBhdCB0aGUgYFN5c3RlbTo6YmxvY2tfbnVtYmVyKCkgKyB2YWxpZF9wZXJpb2RgIGJsb2NrLgA9AVRoaXMgY2FuIGJlIHVzZWZ1bCwgd2hlbiB0cmlnZ2VyaW5nIGBQYXJhczo6Zm9yY2Vfc2V0X2N1cnJlbnRfY29kZShwYXJhLCBjb2RlKWAlAWZyb20gYSBkaWZmZXJlbnQgY2hhaW4gdGhhbiB0aGUgb25lIHdoZXJlIHRoZSBgUGFyYXNgIHBhbGxldCBpcyBkZXBsb3llZC4AVQFUaGUgbWFpbiBwdXJwb3NlIGlzIHRvIGF2b2lkIHRyYW5zZmVycmluZyB0aGUgZW50aXJlIGBjb2RlYCBXYXNtIGJsb2IgYmV0d2VlbiBjaGFpbnMuMQFJbnN0ZWFkLCB3ZSBhdXRob3JpemUgYGNvZGVfaGFzaGAgd2l0aCBgcm9vdGAsIHdoaWNoIGNhbiBsYXRlciBiZSBhcHBsaWVkIGJ5HQFgUGFyYXM6OmFwcGx5X2F1dGhvcml6ZWRfZm9yY2Vfc2V0X2N1cnJlbnRfY29kZShwYXJhLCBjb2RlKWAgYnkgYW55b25lLgDcQXV0aG9yaXphdGlvbnMgYXJlIHN0b3JlZCBpbiBhbiAqKm92ZXJ3cml0aW5nIG1hbm5lcioqLpxhcHBseV9hdXRob3JpemVkX2ZvcmNlX3NldF9jdXJyZW50X2NvZGUIARBwYXJhsQIBGFBhcmFJZAABIG5ld19jb2Rl3QUBOFZhbGlkYXRpb25Db2RlAAsI+EFwcGxpZXMgdGhlIGFscmVhZHkgYXV0aG9yaXplZCBjdXJyZW50IGNvZGUgZm9yIHRoZSBwYXJhY2hhaW4s+HRyaWdnZXJpbmcgdGhlIHNhbWUgZnVuY3Rpb25hbGl0eSBhcyBgZm9yY2Vfc2V0X2N1cnJlbnRfY29kZWAuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLhUGDExwb2xrYWRvdF9wcmltaXRpdmVzCHY4RFB2ZkNoZWNrU3RhdGVtZW50AAAQARhhY2NlcHQgARBib29sAAEcc3ViamVjdMEFAUhWYWxpZGF0aW9uQ29kZUhhc2gAATRzZXNzaW9uX2luZGV4EAEwU2Vzc2lvbkluZGV4AAE8dmFsaWRhdG9yX2luZGV4pQUBOFZhbGlkYXRvckluZGV4AAAZBhBscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zLGluaXRpYWxpemVyGHBhbGxldBBDYWxsBARUAAEENGZvcmNlX2FwcHJvdmUEARR1cF90bxABLEJsb2NrTnVtYmVyAAAMOQFJc3N1ZSBhIHNpZ25hbCB0byB0aGUgY29uc2Vuc3VzIGVuZ2luZSB0byBmb3JjaWJseSBhY3QgYXMgdGhvdWdoIGFsbCBwYXJhY2hhaW5RAWJsb2NrcyBpbiBhbGwgcmVsYXkgY2hhaW4gYmxvY2tzIHVwIHRvIGFuZCBpbmNsdWRpbmcgdGhlIGdpdmVuIG51bWJlciBpbiB0aGUgY3VycmVudKBjaGFpbiBhcmUgdmFsaWQgYW5kIHNob3VsZCBiZSBmaW5hbGl6ZWQuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLh0GEGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMQaHJtcBhwYWxsZXQQQ2FsbAQEVAABLFhocm1wX2luaXRfb3Blbl9jaGFubmVsDAEkcmVjaXBpZW50sQIBGFBhcmFJZAABVHByb3Bvc2VkX21heF9jYXBhY2l0eRABDHUzMgABZHByb3Bvc2VkX21heF9tZXNzYWdlX3NpemUQAQx1MzIAAChNAUluaXRpYXRlIG9wZW5pbmcgYSBjaGFubmVsIGZyb20gYSBwYXJhY2hhaW4gdG8gYSBnaXZlbiByZWNpcGllbnQgd2l0aCBnaXZlbiBjaGFubmVsLHBhcmFtZXRlcnMuAFkBLSBgcHJvcG9zZWRfbWF4X2NhcGFjaXR5YCAtIHNwZWNpZmllcyBob3cgbWFueSBtZXNzYWdlcyBjYW4gYmUgaW4gdGhlIGNoYW5uZWwgYXQgb25jZS4tAS0gYHByb3Bvc2VkX21heF9tZXNzYWdlX3NpemVgIC0gc3BlY2lmaWVzIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIG1lc3NhZ2VzLgARAVRoZXNlIG51bWJlcnMgYXJlIGEgc3ViamVjdCB0byB0aGUgcmVsYXktY2hhaW4gY29uZmlndXJhdGlvbiBsaW1pdHMuAFEBVGhlIGNoYW5uZWwgY2FuIGJlIG9wZW5lZCBvbmx5IGFmdGVyIHRoZSByZWNpcGllbnQgY29uZmlybXMgaXQgYW5kIG9ubHkgb24gYSBzZXNzaW9uHGNoYW5nZS5gaHJtcF9hY2NlcHRfb3Blbl9jaGFubmVsBAEYc2VuZGVysQIBGFBhcmFJZAABDPBBY2NlcHQgYSBwZW5kaW5nIG9wZW4gY2hhbm5lbCByZXF1ZXN0IGZyb20gdGhlIGdpdmVuIHNlbmRlci4A9FRoZSBjaGFubmVsIHdpbGwgYmUgb3BlbmVkIG9ubHkgb24gdGhlIG5leHQgc2Vzc2lvbiBib3VuZGFyeS5IaHJtcF9jbG9zZV9jaGFubmVsBAEoY2hhbm5lbF9pZCEGATRIcm1wQ2hhbm5lbElkAAIQVQFJbml0aWF0ZSB1bmlsYXRlcmFsIGNsb3Npbmcgb2YgYSBjaGFubmVsLiBUaGUgb3JpZ2luIG11c3QgYmUgZWl0aGVyIHRoZSBzZW5kZXIgb3IgdGhlmHJlY2lwaWVudCBpbiB0aGUgY2hhbm5lbCBiZWluZyBjbG9zZWQuAMBUaGUgY2xvc3VyZSBjYW4gb25seSBoYXBwZW4gb24gYSBzZXNzaW9uIGNoYW5nZS5AZm9yY2VfY2xlYW5faHJtcAwBEHBhcmGxAgEYUGFyYUlkAAEsbnVtX2luYm91bmQQAQx1MzIAATBudW1fb3V0Ym91bmQQAQx1MzIAAxxdAVRoaXMgZXh0cmluc2ljIHRyaWdnZXJzIHRoZSBjbGVhbnVwIG9mIGFsbCB0aGUgSFJNUCBzdG9yYWdlIGl0ZW1zIHRoYXQgYSBwYXJhIG1heSBoYXZlLkkBTm9ybWFsbHkgdGhpcyBoYXBwZW5zIG9uY2UgcGVyIHNlc3Npb24sIGJ1dCB0aGlzIGFsbG93cyB5b3UgdG8gdHJpZ2dlciB0aGUgY2xlYW51cJRpbW1lZGlhdGVseSBmb3IgYSBzcGVjaWZpYyBwYXJhY2hhaW4uAFEBTnVtYmVyIG9mIGluYm91bmQgYW5kIG91dGJvdW5kIGNoYW5uZWxzIGZvciBgcGFyYWAgbXVzdCBiZSBwcm92aWRlZCBhcyB3aXRuZXNzIGRhdGEuAJBPcmlnaW4gbXVzdCBiZSB0aGUgYENoYW5uZWxNYW5hZ2VyYC5cZm9yY2VfcHJvY2Vzc19ocm1wX29wZW4EASBjaGFubmVscxABDHUzMgAEIKRGb3JjZSBwcm9jZXNzIEhSTVAgb3BlbiBjaGFubmVsIHJlcXVlc3RzLgBVAUlmIHRoZXJlIGFyZSBwZW5kaW5nIEhSTVAgb3BlbiBjaGFubmVsIHJlcXVlc3RzLCB5b3UgY2FuIHVzZSB0aGlzIGZ1bmN0aW9uIHRvIHByb2Nlc3OIYWxsIG9mIHRob3NlIHJlcXVlc3RzIGltbWVkaWF0ZWx5LgAJAVRvdGFsIG51bWJlciBvZiBvcGVuaW5nIGNoYW5uZWxzIG11c3QgYmUgcHJvdmlkZWQgYXMgd2l0bmVzcyBkYXRhLgCQT3JpZ2luIG11c3QgYmUgdGhlIGBDaGFubmVsTWFuYWdlcmAuYGZvcmNlX3Byb2Nlc3NfaHJtcF9jbG9zZQQBIGNoYW5uZWxzEAEMdTMyAAUgqEZvcmNlIHByb2Nlc3MgSFJNUCBjbG9zZSBjaGFubmVsIHJlcXVlc3RzLgBZAUlmIHRoZXJlIGFyZSBwZW5kaW5nIEhSTVAgY2xvc2UgY2hhbm5lbCByZXF1ZXN0cywgeW91IGNhbiB1c2UgdGhpcyBmdW5jdGlvbiB0byBwcm9jZXNziGFsbCBvZiB0aG9zZSByZXF1ZXN0cyBpbW1lZGlhdGVseS4ACQFUb3RhbCBudW1iZXIgb2YgY2xvc2luZyBjaGFubmVscyBtdXN0IGJlIHByb3ZpZGVkIGFzIHdpdG5lc3MgZGF0YS4AkE9yaWdpbiBtdXN0IGJlIHRoZSBgQ2hhbm5lbE1hbmFnZXJgLmBocm1wX2NhbmNlbF9vcGVuX3JlcXVlc3QIAShjaGFubmVsX2lkIQYBNEhybXBDaGFubmVsSWQAATRvcGVuX3JlcXVlc3RzEAEMdTMyAAYgXQFUaGlzIGNhbmNlbHMgYSBwZW5kaW5nIG9wZW4gY2hhbm5lbCByZXF1ZXN0LiBJdCBjYW4gYmUgY2FuY2VsZWQgYnkgZWl0aGVyIG9mIHRoZSBzZW5kZXIZAW9yIHRoZSByZWNpcGllbnQgZm9yIHRoYXQgcmVxdWVzdC4gVGhlIG9yaWdpbiBtdXN0IGJlIGVpdGhlciBvZiB0aG9zZS4AXQFUaGUgY2FuY2VsbGF0aW9uIGhhcHBlbnMgaW1tZWRpYXRlbHkuIEl0IGlzIG5vdCBwb3NzaWJsZSB0byBjYW5jZWwgdGhlIHJlcXVlc3QgaWYgaXQgaXNEYWxyZWFkeSBhY2NlcHRlZC4AWQFUb3RhbCBudW1iZXIgb2Ygb3BlbiByZXF1ZXN0cyAoaS5lLiBgSHJtcE9wZW5DaGFubmVsUmVxdWVzdHNMaXN0YCkgbXVzdCBiZSBwcm92aWRlZCBhczR3aXRuZXNzIGRhdGEuXGZvcmNlX29wZW5faHJtcF9jaGFubmVsEAEYc2VuZGVysQIBGFBhcmFJZAABJHJlY2lwaWVudLECARhQYXJhSWQAATBtYXhfY2FwYWNpdHkQAQx1MzIAAUBtYXhfbWVzc2FnZV9zaXplEAEMdTMyAAcgYQFPcGVuIGEgY2hhbm5lbCBmcm9tIGEgYHNlbmRlcmAgdG8gYSBgcmVjaXBpZW50YCBgUGFyYUlkYC4gQWx0aG91Z2ggb3BlbmVkIGJ5IGdvdmVybmFuY2UsQQF0aGUgYG1heF9jYXBhY2l0eWAgYW5kIGBtYXhfbWVzc2FnZV9zaXplYCBhcmUgc3RpbGwgc3ViamVjdCB0byB0aGUgUmVsYXkgQ2hhaW4nc0hjb25maWd1cmVkIGxpbWl0cy4ATQFFeHBlY3RlZCB1c2UgaXMgd2hlbiBvbmUgKGFuZCBvbmx5IG9uZSkgb2YgdGhlIGBQYXJhSWRgcyBpbnZvbHZlZCBpbiB0aGUgY2hhbm5lbCBpc8Bnb3Zlcm5lZCBieSB0aGUgc3lzdGVtLCBlLmcuIGEgc3lzdGVtIHBhcmFjaGFpbi4AkE9yaWdpbiBtdXN0IGJlIHRoZSBgQ2hhbm5lbE1hbmFnZXJgLmBlc3RhYmxpc2hfc3lzdGVtX2NoYW5uZWwIARhzZW5kZXKxAgEYUGFyYUlkAAEkcmVjaXBpZW50sQIBGFBhcmFJZAAIMFEBRXN0YWJsaXNoIGFuIEhSTVAgY2hhbm5lbCBiZXR3ZWVuIHR3byBzeXN0ZW0gY2hhaW5zLiBJZiB0aGUgY2hhbm5lbCBkb2VzIG5vdCBhbHJlYWR5UQFleGlzdCwgdGhlIHRyYW5zYWN0aW9uIGZlZXMgd2lsbCBiZSByZWZ1bmRlZCB0byB0aGUgY2FsbGVyLiBUaGUgc3lzdGVtIGRvZXMgbm90IHRha2VZAWRlcG9zaXRzIGZvciBjaGFubmVscyBiZXR3ZWVuIHN5c3RlbSBjaGFpbnMsIGFuZCBhdXRvbWF0aWNhbGx5IHNldHMgdGhlIG1lc3NhZ2UgbnVtYmVyGQFhbmQgc2l6ZSBsaW1pdHMgdG8gdGhlIG1heGltdW0gYWxsb3dlZCBieSB0aGUgbmV0d29yaydzIGNvbmZpZ3VyYXRpb24uAChBcmd1bWVudHM6AJQtIGBzZW5kZXJgOiBBIHN5c3RlbSBjaGFpbiwgYFBhcmFJZGAuoC0gYHJlY2lwaWVudGA6IEEgc3lzdGVtIGNoYWluLCBgUGFyYUlkYC4AVQFBbnkgc2lnbmVkIG9yaWdpbiBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uLCBidXQgX2JvdGhfIGlucHV0cyBNVVNUIGJlIHN5c3RlbSBjaGFpbnMuIElmwHRoZSBjaGFubmVsIGRvZXMgbm90IGV4aXN0IHlldCwgdGhlcmUgaXMgbm8gZmVlLlRwb2tlX2NoYW5uZWxfZGVwb3NpdHMIARhzZW5kZXKxAgEYUGFyYUlkAAEkcmVjaXBpZW50sQIBGFBhcmFJZAAJJFEBVXBkYXRlIHRoZSBkZXBvc2l0cyBoZWxkIGZvciBhbiBIUk1QIGNoYW5uZWwgdG8gdGhlIGxhdGVzdCBgQ29uZmlndXJhdGlvbmAuIENoYW5uZWxzsHdpdGggc3lzdGVtIGNoYWlucyBkbyBub3QgcmVxdWlyZSBhIGRlcG9zaXQuAChBcmd1bWVudHM6AHgtIGBzZW5kZXJgOiBBIGNoYWluLCBgUGFyYUlkYC6ELSBgcmVjaXBpZW50YDogQSBjaGFpbiwgYFBhcmFJZGAuAKRBbnkgc2lnbmVkIG9yaWdpbiBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uLnRlc3RhYmxpc2hfY2hhbm5lbF93aXRoX3N5c3RlbQQBTHRhcmdldF9zeXN0ZW1fY2hhaW6xAgEYUGFyYUlkAAocOQFFc3RhYmxpc2ggYSBiaWRpcmVjdGlvbmFsIEhSTVAgY2hhbm5lbCBiZXR3ZWVuIGEgcGFyYWNoYWluIGFuZCBhIHN5c3RlbSBjaGFpbi4AKEFyZ3VtZW50czoAyC0gYHRhcmdldF9zeXN0ZW1fY2hhaW5gOiBBIHN5c3RlbSBjaGFpbiwgYFBhcmFJZGAuALBUaGUgb3JpZ2luIG5lZWRzIHRvIGJlIHRoZSBwYXJhY2hhaW4gb3JpZ2luLgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy4hBgx0cG9sa2Fkb3RfcGFyYWNoYWluX3ByaW1pdGl2ZXMocHJpbWl0aXZlczRIcm1wQ2hhbm5lbElkAAAIARhzZW5kZXKxAgEISWQAASRyZWNpcGllbnSxAgEISWQAACUGEGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMgZGlzcHV0ZXMYcGFsbGV0EENhbGwEBFQAAQQ4Zm9yY2VfdW5mcmVlemUAAAAEDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMuKQYUbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucyBkaXNwdXRlcyBzbGFzaGluZxhwYWxsZXQQQ2FsbAQEVAABBHByZXBvcnRfZGlzcHV0ZV9sb3N0X3Vuc2lnbmVkCAE0ZGlzcHV0ZV9wcm9vZi0GAUxCb3g8RGlzcHV0ZVByb29mVjI+AAE8a2V5X293bmVyX3Byb29m1QEBQFQ6OktleU93bmVyUHJvb2YAAAAEDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMuLQYMTHBvbGthZG90X3ByaW1pdGl2ZXMgdnN0YWdpbmcwRGlzcHV0ZVByb29mAAAQASR0aW1lX3Nsb3QxBgFARGlzcHV0ZXNUaW1lU2xvdAABEGtpbmQ1BgFIRGlzcHV0ZU9mZmVuY2VLaW5kAAE8dmFsaWRhdG9yX2luZGV4pQUBOFZhbGlkYXRvckluZGV4AAEwdmFsaWRhdG9yX2lkWQIBLFZhbGlkYXRvcklkAAAxBhBMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2OCBzbGFzaGluZ0BEaXNwdXRlc1RpbWVTbG90AAAIATRzZXNzaW9uX2luZGV4EAEwU2Vzc2lvbkluZGV4AAE4Y2FuZGlkYXRlX2hhc2j1BQE0Q2FuZGlkYXRlSGFzaAAANQYMTHBvbGthZG90X3ByaW1pdGl2ZXMgdnN0YWdpbmdIRGlzcHV0ZU9mZmVuY2VLaW5kAAEMQEZvckludmFsaWRCYWNrZWQAAAAwQWdhaW5zdFZhbGlkAAEASEZvckludmFsaWRBcHByb3ZlZAACAAA5BhBscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zJG9uX2RlbWFuZBhwYWxsZXQQQ2FsbAQEVAABDFxwbGFjZV9vcmRlcl9hbGxvd19kZWF0aAgBKG1heF9hbW91bnQYATBCYWxhbmNlT2Y8VD4AARxwYXJhX2lksQIBGFBhcmFJZAAAPJRDcmVhdGUgYSBzaW5nbGUgb24gZGVtYW5kIGNvcmUgb3JkZXIuSQFXaWxsIHVzZSB0aGUgc3BvdCBwcmljZSBmb3IgdGhlIGN1cnJlbnQgYmxvY2sgYW5kIHdpbGwgcmVhcCB0aGUgYWNjb3VudCBpZiBuZWVkZWQuACxQYXJhbWV0ZXJzOjkBLSBgb3JpZ2luYDogVGhlIHNlbmRlciBvZiB0aGUgY2FsbCwgZnVuZHMgd2lsbCBiZSB3aXRoZHJhd24gZnJvbSB0aGlzIGFjY291bnQuSQEtIGBtYXhfYW1vdW50YDogVGhlIG1heGltdW0gYmFsYW5jZSB0byB3aXRoZHJhdyBmcm9tIHRoZSBvcmlnaW4gdG8gcGxhY2UgYW4gb3JkZXIuDQEtIGBwYXJhX2lkYDogQSBgUGFyYUlkYCB0aGUgb3JpZ2luIHdhbnRzIHRvIHByb3ZpZGUgYmxvY2tzcGFjZSBmb3IuABxFcnJvcnM65C0gYEluc3VmZmljaWVudEJhbGFuY2VgOiBmcm9tIHRoZSBDdXJyZW5jeSBpbXBsZW1lbnRhdGlvbjQtIGBRdWV1ZUZ1bGxggC0gYFNwb3RQcmljZUhpZ2hlclRoYW5NYXhBbW91bnRgABxFdmVudHM6XC0gYE9uRGVtYW5kT3JkZXJQbGFjZWRgWHBsYWNlX29yZGVyX2tlZXBfYWxpdmUIAShtYXhfYW1vdW50GAEwQmFsYW5jZU9mPFQ+AAEccGFyYV9pZLECARhQYXJhSWQAATxhAVNhbWUgYXMgdGhlIFtgcGxhY2Vfb3JkZXJfYWxsb3dfZGVhdGhgXShTZWxmOjpwbGFjZV9vcmRlcl9hbGxvd19kZWF0aCkgY2FsbCAsIGJ1dCB3aXRoIGHcY2hlY2sgdGhhdCBwbGFjaW5nIHRoZSBvcmRlciB3aWxsIG5vdCByZWFwIHRoZSBhY2NvdW50LgAsUGFyYW1ldGVyczo5AS0gYG9yaWdpbmA6IFRoZSBzZW5kZXIgb2YgdGhlIGNhbGwsIGZ1bmRzIHdpbGwgYmUgd2l0aGRyYXduIGZyb20gdGhpcyBhY2NvdW50LkkBLSBgbWF4X2Ftb3VudGA6IFRoZSBtYXhpbXVtIGJhbGFuY2UgdG8gd2l0aGRyYXcgZnJvbSB0aGUgb3JpZ2luIHRvIHBsYWNlIGFuIG9yZGVyLg0BLSBgcGFyYV9pZGA6IEEgYFBhcmFJZGAgdGhlIG9yaWdpbiB3YW50cyB0byBwcm92aWRlIGJsb2Nrc3BhY2UgZm9yLgAcRXJyb3JzOuQtIGBJbnN1ZmZpY2llbnRCYWxhbmNlYDogZnJvbSB0aGUgQ3VycmVuY3kgaW1wbGVtZW50YXRpb240LSBgUXVldWVGdWxsYIAtIGBTcG90UHJpY2VIaWdoZXJUaGFuTWF4QW1vdW50YAAcRXZlbnRzOlwtIGBPbkRlbWFuZE9yZGVyUGxhY2VkYGBwbGFjZV9vcmRlcl93aXRoX2NyZWRpdHMIAShtYXhfYW1vdW50GAEwQmFsYW5jZU9mPFQ+AAEccGFyYV9pZLECARhQYXJhSWQAAkTIQ3JlYXRlIGEgc2luZ2xlIG9uIGRlbWFuZCBjb3JlIG9yZGVyIHdpdGggY3JlZGl0cy5ZAVdpbGwgY2hhcmdlIHRoZSBvd25lcidzIG9uLWRlbWFuZCBjcmVkaXQgYWNjb3VudCB0aGUgc3BvdCBwcmljZSBmb3IgdGhlIGN1cnJlbnQgYmxvY2suACxQYXJhbWV0ZXJzOkUBLSBgb3JpZ2luYDogVGhlIHNlbmRlciBvZiB0aGUgY2FsbCwgb24tZGVtYW5kIGNyZWRpdHMgd2lsbCBiZSB3aXRoZHJhd24gZnJvbSB0aGlzKCAgYWNjb3VudC5JAS0gYG1heF9hbW91bnRgOiBUaGUgbWF4aW11bSBudW1iZXIgb2YgY3JlZGl0cyB0byBzcGVuZCBmcm9tIHRoZSBvcmlnaW4gdG8gcGxhY2UgYW4gICBvcmRlci4NAS0gYHBhcmFfaWRgOiBBIGBQYXJhSWRgIHRoZSBvcmlnaW4gd2FudHMgdG8gcHJvdmlkZSBibG9ja3NwYWNlIGZvci4AHEVycm9yczpcLSBgSW5zdWZmaWNpZW50Q3JlZGl0c2A0LSBgUXVldWVGdWxsYIAtIGBTcG90UHJpY2VIaWdoZXJUaGFuTWF4QW1vdW50YAAcRXZlbnRzOlwtIGBPbkRlbWFuZE9yZGVyUGxhY2VkYAQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy49BhBccG9sa2Fkb3RfcnVudGltZV9jb21tb248cGFyYXNfcmVnaXN0cmFyGHBhbGxldBBDYWxsBARUAAEkIHJlZ2lzdGVyDAEIaWSxAgEYUGFyYUlkAAEwZ2VuZXNpc19oZWFk4QUBIEhlYWREYXRhAAE8dmFsaWRhdGlvbl9jb2Rl3QUBOFZhbGlkYXRpb25Db2RlAABQ+FJlZ2lzdGVyIGhlYWQgZGF0YSBhbmQgdmFsaWRhdGlvbiBjb2RlIGZvciBhIHJlc2VydmVkIFBhcmEgSWQuADAjIyBBcmd1bWVudHPALSBgb3JpZ2luYDogTXVzdCBiZSBjYWxsZWQgYnkgYSBgU2lnbmVkYCBvcmlnaW4uLQEtIGBpZGA6IFRoZSBwYXJhIElELiBNdXN0IGJlIG93bmVkL21hbmFnZWQgYnkgdGhlIGBvcmlnaW5gIHNpZ25pbmcgYWNjb3VudC4BAS0gYGdlbmVzaXNfaGVhZGA6IFRoZSBnZW5lc2lzIGhlYWQgZGF0YSBvZiB0aGUgcGFyYWNoYWluL3RocmVhZC4lAS0gYHZhbGlkYXRpb25fY29kZWA6IFRoZSBpbml0aWFsIHZhbGlkYXRpb24gY29kZSBvZiB0aGUgcGFyYWNoYWluL3RocmVhZC4AQCMjIERlcG9zaXRzL0ZlZXMJAVRoZSBhY2NvdW50IHdpdGggdGhlIG9yaWdpbmF0aW5nIHNpZ25hdHVyZSBtdXN0IHJlc2VydmUgYSBkZXBvc2l0LgBNAVRoZSBkZXBvc2l0IGlzIHJlcXVpcmVkIHRvIGNvdmVyIHRoZSBjb3N0cyBhc3NvY2lhdGVkIHdpdGggc3RvcmluZyB0aGUgZ2VuZXNpcyBoZWFkdGRhdGEgYW5kIHRoZSB2YWxpZGF0aW9uIGNvZGUuMQFUaGlzIGFjY291bnRzIGZvciB0aGUgcG90ZW50aWFsIHRvIHN0b3JlIHZhbGlkYXRpb24gY29kZSBvZiBhIHNpemUgdXAgdG8gdGhl3GBtYXhfY29kZV9zaXplYCwgYXMgZGVmaW5lZCBpbiB0aGUgY29uZmlndXJhdGlvbiBwYWxsZXQAHQFBbnl0aGluZyBhbHJlYWR5IHJlc2VydmVkIHByZXZpb3VzbHkgZm9yIHRoaXMgcGFyYSBJRCBpcyBhY2NvdW50ZWQgZm9yLgAkIyMgRXZlbnRz1FRoZSBgUmVnaXN0ZXJlZGAgZXZlbnQgaXMgZW1pdHRlZCBpbiBjYXNlIG9mIHN1Y2Nlc3MuOGZvcmNlX3JlZ2lzdGVyFAEMd2hvAAEwVDo6QWNjb3VudElkAAEcZGVwb3NpdBgBMEJhbGFuY2VPZjxUPgABCGlksQIBGFBhcmFJZAABMGdlbmVzaXNfaGVhZOEFASBIZWFkRGF0YQABPHZhbGlkYXRpb25fY29kZd0FAThWYWxpZGF0aW9uQ29kZQABGNxGb3JjZSB0aGUgcmVnaXN0cmF0aW9uIG9mIGEgUGFyYSBJZCBvbiB0aGUgcmVsYXkgY2hhaW4uALhUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGJ5IGEgUm9vdCBvcmlnaW4uABkBVGhlIGRlcG9zaXQgdGFrZW4gY2FuIGJlIHNwZWNpZmllZCBmb3IgdGhpcyByZWdpc3RyYXRpb24uIEFueSBgUGFyYUlkYBkBY2FuIGJlIHJlZ2lzdGVyZWQsIGluY2x1ZGluZyBzdWItMTAwMCBJRHMgd2hpY2ggYXJlIFN5c3RlbSBQYXJhY2hhaW5zLihkZXJlZ2lzdGVyBAEIaWSxAgEYUGFyYUlkAAIQBQFEZXJlZ2lzdGVyIGEgUGFyYSBJZCwgZnJlZWluZyBhbGwgZGF0YSBhbmQgcmV0dXJuaW5nIGFueSBkZXBvc2l0LgBRAVRoZSBjYWxsZXIgbXVzdCBiZSBSb290LCB0aGUgYHBhcmFgIG93bmVyLCBvciB0aGUgYHBhcmFgIGl0c2VsZi4gVGhlIHBhcmEgbXVzdCBiZSBhblBvbi1kZW1hbmQgcGFyYWNoYWluLhBzd2FwCAEIaWSxAgEYUGFyYUlkAAEUb3RoZXKxAgEYUGFyYUlkAAMwQQFTd2FwIGEgbGVhc2UgaG9sZGluZyBwYXJhY2hhaW4gd2l0aCBhbm90aGVyIHBhcmFjaGFpbiwgZWl0aGVyIG9uLWRlbWFuZCBvciBsZWFzZSBob2xkaW5nLgABAVRoZSBvcmlnaW4gbXVzdCBiZSBSb290LCB0aGUgYHBhcmFgIG93bmVyLCBvciB0aGUgYHBhcmFgIGl0c2VsZi4AYQFUaGUgc3dhcCB3aWxsIGhhcHBlbiBvbmx5IGlmIHRoZXJlIGlzIGFscmVhZHkgYW4gb3Bwb3NpdGUgc3dhcCBwZW5kaW5nLiBJZiB0aGVyZSBpcyBub3QsWQF0aGUgc3dhcCB3aWxsIGJlIHN0b3JlZCBpbiB0aGUgcGVuZGluZyBzd2FwcyBtYXAsIHJlYWR5IGZvciBhIGxhdGVyIGNvbmZpcm1hdG9yeSBzd2FwLgBdAVRoZSBgUGFyYUlkYHMgcmVtYWluIG1hcHBlZCB0byB0aGUgc2FtZSBoZWFkIGRhdGEgYW5kIGNvZGUgc28gZXh0ZXJuYWwgY29kZSBjYW4gcmVseSBvbj0BYFBhcmFJZGAgdG8gYmUgYSBsb25nLXRlcm0gaWRlbnRpZmllciBvZiBhIG5vdGlvbmFsICJwYXJhY2hhaW4iLiBIb3dldmVyLCB0aGVpcjUBc2NoZWR1bGluZyBpbmZvIChpLmUuIHdoZXRoZXIgdGhleSdyZSBhbiBvbi1kZW1hbmQgcGFyYWNoYWluIG9yIGxlYXNlIGhvbGRpbmcVAXBhcmFjaGFpbiksIGF1Y3Rpb24gaW5mb3JtYXRpb24gYW5kIHRoZSBhdWN0aW9uIGRlcG9zaXQgYXJlIHN3aXRjaGVkLixyZW1vdmVfbG9jawQBEHBhcmGxAgEYUGFyYUlkAAQQDQFSZW1vdmUgYSBtYW5hZ2VyIGxvY2sgZnJvbSBhIHBhcmEuIFRoaXMgd2lsbCBhbGxvdyB0aGUgbWFuYWdlciBvZiBhNQFwcmV2aW91c2x5IGxvY2tlZCBwYXJhIHRvIGRlcmVnaXN0ZXIgb3Igc3dhcCBhIHBhcmEgd2l0aG91dCB1c2luZyBnb3Zlcm5hbmNlLgDcQ2FuIG9ubHkgYmUgY2FsbGVkIGJ5IHRoZSBSb290IG9yaWdpbiBvciB0aGUgcGFyYWNoYWluLhxyZXNlcnZlAAVElFJlc2VydmUgYSBQYXJhIElkIG9uIHRoZSByZWxheSBjaGFpbi4ATQFUaGlzIGZ1bmN0aW9uIHdpbGwgcmVzZXJ2ZSBhIG5ldyBQYXJhIElkIHRvIGJlIG93bmVkL21hbmFnZWQgYnkgdGhlIG9yaWdpbiBhY2NvdW50LmEBVGhlIG9yaWdpbiBhY2NvdW50IGlzIGFibGUgdG8gcmVnaXN0ZXIgaGVhZCBkYXRhIGFuZCB2YWxpZGF0aW9uIGNvZGUgdXNpbmcgYHJlZ2lzdGVyYCB0b1kBY3JlYXRlIGFuIG9uLWRlbWFuZCBwYXJhY2hhaW4uIFVzaW5nIHRoZSBTbG90cyBwYWxsZXQsIGFuIG9uLWRlbWFuZCBwYXJhY2hhaW4gY2FuIHRoZW6kYmUgdXBncmFkZWQgdG8gYSBsZWFzZSBob2xkaW5nIHBhcmFjaGFpbi4AMCMjIEFyZ3VtZW50c1UBLSBgb3JpZ2luYDogTXVzdCBiZSBjYWxsZWQgYnkgYSBgU2lnbmVkYCBvcmlnaW4uIEJlY29tZXMgdGhlIG1hbmFnZXIvb3duZXIgb2YgdGhlIG5ldyggIHBhcmEgSUQuAEAjIyBEZXBvc2l0cy9GZWVzIQFUaGUgb3JpZ2luIG11c3QgcmVzZXJ2ZSBhIGRlcG9zaXQgb2YgYFBhcmFEZXBvc2l0YCBmb3IgdGhlIHJlZ2lzdHJhdGlvbi4AJCMjIEV2ZW50c1kBVGhlIGBSZXNlcnZlZGAgZXZlbnQgaXMgZW1pdHRlZCBpbiBjYXNlIG9mIHN1Y2Nlc3MsIHdoaWNoIHByb3ZpZGVzIHRoZSBJRCByZXNlcnZlZCBmb3IQdXNlLiBhZGRfbG9jawQBEHBhcmGxAgEYUGFyYUlkAAYUCQFBZGQgYSBtYW5hZ2VyIGxvY2sgZnJvbSBhIHBhcmEuIFRoaXMgd2lsbCBwcmV2ZW50IHRoZSBtYW5hZ2VyIG9mIGGIcGFyYSB0byBkZXJlZ2lzdGVyIG9yIHN3YXAgYSBwYXJhLgBJAUNhbiBiZSBjYWxsZWQgYnkgUm9vdCwgdGhlIHBhcmFjaGFpbiwgb3IgdGhlIHBhcmFjaGFpbiBtYW5hZ2VyIGlmIHRoZSBwYXJhY2hhaW4gaXMkdW5sb2NrZWQuVHNjaGVkdWxlX2NvZGVfdXBncmFkZQgBEHBhcmGxAgEYUGFyYUlkAAEgbmV3X2NvZGXdBQE4VmFsaWRhdGlvbkNvZGUAByx0U2NoZWR1bGUgYSBwYXJhY2hhaW4gdXBncmFkZS4AVQFUaGlzIHdpbGwga2ljayBvZmYgYSBjaGVjayBvZiBgbmV3X2NvZGVgIGJ5IGFsbCB2YWxpZGF0b3JzLiBBZnRlciB0aGUgbWFqb3JpdHkgb2YgdGhlVQF2YWxpZGF0b3JzIGhhdmUgcmVwb3J0ZWQgb24gdGhlIHZhbGlkaXR5IG9mIHRoZSBjb2RlLCB0aGUgY29kZSB3aWxsIGVpdGhlciBiZSBlbmFjdGVkVQFvciB0aGUgdXBncmFkZSB3aWxsIGJlIHJlamVjdGVkLiBJZiB0aGUgY29kZSB3aWxsIGJlIGVuYWN0ZWQsIHRoZSBjdXJyZW50IGNvZGUgb2YgdGhlXQFwYXJhY2hhaW4gd2lsbCBiZSBvdmVyd3JpdHRlbiBkaXJlY3RseS4gVGhpcyBtZWFucyB0aGF0IGFueSBQb1Ygd2lsbCBiZSBjaGVja2VkIGJ5IHRoaXNdAW5ldyBjb2RlLiBUaGUgcGFyYWNoYWluIGl0c2VsZiB3aWxsIG5vdCBiZSBpbmZvcm1lZCBleHBsaWNpdGx5IHRoYXQgdGhlIHZhbGlkYXRpb24gY29kZTBoYXMgY2hhbmdlZC4ASQFDYW4gYmUgY2FsbGVkIGJ5IFJvb3QsIHRoZSBwYXJhY2hhaW4sIG9yIHRoZSBwYXJhY2hhaW4gbWFuYWdlciBpZiB0aGUgcGFyYWNoYWluIGlzJHVubG9ja2VkLkBzZXRfY3VycmVudF9oZWFkCAEQcGFyYbECARhQYXJhSWQAASBuZXdfaGVhZOEFASBIZWFkRGF0YQAIEIRTZXQgdGhlIHBhcmFjaGFpbidzIGN1cnJlbnQgaGVhZC4ASQFDYW4gYmUgY2FsbGVkIGJ5IFJvb3QsIHRoZSBwYXJhY2hhaW4sIG9yIHRoZSBwYXJhY2hhaW4gbWFuYWdlciBpZiB0aGUgcGFyYWNoYWluIGlzJHVubG9ja2VkLgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy5BBhBccG9sa2Fkb3RfcnVudGltZV9jb21tb24Uc2xvdHMYcGFsbGV0EENhbGwEBFQAAQwsZm9yY2VfbGVhc2UUARBwYXJhsQIBGFBhcmFJZAABGGxlYXNlcgABMFQ6OkFjY291bnRJZAABGGFtb3VudBgBMEJhbGFuY2VPZjxUPgABMHBlcmlvZF9iZWdpbhABQExlYXNlUGVyaW9kT2Y8VD4AATBwZXJpb2RfY291bnQQAUBMZWFzZVBlcmlvZE9mPFQ+AAAQTQFKdXN0IGEgY29ubmVjdCBpbnRvIHRoZSBgbGVhc2Vfb3V0YCBjYWxsLCBpbiBjYXNlIFJvb3Qgd2FudHMgdG8gZm9yY2Ugc29tZSBsZWFzZSB0b/xoYXBwZW4gaW5kZXBlbmRlbnRseSBvZiBhbnkgb3RoZXIgb24tY2hhaW4gbWVjaGFuaXNtIHRvIHVzZSBpdC4A+FRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IG1hdGNoIGBUOjpGb3JjZU9yaWdpbmAuQGNsZWFyX2FsbF9sZWFzZXMEARBwYXJhsQIBGFBhcmFJZAABDE0BQ2xlYXIgYWxsIGxlYXNlcyBmb3IgYSBQYXJhIElkLCByZWZ1bmRpbmcgYW55IGRlcG9zaXRzIGJhY2sgdG8gdGhlIG9yaWdpbmFsIG93bmVycy4A+FRoZSBkaXNwYXRjaCBvcmlnaW4gZm9yIHRoaXMgY2FsbCBtdXN0IG1hdGNoIGBUOjpGb3JjZU9yaWdpbmAuPHRyaWdnZXJfb25ib2FyZAQBEHBhcmGxAgEYUGFyYUlkAAIcJQFUcnkgdG8gb25ib2FyZCBhIHBhcmFjaGFpbiB0aGF0IGhhcyBhIGxlYXNlIGZvciB0aGUgY3VycmVudCBsZWFzZSBwZXJpb2QuAEUBVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZnVsIGlmIHRoZXJlIHdhcyBzb21lIHN0YXRlIGlzc3VlIHdpdGggYSBwYXJhIHRoYXQgc2hvdWxkOQFoYXZlIG9uYm9hcmRlZCwgYnV0IHdhcyB1bmFibGUgdG8uIEFzIGxvbmcgYXMgdGhleSBoYXZlIGEgbGVhc2UgcGVyaW9kLCB3ZSBjYW5sbGV0IHRoZW0gb25ib2FyZCBmcm9tIGhlcmUuAMxPcmlnaW4gbXVzdCBiZSBzaWduZWQsIGJ1dCBjYW4gYmUgY2FsbGVkIGJ5IGFueW9uZS4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMuRQYQXHBvbGthZG90X3J1bnRpbWVfY29tbW9uSHBhcmFzX3N1ZG9fd3JhcHBlchhwYWxsZXQQQ2FsbAQEVAABGHRzdWRvX3NjaGVkdWxlX3BhcmFfaW5pdGlhbGl6ZQgBCGlksQIBGFBhcmFJZAABHGdlbmVzaXNJBgE8UGFyYUdlbmVzaXNBcmdzAAAUDQFTY2hlZHVsZSBhIHBhcmEgdG8gYmUgaW5pdGlhbGl6ZWQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBuZXh0IHNlc3Npb24uAE0BVGhpcyBzaG91bGQgb25seSBiZSB1c2VkIGZvciBURVNUSU5HIGFuZCBub3Qgb24gUFJPRFVDVElPTiBjaGFpbnMuIEl0IGF1dG9tYXRpY2FsbHlJAWFzc2lnbnMgQ29yZXRpbWUgdG8gdGhlIGNoYWluIGFuZCBpbmNyZWFzZXMgdGhlIG51bWJlciBvZiBjb3Jlcy4gVGh1cywgdGhlcmUgaXMgbm+AcnVubmluZyBjb3JldGltZSBjaGFpbiByZXF1aXJlZC5oc3Vkb19zY2hlZHVsZV9wYXJhX2NsZWFudXAEAQhpZLECARhQYXJhSWQAAQQJAVNjaGVkdWxlIGEgcGFyYSB0byBiZSBjbGVhbmVkIHVwIGF0IHRoZSBzdGFydCBvZiB0aGUgbmV4dCBzZXNzaW9uLoBzdWRvX3NjaGVkdWxlX3BhcmF0aHJlYWRfdXBncmFkZQQBCGlksQIBGFBhcmFJZAACBB0BVXBncmFkZSBhIHBhcmF0aHJlYWQgKG9uLWRlbWFuZCBwYXJhY2hhaW4pIHRvIGEgbGVhc2UgaG9sZGluZyBwYXJhY2hhaW6Ec3Vkb19zY2hlZHVsZV9wYXJhY2hhaW5fZG93bmdyYWRlBAEIaWSxAgEYUGFyYUlkAAME9ERvd25ncmFkZSBhIGxlYXNlIGhvbGRpbmcgcGFyYWNoYWluIHRvIGFuIG9uLWRlbWFuZCBwYXJhY2hhaW5cc3Vkb19xdWV1ZV9kb3dud2FyZF94Y20IAQhpZLECARhQYXJhSWQAAQx4Y21NBgF4Qm94PHhjbTo6b3BhcXVlOjpWZXJzaW9uZWRYY20+AAQQmFNlbmQgYSBkb3dud2FyZCBYQ00gdG8gdGhlIGdpdmVuIHBhcmEuAFEBVGhlIGdpdmVuIHBhcmFjaGFpbiBzaG91bGQgZXhpc3QgYW5kIHRoZSBwYXlsb2FkIHNob3VsZCBub3QgZXhjZWVkIHRoZSBwcmVjb25maWd1cmVkoHNpemUgYGNvbmZpZy5tYXhfZG93bndhcmRfbWVzc2FnZV9zaXplYC5sc3Vkb19lc3RhYmxpc2hfaHJtcF9jaGFubmVsEAEYc2VuZGVysQIBGFBhcmFJZAABJHJlY2lwaWVudLECARhQYXJhSWQAATBtYXhfY2FwYWNpdHkQAQx1MzIAAUBtYXhfbWVzc2FnZV9zaXplEAEMdTMyAAUQAQFGb3JjZWZ1bGx5IGVzdGFibGlzaCBhIGNoYW5uZWwgZnJvbSB0aGUgc2VuZGVyIHRvIHRoZSByZWNpcGllbnQuAFUBVGhpcyBpcyBlcXVpdmFsZW50IHRvIHNlbmRpbmcgYW4gYEhybXA6OmhybXBfaW5pdF9vcGVuX2NoYW5uZWxgIGV4dHJpbnNpYyBmb2xsb3dlZCBieYRgSHJtcDo6aHJtcF9hY2NlcHRfb3Blbl9jaGFubmVsYC4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMuSQYMbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucxRwYXJhczxQYXJhR2VuZXNpc0FyZ3MAAAwBMGdlbmVzaXNfaGVhZOEFASBIZWFkRGF0YQABPHZhbGlkYXRpb25fY29kZd0FAThWYWxpZGF0aW9uQ29kZQABJHBhcmFfa2luZCABIFBhcmFLaW5kAABNBggMeGNtMFZlcnNpb25lZFhjbQQsUnVudGltZUNhbGwAAQwIVjMEAFEGAVB2Mzo6WGNtPFJ1bnRpbWVDYWxsPgADAAhWNAQAuQYBUHY0OjpYY208UnVudGltZUNhbGw+AAQACFY1BAABBwFQdjU6OlhjbTxSdW50aW1lQ2FsbD4ABQAAUQYMDHhjbQh2MwxYY20EEENhbGwAAAQAVQYBWFZlYzxJbnN0cnVjdGlvbjxDYWxsPj4AAFUGAAACWQYAWQYMDHhjbQh2MyxJbnN0cnVjdGlvbgQQQ2FsbAABwDRXaXRoZHJhd0Fzc2V0BABdBgEsTXVsdGlBc3NldHMAAABUUmVzZXJ2ZUFzc2V0RGVwb3NpdGVkBABdBgEsTXVsdGlBc3NldHMAAQBYUmVjZWl2ZVRlbGVwb3J0ZWRBc3NldAQAXQYBLE11bHRpQXNzZXRzAAIANFF1ZXJ5UmVzcG9uc2UQASBxdWVyeV9pZCwBHFF1ZXJ5SWQAASByZXNwb25zZXEGASBSZXNwb25zZQABKG1heF93ZWlnaHQoARhXZWlnaHQAARxxdWVyaWVymQYBVE9wdGlvbjxNdWx0aUxvY2F0aW9uPgADADRUcmFuc2ZlckFzc2V0CAEYYXNzZXRzXQYBLE11bHRpQXNzZXRzAAEsYmVuZWZpY2lhcnkFBQE0TXVsdGlMb2NhdGlvbgAEAFBUcmFuc2ZlclJlc2VydmVBc3NldAwBGGFzc2V0c10GASxNdWx0aUFzc2V0cwABEGRlc3QFBQE0TXVsdGlMb2NhdGlvbgABDHhjbVEGARxYY208KCk+AAUAIFRyYW5zYWN0DAEsb3JpZ2luX2tpbmSdBgEoT3JpZ2luS2luZAABWHJlcXVpcmVfd2VpZ2h0X2F0X21vc3QoARhXZWlnaHQAARBjYWxsoQYBTERvdWJsZUVuY29kZWQ8Q2FsbD4ABgBkSHJtcE5ld0NoYW5uZWxPcGVuUmVxdWVzdAwBGHNlbmRlcskBAQx1MzIAAUBtYXhfbWVzc2FnZV9zaXplyQEBDHUzMgABMG1heF9jYXBhY2l0eckBAQx1MzIABwBMSHJtcENoYW5uZWxBY2NlcHRlZAQBJHJlY2lwaWVudMkBAQx1MzIACABISHJtcENoYW5uZWxDbG9zaW5nDAEkaW5pdGlhdG9yyQEBDHUzMgABGHNlbmRlcskBAQx1MzIAASRyZWNpcGllbnTJAQEMdTMyAAkALENsZWFyT3JpZ2luAAoANERlc2NlbmRPcmlnaW4EAAkFAVRJbnRlcmlvck11bHRpTG9jYXRpb24ACwAsUmVwb3J0RXJyb3IEAKUGAURRdWVyeVJlc3BvbnNlSW5mbwAMADBEZXBvc2l0QXNzZXQIARhhc3NldHOpBgFATXVsdGlBc3NldEZpbHRlcgABLGJlbmVmaWNpYXJ5BQUBNE11bHRpTG9jYXRpb24ADQBMRGVwb3NpdFJlc2VydmVBc3NldAwBGGFzc2V0c6kGAUBNdWx0aUFzc2V0RmlsdGVyAAEQZGVzdAUFATRNdWx0aUxvY2F0aW9uAAEMeGNtUQYBHFhjbTwoKT4ADgA0RXhjaGFuZ2VBc3NldAwBEGdpdmWpBgFATXVsdGlBc3NldEZpbHRlcgABEHdhbnRdBgEsTXVsdGlBc3NldHMAARxtYXhpbWFsIAEQYm9vbAAPAFxJbml0aWF0ZVJlc2VydmVXaXRoZHJhdwwBGGFzc2V0c6kGAUBNdWx0aUFzc2V0RmlsdGVyAAEccmVzZXJ2ZQUFATRNdWx0aUxvY2F0aW9uAAEMeGNtUQYBHFhjbTwoKT4AEABASW5pdGlhdGVUZWxlcG9ydAwBGGFzc2V0c6kGAUBNdWx0aUFzc2V0RmlsdGVyAAEQZGVzdAUFATRNdWx0aUxvY2F0aW9uAAEMeGNtUQYBHFhjbTwoKT4AEQA0UmVwb3J0SG9sZGluZwgBNHJlc3BvbnNlX2luZm+lBgFEUXVlcnlSZXNwb25zZUluZm8AARhhc3NldHOpBgFATXVsdGlBc3NldEZpbHRlcgASADBCdXlFeGVjdXRpb24IARBmZWVzZQYBKE11bHRpQXNzZXQAATB3ZWlnaHRfbGltaXS1BgEsV2VpZ2h0TGltaXQAEwA0UmVmdW5kU3VycGx1cwAUADxTZXRFcnJvckhhbmRsZXIEAFEGASRYY208Q2FsbD4AFQAsU2V0QXBwZW5kaXgEAFEGASRYY208Q2FsbD4AFgAoQ2xlYXJFcnJvcgAXAChDbGFpbUFzc2V0CAEYYXNzZXRzXQYBLE11bHRpQXNzZXRzAAEYdGlja2V0BQUBNE11bHRpTG9jYXRpb24AGAAQVHJhcAQALAEMdTY0ABkAQFN1YnNjcmliZVZlcnNpb24IASBxdWVyeV9pZCwBHFF1ZXJ5SWQAAUxtYXhfcmVzcG9uc2Vfd2VpZ2h0KAEYV2VpZ2h0ABoASFVuc3Vic2NyaWJlVmVyc2lvbgAbACRCdXJuQXNzZXQEAF0GASxNdWx0aUFzc2V0cwAcACxFeHBlY3RBc3NldAQAXQYBLE11bHRpQXNzZXRzAB0AMEV4cGVjdE9yaWdpbgQAmQYBVE9wdGlvbjxNdWx0aUxvY2F0aW9uPgAeACxFeHBlY3RFcnJvcgQAdQYBUE9wdGlvbjwodTMyLCBFcnJvcik+AB8AUEV4cGVjdFRyYW5zYWN0U3RhdHVzBACRBgE4TWF5YmVFcnJvckNvZGUAIAAsUXVlcnlQYWxsZXQIASxtb2R1bGVfbmFtZTgBHFZlYzx1OD4AATRyZXNwb25zZV9pbmZvpQYBRFF1ZXJ5UmVzcG9uc2VJbmZvACEAMEV4cGVjdFBhbGxldBQBFGluZGV4yQEBDHUzMgABEG5hbWU4ARxWZWM8dTg+AAEsbW9kdWxlX25hbWU4ARxWZWM8dTg+AAEsY3JhdGVfbWFqb3LJAQEMdTMyAAE8bWluX2NyYXRlX21pbm9yyQEBDHUzMgAiAFBSZXBvcnRUcmFuc2FjdFN0YXR1cwQApQYBRFF1ZXJ5UmVzcG9uc2VJbmZvACMATENsZWFyVHJhbnNhY3RTdGF0dXMAJAA8VW5pdmVyc2FsT3JpZ2luBAANBQEgSnVuY3Rpb24AJQA0RXhwb3J0TWVzc2FnZQwBHG5ldHdvcmsVBQEkTmV0d29ya0lkAAEsZGVzdGluYXRpb24JBQFUSW50ZXJpb3JNdWx0aUxvY2F0aW9uAAEMeGNtUQYBHFhjbTwoKT4AJgAkTG9ja0Fzc2V0CAEUYXNzZXRlBgEoTXVsdGlBc3NldAABIHVubG9ja2VyBQUBNE11bHRpTG9jYXRpb24AJwAsVW5sb2NrQXNzZXQIARRhc3NldGUGAShNdWx0aUFzc2V0AAEYdGFyZ2V0BQUBNE11bHRpTG9jYXRpb24AKAA4Tm90ZVVubG9ja2FibGUIARRhc3NldGUGAShNdWx0aUFzc2V0AAEUb3duZXIFBQE0TXVsdGlMb2NhdGlvbgApADRSZXF1ZXN0VW5sb2NrCAEUYXNzZXRlBgEoTXVsdGlBc3NldAABGGxvY2tlcgUFATRNdWx0aUxvY2F0aW9uACoALFNldEZlZXNNb2RlBAEwaml0X3dpdGhkcmF3IAEQYm9vbAArACBTZXRUb3BpYwQABAEgW3U4OyAzMl0ALAAoQ2xlYXJUb3BpYwAtACxBbGlhc09yaWdpbgQABQUBNE11bHRpTG9jYXRpb24ALgA8VW5wYWlkRXhlY3V0aW9uCAEwd2VpZ2h0X2xpbWl0tQYBLFdlaWdodExpbWl0AAEwY2hlY2tfb3JpZ2lumQYBVE9wdGlvbjxNdWx0aUxvY2F0aW9uPgAvAABdBhAMeGNtCHYzKG11bHRpYXNzZXQsTXVsdGlBc3NldHMAAAQAYQYBPFZlYzxNdWx0aUFzc2V0PgAAYQYAAAJlBgBlBhAMeGNtCHYzKG11bHRpYXNzZXQoTXVsdGlBc3NldAAACAEIaWQZBQEcQXNzZXRJZAABDGZ1bmkGASxGdW5naWJpbGl0eQAAaQYQDHhjbQh2MyhtdWx0aWFzc2V0LEZ1bmdpYmlsaXR5AAEIIEZ1bmdpYmxlBAD9AQEQdTEyOAAAACxOb25GdW5naWJsZQQAbQYBNEFzc2V0SW5zdGFuY2UAAQAAbQYQDHhjbQh2MyhtdWx0aWFzc2V0NEFzc2V0SW5zdGFuY2UAARgkVW5kZWZpbmVkAAAAFEluZGV4BAD9AQEQdTEyOAABABhBcnJheTQEAEgBHFt1ODsgNF0AAgAYQXJyYXk4BAAlAwEcW3U4OyA4XQADABxBcnJheTE2BACwASBbdTg7IDE2XQAEABxBcnJheTMyBAAEASBbdTg7IDMyXQAFAABxBgwMeGNtCHYzIFJlc3BvbnNlAAEYEE51bGwAAAAYQXNzZXRzBABdBgEsTXVsdGlBc3NldHMAAQA8RXhlY3V0aW9uUmVzdWx0BAB1BgFQT3B0aW9uPCh1MzIsIEVycm9yKT4AAgAcVmVyc2lvbgQAEAE4c3VwZXI6OlZlcnNpb24AAwAsUGFsbGV0c0luZm8EAIEGAZhCb3VuZGVkVmVjPFBhbGxldEluZm8sIE1heFBhbGxldHNJbmZvPgAEADhEaXNwYXRjaFJlc3VsdAQAkQYBOE1heWJlRXJyb3JDb2RlAAUAAHUGBBhPcHRpb24EBFQBeQYBCBBOb25lAAAAEFNvbWUEAHkGAAABAAB5BgAABAgQfQYAfQYQDHhjbQh2Mxh0cmFpdHMURXJyb3IAAaAgT3ZlcmZsb3cAAAA0VW5pbXBsZW1lbnRlZAABAGBVbnRydXN0ZWRSZXNlcnZlTG9jYXRpb24AAgBkVW50cnVzdGVkVGVsZXBvcnRMb2NhdGlvbgADADBMb2NhdGlvbkZ1bGwABABUTG9jYXRpb25Ob3RJbnZlcnRpYmxlAAUAJEJhZE9yaWdpbgAGADxJbnZhbGlkTG9jYXRpb24ABwA0QXNzZXROb3RGb3VuZAAIAFRGYWlsZWRUb1RyYW5zYWN0QXNzZXQACQA8Tm90V2l0aGRyYXdhYmxlAAoASExvY2F0aW9uQ2Fubm90SG9sZAALAFRFeGNlZWRzTWF4TWVzc2FnZVNpemUADABYRGVzdGluYXRpb25VbnN1cHBvcnRlZAANACRUcmFuc3BvcnQADgAoVW5yb3V0YWJsZQAPADBVbmtub3duQ2xhaW0AEAA4RmFpbGVkVG9EZWNvZGUAEQBATWF4V2VpZ2h0SW52YWxpZAASADhOb3RIb2xkaW5nRmVlcwATADBUb29FeHBlbnNpdmUAFAAQVHJhcAQAMAEMdTY0ABUAQEV4cGVjdGF0aW9uRmFsc2UAFgA4UGFsbGV0Tm90Rm91bmQAFwAwTmFtZU1pc21hdGNoABgATFZlcnNpb25JbmNvbXBhdGlibGUAGQBQSG9sZGluZ1dvdWxkT3ZlcmZsb3cAGgAsRXhwb3J0RXJyb3IAGwA4UmVhbmNob3JGYWlsZWQAHAAYTm9EZWFsAB0AKEZlZXNOb3RNZXQAHgAkTG9ja0Vycm9yAB8AME5vUGVybWlzc2lvbgAgAChVbmFuY2hvcmVkACEAOE5vdERlcG9zaXRhYmxlACIATFVuaGFuZGxlZFhjbVZlcnNpb24AIwBIV2VpZ2h0TGltaXRSZWFjaGVkBAAoARhXZWlnaHQAJAAcQmFycmllcgAlAExXZWlnaHROb3RDb21wdXRhYmxlACYAREV4Y2VlZHNTdGFja0xpbWl0ACcAAIEGDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBhQYEUwAABACNBgEYVmVjPFQ+AACFBgwMeGNtCHYzKFBhbGxldEluZm8AABgBFGluZGV4yQEBDHUzMgABEG5hbWWJBgGAQm91bmRlZFZlYzx1OCwgTWF4UGFsbGV0TmFtZUxlbj4AASxtb2R1bGVfbmFtZYkGAYBCb3VuZGVkVmVjPHU4LCBNYXhQYWxsZXROYW1lTGVuPgABFG1ham9yyQEBDHUzMgABFG1pbm9yyQEBDHUzMgABFHBhdGNoyQEBDHUzMgAAiQYMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAEIBFMAAAQAOAEYVmVjPFQ+AACNBgAAAoUGAJEGDAx4Y20IdjM4TWF5YmVFcnJvckNvZGUAAQwcU3VjY2VzcwAAABRFcnJvcgQAlQYBjEJvdW5kZWRWZWM8dTgsIE1heERpc3BhdGNoRXJyb3JMZW4+AAEAOFRydW5jYXRlZEVycm9yBACVBgGMQm91bmRlZFZlYzx1OCwgTWF4RGlzcGF0Y2hFcnJvckxlbj4AAgAAlQYMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAEIBFMAAAQAOAEYVmVjPFQ+AACZBgQYT3B0aW9uBARUAQUFAQgQTm9uZQAAABBTb21lBAAFBQAAAQAAnQYMDHhjbQh2MyhPcmlnaW5LaW5kAAEQGE5hdGl2ZQAAAEBTb3ZlcmVpZ25BY2NvdW50AAEAJFN1cGVydXNlcgACAAxYY20AAwAAoQYMDHhjbThkb3VibGVfZW5jb2RlZDREb3VibGVFbmNvZGVkBARUAAAEARxlbmNvZGVkOAEcVmVjPHU4PgAApQYMDHhjbQh2M0RRdWVyeVJlc3BvbnNlSW5mbwAADAEsZGVzdGluYXRpb24FBQE0TXVsdGlMb2NhdGlvbgABIHF1ZXJ5X2lkLAEcUXVlcnlJZAABKG1heF93ZWlnaHQoARhXZWlnaHQAAKkGEAx4Y20IdjMobXVsdGlhc3NldEBNdWx0aUFzc2V0RmlsdGVyAAEIIERlZmluaXRlBABdBgEsTXVsdGlBc3NldHMAAAAQV2lsZAQArQYBOFdpbGRNdWx0aUFzc2V0AAEAAK0GEAx4Y20IdjMobXVsdGlhc3NldDhXaWxkTXVsdGlBc3NldAABEAxBbGwAAAAUQWxsT2YIAQhpZBkFARxBc3NldElkAAEMZnVusQYBPFdpbGRGdW5naWJpbGl0eQABAChBbGxDb3VudGVkBADJAQEMdTMyAAIAMEFsbE9mQ291bnRlZAwBCGlkGQUBHEFzc2V0SWQAAQxmdW6xBgE8V2lsZEZ1bmdpYmlsaXR5AAEUY291bnTJAQEMdTMyAAMAALEGEAx4Y20IdjMobXVsdGlhc3NldDxXaWxkRnVuZ2liaWxpdHkAAQggRnVuZ2libGUAAAAsTm9uRnVuZ2libGUAAQAAtQYMDHhjbQh2MyxXZWlnaHRMaW1pdAABCCRVbmxpbWl0ZWQAAAAcTGltaXRlZAQAKAEYV2VpZ2h0AAEAALkGDCxzdGFnaW5nX3hjbQh2NAxYY20EEENhbGwAAAQAvQYBWFZlYzxJbnN0cnVjdGlvbjxDYWxsPj4AAL0GAAACwQYAwQYMLHN0YWdpbmdfeGNtCHY0LEluc3RydWN0aW9uBBBDYWxsAAHANFdpdGhkcmF3QXNzZXQEAMUGARhBc3NldHMAAABUUmVzZXJ2ZUFzc2V0RGVwb3NpdGVkBADFBgEYQXNzZXRzAAEAWFJlY2VpdmVUZWxlcG9ydGVkQXNzZXQEAMUGARhBc3NldHMAAgA0UXVlcnlSZXNwb25zZRABIHF1ZXJ5X2lkLAEcUXVlcnlJZAABIHJlc3BvbnNl2QYBIFJlc3BvbnNlAAEobWF4X3dlaWdodCgBGFdlaWdodAABHHF1ZXJpZXLtBgFAT3B0aW9uPExvY2F0aW9uPgADADRUcmFuc2ZlckFzc2V0CAEYYXNzZXRzxQYBGEFzc2V0cwABLGJlbmVmaWNpYXJ5HQUBIExvY2F0aW9uAAQAUFRyYW5zZmVyUmVzZXJ2ZUFzc2V0DAEYYXNzZXRzxQYBGEFzc2V0cwABEGRlc3QdBQEgTG9jYXRpb24AAQx4Y225BgEcWGNtPCgpPgAFACBUcmFuc2FjdAwBLG9yaWdpbl9raW5knQYBKE9yaWdpbktpbmQAAVhyZXF1aXJlX3dlaWdodF9hdF9tb3N0KAEYV2VpZ2h0AAEQY2FsbKEGAUxEb3VibGVFbmNvZGVkPENhbGw+AAYAZEhybXBOZXdDaGFubmVsT3BlblJlcXVlc3QMARhzZW5kZXLJAQEMdTMyAAFAbWF4X21lc3NhZ2Vfc2l6ZckBAQx1MzIAATBtYXhfY2FwYWNpdHnJAQEMdTMyAAcATEhybXBDaGFubmVsQWNjZXB0ZWQEASRyZWNpcGllbnTJAQEMdTMyAAgASEhybXBDaGFubmVsQ2xvc2luZwwBJGluaXRpYXRvcskBAQx1MzIAARhzZW5kZXLJAQEMdTMyAAEkcmVjaXBpZW50yQEBDHUzMgAJACxDbGVhck9yaWdpbgAKADREZXNjZW5kT3JpZ2luBAAhBQFASW50ZXJpb3JMb2NhdGlvbgALACxSZXBvcnRFcnJvcgQA8QYBRFF1ZXJ5UmVzcG9uc2VJbmZvAAwAMERlcG9zaXRBc3NldAgBGGFzc2V0c/UGASxBc3NldEZpbHRlcgABLGJlbmVmaWNpYXJ5HQUBIExvY2F0aW9uAA0ATERlcG9zaXRSZXNlcnZlQXNzZXQMARhhc3NldHP1BgEsQXNzZXRGaWx0ZXIAARBkZXN0HQUBIExvY2F0aW9uAAEMeGNtuQYBHFhjbTwoKT4ADgA0RXhjaGFuZ2VBc3NldAwBEGdpdmX1BgEsQXNzZXRGaWx0ZXIAARB3YW50xQYBGEFzc2V0cwABHG1heGltYWwgARBib29sAA8AXEluaXRpYXRlUmVzZXJ2ZVdpdGhkcmF3DAEYYXNzZXRz9QYBLEFzc2V0RmlsdGVyAAEccmVzZXJ2ZR0FASBMb2NhdGlvbgABDHhjbbkGARxYY208KCk+ABAAQEluaXRpYXRlVGVsZXBvcnQMARhhc3NldHP1BgEsQXNzZXRGaWx0ZXIAARBkZXN0HQUBIExvY2F0aW9uAAEMeGNtuQYBHFhjbTwoKT4AEQA0UmVwb3J0SG9sZGluZwgBNHJlc3BvbnNlX2luZm/xBgFEUXVlcnlSZXNwb25zZUluZm8AARhhc3NldHP1BgEsQXNzZXRGaWx0ZXIAEgAwQnV5RXhlY3V0aW9uCAEQZmVlc80GARRBc3NldAABMHdlaWdodF9saW1pdLUGASxXZWlnaHRMaW1pdAATADRSZWZ1bmRTdXJwbHVzABQAPFNldEVycm9ySGFuZGxlcgQAuQYBJFhjbTxDYWxsPgAVACxTZXRBcHBlbmRpeAQAuQYBJFhjbTxDYWxsPgAWAChDbGVhckVycm9yABcAKENsYWltQXNzZXQIARhhc3NldHPFBgEYQXNzZXRzAAEYdGlja2V0HQUBIExvY2F0aW9uABgAEFRyYXAEACwBDHU2NAAZAEBTdWJzY3JpYmVWZXJzaW9uCAEgcXVlcnlfaWQsARxRdWVyeUlkAAFMbWF4X3Jlc3BvbnNlX3dlaWdodCgBGFdlaWdodAAaAEhVbnN1YnNjcmliZVZlcnNpb24AGwAkQnVybkFzc2V0BADFBgEYQXNzZXRzABwALEV4cGVjdEFzc2V0BADFBgEYQXNzZXRzAB0AMEV4cGVjdE9yaWdpbgQA7QYBQE9wdGlvbjxMb2NhdGlvbj4AHgAsRXhwZWN0RXJyb3IEAHUGAVBPcHRpb248KHUzMiwgRXJyb3IpPgAfAFBFeHBlY3RUcmFuc2FjdFN0YXR1cwQAkQYBOE1heWJlRXJyb3JDb2RlACAALFF1ZXJ5UGFsbGV0CAEsbW9kdWxlX25hbWU4ARxWZWM8dTg+AAE0cmVzcG9uc2VfaW5mb/EGAURRdWVyeVJlc3BvbnNlSW5mbwAhADBFeHBlY3RQYWxsZXQUARRpbmRleMkBAQx1MzIAARBuYW1lOAEcVmVjPHU4PgABLG1vZHVsZV9uYW1lOAEcVmVjPHU4PgABLGNyYXRlX21ham9yyQEBDHUzMgABPG1pbl9jcmF0ZV9taW5vcskBAQx1MzIAIgBQUmVwb3J0VHJhbnNhY3RTdGF0dXMEAPEGAURRdWVyeVJlc3BvbnNlSW5mbwAjAExDbGVhclRyYW5zYWN0U3RhdHVzACQAPFVuaXZlcnNhbE9yaWdpbgQAKQUBIEp1bmN0aW9uACUANEV4cG9ydE1lc3NhZ2UMARxuZXR3b3JrMQUBJE5ldHdvcmtJZAABLGRlc3RpbmF0aW9uIQUBQEludGVyaW9yTG9jYXRpb24AAQx4Y225BgEcWGNtPCgpPgAmACRMb2NrQXNzZXQIARRhc3NldM0GARRBc3NldAABIHVubG9ja2VyHQUBIExvY2F0aW9uACcALFVubG9ja0Fzc2V0CAEUYXNzZXTNBgEUQXNzZXQAARh0YXJnZXQdBQEgTG9jYXRpb24AKAA4Tm90ZVVubG9ja2FibGUIARRhc3NldM0GARRBc3NldAABFG93bmVyHQUBIExvY2F0aW9uACkANFJlcXVlc3RVbmxvY2sIARRhc3NldM0GARRBc3NldAABGGxvY2tlch0FASBMb2NhdGlvbgAqACxTZXRGZWVzTW9kZQQBMGppdF93aXRoZHJhdyABEGJvb2wAKwAgU2V0VG9waWMEAAQBIFt1ODsgMzJdACwAKENsZWFyVG9waWMALQAsQWxpYXNPcmlnaW4EAB0FASBMb2NhdGlvbgAuADxVbnBhaWRFeGVjdXRpb24IATB3ZWlnaHRfbGltaXS1BgEsV2VpZ2h0TGltaXQAATBjaGVja19vcmlnaW7tBgFAT3B0aW9uPExvY2F0aW9uPgAvAADFBhAsc3RhZ2luZ194Y20IdjQUYXNzZXQYQXNzZXRzAAAEAMkGAShWZWM8QXNzZXQ+AADJBgAAAs0GAM0GECxzdGFnaW5nX3hjbQh2NBRhc3NldBRBc3NldAAACAEIaWRRBQEcQXNzZXRJZAABDGZ1btEGASxGdW5naWJpbGl0eQAA0QYQLHN0YWdpbmdfeGNtCHY0FGFzc2V0LEZ1bmdpYmlsaXR5AAEIIEZ1bmdpYmxlBAD9AQEQdTEyOAAAACxOb25GdW5naWJsZQQA1QYBNEFzc2V0SW5zdGFuY2UAAQAA1QYQLHN0YWdpbmdfeGNtCHY0FGFzc2V0NEFzc2V0SW5zdGFuY2UAARgkVW5kZWZpbmVkAAAAFEluZGV4BAD9AQEQdTEyOAABABhBcnJheTQEAEgBHFt1ODsgNF0AAgAYQXJyYXk4BAAlAwEcW3U4OyA4XQADABxBcnJheTE2BACwASBbdTg7IDE2XQAEABxBcnJheTMyBAAEASBbdTg7IDMyXQAFAADZBgwsc3RhZ2luZ194Y20IdjQgUmVzcG9uc2UAARgQTnVsbAAAABhBc3NldHMEAMUGARhBc3NldHMAAQA8RXhlY3V0aW9uUmVzdWx0BAB1BgFQT3B0aW9uPCh1MzIsIEVycm9yKT4AAgAcVmVyc2lvbgQAEAE4c3VwZXI6OlZlcnNpb24AAwAsUGFsbGV0c0luZm8EAN0GAZhCb3VuZGVkVmVjPFBhbGxldEluZm8sIE1heFBhbGxldHNJbmZvPgAEADhEaXNwYXRjaFJlc3VsdAQAkQYBOE1heWJlRXJyb3JDb2RlAAUAAN0GDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQB4QYEUwAABADpBgEYVmVjPFQ+AADhBgwsc3RhZ2luZ194Y20IdjQoUGFsbGV0SW5mbwAAGAEUaW5kZXjJAQEMdTMyAAEQbmFtZeUGAYBCb3VuZGVkVmVjPHU4LCBNYXhQYWxsZXROYW1lTGVuPgABLG1vZHVsZV9uYW1l5QYBgEJvdW5kZWRWZWM8dTgsIE1heFBhbGxldE5hbWVMZW4+AAEUbWFqb3LJAQEMdTMyAAEUbWlub3LJAQEMdTMyAAEUcGF0Y2jJAQEMdTMyAADlBgxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAQgEUwAABAA4ARhWZWM8VD4AAOkGAAAC4QYA7QYEGE9wdGlvbgQEVAEdBQEIEE5vbmUAAAAQU29tZQQAHQUAAAEAAPEGDCxzdGFnaW5nX3hjbQh2NERRdWVyeVJlc3BvbnNlSW5mbwAADAEsZGVzdGluYXRpb24dBQEgTG9jYXRpb24AASBxdWVyeV9pZCwBHFF1ZXJ5SWQAAShtYXhfd2VpZ2h0KAEYV2VpZ2h0AAD1BhAsc3RhZ2luZ194Y20IdjQUYXNzZXQsQXNzZXRGaWx0ZXIAAQggRGVmaW5pdGUEAMUGARhBc3NldHMAAAAQV2lsZAQA+QYBJFdpbGRBc3NldAABAAD5BhAsc3RhZ2luZ194Y20IdjQUYXNzZXQkV2lsZEFzc2V0AAEQDEFsbAAAABRBbGxPZggBCGlkUQUBHEFzc2V0SWQAAQxmdW79BgE8V2lsZEZ1bmdpYmlsaXR5AAEAKEFsbENvdW50ZWQEAMkBAQx1MzIAAgAwQWxsT2ZDb3VudGVkDAEIaWRRBQEcQXNzZXRJZAABDGZ1bv0GATxXaWxkRnVuZ2liaWxpdHkAARRjb3VudMkBAQx1MzIAAwAA/QYQLHN0YWdpbmdfeGNtCHY0FGFzc2V0PFdpbGRGdW5naWJpbGl0eQABCCBGdW5naWJsZQAAACxOb25GdW5naWJsZQABAAABBwwsc3RhZ2luZ194Y20IdjUMWGNtBBBDYWxsAAAEAAUHAVhWZWM8SW5zdHJ1Y3Rpb248Q2FsbD4+AAAFBwAAAgkHAAkHDCxzdGFnaW5nX3hjbQh2NSxJbnN0cnVjdGlvbgQQQ2FsbAAB0DRXaXRoZHJhd0Fzc2V0BAANBwEYQXNzZXRzAAAAVFJlc2VydmVBc3NldERlcG9zaXRlZAQADQcBGEFzc2V0cwABAFhSZWNlaXZlVGVsZXBvcnRlZEFzc2V0BAANBwEYQXNzZXRzAAIANFF1ZXJ5UmVzcG9uc2UQASBxdWVyeV9pZCwBHFF1ZXJ5SWQAASByZXNwb25zZSEHASBSZXNwb25zZQABKG1heF93ZWlnaHQoARhXZWlnaHQAARxxdWVyaWVyQQcBQE9wdGlvbjxMb2NhdGlvbj4AAwA0VHJhbnNmZXJBc3NldAgBGGFzc2V0cw0HARhBc3NldHMAASxiZW5lZmljaWFyebkCASBMb2NhdGlvbgAEAFBUcmFuc2ZlclJlc2VydmVBc3NldAwBGGFzc2V0cw0HARhBc3NldHMAARBkZXN0uQIBIExvY2F0aW9uAAEMeGNtAQcBHFhjbTwoKT4ABQAgVHJhbnNhY3QMASxvcmlnaW5fa2luZJ0GAShPcmlnaW5LaW5kAAFMZmFsbGJhY2tfbWF4X3dlaWdodEUHAThPcHRpb248V2VpZ2h0PgABEGNhbGyhBgFMRG91YmxlRW5jb2RlZDxDYWxsPgAGAGRIcm1wTmV3Q2hhbm5lbE9wZW5SZXF1ZXN0DAEYc2VuZGVyyQEBDHUzMgABQG1heF9tZXNzYWdlX3NpemXJAQEMdTMyAAEwbWF4X2NhcGFjaXR5yQEBDHUzMgAHAExIcm1wQ2hhbm5lbEFjY2VwdGVkBAEkcmVjaXBpZW50yQEBDHUzMgAIAEhIcm1wQ2hhbm5lbENsb3NpbmcMASRpbml0aWF0b3LJAQEMdTMyAAEYc2VuZGVyyQEBDHUzMgABJHJlY2lwaWVudMkBAQx1MzIACQAsQ2xlYXJPcmlnaW4ACgA0RGVzY2VuZE9yaWdpbgQAvQIBQEludGVyaW9yTG9jYXRpb24ACwAsUmVwb3J0RXJyb3IEAEkHAURRdWVyeVJlc3BvbnNlSW5mbwAMADBEZXBvc2l0QXNzZXQIARhhc3NldHNNBwEsQXNzZXRGaWx0ZXIAASxiZW5lZmljaWFyebkCASBMb2NhdGlvbgANAExEZXBvc2l0UmVzZXJ2ZUFzc2V0DAEYYXNzZXRzTQcBLEFzc2V0RmlsdGVyAAEQZGVzdLkCASBMb2NhdGlvbgABDHhjbQEHARxYY208KCk+AA4ANEV4Y2hhbmdlQXNzZXQMARBnaXZlTQcBLEFzc2V0RmlsdGVyAAEQd2FudA0HARhBc3NldHMAARxtYXhpbWFsIAEQYm9vbAAPAFxJbml0aWF0ZVJlc2VydmVXaXRoZHJhdwwBGGFzc2V0c00HASxBc3NldEZpbHRlcgABHHJlc2VydmW5AgEgTG9jYXRpb24AAQx4Y20BBwEcWGNtPCgpPgAQAEBJbml0aWF0ZVRlbGVwb3J0DAEYYXNzZXRzTQcBLEFzc2V0RmlsdGVyAAEQZGVzdLkCASBMb2NhdGlvbgABDHhjbQEHARxYY208KCk+ABEANFJlcG9ydEhvbGRpbmcIATRyZXNwb25zZV9pbmZvSQcBRFF1ZXJ5UmVzcG9uc2VJbmZvAAEYYXNzZXRzTQcBLEFzc2V0RmlsdGVyABIAMEJ1eUV4ZWN1dGlvbggBEGZlZXMVBwEUQXNzZXQAATB3ZWlnaHRfbGltaXS1BgEsV2VpZ2h0TGltaXQAEwA0UmVmdW5kU3VycGx1cwAUADxTZXRFcnJvckhhbmRsZXIEAAEHASRYY208Q2FsbD4AFQAsU2V0QXBwZW5kaXgEAAEHASRYY208Q2FsbD4AFgAoQ2xlYXJFcnJvcgAXAChDbGFpbUFzc2V0CAEYYXNzZXRzDQcBGEFzc2V0cwABGHRpY2tldLkCASBMb2NhdGlvbgAYABBUcmFwBAAsAQx1NjQAGQBAU3Vic2NyaWJlVmVyc2lvbggBIHF1ZXJ5X2lkLAEcUXVlcnlJZAABTG1heF9yZXNwb25zZV93ZWlnaHQoARhXZWlnaHQAGgBIVW5zdWJzY3JpYmVWZXJzaW9uABsAJEJ1cm5Bc3NldAQADQcBGEFzc2V0cwAcACxFeHBlY3RBc3NldAQADQcBGEFzc2V0cwAdADBFeHBlY3RPcmlnaW4EAEEHAUBPcHRpb248TG9jYXRpb24+AB4ALEV4cGVjdEVycm9yBAAlBwFQT3B0aW9uPCh1MzIsIEVycm9yKT4AHwBQRXhwZWN0VHJhbnNhY3RTdGF0dXMEAJEGAThNYXliZUVycm9yQ29kZQAgACxRdWVyeVBhbGxldAgBLG1vZHVsZV9uYW1lOAEcVmVjPHU4PgABNHJlc3BvbnNlX2luZm9JBwFEUXVlcnlSZXNwb25zZUluZm8AIQAwRXhwZWN0UGFsbGV0FAEUaW5kZXjJAQEMdTMyAAEQbmFtZTgBHFZlYzx1OD4AASxtb2R1bGVfbmFtZTgBHFZlYzx1OD4AASxjcmF0ZV9tYWpvcskBAQx1MzIAATxtaW5fY3JhdGVfbWlub3LJAQEMdTMyACIAUFJlcG9ydFRyYW5zYWN0U3RhdHVzBABJBwFEUXVlcnlSZXNwb25zZUluZm8AIwBMQ2xlYXJUcmFuc2FjdFN0YXR1cwAkADxVbml2ZXJzYWxPcmlnaW4EAMUCASBKdW5jdGlvbgAlADRFeHBvcnRNZXNzYWdlDAEcbmV0d29ya80CASROZXR3b3JrSWQAASxkZXN0aW5hdGlvbr0CAUBJbnRlcmlvckxvY2F0aW9uAAEMeGNtAQcBHFhjbTwoKT4AJgAkTG9ja0Fzc2V0CAEUYXNzZXQVBwEUQXNzZXQAASB1bmxvY2tlcrkCASBMb2NhdGlvbgAnACxVbmxvY2tBc3NldAgBFGFzc2V0FQcBFEFzc2V0AAEYdGFyZ2V0uQIBIExvY2F0aW9uACgAOE5vdGVVbmxvY2thYmxlCAEUYXNzZXQVBwEUQXNzZXQAARRvd25lcrkCASBMb2NhdGlvbgApADRSZXF1ZXN0VW5sb2NrCAEUYXNzZXQVBwEUQXNzZXQAARhsb2NrZXK5AgEgTG9jYXRpb24AKgAsU2V0RmVlc01vZGUEATBqaXRfd2l0aGRyYXcgARBib29sACsAIFNldFRvcGljBAAEASBbdTg7IDMyXQAsAChDbGVhclRvcGljAC0ALEFsaWFzT3JpZ2luBAC5AgEgTG9jYXRpb24ALgA8VW5wYWlkRXhlY3V0aW9uCAEwd2VpZ2h0X2xpbWl0tQYBLFdlaWdodExpbWl0AAEwY2hlY2tfb3JpZ2luQQcBQE9wdGlvbjxMb2NhdGlvbj4ALwAcUGF5RmVlcwQBFGFzc2V0FQcBFEFzc2V0ADAAQEluaXRpYXRlVHJhbnNmZXIUASxkZXN0aW5hdGlvbrkCASBMb2NhdGlvbgABLHJlbW90ZV9mZWVzWQcBbE9wdGlvbjxBc3NldFRyYW5zZmVyRmlsdGVyPgABPHByZXNlcnZlX29yaWdpbiABEGJvb2wAARhhc3NldHNhBwHgQm91bmRlZFZlYzxBc3NldFRyYW5zZmVyRmlsdGVyLCBNYXhBc3NldFRyYW5zZmVyRmlsdGVycz4AAShyZW1vdGVfeGNtAQcBHFhjbTwoKT4AMQBERXhlY3V0ZVdpdGhPcmlnaW4IAURkZXNjZW5kYW50X29yaWdpbmkHAWBPcHRpb248SW50ZXJpb3JMb2NhdGlvbj4AAQx4Y20BBwEkWGNtPENhbGw+ADIAIFNldEhpbnRzBAEUaGludHNtBwGEQm91bmRlZFZlYzxIaW50LCBIaW50TnVtVmFyaWFudHM+ADMAAA0HECxzdGFnaW5nX3hjbQh2NRRhc3NldBhBc3NldHMAAAQAEQcBKFZlYzxBc3NldD4AABEHAAACFQcAFQcQLHN0YWdpbmdfeGNtCHY1FGFzc2V0FEFzc2V0AAAIAQhpZFUFARxBc3NldElkAAEMZnVuGQcBLEZ1bmdpYmlsaXR5AAAZBxAsc3RhZ2luZ194Y20IdjUUYXNzZXQsRnVuZ2liaWxpdHkAAQggRnVuZ2libGUEAP0BARB1MTI4AAAALE5vbkZ1bmdpYmxlBAAdBwE0QXNzZXRJbnN0YW5jZQABAAAdBxAsc3RhZ2luZ194Y20IdjUUYXNzZXQ0QXNzZXRJbnN0YW5jZQABGCRVbmRlZmluZWQAAAAUSW5kZXgEAP0BARB1MTI4AAEAGEFycmF5NAQASAEcW3U4OyA0XQACABhBcnJheTgEACUDARxbdTg7IDhdAAMAHEFycmF5MTYEALABIFt1ODsgMTZdAAQAHEFycmF5MzIEAAQBIFt1ODsgMzJdAAUAACEHDCxzdGFnaW5nX3hjbQh2NSBSZXNwb25zZQABGBBOdWxsAAAAGEFzc2V0cwQADQcBGEFzc2V0cwABADxFeGVjdXRpb25SZXN1bHQEACUHAVBPcHRpb248KHUzMiwgRXJyb3IpPgACABxWZXJzaW9uBAAQAThzdXBlcjo6VmVyc2lvbgADACxQYWxsZXRzSW5mbwQAMQcBmEJvdW5kZWRWZWM8UGFsbGV0SW5mbywgTWF4UGFsbGV0c0luZm8+AAQAOERpc3BhdGNoUmVzdWx0BACRBgE4TWF5YmVFcnJvckNvZGUABQAAJQcEGE9wdGlvbgQEVAEpBwEIEE5vbmUAAAAQU29tZQQAKQcAAAEAACkHAAAECBAtBwAtBxAMeGNtCHY1GHRyYWl0cxRFcnJvcgABpCBPdmVyZmxvdwAAADRVbmltcGxlbWVudGVkAAEAYFVudHJ1c3RlZFJlc2VydmVMb2NhdGlvbgACAGRVbnRydXN0ZWRUZWxlcG9ydExvY2F0aW9uAAMAMExvY2F0aW9uRnVsbAAEAFRMb2NhdGlvbk5vdEludmVydGlibGUABQAkQmFkT3JpZ2luAAYAPEludmFsaWRMb2NhdGlvbgAHADRBc3NldE5vdEZvdW5kAAgAVEZhaWxlZFRvVHJhbnNhY3RBc3NldAAJADxOb3RXaXRoZHJhd2FibGUACgBITG9jYXRpb25DYW5ub3RIb2xkAAsAVEV4Y2VlZHNNYXhNZXNzYWdlU2l6ZQAMAFhEZXN0aW5hdGlvblVuc3VwcG9ydGVkAA0AJFRyYW5zcG9ydAAOAChVbnJvdXRhYmxlAA8AMFVua25vd25DbGFpbQAQADhGYWlsZWRUb0RlY29kZQARAEBNYXhXZWlnaHRJbnZhbGlkABIAOE5vdEhvbGRpbmdGZWVzABMAMFRvb0V4cGVuc2l2ZQAUABBUcmFwBAAwAQx1NjQAFQBARXhwZWN0YXRpb25GYWxzZQAWADhQYWxsZXROb3RGb3VuZAAXADBOYW1lTWlzbWF0Y2gAGABMVmVyc2lvbkluY29tcGF0aWJsZQAZAFBIb2xkaW5nV291bGRPdmVyZmxvdwAaACxFeHBvcnRFcnJvcgAbADhSZWFuY2hvckZhaWxlZAAcABhOb0RlYWwAHQAoRmVlc05vdE1ldAAeACRMb2NrRXJyb3IAHwAwTm9QZXJtaXNzaW9uACAAKFVuYW5jaG9yZWQAIQA4Tm90RGVwb3NpdGFibGUAIgA0VG9vTWFueUFzc2V0cwAjAExVbmhhbmRsZWRYY21WZXJzaW9uACQASFdlaWdodExpbWl0UmVhY2hlZAQAKAEYV2VpZ2h0ACUAHEJhcnJpZXIAJgBMV2VpZ2h0Tm90Q29tcHV0YWJsZQAnAERFeGNlZWRzU3RhY2tMaW1pdAAoAAAxBwxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUATUHBFMAAAQAPQcBGFZlYzxUPgAANQcMLHN0YWdpbmdfeGNtCHY1KFBhbGxldEluZm8AABgBFGluZGV4yQEBDHUzMgABEG5hbWU5BwGAQm91bmRlZFZlYzx1OCwgTWF4UGFsbGV0TmFtZUxlbj4AASxtb2R1bGVfbmFtZTkHAYBCb3VuZGVkVmVjPHU4LCBNYXhQYWxsZXROYW1lTGVuPgABFG1ham9yyQEBDHUzMgABFG1pbm9yyQEBDHUzMgABFHBhdGNoyQEBDHUzMgAAOQcMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAEIBFMAAAQAOAEYVmVjPFQ+AAA9BwAAAjUHAEEHBBhPcHRpb24EBFQBuQIBCBBOb25lAAAAEFNvbWUEALkCAAABAABFBwQYT3B0aW9uBARUASgBCBBOb25lAAAAEFNvbWUEACgAAAEAAEkHDCxzdGFnaW5nX3hjbQh2NURRdWVyeVJlc3BvbnNlSW5mbwAADAEsZGVzdGluYXRpb265AgEgTG9jYXRpb24AASBxdWVyeV9pZCwBHFF1ZXJ5SWQAAShtYXhfd2VpZ2h0KAEYV2VpZ2h0AABNBxAsc3RhZ2luZ194Y20IdjUUYXNzZXQsQXNzZXRGaWx0ZXIAAQggRGVmaW5pdGUEAA0HARhBc3NldHMAAAAQV2lsZAQAUQcBJFdpbGRBc3NldAABAABRBxAsc3RhZ2luZ194Y20IdjUUYXNzZXQkV2lsZEFzc2V0AAEQDEFsbAAAABRBbGxPZggBCGlkVQUBHEFzc2V0SWQAAQxmdW5VBwE8V2lsZEZ1bmdpYmlsaXR5AAEAKEFsbENvdW50ZWQEAMkBAQx1MzIAAgAwQWxsT2ZDb3VudGVkDAEIaWRVBQEcQXNzZXRJZAABDGZ1blUHATxXaWxkRnVuZ2liaWxpdHkAARRjb3VudMkBAQx1MzIAAwAAVQcQLHN0YWdpbmdfeGNtCHY1FGFzc2V0PFdpbGRGdW5naWJpbGl0eQABCCBGdW5naWJsZQAAACxOb25GdW5naWJsZQABAABZBwQYT3B0aW9uBARUAV0HAQgQTm9uZQAAABBTb21lBABdBwAAAQAAXQcQLHN0YWdpbmdfeGNtCHY1FGFzc2V0TEFzc2V0VHJhbnNmZXJGaWx0ZXIAAQwgVGVsZXBvcnQEAE0HASxBc3NldEZpbHRlcgAAADhSZXNlcnZlRGVwb3NpdAQATQcBLEFzc2V0RmlsdGVyAAEAPFJlc2VydmVXaXRoZHJhdwQATQcBLEFzc2V0RmlsdGVyAAIAAGEHDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBXQcEUwAABABlBwEYVmVjPFQ+AABlBwAAAl0HAGkHBBhPcHRpb24EBFQBvQIBCBBOb25lAAAAEFNvbWUEAL0CAAABAABtBwxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAXEHBFMAAAQAdQcBGFZlYzxUPgAAcQcMLHN0YWdpbmdfeGNtCHY1EEhpbnQAAQQwQXNzZXRDbGFpbWVyBAEgbG9jYXRpb265AgEgTG9jYXRpb24AAAAAdQcAAAJxBwB5BxBccG9sa2Fkb3RfcnVudGltZV9jb21tb24gYXVjdGlvbnMYcGFsbGV0EENhbGwEBFQAAQwsbmV3X2F1Y3Rpb24IASBkdXJhdGlvbskBAURCbG9ja051bWJlckZvcjxUPgABSGxlYXNlX3BlcmlvZF9pbmRleMkBAUBMZWFzZVBlcmlvZE9mPFQ+AAAUVENyZWF0ZSBhIG5ldyBhdWN0aW9uLgBRAVRoaXMgY2FuIG9ubHkgaGFwcGVuIHdoZW4gdGhlcmUgaXNuJ3QgYWxyZWFkeSBhbiBhdWN0aW9uIGluIHByb2dyZXNzIGFuZCBtYXkgb25seSBiZSUBY2FsbGVkIGJ5IHRoZSByb290IG9yaWdpbi4gQWNjZXB0cyB0aGUgYGR1cmF0aW9uYCBvZiB0aGlzIGF1Y3Rpb24gYW5kIHRoZVkBYGxlYXNlX3BlcmlvZF9pbmRleGAgb2YgdGhlIGluaXRpYWwgbGVhc2UgcGVyaW9kIG9mIHRoZSBmb3VyIHRoYXQgYXJlIHRvIGJlIGF1Y3Rpb25lZC4MYmlkFAEQcGFyYX0HARhQYXJhSWQAATRhdWN0aW9uX2luZGV4yQEBMEF1Y3Rpb25JbmRleAABKGZpcnN0X3Nsb3TJAQFATGVhc2VQZXJpb2RPZjxUPgABJGxhc3Rfc2xvdMkBAUBMZWFzZVBlcmlvZE9mPFQ+AAEYYW1vdW50/QEBMEJhbGFuY2VPZjxUPgABQEkBTWFrZSBhIG5ldyBiaWQgZnJvbSBhbiBhY2NvdW50IChpbmNsdWRpbmcgYSBwYXJhY2hhaW4gYWNjb3VudCkgZm9yIGRlcGxveWluZyBhIG5ldyhwYXJhY2hhaW4uAFkBTXVsdGlwbGUgc2ltdWx0YW5lb3VzIGJpZHMgZnJvbSB0aGUgc2FtZSBiaWRkZXIgYXJlIGFsbG93ZWQgb25seSBhcyBsb25nIGFzIGFsbCBhY3RpdmU9AWJpZHMgb3ZlcmxhcCBlYWNoIG90aGVyIChpLmUuIGFyZSBtdXR1YWxseSBleGNsdXNpdmUpLiBCaWRzIGNhbm5vdCBiZSByZWRhY3RlZC4AVQEtIGBzdWJgIGlzIHRoZSBzdWItYmlkZGVyIElELCBhbGxvd2luZyBmb3IgbXVsdGlwbGUgY29tcGV0aW5nIGJpZHMgdG8gYmUgbWFkZSBieSAoYW5kcGZ1bmRlZCBieSkgdGhlIHNhbWUgYWNjb3VudC5NAS0gYGF1Y3Rpb25faW5kZXhgIGlzIHRoZSBpbmRleCBvZiB0aGUgYXVjdGlvbiB0byBiaWQgb24uIFNob3VsZCBqdXN0IGJlIHRoZSBwcmVzZW50aHZhbHVlIG9mIGBBdWN0aW9uQ291bnRlcmAuSQEtIGBmaXJzdF9zbG90YCBpcyB0aGUgZmlyc3QgbGVhc2UgcGVyaW9kIGluZGV4IG9mIHRoZSByYW5nZSB0byBiaWQgb24uIFRoaXMgaXMgdGhlCQFhYnNvbHV0ZSBsZWFzZSBwZXJpb2QgaW5kZXggdmFsdWUsIG5vdCBhbiBhdWN0aW9uLXNwZWNpZmljIG9mZnNldC5BAS0gYGxhc3Rfc2xvdGAgaXMgdGhlIGxhc3QgbGVhc2UgcGVyaW9kIGluZGV4IG9mIHRoZSByYW5nZSB0byBiaWQgb24uIFRoaXMgaXMgdGhlCQFhYnNvbHV0ZSBsZWFzZSBwZXJpb2QgaW5kZXggdmFsdWUsIG5vdCBhbiBhdWN0aW9uLXNwZWNpZmljIG9mZnNldC5JAS0gYGFtb3VudGAgaXMgdGhlIGFtb3VudCB0byBiaWQgdG8gYmUgaGVsZCBhcyBkZXBvc2l0IGZvciB0aGUgcGFyYWNoYWluIHNob3VsZCB0aGXIYmlkIHdpbi4gVGhpcyBhbW91bnQgaXMgaGVsZCB0aHJvdWdob3V0IHRoZSByYW5nZS44Y2FuY2VsX2F1Y3Rpb24AAgx4Q2FuY2VsIGFuIGluLXByb2dyZXNzIGF1Y3Rpb24uAIhDYW4gb25seSBiZSBjYWxsZWQgYnkgUm9vdCBvcmlnaW4uBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLn0HAAAGsQIAgQcQXHBvbGthZG90X3J1bnRpbWVfY29tbW9uJGNyb3dkbG9hbhhwYWxsZXQQQ2FsbAQEVAABJBhjcmVhdGUYARRpbmRleH0HARhQYXJhSWQAAQxjYXD9AQEwQmFsYW5jZU9mPFQ+AAEwZmlyc3RfcGVyaW9kyQEBQExlYXNlUGVyaW9kT2Y8VD4AASxsYXN0X3BlcmlvZMkBAUBMZWFzZVBlcmlvZE9mPFQ+AAEMZW5kyQEBREJsb2NrTnVtYmVyRm9yPFQ+AAEgdmVyaWZpZXKFBwFMT3B0aW9uPE11bHRpU2lnbmVyPgAAFE0BQ3JlYXRlIGEgbmV3IGNyb3dkbG9hbmluZyBjYW1wYWlnbiBmb3IgYSBwYXJhY2hhaW4gc2xvdCB3aXRoIHRoZSBnaXZlbiBsZWFzZSBwZXJpb2QYcmFuZ2UuAF0BVGhpcyBhcHBsaWVzIGEgbG9jayB0byB5b3VyIHBhcmFjaGFpbiBjb25maWd1cmF0aW9uLCBlbnN1cmluZyB0aGF0IGl0IGNhbm5vdCBiZSBjaGFuZ2VkZGJ5IHRoZSBwYXJhY2hhaW4gbWFuYWdlci4oY29udHJpYnV0ZQwBFGluZGV4fQcBGFBhcmFJZAABFHZhbHVl/QEBMEJhbGFuY2VPZjxUPgABJHNpZ25hdHVyZZEDAVhPcHRpb248TXVsdGlTaWduYXR1cmU+AAEIUQFDb250cmlidXRlIHRvIGEgY3Jvd2Qgc2FsZS4gVGhpcyB3aWxsIHRyYW5zZmVyIHNvbWUgYmFsYW5jZSBvdmVyIHRvIGZ1bmQgYSBwYXJhY2hhaW5RAXNsb3QuIEl0IHdpbGwgYmUgd2l0aGRyYXdhYmxlIHdoZW4gdGhlIGNyb3dkbG9hbiBoYXMgZW5kZWQgYW5kIHRoZSBmdW5kcyBhcmUgdW51c2VkLiB3aXRoZHJhdwgBDHdobwABMFQ6OkFjY291bnRJZAABFGluZGV4fQcBGFBhcmFJZAACRMBXaXRoZHJhdyBmdWxsIGJhbGFuY2Ugb2YgYSBzcGVjaWZpYyBjb250cmlidXRvci4AwE9yaWdpbiBtdXN0IGJlIHNpZ25lZCwgYnV0IGNhbiBjb21lIGZyb20gYW55b25lLgBdAVRoZSBmdW5kIG11c3QgYmUgZWl0aGVyIGluLCBvciByZWFkeSBmb3IsIHJldGlyZW1lbnQuIEZvciBhIGZ1bmQgdG8gYmUgKmluKiByZXRpcmVtZW50LEkBdGhlbiB0aGUgcmV0aXJlbWVudCBmbGFnIG11c3QgYmUgc2V0LiBGb3IgYSBmdW5kIHRvIGJlIHJlYWR5IGZvciByZXRpcmVtZW50LCB0aGVuOpwtIGl0IG11c3Qgbm90IGFscmVhZHkgYmUgaW4gcmV0aXJlbWVudDtNAS0gdGhlIGFtb3VudCBvZiByYWlzZWQgZnVuZHMgbXVzdCBiZSBiaWdnZXIgdGhhbiB0aGUgX2ZyZWVfIGJhbGFuY2Ugb2YgdGhlIGFjY291bnQ7NC0gYW5kIGVpdGhlcjq8ICAtIHRoZSBibG9jayBudW1iZXIgbXVzdCBiZSBhdCBsZWFzdCBgZW5kYDsgb3ItASAgLSB0aGUgY3VycmVudCBsZWFzZSBwZXJpb2QgbXVzdCBiZSBncmVhdGVyIHRoYW4gdGhlIGZ1bmQncyBgbGFzdF9wZXJpb2RgLgBVAUluIHRoaXMgY2FzZSwgdGhlIGZ1bmQncyByZXRpcmVtZW50IGZsYWcgaXMgc2V0IGFuZCBpdHMgYGVuZGAgaXMgcmVzZXQgdG8gdGhlIGN1cnJlbnQ0YmxvY2sgbnVtYmVyLgDwLSBgd2hvYDogVGhlIGFjY291bnQgd2hvc2UgY29udHJpYnV0aW9uIHNob3VsZCBiZSB3aXRoZHJhd24uGQEtIGBpbmRleGA6IFRoZSBwYXJhY2hhaW4gdG8gd2hvc2UgY3Jvd2Rsb2FuIHRoZSBjb250cmlidXRpb24gd2FzIG1hZGUuGHJlZnVuZAQBFGluZGV4fQcBGFBhcmFJZAADFOBBdXRvbWF0aWNhbGx5IHJlZnVuZCBjb250cmlidXRvcnMgb2YgYW4gZW5kZWQgY3Jvd2Rsb2FuLiEBRHVlIHRvIHdlaWdodCByZXN0cmljdGlvbnMsIHRoaXMgZnVuY3Rpb24gbWF5IG5lZWQgdG8gYmUgY2FsbGVkIG11bHRpcGxlSQF0aW1lcyB0byBmdWxseSByZWZ1bmQgYWxsIHVzZXJzLiBXZSB3aWxsIHJlZnVuZCBgUmVtb3ZlS2V5c0xpbWl0YCB1c2VycyBhdCBhIHRpbWUuAMBPcmlnaW4gbXVzdCBiZSBzaWduZWQsIGJ1dCBjYW4gY29tZSBmcm9tIGFueW9uZS4gZGlzc29sdmUEARRpbmRleH0HARhQYXJhSWQABARVAVJlbW92ZSBhIGZ1bmQgYWZ0ZXIgdGhlIHJldGlyZW1lbnQgcGVyaW9kIGhhcyBlbmRlZCBhbmQgYWxsIGZ1bmRzIGhhdmUgYmVlbiByZXR1cm5lZC4QZWRpdBgBFGluZGV4fQcBGFBhcmFJZAABDGNhcP0BATBCYWxhbmNlT2Y8VD4AATBmaXJzdF9wZXJpb2TJAQFATGVhc2VQZXJpb2RPZjxUPgABLGxhc3RfcGVyaW9kyQEBQExlYXNlUGVyaW9kT2Y8VD4AAQxlbmTJAQFEQmxvY2tOdW1iZXJGb3I8VD4AASB2ZXJpZmllcoUHAUxPcHRpb248TXVsdGlTaWduZXI+AAUM0EVkaXQgdGhlIGNvbmZpZ3VyYXRpb24gZm9yIGFuIGluLXByb2dyZXNzIGNyb3dkbG9hbi4AiENhbiBvbmx5IGJlIGNhbGxlZCBieSBSb290IG9yaWdpbi4gYWRkX21lbW8IARRpbmRleLECARhQYXJhSWQAARBtZW1vOAEcVmVjPHU4PgAGDOxBZGQgYW4gb3B0aW9uYWwgbWVtbyB0byBhbiBleGlzdGluZyBjcm93ZGxvYW4gY29udHJpYnV0aW9uLgAtAU9yaWdpbiBtdXN0IGJlIFNpZ25lZCwgYW5kIHRoZSB1c2VyIG11c3QgaGF2ZSBjb250cmlidXRlZCB0byB0aGUgY3Jvd2Rsb2FuLhBwb2tlBAEUaW5kZXixAgEYUGFyYUlkAAcMdFBva2UgdGhlIGZ1bmQgaW50byBgTmV3UmFpc2VgANxPcmlnaW4gbXVzdCBiZSBTaWduZWQsIGFuZCB0aGUgZnVuZCBoYXMgbm9uLXplcm8gcmFpc2UuOGNvbnRyaWJ1dGVfYWxsCAEUaW5kZXh9BwEYUGFyYUlkAAEkc2lnbmF0dXJlkQMBWE9wdGlvbjxNdWx0aVNpZ25hdHVyZT4ACAxhAUNvbnRyaWJ1dGUgeW91ciBlbnRpcmUgYmFsYW5jZSB0byBhIGNyb3dkIHNhbGUuIFRoaXMgd2lsbCB0cmFuc2ZlciB0aGUgZW50aXJlIGJhbGFuY2Ugb2ZRAWEgdXNlciBvdmVyIHRvIGZ1bmQgYSBwYXJhY2hhaW4gc2xvdC4gSXQgd2lsbCBiZSB3aXRoZHJhd2FibGUgd2hlbiB0aGUgY3Jvd2Rsb2FuIGhhc3xlbmRlZCBhbmQgdGhlIGZ1bmRzIGFyZSB1bnVzZWQuBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLoUHBBhPcHRpb24EBFQBiQcBCBBOb25lAAAAEFNvbWUEAIkHAAABAACJBwgoc3BfcnVudGltZSxNdWx0aVNpZ25lcgABDBxFZDI1NTE5BAAEATxlZDI1NTE5OjpQdWJsaWMAAAAcU3IyNTUxOQQABAE8c3IyNTUxOTo6UHVibGljAAEAFEVjZHNhBABpAgE0ZWNkc2E6OlB1YmxpYwACAACNBxBccG9sa2Fkb3RfcnVudGltZV9jb21tb244YXNzaWduZWRfc2xvdHMYcGFsbGV0EENhbGwEBFQAARRoYXNzaWduX3Blcm1fcGFyYWNoYWluX3Nsb3QEAQhpZLECARhQYXJhSWQAAAQhAUFzc2lnbiBhIHBlcm1hbmVudCBwYXJhY2hhaW4gc2xvdCBhbmQgaW1tZWRpYXRlbHkgY3JlYXRlIGEgbGVhc2UgZm9yIGl0Lmhhc3NpZ25fdGVtcF9wYXJhY2hhaW5fc2xvdAgBCGlksQIBGFBhcmFJZAABSGxlYXNlX3BlcmlvZF9zdGFydJEHAVBTbG90TGVhc2VQZXJpb2RTdGFydAABDDkBQXNzaWduIGEgdGVtcG9yYXJ5IHBhcmFjaGFpbiBzbG90LiBUaGUgZnVuY3Rpb24gdHJpZXMgdG8gY3JlYXRlIGEgbGVhc2UgZm9yIGl0OQFpbW1lZGlhdGVseSBpZiBgU2xvdExlYXNlUGVyaW9kU3RhcnQ6OkN1cnJlbnRgIGlzIHNwZWNpZmllZCwgYW5kIGlmIHRoZSBudW1iZXI5AW9mIGN1cnJlbnRseSBhY3RpdmUgdGVtcG9yYXJ5IHNsb3RzIGlzIGJlbG93IGBNYXhUZW1wb3JhcnlTbG90UGVyTGVhc2VQZXJpb2RgLlx1bmFzc2lnbl9wYXJhY2hhaW5fc2xvdAQBCGlksQIBGFBhcmFJZAACBMBVbmFzc2lnbiBhIHBlcm1hbmVudCBvciB0ZW1wb3JhcnkgcGFyYWNoYWluIHNsb3Rcc2V0X21heF9wZXJtYW5lbnRfc2xvdHMEARRzbG90cxABDHUzMgADBLRTZXRzIHRoZSBzdG9yYWdlIHZhbHVlIFtgTWF4UGVybWFuZW50U2xvdHNgXS5cc2V0X21heF90ZW1wb3Jhcnlfc2xvdHMEARRzbG90cxABDHUzMgAEBLRTZXRzIHRoZSBzdG9yYWdlIHZhbHVlIFtgTWF4VGVtcG9yYXJ5U2xvdHNgXS4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMukQcMXHBvbGthZG90X3J1bnRpbWVfY29tbW9uOGFzc2lnbmVkX3Nsb3RzUFNsb3RMZWFzZVBlcmlvZFN0YXJ0AAEIHEN1cnJlbnQAAAAQTmV4dAABAACVBxBscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zIGNvcmV0aW1lGHBhbGxldBBDYWxsBARUAAEQSHJlcXVlc3RfY29yZV9jb3VudAQBFGNvdW50QQEBDHUxNgABGFEBUmVxdWVzdCB0aGUgY29uZmlndXJhdGlvbiB0byBiZSB1cGRhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgY29yZXMuIFdhcm5pbmc6UQFTaW5jZSB0aGlzIG9ubHkgc2NoZWR1bGVzIGEgY29uZmlndXJhdGlvbiB1cGRhdGUsIGl0IHRha2VzIHR3byBzZXNzaW9ucyB0byBjb21lIGludG8cZWZmZWN0LgCYLSBgb3JpZ2luYDogUm9vdCBvciB0aGUgQ29yZXRpbWUgQ2hhaW6ALSBgY291bnRgOiB0b3RhbCBudW1iZXIgb2YgY29yZXNIcmVxdWVzdF9yZXZlbnVlX2F0BAEQd2hlbhABLEJsb2NrTnVtYmVyAAIQYQFSZXF1ZXN0IHRvIGNsYWltIHRoZSBpbnN0YW50YW5lb3VzIGNvcmV0aW1lIHNhbGVzIHJldmVudWUgc3RhcnRpbmcgZnJvbSB0aGUgYmxvY2sgaXQgd2FzXQFsYXN0IGNsYWltZWQgdW50aWwgYW5kIHVwIHRvIHRoZSBibG9jayBzcGVjaWZpZWQuIFRoZSBjbGFpbWVkIGFtb3VudCB2YWx1ZSBpcyBzZW50IGJhY2tRAXRvIHRoZSBDb3JldGltZSBjaGFpbiBpbiBhIGBub3RpZnlfcmV2ZW51ZWAgbWVzc2FnZS4gQXQgdGhlIHNhbWUgdGltZSwgdGhlIGFtb3VudCBpc4R0ZWxlcG9ydGVkIHRvIHRoZSBDb3JldGltZSBjaGFpbi44Y3JlZGl0X2FjY291bnQIAQx3aG8AATBUOjpBY2NvdW50SWQAARhhbW91bnQYATBCYWxhbmNlT2Y8VD4AAwAsYXNzaWduX2NvcmUQARBjb3JlQQEBPEJyb2tlckNvcmVJbmRleAABFGJlZ2luEAFEQmxvY2tOdW1iZXJGb3I8VD4AAShhc3NpZ25tZW50mQcBjFZlYzwoQ29yZUFzc2lnbm1lbnQsIFBhcnRzT2Y1NzYwMCk+AAEgZW5kX2hpbnScAWRPcHRpb248QmxvY2tOdW1iZXJGb3I8VD4+AAQkWQFSZWNlaXZlIGluc3RydWN0aW9ucyBmcm9tIHRoZSBgRXh0ZXJuYWxCcm9rZXJPcmlnaW5gLCBkZXRhaWxpbmcgaG93IGEgc3BlY2lmaWMgY29yZSBpcyx0byBiZSB1c2VkLgAsUGFyYW1ldGVyczohAS1gb3JpZ2luYDogVGhlIGBFeHRlcm5hbEJyb2tlck9yaWdpbmAsIGFzc3VtZWQgdG8gYmUgdGhlIGNvcmV0aW1lIGNoYWluLqwtYGNvcmVgOiBUaGUgY29yZSB0aGF0IHNob3VsZCBiZSBzY2hlZHVsZWQu2C1gYmVnaW5gOiBUaGUgc3RhcnRpbmcgYmxvY2toZWlnaHQgb2YgdGhlIGluc3RydWN0aW9uLtQtYGFzc2lnbm1lbnRgOiBIb3cgdGhlIGJsb2Nrc3BhY2Ugc2hvdWxkIGJlIHV0aWxpc2VkLlkBLWBlbmRfaGludGA6IEFuIG9wdGlvbmFsIGhpbnQgYXMgdG8gd2hlbiB0aGlzIHBhcnRpY3VsYXIgc2V0IG9mIGluc3RydWN0aW9ucyB3aWxsIGVuZC4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMumQcAAAKdBwCdBwAABAihB6UHAKEHDDRwYWxsZXRfYnJva2VySGNvcmV0aW1lX2ludGVyZmFjZThDb3JlQXNzaWdubWVudAABDBBJZGxlAAAAEFBvb2wAAQAQVGFzawQAEAEYVGFza0lkAAIAAKUHDGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnNEYXNzaWduZXJfY29yZXRpbWUwUGFydHNPZjU3NjAwAAAEAEEBAQx1MTYAAKkHDHhwYWxsZXRfc3Rha2luZ19hc3luY19haF9jbGllbnQYcGFsbGV0EENhbGwEBFQAAQw0dmFsaWRhdG9yX3NldAQBGHJlcG9ydK0HAaxyY19jbGllbnQ6OlZhbGlkYXRvclNldFJlcG9ydDxUOjpBY2NvdW50SWQ+AAAAIHNldF9tb2RlBAEQbW9kZbEHATRPcGVyYXRpbmdNb2RlAAEEAQFBbGxvd3MgZ292ZXJuYW5jZSB0byBmb3JjZSBzZXQgdGhlIG9wZXJhdGluZyBtb2RlIG9mIHRoZSBwYWxsZXQuWGZvcmNlX29uX21pZ3JhdGlvbl9lbmQAAgQlAW1hbnVhbGx5IGRvIHdoYXQgdGhpcyBwYWxsZXQgd2FzIG1lYW50IHRvIGRvIGF0IHRoZSBlbmQgb2YgdGhlIG1pZ3JhdGlvbi4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMurQcIeHBhbGxldF9zdGFraW5nX2FzeW5jX3JjX2NsaWVudEhWYWxpZGF0b3JTZXRSZXBvcnQEJEFjY291bnRJZAEAABABRG5ld192YWxpZGF0b3Jfc2V0AQIBOFZlYzxBY2NvdW50SWQ+AAEIaWQQAQx1MzIAASxwcnVuZV91cF90b5wBUE9wdGlvbjxTZXNzaW9uSW5kZXg+AAEgbGVmdG92ZXIgARBib29sAACxBwh4cGFsbGV0X3N0YWtpbmdfYXN5bmNfYWhfY2xpZW50NE9wZXJhdGluZ01vZGUAAQwcUGFzc2l2ZQAAACBCdWZmZXJlZAABABhBY3RpdmUAAgAAtQcMRHBhbGxldF9taWdyYXRpb25zGHBhbGxldBBDYWxsBARUAAEQQGZvcmNlX3NldF9jdXJzb3IEARhjdXJzb3K5BwFMT3B0aW9uPEN1cnNvck9mPFQ+PgAAFF0BQWxsb3dzIHJvb3QgdG8gc2V0IGEgY3Vyc29yIHRvIGZvcmNlZnVsbHkgc3RhcnQsIHN0b3Agb3IgZm9yd2FyZCB0aGUgbWlncmF0aW9uIHByb2Nlc3MuAEkBU2hvdWxkIG5vcm1hbGx5IG5vdCBiZSBuZWVkZWQgYW5kIGlzIG9ubHkgaW4gcGxhY2UgYXMgZW1lcmdlbmN5IG1lYXN1cmUuIE5vdGUgdGhhdAUBcmVzdGFydGluZyB0aGUgbWlncmF0aW9uIHByb2Nlc3MgaW4gdGhpcyBtYW5uZXIgd2lsbCBub3QgY2FsbCB0aGUtAVtgTWlncmF0aW9uU3RhdHVzSGFuZGxlcjo6c3RhcnRlZGBdIGhvb2sgb3IgZW1pdCBhbiBgVXBncmFkZVN0YXJ0ZWRgIGV2ZW50Llxmb3JjZV9zZXRfYWN0aXZlX2N1cnNvcgwBFGluZGV4EAEMdTMyAAEwaW5uZXJfY3Vyc29yyQcBWE9wdGlvbjxSYXdDdXJzb3JPZjxUPj4AAShzdGFydGVkX2F0nAFkT3B0aW9uPEJsb2NrTnVtYmVyRm9yPFQ+PgABGFkBQWxsb3dzIHJvb3QgdG8gc2V0IGFuIGFjdGl2ZSBjdXJzb3IgdG8gZm9yY2VmdWxseSBzdGFydC9mb3J3YXJkIHRoZSBtaWdyYXRpb24gcHJvY2Vzcy4ARQFUaGlzIGlzIGFuIGVkZ2UtY2FzZSB2ZXJzaW9uIG9mIFtgU2VsZjo6Zm9yY2Vfc2V0X2N1cnNvcmBdIHRoYXQgYWxsb3dzIHRvIHNldCB0aGVhAWBzdGFydGVkX2F0YCB2YWx1ZSB0byB0aGUgbmV4dCBibG9jayBudW1iZXIuIE90aGVyd2lzZSB0aGlzIHdvdWxkIG5vdCBiZSBwb3NzaWJsZSwgc2luY2VFAWBmb3JjZV9zZXRfY3Vyc29yYCB0YWtlcyBhbiBhYnNvbHV0ZSBibG9jayBudW1iZXIuIFNldHRpbmcgYHN0YXJ0ZWRfYXRgIHRvIGBOb25lYAEBaW5kaWNhdGVzIHRoYXQgdGhlIGN1cnJlbnQgYmxvY2sgbnVtYmVyIHBsdXMgb25lIHNob3VsZCBiZSB1c2VkLkhmb3JjZV9vbmJvYXJkX21ibXMAAhCgRm9yY2VzIHRoZSBvbmJvYXJkaW5nIG9mIHRoZSBtaWdyYXRpb25zLgBdAVRoaXMgcHJvY2VzcyBoYXBwZW5zIGF1dG9tYXRpY2FsbHkgb24gYSBydW50aW1lIHVwZ3JhZGUuIEl0IGlzIGluIHBsYWNlIGFzIGFuIGVtZXJnZW5jefxtZWFzdXJlbWVudC4gVGhlIGN1cnNvciBuZWVkcyB0byBiZSBgTm9uZWAgZm9yIHRoaXMgdG8gc3VjY2VlZC44Y2xlYXJfaGlzdG9yaWMEASBzZWxlY3Rvcs0HAaBIaXN0b3JpY0NsZWFudXBTZWxlY3RvcjxJZGVudGlmaWVyT2Y8VD4+AAMUaENsZWFycyB0aGUgYEhpc3RvcmljYCBzZXQuAA0BYG1hcF9jdXJzb3JgIG11c3QgYmUgc2V0IHRvIHRoZSBsYXN0IHZhbHVlIHRoYXQgd2FzIHJldHVybmVkIGJ5IHRoZV0BYEhpc3RvcmljQ2xlYXJlZGAgZXZlbnQuIFRoZSBmaXJzdCB0aW1lIGBOb25lYCBjYW4gYmUgdXNlZC4gYGxpbWl0YCBtdXN0IGJlIGNob3NlbiBpbiBhqHdheSB0aGF0IHdpbGwgcmVzdWx0IGluIGEgc2Vuc2libGUgd2VpZ2h0LgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy65BwQYT3B0aW9uBARUAb0HAQgQTm9uZQAAABBTb21lBAC9BwAAAQAAvQcIRHBhbGxldF9taWdyYXRpb25zPE1pZ3JhdGlvbkN1cnNvcggYQ3Vyc29yAcEHLEJsb2NrTnVtYmVyARABCBhBY3RpdmUEAMUHAYRBY3RpdmVDdXJzb3I8Q3Vyc29yLCBCbG9ja051bWJlcj4AAAAUU3R1Y2sAAQAAwQcMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAEIBFMAAAQAOAEYVmVjPFQ+AADFBwhEcGFsbGV0X21pZ3JhdGlvbnMwQWN0aXZlQ3Vyc29yCBhDdXJzb3IBwQcsQmxvY2tOdW1iZXIBEAAMARRpbmRleBABDHUzMgABMGlubmVyX2N1cnNvcskHAThPcHRpb248Q3Vyc29yPgABKHN0YXJ0ZWRfYXQQASxCbG9ja051bWJlcgAAyQcEGE9wdGlvbgQEVAHBBwEIEE5vbmUAAAAQU29tZQQAwQcAAAEAAM0HCERwYWxsZXRfbWlncmF0aW9uc1xIaXN0b3JpY0NsZWFudXBTZWxlY3RvcgQISWQB0QcBCCBTcGVjaWZpYwQA1QcBHFZlYzxJZD4AAAAgV2lsZGNhcmQIARRsaW1pdJwBLE9wdGlvbjx1MzI+AAE8cHJldmlvdXNfY3Vyc29y2QcBPE9wdGlvbjxWZWM8dTg+PgABAADRBwxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAQgEUwAABAA4ARhWZWM8VD4AANUHAAAC0QcA2QcEGE9wdGlvbgQEVAE4AQgQTm9uZQAAABBTb21lBAA4AAABAADdBwwocGFsbGV0X3hjbRhwYWxsZXQQQ2FsbAQEVAABRBBzZW5kCAEQZGVzdFkFAVhCb3g8VmVyc2lvbmVkTG9jYXRpb24+AAEcbWVzc2FnZU0GAVRCb3g8VmVyc2lvbmVkWGNtPCgpPj4AAAA8dGVsZXBvcnRfYXNzZXRzEAEQZGVzdFkFAVhCb3g8VmVyc2lvbmVkTG9jYXRpb24+AAEsYmVuZWZpY2lhcnlZBQFYQm94PFZlcnNpb25lZExvY2F0aW9uPgABGGFzc2V0c+EHAVBCb3g8VmVyc2lvbmVkQXNzZXRzPgABOGZlZV9hc3NldF9pdGVtEAEMdTMyAAFIEQFUZWxlcG9ydCBzb21lIGFzc2V0cyBmcm9tIHRoZSBsb2NhbCBjaGFpbiB0byBzb21lIGRlc3RpbmF0aW9uIGNoYWluLgAdASoqVGhpcyBmdW5jdGlvbiBpcyBkZXByZWNhdGVkOiBVc2UgYGxpbWl0ZWRfdGVsZXBvcnRfYXNzZXRzYCBpbnN0ZWFkLioqAFEBRmVlIHBheW1lbnQgb24gdGhlIGRlc3RpbmF0aW9uIHNpZGUgaXMgbWFkZSBmcm9tIHRoZSBhc3NldCBpbiB0aGUgYGFzc2V0c2AgdmVjdG9yIG9mYQFpbmRleCBgZmVlX2Fzc2V0X2l0ZW1gLiBUaGUgd2VpZ2h0IGxpbWl0IGZvciBmZWVzIGlzIG5vdCBwcm92aWRlZCBhbmQgdGh1cyBpcyB1bmxpbWl0ZWQstHdpdGggYWxsIGZlZXMgdGFrZW4gYXMgbmVlZGVkIGZyb20gdGhlIGFzc2V0LgApAS0gYG9yaWdpbmA6IE11c3QgYmUgY2FwYWJsZSBvZiB3aXRoZHJhd2luZyB0aGUgYGFzc2V0c2AgYW5kIGV4ZWN1dGluZyBYQ00uJQEtIGBkZXN0YDogRGVzdGluYXRpb24gY29udGV4dCBmb3IgdGhlIGFzc2V0cy4gV2lsbCB0eXBpY2FsbHkgYmUgYFtQYXJlbnQsYQEgIFBhcmFjaGFpbiguLildYCB0byBzZW5kIGZyb20gcGFyYWNoYWluIHRvIHBhcmFjaGFpbiwgb3IgYFtQYXJhY2hhaW4oLi4pXWAgdG8gc2VuZCBmcm9tVCAgcmVsYXkgdG8gcGFyYWNoYWluLlUBLSBgYmVuZWZpY2lhcnlgOiBBIGJlbmVmaWNpYXJ5IGxvY2F0aW9uIGZvciB0aGUgYXNzZXRzIGluIHRoZSBjb250ZXh0IG9mIGBkZXN0YC4gV2lsbJggIGdlbmVyYWxseSBiZSBhbiBgQWNjb3VudElkMzJgIHZhbHVlLlkBLSBgYXNzZXRzYDogVGhlIGFzc2V0cyB0byBiZSB3aXRoZHJhd24uIFRoaXMgc2hvdWxkIGluY2x1ZGUgdGhlIGFzc2V0cyB1c2VkIHRvIHBheSB0aGVoICBmZWUgb24gdGhlIGBkZXN0YCBjaGFpbi5NAS0gYGZlZV9hc3NldF9pdGVtYDogVGhlIGluZGV4IGludG8gYGFzc2V0c2Agb2YgdGhlIGl0ZW0gd2hpY2ggc2hvdWxkIGJlIHVzZWQgdG8gcGF5HCAgZmVlcy5ccmVzZXJ2ZV90cmFuc2Zlcl9hc3NldHMQARBkZXN0WQUBWEJveDxWZXJzaW9uZWRMb2NhdGlvbj4AASxiZW5lZmljaWFyeVkFAVhCb3g8VmVyc2lvbmVkTG9jYXRpb24+AAEYYXNzZXRz4QcBUEJveDxWZXJzaW9uZWRBc3NldHM+AAE4ZmVlX2Fzc2V0X2l0ZW0QAQx1MzIAAnhdAVRyYW5zZmVyIHNvbWUgYXNzZXRzIGZyb20gdGhlIGxvY2FsIGNoYWluIHRvIHRoZSBkZXN0aW5hdGlvbiBjaGFpbiB0aHJvdWdoIHRoZWlyIGxvY2FsLHhkZXN0aW5hdGlvbiBvciByZW1vdGUgcmVzZXJ2ZS4APQFgYXNzZXRzYCBtdXN0IGhhdmUgc2FtZSByZXNlcnZlIGxvY2F0aW9uIGFuZCBtYXkgbm90IGJlIHRlbGVwb3J0YWJsZSB0byBgZGVzdGAuTQEgLSBgYXNzZXRzYCBoYXZlIGxvY2FsIHJlc2VydmU6IHRyYW5zZmVyIGFzc2V0cyB0byBzb3ZlcmVpZ24gYWNjb3VudCBvZiBkZXN0aW5hdGlvbk0BICAgY2hhaW4gYW5kIGZvcndhcmQgYSBub3RpZmljYXRpb24gWENNIHRvIGBkZXN0YCB0byBtaW50IGFuZCBkZXBvc2l0IHJlc2VydmUtYmFzZWRsICAgYXNzZXRzIHRvIGBiZW5lZmljaWFyeWAuVQEgLSBgYXNzZXRzYCBoYXZlIGRlc3RpbmF0aW9uIHJlc2VydmU6IGJ1cm4gbG9jYWwgYXNzZXRzIGFuZCBmb3J3YXJkIGEgbm90aWZpY2F0aW9uIHRvWQEgICBgZGVzdGAgY2hhaW4gdG8gd2l0aGRyYXcgdGhlIHJlc2VydmUgYXNzZXRzIGZyb20gdGhpcyBjaGFpbidzIHNvdmVyZWlnbiBhY2NvdW50IGFuZIQgICBkZXBvc2l0IHRoZW0gdG8gYGJlbmVmaWNpYXJ5YC5hASAtIGBhc3NldHNgIGhhdmUgcmVtb3RlIHJlc2VydmU6IGJ1cm4gbG9jYWwgYXNzZXRzLCBmb3J3YXJkIFhDTSB0byByZXNlcnZlIGNoYWluIHRvIG1vdmVhASAgIHJlc2VydmVzIGZyb20gdGhpcyBjaGFpbidzIFNBIHRvIGBkZXN0YCBjaGFpbidzIFNBLCBhbmQgZm9yd2FyZCBhbm90aGVyIFhDTSB0byBgZGVzdGD0ICAgdG8gbWludCBhbmQgZGVwb3NpdCByZXNlcnZlLWJhc2VkIGFzc2V0cyB0byBgYmVuZWZpY2lhcnlgLgA9ASoqVGhpcyBmdW5jdGlvbiBpcyBkZXByZWNhdGVkOiBVc2UgYGxpbWl0ZWRfcmVzZXJ2ZV90cmFuc2Zlcl9hc3NldHNgIGluc3RlYWQuKioAUQFGZWUgcGF5bWVudCBvbiB0aGUgZGVzdGluYXRpb24gc2lkZSBpcyBtYWRlIGZyb20gdGhlIGFzc2V0IGluIHRoZSBgYXNzZXRzYCB2ZWN0b3Igb2ZhAWluZGV4IGBmZWVfYXNzZXRfaXRlbWAuIFRoZSB3ZWlnaHQgbGltaXQgZm9yIGZlZXMgaXMgbm90IHByb3ZpZGVkIGFuZCB0aHVzIGlzIHVubGltaXRlZCy0d2l0aCBhbGwgZmVlcyB0YWtlbiBhcyBuZWVkZWQgZnJvbSB0aGUgYXNzZXQuACkBLSBgb3JpZ2luYDogTXVzdCBiZSBjYXBhYmxlIG9mIHdpdGhkcmF3aW5nIHRoZSBgYXNzZXRzYCBhbmQgZXhlY3V0aW5nIFhDTS4lAS0gYGRlc3RgOiBEZXN0aW5hdGlvbiBjb250ZXh0IGZvciB0aGUgYXNzZXRzLiBXaWxsIHR5cGljYWxseSBiZSBgW1BhcmVudCxhASAgUGFyYWNoYWluKC4uKV1gIHRvIHNlbmQgZnJvbSBwYXJhY2hhaW4gdG8gcGFyYWNoYWluLCBvciBgW1BhcmFjaGFpbiguLildYCB0byBzZW5kIGZyb21UICByZWxheSB0byBwYXJhY2hhaW4uVQEtIGBiZW5lZmljaWFyeWA6IEEgYmVuZWZpY2lhcnkgbG9jYXRpb24gZm9yIHRoZSBhc3NldHMgaW4gdGhlIGNvbnRleHQgb2YgYGRlc3RgLiBXaWxsmCAgZ2VuZXJhbGx5IGJlIGFuIGBBY2NvdW50SWQzMmAgdmFsdWUuWQEtIGBhc3NldHNgOiBUaGUgYXNzZXRzIHRvIGJlIHdpdGhkcmF3bi4gVGhpcyBzaG91bGQgaW5jbHVkZSB0aGUgYXNzZXRzIHVzZWQgdG8gcGF5IHRoZcggIGZlZSBvbiB0aGUgYGRlc3RgIChhbmQgcG9zc2libHkgcmVzZXJ2ZSkgY2hhaW5zLk0BLSBgZmVlX2Fzc2V0X2l0ZW1gOiBUaGUgaW5kZXggaW50byBgYXNzZXRzYCBvZiB0aGUgaXRlbSB3aGljaCBzaG91bGQgYmUgdXNlZCB0byBwYXkcICBmZWVzLhxleGVjdXRlCAEcbWVzc2FnZeUHAbRCb3g8VmVyc2lvbmVkWGNtPDxUIGFzIENvbmZpZz46OlJ1bnRpbWVDYWxsPj4AAShtYXhfd2VpZ2h0KAEYV2VpZ2h0AAMg0EV4ZWN1dGUgYW4gWENNIG1lc3NhZ2UgZnJvbSBhIGxvY2FsLCBzaWduZWQsIG9yaWdpbi4ATQFBbiBldmVudCBpcyBkZXBvc2l0ZWQgaW5kaWNhdGluZyB3aGV0aGVyIGBtc2dgIGNvdWxkIGJlIGV4ZWN1dGVkIGNvbXBsZXRlbHkgb3Igb25seShwYXJ0aWFsbHkuAF0BTm8gbW9yZSB0aGFuIGBtYXhfd2VpZ2h0YCB3aWxsIGJlIHVzZWQgaW4gaXRzIGF0dGVtcHRlZCBleGVjdXRpb24uIElmIHRoaXMgaXMgbGVzcyB0aGFuQQF0aGUgbWF4aW11bSBhbW91bnQgb2Ygd2VpZ2h0IHRoYXQgdGhlIG1lc3NhZ2UgY291bGQgdGFrZSB0byBiZSBleGVjdXRlZCwgdGhlbiBub3xleGVjdXRpb24gYXR0ZW1wdCB3aWxsIGJlIG1hZGUuRGZvcmNlX3hjbV92ZXJzaW9uCAEgbG9jYXRpb265AgE0Qm94PExvY2F0aW9uPgABHHZlcnNpb24QAShYY21WZXJzaW9uAAQYSQFFeHRvbGwgdGhhdCBhIHBhcnRpY3VsYXIgZGVzdGluYXRpb24gY2FuIGJlIGNvbW11bmljYXRlZCB3aXRoIHRocm91Z2ggYSBwYXJ0aWN1bGFyPHZlcnNpb24gb2YgWENNLgDcLSBgb3JpZ2luYDogTXVzdCBiZSBhbiBvcmlnaW4gc3BlY2lmaWVkIGJ5IEFkbWluT3JpZ2luLtgtIGBsb2NhdGlvbmA6IFRoZSBkZXN0aW5hdGlvbiB0aGF0IGlzIGJlaW5nIGRlc2NyaWJlZC4RAS0gYHhjbV92ZXJzaW9uYDogVGhlIGxhdGVzdCB2ZXJzaW9uIG9mIFhDTSB0aGF0IGBsb2NhdGlvbmAgc3VwcG9ydHMuZGZvcmNlX2RlZmF1bHRfeGNtX3ZlcnNpb24EAURtYXliZV94Y21fdmVyc2lvbpwBSE9wdGlvbjxYY21WZXJzaW9uPgAFFFkBU2V0IGEgc2FmZSBYQ00gdmVyc2lvbiAodGhlIHZlcnNpb24gdGhhdCBYQ00gc2hvdWxkIGJlIGVuY29kZWQgd2l0aCBpZiB0aGUgbW9zdCByZWNlbnS0dmVyc2lvbiBhIGRlc3RpbmF0aW9uIGNhbiBhY2NlcHQgaXMgdW5rbm93bikuANwtIGBvcmlnaW5gOiBNdXN0IGJlIGFuIG9yaWdpbiBzcGVjaWZpZWQgYnkgQWRtaW5PcmlnaW4uOQEtIGBtYXliZV94Y21fdmVyc2lvbmA6IFRoZSBkZWZhdWx0IFhDTSBlbmNvZGluZyB2ZXJzaW9uLCBvciBgTm9uZWAgdG8gZGlzYWJsZS54Zm9yY2Vfc3Vic2NyaWJlX3ZlcnNpb25fbm90aWZ5BAEgbG9jYXRpb25ZBQFYQm94PFZlcnNpb25lZExvY2F0aW9uPgAGEDkBQXNrIGEgbG9jYXRpb24gdG8gbm90aWZ5IHVzIHJlZ2FyZGluZyB0aGVpciBYQ00gdmVyc2lvbiBhbmQgYW55IGNoYW5nZXMgdG8gaXQuANwtIGBvcmlnaW5gOiBNdXN0IGJlIGFuIG9yaWdpbiBzcGVjaWZpZWQgYnkgQWRtaW5PcmlnaW4uWQEtIGBsb2NhdGlvbmA6IFRoZSBsb2NhdGlvbiB0byB3aGljaCB3ZSBzaG91bGQgc3Vic2NyaWJlIGZvciBYQ00gdmVyc2lvbiBub3RpZmljYXRpb25zLoBmb3JjZV91bnN1YnNjcmliZV92ZXJzaW9uX25vdGlmeQQBIGxvY2F0aW9uWQUBWEJveDxWZXJzaW9uZWRMb2NhdGlvbj4ABxhJAVJlcXVpcmUgdGhhdCBhIHBhcnRpY3VsYXIgZGVzdGluYXRpb24gc2hvdWxkIG5vIGxvbmdlciBub3RpZnkgdXMgcmVnYXJkaW5nIGFueSBYQ01AdmVyc2lvbiBjaGFuZ2VzLgDcLSBgb3JpZ2luYDogTXVzdCBiZSBhbiBvcmlnaW4gc3BlY2lmaWVkIGJ5IEFkbWluT3JpZ2luLj0BLSBgbG9jYXRpb25gOiBUaGUgbG9jYXRpb24gdG8gd2hpY2ggd2UgYXJlIGN1cnJlbnRseSBzdWJzY3JpYmVkIGZvciBYQ00gdmVyc2lvbqggIG5vdGlmaWNhdGlvbnMgd2hpY2ggd2Ugbm8gbG9uZ2VyIGRlc2lyZS58bGltaXRlZF9yZXNlcnZlX3RyYW5zZmVyX2Fzc2V0cxQBEGRlc3RZBQFYQm94PFZlcnNpb25lZExvY2F0aW9uPgABLGJlbmVmaWNpYXJ5WQUBWEJveDxWZXJzaW9uZWRMb2NhdGlvbj4AARhhc3NldHPhBwFQQm94PFZlcnNpb25lZEFzc2V0cz4AAThmZWVfYXNzZXRfaXRlbRABDHUzMgABMHdlaWdodF9saW1pdLUGASxXZWlnaHRMaW1pdAAIeF0BVHJhbnNmZXIgc29tZSBhc3NldHMgZnJvbSB0aGUgbG9jYWwgY2hhaW4gdG8gdGhlIGRlc3RpbmF0aW9uIGNoYWluIHRocm91Z2ggdGhlaXIgbG9jYWwseGRlc3RpbmF0aW9uIG9yIHJlbW90ZSByZXNlcnZlLgA9AWBhc3NldHNgIG11c3QgaGF2ZSBzYW1lIHJlc2VydmUgbG9jYXRpb24gYW5kIG1heSBub3QgYmUgdGVsZXBvcnRhYmxlIHRvIGBkZXN0YC5NASAtIGBhc3NldHNgIGhhdmUgbG9jYWwgcmVzZXJ2ZTogdHJhbnNmZXIgYXNzZXRzIHRvIHNvdmVyZWlnbiBhY2NvdW50IG9mIGRlc3RpbmF0aW9uTQEgICBjaGFpbiBhbmQgZm9yd2FyZCBhIG5vdGlmaWNhdGlvbiBYQ00gdG8gYGRlc3RgIHRvIG1pbnQgYW5kIGRlcG9zaXQgcmVzZXJ2ZS1iYXNlZGwgICBhc3NldHMgdG8gYGJlbmVmaWNpYXJ5YC5VASAtIGBhc3NldHNgIGhhdmUgZGVzdGluYXRpb24gcmVzZXJ2ZTogYnVybiBsb2NhbCBhc3NldHMgYW5kIGZvcndhcmQgYSBub3RpZmljYXRpb24gdG9ZASAgIGBkZXN0YCBjaGFpbiB0byB3aXRoZHJhdyB0aGUgcmVzZXJ2ZSBhc3NldHMgZnJvbSB0aGlzIGNoYWluJ3Mgc292ZXJlaWduIGFjY291bnQgYW5khCAgIGRlcG9zaXQgdGhlbSB0byBgYmVuZWZpY2lhcnlgLmEBIC0gYGFzc2V0c2AgaGF2ZSByZW1vdGUgcmVzZXJ2ZTogYnVybiBsb2NhbCBhc3NldHMsIGZvcndhcmQgWENNIHRvIHJlc2VydmUgY2hhaW4gdG8gbW92ZWEBICAgcmVzZXJ2ZXMgZnJvbSB0aGlzIGNoYWluJ3MgU0EgdG8gYGRlc3RgIGNoYWluJ3MgU0EsIGFuZCBmb3J3YXJkIGFub3RoZXIgWENNIHRvIGBkZXN0YPQgICB0byBtaW50IGFuZCBkZXBvc2l0IHJlc2VydmUtYmFzZWQgYXNzZXRzIHRvIGBiZW5lZmljaWFyeWAuAFEBRmVlIHBheW1lbnQgb24gdGhlIGRlc3RpbmF0aW9uIHNpZGUgaXMgbWFkZSBmcm9tIHRoZSBhc3NldCBpbiB0aGUgYGFzc2V0c2AgdmVjdG9yIG9mYQFpbmRleCBgZmVlX2Fzc2V0X2l0ZW1gLCB1cCB0byBlbm91Z2ggdG8gcGF5IGZvciBgd2VpZ2h0X2xpbWl0YCBvZiB3ZWlnaHQuIElmIG1vcmUgd2VpZ2h0WQFpcyBuZWVkZWQgdGhhbiBgd2VpZ2h0X2xpbWl0YCwgdGhlbiB0aGUgb3BlcmF0aW9uIHdpbGwgZmFpbCBhbmQgdGhlIHNlbnQgYXNzZXRzIG1heSBiZSBhdCByaXNrLgApAS0gYG9yaWdpbmA6IE11c3QgYmUgY2FwYWJsZSBvZiB3aXRoZHJhd2luZyB0aGUgYGFzc2V0c2AgYW5kIGV4ZWN1dGluZyBYQ00uJQEtIGBkZXN0YDogRGVzdGluYXRpb24gY29udGV4dCBmb3IgdGhlIGFzc2V0cy4gV2lsbCB0eXBpY2FsbHkgYmUgYFtQYXJlbnQsYQEgIFBhcmFjaGFpbiguLildYCB0byBzZW5kIGZyb20gcGFyYWNoYWluIHRvIHBhcmFjaGFpbiwgb3IgYFtQYXJhY2hhaW4oLi4pXWAgdG8gc2VuZCBmcm9tVCAgcmVsYXkgdG8gcGFyYWNoYWluLlUBLSBgYmVuZWZpY2lhcnlgOiBBIGJlbmVmaWNpYXJ5IGxvY2F0aW9uIGZvciB0aGUgYXNzZXRzIGluIHRoZSBjb250ZXh0IG9mIGBkZXN0YC4gV2lsbJggIGdlbmVyYWxseSBiZSBhbiBgQWNjb3VudElkMzJgIHZhbHVlLlkBLSBgYXNzZXRzYDogVGhlIGFzc2V0cyB0byBiZSB3aXRoZHJhd24uIFRoaXMgc2hvdWxkIGluY2x1ZGUgdGhlIGFzc2V0cyB1c2VkIHRvIHBheSB0aGXIICBmZWUgb24gdGhlIGBkZXN0YCAoYW5kIHBvc3NpYmx5IHJlc2VydmUpIGNoYWlucy5NAS0gYGZlZV9hc3NldF9pdGVtYDogVGhlIGluZGV4IGludG8gYGFzc2V0c2Agb2YgdGhlIGl0ZW0gd2hpY2ggc2hvdWxkIGJlIHVzZWQgdG8gcGF5HCAgZmVlcy5FAS0gYHdlaWdodF9saW1pdGA6IFRoZSByZW1vdGUtc2lkZSB3ZWlnaHQgbGltaXQsIGlmIGFueSwgZm9yIHRoZSBYQ00gZmVlIHB1cmNoYXNlLlxsaW1pdGVkX3RlbGVwb3J0X2Fzc2V0cxQBEGRlc3RZBQFYQm94PFZlcnNpb25lZExvY2F0aW9uPgABLGJlbmVmaWNpYXJ5WQUBWEJveDxWZXJzaW9uZWRMb2NhdGlvbj4AARhhc3NldHPhBwFQQm94PFZlcnNpb25lZEFzc2V0cz4AAThmZWVfYXNzZXRfaXRlbRABDHUzMgABMHdlaWdodF9saW1pdLUGASxXZWlnaHRMaW1pdAAJSBEBVGVsZXBvcnQgc29tZSBhc3NldHMgZnJvbSB0aGUgbG9jYWwgY2hhaW4gdG8gc29tZSBkZXN0aW5hdGlvbiBjaGFpbi4AUQFGZWUgcGF5bWVudCBvbiB0aGUgZGVzdGluYXRpb24gc2lkZSBpcyBtYWRlIGZyb20gdGhlIGFzc2V0IGluIHRoZSBgYXNzZXRzYCB2ZWN0b3Igb2ZhAWluZGV4IGBmZWVfYXNzZXRfaXRlbWAsIHVwIHRvIGVub3VnaCB0byBwYXkgZm9yIGB3ZWlnaHRfbGltaXRgIG9mIHdlaWdodC4gSWYgbW9yZSB3ZWlnaHRZAWlzIG5lZWRlZCB0aGFuIGB3ZWlnaHRfbGltaXRgLCB0aGVuIHRoZSBvcGVyYXRpb24gd2lsbCBmYWlsIGFuZCB0aGUgc2VudCBhc3NldHMgbWF5IGJlIGF0IHJpc2suACkBLSBgb3JpZ2luYDogTXVzdCBiZSBjYXBhYmxlIG9mIHdpdGhkcmF3aW5nIHRoZSBgYXNzZXRzYCBhbmQgZXhlY3V0aW5nIFhDTS4lAS0gYGRlc3RgOiBEZXN0aW5hdGlvbiBjb250ZXh0IGZvciB0aGUgYXNzZXRzLiBXaWxsIHR5cGljYWxseSBiZSBgW1BhcmVudCxhASAgUGFyYWNoYWluKC4uKV1gIHRvIHNlbmQgZnJvbSBwYXJhY2hhaW4gdG8gcGFyYWNoYWluLCBvciBgW1BhcmFjaGFpbiguLildYCB0byBzZW5kIGZyb21UICByZWxheSB0byBwYXJhY2hhaW4uVQEtIGBiZW5lZmljaWFyeWA6IEEgYmVuZWZpY2lhcnkgbG9jYXRpb24gZm9yIHRoZSBhc3NldHMgaW4gdGhlIGNvbnRleHQgb2YgYGRlc3RgLiBXaWxsmCAgZ2VuZXJhbGx5IGJlIGFuIGBBY2NvdW50SWQzMmAgdmFsdWUuWQEtIGBhc3NldHNgOiBUaGUgYXNzZXRzIHRvIGJlIHdpdGhkcmF3bi4gVGhpcyBzaG91bGQgaW5jbHVkZSB0aGUgYXNzZXRzIHVzZWQgdG8gcGF5IHRoZWggIGZlZSBvbiB0aGUgYGRlc3RgIGNoYWluLk0BLSBgZmVlX2Fzc2V0X2l0ZW1gOiBUaGUgaW5kZXggaW50byBgYXNzZXRzYCBvZiB0aGUgaXRlbSB3aGljaCBzaG91bGQgYmUgdXNlZCB0byBwYXkcICBmZWVzLkUBLSBgd2VpZ2h0X2xpbWl0YDogVGhlIHJlbW90ZS1zaWRlIHdlaWdodCBsaW1pdCwgaWYgYW55LCBmb3IgdGhlIFhDTSBmZWUgcHVyY2hhc2UuQGZvcmNlX3N1c3BlbnNpb24EASRzdXNwZW5kZWQgARBib29sAAoQ9FNldCBvciB1bnNldCB0aGUgZ2xvYmFsIHN1c3BlbnNpb24gc3RhdGUgb2YgdGhlIFhDTSBleGVjdXRvci4A3C0gYG9yaWdpbmA6IE11c3QgYmUgYW4gb3JpZ2luIHNwZWNpZmllZCBieSBBZG1pbk9yaWdpbi7QLSBgc3VzcGVuZGVkYDogYHRydWVgIHRvIHN1c3BlbmQsIGBmYWxzZWAgdG8gcmVzdW1lLjx0cmFuc2Zlcl9hc3NldHMUARBkZXN0WQUBWEJveDxWZXJzaW9uZWRMb2NhdGlvbj4AASxiZW5lZmljaWFyeVkFAVhCb3g8VmVyc2lvbmVkTG9jYXRpb24+AAEYYXNzZXRz4QcBUEJveDxWZXJzaW9uZWRBc3NldHM+AAE4ZmVlX2Fzc2V0X2l0ZW0QAQx1MzIAATB3ZWlnaHRfbGltaXS1BgEsV2VpZ2h0TGltaXQAC4RdAVRyYW5zZmVyIHNvbWUgYXNzZXRzIGZyb20gdGhlIGxvY2FsIGNoYWluIHRvIHRoZSBkZXN0aW5hdGlvbiBjaGFpbiB0aHJvdWdoIHRoZWlyIGxvY2FsLNBkZXN0aW5hdGlvbiBvciByZW1vdGUgcmVzZXJ2ZSwgb3IgdGhyb3VnaCB0ZWxlcG9ydHMuAFEBRmVlIHBheW1lbnQgb24gdGhlIGRlc3RpbmF0aW9uIHNpZGUgaXMgbWFkZSBmcm9tIHRoZSBhc3NldCBpbiB0aGUgYGFzc2V0c2AgdmVjdG9yIG9mNQFpbmRleCBgZmVlX2Fzc2V0X2l0ZW1gIChoZW5jZSByZWZlcnJlZCB0byBhcyBgZmVlc2ApLCB1cCB0byBlbm91Z2ggdG8gcGF5IGZvckEBYHdlaWdodF9saW1pdGAgb2Ygd2VpZ2h0LiBJZiBtb3JlIHdlaWdodCBpcyBuZWVkZWQgdGhhbiBgd2VpZ2h0X2xpbWl0YCwgdGhlbiB0aGXcb3BlcmF0aW9uIHdpbGwgZmFpbCBhbmQgdGhlIHNlbnQgYXNzZXRzIG1heSBiZSBhdCByaXNrLgBhAWBhc3NldHNgIChleGNsdWRpbmcgYGZlZXNgKSBtdXN0IGhhdmUgc2FtZSByZXNlcnZlIGxvY2F0aW9uIG9yIG90aGVyd2lzZSBiZSB0ZWxlcG9ydGFibGWwdG8gYGRlc3RgLCBubyBsaW1pdGF0aW9ucyBpbXBvc2VkIG9uIGBmZWVzYC5NASAtIGZvciBsb2NhbCByZXNlcnZlOiB0cmFuc2ZlciBhc3NldHMgdG8gc292ZXJlaWduIGFjY291bnQgb2YgZGVzdGluYXRpb24gY2hhaW4gYW5kTQEgICBmb3J3YXJkIGEgbm90aWZpY2F0aW9uIFhDTSB0byBgZGVzdGAgdG8gbWludCBhbmQgZGVwb3NpdCByZXNlcnZlLWJhc2VkIGFzc2V0cyB0b0QgICBgYmVuZWZpY2lhcnlgLmEBIC0gZm9yIGRlc3RpbmF0aW9uIHJlc2VydmU6IGJ1cm4gbG9jYWwgYXNzZXRzIGFuZCBmb3J3YXJkIGEgbm90aWZpY2F0aW9uIHRvIGBkZXN0YCBjaGFpblkBICAgdG8gd2l0aGRyYXcgdGhlIHJlc2VydmUgYXNzZXRzIGZyb20gdGhpcyBjaGFpbidzIHNvdmVyZWlnbiBhY2NvdW50IGFuZCBkZXBvc2l0IHRoZW1QICAgdG8gYGJlbmVmaWNpYXJ5YC5dASAtIGZvciByZW1vdGUgcmVzZXJ2ZTogYnVybiBsb2NhbCBhc3NldHMsIGZvcndhcmQgWENNIHRvIHJlc2VydmUgY2hhaW4gdG8gbW92ZSByZXNlcnZlc10BICAgZnJvbSB0aGlzIGNoYWluJ3MgU0EgdG8gYGRlc3RgIGNoYWluJ3MgU0EsIGFuZCBmb3J3YXJkIGFub3RoZXIgWENNIHRvIGBkZXN0YCB0byBtaW501CAgIGFuZCBkZXBvc2l0IHJlc2VydmUtYmFzZWQgYXNzZXRzIHRvIGBiZW5lZmljaWFyeWAuUQEgLSBmb3IgdGVsZXBvcnRzOiBidXJuIGxvY2FsIGFzc2V0cyBhbmQgZm9yd2FyZCBYQ00gdG8gYGRlc3RgIGNoYWluIHRvIG1pbnQvdGVsZXBvcnSwICAgYXNzZXRzIGFuZCBkZXBvc2l0IHRoZW0gdG8gYGJlbmVmaWNpYXJ5YC4AKQEtIGBvcmlnaW5gOiBNdXN0IGJlIGNhcGFibGUgb2Ygd2l0aGRyYXdpbmcgdGhlIGBhc3NldHNgIGFuZCBleGVjdXRpbmcgWENNLi0BLSBgZGVzdGA6IERlc3RpbmF0aW9uIGNvbnRleHQgZm9yIHRoZSBhc3NldHMuIFdpbGwgdHlwaWNhbGx5IGJlIGBYMihQYXJlbnQsVQEgIFBhcmFjaGFpbiguLikpYCB0byBzZW5kIGZyb20gcGFyYWNoYWluIHRvIHBhcmFjaGFpbiwgb3IgYFgxKFBhcmFjaGFpbiguLikpYCB0byBzZW5kaCAgZnJvbSByZWxheSB0byBwYXJhY2hhaW4uVQEtIGBiZW5lZmljaWFyeWA6IEEgYmVuZWZpY2lhcnkgbG9jYXRpb24gZm9yIHRoZSBhc3NldHMgaW4gdGhlIGNvbnRleHQgb2YgYGRlc3RgLiBXaWxsmCAgZ2VuZXJhbGx5IGJlIGFuIGBBY2NvdW50SWQzMmAgdmFsdWUuWQEtIGBhc3NldHNgOiBUaGUgYXNzZXRzIHRvIGJlIHdpdGhkcmF3bi4gVGhpcyBzaG91bGQgaW5jbHVkZSB0aGUgYXNzZXRzIHVzZWQgdG8gcGF5IHRoZcggIGZlZSBvbiB0aGUgYGRlc3RgIChhbmQgcG9zc2libHkgcmVzZXJ2ZSkgY2hhaW5zLk0BLSBgZmVlX2Fzc2V0X2l0ZW1gOiBUaGUgaW5kZXggaW50byBgYXNzZXRzYCBvZiB0aGUgaXRlbSB3aGljaCBzaG91bGQgYmUgdXNlZCB0byBwYXkcICBmZWVzLkUBLSBgd2VpZ2h0X2xpbWl0YDogVGhlIHJlbW90ZS1zaWRlIHdlaWdodCBsaW1pdCwgaWYgYW55LCBmb3IgdGhlIFhDTSBmZWUgcHVyY2hhc2UuMGNsYWltX2Fzc2V0cwgBGGFzc2V0c+EHAVBCb3g8VmVyc2lvbmVkQXNzZXRzPgABLGJlbmVmaWNpYXJ5WQUBWEJveDxWZXJzaW9uZWRMb2NhdGlvbj4ADBhVAUNsYWltcyBhc3NldHMgdHJhcHBlZCBvbiB0aGlzIHBhbGxldCBiZWNhdXNlIG9mIGxlZnRvdmVyIGFzc2V0cyBkdXJpbmcgWENNIGV4ZWN1dGlvbi4ArC0gYG9yaWdpbmA6IEFueW9uZSBjYW4gY2FsbCB0aGlzIGV4dHJpbnNpYy5dAS0gYGFzc2V0c2A6IFRoZSBleGFjdCBhc3NldHMgdGhhdCB3ZXJlIHRyYXBwZWQuIFVzZSB0aGUgdmVyc2lvbiB0byBzcGVjaWZ5IHdoYXQgdmVyc2lvbph3YXMgdGhlIGxhdGVzdCB3aGVuIHRoZXkgd2VyZSB0cmFwcGVkLkUBLSBgYmVuZWZpY2lhcnlgOiBUaGUgbG9jYXRpb24vYWNjb3VudCB3aGVyZSB0aGUgY2xhaW1lZCBhc3NldHMgd2lsbCBiZSBkZXBvc2l0ZWQujHRyYW5zZmVyX2Fzc2V0c191c2luZ190eXBlX2FuZF90aGVuHAEQZGVzdFkFAVhCb3g8VmVyc2lvbmVkTG9jYXRpb24+AAEYYXNzZXRz4QcBUEJveDxWZXJzaW9uZWRBc3NldHM+AAFQYXNzZXRzX3RyYW5zZmVyX3R5cGURCAFEQm94PFRyYW5zZmVyVHlwZT4AAThyZW1vdGVfZmVlc19pZBUIAVRCb3g8VmVyc2lvbmVkQXNzZXRJZD4AAUhmZWVzX3RyYW5zZmVyX3R5cGURCAFEQm94PFRyYW5zZmVyVHlwZT4AAUhjdXN0b21feGNtX29uX2Rlc3RNBgFUQm94PFZlcnNpb25lZFhjbTwoKT4+AAEwd2VpZ2h0X2xpbWl0tQYBLFdlaWdodExpbWl0AA3AVQFUcmFuc2ZlciBhc3NldHMgZnJvbSB0aGUgbG9jYWwgY2hhaW4gdG8gdGhlIGRlc3RpbmF0aW9uIGNoYWluIHVzaW5nIGV4cGxpY2l0IHRyYW5zZmVyaHR5cGVzIGZvciBhc3NldHMgYW5kIGZlZXMuAFkBYGFzc2V0c2AgbXVzdCBoYXZlIHNhbWUgcmVzZXJ2ZSBsb2NhdGlvbiBvciBtYXkgYmUgdGVsZXBvcnRhYmxlIHRvIGBkZXN0YC4gQ2FsbGVyIG11c3TscHJvdmlkZSB0aGUgYGFzc2V0c190cmFuc2Zlcl90eXBlYCB0byBiZSB1c2VkIGZvciBgYXNzZXRzYDpRASAtIGBUcmFuc2ZlclR5cGU6OkxvY2FsUmVzZXJ2ZWA6IHRyYW5zZmVyIGFzc2V0cyB0byBzb3ZlcmVpZ24gYWNjb3VudCBvZiBkZXN0aW5hdGlvbk0BICAgY2hhaW4gYW5kIGZvcndhcmQgYSBub3RpZmljYXRpb24gWENNIHRvIGBkZXN0YCB0byBtaW50IGFuZCBkZXBvc2l0IHJlc2VydmUtYmFzZWRsICAgYXNzZXRzIHRvIGBiZW5lZmljaWFyeWAuWQEgLSBgVHJhbnNmZXJUeXBlOjpEZXN0aW5hdGlvblJlc2VydmVgOiBidXJuIGxvY2FsIGFzc2V0cyBhbmQgZm9yd2FyZCBhIG5vdGlmaWNhdGlvbiB0b1kBICAgYGRlc3RgIGNoYWluIHRvIHdpdGhkcmF3IHRoZSByZXNlcnZlIGFzc2V0cyBmcm9tIHRoaXMgY2hhaW4ncyBzb3ZlcmVpZ24gYWNjb3VudCBhbmSEICAgZGVwb3NpdCB0aGVtIHRvIGBiZW5lZmljaWFyeWAuWQEgLSBgVHJhbnNmZXJUeXBlOjpSZW1vdGVSZXNlcnZlKHJlc2VydmUpYDogYnVybiBsb2NhbCBhc3NldHMsIGZvcndhcmQgWENNIHRvIGByZXNlcnZlYGEBICAgY2hhaW4gdG8gbW92ZSByZXNlcnZlcyBmcm9tIHRoaXMgY2hhaW4ncyBTQSB0byBgZGVzdGAgY2hhaW4ncyBTQSwgYW5kIGZvcndhcmQgYW5vdGhlclUBICAgWENNIHRvIGBkZXN0YCB0byBtaW50IGFuZCBkZXBvc2l0IHJlc2VydmUtYmFzZWQgYXNzZXRzIHRvIGBiZW5lZmljaWFyeWAuIFR5cGljYWxseZQgICB0aGUgcmVtb3RlIGByZXNlcnZlYCBpcyBBc3NldCBIdWIuRQEgLSBgVHJhbnNmZXJUeXBlOjpUZWxlcG9ydGA6IGJ1cm4gbG9jYWwgYXNzZXRzIGFuZCBmb3J3YXJkIFhDTSB0byBgZGVzdGAgY2hhaW4gdG/oICAgbWludC90ZWxlcG9ydCBhc3NldHMgYW5kIGRlcG9zaXQgdGhlbSB0byBgYmVuZWZpY2lhcnlgLgBVAU9uIHRoZSBkZXN0aW5hdGlvbiBjaGFpbiwgYXMgd2VsbCBhcyBhbnkgaW50ZXJtZWRpYXJ5IGhvcHMsIGBCdXlFeGVjdXRpb25gIGlzIHVzZWQgdG8hAWJ1eSBleGVjdXRpb24gdXNpbmcgdHJhbnNmZXJyZWQgYGFzc2V0c2AgaWRlbnRpZmllZCBieSBgcmVtb3RlX2ZlZXNfaWRgLlkBTWFrZSBzdXJlIGVub3VnaCBvZiB0aGUgc3BlY2lmaWVkIGByZW1vdGVfZmVlc19pZGAgYXNzZXQgaXMgaW5jbHVkZWQgaW4gdGhlIGdpdmVuIGxpc3RhAW9mIGBhc3NldHNgLiBgcmVtb3RlX2ZlZXNfaWRgIHNob3VsZCBiZSBlbm91Z2ggdG8gcGF5IGZvciBgd2VpZ2h0X2xpbWl0YC4gSWYgbW9yZSB3ZWlnaHRZAWlzIG5lZWRlZCB0aGFuIGB3ZWlnaHRfbGltaXRgLCB0aGVuIHRoZSBvcGVyYXRpb24gd2lsbCBmYWlsIGFuZCB0aGUgc2VudCBhc3NldHMgbWF5IGJlIGF0IHJpc2suAEUBYHJlbW90ZV9mZWVzX2lkYCBtYXkgdXNlIGRpZmZlcmVudCB0cmFuc2ZlciB0eXBlIHRoYW4gcmVzdCBvZiBgYXNzZXRzYCBhbmQgY2FuIGJlnHNwZWNpZmllZCB0aHJvdWdoIGBmZWVzX3RyYW5zZmVyX3R5cGVgLgBhAVRoZSBjYWxsZXIgbmVlZHMgdG8gc3BlY2lmeSB3aGF0IHNob3VsZCBoYXBwZW4gdG8gdGhlIHRyYW5zZmVycmVkIGFzc2V0cyBvbmNlIHRoZXkgcmVhY2hBAXRoZSBgZGVzdGAgY2hhaW4uIFRoaXMgaXMgZG9uZSB0aHJvdWdoIHRoZSBgY3VzdG9tX3hjbV9vbl9kZXN0YCBwYXJhbWV0ZXIsIHdoaWNo/GNvbnRhaW5zIHRoZSBpbnN0cnVjdGlvbnMgdG8gZXhlY3V0ZSBvbiBgZGVzdGAgYXMgYSBmaW5hbCBzdGVwLnwgIFRoaXMgaXMgdXN1YWxseSBhcyBzaW1wbGUgYXM6UQEgIGBYY20odmVjIVtEZXBvc2l0QXNzZXQgeyBhc3NldHM6IFdpbGQoQWxsQ291bnRlZChhc3NldHMubGVuKCkpKSwgYmVuZWZpY2lhcnkgfV0pYCwxASAgYnV0IGNvdWxkIGJlIHNvbWV0aGluZyBtb3JlIGV4b3RpYyBsaWtlIHNlbmRpbmcgdGhlIGBhc3NldHNgIGV2ZW4gZnVydGhlci4AKQEtIGBvcmlnaW5gOiBNdXN0IGJlIGNhcGFibGUgb2Ygd2l0aGRyYXdpbmcgdGhlIGBhc3NldHNgIGFuZCBleGVjdXRpbmcgWENNLiUBLSBgZGVzdGA6IERlc3RpbmF0aW9uIGNvbnRleHQgZm9yIHRoZSBhc3NldHMuIFdpbGwgdHlwaWNhbGx5IGJlIGBbUGFyZW50LGEBICBQYXJhY2hhaW4oLi4pXWAgdG8gc2VuZCBmcm9tIHBhcmFjaGFpbiB0byBwYXJhY2hhaW4sIG9yIGBbUGFyYWNoYWluKC4uKV1gIHRvIHNlbmQgZnJvbT0BICByZWxheSB0byBwYXJhY2hhaW4sIG9yIGAocGFyZW50czogMiwgKEdsb2JhbENvbnNlbnN1cyguLiksIC4uKSlgIHRvIHNlbmQgZnJvbfQgIHBhcmFjaGFpbiBhY3Jvc3MgYSBicmlkZ2UgdG8gYW5vdGhlciBlY29zeXN0ZW0gZGVzdGluYXRpb24uWQEtIGBhc3NldHNgOiBUaGUgYXNzZXRzIHRvIGJlIHdpdGhkcmF3bi4gVGhpcyBzaG91bGQgaW5jbHVkZSB0aGUgYXNzZXRzIHVzZWQgdG8gcGF5IHRoZcggIGZlZSBvbiB0aGUgYGRlc3RgIChhbmQgcG9zc2libHkgcmVzZXJ2ZSkgY2hhaW5zLj0BLSBgYXNzZXRzX3RyYW5zZmVyX3R5cGVgOiBUaGUgWENNIGBUcmFuc2ZlclR5cGVgIHVzZWQgdG8gdHJhbnNmZXIgdGhlIGBhc3NldHNgLiEBLSBgcmVtb3RlX2ZlZXNfaWRgOiBPbmUgb2YgdGhlIGluY2x1ZGVkIGBhc3NldHNgIHRvIGJlIHVzZWQgdG8gcGF5IGZlZXMuSQEtIGBmZWVzX3RyYW5zZmVyX3R5cGVgOiBUaGUgWENNIGBUcmFuc2ZlclR5cGVgIHVzZWQgdG8gdHJhbnNmZXIgdGhlIGBmZWVzYCBhc3NldHMuWQEtIGBjdXN0b21feGNtX29uX2Rlc3RgOiBUaGUgWENNIHRvIGJlIGV4ZWN1dGVkIG9uIGBkZXN0YCBjaGFpbiBhcyB0aGUgbGFzdCBzdGVwIG9mIHRoZVkBICB0cmFuc2Zlciwgd2hpY2ggYWxzbyBkZXRlcm1pbmVzIHdoYXQgaGFwcGVucyB0byB0aGUgYXNzZXRzIG9uIHRoZSBkZXN0aW5hdGlvbiBjaGFpbi5FAS0gYHdlaWdodF9saW1pdGA6IFRoZSByZW1vdGUtc2lkZSB3ZWlnaHQgbGltaXQsIGlmIGFueSwgZm9yIHRoZSBYQ00gZmVlIHB1cmNoYXNlLlBhZGRfYXV0aG9yaXplZF9hbGlhcwgBHGFsaWFzZXJZBQFYQm94PFZlcnNpb25lZExvY2F0aW9uPgABHGV4cGlyZXMZCAEsT3B0aW9uPHU2ND4ADixdAUF1dGhvcml6ZSBhbm90aGVyIGBhbGlhc2VyYCBsb2NhdGlvbiB0byBhbGlhcyBpbnRvIHRoZSBsb2NhbCBgb3JpZ2luYCBtYWtpbmcgdGhpcyBjYWxsLikBVGhlIGBhbGlhc2VyYCBpcyBvbmx5IGF1dGhvcml6ZWQgdW50aWwgdGhlIHByb3ZpZGVkIGBleHBpcnlgIGJsb2NrIG51bWJlci5JAVRoZSBjYWxsIGNhbiBhbHNvIGJlIHVzZWQgZm9yIGEgcHJldmlvdXNseSBhdXRob3JpemVkIGFsaWFzIGluIG9yZGVyIHRvIHVwZGF0ZSBpdHNYYGV4cGlyeWAgYmxvY2sgbnVtYmVyLgBRAVVzdWFsbHkgdXNlZnVsIHRvIGFsbG93IHlvdXIgbG9jYWwgYWNjb3VudCB0byBiZSBhbGlhc2VkIGludG8gZnJvbSBhIHJlbW90ZSBsb2NhdGlvbvRhbHNvIHVuZGVyIHlvdXIgY29udHJvbCAobGlrZSB5b3VyIGFjY291bnQgb24gYW5vdGhlciBjaGFpbikuAFEBV0FSTklORzogbWFrZSBzdXJlIHRoZSBjYWxsZXIgYG9yaWdpbmAgKHlvdSkgdHJ1c3RzIHRoZSBgYWxpYXNlcmAgbG9jYXRpb24gdG8gYWN0IGluWQF0aGVpci95b3VyIG5hbWUuIE9uY2UgYXV0aG9yaXplZCB1c2luZyB0aGlzIGNhbGwsIHRoZSBgYWxpYXNlcmAgY2FuIGZyZWVseSBpbXBlcnNvbmF0ZdRgb3JpZ2luYCBpbiBYQ00gcHJvZ3JhbXMgZXhlY3V0ZWQgb24gdGhlIGxvY2FsIGNoYWluLlxyZW1vdmVfYXV0aG9yaXplZF9hbGlhcwQBHGFsaWFzZXJZBQFYQm94PFZlcnNpb25lZExvY2F0aW9uPgAPCF0BUmVtb3ZlIGEgcHJldmlvdXNseSBhdXRob3JpemVkIGBhbGlhc2VyYCBmcm9tIHRoZSBsaXN0IG9mIGxvY2F0aW9ucyB0aGF0IGNhbiBhbGlhcyBpbnRvkHRoZSBsb2NhbCBgb3JpZ2luYCBtYWtpbmcgdGhpcyBjYWxsLnRyZW1vdmVfYWxsX2F1dGhvcml6ZWRfYWxpYXNlcwAQCEkBUmVtb3ZlIGFsbCBwcmV2aW91c2x5IGF1dGhvcml6ZWQgYGFsaWFzZXJgcyB0aGF0IGNhbiBhbGlhcyBpbnRvIHRoZSBsb2NhbCBgb3JpZ2luYERtYWtpbmcgdGhpcyBjYWxsLgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy7hBwgMeGNtPFZlcnNpb25lZEFzc2V0cwABDAhWMwQAXQYBPHYzOjpNdWx0aUFzc2V0cwADAAhWNAQAxQYBKHY0OjpBc3NldHMABAAIVjUEAA0HASh2NTo6QXNzZXRzAAUAAOUHCAx4Y20wVmVyc2lvbmVkWGNtBCxSdW50aW1lQ2FsbAABDAhWMwQA6QcBUHYzOjpYY208UnVudGltZUNhbGw+AAMACFY0BAD5BwFQdjQ6OlhjbTxSdW50aW1lQ2FsbD4ABAAIVjUEAAUIAVB2NTo6WGNtPFJ1bnRpbWVDYWxsPgAFAADpBwwMeGNtCHYzDFhjbQQQQ2FsbAAABADtBwFYVmVjPEluc3RydWN0aW9uPENhbGw+PgAA7QcAAALxBwDxBwwMeGNtCHYzLEluc3RydWN0aW9uBBBDYWxsAAHANFdpdGhkcmF3QXNzZXQEAF0GASxNdWx0aUFzc2V0cwAAAFRSZXNlcnZlQXNzZXREZXBvc2l0ZWQEAF0GASxNdWx0aUFzc2V0cwABAFhSZWNlaXZlVGVsZXBvcnRlZEFzc2V0BABdBgEsTXVsdGlBc3NldHMAAgA0UXVlcnlSZXNwb25zZRABIHF1ZXJ5X2lkLAEcUXVlcnlJZAABIHJlc3BvbnNlcQYBIFJlc3BvbnNlAAEobWF4X3dlaWdodCgBGFdlaWdodAABHHF1ZXJpZXKZBgFUT3B0aW9uPE11bHRpTG9jYXRpb24+AAMANFRyYW5zZmVyQXNzZXQIARhhc3NldHNdBgEsTXVsdGlBc3NldHMAASxiZW5lZmljaWFyeQUFATRNdWx0aUxvY2F0aW9uAAQAUFRyYW5zZmVyUmVzZXJ2ZUFzc2V0DAEYYXNzZXRzXQYBLE11bHRpQXNzZXRzAAEQZGVzdAUFATRNdWx0aUxvY2F0aW9uAAEMeGNtUQYBHFhjbTwoKT4ABQAgVHJhbnNhY3QMASxvcmlnaW5fa2luZJ0GAShPcmlnaW5LaW5kAAFYcmVxdWlyZV93ZWlnaHRfYXRfbW9zdCgBGFdlaWdodAABEGNhbGz1BwFMRG91YmxlRW5jb2RlZDxDYWxsPgAGAGRIcm1wTmV3Q2hhbm5lbE9wZW5SZXF1ZXN0DAEYc2VuZGVyyQEBDHUzMgABQG1heF9tZXNzYWdlX3NpemXJAQEMdTMyAAEwbWF4X2NhcGFjaXR5yQEBDHUzMgAHAExIcm1wQ2hhbm5lbEFjY2VwdGVkBAEkcmVjaXBpZW50yQEBDHUzMgAIAEhIcm1wQ2hhbm5lbENsb3NpbmcMASRpbml0aWF0b3LJAQEMdTMyAAEYc2VuZGVyyQEBDHUzMgABJHJlY2lwaWVudMkBAQx1MzIACQAsQ2xlYXJPcmlnaW4ACgA0RGVzY2VuZE9yaWdpbgQACQUBVEludGVyaW9yTXVsdGlMb2NhdGlvbgALACxSZXBvcnRFcnJvcgQApQYBRFF1ZXJ5UmVzcG9uc2VJbmZvAAwAMERlcG9zaXRBc3NldAgBGGFzc2V0c6kGAUBNdWx0aUFzc2V0RmlsdGVyAAEsYmVuZWZpY2lhcnkFBQE0TXVsdGlMb2NhdGlvbgANAExEZXBvc2l0UmVzZXJ2ZUFzc2V0DAEYYXNzZXRzqQYBQE11bHRpQXNzZXRGaWx0ZXIAARBkZXN0BQUBNE11bHRpTG9jYXRpb24AAQx4Y21RBgEcWGNtPCgpPgAOADRFeGNoYW5nZUFzc2V0DAEQZ2l2ZakGAUBNdWx0aUFzc2V0RmlsdGVyAAEQd2FudF0GASxNdWx0aUFzc2V0cwABHG1heGltYWwgARBib29sAA8AXEluaXRpYXRlUmVzZXJ2ZVdpdGhkcmF3DAEYYXNzZXRzqQYBQE11bHRpQXNzZXRGaWx0ZXIAARxyZXNlcnZlBQUBNE11bHRpTG9jYXRpb24AAQx4Y21RBgEcWGNtPCgpPgAQAEBJbml0aWF0ZVRlbGVwb3J0DAEYYXNzZXRzqQYBQE11bHRpQXNzZXRGaWx0ZXIAARBkZXN0BQUBNE11bHRpTG9jYXRpb24AAQx4Y21RBgEcWGNtPCgpPgARADRSZXBvcnRIb2xkaW5nCAE0cmVzcG9uc2VfaW5mb6UGAURRdWVyeVJlc3BvbnNlSW5mbwABGGFzc2V0c6kGAUBNdWx0aUFzc2V0RmlsdGVyABIAMEJ1eUV4ZWN1dGlvbggBEGZlZXNlBgEoTXVsdGlBc3NldAABMHdlaWdodF9saW1pdLUGASxXZWlnaHRMaW1pdAATADRSZWZ1bmRTdXJwbHVzABQAPFNldEVycm9ySGFuZGxlcgQA6QcBJFhjbTxDYWxsPgAVACxTZXRBcHBlbmRpeAQA6QcBJFhjbTxDYWxsPgAWAChDbGVhckVycm9yABcAKENsYWltQXNzZXQIARhhc3NldHNdBgEsTXVsdGlBc3NldHMAARh0aWNrZXQFBQE0TXVsdGlMb2NhdGlvbgAYABBUcmFwBAAsAQx1NjQAGQBAU3Vic2NyaWJlVmVyc2lvbggBIHF1ZXJ5X2lkLAEcUXVlcnlJZAABTG1heF9yZXNwb25zZV93ZWlnaHQoARhXZWlnaHQAGgBIVW5zdWJzY3JpYmVWZXJzaW9uABsAJEJ1cm5Bc3NldAQAXQYBLE11bHRpQXNzZXRzABwALEV4cGVjdEFzc2V0BABdBgEsTXVsdGlBc3NldHMAHQAwRXhwZWN0T3JpZ2luBACZBgFUT3B0aW9uPE11bHRpTG9jYXRpb24+AB4ALEV4cGVjdEVycm9yBAB1BgFQT3B0aW9uPCh1MzIsIEVycm9yKT4AHwBQRXhwZWN0VHJhbnNhY3RTdGF0dXMEAJEGAThNYXliZUVycm9yQ29kZQAgACxRdWVyeVBhbGxldAgBLG1vZHVsZV9uYW1lOAEcVmVjPHU4PgABNHJlc3BvbnNlX2luZm+lBgFEUXVlcnlSZXNwb25zZUluZm8AIQAwRXhwZWN0UGFsbGV0FAEUaW5kZXjJAQEMdTMyAAEQbmFtZTgBHFZlYzx1OD4AASxtb2R1bGVfbmFtZTgBHFZlYzx1OD4AASxjcmF0ZV9tYWpvcskBAQx1MzIAATxtaW5fY3JhdGVfbWlub3LJAQEMdTMyACIAUFJlcG9ydFRyYW5zYWN0U3RhdHVzBAClBgFEUXVlcnlSZXNwb25zZUluZm8AIwBMQ2xlYXJUcmFuc2FjdFN0YXR1cwAkADxVbml2ZXJzYWxPcmlnaW4EAA0FASBKdW5jdGlvbgAlADRFeHBvcnRNZXNzYWdlDAEcbmV0d29yaxUFASROZXR3b3JrSWQAASxkZXN0aW5hdGlvbgkFAVRJbnRlcmlvck11bHRpTG9jYXRpb24AAQx4Y21RBgEcWGNtPCgpPgAmACRMb2NrQXNzZXQIARRhc3NldGUGAShNdWx0aUFzc2V0AAEgdW5sb2NrZXIFBQE0TXVsdGlMb2NhdGlvbgAnACxVbmxvY2tBc3NldAgBFGFzc2V0ZQYBKE11bHRpQXNzZXQAARh0YXJnZXQFBQE0TXVsdGlMb2NhdGlvbgAoADhOb3RlVW5sb2NrYWJsZQgBFGFzc2V0ZQYBKE11bHRpQXNzZXQAARRvd25lcgUFATRNdWx0aUxvY2F0aW9uACkANFJlcXVlc3RVbmxvY2sIARRhc3NldGUGAShNdWx0aUFzc2V0AAEYbG9ja2VyBQUBNE11bHRpTG9jYXRpb24AKgAsU2V0RmVlc01vZGUEATBqaXRfd2l0aGRyYXcgARBib29sACsAIFNldFRvcGljBAAEASBbdTg7IDMyXQAsAChDbGVhclRvcGljAC0ALEFsaWFzT3JpZ2luBAAFBQE0TXVsdGlMb2NhdGlvbgAuADxVbnBhaWRFeGVjdXRpb24IATB3ZWlnaHRfbGltaXS1BgEsV2VpZ2h0TGltaXQAATBjaGVja19vcmlnaW6ZBgFUT3B0aW9uPE11bHRpTG9jYXRpb24+AC8AAPUHDAx4Y204ZG91YmxlX2VuY29kZWQ0RG91YmxlRW5jb2RlZAQEVAAABAEcZW5jb2RlZDgBHFZlYzx1OD4AAPkHDCxzdGFnaW5nX3hjbQh2NAxYY20EEENhbGwAAAQA/QcBWFZlYzxJbnN0cnVjdGlvbjxDYWxsPj4AAP0HAAACAQgAAQgMLHN0YWdpbmdfeGNtCHY0LEluc3RydWN0aW9uBBBDYWxsAAHANFdpdGhkcmF3QXNzZXQEAMUGARhBc3NldHMAAABUUmVzZXJ2ZUFzc2V0RGVwb3NpdGVkBADFBgEYQXNzZXRzAAEAWFJlY2VpdmVUZWxlcG9ydGVkQXNzZXQEAMUGARhBc3NldHMAAgA0UXVlcnlSZXNwb25zZRABIHF1ZXJ5X2lkLAEcUXVlcnlJZAABIHJlc3BvbnNl2QYBIFJlc3BvbnNlAAEobWF4X3dlaWdodCgBGFdlaWdodAABHHF1ZXJpZXLtBgFAT3B0aW9uPExvY2F0aW9uPgADADRUcmFuc2ZlckFzc2V0CAEYYXNzZXRzxQYBGEFzc2V0cwABLGJlbmVmaWNpYXJ5HQUBIExvY2F0aW9uAAQAUFRyYW5zZmVyUmVzZXJ2ZUFzc2V0DAEYYXNzZXRzxQYBGEFzc2V0cwABEGRlc3QdBQEgTG9jYXRpb24AAQx4Y225BgEcWGNtPCgpPgAFACBUcmFuc2FjdAwBLG9yaWdpbl9raW5knQYBKE9yaWdpbktpbmQAAVhyZXF1aXJlX3dlaWdodF9hdF9tb3N0KAEYV2VpZ2h0AAEQY2FsbPUHAUxEb3VibGVFbmNvZGVkPENhbGw+AAYAZEhybXBOZXdDaGFubmVsT3BlblJlcXVlc3QMARhzZW5kZXLJAQEMdTMyAAFAbWF4X21lc3NhZ2Vfc2l6ZckBAQx1MzIAATBtYXhfY2FwYWNpdHnJAQEMdTMyAAcATEhybXBDaGFubmVsQWNjZXB0ZWQEASRyZWNpcGllbnTJAQEMdTMyAAgASEhybXBDaGFubmVsQ2xvc2luZwwBJGluaXRpYXRvcskBAQx1MzIAARhzZW5kZXLJAQEMdTMyAAEkcmVjaXBpZW50yQEBDHUzMgAJACxDbGVhck9yaWdpbgAKADREZXNjZW5kT3JpZ2luBAAhBQFASW50ZXJpb3JMb2NhdGlvbgALACxSZXBvcnRFcnJvcgQA8QYBRFF1ZXJ5UmVzcG9uc2VJbmZvAAwAMERlcG9zaXRBc3NldAgBGGFzc2V0c/UGASxBc3NldEZpbHRlcgABLGJlbmVmaWNpYXJ5HQUBIExvY2F0aW9uAA0ATERlcG9zaXRSZXNlcnZlQXNzZXQMARhhc3NldHP1BgEsQXNzZXRGaWx0ZXIAARBkZXN0HQUBIExvY2F0aW9uAAEMeGNtuQYBHFhjbTwoKT4ADgA0RXhjaGFuZ2VBc3NldAwBEGdpdmX1BgEsQXNzZXRGaWx0ZXIAARB3YW50xQYBGEFzc2V0cwABHG1heGltYWwgARBib29sAA8AXEluaXRpYXRlUmVzZXJ2ZVdpdGhkcmF3DAEYYXNzZXRz9QYBLEFzc2V0RmlsdGVyAAEccmVzZXJ2ZR0FASBMb2NhdGlvbgABDHhjbbkGARxYY208KCk+ABAAQEluaXRpYXRlVGVsZXBvcnQMARhhc3NldHP1BgEsQXNzZXRGaWx0ZXIAARBkZXN0HQUBIExvY2F0aW9uAAEMeGNtuQYBHFhjbTwoKT4AEQA0UmVwb3J0SG9sZGluZwgBNHJlc3BvbnNlX2luZm/xBgFEUXVlcnlSZXNwb25zZUluZm8AARhhc3NldHP1BgEsQXNzZXRGaWx0ZXIAEgAwQnV5RXhlY3V0aW9uCAEQZmVlc80GARRBc3NldAABMHdlaWdodF9saW1pdLUGASxXZWlnaHRMaW1pdAATADRSZWZ1bmRTdXJwbHVzABQAPFNldEVycm9ySGFuZGxlcgQA+QcBJFhjbTxDYWxsPgAVACxTZXRBcHBlbmRpeAQA+QcBJFhjbTxDYWxsPgAWAChDbGVhckVycm9yABcAKENsYWltQXNzZXQIARhhc3NldHPFBgEYQXNzZXRzAAEYdGlja2V0HQUBIExvY2F0aW9uABgAEFRyYXAEACwBDHU2NAAZAEBTdWJzY3JpYmVWZXJzaW9uCAEgcXVlcnlfaWQsARxRdWVyeUlkAAFMbWF4X3Jlc3BvbnNlX3dlaWdodCgBGFdlaWdodAAaAEhVbnN1YnNjcmliZVZlcnNpb24AGwAkQnVybkFzc2V0BADFBgEYQXNzZXRzABwALEV4cGVjdEFzc2V0BADFBgEYQXNzZXRzAB0AMEV4cGVjdE9yaWdpbgQA7QYBQE9wdGlvbjxMb2NhdGlvbj4AHgAsRXhwZWN0RXJyb3IEAHUGAVBPcHRpb248KHUzMiwgRXJyb3IpPgAfAFBFeHBlY3RUcmFuc2FjdFN0YXR1cwQAkQYBOE1heWJlRXJyb3JDb2RlACAALFF1ZXJ5UGFsbGV0CAEsbW9kdWxlX25hbWU4ARxWZWM8dTg+AAE0cmVzcG9uc2VfaW5mb/EGAURRdWVyeVJlc3BvbnNlSW5mbwAhADBFeHBlY3RQYWxsZXQUARRpbmRleMkBAQx1MzIAARBuYW1lOAEcVmVjPHU4PgABLG1vZHVsZV9uYW1lOAEcVmVjPHU4PgABLGNyYXRlX21ham9yyQEBDHUzMgABPG1pbl9jcmF0ZV9taW5vcskBAQx1MzIAIgBQUmVwb3J0VHJhbnNhY3RTdGF0dXMEAPEGAURRdWVyeVJlc3BvbnNlSW5mbwAjAExDbGVhclRyYW5zYWN0U3RhdHVzACQAPFVuaXZlcnNhbE9yaWdpbgQAKQUBIEp1bmN0aW9uACUANEV4cG9ydE1lc3NhZ2UMARxuZXR3b3JrMQUBJE5ldHdvcmtJZAABLGRlc3RpbmF0aW9uIQUBQEludGVyaW9yTG9jYXRpb24AAQx4Y225BgEcWGNtPCgpPgAmACRMb2NrQXNzZXQIARRhc3NldM0GARRBc3NldAABIHVubG9ja2VyHQUBIExvY2F0aW9uACcALFVubG9ja0Fzc2V0CAEUYXNzZXTNBgEUQXNzZXQAARh0YXJnZXQdBQEgTG9jYXRpb24AKAA4Tm90ZVVubG9ja2FibGUIARRhc3NldM0GARRBc3NldAABFG93bmVyHQUBIExvY2F0aW9uACkANFJlcXVlc3RVbmxvY2sIARRhc3NldM0GARRBc3NldAABGGxvY2tlch0FASBMb2NhdGlvbgAqACxTZXRGZWVzTW9kZQQBMGppdF93aXRoZHJhdyABEGJvb2wAKwAgU2V0VG9waWMEAAQBIFt1ODsgMzJdACwAKENsZWFyVG9waWMALQAsQWxpYXNPcmlnaW4EAB0FASBMb2NhdGlvbgAuADxVbnBhaWRFeGVjdXRpb24IATB3ZWlnaHRfbGltaXS1BgEsV2VpZ2h0TGltaXQAATBjaGVja19vcmlnaW7tBgFAT3B0aW9uPExvY2F0aW9uPgAvAAAFCAwsc3RhZ2luZ194Y20IdjUMWGNtBBBDYWxsAAAEAAkIAVhWZWM8SW5zdHJ1Y3Rpb248Q2FsbD4+AAAJCAAAAg0IAA0IDCxzdGFnaW5nX3hjbQh2NSxJbnN0cnVjdGlvbgQQQ2FsbAAB0DRXaXRoZHJhd0Fzc2V0BAANBwEYQXNzZXRzAAAAVFJlc2VydmVBc3NldERlcG9zaXRlZAQADQcBGEFzc2V0cwABAFhSZWNlaXZlVGVsZXBvcnRlZEFzc2V0BAANBwEYQXNzZXRzAAIANFF1ZXJ5UmVzcG9uc2UQASBxdWVyeV9pZCwBHFF1ZXJ5SWQAASByZXNwb25zZSEHASBSZXNwb25zZQABKG1heF93ZWlnaHQoARhXZWlnaHQAARxxdWVyaWVyQQcBQE9wdGlvbjxMb2NhdGlvbj4AAwA0VHJhbnNmZXJBc3NldAgBGGFzc2V0cw0HARhBc3NldHMAASxiZW5lZmljaWFyebkCASBMb2NhdGlvbgAEAFBUcmFuc2ZlclJlc2VydmVBc3NldAwBGGFzc2V0cw0HARhBc3NldHMAARBkZXN0uQIBIExvY2F0aW9uAAEMeGNtAQcBHFhjbTwoKT4ABQAgVHJhbnNhY3QMASxvcmlnaW5fa2luZJ0GAShPcmlnaW5LaW5kAAFMZmFsbGJhY2tfbWF4X3dlaWdodEUHAThPcHRpb248V2VpZ2h0PgABEGNhbGz1BwFMRG91YmxlRW5jb2RlZDxDYWxsPgAGAGRIcm1wTmV3Q2hhbm5lbE9wZW5SZXF1ZXN0DAEYc2VuZGVyyQEBDHUzMgABQG1heF9tZXNzYWdlX3NpemXJAQEMdTMyAAEwbWF4X2NhcGFjaXR5yQEBDHUzMgAHAExIcm1wQ2hhbm5lbEFjY2VwdGVkBAEkcmVjaXBpZW50yQEBDHUzMgAIAEhIcm1wQ2hhbm5lbENsb3NpbmcMASRpbml0aWF0b3LJAQEMdTMyAAEYc2VuZGVyyQEBDHUzMgABJHJlY2lwaWVudMkBAQx1MzIACQAsQ2xlYXJPcmlnaW4ACgA0RGVzY2VuZE9yaWdpbgQAvQIBQEludGVyaW9yTG9jYXRpb24ACwAsUmVwb3J0RXJyb3IEAEkHAURRdWVyeVJlc3BvbnNlSW5mbwAMADBEZXBvc2l0QXNzZXQIARhhc3NldHNNBwEsQXNzZXRGaWx0ZXIAASxiZW5lZmljaWFyebkCASBMb2NhdGlvbgANAExEZXBvc2l0UmVzZXJ2ZUFzc2V0DAEYYXNzZXRzTQcBLEFzc2V0RmlsdGVyAAEQZGVzdLkCASBMb2NhdGlvbgABDHhjbQEHARxYY208KCk+AA4ANEV4Y2hhbmdlQXNzZXQMARBnaXZlTQcBLEFzc2V0RmlsdGVyAAEQd2FudA0HARhBc3NldHMAARxtYXhpbWFsIAEQYm9vbAAPAFxJbml0aWF0ZVJlc2VydmVXaXRoZHJhdwwBGGFzc2V0c00HASxBc3NldEZpbHRlcgABHHJlc2VydmW5AgEgTG9jYXRpb24AAQx4Y20BBwEcWGNtPCgpPgAQAEBJbml0aWF0ZVRlbGVwb3J0DAEYYXNzZXRzTQcBLEFzc2V0RmlsdGVyAAEQZGVzdLkCASBMb2NhdGlvbgABDHhjbQEHARxYY208KCk+ABEANFJlcG9ydEhvbGRpbmcIATRyZXNwb25zZV9pbmZvSQcBRFF1ZXJ5UmVzcG9uc2VJbmZvAAEYYXNzZXRzTQcBLEFzc2V0RmlsdGVyABIAMEJ1eUV4ZWN1dGlvbggBEGZlZXMVBwEUQXNzZXQAATB3ZWlnaHRfbGltaXS1BgEsV2VpZ2h0TGltaXQAEwA0UmVmdW5kU3VycGx1cwAUADxTZXRFcnJvckhhbmRsZXIEAAUIASRYY208Q2FsbD4AFQAsU2V0QXBwZW5kaXgEAAUIASRYY208Q2FsbD4AFgAoQ2xlYXJFcnJvcgAXAChDbGFpbUFzc2V0CAEYYXNzZXRzDQcBGEFzc2V0cwABGHRpY2tldLkCASBMb2NhdGlvbgAYABBUcmFwBAAsAQx1NjQAGQBAU3Vic2NyaWJlVmVyc2lvbggBIHF1ZXJ5X2lkLAEcUXVlcnlJZAABTG1heF9yZXNwb25zZV93ZWlnaHQoARhXZWlnaHQAGgBIVW5zdWJzY3JpYmVWZXJzaW9uABsAJEJ1cm5Bc3NldAQADQcBGEFzc2V0cwAcACxFeHBlY3RBc3NldAQADQcBGEFzc2V0cwAdADBFeHBlY3RPcmlnaW4EAEEHAUBPcHRpb248TG9jYXRpb24+AB4ALEV4cGVjdEVycm9yBAAlBwFQT3B0aW9uPCh1MzIsIEVycm9yKT4AHwBQRXhwZWN0VHJhbnNhY3RTdGF0dXMEAJEGAThNYXliZUVycm9yQ29kZQAgACxRdWVyeVBhbGxldAgBLG1vZHVsZV9uYW1lOAEcVmVjPHU4PgABNHJlc3BvbnNlX2luZm9JBwFEUXVlcnlSZXNwb25zZUluZm8AIQAwRXhwZWN0UGFsbGV0FAEUaW5kZXjJAQEMdTMyAAEQbmFtZTgBHFZlYzx1OD4AASxtb2R1bGVfbmFtZTgBHFZlYzx1OD4AASxjcmF0ZV9tYWpvcskBAQx1MzIAATxtaW5fY3JhdGVfbWlub3LJAQEMdTMyACIAUFJlcG9ydFRyYW5zYWN0U3RhdHVzBABJBwFEUXVlcnlSZXNwb25zZUluZm8AIwBMQ2xlYXJUcmFuc2FjdFN0YXR1cwAkADxVbml2ZXJzYWxPcmlnaW4EAMUCASBKdW5jdGlvbgAlADRFeHBvcnRNZXNzYWdlDAEcbmV0d29ya80CASROZXR3b3JrSWQAASxkZXN0aW5hdGlvbr0CAUBJbnRlcmlvckxvY2F0aW9uAAEMeGNtAQcBHFhjbTwoKT4AJgAkTG9ja0Fzc2V0CAEUYXNzZXQVBwEUQXNzZXQAASB1bmxvY2tlcrkCASBMb2NhdGlvbgAnACxVbmxvY2tBc3NldAgBFGFzc2V0FQcBFEFzc2V0AAEYdGFyZ2V0uQIBIExvY2F0aW9uACgAOE5vdGVVbmxvY2thYmxlCAEUYXNzZXQVBwEUQXNzZXQAARRvd25lcrkCASBMb2NhdGlvbgApADRSZXF1ZXN0VW5sb2NrCAEUYXNzZXQVBwEUQXNzZXQAARhsb2NrZXK5AgEgTG9jYXRpb24AKgAsU2V0RmVlc01vZGUEATBqaXRfd2l0aGRyYXcgARBib29sACsAIFNldFRvcGljBAAEASBbdTg7IDMyXQAsAChDbGVhclRvcGljAC0ALEFsaWFzT3JpZ2luBAC5AgEgTG9jYXRpb24ALgA8VW5wYWlkRXhlY3V0aW9uCAEwd2VpZ2h0X2xpbWl0tQYBLFdlaWdodExpbWl0AAEwY2hlY2tfb3JpZ2luQQcBQE9wdGlvbjxMb2NhdGlvbj4ALwAcUGF5RmVlcwQBFGFzc2V0FQcBFEFzc2V0ADAAQEluaXRpYXRlVHJhbnNmZXIUASxkZXN0aW5hdGlvbrkCASBMb2NhdGlvbgABLHJlbW90ZV9mZWVzWQcBbE9wdGlvbjxBc3NldFRyYW5zZmVyRmlsdGVyPgABPHByZXNlcnZlX29yaWdpbiABEGJvb2wAARhhc3NldHNhBwHgQm91bmRlZFZlYzxBc3NldFRyYW5zZmVyRmlsdGVyLCBNYXhBc3NldFRyYW5zZmVyRmlsdGVycz4AAShyZW1vdGVfeGNtAQcBHFhjbTwoKT4AMQBERXhlY3V0ZVdpdGhPcmlnaW4IAURkZXNjZW5kYW50X29yaWdpbmkHAWBPcHRpb248SW50ZXJpb3JMb2NhdGlvbj4AAQx4Y20FCAEkWGNtPENhbGw+ADIAIFNldEhpbnRzBAEUaGludHNtBwGEQm91bmRlZFZlYzxIaW50LCBIaW50TnVtVmFyaWFudHM+ADMAABEIEFBzdGFnaW5nX3hjbV9leGVjdXRvchh0cmFpdHM4YXNzZXRfdHJhbnNmZXIwVHJhbnNmZXJUeXBlAAEQIFRlbGVwb3J0AAAAMExvY2FsUmVzZXJ2ZQABAEhEZXN0aW5hdGlvblJlc2VydmUAAgA0UmVtb3RlUmVzZXJ2ZQQAWQUBRFZlcnNpb25lZExvY2F0aW9uAAMAABUICAx4Y21AVmVyc2lvbmVkQXNzZXRJZAABDAhWMwQAGQUBLHYzOjpBc3NldElkAAMACFY0BABRBQEsdjQ6OkFzc2V0SWQABAAIVjUEAFUFASx2NTo6QXNzZXRJZAAFAAAZCAQYT3B0aW9uBARUATABCBBOb25lAAAAEFNvbWUEADAAAAEAAB0IDFBwYWxsZXRfbWVzc2FnZV9xdWV1ZRhwYWxsZXQQQ2FsbAQEVAABCCRyZWFwX3BhZ2UIAThtZXNzYWdlX29yaWdpbiEIAUhNZXNzYWdlT3JpZ2luT2Y8VD4AAShwYWdlX2luZGV4EAEkUGFnZUluZGV4AAAEPQFSZW1vdmUgYSBwYWdlIHdoaWNoIGhhcyBubyBtb3JlIG1lc3NhZ2VzIHJlbWFpbmluZyB0byBiZSBwcm9jZXNzZWQgb3IgaXMgc3RhbGUuSGV4ZWN1dGVfb3ZlcndlaWdodBABOG1lc3NhZ2Vfb3JpZ2luIQgBSE1lc3NhZ2VPcmlnaW5PZjxUPgABEHBhZ2UQASRQYWdlSW5kZXgAARRpbmRleBABHFQ6OlNpemUAATB3ZWlnaHRfbGltaXQoARhXZWlnaHQAATR4RXhlY3V0ZSBhbiBvdmVyd2VpZ2h0IG1lc3NhZ2UuAE0BVGVtcG9yYXJ5IHByb2Nlc3NpbmcgZXJyb3JzIHdpbGwgYmUgcHJvcGFnYXRlZCB3aGVyZWFzIHBlcm1hbmVudCBlcnJvcnMgYXJlIHRyZWF0ZWRUYXMgc3VjY2VzcyBjb25kaXRpb24uAHQtIGBvcmlnaW5gOiBNdXN0IGJlIGBTaWduZWRgLjUBLSBgbWVzc2FnZV9vcmlnaW5gOiBUaGUgb3JpZ2luIGZyb20gd2hpY2ggdGhlIG1lc3NhZ2UgdG8gYmUgZXhlY3V0ZWQgYXJyaXZlZC49AS0gYHBhZ2VgOiBUaGUgcGFnZSBpbiB0aGUgcXVldWUgaW4gd2hpY2ggdGhlIG1lc3NhZ2UgdG8gYmUgZXhlY3V0ZWQgaXMgc2l0dGluZy4JAS0gYGluZGV4YDogVGhlIGluZGV4IGludG8gdGhlIHF1ZXVlIG9mIHRoZSBtZXNzYWdlIHRvIGJlIGV4ZWN1dGVkLlkBLSBgd2VpZ2h0X2xpbWl0YDogVGhlIG1heGltdW0gYW1vdW50IG9mIHdlaWdodCBhbGxvd2VkIHRvIGJlIGNvbnN1bWVkIGluIHRoZSBleGVjdXRpb25EICBvZiB0aGUgbWVzc2FnZS4A9EJlbmNobWFyayBjb21wbGV4aXR5IGNvbnNpZGVyYXRpb25zOiBPKGluZGV4ICsgd2VpZ2h0X2xpbWl0KS4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMuIQgMbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucyRpbmNsdXNpb25YQWdncmVnYXRlTWVzc2FnZU9yaWdpbgABBAxVbXAEACUIAShVbXBRdWV1ZUlkAAAAACUIDGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMkaW5jbHVzaW9uKFVtcFF1ZXVlSWQAAQQQUGFyYQQAsQIBGFBhcmFJZAAAAAApCAxEcGFsbGV0X2Fzc2V0X3JhdGUYcGFsbGV0EENhbGwEBFQAAQwYY3JlYXRlCAEoYXNzZXRfa2luZAEFAURCb3g8VDo6QXNzZXRLaW5kPgABEHJhdGUtCAEkRml4ZWRVMTI4AAAQDQFJbml0aWFsaXplIGEgY29udmVyc2lvbiByYXRlIHRvIG5hdGl2ZSBiYWxhbmNlIGZvciB0aGUgZ2l2ZW4gYXNzZXQuADQjIyBDb21wbGV4aXR5GC0gTygxKRh1cGRhdGUIAShhc3NldF9raW5kAQUBREJveDxUOjpBc3NldEtpbmQ+AAEQcmF0ZS0IASRGaXhlZFUxMjgAARAFAVVwZGF0ZSB0aGUgY29udmVyc2lvbiByYXRlIHRvIG5hdGl2ZSBiYWxhbmNlIGZvciB0aGUgZ2l2ZW4gYXNzZXQuADQjIyBDb21wbGV4aXR5GC0gTygxKRhyZW1vdmUEAShhc3NldF9raW5kAQUBREJveDxUOjpBc3NldEtpbmQ+AAIQJQFSZW1vdmUgYW4gZXhpc3RpbmcgY29udmVyc2lvbiByYXRlIHRvIG5hdGl2ZSBiYWxhbmNlIGZvciB0aGUgZ2l2ZW4gYXNzZXQuADQjIyBDb21wbGV4aXR5GC0gTygxKQQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy4tCAw0c3BfYXJpdGhtZXRpYyxmaXhlZF9wb2ludCRGaXhlZFUxMjgAAAQAGAEQdTEyOAAAMQgMTHBhbGxldF9yb290X3Rlc3RpbmcYcGFsbGV0EENhbGwEBFQAAQgoZmlsbF9ibG9jawQBFHJhdGlvmAEcUGVyYmlsbAAABAUBQSBkaXNwYXRjaCB0aGF0IHdpbGwgZmlsbCB0aGUgYmxvY2sgd2VpZ2h0IHVwIHRvIHRoZSBnaXZlbiByYXRpby5EdHJpZ2dlcl9kZWZlbnNpdmUAAQAEDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMuNQgMOHBhbGxldF9tZXRhX3R4GHBhbGxldBBDYWxsBARUAAEEIGRpc3BhdGNoBAEcbWV0YV90eDkIAURCb3g8TWV0YVR4Rm9yPFQ+PgAAEIhEaXNwYXRjaCBhIGdpdmVuIG1ldGEgdHJhbnNhY3Rpb24uAJwtIGBfb3JpZ2luYDogQ2FuIGJlIGFueSBraW5kIG9mIG9yaWdpbi4JAS0gYG1ldGFfdHhgOiBNZXRhIFRyYW5zYWN0aW9uIHdpdGggYSB0YXJnZXQgY2FsbCB0byBiZSBkaXNwYXRjaGVkLgQNAUNvbnRhaW5zIGEgdmFyaWFudCBwZXIgZGlzcGF0Y2hhYmxlIGV4dHJpbnNpYyB0aGF0IHRoaXMgcGFsbGV0IGhhcy45CAg4cGFsbGV0X21ldGFfdHgYTWV0YVR4CBBDYWxsAakBJEV4dGVuc2lvbgE9CAAMARBjYWxsqQEBEENhbGwAAURleHRlbnNpb25fdmVyc2lvbggBQEV4dGVuc2lvblZlcnNpb24AASRleHRlbnNpb249CAEkRXh0ZW5zaW9uAAA9CAAABCRBCEUISQhNCFEIVQhZCGEIZQgAQQgMXHBhbGxldF92ZXJpZnlfc2lnbmF0dXJlJGV4dGVuc2lvbjxWZXJpZnlTaWduYXR1cmUEBFQAAQgYU2lnbmVkCAEkc2lnbmF0dXJllQMBMFQ6OlNpZ25hdHVyZQABHGFjY291bnQAATBUOjpBY2NvdW50SWQAAAAgRGlzYWJsZWQAAQAARQgMOHBhbGxldF9tZXRhX3R4JGV4dGVuc2lvbjBNZXRhVHhNYXJrZXIEBFQAAAAASQgQMGZyYW1lX3N5c3RlbShleHRlbnNpb25zVGNoZWNrX25vbl96ZXJvX3NlbmRlckhDaGVja05vblplcm9TZW5kZXIEBFQAAAAATQgQMGZyYW1lX3N5c3RlbShleHRlbnNpb25zSGNoZWNrX3NwZWNfdmVyc2lvbkBDaGVja1NwZWNWZXJzaW9uBARUAAAAAFEIEDBmcmFtZV9zeXN0ZW0oZXh0ZW5zaW9uc0BjaGVja190eF92ZXJzaW9uOENoZWNrVHhWZXJzaW9uBARUAAAAAFUIEDBmcmFtZV9zeXN0ZW0oZXh0ZW5zaW9uczRjaGVja19nZW5lc2lzMENoZWNrR2VuZXNpcwQEVAAAAABZCBAwZnJhbWVfc3lzdGVtKGV4dGVuc2lvbnM8Y2hlY2tfbW9ydGFsaXR5OENoZWNrTW9ydGFsaXR5BARUAAAEAF0IAQxFcmEAAF0IEChzcF9ydW50aW1lHGdlbmVyaWMMZXJhDEVyYQABAQQgSW1tb3J0YWwAAAAcTW9ydGFsMQQACAAAAQAcTW9ydGFsMgQACAAAAgAcTW9ydGFsMwQACAAAAwAcTW9ydGFsNAQACAAABAAcTW9ydGFsNQQACAAABQAcTW9ydGFsNgQACAAABgAcTW9ydGFsNwQACAAABwAcTW9ydGFsOAQACAAACAAcTW9ydGFsOQQACAAACQAgTW9ydGFsMTAEAAgAAAoAIE1vcnRhbDExBAAIAAALACBNb3J0YWwxMgQACAAADAAgTW9ydGFsMTMEAAgAAA0AIE1vcnRhbDE0BAAIAAAOACBNb3J0YWwxNQQACAAADwAgTW9ydGFsMTYEAAgAABAAIE1vcnRhbDE3BAAIAAARACBNb3J0YWwxOAQACAAAEgAgTW9ydGFsMTkEAAgAABMAIE1vcnRhbDIwBAAIAAAUACBNb3J0YWwyMQQACAAAFQAgTW9ydGFsMjIEAAgAABYAIE1vcnRhbDIzBAAIAAAXACBNb3J0YWwyNAQACAAAGAAgTW9ydGFsMjUEAAgAABkAIE1vcnRhbDI2BAAIAAAaACBNb3J0YWwyNwQACAAAGwAgTW9ydGFsMjgEAAgAABwAIE1vcnRhbDI5BAAIAAAdACBNb3J0YWwzMAQACAAAHgAgTW9ydGFsMzEEAAgAAB8AIE1vcnRhbDMyBAAIAAAgACBNb3J0YWwzMwQACAAAIQAgTW9ydGFsMzQEAAgAACIAIE1vcnRhbDM1BAAIAAAjACBNb3J0YWwzNgQACAAAJAAgTW9ydGFsMzcEAAgAACUAIE1vcnRhbDM4BAAIAAAmACBNb3J0YWwzOQQACAAAJwAgTW9ydGFsNDAEAAgAACgAIE1vcnRhbDQxBAAIAAApACBNb3J0YWw0MgQACAAAKgAgTW9ydGFsNDMEAAgAACsAIE1vcnRhbDQ0BAAIAAAsACBNb3J0YWw0NQQACAAALQAgTW9ydGFsNDYEAAgAAC4AIE1vcnRhbDQ3BAAIAAAvACBNb3J0YWw0OAQACAAAMAAgTW9ydGFsNDkEAAgAADEAIE1vcnRhbDUwBAAIAAAyACBNb3J0YWw1MQQACAAAMwAgTW9ydGFsNTIEAAgAADQAIE1vcnRhbDUzBAAIAAA1ACBNb3J0YWw1NAQACAAANgAgTW9ydGFsNTUEAAgAADcAIE1vcnRhbDU2BAAIAAA4ACBNb3J0YWw1NwQACAAAOQAgTW9ydGFsNTgEAAgAADoAIE1vcnRhbDU5BAAIAAA7ACBNb3J0YWw2MAQACAAAPAAgTW9ydGFsNjEEAAgAAD0AIE1vcnRhbDYyBAAIAAA+ACBNb3J0YWw2MwQACAAAPwAgTW9ydGFsNjQEAAgAAEAAIE1vcnRhbDY1BAAIAABBACBNb3J0YWw2NgQACAAAQgAgTW9ydGFsNjcEAAgAAEMAIE1vcnRhbDY4BAAIAABEACBNb3J0YWw2OQQACAAARQAgTW9ydGFsNzAEAAgAAEYAIE1vcnRhbDcxBAAIAABHACBNb3J0YWw3MgQACAAASAAgTW9ydGFsNzMEAAgAAEkAIE1vcnRhbDc0BAAIAABKACBNb3J0YWw3NQQACAAASwAgTW9ydGFsNzYEAAgAAEwAIE1vcnRhbDc3BAAIAABNACBNb3J0YWw3OAQACAAATgAgTW9ydGFsNzkEAAgAAE8AIE1vcnRhbDgwBAAIAABQACBNb3J0YWw4MQQACAAAUQAgTW9ydGFsODIEAAgAAFIAIE1vcnRhbDgzBAAIAABTACBNb3J0YWw4NAQACAAAVAAgTW9ydGFsODUEAAgAAFUAIE1vcnRhbDg2BAAIAABWACBNb3J0YWw4NwQACAAAVwAgTW9ydGFsODgEAAgAAFgAIE1vcnRhbDg5BAAIAABZACBNb3J0YWw5MAQACAAAWgAgTW9ydGFsOTEEAAgAAFsAIE1vcnRhbDkyBAAIAABcACBNb3J0YWw5MwQACAAAXQAgTW9ydGFsOTQEAAgAAF4AIE1vcnRhbDk1BAAIAABfACBNb3J0YWw5NgQACAAAYAAgTW9ydGFsOTcEAAgAAGEAIE1vcnRhbDk4BAAIAABiACBNb3J0YWw5OQQACAAAYwAkTW9ydGFsMTAwBAAIAABkACRNb3J0YWwxMDEEAAgAAGUAJE1vcnRhbDEwMgQACAAAZgAkTW9ydGFsMTAzBAAIAABnACRNb3J0YWwxMDQEAAgAAGgAJE1vcnRhbDEwNQQACAAAaQAkTW9ydGFsMTA2BAAIAABqACRNb3J0YWwxMDcEAAgAAGsAJE1vcnRhbDEwOAQACAAAbAAkTW9ydGFsMTA5BAAIAABtACRNb3J0YWwxMTAEAAgAAG4AJE1vcnRhbDExMQQACAAAbwAkTW9ydGFsMTEyBAAIAABwACRNb3J0YWwxMTMEAAgAAHEAJE1vcnRhbDExNAQACAAAcgAkTW9ydGFsMTE1BAAIAABzACRNb3J0YWwxMTYEAAgAAHQAJE1vcnRhbDExNwQACAAAdQAkTW9ydGFsMTE4BAAIAAB2ACRNb3J0YWwxMTkEAAgAAHcAJE1vcnRhbDEyMAQACAAAeAAkTW9ydGFsMTIxBAAIAAB5ACRNb3J0YWwxMjIEAAgAAHoAJE1vcnRhbDEyMwQACAAAewAkTW9ydGFsMTI0BAAIAAB8ACRNb3J0YWwxMjUEAAgAAH0AJE1vcnRhbDEyNgQACAAAfgAkTW9ydGFsMTI3BAAIAAB/ACRNb3J0YWwxMjgEAAgAAIAAJE1vcnRhbDEyOQQACAAAgQAkTW9ydGFsMTMwBAAIAACCACRNb3J0YWwxMzEEAAgAAIMAJE1vcnRhbDEzMgQACAAAhAAkTW9ydGFsMTMzBAAIAACFACRNb3J0YWwxMzQEAAgAAIYAJE1vcnRhbDEzNQQACAAAhwAkTW9ydGFsMTM2BAAIAACIACRNb3J0YWwxMzcEAAgAAIkAJE1vcnRhbDEzOAQACAAAigAkTW9ydGFsMTM5BAAIAACLACRNb3J0YWwxNDAEAAgAAIwAJE1vcnRhbDE0MQQACAAAjQAkTW9ydGFsMTQyBAAIAACOACRNb3J0YWwxNDMEAAgAAI8AJE1vcnRhbDE0NAQACAAAkAAkTW9ydGFsMTQ1BAAIAACRACRNb3J0YWwxNDYEAAgAAJIAJE1vcnRhbDE0NwQACAAAkwAkTW9ydGFsMTQ4BAAIAACUACRNb3J0YWwxNDkEAAgAAJUAJE1vcnRhbDE1MAQACAAAlgAkTW9ydGFsMTUxBAAIAACXACRNb3J0YWwxNTIEAAgAAJgAJE1vcnRhbDE1MwQACAAAmQAkTW9ydGFsMTU0BAAIAACaACRNb3J0YWwxNTUEAAgAAJsAJE1vcnRhbDE1NgQACAAAnAAkTW9ydGFsMTU3BAAIAACdACRNb3J0YWwxNTgEAAgAAJ4AJE1vcnRhbDE1OQQACAAAnwAkTW9ydGFsMTYwBAAIAACgACRNb3J0YWwxNjEEAAgAAKEAJE1vcnRhbDE2MgQACAAAogAkTW9ydGFsMTYzBAAIAACjACRNb3J0YWwxNjQEAAgAAKQAJE1vcnRhbDE2NQQACAAApQAkTW9ydGFsMTY2BAAIAACmACRNb3J0YWwxNjcEAAgAAKcAJE1vcnRhbDE2OAQACAAAqAAkTW9ydGFsMTY5BAAIAACpACRNb3J0YWwxNzAEAAgAAKoAJE1vcnRhbDE3MQQACAAAqwAkTW9ydGFsMTcyBAAIAACsACRNb3J0YWwxNzMEAAgAAK0AJE1vcnRhbDE3NAQACAAArgAkTW9ydGFsMTc1BAAIAACvACRNb3J0YWwxNzYEAAgAALAAJE1vcnRhbDE3NwQACAAAsQAkTW9ydGFsMTc4BAAIAACyACRNb3J0YWwxNzkEAAgAALMAJE1vcnRhbDE4MAQACAAAtAAkTW9ydGFsMTgxBAAIAAC1ACRNb3J0YWwxODIEAAgAALYAJE1vcnRhbDE4MwQACAAAtwAkTW9ydGFsMTg0BAAIAAC4ACRNb3J0YWwxODUEAAgAALkAJE1vcnRhbDE4NgQACAAAugAkTW9ydGFsMTg3BAAIAAC7ACRNb3J0YWwxODgEAAgAALwAJE1vcnRhbDE4OQQACAAAvQAkTW9ydGFsMTkwBAAIAAC+ACRNb3J0YWwxOTEEAAgAAL8AJE1vcnRhbDE5MgQACAAAwAAkTW9ydGFsMTkzBAAIAADBACRNb3J0YWwxOTQEAAgAAMIAJE1vcnRhbDE5NQQACAAAwwAkTW9ydGFsMTk2BAAIAADEACRNb3J0YWwxOTcEAAgAAMUAJE1vcnRhbDE5OAQACAAAxgAkTW9ydGFsMTk5BAAIAADHACRNb3J0YWwyMDAEAAgAAMgAJE1vcnRhbDIwMQQACAAAyQAkTW9ydGFsMjAyBAAIAADKACRNb3J0YWwyMDMEAAgAAMsAJE1vcnRhbDIwNAQACAAAzAAkTW9ydGFsMjA1BAAIAADNACRNb3J0YWwyMDYEAAgAAM4AJE1vcnRhbDIwNwQACAAAzwAkTW9ydGFsMjA4BAAIAADQACRNb3J0YWwyMDkEAAgAANEAJE1vcnRhbDIxMAQACAAA0gAkTW9ydGFsMjExBAAIAADTACRNb3J0YWwyMTIEAAgAANQAJE1vcnRhbDIxMwQACAAA1QAkTW9ydGFsMjE0BAAIAADWACRNb3J0YWwyMTUEAAgAANcAJE1vcnRhbDIxNgQACAAA2AAkTW9ydGFsMjE3BAAIAADZACRNb3J0YWwyMTgEAAgAANoAJE1vcnRhbDIxOQQACAAA2wAkTW9ydGFsMjIwBAAIAADcACRNb3J0YWwyMjEEAAgAAN0AJE1vcnRhbDIyMgQACAAA3gAkTW9ydGFsMjIzBAAIAADfACRNb3J0YWwyMjQEAAgAAOAAJE1vcnRhbDIyNQQACAAA4QAkTW9ydGFsMjI2BAAIAADiACRNb3J0YWwyMjcEAAgAAOMAJE1vcnRhbDIyOAQACAAA5AAkTW9ydGFsMjI5BAAIAADlACRNb3J0YWwyMzAEAAgAAOYAJE1vcnRhbDIzMQQACAAA5wAkTW9ydGFsMjMyBAAIAADoACRNb3J0YWwyMzMEAAgAAOkAJE1vcnRhbDIzNAQACAAA6gAkTW9ydGFsMjM1BAAIAADrACRNb3J0YWwyMzYEAAgAAOwAJE1vcnRhbDIzNwQACAAA7QAkTW9ydGFsMjM4BAAIAADuACRNb3J0YWwyMzkEAAgAAO8AJE1vcnRhbDI0MAQACAAA8AAkTW9ydGFsMjQxBAAIAADxACRNb3J0YWwyNDIEAAgAAPIAJE1vcnRhbDI0MwQACAAA8wAkTW9ydGFsMjQ0BAAIAAD0ACRNb3J0YWwyNDUEAAgAAPUAJE1vcnRhbDI0NgQACAAA9gAkTW9ydGFsMjQ3BAAIAAD3ACRNb3J0YWwyNDgEAAgAAPgAJE1vcnRhbDI0OQQACAAA+QAkTW9ydGFsMjUwBAAIAAD6ACRNb3J0YWwyNTEEAAgAAPsAJE1vcnRhbDI1MgQACAAA/AAkTW9ydGFsMjUzBAAIAAD9ACRNb3J0YWwyNTQEAAgAAP4AJE1vcnRhbDI1NQQACAAA/wAAYQgQMGZyYW1lX3N5c3RlbShleHRlbnNpb25zLGNoZWNrX25vbmNlKENoZWNrTm9uY2UEBFQAAAQAyQEBIFQ6Ok5vbmNlAABlCAh0ZnJhbWVfbWV0YWRhdGFfaGFzaF9leHRlbnNpb25EQ2hlY2tNZXRhZGF0YUhhc2gEBFQAAAQBEG1vZGVpCAEQTW9kZQAAaQgIdGZyYW1lX21ldGFkYXRhX2hhc2hfZXh0ZW5zaW9uEE1vZGUAAQggRGlzYWJsZWQAAAAcRW5hYmxlZAABAABtCAwwcGFsbGV0X2JlZWZ5GHBhbGxldBBDYWxsBARUAAEcUHJlcG9ydF9kb3VibGVfdm90aW5nCAFIZXF1aXZvY2F0aW9uX3Byb29mcQgBjQFCb3g8RG91YmxlVm90aW5nUHJvb2Y8QmxvY2tOdW1iZXJGb3I8VD4sIFQ6OkJlZWZ5SWQsPFQ6OkJlZWZ5SWQKYXMgUnVudGltZUFwcFB1YmxpYz46OlNpZ25hdHVyZSw+LD4AATxrZXlfb3duZXJfcHJvb2bVAQFAVDo6S2V5T3duZXJQcm9vZgAAEAkBUmVwb3J0IHZvdGVyIGVxdWl2b2NhdGlvbi9taXNiZWhhdmlvci4gVGhpcyBtZXRob2Qgd2lsbCB2ZXJpZnkgdGhl9GVxdWl2b2NhdGlvbiBwcm9vZiBhbmQgdmFsaWRhdGUgdGhlIGdpdmVuIGtleSBvd25lcnNoaXAgcHJvb2b4YWdhaW5zdCB0aGUgZXh0cmFjdGVkIG9mZmVuZGVyLiBJZiBib3RoIGFyZSB2YWxpZCwgdGhlIG9mZmVuY2VEd2lsbCBiZSByZXBvcnRlZC50cmVwb3J0X2RvdWJsZV92b3RpbmdfdW5zaWduZWQIAUhlcXVpdm9jYXRpb25fcHJvb2ZxCAGNAUJveDxEb3VibGVWb3RpbmdQcm9vZjxCbG9ja051bWJlckZvcjxUPiwgVDo6QmVlZnlJZCw8VDo6QmVlZnlJZAphcyBSdW50aW1lQXBwUHVibGljPjo6U2lnbmF0dXJlLD4sPgABPGtleV9vd25lcl9wcm9vZtUBAUBUOjpLZXlPd25lclByb29mAAEkCQFSZXBvcnQgdm90ZXIgZXF1aXZvY2F0aW9uL21pc2JlaGF2aW9yLiBUaGlzIG1ldGhvZCB3aWxsIHZlcmlmeSB0aGX0ZXF1aXZvY2F0aW9uIHByb29mIGFuZCB2YWxpZGF0ZSB0aGUgZ2l2ZW4ga2V5IG93bmVyc2hpcCBwcm9vZvhhZ2FpbnN0IHRoZSBleHRyYWN0ZWQgb2ZmZW5kZXIuIElmIGJvdGggYXJlIHZhbGlkLCB0aGUgb2ZmZW5jZUR3aWxsIGJlIHJlcG9ydGVkLgANAVRoaXMgZXh0cmluc2ljIG11c3QgYmUgY2FsbGVkIHVuc2lnbmVkIGFuZCBpdCBpcyBleHBlY3RlZCB0aGF0IG9ubHkVAWJsb2NrIGF1dGhvcnMgd2lsbCBjYWxsIGl0ICh2YWxpZGF0ZWQgaW4gYFZhbGlkYXRlVW5zaWduZWRgKSwgYXMgc3VjaBUBaWYgdGhlIGJsb2NrIGF1dGhvciBpcyBkZWZpbmVkIGl0IHdpbGwgYmUgZGVmaW5lZCBhcyB0aGUgZXF1aXZvY2F0aW9uJHJlcG9ydGVyLjxzZXRfbmV3X2dlbmVzaXMEATxkZWxheV9pbl9ibG9ja3MQAURCbG9ja051bWJlckZvcjxUPgACEF0BUmVzZXQgQkVFRlkgY29uc2Vuc3VzIGJ5IHNldHRpbmcgYSBuZXcgQkVFRlkgZ2VuZXNpcyBhdCBgZGVsYXlfaW5fYmxvY2tzYCBibG9ja3MgaW4gdGhlHGZ1dHVyZS4AtE5vdGU6IGBkZWxheV9pbl9ibG9ja3NgIGhhcyB0byBiZSBhdCBsZWFzdCAxLkhyZXBvcnRfZm9ya192b3RpbmcIAUhlcXVpdm9jYXRpb25fcHJvb2aNCAGtAUJveDxGb3JrVm90aW5nUHJvb2Y8SGVhZGVyRm9yPFQ+LCBUOjpCZWVmeUlkLDxUOjpBbmNlc3RyeUhlbHBlcgphcyBBbmNlc3RyeUhlbHBlcjxIZWFkZXJGb3I8VD4+Pjo6UHJvb2YsPiw+AAE8a2V5X293bmVyX3Byb29m1QEBQFQ6OktleU93bmVyUHJvb2YAAww9AVJlcG9ydCBmb3JrIHZvdGluZyBlcXVpdm9jYXRpb24uIFRoaXMgbWV0aG9kIHdpbGwgdmVyaWZ5IHRoZSBlcXVpdm9jYXRpb24gcHJvb2YpAWFuZCB2YWxpZGF0ZSB0aGUgZ2l2ZW4ga2V5IG93bmVyc2hpcCBwcm9vZiBhZ2FpbnN0IHRoZSBleHRyYWN0ZWQgb2ZmZW5kZXIuwElmIGJvdGggYXJlIHZhbGlkLCB0aGUgb2ZmZW5jZSB3aWxsIGJlIHJlcG9ydGVkLmxyZXBvcnRfZm9ya192b3RpbmdfdW5zaWduZWQIAUhlcXVpdm9jYXRpb25fcHJvb2aNCAGtAUJveDxGb3JrVm90aW5nUHJvb2Y8SGVhZGVyRm9yPFQ+LCBUOjpCZWVmeUlkLDxUOjpBbmNlc3RyeUhlbHBlcgphcyBBbmNlc3RyeUhlbHBlcjxIZWFkZXJGb3I8VD4+Pjo6UHJvb2YsPiw+AAE8a2V5X293bmVyX3Byb29m1QEBQFQ6OktleU93bmVyUHJvb2YABCA9AVJlcG9ydCBmb3JrIHZvdGluZyBlcXVpdm9jYXRpb24uIFRoaXMgbWV0aG9kIHdpbGwgdmVyaWZ5IHRoZSBlcXVpdm9jYXRpb24gcHJvb2YpAWFuZCB2YWxpZGF0ZSB0aGUgZ2l2ZW4ga2V5IG93bmVyc2hpcCBwcm9vZiBhZ2FpbnN0IHRoZSBleHRyYWN0ZWQgb2ZmZW5kZXIuwElmIGJvdGggYXJlIHZhbGlkLCB0aGUgb2ZmZW5jZSB3aWxsIGJlIHJlcG9ydGVkLgANAVRoaXMgZXh0cmluc2ljIG11c3QgYmUgY2FsbGVkIHVuc2lnbmVkIGFuZCBpdCBpcyBleHBlY3RlZCB0aGF0IG9ubHkVAWJsb2NrIGF1dGhvcnMgd2lsbCBjYWxsIGl0ICh2YWxpZGF0ZWQgaW4gYFZhbGlkYXRlVW5zaWduZWRgKSwgYXMgc3VjaBUBaWYgdGhlIGJsb2NrIGF1dGhvciBpcyBkZWZpbmVkIGl0IHdpbGwgYmUgZGVmaW5lZCBhcyB0aGUgZXF1aXZvY2F0aW9uJHJlcG9ydGVyLmhyZXBvcnRfZnV0dXJlX2Jsb2NrX3ZvdGluZwgBSGVxdWl2b2NhdGlvbl9wcm9vZp0IAehCb3g8RnV0dXJlQmxvY2tWb3RpbmdQcm9vZjxCbG9ja051bWJlckZvcjxUPiwgVDo6QmVlZnlJZD4+AAE8a2V5X293bmVyX3Byb29m1QEBQFQ6OktleU93bmVyUHJvb2YABQxdAVJlcG9ydCBmdXR1cmUgYmxvY2sgdm90aW5nIGVxdWl2b2NhdGlvbi4gVGhpcyBtZXRob2Qgd2lsbCB2ZXJpZnkgdGhlIGVxdWl2b2NhdGlvbiBwcm9vZikBYW5kIHZhbGlkYXRlIHRoZSBnaXZlbiBrZXkgb3duZXJzaGlwIHByb29mIGFnYWluc3QgdGhlIGV4dHJhY3RlZCBvZmZlbmRlci7ASWYgYm90aCBhcmUgdmFsaWQsIHRoZSBvZmZlbmNlIHdpbGwgYmUgcmVwb3J0ZWQujHJlcG9ydF9mdXR1cmVfYmxvY2tfdm90aW5nX3Vuc2lnbmVkCAFIZXF1aXZvY2F0aW9uX3Byb29mnQgB6EJveDxGdXR1cmVCbG9ja1ZvdGluZ1Byb29mPEJsb2NrTnVtYmVyRm9yPFQ+LCBUOjpCZWVmeUlkPj4AATxrZXlfb3duZXJfcHJvb2bVAQFAVDo6S2V5T3duZXJQcm9vZgAGIF0BUmVwb3J0IGZ1dHVyZSBibG9jayB2b3RpbmcgZXF1aXZvY2F0aW9uLiBUaGlzIG1ldGhvZCB3aWxsIHZlcmlmeSB0aGUgZXF1aXZvY2F0aW9uIHByb29mKQFhbmQgdmFsaWRhdGUgdGhlIGdpdmVuIGtleSBvd25lcnNoaXAgcHJvb2YgYWdhaW5zdCB0aGUgZXh0cmFjdGVkIG9mZmVuZGVyLsBJZiBib3RoIGFyZSB2YWxpZCwgdGhlIG9mZmVuY2Ugd2lsbCBiZSByZXBvcnRlZC4ADQFUaGlzIGV4dHJpbnNpYyBtdXN0IGJlIGNhbGxlZCB1bnNpZ25lZCBhbmQgaXQgaXMgZXhwZWN0ZWQgdGhhdCBvbmx5FQFibG9jayBhdXRob3JzIHdpbGwgY2FsbCBpdCAodmFsaWRhdGVkIGluIGBWYWxpZGF0ZVVuc2lnbmVkYCksIGFzIHN1Y2gVAWlmIHRoZSBibG9jayBhdXRob3IgaXMgZGVmaW5lZCBpdCB3aWxsIGJlIGRlZmluZWQgYXMgdGhlIGVxdWl2b2NhdGlvbiRyZXBvcnRlci4EDQFDb250YWlucyBhIHZhcmlhbnQgcGVyIGRpc3BhdGNoYWJsZSBleHRyaW5zaWMgdGhhdCB0aGlzIHBhbGxldCBoYXMucQgISHNwX2NvbnNlbnN1c19iZWVmeUREb3VibGVWb3RpbmdQcm9vZgwYTnVtYmVyARAISWQBZQIkU2lnbmF0dXJlAXUIAAgBFGZpcnN0eQgBiFZvdGVNZXNzYWdlPE51bWJlciwgSWQsIFNpZ25hdHVyZT4AARhzZWNvbmR5CAGIVm90ZU1lc3NhZ2U8TnVtYmVyLCBJZCwgU2lnbmF0dXJlPgAAdQgMSHNwX2NvbnNlbnN1c19iZWVmeTBlY2RzYV9jcnlwdG8kU2lnbmF0dXJlAAAEAJkDAUBlY2RzYTo6U2lnbmF0dXJlAAB5CAhIc3BfY29uc2Vuc3VzX2JlZWZ5LFZvdGVNZXNzYWdlDBhOdW1iZXIBEAhJZAFlAiRTaWduYXR1cmUBdQgADAEoY29tbWl0bWVudH0IAUhDb21taXRtZW50PE51bWJlcj4AAQhpZGUCAQhJZAABJHNpZ25hdHVyZXUIASRTaWduYXR1cmUAAH0IDEhzcF9jb25zZW5zdXNfYmVlZnkoY29tbWl0bWVudChDb21taXRtZW50BDBUQmxvY2tOdW1iZXIBEAAMARxwYXlsb2FkgQgBHFBheWxvYWQAATBibG9ja19udW1iZXIQATBUQmxvY2tOdW1iZXIAAUB2YWxpZGF0b3Jfc2V0X2lkMAE4VmFsaWRhdG9yU2V0SWQAAIEIDEhzcF9jb25zZW5zdXNfYmVlZnkccGF5bG9hZBxQYXlsb2FkAAAEAIUIAXhWZWM8KEJlZWZ5UGF5bG9hZElkLCBWZWM8dTg+KT4AAIUIAAACiQgAiQgAAAQIEQM4AI0ICEhzcF9jb25zZW5zdXNfYmVlZnk8Rm9ya1ZvdGluZ1Byb29mDBhIZWFkZXIBxQEISWQBZQI0QW5jZXN0cnlQcm9vZgGRCAAMARB2b3RleQgBuFZvdGVNZXNzYWdlPEhlYWRlcjo6TnVtYmVyLCBJZCwgSWQ6OlNpZ25hdHVyZT4AAThhbmNlc3RyeV9wcm9vZpEIATRBbmNlc3RyeVByb29mAAEYaGVhZGVyxQEBGEhlYWRlcgAAkQgIRHNwX21tcl9wcmltaXRpdmVzNEFuY2VzdHJ5UHJvb2YEEEhhc2gBNAAQAShwcmV2X3BlYWtzuQMBJFZlYzxIYXNoPgABPHByZXZfbGVhZl9jb3VudDABDHU2NAABKGxlYWZfY291bnQwASROb2RlSW5kZXgAARRpdGVtc5UIAUBWZWM8KHU2NCwgSGFzaCk+AACVCAAAApkIAJkIAAAECDA0AJ0ICEhzcF9jb25zZW5zdXNfYmVlZnlYRnV0dXJlQmxvY2tWb3RpbmdQcm9vZggYTnVtYmVyARAISWQBZQIABAEQdm90ZXkIAZhWb3RlTWVzc2FnZTxOdW1iZXIsIElkLCBJZDo6U2lnbmF0dXJlPgAAoQgQXHBvbGthZG90X3J1bnRpbWVfY29tbW9uRGlkZW50aXR5X21pZ3JhdG9yGHBhbGxldBBDYWxsBARUAAEINHJlYXBfaWRlbnRpdHkEAQx3aG8AATBUOjpBY2NvdW50SWQAAAhFAVJlYXAgdGhlIGBJZGVudGl0eUluZm9gIG9mIGB3aG9gIGZyb20gdGhlIElkZW50aXR5IHBhbGxldCBvZiBgVGAsIHVucmVzZXJ2aW5nIGFuefxkZXBvc2l0cyBoZWxkIGFuZCByZW1vdmluZyBzdG9yYWdlIGl0ZW1zIGFzc29jaWF0ZWQgd2l0aCBgd2hvYC4wcG9rZV9kZXBvc2l0BAEMd2hvAAEwVDo6QWNjb3VudElkAAEIUQFVcGRhdGUgdGhlIGRlcG9zaXQgb2YgYHdob2AuIE1lYW50IHRvIGJlIGNhbGxlZCBieSB0aGUgc3lzdGVtIHdpdGggYW4gWENNIGBUcmFuc2FjdGAwSW5zdHJ1Y3Rpb24uBA0BQ29udGFpbnMgYSB2YXJpYW50IHBlciBkaXNwYXRjaGFibGUgZXh0cmluc2ljIHRoYXQgdGhpcyBwYWxsZXQgaGFzLqUIDChzcF9ydW50aW1lGHRyYWl0cyxCbGFrZVR3bzI1NgAAAACpCAxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAQgEUwAABAA4ARhWZWM8VD4AAK0IDGBwYWxsZXRfY29udmljdGlvbl92b3RpbmcUdHlwZXMUVGFsbHkIFFZvdGVzARgUVG90YWwAAAwBEGF5ZXMYARRWb3RlcwABEG5heXMYARRWb3RlcwABHHN1cHBvcnQYARRWb3RlcwAAsQgMQHBhbGxldF93aGl0ZWxpc3QYcGFsbGV0FEV2ZW50BARUAAEMPENhbGxXaGl0ZWxpc3RlZAQBJGNhbGxfaGFzaDQBHFQ6Okhhc2gAAABYV2hpdGVsaXN0ZWRDYWxsUmVtb3ZlZAQBJGNhbGxfaGFzaDQBHFQ6Okhhc2gAAQBkV2hpdGVsaXN0ZWRDYWxsRGlzcGF0Y2hlZAgBJGNhbGxfaGFzaDQBHFQ6Okhhc2gAARhyZXN1bHS1CAFoRGlzcGF0Y2hSZXN1bHRXaXRoUG9zdEluZm8AAgAEfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXS1CAQYUmVzdWx0CARUAbkIBEUBvQgBCAhPawQAuQgAAAAADEVycgQAvQgAAAEAALkIDDRmcmFtZV9zdXBwb3J0IGRpc3BhdGNoQFBvc3REaXNwYXRjaEluZm8AAAgBNGFjdHVhbF93ZWlnaHRFBwE4T3B0aW9uPFdlaWdodD4AASBwYXlzX2ZlZWQBEFBheXMAAL0ICChzcF9ydW50aW1lZERpc3BhdGNoRXJyb3JXaXRoUG9zdEluZm8EEEluZm8BuQgACAEkcG9zdF9pbmZvuQgBEEluZm8AARRlcnJvcmgBNERpc3BhdGNoRXJyb3IAAMEIDDxwYWxsZXRfdHJlYXN1cnkYcGFsbGV0FEV2ZW50CARUAARJAAEwIFNwZW5kaW5nBAFAYnVkZ2V0X3JlbWFpbmluZxgBPEJhbGFuY2VPZjxULCBJPgAABORXZSBoYXZlIGVuZGVkIGEgc3BlbmQgcGVyaW9kIGFuZCB3aWxsIG5vdyBhbGxvY2F0ZSBmdW5kcy4cQXdhcmRlZAwBOHByb3Bvc2FsX2luZGV4EAE0UHJvcG9zYWxJbmRleAABFGF3YXJkGAE8QmFsYW5jZU9mPFQsIEk+AAEcYWNjb3VudAABMFQ6OkFjY291bnRJZAABBHxTb21lIGZ1bmRzIGhhdmUgYmVlbiBhbGxvY2F0ZWQuFEJ1cm50BAEsYnVybnRfZnVuZHMYATxCYWxhbmNlT2Y8VCwgST4AAgSIU29tZSBvZiBvdXIgZnVuZHMgaGF2ZSBiZWVuIGJ1cm50LiBSb2xsb3ZlcgQBQHJvbGxvdmVyX2JhbGFuY2UYATxCYWxhbmNlT2Y8VCwgST4AAwQtAVNwZW5kaW5nIGhhcyBmaW5pc2hlZDsgdGhpcyBpcyB0aGUgYW1vdW50IHRoYXQgcm9sbHMgb3ZlciB1bnRpbCBuZXh0IHNwZW5kLhxEZXBvc2l0BAEUdmFsdWUYATxCYWxhbmNlT2Y8VCwgST4ABAR8U29tZSBmdW5kcyBoYXZlIGJlZW4gZGVwb3NpdGVkLjRTcGVuZEFwcHJvdmVkDAE4cHJvcG9zYWxfaW5kZXgQATRQcm9wb3NhbEluZGV4AAEYYW1vdW50GAE8QmFsYW5jZU9mPFQsIEk+AAEsYmVuZWZpY2lhcnkAATBUOjpBY2NvdW50SWQABQScQSBuZXcgc3BlbmQgcHJvcG9zYWwgaGFzIGJlZW4gYXBwcm92ZWQuPFVwZGF0ZWRJbmFjdGl2ZQgBLHJlYWN0aXZhdGVkGAE8QmFsYW5jZU9mPFQsIEk+AAEsZGVhY3RpdmF0ZWQYATxCYWxhbmNlT2Y8VCwgST4ABgTMVGhlIGluYWN0aXZlIGZ1bmRzIG9mIHRoZSBwYWxsZXQgaGF2ZSBiZWVuIHVwZGF0ZWQuSEFzc2V0U3BlbmRBcHByb3ZlZBgBFGluZGV4EAEoU3BlbmRJbmRleAABKGFzc2V0X2tpbmQBBQEwVDo6QXNzZXRLaW5kAAEYYW1vdW50GAFQQXNzZXRCYWxhbmNlT2Y8VCwgST4AASxiZW5lZmljaWFyeVkFAThUOjpCZW5lZmljaWFyeQABKHZhbGlkX2Zyb20QAVBCbG9ja051bWJlckZvcjxULCBJPgABJGV4cGlyZV9hdBABUEJsb2NrTnVtYmVyRm9yPFQsIEk+AAcEtEEgbmV3IGFzc2V0IHNwZW5kIHByb3Bvc2FsIGhhcyBiZWVuIGFwcHJvdmVkLkBBc3NldFNwZW5kVm9pZGVkBAEUaW5kZXgQAShTcGVuZEluZGV4AAgEdEFuIGFwcHJvdmVkIHNwZW5kIHdhcyB2b2lkZWQuEFBhaWQIARRpbmRleBABKFNwZW5kSW5kZXgAAShwYXltZW50X2lkMAFkPFQ6OlBheW1hc3RlciBhcyBQYXk+OjpJZAAJBExBIHBheW1lbnQgaGFwcGVuZWQuNFBheW1lbnRGYWlsZWQIARRpbmRleBABKFNwZW5kSW5kZXgAAShwYXltZW50X2lkMAFkPFQ6OlBheW1hc3RlciBhcyBQYXk+OjpJZAAKBJBBIHBheW1lbnQgZmFpbGVkIGFuZCBjYW4gYmUgcmV0cmllZC44U3BlbmRQcm9jZXNzZWQEARRpbmRleBABKFNwZW5kSW5kZXgACwhNAUEgc3BlbmQgd2FzIHByb2Nlc3NlZCBhbmQgcmVtb3ZlZCBmcm9tIHRoZSBzdG9yYWdlLiBJdCBtaWdodCBoYXZlIGJlZW4gc3VjY2Vzc2Z1bGx5cHBhaWQgb3IgaXQgbWF5IGhhdmUgZXhwaXJlZC4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXTFCAxgcGFsbGV0X2RlbGVnYXRlZF9zdGFraW5nGHBhbGxldBRFdmVudAQEVAABECREZWxlZ2F0ZWQMARRhZ2VudAABMFQ6OkFjY291bnRJZAABJGRlbGVnYXRvcgABMFQ6OkFjY291bnRJZAABGGFtb3VudBgBMEJhbGFuY2VPZjxUPgAABHxGdW5kcyBkZWxlZ2F0ZWQgYnkgYSBkZWxlZ2F0b3IuIFJlbGVhc2VkDAEUYWdlbnQAATBUOjpBY2NvdW50SWQAASRkZWxlZ2F0b3IAATBUOjpBY2NvdW50SWQAARhhbW91bnQYATBCYWxhbmNlT2Y8VD4AAQR4RnVuZHMgcmVsZWFzZWQgdG8gYSBkZWxlZ2F0b3IuHFNsYXNoZWQMARRhZ2VudAABMFQ6OkFjY291bnRJZAABJGRlbGVnYXRvcgABMFQ6OkFjY291bnRJZAABGGFtb3VudBgBMEJhbGFuY2VPZjxUPgACBHxGdW5kcyBzbGFzaGVkIGZyb20gYSBkZWxlZ2F0b3IuSE1pZ3JhdGVkRGVsZWdhdGlvbgwBFGFnZW50AAEwVDo6QWNjb3VudElkAAEkZGVsZWdhdG9yAAEwVDo6QWNjb3VudElkAAEYYW1vdW50GAEwQmFsYW5jZU9mPFQ+AAMExFVuY2xhaW1lZCBkZWxlZ2F0aW9uIGZ1bmRzIG1pZ3JhdGVkIHRvIGRlbGVnYXRvci4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXTJCBBscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zJGluY2x1c2lvbhhwYWxsZXQURXZlbnQEBFQAARA8Q2FuZGlkYXRlQmFja2VkEADNCAFkQ2FuZGlkYXRlUmVjZWlwdDxUOjpIYXNoPgAA4QUBIEhlYWREYXRhAADRCAEkQ29yZUluZGV4AADVCAEoR3JvdXBJbmRleAAABMBBIGNhbmRpZGF0ZSB3YXMgYmFja2VkLiBgW2NhbmRpZGF0ZSwgaGVhZF9kYXRhXWBEQ2FuZGlkYXRlSW5jbHVkZWQQAM0IAWRDYW5kaWRhdGVSZWNlaXB0PFQ6Okhhc2g+AADhBQEgSGVhZERhdGEAANEIASRDb3JlSW5kZXgAANUIAShHcm91cEluZGV4AAEEyEEgY2FuZGlkYXRlIHdhcyBpbmNsdWRlZC4gYFtjYW5kaWRhdGUsIGhlYWRfZGF0YV1gRENhbmRpZGF0ZVRpbWVkT3V0DADNCAFkQ2FuZGlkYXRlUmVjZWlwdDxUOjpIYXNoPgAA4QUBIEhlYWREYXRhAADRCAEkQ29yZUluZGV4AAIEvEEgY2FuZGlkYXRlIHRpbWVkIG91dC4gYFtjYW5kaWRhdGUsIGhlYWRfZGF0YV1gWFVwd2FyZE1lc3NhZ2VzUmVjZWl2ZWQIARBmcm9tsQIBGFBhcmFJZAABFGNvdW50EAEMdTMyAAME+FNvbWUgdXB3YXJkIG1lc3NhZ2VzIGhhdmUgYmVlbiByZWNlaXZlZCBhbmQgd2lsbCBiZSBwcm9jZXNzZWQuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0zQgMTHBvbGthZG90X3ByaW1pdGl2ZXMgdnN0YWdpbmdIQ2FuZGlkYXRlUmVjZWlwdFYyBARIATQACAEoZGVzY3JpcHRvcrkFAWBDYW5kaWRhdGVEZXNjcmlwdG9yVjI8SD4AAUBjb21taXRtZW50c19oYXNoNAEQSGFzaAAA0QgMTHBvbGthZG90X3ByaW1pdGl2ZXMIdjgkQ29yZUluZGV4AAAEABABDHUzMgAA1QgMTHBvbGthZG90X3ByaW1pdGl2ZXMIdjgoR3JvdXBJbmRleAAABAAQAQx1MzIAANkIEGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMUcGFyYXMYcGFsbGV0FEV2ZW50BARUAAEoSEN1cnJlbnRDb2RlVXBkYXRlZAQAsQIBGFBhcmFJZAAABMxDdXJyZW50IGNvZGUgaGFzIGJlZW4gdXBkYXRlZCBmb3IgYSBQYXJhLiBgcGFyYV9pZGBIQ3VycmVudEhlYWRVcGRhdGVkBACxAgEYUGFyYUlkAAEEzEN1cnJlbnQgaGVhZCBoYXMgYmVlbiB1cGRhdGVkIGZvciBhIFBhcmEuIGBwYXJhX2lkYFBDb2RlVXBncmFkZVNjaGVkdWxlZAQAsQIBGFBhcmFJZAACBNxBIGNvZGUgdXBncmFkZSBoYXMgYmVlbiBzY2hlZHVsZWQgZm9yIGEgUGFyYS4gYHBhcmFfaWRgME5ld0hlYWROb3RlZAQAsQIBGFBhcmFJZAADBLxBIG5ldyBoZWFkIGhhcyBiZWVuIG5vdGVkIGZvciBhIFBhcmEuIGBwYXJhX2lkYDBBY3Rpb25RdWV1ZWQIALECARhQYXJhSWQAABABMFNlc3Npb25JbmRleAAEBPBBIHBhcmEgaGFzIGJlZW4gcXVldWVkIHRvIGV4ZWN1dGUgcGVuZGluZyBhY3Rpb25zLiBgcGFyYV9pZGA8UHZmQ2hlY2tTdGFydGVkCADBBQFIVmFsaWRhdGlvbkNvZGVIYXNoAACxAgEYUGFyYUlkAAUIVQFUaGUgZ2l2ZW4gcGFyYSBlaXRoZXIgaW5pdGlhdGVkIG9yIHN1YnNjcmliZWQgdG8gYSBQVkYgY2hlY2sgZm9yIHRoZSBnaXZlbiB2YWxpZGF0aW9ubGNvZGUuIGBjb2RlX2hhc2hgIGBwYXJhX2lkYEBQdmZDaGVja0FjY2VwdGVkCADBBQFIVmFsaWRhdGlvbkNvZGVIYXNoAACxAgEYUGFyYUlkAAYIEQFUaGUgZ2l2ZW4gdmFsaWRhdGlvbiBjb2RlIHdhcyBhY2NlcHRlZCBieSB0aGUgUFZGIHByZS1jaGVja2luZyB2b3RlLlRgY29kZV9oYXNoYCBgcGFyYV9pZGBAUHZmQ2hlY2tSZWplY3RlZAgAwQUBSFZhbGlkYXRpb25Db2RlSGFzaAAAsQIBGFBhcmFJZAAHCBEBVGhlIGdpdmVuIHZhbGlkYXRpb24gY29kZSB3YXMgcmVqZWN0ZWQgYnkgdGhlIFBWRiBwcmUtY2hlY2tpbmcgdm90ZS5UYGNvZGVfaGFzaGAgYHBhcmFfaWRgWFVwZ3JhZGVDb29sZG93blJlbW92ZWQEARxwYXJhX2lksQIBGFBhcmFJZATEVGhlIHBhcmFjaGFpbiBmb3Igd2hpY2ggdGhlIGNvb2xkb3duIGdvdCByZW1vdmVkLggEhFRoZSB1cGdyYWRlIGNvb2xkb3duIHdhcyByZW1vdmVkLjhDb2RlQXV0aG9yaXplZAwBHHBhcmFfaWSxAgEYUGFyYUlkBBBQYXJhASRjb2RlX2hhc2jBBQFIVmFsaWRhdGlvbkNvZGVIYXNoBFRBdXRob3JpemVkIGNvZGUgaGFzaC4BJGV4cGlyZV9hdBABREJsb2NrTnVtYmVyRm9yPFQ+BORCbG9jayBhdCB3aGljaCBhdXRob3JpemF0aW9uIGV4cGlyZXMgYW5kIHdpbGwgYmUgcmVtb3ZlZC4JBLxBIG5ldyBjb2RlIGhhc2ggaGFzIGJlZW4gYXV0aG9yaXplZCBmb3IgYSBQYXJhLgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldN0IEGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMQaHJtcBhwYWxsZXQURXZlbnQEBFQAARxQT3BlbkNoYW5uZWxSZXF1ZXN0ZWQQARhzZW5kZXKxAgEYUGFyYUlkAAEkcmVjaXBpZW50sQIBGFBhcmFJZAABVHByb3Bvc2VkX21heF9jYXBhY2l0eRABDHUzMgABZHByb3Bvc2VkX21heF9tZXNzYWdlX3NpemUQAQx1MzIAAARwT3BlbiBIUk1QIGNoYW5uZWwgcmVxdWVzdGVkLkxPcGVuQ2hhbm5lbENhbmNlbGVkCAEwYnlfcGFyYWNoYWlusQIBGFBhcmFJZAABKGNoYW5uZWxfaWQhBgE0SHJtcENoYW5uZWxJZAABBCkBQW4gSFJNUCBjaGFubmVsIHJlcXVlc3Qgc2VudCBieSB0aGUgcmVjZWl2ZXIgd2FzIGNhbmNlbGVkIGJ5IGVpdGhlciBwYXJ0eS5MT3BlbkNoYW5uZWxBY2NlcHRlZAgBGHNlbmRlcrECARhQYXJhSWQAASRyZWNpcGllbnSxAgEYUGFyYUlkAAIEbE9wZW4gSFJNUCBjaGFubmVsIGFjY2VwdGVkLjRDaGFubmVsQ2xvc2VkCAEwYnlfcGFyYWNoYWlusQIBGFBhcmFJZAABKGNoYW5uZWxfaWQhBgE0SHJtcENoYW5uZWxJZAADBFBIUk1QIGNoYW5uZWwgY2xvc2VkLlhIcm1wQ2hhbm5lbEZvcmNlT3BlbmVkEAEYc2VuZGVysQIBGFBhcmFJZAABJHJlY2lwaWVudLECARhQYXJhSWQAAVRwcm9wb3NlZF9tYXhfY2FwYWNpdHkQAQx1MzIAAWRwcm9wb3NlZF9tYXhfbWVzc2FnZV9zaXplEAEMdTMyAAQErEFuIEhSTVAgY2hhbm5lbCB3YXMgb3BlbmVkIHZpYSBSb290IG9yaWdpbi5cSHJtcFN5c3RlbUNoYW5uZWxPcGVuZWQQARhzZW5kZXKxAgEYUGFyYUlkAAEkcmVjaXBpZW50sQIBGFBhcmFJZAABVHByb3Bvc2VkX21heF9jYXBhY2l0eRABDHUzMgABZHByb3Bvc2VkX21heF9tZXNzYWdlX3NpemUQAQx1MzIABQS8QW4gSFJNUCBjaGFubmVsIHdhcyBvcGVuZWQgd2l0aCBhIHN5c3RlbSBjaGFpbi5oT3BlbkNoYW5uZWxEZXBvc2l0c1VwZGF0ZWQIARhzZW5kZXKxAgEYUGFyYUlkAAEkcmVjaXBpZW50sQIBGFBhcmFJZAAGBKBBbiBIUk1QIGNoYW5uZWwncyBkZXBvc2l0cyB3ZXJlIHVwZGF0ZWQuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV04QgQbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucyBkaXNwdXRlcxhwYWxsZXQURXZlbnQEBFQAAQxARGlzcHV0ZUluaXRpYXRlZAgA9QUBNENhbmRpZGF0ZUhhc2gAAOUIATxEaXNwdXRlTG9jYXRpb24AAAQJAUEgZGlzcHV0ZSBoYXMgYmVlbiBpbml0aWF0ZWQuIFxbY2FuZGlkYXRlIGhhc2gsIGRpc3B1dGUgbG9jYXRpb25cXUBEaXNwdXRlQ29uY2x1ZGVkCAD1BQE0Q2FuZGlkYXRlSGFzaAAA6QgBNERpc3B1dGVSZXN1bHQAAQjMQSBkaXNwdXRlIGhhcyBjb25jbHVkZWQgZm9yIG9yIGFnYWluc3QgYSBjYW5kaWRhdGUutGBcW3BhcmEgaWQsIGNhbmRpZGF0ZSBoYXNoLCBkaXNwdXRlIHJlc3VsdFxdYBhSZXZlcnQEABABREJsb2NrTnVtYmVyRm9yPFQ+AAIQ/EEgZGlzcHV0ZSBoYXMgY29uY2x1ZGVkIHdpdGggc3VwZXJtYWpvcml0eSBhZ2FpbnN0IGEgY2FuZGlkYXRlLg0BQmxvY2sgYXV0aG9ycyBzaG91bGQgbm8gbG9uZ2VyIGJ1aWxkIG9uIHRvcCBvZiB0aGlzIGhlYWQgYW5kIHNob3VsZAEBaW5zdGVhZCByZXZlcnQgdGhlIGJsb2NrIGF0IHRoZSBnaXZlbiBoZWlnaHQuIFRoaXMgc2hvdWxkIGJlIHRoZfxudW1iZXIgb2YgdGhlIGNoaWxkIG9mIHRoZSBsYXN0IGtub3duIHZhbGlkIGJsb2NrIGluIHRoZSBjaGFpbi4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXTlCAxscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zIGRpc3B1dGVzPERpc3B1dGVMb2NhdGlvbgABCBRMb2NhbAAAABhSZW1vdGUAAQAA6QgMbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucyBkaXNwdXRlczREaXNwdXRlUmVzdWx0AAEIFFZhbGlkAAAAHEludmFsaWQAAQAA7QgQbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucyRvbl9kZW1hbmQYcGFsbGV0FEV2ZW50BARUAAEMTE9uRGVtYW5kT3JkZXJQbGFjZWQMARxwYXJhX2lksQIBGFBhcmFJZAABKHNwb3RfcHJpY2UYATBCYWxhbmNlT2Y8VD4AAShvcmRlcmVkX2J5AAEwVDo6QWNjb3VudElkAAAEDQFBbiBvcmRlciB3YXMgcGxhY2VkIGF0IHNvbWUgc3BvdCBwcmljZSBhbW91bnQgYnkgb3JkZXJlciBvcmRlcmVkX2J5MFNwb3RQcmljZVNldAQBKHNwb3RfcHJpY2UYATBCYWxhbmNlT2Y8VD4AAQS4VGhlIHZhbHVlIG9mIHRoZSBzcG90IHByaWNlIGhhcyBsaWtlbHkgY2hhbmdlZDxBY2NvdW50Q3JlZGl0ZWQIAQx3aG8AATBUOjpBY2NvdW50SWQAARhhbW91bnQYATBCYWxhbmNlT2Y8VD4AAgR0QW4gYWNjb3VudCB3YXMgZ2l2ZW4gY3JlZGl0cy4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXTxCBBccG9sa2Fkb3RfcnVudGltZV9jb21tb248cGFyYXNfcmVnaXN0cmFyGHBhbGxldBRFdmVudAQEVAABEChSZWdpc3RlcmVkCAEccGFyYV9pZLECARhQYXJhSWQAARxtYW5hZ2VyAAEwVDo6QWNjb3VudElkAAAAMERlcmVnaXN0ZXJlZAQBHHBhcmFfaWSxAgEYUGFyYUlkAAEAIFJlc2VydmVkCAEccGFyYV9pZLECARhQYXJhSWQAAQx3aG8AATBUOjpBY2NvdW50SWQAAgAcU3dhcHBlZAgBHHBhcmFfaWSxAgEYUGFyYUlkAAEgb3RoZXJfaWSxAgEYUGFyYUlkAAMABHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV09QgQXHBvbGthZG90X3J1bnRpbWVfY29tbW9uFHNsb3RzGHBhbGxldBRFdmVudAQEVAABCDhOZXdMZWFzZVBlcmlvZAQBMGxlYXNlX3BlcmlvZBABQExlYXNlUGVyaW9kT2Y8VD4AAASQQSBuZXcgYFtsZWFzZV9wZXJpb2RdYCBpcyBiZWdpbm5pbmcuGExlYXNlZBgBHHBhcmFfaWSxAgEYUGFyYUlkAAEYbGVhc2VyAAEwVDo6QWNjb3VudElkAAEwcGVyaW9kX2JlZ2luEAFATGVhc2VQZXJpb2RPZjxUPgABMHBlcmlvZF9jb3VudBABQExlYXNlUGVyaW9kT2Y8VD4AAThleHRyYV9yZXNlcnZlZBgBMEJhbGFuY2VPZjxUPgABMHRvdGFsX2Ftb3VudBgBMEJhbGFuY2VPZjxUPgABDDUBQSBwYXJhIGhhcyB3b24gdGhlIHJpZ2h0IHRvIGEgY29udGludW91cyBzZXQgb2YgbGVhc2UgcGVyaW9kcyBhcyBhIHBhcmFjaGFpbi5FAUZpcnN0IGJhbGFuY2UgaXMgYW55IGV4dHJhIGFtb3VudCByZXNlcnZlZCBvbiB0b3Agb2YgdGhlIHBhcmEncyBleGlzdGluZyBkZXBvc2l0LrBTZWNvbmQgYmFsYW5jZSBpcyB0aGUgdG90YWwgYW1vdW50IHJlc2VydmVkLgR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldPkIEFxwb2xrYWRvdF9ydW50aW1lX2NvbW1vbiBhdWN0aW9ucxhwYWxsZXQURXZlbnQEBFQAARw4QXVjdGlvblN0YXJ0ZWQMATRhdWN0aW9uX2luZGV4EAEwQXVjdGlvbkluZGV4AAEwbGVhc2VfcGVyaW9kEAFATGVhc2VQZXJpb2RPZjxUPgABGGVuZGluZxABREJsb2NrTnVtYmVyRm9yPFQ+AAAISQFBbiBhdWN0aW9uIHN0YXJ0ZWQuIFByb3ZpZGVzIGl0cyBpbmRleCBhbmQgdGhlIGJsb2NrIG51bWJlciB3aGVyZSBpdCB3aWxsIGJlZ2luIHRvFQFjbG9zZSBhbmQgdGhlIGZpcnN0IGxlYXNlIHBlcmlvZCBvZiB0aGUgcXVhZHJ1cGxldCB0aGF0IGlzIGF1Y3Rpb25lZC40QXVjdGlvbkNsb3NlZAQBNGF1Y3Rpb25faW5kZXgQATBBdWN0aW9uSW5kZXgAAQS4QW4gYXVjdGlvbiBlbmRlZC4gQWxsIGZ1bmRzIGJlY29tZSB1bnJlc2VydmVkLiBSZXNlcnZlZAwBGGJpZGRlcgABMFQ6OkFjY291bnRJZAABOGV4dHJhX3Jlc2VydmVkGAEwQmFsYW5jZU9mPFQ+AAEwdG90YWxfYW1vdW50GAEwQmFsYW5jZU9mPFQ+AAIISQFGdW5kcyB3ZXJlIHJlc2VydmVkIGZvciBhIHdpbm5pbmcgYmlkLiBGaXJzdCBiYWxhbmNlIGlzIHRoZSBleHRyYSBhbW91bnQgcmVzZXJ2ZWQuUFNlY29uZCBpcyB0aGUgdG90YWwuKFVucmVzZXJ2ZWQIARhiaWRkZXIAATBUOjpBY2NvdW50SWQAARhhbW91bnQYATBCYWxhbmNlT2Y8VD4AAwQpAUZ1bmRzIHdlcmUgdW5yZXNlcnZlZCBzaW5jZSBiaWRkZXIgaXMgbm8gbG9uZ2VyIGFjdGl2ZS4gYFtiaWRkZXIsIGFtb3VudF1gSFJlc2VydmVDb25maXNjYXRlZAwBHHBhcmFfaWSxAgEYUGFyYUlkAAEYbGVhc2VyAAEwVDo6QWNjb3VudElkAAEYYW1vdW50GAEwQmFsYW5jZU9mPFQ+AAQIVQFTb21lb25lIGF0dGVtcHRlZCB0byBsZWFzZSB0aGUgc2FtZSBzbG90IHR3aWNlIGZvciBhIHBhcmFjaGFpbi4gVGhlIGFtb3VudCBpcyBoZWxkIGluuHJlc2VydmUgYnV0IG5vIHBhcmFjaGFpbiBzbG90IGhhcyBiZWVuIGxlYXNlZC4sQmlkQWNjZXB0ZWQUARhiaWRkZXIAATBUOjpBY2NvdW50SWQAARxwYXJhX2lksQIBGFBhcmFJZAABGGFtb3VudBgBMEJhbGFuY2VPZjxUPgABKGZpcnN0X3Nsb3QQAUBMZWFzZVBlcmlvZE9mPFQ+AAEkbGFzdF9zbG90EAFATGVhc2VQZXJpb2RPZjxUPgAFBMhBIG5ldyBiaWQgaGFzIGJlZW4gYWNjZXB0ZWQgYXMgdGhlIGN1cnJlbnQgd2lubmVyLjRXaW5uaW5nT2Zmc2V0CAE0YXVjdGlvbl9pbmRleBABMEF1Y3Rpb25JbmRleAABMGJsb2NrX251bWJlchABREJsb2NrTnVtYmVyRm9yPFQ+AAYIWQFUaGUgd2lubmluZyBvZmZzZXQgd2FzIGNob3NlbiBmb3IgYW4gYXVjdGlvbi4gVGhpcyB3aWxsIG1hcCBpbnRvIHRoZSBgV2lubmluZ2Agc3RvcmFnZRBtYXAuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0/QgQXHBvbGthZG90X3J1bnRpbWVfY29tbW9uJGNyb3dkbG9hbhhwYWxsZXQURXZlbnQEBFQAASgcQ3JlYXRlZAQBHHBhcmFfaWSxAgEYUGFyYUlkAAAEjENyZWF0ZSBhIG5ldyBjcm93ZGxvYW5pbmcgY2FtcGFpZ24uLENvbnRyaWJ1dGVkDAEMd2hvAAEwVDo6QWNjb3VudElkAAEoZnVuZF9pbmRleLECARhQYXJhSWQAARhhbW91bnQYATBCYWxhbmNlT2Y8VD4AAQRwQ29udHJpYnV0ZWQgdG8gYSBjcm93ZCBzYWxlLiBXaXRoZHJldwwBDHdobwABMFQ6OkFjY291bnRJZAABKGZ1bmRfaW5kZXixAgEYUGFyYUlkAAEYYW1vdW50GAEwQmFsYW5jZU9mPFQ+AAIEnFdpdGhkcmV3IGZ1bGwgYmFsYW5jZSBvZiBhIGNvbnRyaWJ1dG9yLkRQYXJ0aWFsbHlSZWZ1bmRlZAQBHHBhcmFfaWSxAgEYUGFyYUlkAAMILQFUaGUgbG9hbnMgaW4gYSBmdW5kIGhhdmUgYmVlbiBwYXJ0aWFsbHkgZGlzc29sdmVkLCBpLmUuIHRoZXJlIGFyZSBzb21lIGxlZnS0b3ZlciBjaGlsZCBrZXlzIHRoYXQgc3RpbGwgbmVlZCB0byBiZSBraWxsZWQuLEFsbFJlZnVuZGVkBAEccGFyYV9pZLECARhQYXJhSWQABAScQWxsIGxvYW5zIGluIGEgZnVuZCBoYXZlIGJlZW4gcmVmdW5kZWQuJERpc3NvbHZlZAQBHHBhcmFfaWSxAgEYUGFyYUlkAAUESEZ1bmQgaXMgZGlzc29sdmVkLjxIYW5kbGVCaWRSZXN1bHQIARxwYXJhX2lksQIBGFBhcmFJZAABGHJlc3VsdAEBAThEaXNwYXRjaFJlc3VsdAAGBPRUaGUgcmVzdWx0IG9mIHRyeWluZyB0byBzdWJtaXQgYSBuZXcgYmlkIHRvIHRoZSBTbG90cyBwYWxsZXQuGEVkaXRlZAQBHHBhcmFfaWSxAgEYUGFyYUlkAAcExFRoZSBjb25maWd1cmF0aW9uIHRvIGEgY3Jvd2Rsb2FuIGhhcyBiZWVuIGVkaXRlZC4sTWVtb1VwZGF0ZWQMAQx3aG8AATBUOjpBY2NvdW50SWQAARxwYXJhX2lksQIBGFBhcmFJZAABEG1lbW84ARxWZWM8dTg+AAgEYEEgbWVtbyBoYXMgYmVlbiB1cGRhdGVkLjxBZGRlZFRvTmV3UmFpc2UEARxwYXJhX2lksQIBGFBhcmFJZAAJBKBBIHBhcmFjaGFpbiBoYXMgYmVlbiBtb3ZlZCB0byBgTmV3UmFpc2VgBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0AQkQXHBvbGthZG90X3J1bnRpbWVfY29tbW9uOGFzc2lnbmVkX3Nsb3RzGHBhbGxldBRFdmVudAQEVAABEFRQZXJtYW5lbnRTbG90QXNzaWduZWQEALECARhQYXJhSWQAAATMQSBwYXJhY2hhaW4gd2FzIGFzc2lnbmVkIGEgcGVybWFuZW50IHBhcmFjaGFpbiBzbG90VFRlbXBvcmFyeVNsb3RBc3NpZ25lZAQAsQIBGFBhcmFJZAABBMxBIHBhcmFjaGFpbiB3YXMgYXNzaWduZWQgYSB0ZW1wb3JhcnkgcGFyYWNoYWluIHNsb3RgTWF4UGVybWFuZW50U2xvdHNDaGFuZ2VkBAEUc2xvdHMQAQx1MzIAAgTYVGhlIG1heGltdW0gbnVtYmVyIG9mIHBlcm1hbmVudCBzbG90cyBoYXMgYmVlbiBjaGFuZ2VkYE1heFRlbXBvcmFyeVNsb3RzQ2hhbmdlZAQBFHNsb3RzEAEMdTMyAAME2FRoZSBtYXhpbXVtIG51bWJlciBvZiB0ZW1wb3Jhcnkgc2xvdHMgaGFzIGJlZW4gY2hhbmdlZAR8VGhlIGBFdmVudGAgZW51bSBvZiB0aGlzIHBhbGxldAUJEGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMgY29yZXRpbWUYcGFsbGV0FEV2ZW50BARUAAEIUFJldmVudWVJbmZvUmVxdWVzdGVkBAEQd2hlbhABREJsb2NrTnVtYmVyRm9yPFQ+AAAEIQFUaGUgYnJva2VyIGNoYWluIGhhcyBhc2tlZCBmb3IgcmV2ZW51ZSBpbmZvcm1hdGlvbiBmb3IgYSBzcGVjaWZpYyBibG9jay4wQ29yZUFzc2lnbmVkBAEQY29yZdEIASRDb3JlSW5kZXgAAQTsQSBjb3JlIGhhcyByZWNlaXZlZCBhIG5ldyBhc3NpZ25tZW50IGZyb20gdGhlIGJyb2tlciBjaGFpbi4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXQJCQx4cGFsbGV0X3N0YWtpbmdfYXN5bmNfYWhfY2xpZW50GHBhbGxldBRFdmVudAQEVAABEFBWYWxpZGF0b3JTZXRSZWNlaXZlZBABCGlkEAEMdTMyAAFcbmV3X3ZhbGlkYXRvcl9zZXRfY291bnQQAQx1MzIAASxwcnVuZV91cF90b5wBUE9wdGlvbjxTZXNzaW9uSW5kZXg+AAEgbGVmdG92ZXIgARBib29sAAAEmEEgbmV3IHZhbGlkYXRvciBzZXQgaGFzIGJlZW4gcmVjZWl2ZWQuXENvdWxkTm90TWVyZ2VBbmREcm9wcGVkAAEQ9FdlIGNvdWxkIG5vdCBtZXJnZSwgYW5kIHRoZXJlZm9yZSBkcm9wcGVkIGEgYnVmZmVyZWQgbWVzc2FnZS4AVQFOb3RlIHRoYXQgdGhpcyBldmVudCBpcyBtb3JlIHJlc2VtYmxpbmcgYW4gZXJyb3IsIGJ1dCB3ZSB1c2UgYW4gZXZlbnQgYmVjYXVzZSBpbiB0aGlz0HBhbGxldCB3ZSBuZWVkIHRvIG11dGF0ZSBzdG9yYWdlIHVwb24gc29tZSBmYWlsdXJlcy5UU2V0VG9vU21hbGxBbmREcm9wcGVkAAIIzFRoZSB2YWxpZGF0b3Igc2V0IHJlY2VpdmVkIGlzIHdheSB0b28gc21hbGwsIGFzIHBlcpBbYENvbmZpZzo6TWluaW11bVZhbGlkYXRvclNldFNpemVgXS4oVW5leHBlY3RlZAQADQkBOFVuZXhwZWN0ZWRLaW5kAAMIWQFTb21ldGhpbmcgb2NjdXJyZWQgdGhhdCBzaG91bGQgbmV2ZXIgaGFwcGVuIHVuZGVyIG5vcm1hbCBvcGVyYXRpb24uIExvZ2dlZCBhcyBhbiBldmVudHBmb3IgZmFpbC1zYWZlIG9ic2VydmFiaWxpdHkuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0DQkMeHBhbGxldF9zdGFraW5nX2FzeW5jX2FoX2NsaWVudBhwYWxsZXQ4VW5leHBlY3RlZEtpbmQAAQiAUmVjZWl2ZWRWYWxpZGF0b3JTZXRXaGlsZVBhc3NpdmUAAABgVW5leHBlY3RlZE1vZGVUcmFuc2l0aW9uAAEAABEJDERwYWxsZXRfbWlncmF0aW9ucxhwYWxsZXQURXZlbnQEBFQAASA4VXBncmFkZVN0YXJ0ZWQEAShtaWdyYXRpb25zEAEMdTMyENBUaGUgbnVtYmVyIG9mIG1pZ3JhdGlvbnMgdGhhdCB0aGlzIHVwZ3JhZGUgY29udGFpbnMuAEEBVGhpcyBjYW4gYmUgdXNlZCB0byBkZXNpZ24gYSBwcm9ncmVzcyBpbmRpY2F0b3IgaW4gY29tYmluYXRpb24gd2l0aCBjb3VudGluZyB0aGXMYE1pZ3JhdGlvbkNvbXBsZXRlZGAgYW5kIGBNaWdyYXRpb25Ta2lwcGVkYCBldmVudHMuAAxoQSBSdW50aW1lIHVwZ3JhZGUgc3RhcnRlZC4A+El0cyBlbmQgaXMgaW5kaWNhdGVkIGJ5IGBVcGdyYWRlQ29tcGxldGVkYCBvciBgVXBncmFkZUZhaWxlZGAuQFVwZ3JhZGVDb21wbGV0ZWQAAQyYVGhlIGN1cnJlbnQgcnVudGltZSB1cGdyYWRlIGNvbXBsZXRlZC4AHQFUaGlzIGltcGxpZXMgdGhhdCBhbGwgb2YgaXRzIG1pZ3JhdGlvbnMgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSBhcyB3ZWxsLjRVcGdyYWRlRmFpbGVkAAIMXFJ1bnRpbWUgdXBncmFkZSBmYWlsZWQuAOhUaGlzIGlzIHZlcnkgYmFkIGFuZCB3aWxsIHJlcXVpcmUgZ292ZXJuYW5jZSBpbnRlcnZlbnRpb24uQE1pZ3JhdGlvblNraXBwZWQEARRpbmRleBABDHUzMgQpAVRoZSBpbmRleCBvZiB0aGUgc2tpcHBlZCBtaWdyYXRpb24gd2l0aGluIHRoZSBbYENvbmZpZzo6TWlncmF0aW9uc2BdIGxpc3QuAwQJAUEgbWlncmF0aW9uIHdhcyBza2lwcGVkIHNpbmNlIGl0IHdhcyBhbHJlYWR5IGV4ZWN1dGVkIGluIHRoZSBwYXN0LkRNaWdyYXRpb25BZHZhbmNlZAgBFGluZGV4EAEMdTMyBAkBVGhlIGluZGV4IG9mIHRoZSBtaWdyYXRpb24gd2l0aGluIHRoZSBbYENvbmZpZzo6TWlncmF0aW9uc2BdIGxpc3QuARB0b29rEAFEQmxvY2tOdW1iZXJGb3I8VD4E1FRoZSBudW1iZXIgb2YgYmxvY2tzIHRoYXQgdGhpcyBtaWdyYXRpb24gdG9vayBzbyBmYXIuBARcQSBtaWdyYXRpb24gcHJvZ3Jlc3NlZC5ITWlncmF0aW9uQ29tcGxldGVkCAEUaW5kZXgQAQx1MzIECQFUaGUgaW5kZXggb2YgdGhlIG1pZ3JhdGlvbiB3aXRoaW4gdGhlIFtgQ29uZmlnOjpNaWdyYXRpb25zYF0gbGlzdC4BEHRvb2sQAURCbG9ja051bWJlckZvcjxUPgTUVGhlIG51bWJlciBvZiBibG9ja3MgdGhhdCB0aGlzIG1pZ3JhdGlvbiB0b29rIHNvIGZhci4FBFhBIE1pZ3JhdGlvbiBjb21wbGV0ZWQuPE1pZ3JhdGlvbkZhaWxlZAgBFGluZGV4EAEMdTMyBAkBVGhlIGluZGV4IG9mIHRoZSBtaWdyYXRpb24gd2l0aGluIHRoZSBbYENvbmZpZzo6TWlncmF0aW9uc2BdIGxpc3QuARB0b29rEAFEQmxvY2tOdW1iZXJGb3I8VD4E1FRoZSBudW1iZXIgb2YgYmxvY2tzIHRoYXQgdGhpcyBtaWdyYXRpb24gdG9vayBzbyBmYXIuBgxMQSBNaWdyYXRpb24gZmFpbGVkLgBNAVRoaXMgaW1wbGllcyB0aGF0IHRoZSB3aG9sZSB1cGdyYWRlIGZhaWxlZCBhbmQgZ292ZXJuYW5jZSBpbnRlcnZlbnRpb24gaXMgcmVxdWlyZWQuPEhpc3RvcmljQ2xlYXJlZAQBLG5leHRfY3Vyc29y2QcBPE9wdGlvbjxWZWM8dTg+PgToU2hvdWxkIGJlIHBhc3NlZCB0byBgY2xlYXJfaGlzdG9yaWNgIGluIGEgc3VjY2Vzc2l2ZSBjYWxsLgcEyFRoZSBzZXQgb2YgaGlzdG9yaWNhbCBtaWdyYXRpb25zIGhhcyBiZWVuIGNsZWFyZWQuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0FQkMKHBhbGxldF94Y20YcGFsbGV0FEV2ZW50BARUAAF0JEF0dGVtcHRlZAQBHG91dGNvbWUZCQFQeGNtOjpsYXRlc3Q6Ok91dGNvbWUAAASoRXhlY3V0aW9uIG9mIGFuIFhDTSBtZXNzYWdlIHdhcyBhdHRlbXB0ZWQuEFNlbnQQARhvcmlnaW65AgEgTG9jYXRpb24AASxkZXN0aW5hdGlvbrkCASBMb2NhdGlvbgABHG1lc3NhZ2UBBwEcWGNtPCgpPgABKG1lc3NhZ2VfaWQEARxYY21IYXNoAAEEYEFuIFhDTSBtZXNzYWdlIHdhcyBzZW50LihTZW5kRmFpbGVkEAEYb3JpZ2luuQIBIExvY2F0aW9uAAEsZGVzdGluYXRpb265AgEgTG9jYXRpb24AARRlcnJvciEJASRTZW5kRXJyb3IAAShtZXNzYWdlX2lkBAEcWGNtSGFzaAACBHhBbiBYQ00gbWVzc2FnZSBmYWlsZWQgdG8gc2VuZC48UHJvY2Vzc1hjbUVycm9yDAEYb3JpZ2luuQIBIExvY2F0aW9uAAEUZXJyb3ItBwEgWGNtRXJyb3IAAShtZXNzYWdlX2lkBAEcWGNtSGFzaAADBIRBbiBYQ00gbWVzc2FnZSBmYWlsZWQgdG8gcHJvY2Vzcy5IVW5leHBlY3RlZFJlc3BvbnNlCAEYb3JpZ2luuQIBIExvY2F0aW9uAAEgcXVlcnlfaWQwARxRdWVyeUlkAAQMWQFRdWVyeSByZXNwb25zZSByZWNlaXZlZCB3aGljaCBkb2VzIG5vdCBtYXRjaCBhIHJlZ2lzdGVyZWQgcXVlcnkuIFRoaXMgbWF5IGJlIGJlY2F1c2UgYVUBbWF0Y2hpbmcgcXVlcnkgd2FzIG5ldmVyIHJlZ2lzdGVyZWQsIGl0IG1heSBiZSBiZWNhdXNlIGl0IGlzIGEgZHVwbGljYXRlIHJlc3BvbnNlLCBvcnBiZWNhdXNlIHRoZSBxdWVyeSB0aW1lZCBvdXQuNFJlc3BvbnNlUmVhZHkIASBxdWVyeV9pZDABHFF1ZXJ5SWQAASByZXNwb25zZSEHASBSZXNwb25zZQAFCF0BUXVlcnkgcmVzcG9uc2UgaGFzIGJlZW4gcmVjZWl2ZWQgYW5kIGlzIHJlYWR5IGZvciB0YWtpbmcgd2l0aCBgdGFrZV9yZXNwb25zZWAuIFRoZXJlIGlzgG5vIHJlZ2lzdGVyZWQgbm90aWZpY2F0aW9uIGNhbGwuIE5vdGlmaWVkDAEgcXVlcnlfaWQwARxRdWVyeUlkAAEwcGFsbGV0X2luZGV4CAEIdTgAAShjYWxsX2luZGV4CAEIdTgABghZAVF1ZXJ5IHJlc3BvbnNlIGhhcyBiZWVuIHJlY2VpdmVkIGFuZCBxdWVyeSBpcyByZW1vdmVkLiBUaGUgcmVnaXN0ZXJlZCBub3RpZmljYXRpb24gaGFzqGJlZW4gZGlzcGF0Y2hlZCBhbmQgZXhlY3V0ZWQgc3VjY2Vzc2Z1bGx5LkBOb3RpZnlPdmVyd2VpZ2h0FAEgcXVlcnlfaWQwARxRdWVyeUlkAAEwcGFsbGV0X2luZGV4CAEIdTgAAShjYWxsX2luZGV4CAEIdTgAATRhY3R1YWxfd2VpZ2h0KAEYV2VpZ2h0AAFMbWF4X2J1ZGdldGVkX3dlaWdodCgBGFdlaWdodAAHDEkBUXVlcnkgcmVzcG9uc2UgaGFzIGJlZW4gcmVjZWl2ZWQgYW5kIHF1ZXJ5IGlzIHJlbW92ZWQuIFRoZSByZWdpc3RlcmVkIG5vdGlmaWNhdGlvblkBY291bGQgbm90IGJlIGRpc3BhdGNoZWQgYmVjYXVzZSB0aGUgZGlzcGF0Y2ggd2VpZ2h0IGlzIGdyZWF0ZXIgdGhhbiB0aGUgbWF4aW11bSB3ZWlnaHTkb3JpZ2luYWxseSBidWRnZXRlZCBieSB0aGlzIHJ1bnRpbWUgZm9yIHRoZSBxdWVyeSByZXN1bHQuTE5vdGlmeURpc3BhdGNoRXJyb3IMASBxdWVyeV9pZDABHFF1ZXJ5SWQAATBwYWxsZXRfaW5kZXgIAQh1OAABKGNhbGxfaW5kZXgIAQh1OAAICFUBUXVlcnkgcmVzcG9uc2UgaGFzIGJlZW4gcmVjZWl2ZWQgYW5kIHF1ZXJ5IGlzIHJlbW92ZWQuIFRoZXJlIHdhcyBhIGdlbmVyYWwgZXJyb3Igd2l0aIhkaXNwYXRjaGluZyB0aGUgbm90aWZpY2F0aW9uIGNhbGwuSE5vdGlmeURlY29kZUZhaWxlZAwBIHF1ZXJ5X2lkMAEcUXVlcnlJZAABMHBhbGxldF9pbmRleAgBCHU4AAEoY2FsbF9pbmRleAgBCHU4AAkMUQFRdWVyeSByZXNwb25zZSBoYXMgYmVlbiByZWNlaXZlZCBhbmQgcXVlcnkgaXMgcmVtb3ZlZC4gVGhlIGRpc3BhdGNoIHdhcyB1bmFibGUgdG8gYmVZAWRlY29kZWQgaW50byBhIGBDYWxsYDsgdGhpcyBtaWdodCBiZSBkdWUgdG8gZGlzcGF0Y2ggZnVuY3Rpb24gaGF2aW5nIGEgc2lnbmF0dXJlIHdoaWNolGlzIG5vdCBgKG9yaWdpbiwgUXVlcnlJZCwgUmVzcG9uc2UpYC5ASW52YWxpZFJlc3BvbmRlcgwBGG9yaWdpbrkCASBMb2NhdGlvbgABIHF1ZXJ5X2lkMAEcUXVlcnlJZAABRGV4cGVjdGVkX2xvY2F0aW9uQQcBQE9wdGlvbjxMb2NhdGlvbj4ACgxZAUV4cGVjdGVkIHF1ZXJ5IHJlc3BvbnNlIGhhcyBiZWVuIHJlY2VpdmVkIGJ1dCB0aGUgb3JpZ2luIGxvY2F0aW9uIG9mIHRoZSByZXNwb25zZSBkb2VzVQFub3QgbWF0Y2ggdGhhdCBleHBlY3RlZC4gVGhlIHF1ZXJ5IHJlbWFpbnMgcmVnaXN0ZXJlZCBmb3IgYSBsYXRlciwgdmFsaWQsIHJlc3BvbnNlIHRvbGJlIHJlY2VpdmVkIGFuZCBhY3RlZCB1cG9uLlxJbnZhbGlkUmVzcG9uZGVyVmVyc2lvbggBGG9yaWdpbrkCASBMb2NhdGlvbgABIHF1ZXJ5X2lkMAEcUXVlcnlJZAALHFEBRXhwZWN0ZWQgcXVlcnkgcmVzcG9uc2UgaGFzIGJlZW4gcmVjZWl2ZWQgYnV0IHRoZSBleHBlY3RlZCBvcmlnaW4gbG9jYXRpb24gcGxhY2VkIGluTQFzdG9yYWdlIGJ5IHRoaXMgcnVudGltZSBwcmV2aW91c2x5IGNhbm5vdCBiZSBkZWNvZGVkLiBUaGUgcXVlcnkgcmVtYWlucyByZWdpc3RlcmVkLgBBAVRoaXMgaXMgdW5leHBlY3RlZCAoc2luY2UgYSBsb2NhdGlvbiBwbGFjZWQgaW4gc3RvcmFnZSBpbiBhIHByZXZpb3VzbHkgZXhlY3V0aW5nTQFydW50aW1lIHNob3VsZCBiZSByZWFkYWJsZSBwcmlvciB0byBxdWVyeSB0aW1lb3V0KSBhbmQgZGFuZ2Vyb3VzIHNpbmNlIHRoZSBwb3NzaWJseVkBdmFsaWQgcmVzcG9uc2Ugd2lsbCBiZSBkcm9wcGVkLiBNYW51YWwgZ292ZXJuYW5jZSBpbnRlcnZlbnRpb24gaXMgcHJvYmFibHkgZ29pbmcgdG8gYmUcbmVlZGVkLjRSZXNwb25zZVRha2VuBAEgcXVlcnlfaWQwARxRdWVyeUlkAAwEyFJlY2VpdmVkIHF1ZXJ5IHJlc3BvbnNlIGhhcyBiZWVuIHJlYWQgYW5kIHJlbW92ZWQuNEFzc2V0c1RyYXBwZWQMARBoYXNoNAEQSDI1NgABGG9yaWdpbrkCASBMb2NhdGlvbgABGGFzc2V0c+EHATxWZXJzaW9uZWRBc3NldHMADQS4U29tZSBhc3NldHMgaGF2ZSBiZWVuIHBsYWNlZCBpbiBhbiBhc3NldCB0cmFwLlRWZXJzaW9uQ2hhbmdlTm90aWZpZWQQASxkZXN0aW5hdGlvbrkCASBMb2NhdGlvbgABGHJlc3VsdBABKFhjbVZlcnNpb24AARBjb3N0DQcBGEFzc2V0cwABKG1lc3NhZ2VfaWQEARxYY21IYXNoAA4MJQFBbiBYQ00gdmVyc2lvbiBjaGFuZ2Ugbm90aWZpY2F0aW9uIG1lc3NhZ2UgaGFzIGJlZW4gYXR0ZW1wdGVkIHRvIGJlIHNlbnQuAOBUaGUgY29zdCBvZiBzZW5kaW5nIGl0IChib3JuZSBieSB0aGUgY2hhaW4pIGlzIGluY2x1ZGVkLlxTdXBwb3J0ZWRWZXJzaW9uQ2hhbmdlZAgBIGxvY2F0aW9uuQIBIExvY2F0aW9uAAEcdmVyc2lvbhABKFhjbVZlcnNpb24ADwg5AVRoZSBzdXBwb3J0ZWQgdmVyc2lvbiBvZiBhIGxvY2F0aW9uIGhhcyBiZWVuIGNoYW5nZWQuIFRoaXMgbWlnaHQgYmUgdGhyb3VnaCBhbsBhdXRvbWF0aWMgbm90aWZpY2F0aW9uIG9yIGEgbWFudWFsIGludGVydmVudGlvbi5QTm90aWZ5VGFyZ2V0U2VuZEZhaWwMASBsb2NhdGlvbrkCASBMb2NhdGlvbgABIHF1ZXJ5X2lkMAEcUXVlcnlJZAABFGVycm9yLQcBIFhjbUVycm9yABAIWQFBIGdpdmVuIGxvY2F0aW9uIHdoaWNoIGhhZCBhIHZlcnNpb24gY2hhbmdlIHN1YnNjcmlwdGlvbiB3YXMgZHJvcHBlZCBvd2luZyB0byBhbiBlcnJvcnxzZW5kaW5nIHRoZSBub3RpZmljYXRpb24gdG8gaXQuZE5vdGlmeVRhcmdldE1pZ3JhdGlvbkZhaWwIASBsb2NhdGlvblkFAURWZXJzaW9uZWRMb2NhdGlvbgABIHF1ZXJ5X2lkMAEcUXVlcnlJZAARCFkBQSBnaXZlbiBsb2NhdGlvbiB3aGljaCBoYWQgYSB2ZXJzaW9uIGNoYW5nZSBzdWJzY3JpcHRpb24gd2FzIGRyb3BwZWQgb3dpbmcgdG8gYW4gZXJyb3K0bWlncmF0aW5nIHRoZSBsb2NhdGlvbiB0byBvdXIgbmV3IFhDTSBmb3JtYXQuVEludmFsaWRRdWVyaWVyVmVyc2lvbggBGG9yaWdpbrkCASBMb2NhdGlvbgABIHF1ZXJ5X2lkMAEcUXVlcnlJZAASHFUBRXhwZWN0ZWQgcXVlcnkgcmVzcG9uc2UgaGFzIGJlZW4gcmVjZWl2ZWQgYnV0IHRoZSBleHBlY3RlZCBxdWVyaWVyIGxvY2F0aW9uIHBsYWNlZCBpbk0Bc3RvcmFnZSBieSB0aGlzIHJ1bnRpbWUgcHJldmlvdXNseSBjYW5ub3QgYmUgZGVjb2RlZC4gVGhlIHF1ZXJ5IHJlbWFpbnMgcmVnaXN0ZXJlZC4AQQFUaGlzIGlzIHVuZXhwZWN0ZWQgKHNpbmNlIGEgbG9jYXRpb24gcGxhY2VkIGluIHN0b3JhZ2UgaW4gYSBwcmV2aW91c2x5IGV4ZWN1dGluZ00BcnVudGltZSBzaG91bGQgYmUgcmVhZGFibGUgcHJpb3IgdG8gcXVlcnkgdGltZW91dCkgYW5kIGRhbmdlcm91cyBzaW5jZSB0aGUgcG9zc2libHlZAXZhbGlkIHJlc3BvbnNlIHdpbGwgYmUgZHJvcHBlZC4gTWFudWFsIGdvdmVybmFuY2UgaW50ZXJ2ZW50aW9uIGlzIHByb2JhYmx5IGdvaW5nIHRvIGJlHG5lZWRlZC44SW52YWxpZFF1ZXJpZXIQARhvcmlnaW65AgEgTG9jYXRpb24AASBxdWVyeV9pZDABHFF1ZXJ5SWQAAUBleHBlY3RlZF9xdWVyaWVyuQIBIExvY2F0aW9uAAFQbWF5YmVfYWN0dWFsX3F1ZXJpZXJBBwFAT3B0aW9uPExvY2F0aW9uPgATDF0BRXhwZWN0ZWQgcXVlcnkgcmVzcG9uc2UgaGFzIGJlZW4gcmVjZWl2ZWQgYnV0IHRoZSBxdWVyaWVyIGxvY2F0aW9uIG9mIHRoZSByZXNwb25zZSBkb2VzUQFub3QgbWF0Y2ggdGhlIGV4cGVjdGVkLiBUaGUgcXVlcnkgcmVtYWlucyByZWdpc3RlcmVkIGZvciBhIGxhdGVyLCB2YWxpZCwgcmVzcG9uc2UgdG9sYmUgcmVjZWl2ZWQgYW5kIGFjdGVkIHVwb24uUFZlcnNpb25Ob3RpZnlTdGFydGVkDAEsZGVzdGluYXRpb265AgEgTG9jYXRpb24AARBjb3N0DQcBGEFzc2V0cwABKG1lc3NhZ2VfaWQEARxYY21IYXNoABQIWQFBIHJlbW90ZSBoYXMgcmVxdWVzdGVkIFhDTSB2ZXJzaW9uIGNoYW5nZSBub3RpZmljYXRpb24gZnJvbSB1cyBhbmQgd2UgaGF2ZSBob25vcmVkIGl0Lh0BQSB2ZXJzaW9uIGluZm9ybWF0aW9uIG1lc3NhZ2UgaXMgc2VudCB0byB0aGVtIGFuZCBpdHMgY29zdCBpcyBpbmNsdWRlZC5YVmVyc2lvbk5vdGlmeVJlcXVlc3RlZAwBLGRlc3RpbmF0aW9uuQIBIExvY2F0aW9uAAEQY29zdA0HARhBc3NldHMAAShtZXNzYWdlX2lkBAEcWGNtSGFzaAAVBD0BV2UgaGF2ZSByZXF1ZXN0ZWQgdGhhdCBhIHJlbW90ZSBjaGFpbiBzZW5kIHVzIFhDTSB2ZXJzaW9uIGNoYW5nZSBub3RpZmljYXRpb25zLmBWZXJzaW9uTm90aWZ5VW5yZXF1ZXN0ZWQMASxkZXN0aW5hdGlvbrkCASBMb2NhdGlvbgABEGNvc3QNBwEYQXNzZXRzAAEobWVzc2FnZV9pZAQBHFhjbUhhc2gAFgglAVdlIGhhdmUgcmVxdWVzdGVkIHRoYXQgYSByZW1vdGUgY2hhaW4gc3RvcHMgc2VuZGluZyB1cyBYQ00gdmVyc2lvbiBjaGFuZ2U4bm90aWZpY2F0aW9ucy4gRmVlc1BhaWQIARhwYXlpbme5AgEgTG9jYXRpb24AARBmZWVzDQcBGEFzc2V0cwAXBDEBRmVlcyB3ZXJlIHBhaWQgZnJvbSBhIGxvY2F0aW9uIGZvciBhbiBvcGVyYXRpb24gKG9mdGVuIGZvciB1c2luZyBgU2VuZFhjbWApLjRBc3NldHNDbGFpbWVkDAEQaGFzaDQBEEgyNTYAARhvcmlnaW65AgEgTG9jYXRpb24AARhhc3NldHPhBwE8VmVyc2lvbmVkQXNzZXRzABgEwFNvbWUgYXNzZXRzIGhhdmUgYmVlbiBjbGFpbWVkIGZyb20gYW4gYXNzZXQgdHJhcGBWZXJzaW9uTWlncmF0aW9uRmluaXNoZWQEARx2ZXJzaW9uEAEoWGNtVmVyc2lvbgAZBIRBIFhDTSB2ZXJzaW9uIG1pZ3JhdGlvbiBmaW5pc2hlZC48QWxpYXNBdXRob3JpemVkDAEcYWxpYXNlcrkCASBMb2NhdGlvbgABGHRhcmdldLkCASBMb2NhdGlvbgABGGV4cGlyeRkIASxPcHRpb248dTY0PgAaCF0BQW4gYGFsaWFzZXJgIGxvY2F0aW9uIHdhcyBhdXRob3JpemVkIGJ5IGB0YXJnZXRgIHRvIGFsaWFzIGl0LCBhdXRob3JpemF0aW9uIHZhbGlkIHVudGlsWGBleHBpcnlgIGJsb2NrIG51bWJlci5kQWxpYXNBdXRob3JpemF0aW9uUmVtb3ZlZAgBHGFsaWFzZXK5AgEgTG9jYXRpb24AARh0YXJnZXS5AgEgTG9jYXRpb24AGwTMYHRhcmdldGAgcmVtb3ZlZCBhbGlhcyBhdXRob3JpemF0aW9uIGZvciBgYWxpYXNlcmAucEFsaWFzZXNBdXRob3JpemF0aW9uc1JlbW92ZWQEARh0YXJnZXS5AgEgTG9jYXRpb24AHASoYHRhcmdldGAgcmVtb3ZlZCBhbGwgYWxpYXMgYXV0aG9yaXphdGlvbnMuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0GQkQLHN0YWdpbmdfeGNtCHY1GHRyYWl0cxxPdXRjb21lAAEMIENvbXBsZXRlBAEQdXNlZCgBGFdlaWdodAAAAChJbmNvbXBsZXRlCAEQdXNlZCgBGFdlaWdodAABFGVycm9yHQkBQEluc3RydWN0aW9uRXJyb3IAAQAURXJyb3IEAB0JAUBJbnN0cnVjdGlvbkVycm9yAAIAAB0JECxzdGFnaW5nX3hjbQh2NRh0cmFpdHNASW5zdHJ1Y3Rpb25FcnJvcgAACAEUaW5kZXgIAUBJbnN0cnVjdGlvbkluZGV4AAEUZXJyb3ItBwEURXJyb3IAACEJEAx4Y20IdjMYdHJhaXRzJFNlbmRFcnJvcgABHDROb3RBcHBsaWNhYmxlAAAAJFRyYW5zcG9ydAABAChVbnJvdXRhYmxlAAIAWERlc3RpbmF0aW9uVW5zdXBwb3J0ZWQAAwBURXhjZWVkc01heE1lc3NhZ2VTaXplAAQAPE1pc3NpbmdBcmd1bWVudAAFABBGZWVzAAYAACUJDFBwYWxsZXRfbWVzc2FnZV9xdWV1ZRhwYWxsZXQURXZlbnQEBFQAARBAUHJvY2Vzc2luZ0ZhaWxlZAwBCGlkNAEQSDI1NgSUVGhlIGBibGFrZTJfMjU2YCBoYXNoIG9mIHRoZSBtZXNzYWdlLgEYb3JpZ2luIQgBSE1lc3NhZ2VPcmlnaW5PZjxUPgRkVGhlIHF1ZXVlIG9mIHRoZSBtZXNzYWdlLgEUZXJyb3IpCQFMUHJvY2Vzc01lc3NhZ2VFcnJvchBgVGhlIGVycm9yIHRoYXQgb2NjdXJyZWQuAEkBVGhpcyBlcnJvciBpcyBwcmV0dHkgb3BhcXVlLiBNb3JlIGZpbmUtZ3JhaW5lZCBlcnJvcnMgbmVlZCB0byBiZSBlbWl0dGVkIGFzIGV2ZW50c2hieSB0aGUgYE1lc3NhZ2VQcm9jZXNzb3JgLgAEVQFNZXNzYWdlIGRpc2NhcmRlZCBkdWUgdG8gYW4gZXJyb3IgaW4gdGhlIGBNZXNzYWdlUHJvY2Vzc29yYCAodXN1YWxseSBhIGZvcm1hdCBlcnJvcikuJFByb2Nlc3NlZBABCGlkNAEQSDI1NgSUVGhlIGBibGFrZTJfMjU2YCBoYXNoIG9mIHRoZSBtZXNzYWdlLgEYb3JpZ2luIQgBSE1lc3NhZ2VPcmlnaW5PZjxUPgRkVGhlIHF1ZXVlIG9mIHRoZSBtZXNzYWdlLgEsd2VpZ2h0X3VzZWQoARhXZWlnaHQEwEhvdyBtdWNoIHdlaWdodCB3YXMgdXNlZCB0byBwcm9jZXNzIHRoZSBtZXNzYWdlLgEcc3VjY2VzcyABEGJvb2wYiFdoZXRoZXIgdGhlIG1lc3NhZ2Ugd2FzIHByb2Nlc3NlZC4ASQFOb3RlIHRoYXQgdGhpcyBkb2VzIG5vdCBtZWFuIHRoYXQgdGhlIHVuZGVybHlpbmcgYE1lc3NhZ2VQcm9jZXNzb3JgIHdhcyBpbnRlcm5hbGx5NQFzdWNjZXNzZnVsLiBJdCAqc29sZWx5KiBtZWFucyB0aGF0IHRoZSBNUSBwYWxsZXQgd2lsbCB0cmVhdCB0aGlzIGFzIGEgc3VjY2Vzc00BY29uZGl0aW9uIGFuZCBkaXNjYXJkIHRoZSBtZXNzYWdlLiBBbnkgaW50ZXJuYWwgZXJyb3IgbmVlZHMgdG8gYmUgZW1pdHRlZCBhcyBldmVudHNoYnkgdGhlIGBNZXNzYWdlUHJvY2Vzc29yYC4BBFRNZXNzYWdlIGlzIHByb2Nlc3NlZC5IT3ZlcndlaWdodEVucXVldWVkEAEIaWQEASBbdTg7IDMyXQSUVGhlIGBibGFrZTJfMjU2YCBoYXNoIG9mIHRoZSBtZXNzYWdlLgEYb3JpZ2luIQgBSE1lc3NhZ2VPcmlnaW5PZjxUPgRkVGhlIHF1ZXVlIG9mIHRoZSBtZXNzYWdlLgEocGFnZV9pbmRleBABJFBhZ2VJbmRleARgVGhlIHBhZ2Ugb2YgdGhlIG1lc3NhZ2UuATRtZXNzYWdlX2luZGV4EAEcVDo6U2l6ZQSkVGhlIGluZGV4IG9mIHRoZSBtZXNzYWdlIHdpdGhpbiB0aGUgcGFnZS4CBIxNZXNzYWdlIHBsYWNlZCBpbiBvdmVyd2VpZ2h0IHF1ZXVlLihQYWdlUmVhcGVkCAEYb3JpZ2luIQgBSE1lc3NhZ2VPcmlnaW5PZjxUPgRYVGhlIHF1ZXVlIG9mIHRoZSBwYWdlLgEUaW5kZXgQASRQYWdlSW5kZXgEWFRoZSBpbmRleCBvZiB0aGUgcGFnZS4DBFRUaGlzIHBhZ2Ugd2FzIHJlYXBlZC4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXQpCRA0ZnJhbWVfc3VwcG9ydBh0cmFpdHMgbWVzc2FnZXNMUHJvY2Vzc01lc3NhZ2VFcnJvcgABGCRCYWRGb3JtYXQAAAAcQ29ycnVwdAABACxVbnN1cHBvcnRlZAACAChPdmVyd2VpZ2h0BAAoARhXZWlnaHQAAwAUWWllbGQABABEU3RhY2tMaW1pdFJlYWNoZWQABQAALQkMRHBhbGxldF9hc3NldF9yYXRlGHBhbGxldBRFdmVudAQEVAABDEBBc3NldFJhdGVDcmVhdGVkCAEoYXNzZXRfa2luZAEFATBUOjpBc3NldEtpbmQAARByYXRlLQgBJEZpeGVkVTEyOAAAAEBBc3NldFJhdGVSZW1vdmVkBAEoYXNzZXRfa2luZAEFATBUOjpBc3NldEtpbmQAAQBAQXNzZXRSYXRlVXBkYXRlZAwBKGFzc2V0X2tpbmQBBQEwVDo6QXNzZXRLaW5kAAEMb2xkLQgBJEZpeGVkVTEyOAABDG5ldy0IASRGaXhlZFUxMjgAAgAEfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXQxCQxMcGFsbGV0X3Jvb3RfdGVzdGluZxhwYWxsZXQURXZlbnQEBFQAAQRERGVmZW5zaXZlVGVzdENhbGwAAAQBAUV2ZW50IGRpc3BhdGNoZWQgd2hlbiB0aGUgdHJpZ2dlcl9kZWZlbnNpdmUgZXh0cmluc2ljIGlzIGNhbGxlZC4EfFRoZSBgRXZlbnRgIGVudW0gb2YgdGhpcyBwYWxsZXQ1CQw4cGFsbGV0X21ldGFfdHgYcGFsbGV0FEV2ZW50BARUAAEEKERpc3BhdGNoZWQEARhyZXN1bHS1CAFoRGlzcGF0Y2hSZXN1bHRXaXRoUG9zdEluZm8AABCcQSBtZXRhIHRyYW5zYWN0aW9uIGhhcyBiZWVuIGRpc3BhdGNoZWQuADUBQ29udGFpbnMgdGhlIGRpc3BhdGNoIHJlc3VsdCBvZiB0aGUgbWV0YSB0cmFuc2FjdGlvbiBhbG9uZyB3aXRoIHBvc3QtZGlzcGF0Y2gwaW5mb3JtYXRpb24uBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0OQkQXHBvbGthZG90X3J1bnRpbWVfY29tbW9uRGlkZW50aXR5X21pZ3JhdG9yGHBhbGxldBRFdmVudAQEVAABCDhJZGVudGl0eVJlYXBlZAQBDHdobwABMFQ6OkFjY291bnRJZAAABOBUaGUgaWRlbnRpdHkgYW5kIGFsbCBzdWIgYWNjb3VudHMgd2VyZSByZWFwZWQgZm9yIGB3aG9gLjhEZXBvc2l0VXBkYXRlZAwBDHdobwABMFQ6OkFjY291bnRJZAABIGlkZW50aXR5GAEwQmFsYW5jZU9mPFQ+AAEQc3VicxgBMEJhbGFuY2VPZjxUPgABCEEBVGhlIGRlcG9zaXRzIGhlbGQgZm9yIGB3aG9gIHdlcmUgdXBkYXRlZC4gYGlkZW50aXR5YCBpcyB0aGUgbmV3IGRlcG9zaXQgaGVsZCBmb3IdAWlkZW50aXR5IGluZm8sIGFuZCBgc3Vic2AgaXMgdGhlIG5ldyBkZXBvc2l0IGhlbGQgZm9yIHRoZSBzdWItYWNjb3VudHMuBHxUaGUgYEV2ZW50YCBlbnVtIG9mIHRoaXMgcGFsbGV0PQkIMGZyYW1lX3N5c3RlbRRQaGFzZQABDDhBcHBseUV4dHJpbnNpYwQAEAEMdTMyAAAAMEZpbmFsaXphdGlvbgABADhJbml0aWFsaXphdGlvbgACAABBCQAAAiUBAEUJCDBmcmFtZV9zeXN0ZW1YTGFzdFJ1bnRpbWVVcGdyYWRlSW5mbwAACAEwc3BlY192ZXJzaW9uyQEBTGNvZGVjOjpDb21wYWN0PHUzMj4AASRzcGVjX25hbWVJCQFEQ293PCdzdGF0aWMsIHN0cj4AAEkJBAxDb3cEBFQBTQkABABNCQAAAE0JAAAFAgBRCQgwZnJhbWVfc3lzdGVtYENvZGVVcGdyYWRlQXV0aG9yaXphdGlvbgQEVAAACAEkY29kZV9oYXNoNAEcVDo6SGFzaAABNGNoZWNrX3ZlcnNpb24gARBib29sAABVCQwwZnJhbWVfc3lzdGVtGGxpbWl0czBCbG9ja1dlaWdodHMAAAwBKGJhc2VfYmxvY2soARhXZWlnaHQAASRtYXhfYmxvY2soARhXZWlnaHQAASRwZXJfY2xhc3NZCQGEUGVyRGlzcGF0Y2hDbGFzczxXZWlnaHRzUGVyQ2xhc3M+AABZCQw0ZnJhbWVfc3VwcG9ydCBkaXNwYXRjaEBQZXJEaXNwYXRjaENsYXNzBARUAV0JAAwBGG5vcm1hbF0JAQRUAAEsb3BlcmF0aW9uYWxdCQEEVAABJG1hbmRhdG9yeV0JAQRUAABdCQwwZnJhbWVfc3lzdGVtGGxpbWl0czxXZWlnaHRzUGVyQ2xhc3MAABABOGJhc2VfZXh0cmluc2ljKAEYV2VpZ2h0AAE0bWF4X2V4dHJpbnNpY0UHAThPcHRpb248V2VpZ2h0PgABJG1heF90b3RhbEUHAThPcHRpb248V2VpZ2h0PgABIHJlc2VydmVkRQcBOE9wdGlvbjxXZWlnaHQ+AABhCQwwZnJhbWVfc3lzdGVtGGxpbWl0cyxCbG9ja0xlbmd0aAAABAEMbWF4ZQkBVFBlckRpc3BhdGNoQ2xhc3M8dTMyPgAAZQkMNGZyYW1lX3N1cHBvcnQgZGlzcGF0Y2hAUGVyRGlzcGF0Y2hDbGFzcwQEVAEQAAwBGG5vcm1hbBABBFQAASxvcGVyYXRpb25hbBABBFQAASRtYW5kYXRvcnkQAQRUAABpCQgoc3Bfd2VpZ2h0czxSdW50aW1lRGJXZWlnaHQAAAgBEHJlYWQwAQx1NjQAARR3cml0ZTABDHU2NAAAbQkIKHNwX3ZlcnNpb244UnVudGltZVZlcnNpb24AACABJHNwZWNfbmFtZUkJAURDb3c8J3N0YXRpYywgc3RyPgABJGltcGxfbmFtZUkJAURDb3c8J3N0YXRpYywgc3RyPgABRGF1dGhvcmluZ192ZXJzaW9uEAEMdTMyAAEwc3BlY192ZXJzaW9uEAEMdTMyAAEwaW1wbF92ZXJzaW9uEAEMdTMyAAEQYXBpc3EJARxBcGlzVmVjAAFMdHJhbnNhY3Rpb25fdmVyc2lvbhABDHUzMgABOHN5c3RlbV92ZXJzaW9uCAEIdTgAAHEJBAxDb3cEBFQBdQkABAB1CQAAAHUJAAACeQkAeQkAAAQIJQMQAH0JDDBmcmFtZV9zeXN0ZW0YcGFsbGV0FEVycm9yBARUAAEkPEludmFsaWRTcGVjTmFtZQAACBEBVGhlIG5hbWUgb2Ygc3BlY2lmaWNhdGlvbiBkb2VzIG5vdCBtYXRjaCBiZXR3ZWVuIHRoZSBjdXJyZW50IHJ1bnRpbWVQYW5kIHRoZSBuZXcgcnVudGltZS5oU3BlY1ZlcnNpb25OZWVkc1RvSW5jcmVhc2UAAQhBAVRoZSBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaXMgbm90IGFsbG93ZWQgdG8gZGVjcmVhc2UgYmV0d2VlbiB0aGUgY3VycmVudCBydW50aW1lUGFuZCB0aGUgbmV3IHJ1bnRpbWUudEZhaWxlZFRvRXh0cmFjdFJ1bnRpbWVWZXJzaW9uAAIM7EZhaWxlZCB0byBleHRyYWN0IHRoZSBydW50aW1lIHZlcnNpb24gZnJvbSB0aGUgbmV3IHJ1bnRpbWUuAAkBRWl0aGVyIGNhbGxpbmcgYENvcmVfdmVyc2lvbmAgb3IgZGVjb2RpbmcgYFJ1bnRpbWVWZXJzaW9uYCBmYWlsZWQuTE5vbkRlZmF1bHRDb21wb3NpdGUAAwT8U3VpY2lkZSBjYWxsZWQgd2hlbiB0aGUgYWNjb3VudCBoYXMgbm9uLWRlZmF1bHQgY29tcG9zaXRlIGRhdGEuPE5vblplcm9SZWZDb3VudAAEBDUBVGhlcmUgaXMgYSBub24temVybyByZWZlcmVuY2UgY291bnQgcHJldmVudGluZyB0aGUgYWNjb3VudCBmcm9tIGJlaW5nIHB1cmdlZC4wQ2FsbEZpbHRlcmVkAAUE0FRoZSBvcmlnaW4gZmlsdGVyIHByZXZlbnQgdGhlIGNhbGwgdG8gYmUgZGlzcGF0Y2hlZC5sTXVsdGlCbG9ja01pZ3JhdGlvbnNPbmdvaW5nAAYEVQFBIG11bHRpLWJsb2NrIG1pZ3JhdGlvbiBpcyBvbmdvaW5nIGFuZCBwcmV2ZW50cyB0aGUgY3VycmVudCBjb2RlIGZyb20gYmVpbmcgcmVwbGFjZWQuRE5vdGhpbmdBdXRob3JpemVkAAcEWE5vIHVwZ3JhZGUgYXV0aG9yaXplZC4wVW5hdXRob3JpemVkAAgElFRoZSBzdWJtaXR0ZWQgY29kZSBpcyBub3QgYXV0aG9yaXplZC4EbEVycm9yIGZvciB0aGUgU3lzdGVtIHBhbGxldIEJDExib3VuZGVkX2NvbGxlY3Rpb25zQHdlYWtfYm91bmRlZF92ZWM4V2Vha0JvdW5kZWRWZWMIBFQBhQkEUwAABACJCQEYVmVjPFQ+AACFCQAABAjNATAAiQkAAAKFCQCNCQxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAQQEUwAABACRCQEYVmVjPFQ+AACRCQAAAgQAlQkEGE9wdGlvbgQEVAGZCQEIEE5vbmUAAAAQU29tZQQAmQkAAAEAAJkJDERzcF9jb25zZW5zdXNfYmFiZRxkaWdlc3RzJFByZURpZ2VzdAABDBxQcmltYXJ5BACdCQFAUHJpbWFyeVByZURpZ2VzdAABADhTZWNvbmRhcnlQbGFpbgQApQkBXFNlY29uZGFyeVBsYWluUHJlRGlnZXN0AAIAMFNlY29uZGFyeVZSRgQAqQkBVFNlY29uZGFyeVZSRlByZURpZ2VzdAADAACdCQxEc3BfY29uc2Vuc3VzX2JhYmUcZGlnZXN0c0BQcmltYXJ5UHJlRGlnZXN0AAAMATxhdXRob3JpdHlfaW5kZXgQAVRzdXBlcjo6QXV0aG9yaXR5SW5kZXgAARBzbG900QEBEFNsb3QAATR2cmZfc2lnbmF0dXJloQkBMFZyZlNpZ25hdHVyZQAAoQkQHHNwX2NvcmUcc3IyNTUxOQx2cmYwVnJmU2lnbmF0dXJlAAAIAShwcmVfb3V0cHV0BAEwVnJmUHJlT3V0cHV0AAEUcHJvb2aFAgEgVnJmUHJvb2YAAKUJDERzcF9jb25zZW5zdXNfYmFiZRxkaWdlc3RzXFNlY29uZGFyeVBsYWluUHJlRGlnZXN0AAAIATxhdXRob3JpdHlfaW5kZXgQAVRzdXBlcjo6QXV0aG9yaXR5SW5kZXgAARBzbG900QEBEFNsb3QAAKkJDERzcF9jb25zZW5zdXNfYmFiZRxkaWdlc3RzVFNlY29uZGFyeVZSRlByZURpZ2VzdAAADAE8YXV0aG9yaXR5X2luZGV4EAFUc3VwZXI6OkF1dGhvcml0eUluZGV4AAEQc2xvdNEBARBTbG90AAE0dnJmX3NpZ25hdHVyZaEJATBWcmZTaWduYXR1cmUAAK0JCERzcF9jb25zZW5zdXNfYmFiZVhCYWJlRXBvY2hDb25maWd1cmF0aW9uAAAIAQRj3QEBKCh1NjQsIHU2NCkAATRhbGxvd2VkX3Nsb3Rz4QEBMEFsbG93ZWRTbG90cwAAsQkMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAG1CQRTAAAEALkJARhWZWM8VD4AALUJAAAECDAQALkJAAACtQkAvQkMLHBhbGxldF9iYWJlGHBhbGxldBRFcnJvcgQEVAABEGBJbnZhbGlkRXF1aXZvY2F0aW9uUHJvb2YAAAQxAUFuIGVxdWl2b2NhdGlvbiBwcm9vZiBwcm92aWRlZCBhcyBwYXJ0IG9mIGFuIGVxdWl2b2NhdGlvbiByZXBvcnQgaXMgaW52YWxpZC5gSW52YWxpZEtleU93bmVyc2hpcFByb29mAAEEMQFBIGtleSBvd25lcnNoaXAgcHJvb2YgcHJvdmlkZWQgYXMgcGFydCBvZiBhbiBlcXVpdm9jYXRpb24gcmVwb3J0IGlzIGludmFsaWQuWER1cGxpY2F0ZU9mZmVuY2VSZXBvcnQAAgQVAUEgZ2l2ZW4gZXF1aXZvY2F0aW9uIHJlcG9ydCBpcyB2YWxpZCBidXQgYWxyZWFkeSBwcmV2aW91c2x5IHJlcG9ydGVkLlBJbnZhbGlkQ29uZmlndXJhdGlvbgADBIxTdWJtaXR0ZWQgY29uZmlndXJhdGlvbiBpcyBpbnZhbGlkLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC7BCQAABAwAGCAAxQkMOHBhbGxldF9pbmRpY2VzGHBhbGxldBRFcnJvcgQEVAABFCxOb3RBc3NpZ25lZAAABIxUaGUgaW5kZXggd2FzIG5vdCBhbHJlYWR5IGFzc2lnbmVkLiBOb3RPd25lcgABBKRUaGUgaW5kZXggaXMgYXNzaWduZWQgdG8gYW5vdGhlciBhY2NvdW50LhRJblVzZQACBHBUaGUgaW5kZXggd2FzIG5vdCBhdmFpbGFibGUuLE5vdFRyYW5zZmVyAAMEyFRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGFjY291bnRzIGFyZSBpZGVudGljYWwuJFBlcm1hbmVudAAEBNBUaGUgaW5kZXggaXMgcGVybWFuZW50IGFuZCBtYXkgbm90IGJlIGZyZWVkL2NoYW5nZWQuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LskJDExib3VuZGVkX2NvbGxlY3Rpb25zQHdlYWtfYm91bmRlZF92ZWM4V2Vha0JvdW5kZWRWZWMIBFQBzQkEUwAABADVCQEYVmVjPFQ+AADNCQw8cGFsbGV0X2JhbGFuY2VzFHR5cGVzLEJhbGFuY2VMb2NrBBxCYWxhbmNlARgADAEIaWQlAwE4TG9ja0lkZW50aWZpZXIAARhhbW91bnQYARxCYWxhbmNlAAEccmVhc29uc9EJARxSZWFzb25zAADRCQw8cGFsbGV0X2JhbGFuY2VzFHR5cGVzHFJlYXNvbnMAAQwMRmVlAAAAEE1pc2MAAQAMQWxsAAIAANUJAAACzQkA2QkMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAHdCQRTAAAEAOEJARhWZWM8VD4AAN0JDDxwYWxsZXRfYmFsYW5jZXMUdHlwZXMsUmVzZXJ2ZURhdGEIRFJlc2VydmVJZGVudGlmaWVyASUDHEJhbGFuY2UBGAAIAQhpZCUDAURSZXNlcnZlSWRlbnRpZmllcgABGGFtb3VudBgBHEJhbGFuY2UAAOEJAAAC3QkA5QkMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAHpCQRTAAAEAAUKARhWZWM8VD4AAOkJFDRmcmFtZV9zdXBwb3J0GHRyYWl0cxh0b2tlbnMQbWlzYyBJZEFtb3VudAgISWQB7QkcQmFsYW5jZQEYAAgBCGlk7QkBCElkAAEYYW1vdW50GAEcQmFsYW5jZQAA7QkIPHdlc3RlbmRfcnVudGltZURSdW50aW1lSG9sZFJlYXNvbgABFBxTdGFraW5nBADxCQFocGFsbGV0X3N0YWtpbmc6OkhvbGRSZWFzb24ABgAcU2Vzc2lvbgQA9QkBaHBhbGxldF9zZXNzaW9uOjpIb2xkUmVhc29uAAgAIFByZWltYWdlBAD5CQFscGFsbGV0X3ByZWltYWdlOjpIb2xkUmVhc29uABwAQERlbGVnYXRlZFN0YWtpbmcEAP0JAZBwYWxsZXRfZGVsZWdhdGVkX3N0YWtpbmc6OkhvbGRSZWFzb24AJgAkWGNtUGFsbGV0BAABCgFYcGFsbGV0X3hjbTo6SG9sZFJlYXNvbgBjAADxCRA4cGFsbGV0X3N0YWtpbmcYcGFsbGV0GHBhbGxldChIb2xkUmVhc29uAAEEHFN0YWtpbmcAAAAA9QkMOHBhbGxldF9zZXNzaW9uGHBhbGxldChIb2xkUmVhc29uAAEEEEtleXMAAAAA+QkMPHBhbGxldF9wcmVpbWFnZRhwYWxsZXQoSG9sZFJlYXNvbgABBCBQcmVpbWFnZQAAAAD9CQxgcGFsbGV0X2RlbGVnYXRlZF9zdGFraW5nGHBhbGxldChIb2xkUmVhc29uAAEERFN0YWtpbmdEZWxlZ2F0aW9uAAAAAAEKDChwYWxsZXRfeGNtGHBhbGxldChIb2xkUmVhc29uAAEEOEF1dGhvcml6ZUFsaWFzAAAAAAUKAAAC6QkACQoMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAENCgRTAAAEABkKARhWZWM8VD4AAA0KFDRmcmFtZV9zdXBwb3J0GHRyYWl0cxh0b2tlbnMQbWlzYyBJZEFtb3VudAgISWQBEQocQmFsYW5jZQEYAAgBCGlkEQoBCElkAAEYYW1vdW50GAEcQmFsYW5jZQAAEQoIPHdlc3RlbmRfcnVudGltZUxSdW50aW1lRnJlZXplUmVhc29uAAEEPE5vbWluYXRpb25Qb29scwQAFQoBlHBhbGxldF9ub21pbmF0aW9uX3Bvb2xzOjpGcmVlemVSZWFzb24AHQAAFQoMXHBhbGxldF9ub21pbmF0aW9uX3Bvb2xzGHBhbGxldDBGcmVlemVSZWFzb24AAQQ4UG9vbE1pbkJhbGFuY2UAAAAAGQoAAAINCgAdCgw8cGFsbGV0X2JhbGFuY2VzGHBhbGxldBRFcnJvcggEVAAESQABMDhWZXN0aW5nQmFsYW5jZQAABJxWZXN0aW5nIGJhbGFuY2UgdG9vIGhpZ2ggdG8gc2VuZCB2YWx1ZS5UTGlxdWlkaXR5UmVzdHJpY3Rpb25zAAEEyEFjY291bnQgbGlxdWlkaXR5IHJlc3RyaWN0aW9ucyBwcmV2ZW50IHdpdGhkcmF3YWwuTEluc3VmZmljaWVudEJhbGFuY2UAAgR4QmFsYW5jZSB0b28gbG93IHRvIHNlbmQgdmFsdWUuSEV4aXN0ZW50aWFsRGVwb3NpdAADBOxWYWx1ZSB0b28gbG93IHRvIGNyZWF0ZSBhY2NvdW50IGR1ZSB0byBleGlzdGVudGlhbCBkZXBvc2l0LjRFeHBlbmRhYmlsaXR5AAQEkFRyYW5zZmVyL3BheW1lbnQgd291bGQga2lsbCBhY2NvdW50LlxFeGlzdGluZ1Zlc3RpbmdTY2hlZHVsZQAFBMxBIHZlc3Rpbmcgc2NoZWR1bGUgYWxyZWFkeSBleGlzdHMgZm9yIHRoaXMgYWNjb3VudC4sRGVhZEFjY291bnQABgSMQmVuZWZpY2lhcnkgYWNjb3VudCBtdXN0IHByZS1leGlzdC48VG9vTWFueVJlc2VydmVzAAcEuE51bWJlciBvZiBuYW1lZCByZXNlcnZlcyBleGNlZWQgYE1heFJlc2VydmVzYC4wVG9vTWFueUhvbGRzAAgE+E51bWJlciBvZiBob2xkcyBleGNlZWQgYFZhcmlhbnRDb3VudE9mPFQ6OlJ1bnRpbWVIb2xkUmVhc29uPmAuOFRvb01hbnlGcmVlemVzAAkEmE51bWJlciBvZiBmcmVlemVzIGV4Y2VlZCBgTWF4RnJlZXplc2AuTElzc3VhbmNlRGVhY3RpdmF0ZWQACgQBAVRoZSBpc3N1YW5jZSBjYW5ub3QgYmUgbW9kaWZpZWQgc2luY2UgaXQgaXMgYWxyZWFkeSBkZWFjdGl2YXRlZC4kRGVsdGFaZXJvAAsEZFRoZSBkZWx0YSBjYW5ub3QgYmUgemVyby4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQuIQoIaHBhbGxldF90cmFuc2FjdGlvbl9wYXltZW50IFJlbGVhc2VzAAEIJFYxQW5jaWVudAAAAAhWMgABAAAlCgg4cGFsbGV0X3N0YWtpbmc0U3Rha2luZ0xlZGdlcgQEVAAAFAEUc3Rhc2gAATBUOjpBY2NvdW50SWQAARR0b3RhbP0BATBCYWxhbmNlT2Y8VD4AARhhY3RpdmX9AQEwQmFsYW5jZU9mPFQ+AAEkdW5sb2NraW5nMQIB8EJvdW5kZWRWZWM8VW5sb2NrQ2h1bms8QmFsYW5jZU9mPFQ+PiwgVDo6TWF4VW5sb2NraW5nQ2h1bmtzPgABWGxlZ2FjeV9jbGFpbWVkX3Jld2FyZHMpCgGUQm91bmRlZFZlYzxFcmFJbmRleCwgVDo6SGlzdG9yeURlcHRoPgAAKQoMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAEQBFMAAAQAkQEBGFZlYzxUPgAALQoIOHBhbGxldF9zdGFraW5nLE5vbWluYXRpb25zBARUAAAMARx0YXJnZXRzMQoBtEJvdW5kZWRWZWM8VDo6QWNjb3VudElkLCBNYXhOb21pbmF0aW9uc09mPFQ+PgABMHN1Ym1pdHRlZF9pbhABIEVyYUluZGV4AAEoc3VwcHJlc3NlZCABEGJvb2wAADEKDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBAARTAAAEAAECARhWZWM8VD4AADUKCDhwYWxsZXRfc3Rha2luZzRBY3RpdmVFcmFJbmZvAAAIARRpbmRleBABIEVyYUluZGV4AAEUc3RhcnQZCAEsT3B0aW9uPHU2ND4AADkKAAAECBAAAD0KCChzcF9zdGFraW5nIEV4cG9zdXJlCCRBY2NvdW50SWQBABxCYWxhbmNlARgADAEUdG90YWz9AQEcQmFsYW5jZQABDG93bv0BARxCYWxhbmNlAAEYb3RoZXJzQQoBrFZlYzxJbmRpdmlkdWFsRXhwb3N1cmU8QWNjb3VudElkLCBCYWxhbmNlPj4AAEEKAAACRQoARQoIKHNwX3N0YWtpbmdISW5kaXZpZHVhbEV4cG9zdXJlCCRBY2NvdW50SWQBABxCYWxhbmNlARgACAEMd2hvAAEkQWNjb3VudElkAAEUdmFsdWX9AQEcQmFsYW5jZQAASQoIKHNwX3N0YWtpbmdUUGFnZWRFeHBvc3VyZU1ldGFkYXRhBBxCYWxhbmNlARgAEAEUdG90YWz9AQEcQmFsYW5jZQABDG93bv0BARxCYWxhbmNlAAE8bm9taW5hdG9yX2NvdW50EAEMdTMyAAEocGFnZV9jb3VudBABEFBhZ2UAAE0KAAAEDBAAEABRCggoc3Bfc3Rha2luZzBFeHBvc3VyZVBhZ2UIJEFjY291bnRJZAEAHEJhbGFuY2UBGAAIAShwYWdlX3RvdGFs/QEBHEJhbGFuY2UAARhvdGhlcnNBCgGsVmVjPEluZGl2aWR1YWxFeHBvc3VyZTxBY2NvdW50SWQsIEJhbGFuY2U+PgAAVQoIOHBhbGxldF9zdGFraW5nPEVyYVJld2FyZFBvaW50cwQkQWNjb3VudElkAQAACAEUdG90YWwQASxSZXdhcmRQb2ludAABKGluZGl2aWR1YWxZCgGAQlRyZWVNYXA8QWNjb3VudElkLCBSZXdhcmRQb2ludD4AAFkKBCBCVHJlZU1hcAgESwEABFYBEAAEAF0KAAAAXQoAAAJhCgBhCgAABAgAEABlCgAAAmkKAGkKCDhwYWxsZXRfc3Rha2luZzhVbmFwcGxpZWRTbGFzaAgkQWNjb3VudElkAQAcQmFsYW5jZQEYABQBJHZhbGlkYXRvcgABJEFjY291bnRJZAABDG93bhgBHEJhbGFuY2UAARhvdGhlcnO5BAFkVmVjPChBY2NvdW50SWQsIEJhbGFuY2UpPgABJHJlcG9ydGVycwECAThWZWM8QWNjb3VudElkPgABGHBheW91dBgBHEJhbGFuY2UAAG0KAAAECJgYAHEKDDhwYWxsZXRfc3Rha2luZyBzbGFzaGluZzRTbGFzaGluZ1NwYW5zAAAQAShzcGFuX2luZGV4EAEkU3BhbkluZGV4AAEobGFzdF9zdGFydBABIEVyYUluZGV4AAFIbGFzdF9ub256ZXJvX3NsYXNoEAEgRXJhSW5kZXgAARRwcmlvcpEBATRWZWM8RXJhSW5kZXg+AAB1Cgw4cGFsbGV0X3N0YWtpbmcgc2xhc2hpbmcoU3BhblJlY29yZAQcQmFsYW5jZQEYAAgBHHNsYXNoZWQYARxCYWxhbmNlAAEgcGFpZF9vdXQYARxCYWxhbmNlAAB5ChA4cGFsbGV0X3N0YWtpbmcYcGFsbGV0GHBhbGxldBRFcnJvcgQEVAABiDROb3RDb250cm9sbGVyAAAEZE5vdCBhIGNvbnRyb2xsZXIgYWNjb3VudC4gTm90U3Rhc2gAAQRQTm90IGEgc3Rhc2ggYWNjb3VudC40QWxyZWFkeUJvbmRlZAACBGBTdGFzaCBpcyBhbHJlYWR5IGJvbmRlZC40QWxyZWFkeVBhaXJlZAADBHRDb250cm9sbGVyIGlzIGFscmVhZHkgcGFpcmVkLjBFbXB0eVRhcmdldHMABARgVGFyZ2V0cyBjYW5ub3QgYmUgZW1wdHkuOER1cGxpY2F0ZUluZGV4AAUEQER1cGxpY2F0ZSBpbmRleC5ESW52YWxpZFNsYXNoSW5kZXgABgSEU2xhc2ggcmVjb3JkIGluZGV4IG91dCBvZiBib3VuZHMuQEluc3VmZmljaWVudEJvbmQABwxZAUNhbm5vdCBoYXZlIGEgdmFsaWRhdG9yIG9yIG5vbWluYXRvciByb2xlLCB3aXRoIHZhbHVlIGxlc3MgdGhhbiB0aGUgbWluaW11bSBkZWZpbmVkIGJ5PQFnb3Zlcm5hbmNlIChzZWUgYE1pblZhbGlkYXRvckJvbmRgIGFuZCBgTWluTm9taW5hdG9yQm9uZGApLiBJZiB1bmJvbmRpbmcgaXMgdGhlFQFpbnRlbnRpb24sIGBjaGlsbGAgZmlyc3QgdG8gcmVtb3ZlIG9uZSdzIHJvbGUgYXMgdmFsaWRhdG9yL25vbWluYXRvci4wTm9Nb3JlQ2h1bmtzAAgEkENhbiBub3Qgc2NoZWR1bGUgbW9yZSB1bmxvY2sgY2h1bmtzLjROb1VubG9ja0NodW5rAAkEoENhbiBub3QgcmVib25kIHdpdGhvdXQgdW5sb2NraW5nIGNodW5rcy4wRnVuZGVkVGFyZ2V0AAoEyEF0dGVtcHRpbmcgdG8gdGFyZ2V0IGEgc3Rhc2ggdGhhdCBzdGlsbCBoYXMgZnVuZHMuSEludmFsaWRFcmFUb1Jld2FyZAALBFhJbnZhbGlkIGVyYSB0byByZXdhcmQuaEludmFsaWROdW1iZXJPZk5vbWluYXRpb25zAAwEeEludmFsaWQgbnVtYmVyIG9mIG5vbWluYXRpb25zLkhOb3RTb3J0ZWRBbmRVbmlxdWUADQSASXRlbXMgYXJlIG5vdCBzb3J0ZWQgYW5kIHVuaXF1ZS44QWxyZWFkeUNsYWltZWQADgQJAVJld2FyZHMgZm9yIHRoaXMgZXJhIGhhdmUgYWxyZWFkeSBiZWVuIGNsYWltZWQgZm9yIHRoaXMgdmFsaWRhdG9yLixJbnZhbGlkUGFnZQAPBIRObyBub21pbmF0b3JzIGV4aXN0IG9uIHRoaXMgcGFnZS5USW5jb3JyZWN0SGlzdG9yeURlcHRoABAEwEluY29ycmVjdCBwcmV2aW91cyBoaXN0b3J5IGRlcHRoIGlucHV0IHByb3ZpZGVkLlhJbmNvcnJlY3RTbGFzaGluZ1NwYW5zABEEsEluY29ycmVjdCBudW1iZXIgb2Ygc2xhc2hpbmcgc3BhbnMgcHJvdmlkZWQuIEJhZFN0YXRlABIEOQFJbnRlcm5hbCBzdGF0ZSBoYXMgYmVjb21lIHNvbWVob3cgY29ycnVwdGVkIGFuZCB0aGUgb3BlcmF0aW9uIGNhbm5vdCBjb250aW51ZS44VG9vTWFueVRhcmdldHMAEwSUVG9vIG1hbnkgbm9taW5hdGlvbiB0YXJnZXRzIHN1cHBsaWVkLiRCYWRUYXJnZXQAFAQ9AUEgbm9taW5hdGlvbiB0YXJnZXQgd2FzIHN1cHBsaWVkIHRoYXQgd2FzIGJsb2NrZWQgb3Igb3RoZXJ3aXNlIG5vdCBhIHZhbGlkYXRvci5AQ2Fubm90Q2hpbGxPdGhlcgAVBFUBVGhlIHVzZXIgaGFzIGVub3VnaCBib25kIGFuZCB0aHVzIGNhbm5vdCBiZSBjaGlsbGVkIGZvcmNlZnVsbHkgYnkgYW4gZXh0ZXJuYWwgcGVyc29uLkRUb29NYW55Tm9taW5hdG9ycwAWCE0BVGhlcmUgYXJlIHRvbyBtYW55IG5vbWluYXRvcnMgaW4gdGhlIHN5c3RlbS4gR292ZXJuYW5jZSBuZWVkcyB0byBhZGp1c3QgdGhlIHN0YWtpbme0c2V0dGluZ3MgdG8ga2VlcCB0aGluZ3Mgc2FmZSBmb3IgdGhlIHJ1bnRpbWUuRFRvb01hbnlWYWxpZGF0b3JzABcIVQFUaGVyZSBhcmUgdG9vIG1hbnkgdmFsaWRhdG9yIGNhbmRpZGF0ZXMgaW4gdGhlIHN5c3RlbS4gR292ZXJuYW5jZSBuZWVkcyB0byBhZGp1c3QgdGhl1HN0YWtpbmcgc2V0dGluZ3MgdG8ga2VlcCB0aGluZ3Mgc2FmZSBmb3IgdGhlIHJ1bnRpbWUuQENvbW1pc3Npb25Ub29Mb3cAGATgQ29tbWlzc2lvbiBpcyB0b28gbG93LiBNdXN0IGJlIGF0IGxlYXN0IGBNaW5Db21taXNzaW9uYC4sQm91bmROb3RNZXQAGQRYU29tZSBib3VuZCBpcyBub3QgbWV0LlBDb250cm9sbGVyRGVwcmVjYXRlZAAaBAEBVXNlZCB3aGVuIGF0dGVtcHRpbmcgdG8gdXNlIGRlcHJlY2F0ZWQgY29udHJvbGxlciBhY2NvdW50IGxvZ2ljLkxDYW5ub3RSZXN0b3JlTGVkZ2VyABsEWENhbm5vdCByZXNldCBhIGxlZGdlci5sUmV3YXJkRGVzdGluYXRpb25SZXN0cmljdGVkABwErFByb3ZpZGVkIHJld2FyZCBkZXN0aW5hdGlvbiBpcyBub3QgYWxsb3dlZC44Tm90RW5vdWdoRnVuZHMAHQScTm90IGVub3VnaCBmdW5kcyBhdmFpbGFibGUgdG8gd2l0aGRyYXcuXFZpcnR1YWxTdGFrZXJOb3RBbGxvd2VkAB4EqE9wZXJhdGlvbiBub3QgYWxsb3dlZCBmb3IgdmlydHVhbCBzdGFrZXJzLjxDYW5ub3RSZWFwU3Rhc2gAHwT0U3Rhc2ggY291bGQgbm90IGJlIHJlYXBlZCBhcyBvdGhlciBwYWxsZXQgbWlnaHQgZGVwZW5kIG9uIGl0LjxBbHJlYWR5TWlncmF0ZWQAIAQJAVRoZSBzdGFrZSBvZiB0aGlzIGFjY291bnQgaXMgYWxyZWFkeSBtaWdyYXRlZCB0byBgRnVuZ2libGVgIGhvbGRzLihSZXN0cmljdGVkACEIWQFBY2NvdW50IGlzIHJlc3RyaWN0ZWQgZnJvbSBwYXJ0aWNpcGF0aW9uIGluIHN0YWtpbmcuIFRoaXMgbWF5IGhhcHBlbiBpZiB0aGUgYWNjb3VudCBpc8RzdGFraW5nIGluIGFub3RoZXIgd2F5IGFscmVhZHksIHN1Y2ggYXMgdmlhIHBvb2wuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0Ln0KDChzcF9zdGFraW5nHG9mZmVuY2U4T2ZmZW5jZURldGFpbHMIIFJlcG9ydGVyAQAgT2ZmZW5kZXIBgQoACAEgb2ZmZW5kZXKBCgEgT2ZmZW5kZXIAASRyZXBvcnRlcnMBAgE0VmVjPFJlcG9ydGVyPgAAgQoAAAQIAD0KAIUKAAAECLA4AIkKAAAECDQQAI0KAAACkQoAkQoAAAQIAFUCAJUKAAACmQoAmQoAAAQIEJ0KAJ0KDChzcF9zdGFraW5nHG9mZmVuY2U8T2ZmZW5jZVNldmVyaXR5AAAEAJgBHFBlcmJpbGwAAKEKAAAECKUKOAClCgwcc3BfY29yZRhjcnlwdG8kS2V5VHlwZUlkAAAEAEgBHFt1ODsgNF0AAKkKDDhwYWxsZXRfc2Vzc2lvbhhwYWxsZXQURXJyb3IEBFQAARQwSW52YWxpZFByb29mAAAEYEludmFsaWQgb3duZXJzaGlwIHByb29mLlxOb0Fzc29jaWF0ZWRWYWxpZGF0b3JJZAABBJxObyBhc3NvY2lhdGVkIHZhbGlkYXRvciBJRCBmb3IgYWNjb3VudC40RHVwbGljYXRlZEtleQACBGRSZWdpc3RlcmVkIGR1cGxpY2F0ZSBrZXkuGE5vS2V5cwADBKRObyBrZXlzIGFyZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBhY2NvdW50LiROb0FjY291bnQABAQZAUtleSBzZXR0aW5nIGFjY291bnQgaXMgbm90IGxpdmUsIHNvIGl0J3MgaW1wb3NzaWJsZSB0byBhc3NvY2lhdGUga2V5cy4EdEVycm9yIGZvciB0aGUgc2Vzc2lvbiBwYWxsZXQurQoIOHBhbGxldF9ncmFuZHBhLFN0b3JlZFN0YXRlBAROARABEBBMaXZlAAAAMFBlbmRpbmdQYXVzZQgBMHNjaGVkdWxlZF9hdBABBE4AARRkZWxheRABBE4AAQAYUGF1c2VkAAIANFBlbmRpbmdSZXN1bWUIATBzY2hlZHVsZWRfYXQQAQROAAEUZGVsYXkQAQROAAMAALEKCDhwYWxsZXRfZ3JhbmRwYUxTdG9yZWRQZW5kaW5nQ2hhbmdlCAROARAUTGltaXQAABABMHNjaGVkdWxlZF9hdBABBE4AARRkZWxheRABBE4AAUBuZXh0X2F1dGhvcml0aWVztQoBbEJvdW5kZWRBdXRob3JpdHlMaXN0PExpbWl0PgABGGZvcmNlZJwBJE9wdGlvbjxOPgAAtQoMTGJvdW5kZWRfY29sbGVjdGlvbnNAd2Vha19ib3VuZGVkX3ZlYzhXZWFrQm91bmRlZFZlYwgEVAH0BFMAAAQA8AEYVmVjPFQ+AAC5Cgw4cGFsbGV0X2dyYW5kcGEYcGFsbGV0FEVycm9yBARUAAEcLFBhdXNlRmFpbGVkAAAIBQFBdHRlbXB0IHRvIHNpZ25hbCBHUkFORFBBIHBhdXNlIHdoZW4gdGhlIGF1dGhvcml0eSBzZXQgaXNuJ3QgbGl2ZaQoZWl0aGVyIHBhdXNlZCBvciBhbHJlYWR5IHBlbmRpbmcgcGF1c2UpLjBSZXN1bWVGYWlsZWQAAQgRAUF0dGVtcHQgdG8gc2lnbmFsIEdSQU5EUEEgcmVzdW1lIHdoZW4gdGhlIGF1dGhvcml0eSBzZXQgaXNuJ3QgcGF1c2VkoChlaXRoZXIgbGl2ZSBvciBhbHJlYWR5IHBlbmRpbmcgcmVzdW1lKS40Q2hhbmdlUGVuZGluZwACBOhBdHRlbXB0IHRvIHNpZ25hbCBHUkFORFBBIGNoYW5nZSB3aXRoIG9uZSBhbHJlYWR5IHBlbmRpbmcuHFRvb1Nvb24AAwS8Q2Fubm90IHNpZ25hbCBmb3JjZWQgY2hhbmdlIHNvIHNvb24gYWZ0ZXIgbGFzdC5gSW52YWxpZEtleU93bmVyc2hpcFByb29mAAQEMQFBIGtleSBvd25lcnNoaXAgcHJvb2YgcHJvdmlkZWQgYXMgcGFydCBvZiBhbiBlcXVpdm9jYXRpb24gcmVwb3J0IGlzIGludmFsaWQuYEludmFsaWRFcXVpdm9jYXRpb25Qcm9vZgAFBDEBQW4gZXF1aXZvY2F0aW9uIHByb29mIHByb3ZpZGVkIGFzIHBhcnQgb2YgYW4gZXF1aXZvY2F0aW9uIHJlcG9ydCBpcyBpbnZhbGlkLlhEdXBsaWNhdGVPZmZlbmNlUmVwb3J0AAYEFQFBIGdpdmVuIGVxdWl2b2NhdGlvbiByZXBvcnQgaXMgdmFsaWQgYnV0IGFscmVhZHkgcHJldmlvdXNseSByZXBvcnRlZC4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQuvQoMTGJvdW5kZWRfY29sbGVjdGlvbnNAd2Vha19ib3VuZGVkX3ZlYzhXZWFrQm91bmRlZFZlYwgEVAFhAgRTAAAEAMEKARhWZWM8VD4AAMEKAAACYQIAxQoMOHBhbGxldF91dGlsaXR5GHBhbGxldBRFcnJvcgQEVAABBDBUb29NYW55Q2FsbHMAAARcVG9vIG1hbnkgY2FsbHMgYmF0Y2hlZC4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQuyQoMPHBhbGxldF9pZGVudGl0eRR0eXBlczBSZWdpc3RyYXRpb24MHEJhbGFuY2UBGDRNYXhKdWRnZW1lbnRzADBJZGVudGl0eUluZm8B+QIADAEoanVkZ2VtZW50c80KAfxCb3VuZGVkVmVjPChSZWdpc3RyYXJJbmRleCwgSnVkZ2VtZW50PEJhbGFuY2U+KSwgTWF4SnVkZ2VtZW50cz4AARxkZXBvc2l0GAEcQmFsYW5jZQABEGluZm/5AgEwSWRlbnRpdHlJbmZvAADNCgxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAdEKBFMAAAQA1QoBGFZlYzxUPgAA0QoAAAQIEI0DANUKAAAC0QoA2QoAAAQIGN0KAN0KDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBAARTAAAEAAECARhWZWM8VD4AAOEKDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQB5QoEUwAABADtCgEYVmVjPFQ+AADlCgQYT3B0aW9uBARUAekKAQgQTm9uZQAAABBTb21lBADpCgAAAQAA6QoMPHBhbGxldF9pZGVudGl0eRR0eXBlczRSZWdpc3RyYXJJbmZvDBxCYWxhbmNlARgkQWNjb3VudElkAQAcSWRGaWVsZAEwAAwBHGFjY291bnQAASRBY2NvdW50SWQAAQxmZWUYARxCYWxhbmNlAAEYZmllbGRzMAEcSWRGaWVsZAAA7QoAAALlCgDxCgxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAQgEUwAABAA4ARhWZWM8VD4AAPUKDDxwYWxsZXRfaWRlbnRpdHkUdHlwZXNMQXV0aG9yaXR5UHJvcGVydGllcwQcQWNjb3VudAEAAAgBKGFjY291bnRfaWQAARxBY2NvdW50AAEoYWxsb2NhdGlvbhABKEFsbG9jYXRpb24AAPkKDDxwYWxsZXRfaWRlbnRpdHkUdHlwZXNMVXNlcm5hbWVJbmZvcm1hdGlvbggcQWNjb3VudAEAHEJhbGFuY2UBGAAIARRvd25lcgABHEFjY291bnQAASBwcm92aWRlcv0KAURQcm92aWRlcjxCYWxhbmNlPgAA/QoMPHBhbGxldF9pZGVudGl0eRR0eXBlcyBQcm92aWRlcgQcQmFsYW5jZQEYAQwoQWxsb2NhdGlvbgAAAEBBdXRob3JpdHlEZXBvc2l0BAAYARxCYWxhbmNlAAEAGFN5c3RlbQACAAABCwAABAwAEP0KAAULDDxwYWxsZXRfaWRlbnRpdHkYcGFsbGV0FEVycm9yBARUAAF4SFRvb01hbnlTdWJBY2NvdW50cwAABFxUb28gbWFueSBzdWJzLWFjY291bnRzLiBOb3RGb3VuZAABBFBBY2NvdW50IGlzbid0IGZvdW5kLiBOb3ROYW1lZAACBFBBY2NvdW50IGlzbid0IG5hbWVkLihFbXB0eUluZGV4AAMEMEVtcHR5IGluZGV4LihGZWVDaGFuZ2VkAAQEPEZlZSBpcyBjaGFuZ2VkLihOb0lkZW50aXR5AAUESE5vIGlkZW50aXR5IGZvdW5kLjxTdGlja3lKdWRnZW1lbnQABgREU3RpY2t5IGp1ZGdlbWVudC44SnVkZ2VtZW50R2l2ZW4ABwRASnVkZ2VtZW50IGdpdmVuLkBJbnZhbGlkSnVkZ2VtZW50AAgESEludmFsaWQganVkZ2VtZW50LjBJbnZhbGlkSW5kZXgACQRUVGhlIGluZGV4IGlzIGludmFsaWQuNEludmFsaWRUYXJnZXQACgRYVGhlIHRhcmdldCBpcyBpbnZhbGlkLkRUb29NYW55UmVnaXN0cmFycwALBOhNYXhpbXVtIGFtb3VudCBvZiByZWdpc3RyYXJzIHJlYWNoZWQuIENhbm5vdCBhZGQgYW55IG1vcmUuOEFscmVhZHlDbGFpbWVkAAwEcEFjY291bnQgSUQgaXMgYWxyZWFkeSBuYW1lZC4YTm90U3ViAA0EcFNlbmRlciBpcyBub3QgYSBzdWItYWNjb3VudC4gTm90T3duZWQADgSIU3ViLWFjY291bnQgaXNuJ3Qgb3duZWQgYnkgc2VuZGVyLnRKdWRnZW1lbnRGb3JEaWZmZXJlbnRJZGVudGl0eQAPBNBUaGUgcHJvdmlkZWQganVkZ2VtZW50IHdhcyBmb3IgYSBkaWZmZXJlbnQgaWRlbnRpdHkuWEp1ZGdlbWVudFBheW1lbnRGYWlsZWQAEAT4RXJyb3IgdGhhdCBvY2N1cnMgd2hlbiB0aGVyZSBpcyBhbiBpc3N1ZSBwYXlpbmcgZm9yIGp1ZGdlbWVudC40SW52YWxpZFN1ZmZpeAARBIBUaGUgcHJvdmlkZWQgc3VmZml4IGlzIHRvbyBsb25nLlBOb3RVc2VybmFtZUF1dGhvcml0eQASBOBUaGUgc2VuZGVyIGRvZXMgbm90IGhhdmUgcGVybWlzc2lvbiB0byBpc3N1ZSBhIHVzZXJuYW1lLjBOb0FsbG9jYXRpb24AEwTEVGhlIGF1dGhvcml0eSBjYW5ub3QgYWxsb2NhdGUgYW55IG1vcmUgdXNlcm5hbWVzLkBJbnZhbGlkU2lnbmF0dXJlABQEqFRoZSBzaWduYXR1cmUgb24gYSB1c2VybmFtZSB3YXMgbm90IHZhbGlkLkRSZXF1aXJlc1NpZ25hdHVyZQAVBAkBU2V0dGluZyB0aGlzIHVzZXJuYW1lIHJlcXVpcmVzIGEgc2lnbmF0dXJlLCBidXQgbm9uZSB3YXMgcHJvdmlkZWQuPEludmFsaWRVc2VybmFtZQAWBLBUaGUgdXNlcm5hbWUgZG9lcyBub3QgbWVldCB0aGUgcmVxdWlyZW1lbnRzLjRVc2VybmFtZVRha2VuABcEeFRoZSB1c2VybmFtZSBpcyBhbHJlYWR5IHRha2VuLihOb1VzZXJuYW1lABgEmFRoZSByZXF1ZXN0ZWQgdXNlcm5hbWUgZG9lcyBub3QgZXhpc3QuKE5vdEV4cGlyZWQAGQQtAVRoZSB1c2VybmFtZSBjYW5ub3QgYmUgZm9yY2VmdWxseSByZW1vdmVkIGJlY2F1c2UgaXQgY2FuIHN0aWxsIGJlIGFjY2VwdGVkLiBUb29FYXJseQAaBBkBVGhlIHVzZXJuYW1lIGNhbm5vdCBiZSByZW1vdmVkIGJlY2F1c2UgaXQncyBzdGlsbCBpbiB0aGUgZ3JhY2UgcGVyaW9kLjBOb3RVbmJpbmRpbmcAGwTsVGhlIHVzZXJuYW1lIGNhbm5vdCBiZSByZW1vdmVkIGJlY2F1c2UgaXQgaXMgbm90IHVuYmluZGluZy5AQWxyZWFkeVVuYmluZGluZwAcBPxUaGUgdXNlcm5hbWUgY2Fubm90IGJlIHVuYm91bmQgYmVjYXVzZSBpdCBpcyBhbHJlYWR5IHVuYmluZGluZy5YSW5zdWZmaWNpZW50UHJpdmlsZWdlcwAdCEUBVGhlIGFjdGlvbiBjYW5ub3QgYmUgcGVyZm9ybWVkIGJlY2F1c2Ugb2YgaW5zdWZmaWNpZW50IHByaXZpbGVnZXMgKGUuZy4gYXV0aG9yaXR50HRyeWluZyB0byB1bmJpbmQgYSB1c2VybmFtZSBwcm92aWRlZCBieSB0aGUgc3lzdGVtKS4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQuCQsIPHBhbGxldF9yZWNvdmVyeThSZWNvdmVyeUNvbmZpZwwsQmxvY2tOdW1iZXIBEBxCYWxhbmNlARgcRnJpZW5kcwENCwAQATBkZWxheV9wZXJpb2QQASxCbG9ja051bWJlcgABHGRlcG9zaXQYARxCYWxhbmNlAAEcZnJpZW5kcw0LARxGcmllbmRzAAEkdGhyZXNob2xkQQEBDHUxNgAADQsMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAEABFMAAAQAAQIBGFZlYzxUPgAAEQsAAAQIAAAAFQsIPHBhbGxldF9yZWNvdmVyeThBY3RpdmVSZWNvdmVyeQwsQmxvY2tOdW1iZXIBEBxCYWxhbmNlARgcRnJpZW5kcwENCwAMARxjcmVhdGVkEAEsQmxvY2tOdW1iZXIAARxkZXBvc2l0GAEcQmFsYW5jZQABHGZyaWVuZHMNCwEcRnJpZW5kcwAAGQsMPHBhbGxldF9yZWNvdmVyeRhwYWxsZXQURXJyb3IEBFQAAUAoTm90QWxsb3dlZAAABPBVc2VyIGlzIG5vdCBhbGxvd2VkIHRvIG1ha2UgYSBjYWxsIG9uIGJlaGFsZiBvZiB0aGlzIGFjY291bnQ0WmVyb1RocmVzaG9sZAABBIxUaHJlc2hvbGQgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVyb0BOb3RFbm91Z2hGcmllbmRzAAIE0EZyaWVuZHMgbGlzdCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvIGFuZCB0aHJlc2hvbGQoTWF4RnJpZW5kcwADBKhGcmllbmRzIGxpc3QgbXVzdCBiZSBsZXNzIHRoYW4gbWF4IGZyaWVuZHMkTm90U29ydGVkAAQEyEZyaWVuZHMgbGlzdCBtdXN0IGJlIHNvcnRlZCBhbmQgZnJlZSBvZiBkdXBsaWNhdGVzOE5vdFJlY292ZXJhYmxlAAUEnFRoaXMgYWNjb3VudCBpcyBub3Qgc2V0IHVwIGZvciByZWNvdmVyeUhBbHJlYWR5UmVjb3ZlcmFibGUABgSsVGhpcyBhY2NvdW50IGlzIGFscmVhZHkgc2V0IHVwIGZvciByZWNvdmVyeThBbHJlYWR5U3RhcnRlZAAHBNxBIHJlY292ZXJ5IHByb2Nlc3MgaGFzIGFscmVhZHkgc3RhcnRlZCBmb3IgdGhpcyBhY2NvdW50KE5vdFN0YXJ0ZWQACATMQSByZWNvdmVyeSBwcm9jZXNzIGhhcyBub3Qgc3RhcnRlZCBmb3IgdGhpcyByZXNjdWVyJE5vdEZyaWVuZAAJBKhUaGlzIGFjY291bnQgaXMgbm90IGEgZnJpZW5kIHdobyBjYW4gdm91Y2gsRGVsYXlQZXJpb2QACgQZAVRoZSBmcmllbmQgbXVzdCB3YWl0IHVudGlsIHRoZSBkZWxheSBwZXJpb2QgdG8gdm91Y2ggZm9yIHRoaXMgcmVjb3Zlcnk4QWxyZWFkeVZvdWNoZWQACwS8VGhpcyB1c2VyIGhhcyBhbHJlYWR5IHZvdWNoZWQgZm9yIHRoaXMgcmVjb3ZlcnkkVGhyZXNob2xkAAwE6FRoZSB0aHJlc2hvbGQgZm9yIHJlY292ZXJpbmcgdGhpcyBhY2NvdW50IGhhcyBub3QgYmVlbiBtZXQsU3RpbGxBY3RpdmUADQT8VGhlcmUgYXJlIHN0aWxsIGFjdGl2ZSByZWNvdmVyeSBhdHRlbXB0cyB0aGF0IG5lZWQgdG8gYmUgY2xvc2VkMEFscmVhZHlQcm94eQAOBKxUaGlzIGFjY291bnQgaXMgYWxyZWFkeSBzZXQgdXAgZm9yIHJlY292ZXJ5IEJhZFN0YXRlAA8EeFNvbWUgaW50ZXJuYWwgc3RhdGUgaXMgYnJva2VuLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC4dCwxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAakDBFMAAAQAIQsBGFZlYzxUPgAAIQsAAAKpAwAlCwg4cGFsbGV0X3Zlc3RpbmcgUmVsZWFzZXMAAQgIVjAAAAAIVjEAAQAAKQsMOHBhbGxldF92ZXN0aW5nGHBhbGxldBRFcnJvcgQEVAABFChOb3RWZXN0aW5nAAAEhFRoZSBhY2NvdW50IGdpdmVuIGlzIG5vdCB2ZXN0aW5nLlRBdE1heFZlc3RpbmdTY2hlZHVsZXMAAQglAVRoZSBhY2NvdW50IGFscmVhZHkgaGFzIGBNYXhWZXN0aW5nU2NoZWR1bGVzYCBjb3VudCBvZiBzY2hlZHVsZXMgYW5kIHRodXNRAWNhbm5vdCBhZGQgYW5vdGhlciBvbmUuIENvbnNpZGVyIG1lcmdpbmcgZXhpc3Rpbmcgc2NoZWR1bGVzIGluIG9yZGVyIHRvIGFkZCBhbm90aGVyLiRBbW91bnRMb3cAAgQFAUFtb3VudCBiZWluZyB0cmFuc2ZlcnJlZCBpcyB0b28gbG93IHRvIGNyZWF0ZSBhIHZlc3Rpbmcgc2NoZWR1bGUuYFNjaGVkdWxlSW5kZXhPdXRPZkJvdW5kcwADBNBBbiBpbmRleCB3YXMgb3V0IG9mIGJvdW5kcyBvZiB0aGUgdmVzdGluZyBzY2hlZHVsZXMuVEludmFsaWRTY2hlZHVsZVBhcmFtcwAEBA0BRmFpbGVkIHRvIGNyZWF0ZSBhIG5ldyBzY2hlZHVsZSBiZWNhdXNlIHNvbWUgcGFyYW1ldGVyIHdhcyBpbnZhbGlkLgR0RXJyb3IgZm9yIHRoZSB2ZXN0aW5nIHBhbGxldC4tCwxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUATELBFMAAAQAOQsBGFZlYzxUPgAAMQsEGE9wdGlvbgQEVAE1CwEIEE5vbmUAAAAQU29tZQQANQsAAAEAADULCEBwYWxsZXRfc2NoZWR1bGVyJFNjaGVkdWxlZBQQTmFtZQEEEENhbGwBpQEsQmxvY2tOdW1iZXIBEDRQYWxsZXRzT3JpZ2luAaECJEFjY291bnRJZAEAABQBIG1heWJlX2lkKQEBME9wdGlvbjxOYW1lPgABIHByaW9yaXR5CAFIc2NoZWR1bGU6OlByaW9yaXR5AAEQY2FsbKUBARBDYWxsAAE4bWF5YmVfcGVyaW9kaWOxAwGUT3B0aW9uPHNjaGVkdWxlOjpQZXJpb2Q8QmxvY2tOdW1iZXI+PgABGG9yaWdpbqECATRQYWxsZXRzT3JpZ2luAAA5CwAAAjELAD0LCEBwYWxsZXRfc2NoZWR1bGVyLFJldHJ5Q29uZmlnBBhQZXJpb2QBEAAMATR0b3RhbF9yZXRyaWVzCAEIdTgAASRyZW1haW5pbmcIAQh1OAABGHBlcmlvZBABGFBlcmlvZAAAQQsMQHBhbGxldF9zY2hlZHVsZXIYcGFsbGV0FEVycm9yBARUAAEUQEZhaWxlZFRvU2NoZWR1bGUAAARkRmFpbGVkIHRvIHNjaGVkdWxlIGEgY2FsbCBOb3RGb3VuZAABBHxDYW5ub3QgZmluZCB0aGUgc2NoZWR1bGVkIGNhbGwuXFRhcmdldEJsb2NrTnVtYmVySW5QYXN0AAIEpEdpdmVuIHRhcmdldCBibG9jayBudW1iZXIgaXMgaW4gdGhlIHBhc3QuSFJlc2NoZWR1bGVOb0NoYW5nZQADBPBSZXNjaGVkdWxlIGZhaWxlZCBiZWNhdXNlIGl0IGRvZXMgbm90IGNoYW5nZSBzY2hlZHVsZWQgdGltZS4UTmFtZWQABATQQXR0ZW1wdCB0byB1c2UgYSBub24tbmFtZWQgZnVuY3Rpb24gb24gYSBuYW1lZCB0YXNrLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC5FCwg8cGFsbGV0X3ByZWltYWdlQE9sZFJlcXVlc3RTdGF0dXMIJEFjY291bnRJZAEAHEJhbGFuY2UBGAEILFVucmVxdWVzdGVkCAEcZGVwb3NpdL0EAVAoQWNjb3VudElkLCBCYWxhbmNlKQABDGxlbhABDHUzMgAAACRSZXF1ZXN0ZWQMARxkZXBvc2l0SQsBcE9wdGlvbjwoQWNjb3VudElkLCBCYWxhbmNlKT4AARRjb3VudBABDHUzMgABDGxlbpwBLE9wdGlvbjx1MzI+AAEAAEkLBBhPcHRpb24EBFQBvQQBCBBOb25lAAAAEFNvbWUEAL0EAAABAABNCwg8cGFsbGV0X3ByZWltYWdlNFJlcXVlc3RTdGF0dXMIJEFjY291bnRJZAEAGFRpY2tldAFRCwEILFVucmVxdWVzdGVkCAEYdGlja2V0VQsBTChBY2NvdW50SWQsIFRpY2tldCkAAQxsZW4QAQx1MzIAAAAkUmVxdWVzdGVkDAEwbWF5YmVfdGlja2V0WQsBbE9wdGlvbjwoQWNjb3VudElkLCBUaWNrZXQpPgABFGNvdW50EAEMdTMyAAEkbWF5YmVfbGVunAEsT3B0aW9uPHUzMj4AAQAAUQsUNGZyYW1lX3N1cHBvcnQYdHJhaXRzGHRva2VucyBmdW5naWJsZURIb2xkQ29uc2lkZXJhdGlvbhQEQQAERgAEUgAERAAIRnAAAAQAGAEoRjo6QmFsYW5jZQAAVQsAAAQIAFELAFkLBBhPcHRpb24EBFQBVQsBCBBOb25lAAAAEFNvbWUEAFULAAABAABdCwxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAQgEUwAABAA4ARhWZWM8VD4AAGELDDxwYWxsZXRfcHJlaW1hZ2UYcGFsbGV0FEVycm9yBARUAAEgGFRvb0JpZwAABKBQcmVpbWFnZSBpcyB0b28gbGFyZ2UgdG8gc3RvcmUgb24tY2hhaW4uMEFscmVhZHlOb3RlZAABBKRQcmVpbWFnZSBoYXMgYWxyZWFkeSBiZWVuIG5vdGVkIG9uLWNoYWluLjROb3RBdXRob3JpemVkAAIEyFRoZSB1c2VyIGlzIG5vdCBhdXRob3JpemVkIHRvIHBlcmZvcm0gdGhpcyBhY3Rpb24uIE5vdE5vdGVkAAME/FRoZSBwcmVpbWFnZSBjYW5ub3QgYmUgcmVtb3ZlZCBzaW5jZSBpdCBoYXMgbm90IHlldCBiZWVuIG5vdGVkLiRSZXF1ZXN0ZWQABAQJAUEgcHJlaW1hZ2UgbWF5IG5vdCBiZSByZW1vdmVkIHdoZW4gdGhlcmUgYXJlIG91dHN0YW5kaW5nIHJlcXVlc3RzLjBOb3RSZXF1ZXN0ZWQABQQtAVRoZSBwcmVpbWFnZSByZXF1ZXN0IGNhbm5vdCBiZSByZW1vdmVkIHNpbmNlIG5vIG91dHN0YW5kaW5nIHJlcXVlc3RzIGV4aXN0LhxUb29NYW55AAYEVQFNb3JlIHRoYW4gYE1BWF9IQVNIX1VQR1JBREVfQlVMS19DT1VOVGAgaGFzaGVzIHdlcmUgcmVxdWVzdGVkIHRvIGJlIHVwZ3JhZGVkIGF0IG9uY2UuGFRvb0ZldwAHBORUb28gZmV3IGhhc2hlcyB3ZXJlIHJlcXVlc3RlZCB0byBiZSB1cGdyYWRlZCAoaS5lLiB6ZXJvKS4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQuZQsMLHBhbGxldF9zdWRvGHBhbGxldBRFcnJvcgQEVAABBCxSZXF1aXJlU3VkbwAABIBTZW5kZXIgbXVzdCBiZSB0aGUgU3VkbyBhY2NvdW50LgRoRXJyb3IgZm9yIHRoZSBTdWRvIHBhbGxldC5pCwAABAhtCxgAbQsMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAFxCwRTAAAEAHULARhWZWM8VD4AAHELCDBwYWxsZXRfcHJveHk8UHJveHlEZWZpbml0aW9uDCRBY2NvdW50SWQBACRQcm94eVR5cGUBPQEsQmxvY2tOdW1iZXIBEAAMASBkZWxlZ2F0ZQABJEFjY291bnRJZAABKHByb3h5X3R5cGU9AQEkUHJveHlUeXBlAAEUZGVsYXkQASxCbG9ja051bWJlcgAAdQsAAAJxCwB5CwAABAh9CxgAfQsMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAGBCwRTAAAEAIULARhWZWM8VD4AAIELCDBwYWxsZXRfcHJveHkwQW5ub3VuY2VtZW50DCRBY2NvdW50SWQBABBIYXNoATQsQmxvY2tOdW1iZXIBEAAMARByZWFsAAEkQWNjb3VudElkAAEkY2FsbF9oYXNoNAEQSGFzaAABGGhlaWdodBABLEJsb2NrTnVtYmVyAACFCwAAAoELAIkLDDBwYWxsZXRfcHJveHkYcGFsbGV0FEVycm9yBARUAAEgHFRvb01hbnkAAAQhAVRoZXJlIGFyZSB0b28gbWFueSBwcm94aWVzIHJlZ2lzdGVyZWQgb3IgdG9vIG1hbnkgYW5ub3VuY2VtZW50cyBwZW5kaW5nLiBOb3RGb3VuZAABBHRQcm94eSByZWdpc3RyYXRpb24gbm90IGZvdW5kLiBOb3RQcm94eQACBMxTZW5kZXIgaXMgbm90IGEgcHJveHkgb2YgdGhlIGFjY291bnQgdG8gYmUgcHJveGllZC4sVW5wcm94eWFibGUAAwQhAUEgY2FsbCB3aGljaCBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgcHJveHkgdHlwZSdzIGZpbHRlciB3YXMgYXR0ZW1wdGVkLiREdXBsaWNhdGUABARsQWNjb3VudCBpcyBhbHJlYWR5IGEgcHJveHkuME5vUGVybWlzc2lvbgAFBBUBQ2FsbCBtYXkgbm90IGJlIG1hZGUgYnkgcHJveHkgYmVjYXVzZSBpdCBtYXkgZXNjYWxhdGUgaXRzIHByaXZpbGVnZXMuLFVuYW5ub3VuY2VkAAYE0EFubm91bmNlbWVudCwgaWYgbWFkZSBhdCBhbGwsIHdhcyBtYWRlIHRvbyByZWNlbnRseS4sTm9TZWxmUHJveHkABwRkQ2Fubm90IGFkZCBzZWxmIGFzIHByb3h5LgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC6NCwAABAgABACRCwg8cGFsbGV0X211bHRpc2lnIE11bHRpc2lnECxCbG9ja051bWJlcgEQHEJhbGFuY2UBGCRBY2NvdW50SWQBADBNYXhBcHByb3ZhbHMAABABEHdoZW5NAQFYVGltZXBvaW50PEJsb2NrTnVtYmVyPgABHGRlcG9zaXQYARxCYWxhbmNlAAEkZGVwb3NpdG9yAAEkQWNjb3VudElkAAEkYXBwcm92YWxzlQsBjEJvdW5kZWRWZWM8QWNjb3VudElkLCBNYXhBcHByb3ZhbHM+AACVCwxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAQAEUwAABAABAgEYVmVjPFQ+AACZCww8cGFsbGV0X211bHRpc2lnGHBhbGxldBRFcnJvcgQEVAABOEBNaW5pbXVtVGhyZXNob2xkAAAEfFRocmVzaG9sZCBtdXN0IGJlIDIgb3IgZ3JlYXRlci48QWxyZWFkeUFwcHJvdmVkAAEErENhbGwgaXMgYWxyZWFkeSBhcHByb3ZlZCBieSB0aGlzIHNpZ25hdG9yeS5ETm9BcHByb3ZhbHNOZWVkZWQAAgScQ2FsbCBkb2Vzbid0IG5lZWQgYW55IChtb3JlKSBhcHByb3ZhbHMuRFRvb0Zld1NpZ25hdG9yaWVzAAMEqFRoZXJlIGFyZSB0b28gZmV3IHNpZ25hdG9yaWVzIGluIHRoZSBsaXN0LkhUb29NYW55U2lnbmF0b3JpZXMABASsVGhlcmUgYXJlIHRvbyBtYW55IHNpZ25hdG9yaWVzIGluIHRoZSBsaXN0LlRTaWduYXRvcmllc091dE9mT3JkZXIABQQNAVRoZSBzaWduYXRvcmllcyB3ZXJlIHByb3ZpZGVkIG91dCBvZiBvcmRlcjsgdGhleSBzaG91bGQgYmUgb3JkZXJlZC5MU2VuZGVySW5TaWduYXRvcmllcwAGBA0BVGhlIHNlbmRlciB3YXMgY29udGFpbmVkIGluIHRoZSBvdGhlciBzaWduYXRvcmllczsgaXQgc2hvdWxkbid0IGJlLiBOb3RGb3VuZAAHBKBNdWx0aXNpZyBvcGVyYXRpb24gbm90IGZvdW5kIGluIHN0b3JhZ2UuIE5vdE93bmVyAAgIUQFPbmx5IHRoZSBhY2NvdW50IHRoYXQgb3JpZ2luYWxseSBjcmVhdGVkIHRoZSBtdWx0aXNpZyBpcyBhYmxlIHRvIGNhbmNlbCBpdCBvciB1cGRhdGU0aXRzIGRlcG9zaXRzLixOb1RpbWVwb2ludAAJBB0BTm8gdGltZXBvaW50IHdhcyBnaXZlbiwgeWV0IHRoZSBtdWx0aXNpZyBvcGVyYXRpb24gaXMgYWxyZWFkeSB1bmRlcndheS44V3JvbmdUaW1lcG9pbnQACgQtAUEgZGlmZmVyZW50IHRpbWVwb2ludCB3YXMgZ2l2ZW4gdG8gdGhlIG11bHRpc2lnIG9wZXJhdGlvbiB0aGF0IGlzIHVuZGVyd2F5LkxVbmV4cGVjdGVkVGltZXBvaW50AAsE9EEgdGltZXBvaW50IHdhcyBnaXZlbiwgeWV0IG5vIG11bHRpc2lnIG9wZXJhdGlvbiBpcyB1bmRlcndheS48TWF4V2VpZ2h0VG9vTG93AAwE0FRoZSBtYXhpbXVtIHdlaWdodCBpbmZvcm1hdGlvbiBwcm92aWRlZCB3YXMgdG9vIGxvdy40QWxyZWFkeVN0b3JlZAANBKBUaGUgZGF0YSB0byBiZSBzdG9yZWQgaXMgYWxyZWFkeSBzdG9yZWQuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0Lp0LCJBwYWxsZXRfZWxlY3Rpb25fcHJvdmlkZXJfbXVsdGlfcGhhc2U0UmVhZHlTb2x1dGlvbgwkQWNjb3VudElkAChNYXhXaW5uZXJzAExNYXhCYWNrZXJzUGVyV2lubmVyAAAMASBzdXBwb3J0c6ELAexCb3VuZGVkU3VwcG9ydHM8QWNjb3VudElkLCBNYXhXaW5uZXJzLCBNYXhCYWNrZXJzUGVyV2lubmVyPgABFHNjb3JlWQEBNEVsZWN0aW9uU2NvcmUAARxjb21wdXRlVQEBPEVsZWN0aW9uQ29tcHV0ZQAAoQsIfGZyYW1lX2VsZWN0aW9uX3Byb3ZpZGVyX3N1cHBvcnQ8Qm91bmRlZFN1cHBvcnRzDCRBY2NvdW50SWQBABhCT3V0ZXIAGEJJbm5lcgAABAClCwEJAUJvdW5kZWRWZWM8KEFjY291bnRJZCwgQm91bmRlZFN1cHBvcnQ8QWNjb3VudElkLCBCSW5uZXI+KSwgQk91dGVyPgAApQsMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAGpCwRTAAAEALULARhWZWM8VD4AAKkLAAAECACtCwCtCwh8ZnJhbWVfZWxlY3Rpb25fcHJvdmlkZXJfc3VwcG9ydDhCb3VuZGVkU3VwcG9ydAgkQWNjb3VudElkAQAUQm91bmQAAAgBFHRvdGFsGAE8RXh0ZW5kZWRCYWxhbmNlAAEYdm90ZXJzsQsBvEJvdW5kZWRWZWM8KEFjY291bnRJZCwgRXh0ZW5kZWRCYWxhbmNlKSwgQm91bmQ+AACxCwxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAb0EBFMAAAQAuQQBGFZlYzxUPgAAtQsAAAKpCwC5CwiQcGFsbGV0X2VsZWN0aW9uX3Byb3ZpZGVyX211bHRpX3BoYXNlNFJvdW5kU25hcHNob3QIJEFjY291bnRJZAEAJFZvdGVyVHlwZQG9CwAIARh2b3RlcnPBCwE4VmVjPFZvdGVyVHlwZT4AARx0YXJnZXRzAQIBOFZlYzxBY2NvdW50SWQ+AAC9CwAABAwAMDEKAMELAAACvQsAxQsMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAHJCwRTAAAEAM0LARhWZWM8VD4AAMkLAAAEDFkBEBAAzQsAAALJCwDRCwyQcGFsbGV0X2VsZWN0aW9uX3Byb3ZpZGVyX211bHRpX3BoYXNlGHNpZ25lZEBTaWduZWRTdWJtaXNzaW9uDCRBY2NvdW50SWQBABxCYWxhbmNlARggU29sdXRpb24B2QMAEAEMd2hvAAEkQWNjb3VudElkAAEcZGVwb3NpdBgBHEJhbGFuY2UAATByYXdfc29sdXRpb27VAwFUUmF3U29sdXRpb248U29sdXRpb24+AAEgY2FsbF9mZWUYARxCYWxhbmNlAADVCwyQcGFsbGV0X2VsZWN0aW9uX3Byb3ZpZGVyX211bHRpX3BoYXNlGHBhbGxldBRFcnJvcgQEVAABPGhQcmVEaXNwYXRjaEVhcmx5U3VibWlzc2lvbgAABGRTdWJtaXNzaW9uIHdhcyB0b28gZWFybHkubFByZURpc3BhdGNoV3JvbmdXaW5uZXJDb3VudAABBIhXcm9uZyBudW1iZXIgb2Ygd2lubmVycyBwcmVzZW50ZWQuZFByZURpc3BhdGNoV2Vha1N1Ym1pc3Npb24AAgSQU3VibWlzc2lvbiB3YXMgdG9vIHdlYWssIHNjb3JlLXdpc2UuPFNpZ25lZFF1ZXVlRnVsbAADBEkBVGhlIHF1ZXVlIHdhcyBmdWxsLCBhbmQgdGhlIHNvbHV0aW9uIHdhcyBub3QgYmV0dGVyIHRoYW4gYW55IG9mIHRoZSBleGlzdGluZyBvbmVzLlhTaWduZWRDYW5ub3RQYXlEZXBvc2l0AAQElFRoZSBvcmlnaW4gZmFpbGVkIHRvIHBheSB0aGUgZGVwb3NpdC5QU2lnbmVkSW52YWxpZFdpdG5lc3MABQSgV2l0bmVzcyBkYXRhIHRvIGRpc3BhdGNoYWJsZSBpcyBpbnZhbGlkLkxTaWduZWRUb29NdWNoV2VpZ2h0AAYEuFRoZSBzaWduZWQgc3VibWlzc2lvbiBjb25zdW1lcyB0b28gbXVjaCB3ZWlnaHQ8T2N3Q2FsbFdyb25nRXJhAAcEmE9DVyBzdWJtaXR0ZWQgc29sdXRpb24gZm9yIHdyb25nIHJvdW5kXE1pc3NpbmdTbmFwc2hvdE1ldGFkYXRhAAgEqFNuYXBzaG90IG1ldGFkYXRhIHNob3VsZCBleGlzdCBidXQgZGlkbid0LlhJbnZhbGlkU3VibWlzc2lvbkluZGV4AAkE0GBTZWxmOjppbnNlcnRfc3VibWlzc2lvbmAgcmV0dXJuZWQgYW4gaW52YWxpZCBpbmRleC44Q2FsbE5vdEFsbG93ZWQACgSYVGhlIGNhbGwgaXMgbm90IGFsbG93ZWQgYXQgdGhpcyBwb2ludC44RmFsbGJhY2tGYWlsZWQACwRMVGhlIGZhbGxiYWNrIGZhaWxlZCxCb3VuZE5vdE1ldAAMBEhTb21lIGJvdW5kIG5vdCBtZXQ4VG9vTWFueVdpbm5lcnMADQScU3VibWl0dGVkIHNvbHV0aW9uIGhhcyB0b28gbWFueSB3aW5uZXJzZFByZURpc3BhdGNoRGlmZmVyZW50Um91bmQADgS4U3VibWlzc2lvbiB3YXMgcHJlcGFyZWQgZm9yIGEgZGlmZmVyZW50IHJvdW5kLgQNAUVycm9yIG9mIHRoZSBwYWxsZXQgdGhhdCBjYW4gYmUgcmV0dXJuZWQgaW4gcmVzcG9uc2UgdG8gZGlzcGF0Y2hlcy7ZCwxAcGFsbGV0X2JhZ3NfbGlzdBBsaXN0EE5vZGUIBFQABEkAABQBCGlkAAEwVDo6QWNjb3VudElkAAEQcHJldjUBAVBPcHRpb248VDo6QWNjb3VudElkPgABEG5leHQ1AQFQT3B0aW9uPFQ6OkFjY291bnRJZD4AASRiYWdfdXBwZXIwASBUOjpTY29yZQABFHNjb3JlMAEgVDo6U2NvcmUAAN0LDEBwYWxsZXRfYmFnc19saXN0EGxpc3QMQmFnCARUAARJAAAIARBoZWFkNQEBUE9wdGlvbjxUOjpBY2NvdW50SWQ+AAEQdGFpbDUBAVBPcHRpb248VDo6QWNjb3VudElkPgAA4QsAAAIwAOULDEBwYWxsZXRfYmFnc19saXN0GHBhbGxldBRFcnJvcggEVAAESQABCBBMaXN0BADpCwEkTGlzdEVycm9yAAAEtEEgZXJyb3IgaW4gdGhlIGxpc3QgaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uLhhMb2NrZWQAAQTYQ291bGQgbm90IHVwZGF0ZSBhIG5vZGUsIGJlY2F1c2UgdGhlIHBhbGxldCBpcyBsb2NrZWQuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LukLDEBwYWxsZXRfYmFnc19saXN0EGxpc3QkTGlzdEVycm9yAAEUJER1cGxpY2F0ZQAAAChOb3RIZWF2aWVyAAEAME5vdEluU2FtZUJhZwACADBOb2RlTm90Rm91bmQAAwAYTG9ja2VkAAQAAO0LCFxwYWxsZXRfbm9taW5hdGlvbl9wb29scyhQb29sTWVtYmVyBARUAAAQARxwb29sX2lkEAEYUG9vbElkAAEYcG9pbnRzGAEwQmFsYW5jZU9mPFQ+AAFwbGFzdF9yZWNvcmRlZF9yZXdhcmRfY291bnRlci0IAUBUOjpSZXdhcmRDb3VudGVyAAE4dW5ib25kaW5nX2VyYXPxCwHgQm91bmRlZEJUcmVlTWFwPEVyYUluZGV4LCBCYWxhbmNlT2Y8VD4sIFQ6Ok1heFVuYm9uZGluZz4AAPELDExib3VuZGVkX2NvbGxlY3Rpb25zRGJvdW5kZWRfYnRyZWVfbWFwPEJvdW5kZWRCVHJlZU1hcAwESwEQBFYBGARTAAAEAPULAThCVHJlZU1hcDxLLCBWPgAA9QsEIEJUcmVlTWFwCARLARAEVgEYAAQA+QsAAAD5CwAAAv0LAP0LAAAECBAYAAEMCFxwYWxsZXRfbm9taW5hdGlvbl9wb29sczxCb25kZWRQb29sSW5uZXIEBFQAABQBKGNvbW1pc3Npb24FDAE0Q29tbWlzc2lvbjxUPgABOG1lbWJlcl9jb3VudGVyEAEMdTMyAAEYcG9pbnRzGAEwQmFsYW5jZU9mPFQ+AAEUcm9sZXMNDAFcUG9vbFJvbGVzPFQ6OkFjY291bnRJZD4AARRzdGF0ZW0BASRQb29sU3RhdGUAAAUMCFxwYWxsZXRfbm9taW5hdGlvbl9wb29scyhDb21taXNzaW9uBARUAAAUARxjdXJyZW50cQEBfE9wdGlvbjwoUGVyYmlsbCwgVDo6QWNjb3VudElkKT4AAQxtYXiJAQE8T3B0aW9uPFBlcmJpbGw+AAEsY2hhbmdlX3JhdGUJDAG8T3B0aW9uPENvbW1pc3Npb25DaGFuZ2VSYXRlPEJsb2NrTnVtYmVyRm9yPFQ+Pj4AATR0aHJvdHRsZV9mcm9tnAFkT3B0aW9uPEJsb2NrTnVtYmVyRm9yPFQ+PgABQGNsYWltX3Blcm1pc3Npb259AQG8T3B0aW9uPENvbW1pc3Npb25DbGFpbVBlcm1pc3Npb248VDo6QWNjb3VudElkPj4AAAkMBBhPcHRpb24EBFQBeQEBCBBOb25lAAAAEFNvbWUEAHkBAAABAAANDAhccGFsbGV0X25vbWluYXRpb25fcG9vbHMkUG9vbFJvbGVzBCRBY2NvdW50SWQBAAAQASRkZXBvc2l0b3IAASRBY2NvdW50SWQAARByb290NQEBRE9wdGlvbjxBY2NvdW50SWQ+AAEkbm9taW5hdG9yNQEBRE9wdGlvbjxBY2NvdW50SWQ+AAEcYm91bmNlcjUBAURPcHRpb248QWNjb3VudElkPgAAEQwIXHBhbGxldF9ub21pbmF0aW9uX3Bvb2xzKFJld2FyZFBvb2wEBFQAABQBcGxhc3RfcmVjb3JkZWRfcmV3YXJkX2NvdW50ZXItCAFAVDo6UmV3YXJkQ291bnRlcgABbGxhc3RfcmVjb3JkZWRfdG90YWxfcGF5b3V0cxgBMEJhbGFuY2VPZjxUPgABVHRvdGFsX3Jld2FyZHNfY2xhaW1lZBgBMEJhbGFuY2VPZjxUPgABYHRvdGFsX2NvbW1pc3Npb25fcGVuZGluZxgBMEJhbGFuY2VPZjxUPgABYHRvdGFsX2NvbW1pc3Npb25fY2xhaW1lZBgBMEJhbGFuY2VPZjxUPgAAFQwIXHBhbGxldF9ub21pbmF0aW9uX3Bvb2xzIFN1YlBvb2xzBARUAAAIARhub19lcmEZDAE0VW5ib25kUG9vbDxUPgABIHdpdGhfZXJhHQwBAQFCb3VuZGVkQlRyZWVNYXA8RXJhSW5kZXgsIFVuYm9uZFBvb2w8VD4sIFRvdGFsVW5ib25kaW5nUG9vbHM8VD4+AAAZDAhccGFsbGV0X25vbWluYXRpb25fcG9vbHMoVW5ib25kUG9vbAQEVAAACAEYcG9pbnRzGAEwQmFsYW5jZU9mPFQ+AAEcYmFsYW5jZRgBMEJhbGFuY2VPZjxUPgAAHQwMTGJvdW5kZWRfY29sbGVjdGlvbnNEYm91bmRlZF9idHJlZV9tYXA8Qm91bmRlZEJUcmVlTWFwDARLARAEVgEZDARTAAAEACEMAThCVHJlZU1hcDxLLCBWPgAAIQwEIEJUcmVlTWFwCARLARAEVgEZDAAEACUMAAAAJQwAAAIpDAApDAAABAgQGQwALQwINGZyYW1lX3N1cHBvcnQgUGFsbGV0SWQAAAQAJQMBHFt1ODsgOF0AADEMDFxwYWxsZXRfbm9taW5hdGlvbl9wb29scxhwYWxsZXQURXJyb3IEBFQAAZgwUG9vbE5vdEZvdW5kAAAEiEEgKGJvbmRlZCkgcG9vbCBpZCBkb2VzIG5vdCBleGlzdC5IUG9vbE1lbWJlck5vdEZvdW5kAAEEbEFuIGFjY291bnQgaXMgbm90IGEgbWVtYmVyLkhSZXdhcmRQb29sTm90Rm91bmQAAgQhAUEgcmV3YXJkIHBvb2wgZG9lcyBub3QgZXhpc3QuIEluIGFsbCBjYXNlcyB0aGlzIGlzIGEgc3lzdGVtIGxvZ2ljIGVycm9yLkBTdWJQb29sc05vdEZvdW5kAAMEaEEgc3ViIHBvb2wgZG9lcyBub3QgZXhpc3QuZEFjY291bnRCZWxvbmdzVG9PdGhlclBvb2wABAhNAUFuIGFjY291bnQgaXMgYWxyZWFkeSBkZWxlZ2F0aW5nIGluIGFub3RoZXIgcG9vbC4gQW4gYWNjb3VudCBtYXkgb25seSBiZWxvbmcgdG8gb25lPHBvb2wgYXQgYSB0aW1lLjhGdWxseVVuYm9uZGluZwAFCD0BVGhlIG1lbWJlciBpcyBmdWxseSB1bmJvbmRlZCAoYW5kIHRodXMgY2Fubm90IGFjY2VzcyB0aGUgYm9uZGVkIGFuZCByZXdhcmQgcG9vbKhhbnltb3JlIHRvLCBmb3IgZXhhbXBsZSwgY29sbGVjdCByZXdhcmRzKS5ETWF4VW5ib25kaW5nTGltaXQABgQJAVRoZSBtZW1iZXIgY2Fubm90IHVuYm9uZCBmdXJ0aGVyIGNodW5rcyBkdWUgdG8gcmVhY2hpbmcgdGhlIGxpbWl0LkRDYW5ub3RXaXRoZHJhd0FueQAHBE0BTm9uZSBvZiB0aGUgZnVuZHMgY2FuIGJlIHdpdGhkcmF3biB5ZXQgYmVjYXVzZSB0aGUgYm9uZGluZyBkdXJhdGlvbiBoYXMgbm90IHBhc3NlZC5ETWluaW11bUJvbmROb3RNZXQACBQpAVRoZSBhbW91bnQgZG9lcyBub3QgbWVldCB0aGUgbWluaW11bSBib25kIHRvIGVpdGhlciBqb2luIG9yIGNyZWF0ZSBhIHBvb2wuAFUBVGhlIGRlcG9zaXRvciBjYW4gbmV2ZXIgdW5ib25kIHRvIGEgdmFsdWUgbGVzcyB0aGFuIGBQYWxsZXQ6OmRlcG9zaXRvcl9taW5fYm9uZGAuIFRoZV0BY2FsbGVyIGRvZXMgbm90IGhhdmUgbm9taW5hdGluZyBwZXJtaXNzaW9ucyBmb3IgdGhlIHBvb2wuIE1lbWJlcnMgY2FuIG5ldmVyIHVuYm9uZCB0byBhaHZhbHVlIGJlbG93IGBNaW5Kb2luQm9uZGAuME92ZXJmbG93UmlzawAJBCEBVGhlIHRyYW5zYWN0aW9uIGNvdWxkIG5vdCBiZSBleGVjdXRlZCBkdWUgdG8gb3ZlcmZsb3cgcmlzayBmb3IgdGhlIHBvb2wuNE5vdERlc3Ryb3lpbmcACghdAUEgcG9vbCBtdXN0IGJlIGluIFtgUG9vbFN0YXRlOjpEZXN0cm95aW5nYF0gaW4gb3JkZXIgZm9yIHRoZSBkZXBvc2l0b3IgdG8gdW5ib25kIG9yIGZvcrhvdGhlciBtZW1iZXJzIHRvIGJlIHBlcm1pc3Npb25sZXNzbHkgdW5ib25kZWQuME5vdE5vbWluYXRvcgALBPRUaGUgY2FsbGVyIGRvZXMgbm90IGhhdmUgbm9taW5hdGluZyBwZXJtaXNzaW9ucyBmb3IgdGhlIHBvb2wuVE5vdEtpY2tlck9yRGVzdHJveWluZwAMBD0BRWl0aGVyIGEpIHRoZSBjYWxsZXIgY2Fubm90IG1ha2UgYSB2YWxpZCBraWNrIG9yIGIpIHRoZSBwb29sIGlzIG5vdCBkZXN0cm95aW5nLhxOb3RPcGVuAA0EcFRoZSBwb29sIGlzIG5vdCBvcGVuIHRvIGpvaW4gTWF4UG9vbHMADgSEVGhlIHN5c3RlbSBpcyBtYXhlZCBvdXQgb24gcG9vbHMuOE1heFBvb2xNZW1iZXJzAA8EnFRvbyBtYW55IG1lbWJlcnMgaW4gdGhlIHBvb2wgb3Igc3lzdGVtLkRDYW5Ob3RDaGFuZ2VTdGF0ZQAQBIhUaGUgcG9vbHMgc3RhdGUgY2Fubm90IGJlIGNoYW5nZWQuVERvZXNOb3RIYXZlUGVybWlzc2lvbgARBLhUaGUgY2FsbGVyIGRvZXMgbm90IGhhdmUgYWRlcXVhdGUgcGVybWlzc2lvbnMuVE1ldGFkYXRhRXhjZWVkc01heExlbgASBKxNZXRhZGF0YSBleGNlZWRzIFtgQ29uZmlnOjpNYXhNZXRhZGF0YUxlbmBdJERlZmVuc2l2ZQQANQwBOERlZmVuc2l2ZUVycm9yABMIMQFTb21lIGVycm9yIG9jY3VycmVkIHRoYXQgc2hvdWxkIG5ldmVyIGhhcHBlbi4gVGhpcyBzaG91bGQgYmUgcmVwb3J0ZWQgdG8gdGhlMG1haW50YWluZXJzLpxQYXJ0aWFsVW5ib25kTm90QWxsb3dlZFBlcm1pc3Npb25sZXNzbHkAFAS8UGFydGlhbCB1bmJvbmRpbmcgbm93IGFsbG93ZWQgcGVybWlzc2lvbmxlc3NseS5cTWF4Q29tbWlzc2lvblJlc3RyaWN0ZWQAFQQdAVRoZSBwb29sJ3MgbWF4IGNvbW1pc3Npb24gY2Fubm90IGJlIHNldCBoaWdoZXIgdGhhbiB0aGUgZXhpc3RpbmcgdmFsdWUuYENvbW1pc3Npb25FeGNlZWRzTWF4aW11bQAWBOxUaGUgc3VwcGxpZWQgY29tbWlzc2lvbiBleGNlZWRzIHRoZSBtYXggYWxsb3dlZCBjb21taXNzaW9uLnhDb21taXNzaW9uRXhjZWVkc0dsb2JhbE1heGltdW0AFwToVGhlIHN1cHBsaWVkIGNvbW1pc3Npb24gZXhjZWVkcyBnbG9iYWwgbWF4aW11bSBjb21taXNzaW9uLmRDb21taXNzaW9uQ2hhbmdlVGhyb3R0bGVkABgECQFOb3QgZW5vdWdoIGJsb2NrcyBoYXZlIHN1cnBhc3NlZCBzaW5jZSB0aGUgbGFzdCBjb21taXNzaW9uIHVwZGF0ZS54Q29tbWlzc2lvbkNoYW5nZVJhdGVOb3RBbGxvd2VkABkEAQFUaGUgc3VibWl0dGVkIGNoYW5nZXMgdG8gY29tbWlzc2lvbiBjaGFuZ2UgcmF0ZSBhcmUgbm90IGFsbG93ZWQuTE5vUGVuZGluZ0NvbW1pc3Npb24AGgSgVGhlcmUgaXMgbm8gcGVuZGluZyBjb21taXNzaW9uIHRvIGNsYWltLlhOb0NvbW1pc3Npb25DdXJyZW50U2V0ABsEjE5vIGNvbW1pc3Npb24gY3VycmVudCBoYXMgYmVlbiBzZXQuLFBvb2xJZEluVXNlABwEZFBvb2wgaWQgY3VycmVudGx5IGluIHVzZS40SW52YWxpZFBvb2xJZAAdBJxQb29sIGlkIHByb3ZpZGVkIGlzIG5vdCBjb3JyZWN0L3VzYWJsZS5MQm9uZEV4dHJhUmVzdHJpY3RlZAAeBPxCb25kaW5nIGV4dHJhIGlzIHJlc3RyaWN0ZWQgdG8gdGhlIGV4YWN0IHBlbmRpbmcgcmV3YXJkIGFtb3VudC48Tm90aGluZ1RvQWRqdXN0AB8EsE5vIGltYmFsYW5jZSBpbiB0aGUgRUQgZGVwb3NpdCBmb3IgdGhlIHBvb2wuOE5vdGhpbmdUb1NsYXNoACAEzE5vIHNsYXNoIHBlbmRpbmcgdGhhdCBjYW4gYmUgYXBwbGllZCB0byB0aGUgbWVtYmVyLixTbGFzaFRvb0xvdwAhBKhUaGUgc2xhc2ggYW1vdW50IGlzIHRvbyBsb3cgdG8gYmUgYXBwbGllZC48QWxyZWFkeU1pZ3JhdGVkACIEFQFUaGUgcG9vbCBvciBtZW1iZXIgZGVsZWdhdGlvbiBoYXMgYWxyZWFkeSBtaWdyYXRlZCB0byBkZWxlZ2F0ZSBzdGFrZS4sTm90TWlncmF0ZWQAIwQVAVRoZSBwb29sIG9yIG1lbWJlciBkZWxlZ2F0aW9uIGhhcyBub3QgbWlncmF0ZWQgeWV0IHRvIGRlbGVnYXRlIHN0YWtlLjBOb3RTdXBwb3J0ZWQAJATwVGhpcyBjYWxsIGlzIG5vdCBhbGxvd2VkIGluIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBwYWxsZXQuKFJlc3RyaWN0ZWQAJQhRAUFjY291bnQgaXMgcmVzdHJpY3RlZCBmcm9tIHBhcnRpY2lwYXRpb24gaW4gcG9vbHMuIFRoaXMgbWF5IGhhcHBlbiBpZiB0aGUgYWNjb3VudCBpc3xzdGFraW5nIGluIGFub3RoZXIgd2F5IGFscmVhZHkuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LjUMDFxwYWxsZXRfbm9taW5hdGlvbl9wb29scxhwYWxsZXQ4RGVmZW5zaXZlRXJyb3IAARxoTm90RW5vdWdoU3BhY2VJblVuYm9uZFBvb2wAAAAwUG9vbE5vdEZvdW5kAAEASFJld2FyZFBvb2xOb3RGb3VuZAACAEBTdWJQb29sc05vdEZvdW5kAAMAcEJvbmRlZFN0YXNoS2lsbGVkUHJlbWF0dXJlbHkABABURGVsZWdhdGlvblVuc3VwcG9ydGVkAAUAPFNsYXNoTm90QXBwbGllZAAGAAA5DAxMcGFsbGV0X2Zhc3RfdW5zdGFrZRR0eXBlczhVbnN0YWtlUmVxdWVzdAQEVAAACAEcc3Rhc2hlcz0MAdhCb3VuZGVkVmVjPChUOjpBY2NvdW50SWQsIEJhbGFuY2VPZjxUPiksIFQ6OkJhdGNoU2l6ZT4AARxjaGVja2VkQQwBkEJvdW5kZWRWZWM8RXJhSW5kZXgsIE1heENoZWNraW5nPFQ+PgAAPQwMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAG9BARTAAAEALkEARhWZWM8VD4AAEEMDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBEARTAAAEAJEBARhWZWM8VD4AAEUMDExwYWxsZXRfZmFzdF91bnN0YWtlGHBhbGxldBRFcnJvcgQEVAABGDROb3RDb250cm9sbGVyAAAMuFRoZSBwcm92aWRlZCBDb250cm9sbGVyIGFjY291bnQgd2FzIG5vdCBmb3VuZC4AwFRoaXMgbWVhbnMgdGhhdCB0aGUgZ2l2ZW4gYWNjb3VudCBpcyBub3QgYm9uZGVkLjRBbHJlYWR5UXVldWVkAAEErFRoZSBib25kZWQgYWNjb3VudCBoYXMgYWxyZWFkeSBiZWVuIHF1ZXVlZC44Tm90RnVsbHlCb25kZWQAAgS8VGhlIGJvbmRlZCBhY2NvdW50IGhhcyBhY3RpdmUgdW5sb2NraW5nIGNodW5rcy4kTm90UXVldWVkAAMEtFRoZSBwcm92aWRlZCB1bi1zdGFrZXIgaXMgbm90IGluIHRoZSBgUXVldWVgLixBbHJlYWR5SGVhZAAEBAUBVGhlIHByb3ZpZGVkIHVuLXN0YWtlciBpcyBhbHJlYWR5IGluIEhlYWQsIGFuZCBjYW5ub3QgZGVyZWdpc3Rlci44Q2FsbE5vdEFsbG93ZWQABQQdAVRoZSBjYWxsIGlzIG5vdCBhbGxvd2VkIGF0IHRoaXMgcG9pbnQgYmVjYXVzZSB0aGUgcGFsbGV0IGlzIG5vdCBhY3RpdmUuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LkkMAAAECABBAQBNDAxgcGFsbGV0X2NvbnZpY3Rpb25fdm90aW5nEHZvdGUYVm90aW5nFBxCYWxhbmNlARgkQWNjb3VudElkAQAsQmxvY2tOdW1iZXIBECRQb2xsSW5kZXgBECBNYXhWb3RlcwABCBxDYXN0aW5nBABRDAHIQ2FzdGluZzxCYWxhbmNlLCBCbG9ja051bWJlciwgUG9sbEluZGV4LCBNYXhWb3Rlcz4AAAAoRGVsZWdhdGluZwQAaQwBrERlbGVnYXRpbmc8QmFsYW5jZSwgQWNjb3VudElkLCBCbG9ja051bWJlcj4AAQAAUQwMYHBhbGxldF9jb252aWN0aW9uX3ZvdGluZxB2b3RlHENhc3RpbmcQHEJhbGFuY2UBGCxCbG9ja051bWJlcgEQJFBvbGxJbmRleAEQIE1heFZvdGVzAAAMARR2b3Rlc1UMAdxCb3VuZGVkVmVjPChQb2xsSW5kZXgsIEFjY291bnRWb3RlPEJhbGFuY2U+KSwgTWF4Vm90ZXM+AAEsZGVsZWdhdGlvbnNhDAFQRGVsZWdhdGlvbnM8QmFsYW5jZT4AARRwcmlvcmUMAXxQcmlvckxvY2s8QmxvY2tOdW1iZXIsIEJhbGFuY2U+AABVDAxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAVkMBFMAAAQAXQwBGFZlYzxUPgAAWQwAAAQIEJkBAF0MAAACWQwAYQwMYHBhbGxldF9jb252aWN0aW9uX3ZvdGluZxR0eXBlcyxEZWxlZ2F0aW9ucwQcQmFsYW5jZQEYAAgBFHZvdGVzGAEcQmFsYW5jZQABHGNhcGl0YWwYARxCYWxhbmNlAABlDAxgcGFsbGV0X2NvbnZpY3Rpb25fdm90aW5nEHZvdGUkUHJpb3JMb2NrCCxCbG9ja051bWJlcgEQHEJhbGFuY2UBGAAIABABLEJsb2NrTnVtYmVyAAAYARxCYWxhbmNlAABpDAxgcGFsbGV0X2NvbnZpY3Rpb25fdm90aW5nEHZvdGUoRGVsZWdhdGluZwwcQmFsYW5jZQEYJEFjY291bnRJZAEALEJsb2NrTnVtYmVyARAAFAEcYmFsYW5jZRgBHEJhbGFuY2UAARh0YXJnZXQAASRBY2NvdW50SWQAAShjb252aWN0aW9u5QQBKENvbnZpY3Rpb24AASxkZWxlZ2F0aW9uc2EMAVBEZWxlZ2F0aW9uczxCYWxhbmNlPgABFHByaW9yZQwBfFByaW9yTG9jazxCbG9ja051bWJlciwgQmFsYW5jZT4AAG0MDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBcQwEUwAABAB1DAEYVmVjPFQ+AABxDAAABAhBARgAdQwAAAJxDAB5DAxgcGFsbGV0X2NvbnZpY3Rpb25fdm90aW5nGHBhbGxldBRFcnJvcggEVAAESQABMChOb3RPbmdvaW5nAAAEUFBvbGwgaXMgbm90IG9uZ29pbmcuIE5vdFZvdGVyAAEErFRoZSBnaXZlbiBhY2NvdW50IGRpZCBub3Qgdm90ZSBvbiB0aGUgcG9sbC4wTm9QZXJtaXNzaW9uAAIEyFRoZSBhY3RvciBoYXMgbm8gcGVybWlzc2lvbiB0byBjb25kdWN0IHRoZSBhY3Rpb24uPE5vUGVybWlzc2lvbllldAADBFkBVGhlIGFjdG9yIGhhcyBubyBwZXJtaXNzaW9uIHRvIGNvbmR1Y3QgdGhlIGFjdGlvbiByaWdodCBub3cgYnV0IHdpbGwgZG8gaW4gdGhlIGZ1dHVyZS5EQWxyZWFkeURlbGVnYXRpbmcABASIVGhlIGFjY291bnQgaXMgYWxyZWFkeSBkZWxlZ2F0aW5nLjRBbHJlYWR5Vm90aW5nAAUIVQFUaGUgYWNjb3VudCBjdXJyZW50bHkgaGFzIHZvdGVzIGF0dGFjaGVkIHRvIGl0IGFuZCB0aGUgb3BlcmF0aW9uIGNhbm5vdCBzdWNjZWVkIHVudGlsoHRoZXNlIGFyZSByZW1vdmVkIHRocm91Z2ggYHJlbW92ZV92b3RlYC5ESW5zdWZmaWNpZW50RnVuZHMABgT8VG9vIGhpZ2ggYSBiYWxhbmNlIHdhcyBwcm92aWRlZCB0aGF0IHRoZSBhY2NvdW50IGNhbm5vdCBhZmZvcmQuNE5vdERlbGVnYXRpbmcABwSgVGhlIGFjY291bnQgaXMgbm90IGN1cnJlbnRseSBkZWxlZ2F0aW5nLiBOb25zZW5zZQAIBJREZWxlZ2F0aW9uIHRvIG9uZXNlbGYgbWFrZXMgbm8gc2Vuc2UuPE1heFZvdGVzUmVhY2hlZAAJBIBNYXhpbXVtIG51bWJlciBvZiB2b3RlcyByZWFjaGVkLixDbGFzc05lZWRlZAAKBDkBVGhlIGNsYXNzIG11c3QgYmUgc3VwcGxpZWQgc2luY2UgaXQgaXMgbm90IGVhc2lseSBkZXRlcm1pbmFibGUgZnJvbSB0aGUgc3RhdGUuIEJhZENsYXNzAAsEhFRoZSBjbGFzcyBJRCBzdXBwbGllZCBpcyBpbnZhbGlkLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC59DAxAcGFsbGV0X3JlZmVyZW5kYRR0eXBlczhSZWZlcmVuZHVtSW5mbyAcVHJhY2tJZAFBATRSdW50aW1lT3JpZ2luAaECGE1vbWVudAEQEENhbGwBpQEcQmFsYW5jZQEYFFRhbGx5Aa0IJEFjY291bnRJZAEAPFNjaGVkdWxlQWRkcmVzcwElAQEYHE9uZ29pbmcEAIEMAY0BUmVmZXJlbmR1bVN0YXR1czxUcmFja0lkLCBSdW50aW1lT3JpZ2luLCBNb21lbnQsIENhbGwsIEJhbGFuY2UsIFRhbGx5LApBY2NvdW50SWQsIFNjaGVkdWxlQWRkcmVzcyw+AAAAIEFwcHJvdmVkDAAQARhNb21lbnQAAIkMAYxPcHRpb248RGVwb3NpdDxBY2NvdW50SWQsIEJhbGFuY2U+PgAAiQwBjE9wdGlvbjxEZXBvc2l0PEFjY291bnRJZCwgQmFsYW5jZT4+AAEAIFJlamVjdGVkDAAQARhNb21lbnQAAIkMAYxPcHRpb248RGVwb3NpdDxBY2NvdW50SWQsIEJhbGFuY2U+PgAAiQwBjE9wdGlvbjxEZXBvc2l0PEFjY291bnRJZCwgQmFsYW5jZT4+AAIAJENhbmNlbGxlZAwAEAEYTW9tZW50AACJDAGMT3B0aW9uPERlcG9zaXQ8QWNjb3VudElkLCBCYWxhbmNlPj4AAIkMAYxPcHRpb248RGVwb3NpdDxBY2NvdW50SWQsIEJhbGFuY2U+PgADACBUaW1lZE91dAwAEAEYTW9tZW50AACJDAGMT3B0aW9uPERlcG9zaXQ8QWNjb3VudElkLCBCYWxhbmNlPj4AAIkMAYxPcHRpb248RGVwb3NpdDxBY2NvdW50SWQsIEJhbGFuY2U+PgAEABhLaWxsZWQEABABGE1vbWVudAAFAACBDAxAcGFsbGV0X3JlZmVyZW5kYRR0eXBlc0BSZWZlcmVuZHVtU3RhdHVzIBxUcmFja0lkAUEBNFJ1bnRpbWVPcmlnaW4BoQIYTW9tZW50ARAQQ2FsbAGlARxCYWxhbmNlARgUVGFsbHkBrQgkQWNjb3VudElkAQA8U2NoZWR1bGVBZGRyZXNzASUBACwBFHRyYWNrQQEBHFRyYWNrSWQAARhvcmlnaW6hAgE0UnVudGltZU9yaWdpbgABIHByb3Bvc2FspQEBEENhbGwAASRlbmFjdG1lbnTxBAFQRGlzcGF0Y2hUaW1lPE1vbWVudD4AASRzdWJtaXR0ZWQQARhNb21lbnQAAUhzdWJtaXNzaW9uX2RlcG9zaXSFDAFsRGVwb3NpdDxBY2NvdW50SWQsIEJhbGFuY2U+AAFAZGVjaXNpb25fZGVwb3NpdIkMAYxPcHRpb248RGVwb3NpdDxBY2NvdW50SWQsIEJhbGFuY2U+PgABIGRlY2lkaW5njQwBeE9wdGlvbjxEZWNpZGluZ1N0YXR1czxNb21lbnQ+PgABFHRhbGx5rQgBFFRhbGx5AAEgaW5fcXVldWUgARBib29sAAEUYWxhcm2VDAGET3B0aW9uPChNb21lbnQsIFNjaGVkdWxlQWRkcmVzcyk+AACFDAxAcGFsbGV0X3JlZmVyZW5kYRR0eXBlcxxEZXBvc2l0CCRBY2NvdW50SWQBABxCYWxhbmNlARgACAEMd2hvAAEkQWNjb3VudElkAAEYYW1vdW50GAEcQmFsYW5jZQAAiQwEGE9wdGlvbgQEVAGFDAEIEE5vbmUAAAAQU29tZQQAhQwAAAEAAI0MBBhPcHRpb24EBFQBkQwBCBBOb25lAAAAEFNvbWUEAJEMAAABAACRDAxAcGFsbGV0X3JlZmVyZW5kYRR0eXBlczhEZWNpZGluZ1N0YXR1cwQsQmxvY2tOdW1iZXIBEAAIARRzaW5jZRABLEJsb2NrTnVtYmVyAAEoY29uZmlybWluZ5wBTE9wdGlvbjxCbG9ja051bWJlcj4AAJUMBBhPcHRpb24EBFQBmQwBCBBOb25lAAAAEFNvbWUEAJkMAAABAACZDAAABAgQJQEAnQwMTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAH9CwRTAAAEAPkLARhWZWM8VD4AAKEMAAACpQwApQwAAAQIQQGpDACpDAxAcGFsbGV0X3JlZmVyZW5kYRR0eXBlczBUcmFja0RldGFpbHMMHEJhbGFuY2UBGBhNb21lbnQBEBBOYW1lAU0JACQBEG5hbWVNCQEQTmFtZQABMG1heF9kZWNpZGluZxABDHUzMgABQGRlY2lzaW9uX2RlcG9zaXQYARxCYWxhbmNlAAE4cHJlcGFyZV9wZXJpb2QQARhNb21lbnQAATxkZWNpc2lvbl9wZXJpb2QQARhNb21lbnQAAThjb25maXJtX3BlcmlvZBABGE1vbWVudAABUG1pbl9lbmFjdG1lbnRfcGVyaW9kEAEYTW9tZW50AAEwbWluX2FwcHJvdmFsrQwBFEN1cnZlAAEsbWluX3N1cHBvcnStDAEUQ3VydmUAAK0MDEBwYWxsZXRfcmVmZXJlbmRhFHR5cGVzFEN1cnZlAAEMQExpbmVhckRlY3JlYXNpbmcMARhsZW5ndGiYARxQZXJiaWxsAAEUZmxvb3KYARxQZXJiaWxsAAEQY2VpbJgBHFBlcmJpbGwAAABEU3RlcHBlZERlY3JlYXNpbmcQARRiZWdpbpgBHFBlcmJpbGwAAQxlbmSYARxQZXJiaWxsAAEQc3RlcJgBHFBlcmJpbGwAARhwZXJpb2SYARxQZXJiaWxsAAEAKFJlY2lwcm9jYWwMARhmYWN0b3KxDAEgRml4ZWRJNjQAASB4X29mZnNldLEMASBGaXhlZEk2NAABIHlfb2Zmc2V0sQwBIEZpeGVkSTY0AAIAALEMDDRzcF9hcml0aG1ldGljLGZpeGVkX3BvaW50IEZpeGVkSTY0AAAEALUMAQxpNjQAALUMAAAFDAC5DAxAcGFsbGV0X3JlZmVyZW5kYRhwYWxsZXQURXJyb3IIBFQABEkAATgoTm90T25nb2luZwAABGhSZWZlcmVuZHVtIGlzIG5vdCBvbmdvaW5nLihIYXNEZXBvc2l0AAEEuFJlZmVyZW5kdW0ncyBkZWNpc2lvbiBkZXBvc2l0IGlzIGFscmVhZHkgcGFpZC4gQmFkVHJhY2sAAgScVGhlIHRyYWNrIGlkZW50aWZpZXIgZ2l2ZW4gd2FzIGludmFsaWQuEEZ1bGwAAwQxAVRoZXJlIGFyZSBhbHJlYWR5IGEgZnVsbCBjb21wbGVtZW50IG9mIHJlZmVyZW5kYSBpbiBwcm9ncmVzcyBmb3IgdGhpcyB0cmFjay4oUXVldWVFbXB0eQAEBIBUaGUgcXVldWUgb2YgdGhlIHRyYWNrIGlzIGVtcHR5LjRCYWRSZWZlcmVuZHVtAAUE5FRoZSByZWZlcmVuZHVtIGluZGV4IHByb3ZpZGVkIGlzIGludmFsaWQgaW4gdGhpcyBjb250ZXh0LixOb3RoaW5nVG9EbwAGBKxUaGVyZSB3YXMgbm90aGluZyB0byBkbyBpbiB0aGUgYWR2YW5jZW1lbnQuHE5vVHJhY2sABwSgTm8gdHJhY2sgZXhpc3RzIGZvciB0aGUgcHJvcG9zYWwgb3JpZ2luLihVbmZpbmlzaGVkAAgEAQFBbnkgZGVwb3NpdCBjYW5ub3QgYmUgcmVmdW5kZWQgdW50aWwgYWZ0ZXIgdGhlIGRlY2lzaW9uIGlzIG92ZXIuME5vUGVybWlzc2lvbgAJBKhUaGUgZGVwb3NpdCByZWZ1bmRlciBpcyBub3QgdGhlIGRlcG9zaXRvci4kTm9EZXBvc2l0AAoEzFRoZSBkZXBvc2l0IGNhbm5vdCBiZSByZWZ1bmRlZCBzaW5jZSBub25lIHdhcyBtYWRlLiRCYWRTdGF0dXMACwTQVGhlIHJlZmVyZW5kdW0gc3RhdHVzIGlzIGludmFsaWQgZm9yIHRoaXMgb3BlcmF0aW9uLkBQcmVpbWFnZU5vdEV4aXN0AAwEcFRoZSBwcmVpbWFnZSBkb2VzIG5vdCBleGlzdC6EUHJlaW1hZ2VTdG9yZWRXaXRoRGlmZmVyZW50TGVuZ3RoAA0EFQFUaGUgcHJlaW1hZ2UgaXMgc3RvcmVkIHdpdGggYSBkaWZmZXJlbnQgbGVuZ3RoIHRoYW4gdGhlIG9uZSBwcm92aWRlZC4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQuvQwMQHBhbGxldF93aGl0ZWxpc3QYcGFsbGV0FEVycm9yBARUAAEUTFVuYXZhaWxhYmxlUHJlSW1hZ2UAAATIVGhlIHByZWltYWdlIG9mIHRoZSBjYWxsIGhhc2ggY291bGQgbm90IGJlIGxvYWRlZC48VW5kZWNvZGFibGVDYWxsAAEEeFRoZSBjYWxsIGNvdWxkIG5vdCBiZSBkZWNvZGVkLmBJbnZhbGlkQ2FsbFdlaWdodFdpdG5lc3MAAgTsVGhlIHdlaWdodCBvZiB0aGUgZGVjb2RlZCBjYWxsIHdhcyBoaWdoZXIgdGhhbiB0aGUgd2l0bmVzcy5QQ2FsbElzTm90V2hpdGVsaXN0ZWQAAwR0VGhlIGNhbGwgd2FzIG5vdCB3aGl0ZWxpc3RlZC5YQ2FsbEFscmVhZHlXaGl0ZWxpc3RlZAAEBKBUaGUgY2FsbCB3YXMgYWxyZWFkeSB3aGl0ZWxpc3RlZDsgTm8tT3AuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LsEMCDxwYWxsZXRfdHJlYXN1cnkgUHJvcG9zYWwIJEFjY291bnRJZAEAHEJhbGFuY2UBGAAQASBwcm9wb3NlcgABJEFjY291bnRJZAABFHZhbHVlGAEcQmFsYW5jZQABLGJlbmVmaWNpYXJ5AAEkQWNjb3VudElkAAEQYm9uZBgBHEJhbGFuY2UAAMUMDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBEARTAAAEAJEBARhWZWM8VD4AAMkMCDxwYWxsZXRfdHJlYXN1cnksU3BlbmRTdGF0dXMUJEFzc2V0S2luZAEBBTBBc3NldEJhbGFuY2UBGCxCZW5lZmljaWFyeQFZBSxCbG9ja051bWJlcgEQJFBheW1lbnRJZAEwABgBKGFzc2V0X2tpbmQBBQEkQXNzZXRLaW5kAAEYYW1vdW50GAEwQXNzZXRCYWxhbmNlAAEsYmVuZWZpY2lhcnlZBQEsQmVuZWZpY2lhcnkAASh2YWxpZF9mcm9tEAEsQmxvY2tOdW1iZXIAASRleHBpcmVfYXQQASxCbG9ja051bWJlcgABGHN0YXR1c80MAVxQYXltZW50U3RhdGU8UGF5bWVudElkPgAAzQwIPHBhbGxldF90cmVhc3VyeTBQYXltZW50U3RhdGUECElkATABDBxQZW5kaW5nAAAAJEF0dGVtcHRlZAQBCGlkMAEISWQAAQAYRmFpbGVkAAIAANEMDDRzcF9hcml0aG1ldGljKHBlcl90aGluZ3McUGVybWlsbAAABAAQAQx1MzIAANUMDDxwYWxsZXRfdHJlYXN1cnkYcGFsbGV0FEVycm9yCARUAARJAAEsMEludmFsaWRJbmRleAAABKxObyBwcm9wb3NhbCwgYm91bnR5IG9yIHNwZW5kIGF0IHRoYXQgaW5kZXguQFRvb01hbnlBcHByb3ZhbHMAAQSAVG9vIG1hbnkgYXBwcm92YWxzIGluIHRoZSBxdWV1ZS5YSW5zdWZmaWNpZW50UGVybWlzc2lvbgACCEUBVGhlIHNwZW5kIG9yaWdpbiBpcyB2YWxpZCBidXQgdGhlIGFtb3VudCBpdCBpcyBhbGxvd2VkIHRvIHNwZW5kIGlzIGxvd2VyIHRoYW4gdGhlTGFtb3VudCB0byBiZSBzcGVudC5MUHJvcG9zYWxOb3RBcHByb3ZlZAADBHxQcm9wb3NhbCBoYXMgbm90IGJlZW4gYXBwcm92ZWQuWEZhaWxlZFRvQ29udmVydEJhbGFuY2UABARRAVRoZSBiYWxhbmNlIG9mIHRoZSBhc3NldCBraW5kIGlzIG5vdCBjb252ZXJ0aWJsZSB0byB0aGUgYmFsYW5jZSBvZiB0aGUgbmF0aXZlIGFzc2V0LjBTcGVuZEV4cGlyZWQABQSwVGhlIHNwZW5kIGhhcyBleHBpcmVkIGFuZCBjYW5ub3QgYmUgY2xhaW1lZC4sRWFybHlQYXlvdXQABgSkVGhlIHNwZW5kIGlzIG5vdCB5ZXQgZWxpZ2libGUgZm9yIHBheW91dC5AQWxyZWFkeUF0dGVtcHRlZAAHBJxUaGUgcGF5bWVudCBoYXMgYWxyZWFkeSBiZWVuIGF0dGVtcHRlZC4sUGF5b3V0RXJyb3IACATMVGhlcmUgd2FzIHNvbWUgaXNzdWUgd2l0aCB0aGUgbWVjaGFuaXNtIG9mIHBheW1lbnQuME5vdEF0dGVtcHRlZAAJBKRUaGUgcGF5b3V0IHdhcyBub3QgeWV0IGF0dGVtcHRlZC9jbGFpbWVkLjBJbmNvbmNsdXNpdmUACgTEVGhlIHBheW1lbnQgaGFzIG5laXRoZXIgZmFpbGVkIG5vciBzdWNjZWVkZWQgeWV0LgR4RXJyb3IgZm9yIHRoZSB0cmVhc3VyeSBwYWxsZXQu2QwMYHBhbGxldF9kZWxlZ2F0ZWRfc3Rha2luZxR0eXBlcyhEZWxlZ2F0aW9uBARUAAAIARRhZ2VudAABMFQ6OkFjY291bnRJZAABGGFtb3VudBgBMEJhbGFuY2VPZjxUPgAA3QwMYHBhbGxldF9kZWxlZ2F0ZWRfc3Rha2luZxR0eXBlcyxBZ2VudExlZGdlcgQEVAAAEAEUcGF5ZWUAATBUOjpBY2NvdW50SWQAATx0b3RhbF9kZWxlZ2F0ZWT9AQEwQmFsYW5jZU9mPFQ+AAFUdW5jbGFpbWVkX3dpdGhkcmF3YWxz/QEBMEJhbGFuY2VPZjxUPgABNHBlbmRpbmdfc2xhc2j9AQEwQmFsYW5jZU9mPFQ+AADhDAxgcGFsbGV0X2RlbGVnYXRlZF9zdGFraW5nGHBhbGxldBRFcnJvcgQEVAABMChOb3RBbGxvd2VkAAAEqFRoZSBhY2NvdW50IGNhbm5vdCBwZXJmb3JtIHRoaXMgb3BlcmF0aW9uLjhBbHJlYWR5U3Rha2luZwABBLhBbiBleGlzdGluZyBzdGFrZXIgY2Fubm90IHBlcmZvcm0gdGhpcyBhY3Rpb24uYEludmFsaWRSZXdhcmREZXN0aW5hdGlvbgACBNRSZXdhcmQgRGVzdGluYXRpb24gY2Fubm90IGJlIHNhbWUgYXMgYEFnZW50YCBhY2NvdW50LkRJbnZhbGlkRGVsZWdhdGlvbgADFIhEZWxlZ2F0aW9uIGNvbmRpdGlvbnMgYXJlIG5vdCBtZXQuAExQb3NzaWJsZSBpc3N1ZXMgYXJlbDEpIENhbm5vdCBkZWxlZ2F0ZSB0byBzZWxmLKQyKSBDYW5ub3QgZGVsZWdhdGUgdG8gbXVsdGlwbGUgZGVsZWdhdGVzLjhOb3RFbm91Z2hGdW5kcwAEBAEBVGhlIGFjY291bnQgZG9lcyBub3QgaGF2ZSBlbm91Z2ggZnVuZHMgdG8gcGVyZm9ybSB0aGUgb3BlcmF0aW9uLiBOb3RBZ2VudAAFBIBOb3QgYW4gZXhpc3RpbmcgYEFnZW50YCBhY2NvdW50LjBOb3REZWxlZ2F0b3IABgRgTm90IGEgRGVsZWdhdG9yIGFjY291bnQuIEJhZFN0YXRlAAcEiFNvbWUgY29ycnVwdGlvbiBpbiBpbnRlcm5hbCBzdGF0ZS44VW5hcHBsaWVkU2xhc2gACATcVW5hcHBsaWVkIHBlbmRpbmcgc2xhc2ggcmVzdHJpY3RzIG9wZXJhdGlvbiBvbiBgQWdlbnRgLjhOb3RoaW5nVG9TbGFzaAAJBKxgQWdlbnRgIGhhcyBubyBwZW5kaW5nIHNsYXNoIHRvIGJlIGFwcGxpZWQuOFdpdGhkcmF3RmFpbGVkAAoEsEZhaWxlZCB0byB3aXRoZHJhdyBhbW91bnQgZnJvbSBDb3JlIFN0YWtpbmcuME5vdFN1cHBvcnRlZAALBJxPcGVyYXRpb24gbm90IHN1cHBvcnRlZCBieSB0aGlzIHBhbGxldC4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQu5QwMbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWluczRjb25maWd1cmF0aW9uREhvc3RDb25maWd1cmF0aW9uBCxCbG9ja051bWJlcgEQAIwBNG1heF9jb2RlX3NpemUQAQx1MzIAAUhtYXhfaGVhZF9kYXRhX3NpemUQAQx1MzIAAVhtYXhfdXB3YXJkX3F1ZXVlX2NvdW50EAEMdTMyAAFUbWF4X3Vwd2FyZF9xdWV1ZV9zaXplEAEMdTMyAAFcbWF4X3Vwd2FyZF9tZXNzYWdlX3NpemUQAQx1MzIAAZBtYXhfdXB3YXJkX21lc3NhZ2VfbnVtX3Blcl9jYW5kaWRhdGUQAQx1MzIAAYhocm1wX21heF9tZXNzYWdlX251bV9wZXJfY2FuZGlkYXRlEAEMdTMyAAFsdmFsaWRhdGlvbl91cGdyYWRlX2Nvb2xkb3duEAEsQmxvY2tOdW1iZXIAAWB2YWxpZGF0aW9uX3VwZ3JhZGVfZGVsYXkQASxCbG9ja051bWJlcgABUGFzeW5jX2JhY2tpbmdfcGFyYW1zYQUBSEFzeW5jQmFja2luZ1BhcmFtcwABMG1heF9wb3Zfc2l6ZRABDHUzMgABZG1heF9kb3dud2FyZF9tZXNzYWdlX3NpemUQAQx1MzIAAZBocm1wX21heF9wYXJhY2hhaW5fb3V0Ym91bmRfY2hhbm5lbHMQAQx1MzIAAUxocm1wX3NlbmRlcl9kZXBvc2l0GAEcQmFsYW5jZQABWGhybXBfcmVjaXBpZW50X2RlcG9zaXQYARxCYWxhbmNlAAFkaHJtcF9jaGFubmVsX21heF9jYXBhY2l0eRABDHUzMgABbGhybXBfY2hhbm5lbF9tYXhfdG90YWxfc2l6ZRABDHUzMgABjGhybXBfbWF4X3BhcmFjaGFpbl9pbmJvdW5kX2NoYW5uZWxzEAEMdTMyAAF0aHJtcF9jaGFubmVsX21heF9tZXNzYWdlX3NpemUQAQx1MzIAATxleGVjdXRvcl9wYXJhbXNlBQE4RXhlY3V0b3JQYXJhbXMAAVRjb2RlX3JldGVudGlvbl9wZXJpb2QQASxCbG9ja051bWJlcgABOG1heF92YWxpZGF0b3JznAEsT3B0aW9uPHUzMj4AAThkaXNwdXRlX3BlcmlvZBABMFNlc3Npb25JbmRleAABpGRpc3B1dGVfcG9zdF9jb25jbHVzaW9uX2FjY2VwdGFuY2VfcGVyaW9kEAEsQmxvY2tOdW1iZXIAATRub19zaG93X3Nsb3RzEAEMdTMyAAFAbl9kZWxheV90cmFuY2hlcxABDHUzMgABaHplcm90aF9kZWxheV90cmFuY2hlX3dpZHRoEAEMdTMyAAFAbmVlZGVkX2FwcHJvdmFscxABDHUzMgABYHJlbGF5X3ZyZl9tb2R1bG9fc2FtcGxlcxABDHUzMgABOHB2Zl92b3RpbmdfdHRsEAEwU2Vzc2lvbkluZGV4AAGAbWluaW11bV92YWxpZGF0aW9uX3VwZ3JhZGVfZGVsYXkQASxCbG9ja051bWJlcgABVG1pbmltdW1fYmFja2luZ192b3RlcxABDHUzMgABNG5vZGVfZmVhdHVyZXOdBQEwTm9kZUZlYXR1cmVzAAFYYXBwcm92YWxfdm90aW5nX3BhcmFtc3kFAVBBcHByb3ZhbFZvdGluZ1BhcmFtcwABQHNjaGVkdWxlcl9wYXJhbXN9BQFwU2NoZWR1bGVyUGFyYW1zPEJsb2NrTnVtYmVyPgAA6QwAAALtDADtDAAABAgQ5QwA8QwQbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWluczRjb25maWd1cmF0aW9uGHBhbGxldBRFcnJvcgQEVAABBDxJbnZhbGlkTmV3VmFsdWUAAATcVGhlIG5ldyB2YWx1ZSBmb3IgYSBjb25maWd1cmF0aW9uIHBhcmFtZXRlciBpcyBpbnZhbGlkLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC71DAAAAqUFAPkMAAACWQIA/QwMbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucxhzaGFyZWRoQWxsb3dlZFJlbGF5UGFyZW50c1RyYWNrZXIIEEhhc2gBNCxCbG9ja051bWJlcgEQAAgBGGJ1ZmZlcgENAXxWZWNEZXF1ZTxSZWxheVBhcmVudEluZm88SGFzaD4+AAE0bGF0ZXN0X251bWJlchABLEJsb2NrTnVtYmVyAAABDQAAAgUNAAUNDGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMYc2hhcmVkPFJlbGF5UGFyZW50SW5mbwQQSGFzaAE0AAwBMHJlbGF5X3BhcmVudDQBEEhhc2gAAShzdGF0ZV9yb290NAEQSGFzaAABLGNsYWltX3F1ZXVlCQ0BvEJUcmVlTWFwPElkLCBCVHJlZU1hcDx1OCwgQlRyZWVTZXQ8Q29yZUluZGV4Pj4+AAAJDQQgQlRyZWVNYXAIBEsBsQIEVgENDQAEACENAAAADQ0EIEJUcmVlTWFwCARLAQgEVgERDQAEABkNAAAAEQ0EIEJUcmVlU2V0BARUAdEIAAQAFQ0AAAAVDQAAAtEIABkNAAACHQ0AHQ0AAAQICBENACENAAACJQ0AJQ0AAAQIsQINDQApDQAAAi0NAC0NDGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMkaW5jbHVzaW9ucENhbmRpZGF0ZVBlbmRpbmdBdmFpbGFiaWxpdHkIBEgBNAROARAAJAEQY29yZdEIASRDb3JlSW5kZXgAARBoYXNo9QUBNENhbmRpZGF0ZUhhc2gAAShkZXNjcmlwdG9yuQUBWENhbmRpZGF0ZURlc2NyaXB0b3I8SD4AASxjb21taXRtZW50c8UFAVBDYW5kaWRhdGVDb21taXRtZW50cwABSGF2YWlsYWJpbGl0eV92b3Rlc50FAWBCaXRWZWM8dTgsIEJpdE9yZGVyTHNiMD4AARxiYWNrZXJznQUBYEJpdFZlYzx1OCwgQml0T3JkZXJMc2IwPgABTHJlbGF5X3BhcmVudF9udW1iZXIQAQROAAFAYmFja2VkX2luX251bWJlchABBE4AATRiYWNraW5nX2dyb3Vw1QgBKEdyb3VwSW5kZXgAADENEGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMkaW5jbHVzaW9uGHBhbGxldBRFcnJvcgQEVAABRGRWYWxpZGF0b3JJbmRleE91dE9mQm91bmRzAAAEeFZhbGlkYXRvciBpbmRleCBvdXQgb2YgYm91bmRzLlBVbnNjaGVkdWxlZENhbmRpZGF0ZQABBKxDYW5kaWRhdGUgc3VibWl0dGVkIGJ1dCBwYXJhIG5vdCBzY2hlZHVsZWQuQEhlYWREYXRhVG9vTGFyZ2UAAgSkSGVhZCBkYXRhIGV4Y2VlZHMgdGhlIGNvbmZpZ3VyZWQgbWF4aW11bS5QUHJlbWF0dXJlQ29kZVVwZ3JhZGUAAwRkQ29kZSB1cGdyYWRlIHByZW1hdHVyZWx5LjxOZXdDb2RlVG9vTGFyZ2UABARgT3V0cHV0IGNvZGUgaXMgdG9vIGxhcmdlVERpc2FsbG93ZWRSZWxheVBhcmVudAAFCOxUaGUgY2FuZGlkYXRlJ3MgcmVsYXktcGFyZW50IHdhcyBub3QgYWxsb3dlZC4gRWl0aGVyIGl0IHdhcyUBbm90IHJlY2VudCBlbm91Z2ggb3IgaXQgZGlkbid0IGFkdmFuY2UgYmFzZWQgb24gdGhlIGxhc3QgcGFyYWNoYWluIGJsb2NrLkRJbnZhbGlkQXNzaWdubWVudAAGCBUBRmFpbGVkIHRvIGNvbXB1dGUgZ3JvdXAgaW5kZXggZm9yIHRoZSBjb3JlOiBlaXRoZXIgaXQncyBvdXQgb2YgYm91bmRz6G9yIHRoZSByZWxheSBwYXJlbnQgZG9lc24ndCBiZWxvbmcgdG8gdGhlIGN1cnJlbnQgc2Vzc2lvbi5ESW52YWxpZEdyb3VwSW5kZXgABwScSW52YWxpZCBncm91cCBpbmRleCBpbiBjb3JlIGFzc2lnbm1lbnQuTEluc3VmZmljaWVudEJhY2tpbmcACASQSW5zdWZmaWNpZW50IChub24tbWFqb3JpdHkpIGJhY2tpbmcuOEludmFsaWRCYWNraW5nAAkE5EludmFsaWQgKGJhZCBzaWduYXR1cmUsIHVua25vd24gdmFsaWRhdG9yLCBldGMuKSBiYWNraW5nLmhWYWxpZGF0aW9uRGF0YUhhc2hNaXNtYXRjaAAKBMRUaGUgdmFsaWRhdGlvbiBkYXRhIGhhc2ggZG9lcyBub3QgbWF0Y2ggZXhwZWN0ZWQugEluY29ycmVjdERvd253YXJkTWVzc2FnZUhhbmRsaW5nAAsE2FRoZSBkb3dud2FyZCBtZXNzYWdlIHF1ZXVlIGlzIG5vdCBwcm9jZXNzZWQgY29ycmVjdGx5LlRJbnZhbGlkVXB3YXJkTWVzc2FnZXMADAQdAUF0IGxlYXN0IG9uZSB1cHdhcmQgbWVzc2FnZSBzZW50IGRvZXMgbm90IHBhc3MgdGhlIGFjY2VwdGFuY2UgY3JpdGVyaWEuYEhybXBXYXRlcm1hcmtNaXNoYW5kbGluZwANBBEBVGhlIGNhbmRpZGF0ZSBkaWRuJ3QgZm9sbG93IHRoZSBydWxlcyBvZiBIUk1QIHdhdGVybWFyayBhZHZhbmNlbWVudC5MSW52YWxpZE91dGJvdW5kSHJtcAAOBNRUaGUgSFJNUCBtZXNzYWdlcyBzZW50IGJ5IHRoZSBjYW5kaWRhdGUgaXMgbm90IHZhbGlkLmRJbnZhbGlkVmFsaWRhdGlvbkNvZGVIYXNoAA8E3FRoZSB2YWxpZGF0aW9uIGNvZGUgaGFzaCBvZiB0aGUgY2FuZGlkYXRlIGlzIG5vdCB2YWxpZC5AUGFyYUhlYWRNaXNtYXRjaAAQCFUBVGhlIGBwYXJhX2hlYWRgIGhhc2ggaW4gdGhlIGNhbmRpZGF0ZSBkZXNjcmlwdG9yIGRvZXNuJ3QgbWF0Y2ggdGhlIGhhc2ggb2YgdGhlIGFjdHVhbHRwYXJhIGhlYWQgaW4gdGhlIGNvbW1pdG1lbnRzLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC41DQxMcG9sa2Fkb3RfcHJpbWl0aXZlcyB2c3RhZ2luZ0xTY3JhcGVkT25DaGFpblZvdGVzBARIATQADAEcc2Vzc2lvbhABMFNlc3Npb25JbmRleAABgGJhY2tpbmdfdmFsaWRhdG9yc19wZXJfY2FuZGlkYXRlOQ0BJQFWZWM8CihDYW5kaWRhdGVSZWNlaXB0VjI8SD4sIFZlYzwoVmFsaWRhdG9ySW5kZXgsIFZhbGlkaXR5QXR0ZXN0YXRpb24pPik+AAEgZGlzcHV0ZXPtBQFgTXVsdGlEaXNwdXRlU3RhdGVtZW50U2V0AAA5DQAAAj0NAD0NAAAECM0IQQ0AQQ0AAAJFDQBFDQAABAilBekFAEkNEGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnM4cGFyYXNfaW5oZXJlbnQYcGFsbGV0FEVycm9yBARUAAEQZFRvb01hbnlJbmNsdXNpb25JbmhlcmVudHMAAATMSW5jbHVzaW9uIGluaGVyZW50IGNhbGxlZCBtb3JlIHRoYW4gb25jZSBwZXIgYmxvY2suTEludmFsaWRQYXJlbnRIZWFkZXIAAQhVAVRoZSBoYXNoIG9mIHRoZSBzdWJtaXR0ZWQgcGFyZW50IGhlYWRlciBkb2Vzbid0IGNvcnJlc3BvbmQgdG8gdGhlIHNhdmVkIGJsb2NrIGhhc2ggb2YsdGhlIHBhcmVudC6MSW5oZXJlbnREYXRhRmlsdGVyZWREdXJpbmdFeGVjdXRpb24AAggxAUluaGVyZW50IGRhdGEgd2FzIGZpbHRlcmVkIGR1cmluZyBleGVjdXRpb24uIFRoaXMgc2hvdWxkIGhhdmUgb25seSBiZWVuIGRvbmVAZHVyaW5nIGNyZWF0aW9uLlBVbnNjaGVkdWxlZENhbmRpZGF0ZQADBHRUb28gbWFueSBjYW5kaWRhdGVzIHN1cHBsaWVkLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC5NDQAAAvUMAFENBCBCVHJlZU1hcAgESwHRCARWAVUNAAQAXQ0AAABVDQAAAlkNAFkNEGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMkc2NoZWR1bGVyGGNvbW1vbihBc3NpZ25tZW50AAEIEFBvb2wIARxwYXJhX2lksQIBGFBhcmFJZAABKGNvcmVfaW5kZXjRCAEkQ29yZUluZGV4AAAAEEJ1bGsEALECARhQYXJhSWQAAQAAXQ0AAAJhDQBhDQAABAjRCFUNAGUNDGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMUcGFyYXNcUHZmQ2hlY2tBY3RpdmVWb3RlU3RhdGUELEJsb2NrTnVtYmVyARAAFAEwdm90ZXNfYWNjZXB0nQUBYEJpdFZlYzx1OCwgQml0T3JkZXJMc2IwPgABMHZvdGVzX3JlamVjdJ0FAWBCaXRWZWM8dTgsIEJpdE9yZGVyTHNiMD4AAQxhZ2UQATBTZXNzaW9uSW5kZXgAAShjcmVhdGVkX2F0EAEsQmxvY2tOdW1iZXIAARhjYXVzZXNpDQF8VmVjPFB2ZkNoZWNrQ2F1c2U8QmxvY2tOdW1iZXI+PgAAaQ0AAAJtDQBtDQxscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zFHBhcmFzNFB2ZkNoZWNrQ2F1c2UELEJsb2NrTnVtYmVyARABCChPbmJvYXJkaW5nBACxAgEYUGFyYUlkAAAAHFVwZ3JhZGUMAQhpZLECARhQYXJhSWQAASxpbmNsdWRlZF9hdBABLEJsb2NrTnVtYmVyAAFAdXBncmFkZV9zdHJhdGVneXENATxVcGdyYWRlU3RyYXRlZ3kAAQAAcQ0MbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucxRwYXJhczxVcGdyYWRlU3RyYXRlZ3kAAQhAU2V0R29BaGVhZFNpZ25hbAAAAFBBcHBseUF0RXhwZWN0ZWRCbG9jawABAAB1DQAAAsEFAHkNAAACsQIAfQ0MbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucxRwYXJhczRQYXJhTGlmZWN5Y2xlAAEcKE9uYm9hcmRpbmcAAAAoUGFyYXRocmVhZAABACRQYXJhY2hhaW4AAgBMVXBncmFkaW5nUGFyYXRocmVhZAADAFBEb3duZ3JhZGluZ1BhcmFjaGFpbgAEAFRPZmZib2FyZGluZ1BhcmF0aHJlYWQABQBQT2ZmYm9hcmRpbmdQYXJhY2hhaW4ABgAAgQ0AAAQIsQIQAIUNDGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMUcGFyYXNAUGFyYVBhc3RDb2RlTWV0YQQETgEQAAgBNHVwZ3JhZGVfdGltZXOJDQFgVmVjPFJlcGxhY2VtZW50VGltZXM8Tj4+AAEsbGFzdF9wcnVuZWScASRPcHRpb248Tj4AAIkNAAACjQ0AjQ0MbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucxRwYXJhc0BSZXBsYWNlbWVudFRpbWVzBAROARAACAEsZXhwZWN0ZWRfYXQQAQROAAEwYWN0aXZhdGVkX2F0EAEETgAAkQ0AAAKBDQCVDQxscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zFHBhcmFzbEF1dGhvcml6ZWRDb2RlSGFzaEFuZEV4cGlyeQQEVAEQAAgBJGNvZGVfaGFzaMEFAUhWYWxpZGF0aW9uQ29kZUhhc2gAASRleHBpcmVfYXQQAQRUAACZDQxMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2ODhVcGdyYWRlR29BaGVhZAABCBRBYm9ydAAAABxHb0FoZWFkAAEAAJ0NDExwb2xrYWRvdF9wcmltaXRpdmVzCHY4SFVwZ3JhZGVSZXN0cmljdGlvbgABBBxQcmVzZW50AAAAAKENEGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMUcGFyYXMYcGFsbGV0FEVycm9yBARUAAFANE5vdFJlZ2lzdGVyZWQAAASUUGFyYSBpcyBub3QgcmVnaXN0ZXJlZCBpbiBvdXIgc3lzdGVtLjRDYW5ub3RPbmJvYXJkAAEEFQFQYXJhIGNhbm5vdCBiZSBvbmJvYXJkZWQgYmVjYXVzZSBpdCBpcyBhbHJlYWR5IHRyYWNrZWQgYnkgb3VyIHN5c3RlbS44Q2Fubm90T2ZmYm9hcmQAAgScUGFyYSBjYW5ub3QgYmUgb2ZmYm9hcmRlZCBhdCB0aGlzIHRpbWUuNENhbm5vdFVwZ3JhZGUAAwTUUGFyYSBjYW5ub3QgYmUgdXBncmFkZWQgdG8gYSBsZWFzZSBob2xkaW5nIHBhcmFjaGFpbi48Q2Fubm90RG93bmdyYWRlAAQE0FBhcmEgY2Fubm90IGJlIGRvd25ncmFkZWQgdG8gYW4gb24tZGVtYW5kIHBhcmFjaGFpbi5YUHZmQ2hlY2tTdGF0ZW1lbnRTdGFsZQAFBLBUaGUgc3RhdGVtZW50IGZvciBQVkYgcHJlLWNoZWNraW5nIGlzIHN0YWxlLlxQdmZDaGVja1N0YXRlbWVudEZ1dHVyZQAGBOxUaGUgc3RhdGVtZW50IGZvciBQVkYgcHJlLWNoZWNraW5nIGlzIGZvciBhIGZ1dHVyZSBzZXNzaW9uLoRQdmZDaGVja1ZhbGlkYXRvckluZGV4T3V0T2ZCb3VuZHMABwSkQ2xhaW1lZCB2YWxpZGF0b3IgaW5kZXggaXMgb3V0IG9mIGJvdW5kcy5gUHZmQ2hlY2tJbnZhbGlkU2lnbmF0dXJlAAgEyFRoZSBzaWduYXR1cmUgZm9yIHRoZSBQVkYgcHJlLWNoZWNraW5nIGlzIGludmFsaWQuSFB2ZkNoZWNrRG91YmxlVm90ZQAJBLBUaGUgZ2l2ZW4gdmFsaWRhdG9yIGFscmVhZHkgaGFzIGNhc3QgYSB2b3RlLlhQdmZDaGVja1N1YmplY3RJbnZhbGlkAAoE9FRoZSBnaXZlbiBQVkYgZG9lcyBub3QgZXhpc3QgYXQgdGhlIG1vbWVudCBvZiBwcm9jZXNzIGEgdm90ZS5EQ2Fubm90VXBncmFkZUNvZGUACwTMUGFyYWNoYWluIGNhbm5vdCBjdXJyZW50bHkgc2NoZWR1bGUgYSBjb2RlIHVwZ3JhZGUuLEludmFsaWRDb2RlAAwEdEludmFsaWQgdmFsaWRhdGlvbiBjb2RlIHNpemUuRE5vdGhpbmdBdXRob3JpemVkAA0EWE5vIHVwZ3JhZGUgYXV0aG9yaXplZC4wVW5hdXRob3JpemVkAA4ElFRoZSBzdWJtaXR0ZWQgY29kZSBpcyBub3QgYXV0aG9yaXplZC5ISW52YWxpZEJsb2NrTnVtYmVyAA8EVEludmFsaWQgYmxvY2sgbnVtYmVyLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC6lDQAAAqkNAKkNDGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMsaW5pdGlhbGl6ZXJUQnVmZmVyZWRTZXNzaW9uQ2hhbmdlAAAMASh2YWxpZGF0b3Jz+QwBQFZlYzxWYWxpZGF0b3JJZD4AARhxdWV1ZWT5DAFAVmVjPFZhbGlkYXRvcklkPgABNHNlc3Npb25faW5kZXgQATBTZXNzaW9uSW5kZXgAAK0NAAACsQ0AsQ0IYHBvbGthZG90X2NvcmVfcHJpbWl0aXZlc1hJbmJvdW5kRG93bndhcmRNZXNzYWdlBCxCbG9ja051bWJlcgEQAAgBHHNlbnRfYXQQASxCbG9ja051bWJlcgABDG1zZzgBPERvd253YXJkTWVzc2FnZQAAtQ0MbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucxBocm1wWEhybXBPcGVuQ2hhbm5lbFJlcXVlc3QAABgBJGNvbmZpcm1lZCABEGJvb2wAARBfYWdlEAEwU2Vzc2lvbkluZGV4AAE4c2VuZGVyX2RlcG9zaXQYARxCYWxhbmNlAAFAbWF4X21lc3NhZ2Vfc2l6ZRABDHUzMgABMG1heF9jYXBhY2l0eRABDHUzMgABOG1heF90b3RhbF9zaXplEAEMdTMyAAC5DQAAAiEGAL0NDGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMQaHJtcCxIcm1wQ2hhbm5lbAAAIAEwbWF4X2NhcGFjaXR5EAEMdTMyAAE4bWF4X3RvdGFsX3NpemUQAQx1MzIAAUBtYXhfbWVzc2FnZV9zaXplEAEMdTMyAAEkbXNnX2NvdW50EAEMdTMyAAEodG90YWxfc2l6ZRABDHUzMgABIG1xY19oZWFk9QQBME9wdGlvbjxIYXNoPgABOHNlbmRlcl9kZXBvc2l0GAEcQmFsYW5jZQABRHJlY2lwaWVudF9kZXBvc2l0GAEcQmFsYW5jZQAAwQ0AAALFDQDFDQhgcG9sa2Fkb3RfY29yZV9wcmltaXRpdmVzSEluYm91bmRIcm1wTWVzc2FnZQQsQmxvY2tOdW1iZXIBEAAIARxzZW50X2F0EAEsQmxvY2tOdW1iZXIAARBkYXRhOAFMYWxsb2M6OnZlYzo6VmVjPHU4PgAAyQ0AAALNDQDNDQAABAgQeQ0A0Q0QbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucxBocm1wGHBhbGxldBRFcnJvcgQEVAABUFRPcGVuSHJtcENoYW5uZWxUb1NlbGYAAATEVGhlIHNlbmRlciB0cmllZCB0byBvcGVuIGEgY2hhbm5lbCB0byB0aGVtc2VsdmVzLnxPcGVuSHJtcENoYW5uZWxJbnZhbGlkUmVjaXBpZW50AAEEiFRoZSByZWNpcGllbnQgaXMgbm90IGEgdmFsaWQgcGFyYS5sT3BlbkhybXBDaGFubmVsWmVyb0NhcGFjaXR5AAIEfFRoZSByZXF1ZXN0ZWQgY2FwYWNpdHkgaXMgemVyby6MT3BlbkhybXBDaGFubmVsQ2FwYWNpdHlFeGNlZWRzTGltaXQAAwTAVGhlIHJlcXVlc3RlZCBjYXBhY2l0eSBleGNlZWRzIHRoZSBnbG9iYWwgbGltaXQueE9wZW5Icm1wQ2hhbm5lbFplcm9NZXNzYWdlU2l6ZQAEBKBUaGUgcmVxdWVzdGVkIG1heGltdW0gbWVzc2FnZSBzaXplIGlzIDAumE9wZW5Icm1wQ2hhbm5lbE1lc3NhZ2VTaXplRXhjZWVkc0xpbWl0AAUEKQFUaGUgb3BlbiByZXF1ZXN0IHJlcXVlc3RlZCB0aGUgbWVzc2FnZSBzaXplIHRoYXQgZXhjZWVkcyB0aGUgZ2xvYmFsIGxpbWl0LnBPcGVuSHJtcENoYW5uZWxBbHJlYWR5RXhpc3RzAAYEaFRoZSBjaGFubmVsIGFscmVhZHkgZXhpc3RzfE9wZW5Icm1wQ2hhbm5lbEFscmVhZHlSZXF1ZXN0ZWQABwTQVGhlcmUgaXMgYWxyZWFkeSBhIHJlcXVlc3QgdG8gb3BlbiB0aGUgc2FtZSBjaGFubmVsLnBPcGVuSHJtcENoYW5uZWxMaW1pdEV4Y2VlZGVkAAgEHQFUaGUgc2VuZGVyIGFscmVhZHkgaGFzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBhbGxvd2VkIG91dGJvdW5kIGNoYW5uZWxzLnBBY2NlcHRIcm1wQ2hhbm5lbERvZXNudEV4aXN0AAkE4FRoZSBjaGFubmVsIGZyb20gdGhlIHNlbmRlciB0byB0aGUgb3JpZ2luIGRvZXNuJ3QgZXhpc3QuhEFjY2VwdEhybXBDaGFubmVsQWxyZWFkeUNvbmZpcm1lZAAKBIRUaGUgY2hhbm5lbCBpcyBhbHJlYWR5IGNvbmZpcm1lZC54QWNjZXB0SHJtcENoYW5uZWxMaW1pdEV4Y2VlZGVkAAsEJQFUaGUgcmVjaXBpZW50IGFscmVhZHkgaGFzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBhbGxvd2VkIGluYm91bmQgY2hhbm5lbHMucENsb3NlSHJtcENoYW5uZWxVbmF1dGhvcml6ZWQADARVAVRoZSBvcmlnaW4gdHJpZXMgdG8gY2xvc2UgYSBjaGFubmVsIHdoZXJlIGl0IGlzIG5laXRoZXIgdGhlIHNlbmRlciBub3IgdGhlIHJlY2lwaWVudC5sQ2xvc2VIcm1wQ2hhbm5lbERvZXNudEV4aXN0AA0EnFRoZSBjaGFubmVsIHRvIGJlIGNsb3NlZCBkb2Vzbid0IGV4aXN0LnxDbG9zZUhybXBDaGFubmVsQWxyZWFkeVVuZGVyd2F5AA4EvFRoZSBjaGFubmVsIGNsb3NlIHJlcXVlc3QgaXMgYWxyZWFkeSByZXF1ZXN0ZWQuhENhbmNlbEhybXBPcGVuQ2hhbm5lbFVuYXV0aG9yaXplZAAPBF0BQ2FuY2VsaW5nIGlzIHJlcXVlc3RlZCBieSBuZWl0aGVyIHRoZSBzZW5kZXIgbm9yIHJlY2lwaWVudCBvZiB0aGUgb3BlbiBjaGFubmVsIHJlcXVlc3QuaE9wZW5Icm1wQ2hhbm5lbERvZXNudEV4aXN0ABAEfFRoZSBvcGVuIHJlcXVlc3QgZG9lc24ndCBleGlzdC58T3BlbkhybXBDaGFubmVsQWxyZWFkeUNvbmZpcm1lZAARBC0BQ2Fubm90IGNhbmNlbCBhbiBIUk1QIG9wZW4gY2hhbm5lbCByZXF1ZXN0IGJlY2F1c2UgaXQgaXMgYWxyZWFkeSBjb25maXJtZWQuMFdyb25nV2l0bmVzcwASBIxUaGUgcHJvdmlkZWQgd2l0bmVzcyBkYXRhIGlzIHdyb25nLnBDaGFubmVsQ3JlYXRpb25Ob3RBdXRob3JpemVkABME6FRoZSBjaGFubmVsIGJldHdlZW4gdGhlc2UgdHdvIGNoYWlucyBjYW5ub3QgYmUgYXV0aG9yaXplZC4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQu1Q0AAAJdAgDZDQxMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2OCxTZXNzaW9uSW5mbwAANAFgYWN0aXZlX3ZhbGlkYXRvcl9pbmRpY2Vz9QwBTFZlYzxWYWxpZGF0b3JJbmRleD4AASxyYW5kb21fc2VlZAQBIFt1ODsgMzJdAAE4ZGlzcHV0ZV9wZXJpb2QQATBTZXNzaW9uSW5kZXgAASh2YWxpZGF0b3Jz3Q0BnEluZGV4ZWRWZWM8VmFsaWRhdG9ySW5kZXgsIFZhbGlkYXRvcklkPgABOGRpc2NvdmVyeV9rZXlzwQoBZFZlYzxBdXRob3JpdHlEaXNjb3ZlcnlJZD4AATxhc3NpZ25tZW50X2tleXPVDQFEVmVjPEFzc2lnbm1lbnRJZD4AAUB2YWxpZGF0b3JfZ3JvdXBz4Q0BrEluZGV4ZWRWZWM8R3JvdXBJbmRleCwgVmVjPFZhbGlkYXRvckluZGV4Pj4AARxuX2NvcmVzEAEMdTMyAAFoemVyb3RoX2RlbGF5X3RyYW5jaGVfd2lkdGgQAQx1MzIAAWByZWxheV92cmZfbW9kdWxvX3NhbXBsZXMQAQx1MzIAAUBuX2RlbGF5X3RyYW5jaGVzEAEMdTMyAAE0bm9fc2hvd19zbG90cxABDHUzMgABQG5lZWRlZF9hcHByb3ZhbHMQAQx1MzIAAN0NDExwb2xrYWRvdF9wcmltaXRpdmVzCHY4KEluZGV4ZWRWZWMIBEsBpQUEVgFZAgAEAPkMARhWZWM8Vj4AAOENDExwb2xrYWRvdF9wcmltaXRpdmVzCHY4KEluZGV4ZWRWZWMIBEsB1QgEVgH1DAAEAE0NARhWZWM8Vj4AAOUNAAAECBD1BQDpDQxMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2ODBEaXNwdXRlU3RhdGUEBE4BEAAQATh2YWxpZGF0b3JzX2Zvcp0FAXxCaXRWZWM8dTgsIGJpdHZlYzo6b3JkZXI6OkxzYjA+AAFIdmFsaWRhdG9yc19hZ2FpbnN0nQUBfEJpdFZlYzx1OCwgYml0dmVjOjpvcmRlcjo6THNiMD4AARRzdGFydBABBE4AATBjb25jbHVkZWRfYXScASRPcHRpb248Tj4AAO0NBCBCVHJlZVNldAQEVAGlBQAEAPUMAAAA8Q0QbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucyBkaXNwdXRlcxhwYWxsZXQURXJyb3IEBFQAASR0RHVwbGljYXRlRGlzcHV0ZVN0YXRlbWVudFNldHMAAASoRHVwbGljYXRlIGRpc3B1dGUgc3RhdGVtZW50IHNldHMgcHJvdmlkZWQuXEFuY2llbnREaXNwdXRlU3RhdGVtZW50AAEEjEFuY2llbnQgZGlzcHV0ZSBzdGF0ZW1lbnQgcHJvdmlkZWQuZFZhbGlkYXRvckluZGV4T3V0T2ZCb3VuZHMAAgToVmFsaWRhdG9yIGluZGV4IG9uIHN0YXRlbWVudCBpcyBvdXQgb2YgYm91bmRzIGZvciBzZXNzaW9uLkBJbnZhbGlkU2lnbmF0dXJlAAMEfEludmFsaWQgc2lnbmF0dXJlIG9uIHN0YXRlbWVudC5IRHVwbGljYXRlU3RhdGVtZW50AAQEzFZhbGlkYXRvciB2b3RlIHN1Ym1pdHRlZCBtb3JlIHRoYW4gb25jZSB0byBkaXNwdXRlLkhTaW5nbGVTaWRlZERpc3B1dGUABQTEQSBkaXNwdXRlIHdoZXJlIHRoZXJlIGFyZSBvbmx5IHZvdGVzIG9uIG9uZSBzaWRlLjxNYWxpY2lvdXNCYWNrZXIABgScQSBkaXNwdXRlIHZvdGUgZnJvbSBhIG1hbGljaW91cyBiYWNrZXIuTE1pc3NpbmdCYWNraW5nVm90ZXMABwTgTm8gYmFja2luZyB2b3RlcyB3ZXJlIHByb3ZpZGVzIGFsb25nIGRpc3B1dGUgc3RhdGVtZW50cy5IVW5jb25maXJtZWREaXNwdXRlAAgEsFVuY29uZmlybWVkIGRpc3B1dGUgc3RhdGVtZW50IHNldHMgcHJvdmlkZWQuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LvUNDExwb2xrYWRvdF9wcmltaXRpdmVzIHZzdGFnaW5nOFBlbmRpbmdTbGFzaGVzAAAIARBrZXlz+Q0BlEJUcmVlTWFwPFZhbGlkYXRvckluZGV4LCBWYWxpZGF0b3JJZD4AARBraW5kNQYBSERpc3B1dGVPZmZlbmNlS2luZAAA+Q0EIEJUcmVlTWFwCARLAaUFBFYBWQIABAD9DQAAAP0NAAACAQ4AAQ4AAAQIpQVZAgAFDhRscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zIGRpc3B1dGVzIHNsYXNoaW5nGHBhbGxldBRFcnJvcgQEVAABGGBJbnZhbGlkS2V5T3duZXJzaGlwUHJvb2YAAASMVGhlIGtleSBvd25lcnNoaXAgcHJvb2YgaXMgaW52YWxpZC5MSW52YWxpZFNlc3Npb25JbmRleAABBKBUaGUgc2Vzc2lvbiBpbmRleCBpcyB0b28gb2xkIG9yIGludmFsaWQuUEludmFsaWRDYW5kaWRhdGVIYXNoAAIEeFRoZSBjYW5kaWRhdGUgaGFzaCBpcyBpbnZhbGlkLlRJbnZhbGlkVmFsaWRhdG9ySW5kZXgAAwgBAVRoZXJlIGlzIG5vIHBlbmRpbmcgc2xhc2ggZm9yIHRoZSBnaXZlbiB2YWxpZGF0b3IgaW5kZXggYW5kIHRpbWUUc2xvdC5gVmFsaWRhdG9ySW5kZXhJZE1pc21hdGNoAAQE0FRoZSB2YWxpZGF0b3IgaW5kZXggZG9lcyBub3QgbWF0Y2ggdGhlIHZhbGlkYXRvciBpZC5cRHVwbGljYXRlU2xhc2hpbmdSZXBvcnQABQQNAVRoZSBnaXZlbiBzbGFzaGluZyByZXBvcnQgaXMgdmFsaWQgYnV0IGFscmVhZHkgcHJldmlvdXNseSByZXBvcnRlZC4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQuCQ4QbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucyRvbl9kZW1hbmQUdHlwZXNEQ29yZUFmZmluaXR5Q291bnQAAAgBKGNvcmVfaW5kZXjRCAEkQ29yZUluZGV4AAEUY291bnQQAQx1MzIAAA0OEGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMkb25fZGVtYW5kFHR5cGVzPFF1ZXVlU3RhdHVzVHlwZQAAEAEcdHJhZmZpYy0IASRGaXhlZFUxMjgAAShuZXh0X2luZGV4EQ4BKFF1ZXVlSW5kZXgAAThzbWFsbGVzdF9pbmRleBEOAShRdWV1ZUluZGV4AAE0ZnJlZWRfaW5kaWNlcxUOAXRCaW5hcnlIZWFwPFJldmVyc2VRdWV1ZUluZGV4PgAAEQ4QbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWlucyRvbl9kZW1hbmQUdHlwZXMoUXVldWVJbmRleAAABAAQAQx1MzIAABUOBChCaW5hcnlIZWFwBARUARkOAAQAHQ4AAAAZDhBscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zJG9uX2RlbWFuZBR0eXBlc0RSZXZlcnNlUXVldWVJbmRleAAABAAQAQx1MzIAAB0OAAACGQ4AIQ4EKEJpbmFyeUhlYXAEBFQBJQ4ABAApDgAAACUOEGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMkb25fZGVtYW5kFHR5cGVzNEVucXVldWVkT3JkZXIAAAgBHHBhcmFfaWSxAgEYUGFyYUlkAAEMaWR4EQ4BKFF1ZXVlSW5kZXgAACkOAAACJQ4ALQ4MTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAEYBFMAAAQAMQ4BGFZlYzxUPgAAMQ4AAAIYADUOEGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnMkb25fZGVtYW5kGHBhbGxldBRFcnJvcgQEVAABDCRRdWV1ZUZ1bGwAAATkVGhlIG9yZGVyIHF1ZXVlIGlzIGZ1bGwsIGBwbGFjZV9vcmRlcmAgd2lsbCBub3QgY29udGludWUucFNwb3RQcmljZUhpZ2hlclRoYW5NYXhBbW91bnQAAQhNAVRoZSBjdXJyZW50IHNwb3QgcHJpY2UgaXMgaGlnaGVyIHRoYW4gdGhlIG1heCBhbW91bnQgc3BlY2lmaWVkIGluIHRoZSBgcGxhY2Vfb3JkZXJgYGNhbGwsIG1ha2luZyBpdCBpbnZhbGlkLkxJbnN1ZmZpY2llbnRDcmVkaXRzAAIEHQFUaGUgYWNjb3VudCBkb2Vzbid0IGhhdmUgZW5vdWdoIGNyZWRpdHMgdG8gcHVyY2hhc2Ugb24tZGVtYW5kIGNvcmV0aW1lLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC45DgAABAgQ0QgAPQ4MbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWluc0Rhc3NpZ25lcl9jb3JldGltZSBTY2hlZHVsZQQETgEQAAwBLGFzc2lnbm1lbnRzmQcBjFZlYzwoQ29yZUFzc2lnbm1lbnQsIFBhcnRzT2Y1NzYwMCk+AAEgZW5kX2hpbnScASRPcHRpb248Tj4AATRuZXh0X3NjaGVkdWxlnAEkT3B0aW9uPE4+AABBDgxscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zRGFzc2lnbmVyX2NvcmV0aW1lOENvcmVEZXNjcmlwdG9yBAROARAACAEUcXVldWVFDgFoT3B0aW9uPFF1ZXVlRGVzY3JpcHRvcjxOPj4AATBjdXJyZW50X3dvcmtNDgFQT3B0aW9uPFdvcmtTdGF0ZTxOPj4AAEUOBBhPcHRpb24EBFQBSQ4BCBBOb25lAAAAEFNvbWUEAEkOAAABAABJDgxscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zRGFzc2lnbmVyX2NvcmV0aW1lPFF1ZXVlRGVzY3JpcHRvcgQETgEQAAgBFGZpcnN0EAEETgABEGxhc3QQAQROAABNDgQYT3B0aW9uBARUAVEOAQgQTm9uZQAAABBTb21lBABRDgAAAQAAUQ4MbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWluc0Rhc3NpZ25lcl9jb3JldGltZSRXb3JrU3RhdGUEBE4BEAAQASxhc3NpZ25tZW50c1UOAZhWZWM8KENvcmVBc3NpZ25tZW50LCBBc3NpZ25tZW50U3RhdGUpPgABIGVuZF9oaW50nAEkT3B0aW9uPE4+AAEMcG9zQQEBDHUxNgABEHN0ZXClBwEwUGFydHNPZjU3NjAwAABVDgAAAlkOAFkOAAAECKEHXQ4AXQ4MbHBvbGthZG90X3J1bnRpbWVfcGFyYWNoYWluc0Rhc3NpZ25lcl9jb3JldGltZTxBc3NpZ25tZW50U3RhdGUAAAgBFHJhdGlvpQcBMFBhcnRzT2Y1NzYwMAABJHJlbWFpbmluZ6UHATBQYXJ0c09mNTc2MDAAAGEOEGxwb2xrYWRvdF9ydW50aW1lX3BhcmFjaGFpbnNEYXNzaWduZXJfY29yZXRpbWUYcGFsbGV0FEVycm9yBARUAAEIQEFzc2lnbm1lbnRzRW1wdHkAAABARGlzYWxsb3dlZEluc2VydAABCFEBYXNzaWduX2NvcmUgaXMgb25seSBhbGxvd2VkIHRvIGFwcGVuZCBuZXcgYXNzaWdubWVudHMgYXQgdGhlIGVuZCBvZiBhbHJlYWR5IGV4aXN0aW5neG9uZXMgb3IgdXBkYXRlIHRoZSBsYXN0IGVudHJ5LgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC5lDgxccG9sa2Fkb3RfcnVudGltZV9jb21tb248cGFyYXNfcmVnaXN0cmFyIFBhcmFJbmZvCBxBY2NvdW50AQAcQmFsYW5jZQEYAAwBHG1hbmFnZXIAARxBY2NvdW50AAEcZGVwb3NpdBgBHEJhbGFuY2UAARhsb2NrZWRNAgEwT3B0aW9uPGJvb2w+AABpDhBccG9sa2Fkb3RfcnVudGltZV9jb21tb248cGFyYXNfcmVnaXN0cmFyGHBhbGxldBRFcnJvcgQEVAABODROb3RSZWdpc3RlcmVkAAAEZFRoZSBJRCBpcyBub3QgcmVnaXN0ZXJlZC5EQWxyZWFkeVJlZ2lzdGVyZWQAAQR0VGhlIElEIGlzIGFscmVhZHkgcmVnaXN0ZXJlZC4gTm90T3duZXIAAgScVGhlIGNhbGxlciBpcyBub3QgdGhlIG93bmVyIG9mIHRoaXMgSWQuMENvZGVUb29MYXJnZQADBFxJbnZhbGlkIHBhcmEgY29kZSBzaXplLkBIZWFkRGF0YVRvb0xhcmdlAAQEcEludmFsaWQgcGFyYSBoZWFkIGRhdGEgc2l6ZS4wTm90UGFyYWNoYWluAAUEYFBhcmEgaXMgbm90IGEgUGFyYWNoYWluLjROb3RQYXJhdGhyZWFkAAYEvFBhcmEgaXMgbm90IGEgUGFyYXRocmVhZCAob24tZGVtYW5kIHBhcmFjaGFpbikuQENhbm5vdERlcmVnaXN0ZXIABwRYQ2Fubm90IGRlcmVnaXN0ZXIgcGFyYTxDYW5ub3REb3duZ3JhZGUACAQtAUNhbm5vdCBzY2hlZHVsZSBkb3duZ3JhZGUgb2YgbGVhc2UgaG9sZGluZyBwYXJhY2hhaW4gdG8gb24tZGVtYW5kIHBhcmFjaGFpbjRDYW5ub3RVcGdyYWRlAAkEJQFDYW5ub3Qgc2NoZWR1bGUgdXBncmFkZSBvZiBvbi1kZW1hbmQgcGFyYWNoYWluIHRvIGxlYXNlIGhvbGRpbmcgcGFyYWNoYWluKFBhcmFMb2NrZWQACghJAVBhcmEgaXMgbG9ja2VkIGZyb20gbWFuaXB1bGF0aW9uIGJ5IHRoZSBtYW5hZ2VyLiBNdXN0IHVzZSBwYXJhY2hhaW4gb3IgcmVsYXkgY2hhaW4sZ292ZXJuYW5jZS4sTm90UmVzZXJ2ZWQACwTQVGhlIElEIGdpdmVuIGZvciByZWdpc3RyYXRpb24gaGFzIG5vdCBiZWVuIHJlc2VydmVkLixJbnZhbGlkQ29kZQAMBHxUaGUgdmFsaWRhdGlvbiBjb2RlIGlzIGludmFsaWQuKENhbm5vdFN3YXAADQhRAUNhbm5vdCBwZXJmb3JtIGEgcGFyYWNoYWluIHNsb3QgLyBsaWZlY3ljbGUgc3dhcC4gQ2hlY2sgdGhhdCB0aGUgc3RhdGUgb2YgYm90aCBwYXJhc4RhcmUgY29ycmVjdCBmb3IgdGhlIHN3YXAgdG8gd29yay4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQubQ4AAAJJCwBxDhBccG9sa2Fkb3RfcnVudGltZV9jb21tb24Uc2xvdHMYcGFsbGV0FEVycm9yBARUAAEIRFBhcmFOb3RPbmJvYXJkaW5nAAAEjFRoZSBwYXJhY2hhaW4gSUQgaXMgbm90IG9uYm9hcmRpbmcuKExlYXNlRXJyb3IAAQSIVGhlcmUgd2FzIGFuIGVycm9yIHdpdGggdGhlIGxlYXNlLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC51DhBccG9sa2Fkb3RfcnVudGltZV9jb21tb25IcGFyYXNfc3Vkb193cmFwcGVyGHBhbGxldBRFcnJvcgQEVAABKDxQYXJhRG9lc250RXhpc3QAAASoVGhlIHNwZWNpZmllZCBwYXJhY2hhaW4gaXMgbm90IHJlZ2lzdGVyZWQuRFBhcmFBbHJlYWR5RXhpc3RzAAEEuFRoZSBzcGVjaWZpZWQgcGFyYWNoYWluIGlzIGFscmVhZHkgcmVnaXN0ZXJlZC5URXhjZWVkc01heE1lc3NhZ2VTaXplAAIIQQFBIERNUCBtZXNzYWdlIGNvdWxkbid0IGJlIHNlbnQgYmVjYXVzZSBpdCBleGNlZWRzIHRoZSBtYXhpbXVtIHNpemUgYWxsb3dlZCBmb3IgYURkb3dud2FyZCBtZXNzYWdlLihVbnJvdXRhYmxlAAMEGQFBIERNUCBtZXNzYWdlIGNvdWxkbid0IGJlIHNlbnQgYmVjYXVzZSB0aGUgZGVzdGluYXRpb24gaXMgdW5yZWFjaGFibGUuOENvdWxkbnRDbGVhbnVwAAQEgENvdWxkIG5vdCBzY2hlZHVsZSBwYXJhIGNsZWFudXAuNE5vdFBhcmF0aHJlYWQABQScTm90IGEgcGFyYXRocmVhZCAob24tZGVtYW5kIHBhcmFjaGFpbikuME5vdFBhcmFjaGFpbgAGBHhOb3QgYSBsZWFzZSBob2xkaW5nIHBhcmFjaGFpbi40Q2Fubm90VXBncmFkZQAHBPhDYW5ub3QgdXBncmFkZSBvbi1kZW1hbmQgcGFyYWNoYWluIHRvIGxlYXNlIGhvbGRpbmcgcGFyYWNoYWluLjxDYW5ub3REb3duZ3JhZGUACATYQ2Fubm90IGRvd25ncmFkZSBsZWFzZSBob2xkaW5nIHBhcmFjaGFpbiB0byBvbi1kZW1hbmQuMFRvb01hbnlDb3JlcwAJBMxUaGVyZSBhcmUgbW9yZSBjb3JlcyB0aGFuIHN1cHBvcnRlZCBieSB0aGUgcnVudGltZS4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQueQ4AAAQIALECAH0OAAADJAAAAIEOAIEOBBhPcHRpb24EBFQBhQ4BCBBOb25lAAAAEFNvbWUEAIUOAAABAACFDgAABAwAsQIYAIkOEFxwb2xrYWRvdF9ydW50aW1lX2NvbW1vbiBhdWN0aW9ucxhwYWxsZXQURXJyb3IEBFQAARxEQXVjdGlvbkluUHJvZ3Jlc3MAAASQVGhpcyBhdWN0aW9uIGlzIGFscmVhZHkgaW4gcHJvZ3Jlc3MuRExlYXNlUGVyaW9kSW5QYXN0AAEEgFRoZSBsZWFzZSBwZXJpb2QgaXMgaW4gdGhlIHBhc3QuRFBhcmFOb3RSZWdpc3RlcmVkAAIEWFBhcmEgaXMgbm90IHJlZ2lzdGVyZWRETm90Q3VycmVudEF1Y3Rpb24AAwRYTm90IGEgY3VycmVudCBhdWN0aW9uLihOb3RBdWN0aW9uAAQEPE5vdCBhbiBhdWN0aW9uLjBBdWN0aW9uRW5kZWQABQRoQXVjdGlvbiBoYXMgYWxyZWFkeSBlbmRlZC5AQWxyZWFkeUxlYXNlZE91dAAGBNhUaGUgcGFyYSBpcyBhbHJlYWR5IGxlYXNlZCBvdXQgZm9yIHBhcnQgb2YgdGhpcyByYW5nZS4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQujQ4MXHBvbGthZG90X3J1bnRpbWVfY29tbW9uJGNyb3dkbG9hbiBGdW5kSW5mbxAkQWNjb3VudElkAQAcQmFsYW5jZQEYLEJsb2NrTnVtYmVyARAsTGVhc2VQZXJpb2QBEAAoASRkZXBvc2l0b3IAASRBY2NvdW50SWQAASB2ZXJpZmllcoUHAUxPcHRpb248TXVsdGlTaWduZXI+AAEcZGVwb3NpdBgBHEJhbGFuY2UAARhyYWlzZWQYARxCYWxhbmNlAAEMZW5kEAEsQmxvY2tOdW1iZXIAAQxjYXAYARxCYWxhbmNlAAFEbGFzdF9jb250cmlidXRpb26RDgF0TGFzdENvbnRyaWJ1dGlvbjxCbG9ja051bWJlcj4AATBmaXJzdF9wZXJpb2QQASxMZWFzZVBlcmlvZAABLGxhc3RfcGVyaW9kEAEsTGVhc2VQZXJpb2QAAShmdW5kX2luZGV4EAEkRnVuZEluZGV4AACRDgxccG9sa2Fkb3RfcnVudGltZV9jb21tb24kY3Jvd2Rsb2FuQExhc3RDb250cmlidXRpb24ELEJsb2NrTnVtYmVyARABDBROZXZlcgAAACRQcmVFbmRpbmcEABABDHUzMgABABhFbmRpbmcEABABLEJsb2NrTnVtYmVyAAIAAJUOEFxwb2xrYWRvdF9ydW50aW1lX2NvbW1vbiRjcm93ZGxvYW4YcGFsbGV0FEVycm9yBARUAAFcREZpcnN0UGVyaW9kSW5QYXN0AAAE9FRoZSBjdXJyZW50IGxlYXNlIHBlcmlvZCBpcyBtb3JlIHRoYW4gdGhlIGZpcnN0IGxlYXNlIHBlcmlvZC5kRmlyc3RQZXJpb2RUb29GYXJJbkZ1dHVyZQABBBEBVGhlIGZpcnN0IGxlYXNlIHBlcmlvZCBuZWVkcyB0byBhdCBsZWFzdCBiZSBsZXNzIHRoYW4gMyBgbWF4X3ZhbHVlYC5sTGFzdFBlcmlvZEJlZm9yZUZpcnN0UGVyaW9kAAIE6Exhc3QgbGVhc2UgcGVyaW9kIG11c3QgYmUgZ3JlYXRlciB0aGFuIGZpcnN0IGxlYXNlIHBlcmlvZC5gTGFzdFBlcmlvZFRvb0ZhckluRnV0dXJlAAMELQFUaGUgbGFzdCBsZWFzZSBwZXJpb2QgY2Fubm90IGJlIG1vcmUgdGhhbiAzIHBlcmlvZHMgYWZ0ZXIgdGhlIGZpcnN0IHBlcmlvZC48Q2Fubm90RW5kSW5QYXN0AAQERQFUaGUgY2FtcGFpZ24gZW5kcyBiZWZvcmUgdGhlIGN1cnJlbnQgYmxvY2sgbnVtYmVyLiBUaGUgZW5kIG11c3QgYmUgaW4gdGhlIGZ1dHVyZS5ERW5kVG9vRmFySW5GdXR1cmUABQTAVGhlIGVuZCBkYXRlIGZvciB0aGlzIGNyb3dkbG9hbiBpcyBub3Qgc2Vuc2libGUuIE92ZXJmbG93AAYEWFRoZXJlIHdhcyBhbiBvdmVyZmxvdy5QQ29udHJpYnV0aW9uVG9vU21hbGwABwToVGhlIGNvbnRyaWJ1dGlvbiB3YXMgYmVsb3cgdGhlIG1pbmltdW0sIGBNaW5Db250cmlidXRpb25gLjRJbnZhbGlkUGFyYUlkAAgETEludmFsaWQgZnVuZCBpbmRleC4sQ2FwRXhjZWVkZWQACQSQQ29udHJpYnV0aW9ucyBleGNlZWQgbWF4aW11bSBhbW91bnQuWENvbnRyaWJ1dGlvblBlcmlvZE92ZXIACgSoVGhlIGNvbnRyaWJ1dGlvbiBwZXJpb2QgaGFzIGFscmVhZHkgZW5kZWQuNEludmFsaWRPcmlnaW4ACwSMVGhlIG9yaWdpbiBvZiB0aGlzIGNhbGwgaXMgaW52YWxpZC4wTm90UGFyYWNoYWluAAwEyFRoaXMgY3Jvd2Rsb2FuIGRvZXMgbm90IGNvcnJlc3BvbmQgdG8gYSBwYXJhY2hhaW4uLExlYXNlQWN0aXZlAA0EFQFUaGlzIHBhcmFjaGFpbiBsZWFzZSBpcyBzdGlsbCBhY3RpdmUgYW5kIHJldGlyZW1lbnQgY2Fubm90IHlldCBiZWdpbi5AQmlkT3JMZWFzZUFjdGl2ZQAOBDEBVGhpcyBwYXJhY2hhaW4ncyBiaWQgb3IgbGVhc2UgaXMgc3RpbGwgYWN0aXZlIGFuZCB3aXRoZHJhdyBjYW5ub3QgeWV0IGJlZ2luLjBGdW5kTm90RW5kZWQADwSAVGhlIGNyb3dkbG9hbiBoYXMgbm90IHlldCBlbmRlZC48Tm9Db250cmlidXRpb25zABAE0FRoZXJlIGFyZSBubyBjb250cmlidXRpb25zIHN0b3JlZCBpbiB0aGlzIGNyb3dkbG9hbi5ITm90UmVhZHlUb0Rpc3NvbHZlABEIVQFUaGUgY3Jvd2Rsb2FuIGlzIG5vdCByZWFkeSB0byBkaXNzb2x2ZS4gUG90ZW50aWFsbHkgc3RpbGwgaGFzIGEgc2xvdCBvciBpbiByZXRpcmVtZW50HHBlcmlvZC5ASW52YWxpZFNpZ25hdHVyZQASBEhJbnZhbGlkIHNpZ25hdHVyZS4wTWVtb1Rvb0xhcmdlABMEfFRoZSBwcm92aWRlZCBtZW1vIGlzIHRvbyBsYXJnZS5EQWxyZWFkeUluTmV3UmFpc2UAFASEVGhlIGZ1bmQgaXMgYWxyZWFkeSBpbiBgTmV3UmFpc2VgSFZyZkRlbGF5SW5Qcm9ncmVzcwAVBLRObyBjb250cmlidXRpb25zIGFsbG93ZWQgZHVyaW5nIHRoZSBWUkYgZGVsYXk0Tm9MZWFzZVBlcmlvZAAWBC0BQSBsZWFzZSBwZXJpb2QgaGFzIG5vdCBzdGFydGVkIHlldCwgZHVlIHRvIGFuIG9mZnNldCBpbiB0aGUgc3RhcnRpbmcgYmxvY2suBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LpkODFxwb2xrYWRvdF9ydW50aW1lX2NvbW1vbjhhc3NpZ25lZF9zbG90c1hQYXJhY2hhaW5UZW1wb3JhcnlTbG90CCRBY2NvdW50SWQBACxMZWFzZVBlcmlvZAEQABQBHG1hbmFnZXIAASRBY2NvdW50SWQAATBwZXJpb2RfYmVnaW4QASxMZWFzZVBlcmlvZAABMHBlcmlvZF9jb3VudBABLExlYXNlUGVyaW9kAAEobGFzdF9sZWFzZZwBTE9wdGlvbjxMZWFzZVBlcmlvZD4AASxsZWFzZV9jb3VudBABDHUzMgAAnQ4QXHBvbGthZG90X3J1bnRpbWVfY29tbW9uOGFzc2lnbmVkX3Nsb3RzGHBhbGxldBRFcnJvcgQEVAABJDxQYXJhRG9lc250RXhpc3QAAASoVGhlIHNwZWNpZmllZCBwYXJhY2hhaW4gaXMgbm90IHJlZ2lzdGVyZWQuNE5vdFBhcmF0aHJlYWQAAQScTm90IGEgcGFyYXRocmVhZCAob24tZGVtYW5kIHBhcmFjaGFpbikuNENhbm5vdFVwZ3JhZGUAAgjMQ2Fubm90IHVwZ3JhZGUgb24tZGVtYW5kIHBhcmFjaGFpbiB0byBsZWFzZSBob2xkaW5nKHBhcmFjaGFpbi48Q2Fubm90RG93bmdyYWRlAAMIrENhbm5vdCBkb3duZ3JhZGUgbGVhc2UgaG9sZGluZyBwYXJhY2hhaW4gdG8ob24tZGVtYW5kLkxTbG90QWxyZWFkeUFzc2lnbmVkAAQEtFBlcm1hbmVudCBvciBUZW1wb3Jhcnkgc2xvdCBhbHJlYWR5IGFzc2lnbmVkLjxTbG90Tm90QXNzaWduZWQABQTIUGVybWFuZW50IG9yIFRlbXBvcmFyeSBzbG90IGhhcyBub3QgYmVlbiBhc3NpZ25lZC5IT25nb2luZ0xlYXNlRXhpc3RzAAYEgEFuIG9uZ29pbmcgbGVhc2UgYWxyZWFkeSBleGlzdHMuZE1heFBlcm1hbmVudFNsb3RzRXhjZWVkZWQABwBkTWF4VGVtcG9yYXJ5U2xvdHNFeGNlZWRlZAAIAASAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC6hDhBscG9sa2Fkb3RfcnVudGltZV9wYXJhY2hhaW5zIGNvcmV0aW1lGHBhbGxldBRFcnJvcgQEVAABDCROb3RCcm9rZXIAAAQpAVRoZSBwYXJhaWQgbWFraW5nIHRoZSBjYWxsIGlzIG5vdCB0aGUgY29yZXRpbWUgYnJva2VyYWdlIHN5c3RlbSBwYXJhY2hhaW4uWFJlcXVlc3RlZEZ1dHVyZVJldmVudWUAAQhFAVJlcXVlc3RlZCByZXZlbnVlIGluZm9ybWF0aW9uIGB3aGVuYCBwYXJhbWV0ZXIgd2FzIGluIHRoZSBmdXR1cmUgZnJvbSB0aGUgY3VycmVudDRibG9jayBoZWlnaHQuTEFzc2V0VHJhbnNmZXJGYWlsZWQAAgS8RmFpbGVkIHRvIHRyYW5zZmVyIGFzc2V0cyB0byB0aGUgY29yZXRpbWUgY2hhaW4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQupQ4AAAQIEAECAKkOBCBCVHJlZU1hcAgESwEQBFYBrQ4ABAC9DgAAAK0OBCBCVHJlZU1hcAgESwEABFYBsQ4ABAC1DgAAALEOCHhwYWxsZXRfc3Rha2luZ19hc3luY19haF9jbGllbnQ8QnVmZmVyZWRPZmZlbmNlBCRBY2NvdW50SWQBAAAIASByZXBvcnRlcjUBAURPcHRpb248QWNjb3VudElkPgABOHNsYXNoX2ZyYWN0aW9umAFMc3BfcnVudGltZTo6UGVyYmlsbAAAtQ4AAAK5DgC5DgAABAgAsQ4AvQ4AAALBDgDBDgAABAgQrQ4AxQ4MeHBhbGxldF9zdGFraW5nX2FzeW5jX2FoX2NsaWVudBhwYWxsZXQURXJyb3IEBFQAAQQcQmxvY2tlZAAABCUBQ291bGQgbm90IHByb2Nlc3MgaW5jb21pbmcgbWVzc2FnZSBiZWNhdXNlIGluY29taW5nIG1lc3NhZ2VzIGFyZSBibG9ja2VkLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC7JDgxEcGFsbGV0X21pZ3JhdGlvbnMYcGFsbGV0FEVycm9yBARUAAEEHE9uZ29pbmcAAAToVGhlIG9wZXJhdGlvbiBjYW5ub3QgY29tcGxldGUgc2luY2Ugc29tZSBNQk1zIGFyZSBvbmdvaW5nLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC7NDgwocGFsbGV0X3hjbRhwYWxsZXQsUXVlcnlTdGF0dXMELEJsb2NrTnVtYmVyARABDBxQZW5kaW5nEAEkcmVzcG9uZGVyWQUBRFZlcnNpb25lZExvY2F0aW9uAAFMbWF5YmVfbWF0Y2hfcXVlcmllctEOAWRPcHRpb248VmVyc2lvbmVkTG9jYXRpb24+AAEwbWF5YmVfbm90aWZ51Q4BQE9wdGlvbjwodTgsIHU4KT4AARx0aW1lb3V0EAEsQmxvY2tOdW1iZXIAAAA8VmVyc2lvbk5vdGlmaWVyCAEYb3JpZ2luWQUBRFZlcnNpb25lZExvY2F0aW9uAAEkaXNfYWN0aXZlIAEQYm9vbAABABRSZWFkeQgBIHJlc3BvbnNl3Q4BRFZlcnNpb25lZFJlc3BvbnNlAAEIYXQQASxCbG9ja051bWJlcgACAADRDgQYT3B0aW9uBARUAVkFAQgQTm9uZQAAABBTb21lBABZBQAAAQAA1Q4EGE9wdGlvbgQEVAHZDgEIEE5vbmUAAAAQU29tZQQA2Q4AAAEAANkOAAAECAgIAN0OCAx4Y21EVmVyc2lvbmVkUmVzcG9uc2UAAQwIVjMEAHEGATB2Mzo6UmVzcG9uc2UAAwAIVjQEANkGATB2NDo6UmVzcG9uc2UABAAIVjUEACEHATB2NTo6UmVzcG9uc2UABQAA4Q4AAAQIEFkFAOUOAAAEDDAoEADpDgxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAe0OBFMAAAQA8Q4BGFZlYzxUPgAA7Q4AAAQIWQUQAPEOAAAC7Q4A9Q4MKHBhbGxldF94Y20YcGFsbGV0VFZlcnNpb25NaWdyYXRpb25TdGFnZQABEFxNaWdyYXRlU3VwcG9ydGVkVmVyc2lvbgAAAFxNaWdyYXRlVmVyc2lvbk5vdGlmaWVycwABAFBOb3RpZnlDdXJyZW50VGFyZ2V0cwQA2QcBPE9wdGlvbjxWZWM8dTg+PgACAGhNaWdyYXRlQW5kTm90aWZ5T2xkVGFyZ2V0cwADAAD5DgAABAwQABUIAP0ODChwYWxsZXRfeGNtGHBhbGxldGhSZW1vdGVMb2NrZWRGdW5naWJsZVJlY29yZAhIQ29uc3VtZXJJZGVudGlmaWVyAQUBME1heENvbnN1bWVycwAAEAEYYW1vdW50GAEQdTEyOAABFG93bmVyWQUBRFZlcnNpb25lZExvY2F0aW9uAAEYbG9ja2VyWQUBRFZlcnNpb25lZExvY2F0aW9uAAEkY29uc3VtZXJzAQ8B0EJvdW5kZWRWZWM8KENvbnN1bWVySWRlbnRpZmllciwgdTEyOCksIE1heENvbnN1bWVycz4AAAEPDExib3VuZGVkX2NvbGxlY3Rpb25zLGJvdW5kZWRfdmVjKEJvdW5kZWRWZWMIBFQBBQ8EUwAABAAJDwEYVmVjPFQ+AAAFDwAABAgFARgACQ8AAAIFDwANDwxMYm91bmRlZF9jb2xsZWN0aW9ucyxib3VuZGVkX3ZlYyhCb3VuZGVkVmVjCARUAREPBFMAAAQAFQ8BGFZlYzxUPgAAEQ8AAAQIGFkFABUPAAACEQ8AGQ8IKHBhbGxldF94Y21YQXV0aG9yaXplZEFsaWFzZXNFbnRyeQgYVGlja2V0AR0PDE1BWAEhDwAIASBhbGlhc2VycyUPAXhCb3VuZGVkVmVjPE9yaWdpbkFsaWFzZXIsIE1BWD4AARh0aWNrZXQdDwEYVGlja2V0AAAdDxA0ZnJhbWVfc3VwcG9ydBh0cmFpdHMcc3RvcmFnZSBEaXNhYmxlZAAAAAAhDwwocGFsbGV0X3hjbRhwYWxsZXRQTWF4QXV0aG9yaXplZEFsaWFzZXMAAAAAJQ8MTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAEpDwRTAAAEAC0PARhWZWM8VD4AACkPDEB4Y21fcnVudGltZV9hcGlzSGF1dGhvcml6ZWRfYWxpYXNlczRPcmlnaW5BbGlhc2VyAAAIASBsb2NhdGlvblkFAURWZXJzaW9uZWRMb2NhdGlvbgABGGV4cGlyeRkIASxPcHRpb248dTY0PgAALQ8AAAIpDwAxDwwocGFsbGV0X3hjbRhwYWxsZXQURXJyb3IEBFQAAXAsVW5yZWFjaGFibGUAAAhdAVRoZSBkZXNpcmVkIGRlc3RpbmF0aW9uIHdhcyB1bnJlYWNoYWJsZSwgZ2VuZXJhbGx5IGJlY2F1c2UgdGhlcmUgaXMgYSBubyB3YXkgb2Ygcm91dGluZxh0byBpdC4sU2VuZEZhaWx1cmUAAQhBAVRoZXJlIHdhcyBzb21lIG90aGVyIGlzc3VlIChpLmUuIG5vdCB0byBkbyB3aXRoIHJvdXRpbmcpIGluIHNlbmRpbmcgdGhlIG1lc3NhZ2UuyFBlcmhhcHMgYSBsYWNrIG9mIHNwYWNlIGZvciBidWZmZXJpbmcgdGhlIG1lc3NhZ2UuIEZpbHRlcmVkAAIEnFRoZSBtZXNzYWdlIGV4ZWN1dGlvbiBmYWlscyB0aGUgZmlsdGVyLkhVbndlaWdoYWJsZU1lc3NhZ2UAAwS0VGhlIG1lc3NhZ2UncyB3ZWlnaHQgY291bGQgbm90IGJlIGRldGVybWluZWQuYERlc3RpbmF0aW9uTm90SW52ZXJ0aWJsZQAEBNxUaGUgZGVzdGluYXRpb24gYExvY2F0aW9uYCBwcm92aWRlZCBjYW5ub3QgYmUgaW52ZXJ0ZWQuFEVtcHR5AAUEgFRoZSBhc3NldHMgdG8gYmUgc2VudCBhcmUgZW1wdHkuOENhbm5vdFJlYW5jaG9yAAYENQFDb3VsZCBub3QgcmUtYW5jaG9yIHRoZSBhc3NldHMgdG8gZGVjbGFyZSB0aGUgZmVlcyBmb3IgdGhlIGRlc3RpbmF0aW9uIGNoYWluLjRUb29NYW55QXNzZXRzAAcExFRvbyBtYW55IGFzc2V0cyBoYXZlIGJlZW4gYXR0ZW1wdGVkIGZvciB0cmFuc2Zlci40SW52YWxpZE9yaWdpbgAIBHhPcmlnaW4gaXMgaW52YWxpZCBmb3Igc2VuZGluZy4oQmFkVmVyc2lvbgAJBCEBVGhlIHZlcnNpb24gb2YgdGhlIGBWZXJzaW9uZWRgIHZhbHVlIHVzZWQgaXMgbm90IGFibGUgdG8gYmUgaW50ZXJwcmV0ZWQuLEJhZExvY2F0aW9uAAoIQQFUaGUgZ2l2ZW4gbG9jYXRpb24gY291bGQgbm90IGJlIHVzZWQgKGUuZy4gYmVjYXVzZSBpdCBjYW5ub3QgYmUgZXhwcmVzc2VkIGluIHRoZWBkZXNpcmVkIHZlcnNpb24gb2YgWENNKS44Tm9TdWJzY3JpcHRpb24ACwS8VGhlIHJlZmVyZW5jZWQgc3Vic2NyaXB0aW9uIGNvdWxkIG5vdCBiZSBmb3VuZC5EQWxyZWFkeVN1YnNjcmliZWQADAQRAVRoZSBsb2NhdGlvbiBpcyBpbnZhbGlkIHNpbmNlIGl0IGFscmVhZHkgaGFzIGEgc3Vic2NyaXB0aW9uIGZyb20gdXMuWENhbm5vdENoZWNrT3V0VGVsZXBvcnQADQQpAUNvdWxkIG5vdCBjaGVjay1vdXQgdGhlIGFzc2V0cyBmb3IgdGVsZXBvcnRhdGlvbiB0byB0aGUgZGVzdGluYXRpb24gY2hhaW4uKExvd0JhbGFuY2UADgRBAVRoZSBvd25lciBkb2VzIG5vdCBvd24gKGFsbCkgb2YgdGhlIGFzc2V0IHRoYXQgdGhleSB3aXNoIHRvIGRvIHRoZSBvcGVyYXRpb24gb24uMFRvb01hbnlMb2NrcwAPBMBUaGUgYXNzZXQgb3duZXIgaGFzIHRvbyBtYW55IGxvY2tzIG9uIHRoZSBhc3NldC5MQWNjb3VudE5vdFNvdmVyZWlnbgAQBDEBVGhlIGdpdmVuIGFjY291bnQgaXMgbm90IGFuIGlkZW50aWZpYWJsZSBzb3ZlcmVpZ24gYWNjb3VudCBmb3IgYW55IGxvY2F0aW9uLihGZWVzTm90TWV0ABEEKQFUaGUgb3BlcmF0aW9uIHJlcXVpcmVkIGZlZXMgdG8gYmUgcGFpZCB3aGljaCB0aGUgaW5pdGlhdG9yIGNvdWxkIG5vdCBtZWV0LjBMb2NrTm90Rm91bmQAEgT0QSByZW1vdGUgbG9jayB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIGRhdGEgY291bGQgbm90IGJlIGZvdW5kLhRJblVzZQATBEkBVGhlIHVubG9jayBvcGVyYXRpb24gY2Fubm90IHN1Y2NlZWQgYmVjYXVzZSB0aGVyZSBhcmUgc3RpbGwgY29uc3VtZXJzIG9mIHRoZSBsb2NrLmhJbnZhbGlkQXNzZXRVbmtub3duUmVzZXJ2ZQAVBPBJbnZhbGlkIGFzc2V0LCByZXNlcnZlIGNoYWluIGNvdWxkIG5vdCBiZSBkZXRlcm1pbmVkIGZvciBpdC54SW52YWxpZEFzc2V0VW5zdXBwb3J0ZWRSZXNlcnZlABYERQFJbnZhbGlkIGFzc2V0LCBkbyBub3Qgc3VwcG9ydCByZW1vdGUgYXNzZXQgcmVzZXJ2ZXMgd2l0aCBkaWZmZXJlbnQgZmVlcyByZXNlcnZlcy48VG9vTWFueVJlc2VydmVzABcESQFUb28gbWFueSBhc3NldHMgd2l0aCBkaWZmZXJlbnQgcmVzZXJ2ZSBsb2NhdGlvbnMgaGF2ZSBiZWVuIGF0dGVtcHRlZCBmb3IgdHJhbnNmZXIuYExvY2FsRXhlY3V0aW9uSW5jb21wbGV0ZQAYBHxMb2NhbCBYQ00gZXhlY3V0aW9uIGluY29tcGxldGUuYFRvb01hbnlBdXRob3JpemVkQWxpYXNlcwAZBLhUb28gbWFueSBsb2NhdGlvbnMgYXV0aG9yaXplZCB0byBhbGlhcyBvcmlnaW4uNEV4cGlyZXNJblBhc3QAGgSMRXhwaXJ5IGJsb2NrIG51bWJlciBpcyBpbiB0aGUgcGFzdC40QWxpYXNOb3RGb3VuZAAbBNBUaGUgYWxpYXMgdG8gcmVtb3ZlIGF1dGhvcml6YXRpb24gZm9yIHdhcyBub3QgZm91bmQuhExvY2FsRXhlY3V0aW9uSW5jb21wbGV0ZVdpdGhFcnJvcggBFGluZGV4CAFASW5zdHJ1Y3Rpb25JbmRleAABFGVycm9yNQ8BOEV4ZWN1dGlvbkVycm9yABwINQFMb2NhbCBYQ00gZXhlY3V0aW9uIGluY29tcGxldGUgd2l0aCB0aGUgYWN0dWFsIFhDTSBlcnJvciBhbmQgdGhlIGluZGV4IG9mIHRoZYhpbnN0cnVjdGlvbiB0aGF0IGNhdXNlZCB0aGUgZXJyb3IuBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LjUPDChwYWxsZXRfeGNtGGVycm9yczhFeGVjdXRpb25FcnJvcgABpCBPdmVyZmxvdwAAADRVbmltcGxlbWVudGVkAAEAYFVudHJ1c3RlZFJlc2VydmVMb2NhdGlvbgACAGRVbnRydXN0ZWRUZWxlcG9ydExvY2F0aW9uAAMAMExvY2F0aW9uRnVsbAAEAFRMb2NhdGlvbk5vdEludmVydGlibGUABQAkQmFkT3JpZ2luAAYAPEludmFsaWRMb2NhdGlvbgAHADRBc3NldE5vdEZvdW5kAAgAVEZhaWxlZFRvVHJhbnNhY3RBc3NldAAJADxOb3RXaXRoZHJhd2FibGUACgBITG9jYXRpb25DYW5ub3RIb2xkAAsAVEV4Y2VlZHNNYXhNZXNzYWdlU2l6ZQAMAFhEZXN0aW5hdGlvblVuc3VwcG9ydGVkAA0AJFRyYW5zcG9ydAAOAChVbnJvdXRhYmxlAA8AMFVua25vd25DbGFpbQAQADhGYWlsZWRUb0RlY29kZQARAEBNYXhXZWlnaHRJbnZhbGlkABIAOE5vdEhvbGRpbmdGZWVzABMAMFRvb0V4cGVuc2l2ZQAUABBUcmFwABUAQEV4cGVjdGF0aW9uRmFsc2UAFgA4UGFsbGV0Tm90Rm91bmQAFwAwTmFtZU1pc21hdGNoABgATFZlcnNpb25JbmNvbXBhdGlibGUAGQBQSG9sZGluZ1dvdWxkT3ZlcmZsb3cAGgAsRXhwb3J0RXJyb3IAGwA4UmVhbmNob3JGYWlsZWQAHAAYTm9EZWFsAB0AKEZlZXNOb3RNZXQAHgAkTG9ja0Vycm9yAB8AME5vUGVybWlzc2lvbgAgAChVbmFuY2hvcmVkACEAOE5vdERlcG9zaXRhYmxlACIANFRvb01hbnlBc3NldHMAIwBMVW5oYW5kbGVkWGNtVmVyc2lvbgAkAEhXZWlnaHRMaW1pdFJlYWNoZWQAJQAcQmFycmllcgAmAExXZWlnaHROb3RDb21wdXRhYmxlACcAREV4Y2VlZHNTdGFja0xpbWl0ACgAADkPCFBwYWxsZXRfbWVzc2FnZV9xdWV1ZSRCb29rU3RhdGUENE1lc3NhZ2VPcmlnaW4BIQgAGAEUYmVnaW4QASRQYWdlSW5kZXgAAQxlbmQQASRQYWdlSW5kZXgAARRjb3VudBABJFBhZ2VJbmRleAABQHJlYWR5X25laWdoYm91cnM9DwGET3B0aW9uPE5laWdoYm91cnM8TWVzc2FnZU9yaWdpbj4+AAE0bWVzc2FnZV9jb3VudDABDHU2NAABEHNpemUwAQx1NjQAAD0PBBhPcHRpb24EBFQBQQ8BCBBOb25lAAAAEFNvbWUEAEEPAAABAABBDwhQcGFsbGV0X21lc3NhZ2VfcXVldWUoTmVpZ2hib3VycwQ0TWVzc2FnZU9yaWdpbgEhCAAIARBwcmV2IQgBNE1lc3NhZ2VPcmlnaW4AARBuZXh0IQgBNE1lc3NhZ2VPcmlnaW4AAEUPAAAECCEIEABJDwhQcGFsbGV0X21lc3NhZ2VfcXVldWUQUGFnZQgQU2l6ZQEQIEhlYXBTaXplAAAYASRyZW1haW5pbmcQARBTaXplAAE4cmVtYWluaW5nX3NpemUQARBTaXplAAEsZmlyc3RfaW5kZXgQARBTaXplAAEUZmlyc3QQARBTaXplAAEQbGFzdBABEFNpemUAARBoZWFwTQ8BnEJvdW5kZWRWZWM8dTgsIEludG9VMzI8SGVhcFNpemUsIFNpemU+PgAATQ8MTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAEIBFMAAAQAOAEYVmVjPFQ+AABRDwxQcGFsbGV0X21lc3NhZ2VfcXVldWUYcGFsbGV0FEVycm9yBARUAAEkLE5vdFJlYXBhYmxlAAAISQFQYWdlIGlzIG5vdCByZWFwYWJsZSBiZWNhdXNlIGl0IGhhcyBpdGVtcyByZW1haW5pbmcgdG8gYmUgcHJvY2Vzc2VkIGFuZCBpcyBub3Qgb2xkHGVub3VnaC4YTm9QYWdlAAEEhFBhZ2UgdG8gYmUgcmVhcGVkIGRvZXMgbm90IGV4aXN0LiROb01lc3NhZ2UAAgSoVGhlIHJlZmVyZW5jZWQgbWVzc2FnZSBjb3VsZCBub3QgYmUgZm91bmQuQEFscmVhZHlQcm9jZXNzZWQAAwQBAVRoZSBtZXNzYWdlIHdhcyBhbHJlYWR5IHByb2Nlc3NlZCBhbmQgY2Fubm90IGJlIHByb2Nlc3NlZCBhZ2Fpbi4YUXVldWVkAAQErFRoZSBtZXNzYWdlIGlzIHF1ZXVlZCBmb3IgZnV0dXJlIGV4ZWN1dGlvbi5ISW5zdWZmaWNpZW50V2VpZ2h0AAUEGQFUaGVyZSBpcyB0ZW1wb3JhcmlseSBub3QgZW5vdWdoIHdlaWdodCB0byBjb250aW51ZSBzZXJ2aWNpbmcgbWVzc2FnZXMuYFRlbXBvcmFyaWx5VW5wcm9jZXNzYWJsZQAGEKhUaGlzIG1lc3NhZ2UgaXMgdGVtcG9yYXJpbHkgdW5wcm9jZXNzYWJsZS4AWQFTdWNoIGVycm9ycyBhcmUgZXhwZWN0ZWQsIGJ1dCBub3QgZ3VhcmFudGVlZCwgdG8gcmVzb2x2ZSB0aGVtc2VsdmVzIGV2ZW50dWFsbHkgdGhyb3VnaCRyZXRyeWluZy4sUXVldWVQYXVzZWQABwzsVGhlIHF1ZXVlIGlzIHBhdXNlZCBhbmQgbm8gbWVzc2FnZSBjYW4gYmUgZXhlY3V0ZWQgZnJvbSBpdC4AHQFUaGlzIGNhbiBjaGFuZ2UgYXQgYW55IHRpbWUgYW5kIG1heSByZXNvbHZlIGluIHRoZSBmdXR1cmUgYnkgcmUtdHJ5aW5nLkxSZWN1cnNpdmVEaXNhbGxvd2VkAAgEMQFBbm90aGVyIGNhbGwgaXMgaW4gcHJvZ3Jlc3MgYW5kIG5lZWRzIHRvIGZpbmlzaCBiZWZvcmUgdGhpcyBjYWxsIGNhbiBoYXBwZW4uBIBUaGUgYEVycm9yYCBlbnVtIG9mIHRoaXMgcGFsbGV0LlUPDERwYWxsZXRfYXNzZXRfcmF0ZRhwYWxsZXQURXJyb3IEBFQAAQxAVW5rbm93bkFzc2V0S2luZAAABHhUaGUgZ2l2ZW4gYXNzZXQgSUQgaXMgdW5rbm93bi40QWxyZWFkeUV4aXN0cwABBFEBVGhlIGdpdmVuIGFzc2V0IElEIGFscmVhZHkgaGFzIGFuIGFzc2lnbmVkIGNvbnZlcnNpb24gcmF0ZSBhbmQgY2Fubm90IGJlIHJlLWNyZWF0ZWQuIE92ZXJmbG93AAIEzE92ZXJmbG93IG9jdXJyZWQgd2hlbiBjYWxjdWxhdGluZyB0aGUgaW52ZXJzZSByYXRlLgSAVGhlIGBFcnJvcmAgZW51bSBvZiB0aGlzIHBhbGxldC5ZDww4cGFsbGV0X21ldGFfdHgYcGFsbGV0FEVycm9yBARUAAEYIEJhZFByb29mAAAEfEludmFsaWQgcHJvb2YgKGUuZy4gc2lnbmF0dXJlKS4YRnV0dXJlAAEE8FRoZSBtZXRhIHRyYW5zYWN0aW9uIGlzIG5vdCB5ZXQgdmFsaWQgKGUuZy4gbm9uY2UgdG9vIGhpZ2gpLhRTdGFsZQACBNhUaGUgbWV0YSB0cmFuc2FjdGlvbiBpcyBvdXRkYXRlZCAoZS5nLiBub25jZSB0b28gbG93KS5EQW5jaWVudEJpcnRoQmxvY2sAAwS8VGhlIG1ldGEgdHJhbnNhY3Rpb25zJ3MgYmlydGggYmxvY2sgaXMgYW5jaWVudC40VW5rbm93bk9yaWdpbgAEBNxUaGUgdHJhbnNhY3Rpb24gZXh0ZW5zaW9uIGRpZCBub3QgYXV0aG9yaXplIGFueSBvcmlnaW4uHEludmFsaWQABQSAVGhlIG1ldGEgdHJhbnNhY3Rpb24gaXMgaW52YWxpZC4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQuXQ8MTGJvdW5kZWRfY29sbGVjdGlvbnMsYm91bmRlZF92ZWMoQm91bmRlZFZlYwgEVAFlAgRTAAAEAGEPARhWZWM8VD4AAGEPAAACZQIAZQ8MMHBhbGxldF9iZWVmeRhwYWxsZXQURXJyb3IEBFQAARxgSW52YWxpZEtleU93bmVyc2hpcFByb29mAAAEMQFBIGtleSBvd25lcnNoaXAgcHJvb2YgcHJvdmlkZWQgYXMgcGFydCBvZiBhbiBlcXVpdm9jYXRpb24gcmVwb3J0IGlzIGludmFsaWQuYEludmFsaWREb3VibGVWb3RpbmdQcm9vZgABBDEBQSBkb3VibGUgdm90aW5nIHByb29mIHByb3ZpZGVkIGFzIHBhcnQgb2YgYW4gZXF1aXZvY2F0aW9uIHJlcG9ydCBpcyBpbnZhbGlkLlhJbnZhbGlkRm9ya1ZvdGluZ1Byb29mAAIEKQFBIGZvcmsgdm90aW5nIHByb29mIHByb3ZpZGVkIGFzIHBhcnQgb2YgYW4gZXF1aXZvY2F0aW9uIHJlcG9ydCBpcyBpbnZhbGlkLnRJbnZhbGlkRnV0dXJlQmxvY2tWb3RpbmdQcm9vZgADBEkBQSBmdXR1cmUgYmxvY2sgdm90aW5nIHByb29mIHByb3ZpZGVkIGFzIHBhcnQgb2YgYW4gZXF1aXZvY2F0aW9uIHJlcG9ydCBpcyBpbnZhbGlkLnxJbnZhbGlkRXF1aXZvY2F0aW9uUHJvb2ZTZXNzaW9uAAQEwFRoZSBzZXNzaW9uIG9mIHRoZSBlcXVpdm9jYXRpb24gcHJvb2YgaXMgaW52YWxpZFhEdXBsaWNhdGVPZmZlbmNlUmVwb3J0AAUEFQFBIGdpdmVuIGVxdWl2b2NhdGlvbiByZXBvcnQgaXMgdmFsaWQgYnV0IGFscmVhZHkgcHJldmlvdXNseSByZXBvcnRlZC5QSW52YWxpZENvbmZpZ3VyYXRpb24ABgSMU3VibWl0dGVkIGNvbmZpZ3VyYXRpb24gaXMgaW52YWxpZC4EgFRoZSBgRXJyb3JgIGVudW0gb2YgdGhpcyBwYWxsZXQuaQ8MSHNwX2NvbnNlbnN1c19iZWVmeQxtbXJEQmVlZnlBdXRob3JpdHlTZXQEWEF1dGhvcml0eVNldENvbW1pdG1lbnQBNAAMAQhpZDABVGNyYXRlOjpWYWxpZGF0b3JTZXRJZAABDGxlbhABDHUzMgABRGtleXNldF9jb21taXRtZW50NAFYQXV0aG9yaXR5U2V0Q29tbWl0bWVudAAAbQ8AAAQscQ9JCE0IUQhVCFkIYQh1D3kPZQh9DwBxDxAwZnJhbWVfc3lzdGVtKGV4dGVuc2lvbnM4YXV0aG9yaXplX2NhbGw0QXV0aG9yaXplQ2FsbAQEVAAAAAB1DxAwZnJhbWVfc3lzdGVtKGV4dGVuc2lvbnMwY2hlY2tfd2VpZ2h0LENoZWNrV2VpZ2h0BARUAAAAAHkPCGhwYWxsZXRfdHJhbnNhY3Rpb25fcGF5bWVudGBDaGFyZ2VUcmFuc2FjdGlvblBheW1lbnQEBFQAAAQA/QEBMEJhbGFuY2VPZjxUPgAAfQ8QMGZyYW1lX3N5c3RlbShleHRlbnNpb25zOHdlaWdodF9yZWNsYWltNFdlaWdodFJlY2xhaW0EBFQAAAAAgQ8QKHNwX3J1bnRpbWUcZ2VuZXJpYxRibG9jaxRCbG9jawgYSGVhZGVyAcUBJEV4dHJpbnNpYwGFDwAIARhoZWFkZXLFAQEYSGVhZGVyAAEoZXh0cmluc2ljc4kPAThWZWM8RXh0cmluc2ljPgAAhQ8QKHNwX3J1bnRpbWUcZ2VuZXJpY0x1bmNoZWNrZWRfZXh0cmluc2ljSFVuY2hlY2tlZEV4dHJpbnNpYxAcQWRkcmVzcwHtARBDYWxsAakBJFNpZ25hdHVyZQGVAxRFeHRyYQFtDwAEADgAAACJDwAAAoUPAI0PCChzcF9ydW50aW1lWEV4dHJpbnNpY0luY2x1c2lvbk1vZGUAAQg0QWxsRXh0cmluc2ljcwAAADRPbmx5SW5oZXJlbnRzAAEAAJEPCBxzcF9jb3JlOE9wYXF1ZU1ldGFkYXRhAAAEADgBHFZlYzx1OD4AAJUPBBhPcHRpb24EBFQBkQ8BCBBOb25lAAAAEFNvbWUEAJEPAAABAACZDww0ZnJhbWVfc3VwcG9ydDh2aWV3X2Z1bmN0aW9uczhWaWV3RnVuY3Rpb25JZAAACAEYcHJlZml4sAEgW3U4OyAxNl0AARhzdWZmaXiwASBbdTg7IDE2XQAAnQ8EGFJlc3VsdAgEVAE4BEUBoQ8BCAhPawQAOAAAAAAMRXJyBAChDwAAAQAAoQ8MNGZyYW1lX3N1cHBvcnQ4dmlld19mdW5jdGlvbnNkVmlld0Z1bmN0aW9uRGlzcGF0Y2hFcnJvcgABDDhOb3RJbXBsZW1lbnRlZAAAACBOb3RGb3VuZAQAmQ8BOFZpZXdGdW5jdGlvbklkAAEAFENvZGVjAAIAAKUPBBhSZXN1bHQIBFQBAQEERQGpDwEICE9rBAABAQAAAAAMRXJyBACpDwAAAQAAqQ8MKHNwX3J1bnRpbWVQdHJhbnNhY3Rpb25fdmFsaWRpdHlgVHJhbnNhY3Rpb25WYWxpZGl0eUVycm9yAAEIHEludmFsaWQEAK0PAUhJbnZhbGlkVHJhbnNhY3Rpb24AAAAcVW5rbm93bgQAsQ8BSFVua25vd25UcmFuc2FjdGlvbgABAACtDwwoc3BfcnVudGltZVB0cmFuc2FjdGlvbl92YWxpZGl0eUhJbnZhbGlkVHJhbnNhY3Rpb24AATQQQ2FsbAAAABxQYXltZW50AAEAGEZ1dHVyZQACABRTdGFsZQADACBCYWRQcm9vZgAEAERBbmNpZW50QmlydGhCbG9jawAFAERFeGhhdXN0c1Jlc291cmNlcwAGABhDdXN0b20EAAgBCHU4AAcAMEJhZE1hbmRhdG9yeQAIAExNYW5kYXRvcnlWYWxpZGF0aW9uAAkAJEJhZFNpZ25lcgAKAFRJbmRldGVybWluYXRlSW1wbGljaXQACwA0VW5rbm93bk9yaWdpbgAMAACxDwwoc3BfcnVudGltZVB0cmFuc2FjdGlvbl92YWxpZGl0eUhVbmtub3duVHJhbnNhY3Rpb24AAQwwQ2Fubm90TG9va3VwAAAATE5vVW5zaWduZWRWYWxpZGF0b3IAAQAYQ3VzdG9tBAAIAQh1OAACAAC1Dwgwc3BfaW5oZXJlbnRzMEluaGVyZW50RGF0YQAABAEQZGF0YbkPAZRCVHJlZU1hcDxJbmhlcmVudElkZW50aWZpZXIsIFZlYzx1OD4+AAC5DwQgQlRyZWVNYXAIBEsBJQMEVgE4AAQAvQ8AAAC9DwAAAsEPAMEPAAAECCUDOADFDwgwc3BfaW5oZXJlbnRzUENoZWNrSW5oZXJlbnRzUmVzdWx0AAAMARBva2F5IAEQYm9vbAABLGZhdGFsX2Vycm9yIAEQYm9vbAABGGVycm9yc7UPATBJbmhlcmVudERhdGEAAMkPDChzcF9ydW50aW1lUHRyYW5zYWN0aW9uX3ZhbGlkaXR5RFRyYW5zYWN0aW9uU291cmNlAAEMHEluQmxvY2sAAAAUTG9jYWwAAQAgRXh0ZXJuYWwAAgAAzQ8EGFJlc3VsdAgEVAHRDwRFAakPAQgIT2sEANEPAAAAAAxFcnIEAKkPAAABAADRDwwoc3BfcnVudGltZVB0cmFuc2FjdGlvbl92YWxpZGl0eUBWYWxpZFRyYW5zYWN0aW9uAAAUASBwcmlvcml0eTABTFRyYW5zYWN0aW9uUHJpb3JpdHkAASByZXF1aXJlc7kBAUxWZWM8VHJhbnNhY3Rpb25UYWc+AAEgcHJvdmlkZXO5AQFMVmVjPFRyYW5zYWN0aW9uVGFnPgABJGxvbmdldml0eTABUFRyYW5zYWN0aW9uTG9uZ2V2aXR5AAEkcHJvcGFnYXRlIAEQYm9vbAAA1Q8AAAQITQ3ZDwDZDwxMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2OERHcm91cFJvdGF0aW9uSW5mbwQETgEQAAwBTHNlc3Npb25fc3RhcnRfYmxvY2sQAQROAAFgZ3JvdXBfcm90YXRpb25fZnJlcXVlbmN5EAEETgABDG5vdxABBE4AAN0PAAAC4Q8A4Q8MTHBvbGthZG90X3ByaW1pdGl2ZXMgdnN0YWdpbmckQ29yZVN0YXRlCARIATQETgEQAQwgT2NjdXBpZWQEAOUPAUhPY2N1cGllZENvcmU8SCwgTj4AAAAkU2NoZWR1bGVkBADtDwE0U2NoZWR1bGVkQ29yZQABABBGcmVlAAIAAOUPDExwb2xrYWRvdF9wcmltaXRpdmVzIHZzdGFnaW5nME9jY3VwaWVkQ29yZQgESAE0BE4BEAAgAVBuZXh0X3VwX29uX2F2YWlsYWJsZekPAVRPcHRpb248U2NoZWR1bGVkQ29yZT4AAThvY2N1cGllZF9zaW5jZRABBE4AASx0aW1lX291dF9hdBABBE4AAUxuZXh0X3VwX29uX3RpbWVfb3V06Q8BVE9wdGlvbjxTY2hlZHVsZWRDb3JlPgABMGF2YWlsYWJpbGl0eZ0FAXxCaXRWZWM8dTgsIGJpdHZlYzo6b3JkZXI6OkxzYjA+AAFEZ3JvdXBfcmVzcG9uc2libGXVCAEoR3JvdXBJbmRleAABOGNhbmRpZGF0ZV9oYXNo9QUBNENhbmRpZGF0ZUhhc2gAAVBjYW5kaWRhdGVfZGVzY3JpcHRvcrkFAWBDYW5kaWRhdGVEZXNjcmlwdG9yVjI8SD4AAOkPBBhPcHRpb24EBFQB7Q8BCBBOb25lAAAAEFNvbWUEAO0PAAABAADtDwxMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2ODRTY2hlZHVsZWRDb3JlAAAIARxwYXJhX2lksQIBCElkAAEgY29sbGF0b3LxDwFIT3B0aW9uPENvbGxhdG9ySWQ+AADxDwQYT3B0aW9uBARUAfUPAQgQTm9uZQAAABBTb21lBAD1DwAAAQAA9Q8QTHBvbGthZG90X3ByaW1pdGl2ZXMIdjgwY29sbGF0b3JfYXBwGFB1YmxpYwAABAAEATxzcjI1NTE5OjpQdWJsaWMAAPkPDExwb2xrYWRvdF9wcmltaXRpdmVzCHY4WE9jY3VwaWVkQ29yZUFzc3VtcHRpb24AAQwgSW5jbHVkZWQAAAAgVGltZWRPdXQAAQAQRnJlZQACAAD9DwQYT3B0aW9uBARUAQEQAQgQTm9uZQAAABBTb21lBAABEAAAAQAAARAMTHBvbGthZG90X3ByaW1pdGl2ZXMIdjhcUGVyc2lzdGVkVmFsaWRhdGlvbkRhdGEIBEgBNAROARAAEAEscGFyZW50X2hlYWThBQEgSGVhZERhdGEAAUxyZWxheV9wYXJlbnRfbnVtYmVyEAEETgABZHJlbGF5X3BhcmVudF9zdG9yYWdlX3Jvb3Q0AQRIAAEwbWF4X3Bvdl9zaXplEAEMdTMyAAAFEAQYT3B0aW9uBARUAQkQAQgQTm9uZQAAABBTb21lBAAJEAAAAQAACRAAAAQIARDBBQANEAQYT3B0aW9uBARUAbUFAQgQTm9uZQAAABBTb21lBAC1BQAAAQAAERAAAAIVEAAVEAxMcG9sa2Fkb3RfcHJpbWl0aXZlcyB2c3RhZ2luZzhDYW5kaWRhdGVFdmVudAQESAE0AQw8Q2FuZGlkYXRlQmFja2VkEADNCAFUQ2FuZGlkYXRlUmVjZWlwdFYyPEg+AADhBQEgSGVhZERhdGEAANEIASRDb3JlSW5kZXgAANUIAShHcm91cEluZGV4AAAARENhbmRpZGF0ZUluY2x1ZGVkEADNCAFUQ2FuZGlkYXRlUmVjZWlwdFYyPEg+AADhBQEgSGVhZERhdGEAANEIASRDb3JlSW5kZXgAANUIAShHcm91cEluZGV4AAEARENhbmRpZGF0ZVRpbWVkT3V0DADNCAFUQ2FuZGlkYXRlUmVjZWlwdFYyPEg+AADhBQEgSGVhZERhdGEAANEIASRDb3JlSW5kZXgAAgAAGRAEIEJUcmVlTWFwCARLAbECBFYBwQ0ABAAdEAAAAB0QAAACIRAAIRAAAAQIsQLBDQAlEAQYT3B0aW9uBARUATUNAQgQTm9uZQAAABBTb21lBAA1DQAAAQAAKRAEGE9wdGlvbgQEVAHZDQEIEE5vbmUAAAAQU29tZQQA2Q0AAAEAAC0QBBhPcHRpb24EBFQBwQUBCBBOb25lAAAAEFNvbWUEAMEFAAABAAAxEAAAAjUQADUQAAAEDBD1BekNADkQBBhPcHRpb24EBFQBZQUBCBBOb25lAAAAEFNvbWUEAGUFAAABAAA9EAAAAkEQAEEQAAAEDBD1BUUQAEUQEExwb2xrYWRvdF9wcmltaXRpdmVzCHY4IHNsYXNoaW5nOFBlbmRpbmdTbGFzaGVzAAAIARBrZXlz+Q0BlEJUcmVlTWFwPFZhbGlkYXRvckluZGV4LCBWYWxpZGF0b3JJZD4AARBraW5kSRABTFNsYXNoaW5nT2ZmZW5jZUtpbmQAAEkQEExwb2xrYWRvdF9wcmltaXRpdmVzCHY4IHNsYXNoaW5nTFNsYXNoaW5nT2ZmZW5jZUtpbmQAAQgoRm9ySW52YWxpZAAAADBBZ2FpbnN0VmFsaWQAAQAATRAEGE9wdGlvbgQEVAFREAEIEE5vbmUAAAAQU29tZQQAURAAAAEAAFEQEExwb2xrYWRvdF9wcmltaXRpdmVzCHY4IHNsYXNoaW5nXE9wYXF1ZUtleU93bmVyc2hpcFByb29mAAAEADgBHFZlYzx1OD4AAFUQEExwb2xrYWRvdF9wcmltaXRpdmVzCHY4IHNsYXNoaW5nMERpc3B1dGVQcm9vZgAAEAEkdGltZV9zbG90MQYBQERpc3B1dGVzVGltZVNsb3QAARBraW5kSRABTFNsYXNoaW5nT2ZmZW5jZUtpbmQAATx2YWxpZGF0b3JfaW5kZXilBQE4VmFsaWRhdG9ySW5kZXgAATB2YWxpZGF0b3JfaWRZAgEsVmFsaWRhdG9ySWQAAFkQBBhPcHRpb24EBFQBBQEBCBBOb25lAAAAEFNvbWUEAAUBAAABAABdEAQYT3B0aW9uBARUAWEQAQgQTm9uZQAAABBTb21lBABhEAAAAQAAYRAQTHBvbGthZG90X3ByaW1pdGl2ZXMgdnN0YWdpbmc0YXN5bmNfYmFja2luZzBCYWNraW5nU3RhdGUIBEgBNAROARAACAEsY29uc3RyYWludHNlEAGQY3JhdGU6OmFzeW5jX2JhY2tpbmc6OkNvbnN0cmFpbnRzPE4+AAFQcGVuZGluZ19hdmFpbGFiaWxpdHmFEAGcVmVjPENhbmRpZGF0ZVBlbmRpbmdBdmFpbGFiaWxpdHk8SCwgTj4+AABlEBBMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2ODRhc3luY19iYWNraW5nLENvbnN0cmFpbnRzBAROARAAOAFcbWluX3JlbGF5X3BhcmVudF9udW1iZXIQAQROAAEwbWF4X3Bvdl9zaXplEAEMdTMyAAE0bWF4X2NvZGVfc2l6ZRABDHUzMgABNHVtcF9yZW1haW5pbmcQAQx1MzIAAUx1bXBfcmVtYWluaW5nX2J5dGVzEAEMdTMyAAFkbWF4X3VtcF9udW1fcGVyX2NhbmRpZGF0ZRABDHUzMgABWGRtcF9yZW1haW5pbmdfbWVzc2FnZXORAQEYVmVjPE4+AAEwaHJtcF9pbmJvdW5kaRABZEluYm91bmRIcm1wTGltaXRhdGlvbnM8Tj4AAURocm1wX2NoYW5uZWxzX291dG0QAaRWZWM8KElkLCBPdXRib3VuZEhybXBDaGFubmVsTGltaXRhdGlvbnMpPgABaG1heF9ocm1wX251bV9wZXJfY2FuZGlkYXRlEAEMdTMyAAE8cmVxdWlyZWRfcGFyZW504QUBIEhlYWREYXRhAAFQdmFsaWRhdGlvbl9jb2RlX2hhc2jBBQFIVmFsaWRhdGlvbkNvZGVIYXNoAAFMdXBncmFkZV9yZXN0cmljdGlvbnkQAWhPcHRpb248VXBncmFkZVJlc3RyaWN0aW9uPgABWGZ1dHVyZV92YWxpZGF0aW9uX2NvZGV9EAF8T3B0aW9uPChOLCBWYWxpZGF0aW9uQ29kZUhhc2gpPgAAaRAQTHBvbGthZG90X3ByaW1pdGl2ZXMIdjg0YXN5bmNfYmFja2luZ1hJbmJvdW5kSHJtcExpbWl0YXRpb25zBAROARAABAFAdmFsaWRfd2F0ZXJtYXJrc5EBARhWZWM8Tj4AAG0QAAACcRAAcRAAAAQIsQJ1EAB1EBBMcG9sa2Fkb3RfcHJpbWl0aXZlcwh2ODRhc3luY19iYWNraW5neE91dGJvdW5kSHJtcENoYW5uZWxMaW1pdGF0aW9ucwAACAE8Ynl0ZXNfcmVtYWluaW5nEAEMdTMyAAFIbWVzc2FnZXNfcmVtYWluaW5nEAEMdTMyAAB5EAQYT3B0aW9uBARUAZ0NAQgQTm9uZQAAABBTb21lBACdDQAAAQAAfRAEGE9wdGlvbgQEVAGBEAEIEE5vbmUAAAAQU29tZQQAgRAAAAEAAIEQAAAECBDBBQCFEAAAAokQAIkQEExwb2xrYWRvdF9wcmltaXRpdmVzIHZzdGFnaW5nNGFzeW5jX2JhY2tpbmdwQ2FuZGlkYXRlUGVuZGluZ0F2YWlsYWJpbGl0eQgESAE0BE4BEAAUAThjYW5kaWRhdGVfaGFzaPUFATRDYW5kaWRhdGVIYXNoAAEoZGVzY3JpcHRvcrkFAWBDYW5kaWRhdGVEZXNjcmlwdG9yVjI8SD4AASxjb21taXRtZW50c8UFAVBDYW5kaWRhdGVDb21taXRtZW50cwABTHJlbGF5X3BhcmVudF9udW1iZXIQAQROAAEwbWF4X3Bvdl9zaXplEAEMdTMyAACNEAQgQlRyZWVNYXAIBEsB0QgEVgF5DQAEAJEQAAAAkRAAAAKVEACVEAAABAjRCHkNAJkQAAACtQUAnRAEGE9wdGlvbgQEVAGhEAEIEE5vbmUAAAAQU29tZQQAoRAAAAEAAKEQEExwb2xrYWRvdF9wcmltaXRpdmVzIHZzdGFnaW5nNGFzeW5jX2JhY2tpbmcsQ29uc3RyYWludHMEBE4BEAA8AVxtaW5fcmVsYXlfcGFyZW50X251bWJlchABBE4AATBtYXhfcG92X3NpemUQAQx1MzIAATRtYXhfY29kZV9zaXplEAEMdTMyAAFIbWF4X2hlYWRfZGF0YV9zaXplEAEMdTMyAAE0dW1wX3JlbWFpbmluZxABDHUzMgABTHVtcF9yZW1haW5pbmdfYnl0ZXMQAQx1MzIAAWRtYXhfdW1wX251bV9wZXJfY2FuZGlkYXRlEAEMdTMyAAFYZG1wX3JlbWFpbmluZ19tZXNzYWdlc5EBARhWZWM8Tj4AATBocm1wX2luYm91bmRpEAFkSW5ib3VuZEhybXBMaW1pdGF0aW9uczxOPgABRGhybXBfY2hhbm5lbHNfb3V0bRABpFZlYzwoSWQsIE91dGJvdW5kSHJtcENoYW5uZWxMaW1pdGF0aW9ucyk+AAFobWF4X2hybXBfbnVtX3Blcl9jYW5kaWRhdGUQAQx1MzIAATxyZXF1aXJlZF9wYXJlbnThBQEgSGVhZERhdGEAAVB2YWxpZGF0aW9uX2NvZGVfaGFzaMEFAUhWYWxpZGF0aW9uQ29kZUhhc2gAAUx1cGdyYWRlX3Jlc3RyaWN0aW9ueRABaE9wdGlvbjxVcGdyYWRlUmVzdHJpY3Rpb24+AAFYZnV0dXJlX3ZhbGlkYXRpb25fY29kZX0QAXxPcHRpb248KE4sIFZhbGlkYXRpb25Db2RlSGFzaCk+AAClEAQYT3B0aW9uBARUAakQAQgQTm9uZQAAABBTb21lBACpEAAAAQAAqRAISHNwX2NvbnNlbnN1c19iZWVmeTBWYWxpZGF0b3JTZXQELEF1dGhvcml0eUlkAWUCAAgBKHZhbGlkYXRvcnNhDwFAVmVjPEF1dGhvcml0eUlkPgABCGlkMAE4VmFsaWRhdG9yU2V0SWQAAK0QCChzcF9ydW50aW1lLE9wYXF1ZVZhbHVlAAAEADgBHFZlYzx1OD4AALEQCEhzcF9jb25zZW5zdXNfYmVlZnk8Rm9ya1ZvdGluZ1Byb29mDBhIZWFkZXIBxQEISWQBZQI0QW5jZXN0cnlQcm9vZgGtEAAMARB2b3RleQgBuFZvdGVNZXNzYWdlPEhlYWRlcjo6TnVtYmVyLCBJZCwgSWQ6OlNpZ25hdHVyZT4AAThhbmNlc3RyeV9wcm9vZq0QATRBbmNlc3RyeVByb29mAAEYaGVhZGVyxQEBGEhlYWRlcgAAtRAEGE9wdGlvbgQEVAGtEAEIEE5vbmUAAAAQU29tZQQArRAAAAEAALkQBBhSZXN1bHQIBFQBNARFAb0QAQgIT2sEADQAAAAADEVycgQAvRAAAAEAAL0QCERzcF9tbXJfcHJpbWl0aXZlcxRFcnJvcgABKEBJbnZhbGlkTnVtZXJpY09wAAAAEFB1c2gAAQAcR2V0Um9vdAACABhDb21taXQAAwA0R2VuZXJhdGVQcm9vZgAEABhWZXJpZnkABQAwTGVhZk5vdEZvdW5kAAYARFBhbGxldE5vdEluY2x1ZGVkAAcAQEludmFsaWRMZWFmSW5kZXgACABUSW52YWxpZEJlc3RLbm93bkJsb2NrAAkAAMEQBBhSZXN1bHQIBFQBMARFAb0QAQgIT2sEADAAAAAADEVycgQAvRAAAAEAAMUQBBhSZXN1bHQIBFQByRAERQG9EAEICE9rBADJEAAAAAAMRXJyBAC9EAAAAQAAyRAAAAQIzRDVEADNEAAAAtEQANEQCERzcF9tbXJfcHJpbWl0aXZlc0xFbmNvZGFibGVPcGFxdWVMZWFmAAAEADgBHFZlYzx1OD4AANUQCERzcF9tbXJfcHJpbWl0aXZlcyRMZWFmUHJvb2YEEEhhc2gBNAAMATBsZWFmX2luZGljZXPhCwE4VmVjPExlYWZJbmRleD4AAShsZWFmX2NvdW50MAEkTm9kZUluZGV4AAEUaXRlbXO5AwEkVmVjPEhhc2g+AADZEAQYUmVzdWx0CARUAQUBBEUBvRABCAhPawQABQEAAAAADEVycgQAvRAAAAEAAN0QCERzcF9jb25zZW5zdXNfYmFiZURCYWJlQ29uZmlndXJhdGlvbgAAGAE0c2xvdF9kdXJhdGlvbjABDHU2NAABMGVwb2NoX2xlbmd0aDABDHU2NAABBGPdAQEoKHU2NCwgdTY0KQABLGF1dGhvcml0aWVziQkBnFZlYzwoQXV0aG9yaXR5SWQsIEJhYmVBdXRob3JpdHlXZWlnaHQpPgABKHJhbmRvbW5lc3MEAShSYW5kb21uZXNzAAE0YWxsb3dlZF9zbG90c+EBATBBbGxvd2VkU2xvdHMAAOEQCERzcF9jb25zZW5zdXNfYmFiZRRFcG9jaAAAGAEsZXBvY2hfaW5kZXgwAQx1NjQAAShzdGFydF9zbG900QEBEFNsb3QAASBkdXJhdGlvbjABDHU2NAABLGF1dGhvcml0aWVziQkBnFZlYzwoQXV0aG9yaXR5SWQsIEJhYmVBdXRob3JpdHlXZWlnaHQpPgABKHJhbmRvbW5lc3MEAShSYW5kb21uZXNzAAEYY29uZmlnrQkBWEJhYmVFcG9jaENvbmZpZ3VyYXRpb24AAOUQBBhPcHRpb24EBFQB6RABCBBOb25lAAAAEFNvbWUEAOkQAAABAADpEAhEc3BfY29uc2Vuc3VzX2JhYmVcT3BhcXVlS2V5T3duZXJzaGlwUHJvb2YAAAQAOAEcVmVjPHU4PgAA7RAEGE9wdGlvbgQEVAHxEAEIEE5vbmUAAAAQU29tZQQA8RAAAAEAAPEQAAAC9RAA9RAAAAQIOKUKAPkQDGhwYWxsZXRfdHJhbnNhY3Rpb25fcGF5bWVudBR0eXBlc0xSdW50aW1lRGlzcGF0Y2hJbmZvCBxCYWxhbmNlARgYV2VpZ2h0ASgADAEYd2VpZ2h0KAEYV2VpZ2h0AAEUY2xhc3NgATREaXNwYXRjaENsYXNzAAEscGFydGlhbF9mZWUYARxCYWxhbmNlAAD9EAxocGFsbGV0X3RyYW5zYWN0aW9uX3BheW1lbnQUdHlwZXMoRmVlRGV0YWlscwQcQmFsYW5jZQEYAAgBNGluY2x1c2lvbl9mZWUBEQF0T3B0aW9uPEluY2x1c2lvbkZlZTxCYWxhbmNlPj4AAQx0aXAYARxCYWxhbmNlAAABEQQYT3B0aW9uBARUAQURAQgQTm9uZQAAABBTb21lBAAFEQAAAQAABREMaHBhbGxldF90cmFuc2FjdGlvbl9wYXltZW50FHR5cGVzMEluY2x1c2lvbkZlZQQcQmFsYW5jZQEYAAwBIGJhc2VfZmVlGAEcQmFsYW5jZQABHGxlbl9mZWUYARxCYWxhbmNlAAFMYWRqdXN0ZWRfd2VpZ2h0X2ZlZRgBHEJhbGFuY2UAAAkRBBhSZXN1bHQIBFQBDREERQEREQEICE9rBAANEQAAAAAMRXJyBAAREQAAAQAADREAAAIVCAAREQxAeGNtX3J1bnRpbWVfYXBpcxBmZWVzFEVycm9yAAEYNFVuaW1wbGVtZW50ZWQAAABkVmVyc2lvbmVkQ29udmVyc2lvbkZhaWxlZAABAExXZWlnaHROb3RDb21wdXRhYmxlAAIATFVuaGFuZGxlZFhjbVZlcnNpb24AAwA0QXNzZXROb3RGb3VuZAAEAChVbnJvdXRhYmxlAAUAABURBBhSZXN1bHQIBFQBKARFARERAQgIT2sEACgAAAAADEVycgQAEREAAAEAABkRBBhSZXN1bHQIBFQBGARFARERAQgIT2sEABgAAAAADEVycgQAEREAAAEAAB0RBBhSZXN1bHQIBFQB4QcERQEREQEICE9rBADhBwAAAAAMRXJyBAAREQAAAQAAIREEGFJlc3VsdAgEVAElEQRFAT0RAQgIT2sEACURAAAAAAxFcnIEAD0RAAABAAAlEQxAeGNtX3J1bnRpbWVfYXBpcxxkcnlfcnVuRENhbGxEcnlSdW5FZmZlY3RzBBRFdmVudAFUABABQGV4ZWN1dGlvbl9yZXN1bHS1CAFoRGlzcGF0Y2hSZXN1bHRXaXRoUG9zdEluZm8AAThlbWl0dGVkX2V2ZW50cykRAShWZWM8RXZlbnQ+AAEkbG9jYWxfeGNtLREBYE9wdGlvbjxWZXJzaW9uZWRYY208KCk+PgABOGZvcndhcmRlZF94Y21zMREBvFZlYzwoVmVyc2lvbmVkTG9jYXRpb24sIFZlYzxWZXJzaW9uZWRYY208KCk+Pik+AAApEQAAAlQALREEGE9wdGlvbgQEVAFNBgEIEE5vbmUAAAAQU29tZQQATQYAAAEAADERAAACNREANREAAAQIWQU5EQA5EQAAAk0GAD0RDEB4Y21fcnVudGltZV9hcGlzHGRyeV9ydW4URXJyb3IAAQg0VW5pbXBsZW1lbnRlZAAAAGRWZXJzaW9uZWRDb252ZXJzaW9uRmFpbGVkAAEAAEERBBhSZXN1bHQIBFQBRREERQE9EQEICE9rBABFEQAAAAAMRXJyBAA9EQAAAQAARREMQHhjbV9ydW50aW1lX2FwaXMcZHJ5X3J1bkBYY21EcnlSdW5FZmZlY3RzBBRFdmVudAFUAAwBQGV4ZWN1dGlvbl9yZXN1bHQZCQEcT3V0Y29tZQABOGVtaXR0ZWRfZXZlbnRzKREBKFZlYzxFdmVudD4AAThmb3J3YXJkZWRfeGNtczERAbxWZWM8KFZlcnNpb25lZExvY2F0aW9uLCBWZWM8VmVyc2lvbmVkWGNtPCgpPj4pPgAASREEGFJlc3VsdAgEVAEABEUBTREBCAhPawQAAAAAAAAMRXJyBABNEQAAAQAATREMQHhjbV9ydW50aW1lX2FwaXMsY29udmVyc2lvbnMURXJyb3IAAQgsVW5zdXBwb3J0ZWQAAABkVmVyc2lvbmVkQ29udmVyc2lvbkZhaWxlZAABAABREQQYUmVzdWx0CARUAQUBBEUBTQkBCAhPawQABQEAAAAADEVycgQATQkAAAEAAFURBBhPcHRpb24EBFQBTQkBCBBOb25lAAAAEFNvbWUEAE0JAAABAABZEQAAAk0JAF0RCAx4Y204VmVyc2lvbmVkQXNzZXQAAQwIVjMEAGUGATh2Mzo6TXVsdGlBc3NldAADAAhWNAQAzQYBJHY0OjpBc3NldAAEAAhWNQQAFQcBJHY1OjpBc3NldAAFAABhEQQYUmVzdWx0CARUASAERQFlEQEICE9rBAAgAAAAAAxFcnIEAGURAAABAABlEQxAeGNtX3J1bnRpbWVfYXBpczR0cnVzdGVkX3F1ZXJ5FEVycm9yAAEIeFZlcnNpb25lZEFzc2V0Q29udmVyc2lvbkZhaWxlZAAAAIRWZXJzaW9uZWRMb2NhdGlvbkNvbnZlcnNpb25GYWlsZWQAAQAAaREIPHdlc3RlbmRfcnVudGltZTBSdW50aW1lRXJyb3IAAcAYU3lzdGVtBAB9CQFwZnJhbWVfc3lzdGVtOjpFcnJvcjxSdW50aW1lPgAAABBCYWJlBAC9CQFscGFsbGV0X2JhYmU6OkVycm9yPFJ1bnRpbWU+AAEAHEluZGljZXMEAMUJAXhwYWxsZXRfaW5kaWNlczo6RXJyb3I8UnVudGltZT4AAwAgQmFsYW5jZXMEAB0KAXxwYWxsZXRfYmFsYW5jZXM6OkVycm9yPFJ1bnRpbWU+AAQAHFN0YWtpbmcEAHkKAXhwYWxsZXRfc3Rha2luZzo6RXJyb3I8UnVudGltZT4ABgAcU2Vzc2lvbgQAqQoBeHBhbGxldF9zZXNzaW9uOjpFcnJvcjxSdW50aW1lPgAIABxHcmFuZHBhBAC5CgF4cGFsbGV0X2dyYW5kcGE6OkVycm9yPFJ1bnRpbWU+AAoAHFV0aWxpdHkEAMUKAXhwYWxsZXRfdXRpbGl0eTo6RXJyb3I8UnVudGltZT4AEAAgSWRlbnRpdHkEAAULAXxwYWxsZXRfaWRlbnRpdHk6OkVycm9yPFJ1bnRpbWU+ABEAIFJlY292ZXJ5BAAZCwF8cGFsbGV0X3JlY292ZXJ5OjpFcnJvcjxSdW50aW1lPgASABxWZXN0aW5nBAApCwF4cGFsbGV0X3Zlc3Rpbmc6OkVycm9yPFJ1bnRpbWU+ABMAJFNjaGVkdWxlcgQAQQsBgHBhbGxldF9zY2hlZHVsZXI6OkVycm9yPFJ1bnRpbWU+ABQAIFByZWltYWdlBABhCwF8cGFsbGV0X3ByZWltYWdlOjpFcnJvcjxSdW50aW1lPgAcABBTdWRvBABlCwFscGFsbGV0X3N1ZG86OkVycm9yPFJ1bnRpbWU+ABUAFFByb3h5BACJCwFwcGFsbGV0X3Byb3h5OjpFcnJvcjxSdW50aW1lPgAWACBNdWx0aXNpZwQAmQsBfHBhbGxldF9tdWx0aXNpZzo6RXJyb3I8UnVudGltZT4AFwBoRWxlY3Rpb25Qcm92aWRlck11bHRpUGhhc2UEANULAdBwYWxsZXRfZWxlY3Rpb25fcHJvdmlkZXJfbXVsdGlfcGhhc2U6OkVycm9yPFJ1bnRpbWU+ABgAJFZvdGVyTGlzdAQA5QsB9HBhbGxldF9iYWdzX2xpc3Q6OkVycm9yPFJ1bnRpbWUsIHBhbGxldF9iYWdzX2xpc3Q6Okluc3RhbmNlMT4AGQA8Tm9taW5hdGlvblBvb2xzBAAxDAGccGFsbGV0X25vbWluYXRpb25fcG9vbHM6OkVycm9yPFJ1bnRpbWU+AB0ALEZhc3RVbnN0YWtlBABFDAGMcGFsbGV0X2Zhc3RfdW5zdGFrZTo6RXJyb3I8UnVudGltZT4AHgBAQ29udmljdGlvblZvdGluZwQAeQwBoHBhbGxldF9jb252aWN0aW9uX3ZvdGluZzo6RXJyb3I8UnVudGltZT4AHwAkUmVmZXJlbmRhBAC5DAGAcGFsbGV0X3JlZmVyZW5kYTo6RXJyb3I8UnVudGltZT4AIAAkV2hpdGVsaXN0BAC9DAGAcGFsbGV0X3doaXRlbGlzdDo6RXJyb3I8UnVudGltZT4AJAAgVHJlYXN1cnkEANUMAXxwYWxsZXRfdHJlYXN1cnk6OkVycm9yPFJ1bnRpbWU+ACUAQERlbGVnYXRlZFN0YWtpbmcEAOEMAaBwYWxsZXRfZGVsZWdhdGVkX3N0YWtpbmc6OkVycm9yPFJ1bnRpbWU+ACYANENvbmZpZ3VyYXRpb24EAPEMAaBwYXJhY2hhaW5zX2NvbmZpZ3VyYXRpb246OkVycm9yPFJ1bnRpbWU+ACoANFBhcmFJbmNsdXNpb24EADENAZBwYXJhY2hhaW5zX2luY2x1c2lvbjo6RXJyb3I8UnVudGltZT4ALAAwUGFyYUluaGVyZW50BABJDQGkcGFyYWNoYWluc19wYXJhc19pbmhlcmVudDo6RXJyb3I8UnVudGltZT4ALQAUUGFyYXMEAKENAYBwYXJhY2hhaW5zX3BhcmFzOjpFcnJvcjxSdW50aW1lPgAvABBIcm1wBADRDQF8cGFyYWNoYWluc19ocm1wOjpFcnJvcjxSdW50aW1lPgAzADRQYXJhc0Rpc3B1dGVzBADxDQGMcGFyYWNoYWluc19kaXNwdXRlczo6RXJyb3I8UnVudGltZT4ANQA0UGFyYXNTbGFzaGluZwQABQ4BjHBhcmFjaGFpbnNfc2xhc2hpbmc6OkVycm9yPFJ1bnRpbWU+ADYAaE9uRGVtYW5kQXNzaWdubWVudFByb3ZpZGVyBAA1DgGQcGFyYWNoYWluc19vbl9kZW1hbmQ6OkVycm9yPFJ1bnRpbWU+ADgAaENvcmV0aW1lQXNzaWdubWVudFByb3ZpZGVyBABhDgGwcGFyYWNoYWluc19hc3NpZ25lcl9jb3JldGltZTo6RXJyb3I8UnVudGltZT4AOQAkUmVnaXN0cmFyBABpDgF8cGFyYXNfcmVnaXN0cmFyOjpFcnJvcjxSdW50aW1lPgA8ABRTbG90cwQAcQ4BVHNsb3RzOjpFcnJvcjxSdW50aW1lPgA9AEBQYXJhc1N1ZG9XcmFwcGVyBAB1DgGIcGFyYXNfc3Vkb193cmFwcGVyOjpFcnJvcjxSdW50aW1lPgA+ACBBdWN0aW9ucwQAiQ4BYGF1Y3Rpb25zOjpFcnJvcjxSdW50aW1lPgA/ACRDcm93ZGxvYW4EAJUOAWRjcm93ZGxvYW46OkVycm9yPFJ1bnRpbWU+AEAANEFzc2lnbmVkU2xvdHMEAJ0OAXhhc3NpZ25lZF9zbG90czo6RXJyb3I8UnVudGltZT4AQQAgQ29yZXRpbWUEAKEOAWBjb3JldGltZTo6RXJyb3I8UnVudGltZT4AQgA8U3Rha2luZ0FoQ2xpZW50BADFDgG4cGFsbGV0X3N0YWtpbmdfYXN5bmNfYWhfY2xpZW50OjpFcnJvcjxSdW50aW1lPgBDAFBNdWx0aUJsb2NrTWlncmF0aW9ucwQAyQ4BhHBhbGxldF9taWdyYXRpb25zOjpFcnJvcjxSdW50aW1lPgBiACRYY21QYWxsZXQEADEPAWhwYWxsZXRfeGNtOjpFcnJvcjxSdW50aW1lPgBjADBNZXNzYWdlUXVldWUEAFEPAZBwYWxsZXRfbWVzc2FnZV9xdWV1ZTo6RXJyb3I8UnVudGltZT4AZAAkQXNzZXRSYXRlBABVDwGEcGFsbGV0X2Fzc2V0X3JhdGU6OkVycm9yPFJ1bnRpbWU+AGUAGE1ldGFUeAQAWQ8BeHBhbGxldF9tZXRhX3R4OjpFcnJvcjxSdW50aW1lPgBnABRCZWVmeQQAZQ8BcHBhbGxldF9iZWVmeTo6RXJyb3I8UnVudGltZT4AyAAADQEYU3lzdGVtARhTeXN0ZW1MHEFjY291bnQBAQQCAAxBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACABOggVGhlIGZ1bGwgYWNjb3VudCBpbmZvcm1hdGlvbiBmb3IgYSBwYXJ0aWN1bGFyIGFjY291bnQgSUQuOEV4dHJpbnNpY0NvdW50AAAQBAAEuCBUb3RhbCBleHRyaW5zaWNzIGNvdW50IGZvciB0aGUgY3VycmVudCBibG9jay5ASW5oZXJlbnRzQXBwbGllZAEAIAQABKQgV2hldGhlciBhbGwgaW5oZXJlbnRzIGhhdmUgYmVlbiBhcHBsaWVkLixCbG9ja1dlaWdodAEAJBgAAAAAAAAEiCBUaGUgY3VycmVudCB3ZWlnaHQgZm9yIHRoZSBibG9jay5AQWxsRXh0cmluc2ljc0xlbgAAEAQABEEBIFRvdGFsIGxlbmd0aCAoaW4gYnl0ZXMpIGZvciBhbGwgZXh0cmluc2ljcyBwdXQgdG9nZXRoZXIsIGZvciB0aGUgY3VycmVudCBibG9jay4kQmxvY2tIYXNoAQEEBRA0gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABJggTWFwIG9mIGJsb2NrIG51bWJlcnMgdG8gYmxvY2sgaGFzaGVzLjRFeHRyaW5zaWNEYXRhAQEEBRA4BAAEPQEgRXh0cmluc2ljcyBkYXRhIGZvciB0aGUgY3VycmVudCBibG9jayAobWFwcyBhbiBleHRyaW5zaWMncyBpbmRleCB0byBpdHMgZGF0YSkuGE51bWJlcgEAEBAAAAAABAkBIFRoZSBjdXJyZW50IGJsb2NrIG51bWJlciBiZWluZyBwcm9jZXNzZWQuIFNldCBieSBgZXhlY3V0ZV9ibG9ja2AuKFBhcmVudEhhc2gBADSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEcCBIYXNoIG9mIHRoZSBwcmV2aW91cyBibG9jay4YRGlnZXN0AQA8BAAE8CBEaWdlc3Qgb2YgdGhlIGN1cnJlbnQgYmxvY2ssIGFsc28gcGFydCBvZiB0aGUgYmxvY2sgaGVhZGVyLhhFdmVudHMBAEwEABygIEV2ZW50cyBkZXBvc2l0ZWQgZm9yIHRoZSBjdXJyZW50IGJsb2NrLgAdASBOT1RFOiBUaGUgaXRlbSBpcyB1bmJvdW5kIGFuZCBzaG91bGQgdGhlcmVmb3JlIG5ldmVyIGJlIHJlYWQgb24gY2hhaW4u0CBJdCBjb3VsZCBvdGhlcndpc2UgaW5mbGF0ZSB0aGUgUG9WIHNpemUgb2YgYSBibG9jay4ALQEgRXZlbnRzIGhhdmUgYSBsYXJnZSBpbi1tZW1vcnkgc2l6ZS4gQm94IHRoZSBldmVudHMgdG8gbm90IGdvIG91dC1vZi1tZW1vcnn8IGp1c3QgaW4gY2FzZSBzb21lb25lIHN0aWxsIHJlYWRzIHRoZW0gZnJvbSB3aXRoaW4gdGhlIHJ1bnRpbWUuKEV2ZW50Q291bnQBABAQAAAAAAS4IFRoZSBudW1iZXIgb2YgZXZlbnRzIGluIHRoZSBgRXZlbnRzPFQ+YCBsaXN0LixFdmVudFRvcGljcwEBBAI0QQkEACglASBNYXBwaW5nIGJldHdlZW4gYSB0b3BpYyAocmVwcmVzZW50ZWQgYnkgVDo6SGFzaCkgYW5kIGEgdmVjdG9yIG9mIGluZGV4ZXOUIG9mIGV2ZW50cyBpbiB0aGUgYDxFdmVudHM8VD4+YCBsaXN0LgBRASBBbGwgdG9waWMgdmVjdG9ycyBoYXZlIGRldGVybWluaXN0aWMgc3RvcmFnZSBsb2NhdGlvbnMgZGVwZW5kaW5nIG9uIHRoZSB0b3BpYy4gVGhpc0UBIGFsbG93cyBsaWdodC1jbGllbnRzIHRvIGxldmVyYWdlIHRoZSBjaGFuZ2VzIHRyaWUgc3RvcmFnZSB0cmFja2luZyBtZWNoYW5pc20gYW5k5CBpbiBjYXNlIG9mIGNoYW5nZXMgZmV0Y2ggdGhlIGxpc3Qgb2YgZXZlbnRzIG9mIGludGVyZXN0LgBZASBUaGUgdmFsdWUgaGFzIHRoZSB0eXBlIGAoQmxvY2tOdW1iZXJGb3I8VD4sIEV2ZW50SW5kZXgpYCBiZWNhdXNlIGlmIHdlIHVzZWQgb25seSBqdXN0TQEgdGhlIGBFdmVudEluZGV4YCB0aGVuIGluIGNhc2UgaWYgdGhlIHRvcGljIGhhcyB0aGUgc2FtZSBjb250ZW50cyBvbiB0aGUgbmV4dCBibG9jawEBIG5vIG5vdGlmaWNhdGlvbiB3aWxsIGJlIHRyaWdnZXJlZCB0aHVzIHRoZSBldmVudCBtaWdodCBiZSBsb3N0LkhMYXN0UnVudGltZVVwZ3JhZGUAAEUJBAAEVQEgU3RvcmVzIHRoZSBgc3BlY192ZXJzaW9uYCBhbmQgYHNwZWNfbmFtZWAgb2Ygd2hlbiB0aGUgbGFzdCBydW50aW1lIHVwZ3JhZGUgaGFwcGVuZWQuVFVwZ3JhZGVkVG9VMzJSZWZDb3VudAEAIAQABE0BIFRydWUgaWYgd2UgaGF2ZSB1cGdyYWRlZCBzbyB0aGF0IGB0eXBlIFJlZkNvdW50YCBpcyBgdTMyYC4gRmFsc2UgKGRlZmF1bHQpIGlmIG5vdC5gVXBncmFkZWRUb1RyaXBsZVJlZkNvdW50AQAgBAAIXQEgVHJ1ZSBpZiB3ZSBoYXZlIHVwZ3JhZGVkIHNvIHRoYXQgQWNjb3VudEluZm8gY29udGFpbnMgdGhyZWUgdHlwZXMgb2YgYFJlZkNvdW50YC4gRmFsc2VIIChkZWZhdWx0KSBpZiBub3QuOEV4ZWN1dGlvblBoYXNlAAA9CQQABIggVGhlIGV4ZWN1dGlvbiBwaGFzZSBvZiB0aGUgYmxvY2suREF1dGhvcml6ZWRVcGdyYWRlAABRCQQABLggYFNvbWVgIGlmIGEgY29kZSB1cGdyYWRlIGhhcyBiZWVuIGF1dGhvcml6ZWQuYEV4dHJpbnNpY1dlaWdodFJlY2xhaW1lZAEAKAgAABygIFRoZSB3ZWlnaHQgcmVjbGFpbWVkIGZvciB0aGUgZXh0cmluc2ljLgAhASBUaGlzIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZSB1bnRpbCB0aGUgZW5kIG9mIHRoZSBleHRyaW5zaWMgZXhlY3V0aW9uLiEBIE1vcmUgcHJlY2lzZWx5IHRoaXMgaW5mb3JtYXRpb24gaXMgcmVtb3ZlZCBpbiBgbm90ZV9hcHBsaWVkX2V4dHJpbnNpY2AuAHEBIExvZ2ljIGRvaW5nIHNvbWUgcG9zdCBkaXNwYXRjaCB3ZWlnaHQgcmVkdWN0aW9uIG11c3QgdXBkYXRlIHRoaXMgc3RvcmFnZSB0byBhdm9pZCBkdXBsaWNhdGUsIHJlZHVjdGlvbi4BrQEBWBgwQmxvY2tXZWlnaHRzVQn5AYKCJW4ACwAgSqnRARP//////////wKMFxsAAQsA7RmQWAETo3A9CtejcL0BCwCY9z5dARP/////////vwEAAAKMFxsAAQsAdWz6zAETo3A9CtejcP0BCwAgSqnRARP//////////wEHAIhSanQTAAAAAAAAAEACjBcbAAAAAATQIEJsb2NrICYgZXh0cmluc2ljcyB3ZWlnaHRzOiBiYXNlIHZhbHVlcyBhbmQgbGltaXRzLixCbG9ja0xlbmd0aGEJMAAAPAAAAFAAAABQAASoIFRoZSBtYXhpbXVtIGxlbmd0aCBvZiBhIGJsb2NrIChpbiBieXRlcykuOEJsb2NrSGFzaENvdW50EBAAEAAABFUBIE1heGltdW0gbnVtYmVyIG9mIGJsb2NrIG51bWJlciB0byBibG9jayBoYXNoIG1hcHBpbmdzIHRvIGtlZXAgKG9sZGVzdCBwcnVuZWQgZmlyc3QpLiBEYldlaWdodGkJQEB4fQEAAAAAAOH1BQAAAAAECQEgVGhlIHdlaWdodCBvZiBydW50aW1lIGRhdGFiYXNlIG9wZXJhdGlvbnMgdGhlIHJ1bnRpbWUgY2FuIGludm9rZS4cVmVyc2lvbm0JJQUcd2VzdGVuZDhwYXJpdHktd2VzdGVuZAIAAACdiA8AAAAAAGDfastomQdgmwUAAAA345f8fJH15AIAAADM2d5jlsiZygEAAABA/jrUAfiVmgYAAADSvJiX7tCPFQMAAAD3iyeL5T9FTAIAAACvLAKXoj5tPQ4AAABJ6q8bVIoMsAUAAACR1d8YsNLPWAIAAAAqXpJGVTmeYAEAAADtmcWssl7t9QMAAADLyiXjnxQjhwIAAABoetRK038DwgEAAACrPAVyKR/riwEAAAC8nYmQT1uSPwEAAAA3yLsTUKmiqAQAAADz/xTVq1JwWQMAAABv9S7oWObFvQEAAACRscixYyjrkgIAAACf+1BapzjWnAEAAAAXprwNAGKuswEAAAAY71ijtnuncAEAAAD7xXe510fv1gEAAAAmCb6DrERo3AEAAAAbAAAAAQSEIEdldCB0aGUgY2hhaW4ncyBpbi1jb2RlIHZlcnNpb24uKFNTNThQcmVmaXhBAQgqABSoIFRoZSBkZXNpZ25hdGVkIFNTNTggcHJlZml4IG9mIHRoaXMgY2hhaW4uADkBIFRoaXMgcmVwbGFjZXMgdGhlICJzczU4Rm9ybWF0IiBwcm9wZXJ0eSBkZWNsYXJlZCBpbiB0aGUgY2hhaW4gc3BlYy4gUmVhc29uIGlzMQEgdGhhdCB0aGUgcnVudGltZSBzaG91bGQga25vdyBhYm91dCB0aGUgcHJlZml4IGluIG9yZGVyIHRvIG1ha2UgdXNlIG9mIGl0IGFzcCBhbiBpZGVudGlmaWVyIG9mIHRoZSBjaGFpbi4BfQkAABBCYWJlARBCYWJlRChFcG9jaEluZGV4AQAwIAAAAAAAAAAABFQgQ3VycmVudCBlcG9jaCBpbmRleC4sQXV0aG9yaXRpZXMBAIEJBAAEbCBDdXJyZW50IGVwb2NoIGF1dGhvcml0aWVzLixHZW5lc2lzU2xvdAEA0QEgAAAAAAAAAAAI+CBUaGUgc2xvdCBhdCB3aGljaCB0aGUgZmlyc3QgZXBvY2ggYWN0dWFsbHkgc3RhcnRlZC4gVGhpcyBpcyAwkCB1bnRpbCB0aGUgZmlyc3QgYmxvY2sgb2YgdGhlIGNoYWluLixDdXJyZW50U2xvdAEA0QEgAAAAAAAAAAAEVCBDdXJyZW50IHNsb3QgbnVtYmVyLihSYW5kb21uZXNzAQAEgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKLggVGhlIGVwb2NoIHJhbmRvbW5lc3MgZm9yIHRoZSAqY3VycmVudCogZXBvY2guACwgIyBTZWN1cml0eQAFASBUaGlzIE1VU1QgTk9UIGJlIHVzZWQgZm9yIGdhbWJsaW5nLCBhcyBpdCBjYW4gYmUgaW5mbHVlbmNlZCBieSBh+CBtYWxpY2lvdXMgdmFsaWRhdG9yIGluIHRoZSBzaG9ydCB0ZXJtLiBJdCBNQVkgYmUgdXNlZCBpbiBtYW55FQEgY3J5cHRvZ3JhcGhpYyBwcm90b2NvbHMsIGhvd2V2ZXIsIHNvIGxvbmcgYXMgb25lIHJlbWVtYmVycyB0aGF0IHRoaXMVASAobGlrZSBldmVyeXRoaW5nIGVsc2Ugb24tY2hhaW4pIGl0IGlzIHB1YmxpYy4gRm9yIGV4YW1wbGUsIGl0IGNhbiBiZQUBIHVzZWQgd2hlcmUgYSBudW1iZXIgaXMgbmVlZGVkIHRoYXQgY2Fubm90IGhhdmUgYmVlbiBjaG9zZW4gYnkgYW4NASBhZHZlcnNhcnksIGZvciBwdXJwb3NlcyBzdWNoIGFzIHB1YmxpYy1jb2luIHplcm8ta25vd2xlZGdlIHByb29mcy5gUGVuZGluZ0Vwb2NoQ29uZmlnQ2hhbmdlAADZAQQABGEBIFBlbmRpbmcgZXBvY2ggY29uZmlndXJhdGlvbiBjaGFuZ2UgdGhhdCB3aWxsIGJlIGFwcGxpZWQgd2hlbiB0aGUgbmV4dCBlcG9jaCBpcyBlbmFjdGVkLjhOZXh0UmFuZG9tbmVzcwEABIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARcIE5leHQgZXBvY2ggcmFuZG9tbmVzcy48TmV4dEF1dGhvcml0aWVzAQCBCQQABGAgTmV4dCBlcG9jaCBhdXRob3JpdGllcy4wU2VnbWVudEluZGV4AQAQEAAAAAAkfCBSYW5kb21uZXNzIHVuZGVyIGNvbnN0cnVjdGlvbi4A+CBXZSBtYWtlIGEgdHJhZGUtb2ZmIGJldHdlZW4gc3RvcmFnZSBhY2Nlc3NlcyBhbmQgbGlzdCBsZW5ndGguAQEgV2Ugc3RvcmUgdGhlIHVuZGVyLWNvbnN0cnVjdGlvbiByYW5kb21uZXNzIGluIHNlZ21lbnRzIG9mIHVwIHRvlCBgVU5ERVJfQ09OU1RSVUNUSU9OX1NFR01FTlRfTEVOR1RIYC4A7CBPbmNlIGEgc2VnbWVudCByZWFjaGVzIHRoaXMgbGVuZ3RoLCB3ZSBiZWdpbiB0aGUgbmV4dCBvbmUuCQEgV2UgcmVzZXQgYWxsIHNlZ21lbnRzIGFuZCByZXR1cm4gdG8gYDBgIGF0IHRoZSBiZWdpbm5pbmcgb2YgZXZlcnkcIGVwb2NoLkRVbmRlckNvbnN0cnVjdGlvbgEBBAUQjQkEAAQVASBUV09YLU5PVEU6IGBTZWdtZW50SW5kZXhgIGlzIGFuIGluY3JlYXNpbmcgaW50ZWdlciwgc28gdGhpcyBpcyBva2F5LixJbml0aWFsaXplZAAAlQkEAAgBASBUZW1wb3JhcnkgdmFsdWUgKGNsZWFyZWQgYXQgYmxvY2sgZmluYWxpemF0aW9uKSB3aGljaCBpcyBgU29tZWAdASBpZiBwZXItYmxvY2sgaW5pdGlhbGl6YXRpb24gaGFzIGFscmVhZHkgYmVlbiBjYWxsZWQgZm9yIGN1cnJlbnQgYmxvY2suTEF1dGhvclZyZlJhbmRvbW5lc3MBACkBBAAQFQEgVGhpcyBmaWVsZCBzaG91bGQgYWx3YXlzIGJlIHBvcHVsYXRlZCBkdXJpbmcgYmxvY2sgcHJvY2Vzc2luZyB1bmxlc3MZASBzZWNvbmRhcnkgcGxhaW4gc2xvdHMgYXJlIGVuYWJsZWQgKHdoaWNoIGRvbid0IGNvbnRhaW4gYSBWUkYgb3V0cHV0KS4ASQEgSXQgaXMgc2V0IGluIGBvbl9maW5hbGl6ZWAsIGJlZm9yZSBpdCB3aWxsIGNvbnRhaW4gdGhlIHZhbHVlIGZyb20gdGhlIGxhc3QgYmxvY2suKEVwb2NoU3RhcnQBACUBIAAAAAAAAAAAFF0BIFRoZSBibG9jayBudW1iZXJzIHdoZW4gdGhlIGxhc3QgYW5kIGN1cnJlbnQgZXBvY2ggaGF2ZSBzdGFydGVkLCByZXNwZWN0aXZlbHkgYE4tMWAgYW5kFCBgTmAuSQEgTk9URTogV2UgdHJhY2sgdGhpcyBpcyBpbiBvcmRlciB0byBhbm5vdGF0ZSB0aGUgYmxvY2sgbnVtYmVyIHdoZW4gYSBnaXZlbiBwb29sIG9mWQEgZW50cm9weSB3YXMgZml4ZWQgKGkuZS4gaXQgd2FzIGtub3duIHRvIGNoYWluIG9ic2VydmVycykuIFNpbmNlIGVwb2NocyBhcmUgZGVmaW5lZCBpblkBIHNsb3RzLCB3aGljaCBtYXkgYmUgc2tpcHBlZCwgdGhlIGJsb2NrIG51bWJlcnMgbWF5IG5vdCBsaW5lIHVwIHdpdGggdGhlIHNsb3QgbnVtYmVycy4gTGF0ZW5lc3MBABAQAAAAABTYIEhvdyBsYXRlIHRoZSBjdXJyZW50IGJsb2NrIGlzIGNvbXBhcmVkIHRvIGl0cyBwYXJlbnQuABUBIFRoaXMgZW50cnkgaXMgcG9wdWxhdGVkIGFzIHBhcnQgb2YgYmxvY2sgZXhlY3V0aW9uIGFuZCBpcyBjbGVhbmVkIHVwEQEgb24gYmxvY2sgZmluYWxpemF0aW9uLiBRdWVyeWluZyB0aGlzIHN0b3JhZ2UgZW50cnkgb3V0c2lkZSBvZiBibG9ja7AgZXhlY3V0aW9uIGNvbnRleHQgc2hvdWxkIGFsd2F5cyB5aWVsZCB6ZXJvLixFcG9jaENvbmZpZwAArQkEAAhhASBUaGUgY29uZmlndXJhdGlvbiBmb3IgdGhlIGN1cnJlbnQgZXBvY2guIFNob3VsZCBuZXZlciBiZSBgTm9uZWAgYXMgaXQgaXMgaW5pdGlhbGl6ZWQgaW4kIGdlbmVzaXMuPE5leHRFcG9jaENvbmZpZwAArQkEAAgtASBUaGUgY29uZmlndXJhdGlvbiBmb3IgdGhlIG5leHQgZXBvY2gsIGBOb25lYCBpZiB0aGUgY29uZmlnIHdpbGwgbm90IGNoYW5nZeggKHlvdSBjYW4gZmFsbGJhY2sgdG8gYEVwb2NoQ29uZmlnYCBpbnN0ZWFkIGluIHRoYXQgY2FzZSkuNFNraXBwZWRFcG9jaHMBALEJBAAgKQEgQSBsaXN0IG9mIHRoZSBsYXN0IDEwMCBza2lwcGVkIGVwb2NocyBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgc2Vzc2lvbiBpbmRleHAgd2hlbiB0aGUgZXBvY2ggd2FzIHNraXBwZWQuADEBIFRoaXMgaXMgb25seSB1c2VkIGZvciB2YWxpZGF0aW5nIGVxdWl2b2NhdGlvbiBwcm9vZnMuIEFuIGVxdWl2b2NhdGlvbiBwcm9vZjUBIG11c3QgY29udGFpbnMgYSBrZXktb3duZXJzaGlwIHByb29mIGZvciBhIGdpdmVuIHNlc3Npb24sIHRoZXJlZm9yZSB3ZSBuZWVkIGE5ASB3YXkgdG8gdGllIHRvZ2V0aGVyIHNlc3Npb25zIGFuZCBlcG9jaCBpbmRpY2VzLCBpLmUuIHdlIG5lZWQgdG8gdmFsaWRhdGUgdGhhdCkBIGEgdmFsaWRhdG9yIHdhcyB0aGUgb3duZXIgb2YgYSBnaXZlbiBrZXkgb24gYSBnaXZlbiBzZXNzaW9uLCBhbmQgd2hhdCB0aGWwIGFjdGl2ZSBlcG9jaCBpbmRleCB3YXMgZHVyaW5nIHRoYXQgc2Vzc2lvbi4BvQEAEDRFcG9jaER1cmF0aW9uMCBYAgAAAAAAAAzsIFRoZSBhbW91bnQgb2YgdGltZSwgaW4gc2xvdHMsIHRoYXQgZWFjaCBlcG9jaCBzaG91bGQgbGFzdC4ZASBOT1RFOiBDdXJyZW50bHkgaXQgaXMgbm90IHBvc3NpYmxlIHRvIGNoYW5nZSB0aGUgZXBvY2ggZHVyYXRpb24gYWZ0ZXIhASB0aGUgY2hhaW4gaGFzIHN0YXJ0ZWQuIEF0dGVtcHRpbmcgdG8gZG8gc28gd2lsbCBicmljayBibG9jayBwcm9kdWN0aW9uLkRFeHBlY3RlZEJsb2NrVGltZTAgcBcAAAAAAAAUBQEgVGhlIGV4cGVjdGVkIGF2ZXJhZ2UgYmxvY2sgdGltZSBhdCB3aGljaCBCQUJFIHNob3VsZCBiZSBjcmVhdGluZxEBIGJsb2Nrcy4gU2luY2UgQkFCRSBpcyBwcm9iYWJpbGlzdGljIGl0IGlzIG5vdCB0cml2aWFsIHRvIGZpZ3VyZSBvdXQFASB3aGF0IHRoZSBleHBlY3RlZCBhdmVyYWdlIGJsb2NrIHRpbWUgc2hvdWxkIGJlIGJhc2VkIG9uIHRoZSBzbG90CQEgZHVyYXRpb24gYW5kIHRoZSBzZWN1cml0eSBwYXJhbWV0ZXIgYGNgICh3aGVyZSBgMSAtIGNgIHJlcHJlc2VudHOgIHRoZSBwcm9iYWJpbGl0eSBvZiBhIHNsb3QgYmVpbmcgZW1wdHkpLjhNYXhBdXRob3JpdGllcxAQoIYBAASIIE1heCBudW1iZXIgb2YgYXV0aG9yaXRpZXMgYWxsb3dlZDRNYXhOb21pbmF0b3JzEBBAAAAABNQgVGhlIG1heGltdW0gbnVtYmVyIG9mIG5vbWluYXRvcnMgZm9yIGVhY2ggdmFsaWRhdG9yLgG9CQEAJFRpbWVzdGFtcAEkVGltZXN0YW1wCAxOb3cBADAgAAAAAAAAAAAEoCBUaGUgY3VycmVudCB0aW1lIGZvciB0aGUgY3VycmVudCBibG9jay4kRGlkVXBkYXRlAQAgBAAQ2CBXaGV0aGVyIHRoZSB0aW1lc3RhbXAgaGFzIGJlZW4gdXBkYXRlZCBpbiB0aGlzIGJsb2NrLgBVASBUaGlzIHZhbHVlIGlzIHVwZGF0ZWQgdG8gYHRydWVgIHVwb24gc3VjY2Vzc2Z1bCBzdWJtaXNzaW9uIG9mIGEgdGltZXN0YW1wIGJ5IGEgbm9kZS5FASBJdCBpcyB0aGVuIGNoZWNrZWQgYXQgdGhlIGVuZCBvZiBlYWNoIGJsb2NrIGV4ZWN1dGlvbiBpbiB0aGUgYG9uX2ZpbmFsaXplYCBob29rLgHlAQAENE1pbmltdW1QZXJpb2QwILgLAAAAAAAAGIwgVGhlIG1pbmltdW0gcGVyaW9kIGJldHdlZW4gYmxvY2tzLgBNASBCZSBhd2FyZSB0aGF0IHRoaXMgaXMgZGlmZmVyZW50IHRvIHRoZSAqZXhwZWN0ZWQqIHBlcmlvZCB0aGF0IHRoZSBibG9jayBwcm9kdWN0aW9uSQEgYXBwYXJhdHVzIHByb3ZpZGVzLiBZb3VyIGNob3NlbiBjb25zZW5zdXMgc3lzdGVtIHdpbGwgZ2VuZXJhbGx5IHdvcmsgd2l0aCB0aGlzIHRvYQEgZGV0ZXJtaW5lIGEgc2Vuc2libGUgYmxvY2sgdGltZS4gRm9yIGV4YW1wbGUsIGluIHRoZSBBdXJhIHBhbGxldCBpdCB3aWxsIGJlIGRvdWJsZSB0aGlzcCBwZXJpb2Qgb24gZGVmYXVsdCBzZXR0aW5ncy4AAgAcSW5kaWNlcwEcSW5kaWNlcwQgQWNjb3VudHMAAQQCEMEJBAAEiCBUaGUgbG9va3VwIGZyb20gaW5kZXggdG8gYWNjb3VudC4B6QEBgAQcRGVwb3NpdBhAABCl1OgAAAAAAAAAAAAAAASsIFRoZSBkZXBvc2l0IG5lZWRlZCBmb3IgcmVzZXJ2aW5nIGFuIGluZGV4LgHFCQMAIEJhbGFuY2VzASBCYWxhbmNlcxw0VG90YWxJc3N1YW5jZQEAGEAAAAAAAAAAAAAAAAAAAAAABJggVGhlIHRvdGFsIHVuaXRzIGlzc3VlZCBpbiB0aGUgc3lzdGVtLkBJbmFjdGl2ZUlzc3VhbmNlAQAYQAAAAAAAAAAAAAAAAAAAAAAECQEgVGhlIHRvdGFsIHVuaXRzIG9mIG91dHN0YW5kaW5nIGRlYWN0aXZhdGVkIGJhbGFuY2UgaW4gdGhlIHN5c3RlbS4cQWNjb3VudAEBBAIAFAEBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgGAJASBUaGUgQmFsYW5jZXMgcGFsbGV0IGV4YW1wbGUgb2Ygc3RvcmluZyB0aGUgYmFsYW5jZSBvZiBhbiBhY2NvdW50LgAoICMgRXhhbXBsZQA0IGBgYG5vY29tcGlsZbAgIGltcGwgcGFsbGV0X2JhbGFuY2VzOjpDb25maWcgZm9yIFJ1bnRpbWUgexkCICAgIHR5cGUgQWNjb3VudFN0b3JlID0gU3RvcmFnZU1hcFNoaW08U2VsZjo6QWNjb3VudDxSdW50aW1lPiwgZnJhbWVfc3lzdGVtOjpQcm92aWRlcjxSdW50aW1lPiwgQWNjb3VudElkLCBTZWxmOjpBY2NvdW50RGF0YTxCYWxhbmNlPj4MICB9ECBgYGAAFQEgWW91IGNhbiBhbHNvIHN0b3JlIHRoZSBiYWxhbmNlIG9mIGFuIGFjY291bnQgaW4gdGhlIGBTeXN0ZW1gIHBhbGxldC4AKCAjIEV4YW1wbGUANCBgYGBub2NvbXBpbGWwICBpbXBsIHBhbGxldF9iYWxhbmNlczo6Q29uZmlnIGZvciBSdW50aW1lIHt0ICAgdHlwZSBBY2NvdW50U3RvcmUgPSBTeXN0ZW0MICB9ECBgYGAAUQEgQnV0IHRoaXMgY29tZXMgd2l0aCB0cmFkZW9mZnMsIHN0b3JpbmcgYWNjb3VudCBiYWxhbmNlcyBpbiB0aGUgc3lzdGVtIHBhbGxldCBzdG9yZXNtASBgZnJhbWVfc3lzdGVtYCBkYXRhIGFsb25nc2lkZSB0aGUgYWNjb3VudCBkYXRhIGNvbnRyYXJ5IHRvIHN0b3JpbmcgYWNjb3VudCBiYWxhbmNlcyBpbiB0aGUpASBgQmFsYW5jZXNgIHBhbGxldCwgd2hpY2ggdXNlcyBhIGBTdG9yYWdlTWFwYCB0byBzdG9yZSBiYWxhbmNlcyBkYXRhIG9ubHkuQQEgTk9URTogVGhpcyBpcyBvbmx5IHVzZWQgaW4gdGhlIGNhc2UgdGhhdCB0aGlzIHBhbGxldCBpcyB1c2VkIHRvIHN0b3JlIGJhbGFuY2VzLhRMb2NrcwEBBAIAyQkEABC4IEFueSBsaXF1aWRpdHkgbG9ja3Mgb24gc29tZSBhY2NvdW50IGJhbGFuY2VzLiUBIE5PVEU6IFNob3VsZCBvbmx5IGJlIGFjY2Vzc2VkIHdoZW4gc2V0dGluZywgY2hhbmdpbmcgYW5kIGZyZWVpbmcgYSBsb2NrLgCtASBVc2Ugb2YgbG9ja3MgaXMgZGVwcmVjYXRlZCBpbiBmYXZvdXIgb2YgZnJlZXplcy4gU2VlIGBodHRwczovL2dpdGh1Yi5jb20vcGFyaXR5dGVjaC9zdWJzdHJhdGUvcHVsbC8xMjk1MS9gIFJlc2VydmVzAQEEAgDZCQQADKQgTmFtZWQgcmVzZXJ2ZXMgb24gc29tZSBhY2NvdW50IGJhbGFuY2VzLgCxASBVc2Ugb2YgcmVzZXJ2ZXMgaXMgZGVwcmVjYXRlZCBpbiBmYXZvdXIgb2YgaG9sZHMuIFNlZSBgaHR0cHM6Ly9naXRodWIuY29tL3Bhcml0eXRlY2gvc3Vic3RyYXRlL3B1bGwvMTI5NTEvYBRIb2xkcwEBBAIA5QkEAARsIEhvbGRzIG9uIGFjY291bnQgYmFsYW5jZXMuHEZyZWV6ZXMBAQQCAAkKBAAEiCBGcmVlemUgbG9ja3Mgb24gYWNjb3VudCBiYWxhbmNlcy4B+QEBhBBIRXhpc3RlbnRpYWxEZXBvc2l0GEAA5AtUAgAAAAAAAAAAAAAAIEEBIFRoZSBtaW5pbXVtIGFtb3VudCByZXF1aXJlZCB0byBrZWVwIGFuIGFjY291bnQgb3Blbi4gTVVTVCBCRSBHUkVBVEVSIFRIQU4gWkVSTyEAWQEgSWYgeW91ICpyZWFsbHkqIG5lZWQgaXQgdG8gYmUgemVybywgeW91IGNhbiBlbmFibGUgdGhlIGZlYXR1cmUgYGluc2VjdXJlX3plcm9fZWRgIGZvcmEBIHRoaXMgcGFsbGV0LiBIb3dldmVyLCB5b3UgZG8gc28gYXQgeW91ciBvd24gcmlzazogdGhpcyB3aWxsIG9wZW4gdXAgYSBtYWpvciBEb1MgdmVjdG9yLlkBIEluIGNhc2UgeW91IGhhdmUgbXVsdGlwbGUgc291cmNlcyBvZiBwcm92aWRlciByZWZlcmVuY2VzLCB5b3UgbWF5IGFsc28gZ2V0IHVuZXhwZWN0ZWSMIGJlaGF2aW91ciBpZiB5b3Ugc2V0IHRoaXMgdG8gemVyby4A8CBCb3R0b20gbGluZTogRG8geW91cnNlbGYgYSBmYXZvdXIgYW5kIG1ha2UgaXQgYXQgbGVhc3Qgb25lISBNYXhMb2NrcxAQMgAAABD0IFRoZSBtYXhpbXVtIG51bWJlciBvZiBsb2NrcyB0aGF0IHNob3VsZCBleGlzdCBvbiBhbiBhY2NvdW50LtwgTm90IHN0cmljdGx5IGVuZm9yY2VkLCBidXQgdXNlZCBmb3Igd2VpZ2h0IGVzdGltYXRpb24uAK0BIFVzZSBvZiBsb2NrcyBpcyBkZXByZWNhdGVkIGluIGZhdm91ciBvZiBmcmVlemVzLiBTZWUgYGh0dHBzOi8vZ2l0aHViLmNvbS9wYXJpdHl0ZWNoL3N1YnN0cmF0ZS9wdWxsLzEyOTUxL2AsTWF4UmVzZXJ2ZXMQEDIAAAAMDQEgVGhlIG1heGltdW0gbnVtYmVyIG9mIG5hbWVkIHJlc2VydmVzIHRoYXQgY2FuIGV4aXN0IG9uIGFuIGFjY291bnQuALEBIFVzZSBvZiByZXNlcnZlcyBpcyBkZXByZWNhdGVkIGluIGZhdm91ciBvZiBob2xkcy4gU2VlIGBodHRwczovL2dpdGh1Yi5jb20vcGFyaXR5dGVjaC9zdWJzdHJhdGUvcHVsbC8xMjk1MS9gKE1heEZyZWV6ZXMQEAEAAAAEYQEgVGhlIG1heGltdW0gbnVtYmVyIG9mIGluZGl2aWR1YWwgZnJlZXplIGxvY2tzIHRoYXQgY2FuIGV4aXN0IG9uIGFuIGFjY291bnQgYXQgYW55IHRpbWUuAR0KBABIVHJhbnNhY3Rpb25QYXltZW50AUhUcmFuc2FjdGlvblBheW1lbnQIRE5leHRGZWVNdWx0aXBsaWVyAQAtCEAAAGSns7bgDQAAAAAAAAAAADhTdG9yYWdlVmVyc2lvbgEAIQoEAAAAAYwEYE9wZXJhdGlvbmFsRmVlTXVsdGlwbGllcggEBVRZASBBIGZlZSBtdWx0aXBsaWVyIGZvciBgT3BlcmF0aW9uYWxgIGV4dHJpbnNpY3MgdG8gY29tcHV0ZSAidmlydHVhbCB0aXAiIHRvIGJvb3N0IHRoZWlyLCBgcHJpb3JpdHlgAFEBIFRoaXMgdmFsdWUgaXMgbXVsdGlwbGllZCBieSB0aGUgYGZpbmFsX2ZlZWAgdG8gb2J0YWluIGEgInZpcnR1YWwgdGlwIiB0aGF0IGlzIGxhdGVy9CBhZGRlZCB0byBhIHRpcCBjb21wb25lbnQgaW4gcmVndWxhciBgcHJpb3JpdHlgIGNhbGN1bGF0aW9ucy5NASBJdCBtZWFucyB0aGF0IGEgYE5vcm1hbGAgdHJhbnNhY3Rpb24gY2FuIGZyb250LXJ1biBhIHNpbWlsYXJseS1zaXplZCBgT3BlcmF0aW9uYWxgQQEgZXh0cmluc2ljICh3aXRoIG5vIHRpcCksIGJ5IGluY2x1ZGluZyBhIHRpcCB2YWx1ZSBncmVhdGVyIHRoYW4gdGhlIHZpcnR1YWwgdGlwLgA8IGBgYHJ1c3QsaWdub3JlQCAvLyBGb3IgYE5vcm1hbGCMIGxldCBwcmlvcml0eSA9IHByaW9yaXR5X2NhbGModGlwKTsAVCAvLyBGb3IgYE9wZXJhdGlvbmFsYBEBIGxldCB2aXJ0dWFsX3RpcCA9IChpbmNsdXNpb25fZmVlICsgdGlwKSAqIE9wZXJhdGlvbmFsRmVlTXVsdGlwbGllcjvEIGxldCBwcmlvcml0eSA9IHByaW9yaXR5X2NhbGModGlwICsgdmlydHVhbF90aXApOxAgYGBgAFEBIE5vdGUgdGhhdCBzaW5jZSB3ZSB1c2UgYGZpbmFsX2ZlZWAgdGhlIG11bHRpcGxpZXIgYXBwbGllcyBhbHNvIHRvIHRoZSByZWd1bGFyIGB0aXBgXQEgc2VudCB3aXRoIHRoZSB0cmFuc2FjdGlvbi4gU28sIG5vdCBvbmx5IGRvZXMgdGhlIHRyYW5zYWN0aW9uIGdldCBhIHByaW9yaXR5IGJ1bXAgYmFzZWRhASBvbiB0aGUgYGluY2x1c2lvbl9mZWVgLCBidXQgd2UgYWxzbyBhbXBsaWZ5IHRoZSBpbXBhY3Qgb2YgdGlwcyBhcHBsaWVkIHRvIGBPcGVyYXRpb25hbGA4IHRyYW5zYWN0aW9ucy4AGgAoQXV0aG9yc2hpcAEoQXV0aG9yc2hpcAQYQXV0aG9yAAAABAAEZCBBdXRob3Igb2YgY3VycmVudCBibG9jay4AAAAABQAcU3Rha2luZwEcU3Rha2luZ6g4VmFsaWRhdG9yQ291bnQBABAQAAAAAAScIFRoZSBpZGVhbCBudW1iZXIgb2YgYWN0aXZlIHZhbGlkYXRvcnMuVE1pbmltdW1WYWxpZGF0b3JDb3VudAEAEBAAAAAABEEBIE1pbmltdW0gbnVtYmVyIG9mIHN0YWtpbmcgcGFydGljaXBhbnRzIGJlZm9yZSBlbWVyZ2VuY3kgY29uZGl0aW9ucyBhcmUgaW1wb3NlZC40SW52dWxuZXJhYmxlcwEAAQIEAAxZASBBbnkgdmFsaWRhdG9ycyB0aGF0IG1heSBuZXZlciBiZSBzbGFzaGVkIG9yIGZvcmNpYmx5IGtpY2tlZC4gSXQncyBhIFZlYyBzaW5jZSB0aGV5J3JlTQEgZWFzeSB0byBpbml0aWFsaXplIGFuZCB0aGUgcGVyZm9ybWFuY2UgaGl0IGlzIG1pbmltYWwgKHdlIGV4cGVjdCBubyBtb3JlIHRoYW4gZm91cqwgaW52dWxuZXJhYmxlcykgYW5kIHJlc3RyaWN0ZWQgdG8gdGVzdG5ldHMuGEJvbmRlZAABBAUAAAQADAEBIE1hcCBmcm9tIGFsbCBsb2NrZWQgInN0YXNoIiBhY2NvdW50cyB0byB0aGUgY29udHJvbGxlciBhY2NvdW50LgDQIFRXT1gtTk9URTogU0FGRSBzaW5jZSBgQWNjb3VudElkYCBpcyBhIHNlY3VyZSBoYXNoLkBNaW5Ob21pbmF0b3JCb25kAQAYQAAAAAAAAAAAAAAAAAAAAAAEIQEgVGhlIG1pbmltdW0gYWN0aXZlIGJvbmQgdG8gYmVjb21lIGFuZCBtYWludGFpbiB0aGUgcm9sZSBvZiBhIG5vbWluYXRvci5ATWluVmFsaWRhdG9yQm9uZAEAGEAAAAAAAAAAAAAAAAAAAAAABCEBIFRoZSBtaW5pbXVtIGFjdGl2ZSBib25kIHRvIGJlY29tZSBhbmQgbWFpbnRhaW4gdGhlIHJvbGUgb2YgYSB2YWxpZGF0b3IuSE1pbmltdW1BY3RpdmVTdGFrZQEAGEAAAAAAAAAAAAAAAAAAAAAABBEBIFRoZSBtaW5pbXVtIGFjdGl2ZSBub21pbmF0b3Igc3Rha2Ugb2YgdGhlIGxhc3Qgc3VjY2Vzc2Z1bCBlbGVjdGlvbi40TWluQ29tbWlzc2lvbgEAmBAAAAAADOggVGhlIG1pbmltdW0gYW1vdW50IG9mIGNvbW1pc3Npb24gdGhhdCB2YWxpZGF0b3JzIGNhbiBzZXQuAIAgSWYgc2V0IHRvIGAwYCwgbm8gbGltaXQgZXhpc3RzLhhMZWRnZXIAAQQCACUKBAAQRQEgTWFwIGZyb20gYWxsICh1bmxvY2tlZCkgImNvbnRyb2xsZXIiIGFjY291bnRzIHRvIHRoZSBpbmZvIHJlZ2FyZGluZyB0aGUgc3Rha2luZy4AdQEgTm90ZTogQWxsIHRoZSByZWFkcyBhbmQgbXV0YXRpb25zIHRvIHRoaXMgc3RvcmFnZSAqTVVTVCogYmUgZG9uZSB0aHJvdWdoIHRoZSBtZXRob2RzIGV4cG9zZWToIGJ5IFtgU3Rha2luZ0xlZGdlcmBdIHRvIGVuc3VyZSBkYXRhIGFuZCBsb2NrIGNvbnNpc3RlbmN5LhRQYXllZQABBAUAlAQADOQgV2hlcmUgdGhlIHJld2FyZCBwYXltZW50IHNob3VsZCBiZSBtYWRlLiBLZXllZCBieSBzdGFzaC4A0CBUV09YLU5PVEU6IFNBRkUgc2luY2UgYEFjY291bnRJZGAgaXMgYSBzZWN1cmUgaGFzaC4oVmFsaWRhdG9ycwEBBAUAoAgAAAxFASBUaGUgbWFwIGZyb20gKHdhbm5hYmUpIHZhbGlkYXRvciBzdGFzaCBrZXkgdG8gdGhlIHByZWZlcmVuY2VzIG9mIHRoYXQgdmFsaWRhdG9yLgDQIFRXT1gtTk9URTogU0FGRSBzaW5jZSBgQWNjb3VudElkYCBpcyBhIHNlY3VyZSBoYXNoLlBDb3VudGVyRm9yVmFsaWRhdG9ycwEAEBAAAAAABKxDb3VudGVyIGZvciB0aGUgcmVsYXRlZCBjb3VudGVkIHN0b3JhZ2UgbWFwSE1heFZhbGlkYXRvcnNDb3VudAAAEAQADDEBIFRoZSBtYXhpbXVtIHZhbGlkYXRvciBjb3VudCBiZWZvcmUgd2Ugc3RvcCBhbGxvd2luZyBuZXcgdmFsaWRhdG9ycyB0byBqb2luLgDQIFdoZW4gdGhpcyB2YWx1ZSBpcyBub3Qgc2V0LCBubyBsaW1pdHMgYXJlIGVuZm9yY2VkLihOb21pbmF0b3JzAAEEBQAtCgQATHUBIFRoZSBtYXAgZnJvbSBub21pbmF0b3Igc3Rhc2gga2V5IHRvIHRoZWlyIG5vbWluYXRpb24gcHJlZmVyZW5jZXMsIG5hbWVseSB0aGUgdmFsaWRhdG9ycyB0aGF0WCB0aGV5IHdpc2ggdG8gc3VwcG9ydC4AOQEgTm90ZSB0aGF0IHRoZSBrZXlzIG9mIHRoaXMgc3RvcmFnZSBtYXAgbWlnaHQgYmVjb21lIG5vbi1kZWNvZGFibGUgaW4gY2FzZSB0aGUtASBhY2NvdW50J3MgW2BOb21pbmF0aW9uc1F1b3RhOjpNYXhOb21pbmF0aW9uc2BdIGNvbmZpZ3VyYXRpb24gaXMgZGVjcmVhc2VkLpAgSW4gdGhpcyByYXJlIGNhc2UsIHRoZXNlIG5vbWluYXRvcnNlASBhcmUgc3RpbGwgZXhpc3RlbnQgaW4gc3RvcmFnZSwgdGhlaXIga2V5IGlzIGNvcnJlY3QgYW5kIHJldHJpZXZhYmxlIChpLmUuIGBjb250YWluc19rZXlgcQEgaW5kaWNhdGVzIHRoYXQgdGhleSBleGlzdCksIGJ1dCB0aGVpciB2YWx1ZSBjYW5ub3QgYmUgZGVjb2RlZC4gVGhlcmVmb3JlLCB0aGUgbm9uLWRlY29kYWJsZW0BIG5vbWluYXRvcnMgd2lsbCBlZmZlY3RpdmVseSBub3QtZXhpc3QsIHVudGlsIHRoZXkgcmUtc3VibWl0IHRoZWlyIHByZWZlcmVuY2VzIHN1Y2ggdGhhdCBpdAEBIGlzIHdpdGhpbiB0aGUgYm91bmRzIG9mIHRoZSBuZXdseSBzZXQgYENvbmZpZzo6TWF4Tm9taW5hdGlvbnNgLgBhASBUaGlzIGltcGxpZXMgdGhhdCBgOjppdGVyX2tleXMoKS5jb3VudCgpYCBhbmQgYDo6aXRlcigpLmNvdW50KClgIG1pZ2h0IHJldHVybiBkaWZmZXJlbnRtASB2YWx1ZXMgZm9yIHRoaXMgbWFwLiBNb3Jlb3ZlciwgdGhlIG1haW4gYDo6Y291bnQoKWAgaXMgYWxpZ25lZCB3aXRoIHRoZSBmb3JtZXIsIG5hbWVseSB0aGVsIG51bWJlciBvZiBrZXlzIHRoYXQgZXhpc3QuAG0BIExhc3RseSwgaWYgYW55IG9mIHRoZSBub21pbmF0b3JzIGJlY29tZSBub24tZGVjb2RhYmxlLCB0aGV5IGNhbiBiZSBjaGlsbGVkIGltbWVkaWF0ZWx5IHZpYbggW2BDYWxsOjpjaGlsbF9vdGhlcmBdIGRpc3BhdGNoYWJsZSBieSBhbnlvbmUuANAgVFdPWC1OT1RFOiBTQUZFIHNpbmNlIGBBY2NvdW50SWRgIGlzIGEgc2VjdXJlIGhhc2guUENvdW50ZXJGb3JOb21pbmF0b3JzAQAQEAAAAAAErENvdW50ZXIgZm9yIHRoZSByZWxhdGVkIGNvdW50ZWQgc3RvcmFnZSBtYXA4VmlydHVhbFN0YWtlcnMAAQQFAAUBBAAYyCBTdGFrZXJzIHdob3NlIGZ1bmRzIGFyZSBtYW5hZ2VkIGJ5IG90aGVyIHBhbGxldHMuAHUBIFRoaXMgcGFsbGV0IGRvZXMgbm90IGFwcGx5IGFueSBsb2NrcyBvbiB0aGVtLCB0aGVyZWZvcmUgdGhleSBhcmUgb25seSB2aXJ0dWFsbHkgYm9uZGVkLiBUaGV5bQEgYXJlIGV4cGVjdGVkIHRvIGJlIGtleWxlc3MgYWNjb3VudHMgYW5kIGhlbmNlIHNob3VsZCBub3QgYmUgYWxsb3dlZCB0byBtdXRhdGUgdGhlaXIgbGVkZ2VycQEgZGlyZWN0bHkgdmlhIHRoaXMgcGFsbGV0LiBJbnN0ZWFkLCB0aGVzZSBhY2NvdW50cyBhcmUgbWFuYWdlZCBieSBvdGhlciBwYWxsZXRzIGFuZCBhY2Nlc3NlZCkBIHZpYSBsb3cgbGV2ZWwgYXBpcy4gV2Uga2VlcCB0cmFjayBvZiB0aGVtIHRvIGRvIG1pbmltYWwgaW50ZWdyaXR5IGNoZWNrcy5gQ291bnRlckZvclZpcnR1YWxTdGFrZXJzAQAQEAAAAAAErENvdW50ZXIgZm9yIHRoZSByZWxhdGVkIGNvdW50ZWQgc3RvcmFnZSBtYXBITWF4Tm9taW5hdG9yc0NvdW50AAAQBAAMMQEgVGhlIG1heGltdW0gbm9taW5hdG9yIGNvdW50IGJlZm9yZSB3ZSBzdG9wIGFsbG93aW5nIG5ldyB2YWxpZGF0b3JzIHRvIGpvaW4uANAgV2hlbiB0aGlzIHZhbHVlIGlzIG5vdCBzZXQsIG5vIGxpbWl0cyBhcmUgZW5mb3JjZWQuKEN1cnJlbnRFcmEAABAEABBcIFRoZSBjdXJyZW50IGVyYSBpbmRleC4AZQEgVGhpcyBpcyB0aGUgbGF0ZXN0IHBsYW5uZWQgZXJhLCBkZXBlbmRpbmcgb24gaG93IHRoZSBTZXNzaW9uIHBhbGxldCBxdWV1ZXMgdGhlIHZhbGlkYXRvcoAgc2V0LCBpdCBtaWdodCBiZSBhY3RpdmUgb3Igbm90LiRBY3RpdmVFcmEAADUKBAAQ2CBUaGUgYWN0aXZlIGVyYSBpbmZvcm1hdGlvbiwgaXQgaG9sZHMgaW5kZXggYW5kIHN0YXJ0LgBZASBUaGUgYWN0aXZlIGVyYSBpcyB0aGUgZXJhIGJlaW5nIGN1cnJlbnRseSByZXdhcmRlZC4gVmFsaWRhdG9yIHNldCBvZiB0aGlzIGVyYSBtdXN0IGJlrCBlcXVhbCB0byBbYFNlc3Npb25JbnRlcmZhY2U6OnZhbGlkYXRvcnNgXS5URXJhc1N0YXJ0U2Vzc2lvbkluZGV4AAEEBRAQBAAQVQEgVGhlIHNlc3Npb24gaW5kZXggYXQgd2hpY2ggdGhlIGVyYSBzdGFydCBmb3IgdGhlIGxhc3QgW2BDb25maWc6Okhpc3RvcnlEZXB0aGBdIGVyYXMuAGEBIE5vdGU6IFRoaXMgdHJhY2tzIHRoZSBzdGFydGluZyBzZXNzaW9uIChpLmUuIHNlc3Npb24gaW5kZXggd2hlbiBlcmEgc3RhcnQgYmVpbmcgYWN0aXZlKfAgZm9yIHRoZSBlcmFzIGluIGBbQ3VycmVudEVyYSAtIEhJU1RPUllfREVQVEgsIEN1cnJlbnRFcmFdYC4sRXJhc1N0YWtlcnMBAQgFBTkKPQoMAAAAIHggRXhwb3N1cmUgb2YgdmFsaWRhdG9yIGF0IGVyYS4AYQEgVGhpcyBpcyBrZXllZCBmaXJzdCBieSB0aGUgZXJhIGluZGV4IHRvIGFsbG93IGJ1bGsgZGVsZXRpb24gYW5kIHRoZW4gdGhlIHN0YXNoIGFjY291bnQuAMwgSXMgaXQgcmVtb3ZlZCBhZnRlciBbYENvbmZpZzo6SGlzdG9yeURlcHRoYF0gZXJhcy5BASBJZiBzdGFrZXJzIGhhc24ndCBiZWVuIHNldCBvciBoYXMgYmVlbiByZW1vdmVkIHRoZW4gZW1wdHkgZXhwb3N1cmUgaXMgcmV0dXJuZWQuACkBIE5vdGU6IERlcHJlY2F0ZWQgc2luY2UgdjE0LiBVc2UgYEVyYUluZm9gIGluc3RlYWQgdG8gd29yayB3aXRoIGV4cG9zdXJlcy5MRXJhc1N0YWtlcnNPdmVydmlldwABCAUFOQpJCgQAMLggU3VtbWFyeSBvZiB2YWxpZGF0b3IgZXhwb3N1cmUgYXQgYSBnaXZlbiBlcmEuAHEBIFRoaXMgY29udGFpbnMgdGhlIHRvdGFsIHN0YWtlIGluIHN1cHBvcnQgb2YgdGhlIHZhbGlkYXRvciBhbmQgdGhlaXIgb3duIHN0YWtlLiBJbiBhZGRpdGlvbix1ASBpdCBjYW4gYWxzbyBiZSB1c2VkIHRvIGdldCB0aGUgbnVtYmVyIG9mIG5vbWluYXRvcnMgYmFja2luZyB0aGlzIHZhbGlkYXRvciBhbmQgdGhlIG51bWJlciBvZmkBIGV4cG9zdXJlIHBhZ2VzIHRoZXkgYXJlIGRpdmlkZWQgaW50by4gVGhlIHBhZ2UgY291bnQgaXMgdXNlZnVsIHRvIGRldGVybWluZSB0aGUgbnVtYmVyIG9mrCBwYWdlcyBvZiByZXdhcmRzIHRoYXQgbmVlZHMgdG8gYmUgY2xhaW1lZC4AYQEgVGhpcyBpcyBrZXllZCBmaXJzdCBieSB0aGUgZXJhIGluZGV4IHRvIGFsbG93IGJ1bGsgZGVsZXRpb24gYW5kIHRoZW4gdGhlIHN0YXNoIGFjY291bnQurCBTaG91bGQgb25seSBiZSBhY2Nlc3NlZCB0aHJvdWdoIGBFcmFJbmZvYC4AzCBJcyBpdCByZW1vdmVkIGFmdGVyIFtgQ29uZmlnOjpIaXN0b3J5RGVwdGhgXSBlcmFzLkEBIElmIHN0YWtlcnMgaGFzbid0IGJlZW4gc2V0IG9yIGhhcyBiZWVuIHJlbW92ZWQgdGhlbiBlbXB0eSBvdmVydmlldyBpcyByZXR1cm5lZC5IRXJhc1N0YWtlcnNDbGlwcGVkAQEIBQU5Cj0KDAAAAECYIENsaXBwZWQgRXhwb3N1cmUgb2YgdmFsaWRhdG9yIGF0IGVyYS4AZQEgTm90ZTogVGhpcyBpcyBkZXByZWNhdGVkLCBzaG91bGQgYmUgdXNlZCBhcyByZWFkLW9ubHkgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLjEBIE5ldyBgRXhwb3N1cmVgcyBhcmUgc3RvcmVkIGluIGEgcGFnZWQgbWFubmVyIGluIGBFcmFzU3Rha2Vyc1BhZ2VkYCBpbnN0ZWFkLgBZASBUaGlzIGlzIHNpbWlsYXIgdG8gW2BFcmFzU3Rha2Vyc2BdIGJ1dCBudW1iZXIgb2Ygbm9taW5hdG9ycyBleHBvc2VkIGlzIHJlZHVjZWQgdG8gdGhlqCBgVDo6TWF4RXhwb3N1cmVQYWdlU2l6ZWAgYmlnZ2VzdCBzdGFrZXJzLh0BIChOb3RlOiB0aGUgZmllbGQgYHRvdGFsYCBhbmQgYG93bmAgb2YgdGhlIGV4cG9zdXJlIHJlbWFpbnMgdW5jaGFuZ2VkKS70IFRoaXMgaXMgdXNlZCB0byBsaW1pdCB0aGUgaS9vIGNvc3QgZm9yIHRoZSBub21pbmF0b3IgcGF5b3V0LgBdASBUaGlzIGlzIGtleWVkIGZpc3QgYnkgdGhlIGVyYSBpbmRleCB0byBhbGxvdyBidWxrIGRlbGV0aW9uIGFuZCB0aGVuIHRoZSBzdGFzaCBhY2NvdW50LgDMIEl0IGlzIHJlbW92ZWQgYWZ0ZXIgW2BDb25maWc6Okhpc3RvcnlEZXB0aGBdIGVyYXMuQQEgSWYgc3Rha2VycyBoYXNuJ3QgYmVlbiBzZXQgb3IgaGFzIGJlZW4gcmVtb3ZlZCB0aGVuIGVtcHR5IGV4cG9zdXJlIGlzIHJldHVybmVkLgApASBOb3RlOiBEZXByZWNhdGVkIHNpbmNlIHYxNC4gVXNlIGBFcmFJbmZvYCBpbnN0ZWFkIHRvIHdvcmsgd2l0aCBleHBvc3VyZXMuQEVyYXNTdGFrZXJzUGFnZWQAAQwFBQVNClEKBAAYwCBQYWdpbmF0ZWQgZXhwb3N1cmUgb2YgYSB2YWxpZGF0b3IgYXQgZ2l2ZW4gZXJhLgBxASBUaGlzIGlzIGtleWVkIGZpcnN0IGJ5IHRoZSBlcmEgaW5kZXggdG8gYWxsb3cgYnVsayBkZWxldGlvbiwgdGhlbiBzdGFzaCBhY2NvdW50IGFuZCBmaW5hbGx51CB0aGUgcGFnZS4gU2hvdWxkIG9ubHkgYmUgYWNjZXNzZWQgdGhyb3VnaCBgRXJhSW5mb2AuANQgVGhpcyBpcyBjbGVhcmVkIGFmdGVyIFtgQ29uZmlnOjpIaXN0b3J5RGVwdGhgXSBlcmFzLjhDbGFpbWVkUmV3YXJkcwEBCAUFOQqRAQQAGNwgSGlzdG9yeSBvZiBjbGFpbWVkIHBhZ2VkIHJld2FyZHMgYnkgZXJhIGFuZCB2YWxpZGF0b3IuAGkBIFRoaXMgaXMga2V5ZWQgYnkgZXJhIGFuZCB2YWxpZGF0b3Igc3Rhc2ggd2hpY2ggbWFwcyB0byB0aGUgc2V0IG9mIHBhZ2UgaW5kZXhlcyB3aGljaCBoYXZlOCBiZWVuIGNsYWltZWQuAMwgSXQgaXMgcmVtb3ZlZCBhZnRlciBbYENvbmZpZzo6SGlzdG9yeURlcHRoYF0gZXJhcy5IRXJhc1ZhbGlkYXRvclByZWZzAQEIBQU5CqAIAAAUEQEgU2ltaWxhciB0byBgRXJhc1N0YWtlcnNgLCB0aGlzIGhvbGRzIHRoZSBwcmVmZXJlbmNlcyBvZiB2YWxpZGF0b3JzLgBhASBUaGlzIGlzIGtleWVkIGZpcnN0IGJ5IHRoZSBlcmEgaW5kZXggdG8gYWxsb3cgYnVsayBkZWxldGlvbiBhbmQgdGhlbiB0aGUgc3Rhc2ggYWNjb3VudC4AzCBJcyBpdCByZW1vdmVkIGFmdGVyIFtgQ29uZmlnOjpIaXN0b3J5RGVwdGhgXSBlcmFzLkxFcmFzVmFsaWRhdG9yUmV3YXJkAAEEBRAYBAAMLQEgVGhlIHRvdGFsIHZhbGlkYXRvciBlcmEgcGF5b3V0IGZvciB0aGUgbGFzdCBbYENvbmZpZzo6SGlzdG9yeURlcHRoYF0gZXJhcy4AIQEgRXJhcyB0aGF0IGhhdmVuJ3QgZmluaXNoZWQgeWV0IG9yIGhhcyBiZWVuIHJlbW92ZWQgZG9lc24ndCBoYXZlIHJld2FyZC5ARXJhc1Jld2FyZFBvaW50cwEBBAUQVQoUAAAAAAAI0CBSZXdhcmRzIGZvciB0aGUgbGFzdCBbYENvbmZpZzo6SGlzdG9yeURlcHRoYF0gZXJhcy4lASBJZiByZXdhcmQgaGFzbid0IGJlZW4gc2V0IG9yIGhhcyBiZWVuIHJlbW92ZWQgdGhlbiAwIHJld2FyZCBpcyByZXR1cm5lZC44RXJhc1RvdGFsU3Rha2UBAQQFEBhAAAAAAAAAAAAAAAAAAAAAAAgRASBUaGUgdG90YWwgYW1vdW50IHN0YWtlZCBmb3IgdGhlIGxhc3QgW2BDb25maWc6Okhpc3RvcnlEZXB0aGBdIGVyYXMuHQEgSWYgdG90YWwgaGFzbid0IGJlZW4gc2V0IG9yIGhhcyBiZWVuIHJlbW92ZWQgdGhlbiAwIHN0YWtlIGlzIHJldHVybmVkLiBGb3JjZUVyYQEAqAQABFQgTW9kZSBvZiBlcmEgZm9yY2luZy5ATWF4U3Rha2VkUmV3YXJkcwAAEQIEAAwZASBNYXhpbXVtIHN0YWtlZCByZXdhcmRzLCBpLmUuIHRoZSBwZXJjZW50YWdlIG9mIHRoZSBlcmEgaW5mbGF0aW9uIHRoYXRsIGlzIHVzZWQgZm9yIHN0YWtlIHJld2FyZHMurCBTZWUgW0VyYSBwYXlvdXRdKC4vaW5kZXguaHRtbCNlcmEtcGF5b3V0KS5MU2xhc2hSZXdhcmRGcmFjdGlvbgEAmBAAAAAADPggVGhlIHBlcmNlbnRhZ2Ugb2YgdGhlIHNsYXNoIHRoYXQgaXMgZGlzdHJpYnV0ZWQgdG8gcmVwb3J0ZXJzLgDkIFRoZSByZXN0IG9mIHRoZSBzbGFzaGVkIHZhbHVlIGlzIGhhbmRsZWQgYnkgdGhlIGBTbGFzaGAuTENhbmNlbGVkU2xhc2hQYXlvdXQBABhAAAAAAAAAAAAAAAAAAAAAAAgVASBUaGUgYW1vdW50IG9mIGN1cnJlbmN5IGdpdmVuIHRvIHJlcG9ydGVycyBvZiBhIHNsYXNoIGV2ZW50IHdoaWNoIHdhc+wgY2FuY2VsZWQgYnkgZXh0cmFvcmRpbmFyeSBjaXJjdW1zdGFuY2VzIChlLmcuIGdvdmVybmFuY2UpLkBVbmFwcGxpZWRTbGFzaGVzAQEEBRBlCgQABMQgQWxsIHVuYXBwbGllZCBzbGFzaGVzIHRoYXQgYXJlIHF1ZXVlZCBmb3IgbGF0ZXIuKEJvbmRlZEVyYXMBAEEJBAAQJQEgQSBtYXBwaW5nIGZyb20gc3RpbGwtYm9uZGVkIGVyYXMgdG8gdGhlIGZpcnN0IHNlc3Npb24gaW5kZXggb2YgdGhhdCBlcmEuAMggTXVzdCBjb250YWlucyBpbmZvcm1hdGlvbiBmb3IgZXJhcyBmb3IgdGhlIHJhbmdlOrwgYFthY3RpdmVfZXJhIC0gYm91bmRpbmdfZHVyYXRpb247IGFjdGl2ZV9lcmFdYExWYWxpZGF0b3JTbGFzaEluRXJhAAEIBQU5Cm0KBAAIRQEgQWxsIHNsYXNoaW5nIGV2ZW50cyBvbiB2YWxpZGF0b3JzLCBtYXBwZWQgYnkgZXJhIHRvIHRoZSBoaWdoZXN0IHNsYXNoIHByb3BvcnRpb25wIGFuZCBzbGFzaCB2YWx1ZSBvZiB0aGUgZXJhLkxOb21pbmF0b3JTbGFzaEluRXJhAAEIBQU5ChgEAARhASBBbGwgc2xhc2hpbmcgZXZlbnRzIG9uIG5vbWluYXRvcnMsIG1hcHBlZCBieSBlcmEgdG8gdGhlIGhpZ2hlc3Qgc2xhc2ggdmFsdWUgb2YgdGhlIGVyYS40U2xhc2hpbmdTcGFucwABBAUAcQoEAASMIFNsYXNoaW5nIHNwYW5zIGZvciBzdGFzaCBhY2NvdW50cy4kU3BhblNsYXNoAQEEBWEKdQqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIPQEgUmVjb3JkcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbWF4aW11bSBzbGFzaCBvZiBhIHN0YXNoIHdpdGhpbiBhIHNsYXNoaW5nIHNwYW4suCBhcyB3ZWxsIGFzIGhvdyBtdWNoIHJld2FyZCBoYXMgYmVlbiBwYWlkIG91dC5UQ3VycmVudFBsYW5uZWRTZXNzaW9uAQAQEAAAAAAM6CBUaGUgbGFzdCBwbGFubmVkIHNlc3Npb24gc2NoZWR1bGVkIGJ5IHRoZSBzZXNzaW9uIHBhbGxldC4AcQEgVGhpcyBpcyBiYXNpY2FsbHkgaW4gc3luYyB3aXRoIHRoZSBjYWxsIHRvIFtgcGFsbGV0X3Nlc3Npb246OlNlc3Npb25NYW5hZ2VyOjpuZXdfc2Vzc2lvbmBdLjhDaGlsbFRocmVzaG9sZAAAEQIEAAxRASBUaGUgdGhyZXNob2xkIGZvciB3aGVuIHVzZXJzIGNhbiBzdGFydCBjYWxsaW5nIGBjaGlsbF9vdGhlcmAgZm9yIG90aGVyIHZhbGlkYXRvcnMgL1kBIG5vbWluYXRvcnMuIFRoZSB0aHJlc2hvbGQgaXMgY29tcGFyZWQgdG8gdGhlIGFjdHVhbCBudW1iZXIgb2YgdmFsaWRhdG9ycyAvIG5vbWluYXRvcnMpASAoYENvdW50Rm9yKmApIGluIHRoZSBzeXN0ZW0gY29tcGFyZWQgdG8gdGhlIGNvbmZpZ3VyZWQgbWF4IChgTWF4KkNvdW50YCkuAQkCAZAcMEhpc3RvcnlEZXB0aBAQVAAAAFCMIE51bWJlciBvZiBlcmFzIHRvIGtlZXAgaW4gaGlzdG9yeS4A6CBGb2xsb3dpbmcgaW5mb3JtYXRpb24gaXMga2VwdCBmb3IgZXJhcyBpbiBgW2N1cnJlbnRfZXJhIC0JASBIaXN0b3J5RGVwdGgsIGN1cnJlbnRfZXJhXWA6IGBFcmFzU3Rha2Vyc2AsIGBFcmFzU3Rha2Vyc0NsaXBwZWRgLAUBIGBFcmFzVmFsaWRhdG9yUHJlZnNgLCBgRXJhc1ZhbGlkYXRvclJld2FyZGAsIGBFcmFzUmV3YXJkUG9pbnRzYCxFASBgRXJhc1RvdGFsU3Rha2VgLCBgRXJhc1N0YXJ0U2Vzc2lvbkluZGV4YCwgYENsYWltZWRSZXdhcmRzYCwgYEVyYXNTdGFrZXJzUGFnZWRgLFwgYEVyYXNTdGFrZXJzT3ZlcnZpZXdgLgDkIE11c3QgYmUgbW9yZSB0aGFuIHRoZSBudW1iZXIgb2YgZXJhcyBkZWxheWVkIGJ5IHNlc3Npb24u+CBJLmUuIGFjdGl2ZSBlcmEgbXVzdCBhbHdheXMgYmUgaW4gaGlzdG9yeS4gSS5lLiBgYWN0aXZlX2VyYSA+xCBjdXJyZW50X2VyYSAtIGhpc3RvcnlfZGVwdGhgIG11c3QgYmUgZ3VhcmFudGVlZC4AEQEgSWYgbWlncmF0aW5nIGFuIGV4aXN0aW5nIHBhbGxldCBmcm9tIHN0b3JhZ2UgdmFsdWUgdG8gY29uZmlnIHZhbHVlLOwgdGhpcyBzaG91bGQgYmUgc2V0IHRvIHNhbWUgdmFsdWUgb3IgZ3JlYXRlciBhcyBpbiBzdG9yYWdlLgAVASBOb3RlOiBgSGlzdG9yeURlcHRoYCBpcyB1c2VkIGFzIHRoZSB1cHBlciBib3VuZCBmb3IgdGhlIGBCb3VuZGVkVmVjYC0BIGl0ZW0gYFN0YWtpbmdMZWRnZXIubGVnYWN5X2NsYWltZWRfcmV3YXJkc2AuIFNldHRpbmcgdGhpcyB2YWx1ZSBsb3dlciB0aGFu2CB0aGUgZXhpc3RpbmcgdmFsdWUgY2FuIGxlYWQgdG8gaW5jb25zaXN0ZW5jaWVzIGluIHRoZRUBIGBTdGFraW5nTGVkZ2VyYCBhbmQgd2lsbCBuZWVkIHRvIGJlIGhhbmRsZWQgcHJvcGVybHkgaW4gYSBtaWdyYXRpb24u8CBUaGUgdGVzdCBgcmVkdWNpbmdfaGlzdG9yeV9kZXB0aF9hYnJ1cHRgIHNob3dzIHRoaXMgZWZmZWN0LjhTZXNzaW9uc1BlckVyYRAQBgAAAARwIE51bWJlciBvZiBzZXNzaW9ucyBwZXIgZXJhLjxCb25kaW5nRHVyYXRpb24QEAIAAAAE5CBOdW1iZXIgb2YgZXJhcyB0aGF0IHN0YWtlZCBmdW5kcyBtdXN0IHJlbWFpbiBib25kZWQgZm9yLkhTbGFzaERlZmVyRHVyYXRpb24QEAEAAAAQAQEgTnVtYmVyIG9mIGVyYXMgdGhhdCBzbGFzaGVzIGFyZSBkZWZlcnJlZCBieSwgYWZ0ZXIgY29tcHV0YXRpb24uAA0BIFRoaXMgc2hvdWxkIGJlIGxlc3MgdGhhbiB0aGUgYm9uZGluZyBkdXJhdGlvbi4gU2V0IHRvIDAgaWYgc2xhc2hlcxUBIHNob3VsZCBiZSBhcHBsaWVkIGltbWVkaWF0ZWx5LCB3aXRob3V0IG9wcG9ydHVuaXR5IGZvciBpbnRlcnZlbnRpb24uTE1heEV4cG9zdXJlUGFnZVNpemUQEEAAAAAssCBUaGUgbWF4aW11bSBzaXplIG9mIGVhY2ggYFQ6OkV4cG9zdXJlUGFnZWAuACkBIEFuIGBFeHBvc3VyZVBhZ2VgIGlzIHdlYWtseSBib3VuZGVkIHRvIGEgbWF4aW11bSBvZiBgTWF4RXhwb3N1cmVQYWdlU2l6ZWAwIG5vbWluYXRvcnMuACEBIEZvciBvbGRlciBub24tcGFnZWQgZXhwb3N1cmUsIGEgcmV3YXJkIHBheW91dCB3YXMgcmVzdHJpY3RlZCB0byB0aGUgdG9wIQEgYE1heEV4cG9zdXJlUGFnZVNpemVgIG5vbWluYXRvcnMuIFRoaXMgaXMgdG8gbGltaXQgdGhlIGkvbyBjb3N0IGZvciB0aGVIIG5vbWluYXRvciBwYXlvdXQuAFkBIE5vdGU6IGBNYXhFeHBvc3VyZVBhZ2VTaXplYCBpcyB1c2VkIHRvIGJvdW5kIGBDbGFpbWVkUmV3YXJkc2AgYW5kIGlzIHVuc2FmZSB0byByZWR1Y2WQIHdpdGhvdXQgaGFuZGxpbmcgaXQgaW4gYSBtaWdyYXRpb24uPE1heFZhbGlkYXRvclNldBAQ6AMAAAQVASBUaGUgYWJzb2x1dGUgbWF4aW11bSBvZiB3aW5uZXIgdmFsaWRhdG9ycyB0aGlzIHBhbGxldCBzaG91bGQgcmV0dXJuLkhNYXhVbmxvY2tpbmdDaHVua3MQECAAAAAoBQEgVGhlIG1heGltdW0gbnVtYmVyIG9mIGB1bmxvY2tpbmdgIGNodW5rcyBhIFtgU3Rha2luZ0xlZGdlcmBdIGNhbgkBIGhhdmUuIEVmZmVjdGl2ZWx5IGRldGVybWluZXMgaG93IG1hbnkgdW5pcXVlIGVyYXMgYSBzdGFrZXIgbWF5IGJlOCB1bmJvbmRpbmcgaW4uAPggTm90ZTogYE1heFVubG9ja2luZ0NodW5rc2AgaXMgdXNlZCBhcyB0aGUgdXBwZXIgYm91bmQgZm9yIHRoZQEBIGBCb3VuZGVkVmVjYCBpdGVtIGBTdGFraW5nTGVkZ2VyLnVubG9ja2luZ2AuIFNldHRpbmcgdGhpcyB2YWx1ZQUBIGxvd2VyIHRoYW4gdGhlIGV4aXN0aW5nIHZhbHVlIGNhbiBsZWFkIHRvIGluY29uc2lzdGVuY2llcyBpbiB0aGUJASBgU3Rha2luZ0xlZGdlcmAgYW5kIHdpbGwgbmVlZCB0byBiZSBoYW5kbGVkIHByb3Blcmx5IGluIGEgcnVudGltZQUBIG1pZ3JhdGlvbi4gVGhlIHRlc3QgYHJlZHVjaW5nX21heF91bmxvY2tpbmdfY2h1bmtzX2FicnVwdGAgc2hvd3M0IHRoaXMgZWZmZWN0LgF5CgYAIE9mZmVuY2VzASBPZmZlbmNlcwgcUmVwb3J0cwABBAU0fQoEAARJASBUaGUgcHJpbWFyeSBzdHJ1Y3R1cmUgdGhhdCBob2xkcyBhbGwgb2ZmZW5jZSByZWNvcmRzIGtleWVkIGJ5IHJlcG9ydCBpZGVudGlmaWVycy5YQ29uY3VycmVudFJlcG9ydHNJbmRleAEBCAUFhQq5AwQABCkBIEEgdmVjdG9yIG9mIHJlcG9ydHMgb2YgdGhlIHNhbWUga2luZCB0aGF0IGhhcHBlbmVkIGF0IHRoZSBzYW1lIHRpbWUgc2xvdC4AAawAAAcAKEhpc3RvcmljYWwBKEhpc3RvcmljYWwISEhpc3RvcmljYWxTZXNzaW9ucwABBAUQiQoEAARdASBNYXBwaW5nIGZyb20gaGlzdG9yaWNhbCBzZXNzaW9uIGluZGljZXMgdG8gc2Vzc2lvbi1kYXRhIHJvb3QgaGFzaCBhbmQgdmFsaWRhdG9yIGNvdW50LixTdG9yZWRSYW5nZQAAJQEEAATkIFRoZSByYW5nZSBvZiBoaXN0b3JpY2FsIHNlc3Npb25zIHdlIHN0b3JlLiBbZmlyc3QsIGxhc3QpAAG0AAAbAChQYXJhbWV0ZXJzAShQYXJhbWV0ZXJzBChQYXJhbWV0ZXJzAAEEArzcBAAETCBTdG9yZWQgcGFyYW1ldGVycy4BPQIBuAAARgAcU2Vzc2lvbgEcU2Vzc2lvbhwoVmFsaWRhdG9ycwEAAQIEAAR8IFRoZSBjdXJyZW50IHNldCBvZiB2YWxpZGF0b3JzLjBDdXJyZW50SW5kZXgBABAQAAAAAAR4IEN1cnJlbnQgaW5kZXggb2YgdGhlIHNlc3Npb24uNFF1ZXVlZENoYW5nZWQBACAEAAg5ASBUcnVlIGlmIHRoZSB1bmRlcmx5aW5nIGVjb25vbWljIGlkZW50aXRpZXMgb3Igd2VpZ2h0aW5nIGJlaGluZCB0aGUgdmFsaWRhdG9yc6QgaGFzIGNoYW5nZWQgaW4gdGhlIHF1ZXVlZCB2YWxpZGF0b3Igc2V0LihRdWV1ZWRLZXlzAQCNCgQACD0BIFRoZSBxdWV1ZWQga2V5cyBmb3IgdGhlIG5leHQgc2Vzc2lvbi4gV2hlbiB0aGUgbmV4dCBzZXNzaW9uIGJlZ2lucywgdGhlc2Uga2V5c+Agd2lsbCBiZSB1c2VkIHRvIGRldGVybWluZSB0aGUgdmFsaWRhdG9yJ3Mgc2Vzc2lvbiBrZXlzLkhEaXNhYmxlZFZhbGlkYXRvcnMBAJUKBAAUgCBJbmRpY2VzIG9mIGRpc2FibGVkIHZhbGlkYXRvcnMuAD0BIFRoZSB2ZWMgaXMgYWx3YXlzIGtlcHQgc29ydGVkIHNvIHRoYXQgd2UgY2FuIGZpbmQgd2hldGhlciBhIGdpdmVuIHZhbGlkYXRvciBpcz0BIGRpc2FibGVkIHVzaW5nIGJpbmFyeSBzZWFyY2guIEl0IGdldHMgY2xlYXJlZCB3aGVuIGBvbl9zZXNzaW9uX2VuZGluZ2AgcmV0dXJuc2QgYSBuZXcgc2V0IG9mIGlkZW50aXRpZXMuIE5leHRLZXlzAAEEBQBVAgQABJwgVGhlIG5leHQgc2Vzc2lvbiBrZXlzIGZvciBhIHZhbGlkYXRvci4gS2V5T3duZXIAAQQFoQoABAAECQEgVGhlIG93bmVyIG9mIGEga2V5LiBUaGUga2V5IGlzIHRoZSBgS2V5VHlwZUlkYCArIHRoZSBlbmNvZGVkIGtleS4BUQIB6AQoS2V5RGVwb3NpdBhAAAAAAAAAAAAAAAAAAAAAAASkIFRoZSBhbW91bnQgdG8gYmUgaGVsZCB3aGVuIHNldHRpbmcga2V5cy4BqQoIABxHcmFuZHBhARxHcmFuZHBhHBRTdGF0ZQEArQoEAASQIFN0YXRlIG9mIHRoZSBjdXJyZW50IGF1dGhvcml0eSBzZXQuNFBlbmRpbmdDaGFuZ2UAALEKBAAExCBQZW5kaW5nIGNoYW5nZTogKHNpZ25hbGVkIGF0LCBzY2hlZHVsZWQgY2hhbmdlKS4oTmV4dEZvcmNlZAAAEAQABLwgbmV4dCBibG9jayBudW1iZXIgd2hlcmUgd2UgY2FuIGZvcmNlIGEgY2hhbmdlLhxTdGFsbGVkAAAlAQQABJAgYHRydWVgIGlmIHdlIGFyZSBjdXJyZW50bHkgc3RhbGxlZC4wQ3VycmVudFNldElkAQAwIAAAAAAAAAAACF0BIFRoZSBudW1iZXIgb2YgY2hhbmdlcyAoYm90aCBpbiB0ZXJtcyBvZiBrZXlzIGFuZCB1bmRlcmx5aW5nIGVjb25vbWljIHJlc3BvbnNpYmlsaXRpZXMpxCBpbiB0aGUgInNldCIgb2YgR3JhbmRwYSB2YWxpZGF0b3JzIGZyb20gZ2VuZXNpcy4wU2V0SWRTZXNzaW9uAAEEBTAQBAAoWQEgQSBtYXBwaW5nIGZyb20gZ3JhbmRwYSBzZXQgSUQgdG8gdGhlIGluZGV4IG9mIHRoZSAqbW9zdCByZWNlbnQqIHNlc3Npb24gZm9yIHdoaWNoIGl0c2ggbWVtYmVycyB3ZXJlIHJlc3BvbnNpYmxlLgBFASBUaGlzIGlzIG9ubHkgdXNlZCBmb3IgdmFsaWRhdGluZyBlcXVpdm9jYXRpb24gcHJvb2ZzLiBBbiBlcXVpdm9jYXRpb24gcHJvb2YgbXVzdE0BIGNvbnRhaW5zIGEga2V5LW93bmVyc2hpcCBwcm9vZiBmb3IgYSBnaXZlbiBzZXNzaW9uLCB0aGVyZWZvcmUgd2UgbmVlZCBhIHdheSB0byB0aWVFASB0b2dldGhlciBzZXNzaW9ucyBhbmQgR1JBTkRQQSBzZXQgaWRzLCBpLmUuIHdlIG5lZWQgdG8gdmFsaWRhdGUgdGhhdCBhIHZhbGlkYXRvckEBIHdhcyB0aGUgb3duZXIgb2YgYSBnaXZlbiBrZXkgb24gYSBnaXZlbiBzZXNzaW9uLCBhbmQgd2hhdCB0aGUgYWN0aXZlIHNldCBJRCB3YXNUIGR1cmluZyB0aGF0IHNlc3Npb24uALggVFdPWC1OT1RFOiBgU2V0SWRgIGlzIG5vdCB1bmRlciB1c2VyIGNvbnRyb2wuLEF1dGhvcml0aWVzAQC1CgQABIQgVGhlIGN1cnJlbnQgbGlzdCBvZiBhdXRob3JpdGllcy4BbQIB7Aw4TWF4QXV0aG9yaXRpZXMQEKCGAQAEXCBNYXggQXV0aG9yaXRpZXMgaW4gdXNlNE1heE5vbWluYXRvcnMQEEAAAAAE1CBUaGUgbWF4aW11bSBudW1iZXIgb2Ygbm9taW5hdG9ycyBmb3IgZWFjaCB2YWxpZGF0b3IuWE1heFNldElkU2Vzc2lvbkVudHJpZXMwIAwAAAAAAAAAGDkBIFRoZSBtYXhpbXVtIG51bWJlciBvZiBlbnRyaWVzIHRvIGtlZXAgaW4gdGhlIHNldCBpZCB0byBzZXNzaW9uIGluZGV4IG1hcHBpbmcuADEBIFNpbmNlIHRoZSBgU2V0SWRTZXNzaW9uYCBtYXAgaXMgb25seSB1c2VkIGZvciB2YWxpZGF0aW5nIGVxdWl2b2NhdGlvbnMgdGhpcykBIHZhbHVlIHNob3VsZCByZWxhdGUgdG8gdGhlIGJvbmRpbmcgZHVyYXRpb24gb2Ygd2hhdGV2ZXIgc3Rha2luZyBzeXN0ZW0gaXM1ASBiZWluZyB1c2VkIChpZiBhbnkpLiBJZiBlcXVpdm9jYXRpb24gaGFuZGxpbmcgaXMgbm90IGVuYWJsZWQgdGhlbiB0aGlzIHZhbHVlNCBjYW4gYmUgemVyby4BuQoKAEhBdXRob3JpdHlEaXNjb3ZlcnkBSEF1dGhvcml0eURpc2NvdmVyeQgQS2V5cwEAvQoEAASMIEtleXMgb2YgdGhlIGN1cnJlbnQgYXV0aG9yaXR5IHNldC4gTmV4dEtleXMBAL0KBAAEgCBLZXlzIG9mIHRoZSBuZXh0IGF1dGhvcml0eSBzZXQuAAAAAAwAHFV0aWxpdHkAAZkCAfwETGJhdGNoZWRfY2FsbHNfbGltaXQQEKoqAAAEqCBUaGUgbGltaXQgb24gdGhlIG51bWJlciBvZiBiYXRjaGVkIGNhbGxzLgHFChAAIElkZW50aXR5ASBJZGVudGl0eSQoSWRlbnRpdHlPZgABBAUAyQoEABBpASBJbmZvcm1hdGlvbiB0aGF0IGlzIHBlcnRpbmVudCB0byBpZGVudGlmeSB0aGUgZW50aXR5IGJlaGluZCBhbiBhY2NvdW50LiBGaXJzdCBpdGVtIGlzIHRoZeAgcmVnaXN0cmF0aW9uLCBzZWNvbmQgaXMgdGhlIGFjY291bnQncyBwcmltYXJ5IHVzZXJuYW1lLgDAIFRXT1gtTk9URTogT0sg4oCVIGBBY2NvdW50SWRgIGlzIGEgc2VjdXJlIGhhc2guKFVzZXJuYW1lT2YAAQQFAA0BBAAEvCBJZGVudGlmaWVzIHRoZSBwcmltYXJ5IHVzZXJuYW1lIG9mIGFuIGFjY291bnQuHFN1cGVyT2YAAQQCAIkDBAAIYQEgVGhlIHN1cGVyLWlkZW50aXR5IG9mIGFuIGFsdGVybmF0aXZlICJzdWIiIGlkZW50aXR5IHRvZ2V0aGVyIHdpdGggaXRzIG5hbWUsIHdpdGhpbiB0aGF0UQEgY29udGV4dC4gSWYgdGhlIGFjY291bnQgaXMgbm90IHNvbWUgb3RoZXIgYWNjb3VudCdzIHN1Yi1pZGVudGl0eSwgdGhlbiBqdXN0IGBOb25lYC4YU3Vic09mAQEEBQDZCkQAAAAAAAAAAAAAAAAAAAAAABS4IEFsdGVybmF0aXZlICJzdWIiIGlkZW50aXRpZXMgb2YgdGhpcyBhY2NvdW50LgAdASBUaGUgZmlyc3QgaXRlbSBpcyB0aGUgZGVwb3NpdCwgdGhlIHNlY29uZCBpcyBhIHZlY3RvciBvZiB0aGUgYWNjb3VudHMuAMAgVFdPWC1OT1RFOiBPSyDigJUgYEFjY291bnRJZGAgaXMgYSBzZWN1cmUgaGFzaC4oUmVnaXN0cmFycwEA4QoEABBNASBUaGUgc2V0IG9mIHJlZ2lzdHJhcnMuIE5vdCBleHBlY3RlZCB0byBnZXQgdmVyeSBiaWcgYXMgY2FuIG9ubHkgYmUgYWRkZWQgdGhyb3VnaCBhqCBzcGVjaWFsIG9yaWdpbiAobGlrZWx5IGEgY291bmNpbCBtb3Rpb24pLgApASBUaGUgaW5kZXggaW50byB0aGlzIGNhbiBiZSBjYXN0IHRvIGBSZWdpc3RyYXJJbmRleGAgdG8gZ2V0IGEgdmFsaWQgdmFsdWUuLEF1dGhvcml0eU9mAAEEBfEK9QoEAAT0IEEgbWFwIG9mIHRoZSBhY2NvdW50cyB3aG8gYXJlIGF1dGhvcml6ZWQgdG8gZ3JhbnQgdXNlcm5hbWVzLjhVc2VybmFtZUluZm9PZgABBAINAfkKBAAYdQEgUmV2ZXJzZSBsb29rdXAgZnJvbSBgdXNlcm5hbWVgIHRvIHRoZSBgQWNjb3VudElkYCB0aGF0IGhhcyByZWdpc3RlcmVkIGl0IGFuZCB0aGUgcHJvdmlkZXIgb2ZtASB0aGUgdXNlcm5hbWUuIFRoZSBgb3duZXJgIHZhbHVlIHNob3VsZCBiZSBhIGtleSBpbiB0aGUgYFVzZXJuYW1lT2ZgIG1hcCwgYnV0IGl0IG1heSBub3QgaWbwIHRoZSB1c2VyIGhhcyBjbGVhcmVkIHRoZWlyIHVzZXJuYW1lIG9yIGl0IGhhcyBiZWVuIHJlbW92ZWQuAGkBIE11bHRpcGxlIHVzZXJuYW1lcyBtYXkgbWFwIHRvIHRoZSBzYW1lIGBBY2NvdW50SWRgLCBidXQgYFVzZXJuYW1lT2ZgIHdpbGwgb25seSBtYXAgdG8gb25lSCBwcmltYXJ5IHVzZXJuYW1lLkBQZW5kaW5nVXNlcm5hbWVzAAEEAg0BAQsEABhtASBVc2VybmFtZXMgdGhhdCBhbiBhdXRob3JpdHkgaGFzIGdyYW50ZWQsIGJ1dCB0aGF0IHRoZSBhY2NvdW50IGNvbnRyb2xsZXIgaGFzIG5vdCBjb25maXJtZWRxASB0aGF0IHRoZXkgd2FudCBpdC4gVXNlZCBwcmltYXJpbHkgaW4gY2FzZXMgd2hlcmUgdGhlIGBBY2NvdW50SWRgIGNhbm5vdCBwcm92aWRlIGEgc2lnbmF0dXJlXQEgYmVjYXVzZSB0aGV5IGFyZSBhIHB1cmUgcHJveHksIG11bHRpc2lnLCBldGMuIEluIG9yZGVyIHRvIGNvbmZpcm0gaXQsIHRoZXkgc2hvdWxkIGNhbGywIFthY2NlcHRfdXNlcm5hbWVdKGBDYWxsOjphY2NlcHRfdXNlcm5hbWVgKS4AHQEgRmlyc3QgdHVwbGUgaXRlbSBpcyB0aGUgYWNjb3VudCBhbmQgc2Vjb25kIGlzIHRoZSBhY2NlcHRhbmNlIGRlYWRsaW5lLkhVbmJpbmRpbmdVc2VybmFtZXMAAQQCDQEQBAAQXQEgVXNlcm5hbWVzIGZvciB3aGljaCB0aGUgYXV0aG9yaXR5IHRoYXQgZ3JhbnRlZCB0aGVtIGhhcyBzdGFydGVkIHRoZSByZW1vdmFsIHByb2Nlc3MgYnlxASB1bmJpbmRpbmcgdGhlbS4gRWFjaCB1bmJpbmRpbmcgdXNlcm5hbWUgbWFwcyB0byBpdHMgZ3JhY2UgcGVyaW9kIGV4cGlyeSwgd2hpY2ggaXMgdGhlIGZpcnN03CBibG9jayBpbiB3aGljaCB0aGUgdXNlcm5hbWUgY291bGQgYmUgZGVsZXRlZCB0aHJvdWdoIGHEIFtyZW1vdmVfdXNlcm5hbWVdKGBDYWxsOjpyZW1vdmVfdXNlcm5hbWVgKSBjYWxsLgH1AgEJASgwQmFzaWNEZXBvc2l0GEAAoHJOGAkAAAAAAAAAAAAABNggVGhlIGFtb3VudCBoZWxkIG9uIGRlcG9zaXQgZm9yIGEgcmVnaXN0ZXJlZCBpZGVudGl0eS4sQnl0ZURlcG9zaXQYQIDw+gIAAAAAAAAAAAAAAAAEHQEgVGhlIGFtb3VudCBoZWxkIG9uIGRlcG9zaXQgcGVyIGVuY29kZWQgYnl0ZSBmb3IgYSByZWdpc3RlcmVkIGlkZW50aXR5LjxVc2VybmFtZURlcG9zaXQYQAAQXl8AAAAAAAAAAAAAAAAIVQEgVGhlIGFtb3VudCBoZWxkIG9uIGRlcG9zaXQgcGVyIHJlZ2lzdGVyZWQgdXNlcm5hbWUuIFRoaXMgdmFsdWUgc2hvdWxkIGNoYW5nZSBvbmx5IGlu9CBydW50aW1lIHVwZ3JhZGVzIHdpdGggcHJvcGVyIG1pZ3JhdGlvbiBvZiBleGlzdGluZyBkZXBvc2l0cy5EU3ViQWNjb3VudERlcG9zaXQYQAAgSqnRAQAAAAAAAAAAAAAMZQEgVGhlIGFtb3VudCBoZWxkIG9uIGRlcG9zaXQgZm9yIGEgcmVnaXN0ZXJlZCBzdWJhY2NvdW50LiBUaGlzIHNob3VsZCBhY2NvdW50IGZvciB0aGUgZmFjdGUBIHRoYXQgb25lIHN0b3JhZ2UgaXRlbSdzIHZhbHVlIHdpbGwgaW5jcmVhc2UgYnkgdGhlIHNpemUgb2YgYW4gYWNjb3VudCBJRCwgYW5kIHRoZXJlIHdpbGw1ASBiZSBhbm90aGVyIHRyaWUgaXRlbSB3aG9zZSB2YWx1ZSBpcyB0aGUgc2l6ZSBvZiBhbiBhY2NvdW50IElEIHBsdXMgMzIgYnl0ZXMuOE1heFN1YkFjY291bnRzEBBkAAAABA0BIFRoZSBtYXhpbXVtIG51bWJlciBvZiBzdWItYWNjb3VudHMgYWxsb3dlZCBwZXIgaWRlbnRpZmllZCBhY2NvdW50LjRNYXhSZWdpc3RyYXJzEBAUAAAACE0BIE1heGltdW0gbnVtYmVyIG9mIHJlZ2lzdHJhcnMgYWxsb3dlZCBpbiB0aGUgc3lzdGVtLiBOZWVkZWQgdG8gYm91bmQgdGhlIGNvbXBsZXhpdHl8IG9mLCBlLmcuLCB1cGRhdGluZyBqdWRnZW1lbnRzLmRQZW5kaW5nVXNlcm5hbWVFeHBpcmF0aW9uEBDAiQEABBUBIFRoZSBudW1iZXIgb2YgYmxvY2tzIHdpdGhpbiB3aGljaCBhIHVzZXJuYW1lIGdyYW50IG11c3QgYmUgYWNjZXB0ZWQuTFVzZXJuYW1lR3JhY2VQZXJpb2QQEICXBgAIWQEgVGhlIG51bWJlciBvZiBibG9ja3MgdGhhdCBtdXN0IHBhc3MgdG8gZW5hYmxlIHRoZSBwZXJtYW5lbnQgZGVsZXRpb24gb2YgYSB1c2VybmFtZSBieWggaXRzIHJlc3BlY3RpdmUgYXV0aG9yaXR5LjxNYXhTdWZmaXhMZW5ndGgQEAcAAAAEgCBUaGUgbWF4aW11bSBsZW5ndGggb2YgYSBzdWZmaXguRE1heFVzZXJuYW1lTGVuZ3RoEBAgAAAABGEBIFRoZSBtYXhpbXVtIGxlbmd0aCBvZiBhIHVzZXJuYW1lLCBpbmNsdWRpbmcgaXRzIHN1ZmZpeCBhbmQgYW55IHN5c3RlbS1hZGRlZCBkZWxpbWl0ZXJzLgEFCxEAIFJlY292ZXJ5ASBSZWNvdmVyeQwsUmVjb3ZlcmFibGUAAQQFAAkLBAAECQEgVGhlIHNldCBvZiByZWNvdmVyYWJsZSBhY2NvdW50cyBhbmQgdGhlaXIgcmVjb3ZlcnkgY29uZmlndXJhdGlvbi5AQWN0aXZlUmVjb3ZlcmllcwABCAUFEQsVCwQAEGggQWN0aXZlIHJlY292ZXJ5IGF0dGVtcHRzLgAVASBGaXJzdCBhY2NvdW50IGlzIHRoZSBhY2NvdW50IHRvIGJlIHJlY292ZXJlZCwgYW5kIHRoZSBzZWNvbmQgYWNjb3VudKwgaXMgdGhlIHVzZXIgdHJ5aW5nIHRvIHJlY292ZXIgdGhlIGFjY291bnQuFFByb3h5AAEEAgAABAAMkCBUaGUgbGlzdCBvZiBhbGxvd2VkIHByb3h5IGFjY291bnRzLgD4IE1hcCBmcm9tIHRoZSB1c2VyIHdobyBjYW4gYWNjZXNzIGl0IHRvIHRoZSByZWNvdmVyZWQgYWNjb3VudC4BnQMBEQEQRENvbmZpZ0RlcG9zaXRCYXNlGEAAUDknjAQAAAAAAAAAAAAAEFUBIFRoZSBiYXNlIGFtb3VudCBvZiBjdXJyZW5jeSBuZWVkZWQgdG8gcmVzZXJ2ZSBmb3IgY3JlYXRpbmcgYSByZWNvdmVyeSBjb25maWd1cmF0aW9uLgABASBUaGlzIGlzIGhlbGQgZm9yIGFuIGFkZGl0aW9uYWwgc3RvcmFnZSBpdGVtIHdob3NlIHZhbHVlIHNpemUgaXOoIGAyICsgc2l6ZW9mKEJsb2NrTnVtYmVyLCBCYWxhbmNlKWAgYnl0ZXMuTEZyaWVuZERlcG9zaXRGYWN0b3IYQACIUmp0AAAAAAAAAAAAAAAULQEgVGhlIGFtb3VudCBvZiBjdXJyZW5jeSBuZWVkZWQgcGVyIGFkZGl0aW9uYWwgdXNlciB3aGVuIGNyZWF0aW5nIGEgcmVjb3Zlcnk8IGNvbmZpZ3VyYXRpb24uAE0BIFRoaXMgaXMgaGVsZCBmb3IgYWRkaW5nIGBzaXplb2YoQWNjb3VudElkKWAgYnl0ZXMgbW9yZSBpbnRvIGEgcHJlLWV4aXN0aW5nIHN0b3JhZ2UcIHZhbHVlLihNYXhGcmllbmRzEBAJAAAAGA0BIFRoZSBtYXhpbXVtIGFtb3VudCBvZiBmcmllbmRzIGFsbG93ZWQgaW4gYSByZWNvdmVyeSBjb25maWd1cmF0aW9uLgANASBOT1RFOiBUaGUgdGhyZXNob2xkIHByb2dyYW1tZWQgaW4gdGhpcyBQYWxsZXQgdXNlcyB1MTYsIHNvIGl0IGRvZXMJASBub3QgcmVhbGx5IG1ha2Ugc2Vuc2UgdG8gaGF2ZSBhIGxpbWl0IGhlcmUgZ3JlYXRlciB0aGFuIHUxNjo6TUFYLhUBIEJ1dCBhbHNvLCB0aGF0IGlzIGEgbG90IG1vcmUgdGhhbiB5b3Ugc2hvdWxkIHByb2JhYmx5IHNldCB0aGlzIHZhbHVlNCB0byBhbnl3YXkuLi48UmVjb3ZlcnlEZXBvc2l0GEAAUDknjAQAAAAAAAAAAAAAHB0BIFRoZSBiYXNlIGFtb3VudCBvZiBjdXJyZW5jeSBuZWVkZWQgdG8gcmVzZXJ2ZSBmb3Igc3RhcnRpbmcgYSByZWNvdmVyeS4ANQEgVGhpcyBpcyBwcmltYXJpbHkgaGVsZCBmb3IgZGV0ZXJyaW5nIG1hbGljaW91cyByZWNvdmVyeSBhdHRlbXB0cywgYW5kIHNob3VsZCkBIGhhdmUgYSB2YWx1ZSBsYXJnZSBlbm91Z2ggdGhhdCBhIGJhZCBhY3RvciB3b3VsZCBjaG9vc2Ugbm90IHRvIHBsYWNlIHRoaXMpASBkZXBvc2l0LiBJdCBhbHNvIGFjdHMgdG8gZnVuZCBhZGRpdGlvbmFsIHN0b3JhZ2UgaXRlbSB3aG9zZSB2YWx1ZSBzaXplIGlzQQEgYHNpemVvZihCbG9ja051bWJlciwgQmFsYW5jZSArIFQgKiBBY2NvdW50SWQpYCBieXRlcy4gV2hlcmUgVCBpcyBhIGNvbmZpZ3VyYWJsZSwgdGhyZXNob2xkLgEZCxIAHFZlc3RpbmcBHFZlc3RpbmcIHFZlc3RpbmcAAQQCAB0LBAAE2CBJbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhlIHZlc3Rpbmcgb2YgYSBnaXZlbiBhY2NvdW50LjhTdG9yYWdlVmVyc2lvbgEAJQsEAAx8IFN0b3JhZ2UgdmVyc2lvbiBvZiB0aGUgcGFsbGV0LgAxASBOZXcgbmV0d29ya3Mgc3RhcnQgd2l0aCBsYXRlc3QgdmVyc2lvbiwgYXMgZGV0ZXJtaW5lZCBieSB0aGUgZ2VuZXNpcyBidWlsZC4BpQMBHQEIRE1pblZlc3RlZFRyYW5zZmVyGEAAEKXU6AAAAAAAAAAAAAAABOggVGhlIG1pbmltdW0gYW1vdW50IHRyYW5zZmVycmVkIHRvIGNhbGwgYHZlc3RlZF90cmFuc2ZlcmAuTE1heFZlc3RpbmdTY2hlZHVsZXMQEBwAAAAAASkLEwAkU2NoZWR1bGVyASRTY2hlZHVsZXIQPEluY29tcGxldGVTaW5jZQAAEAQABPQgQmxvY2sgbnVtYmVyIGF0IHdoaWNoIHRoZSBhZ2VuZGEgYmVnYW4gaW5jb21wbGV0ZSBleGVjdXRpb24uGEFnZW5kYQEBBAUQLQsEAARNASBJdGVtcyB0byBiZSBleGVjdXRlZCwgaW5kZXhlZCBieSB0aGUgYmxvY2sgbnVtYmVyIHRoYXQgdGhleSBzaG91bGQgYmUgZXhlY3V0ZWQgb24uHFJldHJpZXMAAQQCJQE9CwQABCEBIFJldHJ5IGNvbmZpZ3VyYXRpb25zIGZvciBpdGVtcyB0byBiZSBleGVjdXRlZCwgaW5kZXhlZCBieSB0YXNrIGFkZHJlc3MuGExvb2t1cAABBAUEJQEEABD4IExvb2t1cCBmcm9tIGEgbmFtZSB0byB0aGUgYmxvY2sgbnVtYmVyIGFuZCBpbmRleCBvZiB0aGUgdGFzay4AWQEgRm9yIHYzIC0+IHY0IHRoZSBwcmV2aW91c2x5IHVuYm91bmRlZCBpZGVudGl0aWVzIGFyZSBCbGFrZTItMjU2IGhhc2hlZCB0byBmb3JtIHRoZSB2NDAgaWRlbnRpdGllcy4BrQMBIQEINE1heGltdW1XZWlnaHQoQAsAgG6HdAETzMzMzMzMzMwEKQEgVGhlIG1heGltdW0gd2VpZ2h0IHRoYXQgbWF5IGJlIHNjaGVkdWxlZCBwZXIgYmxvY2sgZm9yIGFueSBkaXNwYXRjaGFibGVzLlBNYXhTY2hlZHVsZWRQZXJCbG9jaxAQMgAAABQdASBUaGUgbWF4aW11bSBudW1iZXIgb2Ygc2NoZWR1bGVkIGNhbGxzIGluIHRoZSBxdWV1ZSBmb3IgYSBzaW5nbGUgYmxvY2suABggTk9URTpRASArIERlcGVuZGVudCBwYWxsZXRzJyBiZW5jaG1hcmtzIG1pZ2h0IHJlcXVpcmUgYSBoaWdoZXIgbGltaXQgZm9yIHRoZSBzZXR0aW5nLiBTZXQgYcQgaGlnaGVyIGxpbWl0IHVuZGVyIGBydW50aW1lLWJlbmNobWFya3NgIGZlYXR1cmUuAUELFAAgUHJlaW1hZ2UBIFByZWltYWdlDCRTdGF0dXNGb3IAAQQGNEULBAAEkCBUaGUgcmVxdWVzdCBzdGF0dXMgb2YgYSBnaXZlbiBoYXNoLkBSZXF1ZXN0U3RhdHVzRm9yAAEEBjRNCwQABJAgVGhlIHJlcXVlc3Qgc3RhdHVzIG9mIGEgZ2l2ZW4gaGFzaC4sUHJlaW1hZ2VGb3IAAQQGiQpdCwQAAAG1AwEtAQABYQscABBTdWRvARBTdWRvBAxLZXkAAAAEAASEIFRoZSBgQWNjb3VudElkYCBvZiB0aGUgc3VkbyBrZXkuAb0DATEBAAFlCxUAFFByb3h5ARRQcm94eQgcUHJveGllcwEBBAUAaQtEAAAAAAAAAAAAAAAAAAAAAAAIRQEgVGhlIHNldCBvZiBhY2NvdW50IHByb3hpZXMuIE1hcHMgdGhlIGFjY291bnQgd2hpY2ggaGFzIGRlbGVnYXRlZCB0byB0aGUgYWNjb3VudHMhASB3aGljaCBhcmUgYmVpbmcgZGVsZWdhdGVkIHRvLCB0b2dldGhlciB3aXRoIHRoZSBhbW91bnQgaGVsZCBvbiBkZXBvc2l0LjRBbm5vdW5jZW1lbnRzAQEEBQB5C0QAAAAAAAAAAAAAAAAAAAAAAASsIFRoZSBhbm5vdW5jZW1lbnRzIG1hZGUgYnkgdGhlIHByb3h5IChrZXkpLgHBAwE5ARhAUHJveHlEZXBvc2l0QmFzZRhAAJR87OgAAAAAAAAAAAAAABARASBUaGUgYmFzZSBhbW91bnQgb2YgY3VycmVuY3kgbmVlZGVkIHRvIHJlc2VydmUgZm9yIGNyZWF0aW5nIGEgcHJveHkuAAEBIFRoaXMgaXMgaGVsZCBmb3IgYW4gYWRkaXRpb25hbCBzdG9yYWdlIGl0ZW0gd2hvc2UgdmFsdWUgc2l6ZSBpcyUBIGBzaXplb2YoQmFsYW5jZSlgIGJ5dGVzIGFuZCB3aG9zZSBrZXkgc2l6ZSBpcyBgc2l6ZW9mKEFjY291bnRJZClgIGJ5dGVzLkhQcm94eURlcG9zaXRGYWN0b3IYQIAAWWIAAAAAAAAAAAAAAAAUvCBUaGUgYW1vdW50IG9mIGN1cnJlbmN5IG5lZWRlZCBwZXIgcHJveHkgYWRkZWQuADUBIFRoaXMgaXMgaGVsZCBmb3IgYWRkaW5nIDMyIGJ5dGVzIHBsdXMgYW4gaW5zdGFuY2Ugb2YgYFByb3h5VHlwZWAgbW9yZSBpbnRvIGFhASBwcmUtZXhpc3Rpbmcgc3RvcmFnZSB2YWx1ZS4gVGh1cywgd2hlbiBjb25maWd1cmluZyBgUHJveHlEZXBvc2l0RmFjdG9yYCBvbmUgc2hvdWxkIHRha2X0IGludG8gYWNjb3VudCBgMzIgKyBwcm94eV90eXBlLmVuY29kZSgpLmxlbigpYCBieXRlcyBvZiBkYXRhLihNYXhQcm94aWVzEBAgAAAABPAgVGhlIG1heGltdW0gYW1vdW50IG9mIHByb3hpZXMgYWxsb3dlZCBmb3IgYSBzaW5nbGUgYWNjb3VudC4oTWF4UGVuZGluZxAQIAAAAARFASBUaGUgbWF4aW11bSBhbW91bnQgb2YgdGltZS1kZWxheWVkIGFubm91bmNlbWVudHMgdGhhdCBhcmUgYWxsb3dlZCB0byBiZSBwZW5kaW5nLlxBbm5vdW5jZW1lbnREZXBvc2l0QmFzZRhAAJR87OgAAAAAAAAAAAAAABAxASBUaGUgYmFzZSBhbW91bnQgb2YgY3VycmVuY3kgbmVlZGVkIHRvIHJlc2VydmUgZm9yIGNyZWF0aW5nIGFuIGFubm91bmNlbWVudC4ASQEgVGhpcyBpcyBoZWxkIHdoZW4gYSBuZXcgc3RvcmFnZSBpdGVtIGhvbGRpbmcgYSBgQmFsYW5jZWAgaXMgY3JlYXRlZCAodHlwaWNhbGx5IDE2ICBieXRlcykuZEFubm91bmNlbWVudERlcG9zaXRGYWN0b3IYQAABssQAAAAAAAAAAAAAAAAQ1CBUaGUgYW1vdW50IG9mIGN1cnJlbmN5IG5lZWRlZCBwZXIgYW5ub3VuY2VtZW50IG1hZGUuAFkBIFRoaXMgaXMgaGVsZCBmb3IgYWRkaW5nIGFuIGBBY2NvdW50SWRgLCBgSGFzaGAgYW5kIGBCbG9ja051bWJlcmAgKHR5cGljYWxseSA2OCBieXRlcymMIGludG8gYSBwcmUtZXhpc3Rpbmcgc3RvcmFnZSB2YWx1ZS4BiQsWACBNdWx0aXNpZwEgTXVsdGlzaWcEJE11bHRpc2lncwABCAUCjQuRCwQABJQgVGhlIHNldCBvZiBvcGVuIG11bHRpc2lnIG9wZXJhdGlvbnMuAckDAUkBDCxEZXBvc2l0QmFzZRhAALzn2ukAAAAAAAAAAAAAABhZASBUaGUgYmFzZSBhbW91bnQgb2YgY3VycmVuY3kgbmVlZGVkIHRvIHJlc2VydmUgZm9yIGNyZWF0aW5nIGEgbXVsdGlzaWcgZXhlY3V0aW9uIG9yIHRvhCBzdG9yZSBhIGRpc3BhdGNoIGNhbGwgZm9yIGxhdGVyLgABASBUaGlzIGlzIGhlbGQgZm9yIGFuIGFkZGl0aW9uYWwgc3RvcmFnZSBpdGVtIHdob3NlIHZhbHVlIHNpemUgaXMxASBgNCArIHNpemVvZigoQmxvY2tOdW1iZXIsIEJhbGFuY2UsIEFjY291bnRJZCkpYCBieXRlcyBhbmQgd2hvc2Uga2V5IHNpemUgaXOAIGAzMiArIHNpemVvZihBY2NvdW50SWQpYCBieXRlcy40RGVwb3NpdEZhY3RvchhAABBeXwAAAAAAAAAAAAAAAAxVASBUaGUgYW1vdW50IG9mIGN1cnJlbmN5IG5lZWRlZCBwZXIgdW5pdCB0aHJlc2hvbGQgd2hlbiBjcmVhdGluZyBhIG11bHRpc2lnIGV4ZWN1dGlvbi4AJQEgVGhpcyBpcyBoZWxkIGZvciBhZGRpbmcgMzIgYnl0ZXMgbW9yZSBpbnRvIGEgcHJlLWV4aXN0aW5nIHN0b3JhZ2UgdmFsdWUuOE1heFNpZ25hdG9yaWVzEBBkAAAABOwgVGhlIG1heGltdW0gYW1vdW50IG9mIHNpZ25hdG9yaWVzIGFsbG93ZWQgaW4gdGhlIG11bHRpc2lnLgGZCxcAaEVsZWN0aW9uUHJvdmlkZXJNdWx0aVBoYXNlAWhFbGVjdGlvblByb3ZpZGVyTXVsdGlQaGFzZSgUUm91bmQBABAQAQAAABisIEludGVybmFsIGNvdW50ZXIgZm9yIHRoZSBudW1iZXIgb2Ygcm91bmRzLgBVASBUaGlzIGlzIHVzZWZ1bCBmb3IgZGUtZHVwbGljYXRpb24gb2YgdHJhbnNhY3Rpb25zIHN1Ym1pdHRlZCB0byB0aGUgcG9vbCwgYW5kIGdlbmVyYWxsIGRpYWdub3N0aWNzIG9mIHRoZSBwYWxsZXQuAE0BIFRoaXMgaXMgbWVyZWx5IGluY3JlbWVudGVkIG9uY2UgcGVyIGV2ZXJ5IHRpbWUgdGhhdCBhbiB1cHN0cmVhbSBgZWxlY3RgIGlzIGNhbGxlZC4wQ3VycmVudFBoYXNlAQBdAQQABDwgQ3VycmVudCBwaGFzZS44UXVldWVkU29sdXRpb24AAJ0LBAAMPQEgQ3VycmVudCBiZXN0IHNvbHV0aW9uLCBzaWduZWQgb3IgdW5zaWduZWQsIHF1ZXVlZCB0byBiZSByZXR1cm5lZCB1cG9uIGBlbGVjdGAuAGAgQWx3YXlzIHNvcnRlZCBieSBzY29yZS4gU25hcHNob3QAALkLBAAQcCBTbmFwc2hvdCBkYXRhIG9mIHRoZSByb3VuZC4AXQEgVGhpcyBpcyBjcmVhdGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHNpZ25lZCBwaGFzZSBhbmQgY2xlYXJlZCB1cG9uIGNhbGxpbmcgYGVsZWN0YC4pASBOb3RlOiBUaGlzIHN0b3JhZ2UgdHlwZSBtdXN0IG9ubHkgYmUgbXV0YXRlZCB0aHJvdWdoIFtgU25hcHNob3RXcmFwcGVyYF0uOERlc2lyZWRUYXJnZXRzAAAQBAAQzCBEZXNpcmVkIG51bWJlciBvZiB0YXJnZXRzIHRvIGVsZWN0IGZvciB0aGlzIHJvdW5kLgCoIE9ubHkgZXhpc3RzIHdoZW4gW2BTbmFwc2hvdGBdIGlzIHByZXNlbnQuKQEgTm90ZTogVGhpcyBzdG9yYWdlIHR5cGUgbXVzdCBvbmx5IGJlIG11dGF0ZWQgdGhyb3VnaCBbYFNuYXBzaG90V3JhcHBlcmBdLkBTbmFwc2hvdE1ldGFkYXRhAAClBAQAEJggVGhlIG1ldGFkYXRhIG9mIHRoZSBbYFJvdW5kU25hcHNob3RgXQCoIE9ubHkgZXhpc3RzIHdoZW4gW2BTbmFwc2hvdGBdIGlzIHByZXNlbnQuKQEgTm90ZTogVGhpcyBzdG9yYWdlIHR5cGUgbXVzdCBvbmx5IGJlIG11dGF0ZWQgdGhyb3VnaCBbYFNuYXBzaG90V3JhcHBlcmBdLmRTaWduZWRTdWJtaXNzaW9uTmV4dEluZGV4AQAQEAAAAAAkAQEgVGhlIG5leHQgaW5kZXggdG8gYmUgYXNzaWduZWQgdG8gYW4gaW5jb21pbmcgc2lnbmVkIHN1Ym1pc3Npb24uAHUBIEV2ZXJ5IGFjY2VwdGVkIHN1Ym1pc3Npb24gaXMgYXNzaWduZWQgYSB1bmlxdWUgaW5kZXg7IHRoYXQgaW5kZXggaXMgYm91bmQgdG8gdGhhdCBwYXJ0aWN1bGFyZQEgc3VibWlzc2lvbiBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSBlbGVjdGlvbi4gT24gZWxlY3Rpb24gZmluYWxpemF0aW9uLCB0aGUgbmV4dCBpbmRleCBpczAgcmVzZXQgdG8gMC4AaQEgV2UgY2FuJ3QganVzdCB1c2UgYFNpZ25lZFN1Ym1pc3Npb25JbmRpY2VzLmxlbigpYCwgYmVjYXVzZSB0aGF0J3MgYSBib3VuZGVkIHNldDsgcGFzdCBpdHNZASBjYXBhY2l0eSwgaXQgd2lsbCBzaW1wbHkgc2F0dXJhdGUuIFdlIGNhbid0IGp1c3QgaXRlcmF0ZSBvdmVyIGBTaWduZWRTdWJtaXNzaW9uc01hcGAs9CBiZWNhdXNlIGl0ZXJhdGlvbiBpcyBzbG93LiBJbnN0ZWFkLCB3ZSBzdG9yZSB0aGUgdmFsdWUgaGVyZS5cU2lnbmVkU3VibWlzc2lvbkluZGljZXMBAMULBAAYbQEgQSBzb3J0ZWQsIGJvdW5kZWQgdmVjdG9yIG9mIGAoc2NvcmUsIGJsb2NrX251bWJlciwgaW5kZXgpYCwgd2hlcmUgZWFjaCBgaW5kZXhgIHBvaW50cyB0byBheCB2YWx1ZSBpbiBgU2lnbmVkU3VibWlzc2lvbnNgLgBxASBXZSBuZXZlciBuZWVkIHRvIHByb2Nlc3MgbW9yZSB0aGFuIGEgc2luZ2xlIHNpZ25lZCBzdWJtaXNzaW9uIGF0IGEgdGltZS4gU2lnbmVkIHN1Ym1pc3Npb25zdQEgY2FuIGJlIHF1aXRlIGxhcmdlLCBzbyB3ZSdyZSB3aWxsaW5nIHRvIHBheSB0aGUgY29zdCBvZiBtdWx0aXBsZSBkYXRhYmFzZSBhY2Nlc3NlcyB0byBhY2Nlc3MhASB0aGVtIG9uZSBhdCBhIHRpbWUgaW5zdGVhZCBvZiByZWFkaW5nIGFuZCBkZWNvZGluZyBhbGwgb2YgdGhlbSBhdCBvbmNlLlBTaWduZWRTdWJtaXNzaW9uc01hcAABBAUQ0QsEABx0IFVuY2hlY2tlZCwgc2lnbmVkIHNvbHV0aW9ucy4AaQEgVG9nZXRoZXIgd2l0aCBgU3VibWlzc2lvbkluZGljZXNgLCB0aGlzIHN0b3JlcyBhIGJvdW5kZWQgc2V0IG9mIGBTaWduZWRTdWJtaXNzaW9uc2Agd2hpbGXsIGFsbG93aW5nIHVzIHRvIGtlZXAgb25seSBhIHNpbmdsZSBvbmUgaW4gbWVtb3J5IGF0IGEgdGltZS4AaQEgVHdveCBub3RlOiB0aGUga2V5IG9mIHRoZSBtYXAgaXMgYW4gYXV0by1pbmNyZW1lbnRpbmcgaW5kZXggd2hpY2ggdXNlcnMgY2Fubm90IGluc3BlY3Qgb3L0IGFmZmVjdDsgd2Ugc2hvdWxkbid0IG5lZWQgYSBjcnlwdG9ncmFwaGljYWxseSBzZWN1cmUgaGFzaGVyLlRNaW5pbXVtVW50cnVzdGVkU2NvcmUAAFkBBAAQXQEgVGhlIG1pbmltdW0gc2NvcmUgdGhhdCBlYWNoICd1bnRydXN0ZWQnIHNvbHV0aW9uIG11c3QgYXR0YWluIGluIG9yZGVyIHRvIGJlIGNvbnNpZGVyZWQoIGZlYXNpYmxlLgC4IENhbiBiZSBzZXQgdmlhIGBzZXRfbWluaW11bV91bnRydXN0ZWRfc2NvcmVgLgHRAwFRATxUQmV0dGVyU2lnbmVkVGhyZXNob2xkmBAAAAAACE0BIFRoZSBtaW5pbXVtIGFtb3VudCBvZiBpbXByb3ZlbWVudCB0byB0aGUgc29sdXRpb24gc2NvcmUgdGhhdCBkZWZpbmVzIGEgc29sdXRpb24gYXN4ICJiZXR0ZXIiIGluIHRoZSBTaWduZWQgcGhhc2UuOE9mZmNoYWluUmVwZWF0EBAlAAAAELQgVGhlIHJlcGVhdCB0aHJlc2hvbGQgb2YgdGhlIG9mZmNoYWluIHdvcmtlci4AYQEgRm9yIGV4YW1wbGUsIGlmIGl0IGlzIDUsIHRoYXQgbWVhbnMgdGhhdCBhdCBsZWFzdCA1IGJsb2NrcyB3aWxsIGVsYXBzZSBiZXR3ZWVuIGF0dGVtcHRzhCB0byBzdWJtaXQgdGhlIHdvcmtlcidzIHNvbHV0aW9uLjxNaW5lclR4UHJpb3JpdHkwIP////////9/BCUBIFRoZSBwcmlvcml0eSBvZiB0aGUgdW5zaWduZWQgdHJhbnNhY3Rpb24gc3VibWl0dGVkIGluIHRoZSB1bnNpZ25lZC1waGFzZVBTaWduZWRNYXhTdWJtaXNzaW9ucxAQgAAAABzkIE1heGltdW0gbnVtYmVyIG9mIHNpZ25lZCBzdWJtaXNzaW9ucyB0aGF0IGNhbiBiZSBxdWV1ZWQuAFUBIEl0IGlzIGJlc3QgdG8gYXZvaWQgYWRqdXN0aW5nIHRoaXMgZHVyaW5nIGFuIGVsZWN0aW9uLCBhcyBpdCBpbXBhY3RzIGRvd25zdHJlYW0gZGF0YWUBIHN0cnVjdHVyZXMuIEluIHBhcnRpY3VsYXIsIGBTaWduZWRTdWJtaXNzaW9uSW5kaWNlczxUPmAgaXMgYm91bmRlZCBvbiB0aGlzIHZhbHVlLiBJZiB5b3X0IHVwZGF0ZSB0aGlzIHZhbHVlIGR1cmluZyBhbiBlbGVjdGlvbiwgeW91IF9tdXN0XyBlbnN1cmUgdGhhdE0BIGBTaWduZWRTdWJtaXNzaW9uSW5kaWNlcy5sZW4oKWAgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBuZXcgdmFsdWUuIE90aGVyd2lzZSzwIGF0dGVtcHRzIHRvIHN1Ym1pdCBuZXcgc29sdXRpb25zIG1heSBjYXVzZSBhIHJ1bnRpbWUgcGFuaWMuPFNpZ25lZE1heFdlaWdodChAC2CMkHRYAROjcD0K16NwvRSUIE1heGltdW0gd2VpZ2h0IG9mIGEgc2lnbmVkIHNvbHV0aW9uLgBdASBJZiBbYENvbmZpZzo6TWluZXJDb25maWdgXSBpcyBiZWluZyBpbXBsZW1lbnRlZCB0byBzdWJtaXQgc2lnbmVkIHNvbHV0aW9ucyAob3V0c2lkZSBvZj0BIHRoaXMgcGFsbGV0KSwgdGhlbiBbYE1pbmVyQ29uZmlnOjpzb2x1dGlvbl93ZWlnaHRgXSBpcyB1c2VkIHRvIGNvbXBhcmUgYWdhaW5zdDAgdGhpcyB2YWx1ZS5AU2lnbmVkTWF4UmVmdW5kcxAQIAAAAAQZASBUaGUgbWF4aW11bSBhbW91bnQgb2YgdW5jaGVja2VkIHNvbHV0aW9ucyB0byByZWZ1bmQgdGhlIGNhbGwgZmVlIGZvci5AU2lnbmVkUmV3YXJkQmFzZRhAABCl1OgAAAAAAAAAAAAAAASIIEJhc2UgcmV3YXJkIGZvciBhIHNpZ25lZCBzb2x1dGlvbkRTaWduZWREZXBvc2l0Qnl0ZRhAWXMHAAAAAAAAAAAAAAAAAASgIFBlci1ieXRlIGRlcG9zaXQgZm9yIGEgc2lnbmVkIHNvbHV0aW9uLkxTaWduZWREZXBvc2l0V2VpZ2h0GEAAAAAAAAAAAAAAAAAAAAAABKggUGVyLXdlaWdodCBkZXBvc2l0IGZvciBhIHNpZ25lZCBzb2x1dGlvbi4oTWF4V2lubmVycxAQ6AMAAAzUIE1heGltdW0gbnVtYmVyIG9mIHdpbm5lcnMgdGhhdCBhbiBlbGVjdGlvbiBzdXBwb3J0cy4AUQEgTm90ZTogVGhpcyBtdXN0IGFsd2F5cyBiZSBncmVhdGVyIG9yIGVxdWFsIHRvIGBUOjpEYXRhUHJvdmlkZXI6OmRlc2lyZWRfdGFyZ2V0cygpYC5MTWF4QmFja2Vyc1Blcldpbm5lchAQ5FcAAAwxASBNYXhpbXVtIG51bWJlciBvZiB2b3RlcnMgdGhhdCBjYW4gc3VwcG9ydCBhIHdpbm5lciBpbiBhbiBlbGVjdGlvbiBzb2x1dGlvbi4A6CBUaGlzIGlzIG5lZWRlZCB0byBlbnN1cmUgZWxlY3Rpb24gY29tcHV0YXRpb24gaXMgYm91bmRlZC44TWluZXJNYXhMZW5ndGgQEAAANgAAOE1pbmVyTWF4V2VpZ2h0KEALYIyQdFgBE6NwPQrXo3C9AFRNaW5lck1heFZvdGVzUGVyVm90ZXIQEBAAAAAAPE1pbmVyTWF4V2lubmVycxAQ6AMAAAAB1QsYACRWb3Rlckxpc3QBJFZvdGVyTGlzdBQkTGlzdE5vZGVzAAEEBQDZCwQADIAgQSBzaW5nbGUgbm9kZSwgd2l0aGluIHNvbWUgYmFnLgAFASBOb2RlcyBzdG9yZSBsaW5rcyBmb3J3YXJkIGFuZCBiYWNrIHdpdGhpbiB0aGVpciByZXNwZWN0aXZlIGJhZ3MuTENvdW50ZXJGb3JMaXN0Tm9kZXMBABAQAAAAAASsQ291bnRlciBmb3IgdGhlIHJlbGF0ZWQgY291bnRlZCBzdG9yYWdlIG1hcCBMaXN0QmFncwABBAUw3QsEAAxkIEEgYmFnIHN0b3JlZCBpbiBzdG9yYWdlLgAZASBTdG9yZXMgYSBgQmFnYCBzdHJ1Y3QsIHdoaWNoIHN0b3JlcyBoZWFkIGFuZCB0YWlsIHBvaW50ZXJzIHRvIGl0c2VsZi5QTmV4dE5vZGVBdXRvUmViYWdnZWQAAAAEAAgFASBQb2ludGVyIHRoYXQgcmVtZW1iZXJzIHRoZSBuZXh0IG5vZGUgdGhhdCB3aWxsIGJlIGF1dG8tcmViYWdnZWQuAQEgV2hlbiBgTm9uZWAsIHRoZSBuZXh0IHNjYW4gd2lsbCBzdGFydCBmcm9tIHRoZSBsaXN0IGhlYWQgYWdhaW4uEExvY2sAAAUBBAAQhCBMb2NrIGFsbCB1cGRhdGVzIHRvIHRoaXMgcGFsbGV0LgA5ASBJZiBhbnkgbm9kZXMgbmVlZHMgdXBkYXRpbmcsIHJlbW92YWwgb3IgYWRkaXRpb24gZHVlIHRvIGEgdGVtcG9yYXJ5IGxvY2ssIHRoZXQgW2BDYWxsOjpyZWJhZ2BdIGNhbiBiZSB1c2VkLgHBBAFlAQg0QmFnVGhyZXNob2xkc+ELCRkhAwDkC1QCAAAA856AlwIAAACosZfiAgAAAJRJLjYDAAAAJ5w6kwMAAAADvM76AwAAAELAG24EAAAAG0d17gQAAAA4XlV9BQAAAEbcYBwGAAAAiThszQYAAAC27oCSBwAAAP5+420IAAAA6BsaYgkAAACwGfRxCgAAABA1kqALAAAAz8lv8QwAAABBFG1oDgAAAOeb2gkQAAAAzuiF2hEAAAAoqcffEwAAALtwkx8WAAAAjkCJoBgAAACBCglqGwAAADZqSIQeAAAAW9Nq+CEAAACAfJzQJQAAAMlVMBgqAAAAvWPB2y4AAABx4FcpNAAAAGiQkhA6AAAA7cTUokAAAABpk3nzRwAAAI/YDBhQAAAAS6+KKFkAAABqFqY/YwAAAAmVF3tuAAAAeMX0+3oAAABiyBHniAAAAFG/bWWYAAAABI6rpKkAAABURpjXvAAAAJHKwDbSAAAAF18YAeoAAAC9FbJ8BAEAAEM1j/chAQAAuPyEyEIBAACZZzxQZwEAAAfkTvqPAQAAs0GDPr0BAAACfy6i7wEAAJiDvLknAgAAFk1lKmYCAAC0lROsqwIAAC2Oggv5AgAAoeaYLE8DAACmFggNrwMAAMydN8cZBAAAoNWElZAEAABC5+DVFAUAAAKM1w2oBQAAD3UK70sGAADqjS5cAgcAAMPLmW7NBwAAseVxfK8IAACqK44fqwkAALXBID3DCgAAJtA9DvsLAABwx1kpVg0AAOut2ozYDgAA95fbqoYQAADP8ER2ZRIAAB8mYHF6FAAACaYRvssWAAAd++gvYBkAAJQ6PGA/HAAAiv6JxHEfAADO2WPHACMAAAOpKuT2JgAA/nLuxV8rAAA2ycxpSDAAANrjMkW/NQAABip0cNQ7AAB8lzLWmUIAAISjJGgjSgAAVxrUWYdSAADn8QJi3lsAAA24dgNEZgAArgQB3tZxAAB9nrMIuX4AAB4ESnYQjQAAOh3wZAedAADgT6/azK4AAFZ58C+VwgAAlcOqqZrYAACWfAUlHvEAABd6ZtZnDAEAKMsfHsgqAQD6KC91mEwBANV9yHQ8cgEAfcSz+yKcAQA2XN50x8oBAJ644UKz/gEADDGuVH84AgBf4QHo1XgCAGNz2n50wAIAUdGmDS4QAwDH6aRo7WgDAGHAkfe3ywMAvyeht7A5BAB7FJmUG7QEAIUj7SJhPAUAaaXUxRLUBQDsjJNN73wGAPWqkBvoOAcAjL5d2yYKCAACl4zhE/MIAPrjFENd9gkA3fEtuv4WCwAuutxvSlgMAAxVGMTyvQ0A8LtUMRVMDwBJjoZrRgcRALLBU96f9BIAJ4ovss4ZFQCyOZ+EJH0XAOGZ5wSqJRoAuhP1qzMbHQAmR4XMeGYgAIi/gD8tESQAHJgj+B0mKADMxCLUULEsAPCIggUowDEANnxtfolhNwBukynTCqY9AIy8bBMioEQAAHDzKlxkTAC0O4RpmQlVAIC0q+RQqV4AoM2pedtfaQBMwn9Mx0x1ANCsDro0k4IASD4Mzz1akQBoxo50ac2hACgeb6UrHbQAmKkjJnR/yADwmnRjTTDfAIDN/EuNcvgAkBRgLZqQFAHwtBPZRd0zASCXNZbBtFYBUNz7rq19fQHgEZi5R6qoATDH7ha7udgBIG5Ihpc5DgKg+ksdcsdJAsARcXC1EowCgIoWQ6be1QLA+COxogQoA4CvWXCidoMDwG8th/9B6QNAk3+sj5JaBACRCXEXttgEQA/fWyEgZQUAScFJRG4BBgCOvKblbK8GAFlWhoUccQeAaKo0pLdICICh4p5SuTgJAL2r6IDkQwoAKnK0IExtC4DxwBMzXLgMAKA8y9zjKA6AuGKaniDDDwDeVpPSyosRAF1/TJMjiBMAGoffNQS+FQCnzkuE7zMYAAEQ++ok8RoAgCrl0bX9HQAioTRgnWIhAEQha/DaKSUAAmHxgo9eKQBmIM+FHg0uAIQQGVJSQzMAoMGPyoQQOQAmrRSTzIU/ANDNJGYvtkYAnOGaHNq2TgBYzMIMX59XACAKdXj7iWEAMLu71uSTbABgy6fcnt14ALg7wEJbi4YAuIYjYWTFlQD48V/ck7imACBqkcDWlrkA2O/ij8CXzgBoKZv1Lvnl//////////+s0CBUaGUgbGlzdCBvZiB0aHJlc2hvbGRzIHNlcGFyYXRpbmcgdGhlIHZhcmlvdXMgYmFncy4ASQEgSWRzIGFyZSBzZXBhcmF0ZWQgaW50byB1bnNvcnRlZCBiYWdzIGFjY29yZGluZyB0byB0aGVpciBzY29yZS4gVGhpcyBzcGVjaWZpZXMgdGhlYQEgdGhyZXNob2xkcyBzZXBhcmF0aW5nIHRoZSBiYWdzLiBBbiBpZCdzIGJhZyBpcyB0aGUgbGFyZ2VzdCBiYWcgZm9yIHdoaWNoIHRoZSBpZCdzIHNjb3JluCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gaXRzIHVwcGVyIHRocmVzaG9sZC4AZQEgV2hlbiBpZHMgYXJlIGl0ZXJhdGVkLCBoaWdoZXIgYmFncyBhcmUgaXRlcmF0ZWQgY29tcGxldGVseSBiZWZvcmUgbG93ZXIgYmFncy4gVGhpcyBtZWFuc1kBIHRoYXQgaXRlcmF0aW9uIGlzIF9zZW1pLXNvcnRlZF86IGlkcyBvZiBoaWdoZXIgc2NvcmUgdGVuZCB0byBjb21lIGJlZm9yZSBpZHMgb2YgbG93ZXItASBzY29yZSwgYnV0IHBlZXIgaWRzIHdpdGhpbiBhIHBhcnRpY3VsYXIgYmFnIGFyZSBzb3J0ZWQgaW4gaW5zZXJ0aW9uIG9yZGVyLgBoICMgRXhwcmVzc2luZyB0aGUgY29uc3RhbnQATQEgVGhpcyBjb25zdGFudCBtdXN0IGJlIHNvcnRlZCBpbiBzdHJpY3RseSBpbmNyZWFzaW5nIG9yZGVyLiBEdXBsaWNhdGUgaXRlbXMgYXJlIG5vdCwgcGVybWl0dGVkLgBBASBUaGVyZSBpcyBhbiBpbXBsaWVkIHVwcGVyIGxpbWl0IG9mIGBTY29yZTo6TUFYYDsgdGhhdCB2YWx1ZSBkb2VzIG5vdCBuZWVkIHRvIGJlIQEgc3BlY2lmaWVkIHdpdGhpbiB0aGUgYmFnLiBGb3IgYW55IHR3byB0aHJlc2hvbGQgbGlzdHMsIGlmIG9uZSBlbmRzIHdpdGgxASBgU2NvcmU6Ok1BWGAsIHRoZSBvdGhlciBvbmUgZG9lcyBub3QsIGFuZCB0aGV5IGFyZSBvdGhlcndpc2UgZXF1YWwsIHRoZSB0d298IGxpc3RzIHdpbGwgYmVoYXZlIGlkZW50aWNhbGx5LgA4ICMgQ2FsY3VsYXRpb24AVQEgSXQgaXMgcmVjb21tZW5kZWQgdG8gZ2VuZXJhdGUgdGhlIHNldCBvZiB0aHJlc2hvbGRzIGluIGEgZ2VvbWV0cmljIHNlcmllcywgc3VjaCB0aGF0QQEgdGhlcmUgZXhpc3RzIHNvbWUgY29uc3RhbnQgcmF0aW8gc3VjaCB0aGF0IGB0aHJlc2hvbGRbayArIDFdID09ICh0aHJlc2hvbGRba10gKtAgY29uc3RhbnRfcmF0aW8pLm1heCh0aHJlc2hvbGRba10gKyAxKWAgZm9yIGFsbCBga2AuAFkBIFRoZSBoZWxwZXJzIGluIHRoZSBgL3V0aWxzL2ZyYW1lL2dlbmVyYXRlLWJhZ3NgIG1vZHVsZSBjYW4gc2ltcGxpZnkgdGhpcyBjYWxjdWxhdGlvbi4ALCAjIEV4YW1wbGVzAFEBIC0gSWYgYEJhZ1RocmVzaG9sZHM6OmdldCgpLmlzX2VtcHR5KClgLCB0aGVuIGFsbCBpZHMgYXJlIHB1dCBpbnRvIHRoZSBzYW1lIGJhZywgYW5ksCAgIGl0ZXJhdGlvbiBpcyBzdHJpY3RseSBpbiBpbnNlcnRpb24gb3JkZXIuYQEgLSBJZiBgQmFnVGhyZXNob2xkczo6Z2V0KCkubGVuKCkgPT0gNjRgLCBhbmQgdGhlIHRocmVzaG9sZHMgYXJlIGRldGVybWluZWQgYWNjb3JkaW5nIHRvEQEgICB0aGUgcHJvY2VkdXJlIGdpdmVuIGFib3ZlLCB0aGVuIHRoZSBjb25zdGFudCByYXRpbyBpcyBlcXVhbCB0byAyLmUBIC0gSWYgYEJhZ1RocmVzaG9sZHM6OmdldCgpLmxlbigpID09IDIwMGAsIGFuZCB0aGUgdGhyZXNob2xkcyBhcmUgZGV0ZXJtaW5lZCBhY2NvcmRpbmcgdG9ZASAgIHRoZSBwcm9jZWR1cmUgZ2l2ZW4gYWJvdmUsIHRoZW4gdGhlIGNvbnN0YW50IHJhdGlvIGlzIGFwcHJveGltYXRlbHkgZXF1YWwgdG8gMS4yNDguYQEgLSBJZiB0aGUgdGhyZXNob2xkIGxpc3QgYmVnaW5zIGBbMSwgMiwgMywgLi4uXWAsIHRoZW4gYW4gaWQgd2l0aCBzY29yZSAwIG9yIDEgd2lsbCBmYWxs8CAgIGludG8gYmFnIDAsIGFuIGlkIHdpdGggc2NvcmUgMiB3aWxsIGZhbGwgaW50byBiYWcgMSwgZXRjLgAwICMgTWlncmF0aW9uAGEBIEluIHRoZSBldmVudCB0aGF0IHRoaXMgbGlzdCBldmVyIGNoYW5nZXMsIGEgY29weSBvZiB0aGUgb2xkIGJhZ3MgbGlzdCBtdXN0IGJlIHJldGFpbmVkLl0BIFdpdGggdGhhdCBgTGlzdDo6bWlncmF0ZWAgY2FuIGJlIGNhbGxlZCwgd2hpY2ggd2lsbCBwZXJmb3JtIHRoZSBhcHByb3ByaWF0ZSBtaWdyYXRpb24uUE1heEF1dG9SZWJhZ1BlckJsb2NrEBAKAAAAEDUBIE1heGltdW0gbnVtYmVyIG9mIGFjY291bnRzIHRoYXQgbWF5IGJlIHJlLWJhZ2dlZCBhdXRvbWF0aWNhbGx5IGluIGBvbl9pZGxlYC4AUQEgQSB2YWx1ZSBvZiBgMGAgKG9idGFpbmVkIGJ5IGNvbmZpZ3VyaW5nIGB0eXBlIE1heEF1dG9SZWJhZ1BlckJsb2NrID0gKCk7YCkgZGlzYWJsZXM0IHRoZSBmZWF0dXJlLgHlCxkAPE5vbWluYXRpb25Qb29scwE8Tm9taW5hdGlvblBvb2xzVEBUb3RhbFZhbHVlTG9ja2VkAQAYQAAAAAAAAAAAAAAAAAAAAAAUjCBUaGUgc3VtIG9mIGZ1bmRzIGFjcm9zcyBhbGwgcG9vbHMuAHEBIFRoaXMgbWlnaHQgYmUgbG93ZXIgYnV0IG5ldmVyIGhpZ2hlciB0aGFuIHRoZSBzdW0gb2YgYHRvdGFsX2JhbGFuY2VgIG9mIGFsbCBbYFBvb2xNZW1iZXJzYF1ZASBiZWNhdXNlIGNhbGxpbmcgYHBvb2xfd2l0aGRyYXdfdW5ib25kZWRgIG1pZ2h0IGRlY3JlYXNlIHRoZSB0b3RhbCBzdGFrZSBvZiB0aGUgcG9vbCdzKQEgYGJvbmRlZF9hY2NvdW50YCB3aXRob3V0IGFkanVzdGluZyB0aGUgcGFsbGV0LWludGVybmFsIGBVbmJvbmRpbmdQb29sYCdzLixNaW5Kb2luQm9uZAEAGEAAAAAAAAAAAAAAAAAAAAAABJwgTWluaW11bSBhbW91bnQgdG8gYm9uZCB0byBqb2luIGEgcG9vbC40TWluQ3JlYXRlQm9uZAEAGEAAAAAAAAAAAAAAAAAAAAAAHKAgTWluaW11bSBib25kIHJlcXVpcmVkIHRvIGNyZWF0ZSBhIHBvb2wuAGUBIFRoaXMgaXMgdGhlIGFtb3VudCB0aGF0IHRoZSBkZXBvc2l0b3IgbXVzdCBwdXQgYXMgdGhlaXIgaW5pdGlhbCBzdGFrZSBpbiB0aGUgcG9vbCwgYXMgYW6IIGluZGljYXRpb24gb2YgInNraW4gaW4gdGhlIGdhbWUiLgBpASBUaGlzIGlzIHRoZSB2YWx1ZSB0aGF0IHdpbGwgYWx3YXlzIGV4aXN0IGluIHRoZSBzdGFraW5nIGxlZGdlciBvZiB0aGUgcG9vbCBib25kZWQgYWNjb3VudIAgd2hpbGUgYWxsIG90aGVyIGFjY291bnRzIGxlYXZlLiBNYXhQb29scwAAEAQACGkBIE1heGltdW0gbnVtYmVyIG9mIG5vbWluYXRpb24gcG9vbHMgdGhhdCBjYW4gZXhpc3QuIElmIGBOb25lYCwgdGhlbiBhbiB1bmJvdW5kZWQgbnVtYmVyIG9mRCBwb29scyBjYW4gZXhpc3QuOE1heFBvb2xNZW1iZXJzAAAQBAAISQEgTWF4aW11bSBudW1iZXIgb2YgbWVtYmVycyB0aGF0IGNhbiBleGlzdCBpbiB0aGUgc3lzdGVtLiBJZiBgTm9uZWAsIHRoZW4gdGhlIGNvdW50uCBtZW1iZXJzIGFyZSBub3QgYm91bmQgb24gYSBzeXN0ZW0gd2lkZSBiYXNpcy5UTWF4UG9vbE1lbWJlcnNQZXJQb29sAAAQBAAIQQEgTWF4aW11bSBudW1iZXIgb2YgbWVtYmVycyB0aGF0IG1heSBiZWxvbmcgdG8gcG9vbC4gSWYgYE5vbmVgLCB0aGVuIHRoZSBjb3VudCBvZqggbWVtYmVycyBpcyBub3QgYm91bmQgb24gYSBwZXIgcG9vbCBiYXNpcy5MR2xvYmFsTWF4Q29tbWlzc2lvbgAAmAQADGkBIFRoZSBtYXhpbXVtIGNvbW1pc3Npb24gdGhhdCBjYW4gYmUgY2hhcmdlZCBieSBhIHBvb2wuIFVzZWQgb24gY29tbWlzc2lvbiBwYXlvdXRzIHRvIGJvdW5kJQEgcG9vbCBjb21taXNzaW9ucyB0aGF0IGFyZSA+IGBHbG9iYWxNYXhDb21taXNzaW9uYCwgbmVjZXNzYXJ5IGlmIGEgZnV0dXJlDQEgYEdsb2JhbE1heENvbW1pc3Npb25gIGlzIGxvd2VyIHRoYW4gc29tZSBjdXJyZW50IHBvb2wgY29tbWlzc2lvbnMuLFBvb2xNZW1iZXJzAAEEBQDtCwQADEAgQWN0aXZlIG1lbWJlcnMuANAgVFdPWC1OT1RFOiBTQUZFIHNpbmNlIGBBY2NvdW50SWRgIGlzIGEgc2VjdXJlIGhhc2guVENvdW50ZXJGb3JQb29sTWVtYmVycwEAEBAAAAAABKxDb3VudGVyIGZvciB0aGUgcmVsYXRlZCBjb3VudGVkIHN0b3JhZ2UgbWFwLEJvbmRlZFBvb2xzAAEEBRABDAQABGggU3RvcmFnZSBmb3IgYm9uZGVkIHBvb2xzLlRDb3VudGVyRm9yQm9uZGVkUG9vbHMBABAQAAAAAASsQ291bnRlciBmb3IgdGhlIHJlbGF0ZWQgY291bnRlZCBzdG9yYWdlIG1hcCxSZXdhcmRQb29scwABBAUQEQwEAAh1ASBSZXdhcmQgcG9vbHMuIFRoaXMgaXMgd2hlcmUgdGhlcmUgcmV3YXJkcyBmb3IgZWFjaCBwb29sIGFjY3VtdWxhdGUuIFdoZW4gYSBtZW1iZXJzIHBheW91dCBpc1kBIGNsYWltZWQsIHRoZSBiYWxhbmNlIGNvbWVzIG91dCBvZiB0aGUgcmV3YXJkIHBvb2wuIEtleWVkIGJ5IHRoZSBib25kZWQgcG9vbHMgYWNjb3VudC5UQ291bnRlckZvclJld2FyZFBvb2xzAQAQEAAAAAAErENvdW50ZXIgZm9yIHRoZSByZWxhdGVkIGNvdW50ZWQgc3RvcmFnZSBtYXA8U3ViUG9vbHNTdG9yYWdlAAEEBRAVDAQACBkBIEdyb3VwcyBvZiB1bmJvbmRpbmcgcG9vbHMuIEVhY2ggZ3JvdXAgb2YgdW5ib25kaW5nIHBvb2xzIGJlbG9uZ3MgdG8gYSkBIGJvbmRlZCBwb29sLCBoZW5jZSB0aGUgbmFtZSBzdWItcG9vbHMuIEtleWVkIGJ5IHRoZSBib25kZWQgcG9vbHMgYWNjb3VudC5kQ291bnRlckZvclN1YlBvb2xzU3RvcmFnZQEAEBAAAAAABKxDb3VudGVyIGZvciB0aGUgcmVsYXRlZCBjb3VudGVkIHN0b3JhZ2UgbWFwIE1ldGFkYXRhAQEEBRDRBwQABFwgTWV0YWRhdGEgZm9yIHRoZSBwb29sLkhDb3VudGVyRm9yTWV0YWRhdGEBABAQAAAAAASsQ291bnRlciBmb3IgdGhlIHJlbGF0ZWQgY291bnRlZCBzdG9yYWdlIG1hcChMYXN0UG9vbElkAQAQEAAAAAAE0CBFdmVyIGluY3JlYXNpbmcgbnVtYmVyIG9mIGFsbCBwb29scyBjcmVhdGVkIHNvIGZhci5MUmV2ZXJzZVBvb2xJZExvb2t1cAABBAUAEAQAENwgQSByZXZlcnNlIGxvb2t1cCBmcm9tIHRoZSBwb29sJ3MgYWNjb3VudCBpZCB0byBpdHMgaWQuAHUBIFRoaXMgaXMgb25seSB1c2VkIGZvciBzbGFzaGluZyBhbmQgb24gYXV0b21hdGljIHdpdGhkcmF3IHVwZGF0ZS4gSW4gYWxsIG90aGVyIGluc3RhbmNlcywgdGhlJQEgcG9vbCBpZCBpcyB1c2VkLCBhbmQgdGhlIGFjY291bnRzIGFyZSBkZXRlcm1pbmlzdGljYWxseSBkZXJpdmVkIGZyb20gaXQudENvdW50ZXJGb3JSZXZlcnNlUG9vbElkTG9va3VwAQAQEAAAAAAErENvdW50ZXIgZm9yIHRoZSByZWxhdGVkIGNvdW50ZWQgc3RvcmFnZSBtYXBAQ2xhaW1QZXJtaXNzaW9ucwEBBAUAhQEEAgQBASBNYXAgZnJvbSBhIHBvb2wgbWVtYmVyIGFjY291bnQgdG8gdGhlaXIgb3B0ZWQgY2xhaW0gcGVybWlzc2lvbi4BxQQBaQEMIFBhbGxldElkLQwgcHkvbm9wbHMEhCBUaGUgbm9taW5hdGlvbiBwb29sJ3MgcGFsbGV0IGlkLkhNYXhQb2ludHNUb0JhbGFuY2UIBAowHQEgVGhlIG1heGltdW0gcG9vbCBwb2ludHMtdG8tYmFsYW5jZSByYXRpbyB0aGF0IGFuIGBvcGVuYCBwb29sIGNhbiBoYXZlLgBVASBUaGlzIGlzIGltcG9ydGFudCBpbiB0aGUgZXZlbnQgc2xhc2hpbmcgdGFrZXMgcGxhY2UgYW5kIHRoZSBwb29sJ3MgcG9pbnRzLXRvLWJhbGFuY2V8IHJhdGlvIGJlY29tZXMgZGlzcHJvcG9ydGlvbmFsLgBlASBNb3Jlb3ZlciwgdGhpcyByZWxhdGVzIHRvIHRoZSBgUmV3YXJkQ291bnRlcmAgdHlwZSBhcyB3ZWxsLCBhcyB0aGUgYXJpdGhtZXRpYyBvcGVyYXRpb25zVQEgYXJlIGEgZnVuY3Rpb24gb2YgbnVtYmVyIG9mIHBvaW50cywgYW5kIGJ5IHNldHRpbmcgdGhpcyB2YWx1ZSB0byBlLmcuIDEwLCB5b3UgZW5zdXJlZQEgdGhhdCB0aGUgdG90YWwgbnVtYmVyIG9mIHBvaW50cyBpbiB0aGUgc3lzdGVtIGFyZSBhdCBtb3N0IDEwIHRpbWVzIHRoZSB0b3RhbF9pc3N1YW5jZSBvZpwgdGhlIGNoYWluLCBpbiB0aGUgYWJzb2x1dGUgd29yc2UgY2FzZS4ASQEgRm9yIGEgdmFsdWUgb2YgMTAsIHRoZSB0aHJlc2hvbGQgd291bGQgYmUgYSBwb29sIHBvaW50cy10by1iYWxhbmNlIHJhdGlvIG9mIDEwOjEuMQEgU3VjaCBhIHNjZW5hcmlvIHdvdWxkIGFsc28gYmUgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIHBvb2wgYmVpbmcgOTAlIHNsYXNoZWQuME1heFVuYm9uZGluZxAQIAAAAAQ9ASBUaGUgbWF4aW11bSBudW1iZXIgb2Ygc2ltdWx0YW5lb3VzIHVuYm9uZGluZyBjaHVua3MgdGhhdCBjYW4gZXhpc3QgcGVyIG1lbWJlci4BMQwdACxGYXN0VW5zdGFrZQEsRmFzdFVuc3Rha2UQEEhlYWQAADkMBAAMwCBUaGUgY3VycmVudCAiaGVhZCBvZiB0aGUgcXVldWUiIGJlaW5nIHVuc3Rha2VkLgApASBUaGUgaGVhZCBpbiBpdHNlbGYgY2FuIGJlIGEgYmF0Y2ggb2YgdXAgdG8gW2BDb25maWc6OkJhdGNoU2l6ZWBdIHN0YWtlcnMuFFF1ZXVlAAEEBQAYBAAMwCBUaGUgbWFwIG9mIGFsbCBhY2NvdW50cyB3aXNoaW5nIHRvIGJlIHVuc3Rha2VkLgA5ASBLZWVwcyB0cmFjayBvZiBgQWNjb3VudElkYCB3aXNoaW5nIHRvIHVuc3Rha2UgYW5kIGl0J3MgY29ycmVzcG9uZGluZyBkZXBvc2l0LjxDb3VudGVyRm9yUXVldWUBABAQAAAAAASsQ291bnRlciBmb3IgdGhlIHJlbGF0ZWQgY291bnRlZCBzdG9yYWdlIG1hcExFcmFzVG9DaGVja1BlckJsb2NrAQAQEAAAAAAgjCBOdW1iZXIgb2YgZXJhcyB0byBjaGVjayBwZXIgYmxvY2suADUBIElmIHNldCB0byAwLCB0aGlzIHBhbGxldCBkb2VzIGFic29sdXRlbHkgbm90aGluZy4gQ2Fubm90IGJlIHNldCB0byBtb3JlIHRoYW6QIFtgQ29uZmlnOjpNYXhFcmFzVG9DaGVja1BlckJsb2NrYF0uAGUBIEJhc2VkIG9uIHRoZSBhbW91bnQgb2Ygd2VpZ2h0IGF2YWlsYWJsZSBhdCBbYFBhbGxldDo6b25faWRsZWBdLCB1cCB0byB0aGlzIG1hbnkgZXJhcyBhcmVdASBjaGVja2VkLiBUaGUgY2hlY2tpbmcgaXMgcmVwcmVzZW50ZWQgYnkgdXBkYXRpbmcgW2BVbnN0YWtlUmVxdWVzdDo6Y2hlY2tlZGBdLCB3aGljaCBpc1Agc3RvcmVkIGluIFtgSGVhZGBdLgHdBAGNAQQcRGVwb3NpdBhAABCl1OgAAAAAAAAAAAAAAAhlASBEZXBvc2l0IHRvIHRha2UgZm9yIHVuc3Rha2luZywgdG8gbWFrZSBzdXJlIHdlJ3JlIGFibGUgdG8gc2xhc2ggdGhlIGl0IGluIG9yZGVyIHRvIGNvdmVywCB0aGUgY29zdHMgb2YgcmVzb3VyY2VzIG9uIHVuc3VjY2Vzc2Z1bCB1bnN0YWtlLgFFDB4AQENvbnZpY3Rpb25Wb3RpbmcBQENvbnZpY3Rpb25Wb3RpbmcIJFZvdGluZ0ZvcgEBCAUFSQxNDNgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIdQEgQWxsIHZvdGluZyBmb3IgYSBwYXJ0aWN1bGFyIHZvdGVyIGluIGEgcGFydGljdWxhciB2b3RpbmcgY2xhc3MuIFdlIHN0b3JlIHRoZSBiYWxhbmNlIGZvciB0aGWcIG51bWJlciBvZiB2b3RlcyB0aGF0IHdlIGhhdmUgcmVjb3JkZWQuNENsYXNzTG9ja3NGb3IBAQQFAG0MBAAMaQEgVGhlIHZvdGluZyBjbGFzc2VzIHdoaWNoIGhhdmUgYSBub24temVybyBsb2NrIHJlcXVpcmVtZW50IGFuZCB0aGUgbG9jayBhbW91bnRzIHdoaWNoIHRoZXltASByZXF1aXJlLiBUaGUgYWN0dWFsIGFtb3VudCBsb2NrZWQgb24gYmVoYWxmIG9mIHRoaXMgcGFsbGV0IHNob3VsZCBhbHdheXMgYmUgdGhlIG1heGltdW0gb2YsIHRoaXMgbGlzdC4B4QQBlQEIIE1heFZvdGVzEBAAAgAAEPAgVGhlIG1heGltdW0gbnVtYmVyIG9mIGNvbmN1cnJlbnQgdm90ZXMgYW4gYWNjb3VudCBtYXkgaGF2ZS4AVQEgQWxzbyB1c2VkIHRvIGNvbXB1dGUgd2VpZ2h0LCBhbiBvdmVybHkgbGFyZ2UgdmFsdWUgY2FuIGxlYWQgdG8gZXh0cmluc2ljcyB3aXRoIGxhcmdlwCB3ZWlnaHQgZXN0aW1hdGlvbjogc2VlIGBkZWxlZ2F0ZWAgZm9yIGluc3RhbmNlLkRWb3RlTG9ja2luZ1BlcmlvZBAQwIkBABCQIFRoZSBtaW5pbXVtIHBlcmlvZCBvZiB2b3RlIGxvY2tpbmcuAGUBIEl0IHNob3VsZCBiZSBubyBzaG9ydGVyIHRoYW4gZW5hY3RtZW50IHBlcmlvZCB0byBlbnN1cmUgdGhhdCBpbiB0aGUgY2FzZSBvZiBhbiBhcHByb3ZhbCxJASB0aG9zZSBzdWNjZXNzZnVsIHZvdGVycyBhcmUgbG9ja2VkIGludG8gdGhlIGNvbnNlcXVlbmNlcyB0aGF0IHRoZWlyIHZvdGVzIGVudGFpbC4BeQwfACRSZWZlcmVuZGEBJFJlZmVyZW5kYRQ8UmVmZXJlbmR1bUNvdW50AQAQEAAAAAAEMQEgVGhlIG5leHQgZnJlZSByZWZlcmVuZHVtIGluZGV4LCBha2EgdGhlIG51bWJlciBvZiByZWZlcmVuZGEgc3RhcnRlZCBzbyBmYXIuRFJlZmVyZW5kdW1JbmZvRm9yAAEEAhB9DAQABLQgSW5mb3JtYXRpb24gY29uY2VybmluZyBhbnkgZ2l2ZW4gcmVmZXJlbmR1bS4oVHJhY2tRdWV1ZQEBBAVBAZ0MBAAQXQEgVGhlIHNvcnRlZCBsaXN0IG9mIHJlZmVyZW5kYSByZWFkeSB0byBiZSBkZWNpZGVkIGJ1dCBub3QgeWV0IGJlaW5nIGRlY2lkZWQsIG9yZGVyZWQgYnl8IGNvbnZpY3Rpb24td2VpZ2h0ZWQgYXBwcm92YWxzLgBBASBUaGlzIHNob3VsZCBiZSBlbXB0eSBpZiBgRGVjaWRpbmdDb3VudGAgaXMgbGVzcyB0aGFuIGBUcmFja0luZm86Om1heF9kZWNpZGluZ2AuNERlY2lkaW5nQ291bnQBAQQFQQEQEAAAAAAExCBUaGUgbnVtYmVyIG9mIHJlZmVyZW5kYSBiZWluZyBkZWNpZGVkIGN1cnJlbnRseS4oTWV0YWRhdGFPZgABBAIQNAQAGAUBIFRoZSBtZXRhZGF0YSBpcyBhIGdlbmVyYWwgaW5mb3JtYXRpb24gY29uY2VybmluZyB0aGUgcmVmZXJlbmR1bS5JASBUaGUgYEhhc2hgIHJlZmVycyB0byB0aGUgcHJlaW1hZ2Ugb2YgdGhlIGBQcmVpbWFnZXNgIHByb3ZpZGVyIHdoaWNoIGNhbiBiZSBhIEpTT06IIGR1bXAgb3IgSVBGUyBoYXNoIG9mIGEgSlNPTiBmaWxlLgB1ASBDb25zaWRlciBhIGdhcmJhZ2UgY29sbGVjdGlvbiBmb3IgYSBtZXRhZGF0YSBvZiBmaW5pc2hlZCByZWZlcmVuZHVtcyB0byBgdW5yZXF1ZXN0YCAocmVtb3ZlKUQgbGFyZ2UgcHJlaW1hZ2VzLgHtBAGhARREU3VibWlzc2lvbkRlcG9zaXQYQACsI/wGAAAAAAAAAAAAAAAENQEgVGhlIG1pbmltdW0gYW1vdW50IHRvIGJlIHVzZWQgYXMgYSBkZXBvc2l0IGZvciBhIHB1YmxpYyByZWZlcmVuZHVtIHByb3Bvc2FsLiRNYXhRdWV1ZWQQEGQAAAAE5CBNYXhpbXVtIHNpemUgb2YgdGhlIHJlZmVyZW5kdW0gcXVldWUgZm9yIGEgc2luZ2xlIHRyYWNrLkRVbmRlY2lkaW5nVGltZW91dBAQgBMDAAhVASBUaGUgbnVtYmVyIG9mIGJsb2NrcyBhZnRlciBzdWJtaXNzaW9uIHRoYXQgYSByZWZlcmVuZHVtIG11c3QgYmVnaW4gYmVpbmcgZGVjaWRlZCBieS7kIE9uY2UgdGhpcyBwYXNzZXMsIHRoZW4gYW55b25lIG1heSBjYW5jZWwgdGhlIHJlZmVyZW5kdW0uNEFsYXJtSW50ZXJ2YWwQEAEAAAAMXQEgUXVhbnRpemF0aW9uIGxldmVsIGZvciB0aGUgcmVmZXJlbmR1bSB3YWtldXAgc2NoZWR1bGVyLiBBIGhpZ2hlciBudW1iZXIgd2lsbCBy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cmFja3MgYXJlIGR5bmFtaWMsIHRoZSB2YWx1ZSBpbiB0aGUgc3RhdGljIG1ldGFkYXRhIG1pZ2h0IGJlIGluYWNjdXJhdGUuAbkMIAAcT3JpZ2lucwAAAAAAIwAkV2hpdGVsaXN0ASRXaGl0ZWxpc3QEPFdoaXRlbGlzdGVkQ2FsbAABBAU0BQEEAAAB+QQBsQgAAb0MJAAgVHJlYXN1cnkBIFRyZWFzdXJ5HDRQcm9wb3NhbENvdW50AQAQEAAAAAAQQQEgREVQUkVDQVRFRDogYXNzb2NpYXRlZCB3aXRoIGBzcGVuZF9sb2NhbGAgY2FsbCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIE1heSAyMDI1LmkBIFJlZmVyIHRvIDxodHRwczovL2dpdGh1Yi5jb20vcGFyaXR5dGVjaC9wb2xrYWRvdC1zZGsvcHVsbC81OTYxPiBmb3IgbWlncmF0aW9uIHRvIGBzcGVuZGAuAKQgTnVtYmVyIG9mIHByb3Bvc2FscyB0aGF0IGhhdmUgYmVlbiBtYWRlLiRQcm9wb3NhbHMAAQQFEMEMBAAQQQEgREVQUkVDQVRFRDogYXNzb2NpYXRlZCB3aXRoIGBzcGVuZF9sb2NhbGAgY2FsbCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIE1heSAyMDI1LmkBIFJlZmVyIHRvIDxodHRwczovL2dpdGh1Yi5jb20vcGFyaXR5dGVjaC9wb2xrYWRvdC1zZGsvcHVsbC81OTYxPiBmb3IgbWlncmF0aW9uIHRvIGBzcGVuZGAuAHwgUHJvcG9zYWxzIHRoYXQgaGF2ZSBiZWVuIG1hZGUuLERlYWN0aXZhdGVkAQAYQAAAAAAAAAAAAAAAAAAAAAAE8CBUaGUgYW1vdW50IHdoaWNoIGhhcyBiZWVuIHJlcG9ydGVkIGFzIGluYWN0aXZlIHRvIEN1cnJlbmN5LiRBcHByb3ZhbHMBAMUMBAAQQQEgREVQUkVDQVRFRDogYXNzb2NpYXRlZCB3aXRoIGBzcGVuZF9sb2NhbGAgY2FsbCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIE1heSAyMDI1LmkBIFJlZmVyIHRvIDxodHRwczovL2dpdGh1Yi5jb20vcGFyaXR5dGVjaC9wb2xrYWRvdC1zZGsvcHVsbC81OTYxPiBmb3IgbWlncmF0aW9uIHRvIGBzcGVuZGAuAPggUHJvcG9zYWwgaW5kaWNlcyB0aGF0IGhhdmUgYmVlbiBhcHByb3ZlZCBidXQgbm90IHlldCBhd2FyZGVkLihTcGVuZENvdW50AQAQEAAAAAAEpCBUaGUgY291bnQgb2Ygc3BlbmRzIHRoYXQgaGF2ZSBiZWVuIG1hZGUuGFNwZW5kcwABBAUQyQwEAATQIFNwZW5kcyB0aGF0IGhhdmUgYmVlbiBhcHByb3ZlZCBhbmQgYmVpbmcgcHJvY2Vzc2VkLjxMYXN0U3BlbmRQZXJpb2QAABAEAATUIFRoZSBibG9ja251bWJlciBmb3IgdGhlIGxhc3QgdHJpZ2dlcmVkIHNwZW5kIHBlcmlvZC4B/QQBwQgYLFNwZW5kUGVyaW9kEBCAUQEABIggUGVyaW9kIGJldHdlZW4gc3VjY2Vzc2l2ZSBzcGVuZHMuEEJ1cm7RDBDQBwAABBEBIFBlcmNlbnRhZ2Ugb2Ygc3BhcmUgZnVuZHMgKGlmIGFueSkgdGhhdCBhcmUgYnVybnQgcGVyIHNwZW5kIHBlcmlvZC4gUGFsbGV0SWQtDCBweS90cnNyeQQZASBUaGUgdHJlYXN1cnkncyBwYWxsZXQgaWQsIHVzZWQgZm9yIGRlcml2aW5nIGl0cyBzb3ZlcmVpZ24gYWNjb3VudCBJRC4wTWF4QXBwcm92YWxzEBBkAAAAGEEBIERFUFJFQ0FURUQ6IGFzc29jaWF0ZWQgd2l0aCBgc3BlbmRfbG9jYWxgIGNhbGwgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBNYXkgMjAyNS5pASBSZWZlciB0byA8aHR0cHM6Ly9naXRodWIuY29tL3Bhcml0eXRlY2gvcG9sa2Fkb3Qtc2RrL3B1bGwvNTk2MT4gZm9yIG1pZ3JhdGlvbiB0byBgc3BlbmRgLgAVASBUaGUgbWF4aW11bSBudW1iZXIgb2YgYXBwcm92YWxzIHRoYXQgY2FuIHdhaXQgaW4gdGhlIHNwZW5kaW5nIHF1ZXVlLgBNASBOT1RFOiBUaGlzIHBhcmFtZXRlciBpcyBhbHNvIHVzZWQgd2l0aGluIHRoZSBCb3VudGllcyBQYWxsZXQgZXh0ZW5zaW9uIGlmIGVuYWJsZWQuMFBheW91dFBlcmlvZBAQgJcGAAQZASBUaGUgcGVyaW9kIGR1cmluZyB3aGljaCBhbiBhcHByb3ZlZCB0cmVhc3VyeSBzcGVuZCBoYXMgdG8gYmUgY2xhaW1lZC4scG90X2FjY291bnQAgG1vZGxweS90cnNyeQAAAAAAAAAAAAAAAAAAAAAAAAAABKAgR2V0cyB0aGlzIHBhbGxldCdzIGRlcml2ZWQgcG90IGFjY291bnQuAdUMJQBARGVsZWdhdGVkU3Rha2luZwFARGVsZWdhdGVkU3Rha2luZxAoRGVsZWdhdG9ycwABBAUA2QwEABCkIE1hcCBvZiBEZWxlZ2F0b3JzIHRvIHRoZWlyIGBEZWxlZ2F0aW9uYC4AYQEgSW1wbGVtZW50YXRpb24gbm90ZTogV2UgYXJlIG5vdCB1c2luZyBhIGRvdWJsZSBtYXAgd2l0aCBgZGVsZWdhdG9yYCBhbmQgYGFnZW50YCBhY2NvdW50YQEgYXMga2V5cyBzaW5jZSB3ZSB3YW50IHRvIHJlc3RyaWN0IGRlbGVnYXRvcnMgdG8gZGVsZWdhdGUgb25seSB0byBvbmUgYWNjb3VudCBhdCBhIHRpbWUuUENvdW50ZXJGb3JEZWxlZ2F0b3JzAQAQEAAAAAAErENvdW50ZXIgZm9yIHRoZSByZWxhdGVkIGNvdW50ZWQgc3RvcmFnZSBtYXAYQWdlbnRzAAEEBQDdDAQABIggTWFwIG9mIGBBZ2VudGAgdG8gdGhlaXIgYExlZGdlcmAuQENvdW50ZXJGb3JBZ2VudHMBABAQAAAAAASsQ291bnRlciBmb3IgdGhlIHJlbGF0ZWQgY291bnRlZCBzdG9yYWdlIG1hcAABxQgIIFBhbGxldElkLQwgcHkvZGxzdGsEkCBJbmplY3RlZCBpZGVudGlmaWVyIGZvciB0aGUgcGFsbGV0LkxTbGFzaFJld2FyZEZyYWN0aW9umBCAlpgABFEBIEZyYWN0aW9uIG9mIHRoZSBzbGFzaCB0aGF0IGlzIHJld2FyZGVkIHRvIHRoZSBjYWxsZXIgb2YgcGVuZGluZyBzbGFzaCB0byB0aGUgYWdlbnQuAeEMJgBAUGFyYWNoYWluc09yaWdpbgAAAAAAKRB5ASBUaGVyZSBpcyBubyB3YXkgdG8gcmVnaXN0ZXIgYW4gb3JpZ2luIHR5cGUgaW4gYGNvbnN0cnVjdF9ydW50aW1lYCB3aXRob3V0IGEgcGFsbGV0IHRoZSBvcmlnaW4wIGJlbG9uZ3MgdG8uAHUBIFRoaXMgbW9kdWxlIGZ1bGZpbGxzIG9ubHkgdGhlIHNpbmdsZSBwdXJwb3NlIG9mIGhvdXNpbmcgdGhlIGBPcmlnaW5gIGluIGBjb25zdHJ1Y3RfcnVudGltZWAuNENvbmZpZ3VyYXRpb24BNENvbmZpZ3VyYXRpb24MMEFjdGl2ZUNvbmZpZwEA5QxBAwAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAGQAAAABAAAAAQAAAAAAAAAAAAAAAAAAAAIAAAACAAAAAgAAAAABAAAAAQAAAAEAAAAAAQAAAAAAAAAAAAAAECcAAICy5g6Aw8kBgJaYAAAAAAAAAAAAAAAAAAUAAAAEyCBUaGUgYWN0aXZlIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBjdXJyZW50IHNlc3Npb24uOFBlbmRpbmdDb25maWdzAQDpDAQAHHwgUGVuZGluZyBjb25maWd1cmF0aW9uIGNoYW5nZXMuAFkBIFRoaXMgaXMgYSBsaXN0IG9mIGNvbmZpZ3VyYXRpb24gY2hhbmdlcywgZWFjaCB3aXRoIGEgc2Vzc2lvbiBpbmRleCBhdCB3aGljaCBpdCBzaG91bGQwIGJlIGFwcGxpZWQuAGEBIFRoZSBsaXN0IGlzIHNvcnRlZCBhc2NlbmRpbmcgYnkgc2Vzc2lvbiBpbmRleC4gQWxzbywgdGhpcyBsaXN0IGNhbiBvbmx5IGNvbnRhaW4gYXQgbW9zdPwgMiBpdGVtczogZm9yIHRoZSBuZXh0IHNlc3Npb24gYW5kIGZvciB0aGUgYHNjaGVkdWxlZF9zZXNzaW9uYC5YQnlwYXNzQ29uc2lzdGVuY3lDaGVjawEAIAQACGEBIElmIHRoaXMgaXMgc2V0LCB0aGVuIHRoZSBjb25maWd1cmF0aW9uIHNldHRlcnMgd2lsbCBieXBhc3MgdGhlIGNvbnNpc3RlbmN5IGNoZWNrcy4gVGhpc7QgaXMgbWVhbnQgdG8gYmUgdXNlZCBvbmx5IGFzIHRoZSBsYXN0IHJlc29ydC4BXQUAAAHxDCoALFBhcmFzU2hhcmVkASxQYXJhc1NoYXJlZBBMQ3VycmVudFNlc3Npb25JbmRleAEAEBAAAAAABGwgVGhlIGN1cnJlbnQgc2Vzc2lvbiBpbmRleC5YQWN0aXZlVmFsaWRhdG9ySW5kaWNlcwEA9QwEAAgJASBBbGwgdGhlIHZhbGlkYXRvcnMgYWN0aXZlbHkgcGFydGljaXBhdGluZyBpbiBwYXJhY2hhaW4gY29uc2Vuc3VzLrAgSW5kaWNlcyBhcmUgaW50byB0aGUgYnJvYWRlciB2YWxpZGF0b3Igc2V0LkxBY3RpdmVWYWxpZGF0b3JLZXlzAQD5DAQACFUBIFRoZSBwYXJhY2hhaW4gYXR0ZXN0YXRpb24ga2V5cyBvZiB0aGUgdmFsaWRhdG9ycyBhY3RpdmVseSBwYXJ0aWNpcGF0aW5nIGluIHBhcmFjaGFpbh0BIGNvbnNlbnN1cy4gVGhpcyBzaG91bGQgYmUgdGhlIHNhbWUgbGVuZ3RoIGFzIGBBY3RpdmVWYWxpZGF0b3JJbmRpY2VzYC5MQWxsb3dlZFJlbGF5UGFyZW50cwEA/QwUAAAAAAAEbCBBbGwgYWxsb3dlZCByZWxheS1wYXJlbnRzLgGBBQAAACsANFBhcmFJbmNsdXNpb24BNFBhcmFJbmNsdXNpb24ECFYxAAEEBbECKQ0EABRhASBDYW5kaWRhdGVzIHBlbmRpbmcgYXZhaWxhYmlsaXR5IGJ5IGBQYXJhSWRgLiBUaGV5IGZvcm0gYSBjaGFpbiBzdGFydGluZyBmcm9tIHRoZSBsYXRlc3RsIGluY2x1ZGVkIGhlYWQgb2YgdGhlIHBhcmEuYQEgVXNlIGEgZGlmZmVyZW50IHByZWZpeCBwb3N0LW1pZ3JhdGlvbiB0byB2MSwgc2luY2UgdGhlIHYwIGBQZW5kaW5nQXZhaWxhYmlsaXR5YCBzdG9yYWdlcQEgd291bGQgb3RoZXJ3aXNlIGhhdmUgdGhlIGV4YWN0IHNhbWUgcHJlZml4IHdoaWNoIGNvdWxkIGNhdXNlIHVuZGVmaW5lZCBiZWhhdmlvdXIgd2hlbiBkb2luZzwgdGhlIG1pZ3JhdGlvbi4BhQUByQgAATENLAAwUGFyYUluaGVyZW50ATBQYXJhSW5oZXJlbnQIIEluY2x1ZGVkAAAFAQQAGOwgV2hldGhlciB0aGUgcGFyYXMgaW5oZXJlbnQgd2FzIGluY2x1ZGVkIHdpdGhpbiB0aGlzIGJsb2NrLgBpASBUaGUgYE9wdGlvbjwoKT5gIGlzIGVmZmVjdGl2ZWx5IGEgYGJvb2xgLCBidXQgaXQgbmV2ZXIgaGl0cyBzdG9yYWdlIGluIHRoZSBgTm9uZWAgdmFyaWFudLwgZHVlIHRvIHRoZSBndWFyYW50ZWVzIG9mIEZSQU1FJ3Mgc3RvcmFnZSBBUElzLgBJASBJZiB0aGlzIGlzIGBOb25lYCBhdCB0aGUgZW5kIG9mIHRoZSBibG9jaywgd2UgcGFuaWMgYW5kIHJlbmRlciB0aGUgYmxvY2sgaW52YWxpZC4wT25DaGFpblZvdGVzAAA1DQQABEUBIFNjcmFwZWQgb24gY2hhaW4gZGF0YSBmb3IgZXh0cmFjdGluZyByZXNvbHZlZCBkaXNwdXRlcyBhcyB3ZWxsIGFzIGJhY2tpbmcgdm90ZXMuAYkFAAABSQ0tADRQYXJhU2NoZWR1bGVyATRQYXJhU2NoZWR1bGVyDDxWYWxpZGF0b3JHcm91cHMBAE0NBAAcbQEgQWxsIHRoZSB2YWxpZGF0b3IgZ3JvdXBzLiBPbmUgZm9yIGVhY2ggY29yZS4gSW5kaWNlcyBhcmUgaW50byBgQWN0aXZlVmFsaWRhdG9yc2AgLSBub3QgdGhlbQEgYnJvYWRlciBzZXQgb2YgUG9sa2Fkb3QgdmFsaWRhdG9ycywgYnV0IGluc3RlYWQganVzdCB0aGUgc3Vic2V0IHVzZWQgZm9yIHBhcmFjaGFpbnMgZHVyaW5nOCB0aGlzIHNlc3Npb24uAEkBIEJvdW5kOiBUaGUgbnVtYmVyIG9mIGNvcmVzIGlzIHRoZSBzdW0gb2YgdGhlIG51bWJlcnMgb2YgcGFyYWNoYWlucyBhbmQgcGFyYXRocmVhZGkBIG11bHRpcGxleGVycy4gUmVhc29uYWJseSwgMTAwLTEwMDAuIFRoZSBkb21pbmFudCBmYWN0b3IgaXMgdGhlIG51bWJlciBvZiB2YWxpZGF0b3JzOiBzYWZlUCB1cHBlciBib3VuZCBhdCAxMGsuRFNlc3Npb25TdGFydEJsb2NrAQAQEAAAAAAcaQEgVGhlIGJsb2NrIG51bWJlciB3aGVyZSB0aGUgc2Vzc2lvbiBzdGFydCBvY2N1cnJlZC4gVXNlZCB0byB0cmFjayBob3cgbWFueSBncm91cCByb3RhdGlvbnM8IGhhdmUgb2NjdXJyZWQuAFUBIE5vdGUgdGhhdCBpbiB0aGUgY29udGV4dCBvZiBwYXJhY2hhaW5zIG1vZHVsZXMgdGhlIHNlc3Npb24gY2hhbmdlIGlzIHNpZ25hbGVkIGR1cmluZ2EBIHRoZSBibG9jayBhbmQgZW5hY3RlZCBhdCB0aGUgZW5kIG9mIHRoZSBibG9jayAoYXQgdGhlIGZpbmFsaXphdGlvbiBzdGFnZSwgdG8gYmUgZXhhY3QpLlkBIFRodXMgZm9yIGFsbCBpbnRlbnRzIGFuZCBwdXJwb3NlcyB0aGUgZWZmZWN0IG9mIHRoZSBzZXNzaW9uIGNoYW5nZSBpcyBvYnNlcnZlZCBhdCB0aGVlASBibG9jayBmb2xsb3dpbmcgdGhlIHNlc3Npb24gY2hhbmdlLCBibG9jayBudW1iZXIgb2Ygd2hpY2ggd2Ugc2F2ZSBpbiB0aGlzIHN0b3JhZ2UgdmFsdWUuKENsYWltUXVldWUBAFENBAAIWQEgT25lIGVudHJ5IGZvciBlYWNoIGF2YWlsYWJpbGl0eSBjb3JlLiBUaGUgYFZlY0RlcXVlYCByZXByZXNlbnRzIHRoZSBhc3NpZ25tZW50cyB0byBiZWAgc2NoZWR1bGVkIG9uIHRoYXQgY29yZS4AAAAALgAUUGFyYXMBFFBhcmFzWEBQdmZBY3RpdmVWb3RlTWFwAAEEBcEFZQ0EABC0IEFsbCBjdXJyZW50bHkgYWN0aXZlIFBWRiBwcmUtY2hlY2tpbmcgdm90ZXMuACwgSW52YXJpYW50OnUBIC0gVGhlcmUgYXJlIG5vIFBWRiBwcmUtY2hlY2tpbmcgdm90ZXMgdGhhdCBleGlzdHMgaW4gbGlzdCBidXQgbm90IGluIHRoZSBzZXQgYW5kIHZpY2UgdmVyc2EuRFB2ZkFjdGl2ZVZvdGVMaXN0AQB1DQQABDUBIFRoZSBsaXN0IG9mIGFsbCBjdXJyZW50bHkgYWN0aXZlIFBWRiB2b3Rlcy4gQXV4aWxpYXJ5IHRvIGBQdmZBY3RpdmVWb3RlTWFwYC4oUGFyYWNoYWlucwEAeQ0EABBpASBBbGwgbGVhc2UgaG9sZGluZyBwYXJhY2hhaW5zLiBPcmRlcmVkIGFzY2VuZGluZyBieSBgUGFyYUlkYC4gT24gZGVtYW5kIHBhcmFjaGFpbnMgYXJlIG5vdCggaW5jbHVkZWQuAOggQ29uc2lkZXIgdXNpbmcgdGhlIFtgUGFyYWNoYWluc0NhY2hlYF0gdHlwZSBvZiBtb2RpZnlpbmcuOFBhcmFMaWZlY3ljbGVzAAEEBbECfQ0EAAS8IFRoZSBjdXJyZW50IGxpZmVjeWNsZSBvZiBhIGFsbCBrbm93biBQYXJhIElEcy4USGVhZHMAAQQFsQLhBQQABKAgVGhlIGhlYWQtZGF0YSBvZiBldmVyeSByZWdpc3RlcmVkIHBhcmEuRE1vc3RSZWNlbnRDb250ZXh0AAEEBbECEAQABCkBIFRoZSBjb250ZXh0IChyZWxheS1jaGFpbiBibG9jayBudW1iZXIpIG9mIHRoZSBtb3N0IHJlY2VudCBwYXJhY2hhaW4gaGVhZC48Q3VycmVudENvZGVIYXNoAAEEBbECwQUEAAy0IFRoZSB2YWxpZGF0aW9uIGNvZGUgaGFzaCBvZiBldmVyeSBsaXZlIHBhcmEuAOQgQ29ycmVzcG9uZGluZyBjb2RlIGNhbiBiZSByZXRyaWV2ZWQgd2l0aCBbYENvZGVCeUhhc2hgXS4wUGFzdENvZGVIYXNoAAEEBYENwQUEABBhASBBY3R1YWwgcGFzdCBjb2RlIGhhc2gsIGluZGljYXRlZCBieSB0aGUgcGFyYSBpZCBhcyB3ZWxsIGFzIHRoZSBibG9jayBudW1iZXIgYXQgd2hpY2ggaXREIGJlY2FtZSBvdXRkYXRlZC4A5CBDb3JyZXNwb25kaW5nIGNvZGUgY2FuIGJlIHJldHJpZXZlZCB3aXRoIFtgQ29kZUJ5SGFzaGBdLjBQYXN0Q29kZU1ldGEBAQQFsQKFDQgAAAxJASBQYXN0IGNvZGUgb2YgcGFyYWNoYWlucy4gVGhlIHBhcmFjaGFpbnMgdGhlbXNlbHZlcyBtYXkgbm90IGJlIHJlZ2lzdGVyZWQgYW55bW9yZSxJASBidXQgd2UgYWxzbyBrZWVwIHRoZWlyIGNvZGUgb24tY2hhaW4gZm9yIHRoZSBzYW1lIGFtb3VudCBvZiB0aW1lIGFzIG91dGRhdGVkIGNvZGWwIHRvIGtlZXAgaXQgYXZhaWxhYmxlIGZvciBhcHByb3ZhbCBjaGVja2Vycy48UGFzdENvZGVQcnVuaW5nAQCRDQQAGGkBIFdoaWNoIHBhcmFzIGhhdmUgcGFzdCBjb2RlIHRoYXQgbmVlZHMgcHJ1bmluZyBhbmQgdGhlIHJlbGF5LWNoYWluIGJsb2NrIGF0IHdoaWNoIHRoZSBjb2RlaQEgd2FzIHJlcGxhY2VkLiBOb3RlIHRoYXQgdGhpcyBpcyB0aGUgYWN0dWFsIGhlaWdodCBvZiB0aGUgaW5jbHVkZWQgYmxvY2ssIG5vdCB0aGUgZXhwZWN0ZWQ9ASBoZWlnaHQgYXQgd2hpY2ggdGhlIGNvZGUgdXBncmFkZSB3b3VsZCBiZSBhcHBsaWVkLCBhbHRob3VnaCB0aGV5IG1heSBiZSBlcXVhbC5tASBUaGlzIGlzIHRvIGVuc3VyZSB0aGUgZW50aXJlIGFjY2VwdGFuY2UgcGVyaW9kIGlzIGNvdmVyZWQsIG5vdCBhbiBvZmZzZXQgYWNjZXB0YW5jZSBwZXJpb2RtASBzdGFydGluZyBmcm9tIHRoZSB0aW1lIGF0IHdoaWNoIHRoZSBwYXJhY2hhaW4gcGVyY2VpdmVzIGEgY29kZSB1cGdyYWRlIGFzIGhhdmluZyBvY2N1cnJlZC5VASBNdWx0aXBsZSBlbnRyaWVzIGZvciBhIHNpbmdsZSBwYXJhIGFyZSBwZXJtaXR0ZWQuIE9yZGVyZWQgYXNjZW5kaW5nIGJ5IGJsb2NrIG51bWJlci5IRnV0dXJlQ29kZVVwZ3JhZGVzAAEEBbECEAQAED0BIFRoZSBibG9jayBudW1iZXIgYXQgd2hpY2ggdGhlIHBsYW5uZWQgY29kZSBjaGFuZ2UgaXMgZXhwZWN0ZWQgZm9yIGEgcGFyYWNoYWluLgBlASBUaGUgY2hhbmdlIHdpbGwgYmUgYXBwbGllZCBhZnRlciB0aGUgZmlyc3QgcGFyYWJsb2NrIGZvciB0aGlzIElEIGluY2x1ZGVkIHdoaWNoIGV4ZWN1dGVzGQEgaW4gdGhlIGNvbnRleHQgb2YgYSByZWxheSBjaGFpbiBibG9jayB3aXRoIGEgbnVtYmVyID49IGBleHBlY3RlZF9hdGAuUEZ1dHVyZUNvZGVVcGdyYWRlc0F0AQCRDQQAIKwgVGhlIGxpc3Qgb2YgdXBjb21pbmcgZnV0dXJlIGNvZGUgdXBncmFkZXMuAG0BIEVhY2ggaXRlbSBpcyBhIHBhaXIgb2YgdGhlIHBhcmFjaGFpbiBhbmQgdGhlIGV4cGVjdGVkIGJsb2NrIGF0IHdoaWNoIHRoZSB1cGdyYWRlIHNob3VsZCBiZVEBIGFwcGxpZWQuIFRoZSB1cGdyYWRlIHdpbGwgYmUgYXBwbGllZCBhdCB0aGUgZ2l2ZW4gcmVsYXkgY2hhaW4gYmxvY2suIEluIGNvbnRyYXN0IHRvdQEgW2BGdXR1cmVDb2RlVXBncmFkZXNgXSB0aGlzIGNvZGUgdXBncmFkZSB3aWxsIGJlIGFwcGxpZWQgcmVnYXJkbGVzcyB0aGUgcGFyYWNoYWluIG1ha2luZyBhbnlEIHByb2dyZXNzIG9yIG5vdC4AjCBPcmRlcmVkIGFzY2VuZGluZyBieSBibG9jayBudW1iZXIuOEZ1dHVyZUNvZGVIYXNoAAEEBbECwQUEAAycIFRoZSBhY3R1YWwgZnV0dXJlIGNvZGUgaGFzaCBvZiBhIHBhcmEuAOQgQ29ycmVzcG9uZGluZyBjb2RlIGNhbiBiZSByZXRyaWV2ZWQgd2l0aCBbYENvZGVCeUhhc2hgXS5IQXV0aG9yaXplZENvZGVIYXNoAAEEBbEClQ0EAARtASBUaGUgY29kZSBoYXNoIGF1dGhvcml6YXRpb25zIGZvciBhIHBhcmEgd2hpY2ggd2lsbCBleHBpcmUgYGV4cGlyZV9hdGAgYEJsb2NrTnVtYmVyRm9yPFQ+YC5QVXBncmFkZUdvQWhlYWRTaWduYWwAAQQFsQKZDQQAKHUBIFRoaXMgaXMgdXNlZCBieSB0aGUgcmVsYXktY2hhaW4gdG8gY29tbXVuaWNhdGUgdG8gYSBwYXJhY2hhaW4gYSBnby1haGVhZCB3aXRoIGluIHRoZSB1cGdyYWRlLCBwcm9jZWR1cmUuAHUBIFRoaXMgdmFsdWUgaXMgYWJzZW50IHdoZW4gdGhlcmUgYXJlIG5vIHVwZ3JhZGVzIHNjaGVkdWxlZCBvciBkdXJpbmcgdGhlIHRpbWUgdGhlIHJlbGF5IGNoYWluVQEgcGVyZm9ybXMgdGhlIGNoZWNrcy4gSXQgaXMgc2V0IGF0IHRoZSBmaXJzdCByZWxheS1jaGFpbiBibG9jayB3aGVuIHRoZSBjb3JyZXNwb25kaW5ndQEgcGFyYWNoYWluIGNhbiBzd2l0Y2ggaXRzIHVwZ3JhZGUgZnVuY3Rpb24uIEFzIHNvb24gYXMgdGhlIHBhcmFjaGFpbidzIGJsb2NrIGlzIGluY2x1ZGVkLCB0aGVwIHZhbHVlIGdldHMgcmVzZXQgdG8gYE5vbmVgLgBlASBOT1RFIHRoYXQgdGhpcyBmaWVsZCBpcyB1c2VkIGJ5IHBhcmFjaGFpbnMgdmlhIG1lcmtsZSBzdG9yYWdlIHByb29mcywgdGhlcmVmb3JlIGNoYW5naW5nxCB0aGUgZm9ybWF0IHdpbGwgcmVxdWlyZSBtaWdyYXRpb24gb2YgcGFyYWNoYWlucy5gVXBncmFkZVJlc3RyaWN0aW9uU2lnbmFsAAEEBbECnQ0EACRpASBUaGlzIGlzIHVzZWQgYnkgdGhlIHJlbGF5LWNoYWluIHRvIGNvbW11bmljYXRlIHRoYXQgdGhlcmUgYXJlIHJlc3RyaWN0aW9ucyBmb3IgcGVyZm9ybWluZ3wgYW4gdXBncmFkZSBmb3IgdGhpcyBwYXJhY2hhaW4uAFkBIFRoaXMgbWF5IGJlIGEgYmVjYXVzZSB0aGUgcGFyYWNoYWluIHdhaXRzIGZvciB0aGUgdXBncmFkZSBjb29sZG93biB0byBleHBpcmUuIEFub3RoZXJtASBwb3RlbnRpYWwgdXNlIGNhc2UgaXMgd2hlbiB3ZSB3YW50IHRvIHBlcmZvcm0gc29tZSBtYWludGVuYW5jZSAoc3VjaCBhcyBzdG9yYWdlIG1pZ3JhdGlvbingIHdlIGNvdWxkIHJlc3RyaWN0IHVwZ3JhZGVzIHRvIG1ha2UgdGhlIHByb2Nlc3Mgc2ltcGxlci4AZQEgTk9URSB0aGF0IHRoaXMgZmllbGQgaXMgdXNlZCBieSBwYXJhY2hhaW5zIHZpYSBtZXJrbGUgc3RvcmFnZSBwcm9vZnMsIHRoZXJlZm9yZSBjaGFuZ2luZ8QgdGhlIGZvcm1hdCB3aWxsIHJlcXVpcmUgbWlncmF0aW9uIG9mIHBhcmFjaGFpbnMuQFVwZ3JhZGVDb29sZG93bnMBAJENBAAMUQEgVGhlIGxpc3Qgb2YgcGFyYWNoYWlucyB0aGF0IGFyZSBhd2FpdGluZyBmb3IgdGhlaXIgdXBncmFkZSByZXN0cmljdGlvbiB0byBjb29sZG93bi4AjCBPcmRlcmVkIGFzY2VuZGluZyBieSBibG9jayBudW1iZXIuQFVwY29taW5nVXBncmFkZXMBAJENBAAYkCBUaGUgbGlzdCBvZiB1cGNvbWluZyBjb2RlIHVwZ3JhZGVzLgBxASBFYWNoIGl0ZW0gaXMgYSBwYWlyIG9mIHdoaWNoIHBhcmEgcGVyZm9ybXMgYSBjb2RlIHVwZ3JhZGUgYW5kIGF0IHdoaWNoIHJlbGF5LWNoYWluIGJsb2NrIGl0QCBpcyBleHBlY3RlZCBhdC4AjCBPcmRlcmVkIGFzY2VuZGluZyBieSBibG9jayBudW1iZXIuMEFjdGlvbnNRdWV1ZQEBBAUQeQ0EAAQVASBUaGUgYWN0aW9ucyB0byBwZXJmb3JtIGR1cmluZyB0aGUgc3RhcnQgb2YgYSBzcGVjaWZpYyBzZXNzaW9uIGluZGV4LlBVcGNvbWluZ1BhcmFzR2VuZXNpcwABBAWxAkkGBAAQoCBVcGNvbWluZyBwYXJhcyBpbnN0YW50aWF0aW9uIGFyZ3VtZW50cy4AZQEgTk9URSB0aGF0IGFmdGVyIFBWRiBwcmUtY2hlY2tpbmcgaXMgZW5hYmxlZCB0aGUgcGFyYSBnZW5lc2lzIGFyZyB3aWxsIGhhdmUgaXQncyBjb2RlIHNldGEBIHRvIGVtcHR5LiBJbnN0ZWFkLCB0aGUgY29kZSB3aWxsIGJlIHNhdmVkIGludG8gdGhlIHN0b3JhZ2UgcmlnaHQgYXdheSB2aWEgYENvZGVCeUhhc2hgLjhDb2RlQnlIYXNoUmVmcwEBBAbBBRAQAAAAAAQpASBUaGUgbnVtYmVyIG9mIHJlZmVyZW5jZSBvbiB0aGUgdmFsaWRhdGlvbiBjb2RlIGluIFtgQ29kZUJ5SGFzaGBdIHN0b3JhZ2UuKENvZGVCeUhhc2gAAQQGwQXdBQQAEJAgVmFsaWRhdGlvbiBjb2RlIHN0b3JlZCBieSBpdHMgaGFzaC4AMQEgVGhpcyBzdG9yYWdlIGlzIGNvbnNpc3RlbnQgd2l0aCBbYEZ1dHVyZUNvZGVIYXNoYF0sIFtgQ3VycmVudENvZGVIYXNoYF0gYW5kSCBbYFBhc3RDb2RlSGFzaGBdLgERBgHZCARAVW5zaWduZWRQcmlvcml0eTAg//////////8AAaENLwAsSW5pdGlhbGl6ZXIBLEluaXRpYWxpemVyCDhIYXNJbml0aWFsaXplZAAABQEEACAhASBXaGV0aGVyIHRoZSBwYXJhY2hhaW5zIG1vZHVsZXMgaGF2ZSBiZWVuIGluaXRpYWxpemVkIHdpdGhpbiB0aGlzIGJsb2NrLgAlASBTZW1hbnRpY2FsbHkgYSBgYm9vbGAsIGJ1dCB0aGlzIGd1YXJhbnRlZXMgaXQgc2hvdWxkIG5ldmVyIGhpdCB0aGUgdHJpZSxpASBhcyB0aGlzIGlzIGNsZWFyZWQgaW4gYG9uX2ZpbmFsaXplYCBhbmQgRnJhbWUgb3B0aW1pemVzIGBOb25lYCB2YWx1ZXMgdG8gYmUgZW1wdHkgdmFsdWVzLgBxASBBcyBhIGBib29sYCwgYHNldChmYWxzZSlgIGFuZCBgcmVtb3ZlKClgIGJvdGggbGVhZCB0byB0aGUgbmV4dCBgZ2V0KClgIGJlaW5nIGZhbHNlLCBidXQgb25ldQEgb2YgdGhlbSB3cml0ZXMgdG8gdGhlIHRyaWUgYW5kIG9uZSBkb2VzIG5vdC4gVGhpcyBjb25mdXNpb24gbWFrZXMgYE9wdGlvbjwoKT5gIG1vcmUgc3VpdGFibGWQIGZvciB0aGUgc2VtYW50aWNzIG9mIHRoaXMgdmFyaWFibGUuWEJ1ZmZlcmVkU2Vzc2lvbkNoYW5nZXMBAKUNBAAcaCBCdWZmZXJlZCBzZXNzaW9uIGNoYW5nZXMuAF0BIFR5cGljYWxseSB0aGlzIHdpbGwgYmUgZW1wdHkgb3Igb25lIGVsZW1lbnQgbG9uZy4gQXBhcnQgZnJvbSB0aGF0IHRoaXMgaXRlbSBuZXZlciBoaXRzNCB0aGUgc3RvcmFnZS4AaQEgSG93ZXZlciB0aGlzIGlzIGEgYFZlY2AgcmVnYXJkbGVzcyB0byBoYW5kbGUgdmFyaW91cyBlZGdlIGNhc2VzIHRoYXQgbWF5IG9jY3VyIGF0IHJ1bnRpbWXAIHVwZ3JhZGUgYm91bmRhcmllcyBvciBpZiBnb3Zlcm5hbmNlIGludGVydmVuZXMuARkGAAAAMAAMRG1wAQxEbXAMVERvd253YXJkTWVzc2FnZVF1ZXVlcwEBBAWxAq0NBAAE0CBUaGUgZG93bndhcmQgbWVzc2FnZXMgYWRkcmVzc2VkIGZvciBhIGNlcnRhaW4gcGFyYS5kRG93bndhcmRNZXNzYWdlUXVldWVIZWFkcwEBBAWxAjSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcJQEgQSBtYXBwaW5nIHRoYXQgc3RvcmVzIHRoZSBkb3dud2FyZCBtZXNzYWdlIHF1ZXVlIE1RQyBoZWFkIGZvciBlYWNoIHBhcmEuAJAgRWFjaCBsaW5rIGluIHRoaXMgY2hhaW4gaGFzIGEgZm9ybTp4IGAocHJldl9oZWFkLCBCLCBIKE0pKWAsIHdoZXJl6CAtIGBwcmV2X2hlYWRgOiBpcyB0aGUgcHJldmlvdXMgaGVhZCBoYXNoIG9yIHplcm8gaWYgbm9uZS4hASAtIGBCYDogaXMgdGhlIHJlbGF5LWNoYWluIGJsb2NrIG51bWJlciBpbiB3aGljaCBhIG1lc3NhZ2Ugd2FzIGFwcGVuZGVkLtQgLSBgSChNKWA6IGlzIHRoZSBoYXNoIG9mIHRoZSBtZXNzYWdlIGJlaW5nIGFwcGVuZGVkLkREZWxpdmVyeUZlZUZhY3RvcgEBBAWxAi0IQAAAZKeztuANAAAAAAAAAAAExCBUaGUgZmFjdG9yIHRvIG11bHRpcGx5IHRoZSBiYXNlIGRlbGl2ZXJ5IGZlZSBieS4AAAAAMQAQSHJtcAEQSHJtcDBcSHJtcE9wZW5DaGFubmVsUmVxdWVzdHMAAQQFIQa1DQQAGLwgVGhlIHNldCBvZiBwZW5kaW5nIEhSTVAgb3BlbiBjaGFubmVsIHJlcXVlc3RzLgDAIFRoZSBzZXQgaXMgYWNjb21wYW5pZWQgYnkgYSBsaXN0IGZvciBpdGVyYXRpb24uACwgSW52YXJpYW50Oj0BIC0gVGhlcmUgYXJlIG5vIGNoYW5uZWxzIHRoYXQgZXhpc3RzIGluIGxpc3QgYnV0IG5vdCBpbiB0aGUgc2V0IGFuZCB2aWNlIHZlcnNhLmxIcm1wT3BlbkNoYW5uZWxSZXF1ZXN0c0xpc3QBALkNBAAAbEhybXBPcGVuQ2hhbm5lbFJlcXVlc3RDb3VudAEBBAWxAhAQAAAAAAxlASBUaGlzIG1hcHBpbmcgdHJhY2tzIGhvdyBtYW55IG9wZW4gY2hhbm5lbCByZXF1ZXN0cyBhcmUgaW5pdGlhdGVkIGJ5IGEgZ2l2ZW4gc2VuZGVyIHBhcmEuWQEgSW52YXJpYW50OiBgSHJtcE9wZW5DaGFubmVsUmVxdWVzdHNgIHNob3VsZCBjb250YWluIHRoZSBzYW1lIG51bWJlciBvZiBpdGVtcyB0aGF0IGhhcwUBIGAoWCwgXylgIGFzIHRoZSBudW1iZXIgb2YgYEhybXBPcGVuQ2hhbm5lbFJlcXVlc3RDb3VudGAgZm9yIGBYYC58SHJtcEFjY2VwdGVkQ2hhbm5lbFJlcXVlc3RDb3VudAEBBAWxAhAQAAAAAAxxASBUaGlzIG1hcHBpbmcgdHJhY2tzIGhvdyBtYW55IG9wZW4gY2hhbm5lbCByZXF1ZXN0cyB3ZXJlIGFjY2VwdGVkIGJ5IGEgZ2l2ZW4gcmVjaXBpZW50IHBhcmEubQEgSW52YXJpYW50OiBgSHJtcE9wZW5DaGFubmVsUmVxdWVzdHNgIHNob3VsZCBjb250YWluIHRoZSBzYW1lIG51bWJlciBvZiBpdGVtcyBgKF8sIFgpYCB3aXRoVQEgYGNvbmZpcm1lZGAgc2V0IHRvIHRydWUsIGFzIHRoZSBudW1iZXIgb2YgYEhybXBBY2NlcHRlZENoYW5uZWxSZXF1ZXN0Q291bnRgIGZvciBgWGAuYEhybXBDbG9zZUNoYW5uZWxSZXF1ZXN0cwABBAUhBgUBBAAccQEgQSBzZXQgb2YgcGVuZGluZyBIUk1QIGNsb3NlIGNoYW5uZWwgcmVxdWVzdHMgdGhhdCBhcmUgZ29pbmcgdG8gYmUgY2xvc2VkIGR1cmluZyB0aGUgc2Vzc2lvbiEBIGNoYW5nZS4gVXNlZCBmb3IgY2hlY2tpbmcgaWYgYSBnaXZlbiBjaGFubmVsIGlzIHJlZ2lzdGVyZWQgZm9yIGNsb3N1cmUuAMAgVGhlIHNldCBpcyBhY2NvbXBhbmllZCBieSBhIGxpc3QgZm9yIGl0ZXJhdGlvbi4ALCBJbnZhcmlhbnQ6PQEgLSBUaGVyZSBhcmUgbm8gY2hhbm5lbHMgdGhhdCBleGlzdHMgaW4gbGlzdCBidXQgbm90IGluIHRoZSBzZXQgYW5kIHZpY2UgdmVyc2EucEhybXBDbG9zZUNoYW5uZWxSZXF1ZXN0c0xpc3QBALkNBAAAOEhybXBXYXRlcm1hcmtzAAEEBbECEAQAELggVGhlIEhSTVAgd2F0ZXJtYXJrIGFzc29jaWF0ZWQgd2l0aCBlYWNoIHBhcmEuLCBJbnZhcmlhbnQ6VQEgLSBlYWNoIHBhcmEgYFBgIHVzZWQgaGVyZSBhcyBhIGtleSBzaG91bGQgc2F0aXNmeSBgUGFyYXM6OmlzX3ZhbGlkX3BhcmEoUClgIHdpdGhpbiBhLCAgIHNlc3Npb24uMEhybXBDaGFubmVscwABBAUhBr0NBAAMtCBIUk1QIGNoYW5uZWwgZGF0YSBhc3NvY2lhdGVkIHdpdGggZWFjaCBwYXJhLiwgSW52YXJpYW50OnUBIC0gZWFjaCBwYXJ0aWNpcGFudCBpbiB0aGUgY2hhbm5lbCBzaG91bGQgc2F0aXNmeSBgUGFyYXM6OmlzX3ZhbGlkX3BhcmEoUClgIHdpdGhpbiBhIHNlc3Npb24uYEhybXBJbmdyZXNzQ2hhbm5lbHNJbmRleAEBBAWxAnkNBAA0cQEgSW5ncmVzcy9lZ3Jlc3MgaW5kZXhlcyBhbGxvdyB0byBmaW5kIGFsbCB0aGUgc2VuZGVycyBhbmQgcmVjZWl2ZXJzIGdpdmVuIHRoZSBvcHBvc2l0ZSBzaWRlLhQgSS5lLgAhASAoYSkgaW5ncmVzcyBpbmRleCBhbGxvd3MgdG8gZmluZCBhbGwgdGhlIHNlbmRlcnMgZm9yIGEgZ2l2ZW4gcmVjaXBpZW50Lh0BIChiKSBlZ3Jlc3MgaW5kZXggYWxsb3dzIHRvIGZpbmQgYWxsIHRoZSByZWNpcGllbnRzIGZvciBhIGdpdmVuIHNlbmRlci4AMCBJbnZhcmlhbnRzOlEBIC0gZm9yIGVhY2ggaW5ncmVzcyBpbmRleCBlbnRyeSBmb3IgYFBgIGVhY2ggaXRlbSBgSWAgaW4gdGhlIGluZGV4IHNob3VsZCBwcmVzZW50IGlueCAgIGBIcm1wQ2hhbm5lbHNgIGFzIGAoSSwgUClgLk0BIC0gZm9yIGVhY2ggZWdyZXNzIGluZGV4IGVudHJ5IGZvciBgUGAgZWFjaCBpdGVtIGBFYCBpbiB0aGUgaW5kZXggc2hvdWxkIHByZXNlbnQgaW54ICAgYEhybXBDaGFubmVsc2AgYXMgYChQLCBFKWAuAQEgLSB0aGVyZSBzaG91bGQgYmUgbm8gb3RoZXIgZGFuZ2xpbmcgY2hhbm5lbHMgaW4gYEhybXBDaGFubmVsc2AuaCAtIHRoZSB2ZWN0b3JzIGFyZSBzb3J0ZWQuXEhybXBFZ3Jlc3NDaGFubmVsc0luZGV4AQEEBbECeQ0EAABMSHJtcENoYW5uZWxDb250ZW50cwEBBAUhBsENBAAIrCBTdG9yYWdlIGZvciB0aGUgbWVzc2FnZXMgZm9yIGVhY2ggY2hhbm5lbC5lASBJbnZhcmlhbnQ6IGNhbm5vdCBiZSBub24tZW1wdHkgaWYgdGhlIGNvcnJlc3BvbmRpbmcgY2hhbm5lbCBpbiBgSHJtcENoYW5uZWxzYCBpcyBgTm9uZWAuSEhybXBDaGFubmVsRGlnZXN0cwEBBAWxAskNBAAYaQEgTWFpbnRhaW5zIGEgbWFwcGluZyB0aGF0IGNhbiBiZSB1c2VkIHRvIGFuc3dlciB0aGUgcXVlc3Rpb246IFdoYXQgcGFyYXMgc2VudCBhIG1lc3NhZ2UgYXTkIHRoZSBnaXZlbiBibG9jayBudW1iZXIgZm9yIGEgZ2l2ZW4gcmVjZWl2ZXIuIEludmFyaWFudHM6qCAtIFRoZSBpbm5lciBgVmVjPFBhcmFJZD5gIGlzIG5ldmVyIGVtcHR5LuggLSBUaGUgaW5uZXIgYFZlYzxQYXJhSWQ+YCBjYW5ub3Qgc3RvcmUgdHdvIHNhbWUgYFBhcmFJZGAubQEgLSBUaGUgb3V0ZXIgdmVjdG9yIGlzIHNvcnRlZCBhc2NlbmRpbmcgYnkgYmxvY2sgbnVtYmVyIGFuZCBjYW5ub3Qgc3RvcmUgdHdvIGl0ZW1zIHdpdGggdGhlVCAgIHNhbWUgYmxvY2sgbnVtYmVyLgEdBgHdCAAB0Q0zADxQYXJhU2Vzc2lvbkluZm8BPFBhcmFTZXNzaW9uSW5mbxRQQXNzaWdubWVudEtleXNVbnNhZmUBANUNBAAMpCBBc3NpZ25tZW50IGtleXMgZm9yIHRoZSBjdXJyZW50IHNlc3Npb24ubQEgTm90ZSB0aGF0IHRoaXMgQVBJIGlzIHByaXZhdGUgZHVlIHRvIGl0IGJlaW5nIHByb25lIHRvICdvZmYtYnktb25lJyBhdCBzZXNzaW9uIGJvdW5kYXJpZXMurCBXaGVuIGluIGRvdWJ0LCB1c2UgYFNlc3Npb25zYCBBUEkgaW5zdGVhZC5URWFybGllc3RTdG9yZWRTZXNzaW9uAQAQEAAAAAAEAQEgVGhlIGVhcmxpZXN0IHNlc3Npb24gZm9yIHdoaWNoIHByZXZpb3VzIHNlc3Npb24gaW5mbyBpcyBzdG9yZWQuIFNlc3Npb25zAAEEBhDZDQQADKQgU2Vzc2lvbiBpbmZvcm1hdGlvbiBpbiBhIHJvbGxpbmcgd2luZG93LjUBIFNob3VsZCBoYXZlIGFuIGVudHJ5IGluIHJhbmdlIGBFYXJsaWVzdFN0b3JlZFNlc3Npb24uLj1DdXJyZW50U2Vzc2lvbkluZGV4YC51ASBEb2VzIG5vdCBoYXZlIGFueSBlbnRyaWVzIGJlZm9yZSB0aGUgc2Vzc2lvbiBpbmRleCBpbiB0aGUgZmlyc3Qgc2Vzc2lvbiBjaGFuZ2Ugbm90aWZpY2F0aW9uLixBY2NvdW50S2V5cwABBAYQAQIEAARxASBUaGUgdmFsaWRhdG9yIGFjY291bnQga2V5cyBvZiB0aGUgdmFsaWRhdG9ycyBhY3RpdmVseSBwYXJ0aWNpcGF0aW5nIGluIHBhcmFjaGFpbiBjb25zZW5zdXMuVFNlc3Npb25FeGVjdXRvclBhcmFtcwABBAYQZQUEAATEIEV4ZWN1dG9yIHBhcmFtZXRlciBzZXQgZm9yIGEgZ2l2ZW4gc2Vzc2lvbiBpbmRleAAAAAA0ADRQYXJhc0Rpc3B1dGVzATRQYXJhc0Rpc3B1dGVzFERMYXN0UHJ1bmVkU2Vzc2lvbgAAEAQACAEBIFRoZSBsYXN0IHBydW5lZCBzZXNzaW9uLCBpZiBhbnkuIEFsbCBkYXRhIHN0b3JlZCBieSB0aGlzIG1vZHVsZVQgcmVmZXJlbmNlcyBzZXNzaW9ucy4gRGlzcHV0ZXMAAQgFAuUN6Q0EAAQFASBBbGwgb25nb2luZyBvciBjb25jbHVkZWQgZGlzcHV0ZXMgZm9yIHRoZSBsYXN0IHNldmVyYWwgc2Vzc2lvbnMuREJhY2tlcnNPbkRpc3B1dGVzAAEIBQLlDe0NBAAInCBCYWNraW5nIHZvdGVzIHN0b3JlZCBmb3IgZWFjaCBkaXNwdXRlLowgVGhpcyBzdG9yYWdlIGlzIHVzZWQgZm9yIHNsYXNoaW5nLiBJbmNsdWRlZAABCAUC5Q0QBAAIRQEgQWxsIGluY2x1ZGVkIGJsb2NrcyBvbiB0aGUgY2hhaW4sIGFzIHdlbGwgYXMgdGhlIGJsb2NrIG51bWJlciBpbiB0aGlzIGNoYWluIHRoYXRZASBzaG91bGQgYmUgcmV2ZXJ0ZWQgYmFjayB0byBpZiB0aGUgY2FuZGlkYXRlIGlzIGRpc3B1dGVkIGFuZCBkZXRlcm1pbmVkIHRvIGJlIGludmFsaWQuGEZyb3plbgEAnAQAEBEBIFdoZXRoZXIgdGhlIGNoYWluIGlzIGZyb3plbi4gU3RhcnRzIGFzIGBOb25lYC4gV2hlbiB0aGlzIGlzIGBTb21lYCw1ASB0aGUgY2hhaW4gd2lsbCBub3QgYWNjZXB0IGFueSBuZXcgcGFyYWNoYWluIGJsb2NrcyBmb3IgYmFja2luZyBvciBpbmNsdXNpb24sCQEgYW5kIGl0cyB2YWx1ZSBpbmRpY2F0ZXMgdGhlIGxhc3QgdmFsaWQgYmxvY2sgbnVtYmVyIGluIHRoZSBjaGFpbi74IEl0IGNhbiBvbmx5IGJlIHNldCBiYWNrIHRvIGBOb25lYCBieSBnb3Zlcm5hbmNlIGludGVydmVudGlvbi4BJQYB4QgAAfENNQA0UGFyYXNTbGFzaGluZwE0UGFyYXNTbGFzaGluZwhAVW5hcHBsaWVkU2xhc2hlcwABCAUC5Q31DQQABJAgVmFsaWRhdG9ycyBwZW5kaW5nIGRpc3B1dGUgc2xhc2hlcy5IVmFsaWRhdG9yU2V0Q291bnRzAAEEBRAQBAAEhCBgVmFsaWRhdG9yU2V0Q291bnRgIHBlciBzZXNzaW9uLgEpBgAAAQUONgBoT25EZW1hbmRBc3NpZ25tZW50UHJvdmlkZXIBaE9uRGVtYW5kQXNzaWdubWVudFByb3ZpZGVyGDhQYXJhSWRBZmZpbml0eQABBAWxAgkOBAAMcQEgTWFwcyBhIGBQYXJhSWRgIHRvIGBDb3JlSW5kZXhgIGFuZCBrZWVwcyB0cmFjayBvZiBob3cgbWFueSBhc3NpZ25tZW50cyB0aGUgc2NoZWR1bGVyIGhhcyBpbl0BIGl0J3MgbG9va2FoZWFkLiBLZWVwaW5nIHRyYWNrIG9mIHRoaXMgYWZmaW5pdHkgcHJldmVudHMgcGFyYWxsZWwgZXhlY3V0aW9uIG9mIHRoZSBzYW1lnCBgUGFyYUlkYCBvbiB0d28gb3IgbW9yZSBgQ29yZUluZGV4YGVzLixRdWV1ZVN0YXR1cwEADQ5kAABkp7O24A0AAAAAAAAAAAAAAAAAAAAAAATcIE92ZXJhbGwgc3RhdHVzIG9mIHF1ZXVlIChib3RoIGZyZWUgKyBhZmZpbml0eSBlbnRyaWVzKSxGcmVlRW50cmllcwEAIQ4EAARhASBQcmlvcml0eSBxdWV1ZSBmb3IgYWxsIG9yZGVycyB3aGljaCBkb24ndCB5ZXQgKG9yIG5vdCBhbnkgbW9yZSkgaGF2ZSBhbnkgY29yZSBhZmZpbml0eS48QWZmaW5pdHlFbnRyaWVzAQEEBdEIIQ4EAARJASBRdWV1ZSBlbnRyaWVzIHRoYXQgYXJlIGN1cnJlbnRseSBib3VuZCB0byBhIHBhcnRpY3VsYXIgY29yZSBkdWUgdG8gY29yZSBhZmZpbml0eS4cUmV2ZW51ZQEALQ4EAAT8IEtlZXBzIHRyYWNrIG9mIGFjY3VtdWxhdGVkIHJldmVudWUgZnJvbSBvbiBkZW1hbmQgb3JkZXIgc2FsZXMuHENyZWRpdHMBAQQCABhAAAAAAAAAAAAAAAAAAAAAAAS4IEtlZXBzIHRyYWNrIG9mIGNyZWRpdHMgb3duZWQgYnkgZWFjaCBhY2NvdW50LgE5BgHtCAxMVHJhZmZpY0RlZmF1bHRWYWx1ZS0IQAAAZKeztuANAAAAAAAAAAAEzCBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIHNwb3QgdHJhZmZpYyBtdWx0aXBsaWVyLlBNYXhIaXN0b3JpY2FsUmV2ZW51ZRAQoAAAAAjUIFRoZSBtYXhpbXVtIG51bWJlciBvZiBibG9ja3Mgc29tZSBoaXN0b3JpY2FsIHJldmVudWVgIGluZm9ybWF0aW9uIHN0b3JlZCBmb3IuIFBhbGxldElkLQwgcHkvb25kbWQEtCBJZGVudGlmaWVyIGZvciB0aGUgaW50ZXJuYWwgcmV2ZW51ZSBiYWxhbmNlLgE1DjgAaENvcmV0aW1lQXNzaWdubWVudFByb3ZpZGVyAWhDb3JldGltZUFzc2lnbm1lbnRQcm92aWRlcgg0Q29yZVNjaGVkdWxlcwABBAQ5Dj0OBAAQbCBTY2hlZHVsZWQgYXNzaWdubWVudCBzZXRzLgBtASBBc3NpZ25tZW50cyBhcyBvZiB0aGUgZ2l2ZW4gYmxvY2sgbnVtYmVyLiBUaGV5IHdpbGwgZ28gaW50byBzdGF0ZSBvbmNlIHRoZSBibG9jayBudW1iZXIgaXPQIHJlYWNoZWQgKGFuZCByZXBsYWNlIHdoYXRldmVyIHdhcyBpbiB0aGVyZSBiZWZvcmUpLjxDb3JlRGVzY3JpcHRvcnMBAQQE0QhBDggAABCgIEFzc2lnbm1lbnRzIHdoaWNoIGFyZSBjdXJyZW50bHkgYWN0aXZlLgBpASBUaGV5IHdpbGwgYmUgcGlja2VkIGZyb20gYFBlbmRpbmdBc3NpZ25tZW50c2Agb25jZSB3ZSByZWFjaCB0aGUgc2NoZWR1bGVkIGJsb2NrIG51bWJlciBpblggYFBlbmRpbmdBc3NpZ25tZW50c2AuAAAAAWEOOQAkUmVnaXN0cmFyASRSZWdpc3RyYXIMLFBlbmRpbmdTd2FwAAEEBbECsQIEAARkIFBlbmRpbmcgc3dhcCBvcGVyYXRpb25zLhRQYXJhcwABBAWxAmUOBAAQBQEgQW1vdW50IGhlbGQgb24gZGVwb3NpdCBmb3IgZWFjaCBwYXJhIGFuZCB0aGUgb3JpZ2luYWwgZGVwb3NpdG9yLgBxASBUaGUgZ2l2ZW4gYWNjb3VudCBJRCBpcyByZXNwb25zaWJsZSBmb3IgcmVnaXN0ZXJpbmcgdGhlIGNvZGUgYW5kIGluaXRpYWwgaGVhZCBkYXRhLCBidXQgbWF5VQEgb25seSBkbyBzbyBpZiBpdCBpc24ndCB5ZXQgcmVnaXN0ZXJlZC4gKEFmdGVyIHRoYXQsIGl0J3MgdXAgdG8gZ292ZXJuYW5jZSB0byBkbyBzby4pOE5leHRGcmVlUGFyYUlkAQCxAhAAAAAABGAgVGhlIG5leHQgZnJlZSBgUGFyYUlkYC4BPQYB8QgILFBhcmFEZXBvc2l0GEAAQOWcMBIAAAAAAAAAAAAACNQgVGhlIGRlcG9zaXQgdG8gYmUgcGFpZCB0byBydW4gYSBvbi1kZW1hbmQgcGFyYWNoYWluLj0BIFRoaXMgc2hvdWxkIGluY2x1ZGUgdGhlIGNvc3QgZm9yIHN0b3JpbmcgdGhlIGdlbmVzaXMgaGVhZCBhbmQgdmFsaWRhdGlvbiBjb2RlLkhEYXRhRGVwb3NpdFBlckJ5dGUYQIDw+gIAAAAAAAAAAAAAAAAExCBUaGUgZGVwb3NpdCB0byBiZSBwYWlkIHBlciBieXRlIHN0b3JlZCBvbiBjaGFpbi4BaQ48ABRTbG90cwEUU2xvdHMEGExlYXNlcwEBBAWxAm0OBABAFQEgQW1vdW50cyBoZWxkIG9uIGRlcG9zaXQgZm9yIGVhY2ggKHBvc3NpYmx5IGZ1dHVyZSkgbGVhc2VkIHBhcmFjaGFpbi4AYQEgVGhlIGFjdHVhbCBhbW91bnQgbG9ja2VkIG9uIGl0cyBiZWhhbGYgYnkgYW55IGFjY291bnQgYXQgYW55IHRpbWUgaXMgdGhlIG1heGltdW0gb2YgdGhlKQEgc2Vjb25kIHZhbHVlcyBvZiB0aGUgaXRlbXMgaW4gdGhpcyBsaXN0IHdob3NlIGZpcnN0IHZhbHVlIGlzIHRoZSBhY2NvdW50LgBhASBUaGUgZmlyc3QgaXRlbSBpbiB0aGUgbGlzdCBpcyB0aGUgYW1vdW50IGxvY2tlZCBmb3IgdGhlIGN1cnJlbnQgTGVhc2UgUGVyaW9kLiBGb2xsb3dpbmewIGl0ZW1zIGFyZSBmb3IgdGhlIHN1YnNlcXVlbnQgbGVhc2UgcGVyaW9kcy4AYQEgVGhlIGRlZmF1bHQgdmFsdWUgKGFuIGVtcHR5IGxpc3QpIGltcGxpZXMgdGhhdCB0aGUgcGFyYWNoYWluIG5vIGxvbmdlciBleGlzdHMgKG9yIG5ldmVytCBleGlzdGVkKSBhcyBmYXIgYXMgdGhpcyBwYWxsZXQgaXMgY29uY2VybmVkLgBRASBJZiBhIHBhcmFjaGFpbiBkb2Vzbid0IGV4aXN0ICp5ZXQqIGJ1dCBpcyBzY2hlZHVsZWQgdG8gZXhpc3QgaW4gdGhlIGZ1dHVyZSwgdGhlbiBpdGEBIHdpbGwgYmUgbGVmdC1wYWRkZWQgd2l0aCBvbmUgb3IgbW9yZSBgTm9uZWBzIHRvIGRlbm90ZSB0aGUgZmFjdCB0aGF0IG5vdGhpbmcgaXMgaGVsZCBvbl0BIGRlcG9zaXQgZm9yIHRoZSBub24tZXhpc3RlbnQgY2hhaW4gY3VycmVudGx5LCBidXQgaXMgaGVsZCBhdCBzb21lIHBvaW50IGluIHRoZSBmdXR1cmUuANwgSXQgaXMgaWxsZWdhbCBmb3IgYSBgTm9uZWAgdmFsdWUgdG8gdHJhaWwgaW4gdGhlIGxpc3QuAUEGAfUICCxMZWFzZVBlcmlvZBAQACcGAATcIFRoZSBudW1iZXIgb2YgYmxvY2tzIG92ZXIgd2hpY2ggYSBzaW5nbGUgcGVyaW9kIGxhc3RzLixMZWFzZU9mZnNldBAQAAAAAATUIFRoZSBudW1iZXIgb2YgYmxvY2tzIHRvIG9mZnNldCBlYWNoIGxlYXNlIHBlcmlvZCBieS4BcQ49AEBQYXJhc1N1ZG9XcmFwcGVyAAFFBgAAAXUOPgAgQXVjdGlvbnMBIEF1Y3Rpb25zEDhBdWN0aW9uQ291bnRlcgEAEBAAAAAABIwgTnVtYmVyIG9mIGF1Y3Rpb25zIHN0YXJ0ZWQgc28gZmFyLixBdWN0aW9uSW5mbwAAJQEEABT4IEluZm9ybWF0aW9uIHJlbGF0aW5nIHRvIHRoZSBjdXJyZW50IGF1Y3Rpb24sIGlmIHRoZXJlIGlzIG9uZS4ARQEgVGhlIGZpcnN0IGl0ZW0gaW4gdGhlIHR1cGxlIGlzIHRoZSBsZWFzZSBwZXJpb2QgaW5kZXggdGhhdCB0aGUgZmlyc3Qgb2YgdGhlIGZvdXJRASBjb250aWd1b3VzIGxlYXNlIHBlcmlvZHMgb24gYXVjdGlvbiBpcyBmb3IuIFRoZSBzZWNvbmQgaXMgdGhlIGJsb2NrIG51bWJlciB3aGVuIHRoZV0BIGF1Y3Rpb24gd2lsbCAiYmVnaW4gdG8gZW5kIiwgaS5lLiB0aGUgZmlyc3QgYmxvY2sgb2YgdGhlIEVuZGluZyBQZXJpb2Qgb2YgdGhlIGF1Y3Rpb24uPFJlc2VydmVkQW1vdW50cwABBAV5DhgEAAgxASBBbW91bnRzIGN1cnJlbnRseSByZXNlcnZlZCBpbiB0aGUgYWNjb3VudHMgb2YgdGhlIGJpZGRlcnMgY3VycmVudGx5IHdpbm5pbmc4IChzdWItKXJhbmdlcy4cV2lubmluZwABBAUQfQ4EAAxhASBUaGUgd2lubmluZyBiaWRzIGZvciBlYWNoIG9mIHRoZSAxMCByYW5nZXMgYXQgZWFjaCBzYW1wbGUgaW4gdGhlIGZpbmFsIEVuZGluZyBQZXJpb2Qgb2ZJASB0aGUgY3VycmVudCBhdWN0aW9uLiBUaGUgbWFwJ3Mga2V5IGlzIHRoZSAwLWJhc2VkIGluZGV4IGludG8gdGhlIFNhbXBsZSBTaXplLiBUaGUdASBmaXJzdCBzYW1wbGUgb2YgdGhlIGVuZGluZyBwZXJpb2QgaXMgMDsgdGhlIGxhc3QgaXMgYFNhbXBsZSBTaXplIC0gMWAuAXkHAfkIEDBFbmRpbmdQZXJpb2QQEEAZAQAEHQEgVGhlIG51bWJlciBvZiBibG9ja3Mgb3ZlciB3aGljaCBhbiBhdWN0aW9uIG1heSBiZSByZXRyb2FjdGl2ZWx5IGVuZGVkLjBTYW1wbGVMZW5ndGgQEBQAAAAM8CBUaGUgbGVuZ3RoIG9mIGVhY2ggc2FtcGxlIHRvIHRha2UgZHVyaW5nIHRoZSBlbmRpbmcgcGVyaW9kLgDUIGBFbmRpbmdQZXJpb2RgIC8gYFNhbXBsZUxlbmd0aGAgPSBUb3RhbCAjIG9mIFNhbXBsZXM4U2xvdFJhbmdlQ291bnQQECQAAAAATExlYXNlUGVyaW9kc1BlclNsb3QQEAgAAAAAAYkOPwAkQ3Jvd2Rsb2FuASRDcm93ZGxvYW4QFEZ1bmRzAAEEBbECjQ4EAARoIEluZm8gb24gYWxsIG9mIHRoZSBmdW5kcy4gTmV3UmFpc2UBAHkNBAAIVQEgVGhlIGZ1bmRzIHRoYXQgaGF2ZSBoYWQgYWRkaXRpb25hbCBjb250cmlidXRpb25zIGR1cmluZyB0aGUgbGFzdCBibG9jay4gVGhpcyBpcyB1c2VkFQEgaW4gb3JkZXIgdG8gZGV0ZXJtaW5lIHdoaWNoIGZ1bmRzIHNob3VsZCBzdWJtaXQgbmV3IG9yIHVwZGF0ZWQgYmlkcy4wRW5kaW5nc0NvdW50AQAQEAAAAAAEKQEgVGhlIG51bWJlciBvZiBhdWN0aW9ucyB0aGF0IGhhdmUgZW50ZXJlZCBpbnRvIHRoZWlyIGVuZGluZyBwZXJpb2Qgc28gZmFyLjROZXh0RnVuZEluZGV4AQAQEAAAAAAEqCBUcmFja2VyIGZvciB0aGUgbmV4dCBhdmFpbGFibGUgZnVuZCBpbmRleAGBBwH9CAwgUGFsbGV0SWQtDCBweS9jZnVuZAgNASBgUGFsbGV0SWRgIGZvciB0aGUgY3Jvd2Rsb2FuIHBhbGxldC4gQW4gYXBwcm9wcmlhdGUgdmFsdWUgY291bGQgYmVkIGBQYWxsZXRJZCgqYiJweS9jZnVuZCIpYDxNaW5Db250cmlidXRpb24YQAAQpdToAAAAAAAAAAAAAAAIYQEgVGhlIG1pbmltdW0gYW1vdW50IHRoYXQgbWF5IGJlIGNvbnRyaWJ1dGVkIGludG8gYSBjcm93ZGxvYW4uIFNob3VsZCBhbG1vc3QgY2VydGFpbmx5IGJlfCBhdCBsZWFzdCBgRXhpc3RlbnRpYWxEZXBvc2l0YC48UmVtb3ZlS2V5c0xpbWl0EBD0AQAABOQgTWF4IG51bWJlciBvZiBzdG9yYWdlIGtleXMgdG8gcmVtb3ZlIHBlciBleHRyaW5zaWMgY2FsbC4BlQ5AADRBc3NpZ25lZFNsb3RzATRBc3NpZ25lZFNsb3RzHDhQZXJtYW5lbnRTbG90cwABBAWxAiUBBAAEHQEgQXNzaWduZWQgcGVybWFuZW50IHNsb3RzLCB3aXRoIHRoZWlyIHN0YXJ0IGxlYXNlIHBlcmlvZCwgYW5kIGR1cmF0aW9uLkhQZXJtYW5lbnRTbG90Q291bnQBABAQAAAAAATEIE51bWJlciBvZiBhc3NpZ25lZCAoYW5kIGFjdGl2ZSkgcGVybWFuZW50IHNsb3RzLjhUZW1wb3JhcnlTbG90cwABBAWxApkOBAAEaCBBc3NpZ25lZCB0ZW1wb3Jhcnkgc2xvdHMuSFRlbXBvcmFyeVNsb3RDb3VudAEAEBAAAAAABJAgTnVtYmVyIG9mIGFzc2lnbmVkIHRlbXBvcmFyeSBzbG90cy5gQWN0aXZlVGVtcG9yYXJ5U2xvdENvdW50AQAQEAAAAAAE/CBOdW1iZXIgb2YgYWN0aXZlIHRlbXBvcmFyeSBzbG90cyBpbiBjdXJyZW50IHNsb3QgbGVhc2UgcGVyaW9kLkRNYXhUZW1wb3JhcnlTbG90cwEAEBAAAAAABOQgIFRoZSBtYXggbnVtYmVyIG9mIHRlbXBvcmFyeSBzbG90cyB0aGF0IGNhbiBiZSBhc3NpZ25lZC5ETWF4UGVybWFuZW50U2xvdHMBABAQAAAAAATgIFRoZSBtYXggbnVtYmVyIG9mIHBlcm1hbmVudCBzbG90cyB0aGF0IGNhbiBiZSBhc3NpZ25lZC4BjQcBAQkMeFBlcm1hbmVudFNsb3RMZWFzZVBlcmlvZExlbmd0aBAQGgAAAAT4IFRoZSBudW1iZXIgb2YgbGVhc2UgcGVyaW9kcyBhIHBlcm1hbmVudCBwYXJhY2hhaW4gc2xvdCBsYXN0cy54VGVtcG9yYXJ5U2xvdExlYXNlUGVyaW9kTGVuZ3RoEBABAAAABPggVGhlIG51bWJlciBvZiBsZWFzZSBwZXJpb2RzIGEgdGVtcG9yYXJ5IHBhcmFjaGFpbiBzbG90IGxhc3RzLnhNYXhUZW1wb3JhcnlTbG90UGVyTGVhc2VQZXJpb2QQEAUAAAAEFQEgVGhlIG1heCBudW1iZXIgb2YgdGVtcG9yYXJ5IHNsb3RzIHRvIGJlIHNjaGVkdWxlZCBwZXIgbGVhc2UgcGVyaW9kcy4BnQ5BACBDb3JldGltZQABlQcBBQkIIEJyb2tlcklkEBDtAwAABIggVGhlIFBhcmFJZCBvZiB0aGUgY29yZXRpbWUgY2hhaW4uREJyb2tlclBvdExvY2F0aW9uvQKMAQEAbW9kbHB5L2Jyb2tlAAAAAAAAAAAAAAAAAAAAAAAAAAAEhCBUaGUgY29yZXRpbWUgY2hhaW4gcG90IGxvY2F0aW9uLgGhDkIAPFN0YWtpbmdBaENsaWVudAE8U3Rha2luZ0FoQ2xpZW50HDBWYWxpZGF0b3JTZXQAAKUOBAAM+CBUaGUgcXVldWVkIHZhbGlkYXRvciBzZXRzIGZvciBhIGdpdmVuIHBsYW5uaW5nIHNlc3Npb24gaW5kZXguAKwgVGhpcyBpcyByZWNlaXZlZCB2aWEgYSBjYWxsIGZyb20gQXNzZXRIdWIucEluY29tcGxldGVWYWxpZGF0b3JTZXRSZXBvcnQAAK0HBAAEkCBBbiBpbmNvbXBsZXRlIHZhbGlkYXRvciBzZXQgcmVwb3J0LjxWYWxpZGF0b3JQb2ludHMBAQQFABAQAAAAABCUIEFsbCBvZiB0aGUgcG9pbnRzIG9mIHRoZSB2YWxpZGF0b3JzLgBhASBUaGlzIGlzIHBvcHVsYXRlZCBkdXJpbmcgYSBzZXNzaW9uLCBhbmQgaXMgZmx1c2hlZCBhbmQgc2VudCBvdmVyIHZpYSBbYFNlbmRUb0Fzc2V0SHViYF1UIGF0IGVhY2ggc2Vzc2lvbiBlbmQuEE1vZGUBALEHBAAQ0CBJbmRpY2F0ZXMgdGhlIGN1cnJlbnQgb3BlcmF0aW5nIG1vZGUgb2YgdGhlIHBhbGxldC4AcQEgVGhpcyB2YWx1ZSBkZXRlcm1pbmVzIGhvdyB0aGUgcGFsbGV0IGJlaGF2ZXMgaW4gcmVzcG9uc2UgdG8gaW5jb21pbmcgYW5kIG91dGdvaW5nIG1lc3NhZ2VzLGkBIHBhcnRpY3VsYXJseSB3aGV0aGVyIGl0IHNob3VsZCBleGVjdXRlIGxvZ2ljIGRpcmVjdGx5LCBkZWZlciBpdCwgb3IgZGVsZWdhdGUgaXQgZW50aXJlbHkucE5leHRTZXNzaW9uQ2hhbmdlc1ZhbGlkYXRvcnMAABAEACBpASBBIHN0b3JhZ2UgdmFsdWUgdGhhdCBpcyBzZXQgd2hlbiBhIGBuZXdfc2Vzc2lvbmAgZ2l2ZXMgYSBuZXcgdmFsaWRhdG9yIHNldCB0byB0aGUgc2Vzc2lvbqQgcGFsbGV0LCBhbmQgaXMgY2xlYXJlZCBvbiB0aGUgbmV4dCBjYWxsLgBtASBUaGUgaW5uZXIgdTMyIGlzIHRoZSBpZCBvZiB0aGUgc2FpZCBhY3RpdmF0ZWQgdmFsaWRhdG9yIHNldC4gV2hpbGUgbm90IHJlbGV2YW50IGhlcmUsIGdvb2T8IHRvIGtub3cgdGhpcyBpcyB0aGUgcGxhbm5pbmcgZXJhIGluZGV4IG9mIHN0YWtpbmctYXN5bmMgb24gQUguAFkBIE9uY2UgY2xlYXJlZCwgd2Uga25vdyBhIHZhbGlkYXRvciBzZXQgaGFzIGJlZW4gYWN0aXZhdGVkLCBhbmQgdGhlcmVmb3JlIHdlIGNhbiBzZW5kIGFEIHRpbWVzdGFtcCB0byBBSC5UVmFsaWRhdG9yU2V0QXBwbGllZEF0AAAQBAAQJQEgVGhlIHNlc3Npb24gaW5kZXggYXQgd2hpY2ggdGhlIGxhdGVzdCBlbGVjdGVkIHZhbGlkYXRvciBzZXQgd2FzIGFwcGxpZWQuAHUBIFRoaXMgaXMgdXNlZCB0byBkZXRlcm1pbmUgaWYgYW4gb2ZmZW5jZSwgZ2l2ZW4gYSBzZXNzaW9uIGluZGV4LCBpcyBpbiB0aGUgY3VycmVudCBhY3RpdmUgZXJhICBvciBub3QuQEJ1ZmZlcmVkT2ZmZW5jZXMBAKkOBAAo+CBPZmZlbmNlcyBjb2xsZWN0ZWQgd2hpbGUgaW4gW2BPcGVyYXRpbmdNb2RlOjpCdWZmZXJlZGBdIG1vZGUuAHUBIFRoZXNlIGFyZSB0ZW1wb3JhcmlseSBzdG9yZWQgYW5kIHNlbnQgb25jZSB0aGUgcGFsbGV0IHN3aXRjaGVzIHRvIFtgT3BlcmF0aW5nTW9kZTo6QWN0aXZlYF0u+CBGb3IgZWFjaCBvZmZlbmRlciwgb25seSB0aGUgaGlnaGVzdCBgc2xhc2hfZnJhY3Rpb25gIGlzIGtlcHQuAKAgSW50ZXJuYWxseSBzdG9yZXMgYXMgYSBuZXN0ZWQgQlRyZWVNYXA69CBgc2Vzc2lvbl9pbmRleCAtPiAob2ZmZW5kZXIgLT4gKHJlcG9ydGVyLCBzbGFzaF9mcmFjdGlvbikpYC4AcQEgTm90ZTogV2hpbGUgdGhlIFtgcmNfY2xpZW50OjpPZmZlbmNlYF0gdHlwZSBpbmNsdWRlcyBhIGxpc3Qgb2YgcmVwb3J0ZXJzLCBpbiBwcmFjdGljZSB0aGVyZW0BIGlzIG9ubHkgb25lLiBJbiB0aGlzIHBhbGxldCwgd2UgYXNzdW1lIHRoaXMgaXMgdGhlIGNhc2UgYW5kIHN0b3JlIG9ubHkgdGhlIGZpcnN0IHJlcG9ydGVyLgGpBwEJCQABxQ5DAFBNdWx0aUJsb2NrTWlncmF0aW9ucwFQTXVsdGlCbG9ja01pZ3JhdGlvbnMIGEN1cnNvcgAAvQcEAAzYIFRoZSBjdXJyZW50bHkgYWN0aXZlIG1pZ3JhdGlvbiB0byBydW4gYW5kIGl0cyBjdXJzb3IuALwgYE5vbmVgIGluZGljYXRlcyB0aGF0IG5vIG1pZ3JhdGlvbiBpcyBydW5uaW5nLiBIaXN0b3JpYwABBAXRBwUBBAAQtCBTZXQgb2YgYWxsIHN1Y2Nlc3NmdWxseSBleGVjdXRlZCBtaWdyYXRpb25zLgBxASBUaGlzIGlzIHVzZWQgYXMgYmxhY2tsaXN0LCB0byBub3QgcmUtZXhlY3V0ZSBtaWdyYXRpb25zIHRoYXQgaGF2ZSBub3QgYmVlbiByZW1vdmVkIGZyb20gdGhlMQEgY29kZWJhc2UgeWV0LiBHb3Zlcm5hbmNlIGNhbiByZWd1bGFybHkgY2xlYXIgdGhpcyBvdXQgdmlhIGBjbGVhcl9oaXN0b3JpY2AuAbUHAREJCDBDdXJzb3JNYXhMZW4QEAAAAQAQpCBUaGUgbWF4aW1hbCBsZW5ndGggb2YgYW4gZW5jb2RlZCBjdXJzb3IuAGUBIEEgZ29vZCBkZWZhdWx0IG5lZWRzIHRvIHNlbGVjdGVkIHN1Y2ggdGhhdCBubyBtaWdyYXRpb24gd2lsbCBldmVyIGhhdmUgYSBjdXJzb3Igd2l0aCBNRUwJASBhYm92ZSB0aGlzIGxpbWl0LiBUaGlzIGlzIHN0YXRpY2FsbHkgY2hlY2tlZCBpbiBgaW50ZWdyaXR5X3Rlc3RgLkBJZGVudGlmaWVyTWF4TGVuEBAAAQAAELQgVGhlIG1heGltYWwgbGVuZ3RoIG9mIGFuIGVuY29kZWQgaWRlbnRpZmllci4AVQEgQSBnb29kIGRlZmF1bHQgbmVlZHMgdG8gc2VsZWN0ZWQgc3VjaCB0aGF0IG5vIG1pZ3JhdGlvbiB3aWxsIGV2ZXIgaGF2ZSBhbiBpZGVudGlmaWVyLQEgd2l0aCBNRUwgYWJvdmUgdGhpcyBsaW1pdC4gVGhpcyBpcyBzdGF0aWNhbGx5IGNoZWNrZWQgaW4gYGludGVncml0eV90ZXN0YC4ByQ5iACRYY21QYWxsZXQBJFhjbVBhbGxldDwwUXVlcnlDb3VudGVyAQAwIAAAAAAAAAAABIggVGhlIGxhdGVzdCBhdmFpbGFibGUgcXVlcnkgaW5kZXguHFF1ZXJpZXMAAQQCMM0OBAAEVCBUaGUgb25nb2luZyBxdWVyaWVzLihBc3NldFRyYXBzAQEEBjQQEAAAAAAQaCBUaGUgZXhpc3RpbmcgYXNzZXQgdHJhcHMuAGEBIEtleSBpcyB0aGUgYmxha2UyIDI1NiBoYXNoIG9mIChvcmlnaW4sIHZlcnNpb25lZCBgQXNzZXRzYCkgcGFpci4gVmFsdWUgaXMgdGhlIG51bWJlciBvZh0BIHRpbWVzIHRoaXMgcGFpciBoYXMgYmVlbiB0cmFwcGVkICh1c3VhbGx5IGp1c3QgMSBpZiBpdCBleGlzdHMgYXQgYWxsKS44U2FmZVhjbVZlcnNpb24AABAEAAhhASBEZWZhdWx0IHZlcnNpb24gdG8gZW5jb2RlIFhDTSB3aGVuIGxhdGVzdCB2ZXJzaW9uIG9mIGRlc3RpbmF0aW9uIGlzIHVua25vd24uIElmIGBOb25lYCw9ASB0aGVuIHRoZSBkZXN0aW5hdGlvbnMgd2hvc2UgWENNIHZlcnNpb24gaXMgdW5rbm93biBhcmUgY29uc2lkZXJlZCB1bnJlYWNoYWJsZS5AU3VwcG9ydGVkVmVyc2lvbgABCAUC4Q4QBAAE8CBUaGUgTGF0ZXN0IHZlcnNpb25zIHRoYXQgd2Uga25vdyB2YXJpb3VzIGxvY2F0aW9ucyBzdXBwb3J0LkBWZXJzaW9uTm90aWZpZXJzAAEIBQLhDjAEAAQFASBBbGwgbG9jYXRpb25zIHRoYXQgd2UgaGF2ZSByZXF1ZXN0ZWQgdmVyc2lvbiBub3RpZmljYXRpb25zIGZyb20uUFZlcnNpb25Ob3RpZnlUYXJnZXRzAAEIBQLhDuUOBAAIcQEgVGhlIHRhcmdldCBsb2NhdGlvbnMgdGhhdCBhcmUgc3Vic2NyaWJlZCB0byBvdXIgdmVyc2lvbiBjaGFuZ2VzLCBhcyB3ZWxsIGFzIHRoZSBtb3N0IHJlY2VudJQgb2Ygb3VyIHZlcnNpb25zIHdlIGluZm9ybWVkIHRoZW0gb2YuVFZlcnNpb25EaXNjb3ZlcnlRdWV1ZQEA6Q4EAAxlASBEZXN0aW5hdGlvbnMgd2hvc2UgbGF0ZXN0IFhDTSB2ZXJzaW9uIHdlIHdvdWxkIGxpa2UgdG8ga25vdy4gRHVwbGljYXRlcyBub3QgYWxsb3dlZCwgYW5kcQEgdGhlIGB1MzJgIGNvdW50ZXIgaXMgdGhlIG51bWJlciBvZiB0aW1lcyB0aGF0IGEgc2VuZCB0byB0aGUgZGVzdGluYXRpb24gaGFzIGJlZW4gYXR0ZW1wdGVkLIwgd2hpY2ggaXMgdXNlZCBhcyBhIHByaW9yaXRpemF0aW9uLkBDdXJyZW50TWlncmF0aW9uAAD1DgQABJwgVGhlIGN1cnJlbnQgbWlncmF0aW9uJ3Mgc3RhZ2UsIGlmIGFueS5UUmVtb3RlTG9ja2VkRnVuZ2libGVzAAEMBQIC+Q79DgQABPAgRnVuZ2libGUgYXNzZXRzIHdoaWNoIHdlIGtub3cgYXJlIGxvY2tlZCBvbiBhIHJlbW90ZSBjaGFpbi48TG9ja2VkRnVuZ2libGVzAAEEAgANDwQABOAgRnVuZ2libGUgYXNzZXRzIHdoaWNoIHdlIGtub3cgYXJlIGxvY2tlZCBvbiB0aGlzIGNoYWluLlRYY21FeGVjdXRpb25TdXNwZW5kZWQBACAEAAS0IEdsb2JhbCBzdXNwZW5zaW9uIHN0YXRlIG9mIHRoZSBYQ00gZXhlY3V0b3IuPFNob3VsZFJlY29yZFhjbQEAIAQAHFkBIFdoZXRoZXIgb3Igbm90IGluY29taW5nIFhDTXMgKGJvdGggZXhlY3V0ZWQgbG9jYWxseSBhbmQgcmVjZWl2ZWQpIHNob3VsZCBiZSByZWNvcmRlZC7EIE9ubHkgb25lIFhDTSBwcm9ncmFtIHdpbGwgYmUgcmVjb3JkZWQgYXQgYSB0aW1lLikBIFRoaXMgaXMgbWVhbnQgdG8gYmUgdXNlZCBpbiBydW50aW1lIEFQSXMsIGFuZCBpdCdzIGFkdmlzZWQgaXQgc3RheXMgZmFsc2UNASBmb3IgYWxsIG90aGVyIHVzZSBjYXNlcywgc28gYXMgdG8gbm90IGRlZ3JhZGUgcmVndWxhciBwZXJmb3JtYW5jZS4AWQEgT25seSByZWxldmFudCBpZiB0aGlzIHBhbGxldCBpcyBiZWluZyB1c2VkIGFzIHRoZSBbYHhjbV9leGVjdXRvcjo6dHJhaXRzOjpSZWNvcmRYY21gXcggaW1wbGVtZW50YXRpb24gaW4gdGhlIFhDTSBleGVjdXRvciBjb25maWd1cmF0aW9uLixSZWNvcmRlZFhjbQAAAQcEABhJASBJZiBbYFNob3VsZFJlY29yZFhjbWBdIGlzIHNldCB0byB0cnVlLCB0aGVuIHRoZSBsYXN0IFhDTSBwcm9ncmFtIGV4ZWN1dGVkIGxvY2FsbHlUIHdpbGwgYmUgc3RvcmVkIGhlcmUuKQEgUnVudGltZSBBUElzIGNhbiBmZXRjaCB0aGUgWENNIHRoYXQgd2FzIGV4ZWN1dGVkIGJ5IGFjY2Vzc2luZyB0aGlzIHZhbHVlLgBZASBPbmx5IHJlbGV2YW50IGlmIHRoaXMgcGFsbGV0IGlzIGJlaW5nIHVzZWQgYXMgdGhlIFtgeGNtX2V4ZWN1dG9yOjp0cmFpdHM6OlJlY29yZFhjbWBdyCBpbXBsZW1lbnRhdGlvbiBpbiB0aGUgWENNIGV4ZWN1dG9yIGNvbmZpZ3VyYXRpb24uREF1dGhvcml6ZWRBbGlhc2VzAAEEAlkFGQ8EAAxlASBNYXAgb2YgYXV0aG9yaXplZCBhbGlhc2VycyBvZiBsb2NhbCBvcmlnaW5zLiBFYWNoIGxvY2FsIGxvY2F0aW9uIGNhbiBhdXRob3JpemUgYSBsaXN0IG9mWQEgb3RoZXIgbG9jYXRpb25zIHRvIGFsaWFzIGludG8gaXQuIEVhY2ggYWxpYXNlciBpcyBvbmx5IHZhbGlkIHVudGlsIGl0cyBpbm5lciBgZXhwaXJ5YDggYmxvY2sgbnVtYmVyLgHdBwEVCRBEVW5pdmVyc2FsTG9jYXRpb269AowBCQDhQ/I4A6xQ6Pb45iaV0c6eTh1oqjbBzSz9FTQCE/NCPgSEIFRoaXMgY2hhaW4ncyBVbml2ZXJzYWwgTG9jYXRpb24uUEFkdmVydGlzZWRYY21WZXJzaW9uEBAFAAAACCUBIFRoZSBsYXRlc3Qgc3VwcG9ydGVkIHZlcnNpb24gdGhhdCB3ZSBhZHZlcnRpc2UuIEdlbmVyYWxseSBqdXN0IHNldCBpdCB0b4QgYHBhbGxldF94Y206OkN1cnJlbnRYY21WZXJzaW9uYC4oTWF4TG9ja2VycxAQCAAAAAQZASBUaGUgbWF4aW11bSBudW1iZXIgb2YgbG9jYWwgWENNIGxvY2tzIHRoYXQgYSBzaW5nbGUgYWNjb3VudCBtYXkgaGF2ZS5YTWF4UmVtb3RlTG9ja0NvbnN1bWVycxAQAAAAAAT8IFRoZSBtYXhpbXVtIG51bWJlciBvZiBjb25zdW1lcnMgYSBzaW5nbGUgcmVtb3RlIGxvY2sgbWF5IGhhdmUuATEPYwAwTWVzc2FnZVF1ZXVlATBNZXNzYWdlUXVldWUMMEJvb2tTdGF0ZUZvcgEBBAUhCDkPdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMwgVGhlIGluZGV4IG9mIHRoZSBmaXJzdCBhbmQgbGFzdCAobm9uLWVtcHR5KSBwYWdlcy4sU2VydmljZUhlYWQAACEIBAAEvCBUaGUgb3JpZ2luIGF0IHdoaWNoIHdlIHNob3VsZCBiZWdpbiBzZXJ2aWNpbmcuFFBhZ2VzAAEIBQVFD0kPBAAEiCBUaGUgbWFwIG9mIHBhZ2UgaW5kaWNlcyB0byBwYWdlcy4BHQgBJQkQIEhlYXBTaXplEBAAAAIAFD0BIFRoZSBzaXplIG9mIHRoZSBwYWdlOyB0aGlzIGltcGxpZXMgdGhlIG1heGltdW0gbWVzc2FnZSBzaXplIHdoaWNoIGNhbiBiZSBzZW50LgBZASBBIGdvb2QgdmFsdWUgZGVwZW5kcyBvbiB0aGUgZXhwZWN0ZWQgbWVzc2FnZSBzaXplcywgdGhlaXIgd2VpZ2h0cywgdGhlIHdlaWdodCB0aGF0IGlzXQEgYXZhaWxhYmxlIGZvciBwcm9jZXNzaW5nIHRoZW0gYW5kIHRoZSBtYXhpbWFsIG5lZWRlZCBtZXNzYWdlIHNpemUuIFRoZSBtYXhpbWFsIG1lc3NhZ2URASBzaXplIGlzIHNsaWdodGx5IGxvd2VyIHRoYW4gdGhpcyBhcyBkZWZpbmVkIGJ5IFtgTWF4TWVzc2FnZUxlbk9mYF0uIE1heFN0YWxlEBAwAAAADF0BIFRoZSBtYXhpbXVtIG51bWJlciBvZiBzdGFsZSBwYWdlcyAoaS5lLiBvZiBvdmVyd2VpZ2h0IG1lc3NhZ2VzKSBhbGxvd2VkIGJlZm9yZSBjdWxsaW5nUQEgY2FuIGhhcHBlbi4gT25jZSB0aGVyZSBhcmUgbW9yZSBzdGFsZSBwYWdlcyB0aGFuIHRoaXMsIHRoZW4gaGlzdG9yaWNhbCBwYWdlcyBtYXkgYmX8IGRyb3BwZWQsIGV2ZW4gaWYgdGhleSBjb250YWluIHVucHJvY2Vzc2VkIG92ZXJ3ZWlnaHQgbWVzc2FnZXMuNFNlcnZpY2VXZWlnaHRFB0ABBwCg2yFdEzMzMzMzMzMzGEEBIFRoZSBhbW91bnQgb2Ygd2VpZ2h0IChpZiBhbnkpIHdoaWNoIHNob3VsZCBiZSBwcm92aWRlZCB0byB0aGUgbWVzc2FnZSBxdWV1ZSBmb3KoIHNlcnZpY2luZyBlbnF1ZXVlZCBpdGVtcyBgb25faW5pdGlhbGl6ZWAuAPwgVGhpcyBtYXkgYmUgbGVnaXRpbWF0ZWx5IGBOb25lYCBpbiB0aGUgY2FzZSB0aGF0IHlvdSB3aWxsIGNhbGxdASBgU2VydmljZVF1ZXVlczo6c2VydmljZV9xdWV1ZXNgIG1hbnVhbGx5IG9yIHNldCBbYFNlbGY6OklkbGVNYXhTZXJ2aWNlV2VpZ2h0YF0gdG8gaGF2ZVQgaXQgcnVuIGluIGBvbl9pZGxlYC5QSWRsZU1heFNlcnZpY2VXZWlnaHRFB0ABBwCg2yFdEzMzMzMzMzMzFF0BIFRoZSBtYXhpbXVtIGFtb3VudCBvZiB3ZWlnaHQgKGlmIGFueSkgdG8gYmUgdXNlZCBmcm9tIHJlbWFpbmluZyB3ZWlnaHQgYG9uX2lkbGVgIHdoaWNoQQEgc2hvdWxkIGJlIHByb3ZpZGVkIHRvIHRoZSBtZXNzYWdlIHF1ZXVlIGZvciBzZXJ2aWNpbmcgZW5xdWV1ZWQgaXRlbXMgYG9uX2lkbGVgLj0BIFVzZWZ1bCBmb3IgcGFyYWNoYWlucyB0byBwcm9jZXNzIG1lc3NhZ2VzIGF0IHRoZSBzYW1lIGJsb2NrIHRoZXkgYXJlIHJlY2VpdmVkLgApASBJZiBgTm9uZWAsIGl0IHdpbGwgbm90IGNhbGwgYFNlcnZpY2VRdWV1ZXM6OnNlcnZpY2VfcXVldWVzYCBpbiBgb25faWRsZWAuAVEPZAAkQXNzZXRSYXRlASRBc3NldFJhdGUEWENvbnZlcnNpb25SYXRlVG9OYXRpdmUAAQQCAQUtCAQADB0BIE1hcHMgYW4gYXNzZXQgdG8gaXRzIGZpeGVkIHBvaW50IHJlcHJlc2VudGF0aW9uIGluIHRoZSBuYXRpdmUgYmFsYW5jZS4ATQEgRS5nLiBgbmF0aXZlX2Ftb3VudCA9IGFzc2V0X2Ftb3VudCAqIENvbnZlcnNpb25SYXRlVG9OYXRpdmU6OjxUPjo6Z2V0KGFzc2V0X2tpbmQpYAEpCAEtCQABVQ9lACxSb290VGVzdGluZwABMQgBMQkAAGYAGE1ldGFUeAABNQgBNQkAAVkPZwA8VmVyaWZ5U2lnbmF0dXJlAAAAAABoABRCZWVmeQEUQmVlZnkULEF1dGhvcml0aWVzAQBdDwQABHAgVGhlIGN1cnJlbnQgYXV0aG9yaXRpZXMgc2V0OFZhbGlkYXRvclNldElkAQAwIAAAAAAAAAAABHQgVGhlIGN1cnJlbnQgdmFsaWRhdG9yIHNldCBpZDxOZXh0QXV0aG9yaXRpZXMBAF0PBAAE7CBBdXRob3JpdGllcyBzZXQgc2NoZWR1bGVkIHRvIGJlIHVzZWQgd2l0aCB0aGUgbmV4dCBzZXNzaW9uMFNldElkU2Vzc2lvbgABBAUwEAQAKFEBIEEgbWFwcGluZyBmcm9tIEJFRUZZIHNldCBJRCB0byB0aGUgaW5kZXggb2YgdGhlICptb3N0IHJlY2VudCogc2Vzc2lvbiBmb3Igd2hpY2ggaXRzaCBtZW1iZXJzIHdlcmUgcmVzcG9uc2libGUuAEUBIFRoaXMgaXMgb25seSB1c2VkIGZvciB2YWxpZGF0aW5nIGVxdWl2b2NhdGlvbiBwcm9vZnMuIEFuIGVxdWl2b2NhdGlvbiBwcm9vZiBtdXN0TQEgY29udGFpbnMgYSBrZXktb3duZXJzaGlwIHByb29mIGZvciBhIGdpdmVuIHNlc3Npb24sIHRoZXJlZm9yZSB3ZSBuZWVkIGEgd2F5IHRvIHRpZT0BIHRvZ2V0aGVyIHNlc3Npb25zIGFuZCBCRUVGWSBzZXQgaWRzLCBpLmUuIHdlIG5lZWQgdG8gdmFsaWRhdGUgdGhhdCBhIHZhbGlkYXRvckEBIHdhcyB0aGUgb3duZXIgb2YgYSBnaXZlbiBrZXkgb24gYSBnaXZlbiBzZXNzaW9uLCBhbmQgd2hhdCB0aGUgYWN0aXZlIHNldCBJRCB3YXNUIGR1cmluZyB0aGF0IHNlc3Npb24uANwgVFdPWC1OT1RFOiBgVmFsaWRhdG9yU2V0SWRgIGlzIG5vdCB1bmRlciB1c2VyIGNvbnRyb2wuMEdlbmVzaXNCbG9jawEAnAQADNwgQmxvY2sgbnVtYmVyIHdoZXJlIEJFRUZZIGNvbnNlbnN1cyBpcyBlbmFibGVkL3N0YXJ0ZWQuaQEgQnkgY2hhbmdpbmcgdGhpcyAodGhyb3VnaCBwcml2aWxlZ2VkIGBzZXRfbmV3X2dlbmVzaXMoKWApLCBCRUVGWSBjb25zZW5zdXMgaXMgZWZmZWN0aXZlbHmsIHJlc3RhcnRlZCBmcm9tIHRoZSBuZXdseSBzZXQgYmxvY2sgbnVtYmVyLgFtCAAMOE1heEF1dGhvcml0aWVzEBCghgEABNQgVGhlIG1heGltdW0gbnVtYmVyIG9mIGF1dGhvcml0aWVzIHRoYXQgY2FuIGJlIGFkZGVkLjRNYXhOb21pbmF0b3JzEBBAAAAABNQgVGhlIG1heGltdW0gbnVtYmVyIG9mIG5vbWluYXRvcnMgZm9yIGVhY2ggdmFsaWRhdG9yLlhNYXhTZXRJZFNlc3Npb25FbnRyaWVzMCAMAAAAAAAAABg5ASBUaGUgbWF4aW11bSBudW1iZXIgb2YgZW50cmllcyB0byBrZWVwIGluIHRoZSBzZXQgaWQgdG8gc2Vzc2lvbiBpbmRleCBtYXBwaW5nLgAxASBTaW5jZSB0aGUgYFNldElkU2Vzc2lvbmAgbWFwIGlzIG9ubHkgdXNlZCBmb3IgdmFsaWRhdGluZyBlcXVpdm9jYXRpb25zIHRoaXMpASB2YWx1ZSBzaG91bGQgcmVsYXRlIHRvIHRoZSBib25kaW5nIGR1cmF0aW9uIG9mIHdoYXRldmVyIHN0YWtpbmcgc3lzdGVtIGlzNQEgYmVpbmcgdXNlZCAoaWYgYW55KS4gSWYgZXF1aXZvY2F0aW9uIGhhbmRsaW5nIGlzIG5vdCBlbmFibGVkIHRoZW4gdGhpcyB2YWx1ZTQgY2FuIGJlIHplcm8uAWUPyAAMTW1yAQxNbXIMIFJvb3RIYXNoAQA0gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFggTGF0ZXN0IE1NUiBSb290IGhhc2guOE51bWJlck9mTGVhdmVzAQAwIAAAAAAAAAAABLAgQ3VycmVudCBzaXplIG9mIHRoZSBNTVIgKG51bWJlciBvZiBsZWF2ZXMpLhROb2RlcwABBAYwNAQAEIAgSGFzaGVzIG9mIHRoZSBub2RlcyBpbiB0aGUgTU1SLgAtASBOb3RlIHRoaXMgY29sbGVjdGlvbiBvbmx5IGNvbnRhaW5zIE1NUiBwZWFrcywgdGhlIGlubmVyIG5vZGVzIChhbmQgbGVhdmVzKbwgYXJlIHBydW5lZCBhbmQgb25seSBzdG9yZWQgaW4gdGhlIE9mZmNoYWluIERCLgAAAADJADBCZWVmeU1tckxlYWYBMEJlZWZ5TW1yTGVhZghAQmVlZnlBdXRob3JpdGllcwEAaQ+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEoCBEZXRhaWxzIG9mIGN1cnJlbnQgQkVFRlkgYXV0aG9yaXR5IHNldC5QQmVlZnlOZXh0QXV0aG9yaXRpZXMBAGkPsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADJQgRGV0YWlscyBvZiBuZXh0IEJFRUZZIGF1dGhvcml0eSBzZXQuAFEBIFRoaXMgc3RvcmFnZSBlbnRyeSBpcyB1c2VkIGFzIGNhY2hlIGZvciBjYWxscyB0byBgdXBkYXRlX2JlZWZ5X25leHRfYXV0aG9yaXR5X3NldGAuAAAAAMoAQElkZW50aXR5TWlncmF0b3IAAaEIATkJAAD4AATtAakBlQNtDyw0QXV0aG9yaXplQ2FsbHEPBQFIQ2hlY2tOb25aZXJvU2VuZGVySQgFAUBDaGVja1NwZWNWZXJzaW9uTQgQOENoZWNrVHhWZXJzaW9uUQgQMENoZWNrR2VuZXNpc1UINDhDaGVja01vcnRhbGl0eVkINChDaGVja05vbmNlYQgFASxDaGVja1dlaWdodHUPBQFgQ2hhcmdlVHJhbnNhY3Rpb25QYXltZW50eQ8FAURDaGVja01ldGFkYXRhSGFzaGUIKQE0V2VpZ2h0UmVjbGFpbX0PBQEZAWAQQ29yZQwcdmVyc2lvbgBtCQSQIFJldHVybnMgdGhlIHZlcnNpb24gb2YgdGhlIHJ1bnRpbWUuNGV4ZWN1dGVfYmxvY2sEFGJsb2NrgQ8FAQRkIEV4ZWN1dGUgdGhlIGdpdmVuIGJsb2NrLkBpbml0aWFsaXplX2Jsb2NrBBhoZWFkZXLFAY0PBEEBIEluaXRpYWxpemUgYSBibG9jayB3aXRoIHRoZSBnaXZlbiBoZWFkZXIgYW5kIHJldHVybiB0aGUgcnVudGltZSBleGVjdXRpdmUgbW9kZS4EIQEgVGhlIGBDb3JlYCBydW50aW1lIGFwaSB0aGF0IGV2ZXJ5IFN1YnN0cmF0ZSBydW50aW1lIG5lZWRzIHRvIGltcGxlbWVudC4gTWV0YWRhdGEMIG1ldGFkYXRhAJEPBIwgUmV0dXJucyB0aGUgbWV0YWRhdGEgb2YgYSBydW50aW1lLkxtZXRhZGF0YV9hdF92ZXJzaW9uBBx2ZXJzaW9uEJUPEKQgUmV0dXJucyB0aGUgbWV0YWRhdGEgYXQgYSBnaXZlbiB2ZXJzaW9uLgAFASBJZiB0aGUgZ2l2ZW4gYHZlcnNpb25gIGlzbid0IHN1cHBvcnRlZCwgdGhpcyB3aWxsIHJldHVybiBgTm9uZWAudQEgVXNlIFtgU2VsZjo6bWV0YWRhdGFfdmVyc2lvbnNgXSB0byBmaW5kIG91dCBhYm91dCBzdXBwb3J0ZWQgbWV0YWRhdGEgdmVyc2lvbiBvZiB0aGUgcnVudGltZS5EbWV0YWRhdGFfdmVyc2lvbnMAkQEMpCBSZXR1cm5zIHRoZSBzdXBwb3J0ZWQgbWV0YWRhdGEgdmVyc2lvbnMuAMAgVGhpcyBjYW4gYmUgdXNlZCB0byBjYWxsIGBtZXRhZGF0YV9hdF92ZXJzaW9uYC4EAQEgVGhlIGBNZXRhZGF0YWAgYXBpIHRyYWl0IHRoYXQgcmV0dXJucyBtZXRhZGF0YSBmb3IgdGhlIHJ1bnRpbWUuTFJ1bnRpbWVWaWV3RnVuY3Rpb24EVGV4ZWN1dGVfdmlld19mdW5jdGlvbgggcXVlcnlfaWSZDxRpbnB1dDidDwR8IEV4ZWN1dGUgYSB2aWV3IGZ1bmN0aW9uIHF1ZXJ5LgSkIFJ1bnRpbWUgQVBJIGZvciBleGVjdXRpbmcgdmlldyBmdW5jdGlvbnMwQmxvY2tCdWlsZGVyEDxhcHBseV9leHRyaW5zaWMEJGV4dHJpbnNpY4UPpQ8QbCBBcHBseSB0aGUgZ2l2ZW4gZXh0cmluc2ljLgA5ASBSZXR1cm5zIGFuIGluY2x1c2lvbiBvdXRjb21lIHdoaWNoIHNwZWNpZmllcyBpZiB0aGlzIGV4dHJpbnNpYyBpcyBpbmNsdWRlZCBpbkwgdGhpcyBibG9jayBvciBub3QuOGZpbmFsaXplX2Jsb2NrAMUBBGggRmluaXNoIHRoZSBjdXJyZW50IGJsb2NrLkxpbmhlcmVudF9leHRyaW5zaWNzBCBpbmhlcmVudLUPiQ8EPQEgR2VuZXJhdGUgaW5oZXJlbnQgZXh0cmluc2ljcy4gVGhlIGluaGVyZW50IGRhdGEgd2lsbCB2YXJ5IGZyb20gY2hhaW4gdG8gY2hhaW4uPGNoZWNrX2luaGVyZW50cwgUYmxvY2uBDxBkYXRhtQ/FDwRVASBDaGVjayB0aGF0IHRoZSBpbmhlcmVudHMgYXJlIHZhbGlkLiBUaGUgaW5oZXJlbnQgZGF0YSB3aWxsIHZhcnkgZnJvbSBjaGFpbiB0byBjaGFpbi4EcQEgVGhlIGBCbG9ja0J1aWxkZXJgIGFwaSB0cmFpdCB0aGF0IHByb3ZpZGVzIHRoZSByZXF1aXJlZCBmdW5jdGlvbmFsaXR5IGZvciBidWlsZGluZyBhIGJsb2NrLlhUYWdnZWRUcmFuc2FjdGlvblF1ZXVlBFB2YWxpZGF0ZV90cmFuc2FjdGlvbgwYc291cmNlyQ8IdHiFDyhibG9ja19oYXNoNM0PJGggVmFsaWRhdGUgdGhlIHRyYW5zYWN0aW9uLgBlASBUaGlzIG1ldGhvZCBpcyBpbnZva2VkIGJ5IHRoZSB0cmFuc2FjdGlvbiBwb29sIHRvIGxlYXJuIGRldGFpbHMgYWJvdXQgZ2l2ZW4gdHJhbnNhY3Rpb24uRQEgVGhlIGltcGxlbWVudGF0aW9uIHNob3VsZCBtYWtlIHN1cmUgdG8gdmVyaWZ5IHRoZSBjb3JyZWN0bmVzcyBvZiB0aGUgdHJhbnNhY3Rpb25NASBhZ2FpbnN0IGN1cnJlbnQgc3RhdGUuIFRoZSBnaXZlbiBgYmxvY2tfaGFzaGAgY29ycmVzcG9uZHMgdG8gdGhlIGhhc2ggb2YgdGhlIGJsb2NrfCB0aGF0IGlzIHVzZWQgYXMgY3VycmVudCBzdGF0ZS4ARQEgTm90ZSB0aGF0IHRoaXMgY2FsbCBtYXkgYmUgcGVyZm9ybWVkIGJ5IHRoZSBwb29sIG11bHRpcGxlIHRpbWVzIGFuZCB0cmFuc2FjdGlvbnOkIG1pZ2h0IGJlIHZlcmlmaWVkIGluIGFueSBwb3NzaWJsZSBvcmRlci4ETQEgVGhlIGBUYWdnZWRUcmFuc2FjdGlvblF1ZXVlYCBhcGkgdHJhaXQgZm9yIGludGVyZmVyaW5nIHdpdGggdGhlIHRyYW5zYWN0aW9uIHF1ZXVlLkRPZmZjaGFpbldvcmtlckFwaQQ8b2ZmY2hhaW5fd29ya2VyBBhoZWFkZXLFAQUBBMggU3RhcnRzIHRoZSBvZmYtY2hhaW4gdGFzayBmb3IgZ2l2ZW4gYmxvY2sgaGVhZGVyLgRkIFRoZSBvZmZjaGFpbiB3b3JrZXIgYXBpLjRQYXJhY2hhaW5Ib3N0jCh2YWxpZGF0b3JzAPkMBHAgR2V0IHRoZSBjdXJyZW50IHZhbGlkYXRvcnMuQHZhbGlkYXRvcl9ncm91cHMA1Q8MZQEgUmV0dXJucyB0aGUgdmFsaWRhdG9yIGdyb3VwcyBhbmQgcm90YXRpb24gaW5mbyBsb2NhbGl6ZWQgYmFzZWQgb24gdGhlIGh5cG90aGV0aWNhbCBjaGlsZGEBICBvZiBhIGJsb2NrIHdob3NlIHN0YXRlICB0aGlzIGlzIGludm9rZWQgb24uIE5vdGUgdGhhdCBgbm93YCBpbiB0aGUgYEdyb3VwUm90YXRpb25JbmZvYNAgc2hvdWxkIGJlIHRoZSBzdWNjZXNzb3Igb2YgdGhlIG51bWJlciBvZiB0aGUgYmxvY2suSGF2YWlsYWJpbGl0eV9jb3JlcwDdDwg1ASBZaWVsZHMgaW5mb3JtYXRpb24gb24gYWxsIGF2YWlsYWJpbGl0eSBjb3JlcyBhcyByZWxldmFudCB0byB0aGUgY2hpbGQgYmxvY2suPQEgQ29yZXMgYXJlIGVpdGhlciBmcmVlIG9yIG9jY3VwaWVkLiBGcmVlIGNvcmVzIGNhbiBoYXZlIHBhcmFzIGFzc2lnbmVkIHRvIHRoZW0uZHBlcnNpc3RlZF92YWxpZGF0aW9uX2RhdGEIHHBhcmFfaWSxAihhc3N1bXB0aW9u+Q/9DxRpASBZaWVsZHMgdGhlIHBlcnNpc3RlZCB2YWxpZGF0aW9uIGRhdGEgZm9yIHRoZSBnaXZlbiBgUGFyYUlkYCBhbG9uZyB3aXRoIGFuIGFzc3VtcHRpb24gdGhhdNggc2hvdWxkIGJlIHVzZWQgaWYgdGhlIHBhcmEgY3VycmVudGx5IG9jY3VwaWVzIGEgY29yZS4ARQEgUmV0dXJucyBgTm9uZWAgaWYgZWl0aGVyIHRoZSBwYXJhIGlzIG5vdCByZWdpc3RlcmVkIG9yIHRoZSBhc3N1bXB0aW9uIGlzIGBGcmVlZGCYIGFuZCB0aGUgcGFyYSBhbHJlYWR5IG9jY3VwaWVzIGEgY29yZS5cYXNzdW1lZF92YWxpZGF0aW9uX2RhdGEIHHBhcmFfaWSxApxleHBlY3RlZF9wZXJzaXN0ZWRfdmFsaWRhdGlvbl9kYXRhX2hhc2g0BRAMaQEgUmV0dXJucyB0aGUgcGVyc2lzdGVkIHZhbGlkYXRpb24gZGF0YSBmb3IgdGhlIGdpdmVuIGBQYXJhSWRgIGFsb25nIHdpdGggdGhlIGNvcnJlc3BvbmRpbmd1ASB2YWxpZGF0aW9uIGNvZGUgaGFzaC4gSW5zdGVhZCBvZiBhY2NlcHRpbmcgYXNzdW1wdGlvbiBhYm91dCB0aGUgcGFyYSwgbWF0Y2hlcyB0aGUgdmFsaWRhdGlvbikBIGRhdGEgaGFzaCBhZ2FpbnN0IGFuIGV4cGVjdGVkIG9uZSBhbmQgeWllbGRzIGBOb25lYCBpZiB0aGV5J3JlIG5vdCBlcXVhbC5gY2hlY2tfdmFsaWRhdGlvbl9vdXRwdXRzCBxwYXJhX2lksQIcb3V0cHV0c8UFIAQVASBDaGVja3MgaWYgdGhlIGdpdmVuIHZhbGlkYXRpb24gb3V0cHV0cyBwYXNzIHRoZSBhY2NlcHRhbmNlIGNyaXRlcmlhLlxzZXNzaW9uX2luZGV4X2Zvcl9jaGlsZAAQDPAgUmV0dXJucyB0aGUgc2Vzc2lvbiBpbmRleCBleHBlY3RlZCBhdCBhIGNoaWxkIG9mIHRoZSBibG9jay4A0CBUaGlzIGNhbiBiZSB1c2VkIHRvIGluc3RhbnRpYXRlIGEgYFNpZ25pbmdDb250ZXh0YC48dmFsaWRhdGlvbl9jb2RlCBxwYXJhX2lksQIoYXNzdW1wdGlvbvkP2QUQVQEgRmV0Y2ggdGhlIHZhbGlkYXRpb24gY29kZSB1c2VkIGJ5IGEgcGFyYSwgbWFraW5nIHRoZSBnaXZlbiBgT2NjdXBpZWRDb3JlQXNzdW1wdGlvbmAuAEUBIFJldHVybnMgYE5vbmVgIGlmIGVpdGhlciB0aGUgcGFyYSBpcyBub3QgcmVnaXN0ZXJlZCBvciB0aGUgYXNzdW1wdGlvbiBpcyBgRnJlZWRgmCBhbmQgdGhlIHBhcmEgYWxyZWFkeSBvY2N1cGllcyBhIGNvcmUueGNhbmRpZGF0ZV9wZW5kaW5nX2F2YWlsYWJpbGl0eQQccGFyYV9pZLECDRAIXQEgR2V0IHRoZSByZWNlaXB0IG9mIGEgY2FuZGlkYXRlIHBlbmRpbmcgYXZhaWxhYmlsaXR5LiBUaGlzIHJldHVybnMgYFNvbWVgIGZvciBhbnkgcGFyYXMlASBhc3NpZ25lZCB0byBvY2N1cGllZCBjb3JlcyBpbiBgYXZhaWxhYmlsaXR5X2NvcmVzYCBhbmQgYE5vbmVgIG90aGVyd2lzZS5AY2FuZGlkYXRlX2V2ZW50cwAREAQtASBHZXQgYSB2ZWN0b3Igb2YgZXZlbnRzIGNvbmNlcm5pbmcgY2FuZGlkYXRlcyB0aGF0IG9jY3VycmVkIHdpdGhpbiBhIGJsb2NrLjBkbXFfY29udGVudHMEJHJlY2lwaWVudLECrQ0EPQEgR2V0IGFsbCB0aGUgcGVuZGluZyBpbmJvdW5kIG1lc3NhZ2VzIGluIHRoZSBkb3dud2FyZCBtZXNzYWdlIHF1ZXVlIGZvciBhIHBhcmEueGluYm91bmRfaHJtcF9jaGFubmVsc19jb250ZW50cwQkcmVjaXBpZW50sQIZEAhlASBHZXQgdGhlIGNvbnRlbnRzIG9mIGFsbCBjaGFubmVscyBhZGRyZXNzZWQgdG8gdGhlIGdpdmVuIHJlY2lwaWVudC4gQ2hhbm5lbHMgdGhhdCBoYXZlIG5vkCBtZXNzYWdlcyBpbiB0aGVtIGFyZSBhbHNvIGluY2x1ZGVkLlx2YWxpZGF0aW9uX2NvZGVfYnlfaGFzaAQQaGFzaMEF2QUEnCBHZXQgdGhlIHZhbGlkYXRpb24gY29kZSBmcm9tIGl0cyBoYXNoLjhvbl9jaGFpbl92b3RlcwAlEAQxASBTY3JhcGUgZGlzcHV0ZSByZWxldmFudCBmcm9tIG9uLWNoYWluLCBiYWNraW5nIHZvdGVzIGFuZCByZXNvbHZlZCBkaXNwdXRlcy4wc2Vzc2lvbl9pbmZvBBRpbmRleBApEAzcIEdldCB0aGUgc2Vzc2lvbiBpbmZvIGZvciB0aGUgZ2l2ZW4gc2Vzc2lvbiwgaWYgc3RvcmVkLgAZASBOT1RFOiBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgYXZhaWxhYmxlIHNpbmNlIHBhcmFjaGFpbiBob3N0IHZlcnNpb24gMi5oc3VibWl0X3B2Zl9jaGVja19zdGF0ZW1lbnQIEHN0bXQVBiRzaWduYXR1cmWpBQUBDAEBIFN1Ym1pdHMgYSBQVkYgcHJlLWNoZWNraW5nIHN0YXRlbWVudCBpbnRvIHRoZSB0cmFuc2FjdGlvbiBwb29sLgAZASBOT1RFOiBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgYXZhaWxhYmxlIHNpbmNlIHBhcmFjaGFpbiBob3N0IHZlcnNpb24gMi5UcHZmc19yZXF1aXJlX3ByZWNoZWNrAHUNDF0BIFJldHVybnMgY29kZSBoYXNoZXMgb2YgUFZGcyB0aGF0IHJlcXVpcmUgcHJlLWNoZWNraW5nIGJ5IHZhbGlkYXRvcnMgaW4gdGhlIGFjdGl2ZSBzZXQuABkBIE5PVEU6IFRoaXMgZnVuY3Rpb24gaXMgb25seSBhdmFpbGFibGUgc2luY2UgcGFyYWNoYWluIGhvc3QgdmVyc2lvbiAyLlB2YWxpZGF0aW9uX2NvZGVfaGFzaAgccGFyYV9pZLECKGFzc3VtcHRpb275Dy0QDIUBIEZldGNoIHRoZSBoYXNoIG9mIHRoZSB2YWxpZGF0aW9uIGNvZGUgdXNlZCBieSBhIHBhcmEsIG1ha2luZyB0aGUgZ2l2ZW4gYE9jY3VwaWVkQ29yZUFzc3VtcHRpb25gLgAZASBOT1RFOiBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgYXZhaWxhYmxlIHNpbmNlIHBhcmFjaGFpbiBob3N0IHZlcnNpb24gMi4gZGlzcHV0ZXMAMRAEeCBSZXR1cm5zIGFsbCBvbmNoYWluIGRpc3B1dGVzLlxzZXNzaW9uX2V4ZWN1dG9yX3BhcmFtcwQ0c2Vzc2lvbl9pbmRleBA5EAS4IFJldHVybnMgZXhlY3V0aW9uIHBhcmFtZXRlcnMgZm9yIHRoZSBzZXNzaW9uLkR1bmFwcGxpZWRfc2xhc2hlcwA9EAhZASBSZXR1cm5zIGEgbGlzdCBvZiB2YWxpZGF0b3JzIHRoYXQgbG9zdCBhIHBhc3Qgc2Vzc2lvbiBkaXNwdXRlIGFuZCBuZWVkIHRvIGJlIHNsYXNoZWQuGQEgTk9URTogVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGF2YWlsYWJsZSBzaW5jZSBwYXJhY2hhaW4gaG9zdCB2ZXJzaW9uIDUuTGtleV9vd25lcnNoaXBfcHJvb2YEMHZhbGlkYXRvcl9pZFkCTRAIzCBSZXR1cm5zIGEgbWVya2xlIHByb29mIG9mIGEgdmFsaWRhdG9yIHNlc3Npb24ga2V5LhkBIE5PVEU6IFRoaXMgZnVuY3Rpb24gaXMgb25seSBhdmFpbGFibGUgc2luY2UgcGFyYWNoYWluIGhvc3QgdmVyc2lvbiA1LmhzdWJtaXRfcmVwb3J0X2Rpc3B1dGVfbG9zdAg0ZGlzcHV0ZV9wcm9vZlUQTGtleV9vd25lcnNoaXBfcHJvb2ZREFkQDCkBIFN1Ym1pdCBhbiB1bnNpZ25lZCBleHRyaW5zaWMgdG8gc2xhc2ggdmFsaWRhdG9ycyB3aG8gbG9zdCBhIGRpc3B1dGUgYWJvdXR8IGEgY2FuZGlkYXRlIG9mIGEgcGFzdCBzZXNzaW9uLhkBIE5PVEU6IFRoaXMgZnVuY3Rpb24gaXMgb25seSBhdmFpbGFibGUgc2luY2UgcGFyYWNoYWluIGhvc3QgdmVyc2lvbiA1LlRtaW5pbXVtX2JhY2tpbmdfdm90ZXMAEAgNASBHZXQgdGhlIG1pbmltdW0gbnVtYmVyIG9mIGJhY2tpbmcgdm90ZXMgZm9yIGEgcGFyYWNoYWluIGNhbmRpZGF0ZS70IFRoaXMgaXMgYSBzdGFnaW5nIG1ldGhvZCEgRG8gbm90IHVzZSBvbiBwcm9kdWN0aW9uIHJ1bnRpbWVzIUhwYXJhX2JhY2tpbmdfc3RhdGUEgF9fcnVudGltZV9hcGlfZ2VuZXJhdGVkX25hbWVfMF9fsQJdEATkIFJldHVybnMgdGhlIHN0YXRlIG9mIHBhcmFjaGFpbiBiYWNraW5nIGZvciBhIGdpdmVuIHBhcmEuUGFzeW5jX2JhY2tpbmdfcGFyYW1zAGEFBGEBIFJldHVybnMgY2FuZGlkYXRlJ3MgYWNjZXB0YW5jZSBsaW1pdGF0aW9ucyBmb3IgYXN5bmNocm9ub3VzIGJhY2tpbmcgZm9yIGEgcmVsYXkgcGFyZW50LkxkaXNhYmxlZF92YWxpZGF0b3JzAPUMBPggUmV0dXJucyBhIGxpc3Qgb2YgYWxsIGRpc2FibGVkIHZhbGlkYXRvcnMgYXQgdGhlIGdpdmVuIGJsb2NrLjRub2RlX2ZlYXR1cmVzAJ0FCEwgR2V0IG5vZGUgZmVhdHVyZXMu9CBUaGlzIGlzIGEgc3RhZ2luZyBtZXRob2QhIERvIG5vdCB1c2Ugb24gcHJvZHVjdGlvbiBydW50aW1lcyFYYXBwcm92YWxfdm90aW5nX3BhcmFtcwB5BQSkIEFwcHJvdmFsIHZvdGluZyBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMsY2xhaW1fcXVldWUAjRAEMCBDbGFpbSBxdWV1ZXxjYW5kaWRhdGVzX3BlbmRpbmdfYXZhaWxhYmlsaXR5BBxwYXJhX2lksQKZEARgIEVsYXN0aWMgc2NhbGluZyBzdXBwb3J0aHZhbGlkYXRpb25fY29kZV9ib21iX2xpbWl0ABAEtCBSZXRyaWV2ZSB0aGUgbWF4aW11bSB1bmNvbXByZXNzZWQgY29kZSBzaXplLkxiYWNraW5nX2NvbnN0cmFpbnRzBBxwYXJhX2lksQKdEAgxASBSZXR1cm5zIHRoZSBjb25zdHJhaW50cyBvbiB0aGUgYWN0aW9ucyB0aGF0IGNhbiBiZSB0YWtlbiBieSBhIG5ldyBwYXJhY2hhaW4cIGJsb2NrLlBzY2hlZHVsaW5nX2xvb2thaGVhZAAQBIggUmV0cmlldmUgdGhlIHNjaGVkdWxpbmcgbG9va2FoZWFkIHBhcmFfaWRzAHkNBIQgUmV0cmlldmUgcGFyYWlkcyBhdCByZWxheSBwYXJlbnQE3CBUaGUgQVBJIGZvciBxdWVyeWluZyB0aGUgc3RhdGUgb2YgcGFyYWNoYWlucyBvbi1jaGFpbi4gQmVlZnlBcGkcNGJlZWZ5X2dlbmVzaXMAnAQFASBSZXR1cm4gdGhlIGJsb2NrIG51bWJlciB3aGVyZSBCRUVGWSBjb25zZW5zdXMgaXMgZW5hYmxlZC9zdGFydGVkNHZhbGlkYXRvcl9zZXQApRAEuCBSZXR1cm4gdGhlIGN1cnJlbnQgYWN0aXZlIEJFRUZZIHZhbGlkYXRvciBzZXS4c3VibWl0X3JlcG9ydF9kb3VibGVfdm90aW5nX3Vuc2lnbmVkX2V4dHJpbnNpYwhIZXF1aXZvY2F0aW9uX3Byb29mcQg8a2V5X293bmVyX3Byb29mrRBZECBFASBTdWJtaXRzIGFuIHVuc2lnbmVkIGV4dHJpbnNpYyB0byByZXBvcnQgYSBkb3VibGUgdm90aW5nIGVxdWl2b2NhdGlvbi4gVGhlIGNhbGxlcvwgbXVzdCBwcm92aWRlIHRoZSBkb3VibGUgdm90aW5nIHByb29mIGFuZCBhIGtleSBvd25lcnNoaXAgcHJvb2b8IChzaG91bGQgYmUgb2J0YWluZWQgdXNpbmcgYGdlbmVyYXRlX2tleV9vd25lcnNoaXBfcHJvb2ZgKS4gVGhlBQEgZXh0cmluc2ljIHdpbGwgYmUgdW5zaWduZWQgYW5kIHNob3VsZCBvbmx5IGJlIGFjY2VwdGVkIGZvciBsb2NhbBUBIGF1dGhvcnNoaXAgKG5vdCB0byBiZSBicm9hZGNhc3QgdG8gdGhlIG5ldHdvcmspLiBUaGlzIG1ldGhvZCByZXR1cm5zCQEgYE5vbmVgIHdoZW4gY3JlYXRpb24gb2YgdGhlIGV4dHJpbnNpYyBmYWlscywgZS5nLiBpZiBlcXVpdm9jYXRpb24FASByZXBvcnRpbmcgaXMgZGlzYWJsZWQgZm9yIHRoZSBnaXZlbiBydW50aW1lIChpLmUuIHRoaXMgbWV0aG9kIGlzBQEgaGFyZGNvZGVkIHRvIHJldHVybiBgTm9uZWApLiBPbmx5IHVzZWZ1bCBpbiBhbiBvZmZjaGFpbiBjb250ZXh0LrBzdWJtaXRfcmVwb3J0X2Zvcmtfdm90aW5nX3Vuc2lnbmVkX2V4dHJpbnNpYwhIZXF1aXZvY2F0aW9uX3Byb29msRA8a2V5X293bmVyX3Byb29mrRBZECA9ASBTdWJtaXRzIGFuIHVuc2lnbmVkIGV4dHJpbnNpYyB0byByZXBvcnQgYSBmb3JrIHZvdGluZyBlcXVpdm9jYXRpb24uIFRoZSBjYWxsZXJBASBtdXN0IHByb3ZpZGUgdGhlIGZvcmsgdm90aW5nIHByb29mICh0aGUgYW5jZXN0cnkgcHJvb2Ygc2hvdWxkIGJlIG9idGFpbmVkIHVzaW5nPQEgYGdlbmVyYXRlX2FuY2VzdHJ5X3Byb29mYCkgYW5kIGEga2V5IG93bmVyc2hpcCBwcm9vZiAoc2hvdWxkIGJlIG9idGFpbmVkIHVzaW5nQQEgYGdlbmVyYXRlX2tleV9vd25lcnNoaXBfcHJvb2ZgKS4gVGhlIGV4dHJpbnNpYyB3aWxsIGJlIHVuc2lnbmVkIGFuZCBzaG91bGQgb25seU0BIGJlIGFjY2VwdGVkIGZvciBsb2NhbCBhdXRob3JzaGlwIChub3QgdG8gYmUgYnJvYWRjYXN0IHRvIHRoZSBuZXR3b3JrKS4gVGhpcyBtZXRob2QpASByZXR1cm5zIGBOb25lYCB3aGVuIGNyZWF0aW9uIG9mIHRoZSBleHRyaW5zaWMgZmFpbHMsIGUuZy4gaWYgZXF1aXZvY2F0aW9uBQEgcmVwb3J0aW5nIGlzIGRpc2FibGVkIGZvciB0aGUgZ2l2ZW4gcnVudGltZSAoaS5lLiB0aGlzIG1ldGhvZCBpcwUBIGhhcmRjb2RlZCB0byByZXR1cm4gYE5vbmVgKS4gT25seSB1c2VmdWwgaW4gYW4gb2ZmY2hhaW4gY29udGV4dC7Qc3VibWl0X3JlcG9ydF9mdXR1cmVfYmxvY2tfdm90aW5nX3Vuc2lnbmVkX2V4dHJpbnNpYwhIZXF1aXZvY2F0aW9uX3Byb29mnQg8a2V5X293bmVyX3Byb29mrRBZECBdASBTdWJtaXRzIGFuIHVuc2lnbmVkIGV4dHJpbnNpYyB0byByZXBvcnQgYSBmdXR1cmUgYmxvY2sgdm90aW5nIGVxdWl2b2NhdGlvbi4gVGhlIGNhbGxlchUBIG11c3QgcHJvdmlkZSB0aGUgZnV0dXJlIGJsb2NrIHZvdGluZyBwcm9vZiBhbmQgYSBrZXkgb3duZXJzaGlwIHByb29m7CAoc2hvdWxkIGJlIG9idGFpbmVkIHVzaW5nIGBnZW5lcmF0ZV9rZXlfb3duZXJzaGlwX3Byb29mYCkuFQEgVGhlIGV4dHJpbnNpYyB3aWxsIGJlIHVuc2lnbmVkIGFuZCBzaG91bGQgb25seSBiZSBhY2NlcHRlZCBmb3IgbG9jYWwVASBhdXRob3JzaGlwIChub3QgdG8gYmUgYnJvYWRjYXN0IHRvIHRoZSBuZXR3b3JrKS4gVGhpcyBtZXRob2QgcmV0dXJucwkBIGBOb25lYCB3aGVuIGNyZWF0aW9uIG9mIHRoZSBleHRyaW5zaWMgZmFpbHMsIGUuZy4gaWYgZXF1aXZvY2F0aW9uBQEgcmVwb3J0aW5nIGlzIGRpc2FibGVkIGZvciB0aGUgZ2l2ZW4gcnVudGltZSAoaS5lLiB0aGlzIG1ldGhvZCBpcwUBIGhhcmRjb2RlZCB0byByZXR1cm4gYE5vbmVgKS4gT25seSB1c2VmdWwgaW4gYW4gb2ZmY2hhaW4gY29udGV4dC5wZ2VuZXJhdGVfa2V5X293bmVyc2hpcF9wcm9vZggYc2V0X2lkMDBhdXRob3JpdHlfaWRlArUQLAkBIEdlbmVyYXRlcyBhIHByb29mIG9mIGtleSBvd25lcnNoaXAgZm9yIHRoZSBnaXZlbiBhdXRob3JpdHkgaW4gdGhl/CBnaXZlbiBzZXQuIEFuIGV4YW1wbGUgdXNhZ2Ugb2YgdGhpcyBtb2R1bGUgaXMgY291cGxlZCB3aXRoIHRoZQUBIHNlc3Npb24gaGlzdG9yaWNhbCBtb2R1bGUgdG8gcHJvdmUgdGhhdCBhIGdpdmVuIGF1dGhvcml0eSBrZXkgaXMNASB0aWVkIHRvIGEgZ2l2ZW4gc3Rha2luZyBpZGVudGl0eSBkdXJpbmcgYSBzcGVjaWZpYyBzZXNzaW9uLiBQcm9vZnMRASBvZiBrZXkgb3duZXJzaGlwIGFyZSBuZWNlc3NhcnkgZm9yIHN1Ym1pdHRpbmcgZXF1aXZvY2F0aW9uIHJlcG9ydHMuEQEgTk9URTogZXZlbiB0aG91Z2ggdGhlIEFQSSB0YWtlcyBhIGBzZXRfaWRgIGFzIHBhcmFtZXRlciB0aGUgY3VycmVudAkBIGltcGxlbWVudGF0aW9ucyBpZ25vcmVzIHRoaXMgcGFyYW1ldGVyIGFuZCBpbnN0ZWFkIHJlbGllcyBvbiB0aGlzDQEgbWV0aG9kIGJlaW5nIGNhbGxlZCBhdCB0aGUgY29ycmVjdCBibG9jayBoZWlnaHQsIGkuZS4gYW55IHBvaW50IGF0FQEgd2hpY2ggdGhlIGdpdmVuIHNldCBpZCBpcyBsaXZlIG9uLWNoYWluLiBGdXR1cmUgaW1wbGVtZW50YXRpb25zIHdpbGwNASBpbnN0ZWFkIHVzZSBpbmRleGVkIGRhdGEgdGhyb3VnaCBhbiBvZmZjaGFpbiB3b3JrZXIsIG5vdCByZXF1aXJpbmd4IG9sZGVyIHN0YXRlcyB0byBiZSBhdmFpbGFibGUuXGdlbmVyYXRlX2FuY2VzdHJ5X3Byb29mCERwcmV2X2Jsb2NrX251bWJlchBcYmVzdF9rbm93bl9ibG9ja19udW1iZXKctRAIRQEgR2VuZXJhdGVzIGEgcHJvb2YgdGhhdCB0aGUgYHByZXZfYmxvY2tfbnVtYmVyYCBpcyBwYXJ0IG9mIHRoZSBjYW5vbmljYWwgY2hhaW4gYXRsIGBiZXN0X2tub3duX2Jsb2NrX251bWJlcmAuBIAgQVBJIG5lY2Vzc2FyeSBmb3IgQkVFRlkgdm90ZXJzLhhNbXJBcGkUIG1tcl9yb290ALkQBIwgUmV0dXJuIHRoZSBvbi1jaGFpbiBNTVIgcm9vdCBoYXNoLjhtbXJfbGVhZl9jb3VudADBEAS4IFJldHVybiB0aGUgbnVtYmVyIG9mIE1NUiBibG9ja3MgaW4gdGhlIGNoYWluLjhnZW5lcmF0ZV9wcm9vZgg0YmxvY2tfbnVtYmVyc5EBXGJlc3Rfa25vd25fYmxvY2tfbnVtYmVynMUQCGkBIEdlbmVyYXRlIE1NUiBwcm9vZiBmb3IgYSBzZXJpZXMgb2YgYmxvY2sgbnVtYmVycy4gSWYgYGJlc3Rfa25vd25fYmxvY2tfbnVtYmVyID0gU29tZShuKWAsRQEgdXNlIGhpc3RvcmljYWwgTU1SIHN0YXRlIGF0IGdpdmVuIGJsb2NrIGhlaWdodCBgbmAuIEVsc2UsIHVzZSBjdXJyZW50IE1NUiBzdGF0ZS4wdmVyaWZ5X3Byb29mCBhsZWF2ZXPNEBRwcm9vZtUQ2RAU9CBWZXJpZnkgTU1SIHByb29mIGFnYWluc3Qgb24tY2hhaW4gTU1SIGZvciBhIGJhdGNoIG9mIGxlYXZlcy4AcQEgTm90ZSB0aGlzIGZ1bmN0aW9uIHdpbGwgdXNlIG9uLWNoYWluIE1NUiByb290IGhhc2ggYW5kIGNoZWNrIGlmIHRoZSBwcm9vZiBtYXRjaGVzIHRoZSBoYXNoLm0BIE5vdGUsIHRoZSBsZWF2ZXMgc2hvdWxkIGJlIHNvcnRlZCBzdWNoIHRoYXQgY29ycmVzcG9uZGluZyBsZWF2ZXMgYW5kIGxlYWYgaW5kaWNlcyBoYXZlIHRoZZUBIHNhbWUgcG9zaXRpb24gaW4gYm90aCB0aGUgYGxlYXZlc2AgdmVjdG9yIGFuZCB0aGUgYGxlYWZfaW5kaWNlc2AgdmVjdG9yIGNvbnRhaW5lZCBpbiB0aGUgW0xlYWZQcm9vZl1YdmVyaWZ5X3Byb29mX3N0YXRlbGVzcwwQcm9vdDQYbGVhdmVzzRAUcHJvb2bVENkQHAEBIFZlcmlmeSBNTVIgcHJvb2YgYWdhaW5zdCBnaXZlbiByb290IGhhc2ggZm9yIGEgYmF0Y2ggb2YgbGVhdmVzLgD8IE5vdGUgdGhpcyBmdW5jdGlvbiBkb2VzIG5vdCByZXF1aXJlIGFueSBvbi1jaGFpbiBzdG9yYWdlIC0gdGhlvCBwcm9vZiBpcyB2ZXJpZmllZCBhZ2FpbnN0IGdpdmVuIE1NUiByb290IGhhc2guAG0BIE5vdGUsIHRoZSBsZWF2ZXMgc2hvdWxkIGJlIHNvcnRlZCBzdWNoIHRoYXQgY29ycmVzcG9uZGluZyBsZWF2ZXMgYW5kIGxlYWYgaW5kaWNlcyBoYXZlIHRoZZUBIHNhbWUgcG9zaXRpb24gaW4gYm90aCB0aGUgYGxlYXZlc2AgdmVjdG9yIGFuZCB0aGUgYGxlYWZfaW5kaWNlc2AgdmVjdG9yIGNvbnRhaW5lZCBpbiB0aGUgW0xlYWZQcm9vZl0EhCBBUEkgdG8gaW50ZXJhY3Qgd2l0aCBNTVIgcGFsbGV0LixCZWVmeU1tckFwaQhMYXV0aG9yaXR5X3NldF9wcm9vZgBpDwTcIFJldHVybiB0aGUgY3VycmVudGx5IGFjdGl2ZSBCRUVGWSBhdXRob3JpdHkgc2V0IHByb29mLmBuZXh0X2F1dGhvcml0eV9zZXRfcHJvb2YAaQ8EyCBSZXR1cm4gdGhlIG5leHQvcXVldWVkIEJFRUZZIGF1dGhvcml0eSBzZXQgcHJvb2YuBJAgQVBJIHVzZWZ1bCBmb3IgQkVFRlkgbGlnaHQgY2xpZW50cy4oR3JhbmRwYUFwaRBMZ3JhbmRwYV9hdXRob3JpdGllcwDwGD0BIEdldCB0aGUgY3VycmVudCBHUkFORFBBIGF1dGhvcml0aWVzIGFuZCB3ZWlnaHRzLiBUaGlzIHNob3VsZCBub3QgY2hhbmdlIGV4Y2VwdB0BIGZvciB3aGVuIGNoYW5nZXMgYXJlIHNjaGVkdWxlZCBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgZGVsYXkgaGFzIHBhc3NlZC4ANQEgV2hlbiBjYWxsZWQgYXQgYmxvY2sgQiwgaXQgd2lsbCByZXR1cm4gdGhlIHNldCBvZiBhdXRob3JpdGllcyB0aGF0IHNob3VsZCBiZT0BIHVzZWQgdG8gZmluYWxpemUgZGVzY2VuZGFudHMgb2YgdGhpcyBibG9jayAoQisxLCBCKzIsIC4uLikuIFRoZSBibG9jayBCIGl0c2VsZsAgaXMgZmluYWxpemVkIGJ5IHRoZSBhdXRob3JpdGllcyBmcm9tIGJsb2NrIEItMS60c3VibWl0X3JlcG9ydF9lcXVpdm9jYXRpb25fdW5zaWduZWRfZXh0cmluc2ljCEhlcXVpdm9jYXRpb25fcHJvb2ZxAjxrZXlfb3duZXJfcHJvb2atEFkQIBEBIFN1Ym1pdHMgYW4gdW5zaWduZWQgZXh0cmluc2ljIHRvIHJlcG9ydCBhbiBlcXVpdm9jYXRpb24uIFRoZSBjYWxsZXL4IG11c3QgcHJvdmlkZSB0aGUgZXF1aXZvY2F0aW9uIHByb29mIGFuZCBhIGtleSBvd25lcnNoaXAgcHJvb2b8IChzaG91bGQgYmUgb2J0YWluZWQgdXNpbmcgYGdlbmVyYXRlX2tleV9vd25lcnNoaXBfcHJvb2ZgKS4gVGhlBQEgZXh0cmluc2ljIHdpbGwgYmUgdW5zaWduZWQgYW5kIHNob3VsZCBvbmx5IGJlIGFjY2VwdGVkIGZvciBsb2NhbBUBIGF1dGhvcnNoaXAgKG5vdCB0byBiZSBicm9hZGNhc3QgdG8gdGhlIG5ldHdvcmspLiBUaGlzIG1ldGhvZCByZXR1cm5zCQEgYE5vbmVgIHdoZW4gY3JlYXRpb24gb2YgdGhlIGV4dHJpbnNpYyBmYWlscywgZS5nLiBpZiBlcXVpdm9jYXRpb24FASByZXBvcnRpbmcgaXMgZGlzYWJsZWQgZm9yIHRoZSBnaXZlbiBydW50aW1lIChpLmUuIHRoaXMgbWV0aG9kIGlzBQEgaGFyZGNvZGVkIHRvIHJldHVybiBgTm9uZWApLiBPbmx5IHVzZWZ1bCBpbiBhbiBvZmZjaGFpbiBjb250ZXh0LnBnZW5lcmF0ZV9rZXlfb3duZXJzaGlwX3Byb29mCBhzZXRfaWQwMGF1dGhvcml0eV9pZPi1ECwJASBHZW5lcmF0ZXMgYSBwcm9vZiBvZiBrZXkgb3duZXJzaGlwIGZvciB0aGUgZ2l2ZW4gYXV0aG9yaXR5IGluIHRoZfwgZ2l2ZW4gc2V0LiBBbiBleGFtcGxlIHVzYWdlIG9mIHRoaXMgbW9kdWxlIGlzIGNvdXBsZWQgd2l0aCB0aGUFASBzZXNzaW9uIGhpc3RvcmljYWwgbW9kdWxlIHRvIHByb3ZlIHRoYXQgYSBnaXZlbiBhdXRob3JpdHkga2V5IGlzDQEgdGllZCB0byBhIGdpdmVuIHN0YWtpbmcgaWRlbnRpdHkgZHVyaW5nIGEgc3BlY2lmaWMgc2Vzc2lvbi4gUHJvb2ZzEQEgb2Yga2V5IG93bmVyc2hpcCBhcmUgbmVjZXNzYXJ5IGZvciBzdWJtaXR0aW5nIGVxdWl2b2NhdGlvbiByZXBvcnRzLhEBIE5PVEU6IGV2ZW4gdGhvdWdoIHRoZSBBUEkgdGFrZXMgYSBgc2V0X2lkYCBhcyBwYXJhbWV0ZXIgdGhlIGN1cnJlbnT8IGltcGxlbWVudGF0aW9ucyBpZ25vcmUgdGhpcyBwYXJhbWV0ZXIgYW5kIGluc3RlYWQgcmVseSBvbiB0aGlzDQEgbWV0aG9kIGJlaW5nIGNhbGxlZCBhdCB0aGUgY29ycmVjdCBibG9jayBoZWlnaHQsIGkuZS4gYW55IHBvaW50IGF0FQEgd2hpY2ggdGhlIGdpdmVuIHNldCBpZCBpcyBsaXZlIG9uLWNoYWluLiBGdXR1cmUgaW1wbGVtZW50YXRpb25zIHdpbGwNASBpbnN0ZWFkIHVzZSBpbmRleGVkIGRhdGEgdGhyb3VnaCBhbiBvZmZjaGFpbiB3b3JrZXIsIG5vdCByZXF1aXJpbmd4IG9sZGVyIHN0YXRlcyB0byBiZSBhdmFpbGFibGUuOGN1cnJlbnRfc2V0X2lkADAEmCBHZXQgY3VycmVudCBHUkFORFBBIGF1dGhvcml0eSBzZXQgaWQuJAEBIEFQSXMgZm9yIGludGVncmF0aW5nIHRoZSBHUkFORFBBIGZpbmFsaXR5IGdhZGdldCBpbnRvIHJ1bnRpbWVzLsAgVGhpcyBzaG91bGQgYmUgaW1wbGVtZW50ZWQgb24gdGhlIHJ1bnRpbWUgc2lkZS4AFQEgVGhpcyBpcyBwcmltYXJpbHkgdXNlZCBmb3IgbmVnb3RpYXRpbmcgYXV0aG9yaXR5LXNldCBjaGFuZ2VzIGZvciB0aGUNASBnYWRnZXQuIEdSQU5EUEEgdXNlcyBhIHNpZ25hbGluZyBtb2RlbCBvZiBjaGFuZ2luZyBhdXRob3JpdHkgc2V0czoxASBjaGFuZ2VzIHNob3VsZCBiZSBzaWduYWxlZCB3aXRoIGEgZGVsYXkgb2YgTiBibG9ja3MsIGFuZCB0aGVuIGF1dG9tYXRpY2FsbHnkIGFwcGxpZWQgaW4gdGhlIHJ1bnRpbWUgYWZ0ZXIgdGhvc2UgTiBibG9ja3MgaGF2ZSBwYXNzZWQuAPwgVGhlIGNvbnNlbnN1cyBwcm90b2NvbCB3aWxsIGNvb3JkaW5hdGUgdGhlIGhhbmRvZmYgZXh0ZXJuYWxseS4cQmFiZUFwaRg0Y29uZmlndXJhdGlvbgDdEASMIFJldHVybiB0aGUgY29uZmlndXJhdGlvbiBmb3IgQkFCRS5MY3VycmVudF9lcG9jaF9zdGFydADRAQTEIFJldHVybnMgdGhlIHNsb3QgdGhhdCBzdGFydGVkIHRoZSBjdXJyZW50IGVwb2NoLjRjdXJyZW50X2Vwb2NoAOEQBMQgUmV0dXJucyBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhlIGN1cnJlbnQgZXBvY2guKG5leHRfZXBvY2gA4RAIAQEgUmV0dXJucyBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhlIG5leHQgZXBvY2ggKHdoaWNoIHdhcyBhbHJlYWR5XCBwcmV2aW91c2x5IGFubm91bmNlZCkucGdlbmVyYXRlX2tleV9vd25lcnNoaXBfcHJvb2YIEHNsb3TRATBhdXRob3JpdHlfaWTNAeUQLAkBIEdlbmVyYXRlcyBhIHByb29mIG9mIGtleSBvd25lcnNoaXAgZm9yIHRoZSBnaXZlbiBhdXRob3JpdHkgaW4gdGhlDQEgY3VycmVudCBlcG9jaC4gQW4gZXhhbXBsZSB1c2FnZSBvZiB0aGlzIG1vZHVsZSBpcyBjb3VwbGVkIHdpdGggdGhlBQEgc2Vzc2lvbiBoaXN0b3JpY2FsIG1vZHVsZSB0byBwcm92ZSB0aGF0IGEgZ2l2ZW4gYXV0aG9yaXR5IGtleSBpcw0BIHRpZWQgdG8gYSBnaXZlbiBzdGFraW5nIGlkZW50aXR5IGR1cmluZyBhIHNwZWNpZmljIHNlc3Npb24uIFByb29mcxEBIG9mIGtleSBvd25lcnNoaXAgYXJlIG5lY2Vzc2FyeSBmb3Igc3VibWl0dGluZyBlcXVpdm9jYXRpb24gcmVwb3J0cy4JASBOT1RFOiBldmVuIHRob3VnaCB0aGUgQVBJIHRha2VzIGEgYHNsb3RgIGFzIHBhcmFtZXRlciB0aGUgY3VycmVudAkBIGltcGxlbWVudGF0aW9ucyBpZ25vcmVzIHRoaXMgcGFyYW1ldGVyIGFuZCBpbnN0ZWFkIHJlbGllcyBvbiB0aGlzDQEgbWV0aG9kIGJlaW5nIGNhbGxlZCBhdCB0aGUgY29ycmVjdCBibG9jayBoZWlnaHQsIGkuZS4gYW55IHBvaW50IGF08CB3aGljaCB0aGUgZXBvY2ggZm9yIHRoZSBnaXZlbiBzbG90IGlzIGxpdmUgb24tY2hhaW4uIEZ1dHVyZQkBIGltcGxlbWVudGF0aW9ucyB3aWxsIGluc3RlYWQgdXNlIGluZGV4ZWQgZGF0YSB0aHJvdWdoIGFuIG9mZmNoYWlu0CB3b3JrZXIsIG5vdCByZXF1aXJpbmcgb2xkZXIgc3RhdGVzIHRvIGJlIGF2YWlsYWJsZS60c3VibWl0X3JlcG9ydF9lcXVpdm9jYXRpb25fdW5zaWduZWRfZXh0cmluc2ljCEhlcXVpdm9jYXRpb25fcHJvb2bBATxrZXlfb3duZXJfcHJvb2bpEFkQIBEBIFN1Ym1pdHMgYW4gdW5zaWduZWQgZXh0cmluc2ljIHRvIHJlcG9ydCBhbiBlcXVpdm9jYXRpb24uIFRoZSBjYWxsZXL4IG11c3QgcHJvdmlkZSB0aGUgZXF1aXZvY2F0aW9uIHByb29mIGFuZCBhIGtleSBvd25lcnNoaXAgcHJvb2b8IChzaG91bGQgYmUgb2J0YWluZWQgdXNpbmcgYGdlbmVyYXRlX2tleV9vd25lcnNoaXBfcHJvb2ZgKS4gVGhlBQEgZXh0cmluc2ljIHdpbGwgYmUgdW5zaWduZWQgYW5kIHNob3VsZCBvbmx5IGJlIGFjY2VwdGVkIGZvciBsb2NhbBUBIGF1dGhvcnNoaXAgKG5vdCB0byBiZSBicm9hZGNhc3QgdG8gdGhlIG5ldHdvcmspLiBUaGlzIG1ldGhvZCByZXR1cm5zCQEgYE5vbmVgIHdoZW4gY3JlYXRpb24gb2YgdGhlIGV4dHJpbnNpYyBmYWlscywgZS5nLiBpZiBlcXVpdm9jYXRpb24FASByZXBvcnRpbmcgaXMgZGlzYWJsZWQgZm9yIHRoZSBnaXZlbiBydW50aW1lIChpLmUuIHRoaXMgbWV0aG9kIGlzBQEgaGFyZGNvZGVkIHRvIHJldHVybiBgTm9uZWApLiBPbmx5IHVzZWZ1bCBpbiBhbiBvZmZjaGFpbiBjb250ZXh0LgS4IEFQSSBuZWNlc3NhcnkgZm9yIGJsb2NrIGF1dGhvcnNoaXAgd2l0aCBCQUJFLlRBdXRob3JpdHlEaXNjb3ZlcnlBcGkELGF1dGhvcml0aWVzAMEKBBkBIFJldHJpZXZlIGF1dGhvcml0eSBpZGVudGlmaWVycyBvZiB0aGUgY3VycmVudCBhbmQgbmV4dCBhdXRob3JpdHkgc2V0LhB0IFRoZSBhdXRob3JpdHkgZGlzY292ZXJ5IGFwaS4AUQEgVGhpcyBhcGkgaXMgdXNlZCBieSB0aGUgYGNsaWVudC9hdXRob3JpdHktZGlzY292ZXJ5YCBtb2R1bGUgdG8gcmV0cmlldmUgaWRlbnRpZmllcnOcIG9mIHRoZSBjdXJyZW50IGFuZCBuZXh0IGF1dGhvcml0eSBzZXQuLFNlc3Npb25LZXlzCFRnZW5lcmF0ZV9zZXNzaW9uX2tleXMEEHNlZWTZBzgcFQEgR2VuZXJhdGUgYSBzZXQgb2Ygc2Vzc2lvbiBrZXlzIHdpdGggb3B0aW9uYWxseSB1c2luZyB0aGUgZ2l2ZW4gc2VlZC4JASBUaGUga2V5cyBzaG91bGQgYmUgc3RvcmVkIHdpdGhpbiB0aGUga2V5c3RvcmUgZXhwb3NlZCB2aWEgcnVudGltZTwgZXh0ZXJuYWxpdGllcy4AsCBUaGUgc2VlZCBuZWVkcyB0byBiZSBhIHZhbGlkIGB1dGY4YCBzdHJpbmcuANAgUmV0dXJucyB0aGUgY29uY2F0ZW5hdGVkIFNDQUxFIGVuY29kZWQgcHVibGljIGtleXMuTGRlY29kZV9zZXNzaW9uX2tleXMEHGVuY29kZWQ47RAMmCBEZWNvZGUgdGhlIGdpdmVuIHB1YmxpYyBzZXNzaW9uIGtleXMuANwgUmV0dXJucyB0aGUgbGlzdCBvZiBwdWJsaWMgcmF3IHB1YmxpYyBrZXlzICsga2V5IHR5cGUuBGggU2Vzc2lvbiBrZXlzIHJ1bnRpbWUgYXBpLjxBY2NvdW50Tm9uY2VBcGkENGFjY291bnRfbm9uY2UEHGFjY291bnQAEATAIEdldCBjdXJyZW50IGFjY291bnQgbm9uY2Ugb2YgZ2l2ZW4gYEFjY291bnRJZGAuBIAgVGhlIEFQSSB0byBxdWVyeSBhY2NvdW50IG5vbmNlLlRUcmFuc2FjdGlvblBheW1lbnRBcGkQKHF1ZXJ5X2luZm8IDHV4dIUPDGxlbhD5EABEcXVlcnlfZmVlX2RldGFpbHMIDHV4dIUPDGxlbhD9EABMcXVlcnlfd2VpZ2h0X3RvX2ZlZQQYd2VpZ2h0KBgATHF1ZXJ5X2xlbmd0aF90b19mZWUEGGxlbmd0aBAYAABkVHJhbnNhY3Rpb25QYXltZW50Q2FsbEFwaRA8cXVlcnlfY2FsbF9pbmZvCBBjYWxsqQEMbGVuEPkQBEkBIFF1ZXJ5IGluZm9ybWF0aW9uIG9mIGEgZGlzcGF0Y2ggY2xhc3MsIHdlaWdodCwgYW5kIGZlZSBvZiBhIGdpdmVuIGVuY29kZWQgYENhbGxgLlhxdWVyeV9jYWxsX2ZlZV9kZXRhaWxzCBBjYWxsqQEMbGVuEP0QBLQgUXVlcnkgZmVlIGRldGFpbHMgb2YgYSBnaXZlbiBlbmNvZGVkIGBDYWxsYC5McXVlcnlfd2VpZ2h0X3RvX2ZlZQQYd2VpZ2h0KBgEAQEgUXVlcnkgdGhlIG91dHB1dCBvZiB0aGUgY3VycmVudCBgV2VpZ2h0VG9GZWVgIGdpdmVuIHNvbWUgaW5wdXQuTHF1ZXJ5X2xlbmd0aF90b19mZWUEGGxlbmd0aBAYBAEBIFF1ZXJ5IHRoZSBvdXRwdXQgb2YgdGhlIGN1cnJlbnQgYExlbmd0aFRvRmVlYCBnaXZlbiBzb21lIGlucHV0LgA0WGNtUGF5bWVudEFwaRB8cXVlcnlfYWNjZXB0YWJsZV9wYXltZW50X2Fzc2V0cwQseGNtX3ZlcnNpb24QCREUtCBSZXR1cm5zIGEgbGlzdCBvZiBhY2NlcHRhYmxlIHBheW1lbnQgYXNzZXRzLgAwICMgQXJndW1lbnRzAGggKiBgeGNtX3ZlcnNpb25gOiBWZXJzaW9uLkBxdWVyeV94Y21fd2VpZ2h0BBxtZXNzYWdlTQYVERSoIFJldHVybnMgYSB3ZWlnaHQgbmVlZGVkIHRvIGV4ZWN1dGUgYSBYQ00uADAgIyBBcmd1bWVudHMAdCAqIGBtZXNzYWdlYDogYFZlcnNpb25lZFhjbWAuZHF1ZXJ5X3dlaWdodF90b19hc3NldF9mZWUIGHdlaWdodCgUYXNzZXQVCBkRGOggQ29udmVydHMgYSB3ZWlnaHQgaW50byBhIGZlZSBmb3IgdGhlIHNwZWNpZmllZCBgQXNzZXRJZGAuADAgIyBBcmd1bWVudHMAiCAqIGB3ZWlnaHRgOiBjb252ZXJ0aWJsZSBgV2VpZ2h0YC58ICogYGFzc2V0YDogYFZlcnNpb25lZEFzc2V0SWRgLkxxdWVyeV9kZWxpdmVyeV9mZWVzCCxkZXN0aW5hdGlvblkFHG1lc3NhZ2VNBh0RIB0BIEdldCBkZWxpdmVyeSBmZWVzIGZvciBzZW5kaW5nIGEgc3BlY2lmaWMgYG1lc3NhZ2VgIHRvIGEgYGRlc3RpbmF0aW9uYC70IFRoZXNlIGFsd2F5cyBjb21lIGluIGEgc3BlY2lmaWMgYXNzZXQsIGRlZmluZWQgYnkgdGhlIGNoYWluLgAwICMgQXJndW1lbnRzgQEgKiBgbWVzc2FnZWA6IFRoZSBtZXNzYWdlIHRoYXQnbGwgYmUgc2VudCwgbmVjZXNzYXJ5IGJlY2F1c2UgbW9zdCBkZWxpdmVyeSBmZWVzIGFyZSBiYXNlZCBvbiB0aGVcICAgc2l6ZSBvZiB0aGUgbWVzc2FnZS5hASAqIGBkZXN0aW5hdGlvbmA6IFRoZSBkZXN0aW5hdGlvbiB0byBzZW5kIHRoZSBtZXNzYWdlIHRvLiBEaWZmZXJlbnQgZGVzdGluYXRpb25zIG1heSB1c2XAICAgZGlmZmVyZW50IHNlbmRlcnMgdGhhdCBjaGFyZ2UgZGlmZmVyZW50IGZlZXMuLHAgQSB0cmFpdCBvZiBYQ00gcGF5bWVudCBBUEkuAKggQVBJIHByb3ZpZGVzIGZ1bmN0aW9uYWxpdHkgZm9yIG9idGFpbmluZzoAxCAqIHRoZSB3ZWlnaHQgcmVxdWlyZWQgdG8gZXhlY3V0ZSBhbiBYQ00gbWVzc2FnZSwFASAqIGEgbGlzdCBvZiBhY2NlcHRhYmxlIGBBc3NldElkYHMgZm9yIG1lc3NhZ2UgZXhlY3V0aW9uIHBheW1lbnQsAQEgKiB0aGUgY29zdCBvZiB0aGUgd2VpZ2h0IGluIHRoZSBzcGVjaWZpZWQgYWNjZXB0YWJsZSBgQXNzZXRJZGAuoCAqIHRoZSBmZWVzIGZvciBhbiBYQ00gbWVzc2FnZSBkZWxpdmVyeS4A8CBUbyBkZXRlcm1pbmUgdGhlIGV4ZWN1dGlvbiB3ZWlnaHQgb2YgdGhlIGNhbGxzIHJlcXVpcmVkIGZvcnUBIFtgeGNtOjpsYXRlc3Q6Okluc3RydWN0aW9uOjpUcmFuc2FjdGBdIGluc3RydWN0aW9uLCBgVHJhbnNhY3Rpb25QYXltZW50Q2FsbEFwaWAgY2FuIGJlIHVzZWQuJERyeVJ1bkFwaQgwZHJ5X3J1bl9jYWxsDBhvcmlnaW6hAhBjYWxsqQFMcmVzdWx0X3hjbXNfdmVyc2lvbhAhEQREIERyeSBydW4gY2FsbCBWMi4sZHJ5X3J1bl94Y20IPG9yaWdpbl9sb2NhdGlvblkFDHhjbeUHQREEUCBEcnkgcnVuIFhDTSBwcm9ncmFtJLEBIEFQSSBmb3IgZHJ5LXJ1bm5pbmcgZXh0cmluc2ljcyBhbmQgWENNIHByb2dyYW1zIHRvIGdldCB0aGUgcHJvZ3JhbXMgdGhhdCBuZWVkIHRvIGJlIHBhc3NlZCB0byB0aGUgZmVlcyBBUEkuAIEBIEFsbCBjYWxscyByZXR1cm4gYSB2ZWN0b3Igb2YgdHVwbGVzIChsb2NhdGlvbiwgeGNtKSB3aGVyZSBlYWNoICJ4Y20iIGlzIGV4ZWN1dGVkIGluICJsb2NhdGlvbiIu5CBJZiB0aGVyZSdzIGxvY2FsIGV4ZWN1dGlvbiwgdGhlIGxvY2F0aW9uIHdpbGwgYmUgIkhlcmUiLh0BIFRoaXMgdmVjdG9yIGNhbiBiZSB1c2VkIHRvIGNhbGN1bGF0ZSBib3RoIGV4ZWN1dGlvbiBhbmQgZGVsaXZlcnkgZmVlcy4AmQEgQ2FsbHMgb3IgWENNcyBtaWdodCBmYWlsIHdoZW4gZXhlY3V0ZWQsIHRoaXMgZG9lc24ndCBtZWFuIHRoZSByZXN1bHQgb2YgdGhlc2UgY2FsbHMgd2lsbCBiZSBhbiBgRXJyYC5lASBJbiB0aG9zZSBjYXNlcywgdGhlcmUgbWlnaHQgc3RpbGwgYmUgYSB2YWxpZCByZXN1bHQsIHdpdGggdGhlIGV4ZWN1dGlvbiBlcnJvciBpbnNpZGUgaXQuZQEgVGhlIG9ubHkgcmVhc29ucyB3aHkgdGhlc2UgY2FsbHMgbWlnaHQgcmV0dXJuIGFuIGVycm9yIGFyZSBsaXN0ZWQgaW4gdGhlIFtgRXJyb3JgXSBlbnVtLlBMb2NhdGlvblRvQWNjb3VudEFwaQRAY29udmVydF9sb2NhdGlvbgQgbG9jYXRpb25ZBUkRBJAgQ29udmVydHMgYExvY2F0aW9uYCB0byBgQWNjb3VudElkYC4EDQEgQVBJIGZvciB1c2VmdWwgY29udmVyc2lvbnMgYmV0d2VlbiBYQ00gYExvY2F0aW9uYCBhbmQgYEFjY291bnRJZGAuSE5vbWluYXRpb25Qb29sc0FwaSg8cGVuZGluZ19yZXdhcmRzBAx3aG8AGAQ1ASBSZXR1cm5zIHRoZSBwZW5kaW5nIHJld2FyZHMgZm9yIHRoZSBtZW1iZXIgdGhhdCB0aGUgQWNjb3VudElkIHdhcyBnaXZlbiBmb3IuRHBvaW50c190b19iYWxhbmNlCBxwb29sX2lkEBhwb2ludHMYGAT0IFJldHVybnMgdGhlIGVxdWl2YWxlbnQgYmFsYW5jZSBvZiBgcG9pbnRzYCBmb3IgYSBnaXZlbiBwb29sLkRiYWxhbmNlX3RvX3BvaW50cwgccG9vbF9pZBAkbmV3X2Z1bmRzGBgE/CBSZXR1cm5zIHRoZSBlcXVpdmFsZW50IHBvaW50cyBvZiBgbmV3X2Z1bmRzYCBmb3IgYSBnaXZlbiBwb29sLkhwb29sX3BlbmRpbmdfc2xhc2gEHHBvb2xfaWQQGASwIFJldHVybnMgdGhlIHBlbmRpbmcgc2xhc2ggZm9yIGEgZ2l2ZW4gcG9vbC5QbWVtYmVyX3BlbmRpbmdfc2xhc2gEGG1lbWJlcgAYEMwgUmV0dXJucyB0aGUgcGVuZGluZyBzbGFzaCBmb3IgYSBnaXZlbiBwb29sIG1lbWJlci4ATQEgSWYgcGVuZGluZyBzbGFzaCBvZiB0aGUgbWVtYmVyIGV4Y2VlZHMgYEV4aXN0ZW50aWFsRGVwb3NpdGAsIGl0IGNhbiBiZSByZXBvcnRlZCBvbhwgY2hhaW4udHBvb2xfbmVlZHNfZGVsZWdhdGVfbWlncmF0aW9uBBxwb29sX2lkECAg5CBSZXR1cm5zIHRydWUgaWYgdGhlIHBvb2wgd2l0aCBgcG9vbF9pZGAgbmVlZHMgbWlncmF0aW9uLgBJASBUaGlzIGNhbiBoYXBwZW4gd2hlbiB0aGUgYHBhbGxldC1ub21pbmF0aW9uLXBvb2xzYCBoYXMgc3dpdGNoZWQgdG8gdXNpbmcgc3RyYXRlZ3lBASBbYERlbGVnYXRlU3Rha2VgXShwYWxsZXRfbm9taW5hdGlvbl9wb29sczo6YWRhcHRlcjo6RGVsZWdhdGVTdGFrZSkgYnV0IHRoZSBwb29s6CBzdGlsbCBoYXMgZnVuZHMgdGhhdCB3ZXJlIHN0YWtlZCB1c2luZyB0aGUgb2xkZXIgc3RyYXRlZ3kZASBbVHJhbnNmZXJTdGFrZV0ocGFsbGV0X25vbWluYXRpb25fcG9vbHM6OmFkYXB0ZXI6OlRyYW5zZmVyU3Rha2UpLiBVc2WJASBbYG1pZ3JhdGVfcG9vbF90b19kZWxlZ2F0ZV9zdGFrZWBdKHBhbGxldF9ub21pbmF0aW9uX3Bvb2xzOjpDYWxsOjptaWdyYXRlX3Bvb2xfdG9fZGVsZWdhdGVfc3Rha2UpVCB0byBtaWdyYXRlIHRoZSBwb29sLnxtZW1iZXJfbmVlZHNfZGVsZWdhdGVfbWlncmF0aW9uBBhtZW1iZXIAIBwpASBSZXR1cm5zIHRydWUgaWYgdGhlIGRlbGVnYXRlZCBmdW5kcyBvZiB0aGUgcG9vbCBgbWVtYmVyYCBuZWVkcyBtaWdyYXRpb24uANggT25jZSBhIHBvb2wgaGFzIHN1Y2Nlc3NmdWxseSBtaWdyYXRlZCB0byB0aGUgc3RyYXRlZ3lVASBbYERlbGVnYXRlU3Rha2VgXShwYWxsZXRfbm9taW5hdGlvbl9wb29sczo6YWRhcHRlcjo6RGVsZWdhdGVTdGFrZSksIHRoZSBmdW5kcyBvZiB0aGUZASBtZW1iZXIgY2FuIGJlIG1pZ3JhdGVkIGZyb20gcG9vbCBhY2NvdW50IHRvIHRoZSBtZW1iZXIncyBhY2NvdW50LiBVc2UpASBbYG1pZ3JhdGVfZGVsZWdhdGlvbmBdKHBhbGxldF9ub21pbmF0aW9uX3Bvb2xzOjpDYWxsOjptaWdyYXRlX2RlbGVnYXRpb24ppCB0byBtaWdyYXRlIHRoZSBmdW5kcyBvZiB0aGUgcG9vbCBtZW1iZXIuUG1lbWJlcl90b3RhbF9iYWxhbmNlBAx3aG8AGARlASBSZXR1cm5zIHRoZSB0b3RhbCBjb250cmlidXRpb24gb2YgYSBwb29sIG1lbWJlciBpbmNsdWRpbmcgYW55IGJhbGFuY2UgdGhhdCBpcyB1bmJvbmRpbmcuMHBvb2xfYmFsYW5jZQQccG9vbF9pZBAYBJwgVG90YWwgYmFsYW5jZSBjb250cmlidXRlZCB0byB0aGUgcG9vbC40cG9vbF9hY2NvdW50cwQccG9vbF9pZBARCwQtASBSZXR1cm5zIHRoZSBib25kZWQgYWNjb3VudCBhbmQgcmV3YXJkIGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBwb29sX2lkLgT4IFJ1bnRpbWUgYXBpIGZvciBhY2Nlc3NpbmcgaW5mb3JtYXRpb24gYWJvdXQgbm9taW5hdGlvbiBwb29scy4oU3Rha2luZ0FwaQxEbm9taW5hdGlvbnNfcXVvdGEEHGJhbGFuY2UYEAQRASBSZXR1cm5zIHRoZSBub21pbmF0aW9ucyBxdW90YSBmb3IgYSBub21pbmF0b3Igd2l0aCBhIGdpdmVuIGJhbGFuY2UuXGVyYXNfc3Rha2Vyc19wYWdlX2NvdW50CAxlcmEQHGFjY291bnQAEAQ5ASBSZXR1cm5zIHRoZSBwYWdlIGNvdW50IG9mIGV4cG9zdXJlcyBmb3IgYSB2YWxpZGF0b3IgYGFjY291bnRgIGluIGEgZ2l2ZW4gZXJhLjxwZW5kaW5nX3Jld2FyZHMIDGVyYRAcYWNjb3VudAAgBD0BIFJldHVybnMgdHJ1ZSBpZiB2YWxpZGF0b3IgYGFjY291bnRgIGhhcyBwYWdlcyB0byBiZSBjbGFpbWVkIGZvciB0aGUgZ2l2ZW4gZXJhLgA4R2VuZXNpc0J1aWxkZXIMLGJ1aWxkX3N0YXRlBBBqc29uOFERKGUBIEJ1aWxkIGBSdW50aW1lR2VuZXNpc0NvbmZpZ2AgZnJvbSBhIEpTT04gYmxvYiBub3QgdXNpbmcgYW55IGRlZmF1bHRzIGFuZCBzdG9yZSBpdCBpbiB0aGUkIHN0b3JhZ2UuACkBIEluIHRoZSBjYXNlIG9mIGEgRlJBTUUtYmFzZWQgcnVudGltZSwgdGhpcyBmdW5jdGlvbiBkZXNlcmlhbGl6ZXMgdGhlIGZ1bGxVASBgUnVudGltZUdlbmVzaXNDb25maWdgIGZyb20gdGhlIGdpdmVuIEpTT04gYmxvYiBhbmQgcHV0cyBpdCBpbnRvIHRoZSBzdG9yYWdlLiBJZiB0aGVVASBwcm92aWRlZCBKU09OIGJsb2IgaXMgaW5jb3JyZWN0IG9yIGluY29tcGxldGUgb3IgdGhlIGRlc2VyaWFsaXphdGlvbiBmYWlscywgYW4gZXJyb3I0IGlzIHJldHVybmVkLgBdASBQbGVhc2Ugbm90ZSB0aGF0IHByb3ZpZGVkIEpTT04gYmxvYiBtdXN0IGNvbnRhaW4gYWxsIGBSdW50aW1lR2VuZXNpc0NvbmZpZ2AgZmllbGRzLCBub1wgZGVmYXVsdHMgd2lsbCBiZSB1c2VkLihnZXRfcHJlc2V0BAhpZFUR2Qc4YQEgUmV0dXJucyBhIEpTT04gYmxvYiByZXByZXNlbnRhdGlvbiBvZiB0aGUgYnVpbHQtaW4gYFJ1bnRpbWVHZW5lc2lzQ29uZmlnYCBpZGVudGlmaWVkIGJ5GCBgaWRgLgBVASBJZiBgaWRgIGlzIGBOb25lYCB0aGUgZnVuY3Rpb24gc2hvdWxkIHJldHVybiBKU09OIGJsb2IgcmVwcmVzZW50YXRpb24gb2YgdGhlIGRlZmF1bHRJASBgUnVudGltZUdlbmVzaXNDb25maWdgIHN0cnVjdCBvZiB0aGUgcnVudGltZS4gSW1wbGVtZW50YXRpb24gbXVzdCBwcm92aWRlIGRlZmF1bHRgIGBSdW50aW1lR2VuZXNpc0NvbmZpZ2AuACEBIE90aGVyd2lzZSBmdW5jdGlvbiByZXR1cm5zIGEgSlNPTiByZXByZXNlbnRhdGlvbiBvZiB0aGUgYnVpbHQtaW4sIG5hbWVkUQEgYFJ1bnRpbWVHZW5lc2lzQ29uZmlnYCBwcmVzZXQgaWRlbnRpZmllZCBieSBgaWRgLCBvciBgTm9uZWAgaWYgc3VjaCBwcmVzZXQgZG9lcyBub3RhASBleGlzdC4gUmV0dXJuZWQgYFZlYzx1OD5gIGNvbnRhaW5zIGJ5dGVzIG9mIEpTT04gYmxvYiAocGF0Y2gpIHdoaWNoIGNvbXByaXNlcyBhIGxpc3Qgb2ZNASAocG90ZW50aWFsbHkgbmVzdGVkKSBrZXktdmFsdWUgcGFpcnMgdGhhdCBhcmUgaW50ZW5kZWQgZm9yIGN1c3RvbWl6aW5nIHRoZSBkZWZhdWx0ZQEgcnVudGltZSBnZW5lc2lzIGNvbmZpZy4gVGhlIHBhdGNoIHNoYWxsIGJlIG1lcmdlZCAocmZjNzM4Nikgd2l0aCB0aGUgSlNPTiByZXByZXNlbnRhdGlvbmEBIG9mIHRoZSBkZWZhdWx0IGBSdW50aW1lR2VuZXNpc0NvbmZpZ2AgdG8gY3JlYXRlIGEgY29tcHJlaGVuc2l2ZSBnZW5lc2lzIGNvbmZpZyB0aGF0IGNhboQgYmUgdXNlZCBpbiBgYnVpbGRfc3RhdGVgIG1ldGhvZC4wcHJlc2V0X25hbWVzAFkREFEBIFJldHVybnMgYSBsaXN0IG9mIGlkZW50aWZpZXJzIGZvciBhdmFpbGFibGUgYnVpbHRpbiBgUnVudGltZUdlbmVzaXNDb25maWdgIHByZXNldHMuAGEBIFRoZSBwcmVzZXRzIGZyb20gdGhlIGxpc3QgY2FuIGJlIHF1ZXJpZWQgd2l0aCBbYEdlbmVzaXNCdWlsZGVyOjpnZXRfcHJlc2V0YF0gbWV0aG9kLiBJZgEBIG5vIG5hbWVkIHByZXNldHMgYXJlIHByb3ZpZGVkIGJ5IHRoZSBydW50aW1lIHRoZSBsaXN0IGlzIGVtcHR5LgTwIEFQSSB0byBpbnRlcmFjdCB3aXRoIGBSdW50aW1lR2VuZXNpc0NvbmZpZ2AgZm9yIHRoZSBydW50aW1lPFRydXN0ZWRRdWVyeUFwaQhIaXNfdHJ1c3RlZF9yZXNlcnZlCBRhc3NldF0RIGxvY2F0aW9uWQVhERTwIFJldHVybnMgaWYgdGhlIGxvY2F0aW9uIGlzIGEgdHJ1c3RlZCByZXNlcnZlIGZvciB0aGUgYXNzZXQuADAgIyBBcmd1bWVudHN0ICogYGFzc2V0YDogYFZlcnNpb25lZEFzc2V0YC6MICogYGxvY2F0aW9uYDogYFZlcnNpb25lZExvY2F0aW9uYC5UaXNfdHJ1c3RlZF90ZWxlcG9ydGVyCBRhc3NldF0RIGxvY2F0aW9uWQVhERTgIFJldHVybnMgaWYgdGhlIGFzc2V0IGNhbiBiZSB0ZWxlcG9ydGVkIHRvIHRoZSBsb2NhdGlvbi4AMCAjIEFyZ3VtZW50c3QgKiBgYXNzZXRgOiBgVmVyc2lvbmVkQXNzZXRgLowgKiBgbG9jYXRpb25gOiBgVmVyc2lvbmVkTG9jYXRpb25gLgTsIEFQSSBmb3IgcXVlcnlpbmcgdHJ1c3RlZCByZXNlcnZlcyBhbmQgdHJ1c3RlZCB0ZWxlcG9ydGVycy6pAVRpEQA="; +var wnd_metadata_default = binMeta; +export { + wnd_metadata_default as default +}; diff --git a/examples/with-vite-papi/.papi/descriptors/dist/wnd_metadata.d.ts b/examples/with-vite-papi/.papi/descriptors/dist/wnd_metadata.d.ts new file mode 100644 index 0000000..e54c947 --- /dev/null +++ b/examples/with-vite-papi/.papi/descriptors/dist/wnd_metadata.d.ts @@ -0,0 +1,2 @@ +declare const binMeta: string; +export default binMeta; diff --git a/examples/with-vite-papi/.papi/descriptors/package.json b/examples/with-vite-papi/.papi/descriptors/package.json new file mode 100644 index 0000000..e9a3ba9 --- /dev/null +++ b/examples/with-vite-papi/.papi/descriptors/package.json @@ -0,0 +1,24 @@ +{ + "version": "0.1.0-autogenerated.18249752907713047967", + "name": "@polkadot-api/descriptors", + "files": [ + "dist" + ], + "exports": { + ".": { + "types": "./dist/index.d.ts", + "module": "./dist/index.mjs", + "import": "./dist/index.mjs", + "require": "./dist/index.js" + }, + "./package.json": "./package.json" + }, + "main": "./dist/index.js", + "module": "./dist/index.mjs", + "browser": "./dist/index.mjs", + "types": "./dist/index.d.ts", + "sideEffects": false, + "peerDependencies": { + "polkadot-api": "*" + } +} diff --git a/examples/with-vite-papi/.papi/metadata/dot.scale b/examples/with-vite-papi/.papi/metadata/dot.scale new file mode 100644 index 0000000000000000000000000000000000000000..6d1a37047ee76d25204930f3606a501360a70ba6 GIT binary patch literal 411737 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ℑ>auJ48l&wAYT!11bWJdK4MM@1cM|&r1L;G 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 z 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

+wBlx#a4@>Y;R++D(;tmwfGi117^Qj?%oht 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 literal 0 HcmV?d00001 diff --git a/examples/with-vite-papi/.papi/metadata/ksm.scale b/examples/with-vite-papi/.papi/metadata/ksm.scale new file mode 100644 index 0000000000000000000000000000000000000000..294de968f5cd836fbc7290b5e5a97e310dcdd294 GIT binary patch literal 473903 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

1-Q@gHN9%mq=;ZJR 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 literal 0 HcmV?d00001 diff --git a/examples/with-vite-papi/.papi/metadata/ksmcc3.scale b/examples/with-vite-papi/.papi/metadata/ksmcc3.scale new file mode 100644 index 0000000000000000000000000000000000000000..6d1a37047ee76d25204930f3606a501360a70ba6 GIT binary patch literal 411737 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ℑ>auJ48l&wAYT!11bWJdK4MM@1cM|&r1L;G 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 z zRbeVfFqA*ukA(Qgn2;;GjIS5?PgSxT^xqq|WH(-(6ZExa6=pCy;%XF^bf?x>JdQ?d zLivvx&903v=;2B@Pg&7M^QN8oIi#miNoj|aMq_rMs{fVmZ%7xrK!4Ayw(f{!Hwna> zcV_%!rH6*HeQMahGuwZ8nD^SfXk|NE#@yn>KIncUo*%$&hIUns*c34;^D}1Ev#Nf~VH= zAYkfeYNWTrAw$LjgUFKT39ai#=D5y0eQ0$UQFU&`uJoK}ogb8Js)KOoV4y2}hw8&BHHQAp2O=lKNGV-w+aVUPh7z7|y+(ndBO z(vRtLR48N8s*5DXA_Z^-V15%~u#^$gamE;(Y(Mw=ex^9J@M^6( zhT$KxFM+Q}=r`vQ(fy8N477!Q@FVM|yH_E%3Re`YMu98vW}4CRnFQ!nic)#B5eu$Y zGM4PxuIuyCJ#G&>A#Z8jVg$eOTOw1@ya&~ADbgZyuaVZbbcbn3V*0#-OitSiPI zzaCb5MERu6gfto?$CEBe9|P^?;gMN)<##k{6f7~an4}%zD1*uYSCuDCHaQ=SDA0H% zu}g~{6=_oNLHg)nx~>%886cGsLy3ER402ij!N!{eM* z5we5^*Li)cYF+2p^sc(hkSfcz4!VMcr6cF)p-Gg#jYhdTHNT<(t5W3BP_kn?6T1p^ z^ETNeqPoc)ZeGQE(CWJMrW0qTn^R;YJGFRJnkUj(g9r&2vq}l$xE2@hlqw^$3af_v z-LBf*zB9iuH?z;tNJCF^=Nq04YbHnw*4iKTBCsVIwKtr0WoO3}Aklx{oA>R2<$^&b z%C}yEGuuT~$hKtrGqTnRTVx2%ZkKd&$Igs@h${=*Ms{ZWqh!<0jDIveRrvfj3qc%T<$_;YJRbTgmBklRD;woQfRmVa;Aohx~DFRj>-$KMHe=1^? za7%JUnl#$35Ri)D$m;w9m8{%5%cgd=M|(cFjp)$EPE6f%>`caA*_L~E+QXKGof-ci z1rKhc{lUwtF}np^>%Q?z7tGc?Vn$67NFzJzO>n#OK~t53{owNILFn4F1jU!{+Kp|k zg8=u3i}amWa`Qg3O}18d=I<1ljnE%e0j)Mo8dZ8#YqPd9Tf3Tt7-}18-SqRW{!NT>dpOG=@)y_MwKG2y209a(bQs=sHK2FC z*mW3|@s_0#QBVngWU|RJ*(m1WKa@nV8~jH^H}#QsYn?t*$=<8~KE5S;^lCn82lvF> zg~s&SG^tLy-thM!NE$xJe=ttq<(X>q5EH z4I)fEk&tpAv>;nj$1Q|(nLKrk^_Ay7pk;k(XZF-p0keMi2+Tl~tPPu_Y7d$@9_(=h z6V>{#?cmPrqnipu!vVfnrn?TFWNQ6!HfQEqUF~rx%oGwjAZ$tAd2xda|3)8!)lPQXwt@I z`QBxQv_e?bysF`U0V>NCgUeHLCxe}ag(11Gib9c4)%R=6=wOY07UU0Pgr(IKf+KSd z3UVM9EY0<~y$2VT-b~QVl2Z~%F2U1+?ufVRj}F> zm&N@vm@bgmigC_GLR*NpL>B9+|EHwggpi(6USysJ$mb7qDvsv(mQ8$BufLsHhRk{9)!L zpldTi)ar4#AOssR4v7LjZ_|w`y-iob>qb+a3wQF4#oB_C zjnasYhC5^8h*_42GH|3giuSKmuLzcDeOou|%nyql6nHWN8|ZUq^2R?71tfFnZ@tu$ zeMXQzzcYJ&XIDLGvnDMTDlOL;&0L^UC~sUaeykH$xC@PPi)B^?UfaDp-3zUY!}+0g z?{l-{^2^gJ_t!ZYDHQIg1;L{iA|o=g+w3*lW|Qg-DHDJ162bp%$2bqz$H|Ju%se<&cm$dX^bJmWQ#>g2oQ6T-04&P-SiJq9%!q@xef z&>@P;qHN)Uj*-ElyFhk5>_0VbhqVnAXdSj1cP;D6xQK9C*T~&1Qd~iCkgwYOx>0@+ zhv(7YZiWq$KTacX@GTi{#2*bM*JzEpFKs}?S3@AB2lQW4A=qWZVag7K5JTzF`&7$l z8&_b3Jv{>zgFSzweaPT*DD0v15|o3r53U=kG)xg0l;eLn`76vIoL@}U z3~oU?n@+$;Nok`)2+Wugh^wyCtiX>O8`+r!ytdYFY=l8%7_z5tul!zl?nS{Sqn*)h5mEq%Ps=>!w}0N#F>qKL3$PJ^hSOUJdR$pBAkHKa z@fz7p*1^}l6gw+7=K`@fIdP0DuSN*5C@scOWkf2i1*tbztpfHt0Jpp1cRRv#b@Jun zB5szKBs_$pPZmqM=oFn_vIg@)mHfzPtr|PvP>Oxv71{-?@I6 zu;6FK=g7%N$iD@WMK~SqKrnRv;>sl&Qj>X+ic4A%oy?;?!?smp?G!}7!U(lleY3P1bL+ zVD`8yWb1gSp{pELqi*FPFwcV6qC^W`6xezd0_iuzC~w-5y|k%{JrLwh6-mpop}g*K zcQMF?=pwX@Iox8`@61WfUY0?ng~%E~kj~7~!eoogqUh0YTOIz{>Kkso|H@%QB?0%_ zJ9B)VjOWp*g`BIl;Lk9(yX0PlBTdUpzBc(lW34r}J-3k7u&OI-cr^UyOB*I1RENMjJU+PhyW*F=oq@sn~OQ88o@xI_1#4 zD=Do-c^QH`PR_7Tqz-YIlJSCD8A?0kX-aGNjVw+pmT~<^2%wLJpEejHy?&V(mo1fV zCA1Gl2o&VP_yNspvq+ekAsRalcUUE^sk}3^6~P8raf$(J$I`5m;RR9iivzZ$zQH{>9Fc^V;Yb171US9Jl>VNSF0tXja%nKoq)|U zoZDC&ThSw79>v1ty;r5z_ixQl*cgn3wY>qmcBAUn?sl(KL8G>J zbL{j#TY9=P{+VMM>UCZB?#o3n#&yBGhb3KCdOD9}s_ya&jkQw`>Av3V-10biCob?6 z$@)-^vc337>WRL90G1)_FFrnayyS)u!fzTy3dh2EJVK4K^t-JU30Yp}kh6?(BhEhw=X^GnHEa zZ^WQzFWLc==?4Nu=+GuV4_&}}uErQA2OxBl|nPd_Z5mOqDxpD^&|W4}S$o!b>$~S>9$vRi_Sr1}aC`TwEm;(jI^979Ly7I=SIX|t6#KG~ zS3QeP^4PW4c3*dxSj2DY+?yCy1k@>O#Q@=3@?TEcZ*{W4aBEPWDHs=_>*Q8mK0~!B z>fKK_j#<^P3DnP%uOkhcXy83E?w41QPI!c(}Q8VCLdaAK5%b$N}Kmq9!-w3ZrR=4<@{1- z32Eq6HV}?kudduzva_r;5d&vmE%581O3))Kk@U|b{9d`x?a%DqHaPC@gyVjP?p{6cM$!Mo!iZUsDzaEHYS*?7hS2 z55d?O(ZiqK9yqhl6X^V7#YJH^RLxLvm}KpUi}-5EjY= z$tukP?&dhOYKM}16h2pxkuv%u&~E_&(_}pQ$+zpqX3nt*a2~iA%*DEux|lwbUL7w@ zA2Zb%%UppN_DuSkS8pRAyk);hoiM&8enE zR>(5dwFet9cjZ>{tSEb-uv+~6c>aj-j2-xEgKK_$3O{Phe5vq&ohN7xmbluzY2nB9 zz;xo`a7Wn2j2I#H7){95#RW|Sm6EJP!8Tcn^2mvsOx>ddTY5!BWlZ%@{Dpd2^ebYu zi_=0J(?8t6O6&2N8j+Bt>l)Wo?u#0>R<`8J?z~A-sc=KaC2H%da4t7xn)6#}03a;x zUFH4*Cg3{(|JgNB3h?S0#3|J(-}XqE}CUKj)(wA8a>3bXzUGUqj5L+ zqy?>=Ftj8&((yd5r(tO#KD-0~{dDinwi!tw*g*QzH~D1%7EBHTslqhCR>tr)l{ zBPo@|radzcg? zQjd1?uPkLf-YMNYPG_Vn{fDgdkE0(vx%ooieXy)x8?42i(Gmac_#$Q!tJuwmPgq)o z@RrC$q;mwaVKT99wNYD)al4z$+el`x@JB@P{OtIxWxX9Pe{i2>r54xzbRx3Q$#d}- ziCRQjfqjfUI_imT0+fWNkp@SMGb$GW$eOYW$4-@slE!FL;;)0@r!h<;r1~JYpwC)& z0@CE*=bV?rf#lolW=^eg;mmI#3GvHoVYBqST*6^~Hm+)E5^%0uyqeIX4{Xj=_f9vL z9-5&X^kP-DlEhDY%SHMMj#>`i$$JM%+rrJ#{(Q4^tW;ucO5184$AlL&1G`&dcfp$S zjcmk|n^UB?pDEwQ?`GjTf`|xmDEAqa>lt6A^E>%m$VJC%3uzDu?gj;hM~fK$+h zWRjrzO3_l@8seI>4{v@*i~a5tS?(LXQ%X?VS<6BSJU<^DXRa`+OX9GFZ0l2-DGkX* zkUOWi9UI~!^KgT$^DRW-2Bmi;8pmsNI5!JX`wi8)LbTv7tBrbXUJL0!A8Bw#8l_Ki z>c6F*+ki^t6+>l3m)|?VsMU*+*TH@bvV_r~jBn%}9`+T3a?fdp#1SvgocmJFYL3vMAcVSU_rRl=0WiW2=Yz zFuKG!zkqL~r63DX)nU(dCX>ZsyRoUYh);6^C3_Kp~RPzMQ}c4 zf|2E#6h|_7jOdcj8#^o(KH0`ihDrC$O0rSS>5<=<;o9l-;3V567Gi@2tf$G#db#`F zR6d!VP{vU-(Hu;CR)(+hu*=2T;UjYxBaPIBp?6gdtQ%UD--t_tBh6cw_D0``X<9qK zFeqXP^8_Jbl&^7qUd&wVQaC4&Kuy>soVL7At*kf3RY}OhXE9yE7EKp25bS$EmPW1} z2%g==T67a zOXqKLC}73LPCb^VpTG`lW#&?JTzRXj?s46Y?Lw&#ywUk^DMJHmt~BfWgFmQ-T0_c|q#7c^SF5^16S#ySqQ+se5>OA*}8I*8b+2 z?2)Uj4jE=oZ~&99A6-#*W*f~hlJnn#lL+ywF@u(CtB~a<$ccSkwJ5mhuT)uBv6@eJ zr(y;jZy-7nkgZohw7CmwpX|;L2LZER2}M?iWggul^E#0S>qN&aI}`>4A51uua) zs9ya0WLv*yJGHcDT}#t{DqUS&*>l}p-E2>>#swhVUH9Bt$)3XyeCbvd9ti+$$-3@& zLnV7f?QbZxUqky)C7ZgI_MuXHh58=$wO(L+-n7HP{@(0!ui6pyLU-j1P-kB#d7@sh zk;l*~zQA8wc>K~vXg3k|&$C*BOJE?EBl2GAHDU1K`e;nL7&;#rI;z7f#lr4o94!_ecgzU(Do2T$LA)x*9VhW%b?*q3eCKJfW_8kfiKZ?q|;nh5oQ zvx|rbkWTgmugCp}NJ>TCLa;)d#(j=g+^lo5-K-XU2dWpjU)VGuBHp}%8Y9TS-<8$} zvDk{Sk!(h${ywO+N_C$>77|G(Cm1AUM4t=7cMG3b)ia$Vs*p&lf3Ak44qX(bpJ6~5 zjKXmH#C8=rE{-cM5JKf^pGW*9RkdKiF-z9*3;0S^uStdnPja>Xm1@j75Y5mr>^>zD zu!3T8kw`sMh62SVSq=j&TL|#S;PM;HCPIR68L}L-C77QPb3{i#9<1Y6jLXZxMVP|T zq4Plq*zanj^77XskAcTVajH<$FiG+*WA1j3(N<@J1*1guWVJB#u-J`-Hy=$^~aWNSQ|{s^MUmvu9eCN*qHr| z+QnKqF0JJJn?Jv%Yl}@3F@y} zTvHD+X@N?1+jKuvpo~hk&7r^3mmtk`;!*#JrH4Wp8>0Vx?cFVuluI6|8Ztk>FYdA- z7~gZl`WmEzATp;SLIPsrgCl^PAA_LfNwAU)exQXO_nSI;K7fBl+L1ICLtWO4r0L+3 z#<5;VuI{?y44;wtpn*1oZYOPXlMK5k59mY2^9sb61S+ZTf2~$8Gwa*0;3a;S97^xe^2RwzCdV7S~7< zr;a-+SZcFD;T#eDIO|EfkpJYp$*!+_H~i|`G9YqX57Ns3}*SKhoIpN#z05PqZIVD#V{k8pxKh_Qf)C(VJWj~>1i>PKJ zb&L>RPM8rg_+O5U8t<4-*>p%dL?$>YwKOOR@J@E0iuMp2Y)h(rB3cOz2tBUCE%U?f zuJNEx1;*()g7+R-TJmt1%1~gDPQCLNuH};JZnM*%QjH_=hL}A!kC$6wL}9t@u-P;w zxt4QrmYZPB)+^oldtv~4YCP2TP2FD@ir|5^iz|afmAr9CQ6*fi3lG^VZ9;F}(;@Zd zJtp?%JsZ!t|E~1?4JJ+8u;MpgxHfNJ5P(o{Q)hd&mCseWUbwb5+rG&cd$oLBy}G2B z_bSK3vi{6;i^lk_!3O}ku=Wyz5H{5zC0y0n)IIMow)AMQr{5s2hUDwmSA*ywnNcIju(U5JHgIp{3GX{^q z=0PC)A(0>Wov1ts>lSqRE38|P1dz8v);t9Yham`N-qWy@{Ix!+RhZURd5?X>)TX)IW85_M1}uoidvxg`Kad#ey$q0Bc38t6AKvx*SUspcF8 zMo~y#rzj4yJWzK8Ut}*4XvTq`gm1TM^@-x`vx@;@+r?{pSuln#fm#02YPoYQyEi|h z!pY`qMjMda8&dTQSVXk|ySR$gjEb%e62Ai$q*caLvCDAjxhhMSlIk%NVmg*qFV1qT zNUsIRHQ9_-8{35`O zJfiX%NdU0GO5vS~twjKX$uaBwz`~R$*g_GYD;wFa@97>5Ou^Wg6$b4*rrn1F7dMXXw;}ujfCp|k zGxY$2kfbx!B^dLo&3WZ+VO}g{Ajv=hN^RmR-fauuV#PtdC}YdMVpA^;h?1jla3%8> zE}|`!FUp%@Wx$rqb}6}vON=niX$xKnI_R7Y&8=7lxC+L3!>gu<`?k2H>BgQS=J`fg z#Fl+qvYUFk2g8aZ3tU+1TF~#8xbiuE+V;kznLrWhN7* z@?p_loK(^VF3!qge$4blBA}I9;fytL?E!;kc3|_Nj`>gucb^RB_OOj}hL(F=l@Fub zw)rTBeUug4?f%NJjWO|X`v|vhKEjZXAe$FCwg&C>xA;T&{2iOWe8^wMmrk-JvX=VS zPsT?ZppuRB3M+ z267&^#7FGnJYEwYF^BV5iI2D0a&|R0F9lRe)&ko;f78W?(aBs_tWXw;oF;@9lo2>v%~kt(zC<&Gx2%I;pB@6GAi;rqGt?C>2<&ko;6 zdUp7Zq-TfkXnJ<|M$@yyHx{4YDl4CD?K}Wr{eRl!#AFu9lpEMv%_~fJv)47(zC-ik)9pCv+3F4yC*$6d~Z$9 z4&S--?C{+ipKo{gela~ed~Zw74&Qz0+2OlCJv)4VB0W2Nlj+&vtEXp&Zz?@IeCN}% z!#ADnjr7?8oGBU{!bZ{HAYLdM9L9@9g9ABRG&q!VMT3L+_M*Yze4uD>K3fO>hxENggG2hKiw1}E&lC*~>HCTXhxE~+!6E&#MT0~7OQ|6+n#YO;hxGBH z!6E%`iw1}E&lL?0=@UhRL;7UV;E?`u(cqB&cSVCk`u?K9A^kvV2rTEnFB%-uUnv?K z(hn954(U@xgG2h~iw1}EFBA<9>4%C2hxEfmgG2fkiw1}EFQtaSd_Gb%IHVsf8XVHU zTr@bOzgjdnq#r999MX>$4G!sFDHEO8kba|Ra7dpk8XVHURWvxH z|3lH>kbb&oa7aH>G&rRHW6|J{{_Uc{A^mL8;E+C_8UkzjpNa;D^zRf64(V?e4G!t& ziUx=D?-mUX>Hl0bIHbQ-G&rO$6b%mP|57wKr2lJdxOLDe|L2Pahx7|YgG2h;MT0~7 z_lgFG^ovD6eQJhxEnN5O~x-C>k8ne^@j)q+cl-9MZ2A z4G!r)DjFQpe_S*;q`y-%IHX@I8XVI9y=ZVq|BuuVc+~F}4G!toiw1}E|126D(tlDk zIHbQk8n|Ep+lNdIZk;E;Z^XmChhN)3TW{j;LMA^pFL28Z-pMT0~7?V`aU z{pUr4L;5d@28Z-JMT0~7a?#+B{>!4lA^lgWA@Hd077Y&R_lgFG^#3Uu9MXSXG&rQc zUo<$R-!B>*(*L(;a7h16(cqB&plEPNf0!BqkNUSogG2i7iUx=D4~hnd^p&E)A^rD7 zgG2fsvTST~+sA<0KClH%H~P(Nf(2;05o{jc$yLtRTC(i;=A#VyC>~HVV8giMAsAmy z_H@k#=%)AH1sqQmP)sf$MeFU61gFXR40fZ`AG!4P0@>VoBwxVvZ58@zp1 zVZ3#098;lN*&1GihDtbQ%sSiCwc>U$;$WxbCZEK$G&`BhW1|MXQse8#WBle|*90M`9cqX_u-@DmyhOo=tI63cEP)}9_%6MJ<*WqC47_%8-DJ@s%muVdbKvu zUsrA_Z%gm@?irbx!9&x^U&wop;xfut^SvoWd46{5Zgri?v8h%vq9?NlWw{5^)t;`B zz3*Ha5I?;a4KjSlyM{*QapFh#8DQuXIlN+79>srVYdu|i%$(e844+z_!W$LwOy<7f zd{2n~q!va`IlObN)6=~Mbd30J`kl7&JzeCec^^>_@1<|osRt_A`-DW8B%2hw@Xqh; z=`PJ=ynGbxuweVFmrkLXsc8$hM7#C`|3oEwv?q_33rhX@+@9bsqHG9V!b7_RCGt?nk%!0j}%8A9ea2d z@83#`bt60he=X(F`;OAGw19Oq?^+$swq=l<8N!atOuvRX_C$IJ)_a9}ZO``7&2JfI zJGjJp6;s=2QMw0@+69>tgk-EPGsP2kEm5vfNuP>zc$#iIlmvJ`+0!)$M#Xwgt-*+I zqYy8UDz`+|ALuEiLW@0$uwKt7X>rHd2YT9*ojtpijEcix=TqR2{m+&U_hkGd@Zs65 z!`VmI0WfalGk!yBOlc|bFz;P@02gTtYah4(eDjlj)i^fxxi|R9o_yUjK7QqO9W7zm z8QWI;DqyVdI%SwFkcKs^az=G4eO|X1pKd!opX@20pHFJS?FZ?tHE%dk%-^29%%5a-)`g^z;(7o=Qc(H_WP53ngkI3Q#c8TmE5&6u6&>xb>@z^H<@uiM`At7>m1K4K zqmk;&=H1m)Z!7y8v?e|sYQV*^#C%FOnr z-$VHVNC0p6!lwJMZttMer4(je@}d$u;1xi>By{jih$TRkVmJFz8xYS{I)HeVJ0}3~ z;-)~HD`kDMR9FIT=#;rF(8@9li|UVry`y?ev1jDP-a-ksgp z_U=u)I_7Z`o%!xfyRMi__C6QOHwwXNlh1E%`{ZLCUwq6yxUa3({!YO5J7D`a1#D=l zwYE4t84~m&lv-t|c3ucAq(C}(rnzEDQm+HMa?j(f z)GZKr5#v8&$jphh*2(j0BsPw}&1f9`&KKM3+QuH|X3As6nmnzSP)oHqs?#|*OK}2Z zY^!T=+pe4p3ihY!23V;GlW}l61+k!G+k6KZ;caf9A|C zGqx+`R}6L3kmBQyKzPmr8)J(8_?_dsa!Qq$?9+c&%CO9@@oUU3yX`8`DAs;jx5SQ7 zmE5!CPo{Fy@vsXF4<;$J*LXg;f6*6G|RY`uLOfitH z^?W5CPXH7Fa+pRomrgdK4%xlC+LctR6H67QN_IaBV*j&cYFEZT*6G1*{L;`uAz;k4 zE%8F<5--pZR%SQua| z=4hiJxn>XUDqENaoCWbIZuYM;3$3<+|6nKh4?6g3^mEl)W}zX}+IP{{%tAvfP|#}M z<(=QPt7{Y+0zr+Fg*DJGp<Ht^eLGqddF8qJgB1CSUHWLh$`LZ`-uT& z=q+~hbfpokFwjxbGp%8I86=~_1tS0bF4MKy=s0$`#tJP_vcmEbKd8Qb@uVx82tXWx z5d8w0V^Hh2V*qQL>0o)LgB>${Z(HX_ca?iT%3`cr7&Rd(?fSs3>~a3w^5m}U$&J?P z#26QHW@Om)trO(yckTlly|`CBZJ8>)qQ@30Iyg_GE_6FIlJwG#0TA|Bm56+{leVERlm@t z`zu3Anm0-24r6|U;kwQsR}4w5KtSuomD$)>nSL(M`}?`i!?o=<4(-cGJ?u4)R;X`u zyvxOq{?btyz>0Uiks92YAnw?YlYn9`s&iAx`%k9_t`C7qOAlcL7F?~*ST&r{ zbC!K{qp9s46S$hrfCJ95Hy(~~_q$O;13sN|Nr(Stx$2p>P5D2;T>97mR(qi!dv`VbZyxAkk-&+W=rf}mq$OF`AVc__F~ zbeFArWv-kwF8f^DLcY+skT3W`zHk*#VjB&>@X<1y-8qFkT8(ux&-ZW`*SDRRnt3}0 zZ%&IZ?7H8xFSHSjFNsjT7#YZy05y`07aeRhZ6U|Ri@UlHlNBV!MpFl9uGPzmwIVm^ z8#=o3#!Q^ORI+}OCm?{^TU)8x*fy#D@|^lRru4P8&VA+1eI1>@-q!iiYs z<@!cj_m{M~uf)}TskFMU`0Bp2!K&_=q52dd=-4La=SQ1s9HlWXu}+guWVabb@(Gf2 z98R~wB;R9*-@YxMjR(f%gST=4c6_M?1IC@04>$bI#AHK;mDaa+<^5tMHX>+^iJ40^ zlWg(JyYhNC18D=MU| zCbE}VtAfrwy0t^oew3X>VEdlBe}7lTKS$3WXem4N|7XH5RHJx7g!N8b;n6Fl4VEtN`}y70RZ%Wu>jA7(S&wqdry0!j~QUhccje@cZO#= zp}aoZ`_@^c^m**~m27MA3W*@RwFAzdK($f@b~a`Ej{F>A4}W*`>dS~7P`VoS;)We* zFDMMWA?P>YsV6Q3UtuM?vFJ{E0kw6E{*&2mw3LVGJhCHSP6$d%M^{~yfziz2yk?ts zqE>k9pdH6X#)f5&d5fI)zp~eIEmm`o0oUw9||umrr&VP z@Z-9{-<y0M1*9YE!~7H z)WD9{-;fQB(>DpI(1o4(6Q$Ra9NqEiZJFwZ@TzX9u&@@ z)uWPqa;MH=0@&W`=sukF%CcCYZnrQr^_JbWqw^u3RZD`?Dz;^k*x7QXw`Rf*9dEul zycx^Nv7Fu7i1cPGD%SBPH;PUzj$-LvoZ--Q=f6>U2|Y)VA*FI)9j_nGX653R0~w*1 z-jcT?##g9=l7DKW0m&g_?{theB2pKMVpJ$v;fq$Pl+p3VokZkF@rF%x=Mz$)JF%2& zOCftX-Ja~G_G`%Q-Z9#-Z12&SM7%=o>3k+-Qtjx=Wv4jzO7>Ak-E>wzpB+1+sDcU7 zK&BLbV9>VwnQ&M*B`b|dY~SRJv~+wMajNs#UPQQYJI^@Vs7@5#M)vK1ZaO0eYpVsf zxAX*HM2}90%wW;?;Q3iP-kizynu2p0kf`|ClfNgt20rjIMv2bzOuAOPr(EIwc_Q3) zhq+_;&u7_pf}oR!{~n7)P4c|5CF>qR!uv!0zeg(HvUJia)s<2!5zd&hmRg!6C?y)b zZt|0J$x}IzL7+CAV(pHKQ(%;&5bCF^6U3X$lfi*KQ>Y<18}zH^Eh7zq5+1@;EBefPhfV(MXs>~2*2TQCwRh-|D{W!rgCtd4R$?a`pz6LlPg|wgDisUmp=(2F0~Cb-ifrvA z(7AF)t_Z8R`ozyoZ46kof5GwqlB^(hCnulT-<0fQjtsJTc^~;(Ru|3_L7MgU3iQf$ zmT3J>1|ZoSBp`)KA@q{=qgKUEufiqukkZ2gl zz@omNXW~k%w&o$_MC#_OZQNR_8nFQWhzWR+s}@hxxf#IGCLB^ z&3pTmP`XJLYu>0KnFArj#mK1j$W7W1P4EuRk|JEfFkV2u0wVyr6wyg;CO~o z+jw|ioo$#_7N6?e1#%a8o=7WuCImW}+ep5*_Cj3^%AMwj#Y;j)-@y3cP_m4D)QW^G zf(poURL^rIP6ca8hU@k#^2f15oFi80B6Yyn|CQNQpM_yr6|rGfN$=Sm=6g)l9)h(X z_|}O_1HCF|^XeI8l=pY*<%}A2!y|86B%?=Ni)k5dGy}}uq>*>*uf}Rno(Kp6I1#== zQ3mpUp{|CLAvVVvO*C0{Uq54R;eFCpDtR|Kj_S4-@x8hTOMUeXx7KUbJ0WF_Dqi3V zQ>b<%e7&HRsnv@QPBiDR^u~9MwUWU0%HIt68fB4$7*S~wP7X8_gslo1Hs(UL9*2#P z9P0!H2_a<6GxaXZUeH22Z%$^lsws3DQj6&;dj8vQye7k9@$*l=n7{Tvg#UZp z{+>UIqW0K`juZ_I|!q5EHmEx3IbZ8BrfCXIT5 zT3`EvlV%jo?t9^Ji@B?;&h0As6Twj4KV(BC@`bi|~J!$+vbnsXvZfXy*l96r^F|(Oe=isU^|BbmUTg z-Y~Dyn=r@Pp3|h-!$Qa2ZF%H+edeZ|^&!)p$aY~S@+{PnOE3TZsn!Ek3Vgx?TeZG$ z6$Y)M@(2~Feo*xWm-|Ry4js4%W94m#_Bv1a6?!7YSthU%`aPr!r8-=|nn>>f1_(|>X zXg#7{&3pmcq=y$vhhoO!MnH2AM-xTN_aL754;Weao|_^QsS?WnDk8m5?b; z*(;0G(_SXbKgs=DPp8R3S;l(afoSq?@Cj5(`~!yg{)#i?Hc~YZX3+8V(&P*R$HrPI zgeT7`k3?8E`)|Liat><|3Y0MG^+DZ!ebu_uvVrPPV*{WShMa8;Ea2qXGZVsS9W_e@ zFPy(PwQznOtVBm=zE-kIzf1eowIxUcn%&e7I8O7VL|p=jQm`MLY*iqWWMEVQftnQQ zlOy-0FVI8z$*<>@N^@-)n@w|SncUyvIV($CTxktdX9-q<(+x=W)>SUSA=Q_7=Y|X* z;#kIS=2{HXKR@??>C(+L>A)AOL>nWqEbcd!fjEv1O-jgB<^j=rL*V(Cg0bBHa1`y5N-Np3Ip{vc5fA#T?|d73 zi5Xc9*r<;M16`penHJ}7Grz_nh>m(Rd>6`H5k+=2C|J3#s+SzW$R!%X(WoCra|~H4 z&T75fy?jsy&onN|EFb8ATetSUvs!?|ffFrcwuE21X}p&Gp!!zPbT%LJLz5fS*iJCj zHC7&y_7QCX7)oUUixNDP&!zHOp6h*egMY#u>=SHG@rlx$gxD>I(rD(Y>e{})T0eW& z=-BDWqo?jVGjaOt(TU@y?wUL^_Lh@lcTG&57`y8&6UXYc>^nFxrUhgeK&B?{WDASg z0EcEkin}EmH&|?sK=~RbK7f=-Mae(s;}AX@TokKK4%||;K8R}UGL{XZqVFQ@I!0@I z0tpyBt3?E>(i)nn@}%e}=V;=sr_Swn>sh_LA*Sk@ps$RxVuvioN&_9=4ya9ndFWEB z3KP#M=1dA>mYrqfE|z&BBuZWjg)I7~iQAM^3CK=4N#(1T%*nSe5M;)59TV=2mI?pg z@14CsK;4^HheB zE{i^6wVxR@)Ms-*f^}6ZLiqr&?1r2T0)u9t0ab)+A&vY!p4HhC9#s3C-^?s6{)|kF zrqzQSD))w*j3IkpEjylzYyyz>ol)xCUrJ@fBh|=QcFPdKi#{c1M(Dt@5NSLcK%!(^N~at~0|RHY0tToAs@6sN>H1y! z51655H-FY^OvRB3JT{}5qdjwDUP%ow${KB}Wl$WFsgNL7K3?z|TN&g6C53_+&{cFC zw#KXQXiaDmWwn!GOrW}S-YP6KTWG?j9r%&(jlpoEGB?1(xVB%MMk_}Vh0q7)mPwIL z>g|qoQV;P2_@yi$MG=Y;Yj4%6CzzTdb)zA6_wQ7Xp&2D>a$H=WIcp^zCrVM{J}8n+5W8sKKaJkYmLk&*xtm&EXmU30^I zGS}D1#e(^XNwedIOo{NYk$bJ^6SAN4qRvlaso(t5Mt$wO6i4;%K!CLQ4yvCzZ9CWn zbN*Jfe{E^i@{V7C_UMY55#`cnA)=67xfsCuAWXCx`)WgH9Jj11=oRLw`)#=w`wjGn)1^$^`>i-lYj$qgr5xMgc%TEUcC;{7h!?{M zC3ID%uv4fsmvmbU@6o##r{^rt=fq4E+=W1=LR@hGUJTO^gP&SqS#d$YXE1BQ8$>3w zcwRe)m5wl3c5%#?f#xI-b&4JemVi&;fVJv`34q4KHexE^32zH;*7Bz~_d~YDqcLQ@ zTHo#zxcfVXiC#R;HXP@T%n^|k8Ma7b2!d8PVZwMrkKb@?ZJs=H0?kkQ4vRPiF4m&NIoyjF!ic4XwpSfnPfV9Rz76i_bf4N-MM zZvDVtU?BF7s4epZ6{~<@<`NQ#pf@VRhOe#wNZiTGLKD`S@5>Bo{z0LPi2L^9{sYzs zKZh`X)2~E`G0UL;RO{1qaeS#2^#j%YRUVU%to0GwkOVmfH$y|?9qz!@+OJVv3*$yf zpziJc$e%_+f1ganQCHEM#Z?mbY&B+Nf(h|cT*X4N#-dsIieX%*H6#R6(b3MR;aoZ| zwftROTe7{{QIKO{IWPX~>b`5~p*H>fBTij|4sRPPam;8{XtZ6d?H!%Nv%rCDm{+9t zcT&KC`szjdm{t=T8=T8 zk~;{ocnGjlQK@{e`e_-d`MpujdV5|$@)`G8B$X)0hfl3CWn&??nWoMR9;x%Oqe{nwS zX>hzrRu-LV)s#OTT~aI|kAGCE!I@@8+TM3d>2U|xyrmin6;8x5MJhsgO)dXip1;4c z2UDK{5Bd&g-@0@xP&3=G$}_fMAuu6Y3xw;^*{B%<-89{aaclW|#oc3QF`F3TiT4ay zq|0&AXejED>_&%e@Y4SfiZY=CVG%K_C|TNXYEOoP07Fn;++o8<3D-B zmMZ^e9^ZgAXUtA;hqaJGb)vIYp@aHI+jA@ZGh20`_teGDFvFs@rv2$7E^)z;4dv||Cm6v#w|91*1)7|GMMktm;a zO4)%!SZq%q%B+!ZlQA&K8y#cUl)dW#3&zPFg_`t!8d03;i*qE+n!&QG&=)WJXjN+C z8br`)H%EYiK4nrr;td^TB@6X}0wo=AvC(OmYCttCsEn{CK2pm*nOD!s(t06$R18Sr zKhs7vnBRq|OX41M(5vqdJ2^w>LVb2+Ww~|mmRl|ow6uD@2436(;{o~=Vrgzs1yAr} zrEv>Jm-$-`+l?UlkM-ttW)uLK1?W5%XpU!z^r|Afj^iFV?E&8bAbp%jvO^ ziLukwiDM&oRey2p^r@Q^s&xE9RVwf6u?WKXU+)?lteWA#CMo;_)?u1)F)=&aru3%! zt*UjjVadu3ue;Nj!KKBCk`|HR?-D%FX9ysW4n1mp>WrLZ* zDExLf@aWQ+5OG!$#39^CW102JZZY5n0B0=sq3|@wJ>uS>ZY>l_Z^+JLbe9lQjD1n8 zdW_jJ7*3F;Y?SILi=EAar7*)s_FV%0R!FI6Mxuj&Wm9OuIRG`B5or)+%4Q9jBZe9b z)mS)gl8A3d-d&l!zwf)*5hCK}-UvxhTC9$r;aozy+V58HLNW9dCJ1Z|MHu7I!J-I} zPRf7q!y30T}QZ@IrqB)}HHkWNL{*3JGuGa2Y-8sT*J z_7b;X?i)Lc9kY-D1A!ZdV<45`@Lz5^!jo8dua>{qwKY37ffJ@Zad5stTi2-kGhCUr z3qK0qCZzbqYY%h#@Ynw4-}=3tNIJ6Nz~=7p(4IW|D)b3o?nf%zctz$HYD~?y4b)ZH zI>BKZQTSyou}%u&)Qz5;Yyx4f-o#sI;uL z?2shNCb6LdLe~gB1|CpcUh)!tI7N5WK*e2JyoJH{C;uT&IY1a8c`(wi-z5ct{k|Tp0IDn~6vRtCP9SL@BGHssTz}utjrH z(;7l+7na?g1j9onP8p=pSLx85- zdKDEiF^whbXYXCe&}rxHfZ;SEHIl|N9Qx7}Jh&dY7J4eftD!JYi$o;V`i|g@#1~8S zm^QdOx7dA{4B`lqo3R;Qc^ymIntfdqPi4C?Y?CFwNitDZAPAwg?8{|O@tKi3$HJ8B zBd&xWN0?(KkTsL=WV$1)h+Rx}NWrwBk>jRyvZ|Zd&(mE15#?^uy@^V=pheB?tS%wM zfv~dKv3@e{+xHSm{U`fg!k5~yfTbe_vQEjyW*o@lgs4xH#(jnfZbUQ1Gw5{FOD6uZ z#WLQ+t;u|NRN2JLe3@s@5IIZ&f^W5tyZD)r+7M=xy5?5n=6z?)8-(zQ0xSF&P6 zV@^2GwQSYt_d&nz!4km7P@GIUCVh#YX2VS|OjR#};Td!;A;gae-MA6$M)S_4W(m%CP3@WRs|kU2 zU`c=}LNzS}<-c(wiDf^A%v=m%FIpgP_klQ9kE~A+`yi3}Lp2!;6;Stjgk6h`hl<%5 zS$jLtSDGgKC-MOvF_!xb#Kk!R1@1fNh+0yuKT$9lk+){w;24|$W!pBP?JN_ZFK?nR z{aiB=D3}uBK-vdBh!z7o(c+|;xeR$ujhNO|>6&3et`H02E+iej$9KYpmW~E18Uj%R z@mwS>j-YPO(I%NT*q<8vG5qj`9d!_xA!8hnu-Q8M8}Mr4AR9nitvV9m6EjLzLg61PRPk4S9xaCFA@t%nF|>qS7cG-Buz@q(a1 z0o0{sTgXeZaOXtBG7fqC3q$RY2F+wk*ZGve zLAE1j3E(q$B060^YU|&zF|}+;7|9?qcPo0^My?+`NZff-%hT%Lhs_Px`nfu$E0QG07KeL5!I((>H(x=}sja3K3d@k6tJ+f4(H) z88RE(wvx4sFQ0%L&J$XRokePIT#(4}B>|dz(6(0w5waj`j_sW$Cx$}9<`ys-%z+)O zCC=ebgYZWo8Gx(~lXl}13@-Wj{T^a?CqGA&1gGDm2^ zmNUd@*pbrcruYP9jF%*?g(I}awy8%nm$?+D6Rl{uNN}9LLyi%HgY7CDMoNhpVTf*$`7?h!t18J(6 zBu+>ULEmPKNu$W_L09;?k$*?jDU8Fyx12%IPwieyB2X;FTK6M*P!dLvH zv*`Hb09aI7@nK&oU&ejkO>pQ-l2Yn#E6|D{nq$Y$Oq@D>@8sy%_yiSBir?<96KCkF zA=1cov8`Lb*Y*9bZq%dd!+3^K10?6O;%NzGN98*uzDf9~$?V~7hs$Mx)j?-Zj4&Zb z%s&8*f`!6IaZ*;(byC&|7^<0ztj_Z3zHt$- z$aIUq4pXEUw^ch)TIW;n{!4R>he!*j_0G3fvcXSR&#W$R70NhuvDk3{vtEY?J6rt+ z138F-oSk)#cd#`O8U*P#^8RAfu=cP9Ifkr1Mj7^G#!Wy2@Hv)WVt`rHkOj=!!Q5n= z(;+B~REch~yy23+i8>vhE8dxtkv8BKWra-WLTnZ9Gs8Yx4pUe%xe{KB(rUtyb_X~V zjRYh`s7xC?&)5ql0XhNEDFbH}B*~xVaI;)!+TkSo{h{OVGu6#p#!=x;sPkU{-z9wt z1KaTZSP4as&RYz38$~$$!D?u}0%d?zl}H_%24f26hX4kTOpYkUp_I{Lzez>H%NV^B zPbqk;{q@oTwF3+d*!4)7>Mo*)-Wt-#aBQ+0LJLMqodT`1=)LH|xPD7#wdPqQ0FZyd ztKcl8^a=!A3ebl5Zb+=}Y7&HW@+SxexSy!j$>o9I5#iK_&)}^f`GoR4$WY}F)wr&K zqAbQ>)3gZix*g=8ZE!>_af5zNr-s#$`i9Enp{g_cYI1e@RN`56gOuKzyG1@Dz6zJN z@1#S^a^Z%BHQT)ge?O9QvDQBvYHr5bxTF6+pyr252x2%z=H{*Z-}dd$^1k1!(k9C) z_>guC9$F5kh9dbj(uR0xq~@%DT>R$Muf9p`M#l>#YW&rlIP+^?u`OQ)1#!Rl@#_d= z*?=l3?$r?@T|l}DK0ItmCmS=T&CC~NikEWM<#($=G7?7$G&mgBNUFg%7Q}#0{G*n^ zFCr+uJR5b>iDLfoDhl2nKZ{Xj)cm0b$a?S_@1?+oVHXM#OF;H`)!1s3^PVWAj-&C# zdCTy)`#MszxX)4`mFW?lE8~?eF6*S0>|AYPmrIcCtMFe|;4+COP1?8Hr06~jzWZH@ zc7Y`Ar0uN}oJ5JPMs~i5L{SoLjgf29B-?@9Sot_&Yn#Y-($3Y(6icVnQ z@@r2z%5a=%v>RMZBplGIkuqf2Hy{e#H^?vIR_ZVXUzd12#STS-@iAC(fKB;x9ZWZ@ z&BtMQfgQo5Ltg?1GK^G17$d&oZ9o{<-TnQwTZ|OcW>*&Ge;PRVJ6i6mov@snr)_WU z#A+dBCAo}#VC#+}aveD4>~!=53JhTwT#*`F9^e84*SnEEYS}mKeK{ZFM53FNGvZct zLJ*XoK62i=fm5%k9^Ev$6ICgoa^uFdH*yMgUGKONutJ2^ZV=$%b$$Z{N&pE6bXkq) zxy=Gyme51&Kl`rnr3wQ$s_Uo@@Sp%)JYoU1fduyY{d{CSk^IG-%ME8w@g& zP8JgkG>k!WnZ%4H5R&0mNN4ZN>?9*|WA+TmSg5f@t9^q)(Rz8+LaWwmMN3;~wPK4E zFSPK!XsNeit1b3u3#Zy@wSCX`_y0f7T5Hct5UA&z=A+Ea-fKOV|MS1!p5fVXK+FTp zYF8sYn9`07m2yI#bf=pxnFxV)TdXA^E~%V`Xe{4jp{m*VeTWhV%9j3b{s})rxj3fN zE`=i-Bb*)XKQ&aVKyRDz(RoWX3(cBSe64%Z%-oKw-#KKfDQy@Ojo5o>I?Q2YR+OS` zYU&~jRk{+Gk@Es_QVuryK8|_qmN&Q1)-kWm$y|)lZP8XhoADVjVlrn*m&k%n5vJG^?*t}7#uCT-AA|AJxbAs8N$y@ zoqO>jqUL>8g8m)9h-vB9afj$BityM4A`HxFUs>~g3L{}})acJCiecr=piHa2o|~<3cSX{a`#nnc8XuOt8u`@= z$!wBa#R<)kB0fWci1?kt48>}+Y}lOYEsn#|m6j{%7Aov*`%Q_Iyxks=T==zgBFjl< zcv4UT$Ik{d7Z?g=XkMgFSK+K?acj|@(%E~HZUe)I(hX{sJ~l}EJoY|De*zQN7YEfN zeryM4-bt)Z4ppn*IA~`g?9-^VVwA`p_n=C)tY-CW5{h!};&_5V;uCA>)SQVHL*N{f0h8y1v&!D;dcT2c(N7ugZJvjfef4KLNM zbfG=t5@uN`8csGVbp~D(=<=m+zC}?qFoMIT*0Y2%jcu&$(iSTP`=j+!*L&i}{+BDt zwH^eOJ)G;O@wvV8z3KX*)ebB?nmb~8u4-9(^o!C2ib{?i7VX@keX9w64DRo+5A&?&17~aAD!hkMV};!C6ZG2r$Tr zc(Uoygie&=3&KMI7KYXDfg=Si#S?JARa8B2#L>-T#691ECx8n%p9$GT)>_nGfo;W1 zRgjE*gwVhBIdC6Rt%#nMSZ2;3;Uv(TMTa0cPa$$6M15AY_b?L#(Y1_}RK?15~3BV;oFvWy`G-q{cf zLVs4He5%1u_qklt?hU1r^hcQd5~DR;*VltMtw{3-1`l znh7g;1=f1R*+N+E&kMm|olUyKw4Husz2sv)hcPRq(&B?kivf%#R`r_r<$f{%+}|b^ z8gjzYq%-IbIks7ZnZ-GOlqxOsjb-n4)IwR>){*z-GjUS+`$6F^<_b^+h8~3`M2U

+wBlx#a4@>Y;R++D(;tmwfGi117^Qj?%oht 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 literal 0 HcmV?d00001 diff --git a/examples/with-vite-papi/.papi/metadata/paseo.scale b/examples/with-vite-papi/.papi/metadata/paseo.scale new file mode 100644 index 0000000000000000000000000000000000000000..53bb1448f451b7f79f4d5f815cb5a92ddc709262 GIT binary patch literal 415960 zcmeFa4`^i9nJ0RV`gW_@ktgzwyesd@kLx$`n`%GxjoOwovLgGnx+O>2w7TV%+HSAi zRF$f(S~Xp&QtD54D|o;Q2_)bF4`jdt9!Ma81U!&H1{_Er0|{hc1`==}3mM2l7P63q z3}j*E;o-gC@B7ZV_tqb&TkY1ynfGQq)1`aQJ%7IQo$vqmot?N{`smXiH6s(P-9ow1 zjK|B(z1?KB|B!u>{y*IMy)n5cCy^4w>mp~O}6Vw%Uz*vR~DsaA{Ih0Ri}guz>5 z?Y-T&m2DeLoYQx9+>F}Mt!5mLTmQ`1uo<`F=FPa0eK@|=YI? z%uH^6w^`k(wyQVef&hAS`N^k0-iJ+C<514bk8=Db_8cQjT#xHr9t#Q3|*3Q2em*@5A3NY?DW6q+NMYDK7FZr~+v19qQW_(#k%b8`ncplgn0|8r0 z_3PDoyize{)=qGk&g^sMgqchl+(q-ijIPI}+Fi5+R$gjv$IT!+nlTkOwWa#aYO_(_ z0h(Xg#dgIN9=T(; z;|~BKX2T5|EEzlAZtPaetv|PRoQvK7NH=mbyJ*+&yE5%3#jlM0%J{k*_rP4WyV>(U zHzyOAcg@k0nOrY#$CXZv3w_PL?v7#0KkWO$nh^U_-6>s<1M{YR&3&-zp7phVz)Y;v zD^(onz&SPZj#wA2-Vz%~HKpD)R)bmG-zFf%%gCni~jb z+`ldC>g&EvLNl@6F5RfsuLtHU$rM}qsIT>~2`_DJ#UxUJ`HsEn25Puxu01edVm)rP zFss0P-)^{8Eq&x0oir1l!~`q5rNI0!X>?s5`9>cx;YKqqwK~nc!2C3UN!vZ^o8a%8 zvp5kqs{)c28*N!vZ0(oa96-(8%fd~0+tFziD0a;Xp4As*1qC5jeRG;LlR&q) zc|mZXI&6RAy4eJiEf6z$KA8&p8?4lE@Nl@!JZBy^^A{UC)w*!UwML@`*z643x7|ne zMqc8ft%bOV@=1RR>>*xXQ4BIz} zl;!PGwcaXJ{hPi|p9YSg9VYs@Vf$+46aMrwG_z)Oxw*3&m@mjqC;e{YVPBW?I-3?n ziB6mN@u#wme9`yibD&i9#hBtmVE$s*ek(H{h$GeO;N*oyy-<-ReV?Bt6}XOF zYnH$p{?bjgRcQK$eP29p#@1_%Hm3MxoT3(g_O2^TtoduaC6VOuP@zxrA(gR?gq zw<@(p2{iQU!?sfPfA+OqG2wZL$dph5^H=DV0yF>WYxy6|GKhUU-e^|i)hb9W8Ao8g zIc(o?xB+ZwLoCAk!j5my*UhGxyjtE_6QMOQ-yOEw?(5s-oxa9pGrbDJ50?2tC+=W| zKM;Hpfp|)F7a=3hjDGN z)-~>ybQ?{bZ&YG0p$!FV#kn#b6vJDkR@hO&Ey`bvZ#k_huoETKuZ*4En43$KEy#7- z3t>IJ6}tD*Lm5mMON(YcRmE;r?$}8XT*V}_J)nbKbO60-r_{VbIE+Kug;v!&z8!^V zxIJShFso(!GRK46OZBi(KP^-VIsiKew@bUb5Ya2q;+0)scO_ovw6_~gXaeXOnp`C= z^z>tAAncWI6mEhI<1B=BbQ9#%oWOeP0FiVei!CKRMZvD1NVwH#h7giNl{XzZk6ztR zCF;Qxs6wjF=;;jt5r-lUsNY!(f3}fuocG@I|?}uN?UQiQ4+jypN@=Q6om`Y z?$o7J+cMTnu6k9=3_-NtuR|Ts=0;wQF|Ns7Y~Wk7oy+J&$(RmTXH|JX>*@2QdcD!U z&}iJ~>~hR=rOKsd6{-xz9A9lv_6|(VPU%nm{+JQ9he|gQqgsa$2jzb1Vgn+GD&5dM z&u%mtSiv3@AkojE4UKIyZp0vHyEZSsw7+4KUuag_+Yq*@<-oMsVnu;O`N;ZW-T@&X7+NU(Z1Md zFVt#{TWJ2EF|{nvx|R$*b_{Akd^=}zomr|tJoU@=4Y6*lE?h0FURu0zVX3fm`SPX9 zg{6zn((-I6HyV-uTE4TTx&v)vTR(59CluPy6o(Cm1W%^uS4a=GFhQVGcnRlJep@rUSiK1uvr#{{ z_n+csgE)LU3x`4bXLHjRsQO=yA|4KDbP zG9AH&pk|l2GGa&B_v`ld2L4&7RA3rv&G$_ZGt5;hpS5Q%3Hr{n@kOX3cs`CVAgX`f z0>awsWqDwRf(`$K3@u&8<+$D4TaVkYOnuO?L7}RR%3zRAK&pXY($X_>Ecg z7#*CpzE!>6QISSSb2`CUnV`Z=q5Z+883gZWXLmLF{CNmUnG*=K`C!8z4^G()@SQUH zO_-2VQYzqqt!?30pu2dB%b~!VW|Vit7R{We8AbA2%eSM zU59C}1t!*&CsW6K~*5Qm^l;2G8e@emXuthPc*NMWgsr}%%Hq!rPW?B9Kw z-*E2QUCfV&cDM5jRSsyzZ&R)!*yDPma~-=NMoO+3N6L|uu-c9`0CFfMu-4S}NYS+2 z2gZwB@N1$)2Jq!l9a0-cAkgF6aT%(TUsbhDXg8AKqhMOZnpQ}oX!JT{+1%);`D`$* zB!ULqz~)9_IFCU%N7r%wVSqQJoSzTIl}6;y=ndHRwrwtV=|*7QKua?M<{6l6X^98; z`iC=gmwfLc+3{I)gF<}P!{#yrT7fE1Dm0>L75i#@178&Ie9wjHOfsM9hha;vs)z8ScX zf4g}q-HXGmYO|FdSInJlT5$b98gYj>`swqqZi3Y}uS0#q;Re;Jma!Z#AT-WQDA^fd zOcM@!4+HSw;HRo3!#5xQD&{PgH{K>%f4eu$%0fX;UTbuEA>1MUjJQa;Y8w6q< zX4nUUw|ij>^EEob#sUFAUHrz6pX)UDXK@41=tufH-;_=ioSDui*E=n0n}?hHNbqnU z%;0p@j(W!k^N^h=T8Sjvg0mWntO0WYI8q>aa2U`%7<{D{bU07iZ!hpdXW0T9AH-9C zFDNb~kQPLDMyyISzS3%S$o>aH_@lvTyU}RlKvvO=dZ~O30Uc(578VE^TU3NDPKCnc z$Tv#-Spht-#Q=vR%p!-i%9KO)8*emte9(B6_)g|NC@A*PG&M{_ z;g!1nI!u56CfM%lujBfOoWCAuKH zPTb(8!+cSeqXX+rH{-P<(Al~lJsiBV0YX;n>Orl`u#J{uF?NTr(AKYGpgT&*Z;y2c zlZ?ap0_hJS05IycMnRy;GhSp+&IEPjc`!xj7zyX6I`X9v?~p(by&mu`DNxM(LDp3C zd>pTpsxYGr1a2O__D-orQ|!2%c9XfZB^IBNc6GP+p~<~$7sAXe$X9TVl3s9@pen#m zT;2|g=s=-Ys^H-8NRdx~iqbF#GU{A%>|^THL@?jQbmeqH3@qLm%3m4vx(N6@{r(Oh z{cu^HSZbCO7?TLofx`ou2BM(wRHS}m&)zK6suHfl_yS0ez3aD=w9NCvX74MLyJCqw z=$Ynie4OfXkm)`lYgakKi+j+g2#{pZ)B2q@b<#z(^*y#phE4hHPU*J5(Q##fy&2ys zHO2kFe`z}#15Dsu=vBK$DUE#1zIItYSWIQ5tOiw~?MyrGU8@Zql(jmqE$ju!?&%zq zzKX`^rYD<^1!v@-D3u1rxpxEHB>Rj%1c_uJ)NjIk0zVoqk|~`^=hRZ6gGfbKszE{L z70rl50^w7vM8%fH0KJB$ykjR|@z{iy$k<8gyntQLV$v}=C-N$>Xz8#?_ftJD zU@0s^Y=q&+37yrZu5e1NM{eF5#4m62YPxAh+m~t;SqSi7*8pWL!*VYvQw)p(o_Vd3DX^Y ziy)D+>$0saiBN!j`grhJb-Pi?0mAAIwuCcFcmlo|KL??jBzqs+-3KL3jQ%JiCVn9mR|shB5ZLsg{XPKC5yex{j3dy13wRa1a)6)= zoqQ4Ea)mTZ)O&qO5R|t&^&5Zy&K}r>V?V`8BGs$F!It7tkH$Y$rK<(L&*Yf*O?U7r zP6pos=4p^gmR#MC4n3wPhcnt(*Ig3Kg;Pe2wdMhp5Cm80UUhzHY`l1rc{YJPy9j%w z*LH$YJ%9)-R0Bc#k>Igj5JF0Z%eMj!(u8xb3YD0v2W(>~T(EnVQf|>j?IJ|Ekmq39 zw1NXdn2SH~84fp}ERkw)KWi8X-r4|(#5<7V)*m{SqKJPzZp&=QprgeXJ*z|n;Z{p* z9)nkjfJnCZhMn#H#5@?hwUAj3F^F^l>jdfJHw;e$C5g7z>!sb+cB3s3Nv(DGzn5;8 zVZI}1M;RFF{8GOcY-W5Ur|ak*O``&fT4x!_~bE!=%Hme8wd5C)`( zLiezrJ-m|>t~o8{>8Eh7szn`--x=xlhUUTI3LwXIglv2M3G2D{DSo4Oj=lH-r*a+v zD3F`!CjC~12~UV$1;@sPJD6`FK>8i?Zf}ptM%mFkXtm!qh}*KK7vozHwIHjHHf18^#w;8J9_MMyUq8{(ydVi%Veiu<(9v+Zf< z{pBjc_)p0kz~*UM>}Ggm-Khy_3na4A*{zBFO2q;k!wavz!tSP$mArbb$I0?NL`)+I z0P(WlPdo%}TD@Rmn2wV}?j)g@+%p!fK^$b`MXvL!7oJO(n|Rn@gi5S$DqH(+Fz@*G zl(1t!@@>JF5RMIaxJg|JU0UOyoX}j{>Re|){GHF$50hoOINzRSj?7}>E@(&MLG6qS zylL+hKoS1V&iJ=`jI@OP{S7WPX(SX;q#5yX?qW|UBdt;J0#XHUo%gN;jpu3ab$_ud z4WkK|abT6Kz~}w;9lihsV#_lTSZ==9#%U|MaKHk@8W{T|o4Xjp=Zm<||N-z@FXgR6xQJz39Se#_fDY zd7TPZ5Dg#v;-wh4aud=Q1xnCRv44f2LhuiZMB+p=z#Bm=q{AxaMH35NftrOd3+Dn< zWWk_OJA*(Id9Xr^0--Fi>45R~cfSO$iDgA4N|~TKu-zOg(HISi?Z8gaCfF`W!vP}< z1)rCWKph&Lrjt<9{^VmA@W5{96$RADdH6GR{q#ZY7|doK&T`PUpsmwlOQjUl3IFk| zc%_cVj=iem6(T00tib?p;|OuHB5&M=1O&mO10zGmM zKT~4>|Na#I%;@-Q(p~R4>H^u4wX^gVW`U^scY#9t;5e7b`1WqK85c?js2LDiG%TVy zi5}y`@aP5CH79AK4N=73L;a;4cN zg=%HmR%jG~biIQxbLAHJCWL`rFJO$^&8KE0x57_tMp818NkNdEfPx1U zaj{>PJ|(iH<}d8zf9%vXq~4fcjE-n`lYi_VW?tLL(PapYl((*)3Cu5T=s$%No4fjC zuIo|PA47Qm)JWH({r>=vuFj0^|9<~B0ls{CZ2$Ln`Q|vf`S|!omSpDa z;*f{Rm|{uFLd@^vS`C4iOew<$)rv*(=D9{?5A?&1(ol2UT4a1x_5k8Gbf5W8)*3MJ zLtEBV*TDS7P9~saoba!po{pMdXG76`(-(^N8woJ`P2a9&y0TM~=k~a+Ruu_2*%crS z`rICL*Bd!IEy_+om7QsyRICr7S!`!NV?wAS#!!C8Kh%~?O*ImAgK zpuLVbbn{QpBgaIKd>@b+H`ew+A=!ca=#_dEij$dGZPcr z(hnJgyfbhRVjC7Vxe=GQ>(Fy+SlZMDW<$aA&3DHQjt?R@5MP8)a0s$U6Gb-fFz~)Y z7Zy{gBvL+?rgU;|kN3|tMGiYQ2AQQynmw@^Q~N{;&X|+{aPz|sJn!5LaIeB*>7S2P z5QXXg8ZwIu?F(>Zx54u1x&W^`p!qSgyb9>U&sx8$_JJ`clV#+El?fZ2@GQ^fkfKFb zIy0GmZhQF~(!w?gpEA-%yV1)$h#Cc5ta2t{;Njgc$cJnfhkU57ySrhP4_mvu&@9it z;u+>A!ZX)E<3O^XMDl9?+b8i>cxGTu^}l@zZ-q$)=5+tt8N3xn7??BtZ=c3n;ctO? zy8rFR@m4rhV4mrJ`$u>yYzFzW{cmUS7Hr{RIFOIw|I8y6|Mda?1M-STAuxR)X0cBP zcgHRE`S^F8T|5RH@8TDa+AOQU>)x>C$FRZp@3H;&H`C$2R<7|lF&$|$#Pn1A4SOwr zpXP6nH2yxr-^ca$)BJrxe?PI5+`-MJ;j&)N)9Bn8K8Pc_c)G`R|i`{CA z=prMz7eQWDaAa;iIXBm>6M*)-_!MdBBK4Qq-r_o{KMb`#Xq zeLCDr_jJ@N9$n8&*I!Qc=z7-OqWdqWecW~X?ysE&a*tnk_vO@(`_fl;&rTUR zf}Xp_aXQJ7kJCLWj?xPWRt-{4CJ&*UTPdz#R)RWIiRh$E~k!!u$ND1dLqm7s=c0{cRPiA?*=*U8S4>WF! zS#l^Ta91+N5>`U)+q#v)zkjdQC1^r)OX`Er@e1 znQ*_5f5_?nuNMAG$<)&=_}!8DV>?oGc|GOcx-tWOGP%h`ghE`W(Hn=nC(5k<0i(9M zBStFzb9xov^}mUvC&meu;E$AW2X#qD2;4z5AUu!ax_|W=5_OYL!3BFpw!v>O&a1DK z^y^ozi3uMTQzWM{Km`GM%@~2<9fqUH{K1~Xq;}VxU0+q3q}C=?bOr+GEW)=pHTDO= zc+S*3f7w;u>FlU(T9kjhm)G~$*@^5Jm8cs#7O74Au~K1dCf!?%Hm1*#Ps2Q;YY^N9 zzYBC!t_7A|^<5xZOX`=wJj*QgQ#uH|IN4E>=AX9qf+I!eVP8oGd!1t?ebPIO-N|-g zg4Y)^e+#_DRnhXxk2V(Jgy!TB^uTPLwOR?0x%UK>0imqH8=Rusa3&Bj2nYSkM4c-s zO2Zj@9Yeuq<#P!N^Iy7XLDy$wgD-JJY4;gjzTiKaoOlEX@oNk8%Gs2HO@Am^?EDVi8Da3!h=MV$~=XUSGVH?6} zwZY%PyWC8laVW1z1W0M&&Sm6bH#G>DGnrBc0jS39N$N)1odG)HLn$2<%|cv3VDpXx zaO!)ydqQ{I_)Zoyjr(3Y(dvPm2~qK$cDWCD-yrbd14kaook2Iuc)niP!DPBy zeoN3i8N36}r)Olz^qR5Gi3~4AQ^YeNnyPZCgVf94!p=Vs{B$t98T19;D3Spf6w7}% zW1bwc5#U8MdEQGUzm<7^WIw*02uqB)rO@Ik#)?mAP9?*Y$yY7YdnYp&EMLAxFOUhuXbL8;L| z;3G;Sn)mHoiGib-%}0ZG{3r*^=B|qt?7*yd9EAhz=)klrR6y2BsI3Vn0#iHf*kIWn zAGRao@C}v9dr1|B$>q5@P#YBMgAzTyQm>(!ZD39g+Zp$@K7v6E$$YF9g?LcHc*bVF zv?K6Cy7*TZE<3iT6zr6%?Mh+X*zYBkVE3&3E8B`|TXS=)H?&(VY*&$DRY#B-a;lJG z10@_5geI!-`Iw5ix$Y)&b6z!gU~Z26Gq8gH!f80K6~Ly#eM-xI!P;*h>F~Z>QDz1- zJtU=S|IFIIKFSIBkuu{yU`EfCHnGKjVeMCsa%_&085jOaayGckSYz_LM-2I7sLTxD z{e^z2MSuUs+HW4^;@v=*(YuNW|NRl~yNi8mWyU|AsVDqjj(GJDpb?>WJu^D$nEN1U z^YGBo!rl#(89iIk_{`#vJ06>-MD)yY2 zPj?~by`iI}!4RYn(SaIPnHhA~h5qsp&mbv5otZ&Tndz?%+3z0ZZZKwQM@m{}=8&mc z{o|pd<-@3XiR##yvBxvDu>bLhPoyilof$n_TKk`mcyw38J2QG(vfCcBUq8}qXC3g& z$Xyk{A3S!nlt^5^D4LZSzpJ45BS$InOZ>% zDk=~K_TP!{=<%b+#N-Nw%uJqhw=;-4 z3yN4^9{XQ06F*#LCjVFVwudvvk5=OF_ex~O@4hbL>ElPs!;+gRGBZf8pLphoPa{*X zv!}7^Qj2Gg820}9jLgcrugX|DV%R6Qa%5)EbpglAM+^af)kkLheXjM`Id1>qDER`+ zFFjX@WaiX;N66=ncvr6a>qs&)=(~92Z%!O7pUhr!l9@-(H6|yHmNrPn0dGvn%pf*n z=i+z^mpA?7#L;qU874FG56wKK2VTkYQj__f;MV_q;%Fu7o&htn`M>?;Fn0K8IX2gu z85eiW?Ad{r&5Y86AVuh=PWVOXGXSHQCuW!u}p2xohOm`JY1qIBbC(m zW@Hnx)={rfgP4lZEL>29ZCtj3GHoc-02jIZ>yw*;e}aEZB7aOU(uUvB|^ zjPeakueXm*AG>G!YDkSi94%E+$7resDPiycw(Y*c8{~5`h_sfLkD2e`4(n zBUO<}hl)NO+_4Y@+gy(9r!?VQefsb;owaEnqsZlJeGW0It_!5U1js~3t*p%Fl7s9! zn34|Qp4+P8K9O<#F>6OKKJGMv~TrP4$I zgaCn2EecodJwm$86Hi=ZWw0ln0J^{r3RFR09UJl@6c=@Di60(S&@PqMVx< zsv@9V;Io!5wRaTKms($vaZQjj;<1bn9gsN;gWV~2SbtUeb4B;1767&mo?wZsjTZG- z39c2SaM_@vHXM9q-=iimAgoNLbBgYF6;1B zYKWh5J5f=bw_Lr$Pu8AE{_urodG88qn~Zbe&B&kxy+c&M{?i@Q4`^ipAHCi;*}hXZ z@PecV!lR%2HT%-S<%=s9Kk3TKB~z8^J_)dhgmOYzX-T6F1sfS9!eiemZN;ePqNiWV z1-@+K+wcSO-U(muMow!TR%(EW#ZX+?8$MuEXwuFdXpf%myrZfQi`M-bRj811uc1l| z@6=0efzrtSzk(8fxY*5IJmpcN2wIAi&{E~jTU7+3tnC$&E-Jo{e!}>X$t!lvohNr* zsRcDA2@7B_RK$2RY897KQDGd6tsOtUS~Kw3jU+Rse7we@9o`62XOvm+GLW=SksN z_$$2##!br;0V%go!PzL|<_*@msO>!@bfym84gFc611sbkWL z{sgfYL;u+t{D<;Ev$N)Nd@yUikOo%!c{N>Nbt+oqlR2YM{Qfr<&7u~?W?ay6Kh^S| zTKkU6RP?;*Olg>CYE0p(Cw?M5`Nu~vu=*?%oQ)JJY#LL{qjb(K2*kBvdo6N8VM`df4~n7@P>k`>o}3TSdF3z7ow}1R98<1{y)|wF6KolqCR6$Z9C6b-rFM-((zNAafG(=h9yi-&- z$|b3hi{h3Jk5LH~;y7#h!0ZI+i~Qw^g~r29c}RZc1|Sa;PG@=VH5(uL1}6cR+&A;lt9gtRCG_eI)`fVNteXFU+;n#!9h zfPh+Jx+3m?^`alvACviEbm~63q;v&tVBYse6~yn8F06ZWF0fM1qS7U5&+JHKz2o)fMfI`|w0f|adse9FSbpig~_1%3BMF+L^A zhr;`7R@Qv~@qQX->i@@k(x?AV;k_3K*AicQrwUN2tYnP=iwJJ`7&b1H{p<>HU z=8#tVNFFDH?>NbWy28HwrHAG|iPV4ERU_i{z7i3yONEF(vq`m0*dj!?>XWa>W?&J5 z;OxU~?bzlXl7%u>Ff)oPM|qn#>*3L;p-P%J<&oJqZ7X@F_2x9|5@bEOq>i*#E+-<} za*^+ts@kSIGFA6UK#LZjP7WfW@9?2_|5|#3)&b91?GLXA|o} zJHqbg7R`eXbg#H4P98-Pe1bmAjKKU3yY9&+Dn)cxB!PB#H?0hQch_HnbJ7 zhAykVJLXT;R|li6?< zar7=a;0*M8Eq&G31A5d^qO)#&84T!!$I$44y{u5kA^_Hbs=*ChR4u{<4}jih?UP?n zD^cYJ&?a0+mEH3}NaH2~vn&~V4K+5ACM9`H&gh2J8h2&(6pd=hrDNEqJ&zF2*b)sH z&9pWl>lFfHXda>EMW(5xt^1(@Ta3aQOdqTllGJj700#i**vNMr!VpI!*BDs81IT#P z_r%#9o(N@1#NHTgEU&DGt5?=HLi`<`TMExFT)42b7+$*QHYi-Zba^So+}ddxUXdNRj0Z5?j(mT~n>JuOAuLJ|NNP8@Y)t*M z95pHY>Wl+0Ug(XeVnxR3L}_eyh-qU+C%8rux1~KZ{di9wkZK@QW-g8gw#fAE6AAot z8WCp9U)Yf;m&U${VER7#HgZAlw7<+D2pRFRgu(+Wk_d;Tm7e zF9Q|*<;W<}VCP|0F5pgS6xWq6{|bd70b`h`FY%##WX$MEoEnzv$`p9cj{338rDc>f zK`|g}Z=+hVh)S?fRk!wz3lYqIMgoc5B0@uG zjkIx=>cW|o!sA$%i0hk3!51^N^eGfe8N(4;duP%_{`Uijc=h4H~ zhW~0|`=Av};5K2;pgry2%1!bNIe@ss)PY$L04xPqgX*i2xQX+O^T^vw9=2-yQ}d^D z4Y30B*C+|%G^1r+mceu-7&+lDw?PN$U>NX%6Q!w}mm>+Zyap1p@G=iT{RKH)Qo>rG1G%9nZwu0&n_^Li zaHINOq!szMy#gQ5erK)NEUBzOqdt_AA0 zZkH+>kXw`?`W5UUIq&}1X#djYmb*&2^WK2gVjnHcjVm#4 zzR!(cl#>2-bd=l;)om;|0iz1V6E$O}`8Y}3v*YTl`;~Ry8JmY!5V9}mX}hoWd~yO? zgBy%js=PK}-i|NI4`aS+M;5zaNQTs36Tj8$sfqvffv{KLp;(S{beq4jIl{zUa)6vn zsVE6D@A%CK+@pGF!l>=O^~vUGYAV#>VxTitWCF?somt^#j*T>$IGHeIk7n*}InM{i zd~?vsCKLdz!Kc;+xfjpmY*7AdYxDWe$7iNO{J&G!bQ}pf7Yc%5-^O$n^Z}8j#lm)f zEq;ROY4dHH>j!90^O5PbCZv|;o_=l&ie$>)3w1c}iC%aI@=>k({%ZpoymaJvm| z&>~T<)^Fl|zzQe;$O&Xdl-Y!H5aO#)TySRRG~6wrY^lHeLn;(hKO>UNd%F;{N*vb->z(RIk()bzaRDUoP}%=t1YT04aaJDlW@EA(N0IZ3~`|jN)h;>{f%x|b#bv;(OVAY=BOpn-+MMh2u{7=kS#8rdXK|M z?1AV;xYkG-BuK<7PQWTxoxGy6yHD)tZ)|e+3hKEqJ+<#dj*S6FswhhA-DlbB4H1-q zYv!llLLd-?9Ka_*YaF`tN_Z?A4I}e2SJZzFkO5~$0V7f9vF&=XcB*pIiw?7ht6XK| zVuu82)oQyRrmu^*1zi6%ut5ff&Q9!--%iPwHNg|>^aH|Hr2w=NkG*+w2|*q3BCl}j zy1p1U27w@?%2zJ}PI~-{^myhM|3~UrM7rD}%R~Cy*g#a90 zCGmlv|2Plhe&B~n47wv5mE8gyz5z>%uCXi3$n7KNCc2ms7PqmkpTw(=H8LvebYqu$ z<|O)0nq&t}gU zL3Q^BY!<*M#|4kNBlmpF#yMNqGu^Fc$7ZhB=h=0-Wpc8T)1VZi(uhSCpwS4SBS1B0 zITfwHYm?le{pEIC^CruTVNJEE>JBa%;)U86OR5~X3#kOn569>)L+S?c`^o|PlgIHp zm7KpLJ6#LJ5rr;JE(s?kIH-cCsS)FjW6}5=^izm|2jj59N8sqO-(e7^4|-nRRv&O; zgXslJJk*FhJ+V3=nQTd}unTt)R4OaU91?%x6g?mx^8zr{**#_;TxsJ297a$}G5ac2 zR*^-0oi%!1!8>sexJOe@dL#4B0f^wf0m~Dm8DYcS2a-MBHOsp{3iA)_NJc}Q-hmUk zitAj#y;{?v{x9esx%9e3o7{u3LSAj(uwzh{STY~Kk3GK3dN>_%#|Iu?ZCZxayl^C`!q1%-$KJW@rL>P)IWqPELfYWORVyj zu}!Xd+%AajR>1XEyiP+dmOemYfL_^&-?w>aN3PZeE<$*3!!dD<0IpR*m*_nQ`*CyN z(d(5EP%a;*QMrG161Z_(q86OWRpgm)V--Eub#ey{rZ5M^@YXk@hwO@4w)7>u^zK}c z%x%U{P=$$zVFnU8lJz{@q-~6m22=~aAqoS;cQ-RNoBE!-p$HN=E_sbmoB!@lRZ)dQ zgoEfU)-nQA#6~mfV<_XQi|oG<_pnbxxsqLSIw=-B81_@pcgisX3qdWMtn2kS+Eh~h zEXtAx@glE{0;f&1$LN9wVBtm_qr_1Sdvs6eb!;3VI}#166z!G46Tc>EvJb_Ouy~0B z#X_hdV>Nz4ie8}bxQ7$g)67CW9W}pv<{5E)$Y)TlL)^@ZJ77V0_Z>Y6rv3GPP3EA_ zv7l3=H{V3t?VZ{msCOXpbDQ=*cp&Zwu6znwFG2+K$L)qcjhsF)9WsLNmqntILz$>N z)MzuZJD7#@WKmyFq*}RC+XbGg0n`tah(heX;QL2tve>}GJ4$OvzEGGsyWMd$-3TGX`R%abk z#*?^Rj-tqXZv#E`3d&uU3x5WchD7E|;H?>7fC`HCko>2q_;I zpf}**gG}831%zP;x8XpMQQ`^UrX(5k7KSU)+q^l6#Fe*guG-L#1q8t@=viREST%+7 z*lBr#jHlO5e!##W77o(+Ef_yyY-gkSGCK9+YswI8H?ZkAnuLR_o=HJ$8rZw(I50wD z;{-3RcaZ0WOWCkZjkm*)AdorsOhpJ&2xDp|J{8TYV4tWqS`T-BDxBO?ndOJaN4{|d z5e8ybP=@H4pqw}7%Lcy4V3DaI+60C;=)!=BoJ2w3%a<-~L}#7Lw&2hVsYtBQ`(xZd z;hew=PMW|CUnj!dE4#S16)tMID%IKX+^3Og0~3^_18WkKj^j$vn|O<^9YT4u)}2Zn z$5*TzX@T&q5@@=>RQ8O{69mE|EP%L_>=kfD;^WRtCnVJ`2AV#v0LKO`FnTf>CCnpX z2X{#+^mxEU*6f}O?jeBT1mYu|L281a&DmLI;;S(6w5pp`Uiw8u#ZC3i`l)D9cNp4$ zzeDv-drWf#?#7IJq@LW!JFwo#>V2G~-)4+fa!E7^?4=BC?+M3T&;ckBcb!s7ku0_t z)pU}j3YS>W=s?_=-Jvvxi{Uk20I>cEs(mj=Bbpc&C5-@&ai=ZfhufuYG415oyV_QF zOoC8-rvxKVrqpHz6Av72%Z|+ZgAp?k1Dr;}O{DxJHZ@`d2opv}YTM)=gb+Ar0v+XD zwkR<Whpt2m%J{#qQmU zgeR?&3AqRnfU*RY`z93ZU`g=>dj%yXnKOy;31UYzAs2@Qc3cRZs^O{F4)_O%!VYY= zN?r8}UNOr{KdWH1Q;%7}pCUWR5^Fi1;DjCUAB{Iow%SRbF8)}ChU4Zw*>r!*01jh* z(yxS!@pkUkV06ueC@TVy8n?3<6QbO={zhN_#g5LpND%mJSX%w?{YO7fMlV z+NliQ)QKRMIR2V_?Q+cPp5clHo(p5knv_9A&Dj!yl3h?yH&UsZfO#N%i<$@J7$Q

mYJjHmQyaZ3O9~%@88rnP>Pri2uSzQxdOLV|59jYOyD>nn=%zY;oPzQJ2yd#LxMeDLiOjrH&d&kJu#`pJ z&W|6R#tuTNp*1*_LHt$jkONoYqyTBjdS;@D(;@vOQROtmMCytX#u6@`qs$85CPLm< zy&QV0;e`z+Lxs1H*n@MCFRn`!Rc=1!H5IzQWxI=~B>bgNXZCR+WT9Euu3xsDdJP9i z0qPhck1)LYswNf&2&08CPbt+Kai`HWP(U11K4=e0RRsh)%5yU416(m+=E>~>PByB; zG*E>6ecOYWv&d$wRFu;x0J2wetBnO|>JT?mJF8%zShrFxxFM}Tev9H4e`OyGR4CbHw7q>S+bX? zdvQ3Nb`om0WK5_6cl4AX9d}z~uOj1HE6vg^guLlui<~V00H+O^Frsq5qjRV9K!{=! zc1m@qbCkUXfIY%hbr&1>($jCGg%I@s$27xS=SFb=@@XB(J^2<0VR5x|8`1)1jW_4z zMe)>vmDx5<3vt3W=~PKF1;)gpwq2I#Z88z(M$G_MyvV-qS?jY46f1svB4}kS_F@A&s1Ph~Rbyj48 zLH+E9D(pQB4Zy4whtiXS@1&4^=(hoqkeHbo!sivMm~P!$O+N0TSha*^9K#smZ}7 z29i388VN*0OtND*; zT_8wcC-hFW)<0NVp;2hTTZA&P9;nfhf6xwIyzdDf0lAzFiKr?SCJulPFBp0RveTd< zMCpt@N|H5wkQOnr2d(vJxul{L0{M%lj$5@R;+rxnMZxUZmVhrv1sWVf&fl7wyRfpl zvJuh*2)><`QEi=y5MFf-7%F2>Fr#pV6RoPt7BoZHt6+D5Sin46-17!zS&znq!I=~J z@B0k{Gf$B<20;KZfxxJV0-!2>3qNdF+Os|PE-$a0W@!d3TEWn40yFyl>F^~5B~P>$ zuE6O?bc$ZF^O^>-C?d%&7uAqN;w~)$!_(i&Uq;Y^L=d27d?zBGo)$SPr7lYGf*nXI z=ph2n1!c`cQ*1RL$m3sOBZGBw>aE7adGpQ7_JF~0oMEYk=LDzu z7IaYPPs$wOALA485MV&D&vGH@pl>*wm)<3ASVPXJue%5!qR)p8E8TntnH9RRa+HRm z4Hc352CXHf)=ZOgsd830lhv z4g@;Yq!O%t?Bc_<-Wf<=h%T%*3XmULW@P4_=Orc(NJPO^T&EBS7>UXT)R36E1f1-NBiDm5vsnn#4E;0j&!-9a{@Yk@S9mGvY5iYZSL3{UGQrlztpEJviRL~KgA z&!8VyKCiDc7aG#2Uzd7_qU{UU6Tynkc9@_t`V>3;S<;IrDMT=cG-IzZe!UW?fb}O2N#2_lhoS2?Hq~YMhBFuxcE4Clh2;@~rds#oTbeV)p z(7}a|&c;@S^P37bqf0j9x9JLotp+>RXzqXngt8TN?<>Nif@(O6xd6P}@c*Cs*HGf0Q)^WYjxxVdj2kXBMF!(U5L+;cfDJ{}o zIyDd*+OFUTpXvI0uuJ^+Mt%qaENGh0X;#pIkst~36xADiJ`YP4Y&MXz?z|HYbC9^n z)Czc=gq8JOW4*tf=%dJXRa}GY=mKt~FY#m}jf0g{y(kEg(TxOIpo%ho6`BU_^0f0r zWDG4!`xsj0!pn?UA)aDbv3 za;NFTLDqg-hhqcSiL1^Ll!+|?T~k{lA{BuA$jw~hJq!{(IwQ!7lOg#t|IKPq*3MH; zK4%^p^F`()vs6?TTDhP}YNu+AiOgH)A+W-pLE8|HfioY{mAFuWjp34*LcrgVMv~a; z=1BELnRP>ZW}t@&9&vD0F;KD{aEb<;2(DbXdRUGYho;%e+4xE8`yM?*XUBrZ6EOaw&-=g4Ne8rt<@|Ey(2vZ@%j6LkZ z5vJ-$vBp`Wf3MDg$6zF{T!=qFt(N$}D=`QvyGh^6Ry$P!s4_cl?O@M(njEz$?r`d~ z^l4~*90nv<#os8k&j1pzeKDIgC>CN4&f);+75;AVQ;^7B6ZbXE5)g+4h>~aRmm?g} z4b`c$h=&Zsvo1;#4SZTplOa74v?sYzVd+~g3ZyI_Ang?P%wjh-6*l*zm~=5JnqSii z0q(0cqd9Sxb0v%!C4CSsA&xF}K)^F0o4bZp7bBFrrt4ropWN?H{Oqzc0D=v4$fd>1 zfcJo<_W?xaJwkjxF~21lN&fhy%3Uv~gs+|XgN`{c$C1L!1%^Y)HeDbiPrM7xuk?8u zqT~u%4lu~S6d^GK<+x?j?t!0;EnlyMP;23) zQ%r?yW;P`RIhM|KNG$?w(i*&NnF+hxy&geI4?I9X)M=jbeF-Dmfc7M(s zw`U@0UestR=Qfd;4c7}S1OS`{01WW|BfR{{2zFs-?FXfV#2HC%hv}tcpVD3i48ien zeGClauJ48l&wAYT!1 z1bWJdK4eY_1cM|&qzgbdxM#t25>~;pnudO;7*5*k7mKBdUYM*8h*>Rfe=qdzUueC= z6QDQHXy31R5-uVG8!@hmq|Q?ZvLrS%4XA@d6+8qYKZ8%yl`Lu+;GB+6KN4sTNECFR z#%)(J1?+FD)5MM>hIj5$B-S7-kq5)oLupOeWr$GF<;7V8rpUAP->toRUh?WM?arUm zBpnG;Lm47zo=o75%`Y&zDD7SR?f(PS{gduR6tvPT?RCFq^Wu0Yv=NO3hkLE^j|ekP zdU7@v%yE`WqLP4^Lah9M_OwFGEovrXC72q)0rAz5iNXE-+r@V@PhF6l1*uVHIic$y z{Au;f)9$HL+R2uES7NzDc8ui8jp3b(;|-U8SHoTvy3=h*;vR z`ZvQ*t8_bK`h)ZWxyfmvJ(Hr9fjlt^UjkKr3%IYwgCdJ4Aij-ffMFzL7I9q^F2+l_ z(US>j*^j#&J^AdOMt_;3_n?j&S#k$R1O~!}4sm&rjPItc2mcXd1EfVPwt!YDlWM@X zY8Vg$b!4%$BWQ=&3*3CL0El0=8qFI~$zx24vmP)WTeS8C=9xADHexH{5^57A)1yfY zM2%(o>5Br~L--r96ZlWEjW9u>F~Wj8z4mGbWJ|Z7(E_=^j@LrU1POCC^}uMA#7g zqhx=O5}a_9)$md;DDvs zLUhBwe3@l=lY|+d3ocPzi%FG9oO#c11k13a&G@JO^t(ccL_?1b=!Pb^mRj;e?$e!u zD0Z!XK9wr4fJK%tGc4oIQ-VHC-!-QS`mC|7E#%AMYybub&6zWg3QLeYX<#ENp{Y`a9QbF>OJQHiR+D9A+N z7OUShgajjXLtAf=)gt_jvp|wdwY4QN?!bpGwPIViX+bYL>6USVJDRG-N0ywGGfR~) z8CgHTlxD7Z871X4&JUdsW~ItusbmwRltbccu<)=j=D>?!VONDG;BpeD&a>>s>oOkA z5|0x;5-kJ!3cX9FBl8_`u2G~jkBmNU*S%Ke*We0=C&wil8z@V~*v||-{#dBtR7I(CjD+B zycC&VqFjR7-0~&+gq2Y`*xhO1wSa>C-9%Ng6^nrBR!Pz%yt&Iy#95WO=5zy=)!4sC zTR-A)VdRIPEUb{9K@4d}(<)`dUX7%*z@mnmk2CF+j{n2>&sVF+>16;kNtebIA*iu9 zz}yBDNb=3vjjs%9vY;JgMm&Whbwsg2XRNSuVQU8_3lq(X0t}%isqGG)Po&;+`ITrJ z-V<0L@tf8aw@@TNwaeRqok}0I{@L2!IBR!rlJt}#D=DN}D|PIY^b4Kw9D94tOiWy} zYLg(Jl_5yg(lPu-2zkTok#2yZv=B>SdK3?as5-ut%1)4lfB+>+yySwZ0RXG6BP>8R z7Z=4P%kp1RSAgu`WEZg+tF)73Hfe%BEm`kMr)pxOD4gkx-WykZJsJ6^HvL;0SX-|K z92ciBlWA{%3?^w-iLlR-gr>bRChTa7z<~Y_9Tzgg`3- zLc*fx99KR8qWmD#19qCc5(+7=B|{&iQw2*j5bM6=P1WKpYIT%T*a>ZB;Dj7g`;kwu ziZo-vPYp=Od{{KY>M@h-D%llPMAw!31dTW+9;J@NUOuteX+Pn6N#}%iE(NQ#S1(7V zWVtSwl87Tu&^NRTZzfq1ln$}AL4Xb6M`%jywamWzyo$q$Bp)AWUJ1@S7WuOEt4Y__ zosr@4=di-wLAf_v4&+w#8o91W58nhI#b!b!5_!m3`Tbo84hQZ}RjYqsPWBJ1`LA|l z2DOG^Uu|z=mDO?{DRD6N0(DzS1f2;?&gMF^#{4&aHfsL+9Wt;Pmkk5$rQIOdu;X@Q z^kSp2i!|;Ls0x7@x50+7W?UT{Ob!1Zhv^S@!glvJ+SlJd9;QFU3ifn}C%rTLpNHx3 zo!$=L>Fe*G?Z|~qb-sdrK|vPlWNXSlyBU}BDaAp7E^C5y+&O3v(ljm%3|Z;_(senE z>AM^T5XXMmpC7J-$|3Fp%TAQHsSHsKCLCS1<3K#01?wLgQLuiMiFh#&VQxbY4w;9ClIpQ8WT>ws zK#nI5<)`)#X(E>vKQd$|z$|d518PzuNeFi?Wa_S&$zK3x9mQsW1xSVXINw6Xu@bz* zye8&NiIqYnh&=?qK57?e5X;JFRD5{8g#@PEQN@MmERr-7c-oILf^hUbk(hjiM|w|O zwNw~jyFwp*)S>wiNnbC&l?j7NCNuU7SfdPjV+y25kQ6V5kw9`@L4zR(L*inJFf3d` zGSlGY^a>hsbOLm44v;8RE3G^#ASZUL5U#b`klpgT9b~}CUO>YAp^^ha3#pwcZ1xAW zlt{vQ4g(k(lMVqHt$#puRMzSw?Zn#aOwOB#aRILeCuy?)2lp|vec{R?EKb~0unrgq z;Uj>kj!ZnHFe2qys|WJ6Mk}D~5Y1g3RCYmT=L=Q~WvOnLO)2rxprpPh`FYuCNcMlv zL{K~n-qSC--oe8Mngf4})^8xCP*=)_xx{AsG3gz6CLCmeOeUM~Cds=T{KDjqG07H&8(N zFcX=V&a|8=?V^tj*c7TYSmVmGSlAUL-zgo1-(GJy|?He zAFksuq_k}9of@(~oIl53hx*z)Iy8D=w^6%Ms-VIwNGLp@@b9*AH~(lRF>26qJMOj! z>=QQIzH1pC+qaw96o_}x&*MWQS1C(*n53|}i@PCC4UKf)%OQ}Nj?0x+sZeh2;f9pV zGENWK8F`hUpE(U4c~E zC}NpR^PkbuN<28*nxhtjRy<>b?52B*k7=@0sGqr^B* ze+yDk;NY)Lb{8ts7N$mF|2p+O(zJ`OCFO*YcM0kF2 z;A$L*uBc+~J)?kl0_9riI*JEeKjrM!FAxkA{Am`VcA@= zlXDL_5AqLVQDo8Z<6W`o-pB&6q3~g&HG5+_#93fg#RG6m>jE(R!(Sj$S+xRC$b$!e znC=rd!JFY7-qipzC>u$q-`7pTTkKKlagp0o_&H~gt_C_*WUgLf{Y=sW#tbl+1)Sl2 z-J|vNP;Ra34k*WI2i&9;EZdpjq8)`UJ5J@ZTA8+E&?aT$o|;}A60vMK!LE&xG+dOJCr-yJL@jMjPU-l_ktJg z0t^v$X$TjYO*bjcJ1Xg}-Lg!^g*x5ddrvPn8SCi(H{m)vaLHBI(keg2 zb-iA-sD@#13=-%hex#@Y7x39l{Q(Ek%)2EQ{0EU7R%Kp~c$!63`6Uc5oV~grwfG65 zPic;?#3)@R@iOGQq(w-aW(=6bNa1qO1UiwK1k9X3hPzBH4Dq#_1%)2OdLz zC$Pf_4)c&5{9_i<5GUX*Lo^0B!M8QwaBlx z#VKQpSnRFElnZPRe?y^lokK`nNH$5gzH3(4wB6krFQwxxs8&MI*5ql%tJzQ0maM(aF3zPVEv*T~=IBpvjzxj%#!hL-R=fwaPt7;Sx9VdErZ~w3!-nQ^M^) z4!@Ut(quKe?3rA#=fM)71~6X3p_yYBLc2V16uR!~_u>XWM^F2fLmi-GS^tSb7|uY3 zPU^ap7kLxE4@ybr&d>_@ON)t{K!jwvF`;2lqD~jLCM}Wcf%2eSSP!{)n1oMbjsVKaAm&JZTnBq&6g*t=kHH zx(!C)51|HlWvVwK{yr|>prHrNia+xXJ5^V;t_qlRbB{=n1Q__r5Z;Z~cOGj%W7!0U z!8#Xt(zVO(LdirfT0`!2pExv~o#No#9lmhNp65bz<+|qd)Kfyn|GD^UFu_FnW7rBJ z8F?tcR9R$(!pI<5dA=Jpx@oJm8$63Tu1uFqmr@Gy7a+ny`q9wD1eUDvgNR~gnse(S zDe2(Fcb-M(*b}i(ZleGlbLSFbgydQ2dU&Ii%f$4nkyztu>sQJCguoW`gj8ZF_J(x= zM@aBpN)j%|z;q!hfMP&^86c3|?T-Fa&$$KRrUU4CS*&htN*o;8a=8kP$l9Lo<;+1I z)2%t60|%%mf3s0VVG2@;!MKt;``U|W!oBGemF2U+`+rCY7@l``@;M)3gCt-<5SAMf zJQdDBAe8}8ZgEG#jCkjIFRQ!Tjrd*UmJ8FQuJTh#WnmP)SX$XDrQQ%>X6-CQ1j%A_^emO zhOKDw5z99?4m_mjMxv#P93-l?3J8BixPX#TKI8U*1Bww?D2x}tKk;r-=+&J`IJ@}) zTBkSrC|US)rxBSSl1_Lci&!%$=PHB>L(oo`P->sXg>OJi({=Z%LOe};%OPcG2y@YA zDMnx(uCY7^pwo<17FhNrr{Gb)EWr_=RpDh>EBZ|JCHAi2C+w#w3JZVHjvGO_LtX^r zKZHn%K()g(UrJW#rsUd&(?d2-@m0~m*ojR|LLMJrC3$t#F1nFrM=&9> zs9j0d$P1@xu~w1#+)^Yp+2iIE1Se&s@1f zqmj?X1DAqmLs0pJi)f(SX09EgDhxy$H*0C80lEx~r1*!TF`76jSc_=o7gR;(vwr=h7KlGV15ow4WZ6-7B)WH(hsW;}beHrG97hPrOf;1b$T!m`IIgYNAz4#4#_{#s z)-h7BeU^UXmFdNFEB)}v-r`$W(PXXw4+>u(wGX%?ohBQB2Luk}NoHRY%nR5Hzk?W? zOk2+(5RJeg8+Yz7belm?zU+=MMYtujDx@Q0q7J>?EK|jlU!`F7hX9jA=aLi%N}3{# zvt9^hfvtTD33W)%NNybH?#v65u2XPdGo zNp6@*@mH0ARR8qgg{zJ>Fka^b$Wo$%vMIv!lHCCE9E#_Ov`#D;NUJvE4Tm%Et@-im z*Y$GygU`6r0NAzv5EG~T9GNwTcIghWLd=I9@o-ZMHw+&7eUQ$MtCweA4t#7fDUn3D z$oBJ&L~JAU2n`EWH2s)|8FfK%C5xisj0H{&rZVa=bzJ6jZ&D8}zz1)pt~{cNMVIKQ zmh(*GxM%iT*2P*o-|3ZmU~huhlgc|h=wgL^6#>SYO}Q;=b-xnG^8*aCMhE`9cj5CxlwMN&Lj8)01hSWND*z6TXEf*p_d>fS!VMv|F`JcG&dE5|#30nWDRFC1_}1>2$nZm;xDDHvY?_U;YX9%Ml+2Y4v%(Jksi zVG%h*^W9|+p!r{CQWH&_WUhh*MYUHU!3p$4f2+qwetSK@?~7n7zzc4x2%YtAMLpLg?W{W?r&ExZN^Ug9#S zlPWT?0_ zGgbX~Wkw~wd&-q^Ef3j^7%lVbZ%2y6Rc%!E2J^gvD}o2Dl*4~5X3#d|%9G=B_~9XxP8 zOb6rs*xjlJSk%NQHnosi#4_1Ub|hSP{0Z4e+=-nbJNhF2&Dvj*#3y6M*2%z8^A|=k zq%53M6Adz=>ZQHx-)34GE^NXoUagPZvHe6zTW0z|kj>7WmZeigI8qJ~N1r~RHB-x- zIi=gkq0hEI{24Z+9%HvVadjTF2P#e{(Dt1EOJQdJnNQY41r7Y$ zJC#T-(NmJ%BT|tbD{_+qq?3inLj>#Xi7bo$X%W085eI|S6PmXZi;)7s!Ch-~((zOy;<0?`ffOf~m+vi0w#j*8jXlC#BSuM93 z*LqT+b*Dbsm%XzsrVIhSPST=sb|UJgr$@Vkeq4-D*0zQ~IWHIXot0qxM+Z$>D3DYj zmi=~HhpI+wZPrB06>Y_8e`CKw%)ja?*xh++JoTKJ(&~nLKNr!Qz{<1U4b5OZHIqV&^ zgo20hDH>{Ebi!1jz(4@#Z5CCOaukF}3m3i%zBD{>#wtM(K%^WT1U<`~?mPJuUyH}e z4eWvZreeK6`5Z920}1Ho9RW?hbBody^Sn+oRMHphfXPs1F>3p0lFh^Rg32HmZ~HHY z?7Xumx}?VEOm5<>b$G$;w^`x?b~UhSr>T&yr)i>H@rr>yFLCrVC&& z5)l0gWKz1qq4-|vpOftBxFuA1>>fKYL!{qE4^q7Fz?Xt98R)0&*e#>)`d0;>s-i*) z6(?B{Kr&bIo6~U5;D|}V8HwVk?jV8(nLbj9I5X>H&e8o*vHqkte|uWVKZWYJ3Cr)e zrq2iFKM&dV7VSO-eKI$vE$3bCHnUYG^ieA?pF?XO41wKh>^K1ywF|V3`M2gQH&_<# zr2N2q0b#MUF6mSEP4dZ;X7XxzM-_v>{26jJ+z_|RJ4vImf%;Uf1m@3&?1JUZgL89C zAKtANwyU^mzK&3fa;<|HPgXe6dlP)}`rKT1lexJE3e14M35GH^$8Mn`0TLrK4iX5J zMt!uz5j1(ZbW4{POghyRNixtQN6BCSpmD`mbYjy6(3@0WgKqe_p|S3K`uug;GwS4h z6AcNiXl)Dx?6`xgou7vCOIxR0DT6^LH#BX6`)TH%hw&ZNGq$U{`hLhve-bgvFsAC? z$ISGCCfMoUfyrM$3P`Mf9XA(16Pys^MU^Hr#IxyR;rmT9Y^K(62Ul&QimMTt&}Apj zRj<20PC}FBJBftC%LmNNDsEcp?Dz*CF?qE1e~p;Mm$rH78ZDd^hno+YnU`SChEef6 zN>-u-SPmy)QKaoa;|M}CQk#^Ey z(orTWKA%aD=O+R3pyWP6;O9s_#n0X`b0a|I0Qt6-Iyb_n8+8m9UY4?EE##PWy@6)^ z=R>&($&72pg5cD)|6*vg8xzOD_N534{q3DvJe}2igQ<+_YZ1njTR>LXsLejc9LD5s zwZ0b^?k~HH05g3yfEh6Xd^t4%KsVJ*%bEaCE(cW|W|Mb?G7urKll;dea!{|2U2v1*fzUos->6LnPH9jYD!)zo@G(Um zG~kK*$AcAxs3_smj8}H6;Z3ae1GDpsoD6HJe4dV4YSdunm~|Tjj*}2gO4;OnVu@ex zWr>UZK(N6i%6-5`fMXk&zZ$Y%tnAfGJJqrR6I`z9UnBD-13ZJqqumsKw)@k`aMBiX3J|HoB1S+dW2R9$FZ1bl`Dy0K{-0WtU*T1% zWGHdY{0(B+(!clrY{*PJ4{UC1ZRN}lPzTEWvHu6h%={H_7-c)_wMM&@Gk*)=vFD*N ze~+oVHEuQo5KG2PtEVoRG7Z`{8M+L&GLl&1)@!7I@S9?1Y=fdM$lxE@|y zg|hD6dXmx4mC2*6>I(ERBgqO2lzoIgfQU4=J4IP&QFcBuS2r3cFaq|zg9uB1W!#xl zlk*>QQ_G_eUArLPK+u4_^B+Lz{FW~0CPDGSI2|~nrq5+AEi(2j3NexO75-oL-UhU; z?7a8h+d7(PTFtHIUgus7ujhSFrk+NgE1$>{PwG)T!5Z6B`_><_B_}h@7@cG3*j7i< zQFJ7aRZ?gng#;Q%VG1dvkU$D4q>w@iDYP(!7E(wdg%lc?LJJMNg$bmPKne-GzyI^B zwf5fULzZWpCg~e+GWOYfua9Rv-(Ra6G`xQ~kiQW);#B!n+6R?B9MDYY2zfn+%~d8R z$-foJKQMcoL;M!1AWwb_$)oGy)C;1Iite9)WC}q*W%K?!pca4#I1yn{4=AeE6xP;5 zR27KV4^;f2@ijg+V1>_%q$jP7<1MA4+VXK3KPr57GA9@w*CV83h(JDk z;~EbP*&ZjMLG^pIPth$pgpk8kkgVKNOyW{Rxar8mTRa_z0vIc(+z0Z_7zCDd7hRX& z+uLESCG0toA5!zoof99(4y^s_JsGa4aIh}XGkG=<-yR$vK2qYtPMu-LRyqBj$BBQlTK3HYdHusXC*EIw-!s=U{zVs{ISlHt?4RyATAxaXZTS5#+S40ABA=eOMW)PHK@laurZuYB?C{x81mUwr$Xi#xs$xuKLiT3jEx+PO$#Q@nn40K*utxTEk8*`n#O4QGlXgWNV~eYW$yo@$`i&ICy?VO! z9!78U=FL;u`I2RR*6yA3IlUKvU`8S9u;4delL50&lQh6bcZ;yRfeDPBR-q-QlPUVd zdDb~uE$wDc{V{I*&YQ=ifV!e<_?DuC7kGKK26xtREEB z<14XuNW|DUZzFq4(3c@H5csgTHuZ$=u#A%#fE%)WqJa_Y7Xd-<#-ID@=Za;%9OAZN zj~KVob07sr)pWc7;t7h^qitF*ox!?Au55?yXD^&Avg&t1GJ z%kAL@^&>pVkrT}qv?_$Uuglv25T&|5iy|1NYLDf+2?r9GR>%x;v|=#lgg9uYK&&k!8>ux>)K;LCH?+%<@eg+_57m7u!;=9 zqKyCGX=(svF@852<&Efl60nBKjv z3*b{C0+9}Tzf78532R~}&8l{9;_G2zLB@^*XF)iJ>FJ$~^$vHB($}kzec!nQ+ik`d z!a>!adoFzw&Zx;6SQLMBjp)(NCLM*|9(O_a4A(Mfm7Hdy6-FF#0MZ>S?lS-yGy&6o z<318h3{%=GD>`F4)L2a9@kF4oW++#{NPHG&;trmX*=Iz^c5W=soBzTLniuC@oQg9Y zYgC_4r!}lR-TMevWxy97i+jM{r5V`R9^;pv7NbAiDF4n#mW=FLkJebM&ws;)oT^Sv z#Y}wZ>Bg{^5F&3$2padSQa`IoSu;Apa07gJNyeyQYvaw5ER4w4^Qm_VP0KI7-FCSY zOIDnPB$iZGBz{+2-n=!N2xb9Acy-zTO)z%B#2ELkM+j9I)#&6$UDEhGLEwlV#nCv->=tVuOUabwZYKKFBUI!_KbzMHAT3*a3f{6L zCxRWY23vW^pXe^xz2eRKRFMOZ_ba}g^2{h#q%Rjz%ES1Gfi3*^l1rWu>Z?}SUTMwB ze$b_1khoP{#;>_oo=n_EeM*Yyn<=((V^?+cBBN$C!|ZgpXY+YHl&9I_3--O*X;kk} z`MMfpo{kMNPfJ({VnrmN4BG&ObOW*p25;JlZTE`xG!#6SSGSgT*1|goAv$)nAmRnwo2UU-orX|yR(BqMavh>&#V`j(vv3jkFYkq=Syb2WCDYH z-YJ(silx5M+g3WdmHx9dDc>10oA!y_}1q+juBabT2OL`Z+cXPUm+;M@*k!l=T>>{xLquy5D#}#dWPpW{p z-O(kME3~Ge?W+3tdqt&2bnm4V`rO?`ZwnVR47c7fz-|14OUIfY z4Rc>q2O50r909yirNcNTS}0}Tbr8)*4UybOyBzGPV^3>vVBkFjjKgXU<6`hM*6|iq zmcvGYODu#GerJ~NeW`jT@D9_xw>ePvxN4y2({sq(Y02ko^{TP zh;drYjgCbWDJ#JQiQ~1cF_7xdq)sU9gCc$^q|S8YDoZV{$~z1OJFoan0`N)>L^+)| zng}`3MCtdo!VkJRP{?{c9EBFs0299_y zh3uz_%2pns~uHYbdOy{F&RzZ&p!JE6d{zb9&Dx0geo9R`eG2hDrvL z6$%MB!I-Pq@WLLO$-PtSAt8|sDDKLA&#g5Ktea?an1sC`WI)OwKv%~fYt|7)6NIIQ zVKBPm5o|PkOjnH4iht|O;I2xO_fe6dS;RK=a98<hvyll!^IkR&ErFNspZT@Fcd@V<zu;Pxg1;fG zj7%o=Q0h6*6D6pxw!7KL1RCQSSt+B1ZhaSjA90mp-Cozybaky6 z( z?2Fdgx>|0u*0@eZIi-4;rgQuhITcYblB$CAZmLIx$I-Ssca4D=mad1UqBoWIe8W7i z)ixP(@)5S^vIeA;WD8hn`GGbc+Ws3}1d+wkQ&U=1@hNTF)+KMt^}K8}PuYcmb_C7f z@tvJDD+Etr9n&EssJ$C6i(k|c>d<8s2zbHNjkD)I*#&yFXI zHi&kEkz=CPW_!%3?NB`LaRhhZ9G7}I{RYtHu^>4+q{<3{+<{}B})PdtsS zER0M<#1U}tKqm6r78(}XO{f%xEAG3s9qXLU$7`e$wdH}sWzSTo_)=#+DR&l02$}pr z*4kxo^5ROtNC+EZ)pa548xb=+V=K&QOAtF4dj6QAt{7rF?`@=&3vG{|=IG8*X=@F( zvWHHN=60z!5>m*@jNYTb$>^vXnqOvA+_&rUToc+hct1tt6@!{W2Xkxwo{BtbHpkHgivZ^59fs#RgokI8`z|& z0du91LQ9Po=$6&NXy7nkr4*n4K9)BJyr-B~5CxGvlk4D#AG!!cA%V(5)z^8ELxWEJ zLd4)9N|uG4UObg}6$4`^sOfN%=3+KrwFKaS7`GO())K77JCbogFd>^GmszuW7^N42 z{#@Sr+d=tvOl`Ul0SN9{D32_zUXAJ+XLe{sN`=$-q8K7jNLx*&6Me@K0W`q&P~(iY z93|>oOSLFlt3P2!q+1l1;Tum@)voBC2XCc&-$phRsVJ$F(xveuwu^CXM9 z85KDHjzn1}S!i zas*H!)?3Q3DIfcHk&9_DZY3nF6q_E1gpt@9f5F%HL6Hr$YQ)2nwmY$(L%oMIIt6V@Hdbw&OHaX48P#`h{A-5Se0E7KtlYfF4+oi`}<@_prET3u8)kQ+my|uCGOpqku)(s zC|*96pD}?SO573X?e5>_`57fEm8;?J%bz}TB|pEuPPZLYB8-8gF0|a>KFadEc;1DX zTg<5)y5F)%d2F;d?JcEQyd@-mPMUq+9)oreSXs9|2Lz$4wi81<6Ecd^~W)u!xdclDes8U%6^GO-i?v%|{`X zEM~-rN%a_mm8{o=l)dRnkL8!AevK^5l(F<{8c3fq%qw+A05d*6-vq%<8K4H=H3s|sVm&w5Zo&w zb@^wm<%Q=zTnud-7f~LySb&NVVH%+adl1Fw@=zJgpeV_wiG=mvL-h`B-qoAmPj|tZ zy0&c<`2e+ zd{^EJcU*R@?w#s@R;W-jv7n{GP5kZEb0*`DilAM@t#(9 zn^ARpPG{>llPz0|Qe3@nkxH+LN)zk?VK`I^i!SaXx~!QuEhm_HcuM&-kN z*Nowy6ad!ZjFd8AAFtwY{ay ztMNfR$Z7MB8WI=Lqo~~CAjNL=SKH*WI3tqF!!o(ZS0}yGeB*XUWC&5oH5Q!;f|wJK zJZIvQ`(&r`k2VWzbdD>^WqFFPY6;Gw3vp)o zBdSl(+VD-=DJ$tLqV4n>Ad%3jd@njo$+-}2wV2#?)-%2+EVR7HUMVmSOdtlbML#95(jI?;sY4FjJ#`llb&%fvLZ2cJc(c(-wC|#bpV`p;= zidOw>_?Z|(Ix;sS8#7^%N(5H#^+mv2&HQKz5*}Yz@cVjI>Y!6nC|iWnUZ1X`SnQzg zD9U7)FYgI`*}sN_b~QH6C~g4*Wu!W+t=?>l*_gyD$tbp)2&w*5Y-Jne%&A`T{&DFU zg=3%=DyZN4^!048QgPt!PpDGyGd00`^9DWdXKDfr68a8$<$tQ0fRr)*vkzBnlzI&U z9VvZ%UphlcQz){*lY-DI4ZW~l4Ew*T2>j_2To+L+eqx2wNjGYe>N)YYY~aI56@TYQ zzPY%E*-Ic=qT5KPER9AMujTF*LdV7LdXyvxD`b`icJvm8^(}X>pjlOPc8f6w$t`Wv z(`gFN?O&$=PEzX7wk!f&sDqZo6I9**KO1>gRhP~(TB`9l`^~KKN$hE6-7VW==|qyb z`Ib0pHI4pf9I&kZOA=JH=#LH7$fYX>rF*l)t^B7#m3~0Ifgi1Sn_(5b-sX3@xA~nT zV<$sKb#(b2PE4hz4|hg&vZpijRI;W^7QCPMV}%=8w!k*N;IbQejJDdf^KhpVW_Wem zOZL_-C3j{;{9wR^^V8ly(>flO8ii#ui}UF^Eai;(NN4J^Ser&5@oizK7jm1ckwo{-@58BCZ}1P zC|S`fSaiyM3_9ub3ZL7JIm#)J=Vz;}P^L9akj}J&$xZM+WKsLSlHU<;^tw;6-r7*R zR#TG#>{j@k6v>`X`K4j$s&+(?U75R*tSig$E#Fs;@4|rSUqG zl#VovSNg?0%W0U#iD=>Zur!YIzbvh;yh&epq1oR3sZ^|CO?K7j3<+SyR)^sSA!pFNInrc<(w50I14P^N| zM#Hcj-=N+h@ra-Ra3{A}o;pHH{7QSl*}JP-&*YIVL@??t%p_iDZ&%b)SI-P`PDay5(a{xPIGG+oJV>tQIS4>fMfUe;CS|N`Z@AEP& zg@rtu1ESDIX>(PT%a+L<#(>8MUwx5v7e)`?wAQ*7P6|AJ7?U`Gz@b;eK4_|T=(Ra} zw*s0i)%8jgMNZjJC(C$x1y>8YzA>-}2Z5W$-MXdEWK&UjkAs&YZK8>v8pZ@m$1`ke zGp$#-wmazt!s$SA7DS&XbLMnXqvKXCoiK=)rw(0EN z-3|q1XTQ4_M)}*rpfgY2F{zvZJWKR%SlvQlA5N5$*fp)KS4z72*x@gpwLuIlK7y%W z!hB(hsaO$y4~&fV+_dkip?7?}P!P3*s~!tNbVIiEsU|Ws3@{HSH|X(^@pM<#?Nu63 z7(VydO?Dm8p;M}LTrOUs*7X$0BH&d#oPLcs+EqO*`iB`+7haxQQL3#BDx2wOBrm(H z;4QH>U*a2)4Ind|S!m&rIYh2VzRMGi4NrJ8>_#@4pVpScLZ}fWR0JSkEQQp89)8Kl z%^#Z^gw~2`K_a>JaPDh}vq{32$4sW1=*$2b-&8ugr&g>PHBZ;uYoVixadUOPpibqH z{F?3$v#;2mYCi9-u5soz;eYxEn!-#X^VwHq(HNdfW9i*QdEg*mZ8CG;XX|5 zz4AmOlcTlSi*68&nO+*C3OPwVFHh(l+#|2H*~XU`Gn$njv^b)^bAP^^k%lSJ zfO~_NOLn3}9#o7h(FGgkA25B!cxq`wmJ$m4Oy<39Kn&L^SJ2;w0;XVRl<_WjI73AZF0U%4lvg4#GO!p=Q+c#A(-v1F%+} zK(~*mOLwPJhRq&{cLx3C`$5gd7kRtqe9L%jj{*Z|XygE1-eH>?R&p3DuD@J^K9E+eXp@7rwlg+TTYe*?0GkarSXATfjPD&hawlG_p7EWlNNY z=&>h0UT}7}iu6=zS+1twzcHEo{TG0&AQ+(u+k%R?o+~i@^gu`ONu$rL^Y&48#>!3MOh}^we?0B0}Y8S zNw?5S^b+bRsW?@)(f404W|`bFrNrMJrCd5b#DR`qVw}19^2#qtGUfd;XSgWrH zvV1k>%%}{X@LqHGt_M~Wg5_UzZm$7XQIypFMSf1(zcS0kY~Ne6u%$l zW_uVH8oC>w?d5DUkB~XzD!w-9Hh9|}&N;#!cN<&`Wo1=~aC>>(l6Cl~TzOXfW1kty z-M`=M1iB?aNPf4`efiyjvu*H^J)Dn!=cJbJY=pK^y@1wx<=uFS$A zNDuKvI9chJX;xh(kmW(_aJMEU)(gE9VdAr^_g|r=nlgI}B+| zH-B_Lx_PKTo;SU$NB#KE#J|_j%u8pBcK&>E_R;y-IA@-}ir3`rt0|+Wa7x_E?O8tS zfzHo2g`M{>@H~lofDXa}B)X*ssOtzaLp>XCsPu8wpl?!1t{b#WWp+f}4jvikhFA(# zT-hQNc4~cPn8JcKTig#SecV#1Thy#e^t*%C?D$6gbYP)UyH~rf*%!Ywh~*^-M#V>u zlc$8ePxRp1Q1$r-h4!rcepQnUQlLHQ!u>)f^KC!{k4i>|h6<_PKWYOL1U1)$h&Qm& zw~wF?z4$2j0R$+N2mx@;N!qL{d1c(>#LA2#_`=+I{ctXCRN0*dvQ$;W@V>`R%Hzf( z|8&&9LPbJx>3a)BE;gR_W>%Vl@69lO2sJ`XhL8Za$+pHLFIDDr}!}sv&81rbz=pem` ztGHdxbuyp*!ISiSUSHi_iWl*Y@4@%wzu5b`+*No&UgsUyMYhtKSuHw)0=!B zoPc1>+JYO|R|iWWSR-d{_#26CX=wx9c8P0opF=e8)V4;hg5yVQ>d3z|&&{=6>f7jD zqTB!l@A)9jomRz<3fo`H5gxjr8ZKoy5Dqo{6NaPVHYrpt>Ytu^ihCGZYfn9emcD|z zefH)}H(xzZfKk`mT+gK}2TU|e35l7-ZK~&A$`|dvLhGt8c}>1k2fLa(ywhf<+#7()ol-5^8(B!< z#${_u&blj$AUoqCrt=0Bq_9eXA&pf4C>Y*pW1>~v9&I;yBh*<7Ez<~G6fpYC=FYZV zU&N4Dj>SH=+7>4VW?QRWJih;o))1K?Y$7~n0<89)wl@4&;6sBT$@Y@UUkQSM``cUe zEmH$@VA8JTrw|1c^KRh1_n&?^k}rm8-m`(e7W69ke(*~R^j`Of6q~|sgb`7{=3`%r zL)+^lRQ=#9YamrX;vrcH{x8V?+O@RUStw8*7qhhT#!WO@}v98%!TPk2X zoBRGjYNHkuLiS`07JESD4h?(Bh{T9fyia)7JR5<)m@UREVJwejQb#tSQxtCABpMzX z@$qlEml<+#%e0X`>oD9w&)vQa5-Z7RWA{p4{>l%H3bHmGYISz(ol68ZD4{1B?l%u; zmGM}l5Ggbvh)Oosr{s;;?%ZCdQQOvTAV@{pxKf~nE_tLe>Eu>>o6LLU@Mji=GUh5< z{<>h-Zya!_0H}v8`5&K5LtUDzL5v<6&fmn>1uI#fO0d0ivOc}M`5zs=6>$$6UBA5cp9lOtpM(toB) zdQ7dhkRKW0&ZKnmM@I760vz2??Rz8n@yL&idGmm>;Ek1V4_|hqw;9UfC5(mB)ZZe? z7lN|H^(@(`d{XDwJ$7`2E-L=_r=KnU{@#nl-;cjk{Qa4B@%Q(Ar1<+U|7P*`6Q3yl z{_OAT?}vP@na`E}aqLe@|9JY(OaFN9-<1Aw{O?Quc;=r<|9IcO@sCXFKX7a$<4;x_ zd-Iu*j6c~!>v^W#9C&Ud;}6&DzBxC-gE@QanUS+28Go{e&W~j0N5+qLHE#uu;-Tp!8!qvtI> zZ|OPz({lmv!0JfGA3a~!^L0J1`SXwH`OZkjA3fjI^Ibh3_2<8-=f6FY@kh^pN6&vp z&mZ#VpV0G9j%57N^WW3+-_!GV`19Y_^FJ8L_@n24sONvE=QOm@`aY-Ue>9TuN6-IQ z&;MA@ANJ>eqUV1)lJQ5+|4h&SOwWJLpZ~d@|K&)=A3gsoJ^w2`|9OA@H+ufJBN>16 z{O|Pq@AQ1!pZ~p{|HDYeA3gu3o_|x%AMxk^r04%KlJQ5+zoqBj()0i3&;L!&zde%i zN6-IV&;MP|f5D%BZ)EHY=e+@4B&DOd%tG)8P*Y0Or z#g3Xb^y!)ObgBCh`VY5P28@yY$3A()P^*O!6X(aFb!vVnFyHX+?1z=Y78poxVaxY` z4R=E4px=SfTE-vfD0{fZp8>MpNm# z>3R=Hk9>fZN?OLFwTwSn#$@)++W4tpMc!!L(zQU{?Xtxft7FCwZnb%#mQSGo$k0J` z9-3&9k==Sm*OSXpBWuTcST>6<>EalA&LD0iX1)1>%T-HL$90I5AsY!9n_BCxp=Eh$ zHaZz8SFRt}3>Zu?>_KWydkfVWnEiWWtznO&m%ZuJpsQ0#j@%?#Y_wsxl|^h4#cHCPkMZ!kY9N)RziKSg77f zCYp?mLNPkkG>H_|WOUhY;QFZyknY~F3Q8acP@;o}E!mAPBp&Uk8}Jf2XyoX1Zr1Wc zSRuC&=tGY)pZfYmlnGy*w1usAckAa@0IF`(U7uQ0}}9-U7# zg(__|bpTQ259&#HNNAm?*e#<;Tt<$k>&(8MD*Szi#T@WQ0m<6~& zbR&zeCK%#o9|FRjJO3VxgX^){_{)JcZKURKOLDqY>i5j2b$jC1K?At8SAG2;?@4ky zq|YeMn#d>BUhe!#mQ9^iRFlrLF(sM~FF2-o>VD%;KL%Ca=(r77_BmVWfzS{G?S?dN zBi=V`bqO`ib}Y4w!~RpEwWV0P`$(zc8#pj0f3bcEeKGsmQ{3#=MO z> zrgty)Q@3MGG;6{_JJ&JlNK-FsR+#$9>%K_wcp~00GusC~nE?m}1;PBgndZ^B^AfYrHNSDqJJ*MxK-~*fTwaP;7)fu3kY>LV9wX$^FZLva_r?s{c0FF zv~7IC>KfW)O3(QL8)TMzE2Sg$gNVz*3zP0v3aXo>lj;5n@ew=k#^lb1&}A$?;Xf>e zT@P0yNY2w2fEF$et#y0Z^vFlg=GW{Ua&m-v&E7Ap^`J1JS)H^A)JqhtH?&rgUbfHX zMiLOc^X0c35Dm-=a**TvuMHh@S)iQ|Ns2mAdQ~!J2yTMxRqEbm*B=O+@T)g^U{KYz< zmoTI`o?)JqZOYgH9tk#>;ju9v(8q(AkC1pHKNi zc^yhLpKo_&>gM;Xzd|u#XJNpRtJwi?%Z)>wS*4!Gjm z%6B$)>g?_>xq9Y=aj5PnK+?c3_JOPb7`usw5FoBu3bs+_1?*lIO4 zeL%43D|vL|>E|V>x+{tf`bX`RLKxeYJQ(JcV|BCX)pMd(zsa6dEGU6 zv$c$X_i-83*khSgC9m$amTS3qFVpiMld@r#gr+vya;U3o-P9`KIDXMoX#I+G`2jl} zfJ43Or4Uzuyn`oRX<0~sbDdXdMo7>QRT)pLp)qtHQw20XmnTTMGwcqAW#7Ql*K@El z)S&RPpTEasoWFwx0<42WSEIoR6mbB2M0OOsJZ%R_b40s{BK-CY#0^~Q^X zj}P0z9+Xw#{2V1gOXkXEfF*80*ysk2XKnIYep<_E_9H?H-)g`@=#`Ypz~ths1j5H8 z8t1?W_R1eL0^PCg(Zv1WufeAo5XWObaxk>WRksrCWzIonHmozQntg=?NYS<*(!Hkg zvte~xSIBMN;T9X@wcpDkm5jOk1pJ28p0go>t7vLG9TVoo>6o|uWzH0U_$3_$T{h0d zMJJlO4;efBC`VtsmVYQvvyp-Y?Mgzkm%#xrsL1s{Z3WU1ZW@RqHxTsCIT$#}qTR%g zS_pojkE0J2f?PFH6;BXgV6<2QD>_J+7~~ahIba|CZ2VXlqj*POBpDXR;5fl5Ju>%2 zlw83Q+qq$^w%d55XGL#GDrcYWgTX+lmi@oIQmVAsuyzFZoe8Z0~|v$WE>eWQDFUg9*HGrDe#76 z8Bj_9X{~^;=6Z}RMB(6gR-El~&UQ#EC^h7t-0=))?DI7mE=*s`ZKWRH3q6d@*tP4X zqA^Gp7%VQYi7bF`_ohY3rB`;Hxnj9Z`jthvA%-|ACZv1~SD_CFPe^AEZ{4Aww+$WT zp)=d3*(ZH|JcS`#gdvb=)7)Y6i}ks!Tg1E3(KD%M&1k@TN7mpPk>zSk0pS-f(-0pM ze%U}S3hYdYk6DSDvVSZxdXZkaF^wY`a84h7triL>%tkngbU+9?%Ly~8{&X!(Bq?GQ zoM@#5)?LxUtpjwEuH{692i&1&GR)3I%vlSM0;+z&Wv}5#5K)SezFzm`>3wTaC69`B zs|*(#!8|Uq%L&u3E;qixDs-q?#9}dl0Ht&WchB+tReE1^XJ_rz>&7CQ>9B`?t0lX` zBz#|dbG`8crVhw(A0xys@H0g1lBO?4PUi2>$|FKJ*-Ic}I~d_dyVyW6z#H^_5Wt@K zM~`r~VjD6gNKo-5#TjU{TN-33U<`hVaNC5`v&IFdDpOX?L5QdC;E$EW254FDn0#|D zsxwtZez4;DBd`vgLkx3urAm{2S0Sj=^qs2}8173U1AY#=;ft0#H}7)(`W|rT{F`&i z62gl+&u`~f8pt^`cKEqGnq`$~)VkN0W6U$SNQngscqR%x!I7P13E967(wpN{CFEEVt3-#Cphn8| z1_u_{iGf1Q0?E4_k4*aPVdYuy>yYz1Xpi1S?~r*`v7q;|ho`m|Qs$aHuPE^im_2ej zIAdX|QO<>>aGyf7?75ItBO3kV)H9C*i$UfEMW{Qf`za)v^JXb z;@aA-PeE1)5z6;(Kz_{D?7XtH-B}_zQ13R$ibQLA7V#yV3@l%pEKeNu922b2NA ztmZN_8#6jgrf-pO+8RiYTAV#CH8J_QiQg*DGd}M*QqRBI7qqK1crOSa6lON2wQ!F8 z<|_Fd7S>;qm(_6iNm2{(Rq^QZX0KEJq!2yuZQ=V~?;ciOlxFK5spZGhh@KcVt%t$= zGvM)j>G2ZBVdD&VZ}HX|#@*VIUMKl0+%tZ(mY+%U&9}F>op_kLl$Im^0nmN#T=XCS zZ~klb%>?sdp8!=&!k7Qdmjh3s`1DuokS@0Fl5-V~h!1Bx#J(g3jOSv2heOR{c-+}O zRz^wENatdj1#zO|dMOE=z22PGn}I&|cyIjBc0d#7P^_-ZBs^(7urAO+FPXZj_?eo% z-9|vj;EvoA|A}!)eZp8cqpX3YR8dbgo&HMuu3B0~Wj2Wwj4Q5u(pVdEV}%hLT%~+| zn`>UgsO8U4rua0-yS;kT+_%@xrv;mE^MwRc%ifmi%|%X7g4|zs{06_rbH4V2Asq)V z-f_uUR%gq2f=8doaJ9&f-R15>g!6nE|35;r=;r9=StI+*{=5>iM6Go~ZUwkUAaYIA zD*hyJN1WFV8Xk-2p)4UuSZ4jX=MH(q zPbxg7pE#4bO$+U|{;ua7Hz+AfyVLZ>!L-e=hUnyp6LoIBll3wpcljpfpoR-#TBb}W zdMmLJ7<|%a{PxlSn$_;>6s^T~gvv_8m4BZYA$ocB*_`f-nIAMd8EwT>&(!jhr!{@? zb@mH~2=#{&{xS(913rYYi&69hiuZnwFa51Ck zX#Jw`QqhB}=#8)NxENPrQZ!ZkqLsjCgPSTA9+$(vBv9B{Wcf^48fFs{c@?WXMC_l+ zb2b23{ZO%Y+!T~GF)v;okvSf^@=M&(mIpB{FE4(czIHdxiAe7i-_Y~zG$r%_iJ zs92wnFfUZTXKVRKL+1U|ylZ^Z>RFOB1@b5#J!p26kwsEOO6PJdf1b^9O2x1`m1V@M z`djPFtIx7#Yl$w}P%H`3gG7o|T80PPr77=uOjffFuhrVgw3e2-4nJyTET;s!L~N zIj*dR%k(eYqH3RNm))Np4mW6<14suHG$HF&a+_pIi=)E|-Mz|sj^i{;c+$At0~gnQ zmariPdt#C1f_ingsToEu4%NmfPemyf zHb~1mcyPtoagtWW>#?xtEf}^uppl0qJ*V&lEvO)1c7#O(872JZ>U#xH=zGKMFlD`dMut?V49y zl1EQ@0HFs=D0@94kbxfR|1aVT*knW})5DW&G)|Z$vbmmN6=lECzCygbNC3C-RM%wd zV5+ov4^G+Q0mPlv<@Qlt>$V(W^*Ribg*jA?rH{T zC3$Mo&8q`x@2dblHNXij6**U;;O<*Yw=rFctkw3Ng!aDv`%-QY0j4?!W;n%F@(KP(a>nJOXB z8k8<_B_Gd2B(Grilp=K|i%*Uo*AVDexPq60|BCq~@?^gU<{f zs?Y6_Pt0I31&IUTv+Tv<-{N^F8|H2ShCNTB6%S0$RKJ;9TgyhW?Acmv(p46n%yYHA zqRHndPXtT!pW4_Lshb_X@Ojn|R#{j>{Wpcp$i|HIHzf-*Kdfj9e66+HbBkDZwzA6e z{i{6ht2{q^aVw?8RW-6ofoDE;q6#NreDF7Dj-nV;P`OwezYyx8Zj!aGHa-#v<*H4q zi5g$rYTr^d&K8XZiubbY_Q$V=2WUN*BebZH8$~Z24TCkZb0kfliG52v7-bzf_8GW+ z%H8TuSrX>$js+dyQkz04%Z!v|fHw7=N?K2d?P@>Ll0zzMkWyu(i>K0%z8K^L<;KpeV6Wvsu8v>z);vDpKY zmlduDzEgfAwQ2`QVt!D1xvI;RdQa0n*f^W>8Hz84&@C#a3DtNizia@)^67I*0^3E0 z5)*W`k+jcsB`sOmP`s@w?8b{GeR+yuF;hHBg|(#v1&x+sCjG0R=Q!?9 zIZ?NAGl@VPlA%JDI6TWS$(dWA2S;pL^eT7WvA~rtJIvsO;O`tGCk1-FlwYFa65tbL z)d`e%Mj|aAuAF}u@GRk+i~$|L`NFKb<4Y*uu^-Ajf0Ml!PpiU+VPJCCqa0eHx6yb} z!|sXZ@QIt0Ea7fk`4Y^LxfoG~QIm3f6tI*f6zMFm%mG9x{M zuhDXUK$`fK+QiysXYG~NN@sg1T)#pc-xgPP!fm+dpqz)&rwY7oPNtC1$B``UY+}i; zaQg_l_6inZEg#3lKarm?J^PXY>xItN$whib)IKF&kw~N%0N<7k0Pgz$jZGlERJ@R8 zFx6_0;q%(Z_88v2ZmekRWpeeG@G48NsMTS6Yqhho$G`__UylQ0?s6-gbzk+*Og?}e zo<9LiW67;pufN6_%_U{g=Ic_;6z8zpWJhXm#8DMzC^ifvs3p+*HaH_Io-QY#0jk?L z6$jqz+*#@yw^sY>^0@PtKN#Bk?J?quaYW^`FG<4ok2_i`M^JDDko|75IE^bL>NY~G z2KZ6}%ia-Qm3==n@x{2lf|T@{=_f@~PWw_C4C!=dXTciduFyjTLB+r0eL_L!OJf;A z2ah4|xN774`%7XYs17&l)HEYsP3w8ZE`ZcL`cc}Am2JMu8sO<5TVBS+eTdt;OIj}V z(ACYoqo(p$$8nu%u|vIXEZ%%L@|A@F++V0gqi2YLt1ygRwQhh(NT?N~hg zYgRZ*3|=9V<=qI{0pvDTplu@Wh-RIwqc$R;3m*}F6GpV%+EG^bdrvZXxc2F|^)jHO zsY73e%Z?#UVOtljxw4~fUrTG9&MPh9Q{0Tv$IsWEO`t4ZuBVrkvxMhc84QqJ0ccl! zl?J}qZoLBDSVtJzRfM*UoMWIh+GJWznPBfz_x4H~ue}+!#A){2c~y)eA%M`Qdz}4E zky3_qN)X-@Zw{X35!zhrcOJACZM-;9$brlEx;ugLBrSIEtX7X}W&t}J#Burh-%9g^ z_roa}PzzYnU_xJ+lzXM!-n2suUvwK^);Xs6Iv9qmCFG3D#~L_g&r$|p>Mzv38n>U8 z!*HVXn1Wsm7gp-*b)&O{qC>~owN4Ku{`ax($1yR_^b#%hc&TTH#a( zCV6i4G0*!5M*fllS|D+i0sN2JXX3OT)+;7331sC4`l@kP&{ODc`?h-x;(!z%tZd(| z(89sm@5WL63;DgpLVO9>B76~6hbcxcQbHQU{wbKLjPuSy<`nBHu#=QNeQZcvTr@3z znG0nS^IE%0ceZXWQSP?02JBn9Fupp+|EzhdPl@?rlJKU6rlWxAaSGvRzz<%1;i3&k zFQ>5TKuvc0HtEwi9>7A6c8i{NHkF*eWY#b^M+r}5m;bAFRODn~_!RADkahjSY0BA3 zafDr22`ROZtd{IA+-q%fbGe(@yb1obU1#W?_kQ3Vs;iIdsVXYY;%=rT}JuUmQFE+43fI z4Wio{Q8D_gFuw%QI4{`Z{5Yyml~X-b8|{a0fnZ^faKtii!gO}r5Vu+=_*vfGTHmw` ze3U?r8osr?jXmOetI3|nYtIyO6>}tZ=(oLk@iqHDclF}Dr~ga4*q|?c7+CTN-$l3a zvbJpVf_2#3P`t%`eb$n5`~R+8DQ51gj*Awi4-yk#Lz0d$XB8GmS&XX+3v$}A1<+}0 zbyH1shpyrO8Efrh4QZS~%W!tBg$!GeVYDqMEYVfv7X2^Lt}3TduRUI@2fXQ#!|CKv z;$+@RJoao~+JMoKSucIF8kP1_(!0uM5$CN^befwvZ|u^h)6@0#Uc_e-GKdJ0B*&?2 z$uZc&hD24i`b6#gUO))nIx5BiU~Or1Qz-+0q^_8FZhR~)rF;sJAp3aS;o5Wki%5(h zaTjL*mYi+wTKE7u3Fo4T1G$9x8lO!or~(7kdJkwkS)=DxFN-e-HGaHra0p8qpROz= z0%32i^zJgJh&VEAAqiU~frc~8IijI|FEjjqPh2Y zFHLzt6S(b7 z>fTfPd|V!`J%77CrMa=$um-zFEM-B-4-JzR#hCnrQMI+&A`df3i&89ZruO>1hGqy3 zJPqN;Ud-USrC3rQ6FgS?i+c_33M5~bAs;KMx2rGo~f;{@b_H9@}=&b01OVZ@SSTq(U6E- zw2aZ~wS1n;Ei;ckXiPTX_4{gT0!RGzs58f-{;gYA!4aY2zY_g@q?Uht0seqZLwIKbR($*J=|Nl3$k_0*LU?ilRGq=a-LHIL9DPL0{kt!u6yyOE=uU z9a{I~3O-1)T9V_Fq_o|owf08rWd737c~3^}5P;RoM`+f49nPg@!xavLr}#R->I1D> z*4p>r$16k7s`13d*4>MC=fOO7Qn!}H-DD>hw&8#mI=5sS@m6|tAUk1?EN z+gAD_NZEs7ce{Jfe%Jysa$f$Z7Vw*UFW`jZSG+{2ZxywJ=&0?jT0Ws5%5T^5Pf2i~ zwiAOpA8uYc!;_QeP=(rC9zs(L?O1+RADT$EIgrna{cdcBYFbl15pT*6t>0MPHnkW_ z0L@pT8rw9n`R)UXDgO3gx<&TPl=o5_KX>M8{<$1hd^j!aci8$hIa0N>1-pS|u0$Wt z#|?0Ci7&s9Qr*u{VI}b)F4bN+9bG;rnPztO9QixCQ_KRWxWv2Ps^!g#JM@A-<34hD zJx)OYhg7C!8({MHB?ThdTc68wEjG)3N0R6hwd@l^CDEiOD4p!t#Mq(v*6v!TwUU3b zHhq-{Q}Iu3EjUE|n;w3W)YtGJ%TFdQgD+sEefJO0y+5cvE4okHUH4pO0EkRO`a{Xi z_*8(iU$g9!Ll0wq5MV*6?Dv2pfEFlsPLR2>x_zg;JUgo^Zb&x2(7iDO=KUU!c*of9 z*RtQQjZgY32kngsy?}(s{$S|Lz1v{U$n*bjC}58l;6QF1E^V=voj;JD>ux>$%rnQH zB^$oj{O5FBe^kr8UmmlXu4kxPk<66FH>2^wyNl0~-E|9C6+b7R~QYUO> ziUOJ*`%fU2U}vYnuXB8e#FFX8%V&yhaH`akboT}BKOVXR&jlQ`IN!?{S1VZCkxkI% zPt>L$5(Wvc_=NSdZ9{h{qb6E+uD?VpPVf2d?e{GElc5W_kUl5|_9Yw^f^W4bwEyIR ze2gaP+%09n11GZMdF>p8sUEsQ?LVb-_H_8W-X*BFWp?*Ul)G|3h)*t&-+udeJ|Ws> z00qD+zsx8n1M9&$G^FFCY$m%Kb4MlX zggJ>{ML>|-xAh8n*_X2HuYg0SUj!#e$g=A^y3_GDnC8^;Uf&2i;KGyqL~TK*{X2O+ zDF&e=n7_I2LH?G@rZmdm)rwL6wl>yG$14r9bg~yN2jA&A0v!Q-HHa|(*0R5^Br*R(e-iUQ@FJ$cKimi6MX?YN zPn#_DB+9;dA43)A+cU^NY5o6F%l>635??UPsq*a%H=j z;9FY3ztysT8@_@;8VNG##B$`^#^%1Qo<;E&XMu-;!*?RDdWZ8V2_VyMy8m9w-_&tV z_0BR~4>S|Bi_*UnbJSfw-`)e+dKLum6WjQA?fZMRj6YoP^dGf9sQqCr`;VbOIMus6 z&fuUeu$KL>mao`fd*5+;IXiUT?*!#qq|tmW{A1v|VCWBrE@6*3@`LHD(R56Sz#v^{ z2uC@I;0W6I$daiU|%k>S zEmz>e46EK1#LfrBO7ywszm?ap7C?bHBWIv%4k2zaet+=DFO)T=B@gio%&R=0@O+q2 z@wFHyQJ%Vz4y;Xi^g71+y}I{6u{q?u$Mo?$!NvvO1I7Bf#P(G)i1rP{5n{EL4ecEZ zJfvf=(qRgG7TJg{WduL{O=CVtgtC3rIOpqdCx|XMR*`5gO4Y`{Kd-yAY-q=k)X^ul zx&iB$BQQ$R>3uBE@@RbbLwL4Z8}Hr@Ss#E)tuDG9QtxDB15ZmiRy>BVV!9+sp`P3A z6ZpW@DuQIqtwy7#}{E?q5n|Yhh10X zlW5odpR{s2$VieF81wrhbP3*_u(-(RwS>YL6N%w^cNBUv@}-1|40ZUjc%)Z zG57uPl})?bHXn)*0_85Wp|uJhV82df6x|5;Jd75P@&X#)}OewgQ=3ouiiDX^l5YM@z$@h_F?ng?e*3whw-rcpn-;% ze&1osdD5VVaJs~KnixKe32qu#pz3N+c;|AEp}1_PixbaeTLP4TZ5Quo$e2fs&am3P zlg?rXuflrk*D)-&cN^OvanM=RVUSEPwNwIwOdt&qcUHH892qEq#~y&{@L=5Hj|^1= z2b?HAxJl>UF|e8+3jJ1wcslaqL5#YCvd`*>B90`2VIIuv(Y>|I>5@q8_nIH~bHkZ} z)=Y@)AX)L-o!-#I__O(W8o_}(k>$X?gd@tuuw-et3jrmV5VyU62^2d@kRkhpc%7YF zRDL4o5^uYbhqQ9#mhr&VCf7H@6TfE)WJNTVJ7>C{6*6?9-s63GKI;QWBpEL+!?f&3NGkp!2SaKj!bp*><&e)8 z-6|`Ur@`T4DHhQkJarKkBAp64PPv1Y&ZN9bW6@=0kMnCKRW>9xdhU$FJ*;+GCmC{G zP@L#sURg+7ruyEgC*mqGlWtu(;|NJfK+Bp{a}LYfil^w1NXdmq`^GJAusXJo5dc{# zV@#m4-@;T4E}L2;O+4mM!%wBWl-nWcb;Co_xscSt?NTz)n*4lL0n9K7eqjRwEINwy z*zyc9A1ngUhT0-u+O*;DqV=^2Ep=JNxG}>Lw{yS`9MzAF=Eu)L z0jK>`F;@?e$(C?&XM-D@kn*T68beZrjBfIb{dMV|)yi-PICgR3iSI#ul33xV6Xn1w zY{_91B$o!ZMWRo?ZX0GcX`MPcJFwd@Ka%Lm$6>4BI8Hft)U`z$mTo-2=A2ecI;4w6 zvYgRxF=;aVIC4n+zR@ZWdVT=~xoxYrZlO2(k~IlTPf&m(3h=$v&71MA?0J6Mg-tZYCpgYbADW>YK0mqUk?fGaDSg@~y$H zIRJJ>CjG!0t$$$v@a*LX=d>MZ@x!4v_?sUk_%x$&fPfDV41CV~l)trBDSaST7>;Tn z3(Sw}Kx3UmM9+unfi-|b3@BYcVx3;^g)%)byyym&=wG;f9N44bSmcn8<<25Gp(umFEb3SrE5(upaK8R_)9G1h#r+Q(WBy0 zPks+PF$2gTuD2Wdt2HHEE(4#y7p{8oN%sO7#?2#xPWpI-$prRc2ja)+NP-gIFKP!X zXV$wWDm#(+pOT_h)>OiSchpPI34Fq(@{yzHg|J~>C3d{Uq_+?GAD_>Ny~`+KH802 z4ZsmvZIoorzJxSxbaUBk_8JyLK>FGGTm^nKEsse5S>7s$VUHJ)*>iF-Teef| zCj`$ipaH#-M0OpBDDDh^TUg{gE6cEBeBA)wdyIB^b)1`af>4t&Jj<(J zG~Zf)eJlv;?jPkIK71uFT}+Wq)EWhfara_jKn^%E_>PKHwprjB5VMTS?w8EVTR{QU zjk>ptTOy?EP%>aObk&o(TRka5@zN1}tnY|=-^f0{-=k?*mXFhH1fkX)2)LGC2>F@5 z4-xe0M#&!fxkJyE>6NrA_Y<0PelYQtO<$pTVmCH+6%t=%s{$42*`sM2GgkM$0m)h&}z1J-)ZoBP9p+IX-G9T;<%^ z(1i!T(I)EqU|e+X8a=pI1D3QR>d*=Eq7C*hjWEC_mmj9$d$dOD-e&w{EI%%PuQdUn zKlRNg@#a3?xqC8%!{_xI*)bBRhKUi3jg_Yzo6CBtLL;GjqBm zt-EczQfkhzy=j500+UEvODP$=5B2Ecsj|BzOZ;3iQHt1TZQsU_km}|o%ab`t5Np!( zF5gtrQ#l(jdJ40XuldbUVq#!95g~N+PzI)qCfE$=r#K5fq>!VVs>nPVD`BFNMrl^Q z2|V|vhBh~1i{>1nhRoY$qo`Xr5DnfN9B?&;M7H|_XVvk)={yhKC4 z+!V@=*t{+?r{kXYM?<8BX;?7h6|e|nM(u-}!2}oa)i_8TBXM4y8I&bG9SDz@YmqgB zsK&sf&S9!nVA!t`r!$5fY;6Y!Jq;XIjqK1_UG&|Z{Z|%vzSImooD~Bn&zoOaK<7B! zqi$(LW-n_hV z#wr3Y>saT7MJvr0%h;q2BcK$eH}{Q9`AJIF!&OQ`i4Ql+1DDXWd3|buHkCBs9*o9E zTm^Hj%aoAT8x|x3(3qh5O7^+tu#<6AbG@XBZa+h^pA;l}Fk<_e(TSH+#%1iArUdHF z#!0D0UA!dfBe>Pt>f@S+v5vgQ;CMb}Inj{|<}}2&(m>6$x zHXumA9odP*r&VFNHzz>5Y^q$eL4xHXLrm@^%o%ICvz#uZSVo~kqVzPMm1{k6pE6Lk z<%C99FbFFw_HQTOIL4HPcyeo7@1+ifl0_Q2?^E;bvne{!d32M{-Z0T7l(Mj$F2PY3 zeqxpEAv#OSRvlQO)|J`gGI=p=b>JZr)B^LWD<-5%$b0v+hC( z&yq}D;fe<)uvv;;vGI$3qhEsQ&MQO22;J7kd}rfm&{7lsX-srqZEaGjUfD&s5UphKkIc{>kT>B7YAMzx z#Jpx#Y^IS+DTI`9_bA;fLW^s%&^Y;}m>fE(jM2z)JK&%U#s%NkelvB+MgP?jO@~gg zMko{YSxYeYQKVogsGG(k!&f+awV~)!^tai~^h@UPEk>66N<1eqjqs&SuH3WDY3QM~ z;v4~ZDfsF!ZnAjz689O)jE??@oYof_t49NDI#*@Ue$8f8K$=wK26@7p@=6odg{K)o z5LB02__;g|8k`_3f;Qhrd7Vo*$jjnx(^Vab!oY0N-8N68Gkc;@KS$L(K5xUf)vagp zkc2A)R#TD?7{DoQXUqTXz8i=MsQoww9aj(hoq3u{H%ae=ygkMhfF$^%M2OEK?VCp( z0j8Yc#pOl>zy+6OZH}WsXa2Jdz0*mS1sG!TnL96IiZcjOp4!l=QaX^Gsf1 z@qPh=A-5olH4s%8wrCg<0>+ZD%DLqhdLUMW4;tAUrwvG)lf{$}FiE{A@jQV{D@kx_ z910>Q8$I*dRo8_$ym`}G6c4c1OUXUD&#ua5gK24Ml+K;LG4XTu!fFQUJb@^qrsHH* z{m}%Sdag4}0!S5Qdn9{+OEbQ$cnm$Gp&HAY8-zrS`Za^4pdv2{DS{@QDf#bGl!6C9W>gUhOhXIrCdxB|T|O+%O5N&W?U+_!Z8 z496R^a7c9m#|B{|^2P@f;6n!=&Pmw@)%HVuqB0m$8Ft2>J}wg2lh}0mtB9&XPlfPE zB$Om&`Xw#Q1w?@gU^Gqmo!T3Vu>irdbOSC8NVF75**gQwop(%c7ljU`iNa{<;wvN4 zS61Ot9a4Ceq(hpkop~I*X-x_7D+QXuErOO~&9X!rF;7(A@b7DR@tR*a>JC`APT(2# zoW#=bfe8~=Gfb@5f`SMK!j{e2Ubz;7-C_OCL3zH_4$ZhyXil=p1}VM{!w2V=P2;P* zUI>QtjVy~-$$TZ%76&syDl+#2+g5(JP!sn?3pH=P^TG6$!7Z}Z)$a9N>`pTknvp4U zk5%E;HPD%WA7!K-L#ULM> z_*kqDO31IUVK@Q3|D#^~gK=d%JKU9V(3<4-IWWejVO6+&P2)V+SA~;L+Jmh=BWiMp zKX`^LFPcIx-9YlwN$AuCX~XmOTksgiH$s1y{x`CTi~0XiVix4xA!tbQZYua`+H#c9 z)k!72JnQ<|+^T)T;$+v}K>gGR>3VvkMAz&9`8}AyQySBfeQ^kW zGbQBs&`axSzvf`qx*FNn{K%7K>e&E3W!OtePqO<%A5h5kx#9F5?TG#|&+%!=&R|N6 z(N$%~m83TZUGiVd9b8O7Ajy_6d@4s09LhiU{t-7 z2PP9ZnUy<)wc?dq;|nZMKK z&eP{LF<2Lr82l3qD5b;<8GKvZljA5NKUY}O`7_v0T9fuDrlp;%5;sFKt#5L%1wY$* z{IJ()FeLSJ3RKz*NmDm=kBCvYqavD#7iBzE4nECp=oT?5ykfY-8PPDbzJTFOGgRFI zE&S5Z*aiePw{N3+!2v<*X27A-iq$DW*&>$(CZ);jrz$R2<|ieLYHe*U%x;X?;q-9c zy3y^dk&Q5D09(tnC!2v(j?+g|;x^hl+FD~ya7Y-OmZe_?4eDAjw~qg4S7p$0{U$BR z{~1By$8EV#U}q4*$K}CF3AkS@6A>TPW>JScKT&bDW2@=h>p|?UdnpTq@OZ(*cnmb)m&3; zl6;Yvv|t!_)s!5?(uIpEAl$};`9sVIfkQb@!P}&}VsEX4YjX;84337z6l0;&p#rtX z2b_VoWbHeJqS?}w(bStKLCT_IB!rAz$;tf-qiY*z@xlZc;F?*N;JjIrmT#(>XRD@; z*%KZpqjnD^mrv8$uW&UUz3-E!`gyqo$?~U2d92NH2Iwf19-e!)1(%bKs%+mn{)(0=&YSB*s&BIP5ZuEv# zBJn1yOt0%kr1nx7&Nhf={=A>G6&qqfE`1f3GvDMnC~n?^#}Xgnr)>k6$WL?!wXrG`Nw z-!|}9hLpV|9j7trRwz}vHdu*3Mh^b-9390Kr;v@a%a#m{(m43zq@r-TPMe8d8}G`` zpuT7wZM)49V8BK!_+giN0w0F*V2D(IrF`jiFfEuF=om6z?j7y#+FsuK)$fikW-CRI6RfQ}o3ERIb)clo{-c zDksw}^a;8{>yB#Tp=b}3qRvjVX#(<7B3MVqzkZh0Mm#H|o6FLwl2hQxe$*WEyK~)r zCw3bz#cJ~jJt(y!duaSkbHt-NZH8c<-Z0^%o5;xhF-e~YBOx<%*2s?LJq+GcX%u+@ zKOtnHoHG+Uu=KT~uaSBjx-p@={YY1(MZaTwd!8pYp5cqR#G04duU-`wZDw!WV-fa| z5NQK1m+qQ!_KTL8q_uog5nd&dF13f)L-3D{x5|Rwloy1O68fWzgdFdw3LnbBi;E_;O7alKI4ga8k zQQD%2|4^H(_+|XkpGKy4+{rv!54N7I|8xL`if>jol+$b5MRoAIj*8-5TX2Gqg&KF- zOD%3+n~-C!rwhk{iB!{%B(V#jD)BL5|5Wqyh8=n{v()~KzI|76fTsgXP%%#x zpyUji%JR6mOQNT(k-~7VJi{mKs9=sNZN}BQWWIlFyS-)=8wD?~j^CK}++rS__o}aQ1a0=&xSl2U$ToC zvIAGzT)d`hKCPWb#rT2ea|tW(Mm2+P<76wR<-aRGTHxyJf~}*phF~u< z-UIU9T!*6{XpLt4$!cTm(bdtcJvvUCbVW6mZWv}#b?czUFO3V4W^3&eRg^<4O`Km@ zYg3OhF|SLL=>ERg>b{}|;FJ1`8f|bR#pw86MNwxQy3{Jg31`Zf%mTB>p0jlg<%_hC z4-NTN+uUfy?a5Nx`eK`tFPd)CkqeF6$kU6poO0>i8| zzja#rQMj-?)v0npe3-S7J(3HFdjo@pOB}6ClVnK_znA=!mbwam49mnZGwD^XJEQr@ zi*Ytz7d2j(q-&O^%k^DY39;mR2Dzl}6-(P3z%JEQ=}Vo6RqQN&MLW_|hRA6n$$jar zs;1A5UHj%ew}|}*V4#i6v15?K%rb*EG6{P<@&|Tm(DKEU45y3{?h5Qmln@| z@a#gvpe2?fVW8q5c@(zVc8MpW%Q-^*IlWZ2r{BD`DI<4>*iN^rxM17vvH}mBMVDvP zl~61KgeIF*>}bx8Y$_#6D-etu@FYjr&+gtYloa3 zs80E?^4P%9!sdXCvB8j-(5#$pvrtN^M_7QeeRmn7`L$*b_9$nDl2>ie_N3i;7#8MS z#wc@#uM^}1U@f_>K|LuY$$SqX|==m5U+a9FiwGjwpVsY zVB2eg#eCpL-ap#f5OUTLh3GmgaSv z<6=(c5G5}Fn^9j?VD%T8EHGAXE|z3VsIKdaJ>T) z59b$+Lpn>N*MiIP&SqVsC?uz=hLIBN$3upe{iW!=1?L;YRGUI1t(Edpw?vfKj?Ou4WG#G4Crtz2iv5ibVIuK|!%Kd=tk$euO z=u{KJ9HlX$^EJdMQRo%x71*1;UTwpir$3RvUql@PYATJgws$TR>4D~d86=x)wXZCA zatOXs?*nHqM-T-G>8A<>#&*b>3AD2GhOvAm{#DfQn{+S(tL#z8qB@bD8yNfF7(M(| zy!gvXnSt3#s}!G$U)eumFW_P+F&G6I7`mdoOSFQmIx%4^wj;w>BQ`KiOd+7Bc=C2f zkz!beY5w7X+sfB);Z$`4OWi6(c@B1Enc8k zjkyNjKhRC*q2m&pc|dyqM=Gu!aCdCt66Y!fegUsSE!)8$z!kN#FFm_YDWyVwqQsT+ z2{nofEIQlW*O*X3gr^?!4 zYNLO(y?dd(A$Q$kXF*;LAbaQn?hGE(vfm!fSBg7C>^i3O4T3GhF`?)BH#Z4l=GdfO2j@fi~m)HBOqZ1RVhUd(l5foTiyUi$h1Gmw zTey#b^2Vp0GTDR&JyhaY$_EOQEQMJLFJLyt;t>)(a6nY`4nSiM;V13h;Zc|XL`Tms25 z;VqhAg~n*nWbsG^=~+A=v0o7|nBSMp$tjb^KJvmsMG&wd&=RW)Y-C3iTuhG0iy=XY zd=3lHqabKF1>0S#EbT?p7Z%Qor!RWFuRw$M%DBiB_xJ!P#x`kQ9tA(Y^4_OG2)pFkTHpp8 z@er^7Lu=%#cmy#IDd?u2>*v~YcwgerH^%;Mw{O>l1gHUyg|@IjA(qV6gM2=}c4`MQmlB^D`c$Jc|IMY_mO41+mvm&~28sC_XQk+0xZ;V*!5 z%eqqY6l2nO()8W(YtSq%V|70dplDi$gX{+E!tUmYZMm0cct+A6=wlRM!^b2stnBU<*M6ZvgT9>6v^&%5-&QNV`dC2^Gn|F*xBD_qod<5$5+tTp)jl5 zsM%cz<4=o+3_olsx+xt78fy|dFYle=qqbEA2P~l~I9~~$D#dDs5tU}%)o);DcDHYB z6F7MM{*S=&?)9uTJq+6$Tb4~%(x9K0lewgmG7$}vs`%9MUAL>m<+#%d(7WoqHb@j7 z4tyUy!f^4Kc%gNRT@8(Oja(00V0P#xp^aWNg%j7trrQO=m8KpPi(|cM>l6@rzaVNd zT9`!uv>+5RDW|WL2Gqs+qzgBRF*~s=C*3N)>h@`u$bdJpQzKk(xk1TwZ~q(a=SS5w z1!|$!@3)=WIOcpRY^LAD``^BI>#81R`(#t`PSjF?hfOh2BzwMpQ*smcA_+QVOYXn{ zbXLZFVL!?r2zs6YoF@T(x>@_cVfy=EN&S+$wIdpMqP6!wCYI#J<)&RZUNdteNx@v!dq%Q1A`YjMHw zaJ9J)Jwqv8gBlOcxyo^pH}F1?O&huZbuyn8Q^1;vNlHmLje6_W16{Dw8UG)u3;u1B zO3#WR$U(5<`<<@r3A3uW*UlBi{BmGROjTx}ES^g0?Va5w>{pD5*u!dp}sM&~tBr=fTqhJP%6K1U3-w zL~L!X=`&!X4_<@9w$^Zp9KgOV#CakvRiGo=-TbThFE}TJec9I^-7ouE=@?k2@tLNo zwiH8t0SDS#rA3B8ZsI7c@Z3`1A*9UuGEnVoiAs**_!094Pyt5r?Q%uAcy6S!nPs`o zrn1@$65D+lV>^aeGt1KHn_!IXnDG{6BJH(ZYVKKp^)hE4v!zKD17?+OnOlU}V|n%_ zm|%m!KuqA)va?*~mvK!dSS{mCGQ5UEB+!lFdM(BGZ+I2Hl27?BKmhAIL=xis+Sh2V&$sBkG^{TvuG&v=u zmJK0ev%>Mt0(bH2R%>q*`0Gv_j@jEnHb7csyEAS%i!+>@A8Y~d=ww5&uNXHC3wE0p z47RDAxcreW)^gQSlCR=Qh)*dIoJ@Xu@?fR@f#>g=-&fH^5(ZWADe^ueib*@otiHxks=LzIYymRKgAU;wQl zd@{Hr;b_8wAegoxP5b092c3qQJ)oqL0xsc&j$Vz18epvCm1Gs2sZF)e93tk_aF}34>8WxAWZx# zyD}qCvxAgJ#1N2%V23WPi>treW<2GLg9i+OkHzW zhmS%H5UV}GuF3s2pyM^7`z?1W`S+Bo#*8ptN76|K(*2QJzxLhxTBqevd}csm7ArB` zgh`ZDaX2?_a0dVv9c23H7MS09gU{KxXSzbdVnwQT0x9K+-@%4L^Z+K7C$5&oYKCPS zY&p-NPj_}Rs5DG2?n2Mys1mP;)H|duvzB>im{*k78hVK%RUV4*K+TtANhcFW!zv^4m!=v z-U%;&4IV4h;DV?UN3v7?K*_~IGlAXKuI{*+Sg0K4x0Yy9X$^0pY2rg3d+(wvg5j?E z|I2$A2LwB!C92a4o114WKWtU$MHEFrnEUkc<0xn{ELQ1**N(5vJV~!gn4LP$DQBa_ zxH;Fj+Fe|_*U@I+oTk7E??#gXvw7%|w5-XZQ6B!gixhb```0VwId>;H8*(`~mZxS) z)9c;TH%^kcn$XP@^+ct4j!3&b7Xp6l~IiRgPwlPKJNYOH5?64!kE zXxvujg7clcO1UWzIQelRZiha3H2P%P(@dsy*MfHDUi1-k3qsgQ^r@q*>xs^LqP0{?9t!+#Cc%!%=mqxwS(Y$1`w4+qKP0*y(%@I#wcD zT5JA{jeF-)QG5z#@m22@Z>b!@3(^_gT~)}(I)#e-!;$EMdiLECDOi(JI<`Puf$KYU zD2{Jfh?X)9&roq5>OB@uxk?Abn1)fhX4BKrXf$KROWYPk$D+AK+^boEdywF(AFrGj z$6jwV^Jn=x(adE_qh@ui2SC`M^Shwc2k7%>G2>uuESk--Kq+key)q*ymA^sYx%wuP z^04ZFC#*TEp6dmjhoTF<`z!>K{>pW7=url(tQ#_aH<~+p7d8}MTbnq++masok3&T~ zOY7Es4}LFt<-8TKXxIF#16Da;dqRo5-hJq~LdED*7$e}913EwK7Caoy8p>I6^)-wA zk&7IBN zRx}=+yi#i$z%L;cqmVLUbxLR`N2nf&W@xy8LKVjP?tn&r7){&dv;Lw#(l4~d9!dsb z#0i-8Tc{FyaO(uA+)&{rk-tZeMyIX>_i0aY2_5N22KL#+{}3%*?YO4#y zbZ&S1X8k&u4BLBA^o4#Mb-pPmsEOhQZIWg5?phR;7OtyK_&T&Xo0=zzzSytd+|Y5M z%aq z#)+eeg=Vv|2fwovPri3|{!dGD*Wi%c)A=NNot?AC^VcBYlh*jjcO}s`;*vdn@?F;; z$nN<&;kt;)u;=f5>KgR4NaD%sxh)xv=rW3q6qrmQ`fAGkWH^Un@i|i0@P5Kp-0H`~ zoJ=)6pfW%wiM|Fq=VNN7A(}HKyAV+Ip=i>BoDvky6S7llo;VSp@JPg$*+jix@6C?# zbtcSq>z|}h{N~Z~Rs%+q zBmwm_w?{M*IWXa?bIRbwQLLQ9#kW>nX#^I?Ha{ATPSPk43hC3K?@M7SXRNG_P;&G; z(F!C=I+%-AILa3tOji#?|6A|CGF@7(a zz3Re|44p;AXggW%m*_B4)Y)JY8?)CU> z*6|6CL>I1ZLs!AVRq$_sia(5&GAR7AG(uvgXVa*~KZ+(#SDIv@Y(^8&1=p6LmC41g z;L#}hRtnuY?y)%W9E|Mk8X$7&N(iO*86AL#SKvnv< z-w-|R3S(%WSok>qT)NR8H~#>Hul}?6nE`&#Z-Cy09c;=lStP1S{xCg}9Epw#AW84| z%U6>|xOL#33i9QT!9hPj7IlJ6Htl zo?cD_{D*s$0DF2fwy>ug<6cn%>@NV`BBJ>C@Sz02%w7Z;@Ivm2o;1+-_a*%Oy$>p$!8rdvg|3W8PNEpSYF|eEKS#^1&%l9_ zO0T^O`~SA#c>bdDc3Tf;#Ql|`8ABDzklI?i5YKEis=J%D)ot|0P;>*Q0x>{qMyeM;A=S&$o`I zqLYXiF#S|m3+M1paq0i|>FT1#r8Uwe^z8UpJh@$?tVHwHzr<6|xxXY3&tyzQ1F>}v z?)b0K6ombj0SLuoD$>1n-$vz>qfM>Z1MGhi&A@UU^!)_M6mQnrJzq~7qhE79NMIN= zfpM#Z-1Gf$p(nVNR@-$k=<|sIvwyp3W+Y);1R6;z|Gs*AHCWFA{{C-K3H8lN1DA}v zTs-4dHufrdBAQv)MD-C)uxGMm9W$i{tEtROme@NPjZ-(8i)XFM`)b2dr3}8A?})hf zUIX*aj9}2Mf%$nq4b0EQ-2UQd^oxEy^lD&6<1P)%FS|7`zwFo1y=zK-)lXCMtA2fV zYf2{mEj1<4Z&D#4qY9bmQH69P>Nx6Eg$%^72dP3R)**D-662Lb4-LnEoylA3-s#m$ z3CTOtlwu;${9>J=7}P%x`j|dQ8;FUAv$~d}!#$a3kD?$#+|objT1JPX(cu80UAmUf zzBRg*S&*99nY@~1CHzLbf1qKx9}UYXN7db?D#9!J!)V@t4}0qLPk$86J_qT(SZ`VS zdnr}CF6KPeGYYLbz1E}AvS%n?R5qtn+4did$AHo~J=}kc<}cUKl5RAbPHPlRMib99 z7Ac((y)Bv+-e%;BwRZHM91(M${bwf8SeDh?sxHA~pptUkpsjk$XpT4gn3C$h^j9AJ zaew7ehasElD32cRuRQv%(V|zT!2_+|a)yLIiMW#YnjQGz;l$DdKRVpW5B%`3w_d-K z00mum6SSgGJTS-jJTe@=nn41)^O?)96C>|2?#Nk|=x|?*=h&oi*rb#>ipLF+_-RCs z-1C}yGa^3ljQbgJ*&#FE)9Dk&D@d49WBe(u&ex(W5rL@5J z_$eu$AA1uP_;?Pl{zDI1{RhLU$J6D%VTI%qX;*z@_6YNNhNtY|X!=`_`lg4Ao=ow7 zhC?|(b=gfMQ`P0uND{rO%cuJd(bKNjtGeuAYMvSHr@G8|+$E6*>!E0NK`K!1i8m%I z)#18xrR#h*sD_{EH~V|ki@rNO&BN(MJGcy5y)ZmBgHh@x-UCW}R=7QvSCO6_9;_lg ztBZMlI6B|c$DvfE7r|;Kfb8c2lWDY%f;7|WUUj3D;lt}jcTrn;={GPI`=~`TlgepC z$=O#5pTm6Z?+=sh#MC#ruT8F77=EAx-Fz!OU>=TR93z|uOnPv6=a(efyC((c2g&ed zuphiwvbxXQ5g(xU?CIzbKr%qx+1r&goml|94<%<$r$N7&TVxL$@2A`B>GBXuK1ik6 z|MY@NvwOt;+RUrN@wlC7mru#NyRx|*N|DK>-bay{e|s23X7(7p4l{QG|Caj8%-p(F zmzh^RTFbuJ__s)5*&n8Un-rG)XLt_^%SRz)htOC)77tWe_QkC|=%AmvGIQNhO=S+G z`)esPpLqpk?xTUq$;@|7FPZynkWMo5l~+gRK6@)wk-351pc-QSh3{aWZ&JiZJr&AJvuFAwM@*XmGSTGxjA zcxhc5(EV?h`mxf(fbXk@%pldbPy<1`ERdhrw&#aG*{4%Ej5Bj5(<|o9rteV#DT7E5ye4rNA0D%)!w;A6InFKG8j& z)BAm*dtTcoy659T8`3|z=aa(+M)!PDm*i8!(Wla$a_WqHxYC2@o{W#!f!YipEoYx} zDLQ(6vW)@!=t0h1ibuYm=$_9EKZx!L2J4FtqI>$s5Sdcp5RloeOnDI9Gr${l(1!lD zNB2Oi4vy~W+vqTQnI4SzTN2Atr?*Ju56fp&IzTz_F7bHW!ycfU9seKGwuM|U51 zT;nR|FH5(LEN5TnvDh7CW9aG4u4+#=MwH)5k89}i1CQ&0K78EB#K8c+pH-rN--o*AG0do4*Af*RS>HL-XD;ukXX&zApCmtHaS(d-^yOn~STA*MW?uVSo(F{se(-^}Ox9{-q#-oU!}j z)*f{5z+2|t1NU+W@h$R}`Py)CIpb@+>e59vnm#sazM?41G;QUq1&oq|S1HP)xL69g zWr%UGIH!=X99!*DCP|A=Pec9@!X%Z7*gr@j>f0{*z?@nqoeW;+Uw4MvQ|U{y=_PQggR9;U1a}SE)`&+R?04c2;*P zHwpio59#q-(Brp;<0T*U>daJ^Zk${pP=%bUH)}+oS8I2R@zgRuEFluXX77%*R1$lu zIQdO-p;{?mY67ZSkCo8$BdB8Z7KwZ<)vYBEC6oL*32#)vr>R8G91z8;mwYPERi$`w z;hLl$I@~minnG@ZJ}9{uPp+IeVR?1(F`yZb{JFa>P?V)mH9Z|X)RQlhj&FrZ^^K-- zXZyKpF|}s1(Ii`_uWip8W}%Q4_JTCd>;!pfwkq37=RS0}Wf{$HiO)0YzH!Ob-BBoOsc-5NxB3mH zL^qjuZc}x_a>{D!d?$90b(d4zV2B*t{$Tg%O($4yld$M!c~tW=Xz@MT-^xDj5=pyG zeSX>glXID0v*EhFE6et@Ag-@&lKn ze>qL=pN*|b^A<;-)KhoKZKl&uB}`Y&m2AV8rrj$38yVH>H#gd@*u(Mio0FgQTf<|U zJB`g-m1?8CN>Eh0zE$In`jo{jvP)7`OGV~hTDW;rwb$FVi!NJ~yQoo|j9uL#1KoFU z4&jgIb@#yx{O>!5?K=BioD@}shwOPn@r3?zef|CL*rLZW4reNMzX!#PO_1}A7lqiR z%3f76m>>Dt9Uhq}B`BDss1Cjl6M3$Fw^qGsN!*GL#V#A-CW){>ESv<_(JJhzwN7~3 zQbCojS2mT^%}QVhG+l0Zn^`%U`{O?*{aiTDi6=P0Cy!6;?o{u4W^wUoeAT|Uq{46N zyp$pMHZk!B?buN9@f785lK`DO_`*VO=3L$!i2nZY*j#I8wbCR9FUimA>oYfW#H%|E z@Idys6GA9``o13wkIj1Ux?Zc@*z1L?3r)+9vPv3)`fVR_T!@#lKUYD)jT=84jz1co zZrnZTG6}sv!u9Q&%X)K??0W0Bp4;8JUTdCfG$C*^C8)z`4S2pfbF%aIF_5!QElE1b zWwO%N*Pj&~xe5I3HfuA_&H%zEZ`JlzEn$Ki`89%8=;P07dzbEP*P1paPI99ho3cuj zZo?TgOW7H}gV5RQwT;Sc621C_`AQexfP{#u0Q~hEdjh$C$$ljw1S(U72uo9ES0lXy zOsZs)YHieaT+{yrT_Te{bp>dpDn%q-6!oRtfYRn#5rpeh;)5_yfk>I}tg^LhuwGjX zB+eZHgkz`AVXRUh)5z5S4yO`N{U3NL(L?b{t`3!}00aZEF8;8p5~g-S20Hb&c(0me ztr7K9((}gl=H4UmbzPHEWfwpU{Ea#&@x^oiIHRv?F9=ouKe7}$4uu^2j<4BxB(C2u zc+2*t5q)w^^%meNJmOP>(99KwXVu*SNKcAW->%(Ry;&nkd%cy!C#yB8?!uj}+8C`O zgr@t3M?=MH+&{i8oj!Z^+{;GYtztmw`W_`1jBkO|(6MjeyH|;JN=xJhSSz`K#1=8p z$s4;u2Ic50M90@C(c05o?66}?=xr00uw8ocP2wAVI9yl)%ZgdC<*XXsT7ZyVjY^g!fABx$eh%&$d(f=3*C0&0M{j~3TGM!I%dQN6nGSC+$&0@n+8x4x zX^{&RF)U%1x;pt+l^O|4or$x z1MAZD<&*1I%Nu<*cO9&=y}Ofi?`$$UVDsz)(Tbge_wLo+0jcv-t5jEacWyQ-%Jh^! z(4pjQ@X_|lADL@knr>`AQAJI_wg@I{VaK&)6+@dfYF2Gpv7GenhkD1huU4xtKYa&3 zlKjhJcsICT8x%c2?|fdd5lw`(K~xvm0{FWYY0AM5AC2#d3B~+%;slBTK1-7*Tk2er z02TlG3j7yS(Uh&qu&)s&cyJPpmRpXVk5_U}+_`&*HA%n#N}qWQ6Tn#zTeCF724wJU zpzj;?n~<&QXIql8*4%?K;&o?LUNpDb32Ws|TR5gYvbfY+8><_XOIT$ND#Jhye^+}U zdu<`wzH~zNX|DJ}aZsrS|Keydj^WYQ$po*`P3hq5mLEA3l5>TWV66QGOUEuplwZ`< z=09Vf(K4yF7L^5+ARgHXeb1UoI-EFROA_8#r4lw7=-lGgj9G?rrexENhF3FO-}_MZ zBT8vfFe3lin?&M&v%maK+7}RRFJ2srXFb|n-QX_%Fo{b`{JU6bSCCmeJwc%W?@+D% zAW7*7k1SVUJf)6JbT7qL&ey7VMDfVjjF-^_5Ix9!yr{>CE9bEr#~%>~ofJRL8Q9M+**5@eKcd2U6mCGF|9lC>d7%uIu zG`+?MYsUpIT7funeOP34romqn3ogWCcQzUWr*Zg`K2p5cXTrIOhMgJ+dv1>c^cg-n zRSBx7bxOc(x9@M$sk$khkoG-F#y+GJTc$<^5xO_|n^KN8-~M*PbkqYBC~<(h&@bxl zmEZpMH%F;+bYyHAalJ3^k(H&ZRJkmsi)s1h2!YRy{6mhjhB3AWNgi287R~3 z`nvSutEf&u*y9R6YK^aO0rm>xV*gw5#P~`B`#}VIU99ZYT4d$27ibu_D|?xrfRH89 zPa8xJkBpu2L!mNn*C1|fkJZM{-Ue{ZY%+FI*y_d5z)Az@uB;;5ZOoZ{VTr$3{!5ug z`sT8oqDl$%Yad6|uJ$2OR;^kX@W}+6AsNCS86lb~mp@Pi2bL+RWSPl^qT~a*>T9+L zh#0)3!zNsFx8O%ck_n_@`YI$V@uMTj+4!*$Oi!0?CDEfJI?FKqyJvkEp%x~Vkjo?OdfIx3j>+ROS49GOd zB4UdKlne!)eRGDotMv$LyP+yKr0wjC6pbw}7&l>?YU_m*l%u~p4{cWkz8WIAx1Ko@ zl~r$0VA81W|3s-Bk>neDD7=mw(9F9 zmu|IAoT!HeCr;!KHFp_KoIs;WRg)7Zj&*l1=F(2d zspqr|l)KLBnUVPQf35R!<1_PT4t-+Al{@U=XWxBhUmJ>NAnd3*;eM^gNA7?q(9_kR z>%_WWXOFD=UB6>1#l`E5h6>|E?;aVb)R|aUb*#P^&>7-jns)$c^v~y$HN8|AKqv@pvJgM3585*0T~=DRon;_RO;2y0=zoTK`k(dJ{PXW_NmyJ zYDYG#)~k+2_;tDoqn4B7irSizyL5vsmfRn{biBGu7E7U6x^~%kgYvu$lesD0>dZ7h$7%KK^8O}+7^5V4_ze!{Hgz`eTdJa(#Gar1tGFv2c62m( zX~B#6%siaeVW|K4k<^lmne=WR^o*e&pTjbHch5Wha3u!LB1-;lK^D}zd&aJ${xc|G z(K59+_oyJO;}+1^JuS~Hqggv+J`mMnT-@PT4?^jSFQ;u7tDZV~#E_{?(mA3nvjLT@ z>!|IFTXFtaTQMrMC*OtP;zvx9fhccn7_5VWoHIsMmM-ySekGc*&GuvYZox&mEvAFD zHA~tmPc0x)qEZp2FS4-Bp7o4dzdet$LeHGUAxTMITaf$%xJI(7I+jt!_IGEq!Z6Zg zY{8TWNAi`owQ;-5);4Y10s*P9zf&08`tLAzvIBJLxIpmI_W`smNhyyC%h%=W2H>2@S6) zb6eSAq}w2zp1sD*>^kXr(}4k$kO2lTD}7|a05W`6Lh0(lKOd&v2M`4`e}dgcnLcUuGK%B1WVm(KJ9o*Dl) zoBlxjHU!PzcVPkJm0d+e4ucAY>oqwO6tStgzx#p2TX`HulF#lxYd^2UP>bg~H{rUt zzd8yecQc#@2<=FeoF`%Xyz-j2_qgq76U0Xaer3kJFir!=Ugpx2tSj>srEz5wR>D5M zTzel>Bg^dMJ{Cj14VQT`!wX}92Vj%$E_C;42(#%s{8O-_c*r}l6}BjOk9oDcFTGwvR$54igUSWF%QhJJF^Z-UJd( zp4kPvHsp|Iz>7-E%@lWnVw{J;Np$x82x=i|r+xb-njx6kx-2jHF(?3GhHp)B;3%WX z2l{okn|_;4dBK-szn>`|>px|4-7; zU7c~?dl4u1E=tzmbk+S69q@6y#iYMrWBspfyic#W>?GZnFHXMHXUIWUaMEAC;(g2_ zy_k9Ve&5**C7<4LX3)B$5)NR zSlvPF3Qp1)i^9bGmBuELabx=mw^EGtq-3+*cJ0~-N)q3hWIY}sEj#PxZ?L_2O>kD# z0(qFltbcpe(}JMai6*~-eCWq<+EyE^OJXspkYR$8K?pvOFpx3I`tSnpKohz($I;Fg ztd--Tw<)P#6G=TF-6;6?T;IDGud$)#Y~Wn#*QB$- zd?NkWny}m&WvFXw3hR)3t=+CS(6Z!)4BPLemnB?uw>rjEnc^11$)2lko4XTQk9`k* zyd_VcUml6)!k1U{0Dj=nSQ89j*Ae)rMeKU+7EJvyoA_u1-MTK%hmL*OpP{h}2xe)& z(w9I#qBwpItK!x!N+&J|)Unj6pmC{yu#ntL8RY>Orop}mQX3aSp+04j;|6A-qk#Hr z=N#a5>3itd@Rdnj1=7RDS_Ah_KvS2N@JRA_EHScM>TUX={O;H4%>Y_0ftGknQnP;S*XOq(=1TPr12X~ z9L`4KHG9`r(kZkX`!^V;g7`K}z!)XqQM&vsUI24ZTMSA0tm$uKyRSvcL#1+E~*epuH(HILwNfwIhRC~fIF?DvUM&ZNlb?oI) zR5|3RF{*bg%GWD5 zTSN+VS(Jl3QQ$(*0(;f~{drM`I~yxL!C!jLGW$D9K7SD(0kP-l70@?$u1R?ex`UU- zZpML@XRV7=)!kPCWp+Tr3fWQOZ}Ef#v|d9%Jn=q4TQ~}DQi&zpxL*CZ62Xu(Oq{Y?q&b!G%&k{1 z?Y60?d=GO7vQD0*8j>vIUUk;Gg$t&Wsa*eM?vI1`3+2pG9bAwBq5AG>#*>)UxvlCKe4WwsR7gosCIdW(bo#h%$`UXl_7z^EO_SX9hOW&Ms zfSaJmm+jd<*V^|XK1fn$0KsRW*1vzkiLzn0{t81 z^+B#yYEVWMyY8?-{lB^xAGig~PczG}1V#^aF9);<$Dm{MlQV>Z4YB_zmPsn!-l#S! zced~8F5fFqClk_@8LBYolH%V+O<^Mi;>Y3@7Uv9iovldWgm5noMJB@RQ3DYuxN$tr zKtwruIlfZg!Y*k3eQQ_!y}_kN?nyH`XYJ#l^DCKBRb3h=8vHvu>vY)bC(Ba`WN$Y1 zB(eA6yraoRHwIObA8QX?q2hE6GA+jpI48kl4*xpu5*&xywa3s0Ec4zziH4mQhrQAK z;5Gu5mhUay&0Vy;_L}v+oe#j8BV&1NV_WTY9{niZ{bSVX_yAk^^E_4{5Cioaao~)&Ml(vg+`&JyT1zBsx2h(r#qAHeBV#bc}NQK z-pyIdbe91u_q1C6Sl1Ng>B6!Pad6X^t9-MwN&I*I>@u^>cO}QY^emr!Hu~M<+ZsB% zkEY+Ud=XwgO*hnE+;SIOd8J(6ZFKQyCg*muX1|wwsC(#iB(GyDS8*;o?a0KUDdO7; z)%W2SJ^;lJ@Zl*Y-zIzD4r~mOL<;a+SHLOWF3rZDL;B7x3QY+WIdR>Nue{b7TJ?Ne zt@|1I;pFf9?pWvxyhLuyO7F1AOXewSnA02KM!7-krXrl>E|;?qIhO(n zrg|ku7XH8;xZ5B-&!~;P_D9uQymAWaKKt*5jsg#zj*Q*a2(V`e_``DOxZv_s`o$`PWS(Tp+4{F8@W zn?$+ftl54CJQEvyFLsezprAw?TAU|-JSuC6n$G-yq9pkzbXaiu_RKl^fX%r$2$bd0 zB`}Ri#+f`b72-X#S9cB;vUf*{hf6Nf3)01tXE6L(boXhLEJ(`H-bh?cA6~Al*XlcM z;kG5<{n;qW1sX*k9EqpSpsnD2R@PJV_UnjlOerj=~K}{+BfMpk{p?(gd{tyudHw-&9kMAaqDR z83lrwzpL!XflkEb=e|&NYYsV>LKP;5Hs!DOpsz{kv8VioJuBup4;+A8iI}dgg^pC;*T4$!G!c1W`&A@%AsSXz&Hrc0pBzMMU z2=Lv>B&RuPmgs(-FybznNNiTEyt4nCQrDNmY~RR%a|(_x_cNyhQP+p}zvV^63g<4l zv4E2pXKON9C@T7LP*&YTc=QU`)!4386UHh#6*%TSkE`Np?rkkYgd9M*Zaj#<{8@g>yE%FN@~tWK@Eb$*)H8e zs@s;$1!36r>^1!EIvfa|A0OE_nPfP|Ru729g>iu!Vbl?4p%k_X`~Bo0yR#_TEX0f( zgG6VO=bcM~di&J=cL(@4zlY{3@!l>MOfQu!T)4EoXnA5T;dUQ=D?UvQ-O07+D$9*PaUKc)S*6S5AgK(WooAp~YQ>U0^SMEq9GGIa_^KyVy$;|S|!7=ck8@x^9EycF>ZcbqyA?AXTHZ7ByvB4T=mDP^yO~1j@ z7Uq!Gx5YfFDejJpxjL0@g>gLFR(gfi0jkC^vZHjQt2;uVAT}6|4bY>Uxgi!9D0a|(hPT73g2v>psr z@q`mu`x4Bka9%jf4sY`V z>mnYAOE5jwb^r=_8ahbEtLA#07_HuG^M*ivh`l}6iM9yidOgJ*cb!X&TrTy1vNpOe zD3_N#kg`)LaF(a9rptoc9k7@I=9eSLXqjp5raj?YC|3{Hn@*;~1UbvBl#T8!fwAU$ zacynMZ>l+Gwv?+$PRo7J`yfm;V3rAr5-B3(vsNMb!nsg9!Y)sMm1_Cw4JaPZ&_4F*Sxt45Ic4XCX-Ue%a zW^3jMu2lWJJ{Z@2aWJl(T5mS)RLP~e-AkmWgR@{?4us%C=Sv82(hjE`NtK14-cAK) z)A9_E-bOVCQ#;5*b6Ob4A*~GGF({=$oa|(}^t4fH0Kkd)FTH54Cbc^Q+(GYcFyi_` zf8a?uRrz%3W-b#+wxyACdT}`z>n@XNPuR8ZrX49LZ5f_fY`7=~d#BcbX0R7FaD4K$DF-juayUbGjSLIiRl)R` z9yRNyJcD0V!&?jn09!viSH$(LF&|I*M6pppp0#?`86YT8PFg6`N&{B;a)tPezFR%2 zAkGd}P7$*5p4mpMh0oUxly_d+U$A6 zH=D-E&tz@k?r4aPP0lcvlb6kR)f~UMXt`+}j9_1vd~aa33Xj;XQ3$7ATivQ-|Iw^_ z_p4aCXfF*ZqACg6>2XtKgkK@3<*Os{Dc7FP@Q$%?rl{~t{2ok!7{x8)v9840G<~5a zQWV_rHRZ(edO0^0_Lb|y-pPd6n{;7%4IWT^uVq{&`pJ=lar0Nq8VY??+*0W#%tr8; z@TzR5*>SYKyh75-M!K-zqktd8hXfhQ15D(S-@_8lAh#4}Vtx$eiKWV>-R5!2hw-%$ zc}Y`7M#XlHBtJ_#wK;59Tf&!|6E}f5YKoG9?pv)Va@W3`U|CnRlz{*8E})=`Vg<7S7RGycm0ju}9QFY)@g8brDk54w#4VB^d+MUw(K!{rwcgz^ zFjDVbLqej+N~^VYO=3|ZKXKv$+$l?0yH=jZUVD~A9XB^b8kM)^6Fz8(9Y~Xx z8Y57%X2uz`%G0MSRhSS`^|yfR4Ss3&^s^*?4*3!&RI*yGI>1OlpYfpPs_27r%;We! zTU21@=uBj3r&WIxnT|t@t;`=k`Z9pb$u`_%Sk^rVDb7sQGr}-3iV*8WYM!d+LFA#^ znNaeouJM|IZ{OsJ<*$MGID z*vql~ZC6|$^N05_aj^<1Fj<@dAl%Ua3u~o4Q?cv}nS7ZA?OqGpmJLY_rJ3YXR z62X}N(!odt1iM3h7fvOe+6+i`Ck&uF<2vp*! z2+I9UbMxkr$amivhZ;Pl8zLM3?mQ*n^re$?+>->c@K6hIn`X-}wod1#Jq{Y;`~=yA zzX?$hJ97R5-)b8|4iea9%(|_XgG=MsX1OLaW{23FLSur!nX`2r|q_4;o0 zrjn=me5Re(N5{^;1v~L_3>$(LgX0tJk?GBEM;0Q({#nHXk#BM>x<+UNcu2v9e_l#;TX zHwoNuY>}?UUxi&U35#X)UV$aQ78HlonhSe=BTE?>d;Se9B|ThQ5&193|0e10-Om<7?$p-fZU{p+iNP+K=Lt?231xy~RK!R)g_*cQ`)fo#ca2``M@f zK{y+#4>?p3P+CW(Oc7#m7k0ByfLZsSO<##*7HBBp;16LJVBjHRNKLa`}2 zazdKOb92TSVP|;luq>ytX^ddTEfRexI7$w_;+f1?j8u_=;ZVFu^(Y+5G);M zXJdRawfgqOIIw~y%Vh3)NMs<>qLQ&Wh;m@J|5lZwh1eKudfQF8g3`3pEmN~298Wrn zlpi(aQD$U^-htJNalk}7AN=?P*DIc%`N!}*OS)U7WEcy23!080o^FWm${4k?hjE_^pN}|fNtraVz1Gz5J zlx*Y0C8b*Le;FrG2=K{=sg>iQPe~T_i0GlebrP=q6mmdSpa{gy`9L!4d&Rx(lvjKY zXCNgvYlbr68b}tT;6ER%oo6w9d;@90;3WOmk#riZcDA&4f2MP6?D2TPvArCF6?{ay z&&YWM9$4aZ+fu&RAx-l>D@XqzHbVo8o0gN1jtypy2>zymW5HqXbL`8IyfRMO5A;@BAN?+z z--35a4L$il;|;-Yx=w$1-obUpZjxxWzjf3n^fw8pGwS_;a7?c}&6nB#DoNBPV;_1foNJ;ft z(}UeTP>tf`)i**lgpU}vGtCqsJRlpWQQj)DF`qy70rGs`Yk4YA{8fK;`K!E)jC;Md z3TvVQ48BQU{_EkfYxe;;Jpj{>0ee2jfXU|V)CT)A6<$exU;Njyzc~&~cwhaoeaO`z z3DfTzo)A&?o|m081iHlmulFNXrjv&$5mmn<1wJ%)qp^)LAD+HlR{G}fdDc=8XdHA& zS{D&E@CaqE=|*lFM%S`L>!sY%QzOQku=qcq$oq?a=ACsLM=j-y?TJxQBeIksGQCk) zRG&R*mDh5Um45>OrO?thVY=gm#}7MQ%ni1^#u@aT_k5NJ5fE~&R%rEP{4*iMenV>&PKIHU>0UkVElrbz= zLk_g;eRHHZgJlZA=B8EJyFKSC4^0N;X*}jjeYdeQ78M!UQO`uwxY(9$NU84$iOaw3 zFgW9myNM(BM@WJW>*L=HMbWoL#+JRxH>gd4T#}Nxhneht#Z#!!rKn=kLBBv1M9;e? zpAcubc3p*&o?3;Ox4`rbXRkqH!*^)y%YnoH7R5?0x@VV6z%!>pS31VV@A=RfmcBC* zU+~lLpW7OXYZ~1+F0cyLkH)%L1BjG856cQ#aqsv85v`3kwJTkSm?R@42UmLn!^*aE0{FIww3kbzeWb-=pcKNd(E81*>yDO*uTPa<+nhSvuWN3eRfp* zd5A;a+sWJqQ~f2g0_axS9NL=H1S zz+`rJ)`zEOn1KgGK^F!*%iDA>;1wq;0lEy9?Lx9wOC5#r*=@T(4or~T-@7~i zr=@p3b?q&`p_q=yabYTUQkpOG!<;@7yPJB~bEoG#c!ZB8l@*S7_~i4t&d!n3^I^WF z84CREQI}=%gM|%AS^Sc89v(1lFUr%J&E;CfT&=yvZvYBXltha#nCrL9l+9+zQV|`EqQCFd4l_-Pr7`KH4`ZiH zDRUV$W17@%+I@hDr}`rok03>jmE9zN5G}t?9qM!SyS3`oC!d;U_MJWyt%1u7AqM;O zk!hd0{_NL&jEZ6TA+7vl{?Q@I%zeLa$>4Xfg5)|vbd zrYUMKXH_A~j1rT>I$pLd>Ix@G{z@~KpJCrF+;@ppPD>l4+O6PFB~J){%$VO_RgapB z%|U@r+sFw}LUH6kLV5ZMwK5l4i_G)Q-Pa@XN`0^9NhQu};0igYojBni97l=Fk#z6& zfw%bwBZb*)3Rstwlk`pVq&wfFObbp)s=(Wc+mB}Pxlx{5ldZX<5_tat$J?tXYmEuht}oWflKIm`y>fcNj@-TjVKaV z`w7V~It4M)+J9Fx+nbcEXZ)i>(NDX^Upqsueqh{b2uAa(ke`fd6{eBhnaYy!oW)v) zxrH>7(LYn_CcASJ&W~pHG)kviFIp5Do;G9g^mT=(n9o@UoyAjT+Eml*L!^;aq<~iI z=OeKSj|Q6`l1Hm`(s#;p`~57{;`gZx+4VI`jDIo0d?pZrwz7=cPtS|OEy(nm~f z8z+%QbI-Mje$juW-SfdmDW12*%FEuMCbPCVEjWGAuPUW&i3NuAdn*KFF*1E#M!)Po zLn@@Q!FUASY?GjZBD&1sS0nLC&(0cnMZdbY-7I!Cv)Hqj?n!4W?RWGWS3uKI{nkl; z6&A0%lNAUSn;2bY$q4+eIWjNbA*QnCe-R35)i?benfD*R;57D8RLWnEIse{YiFm4x zB)01BPWQ`2G~Buk2ztKz;7ypjm+3?6tE*+PvQuvz#Xom}e{oce;tLovwp(0ZOgY{C z&N-Jy--mN;h>jMLu``W30@cw1l%D^itS$dH^iUz3XewNA{UExITENHJyomS^Tq}i>ml% z~i;L3{Qg7NUEbMB9nGD-Gdn zHoXfzhQ@y88fXyRLz>t^{323ySnAE1U12mDpT)wDu3BUUIKd*0Od3wr@-~^t++O8} zUh`SW<;Xzz=#2_YhVZ)b2-omV`}LJw(v!hTsB1RC61{7SgGZ=H@^*ug%I;f~aQBwp%g)a(W{-@n+4*8RbQUQ)QG5X> zm>^DyI?ed~lwJ{ac+UKw<04gF#Za}Jq9^{~(9}XGq(IO3H#yaQz51be)_YT^JGc@~ z1oJq-?}d0N3`@mY|4>#~dVYT#+qh9owny0rAoYY`*4IB8$Di>1Wj?l-*<_0(E(}_! z4-Uoo$wtv*!jX>_qR0Dez>N98p0Ox}WCGI1u(4>@oQo|*(}WR<+V19WM(PQ9W&kn% z!GxPAMiTdF6df<5g}cLyJCV#O3LZZd@KHDb(6<>v9i9uHazX9B0H^1;y~=O$fiun@ z0)>~uwV^FA$X1qLafZmu@txmZhO>k{|GaZc~5sBHxSm?bU|<#7Ro{AR!B9Z-d8k%>GG66rw^9ejjP z#e$pcnY`4?PPEw1@%4#9;iLy|kU)J4$^FzNJZha5AE~&#+bU$icG4%3j3?p(Vs@(T zhe-SQ+=r8Rxl=KO{Q53b={N$wreZLxGC>qg`7vZE2%kP#h{<^)+J3TM55Q|K>6vv{ zp{lO`#&PsiD$d<)=F@$*AEu@NH}L7+#pC{g3Z&KUv+{`*r2}rq&j7{wl}}*C=gqqd z@rCTPUHkpkJ?rkR`+T7glli7+@xGUywZjMM&a z>mHf6JcN+USKz1e?82rvbdUg3dmlqb#uAaVn;m=mjT)O()inFl&%#MMH;hn{6!zMgb3O#Ne!l~UY~!F2d72)qj>Ii z^TulG<@>w7wRT2E;wE5a1~Ki+jFcf9Wso zhch?qFYV&a7NZaAs`2Zig|QjW#_9I-(!=7K*It}`|8D)Zcjm>gs&mJ)VF9nb%nRrR zZ}k5b(Ivy5!oj8FkR>q{Gq)T@LdSjS4*vX9AK7su#Tv;p-6X|wFW%5d zFD-^RA2K9J2)}HT0r@<_I4;6-z+{~hv3$@2UFWh`5jfMkYfVV6%YM`H2Y)2_$d$Cz z9S9^7s-4+}gL&_d>lDYLiBj~*!q~h&K2QZoF*+G%QjTVPMofl}E#||Ih(|EQVuWW~ z60~PgQ0!Wao$(ZQ2I6Kq?ZtHXCL%=@zLgrrD=W(5=eMt-Wg1F$I-iKP*$}t!(3Asr zS<_jOG7bd@QjT#vEgT|Ig-E54aVriTGph6_Rq00%x-jeqTZiPE&R9$j2FY1Ltgj5y za-)eZ>>W;4!mwzjll|nIPxZfVhoP9C@fYt4nTz+C4)5tRFto;1RJ}Fhx#J6n|4Bzi z0$Jg*@cPksUN6qu(uvk0gH4)0B{U`^R!Tak;OCH~F1tUY=yQWcOq;}GV>l+E)hu4b z1`kCY1La`#jJ_b`@R>sN#r}J+4^e;3Fa7n*(q9`i5tIR@MPDQcw6N%Zbe0;wel#pG zo&aaM{pfAiZ%d-rwS?CS(O2(z319O|_)caCU)x_QDiVafUOHc0upBvs!ue|a^+NaD zzs?GjF}3&nqOTVUb35o~8>?Rbx#*Ra60+QZqPi_Xg-y;*qHiMcbqU|(UhgzM7A;8* zrAlDEmg@JC=v#&O)BZC!^`0RATo>0PMj0e8O=rf6lXPN$5@Q@DkwCtKla^#3d%T;g zKr;G{4)AM*=btd82zJV-iX$wi6Qihw5q{>?0{0rw{@o%Vh2rt4^hLXGfPexV-&pTZ+SUM{~ zQFNoSx#+USLUMlgf+F&>pUBLC-&D}L`&c@YGTp}^OKf@WEFR3T{*>lnUC^J81zPqF zyg@Am#~q8=RLYvrVfhuC2b<`3?uys;ArXI9&cC+7rJ%w~>9I{fl`0g;DdOw2z~z}m z)D3{%x>F}Tv_XH5WXVQ8VV#suBEL#j_Gq?+Nc*==-7MzJss1OrO}3G|2H9e!FUZ1_u!X)Col2Kcy4Rb8-s3!Fan!jlWz z2GZQj!V6DHto`RgA@FoyX~lZafz0*qg&NVvW>mxmFrX65xGBQQkXt^prfn-*%umo{rRE9-l58bAYG zB`jSfC0aiR#br7^>q|jeKTF(BZ2Mfzw(5rb{GO40(Pg+e^f*0vRRsd)8(K&09JO`)Ube%Bnk{F|J9WwuB6I&0dM zcobQoP{em-)J**z7E9p2Mr*fO8=%~0ZvzMh4hRJdV%x9d&hH768(O2I@t0&)W4d+Z zMZ9=J=O;6#;GqwrQ#8t)h8`M?9?DH=srUOqlf%pF&IXxlI);f*QaUre=;2)VEAoV_ zhM8TgwFyLRSF*f%@eoTs>B)Nory3!~;J)BoK>eelhKiy`wDn`fs2Dw(o5^gLgqjUr zqU+M*fj7SCZyW8#N2>Vbs(3G3)z_r6o!~F(UfI}$h-Ml^@iYMHkNL6D_|?-Z;P{J` zo$OI(+H=~EjV7hgs*wCy93?McD@>xt*&h49q2r?w{{g0K)f0k^Cr6_vd!{>&DH;DU zNPzK~gEnqFo-*NH-bQ%{5%`jhH*g);KHG@Bt%s6WO430VC#;vI4QRHw$}myuot1(t z;kEWqv1PiAp0=fYX(D=NG?nVZt+OOlMhfu0k`4XJ4unNsPUMrWYzIZ*lpg!rKTS*W zN(u$!u+)-0#}Pr)40RLz<=&&=!-Nb*?JDjSy?gMqrZq01&1ApMUJT?>>tD%)JKKj! zs9u$RG4n857%g^DJ_B+1Mn+nm+$zC3%D z6sA5*wFRHJwqkZ*!nRVYjFO!0mFH7slsmYi$*J^-)6wyNVan%dqq)5++ur>g$(aiR)t_>!AIw)T?y^+>D$ z01LgJq09~Gnl^FXv6RrLo}57oBTbD&&njFhRb#rAcccrE0ZNu3$E3iuevIXtLMmmp zw-nFf*dUTX!SA%n09c0qfi?YX_^MeGG}y*yuia;wwEuEesj+HRch+#F-}csbHDTIZ zM)?8+Ahb9Qm+VpoIgG2E8sy9t0+L<9k4QWe{OC*mDbWxW_0+T%WuUeX#zv0C&{^6GiA?>d#+HW#L44eaQ4tx0*_ zUj!UK#phAPax`}H%!n$QrUNn0Xmn0|L;!juA&f@O^jaz{c_b430S-|}yy!Y*mgPFSz(EIJ1T?~kir|$M=-`2IoET10 z33oR(C2(lZEHHgaXKU^%OihSE)b0-HJMG?NP)1n=+<+0~QrouvhhC#$#CpD`jBqEXvTfto%+;HudMi=EtdC`lD&$;z^hd7dSNFV9P}lNZg_e7q;r{@XB&rc)dk-@_g@2>6L~`ZX z!wZc&(M0kOoo9w_o$`d(J}C`27Jxu9D#?Ms)}6L%q{kL%0dK$uM~@~iS@5Wl8}%c6 zu|?jA+LdH5vUsAfsa+@J^LJVTYCjIs;yGH+|DSlpN*G&H8%zf`d4;5?tq+ z6Nsb#n5aac2A2jy=oJq;B;_*6f`vXQ8_0p$4bg{EM1i&@lP_Uia&{_*O_@R3Ff7NL z<$97IzAgDQyAZ(JFn6gEY#dsVl2A!^Ret4#dQ&0zpa$~9@{u>}MgJ-J8;TnFkYCN- zk7d~Lw);rj3SYGjp>;SrItDK&hEFguNs4Y+w&uNsYZ1AHx~>IsJ2|d2j!O0l|DE{! zC|o;?17Gm-{AirMf)UQLvBnaH9$?Y=P~7*?(deT6^^N)HdHxu>IvVkxUOhS#y=;G7 z8=a4?jgAEa^u&5|kNS>N82eVRgP<9QvtNoQE%t8iS`<|>+$JJ5(A&!ij?V_7;SG|( zgh*PEoSm@z%5%iQv>NMmL1KDWt%4cnD65u#*I^<`=NIiHQcf}D%BoBnP7&37nlP#w z42rT+%H@M5%69pAI_HTareT7)Xu{f&?J=73A9D9doqEuhM{w-u znbrk2E#HyzkSu6=;}&`+Ip~1-oFX?>do_4g;A6Tq8gF{dPwG~20WRUB^(YC=Xi^m? zxhd~m_Z$$vHQLvS_%L?C?>WWJcRQ-8_jh32?|(0hPtMpzItNyy>!WeTq0^i_HcNOp zJ-4{5EZV}O!7nQ~MiaX&tXOYt{|RWF!~FboT6T~2M&pC5Bi*)8vh{SlJnPQP4;~Y@ zFnDlqFUPz8=+=&mbr9k`SB$Ig}er@_NJ)2No&A@+%b6j>XWMY}ZfkrBy5<6e;~&l1 z-(F7@Pt2U|Of^2+6=OhDwwbFiR?o^&7vfZFufjSIciibSW3SG2POx5PA4s>A9SdEb zF}tgZUO^3*agJxlYIk=~kQmX(znOq_!E5}(qwy<#ZbpVqrV|DIezY!1!|vsHTo_O-q~4O_PAxPCgKhCF@|uqVL< z{o|vBypuE~nH8_$m>8Tk92YYW7xT%{)P^2_F^A%Vm31a?GETb_C0~MZa3ERPoH2!t zQgBcySVu4Z+$1$lt9G}1%F9MX$->Z9HnA*m`+_`#?$bRD;*bmQN9gS+his9?WJN=T zv#}&NH;@l3g15I5wIVtQdL@_t9u7oIN#I-IKipS5!xjtrG=E&$U-0c|fpnopq>^3s zmr^XT&C#@K9|(_AA7#@VxK$w0z7#?^kTDSFQd@A6Ja6;9-YIZm6BSrfKZH&50tzy< zzLOWbI3_jf`bMGxgvoA1neu(?IGT6U`W;QaypnE?$+zx>iSWpEV&f&&I@L&d=4^#D z8vrQEA`G?WN|kPr+LDgERNEw9r)DEN?~b)CpYl2uPw&{7k>t}FnfGR7*4Tl>xeW?= z#>+4a8qYXCG+y83Gh|T-_0l}B4K4I}o&i;!842WMUDxJ8knNr$?*$%A-a8@*pVHwk?>*Z@0 zy*j@;9iS4U&+H-E^hEgMpnM*FZ|U$|$o`NdJk4!o9O2fk=v zQmhX}uZc0>=j;1yqj$#3%sp?%aQl=Y?(yV0F~-zG%sh*}y3Ys(ka(s0#TW7i)H%2a zV^*GILY>2FDsCJ!L7|1mc(bA4 z>-P)=-}F%Mtqc@=)1Y7r2f}X&3i$b*eKxQ!X`Y>iK!w=YC|TC!2(-k$R|M`c z`I6AIuM*<~deU0C9PYYoPKga7ryJqfEa`R5u()b~6oufoE#k*3??kNF|0<>2jA+pe zrHCSqJ6*htR_+LKCYr)Mb>jraF(Wa}XMi83j* z%^N8CZ?P-DgS9KGiVnM3YvEd`ZNfzLDv!)2*Rl1ut>ie=ghF-*vn{0rp#3o{6q+7n zn=&lsD<;Own+kdjBU*XAK{Lo02CpdYN*Xz(Z@4{a*qLJ)dfzqXjCh7pV2Q^d2YwZJfR4r=@yaL^>q=VC zaVkiMkf+RH8=?iiTzj8Ya(Qb98j7aSx~$h=;i_-#NJpa5itLh?cH3|5K*YEH8ImCx zw=zd`Gy+NnLGGz;*m;X#H=4m0N0(zOj>9cMqIW`_LickJ8wDjuC6ggwiZJ2zw(iiU zhT!dd-4AW>NeAC>s8gv&TnAK1KcG+-lPRg;Zm{|TRIdAgZ4{p(ZAV?I{_w@2!5GxE zj;HbV%^#1(chei<9{FqPr^|fDVcRzM9vX=q3Siy!Z6!!XEb?x9@iklv}EKU$vvfgg@$b55|0-Qm(dfVn|X_;Ie?PkP(^#I^g$ zzzNSU`h9epmgKoq`F2@lg)R=2%0P-{5^1=JzWjpUvy5!SF8wq&xqt4R+&{a?=^q>q zUyXi#&m7<{JO}v83*6 zC7Ozh+hk231K8|;{S(na((+?q#7T6E3{wFngRfr?cxM^zd5oXL%7tVcnVWPny%jr_ zFeCG7-tT)_bv{svc$u?UP48~+`&qpYs-dID;_)-PxPHUO>$xa4ZXcb;(b0iB6h0g~ zbpcnPN)rH*))hz~y%$LaNO$$6SXwkZ<~O-}H#QrMX7)*uIx3r)2a%F0)>M+C(-j_; zR@pw&EFOac$o?+k=)aSF;IoBfA4Subfp0iE!pNB34danVkHr+|CZpnc<+&=|UBwWJ z(x~h4UcbjE4@Zx6DGz6EsIS!>xkh&SMSb|tv3RV`5d48x?O611pFQm>fz0P6kc|!% z>6SyLmntofa*#y+w$l(pVSpn3Fl?-Eg9b?+dB(vRxMOHBU6YXxA9ttVGcVPMDGq#G z@fnk_p+6<>}{zjLm@# z3BzLb9D1gMHe9Qp7~Uo3K{p5M*;y(v75^yyGmNym#Zah8JB)mX57i{h3d=oeV<5EP zM0tCxG!`4k1d`>v?hH0qFT|901fxpzwwM|%t~~i%!|fiNKgwG-$6N%5QZqO^1e#pc z=uusF9O$edD7=3hEAMSMo{lz=m6%tVlXAReO8bx=DJzn1OP4%3n*5D6B6R4xNmEO> z9t;+!|BU@PK+ZAK8K&R$nTQbq#1WtWQpq>X)yPo|Bmj%b%$$I5BaT0rotLuHwmwbz zS0)Rv5psmM63%g)80eav$P3m z7fiu?N1PKMz9K}2xG(S;5w>Dh_#bI=w7ekw9YSJxq;sDsW7tNm+iK_Tv!#O@zkoY( za1>$w=ao7KO7!jAEIpuurZy!NZ*Yq;h2SXXj1X5QNCOCHSY0Fu8C-eGA8KFaKCotd z5$uamH(M0;IaWq6|4>LpW(2?G<5AH9%t10(jx0?9DZnVzQwt{7*=k| z{I>c`zm_DK?u=CV`pWARvfm|6bWXnu2qp9FpCU6qaf!gx|Um&YNH+E zD{;Z!+QOm4l-7MhrYFKaon;rAwcV{u5`|>b`<#@*OQdC=VxfFW4QoxXFiAgT1JIGA z?J7>D45}R)oll@+xle|YFMHuoE+`26W|0Sg|n9W3s*xoGq0aK z#A(0nSYP*yeN3*u^rqy;j&)4Qk3pb^emN99ek=`r&`gB>Gr?Ph7iJOE3okq=*8BLe z)Mwu}?Q``-$F&D^#Et(@cHK^42y)Vn`5wwE3vDTS+!sOckWu1sopIkiQ_NoX2W!F} zFeBXRmRE1Ex#n}a+j>3@YOJapQO(&?n6F$qgH{T~7d579P1Rj+PPqD`(+hBg?n@{E z-=j_kNaS`rZP?*|-3A4MhpAS*ZCW`r_BMp8i^CxuwwWa-~_>lAr!Vu`@8{=3{A_{noJx zS7+F)X)0Wg&6pj?vPIo~SN=eQ3G0atuf*{`G)T_Hw1bX_UX zLtKg{0q3Of^s$NP>3hB&&m2oEPtUtE*W;OEg-{+A@_2Xe@&xr1zYJ^ zR(kfHS9;#B^kQbE=et%qyMTq4q-@3k`D0_b4ex~(6iGf8R+K#E2teK|S{o`qn$StBGuY}+CD?=w!TH{=j(Ev*69{kx8$1=*w`9_lUx$MF;a(R1C=IJ;?~oW8nk zt)yAzNJ@z$=%)zbd?SR zq4Cq}Vx5n|HtOOj)25+h<{DDWyFmjMz&fEeBydD!gn37mnTVje{r~g!K5%wk<$dS- z%2(D{Gb4|KoQzY^Tobt&(a~jW#xN){(MU5!N+fG6jf|YwojaO)r5QZ`m^&kDDBhY~ zXmMk2?JR6?3oSIz;MO#_g)ZLWZQYG`A%!ipp$)rX8*gzJ+PDo{yoEM2{r;Zkob$eS z?u;apwD~A_-gD1;-shb2oaa3MAFSIXqSD0V6(F2xAW%T73Iw7OwKV%=GR2>Rj}dSK z?AD--!5JDpc79z#$!UxL6Iw?602(M#bxVlensI=a45q6f1!wGlAdKF-GkHl_rdN0v zyuV5L${&60SX`*g3oOpFAubx%QOn^34QQYI4sX0BKP%;+Nxx+SFKV}#tg)>1*c*hC zjUjh?qiUjc|IYl;l5INdUQ*BFfh6fGRT0X&@ilwi@^;h)nazelE4+^&P|gIHXNjM8$g*r z<=QC*j2oQN1PW=QB5HK}u^?StJ zMg>w)hIHDn0lqeu;vpVCo3inhgXU+{He8arZQu~2B`w3sgVV$$zI_GLb}{r$z#c70 z%A0&c{L&U*u=xRh8XgfCFF><872oKte0Owf;4yusrD%ga4Jw{`>mRke2m~H)_Ip0yg;b_U@Unr|s-!T53G<%o*oT z)3Ftk;KHlEn?e$!Qu^9=7FSck9ru3o*y!X+x?J{d2rIVI3Q{*W)uq@5&lDtUA#=q4 zc2Cs2@;Efbk&b9QE;Rc%F?#Ys;eSl>QlNlx9C7lLJ9nGQwz31@#*jqYSP-UqZtgFz+MOpD0rhgI!5zg!A084jYXo+BjZLh^y+@o{BJrm38#(s8Q zY6C%+qdaKWR*px_P5^-uRExnYjuqLCuKCe81X>i`PApyIm%lfeh_gtc4+HUCT63OY zZ4qw^E@2bCEsWGiW`r3zhlJ;HwLuv?o=?UhbR7pF9r9ypBjvK2*GWjys09O|T7YK_ zmzxRw4I-fwLrJ3b+62OepASWBHVzx%;o8_cfw>M=U4@9^6@~#YQyZj z(hHg5UhX9yq5)PGZX~fGCXht7+w}QYlZbC^XV+wO^3*piU9AY`U}+LpM?H7vq*;@0 z*vBv_($>I~3doj!C?XnY=K9Y3<0Z(hL^#*Cn%-E)AeW<|eYv(q!Q}tsIUbo zEyA|`$m!uVS@zJ*p3OJ4liBVe|BCj^u@z>_!G?~R-q1HR9!buk_%RMZKvPkXX01`C zh(1sxhq)Vz43XE%$^9G!PP>Z8knKEW+Y8fp}!TR5v_-@KsOr z$(^oo`$$O-^`s5_$~Ap`*+(=m&mY^_b5*5b8VA zC2c0f4-w})MO9Ekuv@OlCr?d37{@sn|6uL7#n61UGp5-mu6812X2(ov2WPo3qf3%S zS`^b`BTADsQD~JL2?qrfD)XiHOw#c~U?&f`{QcHe%J}f0pApy~yfHBpH)@UY2;@vJ zeRx~t@!~0cSee!d+SSq6uUrbXgOXL74ZARd5#1~|p^~N~5}D5jgQ6a>Bdo6tDe82N zEC9_AW21{UDA>$2D*02sqqVdC8CMxW%A<|9;uUpV>Wt+@AapP_#*+lSOl`v751di7 z7H+S6H2i60k0cny>Ov-@LWk#qr{{4WK%{bQX4VBXc&*QgyJ^`HKz1Th%E4Jtq|S{l z@ItUi9y~eopp+f9Gvh1MsKGvT^2po$Rh9uwSX>?%mLHV(N?sUF{e36oghs-oaQaDH zUFo*x{3i+1OTA+fElWdBU2qgU|Un;ru0~!fVzId!9OMq!z*Dsts!?hr*B!F(q(i5#h)td z?&qd2w5Fu8>a+j3iz-n;EF#Q-;6EI*$|?THpbvx>x2pQd&x#t~`sclTZ;A`DxiXYj z893a0ekGQhvQKRVW6$B~3lT&r?#*&lZ~eVK<#5>Y=j<6>4MW*yH~Cf@Ulk?A3Zeb2 z)k^m4&U~-_vb}(Cer7b(Tn>VS))K^p*x)dQhCBN6pp7R0;mRiXXEy=JHmLMf0O+tce=cPs<)lgz%j z^@8##ecP5!tfOVr+$|T-m}ch7JM&>Uz2N<;s%aD&vmJ;_7d;}kTKC;b>DBuBP9lNX zp;LNL9@(V)H@;J>{mm7ugLILYg%{12w+5SNr3g`gSSlh(7H_HK?~Y!+!B5flB7F@X zUn|%7)t&jl&@uGmhe6L9U?rZvwln{H=umv^h~*VH1$j@yH9VjmyTmRLaWq;zQJKTw%HgDpuwe=e9 ztcEpOv3_6QdeLofZ2Q`CL{ja13&T$znOsD1$HF3{O<<+=hO@o2vPFkIIu|p|Eq>0v zu{EIhg(_2!P$^)?4{`M8+o^?R!JKj}Q737c^q)QRP%9?Q?Vvz)?^YZx_TH$=RrCy+ zqK!SX7q?!ADi^pG!Sm!I3oR~*jJ?E(cDke=?L?aqR=<6FXP)O9$WMvHwY|oTLXocq)2Mo9KhOwUKf#!LqWhd(n?b0KP(}ADM)26Z$e35-h`6Av=dVL z9WG@1pKY(~%=jn2c7FK&=D=LWNvTsC{DYlW$_4LQVH1=d$46{Q{H9-+S>^qs)d4MO zv#}4xatWrB!W)cQd`EKs z(uU7ek1-%z?~F2H!}&>az|vLqoNb=NG31;Y8j(k*Jm|qViyP5WU<$s3odZOK-^Hza%r>IU8IIDbm(KTS|CWEJYaMVAhq; zE+IRCk9U}+)z?e&l!UjAUCj5QIuM<*#QpMZEj8|yCXj_L>QP$GPa^nP0?XB{^?+s-}TQsX=^rO&tnxn>UNWBkl z85|u+)u>zy4W{6B_rvr92@vJ7uHE}=3L(Kn!mfoT=?OIEg1=&8Yo9{;fp;KI$(oT| z&TNmfGd5Vdn@kE>q!__U*d&c$84%l2qShxs;pXar1L?&nK8u!_q^Gs&}=uXGw3eh$w8gn;JX3)c;M&H`T2AF zlq@Ppi=|Rh+S2*4v=u2qBwpy>W$D?%A9Cd5eUw`)?CR3eN7ZPuu3YxMU2hv@6O6a@`|zBB7qHIIl@}i z7NWL!j|M8qhzrvMotRTE8>`Q>Y9pa{K%ne;qB^2cCax%Zp+jPDvE(6BrcN{b`ZUo*>?_ASp#jfI<8I?5S zR*0g-L~!RPt?JY9hond^Y9-Ps{z~Wi{d;jpB&Zr=RVB;2b0XWqql>w(>AE#Hy$Ft| z%zSCaqyafyK){2Gi66IFELhD&onzLya6Un`;i+-KO4g8wFGOT{myoUT!`LiTbHr&s zD>CZZoMKTNb+g@-&xfu7@kRa=g%8r2`lnbHf1`FE^DKmmQ$ixoXL%#;AHsKS5tiMB z=}R2&DDspxOZjj%`tc{7p_@giKN(*vc0j@9*^hddKnm$DeZh-{_+_P!#~Bn|Y9+wK zxNn$r}RJ?ETU7YJqm zOZnD{UoIi$U8g~8e0lBMX`l>!A=4FmOFC4qK>|a9aYv-o&xO&g0?^P}<%)w&;5@ac zi{7_eW$7oJzb|H!{kXZH(9~9k0xifK1nwNeT6Tt91bZsRaf>w!oguZ*3sMHwhJ!xX`)4FW)nDow3{a(POUT$W zt8Z9qNikeIuDfac5-#8+%>Cn)-&eCxA9WjvqnRhVzJS=G`q~vZ8`zmR`M?ADwXY-? z7M(S@G-~;Lv!AGZn)%KxB>x7dbK_$vswrMRIxd#o)x*9l19Voce2LfHLLa|a)=EMV zlwLW4=F~K~_=Pf7jqK(ae5A#J$auf#^BftR$a^l#kpxm`!-S(-v`Fm(UNbL^`nszc zRaliqRIaAZQKeQ3_B~9;KUw)bqi`bA@$!jhI9wAEX`KGIDQ&Mp4VZUdNo3hbqw_tp zfH-a;EL0enX@Z$a6hyRY7i;otQwbzH)G0S)%R)HIbK08qAbt!w?t3v$Ri|unEG0EM zgGIu^VOgW?nb#@OQ>{?U>(^H%5+AnUCP!xD2 z@p0Ix&2*ILOz~3^Ol3P;1pUn|vzGmRL+gd6lC|3*7By*4&|`!ZHrS9Nc>o4ymXOlN ze@q{dZ6uytBcQ>fWdv|d?sE*o9pLl2(>8nCJ!v{>2<&Bq@abzRpV7-{vTKX`4Vh95 zXE>O3>rZ;_QTOCTb>6@^${l+)e>=j?2y8O0=1(;M6@# zMynkRJ7JmKH{&WO#*N(+6WkcPhd~Ju6h^BxjJ2?+p-M^mmJp?A*_gfH(R>)b0nBeS zDUZE$znl5EW{?Cm~O2v&QN39=m}~~#Y>&3ajrt!A7> zdBGk}b4;78Ix$AFro>DwHs@P$L5^Ezg-5bnLGUg+wVt)#VLs-TRWoq2E)DAv2DY^& zsoV4n@mTRA^Bp~0A6tg{QR}106;RJ{O+jZnfJWEPE|$Nz**Y9_VH{^&U*>x&`N+7* z=eWRzC7v`i#yra0w9z09K7JdwcSK-?Ev6y@)`h{KSO@dDLq=q_N9<3pQ`+2ewgi{B zkEh=`Tp*EWcI0!?Of9d<5k0+HcI(Bgf#w)t3BM3(lc!BPq|`11a7`%)koznBFso`r ztF!IDPCYo+Sfx6VAJan~VVbg5q<8BpHYBCYrzrNfHqVDm36?sHEMGhy@`Il6!G$$Gtuj11=*%yt9%o$H>Ki5oO~N>hznsu?4@jJL8|U&Np^vH+T14 zJu&UPhbxq6Geo+p`QSa~RGU?PTbGmE;`jlrkyvW0!c>r8D1VHPg!o6FkSm*vZxQ%U zRa?T@5Jt-rJ@jAD3>fo$ry8m-d+OXy^a+qtU%)sm1H!Y><6&; zAvjpEdA`mb-xVH8eo87GuR~!RYI?19NKBYq4N=h@SCuFj$B(Pc9jwaAmB{rVDMH<) z2B}RX>E#Hd=ZxR^IMkyPA-XW|0CHc8A`TLB^FjTXK1YQzCatzItt|}l#piJUp z7bL;b$-d0CA+rk#=I2A?QW;U;(;t-3#0t6BXuBJ z1}`iR|4 zgD4#zK-;)jR6QB2HdkkA#aLqqBS(H|NR(7qTGfD6336#D>9PG1y9#l0Tsny;ZW6=It5^?OT^HYc{PfJq zG#SZGE*_EO33t}SLxPK0rGznD>lW|iD&u7pRt^5UU9>yaoxe6Wwa<|_B-8Agoj`LDjm^Ex44}ZLcF+HmZJt2ivof; zzRCr^w0JD^)qVP<)XGNr5N@X9MiU)GOM`J1*+N#KK;$8awvM0^Ulc;249Wv4m2sg^ zzXPO@UI-CPuOiw;0OUxT)VD1R0mL%NDiE=1P#EU#t01GpD1)j;k#ae^;i@Jm;I7cWWyUH5c|+HS+o3s!$>m<`*9N%1%z_ zVhvqvJ?p1zhpcuhE!^s{f?&F2-e4xZ$2s- zT5S7BSD&mZD2qYFX&hD`+lI#~f68MOcS~|b8aLW55Ri)D@Y?(Xm8{%5%ih`D?(O-| z4!lFxx>0qnvojfgW!vVu?P1$P-5LKN1rP0@{XLf#V|EL;)_oHf&zr7!)RdYckVbYk zs^E6#LnbN*{lVqMgV1%w5)@y)YY)1$4gx$70_i(La`S%EO}5_GoxfXTHbQ?y1+>~E zX+-JwX>A_q&K|j%g&1xdYQyyNu7Q&%hEOJQY}|1eK&L~K4#Q(t1A6C+U5B_b-nKL<3M%H0Og3329mPEN4<%77 zg5R>d>LX8Rot~{^AJl&z+m=0fH6OKudwlMEb7p;p)Gzs-(hBi0JC!KS0Dw zIDsGcd9spf4SlZ3Cd4O7=NW!5K|vNBsvX9qFTJomo7nJ!zkpfiBX$NJ+t!zT>}qCW zj1F2-*yTo3o(N7xy7J+;Ng@-iPju&Xq1>q^9;Tj1NI4K%kS&Sh=0dtmbJr3+nL6RhQA81r3wZ-lO$VMZ=Wnc{X-K7PdO zGDQ(o`UcbI09~8ZU#rLA0@rEOFGS{l!KNE!=;Xz=*_7u(5Zuu?+}P3@ZV%Dwvw?EHo?+@BRHbqZbAH@kTe-Y z;W+M?qes9p(JtilF9|`65Jo<tFg+W~$yoyOaue+YmjK2w+@m4!CQUWIDMDVeC24 zpy#`@=Pyt0xE+zw5Q?xLOdd8>E@pj4iX(^-%B>0~m)5tnuRA{^`di>h1G?Mq*4xd0 z91ck4?AAs$BYQ!Rez80IVs}?PiI2vf6*468gC?Kr6w3S+v<(~h1A>o{CQ*fU-t;{S ztqUXh!42;d@pAd)>65+bth561FVuoyLJO`48R=y9nlf>PatSH*ec#k(ywnJAZDD9T zBpXxEGqf4}ED8EXi<()aI*e%9SG9;YZO^`T74sR?e8OC^tm@XrtNTvAC9r#0;CAEg zKnIk0b>W>erm^_QwtOfU(vG6K0D~^GKx3CPLS|pr%)il{ed99dg9w_`JFgmb`Xr=| zhmvkXZ(ZX?}K^!_T?{LL#fVtcVbc)R@#|KOIpXE zru1|4!TmV6O_^IOx1eKWP@yi6&JKl3jc}~Cp#rT#IpVfl#b}ENr*)0DdnitCw^nU_ z!ze$Gh4DzR?{W>3uuUUy@Gbjo#2*bMTV#zwD{Vl;SA*xGd(dA~!MkMBVagi&;I!!O z@|34&8&_b3Jv|K-<9hyR`;bA&Unn5yB`Ak#AKEZfX_z)Bw^!Ureu*!~DaZeE@>iKb zIKSwI8Qi>Nww!>GlF~*8pObNA>{cPAS%DunHZn(c8MQWUY^pB3>h%$Oib@m!i9JOD+(LlM~0d@@fR1hSFjjQ3|5cT9E5r!9DUM8YQK$@j>REugMHCdAX1MB;@bSi&z84a0h~+^A}ex(U6+-d6YQPis)n>@fo(Q%Jr4|bMGZC zol(-;k{h;|f0}!Yr?FEI0ShD4X7$a|Zj_g$&&i#=7pJgcIX1i-gJ7O{jYWVf8ZYyG<1d`QEpuC8N3@Sm;s z!9pQw-CyqZ6gh=v)Vdu?-1d}NTwCAo&Yv!UR2W3v$k7g>)F68nVZ~4dM30)Q@D8fG zFTvJMKwG*VZRM$C`RqHqjj~s^+<&sk#bxgz{{G1dD%RI-L-&MOVcxR}yZ`>xzWyF* zXm62*_WsiAKX5kfWnx--wz5_Yl?^|x`02|>(x$Ygkf2egzPseUac*wa*h0&wdf-6t z;y7A*XZnI%E?2MWz1;}$D<~^Xy~L6C{QpQb_@C_!Y%^MVir@sLG-^hieOWPP%ap0A z({ov8rDW^scd0$_v6EESs|B1+CpTx;P`}!HpxqfIb?2 z+GLDK#cG#vD%n=~Rzmxrgg`(plpoN%HjRX-8KSb|P={9Hn##LFTVdTti&G3(JDO&l z6fdxvUn+o*mZ9XQvcV9?McQz4V(sW@uCDp!X%)o`3xg8q*GFRqCBii$p8gjT9B>dh zVrqYZB$K-83aE(X{M^jk(i*ubQ&?|L z-xlU&k2GOEBNH$^{MVvTm=X$sKGEeHdh!pX{2gh_jNELb=zXenzJGgu+{R!m)Z0z2 z>z|`J%WjA#?!@$RJB_-rhhwMz*>+P;#y_(JL%m+xv-@&xgK=F@@1eR@3{B^eOyyL5 zuDO2lK?TUo&Mi-n=;1tHv3s96R?&?3FX94V!Z`tRL46i&zv+I3%yI-xP6}tDP~^#N z2_>lFZQ}bA;cURZxO0|dc0|BXEhjo@!2*X|^G5fQgGl>=W0JKvFEOo(Ge{vx9xfF9 ziZ<%?SbiMGq*9e~celJ^YxVY#j}<-==xD_c862h-^w-6*nZHfp22twLsNGi_@~|7& z0i>3XiMAc8xK%Kp`c?C=VJzcSWNT61Uew{_?0Po>u&<2dH(#D`v+(jh!eiTtJW9pv zVKQT~^Nyak5)z&QQOLigl{4RMIS2xOklpe_e)XWmO^6__wN#=4<0%RLR;cJZH$!@# zy;c_P%&oVLU~p9`DAxe)L!oFd9@Cym^#g&zS7(c#htFfKmMf$2e*1g!)x(s~U0KJ6 zVHqwHD#QLj_ zf(lubj!`mDY&!{!vSXTJe|F+k&!Uq&cI~y@SI`iP_)VRAW5Ws$Hl>Letk%t7IAy=p zNxwpvo-9*bT=X`3ZDHn}qx@fTs%nFyu0WtcZfHfBnG_#r_LWJ+-7Fy*$A@-gXL>Fh=QEaw zhJ*r<&+6&mZyQ}T1`Elgb^rGKQEd|$pCBnlZ^Zo#RxxUe0@zfoHw<)xtU=Fbc2hXo%fySbTp^j@T|))=5#(&+WlOVY{XtTv~ac z*^^I%&Tr?@_&Dp9-QQDA=roNFL7&oZaLoD?<6g<8S!+!6)2|lzjZh`%;g!g;XB>W? zY}WQ?)@*}gt`m+qhhy&5!m&3^ILb5S9bf3lKeXwN7rSqZb-7LNA+bEgV0+eXeG_^A zR7-Sjdp=Y~8N7Lbe%m{HGX86+V(|H9l-$M^ERa@fYewRoZ9 zw`~3Ll&AB|bP}HaLj^1?ueOQWLSAn1c;R$GX}5HQq`$k+M4_^R)^f(=Br>TXAeAeQFdG8L|TMySgptuza`o8!=`9ZdXD_*_Lw%4m~7z6AtSlkw;$+pa5{ImgDp zxu;-I7b^^OF?}YzI#HTFYO2$gDgrj_>GU-(mxc#+%YKtMVSpE_ePt5*P!A#1(PI^- z5z$80O`c>2bt|^WU3h^7SeeEo&$BdBU3<_G6P&i1XGNU}`LV)`Vfn+UGIrpvP2%eM z|D+pGTr0-4VAvua@owjf|F)K}{|HuY! zmg_J?1VGa0!JkEAZ!#N=yTvEXOYFFzCE19M<#9b7Q>&&$0K4aw*N9_~BSP?l4;Wvo zo>;@t0@uI7-9_S~$9&jU3|^3ulu}+Zo{Ryvr6%>V8~93?pa!10XeIH_*VSlxk;2Mi z#O2+j*ETv!m@P6$a>-EwEQ|u|fG^eQ2d9^_UMOT(IlQC!-U1YBIieF{ID7jBQga2D zx@wD;DCQ_f98q4Uk}Y}bXra#$bZKw5-YZoN3>L-)h0eRxMK5dN#eQ6c^!GkpkhgYa zk8Di}O!D2N=4#iNc1_1Lc}Q}}x>X=et{?}&84Jo@8#pe{C(r8RhG8ZmKWWirOYWnL zW3mG{{#?a89x_jMN8v_*dq#p6ujqo}@Eemi|K;_{WeBKC<;fV12MO zT$`-Lp0QE??bsq}5-X9-h>u$ygYcHfMWk~$vY|4uZnZI6j0p<{=507LuJDIN@%-#~ zn6Tas(G~=-tk&Y%pGrg)I(ar8BTQeyRrk)UEIrtu{_T+vqObgOfwK&zLxO_yyeN z=ZH&$@_YjA#Bmyrl-k<-p|gC*SpOpGyEHQlST>>~8DDSvZ9rK7qYu?yUq0zivQJ#i zdLP;d)&}3Hyl3}a(xq@zRYwP$f;J?T1m#YOmh#r%NSr;j^&u_xyOU+PZ|qJ9L2YL( z3pwZfd~}?-La8olWDD8Wr`9M9N#wh^Pjc$NrJvh?O7#pwDMRPqJHe>ci;*|Lehs{Y(V&j8 zXObIiu{Lj1*bm7JAOh#%_>6M<=e#|-w6ddt#8pDMq#5G=rxl6_@>AT(rf085!c=D6 z6(mDiDddGx+CtkGb4aa?G5&^mY(@Up~FP@e<5l-z}g0Fl!?N(FDQ4bJY@YI%QhEB{amdB_U3A!MU zgo|_)wXJjrq5T}Z+8{1X$w}tA%H!oBT0z1?v*Vf8LZ+>=^dwKKIz7dhe-imCElp! z^vFY0i1WM=oMgLnh1j40>uK^jT5i5KkxyzTgmDB-BnM-kl~U^**X3gE(BV0hkw)sm z(7P(PZWvmn)(Dm5M$-8-m0QO*VqVnFFARxTa(RM~T$I=QeO}C5*QIbyAc2}(m)x}F zeQITW(XUEO9yW`a62@t|kb$7zWAB-D%zYkqQowE>FpNV6n@!A@W)-aaufD z{x$C40v}|STm0D;$p0py7=qZ7)Oc)>(DzfiFUh`W9#wuM3YG(?>akD#=shdvNd`7e zBxB;mZmfI;OJn;QGDl0;7y|1=NA5X=H@03yjw|1UKWf!99T7@rL~96NzM>RxY~^6g z#0symbpE{51A%3;PTX!Gitx&6f=^vuS0t|A)T*6#T#u4b9bQ?Ic{U4PggP(aa!~nd zqUB^z_8i8mp0hX6D#U!w>8#bxo{FxQe!t0}fEF7)^?06s0z0ggnM=@d;jOMh!*x5h z3#H2IM(0CRK=Ql`bbmMmcUqP0+HrI<&DBZR!4{c6LM0XQbQK8$P?*?nipZCh7o={R zmywGrulqASJp&;z+@+a?u)2e2`&ZVbk6deY@GyIV0hk2&$chS5ZLW-y4gVgDM6hSg z22!rALY5yV3H3P@e;~A8xv9`%t$em8RS)QR1J)6TY`p@a&7EI=wkJOn7|a1>@K_s> zdUTIeNO&G>U>&pUU>Fd5F#eRxDNeAr0B`SHiy%L%6_`_Bl&sr%w%ce)SI)L-Zms6? zJ*BB3Q(Ge_(Bc0Mm-g8<>5H#!)Nzj^dhzeswtmlbN@>rzl&1ewy1Kfu=X<((*q&mI z3qX3h?zyd!eHKOV#oJWrBLKK9>$>NSmFx# z5(*#UHDi{;&=E#D{Dbs2+t(Lu-TJcUuFYQBY=X0=Ao;6JR|9cjUJ(0rstIjt zbRFe3R9z{Y-nhaIfAdFG!92F(YC$;|=W+V;zBM!X?lzZ%E%4jbpj#bI#Z}k`Ti@=< zzj9c)z}y`Vqtr%7IC^}J{ElUK(5HU;Rinqt0X@D`LXVdXJs$1Pz9a15>6KSK?Dxa4 zKPV0ReH*qPeExyPC^Ep;=)6PkE zvsUyStX^p1FHhTn$bgx+qHDU_dF1!f^X^?aFmrH?D4h;3{AH0_-ojp#=kxoTT|a zkF8V%lB9U>tWq0asm3t>sD_Si_bGDUDtO66BJofu0py!xNe8rS!NDJe%V(HPgaqa? z6t`~6=-$xfh>QR~SjVmymzRSJGlii;=K~k8-_}Uw<*&y(hC4R0Q-zp@N|JXObGKWJ zw)-_$T$K3LvRWv5SnTG)@+#HDU0n(BC*|9c{Jd_@kEGo5L8f1vze*B_ zy$}$gHgI^l5eemW70<2D!swC~A_!>0e8Z((mwOFphK3m~+qq?Jr?8FXveH_(+h|n> z88@y!x@^PRpjw^}S3m4pDQ~}xInb)jm8X+lUXDE+zy0iT8(y@Fw8k*m7buqNU$^epwz|*kWu9_ z5cQZrHYk6^7`Zjd7&;1>78~u~B-we*uc;TFv_K_`Hr)>uD5H{XbLj8%C2(_{crA_eSc2~vM-tK@RsFFv@bj;81i@R(H#`j#Yz7FZYiOi{pkO1HKU+E0<2_% zA7~-R{e2xhAHYAO6_CVYsLPs>r5t?HIMxf!)lGMt;nPwdz|Srs+ezBoBBd?D1HP7a z=NZPe;%h09t=2~;C2mn|fNI#v;!g}asryspP?(0I2Mm8G<7tdB2#n69f!F68V=QAvLDm3MO3qqIz|XDC(H;b^Djq6?e3UQ>1)XIL+Uk3qcq9E z|891l67mombW18WB3cOz2tBSsF~7aHYa+-~;o|h9yn7EXEx9{PWjI`sPQCLNt|iEI zx9MpRsV3lfgU_C;$IC6zqp;j|$aET0gymeA#bs=zbzN`%-XJvHl^PGWeN*uZ!x22t zc5!tGuaY+n%d3RIsPK?o*IQ3b)xHfNJ5P*<# zQ)hd21D~sOy>M+`cHC2p?%O4 zxzP#`8h2Y`dN()}g&$QDbNQy;{KF+KTJq|##nq)VZ@leb1Z1!(a9I89rruZU;MZAS z>$SZ-o1$8$ie&E~6b;^HIq+VWwS%`;ZW1)mZ(e2`Ds-uHd`~&fcV~!8)wiwss-4EHMC}wP;HWF z9k3v+Ql{#<3_;ITX}Xlfj+x-ov9xw!mSaUeD?qMEXSCLwPWP5&BOK9t+HCVQ0 zQ&S@gMUdGF@s_@pV25#1+&-DA#PF7WhkM2%D$gk~0OnXJyi;|v2w+e-hMmE00(LzB zbsXUul1PfY!ix(_!>#!!6J~>wT97eVT(eI*l+j!zZ*RDzWT!E(tQeg9Camhtm6dEa z_x6m1OTn%&tHjxPOnVN6TikARkB0C70C(K*%hVkVLRQRF2w>bpoAb)u!n{~JK%9Xb zl-k%=tlQ?m#fpP^k;j&P#im{y5G6<9;ELxjOhnr%Uy?ONRv{`9Nw*@tiXcWV&KYxF z2{P!M4NX)m16;+$dCRM&i2Js=rfFYq;q$zYD`ML|k}>!8422bk7dXG(x!8U6z`$%4 z@d1KVHw*XxM_hLgc|=d_-f)=m;5RQu(WeMlUKHj(6K$3N?+JumR}y6tm;-mLfB3yyWk> zMXNId)dttUYb)P7;x^Re@Ym@ss7rFI@ecay%7ueknS@0WEj&{a91WVEjkYdciXF=zHjO684UDNINXW5l|fm&kg8Af zGi><7r)9>aUX~$^f!PgAU_32!lda=FbyqEDfbCMseObKTaPg8BS?AN znrjW&>u>Xi@cFy9e)*uk3>J{JjC{NP^%L>Y2B>6bdh;IYEoJ=CHvn-BII+hR)^jsG z=zi??Jg-!b;gzkySiC(x&aIWKOEO+~#L~p$w)lvFiN|Z=BX%VoEAjDmd)yu$-(-*1 z#>Y3?Dl3XO?Dl4?vGnZl^`~ct@22$Z@cnptcKH5S zdUp8sq-Tfkwek6l4&NV7&ko;Dq-Te(nw}lLo71zy_qz1#@cm?ZcKG(DXNT{W^z88c ziS+F7{ZxD&cK8O;v%|M9Jv)4_PtOkDpG?mV-(Y%n`1Yq~hp(2N9lkfDXNPYnJv)52 z#^>7|zT48X!}rGY?C=ezXNT|h^z87xDLp%UZ%)q+-$;6P_}-G99litU+2Q-?`1~e^ z?_hd%`0hy04&PhTv%~i@>Dl2sl%5^F(e&)_9Zt^<-;wm}@QtNshi^PSzuDotGd(+e zZ%fY(-_i8!@EuFf4&TqFXNT|S(zC;NJUu&nC(^UScUO9L_)f;>5r=OgJv)4Nr)P)n zRC;#!PN!#wZ!$eQd}q?L!*@@5cKF_&o*llk>Dl4CH$K0`;rsdY?C||UdUp8kOV1A9 z{ps1^`%~%J;hRd&4qrVzJABjW+2K2vo*llKY;UB`4q&5ba0r`4gM)a!XmA)W6b%mK zY|-FQ&J_&~<~xc8hx37=!2z8w8XVGv)Nrdqx>z(gq)SDEL%LivIHd0^8XVGBXYKA$>44giGa8(cqA-7Yz>SyNU*f^iLNJ4(Yp#28Z;aqQN2k zZ;A$o^v@Ix4(Y>1gG2hB)DW(h|F&pwNdLQ{!6AKb(cqB2uV`>c|7_9Vkp8)%!6AKr z(cq9iQZzWEf4*pNNPjUkgp20UqQN13tY~mZ|NElBA^i(QgG2gw(cq9iQ8YNDzf?3h zr2j+F;E;ZxXmChBm>R;B^FJ014(Tr!4G!stiUx=D$)dp_{fk9|L;9DB28Z;+MT0~7 zk)pvN{mVszL;6=zL%4iCS~NJMA1fLh(!W|XIHbQ)G&rOmFB%-uPZSLf>0c`v9MWGc z8XVG377Y&RQ>h_bLw~(!a7h0~(cq9iT{JkPpDG$0(!W_WIHbQ;G&rQ6E*c!tXNm@g z^ludn4(Z=c4dFuiOwr(wezs_ENdHdJ;E?`LMT0~7xuU@#eYR+DNdM=e!6E&-MT0~7 z`J%xgeJ(YGtLc9!8XVHUS2Q@Jf4^vONS`kn9MXSKG&rRHYti74{(8~ikiJkfIHdnu z(cqB&@3G;wA*cLbC>k8nFBT0B>2DMb4(UHE8XVFu6%7vQmx~66^#3Rt9MXSOG&rPR zDHiw1}EpBD`d>F*Q`4(W?UgG2iN6b%mPzbG0U(r*?G z4(Us&A>2{_vS@Hf|KFm)A^ld-;E;a1XmCjXRng#({_CQ_A^qK=!6ALQXmCjXP0`?x z{@c_L?x^1@8XVH^6b%mP|5r3Pr2npHa7e#fG&rQM6b%mP|6epXr2oEXa7e#bG&rQ+ zPYvOY`VU2eL;4?!28ZOA95A&B8lahG z(0TlBu0qt-l4bXAJ<5=e;+|=PHjG>Fg7Rg$w`(?N#moy!&cdo=I=!wii~12NI#PO0 zj@bUog#Qqr`2Bn+ct-4+e zhw^Fpn@nM&ot;YRu`vT*MIH3xQGRnU@;(ZVHWzyHz7tBEo-JHyAn%uVRb?{61B{eh z*`D!5{}bosclLG-6Oq|mN~)w&9@Q_M+ZuKk&vNJ?{(aNSb1hILFi>Mhfh!S3u@3kx^_y?}8_vXJhkkSYgNy}Akd|n~XgVoFZx-ZMt z&3T}|KYM6XJ=kt@zu$dWo;6+l80=9k<{!)Vj$b115dGs!{+?a{@5j>5FCWYE(1)x` zY=L)ay{|VPkxy}YNht?5{oL_2m6lbK0_~u`t_*M9mfr8%GumjN-)-eD)>zO!jSyj{H3l_5jkH9R_xD@=r+0ftYK z2`^TYk{5OMSZ~)JGs>(qM@}wJW7CaDCSBi1z9)E5Q(dLaU*xe)f04(4juAgdzf)Fq zs*6ld@5h(uN&0r3e4vuOUr2;La;1_z>7Ad%XSYC*iSjwLlY-*2UOIwi?4iw+&-m2t z30A&J_L1H^hUk>~^SM32>RQP@MwjqV?gGdkxiS=+4W19$uIVFzHZcEwk0wElx*G>~ z99*x-s<>3TMX-{Mje0`I!*eUEvxbk^_H1nY(kwRg)fVf9lMnt38E!*IXjxi7HJW#= zjbuAA=uHFXJu`N#ql-PB9)b-_PLtPVd+Fw}y4lW*Nnde+H(ivTAvb6o$FT`xPL>_N zYl$kON}X0DmDF_Gp(IS=6TMwSY-ub*)*6cVHU{Masd7sP|5R@&pdB)0^=R_n~LDk7S?S0KkON&iDr@XjcQn?p${AH|hk3;U zKi77Ap6@N6pXW8<_5<|%mEkyK=urZOPv@AR=Lnx!T_4JimwqC9m$haJkui%<>wUTB z3NH1UoW6jMS+rtr-D9uPU1Da|S0+mDACJvk0+_;=N$tAYjBB2~U^{t#_ZNG!FXA?^ z3FW6C;+W;|J+(v>6KJoSr&3Xk;-36?NXR&4QEF30`THzSRNayRPf_OEUYa5;9`tT; zhGOeV6x%}~Qu{0WG7xP0YH#+{EkADskQGAJOy!aDo@y!+mwgRd6Q5+;J9u=ks)V!I z-jt$b!}Ox4MTaj`R3Pqa|$D9kq)+f ziwzuE3T5r^kmHi|RT#7sKDaQa`b@`5!^R&kGwM+Iw3TYUs%*VuVP8DDNl^hC3M=O$ zGtfPm`J2WUZBlJ|qUeEJ^_A;RXJ2o-&e)2L(OlmE3Ah`+vE@E&*gNQSDG^|od=c=# z@xrw)3LShCV&z&Ts?J_)1LB!V2N2H?xdjj}Z3)ELGBV&KYkzl9F|R7h>9CXRK7q;qWG}*!%kb#lCM{CxoujR zY2pW+l?=a^i*Lge5wr>?Zf`0$7*__)?b7OSUO8%EgqNn4moAozy=32Mo6akp(|N_G zqyJR8UhaLil6}AJm8UwF|0!SoAMnbyd{>t5+KL=0!o(4DTwZimnl)n;{j~#hz8^7GJtL&6K-raE^#!1f2fw-})-*-CueaHLV)Yk9W z&K(8|G~R0k%FVkn{*gJS4+7JZ-O~2%y`Asg>+kNG-o1TS$2@MQ zGvB>^*A-JT-{)-kW{zxa{P|njKKW?J7az3`-qF@;v=gvV2W)gpz=o$=>x(l}AR zsnu6&zYC#-gYxrQB~Y8xc;mZryo1uC6-b>>4n15;<4tAPMRQmFVF?@wy+bte=taWl zrq5X)ze*vV<5vmdVCmD&B#h+uA$F3Qu0&)RV$w1}VEtb*QblfY(Lz zqK=Md$J<(`&aIOkJpR_uIQpG0wwGg$Jt(Oo>wKys-J2Xp)4|r@#BYSLD zP975bQ`I-D;EHiLs_B^JW7b!$wv^s#O>woK*p+`=BMltG8JK9M^eQ?Jbt;XZknCAO zY=dkG^1&FD6Nq*jIm;(5y4Hh>$yZRy4G!bc;@VKEJE=9e7J^e2s|x19zo7<@_4I#_Y0VSBXZkg4%{9c8sdzUUOn9 zRY@;zS9U@q;_h7;|BTX|*_EBS%FkZ9{QgMaa?tRr6AO<9cRwXzOyLpc8JXSNMg~6H zNk2d9^z;69>@PGqX#rcUcrK0T5 zRq}}hK;dSJYGiBfWHaiJEo`{zth_O`%qrPCSrGf5ZEL$S{;^IE?ckSnEffsKLv2g^ zp3WtH4;{HG-m|M~6ZhGnaD=Shwcqiiw!(v@J{%o$rX4Ad z0_U2&Z&z8vH0W0loyd=|K`r!18~E?*1pj>w{$uoW(OYVvVZ_=e=xb`BVHPMzwNH5G zCw6s>p+mqmc&g9_dMGz4xkEwgbC&|@=VneyJ<&I@CgMTy*XHUe7)3SgG7bNW2qqaG1>Z8kQ69OrLD){E=Pd-XCExHY|*qDqSDj_0+EHWBj@86T7lcY_?X% z#|dj|NUQ5xC&)MM+*6yqxK}-GnJRsv$L4T7G*6>Krc^uVnVqf%O^X2%4OoW|Yew8p zBSyLHwlJd)=J{UTHyRL%`>D1$KU$tLOv;8CKjToAyvC=`HOCI~KV0kQ=Ps;ySg4}F zhLw79iu^Zr`3;4jw;=*`Nl=1Y_=VNk*jSnQY@QDc5EV!AgEtND%ksf#uN<~Ym9Tre zoDCT$9hE_}c;}j_!7T~89S5)wP%=r?qAK~osq{b)UhtTn5?rlk^Lz+>ta9|6)-wr3 zHk;b+ae=Gp3_9SJDl5W0;7Sb*_*71)8~@F6^7OP%`M!bwF`Qd(UvuR%~m-~F%M_%as$P4}v{b$=3cV+zJz>M5~UH0W&J(n@} zcoB%>!PtRuWLar#q*v-HQY!ZQuIB@&nfl$XG?0hJjEWHRgx=Ki;rR9uJ%d@uv8oU| zML=vR`C<0es{lx$&|_GA=H^?K0uJcb3^z$BMP$ZPGt{W^qm- z!ZP}qvZN6lyqgUWJotWx98Gz4+);r0f!k$yZPlXnR11C)*13T_?d;4#cwZL}8X3Dx z{CcTm1Ee5<0k^ldlVPQ8QUm2V4RlQD<+jfK<<9*boxju8`H^eOy&s{r{D$RvrLFt- zwYoQ4AFk)`msax~!r{wAxsr$G%j{Lj%%%+HUltaFsc2?d`aE6;9IisX}|xH*(! zE5+ZVh`(`1J{u2=^9OGyjC^9L#RZHxF&}Aq?>^7AH_Djwr!#r^Sn8t zs%9BD$(xxnn{e|c)0ArBqQ`V3GSEeGpcG-lAeSWq*)44#h=X}?M>s7d4(7!j2Ex8J zd{M^@wJ}1!{X!1@zV-SICitOnD+R0PXZlaCLnyHf-q4jVm&0ie9I!42Lw``Vus2|H z-Pe^r9K(RHMK{(+K;Q8S<|y10<`&SnR=1U}=!Ejd zZ13A=VbSMN;#aa8i&w~{;;kKU{upwVd9zfqn|9`B;d$_E>FCv;;W(g-Pwd6MooO$q zt-UGeH({p7DFj1dCEH(gCqswYI!6ETY&RmxB|6`|Gha>!N=rvq1<7#B%wf4^n|G#t zSO|?BFAzneJP#5B*y!Q~>B!XB@xtq};Ulwi^Nr%Ihj!*4h`Xj=rnY?dPh_*>^IVZ2 z91~LT@rpq^fr5+^^@*MNSHeK#4+`!{q2H9vU}{-CJ7C(I?Nv#_mE*RrpWT^%Hw<%b z`a)|;yS?ER9BfSPMXj4UkosU%&NsKdHM=Dvp(`p=yCEmYrO4X+U}yf}@X})X4XX@4 zZW#Qn*-vGIcanJ-63by^VmEZ>kA`>8(>_HF68+He-T-S`mhvju&D}Z?AzyAw!Ni3O z*zx)sv*8K)Chiov(49YCdOb1G9k1S=sq_x7DjpMqPIhm1{_)bA`m>ds96DZq6Bw!< zmF(GWox=pMz1PuwB z*^U@rp_EYm>CFaI^sCW^|RU0({d@8B$H~& zk_iUw$e#{}g;RnF9K|??V&uc zY|DB^VIluW|L@_-w=CB|_jB6zNsEs6NJ|gQE z@nPztUh(IulQ^`@6Sogu$d{4SD*83WW?LE$p3M`chAz`dT5EK9d7i3zFno;i@#@=W zy|5O04?v+0Sx_!Ei2x@92x$-0odkjMq70glY_Ex)2srPzX~l2344*&YPd4$kkFjxoE2jX}ALwgNGQ(xwl?R~=!Uug>~ zA0qeZvhuIl097{z5_nH~M9o$ilc?fe8%`S_HwRE;dmnDpl{<2|aK+WfO=Ws>z^Vfa zmabFfx$VKP>O(h$h_koQ1zN>6hU=uRkEvClI5zp#+-Dp|CTN!U{U|r+y!{KJUhtre-CG3 zJ;lClU=ETuqD76`kWWRK1j3S5Ja6++8DTJ=)7BnQu+&Fh75vtyG za&r8Dt&5b*N~y8tMo>$1)0(v;m3$BOmwSX7707%_W&j6HB793eL|&+`RFA2Ir4m|N z(jd|&DuJLJm_6^o#L_)vihP$9E1C||&-Sz9rjPIgq6Dlsi}T)o<$Yfv**tI5;3O|u z?gT!q3UTc5qEa!D0b*@+|I+!;`S+{ReDN|_cKEoG!;)z`WCs+qmW*S;Gbky^UdV}r zvPHLJZNNY=l8`V4s=%T-9&29$1mVrP1CQT&okC62-x;)q$)#n;hbZ6h*LR?-x+T}K zSQdVrYpyas?6b9>rijdp(l7F1!|rD51DgQhN}Lu@ zL@=_u^D0Cle8UF`N&jLRL!jmJ!6&Gc84!$dhk}@}(%@8yjk(r%?#WA9O!mU;>i!uB zS=f(x7DnDhwoRUniq+jlCl&#D52E*K1Q-sA{Sf%)HwLV~k%MbsZODn9*pyL^WbMw-^I@>U#WLwp_^Q0K_ zbgovNPzZD)w~>5r?S;A;l;Y44iNkJ%{LAgHme|2`vXJJ@Yg*BPAv?23o@oGm^lqF~+g7F@&I?$_fCa<1W;Rk=W zUe4E1H$3vDMe>EzwV0NON;5#OPPGTe{%XwO;`zEDfRo`X)J`EiA0lx$8M@|JqsbMP z-Pg}9x9~pMWtC%}RAhDAi}+q$gr&ar#@p((>Yb3XW)(B@`Dw&Q@-m;-%GBz`2PaqN zP$kEA?P?{@^p(FE(yB`32{ED|EH^pOP`9}%XxNzZ)p{H@LUObd6gY&C*wREu+(@<1 zem5t*UDbp}4XMR6YD{qoH-EjW*$A`2>rn50u3A?GSC-*CnR(>@Qd)79xDjiR-mT^9 zd49Hk$ne;Cgx0rr6#3!$j?6Y)%-Po5dQCV`+NU*mUn;dz4!fvv-xX& zW%-Vs|Lj+mpUbYM-k-YtJ(#fAv**{o|E1LP2lQ+oFyE2A|I|BHUlT6;L-v|( z(63Ytr0Sn2uHKlmx^=*e6rLiP^m!zpo1a7J+zPA?j0%>+S9V~$J;+cK_WzYn+98e! zk^<|(l7=gy#KqJ`?9(EThKbzi-0H&q6Cu4)L8fgpBH3=^KFGynlo+&FB70eLnTm_^ z${@_uzlKx37jxQItB#%Xb^pPRLnFU2V*Kle{`&WERV(<2z?}hYJVatUWT`2#*ZQH1 zzt1R*@8U(uaMV!jSXSx0>)Vyx7AiDs|GOWKZFP~9z5L(rpD=}UcHav>@tyzhGxzuW zhQRpe@A!waPwuGyCA8z&oBzcx|Ngt5c;%Zo31)}>(}Ca2zxTnvD67Pe{k6~cX6OFq z-&X(re|z><{?4EN)n)ztk3avRU;Z~=`3pB*!{7h@7k}y(U;3Hx<9hek2Dkn4Uw!Ms z9eAr`$Ntr?{jteE-}7npdE#sTy#Lex_#d5BpV$AXU%KhlkOaTuMOZo5qVE5Pl#;N6dHO|s2wQrsMmoGf0K2JRJg=c04{`D{E@4xaN zCw~4{NB-%D_4j{#;lXGB+1vi@Kh@tq&j06?_g3*#umi~LF}G-Z;C?$^K{Z_)IDPu| z5p=QV=PoVeq~6)>D94^7K*OChs_MY@tB0Rv(5$!*=L%f(YnC!`51)&qDyRHxB#`E&w2 zTsmGv9CW2pi(OU%Qt7r^%bc>578~bo943^N23KvyigzknZz2o#lvsTudZsy8^xM~MNh zK%M&zphc`~QgI1a8P-?~wz+!ojn(~ctzI0q_t=-1@GtPmV34QgmR{3xjvbz7r*7MS z+wE_1iHECwNutbxjc{>zsPsZDeCVOk1@HK9-^wa6UJ}+Shj*Cu%nm!6esNq{szL zEr!QZI4^n2X5;Bg?K{c@e}QcHMty5pzl#>|qJOeFW^5(A5fY4)BCVeSVj}q#rdP;~ z?wn5WeXLGbLlt|wK9UHCHbhEq7tE%Ay}gs_a;#MAfzIwP#;%h;+v`l_*lh};N-Q#`-PK_+ag$C3s-~mMX+XeEqRtv*uL4?p;HQcX|1-ufBRLxKL}Ma zV^H|?c-JxB&GIMm{P8S5(G^TWxfzDW2FzK+7}7i&sb4lzVyhR9^MLv#jfTwi43xDZgxy9Nr80`6mhN^@O)9 zl+~2r9f&6Xh8{3hHR{tGvDb8Un z+>8=ty*^0VudiB{S~ghyNyL9zv6^Jt!xeDi%;`yCw2qn;YY@&~m|i$H4^|?cGhZtz zr{5*`DkKWhfKWI6J&w~nNsE_2qU1;z4-jOM9H}btQIiaPV)Wkh1&)|12;4{n%*y&Q z>KZh7WarnNv${l3Olz<@iz5^_-JsZRg^39cNxitLHl_Oz|6%vdT#I1_=I0)Okn_U2 z#NP{5Jegru7Wdng0Vj_5Ow!gh=ESW9T0-K<+T+w6_8J|{Lg9*4g)tiYoJ7i`*l6y z7lMe%?3d1y^*K1TkIT`^%^OD$EUAT*J(Gj((;V?2%KFZ?T`w_bvH=@Kv7nnPBqS5y z{B7pfTm;dPj7IK4t}8s$t_B4w_f_?hBbW-<23I#K{LviU;fk|bFLy5=)S=VO3)1=r zI^c?}z3;9T;BeqX3z;ph-L84BW#6m5T{NA|pH{7uMiaFOTDqW(h-v_Iq*8uG<{irC z40$cj^}f1se{wt6C)k|g6Qwx`v0DzM(abefp8i0!e&(*R@l#VrPTqBT^3<6llgCcp zHFbLYZ70U>nw&a5e%IS3kJfA1?_wXB5s+a3X_>IG3yawRhh|VRyOjbkSZt3#`5M|i zfRr{x>3Qel5I!3$AZsh!SWDIV5K^)8ST@L_&H?1ePQ{);0>;j05y7gohNh*wUv!jn zH2L1#76Zj7=oFnQDS)NYa(ONIff&d#8rf}#Tw6suYh z3VeWNH|1;)7}S6URAH`#G%_c7-gVEUP#y65rm>_XyL6U74|1p=BYZMC?0vQDST3>& zK-zbHt`i**)~H!0al5N6AzyaN;~>IfR~@AqgQgBKXi)`5(A5e%Jn6O-HkvKkGH7;z$J^o4(A^ zp1CovBnB8|jcV00C=SVVNMS7#GI))e403^xLP;CwDl!gR<8`vMCNzn%+R3m>pt^L< zYM|ig4yz^Uz>kD)3_2SXq5>Yqwf*8WTEUpegg!7wUT0(kEl3$SxIEZY-3i>6QhpR= zVoFzgt5!YE)Z_&mb+EgCt9lg4C@GTT;`-pMjYJtcA{=h%{`Ihkf-oYgroV3YT0%`- zFhP^eA;o#x`H0>VO^^G&~%&bT`R56+9AAkXsFuq z-U)j-mkt)$_^l$RXi*4q=SwJtLCJWOZANxF!Z5WA(cS1C3uwCH!~+J7PQxkIKjpX& zd`fk6L+*QPzdiS?(19Ltx|BxktlZoSt8SJ||`>-!T|EmCB0)@M4&TF8JwHmKEy*_Y4{>?go(wEuMj=m5wl3 z{(q5V7mE^zIz9ICnQyJ2BdX2UA&zkY zUdH@pw+}e6l=?pjJxWHTxN#7HVMy~0PwuQG;WZBg62k5`0#`=95?uw&#$g#p6(>AY zUH&n@Y<8R2A*G9VsbWAj1B=ru8LSFG5x%C5ofdSV- zoWjfqRICDunTv2Fg5IbM8@{#*AaN%z3r$#SzAp`^nFfV2BJS4}u@z_|{2X%mn|vig zj9Lcyr&^z>>&BN@QNOjizsh4WkF`E(8P7pQ zF?q(^ty$+lM%i{BCOZ=d8Q{up=}lWE$Kc||H7d`Rm-#m2+NB3-Im%#)V!^~NtSz9Y znp zsa8#i>5(OMCFJpsN;TNgOiA1KgoGZqea%}MqfmoLSEfis@T{rj&*%9EDtl1%$>*T| zQ1-2hM*}sp4XZqD8y0*LqP9S|E}4z0PS8!0ofx;4e^9r3^ju~WgS+ycVRLdhMv4wO zRgyXBkPTk?AG}Z|bs)?cW(^@r`%QJ&a1bC#=JzcZ9>16_I~cTU<7gnV*gL#B6?xB^ z+Ay3;(9gki&Lw@R%^7NUo|l0AVg7u$9)OCA68AqSYjo1YjS4tJ-vE@z9(T1nLe;VX zv|Qt^-pPim^?H2~ozlYc+UgB*p2`6P1~ycpBZ}t z+MG5$!5wCm#wP&Zhtsoj3kOd(=g%KF5c(wNdh|b~N*3g{3y!&^4&fC=*|&``hPADT z&FZOEAL`RI#Q1X*jmI>nnL=+7x2J6-;%3!79zYf8rK0{LTcFjgmdDVr0Q+vR+>Afa z14V&^I*z8UL0bdM7B@9)VZ=5Q54F*b*by6S+O37WS}(6~-Rp2pOIc_Vie8KZ%6@6$ z38mPKo4mpo_c3@x!nkfxAcQ{_S6e>~HaHgGM*&Y{$PrP>fe}Al8;$%~Czl;=2y^QR zM42`6ZL$kY{6@#vHDv~S!2EEsC!r>NpMw>rKI$AydIQa_6)P1pZ>~aV4I*f@TOvR~ zo-(c<_J+lhmMm2C3Y2uv*+!>fs?ydpe=&KFV1DPP zFY5N7gI;}?u9MSvE!1aMSC?A{-tdMC_$#fQtAQ79;Nk)LRorOaph~{r$7=HpC|%~? zaO-Vvx&78R)T^hAo4_##rK4cT+2FOBv7vUP^K~cD$5-InO`TchqV@A)3S978lev zyC-F}j{jE$1x4%e&=uEM zPqTqZixVX&Bprg9R3vT((5GDVK&s*aoI<;^GS_~s!hf*C!g^!L zQvk|;<+DD>oa1r#Y4`L7Ebf@M%-KVJ85m$1;dJ-);kRJs8#{{~ zvycJB&$kWKRoOntVH;J2XOuxi zSK0W+U6o&|BX%R1yH7eNMNAq2E7jLsB>Ab9ffrwA)MN=qL2-O@m>cRbGi6=gpmwJw zfiHb5xp34?W3FIvyQG)S1x@>gZ%Cs9(UC58<-2mb@Ou}V5*jPP#WBRj&wWNYJ#)J+ zz_J2Y_O0Tv51!=6^r7eP}=nmonUJ=GXVjHMmi2 zTPWyvS}HUNT$zZbf^8qC7Ilxp>y2f1fPFovXR7J2ZqQ#bL#1V{We3GkuHY6rh_?_b zw?ox8yul2k5!y!~Kyn`QgrC(r(w|eB?|?r3)7fNttAq^o8*+O$d~Zr?c!wO`N*M`o zozMu?*H=p~wqemv|N0dHV35)`_WiVT$zTNpE=a|gs!;T!4TP}4FUrIekU{rhftzk2 zg|Cw{I=HCyN?Q%2bu1+EW-gTbrOkw;;i{9m%~&a`bF2YMUC>2yQqvkjYZsPXpTva+ zPoVBxh@};hi3frV=mwLl)ug1cj>s@bX1c3@446IgLSVOH%}5ylB;slo5|&60o0tBs z^t)b3sDRc;&<-*@4C{2@6 zsa2Z{nvi>>p!*9gd%X0o79o4mTYQJ7eYfB32z9{l%QHsA!E~6vH|wq znGBtF!UhbdVX5IXp61Y(rr>_{@U_rWDP9eQdBWck@3F&JBeBKeJ*Exr$<1w_O9plX z&dshFUU?l$+M0b`WKX5LF>I42e}zP)tUzEwYuQ)Img3W+caDcC*GF9lKL#_$OdxB< z;YoFeTM@gM^pJvSQzggE8+cV$v7e*60K&l?3DQ2?&DA)N$4OD2$c_696Wp+7@@LTLrk7OwWsPMF^sPyKctn}X zOnsSWPvbOS&$7MkeQefMcy;5Qe2U-qpMbMAG0_adid_;iTk; zC`T2!lWohs4Ij{lZWJv@fl33|z+pn0jeXVE6?oH$Q;KL4eI?^YROW;OUCY*-ejo5i z50-#?48h5`V^X8|X*S#h!z6VhgjZiLQRVeIqS(}RPOLz=tspx1*(Cu{vygA3%)90XF~8FVfo#19GGgc0rL%AHFqB{*Y*+SB1zV*>5Kl3Y`SYDNgkf8$2t z#(or@xfsG;G)LZ^TjN|WnHZZO_CX@`hiWnyBA}9K3A+}X4;HgCvi1(VuQW~ePggH^ z#8_@K&@IjpC~)6zjwmJ71`-965_x;}9ge|qP_}Io+RidTaz~SJCOE) z4*!WWJD&g*#RBw4c1Hx$moPdqgs;4BXLje))!5!;BFsvQ5-IX z))d|A@5EzB`hT!2aN@Rz_7Sno?vBpbzV#46ZM_HxR}9x>Ofqm%QfNg-NF)e5Kt=t^Fm(9T} znU$Eit(e;fZG*uubVcwdOR!14Sh}1wX8H!Oz}=}lM8QIf@zDzf=FgWnJVR!K+g7rc z@#W*(hV!^qqGyrV8y6&A`QiYLKWN)4g9u)bYmV)mA?1c#!{!!H8q9$mtR=?b&w=nq zAQ^zH4pSEF35J&)%-zXzoeSmUl#PoiSKUE=s$EY;Hl#j9g&Ui~R|DXA@s^79>}o@seuU6iY6qEZB1T!Em~y z(M|9P!Wb`!T?Yfg^W!8v~fN2(--!`c}(fhk>4^3C9eeLAgix9FA=)3GPJl z#x#8?@*Nz4BOxIW<{DvK9n8DAM@paV7GvCc?IQF0v2E{usQuR+S)kC?cVr^9|5fkE z;E6K6GHn-k-+gvHMqv`MOQacNXa@avG9?NnW>-OC@|q;gbfZegL75YZz+Jq;t>bC7 z$1YH?13GB28a_n2Iv@6H9OgB}n+D1AKXdms@OhTy-T!rkl%^$dVHPb~^ahF~EV-Iu zVI>xA+7ugYAvED_z;fSB?zWLMDY+A99n89+lRcm~biO?5U{i;R6CG~2>BJ4^8*KPI z=upw=h8x>oH~ddG-?r!Z{*L23uj{btkJ**^b%lqC0kUFXYj9`A1_#v8bmt#v)! z7Wo4yvk%)U!$ZDEGtH!N!g5IZHV?in-OvPOZnh}cEx+h%(HNe>5w;GJx}qrBxHww7 z#>x$gz+JtwU*+Dr>vt;cN^Y8rluA(W-rJydM<_vbrpRIkiN*+v7>pPkDe1i)eo zotg5Gmkwmk7Xk_$)U6+jw zZW|uu_LSngE34!gIyA%@)3j~bvUJ6=744Wum4ifvF$1LM1MwV$@}n|ONp6xpYC3zU z?Qp$JYxSjbCdQc1Bc`qbN5Mkjqa-QNbbk&oKw%49Crj?H46zRilj#6(4cJ}VBk$Z3 z19-rqEDWTb$ck3Ju;su={Da8K)3U$gs5ZN047tIhopLmuCJx#q@H9U%PBO;n++T6c z`VE4KnD;tl*ctS%4(uQ*az^W(?_e+x8U*b(%Kl>10DDA(0z>w^M1Z`x<^t+L&H;X@ z0p?Ld7qDmtdy{icL{K=Xa=r<8Lw&!AmPOMQ?@Y=`8*qy&i%jW4ZI$dZ$391nP?#~j z5?PDUYRZvLhjl0$iIo(oGEM8b(_SzQ&>4uR44hSxB)?j~&04MLgmc~Rr;fvSR*n=h zjs|y*I{yXuF6~no*o5!fODMW^%5u1yIKt*PSHj0XfiobgO014ULofyUA%Vd&lOsw& zlyX}1npPydjM+<(O2K2DuU|`$t!HSKU5%`%>MDx(ts#vZ$ELfXwBWQ96$sAa_u>n~ z`Yxx{%o|9sK>in^3NAuQufV`%04<5{hQyjzn;@l=UqLXIdq<^88xItZxK2$xLbQUu z6KeG!N0qNAqg(?+S%Sf~X&K;EBjjLhK%&;OL0{)o19W7*VKRBD>O^;@P^WJt(yBY8 z^xot;#f+F0DQ)xQL<_hG!y=lkuEF1r>|CPtr^C(7SsPFE{|DTBa|uBVr|1g3Y}v9C zR-6bgUwvldl%UnL6~4 z9r*!JknoF>-=aj8CAgCEUL7Iw0;Hpm!yB!qWqo3ox%r|_@y!&tJW>gokt9;!!GT;O zs|Mcyh%G*sA6bIDh)Z$sEcKWuiv7n@6rw#&i&1CP{^1AcddM4pN{I~{T`9;#0=mbO z##ZB;7e^&^7>h6NTaL$7$J3p~W0qP{nI93kGFj>BvM9CW=W0^BT!UYF`w$uC2#3US zm2;!EIjXEx6Ik+HcP`FuZ3Cf3!4-#YNKrC*QZ)HG3a}!12x9mkN3AbYR3pLFq&O%T zK3-?(X>t!y(NP>+UiKtXM&gWP-4J4;;ecL^oPj(0U<&OgDlXz)>aYceODs<@qNp=I z4oe8wj6b)*RAFr~4#Nxl2&Nr62z-%Yqzq+@{EEw2VGws$c4g~~6=eJ7_D`M4I(r>0 zyR#kE(sP%c&3Sk&WUS;NqwgEs2}CYfjs-g%Jy`{gFdVLE4XzJRz(9F7+DDc=YVRxf z7&j8bq|k_a)k#56^ZO`ytG1kKrn~OOv7NZ_0xmafLVKy8VA~0f8v!fCXsv>P2(QZ< zI8eSIEdpCsBYIo2z!$0Y`IfYQn@}rJN=1$8LxdU@%J}5$`22oA%ma-|S3TRC(TNR} za$28sXPYmY4uN)CtR*2X>+D4|w%%ubRh!O|Nmi}-42|q)*IA*ghg(K?|oE`2z z^-}AE-Ujf|c{eo+&6-oZ*F9-wZb#Pd9J1MzHVleJ?5F8z%wgnKl%j3r{*hot!3)Sq z*<0`bDCV_W-rR6o!@M?^GbosX;lgJiQN87$vVkZe358u+TFFvN-MTph6rvdOr9*n$<@bEF5# z>w$BtW`01G)B3J?Il0bwbjw*Z@dlfZF-J&2a6jxh!ik$I@rw#~g`m_*Nd>zKWu}p> z)jRf>cw+a8b5|TTj{OAxX**X|-Wf2EhM=H@_1vTS z$!qIChoADV?N=lsu<_izaG*9x)&nZ_XmGR)yN_#q85Etg8m)9 zh-v9p7YY%TRzz-8Pa=z-`vi-ifj$BityOwB;XgP zeRFQGmMiHND(r3h4T+SZ(;ksr__cH*%SmT=QcwcN&j&OY7z$=+ zUZhS};jHFyYtfm~*?WU-1LOO$jq1fdHA?3^_C7^_0u$F42Gt{eY{Y8bNvuu|Rjc4Q zXlEkq)2P*Ql*k_Uph~{1Mr9odMFn?pw+{x1Ppq92sUmxc{RYMdQpw$080F=`N<-nn z>+)ymrFQw@_SN8=I#+%#PTd9jKU|z06D1%Ux*CxrAB4UB4xl zGIa)C6zKA$f1yQDHZX$2rrNWNGL3Dl?cydY1^c77;(?H;0fSD!Dm8tk#!aISHO^%sS1*@j}ZE|J_qhY zs+JMO63fgPB%B0#^XL#H=P5*Pgs9J|Tl6RQPS?k)SZ&q-xH;t~nQ**Sq=snaHc3roj##nY*||pVJX(6kFxE_1$t%e`i#S^d z%l&yF7_76&wwtyysH~S_%x5!ZXPPcOsI(ZsXkt~biC^v}1Hk=lVxb`?EK53q{!n0> zMVMKf^GB)DLf=^SZbvPYrEMK~Z$1+zRlFY*{&KDWRbc2*XhM|8NHJ9%<{`s7MSN$a z=Ax@+J7BU4-K1W5-E)^6BCObwn3U};xos81@~@WPf@i?&2juPzkp=nXi~_E$*RBFV z4DDTnsN}`RWH>ST@;m0H?JEh9EW!VP{HP!WIc+6O$d^?3_5g9z0)uly%@Sngl~PP0 zHBzk@Y03G@)3Iq70sjNuM|RW;XPFC$_rsqOnAN}&T; zu<)bdoRDFecP_~}i~TLdEP+eGE}t5=1TIgVTZUGNETiC?OR-H3j(cU4*}_SU`9U>v z&karNGaXp5oLf$$T;d=|^WWNN{3%9Yw%>+rvi*h}HFPztJPS|^jWHC6byuHd5y*-$ zO_hWf!boP&Qa@<1teq>~h#jL&nggZI>OM%GHD)50 zy(&PBqae1!Rt#1W)4oRm@AejXa80f-XDD zjtm!28Y9mJU>T~+7c&S#r`OVM>42xD$w+3QNY~J(#UiCy&xl3Dc6l?r!%P)iPx?Si zbn#3wZB3(q$}Ts@NspyecSFL-$@vvu)H1lHwWge8o2V|J^*Y0z0Q=~7&zIK7`nI~_ z>gN#?UJu5M1UL%kq}3UigF?4~9!pg2Z-w>1bkn4Q&*U7?CNv+{qf%hd0mPTU4_Ok} zOB0eW){hm|?KOIOfC@xE*>djaI|WHtkWCR3k?4xb*RKs_UA~%^k{3u%P5EzdGl;td z#}$ZKIE<__QaCkop<=c}`D4~Ys0fb=`yla3uYWy{fyO{y&gcv<`GQD24TIZzN4DEn zk*;2t?MqskVHZCwOLMZpfcZpAnU@N)kW2v7(Fdifm=Rf}14!7@nCCL70gTcr8>E3) zezK)=(ET_+-^>~%>O?HJ@5B}`(d%iN0G*#qDGX=n<`<~pl3u-RMZ&AFRGlYbS0o3x zXkD4yCS?ed%Y0pBzES$g4-rnLK#Nacc1niTQDo@}E$MwpT3b=vb(h9V@7AosTv7v< zx)|Us75gh9eWab(o5qq?vkjq(rPDx?OzO@1^4^w?xBZnaYiBKQN{y`S!inVHcaxBf z9~VW2IJG64wSE+U#_I{9X~i+XexpA@4+8-oAyXNXGD4H&ur0mntzu9Kd0u*FSU%bo zDz2W)Ngh*yi_}X^Ypt0-U@No%p9F{UZX5(ggfv7orff$iHn$X^qi0cbNT(FtaEBey zeP1NtQ$Uqd1lbp3t8ukp!6hM4mGr0=i@KiCQIpjLz9vlQBNMDkRZgf5B|kG3o{b|E z92yi$*1`yZN$c2?@Sd;{%|;qH5&U*y3rNnNperQB8zN6 zj^6aWX#}bvn39aFd#ZeO3)(2}7wO&5Bmep6eL&BVYt0h6fT~s@>tqLjxZ}q5s(z&3} z(RLK~rEQ>J2p2A>*z#W$w%vgy6EW^K;jw#gBMGCtzxCysyj(v)0A|Ov-j% zuRUBx2X!BH>34bti@r!p1uMDlN=O)Dl`$tHPt&xpDZ)&yp+MZ=pX-p+n5`W+z>+}| zK>A88=ll6`gq*H5H}3>y&Kn3wOX=c_l{=u$U*vxXMA*B}>6) zwY}}Yd6ic4V8uUK_;kJoF)v3<7Ufy=S$btl`tYhAdlTmq?aXk6oVQGEPW(^a@av;O zYc?$5u&S(c3u@BMD>^$*$MJ+yk{3#0Y9d$&8+SQH8t|p*^WD5k916B)TMX^OG7_1T zH9j=)`W2M}ht|!_Hn@cML}wlG{#~@t;N_g8Ge$13(8%f0V4echRMAA8nil-B4ovRg z>w`(O#>3V_e?k7R zK#VQ3R5m0hsM!j>VFkRYaa5i%>>@CNjC)L#D;Lk@@SBcJA~1lQTF=3dv;Et&uhG9ghQ8F{hH38waq1M0qDSPUMyZ&zBo?hBJzR1v|U zhWllDE=ol+(f1C1$95vtBg3A%Hw;k0bBRAj-r0TxKgN!-_V*%Rt?v*hfsDnqlMQN1 zIyf*QQpLSDB3y29Dh_4afj9u7_GCxG3s%yC5m@+;siEc%rOJpgStq3NIXlfT0$UB0 z$Hsv{O#$9&G8tT;3KF4b2>sNmx=I}^HF*d-hXYoUxetK>p^H2$p~c2#U==*-$e5E_ z$*C;;3~6F(cX=J^L@h0TU9~BGI={bJeyn#KHc_pvUSOS-6Hm}v%IpRX>nhb^l?|cz zjQKBPn0HTYHXAIa86r^yYQb1(>3l%q=59=U425v_sqlz=98s#gqOL{9ap(7EU85?< zGGB%gD)y(}W{ghUQKPIR#FnF88())?yEb9vxiBv3J2AnVC8WUP|C@^gS1CKvP=ae8R5$at%gR%#zK=&~0YBnDhkZ^S)>A`bhK1OZu@Fn;8UTK`#=Ky8-0%BAHX>n-0c$bx)pyq{-V7R$G# zR_CY1NZ}Y&-DIhHo$kTFcH$N=hYq!*lj*9#k-Uj4@$=9kbU_EU*0Ta!W6uZg%iz+| z7#^~-rji1^AElOES5gA4KxFD}wieE7c#b9|6$3{opEL!Onoq@5h%m77BFIM}J%kp1 zb|Zx2*C_5^RDsUU!%sgZX@ei@91D!{*0Ukxd~x&)2ggR;#jFJS$f7miczx-12FXcLl$PMO?7srY`h)nzL1WobK&BM zP^Sr=E_fTo>Z&@8;i3a+Hp34R?qdpDv}i1j3%UY<>I}T6uCQ;2N3%cLP^`O_nohW< z41b7S^EBw~q~<8jiM_Ji)UkXhwogPq5&>|%`566X|L$t# z$LYr=n>TW^9{+E-<*#1Yp>HnP`Zc>2aWwo)lFz>N1@=n)fs@i?J1Ppb(n$aMggQX6 zVJIEXLi*~{#_9NnPfxF+s*%fIm@a90TtOAXpjCO%zsSuv;gykH#*%Xhc_oA zgQW?sQfq=R`uMJo|G5!{A<e5Vd%@#f9=a*aeVD7_UOky|6Y5i@}@Iv(WfLmf<<}Bo8PeOcM6u9#Bn3>J8O+B zWnj}?Hs1V|8|{naJ)J|4eBHmJdwS=2xG2y27 z`orHOBG!43c5C)oF4u#KgJC_nKkFdHWzuTSLZ@)lSpl!9#>CW@LPg)F+n*%Yukn#l zSVk0oMdL39$@8R(_dJ&Xod7}$Hxk@$3Y0h54>|@5u#liu5hjSXB9e)20&7NaDCL{{ zw!(h*+AvZNEYFvQb1cSI9rP^9Jk?kwwnfSCYU<8b;4DxjU)3PJxX$Q5V;{4~Z7g86 zu3o@yhogjrtn7i@m*sQtpeHEDS1DmmKi`s`yS#O^nB(NZjn^H-hg2CJ7>Ozl9=1lE z3V9!@KS@tqxjH|-G@fHy{6*N4oV1cvKHP-z%?-jLxJ>VN+b>K&Y8xnrwtq3E2KIfL zoW@}7*BK_t2*7P%ZZBRH;N9V2-hI{G(j-sC?Kt!-#W%PP(DG=CIp0 z1yF@Z8-B*gsfjH8PD?tlylrsj$HIBwl3MF4eGV$6*rdu1A44f zwQDr4_#HJfDEb;792wyB>h24x@~#uj@>nGoexS| zW6W}|Iy>Kc21bKl80^_to{C=9_Wd$8M;n|skhf@F1wnl#uRFM^$tY0}; z@X_#_ia(Ir=m`xOiP-MhJmT@znpQ&WfXcIDCNdU!!x{1NnR^BoT=}P0(R`xAOV#8`rR-?K=dlB`#Imr zn68n?Jeh(PTio}kzFQ7uRw^e9?wHy^tr*(y6vGfm+8+%20%C%WqM0xV5|dq8;Z|dr zSoM)7+Hjt25{3)pxOhCJebL&?v(B3_-EDhd7w2-9MQF*BT~Q{YCr0?-G<>QEFaJP6 zf_6J%6XM%}g;S(Wwdg02G5{eOM&5i0nx?cFLb#43&&7o~s%S9_MlT?0#QEXu2WTta_Z+JoX z1k9RG9TCxSOuBPBw#)9x5QDO2-TD= zB9&Ghd5yEl8f^WRt$Q&ik|G(%Q=BaD!5aZF09v_^q?Yemm40tGKt6 z3$R;Haw+Q*hWGRF&`Ote)`kBE^Uqu*wn(3KU9u#C?LO~dy)iyJ$u)U6q3zxMdiSvH zlxwu&calt&?C+~ljfGY4nSJ4#str>2YaIG+@vI z9m#YKnz5Phkyd8S;LEB_<9ir+P*NmBBm$|MUmi#6!Kr)w8yW&=$bqqBPnNG_<{ zzC7s+833?vJr?yuX;x_B<23zOX`;F5;d!MT1nHRZCGHupwyZ`y6TzFWxcH3W1?rer zD~TU?mb`#U@`Y)u3zt|sXk|j9m4#nSPFJ(R1^cNTOj`y?ByM(TC>I?Hw8%igCOlzc zf#IuzW`{rw9$E@Sa3zTg&`39nrkq5c+15Di7xdjG=j}2vA={@|g z+Fr0I&`gQ`&4AN+?6QY;)Tj5(?So=A6U?y79Q~~5KzU$JCAo31aAUbzCT>BI+(&5v zCMySpj;EmhoXh~*E~Y$csnr`0O}9G`Lkye@Q9@-w1jx6pgDqZ6uU>gdvOyKH6Glhy z>$LgLRhx@%7cknxB}VK16_v+GWKuF?R_ubN8*cal;d z9H80PWj%_OHhnB+>38=PQLE;m$jc~iPg>5h!}G4>*f;rl7qWUcMy@Dcrxjw()JqKC zFX<~Cc+T)`B{XypyQlSq*1?tn8FTlALjzn~@UPX3JTVz$AYvP1usl?m`51pS>Cyz3 zEIsL%^rGc$6R?5->*7$_hRMqiMm(wD7Ds}h!zD&%i^@WfL(njE+*7LE&}lkI4D`{ zL0r7pGTr0h%2|G;D5OP{Rz3Rk>;%@*yn=J4`RaVlJ)>+sWIv?GrJ`J!n>#ObW4ZEI zCSoLg3MIA1wJUgW#`A2+=#|=8C|`6(R(oPHPzgeV{S2uT2%`t3g_5?QiXAu7bng|V zM)lhMN)`9XII(M&UFD2*2Uk*)r*>1wIwVC-K+HCJM0sRpYF-;jl2<|(?dK9!kJq)z zCDsUElZ$U&M+N06tqUGVg66uA(yheU0f>dcpu(cEq)MI-mpUtf&hkKTq>x`aONGt| zEmY7_=aS?`rtUnDe-N(IbN8JcPE&8UXw8LMCaXTNG!Y#Q2OCyu+q83tx-BFYMG&it0?kOgV zB*_nsVGqvc%E=T0^yO6}w)jr<%H+Rj*%Kp%kVR^Sszin)9b%U7+Q3yUiz$~I$~d7% zuJtMBD9ocoBAU=6d|D(vSjx#ZBSV}nh-(nP_*Ms!4^@Litc24hdVy1{Ps(Ew34vLF z!7x(Tf-adt)R)GKT&kQOE|?p-K(84HlK-L97OLl7ZXC)IEYPi~iivZoQI`yQ_Sk2w z=q^F1)YMq)WojJ+v#V4Wf^f(!k>I_OmN8z_gJM7A%esM}tOy2v0o!043PZ30#%tVH zgiG3*C|i~VeJRyjyg|kT+BTHmJiWTq^ReaoEnY_h(O>QPZa%+14Fm*osu!;%3qE%K zCNEP2tVLRB9Le_zd}LP~VRLEnMmW#v{i>32_QXDQJZy_HG8qQ&lxmkTEWVOAX3XUV zyAytO(-gwXjl87WJ|w%z8nX%Blu5XtLvLIJV;T^sZzABBw!Hsn5TSc3nYz?CB6s*L z!b@+fE6D&ybyP0Us4=heu+%Eb1eCZa#sf2_!*8A2imXh})WR8#&>Ll1lTEg5Cb(`( zl)us)dEO}9;y$8*h8*;OdcV0wL1wZ5C86Y&Rf7ZuK|r}f4wNS?XvY7rYFK}hwPViZ6%d(>qk@WC8x#DKA<; zm6Jt*{+9bD1SP!A9I4fmm{`b9MXq5En4%~erIb#@7Iy6nO>)S>^!BK7t_MN2-)l-Z zAEgNO=7L{S86s%`xV9iWZ%d<+4uE?A)I<<}m*gy^1HFK=4324$v>_4oZnK9D5FSA` zF$OYE)fE`7%3P+$!fbvG*F_Y|zy#>ZCaIhx-xI$l9cmO3f)jd{nZ5#i9G0Q^=_s}S z(&@Q|;L@@-XO}bq3nfO&RVVWV*Sclu)hD`iA*fvmo>9cK)lpNdNuBqr{4y5iq*^;n zF=o_P&C-*PNiSQzadZnEJLyuMZTxKNz>eU*+W?4#$Va>r{c+*s zsRg%Jtk1T*l{IhA5U#$q*e-rNINVu6TZSmLW#TX83C&f`3f>N*VuS(el)_|QT){~w z|Fm&~&cHZ=)&a#6{H)Ka?l$Z&+q9D~=jBF+(1l` zS8YO)%{ZGZU@J>*$7xZcII|*a(&kFeoUJh}4PcEo&(J$l` zfyZnbeW9u0QHC@b>WpId#eO$h>4ho2Hd}a?;jRD(@F75+j=hIA7nxMZwu4ByC=rgim)73)v zu1ak$gx;9z^YKiwXPa{X?80col5`dj>uUBda>%LUwTZG4e8F7OD@-%wlq?$n_oD2A zIKFqX3W1izX0^Ux2w2Ys2r7v_$zgV)PSF8;ONrjn~(#g^o3Dy1hc053g8 z?exNEe)3B=Gw!hQ!l^&;hzem|GO3p50PrrDXs3mOl_R{cz>|x<^jH%^Fv8}rEKm;# zRJSc~AXGOO&FoB3&UB^h`6if0#Uw1hrYMMseX7b7q?SE$C`PA5e?P7tS$t!`q9f3o zZ8WrEH@UYjIXg-6PaRf^sU*?GnD{wDl?~@`v8p|S!_1lVLJ%eCyH>7ER8Li(-9ff) zTKw9+Rv(;CJ-@lDlJ}rSwI7zE3s*#|o8}vDZv?w;=$b_`=(A**K*Bpgk;YWU?+88_ zUdgGU3ld6>P%2E2ZPG~OsbUCRf97MdyKnL(L_6$BU3*l~>suI7dSKuCwE?ax)g-<; zb6*FGJxlQDk4X8KZdc_kx?&jzmx3-WDky&Yq?u|XDu{7K-B4*p<_kA;)A*n@om}3! zfgy7BqVd6%D^5K5n3&n~FYh?~rWUB?jt{=+Z}jsGL)qEK@bmPy_1~(W$9(iJeyE>Y z?tS*Ow1H>8c>bUCbK@^wbp0}Zp7%&~jrwujxN+(M{rrP}I{X_X%q9Qv%YVDSjh~M_ z`&qkJ@bj({zk9XPG&|4wjoXgn=U;wi<~zFBWMI|)eNW@(-~Z1quaE%!i^pE|<>UF; z^`1}twPJ>UeBjpSK7*gH-F)M1O6h#%$`vnD->tJ>w*7|Z@bmKj{j%?$%+JHuz3su% z`1zTO`c{)7lzeRb6JJsM_Uf-+(!GJ7`)>J-&VGJ=`@V;Mdow>LZ$0!cFXrd#9&TSf z%+Hs8;Mcn@+l}@$;EutJ8nv=f_U?&~>eFq^)PY?%z)4=RH5Z;nQ3A z`Ifz#hWGMw`J?Cm@OAwB{efS7;m7#d@`~)Y|Cyg}{?(6u)NxwlL|z|RkU^Xlt9zyZDY=U)5V_i;cU{zT>6 zKjVO&_u#ot`w<6p;8T}%U)+%-|IhoseAB}m(7(OuEAM?Z2lSVZ4_;Fz5&pT)t6u$b z`gE^&_wj%7IS%NgA3e6NdLsDKzp45nnyvl%f82QA)z9TTzcl`-9_ykUFWnWzqINtZ+Q0It;wrS{q`xfP0NzWcRlpUpM7Xq@~xY0-TBYg z9h-dby|+C3v5m`xQ-0KQsBpTmHWFy{A1Z`J<pt8;ScsCkH6+umUZ2`J~{ik{l9!;?dOx}Tf6`F%6Ffe-1O0@ zr=N1$APDj=XIwF{Bf0wpH%z`|#YM^CyWjWd@OyqSx$S}X9Qw-GWU}K=U$Ns;JLZ!I z?|j-HZMgMUlI<^S|I2fK;q}SBKY#7qp-&7APN&Bvul?w|zd7}RW0T7+e)X%?T)q78zV~i;=O1ow zJAC`!ykpl#Hm*oM_P)msKe}~ga>nf4l^y$!JN%t{pZ@$S?rBeM+w{3d{}Qg%U3}~R`t1KWKDqK0J8nJoHBV2T^=p59R_mXfko@jny!3{De*Wqt?flU{ zuKmullEY_w^Yb76_mh%SZr@OS`|gvI!IQ6g{L9^^B`vk@{L1Tou{+sQ`O8;5rz1;l z=sa=PuC32cZu`XRK6^vwImz?hzv|ZeU-hEo!3WmvS@#F$C2#x2Ti1N~56(|6z5h?! z$A0UQq_T4U;E!&sC4GPV$6tK()~TfWx!--{9bY||-1CBaw_N@|UY*?Y>QieIpL}ET z{qKxDa_c?sPAV^Z{k>oO&5tAx|MTCx?%p^3MY6B^e||6f!8a{)od4YUpjm}eh&A^C z1hWunTgSdYE5Y)YmVQkQTMTalq7LuI5ZyV68Y>AhJcpiR>1~);!K==LmJAlI*fkRu z*&JN$rr$_PPwpWOrzvVuiH|hBO{-3XlM@(<{3T0N>oWHdi`Pd|GF`Ij8++1byGIW% zZGa$QF@6+I&F8if+DoL4(`v=G7~Fv*IER8Qt)}T4{0VA#t{G9k2`=M?v&fP_lCHpF;s{D(?kZNXdmcxYls-L0A59~pg@yXz+doq%d2AURBgBAlal#8x>kN!SGv&?Axy zr_JjjPntET(2MJ3>=qNdXWLsZ>$y0$N86afQ`hYQ*|l!@`diF*oloQ55>>^cuzCwF z^N(f8Mh;?Y$o^1BjD#!qEvRK57l@i)7(>kqo-mQLD><*sEs_(Hp}^icDz#3A2b2nh z*K!^uROmP$tQ5pUbjOtM{D8#;>*fRT1Dzv{}$84sF= zO$ak)uXktrYX_U3;Z5?>%rI1<`BiwHp^i~DK(+(u5PR2Fs_TdcPBqr;Q5DF#xYb?} zp%QDAfo?8kbLvm-k+0fLq^qsT!DC^_|(* z_oNrd89&tpT4_6$H=!9tBID(h>$5XAY|J7^wYMBpMqltt6(Z39e0@*l%$~~gdn#F$ zU6~)R7`<_Y;CJm)NO`>zO{kI5o|G+P=U)t9MXZ@H?QPL;k@rDmfjHK#{Yxg5eNAtFeo3f zDm#_peVdo`^WdTsS5cjg3rUNFL1>U5x5olDgD;*{g}#dBrRj%Po|bG1_gg?s!(Lw%b28BOxD9^>JjnB^LB3`IWi3(^JR|gTp8ulUC z)!agb(AHkaAQVI+z;jrJ@v4^hGZyNk?0z?mdU;h#-s$b(s#k)5F>)w)NWfJ!@tFAg z#BA+a9R2Err916>1%!!|QRUp#bBmCL+}C4V7EhFz-An`~Nu3<==eof9_ zc_}%Dxn6L}^FXQ>#TL3+X!Z0))`R2aB}DADu#TnRNGnF3C}-6PJyj&ePu(srkB2I-?b6<6H%tzGG819(O&yaC z7_8^A=JI(Nw9qQTQ5_adAV-8RF3!UjQXH*EGL9~tj;BzxO)izF6mDD47PPgJH_#Sk z?)K{W=m{m(BV64cBM2N?#s2#ZOqC9QeEIQ!~;q z3HI{l6ReE0yCYv5!fL_VU}H8ySlEsiPtCvvSin})q)EGVI7#lrUB|(VvfKRua?+yw zYiFF1QSMVz+FZARkaRJvk{1KN3J1@yv+dT7HN6MN314gkL4d6LR1krhc_{6LhBFB~BvC{(k$DG(%< z4i8&c0wYM45IxbZt*fr1q{y`lkI2Nza4Bu;DZynEF;P1Zd9bNrwZw;S2sS6Cw0@l- z*H4Qqn!o$WRJPSH6ZY!+CB6>iZWL2PUY0h2ZLLO8CKslqR})0*4P(;N@h5D2qCkiR z>wZd`uf$|C%Mbp6u#x_vu_uwxQAc2>vb~r&KJb*L?Ak&6TmV-?-%!BtU}YQGUC1(1 zKP1NrMlV5S;32I-;@xg7Qah_1yQCsD>OR(vnVGBREo;Rx{~oCffVTEMN|nCyp1pB9 z_*R14lZp#plYeBApf&_yRzD%{3N1}$io`_TS|+MfA-D{0=i6MoDrRX{ z-5CW$&dH?ApuwePvjV`J3u1B6X!W4ph8z-WiOBY?_weLgHdh?T5|GGYduMpe3{Xwu z%}^&?4ho!(_ehEZo3~C;%#L&mqQa|n&uVRLQED_#!XoBDYfz-ilHwla;$px380IaQbW#387Qcj2h zw&<~5(t0Ahal_s;C{&HAD(jReCMm+-c~`u6@Hk>{@nF(N?FvNVj~oM}60>ZYTa7Y}Q#}2w33C!0Ay`3gSc&DoNB%TgtRJRY6(4R>wc31~0yjha<3lsBSIR)7tU z4uzhzX}W^x{uGG|v6^tJi9tJ8k}WCSC2f}e`^wXkp7Y?S7m3YWRZq)*barkh;+iDO zjzb&r<`z+fI>lnKVF#8=ehQG%ocOgh5UdcnrPbP#vQaEX8!hY_3aDy783Nu4q7=C! zTlB?Rp1^_UbGTXuw?p{ z(lLO4+qklA!SYCzx5_4{$i$d1xX9HD*&?-T2+&(i6bWy56*!?fUKVawnB;cZ>XkI= zwKF$%wO>AE+=1q;!#NWYY!nQDS_K-Nr}4FrH_y!Q8!MR7SC``!Fg)1>agj>a-yeq1 zMDD?vYz%u6f#n@sUKL)mlXPcmdiC_)-8CGMXH8Bw=!R2H?}j zR>$R;xwdmYH->LCu57hZUZpkZzSq7{%C0Gh;MmMO<%-f9gtzmSrK?JofRS_yI<70( zJWR037+k~q1`&Htk~2FG8L`2w0Ti7~DcjJ>Xv~5FfNF%8qO4ba{*3+evub`#<;jhO zq_C0~CZdo|*Wc?asicLL6P(Jdl6p1lcvE@wQpi*}Fh5HslJQsEJ9&(x>Psi#Zpn2} z`xP2Gm@kmhw(_6teW5bSK1`DnjvF{8NeHb!!9NlSev1E;_W@f>((wQC(3&a!KYu_E z+8^;rHOW5wp}%|D;XnIKdiXb$Us3#9#;>iPHtbiS5|Iv0%Gz5PG;%#Gvf^+ZLAG(2 zCs%3a+E40Wl6FkXY<{Hp&S`)2$VuxA+q>euSAU*5jp$1N-+Y8 zwK9W_8g}K%pN6wLx4f=br-SC8-7f?fEuRLw(aSCs*K<&4c`Uv6IP!)>)Kk{*9ARk9 zV5FuW>SZr_Dof`%;bcRyf!At7)8n+sVN+@IpRH{dua^#VbIUn^V-?tmD4)=o$eswK z6ojw!mXe%A{4(MM7iI!Gy8)4AV&Edt5UE!f639?93bj@0R)HvSJS{akJRTzXa}B{AxPEX~T+_#5e3b*PA=o07?PsnN!Wph}7hzzF z^lDwC*HbxR2N7m-elu?8K*4^vJh^*|wF(lC_f0J%3-ui;Nyj9b4Y13bA;I4xrNocsY`de~Vv7+GG;624({Y|?h`2_zxdM$iVVoz*n;>w6~;kv@cJT}0xD8!aAH2&i@V4z;{-nPQBu)m z64_Vz4Y5WN=j|HUxeZk|zCSQL6mnB!g0MXP7Y2i?8o1@8aQnoTjv^(xBWc_eW58r3 zA{>l;&5DdUWPKM*Zxv=Kt(6GCHqf+n8+Oq+#VoEcI^ro&-`KKR!Hb!IgW`2lx*kI| z?z~VM(8deTmAk5k)VvpJxnBJ6vg6KndWrqjW}RO0KRY+&H0qwXG`W%$t=Yc>Pjg=! z-1!316C^N9*eQcS4w(hqYas_9zTRt|c3{Wgk+DfH2a3ZpQ&-g{h!GSFG@LGat8!Yc zluuyCm#24fr;!NG02b>YHu`x*nXmk!EeebD8)GaCLap15)kn1`qJH%!3@J)uOGfHX zg@Y;j;zmZb4I&5Nplq+oE^B~*R!d>v`o6wi{@>^7`GhJiCByb`hQJIwDrV8viyhO; zpIbeLQQH-Q@MsChw!V+f)@5$6RVz=E8t1echM?1cCUN@bXVS#r{D4N;+T`izCHbaG z>Z&ctzSYBEvJ@DW`8XK2A6yk$IlN>^x)qB&nc&L+7suHqpd=4F;Kgjb_%2%I?7Gej zY|;rx;ZQPWfCR=#|D(jn&scC+`J%!2rjuwo2gqpgs|9?a8Wr2ya;i_;pJw7sfg%{T1= z0CRKC;;oUSZfr7_S@BweTt6SW=1{hgxb#;P6}xh zp+<`P@wv_8Yjn;YXIZ@B8R(s+fpJNgo4(pT`EBi5X!CpU4jom=6X&8(rG%Ck6=Y82 z_J(;`m-%Lcuj1ufqvE z8UphN@TQ9HeL!hvKTp?833Iw;>c{Bj;cNB`xSj`U;=7jO^^w+B0y!!KQS_oVEsfot zs|;U!o=W?B&HYdatE2}3qO?#LWk2zOUXee0mM)B`zVus83l@}?ei8C>&Qnr64IGZLkKK*YEO``{53vn<>@`JgZHE0*Y#8 zErne&QHd>>a6STxwLypSy_sJ@xyV&jl?v0#MqiI#`xGR$LxY zI27b#ijs0G5>u{2b9As(SO&Rn90wLM5AB$w@b(aWB`kt^bIV%<9dC6R&7-OKi0HOv zu)1oRBEyQ_=juh=k#Zn~0lw7A0Jj-Sm#*yhF1HX|_>@V$JMxp#ZI1<$G>skqq+5eqsR-Im*|5*@5!Tx7^{qi5 z$Z{Iznf$5_U-p#z4z}RrQ2<`{fZEft#$ksfRgobn{$)Z{KHQ1=mP48l_ZoV1gD6w6 zfVUr~1$4rfp)B2aWW5LS>E*Jw+!n?QLRCvpgsr3riY1hxA#NUh4}&afTtQJn!?KF- zJp2@vuXv>boHw`JejFtv?L)L^mT_(i=cKhrrv=xFioYdh_EVZfb6~uL=7M#wIRu1wa2WVi3u(Hk&sVcuv z(5Y=@iXa4ZZrBZK2MsPBpKDgdhArqY3JAiZ?q&n(esU#k!R`*X7kzRU`JBbjV1YEw zFT9avy>Vj7H-|y&X#ygO z-(3IjB&Mb##4-mREImZ2|3V`IkTnIyL%=Yyo1E6-Dgs|@!uW_7xkn52EV^ZFP4R(6 zAa#O@mv`Z;D#OCE6a+4~0uRoh*IZs*yno4IQH>q*k!JGt@uBXdjODST;q)O={buQi zfooGa$52z2+;kK;y0KW%0wL&EbO+W_J_YsI5TpfjzPQ-dLoBhAFleOWFGxbSPHw`LAH!_0uh0n9x`W_uB^ zaphYmh2eqSZtgMYQ4GvXUtAs08ixZNugjdd{zy(v`DuwhKs*sVw-1wVjMie@!)k0N05ImxV4jl;VjgEu!wUBxR}#S&e2SQ8lE7ydGzRZWKn0FSMEW<8t9bS z+j@e-SRMer6rds^mRM$RlS!zA@;cR)mBXFL3WwJ)TWh?SPRm3i-DdmuW6`H>tHcM4 zD~ORXsHnnXUnF7An+IkAX4dv7_`k@*p#4uPOTiNd4V>|g6ozt^WU7A1fI(S?JIbF1 zfzq1jki@_Fu8qC9c#jH%oKVWM;91d5Bs{F|0Ma5h`{i zmB22cG4>kw0}#=FJZLN~j#Ig;0l5v_qm?vU;;2M8ZMO48w7C4yEM2iIebw^T&1AD! zgO;MHQ!GMG(vKXsG3god8WA$2X4CQ?Z5tV>_>vR_0#=oiWx+K^tW15tBDIphVANTg z^iX}m$ffd6Hfr+I+Rcy1D;`ryn`2cbBTIoNVpl=w%tKg)5VAme5LPCq8C-zGZ6ttm za#gZ~g8vm?qug8Pshm++p_BVrSRSb|RmLbzHkyz!_}Hy33T2>JT@~c*qC%}vr;t)Z zR{gF}yW0aXBd?WZ@d{rpd!TAHj@dX8L}4UX&?v4Mx2doH46$Z z`!Sf(8a%u4`<&0X;RIByj>OPayLHVd5LeDN`G$nfJO&=^g@p91(fl3`TTvu>KL9jE z?VW}`)~-!cA<5w{M2Kc*R6NHN_MVwGIbJk2lv#yUFl{GDjt4C~ZKsI~THfcqwOO*r zumk`*+vax;-iz*4y<{3f5OLB*%np`B2x(6D<`T|=P`n9Fv2cn?_9~0kwFc=AIOgHQ z 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 UThAP$OR{$u!yU|QJbb$KpRLQ{SO5S3 literal 0 HcmV?d00001 diff --git a/examples/with-vite-papi/.papi/metadata/wnd.scale b/examples/with-vite-papi/.papi/metadata/wnd.scale new file mode 100644 index 0000000000000000000000000000000000000000..4bdf7ddfdcd4256f6ace1e6dfa6be2cc5c469c7f GIT binary patch literal 465623 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"(ns-!Uc_SYn_EFMd_F)9g%}F z5hF5|e8`6AcIp{}5T9hV>B8AKJu02B7j zwsJ#Bueb9k*^r;vuyQov)&0K8+HiHEOo3`TP{=4a2r>m7mZm5$Xa-S3W^hoWF5%~b zgxX>?YxP&R=A8J0v7GF)U|?a!Wd=>8bl7LP>GMWDCPbgwK|J{i?sByS_>}Xde5E(| z*h7Lop4MsTlsJo)XdnvtYVm3j%b}0q)nSj!p+vu@Ra6_ewxT^aAqDBM_PD*-@$=@4 z>xCC+VF3^tJEKxXGEwV_D1jw=VD}+eT^y=YZ z*x^O+>>1k0a5n`YR%#?e=FG5qz*NVPRR&sNto~@@sQZoJV|(42qWCK6nRQD@xa|SXn6uXBT<5_9U8_g#L$4TlFnV6$M5?9^u`i|{ z-l(aTXzt04^c`P`FJr1H03dI0PXrD=vy78#@sT+PMEwX%BVKta+P-i=T8X3mdv~?# zx}d=yD@0Ur#)`2$wgmU?tn~1%&I!dwW)k=dD@Uh}{43SBRN=UCFi}Ux`iFK(v*aN{ zx(lesAq^%$gC!HWu)`c5kQ&ij}vftw+xy+a7xW9)8ov z+_-|Y1&Dfw(9u|b&X`juKY$dB=h!GO9@wmprzb?+($Hm6LGpvGY0y{X0Yp@oDnj0z2p-txbcD;t+i=A2Nlu$knZY~7M$E=p;G5NcnVh@>$#<_{n)tinXBaQZJ8Im3+KXjpy{Um z6grL|cyQ+vGU}sU5_pJw#8P5YeA-upuY!k^nYj~{xDdJ|)fa{hoVt9~3g8{{H+H!* z2h;C&B^1CF>sMjnhQMw^PwAiungh>zXbv8yxS{t}Fu*O!?M--w3$qdKXYEU(l@*av z1Qf)rLO%;C=G+?~&TCSYc(JbsS*Jh=pi8i>DIM%Bg$%l&)qlL?Lz-WKb3omt3kQF- z!vJ9P7p{fv(}^Ohx-OJZTqmv%PloZEtTI`tE`k&Wvuh~S+=;C+K})@F!tX$+H#eF| zC{#_2EDo|(#b87$v`qau0EB_4vyPG!%syfF3LSej+-X_UH558wRvEgqi-=(F09OSH_mA8|zb3J$^r?@|cQXB9WB8DMo)R zH14DPikEewl>n_6p+ZU=-CjnrmkN@_a6zOsKny8H+m_uHR+Xo8qIeI4mIT9i-?MCS0_!X~MxD52vyNffmD-r7+Fuck+S`;B@ zD51VLl4cEEAeVN^ByN)YKcpv?L`5lE{$!T&VL zeG7WHtGI|a%gqEU9>x8ezg3%qOoAP`Wtj1+P{1HwM|@G^PP@)riyKETr^;aQhZk(m zk<5;~dx*(WHEZI`A=f>Cp)o`GML?XNhjwfnB|rRC`f2QlXRj`i8}U&uST+s@YDg-8!)@y}Alcu@;KnVO#e<0$mE!=@AJ<7>@E5t^`&ZGZAw( zy~tEwXjeOW8D5Z1?A@4GeJU_v7i7x~7VXv19mydxh|=PS*~9H>#wGTL9Bel! zAs`><0XDa2+7qCTgiJvW>yd*Nes56)5JXQ^j|w6>(_y*37;_|&%w4!F zHifWfDoDLM8T$1$D!xJo?X3dN1F3{^F6tyvLz$EXuCDkJ3R=ABOi2zor8pGs)$CwP zsVX}cZ?7<}g$z=-Vyi&|y2RpY15q1p8#FvTq`q|Xpei7cfESyFBA&#M_nA zS4IvnSe7s1?89>ck}DV^dIlNQy-h-P(nLr+KgZS(dai6p1~^5*5bKga9?QTKt@;=m zsNkJ=S{4cWgnbDq9w!^2dG1jAbt;ZnmK^lWzW;*CLLqfYrLtt$n42fFR$n1v6h37n z(4vSv!odMes?1{#rIU2@n8h1~(IF~;OXBEaMC3`6>2zI6?rq}fWdp&U3jcH@D&{YW z1)B>+MIHR;g*(%NlZtda4|uu$G0e=mZ_7k`60k0bQVKijL?MVdxiH+Zq)3^67=eed zF-CFdej(ECf`m24g-6f_!e&xXJBlsy3L2q<2|Rl7@5EwMrhH()=v8*Gl0ysyS%OV3ogUl932=@I<7%q~B4)1}HUsBtAx}d5JX#v6ex&zFl{eafBL(Ukb_r+-^iX z6%FRyR{&@>_YN0C>ye*^X}bgL>vjWwFsh81-l~it$@ZR5U+&R z5NDf-OO!2;ow!4d!;i4mK$c4=FX}mS>MTEBlr~nwh8e=WVbiH4-w1LG=5NyV568O! zpJ%v-yU^8qNx-4cWJ#n0#HiS7phyQ^`!18x0=Du680e3!$V&%#3bUZ5lmeNp13X)NSYYn{A(@YhN`nLR#rNtwX~bDD1n0TaOWR`2hN6rCZl$kl>yTft9rm=ai?K?M!h ze_^h0ReX_k@Ixc_nq>&?0KmS3&GSb|sRJp26E1YsAmG^(rhBBQ zQw+|SxMW6A1#}1dfUu$Pwj#lX5GZinpj=dw$OF;dSSeG8lKS;OXe1=o0>^tTU0m5i zMIk-ei?g7?*p-!_NWCc!Qc>s?@5n-)2{d`4g<}Ioid_}k1-%Qm$tV7zlMC7FU zHe8_&$f$p&_xYdWcC=Pnol0ZnW|McQq&9Q7EkApP&QIX8%&-8)HzuyZBUV>6-*2WD z@$MT`;|Z-JN_r065ee{Dp$_OF{KIwV!^yCNO&?Jo^&>9^R!q0y8RChpxS%SHjj2i)+28yVWEnbEL=O z$p_%QP}|v1yxwc~_T+%7PIW?B_ppbM2;riw{-kF}-_MVwTw9Ovw7UbHPmdiE=Wrrv0tkP$WWf~)T!MQXcLP=;l_7W&OCI%nWdWRKe_ z<1?lYvUPkft!*MxNe;z(fCq4R0$8juk-v0$f#Z|LYKR06hznK?TXf$o#)=Q0peH}G z$@E-_0Ag(Q)*3v1q*Dm_&Ka&+`G}}zOWIJRE!)8n^BOIoYz6Tu^ke*KIH~sKj1lez ziVQC52ghn*_EPe}o3X7C%r2bw0`oFGm?u@`kR0WL1C_O^ny_fg$qmXWuv~T~xYBP55~nTCU^v0Dy~9g`z5g@KQTLlBxO9Qp5pPtNs~h&Z z*Q3)z!310_n%n4ki!qEj!;~vXE6rN2Bk~iIk@4a$zrVTPM{$vkIq-_Lv!d zT>gOlfjvOK_@REYY_q`0JkHu$tK5i*W!ADs)Um(?f4ed#-Ac@)unLw-4-$l0^(Csl zW`af6PjqPpdv=#Y`o(s#A0e4Qn-OmL7_w{i1$pTh4#|V2pz`JlG4jLxW=y3YbqKp; zxu0Eyl`={xzycOojT}XxkHS}Ow$Xu-># zDT^!LY))~xqfYGpmzV>-YaIyAvUA%r3`8IlK$l2>rF%0Q%thWjt-&IQ#8lA;Dr@&* z0;JF}(!FvdD2Rx!tAxV76HGk`il+@ooYiNR=b1(lRnlX45xg=$dRA&D#Dypmd>kn+ zV%Rwk6>%^aj9c7~g{9+gB?7q<6VjB>JTQnb65Cu2uz7 z1kI6$_UM#Xy9D}=V8?5lxarse6u%riF>j+-Ex?Xwc$`n~-l>oGfcv@NlpDj5k6k+7 z>w?@FOz8g3sqqM2jZI5eAce0t()ZgP=G2M(3NpKOwl(2A3X1t^PsCrs?IW&HTYFR#XILxr@6J!X$3<_OJ7wSoP(f@q(j0}MoAomrU!Qg1-t=g zM>29Gtq19d{Q7Ibn4AE?;^5c$RIY8tku|Z?!w5gPUQMA*!$A(DXe)!f>QYDj?%>o? zXO&50SF4s4X48qb)DiFt+)bu`BbYgJ-I4cQ_Xj?9@{cc;AuE382$Uq#qDvfTKu zr%{Dt#r{yMhd=ywu&76*d$#Fk<5j^~LAChX!DxUS*dR5{R(Zp1#T|Vn?`n?+_mVV` z(k^I>3({cQc$K?iRiI6Q3{#v$8ui|UJHbDHCm02{zix3}OA&V;N@ylT!`@8Nq*n)p zi}K@+9Smy}Lh|#mVDeG8h-eqgyMziRWy%-bAPk8DDcQj>k_1RGt+w{j>-*te6Sz+Z z1buH%=@988#@__do~j%A^EzVwyFngQWVx|bTZ`AMFIWO1KLy8w!pugk+;SV41h>fT zW&)oG9o&)RnQ_sNuQWt;*ZYv(kK)b!IVSr%0uhnHhjWkOiVARsWlkWB3EmReqAp;NkQ%UynV=`RJrp3-uc!%_7=BU`ba~AI zfG#LGY*7@;1b@(PJ{aa!#$Awfmp>Kq3*}ppSD6@fk`Wcu9XlXWC^%->>CX%+CqVsg zv)!L4JHHLY!jAEuOg8tn{@`tX?}pnb^VMz*DeE;K$)5ueTt|pM)@K4F(fOGpLcs*3 zi*=h85&$tFxx1iX%PRgiCjy0*L zDoD`F5IGrOh2^)jeF>UP2+fxuhC515#t-KgngN45f>9ZakHIemV;AeFp3IQZYVga! z_{BPFRM$m<339=tgKrj!95CEFgHsqtr71hT;8%qDS`m*V5E9n-a-%^mj!>c-RR~yC zq#0L{=C0tBvUqX+c%+P~&B3psHjiMFU!7kM#vcVAUx3wuNE8eQXDy~8y7V@~BMR-Y8@Ve>*sPv5qSMq{s^7M+_kR-A>u*NFpl3RkM2|2w%fI(Y7>=z)W z?Z^#lJubX|YKewB#O#&Yi3&TYUL!!olxFwznY{ZPvd+#5*JvlA6^eZ= z*Tkn@RbNbTm5z|$r&-R-ky<{AKmK0|@ zq6h8PlE#1CiMt%09KKMb80~eQ=qsoH_GJCzjk03$uUT;ORAox*_ZliCd zC=3z==qE2uVX(LU5(qUyD=(r@H-n zSDjriZ)~hWyDdrI)q~;8fSI&f4ONRnwfwS=RhN&|7Z2^>@;^VYANQ(-fgLXYvHjlV z@}KBv4;a(q@}KOAm;Wd>zJSYrqEmPIk4-Xx)H_}N6J73M%DY|u(|6BZ{<}v^zx>}d zaDbP8obVkk|M6eS?<_7+EZD)4Y!&KV>>Ig|i)x zc)nWq^r6_k$DlKke*&I;>*(zAfZ4EzRz!DksepUCYRVy^Oe6M1oJ_3Km2(1f1iL(7 z{w!icPU%F9>M89l^ghN^7y#wg+9n9C7qm{$N1(cf^r!S4Q3tZDnT1au9kRhHEiknK zQ?k%^n+(u7{lCy_gt$K-o@;Z6TIDJtGg7;?IbhxqfuFw>^8D|koz2I}%^C&+psxvn zI|jN`FDDbKmpcdIs+T({!rwIz+|}dLnCj(Xx9a6?2rf}GX>fOsZenlk&6Vt)ffQG= zdwTT$5>ve#OgB}1!8?@QI}mj!J2sF|7aRkA!MMzS;81pa zAUHl?ogPniIh1|uWrwn>)t4R0#G~+MFIDD)`<{PN zmH7}^+R1@nCPteeUv#T7pMvKXXw#Y4dt-^$uq}9NKCz~|D?H;eO=|RCy1&#y4>s3Z z;Td5eUg3Ejf<;W>dA>)t(YI0*o(Z;pao|OHNbRk^gu?S;59s%)@Vp$`?kh=_bwyd$ zl^(;LO_38J$mN|gb0%2mQs)HphZOKXgxO+qB1l`P6Uk(lMw01c&MF@Ckd=s2B4~Nc4!JL~pXS9ND#8_3Q0x2=_p(V4!x% zqLI4bqGY3#ZwQge4<=11X{&J z@sJ)W(I^J*!tahMN&+ngpwUim3_=IhgR|v9P9#U|I|s~JtCKtd$WCgwO=RfGD*j<;JeJugSJ*Mw@7Eu3_D2sq#o}WDB<=TMrY*0?Sb0 zv>8eK<+9m`D1cPQh^w-B&cS$qfgydi(}{udB~8qt2$_-Y@+)x zBnLRT6Qe$J`}+=?OWjL_NaiV()E!|&u=~?Br&o$hi0F45-EDaEIiyyq3LOyUtp$Ue_FMnJ#&~bldI#wlEBPX z{*)zfDXMK=Ojd#eF9JGh(q|^IYa>-9E7}zEkk$Z&e5YjUzFPgh$Qy-uCYW|<(%pCY z^^Nk?5IWH2WJi9$Xm7;q`qY!hiGBhn8LSiFut5;qLg-#c#>Wk^^bZ6b0hHJTyDM&@ ztF^0Fi30Fkm)BRA&3q-g&eDmBDz8Hs49ai1I#Yj?&+8akI>{y)b3Nmn@BpG_AF!hI zI;`Vy<332sp68bYq9-KU2uxgIB(+rbrF5qxRg4KT@SDl>HS?%_Gh7B;Y`g;=D4-*T zQ~{z4Ld8A!fGt0%8T}@rlPLy&1-6M){I+6)6WP#$Oz9r&nAqAT&59h9dhu>DUBPMl zy+2;y)QQl@cOQ_$Lw`0CO%I1D2|oIMkVKYp3U*h|ra!O6 zqh=N|4B?RMK3oh?DM@f7>EWnC)1m!1|DU-Qqe9CZH zplA_$e=_YwBTmUU3w{Ct0;R|?eVk|@7;gZ3?O#6wqCnxFQUp& ztX0UVAZQvXGGKE2Ark%9KlqoDK^j8Tmd#SnH;6(+RaTD`cJB{| zM`)b2VsPAa5qXgwkQ>w9E(M*Gpvb2AuN8$!(!$B*SklxXO$6wH!S*74k+l+>fxe)T zFCnGV1ya&d@XcL-kdKH=btEBtOSOq4>iiJmrsvp9s_ND&!uQOcn16P#9A*9@!GJM= zKY9Ai_1sM$;A(Vz)>uDp%DRZXBm@*S+`oYE)?EaIgUKcQ&X{KD-ANtWyH&^b?t$!B zYik98yCgZ9`a;D}Xw*i|R312a^2CG8)i7Pvzo(`ak?E_p#xTaEX83bU|Mou{1Q4%P zTIEboJ7gxR{L}virPh0U%kq*+Drmk^1I97OPKE>6uq?RLph5wyT?4UBf1FtHzaA2EyYU;GI zd%1S{S~E&OY|?m@XC5?QpH^N0Yg64wJ_MD=0M)-)h8o(7dh2xNJdOMV$?d~_goDTT@(D;Y;!o)}Td@eVO`x=8+7D+wx8y2ev)%~` zVKMnRgn>5_dH}4LLg-tiD@EU}A2+qz%+B4$7KPm&%vpcm0BVXhHm;W|jkY_RudQQ+#J&eLXrXu%_{x_+Jfbm ze`gGmVw`wwV1~~_7?HP9_%J9oB&?2<$hI}MNT5B6+M?wY>No^ttFjatnmTWmph+aZ z0yc`q)@AI)eV4*&gxhQX$UzQK0NP2&ZY=T+l`q(<2y${uBEuW0qD<}@l8Ap0vTQ>$ zf={`MCIbIyyBPV?R7k!ZugP>F^0pgoWVo~U0tc{PA*l<|sUou?(sENXoil}qE<8At zD~IdU$geTinhaQz>^@G<>Gncyyp-utZ34I~bVrnlP6euhJ!TBK`ic?Fm-GplfE<9z z9?4FO9pH-V>wevp2)PgJtxAs#mK*sTq3nb|^Lb-G_p74%DO}FV`4Vnywe@XO~;` z#y>#U>4%#TfSMd?p32g|4B71XX-11N?SpsY4-J_2&>TF*PiKUPvAMvcukF^k^^?E% z+VOFufHS<6tXu=0J!vXd#SuXPHHRR>(CB4gg5*8LE!XE^ji|RvXKcwNg;)hM6oRW% z+sL~^G`I%h98(!UN~*OA_P9|y!3;=EBsIa^vo&?p91pR58SC9^1WdZK>2F5d87?08 zP;+<}KXn}Ep;@&zK>msS!$l{&FuG$}DgNp4k}R-&+2gR_;x)ae;T&<4$T}3ie!LW} zJ-$VaCwWIcLuMurg>bYEP@ReZR2DtXtGO&cKAMTh;@puu1Xrw%H5mcN!EBJqu(N?A z|GYK>jtC4^%Y^<8h_HW%=C%(H1o$6(cRo7s@qyr@1A`M=5SYQ`Rs}KV+)~4=gI!z4 zL?=(jFb)DnZXPLmNZc124P+8VhN5!oI#XZ`^A8w@Ad!81V8?{Wv%0z{d+r7tk0LSv z3>PtgS|+B;@t@Daiw%iqX=|)sWx_hxJB^v4ou!oz zi&t@P^uQNvPn3H=gu9-%H9~g_4r=ZB*CWa=WrAV1v*00@kBW z_ht^lqdYQdVGny)9@0iEWaXo>=93Q2MycUxnkR$$jlixqNcuVy)L(km!tQ6;&K!s9?QXzZZ@e-z%cK*Dmn z&rrif8U}8VIxgs$qAQRX1sGLt&Vi}#;wQ%qBxHy3OOmbB=8>J6lCDwi^9ndk1BIQM zQtlIw=1aCP0X|?}He05v_(Ztkda1Ar?`#APnZ|1b#{T#xh=;R$@E{>G9PP!A`s=z?_< zu85T;ZL-LOH7}b|IIohusNiSrpw!z?IZcJkV*VW3n>WGV@B+ZNDJEQtJg^D6(nK3dCz`x+h(-C?jG&XgO8i+#u@MoinQ49$8qFVLGCxh$yMu zbYTmWI~(^8Rti;UyRngn5SIfkYxxs5p+?tHX^{gtf{%mz0_c%IQ4DJ$~ z`(jcN_C-~MeQ_Y0O9Rnsn#q~0WjC4N8N>=G>(O_o^`Aoi;n2s4 za>~$ByR&v3j4JrjzP-DWE|<@wfj=IFqbKahGdCp4>R!~=MWpIPz_ue)w(Gtc{7G!N zzm#0=FX?hWn+ER_4wbu(Kqfn1F<(Pp`K7Ju8cgR%Df}EFK`4IAS48Nem*pC&yg-pG z$oHfvSRR3V+W?snDpJeZ9*l3mfzrOfUOJPgWr3~u+5v3EbClY@HV}LxwiJ^I-#+B- z#faY;7=$O22=s_VNyx>sIhIL4=68g(v@iFWORRhInDUZp<*Y9{VMgpddI5DQV(%bR zA*()cm8RVl8sa$UK?}Fs-MWod7}#leTjJu|P;$mbpOJyEwvz}X(qUJSTyWFj+T5MS zxoxUdULgyews2^mKT!n&NhvMY1lp$Uwiis4F~9FVq557$3OWu~85FDmC#p=Lz$!?y zpavAnUF!e^C~nlO6L{Z!!FhxDDTw*or1Ic2pjPn_TPQM2WvBRGdFL{Ln}m$7^D2t< z1*;Yk4klG5SA?roDZUIPRjF9>qkt!zgHcx;gIpVY>;{H}Z-V#~fM?=|j!P$4_?&or zP&$*3w17AbF5o!$C=OsTI7WM{*I_MK?f^d+@o4}zb^ZxXMD%kJtG5JP@h4PMD&EV! zxEZ)Q&qntIwjF2@Ef1tr%GH3DPMk2dkrEu>N{!&s8*z!GR-|n5QVmBodaPJHc16lN z6Zv%txOrPQCt!hp5Z46hM1M^Aaybt!!}{#e?~3Aw7b(BO%Rd;HFUR6tV7n&ac9`ZX zP7w>HE1#6<1gmi;pNz!ZAl=yjJlE z@NwptUU42aFBt-J=oX~GnA?wCX@4%d2u$~Bx0FX+=D5Z+DYRYQDBOyYAxL`~rAU#6 zOHm9^sN9hO5ro7FE80!_N{C}TTH;@TK)OhtR(s@Ug-+#*AV-&$~NFa%9}9 z+uke!fR@S@!?`B8R9KOBpj$Ub>^`*b*pJwRK)SlOC5{Ryb1C?Rwkzv^^Nem2`$nSZ z7Q`!hBLFYW2sDBneilnJYQgg>g^k30FusM)qvKt7(XD%8#z5`;a9caKZsPDV*L|7m z{z7owFQ;+cF;Y{jZJ{@qFok1!N?YoZf4jKxNL9n)v;I=>odNT?m{`tB!Spf?IBaON ziN1bn>Vmp}oQCMayHILa+~NFJZOA={u}~Cy>#)wGO0TI~qW=bkGnQFq8Q2-9QDE@H zRo{ECLvpd2BFdAnu?U$eZMLqWI<)AlzzXeDDrjMO3vfn6;xr-QY-}?Cgtcu^F&!$O zN5PYYOjVtW_aGf9@r42Ep$BM*X&GJQGRO`H*^<3RT{Z0 z3ERZ%B}yRn<+L4(@*yt(!8gJA5|;^}hPFj4_V5g!sX%Brrx@|4_|DA_$tTaB&$lV;8;3c}?@4aK3$W=T~2t@3(Rj)EJ0j2Pn{WF~|rl%H)K09|G4XT!3J zAQDJi(f*wK6s2pUcPgwZ4BM!3sMkNKTypG%@4$mx%EV;-UdYnOv;A&=8$(qs-Ca9*$;#kV>&PY=Npv5`DkJK$j~S>R6Zy->B+ zjs?uJFW*^#hcDk*!A9J*@Z~#eyYwROtUq17ZUHt$vWaS)p_crMDmu`9gwlw4OUt!N zw6`{h{3#-=K3_HvfUFW16dpot>_aP0Qr57JDiA0oPHi3DUZN}EZ&08@_*4A}HB695 zAr&=it?MtVf>mYw3#tl!sa;CXP#}n5u!{YvDmyMl75zCc>>GZ$4B6TiO&P^K5eBH; z-s&_Vo*;(g3CHK1zSL@+U+Vn*$UzysUM6WTleCwuTg(7*TdiBSfpnd6w`KU&!|SC{ z&mi2b!w1@Ituy2+a?ex60GR=|MY`{R2wvT2ApRToB=;em{NddPg^Z(-s$XIl_zTs} zd=;eHLxa0-36*54YL8VI3$SCekg2pmMuqoxaoQQ5eom%K~bPM z?V4jyniB_Fdeg6Xf9VMRR%s5t^_s>Un}lw6&$&LR|4} z4A3f^5@C%b@ALsM_6sBpq3peTYb8a`~*){0kn zs4QdDD|Yo3f*L$X;_(gjDxHN0Tv1#jDLgvmKL`e-OZeGtL&*+pk!}AV{lxj6HMhA$ zig+v9ok+`3nxQ~ATfqG`I+F%pv0Y#$Tr;eaT>_VE$r2(!_?|A&as_Gj5L4FP-hxXh zqW1t)ePnl~{;tY;1`@$hF?3Yn2zMfsCTZ21hV^b`Wh$kau?Cs9Gb4AlTp1v6Rz1fA`pUa!9G4N^&$sQOYZKr>Y zYXWB^a9i6g`532IL>fkiczY4Q?A_h5p)O~)JRK2Wt)lDPUs@Mf!9F`gd_jfOI~zY? zbATWs9I`#i_&1(+wRAL$tmKjdw=f-U=ZAKTQ(1V=} z%08&m47MmStAqnx$-Z3@r@5FLofqd`q$o!TLnw17QQ@zhJs~4F6_;7_pd;!B{eJXH zvTB7_KM`J_go@0?i-CWEfeF2r1RbzZ$rO;KiGdf*xuj>j ztUA08VVteP@dW?Uu8a|oP6J7znAPN3V+)zJN)LCo&!{VTqb})3tRwSLv)W-MRhIRj zhl~;-cR+bfEh*K(M=mT%Qt@Kdq(+F)+FGRq7i&p5%K%7cgt0mjNxadxSCF-A@|}g@>~qcW*ImRx=W(&5}gDSX*a5bZ(Qv0Nt6Rml<~;zNmWG1k6=Wu6F5hyCJSks-H_;fvLyo?2 zR}fg8+rCMQT2?kMYRO@5MjzK{a5wY@byK<~lIDuY~U^Dcc zW2_9sPKc9YR;=EFNB0`E8SqVGT!nR`@yIL=dPwuu#5zHF_}4B_!;jK|P4Gh-!OfQx2-D)EA7I?DStRX0vH|w(X z%&x9ATH8RJO{fEWVAE}j5qSakJ8|Yw{OdZ`D%+F2#6&E~Whg2|cYNh6d$NhlA_>Yl zl|P5GYH75mzwQ&Rmy_@Crx?>Ib84>Xgn$i>NOH4hz(nh5kDji43Y`f1RA4M2P-P&u z4t}dl|AT&Hx)Ntgf?#JwotRq>OKFh1v;`kJ=34hHlpHGMc; zNdVn0*(^skdVXH|Vz0_qMhaKoMjeK)uX}KC z?s(j>y~xJ`6-@MW5`0}vnI+@Z7+;gX@XTH?{Fk#=%mw+LzR{`35Uxac=Z5Sk3Loo3 z$|Zwtg|l*~({B7>2&kV|0^8dT_zh-jj~~%$E68Q(8OrIQJAUZk7u|K} z4kmZqw+FI=aOe(0nnet1A!kwcvDajRD=6%J<26%Lk{;dubU4U9Hi0<%elvDsVrt5^ zX3%;vg93bLJ?UFfD*Zb;!uVq@Xc~f7rVxpCaASQJvCA9_zfVVgetlpE{1Jc0fQjGj z(0y6_j-eC31BmYq404*;8?TAi_Ws@uwY|T`IP&ig1mE}H7UsjmUzyx#Y;Rzm?yl*L zCDSyXc42~G`GQ`grNK&@)ru@`?9Cmjdv|xb-xA+%?%#Wf?++n@-Fn>1wx6{ph8r=l zY}HUQ7q7bQ1~2Bn+t+6%VjTsUVA1sxU7A6s2~Kn;{=&(AqG{D z1=ZND;M`O`3}n^Nhu_CjU@kF5BDmy=^@u7nWmT&^W`-XZ??7Ai`v=H7G}}PF)#{o0 z8j?^|rn%{_5Bh`3Tyt{^X?RcLepaudI%ll z-oKyH-=FL^r$X|gB~4KfH*&p7Zu~Aqz|*_jD-!i62i~Jo)&x)B>kB9hp5DEy4xU_s z1n%!tB0RnGy)MXZ#lq9~+a2cAvC}JtS8+;1R0wv~u>Wc>aX}KzFLj#CWE2bq(@WL1 z;NTn-B+zqYK=-4SW$y|Kcw+`u7u>#Yb^p4Tvf+uHwzb2P`}4CbAl?mScNOvO-xH<8 zd$WMp-H%~JmU_L0E z?^K)Hiy*GmHtsD*_}AH}u24>mBy2YmxYlg(){k6^>y31@dx_N(PY3cpTJ?n}0Cfo@cl2%l_`%p6V3F_5Un@OBcFE8HRfvqu~ z{JdwO@$Me9+IX^qUM0u7zqfVAlO5d7;^WEDUStLG-iP%5Aozg_t&r~(tfU(IsHcz``A+52*k`>&)5up=Dvf=1I|b6%Krd1j z{a%^~1TnO)TLwHCmm`m4%_Yeq8Y)(ms3BeEku2oMJF>wYi9XWg$gg(mVWElMU5<>r zw1XTOd27FND_&;?_9I6|fQreHv6|t#Xq66U>Ln&k zrUSVTY4Vvvd(wqId#I-_G?lz2C_;41$uC_s}ehMdBDJWOK0b4xt_c4RrLZ9g_-L$xpG5t=eg)`N3hES=Fc96k0`9e zlw?ynDdZQ*w^G_$=p9b>0tytQQ9f^2mcfPCc0m00~Sm2UD|4C~qAC zP&NqWJuZ!H$OLeDoApj4Uek6s2=2;?56db4qpUTmYFQ_iyZcOmjwP?8{`W?_9t zg^(@0ku{UfF+ex;Xx7Xv=-0aIQgZ}&!na}eLJs?!8C}G~JpYFN{vq#e1g}guwrXBB zBxqsiv^XBy5tzPj6Yi1XyC>e9@YQ0iBY1WrVh2up*j;22oU@)=D~!QW(LJ|UFmnVU z2B5EPF@i#2OK^VZ(tkxY81xU1R9v-VwPy@MYYUqS^o_}IbA0^Y&!)I()z(1K#nhKHy zn*P#~BvvgIPtt)lzH`>)RliZ!K-~)Zl-XCU7p+}jIMg?rF!xo8;^51rvz^FB+Rz8V zA;v-M+8cMUCZ&OjM+l!_i|tYVR+@8r;ag}S_#Hy>O zB-T=^654s_q_MULgO3kf44!`&HmGZx<>qypXZ9BSVYnMiOQhA^;QD=TOlR@CHsgUp zb?kr&)f~<4Sbq;rHEZxP0Q{F`u3lv#%yxAldQef;Zt&vfRwlSNYsT;gEZUta=m-Aq z-o17m{mx`^42jMJk#gYZ>sZ#;Qd5G9H0pq>!#qyo0lc z@uUg~ zP(`bnDTT4=`a%qn?uxUBs=kV(sffj0XQCcd88pGcEX~R6;G}2Q?ea?dR$_)34?e8q zSU$e=pbbY}z~l0*M;guPW!Cn|y=&IZv~14+KhSssxFZTrc@jj~3T`0Fr@`gGt{9@n z(@CPJ%tNWS9S<*ZDDT(EBgmv4IFzX6cNJ-gs6w+e*R3{K%E2tsgV}8NBI(4l;{Iwr zX-1LdT2m;Qhq5STB^td?8e`pKXAu~$Kf5%$S#!#NVkNe~jQZCe0wMCh2Lbv->D`&^ zne2RaA$vZ1F?%^%&Q`O*Ocq7AF>{EVpiHc2%%tb#HoWD-&gj;RpUAc47kWIPRG4yc z4CFugz+p2k@`-&hfFrur)r7c$AK-<_FfbwKdF(WUrCH=MIFrDlaP)Cqss*q$_@dF- zA_(TQx$$*Y_+8PEBV^98>(g3ZyHD+0yBHi=fLfeuw*{&9P zcQvP7F}lw!`zh&X2`zTfZ7=70_i{>mY2R{vOiCZix8glq?A^nJ_P~-nty*hbK7WHg z*x@ht{&-qHh6oF>6zoGsUvQ7o0i38&X8KIC9N>@K7)YHhDL5i!fNE=l5Fg}sV>0=9 zlw@aT*oP7A=LCd)3h(yu0eL*+9^n9wUk|%SIK2}a-6Oo+@!01cUn`IO?(z5Jalk!J z%460&J}8ezg1iM|T%KRypB1iG`ey}f&_63=clc)o?U($s!uHGlS%J&>XNB%g|E%Es zihox4e$_ocpzsa(XNB)B|E%!+ntxXKe%(JSe8c`(;k(;ED}2AYS?&kEnY{#oJs9sjKGz1lrb zD12l7S>Ze8pB29Q{IkOMyZ%|>EBI%H@3?Ze3o=+-#&<-d* zo>cf=c=X&kEmz{#oIh^3Mw2>)i8e6~1ZztnfYL zpB28>`)7sk@AJS(>D}0aoXNB*ad!AJI7X7orciulMd>8z)!nfp~ z6~1Nvtngj*&kEmT{#oIB+&?RPm;AHBciBBZsPO$Q|E%!6(LXDEPxxnr?}~p``2K$X ztnjV)XN9lipB28ce^&Tb{jQR28FO1HYkYeVS~bWHEd8IuZ0Z?Wi4z_ zFy9n5D4f^B1_g8@Y*0uyeZvWbv>rAnq>ZpaA>9fa6w)_`4GL*9Y*0vBVS_^24jUBG zPS~K3-Uu5M(wn})GL>6lgF?C;HYlWT2^$pBza2Ixq;Cxy6w7}RNdK;Hu#DzCVS_^Y-mpO-{l~%vh4dc}8x+z%3>y^E_k|4#=|2%RD5U>n*r1TU zKWtD)Kj0fI%lW6m28HyW4jUBG4~7j2>4(Awh4h~Z8x+!iHf&Hxp9~um(hr9X3h6%= zHYlY3yl=3~=ObZ*Li*9LK_UGY!Ul!(Ukn=*(vO7=3hBqg28Hxr3L6yCe>rSWNIwxa zD5RhC4VDf4D`A5|`mcr!3hAf928Hy~VS_^YuZ0Z?>AxN}D5ReW8x+#dh7AhozY#Vl zr2nRGung&QVS_^Y`LIDD{kOsfh4kMJ8x+zngbfPmQ(=Qb`tO7d3hBQaHYlWj6gDWN zU-S)@HT`>GgF^c6hYbqp(_w=``lYZzA^i`+28HxL3>y^EKMord(r3a3h4eoP8x+$2 z*fl&bu9W}FVS_^YCt-s^`k#ai3h93uHYlWD2^$pBXTt`C^gjz56w?1ZY*0wQ8a61T zU-J!?NBtLJgF^aWh7Aho*TV*d^trG>A^oqy28Hy$4jUBGKMflc(r<(f3h93nHYlY3 zt#7bA>YHJMLi(++K_UI`!Ul!(zYiM}(mx9u6w+^p4GQW15H={J|6|yokp6ktppbsY zH&`C^KZOkn>Hi!yD5QT8HYlXu4I32F|0QftNdMQcK_UIiut6dHUf7_J{%>J}Li)e^ z2Fs)VDr`_lzaKUzr2j|QppgEbVS_^YeAu9n{vd2nNdK>}K_UIW!v=-)hhc+4`Xk?9 zdDQi*r1U9y&x#})_oLI_W@ndT6Ij+CeQ$_Rjtkg zVZC`MrKBkcs@ZH?RZ3JDR?1LQ!uod&_F1c0nw1WyjN*@T_)YsUImFpjYbb8Mz$m<+ zwp&N~9?HOb4Hy(DXX;)VwwWCqw>r7iYIS`(p->%JY$DlGv%O-&l5QX)QvE7So{Yx6 zVdKnKV8Cmvzd38(YiO;|kfq1u%|-q){qP3j&tRQitu|HvTHtCt%n|1+h3W9`SHQGq zGYKH*a}jaewKY^)^ykBmSU$1VjG;X45w2u6oF{jYS?^n0au~Ei^g7*kC{)9ab zppn@l3i17$wbp7C1%VM7ZF65?E3P$QfTXTl^^-JLJRkjvhDzvsnak@26kOOF&GVra z6abYMpjy{zTl(q`Vbx?ZEHQjwcahqNM$QH@hfz}~`OH?4R2ybRBok$qn!`h0SgX!D z1F7x-bi}ZLCU;{6$?nC<`SY+XX7m?uTY@``mG)-wUUn#Hf(Wo(JW zXm66*t%{6m7!bWV#DbAVn(!$NIZkGckKYZrQBbUWEEZM*EC~b*m5)#-%(6N2NcF%H4ND~(uz@{8xnn40O zvfiQDpcs7aQ5LD3Em(sM*88fQSVCe9QQO1vX2 zi*2tGsAFdD#4NuHF?)J`J--7n^EhYms#4rYZpY4~>?OJ{nfx!-zWicSvuh6PgoG#o z+ld%_IBWibQq3dszL2>nNl4JWsA$8o(0dYA`UXiW^=QjD*3|yOYlL z@6Z2YuKF+b0nXfEPP=TgWk}89@Jfe4@B1N%(L-5G1T4vYs8^jlgoEOnv)MTqpXsqC zLdlBUe`XVRm%(AZw-{uJtC;GcQGXXPootXbL+iC>tG%5y?*dhD{$RP2$URi5yZ?zjCJT!EF=&(5@zees%L9m@V*Fpr~oo6{{ z##rsV*4{)atGD5n0S__zWM_)0W#RaTBoc7Ah0rG0Xvz&jz*<+QG=Sp2}mpS-;M7}~MFDo`Tn()qOqwK)AnY6NV zqq)R-13~ZysZhDW{76{dcV-P-Db}XPT1+~FMrLB2a1;D13Td*|WF z;JvBKKiwr<4i2k)XrAFB0@Eg(_$YFsd7t>|fFV?YJzt3Ios}!0U63VEq?@lqFaWzV zNtZuLr+Q<4U)IFC2Wnmu;r1D0EFeMfzHD|DXJm7e_v{*W9Nt{5_;;BcwG(C{$id+m znH^WQs^#mgrw*G@E(w1l3zT0Vg|Fkh!6|1PY1Upl0T=0L)99m6Y0Qg@G(3=z+qd-r zI3CGr<7GIwqc5)S2e`f;$_Dr!)^~g&_;Bj-UP|ZJ*{o%LS9#Net@pVb`e?d_G#8j@-vp<6#L9GiLDSwMN2cDSHO; zKp6#baVsm$OXBwS_B?VZN&VXrJ}IfkGGB1N!=0S&RrE_MEtgP{tge9&a?z@9|Jc?C zY2~j~H{i+)HHP?4@@G`hXwny57M}TY8*7ZspgsiZ2^p_AzSX#1gbcatU)%jL_$1ihKah% zK-f=b2TNARMyK4GbYUgVA*l^Aw2YP5&JGa)TV{A@xgjo3aLp@kS6jnIe}La_y}TWH z9BFm7C^GsNg3o3LPuZd1dyYCGNTF&GaOlhp5O1mx&EWKDjQ6;EK{6Fm%^*t12}8Gk z9yUz>QsgCm!}tz(zaz6@+WRJ`biMC9EUOjpfz(fifuWs^_UE(antK^K1GF%TW)TS< ziSr08$-H%$CqX7rLV1GDCXp(_)IX1i5B-w6@KiQ)#(Xhrve|RjGr?0J6+r-}vSudu zBL0RK;8Sq3wO)O?h+cR&#ZetBGCH{Y1dtGE>231Kw76)Tz3mp`lPU&Y;M=VLBV{89 zR&iZQ61C{;GC7U{kTK3E&K9^7o}Yq}S4KBO5&;1k8|xtmzLXuDwwuks2xJ|0>Ra7w ztV58Q2W82_hftE&XUwV94pOOuYPqM}PGH52DE5&56X7H3{2+Rc7m^3&V zU*@YRV!gp;8=rxYGoZBf6gdt_VyiBOJ=SOFE+eZl{^( zPd+Z@FW|g0rUk2pT+s68iuIjO>GN>rxN+-D0h84YYOQP4%Ig$Mq46V?D{qnk;!mih z*emjGV+c^{HcF7!A+zdQ7e{Q?S-5FKf_*En=nh#Biqpy*D)V)ESl>W26(alOPcoa-aVtCi-kQq z*P`^-eUM^nhFG{sv2)a+as_W~ZbSYN;dF%=uXAQGBDac$Q4S;hteG5srQGiI%0T9G zy7~gDJFC6-;8ZyI#~KhrK+e;qp3SspaJKBu*=||T?1p?)1eL3Stfzg-*tc!o6-3^y z(7pqbxCtdJP#rzs0qReP-bXTLXGl2tF1CqjK8dz`87+^LYtWs)$RS>l`NMFCb?H$k zm=@-S+6B|Wp)7p5{l$p37ji^J(Q(DE`0)XD^tPB(?->xtJk8K zXyezA!hU0WYYQtW0eyH6)n%0Q%C;jaU^mA1OekJJ3ocPkl@-JVB0|AMfJAtIZgkeY zG>D*FsNCD#r`e3!ej3fhPafmPBgjsc@zzI3|52C0LO>mV**((6b^*Vj1U;zGfsJZ1 zw{%q0Ad$W)S4IaNSwcYxkl+Ix^N^cqOS{(Hjt)AvAd-KzViy|W9|t)8;mjXjL|B`a z|Ff&j025(##4-kZNkE_9#NAQoPqMj<#D&HeVrhkebV*q<2U!xb1x=w3BY8}A znu>3{P+hCmw%Q~ClqrEK-$sHd-gIYS*$#rQLFPH#Xu8wRo5{v62WkX@8NN`>S8;=Nu8qTX^ad*snmXT}jDjn(=@;7YQ`kdcQi%5?>kjczJ z-2gmcXnhm7)o4D|XG;D>M5f#3#~zrTgZAN6sJm*}D~>2Fh$G@y5D1@GK$T5AbAzFZG!@t98V? zTrd*DAPPiZ_M)LAtG*;McokP*2u!#~NS+K45n7#9qW7xOcuexKNAg(1wd-Bsydqgj z1@;ZDJfP!0g8rotBThL;UCn|$f!d$FGXiQjlI}5yG$Qe;Tigk&+aZ+D0Uj4fscxdm zt+>21Oc$ze5(kMr!8EWdOikO}3xNsrQxNxbqp?wekB`@bKuIiTE5!E9A9EMkye5^c zh>Ot0NIWgvL2L*4s}0=$RGU)FX5PVX+~M%=a3$S4lSG;sU%N(h;oT!k^f~k_Zllw& zF0&kVqdNxbajh7;Xe7NkGJh`D6Z&T8Y+M~3!7)0su!2>n8vq+{pdWEZm4NX?T?>zu z>m`0@ca?d+wKHAKT|+gFBv~CnuBU3F{%{LMxX;XTZ2#w4n4jKmA%8J zC@^ET2T=B-{bnLkR)i*)%rS%8TiQshWY~6x!18aPC~$4f4$2=b?ZL?H?HFX9QtWxz z4rQd+N*owRA&L`rKbZ6Rh0phJW-&I`HR-K*DY7cKQ?FII#6Qg~&tyK;y$xLHhJca3 zQ7c2s1WI6|$e$p%OH$a-uF6jv-aeewF0_fjtGaoosR#bm>cwjjthG9;mK83tdq$D| z%tyM0eKqfrIBQ5#q{Y&$WV5?S`R$!)gXnoX(6cA$!{8}uSn-=C(h$!51C&DYqNOtJ z?_|xieetYyfW-y)2s8r~{X8UZo^==VPlWdsp@9YewkR(l7CdpqjSus-UR|<5%J|=f zI@*q}3UAn6zY-rDb_VT0qykDq)(^ED-lmG5D?RZ>QWn$&E`-fpz=5bk8UMtU5|ryu zRJJJ$C%FTB{eIjF0zn#BDwxpcO+a*{iAjUz4r3XN@Hphfxz^~wNQI0@8;v^hNuW?G z%Dci(5|?~i9ug{5k^ZQV*4K@pw=HE?m?8nKs9aaEz}LyRAWd2E3WfEcjiVf|se z@MEPQFJykUl$RMy?t-zvonfB2NhTj>XnqkbM{<)R(?Cja*m4| z}*1G`m0-?9o?v(HQz3tL46yc@`v(Hsn z1e;}Nm5wR~$1cc^NWTTR)3y!yUF%R7CX|B64mXRh*fT#y;uQ`Cu_P+31W*7TQJB2f3Cvg!yOC95)*uXMoTr`gG zcA!ZtXHG?a)ckJ&_0GJYmfjeB^@`MPU&U(Gnbxg1EFZ%1k+x{V@?~Pd&A1K=mnC$Q zHn@MoYIBm{nMnyp07mGpbR(k~Z_^09l8&lo@FdusFb|%Bo21G(DaiZ-CATPH!GYkM z+-Y<`$<-r4=3;G#xG1o&GdobSdB!|KH!7c-3Z$J`b_7OunjNSy9-vn(NDIhUB}tE* z*iih;lDJw$yCjS0^(ci2lU=W66ZE#l6ar=TbH|>g6 zW?0n@sa!ZfAyZIDI|P#hQvFcO!>n-wh8}p&Lz=459E;Uu;DO8NWSO2M-;0C?0K2eW zcNvkU{U_q^CO-98d^HJMd)u2kjFxwvSN)LMrHIg4W#t=|p_U$4pZU?PWc@r!^NE)Wt8;z~&Xu{7M7P_k0f zDYeJ?DZMPem-QW>XGEIeGRxC`x2 z&!tW!%{>SsGOU4)tq|~3!aPbLvgglzv@VcoU?aj?gu5$~XmV-RR5=VM3=}eL7Ewk) zc*(i-b&y*6s_aZ+L>~73k}1M`fA+Fj#yAeC5sgL~E-Hd+xTV9|#4Cj-G**rlpO8)X ztRYdIRv|B0$V$$=EQg0NjnvI(kIDXcX#CB{1au-oFRRRez@6n&Zceuj7 zBdR0U%A2skUac1kz;qadfjz|ZG@-~X;aF1W;Am4*HS zHJt$n2Tc3n#iiBQfGwzyuN5&fU@GV&0~9y)KPSE}dZ$9PB(a&oJ6vDr`=Tms zC=RdV85F$$a=#;V8MvL`%ih2>rP?UE8pVBCflI}WzRVnHro_m(7mILSWl2&{2oOQs zfzyRz>%V47rbDOw^vjHVOoM|m0@~GSMvP9_cv< z#o;q@he!o@K()-+(e>KZjwD_rr{*TR^AVB{y^9nJ3%E2|%}ft$OCxl-O?(z9G?>kl zW?%{2Y=i?i)y(t^cuQru0a^J%xz<8j&Xf+1K-Ci=%bp^OVR92jAkVy8Tm`BP$^%laE?G(w2w^>7F6{gng6 zfbTKD;a&rTkf#r@>yGvv+0hdLGz<QIGPly8rQLYa z*V2d@Q(=IIRJYz1(rvx73qV1m}c zzJqee$`R>|h9KrvaT%+>+-NLqg78P?cql8bjqx>dOG93D6TV{Y2G|Kd#N;Jw`X9cr z1c3u=VQOjt>gP?C1dvn(vdK*6Ub?~?h6_K>1a}-Uli{;?HXeoqNckKqgB573iNwhZ zBiXf8%wqmc;4*#oa1Z09qRun2LF0yUq#~-LA{8*4LwK9l1>55B;mnV>%Inaot@0XG zM*3msg?GpDJNAm@-4im|w>$ifE(hGzH>!&~eMnOr1f_5pm|sKcAxLt0>PGK8;?sDm zn-#78$wQT&w6D8hpZLB=MsXe<4){e<2%!sp2SXL)ebELD8%Wi#Y83_^nRED%Jz~ zQ7$5uyLig4yj|eX370$^w|Gulbv0JI($bv>XCfOagr}O1o_hKK5;;p(pr3BFi-*NH z?09!*YK}uzS`|Gm85^ z4-@LkT$;)It>F2#2VmMaD&qb;Os0SEY;-d2TrB{TNI;@TnRtj0vW?JBM&A~4)#H?r z3fY5L!F>*A0rtnW(@_41oua^aixrTTR-^fi0W)pO@-S`-v7E2Z{Kb;8I=VE1M<~55 zt?}~}z$cwSoloLx-MPU=K%YTF1~OkJx>9X|)9YRabM&Z4FG{P7k{*GPyGqA*9T|jY zJ#U9B&z|Hx?a>*hOvBv^9-+XF>fJ}oBHo^w+JG3+YEMnU{gmyH!ai|E4myqip#)#K zbb7&wNJiL`}x!l0|NVqym;ZEbKL=5r03UMC6%W<33T1i%UKDEEa(OTnN^l*M$^-YK+Zj*?M zD*904eX!)Y4ns;Am`yH1;CE|RQfnYi!p1dt*)XOs?*Ubi3u!2{c=OPvH1aKqeuOF^l_!I2J^Jy+k0bbYp@mp9vDMqSe(NkoXUq6wtktkJZ4wB{v}*iuB~N~#q)Dq_M{n2(uZbP^LvuA=R2X+TGzY4g;wEzt}}@}zA?0->p3Ew8jNz}1C}7k8(Bvh zRLQ;{G(LX%5n2m`-;3#sONoYJL0|S2R#m6As!P5Hr`9)=3D+=qKwVUCej@n_yryrB za&(m}0)^tp`!KvmD^I1K|GeW%#W_Pj8G(CdIY$pAi#@<=OnUM!@I#2BIPriT#4qdE zVD`qZZ*F7ew`;%$(y|}Z0mrbp7ZzOx232FVf^}~Bs23tcw@4L!w&hhn((@j~MrIRw zlUBy+-$}NKUFFMgYsFu~gw2TDcWwdIH{pagzC(1vrnLU6HJoR4$jOO0j#4-iX2u6DXOd6UOjkTl8p>ds)J z939`hLDGG@1=I?LeyoUa!%eLm!)4Vtw=*u?!he<>9L~PenH>!29Nb)s9AP-Poc3bU zRYnUGryh*UOwi+K6ie{n=^`55kdLT3GrPW4Yt9y9NwE;)+unlIhH)PzS5$e+hrudq z+k20bxW}u@NzV7)$U&J>CK${U|Er_ zt+*k53UF^Xt=3DcuvUtSv8)CohhEQr%YKMnPs?1fyJe{iv>7e)5!l4VRkv*HM%+Ui zovaEzIa;TU8_B-ZVW4%t0j0$sBGTjW-oXiMu4oc&$`a6X=Y-E+HxiWlX~mau-oXuP zP{!h1ftDoW7dC?7h#U~*w?5z46TK<=2!chNGpT8xFoO@-A6e4zbyvdkeP-6)nUbe^ zm1ptg1^K5Zeimra-H1u@Wba_b*7|P0)}ls#WC|KIyJZ?>3cX^>A2aK{(&I5}c~m30 zN~k55+%-}}1bYSf^MkxV+0do4_f`=xoA^OpbVdp}OpwkG;~Jvv#?9I7o4az;p@`_9 zFir9hwZeNV3*IUd>kTt?#=U#Ly?n!|Eq_$&^YKcaqiBiH+aZ(8(6ZdeeD74d2|3bZ|utO)OwI{5*o! zM>V;SnuO%unP^V(enP9ZYK(&{FNYbG5jc+F*{TWHmuS3lm(B+Mj#Arjv78^lEiVtQ z_&N9)ZEmkrlk7_BpGw8HY6<0n&Mk;8GP`M4+S`wg?>3Rl&>Y~bYW%)i)v@ZBAH@4O z{eQLX6HXDlT)Jl2cg~YN@AfVx7x&ufBE6Au%Nc*l=T5pu(kkHK;k>AZKl*`NIOv$> zIYNi^;#ngh?e`KNZ+QQ>eCbT_oGC(_&|V7aaSC$6=P z^}YWIh{{daphulvd=46H8Q6@GSCT@h6M-P%*I+Zfh~gb(fqAHiYx755T04~#_TmgY zkP5mOOnRZw2LZ1%TME!+uZQNgo&M|5cfae!Klu&Cx_h$` zLW9N@_+i*Ev%9HxZFhR=w!>4Qk&<@`XJubp;sgx6wzMgFji}3NSN2-ikSK>*RzeS$ zwinfL%?7)hMdNw<<31?pnuac+AR8xoixd`SpO$86pB~AU4CUyDfi$4Q!1uS1AL|_~ zr}gx-B4E#EC)9^#Z|rofe$J4EB4TmoB#cRfW1>hOx{~o6MzSO)s7I2a=hsN73!#`p z3R-<>UdfW#EM>QWR3yi9-!W77Eh|e`JAJ6Q)O?qD=|dSvbL1M}(OFNsT|}&yQghQw z2i4DUQfQr9yVs~+dHP+`Oh4}=awG?KQfLs}!w+mwAqh%((6oYvrTpj+DO;cJCH;~i zh-K<3?JUbZ0m|6EFWKB&gNjM=(p%yi*<|ouNYk_Cvl+}VkQe#-8sZ>^1JA>4qLqC+ zq~TDShg&b>>S4g?L~ms}l6I9*KntI3HJcTV#Fw1tJmN=Xvp3b<`;ebp2-?+n*y<#&#Uc9R9E_x{)EJ^MS@@0;nm z!0+@-hs@LtadgfZon)puCO{DbiLwL8$b;h^dQ2q}Qb4tr=o}U>S#8DANl*KX6A^AZ zM(mK_z;)dgB*VIS^)WY6^WO!~yemPll10Va}E0hMX7$9rePHORA? zC6niH-dSJ!I}>9-dg#fNaVkE6t)J~B>H1S?a<--SYxB4UdiO~0HhF>dCGhr>a*<#5 zQY!WD=4JX_J$dpB9%}&n3|@}-hL71-8wC4Z=uPL&Y~G#u9|$(6+$XSIZNE23F7##< z9+S8_z1RzaU$Uf0pW&*4m&KdzsI$bHjeI7e*&ZC!(gKw(cJ>wGDD5Zf@_n z2g!?_SK2zCgw!9?w%CYE3u~Lwg5!%$8M19lEW)+ZTOl;L$JRT%OlqBHNVax1c)qc5 zbBAPVU>D}lzzwx+XARbp#)IvqDo* BkW5_axs+`<<-yTFP(7I5lVd#hAP9PF5f| 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∈s04C0@=2 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

oZqJ&9^Td)!k7R4tgU}?b_mCvF*WhImxXZs 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 }f8NcIR5+eA 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 eWx{o05f7u + + + + + + Vite + React + TS + + +

+ + + diff --git a/examples/with-vite-papi/package.json b/examples/with-vite-papi/package.json new file mode 100644 index 0000000..6cf710e --- /dev/null +++ b/examples/with-vite-papi/package.json @@ -0,0 +1,34 @@ +{ + "name": "with-vite-papi", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc -b && vite build", + "lint": "eslint .", + "preview": "vite preview" + }, + "dependencies": { + "@luno-kit/react": "workspace:*", + "@luno-kit/ui": "workspace:*", + "@polkadot-api/descriptors": "file:.papi/descriptors", + "@tanstack/react-query": "catalog:", + "polkadot-api": "1.9.1", + "react": "catalog:", + "react-dom": "catalog:" + }, + "devDependencies": { + "@eslint/js": "^9.33.0", + "@types/react": "catalog:", + "@types/react-dom": "catalog:", + "@vitejs/plugin-react": "^5.0.0", + "eslint": "^9.33.0", + "eslint-plugin-react-hooks": "^5.2.0", + "eslint-plugin-react-refresh": "^0.4.20", + "globals": "^16.3.0", + "typescript": "~5.8.3", + "typescript-eslint": "^8.39.1", + "vite": "^7.1.2" + } +} diff --git a/examples/with-vite-papi/public/vite.svg b/examples/with-vite-papi/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/examples/with-vite-papi/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/examples/with-vite-papi/src/App.css b/examples/with-vite-papi/src/App.css new file mode 100644 index 0000000..825c0f5 --- /dev/null +++ b/examples/with-vite-papi/src/App.css @@ -0,0 +1,535 @@ +.demo-page { + min-height: 100vh; + background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); + color: white; + font-family: + -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", + "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +/* Hero Section */ +.hero { + padding: 120px 20px; + text-align: center; + background: rgba(255, 255, 255, 0.1); + backdrop-filter: blur(20px); + border-bottom: 1px solid rgba(255, 255, 255, 0.1); +} + +.hero-content { + max-width: 800px; + margin: 0 auto; +} + +.hero-icon { + font-size: 4rem; + margin-bottom: 1rem; + animation: float 3s ease-in-out infinite; + display: flex; + align-items: center; + justify-content: center; +} + +@keyframes float { + 0%, + 100% { + transform: translateY(0px); + } + 50% { + transform: translateY(-10px); + } +} + +.hero h1 { + font-size: 4rem; + font-weight: 700; + margin-bottom: 1rem; + background: linear-gradient(135deg, #fff 0%, #e0e0e0 100%); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; + text-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); +} + +.hero-subtitle { + font-size: 1.25rem; + margin-bottom: 2.5rem; + opacity: 0.9; + line-height: 1.6; +} + +.hero-connect { + display: flex; + justify-content: center; +} + +/* Features Section */ +.features { + padding: 80px 20px; +} + +.container { + max-width: 1200px; + margin: 0 auto; +} + +.features h2 { + text-align: center; + font-size: 2.5rem; + margin-bottom: 3rem; + font-weight: 600; +} + +.features-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(350px, 1fr)); + gap: 2rem; + margin-bottom: 2rem; +} + +/* Feature Cards */ +.feature-card { + background: rgba(255, 255, 255, 0.1); + backdrop-filter: blur(20px); + border: 1px solid rgba(255, 255, 255, 0.2); + border-radius: 20px; + padding: 2rem; + transition: all 0.3s ease; + box-shadow: 0 8px 32px rgba(0, 0, 0, 0.1); +} + +.feature-card:hover { + transform: translateY(-5px); + background: rgba(255, 255, 255, 0.15); + box-shadow: 0 12px 40px rgba(0, 0, 0, 0.2); +} + +.card-header { + display: flex; + align-items: center; + margin-bottom: 1.5rem; +} + +.card-icon { + font-size: 1.5rem; + margin-right: 0.75rem; +} + +.card-header h3 { + font-size: 1.25rem; + font-weight: 600; + margin: 0; +} + +.card-content { + font-size: 0.95rem; +} + +/* Status Items */ +.status-item { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 0.75rem; +} + +.label { + font-weight: 500; + opacity: 0.8; +} + +.status { + padding: 0.25rem 0.75rem; + border-radius: 12px; + font-size: 0.875rem; + font-weight: 500; +} + +.status.connected { + background: rgba(34, 197, 94, 0.2); + color: #22c55e; + border: 1px solid rgba(34, 197, 94, 0.3); +} + +.status.disconnected { + background: rgba(239, 68, 68, 0.2); + color: #ef4444; + border: 1px solid rgba(239, 68, 68, 0.3); +} + +.value { + font-family: + "SF Mono", Monaco, "Cascadia Code", "Roboto Mono", Consolas, "Courier New", monospace; + opacity: 0.9; +} + +/* Buttons */ +.disconnect-btn, +.chain-switch-btn, +.account-switch-btn, +.sign-btn { + background: rgba(255, 255, 255, 0.1); + border: 1px solid rgba(255, 255, 255, 0.2); + color: white; + padding: 0.5rem 1rem; + border-radius: 8px; + font-size: 0.875rem; + cursor: pointer; + transition: all 0.2s ease; + margin-top: 0.5rem; +} + +.disconnect-btn:hover, +.chain-switch-btn:hover, +.account-switch-btn:hover, +.sign-btn:hover { + background: rgba(255, 255, 255, 0.2); + transform: translateY(-1px); +} + +/* Chain Info */ +.current-chain { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 0.75rem; +} + +.chain-name { + font-weight: 500; +} + +.chain-indicator { + font-size: 0.875rem; +} + +.chain-list { + display: flex; + flex-direction: column; + gap: 0.5rem; +} + +/* Balance Info */ +.balance-info { + text-align: center; + padding: 1rem 0; +} + +.balance-amount { + font-size: 1.5rem; + font-weight: 600; + font-family: + "SF Mono", Monaco, "Cascadia Code", "Roboto Mono", Consolas, "Courier New", monospace; +} + +.balance-symbol { + font-size: 0.875rem; + opacity: 0.8; + margin-top: 0.25rem; +} + +/* Account Info */ +.account-name { + font-weight: 500; + margin-bottom: 0.5rem; +} + +.account-address { + font-family: + "SF Mono", Monaco, "Cascadia Code", "Roboto Mono", Consolas, "Courier New", monospace; + font-size: 0.875rem; + opacity: 0.8; + word-break: break-all; + margin-bottom: 0.75rem; +} + +.account-list { + display: flex; + flex-direction: column; + gap: 0.5rem; +} + +/* Sign Section */ +.sign-result { + margin-top: 1rem; + padding: 1rem; + background: rgba(0, 0, 0, 0.2); + border-radius: 8px; +} + +/* Transaction Section */ +.transaction-section { + display: flex; + flex-direction: column; + gap: 1rem; +} + +.transfer-form { + display: flex; + flex-direction: column; + gap: 1rem; +} + +.form-group { + display: flex; + flex-direction: column; + gap: 0.5rem; +} + +.form-label { + font-weight: 500; + font-size: 0.875rem; + opacity: 0.9; +} + +.form-input { + background: rgba(255, 255, 255, 0.1); + border: 1px solid rgba(255, 255, 255, 0.2); + border-radius: 8px; + padding: 0.75rem; + color: white; + font-size: 0.875rem; + transition: all 0.2s ease; +} + +.form-input::placeholder { + color: rgba(255, 255, 255, 0.5); +} + +.form-input:focus { + outline: none; + border-color: rgba(255, 255, 255, 0.4); + background: rgba(255, 255, 255, 0.15); +} + +.transfer-btn { + background: linear-gradient(135deg, #10b981 0%, #059669 100%); + border: none; + color: white; + padding: 0.75rem 1.5rem; + border-radius: 8px; + font-size: 0.875rem; + font-weight: 500; + cursor: pointer; + transition: all 0.2s ease; + margin-top: 0.5rem; +} + +.transfer-btn:hover:not(:disabled) { + transform: translateY(-1px); + box-shadow: 0 4px 12px rgba(16, 185, 129, 0.3); +} + +.transfer-btn:disabled { + opacity: 0.5; + cursor: not-allowed; + transform: none; +} + +.transaction-result { + margin-top: 1rem; + padding: 1rem; + background: rgba(0, 0, 0, 0.2); + border-radius: 8px; + border: 1px solid rgba(16, 185, 129, 0.3); +} + +.result-item { + display: flex; + flex-direction: column; + gap: 0.25rem; + margin-bottom: 0.5rem; +} + +.result-item:last-child { + margin-bottom: 0; +} + +.result-item .value { + font-size: 0.875rem; + word-break: break-all; +} + +/* No Data State */ +.no-data { + opacity: 0.6; + font-style: italic; +} + +/* Code Examples Section */ +.code-examples { + padding: 80px 20px; + background: rgba(0, 0, 0, 0.2); + backdrop-filter: blur(20px); +} + +.code-examples h2 { + text-align: center; + font-size: 2.5rem; + margin-bottom: 3rem; + font-weight: 600; +} + +.code-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(400px, 1fr)); + gap: 2rem; +} + +.code-card { + background: rgba(0, 0, 0, 0.3); + border: 1px solid rgba(255, 255, 255, 0.1); + border-radius: 16px; + padding: 2rem; + overflow: hidden; +} + +.code-card h3 { + font-size: 1.25rem; + margin-bottom: 1rem; + font-weight: 600; +} + +.code-card pre { + background: rgba(0, 0, 0, 0.4); + padding: 1.5rem; + border-radius: 8px; + overflow-x: auto; + font-family: + "SF Mono", Monaco, "Cascadia Code", "Roboto Mono", Consolas, "Courier New", monospace; + font-size: 0.875rem; + line-height: 1.5; + border: 1px solid rgba(255, 255, 255, 0.1); +} + +.code-card code { + color: #e2e8f0; +} + +/* Responsive Design */ +@media (max-width: 768px) { + .hero h1 { + font-size: 2.5rem; + } + + .hero-subtitle { + font-size: 1.1rem; + } + + .features-grid { + grid-template-columns: 1fr; + gap: 1.5rem; + } + + .feature-card { + padding: 1.5rem; + } + + .code-grid { + grid-template-columns: 1fr; + } + + .features, + .code-examples { + padding: 60px 20px; + } +} + +@media (max-width: 480px) { + .hero { + padding: 80px 20px; + } + + .hero h1 { + font-size: 2rem; + } + + .features h2, + .code-examples h2 { + font-size: 2rem; + } +} + +/* Simplified Hooks Reference Styles */ +.hooks-reference { + background: var(--bg-secondary); + padding: 4rem 0; +} + +.hooks-reference .container { + max-width: 1200px; +} + +.hooks-reference h2 { + text-align: center; + margin-bottom: 1rem; + color: var(--text-primary); + font-size: 2.5rem; + font-weight: 700; +} + +.section-subtitle { + text-align: center; + color: var(--text-secondary); + font-size: 1.1rem; + margin-bottom: 3rem; +} + +.hooks-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); + gap: 2rem; + margin-top: 2rem; +} + +.hooks-group { + background: rgba(255, 255, 255, 0.05); + border: 1px solid rgba(255, 255, 255, 0.1); + border-radius: 12px; + padding: 1.5rem; + backdrop-filter: blur(10px); + transition: all 0.3s ease; +} + +.hooks-group:hover { + background: rgba(255, 255, 255, 0.08); + border-color: rgba(255, 255, 255, 0.2); + transform: translateY(-2px); +} + +.hooks-group h3 { + margin: 0 0 1rem 0; + font-size: 1.125rem; + font-weight: 600; + color: rgba(255, 255, 255, 0.9); +} + +.hooks-list { + display: flex; + flex-direction: column; + gap: 0.75rem; +} + +.hook-item { + display: flex; + flex-direction: column; + gap: 0.25rem; +} + +.hook-item code { + background: rgba(255, 255, 255, 0.1); + color: #64ffda; + padding: 0.25rem 0.5rem; + border-radius: 4px; + font-family: "Fira Code", monospace; + font-size: 0.875rem; + font-weight: 500; +} + +.hook-item span { + color: rgba(255, 255, 255, 0.7); + font-size: 0.875rem; + margin-left: 0.5rem; +} diff --git a/examples/with-vite-papi/src/App.tsx b/examples/with-vite-papi/src/App.tsx new file mode 100644 index 0000000..fe41889 --- /dev/null +++ b/examples/with-vite-papi/src/App.tsx @@ -0,0 +1,426 @@ +import { + ConnectionStatus, + useAccount, + useAccounts, + useDisconnect, + usePapiSigner, + useStatus, +} from '@luno-kit/react'; +import { ConnectButton, useLunoTheme } from '@luno-kit/ui'; +import type React from 'react'; +import { useEffect, useState } from 'react'; +import { usePapiClient } from './hooks/usePapiClient'; +import './App.css'; +import { toHex } from 'polkadot-api/utils'; + +const App: React.FC = () => { + const status = useStatus(); + const { account, address } = useAccount(); + const { accounts, selectAccount } = useAccounts(); + const { disconnect } = useDisconnect(); + const { themeMode, setThemeChoice } = useLunoTheme(); + const { data: papiSigner } = usePapiSigner(); + + const { + isReady, + error, + currentChain, + availableChains, + balance, + switchChain, + sendTransaction, + loadingBalance, + } = usePapiClient(); + + const [signMessageData, setSignMessageData] = useState<{ signature: string } | null>(null); + const [sendTransactionData, setTransactionData] = useState(null); + const [isSendingTransaction, setIsSendingTransaction] = useState(false); + const [detailedStatus, setDetailedStatus] = useState(''); + const [transferForm, setTransferForm] = useState({ + to: '', + amount: '', + }); + + const showNotification = (title: string, message?: string) => { + if (window.Notification?.permission === 'granted') { + new window.Notification(title, { body: message }); + } else { + alert(`${title}: ${message || ''}`); + } + }; + + const handleSignMessage = async () => { + if (!papiSigner) { + showNotification('Signer not available', 'Please connect your wallet first'); + return; + } + + try { + const message = 'Hello, welcome to use luno kit. Have a nice day!'; + const messageBytes = new TextEncoder().encode(message); + + const signature = await papiSigner.signBytes(messageBytes); + + setSignMessageData({ signature: toHex(signature) }); + showNotification('Signature successful', toHex(signature)); + } catch (error) { + showNotification( + 'Signature failed', + error instanceof Error ? error.message : 'Unknown error' + ); + } + }; + + const handleSendTransaction = async () => { + if (!transferForm.to || !transferForm.amount) { + showNotification('Not available args', 'Please provide complete transfer details.'); + return; + } + + if (!currentChain) { + showNotification('Chain not available', 'Please select available chain'); + return; + } + + if (!isReady) { + showNotification('API error', 'PAPI is not yet ready.'); + return; + } + + try { + setIsSendingTransaction(true); + setDetailedStatus('Preparing transaction...'); + + setDetailedStatus('Creating transaction...'); + const result = await sendTransaction(transferForm.to, transferForm.amount); + + setDetailedStatus('Transaction submitted!'); + setTransactionData(result); + + if (result.status === 'success') { + showNotification( + 'Transfer successful', + `TxHash: ${result.transactionHash.slice(0, 10)}...` + ); + setTransferForm({ to: '', amount: '' }); + } else { + showNotification('Transfer failed', result.errorMessage!); + } + } catch (error) { + setDetailedStatus(`Error: ${error instanceof Error ? error.message : 'Unknown error'}`); + showNotification( + 'Transfer failed', + error instanceof Error ? error.message : 'An error occurred during the transfer process.' + ); + } finally { + setIsSendingTransaction(false); + } + }; + + useEffect(() => { + if (window.Notification?.permission === 'default') { + window.Notification?.requestPermission(); + } + }, []); + + return ( +
+ {/* Hero Section */} +
+
+
+ +
+

Luno Wallet Kit with PAPI

+

+ Using Polkadot-API (PAPI) with LunoKit for React applications +

+
+ +
+
+
+ + {/* Features Section */} +
+
+

Live Demo

+
+ {/* Theme Control Card */} +
+
+ 🎨 +

Theme Control

+
+
+
+
+ Current Theme: + + {themeMode.charAt(0).toUpperCase() + themeMode.slice(1)} + +
+
+ + + +
+
+
+
+ + {/* Wallet Status Card */} +
+
+ 💳 +

Wallet Connection

+
+
+
+ Status: + + {status === ConnectionStatus.Connected ? '✅ Connected' : '❌ Disconnected'} + +
+ {status === ConnectionStatus.Connected && ( + + )} +
+
+ + {/* PAPI Status Card */} +
+
+ 🔌 +

PAPI Status

+
+
+
+
+ PAPI Ready: + + {isReady ? '✅ Ready' : '⏳ Loading...'} + +
+
+ Network: + {currentChain?.name || 'None'} +
+ {error && ( +
+ Error: + {error.message || 'Unknown error'} +
+ )} +
+
+
+ + {/* Chains Card */} +
+
+ 🔗 +

Chain Management

+
+
+ {currentChain ? ( +
+
+ {currentChain.name} + +
+ {availableChains && availableChains.length > 1 && ( +
+ {availableChains + .filter((c) => c.id !== currentChain.id) + .map((chain) => ( + + ))} +
+ )} +
+ ) : ( + Connect wallet first + )} +
+
+ + {/* Balance Card */} +
+
+ 💰 +

Balance

+
+
+ {address ? ( +
+
+ {loadingBalance || !isReady ? 'loading...' : balance?.formattedTotal} +
+
{currentChain?.nativeCurrency.symbol}
+
+ ) : ( + Connect wallet first + )} +
+
+ + {/* Account Card */} +
+
+ 👤 +

Account Management

+
+
+ {account ? ( +
+
{account.name || 'Unnamed'}
+
{address}
+ {accounts.length > 1 && ( +
+ {accounts + .filter((acc) => acc.publicKey !== account.publicKey) + .map((acc) => ( + + ))} +
+ )} +
+ ) : ( + Connect wallet first + )} +
+
+ + {/* Sign Message Card */} +
+
+ ✍️ +

Sign Message (PAPI)

+
+
+ {status === ConnectionStatus.Connected ? ( +
+ + {signMessageData && ( +
+
+ Signature: + {signMessageData.signature.slice(0, 20)}... +
+
+ )} +
+ ) : ( + Connect wallet first + )} +
+
+ + {/* Send Transaction Card */} +
+
+ 💸 +

Send Transaction (PAPI)

+
+
+ {status === ConnectionStatus.Connected && isReady ? ( +
+
+
+ + + setTransferForm((prev) => ({ ...prev, to: e.target.value })) + } + /> +
+
+ + + setTransferForm((prev) => ({ ...prev, amount: e.target.value })) + } + /> +
+ +
+ {sendTransactionData && ( +
+
+ Status: + {sendTransactionData.status} +
+
+ Hash: + + {sendTransactionData.transactionHash.slice(0, 20)}... + +
+
+ )} + {detailedStatus && ( +
+
+ Status: + {detailedStatus} +
+
+ )} +
+ ) : ( + Connect wallet and wait for PAPI to initialize + )} +
+
+
+
+
+
+ ); +}; + +export default App; diff --git a/examples/with-vite-papi/src/assets/react.svg b/examples/with-vite-papi/src/assets/react.svg new file mode 100644 index 0000000..6c87de9 --- /dev/null +++ b/examples/with-vite-papi/src/assets/react.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/examples/with-vite-papi/src/constants/index.ts b/examples/with-vite-papi/src/constants/index.ts new file mode 100644 index 0000000..f657888 --- /dev/null +++ b/examples/with-vite-papi/src/constants/index.ts @@ -0,0 +1,58 @@ +import type { HexString } from '@luno-kit/react/types'; +import { dot, ksm, paseo, wnd } from '@polkadot-api/descriptors'; + +export interface Chain { + name: string; + id: string; + genesisHash: HexString; + endpoint: string; + nativeCurrency: { + name: string; + symbol: string; + decimals: number; + }; + descriptors: any; +} + +export const CHAINS: Record = { + polkadot: { + name: 'Polkadot', + id: 'polkadot', + genesisHash: '0x91b171bb158e2d3848fa23a9f1c25182fb8e20313b2c1eb49219da7a70ce90c3', + endpoint: 'wss://polkadot-rpc.dwellir.com', + nativeCurrency: { + name: 'DOT', + symbol: 'DOT', + decimals: 10, + }, + descriptors: dot, + }, + kusama: { + name: 'Kusama', + id: 'kusama', + genesisHash: '0xb0a8d493285c2df73290dfb7e61f870f17b41801197a149ca93654499ea3dafe', + endpoint: 'wss://kusama-rpc.dwellir.com', + nativeCurrency: { + name: 'KSM', + symbol: 'KSM', + decimals: 12, + }, + descriptors: ksm, + }, + paseo: { + name: 'Paseo', + id: 'paseo', + genesisHash: '0x77afd6190f1554ad45fd0d31aee62aacc33c6db0ea801129acb813f913e0764f', + endpoint: 'wss://paseo.rpc.amforc.com', + nativeCurrency: { name: 'Paseo', symbol: 'PAS', decimals: 10 }, + descriptors: paseo, + }, + westend: { + name: 'Westend', + id: 'westend', + genesisHash: '0xe143f23803ac50e8f6f8e62695d1ce9e4e1d68aa36c1cd2cfd15340213f3423e', + endpoint: 'wss://westend-rpc.polkadot.io', + nativeCurrency: { name: 'Westend', symbol: 'WND', decimals: 12 }, + descriptors: wnd, + }, +}; diff --git a/examples/with-vite-papi/src/hooks/usePapiClient.ts b/examples/with-vite-papi/src/hooks/usePapiClient.ts new file mode 100644 index 0000000..8711b10 --- /dev/null +++ b/examples/with-vite-papi/src/hooks/usePapiClient.ts @@ -0,0 +1,169 @@ +import { useAccount, usePapiSigner } from '@luno-kit/react'; +import { MultiAddress } from '@polkadot-api/descriptors'; +import { createClient } from 'polkadot-api'; +import { getWsProvider } from 'polkadot-api/ws-provider/web'; +import { useEffect, useState } from 'react'; +import { CHAINS, type Chain } from '../constants'; + +export interface PapiClientState { + client: any; + isReady: boolean; + error: Error | null; + currentChain: Chain | null; +} + +export function usePapiClient() { + const { data: papiSigner } = usePapiSigner(); + const { address } = useAccount(); + const [state, setState] = useState({ + client: null, + isReady: false, + error: null, + currentChain: null, + }); + + const [balance, setBalance] = useState({ total: '0', formattedTotal: '0' }); + const [loadingBalance, setLoadingBalance] = useState(false); + + const initializeClient = async (chain: Chain) => { + try { + if (state.client) { + state.client.destroy(); + } + setState((prev) => ({ ...prev, isReady: false, currentChain: chain })); + + const client = createClient( + getWsProvider(chain.endpoint, (_status) => { + switch (_status.type) { + case 0: + console.info('⚫️ Connecting to ==> ', chain.name); + break; + case 1: + console.info('🟢 Provider connected ==> ', chain.name); + + setState((prev) => ({ + ...prev, + isReady: true, + error: null, + })); + + break; + case 2: + console.info('🔴 Provider error ==> ', chain.name); + break; + case 3: + console.info('🟠 Provider closed ==> ', chain.name); + break; + } + }) + ); + + setState((prev) => ({ ...prev, client })); + } catch (error) { + console.error('Failed to initialize PAPI client:', error); + setState((prev) => ({ + ...prev, + isReady: false, + error: error instanceof Error ? error : new Error('Unknown error'), + })); + } + }; + + const switchChain = async (chainId: string) => { + if (!chainId) return; + + const chain = CHAINS[chainId]; + if (!chain) { + throw new Error(`Unknown chain: ${chainId}`); + } + + await initializeClient(chain); + }; + + const fetchBalance = async (address: string, client: any, chain: Chain) => { + setLoadingBalance(true); + if (!address || !client) return; + + try { + const accountInfo = await client + .getTypedApi(chain.descriptors) + .query.System.Account.getValue(address); + + const decimals = chain.nativeCurrency.decimals; + const total = BigInt(accountInfo.data.free) - BigInt(accountInfo.data.frozen || 0); + const formattedTotal = (Number(total) / 10 ** decimals).toFixed(4); + + setBalance({ + total: total.toString(), + formattedTotal, + }); + } catch (error) { + console.error('Failed to fetch balance:', error); + } finally { + setLoadingBalance(false); + } + }; + + const sendTransaction = async ( + to: string, + amount: string + ): Promise<{ transactionHash: string; status: string; errorMessage: string | null }> => { + const { currentChain, client, isReady } = state; + + if (!isReady || !currentChain) { + throw new Error('Client not ready'); + } + + const decimals = currentChain.nativeCurrency.decimals; + const amountInPlanck = BigInt(parseFloat(amount) * 10 ** decimals); + + const tx = client.getTypedApi(currentChain.descriptors).tx.Balances.transfer_keep_alive({ + dest: MultiAddress.Id(to), + value: amountInPlanck, + }); + + return new Promise((resolve, reject) => { + const subscription = tx.signSubmitAndWatch(papiSigner).subscribe({ + next: (event: any) => { + console.log('Tx event: ', event.type); + if (event.type === 'txBestBlocksState') { + subscription.unsubscribe(); + resolve({ + status: 'success', + transactionHash: event.txHash, + errorMessage: null, + }); + } + }, + error: (error: any) => { + subscription.unsubscribe(); + reject(error); + }, + }); + }); + }; + + useEffect(() => { + initializeClient(CHAINS.polkadot); + }, []); + + useEffect(() => { + if (address && state.isReady && state.currentChain) { + fetchBalance(address, state.client, state.currentChain); + } + }, [address, state.client, state.isReady, state.currentChain]); + + return { + ...state, + balance, + availableChains: Object.values(CHAINS), + switchChain, + loadingBalance, + refreshBalance: () => { + if (address && state.client && state.currentChain) { + fetchBalance(address, state.client, state.currentChain); + } + }, + sendTransaction, + }; +} diff --git a/examples/with-vite-papi/src/index.css b/examples/with-vite-papi/src/index.css new file mode 100644 index 0000000..08a3ac9 --- /dev/null +++ b/examples/with-vite-papi/src/index.css @@ -0,0 +1,68 @@ +:root { + font-family: system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 400; + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + background-color: #242424; + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +a { + font-weight: 500; + color: #646cff; + text-decoration: inherit; +} +a:hover { + color: #535bf2; +} + +body { + margin: 0; + display: flex; + place-items: center; + min-width: 320px; + min-height: 100vh; +} + +h1 { + font-size: 3.2em; + line-height: 1.1; +} + +button { + border-radius: 8px; + border: 1px solid transparent; + padding: 0.6em 1.2em; + font-size: 1em; + font-weight: 500; + font-family: inherit; + background-color: #1a1a1a; + cursor: pointer; + transition: border-color 0.25s; +} +button:hover { + border-color: #646cff; +} +button:focus, +button:focus-visible { + outline: 4px auto -webkit-focus-ring-color; +} + +@media (prefers-color-scheme: light) { + :root { + color: #213547; + background-color: #ffffff; + } + a:hover { + color: #747bff; + } + button { + background-color: #f9f9f9; + } +} diff --git a/examples/with-vite-papi/src/main.tsx b/examples/with-vite-papi/src/main.tsx new file mode 100644 index 0000000..7227ee1 --- /dev/null +++ b/examples/with-vite-papi/src/main.tsx @@ -0,0 +1,52 @@ +import { createConfig } from '@luno-kit/react'; +import { + enkryptConnector, + fearlessConnector, + mimirConnector, + novaConnector, + polkadotjsConnector, + polkagateConnector, + subwalletConnector, + talismanConnector, + walletConnectConnector, +} from '@luno-kit/react/connectors'; +import { LunoKitProvider } from '@luno-kit/ui'; +import { StrictMode } from 'react'; +import { createRoot } from 'react-dom/client'; +import App from './App.tsx'; +import '@luno-kit/ui/styles.css'; +import { CHAINS } from './constants'; + +const supportedChains = Object.values(CHAINS).map((c) => c.genesisHash); + +const connectors = [ + polkadotjsConnector(), + subwalletConnector(), + talismanConnector(), + polkagateConnector(), + fearlessConnector(), + mimirConnector(), + enkryptConnector(), + walletConnectConnector({ + projectId: import.meta.env.VITE_WALLET_CONNECT_ID, + supportedChains, + }), + novaConnector({ + projectId: import.meta.env.VITE_WALLET_CONNECT_ID, + supportedChains, + }), +]; + +const lunoConfig = createConfig({ + appName: 'luno with-vite example', + connectors: connectors, + autoConnect: true, +}); + +createRoot(document.getElementById('root')!).render( + + + + + +); diff --git a/examples/with-vite-papi/src/vite-env.d.ts b/examples/with-vite-papi/src/vite-env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/examples/with-vite-papi/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/examples/with-vite-papi/tsconfig.app.json b/examples/with-vite-papi/tsconfig.app.json new file mode 100644 index 0000000..227a6c6 --- /dev/null +++ b/examples/with-vite-papi/tsconfig.app.json @@ -0,0 +1,27 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + "target": "ES2022", + "useDefineForClassFields": true, + "lib": ["ES2022", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "moduleDetection": "force", + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "erasableSyntaxOnly": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["src"] +} diff --git a/examples/with-vite-papi/tsconfig.json b/examples/with-vite-papi/tsconfig.json new file mode 100644 index 0000000..d32ff68 --- /dev/null +++ b/examples/with-vite-papi/tsconfig.json @@ -0,0 +1,4 @@ +{ + "files": [], + "references": [{ "path": "./tsconfig.app.json" }, { "path": "./tsconfig.node.json" }] +} diff --git a/examples/with-vite-papi/tsconfig.node.json b/examples/with-vite-papi/tsconfig.node.json new file mode 100644 index 0000000..f85a399 --- /dev/null +++ b/examples/with-vite-papi/tsconfig.node.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", + "target": "ES2023", + "lib": ["ES2023"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "moduleDetection": "force", + "noEmit": true, + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "erasableSyntaxOnly": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/examples/with-vite-papi/vite.config.ts b/examples/with-vite-papi/vite.config.ts new file mode 100644 index 0000000..a74ec84 --- /dev/null +++ b/examples/with-vite-papi/vite.config.ts @@ -0,0 +1,7 @@ +import react from '@vitejs/plugin-react'; +import { defineConfig } from 'vite'; + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [react()], +}); diff --git a/examples/with-vite/eslint.config.js b/examples/with-vite/eslint.config.js index 092408a..fee2e35 100644 --- a/examples/with-vite/eslint.config.js +++ b/examples/with-vite/eslint.config.js @@ -1,8 +1,8 @@ -import js from '@eslint/js' -import globals from 'globals' -import reactHooks from 'eslint-plugin-react-hooks' -import reactRefresh from 'eslint-plugin-react-refresh' -import tseslint from 'typescript-eslint' +import js from '@eslint/js'; +import reactHooks from 'eslint-plugin-react-hooks'; +import reactRefresh from 'eslint-plugin-react-refresh'; +import globals from 'globals'; +import tseslint from 'typescript-eslint'; export default tseslint.config( { ignores: ['dist'] }, @@ -19,10 +19,7 @@ export default tseslint.config( }, rules: { ...reactHooks.configs.recommended.rules, - 'react-refresh/only-export-components': [ - 'warn', - { allowConstantExport: true }, - ], + 'react-refresh/only-export-components': ['warn', { allowConstantExport: true }], }, - }, -) + } +); diff --git a/examples/with-vite/public/site.webmanifest b/examples/with-vite/public/site.webmanifest index ccf313a..981d97f 100644 --- a/examples/with-vite/public/site.webmanifest +++ b/examples/with-vite/public/site.webmanifest @@ -18,4 +18,4 @@ "theme_color": "#ffffff", "background_color": "#ffffff", "display": "standalone" -} \ No newline at end of file +} diff --git a/examples/with-vite/src/App.css b/examples/with-vite/src/App.css index f547148..825c0f5 100644 --- a/examples/with-vite/src/App.css +++ b/examples/with-vite/src/App.css @@ -2,8 +2,9 @@ min-height: 100vh; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; - font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', - 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; + font-family: + -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", + "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } @@ -32,8 +33,13 @@ } @keyframes float { - 0%, 100% { transform: translateY(0px); } - 50% { transform: translateY(-10px); } + 0%, + 100% { + transform: translateY(0px); + } + 50% { + transform: translateY(-10px); + } } .hero h1 { @@ -154,7 +160,8 @@ } .value { - font-family: 'SF Mono', Monaco, 'Cascadia Code', 'Roboto Mono', Consolas, 'Courier New', monospace; + font-family: + "SF Mono", Monaco, "Cascadia Code", "Roboto Mono", Consolas, "Courier New", monospace; opacity: 0.9; } @@ -213,7 +220,8 @@ .balance-amount { font-size: 1.5rem; font-weight: 600; - font-family: 'SF Mono', Monaco, 'Cascadia Code', 'Roboto Mono', Consolas, 'Courier New', monospace; + font-family: + "SF Mono", Monaco, "Cascadia Code", "Roboto Mono", Consolas, "Courier New", monospace; } .balance-symbol { @@ -229,7 +237,8 @@ } .account-address { - font-family: 'SF Mono', Monaco, 'Cascadia Code', 'Roboto Mono', Consolas, 'Courier New', monospace; + font-family: + "SF Mono", Monaco, "Cascadia Code", "Roboto Mono", Consolas, "Courier New", monospace; font-size: 0.875rem; opacity: 0.8; word-break: break-all; @@ -388,7 +397,8 @@ padding: 1.5rem; border-radius: 8px; overflow-x: auto; - font-family: 'SF Mono', Monaco, 'Cascadia Code', 'Roboto Mono', Consolas, 'Courier New', monospace; + font-family: + "SF Mono", Monaco, "Cascadia Code", "Roboto Mono", Consolas, "Courier New", monospace; font-size: 0.875rem; line-height: 1.5; border: 1px solid rgba(255, 255, 255, 0.1); @@ -513,7 +523,7 @@ color: #64ffda; padding: 0.25rem 0.5rem; border-radius: 4px; - font-family: 'Fira Code', monospace; + font-family: "Fira Code", monospace; font-size: 0.875rem; font-weight: 500; } diff --git a/examples/with-vite/src/App.tsx b/examples/with-vite/src/App.tsx index 5ce5ace..78bdd4d 100644 --- a/examples/with-vite/src/App.tsx +++ b/examples/with-vite/src/App.tsx @@ -1,19 +1,21 @@ -import React, { useEffect, useState } from 'react'; -import { ConnectButton, useLunoTheme } from '@luno-kit/ui'; import { + ConnectionStatus, useAccount, useAccounts, - useDisconnect, - useStatus, - useChain, - ConnectionStatus, + useApi, useBalance, + useChain, useChains, - useSwitchChain, - useSignMessage, + useDisconnect, useSendTransaction, - useApi, + useSignMessage, + useStatus, + useSwitchChain, + useEstimatePaymentInfo, } from '@luno-kit/react'; +import { ConnectButton, useLunoTheme } from '@luno-kit/ui'; +import type React from 'react'; +import { useEffect, useState } from 'react'; import './App.css'; import { StagewiseToolbar } from '@stagewise/toolbar-react'; import ReactPlugin from '@stagewise-plugins/react'; @@ -28,14 +30,21 @@ const App: React.FC = () => { const { data: balance } = useBalance({ address }); const { switchChainAsync } = useSwitchChain(); const { signMessageAsync, data: signMessageData } = useSignMessage(); - const { sendTransactionAsync, data: sendTransactionData, isPending: isSendingTransaction, detailedStatus } = useSendTransaction(); + const { + sendTransactionAsync, + data: sendTransactionData, + isPending: isSendingTransaction, + detailedStatus, + } = useSendTransaction(); const { api, isApiReady, apiError } = useApi(); + const { data: paymentInfo, estimate, isLoading: isEstimating } = useEstimatePaymentInfo(); + console.log('paymentInfo', paymentInfo); const { themeMode, setThemeChoice } = useLunoTheme(); const [transferForm, setTransferForm] = useState({ to: '', - amount: '' + amount: '', }); const showNotification = (title: string, message?: string) => { @@ -53,7 +62,10 @@ const App: React.FC = () => { }); showNotification('Signature successful', signature); } catch (error) { - showNotification('Signature failed', error instanceof Error ? error.message : 'Unknown error'); + showNotification( + 'Signature failed', + error instanceof Error ? error.message : 'Unknown error' + ); } }; @@ -64,7 +76,7 @@ const App: React.FC = () => { } if (!currentChain) { - showNotification('Chain not available', 'Please select available chain') + showNotification('Chain not available', 'Please select available chain'); return; } @@ -75,19 +87,28 @@ const App: React.FC = () => { try { const decimals = currentChain.nativeCurrency.decimals || 12; - const amountInPlanck = BigInt(parseFloat(transferForm.amount) * Math.pow(10, decimals)); + const amountInPlanck = BigInt(parseFloat(transferForm.amount) * 10 ** decimals); + + await estimate(api.tx.balances.transferKeepAlive(transferForm.to, amountInPlanck)); + const result = await sendTransactionAsync({ - extrinsic: api.tx.balances.transferKeepAlive(transferForm.to, amountInPlanck) + extrinsic: api.tx.balances.transferKeepAlive(transferForm.to, amountInPlanck), }); if (result.status === 'success') { - showNotification('Transfer successful', `TxHash: ${result.transactionHash.slice(0, 10)}...`); + showNotification( + 'Transfer successful', + `TxHash: ${result.transactionHash.slice(0, 10)}...` + ); setTransferForm({ to: '', amount: '' }); } else { showNotification('Transfer failed', result.errorMessage); } } catch (error) { - showNotification('Transfer failed', error instanceof Error ? error.message : 'An error occurred during the transfer process.'); + showNotification( + 'Transfer failed', + error instanceof Error ? error.message : 'An error occurred during the transfer process.' + ); } }; @@ -102,22 +123,21 @@ const App: React.FC = () => { {/* Render only in the development environment StagewiseToolbar */}
- {/* Hero Section */}
- +

Luno Wallet Kit

The modern Polkadot wallet connection library for React applications

-
- +
+
- +
@@ -127,7 +147,6 @@ const App: React.FC = () => {

Live Demo

- {/* Theme Control Card */}
@@ -138,25 +157,18 @@ const App: React.FC = () => {
Current Theme: - {themeMode.charAt(0).toUpperCase() + themeMode.slice(1)} + + {themeMode.charAt(0).toUpperCase() + themeMode.slice(1)} +
- - -
@@ -200,15 +212,19 @@ const App: React.FC = () => {
{chains && chains.length > 1 && (
- {chains.filter(c => c.genesisHash !== currentChain.genesisHash).map(chain => ( - - ))} + {chains + .filter((c) => c.genesisHash !== currentChain.genesisHash) + .map((chain) => ( + + ))}
)}
@@ -227,12 +243,8 @@ const App: React.FC = () => {
{address ? (
-
- {balance?.formattedTotal ?? 0} -
-
- {currentChain?.nativeCurrency.symbol} -
+
{balance?.formattedTotal ?? 0}
+
{currentChain?.nativeCurrency.symbol}
) : ( Connect wallet first @@ -253,15 +265,17 @@ const App: React.FC = () => {
{address}
{accounts.length > 1 && (
- {accounts.filter(acc => acc.publicKey !== account.publicKey).map(acc => ( - - ))} + {accounts + .filter((acc) => acc.publicKey !== account.publicKey) + .map((acc) => ( + + ))}
)}
@@ -280,17 +294,16 @@ const App: React.FC = () => {
{status === ConnectionStatus.Connected ? (
- {signMessageData && (
Signature: - {signMessageData.signature.slice(0, 20)}... + + {signMessageData.signature.slice(0, 20)}... +
)} @@ -318,23 +331,41 @@ const App: React.FC = () => { className="form-input" placeholder="..." value={transferForm.to} - onChange={(e) => setTransferForm(prev => ({ ...prev, to: e.target.value }))} + onChange={(e) => + setTransferForm((prev) => ({ ...prev, to: e.target.value })) + } />
- + setTransferForm(prev => ({ ...prev, amount: e.target.value }))} + onChange={(e) => + setTransferForm((prev) => ({ ...prev, amount: e.target.value })) + } />
+
+ +
@@ -347,7 +378,9 @@ const App: React.FC = () => {
Hash: - {sendTransactionData.transactionHash.slice(0, 20)}... + + {sendTransactionData.transactionHash.slice(0, 20)}... +
)} @@ -396,7 +429,6 @@ const App: React.FC = () => {
-
); diff --git a/examples/with-vite/src/main.tsx b/examples/with-vite/src/main.tsx index e1a6d22..1c2490e 100644 --- a/examples/with-vite/src/main.tsx +++ b/examples/with-vite/src/main.tsx @@ -1,12 +1,37 @@ -import { StrictMode } from 'react' -import { createRoot } from 'react-dom/client' -import './index.css' -import App from './App.tsx' -import { createConfig } from '@luno-kit/react' -import { kusama, polkadot, westend, paseo, polkadotAssetHub, polkadotCoretime, polkadotCollectives, polkadotPeople, kusamaAssetHub, kusamaCoretime, kusamaPeople, paseoAssetHub, paseoPassetHub, westendAssetHub } from '@luno-kit/react/chains' -import { polkagateConnector, subwalletConnector, talismanConnector, polkadotjsConnector, walletConnectConnector, novaConnector, fearlessConnector, mimirConnector, enkryptConnector } from '@luno-kit/react/connectors' -import { LunoKitProvider } from '@luno-kit/ui' -import '@luno-kit/ui/styles.css' +import { StrictMode } from 'react'; +import { createRoot } from 'react-dom/client'; +import './index.css'; +import { createConfig } from '@luno-kit/react'; +import { + kusama, + kusamaAssetHub, + kusamaCoretime, + kusamaPeople, + paseo, + paseoAssetHub, + paseoPassetHub, + polkadot, + polkadotAssetHub, + polkadotCollectives, + polkadotCoretime, + polkadotPeople, + westend, + westendAssetHub, +} from '@luno-kit/react/chains'; +import { + enkryptConnector, + fearlessConnector, + mimirConnector, + novaConnector, + polkadotjsConnector, + polkagateConnector, + subwalletConnector, + talismanConnector, + walletConnectConnector, +} from '@luno-kit/react/connectors'; +import { LunoKitProvider } from '@luno-kit/ui'; +import App from './App.tsx'; +import '@luno-kit/ui/styles.css'; const connectors = [ polkadotjsConnector(), @@ -18,34 +43,48 @@ const connectors = [ enkryptConnector(), walletConnectConnector({ projectId: import.meta.env.VITE_WALLET_CONNECT_ID }), novaConnector({ projectId: import.meta.env.VITE_WALLET_CONNECT_ID }), -] +]; const lunoConfig = createConfig({ appName: 'luno with-vite example', - chains: [polkadot, kusama, westend, paseo, polkadotAssetHub, polkadotCoretime, polkadotCollectives, polkadotPeople, kusamaAssetHub, kusamaCoretime, kusamaPeople, paseoAssetHub, paseoPassetHub, westendAssetHub], + chains: [ + polkadot, + kusama, + westend, + paseo, + polkadotAssetHub, + polkadotCoretime, + polkadotCollectives, + polkadotPeople, + kusamaAssetHub, + kusamaCoretime, + kusamaPeople, + paseoAssetHub, + paseoPassetHub, + westendAssetHub, + ], connectors: connectors, autoConnect: true, }); - - createRoot(document.getElementById('root')!).render( - - + -) +); diff --git a/examples/with-vite/tsconfig.json b/examples/with-vite/tsconfig.json index 1ffef60..d32ff68 100644 --- a/examples/with-vite/tsconfig.json +++ b/examples/with-vite/tsconfig.json @@ -1,7 +1,4 @@ { "files": [], - "references": [ - { "path": "./tsconfig.app.json" }, - { "path": "./tsconfig.node.json" } - ] + "references": [{ "path": "./tsconfig.app.json" }, { "path": "./tsconfig.node.json" }] } diff --git a/examples/with-vite/vite.config.ts b/examples/with-vite/vite.config.ts index 0466183..fabde1a 100644 --- a/examples/with-vite/vite.config.ts +++ b/examples/with-vite/vite.config.ts @@ -1,5 +1,5 @@ -import { defineConfig } from 'vite'; import react from '@vitejs/plugin-react'; +import { defineConfig } from 'vite'; export default defineConfig({ plugins: [react()], diff --git a/extensions.json b/extensions.json index 02eeda3..86a7319 100644 --- a/extensions.json +++ b/extensions.json @@ -1,5 +1,3 @@ { - "recommendations": [ - "stagewise.stagewise-vscode-extension" - ] -} \ No newline at end of file + "recommendations": ["stagewise.stagewise-vscode-extension"] +} diff --git a/package.json b/package.json index ef80bfb..c5f7703 100644 --- a/package.json +++ b/package.json @@ -6,13 +6,16 @@ "build": "pnpm -r --stream --filter './packages/**' run build", "clean": "pnpm --filter './packages/**' run clean", "dev": "pnpm --filter './packages/**' dev", - "lint": "pnpm --filter './packages/**' lint", "test": "vitest run", "test:coverage": "vitest run --coverage", "changeset": "changeset", - "publish": "pnpm clean && pnpm build && changeset publish" + "publish": "pnpm clean && pnpm build && changeset publish", + "lint": "biome check .", + "lint:fix": "biome check --write .", + "format": "biome format --write ." }, "devDependencies": { + "@biomejs/biome": "2.2.4", "@changesets/cli": "^2.29.2", "@vitest/coverage-v8": "3.2.4", "eslint": "^8.56.0", diff --git a/packages/core/package.json b/packages/core/package.json index 5d826c5..ec10331 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -52,7 +52,6 @@ "scripts": { "build": "tsup", "dev": "tsup --watch", - "lint": "eslint src", "test": "vitest", "test:coverage": "vitest run --coverage", "clean": "rm -rf dist", @@ -61,22 +60,23 @@ "dependencies": { "@dedot/chaintypes": "catalog:", "@mimirdev/apps-inject": "3.2.0", + "@polkadot-api/pjs-signer": "0.6.14", "@walletconnect/universal-provider": "2.21.4", "dedot": "catalog:", "eventemitter3": "5.0.1" }, "devDependencies": { - "@types/node": "^18.19.86", + "@dedot/types": "0.16.0", + "@types/node": "catalog:", "@vitest/coverage-v8": "3.2.4", "@walletconnect/types": "2.21.5", - "eslint": "^8.56.0", "tsup": "catalog:", "typescript": "^5.3.3", "vitest": "^3.2.4" }, "peerDependencies": { - "@dedot/chaintypes": "^0.123.0", - "dedot": "^0.13.2" + "@dedot/chaintypes": "^0.152.0", + "dedot": "^0.16.0" }, "engines": { "node": ">=20.0.0", diff --git a/packages/core/scripts/convertLogos.mjs b/packages/core/scripts/convertLogos.mjs index 9143e51..f1a2f63 100644 --- a/packages/core/scripts/convertLogos.mjs +++ b/packages/core/scripts/convertLogos.mjs @@ -2,16 +2,16 @@ // SPDX-License-Identifier: Apache-2.0 import fs from 'node:fs'; -import { dirname } from 'node:path'; +import path, { dirname } from 'node:path'; import { fileURLToPath } from 'node:url'; -import path from 'node:path' const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename); const MAX_SIZE = 48 * 1024; -const HEADER = '// Copyright 2025 Luno contributors\n// SPDX-License-Identifier: MIT\n\n// Do not edit. Auto-generated via node scripts/convertLogos.mjs\n\n'; +const HEADER = + '// Copyright 2025 Luno contributors\n// SPDX-License-Identifier: MIT\n\n// Do not edit. Auto-generated via node scripts/convertLogos.mjs\n\n'; /** * Convert string to camelCase @@ -22,7 +22,9 @@ function stringCamelCase(str) { return str .split(/[-\s]+/) .map((word, index) => { - return index === 0 ? word.toLowerCase() : word.charAt(0).toUpperCase() + word.slice(1).toLowerCase(); + return index === 0 + ? word.toLowerCase() + : word.charAt(0).toUpperCase() + word.slice(1).toLowerCase(); }) .join(''); } @@ -56,10 +58,10 @@ const oversized = {}; const LOGO_TYPES = ['chains', 'wallets']; // Process SVG files -LOGO_TYPES.forEach(type => { +LOGO_TYPES.forEach((type) => { const typeDir = path.join(logosDir, type); fs.readdirSync(typeDir) - .filter(file => (file.endsWith('.svg') || file.endsWith('.webp')) && !file.startsWith('.')) + .filter((file) => (file.endsWith('.svg') || file.endsWith('.webp')) && !file.startsWith('.')) .forEach((file) => { const fullPath = path.join(typeDir, file); const fileName = path.basename(file, path.extname(file)); // 获取不带扩展名的文件名 @@ -106,12 +108,10 @@ LOGO_TYPES.forEach(type => { }); if (Object.keys(result).length > 0) { - const indexContent = `${HEADER}${ - Object.keys(result) - .sort() - .map(exportName => `export { ${exportName} } from './${result[exportName]}.js';`) - .join('\n') - }\n`; + const indexContent = `${HEADER}${Object.keys(result) + .sort() + .map((exportName) => `export { ${exportName} } from './${result[exportName]}.js';`) + .join('\n')}\n`; fs.writeFileSync(path.join(generatedDir, 'index.ts'), indexContent); console.log(`✅ Generated index.ts with ${Object.keys(result).length} exports`); @@ -121,9 +121,7 @@ const allKeys = Object.keys(allLogos); const dupes = {}; allKeys.forEach((a) => { - const duplicates = allKeys.filter((b) => - a !== b && allLogos[a] === allLogos[b] - ); + const duplicates = allKeys.filter((b) => a !== b && allLogos[a] === allLogos[b]); if (duplicates.length > 0) { dupes[a] = duplicates; @@ -141,7 +139,9 @@ if (Object.keys(dupes).length > 0) { if (Object.keys(oversized).length > 0) { console.error('\n❌ Files exceeding 48KB limit:'); Object.entries(oversized).forEach(([key, size]) => { - console.error(` ${key}: ${Math.round(size / 1024)}KB (+${Math.round((size - MAX_SIZE) / 1024)}KB over limit)`); + console.error( + ` ${key}: ${Math.round(size / 1024)}KB (+${Math.round((size - MAX_SIZE) / 1024)}KB over limit)` + ); }); process.exit(1); } diff --git a/packages/core/src/chains/chain.test.ts b/packages/core/src/chains/chain.test.ts index 202bd24..b607044 100644 --- a/packages/core/src/chains/chain.test.ts +++ b/packages/core/src/chains/chain.test.ts @@ -1,158 +1,158 @@ -import { describe, it, expect } from 'vitest' -import type { Chain } from '../types' -import { polkadot } from './polkadot' -import { kusama } from './kusama' -import { paseo } from './paseo' -import { westend } from './westend' +import { describe, expect, it } from 'vitest'; +import type { Chain } from '../types'; +import { kusama } from './kusama'; +import { paseo } from './paseo'; +import { polkadot } from './polkadot'; +import { westend } from './westend'; describe('Chain Configurations', () => { const chains: Record = { polkadot, kusama, paseo, - westend - } + westend, + }; describe('Type Compliance', () => { Object.entries(chains).forEach(([chainName, chain]) => { describe(`${chainName} chain`, () => { it('should have all required fields', () => { - expect(chain.genesisHash).toBeDefined() - expect(typeof chain.genesisHash).toBe('string') - expect(chain.genesisHash).toMatch(/^0x[a-fA-F0-9]{64}$/) + expect(chain.genesisHash).toBeDefined(); + expect(typeof chain.genesisHash).toBe('string'); + expect(chain.genesisHash).toMatch(/^0x[a-fA-F0-9]{64}$/); - expect(chain.name).toBeDefined() - expect(typeof chain.name).toBe('string') - expect(chain.name.length).toBeGreaterThan(0) + expect(chain.name).toBeDefined(); + expect(typeof chain.name).toBe('string'); + expect(chain.name.length).toBeGreaterThan(0); - expect(chain.ss58Format).toBeDefined() - expect(typeof chain.ss58Format).toBe('number') - expect(chain.ss58Format).toBeGreaterThanOrEqual(0) + expect(chain.ss58Format).toBeDefined(); + expect(typeof chain.ss58Format).toBe('number'); + expect(chain.ss58Format).toBeGreaterThanOrEqual(0); - expect(chain.chainIconUrl).toBeDefined() - expect(typeof chain.chainIconUrl).toBe('string') - }) + expect(chain.chainIconUrl).toBeDefined(); + expect(typeof chain.chainIconUrl).toBe('string'); + }); it('should have valid nativeCurrency structure', () => { - expect(chain.nativeCurrency).toBeDefined() - expect(typeof chain.nativeCurrency).toBe('object') + expect(chain.nativeCurrency).toBeDefined(); + expect(typeof chain.nativeCurrency).toBe('object'); - expect(chain.nativeCurrency.name).toBeDefined() - expect(typeof chain.nativeCurrency.name).toBe('string') - expect(chain.nativeCurrency.name.length).toBeGreaterThan(0) + expect(chain.nativeCurrency.name).toBeDefined(); + expect(typeof chain.nativeCurrency.name).toBe('string'); + expect(chain.nativeCurrency.name.length).toBeGreaterThan(0); - expect(chain.nativeCurrency.symbol).toBeDefined() - expect(typeof chain.nativeCurrency.symbol).toBe('string') - expect(chain.nativeCurrency.symbol.length).toBeGreaterThan(0) + expect(chain.nativeCurrency.symbol).toBeDefined(); + expect(typeof chain.nativeCurrency.symbol).toBe('string'); + expect(chain.nativeCurrency.symbol.length).toBeGreaterThan(0); - expect(chain.nativeCurrency.decimals).toBeDefined() - expect(typeof chain.nativeCurrency.decimals).toBe('number') - expect(chain.nativeCurrency.decimals).toBeGreaterThanOrEqual(0) - expect(chain.nativeCurrency.decimals).toBeLessThanOrEqual(18) - }) + expect(chain.nativeCurrency.decimals).toBeDefined(); + expect(typeof chain.nativeCurrency.decimals).toBe('number'); + expect(chain.nativeCurrency.decimals).toBeGreaterThanOrEqual(0); + expect(chain.nativeCurrency.decimals).toBeLessThanOrEqual(18); + }); it('should have valid rpcUrls structure', () => { - expect(chain.rpcUrls).toBeDefined() - expect(typeof chain.rpcUrls).toBe('object') + expect(chain.rpcUrls).toBeDefined(); + expect(typeof chain.rpcUrls).toBe('object'); - const hasWebSocket = Array.isArray(chain.rpcUrls.webSocket) - const hasHttp = Array.isArray(chain.rpcUrls.http) - expect(hasWebSocket || hasHttp).toBe(true) + const hasWebSocket = Array.isArray(chain.rpcUrls.webSocket); + const hasHttp = Array.isArray(chain.rpcUrls.http); + expect(hasWebSocket || hasHttp).toBe(true); if (chain.rpcUrls.webSocket) { - expect(Array.isArray(chain.rpcUrls.webSocket)).toBe(true) - expect(chain.rpcUrls.webSocket.length).toBeGreaterThan(0) - chain.rpcUrls.webSocket.forEach(url => { - expect(typeof url).toBe('string') - expect(url).toMatch(/^wss?:\/\//) - }) + expect(Array.isArray(chain.rpcUrls.webSocket)).toBe(true); + expect(chain.rpcUrls.webSocket.length).toBeGreaterThan(0); + chain.rpcUrls.webSocket.forEach((url) => { + expect(typeof url).toBe('string'); + expect(url).toMatch(/^wss?:\/\//); + }); } if (chain.rpcUrls.http) { - expect(Array.isArray(chain.rpcUrls.http)).toBe(true) - expect(chain.rpcUrls.http.length).toBeGreaterThan(0) - chain.rpcUrls.http.forEach(url => { - expect(typeof url).toBe('string') - expect(url).toMatch(/^https?:\/\//) - }) + expect(Array.isArray(chain.rpcUrls.http)).toBe(true); + expect(chain.rpcUrls.http.length).toBeGreaterThan(0); + chain.rpcUrls.http.forEach((url) => { + expect(typeof url).toBe('string'); + expect(url).toMatch(/^https?:\/\//); + }); } - }) + }); it('should have valid blockExplorers structure if present', () => { if (chain.blockExplorers) { - expect(typeof chain.blockExplorers).toBe('object') + expect(typeof chain.blockExplorers).toBe('object'); if (chain.blockExplorers.default) { - expect(typeof chain.blockExplorers.default.name).toBe('string') - expect(chain.blockExplorers.default.name.length).toBeGreaterThan(0) - expect(typeof chain.blockExplorers.default.url).toBe('string') - expect(chain.blockExplorers.default.url).toMatch(/^https?:\/\//) + expect(typeof chain.blockExplorers.default.name).toBe('string'); + expect(chain.blockExplorers.default.name.length).toBeGreaterThan(0); + expect(typeof chain.blockExplorers.default.url).toBe('string'); + expect(chain.blockExplorers.default.url).toMatch(/^https?:\/\//); } Object.entries(chain.blockExplorers).forEach(([key, explorer]) => { if (key !== 'default' && explorer) { - expect(typeof explorer.name).toBe('string') - expect(explorer.name.length).toBeGreaterThan(0) - expect(typeof explorer.url).toBe('string') - expect(explorer.url).toMatch(/^https?:\/\//) + expect(typeof explorer.name).toBe('string'); + expect(explorer.name.length).toBeGreaterThan(0); + expect(typeof explorer.url).toBe('string'); + expect(explorer.url).toMatch(/^https?:\/\//); } - }) + }); } - }) + }); it('should have valid optional fields if present', () => { if (chain.testnet !== undefined) { - expect(typeof chain.testnet).toBe('boolean') + expect(typeof chain.testnet).toBe('boolean'); } if (chain.meta !== undefined) { - expect(typeof chain.meta).toBe('object') - expect(chain.meta).not.toBeNull() + expect(typeof chain.meta).toBe('object'); + expect(chain.meta).not.toBeNull(); } - }) - }) - }) - }) + }); + }); + }); + }); describe('Chain Collection Validation', () => { it('should have unique genesis hashes', () => { - const genesisHashes = Object.values(chains).map(chain => chain.genesisHash) - const uniqueHashes = new Set(genesisHashes) - expect(uniqueHashes.size).toBe(genesisHashes.length) - }) + const genesisHashes = Object.values(chains).map((chain) => chain.genesisHash); + const uniqueHashes = new Set(genesisHashes); + expect(uniqueHashes.size).toBe(genesisHashes.length); + }); it('should have unique chain names', () => { - const chainNames = Object.values(chains).map(chain => chain.name) - const uniqueNames = new Set(chainNames) - expect(uniqueNames.size).toBe(chainNames.length) - }) + const chainNames = Object.values(chains).map((chain) => chain.name); + const uniqueNames = new Set(chainNames); + expect(uniqueNames.size).toBe(chainNames.length); + }); it('should have unique currency symbols', () => { - const symbols = Object.values(chains).map(chain => chain.nativeCurrency.symbol) - const uniqueSymbols = new Set(symbols) - expect(uniqueSymbols.size).toBe(symbols.length) - }) + const symbols = Object.values(chains).map((chain) => chain.nativeCurrency.symbol); + const uniqueSymbols = new Set(symbols); + expect(uniqueSymbols.size).toBe(symbols.length); + }); it('should export all expected chains', () => { - expect(chains.polkadot).toBeDefined() - expect(chains.kusama).toBeDefined() - expect(chains.paseo).toBeDefined() - expect(chains.westend).toBeDefined() - }) - }) + expect(chains.polkadot).toBeDefined(); + expect(chains.kusama).toBeDefined(); + expect(chains.paseo).toBeDefined(); + expect(chains.westend).toBeDefined(); + }); + }); describe('Business Logic Validation', () => { it('should mark testnets correctly', () => { - expect(chains.paseo.testnet).toBe(true) - expect(chains.westend.testnet).toBe(true) + expect(chains.paseo.testnet).toBe(true); + expect(chains.westend.testnet).toBe(true); - expect(chains.polkadot.testnet).toBeFalsy() - expect(chains.kusama.testnet).toBeFalsy() - }) + expect(chains.polkadot.testnet).toBeFalsy(); + expect(chains.kusama.testnet).toBeFalsy(); + }); it('should have appropriate ss58 formats', () => { - expect(chains.polkadot.ss58Format).toBe(0) - expect(chains.kusama.ss58Format).toBe(2) - }) - }) -}) + expect(chains.polkadot.ss58Format).toBe(0); + expect(chains.kusama.ss58Format).toBe(2); + }); + }); +}); diff --git a/packages/core/src/chains/index.ts b/packages/core/src/chains/index.ts index 9d5c567..e68e4d4 100644 --- a/packages/core/src/chains/index.ts +++ b/packages/core/src/chains/index.ts @@ -1,6 +1,5 @@ -export * from './polkadot'; +export type { Chain } from '../types'; export * from './kusama'; export * from './paseo'; +export * from './polkadot'; export * from './westend'; -export type { Chain } from '../types'; - diff --git a/packages/core/src/chains/kusama.ts b/packages/core/src/chains/kusama.ts index 16e1a76..9275084 100644 --- a/packages/core/src/chains/kusama.ts +++ b/packages/core/src/chains/kusama.ts @@ -1,11 +1,18 @@ -import type { Chain } from '../types' -import { kusamaChain, assethubKusamaChain, peopleKusamaChain, coretimeKusamaChain } from '../config/logos/generated' +import { + assethubKusamaChain, + coretimeKusamaChain, + kusamaChain, + peopleKusamaChain, +} from '../config/logos/generated'; +import type { Chain } from '../types'; export const kusama: Chain = { genesisHash: '0xb0a8d493285c2df73290dfb7e61f870f17b41801197a149ca93654499ea3dafe', name: 'Kusama', nativeCurrency: { name: 'Kusama', symbol: 'KSM', decimals: 12 }, - rpcUrls: { webSocket: ['wss://kusama-rpc.polkadot.io', 'wss://kusama.api.onfinality.io/public-ws'] }, + rpcUrls: { + webSocket: ['wss://kusama-rpc.polkadot.io', 'wss://kusama.api.onfinality.io/public-ws'], + }, ss58Format: 2, blockExplorers: { default: { name: 'Subscan', url: 'https://kusama.subscan.io' } }, chainIconUrl: kusamaChain, @@ -16,31 +23,40 @@ export const kusamaAssetHub: Chain = { genesisHash: '0x48239ef607d7928874027a43a67689209727dfb3d3dc5e5b03a39bdc2eda771a', name: 'AssetHub Kusama', nativeCurrency: { name: 'AssetHub Kusama', symbol: 'KSM', decimals: 12 }, - rpcUrls: { webSocket: ['wss://kusama-asset-hub-rpc.polkadot.io', 'wss://asset-hub-kusama-rpc.n.dwellir.com'] }, + rpcUrls: { + webSocket: [ + 'wss://kusama-asset-hub-rpc.polkadot.io', + 'wss://asset-hub-kusama-rpc.n.dwellir.com', + ], + }, ss58Format: 2, blockExplorers: { default: { name: 'Subscan', url: 'https://assethub-kusama.subscan.io' } }, chainIconUrl: assethubKusamaChain, testnet: false, -} +}; export const kusamaPeople: Chain = { genesisHash: '0xc1af4cb4eb3918e5db15086c0cc5ec17fb334f728b7c65dd44bfe1e174ff8b3f', name: 'People Kusama', nativeCurrency: { name: 'People Kusama', symbol: 'KSM', decimals: 12 }, - rpcUrls: { webSocket: ['wss://kusama-people-rpc.polkadot.io', 'wss://people-kusama-rpc.n.dwellir.com'] }, + rpcUrls: { + webSocket: ['wss://kusama-people-rpc.polkadot.io', 'wss://people-kusama-rpc.n.dwellir.com'], + }, ss58Format: 2, blockExplorers: { default: { name: 'Subscan', url: 'https://people-kusama.subscan.io' } }, chainIconUrl: peopleKusamaChain, testnet: false, -} +}; export const kusamaCoretime: Chain = { genesisHash: '0x638cd2b9af4b3bb54b8c1f0d22711fc89924ca93300f0caf25a580432b29d050', name: 'Coretime Kusama', nativeCurrency: { name: 'Coretime Kusama', symbol: 'KSM', decimals: 12 }, - rpcUrls: { webSocket: ['wss://kusama-coretime-rpc.polkadot.io', 'wss://coretime-kusama-rpc.n.dwellir.com'] }, + rpcUrls: { + webSocket: ['wss://kusama-coretime-rpc.polkadot.io', 'wss://coretime-kusama-rpc.n.dwellir.com'], + }, ss58Format: 2, blockExplorers: { default: { name: 'Subscan', url: 'https://coretime-kusama.subscan.io' } }, chainIconUrl: coretimeKusamaChain, testnet: false, -} +}; diff --git a/packages/core/src/chains/paseo.ts b/packages/core/src/chains/paseo.ts index 88c0b20..ef974c0 100644 --- a/packages/core/src/chains/paseo.ts +++ b/packages/core/src/chains/paseo.ts @@ -1,5 +1,5 @@ -import type { Chain } from '../types' -import { paseoChain, assethubPaseoChain } from '../config/logos/generated' +import { assethubPaseoChain, paseoChain } from '../config/logos/generated'; +import type { Chain } from '../types'; export const paseo: Chain = { genesisHash: '0x77afd6190f1554ad45fd0d31aee62aacc33c6db0ea801129acb813f913e0764f', @@ -9,26 +9,30 @@ export const paseo: Chain = { ss58Format: 0, blockExplorers: { default: { name: 'Subscan', url: 'https://paseo.subscan.io/' } }, chainIconUrl: paseoChain, - testnet: true + testnet: true, }; export const paseoAssetHub: Chain = { genesisHash: '0xd6eec26135305a8ad257a20d003357284c8aa03d0bdb2b357ab0a22371e11ef2', name: 'AssetHub Paseo', nativeCurrency: { name: 'AssetHub Paseo', symbol: 'PAS', decimals: 10 }, - rpcUrls: { webSocket: ['wss://pas-rpc.stakeworld.io/assethub', 'wss://asset-hub-paseo-rpc.n.dwellir.com'] }, + rpcUrls: { + webSocket: ['wss://pas-rpc.stakeworld.io/assethub', 'wss://asset-hub-paseo-rpc.n.dwellir.com'], + }, ss58Format: 0, blockExplorers: { default: { name: 'Subscan', url: 'https://assethub-paseo.subscan.io' } }, chainIconUrl: assethubPaseoChain, - testnet: true + testnet: true, }; export const paseoPassetHub: Chain = { genesisHash: '0xfd974cf9eaf028f5e44b9fdd1949ab039c6cf9cc54449b0b60d71b042e79aeb6', name: 'PAassetHub', nativeCurrency: { name: 'PassetHub', symbol: 'PAS', decimals: 10 }, - rpcUrls: { webSocket: ['wss://testnet-passet-hub.polkadot.io', 'wss://passet-hub-paseo.ibp.network'] }, + rpcUrls: { + webSocket: ['wss://testnet-passet-hub.polkadot.io', 'wss://passet-hub-paseo.ibp.network'], + }, ss58Format: 42, chainIconUrl: assethubPaseoChain, - testnet: true + testnet: true, }; diff --git a/packages/core/src/chains/polkadot.ts b/packages/core/src/chains/polkadot.ts index daa35d5..4ca0b54 100644 --- a/packages/core/src/chains/polkadot.ts +++ b/packages/core/src/chains/polkadot.ts @@ -1,5 +1,11 @@ -import type { Chain } from '../types' -import { polkadotChain, assethubChain, peopleChain, coretimeChain, collectivesChain } from '../config/logos/generated' +import { + assethubChain, + collectivesChain, + coretimeChain, + peopleChain, + polkadotChain, +} from '../config/logos/generated'; +import type { Chain } from '../types'; export const polkadot: Chain = { genesisHash: '0x91b171bb158e2d3848fa23a9f1c25182fb8e20313b2c1eb49219da7a70ce90c3', @@ -20,14 +26,17 @@ export const polkadotAssetHub: Chain = { name: 'AssetHub', nativeCurrency: { name: 'AssetHub Polkadot', symbol: 'DOT', decimals: 10 }, rpcUrls: { - webSocket: ['wss://polkadot-asset-hub-rpc.polkadot.io', 'wss://asset-hub-polkadot-rpc.n.dwellir.com'], + webSocket: [ + 'wss://polkadot-asset-hub-rpc.polkadot.io', + 'wss://asset-hub-polkadot-rpc.n.dwellir.com', + ], http: ['https://polkadot-asset-hub-rpc.polkadot.io'], }, ss58Format: 0, blockExplorers: { default: { name: 'Subscan', url: 'https://assethub-polkadot.subscan.io' } }, chainIconUrl: assethubChain, testnet: false, -} +}; export const polkadotPeople: Chain = { genesisHash: '0x67fa177a097bfa18f77ea95ab56e9bcdfeb0e5b8a40e46298bb93e16b6fc5008', @@ -41,32 +50,38 @@ export const polkadotPeople: Chain = { blockExplorers: { default: { name: 'Subscan', url: 'https://people-polkadot.subscan.io' } }, chainIconUrl: peopleChain, testnet: false, -} +}; export const polkadotCoretime: Chain = { genesisHash: '0xefb56e30d9b4a24099f88820987d0f45fb645992416535d87650d98e00f46fc4', name: 'Coretime', nativeCurrency: { name: 'Coretime Polkadot', symbol: 'DOT', decimals: 10 }, rpcUrls: { - webSocket: ['wss://polkadot-coretime-rpc.polkadot.io', 'wss://coretime-polkadot-rpc.n.dwellir.com'], + webSocket: [ + 'wss://polkadot-coretime-rpc.polkadot.io', + 'wss://coretime-polkadot-rpc.n.dwellir.com', + ], http: ['https://polkadot-coretime-rpc.polkadot.io'], }, ss58Format: 0, blockExplorers: { default: { name: 'Subscan', url: 'https://coretime-polkadot.subscan.io' } }, chainIconUrl: coretimeChain, testnet: false, -} +}; export const polkadotCollectives: Chain = { genesisHash: '0x46ee89aa2eedd13e988962630ec9fb7565964cf5023bb351f2b6b25c1b68b0b2', name: 'Collectives', nativeCurrency: { name: 'Collectives Polkadot', symbol: 'DOT', decimals: 10 }, rpcUrls: { - webSocket: ['wss://collectives-polkadot-rpc.n.dwellir.com', 'wss://polkadot-collectives-rpc.polkadot.io'], + webSocket: [ + 'wss://collectives-polkadot-rpc.n.dwellir.com', + 'wss://polkadot-collectives-rpc.polkadot.io', + ], http: ['https://collectives-polkadot-rpc.n.dwellir.com'], }, ss58Format: 0, blockExplorers: { default: { name: 'Subscan', url: 'https://collectives-polkadot.subscan.io' } }, chainIconUrl: collectivesChain, testnet: false, -} +}; diff --git a/packages/core/src/chains/westend.ts b/packages/core/src/chains/westend.ts index d79f3d0..4e913a4 100644 --- a/packages/core/src/chains/westend.ts +++ b/packages/core/src/chains/westend.ts @@ -1,5 +1,5 @@ -import type { Chain } from '../types' -import { westendChain, assethubWestendChain } from '../config/logos/generated' +import { assethubWestendChain, westendChain } from '../config/logos/generated'; +import type { Chain } from '../types'; export const westend: Chain = { genesisHash: '0xe143f23803ac50e8f6f8e62695d1ce9e4e1d68aa36c1cd2cfd15340213f3423e', @@ -16,9 +16,14 @@ export const westendAssetHub: Chain = { genesisHash: '0x67f9723393ef76214df0118c34bbbd3dbebc8ed46a10973a8c969d48fe7598c9', name: 'AssetHub Westend', nativeCurrency: { name: 'AssetHub Westend', symbol: 'WND', decimals: 12 }, - rpcUrls: { webSocket: ['wss://westend-asset-hub-rpc.polkadot.io', 'wss://asset-hub-westend-rpc.n.dwellir.com'] }, + rpcUrls: { + webSocket: [ + 'wss://westend-asset-hub-rpc.polkadot.io', + 'wss://asset-hub-westend-rpc.n.dwellir.com', + ], + }, ss58Format: 42, blockExplorers: { default: { name: 'Subscan', url: 'https://assethub-westend.subscan.io' } }, chainIconUrl: assethubWestendChain, testnet: true, -} +}; diff --git a/packages/core/src/config/createConfig.test.ts b/packages/core/src/config/createConfig.test.ts index 466a317..47e4db0 100644 --- a/packages/core/src/config/createConfig.test.ts +++ b/packages/core/src/config/createConfig.test.ts @@ -1,28 +1,28 @@ -import { describe, it, expect, vi, beforeEach } from 'vitest' -import { createConfig } from './createConfig' -import { polkadotjsConnector, subwalletConnector } from '../connectors' -import { polkadot, kusama } from '../chains' -import type { Chain, CreateConfigParameters, LunoStorage } from '../types' +import { beforeEach, describe, expect, it, vi } from 'vitest'; +import { kusama, polkadot } from '../chains'; +import { polkadotjsConnector, subwalletConnector } from '../connectors'; +import type { Chain, CreateConfigParameters, LunoStorage } from '../types'; +import { createConfig } from './createConfig'; vi.mock('./createStorage', () => ({ createStorage: vi.fn(() => ({ getItem: vi.fn(), setItem: vi.fn(), removeItem: vi.fn(), - })) -})) + })), +})); -vi.mock('../config/logos/generated', async importOriginal => { - const actual = await importOriginal() +vi.mock('../config/logos/generated', async (importOriginal) => { + const actual = await importOriginal(); return { ...actual, - } + }; }); describe('createConfig', () => { - const mockConnectors = [polkadotjsConnector(), subwalletConnector()] + const mockConnectors = [polkadotjsConnector(), subwalletConnector()]; - const mockChains = [polkadot, kusama] + const mockChains = [polkadot, kusama]; const mockChainWithoutWs: Chain = { genesisHash: '0x123456789abcdef', @@ -30,53 +30,55 @@ describe('createConfig', () => { nativeCurrency: { name: 'Test Token', symbol: 'TEST', - decimals: 18 + decimals: 18, }, rpcUrls: { - http: ['https://test-chain.rpc.com'] + http: ['https://test-chain.rpc.com'], }, ss58Format: 42, blockExplorers: { default: { name: 'Test Explorer', - url: 'https://test-explorer.com' - } + url: 'https://test-explorer.com', + }, }, chainIconUrl: 'data:image/svg+xml;base64,PHN2Zz48L3N2Zz4=', - testnet: true - } + testnet: true, + }; const mockStorage: LunoStorage = { getItem: vi.fn(), setItem: vi.fn(), - removeItem: vi.fn() - } + removeItem: vi.fn(), + }; beforeEach(() => { - vi.clearAllMocks() - vi.spyOn(console, 'log').mockImplementation(() => {}) - vi.spyOn(console, 'warn').mockImplementation(() => {}) - }) + vi.clearAllMocks(); + vi.spyOn(console, 'log').mockImplementation(() => {}); + vi.spyOn(console, 'warn').mockImplementation(() => {}); + }); describe('successful config creation', () => { it('should create config with valid parameters', () => { const params: CreateConfigParameters = { chains: [polkadot], - connectors: [polkadotjsConnector()] - } + connectors: [polkadotjsConnector()], + }; - const config = createConfig(params) + const config = createConfig(params); expect(config).toEqual({ appName: 'My Luno App', chains: [polkadot], - connectors: [expect.objectContaining({ - id: 'polkadot-js', - name: 'Polkadot{.js}', - icon: expect.any(String) - })], + connectors: [ + expect.objectContaining({ + id: 'polkadot-js', + name: 'Polkadot{.js}', + icon: expect.any(String), + }), + ], transports: { - [polkadot.genesisHash]: polkadot.rpcUrls.webSocket![0] + [polkadot.genesisHash]: polkadot.rpcUrls.webSocket![0], }, storage: expect.any(Object), autoConnect: true, @@ -84,25 +86,25 @@ describe('createConfig', () => { customTypes: undefined, cacheMetadata: undefined, metadata: undefined, - scaledResponses: undefined - }) - }) + scaledResponses: undefined, + }); + }); it('should work with multiple real connectors and chains', () => { const params: CreateConfigParameters = { chains: mockChains, - connectors: mockConnectors - } + connectors: mockConnectors, + }; - const config = createConfig(params) + const config = createConfig(params); - expect(config.chains).toHaveLength(2) - expect(config.connectors).toHaveLength(2) - expect(config.connectors[0].id).toBe('polkadot-js') - expect(config.connectors[1].id).toBe('subwallet-js') - expect(config.transports).toHaveProperty(polkadot.genesisHash) - expect(config.transports).toHaveProperty(kusama.genesisHash) - }) + expect(config.chains).toHaveLength(2); + expect(config.connectors).toHaveLength(2); + expect(config.connectors[0].id).toBe('polkadot-js'); + expect(config.connectors[1].id).toBe('subwallet-js'); + expect(config.transports).toHaveProperty(polkadot.genesisHash); + expect(config.transports).toHaveProperty(kusama.genesisHash); + }); it('should use provided custom values', () => { const params: CreateConfigParameters = { @@ -115,193 +117,184 @@ describe('createConfig', () => { metadata: { test: 'metadata' } as any, scaledResponses: true, customTypes: { TestType: {} as any }, - customRpc: { testMethod: {} } - } + customRpc: { testMethod: {} }, + }; - const config = createConfig(params) + const config = createConfig(params); - expect(config.appName).toBe('Custom App') - expect(config.storage).toBe(mockStorage) - expect(config.autoConnect).toBe(false) - expect(config.cacheMetadata).toBe(true) - expect(config.metadata).toEqual({ test: 'metadata' }) - expect(config.scaledResponses).toBe(true) - expect(config.customTypes).toEqual({ TestType: {} }) - expect(config.customRpc).toEqual({ testMethod: {} }) - }) + expect(config.appName).toBe('Custom App'); + expect(config.storage).toBe(mockStorage); + expect(config.autoConnect).toBe(false); + expect(config.cacheMetadata).toBe(true); + expect(config.metadata).toEqual({ test: 'metadata' }); + expect(config.scaledResponses).toBe(true); + expect(config.customTypes).toEqual({ TestType: {} }); + expect(config.customRpc).toEqual({ testMethod: {} }); + }); it('should merge custom transports with generated ones', () => { const customTransports = { 'custom-hash': 'wss://custom.endpoint.com', - [polkadot.genesisHash]: 'wss://override.endpoint.com' - } + [polkadot.genesisHash]: 'wss://override.endpoint.com', + }; const params: CreateConfigParameters = { chains: [polkadot], connectors: [polkadotjsConnector()], - transports: customTransports - } + transports: customTransports, + }; - const config = createConfig(params) + const config = createConfig(params); expect(config.transports).toEqual({ [polkadot.genesisHash]: 'wss://override.endpoint.com', - 'custom-hash': 'wss://custom.endpoint.com' - }) - }) - }) + 'custom-hash': 'wss://custom.endpoint.com', + }); + }); + }); describe('parameter validation', () => { - it('should throw error when chains array is empty', () => { - const params: CreateConfigParameters = { - chains: [], - connectors: [polkadotjsConnector()] - } - - expect(() => createConfig(params)).toThrow( - 'At least one chain must be provided in the `chains` array.' - ) - }) - it('should throw error when connectors array is empty', () => { const params: CreateConfigParameters = { chains: [polkadot], - connectors: [] - } + connectors: [], + }; expect(() => createConfig(params)).toThrow( 'No connectors provided. Wallet connection features will be unavailable.' - ) - }) - - it('should throw error when no transports available', () => { - const params: CreateConfigParameters = { - chains: [mockChainWithoutWs], - connectors: [polkadotjsConnector()], - transports: {} - } - - expect(() => createConfig(params)).toThrow( - 'Transports must be provided for chains.' - ) - }) - - it('should throw error when chain has no corresponding transport', () => { - const chainWithoutTransport: Chain = { - genesisHash: '0x456789abcdef', - name: 'Chain Without Transport', - nativeCurrency: { - name: 'No Transport Token', - symbol: 'NTT', - decimals: 12 - }, - rpcUrls: {}, - ss58Format: 1, - chainIconUrl: 'data:image/svg+xml;base64,PHN2Zz48L3N2Zz4=' - } - - const params: CreateConfigParameters = { - chains: [chainWithoutTransport], - connectors: [polkadotjsConnector()], - transports: { - 'custom-hash': 'wss://custom.endpoint.com' - } - } - - expect(() => createConfig(params)).toThrow( - 'Missing transport for chain "Chain Without Transport" (genesisHash: 0x456789abcdef). Please provide a valid WebSocket URL in the chain configuration or explicit transport.' - ) - }) - }) + ); + }); + }); describe('transport generation', () => { it('should generate transports from chain WebSocket URLs', () => { const params: CreateConfigParameters = { chains: [polkadot], - connectors: [polkadotjsConnector()] - } + connectors: [polkadotjsConnector()], + }; - const config = createConfig(params) + const config = createConfig(params); - expect(config.transports[polkadot.genesisHash]).toBe(polkadot.rpcUrls.webSocket![0]) - }) + expect(config.transports[polkadot.genesisHash]).toBe(polkadot.rpcUrls.webSocket![0]); + }); it('should warn when chain has no WebSocket URL', () => { - const consoleSpy = vi.spyOn(console, 'warn') + const consoleSpy = vi.spyOn(console, 'warn'); const params: CreateConfigParameters = { chains: [mockChainWithoutWs], connectors: [polkadotjsConnector()], transports: { - [mockChainWithoutWs.genesisHash]: 'wss://custom.endpoint.com' - } - } + [mockChainWithoutWs.genesisHash]: 'wss://custom.endpoint.com', + }, + }; - createConfig(params) + createConfig(params); expect(consoleSpy).toHaveBeenCalledWith( 'No WebSocket URL found for chain "Test Chain" (0x123456789abcdef). Skipping transport generation.' - ) - }) + ); + }); it('should handle multiple chains with mixed WebSocket availability', () => { - const chainWithWs = polkadot - const chainWithoutWs = mockChainWithoutWs + const chainWithWs = polkadot; + const chainWithoutWs = mockChainWithoutWs; const params: CreateConfigParameters = { chains: [chainWithWs, chainWithoutWs], connectors: [polkadotjsConnector()], transports: { - [chainWithoutWs.genesisHash]: 'wss://fallback.endpoint.com' - } - } + [chainWithoutWs.genesisHash]: 'wss://fallback.endpoint.com', + }, + }; - const config = createConfig(params) + const config = createConfig(params); expect(config.transports).toEqual({ [chainWithWs.genesisHash]: polkadot.rpcUrls.webSocket![0], - [chainWithoutWs.genesisHash]: 'wss://fallback.endpoint.com' - }) - }) - }) + [chainWithoutWs.genesisHash]: 'wss://fallback.endpoint.com', + }); + }); + }); + + describe('empty chains handling', () => { + it('should create config with empty chains array', () => { + const params: CreateConfigParameters = { + chains: [], + connectors: [polkadotjsConnector()], + }; + + const config = createConfig(params); + + expect(config.chains).toEqual([]); + expect(config.transports).toEqual({}); + }); + + it('should create config with undefined chains', () => { + const params: CreateConfigParameters = { + connectors: [polkadotjsConnector()], + } as CreateConfigParameters; + + const config = createConfig(params); + + expect(config.chains).toEqual([]); + expect(config.transports).toEqual({}); + }); + + it('should handle custom transports without chains', () => { + const customTransports = { + 'custom-hash': 'wss://custom.endpoint.com', + }; + + const params: CreateConfigParameters = { + chains: [], + connectors: [polkadotjsConnector()], + transports: customTransports, + }; + + const config = createConfig(params); + + expect(config.chains).toEqual([]); + expect(config.transports).toEqual(customTransports); + }); + }); describe('immutability', () => { it('should freeze chains array', () => { const params: CreateConfigParameters = { chains: [polkadot], - connectors: [polkadotjsConnector()] - } + connectors: [polkadotjsConnector()], + }; - const config = createConfig(params) + const config = createConfig(params); - expect(Object.isFrozen(config.chains)).toBe(true) - }) + expect(Object.isFrozen(config.chains)).toBe(true); + }); it('should freeze connectors array', () => { const params: CreateConfigParameters = { chains: [polkadot], - connectors: [polkadotjsConnector()] - } + connectors: [polkadotjsConnector()], + }; - const config = createConfig(params) + const config = createConfig(params); - expect(Object.isFrozen(config.connectors)).toBe(true) - }) + expect(Object.isFrozen(config.connectors)).toBe(true); + }); it('should freeze transports object', () => { const params: CreateConfigParameters = { chains: [polkadot], - connectors: [polkadotjsConnector()] - } + connectors: [polkadotjsConnector()], + }; - const config = createConfig(params) + const config = createConfig(params); - expect(Object.isFrozen(config.transports)).toBe(true) - }) - }) + expect(Object.isFrozen(config.transports)).toBe(true); + }); + }); describe('edge cases', () => { - it('should handle undefined optional parameters gracefully', () => { const params: CreateConfigParameters = { chains: [polkadot], @@ -310,32 +303,32 @@ describe('createConfig', () => { customRpc: undefined, cacheMetadata: undefined, metadata: undefined, - scaledResponses: undefined - } + scaledResponses: undefined, + }; - const config = createConfig(params) + const config = createConfig(params); - expect(config.customTypes).toBeUndefined() - expect(config.customRpc).toBeUndefined() - expect(config.cacheMetadata).toBeUndefined() - expect(config.metadata).toBeUndefined() - expect(config.scaledResponses).toBeUndefined() - }) + expect(config.customTypes).toBeUndefined(); + expect(config.customRpc).toBeUndefined(); + expect(config.cacheMetadata).toBeUndefined(); + expect(config.metadata).toBeUndefined(); + expect(config.scaledResponses).toBeUndefined(); + }); it('should handle chains with testnet property', () => { const params: CreateConfigParameters = { chains: [mockChainWithoutWs], connectors: [polkadotjsConnector()], transports: { - [mockChainWithoutWs.genesisHash]: 'wss://testnet.endpoint.com' - } - } + [mockChainWithoutWs.genesisHash]: 'wss://testnet.endpoint.com', + }, + }; - const config = createConfig(params) + const config = createConfig(params); - expect(config.chains[0].testnet).toBe(true) - }) - }) + expect(config.chains[0].testnet).toBe(true); + }); + }); describe('real-world scenarios', () => { it('should work with typical production configuration', () => { @@ -344,65 +337,65 @@ describe('createConfig', () => { chains: [polkadot, kusama], connectors: [polkadotjsConnector(), subwalletConnector()], autoConnect: true, - cacheMetadata: true - } + cacheMetadata: true, + }; - const config = createConfig(params) + const config = createConfig(params); - expect(config.appName).toBe('My dApp') - expect(config.chains).toHaveLength(2) - expect(config.connectors).toHaveLength(2) - expect(config.autoConnect).toBe(true) - expect(config.cacheMetadata).toBe(true) - expect(Object.keys(config.transports)).toHaveLength(2) - }) - }) + expect(config.appName).toBe('My dApp'); + expect(config.chains).toHaveLength(2); + expect(config.connectors).toHaveLength(2); + expect(config.autoConnect).toBe(true); + expect(config.cacheMetadata).toBe(true); + expect(Object.keys(config.transports)).toHaveLength(2); + }); + }); describe('default storage behavior', () => { it('should use localStorage when available', () => { const mockLocalStorage = { getItem: vi.fn(), setItem: vi.fn(), - removeItem: vi.fn() - } + removeItem: vi.fn(), + }; Object.defineProperty(globalThis, 'window', { value: { localStorage: mockLocalStorage }, writable: true, - configurable: true - }) + configurable: true, + }); const params: CreateConfigParameters = { chains: [polkadot], - connectors: [polkadotjsConnector()] - } + connectors: [polkadotjsConnector()], + }; - const config = createConfig(params) + const config = createConfig(params); - expect(config.storage).toBeDefined() - expect(config.storage).toHaveProperty('getItem') - expect(config.storage).toHaveProperty('setItem') - expect(config.storage).toHaveProperty('removeItem') - }) + expect(config.storage).toBeDefined(); + expect(config.storage).toHaveProperty('getItem'); + expect(config.storage).toHaveProperty('setItem'); + expect(config.storage).toHaveProperty('removeItem'); + }); it('should use noopStorage when localStorage unavailable', () => { Object.defineProperty(globalThis, 'window', { value: undefined, writable: true, - configurable: true - }) + configurable: true, + }); const params: CreateConfigParameters = { chains: [polkadot], - connectors: [polkadotjsConnector()] - } - - const config = createConfig(params) - - expect(config.storage).toBeDefined() - expect(config.storage).toHaveProperty('getItem') - expect(config.storage).toHaveProperty('setItem') - expect(config.storage).toHaveProperty('removeItem') - }) - }) -}) + connectors: [polkadotjsConnector()], + }; + + const config = createConfig(params); + + expect(config.storage).toBeDefined(); + expect(config.storage).toHaveProperty('getItem'); + expect(config.storage).toHaveProperty('setItem'); + expect(config.storage).toHaveProperty('removeItem'); + }); + }); +}); diff --git a/packages/core/src/config/createConfig.ts b/packages/core/src/config/createConfig.ts index f2a85f6..e5aabea 100644 --- a/packages/core/src/config/createConfig.ts +++ b/packages/core/src/config/createConfig.ts @@ -1,12 +1,12 @@ import type { - CreateConfigParameters, - Config, Chain, + Config, Connector, - Transport, + CreateConfigParameters, RawStorage, + Transport, } from '../types'; -import { createStorage } from './createStorage' +import { createStorage } from './createStorage'; const noopStorage: RawStorage = { getItem: async (_key: string) => null, @@ -15,9 +15,7 @@ const noopStorage: RawStorage = { }; const defaultLunoStorage = createStorage({ - storage: typeof window !== 'undefined' && window.localStorage - ? window.localStorage - : noopStorage, + storage: typeof window !== 'undefined' && window.localStorage ? window.localStorage : noopStorage, keyPrefix: 'luno.', }); @@ -29,7 +27,9 @@ function generateTransportsFromChains(chains: readonly Chain[]): Record 0 ? generateTransportsFromChains(chains) : {}; const finalTransports = transports ? { ...transportsFromChains, ...transports } : transportsFromChains; - if (!finalTransports || Object.keys(finalTransports).length === 0) { - throw new Error('Transports must be provided for chains.'); - } - - for (const chain of chains) { - if (!finalTransports[chain.genesisHash]) { - throw new Error(`Missing transport for chain "${chain.name}" (genesisHash: ${chain.genesisHash}). Please provide a valid WebSocket URL in the chain configuration or explicit transport.`); + if (chains.length > 0) { + for (const chain of chains) { + if (!finalTransports[chain.genesisHash]) { + console.warn( + `Missing transport for chain "${chain.name}" (genesisHash: ${chain.genesisHash}). Chain functionality may be limited.` + ); + } } } diff --git a/packages/core/src/config/createStorage.test.ts b/packages/core/src/config/createStorage.test.ts index 392d7fd..7883fc2 100644 --- a/packages/core/src/config/createStorage.test.ts +++ b/packages/core/src/config/createStorage.test.ts @@ -1,314 +1,313 @@ -import { describe, it, expect, vi, beforeEach } from 'vitest' -import { createStorage } from './createStorage' -import type { RawStorage, LunoStorage } from '../types' +import { beforeEach, describe, expect, it, vi } from 'vitest'; +import type { LunoStorage, RawStorage } from '../types'; +import { createStorage } from './createStorage'; describe('createStorage', () => { - let mockRawStorage: RawStorage - let storage: LunoStorage + let mockRawStorage: RawStorage; + let storage: LunoStorage; beforeEach(() => { - vi.clearAllMocks() - vi.spyOn(console, 'error').mockImplementation(() => {}) + vi.clearAllMocks(); + vi.spyOn(console, 'error').mockImplementation(() => {}); mockRawStorage = { getItem: vi.fn(), setItem: vi.fn(), - removeItem: vi.fn() - } - }) + removeItem: vi.fn(), + }; + }); describe('basic functionality', () => { it('should create storage with default prefix', () => { - storage = createStorage({ storage: mockRawStorage }) + storage = createStorage({ storage: mockRawStorage }); - expect(storage).toHaveProperty('getItem') - expect(storage).toHaveProperty('setItem') - expect(storage).toHaveProperty('removeItem') - }) + expect(storage).toHaveProperty('getItem'); + expect(storage).toHaveProperty('setItem'); + expect(storage).toHaveProperty('removeItem'); + }); it('should create storage with custom prefix', () => { storage = createStorage({ storage: mockRawStorage, - keyPrefix: 'custom.' - }) + keyPrefix: 'custom.', + }); - expect(storage).toHaveProperty('getItem') - expect(storage).toHaveProperty('setItem') - expect(storage).toHaveProperty('removeItem') - }) - }) + expect(storage).toHaveProperty('getItem'); + expect(storage).toHaveProperty('setItem'); + expect(storage).toHaveProperty('removeItem'); + }); + }); describe('key prefix handling', () => { it('should add default prefix to keys', async () => { - mockRawStorage.getItem = vi.fn().mockResolvedValue('test-value') - storage = createStorage({ storage: mockRawStorage }) + mockRawStorage.getItem = vi.fn().mockResolvedValue('test-value'); + storage = createStorage({ storage: mockRawStorage }); - await storage.getItem('test-key') + await storage.getItem('test-key'); - expect(mockRawStorage.getItem).toHaveBeenCalledWith('luno.test-key') - }) + expect(mockRawStorage.getItem).toHaveBeenCalledWith('luno.test-key'); + }); it('should add custom prefix to keys', async () => { - mockRawStorage.setItem = vi.fn().mockResolvedValue(undefined) + mockRawStorage.setItem = vi.fn().mockResolvedValue(undefined); storage = createStorage({ storage: mockRawStorage, - keyPrefix: 'myapp.' - }) + keyPrefix: 'myapp.', + }); - await storage.setItem('user-data', 'test-value') + await storage.setItem('user-data', 'test-value'); - expect(mockRawStorage.setItem).toHaveBeenCalledWith('myapp.user-data', 'test-value') - }) + expect(mockRawStorage.setItem).toHaveBeenCalledWith('myapp.user-data', 'test-value'); + }); it('should handle empty prefix', async () => { - mockRawStorage.removeItem = vi.fn().mockResolvedValue(undefined) + mockRawStorage.removeItem = vi.fn().mockResolvedValue(undefined); storage = createStorage({ storage: mockRawStorage, - keyPrefix: '' - }) + keyPrefix: '', + }); - await storage.removeItem('test-key') + await storage.removeItem('test-key'); - expect(mockRawStorage.removeItem).toHaveBeenCalledWith('test-key') - }) + expect(mockRawStorage.removeItem).toHaveBeenCalledWith('test-key'); + }); it('should handle prefix with special characters', async () => { - mockRawStorage.getItem = vi.fn().mockResolvedValue('test-value') + mockRawStorage.getItem = vi.fn().mockResolvedValue('test-value'); storage = createStorage({ storage: mockRawStorage, - keyPrefix: 'my-app_v1.0:' - }) + keyPrefix: 'my-app_v1.0:', + }); - await storage.getItem('test-key') + await storage.getItem('test-key'); - expect(mockRawStorage.getItem).toHaveBeenCalledWith('my-app_v1.0:test-key') - }) + expect(mockRawStorage.getItem).toHaveBeenCalledWith('my-app_v1.0:test-key'); + }); it('should handle prefix ending without separator', async () => { - mockRawStorage.getItem = vi.fn().mockResolvedValue('test-value') + mockRawStorage.getItem = vi.fn().mockResolvedValue('test-value'); storage = createStorage({ storage: mockRawStorage, - keyPrefix: 'myapp' - }) + keyPrefix: 'myapp', + }); - await storage.getItem('test-key') + await storage.getItem('test-key'); - expect(mockRawStorage.getItem).toHaveBeenCalledWith('myapptest-key') - }) - }) + expect(mockRawStorage.getItem).toHaveBeenCalledWith('myapptest-key'); + }); + }); describe('getItem', () => { beforeEach(() => { - storage = createStorage({ storage: mockRawStorage }) - }) + storage = createStorage({ storage: mockRawStorage }); + }); it('should return string value from storage', async () => { - mockRawStorage.getItem = vi.fn().mockResolvedValue('test-value') + mockRawStorage.getItem = vi.fn().mockResolvedValue('test-value'); - const result = await storage.getItem('test-key') + const result = await storage.getItem('test-key'); - expect(result).toBe('test-value') - expect(mockRawStorage.getItem).toHaveBeenCalledWith('luno.test-key') - }) + expect(result).toBe('test-value'); + expect(mockRawStorage.getItem).toHaveBeenCalledWith('luno.test-key'); + }); it('should return null when storage returns null', async () => { - mockRawStorage.getItem = vi.fn().mockResolvedValue(null) + mockRawStorage.getItem = vi.fn().mockResolvedValue(null); - const result = await storage.getItem('test-key') + const result = await storage.getItem('test-key'); - expect(result).toBe(null) - }) + expect(result).toBe(null); + }); it('should return null when storage returns undefined', async () => { - mockRawStorage.getItem = vi.fn().mockResolvedValue(undefined) + mockRawStorage.getItem = vi.fn().mockResolvedValue(undefined); - const result = await storage.getItem('test-key') + const result = await storage.getItem('test-key'); - expect(result).toBe(null) - }) + expect(result).toBe(null); + }); it('should convert non-string values to strings', async () => { - mockRawStorage.getItem = vi.fn().mockResolvedValue(123) + mockRawStorage.getItem = vi.fn().mockResolvedValue(123); - const result = await storage.getItem('test-key') + const result = await storage.getItem('test-key'); - expect(result).toBe('123') - }) + expect(result).toBe('123'); + }); it('should return null and log error when getItem throws', async () => { - const error = new Error('Storage error') - mockRawStorage.getItem = vi.fn().mockRejectedValue(error) - const consoleSpy = vi.spyOn(console, 'error') + const error = new Error('Storage error'); + mockRawStorage.getItem = vi.fn().mockRejectedValue(error); + const consoleSpy = vi.spyOn(console, 'error'); - const result = await storage.getItem('test-key') + const result = await storage.getItem('test-key'); - expect(result).toBe(null) + expect(result).toBe(null); expect(consoleSpy).toHaveBeenCalledWith( '[LunoStorage] Error getting item "test-key" (full key: "luno.test-key"):', error - ) - }) - }) + ); + }); + }); describe('setItem', () => { beforeEach(() => { - storage = createStorage({ storage: mockRawStorage }) - }) + storage = createStorage({ storage: mockRawStorage }); + }); it('should set item in storage', async () => { - mockRawStorage.setItem = vi.fn().mockResolvedValue(undefined) + mockRawStorage.setItem = vi.fn().mockResolvedValue(undefined); - await storage.setItem('test-key', 'test-value') + await storage.setItem('test-key', 'test-value'); - expect(mockRawStorage.setItem).toHaveBeenCalledWith('luno.test-key', 'test-value') - }) + expect(mockRawStorage.setItem).toHaveBeenCalledWith('luno.test-key', 'test-value'); + }); it('should log error when setItem throws but not rethrow', async () => { - const error = new Error('Storage error') - mockRawStorage.setItem = vi.fn().mockRejectedValue(error) - const consoleSpy = vi.spyOn(console, 'error') + const error = new Error('Storage error'); + mockRawStorage.setItem = vi.fn().mockRejectedValue(error); + const consoleSpy = vi.spyOn(console, 'error'); - await expect(storage.setItem('test-key', 'test-value')).resolves.toBeUndefined() + await expect(storage.setItem('test-key', 'test-value')).resolves.toBeUndefined(); expect(consoleSpy).toHaveBeenCalledWith( '[LunoStorage] Error setting item "test-key" (full key: "luno.test-key"):', error - ) - }) - }) + ); + }); + }); describe('removeItem', () => { beforeEach(() => { - storage = createStorage({ storage: mockRawStorage }) - }) + storage = createStorage({ storage: mockRawStorage }); + }); it('should remove item from storage', async () => { - mockRawStorage.removeItem = vi.fn().mockResolvedValue(undefined) + mockRawStorage.removeItem = vi.fn().mockResolvedValue(undefined); - await storage.removeItem('test-key') + await storage.removeItem('test-key'); - expect(mockRawStorage.removeItem).toHaveBeenCalledWith('luno.test-key') - }) + expect(mockRawStorage.removeItem).toHaveBeenCalledWith('luno.test-key'); + }); it('should log error when removeItem throws but not rethrow', async () => { - const error = new Error('Storage error') - mockRawStorage.removeItem = vi.fn().mockRejectedValue(error) - const consoleSpy = vi.spyOn(console, 'error') + const error = new Error('Storage error'); + mockRawStorage.removeItem = vi.fn().mockRejectedValue(error); + const consoleSpy = vi.spyOn(console, 'error'); - await expect(storage.removeItem('test-key')).resolves.toBeUndefined() + await expect(storage.removeItem('test-key')).resolves.toBeUndefined(); expect(consoleSpy).toHaveBeenCalledWith( '[LunoStorage] Error removing item "test-key" (full key: "luno.test-key"):', error - ) - }) - }) + ); + }); + }); describe('edge cases', () => { it('should handle empty key suffix', async () => { - mockRawStorage.getItem = vi.fn().mockResolvedValue('value') - storage = createStorage({ storage: mockRawStorage }) + mockRawStorage.getItem = vi.fn().mockResolvedValue('value'); + storage = createStorage({ storage: mockRawStorage }); - await storage.getItem('') + await storage.getItem(''); - expect(mockRawStorage.getItem).toHaveBeenCalledWith('luno.') - }) + expect(mockRawStorage.getItem).toHaveBeenCalledWith('luno.'); + }); it('should handle special characters in key suffix', async () => { - mockRawStorage.setItem = vi.fn().mockResolvedValue(undefined) - storage = createStorage({ storage: mockRawStorage }) + mockRawStorage.setItem = vi.fn().mockResolvedValue(undefined); + storage = createStorage({ storage: mockRawStorage }); - await storage.setItem('user:123/data', 'test-value') + await storage.setItem('user:123/data', 'test-value'); - expect(mockRawStorage.setItem).toHaveBeenCalledWith('luno.user:123/data', 'test-value') - }) + expect(mockRawStorage.setItem).toHaveBeenCalledWith('luno.user:123/data', 'test-value'); + }); it('should handle multiple consecutive operations', async () => { - mockRawStorage.getItem = vi.fn().mockResolvedValue('value') - mockRawStorage.setItem = vi.fn().mockResolvedValue(undefined) - mockRawStorage.removeItem = vi.fn().mockResolvedValue(undefined) - storage = createStorage({ storage: mockRawStorage }) + mockRawStorage.getItem = vi.fn().mockResolvedValue('value'); + mockRawStorage.setItem = vi.fn().mockResolvedValue(undefined); + mockRawStorage.removeItem = vi.fn().mockResolvedValue(undefined); + storage = createStorage({ storage: mockRawStorage }); - await storage.setItem('key1', 'value1') - await storage.getItem('key1') - await storage.removeItem('key1') + await storage.setItem('key1', 'value1'); + await storage.getItem('key1'); + await storage.removeItem('key1'); - expect(mockRawStorage.setItem).toHaveBeenCalledWith('luno.key1', 'value1') - expect(mockRawStorage.getItem).toHaveBeenCalledWith('luno.key1') - expect(mockRawStorage.removeItem).toHaveBeenCalledWith('luno.key1') - }) + expect(mockRawStorage.setItem).toHaveBeenCalledWith('luno.key1', 'value1'); + expect(mockRawStorage.getItem).toHaveBeenCalledWith('luno.key1'); + expect(mockRawStorage.removeItem).toHaveBeenCalledWith('luno.key1'); + }); it('should handle very long keys', async () => { - const longKey = 'user_session_data_with_timestamp_and_details'.repeat(2) - mockRawStorage.setItem = vi.fn().mockResolvedValue(undefined) - storage = createStorage({ storage: mockRawStorage }) + const longKey = 'user_session_data_with_timestamp_and_details'.repeat(2); + mockRawStorage.setItem = vi.fn().mockResolvedValue(undefined); + storage = createStorage({ storage: mockRawStorage }); - await storage.setItem(longKey, 'test-value') + await storage.setItem(longKey, 'test-value'); - expect(mockRawStorage.setItem).toHaveBeenCalledWith(`luno.${longKey}`, 'test-value') - }) + expect(mockRawStorage.setItem).toHaveBeenCalledWith(`luno.${longKey}`, 'test-value'); + }); it('should handle values with special characters', async () => { - const specialValue = '{"test": "value with\nnewline and\ttab"}' - mockRawStorage.setItem = vi.fn().mockResolvedValue(undefined) - storage = createStorage({ storage: mockRawStorage }) + const specialValue = '{"test": "value with\nnewline and\ttab"}'; + mockRawStorage.setItem = vi.fn().mockResolvedValue(undefined); + storage = createStorage({ storage: mockRawStorage }); - await storage.setItem('test-key', specialValue) + await storage.setItem('test-key', specialValue); - expect(mockRawStorage.setItem).toHaveBeenCalledWith('luno.test-key', specialValue) - }) - - }) + expect(mockRawStorage.setItem).toHaveBeenCalledWith('luno.test-key', specialValue); + }); + }); describe('type compatibility', () => { it('should work with localStorage-like storage', async () => { const mockLocalStorage = { getItem: vi.fn().mockReturnValue('localStorage-value'), setItem: vi.fn(), - removeItem: vi.fn() - } + removeItem: vi.fn(), + }; - storage = createStorage({ storage: mockLocalStorage }) + storage = createStorage({ storage: mockLocalStorage }); - const result = await storage.getItem('test-key') - expect(result).toBe('localStorage-value') - expect(mockLocalStorage.getItem).toHaveBeenCalledWith('luno.test-key') - }) - }) + const result = await storage.getItem('test-key'); + expect(result).toBe('localStorage-value'); + expect(mockLocalStorage.getItem).toHaveBeenCalledWith('luno.test-key'); + }); + }); describe('data normalization', () => { beforeEach(() => { - storage = createStorage({ storage: mockRawStorage }) - }) + storage = createStorage({ storage: mockRawStorage }); + }); it('should convert number to string', async () => { - mockRawStorage.getItem = vi.fn().mockResolvedValue(123) - const result = await storage.getItem('test-key') - expect(result).toBe('123') - }) + mockRawStorage.getItem = vi.fn().mockResolvedValue(123); + const result = await storage.getItem('test-key'); + expect(result).toBe('123'); + }); it('should convert boolean to string', async () => { - mockRawStorage.getItem = vi.fn().mockResolvedValue(true) - const result = await storage.getItem('test-key') - expect(result).toBe('true') - }) + mockRawStorage.getItem = vi.fn().mockResolvedValue(true); + const result = await storage.getItem('test-key'); + expect(result).toBe('true'); + }); it('should convert object to string', async () => { - mockRawStorage.getItem = vi.fn().mockResolvedValue({ key: 'value' }) - const result = await storage.getItem('test-key') - expect(result).toBe('[object Object]') - }) + mockRawStorage.getItem = vi.fn().mockResolvedValue({ key: 'value' }); + const result = await storage.getItem('test-key'); + expect(result).toBe('[object Object]'); + }); it('should handle zero value', async () => { - mockRawStorage.getItem = vi.fn().mockResolvedValue(0) - const result = await storage.getItem('test-key') - expect(result).toBe('0') - }) + mockRawStorage.getItem = vi.fn().mockResolvedValue(0); + const result = await storage.getItem('test-key'); + expect(result).toBe('0'); + }); it('should handle empty string value', async () => { - mockRawStorage.getItem = vi.fn().mockResolvedValue('') - const result = await storage.getItem('test-key') - expect(result).toBe('') - }) - }) -}) + mockRawStorage.getItem = vi.fn().mockResolvedValue(''); + const result = await storage.getItem('test-key'); + expect(result).toBe(''); + }); + }); +}); diff --git a/packages/core/src/config/createStorage.ts b/packages/core/src/config/createStorage.ts index d5ea93a..f8263f1 100644 --- a/packages/core/src/config/createStorage.ts +++ b/packages/core/src/config/createStorage.ts @@ -1,4 +1,4 @@ -import type { LunoStorage, RawStorage } from '../types' +import type { LunoStorage, RawStorage } from '../types'; // Defines the parameters for the createStorage function. export interface CreateStorageParameters { @@ -29,7 +29,10 @@ export function createStorage({ // Normalize undefined or null to null return value == null ? null : String(value); } catch (error) { - console.error(`[LunoStorage] Error getting item "${keySuffix}" (full key: "${getKey(keySuffix)}"):`, error); + console.error( + `[LunoStorage] Error getting item "${keySuffix}" (full key: "${getKey(keySuffix)}"):`, + error + ); return null; // Return null on error to indicate failure } }, @@ -40,7 +43,10 @@ export function createStorage({ // Await to handle both sync and async RawStorage setItem methods consistently await storage.setItem(fullKey, value); } catch (error) { - console.error(`[LunoStorage] Error setting item "${keySuffix}" (full key: "${getKey(keySuffix)}"):`, error); + console.error( + `[LunoStorage] Error setting item "${keySuffix}" (full key: "${getKey(keySuffix)}"):`, + error + ); // Errors during setItem are logged but don't typically need to be propagated further in the same way getItem might. } }, @@ -51,7 +57,10 @@ export function createStorage({ // Await to handle both sync and async RawStorage removeItem methods consistently await storage.removeItem(fullKey); } catch (error) { - console.error(`[LunoStorage] Error removing item "${keySuffix}" (full key: "${getKey(keySuffix)}"):`, error); + console.error( + `[LunoStorage] Error removing item "${keySuffix}" (full key: "${getKey(keySuffix)}"):`, + error + ); } }, }; diff --git a/packages/core/src/config/index.ts b/packages/core/src/config/index.ts index ecf6fdf..d124c53 100644 --- a/packages/core/src/config/index.ts +++ b/packages/core/src/config/index.ts @@ -1,5 +1,3 @@ -export * from './providers' - -export * from './createConfig' - -export * from './createStorage' +export * from './createConfig'; +export * from './createStorage'; +export * from './providers'; diff --git a/packages/core/src/config/logos/generated/assethubChain.ts b/packages/core/src/config/logos/generated/assethubChain.ts index 5657fb3..6e6fc19 100644 --- a/packages/core/src/config/logos/generated/assethubChain.ts +++ b/packages/core/src/config/logos/generated/assethubChain.ts @@ -3,4 +3,5 @@ // Do not edit. Auto-generated via node scripts/convertLogos.mjs -export const assethubChain = 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDI3LjIuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IgogICAgIHZpZXdCb3g9IjAgMCA2NDAgNjQwIiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCA2NDAgNjQwOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Cgkuc3Qwe2ZpbGw6IzMyMUQ0Nzt9Cgkuc3Qxe2ZpbGw6I0ZGRkZGRjt9Cgkuc3Qye2ZpbGw6I0U2MDA3QTt9Cjwvc3R5bGU+CiAgICA8Zz4KCTxwYXRoIGNsYXNzPSJzdDAiIGQ9Ik02MzcuMywzMTkuM2MwLDE3NS4yLTE0MiwzMTcuMy0zMTcuMywzMTcuM1MyLjcsNDk0LjYsMi43LDMxOS4zUzE0NC44LDIuMSwzMjAsMi4xUzYzNy4zLDE0NC4xLDYzNy4zLDMxOS4zeiIKICAgIC8+CiAgICAgICAgPHBhdGggY2xhc3M9InN0MSIgZD0iTTQ0NC4yLDM5Mi40aC02Ny42bC0xMi43LTMxaC04NS44bC0xMi43LDMxaC02Ny42bDgwLjktMTg0LjNoODQuNUw0NDQuMiwzOTIuNHogTTMyMS4xLDI1NmwtMjIuNCw1NWg0NC43CgkJTDMyMS4xLDI1NnoiLz4KICAgICAgICA8Y2lyY2xlIGNsYXNzPSJzdDIiIGN4PSIzMjEiIGN5PSIxMjIuMSIgcj0iNDYuOSIvPgogICAgICAgIDxjaXJjbGUgY2xhc3M9InN0MiIgY3g9IjMyMSIgY3k9IjUxNy4xIiByPSI0Ni45Ii8+CiAgICAgICAgPGNpcmNsZSBjbGFzcz0ic3QyIiBjeD0iMTQ3LjgiIGN5PSIyMTYiIHI9IjQ2LjkiLz4KICAgICAgICA8Y2lyY2xlIGNsYXNzPSJzdDIiIGN4PSI0OTQuMyIgY3k9IjIxNiIgcj0iNDYuOSIvPgogICAgICAgIDxjaXJjbGUgY2xhc3M9InN0MiIgY3g9IjE0Ny44IiBjeT0iNDI0LjgiIHI9IjQ2LjkiLz4KICAgICAgICA8Y2lyY2xlIGNsYXNzPSJzdDIiIGN4PSI0OTQuMyIgY3k9IjQyNC44IiByPSI0Ni45Ii8+CjwvZz4KPC9zdmc+Cg=='; +export const assethubChain = + 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDI3LjIuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IgogICAgIHZpZXdCb3g9IjAgMCA2NDAgNjQwIiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCA2NDAgNjQwOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Cgkuc3Qwe2ZpbGw6IzMyMUQ0Nzt9Cgkuc3Qxe2ZpbGw6I0ZGRkZGRjt9Cgkuc3Qye2ZpbGw6I0U2MDA3QTt9Cjwvc3R5bGU+CiAgICA8Zz4KCTxwYXRoIGNsYXNzPSJzdDAiIGQ9Ik02MzcuMywzMTkuM2MwLDE3NS4yLTE0MiwzMTcuMy0zMTcuMywzMTcuM1MyLjcsNDk0LjYsMi43LDMxOS4zUzE0NC44LDIuMSwzMjAsMi4xUzYzNy4zLDE0NC4xLDYzNy4zLDMxOS4zeiIKICAgIC8+CiAgICAgICAgPHBhdGggY2xhc3M9InN0MSIgZD0iTTQ0NC4yLDM5Mi40aC02Ny42bC0xMi43LTMxaC04NS44bC0xMi43LDMxaC02Ny42bDgwLjktMTg0LjNoODQuNUw0NDQuMiwzOTIuNHogTTMyMS4xLDI1NmwtMjIuNCw1NWg0NC43CgkJTDMyMS4xLDI1NnoiLz4KICAgICAgICA8Y2lyY2xlIGNsYXNzPSJzdDIiIGN4PSIzMjEiIGN5PSIxMjIuMSIgcj0iNDYuOSIvPgogICAgICAgIDxjaXJjbGUgY2xhc3M9InN0MiIgY3g9IjMyMSIgY3k9IjUxNy4xIiByPSI0Ni45Ii8+CiAgICAgICAgPGNpcmNsZSBjbGFzcz0ic3QyIiBjeD0iMTQ3LjgiIGN5PSIyMTYiIHI9IjQ2LjkiLz4KICAgICAgICA8Y2lyY2xlIGNsYXNzPSJzdDIiIGN4PSI0OTQuMyIgY3k9IjIxNiIgcj0iNDYuOSIvPgogICAgICAgIDxjaXJjbGUgY2xhc3M9InN0MiIgY3g9IjE0Ny44IiBjeT0iNDI0LjgiIHI9IjQ2LjkiLz4KICAgICAgICA8Y2lyY2xlIGNsYXNzPSJzdDIiIGN4PSI0OTQuMyIgY3k9IjQyNC44IiByPSI0Ni45Ii8+CjwvZz4KPC9zdmc+Cg=='; diff --git a/packages/core/src/config/logos/generated/assethubKusamaChain.ts b/packages/core/src/config/logos/generated/assethubKusamaChain.ts index 7b203ed..9fe3f62 100644 --- a/packages/core/src/config/logos/generated/assethubKusamaChain.ts +++ b/packages/core/src/config/logos/generated/assethubKusamaChain.ts @@ -3,4 +3,5 @@ // Do not edit. Auto-generated via node scripts/convertLogos.mjs -export const assethubKusamaChain = 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTYiIGhlaWdodD0iNTYiIHZpZXdCb3g9IjAgMCA1NiA1NiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICAgIDxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMF8zMDYwXzE1MjYpIj4KICAgICAgICA8cGF0aCBkPSJNNTUuNzYzOCAyNy45Mzg4QzU1Ljc2MzggNDMuMjY4OCA0My4zMzg4IDU1LjcwMjYgMjguMDAwMSA1NS43MDI2QzEyLjY2MTMgNTUuNzAyNiAwLjIzNjMyOCA0My4yNzc2IDAuMjM2MzI4IDI3LjkzODhDMC4yMzYzMjggMTIuNjAwMSAxMi42NzAxIDAuMTgzODM4IDI4LjAwMDEgMC4xODM4MzhDNDMuMzMwMSAwLjE4MzgzOCA1NS43NjM4IDEyLjYwODggNTUuNzYzOCAyNy45Mzg4WiIgZmlsbD0iYmxhY2siLz4KICAgICAgICA8cGF0aCBkPSJNMzguODY3NiAzNC4zMzVIMzIuOTUyNkwzMS44NDE0IDMxLjYyMjVIMjQuMzMzOUwyMy4yMjI2IDM0LjMzNUgxNy4zMDc2TDI0LjM4NjQgMTguMjA4N0gzMS43ODAxTDM4Ljg2NzYgMzQuMzM1Wk0yOC4wOTY0IDIyLjRMMjYuMTM2NCAyNy4yMTI1SDMwLjA0NzZMMjguMDk2NCAyMi40WiIgZmlsbD0id2hpdGUiLz4KICAgICAgICA8cGF0aCBkPSJNMjguMDg3NiAxNC43ODc2QzMwLjM1NDEgMTQuNzg3NiAzMi4xOTE0IDEyLjk1MDMgMzIuMTkxNCAxMC42ODM4QzMyLjE5MTQgOC40MTczOSAzMC4zNTQxIDYuNTgwMDggMjguMDg3NiA2LjU4MDA4QzI1LjgyMTIgNi41ODAwOCAyMy45ODM5IDguNDE3MzkgMjMuOTgzOSAxMC42ODM4QzIzLjk4MzkgMTIuOTUwMyAyNS44MjEyIDE0Ljc4NzYgMjguMDg3NiAxNC43ODc2WiIgZmlsbD0id2hpdGUiLz4KICAgICAgICA8cGF0aCBkPSJNMjguMDg3NiA0OS4zNTAxQzMwLjM1NDEgNDkuMzUwMSAzMi4xOTE0IDQ3LjUxMjggMzIuMTkxNCA0NS4yNDYzQzMyLjE5MTQgNDIuOTc5OSAzMC4zNTQxIDQxLjE0MjYgMjguMDg3NiA0MS4xNDI2QzI1LjgyMTIgNDEuMTQyNiAyMy45ODM5IDQyLjk3OTkgMjMuOTgzOSA0NS4yNDYzQzIzLjk4MzkgNDcuNTEyOCAyNS44MjEyIDQ5LjM1MDEgMjguMDg3NiA0OS4zNTAxWiIgZmlsbD0id2hpdGUiLz4KICAgICAgICA8cGF0aCBkPSJNMTIuOTMyNCAyMy4wMDM5QzE1LjE5ODggMjMuMDAzOSAxNy4wMzYxIDIxLjE2NjYgMTcuMDM2MSAxOC45MDAxQzE3LjAzNjEgMTYuNjMzNyAxNS4xOTg4IDE0Ljc5NjQgMTIuOTMyNCAxNC43OTY0QzEwLjY2NTkgMTQuNzk2NCA4LjgyODYxIDE2LjYzMzcgOC44Mjg2MSAxOC45MDAxQzguODI4NjEgMjEuMTY2NiAxMC42NjU5IDIzLjAwMzkgMTIuOTMyNCAyMy4wMDM5WiIgZmlsbD0id2hpdGUiLz4KICAgICAgICA8cGF0aCBkPSJNNDMuMjUxMiAyMy4wMDM5QzQ1LjUxNzYgMjMuMDAzOSA0Ny4zNTUgMjEuMTY2NiA0Ny4zNTUgMTguOTAwMUM0Ny4zNTUgMTYuNjMzNyA0NS41MTc2IDE0Ljc5NjQgNDMuMjUxMiAxNC43OTY0QzQwLjk4NDggMTQuNzk2NCAzOS4xNDc1IDE2LjYzMzcgMzkuMTQ3NSAxOC45MDAxQzM5LjE0NzUgMjEuMTY2NiA0MC45ODQ4IDIzLjAwMzkgNDMuMjUxMiAyMy4wMDM5WiIgZmlsbD0id2hpdGUiLz4KICAgICAgICA8cGF0aCBkPSJNMTIuOTMyNCA0MS4yNzM5QzE1LjE5ODggNDEuMjczOSAxNy4wMzYxIDM5LjQzNjYgMTcuMDM2MSAzNy4xNzAyQzE3LjAzNjEgMzQuOTAzNyAxNS4xOTg4IDMzLjA2NjQgMTIuOTMyNCAzMy4wNjY0QzEwLjY2NTkgMzMuMDY2NCA4LjgyODYxIDM0LjkwMzcgOC44Mjg2MSAzNy4xNzAyQzguODI4NjEgMzkuNDM2NiAxMC42NjU5IDQxLjI3MzkgMTIuOTMyNCA0MS4yNzM5WiIgZmlsbD0id2hpdGUiLz4KICAgICAgICA8cGF0aCBkPSJNNDMuMjUxMiA0MS4yNzM5QzQ1LjUxNzYgNDEuMjczOSA0Ny4zNTUgMzkuNDM2NiA0Ny4zNTUgMzcuMTcwMkM0Ny4zNTUgMzQuOTAzNyA0NS41MTc2IDMzLjA2NjQgNDMuMjUxMiAzMy4wNjY0QzQwLjk4NDggMzMuMDY2NCAzOS4xNDc1IDM0LjkwMzcgMzkuMTQ3NSAzNy4xNzAyQzM5LjE0NzUgMzkuNDM2NiA0MC45ODQ4IDQxLjI3MzkgNDMuMjUxMiA0MS4yNzM5WiIgZmlsbD0id2hpdGUiLz4KICAgIDwvZz4KICAgIDxkZWZzPgogICAgICAgIDxjbGlwUGF0aCBpZD0iY2xpcDBfMzA2MF8xNTI2Ij4KICAgICAgICAgICAgPHJlY3Qgd2lkdGg9IjU2IiBoZWlnaHQ9IjU2IiBmaWxsPSJ3aGl0ZSIvPgogICAgICAgIDwvY2xpcFBhdGg+CiAgICA8L2RlZnM+Cjwvc3ZnPgo='; +export const assethubKusamaChain = + 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTYiIGhlaWdodD0iNTYiIHZpZXdCb3g9IjAgMCA1NiA1NiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICAgIDxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMF8zMDYwXzE1MjYpIj4KICAgICAgICA8cGF0aCBkPSJNNTUuNzYzOCAyNy45Mzg4QzU1Ljc2MzggNDMuMjY4OCA0My4zMzg4IDU1LjcwMjYgMjguMDAwMSA1NS43MDI2QzEyLjY2MTMgNTUuNzAyNiAwLjIzNjMyOCA0My4yNzc2IDAuMjM2MzI4IDI3LjkzODhDMC4yMzYzMjggMTIuNjAwMSAxMi42NzAxIDAuMTgzODM4IDI4LjAwMDEgMC4xODM4MzhDNDMuMzMwMSAwLjE4MzgzOCA1NS43NjM4IDEyLjYwODggNTUuNzYzOCAyNy45Mzg4WiIgZmlsbD0iYmxhY2siLz4KICAgICAgICA8cGF0aCBkPSJNMzguODY3NiAzNC4zMzVIMzIuOTUyNkwzMS44NDE0IDMxLjYyMjVIMjQuMzMzOUwyMy4yMjI2IDM0LjMzNUgxNy4zMDc2TDI0LjM4NjQgMTguMjA4N0gzMS43ODAxTDM4Ljg2NzYgMzQuMzM1Wk0yOC4wOTY0IDIyLjRMMjYuMTM2NCAyNy4yMTI1SDMwLjA0NzZMMjguMDk2NCAyMi40WiIgZmlsbD0id2hpdGUiLz4KICAgICAgICA8cGF0aCBkPSJNMjguMDg3NiAxNC43ODc2QzMwLjM1NDEgMTQuNzg3NiAzMi4xOTE0IDEyLjk1MDMgMzIuMTkxNCAxMC42ODM4QzMyLjE5MTQgOC40MTczOSAzMC4zNTQxIDYuNTgwMDggMjguMDg3NiA2LjU4MDA4QzI1LjgyMTIgNi41ODAwOCAyMy45ODM5IDguNDE3MzkgMjMuOTgzOSAxMC42ODM4QzIzLjk4MzkgMTIuOTUwMyAyNS44MjEyIDE0Ljc4NzYgMjguMDg3NiAxNC43ODc2WiIgZmlsbD0id2hpdGUiLz4KICAgICAgICA8cGF0aCBkPSJNMjguMDg3NiA0OS4zNTAxQzMwLjM1NDEgNDkuMzUwMSAzMi4xOTE0IDQ3LjUxMjggMzIuMTkxNCA0NS4yNDYzQzMyLjE5MTQgNDIuOTc5OSAzMC4zNTQxIDQxLjE0MjYgMjguMDg3NiA0MS4xNDI2QzI1LjgyMTIgNDEuMTQyNiAyMy45ODM5IDQyLjk3OTkgMjMuOTgzOSA0NS4yNDYzQzIzLjk4MzkgNDcuNTEyOCAyNS44MjEyIDQ5LjM1MDEgMjguMDg3NiA0OS4zNTAxWiIgZmlsbD0id2hpdGUiLz4KICAgICAgICA8cGF0aCBkPSJNMTIuOTMyNCAyMy4wMDM5QzE1LjE5ODggMjMuMDAzOSAxNy4wMzYxIDIxLjE2NjYgMTcuMDM2MSAxOC45MDAxQzE3LjAzNjEgMTYuNjMzNyAxNS4xOTg4IDE0Ljc5NjQgMTIuOTMyNCAxNC43OTY0QzEwLjY2NTkgMTQuNzk2NCA4LjgyODYxIDE2LjYzMzcgOC44Mjg2MSAxOC45MDAxQzguODI4NjEgMjEuMTY2NiAxMC42NjU5IDIzLjAwMzkgMTIuOTMyNCAyMy4wMDM5WiIgZmlsbD0id2hpdGUiLz4KICAgICAgICA8cGF0aCBkPSJNNDMuMjUxMiAyMy4wMDM5QzQ1LjUxNzYgMjMuMDAzOSA0Ny4zNTUgMjEuMTY2NiA0Ny4zNTUgMTguOTAwMUM0Ny4zNTUgMTYuNjMzNyA0NS41MTc2IDE0Ljc5NjQgNDMuMjUxMiAxNC43OTY0QzQwLjk4NDggMTQuNzk2NCAzOS4xNDc1IDE2LjYzMzcgMzkuMTQ3NSAxOC45MDAxQzM5LjE0NzUgMjEuMTY2NiA0MC45ODQ4IDIzLjAwMzkgNDMuMjUxMiAyMy4wMDM5WiIgZmlsbD0id2hpdGUiLz4KICAgICAgICA8cGF0aCBkPSJNMTIuOTMyNCA0MS4yNzM5QzE1LjE5ODggNDEuMjczOSAxNy4wMzYxIDM5LjQzNjYgMTcuMDM2MSAzNy4xNzAyQzE3LjAzNjEgMzQuOTAzNyAxNS4xOTg4IDMzLjA2NjQgMTIuOTMyNCAzMy4wNjY0QzEwLjY2NTkgMzMuMDY2NCA4LjgyODYxIDM0LjkwMzcgOC44Mjg2MSAzNy4xNzAyQzguODI4NjEgMzkuNDM2NiAxMC42NjU5IDQxLjI3MzkgMTIuOTMyNCA0MS4yNzM5WiIgZmlsbD0id2hpdGUiLz4KICAgICAgICA8cGF0aCBkPSJNNDMuMjUxMiA0MS4yNzM5QzQ1LjUxNzYgNDEuMjczOSA0Ny4zNTUgMzkuNDM2NiA0Ny4zNTUgMzcuMTcwMkM0Ny4zNTUgMzQuOTAzNyA0NS41MTc2IDMzLjA2NjQgNDMuMjUxMiAzMy4wNjY0QzQwLjk4NDggMzMuMDY2NCAzOS4xNDc1IDM0LjkwMzcgMzkuMTQ3NSAzNy4xNzAyQzM5LjE0NzUgMzkuNDM2NiA0MC45ODQ4IDQxLjI3MzkgNDMuMjUxMiA0MS4yNzM5WiIgZmlsbD0id2hpdGUiLz4KICAgIDwvZz4KICAgIDxkZWZzPgogICAgICAgIDxjbGlwUGF0aCBpZD0iY2xpcDBfMzA2MF8xNTI2Ij4KICAgICAgICAgICAgPHJlY3Qgd2lkdGg9IjU2IiBoZWlnaHQ9IjU2IiBmaWxsPSJ3aGl0ZSIvPgogICAgICAgIDwvY2xpcFBhdGg+CiAgICA8L2RlZnM+Cjwvc3ZnPgo='; diff --git a/packages/core/src/config/logos/generated/assethubPaseoChain.ts b/packages/core/src/config/logos/generated/assethubPaseoChain.ts index c5c2c57..8695a40 100644 --- a/packages/core/src/config/logos/generated/assethubPaseoChain.ts +++ b/packages/core/src/config/logos/generated/assethubPaseoChain.ts @@ -3,4 +3,5 @@ // Do not edit. Auto-generated via node scripts/convertLogos.mjs -export const assethubPaseoChain = 'data:image/webp;base64,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'; +export const assethubPaseoChain = + 'data:image/webp;base64,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'; diff --git a/packages/core/src/config/logos/generated/assethubWestendChain.ts b/packages/core/src/config/logos/generated/assethubWestendChain.ts index c96e15e..2ce2d5f 100644 --- a/packages/core/src/config/logos/generated/assethubWestendChain.ts +++ b/packages/core/src/config/logos/generated/assethubWestendChain.ts @@ -3,4 +3,5 @@ // Do not edit. Auto-generated via node scripts/convertLogos.mjs -export const assethubWestendChain = 'data:image/webp;base64,UklGRvoWAABXRUJQVlA4WAoAAAAQAAAA+QAA+QAAQUxQSAoIAAABHAVt20gOf9rbPQwiYgKQsQqN3xzCqm0rbPQkIAEJkYCESsBB4yBx0DrIOOg4QEIkPAk4uPejbQI8SH8jYgJo1da2t40oDIRAGCiFUAYzDBoGhRAohVAIgVAG+1zInR+90qvbiJgAGesfb1++fvv+8ePH5+dnv1XdU9oeSwyTk5/07eu3j5+/+k/xzs85vZbb9EP8+dfHz/5HgEc+5/SI0+Vz4fHjV/+nAgkWzekerltYEhtEguVzuk/Xy4VHZoMOYGXdwpVyYctsVfVI6hYuUnhkdli36fK4JbNlFRohqdFfmZDYNjr5Fi6Ku+9smCqdf48XxC2ZjYtGanTXwi2ZLXtBU3Xx18EtmRZHACRB6uKvgVsy21aJBoIkwHddLoBbMm3OIHhU4+huSpvo/ACII6SGkU2JBpXS6cGimx+Ve9CkoKk4w7yOKSjbl0PNKal+PO5Bm7+51nU0QWlVxqAY1Y/EPWhTR13wOo5JaVMpzQTqUP0g7rQLXXSOI3CJJhWi6370b1Ja1ki0QvWdu2faRddGDV170KpCU9EMufbLJZrWTLDttVdeadMLTQTY/st1ySvNihkE0BzVd2jKtKqbVd+dmGmUCgN45XRU35lIq0ppIl5MzFNX7rSN82kuwDx1ZKFRB6GTq2IISDJP3VhomTRQlSEgyDx1ItKww+mpQhMB8o156kKkXd0uwO956sBEs4oBXhhDAvhA9eZ8tpMZvzUDPK7emFcOh9JMEMe4O1NOaWuqRoLg+WQq0agEQwz5iDN8GFpo17FbAQgWnM3caVWkKbrWYGSiZbpXlMvehFcrHLpVgBV3E4k2Fe6m8sPAQquKVhmbCzRKwSqyb8yrEaJbFeoxNbbR8M10Cq5NRdqlWyWCqMbQkFcropsJm1TXzkYz5E5QaIKPZiJNyrH7bYShEa82jnSn0Hn3RjZaROlW6dxzExMtUulmcq7sW1ALqtwL6eSvBiLbR3SzdP5QzauBJO5FlbOlag82rqLbVen8sZKnSXEfRBqprs5mQNJAJRP+oQFcq3iapBGkoV6MzK7GZmOkSCPR4LWC5yhpsCZnV24bg14aM3wt5jlEcRjLrOxKbWMYbhzXQp6DNGx8LrSNIkPoGm9ldBSailxAKhI5DEN0NI+hxD4CkWbqMp8FAoegxlxodue2/qkOM7kQzqdc7l8arCtNpyK7r7G63HAm9W+ucjXPE569V6ZccT4RO6e5kKthOJY6t87nIc+rqnA9+VDsGiVDLjscSV0rTYWLeh5w7LaojOmy9cCtX6XRyjXRf9s6hkG68Pmb1jNGZc6lpy8TG2RIGiuXlr/EFsrpvIgZdHRdDJ9eDeB8r2mk31z5/EmrKZ0dGdXlpw8T66rEybTe/OFWB2moshn6t0cdFkxYb3xLNUBC51e283zLxUCremk5u4hMrAgSBqRou1lEbhXw1pANe5GlAklwqgXdRF5lQIIk2lNpx7PIXuYzaFBHG/oTyUVAEgStasW7OJYBAfC3UQll3kGDXm3Z3UoB/Hn9cg4kANq1p9vjHEnQgoM2HV8nQIAAgdZUDha1phMkAYLtCy37uZ8BQdhIMYHb+tMzJECLmqvb/udpGKnM0I2nEhyn7l2P4Y0GpUyo7AAfYGKqrIEgQYMqMWCTIGFBpf0DNKHdAyBoULI8kCRg4KjVgyAA2rQ8kqBJrR8gCVioLI8EwfaltHklCcBCh90rCdCijpYH8EdPClr1zKQHuKXWRHqEzxdNegTr1hzlGcSluQcZYmMqT2EKTdGTdL4hlQeRRRp67TEkEW1H6UH+i7ya0cNcRR7NlDyJm0hsQtLDnESmJh6piLh6ygPZRUT2Wnrpafy/bbXKoTyL+e1eTY80vE3VyhORj7lenkf6lCopM1DZyvPTvVJppLTZ8ClUmymt1n2SXAogmBlabpKvr1Lk20xtd/12LwQSNCrbCd98V1RpuSoH9yKgWe13O7KUgwXs53YkFCEJ/qruiOg5vLUvVvQvh5dzhIk1x2OhgFFWlOVk6kTJfrYzyzd8gJ02FM64bx9Bu9qvyun0DaBhbfh5LryBJE3t2J+T/Ak0rCwoScGFBI0t+VbCZQIkYciKVIpuJMCfN5YJIEj8OOrLSCJBw3a0SeEA0LB27EtJ4s+zSfFgSEv25STZ2fImFcOv42tI+m02qRp+GvV1JBmwp1Uq+4aktGiV6mtL2471XP5VVBqcm1m3b0HSb/KUJqcWsC31bchaiV7aVZRGndYJlVa9SbOhDu1bfTvyqKHsK0rDbi+njW/S9JRLqdiW+rZkLkPHdU3S+qtIZF+rNO/0nGjhSQxO56qNqbcg8zlVtjWJzccxKa17Fqv7Ee38KWa9fsPKdjHs85ewMPWWJHzQztWL7XhYep7E+nupZF03sf/+YuFRevi+s1X6+LGxVXr5sa9V+vl9W6v09H1Xq/T1fVNRevu+phylv38vKU/S4y+/NqRe+vz2uZ/dS6/ffm5nc9Lx77uZpe/vi8lBej/pVdm99N+/rslTxrhekBxklF6vRvIy0PVS5FnGGvQ6JC/DXS9CnmXEXq/Av5dBRx2dBhm3/xtaXmXs/m9cTyfDDzqm5OUSRh1PCnIZo44lBbmUMY0jBbmc4W8IefVySf2f9m5fnVzXmDqW/4NcXL9qn9Ls5AqHP+1NWr1c5/DUfqTVy9We5tSBvM1OLnp4JkM5zUEufpj/9/b2bZ7kR3Rhfqbchv4/4+Tk95zCvP6lXQtk3f+3Nd68DBVWUDggyg4AAPBLAJ0BKvoA+gA+kUKZSKe/oqEuE7mb8BIJYm7gwAOFQIe4BiAG8K4BY0SuWPfpezpEt3T8lv7x1knMPh3qsrA9BbyX9h/4v909rH+e/0Hst/Tv/R9wb9QPOg/qvsj8wX7GfsV7yf+l9XP9z9QD+k/6X/2dhF6Av7i+rn/yv3U+DD9zP3J///vX//j2AP//6gHUP9i/1C/S/xC8y4Jv8dRJjlnzPgRpMprXkhfGHdYT5cCcPZZw7IHvJRkk0LwYkv4MgxUbs8Yy3NhzgotLjJTeNaGuh2lSk7802zAIBdySYzZfpwaHWBgJESHlTBfAzGez69aWw9TIuW6PZKmHgRjKh85pOFy8XAWMXJ6r3mEKqT6jvqFa8HxsP57VpQ/L2RXghIo9VoSZGkMaEpDozo0ydnHmuAuhwOJZsEcZIuYi2uc3AU+lbW1SXwK/dTOr/penfqJANRDEfQYomgKlUzhRgaHHLsYHoSnhKdHKRCS7/33IyguYPVyRllWiKabTON6vKsT05FsWWqc9wWFZdJOqmTVT9zEGg4iGC6NTj3eAZ/BI7Y57oyG6EjTLIAB9kkN9kBqFo9A/L2uwOjogM1p/+BBTUxmVAOUxMF0V1iU6CG1/nU0KW7beAjnIzNp0Dw71OVBhHqwokoukmWbAKcFAxWOzwr22xCRFgKVwqEOGU9gX/bEYt33UOPtOYiL6mnpBrQYrDmK3Gynri88pvR4AhqXM0sGKiEF/5hJANT3Ar8tq4zLlRANqRsYOgf1WtwVW6xlhoiyS9hUW4DOLR9sLxcBBiHjEBT9/S6XJyhYOUjW2lHRpBMAA/s1wAA+fkUhWcdTytsyEnICbh0MbGKd7VhOBHSTKfgqJbv5Hz5i0+7uT04CBUGU58eJnxO5STAtdXUxUhN6f+sBBfvyyEJ97pgcGnTU7A7SWXC9/NkR0RVAe+cBWQYDhhaA69M7fSWpaJZrMdOHoMaXbrWfWYYv+yLf/8cV0gdu36Pbp+cXVLCZQGwxtrz5Qf/3TpRuR26QTNQ4yEQqSNOohXocx5PQ3AVaBgAACq8bayzEK8Sdic8pzBJeKZIBcWo7S3dSKQzuF9Ma+tEofXTWCAFvBec1hDMYDLAMryPrhsEYVVJPsldM2pOFbAv699vp6xANlcvXRhhGJkdftOljR/OHFwT371lGsYEsvpdaRwP4h5t+nVmT7V7OtOQqLEEZalRdyIYpZi0eyL5RB9ZwpVBq98tnKusyCsHp9RWoABI+mCvEPruk+6PSBYHWLT2RwRIBRdEjjXLzANa3m4x+zgAjVcRX2777fIzm6pGb+otHN1zLFd/EUL9A8N37f7vdj0X7DKTV1MQKXeRkZgAGEKYJGoC45t2Faaxli73LafhFTbMC6udvUMoj9MVTF1/mh/F8wqhpCtJqJ5GNuWJI6Zv69u+HZS0fejmNK0mUjBBJ3JT9VoFwPZdDs9V9WM42ALv51Hz2r78Fk6HN5gSmsZ6pXbtG1ik3bhH/dXXRq+64PUOHBay6feMYJYNzVPV7fhPx0zHtfosNfz9iCOgN0rBhbsJgANVNYZs7Rsv08DgNdXws9ahOK/Mif6g+e7XbpX+mwtD85NOV5E1FdEYrSqjIJ44BF+PmstXf5v7g6nr32Q7rTDa8T0IDPsmHQqhgL6O+jNkQLeTm4YMVPekCtDSfKg9IFgc8dbnXXpPv/q/7KM6DsfO6PQ7QXoZuecVI4c5EXCc/rzJw/MkZpZW6JX66nu3c6ths9qncmJ6qzTYqXhvqzzUlzvGU518CEBtcnpn0MTwsbsNiCGL8RBMJSxLxbXhMpa3/wzNzPPKQQ/koS5cneVM3AyNUTEsKDgr94FXtp5rsw9Uea5ro0zuBMDsPFGj7B/l9OJsGx5LLTylFXdwgfw+xUqN/M23ZTXYPYbB8x+P1V5RdFIq4JC4IRlbl/2YVtqrMwbcfqkX3oswQA8EUydi9yiUZIL4AeCmlxtKVRsvYgSlGd+5eUWEorGJvJKRgwtAGO4TFl/jzRAG8mF/O5/VsBP0rWCCp/zmIMqWOM6EC7WulqPS4XDzvwEiWX45XOV5Le5D+pxNuJJVBPghNPXNHgU/bqrOOhgaL7jPRIeuSrn5XuOcpCXfsDy7zn1bt2yorXZIWjah+wHAm0RDtF4yNiOk/sECgykjj9QoJYOtwMT0ujEqav3OmtVpa/ZmaURefYPS6QObSl+2MXKCX2gXbdpCx5PYfgrAjYiUsMnZ9aGHQ7asxKz9pAkov1nD8Rc/eZz1Rl5e8HcTo4IiH3d236zkfEguDhb/exL6tiJdtVyQqoamrejp2qxQhsBpxv8CGvUCZwe1TFRbHIM9WJ+E3Az+32xUGUPwNJo23cpRNVAnII5yuY+sEaF2jTLt3yj8mUvIxVkLj9hWtXvdbtT+Er2sHoPpapHJ7roZEbmV61xoq6vVxQp89JQlLvirVdyWwv7nc5te6N/02L1XH6+gC2/Xm1d7JBBSUGmrDuLVtW94+grUm1p+A8JH+nczQUqx3QYgxOiRyDDzuHzhrUhgHCPYbgCQGuowFRxUnT+mPCRSw7sASSyHLfPxcKGkHpacFx3bqWqBsEIWxexeP57i7UFQhnhBgl38N84nDE1089kyH91pO3Ik/Zsvr10coFDHg9tobQlJ7a9gqwFawlojuJaKiJ6ibe5/3XXYSyPXoVVGYaALPH5RPQQA7S2CgNv5fJdjBN6XxV2AsJAZMSEhCg5iT2ik4NJNVIVAfFlskDqautb/8IgQscH2/YpWhTTdeiEIOEeqnYuDtC7+dZHdRsZW9JrOAhead3wPNnSFdfmke1z4NgoRF5uFIcKqkNPJCbAwrN3i43u7g8rridSEIYI7GBJ/47Kpg/YmIfOafWd4R7nY9tq5SqLfZfde3BO9pXhOSKr2SN3a3OYrsoekM0AVF/g6s/8lkvMWQE+AO1AcqEqCElFPuy9OF9hqYOvIUXgcJw7XAE0XS++FtoLw1czXR2320ety2xd23I2+k9lNr7rZXTNVPF/rKzKIN9ad5gLgRvdvJfPDUdEvBSKGFTBiEqyoi/2fCP9d5glNGnZshVXDENHKvdDnrEOcpLVS84jVgAquh7xGIovX7ZugNxULK1c3duWSQ0BzcvE8hm205eF+VjZiSHRmYjRQyha9GmzXNFM19RpLZO21jmjM9wsoD+XIURX0TycaVtTl3fR90p8rK2dv1ZUu0j4H6E4ywF/4x/Hiq9e5e5kT/YYz2XO5qfrjWw9JySFT+L1SuvzXm4bRBk5xxzoQk5XO5rWnRXQpS8G0vQhKDFC2OvaIU6oLP5RynbOKAaWraCCfUu9FImFcBeiyD53a5oLUI6470p0g6EhWmikEPl+ObxXJ92Bwca8RNSyGEJivxKPEqRZC6Eddtk+6Ja/e9Lw5rPZ4U1JEibD8sR6A2rCUBElsUALhQOWmwhGNBB1e5c2kN7AcvXIxmjydXdyr51NpCE5MKxrCYkq2J5garQlj5HkrtOpyP7MizqN5qe0nQ1Vmchaqd+EVpmQXuwNWlgXmPdDv85d6wKydnqEs7cEn+RD0A3+gZ54SMNQUnFRJI6UwmEHB+hXrORdv1VCBJ3xinwgUgxkla7AVf/bMhTE5C1suuyijEWS0mGwbj9ah5dJS4IUpcRzAvvnLV2HVZCPLdpZswLpuQikyvWE5OkEW3ixu93m9UNZ1CZ1TOyLx/yLRV16PrjL4agoJvclOvBaOKvhgm010CfRup7SQRRUycUo/i16Fb5IQmvb6cMA5LtspeRNKX6etHONuNS1gpKSj1uPRiPR3inV3G2E6qwEI3D5NYhhczZReIx2WgiHN+ee8lna9DArhiOfbDi+l+hXUmnbK7Q07rPYGLQ+Tr4BsfLn8QqdeAsgU1ejj5/HeTeY+gk6sHCD7uNGX021aLddeVkfsBWbJtp/Jmwp/tPV//+6PvhRz+gb52GKcj9USQu1GccoaAO+OeZNWK+wcXi5d8WKl6C+kdKMxQ72279Y3FhRVkv8ALb8+suf+ec65cKzyClGIwS2tnXjtw3V4fN/1fYcTUTFduVwridAYcH6d/FFJJT393OcKGLftfX+hFiiT3CADuKpy8NVtf7xqqv+v7tRYRVtLeq57DK0Bgot8t5tZ4NdscyTuWOaR8LI7ezCWmMSDGZC8rOqY8SZI7OB4F7gf+y/NWo5Df4jSZzrJ4nphpJ3x982yD7mZRwxNmRhQprIpyfk+CUcywftL1v5lT2GcGuUEJIsZbhUbgND/r4qXnHT77oTRER9gqXFXKXc1rcyK9iBHDzFhc+eziscd3MZW1/zVmJY9eNB8YfQzg9l0eG1+VZdgAVTFK4FNWlNMYtrd5P3kja0+AqGNTW3eB973jyQPR/9KsJPIiDggxfIJXXn/+phs6dPsKG1wtsHSwcqB7eRCHHq41YQcUgkapTOYG9k27BgncrZNYTfIc0dxUt9P7vElcLWYcmurTlwn+kG0Ctl4OXdXFsxCRyto/OVHycJaSnNCzb+mT3g1/KZo13qjdS6H1wkiIbdCQyt2ENq+1tQTBT+YxcWJhKyAJuetDcuM9r9Buyu4I2S/4ldZqyjnDywynvkE5ytzxysq5vLxfTo6P7zN4mCYyejB4WdLZFsIX7Jm6B5RJReDCWFB5lUb+IDqZAoU26HW/dG1nYAMrpmvxX8zzVO0uuxfreHh4Sn/98GAUjlzsECTfIoUwFI/RhhnJoyYENBieWCujuMpd1oG1Lpvem6kpC13pCqU8Cyy1S4wFwZVmXvjvTVXu+YAAAABBzZtsiMyyhWmHnZs+xo454CO9v9kldyX+Df9c2rkBEwXw6a20unWYFEKaQclM5X9Bo14o5iX1Nlsvpq/NH7oF6XcYBpMQtqP/6MAEUhZDwbfU6spkTINVpHAkvcHbbwAAAAAA/lfQTpYFmyRtQW4yUCmmU3ITSxzchqMcp8zi602kUL9BWegTxompHZa4g6MspP+fcgDTfKINXe12iTOV3/vjx1JDCc1nY1FUlmdpFs9RYVzk8JxJY4Ul0EAAAAAAAAA=='; +export const assethubWestendChain = + 'data:image/webp;base64,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'; diff --git a/packages/core/src/config/logos/generated/bridgehubChain.ts b/packages/core/src/config/logos/generated/bridgehubChain.ts index 0c2f961..639be58 100644 --- a/packages/core/src/config/logos/generated/bridgehubChain.ts +++ b/packages/core/src/config/logos/generated/bridgehubChain.ts @@ -3,4 +3,5 @@ // Do not edit. Auto-generated via node scripts/convertLogos.mjs -export const bridgehubChain = 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDI2LjQuMSwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IgogICAgIHZpZXdCb3g9IjAgMCA2NDAgNjQwIiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCA2NDAgNjQwOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Cgkuc3Qwe2ZpbGw6IzMyMUQ0Nzt9Cgkuc3Qxe2ZpbGw6I0U0MEI3Qjt9Cgkuc3Qye2ZpbGw6I0ZGRkZGRjt9Cjwvc3R5bGU+CiAgICA8Zz4KCTxwYXRoIGNsYXNzPSJzdDAiIGQ9Ik02NDAsMzIwLjNjMCwxNzYuOS0xNDMuNCwzMjAuMy0zMjAuMywzMjAuM1MtMC41LDQ5Ny4xLTAuNSwzMjAuM1MxNDIuOSwwLDMxOS44LDBTNjQwLDE0My40LDY0MCwzMjAuM3oiLz4KICAgICAgICA8Y2lyY2xlIGNsYXNzPSJzdDEiIGN4PSIzMjAuOCIgY3k9IjEyMS4xIiByPSI0Ny40Ii8+CiAgICAgICAgPGNpcmNsZSBjbGFzcz0ic3QxIiBjeD0iMzIwLjgiIGN5PSI1MTkuOSIgcj0iNDcuNCIvPgogICAgICAgIDxjaXJjbGUgY2xhc3M9InN0MSIgY3g9IjE0NiIgY3k9IjIxNS45IiByPSI0Ny40Ii8+CiAgICAgICAgPGNpcmNsZSBjbGFzcz0ic3QxIiBjeD0iNDk1LjciIGN5PSIyMTUuOSIgcj0iNDcuNCIvPgogICAgICAgIDxjaXJjbGUgY2xhc3M9InN0MSIgY3g9IjE0NiIgY3k9IjQyNi43IiByPSI0Ny40Ii8+CiAgICAgICAgPGNpcmNsZSBjbGFzcz0ic3QxIiBjeD0iNDk1LjciIGN5PSI0MjYuNyIgcj0iNDcuNCIvPgogICAgICAgIDxwYXRoIGNsYXNzPSJzdDIiIGQ9Ik00MjUuMiwzMzUuN2MtNS03LjUtMTIuNS0xMy4zLTIyLjQtMTcuNmMtMy4yLTEuNC02LjctMi41LTEwLjQtMy41YzAuOC0wLjQsMS41LTAuOCwyLjMtMS4yCgkJYzguOC01LjEsMTUuMi0xMS40LDE5LjEtMTguOWMzLjktNy41LDUuOS0xNS44LDUuOS0yNC45YzAtMTAtMi4zLTE4LjYtNi45LTI1LjhjLTQuNi03LjMtMTEuMy0xMi44LTE5LjktMTYuNwoJCWMtOC43LTMuOS0xOS01LjgtMzEtNS44aC0xNDhsMTQuOCw5Ni40bC0xNC44LDEwMS43aDE1My41YzE0LjIsMCwyNi4xLTIuNCwzNi03LjNjOS44LTQuOCwxNy4yLTExLjYsMjIuMS0yMC4xCgkJYzQuOS04LjYsNy40LTE4LjQsNy40LTI5LjRDNDMyLjcsMzUyLjEsNDMwLjIsMzQzLjIsNDI1LjIsMzM1Ljd6IE0zNjYsMzExTDM2NiwzMTFDMzY2LDMxMSwzNjYsMzExLDM2NiwzMTFMMzY2LDMxMXogTTM0My45LDI2OC4xCgkJYzIuNCwxLjIsNC4zLDIuOSw1LjUsNWMxLjMsMi4xLDEuOSw0LjUsMS45LDcuM2MwLDIuOS0wLjcsNS41LTIuMSw3LjhjLTEuNCwyLjMtMy4zLDQuMS01LjcsNS40Yy0yLjQsMS4zLTUuMSwxLjktOC4yLDEuOWgtNDYuMwoJCWwtNC43LTI5LjFoNTEuMUMzMzguNiwyNjYuMywzNDEuNSwyNjYuOSwzNDMuOSwyNjguMXogTTM1OS40LDM2OS41Yy0zLjMsMy4xLTcuOCw0LjYtMTMuNiw0LjZoLTYxLjhsNS4yLTM0LjNoNTYKCQljNiwwLDEwLjcsMS42LDE0LDQuOGMzLjQsMy4yLDUsNy4xLDUsMTIuM0MzNjQuNCwzNjIuMiwzNjIuNywzNjYuNCwzNTkuNCwzNjkuNXoiLz4KPC9nPgo8L3N2Zz4K'; +export const bridgehubChain = + 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDI2LjQuMSwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IgogICAgIHZpZXdCb3g9IjAgMCA2NDAgNjQwIiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCA2NDAgNjQwOyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Cgkuc3Qwe2ZpbGw6IzMyMUQ0Nzt9Cgkuc3Qxe2ZpbGw6I0U0MEI3Qjt9Cgkuc3Qye2ZpbGw6I0ZGRkZGRjt9Cjwvc3R5bGU+CiAgICA8Zz4KCTxwYXRoIGNsYXNzPSJzdDAiIGQ9Ik02NDAsMzIwLjNjMCwxNzYuOS0xNDMuNCwzMjAuMy0zMjAuMywzMjAuM1MtMC41LDQ5Ny4xLTAuNSwzMjAuM1MxNDIuOSwwLDMxOS44LDBTNjQwLDE0My40LDY0MCwzMjAuM3oiLz4KICAgICAgICA8Y2lyY2xlIGNsYXNzPSJzdDEiIGN4PSIzMjAuOCIgY3k9IjEyMS4xIiByPSI0Ny40Ii8+CiAgICAgICAgPGNpcmNsZSBjbGFzcz0ic3QxIiBjeD0iMzIwLjgiIGN5PSI1MTkuOSIgcj0iNDcuNCIvPgogICAgICAgIDxjaXJjbGUgY2xhc3M9InN0MSIgY3g9IjE0NiIgY3k9IjIxNS45IiByPSI0Ny40Ii8+CiAgICAgICAgPGNpcmNsZSBjbGFzcz0ic3QxIiBjeD0iNDk1LjciIGN5PSIyMTUuOSIgcj0iNDcuNCIvPgogICAgICAgIDxjaXJjbGUgY2xhc3M9InN0MSIgY3g9IjE0NiIgY3k9IjQyNi43IiByPSI0Ny40Ii8+CiAgICAgICAgPGNpcmNsZSBjbGFzcz0ic3QxIiBjeD0iNDk1LjciIGN5PSI0MjYuNyIgcj0iNDcuNCIvPgogICAgICAgIDxwYXRoIGNsYXNzPSJzdDIiIGQ9Ik00MjUuMiwzMzUuN2MtNS03LjUtMTIuNS0xMy4zLTIyLjQtMTcuNmMtMy4yLTEuNC02LjctMi41LTEwLjQtMy41YzAuOC0wLjQsMS41LTAuOCwyLjMtMS4yCgkJYzguOC01LjEsMTUuMi0xMS40LDE5LjEtMTguOWMzLjktNy41LDUuOS0xNS44LDUuOS0yNC45YzAtMTAtMi4zLTE4LjYtNi45LTI1LjhjLTQuNi03LjMtMTEuMy0xMi44LTE5LjktMTYuNwoJCWMtOC43LTMuOS0xOS01LjgtMzEtNS44aC0xNDhsMTQuOCw5Ni40bC0xNC44LDEwMS43aDE1My41YzE0LjIsMCwyNi4xLTIuNCwzNi03LjNjOS44LTQuOCwxNy4yLTExLjYsMjIuMS0yMC4xCgkJYzQuOS04LjYsNy40LTE4LjQsNy40LTI5LjRDNDMyLjcsMzUyLjEsNDMwLjIsMzQzLjIsNDI1LjIsMzM1Ljd6IE0zNjYsMzExTDM2NiwzMTFDMzY2LDMxMSwzNjYsMzExLDM2NiwzMTFMMzY2LDMxMXogTTM0My45LDI2OC4xCgkJYzIuNCwxLjIsNC4zLDIuOSw1LjUsNWMxLjMsMi4xLDEuOSw0LjUsMS45LDcuM2MwLDIuOS0wLjcsNS41LTIuMSw3LjhjLTEuNCwyLjMtMy4zLDQuMS01LjcsNS40Yy0yLjQsMS4zLTUuMSwxLjktOC4yLDEuOWgtNDYuMwoJCWwtNC43LTI5LjFoNTEuMUMzMzguNiwyNjYuMywzNDEuNSwyNjYuOSwzNDMuOSwyNjguMXogTTM1OS40LDM2OS41Yy0zLjMsMy4xLTcuOCw0LjYtMTMuNiw0LjZoLTYxLjhsNS4yLTM0LjNoNTYKCQljNiwwLDEwLjcsMS42LDE0LDQuOGMzLjQsMy4yLDUsNy4xLDUsMTIuM0MzNjQuNCwzNjIuMiwzNjIuNywzNjYuNCwzNTkuNCwzNjkuNXoiLz4KPC9nPgo8L3N2Zz4K'; diff --git a/packages/core/src/config/logos/generated/collectivesChain.ts b/packages/core/src/config/logos/generated/collectivesChain.ts index 4de4ed2..d33595e 100644 --- a/packages/core/src/config/logos/generated/collectivesChain.ts +++ b/packages/core/src/config/logos/generated/collectivesChain.ts @@ -3,4 +3,5 @@ // Do not edit. Auto-generated via node scripts/convertLogos.mjs -export const collectivesChain = 'data:image/svg+xml;base64,PHN2ZyBhcmlhLWhpZGRlbj0idHJ1ZSIgZm9jdXNhYmxlPSJmYWxzZSIgZGF0YS1wcmVmaXg9ImZhcyIgZGF0YS1pY29uPSJwZW9wbGUtZ3JvdXAiCiAgICAgY2xhc3M9InN2Zy1pbmxpbmUtLWZhIGZhLXBlb3BsZS1ncm91cCBmYS0xeCBzYy1iZGZDRFUgaGJod1JtIHNjLW5GcklWIGN5UWJFRyAgdWktLUNoYWluSW1nICBpc0lubGluZSB1aS0tSWNvbiBub3JtYWxDb2xvciIgcm9sZT0iaW1nIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2NDAgNTEyIgogICAgIGRhdGEtdGVzdGlkPSJwZW9wbGUtZ3JvdXAiIHRhYmluZGV4PSItMSI+CiAgICA8cGF0aCBmaWxsPSJjdXJyZW50Q29sb3IiCiAgICAgICAgICBkPSJNNzIgODhhNTYgNTYgMCAxIDEgMTEyIDBBNTYgNTYgMCAxIDEgNzIgODh6TTY0IDI0NS43QzU0IDI1Ni45IDQ4IDI3MS44IDQ4IDI4OHM2IDMxLjEgMTYgNDIuM1YyNDUuN3ptMTQ0LjQtNDkuM0MxNzguNyAyMjIuNyAxNjAgMjYxLjIgMTYwIDMwNGMwIDM0LjMgMTIgNjUuOCAzMiA5MC41VjQxNmMwIDE3LjctMTQuMyAzMi0zMiAzMkg5NmMtMTcuNyAwLTMyLTE0LjMtMzItMzJWMzg5LjJDMjYuMiAzNzEuMiAwIDMzMi43IDAgMjg4YzAtNjEuOSA1MC4xLTExMiAxMTItMTEyaDMyYzI0IDAgNDYuMiA3LjUgNjQuNCAyMC4zek00NDggNDE2VjM5NC41YzIwLTI0LjcgMzItNTYuMiAzMi05MC41YzAtNDIuOC0xOC43LTgxLjMtNDguNC0xMDcuN0M0NDkuOCAxODMuNSA0NzIgMTc2IDQ5NiAxNzZoMzJjNjEuOSAwIDExMiA1MC4xIDExMiAxMTJjMCA0NC43LTI2LjIgODMuMi02NCAxMDEuMlY0MTZjMCAxNy43LTE0LjMgMzItMzIgMzJINDgwYy0xNy43IDAtMzItMTQuMy0zMi0zMnptOC0zMjhhNTYgNTYgMCAxIDEgMTEyIDBBNTYgNTYgMCAxIDEgNDU2IDg4ek01NzYgMjQ1Ljd2ODQuN2MxMC0xMS4zIDE2LTI2LjEgMTYtNDIuM3MtNi0zMS4xLTE2LTQyLjN6TTMyMCAzMmE2NCA2NCAwIDEgMSAwIDEyOCA2NCA2NCAwIDEgMSAwLTEyOHpNMjQwIDMwNGMwIDE2LjIgNiAzMSAxNiA0Mi4zVjI2MS43Yy0xMCAxMS4zLTE2IDI2LjEtMTYgNDIuM3ptMTQ0LTQyLjN2ODQuN2MxMC0xMS4zIDE2LTI2LjEgMTYtNDIuM3MtNi0zMS4xLTE2LTQyLjN6TTQ0OCAzMDRjMCA0NC43LTI2LjIgODMuMi02NCAxMDEuMlY0NDhjMCAxNy43LTE0LjMgMzItMzIgMzJIMjg4Yy0xNy43IDAtMzItMTQuMy0zMi0zMlY0MDUuMmMtMzcuOC0xOC02NC01Ni41LTY0LTEwMS4yYzAtNjEuOSA1MC4xLTExMiAxMTItMTEyaDMyYzYxLjkgMCAxMTIgNTAuMSAxMTIgMTEyeiI+CiAgICA8L3BhdGg+Cjwvc3ZnPgo='; +export const collectivesChain = + 'data:image/svg+xml;base64,PHN2ZyBhcmlhLWhpZGRlbj0idHJ1ZSIgZm9jdXNhYmxlPSJmYWxzZSIgZGF0YS1wcmVmaXg9ImZhcyIgZGF0YS1pY29uPSJwZW9wbGUtZ3JvdXAiCiAgICAgY2xhc3M9InN2Zy1pbmxpbmUtLWZhIGZhLXBlb3BsZS1ncm91cCBmYS0xeCBzYy1iZGZDRFUgaGJod1JtIHNjLW5GcklWIGN5UWJFRyAgdWktLUNoYWluSW1nICBpc0lubGluZSB1aS0tSWNvbiBub3JtYWxDb2xvciIgcm9sZT0iaW1nIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA2NDAgNTEyIgogICAgIGRhdGEtdGVzdGlkPSJwZW9wbGUtZ3JvdXAiIHRhYmluZGV4PSItMSI+CiAgICA8cGF0aCBmaWxsPSJjdXJyZW50Q29sb3IiCiAgICAgICAgICBkPSJNNzIgODhhNTYgNTYgMCAxIDEgMTEyIDBBNTYgNTYgMCAxIDEgNzIgODh6TTY0IDI0NS43QzU0IDI1Ni45IDQ4IDI3MS44IDQ4IDI4OHM2IDMxLjEgMTYgNDIuM1YyNDUuN3ptMTQ0LjQtNDkuM0MxNzguNyAyMjIuNyAxNjAgMjYxLjIgMTYwIDMwNGMwIDM0LjMgMTIgNjUuOCAzMiA5MC41VjQxNmMwIDE3LjctMTQuMyAzMi0zMiAzMkg5NmMtMTcuNyAwLTMyLTE0LjMtMzItMzJWMzg5LjJDMjYuMiAzNzEuMiAwIDMzMi43IDAgMjg4YzAtNjEuOSA1MC4xLTExMiAxMTItMTEyaDMyYzI0IDAgNDYuMiA3LjUgNjQuNCAyMC4zek00NDggNDE2VjM5NC41YzIwLTI0LjcgMzItNTYuMiAzMi05MC41YzAtNDIuOC0xOC43LTgxLjMtNDguNC0xMDcuN0M0NDkuOCAxODMuNSA0NzIgMTc2IDQ5NiAxNzZoMzJjNjEuOSAwIDExMiA1MC4xIDExMiAxMTJjMCA0NC43LTI2LjIgODMuMi02NCAxMDEuMlY0MTZjMCAxNy43LTE0LjMgMzItMzIgMzJINDgwYy0xNy43IDAtMzItMTQuMy0zMi0zMnptOC0zMjhhNTYgNTYgMCAxIDEgMTEyIDBBNTYgNTYgMCAxIDEgNDU2IDg4ek01NzYgMjQ1Ljd2ODQuN2MxMC0xMS4zIDE2LTI2LjEgMTYtNDIuM3MtNi0zMS4xLTE2LTQyLjN6TTMyMCAzMmE2NCA2NCAwIDEgMSAwIDEyOCA2NCA2NCAwIDEgMSAwLTEyOHpNMjQwIDMwNGMwIDE2LjIgNiAzMSAxNiA0Mi4zVjI2MS43Yy0xMCAxMS4zLTE2IDI2LjEtMTYgNDIuM3ptMTQ0LTQyLjN2ODQuN2MxMC0xMS4zIDE2LTI2LjEgMTYtNDIuM3MtNi0zMS4xLTE2LTQyLjN6TTQ0OCAzMDRjMCA0NC43LTI2LjIgODMuMi02NCAxMDEuMlY0NDhjMCAxNy43LTE0LjMgMzItMzIgMzJIMjg4Yy0xNy43IDAtMzItMTQuMy0zMi0zMlY0MDUuMmMtMzcuOC0xOC02NC01Ni41LTY0LTEwMS4yYzAtNjEuOSA1MC4xLTExMiAxMTItMTEyaDMyYzYxLjkgMCAxMTIgNTAuMSAxMTIgMTEyeiI+CiAgICA8L3BhdGg+Cjwvc3ZnPgo='; diff --git a/packages/core/src/config/logos/generated/coretimeChain.ts b/packages/core/src/config/logos/generated/coretimeChain.ts index 90a6970..97406ac 100644 --- a/packages/core/src/config/logos/generated/coretimeChain.ts +++ b/packages/core/src/config/logos/generated/coretimeChain.ts @@ -3,4 +3,5 @@ // Do not edit. Auto-generated via node scripts/convertLogos.mjs -export const coretimeChain = 'data:image/webp;base64,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'; +export const coretimeChain = + 'data:image/webp;base64,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'; diff --git a/packages/core/src/config/logos/generated/coretimeKusamaChain.ts b/packages/core/src/config/logos/generated/coretimeKusamaChain.ts index 380e56c..e3589d1 100644 --- a/packages/core/src/config/logos/generated/coretimeKusamaChain.ts +++ b/packages/core/src/config/logos/generated/coretimeKusamaChain.ts @@ -3,4 +3,5 @@ // Do not edit. Auto-generated via node scripts/convertLogos.mjs -export const coretimeKusamaChain = 'data:image/webp;base64,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'; +export const coretimeKusamaChain = + 'data:image/webp;base64,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'; diff --git a/packages/core/src/config/logos/generated/enkryptWallet.ts b/packages/core/src/config/logos/generated/enkryptWallet.ts index 051a35d..0e53e2a 100644 --- a/packages/core/src/config/logos/generated/enkryptWallet.ts +++ b/packages/core/src/config/logos/generated/enkryptWallet.ts @@ -3,4 +3,5 @@ // Do not edit. Auto-generated via node scripts/convertLogos.mjs -export const enkryptWallet = 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMTIwcHgiIGhlaWdodD0iMTIwcHgiIHZpZXdCb3g9IjAgMCAxMjAgMTIwIiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogICAgPHRpdGxlPuW9oueKtjwvdGl0bGU+CiAgICA8ZGVmcz4KICAgICAgICA8cmFkaWFsR3JhZGllbnQgY3g9IjExMi41JSIgY3k9Ii0xMy43NDk4ODU0JSIgZng9IjExMi41JSIgZnk9Ii0xMy43NDk4ODU0JSIgcj0iMTE0LjQzNSUiIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoMS4xMjUsIC0wLjEzNzUpLCBzY2FsZSgxLCAxKSwgcm90YXRlKDk2LjI3MTEpLCB0cmFuc2xhdGUoLTEuMTI1LCAwLjEzNzUpIiBpZD0icmFkaWFsR3JhZGllbnQtMSI+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiM3MDRCRkYiIG9mZnNldD0iMCUiPjwvc3RvcD4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iI0M1NDlGRiIgb2Zmc2V0PSIyMC45MzUyJSI+PC9zdG9wPgogICAgICAgIDwvcmFkaWFsR3JhZGllbnQ+CiAgICA8L2RlZnM+CiAgICA8ZyBpZD0i6aG16Z2iLTEiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxwYXRoIGQ9Ik0wLDIzLjA5MTcgQzAsMTAuMzM3NiAxMC4zMzg3LDAgMjMuMDkxNywwIEwxMjAsMCBMMTIwLDE3LjcxODIgQzEyMCwyNi44ODQ4IDExMi41NjksMzQuMzE1MiAxMDMuNDAzLDM0LjMxNTIgTDU3Ljg0MDcsMzQuMzE1MiBDNDUuMDg2NiwzNC4zMTUyIDM0Ljc0OSw0NC42NTM5IDM0Ljc0OSw1Ny40MDc5IEwzNC43NDksNjMuMjgzNCBDMzQuNzQ5LDc2LjAzNzUgNDUuMDg2Niw4Ni4zNzUxIDU3Ljg0MDcsODYuMzc1MSBMMTAzLjQwMyw4Ni4zNzUxIEMxMTIuNTY5LDg2LjM3NTEgMTIwLDkzLjgwNjUgMTIwLDEwMi45NzMgTDEyMCwxMjAuMDAxIEwyMy4wOTE3LDEyMC4wMDEgQzEwLjMzODcsMTIwLjAwMSAwLDEwOS42NjEgMCw5Ni45MDgyIEwwLDIzLjA5MTcgWiBNNTguODM3Nyw0My45NzIyIEwxMDUuNTY4LDQzLjk3MjIgQzExMy41MzksNDMuOTcyMiAxMjAsNTAuNDM0MyAxMjAsNTguNDA0NCBMMTIwLDYyLjI4NjEgQzEyMCw3MC4yNTczIDExMy41MzksNzYuNzE5MyAxMDUuNTY4LDc2LjcxOTMgTDU4LjgzNzcsNzYuNzE5MyBDNTAuODY2NSw3Ni43MTkzIDQ0LjQwNDUsNzAuMjU3MyA0NC40MDQ1LDYyLjI4NjEgTDQ0LjQwNDUsNTguNDA0NCBDNDQuNDA0NSw1MC40MzQzIDUwLjg2NjUsNDMuOTcyMiA1OC44Mzc3LDQzLjk3MjIgWiIgaWQ9IuW9oueKtiIgZmlsbD0idXJsKCNyYWRpYWxHcmFkaWVudC0xKSI+PC9wYXRoPgogICAgPC9nPgo8L3N2Zz4='; +export const enkryptWallet = + 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMTIwcHgiIGhlaWdodD0iMTIwcHgiIHZpZXdCb3g9IjAgMCAxMjAgMTIwIiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogICAgPHRpdGxlPuW9oueKtjwvdGl0bGU+CiAgICA8ZGVmcz4KICAgICAgICA8cmFkaWFsR3JhZGllbnQgY3g9IjExMi41JSIgY3k9Ii0xMy43NDk4ODU0JSIgZng9IjExMi41JSIgZnk9Ii0xMy43NDk4ODU0JSIgcj0iMTE0LjQzNSUiIGdyYWRpZW50VHJhbnNmb3JtPSJ0cmFuc2xhdGUoMS4xMjUsIC0wLjEzNzUpLCBzY2FsZSgxLCAxKSwgcm90YXRlKDk2LjI3MTEpLCB0cmFuc2xhdGUoLTEuMTI1LCAwLjEzNzUpIiBpZD0icmFkaWFsR3JhZGllbnQtMSI+CiAgICAgICAgICAgIDxzdG9wIHN0b3AtY29sb3I9IiM3MDRCRkYiIG9mZnNldD0iMCUiPjwvc3RvcD4KICAgICAgICAgICAgPHN0b3Agc3RvcC1jb2xvcj0iI0M1NDlGRiIgb2Zmc2V0PSIyMC45MzUyJSI+PC9zdG9wPgogICAgICAgIDwvcmFkaWFsR3JhZGllbnQ+CiAgICA8L2RlZnM+CiAgICA8ZyBpZD0i6aG16Z2iLTEiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxwYXRoIGQ9Ik0wLDIzLjA5MTcgQzAsMTAuMzM3NiAxMC4zMzg3LDAgMjMuMDkxNywwIEwxMjAsMCBMMTIwLDE3LjcxODIgQzEyMCwyNi44ODQ4IDExMi41NjksMzQuMzE1MiAxMDMuNDAzLDM0LjMxNTIgTDU3Ljg0MDcsMzQuMzE1MiBDNDUuMDg2NiwzNC4zMTUyIDM0Ljc0OSw0NC42NTM5IDM0Ljc0OSw1Ny40MDc5IEwzNC43NDksNjMuMjgzNCBDMzQuNzQ5LDc2LjAzNzUgNDUuMDg2Niw4Ni4zNzUxIDU3Ljg0MDcsODYuMzc1MSBMMTAzLjQwMyw4Ni4zNzUxIEMxMTIuNTY5LDg2LjM3NTEgMTIwLDkzLjgwNjUgMTIwLDEwMi45NzMgTDEyMCwxMjAuMDAxIEwyMy4wOTE3LDEyMC4wMDEgQzEwLjMzODcsMTIwLjAwMSAwLDEwOS42NjEgMCw5Ni45MDgyIEwwLDIzLjA5MTcgWiBNNTguODM3Nyw0My45NzIyIEwxMDUuNTY4LDQzLjk3MjIgQzExMy41MzksNDMuOTcyMiAxMjAsNTAuNDM0MyAxMjAsNTguNDA0NCBMMTIwLDYyLjI4NjEgQzEyMCw3MC4yNTczIDExMy41MzksNzYuNzE5MyAxMDUuNTY4LDc2LjcxOTMgTDU4LjgzNzcsNzYuNzE5MyBDNTAuODY2NSw3Ni43MTkzIDQ0LjQwNDUsNzAuMjU3MyA0NC40MDQ1LDYyLjI4NjEgTDQ0LjQwNDUsNTguNDA0NCBDNDQuNDA0NSw1MC40MzQzIDUwLjg2NjUsNDMuOTcyMiA1OC44Mzc3LDQzLjk3MjIgWiIgaWQ9IuW9oueKtiIgZmlsbD0idXJsKCNyYWRpYWxHcmFkaWVudC0xKSI+PC9wYXRoPgogICAgPC9nPgo8L3N2Zz4='; diff --git a/packages/core/src/config/logos/generated/fearlessWallet.ts b/packages/core/src/config/logos/generated/fearlessWallet.ts index fc71d68..42ecf50 100644 --- a/packages/core/src/config/logos/generated/fearlessWallet.ts +++ b/packages/core/src/config/logos/generated/fearlessWallet.ts @@ -3,4 +3,5 @@ // Do not edit. Auto-generated via node scripts/convertLogos.mjs -export const fearlessWallet = 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNjAwcHgiIGhlaWdodD0iNjAwcHgiIHZpZXdCb3g9IjAgMCA2MDAgNjAwIiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogICAgPHRpdGxlPue8lue7hDwvdGl0bGU+CiAgICA8ZyBpZD0i6aG16Z2iLTEiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxnIGlkPSLnvJbnu4QiPgogICAgICAgICAgICA8Y2lyY2xlIGlkPSLmpK3lnIblvaIiIGZpbGw9IiNFRTAwNzciIGN4PSIzMDAiIGN5PSIzMDAiIHI9IjMwMCI+PC9jaXJjbGU+CiAgICAgICAgICAgIDxwYXRoIGQ9Ik01NDQuMjI4NDcxLDIyNC4yMTE0NDIgTDM1MC45MjY2NjksMjQ5LjU5NTM0NiBDMzQ5LjgzMDk0MSwyNDkuNzM2Njc0IDM0OC44MDUwMDQsMjUwLjI0OTI5MyAzNDguMDA5MzgsMjUxLjAyNzEyIEwzMzIuMDkzNDA1LDI2Ni44MzAwMzMgQzMzMC4xMTEzMjQsMjY4Ljc5MjIyNCAzMjYuOTExMzc5LDI2OC43OTIyMjQgMzI0LjkyOTI5NywyNjYuODMwMDMzIEwzMjIuMTM3NjMzLDI2NC4wNTQ3NyBDMzIwLjEzODEwNCwyNjIuMDc1MTMxIDMyMC4xMzgxMDQsMjU4Ljg0MDI5IDMyMi4xMzc2MzMsMjU2Ljg2MDMwMiBMMzQxLjE0ODg2NiwyMzcuOTk5MTIyIEMzNDMuMTQ0OTA1LDIzNi4wMTk0ODMgMzQzLjE0NDkwNSwyMzIuNzg0NjQyIDM0MS4xNDg4NjYsMjMwLjgwNDY1NCBMMzAzLjU4Mzg4NCwxOTMuNDcxMzgxIEMzMDEuNjAzMTk5LDE5MS41MDk1NCAyOTguNDAyMjA3LDE5MS41MDk1NCAyOTYuNDIxMTcyLDE5My40NzEzODEgTDI1OC44NTc1ODcsMjMwLjgwNDY1NCBDMjU2Ljg1OTEwNCwyMzIuNzg0NjQyIDI1Ni44NTkxMDQsMjM2LjAxOTQ4MyAyNTguODU3NTg3LDIzNy45OTkxMjIgTDI3Ny44NTE3MjEsMjU2Ljg3ODA5OSBDMjc5Ljg1MDIwMywyNTguODU3NzM4IDI3OS44NTAyMDMsMjYyLjA5MjU3OSAyNzcuODUxNzIxLDI2NC4wNzI1NjcgTDI3NS4wNTcyNjUsMjY2Ljg0NzgzIEMyNzMuMDc2NTc5LDI2OC44MDk2NzIgMjY5Ljg3NTU4NywyNjguODA5NjcyIDI2Ny44OTQ1NTMsMjY2Ljg0NzgzIEwyNTEuOTc3ODgsMjUxLjA0NDU2OCBDMjUxLjE4MTkwNiwyNTAuMjY3MDkgMjUwLjE1NjMxOSwyNDkuNzU0NDcgMjQ5LjA1OTg5MywyNDkuNjEyNzkzIEw1NS43NTgwOTEsMjI0LjIxMTQ0MiBDNTAuOTQ3NzA0OCwyMjMuNTc0OTQyIDQ4LjA2NDk2MjYsMjI5LjQyNTkyMSA1MS41MTMzNjU3LDIzMi44Mzc2ODQgTDkzLjY3NTUxOTcsMjc0LjczMTQ4OSBDOTYuODk0MzA4NCwyNzcuOTMxMDg1IDk0LjYzMDYxNzgsMjgzLjQxMDc3MyA5MC4xMDMyMzY2LDI4My40MTA3NzMgQzg1LjU3NTUwNjMsMjgzLjQxMDc3MyA4My4zMTE4MTU3LDI4OC44OTA0NjEgODYuNTMwNjA0NCwyOTIuMDkwMDU3IEwxMjYuMDM5OTgsMzMxLjM1MDI3NiBDMTI2LjY5NDI3NiwzMzEuOTg2NDI2IDEyNy40OTAyNDksMzMyLjQ0NjAwNCAxMjguMzkxOTU3LDMzMi42NzU5NjcgTDI2Mi44NzIsMzY2LjM2Nzg2MyBDMjYzLjk2ODQyNiwzNjYuNjMzMDcyIDI2NC45MjM1MjQsMzY3LjI2OTIyMiAyNjUuNjMwODYyLDM2OC4xNTMxMzMgTDI4Ni40NDY5MDUsMzk0LjU3OTcyMyBDMjkwLjE2MDUxNywzOTkuNzA2MjY1IDI5Ni40MjExNzIsNDA1LjYyNzczNCAyOTYuNDIxMTcyLDQwNS42Mjc3MzQgQzI5OC40MDIyMDcsNDA3LjU4OTkyNSAzMDEuNjAzMTk5LDQwNy41ODk5MjUgMzAzLjU4Mzg4NCw0MDUuNjI3NzM0IEMzMDMuNTgzODg0LDQwNS42Mjc3MzQgMzA4Ljc2NTU2Miw0MDAuMzk1NDU3IDMxMy41NTg1LDM5NC41Nzk3MjMgTDMzNC4zNzU1OTEsMzY4LjE1MzEzMyBDMzM1LjA2MzAzOCwzNjcuMjY5MjIyIDMzNi4wMzY2MzEsMzY2LjY1MDUxOSAzMzcuMTMyMzU5LDM2Ni4zNjc4NjMgTDQ3MS42MzEyNDYsMzMyLjY3NTk2NyBDNDcyLjUxNDExLDMzMi40NDYwMDQgNDczLjMyNzE4MiwzMzIuMDA0MjIzIDQ3My45ODMyMjMsMzMxLjM1MDI3NiBMNTEzLjQ5MjI0OSwyOTIuMDkwMDU3IEM1MTYuNzA5NjQyLDI4OC44OTA0NjEgNTE0LjQ0ODM5NCwyODMuNDEwNzczIDUwOS45MTg5MTksMjgzLjQxMDc3MyBDNTA1LjM5MjkzNCwyODMuNDEwNzczIDUwMy4xMjgxOTYsMjc3LjkzMTA4NSA1MDYuMzQ5MDc5LDI3NC43MzE0ODkgTDU0OC41MTAxODYsMjMyLjgzNzY4NCBDNTUxLjkyMjk5NSwyMjkuNDI1OTIxIDU0OS4wNDA2MDIsMjIzLjU5MjczOSA1NDQuMjI4NDcxLDIyNC4yMTE0NDIgWiIgaWQ9Iui3r+W+hCIgZmlsbD0iI0ZGRkZGRiIgZmlsbC1ydWxlPSJub256ZXJvIj48L3BhdGg+CiAgICAgICAgPC9nPgogICAgPC9nPgo8L3N2Zz4='; +export const fearlessWallet = + 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iNjAwcHgiIGhlaWdodD0iNjAwcHgiIHZpZXdCb3g9IjAgMCA2MDAgNjAwIiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogICAgPHRpdGxlPue8lue7hDwvdGl0bGU+CiAgICA8ZyBpZD0i6aG16Z2iLTEiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxnIGlkPSLnvJbnu4QiPgogICAgICAgICAgICA8Y2lyY2xlIGlkPSLmpK3lnIblvaIiIGZpbGw9IiNFRTAwNzciIGN4PSIzMDAiIGN5PSIzMDAiIHI9IjMwMCI+PC9jaXJjbGU+CiAgICAgICAgICAgIDxwYXRoIGQ9Ik01NDQuMjI4NDcxLDIyNC4yMTE0NDIgTDM1MC45MjY2NjksMjQ5LjU5NTM0NiBDMzQ5LjgzMDk0MSwyNDkuNzM2Njc0IDM0OC44MDUwMDQsMjUwLjI0OTI5MyAzNDguMDA5MzgsMjUxLjAyNzEyIEwzMzIuMDkzNDA1LDI2Ni44MzAwMzMgQzMzMC4xMTEzMjQsMjY4Ljc5MjIyNCAzMjYuOTExMzc5LDI2OC43OTIyMjQgMzI0LjkyOTI5NywyNjYuODMwMDMzIEwzMjIuMTM3NjMzLDI2NC4wNTQ3NyBDMzIwLjEzODEwNCwyNjIuMDc1MTMxIDMyMC4xMzgxMDQsMjU4Ljg0MDI5IDMyMi4xMzc2MzMsMjU2Ljg2MDMwMiBMMzQxLjE0ODg2NiwyMzcuOTk5MTIyIEMzNDMuMTQ0OTA1LDIzNi4wMTk0ODMgMzQzLjE0NDkwNSwyMzIuNzg0NjQyIDM0MS4xNDg4NjYsMjMwLjgwNDY1NCBMMzAzLjU4Mzg4NCwxOTMuNDcxMzgxIEMzMDEuNjAzMTk5LDE5MS41MDk1NCAyOTguNDAyMjA3LDE5MS41MDk1NCAyOTYuNDIxMTcyLDE5My40NzEzODEgTDI1OC44NTc1ODcsMjMwLjgwNDY1NCBDMjU2Ljg1OTEwNCwyMzIuNzg0NjQyIDI1Ni44NTkxMDQsMjM2LjAxOTQ4MyAyNTguODU3NTg3LDIzNy45OTkxMjIgTDI3Ny44NTE3MjEsMjU2Ljg3ODA5OSBDMjc5Ljg1MDIwMywyNTguODU3NzM4IDI3OS44NTAyMDMsMjYyLjA5MjU3OSAyNzcuODUxNzIxLDI2NC4wNzI1NjcgTDI3NS4wNTcyNjUsMjY2Ljg0NzgzIEMyNzMuMDc2NTc5LDI2OC44MDk2NzIgMjY5Ljg3NTU4NywyNjguODA5NjcyIDI2Ny44OTQ1NTMsMjY2Ljg0NzgzIEwyNTEuOTc3ODgsMjUxLjA0NDU2OCBDMjUxLjE4MTkwNiwyNTAuMjY3MDkgMjUwLjE1NjMxOSwyNDkuNzU0NDcgMjQ5LjA1OTg5MywyNDkuNjEyNzkzIEw1NS43NTgwOTEsMjI0LjIxMTQ0MiBDNTAuOTQ3NzA0OCwyMjMuNTc0OTQyIDQ4LjA2NDk2MjYsMjI5LjQyNTkyMSA1MS41MTMzNjU3LDIzMi44Mzc2ODQgTDkzLjY3NTUxOTcsMjc0LjczMTQ4OSBDOTYuODk0MzA4NCwyNzcuOTMxMDg1IDk0LjYzMDYxNzgsMjgzLjQxMDc3MyA5MC4xMDMyMzY2LDI4My40MTA3NzMgQzg1LjU3NTUwNjMsMjgzLjQxMDc3MyA4My4zMTE4MTU3LDI4OC44OTA0NjEgODYuNTMwNjA0NCwyOTIuMDkwMDU3IEwxMjYuMDM5OTgsMzMxLjM1MDI3NiBDMTI2LjY5NDI3NiwzMzEuOTg2NDI2IDEyNy40OTAyNDksMzMyLjQ0NjAwNCAxMjguMzkxOTU3LDMzMi42NzU5NjcgTDI2Mi44NzIsMzY2LjM2Nzg2MyBDMjYzLjk2ODQyNiwzNjYuNjMzMDcyIDI2NC45MjM1MjQsMzY3LjI2OTIyMiAyNjUuNjMwODYyLDM2OC4xNTMxMzMgTDI4Ni40NDY5MDUsMzk0LjU3OTcyMyBDMjkwLjE2MDUxNywzOTkuNzA2MjY1IDI5Ni40MjExNzIsNDA1LjYyNzczNCAyOTYuNDIxMTcyLDQwNS42Mjc3MzQgQzI5OC40MDIyMDcsNDA3LjU4OTkyNSAzMDEuNjAzMTk5LDQwNy41ODk5MjUgMzAzLjU4Mzg4NCw0MDUuNjI3NzM0IEMzMDMuNTgzODg0LDQwNS42Mjc3MzQgMzA4Ljc2NTU2Miw0MDAuMzk1NDU3IDMxMy41NTg1LDM5NC41Nzk3MjMgTDMzNC4zNzU1OTEsMzY4LjE1MzEzMyBDMzM1LjA2MzAzOCwzNjcuMjY5MjIyIDMzNi4wMzY2MzEsMzY2LjY1MDUxOSAzMzcuMTMyMzU5LDM2Ni4zNjc4NjMgTDQ3MS42MzEyNDYsMzMyLjY3NTk2NyBDNDcyLjUxNDExLDMzMi40NDYwMDQgNDczLjMyNzE4MiwzMzIuMDA0MjIzIDQ3My45ODMyMjMsMzMxLjM1MDI3NiBMNTEzLjQ5MjI0OSwyOTIuMDkwMDU3IEM1MTYuNzA5NjQyLDI4OC44OTA0NjEgNTE0LjQ0ODM5NCwyODMuNDEwNzczIDUwOS45MTg5MTksMjgzLjQxMDc3MyBDNTA1LjM5MjkzNCwyODMuNDEwNzczIDUwMy4xMjgxOTYsMjc3LjkzMTA4NSA1MDYuMzQ5MDc5LDI3NC43MzE0ODkgTDU0OC41MTAxODYsMjMyLjgzNzY4NCBDNTUxLjkyMjk5NSwyMjkuNDI1OTIxIDU0OS4wNDA2MDIsMjIzLjU5MjczOSA1NDQuMjI4NDcxLDIyNC4yMTE0NDIgWiIgaWQ9Iui3r+W+hCIgZmlsbD0iI0ZGRkZGRiIgZmlsbC1ydWxlPSJub256ZXJvIj48L3BhdGg+CiAgICAgICAgPC9nPgogICAgPC9nPgo8L3N2Zz4='; diff --git a/packages/core/src/config/logos/generated/kusamaChain.ts b/packages/core/src/config/logos/generated/kusamaChain.ts index ba96f77..937ef8c 100644 --- a/packages/core/src/config/logos/generated/kusamaChain.ts +++ b/packages/core/src/config/logos/generated/kusamaChain.ts @@ -3,4 +3,5 @@ // Do not edit. Auto-generated via node scripts/convertLogos.mjs -export const kusamaChain = 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0NDEgNDQxIj48ZGVmcz48c3R5bGU+LmNscy0xe3N0cm9rZTojMDAwO3N0cm9rZS1taXRlcmxpbWl0OjEwO30uY2xzLTJ7ZmlsbDojZmZmO308L3N0eWxlPjwvZGVmcz48dGl0bGU+a3VzYW1hLWtzbS1sb2dvPC90aXRsZT48ZyBpZD0iTGF5ZXJfMiIgZGF0YS1uYW1lPSJMYXllciAyIj48ZyBpZD0iTGF5ZXJfMS0yIiBkYXRhLW5hbWU9IkxheWVyIDEiPjxyZWN0IGNsYXNzPSJjbHMtMSIgeD0iMC41IiB5PSIwLjUiIHdpZHRoPSI0NDAiIGhlaWdodD0iNDQwIi8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNMzczLjYsMTI3LjRjLTUuMi00LjEtMTEuNC05LjctMjIuNy0xMS4xLTEwLjYtMS40LTIxLjQsNS43LTI4LjcsMTAuNHMtMjEuMSwxOC41LTI2LjgsMjIuNy0yMC4zLDguMS00My44LDIyLjItMTE1LjcsNzMuMy0xMTUuNyw3My4zbDI0LC4zLTEwNyw1NS4xSDYzLjZMNDguMiwzMTJzMTMuNiwzLjYsMjUtMy42djMuM3MxMjcuNC01MC4yLDE1Mi0zNy4ybC0xNSw0LjRjMS4zLDAsMjUuNSwxLjYsMjUuNSwxLjZhMzQuMzQsMzQuMzQsMCwwLDAsMTUuNCwyNC44YzE0LjYsOS42LDE0LjksMTQuOSwxNC45LDE0LjlzLTcuNiwzLjEtNy42LDdjMCwwLDExLjItMy40LDIxLjYtMy4xYTgyLjY0LDgyLjY0LDAsMCwxLDE5LjUsMy4xcy0uOC00LjItMTAuOS03LTIwLjEtMTMuOC0yNS0xOS44YTI4LDI4LDAsMCwxLTQuMS0yNy40YzMuNS05LjEsMTUuNy0xNC4xLDQwLjktMjcuMSwyOS43LTE1LjQsMzYuNS0yNi44LDQwLjctMzUuN3MxMC40LTI2LjYsMTMuOS0zNC45YzQuNC0xMC43LDkuOC0xNi40LDE0LjMtMTkuOHMyNC41LTEwLjksMjQuNS0xMC45UzM3OC41LDEzMS4zLDM3My42LDEyNy40WiIvPjwvZz48L2c+PC9zdmc+'; +export const kusamaChain = + 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0NDEgNDQxIj48ZGVmcz48c3R5bGU+LmNscy0xe3N0cm9rZTojMDAwO3N0cm9rZS1taXRlcmxpbWl0OjEwO30uY2xzLTJ7ZmlsbDojZmZmO308L3N0eWxlPjwvZGVmcz48dGl0bGU+a3VzYW1hLWtzbS1sb2dvPC90aXRsZT48ZyBpZD0iTGF5ZXJfMiIgZGF0YS1uYW1lPSJMYXllciAyIj48ZyBpZD0iTGF5ZXJfMS0yIiBkYXRhLW5hbWU9IkxheWVyIDEiPjxyZWN0IGNsYXNzPSJjbHMtMSIgeD0iMC41IiB5PSIwLjUiIHdpZHRoPSI0NDAiIGhlaWdodD0iNDQwIi8+PHBhdGggY2xhc3M9ImNscy0yIiBkPSJNMzczLjYsMTI3LjRjLTUuMi00LjEtMTEuNC05LjctMjIuNy0xMS4xLTEwLjYtMS40LTIxLjQsNS43LTI4LjcsMTAuNHMtMjEuMSwxOC41LTI2LjgsMjIuNy0yMC4zLDguMS00My44LDIyLjItMTE1LjcsNzMuMy0xMTUuNyw3My4zbDI0LC4zLTEwNyw1NS4xSDYzLjZMNDguMiwzMTJzMTMuNiwzLjYsMjUtMy42djMuM3MxMjcuNC01MC4yLDE1Mi0zNy4ybC0xNSw0LjRjMS4zLDAsMjUuNSwxLjYsMjUuNSwxLjZhMzQuMzQsMzQuMzQsMCwwLDAsMTUuNCwyNC44YzE0LjYsOS42LDE0LjksMTQuOSwxNC45LDE0LjlzLTcuNiwzLjEtNy42LDdjMCwwLDExLjItMy40LDIxLjYtMy4xYTgyLjY0LDgyLjY0LDAsMCwxLDE5LjUsMy4xcy0uOC00LjItMTAuOS03LTIwLjEtMTMuOC0yNS0xOS44YTI4LDI4LDAsMCwxLTQuMS0yNy40YzMuNS05LjEsMTUuNy0xNC4xLDQwLjktMjcuMSwyOS43LTE1LjQsMzYuNS0yNi44LDQwLjctMzUuN3MxMC40LTI2LjYsMTMuOS0zNC45YzQuNC0xMC43LDkuOC0xNi40LDE0LjMtMTkuOHMyNC41LTEwLjksMjQuNS0xMC45UzM3OC41LDEzMS4zLDM3My42LDEyNy40WiIvPjwvZz48L2c+PC9zdmc+'; diff --git a/packages/core/src/config/logos/generated/ledgerWallet.ts b/packages/core/src/config/logos/generated/ledgerWallet.ts index 7900688..11aa2c3 100644 --- a/packages/core/src/config/logos/generated/ledgerWallet.ts +++ b/packages/core/src/config/logos/generated/ledgerWallet.ts @@ -3,4 +3,5 @@ // Do not edit. Auto-generated via node scripts/convertLogos.mjs -export const ledgerWallet = 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/Pg0KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjAvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvMjAwMS9SRUMtU1ZHLTIwMDEwOTA0L0RURC9zdmcxMC5kdGQiPg0KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiBpZD0iYm9keV8xIiB3aWR0aD0iNDAwIiBoZWlnaHQ9IjQwMCI+DQoNCjxnIHRyYW5zZm9ybT0ibWF0cml4KDEuMzMzMzMzNCAwIDAgMS4zMzMzMzM0IDAgMCkiPg0KCTxpbWFnZSAgeD0iMCIgeT0iMCIgeGxpbms6aHJlZj0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFaQUFBQUdRQ0FZQUFBQ0F2emJNQUFBQUFYTlNSMElBcnM0YzZRQUFBQVJuUVUxQkFBQ3hqd3Y4WVFVQUFBQUpjRWhaY3dBQURzTUFBQTdEQWNkdnFHUUFBQnJ5U1VSQlZIaGU3ZHpianlWVjJUL3dWK2M4QXdOb2pDTElTUmlHczVCNDUzK2hKc1lMTDd3anhrUkR2TkE3WTR6ZUdZMW9FQWhJUXRERVF6d1ROUVpKRkExZUdJTVJoNUVCUkdBNEtFWVlaZ2FHZW45UC9WajlybXFlNmRYdFZEZFZ1ejhyK1dTdi9hVjdoMXExMW5xcTl0NDkvL1AvV2djQS80VTBCSUNXTkFTQWxqUUVnSlkwQklDV05BU0FsalFFZ0pZMEJJQ1dOQVNBbGpRRWdKWTBCSUNXTkFTQWxqUUVnSlkwQklDV05BU0FsalFFZ0pZMEJJQ1dOQVNBbGpRRWdKWTBCSUNXTkFTQWxqUUVnSlkwQklDV05BU0FsalFFZ0pZMEJJQ1dOQVNBbGpRRWdKWTBCSUNXTkFTQWxqUUVnSlkwQklDV05BU0FsalFFZ0pZMEJJQ1dOQVNBbGpRRWdKWTBCSUNXTkFTQWxqUUVnSlkwQklDV05BU0FsalFFZ0pZMEJJQ1dOQVNBbGpRRWdKWTBCSUNXTkFTQWxqUUVnSlkwQklDV05BU0FsalFFZ0pZMEJJQ1dOQVNBbGpRRWdKWTBCSUNXTkFTQWxqUUVnSlkwQklDV05BU0FsalFFZ0pZMEJJQ1dOQVNBbGpRRWdKWTBCSUNXTkFTQWxqUUVnSlkwQklDV05BU0FsalFFZ0pZMEJJQ1dOQVNBbGpRRWdKWTBCSUNXTkFTQWxqUUVnSlkwQklDV05BU0FsalFFZ0pZMEJJQ1dOQVNBbGpRRWdKWTBCSUNXTkFTQWxqUUVnSlkwQklDV05BU0FsalFFZ0pZMEJJQ1dOQVNBbGpRRWdKWTBCSUNXTkFTQWxqUUVnSlkwQklDV05BU0FsalFFZ0pZMEJJQ1dOQVNBbGpRRWdKWTBCSUNXTkFTQWxqUUVnSlkwQklDV05HUkVXN1pzV2VwdjNicTFmOXk3ZCs5U3hzbnQzTG16ZjR3eDNMRmpSOS9mdFd0WC8vaW1ONzFwNmVmbUtvNmh6SWxRNWtya2kzQjg2KzNOYjM1elB5OWlyT28xdFczYnRzSFBzVzdTa0pIVW04UDI3ZHNIL2JJaGNuS3hRZFRGbzJSRi9iTnpWQXBHT2I3eWZCR09iU1BWNDFVS2I3M2VXRGRweURvb1YwVVhYbmhoZCs2NTUzYm5uWGRlMytmazN2bk9kM2FYWEhKSjcvenp6Kzh1dmZUU2ZneVhYN25QVlNrYzczM3ZlL3M1Y2M0NTUvVEgvTzUzdjd2YnQyOWZPaWI4bjVnVFYxNTVaVCtHVVh4Mzc5NjlkTmZLaGtoRFJoSWJYVndkeFdZWGI3MWNmdm5sM2E5KzlhdnV3UWNmN0I1NTVKSHUwS0ZEck9DaGh4N3Evdjczdi9mOWh4OSt1THYvL3Z1N2E2Kzl0dDhrRnVFdG5qaUdLSTUvL3ZPZnU4Y2VlNng3K3VtbisrTThjT0JBbnkwZkQ0Wml6R0tPeEh5b0MwZGNyTG5EM3hCcHlFaGlneWh2UzRSM3ZldGQvYVF2N2RWWFgyVUZMNy84Y3Y5NDdOaXhmcnorK2M5L2RwZGRkdGxnak9jczVzZisvZnU3NDhlUGQ2Kzg4a3AvckMrOTlGSjM0c1NKL25qcnNlRDFZc3hDak9XZVBYdjY4WXhDc2doM3B6T1Job3dvcm9iaTFqckVadkg0NDQvM0c4YlJvMGY3VFVKcnR4aXJHTE5ubm5tbXUrcXFxL3JONGkxdmVVczYzbk1UYjFmRkpoakZNbHIwdGRXM3VMaUl0UlZqR1lWaitlZEpyS3MwWkdSeFpSVGlQZHU0NVM0dHU2cmkvOFRWZUJtbmFIRUhFZ1VrRytNNWlnM3ZpaXV1NkkrdHZ1dUlJaElGc3g0TFhpL0dLUXBJS1JyMUhiOXZZbTJJTkdRa3NVR0VtTmp4UEFySXdZTUgrNDNDSGNqcVdtd1VzVW5FNCtIRGg3dXJyNzY2SDg5RmVZODdDbUswNVc5YmFlMVczdHFNY1l4dlhjVzg4QTIyRFpXR2pLUVVqaEFUT3dwSWZFZ2FiVFdiUkZrZzljK1c5OHVqbGMxbVVVV0w0NDBXeC96a2swLzIzN3FweDNYdTRsdFhwY1V4eGx0WjVlMnNiRXdXU1RtM01jL0xNWmRXN2o1WDA4cFlMdEs4bUlrMFpDU25Xa0NpeGMvRjFXa3NzUG90bmVVTGJwRmJ1VHFQYnltVnQ3QVdZYk9JdDFuaWM3RTRyMlV6amJiYXVUSDN0dnc0WXh6SzUxM2xuSyttbGZGVVFEWmNHaktTVXkwZ2NVVWFpNnI4N0FzdnZOQS94aFZiS1NxTHJCeHZlWXdQMGErNTVwckJHTS9kZGRkZDEyK2E1YTZ5blBQWVJMTXhXU1F4aitQWXk5dTU1WTY3WENpdHRwV3hWRUEyWEJveWtqRUtTTFN5c01yenRTNnd1YmI2dUdPOG5uMzIyZjRPSks3Y0YrVzk3dVVmb20vR3RueWVyL1h6d1RLV0NzaUdTME5HY3FvRnBMeXQ4Znp6ejNkSGpoeFoybVRLRlZ3c3ZFVVdZeFRLMVdyY2djVFhYbU5jRitGcm1sRUk0MitEb3NXNWptTXQ1empPZHpZbWl5WmFPYzh2dnZoaS94am4ybHRZczVDR2pHU3NBaEp0K1lJcWkyL1JXOWxVb2ozMzNITkwvM1RGSW9nNWNkRkZGdzNtUWpubm0rSDhsdU91ajdYMEZaQlpTRU5HY3FvRkpPNDh2djN0YjNjLy9lbFB1eC8vK01mZGQ3LzczZTQ3My9sTzk2TWYvYWo3L3ZlLzMyZUxMSTQ3anZtSFAveGhmOHkzM1haYi84L0JMTXBmR3NmOGlIOFQ3YzQ3Nyt5Kzk3M3Y5Y2NaNS9mdXUrL3Vmdjd6bjZkanNraCs5ck9mOWVLWVl6Ny81Q2MvNmU2NjY2NytuNjlaUzZ2SHN4NWYxbDBhTXBKVExTQy8vT1V2bC82T3BMeGxFLzNJTnN1L05scS9WWFd5L2x5VmY1cStQSmJQZGtMOWM0dXMvb08vT0tmeDl6MjMzSExMbXU3QXl1OHJJQnN1RFJuSnFSYVFlKzY1WitsMXltdkY0MmJhWUZoYzlmcW8rN2ZmZnZ1cTFrZHAyV3V3SWRLUWtkUVRXZ0dCb1hwOTFIMEZaRGJTa0pIVUUxb0JnYUY2ZmRSOUJXUTIwcENSMUJOYUFZR2hlbjNVZlFWa050S1FrZFFUV2dHQm9YcDkxSDBGWkRiU2tKSFVFMW9CZ2FGNmZkUjlCV1EyMHBDUjFCTmFBWUdoZW4zVWZRVmtOdEtRa2RRVFdnR0JvWHA5MUgwRlpEYlNrSkhVRTFvQmdhRjZmZFI5QldRMjBwQ1IxQk5hQVlHaGVuM1VmUVZrTnRLUWtkUVRXZ0dCb1hwOTFIMEZaRGJTa0pIVUUxb0JnYUY2ZmRSOUJXUTIwcENSMUJOYUFZR2hlbjNVZlFWa050S1FrZFFUV2dHQm9YcDkxSDBGWkRiU2tKSFVFMW9CZ2FGNmZkUjlCV1EyMHBDUjFCTmFBWUdoZW4zVWZRVmtOdEtRa2RRVFdnR0JvWHA5MUgwRlpEYlNrSkhVRTFvQmdhRjZmZFI5QldRMjBwQ1IxQk5hQVlHaGVuM1VmUVZrTnRLUWtkUVRXZ0dCb1hwOTFIMEZaRGJTa0pIVUUxb0JnYUY2ZmRSOUJXUTIwcENSMUJOYUFZR2hlbjNVZlFWa050S1FrZFFUV2dHQm9YcDkxSDBGWkRiU2tKSFVFMW9CZ2FGNmZkUjlCV1EyMHBDUjFCTmFBWUdoZW4zVWZRVmtOdEtRa2RRVFdnR0JvWHA5MUgwRlpEYlNrSkhVRTFvQmdhRjZmZFI5QldRMjBwQ1IxQk5hQVlHaGVuM1VmUVZrTnRLUWtkUVRXZ0dCb1hwOTFIMEZaRGJTa0pIVUUxb0JnYUY2ZmRSOUJXUTIwcENSMUJOYUFZR2hlbjNVZlFWa050S1FrZFFUV2dHQm9YcDkxSDBGWkRiU2tKRnMzYnExMjdKbFM5K1B5WDN4eFJkM2p6NzZhTDg0VHB3NDhkcjBQM203OTk1Nys5L2Z0bTNiMG10R2Y3TVVrUmkvT041NC9HK090NHhWUE83WXNjTUdNMUZ4ZnJkdjM5N1A5VGhITjk5ODg2cldSMm54R25GKzR6RmV3d1hXaGtsRFJsUnZmaGRjY01GU0FUbDI3RmovdUpKZi9PSVhTNjhSQzZ4ZUdKR1YvbVlReDc5cjE2Nmw4U3pGWVNYWjY4VHZ4V3RsLzQyTnRYdjM3cVdpVWJJNFAzZmNjY2RycFdIbEZtc2tXcjAyeW12RjY1VFhaTjJrSVNNcUcxMzB6enZ2dk83UW9VUDlwRjlOKzgxdmZyUDBPdlVDMlN6RjQ0d3p6amlsalNER2F1Zk9uYjE0bmMxV2RPY2d6bEhjUGRUek8rNUFYbnJwcGRkV3djbmI4ZVBIdTZOSGp5NzlicnhPbk92b2w0eDFsWWFNSkRhdE1wSGpTdXVpaXk3cURodzQwRS82dUVWZmZzZXgzSzkvL2V2WDNaTEg4ejE3OWl3OVgzUng3T1g0b3dERVZXdHNFckhSdEN4L25ib1l1UXVaam5wK1J6OCtBNGtXYTJRbHBaWGZqWE5lTGhLYzN3MlJocXlEMkx6Mjc5L2ZQZjc0NDY5TiszYTcrKzY3K3dVVmk2SitENys4MzdzWlpNVmd0ZUl0cnlpNDVYbU1ZMWhlVEhoanhNVkEvYnljNXh0dnZMRTdjdVRJYTZ2ZzVPM1paNS90SCtOM050TkYxWVNrSVNPSnphdTh6eHZQeno3NzdPNXZmL3RiZi9WVTdrSldjdDk5OS9XYllQeHV1ZnFPZm4zRnRzanFUVDZLWnJtcWpPT1BEU01lVjFKK05zYXRGTjBZUjFlbjB4RG5JaDdqSE5XRi90WmJiKzBMUTNaWFhpc3RmaWZPY1JTZ2VKMzZ0VmhYYWNpSVlsTEhRb20zWGZidDI3ZW16MEIrOElNZkRLN1NTakVwbStObVVRcENrZjFNcHI0cXJlL2FOdE1kM0pTVk80NTZ3NCtMaHR0dXU2My9ra21yUlJFNWZQandZSTNFYThacmxPTEV1a3BEUmxJKzBJdEpYYTU2UC8zcFQzYzMzSEJEOTZsUGZhcjd6R2MrczZMcnI3KysvNTNZQ09NMXlvTGJUSXNqTm9keXZIRUg5K0VQZjdqNzNPYysxMzNoQzEvb1B2LzV6Ni9vWXgvN1dIZk9PZWYwdnh2alh6WXFkeURURWhjRmNXN0tlbm4vKzkvZmZmS1RuK3crOFlsUHJPampILzk0djA3SzJpaS9IOHBhWVYybElVelM2YWVmM3YzKzk3OS83ZnF6M2Y3eWw3LzBSYWZlVE1vZGpBMEdUbGthd2lRcElEQXBhUWlUcElEQXBLUWhUSklDQXBPU2hqQkpDZ2hNU2hyQ0pDa2dNQ2xwQ0pPa2dNQ2twQ0ZNa2dJQ2s1S0dNRWtLQ0V4S0dzSWtLU0F3S1drSWs2U0F3S1NrSVV5U0FnS1Rrb1l3U1FvSVRFb2F3aVFwSURBcGFRaVRwSURBcEtRaFRKSUNBcE9TaGpCSkNnaE1TaHJDSkNrZ01DbHBDSk9rZ01Da3BDRk1rZ0lDazVLR01Fa0tDRXhLR3NJa0tTQXdLV2tJazZTQXdLU2tJVXlTQWdLVGtvWXdTUW9JVEVvYXdpUXBJREFwYVFpVHBJREFwS1FoVEpJQ0FwT1NoakJKQ2doTVNockNKQ2tnTUNscENKT2tnTUNrcENGTWtnSUNrNUtHTUVrS0NFeEtHc0lrS1NBd0tXa0lrNlNBd0tTa0lVeVNBZ0tUa29Zd1NRb0lURW9hd2lRcElEQXBhUWlUcElEQXBLUWhUSklDQXBPU2hqQkpDZ2hNU2hyQ0pDa2dNQ2xwQ0pPa2dNQ2twQ0ZNa2dJQ2s1S0dNRWtLQ0V4S0dzSWtLU0F3S1drSWs2U0F3S1NrSVV5U0FnS1Rrb1l3U1FvSVRFb2F3aVFwSURBcGFRaVRwSURBcEtRaFRKSUNBcE9TaGpCSkNnaE1TaHJDSkNrZ01DbHBDSk9rZ01Da3BDRk1rZ0lDazVLR01Fa0tDRXhLR3NJa0tTQXdLV2tJazZTQXdLU2tJVXlTQWdLVGtvWXdTUW9JVEVvYXdpUXBJREFwYVFpVHBJREFwS1FoVEpJQ0FwT1NoakJKYXkwZ0R6endRUGUydDcydC85MG9HSFh4MkxadDIrQzEzeWhidG16cC8zKzJiOS9lUDYvN01IRnBDSk8wMWdMeThNTVBkK2VmZjM2M1k4ZU8xOTF4eFBNMzJ0YXRXMTlYUUtMSVJWNy92OEpFcFNGTTBsb0x5Si8rOUtmdXJMUE82bjgzN2poaWs5NjllM2YvUERidCtyWGZhRkZJU2o4S25pTENES1FoVE5KYUM4ampqei9lWFhEQkJZUFhLQnR6RkpMNmJ1Q05FUDh2NWM2akxoaVI3ZHk1YytrNVRGUWF3aVN0dFlEY2Q5OTkzZnZlOTc1dS8vNzkzU1dYWE5LZGQ5NTUzYjU5Ky9ySHlDNisrT0kzMUVVWFhkUS94ckZGd1lqanErOUVZT0xTRUNacHJRVWsybC8vK3RmdXFhZWU2ZzRmUHR3OSt1aWozYlBQUHR2Zm1jVG5JNDg5OXRnYkt2NC83cjc3N3FVUCtvdTRHOW0xYTljZ2d3bEtRNWlrdFJhUWwxOSt1VHQrL0hqZmYrV1ZWN29qUjQ1MEowNmM2SjlQcFIwNGNHQ3BXTVJiVjFFODRvUDA4bzB4bUxBMGhFbjZiKzVBb2gwOWV2UzEzdjh2S3FXOSt1cXJiNmo0ZjRrN2tYSjg5VmVMRlJCbUlBMFpVYnluWGIrdnZmeDVTL21RTlg0bnZwMVQ4cW44SGNONld2N0I4aGxubkxGVVFPSk9JdHVVNStiZ3dZTkx4MWlLUmpubml5N21kSHlab0R3dlh5d0lkWDR5WlIyVk83Zm94Kyt0WlgxeFN0S1FrY1dramcyLy91WlA5bk9yRVl1bHZFNzIzeGRKSEdOZFJLSi8vLzMzOXdWa0VWcThyUllGcFA0N2xWSkU2dU5lZERHbjQyMjh0UmJPR0tQeWJiVVl0eWdjbTJuY0ppQU5HY21lUFh2Nng3STUxSk03Sm56a0s0a0ZFVTQ3N2JTbHYxK0kzOXNzVjZnaENtK01XMnd3TVFaLy9PTWZsemJmdUF1WnMzaHI3Y0VISDF3NjMzR2NjYTdqdU9QNThyRllOTXYvd0xNVXo1anpVUmpLdUp4TS9GejVPNS95dTRXdlFXK0lOR1FrTWNsallrY2hpWDY1YzhqK01ub2w4UnJMRjBnc252cjVJb3BDV1RhQ09ONTQvcnZmL2E3L01EeDdPMmh1b2ozeHhCT3ZPK1o0M0N4dlVhNWxIYXdrNWtjbzYyVDVlbUZkcENFaktaTzRiQXIxcEY3TndvbmZxKzlhWW9IVTM5Z3ArU0lyRzJtTVhYd0dFbjlkdmlqdCtlZWY3dzRkT3JSMG5PV2lJQjdIMmxpbkx1WjNYU3hqWHNlRjFtcSt4dnlPZDd5akg2ZjZaK3Npd3JwTFEwWlNUK1NZMkdWeXgyUGNsVVIvSmZGN3NjRDI3dDI3OUJybHJhem9sOWRlWkhFSFVvcm9tV2VlMmYzaEQzL29qaDA3dHZTVjNEbUw5c2dqai9USEYrZTdiS1NyMlR3WFFSeDNPYmRGakVFcG5zdlh3M0xsNStJMTZvSmIxbHA1enJwSlEwWVNpMkg1NXlCUkRHTHkxejkzTW5IRkhZK3hHTXJtVW41MytjSmJaT1ZZenozMzNPN2VlKzhkZkMxM3ppM2V4dnJ0YjMvYmZ6MjVIR3U1b3Q0TTU3Y3VGREcveTl5T3ZLeWJsY1RQdmYzdGIrLzdjV0VWZHk5bG5aVFhabDJsSVNPS3ErYlNqMzlDNDdPZi9XejN6Vzkrczd2OTl0dTdXMis5ZFVVMzNIREQwa0lxZHg1bFlXeUdCVksrdGh5UDVZcnlneC84WVBlUmozeWsrK2hIUHpwNzExOS9mZmVoRDMyb1A2N1krT0p1cTJ5QW0wWE00emkvNWJpam1IN2dBeDlJMThOeU45MTBVM2ZqalRmMmM2T3NoMUo0VjN1UnhpbEpRMFpTYi9JeG9lT2ZGbzkvUXFOY2ZiYmFQZmZjcy9RNjViWGkwZUpnRWRUcm8rN0h4ZFZxMWtkcDJXdXdJZEtRa2RRVFdnR0JvWHA5MUgwRlpEYlNrSkhVRTFvQmdhRjZmZFI5QldRMjBwQ1IxQk5hQVlHaGVuM1VmUVZrTnRLUWtkUVRXZ0dCb1hwOTFIMEZaRGJTa0pIVUUxb0JnYUY2ZmRSOUJXUTIwcENSMUJOYUFZR2hlbjNVZlFWa050S1FrZFFUV2dHQm9YcDkxSDBGWkRiU2tKSFVFMW9CZ2FGNmZkUjlCV1EyMHBDUjFCTmFBWUdoZW4zVWZRVmtOdEtRa2RRVFdnR0JvWHA5MUgwRlpEYlNrSkhVRTFvQmdhRjZmZFI5QldRMjBwQ1IxQk5hQVlHaGVuM1VmUVZrTnRLUWtkUVRXZ0dCb1hwOTFIMEZaRGJTa0pIVUUxb0JnYUY2ZmRSOUJXUTIwcENSMUJOYUFZR2hlbjNVZlFWa050S1FrZFFUV2dHQm9YcDkxSDBGWkRiU2tKSFVFMW9CZ2FGNmZkUjlCV1EyMHBDUjFCTmFBWUdoZW4zVWZRVmtOdEtRa2RRVFdnR0JvWHA5MUgwRlpEYlNrSkhVRTFvQmdhRjZmZFI5QldRMjBwQ1IxQk5hQVlHaGVuM1VmUVZrTnRLUWtkUVRXZ0dCb1hwOTFIMEZaRGJTa0pIVUUxb0JnYUY2ZmRSOUJXUTIwcENSMUJOYUFZR2hlbjNVZlFWa050S1FrZFFUV2dHQm9YcDkxSDBGWkRiU2tKSFVFMW9CZ2FGNmZkUjlCV1EyMHBDUjFCTmFBWUdoZW4zVWZRVmtOdEtRa2RRVFdnR0JvWHA5MUgwRlpEYlNrSkhVRTFvQmdhRjZmZFI5QldRMjBwQ1IxQk5hQVlHaGVuM1VmUVZrTnRLUWtkUVRXZ0dCb1hwOTFIMEZaRGJTa0pIVUUxb0JnYUY2ZmRSOUJXUTIwcENSMUJOYUFZR2hlbjNVZlFWa050S1FrZFFUV2dHQm9YcDkxSDBGWkRiU2tKSFVFMW9CZ2FGNmZkUjlCV1EyMHBDUjFCTmFBWUdoZW4zVWZRVmtOdEtRa2RRVFdnR0JvWHA5MUgwRlpEYlNrSkhVRTFvQmdhRjZmZFI5QldRMjBwQ1IxQk5hQVlHaGVuM1VmUVZrTnRLUWtkUVQrcjhwSUFjUEh1eHV2dm5tN290Zi9HTC8rTld2ZnJYNzBwZSsxSDN0YTEvcnZ2emxML2ZQRjlsWHZ2S1Y3aHZmK0VaMzQ0MDM5bU1ReDN6bW1XY3V6RWF4YmR1MmJ1L2V2ZDFkZDkzVjNYVFRUZDNYdi83MS9qemZlZWVkM1MyMzNOSnZwSXNzNW5FYzV4MTMzTkhkZHR0dC9SaDg2MXZmNmg1NDRJSFhWc0RxV2hsUEJXVERwU0VqT2RVQ0V1MmxsMTdxVHB3NDBmZVBIeisrMUk4OFhtT1J4YkcrL1BMTDNTdXZ2TklkUFhxMGUrcXBwN3JycnJ1dTI3SmxTNjhlNnptSytYSGxsVmQyTDc3NFluOU82eGJIRzhlL3lLTEZlWTV6SEkvUklvL3p2WlpXajJjOXZxeTdOR1FrcDFwQS92T2YvL1NMcTdRalI0NHNMYnkxTHJLNXR2cjRuMy8rK2U3eXl5OS8zZGpPMlJWWFhORVhpMmh4Ym84ZE85YjNOMHVMaTZMbHh4elBZNjZ2dHBXeFZFQTJYQm95a2xNdElLWEZ4bEt1eE10anRIaU5SUmJIR3FJZkc4MFRUenpSWFgzMTFkM1dyVnU3M2J0M0Q4WjZqdUl1S3U1QTR0aEtLOGNlNXpqTysyWlFqamtySnF0cFpUd1ZrQTJYaG94a2pBSlNGbGJkTnN2ZFIyd3VwVVVoZWZMSko3dHJycmxtTU1aemQ4a2xseXpkZ1pRV3g3MVp6bkcwNVd1aEZKYlZ0aktXQ3NpR1MwTkdjcW9GcEh6T0VZc3Bpa2haVlBFWWVXd3lpeXhhRkk3UzRpMnMrQXdreGpJK2dLN0hlbzYyYjkvZXY0VlZ6bVc4YlJOWDRNc3ZHQmExeFhHR2NwZFp0OVdzajlMS2VDb2dHeTROR2NtcEZwRDZaMktEaVN2VnRTeXNSV2hsZzRualAzejRjSGZaWlpmMTQ3a0lINktIdUFOWjNrcnhMRmZpaTZwdThieWM2K1gvcmRYS1dDb2dHeTROR2NtcEZwQ3lxTXJQeG1OazhWaGZtUzl5SzhjZXh4MEY1S3FycmxvYXp6SzJjeFYzVWZ2MjdldlBaUkZ0czV6YmFIRitvMkNXb2xuYVdzYWdqS2NDc3VIU2tKSEVWWEpzZE9WcU9iNUI5TkJERC9XVFBncUR0bklybTBpNTgzcjY2YWY3RDUxakxCZmhMYXh3NmFXWDlzZFliNkJsUTQxajV1U2l4WVZGckxINmdtTEhqaDBMY1lFeEEybkl5R0pDeCtPRkYxN1lQZkxJSTBzYlkweCtUbTU1ZSs2NTUvb3I5dVhqTzFkeFlSRjNwZEhpZ2lJc3Z4TFgycTFjcE1XMzgzYnQycFdPTmVzaURSbEptY3d4d2VQMmV2LysvZDAvL3ZHUDdvVVhYbmh0Nm1zcnRkaFF5emVVb3VnKzg4d3ozWHZlODU2RnVjS01EZS9zczgvdWp5K090UlRPdUxxTzR5NTNJdVJpbkdLODZydlIrR0pDUEM3QzE3eG5JQTBaVVV6b2NnY1NCU1R1UUVvckd3YTVhUC82MTcrV2lraDhqZmZhYTYvdHgzSlIzdStPYjJIRm5WVWNZM3dMSzc1cEZvOVJNT012MURtNStNYmF2Ly85NzM0Y280aVU0dkhXdDc1MU1NYXNtelJrSktlZGRsci9HSnZkbmoxNytxdm1jdVZjK3B4Y2pGT01XN21hM0xsejU5TGpJbndHVW80bi9uMnZrc1Z4K1RCNDlVclJLTXBZbm5YV1dZT2NkWkdHakNnMndySXBsSTNCN2ZYcXhPWlF2b0FRNHhoditaVC9WZ3JNM0oxKyt1bXZ5MktlZUMrL3JaNERjWmRmUGdjcGQveXN1elJrSlBVbUVKTTlKblpzRG1YaWw2SkNyb3hkS1J3eGJsRlVvaUNYd2pKM1piT0w0eTNIVnY3Yjh2RmdLT1pBUE1hOHFDOHVvbDgvWjkya0lTT0p5UjJQTWRGTDBTZ2JSTDFSa0N0djhaUzNBaGR0ek1vbUY0OWxyb1N5UWJLeWVyektHTVkvangrWjliVWgwaEFBV3RJUUFGclNFQUJhMGhBQVd0SVFBRnJTRUFCYTBoQUFXdElRQUZyU0VBQmEwaEFBV3RJUUFGclNFQUJhMGhBQVd0SVFBRnJTRUFCYTBoQUFXdElRQUZyU0VBQmEwaEFBV3RJUUFGclNFQUJhMGhBQVd0SVFBRnJTRUFCYTBoQUFXdElRQUZyU0VBQmEwaEFBV3RJUUFGclNFQUJhMGhBQVd0SVFBRnJTRUFCYTBoQUFXdElRQUZyU0VBQmEwaEFBV3RJUUFGclNFQUJhMGhBQVd0SVFBRnJTRUFCYTBoQUFXdElRQUZyU0VBQmEwaEFBV3RJUUFGclNFQUJhMGhBQVd0SVFBRnJTRUFCYTBoQUFXdElRQUZyU0VBQmEwaEFBV3RJUUFGclNFQUJhMGhBQVd0SVFBRnJTRUFCYTBoQUFXdElRQUZyU0VBQmEwaEFBV3RJUUFGclNFQUJhMGhBQVd0SVFBRnJTRUFCYTBoQUFXdElRQUZyU0VBQmEwaEFBV3RJUUFGclNFQUJhMGhBQVd0SVFBRnJTRUFCYTBoQUFXdElRQUZyU0VBQmEwaEFBV3RJUUFGclNFQUJhMGhBQVd0SVFBRnJTRUFCYTBoQUFXdElRQUZyU0VBQmEwaEFBV3RJUUFGclNFQUJhMGhBQVd0SVFBRnJTRUFCYTBoQUFXdElRQUZyU0VBQmEwaEFBV3RJUUFGclNFQUJhMGhBQVd0SVFBRmJ3UDkzL0Fxb2FrMlU4Tm9pd0FBQUFBRWxGVGtTdVFtQ0MiIHByZXNlcnZlQXNwZWN0UmF0aW89Im5vbmUiIHdpZHRoPSIzMDAiIGhlaWdodD0iMzAwIi8+DQo8L2c+DQo8L3N2Zz4NCg=='; +export const ledgerWallet = + 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/Pg0KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjAvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvMjAwMS9SRUMtU1ZHLTIwMDEwOTA0L0RURC9zdmcxMC5kdGQiPg0KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiBpZD0iYm9keV8xIiB3aWR0aD0iNDAwIiBoZWlnaHQ9IjQwMCI+DQoNCjxnIHRyYW5zZm9ybT0ibWF0cml4KDEuMzMzMzMzNCAwIDAgMS4zMzMzMzM0IDAgMCkiPg0KCTxpbWFnZSAgeD0iMCIgeT0iMCIgeGxpbms6aHJlZj0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFaQUFBQUdRQ0FZQUFBQ0F2emJNQUFBQUFYTlNSMElBcnM0YzZRQUFBQVJuUVUxQkFBQ3hqd3Y4WVFVQUFBQUpjRWhaY3dBQURzTUFBQTdEQWNkdnFHUUFBQnJ5U1VSQlZIaGU3ZHpianlWVjJUL3dWK2M4QXdOb2pDTElTUmlHczVCNDUzK2hKc1lMTDd3anhrUkR2TkE3WTR6ZUdZMW9FQWhJUXRERVF6d1ROUVpKRkExZUdJTVJoNUVCUkdBNEtFWVlaZ2FHZW45UC9WajlybXFlNmRYdFZEZFZ1ejhyK1dTdi9hVjdoMXExMW5xcTl0NDkvL1AvV2djQS80VTBCSUNXTkFTQWxqUUVnSlkwQklDV05BU0FsalFFZ0pZMEJJQ1dOQVNBbGpRRWdKWTBCSUNXTkFTQWxqUUVnSlkwQklDV05BU0FsalFFZ0pZMEJJQ1dOQVNBbGpRRWdKWTBCSUNXTkFTQWxqUUVnSlkwQklDV05BU0FsalFFZ0pZMEJJQ1dOQVNBbGpRRWdKWTBCSUNXTkFTQWxqUUVnSlkwQklDV05BU0FsalFFZ0pZMEJJQ1dOQVNBbGpRRWdKWTBCSUNXTkFTQWxqUUVnSlkwQklDV05BU0FsalFFZ0pZMEJJQ1dOQVNBbGpRRWdKWTBCSUNXTkFTQWxqUUVnSlkwQklDV05BU0FsalFFZ0pZMEJJQ1dOQVNBbGpRRWdKWTBCSUNXTkFTQWxqUUVnSlkwQklDV05BU0FsalFFZ0pZMEJJQ1dOQVNBbGpRRWdKWTBCSUNXTkFTQWxqUUVnSlkwQklDV05BU0FsalFFZ0pZMEJJQ1dOQVNBbGpRRWdKWTBCSUNXTkFTQWxqUUVnSlkwQklDV05BU0FsalFFZ0pZMEJJQ1dOQVNBbGpRRWdKWTBCSUNXTkFTQWxqUUVnSlkwQklDV05BU0FsalFFZ0pZMEJJQ1dOQVNBbGpRRWdKWTBCSUNXTkFTQWxqUUVnSlkwQklDV05BU0FsalFFZ0pZMEJJQ1dOQVNBbGpRRWdKWTBCSUNXTkFTQWxqUUVnSlkwQklDV05HUkVXN1pzV2VwdjNicTFmOXk3ZCs5U3hzbnQzTG16ZjR3eDNMRmpSOS9mdFd0WC8vaW1ONzFwNmVmbUtvNmh6SWxRNWtya2kzQjg2KzNOYjM1elB5OWlyT28xdFczYnRzSFBzVzdTa0pIVW04UDI3ZHNIL2JJaGNuS3hRZFRGbzJSRi9iTnpWQXBHT2I3eWZCR09iU1BWNDFVS2I3M2VXRGRweURvb1YwVVhYbmhoZCs2NTUzYm5uWGRlMytmazN2bk9kM2FYWEhKSjcvenp6Kzh1dmZUU2ZneVhYN25QVlNrYzczM3ZlL3M1Y2M0NTUvVEgvTzUzdjd2YnQyOWZPaWI4bjVnVFYxNTVaVCtHVVh4Mzc5NjlkTmZLaGtoRFJoSWJYVndkeFdZWGI3MWNmdm5sM2E5KzlhdnV3UWNmN0I1NTVKSHUwS0ZEck9DaGh4N3Evdjczdi9mOWh4OSt1THYvL3Z1N2E2Kzl0dDhrRnVFdG5qaUdLSTUvL3ZPZnU4Y2VlNng3K3VtbisrTThjT0JBbnkwZkQ0Wml6R0tPeEh5b0MwZGNyTG5EM3hCcHlFaGlneWh2UzRSM3ZldGQvYVF2N2RWWFgyVUZMNy84Y3Y5NDdOaXhmcnorK2M5L2RwZGRkdGxnak9jczVzZisvZnU3NDhlUGQ2Kzg4a3AvckMrOTlGSjM0c1NKL25qcnNlRDFZc3hDak9XZVBYdjY4WXhDc2doM3B6T1Job3dvcm9iaTFqckVadkg0NDQvM0c4YlJvMGY3VFVKcnR4aXJHTE5ubm5tbXUrcXFxL3JONGkxdmVVczYzbk1UYjFmRkpoakZNbHIwdGRXM3VMaUl0UlZqR1lWaitlZEpyS3MwWkdSeFpSVGlQZHU0NVM0dHU2cmkvOFRWZUJtbmFIRUhFZ1VrRytNNWlnM3ZpaXV1NkkrdHZ1dUlJaElGc3g0TFhpL0dLUXBJS1JyMUhiOXZZbTJJTkdRa3NVR0VtTmp4UEFySXdZTUgrNDNDSGNqcVdtd1VzVW5FNCtIRGg3dXJyNzY2SDg5RmVZODdDbUswNVc5YmFlMVczdHFNY1l4dlhjVzg4QTIyRFpXR2pLUVVqaEFUT3dwSWZFZ2FiVFdiUkZrZzljK1c5OHVqbGMxbVVVV0w0NDBXeC96a2swLzIzN3FweDNYdTRsdFhwY1V4eGx0WjVlMnNiRXdXU1RtM01jL0xNWmRXN2o1WDA4cFlMdEs4bUlrMFpDU25Xa0NpeGMvRjFXa3NzUG90bmVVTGJwRmJ1VHFQYnltVnQ3QVdZYk9JdDFuaWM3RTRyMlV6amJiYXVUSDN0dnc0WXh6SzUxM2xuSyttbGZGVVFEWmNHaktTVXkwZ2NVVWFpNnI4N0FzdnZOQS94aFZiS1NxTHJCeHZlWXdQMGErNTVwckJHTS9kZGRkZDEyK2E1YTZ5blBQWVJMTXhXU1F4aitQWXk5dTU1WTY3WENpdHRwV3hWRUEyWEJveWtqRUtTTFN5c01yenRTNnd1YmI2dUdPOG5uMzIyZjRPSks3Y0YrVzk3dVVmb20vR3RueWVyL1h6d1RLV0NzaUdTME5HY3FvRnBMeXQ4Znp6ejNkSGpoeFoybVRLRlZ3c3ZFVVdZeFRLMVdyY2djVFhYbU5jRitGcm1sRUk0MitEb3NXNWptTXQ1empPZHpZbWl5WmFPYzh2dnZoaS94am4ybHRZczVDR2pHU3NBaEp0K1lJcWkyL1JXOWxVb2ozMzNITkwvM1RGSW9nNWNkRkZGdzNtUWpubm0rSDhsdU91ajdYMEZaQlpTRU5HY3FvRkpPNDh2djN0YjNjLy9lbFB1eC8vK01mZGQ3LzczZTQ3My9sTzk2TWYvYWo3L3ZlLzMyZUxMSTQ3anZtSFAveGhmOHkzM1haYi84L0JMTXBmR3NmOGlIOFQ3YzQ3Nyt5Kzk3M3Y5Y2NaNS9mdXUrL3Vmdjd6bjZkanNraCs5ck9mOWVLWVl6Ny81Q2MvNmU2NjY2NytuNjlaUzZ2SHN4NWYxbDBhTXBKVExTQy8vT1V2bC82T3BMeGxFLzNJTnN1L05scS9WWFd5L2x5VmY1cStQSmJQZGtMOWM0dXMvb08vT0tmeDl6MjMzSExMbXU3QXl1OHJJQnN1RFJuSnFSYVFlKzY1WitsMXltdkY0MmJhWUZoYzlmcW8rN2ZmZnZ1cTFrZHAyV3V3SWRLUWtkUVRXZ0dCb1hwOTFIMEZaRGJTa0pIVUUxb0JnYUY2ZmRSOUJXUTIwcENSMUJOYUFZR2hlbjNVZlFWa050S1FrZFFUV2dHQm9YcDkxSDBGWkRiU2tKSFVFMW9CZ2FGNmZkUjlCV1EyMHBDUjFCTmFBWUdoZW4zVWZRVmtOdEtRa2RRVFdnR0JvWHA5MUgwRlpEYlNrSkhVRTFvQmdhRjZmZFI5QldRMjBwQ1IxQk5hQVlHaGVuM1VmUVZrTnRLUWtkUVRXZ0dCb1hwOTFIMEZaRGJTa0pIVUUxb0JnYUY2ZmRSOUJXUTIwcENSMUJOYUFZR2hlbjNVZlFWa050S1FrZFFUV2dHQm9YcDkxSDBGWkRiU2tKSFVFMW9CZ2FGNmZkUjlCV1EyMHBDUjFCTmFBWUdoZW4zVWZRVmtOdEtRa2RRVFdnR0JvWHA5MUgwRlpEYlNrSkhVRTFvQmdhRjZmZFI5QldRMjBwQ1IxQk5hQVlHaGVuM1VmUVZrTnRLUWtkUVRXZ0dCb1hwOTFIMEZaRGJTa0pIVUUxb0JnYUY2ZmRSOUJXUTIwcENSMUJOYUFZR2hlbjNVZlFWa050S1FrZFFUV2dHQm9YcDkxSDBGWkRiU2tKSFVFMW9CZ2FGNmZkUjlCV1EyMHBDUjFCTmFBWUdoZW4zVWZRVmtOdEtRa2RRVFdnR0JvWHA5MUgwRlpEYlNrSkhVRTFvQmdhRjZmZFI5QldRMjBwQ1IxQk5hQVlHaGVuM1VmUVZrTnRLUWtkUVRXZ0dCb1hwOTFIMEZaRGJTa0pIVUUxb0JnYUY2ZmRSOUJXUTIwcENSMUJOYUFZR2hlbjNVZlFWa050S1FrZFFUV2dHQm9YcDkxSDBGWkRiU2tKRnMzYnExMjdKbFM5K1B5WDN4eFJkM2p6NzZhTDg0VHB3NDhkcjBQM203OTk1Nys5L2Z0bTNiMG10R2Y3TVVrUmkvT041NC9HK090NHhWUE83WXNjTUdNMUZ4ZnJkdjM5N1A5VGhITjk5ODg2cldSMm54R25GKzR6RmV3d1hXaGtsRFJsUnZmaGRjY01GU0FUbDI3RmovdUpKZi9PSVhTNjhSQzZ4ZUdKR1YvbVlReDc5cjE2Nmw4U3pGWVNYWjY4VHZ4V3RsLzQyTnRYdjM3cVdpVWJJNFAzZmNjY2RycFdIbEZtc2tXcjAyeW12RjY1VFhaTjJrSVNNcUcxMzB6enZ2dk83UW9VUDlwRjlOKzgxdmZyUDBPdlVDMlN6RjQ0d3p6amlsalNER2F1Zk9uYjE0bmMxV2RPY2d6bEhjUGRUek8rNUFYbnJwcGRkV3djbmI4ZVBIdTZOSGp5NzlicnhPbk92b2w0eDFsWWFNSkRhdE1wSGpTdXVpaXk3cURodzQwRS82dUVWZmZzZXgzSzkvL2V2WDNaTEg4ejE3OWl3OVgzUng3T1g0b3dERVZXdHNFckhSdEN4L25ib1l1UXVaam5wK1J6OCtBNGtXYTJRbHBaWGZqWE5lTGhLYzN3MlJocXlEMkx6Mjc5L2ZQZjc0NDY5TiszYTcrKzY3K3dVVmk2SitENys4MzdzWlpNVmd0ZUl0cnlpNDVYbU1ZMWhlVEhoanhNVkEvYnljNXh0dnZMRTdjdVRJYTZ2ZzVPM1paNS90SCtOM050TkYxWVNrSVNPSnphdTh6eHZQeno3NzdPNXZmL3RiZi9WVTdrSldjdDk5OS9XYllQeHV1ZnFPZm4zRnRzanFUVDZLWnJtcWpPT1BEU01lVjFKK05zYXRGTjBZUjFlbjB4RG5JaDdqSE5XRi90WmJiKzBMUTNaWFhpc3RmaWZPY1JTZ2VKMzZ0VmhYYWNpSVlsTEhRb20zWGZidDI3ZW16MEIrOElNZkRLN1NTakVwbStObVVRcENrZjFNcHI0cXJlL2FOdE1kM0pTVk80NTZ3NCtMaHR0dXU2My9ra21yUlJFNWZQandZSTNFYThacmxPTEV1a3BEUmxJKzBJdEpYYTU2UC8zcFQzYzMzSEJEOTZsUGZhcjd6R2MrczZMcnI3KysvNTNZQ09NMXlvTGJUSXNqTm9keXZIRUg5K0VQZjdqNzNPYysxMzNoQzEvb1B2LzV6Ni9vWXgvN1dIZk9PZWYwdnh2alh6WXFkeURURWhjRmNXN0tlbm4vKzkvZmZmS1RuK3crOFlsUHJPampILzk0djA3SzJpaS9IOHBhWVYybElVelM2YWVmM3YzKzk3OS83ZnF6M2Y3eWw3LzBSYWZlVE1vZGpBMEdUbGthd2lRcElEQXBhUWlUcElEQXBLUWhUSklDQXBPU2hqQkpDZ2hNU2hyQ0pDa2dNQ2xwQ0pPa2dNQ2twQ0ZNa2dJQ2s1S0dNRWtLQ0V4S0dzSWtLU0F3S1drSWs2U0F3S1NrSVV5U0FnS1Rrb1l3U1FvSVRFb2F3aVFwSURBcGFRaVRwSURBcEtRaFRKSUNBcE9TaGpCSkNnaE1TaHJDSkNrZ01DbHBDSk9rZ01Da3BDRk1rZ0lDazVLR01Fa0tDRXhLR3NJa0tTQXdLV2tJazZTQXdLU2tJVXlTQWdLVGtvWXdTUW9JVEVvYXdpUXBJREFwYVFpVHBJREFwS1FoVEpJQ0FwT1NoakJKQ2doTVNockNKQ2tnTUNscENKT2tnTUNrcENGTWtnSUNrNUtHTUVrS0NFeEtHc0lrS1NBd0tXa0lrNlNBd0tTa0lVeVNBZ0tUa29Zd1NRb0lURW9hd2lRcElEQXBhUWlUcElEQXBLUWhUSklDQXBPU2hqQkpDZ2hNU2hyQ0pDa2dNQ2xwQ0pPa2dNQ2twQ0ZNa2dJQ2s1S0dNRWtLQ0V4S0dzSWtLU0F3S1drSWs2U0F3S1NrSVV5U0FnS1Rrb1l3U1FvSVRFb2F3aVFwSURBcGFRaVRwSURBcEtRaFRKSUNBcE9TaGpCSkNnaE1TaHJDSkNrZ01DbHBDSk9rZ01Da3BDRk1rZ0lDazVLR01Fa0tDRXhLR3NJa0tTQXdLV2tJazZTQXdLU2tJVXlTQWdLVGtvWXdTUW9JVEVvYXdpUXBJREFwYVFpVHBJREFwS1FoVEpJQ0FwT1NoakJKYXkwZ0R6endRUGUydDcydC85MG9HSFh4MkxadDIrQzEzeWhidG16cC8zKzJiOS9lUDYvN01IRnBDSk8wMWdMeThNTVBkK2VmZjM2M1k4ZU8xOTF4eFBNMzJ0YXRXMTlYUUtMSVJWNy92OEpFcFNGTTBsb0x5Si8rOUtmdXJMUE82bjgzN2poaWs5NjllM2YvUERidCtyWGZhRkZJU2o4S25pTENES1FoVE5KYUM4ampqei9lWFhEQkJZUFhLQnR6RkpMNmJ1Q05FUDh2NWM2akxoaVI3ZHk1YytrNVRGUWF3aVN0dFlEY2Q5OTkzZnZlOTc1dS8vNzkzU1dYWE5LZGQ5NTUzYjU5Ky9ySHlDNisrT0kzMUVVWFhkUS94ckZGd1lqanErOUVZT0xTRUNacHJRVWsybC8vK3RmdXFhZWU2ZzRmUHR3OSt1aWozYlBQUHR2Zm1jVG5JNDg5OXRnYkt2NC83cjc3N3FVUCtvdTRHOW0xYTljZ2d3bEtRNWlrdFJhUWwxOSt1VHQrL0hqZmYrV1ZWN29qUjQ1MEowNmM2SjlQcFIwNGNHQ3BXTVJiVjFFODRvUDA4bzB4bUxBMGhFbjZiKzVBb2gwOWV2UzEzdjh2S3FXOSt1cXJiNmo0ZjRrN2tYSjg5VmVMRlJCbUlBMFpVYnluWGIrdnZmeDVTL21RTlg0bnZwMVQ4cW44SGNONld2N0I4aGxubkxGVVFPSk9JdHVVNStiZ3dZTkx4MWlLUmpubml5N21kSHlab0R3dlh5d0lkWDR5WlIyVk83Zm94Kyt0WlgxeFN0S1FrY1dramcyLy91WlA5bk9yRVl1bHZFNzIzeGRKSEdOZFJLSi8vLzMzOXdWa0VWcThyUllGcFA0N2xWSkU2dU5lZERHbjQyMjh0UmJPR0tQeWJiVVl0eWdjbTJuY0ppQU5HY21lUFh2Nng3STUxSk03Sm56a0s0a0ZFVTQ3N2JTbHYxK0kzOXNzVjZnaENtK01XMnd3TVFaLy9PTWZsemJmdUF1WnMzaHI3Y0VISDF3NjMzR2NjYTdqdU9QNThyRllOTXYvd0xNVXo1anpVUmpLdUp4TS9GejVPNS95dTRXdlFXK0lOR1FrTWNsallrY2hpWDY1YzhqK01ub2w4UnJMRjBnc252cjVJb3BDV1RhQ09ONTQvcnZmL2E3L01EeDdPMmh1b2ozeHhCT3ZPK1o0M0N4dlVhNWxIYXdrNWtjbzYyVDVlbUZkcENFaktaTzRiQXIxcEY3TndvbmZxKzlhWW9IVTM5Z3ArU0lyRzJtTVhYd0dFbjlkdmlqdCtlZWY3dzRkT3JSMG5PV2lJQjdIMmxpbkx1WjNYU3hqWHNlRjFtcSt4dnlPZDd5akg2ZjZaK3Npd3JwTFEwWlNUK1NZMkdWeXgyUGNsVVIvSmZGN3NjRDI3dDI3OUJybHJhem9sOWRlWkhFSFVvcm9tV2VlMmYzaEQzL29qaDA3dHZTVjNEbUw5c2dqai9USEYrZTdiS1NyMlR3WFFSeDNPYmRGakVFcG5zdlh3M0xsNStJMTZvSmIxbHA1enJwSlEwWVNpMkg1NXlCUkRHTHkxejkzTW5IRkhZK3hHTXJtVW41MytjSmJaT1ZZenozMzNPN2VlKzhkZkMxM3ppM2V4dnJ0YjMvYmZ6MjVIR3U1b3Q0TTU3Y3VGREcveTl5T3ZLeWJsY1RQdmYzdGIrLzdjV0VWZHk5bG5aVFhabDJsSVNPS3ErYlNqMzlDNDdPZi9XejN6Vzkrczd2OTl0dTdXMis5ZFVVMzNIREQwa0lxZHg1bFlXeUdCVksrdGh5UDVZcnlneC84WVBlUmozeWsrK2hIUHpwNzExOS9mZmVoRDMyb1A2N1krT0p1cTJ5QW0wWE00emkvNWJpam1IN2dBeDlJMThOeU45MTBVM2ZqalRmMmM2T3NoMUo0VjN1UnhpbEpRMFpTYi9JeG9lT2ZGbzkvUXFOY2ZiYmFQZmZjcy9RNjViWGkwZUpnRWRUcm8rN0h4ZFZxMWtkcDJXdXdJZEtRa2RRVFdnR0JvWHA5MUgwRlpEYlNrSkhVRTFvQmdhRjZmZFI5QldRMjBwQ1IxQk5hQVlHaGVuM1VmUVZrTnRLUWtkUVRXZ0dCb1hwOTFIMEZaRGJTa0pIVUUxb0JnYUY2ZmRSOUJXUTIwcENSMUJOYUFZR2hlbjNVZlFWa050S1FrZFFUV2dHQm9YcDkxSDBGWkRiU2tKSFVFMW9CZ2FGNmZkUjlCV1EyMHBDUjFCTmFBWUdoZW4zVWZRVmtOdEtRa2RRVFdnR0JvWHA5MUgwRlpEYlNrSkhVRTFvQmdhRjZmZFI5QldRMjBwQ1IxQk5hQVlHaGVuM1VmUVZrTnRLUWtkUVRXZ0dCb1hwOTFIMEZaRGJTa0pIVUUxb0JnYUY2ZmRSOUJXUTIwcENSMUJOYUFZR2hlbjNVZlFWa050S1FrZFFUV2dHQm9YcDkxSDBGWkRiU2tKSFVFMW9CZ2FGNmZkUjlCV1EyMHBDUjFCTmFBWUdoZW4zVWZRVmtOdEtRa2RRVFdnR0JvWHA5MUgwRlpEYlNrSkhVRTFvQmdhRjZmZFI5QldRMjBwQ1IxQk5hQVlHaGVuM1VmUVZrTnRLUWtkUVRXZ0dCb1hwOTFIMEZaRGJTa0pIVUUxb0JnYUY2ZmRSOUJXUTIwcENSMUJOYUFZR2hlbjNVZlFWa050S1FrZFFUV2dHQm9YcDkxSDBGWkRiU2tKSFVFMW9CZ2FGNmZkUjlCV1EyMHBDUjFCTmFBWUdoZW4zVWZRVmtOdEtRa2RRVFdnR0JvWHA5MUgwRlpEYlNrSkhVRTFvQmdhRjZmZFI5QldRMjBwQ1IxQk5hQVlHaGVuM1VmUVZrTnRLUWtkUVRXZ0dCb1hwOTFIMEZaRGJTa0pIVUUxb0JnYUY2ZmRSOUJXUTIwcENSMUJOYUFZR2hlbjNVZlFWa050S1FrZFFUV2dHQm9YcDkxSDBGWkRiU2tKSFVFMW9CZ2FGNmZkUjlCV1EyMHBDUjFCTmFBWUdoZW4zVWZRVmtOdEtRa2RRVFdnR0JvWHA5MUgwRlpEYlNrSkhVRTFvQmdhRjZmZFI5QldRMjBwQ1IxQk5hQVlHaGVuM1VmUVZrTnRLUWtkUVQrcjhwSUFjUEh1eHV2dm5tN290Zi9HTC8rTld2ZnJYNzBwZSsxSDN0YTEvcnZ2emxML2ZQRjlsWHZ2S1Y3aHZmK0VaMzQ0MDM5bU1ReDN6bW1XY3V6RWF4YmR1MmJ1L2V2ZDFkZDkzVjNYVFRUZDNYdi83MS9qemZlZWVkM1MyMzNOSnZwSXNzNW5FYzV4MTMzTkhkZHR0dC9SaDg2MXZmNmg1NDRJSFhWc0RxV2hsUEJXVERwU0VqT2RVQ0V1MmxsMTdxVHB3NDBmZVBIeisrMUk4OFhtT1J4YkcrL1BMTDNTdXZ2TklkUFhxMGUrcXBwN3JycnJ1dTI3SmxTNjhlNnptSytYSGxsVmQyTDc3NFluOU82eGJIRzhlL3lLTEZlWTV6SEkvUklvL3p2WlpXajJjOXZxeTdOR1FrcDFwQS92T2YvL1NMcTdRalI0NHNMYnkxTHJLNXR2cjRuMy8rK2U3eXl5OS8zZGpPMlJWWFhORVhpMmh4Ym84ZE85YjNOMHVMaTZMbHh4elBZNjZ2dHBXeFZFQTJYQm95a2xNdElLWEZ4bEt1eE10anRIaU5SUmJIR3FJZkc4MFRUenpSWFgzMTFkM1dyVnU3M2J0M0Q4WjZqdUl1S3U1QTR0aEtLOGNlNXpqTysyWlFqamtySnF0cFpUd1ZrQTJYaG94a2pBSlNGbGJkTnN2ZFIyd3VwVVVoZWZMSko3dHJycmxtTU1aemQ4a2xseXpkZ1pRV3g3MVp6bkcwNVd1aEZKYlZ0aktXQ3NpR1MwTkdjcW9GcEh6T0VZc3Bpa2haVlBFWWVXd3lpeXhhRkk3UzRpMnMrQXdreGpJK2dLN0hlbzYyYjkvZXY0VlZ6bVc4YlJOWDRNc3ZHQmExeFhHR2NwZFp0OVdzajlMS2VDb2dHeTROR2NtcEZwRDZaMktEaVN2VnRTeXNSV2hsZzRualAzejRjSGZaWlpmMTQ3a0lINktIdUFOWjNrcnhMRmZpaTZwdThieWM2K1gvcmRYS1dDb2dHeTROR2NtcEZwQ3lxTXJQeG1OazhWaGZtUzl5SzhjZXh4MEY1S3FycmxvYXp6SzJjeFYzVWZ2MjdldlBaUkZ0czV6YmFIRitvMkNXb2xuYVdzYWdqS2NDc3VIU2tKSEVWWEpzZE9WcU9iNUI5TkJERC9XVFBncUR0bklybTBpNTgzcjY2YWY3RDUxakxCZmhMYXh3NmFXWDlzZFliNkJsUTQxajV1U2l4WVZGckxINmdtTEhqaDBMY1lFeEEybkl5R0pDeCtPRkYxN1lQZkxJSTBzYlkweCtUbTU1ZSs2NTUvb3I5dVhqTzFkeFlSRjNwZEhpZ2lJc3Z4TFgycTFjcE1XMzgzYnQycFdPTmVzaURSbEptY3d4d2VQMmV2LysvZDAvL3ZHUDdvVVhYbmh0Nm1zcnRkaFF5emVVb3VnKzg4d3ozWHZlODU2RnVjS01EZS9zczgvdWp5K090UlRPdUxxTzR5NTNJdVJpbkdLODZydlIrR0pDUEM3QzE3eG5JQTBaVVV6b2NnY1NCU1R1UUVvckd3YTVhUC82MTcrV2lraDhqZmZhYTYvdHgzSlIzdStPYjJIRm5WVWNZM3dMSzc1cEZvOVJNT012MURtNStNYmF2Ly85NzM0Y280aVU0dkhXdDc1MU1NYXNtelJrSktlZGRsci9HSnZkbmoxNytxdm1jdVZjK3B4Y2pGT01XN21hM0xsejU5TGpJbndHVW80bi9uMnZrc1Z4K1RCNDlVclJLTXBZbm5YV1dZT2NkWkdHakNnMndySXBsSTNCN2ZYcXhPWlF2b0FRNHhoditaVC9WZ3JNM0oxKyt1bXZ5MktlZUMrL3JaNERjWmRmUGdjcGQveXN1elJrSlBVbUVKTTlKblpzRG1YaWw2SkNyb3hkS1J3eGJsRlVvaUNYd2pKM1piT0w0eTNIVnY3Yjh2RmdLT1pBUE1hOHFDOHVvbDgvWjkya0lTT0p5UjJQTWRGTDBTZ2JSTDFSa0N0djhaUzNBaGR0ek1vbUY0OWxyb1N5UWJLeWVyektHTVkvangrWjliVWgwaEFBV3RJUUFGclNFQUJhMGhBQVd0SVFBRnJTRUFCYTBoQUFXdElRQUZyU0VBQmEwaEFBV3RJUUFGclNFQUJhMGhBQVd0SVFBRnJTRUFCYTBoQUFXdElRQUZyU0VBQmEwaEFBV3RJUUFGclNFQUJhMGhBQVd0SVFBRnJTRUFCYTBoQUFXdElRQUZyU0VBQmEwaEFBV3RJUUFGclNFQUJhMGhBQVd0SVFBRnJTRUFCYTBoQUFXdElRQUZyU0VBQmEwaEFBV3RJUUFGclNFQUJhMGhBQVd0SVFBRnJTRUFCYTBoQUFXdElRQUZyU0VBQmEwaEFBV3RJUUFGclNFQUJhMGhBQVd0SVFBRnJTRUFCYTBoQUFXdElRQUZyU0VBQmEwaEFBV3RJUUFGclNFQUJhMGhBQVd0SVFBRnJTRUFCYTBoQUFXdElRQUZyU0VBQmEwaEFBV3RJUUFGclNFQUJhMGhBQVd0SVFBRnJTRUFCYTBoQUFXdElRQUZyU0VBQmEwaEFBV3RJUUFGclNFQUJhMGhBQVd0SVFBRnJTRUFCYTBoQUFXdElRQUZyU0VBQmEwaEFBV3RJUUFGclNFQUJhMGhBQVd0SVFBRnJTRUFCYTBoQUFXdElRQUZyU0VBQmEwaEFBV3RJUUFGclNFQUJhMGhBQVd0SVFBRnJTRUFCYTBoQUFXdElRQUZyU0VBQmEwaEFBV3RJUUFGclNFQUJhMGhBQVd0SVFBRmJ3UDkzL0Fxb2FrMlU4Tm9pd0FBQUFBRWxGVGtTdVFtQ0MiIHByZXNlcnZlQXNwZWN0UmF0aW89Im5vbmUiIHdpZHRoPSIzMDAiIGhlaWdodD0iMzAwIi8+DQo8L2c+DQo8L3N2Zz4NCg=='; diff --git a/packages/core/src/config/logos/generated/mimirWallet.ts b/packages/core/src/config/logos/generated/mimirWallet.ts index 998a20e..d9b4cd6 100644 --- a/packages/core/src/config/logos/generated/mimirWallet.ts +++ b/packages/core/src/config/logos/generated/mimirWallet.ts @@ -3,4 +3,5 @@ // Do not edit. Auto-generated via node scripts/convertLogos.mjs -export const mimirWallet = 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiB2aWV3Qm94PSIwIDAgMjQgMjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgY2xhc3M9Ik1pbWlyIgogICAgIGFsdD0iTWltaXIiPgogICAgPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAwXzExMzMyXzQwNTI5KSI+CiAgICAgICAgPHBhdGggZD0iTTAgNi42MjA2OUMwIDIuOTY0MTggMi45NjQxOCAwIDYuNjIwNjkgMEgxNy4zNzkzQzIxLjAzNTggMCAyNCAyLjk2NDE4IDI0IDYuNjIwNjlWMTcuMzc5M0MyNCAyMS4wMzU4IDIxLjAzNTggMjQgMTcuMzc5MyAyNEg2LjYyMDY5QzIuOTY0MTggMjQgMCAyMS4wMzU4IDAgMTcuMzc5M1Y2LjYyMDY5WiIKICAgICAgICAgICAgICBmaWxsPSIjM0MxOUZEIj48L3BhdGg+CiAgICAgICAgPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiCiAgICAgICAgICAgICAgZD0iTTE4LjY4OTQgOS4yNTQyNUwxOC42ODkzIDE5LjE2ODNIMTUuNzM0OUwxNS43MzQ5IDE0LjM1ODVDMTQuNjc1MSAxNS4yMDE1IDEzLjQyNjggMTUuNjQwNyAxMiAxNS42NDA3QzEwLjU3MzIgMTUuNjQwNyA5LjMyNDkgMTUuMjAxNSA4LjI2NTA1IDE0LjM1ODVMOC4yNjUxNCAxOS4xNjgzSDUuMzEwN0w1LjMxMDcyIDkuMjU0MzJDNS43NDIyOCA5LjUxNjA0IDYuMjQ3NjggOS42NjY1MSA2Ljc4NzkyIDkuNjY2NTFDNy4zMjgxNiA5LjY2NjUxIDcuODMzNTUgOS41MTYwNCA4LjI2NTEyIDkuMjU0MzNMOC4yNjUwNiA5LjM1NDM4QzkuMTkxNzYgMTEuNjk1MiAxMC40MDg3IDEyLjcxNzEgMTIgMTIuNzE3MUMxMy41OTEzIDEyLjcxNzEgMTQuODA4MyAxMS42OTUyIDE1LjczNDkgOS4zNTQzOEwxNS43MzQ5IDkuMjU0MzNDMTYuMTY2NCA5LjUxNjA0IDE2LjY3MTggOS42NjY1MSAxNy4yMTIxIDkuNjY2NTFDMTcuNzUyNCA5LjY2NjUxIDE4LjI1NzggOS41MTYwMiAxOC42ODk0IDkuMjU0MjVaTTYuNzg3OTIgOC41NDIwOEM3Ljc1NzcxIDguNTQyMDggOC41NDM4NiA3Ljc0OTE2IDguNTQzODYgNi43NzEwNEM4LjU0Mzg2IDUuNzkyOTMgNy43NTc3MSA1IDYuNzg3OTIgNUM1LjgxODE0IDUgNS4wMzE5OCA1Ljc5MjkzIDUuMDMxOTggNi43NzEwNEM1LjAzMTk4IDcuNzQ5MTYgNS44MTgxNCA4LjU0MjA4IDYuNzg3OTIgOC41NDIwOFpNMTcuMjEyMSA4LjU0MjA4QzE4LjE4MTkgOC41NDIwOCAxOC45NjggNy43NDkxNiAxOC45NjggNi43NzEwNEMxOC45NjggNS43OTI5MyAxOC4xODE5IDUgMTcuMjEyMSA1QzE2LjI0MjMgNSAxNS40NTYxIDUuNzkyOTMgMTUuNDU2MSA2Ljc3MTA0QzE1LjQ1NjEgNy43NDkxNiAxNi4yNDIzIDguNTQyMDggMTcuMjEyMSA4LjU0MjA4WiIKICAgICAgICAgICAgICBmaWxsPSJ3aGl0ZSI+PC9wYXRoPgogICAgPC9nPgogICAgPGRlZnM+CiAgICAgICAgPGNsaXBQYXRoIGlkPSJjbGlwMF8xMTMzMl80MDUyOSI+CiAgICAgICAgICAgIDxyZWN0IHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0id2hpdGUiPjwvcmVjdD4KICAgICAgICA8L2NsaXBQYXRoPgogICAgPC9kZWZzPgo8L3N2Zz4K'; +export const mimirWallet = + 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiB2aWV3Qm94PSIwIDAgMjQgMjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgY2xhc3M9Ik1pbWlyIgogICAgIGFsdD0iTWltaXIiPgogICAgPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAwXzExMzMyXzQwNTI5KSI+CiAgICAgICAgPHBhdGggZD0iTTAgNi42MjA2OUMwIDIuOTY0MTggMi45NjQxOCAwIDYuNjIwNjkgMEgxNy4zNzkzQzIxLjAzNTggMCAyNCAyLjk2NDE4IDI0IDYuNjIwNjlWMTcuMzc5M0MyNCAyMS4wMzU4IDIxLjAzNTggMjQgMTcuMzc5MyAyNEg2LjYyMDY5QzIuOTY0MTggMjQgMCAyMS4wMzU4IDAgMTcuMzc5M1Y2LjYyMDY5WiIKICAgICAgICAgICAgICBmaWxsPSIjM0MxOUZEIj48L3BhdGg+CiAgICAgICAgPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiCiAgICAgICAgICAgICAgZD0iTTE4LjY4OTQgOS4yNTQyNUwxOC42ODkzIDE5LjE2ODNIMTUuNzM0OUwxNS43MzQ5IDE0LjM1ODVDMTQuNjc1MSAxNS4yMDE1IDEzLjQyNjggMTUuNjQwNyAxMiAxNS42NDA3QzEwLjU3MzIgMTUuNjQwNyA5LjMyNDkgMTUuMjAxNSA4LjI2NTA1IDE0LjM1ODVMOC4yNjUxNCAxOS4xNjgzSDUuMzEwN0w1LjMxMDcyIDkuMjU0MzJDNS43NDIyOCA5LjUxNjA0IDYuMjQ3NjggOS42NjY1MSA2Ljc4NzkyIDkuNjY2NTFDNy4zMjgxNiA5LjY2NjUxIDcuODMzNTUgOS41MTYwNCA4LjI2NTEyIDkuMjU0MzNMOC4yNjUwNiA5LjM1NDM4QzkuMTkxNzYgMTEuNjk1MiAxMC40MDg3IDEyLjcxNzEgMTIgMTIuNzE3MUMxMy41OTEzIDEyLjcxNzEgMTQuODA4MyAxMS42OTUyIDE1LjczNDkgOS4zNTQzOEwxNS43MzQ5IDkuMjU0MzNDMTYuMTY2NCA5LjUxNjA0IDE2LjY3MTggOS42NjY1MSAxNy4yMTIxIDkuNjY2NTFDMTcuNzUyNCA5LjY2NjUxIDE4LjI1NzggOS41MTYwMiAxOC42ODk0IDkuMjU0MjVaTTYuNzg3OTIgOC41NDIwOEM3Ljc1NzcxIDguNTQyMDggOC41NDM4NiA3Ljc0OTE2IDguNTQzODYgNi43NzEwNEM4LjU0Mzg2IDUuNzkyOTMgNy43NTc3MSA1IDYuNzg3OTIgNUM1LjgxODE0IDUgNS4wMzE5OCA1Ljc5MjkzIDUuMDMxOTggNi43NzEwNEM1LjAzMTk4IDcuNzQ5MTYgNS44MTgxNCA4LjU0MjA4IDYuNzg3OTIgOC41NDIwOFpNMTcuMjEyMSA4LjU0MjA4QzE4LjE4MTkgOC41NDIwOCAxOC45NjggNy43NDkxNiAxOC45NjggNi43NzEwNEMxOC45NjggNS43OTI5MyAxOC4xODE5IDUgMTcuMjEyMSA1QzE2LjI0MjMgNSAxNS40NTYxIDUuNzkyOTMgMTUuNDU2MSA2Ljc3MTA0QzE1LjQ1NjEgNy43NDkxNiAxNi4yNDIzIDguNTQyMDggMTcuMjEyMSA4LjU0MjA4WiIKICAgICAgICAgICAgICBmaWxsPSJ3aGl0ZSI+PC9wYXRoPgogICAgPC9nPgogICAgPGRlZnM+CiAgICAgICAgPGNsaXBQYXRoIGlkPSJjbGlwMF8xMTMzMl80MDUyOSI+CiAgICAgICAgICAgIDxyZWN0IHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgZmlsbD0id2hpdGUiPjwvcmVjdD4KICAgICAgICA8L2NsaXBQYXRoPgogICAgPC9kZWZzPgo8L3N2Zz4K'; diff --git a/packages/core/src/config/logos/generated/novaWallet.ts b/packages/core/src/config/logos/generated/novaWallet.ts index 599522d..2238571 100644 --- a/packages/core/src/config/logos/generated/novaWallet.ts +++ b/packages/core/src/config/logos/generated/novaWallet.ts @@ -3,4 +3,5 @@ // Do not edit. Auto-generated via node scripts/convertLogos.mjs -export const novaWallet = 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHZpZXdCb3g9IjAgMCAzMiAzMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAwXzQ5NDFfMTEwODEpIj4KPG1hc2sgaWQ9Im1hc2swXzQ5NDFfMTEwODEiIHN0eWxlPSJtYXNrLXR5cGU6YWxwaGEiIG1hc2tVbml0cz0idXNlclNwYWNlT25Vc2UiIHg9IjAiIHk9IjAiIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiI+CjxwYXRoIGQ9Ik0wIDguMzJDMCAzLjcyNDk5IDMuNzI0OTkgMCA4LjMyIDBIMjMuNjhDMjguMjc1IDAgMzIgMy43MjQ5OSAzMiA4LjMyVjIzLjY4QzMyIDI4LjI3NSAyOC4yNzUgMzIgMjMuNjggMzJIOC4zMkMzLjcyNDk5IDMyIDAgMjguMjc1IDAgMjMuNjhWOC4zMloiIGZpbGw9IiNGRjAwMDAiLz4KPC9tYXNrPgo8ZyBtYXNrPSJ1cmwoI21hc2swXzQ5NDFfMTEwODEpIj4KPHJlY3Qgd2lkdGg9IjMyIiBoZWlnaHQ9IjMyIiBmaWxsPSJ1cmwoI3BhaW50MF9yYWRpYWxfNDk0MV8xMTA4MSkiLz4KPC9nPgo8cGF0aCBkPSJNMjcuMjAwMSAxNlYxNi4yOTU3QzI1LjM3MjIgMTYuNTg2OSAyMS40NDc3IDE3LjI2MzQgMTkuNTE2OCAxOC4wMDI2QzE4LjgyNjkgMTguMjY2OSAxOC4yODA0IDE4LjgwOSAxOC4wMTE2IDE5LjQ5NDRDMTcuMjcyNCAyMS40MTY0IDE2LjU4NjkgMjUuMzYzMyAxNi4yOTU3IDI3LjIwMDFIMTUuNzA0NEMxNS40MTMyIDI1LjM2MzMgMTQuNzI3NyAyMS40MTY0IDEzLjk4ODUgMTkuNDk0NEMxMy43MTk3IDE4LjgwOSAxMy4xNjg3IDE4LjI2MjUgMTIuNDgzMiAxOC4wMDI2QzEwLjU1MjQgMTcuMjYzNCA2LjYyNzg5IDE2LjU4NjkgNC44MDAwNSAxNi4yOTU3VjE1LjcwNDRDNi42Mjc4OSAxNS40MTMyIDEwLjU1MjQgMTQuNzM2NyAxMi40ODMyIDEzLjk5NzVDMTMuMTczMiAxMy43MzMyIDEzLjcxOTcgMTMuMTkxMSAxMy45ODg1IDEyLjUwNTdDMTQuNzI3NyAxMC41ODM3IDE1LjQxMzIgNi42MzY4NSAxNS43MDQ0IDQuODAwMDVIMTYuMjk1N0MxNi41ODY5IDYuNjM2ODUgMTcuMjcyNCAxMC41ODM3IDE4LjAxMTYgMTIuNTA1N0MxOC4yODA0IDEzLjE5MTEgMTguODMxNCAxMy43Mzc2IDE5LjUxNjggMTMuOTk3NUMyMS40NDc3IDE0LjczNjcgMjUuMzcyMiAxNS40MTMyIDI3LjIwMDEgMTUuNzA0NFYxNloiIGZpbGw9IndoaXRlIi8+CjwvZz4KPGRlZnM+CjxyYWRpYWxHcmFkaWVudCBpZD0icGFpbnQwX3JhZGlhbF80OTQxXzExMDgxIiBjeD0iMCIgY3k9IjAiIHI9IjEiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKDAuODA0OTM3IDMwLjIyOTEpIHNjYWxlKDM2LjgwMzUpIj4KPHN0b3Agb2Zmc2V0PSIwLjA1MzMxOTEiIHN0b3AtY29sb3I9IiNEN0QzRTkiLz4KPHN0b3Agb2Zmc2V0PSIwLjE5MzMiIHN0b3AtY29sb3I9IiNBMTlDREUiLz4KPHN0b3Agb2Zmc2V0PSIwLjM4MzQiIHN0b3AtY29sb3I9IiM2OTZCRDkiLz4KPHN0b3Agb2Zmc2V0PSIwLjU0IiBzdG9wLWNvbG9yPSIjM0E1QUU3Ii8+CjxzdG9wIG9mZnNldD0iMC43NzM1IiBzdG9wLWNvbG9yPSIjMjI1RkU3Ii8+CjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzA4ODNEMSIvPgo8L3JhZGlhbEdyYWRpZW50Pgo8Y2xpcFBhdGggaWQ9ImNsaXAwXzQ5NDFfMTEwODEiPgo8cmVjdCB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIGZpbGw9IndoaXRlIi8+CjwvY2xpcFBhdGg+CjwvZGVmcz4KPC9zdmc+Cg=='; +export const novaWallet = + 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHZpZXdCb3g9IjAgMCAzMiAzMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAwXzQ5NDFfMTEwODEpIj4KPG1hc2sgaWQ9Im1hc2swXzQ5NDFfMTEwODEiIHN0eWxlPSJtYXNrLXR5cGU6YWxwaGEiIG1hc2tVbml0cz0idXNlclNwYWNlT25Vc2UiIHg9IjAiIHk9IjAiIHdpZHRoPSIzMiIgaGVpZ2h0PSIzMiI+CjxwYXRoIGQ9Ik0wIDguMzJDMCAzLjcyNDk5IDMuNzI0OTkgMCA4LjMyIDBIMjMuNjhDMjguMjc1IDAgMzIgMy43MjQ5OSAzMiA4LjMyVjIzLjY4QzMyIDI4LjI3NSAyOC4yNzUgMzIgMjMuNjggMzJIOC4zMkMzLjcyNDk5IDMyIDAgMjguMjc1IDAgMjMuNjhWOC4zMloiIGZpbGw9IiNGRjAwMDAiLz4KPC9tYXNrPgo8ZyBtYXNrPSJ1cmwoI21hc2swXzQ5NDFfMTEwODEpIj4KPHJlY3Qgd2lkdGg9IjMyIiBoZWlnaHQ9IjMyIiBmaWxsPSJ1cmwoI3BhaW50MF9yYWRpYWxfNDk0MV8xMTA4MSkiLz4KPC9nPgo8cGF0aCBkPSJNMjcuMjAwMSAxNlYxNi4yOTU3QzI1LjM3MjIgMTYuNTg2OSAyMS40NDc3IDE3LjI2MzQgMTkuNTE2OCAxOC4wMDI2QzE4LjgyNjkgMTguMjY2OSAxOC4yODA0IDE4LjgwOSAxOC4wMTE2IDE5LjQ5NDRDMTcuMjcyNCAyMS40MTY0IDE2LjU4NjkgMjUuMzYzMyAxNi4yOTU3IDI3LjIwMDFIMTUuNzA0NEMxNS40MTMyIDI1LjM2MzMgMTQuNzI3NyAyMS40MTY0IDEzLjk4ODUgMTkuNDk0NEMxMy43MTk3IDE4LjgwOSAxMy4xNjg3IDE4LjI2MjUgMTIuNDgzMiAxOC4wMDI2QzEwLjU1MjQgMTcuMjYzNCA2LjYyNzg5IDE2LjU4NjkgNC44MDAwNSAxNi4yOTU3VjE1LjcwNDRDNi42Mjc4OSAxNS40MTMyIDEwLjU1MjQgMTQuNzM2NyAxMi40ODMyIDEzLjk5NzVDMTMuMTczMiAxMy43MzMyIDEzLjcxOTcgMTMuMTkxMSAxMy45ODg1IDEyLjUwNTdDMTQuNzI3NyAxMC41ODM3IDE1LjQxMzIgNi42MzY4NSAxNS43MDQ0IDQuODAwMDVIMTYuMjk1N0MxNi41ODY5IDYuNjM2ODUgMTcuMjcyNCAxMC41ODM3IDE4LjAxMTYgMTIuNTA1N0MxOC4yODA0IDEzLjE5MTEgMTguODMxNCAxMy43Mzc2IDE5LjUxNjggMTMuOTk3NUMyMS40NDc3IDE0LjczNjcgMjUuMzcyMiAxNS40MTMyIDI3LjIwMDEgMTUuNzA0NFYxNloiIGZpbGw9IndoaXRlIi8+CjwvZz4KPGRlZnM+CjxyYWRpYWxHcmFkaWVudCBpZD0icGFpbnQwX3JhZGlhbF80OTQxXzExMDgxIiBjeD0iMCIgY3k9IjAiIHI9IjEiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIiBncmFkaWVudFRyYW5zZm9ybT0idHJhbnNsYXRlKDAuODA0OTM3IDMwLjIyOTEpIHNjYWxlKDM2LjgwMzUpIj4KPHN0b3Agb2Zmc2V0PSIwLjA1MzMxOTEiIHN0b3AtY29sb3I9IiNEN0QzRTkiLz4KPHN0b3Agb2Zmc2V0PSIwLjE5MzMiIHN0b3AtY29sb3I9IiNBMTlDREUiLz4KPHN0b3Agb2Zmc2V0PSIwLjM4MzQiIHN0b3AtY29sb3I9IiM2OTZCRDkiLz4KPHN0b3Agb2Zmc2V0PSIwLjU0IiBzdG9wLWNvbG9yPSIjM0E1QUU3Ii8+CjxzdG9wIG9mZnNldD0iMC43NzM1IiBzdG9wLWNvbG9yPSIjMjI1RkU3Ii8+CjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzA4ODNEMSIvPgo8L3JhZGlhbEdyYWRpZW50Pgo8Y2xpcFBhdGggaWQ9ImNsaXAwXzQ5NDFfMTEwODEiPgo8cmVjdCB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIGZpbGw9IndoaXRlIi8+CjwvY2xpcFBhdGg+CjwvZGVmcz4KPC9zdmc+Cg=='; diff --git a/packages/core/src/config/logos/generated/paseoChain.ts b/packages/core/src/config/logos/generated/paseoChain.ts index 7742b50..af96aae 100644 --- a/packages/core/src/config/logos/generated/paseoChain.ts +++ b/packages/core/src/config/logos/generated/paseoChain.ts @@ -3,4 +3,5 @@ // Do not edit. Auto-generated via node scripts/convertLogos.mjs -export const paseoChain = 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+CjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iTGF5ZXJfMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeD0iMHB4IiB5PSIwcHgiIHdpZHRoPSI3MHB4IiBoZWlnaHQ9IjcwcHgiIHZpZXdCb3g9IjAgMCA3MCA3MCIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgNzAgNzAiIHhtbDpzcGFjZT0icHJlc2VydmUiPiAgPGltYWdlIGlkPSJpbWFnZTAiIHdpZHRoPSI3MCIgaGVpZ2h0PSI3MCIgeD0iMCIgeT0iMCIKICAgIHhsaW5rOmhyZWY9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRVlBQUFCR0NBTUFBQUJHOEJLMkFBQUFJR05JVWswQUFIb21BQUNBaEFBQStnQUFBSURvCkFBQjFNQUFBNm1BQUFEcVlBQUFYY0p5NlVUd0FBQUlyVUV4VVJRQUFBRE01UURZelB6YzVQemM0UHpnNFB6YzVQemM1UGpjM1BUbzYKT2pjM1BqZzRQemc0UGpnNVBqYzRQalk0UHdBQUFEWTVQRGM1UHpnNVB6ZzRQemMzUGdBQUFEYzRQemM1UHpnNFBqZzRQamc0UGpZNQpQalUxUURnNFBqYzRQamMzUFRNek16ZzRQemM1UGpjM056ZzRQamM0UHpNek16azVPVGc0UGpFeFBUVTFQRGM0UHpnNFB6TTZPaXNyClFEZzVQeVFrSkRjNVBqYzVQamc0UGpVNVBUYzVQemM0UHpjM056WTVQUzR1TGpnNFB6YzNQVGM0UGpnNFBEYzNRRGc0UGprNU9UYzQKUGpjNFB6WTJOamM1UFRjNVBnQUFBRGc0UGpjNFB6VTFRRGc0UFRnNFBqYzRQemczUHpjNVB6YzRQemc1UHpnNVB6WTRQalk1UFRjMwpRRGM0UGpjNFBqTXpRRGc1UVRFN096YzVQamM0UGpjM1B6YzNQelkyUGpjNVBqWTVQemc1UHpnN1B6bzVQenBGUlVGeVhFZVdiVTI1CmZVN0VnMUxiamxiem1qazVQejVjVUVtaGNsRFFpVVdLWjFUbmxFTi9ZVlR6bWtpaWNrT0FZVDlvVmp4UlNreTZmVUp6V3pnNVBrL0UKZzFQbmxFZVdiRHBGUkZieG1sYnlta3FzZUVxc2VrV0xaamc1UFQ5blZVeTVmRS9QaVVxc2R6OW5Wa0JtVkRsRlJWYnptRkRQaVZYegptbFBvbEZYeW1WYjBtbGZ6bWxMY2owN0ZoRGc0UDFiem1WWHhta3V0ZDFUcWxWUG5renhRU2oxY1VGRFFpRUJ4V2xMY2pqdEZSVmJ6Cm0xYm5sRDltVlVGelcwTitZRXV4ZVZYem1VaWhjbFgybWxmeW1reS9mMHFvZFU3RmcwZWRiMVh4bVV5NWZVU0xaams1UFVPQllVN0YKaGpoRlJVaWpjanhUU3YvLy83RUhOa0FBQUFCaWRGSk9Vd0FvVlhtZXY5VG1WQlp6dHU3dXRYRURUSy83cmtvQzBNOVNXOVphR0ttbwpUd1dXbEE3QXZnOGIwaFVpNDlzakROTUh2WkJPUSsvbkYxQUw1RmpJUURpZ0V2WDBFM0N3QWUzc01HQ0F6T0RZNlBqZ2lHdzgyZG9VCjB4cmQvb3BGUW5SVjh2M2czd0FBQUFGaVMwZEV1RTIvSnZZQUFBQUhkRWxOUlFmcEJSOE1PUU9qa2cwM0FBQUYwa2xFUVZSWXc1VlkKaTE4VVJSeGZVaEV5ekZSQU0wWHlsV1pwbUpXbTVoTVVyS0MwU0N0cmp1VWV3OTJ4NSszdEhlMkdkQ0Q0Q0lNN2lFUXplcjhzZS85Nwp6VzhldTNOMyt6aStIejR3N014KzkvZWUzNHlpZUtQbW9TVkxsOVV1UjJoNTdiS2xTK3BxbE1Xai91RVZqNkF5Tkt4OHRINHhIS3NlClc3Mkd2UmtxWTFxenRuRlZsU1JOZGMzd1JoOVMrOE9SYUF3VHhLS1JjTDg2UUpuV3JXK3FodVR4RFhSMVBKSEVaVWdtNG5ScXd4T0IKUkJzM3dVSjFNSVpkRVJ0VVliNWxvei9MNWdZZ0NXdllFMW9ZaUJvMis1QzBQZ21mU21uNE10Y2lyV2NNZUdSazlMU3RvNVpDYUFCdAphZlZpMmJvTjNvankxZGtjbFI4TkNTK3B1U3lmK2dpNHQrOXdaM21xbGt6bW1ENm05VEY4a25uTWdXcVpNRHVzNWNnL08zZTVzVHk5Cm0wd2w4QlZLb2lJUGNDS2NJT05ubnExazJiT1hUSXd3ZFF6a0E0T3A5Z2taN3QxVHp2SmNHM2tjb1F2eUtBQjV1aXhDUm0zbEliMlAKMkpMS1lzYkY2cEFuVDV3cU5rSkcrMHBabmllUDB0VEhUS0VCZjNrTTZ2MDBHZTJYV2VwZklENmlMTnkyb3dGNnFaU0grT3ZGbHlTYQpGdklCOExUcGExeW1KdnVDQVhwcFpIbUx3M0tBUEtkUkYwZFZJdzdybzJSd1FMQWNmQmtoWGZaUmZJeENpTlpYOWxmeWw0N1E3b09jCjVoRFJGVlRLRWxsVGlhaWNsMUJuaElpcHErUGpFOWNjLzBIOGFNU1doempOWVlRc01NeDFyL0lRRFkraEcrTmtjQlBqaVJ2Q1ROUTgKRmtLSEdjdVJJU2JNcDlnSGs3ZkVhS0pQWkt2RnhYbUYwaHhsZW40MmhmRTBXMWtvVWhUY0dhL1pYamVaUFk4Q3k3SGphQWFVbWFWcgppbFpHY3JxYTBTM0c5cmxETTJkUGd6Z3hoRTZjSkRTblF1QzhtNWdJVTlCZE05dlE1MlRCeHAydjhDQTVSV2phV1JvTVk5TXZKeVdhCkx6SWx6aUlwMGE0b0hhY1JTcGJtcEJ0dVM5YkdFYUUzSkZBU29UTWRTaWVYYmNxL1BzelpMTU9UVU5jbHJZZ2hPcFV1eGptTC9kTnAKM2hhSHVZSlhnaVJMMEM3bExEUDRiRkErM2VFOGQ3OWs1dFowZUpwbUVYZ1draHNNTllWMThjS01oenh6aE9pZTlSV0pNcWNjNTFrQQp0Q2hrdnk2UzhRSUVRTFZRaTVpWHZ3eUVHa0t2S3E4aEZLUFNCTmRnQjMxNXptTXdWNzJ1ZE5zeG9TMmkydGpsR0g0ajFLMzBNQnA0CityVzZDQjVXam5YWXB4SHFFVFE2cEdYU1dBUVBUVXlOU2RNamxBck5TWHJOZnpQUDF6cEZxbkt2WUhweHBkNUFDQUxCNEhFNmlOQzMKWVBMWWQ4SHk1S2xuY0FGTTNEeEFIWjRSOFI3OW5uL2pxajhIUkZlQnhBbDNlRHNMUHdpK05Oam5CenQ1Zmd3RmlhUGpuMFQ0dmNtUwpJVTBmbXpJTm5nK1NKbzUvRnNuUVphYzc5ZUtrVkZoU3BVWXVOenBaVG9yR0Frdk5UaWZkQWI4SWptbjZHZi9kM0pxeUMwWEhHVHZkCkFTbEptbDhEVEJPblVaTkVRNmM3N0NLYVpWUHpFczFzTE9HWEg0TnNYMlJGVkRuSDkyT3UxWDJwV0VMOGpLVHMwSmIxVTFNeEZqVlEKcDg0Um1wTW5XQUJhYlA3TzdSSWFHdHZSY0dwTXlqZGpMQnkxQ3lFSnZ1UEh4SFkzelBZL3luT1BMcm4xV3hhWFFvdFNPQnYwMU8vWQoyZTZVOHp6TkxQRzExSVA3RC80Z1c3V3FDNllGN0lhN1VCblVVWFMrcEJYUTNQSTdZeFh0MTZabGptVCt1b2JsVm9BMkppQk9wSlRoClR4Rnc4WnlWTFVvTVpqR3RHNnh2TmFYR1JIbkxhWk5HNFdlb1Vxb2hPRGhRaUJpZ2RmUXZoTjR1YWRyK1pzNExhRUdsMk1Nc3VaMm0KamJXUXBwZDVYQUVkNTRKWjJrSXF2ZDFsRFcwUS9rbGVaZ25VM1NzM3h2dERVbnM5NC9NK2IyZHBQZitYakk1VU5QdklMc2REQWJLdwpuSVIycWF6WlY1UTJJa1ZXbEdNL1NVaE9Zc0hTVm5rUWVrZkk0N1F2THVoRFJzUm1xVHdJS2NxRmk0amJoeDlMWFZuRWNSYUs3c1VMCmJzZTdYVHVKMURuVGowaVFtRkRrYW5zVlYrellEazRRWVIvcEwyTlMreU44cWdoYWI5dXFlS0IxQ3l6WHhXNklrNGxCZG5ENGIyelEKdVNRd1lUTjY5ejNQQTdRaWp2T1dUVlFKZHB4dGVGL3h4Y1lXS24vZW8wTXY1S21tbXdJdUZ3Z3UxYklRUzFkZWRhUlpkdGRlQ2lRaAphRnEvanRzVTZnd1ZxMURNV3Z5U0FEWFhWWFB4UXRHNDFpdjhWamRXeTBGUi84SEtCaEczQWcwckZuY3B4VkZUSjErUmZlaDNSZlkvCktlY2ZTdEhQWDVRQUFBQWxkRVZZZEdSaGRHVTZZM0psWVhSbEFESXdNalV0TURVdE16RlVNVEk2TlRjNk1ETXJNREE2TUREYlhTOEcKQUFBQUpYUkZXSFJrWVhSbE9tMXZaR2xtZVFBeU1ESTFMVEExTFRNeFZERXlPalUzT2pBekt6QXdPakF3cWdDWHVnQUFBQ2gwUlZoMApaR0YwWlRwMGFXMWxjM1JoYlhBQU1qQXlOUzB3TlMwek1WUXhNam8xTnpvd015c3dNRG93TVAwVnRtVUFBQUFBU1VWT1JLNUNZSUk9IiAvPgo8L3N2Zz4K'; +export const paseoChain = + 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+CjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iTGF5ZXJfMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeD0iMHB4IiB5PSIwcHgiIHdpZHRoPSI3MHB4IiBoZWlnaHQ9IjcwcHgiIHZpZXdCb3g9IjAgMCA3MCA3MCIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgNzAgNzAiIHhtbDpzcGFjZT0icHJlc2VydmUiPiAgPGltYWdlIGlkPSJpbWFnZTAiIHdpZHRoPSI3MCIgaGVpZ2h0PSI3MCIgeD0iMCIgeT0iMCIKICAgIHhsaW5rOmhyZWY9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRVlBQUFCR0NBTUFBQUJHOEJLMkFBQUFJR05JVWswQUFIb21BQUNBaEFBQStnQUFBSURvCkFBQjFNQUFBNm1BQUFEcVlBQUFYY0p5NlVUd0FBQUlyVUV4VVJRQUFBRE01UURZelB6YzVQemM0UHpnNFB6YzVQemM1UGpjM1BUbzYKT2pjM1BqZzRQemc0UGpnNVBqYzRQalk0UHdBQUFEWTVQRGM1UHpnNVB6ZzRQemMzUGdBQUFEYzRQemM1UHpnNFBqZzRQamc0UGpZNQpQalUxUURnNFBqYzRQamMzUFRNek16ZzRQemM1UGpjM056ZzRQamM0UHpNek16azVPVGc0UGpFeFBUVTFQRGM0UHpnNFB6TTZPaXNyClFEZzVQeVFrSkRjNVBqYzVQamc0UGpVNVBUYzVQemM0UHpjM056WTVQUzR1TGpnNFB6YzNQVGM0UGpnNFBEYzNRRGc0UGprNU9UYzQKUGpjNFB6WTJOamM1UFRjNVBnQUFBRGc0UGpjNFB6VTFRRGc0UFRnNFBqYzRQemczUHpjNVB6YzRQemc1UHpnNVB6WTRQalk1UFRjMwpRRGM0UGpjNFBqTXpRRGc1UVRFN096YzVQamM0UGpjM1B6YzNQelkyUGpjNVBqWTVQemc1UHpnN1B6bzVQenBGUlVGeVhFZVdiVTI1CmZVN0VnMUxiamxiem1qazVQejVjVUVtaGNsRFFpVVdLWjFUbmxFTi9ZVlR6bWtpaWNrT0FZVDlvVmp4UlNreTZmVUp6V3pnNVBrL0UKZzFQbmxFZVdiRHBGUkZieG1sYnlta3FzZUVxc2VrV0xaamc1UFQ5blZVeTVmRS9QaVVxc2R6OW5Wa0JtVkRsRlJWYnptRkRQaVZYegptbFBvbEZYeW1WYjBtbGZ6bWxMY2owN0ZoRGc0UDFiem1WWHhta3V0ZDFUcWxWUG5renhRU2oxY1VGRFFpRUJ4V2xMY2pqdEZSVmJ6Cm0xYm5sRDltVlVGelcwTitZRXV4ZVZYem1VaWhjbFgybWxmeW1reS9mMHFvZFU3RmcwZWRiMVh4bVV5NWZVU0xaams1UFVPQllVN0YKaGpoRlJVaWpjanhUU3YvLy83RUhOa0FBQUFCaWRGSk9Vd0FvVlhtZXY5VG1WQlp6dHU3dXRYRURUSy83cmtvQzBNOVNXOVphR0ttbwpUd1dXbEE3QXZnOGIwaFVpNDlzakROTUh2WkJPUSsvbkYxQUw1RmpJUURpZ0V2WDBFM0N3QWUzc01HQ0F6T0RZNlBqZ2lHdzgyZG9VCjB4cmQvb3BGUW5SVjh2M2czd0FBQUFGaVMwZEV1RTIvSnZZQUFBQUhkRWxOUlFmcEJSOE1PUU9qa2cwM0FBQUYwa2xFUVZSWXc1VlkKaTE4VVJSeGZVaEV5ekZSQU0wWHlsV1pwbUpXbTVoTVVyS0MwU0N0cmp1VWV3OTJ4NSszdEhlMkdkQ0Q0Q0lNN2lFUXplcjhzZS85Nwp6VzhldTNOMyt6aStIejR3N014KzkvZWUzNHlpZUtQbW9TVkxsOVV1UjJoNTdiS2xTK3BxbE1Xai91RVZqNkF5Tkt4OHRINHhIS3NlClc3Mkd2UmtxWTFxenRuRlZsU1JOZGMzd1JoOVMrOE9SYUF3VHhLS1JjTDg2UUpuV3JXK3FodVR4RFhSMVBKSEVaVWdtNG5ScXd4T0IKUkJzM3dVSjFNSVpkRVJ0VVliNWxvei9MNWdZZ0NXdllFMW9ZaUJvMis1QzBQZ21mU21uNE10Y2lyV2NNZUdSazlMU3RvNVpDYUFCdAphZlZpMmJvTjNvankxZGtjbFI4TkNTK3B1U3lmK2dpNHQrOXdaM21xbGt6bW1ENm05VEY4a25uTWdXcVpNRHVzNWNnL08zZTVzVHk5Cm0wd2w4QlZLb2lJUGNDS2NJT05ubnExazJiT1hUSXd3ZFF6a0E0T3A5Z2taN3QxVHp2SmNHM2tjb1F2eUtBQjV1aXhDUm0zbEliMlAKMkpMS1lzYkY2cEFuVDV3cU5rSkcrMHBabmllUDB0VEhUS0VCZjNrTTZ2MDBHZTJYV2VwZklENmlMTnkyb3dGNnFaU0grT3ZGbHlTYQpGdklCOExUcGExeW1KdnVDQVhwcFpIbUx3M0tBUEtkUkYwZFZJdzdybzJSd1FMQWNmQmtoWGZaUmZJeENpTlpYOWxmeWw0N1E3b09jCjVoRFJGVlRLRWxsVGlhaWNsMUJuaElpcHErUGpFOWNjLzBIOGFNU1doempOWVlRc01NeDFyL0lRRFkraEcrTmtjQlBqaVJ2Q1ROUTgKRmtLSEdjdVJJU2JNcDlnSGs3ZkVhS0pQWkt2RnhYbUYwaHhsZW40MmhmRTBXMWtvVWhUY0dhL1pYamVaUFk4Q3k3SGphQWFVbWFWcgppbFpHY3JxYTBTM0c5cmxETTJkUGd6Z3hoRTZjSkRTblF1QzhtNWdJVTlCZE05dlE1MlRCeHAydjhDQTVSV2phV1JvTVk5TXZKeVdhCkx6SWx6aUlwMGE0b0hhY1JTcGJtcEJ0dVM5YkdFYUUzSkZBU29UTWRTaWVYYmNxL1BzelpMTU9UVU5jbHJZZ2hPcFV1eGptTC9kTnAKM2hhSHVZSlhnaVJMMEM3bExEUDRiRkErM2VFOGQ3OWs1dFowZUpwbUVYZ1draHNNTllWMThjS01oenh6aE9pZTlSV0pNcWNjNTFrQQp0Q2hrdnk2UzhRSUVRTFZRaTVpWHZ3eUVHa0t2S3E4aEZLUFNCTmRnQjMxNXptTXdWNzJ1ZE5zeG9TMmkydGpsR0g0ajFLMzBNQnA0CityVzZDQjVXam5YWXB4SHFFVFE2cEdYU1dBUVBUVXlOU2RNamxBck5TWHJOZnpQUDF6cEZxbkt2WUhweHBkNUFDQUxCNEhFNmlOQzMKWVBMWWQ4SHk1S2xuY0FGTTNEeEFIWjRSOFI3OW5uL2pxajhIUkZlQnhBbDNlRHNMUHdpK05Oam5CenQ1Zmd3RmlhUGpuMFQ0dmNtUwpJVTBmbXpJTm5nK1NKbzUvRnNuUVphYzc5ZUtrVkZoU3BVWXVOenBaVG9yR0Frdk5UaWZkQWI4SWptbjZHZi9kM0pxeUMwWEhHVHZkCkFTbEptbDhEVEJPblVaTkVRNmM3N0NLYVpWUHpFczFzTE9HWEg0TnNYMlJGVkRuSDkyT3UxWDJwV0VMOGpLVHMwSmIxVTFNeEZqVlEKcDg0Um1wTW5XQUJhYlA3TzdSSWFHdHZSY0dwTXlqZGpMQnkxQ3lFSnZ1UEh4SFkzelBZL3luT1BMcm4xV3hhWFFvdFNPQnYwMU8vWQoyZTZVOHp6TkxQRzExSVA3RC80Z1c3V3FDNllGN0lhN1VCblVVWFMrcEJYUTNQSTdZeFh0MTZabGptVCt1b2JsVm9BMkppQk9wSlRoClR4Rnc4WnlWTFVvTVpqR3RHNnh2TmFYR1JIbkxhWk5HNFdlb1Vxb2hPRGhRaUJpZ2RmUXZoTjR1YWRyK1pzNExhRUdsMk1Nc3VaMm0KamJXUXBwZDVYQUVkNTRKWjJrSXF2ZDFsRFcwUS9rbGVaZ25VM1NzM3h2dERVbnM5NC9NK2IyZHBQZitYakk1VU5QdklMc2REQWJLdwpuSVIycWF6WlY1UTJJa1ZXbEdNL1NVaE9Zc0hTVm5rUWVrZkk0N1F2THVoRFJzUm1xVHdJS2NxRmk0amJoeDlMWFZuRWNSYUs3c1VMCmJzZTdYVHVKMURuVGowaVFtRkRrYW5zVlYrellEazRRWVIvcEwyTlMreU44cWdoYWI5dXFlS0IxQ3l6WHhXNklrNGxCZG5ENGIyelEKdVNRd1lUTjY5ejNQQTdRaWp2T1dUVlFKZHB4dGVGL3h4Y1lXS24vZW8wTXY1S21tbXdJdUZ3Z3UxYklRUzFkZWRhUlpkdGRlQ2lRaAphRnEvanRzVTZnd1ZxMURNV3Z5U0FEWFhWWFB4UXRHNDFpdjhWamRXeTBGUi84SEtCaEczQWcwckZuY3B4VkZUSjErUmZlaDNSZlkvCktlY2ZTdEhQWDVRQUFBQWxkRVZZZEdSaGRHVTZZM0psWVhSbEFESXdNalV0TURVdE16RlVNVEk2TlRjNk1ETXJNREE2TUREYlhTOEcKQUFBQUpYUkZXSFJrWVhSbE9tMXZaR2xtZVFBeU1ESTFMVEExTFRNeFZERXlPalUzT2pBekt6QXdPakF3cWdDWHVnQUFBQ2gwUlZoMApaR0YwWlRwMGFXMWxjM1JoYlhBQU1qQXlOUzB3TlMwek1WUXhNam8xTnpvd015c3dNRG93TVAwVnRtVUFBQUFBU1VWT1JLNUNZSUk9IiAvPgo8L3N2Zz4K'; diff --git a/packages/core/src/config/logos/generated/peopleChain.ts b/packages/core/src/config/logos/generated/peopleChain.ts index 22b116f..171f77c 100644 --- a/packages/core/src/config/logos/generated/peopleChain.ts +++ b/packages/core/src/config/logos/generated/peopleChain.ts @@ -3,4 +3,5 @@ // Do not edit. Auto-generated via node scripts/convertLogos.mjs -export const peopleChain = 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTYiIGhlaWdodD0iNTYiIHZpZXdCb3g9IjAgMCA1NiA1NiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICAgIDxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMF81XzMpIj4KICAgICAgICA8cGF0aCBkPSJNMjggNTZDNDMuNDY0IDU2IDU2IDQzLjQ2NCA1NiAyOEM1NiAxMi41MzYgNDMuNDY0IDAgMjggMEMxMi41MzYgMCAwIDEyLjUzNiAwIDI4QzAgNDMuNDY0IDEyLjUzNiA1NiAyOCA1NloiIGZpbGw9IiMwMEIyRkYiLz4KICAgICAgICA8cGF0aCBkPSJNMjguNSAxNUMzMC45ODUzIDE1IDMzIDEyLjk4NTMgMzMgMTAuNUMzMyA4LjAxNDcyIDMwLjk4NTMgNiAyOC41IDZDMjYuMDE0NyA2IDI0IDguMDE0NzIgMjQgMTAuNUMyNCAxMi45ODUzIDI2LjAxNDcgMTUgMjguNSAxNVoiIGZpbGw9IiNFNjAwN0EiLz4KICAgICAgICA8cGF0aCBkPSJNNDMuNSAyM0M0NS45ODUzIDIzIDQ4IDIwLjk4NTMgNDggMTguNUM0OCAxNi4wMTQ3IDQ1Ljk4NTMgMTQgNDMuNSAxNEM0MS4wMTQ3IDE0IDM5IDE2LjAxNDcgMzkgMTguNUMzOSAyMC45ODUzIDQxLjAxNDcgMjMgNDMuNSAyM1oiIGZpbGw9IiNFNjAwN0EiLz4KICAgICAgICA8cGF0aCBkPSJNNDMuNSA0MkM0NS45ODUzIDQyIDQ4IDM5Ljk4NTMgNDggMzcuNUM0OCAzNS4wMTQ3IDQ1Ljk4NTMgMzMgNDMuNSAzM0M0MS4wMTQ3IDMzIDM5IDM1LjAxNDcgMzkgMzcuNUMzOSAzOS45ODUzIDQxLjAxNDcgNDIgNDMuNSA0MloiIGZpbGw9IiNFNjAwN0EiLz4KICAgICAgICA8cGF0aCBkPSJNMTIuNSAyM0MxNC45ODUzIDIzIDE3IDIwLjk4NTMgMTcgMTguNUMxNyAxNi4wMTQ3IDE0Ljk4NTMgMTQgMTIuNSAxNEMxMC4wMTQ3IDE0IDggMTYuMDE0NyA4IDE4LjVDOCAyMC45ODUzIDEwLjAxNDcgMjMgMTIuNSAyM1oiIGZpbGw9IiNFNjAwN0EiLz4KICAgICAgICA8cGF0aCBkPSJNMTIuNSA0MkMxNC45ODUzIDQyIDE3IDM5Ljk4NTMgMTcgMzcuNUMxNyAzNS4wMTQ3IDE0Ljk4NTMgMzMgMTIuNSAzM0MxMC4wMTQ3IDMzIDggMzUuMDE0NyA4IDM3LjVDOCAzOS45ODUzIDEwLjAxNDcgNDIgMTIuNSA0MloiIGZpbGw9IiNFNjAwN0EiLz4KICAgICAgICA8cGF0aCBkPSJNMjguNSA1MEMzMC45ODUzIDUwIDMzIDQ3Ljk4NTMgMzMgNDUuNUMzMyA0My4wMTQ3IDMwLjk4NTMgNDEgMjguNSA0MUMyNi4wMTQ3IDQxIDI0IDQzLjAxNDcgMjQgNDUuNUMyNCA0Ny45ODUzIDI2LjAxNDcgNTAgMjguNSA1MFoiIGZpbGw9IiNFNjAwN0EiLz4KICAgICAgICA8ZyBmaWx0ZXI9InVybCgjZmlsdGVyMF9iXzVfMykiPgogICAgICAgICAgICA8cGF0aCBkPSJNMzAuNzEyIDIwQzMyLjE4NCAyMCAzMy40NDggMjAuMjU2IDM0LjUwNCAyMC43NjhDMzUuNTc2IDIxLjI2NCAzNi4zOTIgMjEuOTY4IDM2Ljk1MiAyMi44OEMzNy41MjggMjMuNzkyIDM3LjgxNiAyNC44NTYgMzcuODE2IDI2LjA3MkMzNy44MTYgMjcuMjg4IDM3LjUyOCAyOC4zNTIgMzYuOTUyIDI5LjI2NEMzNi4zOTIgMzAuMTc2IDM1LjU3NiAzMC44ODggMzQuNTA0IDMxLjRDMzMuNDQ4IDMxLjg5NiAzMi4xODQgMzIuMTQ0IDMwLjcxMiAzMi4xNDRIMjIuODRWMjguNDcySDMwLjQ3MkMzMS4zMzYgMjguNDcyIDMyLjAxNiAyOC4yNjQgMzIuNTEyIDI3Ljg0OEMzMy4wMDggMjcuNDE2IDMzLjI1NiAyNi44MjQgMzMuMjU2IDI2LjA3MkMzMy4yNTYgMjUuMzIgMzMuMDA4IDI0LjczNiAzMi41MTIgMjQuMzJDMzIuMDE2IDIzLjg4OCAzMS4zMzYgMjMuNjcyIDMwLjQ3MiAyMy42NzJIMjMuMjQ4TDI1LjI4OCAyMS41NlYzOEgyMC43NTJWMjBIMzAuNzEyWiIgZmlsbD0id2hpdGUiLz4KICAgICAgICA8L2c+CiAgICA8L2c+CiAgICA8ZGVmcz4KICAgICAgICA8ZmlsdGVyIGlkPSJmaWx0ZXIwX2JfNV8zIiB4PSIxNi43NTIiIHk9IjE2IiB3aWR0aD0iMjUuMDY0IiBoZWlnaHQ9IjI2IiBmaWx0ZXJVbml0cz0idXNlclNwYWNlT25Vc2UiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgICAgICAgICAgIDxmZUZsb29kIGZsb29kLW9wYWNpdHk9IjAiIHJlc3VsdD0iQmFja2dyb3VuZEltYWdlRml4Ii8+CiAgICAgICAgICAgIDxmZUdhdXNzaWFuQmx1ciBpbj0iQmFja2dyb3VuZEltYWdlRml4IiBzdGREZXZpYXRpb249IjIiLz4KICAgICAgICAgICAgPGZlQ29tcG9zaXRlIGluMj0iU291cmNlQWxwaGEiIG9wZXJhdG9yPSJpbiIgcmVzdWx0PSJlZmZlY3QxX2JhY2tncm91bmRCbHVyXzVfMyIvPgogICAgICAgICAgICA8ZmVCbGVuZCBtb2RlPSJub3JtYWwiIGluPSJTb3VyY2VHcmFwaGljIiBpbjI9ImVmZmVjdDFfYmFja2dyb3VuZEJsdXJfNV8zIiByZXN1bHQ9InNoYXBlIi8+CiAgICAgICAgPC9maWx0ZXI+CiAgICAgICAgPGNsaXBQYXRoIGlkPSJjbGlwMF81XzMiPgogICAgICAgICAgICA8cmVjdCB3aWR0aD0iNTYiIGhlaWdodD0iNTYiIGZpbGw9IndoaXRlIi8+CiAgICAgICAgPC9jbGlwUGF0aD4KICAgIDwvZGVmcz4KPC9zdmc+Cg=='; +export const peopleChain = + 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTYiIGhlaWdodD0iNTYiIHZpZXdCb3g9IjAgMCA1NiA1NiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICAgIDxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMF81XzMpIj4KICAgICAgICA8cGF0aCBkPSJNMjggNTZDNDMuNDY0IDU2IDU2IDQzLjQ2NCA1NiAyOEM1NiAxMi41MzYgNDMuNDY0IDAgMjggMEMxMi41MzYgMCAwIDEyLjUzNiAwIDI4QzAgNDMuNDY0IDEyLjUzNiA1NiAyOCA1NloiIGZpbGw9IiMwMEIyRkYiLz4KICAgICAgICA8cGF0aCBkPSJNMjguNSAxNUMzMC45ODUzIDE1IDMzIDEyLjk4NTMgMzMgMTAuNUMzMyA4LjAxNDcyIDMwLjk4NTMgNiAyOC41IDZDMjYuMDE0NyA2IDI0IDguMDE0NzIgMjQgMTAuNUMyNCAxMi45ODUzIDI2LjAxNDcgMTUgMjguNSAxNVoiIGZpbGw9IiNFNjAwN0EiLz4KICAgICAgICA8cGF0aCBkPSJNNDMuNSAyM0M0NS45ODUzIDIzIDQ4IDIwLjk4NTMgNDggMTguNUM0OCAxNi4wMTQ3IDQ1Ljk4NTMgMTQgNDMuNSAxNEM0MS4wMTQ3IDE0IDM5IDE2LjAxNDcgMzkgMTguNUMzOSAyMC45ODUzIDQxLjAxNDcgMjMgNDMuNSAyM1oiIGZpbGw9IiNFNjAwN0EiLz4KICAgICAgICA8cGF0aCBkPSJNNDMuNSA0MkM0NS45ODUzIDQyIDQ4IDM5Ljk4NTMgNDggMzcuNUM0OCAzNS4wMTQ3IDQ1Ljk4NTMgMzMgNDMuNSAzM0M0MS4wMTQ3IDMzIDM5IDM1LjAxNDcgMzkgMzcuNUMzOSAzOS45ODUzIDQxLjAxNDcgNDIgNDMuNSA0MloiIGZpbGw9IiNFNjAwN0EiLz4KICAgICAgICA8cGF0aCBkPSJNMTIuNSAyM0MxNC45ODUzIDIzIDE3IDIwLjk4NTMgMTcgMTguNUMxNyAxNi4wMTQ3IDE0Ljk4NTMgMTQgMTIuNSAxNEMxMC4wMTQ3IDE0IDggMTYuMDE0NyA4IDE4LjVDOCAyMC45ODUzIDEwLjAxNDcgMjMgMTIuNSAyM1oiIGZpbGw9IiNFNjAwN0EiLz4KICAgICAgICA8cGF0aCBkPSJNMTIuNSA0MkMxNC45ODUzIDQyIDE3IDM5Ljk4NTMgMTcgMzcuNUMxNyAzNS4wMTQ3IDE0Ljk4NTMgMzMgMTIuNSAzM0MxMC4wMTQ3IDMzIDggMzUuMDE0NyA4IDM3LjVDOCAzOS45ODUzIDEwLjAxNDcgNDIgMTIuNSA0MloiIGZpbGw9IiNFNjAwN0EiLz4KICAgICAgICA8cGF0aCBkPSJNMjguNSA1MEMzMC45ODUzIDUwIDMzIDQ3Ljk4NTMgMzMgNDUuNUMzMyA0My4wMTQ3IDMwLjk4NTMgNDEgMjguNSA0MUMyNi4wMTQ3IDQxIDI0IDQzLjAxNDcgMjQgNDUuNUMyNCA0Ny45ODUzIDI2LjAxNDcgNTAgMjguNSA1MFoiIGZpbGw9IiNFNjAwN0EiLz4KICAgICAgICA8ZyBmaWx0ZXI9InVybCgjZmlsdGVyMF9iXzVfMykiPgogICAgICAgICAgICA8cGF0aCBkPSJNMzAuNzEyIDIwQzMyLjE4NCAyMCAzMy40NDggMjAuMjU2IDM0LjUwNCAyMC43NjhDMzUuNTc2IDIxLjI2NCAzNi4zOTIgMjEuOTY4IDM2Ljk1MiAyMi44OEMzNy41MjggMjMuNzkyIDM3LjgxNiAyNC44NTYgMzcuODE2IDI2LjA3MkMzNy44MTYgMjcuMjg4IDM3LjUyOCAyOC4zNTIgMzYuOTUyIDI5LjI2NEMzNi4zOTIgMzAuMTc2IDM1LjU3NiAzMC44ODggMzQuNTA0IDMxLjRDMzMuNDQ4IDMxLjg5NiAzMi4xODQgMzIuMTQ0IDMwLjcxMiAzMi4xNDRIMjIuODRWMjguNDcySDMwLjQ3MkMzMS4zMzYgMjguNDcyIDMyLjAxNiAyOC4yNjQgMzIuNTEyIDI3Ljg0OEMzMy4wMDggMjcuNDE2IDMzLjI1NiAyNi44MjQgMzMuMjU2IDI2LjA3MkMzMy4yNTYgMjUuMzIgMzMuMDA4IDI0LjczNiAzMi41MTIgMjQuMzJDMzIuMDE2IDIzLjg4OCAzMS4zMzYgMjMuNjcyIDMwLjQ3MiAyMy42NzJIMjMuMjQ4TDI1LjI4OCAyMS41NlYzOEgyMC43NTJWMjBIMzAuNzEyWiIgZmlsbD0id2hpdGUiLz4KICAgICAgICA8L2c+CiAgICA8L2c+CiAgICA8ZGVmcz4KICAgICAgICA8ZmlsdGVyIGlkPSJmaWx0ZXIwX2JfNV8zIiB4PSIxNi43NTIiIHk9IjE2IiB3aWR0aD0iMjUuMDY0IiBoZWlnaHQ9IjI2IiBmaWx0ZXJVbml0cz0idXNlclNwYWNlT25Vc2UiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgICAgICAgICAgIDxmZUZsb29kIGZsb29kLW9wYWNpdHk9IjAiIHJlc3VsdD0iQmFja2dyb3VuZEltYWdlRml4Ii8+CiAgICAgICAgICAgIDxmZUdhdXNzaWFuQmx1ciBpbj0iQmFja2dyb3VuZEltYWdlRml4IiBzdGREZXZpYXRpb249IjIiLz4KICAgICAgICAgICAgPGZlQ29tcG9zaXRlIGluMj0iU291cmNlQWxwaGEiIG9wZXJhdG9yPSJpbiIgcmVzdWx0PSJlZmZlY3QxX2JhY2tncm91bmRCbHVyXzVfMyIvPgogICAgICAgICAgICA8ZmVCbGVuZCBtb2RlPSJub3JtYWwiIGluPSJTb3VyY2VHcmFwaGljIiBpbjI9ImVmZmVjdDFfYmFja2dyb3VuZEJsdXJfNV8zIiByZXN1bHQ9InNoYXBlIi8+CiAgICAgICAgPC9maWx0ZXI+CiAgICAgICAgPGNsaXBQYXRoIGlkPSJjbGlwMF81XzMiPgogICAgICAgICAgICA8cmVjdCB3aWR0aD0iNTYiIGhlaWdodD0iNTYiIGZpbGw9IndoaXRlIi8+CiAgICAgICAgPC9jbGlwUGF0aD4KICAgIDwvZGVmcz4KPC9zdmc+Cg=='; diff --git a/packages/core/src/config/logos/generated/peopleKusamaChain.ts b/packages/core/src/config/logos/generated/peopleKusamaChain.ts index 57bbda8..289eae5 100644 --- a/packages/core/src/config/logos/generated/peopleKusamaChain.ts +++ b/packages/core/src/config/logos/generated/peopleKusamaChain.ts @@ -3,4 +3,5 @@ // Do not edit. Auto-generated via node scripts/convertLogos.mjs -export const peopleKusamaChain = 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTYiIGhlaWdodD0iNTYiIHZpZXdCb3g9IjAgMCA1NiA1NiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICAgIDxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMF81XzMpIj4KICAgICAgICA8cGF0aCBkPSJNMjggNTZDNDMuNDY0IDU2IDU2IDQzLjQ2NCA1NiAyOEM1NiAxMi41MzYgNDMuNDY0IDAgMjggMEMxMi41MzYgMCAwIDEyLjUzNiAwIDI4QzAgNDMuNDY0IDEyLjUzNiA1NiAyOCA1NloiIGZpbGw9IiMwMjAyMDIiLz4KICAgICAgICA8cGF0aCBkPSJNMjguNSAxNUMzMC45ODUzIDE1IDMzIDEyLjk4NTMgMzMgMTAuNUMzMyA4LjAxNDcyIDMwLjk4NTMgNiAyOC41IDZDMjYuMDE0NyA2IDI0IDguMDE0NzIgMjQgMTAuNUMyNCAxMi45ODUzIDI2LjAxNDcgMTUgMjguNSAxNVoiIGZpbGw9IndoaXRlIi8+CiAgICAgICAgPHBhdGggZD0iTTQzLjUgMjNDNDUuOTg1MyAyMyA0OCAyMC45ODUzIDQ4IDE4LjVDNDggMTYuMDE0NyA0NS45ODUzIDE0IDQzLjUgMTRDNDEuMDE0NyAxNCAzOSAxNi4wMTQ3IDM5IDE4LjVDMzkgMjAuOTg1MyA0MS4wMTQ3IDIzIDQzLjUgMjNaIiBmaWxsPSJ3aGl0ZSIvPgogICAgICAgIDxwYXRoIGQ9Ik00My41IDQyQzQ1Ljk4NTMgNDIgNDggMzkuOTg1MyA0OCAzNy41QzQ4IDM1LjAxNDcgNDUuOTg1MyAzMyA0My41IDMzQzQxLjAxNDcgMzMgMzkgMzUuMDE0NyAzOSAzNy41QzM5IDM5Ljk4NTMgNDEuMDE0NyA0MiA0My41IDQyWiIgZmlsbD0id2hpdGUiLz4KICAgICAgICA8cGF0aCBkPSJNMTIuNSAyM0MxNC45ODUzIDIzIDE3IDIwLjk4NTMgMTcgMTguNUMxNyAxNi4wMTQ3IDE0Ljk4NTMgMTQgMTIuNSAxNEMxMC4wMTQ3IDE0IDggMTYuMDE0NyA4IDE4LjVDOCAyMC45ODUzIDEwLjAxNDcgMjMgMTIuNSAyM1oiIGZpbGw9IndoaXRlIi8+CiAgICAgICAgPHBhdGggZD0iTTEyLjUgNDJDMTQuOTg1MyA0MiAxNyAzOS45ODUzIDE3IDM3LjVDMTcgMzUuMDE0NyAxNC45ODUzIDMzIDEyLjUgMzNDMTAuMDE0NyAzMyA4IDM1LjAxNDcgOCAzNy41QzggMzkuOTg1MyAxMC4wMTQ3IDQyIDEyLjUgNDJaIiBmaWxsPSJ3aGl0ZSIvPgogICAgICAgIDxwYXRoIGQ9Ik0yOC41IDUwQzMwLjk4NTMgNTAgMzMgNDcuOTg1MyAzMyA0NS41QzMzIDQzLjAxNDcgMzAuOTg1MyA0MSAyOC41IDQxQzI2LjAxNDcgNDEgMjQgNDMuMDE0NyAyNCA0NS41QzI0IDQ3Ljk4NTMgMjYuMDE0NyA1MCAyOC41IDUwWiIgZmlsbD0id2hpdGUiLz4KICAgICAgICA8ZyBmaWx0ZXI9InVybCgjZmlsdGVyMF9kXzVfMykiPgogICAgICAgICAgICA8cGF0aCBkPSJNMzEuNzEyIDIwQzMzLjE4NCAyMCAzNC40NDggMjAuMjU2IDM1LjUwNCAyMC43NjhDMzYuNTc2IDIxLjI2NCAzNy4zOTIgMjEuOTY4IDM3Ljk1MiAyMi44OEMzOC41MjggMjMuNzkyIDM4LjgxNiAyNC44NTYgMzguODE2IDI2LjA3MkMzOC44MTYgMjcuMjg4IDM4LjUyOCAyOC4zNTIgMzcuOTUyIDI5LjI2NEMzNy4zOTIgMzAuMTc2IDM2LjU3NiAzMC44ODggMzUuNTA0IDMxLjRDMzQuNDQ4IDMxLjg5NiAzMy4xODQgMzIuMTQ0IDMxLjcxMiAzMi4xNDRIMjMuODRWMjguNDcySDMxLjQ3MkMzMi4zMzYgMjguNDcyIDMzLjAxNiAyOC4yNjQgMzMuNTEyIDI3Ljg0OEMzNC4wMDggMjcuNDE2IDM0LjI1NiAyNi44MjQgMzQuMjU2IDI2LjA3MkMzNC4yNTYgMjUuMzIgMzQuMDA4IDI0LjczNiAzMy41MTIgMjQuMzJDMzMuMDE2IDIzLjg4OCAzMi4zMzYgMjMuNjcyIDMxLjQ3MiAyMy42NzJIMjQuMjQ4TDI2LjI4OCAyMS41NlYzOEgyMS43NTJWMjBIMzEuNzEyWiIgZmlsbD0id2hpdGUiLz4KICAgICAgICA8L2c+CiAgICA8L2c+CiAgICA8ZGVmcz4KICAgICAgICA8ZmlsdGVyIGlkPSJmaWx0ZXIwX2RfNV8zIiB4PSIxNy43NTIiIHk9IjIwIiB3aWR0aD0iMjUuMDY0IiBoZWlnaHQ9IjI2IiBmaWx0ZXJVbml0cz0idXNlclNwYWNlT25Vc2UiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgICAgICAgICAgIDxmZUZsb29kIGZsb29kLW9wYWNpdHk9IjAiIHJlc3VsdD0iQmFja2dyb3VuZEltYWdlRml4Ii8+CiAgICAgICAgICAgIDxmZUNvbG9yTWF0cml4IGluPSJTb3VyY2VBbHBoYSIgdHlwZT0ibWF0cml4IiB2YWx1ZXM9IjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDEyNyAwIiByZXN1bHQ9ImhhcmRBbHBoYSIvPgogICAgICAgICAgICA8ZmVPZmZzZXQgZHk9IjQiLz4KICAgICAgICAgICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMiIvPgogICAgICAgICAgICA8ZmVDb21wb3NpdGUgaW4yPSJoYXJkQWxwaGEiIG9wZXJhdG9yPSJvdXQiLz4KICAgICAgICAgICAgPGZlQ29sb3JNYXRyaXggdHlwZT0ibWF0cml4IiB2YWx1ZXM9IjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAuMjUgMCIvPgogICAgICAgICAgICA8ZmVCbGVuZCBtb2RlPSJub3JtYWwiIGluMj0iQmFja2dyb3VuZEltYWdlRml4IiByZXN1bHQ9ImVmZmVjdDFfZHJvcFNoYWRvd181XzMiLz4KICAgICAgICAgICAgPGZlQmxlbmQgbW9kZT0ibm9ybWFsIiBpbj0iU291cmNlR3JhcGhpYyIgaW4yPSJlZmZlY3QxX2Ryb3BTaGFkb3dfNV8zIiByZXN1bHQ9InNoYXBlIi8+CiAgICAgICAgPC9maWx0ZXI+CiAgICAgICAgPGNsaXBQYXRoIGlkPSJjbGlwMF81XzMiPgogICAgICAgICAgICA8cmVjdCB3aWR0aD0iNTYiIGhlaWdodD0iNTYiIGZpbGw9IndoaXRlIi8+CiAgICAgICAgPC9jbGlwUGF0aD4KICAgIDwvZGVmcz4KPC9zdmc+Cg=='; +export const peopleKusamaChain = + 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTYiIGhlaWdodD0iNTYiIHZpZXdCb3g9IjAgMCA1NiA1NiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICAgIDxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMF81XzMpIj4KICAgICAgICA8cGF0aCBkPSJNMjggNTZDNDMuNDY0IDU2IDU2IDQzLjQ2NCA1NiAyOEM1NiAxMi41MzYgNDMuNDY0IDAgMjggMEMxMi41MzYgMCAwIDEyLjUzNiAwIDI4QzAgNDMuNDY0IDEyLjUzNiA1NiAyOCA1NloiIGZpbGw9IiMwMjAyMDIiLz4KICAgICAgICA8cGF0aCBkPSJNMjguNSAxNUMzMC45ODUzIDE1IDMzIDEyLjk4NTMgMzMgMTAuNUMzMyA4LjAxNDcyIDMwLjk4NTMgNiAyOC41IDZDMjYuMDE0NyA2IDI0IDguMDE0NzIgMjQgMTAuNUMyNCAxMi45ODUzIDI2LjAxNDcgMTUgMjguNSAxNVoiIGZpbGw9IndoaXRlIi8+CiAgICAgICAgPHBhdGggZD0iTTQzLjUgMjNDNDUuOTg1MyAyMyA0OCAyMC45ODUzIDQ4IDE4LjVDNDggMTYuMDE0NyA0NS45ODUzIDE0IDQzLjUgMTRDNDEuMDE0NyAxNCAzOSAxNi4wMTQ3IDM5IDE4LjVDMzkgMjAuOTg1MyA0MS4wMTQ3IDIzIDQzLjUgMjNaIiBmaWxsPSJ3aGl0ZSIvPgogICAgICAgIDxwYXRoIGQ9Ik00My41IDQyQzQ1Ljk4NTMgNDIgNDggMzkuOTg1MyA0OCAzNy41QzQ4IDM1LjAxNDcgNDUuOTg1MyAzMyA0My41IDMzQzQxLjAxNDcgMzMgMzkgMzUuMDE0NyAzOSAzNy41QzM5IDM5Ljk4NTMgNDEuMDE0NyA0MiA0My41IDQyWiIgZmlsbD0id2hpdGUiLz4KICAgICAgICA8cGF0aCBkPSJNMTIuNSAyM0MxNC45ODUzIDIzIDE3IDIwLjk4NTMgMTcgMTguNUMxNyAxNi4wMTQ3IDE0Ljk4NTMgMTQgMTIuNSAxNEMxMC4wMTQ3IDE0IDggMTYuMDE0NyA4IDE4LjVDOCAyMC45ODUzIDEwLjAxNDcgMjMgMTIuNSAyM1oiIGZpbGw9IndoaXRlIi8+CiAgICAgICAgPHBhdGggZD0iTTEyLjUgNDJDMTQuOTg1MyA0MiAxNyAzOS45ODUzIDE3IDM3LjVDMTcgMzUuMDE0NyAxNC45ODUzIDMzIDEyLjUgMzNDMTAuMDE0NyAzMyA4IDM1LjAxNDcgOCAzNy41QzggMzkuOTg1MyAxMC4wMTQ3IDQyIDEyLjUgNDJaIiBmaWxsPSJ3aGl0ZSIvPgogICAgICAgIDxwYXRoIGQ9Ik0yOC41IDUwQzMwLjk4NTMgNTAgMzMgNDcuOTg1MyAzMyA0NS41QzMzIDQzLjAxNDcgMzAuOTg1MyA0MSAyOC41IDQxQzI2LjAxNDcgNDEgMjQgNDMuMDE0NyAyNCA0NS41QzI0IDQ3Ljk4NTMgMjYuMDE0NyA1MCAyOC41IDUwWiIgZmlsbD0id2hpdGUiLz4KICAgICAgICA8ZyBmaWx0ZXI9InVybCgjZmlsdGVyMF9kXzVfMykiPgogICAgICAgICAgICA8cGF0aCBkPSJNMzEuNzEyIDIwQzMzLjE4NCAyMCAzNC40NDggMjAuMjU2IDM1LjUwNCAyMC43NjhDMzYuNTc2IDIxLjI2NCAzNy4zOTIgMjEuOTY4IDM3Ljk1MiAyMi44OEMzOC41MjggMjMuNzkyIDM4LjgxNiAyNC44NTYgMzguODE2IDI2LjA3MkMzOC44MTYgMjcuMjg4IDM4LjUyOCAyOC4zNTIgMzcuOTUyIDI5LjI2NEMzNy4zOTIgMzAuMTc2IDM2LjU3NiAzMC44ODggMzUuNTA0IDMxLjRDMzQuNDQ4IDMxLjg5NiAzMy4xODQgMzIuMTQ0IDMxLjcxMiAzMi4xNDRIMjMuODRWMjguNDcySDMxLjQ3MkMzMi4zMzYgMjguNDcyIDMzLjAxNiAyOC4yNjQgMzMuNTEyIDI3Ljg0OEMzNC4wMDggMjcuNDE2IDM0LjI1NiAyNi44MjQgMzQuMjU2IDI2LjA3MkMzNC4yNTYgMjUuMzIgMzQuMDA4IDI0LjczNiAzMy41MTIgMjQuMzJDMzMuMDE2IDIzLjg4OCAzMi4zMzYgMjMuNjcyIDMxLjQ3MiAyMy42NzJIMjQuMjQ4TDI2LjI4OCAyMS41NlYzOEgyMS43NTJWMjBIMzEuNzEyWiIgZmlsbD0id2hpdGUiLz4KICAgICAgICA8L2c+CiAgICA8L2c+CiAgICA8ZGVmcz4KICAgICAgICA8ZmlsdGVyIGlkPSJmaWx0ZXIwX2RfNV8zIiB4PSIxNy43NTIiIHk9IjIwIiB3aWR0aD0iMjUuMDY0IiBoZWlnaHQ9IjI2IiBmaWx0ZXJVbml0cz0idXNlclNwYWNlT25Vc2UiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgICAgICAgICAgIDxmZUZsb29kIGZsb29kLW9wYWNpdHk9IjAiIHJlc3VsdD0iQmFja2dyb3VuZEltYWdlRml4Ii8+CiAgICAgICAgICAgIDxmZUNvbG9yTWF0cml4IGluPSJTb3VyY2VBbHBoYSIgdHlwZT0ibWF0cml4IiB2YWx1ZXM9IjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDEyNyAwIiByZXN1bHQ9ImhhcmRBbHBoYSIvPgogICAgICAgICAgICA8ZmVPZmZzZXQgZHk9IjQiLz4KICAgICAgICAgICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iMiIvPgogICAgICAgICAgICA8ZmVDb21wb3NpdGUgaW4yPSJoYXJkQWxwaGEiIG9wZXJhdG9yPSJvdXQiLz4KICAgICAgICAgICAgPGZlQ29sb3JNYXRyaXggdHlwZT0ibWF0cml4IiB2YWx1ZXM9IjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAuMjUgMCIvPgogICAgICAgICAgICA8ZmVCbGVuZCBtb2RlPSJub3JtYWwiIGluMj0iQmFja2dyb3VuZEltYWdlRml4IiByZXN1bHQ9ImVmZmVjdDFfZHJvcFNoYWRvd181XzMiLz4KICAgICAgICAgICAgPGZlQmxlbmQgbW9kZT0ibm9ybWFsIiBpbj0iU291cmNlR3JhcGhpYyIgaW4yPSJlZmZlY3QxX2Ryb3BTaGFkb3dfNV8zIiByZXN1bHQ9InNoYXBlIi8+CiAgICAgICAgPC9maWx0ZXI+CiAgICAgICAgPGNsaXBQYXRoIGlkPSJjbGlwMF81XzMiPgogICAgICAgICAgICA8cmVjdCB3aWR0aD0iNTYiIGhlaWdodD0iNTYiIGZpbGw9IndoaXRlIi8+CiAgICAgICAgPC9jbGlwUGF0aD4KICAgIDwvZGVmcz4KPC9zdmc+Cg=='; diff --git a/packages/core/src/config/logos/generated/polkadotChain.ts b/packages/core/src/config/logos/generated/polkadotChain.ts index 95a9a9d..146c453 100644 --- a/packages/core/src/config/logos/generated/polkadotChain.ts +++ b/packages/core/src/config/logos/generated/polkadotChain.ts @@ -3,4 +3,5 @@ // Do not edit. Auto-generated via node scripts/convertLogos.mjs -export const polkadotChain = 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iODAwIiBoZWlnaHQ9IjgwMCIgdmlld0JveD0iMCAwIDgwMCA4MDAiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxyZWN0IHdpZHRoPSI4MDAiIGhlaWdodD0iODAwIiByeD0iNDAwIiBmaWxsPSIjRTYwMDdBIi8+CjxwYXRoIGQ9Ik00MDAuMDcyIDI0Ni4wMzhDNDUyLjY2NiAyNDYuMDM4IDQ5NS4zMDIgMjIxLjE4MSA0OTUuMzAyIDE5MC41MTlDNDk1LjMwMiAxNTkuODU3IDQ1Mi42NjYgMTM1IDQwMC4wNzIgMTM1QzM0Ny40NzggMTM1IDMwNC44NDMgMTU5Ljg1NyAzMDQuODQzIDE5MC41MTlDMzA0Ljg0MyAyMjEuMTgxIDM0Ny40NzggMjQ2LjAzOCA0MDAuMDcyIDI0Ni4wMzhaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNNDAwLjA3MiA2NjQuMzY0QzQ1Mi42NjYgNjY0LjM2NCA0OTUuMzAyIDYzOS41MDcgNDk1LjMwMiA2MDguODQ1QzQ5NS4zMDIgNTc4LjE4MyA0NTIuNjY2IDU1My4zMjYgNDAwLjA3MiA1NTMuMzI2QzM0Ny40NzggNTUzLjMyNiAzMDQuODQzIDU3OC4xODMgMzA0Ljg0MyA2MDguODQ1QzMwNC44NDMgNjM5LjUwNyAzNDcuNDc4IDY2NC4zNjQgNDAwLjA3MiA2NjQuMzY0WiIgZmlsbD0id2hpdGUiLz4KPHBhdGggZD0iTTI2Ny4zNjMgMzIyLjg5QzI5My42NiAyNzcuMjMzIDI5My40ODkgMjI3Ljc4NSAyNjYuOTgyIDIxMi40NDNDMjQwLjQ3NSAxOTcuMTAyIDE5Ny42NjggMjIxLjY3NyAxNzEuMzcxIDI2Ny4zMzNDMTQ1LjA3NCAzMTIuOTg5IDE0NS4yNDUgMzYyLjQzOCAxNzEuNzUzIDM3Ny43NzlDMTk4LjI2IDM5My4xMjEgMjQxLjA2NiAzNjguNTQ2IDI2Ny4zNjMgMzIyLjg5WiIgZmlsbD0id2hpdGUiLz4KPHBhdGggZD0iTTYyOC43MzEgNTMyLjAyN0M2NTUuMDI4IDQ4Ni4zNzEgNjU0Ljg3MiA0MzYuOTMxIDYyOC4zODIgNDIxLjZDNjAxLjg5MyA0MDYuMjY5IDU1OS4xMDEgNDMwLjg1MiA1MzIuODA0IDQ3Ni41MDhDNTA2LjUwNyA1MjIuMTY1IDUwNi42NjMgNTcxLjYwNSA1MzMuMTUzIDU4Ni45MzZDNTU5LjY0MyA2MDIuMjY3IDYwMi40MzQgNTc3LjY4NCA2MjguNzMxIDUzMi4wMjdaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNMjY2Ljk5NiA1ODYuOTIzQzI5My41MDMgNTcxLjU4MiAyOTMuNjc0IDUyMi4xMzMgMjY3LjM3NyA0NzYuNDc3QzI0MS4wOCA0MzAuODIxIDE5OC4yNzQgNDA2LjI0NiAxNzEuNzY2IDQyMS41ODdDMTQ1LjI1OSA0MzYuOTI5IDE0NS4wODggNDg2LjM3NyAxNzEuMzg1IDUzMi4wMzRDMTk3LjY4MiA1NzcuNjkgMjQwLjQ4OCA2MDIuMjY1IDI2Ni45OTYgNTg2LjkyM1oiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik02MjguNDA1IDM3Ny43OTJDNjU0Ljg5NCAzNjIuNDYxIDY1NS4wNTEgMzEzLjAyIDYyOC43NTQgMjY3LjM2NEM2MDIuNDU3IDIyMS43MDggNTU5LjY2NSAxOTcuMTI0IDUzMy4xNzUgMjEyLjQ1NUM1MDYuNjg2IDIyNy43ODcgNTA2LjUzIDI3Ny4yMjcgNTMyLjgyNyAzMjIuODgzQzU1OS4xMjQgMzY4LjUzOSA2MDEuOTE1IDM5My4xMjMgNjI4LjQwNSAzNzcuNzkyWiIgZmlsbD0id2hpdGUiLz4KPC9zdmc+Cg=='; +export const polkadotChain = + 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iODAwIiBoZWlnaHQ9IjgwMCIgdmlld0JveD0iMCAwIDgwMCA4MDAiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxyZWN0IHdpZHRoPSI4MDAiIGhlaWdodD0iODAwIiByeD0iNDAwIiBmaWxsPSIjRTYwMDdBIi8+CjxwYXRoIGQ9Ik00MDAuMDcyIDI0Ni4wMzhDNDUyLjY2NiAyNDYuMDM4IDQ5NS4zMDIgMjIxLjE4MSA0OTUuMzAyIDE5MC41MTlDNDk1LjMwMiAxNTkuODU3IDQ1Mi42NjYgMTM1IDQwMC4wNzIgMTM1QzM0Ny40NzggMTM1IDMwNC44NDMgMTU5Ljg1NyAzMDQuODQzIDE5MC41MTlDMzA0Ljg0MyAyMjEuMTgxIDM0Ny40NzggMjQ2LjAzOCA0MDAuMDcyIDI0Ni4wMzhaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNNDAwLjA3MiA2NjQuMzY0QzQ1Mi42NjYgNjY0LjM2NCA0OTUuMzAyIDYzOS41MDcgNDk1LjMwMiA2MDguODQ1QzQ5NS4zMDIgNTc4LjE4MyA0NTIuNjY2IDU1My4zMjYgNDAwLjA3MiA1NTMuMzI2QzM0Ny40NzggNTUzLjMyNiAzMDQuODQzIDU3OC4xODMgMzA0Ljg0MyA2MDguODQ1QzMwNC44NDMgNjM5LjUwNyAzNDcuNDc4IDY2NC4zNjQgNDAwLjA3MiA2NjQuMzY0WiIgZmlsbD0id2hpdGUiLz4KPHBhdGggZD0iTTI2Ny4zNjMgMzIyLjg5QzI5My42NiAyNzcuMjMzIDI5My40ODkgMjI3Ljc4NSAyNjYuOTgyIDIxMi40NDNDMjQwLjQ3NSAxOTcuMTAyIDE5Ny42NjggMjIxLjY3NyAxNzEuMzcxIDI2Ny4zMzNDMTQ1LjA3NCAzMTIuOTg5IDE0NS4yNDUgMzYyLjQzOCAxNzEuNzUzIDM3Ny43NzlDMTk4LjI2IDM5My4xMjEgMjQxLjA2NiAzNjguNTQ2IDI2Ny4zNjMgMzIyLjg5WiIgZmlsbD0id2hpdGUiLz4KPHBhdGggZD0iTTYyOC43MzEgNTMyLjAyN0M2NTUuMDI4IDQ4Ni4zNzEgNjU0Ljg3MiA0MzYuOTMxIDYyOC4zODIgNDIxLjZDNjAxLjg5MyA0MDYuMjY5IDU1OS4xMDEgNDMwLjg1MiA1MzIuODA0IDQ3Ni41MDhDNTA2LjUwNyA1MjIuMTY1IDUwNi42NjMgNTcxLjYwNSA1MzMuMTUzIDU4Ni45MzZDNTU5LjY0MyA2MDIuMjY3IDYwMi40MzQgNTc3LjY4NCA2MjguNzMxIDUzMi4wMjdaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNMjY2Ljk5NiA1ODYuOTIzQzI5My41MDMgNTcxLjU4MiAyOTMuNjc0IDUyMi4xMzMgMjY3LjM3NyA0NzYuNDc3QzI0MS4wOCA0MzAuODIxIDE5OC4yNzQgNDA2LjI0NiAxNzEuNzY2IDQyMS41ODdDMTQ1LjI1OSA0MzYuOTI5IDE0NS4wODggNDg2LjM3NyAxNzEuMzg1IDUzMi4wMzRDMTk3LjY4MiA1NzcuNjkgMjQwLjQ4OCA2MDIuMjY1IDI2Ni45OTYgNTg2LjkyM1oiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik02MjguNDA1IDM3Ny43OTJDNjU0Ljg5NCAzNjIuNDYxIDY1NS4wNTEgMzEzLjAyIDYyOC43NTQgMjY3LjM2NEM2MDIuNDU3IDIyMS43MDggNTU5LjY2NSAxOTcuMTI0IDUzMy4xNzUgMjEyLjQ1NUM1MDYuNjg2IDIyNy43ODcgNTA2LjUzIDI3Ny4yMjcgNTMyLjgyNyAzMjIuODgzQzU1OS4xMjQgMzY4LjUzOSA2MDEuOTE1IDM5My4xMjMgNjI4LjQwNSAzNzcuNzkyWiIgZmlsbD0id2hpdGUiLz4KPC9zdmc+Cg=='; diff --git a/packages/core/src/config/logos/generated/polkadotjsWallet.ts b/packages/core/src/config/logos/generated/polkadotjsWallet.ts index a892f7e..0cec324 100644 --- a/packages/core/src/config/logos/generated/polkadotjsWallet.ts +++ b/packages/core/src/config/logos/generated/polkadotjsWallet.ts @@ -3,4 +3,5 @@ // Do not edit. Auto-generated via node scripts/convertLogos.mjs -export const polkadotjsWallet = 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2ZXJzaW9uPSIxLjEiIGlkPSJMYXllcl8xIiB4PSIwcHgiCiAgICAgeT0iMHB4IiB2aWV3Qm94PSIxNSAxNSAxNDAgMTQwIiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAxNzAgMTcwO3pvb206IDE7IiB4bWw6c3BhY2U9InByZXNlcnZlIj48c2NyaXB0IHhtbG5zPSIiLz4KICAgIDxzY3JpcHQgeG1sbnM9IiIgaWQ9ImFyZ2VudC14LWV4dGVuc2lvbiIgZGF0YS1leHRlbnNpb24taWQ9ImRsY29icGppaWdwaWtvb2JvaG1hYmVoaG1oZm9vZGJiIi8+CiAgICA8U0NSSVBUIHhtbG5zPSIiIGlkPSJhbGxvdy1jb3B5X3NjcmlwdCIvPgogICAgPHNjcmlwdCB4bWxucz0iIi8+CiAgICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgogIC5iZzB7ZmlsbDojRkY4QzAwfQogICAgICAgIC5zdDB7ZmlsbDojRkZGRkZGO30KPC9zdHlsZT4KICAgIDxnPjxjaXJjbGUgY2xhc3M9ImJnMCIgY3g9Ijg1IiBjeT0iODUiIHI9IjcwIi8+CiAgICAgICAgPGc+PHBhdGggY2xhc3M9InN0MCIgZD0iTTg1LDM0LjdjLTIwLjgsMC0zNy44LDE2LjktMzcuOCwzNy44YzAsNC4yLDAuNyw4LjMsMiwxMi4zYzAuOSwyLjcsMy45LDQuMiw2LjcsMy4zYzIuNy0wLjksNC4yLTMuOSwzLjMtNi43IGMtMS4xLTMuMS0xLjYtNi40LTEuNS05LjdDNTguMSw1Ny42LDY5LjUsNDYsODMuNiw0NS4zYzE1LjctMC44LDI4LjcsMTEuNywyOC43LDI3LjJjMCwxNC41LTExLjQsMjYuNC0yNS43LDI3LjIgYzAsMC01LjMsMC4zLTcuOSwwLjdjLTEuMywwLjItMi4zLDAuNC0zLDAuNWMtMC4zLDAuMS0wLjYtMC4yLTAuNS0wLjVsMC45LTQuNEw4MSw3My40YzAuNi0yLjgtMS4yLTUuNi00LTYuMiBjLTIuOC0wLjYtNS42LDEuMi02LjIsNGMwLDAtMTEuOCw1NS0xMS45LDU1LjZjLTAuNiwyLjgsMS4yLDUuNiw0LDYuMmMyLjgsMC42LDUuNi0xLjIsNi4yLTRjMC4xLTAuNiwxLjctNy45LDEuNy03LjkgYzEuMi01LjYsNS44LTkuNywxMS4yLTEwLjRjMS4yLTAuMiw1LjktMC41LDUuOS0wLjVjMTkuNS0xLjUsMzQuOS0xNy44LDM0LjktMzcuN0MxMjIuOCw1MS42LDEwNS44LDM0LjcsODUsMzQuN3ogTTg3LjcsMTIxLjcgYy0zLjQtMC43LTYuOCwxLjQtNy41LDQuOWMtMC43LDMuNCwxLjQsNi44LDQuOSw3LjVjMy40LDAuNyw2LjgtMS40LDcuNS00LjlDOTMuMywxMjUuNyw5MS4yLDEyMi40LDg3LjcsMTIxLjd6Ii8+PC9nPjwvZz4KICAgIDxzY3JpcHQgeG1sbnM9IiIvPjwvc3ZnPgo='; +export const polkadotjsWallet = + 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2ZXJzaW9uPSIxLjEiIGlkPSJMYXllcl8xIiB4PSIwcHgiCiAgICAgeT0iMHB4IiB2aWV3Qm94PSIxNSAxNSAxNDAgMTQwIiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAxNzAgMTcwO3pvb206IDE7IiB4bWw6c3BhY2U9InByZXNlcnZlIj48c2NyaXB0IHhtbG5zPSIiLz4KICAgIDxzY3JpcHQgeG1sbnM9IiIgaWQ9ImFyZ2VudC14LWV4dGVuc2lvbiIgZGF0YS1leHRlbnNpb24taWQ9ImRsY29icGppaWdwaWtvb2JvaG1hYmVoaG1oZm9vZGJiIi8+CiAgICA8U0NSSVBUIHhtbG5zPSIiIGlkPSJhbGxvdy1jb3B5X3NjcmlwdCIvPgogICAgPHNjcmlwdCB4bWxucz0iIi8+CiAgICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgogIC5iZzB7ZmlsbDojRkY4QzAwfQogICAgICAgIC5zdDB7ZmlsbDojRkZGRkZGO30KPC9zdHlsZT4KICAgIDxnPjxjaXJjbGUgY2xhc3M9ImJnMCIgY3g9Ijg1IiBjeT0iODUiIHI9IjcwIi8+CiAgICAgICAgPGc+PHBhdGggY2xhc3M9InN0MCIgZD0iTTg1LDM0LjdjLTIwLjgsMC0zNy44LDE2LjktMzcuOCwzNy44YzAsNC4yLDAuNyw4LjMsMiwxMi4zYzAuOSwyLjcsMy45LDQuMiw2LjcsMy4zYzIuNy0wLjksNC4yLTMuOSwzLjMtNi43IGMtMS4xLTMuMS0xLjYtNi40LTEuNS05LjdDNTguMSw1Ny42LDY5LjUsNDYsODMuNiw0NS4zYzE1LjctMC44LDI4LjcsMTEuNywyOC43LDI3LjJjMCwxNC41LTExLjQsMjYuNC0yNS43LDI3LjIgYzAsMC01LjMsMC4zLTcuOSwwLjdjLTEuMywwLjItMi4zLDAuNC0zLDAuNWMtMC4zLDAuMS0wLjYtMC4yLTAuNS0wLjVsMC45LTQuNEw4MSw3My40YzAuNi0yLjgtMS4yLTUuNi00LTYuMiBjLTIuOC0wLjYtNS42LDEuMi02LjIsNGMwLDAtMTEuOCw1NS0xMS45LDU1LjZjLTAuNiwyLjgsMS4yLDUuNiw0LDYuMmMyLjgsMC42LDUuNi0xLjIsNi4yLTRjMC4xLTAuNiwxLjctNy45LDEuNy03LjkgYzEuMi01LjYsNS44LTkuNywxMS4yLTEwLjRjMS4yLTAuMiw1LjktMC41LDUuOS0wLjVjMTkuNS0xLjUsMzQuOS0xNy44LDM0LjktMzcuN0MxMjIuOCw1MS42LDEwNS44LDM0LjcsODUsMzQuN3ogTTg3LjcsMTIxLjcgYy0zLjQtMC43LTYuOCwxLjQtNy41LDQuOWMtMC43LDMuNCwxLjQsNi44LDQuOSw3LjVjMy40LDAuNyw2LjgtMS40LDcuNS00LjlDOTMuMywxMjUuNyw5MS4yLDEyMi40LDg3LjcsMTIxLjd6Ii8+PC9nPjwvZz4KICAgIDxzY3JpcHQgeG1sbnM9IiIvPjwvc3ZnPgo='; diff --git a/packages/core/src/config/logos/generated/polkagateWallet.ts b/packages/core/src/config/logos/generated/polkagateWallet.ts index fe21e65..c6cb0db 100644 --- a/packages/core/src/config/logos/generated/polkagateWallet.ts +++ b/packages/core/src/config/logos/generated/polkagateWallet.ts @@ -3,4 +3,5 @@ // Do not edit. Auto-generated via node scripts/convertLogos.mjs -export const polkagateWallet = 'data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMSIgZGF0YS1uYW1lPSJMYXllciAxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMjggMTI4Ij4KICAgIDxkZWZzPgogICAgICAgIDxzdHlsZT4uY2xzLTF7ZmlsbDojZmZmO30uY2xzLTJ7ZmlsbDojZTMwYjdiO308L3N0eWxlPgogICAgPC9kZWZzPgogICAgPGNpcmNsZSBjbGFzcz0iY2xzLTEiIGN4PSI2NCIgY3k9IjY0IiByPSI2NCIvPgogICAgPHBhdGggY2xhc3M9ImNscy0yIgogICAgICAgICAgZD0iTTEwNi4zNCwyOC42N2EyNy40NCwyNy40NCwwLDAsMC04LjItNC43OCw0Niw0NiwwLDAsMC0xNS42MS0yLjgyLDc2LDc2LDAsMCwwLTIyLjQ4LDMuMSw1NSw1NSwwLDAsMC05LjgsMy41bC0uMTYuMDdBNjIuNSw2Mi41LDAsMCwxLDYzLjU2LDI2LjUsMzkuNTksMzkuNTksMCwwLDEsNzcsMjguOTNhMjMuNjcsMjMuNjcsMCwwLDEsNy4wNyw0LjEyLDE3LjA1LDE3LjA1LDAsMCwxLDYuMTcsMTMuNDNBMjYuNDMsMjYuNDMsMCwwLDEsODYuODMsNTksNTEuMDgsNTEuMDgsMCwwLDEsNzUuMDcsNzMuNDJhNzguODksNzguODksMCwwLDEtMjIuOTEsMTRBNzMuMTEsNzMuMTEsMCwwLDEsMjcuNjMsOTIuOWE0NC42Myw0NC42MywwLDAsMS0xMy4xNC0xLjI1LDI5LjQxLDI5LjQxLDAsMCwwLDguODIsNC40LDUwLjU5LDUwLjU5LDAsMCwwLDE3LjUxLDIuMSw4NC43NSw4NC43NSwwLDAsMCwyOC40Ny02LjRBOTEuNzIsOTEuNzIsMCwwLDAsOTUuODgsNzUuNTRhNTkuMjYsNTkuMjYsMCwwLDAsMTMuNjYtMTYuNzYsMzAuODEsMzAuODEsMCwwLDAsNC0xNC41MkExOS43OSwxOS43OSwwLDAsMCwxMDYuMzQsMjguNjdaIgogICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAwKSIvPgogICAgPHBhdGggZD0iTTY1LjU2LDgwLjU0YzEtLjY2LDItMS4zNCwzLTItMS42OS0uNC0zLjQ0LS44Ni01LTEuMzMtNC43Ni0xLjQ3LTMuMTctNy44Mi0yLTkuMzhhNjguNzIsNjguNzIsMCwwLDAsNy4xNC0xMy40YzEuNDktNC4xLjE5LTkuMjItLjQ5LTExLjM2LS4xMi0uMzMtLjI0LS42Ny0uMzQtMWwtMS44NC01LjU2YTE5LjU2LDE5LjU2LDAsMCwwLTIuNTMtNC42Nyw3LjU4LDcuNTgsMCwwLDAtNi0zLjE0LDE2LjIyLDE2LjIyLDAsMCwwLTMuNzQuMzNjLTIsLjMyLTQsLjY4LTYsMWExLDEsMCwwLDEtLjIxLDBjLjQ4LjYxLjksMS4xNCwxLjMsMS42Ny41OS44LDEuMTcsMS42MiwxLjc3LDIuNDJBOC42Myw4LjYzLDAsMCwxLDUyLjM0LDM5YTE3LjQ5LDE3LjQ5LDAsMCwxLS4yNCwzLjMyLDcwLjMxLDcwLjMxLDAsMCwwLTUuNDUsOC44OUwzMS43NCw4MC42MmExLjM0LDEuMzQsMCwwLDAtLjA3LjE4bC4wNi4wNiw1LTMsLjA2LjA3UTI4Ljc2LDkwLjgsMjAuNzEsMTAzLjY3bC4wNSwwTDIzLDEwMi40Yy0uNjMsMS41NC0xLjIyLDMtMS44NCw0LjU0QTkuNDksOS40OSwwLDAsMCwyNCwxMDUuNGE3LjgyLDcuODIsMCwwLDAsMi4xLTIuNDlsLjQyLjcxLjI5LS4zNWMzLjczLTQuNzMsNy41OS05LjM2LDExLjYzLTEzLjg0YTEwNy4yNSwxMDcuMjUsMCwwLDEsOS43Ny05Ljc3QTIzLjM2LDIzLjM2LDAsMCwxLDUzLDc2LjM1YTUuNCw1LjQsMCwwLDEsMi0uNTlsLTIuNTksMi43OSwwLDBjMS44OC0xLDIuMTUtLjMxLDQtMS4yN2wuMjEuMjJjMS42MiwxLjkyLDUuMjcsMi42LDcuNzcsMi44MkE3LjUzLDcuNTMsMCwwLDEsNjUuNTYsODAuNTRaIgogICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAwKSIvPgo8L3N2Zz4K'; +export const polkagateWallet = + 'data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMSIgZGF0YS1uYW1lPSJMYXllciAxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMjggMTI4Ij4KICAgIDxkZWZzPgogICAgICAgIDxzdHlsZT4uY2xzLTF7ZmlsbDojZmZmO30uY2xzLTJ7ZmlsbDojZTMwYjdiO308L3N0eWxlPgogICAgPC9kZWZzPgogICAgPGNpcmNsZSBjbGFzcz0iY2xzLTEiIGN4PSI2NCIgY3k9IjY0IiByPSI2NCIvPgogICAgPHBhdGggY2xhc3M9ImNscy0yIgogICAgICAgICAgZD0iTTEwNi4zNCwyOC42N2EyNy40NCwyNy40NCwwLDAsMC04LjItNC43OCw0Niw0NiwwLDAsMC0xNS42MS0yLjgyLDc2LDc2LDAsMCwwLTIyLjQ4LDMuMSw1NSw1NSwwLDAsMC05LjgsMy41bC0uMTYuMDdBNjIuNSw2Mi41LDAsMCwxLDYzLjU2LDI2LjUsMzkuNTksMzkuNTksMCwwLDEsNzcsMjguOTNhMjMuNjcsMjMuNjcsMCwwLDEsNy4wNyw0LjEyLDE3LjA1LDE3LjA1LDAsMCwxLDYuMTcsMTMuNDNBMjYuNDMsMjYuNDMsMCwwLDEsODYuODMsNTksNTEuMDgsNTEuMDgsMCwwLDEsNzUuMDcsNzMuNDJhNzguODksNzguODksMCwwLDEtMjIuOTEsMTRBNzMuMTEsNzMuMTEsMCwwLDEsMjcuNjMsOTIuOWE0NC42Myw0NC42MywwLDAsMS0xMy4xNC0xLjI1LDI5LjQxLDI5LjQxLDAsMCwwLDguODIsNC40LDUwLjU5LDUwLjU5LDAsMCwwLDE3LjUxLDIuMSw4NC43NSw4NC43NSwwLDAsMCwyOC40Ny02LjRBOTEuNzIsOTEuNzIsMCwwLDAsOTUuODgsNzUuNTRhNTkuMjYsNTkuMjYsMCwwLDAsMTMuNjYtMTYuNzYsMzAuODEsMzAuODEsMCwwLDAsNC0xNC41MkExOS43OSwxOS43OSwwLDAsMCwxMDYuMzQsMjguNjdaIgogICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAwKSIvPgogICAgPHBhdGggZD0iTTY1LjU2LDgwLjU0YzEtLjY2LDItMS4zNCwzLTItMS42OS0uNC0zLjQ0LS44Ni01LTEuMzMtNC43Ni0xLjQ3LTMuMTctNy44Mi0yLTkuMzhhNjguNzIsNjguNzIsMCwwLDAsNy4xNC0xMy40YzEuNDktNC4xLjE5LTkuMjItLjQ5LTExLjM2LS4xMi0uMzMtLjI0LS42Ny0uMzQtMWwtMS44NC01LjU2YTE5LjU2LDE5LjU2LDAsMCwwLTIuNTMtNC42Nyw3LjU4LDcuNTgsMCwwLDAtNi0zLjE0LDE2LjIyLDE2LjIyLDAsMCwwLTMuNzQuMzNjLTIsLjMyLTQsLjY4LTYsMWExLDEsMCwwLDEtLjIxLDBjLjQ4LjYxLjksMS4xNCwxLjMsMS42Ny41OS44LDEuMTcsMS42MiwxLjc3LDIuNDJBOC42Myw4LjYzLDAsMCwxLDUyLjM0LDM5YTE3LjQ5LDE3LjQ5LDAsMCwxLS4yNCwzLjMyLDcwLjMxLDcwLjMxLDAsMCwwLTUuNDUsOC44OUwzMS43NCw4MC42MmExLjM0LDEuMzQsMCwwLDAtLjA3LjE4bC4wNi4wNiw1LTMsLjA2LjA3UTI4Ljc2LDkwLjgsMjAuNzEsMTAzLjY3bC4wNSwwTDIzLDEwMi40Yy0uNjMsMS41NC0xLjIyLDMtMS44NCw0LjU0QTkuNDksOS40OSwwLDAsMCwyNCwxMDUuNGE3LjgyLDcuODIsMCwwLDAsMi4xLTIuNDlsLjQyLjcxLjI5LS4zNWMzLjczLTQuNzMsNy41OS05LjM2LDExLjYzLTEzLjg0YTEwNy4yNSwxMDcuMjUsMCwwLDEsOS43Ny05Ljc3QTIzLjM2LDIzLjM2LDAsMCwxLDUzLDc2LjM1YTUuNCw1LjQsMCwwLDEsMi0uNTlsLTIuNTksMi43OSwwLDBjMS44OC0xLDIuMTUtLjMxLDQtMS4yN2wuMjEuMjJjMS42MiwxLjkyLDUuMjcsMi42LDcuNzcsMi44MkE3LjUzLDcuNTMsMCwwLDEsNjUuNTYsODAuNTRaIgogICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAwKSIvPgo8L3N2Zz4K'; diff --git a/packages/core/src/config/logos/generated/subwalletWallet.ts b/packages/core/src/config/logos/generated/subwalletWallet.ts index f30e045..1b7bb17 100644 --- a/packages/core/src/config/logos/generated/subwalletWallet.ts +++ b/packages/core/src/config/logos/generated/subwalletWallet.ts @@ -3,4 +3,5 @@ // Do not edit. Auto-generated via node scripts/convertLogos.mjs -export const subwalletWallet = 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNzA0IiBoZWlnaHQ9IjcwNCIgdmlld0JveD0iMCAwIDcwNCA3MDQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiAgICA8ZyBjbGlwLXBhdGg9InVybCgjY2xpcDBfMzYyXzgwMTcpIj4KICAgICAgICA8bWFzayBpZD0ibWFzazBfMzYyXzgwMTciIHN0eWxlPSJtYXNrLXR5cGU6YWxwaGEiIG1hc2tVbml0cz0idXNlclNwYWNlT25Vc2UiIHg9IjAiIHk9IjAiIHdpZHRoPSI3MDQiCiAgICAgICAgICAgICAgaGVpZ2h0PSI3MDQiPgogICAgICAgICAgICA8cmVjdCB3aWR0aD0iNzA0IiBoZWlnaHQ9IjcwNCIgcng9IjQ4IiBmaWxsPSJ1cmwoI3BhaW50MF9saW5lYXJfMzYyXzgwMTcpIi8+CiAgICAgICAgPC9tYXNrPgogICAgICAgIDxnIG1hc2s9InVybCgjbWFzazBfMzYyXzgwMTcpIj4KICAgICAgICAgICAgPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAxXzM2Ml84MDE3KSI+CiAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD0iMTg0Ny4wOSIgaGVpZ2h0PSIxMjYwLjc5IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtNTI5IDE3Ni45MzcpIHJvdGF0ZSgtMjMuMjgpIgogICAgICAgICAgICAgICAgICAgICAgZmlsbD0iIzBDMEMwQyIvPgogICAgICAgICAgICAgICAgPGcgb3BhY2l0eT0iMC41IiBmaWx0ZXI9InVybCgjZmlsdGVyMF9mXzM2Ml84MDE3KSI+CiAgICAgICAgICAgICAgICAgICAgPGVsbGlwc2UgY3g9IjI5MC40NjQiIGN5PSIyMjQuNzUxIiByeD0iMjkwLjQ2NCIgcnk9IjIyNC43NTEiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC41NzEyMzggMC44MjA3ODUgMC43MjIxOTEgLTAuNjkxNjk0IC03MS45NDk3IDY1MS4wMjEpIiBmaWxsPSIjNzMxMTQwIi8+CiAgICAgICAgICAgICAgICA8L2c+CiAgICAgICAgICAgICAgICA8ZyBvcGFjaXR5PSIwLjciIGZpbHRlcj0idXJsKCNmaWx0ZXIxX2ZfMzYyXzgwMTcpIj4KICAgICAgICAgICAgICAgICAgICA8ZWxsaXBzZSBjeD0iMzIxLjY2NSIgY3k9IjMwNi44MjEiIHJ4PSIzMjEuNjY1IiByeT0iMzA2LjgyMSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjgwMjIyOCAtMC41OTcwMTggLTAuNTEwNDgzIC0wLjg1OTg4OCAtMjQ2LjQ3MiAxMzQ2LjM5KSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPSIjMDA0QkZGIi8+CiAgICAgICAgICAgICAgICA8L2c+CiAgICAgICAgICAgICAgICA8ZyBvcGFjaXR5PSIwLjciIGZpbHRlcj0idXJsKCNmaWx0ZXIyX2ZfMzYyXzgwMTcpIj4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNOTk5LjU1NiAtMTkzLjU4MkM4NTUuMTkgLTE2NS4yNzkgNzgyLjM5MyAtMjg5LjM2NSA2NjYuMTMyIC0xOTYuNzNDMzk2Ljk4IDE3LjcyNTUgODA2LjAxNiA1NzAuMjU0IDExNTAuMzEgNjE0LjgyNEMxMzU3LjQ3IDY0MS42NDEgMTM4OC40NyA2ODcuNDQ0IDE1MTYuMTQgNTE4LjUyNUMxNjQwLjcxIDM1My43MjEgMTY3MC4yNCAyNTAuNDU5IDE2NzcuMzYgMjkuMzkwNUMxNjc5Ljk1IC01MC45ODcgMTY2MS42NyAtMTg5LjkyNSAxNjAwLjcyIC0yNjQuODM5QzE1MzEuMjEgLTM1MC4yNzkgMTQ0My40NyAtMzYxLjQ0MiAxMzQ3LjE4IC0zMzYuNzkyQzEyNDguMDUgLTMxMS40MTYgMTE3OC43MiAtMjI4LjcwOCA5OTkuNTU2IC0xOTMuNTgyWiIKICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPSIjMUU5Qjc2Ii8+CiAgICAgICAgICAgICAgICA8L2c+CiAgICAgICAgICAgIDwvZz4KICAgICAgICA8L2c+CiAgICAgICAgPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAyXzM2Ml84MDE3KSI+CiAgICAgICAgICAgIDxwYXRoIGQ9Ik01MTIgMzAxLjU5OVYyMzQuOTlMMjQ1LjI4NiAxMjhMMTkyIDE1NS4wNkwxOTIuMjgxIDM2Mi4zOEwzOTEuODI0IDQ0Mi43MjdMMjg1LjI1MSA0ODguMTA0VjQ1My4wMTNMMjM2LjMyNCA0MzMuMTUyTDE5Mi4yODEgNDUzLjk2N0wxOTIuMjgxIDU4MC45NEwyNDUuMzMzIDYwOEw1MTIgNDg3LjY4OFY0MDIuMzQ1TDI3MiAzMDYuMjgzVjI0OEw0NjIuNDE3IDMyNC4wOEw1MTIgMzAxLjU5OVoiCiAgICAgICAgICAgICAgICAgIGZpbGw9IndoaXRlIi8+CiAgICAgICAgPC9nPgogICAgPC9nPgogICAgPGRlZnM+CiAgICAgICAgPGZpbHRlciBpZD0iZmlsdGVyMF9mXzM2Ml84MDE3IiB4PSItMjc1LjgyNSIgeT0iMTQ5LjMyMiIgd2lkdGg9IjEwNjQuMjMiIGhlaWdodD0iMTE2OS4zIgogICAgICAgICAgICAgICAgZmlsdGVyVW5pdHM9InVzZXJTcGFjZU9uVXNlIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICAgICAgICAgICA8ZmVGbG9vZCBmbG9vZC1vcGFjaXR5PSIwIiByZXN1bHQ9IkJhY2tncm91bmRJbWFnZUZpeCIvPgogICAgICAgICAgICA8ZmVCbGVuZCBtb2RlPSJub3JtYWwiIGluPSJTb3VyY2VHcmFwaGljIiBpbjI9IkJhY2tncm91bmRJbWFnZUZpeCIgcmVzdWx0PSJzaGFwZSIvPgogICAgICAgICAgICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIxNTAiIHJlc3VsdD0iZWZmZWN0MV9mb3JlZ3JvdW5kQmx1cl8zNjJfODAxNyIvPgogICAgICAgIDwvZmlsdGVyPgogICAgICAgIDxmaWx0ZXIgaWQ9ImZpbHRlcjFfZl8zNjJfODAxNyIgeD0iLTc0Ni45NTciIHk9IjI2NC4xNjciIHdpZHRoPSIxMjAzLjgxIiBoZWlnaHQ9IjEyNTIuNjkiCiAgICAgICAgICAgICAgICBmaWx0ZXJVbml0cz0idXNlclNwYWNlT25Vc2UiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgICAgICAgICAgIDxmZUZsb29kIGZsb29kLW9wYWNpdHk9IjAiIHJlc3VsdD0iQmFja2dyb3VuZEltYWdlRml4Ii8+CiAgICAgICAgICAgIDxmZUJsZW5kIG1vZGU9Im5vcm1hbCIgaW49IlNvdXJjZUdyYXBoaWMiIGluMj0iQmFja2dyb3VuZEltYWdlRml4IiByZXN1bHQ9InNoYXBlIi8+CiAgICAgICAgICAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjE1MCIgcmVzdWx0PSJlZmZlY3QxX2ZvcmVncm91bmRCbHVyXzM2Ml84MDE3Ii8+CiAgICAgICAgPC9maWx0ZXI+CiAgICAgICAgPGZpbHRlciBpZD0iZmlsdGVyMl9mXzM2Ml84MDE3IiB4PSItMjEuMDExNyIgeT0iLTk0OC4yNzEiIHdpZHRoPSIyMjk4LjYxIiBoZWlnaHQ9IjIxODkuNjQiCiAgICAgICAgICAgICAgICBmaWx0ZXJVbml0cz0idXNlclNwYWNlT25Vc2UiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgICAgICAgICAgIDxmZUZsb29kIGZsb29kLW9wYWNpdHk9IjAiIHJlc3VsdD0iQmFja2dyb3VuZEltYWdlRml4Ii8+CiAgICAgICAgICAgIDxmZUJsZW5kIG1vZGU9Im5vcm1hbCIgaW49IlNvdXJjZUdyYXBoaWMiIGluMj0iQmFja2dyb3VuZEltYWdlRml4IiByZXN1bHQ9InNoYXBlIi8+CiAgICAgICAgICAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjMwMCIgcmVzdWx0PSJlZmZlY3QxX2ZvcmVncm91bmRCbHVyXzM2Ml84MDE3Ii8+CiAgICAgICAgPC9maWx0ZXI+CiAgICAgICAgPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDBfbGluZWFyXzM2Ml84MDE3IiB4MT0iMzUyIiB5MT0iMCIgeDI9IjM1MiIgeTI9IjcwNCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjMDA0QkZGIi8+CiAgICAgICAgICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzRDRUFBQyIvPgogICAgICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICAgICAgPGNsaXBQYXRoIGlkPSJjbGlwMF8zNjJfODAxNyI+CiAgICAgICAgICAgIDxyZWN0IHdpZHRoPSI3MDQiIGhlaWdodD0iNzA0IiByeD0iMTYiIGZpbGw9IndoaXRlIi8+CiAgICAgICAgPC9jbGlwUGF0aD4KICAgICAgICA8Y2xpcFBhdGggaWQ9ImNsaXAxXzM2Ml84MDE3Ij4KICAgICAgICAgICAgPHJlY3Qgd2lkdGg9IjE4NDcuMDkiIGhlaWdodD0iMTI2MC43OSIgZmlsbD0id2hpdGUiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC01MjkgMTc2LjkzNykgcm90YXRlKC0yMy4yOCkiLz4KICAgICAgICA8L2NsaXBQYXRoPgogICAgICAgIDxjbGlwUGF0aCBpZD0iY2xpcDJfMzYyXzgwMTciPgogICAgICAgICAgICA8cmVjdCB3aWR0aD0iMzIwIiBoZWlnaHQ9IjQ4MCIgZmlsbD0id2hpdGUiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE5MiAxMjgpIi8+CiAgICAgICAgPC9jbGlwUGF0aD4KICAgIDwvZGVmcz4KPC9zdmc+Cg=='; +export const subwalletWallet = + 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNzA0IiBoZWlnaHQ9IjcwNCIgdmlld0JveD0iMCAwIDcwNCA3MDQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiAgICA8ZyBjbGlwLXBhdGg9InVybCgjY2xpcDBfMzYyXzgwMTcpIj4KICAgICAgICA8bWFzayBpZD0ibWFzazBfMzYyXzgwMTciIHN0eWxlPSJtYXNrLXR5cGU6YWxwaGEiIG1hc2tVbml0cz0idXNlclNwYWNlT25Vc2UiIHg9IjAiIHk9IjAiIHdpZHRoPSI3MDQiCiAgICAgICAgICAgICAgaGVpZ2h0PSI3MDQiPgogICAgICAgICAgICA8cmVjdCB3aWR0aD0iNzA0IiBoZWlnaHQ9IjcwNCIgcng9IjQ4IiBmaWxsPSJ1cmwoI3BhaW50MF9saW5lYXJfMzYyXzgwMTcpIi8+CiAgICAgICAgPC9tYXNrPgogICAgICAgIDxnIG1hc2s9InVybCgjbWFzazBfMzYyXzgwMTcpIj4KICAgICAgICAgICAgPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAxXzM2Ml84MDE3KSI+CiAgICAgICAgICAgICAgICA8cmVjdCB3aWR0aD0iMTg0Ny4wOSIgaGVpZ2h0PSIxMjYwLjc5IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtNTI5IDE3Ni45MzcpIHJvdGF0ZSgtMjMuMjgpIgogICAgICAgICAgICAgICAgICAgICAgZmlsbD0iIzBDMEMwQyIvPgogICAgICAgICAgICAgICAgPGcgb3BhY2l0eT0iMC41IiBmaWx0ZXI9InVybCgjZmlsdGVyMF9mXzM2Ml84MDE3KSI+CiAgICAgICAgICAgICAgICAgICAgPGVsbGlwc2UgY3g9IjI5MC40NjQiIGN5PSIyMjQuNzUxIiByeD0iMjkwLjQ2NCIgcnk9IjIyNC43NTEiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtPSJtYXRyaXgoMC41NzEyMzggMC44MjA3ODUgMC43MjIxOTEgLTAuNjkxNjk0IC03MS45NDk3IDY1MS4wMjEpIiBmaWxsPSIjNzMxMTQwIi8+CiAgICAgICAgICAgICAgICA8L2c+CiAgICAgICAgICAgICAgICA8ZyBvcGFjaXR5PSIwLjciIGZpbHRlcj0idXJsKCNmaWx0ZXIxX2ZfMzYyXzgwMTcpIj4KICAgICAgICAgICAgICAgICAgICA8ZWxsaXBzZSBjeD0iMzIxLjY2NSIgY3k9IjMwNi44MjEiIHJ4PSIzMjEuNjY1IiByeT0iMzA2LjgyMSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm09Im1hdHJpeCgwLjgwMjIyOCAtMC41OTcwMTggLTAuNTEwNDgzIC0wLjg1OTg4OCAtMjQ2LjQ3MiAxMzQ2LjM5KSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPSIjMDA0QkZGIi8+CiAgICAgICAgICAgICAgICA8L2c+CiAgICAgICAgICAgICAgICA8ZyBvcGFjaXR5PSIwLjciIGZpbHRlcj0idXJsKCNmaWx0ZXIyX2ZfMzYyXzgwMTcpIj4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNOTk5LjU1NiAtMTkzLjU4MkM4NTUuMTkgLTE2NS4yNzkgNzgyLjM5MyAtMjg5LjM2NSA2NjYuMTMyIC0xOTYuNzNDMzk2Ljk4IDE3LjcyNTUgODA2LjAxNiA1NzAuMjU0IDExNTAuMzEgNjE0LjgyNEMxMzU3LjQ3IDY0MS42NDEgMTM4OC40NyA2ODcuNDQ0IDE1MTYuMTQgNTE4LjUyNUMxNjQwLjcxIDM1My43MjEgMTY3MC4yNCAyNTAuNDU5IDE2NzcuMzYgMjkuMzkwNUMxNjc5Ljk1IC01MC45ODcgMTY2MS42NyAtMTg5LjkyNSAxNjAwLjcyIC0yNjQuODM5QzE1MzEuMjEgLTM1MC4yNzkgMTQ0My40NyAtMzYxLjQ0MiAxMzQ3LjE4IC0zMzYuNzkyQzEyNDguMDUgLTMxMS40MTYgMTE3OC43MiAtMjI4LjcwOCA5OTkuNTU2IC0xOTMuNTgyWiIKICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPSIjMUU5Qjc2Ii8+CiAgICAgICAgICAgICAgICA8L2c+CiAgICAgICAgICAgIDwvZz4KICAgICAgICA8L2c+CiAgICAgICAgPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAyXzM2Ml84MDE3KSI+CiAgICAgICAgICAgIDxwYXRoIGQ9Ik01MTIgMzAxLjU5OVYyMzQuOTlMMjQ1LjI4NiAxMjhMMTkyIDE1NS4wNkwxOTIuMjgxIDM2Mi4zOEwzOTEuODI0IDQ0Mi43MjdMMjg1LjI1MSA0ODguMTA0VjQ1My4wMTNMMjM2LjMyNCA0MzMuMTUyTDE5Mi4yODEgNDUzLjk2N0wxOTIuMjgxIDU4MC45NEwyNDUuMzMzIDYwOEw1MTIgNDg3LjY4OFY0MDIuMzQ1TDI3MiAzMDYuMjgzVjI0OEw0NjIuNDE3IDMyNC4wOEw1MTIgMzAxLjU5OVoiCiAgICAgICAgICAgICAgICAgIGZpbGw9IndoaXRlIi8+CiAgICAgICAgPC9nPgogICAgPC9nPgogICAgPGRlZnM+CiAgICAgICAgPGZpbHRlciBpZD0iZmlsdGVyMF9mXzM2Ml84MDE3IiB4PSItMjc1LjgyNSIgeT0iMTQ5LjMyMiIgd2lkdGg9IjEwNjQuMjMiIGhlaWdodD0iMTE2OS4zIgogICAgICAgICAgICAgICAgZmlsdGVyVW5pdHM9InVzZXJTcGFjZU9uVXNlIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgogICAgICAgICAgICA8ZmVGbG9vZCBmbG9vZC1vcGFjaXR5PSIwIiByZXN1bHQ9IkJhY2tncm91bmRJbWFnZUZpeCIvPgogICAgICAgICAgICA8ZmVCbGVuZCBtb2RlPSJub3JtYWwiIGluPSJTb3VyY2VHcmFwaGljIiBpbjI9IkJhY2tncm91bmRJbWFnZUZpeCIgcmVzdWx0PSJzaGFwZSIvPgogICAgICAgICAgICA8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIxNTAiIHJlc3VsdD0iZWZmZWN0MV9mb3JlZ3JvdW5kQmx1cl8zNjJfODAxNyIvPgogICAgICAgIDwvZmlsdGVyPgogICAgICAgIDxmaWx0ZXIgaWQ9ImZpbHRlcjFfZl8zNjJfODAxNyIgeD0iLTc0Ni45NTciIHk9IjI2NC4xNjciIHdpZHRoPSIxMjAzLjgxIiBoZWlnaHQ9IjEyNTIuNjkiCiAgICAgICAgICAgICAgICBmaWx0ZXJVbml0cz0idXNlclNwYWNlT25Vc2UiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgICAgICAgICAgIDxmZUZsb29kIGZsb29kLW9wYWNpdHk9IjAiIHJlc3VsdD0iQmFja2dyb3VuZEltYWdlRml4Ii8+CiAgICAgICAgICAgIDxmZUJsZW5kIG1vZGU9Im5vcm1hbCIgaW49IlNvdXJjZUdyYXBoaWMiIGluMj0iQmFja2dyb3VuZEltYWdlRml4IiByZXN1bHQ9InNoYXBlIi8+CiAgICAgICAgICAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjE1MCIgcmVzdWx0PSJlZmZlY3QxX2ZvcmVncm91bmRCbHVyXzM2Ml84MDE3Ii8+CiAgICAgICAgPC9maWx0ZXI+CiAgICAgICAgPGZpbHRlciBpZD0iZmlsdGVyMl9mXzM2Ml84MDE3IiB4PSItMjEuMDExNyIgeT0iLTk0OC4yNzEiIHdpZHRoPSIyMjk4LjYxIiBoZWlnaHQ9IjIxODkuNjQiCiAgICAgICAgICAgICAgICBmaWx0ZXJVbml0cz0idXNlclNwYWNlT25Vc2UiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CiAgICAgICAgICAgIDxmZUZsb29kIGZsb29kLW9wYWNpdHk9IjAiIHJlc3VsdD0iQmFja2dyb3VuZEltYWdlRml4Ii8+CiAgICAgICAgICAgIDxmZUJsZW5kIG1vZGU9Im5vcm1hbCIgaW49IlNvdXJjZUdyYXBoaWMiIGluMj0iQmFja2dyb3VuZEltYWdlRml4IiByZXN1bHQ9InNoYXBlIi8+CiAgICAgICAgICAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjMwMCIgcmVzdWx0PSJlZmZlY3QxX2ZvcmVncm91bmRCbHVyXzM2Ml84MDE3Ii8+CiAgICAgICAgPC9maWx0ZXI+CiAgICAgICAgPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDBfbGluZWFyXzM2Ml84MDE3IiB4MT0iMzUyIiB5MT0iMCIgeDI9IjM1MiIgeTI9IjcwNCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgICAgICAgICA8c3RvcCBzdG9wLWNvbG9yPSIjMDA0QkZGIi8+CiAgICAgICAgICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzRDRUFBQyIvPgogICAgICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICAgICAgPGNsaXBQYXRoIGlkPSJjbGlwMF8zNjJfODAxNyI+CiAgICAgICAgICAgIDxyZWN0IHdpZHRoPSI3MDQiIGhlaWdodD0iNzA0IiByeD0iMTYiIGZpbGw9IndoaXRlIi8+CiAgICAgICAgPC9jbGlwUGF0aD4KICAgICAgICA8Y2xpcFBhdGggaWQ9ImNsaXAxXzM2Ml84MDE3Ij4KICAgICAgICAgICAgPHJlY3Qgd2lkdGg9IjE4NDcuMDkiIGhlaWdodD0iMTI2MC43OSIgZmlsbD0id2hpdGUiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC01MjkgMTc2LjkzNykgcm90YXRlKC0yMy4yOCkiLz4KICAgICAgICA8L2NsaXBQYXRoPgogICAgICAgIDxjbGlwUGF0aCBpZD0iY2xpcDJfMzYyXzgwMTciPgogICAgICAgICAgICA8cmVjdCB3aWR0aD0iMzIwIiBoZWlnaHQ9IjQ4MCIgZmlsbD0id2hpdGUiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE5MiAxMjgpIi8+CiAgICAgICAgPC9jbGlwUGF0aD4KICAgIDwvZGVmcz4KPC9zdmc+Cg=='; diff --git a/packages/core/src/config/logos/generated/talismanWallet.ts b/packages/core/src/config/logos/generated/talismanWallet.ts index a2587e2..b8bb687 100644 --- a/packages/core/src/config/logos/generated/talismanWallet.ts +++ b/packages/core/src/config/logos/generated/talismanWallet.ts @@ -3,4 +3,5 @@ // Do not edit. Auto-generated via node scripts/convertLogos.mjs -export const talismanWallet = 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMjgiIGhlaWdodD0iMTI4IiB2aWV3Qm94PSIwIDAgMTI4IDEyOCI+CiAgICA8cGF0aCBmaWxsPSIjZGRmZTc2IiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0wIDcwLjI1YzAgMjEuMjU1IDAgMzEuODgzIDQuNDYzIDM5Ljg1MmEzNSAzNSAwIDAgMCAxMy40MzUgMTMuNDM1QzI1Ljg2NyAxMjggMzYuNDk1IDEyOCA1Ny43NSAxMjhoMTIuNWMyMS4yNTUgMCAzMS44ODMgMCAzOS44NTItNC40NjNhMzUgMzUgMCAwIDAgMTMuNDM1LTEzLjQzNUMxMjggMTAyLjEzMyAxMjggOTEuNTA1IDEyOCA3MC4yNXYtMTIuNWMwLTIxLjI1NSAwLTMxLjg4My00LjQ2My0zOS44NTJhMzUgMzUgMCAwIDAtMTMuNDM1LTEzLjQzNUMxMDIuMTMzIDAgOTEuNTA1IDAgNzAuMjUgMGgtMTIuNUMzNi40OTUgMCAyNS44NjcgMCAxNy44OTggNC40NjNBMzUgMzUgMCAwIDAgNC40NjMgMTcuODk4QzAgMjUuODY3IDAgMzYuNDk1IDAgNTcuNzVaIi8+CiAgICA8cGF0aCBmaWxsPSIjZWE1NzUwIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Im0zMy44NzkgMzUuMTE3LS41IDE5LjE2NWM4LjEwNyA0LjE2OCAxNS43NSA0LjA3NSAyNC43NCAyLjA2MyAzLjU2LTEuMzk3IDYuMDU2LTEuNzAyIDkuNTExIDAgOS4wNjcgMi44MTYgMTYuOTY5IDEuOTUgMjUuMTg1LTIuMjQzbC0uNDg1LTE5LjE4N2MwLTEwLjgwNS03LjAwNC0xNC45NjItMTQuNjMyLTEyLjczOS0uNzc5LjIzMi0xLjk0NCAxLjI3NC0xLjk0NCAyLjIwN2wtLjE4MSAxOC43MzNhMS43NyAxLjc3IDAgMSAxLTMuNTM4LS4wMTVWMjAuMDY3YTguODM4IDguODM4IDAgMCAwLTE3LjY3NSAwVjQzLjFhMS43NyAxLjc3IDAgMSAxLTMuNTM4LjAxNWwtLjE3Ni0xOC43NDNjMC0uOTIzLTEuMTA5LTEuOTYtMS44ODItMi4xOTItOC44LTIuNjEtMTQuODggMi41MzgtMTQuODggMTIuOTM2Wm0yLjQ3NSAyMy44NDNhNDguNDMgNDguNDMgMCAwIDEtNS4yMDktMi4yNTRjLTQuNzMtMi4yNjktMTIuMDk1LTEuNTYyLTE3LjA3MiA0LjExMS0yLjI3NCAyLjYtLjUxNSA2LjM2IDIuNzcgNy40NDggMS41ODMuNTI2IDMuMDE3IDEuNDEzIDQuMzUzIDIuNDA4bC40NjQuMzM2YzQuMTMyIDIuOTY1IDYuNzkzIDcuNDA2IDcuMDU2IDEyLjQ4NmwuMjUzIDQuODEyYTMxLjYxNiAzMS42MTYgMCAwIDAgMTkuNDI4IDI1Ljk1OSAzOC41OSAzOC41OSAwIDAgMCAyOS4zMjcgMCAzMS42MTYgMzEuNjE2IDAgMCAwIDE5LjQyOS0yNS45NTljLjA0Ni0uODI1LjA2MS0xLjY1LjA1MS0yLjQ2NWwuMTI0LTIuMzQ3Yy4yNjMtNS4wOCAyLjkyNC05LjUyIDcuMDU2LTEyLjQ4NmwuNDY0LS4zMzZjMS4zNC0uOTk1IDIuNzctMS44ODIgNC4zNTMtMi40MDggMy4yODUtMS4wODkgNS4wNS00Ljg0OSAyLjc3LTcuNDQ4LTQuOTc4LTUuNjczLTEyLjM0My02LjM3NS0xNy4wNzItNC4xMS0xLjcxOC44MjUtMy40MzUgMS42NS01LjIxIDIuMjUzbC0zLjYyIDEuMjM4LS4wMS4wNDFjLTYuNjU0IDEuODQyLTEyLjEyIDEuODQ3LTE4LjM5OC0uNzQyLTMuMTc3LTEuMzEtNi4zOC0xLjU1OC05LjQ4IDAtNS45NjcgMS44NTYtMTIuMDQ4IDIuNjQtMTguMjA2LjcwMWwtMy42MjYtMS4yMzhabTI2LjY2NSA0NC43MzJjMTMuMzkgMCAyNC4yNDEtMTUuNTk2IDI0LjI0MS0xNS41OTZTNzYuNDEgNzIuNDk5IDYzLjAyIDcyLjQ5OWMtMTMuMzg1IDAtMjQuMjM2IDE1LjU5Ny0yNC4yMzYgMTUuNTk3czEwLjg1MSAxNS41OTYgMjQuMjQgMTUuNTk2Wm0xMC44ODMtMTUuNTk2YzAgNi4wMS00Ljg3MiAxMC44ODItMTAuODgzIDEwLjg4Mi02LjAxIDAtMTAuODgyLTQuODcyLTEwLjg4Mi0xMC44ODJzNC44NzItMTAuODgzIDEwLjg4Mi0xMC44ODMgMTAuODgzIDQuODcyIDEwLjg4MyAxMC44ODNabS0xMC44ODMgNC45MzZhNC45MzYgNC45MzYgMCAxIDAgMC05Ljg3MiA0LjkzNiA0LjkzNiAwIDAgMCAwIDkuODcyWiIvPgo8L3N2Zz4K'; +export const talismanWallet = + 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMjgiIGhlaWdodD0iMTI4IiB2aWV3Qm94PSIwIDAgMTI4IDEyOCI+CiAgICA8cGF0aCBmaWxsPSIjZGRmZTc2IiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0wIDcwLjI1YzAgMjEuMjU1IDAgMzEuODgzIDQuNDYzIDM5Ljg1MmEzNSAzNSAwIDAgMCAxMy40MzUgMTMuNDM1QzI1Ljg2NyAxMjggMzYuNDk1IDEyOCA1Ny43NSAxMjhoMTIuNWMyMS4yNTUgMCAzMS44ODMgMCAzOS44NTItNC40NjNhMzUgMzUgMCAwIDAgMTMuNDM1LTEzLjQzNUMxMjggMTAyLjEzMyAxMjggOTEuNTA1IDEyOCA3MC4yNXYtMTIuNWMwLTIxLjI1NSAwLTMxLjg4My00LjQ2My0zOS44NTJhMzUgMzUgMCAwIDAtMTMuNDM1LTEzLjQzNUMxMDIuMTMzIDAgOTEuNTA1IDAgNzAuMjUgMGgtMTIuNUMzNi40OTUgMCAyNS44NjcgMCAxNy44OTggNC40NjNBMzUgMzUgMCAwIDAgNC40NjMgMTcuODk4QzAgMjUuODY3IDAgMzYuNDk1IDAgNTcuNzVaIi8+CiAgICA8cGF0aCBmaWxsPSIjZWE1NzUwIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Im0zMy44NzkgMzUuMTE3LS41IDE5LjE2NWM4LjEwNyA0LjE2OCAxNS43NSA0LjA3NSAyNC43NCAyLjA2MyAzLjU2LTEuMzk3IDYuMDU2LTEuNzAyIDkuNTExIDAgOS4wNjcgMi44MTYgMTYuOTY5IDEuOTUgMjUuMTg1LTIuMjQzbC0uNDg1LTE5LjE4N2MwLTEwLjgwNS03LjAwNC0xNC45NjItMTQuNjMyLTEyLjczOS0uNzc5LjIzMi0xLjk0NCAxLjI3NC0xLjk0NCAyLjIwN2wtLjE4MSAxOC43MzNhMS43NyAxLjc3IDAgMSAxLTMuNTM4LS4wMTVWMjAuMDY3YTguODM4IDguODM4IDAgMCAwLTE3LjY3NSAwVjQzLjFhMS43NyAxLjc3IDAgMSAxLTMuNTM4LjAxNWwtLjE3Ni0xOC43NDNjMC0uOTIzLTEuMTA5LTEuOTYtMS44ODItMi4xOTItOC44LTIuNjEtMTQuODggMi41MzgtMTQuODggMTIuOTM2Wm0yLjQ3NSAyMy44NDNhNDguNDMgNDguNDMgMCAwIDEtNS4yMDktMi4yNTRjLTQuNzMtMi4yNjktMTIuMDk1LTEuNTYyLTE3LjA3MiA0LjExMS0yLjI3NCAyLjYtLjUxNSA2LjM2IDIuNzcgNy40NDggMS41ODMuNTI2IDMuMDE3IDEuNDEzIDQuMzUzIDIuNDA4bC40NjQuMzM2YzQuMTMyIDIuOTY1IDYuNzkzIDcuNDA2IDcuMDU2IDEyLjQ4NmwuMjUzIDQuODEyYTMxLjYxNiAzMS42MTYgMCAwIDAgMTkuNDI4IDI1Ljk1OSAzOC41OSAzOC41OSAwIDAgMCAyOS4zMjcgMCAzMS42MTYgMzEuNjE2IDAgMCAwIDE5LjQyOS0yNS45NTljLjA0Ni0uODI1LjA2MS0xLjY1LjA1MS0yLjQ2NWwuMTI0LTIuMzQ3Yy4yNjMtNS4wOCAyLjkyNC05LjUyIDcuMDU2LTEyLjQ4NmwuNDY0LS4zMzZjMS4zNC0uOTk1IDIuNzctMS44ODIgNC4zNTMtMi40MDggMy4yODUtMS4wODkgNS4wNS00Ljg0OSAyLjc3LTcuNDQ4LTQuOTc4LTUuNjczLTEyLjM0My02LjM3NS0xNy4wNzItNC4xMS0xLjcxOC44MjUtMy40MzUgMS42NS01LjIxIDIuMjUzbC0zLjYyIDEuMjM4LS4wMS4wNDFjLTYuNjU0IDEuODQyLTEyLjEyIDEuODQ3LTE4LjM5OC0uNzQyLTMuMTc3LTEuMzEtNi4zOC0xLjU1OC05LjQ4IDAtNS45NjcgMS44NTYtMTIuMDQ4IDIuNjQtMTguMjA2LjcwMWwtMy42MjYtMS4yMzhabTI2LjY2NSA0NC43MzJjMTMuMzkgMCAyNC4yNDEtMTUuNTk2IDI0LjI0MS0xNS41OTZTNzYuNDEgNzIuNDk5IDYzLjAyIDcyLjQ5OWMtMTMuMzg1IDAtMjQuMjM2IDE1LjU5Ny0yNC4yMzYgMTUuNTk3czEwLjg1MSAxNS41OTYgMjQuMjQgMTUuNTk2Wm0xMC44ODMtMTUuNTk2YzAgNi4wMS00Ljg3MiAxMC44ODItMTAuODgzIDEwLjg4Mi02LjAxIDAtMTAuODgyLTQuODcyLTEwLjg4Mi0xMC44ODJzNC44NzItMTAuODgzIDEwLjg4Mi0xMC44ODMgMTAuODgzIDQuODcyIDEwLjg4MyAxMC44ODNabS0xMC44ODMgNC45MzZhNC45MzYgNC45MzYgMCAxIDAgMC05Ljg3MiA0LjkzNiA0LjkzNiAwIDAgMCAwIDkuODcyWiIvPgo8L3N2Zz4K'; diff --git a/packages/core/src/config/logos/generated/walletconnectWallet.ts b/packages/core/src/config/logos/generated/walletconnectWallet.ts index 137eba7..452b584 100644 --- a/packages/core/src/config/logos/generated/walletconnectWallet.ts +++ b/packages/core/src/config/logos/generated/walletconnectWallet.ts @@ -3,4 +3,5 @@ // Do not edit. Auto-generated via node scripts/convertLogos.mjs -export const walletconnectWallet = 'data:image/svg+xml;base64,PHN2ZyBmaWxsPSJub25lIiBoZWlnaHQ9IjQwMCIgdmlld0JveD0iMCAwIDQwMCA0MDAiIHdpZHRoPSI0MDAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgICB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8Y2xpcFBhdGggaWQ9ImEiPgogICAgICAgIDxwYXRoIGQ9Im0wIDBoNDAwdjQwMGgtNDAweiIvPgogICAgPC9jbGlwUGF0aD4KICAgIDxnIGNsaXAtcGF0aD0idXJsKCNhKSI+CiAgICAgICAgPGNpcmNsZSBjeD0iMjAwIiBjeT0iMjAwIiBmaWxsPSIjMzM5NmZmIiByPSIxOTkuNSIgc3Ryb2tlPSIjNjZiMWZmIi8+CiAgICAgICAgPHBhdGggZD0ibTEyMi41MTkgMTQ4Ljk2NWM0Mi43OTEtNDEuNzI5IDExMi4xNzEtNDEuNzI5IDE1NC45NjIgMGw1LjE1IDUuMDIyYzIuMTQgMi4wODYgMi4xNCA1LjQ2OSAwIDcuNTU1bC0xNy42MTcgMTcuMThjLTEuMDcgMS4wNDMtMi44MDQgMS4wNDMtMy44NzQgMGwtNy4wODctNi45MTFjLTI5Ljg1My0yOS4xMTEtNzguMjUzLTI5LjExMS0xMDguMTA2IDBsLTcuNTkgNy40MDFjLTEuMDcgMS4wNDMtMi44MDQgMS4wNDMtMy44NzQgMGwtMTcuNjE3LTE3LjE4Yy0yLjE0LTIuMDg2LTIuMTQtNS40NjkgMC03LjU1NXptMTkxLjM5NyAzNS41MjkgMTUuNjc5IDE1LjI5YzIuMTQgMi4wODYgMi4xNCA1LjQ2OSAwIDcuNTU1bC03MC43IDY4Ljk0NGMtMi4xMzkgMi4wODctNS42MDggMi4wODctNy43NDggMGwtNTAuMTc4LTQ4LjkzMWMtLjUzNS0uNTIyLTEuNDAyLS41MjItMS45MzcgMGwtNTAuMTc4IDQ4LjkzMWMtMi4xMzkgMi4wODctNS42MDggMi4wODctNy43NDggMGwtNzAuNzAxNS02OC45NDVjLTIuMTM5Ni0yLjA4Ni0yLjEzOTYtNS40NjkgMC03LjU1NWwxNS42Nzk1LTE1LjI5YzIuMTM5Ni0yLjA4NiA1LjYwODUtMi4wODYgNy43NDgxIDBsNTAuMTc4OSA0OC45MzJjLjUzNS41MjIgMS40MDIuNTIyIDEuOTM3IDBsNTAuMTc3LTQ4LjkzMmMyLjEzOS0yLjA4NyA1LjYwOC0yLjA4NyA3Ljc0OCAwbDUwLjE3OSA0OC45MzJjLjUzNS41MjIgMS40MDIuNTIyIDEuOTM3IDBsNTAuMTc5LTQ4LjkzMWMyLjEzOS0yLjA4NyA1LjYwOC0yLjA4NyA3Ljc0OCAweiIKICAgICAgICAgICAgICBmaWxsPSIjZmZmIi8+CiAgICA8L2c+Cjwvc3ZnPgo='; +export const walletconnectWallet = + 'data:image/svg+xml;base64,PHN2ZyBmaWxsPSJub25lIiBoZWlnaHQ9IjQwMCIgdmlld0JveD0iMCAwIDQwMCA0MDAiIHdpZHRoPSI0MDAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgICB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayI+CiAgICA8Y2xpcFBhdGggaWQ9ImEiPgogICAgICAgIDxwYXRoIGQ9Im0wIDBoNDAwdjQwMGgtNDAweiIvPgogICAgPC9jbGlwUGF0aD4KICAgIDxnIGNsaXAtcGF0aD0idXJsKCNhKSI+CiAgICAgICAgPGNpcmNsZSBjeD0iMjAwIiBjeT0iMjAwIiBmaWxsPSIjMzM5NmZmIiByPSIxOTkuNSIgc3Ryb2tlPSIjNjZiMWZmIi8+CiAgICAgICAgPHBhdGggZD0ibTEyMi41MTkgMTQ4Ljk2NWM0Mi43OTEtNDEuNzI5IDExMi4xNzEtNDEuNzI5IDE1NC45NjIgMGw1LjE1IDUuMDIyYzIuMTQgMi4wODYgMi4xNCA1LjQ2OSAwIDcuNTU1bC0xNy42MTcgMTcuMThjLTEuMDcgMS4wNDMtMi44MDQgMS4wNDMtMy44NzQgMGwtNy4wODctNi45MTFjLTI5Ljg1My0yOS4xMTEtNzguMjUzLTI5LjExMS0xMDguMTA2IDBsLTcuNTkgNy40MDFjLTEuMDcgMS4wNDMtMi44MDQgMS4wNDMtMy44NzQgMGwtMTcuNjE3LTE3LjE4Yy0yLjE0LTIuMDg2LTIuMTQtNS40NjkgMC03LjU1NXptMTkxLjM5NyAzNS41MjkgMTUuNjc5IDE1LjI5YzIuMTQgMi4wODYgMi4xNCA1LjQ2OSAwIDcuNTU1bC03MC43IDY4Ljk0NGMtMi4xMzkgMi4wODctNS42MDggMi4wODctNy43NDggMGwtNTAuMTc4LTQ4LjkzMWMtLjUzNS0uNTIyLTEuNDAyLS41MjItMS45MzcgMGwtNTAuMTc4IDQ4LjkzMWMtMi4xMzkgMi4wODctNS42MDggMi4wODctNy43NDggMGwtNzAuNzAxNS02OC45NDVjLTIuMTM5Ni0yLjA4Ni0yLjEzOTYtNS40NjkgMC03LjU1NWwxNS42Nzk1LTE1LjI5YzIuMTM5Ni0yLjA4NiA1LjYwODUtMi4wODYgNy43NDgxIDBsNTAuMTc4OSA0OC45MzJjLjUzNS41MjIgMS40MDIuNTIyIDEuOTM3IDBsNTAuMTc3LTQ4LjkzMmMyLjEzOS0yLjA4NyA1LjYwOC0yLjA4NyA3Ljc0OCAwbDUwLjE3OSA0OC45MzJjLjUzNS41MjIgMS40MDIuNTIyIDEuOTM3IDBsNTAuMTc5LTQ4LjkzMWMyLjEzOS0yLjA4NyA1LjYwOC0yLjA4NyA3Ljc0OCAweiIKICAgICAgICAgICAgICBmaWxsPSIjZmZmIi8+CiAgICA8L2c+Cjwvc3ZnPgo='; diff --git a/packages/core/src/config/logos/generated/westendChain.ts b/packages/core/src/config/logos/generated/westendChain.ts index 6e618da..1389f18 100644 --- a/packages/core/src/config/logos/generated/westendChain.ts +++ b/packages/core/src/config/logos/generated/westendChain.ts @@ -3,4 +3,5 @@ // Do not edit. Auto-generated via node scripts/convertLogos.mjs -export const westendChain = 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTY3MiIgaGVpZ2h0PSIxNjcyIiB2aWV3Qm94PSIwIDAgMTY3MiAxNjcyIiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8Y2lyY2xlIGN4PSI4MzYuMjc0IiBjeT0iODM2LjIxOSIgcj0iODM1LjQzNiIgZmlsbD0iI0U2MDA3QSIvPgo8bWFzayBpZD0ibWFzazAiIG1hc2stdHlwZT0iYWxwaGEiIG1hc2tVbml0cz0idXNlclNwYWNlT25Vc2UiIHg9IjAiIHk9IjAiIHdpZHRoPSIxNjcyIiBoZWlnaHQ9IjE2NzIiPgo8Y2lyY2xlIGN4PSI4MzYuMjc0IiBjeT0iODM2LjIxOSIgcj0iODM1LjQzNiIgZmlsbD0iI0M0QzRDNCIvPgo8L21hc2s+CjxnIG1hc2s9InVybCgjbWFzazApIj4KPHJlY3QgeD0iLTI5OS45MTkiIHk9Ii02Ni4wNTE4IiB3aWR0aD0iMjg0MC40OCIgaGVpZ2h0PSIxODcxLjM4IiBmaWxsPSJ1cmwoI3BhaW50MF9saW5lYXIpIi8+CjxwYXRoIGQ9Ik0tMzAuNjA2MiAtMjcwNC43OEM0LjYxMjU1IC0yMjgzLjY2IDE3Ny4xNDEgLTE4NzkuMSA0NTUuNzcyIC0xNTYyLjI2Qzc0MS41MzUgLTEyMzcuMzUgMTEzNy40MSAtMTAxOC41MSAxNTYxLjgyIC05NDAuNjQ1QzE3NzAuOTEgLTkwMi4xNTggMTk4OS4zNiAtODk0Ljk5OCAyMTk5LjMzIC05MzEuMjQ3QzIzOTkuMDUgLTk2NS43MDYgMjYwMC41NiAtMTA1Mi45NyAyNzEzLjM1IC0xMjMwLjY0QzI3NjMuNzMgLTEzMDkuNCAyNzk0LjQ5IC0xNDAyLjk0IDI3OTMuMTUgLTE0OTYuOTJDMjc5MS44MSAtMTU5Ny4xNiAyNzQ5LjQ2IC0xNjg3LjU2IDI2ODcuNDkgLTE3NjQuNTRDMjYxOC44NCAtMTg1MC4wMSAyNTMxLjAxIC0xOTIyLjUxIDI0NDQuMDggLTE5ODkuMTlDMjM1OC4wNCAtMjA1NC45OCAyMjY1LjMxIC0yMTEzLjE2IDIxNjQuMTEgLTIxNTIuOTlDMTkzOS40MiAtMjI0MC43IDE3MTYuMDcgLTIxOTEuOTIgMTUwMC43NSAtMjEwMS4wN0MxMjcyLjQ5IC0yMDA0Ljg2IDEwNTEuODIgLTE4OTEuMTkgODMwLjY5NyAtMTc4MC42NUMzNzguMjAxIC0xNTU0LjY1IC04NC4xMDMzIC0xMzMxLjMzIC01ODYuNTMgLTEyNDQuNTFDLTcxMi42OTQgLTEyMjIuNTkgLTg0MS4wODcgLTEyMTAuMDUgLTk2OS4wMzUgLTEyMDguNzFDLTEwODMuNjEgLTEyMDcuMzcgLTEyMDcuOTkgLTEyMDguMjYgLTEzMTguOTkgLTEyMzkuNTlDLTEzNjguMDMgLTEyNTMuNDYgLTE0MTguNDEgLTEyNzYuNzQgLTE0NDYuOTQgLTEzMjEuMDRDLTE0ODMuOTQgLTEzNzguMzIgLTE0NzEuMDIgLTE0NDkuOTMgLTE0NTQuOTcgLTE1MTEuNjlDLTE0MjcuNzcgLTE2MTQuNjIgLTEzNzYuNSAtMTcxMC4zOSAtMTMxMC4wOCAtMTc5My4xOEMtMTE3Mi43NyAtMTk2NC41OCAtOTc3Ljk1MSAtMjA3OC4yNSAtNzY4Ljg2NiAtMjEzNy43N0MtNjQ5LjM4OSAtMjE3MS43OCAtNTI1LjQ1NCAtMjE4OS4yNCAtNDAxLjUxOSAtMjE5NS45NUMtMjgyLjA0MiAtMjIwMi4yMSAtMTU0Ljk4NyAtMjIwNi42OSAtMzYuNDAxOSAtMjE4N0M3OS41MDg1IC0yMTY4LjIgMTU5Ljc1NCAtMjA5NS43IDE5OS40MzEgLTE5ODUuNjFDMjM5LjU1NCAtMTg3NS4wNyAyMzIuNDIxIC0xNzU3LjgyIDIyOC40MDkgLTE2NDIuMzZDMjIyLjYxNCAtMTQ2OS4xNyAyMzYuODc5IC0xMjIxLjY5IDQzMS4yNTIgLTExNTAuOThDNTMyLjAwNSAtMTExNC4yOCA2NTIuMzc0IC0xMTUyLjc3IDc1MC44OTcgLTExODEuNDFDODUzLjQzNCAtMTIxMS40IDk1My4yOTUgLTEyNTAuNzggMTA0OC43IC0xMjk4LjY2QzExNDcuMjIgLTEzNDguMzQgMTI0MC44NCAtMTQwNi45NiAxMzI4LjIyIC0xNDc0LjU0QzE0MDMuMTIgLTE1MzEuODIgMTQ5MC4wNSAtMTU5Ni4yNyAxNTQwLjQzIC0xNjc3LjcyQzE1NzYuMDkgLTE3MzUuNDUgMTU5Ni42IC0xODE0LjY2IDE1MzMuMjkgLTE4NjAuMzFDMTUyOS43MyAtMTg2Mi45OSAxNTIzLjQ4IC0xODYyLjU0IDE1MTkuOTIgLTE4NjAuMzFDMTMzNi42OSAtMTc0Ny45OCAxMjM1LjA1IC0xNTQ2LjE0IDExOTYuNzEgLTEzMzkuMzlDMTE2MS4wNCAtMTE0Ni41MSAxMTYxLjkzIC05MDguODcxIDEyOTAuNzcgLTc0OC4yMUMxMzk0LjIgLTYxOS4zMjMgMTU5Ny4wNCAtNTg0Ljg2NCAxNzI0Ljk5IC03MDEuMjJDMTc4Ni4wNyAtNzU2LjcxMyAxODA1LjI0IC04NDIuMTkgMTc3Ny4xNSAtOTE5LjYxMUMxNzQzLjcxIC0xMDExLjM1IDE2NTguMTIgLTEwNzYuMjQgMTU2NC45NCAtMTA5OC42MkMxNDQyLjM1IC0xMTI4LjE2IDEzMTMuMDYgLTEwOTUuMDQgMTE5Ny4xNSAtMTA1NC43NkMxMDg5LjcxIC0xMDE3LjE3IDk4Ni43MyAtOTY3Ljk0NCA4ODguMjA3IC05MTEuMTA5QzY4Mi42ODkgLTc5Mi41MTUgNDk2LjM0IC02NDQuMzg1IDMwNi40MjYgLTUwMi41MTlDMTEyLjQ5OSAtMzU3Ljk2OSAtODYuNzc4MyAtMjE3Ljg5NCAtMzEwLjU3NCAtMTIzLjQ2N0MtNTYxLjU2NSAtMTYuOTU2MSAtODM0Ljg0NiAzNi43NDY4IC0xMTA3LjY4IDMzLjE2NjdDLTEyMzAuNzIgMzEuMzc2NSAtMTM3MS4xNSAyOS4xMzg5IC0xNDgzLjk0IC0yNS45MDY1Qy0xNjA1LjIgLTg1LjQyNzIgLTE2NDIuNjUgLTIxMS42MjkgLTE2MTEuODkgLTMzNi45MzZDLTE1ODIuNDcgLTQ1Ni44NzIgLTE1MDkuMzYgLTU1OC40NiAtMTQyNy4zMyAtNjQ3LjUxN0MtMTM0NS43NCAtNzM2LjEyNyAtMTI1Mi41NyAtODEzLjk5NiAtMTE1Mi43MSAtODgxLjEyNEMtOTUzLjQzMSAtMTAxNC40OSAtNzI5LjYzNSAtMTEwNi4yMyAtNTAwLjQ4OSAtMTE3My44MUMtNDQyLjk4IC0xMTkwLjgxIC0zODUuMDI1IC0xMjA2LjAzIC0zMjcuMDY5IC0xMjE5LjlDLTI2NC42NTYgLTEyMzUuMTIgLTE5NS41NTYgLTEyNTcuNDkgLTEzMC45MTMgLTEyNTMuNDZDMTQuODY2MiAtMTI0NC4wNyAzNy4xNTcgLTEwNjguNjQgNjIuMTIyMyAtOTU1LjQxM0MxNzMuNTc0IC00NTUuNTI5IDIxNi44MTggNjcuMTc4NSA0MjguNTc3IDUzOC44NjhDNDU0Ljg4IDU5Ny45NDIgNDgzLjg1OCA2NTUuNjcyIDUxNS45NTYgNzExLjYxM0M1MzcuODAxIDc1MC4xIDU2NC41NDkgNzkxLjcxOSA2MTEuODA1IDc5OS4zMjdDNzE1LjIzMyA4MTQuOTkxIDc3OC4wOTIgNjgzLjQxOSA4MDguODUzIDYwNi40NDVDODQ5LjQyMSA1MDQuNDA5IDg4My43NDkgMzY4LjM2MiA4NTMuNDM0IDI1OS4xNjZDODI2LjY4NSAxNjMuODQ0IDczNy41MjMgMTI4LjQ4OSA2NDYuMTMyIDEzNi45OTJDNTMyLjAwNSAxNDcuNzMzIDQyNC4xMTkgMjA0LjEyMSAzMjAuNjkyIDI0OS4zMjFDMTkxLjQwNyAzMDUuNzA4IDYzLjQ1OTUgMzY2LjEyNCAtNjMuMTUwNCA0MjguMzNDLTMxNC41ODcgNTUxLjg0NyAtNTYyLjQ1NyA2ODIuNTI0IC04MTQuMzM5IDgwNi4wNEMtMTMxNi43NyAxMDU0LjQyIC0xODQ2LjM5IDEyNzYuODQgLTI0MDkgMTMzNi4zNkMtMjU0NC4wOCAxMzUwLjY4IC0yNjc5LjYgMTM1NS4xNSAtMjgxNS4xMyAxMzQ4LjQ0Qy0yODEwLjY3IDEzNTIuOTEgLTI4MDYuMjEgMTM1Ny4zOSAtMjgwMS43NiAxMzYxLjg2Qy0yNzk4LjE5IDExODcuMzMgLTI2NjUuMzQgMTA0NS4wMiAtMjUwNy41MiA5ODcuMjg3Qy0yMzMyLjMyIDkyMy4yOTIgLTIxMzkuNzMgOTcxLjYyNCAtMTk4My4yNSAxMDYyLjQ3Qy0xODE0LjI5IDExNjAuOTMgLTE2ODQuMTEgMTMwOS4wNiAtMTU2My43NCAxNDYxLjIxQy0xNDQ2LjUgMTYwOS43OSAtMTMzMi44MSAxNzYwLjYxIC0xMjAyLjE5IDE4OTguNDVDLTcyMC4yNzMgMjQwNS40OSAtODguMTE1NyAyNzY3LjU0IDU5My4wODEgMjkyMi4zOEM3NTAuMDA2IDI5NTguMTggOTI4LjMyOSAyOTkxLjc1IDEwNjUuNjQgMjg4NC4zNEMxMTY1LjUgMjgwNi4wMiAxMjEwLjUzIDI2NzkuMzggMTIyNy4wMiAyNTU3LjJDMTI0Ni4xOSAyNDEwLjg2IDEyMzAuMTQgMjI1NS41NyAxMTg1LjEyIDIxMTUuMDVDMTEzNS4xOCAxOTU5LjMxIDEwMjcuNzQgMTg0OS42NyA4NjAuMTIxIDE4MzcuMTRDNjc5LjEyMiAxODIzLjcxIDQ5Mi43NzQgMTg5NS4zMSAzMjAuNjkyIDE5NDAuOTZDMTA2LjI1NyAxOTk3LjggLTEwNy43MzEgMjA1NC42MyAtMzIyLjE2NSAyMTExLjQ3Qy01MzMuOTI1IDIxNjcuNDEgLTc0NS4yMzkgMjIyMy44IC05NTYuOTk4IDIyNzkuNzRDLTEwNjEuMzIgMjMwNy40OCAtMTE2Ni4wOCAyMzM1LjIzIC0xMjcwLjQgMjM2Mi45OEMtMTM3NC4yOCAyMzkwLjcyIC0xNDc4LjU5IDI0MjUuMTggLTE1ODQuMjUgMjQ0NC40M0MtMTY4NS45IDI0NjIuNzcgLTE3NjcuOTIgMjQxNS4zNCAtMTc3MS45NCAyMzA3LjkzQy0xNzc1LjA2IDIyMzAuNTEgLTE3NDcuNDIgMjE1My45OCAtMTcxMy45OCAyMDg1LjUxQy0xNjMzLjI5IDE5MjAuMzcgLTE1NDIuMzUgMTc2MC42MSAtMTQ0Mi4wNCAxNjA2LjY2Qy0xMjM2LjA3IDEyODkuODEgLTk5MC44NzkgOTk4LjQ3NiAtNzEzLjU4NiA3NDIuMDQ0Qy02NDYuMjY5IDY3OS44MzkgLTU3Ny4xNjggNjE5LjQyMyAtNTA2LjI4NCA1NjEuMjQ1Qy01MTIuNTI2IDU2MS4yNDUgLTUxOC43NjcgNTYxLjI0NSAtNTI1LjAwOSA1NjEuMjQ1Qy0zMDguNzkxIDcyOS41MTQgLTI4Ni45NDYgMTAzMC4yNSAtMjQzLjI1NyAxMjgwLjQyQy0yMTUuMTcxIDE0NDEuNTIgLTE3OS45NTIgMTYwMS43NCAtMTM4LjkzOCAxNzYwLjE2Qy0xMTcuOTg1IDE4NDAuNzIgLTk1LjI0ODUgMTkyMC44MiAtNzAuNzI5MiAyMDAwLjQ4Qy01MC42Njc3IDIwNjYuMjcgLTMzLjI4MSAyMTM2LjUzIC0yLjA3NDQ2IDIxOTcuODRDMTguODc4NyAyMjM4LjU2IDUwLjk3NzEgMjI3OS43NCA5OS4xMjQzIDIyODYuNDVDMTQ1LjkzNCAyMjkzLjE2IDE4NC43MTkgMjI2NC41MiAyMTIuMzYgMjIyOS4xN0MyNTIuOTI4IDIxNzYuMzYgMjc4LjM0IDIxMTAuNTcgMzA2LjQyNiAyMDUwLjZDMzM5Ljg2MSAxOTc5LjQ1IDM3MS45NTkgMTkwNy40IDQwMi4yNzUgMTgzNC45QzUyMS4zMDYgMTU1MC43MiA2MTYuNzA5IDEyNTYuMjUgNjg3LjE0NiA5NTYuNDA4Qzc2Ni41IDYxNi43MzggODEzLjc1NiAyNjkuNDU5IDgyOC40NjggLTc5LjYwOTRDODI4LjkxNCAtOTMuMDM1MiA4MTAuMTkgLTk3LjUxMDMgODAzLjUwMyAtODYuMzIyM0M2NDYuMTMyIDE4NC40MyA1NzMuMDIgNTAxLjI3NyA1OTkuMzIyIDgxMy42NDhDNjIxLjE2NyAxMDc1LjQ1IDcyNS4wNCAxMzUzLjgxIDk5NC43NTUgMTQ0Mi40MkMxMTI5LjM5IDE0ODYuNzIgMTI3Ni41MSAxNDgwLjkxIDE0MTQuNzEgMTQ1Ny42M0MxNTU4LjcgMTQzMy40NyAxNzAwLjAyIDEzOTAuOTUgMTgzMi44OCAxMzMwLjU0QzIwOTUuNDYgMTIxMS4wNSAyMzIyLjM4IDEwMTIuMzUgMjQ0Mi4zIDc0NS42MjVDMjQ5OC45MiA2MTkuODcgMjUzMS40NiA0ODIuNDggMjUyOS42OCAzNDQuMTk2QzI1MjguMzQgMjI0LjcwNyAyNTA2Ljk0IDgwLjYwNDIgMjQxMi40MyAtMy4wODI3NkMyMzA0LjEgLTk5LjMwMDMgMjE2MC41NSAtNDIuNDY0OCAyMDU5LjM1IDM0LjUwOTNDMTk1Mi4zNSAxMTUuOTU4IDE4NjIuNzUgMjE5Ljc4NCAxNzkyLjc1IDMzNC4zNUMxNDU3Ljk1IDg4MS4yMjQgMTU4MS40NCAxNTg2LjA3IDE3NjQuMjIgMjE2My44M0MxOTQ2LjU2IDI3MzkuMzQgMjI0Ny40OCAzMjc2LjgyIDI2NDMuOCAzNzMxLjVDMjY5Mi40IDM3ODcuNDQgMjc0Mi43NyAzODQyLjA0IDI3OTQuNDkgMzg5NS4zQzI4MDYuOTcgMzkwNy44MyAyODIzLjkxIDM4ODkuNDggMjgxMy4yMSAzODc2LjVDMjI3OS4xMyAzMTk2LjcxIDE3MDkuODMgMjU0NC42NyAxMTA3LjEgMTkyNC44NUM1MDguMzc3IDEzMDkuNSAtMTIyLjg4OSA3MjQuNTkxIC03ODIuNjg2IDE3NS4wMzJDLTEwOTkuNjYgLTg5LjAwNzMgLTE0MzAuODkgLTMzNi4wNDEgLTE3NDMuNDEgLTYwNS4wMDJDLTE4OTEuNDEgLTczMi41NDcgLTIwMzQuMDcgLTg2Ni44MDQgLTIxNjMuMzYgLTEwMTMuNTlDLTIyMzAuMjMgLTEwODkuNjcgLTIyOTMuNTMgLTExNjkuMzMgLTIzNTEuNDkgLTEyNTIuNTdDLTIzNzcuMzUgLTEyOTAuMTYgLTI0MDIuNzYgLTEzMjguMiAtMjQyNi4zOCAtMTM2Ny4xNEMtMjQzOC40MiAtMTM4Ni44MyAtMjQ1MC4wMSAtMTQwNi41MiAtMjQ2MS4xNiAtMTQyNi4yMUMtMjQ3OC4xIC0xNDU1Ljc0IC0yNDc3LjY1IC0xNDY5LjE3IC0yNDYyLjk0IC0xNDk5LjE1Qy0yMzgxLjggLTE2NjIuMDUgLTIxNTUuNzggLTE2OTIuNDkgLTE5OTUuNzMgLTE3MDguNkMtMTc4My41MyAtMTcyOS42MyAtMTU2OS41NCAtMTcxOC40NCAtMTM1OS41NiAtMTY4MS4zQy05MzYuMDQ1IC0xNjA2LjU2IC01MzUuMjYyIC0xNDM0LjcxIC0xNTcuNjYyIC0xMjMyLjg4QzU3OC44MTUgLTgzOS45NTIgMTI0Ni42NCAtMzEwLjk3OSAyMDQyLjQxIC0zNi4xOTk1QzIyMzEuNDMgMjkuMTM4OSAyNDI1LjggNzguODE0IDI2MjQuMTkgMTA1LjIxOEMyNzIzLjE2IDExOC42NDQgMjgyMi41NyAxMjYuMjUxIDI5MjIuNDMgMTI3LjU5NEMyOTYzLjg5IDEyOC4wNDIgMjk4NC40IDEzNi45OTIgMzAwNC45MSA5OS40MDAxQzMwMjQuOTcgNjIuNzAzMSAzMDM2LjEyIDIxLjUzMSAzMDM5LjI0IC0yMC41MzYxQzMwNTIuNjEgLTE4Ny4wMTUgMjk1Mi4zIC0zNDQuOTkxIDI4MjguODEgLTQ0Ny45MjFDMjcwNi42NiAtNTQ5LjUwOSAyNTUzLjc1IC02MDcuMjQgMjM5OC4xNiAtNjMwLjUxMUMyMDE4LjMzIC02ODYuODk5IDE2NjMuMDIgLTUzMi41MDMgMTMzNC4wMiAtMzU3Ljk2OUMxMjQyLjE4IC0zMDkuMTg5IDExNTEuMjMgLTI1OS4wNjYgMTA1OS40IC0yMTAuNzM0Qzk3Mi45MSAtMTY1LjA4NiA4MzguMjc2IC02Ni42MzExIDc0MC4xOTggLTEyNy45NDJDNjY3LjA4NSAtMTczLjU4OSA2NTAuMTQ0IC0yNzcuNDE1IDY0MC4zMzcgLTM1Ni4xNzlDNjI2LjA3MSAtNDcyLjA4OCA2MTcuMTU1IC01ODguODkxIDYwOS41NzYgLTcwNS4yNDhDNTc5LjcwNyAtMTE2OC44OCA1OTMuNTI3IC0xNjM1LjIgNjUxLjAzNiAtMjA5Ni4xNUM2NjUuNzQ4IC0yMjE2LjA5IDY4NC4wMjYgLTIzMzYuMDIgNzA0Ljk3OSAtMjQ1NS4wN0M3MjEuOTIgLTI1NTEuMjggNzMzLjUxMSAtMjY1NS4xMSA3NzMuNjM0IC0yNzQ1LjUxQzgxNC4yMDIgLTI4MzUuOTEgODk0Ljg5NCAtMjg5NC41MyA5OTYuMDkzIC0yODU4LjI4QzEwOTMuMjggLTI4MjMuMzggMTE2Ni4zOSAtMjczNC4zMiAxMjM0LjYgLTI2NjAuNDhDMTcyMS40MiAtMjEzMS45NSAyMDUwLjg4IC0xNDUzLjk1IDI2MzQuNDQgLTEwMTguMDdDMjc4Ny4zNSAtOTAzLjk0OCAyOTYzLjg5IC03OTAuNzI1IDMxNTYuMDQgLTc2NS4yMTZDMzMxMi45NiAtNzQ0LjE4MiAzNDkzLjk2IC03OTcuODg1IDM1NzcuNzcgLTk0Mi40MzVDMzYyNS45MiAtMTAyNS42NyAzNjI3LjcgLTExMjMuNjggMzYxNy40NSAtMTIxNi43N0MzNjA2LjMxIC0xMzE4LjggMzU4NS44IC0xNDIwLjM5IDM1NjMuMDYgLTE1MjAuNjRDMzUxNy4xNCAtMTcyMi4wMiAzNDUzLjM5IC0xOTE4LjkzIDMzNzMuMTUgLTIxMDguNjhDMzI5Mi4wMSAtMjI5OS43NyAzMTkzLjkzIC0yNDgzLjI2IDMwODAuMjUgLTI2NTYuOUMzMDc3LjEzIC0yNjYxLjgyIDMwNzAuODkgLTI2NjQuOTUgMzA2NS4wOSAtMjY2My4xNkMyNjg5LjcyIC0yNTMwLjI1IDI1NTYuODcgLTIxMTkuNDIgMjM2OC43NCAtMTgwNy41QzIyNjMuMDggLTE2MzIuMDcgMjEyMS4zMSAtMTQ1NC44NSAxOTI5LjYyIC0xMzcwLjcyQzE3MjcuNjcgLTEyODEuNjYgMTUxMSAtMTM0My44NiAxMzYxLjY2IC0xNTAwLjVDMTE2OS45NiAtMTcwMS44OCAxMTI3LjYxIC0xOTg3Ljg1IDEwOTAuMTYgLTIyNTEuNDRDMTA4My40NyAtMjI0Ni41MiAxMDc3LjIzIC0yMjQxLjE1IDEwNzAuNTQgLTIyMzYuMjNDMTQwOC4wMiAtMjA4OC4xIDE1NDguNDUgLTE3MTYuNjUgMTY4Ny4xIC0xNDAxLjU5QzE3MjMuNjUgLTEzMTguMzYgMTc2MS4xIC0xMjM1LjU2IDE4MDMuMDEgLTExNTUuMDFDMTg1NS42MSAtMTA1My44NyAxOTE1LjggLTk1Ny4yMDMgMTk2OS4yOSAtODU2LjA2M0MyMDY4LjI2IC02NjguNTUxIDIxNDUuODMgLTQ1MC4xNTkgMjA4MS42NCAtMjM3LjU4NUMyMDIwLjU2IC0zNS43NTIgMTgzNi40NCA0My4wMTIyIDE2NjIuMTMgMTI2LjY5OUMxNTgzLjIyIDE2NC43MzkgMTUwNC4zMSAyMDYuMzU4IDE0NDAuMTIgMjY2Ljc3NEMxMzY5LjY4IDMzMy4wMDggMTMyMi40MiA0MTguOTMyIDEyODQuMDggNTA2LjY0N0MxMjA1LjE4IDY4Ny44OTQgMTE1MS42OCA5MDEuODEgOTc0LjI0OCAxMDE0LjE0Qzg3My45NDEgMTA3Ny42OSA3NjguMjg0IDEwNjkuNjMgNjYzLjA3MyAxMDIxLjc1QzU3My45MTEgOTgxLjQ3IDQ5MS40MzYgOTM0LjkyNyAzOTUuMTQyIDkxMi41NTFDNDIuOTUyMSA4MzEuNTQ5IC0zNzQuMzI1IDk5Ny41OCAtNTI0LjU2MyAxMzQwLjM4Qy02MTEuNDk2IDE1MzkuMDggLTU2Mi45MDMgMTc1OS4yNyAtNDcxLjA2NiAxOTQ3LjIzQy0zODcuMjU0IDIxMTguNjMgLTI2NC42NTYgMjI2OS44OSAtMTIwLjIxNCAyMzkzLjg1QzIwMC4zMjMgMjY2OC42MyA2MTQuNDggMjc5Ny41MiAxMDMxLjc2IDI4MTEuODRDMTI1NC4yMiAyODE5LjQ1IDE0ODEuNTggMjc5OC40MiAxNjk4LjY5IDI3NDkuMTlDMTg3MS42NiAyNzA5LjgxIDIwNDUuMDggMjY0Ni4yNiAyMTg2LjQgMjUzNS43MkMyMzI2LjM5IDI0MjYuNTIgMjQxOC4yMiAyMjcwLjc5IDI0MjguOTIgMjA5MS4zM0MyNDQyLjMgMTg3Mi45NCAyMzQ5LjEyIDE2NjEuNzEgMjI0OC4zNyAxNDczLjc1QzIxNDEuODIgMTI3NS4wNSAyMDE2LjU1IDEwNzUuNDUgMTk4NC40NSA4NDguMTA3QzE5NTUuMDMgNjQxLjM1MSAyMDIxLjAxIDQ0My4wOTkgMjExOC42NCAyNjMuMTk0QzIyMTMuNiA4Ny43NjQ2IDIzMzMuNTIgLTcyLjAwMTUgMjQzNC4yNyAtMjQzLjg1MUMyNTQ1LjI4IC00MzMuMTUzIDI2MTIuNiAtNjM2LjMyOSAyNjY4Ljc3IC04NDguMDA4QzI3NjkuMDggLTEyMjcuOTYgMjg4NS40MyAtMTcxMS43MyAzMjkxLjEyIC0xODc2LjQyQzM1MTkuODIgLTE5NjkuNSAzNzcwLjgxIC0xOTA3LjMgMzk5NC42MSAtMTgzMS4yMkM0MTkyLjEgLTE3NjQuMDkgNDM5MC45MyAtMTY5MS41OSA0NTc3LjcyIC0xNTk3LjYxQzQ3NTQuMjYgLTE1MDkgNDkyMS44OSAtMTM5NS43OCA1MDQ2LjI3IC0xMjQwLjA0QzUwNjIuNzYgLTEyMTkuNDUgNTA4OC4xOCAtMTE5OC44NyA1MDc3LjQ4IC0xMTczLjM2QzUwNjkuOSAtMTE1NS40NiA1MDU1LjYzIC0xMTM4LjQ1IDUwNDQuNDkgLTExMjIuNzlDNTAxNS4wNiAtMTA4MS42MSA0OTgxLjYzIC0xMDQzLjU4IDQ5NDQuNjIgLTEwMDguNjdDNDg3NS41MiAtOTQyLjg4MyA0Nzk1LjcyIC04ODkuNjI3IDQ3MTEuNDcgLTg0Ni42NjVDNDUzNi43MSAtNzU3LjE2IDQzNDEuODkgLTcwOS43MjMgNDE0Ny45NiAtNjg3LjM0N0MzOTI1LjA2IC02NjEuMzkgMzY5OS40OCAtNjYyLjczMyAzNDc2LjEzIC02ODYuODk5QzMwMTguNzMgLTczNi41NzQgMjU3NC43IC04ODIuOTE1IDIxNjAuNTUgLTEwODAuNzJDMTk1NS4wMyAtMTE3OC43MyAxNzU2LjIgLTEyOTAuNjEgMTU2My42MSAtMTQxMS44OUMxMzc3LjI2IC0xNTI5LjU5IDExOTYuMjYgLTE2NTUuMzQgMTAwNi4zNSAtMTc2Ny4yMkM4MjIuMjI3IC0xODc1LjUyIDYyOC4zIC0xOTcxLjI5IDQyMC45OTkgLTIwMjcuMjNDMjQ3LjU3OSAtMjA3NC4yMiAtMC43MzcwNjEgLTIxMDguMjMgLTk3LjQ3NzggLTE5MTIuMjJDLTEyOS4xMyAtMTg0OC4yMiAtMTI2LjQ1NSAtMTc3Mi4xNCAtODQuNTQ5MSAtMTcxMy41MkMtNDkuNzc2MSAtMTY2NC43NCA1LjUwNDE1IC0xNjM3LjQ0IDYwLjc4NDcgLTE2MTcuNzVDMTk2LjMxMSAtMTU2OS40MiAzODEuMzIyIC0xNTYwLjQ3IDQ1Ny4xMDkgLTE0MTcuNzFDNTM5LjU4NCAtMTI2Mi40MSA0NzAuNDgzIC0xMDcwLjQzIDU0NC45MzQgLTkxMi4wMDRDNTU5LjE5OSAtODgxLjU3MiA1NzMuMDIgLTg1Mi4wMzUgNjA3LjM0NyAtODQ1Ljc3QzY0My45MDMgLTgzOS4wNTcgNjgxLjc5NyAtODQzLjA4NSA3MTcuOTA3IC04NTAuNjkzQzc5Ni4zNyAtODY2LjgwNCA4ODIuNDExIC05MTMuNzk0IDk2My45OTQgLTg5OS40NzNDMTA3NC4xMSAtODgwLjIyOSAxMDY1LjY0IC03NTMuNTggMTA5My43MiAtNjcxLjY4M0MxMTE2LjAyIC02MDcuMjQgMTE3OS4zMiAtNTM2Ljk3OSAxMjUyLjg4IC01NjUuNjJDMTI2NC4wMiAtNTcwLjA5NSAxMjY2LjcgLTU4OC40NDQgMTI1Mi44OCAtNTkxLjU3NkM5MTcuNjMgLTY2Ny42NTYgNTY4LjExNSAtNjQ5LjMwNyAyMjYuNjI2IC02NDcuMDdDLTEzNC4wMzQgLTY0NC4zODQgLTQ5NC4yNDggLTY0MC44MDQgLTg1NC45MDcgLTYzNS44ODFDLTEyMTUuNTcgLTYzMC45NTkgLTE1NzUuNzggLTYyNS4xNDEgLTE5MzYuNDQgLTYxOC40MjhDLTIwNjYuNjIgLTYxNS43NDMgLTIyMDMuNDggLTYyMy4zNTEgLTIzMjguNzUgLTU4MC44MzZDLTIzNzYuMDEgLTU2NS4xNzMgLTI0MjIuMzcgLTU0MS45MDEgLTI0NTcuMTUgLTUwNS4yMDRDLTI0NzguNTQgLTQ4Mi44MjggLTI1MTkuNTYgLTQyNy4zMzUgLTI1MDguNDEgLTM5NC4yMTlDLTI1MDAuODQgLTM3MS44NDIgLTI0NjIuNSAtMzQ0Ljk5MSAtMjQ0NS41NSAtMzI4LjQzM0MtMjQxOC44MSAtMzAyLjQ3NiAtMjM5MS4xNyAtMjc3Ljg2MiAtMjM2Mi42MyAtMjUzLjY5NkMtMjMxMS44MSAtMjExLjE4MSAtMjI1Ny44NyAtMTcxLjM1MiAtMjIwMi4xNCAtMTM1LjEwMkMtMjA4NS4zNCAtNTguNTc1NyAtMTk2MC4wNyAzLjYzMDEzIC0xODMwLjc4IDU1LjU0MjdDLTE1NTUuNzIgMTY2LjA4MSAtMTI2NC4xNiAyMjguMjg3IC05NzIuNjAxIDI3My45MzRDLTI4Mi4wNDMgMzgyLjIzNSA0MjAuMTA3IDM5Mi41MjggMTExNi45MSAzNTQuOTM2QzE0NjkuOTkgMzM1LjY5MyAxODIyLjYyIDMwNC4zNjYgMjE3NC4zNyAyNjcuMjIxQzIzMTAuNzggMjUyLjkwMSAyNDQ3LjIgMjMzLjIxIDI1ODQuNTEgMjM4LjU4QzI3MDAuODcgMjQzLjA1NSAyODI1LjY5IDI2Mi43NDYgMjkyMi40MyAzMzEuNjY1QzI5NzAuMTQgMzY1LjY3NyAzMDA1LjggNDEwLjg3NyAzMDI5Ljg3IDQ2My42ODVDMzAzMC43NyA0NTguMzE0IDMwMzEuMjEgNDUyLjk0NCAzMDMyLjEgNDQ3LjU3M0MyODkxLjIzIDU2MC43OTcgMjcyMi4yNyA2MjYuNTgzIDI1NDguODUgNjcwLjg4OEMyMzY1LjE3IDcxNy44NzggMjE3Ni4xNSA3NDcuNDE1IDE5ODguMDIgNzcxLjU4MUMxNTk2LjE1IDgyMS43MDQgMTE5OS4zOCA4MzMuNzg3IDgwNS4yODYgODA4LjcyNUM2MDguNjg0IDc5Ni4xOTUgNDE0Ljc1NyA3NjkuMzQzIDIxOS40OTMgNzQzLjM4N0MxNTMuOTU5IDczNC44ODQgODEuNzM3OCA3MzUuMzMxIDMzLjE0NDUgNzg3LjY5MkMtMi45NjU4MiA4MjYuMTc5IC05LjIwNzI4IDg4MC4zMjkgLTQuNzQ5MjcgOTMwLjg5OUMxLjQ5MjE5IDk5OS4zNyAyMi44OTA5IDEwNjUuMTYgMzguOTQwMiAxMTMxLjM5QzU5LjAwMTUgMTIxNS41MiA3NS40OTYzIDEzMTcuNTYgLTI3LjkzMTQgMTM0OC40NEMtMTA1Ljk0OCAxMzcyLjE2IC0xOTcuNzg1IDEzNTcuMzkgLTI3Ny41ODQgMTM1NC43Qy0zODAuMTIxIDEzNTEuNTcgLTQ4Mi4yMTEgMTM0OC40NCAtNTg0Ljc0NyAxMzQ1LjMxQy0xMDQxLjI2IDEzMzAuOTkgLTE0OTguMjEgMTMxNy4xMSAtMTk1NC43MiAxMzAyLjc5Qy0xOTY3LjY1IDEzMDIuMzQgLTE5NzMuNDQgMTMyMS41OSAtMTk2MS40MSAxMzI3Ljg1Qy0xNTIyLjI4IDE1NTguNzggLTEwODMuMTYgMTc4OS4yNSAtNjQ0LjA0IDIwMjAuMTdDLTQ0Mi41MzQgMjEyNi4yNCAtMjQyLjgxMiAyMjQyLjE0IC0yOS43MTQ2IDIzMjMuNTlDMTY0LjIxMiAyMzk3LjQ0IDM3OS4wOTMgMjQzNi44MiA1ODAuNTk4IDIzNjkuMjRDNzY1LjE2MyAyMzA3LjQ4IDkxNC41MDkgMjE3Mi43OCAxMDQ2LjAyIDIwMzMuMTVDMTE4My43OCAxODg3LjI2IDEzMDcuNzEgMTcyNy45NCAxNDE2LjQ5IDE1NTguNzhDMTYzNS4zOCAxMjE3Ljc2IDE3OTEuODYgODM1LjEyOSAxODcxLjY2IDQzNy4yODFDMTk2My41IC0xOS4xOTM2IDE5NTcuMjYgLTQ4Ni44NTYgMTk2Ny4wNiAtOTUwLjQ5MUMxOTcxLjk3IC0xMTg0LjEgMTk4MS4zMyAtMTQxOC42IDIwMDkuODYgLTE2NTAuODdDMjAyNC41NyAtMTc3Mi4xNCAyMDQ0LjY0IC0xODkyLjk4IDIwNzIuMjggLTIwMTIuMDJDMjA5NS4wMSAtMjExMC4wMiAyMTI0Ljg4IC0yMjA4LjkzIDIxNzkuMjcgLTIyOTQuNEMyMjM0LjEgLTIzNzkuODggMjMxNC4zNSAtMjQ0NS4yMiAyNDE1LjEgLTI0NjUuMzZDMjUwOC43MiAtMjQ4NC4xNSAyNjAzLjY4IC0yNDU3Ljc1IDI2NjIuNTMgLTIzNzkuODhDMjc0Ni4zNCAtMjI2OC40NSAyNzQ5LjkxIC0yMTAwLjYzIDI4NjIuNyAtMjAxMC4yM0MzMDAwLjkgLTE4OTkuMjQgMzE5NC4zOCAtMjAwOS4zMyAzMzExLjYzIC0yMDk4Ljg0QzM0NDcuNiAtMjIwMi42NiAzNTgwIC0yMzU5Ljc0IDM3NTUuMjEgLTIzOTMuNzVDMzc5Ny41NiAtMjQwMS44MSAzODQzLjkyIC0yNDAyLjI2IDM4ODQuMDQgLTIzODUuN0MzOTQyLjQ1IC0yMzYxLjUzIDM5NjEuNjIgLTIzMDcuODMgMzk2Mi41MSAtMjI0OC4zMUMzOTYzLjg0IC0yMTMwLjYxIDM5NDkuMTMgLTIwMTAuNjcgMzkzNy45OSAtMTg5My40MkMzOTI3LjI5IC0xNzgzLjc4IDM5MjUuOTUgLTE2NTguMDMgMzg2OS4zMyAtMTU2MC40N0MzODEyLjcyIC0xNDYyLjQ2IDM3MDEuMjYgLTE0MjQuNDIgMzYwMS44NSAtMTM4NS40OEMzNDkwLjQgLTEzNDEuNjMgMzM3OC41IC0xMjk3Ljc3IDMyNjcuMDQgLTEyNTMuOTFDMzE2My4xNyAtMTIxMy4xOSAzMDU3LjUxIC0xMTYzLjUxIDI5NDYuMDYgLTExNDYuOTVDMjgyNC4zNiAtMTEyOC42MSAyNzA4Ljg5IC0xMTY3LjU0IDI2MDAuNTYgLTEyMjAuMzVDMjUwNC43MSAtMTI2Ny4zNCAyNDEyLjQzIC0xMzIxLjk0IDIzMjMuMjcgLTEzODAuMTFDMTk2Mi42MSAtMTYxNS45NiAxNjUzLjY2IC0xOTIwLjcyIDEzMDQuMTUgLTIxNzEuNzhDOTY4LjQ1MiAtMjQxMi41NSA1NzMuNDY1IC0yNjE2LjE3IDE1MS43MyAtMjYxOS43NUMtMjUuMjU2NiAtMjYyMS4xIC0yMzEuMjIgLTI1OTkuMTcgLTMzOS41NTIgLTI0NDAuNzRDLTQzMS4zODkgLTIzMDYuNDkgLTQzNi43MzkgLTIxMjkuNzIgLTQ0OS42NjcgLTE5NzMuMDhDLTQ2Ny45NDUgLTE3NTQuMjQgLTUzMS42OTYgLTE1NDcuOTMgLTU3Mi43MSAtMTMzMy4xMkMtNjA3LjQ4MyAtMTE0OC43NCAtNjEwLjE1OCAtOTY0LjgxMSAtNTQ2Ljg1MyAtNzg2LjI1Qy00MzYuMjkzIC00NzMuODc4IC0xNjcuMDI0IC0yMTguMzQyIDE1Mi42MjEgLTEzMS45N0MzMjkuMTYyIC04NC4wODQ3IDUwNi4xNDggLTEwNS4xMTggNjg0LjQ3MiAtMTMwLjYyN0M4NzQuMzg2IC0xNTcuOTI2IDEwOTEuOTQgLTE5Ni40MTMgMTI2OC45MyAtOTcuOTU3OEMxNDUyLjYgNC41MjUxNSAxNTIxLjcgMjIzLjM2NCAxNTA5LjIyIDQyMy40MDdDMTUwMS42NCA1NDIuNDQ5IDE0NjkuMSA2NTguMzU3IDE0MjkuODYgNzcwLjIzOEMxNDAwIDg1Ni4xNjMgMTMzMS4zNCA5NjUuMzU5IDEzODIuNjEgMTA1NS4zMUMxNDAyLjIyIDEwODkuMzIgMTQzMi4wOSAxMTE3LjA3IDE0NTguODQgMTE0NC44MkMxNDk2LjI5IDExODMuNzUgMTUzMy43NCAxMjIyLjI0IDE1NzIuOTcgMTI1OS4zOEMxNjQxLjYyIDEzMjMuODMgMTcxNS4xOCAxMzg0LjI0IDE3OTcuNjYgMTQzMC4zNEMxOTc2Ljg3IDE1MzAuMTMgMjE2Ny4yMyAxNTI2LjU1IDIzNTYuNyAxNDU4LjUzQzI0NTYuNTYgMTQyMi43MyAyNTUxLjk3IDEzNzYuMTkgMjY0OS4xNSAxMzM0LjEyQzI3NTIuNTggMTI4OS4zNyAyODU3LjM1IDEyNDguNjQgMjk2My44OSAxMjExLjk0QzMxNjkuNDEgMTE0MC43OSAzMzgwLjI4IDEwODQuODUgMzU5My4zOCAxMDQzLjY4QzQwMjQuMDMgOTYwLjg4MyA0NDY2LjcyIDkzOC45NTUgNDkwMy4xNiA5ODAuMTI3QzUxMTguNDkgMTAwMC4yNyA1MzMyLjAzIDEwMzYuMDcgNTU0Mi40NiAxMDg2LjY0QzU1NTkuNCAxMDkwLjY3IDU1NjYuNTMgMTA2NC43MSA1NTQ5LjU5IDEwNjAuNjhDNDcwNS42NyA4NTcuNTA1IDM4MDcuMzcgODk4LjIzIDI5ODQuODUgMTE3Ni4xNEMyODgxLjg3IDEyMTEuMDUgMjc4MC4yMiAxMjQ5LjU0IDI2NzkuOTEgMTI5MS42QzI1NzguNzEgMTMzNC4xMiAyNDgwLjE5IDEzODIuOSAyMzc4LjEgMTQyMS44M0MyMjc0LjIzIDE0NjEuMjEgMjE2My42NyAxNDkwLjc1IDIwNTEuNzcgMTQ4Mi43QzE5NDkuMjMgMTQ3NS4wOSAxODUyLjQ5IDE0MzUuMjYgMTc2Ni45IDEzNzkuNzdDMTY4MS4zIDEzMjQuNzIgMTYwNS45NiAxMjU1LjM1IDE1MzQuMTggMTE4My43NUMxNTAyLjk4IDExNTIuNDIgMTQ3MS43NyAxMTIwLjY1IDE0NDEuOSAxMDg3Ljk4QzE0MjMuNjIgMTA2Ny44NCAxNDA1LjM1IDEwNDcuMjYgMTM5Ni40MyAxMDIwLjg1QzEzODIuNjEgOTgwLjU3NCAxMzk1LjU0IDk0MC4yOTcgMTQwOS4zNiA5MDIuMjU4QzE0ODIuMDIgNzAyLjY2MiAxNTYwLjA0IDQ5Ni4zNTQgMTUzMS4wNiAyNzkuNzUyQzE1MDcuNDQgMTAzLjg3NSAxNDE0LjI2IC02Mi4xNTU4IDEyNDguODcgLTEzNy4zNEMxMDgyLjU4IC0yMTIuOTcxIDg5Mi4yMTkgLTE4Ni41NjcgNzE3LjkwNyAtMTYxLjk1NEM1MjYuNjU1IC0xMzUuMTAyIDMzOC4wNzggLTEwNi45MDggMTQ4LjYwOSAtMTYwLjYxMUMtMjEuMjQ0NCAtMjA4Ljk0NCAtMTc1Ljk0IC0zMDYuNTA0IC0yOTguMDkyIC00MzQuMDQ4Qy00MjAuMjQ0IC01NjEuNTkzIC01MTAuNzQzIC03MjAuNDYzIC01NTAuNDIgLTg5My4yMDhDLTU5OS4wMTMgLTExMDMuNTQgLTU1My4wOTUgLTEzMTMuODggLTUwMy4xNjQgLTE1MTkuMjlDLTQ3Ny4zMDcgLTE2MjQuOTEgLTQ1MS4wMDQgLTE3MzAuMDggLTQzNi43MzkgLTE4MzcuOTNDLTQyNC43MDIgLTE5MjUuNjQgLTQyMC42ODkgLTIwMTQuMjUgLTQxMS43NzMgLTIxMDEuOTdDLTM5Mi42MDQgLTIyODIuMzIgLTM0NC45MDIgLTI0NzkuMjMgLTE1Ni43NyAtMjU0OS45NEMtNTYuMDE3MyAtMjU4Ny41MyA1OC41NTU0IC0yNTkzLjggMTY1LjU1IC0yNTkyLjAxQzI3Mi45OSAtMjU4OS43NyAzNzkuOTg0IC0yNTc0LjExIDQ4NC4zMDMgLTI1NDguMTVDNjk0LjI4IC0yNDk1LjM0IDg5Mi4yMTkgLTI0MDEuODEgMTA3Ni43OCAtMjI4OS40OEMxNDQzLjY5IC0yMDY2LjYxIDE3NTMuNTIgLTE3NjQuNTQgMjA5NS40NiAtMTUwNy4yMUMyMjY0Ljg3IC0xMzc5LjY3IDI0NDQuOTcgLTEyNTYuMTUgMjY0MC4yNCAtMTE3MS41N0MyNzMzLjQxIC0xMTMxLjI5IDI4MzEuOTMgLTExMDUuNzggMjkzNC4wMiAtMTExNy44NkMzMDQxLjQ2IC0xMTMwLjg0IDMxNDIuNjYgLTExNzYuMDQgMzI0Mi41MyAtMTIxNS40MkMzMzUzLjk4IC0xMjU5LjI4IDM0NjUuODggLTEzMDMuMTQgMzU3Ny4zMyAtMTM0N0MzNjYzLjgxIC0xMzgxLjAxIDM3NTguMzMgLTE0MTAuOTkgMzgyOS42NiAtMTQ3Mi43NUMzOTA0LjU1IC0xNTM3LjE5IDM5MzEuMyAtMTYzMS42MiAzOTQ0LjY3IC0xNzI2LjA1QzM5NjAuNzIgLTE4MzguODMgMzk2OS42NCAtMTk1Mi45NCAzOTc3LjY2IC0yMDY2LjE3QzM5ODEuNjggLTIxMjIuMTEgMzk4Ni41OCAtMjE3OC4wNSAzOTg3LjQ3IC0yMjMzLjk5QzM5ODguMzYgLTIyNzcuODUgMzk4My45MSAtMjMyMi42IDM5NTguMDUgLTIzNTkuM0MzOTE3LjkzIC0yNDE2LjU4IDM4NDIuNTggLTI0MzAuOSAzNzc3LjA1IC0yNDI0LjE5QzM2MDguOTggLTI0MDcuMTggMzQ3NC4zNSAtMjI2OCAzMzUwLjQxIC0yMTY1LjUyQzMyMjYuNDggLTIwNjMuMDMgMjk4Ni42MyAtMTg5MS42MyAyODQ3LjA5IC0yMDYwLjhDMjc1NC44MSAtMjE3Mi42OCAyNzU1LjcgLTIzNDAuNSAyNjQyLjAyIC0yNDM4Ljk1QzI1MjEuNjUgLTI1NDIuNzggMjMzMy41MiAtMjQ5OS44MiAyMjI2LjUzIC0yMzk3LjMzQzIwODMuODcgLTIyNjAuODQgMjA0NC42NCAtMjA0NS4xMyAyMDExLjY1IC0xODU4Ljk2QzE5MzAuNTEgLTE0MDAuNyAxOTQxLjIxIC05MzMuOTMyIDE5MjguNzMgLTQ3MC4yOThDMTkxNi42OSAtMTguMjk4NiAxODc1LjY3IDQzMS40NjMgMTcyNC45OSA4NjAuMTlDMTU4Ny4yNCAxMjUzLjEyIDEzNzMuNjkgMTYxOS4xOSAxMDk5LjUyIDE5MzEuNTZDOTY2LjIyMyAyMDgyLjgzIDgxNy4zMjMgMjIzNy4yMiA2MzAuNTI5IDIzMjAuMDFDNDE3LjQzMiAyNDEzLjk5IDE4NS42MTEgMjM3Ny43NCAtMjUuMjU2NiAyMjk3LjE5Qy0yNDYuMzc4IDIyMTMuMDYgLTQ1My42NzkgMjA5MC44OCAtNjYyLjc2NCAxOTgwLjc5Qy04NzkuODczIDE4NjYuNjcgLTEwOTYuOTggMTc1Mi41NSAtMTMxNC4wOSAxNjM4LjQzQy0xNTI2LjMgMTUyNyAtMTczOC41IDE0MTUuNTcgLTE5NTAuNzEgMTMwNC4xM0MtMTk1Mi45NCAxMzEyLjY0IC0xOTU1LjE2IDEzMjAuNjkgLTE5NTcuMzkgMTMyOS4yQy0xNTQyLjM1IDEzNDIuMTcgLTExMjYuODUgMTM1NC43IC03MTEuODAzIDEzNjcuNjhDLTUxMy40MTggMTM3My45NSAtMzEyLjgwMyAxMzg5LjE2IC0xMTQuNDE4IDEzODUuNThDLTU3LjgwMDUgMTM4NC42OSA3LjczMzQgMTM3Ni42MyA0Ny44NTYyIDEzMzEuODhDOTIuNDM3MyAxMjgyLjY1IDgxLjI5MTcgMTIxMS41IDY4LjM2MzMgMTE1MS45OEM0My44NDQgMTAzNS42MiAtNjAuOTIxMSA3ODEuNDI3IDE0MC4xMzkgNzY1Ljc2M0MxODMuMzgyIDc2Mi4xODMgMjI3LjUxNyA3NzEuNTgxIDI2OS44NjkgNzc4LjI5NEMzMTguOTA4IDc4NS45MDIgMzY3Ljk0NyA3OTIuNjE1IDQxNi45ODYgNzk4Ljg4QzUxOC4xODUgODExLjg1OCA2MTkuODMgODIyLjE1MSA3MjEuOTIgODI5Ljc1OUMxMTE4LjY5IDg2MC4xOTEgMTUxOC4xMyA4NTIuNTgzIDE5MTMuMTIgODA2LjkzNUMyMTIzLjEgNzgyLjc2OSAyMzMzLjk3IDc1MS40NDIgMjUzOS40OCA2OTkuOTc3QzI3MjIuMjcgNjU0LjMzIDI5MDAuMTQgNTg1LjQxMSAzMDQ4LjE1IDQ2Ni4zN0MzMDUzLjA2IDQ2Mi4zNDIgMzA1Mi42MSA0NTUuMTgyIDMwNTAuMzggNDUwLjI1OUMyOTU1LjQyIDI0My4wNTUgMjcwNi4yMiAyMDcuMjUzIDI1MDMuMzcgMjExLjI4MUMyMzU5LjgyIDIxNC40MTQgMjIxNi43MiAyMzUuODk1IDIwNzQuNTEgMjUwLjY2M0MxOTAxLjA5IDI2OC41NjQgMTcyNy42NyAyODQuNjc1IDE1NTQuMjUgMjk4LjU0OEM4NjcuMjUzIDM1My41OTQgMTc0LjkxMiAzNzEuOTQyIC01MTEuNjM0IDMwNS43MDlDLTgyNy4yNjcgMjc1LjI3NyAtMTE0NC4yNCAyMzAuNTI1IC0xNDUxLjQgMTUxLjMxM0MtMTcyNS41NyA4MC42MDQyIC0xOTk1LjI5IC0yMS40MzE0IC0yMjI5LjM0IC0xODMuNDM1Qy0yMjg5LjUyIC0yMjUuMDU1IC0yMzQ2LjU5IC0yNzAuMjU1IC0yNDAwLjUzIC0zMTkuOTNDLTI0MjQuNiAtMzQyLjMwNiAtMjQ0OS4xMiAtMzY0LjY4MiAtMjQ3MC45NyAtMzg5LjI5NkMtMjQ4My44OSAtNDAzLjYxNyAtMjQ4NC43OSAtNDA2LjMwMiAtMjQ3OC41NCAtNDI0LjY1Qy0yNDcyLjc1IC00NDAuNzYxIC0yNDY0LjcyIC00NTUuOTc3IC0yNDU0LjQ3IC00NjkuODVDLTIzODQuOTIgLTU2Mi45MzUgLTIyNDQuMDUgLTU4MS43MzEgLTIxMzYuNjEgLTU4Ny4xMDFDLTE5NjUuODYgLTU5NS42MDQgLTE3OTMuNzggLTU5NC4yNjIgLTE2MjMuMDQgLTU5Ny4zOTVDLTE0NDguMjggLTYwMC41MjcgLTEyNzMuNTIgLTYwMy4yMTIgLTEwOTguNzcgLTYwNS44OTdDLTc0Ni41NzYgLTYxMC44MiAtMzk0LjM4NiAtNjE1LjI5NSAtNDIuMTk3MyAtNjE3Ljk4QzEzMi41NiAtNjE5LjMyMyAzMDYuODcxIC02MjAuNjY2IDQ4MS42MjkgLTYyMS41NjFDNjQ4LjM2MSAtNjIyLjQ1NiA4MTUuMDk0IC02MjIuOTAzIDk4MS4zODEgLTYwNy4yNEMxMDY5LjY1IC01OTguNzM3IDExNTcuMDMgLTU4NS4zMTEgMTI0My41MiAtNTY1LjYyQzEyNDMuNTIgLTU3NC4xMjMgMTI0My41MiAtNTgzLjA3MyAxMjQzLjUyIC01OTEuNTc2QzExNjEuOTMgLTU2MC4yNSAxMTE4LjI0IC02NjQuNTIzIDExMDUuMzIgLTcyNi43MjlDMTA5My43MiAtNzgxLjc3NCAxMDg1LjcgLTg0Mi42MzcgMTA0NC42OSAtODg0LjcwNUM5NzMuMzU2IC05NTguNTQ2IDg2Ni44MDggLTkyMS40MDEgNzgyLjU1IC04OTYuNzg4QzczMS4yODIgLTg4MS41NzIgNjY1Ljc0OCAtODU3Ljg1MyA2MTEuODA1IC04NzIuMTc0QzU2MC41MzcgLTg4Ni4wNDcgNTQzLjU5NiAtOTgzLjE2IDUzNi40NjMgLTEwMjguMzZDNTE4LjYzMSAtMTE0Mi45MyA1MzQuNjggLTEyNjIuNDEgNTAwLjc5OCAtMTM3NC4zQzQzNy45MzkgLTE1ODEuMDUgMjE3LjI2NCAtMTU4NC4xOCA0OC4zMDIgLTE2NTAuODdDLTU2LjkwODkgLTE2OTIuNDggLTEzNC4wMzQgLTE3ODkuMTUgLTc0LjI5NTcgLTE5MDQuNjFDNS41MDQzOSAtMjA1OC41NiAxOTcuMjAyIC0yMDUxLjQgMzQyLjA5IC0yMDE5LjE4QzYyNi45NjIgLTE5NTYuMDggODg1Ljk3OCAtMTgxMy4zMiAxMTMwLjczIC0xNjU4LjkyQzEzNzkuNDkgLTE1MDIuMjkgMTYyMS4xMiAtMTMzNS4zNiAxODc5LjI0IC0xMTkzLjk0QzIzOTUuOTMgLTkxMS41NTYgMjk2My40NSAtNzAyLjU2MiAzNTUyLjgxIC02NTIuODg3QzM4MjcuODcgLTYyOS42MTYgNDExMi4zIC02MzguMTE5IDQzODEuNTcgLTcwMS42NjdDNDYxNC4yOCAtNzU2LjcxMyA0ODQ4LjMzIC04NTkuMTk2IDUwMDkuNzEgLTEwNDEuMzRDNTA0Ny42MSAtMTA4NC4zIDUwODEuMDQgLTExMzEuMjkgNTEwOS4xMyAtMTE4MC45N0M1MTExLjM2IC0xMTg0Ljk5IDUxMTEuOCAtMTE5MC44MSA1MTA5LjEzIC0xMTk0LjM5QzQ5NjMuNzkgLTE0MDYuNTIgNDc0Ny4xMyAtMTU0OC4zOCA0NTE3LjU0IC0xNjU0LjQ1QzQ0MDAuMjkgLTE3MDkuMDQgNDI3OS40OCAtMTc1NS4xNCA0MTU4LjIyIC0xNzk5LjQ0QzQwMTEuOTkgLTE4NTMuMTUgMzg2NC40MyAtMTkwNy43NCAzNzEwLjYyIC0xOTM0LjE1QzM1NjYuNjMgLTE5NTguNzYgMzQxNy4yOCAtMTk1Ni45NyAzMjc5Ljk3IC0xOTAxLjkzQzMxNzIuNTMgLTE4NTguNTIgMzA3OC45MSAtMTc4Ni45MSAzMDAyLjIzIC0xNzAwLjU0QzI4MjIuMTMgLTE0OTcuODEgMjczOS4yMSAtMTIzNi45MSAyNjcxLjQ0IC05NzkuMTMyQzI2MzIuMjEgLTgzMS4wMDIgMjU5Ni4xIC02ODEuNTI5IDI1NDIuMTYgLTUzNy40MjZDMjQ5Mi42NyAtNDA0LjUxMiAyNDI0LjQ3IC0yODEuODkgMjM0OS4xMiAtMTYyLjQwMUMyMjEzLjE1IDUyLjg1NzcgMjA1MS43NyAyNjIuNzQ2IDE5NzkuOTkgNTExLjEyMkMxOTQ0Ljc3IDYzMi44NDggMTkzNi4zIDc1OS40OTggMTk1OC41OSA4ODQuMzU3QzE5ODQuMDEgMTAyNi42NyAyMDQ1LjUzIDExNjAuMDMgMjExMS45NSAxMjg3LjEzQzIyNTAuMTUgMTU1MS42MSAyNDQyLjMgMTgzOC4wMyAyMzkxLjAzIDIxNTIuMTlDMjM0Ny43OSAyNDE0Ljg5IDIxMjIuMjEgMjU3OC4yMyAxODg4LjE2IDI2NjQuNjFDMTYxOS43OCAyNzYzLjk2IDEzMTguODYgMjc5NC44NCAxMDM0Ljg4IDI3ODUuODlDNDcxLjgyMSAyNzY4LjQzIC0xMDcuMjg1IDI1MjUuODcgLTQwNC42NCAyMDIzLjMxQy00NzkuOTgyIDE4OTUuNzYgLTUzOS43MiAxNzUxLjY2IC01NDguMTkxIDE2MDEuNzRDLTU1Ny41NTMgMTQ0MC42MyAtNDk1LjEzOSAxMjkyLjk1IC0zODguMTQ1IDExNzQuOEMtMjE1LjYxNyA5ODUuNDk3IDUxLjQyMjYgODk0LjY1IDMwMy4zMDUgOTI1LjA4MkMzNjUuNzE4IDkzMi42ODkgNDI3LjY4NiA5NDcuOTA1IDQ4Ni41MzIgOTcxLjE3N0M1NTIuNTEyIDk5Ny4xMzMgNjEzLjU4OCAxMDM0LjI4IDY3OS41NjggMTA2MC42OEM3OTUuMDMyIDExMDYuNzggOTEyLjI4MSAxMDkyLjkgMTAxMS43IDEwMTcuMjdDMTIyNS42OCA4NTQuMzczIDEyNDAuNCA1NjguNDA1IDEzODguODUgMzYwLjc1NEMxNTM4LjY0IDE1MS4zMTMgMTgyMS4yOSAxMzMuODYgMTk5NS4xNSAtNDUuMTQ5OUMyMTc0LjM3IC0yMjkuOTc3IDIxNDQuNSAtNTE2Ljg0IDIwNTEuNzcgLTczNS42NzlDMTk5Mi40OCAtODc0Ljg1OSAxOTEwLjg5IC0xMDAyLjQgMTgzOS4xMiAtMTEzNC44N0MxNzgwLjcyIC0xMjQzLjE3IDE3MzEuMjMgLTEzNTUuOTUgMTY4MS43NSAtMTQ2OC43MkMxNTg5LjQ2IC0xNjc5LjA2IDE0OTYuNzQgLTE4OTkuNjkgMTMzOS4zNyAtMjA3MC42NEMxMjY1LjgxIC0yMTUwLjMgMTE3OC44NyAtMjIxNS4xOSAxMDc5LjQ2IC0yMjU4LjZDMTA2OC4zMSAtMjI2My41MyAxMDU4LjA2IC0yMjU1LjQ3IDEwNTkuODQgLTIyNDMuMzlDMTA5NC4xNyAtMjAwNC40MSAxMTMxLjE3IC0xNzUwLjIyIDEyNzguNzQgLTE1NTEuNTJDMTM5Ny43NyAtMTM5MC44NSAxNTgyLjc4IC0xMjc4LjA4IDE3ODcuNCAtMTMwNC4wM0MxOTg0LjAxIC0xMzI4LjY1IDIxNDQuOTQgLTE0NjcuMzggMjI2NC40MiAtMTYxNi44NUMyMzk1LjQ5IC0xNzgwLjY1IDI0NzkuMyAtMTk3Mi4xOSAyNTgyLjI4IC0yMTUzLjg4QzI2OTYuNDEgLTIzNTUuMjcgMjg0MC44NSAtMjU1Ni42NSAzMDY3LjMyIC0yNjM2Ljc2QzMwNjIuNDIgLTI2MzkgMzA1Ny4wNyAtMjY0MC43OSAzMDUyLjE2IC0yNjQzLjAzQzMyODcuMTEgLTIyODQuMTEgMzQ1NC43MyAtMTg4Mi42OCAzNTQzLjg5IC0xNDYyLjQ2QzM1ODUuOCAtMTI2NC4yIDM2NTYuMjQgLTk5Ni4xMzggMzQ1OS4xOSAtODU4LjMwMUMzMjc3LjMgLTczMS4yMDQgMzA0OS4wNCAtNzk1LjY0NyAyODcwLjcyIC04OTMuNjU1QzIyMjAuMjggLTEyNTAuMzMgMTg2MC45NiAtMTk0Ni4yMyAxNDAzLjU2IC0yNTAxLjE2QzEzNDUuNjEgLTI1NzEuODcgMTI4NS40MiAtMjY0MC43OSAxMjIzLjAxIC0yNzA3LjAyQzExNjEuNDkgLTI3NzIuMzYgMTA5Ni44NSAtMjg0My4wNyAxMDEyLjU5IC0yODc4LjQyQzk0My40ODcgLTI5MDcuMDYgODY1LjkxNiAtMjkwMC44IDgwOC44NTMgLTI4NDkuMzNDNzU1LjM1NSAtMjgwMC41NSA3MjkuNDk5IC0yNzI2LjcxIDcxMi41NTggLTI2NTcuNzlDNjU5Ljk1MiAtMjQ0Mi45OCA2MzIuNzU4IC0yMjE4LjMzIDYwOC42ODQgLTE5OTguNTlDNTgyLjgyNyAtMTc2Ni4zMyA1NjguMTE1IC0xNTMzLjE3IDU2NC41NDkgLTEyOTkuNTZDNTYwLjk4MiAtMTA2NS45NSA1NjguMTE1IC04MzIuMzQ0IDU4Ni4zOTQgLTU5OS4xODRDNTk0LjQxOCAtNDk3LjE0OSA1OTkuNzY4IC0zOTIuNDI4IDYxOS4zODQgLTI5MS43MzZDNjMyLjMxMiAtMjI1LjUwMiA2NTYuODMyIC0xNTEuMjEzIDcxNC4zNDEgLTExMC4wNDFDNzgzLjg4NyAtNjAuMzY1NyA4NjYuODA4IC04Ni43Njk4IDkzNy4yNDYgLTExOS44ODZDMTAzNS4zMiAtMTY2LjQyOSAxMTMwLjI4IC0yMTkuNjg0IDEyMjUuNjggLTI3MS4xNDlDMTQxNC43MSAtMzczLjE4NSAxNjA1LjUxIC00NzYuMTE1IDE4MTAuNTkgLTU0My42OTJDMjEzMy44IC02NTAuMjAyIDI1MzYuMzYgLTY1Ni45MTUgMjgxMC41NCAtNDI0LjY1QzI5NDYuMDYgLTMwOS42MzYgMzA3Mi4yMyAtOTcuNTEwNSAyOTgwLjgzIDgwLjYwNEMyOTY3LjAxIDEwNy45MDMgMjk0Ni41MSAxMDEuNjM4IDI5MTguNDIgMTAxLjE5QzI4OTQuMzUgMTAwLjc0MyAyODcwLjcyIDEwMC4yOTUgMjg0Ni42NSA5OS40MDAxQzI3OTQuNDkgOTcuMTYyNiAyNzQyLjMzIDkzLjEzNSAyNjkwLjYxIDg3Ljc2NDZDMjU4OC41MiA3Ny4wMjM5IDI0ODYuODggNTkuNTcwNiAyMzg3LjAyIDM2Ljc0NjhDMTU2MS4zOCAtMTQ5Ljg3MSA4NjguNTkxIC02NjguMTAzIDE0OS45NDcgLTEwODguMzNDLTIxOC43MzggLTEzMDQuMDMgLTYwMy40NzEgLTE1MDEuMzkgLTEwMTMuNjIgLTE2MjQuNDZDLTEyMTEuMTEgLTE2ODMuNTMgLTE0MTMuOTUgLTE3MjQuNzEgLTE2MTkuOTIgLTE3MzkuNDhDLTE4MTEuNjEgLTE3NTIuOSAtMjAxNS43OSAtMTc1MC4yMiAtMjIwMy4wMyAtMTcwMi4zM0MtMjI3NS4yNiAtMTY4My45OCAtMjM0Ny40OCAtMTY1NS43OSAtMjQwNi43NyAtMTYwOS42OUMtMjQzMi42MyAtMTU4OS41NSAtMjQ1NS44MSAtMTU2Ni4yOCAtMjQ3NC4wOSAtMTUzOC45OEMtMjQ4Ny40NiAtMTUxOC44NSAtMjUxMy43NiAtMTQ3Ni43OCAtMjUwOS43NSAtMTQ1MS4yN0MtMjUwNi4xOCAtMTQzMS4xMyAtMjQ4NC43OSAtMTQwNS42MiAtMjQ3NC41MyAtMTM4OC4xN0MtMjQ2Mi45NCAtMTM2OC40OCAtMjQ1MC45IC0xMzQ4Ljc5IC0yNDM4Ljg3IC0xMzI5LjU0Qy0yNDEyLjEyIC0xMjg3LjAzIC0yMzg0LjAzIC0xMjQ1LjQxIC0yMzU0LjYxIC0xMjA0LjY4Qy0yMzAwLjY3IC0xMTI5Ljk1IC0yMjQyLjcxIC0xMDU3LjkgLTIxODEuNjQgLTk4OC41M0MtMTkxOC4xNiAtNjkwLjQ3OSAtMTYwMi41MyAtNDQ1LjY4NCAtMTI5Mi4yNSAtMTk5Ljk5M0MtNjEyLjgzMyAzMzQuMzUgMzUuMzczNSA5MDMuNiA2NTEuOTI4IDE1MDYuODZDMTI2NS44MSAyMTA3Ljg5IDE4NDguOTMgMjc0MC42OSAyMzk2LjgyIDM0MDMuMDJDMjUzMS40NiAzNTY1LjQ3IDI2NjMuODYgMzczMC4xNiAyNzk0LjQ5IDM4OTYuMTlDMjgwMC43MyAzODg5LjkzIDI4MDYuOTcgMzg4My42NiAyODEzLjIxIDM4NzcuNEMyNDIxLjc5IDM0NzEuNDkgMjExMC42MiAyOTg5Ljk2IDE5MDAuNjQgMjQ2NS45MUMxNzk2LjMyIDIyMDUuNDUgMTcxNi41MiAxOTM0LjcgMTY2NC4zNiAxNjU4LjU3QzE2MDUuMDcgMTM0My45NiAxNTgyLjc4IDEwMTMuMjQgMTY2Ni41OSA3MDEuMzJDMTczNS4yNCA0NDUuNzgzIDE4NzguNzkgMTg5LjggMjEwMS43IDM4LjUzNzFDMjE2Ni4zNCAtNS4zMjAzMSAyMjQ2LjE0IC00MS4xMjIzIDIzMjUuMDUgLTIwLjA4ODlDMjM5MS40OCAtMi4xODc3NCAyNDM2LjA2IDU2LjQzOCAyNDYxLjkxIDExNi44NTRDMjUxNC45NiAyNDAuMzcgMjUxMi4yOSAzOTAuNzM4IDI0ODYuODggNTIwLjUyQzI0MzIuOTQgNzk3Ljk4NSAyMjU3LjI5IDEwMzYuMDcgMjAyNS45MSAxMTkzLjE1QzE4MDAuMzMgMTM0Ni4yIDE1MTUuMDEgMTQ0Mi44NyAxMjQyLjE4IDE0NDkuMTNDMTEwMy4wOSAxNDUyLjI2IDk1Ny4zMDcgMTQyNC45NyA4NDcuNjM4IDEzMzMuNjdDNzQ0LjY1NiAxMjQ4LjE5IDY4NS44MDkgMTEyMS45OSA2NTQuMTU3IDk5My41NTJDNTg1LjA1NiA3MTIuMDYgNjIwLjcyMSA0MDEuNDc5IDcyNS45MzIgMTMzLjg2Qzc1NC4wMTggNjIuNzAzMSA3ODcuODk5IC01Ljc2NzgyIDgyNi4yMzkgLTcyLjAwMTVDODE3Ljc2OSAtNzQuMjM5IDgwOS43NDQgLTc2LjQ3NjYgODAxLjI3NCAtNzguNzE0NEM3NzYuMzA5IDUxMy44MDcgNjU1Ljk0IDExMDEuNDEgNDQ1LjUxOCAxNjU1Ljg5QzM5MS4xMjkgMTc5OS41NCAzMzAuMDUzIDE5NDAuOTYgMjYzLjYyOCAyMDc5LjI1QzIzNy4zMjUgMjEzNC4yOSAyMTAuNTc3IDIyMTMuNSAxNTYuMTg4IDIyNDcuOTZDODUuNzUgMjI5Mi43MSAzNC4wMzYxIDIyMTkuMzIgOS45NjI0IDIxNjEuMTRDLTQ3LjU0NjkgMjAyMS41MiAtODQuMTAzMyAxODY4LjQ2IC0xMjEuNTUxIDE3MjIuNTdDLTE2MC4zMzcgMTU3MS43NSAtMTkyLjg4MSAxNDE5LjE1IC0yMTkuMTg0IDEyNjYuMDlDLTI2Mi44NzMgMTAxMy42OSAtMjg4LjI4NCA3MTIuNTA4IC01MDYuMjg0IDU0Mi44OTZDLTUxMi41MjYgNTM3Ljk3NCAtNTE5LjIxMyA1MzcuOTc0IC01MjUuMDA5IDU0Mi44OTZDLTgxMy40NDcgNzc5LjYzNiAtMTA3Mi4wMiAxMDUwLjg0IC0xMjk1LjM3IDEzNTAuMjNDLTE0MDguMTYgMTUwMS4wNCAtMTUxMS4xNCAxNjU5LjAyIC0xNjA0Ljc2IDE4MjIuODFDLTE2NTEuNTcgMTkwNC43MSAtMTY5NS43IDE5ODcuOTUgLTE3MzYuNzIgMjA3Mi41M0MtMTc2Ni41OSAyMTMzLjg0IC0xNzkwLjIyIDIxOTguNzMgLTE3OTYuOSAyMjY3LjIxQy0xODAyLjI1IDIzMjQuMDQgLTE3OTQuMjMgMjM4Ny4xNCAtMTc1My42NiAyNDMwLjFDLTE2OTkuNzIgMjQ4Ny4zOSAtMTYxOC4xMyAyNDgxLjU3IC0xNTQ4LjE0IDI0NjUuMDFDLTEzMzQuMTUgMjQxNC40NCAtMTEyMS45NSAyMzUyLjIzIC05MDkuMjk2IDIyOTUuODVDLTQ4My41NDggMjE4Mi42MiAtNTcuODAwNSAyMDY5Ljg1IDM2Ny45NDcgMTk1Ni42MkM1NDQuMDQyIDE5MTAuMDggNzUzLjEyNiAxODI1LjUgOTM2LjM1NCAxODc3LjQxQzExMjEuODEgMTkzMC4yMiAxMTc3LjA5IDIxMzUuNjMgMTE5OC45NCAyMzA1LjY5QzEyMTcuMjEgMjQ0OC45IDEyMTIuMzEgMjYwOC4yMiAxMTQ2Ljc4IDI3MzkuNzlDMTExNS41NyAyODAyLjQ0IDEwNjkuNjUgMjg1Ni41OSAxMDA4LjEzIDI4OTAuNjFDOTE2LjczOCAyOTQxLjE4IDgxMC4xOSAyOTM2LjcgNzEwLjMyOSAyOTE5LjdDMzU1LjQ2NSAyODU4LjM4IDcuMjg3NiAyNzI0LjU4IC0zMDcuODk5IDI1NTIuMjhDLTYyNC40MjQgMjM3OS41MyAtOTE0LjY0NiAyMTU4LjkgLTExNjUuMTkgMTg5OS4zNEMtMTI5Ni4yNiAxNzYzLjI5IC0xNDEwLjgzIDE2MTUuMTYgLTE1MjYuNzQgMTQ2Ni41OUMtMTY0Mi4yMSAxMzE4LjkgLTE3NjUuMjUgMTE3My40NiAtMTkyMy4wNyAxMDY5LjE4Qy0yMDY1LjI4IDk3NS4yMDQgLTIyMzguMjUgOTEyLjk5OCAtMjQxMC4zNCA5MzYuMjdDLTI1NTIuOTkgOTU1LjUxMyAtMjY4OS44NiAxMDM4Ljc1IC0yNzY3LjQzIDExNjAuOTNDLTI4MDYuMjEgMTIyMS4zNCAtMjgyNy4xNyAxMjkwLjI2IC0yODI4LjUgMTM2Mi4zMUMtMjgyOC41IDEzNjkuOTIgLTI4MjIuMjYgMTM3NS4yOSAtMjgxNS4xMyAxMzc1Ljc0Qy0xNzc5LjUyIDE0MjQuMDcgLTg2OS4xNzMgODQ4LjEwNyAyOC42ODY1IDQxNC45MDRDMTQxLjkyMiAzNjAuMzA2IDI1NS42MDMgMzA3LjQ5OSAzNzEuMDY4IDI1Ny44MjRDNDcxLjM3NSAyMTQuODYxIDU4NC42MTEgMTU0Ljg5MyA2OTcuNCAxNjMuODQ0Qzg1MS42NSAxNzYuMzc0IDg0Ni43NDYgMzQ0LjE5NiA4MjQuNDU2IDQ2MC41NTJDODEzLjc1NyA1MTYuNDkyIDc5Ni44MTYgNTcxLjUzOCA3NzMuNjM0IDYyMy40NTFDNzQ4LjY2OCA2NzkuODM5IDcxMS42NjYgNzU0LjEyNyA2NDYuNTc4IDc3MS41ODFDNTc2LjE0IDc5MC4zNzcgNTQxLjgxMyA3MDQuMDA1IDUxNS41MSA2NTQuNzc3QzQ4Ni41MzIgNjAwLjE3OSA0NTkuNzg0IDU0My43OTIgNDM1LjI2NCA0ODYuOTU2QzM4OC45IDM3OC4yMDggMzUxLjQ1MiAyNjYuMzI3IDMxOS4zNTQgMTUyLjY1NkMyNTUuMTU3IC03NS4xMzQgMjEzLjY5NyAtMzA4LjI5NCAxNzEuMzQ1IC01NDEuMDA2QzE0OS41MDEgLTY2MC4wNDggMTI3LjY1NiAtNzc5LjUzNyAxMDIuNjkxIC04OTguMTNDODIuNjI5NCAtOTkzLjkwMSA2OS4yNTQ5IC0xMTA0LjQ0IDE3LjA5NTIgLTExODkuNDdDLTM4LjYzMDkgLTEyODEuMjEgLTEzMS44MDUgLTEyODguMzcgLTIyOC45OTEgLTEyNjguNjhDLTMzMy4zMTEgLTEyNDcuNjUgLTQzNy4xODQgLTEyMTkuOSAtNTM4LjgyOSAtMTE4OS4wMkMtNzQ2LjEzIC0xMTI1LjkyIC05NDkuNDE5IC0xMDQxLjc5IC0xMTMyLjY1IC05MjQuNTM0Qy0xMzAxLjYxIC04MTYuNjgxIC0xNDcwLjU3IC02NzQuODE2IC0xNTcyLjIxIC00OTguOTM5Qy0xNjYyLjI3IC0zNDMuNjQ4IC0xNjk3LjkzIC0xMjAuMzM0IC0xNTE4LjcyIC0xMy4zNzZDLTE0MzMuNTcgMzcuNjQxOCAtMTMyOS42OSA0Ny45MzQ4IC0xMjMyLjk1IDU1LjU0MjdDLTExMDkuOTEgNjQuOTQwOSAtOTg1LjUzIDYyLjcwMzEgLTg2Mi45MzIgNDkuMjc3M0MtNjI5LjMyOCAyMy4zMjEgLTQwMS4wNzQgLTQyLjkxMjQgLTE5MC4yMDYgLTE0OC4wODFDMy43MjA5NSAtMjQ0Ljc0NiAxNzkuMzcgLTM3Mi4yOSAzNTIuMzQ0IC01MDIuMDcyQzUyNC40MjYgLTYzMS40MDYgNjk0LjI4IC03NjQuMzIxIDg3OS43MzYgLTg3My45NjRDOTc1LjU4NSAtOTMwLjggMTA3NS40NSAtOTgwLjkyMiAxMTgwLjIxIC0xMDE5LjQxQzEyOTQuMzQgLTEwNjEuNDggMTQyMS44NCAtMTA5OS4wNyAxNTQzLjk5IC0xMDc1LjM1QzE2NTQuMTEgLTEwNTMuODcgMTc2Ny43OSAtOTYzLjkxNiAxNzY0LjIyIC04NDEuMjk1QzE3NjEuNTUgLTc1NC4wMjggMTY5Mi44OSAtNjkyLjcxNyAxNjEzLjk4IC02NjkuNDQ2QzE1MjkuNzMgLTY0NC4zODQgMTQzMy40MyAtNjU2LjQ2OCAxMzY0LjMzIC03MTIuNDA4QzEyODQuNTMgLTc3Ni40MDQgMTI0MS4yOSAtODczLjUxNiAxMjIxLjIzIC05NzEuNTI0QzExNzguODcgLTExNzYuNDkgMTIxNC45OCAtMTQxMi43OCAxMzEzLjUxIC0xNTk2LjcyQzEzMzUuOCAtMTYzOC4zMyAxMzYxLjY2IC0xNjc4LjE2IDEzOTEuOTcgLTE3MTMuOTdDMTQyMi4yOSAtMTc1MC4yMiAxNDY4LjY1IC0xODA2LjE2IDE1MTMuNjggLTE4MjMuNjFDMTUzMC4xNyAtMTgyOS44NyAxNTMxLjA2IC0xODMxLjY2IDE1NDIuMjEgLTE4MTMuNzZDMTU0OC45IC0xODAzLjAyIDE1NDkuNzkgLTE3ODcuODEgMTU0OS4zNCAtMTc3NS4yOEMxNTQ4IC0xNzQ4Ljg3IDE1MzYuODYgLTE3MjIuOTIgMTUyNC4zOCAtMTcwMC41NEMxNDk2LjI5IC0xNjUwLjQyIDE0NTEuMjYgLTE2MTEuOTMgMTQwOC45MSAtMTU3NC4zNEMxMjM1LjQ5IC0xNDE5Ljk0IDEwMzAuNDIgLTEzMDEuMzUgODExLjA4MiAtMTIyNy41MUM3NjEuMTUxIC0xMjEwLjk1IDcxMC4zMjkgLTExOTYuMTggNjU4LjYxNSAtMTE4NC4xQzU5MS4yOTggLTExNjguNDMgNTE4LjE4NSAtMTE1MS40MyA0NTAuNDIyIC0xMTcyLjkxQzM0NS42NTcgLTEyMDYuMDMgMjg4LjE0NyAtMTMxNi4xMiAyNjYuNzQ5IC0xNDE3LjI2QzIyMS4yNzYgLTE2MzYuMSAzMTUuNzg3IC0xODgwIDE4My4zODIgLTIwODAuMDRDMTMwLjc3NyAtMjE2MC4xNSA1MS40MjI2IC0yMjAxLjc3IC00Mi4xOTczIC0yMjE1LjE5Qy0xNTkuNDQ1IC0yMjMxLjc1IC0yODIuNDg5IC0yMjI5LjUxIC00MDAuNjI4IC0yMjIyLjhDLTgxNy40NiAtMjIwMC40MiAtMTI3My4wOCAtMjAyOC41OCAtMTQ0Ni45NCAtMTYxNS4wNkMtMTQ4Mi42MSAtMTUzMC40OCAtMTUyMS4zOSAtMTQxNS45MiAtMTQ3OS45MyAtMTMyNi40MUMtMTQ0NC4yNyAtMTI0OS40NCAtMTM1OC4yMyAtMTIxNy4yMSAtMTI4MC4yMSAtMTIwMi44OUMtMTA0Ni42MSAtMTE1OS4wNCAtNzk1LjYxNSAtMTE3OS4xOCAtNTYyLjkwMiAtMTIyMC44Qy01My43ODgzIC0xMzEyLjA5IDQxNC4zMTEgLTE1NDEuNjcgODczLjA0OSAtMTc3MS4yNUMxMTA1LjMyIC0xODg3LjE2IDEzMzcuMTQgLTIwMTEuMTIgMTU4MC4xIC0yMTAzLjc2QzE2OTcuMzUgLTIxNDguNTEgMTgyMC44NCAtMjE4MS42MyAxOTQ3LjQ1IC0yMTc0LjQ3QzIwNzAuMDUgLTIxNjcuNzYgMjE4Ni44NSAtMjEyMi41NiAyMjkyLjA2IC0yMDYwLjhDMjM5MS45MiAtMjAwMi4xNyAyNDgzLjMxIC0xOTI4Ljc4IDI1NjguOTEgLTE4NTAuNDZDMjY1Ni43MyAtMTc3MC4zNSAyNzQwLjU0IC0xNjc1LjQ4IDI3NjIuMzkgLTE1NTQuMkMyODAzLjg1IC0xMzIwLjU5IDI2MjcuMzEgLTExMTQuMjggMjQyNy41OSAtMTAyNS4yM0MyMjE4LjA2IC05MzEuMjQ3IDE5NjkuMjkgLTkyMS44NDkgMTc0My43MSAtOTQyLjQzNUMxNTEzLjIzIC05NjMuMDIxIDEyODUuODcgLTEwMjYuMTIgMTA3Ny4yMyAtMTEyNi4zN0M2NzEuMDk3IC0xMzIxLjQ5IDM0Ny44ODYgLTE2NTguMDMgMTYyLjQyOSAtMjA2OS4zQzcxLjkyOTkgLTIyNjkuNzkgMTYuMjAzOSAtMjQ4NS4wNSAtMi4wNzQ0NiAtMjcwNC4zNEMtNS4xOTUwNyAtMjcyMS43OSAtMzEuOTQzOCAtMjcyMS43OSAtMzAuNjA2MiAtMjcwNC43OFoiIGZpbGw9IiNFNjAwN0EiLz4KPC9nPgo8cGF0aCBkPSJNNTc5LjY2MSAxMTUxSDc1MC44MjdMODA1LjM5OCA5NTMuMTE4QzgxMi45MjMgOTI1LjgzMyA4NTEuMjkgOTI1Ljg1IDg1OC43OTEgOTUzLjE0MUw5MTMuMTczIDExNTFIMTA4NC4wMUwxMjE1IDY0NUgxMDU0LjYxTDEwMTMuNjUgODQ1LjgxMUMxMDA3LjcgODc0Ljk3MiA5NjYuNjgxIDg3NS43NzggOTU5LjYxIDg0Ni44NzJMOTEwLjIzMyA2NDVINzUzLjc2N0w3MDUuNjY1IDg0OC4xMjZDNjk4Ljc5NyA4NzcuMTI4IDY1Ny42OSA4NzYuNTY2IDY1MS42MDMgODQ3LjM4N0w2MzcuMTU4IDc3OC4xMzhDNjIwLjk3MyA3MDAuNTQ3IDU1My4xMDIgNjQ1IDQ3NC40OCA2NDVINDQ5TDU3OS42NjEgMTE1MVoiIGZpbGw9IndoaXRlIi8+CjxkZWZzPgo8bGluZWFyR3JhZGllbnQgaWQ9InBhaW50MF9saW5lYXIiIHgxPSItMjMyLjQyOSIgeTE9IjgxNi4xNjkiIHgyPSIyNzEzLjY5IiB5Mj0iODEzLjU5MiIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgo8c3RvcCBzdG9wLWNvbG9yPSIjRjc5NDIwIiBzdG9wLW9wYWNpdHk9IjAuOTIiLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjQzRDNEM0IiBzdG9wLW9wYWNpdHk9IjAiLz4KPC9saW5lYXJHcmFkaWVudD4KPC9kZWZzPgo8L3N2Zz4K'; +export const westendChain = + 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTY3MiIgaGVpZ2h0PSIxNjcyIiB2aWV3Qm94PSIwIDAgMTY3MiAxNjcyIiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8Y2lyY2xlIGN4PSI4MzYuMjc0IiBjeT0iODM2LjIxOSIgcj0iODM1LjQzNiIgZmlsbD0iI0U2MDA3QSIvPgo8bWFzayBpZD0ibWFzazAiIG1hc2stdHlwZT0iYWxwaGEiIG1hc2tVbml0cz0idXNlclNwYWNlT25Vc2UiIHg9IjAiIHk9IjAiIHdpZHRoPSIxNjcyIiBoZWlnaHQ9IjE2NzIiPgo8Y2lyY2xlIGN4PSI4MzYuMjc0IiBjeT0iODM2LjIxOSIgcj0iODM1LjQzNiIgZmlsbD0iI0M0QzRDNCIvPgo8L21hc2s+CjxnIG1hc2s9InVybCgjbWFzazApIj4KPHJlY3QgeD0iLTI5OS45MTkiIHk9Ii02Ni4wNTE4IiB3aWR0aD0iMjg0MC40OCIgaGVpZ2h0PSIxODcxLjM4IiBmaWxsPSJ1cmwoI3BhaW50MF9saW5lYXIpIi8+CjxwYXRoIGQ9Ik0tMzAuNjA2MiAtMjcwNC43OEM0LjYxMjU1IC0yMjgzLjY2IDE3Ny4xNDEgLTE4NzkuMSA0NTUuNzcyIC0xNTYyLjI2Qzc0MS41MzUgLTEyMzcuMzUgMTEzNy40MSAtMTAxOC41MSAxNTYxLjgyIC05NDAuNjQ1QzE3NzAuOTEgLTkwMi4xNTggMTk4OS4zNiAtODk0Ljk5OCAyMTk5LjMzIC05MzEuMjQ3QzIzOTkuMDUgLTk2NS43MDYgMjYwMC41NiAtMTA1Mi45NyAyNzEzLjM1IC0xMjMwLjY0QzI3NjMuNzMgLTEzMDkuNCAyNzk0LjQ5IC0xNDAyLjk0IDI3OTMuMTUgLTE0OTYuOTJDMjc5MS44MSAtMTU5Ny4xNiAyNzQ5LjQ2IC0xNjg3LjU2IDI2ODcuNDkgLTE3NjQuNTRDMjYxOC44NCAtMTg1MC4wMSAyNTMxLjAxIC0xOTIyLjUxIDI0NDQuMDggLTE5ODkuMTlDMjM1OC4wNCAtMjA1NC45OCAyMjY1LjMxIC0yMTEzLjE2IDIxNjQuMTEgLTIxNTIuOTlDMTkzOS40MiAtMjI0MC43IDE3MTYuMDcgLTIxOTEuOTIgMTUwMC43NSAtMjEwMS4wN0MxMjcyLjQ5IC0yMDA0Ljg2IDEwNTEuODIgLTE4OTEuMTkgODMwLjY5NyAtMTc4MC42NUMzNzguMjAxIC0xNTU0LjY1IC04NC4xMDMzIC0xMzMxLjMzIC01ODYuNTMgLTEyNDQuNTFDLTcxMi42OTQgLTEyMjIuNTkgLTg0MS4wODcgLTEyMTAuMDUgLTk2OS4wMzUgLTEyMDguNzFDLTEwODMuNjEgLTEyMDcuMzcgLTEyMDcuOTkgLTEyMDguMjYgLTEzMTguOTkgLTEyMzkuNTlDLTEzNjguMDMgLTEyNTMuNDYgLTE0MTguNDEgLTEyNzYuNzQgLTE0NDYuOTQgLTEzMjEuMDRDLTE0ODMuOTQgLTEzNzguMzIgLTE0NzEuMDIgLTE0NDkuOTMgLTE0NTQuOTcgLTE1MTEuNjlDLTE0MjcuNzcgLTE2MTQuNjIgLTEzNzYuNSAtMTcxMC4zOSAtMTMxMC4wOCAtMTc5My4xOEMtMTE3Mi43NyAtMTk2NC41OCAtOTc3Ljk1MSAtMjA3OC4yNSAtNzY4Ljg2NiAtMjEzNy43N0MtNjQ5LjM4OSAtMjE3MS43OCAtNTI1LjQ1NCAtMjE4OS4yNCAtNDAxLjUxOSAtMjE5NS45NUMtMjgyLjA0MiAtMjIwMi4yMSAtMTU0Ljk4NyAtMjIwNi42OSAtMzYuNDAxOSAtMjE4N0M3OS41MDg1IC0yMTY4LjIgMTU5Ljc1NCAtMjA5NS43IDE5OS40MzEgLTE5ODUuNjFDMjM5LjU1NCAtMTg3NS4wNyAyMzIuNDIxIC0xNzU3LjgyIDIyOC40MDkgLTE2NDIuMzZDMjIyLjYxNCAtMTQ2OS4xNyAyMzYuODc5IC0xMjIxLjY5IDQzMS4yNTIgLTExNTAuOThDNTMyLjAwNSAtMTExNC4yOCA2NTIuMzc0IC0xMTUyLjc3IDc1MC44OTcgLTExODEuNDFDODUzLjQzNCAtMTIxMS40IDk1My4yOTUgLTEyNTAuNzggMTA0OC43IC0xMjk4LjY2QzExNDcuMjIgLTEzNDguMzQgMTI0MC44NCAtMTQwNi45NiAxMzI4LjIyIC0xNDc0LjU0QzE0MDMuMTIgLTE1MzEuODIgMTQ5MC4wNSAtMTU5Ni4yNyAxNTQwLjQzIC0xNjc3LjcyQzE1NzYuMDkgLTE3MzUuNDUgMTU5Ni42IC0xODE0LjY2IDE1MzMuMjkgLTE4NjAuMzFDMTUyOS43MyAtMTg2Mi45OSAxNTIzLjQ4IC0xODYyLjU0IDE1MTkuOTIgLTE4NjAuMzFDMTMzNi42OSAtMTc0Ny45OCAxMjM1LjA1IC0xNTQ2LjE0IDExOTYuNzEgLTEzMzkuMzlDMTE2MS4wNCAtMTE0Ni41MSAxMTYxLjkzIC05MDguODcxIDEyOTAuNzcgLTc0OC4yMUMxMzk0LjIgLTYxOS4zMjMgMTU5Ny4wNCAtNTg0Ljg2NCAxNzI0Ljk5IC03MDEuMjJDMTc4Ni4wNyAtNzU2LjcxMyAxODA1LjI0IC04NDIuMTkgMTc3Ny4xNSAtOTE5LjYxMUMxNzQzLjcxIC0xMDExLjM1IDE2NTguMTIgLTEwNzYuMjQgMTU2NC45NCAtMTA5OC42MkMxNDQyLjM1IC0xMTI4LjE2IDEzMTMuMDYgLTEwOTUuMDQgMTE5Ny4xNSAtMTA1NC43NkMxMDg5LjcxIC0xMDE3LjE3IDk4Ni43MyAtOTY3Ljk0NCA4ODguMjA3IC05MTEuMTA5QzY4Mi42ODkgLTc5Mi41MTUgNDk2LjM0IC02NDQuMzg1IDMwNi40MjYgLTUwMi41MTlDMTEyLjQ5OSAtMzU3Ljk2OSAtODYuNzc4MyAtMjE3Ljg5NCAtMzEwLjU3NCAtMTIzLjQ2N0MtNTYxLjU2NSAtMTYuOTU2MSAtODM0Ljg0NiAzNi43NDY4IC0xMTA3LjY4IDMzLjE2NjdDLTEyMzAuNzIgMzEuMzc2NSAtMTM3MS4xNSAyOS4xMzg5IC0xNDgzLjk0IC0yNS45MDY1Qy0xNjA1LjIgLTg1LjQyNzIgLTE2NDIuNjUgLTIxMS42MjkgLTE2MTEuODkgLTMzNi45MzZDLTE1ODIuNDcgLTQ1Ni44NzIgLTE1MDkuMzYgLTU1OC40NiAtMTQyNy4zMyAtNjQ3LjUxN0MtMTM0NS43NCAtNzM2LjEyNyAtMTI1Mi41NyAtODEzLjk5NiAtMTE1Mi43MSAtODgxLjEyNEMtOTUzLjQzMSAtMTAxNC40OSAtNzI5LjYzNSAtMTEwNi4yMyAtNTAwLjQ4OSAtMTE3My44MUMtNDQyLjk4IC0xMTkwLjgxIC0zODUuMDI1IC0xMjA2LjAzIC0zMjcuMDY5IC0xMjE5LjlDLTI2NC42NTYgLTEyMzUuMTIgLTE5NS41NTYgLTEyNTcuNDkgLTEzMC45MTMgLTEyNTMuNDZDMTQuODY2MiAtMTI0NC4wNyAzNy4xNTcgLTEwNjguNjQgNjIuMTIyMyAtOTU1LjQxM0MxNzMuNTc0IC00NTUuNTI5IDIxNi44MTggNjcuMTc4NSA0MjguNTc3IDUzOC44NjhDNDU0Ljg4IDU5Ny45NDIgNDgzLjg1OCA2NTUuNjcyIDUxNS45NTYgNzExLjYxM0M1MzcuODAxIDc1MC4xIDU2NC41NDkgNzkxLjcxOSA2MTEuODA1IDc5OS4zMjdDNzE1LjIzMyA4MTQuOTkxIDc3OC4wOTIgNjgzLjQxOSA4MDguODUzIDYwNi40NDVDODQ5LjQyMSA1MDQuNDA5IDg4My43NDkgMzY4LjM2MiA4NTMuNDM0IDI1OS4xNjZDODI2LjY4NSAxNjMuODQ0IDczNy41MjMgMTI4LjQ4OSA2NDYuMTMyIDEzNi45OTJDNTMyLjAwNSAxNDcuNzMzIDQyNC4xMTkgMjA0LjEyMSAzMjAuNjkyIDI0OS4zMjFDMTkxLjQwNyAzMDUuNzA4IDYzLjQ1OTUgMzY2LjEyNCAtNjMuMTUwNCA0MjguMzNDLTMxNC41ODcgNTUxLjg0NyAtNTYyLjQ1NyA2ODIuNTI0IC04MTQuMzM5IDgwNi4wNEMtMTMxNi43NyAxMDU0LjQyIC0xODQ2LjM5IDEyNzYuODQgLTI0MDkgMTMzNi4zNkMtMjU0NC4wOCAxMzUwLjY4IC0yNjc5LjYgMTM1NS4xNSAtMjgxNS4xMyAxMzQ4LjQ0Qy0yODEwLjY3IDEzNTIuOTEgLTI4MDYuMjEgMTM1Ny4zOSAtMjgwMS43NiAxMzYxLjg2Qy0yNzk4LjE5IDExODcuMzMgLTI2NjUuMzQgMTA0NS4wMiAtMjUwNy41MiA5ODcuMjg3Qy0yMzMyLjMyIDkyMy4yOTIgLTIxMzkuNzMgOTcxLjYyNCAtMTk4My4yNSAxMDYyLjQ3Qy0xODE0LjI5IDExNjAuOTMgLTE2ODQuMTEgMTMwOS4wNiAtMTU2My43NCAxNDYxLjIxQy0xNDQ2LjUgMTYwOS43OSAtMTMzMi44MSAxNzYwLjYxIC0xMjAyLjE5IDE4OTguNDVDLTcyMC4yNzMgMjQwNS40OSAtODguMTE1NyAyNzY3LjU0IDU5My4wODEgMjkyMi4zOEM3NTAuMDA2IDI5NTguMTggOTI4LjMyOSAyOTkxLjc1IDEwNjUuNjQgMjg4NC4zNEMxMTY1LjUgMjgwNi4wMiAxMjEwLjUzIDI2NzkuMzggMTIyNy4wMiAyNTU3LjJDMTI0Ni4xOSAyNDEwLjg2IDEyMzAuMTQgMjI1NS41NyAxMTg1LjEyIDIxMTUuMDVDMTEzNS4xOCAxOTU5LjMxIDEwMjcuNzQgMTg0OS42NyA4NjAuMTIxIDE4MzcuMTRDNjc5LjEyMiAxODIzLjcxIDQ5Mi43NzQgMTg5NS4zMSAzMjAuNjkyIDE5NDAuOTZDMTA2LjI1NyAxOTk3LjggLTEwNy43MzEgMjA1NC42MyAtMzIyLjE2NSAyMTExLjQ3Qy01MzMuOTI1IDIxNjcuNDEgLTc0NS4yMzkgMjIyMy44IC05NTYuOTk4IDIyNzkuNzRDLTEwNjEuMzIgMjMwNy40OCAtMTE2Ni4wOCAyMzM1LjIzIC0xMjcwLjQgMjM2Mi45OEMtMTM3NC4yOCAyMzkwLjcyIC0xNDc4LjU5IDI0MjUuMTggLTE1ODQuMjUgMjQ0NC40M0MtMTY4NS45IDI0NjIuNzcgLTE3NjcuOTIgMjQxNS4zNCAtMTc3MS45NCAyMzA3LjkzQy0xNzc1LjA2IDIyMzAuNTEgLTE3NDcuNDIgMjE1My45OCAtMTcxMy45OCAyMDg1LjUxQy0xNjMzLjI5IDE5MjAuMzcgLTE1NDIuMzUgMTc2MC42MSAtMTQ0Mi4wNCAxNjA2LjY2Qy0xMjM2LjA3IDEyODkuODEgLTk5MC44NzkgOTk4LjQ3NiAtNzEzLjU4NiA3NDIuMDQ0Qy02NDYuMjY5IDY3OS44MzkgLTU3Ny4xNjggNjE5LjQyMyAtNTA2LjI4NCA1NjEuMjQ1Qy01MTIuNTI2IDU2MS4yNDUgLTUxOC43NjcgNTYxLjI0NSAtNTI1LjAwOSA1NjEuMjQ1Qy0zMDguNzkxIDcyOS41MTQgLTI4Ni45NDYgMTAzMC4yNSAtMjQzLjI1NyAxMjgwLjQyQy0yMTUuMTcxIDE0NDEuNTIgLTE3OS45NTIgMTYwMS43NCAtMTM4LjkzOCAxNzYwLjE2Qy0xMTcuOTg1IDE4NDAuNzIgLTk1LjI0ODUgMTkyMC44MiAtNzAuNzI5MiAyMDAwLjQ4Qy01MC42Njc3IDIwNjYuMjcgLTMzLjI4MSAyMTM2LjUzIC0yLjA3NDQ2IDIxOTcuODRDMTguODc4NyAyMjM4LjU2IDUwLjk3NzEgMjI3OS43NCA5OS4xMjQzIDIyODYuNDVDMTQ1LjkzNCAyMjkzLjE2IDE4NC43MTkgMjI2NC41MiAyMTIuMzYgMjIyOS4xN0MyNTIuOTI4IDIxNzYuMzYgMjc4LjM0IDIxMTAuNTcgMzA2LjQyNiAyMDUwLjZDMzM5Ljg2MSAxOTc5LjQ1IDM3MS45NTkgMTkwNy40IDQwMi4yNzUgMTgzNC45QzUyMS4zMDYgMTU1MC43MiA2MTYuNzA5IDEyNTYuMjUgNjg3LjE0NiA5NTYuNDA4Qzc2Ni41IDYxNi43MzggODEzLjc1NiAyNjkuNDU5IDgyOC40NjggLTc5LjYwOTRDODI4LjkxNCAtOTMuMDM1MiA4MTAuMTkgLTk3LjUxMDMgODAzLjUwMyAtODYuMzIyM0M2NDYuMTMyIDE4NC40MyA1NzMuMDIgNTAxLjI3NyA1OTkuMzIyIDgxMy42NDhDNjIxLjE2NyAxMDc1LjQ1IDcyNS4wNCAxMzUzLjgxIDk5NC43NTUgMTQ0Mi40MkMxMTI5LjM5IDE0ODYuNzIgMTI3Ni41MSAxNDgwLjkxIDE0MTQuNzEgMTQ1Ny42M0MxNTU4LjcgMTQzMy40NyAxNzAwLjAyIDEzOTAuOTUgMTgzMi44OCAxMzMwLjU0QzIwOTUuNDYgMTIxMS4wNSAyMzIyLjM4IDEwMTIuMzUgMjQ0Mi4zIDc0NS42MjVDMjQ5OC45MiA2MTkuODcgMjUzMS40NiA0ODIuNDggMjUyOS42OCAzNDQuMTk2QzI1MjguMzQgMjI0LjcwNyAyNTA2Ljk0IDgwLjYwNDIgMjQxMi40MyAtMy4wODI3NkMyMzA0LjEgLTk5LjMwMDMgMjE2MC41NSAtNDIuNDY0OCAyMDU5LjM1IDM0LjUwOTNDMTk1Mi4zNSAxMTUuOTU4IDE4NjIuNzUgMjE5Ljc4NCAxNzkyLjc1IDMzNC4zNUMxNDU3Ljk1IDg4MS4yMjQgMTU4MS40NCAxNTg2LjA3IDE3NjQuMjIgMjE2My44M0MxOTQ2LjU2IDI3MzkuMzQgMjI0Ny40OCAzMjc2LjgyIDI2NDMuOCAzNzMxLjVDMjY5Mi40IDM3ODcuNDQgMjc0Mi43NyAzODQyLjA0IDI3OTQuNDkgMzg5NS4zQzI4MDYuOTcgMzkwNy44MyAyODIzLjkxIDM4ODkuNDggMjgxMy4yMSAzODc2LjVDMjI3OS4xMyAzMTk2LjcxIDE3MDkuODMgMjU0NC42NyAxMTA3LjEgMTkyNC44NUM1MDguMzc3IDEzMDkuNSAtMTIyLjg4OSA3MjQuNTkxIC03ODIuNjg2IDE3NS4wMzJDLTEwOTkuNjYgLTg5LjAwNzMgLTE0MzAuODkgLTMzNi4wNDEgLTE3NDMuNDEgLTYwNS4wMDJDLTE4OTEuNDEgLTczMi41NDcgLTIwMzQuMDcgLTg2Ni44MDQgLTIxNjMuMzYgLTEwMTMuNTlDLTIyMzAuMjMgLTEwODkuNjcgLTIyOTMuNTMgLTExNjkuMzMgLTIzNTEuNDkgLTEyNTIuNTdDLTIzNzcuMzUgLTEyOTAuMTYgLTI0MDIuNzYgLTEzMjguMiAtMjQyNi4zOCAtMTM2Ny4xNEMtMjQzOC40MiAtMTM4Ni44MyAtMjQ1MC4wMSAtMTQwNi41MiAtMjQ2MS4xNiAtMTQyNi4yMUMtMjQ3OC4xIC0xNDU1Ljc0IC0yNDc3LjY1IC0xNDY5LjE3IC0yNDYyLjk0IC0xNDk5LjE1Qy0yMzgxLjggLTE2NjIuMDUgLTIxNTUuNzggLTE2OTIuNDkgLTE5OTUuNzMgLTE3MDguNkMtMTc4My41MyAtMTcyOS42MyAtMTU2OS41NCAtMTcxOC40NCAtMTM1OS41NiAtMTY4MS4zQy05MzYuMDQ1IC0xNjA2LjU2IC01MzUuMjYyIC0xNDM0LjcxIC0xNTcuNjYyIC0xMjMyLjg4QzU3OC44MTUgLTgzOS45NTIgMTI0Ni42NCAtMzEwLjk3OSAyMDQyLjQxIC0zNi4xOTk1QzIyMzEuNDMgMjkuMTM4OSAyNDI1LjggNzguODE0IDI2MjQuMTkgMTA1LjIxOEMyNzIzLjE2IDExOC42NDQgMjgyMi41NyAxMjYuMjUxIDI5MjIuNDMgMTI3LjU5NEMyOTYzLjg5IDEyOC4wNDIgMjk4NC40IDEzNi45OTIgMzAwNC45MSA5OS40MDAxQzMwMjQuOTcgNjIuNzAzMSAzMDM2LjEyIDIxLjUzMSAzMDM5LjI0IC0yMC41MzYxQzMwNTIuNjEgLTE4Ny4wMTUgMjk1Mi4zIC0zNDQuOTkxIDI4MjguODEgLTQ0Ny45MjFDMjcwNi42NiAtNTQ5LjUwOSAyNTUzLjc1IC02MDcuMjQgMjM5OC4xNiAtNjMwLjUxMUMyMDE4LjMzIC02ODYuODk5IDE2NjMuMDIgLTUzMi41MDMgMTMzNC4wMiAtMzU3Ljk2OUMxMjQyLjE4IC0zMDkuMTg5IDExNTEuMjMgLTI1OS4wNjYgMTA1OS40IC0yMTAuNzM0Qzk3Mi45MSAtMTY1LjA4NiA4MzguMjc2IC02Ni42MzExIDc0MC4xOTggLTEyNy45NDJDNjY3LjA4NSAtMTczLjU4OSA2NTAuMTQ0IC0yNzcuNDE1IDY0MC4zMzcgLTM1Ni4xNzlDNjI2LjA3MSAtNDcyLjA4OCA2MTcuMTU1IC01ODguODkxIDYwOS41NzYgLTcwNS4yNDhDNTc5LjcwNyAtMTE2OC44OCA1OTMuNTI3IC0xNjM1LjIgNjUxLjAzNiAtMjA5Ni4xNUM2NjUuNzQ4IC0yMjE2LjA5IDY4NC4wMjYgLTIzMzYuMDIgNzA0Ljk3OSAtMjQ1NS4wN0M3MjEuOTIgLTI1NTEuMjggNzMzLjUxMSAtMjY1NS4xMSA3NzMuNjM0IC0yNzQ1LjUxQzgxNC4yMDIgLTI4MzUuOTEgODk0Ljg5NCAtMjg5NC41MyA5OTYuMDkzIC0yODU4LjI4QzEwOTMuMjggLTI4MjMuMzggMTE2Ni4zOSAtMjczNC4zMiAxMjM0LjYgLTI2NjAuNDhDMTcyMS40MiAtMjEzMS45NSAyMDUwLjg4IC0xNDUzLjk1IDI2MzQuNDQgLTEwMTguMDdDMjc4Ny4zNSAtOTAzLjk0OCAyOTYzLjg5IC03OTAuNzI1IDMxNTYuMDQgLTc2NS4yMTZDMzMxMi45NiAtNzQ0LjE4MiAzNDkzLjk2IC03OTcuODg1IDM1NzcuNzcgLTk0Mi40MzVDMzYyNS45MiAtMTAyNS42NyAzNjI3LjcgLTExMjMuNjggMzYxNy40NSAtMTIxNi43N0MzNjA2LjMxIC0xMzE4LjggMzU4NS44IC0xNDIwLjM5IDM1NjMuMDYgLTE1MjAuNjRDMzUxNy4xNCAtMTcyMi4wMiAzNDUzLjM5IC0xOTE4LjkzIDMzNzMuMTUgLTIxMDguNjhDMzI5Mi4wMSAtMjI5OS43NyAzMTkzLjkzIC0yNDgzLjI2IDMwODAuMjUgLTI2NTYuOUMzMDc3LjEzIC0yNjYxLjgyIDMwNzAuODkgLTI2NjQuOTUgMzA2NS4wOSAtMjY2My4xNkMyNjg5LjcyIC0yNTMwLjI1IDI1NTYuODcgLTIxMTkuNDIgMjM2OC43NCAtMTgwNy41QzIyNjMuMDggLTE2MzIuMDcgMjEyMS4zMSAtMTQ1NC44NSAxOTI5LjYyIC0xMzcwLjcyQzE3MjcuNjcgLTEyODEuNjYgMTUxMSAtMTM0My44NiAxMzYxLjY2IC0xNTAwLjVDMTE2OS45NiAtMTcwMS44OCAxMTI3LjYxIC0xOTg3Ljg1IDEwOTAuMTYgLTIyNTEuNDRDMTA4My40NyAtMjI0Ni41MiAxMDc3LjIzIC0yMjQxLjE1IDEwNzAuNTQgLTIyMzYuMjNDMTQwOC4wMiAtMjA4OC4xIDE1NDguNDUgLTE3MTYuNjUgMTY4Ny4xIC0xNDAxLjU5QzE3MjMuNjUgLTEzMTguMzYgMTc2MS4xIC0xMjM1LjU2IDE4MDMuMDEgLTExNTUuMDFDMTg1NS42MSAtMTA1My44NyAxOTE1LjggLTk1Ny4yMDMgMTk2OS4yOSAtODU2LjA2M0MyMDY4LjI2IC02NjguNTUxIDIxNDUuODMgLTQ1MC4xNTkgMjA4MS42NCAtMjM3LjU4NUMyMDIwLjU2IC0zNS43NTIgMTgzNi40NCA0My4wMTIyIDE2NjIuMTMgMTI2LjY5OUMxNTgzLjIyIDE2NC43MzkgMTUwNC4zMSAyMDYuMzU4IDE0NDAuMTIgMjY2Ljc3NEMxMzY5LjY4IDMzMy4wMDggMTMyMi40MiA0MTguOTMyIDEyODQuMDggNTA2LjY0N0MxMjA1LjE4IDY4Ny44OTQgMTE1MS42OCA5MDEuODEgOTc0LjI0OCAxMDE0LjE0Qzg3My45NDEgMTA3Ny42OSA3NjguMjg0IDEwNjkuNjMgNjYzLjA3MyAxMDIxLjc1QzU3My45MTEgOTgxLjQ3IDQ5MS40MzYgOTM0LjkyNyAzOTUuMTQyIDkxMi41NTFDNDIuOTUyMSA4MzEuNTQ5IC0zNzQuMzI1IDk5Ny41OCAtNTI0LjU2MyAxMzQwLjM4Qy02MTEuNDk2IDE1MzkuMDggLTU2Mi45MDMgMTc1OS4yNyAtNDcxLjA2NiAxOTQ3LjIzQy0zODcuMjU0IDIxMTguNjMgLTI2NC42NTYgMjI2OS44OSAtMTIwLjIxNCAyMzkzLjg1QzIwMC4zMjMgMjY2OC42MyA2MTQuNDggMjc5Ny41MiAxMDMxLjc2IDI4MTEuODRDMTI1NC4yMiAyODE5LjQ1IDE0ODEuNTggMjc5OC40MiAxNjk4LjY5IDI3NDkuMTlDMTg3MS42NiAyNzA5LjgxIDIwNDUuMDggMjY0Ni4yNiAyMTg2LjQgMjUzNS43MkMyMzI2LjM5IDI0MjYuNTIgMjQxOC4yMiAyMjcwLjc5IDI0MjguOTIgMjA5MS4zM0MyNDQyLjMgMTg3Mi45NCAyMzQ5LjEyIDE2NjEuNzEgMjI0OC4zNyAxNDczLjc1QzIxNDEuODIgMTI3NS4wNSAyMDE2LjU1IDEwNzUuNDUgMTk4NC40NSA4NDguMTA3QzE5NTUuMDMgNjQxLjM1MSAyMDIxLjAxIDQ0My4wOTkgMjExOC42NCAyNjMuMTk0QzIyMTMuNiA4Ny43NjQ2IDIzMzMuNTIgLTcyLjAwMTUgMjQzNC4yNyAtMjQzLjg1MUMyNTQ1LjI4IC00MzMuMTUzIDI2MTIuNiAtNjM2LjMyOSAyNjY4Ljc3IC04NDguMDA4QzI3NjkuMDggLTEyMjcuOTYgMjg4NS40MyAtMTcxMS43MyAzMjkxLjEyIC0xODc2LjQyQzM1MTkuODIgLTE5NjkuNSAzNzcwLjgxIC0xOTA3LjMgMzk5NC42MSAtMTgzMS4yMkM0MTkyLjEgLTE3NjQuMDkgNDM5MC45MyAtMTY5MS41OSA0NTc3LjcyIC0xNTk3LjYxQzQ3NTQuMjYgLTE1MDkgNDkyMS44OSAtMTM5NS43OCA1MDQ2LjI3IC0xMjQwLjA0QzUwNjIuNzYgLTEyMTkuNDUgNTA4OC4xOCAtMTE5OC44NyA1MDc3LjQ4IC0xMTczLjM2QzUwNjkuOSAtMTE1NS40NiA1MDU1LjYzIC0xMTM4LjQ1IDUwNDQuNDkgLTExMjIuNzlDNTAxNS4wNiAtMTA4MS42MSA0OTgxLjYzIC0xMDQzLjU4IDQ5NDQuNjIgLTEwMDguNjdDNDg3NS41MiAtOTQyLjg4MyA0Nzk1LjcyIC04ODkuNjI3IDQ3MTEuNDcgLTg0Ni42NjVDNDUzNi43MSAtNzU3LjE2IDQzNDEuODkgLTcwOS43MjMgNDE0Ny45NiAtNjg3LjM0N0MzOTI1LjA2IC02NjEuMzkgMzY5OS40OCAtNjYyLjczMyAzNDc2LjEzIC02ODYuODk5QzMwMTguNzMgLTczNi41NzQgMjU3NC43IC04ODIuOTE1IDIxNjAuNTUgLTEwODAuNzJDMTk1NS4wMyAtMTE3OC43MyAxNzU2LjIgLTEyOTAuNjEgMTU2My42MSAtMTQxMS44OUMxMzc3LjI2IC0xNTI5LjU5IDExOTYuMjYgLTE2NTUuMzQgMTAwNi4zNSAtMTc2Ny4yMkM4MjIuMjI3IC0xODc1LjUyIDYyOC4zIC0xOTcxLjI5IDQyMC45OTkgLTIwMjcuMjNDMjQ3LjU3OSAtMjA3NC4yMiAtMC43MzcwNjEgLTIxMDguMjMgLTk3LjQ3NzggLTE5MTIuMjJDLTEyOS4xMyAtMTg0OC4yMiAtMTI2LjQ1NSAtMTc3Mi4xNCAtODQuNTQ5MSAtMTcxMy41MkMtNDkuNzc2MSAtMTY2NC43NCA1LjUwNDE1IC0xNjM3LjQ0IDYwLjc4NDcgLTE2MTcuNzVDMTk2LjMxMSAtMTU2OS40MiAzODEuMzIyIC0xNTYwLjQ3IDQ1Ny4xMDkgLTE0MTcuNzFDNTM5LjU4NCAtMTI2Mi40MSA0NzAuNDgzIC0xMDcwLjQzIDU0NC45MzQgLTkxMi4wMDRDNTU5LjE5OSAtODgxLjU3MiA1NzMuMDIgLTg1Mi4wMzUgNjA3LjM0NyAtODQ1Ljc3QzY0My45MDMgLTgzOS4wNTcgNjgxLjc5NyAtODQzLjA4NSA3MTcuOTA3IC04NTAuNjkzQzc5Ni4zNyAtODY2LjgwNCA4ODIuNDExIC05MTMuNzk0IDk2My45OTQgLTg5OS40NzNDMTA3NC4xMSAtODgwLjIyOSAxMDY1LjY0IC03NTMuNTggMTA5My43MiAtNjcxLjY4M0MxMTE2LjAyIC02MDcuMjQgMTE3OS4zMiAtNTM2Ljk3OSAxMjUyLjg4IC01NjUuNjJDMTI2NC4wMiAtNTcwLjA5NSAxMjY2LjcgLTU4OC40NDQgMTI1Mi44OCAtNTkxLjU3NkM5MTcuNjMgLTY2Ny42NTYgNTY4LjExNSAtNjQ5LjMwNyAyMjYuNjI2IC02NDcuMDdDLTEzNC4wMzQgLTY0NC4zODQgLTQ5NC4yNDggLTY0MC44MDQgLTg1NC45MDcgLTYzNS44ODFDLTEyMTUuNTcgLTYzMC45NTkgLTE1NzUuNzggLTYyNS4xNDEgLTE5MzYuNDQgLTYxOC40MjhDLTIwNjYuNjIgLTYxNS43NDMgLTIyMDMuNDggLTYyMy4zNTEgLTIzMjguNzUgLTU4MC44MzZDLTIzNzYuMDEgLTU2NS4xNzMgLTI0MjIuMzcgLTU0MS45MDEgLTI0NTcuMTUgLTUwNS4yMDRDLTI0NzguNTQgLTQ4Mi44MjggLTI1MTkuNTYgLTQyNy4zMzUgLTI1MDguNDEgLTM5NC4yMTlDLTI1MDAuODQgLTM3MS44NDIgLTI0NjIuNSAtMzQ0Ljk5MSAtMjQ0NS41NSAtMzI4LjQzM0MtMjQxOC44MSAtMzAyLjQ3NiAtMjM5MS4xNyAtMjc3Ljg2MiAtMjM2Mi42MyAtMjUzLjY5NkMtMjMxMS44MSAtMjExLjE4MSAtMjI1Ny44NyAtMTcxLjM1MiAtMjIwMi4xNCAtMTM1LjEwMkMtMjA4NS4zNCAtNTguNTc1NyAtMTk2MC4wNyAzLjYzMDEzIC0xODMwLjc4IDU1LjU0MjdDLTE1NTUuNzIgMTY2LjA4MSAtMTI2NC4xNiAyMjguMjg3IC05NzIuNjAxIDI3My45MzRDLTI4Mi4wNDMgMzgyLjIzNSA0MjAuMTA3IDM5Mi41MjggMTExNi45MSAzNTQuOTM2QzE0NjkuOTkgMzM1LjY5MyAxODIyLjYyIDMwNC4zNjYgMjE3NC4zNyAyNjcuMjIxQzIzMTAuNzggMjUyLjkwMSAyNDQ3LjIgMjMzLjIxIDI1ODQuNTEgMjM4LjU4QzI3MDAuODcgMjQzLjA1NSAyODI1LjY5IDI2Mi43NDYgMjkyMi40MyAzMzEuNjY1QzI5NzAuMTQgMzY1LjY3NyAzMDA1LjggNDEwLjg3NyAzMDI5Ljg3IDQ2My42ODVDMzAzMC43NyA0NTguMzE0IDMwMzEuMjEgNDUyLjk0NCAzMDMyLjEgNDQ3LjU3M0MyODkxLjIzIDU2MC43OTcgMjcyMi4yNyA2MjYuNTgzIDI1NDguODUgNjcwLjg4OEMyMzY1LjE3IDcxNy44NzggMjE3Ni4xNSA3NDcuNDE1IDE5ODguMDIgNzcxLjU4MUMxNTk2LjE1IDgyMS43MDQgMTE5OS4zOCA4MzMuNzg3IDgwNS4yODYgODA4LjcyNUM2MDguNjg0IDc5Ni4xOTUgNDE0Ljc1NyA3NjkuMzQzIDIxOS40OTMgNzQzLjM4N0MxNTMuOTU5IDczNC44ODQgODEuNzM3OCA3MzUuMzMxIDMzLjE0NDUgNzg3LjY5MkMtMi45NjU4MiA4MjYuMTc5IC05LjIwNzI4IDg4MC4zMjkgLTQuNzQ5MjcgOTMwLjg5OUMxLjQ5MjE5IDk5OS4zNyAyMi44OTA5IDEwNjUuMTYgMzguOTQwMiAxMTMxLjM5QzU5LjAwMTUgMTIxNS41MiA3NS40OTYzIDEzMTcuNTYgLTI3LjkzMTQgMTM0OC40NEMtMTA1Ljk0OCAxMzcyLjE2IC0xOTcuNzg1IDEzNTcuMzkgLTI3Ny41ODQgMTM1NC43Qy0zODAuMTIxIDEzNTEuNTcgLTQ4Mi4yMTEgMTM0OC40NCAtNTg0Ljc0NyAxMzQ1LjMxQy0xMDQxLjI2IDEzMzAuOTkgLTE0OTguMjEgMTMxNy4xMSAtMTk1NC43MiAxMzAyLjc5Qy0xOTY3LjY1IDEzMDIuMzQgLTE5NzMuNDQgMTMyMS41OSAtMTk2MS40MSAxMzI3Ljg1Qy0xNTIyLjI4IDE1NTguNzggLTEwODMuMTYgMTc4OS4yNSAtNjQ0LjA0IDIwMjAuMTdDLTQ0Mi41MzQgMjEyNi4yNCAtMjQyLjgxMiAyMjQyLjE0IC0yOS43MTQ2IDIzMjMuNTlDMTY0LjIxMiAyMzk3LjQ0IDM3OS4wOTMgMjQzNi44MiA1ODAuNTk4IDIzNjkuMjRDNzY1LjE2MyAyMzA3LjQ4IDkxNC41MDkgMjE3Mi43OCAxMDQ2LjAyIDIwMzMuMTVDMTE4My43OCAxODg3LjI2IDEzMDcuNzEgMTcyNy45NCAxNDE2LjQ5IDE1NTguNzhDMTYzNS4zOCAxMjE3Ljc2IDE3OTEuODYgODM1LjEyOSAxODcxLjY2IDQzNy4yODFDMTk2My41IC0xOS4xOTM2IDE5NTcuMjYgLTQ4Ni44NTYgMTk2Ny4wNiAtOTUwLjQ5MUMxOTcxLjk3IC0xMTg0LjEgMTk4MS4zMyAtMTQxOC42IDIwMDkuODYgLTE2NTAuODdDMjAyNC41NyAtMTc3Mi4xNCAyMDQ0LjY0IC0xODkyLjk4IDIwNzIuMjggLTIwMTIuMDJDMjA5NS4wMSAtMjExMC4wMiAyMTI0Ljg4IC0yMjA4LjkzIDIxNzkuMjcgLTIyOTQuNEMyMjM0LjEgLTIzNzkuODggMjMxNC4zNSAtMjQ0NS4yMiAyNDE1LjEgLTI0NjUuMzZDMjUwOC43MiAtMjQ4NC4xNSAyNjAzLjY4IC0yNDU3Ljc1IDI2NjIuNTMgLTIzNzkuODhDMjc0Ni4zNCAtMjI2OC40NSAyNzQ5LjkxIC0yMTAwLjYzIDI4NjIuNyAtMjAxMC4yM0MzMDAwLjkgLTE4OTkuMjQgMzE5NC4zOCAtMjAwOS4zMyAzMzExLjYzIC0yMDk4Ljg0QzM0NDcuNiAtMjIwMi42NiAzNTgwIC0yMzU5Ljc0IDM3NTUuMjEgLTIzOTMuNzVDMzc5Ny41NiAtMjQwMS44MSAzODQzLjkyIC0yNDAyLjI2IDM4ODQuMDQgLTIzODUuN0MzOTQyLjQ1IC0yMzYxLjUzIDM5NjEuNjIgLTIzMDcuODMgMzk2Mi41MSAtMjI0OC4zMUMzOTYzLjg0IC0yMTMwLjYxIDM5NDkuMTMgLTIwMTAuNjcgMzkzNy45OSAtMTg5My40MkMzOTI3LjI5IC0xNzgzLjc4IDM5MjUuOTUgLTE2NTguMDMgMzg2OS4zMyAtMTU2MC40N0MzODEyLjcyIC0xNDYyLjQ2IDM3MDEuMjYgLTE0MjQuNDIgMzYwMS44NSAtMTM4NS40OEMzNDkwLjQgLTEzNDEuNjMgMzM3OC41IC0xMjk3Ljc3IDMyNjcuMDQgLTEyNTMuOTFDMzE2My4xNyAtMTIxMy4xOSAzMDU3LjUxIC0xMTYzLjUxIDI5NDYuMDYgLTExNDYuOTVDMjgyNC4zNiAtMTEyOC42MSAyNzA4Ljg5IC0xMTY3LjU0IDI2MDAuNTYgLTEyMjAuMzVDMjUwNC43MSAtMTI2Ny4zNCAyNDEyLjQzIC0xMzIxLjk0IDIzMjMuMjcgLTEzODAuMTFDMTk2Mi42MSAtMTYxNS45NiAxNjUzLjY2IC0xOTIwLjcyIDEzMDQuMTUgLTIxNzEuNzhDOTY4LjQ1MiAtMjQxMi41NSA1NzMuNDY1IC0yNjE2LjE3IDE1MS43MyAtMjYxOS43NUMtMjUuMjU2NiAtMjYyMS4xIC0yMzEuMjIgLTI1OTkuMTcgLTMzOS41NTIgLTI0NDAuNzRDLTQzMS4zODkgLTIzMDYuNDkgLTQzNi43MzkgLTIxMjkuNzIgLTQ0OS42NjcgLTE5NzMuMDhDLTQ2Ny45NDUgLTE3NTQuMjQgLTUzMS42OTYgLTE1NDcuOTMgLTU3Mi43MSAtMTMzMy4xMkMtNjA3LjQ4MyAtMTE0OC43NCAtNjEwLjE1OCAtOTY0LjgxMSAtNTQ2Ljg1MyAtNzg2LjI1Qy00MzYuMjkzIC00NzMuODc4IC0xNjcuMDI0IC0yMTguMzQyIDE1Mi42MjEgLTEzMS45N0MzMjkuMTYyIC04NC4wODQ3IDUwNi4xNDggLTEwNS4xMTggNjg0LjQ3MiAtMTMwLjYyN0M4NzQuMzg2IC0xNTcuOTI2IDEwOTEuOTQgLTE5Ni40MTMgMTI2OC45MyAtOTcuOTU3OEMxNDUyLjYgNC41MjUxNSAxNTIxLjcgMjIzLjM2NCAxNTA5LjIyIDQyMy40MDdDMTUwMS42NCA1NDIuNDQ5IDE0NjkuMSA2NTguMzU3IDE0MjkuODYgNzcwLjIzOEMxNDAwIDg1Ni4xNjMgMTMzMS4zNCA5NjUuMzU5IDEzODIuNjEgMTA1NS4zMUMxNDAyLjIyIDEwODkuMzIgMTQzMi4wOSAxMTE3LjA3IDE0NTguODQgMTE0NC44MkMxNDk2LjI5IDExODMuNzUgMTUzMy43NCAxMjIyLjI0IDE1NzIuOTcgMTI1OS4zOEMxNjQxLjYyIDEzMjMuODMgMTcxNS4xOCAxMzg0LjI0IDE3OTcuNjYgMTQzMC4zNEMxOTc2Ljg3IDE1MzAuMTMgMjE2Ny4yMyAxNTI2LjU1IDIzNTYuNyAxNDU4LjUzQzI0NTYuNTYgMTQyMi43MyAyNTUxLjk3IDEzNzYuMTkgMjY0OS4xNSAxMzM0LjEyQzI3NTIuNTggMTI4OS4zNyAyODU3LjM1IDEyNDguNjQgMjk2My44OSAxMjExLjk0QzMxNjkuNDEgMTE0MC43OSAzMzgwLjI4IDEwODQuODUgMzU5My4zOCAxMDQzLjY4QzQwMjQuMDMgOTYwLjg4MyA0NDY2LjcyIDkzOC45NTUgNDkwMy4xNiA5ODAuMTI3QzUxMTguNDkgMTAwMC4yNyA1MzMyLjAzIDEwMzYuMDcgNTU0Mi40NiAxMDg2LjY0QzU1NTkuNCAxMDkwLjY3IDU1NjYuNTMgMTA2NC43MSA1NTQ5LjU5IDEwNjAuNjhDNDcwNS42NyA4NTcuNTA1IDM4MDcuMzcgODk4LjIzIDI5ODQuODUgMTE3Ni4xNEMyODgxLjg3IDEyMTEuMDUgMjc4MC4yMiAxMjQ5LjU0IDI2NzkuOTEgMTI5MS42QzI1NzguNzEgMTMzNC4xMiAyNDgwLjE5IDEzODIuOSAyMzc4LjEgMTQyMS44M0MyMjc0LjIzIDE0NjEuMjEgMjE2My42NyAxNDkwLjc1IDIwNTEuNzcgMTQ4Mi43QzE5NDkuMjMgMTQ3NS4wOSAxODUyLjQ5IDE0MzUuMjYgMTc2Ni45IDEzNzkuNzdDMTY4MS4zIDEzMjQuNzIgMTYwNS45NiAxMjU1LjM1IDE1MzQuMTggMTE4My43NUMxNTAyLjk4IDExNTIuNDIgMTQ3MS43NyAxMTIwLjY1IDE0NDEuOSAxMDg3Ljk4QzE0MjMuNjIgMTA2Ny44NCAxNDA1LjM1IDEwNDcuMjYgMTM5Ni40MyAxMDIwLjg1QzEzODIuNjEgOTgwLjU3NCAxMzk1LjU0IDk0MC4yOTcgMTQwOS4zNiA5MDIuMjU4QzE0ODIuMDIgNzAyLjY2MiAxNTYwLjA0IDQ5Ni4zNTQgMTUzMS4wNiAyNzkuNzUyQzE1MDcuNDQgMTAzLjg3NSAxNDE0LjI2IC02Mi4xNTU4IDEyNDguODcgLTEzNy4zNEMxMDgyLjU4IC0yMTIuOTcxIDg5Mi4yMTkgLTE4Ni41NjcgNzE3LjkwNyAtMTYxLjk1NEM1MjYuNjU1IC0xMzUuMTAyIDMzOC4wNzggLTEwNi45MDggMTQ4LjYwOSAtMTYwLjYxMUMtMjEuMjQ0NCAtMjA4Ljk0NCAtMTc1Ljk0IC0zMDYuNTA0IC0yOTguMDkyIC00MzQuMDQ4Qy00MjAuMjQ0IC01NjEuNTkzIC01MTAuNzQzIC03MjAuNDYzIC01NTAuNDIgLTg5My4yMDhDLTU5OS4wMTMgLTExMDMuNTQgLTU1My4wOTUgLTEzMTMuODggLTUwMy4xNjQgLTE1MTkuMjlDLTQ3Ny4zMDcgLTE2MjQuOTEgLTQ1MS4wMDQgLTE3MzAuMDggLTQzNi43MzkgLTE4MzcuOTNDLTQyNC43MDIgLTE5MjUuNjQgLTQyMC42ODkgLTIwMTQuMjUgLTQxMS43NzMgLTIxMDEuOTdDLTM5Mi42MDQgLTIyODIuMzIgLTM0NC45MDIgLTI0NzkuMjMgLTE1Ni43NyAtMjU0OS45NEMtNTYuMDE3MyAtMjU4Ny41MyA1OC41NTU0IC0yNTkzLjggMTY1LjU1IC0yNTkyLjAxQzI3Mi45OSAtMjU4OS43NyAzNzkuOTg0IC0yNTc0LjExIDQ4NC4zMDMgLTI1NDguMTVDNjk0LjI4IC0yNDk1LjM0IDg5Mi4yMTkgLTI0MDEuODEgMTA3Ni43OCAtMjI4OS40OEMxNDQzLjY5IC0yMDY2LjYxIDE3NTMuNTIgLTE3NjQuNTQgMjA5NS40NiAtMTUwNy4yMUMyMjY0Ljg3IC0xMzc5LjY3IDI0NDQuOTcgLTEyNTYuMTUgMjY0MC4yNCAtMTE3MS41N0MyNzMzLjQxIC0xMTMxLjI5IDI4MzEuOTMgLTExMDUuNzggMjkzNC4wMiAtMTExNy44NkMzMDQxLjQ2IC0xMTMwLjg0IDMxNDIuNjYgLTExNzYuMDQgMzI0Mi41MyAtMTIxNS40MkMzMzUzLjk4IC0xMjU5LjI4IDM0NjUuODggLTEzMDMuMTQgMzU3Ny4zMyAtMTM0N0MzNjYzLjgxIC0xMzgxLjAxIDM3NTguMzMgLTE0MTAuOTkgMzgyOS42NiAtMTQ3Mi43NUMzOTA0LjU1IC0xNTM3LjE5IDM5MzEuMyAtMTYzMS42MiAzOTQ0LjY3IC0xNzI2LjA1QzM5NjAuNzIgLTE4MzguODMgMzk2OS42NCAtMTk1Mi45NCAzOTc3LjY2IC0yMDY2LjE3QzM5ODEuNjggLTIxMjIuMTEgMzk4Ni41OCAtMjE3OC4wNSAzOTg3LjQ3IC0yMjMzLjk5QzM5ODguMzYgLTIyNzcuODUgMzk4My45MSAtMjMyMi42IDM5NTguMDUgLTIzNTkuM0MzOTE3LjkzIC0yNDE2LjU4IDM4NDIuNTggLTI0MzAuOSAzNzc3LjA1IC0yNDI0LjE5QzM2MDguOTggLTI0MDcuMTggMzQ3NC4zNSAtMjI2OCAzMzUwLjQxIC0yMTY1LjUyQzMyMjYuNDggLTIwNjMuMDMgMjk4Ni42MyAtMTg5MS42MyAyODQ3LjA5IC0yMDYwLjhDMjc1NC44MSAtMjE3Mi42OCAyNzU1LjcgLTIzNDAuNSAyNjQyLjAyIC0yNDM4Ljk1QzI1MjEuNjUgLTI1NDIuNzggMjMzMy41MiAtMjQ5OS44MiAyMjI2LjUzIC0yMzk3LjMzQzIwODMuODcgLTIyNjAuODQgMjA0NC42NCAtMjA0NS4xMyAyMDExLjY1IC0xODU4Ljk2QzE5MzAuNTEgLTE0MDAuNyAxOTQxLjIxIC05MzMuOTMyIDE5MjguNzMgLTQ3MC4yOThDMTkxNi42OSAtMTguMjk4NiAxODc1LjY3IDQzMS40NjMgMTcyNC45OSA4NjAuMTlDMTU4Ny4yNCAxMjUzLjEyIDEzNzMuNjkgMTYxOS4xOSAxMDk5LjUyIDE5MzEuNTZDOTY2LjIyMyAyMDgyLjgzIDgxNy4zMjMgMjIzNy4yMiA2MzAuNTI5IDIzMjAuMDFDNDE3LjQzMiAyNDEzLjk5IDE4NS42MTEgMjM3Ny43NCAtMjUuMjU2NiAyMjk3LjE5Qy0yNDYuMzc4IDIyMTMuMDYgLTQ1My42NzkgMjA5MC44OCAtNjYyLjc2NCAxOTgwLjc5Qy04NzkuODczIDE4NjYuNjcgLTEwOTYuOTggMTc1Mi41NSAtMTMxNC4wOSAxNjM4LjQzQy0xNTI2LjMgMTUyNyAtMTczOC41IDE0MTUuNTcgLTE5NTAuNzEgMTMwNC4xM0MtMTk1Mi45NCAxMzEyLjY0IC0xOTU1LjE2IDEzMjAuNjkgLTE5NTcuMzkgMTMyOS4yQy0xNTQyLjM1IDEzNDIuMTcgLTExMjYuODUgMTM1NC43IC03MTEuODAzIDEzNjcuNjhDLTUxMy40MTggMTM3My45NSAtMzEyLjgwMyAxMzg5LjE2IC0xMTQuNDE4IDEzODUuNThDLTU3LjgwMDUgMTM4NC42OSA3LjczMzQgMTM3Ni42MyA0Ny44NTYyIDEzMzEuODhDOTIuNDM3MyAxMjgyLjY1IDgxLjI5MTcgMTIxMS41IDY4LjM2MzMgMTE1MS45OEM0My44NDQgMTAzNS42MiAtNjAuOTIxMSA3ODEuNDI3IDE0MC4xMzkgNzY1Ljc2M0MxODMuMzgyIDc2Mi4xODMgMjI3LjUxNyA3NzEuNTgxIDI2OS44NjkgNzc4LjI5NEMzMTguOTA4IDc4NS45MDIgMzY3Ljk0NyA3OTIuNjE1IDQxNi45ODYgNzk4Ljg4QzUxOC4xODUgODExLjg1OCA2MTkuODMgODIyLjE1MSA3MjEuOTIgODI5Ljc1OUMxMTE4LjY5IDg2MC4xOTEgMTUxOC4xMyA4NTIuNTgzIDE5MTMuMTIgODA2LjkzNUMyMTIzLjEgNzgyLjc2OSAyMzMzLjk3IDc1MS40NDIgMjUzOS40OCA2OTkuOTc3QzI3MjIuMjcgNjU0LjMzIDI5MDAuMTQgNTg1LjQxMSAzMDQ4LjE1IDQ2Ni4zN0MzMDUzLjA2IDQ2Mi4zNDIgMzA1Mi42MSA0NTUuMTgyIDMwNTAuMzggNDUwLjI1OUMyOTU1LjQyIDI0My4wNTUgMjcwNi4yMiAyMDcuMjUzIDI1MDMuMzcgMjExLjI4MUMyMzU5LjgyIDIxNC40MTQgMjIxNi43MiAyMzUuODk1IDIwNzQuNTEgMjUwLjY2M0MxOTAxLjA5IDI2OC41NjQgMTcyNy42NyAyODQuNjc1IDE1NTQuMjUgMjk4LjU0OEM4NjcuMjUzIDM1My41OTQgMTc0LjkxMiAzNzEuOTQyIC01MTEuNjM0IDMwNS43MDlDLTgyNy4yNjcgMjc1LjI3NyAtMTE0NC4yNCAyMzAuNTI1IC0xNDUxLjQgMTUxLjMxM0MtMTcyNS41NyA4MC42MDQyIC0xOTk1LjI5IC0yMS40MzE0IC0yMjI5LjM0IC0xODMuNDM1Qy0yMjg5LjUyIC0yMjUuMDU1IC0yMzQ2LjU5IC0yNzAuMjU1IC0yNDAwLjUzIC0zMTkuOTNDLTI0MjQuNiAtMzQyLjMwNiAtMjQ0OS4xMiAtMzY0LjY4MiAtMjQ3MC45NyAtMzg5LjI5NkMtMjQ4My44OSAtNDAzLjYxNyAtMjQ4NC43OSAtNDA2LjMwMiAtMjQ3OC41NCAtNDI0LjY1Qy0yNDcyLjc1IC00NDAuNzYxIC0yNDY0LjcyIC00NTUuOTc3IC0yNDU0LjQ3IC00NjkuODVDLTIzODQuOTIgLTU2Mi45MzUgLTIyNDQuMDUgLTU4MS43MzEgLTIxMzYuNjEgLTU4Ny4xMDFDLTE5NjUuODYgLTU5NS42MDQgLTE3OTMuNzggLTU5NC4yNjIgLTE2MjMuMDQgLTU5Ny4zOTVDLTE0NDguMjggLTYwMC41MjcgLTEyNzMuNTIgLTYwMy4yMTIgLTEwOTguNzcgLTYwNS44OTdDLTc0Ni41NzYgLTYxMC44MiAtMzk0LjM4NiAtNjE1LjI5NSAtNDIuMTk3MyAtNjE3Ljk4QzEzMi41NiAtNjE5LjMyMyAzMDYuODcxIC02MjAuNjY2IDQ4MS42MjkgLTYyMS41NjFDNjQ4LjM2MSAtNjIyLjQ1NiA4MTUuMDk0IC02MjIuOTAzIDk4MS4zODEgLTYwNy4yNEMxMDY5LjY1IC01OTguNzM3IDExNTcuMDMgLTU4NS4zMTEgMTI0My41MiAtNTY1LjYyQzEyNDMuNTIgLTU3NC4xMjMgMTI0My41MiAtNTgzLjA3MyAxMjQzLjUyIC01OTEuNTc2QzExNjEuOTMgLTU2MC4yNSAxMTE4LjI0IC02NjQuNTIzIDExMDUuMzIgLTcyNi43MjlDMTA5My43MiAtNzgxLjc3NCAxMDg1LjcgLTg0Mi42MzcgMTA0NC42OSAtODg0LjcwNUM5NzMuMzU2IC05NTguNTQ2IDg2Ni44MDggLTkyMS40MDEgNzgyLjU1IC04OTYuNzg4QzczMS4yODIgLTg4MS41NzIgNjY1Ljc0OCAtODU3Ljg1MyA2MTEuODA1IC04NzIuMTc0QzU2MC41MzcgLTg4Ni4wNDcgNTQzLjU5NiAtOTgzLjE2IDUzNi40NjMgLTEwMjguMzZDNTE4LjYzMSAtMTE0Mi45MyA1MzQuNjggLTEyNjIuNDEgNTAwLjc5OCAtMTM3NC4zQzQzNy45MzkgLTE1ODEuMDUgMjE3LjI2NCAtMTU4NC4xOCA0OC4zMDIgLTE2NTAuODdDLTU2LjkwODkgLTE2OTIuNDggLTEzNC4wMzQgLTE3ODkuMTUgLTc0LjI5NTcgLTE5MDQuNjFDNS41MDQzOSAtMjA1OC41NiAxOTcuMjAyIC0yMDUxLjQgMzQyLjA5IC0yMDE5LjE4QzYyNi45NjIgLTE5NTYuMDggODg1Ljk3OCAtMTgxMy4zMiAxMTMwLjczIC0xNjU4LjkyQzEzNzkuNDkgLTE1MDIuMjkgMTYyMS4xMiAtMTMzNS4zNiAxODc5LjI0IC0xMTkzLjk0QzIzOTUuOTMgLTkxMS41NTYgMjk2My40NSAtNzAyLjU2MiAzNTUyLjgxIC02NTIuODg3QzM4MjcuODcgLTYyOS42MTYgNDExMi4zIC02MzguMTE5IDQzODEuNTcgLTcwMS42NjdDNDYxNC4yOCAtNzU2LjcxMyA0ODQ4LjMzIC04NTkuMTk2IDUwMDkuNzEgLTEwNDEuMzRDNTA0Ny42MSAtMTA4NC4zIDUwODEuMDQgLTExMzEuMjkgNTEwOS4xMyAtMTE4MC45N0M1MTExLjM2IC0xMTg0Ljk5IDUxMTEuOCAtMTE5MC44MSA1MTA5LjEzIC0xMTk0LjM5QzQ5NjMuNzkgLTE0MDYuNTIgNDc0Ny4xMyAtMTU0OC4zOCA0NTE3LjU0IC0xNjU0LjQ1QzQ0MDAuMjkgLTE3MDkuMDQgNDI3OS40OCAtMTc1NS4xNCA0MTU4LjIyIC0xNzk5LjQ0QzQwMTEuOTkgLTE4NTMuMTUgMzg2NC40MyAtMTkwNy43NCAzNzEwLjYyIC0xOTM0LjE1QzM1NjYuNjMgLTE5NTguNzYgMzQxNy4yOCAtMTk1Ni45NyAzMjc5Ljk3IC0xOTAxLjkzQzMxNzIuNTMgLTE4NTguNTIgMzA3OC45MSAtMTc4Ni45MSAzMDAyLjIzIC0xNzAwLjU0QzI4MjIuMTMgLTE0OTcuODEgMjczOS4yMSAtMTIzNi45MSAyNjcxLjQ0IC05NzkuMTMyQzI2MzIuMjEgLTgzMS4wMDIgMjU5Ni4xIC02ODEuNTI5IDI1NDIuMTYgLTUzNy40MjZDMjQ5Mi42NyAtNDA0LjUxMiAyNDI0LjQ3IC0yODEuODkgMjM0OS4xMiAtMTYyLjQwMUMyMjEzLjE1IDUyLjg1NzcgMjA1MS43NyAyNjIuNzQ2IDE5NzkuOTkgNTExLjEyMkMxOTQ0Ljc3IDYzMi44NDggMTkzNi4zIDc1OS40OTggMTk1OC41OSA4ODQuMzU3QzE5ODQuMDEgMTAyNi42NyAyMDQ1LjUzIDExNjAuMDMgMjExMS45NSAxMjg3LjEzQzIyNTAuMTUgMTU1MS42MSAyNDQyLjMgMTgzOC4wMyAyMzkxLjAzIDIxNTIuMTlDMjM0Ny43OSAyNDE0Ljg5IDIxMjIuMjEgMjU3OC4yMyAxODg4LjE2IDI2NjQuNjFDMTYxOS43OCAyNzYzLjk2IDEzMTguODYgMjc5NC44NCAxMDM0Ljg4IDI3ODUuODlDNDcxLjgyMSAyNzY4LjQzIC0xMDcuMjg1IDI1MjUuODcgLTQwNC42NCAyMDIzLjMxQy00NzkuOTgyIDE4OTUuNzYgLTUzOS43MiAxNzUxLjY2IC01NDguMTkxIDE2MDEuNzRDLTU1Ny41NTMgMTQ0MC42MyAtNDk1LjEzOSAxMjkyLjk1IC0zODguMTQ1IDExNzQuOEMtMjE1LjYxNyA5ODUuNDk3IDUxLjQyMjYgODk0LjY1IDMwMy4zMDUgOTI1LjA4MkMzNjUuNzE4IDkzMi42ODkgNDI3LjY4NiA5NDcuOTA1IDQ4Ni41MzIgOTcxLjE3N0M1NTIuNTEyIDk5Ny4xMzMgNjEzLjU4OCAxMDM0LjI4IDY3OS41NjggMTA2MC42OEM3OTUuMDMyIDExMDYuNzggOTEyLjI4MSAxMDkyLjkgMTAxMS43IDEwMTcuMjdDMTIyNS42OCA4NTQuMzczIDEyNDAuNCA1NjguNDA1IDEzODguODUgMzYwLjc1NEMxNTM4LjY0IDE1MS4zMTMgMTgyMS4yOSAxMzMuODYgMTk5NS4xNSAtNDUuMTQ5OUMyMTc0LjM3IC0yMjkuOTc3IDIxNDQuNSAtNTE2Ljg0IDIwNTEuNzcgLTczNS42NzlDMTk5Mi40OCAtODc0Ljg1OSAxOTEwLjg5IC0xMDAyLjQgMTgzOS4xMiAtMTEzNC44N0MxNzgwLjcyIC0xMjQzLjE3IDE3MzEuMjMgLTEzNTUuOTUgMTY4MS43NSAtMTQ2OC43MkMxNTg5LjQ2IC0xNjc5LjA2IDE0OTYuNzQgLTE4OTkuNjkgMTMzOS4zNyAtMjA3MC42NEMxMjY1LjgxIC0yMTUwLjMgMTE3OC44NyAtMjIxNS4xOSAxMDc5LjQ2IC0yMjU4LjZDMTA2OC4zMSAtMjI2My41MyAxMDU4LjA2IC0yMjU1LjQ3IDEwNTkuODQgLTIyNDMuMzlDMTA5NC4xNyAtMjAwNC40MSAxMTMxLjE3IC0xNzUwLjIyIDEyNzguNzQgLTE1NTEuNTJDMTM5Ny43NyAtMTM5MC44NSAxNTgyLjc4IC0xMjc4LjA4IDE3ODcuNCAtMTMwNC4wM0MxOTg0LjAxIC0xMzI4LjY1IDIxNDQuOTQgLTE0NjcuMzggMjI2NC40MiAtMTYxNi44NUMyMzk1LjQ5IC0xNzgwLjY1IDI0NzkuMyAtMTk3Mi4xOSAyNTgyLjI4IC0yMTUzLjg4QzI2OTYuNDEgLTIzNTUuMjcgMjg0MC44NSAtMjU1Ni42NSAzMDY3LjMyIC0yNjM2Ljc2QzMwNjIuNDIgLTI2MzkgMzA1Ny4wNyAtMjY0MC43OSAzMDUyLjE2IC0yNjQzLjAzQzMyODcuMTEgLTIyODQuMTEgMzQ1NC43MyAtMTg4Mi42OCAzNTQzLjg5IC0xNDYyLjQ2QzM1ODUuOCAtMTI2NC4yIDM2NTYuMjQgLTk5Ni4xMzggMzQ1OS4xOSAtODU4LjMwMUMzMjc3LjMgLTczMS4yMDQgMzA0OS4wNCAtNzk1LjY0NyAyODcwLjcyIC04OTMuNjU1QzIyMjAuMjggLTEyNTAuMzMgMTg2MC45NiAtMTk0Ni4yMyAxNDAzLjU2IC0yNTAxLjE2QzEzNDUuNjEgLTI1NzEuODcgMTI4NS40MiAtMjY0MC43OSAxMjIzLjAxIC0yNzA3LjAyQzExNjEuNDkgLTI3NzIuMzYgMTA5Ni44NSAtMjg0My4wNyAxMDEyLjU5IC0yODc4LjQyQzk0My40ODcgLTI5MDcuMDYgODY1LjkxNiAtMjkwMC44IDgwOC44NTMgLTI4NDkuMzNDNzU1LjM1NSAtMjgwMC41NSA3MjkuNDk5IC0yNzI2LjcxIDcxMi41NTggLTI2NTcuNzlDNjU5Ljk1MiAtMjQ0Mi45OCA2MzIuNzU4IC0yMjE4LjMzIDYwOC42ODQgLTE5OTguNTlDNTgyLjgyNyAtMTc2Ni4zMyA1NjguMTE1IC0xNTMzLjE3IDU2NC41NDkgLTEyOTkuNTZDNTYwLjk4MiAtMTA2NS45NSA1NjguMTE1IC04MzIuMzQ0IDU4Ni4zOTQgLTU5OS4xODRDNTk0LjQxOCAtNDk3LjE0OSA1OTkuNzY4IC0zOTIuNDI4IDYxOS4zODQgLTI5MS43MzZDNjMyLjMxMiAtMjI1LjUwMiA2NTYuODMyIC0xNTEuMjEzIDcxNC4zNDEgLTExMC4wNDFDNzgzLjg4NyAtNjAuMzY1NyA4NjYuODA4IC04Ni43Njk4IDkzNy4yNDYgLTExOS44ODZDMTAzNS4zMiAtMTY2LjQyOSAxMTMwLjI4IC0yMTkuNjg0IDEyMjUuNjggLTI3MS4xNDlDMTQxNC43MSAtMzczLjE4NSAxNjA1LjUxIC00NzYuMTE1IDE4MTAuNTkgLTU0My42OTJDMjEzMy44IC02NTAuMjAyIDI1MzYuMzYgLTY1Ni45MTUgMjgxMC41NCAtNDI0LjY1QzI5NDYuMDYgLTMwOS42MzYgMzA3Mi4yMyAtOTcuNTEwNSAyOTgwLjgzIDgwLjYwNEMyOTY3LjAxIDEwNy45MDMgMjk0Ni41MSAxMDEuNjM4IDI5MTguNDIgMTAxLjE5QzI4OTQuMzUgMTAwLjc0MyAyODcwLjcyIDEwMC4yOTUgMjg0Ni42NSA5OS40MDAxQzI3OTQuNDkgOTcuMTYyNiAyNzQyLjMzIDkzLjEzNSAyNjkwLjYxIDg3Ljc2NDZDMjU4OC41MiA3Ny4wMjM5IDI0ODYuODggNTkuNTcwNiAyMzg3LjAyIDM2Ljc0NjhDMTU2MS4zOCAtMTQ5Ljg3MSA4NjguNTkxIC02NjguMTAzIDE0OS45NDcgLTEwODguMzNDLTIxOC43MzggLTEzMDQuMDMgLTYwMy40NzEgLTE1MDEuMzkgLTEwMTMuNjIgLTE2MjQuNDZDLTEyMTEuMTEgLTE2ODMuNTMgLTE0MTMuOTUgLTE3MjQuNzEgLTE2MTkuOTIgLTE3MzkuNDhDLTE4MTEuNjEgLTE3NTIuOSAtMjAxNS43OSAtMTc1MC4yMiAtMjIwMy4wMyAtMTcwMi4zM0MtMjI3NS4yNiAtMTY4My45OCAtMjM0Ny40OCAtMTY1NS43OSAtMjQwNi43NyAtMTYwOS42OUMtMjQzMi42MyAtMTU4OS41NSAtMjQ1NS44MSAtMTU2Ni4yOCAtMjQ3NC4wOSAtMTUzOC45OEMtMjQ4Ny40NiAtMTUxOC44NSAtMjUxMy43NiAtMTQ3Ni43OCAtMjUwOS43NSAtMTQ1MS4yN0MtMjUwNi4xOCAtMTQzMS4xMyAtMjQ4NC43OSAtMTQwNS42MiAtMjQ3NC41MyAtMTM4OC4xN0MtMjQ2Mi45NCAtMTM2OC40OCAtMjQ1MC45IC0xMzQ4Ljc5IC0yNDM4Ljg3IC0xMzI5LjU0Qy0yNDEyLjEyIC0xMjg3LjAzIC0yMzg0LjAzIC0xMjQ1LjQxIC0yMzU0LjYxIC0xMjA0LjY4Qy0yMzAwLjY3IC0xMTI5Ljk1IC0yMjQyLjcxIC0xMDU3LjkgLTIxODEuNjQgLTk4OC41M0MtMTkxOC4xNiAtNjkwLjQ3OSAtMTYwMi41MyAtNDQ1LjY4NCAtMTI5Mi4yNSAtMTk5Ljk5M0MtNjEyLjgzMyAzMzQuMzUgMzUuMzczNSA5MDMuNiA2NTEuOTI4IDE1MDYuODZDMTI2NS44MSAyMTA3Ljg5IDE4NDguOTMgMjc0MC42OSAyMzk2LjgyIDM0MDMuMDJDMjUzMS40NiAzNTY1LjQ3IDI2NjMuODYgMzczMC4xNiAyNzk0LjQ5IDM4OTYuMTlDMjgwMC43MyAzODg5LjkzIDI4MDYuOTcgMzg4My42NiAyODEzLjIxIDM4NzcuNEMyNDIxLjc5IDM0NzEuNDkgMjExMC42MiAyOTg5Ljk2IDE5MDAuNjQgMjQ2NS45MUMxNzk2LjMyIDIyMDUuNDUgMTcxNi41MiAxOTM0LjcgMTY2NC4zNiAxNjU4LjU3QzE2MDUuMDcgMTM0My45NiAxNTgyLjc4IDEwMTMuMjQgMTY2Ni41OSA3MDEuMzJDMTczNS4yNCA0NDUuNzgzIDE4NzguNzkgMTg5LjggMjEwMS43IDM4LjUzNzFDMjE2Ni4zNCAtNS4zMjAzMSAyMjQ2LjE0IC00MS4xMjIzIDIzMjUuMDUgLTIwLjA4ODlDMjM5MS40OCAtMi4xODc3NCAyNDM2LjA2IDU2LjQzOCAyNDYxLjkxIDExNi44NTRDMjUxNC45NiAyNDAuMzcgMjUxMi4yOSAzOTAuNzM4IDI0ODYuODggNTIwLjUyQzI0MzIuOTQgNzk3Ljk4NSAyMjU3LjI5IDEwMzYuMDcgMjAyNS45MSAxMTkzLjE1QzE4MDAuMzMgMTM0Ni4yIDE1MTUuMDEgMTQ0Mi44NyAxMjQyLjE4IDE0NDkuMTNDMTEwMy4wOSAxNDUyLjI2IDk1Ny4zMDcgMTQyNC45NyA4NDcuNjM4IDEzMzMuNjdDNzQ0LjY1NiAxMjQ4LjE5IDY4NS44MDkgMTEyMS45OSA2NTQuMTU3IDk5My41NTJDNTg1LjA1NiA3MTIuMDYgNjIwLjcyMSA0MDEuNDc5IDcyNS45MzIgMTMzLjg2Qzc1NC4wMTggNjIuNzAzMSA3ODcuODk5IC01Ljc2NzgyIDgyNi4yMzkgLTcyLjAwMTVDODE3Ljc2OSAtNzQuMjM5IDgwOS43NDQgLTc2LjQ3NjYgODAxLjI3NCAtNzguNzE0NEM3NzYuMzA5IDUxMy44MDcgNjU1Ljk0IDExMDEuNDEgNDQ1LjUxOCAxNjU1Ljg5QzM5MS4xMjkgMTc5OS41NCAzMzAuMDUzIDE5NDAuOTYgMjYzLjYyOCAyMDc5LjI1QzIzNy4zMjUgMjEzNC4yOSAyMTAuNTc3IDIyMTMuNSAxNTYuMTg4IDIyNDcuOTZDODUuNzUgMjI5Mi43MSAzNC4wMzYxIDIyMTkuMzIgOS45NjI0IDIxNjEuMTRDLTQ3LjU0NjkgMjAyMS41MiAtODQuMTAzMyAxODY4LjQ2IC0xMjEuNTUxIDE3MjIuNTdDLTE2MC4zMzcgMTU3MS43NSAtMTkyLjg4MSAxNDE5LjE1IC0yMTkuMTg0IDEyNjYuMDlDLTI2Mi44NzMgMTAxMy42OSAtMjg4LjI4NCA3MTIuNTA4IC01MDYuMjg0IDU0Mi44OTZDLTUxMi41MjYgNTM3Ljk3NCAtNTE5LjIxMyA1MzcuOTc0IC01MjUuMDA5IDU0Mi44OTZDLTgxMy40NDcgNzc5LjYzNiAtMTA3Mi4wMiAxMDUwLjg0IC0xMjk1LjM3IDEzNTAuMjNDLTE0MDguMTYgMTUwMS4wNCAtMTUxMS4xNCAxNjU5LjAyIC0xNjA0Ljc2IDE4MjIuODFDLTE2NTEuNTcgMTkwNC43MSAtMTY5NS43IDE5ODcuOTUgLTE3MzYuNzIgMjA3Mi41M0MtMTc2Ni41OSAyMTMzLjg0IC0xNzkwLjIyIDIxOTguNzMgLTE3OTYuOSAyMjY3LjIxQy0xODAyLjI1IDIzMjQuMDQgLTE3OTQuMjMgMjM4Ny4xNCAtMTc1My42NiAyNDMwLjFDLTE2OTkuNzIgMjQ4Ny4zOSAtMTYxOC4xMyAyNDgxLjU3IC0xNTQ4LjE0IDI0NjUuMDFDLTEzMzQuMTUgMjQxNC40NCAtMTEyMS45NSAyMzUyLjIzIC05MDkuMjk2IDIyOTUuODVDLTQ4My41NDggMjE4Mi42MiAtNTcuODAwNSAyMDY5Ljg1IDM2Ny45NDcgMTk1Ni42MkM1NDQuMDQyIDE5MTAuMDggNzUzLjEyNiAxODI1LjUgOTM2LjM1NCAxODc3LjQxQzExMjEuODEgMTkzMC4yMiAxMTc3LjA5IDIxMzUuNjMgMTE5OC45NCAyMzA1LjY5QzEyMTcuMjEgMjQ0OC45IDEyMTIuMzEgMjYwOC4yMiAxMTQ2Ljc4IDI3MzkuNzlDMTExNS41NyAyODAyLjQ0IDEwNjkuNjUgMjg1Ni41OSAxMDA4LjEzIDI4OTAuNjFDOTE2LjczOCAyOTQxLjE4IDgxMC4xOSAyOTM2LjcgNzEwLjMyOSAyOTE5LjdDMzU1LjQ2NSAyODU4LjM4IDcuMjg3NiAyNzI0LjU4IC0zMDcuODk5IDI1NTIuMjhDLTYyNC40MjQgMjM3OS41MyAtOTE0LjY0NiAyMTU4LjkgLTExNjUuMTkgMTg5OS4zNEMtMTI5Ni4yNiAxNzYzLjI5IC0xNDEwLjgzIDE2MTUuMTYgLTE1MjYuNzQgMTQ2Ni41OUMtMTY0Mi4yMSAxMzE4LjkgLTE3NjUuMjUgMTE3My40NiAtMTkyMy4wNyAxMDY5LjE4Qy0yMDY1LjI4IDk3NS4yMDQgLTIyMzguMjUgOTEyLjk5OCAtMjQxMC4zNCA5MzYuMjdDLTI1NTIuOTkgOTU1LjUxMyAtMjY4OS44NiAxMDM4Ljc1IC0yNzY3LjQzIDExNjAuOTNDLTI4MDYuMjEgMTIyMS4zNCAtMjgyNy4xNyAxMjkwLjI2IC0yODI4LjUgMTM2Mi4zMUMtMjgyOC41IDEzNjkuOTIgLTI4MjIuMjYgMTM3NS4yOSAtMjgxNS4xMyAxMzc1Ljc0Qy0xNzc5LjUyIDE0MjQuMDcgLTg2OS4xNzMgODQ4LjEwNyAyOC42ODY1IDQxNC45MDRDMTQxLjkyMiAzNjAuMzA2IDI1NS42MDMgMzA3LjQ5OSAzNzEuMDY4IDI1Ny44MjRDNDcxLjM3NSAyMTQuODYxIDU4NC42MTEgMTU0Ljg5MyA2OTcuNCAxNjMuODQ0Qzg1MS42NSAxNzYuMzc0IDg0Ni43NDYgMzQ0LjE5NiA4MjQuNDU2IDQ2MC41NTJDODEzLjc1NyA1MTYuNDkyIDc5Ni44MTYgNTcxLjUzOCA3NzMuNjM0IDYyMy40NTFDNzQ4LjY2OCA2NzkuODM5IDcxMS42NjYgNzU0LjEyNyA2NDYuNTc4IDc3MS41ODFDNTc2LjE0IDc5MC4zNzcgNTQxLjgxMyA3MDQuMDA1IDUxNS41MSA2NTQuNzc3QzQ4Ni41MzIgNjAwLjE3OSA0NTkuNzg0IDU0My43OTIgNDM1LjI2NCA0ODYuOTU2QzM4OC45IDM3OC4yMDggMzUxLjQ1MiAyNjYuMzI3IDMxOS4zNTQgMTUyLjY1NkMyNTUuMTU3IC03NS4xMzQgMjEzLjY5NyAtMzA4LjI5NCAxNzEuMzQ1IC01NDEuMDA2QzE0OS41MDEgLTY2MC4wNDggMTI3LjY1NiAtNzc5LjUzNyAxMDIuNjkxIC04OTguMTNDODIuNjI5NCAtOTkzLjkwMSA2OS4yNTQ5IC0xMTA0LjQ0IDE3LjA5NTIgLTExODkuNDdDLTM4LjYzMDkgLTEyODEuMjEgLTEzMS44MDUgLTEyODguMzcgLTIyOC45OTEgLTEyNjguNjhDLTMzMy4zMTEgLTEyNDcuNjUgLTQzNy4xODQgLTEyMTkuOSAtNTM4LjgyOSAtMTE4OS4wMkMtNzQ2LjEzIC0xMTI1LjkyIC05NDkuNDE5IC0xMDQxLjc5IC0xMTMyLjY1IC05MjQuNTM0Qy0xMzAxLjYxIC04MTYuNjgxIC0xNDcwLjU3IC02NzQuODE2IC0xNTcyLjIxIC00OTguOTM5Qy0xNjYyLjI3IC0zNDMuNjQ4IC0xNjk3LjkzIC0xMjAuMzM0IC0xNTE4LjcyIC0xMy4zNzZDLTE0MzMuNTcgMzcuNjQxOCAtMTMyOS42OSA0Ny45MzQ4IC0xMjMyLjk1IDU1LjU0MjdDLTExMDkuOTEgNjQuOTQwOSAtOTg1LjUzIDYyLjcwMzEgLTg2Mi45MzIgNDkuMjc3M0MtNjI5LjMyOCAyMy4zMjEgLTQwMS4wNzQgLTQyLjkxMjQgLTE5MC4yMDYgLTE0OC4wODFDMy43MjA5NSAtMjQ0Ljc0NiAxNzkuMzcgLTM3Mi4yOSAzNTIuMzQ0IC01MDIuMDcyQzUyNC40MjYgLTYzMS40MDYgNjk0LjI4IC03NjQuMzIxIDg3OS43MzYgLTg3My45NjRDOTc1LjU4NSAtOTMwLjggMTA3NS40NSAtOTgwLjkyMiAxMTgwLjIxIC0xMDE5LjQxQzEyOTQuMzQgLTEwNjEuNDggMTQyMS44NCAtMTA5OS4wNyAxNTQzLjk5IC0xMDc1LjM1QzE2NTQuMTEgLTEwNTMuODcgMTc2Ny43OSAtOTYzLjkxNiAxNzY0LjIyIC04NDEuMjk1QzE3NjEuNTUgLTc1NC4wMjggMTY5Mi44OSAtNjkyLjcxNyAxNjEzLjk4IC02NjkuNDQ2QzE1MjkuNzMgLTY0NC4zODQgMTQzMy40MyAtNjU2LjQ2OCAxMzY0LjMzIC03MTIuNDA4QzEyODQuNTMgLTc3Ni40MDQgMTI0MS4yOSAtODczLjUxNiAxMjIxLjIzIC05NzEuNTI0QzExNzguODcgLTExNzYuNDkgMTIxNC45OCAtMTQxMi43OCAxMzEzLjUxIC0xNTk2LjcyQzEzMzUuOCAtMTYzOC4zMyAxMzYxLjY2IC0xNjc4LjE2IDEzOTEuOTcgLTE3MTMuOTdDMTQyMi4yOSAtMTc1MC4yMiAxNDY4LjY1IC0xODA2LjE2IDE1MTMuNjggLTE4MjMuNjFDMTUzMC4xNyAtMTgyOS44NyAxNTMxLjA2IC0xODMxLjY2IDE1NDIuMjEgLTE4MTMuNzZDMTU0OC45IC0xODAzLjAyIDE1NDkuNzkgLTE3ODcuODEgMTU0OS4zNCAtMTc3NS4yOEMxNTQ4IC0xNzQ4Ljg3IDE1MzYuODYgLTE3MjIuOTIgMTUyNC4zOCAtMTcwMC41NEMxNDk2LjI5IC0xNjUwLjQyIDE0NTEuMjYgLTE2MTEuOTMgMTQwOC45MSAtMTU3NC4zNEMxMjM1LjQ5IC0xNDE5Ljk0IDEwMzAuNDIgLTEzMDEuMzUgODExLjA4MiAtMTIyNy41MUM3NjEuMTUxIC0xMjEwLjk1IDcxMC4zMjkgLTExOTYuMTggNjU4LjYxNSAtMTE4NC4xQzU5MS4yOTggLTExNjguNDMgNTE4LjE4NSAtMTE1MS40MyA0NTAuNDIyIC0xMTcyLjkxQzM0NS42NTcgLTEyMDYuMDMgMjg4LjE0NyAtMTMxNi4xMiAyNjYuNzQ5IC0xNDE3LjI2QzIyMS4yNzYgLTE2MzYuMSAzMTUuNzg3IC0xODgwIDE4My4zODIgLTIwODAuMDRDMTMwLjc3NyAtMjE2MC4xNSA1MS40MjI2IC0yMjAxLjc3IC00Mi4xOTczIC0yMjE1LjE5Qy0xNTkuNDQ1IC0yMjMxLjc1IC0yODIuNDg5IC0yMjI5LjUxIC00MDAuNjI4IC0yMjIyLjhDLTgxNy40NiAtMjIwMC40MiAtMTI3My4wOCAtMjAyOC41OCAtMTQ0Ni45NCAtMTYxNS4wNkMtMTQ4Mi42MSAtMTUzMC40OCAtMTUyMS4zOSAtMTQxNS45MiAtMTQ3OS45MyAtMTMyNi40MUMtMTQ0NC4yNyAtMTI0OS40NCAtMTM1OC4yMyAtMTIxNy4yMSAtMTI4MC4yMSAtMTIwMi44OUMtMTA0Ni42MSAtMTE1OS4wNCAtNzk1LjYxNSAtMTE3OS4xOCAtNTYyLjkwMiAtMTIyMC44Qy01My43ODgzIC0xMzEyLjA5IDQxNC4zMTEgLTE1NDEuNjcgODczLjA0OSAtMTc3MS4yNUMxMTA1LjMyIC0xODg3LjE2IDEzMzcuMTQgLTIwMTEuMTIgMTU4MC4xIC0yMTAzLjc2QzE2OTcuMzUgLTIxNDguNTEgMTgyMC44NCAtMjE4MS42MyAxOTQ3LjQ1IC0yMTc0LjQ3QzIwNzAuMDUgLTIxNjcuNzYgMjE4Ni44NSAtMjEyMi41NiAyMjkyLjA2IC0yMDYwLjhDMjM5MS45MiAtMjAwMi4xNyAyNDgzLjMxIC0xOTI4Ljc4IDI1NjguOTEgLTE4NTAuNDZDMjY1Ni43MyAtMTc3MC4zNSAyNzQwLjU0IC0xNjc1LjQ4IDI3NjIuMzkgLTE1NTQuMkMyODAzLjg1IC0xMzIwLjU5IDI2MjcuMzEgLTExMTQuMjggMjQyNy41OSAtMTAyNS4yM0MyMjE4LjA2IC05MzEuMjQ3IDE5NjkuMjkgLTkyMS44NDkgMTc0My43MSAtOTQyLjQzNUMxNTEzLjIzIC05NjMuMDIxIDEyODUuODcgLTEwMjYuMTIgMTA3Ny4yMyAtMTEyNi4zN0M2NzEuMDk3IC0xMzIxLjQ5IDM0Ny44ODYgLTE2NTguMDMgMTYyLjQyOSAtMjA2OS4zQzcxLjkyOTkgLTIyNjkuNzkgMTYuMjAzOSAtMjQ4NS4wNSAtMi4wNzQ0NiAtMjcwNC4zNEMtNS4xOTUwNyAtMjcyMS43OSAtMzEuOTQzOCAtMjcyMS43OSAtMzAuNjA2MiAtMjcwNC43OFoiIGZpbGw9IiNFNjAwN0EiLz4KPC9nPgo8cGF0aCBkPSJNNTc5LjY2MSAxMTUxSDc1MC44MjdMODA1LjM5OCA5NTMuMTE4QzgxMi45MjMgOTI1LjgzMyA4NTEuMjkgOTI1Ljg1IDg1OC43OTEgOTUzLjE0MUw5MTMuMTczIDExNTFIMTA4NC4wMUwxMjE1IDY0NUgxMDU0LjYxTDEwMTMuNjUgODQ1LjgxMUMxMDA3LjcgODc0Ljk3MiA5NjYuNjgxIDg3NS43NzggOTU5LjYxIDg0Ni44NzJMOTEwLjIzMyA2NDVINzUzLjc2N0w3MDUuNjY1IDg0OC4xMjZDNjk4Ljc5NyA4NzcuMTI4IDY1Ny42OSA4NzYuNTY2IDY1MS42MDMgODQ3LjM4N0w2MzcuMTU4IDc3OC4xMzhDNjIwLjk3MyA3MDAuNTQ3IDU1My4xMDIgNjQ1IDQ3NC40OCA2NDVINDQ5TDU3OS42NjEgMTE1MVoiIGZpbGw9IndoaXRlIi8+CjxkZWZzPgo8bGluZWFyR3JhZGllbnQgaWQ9InBhaW50MF9saW5lYXIiIHgxPSItMjMyLjQyOSIgeTE9IjgxNi4xNjkiIHgyPSIyNzEzLjY5IiB5Mj0iODEzLjU5MiIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgo8c3RvcCBzdG9wLWNvbG9yPSIjRjc5NDIwIiBzdG9wLW9wYWNpdHk9IjAuOTIiLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjQzRDNEM0IiBzdG9wLW9wYWNpdHk9IjAiLz4KPC9saW5lYXJHcmFkaWVudD4KPC9kZWZzPgo8L3N2Zz4K'; diff --git a/packages/core/src/config/providers.ts b/packages/core/src/config/providers.ts index bc6e186..56271be 100644 --- a/packages/core/src/config/providers.ts +++ b/packages/core/src/config/providers.ts @@ -6,9 +6,7 @@ import type { Transport } from '../types'; * @param url - WebSocket RPC URL or URL array (for fallback). * @returns WsProvider instance. */ -export function wsProvider( - url: string | string[], -): WsProvider { +export function wsProvider(url: string | string[]): WsProvider { return new WsProvider(url); } diff --git a/packages/core/src/connectors/base.test.ts b/packages/core/src/connectors/base.test.ts index 1abd77c..58a9b02 100644 --- a/packages/core/src/connectors/base.test.ts +++ b/packages/core/src/connectors/base.test.ts @@ -1,199 +1,199 @@ -import { describe, it, expect, vi, beforeEach } from 'vitest' -import { BaseConnector } from './base' -import type { Account, Signer } from '../types' +import { beforeEach, describe, expect, it, vi } from 'vitest'; +import type { Account, Signer } from '../types'; +import { BaseConnector } from './base'; class TestConnector extends BaseConnector { - readonly id = 'test-connector' - readonly name = 'Test Connector' - readonly icon = 'test-icon.svg' + readonly id = 'test-connector'; + readonly name = 'Test Connector'; + readonly icon = 'test-icon.svg'; async isAvailable(): Promise { - return true + return true; } isInstalled(): boolean { - return true + return true; } async connect(appName: string): Promise { const testAccounts: Account[] = [ - { address: '1FRMM8PEiWXYax7rpS6X4XZX1aAAxSWx1CrKTyrVYhV24fg', name: 'Test Account' } - ] - this.accounts = testAccounts - this.signer = {} as Signer - this.emit('connect', [...testAccounts]) - return testAccounts + { address: '1FRMM8PEiWXYax7rpS6X4XZX1aAAxSWx1CrKTyrVYhV24fg', name: 'Test Account' }, + ]; + this.accounts = testAccounts; + this.signer = {} as Signer; + this.emit('connect', [...testAccounts]); + return testAccounts; } async disconnect(): Promise { - this.accounts = [] - this.signer = undefined - this.connectionUri = undefined - this.emit('disconnect') + this.accounts = []; + this.signer = undefined; + this.connectionUri = undefined; + this.emit('disconnect'); } async signMessage(message: string, address: string): Promise { - return `signed:${message}:${address}` + return `signed:${message}:${address}`; } setConnectionUri(uri: string) { - this.connectionUri = uri + this.connectionUri = uri; } hasConnectionUri(): boolean { - return this.connectionUri !== undefined + return this.connectionUri !== undefined; } async updateAccountsForChain(chainId: string): Promise { - return [...this.accounts] + return [...this.accounts]; } } describe('BaseConnector', () => { - let connector: TestConnector + let connector: TestConnector; beforeEach(() => { - connector = new TestConnector() - }) + connector = new TestConnector(); + }); describe('basic properties', () => { it('should have required abstract properties', () => { - expect(connector.id).toBe('test-connector') - expect(connector.name).toBe('Test Connector') - expect(connector.icon).toBe('test-icon.svg') - }) + expect(connector.id).toBe('test-connector'); + expect(connector.name).toBe('Test Connector'); + expect(connector.icon).toBe('test-icon.svg'); + }); it('should extend EventEmitter', () => { - expect(connector.on).toBeDefined() - expect(connector.emit).toBeDefined() - expect(connector.off).toBeDefined() - }) - }) + expect(connector.on).toBeDefined(); + expect(connector.emit).toBeDefined(); + expect(connector.off).toBeDefined(); + }); + }); describe('account management', () => { it('should start with empty accounts', async () => { - const accounts = await connector.getAccounts() - expect(accounts).toEqual([]) - }) + const accounts = await connector.getAccounts(); + expect(accounts).toEqual([]); + }); it('should return accounts after connection', async () => { - await connector.connect('test-app') - const accounts = await connector.getAccounts() + await connector.connect('test-app'); + const accounts = await connector.getAccounts(); - expect(accounts).toHaveLength(1) - expect(accounts[0].address).toBe('1FRMM8PEiWXYax7rpS6X4XZX1aAAxSWx1CrKTyrVYhV24fg') - }) + expect(accounts).toHaveLength(1); + expect(accounts[0].address).toBe('1FRMM8PEiWXYax7rpS6X4XZX1aAAxSWx1CrKTyrVYhV24fg'); + }); it('should return copied array of accounts', async () => { - await connector.connect('test-app') - const accounts1 = await connector.getAccounts() - const accounts2 = await connector.getAccounts() + await connector.connect('test-app'); + const accounts1 = await connector.getAccounts(); + const accounts2 = await connector.getAccounts(); - expect(accounts1).toEqual(accounts2) - expect(accounts1).not.toBe(accounts2) - }) + expect(accounts1).toEqual(accounts2); + expect(accounts1).not.toBe(accounts2); + }); it('should handle multiple connect calls gracefully', async () => { - await connector.connect('test-app') - const accounts1 = await connector.getAccounts() + await connector.connect('test-app'); + const accounts1 = await connector.getAccounts(); - const accounts2 = await connector.connect('test-app') - expect(accounts2).toEqual(accounts1) - }) - }) + const accounts2 = await connector.connect('test-app'); + expect(accounts2).toEqual(accounts1); + }); + }); describe('signer management', () => { it('should start with undefined signer', async () => { - const signer = await connector.getSigner() - expect(signer).toBeUndefined() - }) + const signer = await connector.getSigner(); + expect(signer).toBeUndefined(); + }); it('should return signer after connection', async () => { - await connector.connect('test-app') - const signer = await connector.getSigner() + await connector.connect('test-app'); + const signer = await connector.getSigner(); - expect(signer).toBeDefined() - }) + expect(signer).toBeDefined(); + }); it('should warn when signer not available', async () => { - const consoleSpy = vi.spyOn(console, 'warn').mockImplementation(() => {}) + const consoleSpy = vi.spyOn(console, 'warn').mockImplementation(() => {}); - await connector.getSigner() + await connector.getSigner(); expect(consoleSpy).toHaveBeenCalledWith( 'Connector test-connector: Signer not available. Connection might be incomplete or failed.' - ) + ); - consoleSpy.mockRestore() - }) - }) + consoleSpy.mockRestore(); + }); + }); describe('connection URI management', () => { it('should start with undefined connectionUri', async () => { - const uri = await connector.getConnectionUri() - expect(uri).toBeUndefined() - }) + const uri = await connector.getConnectionUri(); + expect(uri).toBeUndefined(); + }); it('should return false for hasConnectionUri by default', () => { - expect(connector.hasConnectionUri()).toBe(false) - }) + expect(connector.hasConnectionUri()).toBe(false); + }); it('should return connectionUri when set', async () => { - const testUri = 'wc:test-connection-uri@1' - connector.setConnectionUri(testUri) + const testUri = 'wc:test-connection-uri@1'; + connector.setConnectionUri(testUri); - const uri = await connector.getConnectionUri() - expect(uri).toBe(testUri) - expect(connector.hasConnectionUri()).toBe(true) - }) + const uri = await connector.getConnectionUri(); + expect(uri).toBe(testUri); + expect(connector.hasConnectionUri()).toBe(true); + }); it('should reset connectionUri after disconnect', async () => { - connector.setConnectionUri('wc:test@1') - await connector.connect('test-app') - await connector.disconnect() + connector.setConnectionUri('wc:test@1'); + await connector.connect('test-app'); + await connector.disconnect(); - const uri = await connector.getConnectionUri() - expect(uri).toBeUndefined() - expect(connector.hasConnectionUri()).toBe(false) - }) - }) + const uri = await connector.getConnectionUri(); + expect(uri).toBeUndefined(); + expect(connector.hasConnectionUri()).toBe(false); + }); + }); describe('chain-specific account management', () => { it('should return current accounts by default for updateAccountsForChain', async () => { - await connector.connect('test-app') - const originalAccounts = await connector.getAccounts() + await connector.connect('test-app'); + const originalAccounts = await connector.getAccounts(); - const chainAccounts = await connector.updateAccountsForChain('polkadot:test-chain-id') + const chainAccounts = await connector.updateAccountsForChain('polkadot:test-chain-id'); - expect(chainAccounts).toEqual(originalAccounts) - }) + expect(chainAccounts).toEqual(originalAccounts); + }); it('should handle updateAccountsForChain when not connected', async () => { - const chainAccounts = await connector.updateAccountsForChain('polkadot:test-chain-id') - expect(chainAccounts).toEqual([]) - }) - }) + const chainAccounts = await connector.updateAccountsForChain('polkadot:test-chain-id'); + expect(chainAccounts).toEqual([]); + }); + }); describe('events', () => { it('should emit connect event', async () => { - const connectSpy = vi.fn() - connector.on('connect', connectSpy) + const connectSpy = vi.fn(); + connector.on('connect', connectSpy); - await connector.connect('test-app') + await connector.connect('test-app'); expect(connectSpy).toHaveBeenCalledWith([ - { address: '1FRMM8PEiWXYax7rpS6X4XZX1aAAxSWx1CrKTyrVYhV24fg', name: 'Test Account' } - ]) - }) + { address: '1FRMM8PEiWXYax7rpS6X4XZX1aAAxSWx1CrKTyrVYhV24fg', name: 'Test Account' }, + ]); + }); it('should emit disconnect event', async () => { - const disconnectSpy = vi.fn() - connector.on('disconnect', disconnectSpy) + const disconnectSpy = vi.fn(); + connector.on('disconnect', disconnectSpy); - await connector.connect('test-app') - await connector.disconnect() + await connector.connect('test-app'); + await connector.disconnect(); - expect(disconnectSpy).toHaveBeenCalled() - }) - }) -}) + expect(disconnectSpy).toHaveBeenCalled(); + }); + }); +}); diff --git a/packages/core/src/connectors/base.ts b/packages/core/src/connectors/base.ts index 9e9a9b5..bd7b4ae 100644 --- a/packages/core/src/connectors/base.ts +++ b/packages/core/src/connectors/base.ts @@ -1,6 +1,5 @@ -import type {Account, Chain, Signer} from '../types'; import { EventEmitter } from 'eventemitter3'; -import { ConnectorLinks } from '../types' +import type { Account, Chain, ConnectorLinks, Signer } from '../types'; /** * base connector abstract class @@ -57,7 +56,11 @@ export abstract class BaseConnector extends EventEmitter { * 5. (optional) trigger the 'connect' event. * @returns the initial available accounts list */ - abstract connect(appName: string, chains?: Chain[], targetChainId?: string): Promise; + abstract connect( + appName: string, + chains?: Chain[], + targetChainId?: string + ): Promise; /** * disconnect from the wallet. * subclasses must implement this method to perform specific cleanup logic @@ -80,7 +83,9 @@ export abstract class BaseConnector extends EventEmitter { */ public async getSigner(): Promise { if (!this.signer) { - console.warn(`Connector ${this.id}: Signer not available. Connection might be incomplete or failed.`); + console.warn( + `Connector ${this.id}: Signer not available. Connection might be incomplete or failed.` + ); } return this.signer; } @@ -88,17 +93,13 @@ export abstract class BaseConnector extends EventEmitter { /** * sign a message with the specified account. */ - abstract signMessage(message: string, address: string, chainId?: string): Promise; + abstract signMessage(message: string, address: string): Promise; public hasConnectionUri(): boolean { - return false + return false; } - public async getConnectionUri(): Promise{ + public async getConnectionUri(): Promise { return this.connectionUri; } - - public async updateAccountsForChain(chainId: string): Promise { - return [...this.accounts]; - } } diff --git a/packages/core/src/connectors/enkrypt.test.ts b/packages/core/src/connectors/enkrypt.test.ts index 9ecd7fe..c58281e 100644 --- a/packages/core/src/connectors/enkrypt.test.ts +++ b/packages/core/src/connectors/enkrypt.test.ts @@ -1,7 +1,7 @@ import { describe } from 'vitest'; +import { enkryptWallet } from '../config/logos/generated'; import { enkryptConnector } from './enkrypt'; -import { createConnectorTestSuite } from './test-helper' -import { enkryptWallet } from '../config/logos/generated' +import { createConnectorTestSuite } from './test-helper'; describe( 'enkryptConnector', @@ -13,4 +13,4 @@ describe( icon: enkryptWallet, }, }) -) +); diff --git a/packages/core/src/connectors/enkrypt.ts b/packages/core/src/connectors/enkrypt.ts index 9e936a6..eb4127b 100644 --- a/packages/core/src/connectors/enkrypt.ts +++ b/packages/core/src/connectors/enkrypt.ts @@ -1,5 +1,5 @@ -import { InjectConnector } from './inject' -import { enkryptWallet } from '../config/logos/generated' +import { enkryptWallet } from '../config/logos/generated'; +import { InjectConnector } from './inject'; export const enkryptConnector = () => { return new InjectConnector({ @@ -7,7 +7,7 @@ export const enkryptConnector = () => { name: 'Enkrypt', icon: enkryptWallet, links: { - browserExtension: 'https://www.enkrypt.com' - } + browserExtension: 'https://www.enkrypt.com', + }, }); -} +}; diff --git a/packages/core/src/connectors/fearless.test.ts b/packages/core/src/connectors/fearless.test.ts index 3c2714b..2ae9c97 100644 --- a/packages/core/src/connectors/fearless.test.ts +++ b/packages/core/src/connectors/fearless.test.ts @@ -1,7 +1,7 @@ import { describe } from 'vitest'; +import { fearlessWallet } from '../config/logos/generated'; import { fearlessConnector } from './fearless'; -import { createConnectorTestSuite } from './test-helper' -import { fearlessWallet } from '../config/logos/generated' +import { createConnectorTestSuite } from './test-helper'; describe( 'fearlessConnector', @@ -13,4 +13,4 @@ describe( icon: fearlessWallet, }, }) -) +); diff --git a/packages/core/src/connectors/fearless.ts b/packages/core/src/connectors/fearless.ts index 249832e..b391294 100644 --- a/packages/core/src/connectors/fearless.ts +++ b/packages/core/src/connectors/fearless.ts @@ -1,5 +1,5 @@ -import { InjectConnector } from './inject' -import { fearlessWallet } from '../config/logos/generated' +import { fearlessWallet } from '../config/logos/generated'; +import { InjectConnector } from './inject'; export const fearlessConnector = () => { return new InjectConnector({ @@ -7,7 +7,7 @@ export const fearlessConnector = () => { name: 'Fearless', icon: fearlessWallet, links: { - browserExtension: 'https://fearlesswallet.io' - } + browserExtension: 'https://fearlesswallet.io', + }, }); -} +}; diff --git a/packages/core/src/connectors/index.ts b/packages/core/src/connectors/index.ts index eefb36b..5355cad 100644 --- a/packages/core/src/connectors/index.ts +++ b/packages/core/src/connectors/index.ts @@ -1,13 +1,12 @@ export { BaseConnector } from './base'; - -export { InjectConnector } from './inject'; export { enkryptConnector } from './enkrypt'; -export { fearlessConnector } from './fearless' +export { fearlessConnector } from './fearless'; +export { InjectConnector } from './inject'; +export { mimirConnector } from './mimir'; +export { novaConnector } from './nova'; +export { novaMobileConnector } from './novaMobile'; export { polkadotjsConnector } from './polkadot-js'; export { polkagateConnector } from './polkagate'; export { subwalletConnector } from './subwallet'; export { talismanConnector } from './talisman'; export { walletConnectConnector } from './walletconnect'; -export { mimirConnector } from './mimir'; -export { novaConnector } from './nova'; -export { novaMobileConnector } from './novaMobile' diff --git a/packages/core/src/connectors/inject.test.ts b/packages/core/src/connectors/inject.test.ts index 321fbfe..c1ba989 100644 --- a/packages/core/src/connectors/inject.test.ts +++ b/packages/core/src/connectors/inject.test.ts @@ -1,6 +1,6 @@ -import { describe } from 'vitest' -import { InjectConnector } from './inject' -import { createConnectorTestSuite } from './test-helper' +import { describe } from 'vitest'; +import { InjectConnector } from './inject'; +import { createConnectorTestSuite } from './test-helper'; const options = { id: 'mock-connector', diff --git a/packages/core/src/connectors/inject.ts b/packages/core/src/connectors/inject.ts index c7c31c1..4999c3a 100644 --- a/packages/core/src/connectors/inject.ts +++ b/packages/core/src/connectors/inject.ts @@ -1,9 +1,8 @@ +import type { Injected, InjectedAccount } from 'dedot/types'; +import { stringToHex } from 'dedot/utils'; +import type { Account, ConnectorLinks, Signer } from '../types'; +import { mapInjectedAccounts } from '../utils'; import { BaseConnector } from './base'; -import type { Account, Signer } from '../types'; -import { mapInjectedAccounts } from '../utils' -import { Injected, InjectedAccount } from 'dedot/types' -import { stringToHex } from 'dedot/utils' -import { ConnectorLinks } from '../types' export interface InjectConnectorOptions { id: string; @@ -22,7 +21,7 @@ export class InjectConnector extends BaseConnector { private unsubscribe: (() => void) | null = null; - private specificInjector?: Injected = undefined + private specificInjector?: Injected = undefined; constructor(options: InjectConnectorOptions) { super(); @@ -54,7 +53,9 @@ export class InjectConnector extends BaseConnector { } try { - this.specificInjector = await window.injectedWeb3![this.injectorId]!.enable(appName); + this.specificInjector = (await window.injectedWeb3![this.injectorId]!.enable( + appName + )) as Injected; if (!this.specificInjector) { throw new Error(`Failed to enable the '${this.id}' extension.`); @@ -68,7 +69,9 @@ export class InjectConnector extends BaseConnector { const rawAccounts = await this.specificInjector.accounts.get(); if (rawAccounts.length === 0) { - throw new Error(`No accounts found in ${this.name}. Make sure accounts are visible and access is granted.`); + throw new Error( + `No accounts found in ${this.name}. Make sure accounts are visible and access is granted.` + ); } this.accounts = mapInjectedAccounts(rawAccounts, this.id); console.log(`Connector ${this.id}: Initial accounts loaded`, this.accounts); @@ -78,7 +81,6 @@ export class InjectConnector extends BaseConnector { this.emit('connect', [...this.accounts]); return [...this.accounts]; - } catch (error) { console.error(`Connector ${this.id}: Connection failed:`, error); await this.cleanup(); @@ -99,7 +101,7 @@ export class InjectConnector extends BaseConnector { throw new Error('Signer is not available or does not support signRaw.'); } const accounts = await this.getAccounts(); - if (!accounts.some(acc => acc.address.toLowerCase() === address.toLowerCase())) { + if (!accounts.some((acc) => acc.address.toLowerCase() === address.toLowerCase())) { throw new Error(`Address ${address} is not managed by ${this.name}.`); } @@ -108,12 +110,11 @@ export class InjectConnector extends BaseConnector { const result = await signer.signRaw({ address, data: dataHex, type: 'bytes' }); return result.signature; } catch (error: any) { - console.log('error', error) + console.log('error', error); throw new Error(`Connector ${this.id}: Failed to sign message: ${error.message}`); } } - private async startSubscription(): Promise { await this.cleanupSubscription(); if (!this.specificInjector) { @@ -145,11 +146,10 @@ export class InjectConnector extends BaseConnector { } } - private async cleanup(): Promise { await this.cleanupSubscription(); this.accounts = []; this.signer = undefined; - this.specificInjector = undefined + this.specificInjector = undefined; } } diff --git a/packages/core/src/connectors/ledger.test.ts b/packages/core/src/connectors/ledger.test.ts index f8c9ea6..417ef09 100644 --- a/packages/core/src/connectors/ledger.test.ts +++ b/packages/core/src/connectors/ledger.test.ts @@ -1,9 +1,10 @@ import { describe } from 'vitest'; -import { createWalletConnectTestSuite } from './test-helper'; import { ledgerWallet } from '../config/logos/generated'; -import { ledgerConnector } from './ledger' +import { ledgerConnector } from './ledger'; +import { createWalletConnectTestSuite } from './test-helper'; -describe('ledgerConnector', +describe( + 'ledgerConnector', createWalletConnectTestSuite({ getConnector: ledgerConnector, expected: { diff --git a/packages/core/src/connectors/ledger.ts b/packages/core/src/connectors/ledger.ts index 88cbb39..a8e2e8c 100644 --- a/packages/core/src/connectors/ledger.ts +++ b/packages/core/src/connectors/ledger.ts @@ -1,17 +1,20 @@ -import { WalletConnectConnector } from './walletconnect' -import { ledgerWallet } from '../config/logos/generated' -import { WalletConnectConnectorOptions } from '../types' +import { ledgerWallet } from '../config/logos/generated'; +import type { WalletConnectConnectorOptions } from '../types'; +import { WalletConnectConnector } from './walletconnect'; -type WalletConnectConfig = Pick +type WalletConnectConfig = Pick< + WalletConnectConnectorOptions, + 'projectId' | 'relayUrl' | 'metadata' +>; export const ledgerConnector = (config: WalletConnectConfig) => { return new WalletConnectConnector({ id: 'ledger', name: 'Ledger', - icon : ledgerWallet, + icon: ledgerWallet, links: { - browserExtension: 'https://www.ledger.com/ledger-live' + browserExtension: 'https://www.ledger.com/ledger-live', }, ...config, - }) -} + }); +}; diff --git a/packages/core/src/connectors/mimir.test.ts b/packages/core/src/connectors/mimir.test.ts index 205d98e..558394f 100644 --- a/packages/core/src/connectors/mimir.test.ts +++ b/packages/core/src/connectors/mimir.test.ts @@ -1,11 +1,11 @@ -import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest'; -import { MimirConnector, mimirConnector } from './mimir'; +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; import { mimirWallet } from '../config/logos/generated'; +import { MimirConnector, mimirConnector } from './mimir'; vi.mock('@mimirdev/apps-inject', () => ({ isMimirReady: vi.fn(), inject: vi.fn(), - MIMIR_REGEXP: /^https:\/\/(app|dev)\.mimir\.global$/ + MIMIR_REGEXP: /^https:\/\/(app|dev)\.mimir\.global$/, })); describe('MimirConnector', () => { @@ -22,7 +22,7 @@ describe('MimirConnector', () => { Object.defineProperty(globalThis, 'window', { value: originalWindow, writable: true, - configurable: true + configurable: true, }); vi.restoreAllMocks(); }); @@ -39,10 +39,10 @@ describe('MimirConnector', () => { it('should return false when not in iframe', () => { Object.defineProperty(globalThis, 'window', { value: { - parent: window + parent: window, }, writable: true, - configurable: true + configurable: true, }); expect(connector.isInstalled()).toBe(false); @@ -52,10 +52,10 @@ describe('MimirConnector', () => { Object.defineProperty(globalThis, 'window', { value: { parent: {}, - injectedWeb3: { mimir: {} } + injectedWeb3: { mimir: {} }, }, writable: true, - configurable: true + configurable: true, }); const { isMimirReady } = await import('@mimirdev/apps-inject'); @@ -85,10 +85,10 @@ describe('MimirConnector', () => { value: { parent: {}, origin: 'https://example.com', - open: vi.fn() + open: vi.fn(), }, writable: true, - configurable: true + configurable: true, }); (connector as any).mimirReady = false; @@ -114,13 +114,13 @@ describe('MimirConnector', () => { mimir: { enable: vi.fn().mockResolvedValue({ accounts: { get: vi.fn().mockResolvedValue([]), subscribe: vi.fn() }, - signer: {} - }) - } - } + signer: {}, + }), + }, + }, }, writable: true, - configurable: true + configurable: true, }); (connector as any).mimirReady = true; @@ -140,10 +140,10 @@ describe('MimirConnector', () => { value: { parent: {}, origin: 'https://not-mimir.example.com', - open: vi.fn() + open: vi.fn(), }, writable: true, - configurable: true + configurable: true, }); (connector as any).mimirReady = false; diff --git a/packages/core/src/connectors/mimir.ts b/packages/core/src/connectors/mimir.ts index c04b067..19520f5 100644 --- a/packages/core/src/connectors/mimir.ts +++ b/packages/core/src/connectors/mimir.ts @@ -1,5 +1,5 @@ -import { InjectConnector, InjectConnectorOptions } from './inject'; -import { mimirWallet } from '../config/logos/generated' +import { mimirWallet } from '../config/logos/generated'; +import { InjectConnector, type InjectConnectorOptions } from './inject'; export class MimirConnector extends InjectConnector { private mimirReady: boolean = false; @@ -7,17 +7,17 @@ export class MimirConnector extends InjectConnector { constructor(options: InjectConnectorOptions) { super({ ...options }); - this.mimirInject() + this.mimirInject(); } public isInstalled(): boolean { - return this.mimirReady + return this.mimirReady; } private async mimirInject() { try { const inIframe = typeof window !== 'undefined' && window !== window.parent; - if (!inIframe) return + if (!inIframe) return; const { isMimirReady, MIMIR_REGEXP, inject } = await import('@mimirdev/apps-inject'); @@ -25,7 +25,7 @@ export class MimirConnector extends InjectConnector { if (origin && MIMIR_REGEXP.test(origin)) { inject(); - this.mimirReady = true + this.mimirReady = true; } } catch (e: any) { console.error('Failed to inject Mimir:', e); @@ -37,8 +37,8 @@ export class MimirConnector extends InjectConnector { const { MIMIR_REGEXP } = await import('@mimirdev/apps-inject'); if (!window.origin || !MIMIR_REGEXP.test(window.origin)) { - window.open(`https://app.mimir.global/explorer/${encodeURIComponent(window.origin)}`) - return + window.open(`https://app.mimir.global/explorer/${encodeURIComponent(window.origin)}`); + return; } } diff --git a/packages/core/src/connectors/nova.test.ts b/packages/core/src/connectors/nova.test.ts index 19bb036..e9b2f0d 100644 --- a/packages/core/src/connectors/nova.test.ts +++ b/packages/core/src/connectors/nova.test.ts @@ -1,9 +1,10 @@ import { describe } from 'vitest'; +import { novaWallet } from '../config/logos/generated'; import { novaConnector } from './nova'; import { createWalletConnectTestSuite } from './test-helper'; -import { novaWallet } from '../config/logos/generated'; -describe('NovaConnector', +describe( + 'NovaConnector', createWalletConnectTestSuite({ getConnector: novaConnector, expected: { diff --git a/packages/core/src/connectors/nova.ts b/packages/core/src/connectors/nova.ts index 4c4e6a3..a510a1a 100644 --- a/packages/core/src/connectors/nova.ts +++ b/packages/core/src/connectors/nova.ts @@ -1,14 +1,17 @@ -import { novaWallet } from '../config/logos/generated' -import { WalletConnectConnector } from './walletconnect' -import { novaMobileConnector } from './novaMobile' -import { isMobileDevice } from '../utils' -import { WalletConnectConnectorOptions } from '../types' +import { novaWallet } from '../config/logos/generated'; +import type { WalletConnectConnectorOptions } from '../types'; +import { isMobileDevice } from '../utils'; +import { novaMobileConnector } from './novaMobile'; +import { WalletConnectConnector } from './walletconnect'; -type WalletConnectConfig = Pick +type WalletConnectConfig = Pick< + WalletConnectConnectorOptions, + 'projectId' | 'relayUrl' | 'metadata' | 'supportedChains' +>; type MobileOnlyConfig = { mobileOnly: true; -} +}; type NovaConnectorConfig = WalletConnectConfig | MobileOnlyConfig; @@ -18,7 +21,9 @@ export const novaConnector = (config: NovaConnectorConfig) => { } if (!isMobileDevice() && 'mobileOnly' in config && config.mobileOnly) { - console.error('Nova Wallet mobile connector is being used on a desktop device. This may not work as expected.'); + console.error( + 'Nova Wallet mobile connector is being used on a desktop device. This may not work as expected.' + ); return novaMobileConnector(); } @@ -29,6 +34,6 @@ export const novaConnector = (config: NovaConnectorConfig) => { links: { browserExtension: 'https://novawallet.io', }, - ...config as WalletConnectConfig, + ...(config as WalletConnectConfig), }); }; diff --git a/packages/core/src/connectors/novaMobile.test.ts b/packages/core/src/connectors/novaMobile.test.ts index d884198..4f91bc0 100644 --- a/packages/core/src/connectors/novaMobile.test.ts +++ b/packages/core/src/connectors/novaMobile.test.ts @@ -1,7 +1,7 @@ import { describe } from 'vitest'; +import { novaWallet } from '../config/logos/generated'; import { novaMobileConnector } from './novaMobile'; -import { createConnectorTestSuite } from './test-helper' -import { novaWallet } from '../config/logos/generated' +import { createConnectorTestSuite } from './test-helper'; describe( 'novaMobileConnector', @@ -15,8 +15,8 @@ describe( }, extraWindowProps: { walletExtension: { - isNovaWallet: true - } - } + isNovaWallet: true, + }, + }, }) -) +); diff --git a/packages/core/src/connectors/novaMobile.ts b/packages/core/src/connectors/novaMobile.ts index 857244d..9419cf9 100644 --- a/packages/core/src/connectors/novaMobile.ts +++ b/packages/core/src/connectors/novaMobile.ts @@ -1,5 +1,5 @@ -import { novaWallet } from '../config/logos/generated' -import { InjectConnector } from './inject' +import { novaWallet } from '../config/logos/generated'; +import { InjectConnector } from './inject'; export class NovaMobileConnector extends InjectConnector { constructor() { @@ -9,8 +9,8 @@ export class NovaMobileConnector extends InjectConnector { icon: novaWallet, injectorId: 'polkadot-js', links: { - deepLink: 'https://app.novawallet.io/open/dapp' - } + deepLink: 'https://app.novawallet.io/open/dapp', + }, }); } @@ -29,4 +29,4 @@ export class NovaMobileConnector extends InjectConnector { } } -export const novaMobileConnector = () => new NovaMobileConnector() +export const novaMobileConnector = () => new NovaMobileConnector(); diff --git a/packages/core/src/connectors/polkadot-js.test.ts b/packages/core/src/connectors/polkadot-js.test.ts index a3f3836..58049fd 100644 --- a/packages/core/src/connectors/polkadot-js.test.ts +++ b/packages/core/src/connectors/polkadot-js.test.ts @@ -1,7 +1,7 @@ import { describe } from 'vitest'; +import { polkadotjsWallet } from '../config/logos/generated'; import { polkadotjsConnector } from './polkadot-js'; -import { createConnectorTestSuite } from './test-helper' -import { polkadotjsWallet } from '../config/logos/generated' +import { createConnectorTestSuite } from './test-helper'; describe( 'polkadotjsConnector', @@ -13,4 +13,4 @@ describe( icon: polkadotjsWallet, }, }) -) +); diff --git a/packages/core/src/connectors/polkadot-js.ts b/packages/core/src/connectors/polkadot-js.ts index 7c112ca..85eb3b5 100644 --- a/packages/core/src/connectors/polkadot-js.ts +++ b/packages/core/src/connectors/polkadot-js.ts @@ -1,5 +1,5 @@ -import { InjectConnector } from './inject' -import { polkadotjsWallet } from '../config/logos/generated' +import { polkadotjsWallet } from '../config/logos/generated'; +import { InjectConnector } from './inject'; export const polkadotjsConnector = () => { return new InjectConnector({ @@ -7,7 +7,7 @@ export const polkadotjsConnector = () => { name: 'Polkadot{.js}', icon: polkadotjsWallet, links: { - browserExtension: 'https://polkadot.js.org/extension' - } + browserExtension: 'https://polkadot.js.org/extension', + }, }); -} +}; diff --git a/packages/core/src/connectors/polkagate.test.ts b/packages/core/src/connectors/polkagate.test.ts index f8baf07..0d368ac 100644 --- a/packages/core/src/connectors/polkagate.test.ts +++ b/packages/core/src/connectors/polkagate.test.ts @@ -1,7 +1,7 @@ import { describe } from 'vitest'; +import { polkagateWallet } from '../config/logos/generated'; import { polkagateConnector } from './polkagate'; -import { createConnectorTestSuite } from './test-helper' -import { polkagateWallet } from '../config/logos/generated' +import { createConnectorTestSuite } from './test-helper'; describe( 'polkagateConnector', @@ -13,4 +13,4 @@ describe( icon: polkagateWallet, }, }) -) +); diff --git a/packages/core/src/connectors/polkagate.ts b/packages/core/src/connectors/polkagate.ts index c7c9acb..dd36e9c 100644 --- a/packages/core/src/connectors/polkagate.ts +++ b/packages/core/src/connectors/polkagate.ts @@ -1,5 +1,5 @@ -import { polkagateWallet } from '../config/logos/generated' -import { InjectConnector } from './inject' +import { polkagateWallet } from '../config/logos/generated'; +import { InjectConnector } from './inject'; export const polkagateConnector = () => { return new InjectConnector({ @@ -7,7 +7,8 @@ export const polkagateConnector = () => { name: 'Polkagate', icon: polkagateWallet, links: { - browserExtension: 'https://chromewebstore.google.com/detail/polkagate-the-gateway-to/ginchbkmljhldofnbjabmeophlhdldgp' - } + browserExtension: + 'https://chromewebstore.google.com/detail/polkagate-the-gateway-to/ginchbkmljhldofnbjabmeophlhdldgp', + }, }); -} +}; diff --git a/packages/core/src/connectors/subwallet.test.ts b/packages/core/src/connectors/subwallet.test.ts index 539efee..76425f6 100644 --- a/packages/core/src/connectors/subwallet.test.ts +++ b/packages/core/src/connectors/subwallet.test.ts @@ -1,7 +1,7 @@ import { describe } from 'vitest'; +import { subwalletWallet } from '../config/logos/generated'; import { subwalletConnector } from './subwallet'; -import { createConnectorTestSuite } from './test-helper' -import { subwalletWallet } from '../config/logos/generated' +import { createConnectorTestSuite } from './test-helper'; describe( 'subwalletConnector', @@ -13,4 +13,4 @@ describe( icon: subwalletWallet, }, }) -) +); diff --git a/packages/core/src/connectors/subwallet.ts b/packages/core/src/connectors/subwallet.ts index e25f95e..2b3e57e 100644 --- a/packages/core/src/connectors/subwallet.ts +++ b/packages/core/src/connectors/subwallet.ts @@ -1,5 +1,5 @@ -import { subwalletWallet } from '../config/logos/generated' -import { InjectConnector } from './inject' +import { subwalletWallet } from '../config/logos/generated'; +import { InjectConnector } from './inject'; export const subwalletConnector = () => { return new InjectConnector({ @@ -7,8 +7,9 @@ export const subwalletConnector = () => { name: 'SubWallet', icon: subwalletWallet, links: { - browserExtension: 'https://chromewebstore.google.com/detail/subwallet-polkadot-wallet/onhogfjeacnfoofkfgppdlbmlmnplgbn', + browserExtension: + 'https://chromewebstore.google.com/detail/subwallet-polkadot-wallet/onhogfjeacnfoofkfgppdlbmlmnplgbn', deepLink: 'https://mobile.subwallet.app/browser', - } - }) + }, + }); }; diff --git a/packages/core/src/connectors/talisman.test.ts b/packages/core/src/connectors/talisman.test.ts index 13688fd..4953429 100644 --- a/packages/core/src/connectors/talisman.test.ts +++ b/packages/core/src/connectors/talisman.test.ts @@ -1,7 +1,7 @@ import { describe } from 'vitest'; +import { talismanWallet } from '../config/logos/generated'; import { talismanConnector } from './talisman'; -import { createConnectorTestSuite } from './test-helper' -import { talismanWallet } from '../config/logos/generated' +import { createConnectorTestSuite } from './test-helper'; describe( 'subwalletConnector', @@ -13,4 +13,4 @@ describe( icon: talismanWallet, }, }) -) +); diff --git a/packages/core/src/connectors/talisman.ts b/packages/core/src/connectors/talisman.ts index 89a6aa8..0bc9ed7 100644 --- a/packages/core/src/connectors/talisman.ts +++ b/packages/core/src/connectors/talisman.ts @@ -1,5 +1,5 @@ -import { talismanWallet } from '../config/logos/generated' -import { InjectConnector } from './inject' +import { talismanWallet } from '../config/logos/generated'; +import { InjectConnector } from './inject'; export const talismanConnector = () => { return new InjectConnector({ @@ -7,7 +7,8 @@ export const talismanConnector = () => { name: 'Talisman', icon: talismanWallet, links: { - browserExtension: 'https://chromewebstore.google.com/detail/talisman-wallet/fijngjgcjhjmmpcmkeiomlglpeiijkld' - } + browserExtension: + 'https://chromewebstore.google.com/detail/talisman-wallet/fijngjgcjhjmmpcmkeiomlglpeiijkld', + }, }); -} +}; diff --git a/packages/core/src/connectors/test-helper.ts b/packages/core/src/connectors/test-helper.ts index 9f0b8b2..9519230 100644 --- a/packages/core/src/connectors/test-helper.ts +++ b/packages/core/src/connectors/test-helper.ts @@ -1,6 +1,6 @@ -import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest' -import type { BaseConnector } from './base' -import { Chain, WalletConnectConnectorOptions } from '../types' +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; +import type { Chain, WalletConnectConnectorOptions } from '../types'; +import type { BaseConnector } from './base'; interface ConnectorTestConfig { getConnector: () => T; @@ -15,31 +15,29 @@ interface ConnectorTestConfig { interface MockInjector { accounts: { - get: any - subscribe: any - } + get: any; + subscribe: any; + }; signer: { - signRaw: any - } + signRaw: any; + }; } -export function createConnectorTestSuite( - config: ConnectorTestConfig -) { +export function createConnectorTestSuite(config: ConnectorTestConfig) { return () => { let connector: T; - let mockInjectedWeb3: Record - let mockInjector: MockInjector - let originalWindow: any + let mockInjectedWeb3: Record; + let mockInjector: MockInjector; + let originalWindow: any; - const TEST_ADDRESS = '1FRMM8PEiWXYax7rpS6X4XZX1aAAxSWx1CrKTyrVYhV24fg' + const TEST_ADDRESS = '1FRMM8PEiWXYax7rpS6X4XZX1aAAxSWx1CrKTyrVYhV24fg'; - const { id, name, icon, injectorId } = config.expected + const { id, name, icon, injectorId } = config.expected; const actualInjectorId = injectorId || id; beforeEach(() => { connector = config.getConnector(); - originalWindow = globalThis.window + originalWindow = globalThis.window; mockInjector = { accounts: { @@ -49,317 +47,309 @@ export function createConnectorTestSuite( signer: { signRaw: vi.fn(), }, - } + }; mockInjectedWeb3 = { [actualInjectorId]: { enable: vi.fn(), - } - } + }, + }; Object.defineProperty(globalThis, 'window', { value: { injectedWeb3: mockInjectedWeb3, ...config.extraWindowProps }, writable: true, configurable: true, - }) + }); - vi.clearAllMocks() - }) + vi.clearAllMocks(); + }); afterEach(() => { Object.defineProperty(globalThis, 'window', { value: originalWindow, writable: true, configurable: true, - }) - vi.restoreAllMocks() - }) + }); + vi.restoreAllMocks(); + }); describe('basic properties', () => { it('should have correct connector metadata', () => { - expect(connector.id).toBe(id) - expect(connector.name).toBe(name) - expect(connector.icon).toBe(icon) - }) - }) + expect(connector.id).toBe(id); + expect(connector.name).toBe(name); + expect(connector.icon).toBe(icon); + }); + }); describe('installation detection', () => { it('should detect when extension is installed', () => { - expect(connector.isInstalled()).toBe(true) - }) + expect(connector.isInstalled()).toBe(true); + }); it('should return false in non-browser environment', () => { Object.defineProperty(globalThis, 'window', { value: undefined, writable: true, configurable: true, - }) - expect(connector.isInstalled()).toBe(false) - }) + }); + expect(connector.isInstalled()).toBe(false); + }); it('should return false when injectedWeb3 is undefined', () => { Object.defineProperty(globalThis, 'window', { value: {}, writable: true, configurable: true, - }) - expect(connector.isInstalled()).toBe(false) - }) + }); + expect(connector.isInstalled()).toBe(false); + }); it('should return false when extension not found', () => { Object.defineProperty(globalThis, 'window', { value: { injectedWeb3: {} }, writable: true, configurable: true, - }) - expect(connector.isInstalled()).toBe(false) - }) - }) + }); + expect(connector.isInstalled()).toBe(false); + }); + }); describe('availability check', () => { it('should be available when installed', async () => { - expect(await connector.isAvailable()).toBe(true) - }) + expect(await connector.isAvailable()).toBe(true); + }); it('should not be available when not installed', async () => { - vi.spyOn(connector, 'isInstalled').mockReturnValue(false) - expect(await connector.isAvailable()).toBe(false) - }) - }) + vi.spyOn(connector, 'isInstalled').mockReturnValue(false); + expect(await connector.isAvailable()).toBe(false); + }); + }); describe('connection flow', () => { beforeEach(() => { - mockInjectedWeb3[actualInjectorId].enable.mockResolvedValue(mockInjector) + mockInjectedWeb3[actualInjectorId].enable.mockResolvedValue(mockInjector); mockInjector.accounts.get.mockResolvedValue([ - { address: TEST_ADDRESS, name: 'Test Account' } - ]) - mockInjector.accounts.subscribe.mockReturnValue(() => {}) - }) + { address: TEST_ADDRESS, name: 'Test Account' }, + ]); + mockInjector.accounts.subscribe.mockReturnValue(() => {}); + }); it('should connect successfully with valid setup', async () => { - const accounts = await connector.connect('test-app') + const accounts = await connector.connect('test-app'); - expect(mockInjectedWeb3[actualInjectorId].enable).toHaveBeenCalledWith('test-app') - expect(mockInjector.accounts.get).toHaveBeenCalled() - expect(accounts).toHaveLength(1) - expect(accounts[0].address).toBe(TEST_ADDRESS) - }) + expect(mockInjectedWeb3[actualInjectorId].enable).toHaveBeenCalledWith('test-app'); + expect(mockInjector.accounts.get).toHaveBeenCalled(); + expect(accounts).toHaveLength(1); + expect(accounts[0].address).toBe(TEST_ADDRESS); + }); it('should handle already connected state', async () => { - await connector.connect('test-app') - const accounts = await connector.connect('test-app') - expect(accounts).toHaveLength(1) - expect(mockInjectedWeb3[actualInjectorId].enable).toHaveBeenCalledTimes(1) - }) + await connector.connect('test-app'); + const accounts = await connector.connect('test-app'); + expect(accounts).toHaveLength(1); + expect(mockInjectedWeb3[actualInjectorId].enable).toHaveBeenCalledTimes(1); + }); it('should throw error when extension not available', async () => { - vi.spyOn(connector, 'isAvailable').mockResolvedValue(false) + vi.spyOn(connector, 'isAvailable').mockResolvedValue(false); await expect(connector.connect('test-app')).rejects.toThrow( `${name} extension not found or not enabled.` - ) - }) + ); + }); it('should throw error when injectedWeb3 not found', async () => { Object.defineProperty(globalThis, 'window', { value: { injectedWeb3: { 'other-wallet': { enable: vi.fn() }, - 'another-wallet': { enable: vi.fn() } - } + 'another-wallet': { enable: vi.fn() }, + }, }, writable: true, configurable: true, - }) + }); await expect(connector.connect('test-app')).rejects.toThrow( `${name} extension not found or not enabled.` - ) - }) + ); + }); it('should throw error when enable fails', async () => { - mockInjectedWeb3[actualInjectorId].enable.mockResolvedValue(null) + mockInjectedWeb3[actualInjectorId].enable.mockResolvedValue(null); await expect(connector.connect('test-app')).rejects.toThrow( `Failed to enable the '${id}' extension.` - ) - }) + ); + }); it('should throw error when no accounts found', async () => { - mockInjector.accounts.get.mockResolvedValue([]) + mockInjector.accounts.get.mockResolvedValue([]); await expect(connector.connect('test-app')).rejects.toThrow( `No accounts found in ${name}. Make sure accounts are visible and access is granted.` - ) - }) + ); + }); it('should cleanup on connection failure', async () => { - mockInjectedWeb3[actualInjectorId].enable.mockRejectedValue(new Error('Enable failed')) + mockInjectedWeb3[actualInjectorId].enable.mockRejectedValue(new Error('Enable failed')); - await expect(connector.connect('test-app')).rejects.toThrow('Enable failed') + await expect(connector.connect('test-app')).rejects.toThrow('Enable failed'); - const accounts = await connector.getAccounts() - const signer = await connector.getSigner() - expect(accounts).toEqual([]) - expect(signer).toBeUndefined() - }) + const accounts = await connector.getAccounts(); + const signer = await connector.getSigner(); + expect(accounts).toEqual([]); + expect(signer).toBeUndefined(); + }); it('should setup account subscription on successful connection', async () => { - await connector.connect('test-app') - expect(mockInjector.accounts.subscribe).toHaveBeenCalled() - }) + await connector.connect('test-app'); + expect(mockInjector.accounts.subscribe).toHaveBeenCalled(); + }); it('should emit connect event', async () => { - const connectSpy = vi.fn() - connector.on('connect', connectSpy) + const connectSpy = vi.fn(); + connector.on('connect', connectSpy); - await connector.connect('test-app') + await connector.connect('test-app'); expect(connectSpy).toHaveBeenCalledWith([ expect.objectContaining({ - address: TEST_ADDRESS - }) - ]) - }) + address: TEST_ADDRESS, + }), + ]); + }); it('should set correct source metadata for accounts', async () => { - const accounts = await connector.connect('test-app') - accounts.forEach(account => { - expect(account.meta?.source).toBe(id) - }) - }) - }) + const accounts = await connector.connect('test-app'); + accounts.forEach((account) => { + expect(account.meta?.source).toBe(id); + }); + }); + }); describe('message signing', () => { beforeEach(async () => { - mockInjectedWeb3[actualInjectorId].enable.mockResolvedValue(mockInjector) - mockInjector.accounts.get.mockResolvedValue([ - { address: TEST_ADDRESS, name: 'Test' } - ]) - mockInjector.accounts.subscribe.mockReturnValue(() => {}) - await connector.connect('test-app') - }) + mockInjectedWeb3[actualInjectorId].enable.mockResolvedValue(mockInjector); + mockInjector.accounts.get.mockResolvedValue([{ address: TEST_ADDRESS, name: 'Test' }]); + mockInjector.accounts.subscribe.mockReturnValue(() => {}); + await connector.connect('test-app'); + }); it('should sign message successfully', async () => { - mockInjector.signer.signRaw.mockResolvedValue({ signature: '0xsignature123' }) + mockInjector.signer.signRaw.mockResolvedValue({ signature: '0xsignature123' }); - const signature = await connector.signMessage('hello world', TEST_ADDRESS) + const signature = await connector.signMessage('hello world', TEST_ADDRESS); - expect(signature).toBe('0xsignature123') + expect(signature).toBe('0xsignature123'); expect(mockInjector.signer.signRaw).toHaveBeenCalledWith({ address: TEST_ADDRESS, data: expect.any(String), - type: 'bytes' - }) - }) + type: 'bytes', + }); + }); it('should throw error when signing fails', async () => { - mockInjector.signer.signRaw.mockRejectedValue(new Error('User rejected signing')) + mockInjector.signer.signRaw.mockRejectedValue(new Error('User rejected signing')); - await expect( - connector.signMessage('hello', TEST_ADDRESS) - ).rejects.toThrow(`Connector ${id}: Failed to sign message: User rejected signing`) - }) + await expect(connector.signMessage('hello', TEST_ADDRESS)).rejects.toThrow( + `Connector ${id}: Failed to sign message: User rejected signing` + ); + }); it('should throw error when signer not available', async () => { - await connector.disconnect() + await connector.disconnect(); - await expect( - connector.signMessage('hello', TEST_ADDRESS) - ).rejects.toThrow('Signer is not available or does not support signRaw.') - }) + await expect(connector.signMessage('hello', TEST_ADDRESS)).rejects.toThrow( + 'Signer is not available or does not support signRaw.' + ); + }); it('should throw error when signer does not support signRaw', async () => { - const signerWithoutSignRaw = {} - vi.spyOn(connector, 'getSigner').mockResolvedValue(signerWithoutSignRaw as any) + const signerWithoutSignRaw = {}; + vi.spyOn(connector, 'getSigner').mockResolvedValue(signerWithoutSignRaw as any); - await expect( - connector.signMessage('hello', TEST_ADDRESS) - ).rejects.toThrow('Signer is not available or does not support signRaw.') - }) + await expect(connector.signMessage('hello', TEST_ADDRESS)).rejects.toThrow( + 'Signer is not available or does not support signRaw.' + ); + }); it('should return undefined for invalid parameters', async () => { - expect(await connector.signMessage('', TEST_ADDRESS)).toBeUndefined() - expect(await connector.signMessage('hello world', '')).toBeUndefined() - expect(await connector.signMessage(null as any, TEST_ADDRESS)).toBeUndefined() - expect(await connector.signMessage('hello', null as any)).toBeUndefined() - expect(await connector.signMessage(undefined as any, TEST_ADDRESS)).toBeUndefined() - expect(await connector.signMessage('hello', undefined as any)).toBeUndefined() - expect(await connector.signMessage('', '')).toBeUndefined() - expect(await connector.signMessage(null as any, null as any)).toBeUndefined() - }) + expect(await connector.signMessage('', TEST_ADDRESS)).toBeUndefined(); + expect(await connector.signMessage('hello world', '')).toBeUndefined(); + expect(await connector.signMessage(null as any, TEST_ADDRESS)).toBeUndefined(); + expect(await connector.signMessage('hello', null as any)).toBeUndefined(); + expect(await connector.signMessage(undefined as any, TEST_ADDRESS)).toBeUndefined(); + expect(await connector.signMessage('hello', undefined as any)).toBeUndefined(); + expect(await connector.signMessage('', '')).toBeUndefined(); + expect(await connector.signMessage(null as any, null as any)).toBeUndefined(); + }); it('should throw error when signing with unmanaged address', async () => { await expect( connector.signMessage('hello world', 'unmanaged-address-12345') - ).rejects.toThrow(`Address unmanaged-address-12345 is not managed by ${name}.`) - }) + ).rejects.toThrow(`Address unmanaged-address-12345 is not managed by ${name}.`); + }); it('should handle case-insensitive address validation', async () => { - mockInjector.signer.signRaw.mockResolvedValue({ signature: '0xsignature123' }) + mockInjector.signer.signRaw.mockResolvedValue({ signature: '0xsignature123' }); - const upperCaseAddress = TEST_ADDRESS.toUpperCase() - const signature = await connector.signMessage('hello world', upperCaseAddress) + const upperCaseAddress = TEST_ADDRESS.toUpperCase(); + const signature = await connector.signMessage('hello world', upperCaseAddress); - expect(signature).toBe('0xsignature123') - }) - }) + expect(signature).toBe('0xsignature123'); + }); + }); describe('disconnection', () => { it('should cleanup all resources on disconnect', async () => { - mockInjectedWeb3[actualInjectorId].enable.mockResolvedValue(mockInjector) - mockInjector.accounts.get.mockResolvedValue([ - { address: TEST_ADDRESS, name: 'Test' } - ]) - const unsubscribeFn = vi.fn() - mockInjector.accounts.subscribe.mockReturnValue(unsubscribeFn) + mockInjectedWeb3[actualInjectorId].enable.mockResolvedValue(mockInjector); + mockInjector.accounts.get.mockResolvedValue([{ address: TEST_ADDRESS, name: 'Test' }]); + const unsubscribeFn = vi.fn(); + mockInjector.accounts.subscribe.mockReturnValue(unsubscribeFn); - await connector.connect('test-app') - await connector.disconnect() + await connector.connect('test-app'); + await connector.disconnect(); - const accounts = await connector.getAccounts() - const signer = await connector.getSigner() - expect(accounts).toEqual([]) - expect(signer).toBeUndefined() - expect(unsubscribeFn).toHaveBeenCalled() - }) + const accounts = await connector.getAccounts(); + const signer = await connector.getSigner(); + expect(accounts).toEqual([]); + expect(signer).toBeUndefined(); + expect(unsubscribeFn).toHaveBeenCalled(); + }); it('should emit disconnect event', async () => { - const disconnectSpy = vi.fn() - connector.on('disconnect', disconnectSpy) + const disconnectSpy = vi.fn(); + connector.on('disconnect', disconnectSpy); - await connector.disconnect() + await connector.disconnect(); - expect(disconnectSpy).toHaveBeenCalled() - }) - }) + expect(disconnectSpy).toHaveBeenCalled(); + }); + }); describe('account subscription', () => { it('should handle account changes', async () => { - let subscriptionCallback: any + let subscriptionCallback: any; - mockInjectedWeb3[actualInjectorId].enable.mockResolvedValue(mockInjector) - mockInjector.accounts.get.mockResolvedValue([ - { address: TEST_ADDRESS, name: 'Test' } - ]) + mockInjectedWeb3[actualInjectorId].enable.mockResolvedValue(mockInjector); + mockInjector.accounts.get.mockResolvedValue([{ address: TEST_ADDRESS, name: 'Test' }]); mockInjector.accounts.subscribe.mockImplementation((callback: any) => { - subscriptionCallback = callback - return () => {} - }) + subscriptionCallback = callback; + return () => {}; + }); - const accountsChangedSpy = vi.fn() - connector.on('accountsChanged', accountsChangedSpy) + const accountsChangedSpy = vi.fn(); + connector.on('accountsChanged', accountsChangedSpy); - await connector.connect('test-app') + await connector.connect('test-app'); - const newAccounts = [ - { address: TEST_ADDRESS, name: 'Updated Test' } - ] - subscriptionCallback(newAccounts) + const newAccounts = [{ address: TEST_ADDRESS, name: 'Updated Test' }]; + subscriptionCallback(newAccounts); - expect(accountsChangedSpy).toHaveBeenCalled() - }) - }) - } + expect(accountsChangedSpy).toHaveBeenCalled(); + }); + }); + }; } interface WalletConnectTestConfig { @@ -401,16 +391,16 @@ export function createWalletConnectTestSuite( const TEST_CHAINS = [ { genesisHash: '0xe143f23803ac50e8f6f8e62695d1ce9e4e1d68aa36c1cd2cfd15340213f3423e', - name: 'Polkadot' - } + name: 'Polkadot', + }, ] as Chain[]; const TEST_SESSION = { topic: 'test-topic', namespaces: { polkadot: { - accounts: [`polkadot:e143f23803ac50e8f6f8e62695d1ce9e:${TEST_ADDRESS}`] - } - } + accounts: [`polkadot:e143f23803ac50e8f6f8e62695d1ce9e:${TEST_ADDRESS}`], + }, + }, }; const { id, name, icon } = config.expected; @@ -420,7 +410,7 @@ export function createWalletConnectTestSuite( Object.defineProperty(globalThis, 'window', { value: { - location: { origin: 'http://localhost:3000' } + location: { origin: 'http://localhost:3000' }, }, writable: true, configurable: true, @@ -433,20 +423,20 @@ export function createWalletConnectTestSuite( connect: vi.fn(), request: vi.fn(), }, - session: undefined + session: undefined, }; vi.doMock('@walletconnect/universal-provider', () => ({ UniversalProvider: { - init: mockProvider.init - } + init: mockProvider.init, + }, })); mockProvider.init.mockResolvedValue(mockProvider); connector = config.getConnector({ projectId: TEST_PROJECT_ID, - relayUrl: 'wss://relay.walletconnect.com' + relayUrl: 'wss://relay.walletconnect.com', }); vi.clearAllMocks(); @@ -483,18 +473,18 @@ export function createWalletConnectTestSuite( describe('connection flow', () => { it('should throw error when projectId missing', async () => { const connectorWithoutProject = config.getConnector({ - projectId: '' + projectId: '', }); - await expect( - connectorWithoutProject.connect('test-app', TEST_CHAINS) - ).rejects.toThrow(`${name} requires a projectId`); + await expect(connectorWithoutProject.connect('test-app', TEST_CHAINS)).rejects.toThrow( + `${name} requires a projectId` + ); }); it('should throw error when chains missing', async () => { - await expect( - connector.connect('test-app', []) - ).rejects.toThrow(`${name} requires chains configuration`); + await expect(connector.connect('test-app', [])).rejects.toThrow( + `${name} requires chains configuration` + ); }); it('should connect with existing session', async () => { @@ -512,7 +502,7 @@ export function createWalletConnectTestSuite( mockProvider.session = undefined; mockProvider.client!.connect.mockResolvedValue({ uri: 'wc:test-uri@1', - approval: () => Promise.resolve(TEST_SESSION) + approval: () => Promise.resolve(TEST_SESSION), }); const connectSpy = vi.fn(); @@ -526,15 +516,15 @@ export function createWalletConnectTestSuite( projectId: TEST_PROJECT_ID, relayUrl: 'wss://relay.walletconnect.com', metadata: expect.objectContaining({ - name: 'test-app' - }) + name: 'test-app', + }), }); expect(mockProvider.client!.connect).toHaveBeenCalled(); expect(getUriSpy).toHaveBeenCalledWith('wc:test-uri@1'); expect(connectSpy).toHaveBeenCalledWith([ expect.objectContaining({ - address: TEST_ADDRESS - }) + address: TEST_ADDRESS, + }), ]); expect(accounts).toHaveLength(1); expect(accounts[0].address).toBe(TEST_ADDRESS); @@ -550,7 +540,7 @@ export function createWalletConnectTestSuite( mockProvider.session = undefined; mockProvider.client!.connect.mockResolvedValue({ uri: 'wc:test-uri@1', - approval: () => Promise.resolve(TEST_SESSION) + approval: () => Promise.resolve(TEST_SESSION), }); const connectPromise = connector.connect('test-app', TEST_CHAINS); @@ -574,25 +564,6 @@ export function createWalletConnectTestSuite( expect(accounts).toHaveLength(1); expect(accounts[0].address).toBe(TEST_ADDRESS); }); - - it('should update accounts for specific chain', async () => { - const updatedAccounts = await connector.updateAccountsForChain?.( - '0xe143f23803ac50e8f6f8e62695d1ce9e4e1d68aa36c1cd2cfd15340213f3423e' - ); - - expect(updatedAccounts).toHaveLength(1); - expect(updatedAccounts![0].address).toBe(TEST_ADDRESS); - }); - - it('should throw error when updating accounts without connection', async () => { - const unconnectedConnector = config.getConnector({ - projectId: TEST_PROJECT_ID - }); - - await expect( - unconnectedConnector.updateAccountsForChain?.('test-chain-id') - ).rejects.toThrow('WalletConnect not connected'); - }); }); describe('signing', () => { @@ -603,7 +574,7 @@ export function createWalletConnectTestSuite( it('should sign message successfully', async () => { mockProvider.client!.request.mockResolvedValue({ - signature: '0xtest-signature' + signature: '0xtest-signature', }); const signature = await connector.signMessage('hello world', TEST_ADDRESS); @@ -617,9 +588,9 @@ export function createWalletConnectTestSuite( params: { address: TEST_ADDRESS, message: 'hello world', - type: 'bytes' - } - } + type: 'bytes', + }, + }, }); }); @@ -632,7 +603,7 @@ export function createWalletConnectTestSuite( it('should sign transaction payload', async () => { mockProvider.client!.request.mockResolvedValue({ - signature: '0xtest-tx-signature' + signature: '0xtest-tx-signature', }); const signer = await connector.getSigner(); @@ -645,7 +616,7 @@ export function createWalletConnectTestSuite( transactionVersion: '0x01', blockHash: '0xabc', blockNumber: '0x123', - era: '0x00' + era: '0x00', }; const result = await signer!.signPayload(mockPayload); @@ -658,18 +629,18 @@ export function createWalletConnectTestSuite( method: 'polkadot_signTransaction', params: { address: TEST_ADDRESS, - transactionPayload: mockPayload - } - } + transactionPayload: mockPayload, + }, + }, }); }); it('should throw error when signing without connection', async () => { await connector.disconnect(); - await expect( - connector.signMessage('hello', TEST_ADDRESS) - ).rejects.toThrow('Provider not initialized or not connected'); + await expect(connector.signMessage('hello', TEST_ADDRESS)).rejects.toThrow( + 'Provider not initialized or not connected' + ); }); }); diff --git a/packages/core/src/connectors/walletconnect.test.ts b/packages/core/src/connectors/walletconnect.test.ts index 3621c8e..0a71b65 100644 --- a/packages/core/src/connectors/walletconnect.test.ts +++ b/packages/core/src/connectors/walletconnect.test.ts @@ -1,9 +1,10 @@ import { describe } from 'vitest'; -import { walletConnectConnector } from './walletconnect'; -import { createWalletConnectTestSuite } from './test-helper'; import { walletconnectWallet } from '../config/logos/generated'; +import { createWalletConnectTestSuite } from './test-helper'; +import { walletConnectConnector } from './walletconnect'; -describe('WalletConnectConnector', +describe( + 'WalletConnectConnector', createWalletConnectTestSuite({ getConnector: walletConnectConnector, expected: { diff --git a/packages/core/src/connectors/walletconnect.ts b/packages/core/src/connectors/walletconnect.ts index a7264bd..9f5cff9 100644 --- a/packages/core/src/connectors/walletconnect.ts +++ b/packages/core/src/connectors/walletconnect.ts @@ -1,10 +1,17 @@ -import { BaseConnector } from './base'; +import { type SessionTypes, SignClientTypes } from '@walletconnect/types'; import type { IUniversalProvider, Metadata } from '@walletconnect/universal-provider'; -import { SessionTypes, SignClientTypes } from '@walletconnect/types' -import type { Account, Chain, Signer, WalletConnectConnectorOptions } from '../types'; +import type { SignerPayloadJSON, SignerPayloadRaw, SignerResult } from 'dedot/types'; import { walletconnectWallet } from '../config/logos/generated'; -import { SignerResult, SignerPayloadJSON } from 'dedot/types' -import { ConnectorLinks } from '../types' +import type { + Account, + Chain, + ConnectorLinks, + HexString, + Signer, + WalletConnectConnectorOptions, +} from '../types'; +import { isSameAddress } from '../utils'; +import { BaseConnector } from './base'; export class WalletConnectConnector extends BaseConnector { readonly id: string; @@ -16,9 +23,10 @@ export class WalletConnectConnector extends BaseConnector { private projectId: string; private relayUrl: string; private metadata?: Metadata; + private supportedChains: HexString[] = []; private session?: SessionTypes.Struct; - private connectedChains?: Chain[]; + private connectedChains?: Chain[] | HexString[]; private unsubscribe: (() => void) | null = null; @@ -33,6 +41,7 @@ export class WalletConnectConnector extends BaseConnector { this.projectId = options.projectId; this.relayUrl = options.relayUrl || 'wss://relay.walletconnect.com'; this.metadata = options.metadata; + this.supportedChains = options.supportedChains || []; } public isInstalled(): boolean { @@ -43,22 +52,33 @@ export class WalletConnectConnector extends BaseConnector { return true; } - private convertChainIdToCaipId(chains: Chain[]): string[] { - return chains.map(chain => `polkadot:${chain.genesisHash.replace('0x', '').slice(0, 32)}`); + private convertChainIdToCaipId(chains: Chain[] | HexString[]): `polkadot:${string}`[] { + return chains.map((chain) => { + const capid: HexString = (chain as Chain).genesisHash || chain; + return `polkadot:${capid.replace('0x', '').slice(0, 32)}` as `polkadot:${string}`; + }); } - public async connect(appName: string, chains?: Chain[], targetChainId?: string): Promise> { + public async connect(appName: string, chains?: Chain[]): Promise> { if (!this.projectId) { - throw new Error(`${this.name} requires a projectId. Please visit https://cloud.walletconnect.com to get one.`); + throw new Error( + `${this.name} requires a projectId. Please visit https://cloud.walletconnect.com to get one.` + ); } - if (!chains || chains.length === 0) { + const effectiveChains = chains?.length + ? chains + : this.supportedChains.length + ? this.supportedChains + : undefined; + + if (!effectiveChains || effectiveChains.length === 0) { throw new Error(`${this.name} requires chains configuration.`); } - this.connectedChains = chains; + this.connectedChains = effectiveChains; - const { UniversalProvider } = await import("@walletconnect/universal-provider"); + const { UniversalProvider } = await import('@walletconnect/universal-provider'); try { this.provider = await UniversalProvider.init({ @@ -72,11 +92,9 @@ export class WalletConnectConnector extends BaseConnector { }, }); - const chainIdToUse = targetChainId || chains[0].genesisHash; - if (this.provider.session) { this.session = this.provider.session; - const accounts = this.getAccountsFromSession(chains, chainIdToUse); + const accounts = this.getAccountsFromSession(effectiveChains); this.accounts = accounts; await this.startSubscription(); @@ -86,21 +104,31 @@ export class WalletConnectConnector extends BaseConnector { } if (!this.provider?.client) { - throw new Error("Provider not initialized or not connected"); + throw new Error('Provider not initialized or not connected'); } const { uri, approval } = await this.provider.client.connect({ requiredNamespaces: { polkadot: { - methods: ['polkadot_signMessage', 'polkadot_sendTransaction', 'polkadot_signTransaction', 'polkadot_requestAccounts'], - chains: this.convertChainIdToCaipId(chains), + methods: [ + 'polkadot_signMessage', + 'polkadot_sendTransaction', + 'polkadot_signTransaction', + 'polkadot_requestAccounts', + ], + chains: this.convertChainIdToCaipId(effectiveChains), events: ['accountsChanged', 'chainChanged', 'connect'], }, }, optionalNamespaces: { polkadot: { - methods: ['polkadot_signMessage', 'polkadot_sendTransaction', 'polkadot_signTransaction', 'polkadot_requestAccounts'], - chains: this.convertChainIdToCaipId(chains), + methods: [ + 'polkadot_signMessage', + 'polkadot_sendTransaction', + 'polkadot_signTransaction', + 'polkadot_requestAccounts', + ], + chains: this.convertChainIdToCaipId(effectiveChains), events: ['accountsChanged', 'chainChanged', 'connect'], }, }, @@ -114,7 +142,7 @@ export class WalletConnectConnector extends BaseConnector { this.connectionUri = undefined; - const accounts = this.getAccountsFromSession(chains, chainIdToUse); + const accounts = this.getAccountsFromSession(effectiveChains); this.accounts = accounts; // 启动订阅 @@ -122,46 +150,48 @@ export class WalletConnectConnector extends BaseConnector { this.emit('connect', [...this.accounts]); return [...this.accounts]; - } catch (error) { this.connectionUri = undefined; throw error; } } - private getAccountsFromSession(chains: Chain[], chainId: string): Account[] { - const targetChain = chains.filter(chain => chain.genesisHash.toLowerCase() === chainId.toLowerCase()) + private getAccountsFromSession(chains: Chain[] | HexString[]): Account[] { + const targetChain = [(chains[0] as Chain).genesisHash || chains[0]] as HexString[] | Chain[]; + // ? (chains as Chain[]).filter(chain => chain.genesisHash.toLowerCase() === chainId.toLowerCase()) + // : (chains as string[]).filter(chain => chain.toLowerCase() === chainId.toLowerCase()) const caipId = this.convertChainIdToCaipId(targetChain)[0]; let rawAccounts = this.session?.namespaces.polkadot.accounts .flat() .filter((address: string) => address.includes(caipId)) - .map((address: string) => address.replace(`${caipId}:`, "")) + .map((address: string) => address.replace(`${caipId}:`, '')); if (rawAccounts && rawAccounts.length === 0) { - console.error(`No accounts found for the specified chain, please connect to the correct chain`); + console.error( + `No accounts found for the specified chain, please connect to the correct chain` + ); const caipId = this.convertChainIdToCaipId(chains)[0]; rawAccounts = this.session?.namespaces.polkadot.accounts .flat() .filter((address: string) => address.includes(caipId)) - .map((address: string) => address.replace(`${caipId}:`, "")) + .map((address: string) => address.replace(`${caipId}:`, '')); } - const result = rawAccounts! - .map((address: string) => ({ - address, - name: `${this.name} Account`, - meta: { - source: this.id, - }, - publicKey: undefined, - })); + const result = rawAccounts!.map((address: string) => ({ + address, + name: `${this.name} Account`, + meta: { + source: this.id, + }, + publicKey: undefined, + })); this.emit('accountsChanged', [...result]); - return result! + return result!; } public async disconnect(): Promise { @@ -171,40 +201,28 @@ export class WalletConnectConnector extends BaseConnector { await this.provider.disconnect(), new Promise((_, reject) => setTimeout(() => reject(new Error('Disconnect timeout')), 5000) - ) + ), ]); } - } catch (e) { - } + } catch (e) {} - await this.cleanup() + await this.cleanup(); this.emit('disconnect'); } - public async signMessage(message: string, address: string, chainId?: string): Promise { + public async signMessage(message: string, address: string): Promise { if (!this.provider?.client || !this.session?.topic) { - throw new Error("Provider not initialized or not connected"); + throw new Error('Provider not initialized or not connected'); } - const targetChainId = chainId - ? `polkadot:${chainId.replace('0x', '').slice(0, 32)}` - : this.convertChainIdToCaipId(this.connectedChains!)[0] - try { - const result = await this.provider.client.request({ - topic: this.session.topic, - chainId: targetChainId, - request: { - method: 'polkadot_signMessage', - params: { - address, - message, - type: 'bytes' - }, - }, - }); + const signer = await this.getSigner(); + if (!signer) { + throw new Error('No signer provided'); + } - return (result as any)?.signature; + const { signature } = await signer.signRaw!({ address, data: message, type: 'bytes' }); + return signature; } catch (error) { console.error('Sign message error:', error); throw error; @@ -212,7 +230,7 @@ export class WalletConnectConnector extends BaseConnector { } public hasConnectionUri(): boolean { - return true + return true; } public async getConnectionUri(): Promise { @@ -228,40 +246,74 @@ export class WalletConnectConnector extends BaseConnector { }); } - public async updateAccountsForChain(chainId: string) { - if (!this.connectedChains) { - throw new Error('WalletConnect not connected'); - } - - const newAccounts = this.getAccountsFromSession(this.connectedChains, chainId); - this.accounts = newAccounts; - - return newAccounts; - } - - public async getSigner(): Promise { if (!this.provider?.client || !this.session) return undefined; return { signPayload: async (payload: SignerPayloadJSON): Promise => { - try { - const result = await this.provider?.client?.request<{ signature: string }>({ - topic: this.session!.topic, - chainId: `polkadot:${payload.genesisHash.replace('0x', '').slice(0, 32)}`, - request: { - method: 'polkadot_signTransaction', - params: { - address: payload.address, - transactionPayload: payload, - }, + const chainCaipId = `polkadot:${payload.genesisHash.replace('0x', '').slice(0, 32)}`; + const sessionAccounts = this.session!.namespaces.polkadot.accounts; + + const chainAccount = sessionAccounts.find((acc) => { + const address = acc.replace(`${chainCaipId}:`, ''); + + return acc.includes(chainCaipId) && isSameAddress(payload.address, address); + }); + + if (!chainAccount) { + throw new Error(`Chain ${payload.genesisHash} is not supported by the wallet.}`); + } + + const chainAddress = chainAccount.replace(`${chainCaipId}:`, ''); + + const updatedPayload = { ...payload, address: chainAddress }; + + const result = await this.provider?.client?.request<{ signature: string }>({ + topic: this.session!.topic, + chainId: `polkadot:${updatedPayload.genesisHash.replace('0x', '').slice(0, 32)}`, + request: { + method: 'polkadot_signTransaction', + params: { + address: chainAddress, + transactionPayload: updatedPayload, }, - }); - return result as SignerResult; - } catch (error) { - throw new Error(`Transaction signing failed: ${JSON.stringify(error)}`); + }, + }); + return result as SignerResult; + }, + signRaw: async (payload: SignerPayloadRaw): Promise => { + const chainCaipId = this.convertChainIdToCaipId(this.connectedChains!)[0]; + + const sessionAccounts = this.session!.namespaces.polkadot.accounts; + + const chainAccount = sessionAccounts.find((acc) => { + const address = acc.replace(`${chainCaipId}:`, ''); + + return acc.includes(chainCaipId) && isSameAddress(payload.address, address); + }); + + if (!chainAccount) { + throw new Error(`No accounts available for chain ${chainCaipId}`); } - } + const chainAddress = chainAccount.replace(`${chainCaipId}:`, ''); + + const updatedPayload = { ...payload, address: chainAddress }; + + const result: SignerResult = await this.provider!.client!.request({ + topic: this.session!.topic, + chainId: chainCaipId, + request: { + method: 'polkadot_signMessage', + params: { + address: chainAddress, + message: updatedPayload.data, + type: updatedPayload.type, + }, + }, + }); + + return result; + }, }; } @@ -275,15 +327,14 @@ export class WalletConnectConnector extends BaseConnector { try { const sessionDeleteHandler = async () => { console.log(`Connector ${this.id}: Session deleted, disconnecting...`); - await this.cleanup() + await this.cleanup(); this.emit('disconnect'); - } + }; this.provider.client.on('session_delete', sessionDeleteHandler); this.unsubscribe = () => { - this.provider?.client?.off('session_delete', sessionDeleteHandler) - } - + this.provider?.client?.off('session_delete', sessionDeleteHandler); + }; } catch (error) { this.unsubscribe = null; } diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 043bb22..f03c228 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -1,3 +1 @@ -export * from './config' - - +export * from './config'; diff --git a/packages/core/src/types/account.ts b/packages/core/src/types/account.ts index 904690e..2e36141 100644 --- a/packages/core/src/types/account.ts +++ b/packages/core/src/types/account.ts @@ -1,5 +1,6 @@ -import type { HexString } from 'dedot/utils' -import type { KeypairType } from 'dedot/types' +import type { KeypairType } from 'dedot/types'; + +export type HexString = `0x${string}`; /** * Polkadot account interface @@ -35,7 +36,7 @@ export interface Account { /** other custom metadata */ [key: string]: any; }; - type?: KeypairType + type?: KeypairType; } /** diff --git a/packages/core/src/types/chain.ts b/packages/core/src/types/chain.ts index d64f206..cc179f3 100644 --- a/packages/core/src/types/chain.ts +++ b/packages/core/src/types/chain.ts @@ -1,5 +1,7 @@ +import type { HexString } from './account'; + export interface Chain { - genesisHash: string; + genesisHash: HexString; name: string; @@ -21,8 +23,7 @@ export interface Chain { [key: string]: { name: string; url: string } | undefined; }; - testnet: boolean; - chainIconUrl: string + chainIconUrl: string; } diff --git a/packages/core/src/types/config.ts b/packages/core/src/types/config.ts index 264b42c..2a716ec 100644 --- a/packages/core/src/types/config.ts +++ b/packages/core/src/types/config.ts @@ -1,7 +1,7 @@ -import type { Chain } from './chain'; -import type { Connector } from './connector'; import type { ApiOptions } from 'dedot'; import type { AnyShape } from 'dedot/shape'; +import type { Chain } from './chain'; +import type { Connector } from './connector'; export interface RawStorage { getItem(key: string): string | null | Promise; @@ -18,17 +18,14 @@ export interface LunoStorage { // export type Transport = WsProvider; export type Transport = string; -type LunoApiOptions = Partial> & { +type LunoApiOptions = Partial> & { customTypes?: Record; customRpc?: Record; }; export interface CreateConfigParameters extends LunoApiOptions { appName?: string; - chains: readonly Chain[]; + chains?: readonly Chain[]; connectors: Connector[]; transports?: Record; @@ -44,4 +41,3 @@ export interface Config extends LunoApiOptions { readonly storage: LunoStorage; readonly autoConnect: boolean; } - diff --git a/packages/core/src/types/connector.ts b/packages/core/src/types/connector.ts index 8db4ff4..cc7f8bb 100644 --- a/packages/core/src/types/connector.ts +++ b/packages/core/src/types/connector.ts @@ -1,8 +1,8 @@ +import type { Metadata } from '@walletconnect/universal-provider'; import type { EventEmitter } from 'eventemitter3'; -import type { Account } from './account'; +import type { Account, HexString } from './account'; +import type { Chain } from './chain'; import type { Signer } from './signer'; -import type { Chain } from './chain' -import type { Metadata } from '@walletconnect/universal-provider' export interface ConnectorLinks { browserExtension?: string; @@ -16,14 +16,17 @@ export interface Connector extends EventEmitter { readonly links: ConnectorLinks; isAvailable(): Promise; isInstalled: () => boolean; - connect(appName: string, chains?: Chain[], targetChainId?: string): Promise; + connect( + appName: string, + chains?: Chain[], + targetChainId?: string + ): Promise; disconnect(): Promise; getAccounts(): Promise>; getSigner(): Promise; - signMessage(message: string, address: string, chainId?: string): Promise; + signMessage(message: string, address: string): Promise; hasConnectionUri(): boolean; getConnectionUri(): Promise; - updateAccountsForChain(chainId: string): Promise; on(event: 'connect', listener: (accounts: Account[]) => void): this; on(event: 'disconnect', listener: () => void): this; on(event: 'accountsChanged', listener: (accounts: Account[]) => void): this; @@ -42,4 +45,5 @@ export interface WalletConnectConnectorOptions { relayUrl?: string; metadata?: Metadata; links?: ConnectorLinks; + supportedChains?: HexString[]; } diff --git a/packages/core/src/types/global.d.ts b/packages/core/src/types/global.d.ts index 2c13374..f332b19 100644 --- a/packages/core/src/types/global.d.ts +++ b/packages/core/src/types/global.d.ts @@ -2,14 +2,15 @@ import { Injected } from 'dedot/types'; declare global { interface Window { - injectedWeb3?: Record Promise; - version: string; - }>; + injectedWeb3?: Record< + string, + { + enable: (appName: string) => Promise; + version: string; + } + >; walletExtension: { isNovaWallet: boolean; - } + }; } } - -export {}; diff --git a/packages/core/src/types/index.ts b/packages/core/src/types/index.ts index e1489d4..2610e36 100644 --- a/packages/core/src/types/index.ts +++ b/packages/core/src/types/index.ts @@ -1,9 +1,6 @@ -export * from './chain'; - export * from './account'; - -export * from './connector'; - +export * from './chain'; export * from './config'; +export * from './connector'; -export * from './signer' +export * from './signer'; diff --git a/packages/core/src/types/signer.ts b/packages/core/src/types/signer.ts index 7555471..93ea7f8 100644 --- a/packages/core/src/types/signer.ts +++ b/packages/core/src/types/signer.ts @@ -1,3 +1,6 @@ -import { InjectedSigner } from 'dedot/types' +import type { PolkadotSigner as PapiSigner } from '@polkadot-api/pjs-signer'; +import type { InjectedSigner } from 'dedot/types'; -export interface Signer extends InjectedSigner {} +interface Signer extends InjectedSigner {} + +export type { PapiSigner, Signer }; diff --git a/packages/core/src/utils/address.test.ts b/packages/core/src/utils/address.test.ts index 6386b8b..ab41699 100644 --- a/packages/core/src/utils/address.test.ts +++ b/packages/core/src/utils/address.test.ts @@ -1,181 +1,189 @@ -import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest' -import { isValidAddress, convertAddress, isSameAddress, getPublicKey, mapInjectedAccounts } from './address' -import { InjectedAccount } from 'dedot/types' +import type { InjectedAccount } from 'dedot/types'; +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; +import { + convertAddress, + getPublicKey, + isSameAddress, + isValidAddress, + mapInjectedAccounts, +} from './address'; describe('address utils', () => { describe('isValidAddress', () => { it('should return true for valid Polkadot address', () => { - const validAddress = '1FRMM8PEiWXYax7rpS6X4XZX1aAAxSWx1CrKTyrVYhV24fg' - expect(isValidAddress(validAddress)).toBe(true) - }) + const validAddress = '1FRMM8PEiWXYax7rpS6X4XZX1aAAxSWx1CrKTyrVYhV24fg'; + expect(isValidAddress(validAddress)).toBe(true); + }); it('should return true for valid Kusama address', () => { - const validAddress = 'CpjsLDC1JFyrhm3ftC9Gs4QoyrkHKhZKtK7YqGTRFtTafgp' - expect(isValidAddress(validAddress)).toBe(true) - }) + const validAddress = 'CpjsLDC1JFyrhm3ftC9Gs4QoyrkHKhZKtK7YqGTRFtTafgp'; + expect(isValidAddress(validAddress)).toBe(true); + }); it('should return false for invalid address', () => { - expect(isValidAddress(' ')).toBe(false) - expect(isValidAddress('\n\t')).toBe(false) + expect(isValidAddress(' ')).toBe(false); + expect(isValidAddress('\n\t')).toBe(false); - expect(isValidAddress('123')).toBe(false) - expect(isValidAddress('a'.repeat(100))).toBe(false) - expect(isValidAddress('1FRMM8PEiWXYax7rpS6X4XZX1aAAxSWx1CrKTyrVYhV24fg@')).toBe(false) + expect(isValidAddress('123')).toBe(false); + expect(isValidAddress('a'.repeat(100))).toBe(false); + expect(isValidAddress('1FRMM8PEiWXYax7rpS6X4XZX1aAAxSWx1CrKTyrVYhV24fg@')).toBe(false); - expect(isValidAddress('0x4838b106fce9647bdf1e7877bf73ce8b0bad5f97')).toBe(false) - }) - }) + expect(isValidAddress('0x4838b106fce9647bdf1e7877bf73ce8b0bad5f97')).toBe(false); + }); + }); describe('convertAddress', () => { it('should convert address between different SS58 formats', () => { - const polkadotAddress = '1FRMM8PEiWXYax7rpS6X4XZX1aAAxSWx1CrKTyrVYhV24fg' - const kusamaFormat = convertAddress(polkadotAddress, 2) + const polkadotAddress = '1FRMM8PEiWXYax7rpS6X4XZX1aAAxSWx1CrKTyrVYhV24fg'; + const kusamaFormat = convertAddress(polkadotAddress, 2); - expect(kusamaFormat).toBeDefined() - expect(kusamaFormat).not.toBe(polkadotAddress) - expect(isValidAddress(kusamaFormat)).toBe(true) - }) + expect(kusamaFormat).toBeDefined(); + expect(kusamaFormat).not.toBe(polkadotAddress); + expect(isValidAddress(kusamaFormat)).toBe(true); + }); it('should throw error for invalid address', () => { - expect(() => convertAddress('invalid', 0)) - .toThrow('Failed to convert address') - expect(() => convertAddress('0x4838b106fce9647bdf1e7877bf73ce8b0bad5f97', 0)) - .toThrow('Failed to convert address') - expect(() => convertAddress('', 0)) - .toThrow('Failed to convert address') - }) + expect(() => convertAddress('invalid', 0)).toThrow('Failed to convert address'); + expect(() => convertAddress('0x4838b106fce9647bdf1e7877bf73ce8b0bad5f97', 0)).toThrow( + 'Failed to convert address' + ); + expect(() => convertAddress('', 0)).toThrow('Failed to convert address'); + }); it('should throw error for invalid SS58 format', () => { - const validAddress = '1FRMM8PEiWXYax7rpS6X4XZX1aAAxSWx1CrKTyrVYhV24fg' + const validAddress = '1FRMM8PEiWXYax7rpS6X4XZX1aAAxSWx1CrKTyrVYhV24fg'; - expect(() => convertAddress(validAddress, -1)) - .toThrow('Failed to convert address') - expect(() => convertAddress(validAddress, 99999)) - .toThrow('Failed to convert address') - }) - }) + expect(() => convertAddress(validAddress, -1)).toThrow('Failed to convert address'); + expect(() => convertAddress(validAddress, 99999)).toThrow('Failed to convert address'); + }); + }); describe('isSameAddress', () => { it('should return true for same address in different formats', () => { - const polkadotAddr = '1FRMM8PEiWXYax7rpS6X4XZX1aAAxSWx1CrKTyrVYhV24fg' - const kusamaAddr = convertAddress(polkadotAddr, 2) + const polkadotAddr = '1FRMM8PEiWXYax7rpS6X4XZX1aAAxSWx1CrKTyrVYhV24fg'; + const kusamaAddr = convertAddress(polkadotAddr, 2); - expect(isSameAddress(polkadotAddr, kusamaAddr)).toBe(true) - }) + expect(isSameAddress(polkadotAddr, kusamaAddr)).toBe(true); + }); it('should return false for different addresses', () => { - const addr1 = '1FRMM8PEiWXYax7rpS6X4XZX1aAAxSWx1CrKTyrVYhV24fg' - const addr2 = '12xtAYsRUrmbniiWQqJtECiBQrMn8AypQcXhnQAc6RB6XkLW' + const addr1 = '1FRMM8PEiWXYax7rpS6X4XZX1aAAxSWx1CrKTyrVYhV24fg'; + const addr2 = '12xtAYsRUrmbniiWQqJtECiBQrMn8AypQcXhnQAc6RB6XkLW'; - expect(isSameAddress(addr1, addr2)).toBe(false) - }) + expect(isSameAddress(addr1, addr2)).toBe(false); + }); it('should handle invalid addresses gracefully', () => { - expect(isSameAddress('invalid1', 'invalid2')).toBe(false) - }) - }) + expect(isSameAddress('invalid1', 'invalid2')).toBe(false); + }); + }); describe('getPublicKey', () => { describe('valid addresses', () => { it('should extract 32-byte public key from valid Polkadot address', () => { - const address = '1FRMM8PEiWXYax7rpS6X4XZX1aAAxSWx1CrKTyrVYhV24fg' - const publicKey = getPublicKey(address) + const address = '1FRMM8PEiWXYax7rpS6X4XZX1aAAxSWx1CrKTyrVYhV24fg'; + const publicKey = getPublicKey(address); - expect(publicKey).toBeInstanceOf(Uint8Array) - expect(publicKey.length).toBe(32) - }) + expect(publicKey).toBeInstanceOf(Uint8Array); + expect(publicKey.length).toBe(32); + }); it('should extract public key from valid Kusama address', () => { - const address = 'CpjsLDC1JFyrhm3ftC9Gs4QoyrkHKhZKtK7YqGTRFtTafgp' - const publicKey = getPublicKey(address) + const address = 'CpjsLDC1JFyrhm3ftC9Gs4QoyrkHKhZKtK7YqGTRFtTafgp'; + const publicKey = getPublicKey(address); - expect(publicKey).toBeInstanceOf(Uint8Array) - expect(publicKey.length).toBe(32) - }) - }) + expect(publicKey).toBeInstanceOf(Uint8Array); + expect(publicKey.length).toBe(32); + }); + }); describe('consistency across different formats', () => { it('should return same public key for same address in different SS58 formats', () => { - const polkadotAddr = '1FRMM8PEiWXYax7rpS6X4XZX1aAAxSWx1CrKTyrVYhV24fg' - const kusamaAddr = convertAddress(polkadotAddr, 2) - const westendAddr = convertAddress(polkadotAddr, 42) + const polkadotAddr = '1FRMM8PEiWXYax7rpS6X4XZX1aAAxSWx1CrKTyrVYhV24fg'; + const kusamaAddr = convertAddress(polkadotAddr, 2); + const westendAddr = convertAddress(polkadotAddr, 42); - const publicKey1 = getPublicKey(polkadotAddr) - const publicKey2 = getPublicKey(kusamaAddr) - const publicKey3 = getPublicKey(westendAddr) + const publicKey1 = getPublicKey(polkadotAddr); + const publicKey2 = getPublicKey(kusamaAddr); + const publicKey3 = getPublicKey(westendAddr); - expect(publicKey1).toEqual(publicKey2) - expect(publicKey2).toEqual(publicKey3) - expect(publicKey1).toEqual(publicKey3) + expect(publicKey1).toEqual(publicKey2); + expect(publicKey2).toEqual(publicKey3); + expect(publicKey1).toEqual(publicKey3); - expect(Array.from(publicKey1)).toEqual(Array.from(publicKey2)) - expect(Array.from(publicKey2)).toEqual(Array.from(publicKey3)) - }) + expect(Array.from(publicKey1)).toEqual(Array.from(publicKey2)); + expect(Array.from(publicKey2)).toEqual(Array.from(publicKey3)); + }); it('should return identical public key for same address across all supported formats', () => { - const baseAddress = '1FRMM8PEiWXYax7rpS6X4XZX1aAAxSWx1CrKTyrVYhV24fg' - const formats = [0, 2, 42] + const baseAddress = '1FRMM8PEiWXYax7rpS6X4XZX1aAAxSWx1CrKTyrVYhV24fg'; + const formats = [0, 2, 42]; - const publicKeys = formats.map(format => { - const convertedAddr = convertAddress(baseAddress, format) - return getPublicKey(convertedAddr) - }) + const publicKeys = formats.map((format) => { + const convertedAddr = convertAddress(baseAddress, format); + return getPublicKey(convertedAddr); + }); for (let i = 1; i < publicKeys.length; i++) { - expect(publicKeys[i]).toEqual(publicKeys[0]) - expect(Array.from(publicKeys[i])).toEqual(Array.from(publicKeys[0])) + expect(publicKeys[i]).toEqual(publicKeys[0]); + expect(Array.from(publicKeys[i])).toEqual(Array.from(publicKeys[0])); } - }) - }) + }); + }); describe('error handling', () => { it('should throw error for invalid address', () => { - expect(() => getPublicKey('invalid')).toThrow('Failed to get public key') - expect(() => getPublicKey('123')).toThrow('Failed to get public key') - expect(() => getPublicKey('this-is-definitely-invalid')).toThrow('Failed to get public key') - }) + expect(() => getPublicKey('invalid')).toThrow('Failed to get public key'); + expect(() => getPublicKey('123')).toThrow('Failed to get public key'); + expect(() => getPublicKey('this-is-definitely-invalid')).toThrow( + 'Failed to get public key' + ); + }); it('should handle ethereum addresses appropriately', () => { - const ethAddress = '0x4838b106fce9647bdf1e7877bf73ce8b0bad5f97' - expect(() => getPublicKey(ethAddress)).toThrow('Invalid public key length: expected 32 bytes') - }) + const ethAddress = '0x4838b106fce9647bdf1e7877bf73ce8b0bad5f97'; + expect(() => getPublicKey(ethAddress)).toThrow( + 'Invalid public key length: expected 32 bytes' + ); + }); it('should throw error for malformed addresses', () => { - expect(() => getPublicKey('1FRMM8PEiWXYax7rpS6X4XZX1aAAxSWx1CrKTyrVYhV24fg@')) - .toThrow('Failed to get public key') + expect(() => getPublicKey('1FRMM8PEiWXYax7rpS6X4XZX1aAAxSWx1CrKTyrVYhV24fg@')).toThrow( + 'Failed to get public key' + ); - expect(() => getPublicKey('1FRMM8PEiWXYax7rpS6X4XZX1aAAxSWx1CrKTyrVYhV24fg123')) - .toThrow('Failed to get public key') + expect(() => getPublicKey('1FRMM8PEiWXYax7rpS6X4XZX1aAAxSWx1CrKTyrVYhV24fg123')).toThrow( + 'Failed to get public key' + ); - expect(() => getPublicKey('!@#$%^&*()')).toThrow('Failed to get public key') - }) - - }) + expect(() => getPublicKey('!@#$%^&*()')).toThrow('Failed to get public key'); + }); + }); describe('public key properties', () => { it('should return immutable Uint8Array', () => { - const address = '1FRMM8PEiWXYax7rpS6X4XZX1aAAxSWx1CrKTyrVYhV24fg' - const publicKey = getPublicKey(address) + const address = '1FRMM8PEiWXYax7rpS6X4XZX1aAAxSWx1CrKTyrVYhV24fg'; + const publicKey = getPublicKey(address); - const originalFirst = publicKey[0] - publicKey[0] = 0 + const originalFirst = publicKey[0]; + publicKey[0] = 0; - const publicKey2 = getPublicKey(address) - expect(publicKey2[0]).toBe(originalFirst) - }) - }) - }) + const publicKey2 = getPublicKey(address); + expect(publicKey2[0]).toBe(originalFirst); + }); + }); + }); describe('mapInjectedAccounts', () => { - let consoleErrorSpy: any + let consoleErrorSpy: any; beforeEach(() => { - consoleErrorSpy = vi.spyOn(console, 'error').mockImplementation(() => {}) - }) + consoleErrorSpy = vi.spyOn(console, 'error').mockImplementation(() => {}); + }); afterEach(() => { - consoleErrorSpy.mockRestore() - }) + consoleErrorSpy.mockRestore(); + }); describe('valid account mapping', () => { it('should map single valid account correctly', () => { @@ -184,28 +192,28 @@ describe('address utils', () => { address: '1FRMM8PEiWXYax7rpS6X4XZX1aAAxSWx1CrKTyrVYhV24fg', name: 'Test Account', type: 'sr25519', - genesisHash: '0x91b171bb158e2d3848fa23a9f1c25182fb8e20313b2c1eb49219da7a70ce90c3' - } - ] + genesisHash: '0x91b171bb158e2d3848fa23a9f1c25182fb8e20313b2c1eb49219da7a70ce90c3', + }, + ]; - const result = mapInjectedAccounts(injectedAccounts, 'polkadot-js') + const result = mapInjectedAccounts(injectedAccounts, 'polkadot-js'); - expect(result).toHaveLength(1) + expect(result).toHaveLength(1); expect(result[0]).toEqual({ address: '1FRMM8PEiWXYax7rpS6X4XZX1aAAxSWx1CrKTyrVYhV24fg', name: 'Test Account', publicKey: expect.any(String), meta: { source: 'polkadot-js', - genesisHash: '0x91b171bb158e2d3848fa23a9f1c25182fb8e20313b2c1eb49219da7a70ce90c3' + genesisHash: '0x91b171bb158e2d3848fa23a9f1c25182fb8e20313b2c1eb49219da7a70ce90c3', }, - type: 'sr25519' - }) + type: 'sr25519', + }); - expect(result[0].publicKey).toBeDefined() - expect(result[0].publicKey).toMatch(/^0x[0-9a-f]+$/i) - expect(result[0].publicKey?.length).toBe(66) - }) + expect(result[0].publicKey).toBeDefined(); + expect(result[0].publicKey).toMatch(/^0x[0-9a-f]+$/i); + expect(result[0].publicKey?.length).toBe(66); + }); it('should map multiple valid accounts correctly', () => { const injectedAccounts: InjectedAccount[] = [ @@ -213,43 +221,43 @@ describe('address utils', () => { address: '1FRMM8PEiWXYax7rpS6X4XZX1aAAxSWx1CrKTyrVYhV24fg', name: 'Account 1', type: 'sr25519', - genesisHash: '0x91b171bb158e2d3848fa23a9f1c25182fb8e20313b2c1eb49219da7a70ce90c3' + genesisHash: '0x91b171bb158e2d3848fa23a9f1c25182fb8e20313b2c1eb49219da7a70ce90c3', }, { address: 'CpjsLDC1JFyrhm3ftC9Gs4QoyrkHKhZKtK7YqGTRFtTafgp', name: 'Account 2', type: 'ed25519', - genesisHash: '0xb0a8d493285c2df73290dfb7e61f870f17b41801197a149ca93654499ea3dafe' - } - ] + genesisHash: '0xb0a8d493285c2df73290dfb7e61f870f17b41801197a149ca93654499ea3dafe', + }, + ]; - const result = mapInjectedAccounts(injectedAccounts, 'subwallet') + const result = mapInjectedAccounts(injectedAccounts, 'subwallet'); - expect(result).toHaveLength(2) - expect(result[0].meta?.source).toBe('subwallet') - expect(result[1].meta?.source).toBe('subwallet') - expect(result[0].address).toBe(injectedAccounts[0].address) - expect(result[1].address).toBe(injectedAccounts[1].address) - }) - }) + expect(result).toHaveLength(2); + expect(result[0].meta?.source).toBe('subwallet'); + expect(result[1].meta?.source).toBe('subwallet'); + expect(result[0].address).toBe(injectedAccounts[0].address); + expect(result[1].address).toBe(injectedAccounts[1].address); + }); + }); describe('account with missing optional fields', () => { it('should handle account without name', () => { const injectedAccounts: InjectedAccount[] = [ { address: '1FRMM8PEiWXYax7rpS6X4XZX1aAAxSWx1CrKTyrVYhV24fg', - type: 'sr25519' - } - ] + type: 'sr25519', + }, + ]; - const result = mapInjectedAccounts(injectedAccounts, 'test-source') + const result = mapInjectedAccounts(injectedAccounts, 'test-source'); - expect(result).toHaveLength(1) - expect(result[0].name).toBeUndefined() - expect(result[0].meta?.genesisHash).toBeUndefined() - expect(result[0].meta?.source).toBe('test-source') - }) - }) + expect(result).toHaveLength(1); + expect(result[0].name).toBeUndefined(); + expect(result[0].meta?.genesisHash).toBeUndefined(); + expect(result[0].meta?.source).toBe('test-source'); + }); + }); describe('error handling for invalid addresses', () => { it('should handle invalid address gracefully', () => { @@ -257,61 +265,61 @@ describe('address utils', () => { { address: 'invalid-address', name: 'Invalid Account', - type: 'sr25519' - } - ] + type: 'sr25519', + }, + ]; - const result = mapInjectedAccounts(injectedAccounts, 'test-source') + const result = mapInjectedAccounts(injectedAccounts, 'test-source'); - expect(result).toHaveLength(1) + expect(result).toHaveLength(1); expect(result[0]).toEqual({ address: 'invalid-address', name: 'Invalid Account', publicKey: undefined, meta: { source: 'test-source', - genesisHash: undefined + genesisHash: undefined, }, - type: 'sr25519' - }) + type: 'sr25519', + }); expect(consoleErrorSpy).toHaveBeenCalledWith( 'Failed to decode address "invalid-address" to extract public key:', expect.any(Error) - ) - }) + ); + }); it('should handle mixed valid and invalid addresses', () => { const injectedAccounts: InjectedAccount[] = [ { address: '1FRMM8PEiWXYax7rpS6X4XZX1aAAxSWx1CrKTyrVYhV24fg', name: 'Valid Account', - type: 'sr25519' + type: 'sr25519', }, { address: 'invalid-address', name: 'Invalid Account', - type: 'sr25519' + type: 'sr25519', }, { address: 'CpjsLDC1JFyrhm3ftC9Gs4QoyrkHKhZKtK7YqGTRFtTafgp', name: 'Another Valid Account', - type: 'ed25519' - } - ] + type: 'ed25519', + }, + ]; - const result = mapInjectedAccounts(injectedAccounts, 'test-source') + const result = mapInjectedAccounts(injectedAccounts, 'test-source'); - expect(result).toHaveLength(3) + expect(result).toHaveLength(3); - expect(result[0].publicKey).toBeDefined() - expect(result[2].publicKey).toBeDefined() + expect(result[0].publicKey).toBeDefined(); + expect(result[2].publicKey).toBeDefined(); - expect(result[1].publicKey).toBeUndefined() + expect(result[1].publicKey).toBeUndefined(); - expect(consoleErrorSpy).toHaveBeenCalledTimes(1) - }) - }) + expect(consoleErrorSpy).toHaveBeenCalledTimes(1); + }); + }); describe('source id handling', () => { it('should correctly set source in meta for all accounts', () => { @@ -319,65 +327,65 @@ describe('address utils', () => { { address: '1FRMM8PEiWXYax7rpS6X4XZX1aAAxSWx1CrKTyrVYhV24fg', name: 'Account 1', - type: 'sr25519' - } - ] + type: 'sr25519', + }, + ]; - const sourceIds = ['polkadot-js', 'subwallet', 'talisman'] + const sourceIds = ['polkadot-js', 'subwallet', 'talisman']; - sourceIds.forEach(sourceId => { - const result = mapInjectedAccounts(injectedAccounts, sourceId) - expect(result[0].meta?.source).toBe(sourceId) - }) - }) - }) + sourceIds.forEach((sourceId) => { + const result = mapInjectedAccounts(injectedAccounts, sourceId); + expect(result[0].meta?.source).toBe(sourceId); + }); + }); + }); describe('public key extraction', () => { it('should extract consistent public key for same address', () => { - const address = '1FRMM8PEiWXYax7rpS6X4XZX1aAAxSWx1CrKTyrVYhV24fg' + const address = '1FRMM8PEiWXYax7rpS6X4XZX1aAAxSWx1CrKTyrVYhV24fg'; const injectedAccounts: InjectedAccount[] = [ { address, name: 'Test 1', type: 'sr25519' }, - { address, name: 'Test 2', type: 'sr25519' } - ] + { address, name: 'Test 2', type: 'sr25519' }, + ]; - const result = mapInjectedAccounts(injectedAccounts, 'test-source') + const result = mapInjectedAccounts(injectedAccounts, 'test-source'); - expect(result[0].publicKey).toBe(result[1].publicKey) - expect(result[0].publicKey).toBeDefined() - }) - }) - }) + expect(result[0].publicKey).toBe(result[1].publicKey); + expect(result[0].publicKey).toBeDefined(); + }); + }); + }); describe('boundary conditions - unified null/empty input handling across all functions', () => { - const nullishInputs = [ { input: null, description: 'null' }, { input: undefined, description: 'undefined' }, { input: '', description: 'empty string' }, - ] + ]; const invalidStringInputs = [ { input: ' ', description: 'whitespace' }, { input: '\n\t', description: 'newline and tab' }, - ] + ]; nullishInputs.forEach(({ input, description }) => { it(`should handle ${description} input correctly`, () => { - expect(isValidAddress(input as any)).toBe(false) - expect(() => getPublicKey(input as any)).toThrow('Failed to get public key') - expect(() => convertAddress(input as any, 0)).toThrow('Failed to convert address') - expect(mapInjectedAccounts(input as any, 'test-source')).toEqual([]) - }) - }) + expect(isValidAddress(input as any)).toBe(false); + expect(() => getPublicKey(input as any)).toThrow('Failed to get public key'); + expect(() => convertAddress(input as any, 0)).toThrow('Failed to convert address'); + expect(mapInjectedAccounts(input as any, 'test-source')).toEqual([]); + }); + }); invalidStringInputs.forEach(({ input, description }) => { it(`should handle ${description} input correctly`, () => { - expect(isValidAddress(input as any)).toBe(false) - expect(() => getPublicKey(input as any)).toThrow('Failed to get public key') - expect(() => convertAddress(input as any, 0)).toThrow('Failed to convert address') - expect(() => mapInjectedAccounts(input as any, 'test-source')).toThrow('Failed to map injected accounts') - }) - }) - }) - -}) + expect(isValidAddress(input as any)).toBe(false); + expect(() => getPublicKey(input as any)).toThrow('Failed to get public key'); + expect(() => convertAddress(input as any, 0)).toThrow('Failed to convert address'); + expect(() => mapInjectedAccounts(input as any, 'test-source')).toThrow( + 'Failed to map injected accounts' + ); + }); + }); + }); +}); diff --git a/packages/core/src/utils/address.ts b/packages/core/src/utils/address.ts index 8fa4fb3..95d59e4 100644 --- a/packages/core/src/utils/address.ts +++ b/packages/core/src/utils/address.ts @@ -1,8 +1,6 @@ -import { decodeAddress, encodeAddress } from 'dedot/utils'; -import type { Account } from '../types'; -import { u8aEq, u8aToHex } from 'dedot/utils' -import type { InjectedAccount } from 'dedot/types' -import type { HexString } from 'dedot/utils' +import type { InjectedAccount } from 'dedot/types'; +import { decodeAddress, encodeAddress, u8aEq, u8aToHex } from 'dedot/utils'; +import type { Account, HexString } from '../types'; /** * check if address is valid @@ -37,7 +35,7 @@ export function isSameAddress(address1: string, address2: string): boolean { const publicKey1 = decodeAddress(address1); const publicKey2 = decodeAddress(address2); - return u8aEq(publicKey1, publicKey2) + return u8aEq(publicKey1, publicKey2); } catch (error: any) { return false; } @@ -62,8 +60,11 @@ export function getPublicKey(address: string): Uint8Array { * map injected accounts to internal Account type * mainly extract address, name, source, and try to decode public key */ -export function mapInjectedAccounts(injectedAccounts: InjectedAccount[], sourceId: string): Account[] { - if (!injectedAccounts) return [] +export function mapInjectedAccounts( + injectedAccounts: InjectedAccount[], + sourceId: string +): Account[] { + if (!injectedAccounts) return []; try { return injectedAccounts.map((acc: InjectedAccount) => { @@ -83,7 +84,7 @@ export function mapInjectedAccounts(injectedAccounts: InjectedAccount[], sourceI source: sourceId, genesisHash: acc.genesisHash, }, - type: acc.type + type: acc.type, }; return mappedAccount; diff --git a/packages/core/src/utils/chain.test.ts b/packages/core/src/utils/chain.test.ts index 74b0a55..a18d736 100644 --- a/packages/core/src/utils/chain.test.ts +++ b/packages/core/src/utils/chain.test.ts @@ -1,6 +1,6 @@ -import { describe, it, expect } from 'vitest' -import { defineChain, getChainToken, getExplorerUrl } from './chain' -import { polkadotSVG, kusamaSVG } from '../config/logos/generated' +import { describe, expect, it } from 'vitest'; +import { kusamaSVG, polkadotSVG } from '../config/logos/generated'; +import { defineChain, getChainToken, getExplorerUrl } from './chain'; const mockChains = { polkadot: { @@ -13,125 +13,126 @@ const mockChains = { }, ss58Format: 0, blockExplorers: { default: { name: 'Subscan', url: 'https://polkadot.subscan.io' } }, - chainIconUrl: polkadotSVG + chainIconUrl: polkadotSVG, }, kusama: { genesisHash: '0xb0a8d493285c2df73290dfb7e61f870f17b41801197a149ca93654499ea3dafe', name: 'Kusama', nativeCurrency: { name: 'Kusama', symbol: 'KSM', decimals: 12 }, - rpcUrls: { webSocket: ['wss://kusama-rpc.polkadot.io', 'wss://kusama.api.onfinality.io/public-ws'] }, + rpcUrls: { + webSocket: ['wss://kusama-rpc.polkadot.io', 'wss://kusama.api.onfinality.io/public-ws'], + }, ss58Format: 2, - chainIconUrl: kusamaSVG - } -} + chainIconUrl: kusamaSVG, + }, +}; describe('chain utils', () => { describe('defineChain', () => { it('should return the same chain object passed as argument', () => { - const mockChain = mockChains.polkadot + const mockChain = mockChains.polkadot; - const result = defineChain(mockChain) - expect(result).toBe(mockChain) - expect(result).toEqual(mockChain) - }) + const result = defineChain(mockChain); + expect(result).toBe(mockChain); + expect(result).toEqual(mockChain); + }); it('should work with minimal chain object', () => { - const mockChain = mockChains.kusama + const mockChain = mockChains.kusama; - const result = defineChain(mockChain) - expect(result).toBe(mockChain) - expect(result).toEqual(mockChain) - }) - }) + const result = defineChain(mockChain); + expect(result).toBe(mockChain); + expect(result).toEqual(mockChain); + }); + }); describe('getChainToken', () => { it('should return correct token symbol for Polkadot', () => { - expect(getChainToken(mockChains.polkadot)).toBe('DOT') - }) + expect(getChainToken(mockChains.polkadot)).toBe('DOT'); + }); it('should return correct token symbol for Kusama', () => { - expect(getChainToken(mockChains.kusama)).toBe('KSM') - }) + expect(getChainToken(mockChains.kusama)).toBe('KSM'); + }); it('should handle empty string symbol', () => { const chainWithEmptySymbol = { ...mockChains.polkadot, - nativeCurrency: { ...mockChains.polkadot.nativeCurrency, symbol: '' } - } - expect(getChainToken(chainWithEmptySymbol)).toBe('') - }) + nativeCurrency: { ...mockChains.polkadot.nativeCurrency, symbol: '' }, + }; + expect(getChainToken(chainWithEmptySymbol)).toBe(''); + }); it('should handle missing nativeCurrency gracefully', () => { - const chainWithoutCurrency = { ...mockChains.polkadot } - delete (chainWithoutCurrency as any).nativeCurrency - - expect(() => getChainToken(chainWithoutCurrency as any)).toThrow() - }) - }) + const chainWithoutCurrency = { ...mockChains.polkadot }; + delete (chainWithoutCurrency as any).nativeCurrency; + expect(() => getChainToken(chainWithoutCurrency as any)).toThrow(); + }); + }); describe('getExplorerUrl', () => { - const baseUrl = 'https://polkadot.subscan.io' - const testData = '0x1234567890abcdef' + const baseUrl = 'https://polkadot.subscan.io'; + const testData = '0x1234567890abcdef'; describe('URL building by type', () => { it('should build correct transaction URL', () => { - const result = getExplorerUrl(baseUrl, testData, 'transaction') - expect(result).toBe(`${baseUrl}/extrinsic/${testData}`) - }) + const result = getExplorerUrl(baseUrl, testData, 'transaction'); + expect(result).toBe(`${baseUrl}/extrinsic/${testData}`); + }); it('should build correct address URL', () => { - const result = getExplorerUrl(baseUrl, testData, 'address') - expect(result).toBe(`${baseUrl}/account/${testData}`) - }) + const result = getExplorerUrl(baseUrl, testData, 'address'); + expect(result).toBe(`${baseUrl}/account/${testData}`); + }); it('should build correct block URL', () => { - const result = getExplorerUrl(baseUrl, testData, 'block') - expect(result).toBe(`${baseUrl}/block/${testData}`) - }) + const result = getExplorerUrl(baseUrl, testData, 'block'); + expect(result).toBe(`${baseUrl}/block/${testData}`); + }); it('should use transaction as default type', () => { - const result = getExplorerUrl(baseUrl, testData) - expect(result).toBe(`${baseUrl}/extrinsic/${testData}`) - }) - }) + const result = getExplorerUrl(baseUrl, testData); + expect(result).toBe(`${baseUrl}/extrinsic/${testData}`); + }); + }); describe('edge cases', () => { it('should return empty string when explorerUrl is empty', () => { - expect(getExplorerUrl('', testData, 'transaction')).toBe('') - expect(getExplorerUrl()).toBe('') - }) + expect(getExplorerUrl('', testData, 'transaction')).toBe(''); + expect(getExplorerUrl()).toBe(''); + }); it('should handle empty data parameter', () => { - const result = getExplorerUrl(baseUrl, '', 'transaction') - expect(result).toBe(`${baseUrl}/extrinsic/`) - }) + const result = getExplorerUrl(baseUrl, '', 'transaction'); + expect(result).toBe(`${baseUrl}/extrinsic/`); + }); it('should fallback to base URL for unknown type', () => { - const result = getExplorerUrl(baseUrl, testData, 'unknown' as any) - expect(result).toBe(baseUrl) - }) - }) + const result = getExplorerUrl(baseUrl, testData, 'unknown' as any); + expect(result).toBe(baseUrl); + }); + }); describe('boundary conditions', () => { it('should handle null/undefined parameters', () => { - expect(getExplorerUrl(null as any, testData)).toBe('') - expect(getExplorerUrl(undefined, testData)).toBe('') - }) - }) + expect(getExplorerUrl(null as any, testData)).toBe(''); + expect(getExplorerUrl(undefined, testData)).toBe(''); + }); + }); describe('parameter validation', () => { it('should handle special characters in URL data', () => { - const specialData = '0x123!@#$%^&*()' - const result = getExplorerUrl(baseUrl, specialData, 'transaction') - expect(result).toBe(`${baseUrl}/extrinsic/${specialData}`) - }) + const specialData = '0x123!@#$%^&*()'; + const result = getExplorerUrl(baseUrl, specialData, 'transaction'); + expect(result).toBe(`${baseUrl}/extrinsic/${specialData}`); + }); it('should handle very long data strings', () => { - const longData = 'x'.repeat(1000) - const result = getExplorerUrl(baseUrl, longData, 'transaction') - expect(result).toBe(`${baseUrl}/extrinsic/${longData}`) - }) - }) - }) -}) + const longData = 'x'.repeat(1000); + const result = getExplorerUrl(baseUrl, longData, 'transaction'); + expect(result).toBe(`${baseUrl}/extrinsic/${longData}`); + }); + }); + }); +}); diff --git a/packages/core/src/utils/chain.ts b/packages/core/src/utils/chain.ts index 21373b5..110e91e 100644 --- a/packages/core/src/utils/chain.ts +++ b/packages/core/src/utils/chain.ts @@ -1,4 +1,4 @@ -import type { Chain } from '../types' +import type { Chain } from '../types'; export function defineChain(chain: Chain): Chain { return chain; @@ -8,7 +8,11 @@ export function getChainToken(chain: Chain): string { return chain.nativeCurrency.symbol; } -export function getExplorerUrl(explorerUrl = '', data = '', type: 'transaction' | 'address' | 'block' = 'transaction'): string { +export function getExplorerUrl( + explorerUrl = '', + data = '', + type: 'transaction' | 'address' | 'block' = 'transaction' +): string { if (!explorerUrl) return ''; switch (type) { diff --git a/packages/core/src/utils/device.test.ts b/packages/core/src/utils/device.test.ts index 2102e24..8cf28a8 100644 --- a/packages/core/src/utils/device.test.ts +++ b/packages/core/src/utils/device.test.ts @@ -1,4 +1,4 @@ -import { describe, it, expect, beforeEach, afterEach } from 'vitest'; +import { afterEach, beforeEach, describe, expect, it } from 'vitest'; import { isMobileDevice } from './device'; describe('isMobileDevice', () => { @@ -51,7 +51,7 @@ describe('isMobileDevice', () => { 'Opera/9.80 (Android; Opera Mini/32.0.2254/85)', ]; - mockUserAgents.forEach(userAgent => { + mockUserAgents.forEach((userAgent) => { Object.defineProperty(globalThis, 'window', { value: { navigator: { userAgent } }, writable: true, @@ -61,7 +61,7 @@ describe('isMobileDevice', () => { Object.defineProperty(globalThis, 'navigator', { value: { userAgent, - toString: () => userAgent + toString: () => userAgent, }, writable: true, configurable: true, @@ -78,7 +78,7 @@ describe('isMobileDevice', () => { 'Mozilla/5.0 (X11; Linux x86_64)', ]; - mockUserAgents.forEach(userAgent => { + mockUserAgents.forEach((userAgent) => { Object.defineProperty(globalThis, 'window', { value: { navigator: { userAgent } }, writable: true, @@ -88,7 +88,7 @@ describe('isMobileDevice', () => { Object.defineProperty(globalThis, 'navigator', { value: { userAgent, - toString: () => userAgent + toString: () => userAgent, }, writable: true, configurable: true, diff --git a/packages/core/src/utils/device.ts b/packages/core/src/utils/device.ts index 2566601..ce4bb2c 100644 --- a/packages/core/src/utils/device.ts +++ b/packages/core/src/utils/device.ts @@ -4,5 +4,5 @@ export const isMobileDevice = () => { window.navigator.userAgent.toLowerCase() ); } - return false + return false; }; diff --git a/packages/core/src/utils/format.test.ts b/packages/core/src/utils/format.test.ts index 1316749..ccd187d 100644 --- a/packages/core/src/utils/format.test.ts +++ b/packages/core/src/utils/format.test.ts @@ -1,196 +1,195 @@ -import { describe, it, expect } from 'vitest' -import { formatAddress, formatBalance, formatBalanceWithUnit } from './format' +import { describe, expect, it } from 'vitest'; +import { formatAddress, formatBalance, formatBalanceWithUnit } from './format'; -const longAddress = '1FRMM8PEiWXYax7rpS6X4XZX1aAAxSWx1CrKTyrVYhV24fg' -const shortAddress = '1ABC2def' +const longAddress = '1FRMM8PEiWXYax7rpS6X4XZX1aAAxSWx1CrKTyrVYhV24fg'; +const shortAddress = '1ABC2def'; describe('format utils', () => { describe('formatBalance', () => { describe('basic functionality', () => { it('should format integer values correctly', () => { - expect(formatBalance('1000000000000', 10)).toBe('100') - expect(formatBalance(BigInt('1000000000000'), 10)).toBe('100') - expect(formatBalance(1000000000000, 10)).toBe('100') - }) + expect(formatBalance('1000000000000', 10)).toBe('100'); + expect(formatBalance(BigInt('1000000000000'), 10)).toBe('100'); + expect(formatBalance(1000000000000, 10)).toBe('100'); + }); it('should handle decimal values with default precision', () => { - expect(formatBalance('1234567890123', 10)).toBe('123.4567') - expect(formatBalance('1005000000000', 10)).toBe('100.5') - }) + expect(formatBalance('1234567890123', 10)).toBe('123.4567'); + expect(formatBalance('1005000000000', 10)).toBe('100.5'); + }); it('should respect custom fixedDecimals parameter', () => { - expect(formatBalance('1234567890123', 10, 2)).toBe('123.45') - expect(formatBalance('1234567890123', 10, 6)).toBe('123.456789') - expect(formatBalance('1234567890123', 10, 0)).toBe('123') - }) + expect(formatBalance('1234567890123', 10, 2)).toBe('123.45'); + expect(formatBalance('1234567890123', 10, 6)).toBe('123.456789'); + expect(formatBalance('1234567890123', 10, 0)).toBe('123'); + }); it('should handle zero decimals', () => { - expect(formatBalance('123', 0)).toBe('123') - expect(formatBalance(BigInt(456), 0)).toBe('456') - }) - }) + expect(formatBalance('123', 0)).toBe('123'); + expect(formatBalance(BigInt(456), 0)).toBe('456'); + }); + }); describe('edge cases', () => { it('should handle zero values', () => { - expect(formatBalance('0', 10)).toBe('0') - expect(formatBalance(0, 10)).toBe('0') - expect(formatBalance(BigInt(0), 10)).toBe('0') - }) + expect(formatBalance('0', 10)).toBe('0'); + expect(formatBalance(0, 10)).toBe('0'); + expect(formatBalance(BigInt(0), 10)).toBe('0'); + }); it('should handle values with no fractional part', () => { - expect(formatBalance('10000000000', 10)).toBe('1') - expect(formatBalance('20000000000', 10)).toBe('2') - }) + expect(formatBalance('10000000000', 10)).toBe('1'); + expect(formatBalance('20000000000', 10)).toBe('2'); + }); it('should remove trailing zeros from decimals', () => { - expect(formatBalance('10050000000', 10)).toBe('1.005') - expect(formatBalance('10000000001', 10)).toBe('1') - expect(formatBalance('10000000001', 10, 10)).toBe('1.0000000001') - }) + expect(formatBalance('10050000000', 10)).toBe('1.005'); + expect(formatBalance('10000000001', 10)).toBe('1'); + expect(formatBalance('10000000001', 10, 10)).toBe('1.0000000001'); + }); it('should handle very large numbers', () => { - const largeValue = '123456789012345678901234567890' - expect(() => formatBalance(largeValue, 10)).not.toThrow() - }) + const largeValue = '123456789012345678901234567890'; + expect(() => formatBalance(largeValue, 10)).not.toThrow(); + }); it('should handle very small fractions', () => { - expect(formatBalance('1', 18, 18)).toBe('0.000000000000000001') - expect(formatBalance('1', 18, 2)).toBe('0') - }) - }) + expect(formatBalance('1', 18, 18)).toBe('0.000000000000000001'); + expect(formatBalance('1', 18, 2)).toBe('0'); + }); + }); describe('boundary conditions', () => { it('should handle null and undefined', () => { - expect(formatBalance(null, 10)).toBe('0') - expect(formatBalance(undefined, 10)).toBe('0') - }) + expect(formatBalance(null, 10)).toBe('0'); + expect(formatBalance(undefined, 10)).toBe('0'); + }); it('should handle negative values', () => { - expect(formatBalance('-1000000000000', 10)).toBe('-100') - expect(formatBalance(BigInt(-1000000000000), 10)).toBe('-100') - }) + expect(formatBalance('-1000000000000', 10)).toBe('-100'); + expect(formatBalance(BigInt(-1000000000000), 10)).toBe('-100'); + }); it('should handle edge decimal parameters', () => { - expect(formatBalance('123', 0, 10)).toBe('123') - expect(formatBalance('123456', 6, 0)).toBe('0') - }) - }) + expect(formatBalance('123', 0, 10)).toBe('123'); + expect(formatBalance('123456', 6, 0)).toBe('0'); + }); + }); describe('parameter validation', () => { it('should handle invalid string numbers gracefully', () => { - expect(formatBalance('', 10)).toBe('0') - expect(() => formatBalance('abc', 10)).toThrow() - }) + expect(formatBalance('', 10)).toBe('0'); + expect(() => formatBalance('abc', 10)).toThrow(); + }); it('should handle negative decimals', () => { - expect(() => formatBalance('123', -1)).toThrow() - }) - }) - }) + expect(() => formatBalance('123', -1)).toThrow(); + }); + }); + }); describe('formatAddress', () => { - describe('basic functionality', () => { it('should format long addresses with default parameters', () => { - const result = formatAddress(longAddress) - expect(result).toBe('1FRM...24fg') - expect(result.length).toBe(11) - }) + const result = formatAddress(longAddress); + expect(result).toBe('1FRM...24fg'); + expect(result.length).toBe(11); + }); it('should format with custom prefix and suffix lengths', () => { - expect(formatAddress(longAddress, 6, 6)).toBe('1FRMM8...hV24fg') - expect(formatAddress(longAddress, 2, 2)).toBe('1F...fg') - expect(formatAddress(longAddress, 8, 8)).toBe('1FRMM8PE...VYhV24fg') - }) + expect(formatAddress(longAddress, 6, 6)).toBe('1FRMM8...hV24fg'); + expect(formatAddress(longAddress, 2, 2)).toBe('1F...fg'); + expect(formatAddress(longAddress, 8, 8)).toBe('1FRMM8PE...VYhV24fg'); + }); it('should return full address when length is within limits', () => { - expect(formatAddress(shortAddress, 4, 4)).toBe(shortAddress) - expect(formatAddress('1234', 2, 2)).toBe('1234') - expect(formatAddress('123', 2, 2)).toBe('123') - }) - }) + expect(formatAddress(shortAddress, 4, 4)).toBe(shortAddress); + expect(formatAddress('1234', 2, 2)).toBe('1234'); + expect(formatAddress('123', 2, 2)).toBe('123'); + }); + }); describe('edge cases', () => { it('should handle empty and undefined addresses', () => { - expect(formatAddress('')).toBe('') - expect(formatAddress(undefined)).toBe('') - expect(formatAddress(null as any)).toBe('') - }) + expect(formatAddress('')).toBe(''); + expect(formatAddress(undefined)).toBe(''); + expect(formatAddress(null as any)).toBe(''); + }); it('should handle zero length parameters', () => { - expect(formatAddress(longAddress, 0, 0)).toBe('...') - expect(formatAddress(longAddress, 0, 4)).toBe('...24fg') - expect(formatAddress(longAddress, 4, 0)).toBe('1FRM...') - }) + expect(formatAddress(longAddress, 0, 0)).toBe('...'); + expect(formatAddress(longAddress, 0, 4)).toBe('...24fg'); + expect(formatAddress(longAddress, 4, 0)).toBe('1FRM...'); + }); it('should handle parameters larger than address length', () => { - expect(formatAddress('12345', 10, 10)).toBe('12345') - expect(formatAddress('abc', 5, 5)).toBe('abc') - }) - }) + expect(formatAddress('12345', 10, 10)).toBe('12345'); + expect(formatAddress('abc', 5, 5)).toBe('abc'); + }); + }); describe('boundary conditions', () => { it('should handle single character address', () => { - expect(formatAddress('A', 1, 1)).toBe('A') - expect(formatAddress('A', 2, 2)).toBe('A') - }) + expect(formatAddress('A', 1, 1)).toBe('A'); + expect(formatAddress('A', 2, 2)).toBe('A'); + }); it('should handle exactly minimum length addresses', () => { - expect(formatAddress('12345678', 4, 4)).toBe('12345678') - expect(formatAddress('123456789', 4, 4)).toBe('1234...6789') - }) - }) + expect(formatAddress('12345678', 4, 4)).toBe('12345678'); + expect(formatAddress('123456789', 4, 4)).toBe('1234...6789'); + }); + }); describe('special characters', () => { it('should handle addresses with special characters', () => { - const addressWithSpecial = '0x1234!@#$%^&*()abcdef' - expect(formatAddress(addressWithSpecial, 4, 4)).toBe('0x12...cdef') - }) + const addressWithSpecial = '0x1234!@#$%^&*()abcdef'; + expect(formatAddress(addressWithSpecial, 4, 4)).toBe('0x12...cdef'); + }); it('should handle unicode characters', () => { - const unicodeAddress = '🚀1234567890abcdef🌙' - expect(formatAddress(unicodeAddress, 2, 2)).toBe('🚀...🌙') - }) - }) - }) + const unicodeAddress = '🚀1234567890abcdef🌙'; + expect(formatAddress(unicodeAddress, 2, 2)).toBe('🚀...🌙'); + }); + }); + }); describe('formatBalanceWithUnit', () => { describe('export validation', () => { it('should be properly exported from dedot/utils', () => { - expect(typeof formatBalanceWithUnit).toBe('function') - }) + expect(typeof formatBalanceWithUnit).toBe('function'); + }); it('should be defined and callable', () => { - expect(formatBalanceWithUnit).toBeDefined() - expect(() => formatBalanceWithUnit).not.toThrow() - }) - }) + expect(formatBalanceWithUnit).toBeDefined(); + expect(() => formatBalanceWithUnit).not.toThrow(); + }); + }); describe('basic functionality', () => { it('should be callable with basic parameters', () => { - expect(() => formatBalanceWithUnit('1000000000000', 10)).not.toThrow() - }) + expect(() => formatBalanceWithUnit('1000000000000', 10)).not.toThrow(); + }); it('should return string type result', () => { - const result = formatBalanceWithUnit('1000000000000', 10) - expect(typeof result).toBe('string') - }) + const result = formatBalanceWithUnit('1000000000000', 10); + expect(typeof result).toBe('string'); + }); it('should handle different parameter types', () => { - expect(() => formatBalanceWithUnit(BigInt(1000000000000), 10)).not.toThrow() - expect(() => formatBalanceWithUnit(1000000000000, 10)).not.toThrow() - }) - }) + expect(() => formatBalanceWithUnit(BigInt(1000000000000), 10)).not.toThrow(); + expect(() => formatBalanceWithUnit(1000000000000, 10)).not.toThrow(); + }); + }); describe('boundary conditions', () => { it('should handle null and undefined gracefully', () => { - expect(() => formatBalanceWithUnit(null as any, 10)).not.toThrow() - expect(() => formatBalanceWithUnit(undefined as any, 10)).not.toThrow() - }) + expect(() => formatBalanceWithUnit(null as any, 10)).not.toThrow(); + expect(() => formatBalanceWithUnit(undefined as any, 10)).not.toThrow(); + }); it('should handle edge case parameters', () => { - expect(() => formatBalanceWithUnit('0', 0)).not.toThrow() - expect(() => formatBalanceWithUnit('1', 18)).not.toThrow() - }) - }) - }) -}) + expect(() => formatBalanceWithUnit('0', 0)).not.toThrow(); + expect(() => formatBalanceWithUnit('1', 18)).not.toThrow(); + }); + }); + }); +}); diff --git a/packages/core/src/utils/format.ts b/packages/core/src/utils/format.ts index 2b1a0ec..48f221e 100644 --- a/packages/core/src/utils/format.ts +++ b/packages/core/src/utils/format.ts @@ -25,9 +25,7 @@ export function formatBalance( } const paddedFraction = fraction.toString().padStart(decimals, '0'); - const truncatedFraction = paddedFraction - .substring(0, fixedDecimals) - .replace(/0+$/, ''); + const truncatedFraction = paddedFraction.substring(0, fixedDecimals).replace(/0+$/, ''); return truncatedFraction ? `${whole.toString()}.${truncatedFraction}` : whole.toString(); } @@ -35,11 +33,7 @@ export function formatBalance( /** * format address display */ -export function formatAddress( - address?: string, - prefixLength = 4, - suffixLength = 4 -): string { +export function formatAddress(address?: string, prefixLength = 4, suffixLength = 4): string { if (!address) return ''; if (address.length <= prefixLength + suffixLength) return address; diff --git a/packages/core/src/utils/index.ts b/packages/core/src/utils/index.ts index c2c0925..a3e1f28 100644 --- a/packages/core/src/utils/index.ts +++ b/packages/core/src/utils/index.ts @@ -1,7 +1,6 @@ -export * from './format'; - export * from './address'; - export * from './chain'; - export * from './device'; +export * from './format'; + +export * from './papi'; diff --git a/packages/core/src/utils/papi.test.ts b/packages/core/src/utils/papi.test.ts new file mode 100644 index 0000000..3d9164c --- /dev/null +++ b/packages/core/src/utils/papi.test.ts @@ -0,0 +1,45 @@ +import { beforeEach, describe, expect, it, vi } from 'vitest'; +import type { Signer } from '../types'; +import { createPapiSigner } from './papi'; + +vi.mock('@polkadot-api/pjs-signer', () => { + return { + getPolkadotSignerFromPjs: vi.fn((address: string, signPayload: any, signRaw: any) => { + return { + address, + signPayload, + signRaw, + publicKey: new Uint8Array([1, 2, 3]), + sign: vi.fn().mockResolvedValue(new Uint8Array([4, 5, 6])), + }; + }), + }; +}); + +describe('createPapiSigner', () => { + let mockSigner: Signer; + const mockAddress = '5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY'; + + beforeEach(() => { + mockSigner = { + signPayload: vi.fn().mockResolvedValue({ signature: '0xsignature' }), + signRaw: vi.fn().mockResolvedValue({ signature: '0xrawsignature' }), + }; + + vi.clearAllMocks(); + }); + + it('should create a PAPI signer when valid address and signer are provided', async () => { + const papiSigner = await createPapiSigner(mockAddress, mockSigner); + + expect(papiSigner).toBeDefined(); + expect(papiSigner?.publicKey).toBeInstanceOf(Uint8Array); + + const { getPolkadotSignerFromPjs } = await import('@polkadot-api/pjs-signer'); + expect(getPolkadotSignerFromPjs).toHaveBeenCalledWith( + mockAddress, + mockSigner.signPayload, + mockSigner.signRaw + ); + }); +}); diff --git a/packages/core/src/utils/papi.ts b/packages/core/src/utils/papi.ts new file mode 100644 index 0000000..2346a47 --- /dev/null +++ b/packages/core/src/utils/papi.ts @@ -0,0 +1,13 @@ +import type { PapiSigner, Signer } from '../types'; + +async function createPapiSigner(address: string, signer: Signer): Promise { + if (!address || !signer) return undefined; + + if (!signer.signRaw || !signer.signPayload) return undefined; + + const { getPolkadotSignerFromPjs } = await import('@polkadot-api/pjs-signer'); + + return getPolkadotSignerFromPjs(address, signer.signPayload as any, signer.signRaw as any); +} + +export { createPapiSigner, type PapiSigner }; diff --git a/packages/core/tsconfig.json b/packages/core/tsconfig.json index c48cee2..2b757e6 100644 --- a/packages/core/tsconfig.json +++ b/packages/core/tsconfig.json @@ -7,7 +7,7 @@ "declarationMap": true, "sourceMap": true, "composite": true, - "lib": ["DOM", "DOM.Iterable", "ESNext"], + "lib": ["DOM", "DOM.Iterable", "ESNext"] }, "include": ["src/**/*"] } diff --git a/packages/core/tsup.config.ts b/packages/core/tsup.config.ts index 9255899..f9a5d81 100644 --- a/packages/core/tsup.config.ts +++ b/packages/core/tsup.config.ts @@ -1,22 +1,19 @@ import { defineConfig } from 'tsup'; -export default defineConfig(options => ({ +export default defineConfig((options) => ({ entry: [ 'src/index.ts', 'src/chains/index.ts', 'src/connectors/index.ts', 'src/utils/index.ts', - 'src/types/index.ts' + 'src/types/index.ts', ], format: ['esm', 'cjs'], splitting: true, sourcemap: true, clean: true, treeshake: true, - external: [ - 'dedot', - '@dedot/chaintypes', - ], + external: ['dedot', '@dedot/chaintypes'], dts: { resolve: true, compilerOptions: { @@ -27,7 +24,7 @@ export default defineConfig(options => ({ minify: !options.watch, esbuildOptions() { if (!options.watch) { - options.drop = ['console', 'debugger'] + options.drop = ['console', 'debugger']; } - } + }, })); diff --git a/packages/core/vitest.config.ts b/packages/core/vitest.config.ts index facba84..368dbb1 100644 --- a/packages/core/vitest.config.ts +++ b/packages/core/vitest.config.ts @@ -1,17 +1,10 @@ -import baseConfig from '../../vitest.base.config'; import { mergeConfig } from 'vitest/config'; +import baseConfig from '../../vitest.base.config'; export default mergeConfig(baseConfig, { test: { coverage: { - exclude: [ - 'node_modules/', - 'dist/', - '**/*.d.ts', - '**/*.test.ts', - 'scripts/', - '*.config.ts', - ], + exclude: ['node_modules/', 'dist/', '**/*.d.ts', '**/*.test.ts', 'scripts/', '*.config.ts'], }, }, }); diff --git a/packages/react/package.json b/packages/react/package.json index 9f909c8..7356eb6 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -50,7 +50,6 @@ "scripts": { "build": "tsup", "dev": "tsup --watch", - "lint": "eslint src", "test": "vitest", "test:coverage": "vitest run --coverage", "clean": "rm -rf dist" @@ -67,11 +66,10 @@ "@testing-library/jest-dom": "^6.6.3", "@testing-library/react": "^16.3.0", "@testing-library/user-event": "^14.6.1", - "@types/node": "^18.11.18", + "@types/node": "catalog:", "@types/react": "catalog:", "@types/react-dom": "catalog:", "@vitest/coverage-v8": "^3.2.4", - "eslint": "^8.56.0", "jsdom": "^26.1.0", "react": "catalog:", "react-dom": "catalog:", @@ -80,9 +78,9 @@ "vitest": "^3.2.4" }, "peerDependencies": { - "@dedot/chaintypes": "^0.123.0", + "@dedot/chaintypes": "^0.152.0", "@tanstack/react-query": ">=5.0.0", - "dedot": "^0.13.2", + "dedot": "^0.16.0", "react": ">=18.0.0", "react-dom": ">=18.0.0" }, diff --git a/packages/react/src/chains/index.ts b/packages/react/src/chains/index.ts index ca8b0de..5d2b6be 100644 --- a/packages/react/src/chains/index.ts +++ b/packages/react/src/chains/index.ts @@ -1 +1 @@ -export * from '@luno-kit/core/chains' +export * from '@luno-kit/core/chains'; diff --git a/packages/react/src/connectors/index.ts b/packages/react/src/connectors/index.ts index 71fe1e6..668a74b 100644 --- a/packages/react/src/connectors/index.ts +++ b/packages/react/src/connectors/index.ts @@ -1 +1 @@ -export * from '@luno-kit/core/connectors' +export * from '@luno-kit/core/connectors'; diff --git a/packages/react/src/constants.ts b/packages/react/src/constants.ts index 0c0d960..b88eaad 100644 --- a/packages/react/src/constants.ts +++ b/packages/react/src/constants.ts @@ -1,5 +1,5 @@ export const PERSIST_KEY = { LAST_CONNECTOR_ID: 'lastConnectorId', LAST_CHAIN_ID: 'lastChainId', - LAST_SELECTED_ACCOUNT_INFO: 'lastSelectedAccountInfo' + LAST_SELECTED_ACCOUNT_INFO: 'lastSelectedAccountInfo', } as const; diff --git a/packages/react/src/context/LunoContext.ts b/packages/react/src/context/LunoContext.ts index 1c5d395..c1af71b 100644 --- a/packages/react/src/context/LunoContext.ts +++ b/packages/react/src/context/LunoContext.ts @@ -1,8 +1,7 @@ -import React from 'react'; +import type { Account, Chain, Config, Connector, HexString } from '@luno-kit/core/types'; import type { LegacyClient } from 'dedot'; -import type { Chain, Config, Connector, Account } from '@luno-kit/core/types'; +import React from 'react'; import type { ConnectionStatus } from '../types'; -import type { HexString } from 'dedot/utils' export interface LunoContextState { config?: Config; @@ -22,4 +21,6 @@ export interface LunoContextState { switchChain: (newChainId: string) => Promise; } -export const LunoContext = React.createContext({} as LunoContextState); +export const LunoContext = React.createContext( + {} as LunoContextState +); diff --git a/packages/react/src/context/LunoProvider.test.tsx b/packages/react/src/context/LunoProvider.test.tsx index edb257e..2b787c9 100644 --- a/packages/react/src/context/LunoProvider.test.tsx +++ b/packages/react/src/context/LunoProvider.test.tsx @@ -1,15 +1,15 @@ +import { createConfig } from '@luno-kit/core'; +import { BaseConnector } from '@luno-kit/core/connectors'; +import type { Chain, Config } from '@luno-kit/core/types'; import { render, waitFor } from '@testing-library/react'; -import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; import React from 'react'; -import { LunoProvider } from './LunoProvider'; -import type { Chain, Config } from '@luno-kit/core/types'; -import { BaseConnector } from '@luno-kit/core/connectors'; -import { createConfig } from '@luno-kit/core'; +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; +import { useIsInitialized } from '../hooks/useIsInitialized'; +import { useLunoStore } from '../store'; import type { LunoState } from '../types'; -import { ConnectionStatus } from '../types' +import { ConnectionStatus } from '../types'; import { createApi, sleep } from '../utils'; -import { useIsInitialized } from '../hooks/useIsInitialized' -import { useLunoStore } from '../store' +import { LunoProvider } from './LunoProvider'; vi.mock('../utils/createApi'); vi.mock('../hooks/useIsInitialized'); @@ -17,7 +17,7 @@ vi.mock('../store'); vi.mock('../utils', () => ({ createApi: vi.fn(), - sleep: vi.fn().mockResolvedValue(undefined) + sleep: vi.fn().mockResolvedValue(undefined), })); const mockCreateApi = vi.mocked(createApi); @@ -43,7 +43,7 @@ const mockApi = { }, }, runtimeVersion: { - specName: 'Test Chain' + specName: 'Test Chain', }, }; @@ -52,12 +52,22 @@ class DummyConnector extends BaseConnector { name = 'Test Connector'; icon = 'test-icon.svg'; isInstalled = () => true; - async isAvailable() { return true; } - async connect() { return []; } + async isAvailable() { + return true; + } + async connect() { + return []; + } async disconnect() {} - async getAccounts() { return []; } - async getSigner() { return undefined; } - async signMessage() { return undefined; } + async getAccounts() { + return []; + } + async getSigner() { + return undefined; + } + async signMessage() { + return undefined; + } } const mockConnector = new DummyConnector(); @@ -109,7 +119,6 @@ describe('LunoProvider', () => { let consoleErrorSpy: ReturnType; beforeEach(() => { - mockMarkAsInitialized = vi.fn(); mockApi.disconnect = vi.fn().mockResolvedValue(undefined); @@ -137,7 +146,6 @@ describe('LunoProvider', () => { consoleWarnSpy = vi.spyOn(console, 'warn').mockImplementation(() => {}); consoleErrorSpy = vi.spyOn(console, 'error').mockImplementation(() => {}); vi.clearAllMocks(); - }); afterEach(() => { @@ -238,7 +246,6 @@ describe('LunoProvider', () => { ); - await waitFor(() => { console.error('All console.log calls:', consoleLogSpy.mock.calls); @@ -269,11 +276,14 @@ describe('LunoProvider', () => { expect(mockSleep).toHaveBeenCalledWith(500); - await waitFor(() => { - expect(mockStorage.getItem).toHaveBeenCalledWith('lastConnectorId'); - expect(mockStorage.getItem).toHaveBeenCalledWith('lastChainId'); - expect(mockStore.connect).toHaveBeenCalledWith('test-connector', '0x123'); - }, { timeout: 3000 }); + await waitFor( + () => { + expect(mockStorage.getItem).toHaveBeenCalledWith('lastConnectorId'); + expect(mockStorage.getItem).toHaveBeenCalledWith('lastChainId'); + expect(mockStore.connect).toHaveBeenCalledWith('test-connector', '0x123'); + }, + { timeout: 3000 } + ); }); it('should not attempt auto-connect when disabled', async () => { @@ -356,7 +366,9 @@ describe('LunoProvider', () => { await waitFor(() => { expect(consoleLogSpy).toHaveBeenCalledWith( - expect.stringContaining('[LunoProvider]: AutoConnect No persisted session found or missing data.') + expect.stringContaining( + '[LunoProvider]: AutoConnect No persisted session found or missing data.' + ) ); }); }); diff --git a/packages/react/src/context/LunoProvider.tsx b/packages/react/src/context/LunoProvider.tsx index 58104b7..02f28d6 100644 --- a/packages/react/src/context/LunoProvider.tsx +++ b/packages/react/src/context/LunoProvider.tsx @@ -1,17 +1,21 @@ -import React, { ReactNode, useCallback, useEffect, useMemo } from 'react'; +import type React from 'react'; +import { type ReactNode, useCallback, useEffect, useMemo } from 'react'; +import { PERSIST_KEY } from '../constants'; +import { useIsInitialized } from '../hooks/useIsInitialized'; +import { useLunoStore } from '../store'; import type { Chain, Config, Transport } from '../types'; -import { useLunoStore } from '../store' -import { PERSIST_KEY } from '../constants' -import { LunoContext, LunoContextState } from './LunoContext' -import { useIsInitialized } from '../hooks/useIsInitialized' -import { createApi, sleep } from '../utils' +import { createApi, sleep } from '../utils'; +import { LunoContext, type LunoContextState } from './LunoContext'; interface LunoProviderProps { config: Config; children: ReactNode; } -export const LunoProvider: React.FC = ({ config: configFromProps, children }: LunoProviderProps) => { +export const LunoProvider: React.FC = ({ + config: configFromProps, + children, +}: LunoProviderProps) => { const { _setConfig, _setApi, @@ -31,13 +35,13 @@ export const LunoProvider: React.FC = ({ config: configFromPr apiError, disconnect, switchChain, - } = useLunoStore() - const { markAsInitialized, isInitialized } = useIsInitialized() + } = useLunoStore(); + const { markAsInitialized, isInitialized } = useIsInitialized(); const clearApiState = useCallback(() => { _setApi(undefined); - _setIsApiReady(false) - }, [_setApi, _setIsApiReady]) + _setIsApiReady(false); + }, [_setApi, _setIsApiReady]); useEffect(() => { if (configFromProps) { @@ -47,12 +51,12 @@ export const LunoProvider: React.FC = ({ config: configFromPr }, [configFromProps]); useEffect(() => { - if (isInitialized) return + if (isInitialized) return; if (!configFromProps || !currentChainId) { if (currentApi && currentApi.status === 'connected') { currentApi.disconnect().catch(console.error); } - clearApiState() + clearApiState(); return; } @@ -65,32 +69,37 @@ export const LunoProvider: React.FC = ({ config: configFromPr if (currentApi && currentApi.status === 'connected') { currentApi.disconnect().catch(console.error); } - clearApiState() - return + clearApiState(); + return; } if (currentApi && currentApi.status === 'connected') { - console.log('[LunoProvider]: Disconnecting API from previous render cycle:', currentApi.runtimeVersion.specName); - currentApi.disconnect().catch(e => console.error('[LunoProvider] Error disconnecting previous API:', e)); + console.log( + '[LunoProvider]: Disconnecting API from previous render cycle:', + currentApi.runtimeVersion.specName + ); + currentApi + .disconnect() + .catch((e) => console.error('[LunoProvider] Error disconnecting previous API:', e)); } - clearApiState() + clearApiState(); createApi({ config: configFromProps, chainId: currentChainId }) - .then(api => { + .then((api) => { _setApi(api); - _setIsApiReady(true) + _setIsApiReady(true); }) - .catch(e => { - clearApiState() - _setApiError(e) + .catch((e) => { + clearApiState(); + _setApiError(e); }) - .finally(() => markAsInitialized()) + .finally(() => markAsInitialized()); }, [configFromProps, currentChainId]); useEffect(() => { const performAutoConnect = async () => { - await sleep(500) + await sleep(500); if (!configFromProps.autoConnect) { console.log('[LunoProvider]: AutoConnect disabled or config not set.'); return; @@ -102,12 +111,16 @@ export const LunoProvider: React.FC = ({ config: configFromPr } try { - const lastConnectorId = await configFromProps.storage.getItem(PERSIST_KEY.LAST_CONNECTOR_ID); + const lastConnectorId = await configFromProps.storage.getItem( + PERSIST_KEY.LAST_CONNECTOR_ID + ); const lastChainId = await configFromProps.storage.getItem(PERSIST_KEY.LAST_CHAIN_ID); - if (lastConnectorId && lastChainId) { - console.log(`[LunoProvider]: AutoConnect Found persisted session: Connector ID "${lastConnectorId}", Chain ID "${lastChainId}"`); - await connect(lastConnectorId, lastChainId); + if (lastConnectorId) { + console.log( + `[LunoProvider]: AutoConnect Found persisted session: Connector ID "${lastConnectorId}", Chain ID "${lastChainId}"` + ); + await connect(lastConnectorId, lastChainId || undefined); } else { console.log('[LunoProvider]: AutoConnect No persisted session found or missing data.'); } @@ -119,26 +132,30 @@ export const LunoProvider: React.FC = ({ config: configFromPr if (configFromProps) { performAutoConnect(); } - }, [configFromProps]); - useEffect(() => { - if (isApiReady && currentApi && currentChain && currentChain.ss58Format !== undefined && currentChain.ss58Format !== null) { + if ( + isApiReady && + currentApi && + currentChain && + currentChain.ss58Format !== undefined && + currentChain.ss58Format !== null + ) { try { const apiSs58 = currentApi.consts.system.ss58Prefix; - if ((apiSs58 !== null && apiSs58 !== undefined) && apiSs58 !== currentChain.ss58Format) { + if (apiSs58 !== null && apiSs58 !== undefined && apiSs58 !== currentChain.ss58Format) { console.error( `[LunoProvider]: SS58 Format Mismatch for chain "${currentChain.name}" (genesisHash: ${currentChain.genesisHash}):\n` + - ` - Configured SS58Format: ${currentChain.ss58Format}\n` + - ` - Node Runtime SS58Format: ${apiSs58}\n` + - `Please verify your Luno configuration for this chain to ensure correct address display and interaction.` + ` - Configured SS58Format: ${currentChain.ss58Format}\n` + + ` - Node Runtime SS58Format: ${apiSs58}\n` + + `Please verify your Luno configuration for this chain to ensure correct address display and interaction.` ); } else if (apiSs58 === null || apiSs58 === undefined) { console.warn( `[LunoProvider]: Could not determine SS58 format from the API for chain "${currentChain.name}". ` + - `Cannot validate configured SS58Format (${currentChain.ss58Format}). The application will use the configured value.` + `Cannot validate configured SS58Format (${currentChain.ss58Format}). The application will use the configured value.` ); } } catch (e) { @@ -150,25 +167,40 @@ export const LunoProvider: React.FC = ({ config: configFromPr } }, [isApiReady, currentApi, currentChain]); - const contextValue = useMemo(() => ({ - config: configInStore, - status, - activeConnector, - accounts, - account, - setAccount, - currentChainId, - currentChain, - currentApi, - isApiReady, - connect, - disconnect, - switchChain, - apiError, - }), [ - configInStore, status, activeConnector, accounts, account, currentChainId, currentChain, currentApi, isApiReady, apiError, - connect, disconnect, switchChain, setAccount - ]); + const contextValue = useMemo( + () => ({ + config: configInStore, + status, + activeConnector, + accounts, + account, + setAccount, + currentChainId, + currentChain, + currentApi, + isApiReady, + connect, + disconnect, + switchChain, + apiError, + }), + [ + configInStore, + status, + activeConnector, + accounts, + account, + currentChainId, + currentChain, + currentApi, + isApiReady, + apiError, + connect, + disconnect, + switchChain, + setAccount, + ] + ); return {children}; }; diff --git a/packages/react/src/context/index.ts b/packages/react/src/context/index.ts index a933074..4a28f6a 100644 --- a/packages/react/src/context/index.ts +++ b/packages/react/src/context/index.ts @@ -1 +1 @@ -export * from './LunoProvider' +export * from './LunoProvider'; diff --git a/packages/react/src/hooks/index.ts b/packages/react/src/hooks/index.ts index def6672..8d02c0d 100644 --- a/packages/react/src/hooks/index.ts +++ b/packages/react/src/hooks/index.ts @@ -1,22 +1,24 @@ -export * from './useApi'; export * from './useAccount'; export * from './useAccounts'; -export * from './useActiveConnector' +export * from './useActiveConnector'; +export * from './useApi'; export * from './useBalance'; export * from './useBlockNumber'; export * from './useChain'; export * from './useChains'; -export * from './useConnectors'; -export * from './useConfig' +export * from './useConfig'; export * from './useConnect'; +export * from './useConnectors'; export * from './useDisconnect'; +export * from './useEstimatePaymentInfo'; export * from './useGenesisHash'; +export * from './usePapiSigner'; export * from './useRuntimeVersion'; export * from './useSendTransaction'; export * from './useSendTransactionHash'; +export * from './useSigner'; export * from './useSignMessage'; export * from './useSs58Format'; export * from './useStatus'; export * from './useSubscription'; export * from './useSwitchChain'; -export * from './useSigner'; diff --git a/packages/react/src/hooks/useAccount.test.ts b/packages/react/src/hooks/useAccount.test.ts index 1503283..71b53c5 100644 --- a/packages/react/src/hooks/useAccount.test.ts +++ b/packages/react/src/hooks/useAccount.test.ts @@ -1,10 +1,9 @@ -import { expect, afterEach, test } from 'vitest'; -import { mockConfig, MockConnector } from '../test-utils'; -import { renderHook } from '../test-utils'; import { act, waitFor } from '@testing-library/react'; -import { useConnect } from './useConnect'; -import { useAccount } from './useAccount'; +import { afterEach, expect, test } from 'vitest'; +import { type MockConnector, mockConfig, renderHook } from '../test-utils'; import { ConnectionStatus } from '../types'; +import { useAccount } from './useAccount'; +import { useConnect } from './useConnect'; const connector = mockConfig.connectors[0] as MockConnector; @@ -15,19 +14,22 @@ afterEach(async () => { }); test('useAccount', async () => { - const { result } = renderHook(() => ({ - useAccount: useAccount(), - useConnect: useConnect(), - }), { - config: mockConfig - }); + const { result } = renderHook( + () => ({ + useAccount: useAccount(), + useConnect: useConnect(), + }), + { + config: mockConfig, + } + ); expect(result.current.useAccount.account).toBeUndefined(); expect(result.current.useAccount.address).toBeUndefined(); await act(async () => { await result.current.useConnect.connectAsync({ - connectorId: connector.id + connectorId: connector.id, }); }); diff --git a/packages/react/src/hooks/useAccount.ts b/packages/react/src/hooks/useAccount.ts index 39e4e58..1e4cf65 100644 --- a/packages/react/src/hooks/useAccount.ts +++ b/packages/react/src/hooks/useAccount.ts @@ -1,7 +1,7 @@ +import { convertAddress } from '@luno-kit/core/utils'; +import { useMemo } from 'react'; import type { Account } from '../types'; import { useLuno } from './useLuno'; -import { convertAddress } from '@luno-kit/core/utils' -import { useMemo } from 'react' export interface UseAccountResult { account?: Account; @@ -11,10 +11,9 @@ export interface UseAccountResult { export const useAccount = (): UseAccountResult => { const { account, currentChain } = useLuno(); - const formattedAccount = useMemo(() => { - if (!account) return - if (!currentChain || currentChain?.ss58Format === undefined || !account?.publicKey) return account + if (!account) return; + if (!currentChain || currentChain?.ss58Format === undefined) return account; try { const newAddress = convertAddress(account.address, currentChain.ss58Format); @@ -23,10 +22,13 @@ export const useAccount = (): UseAccountResult => { address: newAddress, }; } catch (error) { - console.error(`[useAccount]: Failed to re-format address for account with publicKey ${account.publicKey}:`, error); + console.error( + `[useAccount]: Failed to re-format address for account ${account.address}:`, + error + ); return { ...account }; } - }, [account, currentChain, currentChain?.ss58Format]) + }, [account, currentChain, currentChain?.ss58Format]); return { account: formattedAccount, diff --git a/packages/react/src/hooks/useAccounts.test.ts b/packages/react/src/hooks/useAccounts.test.ts index 0c94062..9b352a6 100644 --- a/packages/react/src/hooks/useAccounts.test.ts +++ b/packages/react/src/hooks/useAccounts.test.ts @@ -1,11 +1,10 @@ -import { expect, afterEach, test } from 'vitest'; -import { mockConfig, MockConnector } from '../test-utils'; -import { renderHook } from '../test-utils'; import { act, waitFor } from '@testing-library/react'; -import { useConnect } from './useConnect'; -import { useAccounts } from './useAccounts'; +import { afterEach, expect, test } from 'vitest'; +import { type MockConnector, mockConfig, renderHook } from '../test-utils'; import { ConnectionStatus } from '../types'; +import { useAccounts } from './useAccounts'; import { useChain } from './useChain'; +import { useConnect } from './useConnect'; const connector = mockConfig.connectors[0] as MockConnector; @@ -16,20 +15,23 @@ afterEach(async () => { }); test('useAccounts', async () => { - const { result } = renderHook(() => ({ - useAccounts: useAccounts(), - useConnect: useConnect(), - useChain: useChain(), - }), { - config: mockConfig - }); + const { result } = renderHook( + () => ({ + useAccounts: useAccounts(), + useConnect: useConnect(), + useChain: useChain(), + }), + { + config: mockConfig, + } + ); expect(result.current.useAccounts.accounts).toEqual([]); expect(result.current.useAccounts.selectAccount).toBeDefined(); await act(async () => { await result.current.useConnect.connectAsync({ - connectorId: connector.id + connectorId: connector.id, }); }); diff --git a/packages/react/src/hooks/useAccounts.ts b/packages/react/src/hooks/useAccounts.ts index 107de3b..7ba4909 100644 --- a/packages/react/src/hooks/useAccounts.ts +++ b/packages/react/src/hooks/useAccounts.ts @@ -1,8 +1,8 @@ +import type { HexString } from '@luno-kit/core/types'; +import { convertAddress } from '@luno-kit/core/utils'; +import { useMemo } from 'react'; import type { Account } from '../types'; import { useLuno } from './useLuno'; -import { useMemo } from 'react' -import { convertAddress } from '@luno-kit/core/utils' -import type { HexString } from 'dedot/utils' export interface UseAccountsResult { accounts: Account[]; @@ -13,13 +13,8 @@ export const useAccounts = (): UseAccountsResult => { const { accounts, setAccount, currentChain } = useLuno(); const formattedAccounts = useMemo(() => { - if (!currentChain || currentChain?.ss58Format === undefined) return accounts ?? [] - return (accounts || []).map(acc => { - if (!acc.publicKey) { - console.warn(`[useAccounts]: Account ${acc.name || acc.address} is missing publicKey. Cannot re-format address.`); - return acc; - } - + if (!currentChain || currentChain?.ss58Format === undefined) return accounts ?? []; + return (accounts || []).map((acc) => { try { const newAddress = convertAddress(acc.address, currentChain.ss58Format); return { @@ -27,11 +22,14 @@ export const useAccounts = (): UseAccountsResult => { address: newAddress, }; } catch (error) { - console.error(`[useAccounts]: Failed to re-format address for account with publicKey ${acc.publicKey}:`, error); + console.error( + `[useAccounts]: Failed to re-format address for account ${acc.address}:`, + error + ); return { ...acc }; } - }) - }, [accounts, currentChain, currentChain?.ss58Format]) + }); + }, [accounts, currentChain, currentChain?.ss58Format]); return { accounts: formattedAccounts, selectAccount: setAccount }; }; diff --git a/packages/react/src/hooks/useActiveConnector.test.ts b/packages/react/src/hooks/useActiveConnector.test.ts index 425b888..8e29c9e 100644 --- a/packages/react/src/hooks/useActiveConnector.test.ts +++ b/packages/react/src/hooks/useActiveConnector.test.ts @@ -1,26 +1,28 @@ +import { act, waitFor } from '@testing-library/react'; import { expect, test } from 'vitest'; -import { mockConfig, MockConnector } from '../test-utils'; -import { renderHook } from '../test-utils'; +import { type MockConnector, mockConfig, renderHook } from '../test-utils'; +import { ConnectionStatus } from '../types'; import { useActiveConnector } from './useActiveConnector'; import { useConnect } from './useConnect'; -import { act, waitFor } from '@testing-library/react'; -import { ConnectionStatus } from '../types'; const connector = mockConfig.connectors[0] as MockConnector; test('useActiveConnector', async () => { - const { result } = renderHook(() => ({ - useActiveConnector: useActiveConnector(), - useConnect: useConnect(), - }), { - config: mockConfig - }); + const { result } = renderHook( + () => ({ + useActiveConnector: useActiveConnector(), + useConnect: useConnect(), + }), + { + config: mockConfig, + } + ); expect(result.current.useActiveConnector).toBeUndefined(); await act(async () => { await result.current.useConnect.connectAsync({ - connectorId: connector.id + connectorId: connector.id, }); }); diff --git a/packages/react/src/hooks/useApi.test.ts b/packages/react/src/hooks/useApi.test.ts index dec6a4b..7d3e30e 100644 --- a/packages/react/src/hooks/useApi.test.ts +++ b/packages/react/src/hooks/useApi.test.ts @@ -1,20 +1,22 @@ -import { expect, describe, it, vi } from 'vitest'; -import { mockConfig, mockClient } from '../test-utils'; -import { renderHook } from '../test-utils'; import { waitFor } from '@testing-library/react'; +import { describe, expect, it, vi } from 'vitest'; +import { mockClient, mockConfig, renderHook } from '../test-utils'; import { useApi } from './useApi'; vi.mock('../utils/createApi', () => ({ - createApi: () => Promise.resolve(mockClient.polkadot) + createApi: () => Promise.resolve(mockClient.polkadot), })); describe('useApi', () => { it('should handle API initialization', async () => { - const { result } = renderHook(() => ({ - useApi: useApi() - }), { - config: mockConfig - }); + const { result } = renderHook( + () => ({ + useApi: useApi(), + }), + { + config: mockConfig, + } + ); expect(result.current.useApi.api).toBeUndefined(); expect(result.current.useApi.isApiReady).toBe(false); diff --git a/packages/react/src/hooks/useBalance.test.ts b/packages/react/src/hooks/useBalance.test.ts index c181709..ce2ac7a 100644 --- a/packages/react/src/hooks/useBalance.test.ts +++ b/packages/react/src/hooks/useBalance.test.ts @@ -1,15 +1,14 @@ -import { expect, afterEach, describe, it, vi } from 'vitest'; -import { mockConfig, MockConnector, mockClient } from '../test-utils'; -import { renderHook } from '../test-utils'; import { act, waitFor } from '@testing-library/react'; -import { useConnect } from './useConnect'; -import { useBalance } from './useBalance'; -import { useAccount } from './useAccount'; +import { afterEach, describe, expect, it, vi } from 'vitest'; +import { type MockConnector, mockClient, mockConfig, renderHook } from '../test-utils'; import { ConnectionStatus } from '../types'; +import { useAccount } from './useAccount'; +import { useBalance } from './useBalance'; +import { useConnect } from './useConnect'; import { useLuno } from './useLuno'; vi.mock('../utils/createApi', () => ({ - createApi: () => Promise.resolve(mockClient.polkadot) + createApi: () => Promise.resolve(mockClient.polkadot), })); const connector = mockConfig.connectors[0] as MockConnector; @@ -22,14 +21,17 @@ describe('useBalance', () => { }); it('should handle balance query when connected', async () => { - const { result } = renderHook(() => ({ - useAccount: useAccount(), - useConnect: useConnect(), - useLuno: useLuno(), - useBalance: useBalance({ address: undefined }) - }), { - config: mockConfig - }); + const { result } = renderHook( + () => ({ + useAccount: useAccount(), + useConnect: useConnect(), + useLuno: useLuno(), + useBalance: useBalance({ address: undefined }), + }), + { + config: mockConfig, + } + ); expect(result.current.useBalance.data).toBeUndefined(); expect(result.current.useBalance.isLoading).toBe(false); @@ -42,7 +44,7 @@ describe('useBalance', () => { await act(async () => { await result.current.useConnect.connectAsync({ - connectorId: connector.id + connectorId: connector.id, }); }); @@ -50,11 +52,13 @@ describe('useBalance', () => { expect(result.current.useConnect.status).toBe(ConnectionStatus.Connected); }); - const { result: balanceResult } = renderHook(() => + const { result: balanceResult } = renderHook( + () => useBalance({ - address: result.current.useAccount.address - }), { - config: mockConfig + address: result.current.useAccount.address, + }), + { + config: mockConfig, } ); @@ -87,11 +91,14 @@ describe('useBalance', () => { }); it('should be disabled when API is not ready', async () => { - const { result } = renderHook(() => ({ - useBalance: useBalance({ address: '5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY' }) - }), { - config: mockConfig - }); + const { result } = renderHook( + () => ({ + useBalance: useBalance({ address: '5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY' }), + }), + { + config: mockConfig, + } + ); expect(result.current.useBalance.data).toBeUndefined(); expect(result.current.useBalance.isLoading).toBe(false); diff --git a/packages/react/src/hooks/useBalance.ts b/packages/react/src/hooks/useBalance.ts index c94632d..92cd42f 100644 --- a/packages/react/src/hooks/useBalance.ts +++ b/packages/react/src/hooks/useBalance.ts @@ -1,8 +1,12 @@ -import { QueryMultiItem, useSubscription, UseSubscriptionResult } from './useSubscription'; -import type { AccountBalance } from '../types'; +import { formatBalance } from '@luno-kit/core/utils'; import type { LegacyClient } from 'dedot'; -import { useLuno } from './useLuno' -import { formatBalance } from '@luno-kit/core/utils' +import type { AccountBalance } from '../types'; +import { useLuno } from './useLuno'; +import { + type QueryMultiItem, + type UseSubscriptionResult, + useSubscription, +} from './useSubscription'; interface AccountData { data: { @@ -24,7 +28,7 @@ export interface ChainProperties { tokenSymbol?: string; } -const DEFAULT_TOKEN_DECIMALS = 10 +const DEFAULT_TOKEN_DECIMALS = 10; const transformBalance = (results: any[], chainProperties: ChainProperties) => { const accountInfo: AccountData = results[0]; @@ -44,14 +48,14 @@ const transformBalance = (results: any[], chainProperties: ChainProperties) => { transferable, formattedTransferable: formatBalance(transferable, chainProperties.tokenDecimals), formattedTotal: formatBalance(total, chainProperties.tokenDecimals), - locks: locks.map(lock => ({ + locks: locks.map((lock) => ({ id: lock.id, amount: lock.amount, reason: lock.reasons, - lockHuman: formatBalance(lock.amount, chainProperties.tokenDecimals) - })) + lockHuman: formatBalance(lock.amount, chainProperties.tokenDecimals), + })), } as AccountBalance; -} +}; export interface UseBalanceProps { address?: string; @@ -62,11 +66,7 @@ export type UseBalanceResult = UseSubscriptionResult; export const useBalance = ({ address }: UseBalanceProps): UseBalanceResult => { const { currentApi, isApiReady, currentChain } = useLuno(); - return useSubscription< - QueryMultiItem[], - [AccountData, BalanceLock[]], - AccountBalance - >({ + return useSubscription({ queryKey: '/native-balance', factory: (api: LegacyClient) => api.queryMulti, params: (api: LegacyClient) => [ @@ -75,14 +75,14 @@ export const useBalance = ({ address }: UseBalanceProps): UseBalanceResult => { ], options: { enabled: !!currentApi && isApiReady && !!address, - transform: (results, ) => { + transform: (results) => { const chainProperties: ChainProperties = { tokenDecimals: currentChain?.nativeCurrency?.decimals ?? DEFAULT_TOKEN_DECIMALS, tokenSymbol: currentChain?.nativeCurrency?.symbol, ss58Format: currentChain?.ss58Format, }; - return transformBalance(results, chainProperties) - } - } + return transformBalance(results, chainProperties); + }, + }, }); -} +}; diff --git a/packages/react/src/hooks/useBlockNumber.test.ts b/packages/react/src/hooks/useBlockNumber.test.ts index 795bdec..60347fe 100644 --- a/packages/react/src/hooks/useBlockNumber.test.ts +++ b/packages/react/src/hooks/useBlockNumber.test.ts @@ -1,12 +1,11 @@ -import { expect, afterEach, describe, it, vi } from 'vitest'; -import { mockConfig, MockConnector, mockClient } from '../test-utils'; -import { renderHook } from '../test-utils'; import { waitFor } from '@testing-library/react'; +import { afterEach, describe, expect, it, vi } from 'vitest'; +import { type MockConnector, mockClient, mockConfig, renderHook } from '../test-utils'; import { useBlockNumber } from './useBlockNumber'; import { useLuno } from './useLuno'; vi.mock('../utils/createApi', () => ({ - createApi: () => Promise.resolve(mockClient.polkadot) + createApi: () => Promise.resolve(mockClient.polkadot), })); const connector = mockConfig.connectors[0] as MockConnector; @@ -19,17 +18,19 @@ describe('useBlockNumber', () => { }); it('should handle block number subscription when connected', async () => { - const { result } = renderHook(() => ({ - useLuno: useLuno(), - useBlockNumber: useBlockNumber() - }), { - config: mockConfig - }); + const { result } = renderHook( + () => ({ + useLuno: useLuno(), + useBlockNumber: useBlockNumber(), + }), + { + config: mockConfig, + } + ); expect(result.current.useBlockNumber.data).toBeUndefined(); expect(result.current.useBlockNumber.isLoading).toBe(false); - await waitFor(() => { expect(result.current.useLuno.currentApi).toBeDefined(); expect(result.current.useLuno.isApiReady).toBe(true); @@ -49,11 +50,9 @@ describe('useBlockNumber', () => { }); it('should be disabled when API is not ready', () => { - const { result } = renderHook(() => - useBlockNumber(), { - config: mockConfig - } - ); + const { result } = renderHook(() => useBlockNumber(), { + config: mockConfig, + }); expect(result.current.data).toBeUndefined(); expect(result.current.isLoading).toBe(false); diff --git a/packages/react/src/hooks/useBlockNumber.ts b/packages/react/src/hooks/useBlockNumber.ts index e1b8141..2761635 100644 --- a/packages/react/src/hooks/useBlockNumber.ts +++ b/packages/react/src/hooks/useBlockNumber.ts @@ -1,6 +1,6 @@ -import { useSubscription, UseSubscriptionResult } from './useSubscription'; import type { BlockNumber } from 'dedot/codecs'; import { useLuno } from './useLuno'; +import { type UseSubscriptionResult, useSubscription } from './useSubscription'; export type UseBlockNumberResult = UseSubscriptionResult; @@ -13,11 +13,11 @@ export const useBlockNumber = (): UseBlockNumberResult => { return useSubscription<[], BlockNumber, BlockNumber>({ queryKey: '/block-number', - factory: api => api.query.system.number, + factory: (api) => api.query.system.number, params: [], options: { enabled: !!currentApi && isApiReady, transform: transform, - } + }, }); }; diff --git a/packages/react/src/hooks/useChain.test.ts b/packages/react/src/hooks/useChain.test.ts index 8a76ead..61e8e74 100644 --- a/packages/react/src/hooks/useChain.test.ts +++ b/packages/react/src/hooks/useChain.test.ts @@ -1,19 +1,21 @@ +import { waitFor } from '@testing-library/react'; import { expect, test, vi } from 'vitest'; -import { mockConfig, mockClient } from '../test-utils'; -import { renderHook } from '../test-utils'; +import { mockClient, mockConfig, renderHook } from '../test-utils'; import { useChain } from './useChain'; -import { waitFor } from '@testing-library/react'; vi.mock('../utils/createApi', () => ({ - createApi: () => Promise.resolve(mockClient.polkadot) + createApi: () => Promise.resolve(mockClient.polkadot), })); test('useChain', async () => { - const { result } = renderHook(() => ({ - useChain: useChain(), - }), { - config: mockConfig - }); + const { result } = renderHook( + () => ({ + useChain: useChain(), + }), + { + config: mockConfig, + } + ); await waitFor(() => { expect(result.current.useChain.chain).toBeDefined(); diff --git a/packages/react/src/hooks/useChain.ts b/packages/react/src/hooks/useChain.ts index d22096b..bd57864 100644 --- a/packages/react/src/hooks/useChain.ts +++ b/packages/react/src/hooks/useChain.ts @@ -1,5 +1,5 @@ import type { Chain } from '../types'; -import {useLuno} from './useLuno' +import { useLuno } from './useLuno'; export interface UseChainResult { chain?: Chain; diff --git a/packages/react/src/hooks/useChains.test.ts b/packages/react/src/hooks/useChains.test.ts index c2b91f9..752d54b 100644 --- a/packages/react/src/hooks/useChains.test.ts +++ b/packages/react/src/hooks/useChains.test.ts @@ -1,19 +1,21 @@ +import { waitFor } from '@testing-library/react'; import { expect, test, vi } from 'vitest'; -import { mockConfig, mockClient } from '../test-utils'; -import { renderHook } from '../test-utils'; +import { mockClient, mockConfig, renderHook } from '../test-utils'; import { useChains } from './useChains'; -import { waitFor } from '@testing-library/react'; vi.mock('../utils/createApi', () => ({ - createApi: () => Promise.resolve(mockClient.polkadot) + createApi: () => Promise.resolve(mockClient.polkadot), })); test('useChains', async () => { - const { result } = renderHook(() => ({ - useChains: useChains() - }), { - config: mockConfig - }); + const { result } = renderHook( + () => ({ + useChains: useChains(), + }), + { + config: mockConfig, + } + ); await waitFor(() => { expect(result.current.useChains.length).toBeGreaterThan(0); diff --git a/packages/react/src/hooks/useConfig.test.ts b/packages/react/src/hooks/useConfig.test.ts index 0695c71..63fbda4 100644 --- a/packages/react/src/hooks/useConfig.test.ts +++ b/packages/react/src/hooks/useConfig.test.ts @@ -1,19 +1,21 @@ +import { waitFor } from '@testing-library/react'; import { expect, test, vi } from 'vitest'; -import { mockConfig, mockClient } from '../test-utils'; -import { renderHook } from '../test-utils'; +import { mockClient, mockConfig, renderHook } from '../test-utils'; import { useConfig } from './useConfig'; -import { waitFor } from '@testing-library/react'; vi.mock('../utils/createApi', () => ({ - createApi: () => Promise.resolve(mockClient.polkadot) + createApi: () => Promise.resolve(mockClient.polkadot), })); test('useConfig', async () => { - const { result } = renderHook(() => ({ - useConfig: useConfig() - }), { - config: mockConfig - }); + const { result } = renderHook( + () => ({ + useConfig: useConfig(), + }), + { + config: mockConfig, + } + ); await waitFor(() => { expect(result.current.useConfig).toBeDefined(); diff --git a/packages/react/src/hooks/useConnect.test.ts b/packages/react/src/hooks/useConnect.test.ts index 4e98ec6..b78b26b 100644 --- a/packages/react/src/hooks/useConnect.test.ts +++ b/packages/react/src/hooks/useConnect.test.ts @@ -1,10 +1,9 @@ -import { expect, afterEach, test } from 'vitest'; -import { mockConfig, MockConnector } from '../test-utils'; -import { renderHook } from '../test-utils'; import { act, waitFor } from '@testing-library/react'; -import { useConnect } from './useConnect'; -import { useAccount } from './useAccount'; +import { afterEach, expect, test } from 'vitest'; +import { type MockConnector, mockConfig, renderHook } from '../test-utils'; import { ConnectionStatus } from '../types'; +import { useAccount } from './useAccount'; +import { useConnect } from './useConnect'; const connector = mockConfig.connectors[0] as MockConnector; @@ -15,12 +14,15 @@ afterEach(async () => { }); test('useConnect', async () => { - const { result } = renderHook(() => ({ - useAccount: useAccount(), - useConnect: useConnect(), - }), { - config: mockConfig - }); + const { result } = renderHook( + () => ({ + useAccount: useAccount(), + useConnect: useConnect(), + }), + { + config: mockConfig, + } + ); expect(result.current.useAccount.address).toBeUndefined(); expect(result.current.useAccount.account).toBeUndefined(); @@ -28,13 +30,11 @@ test('useConnect', async () => { await act(async () => { await result.current.useConnect.connectAsync({ - connectorId: connector.id + connectorId: connector.id, }); }); - await waitFor(() => - expect(result.current.useConnect.isSuccess).toBeTruthy(), - ) + await waitFor(() => expect(result.current.useConnect.isSuccess).toBeTruthy()); expect(result.current.useConnect.status).toBe(ConnectionStatus.Connected); expect(result.current.useAccount.address).toBeDefined(); diff --git a/packages/react/src/hooks/useConnect.ts b/packages/react/src/hooks/useConnect.ts index 8e88faa..681e4e2 100644 --- a/packages/react/src/hooks/useConnect.ts +++ b/packages/react/src/hooks/useConnect.ts @@ -1,30 +1,18 @@ +import type { ConnectionStatus, Connector } from '../types'; +import { sleep } from '../utils'; import { useLuno } from './useLuno'; -import type { Connector } from '../types'; -import { ConnectionStatus } from '../types' -import { useLunoMutation, type LunoMutationOptions } from './useLunoMutation'; -import { sleep } from '../utils' +import { type LunoMutationOptions, useLunoMutation } from './useLunoMutation'; export interface ConnectVariables { connectorId: string; targetChainId?: string; } -export type UseConnectOptions = LunoMutationOptions< - void, - Error, - ConnectVariables, - unknown ->; +export type UseConnectOptions = LunoMutationOptions; export interface UseConnectResult { - connect: ( - variables: ConnectVariables, - options?: UseConnectOptions - ) => void; - connectAsync: ( - variables: ConnectVariables, - options?: UseConnectOptions - ) => Promise; + connect: (variables: ConnectVariables, options?: UseConnectOptions) => void; + connectAsync: (variables: ConnectVariables, options?: UseConnectOptions) => Promise; connectors: Connector[]; activeConnector?: Connector; status: ConnectionStatus; @@ -43,15 +31,13 @@ export const useConnect = (hookLevelConfig?: UseConnectOptions): UseConnectResul const connectFn = async (variables: ConnectVariables): Promise => { await connect(variables.connectorId, variables.targetChainId); - await sleep() + await sleep(); }; - const mutationResult = useLunoMutation< - void, - Error, - ConnectVariables, - unknown - >(connectFn, hookLevelConfig); + const mutationResult = useLunoMutation( + connectFn, + hookLevelConfig + ); return { connect: mutationResult.mutate, diff --git a/packages/react/src/hooks/useConnectors.test.ts b/packages/react/src/hooks/useConnectors.test.ts index 53744e8..757f6a3 100644 --- a/packages/react/src/hooks/useConnectors.test.ts +++ b/packages/react/src/hooks/useConnectors.test.ts @@ -1,15 +1,17 @@ +import { waitFor } from '@testing-library/react'; import { expect, test } from 'vitest'; -import { mockConfig } from '../test-utils'; -import { renderHook } from '../test-utils'; +import { mockConfig, renderHook } from '../test-utils'; import { useConnectors } from './useConnectors'; -import { waitFor } from '@testing-library/react'; test('useConnectors', async () => { - const { result } = renderHook(() => ({ - useConnectors: useConnectors() - }), { - config: mockConfig - }); + const { result } = renderHook( + () => ({ + useConnectors: useConnectors(), + }), + { + config: mockConfig, + } + ); await waitFor(() => { expect(result.current.useConnectors.length).toBeGreaterThan(0); diff --git a/packages/react/src/hooks/useDisconnect.test.ts b/packages/react/src/hooks/useDisconnect.test.ts index 10b6828..eb8a6c0 100644 --- a/packages/react/src/hooks/useDisconnect.test.ts +++ b/packages/react/src/hooks/useDisconnect.test.ts @@ -1,11 +1,10 @@ -import { expect, afterEach, test, beforeEach } from 'vitest'; -import { mockConfig, MockConnector } from '../test-utils'; -import { renderHook } from '../test-utils'; import { act, waitFor } from '@testing-library/react'; +import { afterEach, beforeEach, expect, test } from 'vitest'; +import { type MockConnector, mockConfig, renderHook } from '../test-utils'; +import { ConnectionStatus } from '../types'; +import { useAccount } from './useAccount'; import { useConnect } from './useConnect'; import { useDisconnect } from './useDisconnect'; -import { useAccount } from './useAccount'; -import { ConnectionStatus } from '../types'; const connector = mockConfig.connectors[0] as MockConnector; @@ -16,23 +15,24 @@ afterEach(async () => { }); test('useDisconnect', async () => { - const { result } = renderHook(() => ({ - useAccount: useAccount(), - useDisconnect: useDisconnect(), - useConnect: useConnect(), - }), { - config: mockConfig - }); + const { result } = renderHook( + () => ({ + useAccount: useAccount(), + useDisconnect: useDisconnect(), + useConnect: useConnect(), + }), + { + config: mockConfig, + } + ); await act(async () => { await result.current.useConnect.connectAsync({ - connectorId: connector.id + connectorId: connector.id, }); }); - await waitFor(() => - expect(result.current.useConnect.status).toBe(ConnectionStatus.Connected) - ); + await waitFor(() => expect(result.current.useConnect.status).toBe(ConnectionStatus.Connected)); expect(result.current.useAccount.address).toBeDefined(); expect(result.current.useAccount.account).toBeDefined(); @@ -42,7 +42,7 @@ test('useDisconnect', async () => { }); await waitFor(() => - expect(result.current.useDisconnect.status).toBe(ConnectionStatus.Disconnected), + expect(result.current.useDisconnect.status).toBe(ConnectionStatus.Disconnected) ); expect(result.current.useAccount.address).toBeUndefined(); diff --git a/packages/react/src/hooks/useDisconnect.ts b/packages/react/src/hooks/useDisconnect.ts index b8334c6..3a15c45 100644 --- a/packages/react/src/hooks/useDisconnect.ts +++ b/packages/react/src/hooks/useDisconnect.ts @@ -1,13 +1,8 @@ +import type { ConnectionStatus } from '../types'; import { useLuno } from './useLuno'; -import { ConnectionStatus } from '../types'; -import { useLunoMutation, type LunoMutationOptions } from './useLunoMutation'; +import { type LunoMutationOptions, useLunoMutation } from './useLunoMutation'; -export type UseDisconnectOptions = LunoMutationOptions< - void, - Error, - void, - unknown ->; +export type UseDisconnectOptions = LunoMutationOptions; export interface UseDisconnectResult { disconnect: (options?: UseDisconnectOptions) => void; @@ -30,16 +25,12 @@ export const useDisconnect = (hookLevelConfig?: UseDisconnectOptions): UseDiscon await disconnect(); }; - const mutationResult = useLunoMutation< - void, - Error, - void, - unknown - >(disconnectFn, hookLevelConfig); + const mutationResult = useLunoMutation(disconnectFn, hookLevelConfig); return { disconnect: (options?: UseDisconnectOptions) => mutationResult.mutate(undefined, options), - disconnectAsync: (options?: UseDisconnectOptions) => mutationResult.mutateAsync(undefined, options), + disconnectAsync: (options?: UseDisconnectOptions) => + mutationResult.mutateAsync(undefined, options), status, data: mutationResult.data, error: mutationResult.error, diff --git a/packages/react/src/hooks/useEstimatePaymentInfo.test.ts b/packages/react/src/hooks/useEstimatePaymentInfo.test.ts new file mode 100644 index 0000000..5defef8 --- /dev/null +++ b/packages/react/src/hooks/useEstimatePaymentInfo.test.ts @@ -0,0 +1,150 @@ +import { act, waitFor } from '@testing-library/react'; +import { afterEach, expect, test, vi } from 'vitest'; +import { type MockConnector, mockConfig, renderHook } from '../test-utils'; +import { useEstimatePaymentInfo } from './useEstimatePaymentInfo'; +import { useConnect } from './useConnect'; +import { ConnectionStatus } from '../types'; + +const connector = mockConfig.connectors[0] as MockConnector; + +vi.mock('@luno-kit/core/utils', () => ({ + formatBalance: vi.fn((value: bigint, decimals: number) => { + return `${(Number(value) / Math.pow(10, decimals)).toFixed(4)}`; + }), +})); + +afterEach(async () => { + if (connector.accounts.length > 0) { + await connector.disconnect(); + } +}); + +test('useEstimatePaymentInfo - should estimate payment info successfully', async () => { + const { result } = renderHook( + () => ({ + useEstimatePaymentInfo: useEstimatePaymentInfo(), + useConnect: useConnect(), + }), + { config: mockConfig } + ); + + await act(async () => { + await result.current.useConnect.connectAsync({ + connectorId: connector.id, + }); + }); + + await waitFor(() => { + expect(result.current.useConnect.status).toBe(ConnectionStatus.Connected); + }); + + const mockExtrinsic = { + paymentInfo: vi.fn().mockResolvedValue({ + partialFee: 1000000000n, + weight: { + proofSize: 10779n, + refTime: 485747000n, + }, + class: 'Normal', + }), + } as any; + + let paymentInfo: any; + await act(async () => { + paymentInfo = await result.current.useEstimatePaymentInfo.estimate(mockExtrinsic); + }); + + await waitFor(() => { + expect(result.current.useEstimatePaymentInfo.isLoading).toBe(false); + }); + + expect(paymentInfo).toBeDefined(); + expect(paymentInfo.partialFee).toBe(1000000000n); + expect(paymentInfo.weight).toEqual({ + proofSize: 10779n, + refTime: 485747000n, + }); + expect(paymentInfo.class).toBe('Normal'); + + expect(result.current.useEstimatePaymentInfo.data).toEqual(paymentInfo); + expect(result.current.useEstimatePaymentInfo.error).toBeNull(); +}); + +test('useEstimatePaymentInfo - should return undefined when no extrinsic or sender', async () => { + const { result } = renderHook( + () => ({ + useEstimatePaymentInfo: useEstimatePaymentInfo(), + useConnect: useConnect(), + }), + { + config: mockConfig, + } + ); + + await act(async () => { + await result.current.useConnect.connectAsync({ + connectorId: connector.id, + }); + }); + + await waitFor(() => { + expect(result.current.useConnect.status).toBe(ConnectionStatus.Connected); + }); + + let result1: any; + await act(async () => { + result1 = await result.current.useEstimatePaymentInfo.estimate(null as any); + }); + expect(result1).toBeUndefined(); + + let result2: any; + await act(async () => { + result2 = await result.current.useEstimatePaymentInfo.estimate({} as any, ''); + }); + expect(result2).toBeUndefined(); +}); + +test('useEstimatePaymentInfo - should use custom sender address', async () => { + const { result } = renderHook( + () => ({ + useEstimatePaymentInfo: useEstimatePaymentInfo(), + useConnect: useConnect(), + }), + { + config: mockConfig, + } + ); + + await act(async () => { + await result.current.useConnect.connectAsync({ + connectorId: connector.id, + }); + }); + + await waitFor(() => { + expect(result.current.useConnect.status).toBe(ConnectionStatus.Connected); + }); + + const customSender = '5CustomAddress123456789'; + const mockExtrinsic = { + paymentInfo: vi.fn().mockResolvedValue({ + partialFee: 2000000000n, + weight: { + proofSize: 15000n, + refTime: 600000000n, + }, + class: 'Normal', + }), + } as any; + + await act(async () => { + await result.current.useEstimatePaymentInfo.estimate(mockExtrinsic, customSender); + }); + + await waitFor(() => { + expect(result.current.useEstimatePaymentInfo.isLoading).toBe(false); + }); + + expect(mockExtrinsic.paymentInfo).toHaveBeenCalledWith(customSender); + expect(result.current.useEstimatePaymentInfo.data).toBeDefined(); +}); diff --git a/packages/react/src/hooks/useEstimatePaymentInfo.ts b/packages/react/src/hooks/useEstimatePaymentInfo.ts new file mode 100644 index 0000000..e5a6a5e --- /dev/null +++ b/packages/react/src/hooks/useEstimatePaymentInfo.ts @@ -0,0 +1,55 @@ +import { useCallback, useState } from 'react'; +import type { ISubmittableExtrinsic, TxPaymentInfo } from 'dedot/types'; +import { useLuno } from './useLuno'; +import { formatBalance } from '@luno-kit/core/utils'; + +interface PaymentInfo extends TxPaymentInfo { + partialFeeFormatted: string; +} + +export function useEstimatePaymentInfo() { + const { account, currentChain } = useLuno(); + const [data, setData] = useState(null); + const [isLoading, setIsLoading] = useState(false); + const [error, setError] = useState(null); + + const estimate = useCallback( + async ( + extrinsic: ISubmittableExtrinsic, + senderAddress?: string + ): Promise => { + const sender = senderAddress || account?.address; + if (!extrinsic || !sender || !currentChain) return; + + setIsLoading(true); + setError(null); + + try { + const result = await extrinsic.paymentInfo(sender); + + const decimals = currentChain.nativeCurrency.decimals; + + const paymentInfo = { + ...result, + partialFeeFormatted: formatBalance(result.partialFee, decimals), + }; + + setData(paymentInfo); + return paymentInfo; + } catch (err) { + const error = err instanceof Error ? err : new Error('Failed to estimate payment info'); + setError(error); + } finally { + setIsLoading(false); + } + }, + [account?.address, currentChain] + ); + + return { + data, + isLoading, + error, + estimate, + }; +} diff --git a/packages/react/src/hooks/useGenesisHash.test.ts b/packages/react/src/hooks/useGenesisHash.test.ts index c098d66..e44a1d5 100644 --- a/packages/react/src/hooks/useGenesisHash.test.ts +++ b/packages/react/src/hooks/useGenesisHash.test.ts @@ -1,23 +1,25 @@ -import { expect, describe, it, vi } from 'vitest'; -import { mockConfig, mockClient } from '../test-utils'; -import { renderHook } from '../test-utils'; +import { polkadot } from '@luno-kit/core/chains'; import { waitFor } from '@testing-library/react'; +import { describe, expect, it, vi } from 'vitest'; +import { mockClient, mockConfig, renderHook } from '../test-utils'; import { useGenesisHash } from './useGenesisHash'; import { useLuno } from './useLuno'; -import { polkadot } from '@luno-kit/core/chains'; vi.mock('../utils/createApi', () => ({ - createApi: () => Promise.resolve(mockClient.polkadot) + createApi: () => Promise.resolve(mockClient.polkadot), })); describe('useGenesisHash', () => { it('should return genesis hash when API is ready', async () => { - const { result } = renderHook(() => ({ - useGenesisHash: useGenesisHash(), - useLuno: useLuno(), - }), { - config: mockConfig - }); + const { result } = renderHook( + () => ({ + useGenesisHash: useGenesisHash(), + useLuno: useLuno(), + }), + { + config: mockConfig, + } + ); expect(result.current.useGenesisHash.data).toBeUndefined(); expect(result.current.useGenesisHash.isLoading).toBe(false); @@ -26,7 +28,7 @@ describe('useGenesisHash', () => { expect(result.current.useLuno.currentApi).toBeDefined(); expect(result.current.useLuno.isApiReady).toBe(true); }); - console.log('result.current.useGenesisHash', result.current.useGenesisHash) + console.log('result.current.useGenesisHash', result.current.useGenesisHash); await waitFor(() => { expect(result.current.useGenesisHash.isLoading).toBe(false); @@ -41,7 +43,7 @@ describe('useGenesisHash', () => { it('should return undefined and loading when API is not ready', () => { const { result } = renderHook(() => useGenesisHash(), { - config: mockConfig + config: mockConfig, }); expect(result.current).toEqual({ diff --git a/packages/react/src/hooks/useGenesisHash.ts b/packages/react/src/hooks/useGenesisHash.ts index 76ae159..f38c7a2 100644 --- a/packages/react/src/hooks/useGenesisHash.ts +++ b/packages/react/src/hooks/useGenesisHash.ts @@ -1,6 +1,6 @@ +import type { HexString } from '@luno-kit/core/types'; import { useQuery } from '@tanstack/react-query'; import { useLuno } from './useLuno'; -import { HexString } from 'dedot/utils'; export interface UseGenesisHashResult { data?: HexString; @@ -22,5 +22,5 @@ export const useGenesisHash = (): UseGenesisHashResult => { retry: false, }); - return { data, isLoading, error } + return { data, isLoading, error }; }; diff --git a/packages/react/src/hooks/useIsInitialized.ts b/packages/react/src/hooks/useIsInitialized.ts index 7e99892..00df108 100644 --- a/packages/react/src/hooks/useIsInitialized.ts +++ b/packages/react/src/hooks/useIsInitialized.ts @@ -1,4 +1,4 @@ -import { useRef } from 'react' +import { useRef } from 'react'; export const useIsInitialized = () => { const isInitialized = useRef(false); @@ -6,6 +6,6 @@ export const useIsInitialized = () => { isInitialized: isInitialized.current, markAsInitialized: () => { isInitialized.current = true; - } + }, }; }; diff --git a/packages/react/src/hooks/useLuno.ts b/packages/react/src/hooks/useLuno.ts index 9755996..b4bdba8 100644 --- a/packages/react/src/hooks/useLuno.ts +++ b/packages/react/src/hooks/useLuno.ts @@ -1,5 +1,5 @@ import React, { useContext } from 'react'; -import { LunoContext, LunoContextState } from '../context/LunoContext'; +import { LunoContext, type LunoContextState } from '../context/LunoContext'; export const useLuno = (): LunoContextState => { const context = useContext(LunoContext); diff --git a/packages/react/src/hooks/useLunoMutaion.test.tsx b/packages/react/src/hooks/useLunoMutaion.test.tsx index 676c11f..15aac07 100644 --- a/packages/react/src/hooks/useLunoMutaion.test.tsx +++ b/packages/react/src/hooks/useLunoMutaion.test.tsx @@ -1,14 +1,12 @@ -import { beforeEach, describe, it, expect, vi } from 'vitest'; +import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; import { renderHook } from '@testing-library/react'; +import { beforeEach, describe, expect, it, vi } from 'vitest'; import { useLunoMutation } from './useLunoMutation'; -import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; describe('useLunoMutation', () => { const queryClient = new QueryClient(); const wrapper = ({ children }) => ( - - {children} - + {children} ); beforeEach(() => { @@ -18,10 +16,7 @@ describe('useLunoMutation', () => { it('should return correct mutation interface', () => { const mockMutationFn = vi.fn(); - const { result } = renderHook( - () => useLunoMutation(mockMutationFn), - { wrapper } - ); + const { result } = renderHook(() => useLunoMutation(mockMutationFn), { wrapper }); expect(result.current).toEqual( expect.objectContaining({ @@ -35,7 +30,7 @@ describe('useLunoMutation', () => { isSuccess: expect.any(Boolean), status: expect.any(String), reset: expect.any(Function), - variables: undefined + variables: undefined, }) ); }); @@ -45,13 +40,10 @@ describe('useLunoMutation', () => { const mockOptions = { onSuccess: vi.fn(), onError: vi.fn(), - onSettled: vi.fn() + onSettled: vi.fn(), }; - const { result } = renderHook( - () => useLunoMutation(mockMutationFn, mockOptions), - { wrapper } - ); + const { result } = renderHook(() => useLunoMutation(mockMutationFn, mockOptions), { wrapper }); expect(result.current.mutate).toBeDefined(); expect(result.current.mutateAsync).toBeDefined(); diff --git a/packages/react/src/hooks/useLunoMutation.ts b/packages/react/src/hooks/useLunoMutation.ts index b9b0f5b..35b7e54 100644 --- a/packages/react/src/hooks/useLunoMutation.ts +++ b/packages/react/src/hooks/useLunoMutation.ts @@ -1,7 +1,7 @@ import { - useMutation, - type UseMutationOptions, type MutateOptions as ReactQueryMutateOptions, + type UseMutationOptions, + useMutation, } from '@tanstack/react-query'; export type LunoMutationOptions< @@ -9,10 +9,12 @@ export type LunoMutationOptions< TError = Error, TVariables = void, TContext = unknown, -> = Partial, - 'onSuccess' | 'onError' | 'onSettled' ->>; +> = Partial< + Pick< + ReactQueryMutateOptions, + 'onSuccess' | 'onError' | 'onSettled' + > +>; export interface LunoMutationResult< TData = unknown, @@ -20,13 +22,11 @@ export interface LunoMutationResult< TVariables = void, TContext = unknown, > { - mutate: ( variables: TVariables, options?: LunoMutationOptions ) => void; - mutateAsync: ( variables: TVariables, options?: LunoMutationOptions @@ -52,7 +52,6 @@ export function useLunoMutation< mutationFn: (variables: TVariables) => Promise, hookLevelOptions?: LunoMutationOptions ): LunoMutationResult { - const tanstackMutationHookOptions: Pick< UseMutationOptions, 'onSuccess' | 'onError' | 'onSettled' @@ -80,13 +79,19 @@ export function useLunoMutation< variables: TVariables, callTimeOptions?: LunoMutationOptions ) => { - mutation.mutate(variables, callTimeOptions as ReactQueryMutateOptions); + mutation.mutate( + variables, + callTimeOptions as ReactQueryMutateOptions + ); }, mutateAsync: ( variables: TVariables, callTimeOptions?: LunoMutationOptions ) => { - return mutation.mutateAsync(variables, callTimeOptions as ReactQueryMutateOptions); + return mutation.mutateAsync( + variables, + callTimeOptions as ReactQueryMutateOptions + ); }, data: mutation.data, error: mutation.error, diff --git a/packages/react/src/hooks/usePapiSigner.test.ts b/packages/react/src/hooks/usePapiSigner.test.ts new file mode 100644 index 0000000..c4c2e89 --- /dev/null +++ b/packages/react/src/hooks/usePapiSigner.test.ts @@ -0,0 +1,96 @@ +import { act, waitFor } from '@testing-library/react'; +import { afterEach, describe, expect, it, vi } from 'vitest'; +import { type MockConnector, mockConfig, renderHook } from '../test-utils'; +import { ConnectionStatus } from '../types'; +import { useAccount } from './useAccount'; +import { useConnect } from './useConnect'; +import { useDisconnect } from './useDisconnect'; +import { usePapiSigner } from './usePapiSigner'; +import { useSigner } from './useSigner'; + +const connector = mockConfig.connectors[0] as MockConnector; + +describe('usePapiSigner', () => { + afterEach(async () => { + if (connector.accounts.length > 0) { + await connector.disconnect(); + } + vi.restoreAllMocks(); + }); + + it('should handle normal connection flow', async () => { + const { result } = renderHook( + () => ({ + useDisconnect: useDisconnect(), + useConnect: useConnect(), + useAccount: useAccount(), + useSigner: useSigner(), + usePapiSigner: usePapiSigner(), + }), + { + config: mockConfig, + } + ); + + expect(result.current.useSigner.data).toBeUndefined(); + expect(result.current.useAccount.address).toBeUndefined(); + expect(result.current.useSigner.data).toBeUndefined(); + + await act(async () => { + await result.current.useConnect.connectAsync({ + connectorId: connector.id, + }); + }); + + await waitFor(() => { + expect(result.current.useConnect.status).toBe(ConnectionStatus.Connected); + expect(result.current.useSigner.data).toBeDefined(); + expect(result.current.useAccount.address).toBeDefined(); + + expect(result.current.usePapiSigner.data).toBeDefined(); + expect(result.current.usePapiSigner.isLoading).toBe(false); + }); + + await act(async () => { + await result.current.useDisconnect.disconnectAsync(); + }); + + expect(result.current.useSigner.data).toBeUndefined(); + expect(result.current.useSigner.isLoading).toBe(false); + }); + + it('should handle createPapiSigner failure', async () => { + const { result } = renderHook( + () => ({ + useConnect: useConnect(), + useSigner: useSigner(), + useAccount: useAccount(), + usePapiSigner: usePapiSigner(), + }), + { + config: mockConfig, + } + ); + + const coreUtils = await import('@luno-kit/core/utils'); + + const mockCreatePapiSigner = vi.spyOn(coreUtils, 'createPapiSigner'); + mockCreatePapiSigner.mockRejectedValueOnce(new Error('Failed to get signer')); + + await act(async () => { + await result.current.useConnect.connectAsync({ + connectorId: connector.id, + }); + }); + + await waitFor(() => { + expect(result.current.useSigner.data).toBeDefined(); + expect(result.current.useAccount.address).toBeDefined(); + + expect(result.current.usePapiSigner.data).toBeUndefined(); + expect(result.current.usePapiSigner.isLoading).toBe(false); + }); + + mockCreatePapiSigner.mockRestore(); + }); +}); diff --git a/packages/react/src/hooks/usePapiSigner.ts b/packages/react/src/hooks/usePapiSigner.ts new file mode 100644 index 0000000..a5717bb --- /dev/null +++ b/packages/react/src/hooks/usePapiSigner.ts @@ -0,0 +1,34 @@ +import type { PapiSigner } from '@luno-kit/core/types'; +import { createPapiSigner } from '@luno-kit/core/utils'; +import { useEffect, useState } from 'react'; +import { useAccount } from './useAccount'; +import { useSigner } from './useSigner'; + +export interface UsePapiSignerResult { + data?: PapiSigner; + isLoading: boolean; +} + +export function usePapiSigner(): UsePapiSignerResult { + const { data: signer } = useSigner(); + const { address } = useAccount(); + const [isLoading, setIsLoading] = useState(false); + const [papiSigner, setPapiSigner] = useState(undefined); + + useEffect(() => { + if (!signer || !address) { + setPapiSigner(undefined); + setIsLoading(false); + return; + } + + setIsLoading(true); + + createPapiSigner(address, signer) + .then((papiSigner: PapiSigner | undefined) => setPapiSigner(papiSigner)) + .catch(() => setPapiSigner(undefined)) + .finally(() => setIsLoading(false)); + }, [signer, address]); + + return { data: papiSigner, isLoading }; +} diff --git a/packages/react/src/hooks/useRuntimeVersion.test.ts b/packages/react/src/hooks/useRuntimeVersion.test.ts index b1b0a4c..20bfc64 100644 --- a/packages/react/src/hooks/useRuntimeVersion.test.ts +++ b/packages/react/src/hooks/useRuntimeVersion.test.ts @@ -1,14 +1,13 @@ -import { expect, afterEach, test, vi } from 'vitest'; -import { mockConfig, MockConnector, mockClient } from '../test-utils'; -import { renderHook } from '../test-utils'; import { waitFor } from '@testing-library/react'; +import { afterEach, expect, test, vi } from 'vitest'; +import { type MockConnector, mockClient, mockConfig, renderHook } from '../test-utils'; +import { useApi } from './useApi'; import { useRuntimeVersion } from './useRuntimeVersion'; -import { useApi } from './useApi' const connector = mockConfig.connectors[0] as MockConnector; vi.mock('../utils/createApi', () => ({ - createApi: () => Promise.resolve(mockClient.polkadot) + createApi: () => Promise.resolve(mockClient.polkadot), })); afterEach(async () => { @@ -18,12 +17,15 @@ afterEach(async () => { }); test('useRuntimeVersion', async () => { - const { result } = renderHook(() => ({ - useApi: useApi(), - useRuntimeVersion: useRuntimeVersion(), - }), { - config: mockConfig - }); + const { result } = renderHook( + () => ({ + useApi: useApi(), + useRuntimeVersion: useRuntimeVersion(), + }), + { + config: mockConfig, + } + ); expect(result.current.useRuntimeVersion.data).toBeUndefined(); expect(result.current.useRuntimeVersion.isLoading).toBe(false); diff --git a/packages/react/src/hooks/useRuntimeVersion.ts b/packages/react/src/hooks/useRuntimeVersion.ts index fc04721..ddeb0ca 100644 --- a/packages/react/src/hooks/useRuntimeVersion.ts +++ b/packages/react/src/hooks/useRuntimeVersion.ts @@ -1,16 +1,21 @@ -import { useLuno } from './useLuno'; +import { type UseQueryResult, useQuery } from '@tanstack/react-query'; import type { SubstrateRuntimeVersion } from 'dedot'; -import { useQuery, UseQueryResult } from '@tanstack/react-query'; +import { useLuno } from './useLuno'; export type UseRuntimeVersionResult = UseQueryResult; export const useRuntimeVersion = (): UseRuntimeVersionResult => { const { currentApi, isApiReady, currentChainId } = useLuno(); - return useQuery({ + return useQuery< + SubstrateRuntimeVersion, + Error, + SubstrateRuntimeVersion, + readonly (undefined | string)[] + >({ queryKey: ['luno', 'runtimeVersion', currentChainId] as const, queryFn: async () => { - return await currentApi!.getRuntimeVersion() + return await currentApi!.getRuntimeVersion(); }, enabled: !!currentApi && isApiReady && !!currentChainId, }); diff --git a/packages/react/src/hooks/useSendTransaction.test.ts b/packages/react/src/hooks/useSendTransaction.test.ts index e2990f1..cee1f95 100644 --- a/packages/react/src/hooks/useSendTransaction.test.ts +++ b/packages/react/src/hooks/useSendTransaction.test.ts @@ -1,27 +1,26 @@ -import { expect, afterEach, test, vi } from 'vitest'; -import { mockConfig, MockConnector } from '../test-utils'; -import { renderHook } from '../test-utils'; import { act, waitFor } from '@testing-library/react'; +import { afterEach, expect, test, vi } from 'vitest'; +import { type MockConnector, mockConfig, renderHook } from '../test-utils'; +import { useApi } from './useApi'; import { useConnect } from './useConnect'; import { useSendTransaction } from './useSendTransaction'; -import { useApi } from './useApi'; const connector = mockConfig.connectors[0] as MockConnector; const mockExtrinsic = { - signAndSend: vi.fn() + signAndSend: vi.fn(), }; const mockApi = { tx: { balances: { - transferKeepAlive: vi.fn().mockReturnValue(mockExtrinsic) - } - } + transferKeepAlive: vi.fn().mockReturnValue(mockExtrinsic), + }, + }, }; vi.mock('../utils/createApi', () => ({ - createApi: () => Promise.resolve(mockApi) + createApi: () => Promise.resolve(mockApi), })); afterEach(async () => { @@ -42,17 +41,20 @@ test('useSendTransaction', async () => { }); }); - const { result } = renderHook(() => ({ - useConnect: useConnect(), - useApi: useApi(), - useSendTransaction: useSendTransaction(), - }), { - config: mockConfig - }); + const { result } = renderHook( + () => ({ + useConnect: useConnect(), + useApi: useApi(), + useSendTransaction: useSendTransaction(), + }), + { + config: mockConfig, + } + ); await act(async () => { await result.current.useConnect.connectAsync({ - connectorId: connector.id + connectorId: connector.id, }); }); @@ -61,7 +63,7 @@ test('useSendTransaction', async () => { }); const sendPromise = result.current.useSendTransaction.sendTransactionAsync({ - extrinsic: mockExtrinsic + extrinsic: mockExtrinsic, }); await waitFor(() => { @@ -72,7 +74,7 @@ test('useSendTransaction', async () => { statusCallback({ status: { type: 'Finalized', value: { blockHash: '0xabc', blockNumber: 123 } }, events: [], - txHash: '0x123' + txHash: '0x123', }); resolveSignAndSend(() => {}); }); @@ -85,7 +87,6 @@ test('useSendTransaction', async () => { expect(result.current.useSendTransaction.detailedStatus).toBe('finalized'); }); - test('should handle transaction error states', async () => { let resolveSignAndSend: (value: any) => void; let statusCallback: Function; @@ -97,17 +98,20 @@ test('should handle transaction error states', async () => { }); }); - const { result } = renderHook(() => ({ - useConnect: useConnect(), - useApi: useApi(), - useSendTransaction: useSendTransaction(), - }), { - config: mockConfig - }); + const { result } = renderHook( + () => ({ + useConnect: useConnect(), + useApi: useApi(), + useSendTransaction: useSendTransaction(), + }), + { + config: mockConfig, + } + ); await act(async () => { await result.current.useConnect.connectAsync({ - connectorId: connector.id + connectorId: connector.id, }); }); @@ -115,9 +119,11 @@ test('should handle transaction error states', async () => { expect(result.current.useApi.isApiReady).toBeTruthy(); }); - result.current.useSendTransaction.sendTransactionAsync({ - extrinsic: mockExtrinsic - }).catch(e => {}) + result.current.useSendTransaction + .sendTransactionAsync({ + extrinsic: mockExtrinsic, + }) + .catch((e) => {}); await waitFor(() => { expect(mockExtrinsic.signAndSend).toHaveBeenCalled(); @@ -126,7 +132,7 @@ test('should handle transaction error states', async () => { await act(async () => { statusCallback({ status: { type: 'Invalid' }, - txHash: '0x123' + txHash: '0x123', }); resolveSignAndSend(() => {}); }); diff --git a/packages/react/src/hooks/useSendTransaction.ts b/packages/react/src/hooks/useSendTransaction.ts index c52a203..1cac8ee 100644 --- a/packages/react/src/hooks/useSendTransaction.ts +++ b/packages/react/src/hooks/useSendTransaction.ts @@ -1,14 +1,24 @@ -import type { ISubmittableExtrinsic, ISubmittableResult } from 'dedot/types'; -import { IEventRecord as EventRecord } from 'dedot/types' +import type { HexString } from '@luno-kit/core/types'; +import type { DispatchError, DispatchInfo } from 'dedot/codecs'; +import type { + IEventRecord as EventRecord, + ISubmittableExtrinsic, + ISubmittableResult, +} from 'dedot/types'; +import { useCallback, useState } from 'react'; +import type { TxStatus } from '../types'; +import { getReadableDispatchError } from '../utils'; +import { useAccount } from './useAccount'; import { useLuno } from './useLuno'; import { type LunoMutationOptions, useLunoMutation } from './useLunoMutation'; -import { DispatchError, DispatchInfo } from 'dedot/codecs'; -import { getReadableDispatchError } from '../utils'; -import type { HexString } from 'dedot/utils'; -import { useCallback, useState } from 'react'; -import { TxStatus } from '../types'; -export type DetailedTxStatus = 'idle' | 'broadcasting' | 'inBlock' | 'finalized' | 'invalid' | 'dropped'; +export type DetailedTxStatus = + | 'idle' + | 'broadcasting' + | 'inBlock' + | 'finalized' + | 'invalid' + | 'dropped'; export interface TransactionReceipt { transactionHash: HexString; @@ -54,115 +64,130 @@ export interface UseSendTransactionResult { detailedStatus: DetailedTxStatus; } -export function useSendTransaction ( - hookLevelConfig?: UseSendTransactionOptions, +export function useSendTransaction( + hookLevelConfig?: UseSendTransactionOptions ): UseSendTransactionResult { - const { account, activeConnector, currentApi, isApiReady } = useLuno(); + const { activeConnector, currentApi, isApiReady } = useLuno(); + const { account } = useAccount(); const [txStatus, setTxStatus] = useState('idle'); const [detailedTxStatus, setDetailedTxStatus] = useState('idle'); const [txError, setTxError] = useState(null); - const sendTransactionFn = useCallback(async (variables: SendTransactionVariables): Promise => { - if (!currentApi || !isApiReady) { - throw new Error('[useSendTransaction]: Polkadot API is not ready.'); - } - if (!activeConnector) { - throw new Error('[useSendTransaction]: No active connector found.'); - } - if (!account || !account.address || !account.meta?.source) { - throw new Error( - '[useSendTransaction]: No active account, address, or account metadata (source) found.' - ); - } - if (!variables.extrinsic) { - throw new Error('[useSendTransaction]: No extrinsic provided to send.'); - } - - const signer = await activeConnector.getSigner() - if (!signer) { - throw new Error('[useSendTransaction]: Could not retrieve signer from the injector.'); - } - - setTxStatus('signing'); - setDetailedTxStatus('idle') - - return new Promise((resolve, reject) => { - let unsubscribe: (() => void) | undefined; - - variables.extrinsic - .signAndSend( - account.address, { signer }, - ({ status, dispatchError, events, dispatchInfo, txHash, txIndex }: ISubmittableResult) => { - const resolveAndUnsubscribe = (receipt: TransactionReceipt) => { - if (unsubscribe) unsubscribe(); - resolve(receipt); - }; - - const rejectAndUnsubscribe = (error: Error) => { - if (unsubscribe) unsubscribe(); - setTxError(error); - reject(error); - }; - - switch (status.type) { - case 'Broadcasting': - setDetailedTxStatus('broadcasting'); - break; - case 'BestChainBlockIncluded': - setDetailedTxStatus('inBlock'); - break; - case 'Finalized': - setTxStatus('success'); - setDetailedTxStatus('finalized'); - if (dispatchError) { - resolveAndUnsubscribe({ - transactionHash: txHash, - blockHash: status.value?.blockHash, - blockNumber: status.value?.blockNumber, - events, - status: 'failed', - dispatchError, - errorMessage: getReadableDispatchError(currentApi, dispatchError), - dispatchInfo, - }); - } else { - resolveAndUnsubscribe({ - transactionHash: txHash, - blockHash: status.value?.blockHash, - blockNumber: status.value?.blockNumber, - events, - status: 'success', - dispatchError: undefined, - errorMessage: undefined, - dispatchInfo, - }); - } - break; - case 'Invalid': - setTxStatus('failed') - setDetailedTxStatus('invalid') - rejectAndUnsubscribe(new Error(`Transaction invalid: ${txHash}`)); - break; - case 'Drop': - setTxStatus('failed'); - setDetailedTxStatus('dropped'); - rejectAndUnsubscribe(new Error(`Transaction dropped: ${txHash}`)); - break; + const sendTransactionFn = useCallback( + async (variables: SendTransactionVariables): Promise => { + if (!currentApi || !isApiReady) { + throw new Error('[useSendTransaction]: Polkadot API is not ready.'); + } + if (!activeConnector) { + throw new Error('[useSendTransaction]: No active connector found.'); + } + if (!account || !account.address || !account.meta?.source) { + throw new Error( + '[useSendTransaction]: No active account, address, or account metadata (source) found.' + ); + } + if (!variables.extrinsic) { + throw new Error('[useSendTransaction]: No extrinsic provided to send.'); + } + + const signer = await activeConnector.getSigner(); + if (!signer) { + throw new Error('[useSendTransaction]: Could not retrieve signer from the injector.'); + } + + setTxStatus('signing'); + setDetailedTxStatus('idle'); + + return new Promise((resolve, reject) => { + let unsubscribe: (() => void) | undefined; + + variables.extrinsic + .signAndSend( + account.address, + { signer }, + ({ + status, + dispatchError, + events, + dispatchInfo, + txHash, + txIndex, + }: ISubmittableResult) => { + const resolveAndUnsubscribe = (receipt: TransactionReceipt) => { + if (unsubscribe) unsubscribe(); + resolve(receipt); + }; + + const rejectAndUnsubscribe = (error: Error) => { + if (unsubscribe) unsubscribe(); + setTxError(error); + reject(error); + }; + + switch (status.type) { + case 'Broadcasting': + setDetailedTxStatus('broadcasting'); + break; + case 'BestChainBlockIncluded': + setDetailedTxStatus('inBlock'); + break; + case 'Finalized': + setTxStatus('success'); + setDetailedTxStatus('finalized'); + if (dispatchError) { + resolveAndUnsubscribe({ + transactionHash: txHash, + blockHash: status.value?.blockHash, + blockNumber: status.value?.blockNumber, + events, + status: 'failed', + dispatchError, + errorMessage: getReadableDispatchError(currentApi, dispatchError), + dispatchInfo, + }); + } else { + resolveAndUnsubscribe({ + transactionHash: txHash, + blockHash: status.value?.blockHash, + blockNumber: status.value?.blockNumber, + events, + status: 'success', + dispatchError: undefined, + errorMessage: undefined, + dispatchInfo, + }); + } + break; + case 'Invalid': + setTxStatus('failed'); + setDetailedTxStatus('invalid'); + rejectAndUnsubscribe(new Error(`Transaction invalid: ${txHash}`)); + break; + case 'Drop': + setTxStatus('failed'); + setDetailedTxStatus('dropped'); + rejectAndUnsubscribe(new Error(`Transaction dropped: ${txHash}`)); + break; + } } - } - ) - .then((unsub: () => void) => { - unsubscribe = unsub; - }) - .catch((error) => { - setTxStatus('failed'); - console.error('[useSendTransaction]: Error in signAndSend promise:', error?.message || error); - setTxError(error as Error); - reject(error); - }); - }); - }, [currentApi, isApiReady, activeConnector, account, setTxStatus, setDetailedTxStatus]); + ) + .then((unsub: () => void) => { + unsubscribe = unsub; + }) + .catch((error) => { + setTxStatus('failed'); + console.error( + '[useSendTransaction]: Error in signAndSend promise:', + error?.message || error + ); + setTxError(error as Error); + reject(error); + }); + }); + }, + [currentApi, isApiReady, activeConnector, account, setTxStatus, setDetailedTxStatus] + ); const mutationResult = useLunoMutation< TransactionReceipt, @@ -184,6 +209,6 @@ export function useSendTransaction ( status: mutationResult.status, variables: mutationResult.variables, txStatus: txStatus, - detailedStatus: detailedTxStatus + detailedStatus: detailedTxStatus, }; } diff --git a/packages/react/src/hooks/useSendTransactionHash.test.ts b/packages/react/src/hooks/useSendTransactionHash.test.ts index 9c1f456..38bfea5 100644 --- a/packages/react/src/hooks/useSendTransactionHash.test.ts +++ b/packages/react/src/hooks/useSendTransactionHash.test.ts @@ -1,27 +1,26 @@ -import { expect, afterEach, test, vi } from 'vitest'; -import { mockConfig, MockConnector } from '../test-utils'; -import { renderHook } from '../test-utils'; import { act, waitFor } from '@testing-library/react'; +import { afterEach, expect, test, vi } from 'vitest'; +import { type MockConnector, mockConfig, renderHook } from '../test-utils'; +import { useApi } from './useApi'; import { useConnect } from './useConnect'; import { useSendTransactionHash } from './useSendTransactionHash'; -import { useApi } from './useApi'; const connector = mockConfig.connectors[0] as MockConnector; const mockExtrinsic = { - signAndSend: vi.fn() + signAndSend: vi.fn(), }; const mockApi = { tx: { balances: { - transferKeepAlive: vi.fn().mockReturnValue(mockExtrinsic) - } - } + transferKeepAlive: vi.fn().mockReturnValue(mockExtrinsic), + }, + }, }; vi.mock('../utils/createApi', () => ({ - createApi: () => Promise.resolve(mockApi) + createApi: () => Promise.resolve(mockApi), })); afterEach(async () => { @@ -34,17 +33,20 @@ afterEach(async () => { test('useSendTransactionHash', async () => { mockExtrinsic.signAndSend.mockResolvedValue('0x123'); - const { result } = renderHook(() => ({ - useConnect: useConnect(), - useApi: useApi(), - useSendTransactionHash: useSendTransactionHash(), - }), { - config: mockConfig - }); + const { result } = renderHook( + () => ({ + useConnect: useConnect(), + useApi: useApi(), + useSendTransactionHash: useSendTransactionHash(), + }), + { + config: mockConfig, + } + ); await act(async () => { await result.current.useConnect.connectAsync({ - connectorId: connector.id + connectorId: connector.id, }); }); @@ -53,7 +55,7 @@ test('useSendTransactionHash', async () => { }); const hash = await result.current.useSendTransactionHash.sendTransactionAsync({ - extrinsic: mockExtrinsic + extrinsic: mockExtrinsic, }); await waitFor(() => { diff --git a/packages/react/src/hooks/useSendTransactionHash.ts b/packages/react/src/hooks/useSendTransactionHash.ts index 890180d..f369368 100644 --- a/packages/react/src/hooks/useSendTransactionHash.ts +++ b/packages/react/src/hooks/useSendTransactionHash.ts @@ -1,8 +1,8 @@ +import type { HexString } from '@luno-kit/core/types'; import type { ISubmittableExtrinsic } from 'dedot/types'; -import { useLuno } from './useLuno'; -import { type LunoMutationOptions, useLunoMutation} from './useLunoMutation'; -import type { HexString } from 'dedot/utils'; import { useCallback, useState } from 'react'; +import { useLuno } from './useLuno'; +import { type LunoMutationOptions, useLunoMutation } from './useLunoMutation'; export interface SendTransactionHashVariables { extrinsic: ISubmittableExtrinsic; @@ -35,49 +35,53 @@ export interface UseSendTransactionHashResult { variables: SendTransactionHashVariables | undefined; } -export function useSendTransactionHash ( - hookLevelConfig?: UseSendTransactionHashOptions, +export function useSendTransactionHash( + hookLevelConfig?: UseSendTransactionHashOptions ): UseSendTransactionHashResult { const { account, activeConnector, currentApi, isApiReady } = useLuno(); const [txError, setTxError] = useState(null); - const sendTransactionFn = useCallback(async (variables: SendTransactionHashVariables): Promise => { - if (!currentApi || !isApiReady) { - throw new Error('[useSendTransactionHash]: Polkadot API is not ready.'); - } - if (!activeConnector) { - throw new Error('[useSendTransactionHash]: No active connector found.'); - } - if (!account || !account.address || !account.meta?.source) { - throw new Error( - '[useSendTransactionHash]: No active account, address, or account metadata (source) found.' - ); - } - if (!variables.extrinsic) { - throw new Error('[useSendTransactionHash]: No extrinsic provided to send.'); - } + const sendTransactionFn = useCallback( + async (variables: SendTransactionHashVariables): Promise => { + if (!currentApi || !isApiReady) { + throw new Error('[useSendTransactionHash]: Polkadot API is not ready.'); + } + if (!activeConnector) { + throw new Error('[useSendTransactionHash]: No active connector found.'); + } + if (!account || !account.address || !account.meta?.source) { + throw new Error( + '[useSendTransactionHash]: No active account, address, or account metadata (source) found.' + ); + } + if (!variables.extrinsic) { + throw new Error('[useSendTransactionHash]: No extrinsic provided to send.'); + } - const signer = await activeConnector.getSigner() - if (!signer) { - throw new Error('[useSendTransactionHash]: Could not retrieve signer from the injector.'); - } + const signer = await activeConnector.getSigner(); + if (!signer) { + throw new Error('[useSendTransactionHash]: Could not retrieve signer from the injector.'); + } - try { - const txHash = await variables.extrinsic - .signAndSend(account.address, { signer: signer }).catch(e => { throw e }); - return txHash as HexString - } catch (error) { - setTxError(error as Error) - throw error; - } - }, [currentApi, isApiReady, activeConnector, account]); + try { + const txHash = await variables.extrinsic + .signAndSend(account.address, { signer: signer }) + .catch((e) => { + throw e; + }); + return txHash as HexString; + } catch (error) { + setTxError(error as Error); + throw error; + } + }, + [currentApi, isApiReady, activeConnector, account] + ); - const mutationResult = useLunoMutation< - HexString, - Error, - SendTransactionHashVariables, - unknown - >(sendTransactionFn, hookLevelConfig); + const mutationResult = useLunoMutation( + sendTransactionFn, + hookLevelConfig + ); return { sendTransaction: mutationResult.mutate, diff --git a/packages/react/src/hooks/useSignMessage.test.ts b/packages/react/src/hooks/useSignMessage.test.ts index 52bd775..e269658 100644 --- a/packages/react/src/hooks/useSignMessage.test.ts +++ b/packages/react/src/hooks/useSignMessage.test.ts @@ -1,10 +1,10 @@ -import { expect, afterEach, test, vi } from 'vitest'; -import { mockConfig, MockConnector, renderHook } from '../test-utils'; import { act, waitFor } from '@testing-library/react'; +import { afterEach, expect, test, vi } from 'vitest'; +import { type MockConnector, mockConfig, renderHook } from '../test-utils'; +import { ConnectionStatus } from '../types'; import { useConnect } from './useConnect'; +import { useLuno } from './useLuno'; import { useSignMessage } from './useSignMessage'; -import { ConnectionStatus } from '../types'; -import { useLuno } from './useLuno' const connector = mockConfig.connectors[0] as MockConnector; const TEST_MESSAGE = 'Hello Polkadot'; @@ -16,13 +16,16 @@ afterEach(async () => { }); test('useSignMessage', async () => { - const { result } = renderHook(() => ({ - useConnect: useConnect(), - useSignMessage: useSignMessage(), - useLuno: useLuno(), - }), { - config: mockConfig - }); + const { result } = renderHook( + () => ({ + useConnect: useConnect(), + useSignMessage: useSignMessage(), + useLuno: useLuno(), + }), + { + config: mockConfig, + } + ); expect(result.current.useSignMessage.data).toBeUndefined(); expect(result.current.useSignMessage.isIdle).toBe(true); @@ -31,7 +34,7 @@ test('useSignMessage', async () => { await act(async () => { try { await result.current.useSignMessage.signMessageAsync({ - message: TEST_MESSAGE + message: TEST_MESSAGE, }); } catch (e) { expect(e).toBeInstanceOf(Error); @@ -41,7 +44,7 @@ test('useSignMessage', async () => { await act(async () => { await result.current.useConnect.connectAsync({ - connectorId: connector.id + connectorId: connector.id, }); }); @@ -52,7 +55,7 @@ test('useSignMessage', async () => { await act(async () => { try { await result.current.useSignMessage.signMessageAsync({ - message: '' + message: '', }); } catch (e) { expect(e).toBeInstanceOf(Error); @@ -66,7 +69,7 @@ test('useSignMessage', async () => { await act(async () => { try { await result.current.useSignMessage.signMessageAsync({ - message: TEST_MESSAGE + message: TEST_MESSAGE, }); } catch (e) { expect(e).toBeInstanceOf(Error); @@ -78,7 +81,7 @@ test('useSignMessage', async () => { await act(async () => { await result.current.useSignMessage.signMessageAsync({ - message: TEST_MESSAGE + message: TEST_MESSAGE, }); }); @@ -88,7 +91,9 @@ test('useSignMessage', async () => { expect(result.current.useSignMessage.data).toBeDefined(); expect(result.current.useSignMessage.data?.rawMessage).toBe(TEST_MESSAGE); - expect(result.current.useSignMessage.data?.addressUsed).toBe(result.current.useLuno.account.address); + expect(result.current.useSignMessage.data?.addressUsed).toBe( + result.current.useLuno.account.address + ); expect(result.current.useSignMessage.data?.signature).toContain('signed_by_mock'); await act(async () => { diff --git a/packages/react/src/hooks/useSignMessage.ts b/packages/react/src/hooks/useSignMessage.ts index 0a44670..4578748 100644 --- a/packages/react/src/hooks/useSignMessage.ts +++ b/packages/react/src/hooks/useSignMessage.ts @@ -1,5 +1,6 @@ +import { isSameAddress } from '@luno-kit/core/utils'; import { useLuno } from './useLuno'; -import { useLunoMutation, type LunoMutationOptions } from './useLunoMutation'; +import { type LunoMutationOptions, useLunoMutation } from './useLunoMutation'; export interface SignMessageVariables { message: string; @@ -19,10 +20,7 @@ export type UseSignMessageOptions = LunoMutationOptions< >; export interface UseSignMessageResult { - signMessage: ( - variables: SignMessageVariables, - options?: UseSignMessageOptions - ) => void; + signMessage: (variables: SignMessageVariables, options?: UseSignMessageOptions) => void; signMessageAsync: ( variables: SignMessageVariables, options?: UseSignMessageOptions @@ -38,14 +36,10 @@ export interface UseSignMessageResult { variables: SignMessageVariables | undefined; } -export function useSignMessage( - hookLevelConfig?: UseSignMessageOptions -): UseSignMessageResult { - const { activeConnector, account, accounts, currentChainId } = useLuno(); +export function useSignMessage(hookLevelConfig?: UseSignMessageOptions): UseSignMessageResult { + const { activeConnector, account, accounts } = useLuno(); - const mutationFn = async ( - variables: SignMessageVariables - ): Promise => { + const mutationFn = async (variables: SignMessageVariables): Promise => { if (!activeConnector) { throw new Error('[useSignMessage]: No active connector found to sign the message.'); } @@ -53,18 +47,25 @@ export function useSignMessage( throw new Error('[useSignMessage]: No address provided for signing.'); } - if (!accounts.some(acc => acc.address === account.address)) { - throw new Error(`[useSignMessage]: Address ${account.address} is not managed by ${activeConnector.id}.`); + if (!accounts.some((acc) => acc.address === account.address)) { + throw new Error( + `[useSignMessage]: Address ${account.address} is not managed by ${activeConnector.id}.` + ); } if (!variables.message) { throw new Error('[useSignMessage]: No message provided for signing.'); } + const validAccount = accounts.find((acc) => isSameAddress(acc.address, account.address)); + + if (!validAccount) { + throw new Error('[useSignMessage]: Invalid account address.'); + } + const signatureString = await activeConnector.signMessage( variables.message, - account.address, - currentChainId, + validAccount.address ); if (!signatureString) { @@ -75,16 +76,14 @@ export function useSignMessage( return { signature: signatureString, rawMessage: variables.message, - addressUsed: account.address , + addressUsed: account.address, }; }; - const mutationResult = useLunoMutation< - SignMessageData, - Error, - SignMessageVariables, - unknown - >(mutationFn, hookLevelConfig); + const mutationResult = useLunoMutation( + mutationFn, + hookLevelConfig + ); return { signMessage: mutationResult.mutate, diff --git a/packages/react/src/hooks/useSigner.test.ts b/packages/react/src/hooks/useSigner.test.ts index ef8ca00..3c7045a 100644 --- a/packages/react/src/hooks/useSigner.test.ts +++ b/packages/react/src/hooks/useSigner.test.ts @@ -1,11 +1,10 @@ -import { expect, afterEach, describe, it, vi } from 'vitest'; -import { mockConfig, MockConnector } from '../test-utils'; -import { renderHook } from '../test-utils'; import { act, waitFor } from '@testing-library/react'; -import { useConnect } from './useConnect'; -import { useSigner } from './useSigner'; +import { afterEach, describe, expect, it, vi } from 'vitest'; +import { type MockConnector, mockConfig, renderHook } from '../test-utils'; import { ConnectionStatus } from '../types'; +import { useConnect } from './useConnect'; import { useDisconnect } from './useDisconnect'; +import { useSigner } from './useSigner'; const connector = mockConfig.connectors[0] as MockConnector; @@ -17,20 +16,23 @@ describe('useSigner', () => { }); it('should handle normal connection flow', async () => { - const { result } = renderHook(() => ({ - useDisconnect: useDisconnect(), - useConnect: useConnect(), - useSigner: useSigner(), - }), { - config: mockConfig - }); + const { result } = renderHook( + () => ({ + useDisconnect: useDisconnect(), + useConnect: useConnect(), + useSigner: useSigner(), + }), + { + config: mockConfig, + } + ); expect(result.current.useSigner.data).toBeUndefined(); expect(result.current.useSigner.isLoading).toBe(false); await act(async () => { await result.current.useConnect.connectAsync({ - connectorId: connector.id + connectorId: connector.id, }); }); @@ -49,19 +51,22 @@ describe('useSigner', () => { }); it('should handle getSigner failure', async () => { - const { result } = renderHook(() => ({ - useConnect: useConnect(), - useSigner: useSigner(), - }), { - config: mockConfig - }); + const { result } = renderHook( + () => ({ + useConnect: useConnect(), + useSigner: useSigner(), + }), + { + config: mockConfig, + } + ); const mockGetSigner = vi.spyOn(connector, 'getSigner'); mockGetSigner.mockRejectedValueOnce(new Error('Failed to get signer')); await act(async () => { await result.current.useConnect.connectAsync({ - connectorId: connector.id + connectorId: connector.id, }); }); diff --git a/packages/react/src/hooks/useSigner.ts b/packages/react/src/hooks/useSigner.ts index 635745d..71b2b60 100644 --- a/packages/react/src/hooks/useSigner.ts +++ b/packages/react/src/hooks/useSigner.ts @@ -1,7 +1,7 @@ -import { useState, useEffect } from 'react'; -import { useLuno } from './useLuno'; +import { useEffect, useState } from 'react'; +import type { Signer } from '../types'; import { useAccount } from './useAccount'; -import { Signer } from '../types' +import { useLuno } from './useLuno'; export interface UseSignerResult { data?: Signer; @@ -24,11 +24,11 @@ export const useSigner = (): UseSignerResult => { setIsLoading(true); - activeConnector.getSigner() - .then(signer => setSigner(signer)) + activeConnector + .getSigner() + .then((signer) => setSigner(signer)) .catch(() => setSigner(undefined)) .finally(() => setIsLoading(false)); - }, [activeConnector, account?.address]); return { data: signer, isLoading }; diff --git a/packages/react/src/hooks/useSs58Format.test.ts b/packages/react/src/hooks/useSs58Format.test.ts index b21e1c2..0af1639 100644 --- a/packages/react/src/hooks/useSs58Format.test.ts +++ b/packages/react/src/hooks/useSs58Format.test.ts @@ -1,21 +1,23 @@ -import { expect, describe, it, vi } from 'vitest'; -import { mockConfig, mockClient } from '../test-utils'; -import { renderHook } from '../test-utils'; -import { useSs58Format } from './useSs58Format'; import { polkadot } from '@luno-kit/core/chains'; import { waitFor } from '@testing-library/react'; -import { useLuno } from './useLuno' +import { describe, expect, it, vi } from 'vitest'; +import { mockClient, mockConfig, renderHook } from '../test-utils'; +import { useLuno } from './useLuno'; +import { useSs58Format } from './useSs58Format'; vi.mock('../utils/createApi', () => ({ - createApi: () => Promise.resolve(mockClient.polkadot) + createApi: () => Promise.resolve(mockClient.polkadot), })); describe('useSs58Format', () => { it('should return chain ss58 format when connected', async () => { - const { result } = renderHook(() => ({ - useSs58Format: useSs58Format(), - useLuno: useLuno(), - }), { config: mockConfig }); + const { result } = renderHook( + () => ({ + useSs58Format: useSs58Format(), + useLuno: useLuno(), + }), + { config: mockConfig } + ); await waitFor(() => { expect(result.current.useLuno.currentApi).toBeDefined(); @@ -24,7 +26,7 @@ describe('useSs58Format', () => { expect(result.current.useSs58Format).toEqual({ data: polkadot.ss58Format, - isLoading: false + isLoading: false, }); }); @@ -33,7 +35,7 @@ describe('useSs58Format', () => { expect(result.current).toEqual({ data: undefined, - isLoading: true + isLoading: true, }); }); }); diff --git a/packages/react/src/hooks/useSs58Format.ts b/packages/react/src/hooks/useSs58Format.ts index 0a3aafc..220ec05 100644 --- a/packages/react/src/hooks/useSs58Format.ts +++ b/packages/react/src/hooks/useSs58Format.ts @@ -1,6 +1,6 @@ +import { isNumber } from 'dedot/utils'; import { useMemo } from 'react'; import { useLuno } from './useLuno'; -import { isNumber } from 'dedot/utils'; const DEFAULT_SS58_FORMAT = 42; @@ -12,19 +12,18 @@ export interface UseSs58FormatResult { export const useSs58Format = (): UseSs58FormatResult => { const { currentApi, isApiReady, currentChain } = useLuno(); - const configuredSs58Fallback = currentChain?.ss58Format !== undefined - ? currentChain.ss58Format - : DEFAULT_SS58_FORMAT; + const configuredSs58Fallback = + currentChain?.ss58Format !== undefined ? currentChain.ss58Format : DEFAULT_SS58_FORMAT; return useMemo(() => { if (currentApi && isApiReady) { - let ss58: number | undefined = undefined; + let ss58: number | undefined; try { const format = currentApi.consts.system.ss58Prefix; ss58 = isNumber(format) ? format : DEFAULT_SS58_FORMAT; } catch (e) { - console.error("[useSs58Format] Error fetching chainSS58:", e); + console.error('[useSs58Format] Error fetching chainSS58:', e); ss58 = configuredSs58Fallback; } return { data: ss58, isLoading: false }; diff --git a/packages/react/src/hooks/useStatus.test.ts b/packages/react/src/hooks/useStatus.test.ts index bf74366..0990e2a 100644 --- a/packages/react/src/hooks/useStatus.test.ts +++ b/packages/react/src/hooks/useStatus.test.ts @@ -1,11 +1,10 @@ -import { expect, test, afterEach } from 'vitest'; -import { mockConfig, MockConnector } from '../test-utils'; -import { renderHook } from '../test-utils'; -import { useStatus } from './useStatus'; -import { useConnect } from './useConnect'; import { act, waitFor } from '@testing-library/react'; +import { afterEach, expect, test } from 'vitest'; +import { type MockConnector, mockConfig, renderHook } from '../test-utils'; import { ConnectionStatus } from '../types'; -import { useDisconnect } from './useDisconnect' +import { useConnect } from './useConnect'; +import { useDisconnect } from './useDisconnect'; +import { useStatus } from './useStatus'; const connector = mockConfig.connectors[0] as MockConnector; @@ -16,19 +15,22 @@ afterEach(async () => { }); test('useStatus', async () => { - const { result } = renderHook(() => ({ - useStatus: useStatus(), - useConnect: useConnect(), - useDisconnect: useDisconnect() - }), { - config: mockConfig - }); + const { result } = renderHook( + () => ({ + useStatus: useStatus(), + useConnect: useConnect(), + useDisconnect: useDisconnect(), + }), + { + config: mockConfig, + } + ); expect(result.current.useStatus).toBe(ConnectionStatus.Disconnected); await act(async () => { await result.current.useConnect.connectAsync({ - connectorId: connector.id + connectorId: connector.id, }); }); diff --git a/packages/react/src/hooks/useStatus.ts b/packages/react/src/hooks/useStatus.ts index 8bf74f2..0183bed 100644 --- a/packages/react/src/hooks/useStatus.ts +++ b/packages/react/src/hooks/useStatus.ts @@ -1,5 +1,5 @@ +import type { ConnectionStatus } from '../types'; import { useLuno } from './useLuno'; -import { ConnectionStatus } from '../types'; export const useStatus = (): ConnectionStatus => { const { status } = useLuno(); diff --git a/packages/react/src/hooks/useSubscription.test.ts b/packages/react/src/hooks/useSubscription.test.ts index 3d669bf..984e705 100644 --- a/packages/react/src/hooks/useSubscription.test.ts +++ b/packages/react/src/hooks/useSubscription.test.ts @@ -1,10 +1,9 @@ -import { expect, describe, it, vi, beforeEach, afterEach } from 'vitest'; -import { mockConfig } from '../test-utils'; -import { renderHook } from '../test-utils'; -import { useSubscription } from './useSubscription'; import { waitFor } from '@testing-library/react'; -import { useLuno } from './useLuno' -import {ConnectionStatus} from '../types' +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; +import { mockConfig, renderHook } from '../test-utils'; +import { ConnectionStatus } from '../types'; +import { useLuno } from './useLuno'; +import { useSubscription } from './useSubscription'; vi.mock('./useLuno'); const mockUseLuno = vi.mocked(useLuno); @@ -24,19 +23,19 @@ describe('useSubscription', () => { account: vi.fn().mockImplementation((address, callback) => { setTimeout(() => callback('1000000000000'), 0); return Promise.resolve(() => Promise.resolve()); - }) + }), }, balances: { locks: vi.fn().mockImplementation((address, callback) => { setTimeout(() => callback([]), 0); return Promise.resolve(() => Promise.resolve()); - }) - } + }), + }, }, queryMulti: vi.fn().mockImplementation((queries, callback) => { setTimeout(() => callback(['1000000000000', []]), 0); return Promise.resolve(() => Promise.resolve()); - }) + }), }; mockUseLuno.mockReturnValue({ @@ -63,13 +62,15 @@ describe('useSubscription', () => { describe('Basic Subscriptions', () => { it('should handle block number subscription', async () => { - const { result } = renderHook(() => + const { result } = renderHook( + () => useSubscription({ queryKey: '/block-number', factory: (api) => api.query.system.number, params: [], - }), { - config: mockConfig + }), + { + config: mockConfig, } ); @@ -79,7 +80,8 @@ describe('useSubscription', () => { }); it('should handle balance subscription with transform', async () => { - const { result } = renderHook(() => + const { result } = renderHook( + () => useSubscription({ queryKey: '/balance', factory: (api) => api.query.system.account, @@ -87,34 +89,43 @@ describe('useSubscription', () => { options: { transform: (data) => ({ free: data, - formatted: `${parseInt(data) / 10 ** 10} DOT` - }) - } - }), { - config: mockConfig + formatted: `${parseInt(data) / 10 ** 10} DOT`, + }), + }, + }), + { + config: mockConfig, } ); await waitFor(() => expect(result.current.data).toBeDefined()); expect(result.current.data).toEqual({ free: '1000000000000', - formatted: '100 DOT' + formatted: '100 DOT', }); }); }); describe('Multi Query', () => { it('should handle multi query subscription', async () => { - const { result } = renderHook(() => + const { result } = renderHook( + () => useSubscription({ queryKey: '/account-details', factory: (api) => api.queryMulti, - params: (api) => ([ - { fn: api.query.system.account, args: ['5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY'] }, - { fn: api.query.balances.locks, args: ['5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY'] } - ]), - }), { - config: mockConfig + params: (api) => [ + { + fn: api.query.system.account, + args: ['5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY'], + }, + { + fn: api.query.balances.locks, + args: ['5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY'], + }, + ], + }), + { + config: mockConfig, } ); @@ -125,15 +136,17 @@ describe('useSubscription', () => { describe('Error Handling', () => { it('should handle subscription errors', async () => { - const { result } = renderHook(() => + const { result } = renderHook( + () => useSubscription({ queryKey: '/error', factory: () => { throw new Error('Subscription failed'); }, params: [], - }), { - config: mockConfig + }), + { + config: mockConfig, } ); @@ -143,14 +156,16 @@ describe('useSubscription', () => { }); it('should not subscribe when disabled', async () => { - const { result } = renderHook(() => + const { result } = renderHook( + () => useSubscription({ queryKey: '/block-number', factory: (api) => api.query.system.number, params: [], - options: { enabled: false } - }), { - config: mockConfig + options: { enabled: false }, + }), + { + config: mockConfig, } ); diff --git a/packages/react/src/hooks/useSubscription.ts b/packages/react/src/hooks/useSubscription.ts index e9f7861..658ced5 100644 --- a/packages/react/src/hooks/useSubscription.ts +++ b/packages/react/src/hooks/useSubscription.ts @@ -1,13 +1,12 @@ +import { useQuery, useQueryClient } from '@tanstack/react-query'; +import type { LegacyClient } from 'dedot'; +import type { Callback, GenericStorageQuery, Unsub } from 'dedot/types'; import { useEffect, useMemo, useRef, useState } from 'react'; import { useLuno } from './useLuno'; -import type { Callback } from 'dedot/types' -import type { LegacyClient } from 'dedot'; -import type { Unsub } from 'dedot/types'; -import { useQuery, useQueryClient } from '@tanstack/react-query' -import { GenericStorageQuery } from 'dedot/types' -type SubscriptionFn = - (...params: [...TArgs, Callback]) => Promise<() => Promise>; +type SubscriptionFn = ( + ...params: [...TArgs, Callback] +) => Promise<() => Promise>; export interface UseSubscriptionOptions { enabled?: boolean; @@ -15,8 +14,9 @@ export interface UseSubscriptionOptions { defaultValue?: TTransformed; } -type ApiBoundSubscriptionFactory = - (api: LegacyClient) => SubscriptionFn; +type ApiBoundSubscriptionFactory = ( + api: LegacyClient +) => SubscriptionFn; export interface QueryMultiItem { fn: GenericStorageQuery; @@ -38,10 +38,13 @@ export interface UseSubscriptionResult { const defaultTransform = (data: T): T => data; -export const useSubscription = ( - { queryKey: userQueryKey, factory, params, options = {} }: UseSubscriptionProps -): UseSubscriptionResult => { - const [error, setError] = useState(undefined) +export const useSubscription = ({ + queryKey: userQueryKey, + factory, + params, + options = {}, +}: UseSubscriptionProps): UseSubscriptionResult => { + const [error, setError] = useState(undefined); const { currentApi, isApiReady } = useLuno(); const queryClient = useQueryClient(); const { @@ -56,11 +59,10 @@ export const useSubscription = [ - userQueryKey, - resolvedParams, - currentApi?.genesisHash - ], [userQueryKey, resolvedParams, currentApi?.genesisHash]); + const queryKey = useMemo( + () => [userQueryKey, resolvedParams, currentApi?.genesisHash], + [userQueryKey, resolvedParams, currentApi?.genesisHash] + ); useEffect(() => { if (unsubscribeRef.current) { @@ -86,7 +88,6 @@ export const useSubscription = { unsubscribeRef.current = unsub; @@ -119,6 +120,6 @@ export const useSubscription = { } }); -beforeEach(async () => { - -}); +beforeEach(async () => {}); test('useSwitchChain', async () => { - const { result } = renderHook(() => ({ - useChain: useChain(), - useSwitchChain: useSwitchChain(), - useConnect: useConnect(), - }), { config: mockConfig }); + const { result } = renderHook( + () => ({ + useChain: useChain(), + useSwitchChain: useSwitchChain(), + useConnect: useConnect(), + }), + { config: mockConfig } + ); await act(async () => { await result.current.useConnect.connectAsync({ - connectorId: connector.id + connectorId: connector.id, }); }); await waitFor(() => { - expect(result.current.useConnect.status).toBe(ConnectionStatus.Connected) + expect(result.current.useConnect.status).toBe(ConnectionStatus.Connected); }); expect(result.current.useChain.chain?.name).toBe('Polkadot'); @@ -49,7 +49,7 @@ test('useSwitchChain', async () => { await act(async () => { await result.current.useSwitchChain.switchChainAsync({ - chainId: kusama.genesisHash + chainId: kusama.genesisHash, }); }); @@ -63,7 +63,7 @@ test('useSwitchChain', async () => { await act(async () => { await result.current.useSwitchChain.switchChainAsync({ - chainId: polkadot.genesisHash + chainId: polkadot.genesisHash, }); }); diff --git a/packages/react/src/hooks/useSwitchChain.ts b/packages/react/src/hooks/useSwitchChain.ts index 5b40336..25c2d59 100644 --- a/packages/react/src/hooks/useSwitchChain.ts +++ b/packages/react/src/hooks/useSwitchChain.ts @@ -1,23 +1,15 @@ -import { useLuno } from './useLuno'; import type { Chain } from '../types'; -import { useLunoMutation, type LunoMutationOptions } from './useLunoMutation'; +import { useLuno } from './useLuno'; +import { type LunoMutationOptions, useLunoMutation } from './useLunoMutation'; export interface SwitchChainVariables { chainId: string; } -export type UseSwitchChainOptions = LunoMutationOptions< - void, - Error, - SwitchChainVariables, - unknown ->; +export type UseSwitchChainOptions = LunoMutationOptions; export interface UseSwitchChainResult { - switchChain: ( - variables: SwitchChainVariables, - options?: UseSwitchChainOptions - ) => void; + switchChain: (variables: SwitchChainVariables, options?: UseSwitchChainOptions) => void; switchChainAsync: ( variables: SwitchChainVariables, options?: UseSwitchChainOptions @@ -42,12 +34,10 @@ export const useSwitchChain = (hookLevelConfig?: UseSwitchChainOptions): UseSwit await storeSwitchChain(variables.chainId); }; - const mutationResult = useLunoMutation< - void, - Error, - SwitchChainVariables, - unknown - >(switchChainFn, hookLevelConfig); + const mutationResult = useLunoMutation( + switchChainFn, + hookLevelConfig + ); return { switchChain: mutationResult.mutate, diff --git a/packages/react/src/index.ts b/packages/react/src/index.ts index e405f6a..119eab6 100644 --- a/packages/react/src/index.ts +++ b/packages/react/src/index.ts @@ -1,7 +1,5 @@ +export * from '@luno-kit/core'; export { LunoProvider } from './context'; -export { ConnectionStatus } from './types' - export * from './hooks'; - -export * from '@luno-kit/core' +export { ConnectionStatus } from './types'; diff --git a/packages/react/src/store/createLunoStore.test.ts b/packages/react/src/store/createLunoStore.test.ts index 0556fbd..9efc3b7 100644 --- a/packages/react/src/store/createLunoStore.test.ts +++ b/packages/react/src/store/createLunoStore.test.ts @@ -1,9 +1,9 @@ -import { describe, it, expect, vi, beforeEach } from 'vitest'; -import { useLunoStore } from './createLunoStore'; -import { ConnectionStatus } from '../types'; +import { isSameAddress } from '@luno-kit/core/utils'; +import { beforeEach, describe, expect, it, vi } from 'vitest'; import { PERSIST_KEY } from '../constants'; +import { ConnectionStatus } from '../types'; import { createApi } from '../utils'; -import { isSameAddress } from '@luno-kit/core/utils'; +import { useLunoStore } from './createLunoStore'; vi.mock('../utils', () => ({ createApi: vi.fn(), @@ -51,7 +51,6 @@ describe('createLunoStore', () => { disconnect: vi.fn(), on: vi.fn(), off: vi.fn(), - updateAccountsForChain: vi.fn(), }; mockApi = { @@ -177,8 +176,9 @@ describe('createLunoStore', () => { const initialState = useLunoStore.getState(); expect(initialState.account).toBe(initialAccount); - await expect(store.setAccount('0xnotfound')) - .rejects.toThrow('[LunoStore] setAccount: The provided account or address is not in the current accounts list'); + await expect(store.setAccount('0xnotfound')).rejects.toThrow( + '[LunoStore] setAccount: The provided account or address is not in the current accounts list' + ); const finalState = useLunoStore.getState(); expect(finalState.account).toBe(initialAccount); @@ -227,7 +227,7 @@ describe('createLunoStore', () => { await store.setAccount('0xabc'); - await new Promise(resolve => setTimeout(resolve, 0)); + await new Promise((resolve) => setTimeout(resolve, 0)); const state = useLunoStore.getState(); expect(state.account?.publicKey).toBe('0xabc'); @@ -289,19 +289,24 @@ describe('createLunoStore', () => { expect(mockConnector.on).toHaveBeenCalledWith('accountsChanged', expect.any(Function)); expect(mockConnector.on).toHaveBeenCalledWith('disconnect', expect.any(Function)); - expect(mockStorage.setItem).toHaveBeenCalledWith(PERSIST_KEY.LAST_CONNECTOR_ID, 'test-connector'); + expect(mockStorage.setItem).toHaveBeenCalledWith( + PERSIST_KEY.LAST_CONNECTOR_ID, + 'test-connector' + ); }); it('should restore previously selected account', async () => { mockConnector.connect.mockResolvedValue(mockAccounts); mockStorage.getItem.mockImplementation((key) => { if (key === PERSIST_KEY.LAST_SELECTED_ACCOUNT_INFO) { - return Promise.resolve(JSON.stringify({ - publicKey: '0xdef', - address: 'addr2', - name: 'Account 2', - source: 'test', - })); + return Promise.resolve( + JSON.stringify({ + publicKey: '0xdef', + address: 'addr2', + name: 'Account 2', + source: 'test', + }) + ); } return Promise.resolve(null); }); @@ -316,11 +321,13 @@ describe('createLunoStore', () => { mockConnector.connect.mockResolvedValue(mockAccounts); mockStorage.getItem.mockImplementation((key) => { if (key === PERSIST_KEY.LAST_SELECTED_ACCOUNT_INFO) { - return Promise.resolve(JSON.stringify({ - address: 'addr2', - name: 'Account 2', - source: 'test', - })); + return Promise.resolve( + JSON.stringify({ + address: 'addr2', + name: 'Account 2', + source: 'test', + }) + ); } return Promise.resolve(null); }); @@ -367,23 +374,6 @@ describe('createLunoStore', () => { expect(state.activeConnector).toBeUndefined(); expect(state.accounts).toEqual([]); }); - - it('should handle accounts without publicKey', async () => { - const accountsWithoutPublicKey = [ - { address: 'addr1', name: 'Account 1', meta: { source: 'test' } }, - ]; - mockConnector.connect.mockResolvedValue(accountsWithoutPublicKey); - - const consoleSpy = vi.spyOn(console, 'error').mockImplementation(() => {}); - - await store.connect('test-connector'); - - expect(consoleSpy).toHaveBeenCalledWith( - expect.stringContaining('CRITICAL WARNING') - ); - - consoleSpy.mockRestore(); - }); }); describe('disconnect', () => { @@ -392,8 +382,15 @@ describe('createLunoStore', () => { config: mockConfig, status: ConnectionStatus.Connected, activeConnector: mockConnector, - accounts: [{ publicKey: '0xabc', address: 'addr1', name: 'Account 1', meta: { source: 'test' } }], - account: { publicKey: '0xabc', address: 'addr1', name: 'Account 1', meta: { source: 'test' } }, + accounts: [ + { publicKey: '0xabc', address: 'addr1', name: 'Account 1', meta: { source: 'test' } }, + ], + account: { + publicKey: '0xabc', + address: 'addr1', + name: 'Account 1', + meta: { source: 'test' }, + }, }); }); @@ -457,10 +454,6 @@ describe('createLunoStore', () => { }, }; - mockConnector.updateAccountsForChain = vi.fn().mockResolvedValue([ - { publicKey: '0xabc', address: 'addr1', name: 'Account 1', meta: { source: 'test' } } - ]); - useLunoStore.setState({ config: configWithNewChain, currentChainId: '0x123', @@ -469,9 +462,14 @@ describe('createLunoStore', () => { isApiReady: true, activeConnector: mockConnector, accounts: [ - { publicKey: '0xabc', address: 'addr1', name: 'Account 1', meta: { source: 'test' } } + { publicKey: '0xabc', address: 'addr1', name: 'Account 1', meta: { source: 'test' } }, ], - account: { publicKey: '0xabc', address: 'addr1', name: 'Account 1', meta: { source: 'test' } } + account: { + publicKey: '0xabc', + address: 'addr1', + name: 'Account 1', + meta: { source: 'test' }, + }, }); }); @@ -491,9 +489,7 @@ describe('createLunoStore', () => { await store.switchChain('0x123'); - expect(consoleSpy).toHaveBeenCalledWith( - expect.stringContaining('Already on chain 0x123') - ); + expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining('Already on chain 0x123')); consoleSpy.mockRestore(); }); @@ -532,7 +528,7 @@ describe('createLunoStore', () => { it('should handle API disconnect failure during chain switch', async () => { const mockApi = { status: 'connected', - disconnect: vi.fn().mockRejectedValue(new Error('Disconnect failed')) + disconnect: vi.fn().mockRejectedValue(new Error('Disconnect failed')), }; useLunoStore.setState({ currentApi: mockApi }); diff --git a/packages/react/src/store/createLunoStore.ts b/packages/react/src/store/createLunoStore.ts index b6747e0..5af3552 100644 --- a/packages/react/src/store/createLunoStore.ts +++ b/packages/react/src/store/createLunoStore.ts @@ -1,9 +1,9 @@ +import { isSameAddress } from '@luno-kit/core/utils'; import { create } from 'zustand'; -import type { LunoState, Account } from '../types'; -import { ConnectionStatus } from '../types'; import { PERSIST_KEY } from '../constants'; -import { createApi } from '../utils' -import { isSameAddress } from '@luno-kit/core/utils' +import type { Account, LunoState } from '../types'; +import { ConnectionStatus } from '../types'; +import { createApi } from '../utils'; interface StoredAccountInfo { publicKey?: string; @@ -15,7 +15,7 @@ interface StoredAccountInfo { let activeConnectorUnsubscribeFunctions: (() => void)[] = []; const cleanupActiveConnectorListeners = () => { - activeConnectorUnsubscribeFunctions.forEach(unsub => { + activeConnectorUnsubscribeFunctions.forEach((unsub) => { try { unsub(); } catch (e) { @@ -40,7 +40,6 @@ export const useLunoStore = create((set, get) => ({ _setConfig: async (newConfig) => { cleanupActiveConnectorListeners(); - let storedChainId: string | null = null; try { storedChainId = await newConfig.storage.getItem(PERSIST_KEY.LAST_CHAIN_ID); @@ -51,12 +50,13 @@ export const useLunoStore = create((set, get) => ({ const normalizedStoredChainId = storedChainId?.toLowerCase(); const initialChainId = - normalizedStoredChainId && newConfig.chains.some(c => c.genesisHash.toLowerCase() === normalizedStoredChainId) + normalizedStoredChainId && + newConfig.chains.some((c) => c.genesisHash.toLowerCase() === normalizedStoredChainId) ? normalizedStoredChainId : newConfig.chains[0]?.genesisHash; const initialChain = initialChainId - ? newConfig.chains.find(c => c.genesisHash.toLowerCase() === initialChainId) + ? newConfig.chains.find((c) => c.genesisHash.toLowerCase() === initialChainId) : undefined; set({ @@ -70,27 +70,29 @@ export const useLunoStore = create((set, get) => ({ }, _setApi: (apiInstance) => { - set({currentApi: apiInstance}); + set({ currentApi: apiInstance }); }, _setIsApiReady: (isReady) => { - set({isApiReady: isReady}); + set({ isApiReady: isReady }); }, setAccount: async (accountOrPublicKey) => { - if (!accountOrPublicKey) return + if (!accountOrPublicKey) return; const { accounts, config } = get(); const targetPublicKey = typeof accountOrPublicKey === 'string' ? accountOrPublicKey.toLowerCase() - : accountOrPublicKey.publicKey?.toLowerCase() + : accountOrPublicKey.publicKey?.toLowerCase(); - const nextAccount = accounts.find(acc => acc.publicKey?.toLowerCase() === targetPublicKey); + const nextAccount = accounts.find((acc) => acc.publicKey?.toLowerCase() === targetPublicKey); if (!nextAccount) { - throw new Error('[LunoStore] setAccount: The provided account or address is not in the current accounts list. Ignored.'); + throw new Error( + '[LunoStore] setAccount: The provided account or address is not in the current accounts list. Ignored.' + ); } set({ account: nextAccount }); @@ -101,9 +103,12 @@ export const useLunoStore = create((set, get) => ({ publicKey: nextAccount.publicKey, address: nextAccount.address, name: nextAccount.name, - source: nextAccount.meta.source, + source: nextAccount.meta?.source, }; - await config.storage.setItem(PERSIST_KEY.LAST_SELECTED_ACCOUNT_INFO, JSON.stringify(accountInfo)); + await config.storage.setItem( + PERSIST_KEY.LAST_SELECTED_ACCOUNT_INFO, + JSON.stringify(accountInfo) + ); console.log(`[LunoStore] Persisted selected account: ${nextAccount.address}`); } catch (e) { console.error('[LunoStore] Failed to persist selected account:', e); @@ -114,54 +119,63 @@ export const useLunoStore = create((set, get) => ({ connect: async (connectorId, targetChainId) => { const config = get().config; if (!config) { - set({status: ConnectionStatus.Disconnected}); + set({ status: ConnectionStatus.Disconnected }); - throw new Error('[LunoStore] LunoConfig has not been initialized. Cannot connect.') + throw new Error('[LunoStore] LunoConfig has not been initialized. Cannot connect.'); } - const connector = config.connectors.find(c => c.id === connectorId); + const connector = config.connectors.find((c) => c.id === connectorId); if (!connector) { - set({status: ConnectionStatus.Disconnected}); + set({ status: ConnectionStatus.Disconnected }); - throw new Error(`[LunoStore] Connector with ID "${connectorId}" not found in LunoConfig.`) + throw new Error(`[LunoStore] Connector with ID "${connectorId}" not found in LunoConfig.`); } - set({status: ConnectionStatus.Connecting }); + set({ status: ConnectionStatus.Connecting }); const previouslyActiveConnector = get().activeConnector; if (previouslyActiveConnector && previouslyActiveConnector.id !== connector.id) { - console.log(`[LunoStore] Switching connector. Cleaning up listeners for old connector: ${previouslyActiveConnector.id}`); + console.log( + `[LunoStore] Switching connector. Cleaning up listeners for old connector: ${previouslyActiveConnector.id}` + ); cleanupActiveConnectorListeners(); } else if (previouslyActiveConnector && previouslyActiveConnector.id === connector.id) { - console.log(`[LunoStore] Attempting to reconnect with the same connector: ${connector.id}. Cleaning up existing listeners.`); + console.log( + `[LunoStore] Attempting to reconnect with the same connector: ${connector.id}. Cleaning up existing listeners.` + ); cleanupActiveConnectorListeners(); } - try { const handleAccountsChanged = async (newAccounts: Account[]) => { console.log(`[LunoStore] accountsChanged event from ${connector.name}:`, newAccounts); if (newAccounts.length === 0) { - await get().disconnect() - return + await get().disconnect(); + return; } - newAccounts.forEach(acc => { + newAccounts.forEach((acc) => { if (!acc.publicKey) { - console.warn(`[LunoStore] Account ${acc.address} (from ${connector.name}) is missing publicKey.`); + console.warn( + `[LunoStore] Account ${acc.address} (from ${connector.name}) is missing publicKey.` + ); } }); let selectedAccount = newAccounts[0]; try { - const storedAccountJson = await config.storage.getItem(PERSIST_KEY.LAST_SELECTED_ACCOUNT_INFO); + const storedAccountJson = await config.storage.getItem( + PERSIST_KEY.LAST_SELECTED_ACCOUNT_INFO + ); if (storedAccountJson) { const storedAccount: StoredAccountInfo = JSON.parse(storedAccountJson); - const restoredAccount = newAccounts.find(acc => - (storedAccount.publicKey && acc.publicKey?.toLowerCase() === storedAccount.publicKey.toLowerCase()) || - isSameAddress(acc.address, storedAccount.address) + const restoredAccount = newAccounts.find( + (acc) => + (storedAccount.publicKey && + acc.publicKey?.toLowerCase() === storedAccount.publicKey.toLowerCase()) || + isSameAddress(acc.address, storedAccount.address) ); if (restoredAccount) { @@ -172,7 +186,7 @@ export const useLunoStore = create((set, get) => ({ console.warn('[LunoStore] Failed to restore account during accountsChanged:', e); } - set({accounts: newAccounts, account: selectedAccount }); + set({ accounts: newAccounts, account: selectedAccount }); }; const handleDisconnect = () => { @@ -182,7 +196,9 @@ export const useLunoStore = create((set, get) => ({ try { config.storage.removeItem(PERSIST_KEY.LAST_CONNECTOR_ID); config.storage.removeItem(PERSIST_KEY.LAST_CHAIN_ID); - console.log('[LunoStore] Removed persisted connection info from storage due to disconnect event.'); + console.log( + '[LunoStore] Removed persisted connection info from storage due to disconnect event.' + ); } catch (e) { console.error('[LunoStore] Failed to remove connection info from storage:', e); } @@ -193,43 +209,57 @@ export const useLunoStore = create((set, get) => ({ accounts: [], }); } else { - console.warn(`[LunoStore] Received disconnect event from an inactive connector ${connector.name}. Ignored.`); + console.warn( + `[LunoStore] Received disconnect event from an inactive connector ${connector.name}. Ignored.` + ); } }; connector.on('accountsChanged', handleAccountsChanged); - activeConnectorUnsubscribeFunctions.push(() => connector.off('accountsChanged', handleAccountsChanged)); + activeConnectorUnsubscribeFunctions.push(() => + connector.off('accountsChanged', handleAccountsChanged) + ); connector.on('disconnect', handleDisconnect); activeConnectorUnsubscribeFunctions.push(() => connector.off('disconnect', handleDisconnect)); const chainIdToUse = targetChainId || get().currentChainId || config.chains[0]?.genesisHash; - const accountsFromWallet = await connector.connect(config.appName, config.chains, chainIdToUse); + const accountsFromWallet = await connector.connect( + config.appName, + config.chains, + chainIdToUse + ); - accountsFromWallet.forEach(acc => { - if (!acc.publicKey) { - console.error(`[LunoStore] CRITICAL WARNING: Account ${acc.address} from connector ${connector.name} was returned without a publicKey! SS58 address formatting will fail.`); - } - }); + if (!accountsFromWallet || accountsFromWallet?.length === 0) { + throw new Error(`[LunoStore] No accounts found from wallet`); + } let selectedAccount = accountsFromWallet[0]; try { - const storedAccountJson = await config.storage.getItem(PERSIST_KEY.LAST_SELECTED_ACCOUNT_INFO); + const storedAccountJson = await config.storage.getItem( + PERSIST_KEY.LAST_SELECTED_ACCOUNT_INFO + ); if (storedAccountJson) { const storedAccount: StoredAccountInfo = JSON.parse(storedAccountJson); - const restoredAccount = accountsFromWallet.find(acc => - (storedAccount.publicKey && acc.publicKey?.toLowerCase() === storedAccount.publicKey.toLowerCase()) || - isSameAddress(acc.address, storedAccount.address) + const restoredAccount = accountsFromWallet.find( + (acc) => + (storedAccount.publicKey && + acc.publicKey?.toLowerCase() === storedAccount.publicKey.toLowerCase()) || + isSameAddress(acc.address, storedAccount.address) ); if (restoredAccount) { selectedAccount = restoredAccount; - console.log(`[LunoStore] Restored previously selected account: ${selectedAccount.address}`); + console.log( + `[LunoStore] Restored previously selected account: ${selectedAccount.address}` + ); } else { - console.log('[LunoStore] Previously selected account not found in current accounts list, using first account'); + console.log( + '[LunoStore] Previously selected account not found in current accounts list, using first account' + ); } } } catch (e) { @@ -240,7 +270,7 @@ export const useLunoStore = create((set, get) => ({ activeConnector: connector, accounts: accountsFromWallet, status: ConnectionStatus.Connected, - account: selectedAccount + account: selectedAccount, }); try { @@ -254,13 +284,13 @@ export const useLunoStore = create((set, get) => ({ const chainIdToSet = targetChainId || currentStoreChainId || config.chains[0]?.genesisHash; if (chainIdToSet) { - const newChain = config.chains.find(c => c.genesisHash === chainIdToSet); + const newChain = config.chains.find((c) => c.genesisHash === chainIdToSet); if (newChain) { if (chainIdToSet !== currentStoreChainId || !get().currentApi) { set({ currentChainId: chainIdToSet, currentChain: newChain, - currentApi: undefined + currentApi: undefined, }); } try { @@ -270,29 +300,41 @@ export const useLunoStore = create((set, get) => ({ console.error('[LunoStore] Failed to persist chainId to storage:', e); } } else { - console.warn(`[LunoStore] After connection, target chain ID "${chainIdToSet}" was not found in config. Current chain state might not have changed. Not persisting chainId.`); + console.warn( + `[LunoStore] After connection, target chain ID "${chainIdToSet}" was not found in config. Current chain state might not have changed. Not persisting chainId.` + ); } - } else { - console.warn(`[LunoStore] Could not determine target chain ID after connection. Please check config.`); } - + // else { + // console.warn( + // `[LunoStore] Could not determine target chain ID after connection. Please check config.` + // ); + // } } catch (err: any) { cleanupActiveConnectorListeners(); set({ status: ConnectionStatus.Disconnected, activeConnector: undefined, - accounts: [] + accounts: [], }); - throw new Error(`[LunoStore] Error connecting with ${connector.name}: ${err?.message || err}`) + throw new Error( + `[LunoStore] Error connecting with ${connector.name}: ${err?.message || err}` + ); } }, disconnect: async () => { const { activeConnector, status, config } = get(); - if (!activeConnector || status === ConnectionStatus.Disconnecting || status === ConnectionStatus.Disconnected) { - console.log('[LunoStore] No active connector or already disconnected/disconnecting. Disconnect action aborted.'); + if ( + !activeConnector || + status === ConnectionStatus.Disconnecting || + status === ConnectionStatus.Disconnected + ) { + console.log( + '[LunoStore] No active connector or already disconnected/disconnecting. Disconnect action aborted.' + ); return; } @@ -302,30 +344,44 @@ export const useLunoStore = create((set, get) => ({ if (config) { try { - console.log('[LunoStore] Attempting to remove persisted connection info due to user disconnect action...'); + console.log( + '[LunoStore] Attempting to remove persisted connection info due to user disconnect action...' + ); await config.storage.removeItem(PERSIST_KEY.LAST_CONNECTOR_ID); await config.storage.removeItem(PERSIST_KEY.LAST_CHAIN_ID); await config.storage.removeItem(PERSIST_KEY.LAST_SELECTED_ACCOUNT_INFO); console.log('[LunoStore] Removed persisted connection info from storage.'); } catch (e) { - console.error('[LunoStore] Failed to remove connection info from storage during disconnect action:', e); + console.error( + '[LunoStore] Failed to remove connection info from storage during disconnect action:', + e + ); } } - cleanupActiveConnectorListeners() + cleanupActiveConnectorListeners(); - set({ status: ConnectionStatus.Disconnected, activeConnector: undefined, accounts: [], account: undefined }) + set({ + status: ConnectionStatus.Disconnected, + activeConnector: undefined, + accounts: [], + account: undefined, + }); if (get().status !== ConnectionStatus.Disconnected) { - console.warn("[LunoStore] disconnect method called, but status is not yet 'disconnected' (event handler might be delayed or did not fire). Check connector events."); + console.warn( + "[LunoStore] disconnect method called, but status is not yet 'disconnected' (event handler might be delayed or did not fire). Check connector events." + ); } } catch (err: any) { - set({status: ConnectionStatus.Connected }); - throw new Error(`[LunoStore] Error disconnecting from ${activeConnector.name}: ${err?.message || err}`) + set({ status: ConnectionStatus.Connected }); + throw new Error( + `[LunoStore] Error disconnecting from ${activeConnector.name}: ${err?.message || err}` + ); } }, switchChain: async (newChainId: string) => { - const {config, currentChainId, currentApi, activeConnector, account, accounts} = get(); + const { config, currentChainId, currentApi, activeConnector, account, accounts } = get(); if (!config) { throw new Error('[LunoStore] LunoConfig has not been initialized. Cannot switch chain.'); @@ -335,16 +391,11 @@ export const useLunoStore = create((set, get) => ({ return; } - const newChain = config.chains.find(c => c.genesisHash === newChainId); + const newChain = config.chains.find((c) => c.genesisHash === newChainId); if (!newChain) { throw new Error(`[LunoStore] Chain with ID "${newChainId}" not found in LunoConfig.`); } - const prevAccountIndex = accounts.findIndex(acc => acc.address === account.address) - - const newAccounts = await activeConnector.updateAccountsForChain(newChainId); - set({ accounts: newAccounts, account: newAccounts[prevAccountIndex] }); - try { try { if (currentApi && currentApi.status === 'connected') { @@ -371,14 +422,14 @@ export const useLunoStore = create((set, get) => ({ }); await config.storage.setItem(PERSIST_KEY.LAST_CHAIN_ID, newChainId); - } catch (e) { + } catch (e: any) { set({ apiError: e, isApiReady: false, - }) + }); } }, _setApiError: (err) => { - set({ apiError: err }) - } + set({ apiError: err }); + }, })); diff --git a/packages/react/src/store/index.ts b/packages/react/src/store/index.ts index d58952b..24b1015 100644 --- a/packages/react/src/store/index.ts +++ b/packages/react/src/store/index.ts @@ -1 +1 @@ -export * from './createLunoStore' +export * from './createLunoStore'; diff --git a/packages/react/src/test-setup.ts b/packages/react/src/test-setup.ts index 9d086c5..1237422 100644 --- a/packages/react/src/test-setup.ts +++ b/packages/react/src/test-setup.ts @@ -1 +1 @@ -import "@testing-library/react" +import '@testing-library/react'; diff --git a/packages/react/src/test-utils/connectUtils.ts b/packages/react/src/test-utils/connectUtils.ts index 0f9a414..bc0faa2 100644 --- a/packages/react/src/test-utils/connectUtils.ts +++ b/packages/react/src/test-utils/connectUtils.ts @@ -1,13 +1,13 @@ import { act } from '@testing-library/react'; -import { MockConnector, mockConfig } from './mocks'; -import { ConnectionStatus } from '../types'; +import { expect, vi } from 'vitest'; import { useConnect } from '../hooks'; +import { ConnectionStatus } from '../types'; +import { MockConnector, mockConfig } from './mocks'; import { renderHook } from './render'; -import { expect, vi } from 'vitest'; export const setupConnection = () => { const { result } = renderHook(() => useConnect(), { - config: mockConfig + config: mockConfig, }); return result; }; @@ -16,7 +16,7 @@ export const connectWallet = async (result: any, connectorId: string, targetChai await act(async () => { await result.current.connectAsync({ connectorId, - ...(targetChainId && { targetChainId }) + ...(targetChainId && { targetChainId }), }); }); }; @@ -26,7 +26,7 @@ export const setupErrorConnection = (onError: ReturnType) => { errorConnector.connect = vi.fn().mockRejectedValue(new Error('Connection failed')); const { result, rerender } = renderHook(() => useConnect({ onError }), { - config: { ...mockConfig, connectors: [errorConnector] } + config: { ...mockConfig, connectors: [errorConnector] }, }); return { @@ -49,7 +49,6 @@ export const expectErrorState = (result: any, onError: ReturnType) expect(result.current.status).toBe(ConnectionStatus.Disconnected); }; - export const testHookLevelCallback = async ( hookFn: any, mockConnector: MockConnector, @@ -58,12 +57,12 @@ export const testHookLevelCallback = async ( const onSuccess = vi.fn(); const onSettled = vi.fn(); const { result } = renderHook(() => hookFn({ onSuccess, onSettled, ...options }), { - config: mockConfig + config: mockConfig, }); await act(async () => { await result.current.connectAsync({ - connectorId: mockConnector.id + connectorId: mockConnector.id, }); }); @@ -72,15 +71,9 @@ export const testHookLevelCallback = async ( return result; }; -export const testCallTimeOptions = async ( - hookFn: any, - mockConnector: MockConnector -) => { +export const testCallTimeOptions = async (hookFn: any, mockConnector: MockConnector) => { const callTimeOnSuccess = vi.fn(); - const { result } = renderHook( - () => hookFn(), - { config: mockConfig } - ); + const { result } = renderHook(() => hookFn(), { config: mockConfig }); await act(async () => { await result.current.connectAsync( @@ -93,17 +86,14 @@ export const testCallTimeOptions = async ( return result; }; -export const testResetState = async ( - hookFn: any, - mockConnector: MockConnector -) => { +export const testResetState = async (hookFn: any, mockConnector: MockConnector) => { const { result, rerender } = renderHook(() => hookFn(), { - config: mockConfig + config: mockConfig, }); await act(async () => { await result.current.connectAsync({ - connectorId: mockConnector.id + connectorId: mockConnector.id, }); }); diff --git a/packages/react/src/test-utils/index.ts b/packages/react/src/test-utils/index.ts index 2810b3c..8a5f0e0 100644 --- a/packages/react/src/test-utils/index.ts +++ b/packages/react/src/test-utils/index.ts @@ -1,3 +1,3 @@ -export * from './mocks' -export * from './render' -export * from './connectUtils' +export * from './connectUtils'; +export * from './mocks'; +export * from './render'; diff --git a/packages/react/src/test-utils/mocks.ts b/packages/react/src/test-utils/mocks.ts index 3a717e0..cc24259 100644 --- a/packages/react/src/test-utils/mocks.ts +++ b/packages/react/src/test-utils/mocks.ts @@ -1,7 +1,7 @@ -import { createConfig } from '@luno-kit/core' -import { kusama, polkadot } from '@luno-kit/core/chains' +import { createConfig } from '@luno-kit/core'; +import { kusama, polkadot } from '@luno-kit/core/chains'; import { BaseConnector } from '@luno-kit/core/connectors'; -import type { Account, Signer, Chain } from '@luno-kit/core/types'; +import type { Account, Chain, Signer } from '@luno-kit/core/types'; import { vi } from 'vitest'; const DEFAULT_MOCK_ACCOUNTS: Account[] = [ @@ -9,14 +9,14 @@ const DEFAULT_MOCK_ACCOUNTS: Account[] = [ address: '5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY', publicKey: '0xd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d', name: 'Alice (Mock)', - meta: { source: 'mock-connector' } + meta: { source: 'mock-connector' }, }, { address: '5FHneW46xGXgs5mUiveU4sbTyGBzmstUspZC92UhjJM694ty', publicKey: '0x8eaf04151687736326c9fea17e25fc5287613693c912909cb226aa4794f26a48', name: 'Bob (Mock)', - meta: { source: 'mock-connector' } - } + meta: { source: 'mock-connector' }, + }, ]; export class MockConnector extends BaseConnector { @@ -67,6 +67,10 @@ export class MockConnector extends BaseConnector { signature: `0x-mock-sig-for-${address}-${data}`, id: 1, }), + signPayload: async (payload: any) => ({ + signature: `0x-mock-sig-for-payload-${payload.address}`, + id: 1, + }), }; } @@ -82,10 +86,9 @@ export class MockConnector extends BaseConnector { export const mockConfig = createConfig({ chains: [polkadot, kusama], - connectors: [new MockConnector()] + connectors: [new MockConnector()], }); - export function createMockApi(options: { chain: Chain }) { return { status: 'connected' as const, @@ -100,14 +103,18 @@ export function createMockApi(options: { chain: Chain }) { query: { system: { account: vi.fn().mockImplementation((address, callback) => { - setTimeout(() => callback({ - data: { - free: '1000000000000', - reserved: '0', - miscFrozen: '0', - feeFrozen: '0', - } - }), 0); + setTimeout( + () => + callback({ + data: { + free: '1000000000000', + reserved: '0', + miscFrozen: '0', + feeFrozen: '0', + }, + }), + 0 + ); return Promise.resolve(() => Promise.resolve()); }), events: vi.fn().mockImplementation((callback) => { @@ -130,25 +137,29 @@ export function createMockApi(options: { chain: Chain }) { consts: { system: { ss58Prefix: options.chain?.ss58Format ?? 42, - } + }, }, queryMulti: vi.fn().mockImplementation((queries, callback) => { - setTimeout(() => callback([ - { - data: { - free: '1000000000000', - reserved: '0', - frozen: '0' - } - }, - [ - { - id: 'vesting', - amount: '1000000000', - reasons: 'misc' - } - ] - ]), 0); + setTimeout( + () => + callback([ + { + data: { + free: '1000000000000', + reserved: '0', + frozen: '0', + }, + }, + [ + { + id: 'vesting', + amount: '1000000000', + reasons: 'misc', + }, + ], + ]), + 0 + ); return Promise.resolve(() => Promise.resolve()); }), getRuntimeVersion: vi.fn().mockResolvedValue({ diff --git a/packages/react/src/test-utils/render.tsx b/packages/react/src/test-utils/render.tsx index 2138963..23f8a4d 100644 --- a/packages/react/src/test-utils/render.tsx +++ b/packages/react/src/test-utils/render.tsx @@ -1,21 +1,22 @@ import type { Config } from '@luno-kit/core/types'; -import { renderHook as baseRenderHook, RenderHookOptions } from '@testing-library/react'; +import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; +import { renderHook as baseRenderHook, type RenderHookOptions } from '@testing-library/react'; import type { ReactNode } from 'react'; -import { QueryClientProvider, QueryClient } from '@tanstack/react-query' -import { LunoProvider } from '../context' +import { LunoProvider } from '../context'; -export interface CustomRenderHookOptions extends Omit, 'wrapper'> { +export interface CustomRenderHookOptions + extends Omit, 'wrapper'> { config: Config; } -export const queryClient = new QueryClient() +export const queryClient = new QueryClient(); export function renderHook( useHook: (props: TProps) => TResult, - options: CustomRenderHookOptions, + options: CustomRenderHookOptions ) { const { config, ...restOptions } = options; - queryClient.clear() + queryClient.clear(); const Wrapper = ({ children }: { children: ReactNode }) => ( diff --git a/packages/react/src/types/index.ts b/packages/react/src/types/index.ts index 0a6028f..e03e54b 100644 --- a/packages/react/src/types/index.ts +++ b/packages/react/src/types/index.ts @@ -1,4 +1,4 @@ -export * from '@luno-kit/core/types' +export * from '@luno-kit/core/types'; -export { ConnectionStatus, LunoState } from './state' -export { TxStatus } from './transaction' +export { ConnectionStatus, LunoState } from './state'; +export { TxStatus } from './transaction'; diff --git a/packages/react/src/types/state.ts b/packages/react/src/types/state.ts index 9b75d57..bfcaa8e 100644 --- a/packages/react/src/types/state.ts +++ b/packages/react/src/types/state.ts @@ -1,6 +1,6 @@ -import type { Config, Connector, Account, Chain } from '.'; +import type { HexString } from '@luno-kit/core/types'; import type { LegacyClient } from 'dedot'; -import type { HexString } from 'dedot/utils' +import type { Account, Chain, Config, Connector } from '.'; export enum ConnectionStatus { Disconnected = 'disconnected', @@ -12,7 +12,6 @@ export enum ConnectionStatus { export interface LunoState { config?: Config; - status: ConnectionStatus; activeConnector?: Connector; @@ -25,7 +24,7 @@ export interface LunoState { currentChain?: Chain; currentApi?: LegacyClient; isApiReady: boolean; - apiError: Error | null + apiError: Error | null; _setConfig: (config: Config) => Promise; @@ -37,6 +36,5 @@ export interface LunoState { _setApi: (api?: LegacyClient) => void; _setIsApiReady: (isApiReady: boolean) => void; - _setApiError: (error: Error | null) => void - + _setApiError: (error: Error | null) => void; } diff --git a/packages/react/src/utils/createApi.test.ts b/packages/react/src/utils/createApi.test.ts index 5f88243..2a57a3a 100644 --- a/packages/react/src/utils/createApi.test.ts +++ b/packages/react/src/utils/createApi.test.ts @@ -1,8 +1,8 @@ -import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest'; -import { createApi } from './createApi'; -import { Config, wsProvider } from '@luno-kit/core'; +import { type Config, wsProvider } from '@luno-kit/core'; import { LegacyClient } from 'dedot'; +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; import { mockClient } from '../test-utils'; +import { createApi } from './createApi'; vi.mock('@luno-kit/core', async (importOriginal) => { const actual = await importOriginal(); @@ -95,9 +95,9 @@ describe('createApi', () => { const config = createMockConfig(); const invalidChainId = '0xinvalid'; - await expect( - createApi({ config, chainId: invalidChainId }) - ).rejects.toThrow(`Configuration missing for chainId: ${invalidChainId}`); + await expect(createApi({ config, chainId: invalidChainId })).rejects.toThrow( + `Configuration missing for chainId: ${invalidChainId}` + ); expect(mockWsProvider).not.toHaveBeenCalled(); expect(MockClient).not.toHaveBeenCalled(); @@ -107,9 +107,9 @@ describe('createApi', () => { const config = createMockConfig(); mockPolkadotClient.connect.mockRejectedValueOnce(new Error('Network timeout')); - await expect( - createApi({ config, chainId: validChainId }) - ).rejects.toThrow('Failed to connect to Polkadot: Network timeout'); + await expect(createApi({ config, chainId: validChainId })).rejects.toThrow( + 'Failed to connect to Polkadot: Network timeout' + ); }); }); }); diff --git a/packages/react/src/utils/createApi.ts b/packages/react/src/utils/createApi.ts index 21289a9..8f2700b 100644 --- a/packages/react/src/utils/createApi.ts +++ b/packages/react/src/utils/createApi.ts @@ -1,17 +1,14 @@ -import { wsProvider } from '@luno-kit/core' -import type { Config } from '../types' -import { ApiOptions, LegacyClient } from 'dedot' +import { wsProvider } from '@luno-kit/core'; +import { type ApiOptions, LegacyClient } from 'dedot'; +import type { Config } from '../types'; interface CreateApiOptions { config: Config; chainId: string; } -export const createApi = async ({ - config, - chainId, -}: CreateApiOptions): Promise => { - const chainConfig = config.chains.find(c => c.genesisHash === chainId); +export const createApi = async ({ config, chainId }: CreateApiOptions): Promise => { + const chainConfig = config.chains.find((c) => c.genesisHash === chainId); const transportConfig = config.transports[chainId]; if (!chainConfig || !transportConfig) { @@ -43,7 +40,7 @@ export const createApi = async ({ await newApi.disconnect(); throw new Error( `Chain genesis hash mismatch. Expected: ${chainId}, Got: ${actualGenesisHash}. ` + - 'This might indicate connecting to the wrong network or incorrect chain configuration.' + 'This might indicate connecting to the wrong network or incorrect chain configuration.' ); } diff --git a/packages/react/src/utils/dispatchError.test.ts b/packages/react/src/utils/dispatchError.test.ts index 42922f0..3c91838 100644 --- a/packages/react/src/utils/dispatchError.test.ts +++ b/packages/react/src/utils/dispatchError.test.ts @@ -1,52 +1,59 @@ -import { describe, it, expect, vi } from 'vitest' -import { getReadableDispatchError } from './dispatchError' -import { LegacyClient } from 'dedot' -import { DispatchError } from 'dedot/codecs' +import type { LegacyClient } from 'dedot'; +import type { DispatchError } from 'dedot/codecs'; +import { describe, expect, it, vi } from 'vitest'; +import { getReadableDispatchError } from './dispatchError'; const mockApi = { registry: { - findErrorMeta: vi.fn() - } -} as unknown as LegacyClient + findErrorMeta: vi.fn(), + }, +} as unknown as LegacyClient; const createMockDispatchError = { - module: (index: number, error: string): DispatchError => ({ - type: 'Module', - value: { index, error } - } as DispatchError), - - token: (value: string): DispatchError => ({ - type: 'Token', - value - } as DispatchError), - - arithmetic: (value: string): DispatchError => ({ - type: 'Arithmetic', - value - } as DispatchError), - - transactional: (value: string): DispatchError => ({ - type: 'Transactional', - value - } as DispatchError), - - badOrigin: (): DispatchError => ({ - type: 'BadOrigin' - } as DispatchError), - - cannotLookup: (): DispatchError => ({ - type: 'CannotLookup' - } as DispatchError), - - other: (): DispatchError => ({ - type: 'Other' - } as DispatchError) -} + module: (index: number, error: string): DispatchError => + ({ + type: 'Module', + value: { index, error }, + }) as DispatchError, + + token: (value: string): DispatchError => + ({ + type: 'Token', + value, + }) as DispatchError, + + arithmetic: (value: string): DispatchError => + ({ + type: 'Arithmetic', + value, + }) as DispatchError, + + transactional: (value: string): DispatchError => + ({ + type: 'Transactional', + value, + }) as DispatchError, + + badOrigin: (): DispatchError => + ({ + type: 'BadOrigin', + }) as DispatchError, + + cannotLookup: (): DispatchError => + ({ + type: 'CannotLookup', + }) as DispatchError, + + other: (): DispatchError => + ({ + type: 'Other', + }) as DispatchError, +}; describe('getReadableDispatchError', () => { beforeEach(() => { - vi.clearAllMocks() - }) + vi.clearAllMocks(); + }); describe('Module errors', () => { it('should return decoded error message when findErrorMeta succeeds', () => { @@ -57,17 +64,19 @@ describe('getReadableDispatchError', () => { fields: [], fieldCodecs: [], index: 0, - palletIndex: 5 - } + palletIndex: 5, + }; - mockApi.registry.findErrorMeta.mockReturnValue(mockErrorMeta) + mockApi.registry.findErrorMeta.mockReturnValue(mockErrorMeta); - const dispatchError = createMockDispatchError.module(5, '0x00000000') - const result = getReadableDispatchError(mockApi, dispatchError) + const dispatchError = createMockDispatchError.module(5, '0x00000000'); + const result = getReadableDispatchError(mockApi, dispatchError); - expect(mockApi.registry.findErrorMeta).toHaveBeenCalledWith(dispatchError) - expect(result).toBe('[useSendTransaction]: Balances.InsufficientBalance error, The account balance is too low.') - }) + expect(mockApi.registry.findErrorMeta).toHaveBeenCalledWith(dispatchError); + expect(result).toBe( + '[useSendTransaction]: Balances.InsufficientBalance error, The account balance is too low.' + ); + }); it('should handle empty docs array', () => { const mockErrorMeta = { @@ -77,16 +86,16 @@ describe('getReadableDispatchError', () => { fields: [], fieldCodecs: [], index: 1, - palletIndex: 0 - } + palletIndex: 0, + }; - mockApi.registry.findErrorMeta.mockReturnValue(mockErrorMeta) + mockApi.registry.findErrorMeta.mockReturnValue(mockErrorMeta); - const dispatchError = createMockDispatchError.module(0, '0x00000001') - const result = getReadableDispatchError(mockApi, dispatchError) + const dispatchError = createMockDispatchError.module(0, '0x00000001'); + const result = getReadableDispatchError(mockApi, dispatchError); - expect(result).toBe('[useSendTransaction]: System.InvalidTransaction error, ') - }) + expect(result).toBe('[useSendTransaction]: System.InvalidTransaction error, '); + }); it('should handle multiple docs entries', () => { const mockErrorMeta = { @@ -96,106 +105,112 @@ describe('getReadableDispatchError', () => { fields: [], fieldCodecs: [], index: 2, - palletIndex: 50 - } + palletIndex: 50, + }; - mockApi.registry.findErrorMeta.mockReturnValue(mockErrorMeta) + mockApi.registry.findErrorMeta.mockReturnValue(mockErrorMeta); - const dispatchError = createMockDispatchError.module(50, '0x00000002') - const result = getReadableDispatchError(mockApi, dispatchError) + const dispatchError = createMockDispatchError.module(50, '0x00000002'); + const result = getReadableDispatchError(mockApi, dispatchError); - expect(result).toBe('[useSendTransaction]: Assets.NoPermission error, The account does not have permission. Check your account privileges.') - }) + expect(result).toBe( + '[useSendTransaction]: Assets.NoPermission error, The account does not have permission. Check your account privileges.' + ); + }); it('should return raw error when findErrorMeta returns null', () => { - mockApi.registry.findErrorMeta.mockReturnValue(null) + mockApi.registry.findErrorMeta.mockReturnValue(null); - const dispatchError = createMockDispatchError.module(5, '0x00000000') - const result = getReadableDispatchError(mockApi, dispatchError) + const dispatchError = createMockDispatchError.module(5, '0x00000000'); + const result = getReadableDispatchError(mockApi, dispatchError); - expect(result).toBe('[useSendTransaction]: Module Error (index: 5, error: 0x00000000)') - }) + expect(result).toBe('[useSendTransaction]: Module Error (index: 5, error: 0x00000000)'); + }); it('should handle findErrorMeta throwing an error', () => { - const error = new Error('Failed to decode error metadata') + const error = new Error('Failed to decode error metadata'); mockApi.registry.findErrorMeta.mockImplementation(() => { - throw error - }) + throw error; + }); - const dispatchError = createMockDispatchError.module(5, '0x00000000') - const result = getReadableDispatchError(mockApi, dispatchError) + const dispatchError = createMockDispatchError.module(5, '0x00000000'); + const result = getReadableDispatchError(mockApi, dispatchError); - expect(result).toBe('[useSendTransaction]: Module Error (index: 5, error: 0x00000000) - Failed to decode: Failed to decode error metadata') - }) + expect(result).toBe( + '[useSendTransaction]: Module Error (index: 5, error: 0x00000000) - Failed to decode: Failed to decode error metadata' + ); + }); it('should handle findErrorMeta throwing non-Error object', () => { mockApi.registry.findErrorMeta.mockImplementation(() => { - throw 'String error' - }) + throw 'String error'; + }); - const dispatchError = createMockDispatchError.module(10, '0x00000005') - const result = getReadableDispatchError(mockApi, dispatchError) + const dispatchError = createMockDispatchError.module(10, '0x00000005'); + const result = getReadableDispatchError(mockApi, dispatchError); - expect(result).toBe('[useSendTransaction]: Module Error (index: 10, error: 0x00000005) - Failed to decode: Unknown error') - }) - }) + expect(result).toBe( + '[useSendTransaction]: Module Error (index: 10, error: 0x00000005) - Failed to decode: Unknown error' + ); + }); + }); describe('Token errors', () => { it('should return token error message', () => { - const dispatchError = createMockDispatchError.token('FundsUnavailable') - const result = getReadableDispatchError(mockApi, dispatchError) + const dispatchError = createMockDispatchError.token('FundsUnavailable'); + const result = getReadableDispatchError(mockApi, dispatchError); - expect(result).toBe('[useSendTransaction]: Token Error: FundsUnavailable') - }) + expect(result).toBe('[useSendTransaction]: Token Error: FundsUnavailable'); + }); it('should handle different token error types', () => { - const errorTypes = ['BelowMinimum', 'CannotCreate', 'UnknownAsset', 'Frozen'] + const errorTypes = ['BelowMinimum', 'CannotCreate', 'UnknownAsset', 'Frozen']; - errorTypes.forEach(errorType => { - const dispatchError = createMockDispatchError.token(errorType) - const result = getReadableDispatchError(mockApi, dispatchError) + errorTypes.forEach((errorType) => { + const dispatchError = createMockDispatchError.token(errorType); + const result = getReadableDispatchError(mockApi, dispatchError); - expect(result).toBe(`[useSendTransaction]: Token Error: ${errorType}`) - }) - }) - }) + expect(result).toBe(`[useSendTransaction]: Token Error: ${errorType}`); + }); + }); + }); describe('Other error types with value', () => { it('should handle Arithmetic errors', () => { - const dispatchError = createMockDispatchError.arithmetic('Overflow') - const result = getReadableDispatchError(mockApi, dispatchError) + const dispatchError = createMockDispatchError.arithmetic('Overflow'); + const result = getReadableDispatchError(mockApi, dispatchError); - expect(result).toBe('[useSendTransaction]: Arithmetic Error: Overflow') - }) + expect(result).toBe('[useSendTransaction]: Arithmetic Error: Overflow'); + }); it('should handle Transactional errors', () => { - const dispatchError = createMockDispatchError.transactional('LimitReached') - const result = getReadableDispatchError(mockApi, dispatchError) + const dispatchError = createMockDispatchError.transactional('LimitReached'); + const result = getReadableDispatchError(mockApi, dispatchError); - expect(result).toBe('[useSendTransaction]: Transactional Error: LimitReached') - }) - }) + expect(result).toBe('[useSendTransaction]: Transactional Error: LimitReached'); + }); + }); describe('Error types without value', () => { it('should handle BadOrigin error', () => { - const dispatchError = createMockDispatchError.badOrigin() - const result = getReadableDispatchError(mockApi, dispatchError) + const dispatchError = createMockDispatchError.badOrigin(); + const result = getReadableDispatchError(mockApi, dispatchError); - expect(result).toBe('[useSendTransaction]: Error: BadOrigin') - }) + expect(result).toBe('[useSendTransaction]: Error: BadOrigin'); + }); it('should handle CannotLookup error', () => { - const dispatchError = createMockDispatchError.cannotLookup() - const result = getReadableDispatchError(mockApi, dispatchError) + const dispatchError = createMockDispatchError.cannotLookup(); + const result = getReadableDispatchError(mockApi, dispatchError); - expect(result).toBe('[useSendTransaction]: Error: CannotLookup') - }) + expect(result).toBe('[useSendTransaction]: Error: CannotLookup'); + }); it('should handle Other error', () => { - const dispatchError = createMockDispatchError.other() - const result = getReadableDispatchError(mockApi, dispatchError) + const dispatchError = createMockDispatchError.other(); + const result = getReadableDispatchError(mockApi, dispatchError); - expect(result).toBe('[useSendTransaction]: Error: Other') - }) - }) -}) + expect(result).toBe('[useSendTransaction]: Error: Other'); + }); + }); +}); diff --git a/packages/react/src/utils/dispatchError.ts b/packages/react/src/utils/dispatchError.ts index ba4ffe5..74e2813 100644 --- a/packages/react/src/utils/dispatchError.ts +++ b/packages/react/src/utils/dispatchError.ts @@ -1,5 +1,5 @@ -import type { DispatchError } from 'dedot/codecs' -import type { LegacyClient } from 'dedot' +import type { LegacyClient } from 'dedot'; +import type { DispatchError } from 'dedot/codecs'; export function getReadableDispatchError(api: LegacyClient, dispatchError: DispatchError): string { if (dispatchError.type === 'Module') { @@ -12,7 +12,9 @@ export function getReadableDispatchError(api: LegacyClient, dispatchError: Dispa return `[useSendTransaction]: Module Error (index: ${dispatchError.value.index}, error: ${dispatchError.value.error})`; } catch (e) { - const { value: { error, index } } = dispatchError; + const { + value: { error, index }, + } = dispatchError; return `[useSendTransaction]: Module Error (index: ${index}, error: ${error}) - Failed to decode: ${e instanceof Error ? e.message : 'Unknown error'}`; } diff --git a/packages/react/src/utils/index.ts b/packages/react/src/utils/index.ts index 7cf848f..2eb4cc2 100644 --- a/packages/react/src/utils/index.ts +++ b/packages/react/src/utils/index.ts @@ -1,16 +1,16 @@ export { + convertAddress, + defineChain, formatAddress, + formatBalance, + formatBalanceWithUnit, + getChainToken, getExplorerUrl, getPublicKey, isMobileDevice, isSameAddress, isValidAddress, - formatBalance, - getChainToken, - defineChain, - convertAddress, - formatBalanceWithUnit -} from '@luno-kit/core/utils' +} from '@luno-kit/core/utils'; export * from './createApi'; export * from './dispatchError'; diff --git a/packages/react/src/utils/sleep.test.ts b/packages/react/src/utils/sleep.test.ts index 94c5c45..f1c445d 100644 --- a/packages/react/src/utils/sleep.test.ts +++ b/packages/react/src/utils/sleep.test.ts @@ -1,4 +1,4 @@ -import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest'; +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; import { sleep } from './sleep'; describe('sleep', () => { diff --git a/packages/react/src/utils/sleep.ts b/packages/react/src/utils/sleep.ts index e10385d..38bde37 100644 --- a/packages/react/src/utils/sleep.ts +++ b/packages/react/src/utils/sleep.ts @@ -1,3 +1,3 @@ export const sleep = (ms = 1000): Promise => { - return new Promise(resolve => setTimeout(resolve, ms)); + return new Promise((resolve) => setTimeout(resolve, ms)); }; diff --git a/packages/react/tsconfig.json b/packages/react/tsconfig.json index 53f8e3a..bf038b8 100644 --- a/packages/react/tsconfig.json +++ b/packages/react/tsconfig.json @@ -16,8 +16,6 @@ } }, "include": ["src/**/*"], - "references": [ - { "path": "../core" } - ], + "references": [{ "path": "../core" }], "types": ["vitest/globals", "@testing-library/jest-dom"] } diff --git a/packages/react/tsup.config.ts b/packages/react/tsup.config.ts index 6afad01..d35f9c6 100644 --- a/packages/react/tsup.config.ts +++ b/packages/react/tsup.config.ts @@ -23,15 +23,11 @@ export default defineConfig((options) => ({ sourcemap: true, clean: true, treeshake: true, - external: [ - 'react', - 'react-dom', - '@tanstack/react-query', - ], + external: ['react', 'react-dom', '@tanstack/react-query'], tsconfig: './tsconfig.json', esbuildOptions() { if (!options.watch) { - options.drop = ['console', 'debugger'] + options.drop = ['console', 'debugger']; } - } + }, })); diff --git a/packages/react/vitest.config.ts b/packages/react/vitest.config.ts index 5a3e13a..3dd8952 100644 --- a/packages/react/vitest.config.ts +++ b/packages/react/vitest.config.ts @@ -1,5 +1,5 @@ -import baseConfig from '../../vitest.base.config'; import { mergeConfig } from 'vitest/config'; +import baseConfig from '../../vitest.base.config'; export default mergeConfig(baseConfig, { test: { diff --git a/packages/ui/postcss.config.mjs b/packages/ui/postcss.config.mjs index b776c62..a34a3d5 100644 --- a/packages/ui/postcss.config.mjs +++ b/packages/ui/postcss.config.mjs @@ -1,5 +1,5 @@ export default { plugins: { - "@tailwindcss/postcss": {}, - } -} \ No newline at end of file + '@tailwindcss/postcss': {}, + }, +}; diff --git a/packages/ui/src/assets/icons/Arrow.tsx b/packages/ui/src/assets/icons/Arrow.tsx index c869bcb..5fb093f 100644 --- a/packages/ui/src/assets/icons/Arrow.tsx +++ b/packages/ui/src/assets/icons/Arrow.tsx @@ -1,5 +1,6 @@ -import * as React from "react"; -import type { SVGProps } from "react"; +import type { SVGProps } from 'react'; +import * as React from 'react'; + const SvgArrow = (props: SVGProps) => ( ) => ( ) => ( ) => ( ) => ( ) => ( ) => ( ) => ( height="20" fill="currentColor" {...props} - > - + > + {/* */} - + ); export default SvgArrow; - diff --git a/packages/ui/src/assets/icons/Success.tsx b/packages/ui/src/assets/icons/Success.tsx index fecc9e9..89f2a4f 100644 --- a/packages/ui/src/assets/icons/Success.tsx +++ b/packages/ui/src/assets/icons/Success.tsx @@ -1,5 +1,6 @@ -import * as React from "react"; -import type { SVGProps } from "react"; +import type { SVGProps } from 'react'; +import * as React from 'react'; + const SvgSuccess = (props: SVGProps) => ( ) => ( void; onModalClose: () => void; } -export const MainView: React.FC = ({ - onViewChange, - onModalClose, -}) => { +export const MainView: React.FC = ({ onViewChange, onModalClose }) => { const { address } = useAccount(); const { chain } = useChain(); + const chains = useChains(); const { disconnectAsync } = useDisconnect(); - const { data: balance } = useBalance({ address }); + const { data: balance } = useBalance({ address: chains.length > 0 ? address : undefined }); const items = useMemo(() => { - return [ + const chainSelectOptions = [ + { + key: 'View on Explorer', + content: ( + <> + + View on Explorer + + ), + onClick: () => + window.open(getExplorerUrl(chain?.blockExplorers?.default?.url!, address, 'address')), + }, { key: 'Chain Name', content: ( @@ -36,34 +46,29 @@ export const MainView: React.FC = ({ {/*
*/}
- {chain?.name || 'Polkadot'} + + {chain?.name || 'Polkadot'} + {balance ? ( - {balance.formattedTransferable || '0.00'} {chain?.nativeCurrency?.symbol || 'DOT'} + {balance.formattedTransferable || '0.00'}{' '} + {chain?.nativeCurrency?.symbol || 'DOT'} ) : ( - + )}
-
+
), - onClick: () => onViewChange(AccountModalView.switchChain) - }, - { - key: 'View on Explorer', - content: ( - <> - - View on Explorer - - ), - onClick: () => window.open(getExplorerUrl(chain?.blockExplorers?.default?.url!, address, 'address')) + onClick: () => onViewChange(AccountModalView.switchChain), }, + ]; + + const normalOptions = [ { key: 'Switch Account', content: ( @@ -72,10 +77,12 @@ export const MainView: React.FC = ({ Switch Account ), - onClick: () => onViewChange(AccountModalView.switchAccount) - } + onClick: () => onViewChange(AccountModalView.switchAccount), + }, ]; - }, [onViewChange, chain, address, balance]) + + return chains.length > 0 ? [...chainSelectOptions, ...normalOptions] : [...normalOptions]; + }, [onViewChange, chain, address, balance, chains]); const handleDisconnect = async () => { await disconnectAsync(); @@ -85,17 +92,17 @@ export const MainView: React.FC = ({ return (
- {items.map(i => ( + {items.map((i) => ( {i.content} ))}
-
+
- + Disconnect
diff --git a/packages/ui/src/components/AccountDetailsModal/SwitchAccountView.tsx b/packages/ui/src/components/AccountDetailsModal/SwitchAccountView.tsx index 42c53d5..18e4af7 100644 --- a/packages/ui/src/components/AccountDetailsModal/SwitchAccountView.tsx +++ b/packages/ui/src/components/AccountDetailsModal/SwitchAccountView.tsx @@ -1,25 +1,35 @@ +import { + useAccount, + useAccounts, + useActiveConnector, + useBalance, + useChain, + useChains, +} from '@luno-kit/react'; +import type { Account } from '@luno-kit/react/types'; +import { formatAddress } from '@luno-kit/react/utils'; import React, { useCallback } from 'react'; -import { useAccount, useAccounts, useActiveConnector, useBalance, useChain } from '@luno-kit/react'; import { cs } from '../../utils'; -import { formatAddress } from '@luno-kit/react/utils'; -import type { Account } from '@luno-kit/react/types'; interface ViewComponent extends React.FC { title?: string; } interface SwitchAccountViewProps { - onBack: () => void + onBack: () => void; } export const SwitchAccountView: ViewComponent = ({ onBack }) => { const { accounts, selectAccount } = useAccounts(); const { address: currentAddress } = useAccount(); - const _selectAccount = useCallback((acc: Account) => { - selectAccount(acc) - onBack() - }, [onBack]) + const _selectAccount = useCallback( + (acc: Account) => { + selectAccount(acc); + onBack(); + }, + [onBack] + ); return (
@@ -40,56 +50,57 @@ SwitchAccountView.title = 'Switch Accounts'; interface AccountItemProps { isSelected: boolean; account: Account; - selectAccount: (acc: Account) => void + selectAccount: (acc: Account) => void; } -const AccountItem: React.FC = React.memo(({ - isSelected, - account, - selectAccount -}) => { - const { chain } = useChain(); - const address = account.address; - const { data: balance } = useBalance({ address }); - const connector = useActiveConnector() +const AccountItem: React.FC = React.memo( + ({ isSelected, account, selectAccount }) => { + const { chain } = useChain(); + const chains = useChains(); + const address = account.address; + const { data: balance } = useBalance({ address: chains.length > 0 ? address : undefined }); + const connector = useActiveConnector(); - return ( -
- {isSelected && ( -
-
-
- )} - - ); -}); + {isSelected && ( +
+
+
+ )} + + ); + } +); diff --git a/packages/ui/src/components/AccountDetailsModal/SwitchChainView.tsx b/packages/ui/src/components/AccountDetailsModal/SwitchChainView.tsx index 9b6ec1c..a38f574 100644 --- a/packages/ui/src/components/AccountDetailsModal/SwitchChainView.tsx +++ b/packages/ui/src/components/AccountDetailsModal/SwitchChainView.tsx @@ -1,16 +1,16 @@ -import React from 'react' -import { ChainList } from '../ChainList' +import type React from 'react'; +import { ChainList } from '../ChainList'; interface ViewComponent extends React.FC { title?: string; } interface SwitchChainViewProps { - onBack: () => void + onBack: () => void; } export const SwitchChainView: ViewComponent = ({ onBack }) => { - return -} + return ; +}; SwitchChainView.title = 'Select Networks'; diff --git a/packages/ui/src/components/AccountDetailsModal/index.tsx b/packages/ui/src/components/AccountDetailsModal/index.tsx index b8a515e..e9ee32e 100644 --- a/packages/ui/src/components/AccountDetailsModal/index.tsx +++ b/packages/ui/src/components/AccountDetailsModal/index.tsx @@ -1,15 +1,16 @@ -import React, { useCallback, useMemo } from 'react'; import { useAccount, useActiveConnector } from '@luno-kit/react'; -import { Dialog, DialogClose, DialogTitle } from '../Dialog'; -import { cs } from '../../utils'; +import { formatAddress } from '@luno-kit/react/utils'; +import type React from 'react'; +import { useCallback, useMemo } from 'react'; +import { Back, Close } from '../../assets/icons'; +import { useAnimatedViews } from '../../hooks/useAnimatedViews'; import { useAccountModal } from '../../providers'; -import { Close, Back } from '../../assets/icons'; +import { cs } from '../../utils'; +import { Copy } from '../Copy'; +import { Dialog, DialogClose, DialogTitle } from '../Dialog'; import { MainView } from './MainView'; import { SwitchAccountView } from './SwitchAccountView'; import { SwitchChainView } from './SwitchChainView'; -import { Copy } from '../Copy' -import { formatAddress } from '@luno-kit/react/utils' -import { useAnimatedViews } from '../../hooks/useAnimatedViews' export enum AccountModalView { main = 'main', @@ -20,15 +21,10 @@ export enum AccountModalView { export const AccountDetailsModal: React.FC = () => { const { isOpen, close } = useAccountModal(); const { address, account } = useAccount(); - const activeConnector = useActiveConnector() + const activeConnector = useActiveConnector(); - const { - currentView, - containerRef, - currentViewRef, - handleViewChange, - resetView - } = useAnimatedViews({ initialView: AccountModalView.main }); + const { currentView, containerRef, currentViewRef, handleViewChange, resetView } = + useAnimatedViews({ initialView: AccountModalView.main }); const handleModalClose = useCallback(() => { close(); @@ -41,51 +37,52 @@ export const AccountDetailsModal: React.FC = () => { return null; }, [currentView]); - const viewComponents = useMemo(() => ({ - [AccountModalView.main]: ( - - ), - [AccountModalView.switchAccount]: ( - handleViewChange(AccountModalView.main)} /> - ), - [AccountModalView.switchChain]: ( - handleViewChange(AccountModalView.main)} /> - ) - }), [handleViewChange, handleModalClose]); + const viewComponents = useMemo( + () => ({ + [AccountModalView.main]: ( + + ), + [AccountModalView.switchAccount]: ( + handleViewChange(AccountModalView.main)} /> + ), + [AccountModalView.switchChain]: ( + handleViewChange(AccountModalView.main)} /> + ), + }), + [handleViewChange, handleModalClose] + ); return ( - -
+ +
{currentView === AccountModalView.main ? (
{activeConnector?.icon && (
- +
)}
Account Details
- - {formatAddress(address)} - - + + {formatAddress(address)} + +
-
30 ? 'w-[90%]' : '' - )}> +
30 ? 'w-[90%]' : '' + )} + > {account?.name || activeConnector?.name}
@@ -97,10 +94,9 @@ export const AccountDetailsModal: React.FC = () => { onClick={() => handleViewChange(AccountModalView.main)} aria-label="Back" > - + - + {viewTitle} @@ -111,13 +107,8 @@ export const AccountDetailsModal: React.FC = () => {
-
-
- {viewComponents[currentView]} -
+
+
{viewComponents[currentView]}
diff --git a/packages/ui/src/components/ChainIcon/index.tsx b/packages/ui/src/components/ChainIcon/index.tsx index 401bac3..107af4c 100644 --- a/packages/ui/src/components/ChainIcon/index.tsx +++ b/packages/ui/src/components/ChainIcon/index.tsx @@ -1,4 +1,4 @@ -import React from 'react'; +import type React from 'react'; import { cs } from '../../utils'; export interface ChainIconProps { @@ -7,11 +7,7 @@ export interface ChainIconProps { className?: string; } -export const ChainIcon: React.FC = ({ - chainIconUrl, - chainName, - className, -}) => { +export const ChainIcon: React.FC = ({ chainIconUrl, chainName, className }) => { if (chainIconUrl) { return ( = ({ } return ( -
+
{chainName ? chainName.charAt(0).toUpperCase() : 'C'}
); diff --git a/packages/ui/src/components/ChainList/index.tsx b/packages/ui/src/components/ChainList/index.tsx index a024b39..cac7d76 100644 --- a/packages/ui/src/components/ChainList/index.tsx +++ b/packages/ui/src/components/ChainList/index.tsx @@ -1,36 +1,36 @@ -import React, { useMemo, useState } from 'react' -import { cs } from '../../utils' -import { useApi, useChain, useChains, useSwitchChain } from '@luno-kit/react' -import type { Chain } from '@luno-kit/react/types' -import { ChainIcon } from '../ChainIcon' -import Search from '../../assets/icons/Search' +import { useApi, useChain, useChains, useSwitchChain } from '@luno-kit/react'; +import type { Chain } from '@luno-kit/react/types'; +import React, { useMemo, useState } from 'react'; +import { cs } from '../../utils'; +import { ChainIcon } from '../ChainIcon'; +import { Search } from '../../assets/icons'; interface ChainListProps { onChainSwitched?: (chain: Chain) => void; - className?: string + className?: string; } -export const ChainList: React.FC = ({ onChainSwitched, className = '' }: ChainListProps) => { +export const ChainList: React.FC = ({ + onChainSwitched, + className = '', +}: ChainListProps) => { const { chain: currentChain } = useChain(); const chains = useChains(); const { switchChainAsync } = useSwitchChain(); - const { isApiReady, apiError } = useApi() + const { isApiReady, apiError } = useApi(); const [switchingChain, setSwitchingChain] = useState(null); const [searchQuery, setSearchQuery] = useState(''); const filteredChains = useMemo(() => { - return chains - .filter(chain => - searchQuery.trim() - ? chain.name.toLowerCase().includes(searchQuery.toLowerCase()) - : true - ) + return chains.filter((chain) => + searchQuery.trim() ? chain.name.toLowerCase().includes(searchQuery.toLowerCase()) : true + ); }, [chains, searchQuery]); const handleChainSelect = async (chain: Chain) => { if (chain.genesisHash === currentChain?.genesisHash) return; - if (!isApiReady && !apiError) return + if (!isApiReady && !apiError) return; setSwitchingChain(chain.genesisHash); try { @@ -60,7 +60,7 @@ export const ChainList: React.FC = ({ onChainSwitched, className {filteredChains.length > 0 && (
- {filteredChains.map(chain => ( + {filteredChains.map((chain) => ( = ({ onChainSwitched, className {filteredChains.length === 0 && (
- - No chains available - + No chains available
)}
- ) -} + ); +}; interface ChainItemProps { chain: Chain; @@ -92,60 +90,52 @@ interface ChainItemProps { isSwitching: boolean; } -const ChainItem: React.FC = React.memo(({ - chain, - isSelected, - isLoading, - onSelect, - isSwitching -}) => { - return ( - - ); -}); + ) : null} +
+ + ); + } +); diff --git a/packages/ui/src/components/ChainModal/index.tsx b/packages/ui/src/components/ChainModal/index.tsx index 5cdd221..17b6459 100644 --- a/packages/ui/src/components/ChainModal/index.tsx +++ b/packages/ui/src/components/ChainModal/index.tsx @@ -1,10 +1,10 @@ -import React from 'react'; -import { Dialog, DialogTitle, DialogClose } from '../Dialog'; -import { ChainList } from '../ChainList'; +import type React from 'react'; import { Close } from '../../assets/icons'; import { useChainModal } from '../../providers'; +import { ChainList } from '../ChainList'; +import { Dialog, DialogClose, DialogTitle } from '../Dialog'; -export interface ChainModalProps {} +export type ChainModalProps = {}; export const ChainModal: React.FC = () => { const { isOpen, close } = useChainModal(); diff --git a/packages/ui/src/components/ConnectButton/index.tsx b/packages/ui/src/components/ConnectButton/index.tsx index 9b854e2..2d30750 100644 --- a/packages/ui/src/components/ConnectButton/index.tsx +++ b/packages/ui/src/components/ConnectButton/index.tsx @@ -1,10 +1,11 @@ -import React from 'react'; +import { formatAddress } from '@luno-kit/react/utils'; +import type React from 'react'; import { useConnectButton, useWindowSize } from '../../hooks'; import { cs } from '../../utils'; -import { ChainIcon } from '../ChainIcon' -import { formatAddress } from '@luno-kit/react/utils' +import { ChainIcon } from '../ChainIcon'; -export const transitionClassName = 'transition-transform transition-[125] hover:scale-[1.03] transition-ease' +export const transitionClassName = + 'transition-transform transition-[125] hover:scale-[1.03] transition-ease'; export interface ConnectButtonProps { className?: string; @@ -12,7 +13,7 @@ export interface ConnectButtonProps { accountStatus?: 'full' | 'address'; chainStatus?: 'full' | 'icon' | 'name' | 'none'; showBalance?: boolean; - displayPreference?: 'address' | 'name' + displayPreference?: 'address' | 'name'; } export const ConnectButton: React.FC = ({ @@ -34,11 +35,12 @@ export const ConnectButton: React.FC = ({ chainIconUrl, chainName, currentChain, + configuredChains, activeConnector, } = useConnectButton(); - const { width: windowWidth } = useWindowSize() + const { width: windowWidth } = useWindowSize(); - const isLargeWindow = windowWidth && windowWidth > 768 + const isLargeWindow = windowWidth && windowWidth > 768; if (isDisconnected || !isConnected || !activeConnector) { return ( @@ -60,8 +62,13 @@ export const ConnectButton: React.FC = ({ } return ( -
- {chainStatus !== 'none' && ( +
+ {chainStatus !== 'none' && configuredChains.length > 0 && ( diff --git a/packages/ui/src/components/ConnectModal/ConnectOptions.tsx b/packages/ui/src/components/ConnectModal/ConnectOptions.tsx index 3ad48ea..8638884 100644 --- a/packages/ui/src/components/ConnectModal/ConnectOptions.tsx +++ b/packages/ui/src/components/ConnectModal/ConnectOptions.tsx @@ -1,35 +1,46 @@ -import React, {useMemo} from 'react' -import { useConnectors } from '@luno-kit/react' -import { isMobileDevice } from '@luno-kit/react/utils' -import type { Connector } from '@luno-kit/react/types' -import { cs } from '../../utils' +import { useConnectors } from '@luno-kit/react'; +import type { Connector } from '@luno-kit/react/types'; +import { isMobileDevice } from '@luno-kit/react/utils'; +import React, { useMemo } from 'react'; +import { cs } from '../../utils'; interface Props { - onConnect: (connector: Connector) => Promise + onConnect: (connector: Connector) => Promise; } -const popularConnectorIds = ['polkadot-js', 'subwallet-js', 'talisman', 'walletconnect', 'nova', 'nova-mobile'] +const popularConnectorIds = [ + 'polkadot-js', + 'subwallet-js', + 'talisman', + 'walletconnect', + 'nova', + 'nova-mobile', +]; -const moreConnectorIds = ['polkagate', 'fearless-wallet', 'mimir', 'enkrypt'] +const moreConnectorIds = ['polkagate', 'fearless-wallet', 'mimir', 'enkrypt']; export const ConnectOptions = React.memo(({ onConnect }: Props) => { const connectors = useConnectors(); if (isMobileDevice()) { - const filteredConnectors = connectors.filter(i => i.links.deepLink) + const filteredConnectors = connectors.filter((i) => i.links.deepLink); return (
- {filteredConnectors.map(i => ( - onConnect(i)}/> + {filteredConnectors.map((i) => ( + onConnect(i)} /> ))}
- ) + ); } - const installedConnectors = connectors.filter(c => c.isInstalled()) - const popularConnectors = connectors.filter(c => popularConnectorIds.includes(c.id) && !c.isInstalled()) - const moreConnectors = connectors.filter(c => moreConnectorIds.includes(c.id) && !c.isInstalled()) + const installedConnectors = connectors.filter((c) => c.isInstalled()); + const popularConnectors = connectors.filter( + (c) => popularConnectorIds.includes(c.id) && !c.isInstalled() + ); + const moreConnectors = connectors.filter( + (c) => moreConnectorIds.includes(c.id) && !c.isInstalled() + ); const connectorGroup: { title: string; group: Connector[] }[] = useMemo(() => { return [ @@ -44,40 +55,46 @@ export const ConnectOptions = React.memo(({ onConnect }: Props) => { { title: 'More', group: moreConnectors, - } - ] - }, [installedConnectors, popularConnectors, moreConnectors]) + }, + ]; + }, [installedConnectors, popularConnectors, moreConnectors]); return ( -
- {connectorGroup.map(g => { - if (g.group.length === 0) return null +
+ {connectorGroup.map((g) => { + if (g.group.length === 0) return null; return (
-
+
{g.title}
- {g.group.map(i => ( - onConnect(i)}/> + {g.group.map((i) => ( + onConnect(i)} /> ))}
- ) + ); })}
- ) -}) + ); +}); interface ConnectorItemProps { connector: Connector; onConnect: () => void; } -const ConnectorItem: React.FC = React.memo(({connector, onConnect}) => { +const ConnectorItem: React.FC = React.memo(({ connector, onConnect }) => { return (
} + {!selectedConnector.isInstalled() && selectedConnector.links.browserExtension && ( +

window.open(selectedConnector.links.browserExtension)} + className={ + 'cursor-pointer pt-6 text-sm text-accentColor font-medium text-center hover:text-modalText' + } + > + Don‘t have {selectedConnector.name}? +

+ )} + {!connectState.isConnecting && + connectState.isError && + selectedConnector.isInstalled() && ( + )} - onClick={() => onConnect(selectedConnector!)}> - Retry - - )} - + + ) ) : ( <>
- +

window.open('https://polkadot.com/get-started/wallets/')}> + className={ + 'cursor-pointer text-base leading-base text-accentColor font-semibold text-center' + } + onClick={() => window.open('https://polkadot.com/get-started/wallets/')} + > New to wallets?

-

+

Connect your wallet to start exploring and interacting with DApps. -

+

)} -
+
-
-
- ) -}) +
+
+ ); + } +); diff --git a/packages/ui/src/components/ConnectModal/index.tsx b/packages/ui/src/components/ConnectModal/index.tsx index 86c57a6..a63f052 100644 --- a/packages/ui/src/components/ConnectModal/index.tsx +++ b/packages/ui/src/components/ConnectModal/index.tsx @@ -1,15 +1,16 @@ -import React, {useEffect, useMemo, useState} from 'react'; import { useConnect } from '@luno-kit/react'; -import { Dialog, DialogClose, DialogTitle, ModalSize } from '../Dialog'; +import type { Connector } from '@luno-kit/react/types'; +import { isMobileDevice } from '@luno-kit/react/utils'; +import type React from 'react'; +import { useEffect, useMemo, useState } from 'react'; +import { Back, Close } from '../../assets/icons'; +import { useWindowSize } from '../../hooks'; +import { useAnimatedViews } from '../../hooks/useAnimatedViews'; +import { useConnectModal } from '../../providers'; import { cs } from '../../utils'; -import { useConnectModal } from '../../providers' -import type { Connector } from '@luno-kit/react/types' -import { isMobileDevice } from '@luno-kit/react/utils' -import { Back, Close } from '../../assets/icons' -import { useWindowSize } from '../../hooks' -import { WalletView } from './WalletView' -import { useAnimatedViews } from '../../hooks/useAnimatedViews' -import { ConnectOptions } from './ConnectOptions' +import { Dialog, DialogClose, DialogTitle, type ModalSize } from '../Dialog'; +import { ConnectOptions } from './ConnectOptions'; +import { WalletView } from './WalletView'; export enum ConnectModalView { connectOptions = 'Connect Wallet', @@ -20,32 +21,30 @@ export interface ConnectModalProps { size?: ModalSize; } -export const ConnectModal: React.FC = ({ - size = 'wide', -}) => { +export const ConnectModal: React.FC = ({ size = 'wide' }) => { const { isOpen, close } = useConnectModal(); - const { connectAsync, reset: resetConnect, isPending: isConnecting, isError: connectError } = useConnect() - const [selectedConnector, setSelectedConnector] = useState(null) - const [qrCode, setQrCode] = useState() + const { + connectAsync, + reset: resetConnect, + isPending: isConnecting, + isError: connectError, + } = useConnect(); + const [selectedConnector, setSelectedConnector] = useState(null); + const [qrCode, setQrCode] = useState(); - const { width: windowWidth } = useWindowSize() + const { width: windowWidth } = useWindowSize(); const isLargeWindow = windowWidth && windowWidth > 768; const isWide = !!(size === 'wide' && isLargeWindow); - const { - containerRef, - currentViewRef, - resetView, - handleViewChange, - currentView, - } = useAnimatedViews({ initialView: ConnectModalView.connectOptions }) + const { containerRef, currentViewRef, resetView, handleViewChange, currentView } = + useAnimatedViews({ initialView: ConnectModalView.connectOptions }); const onQrCode = async (connector: Connector) => { - const uri = await connector.getConnectionUri() + const uri = await connector.getConnectionUri(); - setQrCode(uri) - } + setQrCode(uri); + }; const handleConnect = async (connector: Connector) => { if (isMobileDevice() && connector.links.deepLink) { @@ -59,23 +58,23 @@ export const ConnectModal: React.FC = ({ } } - !isWide && handleViewChange(ConnectModalView.walletView) - setSelectedConnector(connector) - setQrCode(undefined) + !isWide && handleViewChange(ConnectModalView.walletView); + setSelectedConnector(connector); + setQrCode(undefined); if (connector.hasConnectionUri()) { - onQrCode(connector) + onQrCode(connector); } - await connectAsync({ connectorId: connector.id }) - _onOpenChange(false) - } + await connectAsync({ connectorId: connector.id }); + _onOpenChange(false); + }; const _onOpenChange = (open: boolean) => { - !open && close() - resetConnect() - resetView() - setSelectedConnector(null) - setQrCode(undefined) - } + !open && close(); + resetConnect(); + resetView(); + setSelectedConnector(null); + setQrCode(undefined); + }; const viewComponents = useMemo(() => { return { @@ -86,10 +85,11 @@ export const ConnectModal: React.FC = ({ isWide={isWide} selectedConnector={selectedConnector} qrCode={qrCode} - onConnect={handleConnect} /> + onConnect={handleConnect} + /> ), - } - }, [isWide, selectedConnector, qrCode, handleConnect, isConnecting, connectError]) + }; + }, [isWide, selectedConnector, qrCode, handleConnect, isConnecting, connectError]); useEffect(() => { if (isWide && currentView === ConnectModalView.walletView) { @@ -99,16 +99,29 @@ export const ConnectModal: React.FC = ({ return ( -
-
+
+
{currentView === ConnectModalView.connectOptions ? ( <> {!isWide &&
} - + Connect Wallet @@ -119,12 +132,13 @@ export const ConnectModal: React.FC = ({ onClick={() => handleViewChange(ConnectModalView.connectOptions)} aria-label="Back" > - + + 'text-lg leading-lg text-modalText font-semibold transition-opacity duration-300' + )} + > {selectedConnector?.name} @@ -132,29 +146,30 @@ export const ConnectModal: React.FC = ({ {!isWide && ( - + className={ + 'z-10 w-[30px] h-[30px] flex items-center justify-center cursor-pointer rounded-modalControlButton border-none hover:bg-modalControlButtonBackgroundHover transition-colors duration-200' + } + > + )}
-
-
- {viewComponents[currentView]} -
+
+
{viewComponents[currentView]}
{!isWide && currentView === ConnectModalView.connectOptions && ( <> -

window.open('https://polkadot.com/get-started/wallets/')}> +

window.open('https://polkadot.com/get-started/wallets/')} + > New to wallets?

)} -
{isWide && ( diff --git a/packages/ui/src/components/Copy/index.tsx b/packages/ui/src/components/Copy/index.tsx index 38a14ed..ffd84ee 100644 --- a/packages/ui/src/components/Copy/index.tsx +++ b/packages/ui/src/components/Copy/index.tsx @@ -1,11 +1,12 @@ -import React, { useCallback, useState } from 'react' -import { Copy as CopyIcon, Success } from '../../assets/icons' -import { cs } from '../../utils' +import type React from 'react'; +import { useCallback, useState } from 'react'; +import { Copy as CopyIcon, Success } from '../../assets/icons'; +import { cs } from '../../utils'; interface CopyProps { - copyText?: string - label?: string - className?: string + copyText?: string; + label?: string; + className?: string; } export const Copy: React.FC = ({ copyText, label, className = '' }) => { @@ -24,7 +25,7 @@ export const Copy: React.FC = ({ copyText, label, className = '' }) = console.error('Copy failed:', err); return false; } - }, []) + }, []); return ( - ) -} + ); +}; diff --git a/packages/ui/src/components/Dialog/index.tsx b/packages/ui/src/components/Dialog/index.tsx index 2a380e8..16228fb 100644 --- a/packages/ui/src/components/Dialog/index.tsx +++ b/packages/ui/src/components/Dialog/index.tsx @@ -1,6 +1,7 @@ // packages/ui/src/components/Dialog/index.tsx -import React, { ReactNode } from 'react'; + import * as DialogPrimitive from '@radix-ui/react-dialog'; +import React, { type ReactNode } from 'react'; import { cs } from '../../utils'; export type ModalSize = 'compact' | 'wide'; @@ -39,7 +40,7 @@ const DialogRoot: React.FC = ({ 'fixed inset-0 z-[100] bg-modalBackdrop luno-kit', 'data-[state=open]:[animation:overlay-in_150ms_ease-out]', overlayClassName - ) + ), })} { +export const QRCode = ({ logoBackground, uri, size }: Props) => { if (!uri) { const QR_GRID_SIZE = 57; const FINDER_SIZE_WITH_MARGIN = 8; const ARENA_GRID_SIZE = Math.floor(QR_GRID_SIZE / 4); - + const cellSize = size / QR_GRID_SIZE; const arenaSize = ARENA_GRID_SIZE * cellSize; const arenaStart = Math.ceil(QR_GRID_SIZE / 2 - ARENA_GRID_SIZE / 2); const arenaEnd = arenaStart + ARENA_GRID_SIZE; - + const generateSkeletonDots = () => { const dots = []; for (let i = 0; i < QR_GRID_SIZE; i++) { for (let j = 0; j < QR_GRID_SIZE; j++) { if (i >= arenaStart && i < arenaEnd && j >= arenaStart && j < arenaEnd) continue; - const isInFinder = + const isInFinder = (i < FINDER_SIZE_WITH_MARGIN && j < FINDER_SIZE_WITH_MARGIN) || (i < FINDER_SIZE_WITH_MARGIN && j >= QR_GRID_SIZE - FINDER_SIZE_WITH_MARGIN) || (i >= QR_GRID_SIZE - FINDER_SIZE_WITH_MARGIN && j < FINDER_SIZE_WITH_MARGIN); @@ -57,7 +53,11 @@ export const QRCode = ({ return dots; }; - const renderFinderPattern = ({ position }: { position: 'top-left' | 'top-right' | 'bottom-left' }) => { + const renderFinderPattern = ({ + position, + }: { + position: 'top-left' | 'top-right' | 'bottom-left'; + }) => { const finderSize = 7 * cellSize; const positionStyles = { 'top-left': { top: 0, left: 0 }, @@ -66,28 +66,28 @@ export const QRCode = ({ }; return ( -
-
-
@@ -96,17 +96,17 @@ export const QRCode = ({ const renderArenaLogo = () => { const logoStart = arenaStart * cellSize; - + return ( -
QR Code Logo
); }; - + return ( -
- {generateSkeletonDots()} - -
- + {renderFinderPattern({ position: 'top-left' })} {renderFinderPattern({ position: 'top-right' })} {renderFinderPattern({ position: 'bottom-left' })} - + {logoBackground && renderArenaLogo()}
- ) + ); } - return ( - - ) -} + return ; +}; diff --git a/packages/ui/src/components/SpiralAnimation/index.tsx b/packages/ui/src/components/SpiralAnimation/index.tsx index c22f5dc..755413d 100644 --- a/packages/ui/src/components/SpiralAnimation/index.tsx +++ b/packages/ui/src/components/SpiralAnimation/index.tsx @@ -1,5 +1,6 @@ -import React, { useEffect, useRef } from 'react'; -import {cs} from '../../utils' +import type React from 'react'; +import { useEffect, useRef } from 'react'; +import { cs } from '../../utils'; export interface SpiralAnimationProps { size?: number; @@ -12,7 +13,7 @@ export const SpiralAnimation: React.FC = ({ size = 160, dotCount = 300, duration = 3, - className = '' + className = '', }) => { const containerRef = useRef(null); @@ -24,14 +25,14 @@ export const SpiralAnimation: React.FC = ({ const GOLDEN_ANGLE = Math.PI * (3 - Math.sqrt(5)); const CENTER = size / 2; const MAX_RADIUS = CENTER - MARGIN - DOT_RADIUS; - const svgNS = "http://www.w3.org/2000/svg"; + const svgNS = 'http://www.w3.org/2000/svg'; containerRef.current.innerHTML = ''; - const svg = document.createElementNS(svgNS, "svg"); - svg.setAttribute("width", size.toString()); - svg.setAttribute("height", size.toString()); - svg.setAttribute("viewBox", `0 0 ${size} ${size}`); + const svg = document.createElementNS(svgNS, 'svg'); + svg.setAttribute('width', size.toString()); + svg.setAttribute('height', size.toString()); + svg.setAttribute('viewBox', `0 0 ${size} ${size}`); svg.style.display = 'block'; containerRef.current.appendChild(svg); @@ -44,35 +45,32 @@ export const SpiralAnimation: React.FC = ({ const x = CENTER + r * Math.cos(theta); const y = CENTER + r * Math.sin(theta); - const circle = document.createElementNS(svgNS, "circle"); - circle.setAttribute("cx", x.toString()); - circle.setAttribute("cy", y.toString()); - circle.setAttribute("r", DOT_RADIUS.toString()); - circle.setAttribute("fill", "currentColor"); - circle.setAttribute("opacity", "0.6"); + const circle = document.createElementNS(svgNS, 'circle'); + circle.setAttribute('cx', x.toString()); + circle.setAttribute('cy', y.toString()); + circle.setAttribute('r', DOT_RADIUS.toString()); + circle.setAttribute('fill', 'currentColor'); + circle.setAttribute('opacity', '0.6'); svg.appendChild(circle); - const animR = document.createElementNS(svgNS, "animate"); - animR.setAttribute("attributeName", "r"); - animR.setAttribute( - "values", - `${DOT_RADIUS * 0.5};${DOT_RADIUS * 1.8};${DOT_RADIUS * 0.5}` - ); - animR.setAttribute("dur", `${duration}s`); - animR.setAttribute("begin", `${frac * duration}s`); - animR.setAttribute("repeatCount", "indefinite"); - animR.setAttribute("calcMode", "spline"); - animR.setAttribute("keySplines", "0.4 0 0.6 1;0.4 0 0.6 1"); + const animR = document.createElementNS(svgNS, 'animate'); + animR.setAttribute('attributeName', 'r'); + animR.setAttribute('values', `${DOT_RADIUS * 0.5};${DOT_RADIUS * 1.8};${DOT_RADIUS * 0.5}`); + animR.setAttribute('dur', `${duration}s`); + animR.setAttribute('begin', `${frac * duration}s`); + animR.setAttribute('repeatCount', 'indefinite'); + animR.setAttribute('calcMode', 'spline'); + animR.setAttribute('keySplines', '0.4 0 0.6 1;0.4 0 0.6 1'); circle.appendChild(animR); - const animO = document.createElementNS(svgNS, "animate"); - animO.setAttribute("attributeName", "opacity"); - animO.setAttribute("values", "0.2;1;0.2"); - animO.setAttribute("dur", `${duration}s`); - animO.setAttribute("begin", `${frac * duration}s`); - animO.setAttribute("repeatCount", "indefinite"); - animO.setAttribute("calcMode", "spline"); - animO.setAttribute("keySplines", "0.4 0 0.6 1;0.4 0 0.6 1"); + const animO = document.createElementNS(svgNS, 'animate'); + animO.setAttribute('attributeName', 'opacity'); + animO.setAttribute('values', '0.2;1;0.2'); + animO.setAttribute('dur', `${duration}s`); + animO.setAttribute('begin', `${frac * duration}s`); + animO.setAttribute('repeatCount', 'indefinite'); + animO.setAttribute('calcMode', 'spline'); + animO.setAttribute('keySplines', '0.4 0 0.6 1;0.4 0 0.6 1'); circle.appendChild(animO); } }, [size, dotCount, duration]); @@ -80,7 +78,10 @@ export const SpiralAnimation: React.FC = ({ return (
); }; diff --git a/packages/ui/src/components/index.ts b/packages/ui/src/components/index.ts index 29e147e..375cd9c 100644 --- a/packages/ui/src/components/index.ts +++ b/packages/ui/src/components/index.ts @@ -1,6 +1,4 @@ -export * from './AccountDetailsModal' -export * from './ChainModal' -export * from './ConnectModal' - -export * from './ConnectButton' - +export * from './AccountDetailsModal'; +export * from './ChainModal'; +export * from './ConnectButton'; +export * from './ConnectModal'; diff --git a/packages/ui/src/hooks/index.ts b/packages/ui/src/hooks/index.ts index a78346a..3748f7d 100644 --- a/packages/ui/src/hooks/index.ts +++ b/packages/ui/src/hooks/index.ts @@ -1,2 +1,2 @@ -export * from './useConnectButton' -export * from './useWindowSize' +export * from './useConnectButton'; +export * from './useWindowSize'; diff --git a/packages/ui/src/hooks/useAnimatedViews.ts b/packages/ui/src/hooks/useAnimatedViews.ts index 6762ff7..27b5e78 100644 --- a/packages/ui/src/hooks/useAnimatedViews.ts +++ b/packages/ui/src/hooks/useAnimatedViews.ts @@ -1,4 +1,5 @@ -import React, { useCallback, useState, useRef } from 'react'; +import type React from 'react'; +import { useCallback, useRef, useState } from 'react'; interface UseAnimatedViewsProps { initialView: T; @@ -18,49 +19,51 @@ interface UseAnimatedViewsReturn { export function useAnimatedViews({ initialView, animationDuration = 200, - animationEasing = 'ease-out' + animationEasing = 'ease-out', }: UseAnimatedViewsProps): UseAnimatedViewsReturn { const [currentView, setCurrentView] = useState(initialView); const [isAnimating, setIsAnimating] = useState(false); const containerRef = useRef(null); const currentViewRef = useRef(null); - const handleViewChange = useCallback((view: T) => { - if (view === currentView || isAnimating) return; + const handleViewChange = useCallback( + (view: T) => { + if (view === currentView || isAnimating) return; - setIsAnimating(true); + setIsAnimating(true); - if (!containerRef.current) { - setCurrentView(view); - setIsAnimating(false); - return; - } - - const container = containerRef.current; - const currentHeight = container.offsetHeight; - - setCurrentView(view); - - requestAnimationFrame(() => { - if (!container || !currentViewRef.current) { + if (!containerRef.current) { + setCurrentView(view); setIsAnimating(false); return; } - const newHeight = currentViewRef.current.offsetHeight; + const container = containerRef.current; + const currentHeight = container.offsetHeight; - container.animate([ - { height: currentHeight + 'px' }, - { height: newHeight + 'px' } - ], { - duration: animationDuration, - easing: animationEasing, - fill: 'forwards' - }).addEventListener('finish', () => { - setIsAnimating(false); + setCurrentView(view); + + requestAnimationFrame(() => { + if (!container || !currentViewRef.current) { + setIsAnimating(false); + return; + } + + const newHeight = currentViewRef.current.offsetHeight; + + container + .animate([{ height: currentHeight + 'px' }, { height: newHeight + 'px' }], { + duration: animationDuration, + easing: animationEasing, + fill: 'forwards', + }) + .addEventListener('finish', () => { + setIsAnimating(false); + }); }); - }); - }, [currentView, isAnimating, animationDuration, animationEasing]); + }, + [currentView, isAnimating, animationDuration, animationEasing] + ); const resetView = useCallback(() => { setCurrentView(initialView); @@ -73,6 +76,6 @@ export function useAnimatedViews({ containerRef, currentViewRef, handleViewChange, - resetView + resetView, }; } diff --git a/packages/ui/src/hooks/useCSSVariableInjection.ts b/packages/ui/src/hooks/useCSSVariableInjection.ts index 32597dd..86010be 100644 --- a/packages/ui/src/hooks/useCSSVariableInjection.ts +++ b/packages/ui/src/hooks/useCSSVariableInjection.ts @@ -3,21 +3,54 @@ import type { LunokitTheme, PartialLunokitTheme, ThemeMode } from '../theme/type // All theme variable names for cleanup const ALL_THEME_VARS = [ - '--color-accentColor', '--color-walletSelectItemBackground', '--color-walletSelectItemBackgroundHover', '--color-walletSelectItemText', - '--color-connectButtonBackground', '--color-connectButtonInnerBackground', '--color-connectButtonText', - '--color-accountActionItemBackground', '--color-accountActionItemBackgroundHover', '--color-accountActionItemText', - '--color-accountSelectItemBackground', '--color-accountSelectItemBackgroundHover', '--color-accountSelectItemText', - '--color-currentNetworkButtonBackground', '--color-currentNetworkButtonText', - '--color-networkSelectItemBackground', '--color-networkSelectItemBackgroundHover', '--color-networkSelectItemText', - '--color-navigationButtonBackground', '--color-separatorLine', - '--color-modalBackground', '--color-modalBackdrop', '--color-modalBorder', '--color-modalText', '--color-modalTextSecondary', - '--color-modalControlButtonBackgroundHover', '--color-modalControlButtonText', - '--color-success', '--color-successForeground', '--color-warning', '--color-warningForeground', - '--color-error', '--color-errorForeground', '--color-info', '--color-infoForeground', '--color-skeleton', + '--color-accentColor', + '--color-walletSelectItemBackground', + '--color-walletSelectItemBackgroundHover', + '--color-walletSelectItemText', + '--color-connectButtonBackground', + '--color-connectButtonInnerBackground', + '--color-connectButtonText', + '--color-accountActionItemBackground', + '--color-accountActionItemBackgroundHover', + '--color-accountActionItemText', + '--color-accountSelectItemBackground', + '--color-accountSelectItemBackgroundHover', + '--color-accountSelectItemText', + '--color-currentNetworkButtonBackground', + '--color-currentNetworkButtonText', + '--color-networkSelectItemBackground', + '--color-networkSelectItemBackgroundHover', + '--color-networkSelectItemText', + '--color-navigationButtonBackground', + '--color-separatorLine', + '--color-modalBackground', + '--color-modalBackdrop', + '--color-modalBorder', + '--color-modalText', + '--color-modalTextSecondary', + '--color-modalControlButtonBackgroundHover', + '--color-modalControlButtonText', + '--color-success', + '--color-successForeground', + '--color-warning', + '--color-warningForeground', + '--color-error', + '--color-errorForeground', + '--color-info', + '--color-infoForeground', + '--color-skeleton', '--font-body', - '--radius-walletSelectItem', '--radius-connectButton', '--radius-modalControlButton', '--radius-accountActionItem', - '--radius-accountSelectItem', '--radius-currentNetworkButton', '--radius-networkSelectItem', '--radius-modal', '--radius-modalMobile', - '--shadow-button', '--shadow-modal', + '--radius-walletSelectItem', + '--radius-connectButton', + '--radius-modalControlButton', + '--radius-accountActionItem', + '--radius-accountSelectItem', + '--radius-currentNetworkButton', + '--radius-networkSelectItem', + '--radius-modal', + '--radius-modalMobile', + '--shadow-button', + '--shadow-modal', '--blur-modalOverlay', ]; @@ -67,7 +100,6 @@ export const useCSSVariableInjection = (themeInfo: ThemeInfo, themeMode: ThemeMo // Remove data-theme attribute for complete custom themes root.removeAttribute('data-theme'); - } else if (themeInfo.type === 'partial' && themeInfo.partialOverrides) { // Partial override: KEEP data-theme and inject only overridden variables root.setAttribute('data-theme', themeMode); @@ -76,7 +108,7 @@ export const useCSSVariableInjection = (themeInfo: ThemeInfo, themeMode: ThemeMo const hasOverrides = Object.keys(themeInfo.partialOverrides).length > 0; if (hasOverrides) { // Clear all custom variables first - ALL_THEME_VARS.forEach(varName => { + ALL_THEME_VARS.forEach((varName) => { root.style.removeProperty(varName); }); @@ -121,13 +153,12 @@ export const useCSSVariableInjection = (themeInfo: ThemeInfo, themeMode: ThemeMo }); } } - } else { // Default theme: just set data-theme and clear custom variables root.setAttribute('data-theme', themeMode); // Clear any previously injected custom variables - ALL_THEME_VARS.forEach(varName => { + ALL_THEME_VARS.forEach((varName) => { root.style.removeProperty(varName); }); } diff --git a/packages/ui/src/hooks/useConnectButton.ts b/packages/ui/src/hooks/useConnectButton.ts index 6d60e4c..09ebcd2 100644 --- a/packages/ui/src/hooks/useConnectButton.ts +++ b/packages/ui/src/hooks/useConnectButton.ts @@ -1,18 +1,14 @@ import { - useStatus, + ConnectionStatus, useAccount, - useChain, + useActiveConnector, useBalance, - ConnectionStatus, + useChain, useChains, - useActiveConnector, + useStatus, } from '@luno-kit/react'; -import type { Account, Chain, AccountBalance, Connector } from '@luno-kit/react/types' -import { - useConnectModal, - useAccountModal, - useChainModal, -} from '../providers'; +import type { Account, AccountBalance, Chain, Connector } from '@luno-kit/react/types'; +import { useAccountModal, useChainModal, useConnectModal } from '../providers'; export interface UseConnectButtonReturn { connectionStatus: ConnectionStatus; @@ -22,7 +18,6 @@ export interface UseConnectButtonReturn { account?: Account; address?: string; - displayAccount: string; currentChain?: Chain; configuredChains: Chain[]; @@ -48,8 +43,10 @@ export function useConnectButton(): UseConnectButtonReturn { const { account, address } = useAccount(); const { chain: currentChain } = useChain(); const configuredChains = useChains(); - const { data: balance } = useBalance({ address }); - const activeConnector = useActiveConnector() + const { data: balance } = useBalance({ + address: configuredChains.length > 0 ? address : undefined, + }); + const activeConnector = useActiveConnector(); const { open: openConnectModal, isOpen: isConnectModalOpen } = useConnectModal(); const { open: openAccountModal, isOpen: isAccountModalOpen } = useAccountModal(); @@ -57,10 +54,15 @@ export function useConnectButton(): UseConnectButtonReturn { const isConnecting = connectionStatus === ConnectionStatus.Connecting; const isConnected = connectionStatus === ConnectionStatus.Connected; - const isDisconnected = connectionStatus === ConnectionStatus.Disconnected || connectionStatus === ConnectionStatus.Disconnecting; + const isDisconnected = + connectionStatus === ConnectionStatus.Disconnected || + connectionStatus === ConnectionStatus.Disconnecting; - const isChainSupported: boolean = !!currentChain - && configuredChains.some(c => c.genesisHash.toLowerCase() === currentChain.genesisHash.toLowerCase()); + const isChainSupported: boolean = + !!currentChain && + configuredChains.some( + (c) => c.genesisHash.toLowerCase() === currentChain.genesisHash.toLowerCase() + ); return { activeConnector, @@ -76,7 +78,7 @@ export function useConnectButton(): UseConnectButtonReturn { configuredChains, isChainSupported, chainIconUrl: currentChain?.chainIconUrl!, - chainName: currentChain?.name , + chainName: currentChain?.name, balance, diff --git a/packages/ui/src/index.ts b/packages/ui/src/index.ts index 0c1a307..87b8c3f 100644 --- a/packages/ui/src/index.ts +++ b/packages/ui/src/index.ts @@ -1,3 +1,2 @@ -export { ConnectButton } from './components' -export * from './providers' - +export { ConnectButton } from './components'; +export * from './providers'; diff --git a/packages/ui/src/providers/LunoKitProvider.tsx b/packages/ui/src/providers/LunoKitProvider.tsx index 6573494..3125cb9 100644 --- a/packages/ui/src/providers/LunoKitProvider.tsx +++ b/packages/ui/src/providers/LunoKitProvider.tsx @@ -1,13 +1,14 @@ -import React, { ReactNode, useState } from 'react'; import { LunoProvider } from '@luno-kit/react'; -import type { Config as LunoCoreConfig } from '@luno-kit/react/types' +import type { Config as LunoCoreConfig } from '@luno-kit/react/types'; // @ts-ignore - @tanstack/react-query v5 API changes -import { QueryClient, QueryClientProvider, QueryClientConfig } from '@tanstack/react-query'; -import { ModalProvider} from './ModalContext'; +import { QueryClient, type QueryClientConfig, QueryClientProvider } from '@tanstack/react-query'; +import type React from 'react'; +import { type ReactNode, useState } from 'react'; +import { AccountDetailsModal, ChainModal, ConnectModal } from '../components'; +import type { ModalSize } from '../components/Dialog'; +import type { LunokitThemeOverrides, PartialLunokitTheme } from '../theme'; import { ThemeProvider } from '../theme'; -import type { PartialLunokitTheme, LunokitThemeOverrides } from '../theme'; -import { ConnectModal, AccountDetailsModal, ChainModal } from '../components' -import { ModalSize } from '../components/Dialog' +import { ModalProvider } from './ModalContext'; export interface LunoKitProviderProps { children: ReactNode; @@ -29,9 +30,7 @@ export const LunoKitProvider: React.FC = ({ -
- {children} -
+
{children}
@@ -40,9 +39,11 @@ export const LunoKitProvider: React.FC = ({ ); }; - -const RenderModals: React.FC<{modalSize?: ModalSize}> = ({ modalSize }: { modalSize?: ModalSize }) => { - +const RenderModals: React.FC<{ modalSize?: ModalSize }> = ({ + modalSize, +}: { + modalSize?: ModalSize; +}) => { return ( <> @@ -50,4 +51,4 @@ const RenderModals: React.FC<{modalSize?: ModalSize}> = ({ modalSize }: { modalS ); -} +}; diff --git a/packages/ui/src/providers/ModalContext.tsx b/packages/ui/src/providers/ModalContext.tsx index 0dba4fe..ce34260 100644 --- a/packages/ui/src/providers/ModalContext.tsx +++ b/packages/ui/src/providers/ModalContext.tsx @@ -1,5 +1,13 @@ -import React, { createContext, type ReactNode, useCallback, useContext, useEffect, useMemo, useState } from 'react'; -import { ConnectionStatus, useStatus } from '@luno-kit/react' +import { ConnectionStatus, useStatus } from '@luno-kit/react'; +import React, { + createContext, + type ReactNode, + useCallback, + useContext, + useEffect, + useMemo, + useState, +} from 'react'; function useModalVisibility() { const [isOpen, setIsOpen] = useState(false); @@ -31,11 +39,23 @@ interface ModalProviderProps { } export const ModalProvider: React.FC = ({ children }) => { - const { isOpen: isConnectModalOpen, open: openConnectModal, close: closeConnectModal } = useModalVisibility(); - const { isOpen: isAccountModalOpen, open: openAccountModal, close: closeAccountModal } = useModalVisibility(); - const { isOpen: isChainModalOpen, open: openChainModal, close: closeChainModal } = useModalVisibility(); - - const connectionStatus = useStatus() + const { + isOpen: isConnectModalOpen, + open: openConnectModal, + close: closeConnectModal, + } = useModalVisibility(); + const { + isOpen: isAccountModalOpen, + open: openAccountModal, + close: closeAccountModal, + } = useModalVisibility(); + const { + isOpen: isChainModalOpen, + open: openChainModal, + close: closeChainModal, + } = useModalVisibility(); + + const connectionStatus = useStatus(); const closeAllModals = useCallback(() => { closeConnectModal(); @@ -44,38 +64,49 @@ export const ModalProvider: React.FC = ({ children }) => { }, [closeConnectModal, closeAccountModal, closeChainModal]); useEffect(() => { - if (connectionStatus === ConnectionStatus.Disconnected) { closeAccountModal(); closeChainModal(); } + if (connectionStatus === ConnectionStatus.Disconnected) { + closeAccountModal(); + closeChainModal(); + } }, [connectionStatus, closeAccountModal, closeChainModal]); - - const contextValue = useMemo(() => ({ - isConnectModalOpen, - isAccountModalOpen, - isChainModalOpen, - openConnectModal: connectionStatus !== ConnectionStatus.Connected ? openConnectModal : undefined, - closeConnectModal, - openAccountModal: connectionStatus === ConnectionStatus.Connected ? openAccountModal : undefined, - closeAccountModal, - openChainModal: connectionStatus === ConnectionStatus.Connected ? openChainModal: undefined, - closeChainModal, - closeAllModals, - }), [ - isConnectModalOpen, openConnectModal, closeConnectModal, - isAccountModalOpen, openAccountModal, closeAccountModal, - isChainModalOpen, openChainModal, closeChainModal, - closeAllModals, connectionStatus - ]); - - return ( - - {children} - + const contextValue = useMemo( + () => ({ + isConnectModalOpen, + isAccountModalOpen, + isChainModalOpen, + openConnectModal: + connectionStatus !== ConnectionStatus.Connected ? openConnectModal : undefined, + closeConnectModal, + openAccountModal: + connectionStatus === ConnectionStatus.Connected ? openAccountModal : undefined, + closeAccountModal, + openChainModal: connectionStatus === ConnectionStatus.Connected ? openChainModal : undefined, + closeChainModal, + closeAllModals, + }), + [ + isConnectModalOpen, + openConnectModal, + closeConnectModal, + isAccountModalOpen, + openAccountModal, + closeAccountModal, + isChainModalOpen, + openChainModal, + closeChainModal, + closeAllModals, + connectionStatus, + ] ); + + return {children}; }; export const useConnectModal = (): { isOpen: boolean; open?: () => void; close: () => void } => { const context = useContext(ModalContext); - if (!context) throw new Error('[ModalContext]: useConnectModal must be used within a ModalProvider'); + if (!context) + throw new Error('[ModalContext]: useConnectModal must be used within a ModalProvider'); return { isOpen: context.isConnectModalOpen, @@ -86,7 +117,8 @@ export const useConnectModal = (): { isOpen: boolean; open?: () => void; close: export const useAccountModal = (): { isOpen: boolean; open?: () => void; close: () => void } => { const context = useContext(ModalContext); - if (!context) throw new Error('[ModalContext]: useAccountModal must be used within a ModalProvider'); + if (!context) + throw new Error('[ModalContext]: useAccountModal must be used within a ModalProvider'); return { isOpen: context.isAccountModalOpen, open: context.openAccountModal, @@ -96,7 +128,8 @@ export const useAccountModal = (): { isOpen: boolean; open?: () => void; close: export const useChainModal = (): { isOpen: boolean; open?: () => void; close: () => void } => { const context = useContext(ModalContext); - if (!context) throw new Error('[ModalContext]: useChainModal must be used within a ModalProvider'); + if (!context) + throw new Error('[ModalContext]: useChainModal must be used within a ModalProvider'); return { isOpen: context.isChainModalOpen, open: context.openChainModal, @@ -104,8 +137,9 @@ export const useChainModal = (): { isOpen: boolean; open?: () => void; close: () }; }; -export const useCloseAllModals = (): () => void => { +export const useCloseAllModals = (): (() => void) => { const context = useContext(ModalContext); - if (!context) throw new Error('[ModalContext]: useCloseAllModals must be used within a ModalProvider'); + if (!context) + throw new Error('[ModalContext]: useCloseAllModals must be used within a ModalProvider'); return context.closeAllModals; -} +}; diff --git a/packages/ui/src/providers/index.ts b/packages/ui/src/providers/index.ts index 6c4703f..6cb499d 100644 --- a/packages/ui/src/providers/index.ts +++ b/packages/ui/src/providers/index.ts @@ -1,4 +1,4 @@ -export * from './LunoKitProvider' -export { useLunoTheme } from '../theme/context' -export type { LunokitTheme, ThemeMode } from '../theme/types' -export { useCloseAllModals, useChainModal, useConnectModal, useAccountModal } from './ModalContext' +export { useLunoTheme } from '../theme/context'; +export type { LunokitTheme, ThemeMode } from '../theme/types'; +export * from './LunoKitProvider'; +export { useAccountModal, useChainModal, useCloseAllModals, useConnectModal } from './ModalContext'; diff --git a/packages/ui/src/styles/animations.css b/packages/ui/src/styles/animations.css index 346c1cf..0f204ac 100644 --- a/packages/ui/src/styles/animations.css +++ b/packages/ui/src/styles/animations.css @@ -23,13 +23,21 @@ } @keyframes overlay-in { - from { opacity: 0; } - to { opacity: 1; } + from { + opacity: 0; + } + to { + opacity: 1; + } } @keyframes overlay-out { - from { opacity: 1; } - to { opacity: 0; } + from { + opacity: 1; + } + to { + opacity: 0; + } } @keyframes ripple { @@ -44,7 +52,8 @@ } @keyframes ping { - 75%, 100% { + 75%, + 100% { transform: scale(3.2); opacity: 0; } @@ -60,6 +69,10 @@ } @keyframes shimmer { - 0% { background-position: 100% 0; } - 100% { background-position: -100% 0; } + 0% { + background-position: 100% 0; + } + 100% { + background-position: -100% 0; + } } diff --git a/packages/ui/src/styles/base.css b/packages/ui/src/styles/base.css index f9a2eb2..6876a40 100644 --- a/packages/ui/src/styles/base.css +++ b/packages/ui/src/styles/base.css @@ -1,4 +1,4 @@ -@import 'tailwindcss' important; +@import "tailwindcss" important; @theme inline { /* Color utilities */ @@ -103,9 +103,6 @@ /* Default Light Theme Variables */ :root { - - - /* Fonts */ --font-body: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; @@ -121,42 +118,42 @@ --radius-modalMobile: 24px; /* Shadows */ - --shadow-button: 0px 2px 6px rgba(0,0,0,0.1); - --shadow-modal: 0px 4px 16px rgba(0,0,0,0.3); + --shadow-button: 0px 2px 6px rgba(0, 0, 0, 0.1); + --shadow-modal: 0px 4px 16px rgba(0, 0, 0, 0.3); /* Blurs */ --blur-modalOverlay: blur(8px); } [data-theme="light"] { - /* Light Theme Colors */ - --color-accentColor: #3385FF; - --color-walletSelectItemBackground: rgba(0,0,0,0.035); - --color-walletSelectItemBackgroundHover: rgba(0,0,0,0.08); - --color-walletSelectItemText: #211F26; - --color-connectButtonBackground: #F1EFF3; - --color-connectButtonInnerBackground: rgba(0,0,0,0.06); - --color-connectButtonText: #211F26; - --color-accountActionItemBackground: rgba(0,0,0,0.035); - --color-accountActionItemBackgroundHover: rgba(0,0,0,0.08); - --color-accountActionItemText: #211F26; - --color-accountSelectItemBackground: rgba(0,0,0,0.035); - --color-accountSelectItemBackgroundHover: rgba(0,0,0,0.08); - --color-accountSelectItemText: #211F26; - --color-currentNetworkButtonBackground: #FFFFFF; - --color-currentNetworkButtonText: #211F26; - --color-networkSelectItemBackground: rgba(0,0,0,0.035); - --color-networkSelectItemBackgroundHover: rgba(0,0,0,0.08); - --color-networkSelectItemText: #211F26; - --color-navigationButtonBackground: rgba(0,0,0,0.15); + /* Light Theme Colors */ + --color-accentColor: #3385ff; + --color-walletSelectItemBackground: rgba(0, 0, 0, 0.035); + --color-walletSelectItemBackgroundHover: rgba(0, 0, 0, 0.08); + --color-walletSelectItemText: #211f26; + --color-connectButtonBackground: #f1eff3; + --color-connectButtonInnerBackground: rgba(0, 0, 0, 0.06); + --color-connectButtonText: #211f26; + --color-accountActionItemBackground: rgba(0, 0, 0, 0.035); + --color-accountActionItemBackgroundHover: rgba(0, 0, 0, 0.08); + --color-accountActionItemText: #211f26; + --color-accountSelectItemBackground: rgba(0, 0, 0, 0.035); + --color-accountSelectItemBackgroundHover: rgba(0, 0, 0, 0.08); + --color-accountSelectItemText: #211f26; + --color-currentNetworkButtonBackground: #ffffff; + --color-currentNetworkButtonText: #211f26; + --color-networkSelectItemBackground: rgba(0, 0, 0, 0.035); + --color-networkSelectItemBackgroundHover: rgba(0, 0, 0, 0.08); + --color-networkSelectItemText: #211f26; + --color-navigationButtonBackground: rgba(0, 0, 0, 0.15); --color-separatorLine: rgba(0, 0, 0, 0.035); --color-modalBackground: #ffffff; --color-modalBackdrop: rgba(0, 0, 0, 0.3); --color-modalBorder: rgba(0, 0, 0, 0.035); - --color-modalText: #25292E; + --color-modalText: #25292e; --color-modalTextSecondary: rgba(60, 66, 66, 0.5); - --color-modalControlButtonBackgroundHover: rgba(0,0,0,0.08); - --color-modalControlButtonText: #6B7280; + --color-modalControlButtonBackgroundHover: rgba(0, 0, 0, 0.08); + --color-modalControlButtonText: #6b7280; --color-success: #10b981; --color-successForeground: #ffffff; --color-warning: #f59e0b; @@ -165,40 +162,39 @@ --color-errorForeground: #ffffff; --color-info: #3b82f6; --color-infoForeground: #ffffff; - --color-skeleton: rgba(0,0,0,0.08); + --color-skeleton: rgba(0, 0, 0, 0.08); } /* Dark Theme Variables */ [data-theme="dark"] { - /* Dark Theme Colors */ - --color-accentColor: #8A6EAC; - --color-walletSelectItemBackground: rgba(255,255,255,0.035); - --color-walletSelectItemBackgroundHover: rgba(255,255,255,0.09); - --color-walletSelectItemText: #FFFFFF; - --color-connectButtonBackground: #4A4B51; - --color-connectButtonInnerBackground: #3A3B43; - --color-connectButtonText: #FFFFFF; - --color-accountActionItemBackground: rgba(255,255,255,0.035); - --color-accountActionItemBackgroundHover: rgba(255,255,255,0.09); - --color-accountActionItemText: #FFFFFF; - --color-accountSelectItemBackground: rgba(255,255,255,0.035); - --color-accountSelectItemBackgroundHover: rgba(255,255,255,0.09); - --color-accountSelectItemText: #FFFFFF; - --color-currentNetworkButtonBackground: #4A4B51; - --color-currentNetworkButtonText: #FFFFFF; - --color-networkSelectItemBackground: rgba(255,255,255,0.035); - --color-networkSelectItemBackgroundHover: rgba(255,255,255,0.09); - --color-networkSelectItemText: #FFFFFF; - --color-navigationButtonBackground: rgba(255,255,255,0.15); - --color-separatorLine: rgba(74,75,88,0.75); - --color-modalBackground: #3A3B43; + --color-accentColor: #8a6eac; + --color-walletSelectItemBackground: rgba(255, 255, 255, 0.035); + --color-walletSelectItemBackgroundHover: rgba(255, 255, 255, 0.09); + --color-walletSelectItemText: #ffffff; + --color-connectButtonBackground: #4a4b51; + --color-connectButtonInnerBackground: #3a3b43; + --color-connectButtonText: #ffffff; + --color-accountActionItemBackground: rgba(255, 255, 255, 0.035); + --color-accountActionItemBackgroundHover: rgba(255, 255, 255, 0.09); + --color-accountActionItemText: #ffffff; + --color-accountSelectItemBackground: rgba(255, 255, 255, 0.035); + --color-accountSelectItemBackgroundHover: rgba(255, 255, 255, 0.09); + --color-accountSelectItemText: #ffffff; + --color-currentNetworkButtonBackground: #4a4b51; + --color-currentNetworkButtonText: #ffffff; + --color-networkSelectItemBackground: rgba(255, 255, 255, 0.035); + --color-networkSelectItemBackgroundHover: rgba(255, 255, 255, 0.09); + --color-networkSelectItemText: #ffffff; + --color-navigationButtonBackground: rgba(255, 255, 255, 0.15); + --color-separatorLine: rgba(74, 75, 88, 0.75); + --color-modalBackground: #3a3b43; --color-modalBackdrop: rgba(0, 0, 0, 0.6); - --color-modalBorder:rgba(74,75,88,0.75); - --color-modalText: #FFFFFF; - --color-modalTextSecondary: rgba(255,255,255,0.5); - --color-modalControlButtonBackgroundHover: rgba(255,255,255,0.09); - --color-modalControlButtonText: #9CA3AF; + --color-modalBorder: rgba(74, 75, 88, 0.75); + --color-modalText: #ffffff; + --color-modalTextSecondary: rgba(255, 255, 255, 0.5); + --color-modalControlButtonBackgroundHover: rgba(255, 255, 255, 0.09); + --color-modalControlButtonText: #9ca3af; --color-success: #10b981; --color-successForeground: #ffffff; --color-warning: #f59e0b; @@ -207,9 +203,7 @@ --color-errorForeground: #ffffff; --color-info: #3b82f6; --color-infoForeground: #ffffff; - --color-skeleton: rgba(255,255,255,0.09); - - + --color-skeleton: rgba(255, 255, 255, 0.09); /* Radii */ --radius-walletSelectItem: 6px; @@ -255,7 +249,9 @@ } .luno-kit .chain-icon-text { - font-family: ui-rounded, "SF Pro Rounded", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; + font-family: + ui-rounded, "SF Pro Rounded", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, + Arial, sans-serif; font-size: calc(100% * 0.8); line-height: 1; position: absolute; @@ -292,4 +288,3 @@ width: 100%; background-color: var(--color-accentColor); } - diff --git a/packages/ui/src/styles/styles.css b/packages/ui/src/styles/styles.css index 5ea7b02..5fa3d85 100644 --- a/packages/ui/src/styles/styles.css +++ b/packages/ui/src/styles/styles.css @@ -1,3 +1,2 @@ - -@import './animations.css'; -@import './base.css'; +@import "./animations.css"; +@import "./base.css"; diff --git a/packages/ui/src/theme/context.tsx b/packages/ui/src/theme/context.tsx index ddba4d3..fdb0bb7 100644 --- a/packages/ui/src/theme/context.tsx +++ b/packages/ui/src/theme/context.tsx @@ -1,6 +1,15 @@ -import React, { createContext, useState, useContext, ReactNode, useMemo, useCallback, useEffect } from 'react'; -import type { LunokitTheme, LunokitThemeOverrides, PartialLunokitTheme, ThemeMode } from './types'; +import type React from 'react'; +import { + createContext, + type ReactNode, + useCallback, + useContext, + useEffect, + useMemo, + useState, +} from 'react'; import { useCSSVariableInjection } from '../hooks/useCSSVariableInjection'; +import type { LunokitTheme, LunokitThemeOverrides, PartialLunokitTheme, ThemeMode } from './types'; // Theme preference storage interface ThemePreference { @@ -13,8 +22,7 @@ const THEME_STORAGE_KEY = 'luno.lastThemePreference'; const saveThemePreference = (preference: ThemePreference) => { try { localStorage.setItem(THEME_STORAGE_KEY, JSON.stringify(preference)); - } catch (e) { - } + } catch (e) {} }; interface ThemeContextValue { @@ -31,8 +39,16 @@ interface ThemeProviderProps { } // Helper function to check if theme is complete or partial -const isCompleteTheme = (theme: PartialLunokitTheme | LunokitThemeOverrides): theme is LunokitTheme => { - return 'colors' in theme && 'fonts' in theme && 'radii' in theme && 'shadows' in theme && 'blurs' in theme; +const isCompleteTheme = ( + theme: PartialLunokitTheme | LunokitThemeOverrides +): theme is LunokitTheme => { + return ( + 'colors' in theme && + 'fonts' in theme && + 'radii' in theme && + 'shadows' in theme && + 'blurs' in theme + ); }; // Hook to detect system theme @@ -138,7 +154,7 @@ export const ThemeProvider: React.FC = ({ } else if (themeMode === 'dark' && overrides.dark) { partialOverrides = overrides.dark; } else { - partialOverrides = { ...overrides as PartialLunokitTheme } + partialOverrides = { ...(overrides as PartialLunokitTheme) }; } return { type: 'partial' as const, completeTheme: null, partialOverrides }; @@ -153,23 +169,26 @@ export const ThemeProvider: React.FC = ({ useCSSVariableInjection(themeInfo, themeMode); // User explicit choice handler (saves to storage) - const setThemeChoice = useCallback((choice: 'light' | 'dark' | 'auto') => { - const isAuto = choice === 'auto'; - setIsAutoMode(isAuto); - - if (isAuto) { - setThemeMode(systemTheme || 'light'); - } else { - setThemeMode(choice); - } + const setThemeChoice = useCallback( + (choice: 'light' | 'dark' | 'auto') => { + const isAuto = choice === 'auto'; + setIsAutoMode(isAuto); + + if (isAuto) { + setThemeMode(systemTheme || 'light'); + } else { + setThemeMode(choice); + } - const preference: ThemePreference = { - isAuto, - ...(isAuto ? {} : { preferredTheme: choice }) - }; + const preference: ThemePreference = { + isAuto, + ...(isAuto ? {} : { preferredTheme: choice }), + }; - saveThemePreference(preference); - }, [systemTheme]); + saveThemePreference(preference); + }, + [systemTheme] + ); // Only listen to system theme changes for auto mode useEffect(() => { @@ -178,11 +197,14 @@ export const ThemeProvider: React.FC = ({ } }, [systemTheme, isAutoMode]); - const contextValue = useMemo(() => ({ - themeMode, - setThemeChoice, - currentTheme, - }), [themeMode, setThemeChoice, currentTheme]); + const contextValue = useMemo( + () => ({ + themeMode, + setThemeChoice, + currentTheme, + }), + [themeMode, setThemeChoice, currentTheme] + ); return {children}; }; @@ -190,7 +212,9 @@ export const ThemeProvider: React.FC = ({ export const useLunoTheme = (): ThemeContextValue => { const context = useContext(ThemeContext); if (!context) { - throw new Error('useLunoTheme must be used within a ThemeProvider (which is part of LunoKitProvider)'); + throw new Error( + 'useLunoTheme must be used within a ThemeProvider (which is part of LunoKitProvider)' + ); } return context; }; diff --git a/packages/ui/src/theme/index.ts b/packages/ui/src/theme/index.ts index aba9aa0..477d7e8 100644 --- a/packages/ui/src/theme/index.ts +++ b/packages/ui/src/theme/index.ts @@ -1,2 +1,2 @@ +export { ThemeProvider, useLunoTheme } from './context'; export * from './types'; -export { ThemeProvider, useLunoTheme } from './context'; \ No newline at end of file diff --git a/packages/ui/src/theme/types.ts b/packages/ui/src/theme/types.ts index 54879cd..a28c158 100644 --- a/packages/ui/src/theme/types.ts +++ b/packages/ui/src/theme/types.ts @@ -89,8 +89,8 @@ export type PartialLunokitTheme = { // Simplified theme configuration supporting partial overrides export interface LunokitThemeOverrides { // Theme behavior control - autoMode?: boolean; // Whether to auto-follow system theme (default: false) - defaultMode?: ThemeMode; // Default theme mode when not auto (default: 'light') + autoMode?: boolean; // Whether to auto-follow system theme (default: false) + defaultMode?: ThemeMode; // Default theme mode when not auto (default: 'light') // Complete custom theme (overrides both light and dark) theme?: LunokitTheme; diff --git a/packages/ui/src/utils/cs.ts b/packages/ui/src/utils/cs.ts index 85138ea..bd37944 100644 --- a/packages/ui/src/utils/cs.ts +++ b/packages/ui/src/utils/cs.ts @@ -4,14 +4,9 @@ import { extendTailwindMerge } from 'tailwind-merge'; const customTwMerge = extendTailwindMerge({ extend: { classGroups: { - 'font-size': [ - 'text-xs', - 'text-sm', - 'text-base', - 'text-lg' - ] - } - } + 'font-size': ['text-xs', 'text-sm', 'text-base', 'text-lg'], + }, + }, }); export function cs(...inputs: ClassValue[]) { diff --git a/packages/ui/src/utils/index.ts b/packages/ui/src/utils/index.ts index 1cfb03e..d14cf74 100644 --- a/packages/ui/src/utils/index.ts +++ b/packages/ui/src/utils/index.ts @@ -1,2 +1,2 @@ -export * from './cs' -export * from './debounce' +export * from './cs'; +export * from './debounce'; diff --git a/packages/ui/tsconfig.json b/packages/ui/tsconfig.json index bf9f331..4d5eb18 100644 --- a/packages/ui/tsconfig.json +++ b/packages/ui/tsconfig.json @@ -9,12 +9,10 @@ "jsx": "react-jsx", "lib": ["DOM", "DOM.Iterable", "ESNext"], "module": "ESNext", - "moduleResolution": "bundler", + "moduleResolution": "bundler" }, "include": ["src/**/*"], - "references": [ - { "path": "../react" } - ], + "references": [{ "path": "../react" }], "exclude": ["node_modules", "dist"], "composite": true } diff --git a/packages/ui/tsup.config.ts b/packages/ui/tsup.config.ts index 68fbbb8..15894cf 100644 --- a/packages/ui/tsup.config.ts +++ b/packages/ui/tsup.config.ts @@ -1,6 +1,6 @@ import { defineConfig } from 'tsup'; -export default defineConfig((options) => ( { +export default defineConfig((options) => ({ entry: ['src/index.ts'], banner: { js: "'use client'", @@ -11,12 +11,7 @@ export default defineConfig((options) => ( { sourcemap: true, clean: !options.watch, minify: !options.watch, - external: [ - 'react', - 'react-dom', - '@luno-kit/react', - '@tanstack/react-query', - ], + external: ['react', 'react-dom', '@luno-kit/react', '@tanstack/react-query'], tsconfig: './tsconfig.json', loader: { '.ttf': 'file', diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3d196ef..f1950a6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7,11 +7,14 @@ settings: catalogs: default: '@dedot/chaintypes': - specifier: 0.123.0 - version: 0.123.0 + specifier: 0.152.0 + version: 0.152.0 '@tanstack/react-query': specifier: 5.81.5 version: 5.81.5 + '@types/node': + specifier: 20.19.0 + version: 20.19.0 '@types/react': specifier: 18.2.55 version: 18.2.55 @@ -19,8 +22,8 @@ catalogs: specifier: 18.2.19 version: 18.2.19 dedot: - specifier: 0.14.1 - version: 0.14.1 + specifier: 0.16.0 + version: 0.16.0 react: specifier: 18.2.0 version: 18.2.0 @@ -35,6 +38,9 @@ importers: .: devDependencies: + '@biomejs/biome': + specifier: 2.2.4 + version: 2.2.4 '@changesets/cli': specifier: ^2.29.2 version: 2.29.5 @@ -100,7 +106,7 @@ importers: version: 18.2.0(react@18.2.0) react-scripts: specifier: 5.0.1 - version: 5.0.1(@babel/plugin-syntax-flow@7.27.1(@babel/core@7.27.7))(@babel/plugin-transform-react-jsx@7.27.1(@babel/core@7.27.7))(@types/babel__core@7.20.5)(react@18.2.0)(type-fest@0.21.3)(typescript@4.9.5) + version: 5.0.1(@babel/plugin-syntax-flow@7.27.1(@babel/core@7.28.4))(@babel/plugin-transform-react-jsx@7.27.1(@babel/core@7.28.4))(@types/babel__core@7.20.5)(react@18.2.0)(type-fest@4.41.0)(typescript@4.9.5) typescript: specifier: 4.9.5 version: 4.9.5 @@ -143,7 +149,7 @@ importers: version: 18.2.19 tailwindcss: specifier: ^4 - version: 4.1.11 + version: 4.1.12 typescript: specifier: ^5 version: 5.8.3 @@ -183,7 +189,7 @@ importers: version: 18.2.19 tailwindcss: specifier: ^4 - version: 4.1.11 + version: 4.1.12 typescript: specifier: ^5 version: 5.8.3 @@ -214,7 +220,7 @@ importers: devDependencies: '@eslint/js': specifier: ^9.25.0 - version: 9.30.0 + version: 9.35.0 '@types/react': specifier: 'catalog:' version: 18.2.55 @@ -226,56 +232,117 @@ importers: version: 4.6.0(vite@6.3.5(@types/node@22.15.21)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.0)) eslint: specifier: ^9.25.0 - version: 9.30.0(jiti@2.4.2) + version: 9.35.0(jiti@2.4.2) eslint-plugin-react-hooks: specifier: ^5.2.0 - version: 5.2.0(eslint@9.30.0(jiti@2.4.2)) + version: 5.2.0(eslint@9.35.0(jiti@2.4.2)) eslint-plugin-react-refresh: specifier: ^0.4.19 - version: 0.4.20(eslint@9.30.0(jiti@2.4.2)) + version: 0.4.20(eslint@9.35.0(jiti@2.4.2)) globals: specifier: ^16.0.0 - version: 16.2.0 + version: 16.3.0 typescript: specifier: ~5.8.3 version: 5.8.3 typescript-eslint: specifier: ^8.30.1 - version: 8.35.0(eslint@9.30.0(jiti@2.4.2))(typescript@5.8.3) + version: 8.43.0(eslint@9.35.0(jiti@2.4.2))(typescript@5.8.3) vite: specifier: ^6.3.5 version: 6.3.5(@types/node@22.15.21)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.0) + examples/with-vite-papi: + dependencies: + '@luno-kit/react': + specifier: workspace:* + version: link:../../packages/react + '@luno-kit/ui': + specifier: workspace:* + version: link:../../packages/ui + '@polkadot-api/descriptors': + specifier: file:.papi/descriptors + version: file:examples/with-vite-papi/.papi/descriptors(polkadot-api@1.9.1(jiti@2.4.2)(postcss@8.5.6)(rxjs@7.8.2)(yaml@2.8.0)) + '@tanstack/react-query': + specifier: 'catalog:' + version: 5.81.5(react@18.2.0) + polkadot-api: + specifier: 1.9.1 + version: 1.9.1(jiti@2.4.2)(postcss@8.5.6)(rxjs@7.8.2)(yaml@2.8.0) + react: + specifier: 'catalog:' + version: 18.2.0 + react-dom: + specifier: 'catalog:' + version: 18.2.0(react@18.2.0) + devDependencies: + '@eslint/js': + specifier: ^9.33.0 + version: 9.35.0 + '@types/react': + specifier: 'catalog:' + version: 18.2.55 + '@types/react-dom': + specifier: 'catalog:' + version: 18.2.19 + '@vitejs/plugin-react': + specifier: ^5.0.0 + version: 5.0.2(vite@7.1.4(@types/node@22.15.21)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.0)) + eslint: + specifier: ^9.33.0 + version: 9.35.0(jiti@2.4.2) + eslint-plugin-react-hooks: + specifier: ^5.2.0 + version: 5.2.0(eslint@9.35.0(jiti@2.4.2)) + eslint-plugin-react-refresh: + specifier: ^0.4.20 + version: 0.4.20(eslint@9.35.0(jiti@2.4.2)) + globals: + specifier: ^16.3.0 + version: 16.3.0 + typescript: + specifier: ~5.8.3 + version: 5.8.3 + typescript-eslint: + specifier: ^8.39.1 + version: 8.43.0(eslint@9.35.0(jiti@2.4.2))(typescript@5.8.3) + vite: + specifier: ^7.1.2 + version: 7.1.4(@types/node@22.15.21)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.0) + packages/core: dependencies: '@dedot/chaintypes': specifier: 'catalog:' - version: 0.123.0(dedot@0.14.1) + version: 0.152.0(dedot@0.16.0) '@mimirdev/apps-inject': specifier: 3.2.0 version: 3.2.0 + '@polkadot-api/pjs-signer': + specifier: 0.6.14 + version: 0.6.14 '@walletconnect/universal-provider': specifier: 2.21.4 version: 2.21.4(typescript@5.8.3) dedot: specifier: 'catalog:' - version: 0.14.1 + version: 0.16.0 eventemitter3: specifier: 5.0.1 version: 5.0.1 devDependencies: + '@dedot/types': + specifier: 0.16.0 + version: 0.16.0 '@types/node': - specifier: ^18.19.86 - version: 18.19.113 + specifier: 'catalog:' + version: 20.19.0 '@vitest/coverage-v8': specifier: 3.2.4 - version: 3.2.4(vitest@3.2.4(@types/node@18.19.113)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.0)) + version: 3.2.4(vitest@3.2.4(@types/node@20.19.0)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.0)) '@walletconnect/types': specifier: 2.21.5 version: 2.21.5 - eslint: - specifier: ^8.56.0 - version: 8.57.1 tsup: specifier: 'catalog:' version: 8.5.0(jiti@2.4.2)(postcss@8.5.6)(typescript@5.8.3)(yaml@2.8.0) @@ -284,19 +351,19 @@ importers: version: 5.8.3 vitest: specifier: ^3.2.4 - version: 3.2.4(@types/node@18.19.113)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.0) + version: 3.2.4(@types/node@20.19.0)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.0) packages/react: dependencies: '@dedot/chaintypes': specifier: 'catalog:' - version: 0.123.0(dedot@0.14.1) + version: 0.152.0(dedot@0.16.0) '@luno-kit/core': specifier: workspace:* version: link:../core dedot: specifier: 'catalog:' - version: 0.14.1 + version: 0.16.0 zustand: specifier: 5.0.4 version: 5.0.4(@types/react@18.2.55)(immer@9.0.21)(react@18.2.0) @@ -317,8 +384,8 @@ importers: specifier: ^14.6.1 version: 14.6.1(@testing-library/dom@10.4.0) '@types/node': - specifier: ^18.11.18 - version: 18.19.113 + specifier: 'catalog:' + version: 20.19.0 '@types/react': specifier: 'catalog:' version: 18.2.55 @@ -327,10 +394,7 @@ importers: version: 18.2.19 '@vitest/coverage-v8': specifier: ^3.2.4 - version: 3.2.4(vitest@3.2.4(@types/node@18.19.113)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.0)) - eslint: - specifier: ^8.56.0 - version: 8.57.1 + version: 3.2.4(vitest@3.2.4(@types/node@20.19.0)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.0)) jsdom: specifier: ^26.1.0 version: 26.1.0 @@ -348,13 +412,13 @@ importers: version: 5.8.3 vitest: specifier: ^3.2.4 - version: 3.2.4(@types/node@18.19.113)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.0) + version: 3.2.4(@types/node@20.19.0)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.0) packages/ui: dependencies: '@radix-ui/react-dialog': specifier: ^1.0.5 - version: 1.1.14(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 1.1.15(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) clsx: specifier: ^2.1.0 version: 2.1.1 @@ -409,7 +473,7 @@ importers: version: 8.6.14(prettier@3.6.2) tailwindcss: specifier: ^4.1.7 - version: 4.1.11 + version: 4.1.12 tsup: specifier: 'catalog:' version: 8.5.0(jiti@2.4.2)(postcss@8.5.6)(typescript@5.8.3)(yaml@2.8.0) @@ -461,6 +525,10 @@ packages: resolution: {integrity: sha512-BU2f9tlKQ5CAthiMIgpzAh4eDTLWo1mqi9jqE2OxMG0E/OM199VJt2q8BztTxpnSW0i1ymdwLXRJnYzvDM5r2w==} engines: {node: '>=6.9.0'} + '@babel/core@7.28.4': + resolution: {integrity: sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==} + engines: {node: '>=6.9.0'} + '@babel/eslint-parser@7.28.0': resolution: {integrity: sha512-N4ntErOlKvcbTt01rr5wj3y55xnIdx1ymrfIr8C2WnM1Y9glFgWaGDEULJIazOX3XM9NRzhfJ6zZnQ1sBNWU+w==} engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0} @@ -476,6 +544,10 @@ packages: resolution: {integrity: sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg==} engines: {node: '>=6.9.0'} + '@babel/generator@7.28.3': + resolution: {integrity: sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==} + engines: {node: '>=6.9.0'} + '@babel/helper-annotate-as-pure@7.27.3': resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} engines: {node: '>=6.9.0'} @@ -519,6 +591,12 @@ packages: peerDependencies: '@babel/core': ^7.0.0 + '@babel/helper-module-transforms@7.28.3': + resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + '@babel/helper-optimise-call-expression@7.27.1': resolution: {integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==} engines: {node: '>=6.9.0'} @@ -563,6 +641,10 @@ packages: resolution: {integrity: sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==} engines: {node: '>=6.9.0'} + '@babel/helpers@7.28.4': + resolution: {integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==} + engines: {node: '>=6.9.0'} + '@babel/parser@7.27.7': resolution: {integrity: sha512-qnzXzDXdr/po3bOTbTIQZ7+TxNKxpkN5IifVLXS+r7qwynkZfPyjZfE7hCXbo7IoO9TNcSyibgONsf2HauUd3Q==} engines: {node: '>=6.0.0'} @@ -573,6 +655,11 @@ packages: engines: {node: '>=6.0.0'} hasBin: true + '@babel/parser@7.28.4': + resolution: {integrity: sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==} + engines: {node: '>=6.0.0'} + hasBin: true + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.27.1': resolution: {integrity: sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA==} engines: {node: '>=6.9.0'} @@ -1177,6 +1264,10 @@ packages: resolution: {integrity: sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==} engines: {node: '>=6.9.0'} + '@babel/traverse@7.28.4': + resolution: {integrity: sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==} + engines: {node: '>=6.9.0'} + '@babel/types@7.27.7': resolution: {integrity: sha512-8OLQgDScAOHXnAz2cV+RfzzNMipuLVBz2biuAJFMV9bfkNf393je3VM8CLkjQodW5+iWsSJdSgSWT6rsZoXHPw==} engines: {node: '>=6.9.0'} @@ -1185,6 +1276,10 @@ packages: resolution: {integrity: sha512-x0LvFTekgSX+83TI28Y9wYPUfzrnl2aT5+5QLnO6v7mSJYtEEevuDRN0F0uSHRk1G1IWZC43o00Y0xDDrpBGPQ==} engines: {node: '>=6.9.0'} + '@babel/types@7.28.4': + resolution: {integrity: sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==} + engines: {node: '>=6.9.0'} + '@bcoe/v8-coverage@0.2.3': resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} @@ -1192,6 +1287,59 @@ packages: resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} engines: {node: '>=18'} + '@biomejs/biome@2.2.4': + resolution: {integrity: sha512-TBHU5bUy/Ok6m8c0y3pZiuO/BZoY/OcGxoLlrfQof5s8ISVwbVBdFINPQZyFfKwil8XibYWb7JMwnT8wT4WVPg==} + engines: {node: '>=14.21.3'} + hasBin: true + + '@biomejs/cli-darwin-arm64@2.2.4': + resolution: {integrity: sha512-RJe2uiyaloN4hne4d2+qVj3d3gFJFbmrr5PYtkkjei1O9c+BjGXgpUPVbi8Pl8syumhzJjFsSIYkcLt2VlVLMA==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [darwin] + + '@biomejs/cli-darwin-x64@2.2.4': + resolution: {integrity: sha512-cFsdB4ePanVWfTnPVaUX+yr8qV8ifxjBKMkZwN7gKb20qXPxd/PmwqUH8mY5wnM9+U0QwM76CxFyBRJhC9tQwg==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [darwin] + + '@biomejs/cli-linux-arm64-musl@2.2.4': + resolution: {integrity: sha512-7TNPkMQEWfjvJDaZRSkDCPT/2r5ESFPKx+TEev+I2BXDGIjfCZk2+b88FOhnJNHtksbOZv8ZWnxrA5gyTYhSsQ==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [linux] + + '@biomejs/cli-linux-arm64@2.2.4': + resolution: {integrity: sha512-M/Iz48p4NAzMXOuH+tsn5BvG/Jb07KOMTdSVwJpicmhN309BeEyRyQX+n1XDF0JVSlu28+hiTQ2L4rZPvu7nMw==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [linux] + + '@biomejs/cli-linux-x64-musl@2.2.4': + resolution: {integrity: sha512-m41nFDS0ksXK2gwXL6W6yZTYPMH0LughqbsxInSKetoH6morVj43szqKx79Iudkp8WRT5SxSh7qVb8KCUiewGg==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [linux] + + '@biomejs/cli-linux-x64@2.2.4': + resolution: {integrity: sha512-orr3nnf2Dpb2ssl6aihQtvcKtLySLta4E2UcXdp7+RTa7mfJjBgIsbS0B9GC8gVu0hjOu021aU8b3/I1tn+pVQ==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [linux] + + '@biomejs/cli-win32-arm64@2.2.4': + resolution: {integrity: sha512-NXnfTeKHDFUWfxAefa57DiGmu9VyKi0cDqFpdI+1hJWQjGJhJutHPX0b5m+eXvTKOaf+brU+P0JrQAZMb5yYaQ==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [win32] + + '@biomejs/cli-win32-x64@2.2.4': + resolution: {integrity: sha512-3Y4V4zVRarVh/B/eSHczR4LYoSVyv3Dfuvm3cWs5w/HScccS0+Wt/lHOcDTRYeHjQmMYVC3rIRWqyN2EI52+zg==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [win32] + '@changesets/apply-release-plan@7.0.12': resolution: {integrity: sha512-EaET7As5CeuhTzvXTQCRZeBUcisoYPDDcXvgTE/2jmmypKp0RC7LxKj/yzqeh/1qFTZI7oDGFcL1PHRuQuketQ==} @@ -1247,6 +1395,11 @@ packages: '@changesets/write@0.4.0': resolution: {integrity: sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==} + '@commander-js/extra-typings@13.1.0': + resolution: {integrity: sha512-q5P52BYb1hwVWE6dtID7VvuJWrlfbCv4klj7BjUUOqMz4jbSZD4C9fJ9lRjL2jnBGTg+gDDlaXN51rkWcLk4fg==} + peerDependencies: + commander: ~13.1.0 + '@csstools/color-helpers@5.0.2': resolution: {integrity: sha512-JqWH1vsgdGcw2RR6VliXXdA0/59LttzlU8UlRT/iUUsEeWfYq8I+K0yhihEUTTHLRm1EXvpsCx3083EU15ecsA==} engines: {node: '>=18'} @@ -1368,62 +1521,62 @@ packages: peerDependencies: postcss-selector-parser: ^6.0.10 - '@dedot/api@0.14.1': - resolution: {integrity: sha512-uqyJ1k+JljOX+42PGmJI+73hsFt/i4LeiqFwb0lXv2UPcKVxqXT8wZ9BnLtqyDZ6o5sNyQhXuhvk7uZ+PWEUUg==} + '@dedot/api@0.16.0': + resolution: {integrity: sha512-8n/LwKURoker/Xc1doHNs8HdJLKIIk05/KGL7tvQyTxs5jChQD7doR3hCyj7VRPm0nQtXqVF9PHrXPHo8R08AQ==} engines: {node: '>=18'} - '@dedot/chaintypes@0.123.0': - resolution: {integrity: sha512-mIzSVzq58idlyG9yrNg/q87qKU24do7KKAE45izYk9HUImXx0rxkBXBCWGrnAWQfnLTnMQ7iHbcSnEgn2/rt0Q==} + '@dedot/chaintypes@0.152.0': + resolution: {integrity: sha512-YM8hnk+hw/7DSNZs3paP8cGgdGS4hmrTbE1luxd9ijHkX9XUTuMQY0+3GI/s1fIU81hvkL0umxoxQwJbuGMy9A==} peerDependencies: - dedot: '>=0.7.1' + dedot: '>=0.16.0' - '@dedot/cli@0.14.1': - resolution: {integrity: sha512-TJlBgB7qu0trPZyjKV0HbaZzBYhUSvypuxLxOFjV9anz+HJEg/jSx23eEQNM4tt79NKH6GH5vlEIflHdjNlMww==} + '@dedot/cli@0.16.0': + resolution: {integrity: sha512-4iUca7pzK2jYZRSWTmqGhread2xwykS1HGD7ywizriFOCQJdYOQrFJUR1bGPV1fYSYTw2vCmtBF8Bl9K2cZG3w==} engines: {node: '>=18'} hasBin: true - '@dedot/codecs@0.14.1': - resolution: {integrity: sha512-HqJUJ2sg9WsdQUqaE3eqAbWO6NNK3FbemdL5u95uBkqtDPeTUc383QVgXIO9+XcYyrbpQW3fZXx2h9+hnq5rGw==} + '@dedot/codecs@0.16.0': + resolution: {integrity: sha512-YpF+8XDFXygsO8w8J7cRMfH/C0iaiEAEeLNOixgppQH6eeBu9epaeiyOvDhO4/5XN4AO5OVvuLKVpWDyD7D+rA==} engines: {node: '>=18'} - '@dedot/codegen@0.14.1': - resolution: {integrity: sha512-GkCy2YLmOF15A4DhFlR3IaTYmxkENZ/vlbz41RFnqWZhEUt3eF2Wv7hCqAWQMgoQDahBvLmqWQSBdrtAlQ6BdQ==} + '@dedot/codegen@0.16.0': + resolution: {integrity: sha512-xu5BPpKOvIzqO5plvVPY5n9oZYcDrz6dPe5gIJCrndxy5l95RNx8gl7Pz3RN69YPgOmIkeGsqpwhG+/pyqq5wg==} engines: {node: '>=18'} - '@dedot/contracts@0.14.1': - resolution: {integrity: sha512-CO+wgMJcQzu7w7S7DOGgbaKnozXBHSqiWHZufL/lr6jHy6Y5yuXENhusBaTDdpy4uXBdMWvHaaxxB1CDndPEYw==} + '@dedot/contracts@0.16.0': + resolution: {integrity: sha512-qdbX9Ix9rOLw/hONWBhTYVFcCZTdoLNRNRvVWGrrPs1y7jseeLRa+A6/Fqvg/X+2LTPeveatrayR1g92JqMiGA==} engines: {node: '>=18'} - '@dedot/merkleized-metadata@0.14.1': - resolution: {integrity: sha512-zzLepkXOBJbsG73T1UmUtUigp6YFOfeio0mqKRvCTDj5aX8OkS9hvgWM0OSd0EzzbehoSe0uXKHOyIvSBjzS/Q==} + '@dedot/merkleized-metadata@0.16.0': + resolution: {integrity: sha512-kSJyfnbxBhsMLk57PkfXbw6oXbSyYnOAvP/TkRx5CgZ5VHTM620i95F6SztJbKgFN2oYh3pREEBsTcLlgfylvw==} engines: {node: '>=18'} - '@dedot/providers@0.14.1': - resolution: {integrity: sha512-oIRvCESyoeokbbe18REznYHOd/bK6sg5/i+r4OrFW6dqdbKk9s54rrTxza/uAKkaO0RUdl69rSx5vWSLkhp8VA==} + '@dedot/providers@0.16.0': + resolution: {integrity: sha512-KQvpmsEotojjqumNM5CHhm0KlsBMZeYiq3zBzkTgbUa/pkEPmbPvg+TnA/iwMFwA4yl9mM2wA8H+klOmTJgDQQ==} engines: {node: '>=18'} - '@dedot/runtime-specs@0.14.1': - resolution: {integrity: sha512-ii8xAuToJjN7BzhLAwU7RBZIBsuglorNl7M0dqNPa7fjlIvlAmPGzd0oYtCePtlUkixzAdNVLSqrNZUaLUGLsw==} + '@dedot/runtime-specs@0.16.0': + resolution: {integrity: sha512-gr+62U7dUL+BhAMRAeaC1VrWLuPa8WsObwadeOpyuPBZ8LMNPVjAt4pG7dxIJ/MXVO8mTRDie4E65TKv0PaWiQ==} engines: {node: '>=18'} - '@dedot/shape@0.14.1': - resolution: {integrity: sha512-YD81n44Fd4sBAyXkSQySIgWgji6stIghjE4WNYAix38hCpqpj6B4ryywQHzz4f42E5m4QJbPeMbUeSrWI9VbTw==} + '@dedot/shape@0.16.0': + resolution: {integrity: sha512-lcrtDo1aOfig4eBxks3/VSKSSWSt/DxL/jaVNHQzUoNiJPIJtJBj+3dwtIRuqxPQ4eQccxU8y/DqXiFOz3OuCQ==} engines: {node: '>=18'} - '@dedot/smoldot@0.14.1': - resolution: {integrity: sha512-QZzPalgNIiiAvBJCNxwHvgZXwVvGisfUdqSfNBmLtrNmEbxlC8xu1kK2Ik6O6lDrweBwISxcOzANt6wAQmotCw==} + '@dedot/smoldot@0.16.0': + resolution: {integrity: sha512-PPXntk7gug5rWkcZJUje9us4yePqjFVw8N1U4cyafRLv6+vvd3X0xo/+l8HubmmgkLYfmmzyMYgKWPEFROIEkw==} engines: {node: '>=18'} - '@dedot/storage@0.14.1': - resolution: {integrity: sha512-zBF9WTSKyI8PJ0u+/DMgNgmvUz+RhqZV/xXHb6fpcLZGfe5193gBRhIIDwioCBHlzd03ski3YBd+2q8hN64ArA==} + '@dedot/storage@0.16.0': + resolution: {integrity: sha512-o2wUbx3TQK4vVTkvmCK0IsTaya/++bmPfYVIdu48tr4efOjdCwZWJ0ZSBCSfYiW/5SVSzGLZIt1/bH1h6uZhvQ==} engines: {node: '>=18'} - '@dedot/types@0.14.1': - resolution: {integrity: sha512-mJY8zfb34LDPdAU/OOxGikxt8mW9eORLajveLB2d0OtTsS2iN34iZqCcBoZWuGqarlPZGVYAGCyACX8Vuhyalg==} + '@dedot/types@0.16.0': + resolution: {integrity: sha512-AS8K17RqVTTtgVPCBrQVYx8+HQm6nYcD0tJ1ARfcnJ5l+sFNTytWyod8Iv4sbYE7xuv92DqzN3vKouN2k0nzLQ==} engines: {node: '>=18'} - '@dedot/utils@0.14.1': - resolution: {integrity: sha512-ixlTHCTjBOQl4Kkkwg8AL5zoGhNgbBN599kfthLHUYPaCheP8yg12C+DCWnC9EC6ii1sfUa8Q913a+oexDTQCw==} + '@dedot/utils@0.16.0': + resolution: {integrity: sha512-MDj0L6mI00NlLcnB+mW5ZUdrWm8f+Kv6Qe5UQGVvX7Zdfsc+E5BK8rW4lfXl05IocPOChvSv1KZ554V5KCDVLw==} engines: {node: '>=18'} '@emnapi/runtime@1.4.5': @@ -1585,6 +1738,12 @@ packages: peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + '@eslint-community/eslint-utils@4.9.0': + resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + '@eslint-community/regexpp@4.12.1': resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} @@ -1593,16 +1752,12 @@ packages: resolution: {integrity: sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/config-helpers@0.3.0': - resolution: {integrity: sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/core@0.14.0': - resolution: {integrity: sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==} + '@eslint/config-helpers@0.3.1': + resolution: {integrity: sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/core@0.15.1': - resolution: {integrity: sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA==} + '@eslint/core@0.15.2': + resolution: {integrity: sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/eslintrc@2.1.4': @@ -1617,16 +1772,16 @@ packages: resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@eslint/js@9.30.0': - resolution: {integrity: sha512-Wzw3wQwPvc9sHM+NjakWTcPx11mbZyiYHuwWa/QfZ7cIRX7WK54PSk7bdyXDaoaopUcMatv1zaQvOAAO8hCdww==} + '@eslint/js@9.35.0': + resolution: {integrity: sha512-30iXE9whjlILfWobBkNerJo+TXYsgVM5ERQwMcMKCHckHflCmf7wXDAHlARoWnh0s1U72WqlbeyE7iAcCzuCPw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/object-schema@2.1.6': resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/plugin-kit@0.3.3': - resolution: {integrity: sha512-1+WqvgNMhmlAambTvT3KPtCl/Ibr68VldY2XY40SL1CE0ZXiakFR/cbTspaF5HsnpDMvcYYoJHfl4980NBjGag==} + '@eslint/plugin-kit@0.3.5': + resolution: {integrity: sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@ethereumjs/rlp@10.0.0': @@ -1878,6 +2033,9 @@ packages: resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} engines: {node: '>=6.0.0'} + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} @@ -1995,6 +2153,10 @@ packages: resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} engines: {node: ^14.21.3 || >=16} + '@noble/hashes@2.0.0': + resolution: {integrity: sha512-h8VUBlE8R42+XIDO229cgisD287im3kdY6nbNZJFjc6ZvKIXPYXe6Vc/t+kyjFdMFyt5JpapzTsEg8n63w5/lw==} + engines: {node: '>= 20.19.0'} + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -2119,39 +2281,128 @@ packages: webpack-plugin-serve: optional: true + '@polkadot-api/cli@0.11.0': + resolution: {integrity: sha512-ygOwpjoE54rZ6zE3n6gXFzWoFz9XegQIXKyBc4tV6fjxALiuNAtg/p1x60rXl1iEh0+jrBd+xpxvj2rUbSmejA==} + hasBin: true + + '@polkadot-api/codegen@0.13.0': + resolution: {integrity: sha512-VU0juJz7TWohFa/tUqOSUdauGlGBJT562+POFerz1/DdXeJ4P1U7BKGM+s57PJlN8D6cHfIv1uoPvuuwnfazgg==} + + '@polkadot-api/descriptors@file:examples/with-vite-papi/.papi/descriptors': + resolution: {directory: examples/with-vite-papi/.papi/descriptors, type: directory} + peerDependencies: + polkadot-api: '*' + + '@polkadot-api/ink-contracts@0.2.5': + resolution: {integrity: sha512-EqEub18L8IB1Z/QwnAe9Kn3MeRbM9y0gUpbMUg71v0pQVqBPlumA+oboItNTjLBKzd77QcJUr6bKqHr9rA1Utw==} + + '@polkadot-api/json-rpc-provider-proxy@0.2.4': + resolution: {integrity: sha512-nuGoY9QpBAiRU7xmXN3nugFvPcnSu3IxTLm1OWcNTGlZ1LW5bvdQHz3JLk56+Jlyb3GJ971hqdg2DJsMXkKCOg==} + + '@polkadot-api/json-rpc-provider@0.0.4': + resolution: {integrity: sha512-9cDijLIxzHOBuq6yHqpqjJ9jBmXrctjc1OFqU+tQrS96adQze3mTIH6DTgfb/0LMrqxzxffz1HQGrIlEH00WrA==} + + '@polkadot-api/known-chains@0.7.0': + resolution: {integrity: sha512-hKkxFG8bR4gy5K1GK4HrTLLpJVLu2IJDQHY9Ezz9RbL8QFffwg4BIGDI6JXdKBFnCDnHE8oN6xhd6aUiLIppQw==} + + '@polkadot-api/logs-provider@0.0.6': + resolution: {integrity: sha512-4WgHlvy+xee1ADaaVf6+MlK/+jGMtsMgAzvbQOJZnP4PfQuagoTqaeayk8HYKxXGphogLlPbD06tANxcb+nvAg==} + + '@polkadot-api/metadata-builders@0.10.1': + resolution: {integrity: sha512-0GQFph1vT0wWTfijM7eO+JICR7hwqJeVmil1P29uLjScBI4IH7gX032nOuNz/SG1Qlu0CtDFasFWVeazuPJ0pw==} + + '@polkadot-api/metadata-builders@0.13.4': + resolution: {integrity: sha512-z98MN+sGTObq75bsZwtl83BGn3JwMgLLShVMV5cByAF89WEVe9Yufolyob+IOp8Y490uL8rMzJZigjDSFKCtyA==} + + '@polkadot-api/metadata-compatibility@0.1.15': + resolution: {integrity: sha512-voOXicr3S/l/5bkNb8hCmTWpfXLOg6iGYulguMJgCI+xGBooJBx7twtVogaNJTzXfrIZtEbxrD+tUsKScIN6iw==} + + '@polkadot-api/observable-client@0.8.0': + resolution: {integrity: sha512-n7k79RPyVL/sc22+AzIEioZM4vQO9mp+spkW7s+7M0WLvxpAJ6OR0YNt5/MYPggZGKUTIgH4iWPsLNYNtAJ4MA==} + peerDependencies: + '@polkadot-api/substrate-client': 0.3.0 + rxjs: '>=7.8.0' + + '@polkadot-api/pjs-signer@0.6.14': + resolution: {integrity: sha512-HKzNUAykwZ4SS2SxpwfkqDzLM8zcW5yAOjVwOrl0Ko6NK3BNPyDR7LhGqfaUrQtIhgxo+XQ0e7aMo5IkS8ac+A==} + + '@polkadot-api/pjs-signer@0.6.4': + resolution: {integrity: sha512-dXln8Par3I5dIX1xw59a8ovpsBj346ZKxsW9/uF9Cm9IQB2QffG3N0jctBUGHYZ+8dHRPug117o/xZCzqOAibw==} + + '@polkadot-api/polkadot-sdk-compat@2.3.1': + resolution: {integrity: sha512-rb8IWmPRhKWD9NG4zh2n4q0HlEAvq+Cv1CbD+8YxH0XAqIIiFA+ch5JeDCIxQYngkn/43B0Gs7Gtzh18yv2yoA==} + + '@polkadot-api/polkadot-signer@0.1.6': + resolution: {integrity: sha512-X7ghAa4r7doETtjAPTb50IpfGtrBmy3BJM5WCfNKa1saK04VFY9w+vDn+hwEcM4p0PcDHt66Ts74hzvHq54d9A==} + + '@polkadot-api/signer@0.1.14': + resolution: {integrity: sha512-AwAnu6THwwKIe93PLZlER7pdD4x68SCWoIX1Lnb857axgGgLWZgpLVbkneTa+lTej/dqs7R3fhsEuXZX2dR+hg==} + + '@polkadot-api/signers-common@0.1.15': + resolution: {integrity: sha512-zuueX0+brIwPCqs+L77QUyGmK83mDjjfaEYJGLi90DXHA0g+1oxtMzlKKCWvM+RDkvz8+VUspiWQWhVnZap6yw==} + + '@polkadot-api/signers-common@0.1.5': + resolution: {integrity: sha512-lmVH3S+Au8q7gRgAnHFbrHBm/5V7hB9xqwftt7SfmCOnl8N093IUKMANXRrD05jcQ+91hjAykU97xOV0W5zdhw==} + + '@polkadot-api/sm-provider@0.1.7': + resolution: {integrity: sha512-BhNKVeIFZdawpPVadXszLl8IP4EDjcLHe/GchfRRFkvoNFuwS2nNv/npYIqCviXV+dd2R8VnEELxwScsf380Og==} + peerDependencies: + '@polkadot-api/smoldot': '>=0.3' + + '@polkadot-api/smoldot@0.3.8': + resolution: {integrity: sha512-dbJSMRFtELDW+rZIWRwKE/K8oy7+gYaGl+DvaOjARoBW2n80rJ7RAMOCCu+b5h2zgl3elftFBwMNAuAWgHT/Zg==} + + '@polkadot-api/substrate-bindings@0.11.0': + resolution: {integrity: sha512-UGCa0xYtfcS/5LJAcro1vhIwxF31fsF5f42mzro9G85T854cbXPzqABDICYmJqdF72tBRMrnJlx6okGtLx9TKA==} + + '@polkadot-api/substrate-bindings@0.16.2': + resolution: {integrity: sha512-7YjFIXwQ4mwa1fOX9y300Pyh0+nvp3jFq0bMYDxXgM3kuNS9D45dO+o5NwTmd2nFAdNrc5Aufc5g6e/xitGDeA==} + + '@polkadot-api/substrate-client@0.3.0': + resolution: {integrity: sha512-0hEvQLKH2zhaFzE8DPkWehvJilec8u2O2wbIEUStm0OJ8jIFtJ40MFjXQfB01dXBWUz1KaVBqS6xd3sZA90Dpw==} + + '@polkadot-api/utils@0.1.2': + resolution: {integrity: sha512-yhs5k2a8N1SBJcz7EthZoazzLQUkZxbf+0271Xzu42C5AEM9K9uFLbsB+ojzHEM72O5X8lPtSwGKNmS7WQyDyg==} + + '@polkadot-api/utils@0.2.0': + resolution: {integrity: sha512-nY3i5fQJoAxU4n3bD7Fs208/KR2J95SGfVc58kDjbRYN5a84kWaGEqzjBNtP9oqht49POM8Bm9mbIrkvC1Bzuw==} + '@polkadot-api/wasm-executor@0.1.2': resolution: {integrity: sha512-a5wGenltB3EFPdf72u8ewi6HsUg2qubUAf3ekJprZf24lTK3+w8a/GUF/y6r08LJF35MALZ32SAtLqtVTIOGnQ==} - '@polkadot/types-support@16.2.2': - resolution: {integrity: sha512-C/oEOXEMNML05VDDKBYknoR+pX3cvtqXK8gL3tV4htbCAI5YDa/GSg289cC+QK0ymzTO6ezE/8bQkycISMBTVw==} + '@polkadot-api/ws-provider@0.3.6': + resolution: {integrity: sha512-D2+rvcDc9smt24qUKqFoCuKKNhyBVDQEtnsqHiUN/Ym8UGP+Acegac3b9VOig70EpCcRBoYeXY2gEog2ybx1Kg==} + + '@polkadot/types-support@16.4.6': + resolution: {integrity: sha512-e83H4MzamzNzxZdxf104xqzsl1YUCF24i2pw19I/6zPVxpt6a9zn4+7VzSVMclaztxxSTITCLbks7/9dLiNhEw==} engines: {node: '>=18'} - '@polkadot/util@13.5.2': - resolution: {integrity: sha512-GcUzHnyp5q6+LMvoqi+5MA8br4c5XuDPqAUpAaTR/YCSL+e1/QAIswX1rRBp446rUmXeAxHbaL6LYYI/CUV0Bw==} + '@polkadot/util@13.5.6': + resolution: {integrity: sha512-V+CkW2VdhcMWvl7eXdmlCLGqLxrKvXZtXE76KBbPP5n0Z+8DqQ58IHNOE9xe2LOgqDwIzdLlOUwkyF9Zj19y+Q==} engines: {node: '>=18'} - '@polkadot/x-bigint@13.5.2': - resolution: {integrity: sha512-BgMtPLTth/5ChdaYJZ+53MVbH80kSz46Pz2nmmZBmoocrvZ++JMP6fBQTfRBVuWkWOK/fy8vsQ46Kk3EHKHh/g==} + '@polkadot/x-bigint@13.5.6': + resolution: {integrity: sha512-HpqZJ9ud94iK/+0Ofacw7QdtvzFp6SucBBml4XwWZTWoLaLOGDsO7FoWE7yCuwPbX8nLgIM6YmQBeUoZmBtVqQ==} engines: {node: '>=18'} - '@polkadot/x-global@13.5.2': - resolution: {integrity: sha512-i5zbd200BWqlmZT5I8SrtAwLmtwysua7znmQPLP31l6P462awN23TGhnd1J53CC4kibQRDLIBIsOHnjgMb7B9g==} + '@polkadot/x-global@13.5.6': + resolution: {integrity: sha512-iw97n0Bnl2284WgAK732LYR4DW6w5+COfBfHzkhiHqs5xwPEwWMgWGrf2hM8WAQqNIz6Ni8w/jagucPyQBur3Q==} engines: {node: '>=18'} - '@polkadot/x-textdecoder@13.5.2': - resolution: {integrity: sha512-EcObuElCE71GVn9kB1Q7mdluFBC7UAti3whDo62o2YYjsXTouoBQV6d3DvQRi3n+oq5MwnPJs7/1f3aqIXcEJQ==} + '@polkadot/x-textdecoder@13.5.6': + resolution: {integrity: sha512-jTGeYCxFh89KRrP7bNj1CPqKO36Onsi0iA6A+5YtRS5wjdQU+/OFM/EHLTP2nvkvZo/tOkOewMR9sausisUvVQ==} engines: {node: '>=18'} - '@polkadot/x-textencoder@13.5.2': - resolution: {integrity: sha512-mLOuI/ycuQJfvUynbavr91OmyE4aeZ+Jsh/LO21QiT0IVxO3tbVksTJHntOd3QSppQfkadIkJby9/MWOCeVmKQ==} + '@polkadot/x-textencoder@13.5.6': + resolution: {integrity: sha512-iVwz9+OrYCEF9QbNfr9M206mmWvY/AhDmGPfAIeTR4fRgKGVYqcP8RIF8iu/x0MVQWqiVO3vlhlUk7MfrmAnoQ==} engines: {node: '>=18'} - '@polkadot/x-ws@13.5.2': - resolution: {integrity: sha512-tsnk6k+UVyMB82g195SgJE735WHd1/Wlhip28P+jYi9ebi6zi7T8ZNqsNT/aHxcbcdyZ454WQ4s9c+t7RoHhAA==} + '@polkadot/x-ws@13.5.6': + resolution: {integrity: sha512-247ktVp/iE57NTXjFpHaoPoDcvoEPb8+16r2Eq0IBQ2umOV7P6KmxvdNx5eFUvRsgXvBpNwUXE1WVnXjK/eDtA==} engines: {node: '>=18'} - '@radix-ui/primitive@1.1.2': - resolution: {integrity: sha512-XnbHrrprsNqZKQhStrSwgRUQzoCI1glLzdw79xiZPoofhGICeZRSQ3dIxAKH1gb3OHfNf4d6f+vAv3kil2eggA==} + '@radix-ui/primitive@1.1.3': + resolution: {integrity: sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==} '@radix-ui/react-compose-refs@1.1.2': resolution: {integrity: sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==} @@ -2171,8 +2422,8 @@ packages: '@types/react': optional: true - '@radix-ui/react-dialog@1.1.14': - resolution: {integrity: sha512-+CpweKjqpzTmwRwcYECQcNYbI8V9VSQt0SNFKeEBLgfucbsLssU6Ppq7wUdNXEGb573bMjFhVjKVll8rmV6zMw==} + '@radix-ui/react-dialog@1.1.15': + resolution: {integrity: sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -2184,8 +2435,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-dismissable-layer@1.1.10': - resolution: {integrity: sha512-IM1zzRV4W3HtVgftdQiiOmA0AdJlCtMLe00FXaHwgt3rAnNsIyDqshvkIW3hj/iu5hu8ERP7KIYki6NkqDxAwQ==} + '@radix-ui/react-dismissable-layer@1.1.11': + resolution: {integrity: sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -2197,8 +2448,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-focus-guards@1.1.2': - resolution: {integrity: sha512-fyjAACV62oPV925xFCrH8DR5xWhg9KYtJT4s3u54jxp+L/hbpTY2kIeEFFbFe+a/HCE94zGQMZLIpVTPVZDhaA==} + '@radix-ui/react-focus-guards@1.1.3': + resolution: {integrity: sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==} peerDependencies: '@types/react': '*' react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc @@ -2241,8 +2492,8 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-presence@1.1.4': - resolution: {integrity: sha512-ueDqRbdc4/bkaQT3GIpLQssRlFgWaL/U2z/S31qRwwLWoxHLgry3SIfCwhxeQNbirEUXFa+lq3RL3oBYXtcmIA==} + '@radix-ui/react-presence@1.1.5': + resolution: {integrity: sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==} peerDependencies: '@types/react': '*' '@types/react-dom': '*' @@ -2324,6 +2575,9 @@ packages: '@rolldown/pluginutils@1.0.0-beta.19': resolution: {integrity: sha512-3FL3mnMbPu0muGOCaKAhhFEYmqv9eTfPSJRJmANrCwtgK8VuxpsZDGK+m0LYAGoyO8+0j5uRe4PeyPDK1yA/hA==} + '@rolldown/pluginutils@1.0.0-beta.34': + resolution: {integrity: sha512-LyAREkZHP5pMom7c24meKmJCdhf2hEyvam2q0unr3or9ydwDL+DJ8chTF6Av/RFPb3rH8UFBdMzO5MxTZW97oA==} + '@rollup/plugin-babel@5.3.1': resolution: {integrity: sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==} engines: {node: '>= 10.0.0'} @@ -2458,18 +2712,33 @@ packages: '@rushstack/eslint-patch@1.12.0': resolution: {integrity: sha512-5EwMtOqvJMMa3HbmxLlF74e+3/HhwBTMcvt3nqVJgGCozO6hzIPOBlwm8mGVNR9SN2IJpxSnlxczyDjcn7qIyw==} + '@rx-state/core@0.1.4': + resolution: {integrity: sha512-Z+3hjU2xh1HisLxt+W5hlYX/eGSDaXXP+ns82gq/PLZpkXLu0uwcNUh9RLY3Clq4zT+hSsA3vcpIGt6+UAb8rQ==} + peerDependencies: + rxjs: '>=7' + '@scure/base@1.2.6': resolution: {integrity: sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg==} + '@scure/base@2.0.0': + resolution: {integrity: sha512-3E1kpuZginKkek01ovG8krQ0Z44E3DHPjc5S2rjJw9lZn3KSQOs8S7wqikF/AH7iRanHypj85uGyxk0XAyC37w==} + '@scure/bip32@1.7.0': resolution: {integrity: sha512-E4FFX/N3f4B80AKWp5dP6ow+flD1LQZo/w8UnLGYZO674jS6YnYeepycOOksv+vLPSpgN35wgKgy+ybfTb2SMw==} '@scure/bip39@1.6.0': resolution: {integrity: sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A==} + '@sec-ant/readable-stream@0.4.1': + resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} + '@sinclair/typebox@0.24.51': resolution: {integrity: sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==} + '@sindresorhus/merge-streams@4.0.0': + resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} + engines: {node: '>=18'} + '@sinonjs/commons@1.8.6': resolution: {integrity: sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==} @@ -2491,6 +2760,7 @@ packages: '@stagewise/toolbar@0.5.1': resolution: {integrity: sha512-4B7g5fuFAs30Di0J9Lb1rt7uSWx/WcnXB+WGlyB7VbVhBEqkpnKPlytDl+yQIgnrHobcfwr0BTmzmmAXb/kc8A==} + deprecated: 'This package is deprecated and has been replaced by the stagewise CLI. Get started with the CLI here: https://stagewise.io/docs' '@storybook/core@8.6.14': resolution: {integrity: sha512-1P/w4FSNRqP8j3JQBOi3yGt8PVOgSRbP66Ok520T78eJBeqx9ukCfl912PQZ7SPbW3TIunBwLXMZOjZwBB/JmA==} @@ -2897,8 +3167,8 @@ packages: '@types/node@16.18.126': resolution: {integrity: sha512-OTcgaiwfGFBKacvfwuHzzn1KLxH/er8mluiy8/uM3sGXHaRe73RrSIj01jow9t4kJEW633Ov+cOexXeiApTyAw==} - '@types/node@18.19.113': - resolution: {integrity: sha512-TmSTE9vyebJ9vSEiU+P+0Sp4F5tMgjiEOZaQUW6wA3ODvi6uBgkHQ+EsIu0pbiKvf9QHEvyRCiaz03rV0b+IaA==} + '@types/node@20.19.0': + resolution: {integrity: sha512-hfrc+1tud1xcdVTABC2JiomZJEklMcXYNTVtZLAeqTVWD+qL5jkHKT+1lOtqDdGxt+mB53DTtiz673vfjU8D1Q==} '@types/node@20.19.9': resolution: {integrity: sha512-cuVNgarYWZqxRJDQHEB58GEONhOK79QVR/qYx4S7kcUObQvUwvFnYxJuuHUKm2aieN9X3yZB4LZsuYNU1Qphsw==} @@ -2906,6 +3176,9 @@ packages: '@types/node@22.15.21': resolution: {integrity: sha512-EV/37Td6c+MgKAbkcLG6vqZ2zEYHD7bvSrzqqs2RIhbA6w3x+Dqz8MZM3sP6kGTeLrdoOgKZe+Xja7tUB2DNkQ==} + '@types/normalize-package-data@2.4.4': + resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} + '@types/parse-json@4.0.2': resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} @@ -2991,13 +3264,13 @@ packages: typescript: optional: true - '@typescript-eslint/eslint-plugin@8.35.0': - resolution: {integrity: sha512-ijItUYaiWuce0N1SoSMrEd0b6b6lYkYt99pqCPfybd+HKVXtEvYhICfLdwp42MhiI5mp0oq7PKEL+g1cNiz/Eg==} + '@typescript-eslint/eslint-plugin@8.43.0': + resolution: {integrity: sha512-8tg+gt7ENL7KewsKMKDHXR1vm8tt9eMxjJBYINf6swonlWgkYn5NwyIgXpbbDxTNU5DgpDFfj95prcTq2clIQQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.35.0 + '@typescript-eslint/parser': ^8.43.0 eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.9.0' + typescript: '>=4.8.4 <6.0.0' '@typescript-eslint/experimental-utils@5.62.0': resolution: {integrity: sha512-RTXpeB3eMkpoclG3ZHft6vG/Z30azNHuqY6wKPBHlVMZFuEvrtlEDe8gMqDb+SO+9hjC/pLekeSCryf9vMZlCw==} @@ -3015,32 +3288,32 @@ packages: typescript: optional: true - '@typescript-eslint/parser@8.35.0': - resolution: {integrity: sha512-6sMvZePQrnZH2/cJkwRpkT7DxoAWh+g6+GFRK6bV3YQo7ogi3SX5rgF6099r5Q53Ma5qeT7LGmOmuIutF4t3lA==} + '@typescript-eslint/parser@8.43.0': + resolution: {integrity: sha512-B7RIQiTsCBBmY+yW4+ILd6mF5h1FUwJsVvpqkrgpszYifetQ2Ke+Z4u6aZh0CblkUGIdR59iYVyXqqZGkZ3aBw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.9.0' + typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/project-service@8.35.0': - resolution: {integrity: sha512-41xatqRwWZuhUMF/aZm2fcUsOFKNcG28xqRSS6ZVr9BVJtGExosLAm5A1OxTjRMagx8nJqva+P5zNIGt8RIgbQ==} + '@typescript-eslint/project-service@8.43.0': + resolution: {integrity: sha512-htB/+D/BIGoNTQYffZw4uM4NzzuolCoaA/BusuSIcC8YjmBYQioew5VUZAYdAETPjeed0hqCaW7EHg+Robq8uw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: '>=4.8.4 <5.9.0' + typescript: '>=4.8.4 <6.0.0' '@typescript-eslint/scope-manager@5.62.0': resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@typescript-eslint/scope-manager@8.35.0': - resolution: {integrity: sha512-+AgL5+mcoLxl1vGjwNfiWq5fLDZM1TmTPYs2UkyHfFhgERxBbqHlNjRzhThJqz+ktBqTChRYY6zwbMwy0591AA==} + '@typescript-eslint/scope-manager@8.43.0': + resolution: {integrity: sha512-daSWlQ87ZhsjrbMLvpuuMAt3y4ba57AuvadcR7f3nl8eS3BjRc8L9VLxFLk92RL5xdXOg6IQ+qKjjqNEimGuAg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.35.0': - resolution: {integrity: sha512-04k/7247kZzFraweuEirmvUj+W3bJLI9fX6fbo1Qm2YykuBvEhRTPl8tcxlYO8kZZW+HIXfkZNoasVb8EV4jpA==} + '@typescript-eslint/tsconfig-utils@8.43.0': + resolution: {integrity: sha512-ALC2prjZcj2YqqL5X/bwWQmHA2em6/94GcbB/KKu5SX3EBDOsqztmmX1kMkvAJHzxk7TazKzJfFiEIagNV3qEA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: '>=4.8.4 <5.9.0' + typescript: '>=4.8.4 <6.0.0' '@typescript-eslint/type-utils@5.62.0': resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} @@ -3052,19 +3325,19 @@ packages: typescript: optional: true - '@typescript-eslint/type-utils@8.35.0': - resolution: {integrity: sha512-ceNNttjfmSEoM9PW87bWLDEIaLAyR+E6BoYJQ5PfaDau37UGca9Nyq3lBk8Bw2ad0AKvYabz6wxc7DMTO2jnNA==} + '@typescript-eslint/type-utils@8.43.0': + resolution: {integrity: sha512-qaH1uLBpBuBBuRf8c1mLJ6swOfzCXryhKND04Igr4pckzSEW9JX5Aw9AgW00kwfjWJF0kk0ps9ExKTfvXfw4Qg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.9.0' + typescript: '>=4.8.4 <6.0.0' '@typescript-eslint/types@5.62.0': resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@typescript-eslint/types@8.35.0': - resolution: {integrity: sha512-0mYH3emanku0vHw2aRLNGqe7EXh9WHEhi7kZzscrMDf6IIRUQ5Jk4wp1QrledE/36KtdZrVfKnE32eZCf/vaVQ==} + '@typescript-eslint/types@8.43.0': + resolution: {integrity: sha512-vQ2FZaxJpydjSZJKiSW/LJsabFFvV7KgLC5DiLhkBcykhQj8iK9BOaDmQt74nnKdLvceM5xmhaTF+pLekrxEkw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typescript-eslint/typescript-estree@5.62.0': @@ -3076,11 +3349,11 @@ packages: typescript: optional: true - '@typescript-eslint/typescript-estree@8.35.0': - resolution: {integrity: sha512-F+BhnaBemgu1Qf8oHrxyw14wq6vbL8xwWKKMwTMwYIRmFFY/1n/9T/jpbobZL8vp7QyEUcC6xGrnAO4ua8Kp7w==} + '@typescript-eslint/typescript-estree@8.43.0': + resolution: {integrity: sha512-7Vv6zlAhPb+cvEpP06WXXy/ZByph9iL6BQRBDj4kmBsW98AqEeQHlj/13X+sZOrKSo9/rNKH4Ul4f6EICREFdw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: '>=4.8.4 <5.9.0' + typescript: '>=4.8.4 <6.0.0' '@typescript-eslint/utils@5.62.0': resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} @@ -3088,19 +3361,19 @@ packages: peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - '@typescript-eslint/utils@8.35.0': - resolution: {integrity: sha512-nqoMu7WWM7ki5tPgLVsmPM8CkqtoPUG6xXGeefM5t4x3XumOEKMoUZPdi+7F+/EotukN4R9OWdmDxN80fqoZeg==} + '@typescript-eslint/utils@8.43.0': + resolution: {integrity: sha512-S1/tEmkUeeswxd0GGcnwuVQPFWo8NzZTOMxCvw8BX7OMxnNae+i8Tm7REQen/SwUIPoPqfKn7EaZ+YLpiB3k9g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.9.0' + typescript: '>=4.8.4 <6.0.0' '@typescript-eslint/visitor-keys@5.62.0': resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@typescript-eslint/visitor-keys@8.35.0': - resolution: {integrity: sha512-zTh2+1Y8ZpmeQaQVIc/ZZxsx8UzgKJyNg1PTvjzC7WMhPSVS8bfDX34k1SrwOf016qd5RU3az2UxUNue3IfQ5g==} + '@typescript-eslint/visitor-keys@8.43.0': + resolution: {integrity: sha512-T+S1KqRD4sg/bHfLwrpF/K3gQLBM1n7Rp7OjjikjTEssI2YJzQpi5WXoynOaQ93ERIuq3O8RBTOUYDKszUCEHw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@ungap/structured-clone@1.3.0': @@ -3112,6 +3385,12 @@ packages: peerDependencies: vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0 + '@vitejs/plugin-react@5.0.2': + resolution: {integrity: sha512-tmyFgixPZCx2+e6VO9TNITWcCQl8+Nl/E8YbAyPVv85QCc7/A3JrdfG2A8gIzvVhWuzMOVrFW1aReaNxrI6tbw==} + engines: {node: ^20.19.0 || >=22.12.0} + peerDependencies: + vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 + '@vitest/coverage-v8@3.2.4': resolution: {integrity: sha512-EyF9SXU6kS5Ku/U82E259WSnvg6c8KTjppUncuNdm5QHpe17mwREHnjDzozC8x9MZ0xfBUFSaLkRv4TMA75ALQ==} peerDependencies: @@ -3847,6 +4126,10 @@ packages: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} + commander@13.1.0: + resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} + engines: {node: '>=18'} + commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} @@ -4194,8 +4477,8 @@ packages: dedent@0.7.0: resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} - dedot@0.14.1: - resolution: {integrity: sha512-18W4ZDrjRM+vA3Go5UaJPMdW7jhvBi2oDpeOnm3taV/aCWGOhMng4lGQi75fwO8B/YZsPtSTT8ddXd8c0K83yQ==} + dedot@0.16.0: + resolution: {integrity: sha512-hxoDIucd+J/qX4IlUJzEAkbG51I6Ut+O3UDoV6E7Milf0vtc+e2wpoEF9fXCHmFbwQNZqxSfuRWnz4F//fiPNQ==} engines: {node: '>=18'} hasBin: true @@ -4206,6 +4489,10 @@ packages: deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + deepmerge-ts@7.1.5: + resolution: {integrity: sha512-HOJkrhaYsweh+W+e74Yn7YStZOilkoPb6fycpwNLKzSPtruFs48nYis0zy5yJz1+ktUhHxoRDJ27RQAWLIJVJw==} + engines: {node: '>=16.0.0'} + deepmerge@4.3.1: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} @@ -4262,6 +4549,10 @@ packages: resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} engines: {node: '>=8'} + detect-indent@7.0.1: + resolution: {integrity: sha512-Mc7QhQ8s+cLrnUfU/Ji94vG/r8M26m8f++vyres4ZoojaRDpZ1eSIh/EpzLNwlWuvzSZ3UbDFspjFvTDXe6e/g==} + engines: {node: '>=12.20'} + detect-libc@1.0.3: resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} engines: {node: '>=0.10'} @@ -4666,8 +4957,8 @@ packages: deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. hasBin: true - eslint@9.30.0: - resolution: {integrity: sha512-iN/SiPxmQu6EVkf+m1qpBxzUhE12YqFLOSySuOyVLJLEF9nzTf+h/1AJYc1JWzCnktggeNrjvQGLngDzXirU6g==} + eslint@9.35.0: + resolution: {integrity: sha512-QePbBFMJFjgmlE+cXAlbHZbHpdFVS2E/6vzCy7aKlebddvl1vadiC4JFV5u/wqTkNUwEV8WrQi257jf5f06hrg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -4738,6 +5029,10 @@ packages: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} + execa@9.6.0: + resolution: {integrity: sha512-jpWzZ1ZhwUmeWRhS7Qv3mhpOhLfwI+uAX4e5fOcXqwMR7EcJ0pj2kV1CVzHVMX/LphnKWD3LObjZCoJ71lKpHw==} + engines: {node: ^18.19.0 || >=20.5.0} + exit@0.1.2: resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} engines: {node: '>= 0.8.0'} @@ -4799,6 +5094,19 @@ packages: picomatch: optional: true + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + figures@6.1.0: + resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==} + engines: {node: '>=18'} + file-entry-cache@6.0.1: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} @@ -4927,6 +5235,9 @@ packages: fs-monkey@1.1.0: resolution: {integrity: sha512-QMUezzXWII9EV5aTFXW1UBVUO77wYPpjqIF8/AviUCThNeSYZykpoTixUeaNNBwmCev0AMDWMAni+f8Hxb1IFw==} + fs.promises.exists@1.1.4: + resolution: {integrity: sha512-lJzUGWbZn8vhGWBedA+RYjB/BeJ+3458ljUfmplqhIeb6ewzTFWNPCR1HCiYCkXV9zxcHz9zXkJzMsEgDLzh3Q==} + fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} @@ -4980,6 +5291,10 @@ packages: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} + get-stream@9.0.1: + resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==} + engines: {node: '>=18'} + get-symbol-description@1.1.0: resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} engines: {node: '>= 0.4'} @@ -5028,8 +5343,8 @@ packages: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} - globals@16.2.0: - resolution: {integrity: sha512-O+7l9tPdHCU320IigZZPj5zmRCFG9xHmx9cU8FqU2Rp+JN714seHV+2S9+JslCpY4gJwU2vOGox0wzgae/MCEg==} + globals@16.3.0: + resolution: {integrity: sha512-bqWEnJ1Nt3neqx2q5SFfGS8r/ahumIakg3HcwtNlrVlwXIeNumWn/c7Pn/wKzGhf6SaW6H6uWXLqC30STCMchQ==} engines: {node: '>=18'} globalthis@1.0.4: @@ -5107,6 +5422,10 @@ packages: resolution: {integrity: sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==} engines: {node: '>= 6.0.0'} + hosted-git-info@7.0.2: + resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==} + engines: {node: ^16.14.0 || >=18.0.0} + hpack.js@2.1.6: resolution: {integrity: sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==} @@ -5195,6 +5514,10 @@ packages: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} + human-signals@8.0.1: + resolution: {integrity: sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==} + engines: {node: '>=18.18.0'} + iconv-lite@0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} @@ -5247,6 +5570,10 @@ packages: resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} engines: {node: '>=8'} + index-to-position@1.1.0: + resolution: {integrity: sha512-XPdx9Dq4t9Qk1mTMbWONJqU7boCoumEH7fRET37HX5+khDUl3J2W6PdALxhILYlIYx2amlwYcRPp28p0tSiojg==} + engines: {node: '>=18'} + inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. @@ -5385,6 +5712,10 @@ packages: resolution: {integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==} engines: {node: '>=10'} + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + is-potential-custom-element-name@1.0.1: resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} @@ -5412,6 +5743,10 @@ packages: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} + is-stream@4.0.1: + resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} + engines: {node: '>=18'} + is-string@1.1.1: resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} engines: {node: '>= 0.4'} @@ -6195,6 +6530,10 @@ packages: node-releases@2.0.19: resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + normalize-package-data@6.0.2: + resolution: {integrity: sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==} + engines: {node: ^16.14.0 || >=18.0.0} + normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} @@ -6211,6 +6550,10 @@ packages: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} engines: {node: '>=8'} + npm-run-path@6.0.0: + resolution: {integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==} + engines: {node: '>=18'} + nth-check@1.0.2: resolution: {integrity: sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==} @@ -6376,6 +6719,14 @@ packages: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} + parse-json@8.3.0: + resolution: {integrity: sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==} + engines: {node: '>=18'} + + parse-ms@4.0.0: + resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} + engines: {node: '>=18'} + parse5@6.0.1: resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} @@ -6405,6 +6756,10 @@ packages: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} + path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} @@ -6443,6 +6798,10 @@ packages: resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} engines: {node: '>=12'} + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} + pify@2.3.0: resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} engines: {node: '>=0.10.0'} @@ -6476,6 +6835,12 @@ packages: resolution: {integrity: sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==} engines: {node: '>=8'} + polkadot-api@1.9.1: + resolution: {integrity: sha512-m+ZxAg+NJDb3B3N1gR5Mzqc/HmxtUbtvEmFtUtuwNqkp8YftUGxmWQY8ocdokteBdEMc66WRJJKfHoXaLs1t5g==} + hasBin: true + peerDependencies: + rxjs: '>=7.8.0' + possible-typed-array-names@1.1.0: resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} engines: {node: '>= 0.4'} @@ -6965,6 +7330,10 @@ packages: resolution: {integrity: sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==} engines: {node: ^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0} + pretty-ms@9.2.0: + resolution: {integrity: sha512-4yf0QO/sllf/1zbZWYnvWw3NxCQwLXKzIj0G849LSufP15BXKM0rbD2Z3wVnkMfjdn/CB0Dpp444gYAACdsplg==} + engines: {node: '>=18'} + process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} @@ -7136,6 +7505,10 @@ packages: read-cache@1.0.0: resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + read-pkg@9.0.1: + resolution: {integrity: sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA==} + engines: {node: '>=18'} + read-yaml-file@1.1.0: resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} engines: {node: '>=6'} @@ -7358,6 +7731,9 @@ packages: resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} engines: {node: '>=v12.22.7'} + scale-ts@1.6.1: + resolution: {integrity: sha512-PBMc2AWc6wSEqJYBDPcyCLUj9/tMKnLX70jLOSndMtcUoLQucP/DM0vnQo1wJAYjTrQiq8iG9rD0q6wFzgjH7g==} + scheduler@0.23.2: resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} @@ -7485,8 +7861,11 @@ packages: resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} engines: {node: '>=12'} - smoldot@2.0.36: - resolution: {integrity: sha512-0GtHgxOs1VGs+WzpUgTQ52Zg92/q4mnIPEl+smArI4pis6aduQ6ZiXRllbDafsIb18wWYsxaBLNjBkNOB8xBrw==} + smoldot@2.0.34: + resolution: {integrity: sha512-mw9tCbGEhEp0koMqLL0jBEixVY1MIN/xI3pE6ZY1TuOPU+LnYy8FloODVyzkvzQPaBYrETXJdRlmA/+k6g3gow==} + + smoldot@2.0.38: + resolution: {integrity: sha512-t9JurRhBkxST/z5sjjmQB8JMaAC5ydRZBZ7a62nSHJF+CRE6IO4JadGxFhxUPTvoDvdLOelzfNu4v09bAOA/6w==} snake-case@3.0.4: resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} @@ -7497,6 +7876,10 @@ packages: sonic-boom@2.8.0: resolution: {integrity: sha512-kuonw1YOYYNOve5iHdSahXPOK49GqwA+LZhI6Wz/l0rP57iKyXXIHaRagOBHAPmGwJC6od2Z9zgvZ5loSgMlVg==} + sort-keys@5.1.0: + resolution: {integrity: sha512-aSbHV0DaBcr7u0PVHXzM6NbZNAtrr9sF6+Qfs9UUVG7Ll3jQ6hHi8F/xqIIcn2rvIVbr0v/2zyjSdwSV47AgLQ==} + engines: {node: '>=12'} + source-list-map@2.0.1: resolution: {integrity: sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==} @@ -7536,6 +7919,18 @@ packages: spawndamnit@3.0.1: resolution: {integrity: sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==} + spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + + spdx-exceptions@2.5.0: + resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} + + spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + + spdx-license-ids@3.0.22: + resolution: {integrity: sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==} + spdy-transport@3.0.0: resolution: {integrity: sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==} @@ -7686,6 +8081,10 @@ packages: resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} engines: {node: '>=6'} + strip-final-newline@4.0.0: + resolution: {integrity: sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==} + engines: {node: '>=18'} + strip-indent@3.0.0: resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} engines: {node: '>=8'} @@ -7780,6 +8179,9 @@ packages: tailwindcss@4.1.11: resolution: {integrity: sha512-2E9TBm6MDD/xKYe+dvJZAmg3yxIEDNRc0jwlNyDg/4Fil2QcSLjFKGVff0lAf1jjeaArlG/M75Ey/EYr/OJtBA==} + tailwindcss@4.1.12: + resolution: {integrity: sha512-DzFtxOi+7NsFf7DBtI3BJsynR+0Yp6etH+nRPTbpWnS2pZBaSksv/JGctNwSWzbFjp0vxSqknaUylseZqMDGrA==} + tapable@1.1.3: resolution: {integrity: sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==} engines: {node: '>=6'} @@ -7941,6 +8343,12 @@ packages: ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + tsc-prog@2.3.0: + resolution: {integrity: sha512-ycET2d75EgcX7y8EmG4KiZkLAwUzbY4xRhA6NU0uVbHkY4ZjrAAuzTMxXI85kOwATqPnBI5C/7y7rlpY0xdqHA==} + engines: {node: '>=12'} + peerDependencies: + typescript: '>=4' + tsconfig-paths@3.15.0: resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} @@ -7999,6 +8407,10 @@ packages: resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} engines: {node: '>=10'} + type-fest@4.41.0: + resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} + engines: {node: '>=16'} + type-is@1.6.18: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} @@ -8022,12 +8434,12 @@ packages: typedarray-to-buffer@3.1.5: resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} - typescript-eslint@8.35.0: - resolution: {integrity: sha512-uEnz70b7kBz6eg/j0Czy6K5NivaYopgxRjsnAJ2Fx5oTLo3wefTHIbL7AkQr1+7tJCRVpTs/wiM8JR/11Loq9A==} + typescript-eslint@8.43.0: + resolution: {integrity: sha512-FyRGJKUGvcFekRRcBKFBlAhnp4Ng8rhe8tuvvkR9OiU0gfd4vyvTRQHEckO6VDlH57jbeUQem2IpqPq9kLJH+w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.9.0' + typescript: '>=4.8.4 <6.0.0' typescript@4.9.5: resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} @@ -8060,9 +8472,6 @@ packages: underscore@1.12.1: resolution: {integrity: sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==} - undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} @@ -8082,6 +8491,14 @@ packages: resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} engines: {node: '>=4'} + unicorn-magic@0.1.0: + resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} + engines: {node: '>=18'} + + unicorn-magic@0.3.0: + resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} + engines: {node: '>=18'} + unique-string@2.0.0: resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==} engines: {node: '>=8'} @@ -8224,6 +8641,9 @@ packages: resolution: {integrity: sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==} engines: {node: '>=10.12.0'} + validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + vary@1.1.2: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} @@ -8281,6 +8701,46 @@ packages: yaml: optional: true + vite@7.1.4: + resolution: {integrity: sha512-X5QFK4SGynAeeIt+A7ZWnApdUyHYm+pzv/8/A57LqSGcI88U6R6ipOs3uCesdc6yl7nl+zNO0t8LmqAdXcQihw==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + jiti: '>=1.21.0' + less: ^4.0.0 + lightningcss: ^1.21.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + vitest@3.2.4: resolution: {integrity: sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} @@ -8545,6 +9005,18 @@ packages: write-file-atomic@3.0.3: resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} + write-file-atomic@5.0.1: + resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + write-json-file@6.0.0: + resolution: {integrity: sha512-MNHcU3f9WxnNyR6MxsYSj64Jz0+dwIpisWKWq9gqLj/GwmA9INg3BZ3vt70/HB3GEwrnDQWr4RPrywnhNzmUFA==} + engines: {node: '>=18'} + + write-package@7.1.0: + resolution: {integrity: sha512-DqUx8GI3r9BFWwU2DPKddL1E7xWfbFED82mLVhGXKlFEPe8IkBftzO7WfNwHtk7oGDHDeuH/o8VMpzzfMwmLUA==} + engines: {node: '>=18'} + ws@7.5.10: resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} engines: {node: '>=8.3.0'} @@ -8631,6 +9103,10 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} + yoctocolors@2.1.2: + resolution: {integrity: sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==} + engines: {node: '>=18'} + zustand@5.0.4: resolution: {integrity: sha512-39VFTN5InDtMd28ZhjLyuTnlytDr9HfwO512Ai4I8ZABCoyAj4F1+sr7sD1jP/+p7k77Iko0Pb5NhgBFDCX0kQ==} engines: {node: '>=12.20.0'} @@ -8707,6 +9183,26 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/core@7.28.4': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.3 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.4) + '@babel/helpers': 7.28.4 + '@babel/parser': 7.28.4 + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.4 + '@babel/types': 7.28.4 + '@jridgewell/remapping': 2.3.5 + convert-source-map: 2.0.0 + debug: 4.4.1 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + '@babel/eslint-parser@7.28.0(@babel/core@7.27.7)(eslint@8.57.1)': dependencies: '@babel/core': 7.27.7 @@ -8731,6 +9227,14 @@ snapshots: '@jridgewell/trace-mapping': 0.3.29 jsesc: 3.1.0 + '@babel/generator@7.28.3': + dependencies: + '@babel/parser': 7.28.4 + '@babel/types': 7.28.4 + '@jridgewell/gen-mapping': 0.3.12 + '@jridgewell/trace-mapping': 0.3.29 + jsesc: 3.1.0 + '@babel/helper-annotate-as-pure@7.27.3': dependencies: '@babel/types': 7.27.7 @@ -8799,6 +9303,15 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/traverse': 7.28.4 + transitivePeerDependencies: + - supports-color + '@babel/helper-optimise-call-expression@7.27.1': dependencies: '@babel/types': 7.27.7 @@ -8849,6 +9362,11 @@ snapshots: '@babel/template': 7.27.2 '@babel/types': 7.27.7 + '@babel/helpers@7.28.4': + dependencies: + '@babel/template': 7.27.2 + '@babel/types': 7.28.4 + '@babel/parser@7.27.7': dependencies: '@babel/types': 7.27.7 @@ -8857,6 +9375,10 @@ snapshots: dependencies: '@babel/types': 7.28.1 + '@babel/parser@7.28.4': + dependencies: + '@babel/types': 7.28.4 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.27.1(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 @@ -8982,6 +9504,11 @@ snapshots: '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-flow@7.27.1(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-import-assertions@7.27.1(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 @@ -9007,6 +9534,11 @@ snapshots: '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 @@ -9349,7 +9881,12 @@ snapshots: '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.27.7)': dependencies: - '@babel/core': 7.27.7 + '@babel/core': 7.27.7 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.27.7)': @@ -9357,6 +9894,11 @@ snapshots: '@babel/core': 7.27.7 '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-react-jsx@7.27.1(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 @@ -9368,6 +9910,17 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/plugin-transform-react-jsx@7.27.1(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.4) + '@babel/types': 7.27.7 + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-react-pure-annotations@7.27.1(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 @@ -9602,6 +10155,18 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/traverse@7.28.4': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.3 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.28.4 + '@babel/template': 7.27.2 + '@babel/types': 7.28.4 + debug: 4.4.1 + transitivePeerDependencies: + - supports-color + '@babel/types@7.27.7': dependencies: '@babel/helper-string-parser': 7.27.1 @@ -9612,10 +10177,50 @@ snapshots: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.27.1 + '@babel/types@7.28.4': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@bcoe/v8-coverage@0.2.3': {} '@bcoe/v8-coverage@1.0.2': {} + '@biomejs/biome@2.2.4': + optionalDependencies: + '@biomejs/cli-darwin-arm64': 2.2.4 + '@biomejs/cli-darwin-x64': 2.2.4 + '@biomejs/cli-linux-arm64': 2.2.4 + '@biomejs/cli-linux-arm64-musl': 2.2.4 + '@biomejs/cli-linux-x64': 2.2.4 + '@biomejs/cli-linux-x64-musl': 2.2.4 + '@biomejs/cli-win32-arm64': 2.2.4 + '@biomejs/cli-win32-x64': 2.2.4 + + '@biomejs/cli-darwin-arm64@2.2.4': + optional: true + + '@biomejs/cli-darwin-x64@2.2.4': + optional: true + + '@biomejs/cli-linux-arm64-musl@2.2.4': + optional: true + + '@biomejs/cli-linux-arm64@2.2.4': + optional: true + + '@biomejs/cli-linux-x64-musl@2.2.4': + optional: true + + '@biomejs/cli-linux-x64@2.2.4': + optional: true + + '@biomejs/cli-win32-arm64@2.2.4': + optional: true + + '@biomejs/cli-win32-x64@2.2.4': + optional: true + '@changesets/apply-release-plan@7.0.12': dependencies: '@changesets/config': 3.1.1 @@ -9758,6 +10363,10 @@ snapshots: human-id: 4.1.1 prettier: 2.8.8 + '@commander-js/extra-typings@13.1.0(commander@13.1.0)': + dependencies: + commander: 13.1.0 + '@csstools/color-helpers@5.0.2': {} '@csstools/css-calc@2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': @@ -9858,109 +10467,109 @@ snapshots: dependencies: postcss-selector-parser: 6.1.2 - '@dedot/api@0.14.1': + '@dedot/api@0.16.0': dependencies: - '@dedot/codecs': 0.14.1 - '@dedot/providers': 0.14.1 - '@dedot/runtime-specs': 0.14.1 - '@dedot/shape': 0.14.1 - '@dedot/storage': 0.14.1 - '@dedot/types': 0.14.1 - '@dedot/utils': 0.14.1 + '@dedot/codecs': 0.16.0 + '@dedot/providers': 0.16.0 + '@dedot/runtime-specs': 0.16.0 + '@dedot/shape': 0.16.0 + '@dedot/storage': 0.16.0 + '@dedot/types': 0.16.0 + '@dedot/utils': 0.16.0 transitivePeerDependencies: - bufferutil - utf-8-validate - '@dedot/chaintypes@0.123.0(dedot@0.14.1)': + '@dedot/chaintypes@0.152.0(dedot@0.16.0)': dependencies: - dedot: 0.14.1 + dedot: 0.16.0 - '@dedot/cli@0.14.1': + '@dedot/cli@0.16.0': dependencies: - '@dedot/api': 0.14.1 - '@dedot/codecs': 0.14.1 - '@dedot/codegen': 0.14.1 + '@dedot/api': 0.16.0 + '@dedot/codecs': 0.16.0 + '@dedot/codegen': 0.16.0 '@polkadot-api/wasm-executor': 0.1.2 - '@polkadot/types-support': 16.2.2 + '@polkadot/types-support': 16.4.6 ora: 8.2.0 yargs: 17.7.2 transitivePeerDependencies: - bufferutil - utf-8-validate - '@dedot/codecs@0.14.1': + '@dedot/codecs@0.16.0': dependencies: - '@dedot/shape': 0.14.1 - '@dedot/utils': 0.14.1 + '@dedot/shape': 0.16.0 + '@dedot/utils': 0.16.0 - '@dedot/codegen@0.14.1': + '@dedot/codegen@0.16.0': dependencies: - '@dedot/api': 0.14.1 - '@dedot/codecs': 0.14.1 - '@dedot/contracts': 0.14.1 - '@dedot/providers': 0.14.1 - '@dedot/runtime-specs': 0.14.1 - '@dedot/shape': 0.14.1 - '@dedot/types': 0.14.1 - '@dedot/utils': 0.14.1 + '@dedot/api': 0.16.0 + '@dedot/codecs': 0.16.0 + '@dedot/contracts': 0.16.0 + '@dedot/providers': 0.16.0 + '@dedot/runtime-specs': 0.16.0 + '@dedot/shape': 0.16.0 + '@dedot/types': 0.16.0 + '@dedot/utils': 0.16.0 handlebars: 4.7.8 prettier: 3.6.2 transitivePeerDependencies: - bufferutil - utf-8-validate - '@dedot/contracts@0.14.1': + '@dedot/contracts@0.16.0': dependencies: - '@dedot/api': 0.14.1 - '@dedot/codecs': 0.14.1 - '@dedot/types': 0.14.1 - '@dedot/utils': 0.14.1 + '@dedot/api': 0.16.0 + '@dedot/codecs': 0.16.0 + '@dedot/types': 0.16.0 + '@dedot/utils': 0.16.0 '@ethereumjs/rlp': 10.0.0 transitivePeerDependencies: - bufferutil - utf-8-validate - '@dedot/merkleized-metadata@0.14.1': + '@dedot/merkleized-metadata@0.16.0': dependencies: - '@dedot/codecs': 0.14.1 - '@dedot/shape': 0.14.1 - '@dedot/utils': 0.14.1 + '@dedot/codecs': 0.16.0 + '@dedot/shape': 0.16.0 + '@dedot/utils': 0.16.0 - '@dedot/providers@0.14.1': + '@dedot/providers@0.16.0': dependencies: - '@dedot/utils': 0.14.1 - '@polkadot/x-ws': 13.5.2 + '@dedot/utils': 0.16.0 + '@polkadot/x-ws': 13.5.6 transitivePeerDependencies: - bufferutil - utf-8-validate - '@dedot/runtime-specs@0.14.1': + '@dedot/runtime-specs@0.16.0': dependencies: - '@dedot/codecs': 0.14.1 - '@dedot/shape': 0.14.1 - '@dedot/types': 0.14.1 + '@dedot/codecs': 0.16.0 + '@dedot/shape': 0.16.0 + '@dedot/types': 0.16.0 - '@dedot/shape@0.14.1': + '@dedot/shape@0.16.0': dependencies: - '@dedot/utils': 0.14.1 + '@dedot/utils': 0.16.0 deshape: 0.1.0 - '@dedot/smoldot@0.14.1': + '@dedot/smoldot@0.16.0': dependencies: - smoldot: 2.0.36 + smoldot: 2.0.38 transitivePeerDependencies: - bufferutil - utf-8-validate - '@dedot/storage@0.14.1': {} + '@dedot/storage@0.16.0': {} - '@dedot/types@0.14.1': + '@dedot/types@0.16.0': dependencies: - '@dedot/codecs': 0.14.1 - '@dedot/shape': 0.14.1 - '@dedot/utils': 0.14.1 + '@dedot/codecs': 0.16.0 + '@dedot/shape': 0.16.0 + '@dedot/utils': 0.16.0 - '@dedot/utils@0.14.1': + '@dedot/utils@0.16.0': dependencies: '@noble/hashes': 1.8.0 '@scure/base': 1.2.6 @@ -10051,9 +10660,14 @@ snapshots: eslint: 8.57.1 eslint-visitor-keys: 3.4.3 - '@eslint-community/eslint-utils@4.7.0(eslint@9.30.0(jiti@2.4.2))': + '@eslint-community/eslint-utils@4.7.0(eslint@9.35.0(jiti@2.4.2))': + dependencies: + eslint: 9.35.0(jiti@2.4.2) + eslint-visitor-keys: 3.4.3 + + '@eslint-community/eslint-utils@4.9.0(eslint@9.35.0(jiti@2.4.2))': dependencies: - eslint: 9.30.0(jiti@2.4.2) + eslint: 9.35.0(jiti@2.4.2) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} @@ -10066,13 +10680,9 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/config-helpers@0.3.0': {} - - '@eslint/core@0.14.0': - dependencies: - '@types/json-schema': 7.0.15 + '@eslint/config-helpers@0.3.1': {} - '@eslint/core@0.15.1': + '@eslint/core@0.15.2': dependencies: '@types/json-schema': 7.0.15 @@ -10106,13 +10716,13 @@ snapshots: '@eslint/js@8.57.1': {} - '@eslint/js@9.30.0': {} + '@eslint/js@9.35.0': {} '@eslint/object-schema@2.1.6': {} - '@eslint/plugin-kit@0.3.3': + '@eslint/plugin-kit@0.3.5': dependencies: - '@eslint/core': 0.15.1 + '@eslint/core': 0.15.2 levn: 0.4.1 '@ethereumjs/rlp@10.0.0': {} @@ -10252,7 +10862,7 @@ snapshots: '@jest/console@27.5.1': dependencies: '@jest/types': 27.5.1 - '@types/node': 18.19.113 + '@types/node': 20.19.9 chalk: 4.1.2 jest-message-util: 27.5.1 jest-util: 27.5.1 @@ -10261,7 +10871,7 @@ snapshots: '@jest/console@28.1.3': dependencies: '@jest/types': 28.1.3 - '@types/node': 18.19.113 + '@types/node': 20.19.9 chalk: 4.1.2 jest-message-util: 28.1.3 jest-util: 28.1.3 @@ -10274,7 +10884,7 @@ snapshots: '@jest/test-result': 27.5.1 '@jest/transform': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 18.19.113 + '@types/node': 20.19.9 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.8.1 @@ -10308,14 +10918,14 @@ snapshots: dependencies: '@jest/fake-timers': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 18.19.113 + '@types/node': 20.19.9 jest-mock: 27.5.1 '@jest/fake-timers@27.5.1': dependencies: '@jest/types': 27.5.1 '@sinonjs/fake-timers': 8.1.0 - '@types/node': 18.19.113 + '@types/node': 20.19.9 jest-message-util: 27.5.1 jest-mock: 27.5.1 jest-util: 27.5.1 @@ -10333,7 +10943,7 @@ snapshots: '@jest/test-result': 27.5.1 '@jest/transform': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 18.19.113 + '@types/node': 20.19.9 chalk: 4.1.2 collect-v8-coverage: 1.0.2 exit: 0.1.2 @@ -10413,7 +11023,7 @@ snapshots: dependencies: '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 18.19.113 + '@types/node': 20.19.9 '@types/yargs': 16.0.9 chalk: 4.1.2 @@ -10422,7 +11032,7 @@ snapshots: '@jest/schemas': 28.1.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 18.19.113 + '@types/node': 20.19.9 '@types/yargs': 17.0.33 chalk: 4.1.2 @@ -10437,6 +11047,11 @@ snapshots: '@jridgewell/sourcemap-codec': 1.5.0 '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.12 + '@jridgewell/trace-mapping': 0.3.29 + '@jridgewell/resolve-uri@3.1.2': {} '@jridgewell/set-array@1.2.1': {} @@ -10534,6 +11149,8 @@ snapshots: '@noble/hashes@1.8.0': {} + '@noble/hashes@2.0.0': {} + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -10609,7 +11226,7 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true - '@pmmmwh/react-refresh-webpack-plugin@0.5.17(react-refresh@0.11.0)(type-fest@0.21.3)(webpack-dev-server@4.15.2(webpack@5.100.2))(webpack@5.100.2)': + '@pmmmwh/react-refresh-webpack-plugin@0.5.17(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@4.15.2(webpack@5.100.2))(webpack@5.100.2)': dependencies: ansi-html: 0.0.9 core-js-pure: 3.44.0 @@ -10621,55 +11238,236 @@ snapshots: source-map: 0.7.4 webpack: 5.100.2 optionalDependencies: - type-fest: 0.21.3 + type-fest: 4.41.0 webpack-dev-server: 4.15.2(webpack@5.100.2) + '@polkadot-api/cli@0.11.0(jiti@2.4.2)(postcss@8.5.6)(yaml@2.8.0)': + dependencies: + '@commander-js/extra-typings': 13.1.0(commander@13.1.0) + '@polkadot-api/codegen': 0.13.0 + '@polkadot-api/ink-contracts': 0.2.5 + '@polkadot-api/json-rpc-provider': 0.0.4 + '@polkadot-api/known-chains': 0.7.0 + '@polkadot-api/metadata-compatibility': 0.1.15 + '@polkadot-api/observable-client': 0.8.0(@polkadot-api/substrate-client@0.3.0)(rxjs@7.8.2) + '@polkadot-api/polkadot-sdk-compat': 2.3.1 + '@polkadot-api/sm-provider': 0.1.7(@polkadot-api/smoldot@0.3.8) + '@polkadot-api/smoldot': 0.3.8 + '@polkadot-api/substrate-bindings': 0.11.0 + '@polkadot-api/substrate-client': 0.3.0 + '@polkadot-api/utils': 0.1.2 + '@polkadot-api/wasm-executor': 0.1.2 + '@polkadot-api/ws-provider': 0.3.6 + '@types/node': 22.15.21 + commander: 13.1.0 + execa: 9.6.0 + fs.promises.exists: 1.1.4 + ora: 8.2.0 + read-pkg: 9.0.1 + rxjs: 7.8.2 + tsc-prog: 2.3.0(typescript@5.8.3) + tsup: 8.5.0(jiti@2.4.2)(postcss@8.5.6)(typescript@5.8.3)(yaml@2.8.0) + typescript: 5.8.3 + write-package: 7.1.0 + transitivePeerDependencies: + - '@microsoft/api-extractor' + - '@swc/core' + - bufferutil + - jiti + - postcss + - supports-color + - tsx + - utf-8-validate + - yaml + + '@polkadot-api/codegen@0.13.0': + dependencies: + '@polkadot-api/ink-contracts': 0.2.5 + '@polkadot-api/metadata-builders': 0.10.1 + '@polkadot-api/metadata-compatibility': 0.1.15 + '@polkadot-api/substrate-bindings': 0.11.0 + '@polkadot-api/utils': 0.1.2 + + '@polkadot-api/descriptors@file:examples/with-vite-papi/.papi/descriptors(polkadot-api@1.9.1(jiti@2.4.2)(postcss@8.5.6)(rxjs@7.8.2)(yaml@2.8.0))': + dependencies: + polkadot-api: 1.9.1(jiti@2.4.2)(postcss@8.5.6)(rxjs@7.8.2)(yaml@2.8.0) + + '@polkadot-api/ink-contracts@0.2.5': + dependencies: + '@polkadot-api/metadata-builders': 0.10.1 + '@polkadot-api/substrate-bindings': 0.11.0 + '@polkadot-api/utils': 0.1.2 + scale-ts: 1.6.1 + + '@polkadot-api/json-rpc-provider-proxy@0.2.4': {} + + '@polkadot-api/json-rpc-provider@0.0.4': {} + + '@polkadot-api/known-chains@0.7.0': {} + + '@polkadot-api/logs-provider@0.0.6': + dependencies: + '@polkadot-api/json-rpc-provider': 0.0.4 + + '@polkadot-api/metadata-builders@0.10.1': + dependencies: + '@polkadot-api/substrate-bindings': 0.11.0 + '@polkadot-api/utils': 0.1.2 + + '@polkadot-api/metadata-builders@0.13.4': + dependencies: + '@polkadot-api/substrate-bindings': 0.16.2 + '@polkadot-api/utils': 0.2.0 + + '@polkadot-api/metadata-compatibility@0.1.15': + dependencies: + '@polkadot-api/metadata-builders': 0.10.1 + '@polkadot-api/substrate-bindings': 0.11.0 + + '@polkadot-api/observable-client@0.8.0(@polkadot-api/substrate-client@0.3.0)(rxjs@7.8.2)': + dependencies: + '@polkadot-api/metadata-builders': 0.10.1 + '@polkadot-api/substrate-bindings': 0.11.0 + '@polkadot-api/substrate-client': 0.3.0 + '@polkadot-api/utils': 0.1.2 + rxjs: 7.8.2 + + '@polkadot-api/pjs-signer@0.6.14': + dependencies: + '@polkadot-api/metadata-builders': 0.13.4 + '@polkadot-api/polkadot-signer': 0.1.6 + '@polkadot-api/signers-common': 0.1.15 + '@polkadot-api/substrate-bindings': 0.16.2 + '@polkadot-api/utils': 0.2.0 + + '@polkadot-api/pjs-signer@0.6.4': + dependencies: + '@polkadot-api/metadata-builders': 0.10.1 + '@polkadot-api/polkadot-signer': 0.1.6 + '@polkadot-api/signers-common': 0.1.5 + '@polkadot-api/substrate-bindings': 0.11.0 + '@polkadot-api/utils': 0.1.2 + + '@polkadot-api/polkadot-sdk-compat@2.3.1': + dependencies: + '@polkadot-api/json-rpc-provider': 0.0.4 + + '@polkadot-api/polkadot-signer@0.1.6': {} + + '@polkadot-api/signer@0.1.14': + dependencies: + '@noble/hashes': 1.8.0 + '@polkadot-api/polkadot-signer': 0.1.6 + '@polkadot-api/signers-common': 0.1.5 + '@polkadot-api/substrate-bindings': 0.11.0 + '@polkadot-api/utils': 0.1.2 + + '@polkadot-api/signers-common@0.1.15': + dependencies: + '@polkadot-api/metadata-builders': 0.13.4 + '@polkadot-api/polkadot-signer': 0.1.6 + '@polkadot-api/substrate-bindings': 0.16.2 + '@polkadot-api/utils': 0.2.0 + + '@polkadot-api/signers-common@0.1.5': + dependencies: + '@polkadot-api/metadata-builders': 0.10.1 + '@polkadot-api/polkadot-signer': 0.1.6 + '@polkadot-api/substrate-bindings': 0.11.0 + '@polkadot-api/utils': 0.1.2 + + '@polkadot-api/sm-provider@0.1.7(@polkadot-api/smoldot@0.3.8)': + dependencies: + '@polkadot-api/json-rpc-provider': 0.0.4 + '@polkadot-api/json-rpc-provider-proxy': 0.2.4 + '@polkadot-api/smoldot': 0.3.8 + + '@polkadot-api/smoldot@0.3.8': + dependencies: + '@types/node': 22.15.21 + smoldot: 2.0.34 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@polkadot-api/substrate-bindings@0.11.0': + dependencies: + '@noble/hashes': 1.8.0 + '@polkadot-api/utils': 0.1.2 + '@scure/base': 1.2.6 + scale-ts: 1.6.1 + + '@polkadot-api/substrate-bindings@0.16.2': + dependencies: + '@noble/hashes': 2.0.0 + '@polkadot-api/utils': 0.2.0 + '@scure/base': 2.0.0 + scale-ts: 1.6.1 + + '@polkadot-api/substrate-client@0.3.0': + dependencies: + '@polkadot-api/json-rpc-provider': 0.0.4 + '@polkadot-api/utils': 0.1.2 + + '@polkadot-api/utils@0.1.2': {} + + '@polkadot-api/utils@0.2.0': {} + '@polkadot-api/wasm-executor@0.1.2': {} - '@polkadot/types-support@16.2.2': + '@polkadot-api/ws-provider@0.3.6': + dependencies: + '@polkadot-api/json-rpc-provider': 0.0.4 + '@polkadot-api/json-rpc-provider-proxy': 0.2.4 + ws: 8.18.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@polkadot/types-support@16.4.6': dependencies: - '@polkadot/util': 13.5.2 + '@polkadot/util': 13.5.6 tslib: 2.8.1 - '@polkadot/util@13.5.2': + '@polkadot/util@13.5.6': dependencies: - '@polkadot/x-bigint': 13.5.2 - '@polkadot/x-global': 13.5.2 - '@polkadot/x-textdecoder': 13.5.2 - '@polkadot/x-textencoder': 13.5.2 + '@polkadot/x-bigint': 13.5.6 + '@polkadot/x-global': 13.5.6 + '@polkadot/x-textdecoder': 13.5.6 + '@polkadot/x-textencoder': 13.5.6 '@types/bn.js': 5.2.0 bn.js: 5.2.2 tslib: 2.8.1 - '@polkadot/x-bigint@13.5.2': + '@polkadot/x-bigint@13.5.6': dependencies: - '@polkadot/x-global': 13.5.2 + '@polkadot/x-global': 13.5.6 tslib: 2.8.1 - '@polkadot/x-global@13.5.2': + '@polkadot/x-global@13.5.6': dependencies: tslib: 2.8.1 - '@polkadot/x-textdecoder@13.5.2': + '@polkadot/x-textdecoder@13.5.6': dependencies: - '@polkadot/x-global': 13.5.2 + '@polkadot/x-global': 13.5.6 tslib: 2.8.1 - '@polkadot/x-textencoder@13.5.2': + '@polkadot/x-textencoder@13.5.6': dependencies: - '@polkadot/x-global': 13.5.2 + '@polkadot/x-global': 13.5.6 tslib: 2.8.1 - '@polkadot/x-ws@13.5.2': + '@polkadot/x-ws@13.5.6': dependencies: - '@polkadot/x-global': 13.5.2 + '@polkadot/x-global': 13.5.6 tslib: 2.8.1 ws: 8.18.3 transitivePeerDependencies: - bufferutil - utf-8-validate - '@radix-ui/primitive@1.1.2': {} + '@radix-ui/primitive@1.1.3': {} '@radix-ui/react-compose-refs@1.1.2(@types/react@18.3.23)(react@18.2.0)': dependencies: @@ -10683,17 +11481,17 @@ snapshots: optionalDependencies: '@types/react': 18.3.23 - '@radix-ui/react-dialog@1.1.14(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@radix-ui/react-dialog@1.1.15(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@radix-ui/primitive': 1.1.2 + '@radix-ui/primitive': 1.1.3 '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.23)(react@18.2.0) '@radix-ui/react-context': 1.1.2(@types/react@18.3.23)(react@18.2.0) - '@radix-ui/react-dismissable-layer': 1.1.10(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-focus-guards': 1.1.2(@types/react@18.3.23)(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@18.3.23)(react@18.2.0) '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-id': 1.1.1(@types/react@18.3.23)(react@18.2.0) '@radix-ui/react-portal': 1.1.9(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@radix-ui/react-presence': 1.1.4(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-slot': 1.2.3(@types/react@18.3.23)(react@18.2.0) '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.23)(react@18.2.0) @@ -10705,9 +11503,9 @@ snapshots: '@types/react': 18.3.23 '@types/react-dom': 18.3.7(@types/react@18.3.23) - '@radix-ui/react-dismissable-layer@1.1.10(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@radix-ui/react-dismissable-layer@1.1.11(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@radix-ui/primitive': 1.1.2 + '@radix-ui/primitive': 1.1.3 '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.23)(react@18.2.0) '@radix-ui/react-primitive': 2.1.3(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.23)(react@18.2.0) @@ -10718,7 +11516,7 @@ snapshots: '@types/react': 18.3.23 '@types/react-dom': 18.3.7(@types/react@18.3.23) - '@radix-ui/react-focus-guards@1.1.2(@types/react@18.3.23)(react@18.2.0)': + '@radix-ui/react-focus-guards@1.1.3(@types/react@18.3.23)(react@18.2.0)': dependencies: react: 18.2.0 optionalDependencies: @@ -10752,7 +11550,7 @@ snapshots: '@types/react': 18.3.23 '@types/react-dom': 18.3.7(@types/react@18.3.23) - '@radix-ui/react-presence@1.1.4(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@radix-ui/react-presence@1.1.5(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.23)(react@18.2.0) '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.23)(react@18.2.0) @@ -10814,6 +11612,8 @@ snapshots: '@rolldown/pluginutils@1.0.0-beta.19': {} + '@rolldown/pluginutils@1.0.0-beta.34': {} + '@rollup/plugin-babel@5.3.1(@babel/core@7.27.7)(@types/babel__core@7.20.5)(rollup@2.79.2)': dependencies: '@babel/core': 7.27.7 @@ -10912,8 +11712,14 @@ snapshots: '@rushstack/eslint-patch@1.12.0': {} + '@rx-state/core@0.1.4(rxjs@7.8.2)': + dependencies: + rxjs: 7.8.2 + '@scure/base@1.2.6': {} + '@scure/base@2.0.0': {} + '@scure/bip32@1.7.0': dependencies: '@noble/curves': 1.9.2 @@ -10925,8 +11731,12 @@ snapshots: '@noble/hashes': 1.8.0 '@scure/base': 1.2.6 + '@sec-ant/readable-stream@0.4.1': {} + '@sinclair/typebox@0.24.51': {} + '@sindresorhus/merge-streams@4.0.0': {} + '@sinonjs/commons@1.8.6': dependencies: type-detect: 4.0.8 @@ -11309,16 +12119,16 @@ snapshots: '@types/bn.js@5.2.0': dependencies: - '@types/node': 18.19.113 + '@types/node': 20.19.9 '@types/body-parser@1.19.6': dependencies: '@types/connect': 3.4.38 - '@types/node': 18.19.113 + '@types/node': 20.19.9 '@types/bonjour@3.5.13': dependencies: - '@types/node': 18.19.113 + '@types/node': 20.19.9 '@types/chai@5.2.2': dependencies: @@ -11327,11 +12137,11 @@ snapshots: '@types/connect-history-api-fallback@1.5.4': dependencies: '@types/express-serve-static-core': 5.0.7 - '@types/node': 18.19.113 + '@types/node': 20.19.9 '@types/connect@3.4.38': dependencies: - '@types/node': 18.19.113 + '@types/node': 20.19.9 '@types/deep-eql@4.0.2': {} @@ -11356,14 +12166,14 @@ snapshots: '@types/express-serve-static-core@4.19.6': dependencies: - '@types/node': 18.19.113 + '@types/node': 20.19.9 '@types/qs': 6.14.0 '@types/range-parser': 1.2.7 '@types/send': 0.17.5 '@types/express-serve-static-core@5.0.7': dependencies: - '@types/node': 18.19.113 + '@types/node': 20.19.9 '@types/qs': 6.14.0 '@types/range-parser': 1.2.7 '@types/send': 0.17.5 @@ -11377,7 +12187,7 @@ snapshots: '@types/graceful-fs@4.1.9': dependencies: - '@types/node': 18.19.113 + '@types/node': 20.19.9 '@types/html-minifier-terser@6.1.0': {} @@ -11385,7 +12195,7 @@ snapshots: '@types/http-proxy@1.17.16': dependencies: - '@types/node': 18.19.113 + '@types/node': 20.19.9 '@types/istanbul-lib-coverage@2.0.6': {} @@ -11410,15 +12220,15 @@ snapshots: '@types/node-forge@1.3.13': dependencies: - '@types/node': 18.19.113 + '@types/node': 20.19.9 '@types/node@12.20.55': {} '@types/node@16.18.126': {} - '@types/node@18.19.113': + '@types/node@20.19.0': dependencies: - undici-types: 5.26.5 + undici-types: 6.21.0 '@types/node@20.19.9': dependencies: @@ -11428,6 +12238,8 @@ snapshots: dependencies: undici-types: 6.21.0 + '@types/normalize-package-data@2.4.4': {} + '@types/parse-json@4.0.2': {} '@types/prettier@2.7.3': {} @@ -11442,7 +12254,7 @@ snapshots: '@types/react-dom@18.2.19': dependencies: - '@types/react': 18.2.55 + '@types/react': 18.3.23 '@types/react-dom@18.3.7(@types/react@18.3.23)': dependencies: @@ -11461,7 +12273,7 @@ snapshots: '@types/resolve@1.17.1': dependencies: - '@types/node': 18.19.113 + '@types/node': 20.19.9 '@types/retry@0.12.0': {} @@ -11472,7 +12284,7 @@ snapshots: '@types/send@0.17.5': dependencies: '@types/mime': 1.3.5 - '@types/node': 18.19.113 + '@types/node': 20.19.9 '@types/serve-index@1.9.4': dependencies: @@ -11481,12 +12293,12 @@ snapshots: '@types/serve-static@1.15.8': dependencies: '@types/http-errors': 2.0.5 - '@types/node': 18.19.113 + '@types/node': 20.19.9 '@types/send': 0.17.5 '@types/sockjs@0.3.36': dependencies: - '@types/node': 18.19.113 + '@types/node': 20.19.9 '@types/stack-utils@2.0.3': {} @@ -11494,7 +12306,7 @@ snapshots: '@types/ws@8.18.1': dependencies: - '@types/node': 18.19.113 + '@types/node': 20.19.9 '@types/yargs-parser@21.0.3': {} @@ -11525,15 +12337,15 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/eslint-plugin@8.35.0(@typescript-eslint/parser@8.35.0(eslint@9.30.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.30.0(jiti@2.4.2))(typescript@5.8.3)': + '@typescript-eslint/eslint-plugin@8.43.0(@typescript-eslint/parser@8.43.0(eslint@9.35.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.35.0(jiti@2.4.2))(typescript@5.8.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.35.0(eslint@9.30.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/scope-manager': 8.35.0 - '@typescript-eslint/type-utils': 8.35.0(eslint@9.30.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/utils': 8.35.0(eslint@9.30.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 8.35.0 - eslint: 9.30.0(jiti@2.4.2) + '@typescript-eslint/parser': 8.43.0(eslint@9.35.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/scope-manager': 8.43.0 + '@typescript-eslint/type-utils': 8.43.0(eslint@9.35.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/utils': 8.43.0(eslint@9.35.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/visitor-keys': 8.43.0 + eslint: 9.35.0(jiti@2.4.2) graphemer: 1.4.0 ignore: 7.0.5 natural-compare: 1.4.0 @@ -11562,22 +12374,22 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.35.0(eslint@9.30.0(jiti@2.4.2))(typescript@5.8.3)': + '@typescript-eslint/parser@8.43.0(eslint@9.35.0(jiti@2.4.2))(typescript@5.8.3)': dependencies: - '@typescript-eslint/scope-manager': 8.35.0 - '@typescript-eslint/types': 8.35.0 - '@typescript-eslint/typescript-estree': 8.35.0(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 8.35.0 + '@typescript-eslint/scope-manager': 8.43.0 + '@typescript-eslint/types': 8.43.0 + '@typescript-eslint/typescript-estree': 8.43.0(typescript@5.8.3) + '@typescript-eslint/visitor-keys': 8.43.0 debug: 4.4.1 - eslint: 9.30.0(jiti@2.4.2) + eslint: 9.35.0(jiti@2.4.2) typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.35.0(typescript@5.8.3)': + '@typescript-eslint/project-service@8.43.0(typescript@5.8.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.35.0(typescript@5.8.3) - '@typescript-eslint/types': 8.35.0 + '@typescript-eslint/tsconfig-utils': 8.43.0(typescript@5.8.3) + '@typescript-eslint/types': 8.43.0 debug: 4.4.1 typescript: 5.8.3 transitivePeerDependencies: @@ -11588,12 +12400,12 @@ snapshots: '@typescript-eslint/types': 5.62.0 '@typescript-eslint/visitor-keys': 5.62.0 - '@typescript-eslint/scope-manager@8.35.0': + '@typescript-eslint/scope-manager@8.43.0': dependencies: - '@typescript-eslint/types': 8.35.0 - '@typescript-eslint/visitor-keys': 8.35.0 + '@typescript-eslint/types': 8.43.0 + '@typescript-eslint/visitor-keys': 8.43.0 - '@typescript-eslint/tsconfig-utils@8.35.0(typescript@5.8.3)': + '@typescript-eslint/tsconfig-utils@8.43.0(typescript@5.8.3)': dependencies: typescript: 5.8.3 @@ -11609,12 +12421,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/type-utils@8.35.0(eslint@9.30.0(jiti@2.4.2))(typescript@5.8.3)': + '@typescript-eslint/type-utils@8.43.0(eslint@9.35.0(jiti@2.4.2))(typescript@5.8.3)': dependencies: - '@typescript-eslint/typescript-estree': 8.35.0(typescript@5.8.3) - '@typescript-eslint/utils': 8.35.0(eslint@9.30.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/types': 8.43.0 + '@typescript-eslint/typescript-estree': 8.43.0(typescript@5.8.3) + '@typescript-eslint/utils': 8.43.0(eslint@9.35.0(jiti@2.4.2))(typescript@5.8.3) debug: 4.4.1 - eslint: 9.30.0(jiti@2.4.2) + eslint: 9.35.0(jiti@2.4.2) ts-api-utils: 2.1.0(typescript@5.8.3) typescript: 5.8.3 transitivePeerDependencies: @@ -11622,7 +12435,7 @@ snapshots: '@typescript-eslint/types@5.62.0': {} - '@typescript-eslint/types@8.35.0': {} + '@typescript-eslint/types@8.43.0': {} '@typescript-eslint/typescript-estree@5.62.0(typescript@4.9.5)': dependencies: @@ -11638,12 +12451,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@8.35.0(typescript@5.8.3)': + '@typescript-eslint/typescript-estree@8.43.0(typescript@5.8.3)': dependencies: - '@typescript-eslint/project-service': 8.35.0(typescript@5.8.3) - '@typescript-eslint/tsconfig-utils': 8.35.0(typescript@5.8.3) - '@typescript-eslint/types': 8.35.0 - '@typescript-eslint/visitor-keys': 8.35.0 + '@typescript-eslint/project-service': 8.43.0(typescript@5.8.3) + '@typescript-eslint/tsconfig-utils': 8.43.0(typescript@5.8.3) + '@typescript-eslint/types': 8.43.0 + '@typescript-eslint/visitor-keys': 8.43.0 debug: 4.4.1 fast-glob: 3.3.3 is-glob: 4.0.3 @@ -11669,13 +12482,13 @@ snapshots: - supports-color - typescript - '@typescript-eslint/utils@8.35.0(eslint@9.30.0(jiti@2.4.2))(typescript@5.8.3)': + '@typescript-eslint/utils@8.43.0(eslint@9.35.0(jiti@2.4.2))(typescript@5.8.3)': dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.30.0(jiti@2.4.2)) - '@typescript-eslint/scope-manager': 8.35.0 - '@typescript-eslint/types': 8.35.0 - '@typescript-eslint/typescript-estree': 8.35.0(typescript@5.8.3) - eslint: 9.30.0(jiti@2.4.2) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.35.0(jiti@2.4.2)) + '@typescript-eslint/scope-manager': 8.43.0 + '@typescript-eslint/types': 8.43.0 + '@typescript-eslint/typescript-estree': 8.43.0(typescript@5.8.3) + eslint: 9.35.0(jiti@2.4.2) typescript: 5.8.3 transitivePeerDependencies: - supports-color @@ -11685,9 +12498,9 @@ snapshots: '@typescript-eslint/types': 5.62.0 eslint-visitor-keys: 3.4.3 - '@typescript-eslint/visitor-keys@8.35.0': + '@typescript-eslint/visitor-keys@8.43.0': dependencies: - '@typescript-eslint/types': 8.35.0 + '@typescript-eslint/types': 8.43.0 eslint-visitor-keys: 4.2.1 '@ungap/structured-clone@1.3.0': {} @@ -11704,7 +12517,19 @@ snapshots: transitivePeerDependencies: - supports-color - '@vitest/coverage-v8@3.2.4(vitest@3.2.4(@types/node@18.19.113)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.0))': + '@vitejs/plugin-react@5.0.2(vite@7.1.4(@types/node@22.15.21)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.0))': + dependencies: + '@babel/core': 7.28.4 + '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.28.4) + '@rolldown/pluginutils': 1.0.0-beta.34 + '@types/babel__core': 7.20.5 + react-refresh: 0.17.0 + vite: 7.1.4(@types/node@22.15.21)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.0) + transitivePeerDependencies: + - supports-color + + '@vitest/coverage-v8@3.2.4(vitest@3.2.4(@types/node@20.19.0)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.0))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 1.0.2 @@ -11719,7 +12544,7 @@ snapshots: std-env: 3.9.0 test-exclude: 7.0.1 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/node@18.19.113)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.0) + vitest: 3.2.4(@types/node@20.19.0)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.0) transitivePeerDependencies: - supports-color @@ -11750,21 +12575,21 @@ snapshots: chai: 5.2.0 tinyrainbow: 2.0.0 - '@vitest/mocker@3.2.4(vite@6.3.5(@types/node@18.19.113)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.0))': + '@vitest/mocker@3.2.4(vite@7.1.4(@types/node@20.19.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.0))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 6.3.5(@types/node@18.19.113)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.0) + vite: 7.1.4(@types/node@20.19.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.0) - '@vitest/mocker@3.2.4(vite@6.3.5(@types/node@22.15.21)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.0))': + '@vitest/mocker@3.2.4(vite@7.1.4(@types/node@22.15.21)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.0))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 6.3.5(@types/node@22.15.21)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.0) + vite: 7.1.4(@types/node@22.15.21)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.0) '@vitest/pretty-format@3.2.4': dependencies: @@ -12842,6 +13667,8 @@ snapshots: dependencies: delayed-stream: 1.0.0 + commander@13.1.0: {} + commander@2.20.3: {} commander@4.1.1: {} @@ -13189,20 +14016,20 @@ snapshots: dedent@0.7.0: {} - dedot@0.14.1: - dependencies: - '@dedot/api': 0.14.1 - '@dedot/cli': 0.14.1 - '@dedot/codecs': 0.14.1 - '@dedot/contracts': 0.14.1 - '@dedot/merkleized-metadata': 0.14.1 - '@dedot/providers': 0.14.1 - '@dedot/runtime-specs': 0.14.1 - '@dedot/shape': 0.14.1 - '@dedot/smoldot': 0.14.1 - '@dedot/types': 0.14.1 - '@dedot/utils': 0.14.1 - smoldot: 2.0.36 + dedot@0.16.0: + dependencies: + '@dedot/api': 0.16.0 + '@dedot/cli': 0.16.0 + '@dedot/codecs': 0.16.0 + '@dedot/contracts': 0.16.0 + '@dedot/merkleized-metadata': 0.16.0 + '@dedot/providers': 0.16.0 + '@dedot/runtime-specs': 0.16.0 + '@dedot/shape': 0.16.0 + '@dedot/smoldot': 0.16.0 + '@dedot/types': 0.16.0 + '@dedot/utils': 0.16.0 + smoldot: 2.0.38 transitivePeerDependencies: - bufferutil - utf-8-validate @@ -13211,6 +14038,8 @@ snapshots: deep-is@0.1.4: {} + deepmerge-ts@7.1.5: {} + deepmerge@4.3.1: {} default-gateway@6.0.3: @@ -13251,6 +14080,8 @@ snapshots: detect-indent@6.1.0: {} + detect-indent@7.0.1: {} + detect-libc@1.0.3: {} detect-libc@2.0.4: {} @@ -13595,7 +14426,7 @@ snapshots: optionalDependencies: source-map: 0.6.1 - eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.27.1(@babel/core@7.27.7))(@babel/plugin-transform-react-jsx@7.27.1(@babel/core@7.27.7))(eslint@8.57.1)(jest@27.5.1)(typescript@4.9.5): + eslint-config-react-app@7.0.1(@babel/plugin-syntax-flow@7.27.1(@babel/core@7.28.4))(@babel/plugin-transform-react-jsx@7.27.1(@babel/core@7.28.4))(eslint@8.57.1)(jest@27.5.1)(typescript@4.9.5): dependencies: '@babel/core': 7.27.7 '@babel/eslint-parser': 7.28.0(@babel/core@7.27.7)(eslint@8.57.1) @@ -13605,7 +14436,7 @@ snapshots: babel-preset-react-app: 10.1.0 confusing-browser-globals: 1.0.11 eslint: 8.57.1 - eslint-plugin-flowtype: 8.0.3(@babel/plugin-syntax-flow@7.27.1(@babel/core@7.27.7))(@babel/plugin-transform-react-jsx@7.27.1(@babel/core@7.27.7))(eslint@8.57.1) + eslint-plugin-flowtype: 8.0.3(@babel/plugin-syntax-flow@7.27.1(@babel/core@7.28.4))(@babel/plugin-transform-react-jsx@7.27.1(@babel/core@7.28.4))(eslint@8.57.1) eslint-plugin-import: 2.32.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@4.9.5))(eslint@8.57.1) eslint-plugin-jest: 25.7.0(@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@4.9.5))(eslint@8.57.1)(typescript@4.9.5))(eslint@8.57.1)(jest@27.5.1)(typescript@4.9.5) eslint-plugin-jsx-a11y: 6.10.2(eslint@8.57.1) @@ -13640,10 +14471,10 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-flowtype@8.0.3(@babel/plugin-syntax-flow@7.27.1(@babel/core@7.27.7))(@babel/plugin-transform-react-jsx@7.27.1(@babel/core@7.27.7))(eslint@8.57.1): + eslint-plugin-flowtype@8.0.3(@babel/plugin-syntax-flow@7.27.1(@babel/core@7.28.4))(@babel/plugin-transform-react-jsx@7.27.1(@babel/core@7.28.4))(eslint@8.57.1): dependencies: - '@babel/plugin-syntax-flow': 7.27.1(@babel/core@7.27.7) - '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.27.7) + '@babel/plugin-syntax-flow': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.28.4) eslint: 8.57.1 lodash: 4.17.21 string-natural-compare: 3.0.1 @@ -13711,13 +14542,13 @@ snapshots: dependencies: eslint: 8.57.1 - eslint-plugin-react-hooks@5.2.0(eslint@9.30.0(jiti@2.4.2)): + eslint-plugin-react-hooks@5.2.0(eslint@9.35.0(jiti@2.4.2)): dependencies: - eslint: 9.30.0(jiti@2.4.2) + eslint: 9.35.0(jiti@2.4.2) - eslint-plugin-react-refresh@0.4.20(eslint@9.30.0(jiti@2.4.2)): + eslint-plugin-react-refresh@0.4.20(eslint@9.35.0(jiti@2.4.2)): dependencies: - eslint: 9.30.0(jiti@2.4.2) + eslint: 9.35.0(jiti@2.4.2) eslint-plugin-react@7.37.5(eslint@8.57.1): dependencies: @@ -13823,16 +14654,16 @@ snapshots: transitivePeerDependencies: - supports-color - eslint@9.30.0(jiti@2.4.2): + eslint@9.35.0(jiti@2.4.2): dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.30.0(jiti@2.4.2)) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.35.0(jiti@2.4.2)) '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.21.0 - '@eslint/config-helpers': 0.3.0 - '@eslint/core': 0.14.0 + '@eslint/config-helpers': 0.3.1 + '@eslint/core': 0.15.2 '@eslint/eslintrc': 3.3.1 - '@eslint/js': 9.30.0 - '@eslint/plugin-kit': 0.3.3 + '@eslint/js': 9.35.0 + '@eslint/plugin-kit': 0.3.5 '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 @@ -13921,6 +14752,21 @@ snapshots: signal-exit: 3.0.7 strip-final-newline: 2.0.0 + execa@9.6.0: + dependencies: + '@sindresorhus/merge-streams': 4.0.0 + cross-spawn: 7.0.6 + figures: 6.1.0 + get-stream: 9.0.1 + human-signals: 8.0.1 + is-plain-obj: 4.1.0 + is-stream: 4.0.1 + npm-run-path: 6.0.0 + pretty-ms: 9.2.0 + signal-exit: 4.1.0 + strip-final-newline: 4.0.0 + yoctocolors: 2.1.2 + exit@0.1.2: {} expect-type@1.2.1: {} @@ -14010,6 +14856,14 @@ snapshots: optionalDependencies: picomatch: 4.0.2 + fdir@6.5.0(picomatch@4.0.3): + optionalDependencies: + picomatch: 4.0.3 + + figures@6.1.0: + dependencies: + is-unicode-supported: 2.1.0 + file-entry-cache@6.0.1: dependencies: flat-cache: 3.2.0 @@ -14159,6 +15013,8 @@ snapshots: fs-monkey@1.1.0: {} + fs.promises.exists@1.1.4: {} + fs.realpath@1.0.0: {} fsevents@2.3.3: @@ -14209,6 +15065,11 @@ snapshots: get-stream@6.0.1: {} + get-stream@9.0.1: + dependencies: + '@sec-ant/readable-stream': 0.4.1 + is-stream: 4.0.1 + get-symbol-description@1.1.0: dependencies: call-bound: 1.0.4 @@ -14269,7 +15130,7 @@ snapshots: globals@14.0.0: {} - globals@16.2.0: {} + globals@16.3.0: {} globalthis@1.0.4: dependencies: @@ -14348,6 +15209,10 @@ snapshots: hoopy@0.1.4: {} + hosted-git-info@7.0.2: + dependencies: + lru-cache: 10.4.3 + hpack.js@2.1.6: dependencies: inherits: 2.0.4 @@ -14466,6 +15331,8 @@ snapshots: human-signals@2.1.0: {} + human-signals@8.0.1: {} + iconv-lite@0.4.24: dependencies: safer-buffer: 2.1.2 @@ -14506,6 +15373,8 @@ snapshots: indent-string@4.0.0: {} + index-to-position@1.1.0: {} + inflight@1.0.6: dependencies: once: 1.4.0 @@ -14627,6 +15496,8 @@ snapshots: is-plain-obj@3.0.0: {} + is-plain-obj@4.1.0: {} + is-potential-custom-element-name@1.0.1: {} is-regex@1.2.1: @@ -14648,6 +15519,8 @@ snapshots: is-stream@2.0.1: {} + is-stream@4.0.1: {} + is-string@1.1.1: dependencies: call-bound: 1.0.4 @@ -14772,7 +15645,7 @@ snapshots: '@jest/environment': 27.5.1 '@jest/test-result': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 18.19.113 + '@types/node': 20.19.9 chalk: 4.1.2 co: 4.6.0 dedent: 0.7.0 @@ -14868,7 +15741,7 @@ snapshots: '@jest/environment': 27.5.1 '@jest/fake-timers': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 18.19.113 + '@types/node': 20.19.9 jest-mock: 27.5.1 jest-util: 27.5.1 jsdom: 16.7.0 @@ -14883,7 +15756,7 @@ snapshots: '@jest/environment': 27.5.1 '@jest/fake-timers': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 18.19.113 + '@types/node': 20.19.9 jest-mock: 27.5.1 jest-util: 27.5.1 @@ -14893,7 +15766,7 @@ snapshots: dependencies: '@jest/types': 27.5.1 '@types/graceful-fs': 4.1.9 - '@types/node': 18.19.113 + '@types/node': 20.19.9 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -14912,7 +15785,7 @@ snapshots: '@jest/source-map': 27.5.1 '@jest/test-result': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 18.19.113 + '@types/node': 20.19.9 chalk: 4.1.2 co: 4.6.0 expect: 27.5.1 @@ -14967,7 +15840,7 @@ snapshots: jest-mock@27.5.1: dependencies: '@jest/types': 27.5.1 - '@types/node': 18.19.113 + '@types/node': 20.19.9 jest-pnp-resolver@1.2.3(jest-resolve@27.5.1): optionalDependencies: @@ -15005,7 +15878,7 @@ snapshots: '@jest/test-result': 27.5.1 '@jest/transform': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 18.19.113 + '@types/node': 20.19.9 chalk: 4.1.2 emittery: 0.8.1 graceful-fs: 4.2.11 @@ -15056,16 +15929,16 @@ snapshots: jest-serializer@27.5.1: dependencies: - '@types/node': 18.19.113 + '@types/node': 20.19.9 graceful-fs: 4.2.11 jest-snapshot@27.5.1: dependencies: '@babel/core': 7.27.7 - '@babel/generator': 7.27.5 + '@babel/generator': 7.28.0 '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.27.7) - '@babel/traverse': 7.27.7 - '@babel/types': 7.27.7 + '@babel/traverse': 7.28.0 + '@babel/types': 7.28.1 '@jest/transform': 27.5.1 '@jest/types': 27.5.1 '@types/babel__traverse': 7.20.7 @@ -15089,7 +15962,7 @@ snapshots: jest-util@27.5.1: dependencies: '@jest/types': 27.5.1 - '@types/node': 18.19.113 + '@types/node': 20.19.9 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -15098,7 +15971,7 @@ snapshots: jest-util@28.1.3: dependencies: '@jest/types': 28.1.3 - '@types/node': 18.19.113 + '@types/node': 20.19.9 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -15128,7 +16001,7 @@ snapshots: dependencies: '@jest/test-result': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 18.19.113 + '@types/node': 20.19.9 ansi-escapes: 4.3.2 chalk: 4.1.2 jest-util: 27.5.1 @@ -15138,7 +16011,7 @@ snapshots: dependencies: '@jest/test-result': 28.1.3 '@jest/types': 28.1.3 - '@types/node': 18.19.113 + '@types/node': 20.19.9 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.10.2 @@ -15147,19 +16020,19 @@ snapshots: jest-worker@26.6.2: dependencies: - '@types/node': 18.19.113 + '@types/node': 20.19.9 merge-stream: 2.0.0 supports-color: 7.2.0 jest-worker@27.5.1: dependencies: - '@types/node': 18.19.113 + '@types/node': 20.19.9 merge-stream: 2.0.0 supports-color: 8.1.1 jest-worker@28.1.3: dependencies: - '@types/node': 18.19.113 + '@types/node': 20.19.9 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -15639,6 +16512,12 @@ snapshots: node-releases@2.0.19: {} + normalize-package-data@6.0.2: + dependencies: + hosted-git-info: 7.0.2 + semver: 7.7.2 + validate-npm-package-license: 3.0.4 + normalize-path@3.0.0: {} normalize-range@0.1.2: {} @@ -15649,6 +16528,11 @@ snapshots: dependencies: path-key: 3.1.1 + npm-run-path@6.0.0: + dependencies: + path-key: 4.0.0 + unicorn-magic: 0.3.0 + nth-check@1.0.2: dependencies: boolbase: 1.0.0 @@ -15857,6 +16741,14 @@ snapshots: json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 + parse-json@8.3.0: + dependencies: + '@babel/code-frame': 7.27.1 + index-to-position: 1.1.0 + type-fest: 4.41.0 + + parse-ms@4.0.0: {} + parse5@6.0.1: {} parse5@7.3.0: @@ -15878,6 +16770,8 @@ snapshots: path-key@3.1.1: {} + path-key@4.0.0: {} + path-parse@1.0.7: {} path-scurry@1.11.1: @@ -15903,6 +16797,8 @@ snapshots: picomatch@4.0.2: {} + picomatch@4.0.3: {} + pify@2.3.0: {} pify@4.0.1: {} @@ -15944,6 +16840,39 @@ snapshots: dependencies: find-up: 3.0.0 + polkadot-api@1.9.1(jiti@2.4.2)(postcss@8.5.6)(rxjs@7.8.2)(yaml@2.8.0): + dependencies: + '@polkadot-api/cli': 0.11.0(jiti@2.4.2)(postcss@8.5.6)(yaml@2.8.0) + '@polkadot-api/ink-contracts': 0.2.5 + '@polkadot-api/json-rpc-provider': 0.0.4 + '@polkadot-api/known-chains': 0.7.0 + '@polkadot-api/logs-provider': 0.0.6 + '@polkadot-api/metadata-builders': 0.10.1 + '@polkadot-api/metadata-compatibility': 0.1.15 + '@polkadot-api/observable-client': 0.8.0(@polkadot-api/substrate-client@0.3.0)(rxjs@7.8.2) + '@polkadot-api/pjs-signer': 0.6.4 + '@polkadot-api/polkadot-sdk-compat': 2.3.1 + '@polkadot-api/polkadot-signer': 0.1.6 + '@polkadot-api/signer': 0.1.14 + '@polkadot-api/sm-provider': 0.1.7(@polkadot-api/smoldot@0.3.8) + '@polkadot-api/smoldot': 0.3.8 + '@polkadot-api/substrate-bindings': 0.11.0 + '@polkadot-api/substrate-client': 0.3.0 + '@polkadot-api/utils': 0.1.2 + '@polkadot-api/ws-provider': 0.3.6 + '@rx-state/core': 0.1.4(rxjs@7.8.2) + rxjs: 7.8.2 + transitivePeerDependencies: + - '@microsoft/api-extractor' + - '@swc/core' + - bufferutil + - jiti + - postcss + - supports-color + - tsx + - utf-8-validate + - yaml + possible-typed-array-names@1.1.0: {} postcss-attribute-case-insensitive@5.0.2(postcss@8.5.6): @@ -16417,6 +17346,10 @@ snapshots: ansi-styles: 5.2.0 react-is: 18.3.1 + pretty-ms@9.2.0: + dependencies: + parse-ms: 4.0.0 + process-nextick-args@2.0.1: {} process-warning@1.0.0: {} @@ -16571,10 +17504,10 @@ snapshots: optionalDependencies: '@types/react': 18.3.23 - react-scripts@5.0.1(@babel/plugin-syntax-flow@7.27.1(@babel/core@7.27.7))(@babel/plugin-transform-react-jsx@7.27.1(@babel/core@7.27.7))(@types/babel__core@7.20.5)(react@18.2.0)(type-fest@0.21.3)(typescript@4.9.5): + react-scripts@5.0.1(@babel/plugin-syntax-flow@7.27.1(@babel/core@7.28.4))(@babel/plugin-transform-react-jsx@7.27.1(@babel/core@7.28.4))(@types/babel__core@7.20.5)(react@18.2.0)(type-fest@4.41.0)(typescript@4.9.5): dependencies: '@babel/core': 7.27.7 - '@pmmmwh/react-refresh-webpack-plugin': 0.5.17(react-refresh@0.11.0)(type-fest@0.21.3)(webpack-dev-server@4.15.2(webpack@5.100.2))(webpack@5.100.2) + '@pmmmwh/react-refresh-webpack-plugin': 0.5.17(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@4.15.2(webpack@5.100.2))(webpack@5.100.2) '@svgr/webpack': 5.5.0 babel-jest: 27.5.1(@babel/core@7.27.7) babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.100.2) @@ -16589,7 +17522,7 @@ snapshots: dotenv: 10.0.0 dotenv-expand: 5.1.0 eslint: 8.57.1 - eslint-config-react-app: 7.0.1(@babel/plugin-syntax-flow@7.27.1(@babel/core@7.27.7))(@babel/plugin-transform-react-jsx@7.27.1(@babel/core@7.27.7))(eslint@8.57.1)(jest@27.5.1)(typescript@4.9.5) + eslint-config-react-app: 7.0.1(@babel/plugin-syntax-flow@7.27.1(@babel/core@7.28.4))(@babel/plugin-transform-react-jsx@7.27.1(@babel/core@7.28.4))(eslint@8.57.1)(jest@27.5.1)(typescript@4.9.5) eslint-webpack-plugin: 3.2.0(eslint@8.57.1)(webpack@5.100.2) file-loader: 6.2.0(webpack@5.100.2) fs-extra: 10.1.0 @@ -16678,6 +17611,14 @@ snapshots: dependencies: pify: 2.3.0 + read-pkg@9.0.1: + dependencies: + '@types/normalize-package-data': 2.4.4 + normalize-package-data: 6.0.2 + parse-json: 8.3.0 + type-fest: 4.41.0 + unicorn-magic: 0.1.0 + read-yaml-file@1.1.0: dependencies: graceful-fs: 4.2.11 @@ -16923,6 +17864,8 @@ snapshots: dependencies: xmlchars: 2.2.0 + scale-ts@1.6.1: {} + scheduler@0.23.2: dependencies: loose-envify: 1.4.0 @@ -17119,7 +18062,14 @@ snapshots: slash@4.0.0: {} - smoldot@2.0.36: + smoldot@2.0.34: + dependencies: + ws: 8.18.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + smoldot@2.0.38: dependencies: ws: 8.18.3 transitivePeerDependencies: @@ -17141,6 +18091,10 @@ snapshots: dependencies: atomic-sleep: 1.0.0 + sort-keys@5.1.0: + dependencies: + is-plain-obj: 4.1.0 + source-list-map@2.0.1: {} source-map-js@1.2.1: {} @@ -17174,6 +18128,20 @@ snapshots: cross-spawn: 7.0.6 signal-exit: 4.1.0 + spdx-correct@3.2.0: + dependencies: + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.22 + + spdx-exceptions@2.5.0: {} + + spdx-expression-parse@3.0.1: + dependencies: + spdx-exceptions: 2.5.0 + spdx-license-ids: 3.0.22 + + spdx-license-ids@3.0.22: {} + spdy-transport@3.0.0: dependencies: debug: 4.4.1 @@ -17352,6 +18320,8 @@ snapshots: strip-final-newline@2.0.0: {} + strip-final-newline@4.0.0: {} + strip-indent@3.0.0: dependencies: min-indent: 1.0.1 @@ -17477,6 +18447,8 @@ snapshots: tailwindcss@4.1.11: {} + tailwindcss@4.1.12: {} + tapable@1.1.3: {} tapable@2.2.2: {} @@ -17560,8 +18532,8 @@ snapshots: tinyglobby@0.2.14: dependencies: - fdir: 6.4.6(picomatch@4.0.2) - picomatch: 4.0.2 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 tinypool@1.1.1: {} @@ -17622,6 +18594,10 @@ snapshots: ts-interface-checker@0.1.13: {} + tsc-prog@2.3.0(typescript@5.8.3): + dependencies: + typescript: 5.8.3 + tsconfig-paths@3.15.0: dependencies: '@types/json5': 0.0.29 @@ -17682,6 +18658,8 @@ snapshots: type-fest@0.21.3: {} + type-fest@4.41.0: {} + type-is@1.6.18: dependencies: media-typer: 0.3.0 @@ -17724,12 +18702,13 @@ snapshots: dependencies: is-typedarray: 1.0.0 - typescript-eslint@8.35.0(eslint@9.30.0(jiti@2.4.2))(typescript@5.8.3): + typescript-eslint@8.43.0(eslint@9.35.0(jiti@2.4.2))(typescript@5.8.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.35.0(@typescript-eslint/parser@8.35.0(eslint@9.30.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.30.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/parser': 8.35.0(eslint@9.30.0(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/utils': 8.35.0(eslint@9.30.0(jiti@2.4.2))(typescript@5.8.3) - eslint: 9.30.0(jiti@2.4.2) + '@typescript-eslint/eslint-plugin': 8.43.0(@typescript-eslint/parser@8.43.0(eslint@9.35.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.35.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/parser': 8.43.0(eslint@9.35.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/typescript-estree': 8.43.0(typescript@5.8.3) + '@typescript-eslint/utils': 8.43.0(eslint@9.35.0(jiti@2.4.2))(typescript@5.8.3) + eslint: 9.35.0(jiti@2.4.2) typescript: 5.8.3 transitivePeerDependencies: - supports-color @@ -17758,8 +18737,6 @@ snapshots: underscore@1.12.1: {} - undici-types@5.26.5: {} - undici-types@6.21.0: {} unicode-canonical-property-names-ecmascript@2.0.1: {} @@ -17773,6 +18750,10 @@ snapshots: unicode-property-aliases-ecmascript@2.1.0: {} + unicorn-magic@0.1.0: {} + + unicorn-magic@0.3.0: {} + unique-string@2.0.0: dependencies: crypto-random-string: 2.0.0 @@ -17861,6 +18842,11 @@ snapshots: convert-source-map: 1.9.0 source-map: 0.7.4 + validate-npm-package-license@3.0.4: + dependencies: + spdx-correct: 3.2.0 + spdx-expression-parse: 3.0.1 + vary@1.1.2: {} viem@2.31.0(typescript@5.8.3): @@ -17880,13 +18866,13 @@ snapshots: - utf-8-validate - zod - vite-node@3.2.4(@types/node@18.19.113)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.0): + vite-node@3.2.4(@types/node@20.19.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.0): dependencies: cac: 6.7.14 debug: 4.4.1 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 6.3.5(@types/node@18.19.113)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.0) + vite: 7.1.4(@types/node@20.19.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.0) transitivePeerDependencies: - '@types/node' - jiti @@ -17907,7 +18893,7 @@ snapshots: debug: 4.4.1 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 6.3.5(@types/node@22.15.21)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.0) + vite: 7.1.4(@types/node@22.15.21)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.0) transitivePeerDependencies: - '@types/node' - jiti @@ -17922,7 +18908,7 @@ snapshots: - tsx - yaml - vite@6.3.5(@types/node@18.19.113)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.0): + vite@6.3.5(@types/node@22.15.21)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.0): dependencies: esbuild: 0.25.5 fdir: 6.4.6(picomatch@4.0.2) @@ -17931,18 +18917,34 @@ snapshots: rollup: 4.44.1 tinyglobby: 0.2.14 optionalDependencies: - '@types/node': 18.19.113 + '@types/node': 22.15.21 fsevents: 2.3.3 jiti: 2.4.2 lightningcss: 1.30.1 terser: 5.43.1 yaml: 2.8.0 - vite@6.3.5(@types/node@22.15.21)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.0): + vite@7.1.4(@types/node@20.19.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.0): dependencies: esbuild: 0.25.5 - fdir: 6.4.6(picomatch@4.0.2) - picomatch: 4.0.2 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.44.1 + tinyglobby: 0.2.14 + optionalDependencies: + '@types/node': 20.19.0 + fsevents: 2.3.3 + jiti: 2.4.2 + lightningcss: 1.30.1 + terser: 5.43.1 + yaml: 2.8.0 + + vite@7.1.4(@types/node@22.15.21)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.0): + dependencies: + esbuild: 0.25.5 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 postcss: 8.5.6 rollup: 4.44.1 tinyglobby: 0.2.14 @@ -17954,11 +18956,11 @@ snapshots: terser: 5.43.1 yaml: 2.8.0 - vitest@3.2.4(@types/node@18.19.113)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.0): + vitest@3.2.4(@types/node@20.19.0)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.0): dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@6.3.5(@types/node@18.19.113)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.0)) + '@vitest/mocker': 3.2.4(vite@7.1.4(@types/node@20.19.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.0)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -17976,11 +18978,11 @@ snapshots: tinyglobby: 0.2.14 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 6.3.5(@types/node@18.19.113)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.0) - vite-node: 3.2.4(@types/node@18.19.113)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.0) + vite: 7.1.4(@types/node@20.19.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.0) + vite-node: 3.2.4(@types/node@20.19.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.0) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 18.19.113 + '@types/node': 20.19.0 jsdom: 26.1.0 transitivePeerDependencies: - jiti @@ -18000,7 +19002,7 @@ snapshots: dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@6.3.5(@types/node@22.15.21)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.0)) + '@vitest/mocker': 3.2.4(vite@7.1.4(@types/node@22.15.21)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.0)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -18018,7 +19020,7 @@ snapshots: tinyglobby: 0.2.14 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 6.3.5(@types/node@22.15.21)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.0) + vite: 7.1.4(@types/node@22.15.21)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.0) vite-node: 3.2.4(@types/node@22.15.21)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.0) why-is-node-running: 2.3.0 optionalDependencies: @@ -18422,6 +19424,26 @@ snapshots: signal-exit: 3.0.7 typedarray-to-buffer: 3.1.5 + write-file-atomic@5.0.1: + dependencies: + imurmurhash: 0.1.4 + signal-exit: 4.1.0 + + write-json-file@6.0.0: + dependencies: + detect-indent: 7.0.1 + is-plain-obj: 4.1.0 + sort-keys: 5.1.0 + write-file-atomic: 5.0.1 + + write-package@7.1.0: + dependencies: + deepmerge-ts: 7.1.5 + read-pkg: 9.0.1 + sort-keys: 5.1.0 + type-fest: 4.41.0 + write-json-file: 6.0.0 + ws@7.5.10: {} ws@8.18.2: {} @@ -18470,6 +19492,8 @@ snapshots: yocto-queue@0.1.0: {} + yoctocolors@2.1.2: {} + zustand@5.0.4(@types/react@18.2.55)(immer@9.0.21)(react@18.2.0): optionalDependencies: '@types/react': 18.2.55 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 687c46f..f1f380d 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -3,11 +3,12 @@ packages: - 'examples/*' catalog: + "@types/node": "20.19.0" "@types/react": "18.2.55" "@types/react-dom": "18.2.19" "react": "18.2.0" "react-dom": "18.2.0" "@tanstack/react-query": "5.81.5" - "dedot": "0.14.1" - "@dedot/chaintypes": "0.123.0" + "dedot": "0.16.0" + "@dedot/chaintypes": "0.152.0" "tsup": "8.5.0" diff --git a/tsconfig.json b/tsconfig.json index 13fa543..27a1752 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -10,9 +10,7 @@ "resolveJsonModule": true, "allowSyntheticDefaultImports": true, "baseUrl": ".", - "typeRoots": [ - "./node_modules/@types", - ], + "typeRoots": ["./node_modules/@types"], "verbatimModuleSyntax": false, "preserveSymlinks": true }, diff --git a/vitest.workspace.ts b/vitest.workspace.ts index c1efc9a..a971dee 100644 --- a/vitest.workspace.ts +++ b/vitest.workspace.ts @@ -1 +1 @@ -export default ["packages/*"]; +export default ['packages/*']; From 1941b992e9a7c58b72b81358531dd989efdf0e34 Mon Sep 17 00:00:00 2001 From: WBH <48749219+wbh1328551759@users.noreply.github.com> Date: Wed, 5 Nov 2025 12:22:38 +0800 Subject: [PATCH 35/45] Feat/assets list (#112) * feat(core): fix wsProvider & add subscan type * feat(ui): add AssetList * feat(with-vite): add subscan in config * fix(ui): fix default value in useSubscanTokens * Fix/lint (#107) Fix lint error * feat(ui): add recent account storage * chore: update pr-check ci * chore: lint code * feat(core): update subscan URLs and add API endpoints for Kusama, Paseo, Polkadot, and Westend * feat(ui): enhance AssetList with TokenList and NFTList components * feat(ui): remove test code * feat(ui): update text * feat(ui): update loading of Icon & add EmptyAsset status * fix: fix lint * Optimize the style of the token list and NFT list * feat(ui): add DefaultNFT icon & add new css variable of assetSelectItem * chore: fix lint * feat(ui): add refetch in switch assetList * chore: fix lint * chore: remove useless code * feat(ui): Add the prefix of luno to address the issue of CSS scoped * feat(ui): hidden scrollbar * chore(ui): remove useless code * fix: test --- .github/workflows/pr-check.yml | 3 + biome.json | 22 +- examples/with-vite/.env.example | 1 + examples/with-vite/package.json | 2 - examples/with-vite/src/App.tsx | 13 +- examples/with-vite/src/main.tsx | 67 +++++ examples/with-vite/src/vite-env.d.ts | 8 + examples/with-vite/stagewise.json | 6 + extensions.json | 3 - package.json | 6 +- packages/core/src/chains/kusama.ts | 16 ++ packages/core/src/chains/paseo.ts | 8 + packages/core/src/chains/polkadot.ts | 20 ++ packages/core/src/chains/westend.ts | 8 + packages/core/src/config/createConfig.test.ts | 6 +- packages/core/src/config/createConfig.ts | 5 +- packages/core/src/config/providers.ts | 4 +- packages/core/src/connectors/walletconnect.ts | 2 +- packages/core/src/types/chain.ts | 8 +- packages/core/src/types/config.ts | 12 +- packages/react/src/constants.ts | 2 + .../react/src/context/LunoProvider.test.tsx | 1 - packages/react/src/hooks/useConnect.ts | 4 +- .../react/src/hooks/useDisconnect.test.ts | 2 +- packages/react/src/hooks/useDisconnect.ts | 6 +- .../src/hooks/useEstimatePaymentInfo.test.ts | 6 +- .../react/src/hooks/useEstimatePaymentInfo.ts | 4 +- packages/react/src/hooks/useLuno.ts | 2 +- .../src/hooks/useSendTransaction.test.ts | 6 +- .../react/src/hooks/useSendTransaction.ts | 9 +- .../react/src/hooks/useSubscription.test.ts | 4 +- .../react/src/hooks/useSwitchChain.test.ts | 2 +- packages/react/src/hooks/useSwitchChain.ts | 4 +- .../react/src/store/createLunoStore.test.ts | 51 +--- packages/react/src/store/createLunoStore.ts | 114 ++------ packages/ui/src/assets/icons/Arrow.tsx | 1 - packages/ui/src/assets/icons/Back.tsx | 1 - packages/ui/src/assets/icons/Close.tsx | 1 - packages/ui/src/assets/icons/Coin.tsx | 41 +++ packages/ui/src/assets/icons/Copy.tsx | 1 - packages/ui/src/assets/icons/DefaultNFT.tsx | 25 ++ packages/ui/src/assets/icons/Disconnect.tsx | 1 - packages/ui/src/assets/icons/EmptyWallet.tsx | 23 ++ packages/ui/src/assets/icons/Link.tsx | 18 ++ packages/ui/src/assets/icons/List.tsx | 1 - packages/ui/src/assets/icons/Search.tsx | 2 +- packages/ui/src/assets/icons/Success.tsx | 1 - packages/ui/src/assets/icons/Switch.tsx | 1 - packages/ui/src/assets/icons/index.ts | 6 +- .../AccountDetailsModal/AssetListView.tsx | 16 ++ .../AccountDetailsModal/MainView.tsx | 162 ++++++----- .../AccountDetailsModal/SwitchAccountView.tsx | 30 +- .../AccountDetailsModal/SwitchChainView.tsx | 2 +- .../components/AccountDetailsModal/index.tsx | 40 +-- .../src/components/AssetList/EmptyAsset.tsx | 17 ++ .../ui/src/components/AssetList/NFTList.tsx | 131 +++++++++ .../ui/src/components/AssetList/TokenList.tsx | 110 ++++++++ .../ui/src/components/AssetList/index.tsx | 44 +++ .../ui/src/components/ChainIcon/index.tsx | 32 --- .../ui/src/components/ChainList/index.tsx | 58 ++-- .../ui/src/components/ChainModal/index.tsx | 14 +- .../ui/src/components/ConnectButton/index.tsx | 47 ++- .../ConnectModal/ConnectOptions.tsx | 46 +-- .../components/ConnectModal/WalletView.tsx | 56 ++-- .../ui/src/components/ConnectModal/index.tsx | 42 ++- packages/ui/src/components/Copy/index.tsx | 8 +- packages/ui/src/components/Dialog/index.tsx | 22 +- packages/ui/src/components/Icon/index.tsx | 61 ++++ packages/ui/src/components/QRCode/index.tsx | 16 +- .../src/components/SpiralAnimation/index.tsx | 2 +- packages/ui/src/hooks/useAnimatedViews.ts | 2 +- .../ui/src/hooks/useCSSVariableInjection.ts | 3 + packages/ui/src/hooks/useSubscanTokens.ts | 127 +++++++++ packages/ui/src/providers/LunoKitProvider.tsx | 2 +- packages/ui/src/styles/base.css | 71 ++--- packages/ui/src/theme/context.tsx | 4 +- packages/ui/src/theme/types.ts | 4 + pnpm-lock.yaml | 267 +++++++++++------- 78 files changed, 1348 insertions(+), 648 deletions(-) create mode 100644 examples/with-vite/stagewise.json delete mode 100644 extensions.json create mode 100644 packages/ui/src/assets/icons/Coin.tsx create mode 100644 packages/ui/src/assets/icons/DefaultNFT.tsx create mode 100644 packages/ui/src/assets/icons/EmptyWallet.tsx create mode 100644 packages/ui/src/assets/icons/Link.tsx create mode 100644 packages/ui/src/components/AccountDetailsModal/AssetListView.tsx create mode 100644 packages/ui/src/components/AssetList/EmptyAsset.tsx create mode 100644 packages/ui/src/components/AssetList/NFTList.tsx create mode 100644 packages/ui/src/components/AssetList/TokenList.tsx create mode 100644 packages/ui/src/components/AssetList/index.tsx delete mode 100644 packages/ui/src/components/ChainIcon/index.tsx create mode 100644 packages/ui/src/components/Icon/index.tsx create mode 100644 packages/ui/src/hooks/useSubscanTokens.ts diff --git a/.github/workflows/pr-check.yml b/.github/workflows/pr-check.yml index d63850b..421e9b9 100644 --- a/.github/workflows/pr-check.yml +++ b/.github/workflows/pr-check.yml @@ -51,6 +51,9 @@ jobs: - name: Run tests with coverage run: pnpm run test:coverage + - name: Run lint checks + run: pnpm run lint + - name: Upload coverage to Codecov if: github.ref == 'refs/heads/main' uses: codecov/codecov-action@v5 diff --git a/biome.json b/biome.json index 3e6a46c..736d7c8 100644 --- a/biome.json +++ b/biome.json @@ -21,14 +21,28 @@ "rules": { "recommended": true, "correctness": { - "noUnusedVariables": "error" + "noUnusedVariables": "off", + "useExhaustiveDependencies": "off", + "noUnusedFunctionParameters": "off" }, "style": { - "noNonNullAssertion": "warn" + "noNonNullAssertion": "off" }, "suspicious": { - "noExplicitAny": "warn", - "noTsIgnore": "off" + "noExplicitAny": "off", + "noTsIgnore": "off", + "noUnknownAtRules": "off" + }, + "complexity": { + "noUselessConstructor": "off" + }, + "a11y": { + "useAltText": "off", + "noSvgWithoutTitle": "off", + "useButtonType": "off", + "useKeyWithClickEvents": "off", + "noStaticElementInteractions": "off", + "useSemanticElements": "off" } } }, diff --git a/examples/with-vite/.env.example b/examples/with-vite/.env.example index 0c67a58..3702198 100644 --- a/examples/with-vite/.env.example +++ b/examples/with-vite/.env.example @@ -1 +1,2 @@ VITE_WALLET_CONNECT_ID=xxx +VITE_SUBSCAN_API_KEY=xxx diff --git a/examples/with-vite/package.json b/examples/with-vite/package.json index 1946259..1fa31ab 100644 --- a/examples/with-vite/package.json +++ b/examples/with-vite/package.json @@ -12,8 +12,6 @@ "dependencies": { "@luno-kit/react": "workspace:*", "@luno-kit/ui": "workspace:*", - "@stagewise-plugins/react": "^0.5.1", - "@stagewise/toolbar-react": "^0.5.1", "@tanstack/react-query": "catalog:", "react": "catalog:", "react-dom": "catalog:" diff --git a/examples/with-vite/src/App.tsx b/examples/with-vite/src/App.tsx index 40ace55..477f4eb 100644 --- a/examples/with-vite/src/App.tsx +++ b/examples/with-vite/src/App.tsx @@ -7,18 +7,16 @@ import { useChain, useChains, useDisconnect, + useEstimatePaymentInfo, useSendTransaction, useSignMessage, useStatus, useSwitchChain, - useEstimatePaymentInfo, } from '@luno-kit/react'; import { ConnectButton, useLunoTheme } from '@luno-kit/ui'; import type React from 'react'; import { useEffect, useState } from 'react'; import './App.css'; -import { StagewiseToolbar } from '@stagewise/toolbar-react'; -import ReactPlugin from '@stagewise-plugins/react'; const App: React.FC = () => { const status = useStatus(); @@ -39,7 +37,6 @@ const App: React.FC = () => { const { api, isApiReady, apiError } = useApi(); const { data: paymentInfo, estimate, isLoading: isEstimating } = useEstimatePaymentInfo(); - console.log('paymentInfo', paymentInfo); const { themeMode, setThemeChoice } = useLunoTheme(); const [transferForm, setTransferForm] = useState({ @@ -119,10 +116,7 @@ const App: React.FC = () => { }, []); return ( - <> - {/* Render only in the development environment StagewiseToolbar */} - -
+
{/* Hero Section */}
@@ -134,7 +128,7 @@ const App: React.FC = () => { The modern Polkadot wallet connection library for React applications

-
+
{/*
*/} @@ -431,7 +425,6 @@ const App: React.FC = () => {
- ); }; diff --git a/examples/with-vite/src/main.tsx b/examples/with-vite/src/main.tsx index 1c2490e..b0973bc 100644 --- a/examples/with-vite/src/main.tsx +++ b/examples/with-vite/src/main.tsx @@ -3,6 +3,7 @@ import { createRoot } from 'react-dom/client'; import './index.css'; import { createConfig } from '@luno-kit/react'; import { + type Chain, kusama, kusamaAssetHub, kusamaCoretime, @@ -45,6 +46,67 @@ const connectors = [ novaConnector({ projectId: import.meta.env.VITE_WALLET_CONNECT_ID }), ]; +// Custom chains +const astar: Chain = { + genesisHash: '0x9eb76c5184c4ab8679d2d5d819fdf90b9c001403e9e17da2e14b6d8aec4029c6', + name: 'Astar', + nativeCurrency: { name: 'Astar', symbol: 'ASTR', decimals: 18 }, + rpcUrls: { + webSocket: [ + 'wss://astar.api.onfinality.io/public-ws', + 'wss://astar-rpc.dwellir.com', + 'wss://astar.public.curie.radiumblock.co/ws', + 'wss://1rpc.io/astr', + ], + http: [ + 'https://astar.api.onfinality.io/public', + 'https://astar-rpc.dwellir.com', + 'https://astar.public.curie.radiumblock.co/http', + 'https://astar.public.blastapi.io', + ], + }, + ss58Format: 5, + blockExplorers: { + default: { name: 'Subscan', url: 'https://astar.subscan.io' }, + }, + chainIconUrl: 'https://astar.subscan.io/_next/image?url=%2Fchains%2Fastar%2Flogo-mini.png&w=256&q=75', + testnet: false, + subscan: { + url: 'https://astar.subscan.io', + api: 'https://astar.api.subscan.io', + }, +}; + +const hydration: Chain = { + genesisHash: '0xafdc188f45c71dacbaa0b62e16a91f726c7b8699a9748cdf715459de6b7f366d', + name: 'Hydration', + nativeCurrency: { name: 'Hydration', symbol: 'HDX', decimals: 12 }, + rpcUrls: { + webSocket: [ + 'wss://hydradx-rpc.dwellir.com', + 'wss://rpc.hydradx.cloud', + 'wss://hydradx.api.onfinality.io/public-ws', + 'wss://rpc.helikon.io/hydradx', + ], + http: [ + 'https://hydradx-rpc.dwellir.com', + 'https://rpc.hydradx.cloud', + 'https://hydradx.api.onfinality.io/public', + 'https://rpc.helikon.io/hydradx', + ], + }, + ss58Format: 63, + blockExplorers: { + default: { name: 'Subscan', url: 'https://hydradx.subscan.io' }, + }, + chainIconUrl: 'https://hydration.subscan.io/_next/image?url=%2Fchains%2Fhydration%2Ftokens%2FHDX.png&w=128&q=75', + testnet: false, + subscan: { + url: 'https://hydradx.subscan.io', + api: 'https://hydradx.api.subscan.io', + }, +}; + const lunoConfig = createConfig({ appName: 'luno with-vite example', chains: [ @@ -52,6 +114,8 @@ const lunoConfig = createConfig({ kusama, westend, paseo, + astar, + hydration, polkadotAssetHub, polkadotCoretime, polkadotCollectives, @@ -65,6 +129,9 @@ const lunoConfig = createConfig({ ], connectors: connectors, autoConnect: true, + subscan: { + apiKey: import.meta.env.VITE_SUBSCAN_API_KEY, + }, }); createRoot(document.getElementById('root')!).render( diff --git a/examples/with-vite/src/vite-env.d.ts b/examples/with-vite/src/vite-env.d.ts index 11f02fe..608fda5 100644 --- a/examples/with-vite/src/vite-env.d.ts +++ b/examples/with-vite/src/vite-env.d.ts @@ -1 +1,9 @@ /// + +interface ImportMetaEnv { + readonly VITE_SUBSCAN_API_KEY: string +} + +interface ImportMeta { + readonly env: ImportMetaEnv +} diff --git a/examples/with-vite/stagewise.json b/examples/with-vite/stagewise.json new file mode 100644 index 0000000..5392d13 --- /dev/null +++ b/examples/with-vite/stagewise.json @@ -0,0 +1,6 @@ +{ + "port": 3100, + "appPort": 3000, + "autoPlugins": true, + "plugins": [] +} \ No newline at end of file diff --git a/extensions.json b/extensions.json deleted file mode 100644 index 86a7319..0000000 --- a/extensions.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "recommendations": ["stagewise.stagewise-vscode-extension"] -} diff --git a/package.json b/package.json index c5f7703..280a1ae 100644 --- a/package.json +++ b/package.json @@ -10,12 +10,12 @@ "test:coverage": "vitest run --coverage", "changeset": "changeset", "publish": "pnpm clean && pnpm build && changeset publish", - "lint": "biome check .", - "lint:fix": "biome check --write .", + "lint": "biome check ./packages", + "lint:fix": "biome check --write ./packages", "format": "biome format --write ." }, "devDependencies": { - "@biomejs/biome": "2.2.4", + "@biomejs/biome": "2.2.6", "@changesets/cli": "^2.29.2", "@vitest/coverage-v8": "3.2.4", "eslint": "^8.56.0", diff --git a/packages/core/src/chains/kusama.ts b/packages/core/src/chains/kusama.ts index 9275084..58e3839 100644 --- a/packages/core/src/chains/kusama.ts +++ b/packages/core/src/chains/kusama.ts @@ -17,6 +17,10 @@ export const kusama: Chain = { blockExplorers: { default: { name: 'Subscan', url: 'https://kusama.subscan.io' } }, chainIconUrl: kusamaChain, testnet: false, + subscan: { + url: 'https://kusama.subscan.io', + api: 'https://kusama.api.subscan.io', + }, }; export const kusamaAssetHub: Chain = { @@ -33,6 +37,10 @@ export const kusamaAssetHub: Chain = { blockExplorers: { default: { name: 'Subscan', url: 'https://assethub-kusama.subscan.io' } }, chainIconUrl: assethubKusamaChain, testnet: false, + subscan: { + url: 'https://assethub-kusama.subscan.io', + api: 'https://assethub-kusama.api.subscan.io', + }, }; export const kusamaPeople: Chain = { @@ -46,6 +54,10 @@ export const kusamaPeople: Chain = { blockExplorers: { default: { name: 'Subscan', url: 'https://people-kusama.subscan.io' } }, chainIconUrl: peopleKusamaChain, testnet: false, + subscan: { + url: 'https://people-kusama.subscan.io', + api: 'https://people-kusama.api.subscan.io', + }, }; export const kusamaCoretime: Chain = { @@ -59,4 +71,8 @@ export const kusamaCoretime: Chain = { blockExplorers: { default: { name: 'Subscan', url: 'https://coretime-kusama.subscan.io' } }, chainIconUrl: coretimeKusamaChain, testnet: false, + subscan: { + url: 'https://coretime-kusama.subscan.io', + api: 'https://coretime-kusama.api.subscan.io', + }, }; diff --git a/packages/core/src/chains/paseo.ts b/packages/core/src/chains/paseo.ts index ef974c0..73dd496 100644 --- a/packages/core/src/chains/paseo.ts +++ b/packages/core/src/chains/paseo.ts @@ -10,6 +10,10 @@ export const paseo: Chain = { blockExplorers: { default: { name: 'Subscan', url: 'https://paseo.subscan.io/' } }, chainIconUrl: paseoChain, testnet: true, + subscan: { + url: 'https://paseo.subscan.io', + api: 'https://paseo.api.subscan.io', + }, }; export const paseoAssetHub: Chain = { @@ -23,6 +27,10 @@ export const paseoAssetHub: Chain = { blockExplorers: { default: { name: 'Subscan', url: 'https://assethub-paseo.subscan.io' } }, chainIconUrl: assethubPaseoChain, testnet: true, + subscan: { + url: 'https://assethub-paseo.subscan.io', + api: 'https://assethub-paseo.api.subscan.io', + }, }; export const paseoPassetHub: Chain = { diff --git a/packages/core/src/chains/polkadot.ts b/packages/core/src/chains/polkadot.ts index 4ca0b54..bfe2b6f 100644 --- a/packages/core/src/chains/polkadot.ts +++ b/packages/core/src/chains/polkadot.ts @@ -19,6 +19,10 @@ export const polkadot: Chain = { blockExplorers: { default: { name: 'Subscan', url: 'https://polkadot.subscan.io' } }, chainIconUrl: polkadotChain, testnet: false, + subscan: { + url: 'https://polkadot.subscan.io', + api: 'https://polkadot.api.subscan.io', + }, }; export const polkadotAssetHub: Chain = { @@ -36,6 +40,10 @@ export const polkadotAssetHub: Chain = { blockExplorers: { default: { name: 'Subscan', url: 'https://assethub-polkadot.subscan.io' } }, chainIconUrl: assethubChain, testnet: false, + subscan: { + url: 'https://assethub-polkadot.subscan.io', + api: 'https://assethub-polkadot.api.subscan.io', + }, }; export const polkadotPeople: Chain = { @@ -50,6 +58,10 @@ export const polkadotPeople: Chain = { blockExplorers: { default: { name: 'Subscan', url: 'https://people-polkadot.subscan.io' } }, chainIconUrl: peopleChain, testnet: false, + subscan: { + url: 'https://people-polkadot.subscan.io', + api: 'https://people-polkadot.api.subscan.io', + }, }; export const polkadotCoretime: Chain = { @@ -67,6 +79,10 @@ export const polkadotCoretime: Chain = { blockExplorers: { default: { name: 'Subscan', url: 'https://coretime-polkadot.subscan.io' } }, chainIconUrl: coretimeChain, testnet: false, + subscan: { + url: 'https://coretime-polkadot.subscan.io', + api: 'https://coretime-polkadot.api.subscan.io', + }, }; export const polkadotCollectives: Chain = { @@ -84,4 +100,8 @@ export const polkadotCollectives: Chain = { blockExplorers: { default: { name: 'Subscan', url: 'https://collectives-polkadot.subscan.io' } }, chainIconUrl: collectivesChain, testnet: false, + subscan: { + url: 'https://collectives-polkadot.subscan.io', + api: 'https://collectives-polkadot.api.subscan.io', + }, }; diff --git a/packages/core/src/chains/westend.ts b/packages/core/src/chains/westend.ts index 4e913a4..fe10bd1 100644 --- a/packages/core/src/chains/westend.ts +++ b/packages/core/src/chains/westend.ts @@ -10,6 +10,10 @@ export const westend: Chain = { blockExplorers: { default: { name: 'Subscan', url: 'https://westend.subscan.io' } }, chainIconUrl: westendChain, testnet: true, + subscan: { + url: 'https://westend.subscan.io', + api: 'https://westend.api.subscan.io', + }, }; export const westendAssetHub: Chain = { @@ -26,4 +30,8 @@ export const westendAssetHub: Chain = { blockExplorers: { default: { name: 'Subscan', url: 'https://assethub-westend.subscan.io' } }, chainIconUrl: assethubWestendChain, testnet: true, + subscan: { + url: 'https://assethub-westend.subscan.io', + api: 'https://assethub-westend.api.subscan.io', + }, }; diff --git a/packages/core/src/config/createConfig.test.ts b/packages/core/src/config/createConfig.test.ts index 47e4db0..183fd8d 100644 --- a/packages/core/src/config/createConfig.test.ts +++ b/packages/core/src/config/createConfig.test.ts @@ -78,7 +78,7 @@ describe('createConfig', () => { }), ], transports: { - [polkadot.genesisHash]: polkadot.rpcUrls.webSocket![0], + [polkadot.genesisHash]: polkadot.rpcUrls.webSocket, }, storage: expect.any(Object), autoConnect: true, @@ -175,7 +175,7 @@ describe('createConfig', () => { const config = createConfig(params); - expect(config.transports[polkadot.genesisHash]).toBe(polkadot.rpcUrls.webSocket![0]); + expect(config.transports[polkadot.genesisHash]).toBe(polkadot.rpcUrls.webSocket); }); it('should warn when chain has no WebSocket URL', () => { @@ -211,7 +211,7 @@ describe('createConfig', () => { const config = createConfig(params); expect(config.transports).toEqual({ - [chainWithWs.genesisHash]: polkadot.rpcUrls.webSocket![0], + [chainWithWs.genesisHash]: polkadot.rpcUrls.webSocket, [chainWithoutWs.genesisHash]: 'wss://fallback.endpoint.com', }); }); diff --git a/packages/core/src/config/createConfig.ts b/packages/core/src/config/createConfig.ts index e5aabea..8ccd741 100644 --- a/packages/core/src/config/createConfig.ts +++ b/packages/core/src/config/createConfig.ts @@ -23,7 +23,7 @@ function generateTransportsFromChains(chains: readonly Chain[]): Record = {}; for (const chain of chains) { - const wsUrl = chain.rpcUrls.webSocket?.[0]; + const wsUrl = chain.rpcUrls.webSocket; if (wsUrl) { transports[chain.genesisHash] = wsUrl; } else { @@ -49,6 +49,7 @@ export function createConfig(parameters: CreateConfigParameters): Config { scaledResponses, customTypes, customRpc, + subscan, } = parameters; if (!connectors || connectors.length === 0) { @@ -84,6 +85,8 @@ export function createConfig(parameters: CreateConfigParameters): Config { transports: Object.freeze({ ...finalTransports }) as Readonly>, storage, autoConnect, + + subscan, }; console.log('[createConfig]: Luno Core Config created:', config); diff --git a/packages/core/src/config/providers.ts b/packages/core/src/config/providers.ts index 56271be..6e00853 100644 --- a/packages/core/src/config/providers.ts +++ b/packages/core/src/config/providers.ts @@ -6,8 +6,8 @@ import type { Transport } from '../types'; * @param url - WebSocket RPC URL or URL array (for fallback). * @returns WsProvider instance. */ -export function wsProvider(url: string | string[]): WsProvider { - return new WsProvider(url); +export function wsProvider(url: Transport): WsProvider { + return new WsProvider(url as string[]); } export type { Transport }; diff --git a/packages/core/src/connectors/walletconnect.ts b/packages/core/src/connectors/walletconnect.ts index 9f5cff9..551e17d 100644 --- a/packages/core/src/connectors/walletconnect.ts +++ b/packages/core/src/connectors/walletconnect.ts @@ -1,4 +1,4 @@ -import { type SessionTypes, SignClientTypes } from '@walletconnect/types'; +import type { SessionTypes } from '@walletconnect/types'; import type { IUniversalProvider, Metadata } from '@walletconnect/universal-provider'; import type { SignerPayloadJSON, SignerPayloadRaw, SignerResult } from 'dedot/types'; import { walletconnectWallet } from '../config/logos/generated'; diff --git a/packages/core/src/types/chain.ts b/packages/core/src/types/chain.ts index cc179f3..bc87deb 100644 --- a/packages/core/src/types/chain.ts +++ b/packages/core/src/types/chain.ts @@ -1,4 +1,5 @@ import type { HexString } from './account'; +import type { Transport } from './config'; export interface Chain { genesisHash: HexString; @@ -12,7 +13,7 @@ export interface Chain { }; rpcUrls: { - webSocket: readonly string[]; + webSocket: Transport; http?: readonly string[]; }; @@ -26,4 +27,9 @@ export interface Chain { testnet: boolean; chainIconUrl: string; + + subscan?: { + api: string; + url: string; + }; } diff --git a/packages/core/src/types/config.ts b/packages/core/src/types/config.ts index 2a716ec..932687d 100644 --- a/packages/core/src/types/config.ts +++ b/packages/core/src/types/config.ts @@ -16,7 +16,7 @@ export interface LunoStorage { } // export type Transport = WsProvider; -export type Transport = string; +export type Transport = Readonly; type LunoApiOptions = Partial> & { customTypes?: Record; @@ -31,6 +31,11 @@ export interface CreateConfigParameters extends LunoApiOptions { storage?: LunoStorage; autoConnect?: boolean; + subscan?: { + apiKey: string; + cacheTime?: number; + retryCount?: number; + }; } export interface Config extends LunoApiOptions { @@ -40,4 +45,9 @@ export interface Config extends LunoApiOptions { readonly transports: Readonly>; readonly storage: LunoStorage; readonly autoConnect: boolean; + readonly subscan?: { + apiKey: string; + cacheTime?: number; + retryCount?: number; + }; } diff --git a/packages/react/src/constants.ts b/packages/react/src/constants.ts index b88eaad..5231932 100644 --- a/packages/react/src/constants.ts +++ b/packages/react/src/constants.ts @@ -2,4 +2,6 @@ export const PERSIST_KEY = { LAST_CONNECTOR_ID: 'lastConnectorId', LAST_CHAIN_ID: 'lastChainId', LAST_SELECTED_ACCOUNT_INFO: 'lastSelectedAccountInfo', + RECENT_SELECTED_ACCOUNT_INFO: 'recentSelectedAccountInfo', + RECENT_CONNECTOR_ID: 'recentConnectorId', } as const; diff --git a/packages/react/src/context/LunoProvider.test.tsx b/packages/react/src/context/LunoProvider.test.tsx index 2b787c9..9fec4e1 100644 --- a/packages/react/src/context/LunoProvider.test.tsx +++ b/packages/react/src/context/LunoProvider.test.tsx @@ -2,7 +2,6 @@ import { createConfig } from '@luno-kit/core'; import { BaseConnector } from '@luno-kit/core/connectors'; import type { Chain, Config } from '@luno-kit/core/types'; import { render, waitFor } from '@testing-library/react'; -import React from 'react'; import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; import { useIsInitialized } from '../hooks/useIsInitialized'; import { useLunoStore } from '../store'; diff --git a/packages/react/src/hooks/useConnect.ts b/packages/react/src/hooks/useConnect.ts index 681e4e2..ef20ea3 100644 --- a/packages/react/src/hooks/useConnect.ts +++ b/packages/react/src/hooks/useConnect.ts @@ -16,7 +16,7 @@ export interface UseConnectResult { connectors: Connector[]; activeConnector?: Connector; status: ConnectionStatus; - data: void | undefined; + data: undefined; error: Error | null; isError: boolean; isIdle: boolean; @@ -45,7 +45,7 @@ export const useConnect = (hookLevelConfig?: UseConnectOptions): UseConnectResul connectors: config?.connectors ? [...config.connectors] : [], activeConnector, status, - data: mutationResult.data, + data: mutationResult.data as undefined, error: mutationResult.error, isError: mutationResult.isError, isIdle: mutationResult.isIdle, diff --git a/packages/react/src/hooks/useDisconnect.test.ts b/packages/react/src/hooks/useDisconnect.test.ts index eb8a6c0..8aae9a0 100644 --- a/packages/react/src/hooks/useDisconnect.test.ts +++ b/packages/react/src/hooks/useDisconnect.test.ts @@ -1,5 +1,5 @@ import { act, waitFor } from '@testing-library/react'; -import { afterEach, beforeEach, expect, test } from 'vitest'; +import { afterEach, expect, test } from 'vitest'; import { type MockConnector, mockConfig, renderHook } from '../test-utils'; import { ConnectionStatus } from '../types'; import { useAccount } from './useAccount'; diff --git a/packages/react/src/hooks/useDisconnect.ts b/packages/react/src/hooks/useDisconnect.ts index 3a15c45..25ebf82 100644 --- a/packages/react/src/hooks/useDisconnect.ts +++ b/packages/react/src/hooks/useDisconnect.ts @@ -8,14 +8,13 @@ export interface UseDisconnectResult { disconnect: (options?: UseDisconnectOptions) => void; disconnectAsync: (options?: UseDisconnectOptions) => Promise; status: ConnectionStatus; - data: void | undefined; + data: undefined; error: Error | null; isError: boolean; isIdle: boolean; isPending: boolean; isSuccess: boolean; reset: () => void; - variables: void | undefined; } export const useDisconnect = (hookLevelConfig?: UseDisconnectOptions): UseDisconnectResult => { @@ -32,13 +31,12 @@ export const useDisconnect = (hookLevelConfig?: UseDisconnectOptions): UseDiscon disconnectAsync: (options?: UseDisconnectOptions) => mutationResult.mutateAsync(undefined, options), status, - data: mutationResult.data, + data: mutationResult.data as undefined, error: mutationResult.error, isError: mutationResult.isError, isIdle: mutationResult.isIdle, isPending: mutationResult.isPending, isSuccess: mutationResult.isSuccess, reset: mutationResult.reset, - variables: mutationResult.variables, }; }; diff --git a/packages/react/src/hooks/useEstimatePaymentInfo.test.ts b/packages/react/src/hooks/useEstimatePaymentInfo.test.ts index 5defef8..c714de6 100644 --- a/packages/react/src/hooks/useEstimatePaymentInfo.test.ts +++ b/packages/react/src/hooks/useEstimatePaymentInfo.test.ts @@ -1,15 +1,15 @@ import { act, waitFor } from '@testing-library/react'; import { afterEach, expect, test, vi } from 'vitest'; import { type MockConnector, mockConfig, renderHook } from '../test-utils'; -import { useEstimatePaymentInfo } from './useEstimatePaymentInfo'; -import { useConnect } from './useConnect'; import { ConnectionStatus } from '../types'; +import { useConnect } from './useConnect'; +import { useEstimatePaymentInfo } from './useEstimatePaymentInfo'; const connector = mockConfig.connectors[0] as MockConnector; vi.mock('@luno-kit/core/utils', () => ({ formatBalance: vi.fn((value: bigint, decimals: number) => { - return `${(Number(value) / Math.pow(10, decimals)).toFixed(4)}`; + return `${(Number(value) / 10 ** decimals).toFixed(4)}`; }), })); diff --git a/packages/react/src/hooks/useEstimatePaymentInfo.ts b/packages/react/src/hooks/useEstimatePaymentInfo.ts index e5a6a5e..292f77e 100644 --- a/packages/react/src/hooks/useEstimatePaymentInfo.ts +++ b/packages/react/src/hooks/useEstimatePaymentInfo.ts @@ -1,7 +1,7 @@ -import { useCallback, useState } from 'react'; +import { formatBalance } from '@luno-kit/core/utils'; import type { ISubmittableExtrinsic, TxPaymentInfo } from 'dedot/types'; +import { useCallback, useState } from 'react'; import { useLuno } from './useLuno'; -import { formatBalance } from '@luno-kit/core/utils'; interface PaymentInfo extends TxPaymentInfo { partialFeeFormatted: string; diff --git a/packages/react/src/hooks/useLuno.ts b/packages/react/src/hooks/useLuno.ts index b4bdba8..e3fa269 100644 --- a/packages/react/src/hooks/useLuno.ts +++ b/packages/react/src/hooks/useLuno.ts @@ -1,4 +1,4 @@ -import React, { useContext } from 'react'; +import { useContext } from 'react'; import { LunoContext, type LunoContextState } from '../context/LunoContext'; export const useLuno = (): LunoContextState => { diff --git a/packages/react/src/hooks/useSendTransaction.test.ts b/packages/react/src/hooks/useSendTransaction.test.ts index cee1f95..8d800d8 100644 --- a/packages/react/src/hooks/useSendTransaction.test.ts +++ b/packages/react/src/hooks/useSendTransaction.test.ts @@ -32,7 +32,7 @@ afterEach(async () => { test('useSendTransaction', async () => { let resolveSignAndSend: (value: any) => void; - let statusCallback: Function; + let statusCallback: any; mockExtrinsic.signAndSend.mockImplementation((address, { signer }, callback) => { statusCallback = callback; @@ -89,7 +89,7 @@ test('useSendTransaction', async () => { test('should handle transaction error states', async () => { let resolveSignAndSend: (value: any) => void; - let statusCallback: Function; + let statusCallback: any; mockExtrinsic.signAndSend.mockImplementation((address, { signer }, callback) => { statusCallback = callback; @@ -123,7 +123,7 @@ test('should handle transaction error states', async () => { .sendTransactionAsync({ extrinsic: mockExtrinsic, }) - .catch((e) => {}); + .catch((_e) => {}); await waitFor(() => { expect(mockExtrinsic.signAndSend).toHaveBeenCalled(); diff --git a/packages/react/src/hooks/useSendTransaction.ts b/packages/react/src/hooks/useSendTransaction.ts index 1cac8ee..ed9edd3 100644 --- a/packages/react/src/hooks/useSendTransaction.ts +++ b/packages/react/src/hooks/useSendTransaction.ts @@ -106,14 +106,7 @@ export function useSendTransaction( .signAndSend( account.address, { signer }, - ({ - status, - dispatchError, - events, - dispatchInfo, - txHash, - txIndex, - }: ISubmittableResult) => { + ({ status, dispatchError, events, dispatchInfo, txHash }: ISubmittableResult) => { const resolveAndUnsubscribe = (receipt: TransactionReceipt) => { if (unsubscribe) unsubscribe(); resolve(receipt); diff --git a/packages/react/src/hooks/useSubscription.test.ts b/packages/react/src/hooks/useSubscription.test.ts index 984e705..2a4f1e0 100644 --- a/packages/react/src/hooks/useSubscription.test.ts +++ b/packages/react/src/hooks/useSubscription.test.ts @@ -87,9 +87,9 @@ describe('useSubscription', () => { factory: (api) => api.query.system.account, params: ['5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY'], options: { - transform: (data) => ({ + transform: (data: string) => ({ free: data, - formatted: `${parseInt(data) / 10 ** 10} DOT`, + formatted: `${parseInt(data, 10) / 10 ** 10} DOT`, }), }, }), diff --git a/packages/react/src/hooks/useSwitchChain.test.ts b/packages/react/src/hooks/useSwitchChain.test.ts index a6ac975..80691b2 100644 --- a/packages/react/src/hooks/useSwitchChain.test.ts +++ b/packages/react/src/hooks/useSwitchChain.test.ts @@ -11,7 +11,7 @@ const connector = mockConfig.connectors[0] as MockConnector; vi.mock('../utils', () => ({ createApi: vi.fn().mockResolvedValue(null), - sleep: vi.fn().mockImplementation((ms = 1000) => Promise.resolve()), + sleep: vi.fn().mockImplementation((_ms = 1000) => Promise.resolve()), })); afterEach(async () => { diff --git a/packages/react/src/hooks/useSwitchChain.ts b/packages/react/src/hooks/useSwitchChain.ts index 25c2d59..2c688a4 100644 --- a/packages/react/src/hooks/useSwitchChain.ts +++ b/packages/react/src/hooks/useSwitchChain.ts @@ -17,7 +17,7 @@ export interface UseSwitchChainResult { chains: Chain[]; currentChain?: Chain; currentChainId?: string; - data: void | undefined; + data: undefined; error: Error | null; isError: boolean; isIdle: boolean; @@ -45,7 +45,7 @@ export const useSwitchChain = (hookLevelConfig?: UseSwitchChainOptions): UseSwit chains: config?.chains ? [...config.chains] : [], currentChain, currentChainId, - data: mutationResult.data, + data: mutationResult.data as undefined, error: mutationResult.error, isError: mutationResult.isError, isIdle: mutationResult.isIdle, diff --git a/packages/react/src/store/createLunoStore.test.ts b/packages/react/src/store/createLunoStore.test.ts index 9efc3b7..5cb9698 100644 --- a/packages/react/src/store/createLunoStore.test.ts +++ b/packages/react/src/store/createLunoStore.test.ts @@ -287,8 +287,6 @@ describe('createLunoStore', () => { expect(state.accounts).toEqual(mockAccounts); expect(state.account).toBe(mockAccounts[0]); - expect(mockConnector.on).toHaveBeenCalledWith('accountsChanged', expect.any(Function)); - expect(mockConnector.on).toHaveBeenCalledWith('disconnect', expect.any(Function)); expect(mockStorage.setItem).toHaveBeenCalledWith( PERSIST_KEY.LAST_CONNECTOR_ID, 'test-connector' @@ -297,6 +295,9 @@ describe('createLunoStore', () => { it('should restore previously selected account', async () => { mockConnector.connect.mockResolvedValue(mockAccounts); + vi.mocked(isSameAddress).mockImplementation((addr1, addr2) => { + return addr1 === addr2; + }); mockStorage.getItem.mockImplementation((key) => { if (key === PERSIST_KEY.LAST_SELECTED_ACCOUNT_INFO) { return Promise.resolve( @@ -319,6 +320,10 @@ describe('createLunoStore', () => { it('should restore account by address when publicKey not available', async () => { mockConnector.connect.mockResolvedValue(mockAccounts); + + vi.mocked(isSameAddress).mockImplementation((addr1, addr2) => { + return addr1 === addr2; + }); mockStorage.getItem.mockImplementation((key) => { if (key === PERSIST_KEY.LAST_SELECTED_ACCOUNT_INFO) { return Promise.resolve( @@ -539,46 +544,4 @@ describe('createLunoStore', () => { }); }); - describe('event handler behavior', () => { - let accountsChangedHandler: any; - let disconnectHandler: any; - - beforeEach(async () => { - useLunoStore.setState({ config: mockConfig }); - mockConnector.connect.mockResolvedValue([ - { publicKey: '0xabc', address: 'addr1', name: 'Account 1', meta: { source: 'test' } }, - ]); - - mockConnector.on.mockImplementation((event, handler) => { - if (event === 'accountsChanged') { - accountsChangedHandler = handler; - } else if (event === 'disconnect') { - disconnectHandler = handler; - } - }); - - await store.connect('test-connector'); - }); - - it('should handle accountsChanged event', async () => { - const newAccounts = [ - { publicKey: '0xnew', address: 'newAddr', name: 'New Account', meta: { source: 'test' } }, - ]; - - await accountsChangedHandler(newAccounts); - - const state = useLunoStore.getState(); - expect(state.accounts).toEqual(newAccounts); - expect(state.account).toBe(newAccounts[0]); - }); - - it('should handle disconnect event', async () => { - disconnectHandler(); - - const state = useLunoStore.getState(); - expect(state.status).toBe(ConnectionStatus.Disconnected); - expect(state.activeConnector).toBeUndefined(); - expect(state.accounts).toEqual([]); - }); - }); }); diff --git a/packages/react/src/store/createLunoStore.ts b/packages/react/src/store/createLunoStore.ts index 5af3552..e182c73 100644 --- a/packages/react/src/store/createLunoStore.ts +++ b/packages/react/src/store/createLunoStore.ts @@ -1,7 +1,7 @@ import { isSameAddress } from '@luno-kit/core/utils'; import { create } from 'zustand'; import { PERSIST_KEY } from '../constants'; -import type { Account, LunoState } from '../types'; +import type { Chain, LunoState } from '../types'; import { ConnectionStatus } from '../types'; import { createApi } from '../utils'; @@ -109,6 +109,10 @@ export const useLunoStore = create((set, get) => ({ PERSIST_KEY.LAST_SELECTED_ACCOUNT_INFO, JSON.stringify(accountInfo) ); + await config.storage.setItem( + PERSIST_KEY.RECENT_SELECTED_ACCOUNT_INFO, + JSON.stringify(accountInfo) + ); console.log(`[LunoStore] Persisted selected account: ${nextAccount.address}`); } catch (e) { console.error('[LunoStore] Failed to persist selected account:', e); @@ -147,87 +151,11 @@ export const useLunoStore = create((set, get) => ({ } try { - const handleAccountsChanged = async (newAccounts: Account[]) => { - console.log(`[LunoStore] accountsChanged event from ${connector.name}:`, newAccounts); - if (newAccounts.length === 0) { - await get().disconnect(); - return; - } - - newAccounts.forEach((acc) => { - if (!acc.publicKey) { - console.warn( - `[LunoStore] Account ${acc.address} (from ${connector.name}) is missing publicKey.` - ); - } - }); - - let selectedAccount = newAccounts[0]; - - try { - const storedAccountJson = await config.storage.getItem( - PERSIST_KEY.LAST_SELECTED_ACCOUNT_INFO - ); - if (storedAccountJson) { - const storedAccount: StoredAccountInfo = JSON.parse(storedAccountJson); - - const restoredAccount = newAccounts.find( - (acc) => - (storedAccount.publicKey && - acc.publicKey?.toLowerCase() === storedAccount.publicKey.toLowerCase()) || - isSameAddress(acc.address, storedAccount.address) - ); - - if (restoredAccount) { - selectedAccount = restoredAccount; - } - } - } catch (e) { - console.warn('[LunoStore] Failed to restore account during accountsChanged:', e); - } - - set({ accounts: newAccounts, account: selectedAccount }); - }; - - const handleDisconnect = () => { - console.log(`[LunoStore] disconnect event from ${connector.name}`); - if (get().activeConnector?.id === connector.id) { - cleanupActiveConnectorListeners(); - try { - config.storage.removeItem(PERSIST_KEY.LAST_CONNECTOR_ID); - config.storage.removeItem(PERSIST_KEY.LAST_CHAIN_ID); - console.log( - '[LunoStore] Removed persisted connection info from storage due to disconnect event.' - ); - } catch (e) { - console.error('[LunoStore] Failed to remove connection info from storage:', e); - } - - set({ - status: ConnectionStatus.Disconnected, - activeConnector: undefined, - accounts: [], - }); - } else { - console.warn( - `[LunoStore] Received disconnect event from an inactive connector ${connector.name}. Ignored.` - ); - } - }; - - connector.on('accountsChanged', handleAccountsChanged); - activeConnectorUnsubscribeFunctions.push(() => - connector.off('accountsChanged', handleAccountsChanged) - ); - - connector.on('disconnect', handleDisconnect); - activeConnectorUnsubscribeFunctions.push(() => connector.off('disconnect', handleDisconnect)); - const chainIdToUse = targetChainId || get().currentChainId || config.chains[0]?.genesisHash; const accountsFromWallet = await connector.connect( config.appName, - config.chains, + config.chains as Chain[], chainIdToUse ); @@ -238,17 +166,19 @@ export const useLunoStore = create((set, get) => ({ let selectedAccount = accountsFromWallet[0]; try { - const storedAccountJson = await config.storage.getItem( + const lastStoredAccountJson = await config.storage.getItem( PERSIST_KEY.LAST_SELECTED_ACCOUNT_INFO ); + const recentStoredAccountJson = await config.storage.getItem( + PERSIST_KEY.RECENT_SELECTED_ACCOUNT_INFO + ); + + const storedAccountJson = lastStoredAccountJson || recentStoredAccountJson; if (storedAccountJson) { const storedAccount: StoredAccountInfo = JSON.parse(storedAccountJson); - const restoredAccount = accountsFromWallet.find( - (acc) => - (storedAccount.publicKey && - acc.publicKey?.toLowerCase() === storedAccount.publicKey.toLowerCase()) || - isSameAddress(acc.address, storedAccount.address) + const restoredAccount = accountsFromWallet.find((acc) => + isSameAddress(acc.address, storedAccount.address) ); if (restoredAccount) { @@ -273,8 +203,24 @@ export const useLunoStore = create((set, get) => ({ account: selectedAccount, }); + const storedAccountInfo: StoredAccountInfo = { + publicKey: selectedAccount.publicKey, + address: selectedAccount.address, + name: selectedAccount.name, + source: selectedAccount.meta?.source, + }; + try { config.storage.setItem(PERSIST_KEY.LAST_CONNECTOR_ID, connector.id); + config.storage.setItem(PERSIST_KEY.RECENT_CONNECTOR_ID, connector.id); + config.storage.setItem( + PERSIST_KEY.LAST_SELECTED_ACCOUNT_INFO, + JSON.stringify(storedAccountInfo) + ); + config.storage.setItem( + PERSIST_KEY.RECENT_SELECTED_ACCOUNT_INFO, + JSON.stringify(storedAccountInfo) + ); console.log(`[LunoStore] Persisted connectorId: ${connector.id}`); } catch (e) { console.error('[LunoStore] Failed to persist connectorId to storage:', e); diff --git a/packages/ui/src/assets/icons/Arrow.tsx b/packages/ui/src/assets/icons/Arrow.tsx index 5fb093f..a59fbb9 100644 --- a/packages/ui/src/assets/icons/Arrow.tsx +++ b/packages/ui/src/assets/icons/Arrow.tsx @@ -1,5 +1,4 @@ import type { SVGProps } from 'react'; -import * as React from 'react'; const SvgArrow = (props: SVGProps) => ( ) => ( ) => ( ) => ( + + + + + + + +); +export default SvgCoin; diff --git a/packages/ui/src/assets/icons/Copy.tsx b/packages/ui/src/assets/icons/Copy.tsx index b7f6a69..95eb290 100644 --- a/packages/ui/src/assets/icons/Copy.tsx +++ b/packages/ui/src/assets/icons/Copy.tsx @@ -1,5 +1,4 @@ import type { SVGProps } from 'react'; -import * as React from 'react'; const SvgCopy = (props: SVGProps) => ( ) => ( + + + + +); +export default SvgDefaultNFT; diff --git a/packages/ui/src/assets/icons/Disconnect.tsx b/packages/ui/src/assets/icons/Disconnect.tsx index 55ad774..8c03fe6 100644 --- a/packages/ui/src/assets/icons/Disconnect.tsx +++ b/packages/ui/src/assets/icons/Disconnect.tsx @@ -1,5 +1,4 @@ import type { SVGProps } from 'react'; -import * as React from 'react'; const SvgDisconnect = (props: SVGProps) => ( ) => ( + + + + +); + +export default SvgEmptyWallet; diff --git a/packages/ui/src/assets/icons/Link.tsx b/packages/ui/src/assets/icons/Link.tsx new file mode 100644 index 0000000..5f7ccad --- /dev/null +++ b/packages/ui/src/assets/icons/Link.tsx @@ -0,0 +1,18 @@ +import type { SVGProps } from 'react'; + +const SvgLink = (props: SVGProps) => ( + + + +); +export default SvgLink; diff --git a/packages/ui/src/assets/icons/List.tsx b/packages/ui/src/assets/icons/List.tsx index 2055df8..9932320 100644 --- a/packages/ui/src/assets/icons/List.tsx +++ b/packages/ui/src/assets/icons/List.tsx @@ -1,5 +1,4 @@ import type { SVGProps } from 'react'; -import * as React from 'react'; const SvgList = (props: SVGProps) => ( ) => ( ) => ( ) => ( { + return ( +
+ +
+ ); +}; + +AssetListView.title = 'View Assets'; diff --git a/packages/ui/src/components/AccountDetailsModal/MainView.tsx b/packages/ui/src/components/AccountDetailsModal/MainView.tsx index 7aa7155..1645511 100644 --- a/packages/ui/src/components/AccountDetailsModal/MainView.tsx +++ b/packages/ui/src/components/AccountDetailsModal/MainView.tsx @@ -1,10 +1,18 @@ -import { useAccount, useBalance, useChain, useChains, useDisconnect } from '@luno-kit/react'; +import { + useAccount, + useBalance, + useChain, + useChains, + useConfig, + useDisconnect, +} from '@luno-kit/react'; import { getExplorerUrl } from '@luno-kit/react/utils'; import type React from 'react'; import { useMemo } from 'react'; -import { Arrow, Disconnect, List, Switch } from '../../assets/icons'; +import { Arrow, Coin, Disconnect, List, Switch } from '../../assets/icons'; +import { useSubscanTokens } from '../../hooks/useSubscanTokens'; import { cs } from '../../utils'; -import { ChainIcon } from '../ChainIcon'; +import { Icon } from '../Icon'; import { AccountModalView } from './index'; interface MainViewProps { @@ -18,71 +26,87 @@ export const MainView: React.FC = ({ onViewChange, onModalClose } const chains = useChains(); const { disconnectAsync } = useDisconnect(); const { data: balance } = useBalance({ address: chains.length > 0 ? address : undefined }); + const config = useConfig(); + const { refetch } = useSubscanTokens(); const items = useMemo(() => { - const chainSelectOptions = [ - { - key: 'Chain Name', - content: ( -
-
-
- - {/*
*/} -
-
- - {chain?.name || 'Polkadot'} - - {balance ? ( - - {balance.formattedTransferable || '0.00'}{' '} - {chain?.nativeCurrency?.symbol || 'DOT'} - - ) : ( - - )} -
+ const chainNameItem = { + key: 'Chain Name', + content: ( +
+
+
+ + {/*
*/}
-
- +
+ + {chain?.name || 'Polkadot'} + + {balance ? ( + + {balance.formattedTransferable || '0.00'} {chain?.nativeCurrency?.symbol || 'DOT'} + + ) : ( + + )}
- ), - onClick: () => onViewChange(AccountModalView.switchChain), - }, - { - key: 'View on Explorer', - content: ( - <> - - View on Explorer - - ), - onClick: () => - window.open(getExplorerUrl(chain?.blockExplorers?.default?.url!, address, 'address')), - }, - ]; +
+ +
+
+ ), + onClick: () => onViewChange(AccountModalView.switchChain), + }; + + const switchAccountItem = { + key: 'Switch Account', + content: ( + <> + + Switch Account + + ), + onClick: () => onViewChange(AccountModalView.switchAccount), + }; - const normalOptions = [ - { - key: 'Switch Account', - content: ( - <> - - Switch Account - - ), - onClick: () => onViewChange(AccountModalView.switchAccount), + const assetListItem = { + key: 'View Assets', + content: ( + <> + + View Assets + + ), + onClick: () => { + onViewChange(AccountModalView.assetList); + refetch(); }, - ]; + }; + + const explorerItem = { + key: 'View on Explorer', + content: ( + <> + + View on Explorer + + ), + onClick: () => + window.open(getExplorerUrl(chain?.blockExplorers?.default?.url!, address, 'address')), + }; + + if (chains.length === 0) return [switchAccountItem]; - return chains.length > 0 ? [...chainSelectOptions, ...normalOptions] : [...normalOptions]; - }, [onViewChange, chain, address, balance, chains]); + return config?.subscan?.apiKey + ? [chainNameItem, explorerItem, assetListItem, switchAccountItem] + : [chainNameItem, explorerItem, switchAccountItem]; + }, [onViewChange, chain, address, balance, chains, config]); const handleDisconnect = async () => { await disconnectAsync(); @@ -90,20 +114,20 @@ export const MainView: React.FC = ({ onViewChange, onModalClose } }; return ( -
-
+
+
{items.map((i) => ( {i.content} ))}
-
+
-
+
- Disconnect + Disconnect
@@ -116,10 +140,10 @@ const SelectItem = ({ children, onClick }: { children: React.ReactNode; onClick? type="button" onClick={() => onClick?.()} className={cs( - 'w-full p-2.5 rounded-accountActionItem border-none text-left flex items-center gap-2 font-medium', - 'bg-accountActionItemBackground hover:bg-accountActionItemBackgroundHover', - 'transition-colors duration-200', - onClick ? 'cursor-pointer' : 'cursor-auto' + 'luno:w-full luno:p-2.5 luno:rounded-accountActionItem luno:border-none luno:text-left luno:flex luno:items-center luno:gap-2 luno:font-medium', + 'luno:bg-accountActionItemBackground luno:hover:bg-accountActionItemBackgroundHover', + 'luno:transition-colors luno:duration-200', + onClick ? 'luno:cursor-pointer' : 'luno:cursor-auto' )} aria-label={typeof children === 'string' ? children : undefined} > diff --git a/packages/ui/src/components/AccountDetailsModal/SwitchAccountView.tsx b/packages/ui/src/components/AccountDetailsModal/SwitchAccountView.tsx index 18e4af7..41ec2a0 100644 --- a/packages/ui/src/components/AccountDetailsModal/SwitchAccountView.tsx +++ b/packages/ui/src/components/AccountDetailsModal/SwitchAccountView.tsx @@ -32,7 +32,7 @@ export const SwitchAccountView: ViewComponent = ({ onBack }) => { ); return ( -
+
{accounts.map((acc) => ( { ); }; -SwitchAccountView.title = 'Switch Accounts'; +SwitchAccountView.title = 'Switch Account'; interface AccountItemProps { isSelected: boolean; @@ -66,38 +66,38 @@ const AccountItem: React.FC = React.memo( type="button" onClick={() => selectAccount(account)} className={cs( - 'px-3.5 py-2.5 w-full rounded-accountSelectItem border-none', - 'bg-accountSelectItemBackground', - 'text-left flex items-center justify-between gap-2', - 'transition-colors duration-200', - isSelected ? 'cursor-auto' : 'cursor-pointer hover:bg-accountSelectItemBackgroundHover' + 'luno:px-3.5 luno:py-2.5 luno:w-full luno:rounded-accountSelectItem luno:border-none', + 'luno:bg-accountSelectItemBackground', + 'luno:text-left luno:flex luno:items-center luno:justify-between luno:gap-2', + 'luno:transition-colors luno:duration-200', + isSelected ? 'luno:cursor-auto' : 'luno:cursor-pointer luno:hover:bg-accountSelectItemBackgroundHover' )} aria-label={account.name || address} disabled={isSelected} > -
-
+
+
{connector?.icon && luno account}
-
- +
+ {account.name || formatAddress(address)} {chains.length > 0 && (balance ? ( - + {balance?.formattedTransferable || '0.00'}{' '} {chain?.nativeCurrency?.symbol || 'DOT'} ) : ( - + ))}
{isSelected && ( -
-
+
+
)} diff --git a/packages/ui/src/components/AccountDetailsModal/SwitchChainView.tsx b/packages/ui/src/components/AccountDetailsModal/SwitchChainView.tsx index a38f574..2fd9f68 100644 --- a/packages/ui/src/components/AccountDetailsModal/SwitchChainView.tsx +++ b/packages/ui/src/components/AccountDetailsModal/SwitchChainView.tsx @@ -10,7 +10,7 @@ interface SwitchChainViewProps { } export const SwitchChainView: ViewComponent = ({ onBack }) => { - return ; + return ; }; SwitchChainView.title = 'Select Networks'; diff --git a/packages/ui/src/components/AccountDetailsModal/index.tsx b/packages/ui/src/components/AccountDetailsModal/index.tsx index e9ee32e..bd331b3 100644 --- a/packages/ui/src/components/AccountDetailsModal/index.tsx +++ b/packages/ui/src/components/AccountDetailsModal/index.tsx @@ -8,6 +8,7 @@ import { useAccountModal } from '../../providers'; import { cs } from '../../utils'; import { Copy } from '../Copy'; import { Dialog, DialogClose, DialogTitle } from '../Dialog'; +import { AssetListView } from './AssetListView'; import { MainView } from './MainView'; import { SwitchAccountView } from './SwitchAccountView'; import { SwitchChainView } from './SwitchChainView'; @@ -16,6 +17,7 @@ export enum AccountModalView { main = 'main', switchAccount = 'switchAccount', switchChain = 'switchChain', + assetList = 'assetList', } export const AccountDetailsModal: React.FC = () => { @@ -32,8 +34,9 @@ export const AccountDetailsModal: React.FC = () => { }, [close]); const viewTitle = useMemo(() => { - if (currentView === AccountModalView.switchAccount) return 'Switch Account'; + if (currentView === AccountModalView.switchAccount) return SwitchAccountView.title; if (currentView === AccountModalView.switchChain) return SwitchChainView.title; + if (currentView === AccountModalView.assetList) return AssetListView.title; return null; }, [currentView]); @@ -48,6 +51,7 @@ export const AccountDetailsModal: React.FC = () => { [AccountModalView.switchChain]: ( handleViewChange(AccountModalView.main)} /> ), + [AccountModalView.assetList]: , }), [handleViewChange, handleModalClose] ); @@ -56,31 +60,31 @@ export const AccountDetailsModal: React.FC = () => {
-
+
{currentView === AccountModalView.main ? ( -
+
{activeConnector?.icon && ( -
- +
+ luno
)} -
- Account Details -
- +
+ Account Details +
+ {formatAddress(address)}
30 ? 'w-[90%]' : '' + 'luno:text-sm luno:leading-sm luno:text-modalTextSecondary luno:font-medium luno:text-ellipsis luno:overflow-hidden luno:whitespace-nowrap', + account?.name && account?.name.length > 30 ? 'luno:w-[90%]' : '' )} > {account?.name || activeConnector?.name} @@ -90,24 +94,24 @@ export const AccountDetailsModal: React.FC = () => { ) : ( <> - + {viewTitle} )} - +
-
+
{viewComponents[currentView]}
diff --git a/packages/ui/src/components/AssetList/EmptyAsset.tsx b/packages/ui/src/components/AssetList/EmptyAsset.tsx new file mode 100644 index 0000000..c30c295 --- /dev/null +++ b/packages/ui/src/components/AssetList/EmptyAsset.tsx @@ -0,0 +1,17 @@ +import { EmptyWallet } from '../../assets/icons'; + +interface Props { + type: 'Tokens' | 'NFTs'; +} + +export const EmptyAsset = ({ type }: Props) => { + return ( +
+ +
No {type} found
+
+ Switch to a different network or account to view more assets +
+
+ ); +}; diff --git a/packages/ui/src/components/AssetList/NFTList.tsx b/packages/ui/src/components/AssetList/NFTList.tsx new file mode 100644 index 0000000..fc37a95 --- /dev/null +++ b/packages/ui/src/components/AssetList/NFTList.tsx @@ -0,0 +1,131 @@ +import { useAccount, useChain } from '@luno-kit/react'; +import React, { useMemo, useState } from 'react'; +import { DefaultNFT, Link } from '../../assets/icons'; +import { type AssetItem as AssetItemType, useSubscanTokens } from '../../hooks/useSubscanTokens'; +import { cs } from '../../utils'; +import { EmptyAsset } from './EmptyAsset'; + +export const NFTList = React.memo(() => { + const { data, isFetching, error } = useSubscanTokens(); + + const listData: AssetItemType[] = useMemo(() => { + if (!data) return []; + + return data.nfts; + }, [data]); + + if (isFetching) { + return ( +
+
+ {[1, 2, 3, 4].map((num) => ( +
+ ))} +
+
+ ); + } + + if (error) { + return ( +
+
Failed to load assets
+
+ {error instanceof Error ? error.message : 'Unknown error'} +
+
+ ); + } + + if (!listData.length) { + return ; + } + + return ( +
+
+ {listData.map((item) => ( + + ))} +
+
+ ); +}); + +interface NFTItemProps { + asset: AssetItemType; +} + +const NFTItem: React.FC = React.memo(({ asset }) => { + const { chain } = useChain(); + const { address } = useAccount(); + const [isLoading, setIsLoading] = useState(!!asset.logoURI); + + const linkExplorer = useMemo(() => { + if (!chain?.subscan?.url) return ''; + + const subscanUrl = chain.subscan.url.endsWith('/') + ? chain.subscan.url.slice(0, -1) + : chain.subscan.url; + + return `${subscanUrl}/nft_item?collection_id=${asset.assetId}&address=${address}`; + }, [chain, asset, address]); + + return ( +
+
+
+ {isLoading && ( +
+
+
+ )} + {asset.logoURI ? ( + {`${asset.symbol}-NFT`} setIsLoading(false)} + onError={() => setIsLoading(false)} + /> + ) : ( + + )} +
+ +
+ + {asset.balance || '-'} NFTs + + +
+
+ {asset.symbol || asset.assetId} +
+
+
+ ); +}); diff --git a/packages/ui/src/components/AssetList/TokenList.tsx b/packages/ui/src/components/AssetList/TokenList.tsx new file mode 100644 index 0000000..6f66606 --- /dev/null +++ b/packages/ui/src/components/AssetList/TokenList.tsx @@ -0,0 +1,110 @@ +import React, { useMemo } from 'react'; +import { type AssetItem as AssetItemType, useSubscanTokens } from '../../hooks/useSubscanTokens'; +import { cs } from '../../utils'; +import { Icon } from '../Icon'; +import { EmptyAsset } from './EmptyAsset'; + +const getAssetIconUrl = (symbol: string): string => { + const normalizedSymbol = symbol?.toLowerCase().trim() || ''; + + return `https://raw.githubusercontent.com/Luno-lab/luno-assets/refs/heads/main/assets/tokens/${normalizedSymbol}.webp`; +}; + +export const TokenList = React.memo(() => { + const { data, error, isFetching } = useSubscanTokens(); + + const listData: AssetItemType[] = useMemo(() => { + if (!data) return []; + + return data.tokens; + }, [data]); + + if (isFetching) { + return ( +
+ {[1, 2, 3, 4, 5].map((num) => ( +
+ ))} +
+ ); + } + + if (error) { + return ( +
+
Failed to load assets
+
+ {error instanceof Error ? error.message : 'Unknown error'} +
+
+ ); + } + + if (!listData.length) { + return ; + } + + return ( +
+ {listData.map((item) => ( + + ))} +
+ ); +}); + +interface TokenItemProps { + asset: AssetItemType; +} + +const TokenItem: React.FC = React.memo(({ asset }) => { + const iconUrl = asset.logoURI || getAssetIconUrl(asset.symbol); + + const displayValue = React.useMemo(() => { + if (!asset.price) return null; + const balance = parseFloat(asset.balance) / 10 ** asset.decimals; + const price = parseFloat(asset.price); + const total = balance * price; + return `$${total.toFixed(2)}`; + }, [asset.balance, asset.decimals, asset.price]); + + return ( +
+
+ + +
+ + {asset.symbol || 'Unknown'} + + + {asset.balanceFormatted} + +
+
+ + {asset.price && ( +
+ {displayValue} + + ${asset.price} + +
+ )} +
+ ); +}); diff --git a/packages/ui/src/components/AssetList/index.tsx b/packages/ui/src/components/AssetList/index.tsx new file mode 100644 index 0000000..2ee17a1 --- /dev/null +++ b/packages/ui/src/components/AssetList/index.tsx @@ -0,0 +1,44 @@ +import type React from 'react'; +import { useState } from 'react'; +import { cs } from '../../utils'; +import { NFTList } from './NFTList'; +import { TokenList } from './TokenList'; + +enum AssetFilter { + tokens = 'Tokens', + nfts = 'NFTs', +} + +const FILTER_TABS = [ + { key: AssetFilter.tokens, label: AssetFilter.tokens }, + { key: AssetFilter.nfts, label: AssetFilter.nfts }, +] as const; + +export const AssetList: React.FC = () => { + const [activeFilter, setActiveFilter] = useState(AssetFilter.tokens); + + return ( +
+
+ {FILTER_TABS.map((tab) => ( + + ))} +
+ +
+ {activeFilter === AssetFilter.tokens ? : } +
+
+ ); +}; diff --git a/packages/ui/src/components/ChainIcon/index.tsx b/packages/ui/src/components/ChainIcon/index.tsx deleted file mode 100644 index 107af4c..0000000 --- a/packages/ui/src/components/ChainIcon/index.tsx +++ /dev/null @@ -1,32 +0,0 @@ -import type React from 'react'; -import { cs } from '../../utils'; - -export interface ChainIconProps { - chainIconUrl?: string; - chainName?: string; - className?: string; -} - -export const ChainIcon: React.FC = ({ chainIconUrl, chainName, className }) => { - if (chainIconUrl) { - return ( - {chainName - ); - } - - return ( -
- {chainName ? chainName.charAt(0).toUpperCase() : 'C'} -
- ); -}; diff --git a/packages/ui/src/components/ChainList/index.tsx b/packages/ui/src/components/ChainList/index.tsx index cac7d76..2ab94af 100644 --- a/packages/ui/src/components/ChainList/index.tsx +++ b/packages/ui/src/components/ChainList/index.tsx @@ -1,9 +1,9 @@ import { useApi, useChain, useChains, useSwitchChain } from '@luno-kit/react'; import type { Chain } from '@luno-kit/react/types'; import React, { useMemo, useState } from 'react'; -import { cs } from '../../utils'; -import { ChainIcon } from '../ChainIcon'; import { Search } from '../../assets/icons'; +import { cs } from '../../utils'; +import { Icon } from '../Icon'; interface ChainListProps { onChainSwitched?: (chain: Chain) => void; @@ -44,22 +44,22 @@ export const ChainList: React.FC = ({ }; return ( -
-
-
- +
+
+
+ setSearchQuery(e.target.value)} - className="w-full pl-10 pr-3 py-2 text-sm border border-networkSelectItemBackgroundHover rounded-md focus:ring-2 focus:ring-accentColor focus:outline-none focus:border-transparent" + className="luno:w-full luno:pl-10 luno:pr-3 luno:py-2 luno:text-sm luno:border luno:border-networkSelectItemBackgroundHover luno:rounded-md luno:focus:ring-2 luno:focus:ring-accentColor luno:focus:outline-none luno:focus:border-transparent" />
{filteredChains.length > 0 && ( -
+
{filteredChains.map((chain) => ( = ({ )} {filteredChains.length === 0 && ( -
- No chains available +
+ No chains available
)}
@@ -97,40 +97,40 @@ const ChainItem: React.FC = React.memo( onClick={() => onSelect(chain)} disabled={isSelected || isLoading} className={cs( - 'flex items-center justify-between p-2.5 rounded-networkSelectItem', - 'bg-networkSelectItemBackground', - 'transition-colors duration-200', + 'luno:flex luno:items-center luno:justify-between luno:p-2.5 luno:rounded-networkSelectItem', + 'luno:bg-networkSelectItemBackground', + 'luno:transition-colors luno:duration-200', isSelected || isLoading - ? 'cursor-default' - : 'cursor-pointer hover:bg-networkSelectItemBackgroundHover', - isLoading && 'opacity-80' + ? 'luno:cursor-default' + : 'luno:cursor-pointer luno:hover:bg-networkSelectItemBackgroundHover', + isLoading && 'luno:opacity-80' )} > -
- + -
- {chain.name} +
+ {chain.name}
-
+
{isSelected ? ( isLoading ? ( <> - + {isSwitching ? 'Switching' : 'Connecting'} -
+
) : ( - - - + + + ) ) : null} diff --git a/packages/ui/src/components/ChainModal/index.tsx b/packages/ui/src/components/ChainModal/index.tsx index 17b6459..36f7cdc 100644 --- a/packages/ui/src/components/ChainModal/index.tsx +++ b/packages/ui/src/components/ChainModal/index.tsx @@ -4,20 +4,18 @@ import { useChainModal } from '../../providers'; import { ChainList } from '../ChainList'; import { Dialog, DialogClose, DialogTitle } from '../Dialog'; -export type ChainModalProps = {}; - -export const ChainModal: React.FC = () => { +export const ChainModal: React.FC = () => { const { isOpen, close } = useChainModal(); return ( !open && close()}> -
-
-
{/* Placeholder to keep title centered */} - +
+
+
{/* Placeholder to keep title centered */} + Select Network - +
diff --git a/packages/ui/src/components/ConnectButton/index.tsx b/packages/ui/src/components/ConnectButton/index.tsx index 5da5daf..dc1faca 100644 --- a/packages/ui/src/components/ConnectButton/index.tsx +++ b/packages/ui/src/components/ConnectButton/index.tsx @@ -2,10 +2,10 @@ import { formatAddress } from '@luno-kit/react/utils'; import type React from 'react'; import { useConnectButton, useWindowSize } from '../../hooks'; import { cs } from '../../utils'; -import { ChainIcon } from '../ChainIcon'; +import { Icon } from '../Icon'; export const transitionClassName = - 'transition-transform transition-[125] hover:scale-[1.03] transition-ease'; + 'luno:transition-transform luno:transition-[125] luno:hover:scale-[1.03] luno:transition-ease'; export interface ConnectButtonProps { className?: string; @@ -48,11 +48,11 @@ export const ConnectButton: React.FC = ({ type="button" onClick={() => openConnectModal?.()} className={cs( - 'cursor-pointer font-semibold inline-flex items-center justify-center focus:outline-none', - 'text-connectButtonText bg-connectButtonBackground shadow-button active:scale-[0.95]', - 'rounded-connectButton', + 'luno:cursor-pointer luno:font-semibold luno:inline-flex luno:items-center luno:justify-center luno:focus:outline-none', + 'luno:text-connectButtonText luno:bg-connectButtonBackground luno:shadow-button luno:active:scale-[0.95]', + 'luno:rounded-connectButton', transitionClassName, - 'px-3.5 text-base leading-base min-h-[40px]', + 'luno:px-3.5 luno:text-base luno:leading-base luno:min-h-[40px]', className )} > @@ -64,7 +64,7 @@ export const ConnectButton: React.FC = ({ return (
@@ -73,18 +73,18 @@ export const ConnectButton: React.FC = ({ type="button" onClick={() => openChainModal?.()} className={cs( - 'flex items-center rounded-currentNetworkButton cursor-pointer', - 'bg-currentNetworkButtonBackground shadow-button', - 'py-2 px-2.5 gap-1.5', + 'luno:flex luno:items-center luno:rounded-currentNetworkButton luno:cursor-pointer', + 'luno:bg-currentNetworkButtonBackground luno:shadow-button', + 'luno:py-2 luno:px-2.5 luno:gap-1.5', transitionClassName )} aria-label="Switch chain" > {chainStatus === 'full' || chainStatus === 'icon' ? ( - ) : null} {(chainStatus === 'full' || chainStatus === 'name') && isLargeWindow && ( @@ -97,42 +97,41 @@ export const ConnectButton: React.FC = ({ type="button" onClick={() => openAccountModal?.()} className={cs( - 'flex items-center cursor-pointer rounded-connectButton bg-connectButtonBackground shadow-button', + 'luno:flex luno:items-center luno:cursor-pointer luno:rounded-connectButton luno:bg-connectButtonBackground luno:shadow-button', transitionClassName )} aria-label="Open account modal" > {configuredChains.length > 0 && showBalance && isLargeWindow && ( -
+
{balance ? ( {balance?.formattedTransferable || balance?.formattedTotal || 0}{' '} {currentChain?.nativeCurrency?.symbol || ''} ) : ( - + )}
)}
0 && showBalance && isLargeWindow - ? 'bg-connectButtonInnerBackground py-1.5 px-2' - : 'bg-connectButtonBackground py-2 px-2.5' + ? 'luno:bg-connectButtonInnerBackground luno:py-1.5 luno:px-2' + : 'luno:bg-connectButtonBackground luno:py-2 luno:px-2.5' )} > {accountStatus === 'full' && ( - - luno + + luno account )} diff --git a/packages/ui/src/components/ConnectModal/ConnectOptions.tsx b/packages/ui/src/components/ConnectModal/ConnectOptions.tsx index 8638884..a515caf 100644 --- a/packages/ui/src/components/ConnectModal/ConnectOptions.tsx +++ b/packages/ui/src/components/ConnectModal/ConnectOptions.tsx @@ -22,18 +22,6 @@ const moreConnectorIds = ['polkagate', 'fearless-wallet', 'mimir', 'enkrypt']; export const ConnectOptions = React.memo(({ onConnect }: Props) => { const connectors = useConnectors(); - if (isMobileDevice()) { - const filteredConnectors = connectors.filter((i) => i.links.deepLink); - - return ( -
- {filteredConnectors.map((i) => ( - onConnect(i)} /> - ))} -
- ); - } - const installedConnectors = connectors.filter((c) => c.isInstalled()); const popularConnectors = connectors.filter( (c) => popularConnectorIds.includes(c.id) && !c.isInstalled() @@ -59,25 +47,37 @@ export const ConnectOptions = React.memo(({ onConnect }: Props) => { ]; }, [installedConnectors, popularConnectors, moreConnectors]); + if (isMobileDevice()) { + const filteredConnectors = connectors.filter((i) => i.links.deepLink); + + return ( +
+ {filteredConnectors.map((i) => ( + onConnect(i)} /> + ))} +
+ ); + } + return (
{connectorGroup.map((g) => { if (g.group.length === 0) return null; return ( -
+
{g.title}
-
+
{g.group.map((i) => ( onConnect(i)} /> ))} @@ -99,16 +99,16 @@ const ConnectorItem: React.FC = React.memo(({ connector, onC ); }); diff --git a/packages/ui/src/components/ConnectModal/WalletView.tsx b/packages/ui/src/components/ConnectModal/WalletView.tsx index a6590f4..a8e2b64 100644 --- a/packages/ui/src/components/ConnectModal/WalletView.tsx +++ b/packages/ui/src/components/ConnectModal/WalletView.tsx @@ -26,17 +26,17 @@ export const WalletView = React.memo( return (
{isWide && ( -
-
+
+
@@ -47,36 +47,36 @@ export const WalletView = React.memo(
{selectedConnector ? ( showQRCode ? ( -
+
Scan the QR code with{' '} {selectedConnector.id === 'nova' ? 'the Nova' : 'your phone'}
-
+
{selectedConnector.links?.browserExtension ? ( -

window.open(selectedConnector.links.browserExtension)} className={ - 'cursor-pointer text-sm text-accentColor font-medium text-center hover:text-modalText' + 'luno:cursor-pointer luno:text-sm luno:text-accentColor luno:font-medium luno:text-center luno:hover:text-modalText' } > Don't have {selectedConnector.name}? -

+
) : qrCode ? ( @@ -85,36 +85,36 @@ export const WalletView = React.memo(
) : ( <> -
- +
+
-

+

Opening {selectedConnector.name}...

Confirm connection in the extension

- {connectState.isConnecting &&
} + {connectState.isConnecting &&
} {!selectedConnector.isInstalled() && selectedConnector.links.browserExtension && ( -

window.open(selectedConnector.links.browserExtension)} className={ - 'cursor-pointer pt-6 text-sm text-accentColor font-medium text-center hover:text-modalText' + 'luno:cursor-pointer luno:pt-6 luno:text-sm luno:text-accentColor luno:font-medium luno:text-center luno:hover:text-modalText' } > Don‘t have {selectedConnector.name}? -

+
)} {!connectState.isConnecting && connectState.isError && selectedConnector.isInstalled() && ( {selectedConnector?.name} @@ -147,28 +147,26 @@ export const ConnectModal: React.FC = ({ size = 'wide' }) => {!isWide && ( )}
-
+
{viewComponents[currentView]}
{!isWide && currentView === ConnectModalView.connectOptions && ( - <> -

window.open('https://polkadot.com/get-started/wallets/')} - > - New to wallets? -

- +

window.open('https://polkadot.com/get-started/wallets/')} + > + New to wallets? +

)}
diff --git a/packages/ui/src/components/Copy/index.tsx b/packages/ui/src/components/Copy/index.tsx index ffd84ee..9fb31dc 100644 --- a/packages/ui/src/components/Copy/index.tsx +++ b/packages/ui/src/components/Copy/index.tsx @@ -14,7 +14,7 @@ export const Copy: React.FC = ({ copyText, label, className = '' }) = const copyToClipboard = useCallback(async (text: string): Promise => { try { - if (navigator.clipboard && navigator.clipboard.writeText) { + if (navigator.clipboard?.writeText) { await navigator.clipboard.writeText(text); setIsCopied(true); setTimeout(() => setIsCopied(false), 2000); @@ -31,8 +31,8 @@ export const Copy: React.FC = ({ copyText, label, className = '' }) = - + {viewTitle} )} - +
-
+
{viewComponents[currentView]}
diff --git a/packages/ui/src/components/AssetList/NFTList.tsx b/packages/ui/src/components/AssetList/NFTList.tsx index fc37a95..6dd1946 100644 --- a/packages/ui/src/components/AssetList/NFTList.tsx +++ b/packages/ui/src/components/AssetList/NFTList.tsx @@ -46,9 +46,7 @@ export const NFTList = React.memo(() => { return (
-
+
{listData.map((item) => ( ))} @@ -101,7 +99,9 @@ const NFTItem: React.FC = React.memo(({ asset }) => { alt={`${asset.symbol}-NFT`} className={cs( 'luno:w-full luno:h-full luno:object-cover', - isLoading ? 'luno:opacity-0' : 'luno:opacity-100 luno:transition-opacity luno:duration-200' + isLoading + ? 'luno:opacity-0' + : 'luno:opacity-100 luno:transition-opacity luno:duration-200' )} onLoad={() => setIsLoading(false)} onError={() => setIsLoading(false)} diff --git a/packages/ui/src/components/AssetList/TokenList.tsx b/packages/ui/src/components/AssetList/TokenList.tsx index 6f66606..ed9dcff 100644 --- a/packages/ui/src/components/AssetList/TokenList.tsx +++ b/packages/ui/src/components/AssetList/TokenList.tsx @@ -91,7 +91,11 @@ const TokenItem: React.FC = React.memo(({ asset }) => { {asset.symbol || 'Unknown'} - + {asset.balanceFormatted}
@@ -99,8 +103,14 @@ const TokenItem: React.FC = React.memo(({ asset }) => { {asset.price && (
- {displayValue} - + + {displayValue} + + ${asset.price}
diff --git a/packages/ui/src/components/AssetList/index.tsx b/packages/ui/src/components/AssetList/index.tsx index 2ee17a1..e18cf16 100644 --- a/packages/ui/src/components/AssetList/index.tsx +++ b/packages/ui/src/components/AssetList/index.tsx @@ -19,7 +19,7 @@ export const AssetList: React.FC = () => { return (
-
+
{FILTER_TABS.map((tab) => (
-
+
{activeFilter === AssetFilter.tokens ? : }
diff --git a/packages/ui/src/components/ChainList/index.tsx b/packages/ui/src/components/ChainList/index.tsx index 2ab94af..276a9af 100644 --- a/packages/ui/src/components/ChainList/index.tsx +++ b/packages/ui/src/components/ChainList/index.tsx @@ -108,13 +108,17 @@ const ChainItem: React.FC = React.memo( >
- {chain.name} + + {chain.name} +
diff --git a/packages/ui/src/components/ConnectButton/index.tsx b/packages/ui/src/components/ConnectButton/index.tsx index dc1faca..2fe5dd2 100644 --- a/packages/ui/src/components/ConnectButton/index.tsx +++ b/packages/ui/src/components/ConnectButton/index.tsx @@ -84,7 +84,7 @@ export const ConnectButton: React.FC = ({ ) : null} {(chainStatus === 'full' || chainStatus === 'name') && isLargeWindow && ( @@ -103,14 +103,18 @@ export const ConnectButton: React.FC = ({ aria-label="Open account modal" > {configuredChains.length > 0 && showBalance && isLargeWindow && ( -
+
{balance ? ( {balance?.formattedTransferable || balance?.formattedTotal || 0}{' '} {currentChain?.nativeCurrency?.symbol || ''} ) : ( - + )}
)} @@ -124,7 +128,11 @@ export const ConnectButton: React.FC = ({ )} > {accountStatus === 'full' && ( - + luno account )} diff --git a/packages/ui/src/components/ConnectModal/ConnectOptions.tsx b/packages/ui/src/components/ConnectModal/ConnectOptions.tsx index a515caf..98bc1f3 100644 --- a/packages/ui/src/components/ConnectModal/ConnectOptions.tsx +++ b/packages/ui/src/components/ConnectModal/ConnectOptions.tsx @@ -68,7 +68,10 @@ export const ConnectOptions = React.memo(({ onConnect }: Props) => { {connectorGroup.map((g) => { if (g.group.length === 0) return null; return ( -
+
= React.memo(({ connector, onC {connector.name}
- {connector.name} + + {connector.name} + ); }); diff --git a/packages/ui/src/components/ConnectModal/WalletView.tsx b/packages/ui/src/components/ConnectModal/WalletView.tsx index a8e2b64..3958525 100644 --- a/packages/ui/src/components/ConnectModal/WalletView.tsx +++ b/packages/ui/src/components/ConnectModal/WalletView.tsx @@ -27,7 +27,9 @@ export const WalletView = React.memo(
{isWide && ( @@ -76,7 +78,9 @@ export const WalletView = React.memo(
) : qrCode ? ( @@ -98,7 +102,9 @@ export const WalletView = React.memo( > Confirm connection in the extension

- {connectState.isConnecting &&
} + {connectState.isConnecting && ( +
+ )} {!selectedConnector.isInstalled() && selectedConnector.links.browserExtension && (
window.open(selectedConnector.links.browserExtension)} diff --git a/packages/ui/src/components/ConnectModal/index.tsx b/packages/ui/src/components/ConnectModal/index.tsx index 948f830..04b272a 100644 --- a/packages/ui/src/components/ConnectModal/index.tsx +++ b/packages/ui/src/components/ConnectModal/index.tsx @@ -112,10 +112,15 @@ export const ConnectModal: React.FC = ({ size = 'wide' }) => : 'luno:md:min-w-[360px]' )} > -
+
{currentView === ConnectModalView.connectOptions ? ( <> - {!isWide &&
} + {!isWide &&
} = ({ size = 'wide' }) => ) : ( <>
-
+
{viewComponents[currentView]}
diff --git a/packages/ui/src/components/Icon/index.tsx b/packages/ui/src/components/Icon/index.tsx index 32da51d..474c392 100644 --- a/packages/ui/src/components/Icon/index.tsx +++ b/packages/ui/src/components/Icon/index.tsx @@ -35,7 +35,9 @@ export const Icon: React.FC = ({ iconUrl, resourceName, className }) alt={resourceName || 'icon'} className={cs( 'luno:w-full luno:h-full luno:object-cover luno:rounded-full', - isLoading ? 'luno:opacity-0' : 'luno:opacity-100 luno:transition-opacity luno:duration-200' + isLoading + ? 'luno:opacity-0' + : 'luno:opacity-100 luno:transition-opacity luno:duration-200' )} onLoad={() => setIsLoading(false)} onError={() => { From 2d137b0cbe1372537a553bbf6192ffd22cf9b3f4 Mon Sep 17 00:00:00 2001 From: WBH <48749219+wbh1328551759@users.noreply.github.com> Date: Wed, 5 Nov 2025 15:29:54 +0800 Subject: [PATCH 37/45] chore: fix biome files includes fix biome files includes --- biome.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/biome.json b/biome.json index 736d7c8..2f90a8f 100644 --- a/biome.json +++ b/biome.json @@ -6,7 +6,8 @@ "useIgnoreFile": true }, "files": { - "ignoreUnknown": false + "ignoreUnknown": false, + "includes": ["**/*.js", "**/*.jsx", "**/*.ts", "**/*.tsx", "**/*.json"] }, "formatter": { "enabled": true, @@ -23,7 +24,8 @@ "correctness": { "noUnusedVariables": "off", "useExhaustiveDependencies": "off", - "noUnusedFunctionParameters": "off" + "noUnusedFunctionParameters": "off", + "noUnknownMediaFeatureName": "off" }, "style": { "noNonNullAssertion": "off" From 4b0be4a3c5a857f473e9ff94b25026d0cde361d5 Mon Sep 17 00:00:00 2001 From: WBH <48749219+wbh1328551759@users.noreply.github.com> Date: Wed, 5 Nov 2025 22:25:44 +0800 Subject: [PATCH 38/45] Feat/assets list (#117) fix bug & update ui --- packages/ui/src/assets/icons/Link.tsx | 4 ++-- .../src/components/AccountDetailsModal/MainView.tsx | 2 +- packages/ui/src/components/AssetList/NFTList.tsx | 12 ++++++++---- packages/ui/src/components/AssetList/TokenList.tsx | 6 +++++- packages/ui/src/components/ChainList/index.tsx | 2 +- packages/ui/src/components/ConnectModal/index.tsx | 6 +++--- 6 files changed, 20 insertions(+), 12 deletions(-) diff --git a/packages/ui/src/assets/icons/Link.tsx b/packages/ui/src/assets/icons/Link.tsx index 5f7ccad..1c4fe8c 100644 --- a/packages/ui/src/assets/icons/Link.tsx +++ b/packages/ui/src/assets/icons/Link.tsx @@ -5,12 +5,12 @@ const SvgLink = (props: SVGProps) => ( xmlns="http://www.w3.org/2000/svg" width="16" height="16" - viewBox="0 0 16 16" + viewBox="0 0 256 256" fill="none" {...props} > diff --git a/packages/ui/src/components/AccountDetailsModal/MainView.tsx b/packages/ui/src/components/AccountDetailsModal/MainView.tsx index 4b9b424..a6115c9 100644 --- a/packages/ui/src/components/AccountDetailsModal/MainView.tsx +++ b/packages/ui/src/components/AccountDetailsModal/MainView.tsx @@ -41,7 +41,7 @@ export const MainView: React.FC = ({ onViewChange, onModalClose } iconUrl={chain?.chainIconUrl} resourceName={`${chain?.name}-chain`} /> - {/*
*/} + {/*
*/}
diff --git a/packages/ui/src/components/AssetList/NFTList.tsx b/packages/ui/src/components/AssetList/NFTList.tsx index 6dd1946..9b02db9 100644 --- a/packages/ui/src/components/AssetList/NFTList.tsx +++ b/packages/ui/src/components/AssetList/NFTList.tsx @@ -63,6 +63,7 @@ const NFTItem: React.FC = React.memo(({ asset }) => { const { chain } = useChain(); const { address } = useAccount(); const [isLoading, setIsLoading] = useState(!!asset.logoURI); + const [imgSrc, setImgSrc] = useState(asset.logoURI); const linkExplorer = useMemo(() => { if (!chain?.subscan?.url) return ''; @@ -93,9 +94,9 @@ const NFTItem: React.FC = React.memo(({ asset }) => {
)} - {asset.logoURI ? ( + {imgSrc ? ( {`${asset.symbol}-NFT`} = React.memo(({ asset }) => { : 'luno:opacity-100 luno:transition-opacity luno:duration-200' )} onLoad={() => setIsLoading(false)} - onError={() => setIsLoading(false)} + onError={() => { + setIsLoading(false); + setImgSrc(''); + }} /> ) : ( @@ -112,7 +116,7 @@ const NFTItem: React.FC = React.memo(({ asset }) => {
- + {asset.balance || '-'} NFTs +
+ {sendTransactionInBlockData && ( +
+
+ Status: + {sendTransactionInBlockData.status} +
+
+ Hash: + + {sendTransactionInBlockData.transactionHash.slice(0, 20)}... + +
+
+ )} + {detailedStatusInBlock && ( +
+
+ DetailedStatus: + {detailedStatusInBlock} +
+
+ )} +
+ ) : ( + Connect wallet first + )} +
+
+ {/* API Status Card */}
diff --git a/examples/with-vite/src/main.tsx b/examples/with-vite/src/main.tsx index b0973bc..0ecdade 100644 --- a/examples/with-vite/src/main.tsx +++ b/examples/with-vite/src/main.tsx @@ -29,22 +29,13 @@ import { subwalletConnector, talismanConnector, walletConnectConnector, + onekeyConnector, + ledgerConnector, } from '@luno-kit/react/connectors'; import { LunoKitProvider } from '@luno-kit/ui'; import App from './App.tsx'; import '@luno-kit/ui/styles.css'; - -const connectors = [ - polkadotjsConnector(), - subwalletConnector(), - talismanConnector(), - polkagateConnector(), - fearlessConnector(), - mimirConnector(), - enkryptConnector(), - walletConnectConnector({ projectId: import.meta.env.VITE_WALLET_CONNECT_ID }), - novaConnector({ projectId: import.meta.env.VITE_WALLET_CONNECT_ID }), -]; +import { QueryClientProvider, QueryClient } from '@tanstack/react-query' // Custom chains const astar: Chain = { @@ -107,26 +98,42 @@ const hydration: Chain = { }, }; +const chains = [ + polkadot, + kusama, + westend, + paseo, + astar, + hydration, + polkadotAssetHub, + polkadotCoretime, + polkadotCollectives, + polkadotPeople, + kusamaAssetHub, + kusamaCoretime, + kusamaPeople, + paseoAssetHub, + paseoPassetHub, + westendAssetHub, +]; + +const connectors = [ + ledgerConnector({ chains }), + onekeyConnector(), + polkadotjsConnector(), + subwalletConnector(), + talismanConnector(), + polkagateConnector(), + fearlessConnector(), + mimirConnector(), + enkryptConnector(), + walletConnectConnector({ projectId: import.meta.env.VITE_WALLET_CONNECT_ID }), + novaConnector({ projectId: import.meta.env.VITE_WALLET_CONNECT_ID }), +]; + const lunoConfig = createConfig({ appName: 'luno with-vite example', - chains: [ - polkadot, - kusama, - westend, - paseo, - astar, - hydration, - polkadotAssetHub, - polkadotCoretime, - polkadotCollectives, - polkadotPeople, - kusamaAssetHub, - kusamaCoretime, - kusamaPeople, - paseoAssetHub, - paseoPassetHub, - westendAssetHub, - ], + chains, connectors: connectors, autoConnect: true, subscan: { @@ -134,165 +141,184 @@ const lunoConfig = createConfig({ }, }); +const queryClient = new QueryClient(); + createRoot(document.getElementById('root')!).render( - + - - - - + // 9. Complete theme via theme property in overrides + // theme={{ + // light: { + // colors: { + // accentColor: '#9b59b6', + // modalBackground: '#34495e', + // modalText: '#ecf0f1', + // connectButtonBackground: '#9b59b6', + // connectButtonText: '#ffffff', + // }, + // fonts: { + // body: 'Inter, sans-serif', + // heading: 'Inter, sans-serif', + // }, + // radii: { + // modal: '24px', + // connectButton: '16px', + // }, + // shadows: { + // modal: '0 25px 50px rgba(155, 89, 182, 0.3)', + // }, + // blurs: { + // modalOverlay: '12px', + // } + // } + // }} + > + + + + + ); diff --git a/examples/with-vite/vite.config.ts b/examples/with-vite/vite.config.ts index fabde1a..d0956b3 100644 --- a/examples/with-vite/vite.config.ts +++ b/examples/with-vite/vite.config.ts @@ -3,4 +3,7 @@ import { defineConfig } from 'vite'; export default defineConfig({ plugins: [react()], + server: { + host: '0.0.0.0', + }, }); diff --git a/packages/core/package.json b/packages/core/package.json index e25cf03..cdf20ca 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -59,9 +59,12 @@ }, "dependencies": { "@dedot/chaintypes": "catalog:", + "@ledgerhq/hw-transport-webusb": "6.29.13", "@mimirdev/apps-inject": "3.2.0", "@polkadot-api/pjs-signer": "0.6.14", "@walletconnect/universal-provider": "2.21.4", + "@zondax/ledger-substrate": "2.0.0", + "buffer": "6.0.3", "dedot": "catalog:", "eventemitter3": "5.0.1" }, diff --git a/packages/core/src/config/createConfig.test.ts b/packages/core/src/config/createConfig.test.ts index 183fd8d..dd1f7f4 100644 --- a/packages/core/src/config/createConfig.test.ts +++ b/packages/core/src/config/createConfig.test.ts @@ -84,7 +84,7 @@ describe('createConfig', () => { autoConnect: true, customRpc: undefined, customTypes: undefined, - cacheMetadata: undefined, + cacheMetadata: true, metadata: undefined, scaledResponses: undefined, }); @@ -310,7 +310,7 @@ describe('createConfig', () => { expect(config.customTypes).toBeUndefined(); expect(config.customRpc).toBeUndefined(); - expect(config.cacheMetadata).toBeUndefined(); + expect(config.cacheMetadata).toBe(true); expect(config.metadata).toBeUndefined(); expect(config.scaledResponses).toBeUndefined(); }); diff --git a/packages/core/src/config/createConfig.ts b/packages/core/src/config/createConfig.ts index 8ccd741..647b1b5 100644 --- a/packages/core/src/config/createConfig.ts +++ b/packages/core/src/config/createConfig.ts @@ -44,7 +44,7 @@ export function createConfig(parameters: CreateConfigParameters): Config { transports = {}, storage = defaultLunoStorage, autoConnect = true, - cacheMetadata, + cacheMetadata = true, metadata, scaledResponses, customTypes, @@ -89,7 +89,5 @@ export function createConfig(parameters: CreateConfigParameters): Config { subscan, }; - console.log('[createConfig]: Luno Core Config created:', config); - return config; } diff --git a/packages/core/src/config/createStorage.ts b/packages/core/src/config/createStorage.ts index f8263f1..12b2527 100644 --- a/packages/core/src/config/createStorage.ts +++ b/packages/core/src/config/createStorage.ts @@ -3,7 +3,7 @@ import type { LunoStorage, RawStorage } from '../types'; // Defines the parameters for the createStorage function. export interface CreateStorageParameters { storage: RawStorage; - keyPrefix?: string; // Optional key prefix, e.g., "luno." + keyPrefix?: Optional; // Optional key prefix, e.g., "luno." } /** diff --git a/packages/core/src/config/logos/generated/index.ts b/packages/core/src/config/logos/generated/index.ts index 694ceca..4872424 100644 --- a/packages/core/src/config/logos/generated/index.ts +++ b/packages/core/src/config/logos/generated/index.ts @@ -17,6 +17,7 @@ export { kusamaChain } from './kusamaChain.js'; export { ledgerWallet } from './ledgerWallet.js'; export { mimirWallet } from './mimirWallet.js'; export { novaWallet } from './novaWallet.js'; +export { onekeyWallet } from './onekeyWallet.js'; export { paseoChain } from './paseoChain.js'; export { peopleChain } from './peopleChain.js'; export { peopleKusamaChain } from './peopleKusamaChain.js'; diff --git a/packages/core/src/config/logos/generated/ledgerWallet.ts b/packages/core/src/config/logos/generated/ledgerWallet.ts index 11aa2c3..579fe58 100644 --- a/packages/core/src/config/logos/generated/ledgerWallet.ts +++ b/packages/core/src/config/logos/generated/ledgerWallet.ts @@ -4,4 +4,4 @@ // Do not edit. Auto-generated via node scripts/convertLogos.mjs export const ledgerWallet = - 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/Pg0KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjAvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvMjAwMS9SRUMtU1ZHLTIwMDEwOTA0L0RURC9zdmcxMC5kdGQiPg0KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiBpZD0iYm9keV8xIiB3aWR0aD0iNDAwIiBoZWlnaHQ9IjQwMCI+DQoNCjxnIHRyYW5zZm9ybT0ibWF0cml4KDEuMzMzMzMzNCAwIDAgMS4zMzMzMzM0IDAgMCkiPg0KCTxpbWFnZSAgeD0iMCIgeT0iMCIgeGxpbms6aHJlZj0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFaQUFBQUdRQ0FZQUFBQ0F2emJNQUFBQUFYTlNSMElBcnM0YzZRQUFBQVJuUVUxQkFBQ3hqd3Y4WVFVQUFBQUpjRWhaY3dBQURzTUFBQTdEQWNkdnFHUUFBQnJ5U1VSQlZIaGU3ZHpianlWVjJUL3dWK2M4QXdOb2pDTElTUmlHczVCNDUzK2hKc1lMTDd3anhrUkR2TkE3WTR6ZUdZMW9FQWhJUXRERVF6d1ROUVpKRkExZUdJTVJoNUVCUkdBNEtFWVlaZ2FHZW45UC9WajlybXFlNmRYdFZEZFZ1ejhyK1dTdi9hVjdoMXExMW5xcTl0NDkvL1AvV2djQS80VTBCSUNXTkFTQWxqUUVnSlkwQklDV05BU0FsalFFZ0pZMEJJQ1dOQVNBbGpRRWdKWTBCSUNXTkFTQWxqUUVnSlkwQklDV05BU0FsalFFZ0pZMEJJQ1dOQVNBbGpRRWdKWTBCSUNXTkFTQWxqUUVnSlkwQklDV05BU0FsalFFZ0pZMEJJQ1dOQVNBbGpRRWdKWTBCSUNXTkFTQWxqUUVnSlkwQklDV05BU0FsalFFZ0pZMEJJQ1dOQVNBbGpRRWdKWTBCSUNXTkFTQWxqUUVnSlkwQklDV05BU0FsalFFZ0pZMEJJQ1dOQVNBbGpRRWdKWTBCSUNXTkFTQWxqUUVnSlkwQklDV05BU0FsalFFZ0pZMEJJQ1dOQVNBbGpRRWdKWTBCSUNXTkFTQWxqUUVnSlkwQklDV05BU0FsalFFZ0pZMEJJQ1dOQVNBbGpRRWdKWTBCSUNXTkFTQWxqUUVnSlkwQklDV05BU0FsalFFZ0pZMEJJQ1dOQVNBbGpRRWdKWTBCSUNXTkFTQWxqUUVnSlkwQklDV05BU0FsalFFZ0pZMEJJQ1dOQVNBbGpRRWdKWTBCSUNXTkFTQWxqUUVnSlkwQklDV05BU0FsalFFZ0pZMEJJQ1dOQVNBbGpRRWdKWTBCSUNXTkFTQWxqUUVnSlkwQklDV05BU0FsalFFZ0pZMEJJQ1dOQVNBbGpRRWdKWTBCSUNXTkFTQWxqUUVnSlkwQklDV05HUkVXN1pzV2VwdjNicTFmOXk3ZCs5U3hzbnQzTG16ZjR3eDNMRmpSOS9mdFd0WC8vaW1ONzFwNmVmbUtvNmh6SWxRNWtya2kzQjg2KzNOYjM1elB5OWlyT28xdFczYnRzSFBzVzdTa0pIVW04UDI3ZHNIL2JJaGNuS3hRZFRGbzJSRi9iTnpWQXBHT2I3eWZCR09iU1BWNDFVS2I3M2VXRGRweURvb1YwVVhYbmhoZCs2NTUzYm5uWGRlMytmazN2bk9kM2FYWEhKSjcvenp6Kzh1dmZUU2ZneVhYN25QVlNrYzczM3ZlL3M1Y2M0NTUvVEgvTzUzdjd2YnQyOWZPaWI4bjVnVFYxNTVaVCtHVVh4Mzc5NjlkTmZLaGtoRFJoSWJYVndkeFdZWGI3MWNmdm5sM2E5KzlhdnV3UWNmN0I1NTVKSHUwS0ZEck9DaGh4N3Evdjczdi9mOWh4OSt1THYvL3Z1N2E2Kzl0dDhrRnVFdG5qaUdLSTUvL3ZPZnU4Y2VlNng3K3VtbisrTThjT0JBbnkwZkQ0Wml6R0tPeEh5b0MwZGNyTG5EM3hCcHlFaGlneWh2UzRSM3ZldGQvYVF2N2RWWFgyVUZMNy84Y3Y5NDdOaXhmcnorK2M5L2RwZGRkdGxnak9jczVzZisvZnU3NDhlUGQ2Kzg4a3AvckMrOTlGSjM0c1NKL25qcnNlRDFZc3hDak9XZVBYdjY4WXhDc2doM3B6T1Job3dvcm9iaTFqckVadkg0NDQvM0c4YlJvMGY3VFVKcnR4aXJHTE5ubm5tbXUrcXFxL3JONGkxdmVVczYzbk1UYjFmRkpoakZNbHIwdGRXM3VMaUl0UlZqR1lWaitlZEpyS3MwWkdSeFpSVGlQZHU0NVM0dHU2cmkvOFRWZUJtbmFIRUhFZ1VrRytNNWlnM3ZpaXV1NkkrdHZ1dUlJaElGc3g0TFhpL0dLUXBJS1JyMUhiOXZZbTJJTkdRa3NVR0VtTmp4UEFySXdZTUgrNDNDSGNqcVdtd1VzVW5FNCtIRGg3dXJyNzY2SDg5RmVZODdDbUswNVc5YmFlMVczdHFNY1l4dlhjVzg4QTIyRFpXR2pLUVVqaEFUT3dwSWZFZ2FiVFdiUkZrZzljK1c5OHVqbGMxbVVVV0w0NDBXeC96a2swLzIzN3FweDNYdTRsdFhwY1V4eGx0WjVlMnNiRXdXU1RtM01jL0xNWmRXN2o1WDA4cFlMdEs4bUlrMFpDU25Xa0NpeGMvRjFXa3NzUG90bmVVTGJwRmJ1VHFQYnltVnQ3QVdZYk9JdDFuaWM3RTRyMlV6amJiYXVUSDN0dnc0WXh6SzUxM2xuSyttbGZGVVFEWmNHaktTVXkwZ2NVVWFpNnI4N0FzdnZOQS94aFZiS1NxTHJCeHZlWXdQMGErNTVwckJHTS9kZGRkZDEyK2E1YTZ5blBQWVJMTXhXU1F4aitQWXk5dTU1WTY3WENpdHRwV3hWRUEyWEJveWtqRUtTTFN5c01yenRTNnd1YmI2dUdPOG5uMzIyZjRPSks3Y0YrVzk3dVVmb20vR3RueWVyL1h6d1RLV0NzaUdTME5HY3FvRnBMeXQ4Znp6ejNkSGpoeFoybVRLRlZ3c3ZFVVdZeFRLMVdyY2djVFhYbU5jRitGcm1sRUk0MitEb3NXNWptTXQ1empPZHpZbWl5WmFPYzh2dnZoaS94am4ybHRZczVDR2pHU3NBaEp0K1lJcWkyL1JXOWxVb2ozMzNITkwvM1RGSW9nNWNkRkZGdzNtUWpubm0rSDhsdU91ajdYMEZaQlpTRU5HY3FvRkpPNDh2djN0YjNjLy9lbFB1eC8vK01mZGQ3LzczZTQ3My9sTzk2TWYvYWo3L3ZlLzMyZUxMSTQ3anZtSFAveGhmOHkzM1haYi84L0JMTXBmR3NmOGlIOFQ3YzQ3Nyt5Kzk3M3Y5Y2NaNS9mdXUrL3Vmdjd6bjZkanNraCs5ck9mOWVLWVl6Ny81Q2MvNmU2NjY2NytuNjlaUzZ2SHN4NWYxbDBhTXBKVExTQy8vT1V2bC82T3BMeGxFLzNJTnN1L05scS9WWFd5L2x5VmY1cStQSmJQZGtMOWM0dXMvb08vT0tmeDl6MjMzSExMbXU3QXl1OHJJQnN1RFJuSnFSYVFlKzY1WitsMXltdkY0MmJhWUZoYzlmcW8rN2ZmZnZ1cTFrZHAyV3V3SWRLUWtkUVRXZ0dCb1hwOTFIMEZaRGJTa0pIVUUxb0JnYUY2ZmRSOUJXUTIwcENSMUJOYUFZR2hlbjNVZlFWa050S1FrZFFUV2dHQm9YcDkxSDBGWkRiU2tKSFVFMW9CZ2FGNmZkUjlCV1EyMHBDUjFCTmFBWUdoZW4zVWZRVmtOdEtRa2RRVFdnR0JvWHA5MUgwRlpEYlNrSkhVRTFvQmdhRjZmZFI5QldRMjBwQ1IxQk5hQVlHaGVuM1VmUVZrTnRLUWtkUVRXZ0dCb1hwOTFIMEZaRGJTa0pIVUUxb0JnYUY2ZmRSOUJXUTIwcENSMUJOYUFZR2hlbjNVZlFWa050S1FrZFFUV2dHQm9YcDkxSDBGWkRiU2tKSFVFMW9CZ2FGNmZkUjlCV1EyMHBDUjFCTmFBWUdoZW4zVWZRVmtOdEtRa2RRVFdnR0JvWHA5MUgwRlpEYlNrSkhVRTFvQmdhRjZmZFI5QldRMjBwQ1IxQk5hQVlHaGVuM1VmUVZrTnRLUWtkUVRXZ0dCb1hwOTFIMEZaRGJTa0pIVUUxb0JnYUY2ZmRSOUJXUTIwcENSMUJOYUFZR2hlbjNVZlFWa050S1FrZFFUV2dHQm9YcDkxSDBGWkRiU2tKSFVFMW9CZ2FGNmZkUjlCV1EyMHBDUjFCTmFBWUdoZW4zVWZRVmtOdEtRa2RRVFdnR0JvWHA5MUgwRlpEYlNrSkhVRTFvQmdhRjZmZFI5QldRMjBwQ1IxQk5hQVlHaGVuM1VmUVZrTnRLUWtkUVRXZ0dCb1hwOTFIMEZaRGJTa0pIVUUxb0JnYUY2ZmRSOUJXUTIwcENSMUJOYUFZR2hlbjNVZlFWa050S1FrZFFUV2dHQm9YcDkxSDBGWkRiU2tKRnMzYnExMjdKbFM5K1B5WDN4eFJkM2p6NzZhTDg0VHB3NDhkcjBQM203OTk1Nys5L2Z0bTNiMG10R2Y3TVVrUmkvT041NC9HK090NHhWUE83WXNjTUdNMUZ4ZnJkdjM5N1A5VGhITjk5ODg2cldSMm54R25GKzR6RmV3d1hXaGtsRFJsUnZmaGRjY01GU0FUbDI3RmovdUpKZi9PSVhTNjhSQzZ4ZUdKR1YvbVlReDc5cjE2Nmw4U3pGWVNYWjY4VHZ4V3RsLzQyTnRYdjM3cVdpVWJJNFAzZmNjY2RycFdIbEZtc2tXcjAyeW12RjY1VFhaTjJrSVNNcUcxMzB6enZ2dk83UW9VUDlwRjlOKzgxdmZyUDBPdlVDMlN6RjQ0d3p6amlsalNER2F1Zk9uYjE0bmMxV2RPY2d6bEhjUGRUek8rNUFYbnJwcGRkV3djbmI4ZVBIdTZOSGp5NzlicnhPbk92b2w0eDFsWWFNSkRhdE1wSGpTdXVpaXk3cURodzQwRS82dUVWZmZzZXgzSzkvL2V2WDNaTEg4ejE3OWl3OVgzUng3T1g0b3dERVZXdHNFckhSdEN4L25ib1l1UXVaam5wK1J6OCtBNGtXYTJRbHBaWGZqWE5lTGhLYzN3MlJocXlEMkx6Mjc5L2ZQZjc0NDY5TiszYTcrKzY3K3dVVmk2SitENys4MzdzWlpNVmd0ZUl0cnlpNDVYbU1ZMWhlVEhoanhNVkEvYnljNXh0dnZMRTdjdVRJYTZ2ZzVPM1paNS90SCtOM050TkYxWVNrSVNPSnphdTh6eHZQeno3NzdPNXZmL3RiZi9WVTdrSldjdDk5OS9XYllQeHV1ZnFPZm4zRnRzanFUVDZLWnJtcWpPT1BEU01lVjFKK05zYXRGTjBZUjFlbjB4RG5JaDdqSE5XRi90WmJiKzBMUTNaWFhpc3RmaWZPY1JTZ2VKMzZ0VmhYYWNpSVlsTEhRb20zWGZidDI3ZW16MEIrOElNZkRLN1NTakVwbStObVVRcENrZjFNcHI0cXJlL2FOdE1kM0pTVk80NTZ3NCtMaHR0dXU2My9ra21yUlJFNWZQandZSTNFYThacmxPTEV1a3BEUmxJKzBJdEpYYTU2UC8zcFQzYzMzSEJEOTZsUGZhcjd6R2MrczZMcnI3KysvNTNZQ09NMXlvTGJUSXNqTm9keXZIRUg5K0VQZjdqNzNPYysxMzNoQzEvb1B2LzV6Ni9vWXgvN1dIZk9PZWYwdnh2alh6WXFkeURURWhjRmNXN0tlbm4vKzkvZmZmS1RuK3crOFlsUHJPampILzk0djA3SzJpaS9IOHBhWVYybElVelM2YWVmM3YzKzk3OS83ZnF6M2Y3eWw3LzBSYWZlVE1vZGpBMEdUbGthd2lRcElEQXBhUWlUcElEQXBLUWhUSklDQXBPU2hqQkpDZ2hNU2hyQ0pDa2dNQ2xwQ0pPa2dNQ2twQ0ZNa2dJQ2s1S0dNRWtLQ0V4S0dzSWtLU0F3S1drSWs2U0F3S1NrSVV5U0FnS1Rrb1l3U1FvSVRFb2F3aVFwSURBcGFRaVRwSURBcEtRaFRKSUNBcE9TaGpCSkNnaE1TaHJDSkNrZ01DbHBDSk9rZ01Da3BDRk1rZ0lDazVLR01Fa0tDRXhLR3NJa0tTQXdLV2tJazZTQXdLU2tJVXlTQWdLVGtvWXdTUW9JVEVvYXdpUXBJREFwYVFpVHBJREFwS1FoVEpJQ0FwT1NoakJKQ2doTVNockNKQ2tnTUNscENKT2tnTUNrcENGTWtnSUNrNUtHTUVrS0NFeEtHc0lrS1NBd0tXa0lrNlNBd0tTa0lVeVNBZ0tUa29Zd1NRb0lURW9hd2lRcElEQXBhUWlUcElEQXBLUWhUSklDQXBPU2hqQkpDZ2hNU2hyQ0pDa2dNQ2xwQ0pPa2dNQ2twQ0ZNa2dJQ2s1S0dNRWtLQ0V4S0dzSWtLU0F3S1drSWs2U0F3S1NrSVV5U0FnS1Rrb1l3U1FvSVRFb2F3aVFwSURBcGFRaVRwSURBcEtRaFRKSUNBcE9TaGpCSkNnaE1TaHJDSkNrZ01DbHBDSk9rZ01Da3BDRk1rZ0lDazVLR01Fa0tDRXhLR3NJa0tTQXdLV2tJazZTQXdLU2tJVXlTQWdLVGtvWXdTUW9JVEVvYXdpUXBJREFwYVFpVHBJREFwS1FoVEpJQ0FwT1NoakJKYXkwZ0R6endRUGUydDcydC85MG9HSFh4MkxadDIrQzEzeWhidG16cC8zKzJiOS9lUDYvN01IRnBDSk8wMWdMeThNTVBkK2VmZjM2M1k4ZU8xOTF4eFBNMzJ0YXRXMTlYUUtMSVJWNy92OEpFcFNGTTBsb0x5Si8rOUtmdXJMUE82bjgzN2poaWs5NjllM2YvUERidCtyWGZhRkZJU2o4S25pTENES1FoVE5KYUM4ampqei9lWFhEQkJZUFhLQnR6RkpMNmJ1Q05FUDh2NWM2akxoaVI3ZHk1YytrNVRGUWF3aVN0dFlEY2Q5OTkzZnZlOTc1dS8vNzkzU1dYWE5LZGQ5NTUzYjU5Ky9ySHlDNisrT0kzMUVVWFhkUS94ckZGd1lqanErOUVZT0xTRUNacHJRVWsybC8vK3RmdXFhZWU2ZzRmUHR3OSt1aWozYlBQUHR2Zm1jVG5JNDg5OXRnYkt2NC83cjc3N3FVUCtvdTRHOW0xYTljZ2d3bEtRNWlrdFJhUWwxOSt1VHQrL0hqZmYrV1ZWN29qUjQ1MEowNmM2SjlQcFIwNGNHQ3BXTVJiVjFFODRvUDA4bzB4bUxBMGhFbjZiKzVBb2gwOWV2UzEzdjh2S3FXOSt1cXJiNmo0ZjRrN2tYSjg5VmVMRlJCbUlBMFpVYnluWGIrdnZmeDVTL21RTlg0bnZwMVQ4cW44SGNONld2N0I4aGxubkxGVVFPSk9JdHVVNStiZ3dZTkx4MWlLUmpubml5N21kSHlab0R3dlh5d0lkWDR5WlIyVk83Zm94Kyt0WlgxeFN0S1FrY1dramcyLy91WlA5bk9yRVl1bHZFNzIzeGRKSEdOZFJLSi8vLzMzOXdWa0VWcThyUllGcFA0N2xWSkU2dU5lZERHbjQyMjh0UmJPR0tQeWJiVVl0eWdjbTJuY0ppQU5HY21lUFh2Nng3STUxSk03Sm56a0s0a0ZFVTQ3N2JTbHYxK0kzOXNzVjZnaENtK01XMnd3TVFaLy9PTWZsemJmdUF1WnMzaHI3Y0VISDF3NjMzR2NjYTdqdU9QNThyRllOTXYvd0xNVXo1anpVUmpLdUp4TS9GejVPNS95dTRXdlFXK0lOR1FrTWNsallrY2hpWDY1YzhqK01ub2w4UnJMRjBnc252cjVJb3BDV1RhQ09ONTQvcnZmL2E3L01EeDdPMmh1b2ozeHhCT3ZPK1o0M0N4dlVhNWxIYXdrNWtjbzYyVDVlbUZkcENFaktaTzRiQXIxcEY3TndvbmZxKzlhWW9IVTM5Z3ArU0lyRzJtTVhYd0dFbjlkdmlqdCtlZWY3dzRkT3JSMG5PV2lJQjdIMmxpbkx1WjNYU3hqWHNlRjFtcSt4dnlPZDd5akg2ZjZaK3Npd3JwTFEwWlNUK1NZMkdWeXgyUGNsVVIvSmZGN3NjRDI3dDI3OUJybHJhem9sOWRlWkhFSFVvcm9tV2VlMmYzaEQzL29qaDA3dHZTVjNEbUw5c2dqai9USEYrZTdiS1NyMlR3WFFSeDNPYmRGakVFcG5zdlh3M0xsNStJMTZvSmIxbHA1enJwSlEwWVNpMkg1NXlCUkRHTHkxejkzTW5IRkhZK3hHTXJtVW41MytjSmJaT1ZZenozMzNPN2VlKzhkZkMxM3ppM2V4dnJ0YjMvYmZ6MjVIR3U1b3Q0TTU3Y3VGREcveTl5T3ZLeWJsY1RQdmYzdGIrLzdjV0VWZHk5bG5aVFhabDJsSVNPS3ErYlNqMzlDNDdPZi9XejN6Vzkrczd2OTl0dTdXMis5ZFVVMzNIREQwa0lxZHg1bFlXeUdCVksrdGh5UDVZcnlneC84WVBlUmozeWsrK2hIUHpwNzExOS9mZmVoRDMyb1A2N1krT0p1cTJ5QW0wWE00emkvNWJpam1IN2dBeDlJMThOeU45MTBVM2ZqalRmMmM2T3NoMUo0VjN1UnhpbEpRMFpTYi9JeG9lT2ZGbzkvUXFOY2ZiYmFQZmZjcy9RNjViWGkwZUpnRWRUcm8rN0h4ZFZxMWtkcDJXdXdJZEtRa2RRVFdnR0JvWHA5MUgwRlpEYlNrSkhVRTFvQmdhRjZmZFI5QldRMjBwQ1IxQk5hQVlHaGVuM1VmUVZrTnRLUWtkUVRXZ0dCb1hwOTFIMEZaRGJTa0pIVUUxb0JnYUY2ZmRSOUJXUTIwcENSMUJOYUFZR2hlbjNVZlFWa050S1FrZFFUV2dHQm9YcDkxSDBGWkRiU2tKSFVFMW9CZ2FGNmZkUjlCV1EyMHBDUjFCTmFBWUdoZW4zVWZRVmtOdEtRa2RRVFdnR0JvWHA5MUgwRlpEYlNrSkhVRTFvQmdhRjZmZFI5QldRMjBwQ1IxQk5hQVlHaGVuM1VmUVZrTnRLUWtkUVRXZ0dCb1hwOTFIMEZaRGJTa0pIVUUxb0JnYUY2ZmRSOUJXUTIwcENSMUJOYUFZR2hlbjNVZlFWa050S1FrZFFUV2dHQm9YcDkxSDBGWkRiU2tKSFVFMW9CZ2FGNmZkUjlCV1EyMHBDUjFCTmFBWUdoZW4zVWZRVmtOdEtRa2RRVFdnR0JvWHA5MUgwRlpEYlNrSkhVRTFvQmdhRjZmZFI5QldRMjBwQ1IxQk5hQVlHaGVuM1VmUVZrTnRLUWtkUVRXZ0dCb1hwOTFIMEZaRGJTa0pIVUUxb0JnYUY2ZmRSOUJXUTIwcENSMUJOYUFZR2hlbjNVZlFWa050S1FrZFFUV2dHQm9YcDkxSDBGWkRiU2tKSFVFMW9CZ2FGNmZkUjlCV1EyMHBDUjFCTmFBWUdoZW4zVWZRVmtOdEtRa2RRVFdnR0JvWHA5MUgwRlpEYlNrSkhVRTFvQmdhRjZmZFI5QldRMjBwQ1IxQk5hQVlHaGVuM1VmUVZrTnRLUWtkUVRXZ0dCb1hwOTFIMEZaRGJTa0pIVUUxb0JnYUY2ZmRSOUJXUTIwcENSMUJOYUFZR2hlbjNVZlFWa050S1FrZFFUV2dHQm9YcDkxSDBGWkRiU2tKSFVFMW9CZ2FGNmZkUjlCV1EyMHBDUjFCTmFBWUdoZW4zVWZRVmtOdEtRa2RRVFdnR0JvWHA5MUgwRlpEYlNrSkhVRTFvQmdhRjZmZFI5QldRMjBwQ1IxQk5hQVlHaGVuM1VmUVZrTnRLUWtkUVQrcjhwSUFjUEh1eHV2dm5tN290Zi9HTC8rTld2ZnJYNzBwZSsxSDN0YTEvcnZ2emxML2ZQRjlsWHZ2S1Y3aHZmK0VaMzQ0MDM5bU1ReDN6bW1XY3V6RWF4YmR1MmJ1L2V2ZDFkZDkzVjNYVFRUZDNYdi83MS9qemZlZWVkM1MyMzNOSnZwSXNzNW5FYzV4MTMzTkhkZHR0dC9SaDg2MXZmNmg1NDRJSFhWc0RxV2hsUEJXVERwU0VqT2RVQ0V1MmxsMTdxVHB3NDBmZVBIeisrMUk4OFhtT1J4YkcrL1BMTDNTdXZ2TklkUFhxMGUrcXBwN3JycnJ1dTI3SmxTNjhlNnptSytYSGxsVmQyTDc3NFluOU82eGJIRzhlL3lLTEZlWTV6SEkvUklvL3p2WlpXajJjOXZxeTdOR1FrcDFwQS92T2YvL1NMcTdRalI0NHNMYnkxTHJLNXR2cjRuMy8rK2U3eXl5OS8zZGpPMlJWWFhORVhpMmh4Ym84ZE85YjNOMHVMaTZMbHh4elBZNjZ2dHBXeFZFQTJYQm95a2xNdElLWEZ4bEt1eE10anRIaU5SUmJIR3FJZkc4MFRUenpSWFgzMTFkM1dyVnU3M2J0M0Q4WjZqdUl1S3U1QTR0aEtLOGNlNXpqTysyWlFqamtySnF0cFpUd1ZrQTJYaG94a2pBSlNGbGJkTnN2ZFIyd3VwVVVoZWZMSko3dHJycmxtTU1aemQ4a2xseXpkZ1pRV3g3MVp6bkcwNVd1aEZKYlZ0aktXQ3NpR1MwTkdjcW9GcEh6T0VZc3Bpa2haVlBFWWVXd3lpeXhhRkk3UzRpMnMrQXdreGpJK2dLN0hlbzYyYjkvZXY0VlZ6bVc4YlJOWDRNc3ZHQmExeFhHR2NwZFp0OVdzajlMS2VDb2dHeTROR2NtcEZwRDZaMktEaVN2VnRTeXNSV2hsZzRualAzejRjSGZaWlpmMTQ3a0lINktIdUFOWjNrcnhMRmZpaTZwdThieWM2K1gvcmRYS1dDb2dHeTROR2NtcEZwQ3lxTXJQeG1OazhWaGZtUzl5SzhjZXh4MEY1S3FycmxvYXp6SzJjeFYzVWZ2MjdldlBaUkZ0czV6YmFIRitvMkNXb2xuYVdzYWdqS2NDc3VIU2tKSEVWWEpzZE9WcU9iNUI5TkJERC9XVFBncUR0bklybTBpNTgzcjY2YWY3RDUxakxCZmhMYXh3NmFXWDlzZFliNkJsUTQxajV1U2l4WVZGckxINmdtTEhqaDBMY1lFeEEybkl5R0pDeCtPRkYxN1lQZkxJSTBzYlkweCtUbTU1ZSs2NTUvb3I5dVhqTzFkeFlSRjNwZEhpZ2lJc3Z4TFgycTFjcE1XMzgzYnQycFdPTmVzaURSbEptY3d4d2VQMmV2LysvZDAvL3ZHUDdvVVhYbmh0Nm1zcnRkaFF5emVVb3VnKzg4d3ozWHZlODU2RnVjS01EZS9zczgvdWp5K090UlRPdUxxTzR5NTNJdVJpbkdLODZydlIrR0pDUEM3QzE3eG5JQTBaVVV6b2NnY1NCU1R1UUVvckd3YTVhUC82MTcrV2lraDhqZmZhYTYvdHgzSlIzdStPYjJIRm5WVWNZM3dMSzc1cEZvOVJNT012MURtNStNYmF2Ly85NzM0Y280aVU0dkhXdDc1MU1NYXNtelJrSktlZGRsci9HSnZkbmoxNytxdm1jdVZjK3B4Y2pGT01XN21hM0xsejU5TGpJbndHVW80bi9uMnZrc1Z4K1RCNDlVclJLTXBZbm5YV1dZT2NkWkdHakNnMndySXBsSTNCN2ZYcXhPWlF2b0FRNHhoditaVC9WZ3JNM0oxKyt1bXZ5MktlZUMrL3JaNERjWmRmUGdjcGQveXN1elJrSlBVbUVKTTlKblpzRG1YaWw2SkNyb3hkS1J3eGJsRlVvaUNYd2pKM1piT0w0eTNIVnY3Yjh2RmdLT1pBUE1hOHFDOHVvbDgvWjkya0lTT0p5UjJQTWRGTDBTZ2JSTDFSa0N0djhaUzNBaGR0ek1vbUY0OWxyb1N5UWJLeWVyektHTVkvangrWjliVWgwaEFBV3RJUUFGclNFQUJhMGhBQVd0SVFBRnJTRUFCYTBoQUFXdElRQUZyU0VBQmEwaEFBV3RJUUFGclNFQUJhMGhBQVd0SVFBRnJTRUFCYTBoQUFXdElRQUZyU0VBQmEwaEFBV3RJUUFGclNFQUJhMGhBQVd0SVFBRnJTRUFCYTBoQUFXdElRQUZyU0VBQmEwaEFBV3RJUUFGclNFQUJhMGhBQVd0SVFBRnJTRUFCYTBoQUFXdElRQUZyU0VBQmEwaEFBV3RJUUFGclNFQUJhMGhBQVd0SVFBRnJTRUFCYTBoQUFXdElRQUZyU0VBQmEwaEFBV3RJUUFGclNFQUJhMGhBQVd0SVFBRnJTRUFCYTBoQUFXdElRQUZyU0VBQmEwaEFBV3RJUUFGclNFQUJhMGhBQVd0SVFBRnJTRUFCYTBoQUFXdElRQUZyU0VBQmEwaEFBV3RJUUFGclNFQUJhMGhBQVd0SVFBRnJTRUFCYTBoQUFXdElRQUZyU0VBQmEwaEFBV3RJUUFGclNFQUJhMGhBQVd0SVFBRnJTRUFCYTBoQUFXdElRQUZyU0VBQmEwaEFBV3RJUUFGclNFQUJhMGhBQVd0SVFBRnJTRUFCYTBoQUFXdElRQUZyU0VBQmEwaEFBV3RJUUFGclNFQUJhMGhBQVd0SVFBRnJTRUFCYTBoQUFXdElRQUZyU0VBQmEwaEFBV3RJUUFGclNFQUJhMGhBQVd0SVFBRmJ3UDkzL0Fxb2FrMlU4Tm9pd0FBQUFBRWxGVGtTdVFtQ0MiIHByZXNlcnZlQXNwZWN0UmF0aW89Im5vbmUiIHdpZHRoPSIzMDAiIGhlaWdodD0iMzAwIi8+DQo8L2c+DQo8L3N2Zz4NCg=='; + 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMjU2cHgiIGhlaWdodD0iMjU2cHgiIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogICAgPHRpdGxlPue8lue7hDwvdGl0bGU+CiAgICA8ZyBpZD0i6aG16Z2iLTEiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxnIGlkPSLnvJbnu4QiIGZpbGwtcnVsZT0ibm9uemVybyI+CiAgICAgICAgICAgIDxwYXRoIGQ9Ik0yMzYsMCBMMjAsMCBDOC45NTQzMDUsMy41NTI3MTM2OGUtMTUgLTMuNTUyNzEzNjhlLTE1LDguOTU0MzA1IDAsMjAgTDAsMjM2IEMwLDI0Ny4wNDU2OTUgOC45NTQzMDUsMjU2IDIwLDI1NiBMMjM2LDI1NiBDMjQ3LjA0NTY5NSwyNTYgMjU2LDI0Ny4wNDU2OTUgMjU2LDIzNiBMMjU2LDIwIEMyNTYsOC45NTQzMDUgMjQ3LjA0NTY5NSwtMy41NTI3MTM2OGUtMTUgMjM2LDAgWiIgaWQ9Iui3r+W+hCIgZmlsbD0iIzAwMDAwMCI+PC9wYXRoPgogICAgICAgICAgICA8cGF0aCBkPSJNNDMuMzY2MTIwMiwxNjEuNTYzNTg1IEw0My4zNjYxMjAyLDIwNS4xMzkwNzMgTDEwNy41NTgxMiwyMDUuMTM5MDczIEwxMDcuNTU4MTIsMTk1LjQ2NTEwMiBMNTIuNzIwNzg2OSwxOTUuNDY1MTAyIEw1Mi43MjA3ODY5LDE2MS41NjM1ODUgTDQzLjM2NjEyMDIsMTYxLjU2MzU4NSBaIE0yMDQuNjc4MTIsMTYxLjU2MzU4NSBMMjA0LjY3ODEyLDE5NS40NjUxMDIgTDE0OS44NDA3ODcsMTk1LjQ2NTEwMiBMMTQ5Ljg0MDc4NywyMDUuMTI4NDE5IEwyMTQuMDMyNzg3LDIwNS4xMjg0MTkgTDIxNC4wMzI3ODcsMTYxLjU1MjkzMSBMMjA0LjY3ODEyLDE2MS41NjM1ODUgWiBNMTA3LjY1NDEyLDk1LjI4NDA5NjggTDEwNy42NTQxMiwxNjEuNTc0MjM5IEwxNDkuODQwNzg3LDE2MS41NzQyMzkgTDE0OS44NDA3ODcsMTUyLjg1OTE0MiBMMTE3LjAwODc4NywxNTIuODU5MTQyIEwxMTcuMDA4Nzg3LDk1LjI4NDA5NjggTDEwNy42NTQxMiw5NS4yODQwOTY4IFogTTQzLjM2NjEyMDIsNTEuNzA4NjA5MyBMNDMuMzY2MTIwMiw5NS4yODQwOTY4IEw1Mi43MjA3ODY5LDk1LjI4NDA5NjggTDUyLjcyMDc4NjksNjEuMzcxOTI2NCBMMTA3LjU1ODEyLDYxLjM3MTkyNjQgTDEwNy41NTgxMiw1MS43MDg2MDkzIEw0My4zNjYxMjAyLDUxLjcwODYwOTMgWiBNMTQ5Ljg0MDc4Nyw1MS43MDg2MDkzIEwxNDkuODQwNzg3LDYxLjM3MTkyNjQgTDIwNC42NzgxMiw2MS4zNzE5MjY0IEwyMDQuNjc4MTIsOTUuMjczNDQyNyBMMjE0LjAzMjc4Nyw5NS4yNzM0NDI3IEwyMTQuMDMyNzg3LDUxLjcwODYwOTMgTDE0OS44NDA3ODcsNTEuNzA4NjA5MyBaIiBpZD0i5b2i54q2IiBmaWxsPSIjRkZGRkZGIj48L3BhdGg+CiAgICAgICAgPC9nPgogICAgPC9nPgo8L3N2Zz4='; diff --git a/packages/core/src/config/logos/generated/onekeyWallet.ts b/packages/core/src/config/logos/generated/onekeyWallet.ts new file mode 100644 index 0000000..700dec6 --- /dev/null +++ b/packages/core/src/config/logos/generated/onekeyWallet.ts @@ -0,0 +1,7 @@ +// Copyright 2025 Luno contributors +// SPDX-License-Identifier: MIT + +// Do not edit. Auto-generated via node scripts/convertLogos.mjs + +export const onekeyWallet = + 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTQ0IiBoZWlnaHQ9IjE0NCIgdmlld0JveD0iMCAwIDE0NCAxNDQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxwYXRoIGQ9Ik0xNDQgNzJDMTQ0IDEyMS43MDYgMTIxLjcwNiAxNDQgNzIgMTQ0QzIyLjI5NDQgMTQ0IDAgMTIxLjcwNiAwIDcyQzAgMjIuMjk0NCAyMi4yOTQ0IDAgNzIgMEMxMjEuNzA2IDAgMTQ0IDIyLjI5NDQgMTQ0IDcyWiIgZmlsbD0iIzQ0RDYyQyIgc3R5bGU9ImZpbGw6IzQ0RDYyQztmaWxsOmNvbG9yKGRpc3BsYXktcDMgMC4yNjY3IDAuODM5MiAwLjE3MjUpO2ZpbGwtb3BhY2l0eToxOyIvPgo8cGF0aCBkPSJNNzguNTA1MyAzMC41MzA1TDU4LjQ3NTMgMzAuNTMwNUw1NC45NjEzIDQxLjE1NjJINjYuMDg2NVY2My41MzgxTDc4LjUwNTMgNjMuNTM4MVYzMC41MzA1WiIgZmlsbD0iYmxhY2siIHN0eWxlPSJmaWxsOmJsYWNrO2ZpbGwtb3BhY2l0eToxOyIvPgo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTk0Ljg0MzcgOTAuNjI2MUM5NC44NDM3IDEwMy4yNDIgODQuNjE2NCAxMTMuNDY5IDcyLjAwMDQgMTEzLjQ2OUM1OS4zODQ0IDExMy40NjkgNDkuMTU3MSAxMDMuMjQyIDQ5LjE1NzEgOTAuNjI2MUM0OS4xNTcxIDc4LjAxMDEgNTkuMzg0NCA2Ny43ODI4IDcyLjAwMDQgNjcuNzgyOEM4NC42MTY0IDY3Ljc4MjggOTQuODQzNyA3OC4wMTAxIDk0Ljg0MzcgOTAuNjI2MVpNODQuNDczMSA5MC42MjZDODQuNDczMSA5Ny41MTQ1IDc4Ljg4ODkgMTAzLjA5OSA3Mi4wMDA0IDEwMy4wOTlDNjUuMTExOSAxMDMuMDk5IDU5LjUyNzYgOTcuNTE0NSA1OS41Mjc2IDkwLjYyNkM1OS41Mjc2IDgzLjczNzUgNjUuMTExOSA3OC4xNTMzIDcyLjAwMDQgNzguMTUzM0M3OC44ODg5IDc4LjE1MzMgODQuNDczMSA4My43Mzc1IDg0LjQ3MzEgOTAuNjI2WiIgZmlsbD0iYmxhY2siIHN0eWxlPSJmaWxsOmJsYWNrO2ZpbGwtb3BhY2l0eToxOyIvPgo8L3N2Zz4K'; diff --git a/packages/core/src/config/logos/wallets/ledger.svg b/packages/core/src/config/logos/wallets/ledger.svg index b46eb2c..850ff1e 100644 --- a/packages/core/src/config/logos/wallets/ledger.svg +++ b/packages/core/src/config/logos/wallets/ledger.svg @@ -1,8 +1,10 @@ - - - - - - - - + + + 编组 + + + + + + + \ No newline at end of file diff --git a/packages/core/src/config/logos/wallets/onekey.svg b/packages/core/src/config/logos/wallets/onekey.svg new file mode 100644 index 0000000..2c98e05 --- /dev/null +++ b/packages/core/src/config/logos/wallets/onekey.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/packages/core/src/connectors/base.ts b/packages/core/src/connectors/base.ts index bd7b4ae..55bde02 100644 --- a/packages/core/src/connectors/base.ts +++ b/packages/core/src/connectors/base.ts @@ -22,7 +22,7 @@ export abstract class BaseConnector extends EventEmitter { * connector icon URL (optional) * subclasses can implement. */ - abstract readonly icon?: string; + abstract readonly icon?: Optional; readonly links: ConnectorLinks = {}; /** @@ -58,8 +58,8 @@ export abstract class BaseConnector extends EventEmitter { */ abstract connect( appName: string, - chains?: Chain[], - targetChainId?: string + chains?: Optional, + targetChainId?: Optional ): Promise; /** * disconnect from the wallet. diff --git a/packages/core/src/connectors/index.ts b/packages/core/src/connectors/index.ts index 5355cad..4c1c45a 100644 --- a/packages/core/src/connectors/index.ts +++ b/packages/core/src/connectors/index.ts @@ -2,9 +2,11 @@ export { BaseConnector } from './base'; export { enkryptConnector } from './enkrypt'; export { fearlessConnector } from './fearless'; export { InjectConnector } from './inject'; +export { ledgerConnector } from './ledger'; export { mimirConnector } from './mimir'; export { novaConnector } from './nova'; export { novaMobileConnector } from './novaMobile'; +export { onekeyConnector } from './onekey'; export { polkadotjsConnector } from './polkadot-js'; export { polkagateConnector } from './polkagate'; export { subwalletConnector } from './subwallet'; diff --git a/packages/core/src/connectors/inject.ts b/packages/core/src/connectors/inject.ts index 4999c3a..471de0a 100644 --- a/packages/core/src/connectors/inject.ts +++ b/packages/core/src/connectors/inject.ts @@ -9,7 +9,7 @@ export interface InjectConnectorOptions { name: string; icon: string; links: ConnectorLinks; - injectorId?: string; + injectorId?: Optional; } export class InjectConnector extends BaseConnector { @@ -21,7 +21,7 @@ export class InjectConnector extends BaseConnector { private unsubscribe: (() => void) | null = null; - private specificInjector?: Injected = undefined; + private specificInjector?: Optional = undefined; constructor(options: InjectConnectorOptions) { super(); @@ -43,9 +43,7 @@ export class InjectConnector extends BaseConnector { } public async connect(appName: string): Promise { - console.log(`Connector ${this.id}: Attempting to connect...`); if (this.signer) { - console.log(`Connector ${this.id}: Already connected.`); return [...this.accounts]; } if (!(await this.isAvailable())) { @@ -74,7 +72,6 @@ export class InjectConnector extends BaseConnector { ); } this.accounts = mapInjectedAccounts(rawAccounts, this.id); - console.log(`Connector ${this.id}: Initial accounts loaded`, this.accounts); await this.startSubscription(); @@ -89,7 +86,6 @@ export class InjectConnector extends BaseConnector { } public async disconnect(): Promise { - console.log(`Connector ${this.id}: Disconnecting...`); await this.cleanup(); this.emit('disconnect'); } @@ -110,7 +106,6 @@ export class InjectConnector extends BaseConnector { const result = await signer.signRaw({ address, data: dataHex, type: 'bytes' }); return result.signature; } catch (error: any) { - console.log('error', error); throw new Error(`Connector ${this.id}: Failed to sign message: ${error.message}`); } } @@ -131,7 +126,6 @@ export class InjectConnector extends BaseConnector { } } ); - console.log(`Connector ${this.id}: Subscribed to account changes.`); } catch (error) { console.error(`Connector ${this.id}: Failed to subscribe to accounts:`, error); this.unsubscribe = null; @@ -142,7 +136,6 @@ export class InjectConnector extends BaseConnector { if (this.unsubscribe) { this.unsubscribe(); this.unsubscribe = null; - console.log(`Connector ${this.id}: Unsubscribed from account changes.`); } } diff --git a/packages/core/src/connectors/ledger.test.ts b/packages/core/src/connectors/ledger.test.ts index 417ef09..3393ded 100644 --- a/packages/core/src/connectors/ledger.test.ts +++ b/packages/core/src/connectors/ledger.test.ts @@ -1,16 +1,442 @@ -import { describe } from 'vitest'; +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; import { ledgerWallet } from '../config/logos/generated'; +import type { Chain } from '../types'; import { ledgerConnector } from './ledger'; -import { createWalletConnectTestSuite } from './test-helper'; - -describe( - 'ledgerConnector', - createWalletConnectTestSuite({ - getConnector: ledgerConnector, - expected: { - id: 'ledger', - name: 'Ledger', - icon: ledgerWallet, + +const TEST_ADDRESS = '1FRMM8PEiWXYax7rpS6X4XZX1aAAxSWx1CrKTyrVYhV24fg'; +const TEST_PUBLIC_KEY = new Uint8Array([ + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, + 28, 29, 30, 31, 32, +]); +const TEST_PUBLIC_KEY_HEX = 'a711da72565f9cc37e65d2b8bb97a939f8d95730e39648f764e210a8fef22bf3'; +const TEST_CHAIN: Chain = { + genesisHash: '0x91b171bb158e2d3848fa23a9f1c25182fb8e20313b2c1eb49219da7a70ce90c3', + name: 'Polkadot', + nativeCurrency: { name: 'Polkadot', symbol: 'DOT', decimals: 10 }, + rpcUrls: { + webSocket: ['wss://rpc.polkadot.io'], + }, + ss58Format: 0, + blockExplorers: { default: { name: 'Subscan', url: 'https://polkadot.subscan.io' } }, + chainIconUrl: 'polkadot-icon', + testnet: false, +}; + +vi.mock('@ledgerhq/hw-transport-webusb', () => ({ + default: { + create: vi.fn(), + request: vi.fn(), + }, +})); + +vi.mock('@zondax/ledger-substrate', () => ({ + PolkadotGenericApp: vi.fn(), +})); + +vi.mock('../config', () => ({ + wsProvider: vi.fn(), +})); + +vi.mock('dedot', () => ({ + LegacyClient: vi.fn(), + ExtraSignedExtension: vi.fn(), +})); + +vi.mock('dedot/merkleized-metadata', () => ({ + MerkleizedMetadata: vi.fn(), +})); + +vi.mock('dedot/codecs', () => ({ + Extrinsic: vi.fn(), +})); + +const mockTransport = { + device: { + opened: false, + }, + open: vi.fn().mockResolvedValue(undefined), + close: vi.fn().mockResolvedValue(undefined), +}; + +const mockApp = { + getAddressEd25519: vi.fn().mockResolvedValue({ + address: TEST_ADDRESS, + pubKey: TEST_PUBLIC_KEY_HEX, + }), + signWithMetadataEd25519: vi.fn().mockResolvedValue({ + signature: new Uint8Array([ + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + ]), + }), +}; + +const mockProvider = { + send: vi.fn().mockResolvedValue('0xmetadata'), + connect: vi.fn().mockResolvedValue(undefined), +}; + +const mockClient = { + connect: vi.fn().mockResolvedValue(undefined), + registry: { + metadata: { + extrinsic: { + signatureTypeId: 1, + callTypeId: 2, + }, }, - }) -); + findCodec: vi.fn().mockReturnValue({ + tryDecode: vi.fn((hex: string) => hex), + }), + }, +}; + +const mockExtraSignedExtension = { + init: vi.fn().mockResolvedValue(undefined), + toRawPayload: vi.fn().mockReturnValue({ data: '0x1234' }), + data: {}, +}; + +const mockMerkleizer = { + digest: vi.fn().mockReturnValue(new Uint8Array([1, 2, 3, 4])), + proofForExtrinsicPayload: vi.fn().mockReturnValue(new Uint8Array([5, 6, 7, 8])), +}; + +const mockExtrinsic = { + attachSignature: vi.fn(), + toHex: vi.fn().mockReturnValue('0xsignedTx'), +}; + +describe('LedgerConnector', () => { + let connector: ReturnType; + let originalNavigator: any; + + beforeEach(async () => { + originalNavigator = globalThis.navigator; + + Object.defineProperty(globalThis, 'navigator', { + value: { + usb: { + requestDevice: vi.fn(), + }, + }, + writable: true, + configurable: true, + }); + + globalThis.Buffer = Buffer; + + // Setup mocks + const { default: TransportWebUSB } = await import('@ledgerhq/hw-transport-webusb'); + const { PolkadotGenericApp } = await import('@zondax/ledger-substrate'); + const { wsProvider } = await import('../config'); + const dedotModule = await import('dedot'); + const merkleizedModule = await import('dedot/merkleized-metadata'); + const codecsModule = await import('dedot/codecs'); + + const transport = TransportWebUSB as any; + vi.mocked(transport.create).mockResolvedValue(mockTransport); + vi.mocked(transport.request).mockResolvedValue(mockTransport); + vi.mocked(PolkadotGenericApp).mockImplementation(() => mockApp); + vi.mocked(wsProvider).mockReturnValue(mockProvider); + vi.mocked((dedotModule as any).LegacyClient).mockImplementation(() => mockClient); + vi.mocked((dedotModule as any).ExtraSignedExtension).mockImplementation( + () => mockExtraSignedExtension + ); + vi.mocked((merkleizedModule as any).MerkleizedMetadata).mockImplementation( + () => mockMerkleizer + ); + vi.mocked((codecsModule as any).Extrinsic).mockImplementation(() => mockExtrinsic); + + // Reset mock app to default state + mockApp.getAddressEd25519.mockResolvedValue({ + address: TEST_ADDRESS, + pubKey: TEST_PUBLIC_KEY_HEX, + }); + + connector = ledgerConnector({ chains: [TEST_CHAIN] }); + vi.clearAllMocks(); + }); + + afterEach(() => { + Object.defineProperty(globalThis, 'navigator', { + value: originalNavigator, + writable: true, + configurable: true, + }); + vi.clearAllMocks(); + }); + + describe('basic properties', () => { + it('should have correct connector metadata', () => { + expect(connector.id).toBe('ledger'); + expect(connector.name).toBe('Ledger'); + expect(connector.icon).toBe(ledgerWallet); + }); + }); + + describe('installation detection', () => { + it('should always be installed', () => { + expect(connector.isInstalled()).toBe(false); + }); + }); + + describe('availability check', () => { + it('should be available when WebUSB is supported', async () => { + expect(await connector.isAvailable()).toBe(true); + }); + + it('should not be available when WebUSB is not supported', async () => { + Object.defineProperty(globalThis, 'navigator', { + value: {}, + writable: true, + configurable: true, + }); + + expect(await connector.isAvailable()).toBe(false); + }); + + it('should not be available in non-browser environment', async () => { + Object.defineProperty(globalThis, 'navigator', { + value: undefined, + writable: true, + configurable: true, + }); + + expect(await connector.isAvailable()).toBe(false); + }); + }); + + describe('connection flow', () => { + it('should connect successfully with valid setup', async () => { + const accounts = await connector.connect('test-app'); + + expect(accounts).toHaveLength(1); + expect(accounts![0].address).toBe(TEST_ADDRESS); + expect(accounts![0].name).toBe('Ledger Wallet'); + expect(accounts![0].type).toBe('sr25519'); + expect(accounts![0].meta?.source).toBe('ledger'); + expect(accounts![0].meta?.accountIndex).toBe(0); + }); + + it('should throw error when WebUSB is not available', async () => { + Object.defineProperty(globalThis, 'navigator', { + value: {}, + writable: true, + configurable: true, + }); + + await expect(connector.connect('test-app', [TEST_CHAIN])).rejects.toThrow( + 'WebUSB is not supported in this browser.' + ); + }); + + it('should handle SecurityError during transport creation and fallback to request', async () => { + const { default: TransportWebUSB } = await import('@ledgerhq/hw-transport-webusb'); + const transport = TransportWebUSB as any; + vi.mocked(transport.create).mockRejectedValueOnce({ + name: 'OtherError', + message: 'Some other error', + }); + vi.mocked(transport.request).mockResolvedValueOnce(mockTransport); + + const accounts = await connector.connect('test-app', [TEST_CHAIN]); + + expect(accounts).toHaveLength(1); + expect(transport.request).toHaveBeenCalled(); + }); + + it('should throw user-friendly error for SecurityError', async () => { + const { default: TransportWebUSB } = await import('@ledgerhq/hw-transport-webusb'); + const transport = TransportWebUSB as any; + vi.mocked(transport.create).mockRejectedValueOnce({ + name: 'SecurityError', + message: 'User gesture required', + }); + vi.mocked(transport.request).mockRejectedValueOnce({ + name: 'SecurityError', + message: 'User gesture required', + }); + + await expect(connector.connect('test-app', [TEST_CHAIN])).rejects.toThrow( + 'Ledger connection requires user interaction. Please click the connect button to connect your Ledger device.' + ); + }); + + it('should throw error when address retrieval fails', async () => { + mockApp.getAddressEd25519.mockResolvedValueOnce({ + address: null, + pubKey: null, + }); + + await expect(connector.connect('test-app', [TEST_CHAIN])).rejects.toThrow( + 'Failed to retrieve address from Ledger.' + ); + }); + + it('should emit connect event', async () => { + const connectSpy = vi.fn(); + connector.on('connect', connectSpy); + + await connector.connect('test-app', [TEST_CHAIN]); + + expect(connectSpy).toHaveBeenCalledWith([ + expect.objectContaining({ + address: TEST_ADDRESS, + }), + ]); + }); + + it('should cleanup on connection failure', async () => { + const { default: TransportWebUSB } = await import('@ledgerhq/hw-transport-webusb'); + const transport = TransportWebUSB as any; + vi.mocked(transport.create).mockRejectedValueOnce({ + name: 'SecurityError', + message: 'User gesture required', + }); + vi.mocked(transport.request).mockRejectedValueOnce({ + name: 'SecurityError', + message: 'User gesture required', + }); + + await expect(connector.connect('test-app', [TEST_CHAIN])).rejects.toThrow( + 'Ledger connection requires user interaction' + ); + + const accounts = await connector.getAccounts(); + expect(accounts).toEqual([]); + }); + + it('should handle public key as array', async () => { + mockApp.getAddressEd25519.mockResolvedValueOnce({ + address: TEST_ADDRESS, + pubKey: Array.from(TEST_PUBLIC_KEY), + }); + + const accounts = await connector.connect('test-app', [TEST_CHAIN]); + + expect(accounts![0].publicKey).toBeDefined(); + }); + + it('should handle public key as Uint8Array', async () => { + mockApp.getAddressEd25519.mockResolvedValueOnce({ + address: TEST_ADDRESS, + pubKey: TEST_PUBLIC_KEY, + }); + + const accounts = await connector.connect('test-app', [TEST_CHAIN]); + + expect(accounts![0].publicKey).toBeDefined(); + }); + }); + + describe('disconnection', () => { + beforeEach(async () => { + mockTransport.device.opened = true; + await connector.connect('test-app', [TEST_CHAIN]); + }); + + it('should cleanup all resources on disconnect', async () => { + await connector.disconnect(); + + const accounts = await connector.getAccounts(); + expect(accounts).toEqual([]); + expect(mockTransport.close).toHaveBeenCalled(); + }); + + it('should emit disconnect event', async () => { + const disconnectSpy = vi.fn(); + connector.on('disconnect', disconnectSpy); + + await connector.disconnect(); + + expect(disconnectSpy).toHaveBeenCalled(); + }); + + it('should handle transport close errors gracefully', async () => { + mockTransport.close.mockRejectedValueOnce(new Error('Close failed')); + + await connector.disconnect(); + + const accounts = await connector.getAccounts(); + expect(accounts).toEqual([]); + }); + }); + + describe('message signing', () => { + beforeEach(async () => { + await connector.connect('test-app', [TEST_CHAIN]); + }); + + it('should throw for signRaw (not supported)', async () => { + await expect(connector.signMessage('hello world', TEST_ADDRESS)).rejects.toThrow( + 'Ledger not supported signRaw!' + ); + }); + }); + + describe('transaction signing', () => { + const mockPayload = { + address: TEST_ADDRESS, + genesisHash: TEST_CHAIN.genesisHash, + method: '0x1234', + nonce: '0x00', + specVersion: '0x1234', + transactionVersion: '0x01', + blockHash: '0xabc', + blockNumber: '0x123', + era: '0x00', + tip: '0x00', + signedExtensions: [], + version: 4, + }; + + beforeEach(async () => { + await connector.connect('test-app', [TEST_CHAIN]); + }); + + it('should throw error when app not connected', async () => { + await connector.disconnect(); + const signer = await connector.getSigner(); + expect(signer).toBeDefined(); + + await expect(signer.signPayload!(mockPayload)).rejects.toThrow('Ledger not connected'); + }); + + it('should throw error when chain not found', async () => { + const signer = await connector.getSigner(); + expect(signer).toBeDefined(); + + await expect( + signer.signPayload!({ + ...mockPayload, + genesisHash: '0xunknown' as `0x${string}`, + }) + ).rejects.toThrow('Chain not found in your configuration chains'); + }); + + it('should close transport after signing', async () => { + const signer = await connector.getSigner(); + expect(signer).toBeDefined(); + + mockTransport.device.opened = true; + await signer.signPayload!(mockPayload); + }); + }); + + describe('account management', () => { + it('should return empty accounts initially', async () => { + const accounts = await connector.getAccounts(); + expect(accounts).toEqual([]); + }); + + it('should return accounts after connection', async () => { + await connector.connect('test-app', [TEST_CHAIN]); + + const accounts = await connector.getAccounts(); + expect(accounts).toHaveLength(1); + expect(accounts[0].address).toBe(TEST_ADDRESS); + }); + }); +}); diff --git a/packages/core/src/connectors/ledger.ts b/packages/core/src/connectors/ledger.ts index a8e2e8c..672d4bd 100644 --- a/packages/core/src/connectors/ledger.ts +++ b/packages/core/src/connectors/ledger.ts @@ -1,20 +1,240 @@ +import type { PolkadotGenericApp } from '@zondax/ledger-substrate'; +import { ExtraSignedExtension, LegacyClient } from 'dedot'; +import { Extrinsic } from 'dedot/codecs'; +import { MerkleizedMetadata } from 'dedot/merkleized-metadata'; +import type { SignerPayloadJSON, SignerPayloadRaw, SignerResult } from 'dedot/types'; +import { hexToU8a, stringToHex, u8aToHex } from 'dedot/utils'; +import { wsProvider } from '../config'; import { ledgerWallet } from '../config/logos/generated'; -import type { WalletConnectConnectorOptions } from '../types'; -import { WalletConnectConnector } from './walletconnect'; - -type WalletConnectConfig = Pick< - WalletConnectConnectorOptions, - 'projectId' | 'relayUrl' | 'metadata' ->; - -export const ledgerConnector = (config: WalletConnectConfig) => { - return new WalletConnectConnector({ - id: 'ledger', - name: 'Ledger', - icon: ledgerWallet, - links: { - browserExtension: 'https://www.ledger.com/ledger-live', - }, - ...config, - }); -}; +import type { Account, Chain, ConnectorLinks, HexString, Signer } from '../types'; +import { BaseConnector } from './base'; + +export interface LedgerConnectorOptions { + chains: Chain[]; +} + +function getBip44Path(accountIndex: number, coinType = 354): string { + return `m/44'/${coinType}'/${accountIndex}'/${0}'/${0}'`; +} + +export class LedgerConnector extends BaseConnector { + readonly id: string = 'ledger'; + readonly name: string = 'Ledger'; + readonly icon = ledgerWallet; + readonly links: ConnectorLinks = {}; + readonly chains: Chain[]; + + private app: PolkadotGenericApp | null = null; + private transport: any | null = null; + private accountIndex = 0; + + constructor(options: LedgerConnectorOptions) { + super(); + this.chains = options.chains; + } + + public isInstalled(): boolean { + return false; + } + + public async isAvailable(): Promise { + if (typeof navigator !== 'undefined' && (navigator as any).usb) { + return true; + } + return false; + } + + private async ensureTransportOpen(): Promise { + if (!this.transport) { + throw new Error('Transport not initialized'); + } + if (!this.transport.device?.opened) { + await this.transport.open(); + } + } + + private async ensureTransportClosed(): Promise { + if (this.transport?.device?.opened) { + await this.transport.close(); + } + } + + public async connect( + _appName: string, + _chains?: Optional, + _targetChainId?: Optional + ): Promise { + if (!(await this.isAvailable())) { + throw new Error('WebUSB is not supported in this browser.'); + } + + try { + const { Buffer } = await import('buffer'); + globalThis.Buffer = Buffer; + + const { default: TransportWebUSB } = await import('@ledgerhq/hw-transport-webusb'); + + try { + this.transport = await TransportWebUSB.create(); + } catch (error: any) { + if (error.name === 'SecurityError' || error.message?.includes('user gesture')) { + throw new Error( + 'Ledger connection requires user interaction. Please click the connect button to connect your Ledger device.' + ); + } + this.transport = await TransportWebUSB.request(); + } + + const { PolkadotGenericApp } = await import('@zondax/ledger-substrate'); + const app = new PolkadotGenericApp(this.transport); + this.app = app; + + await this.ensureTransportOpen(); + const bip44Path = getBip44Path(this.accountIndex); + + const addressResult = await app.getAddressEd25519(bip44Path, 0, false); + + if (!addressResult || !addressResult.address) { + throw new Error('Failed to retrieve address from Ledger.'); + } + + const publicKeyHex: Optional = (addressResult.pubKey as string) + ? `0x${addressResult.pubKey}` + : undefined; + + this.accounts = [ + { + address: addressResult.address, + publicKey: publicKeyHex, + name: 'Ledger Wallet', + type: 'sr25519', + meta: { + source: 'ledger', + accountIndex: 0, + bip44Path, + }, + }, + ]; + + this.signer = await this.getSigner(); + + this.emit('connect', [...this.accounts]); + return [...this.accounts]; + } catch (error: any) { + console.error(`Connector ${this.id}: Connection failed:`, error); + await this.cleanup(); + throw error; + } + } + + public async disconnect(): Promise { + await this.cleanup(); + this.emit('disconnect'); + } + + public async signMessage(message: string, address: string): Promise { + const signer = await this.getSigner(); + + if (!signer) { + throw new Error('No signer provided'); + } + + const dataHex = stringToHex(message); + const result = await signer.signRaw!({ address, data: dataHex, type: 'bytes' }); + return result.signature; + } + + public async getSigner(): Promise { + return { + signRaw: async (raw: SignerPayloadRaw): Promise => { + // todo + throw new Error('Ledger not supported signRaw!'); + }, + signPayload: async (payload: SignerPayloadJSON): Promise => { + if (!this.app) { + throw new Error('Ledger not connected'); + } + + const chain = this.chains.find((c) => c.genesisHash === payload.genesisHash); + + if (!chain) { + throw new Error('Chain not found in your configuration chains'); + } + + await this.ensureTransportOpen(); + + const bip44Path = getBip44Path(this.accountIndex); + + const provider = wsProvider(chain.rpcUrls.webSocket); + const client = new LegacyClient(provider); + + await client.connect(); + + const metadataHex = await provider.send('state_getMetadata', []); + const chainInfo = { + tokenSymbol: chain.nativeCurrency?.symbol || 'DOT', + decimals: chain.nativeCurrency?.decimals || 10, + }; + + const merkleizer = new MerkleizedMetadata(metadataHex, chainInfo); + + const extra = new ExtraSignedExtension(client, { + signerAddress: payload.address, + payloadOptions: { + metadataHash: u8aToHex(merkleizer.digest()), + }, + }); + await extra.init(); + const txRawPayload = extra.toRawPayload(payload.method as HexString).data as HexString; + + const proof = merkleizer.proofForExtrinsicPayload(txRawPayload); + + const payloadBuffer = Buffer.from(hexToU8a(txRawPayload)); + const metadataBuffer = Buffer.from(proof); + + const { signature } = await this.app.signWithMetadataEd25519( + bip44Path, + payloadBuffer, + metadataBuffer + ); + + const { signatureTypeId, callTypeId } = client.registry.metadata!.extrinsic; + const $Signature = client.registry.findCodec(signatureTypeId); + const $Call = client.registry.findCodec(callTypeId); + + const decodedSignature = $Signature.tryDecode(u8aToHex(signature)); + const decodedCall = $Call.tryDecode(payload.method); + + const extrinsic = new Extrinsic(client.registry, decodedCall); + + extrinsic.attachSignature({ + address: payload.address, + signature: decodedSignature, + extra: extra.data, + }); + + return { + id: 0, + signature: u8aToHex(signature), + signedTransaction: extrinsic.toHex(), + }; + }, + }; + } + + private async cleanup(): Promise { + if (this.transport) { + try { + await this.ensureTransportClosed(); + } catch (e) { + console.warn('Error closing transport:', e); + } + } + this.transport = null; + this.app = null; + this.accounts = []; + this.signer = undefined; + } +} + +export const ledgerConnector = (options: LedgerConnectorOptions) => new LedgerConnector(options); diff --git a/packages/core/src/connectors/onekey.test.ts b/packages/core/src/connectors/onekey.test.ts new file mode 100644 index 0000000..ae0e921 --- /dev/null +++ b/packages/core/src/connectors/onekey.test.ts @@ -0,0 +1,16 @@ +import { describe } from 'vitest'; +import { onekeyWallet } from '../config/logos/generated'; +import { onekeyConnector } from './onekey'; +import { createConnectorTestSuite } from './test-helper'; + +describe( + 'onekeyConnector', + createConnectorTestSuite({ + getConnector: () => onekeyConnector(), + expected: { + id: 'OneKey', + name: 'OneKey', + icon: onekeyWallet, + }, + }) +); diff --git a/packages/core/src/connectors/onekey.ts b/packages/core/src/connectors/onekey.ts new file mode 100644 index 0000000..12e1d56 --- /dev/null +++ b/packages/core/src/connectors/onekey.ts @@ -0,0 +1,14 @@ +import { onekeyWallet } from '../config/logos/generated'; +import { InjectConnector } from './inject'; + +export const onekeyConnector = () => { + return new InjectConnector({ + id: 'OneKey', + name: 'OneKey', + icon: onekeyWallet, + links: { + browserExtension: + 'https://chromewebstore.google.com/detail/onekey-secure-crypto-wall/jnmbobjmhlngoefaiojfljckilhhlhcj', + }, + }); +}; diff --git a/packages/core/src/connectors/walletconnect.ts b/packages/core/src/connectors/walletconnect.ts index 551e17d..80825ca 100644 --- a/packages/core/src/connectors/walletconnect.ts +++ b/packages/core/src/connectors/walletconnect.ts @@ -19,14 +19,14 @@ export class WalletConnectConnector extends BaseConnector { readonly icon: string; readonly links: ConnectorLinks; - private provider?: IUniversalProvider; + private provider?: Optional; private projectId: string; private relayUrl: string; - private metadata?: Metadata; + private metadata?: Optional; private supportedChains: HexString[] = []; - private session?: SessionTypes.Struct; - private connectedChains?: Chain[] | HexString[]; + private session?: Optional; + private connectedChains?: Optional; private unsubscribe: (() => void) | null = null; @@ -59,7 +59,7 @@ export class WalletConnectConnector extends BaseConnector { }); } - public async connect(appName: string, chains?: Chain[]): Promise> { + public async connect(appName: string, chains?: Optional): Promise> { if (!this.projectId) { throw new Error( `${this.name} requires a projectId. Please visit https://cloud.walletconnect.com to get one.` @@ -326,7 +326,6 @@ export class WalletConnectConnector extends BaseConnector { try { const sessionDeleteHandler = async () => { - console.log(`Connector ${this.id}: Session deleted, disconnecting...`); await this.cleanup(); this.emit('disconnect'); }; @@ -344,7 +343,6 @@ export class WalletConnectConnector extends BaseConnector { if (this.unsubscribe) { this.unsubscribe(); this.unsubscribe = null; - console.log(`Connector ${this.id}: Unsubscribed from events.`); } } diff --git a/packages/core/src/types/account.ts b/packages/core/src/types/account.ts index 2e36141..f70c618 100644 --- a/packages/core/src/types/account.ts +++ b/packages/core/src/types/account.ts @@ -14,29 +14,29 @@ export interface Account { address: string; /** account name (if any) */ - name?: string; + name?: Optional; /** * account public key (hex format, without 0x prefix) * used for cross-chain address conversion and verification */ - publicKey?: HexString; + publicKey?: Optional; /** * other metadata * including account source, control method, etc. */ - meta?: { + meta?: Optional<{ /** account source (e.g. 'polkadot-js', 'subwallet-js', 'talisman' etc.) */ - source?: string; + source?: Optional; /** genesis hash (if the wallet provides a specific chain account) */ - genesisHash?: string | null; + genesisHash?: Optional; /** other custom metadata */ [key: string]: any; - }; - type?: KeypairType; + }>; + type?: Optional; } /** @@ -65,12 +65,14 @@ export interface AccountBalance { formattedTotal: string; /** lock details (if any) */ - locks?: Array<{ - id: string; - amount: bigint; - reason: string; - lockHuman: string; - }>; + locks?: Optional< + Array<{ + id: string; + amount: bigint; + reason: string; + lockHuman: string; + }> + >; } /** diff --git a/packages/core/src/types/chain.ts b/packages/core/src/types/chain.ts index bc87deb..90774ca 100644 --- a/packages/core/src/types/chain.ts +++ b/packages/core/src/types/chain.ts @@ -14,22 +14,22 @@ export interface Chain { rpcUrls: { webSocket: Transport; - http?: readonly string[]; + http?: Optional; }; ss58Format: number; - blockExplorers?: { - default?: { name: string; url: string }; - [key: string]: { name: string; url: string } | undefined; - }; + blockExplorers?: Optional<{ + default?: Optional<{ name: string; url: string }>; + [key: string]: Optional<{ name: string; url: string }>; + }>; testnet: boolean; chainIconUrl: string; - subscan?: { + subscan?: Optional<{ api: string; url: string; - }; + }>; } diff --git a/packages/core/src/types/config.ts b/packages/core/src/types/config.ts index 932687d..fd102c9 100644 --- a/packages/core/src/types/config.ts +++ b/packages/core/src/types/config.ts @@ -19,23 +19,23 @@ export interface LunoStorage { export type Transport = Readonly; type LunoApiOptions = Partial> & { - customTypes?: Record; - customRpc?: Record; + customTypes?: Optional>; + customRpc?: Optional>; }; export interface CreateConfigParameters extends LunoApiOptions { - appName?: string; - chains?: readonly Chain[]; + appName?: Optional; + chains?: Optional; connectors: Connector[]; - transports?: Record; + transports?: Optional>; - storage?: LunoStorage; - autoConnect?: boolean; - subscan?: { + storage?: Optional; + autoConnect?: Optional; + subscan?: Optional<{ apiKey: string; - cacheTime?: number; - retryCount?: number; - }; + cacheTime?: Optional; + retryCount?: Optional; + }>; } export interface Config extends LunoApiOptions { @@ -45,9 +45,9 @@ export interface Config extends LunoApiOptions { readonly transports: Readonly>; readonly storage: LunoStorage; readonly autoConnect: boolean; - readonly subscan?: { + readonly subscan?: Optional<{ apiKey: string; - cacheTime?: number; - retryCount?: number; - }; + cacheTime?: Optional; + retryCount?: Optional; + }>; } diff --git a/packages/core/src/types/connector.ts b/packages/core/src/types/connector.ts index cc7f8bb..760400b 100644 --- a/packages/core/src/types/connector.ts +++ b/packages/core/src/types/connector.ts @@ -5,8 +5,8 @@ import type { Chain } from './chain'; import type { Signer } from './signer'; export interface ConnectorLinks { - browserExtension?: string; - deepLink?: string; + browserExtension?: Optional; + deepLink?: Optional; } export interface Connector extends EventEmitter { @@ -18,8 +18,8 @@ export interface Connector extends EventEmitter { isInstalled: () => boolean; connect( appName: string, - chains?: Chain[], - targetChainId?: string + chains?: Optional, + targetChainId?: Optional ): Promise; disconnect(): Promise; getAccounts(): Promise>; @@ -38,12 +38,12 @@ export interface Connector extends EventEmitter { } export interface WalletConnectConnectorOptions { - id?: string; - name?: string; - icon?: string; + id?: Optional; + name?: Optional; + icon?: Optional; projectId: string; - relayUrl?: string; - metadata?: Metadata; - links?: ConnectorLinks; - supportedChains?: HexString[]; + relayUrl?: Optional; + metadata?: Optional; + links?: Optional; + supportedChains?: Optional; } diff --git a/packages/core/src/types/global.d.ts b/packages/core/src/types/global.d.ts index f332b19..25f71cb 100644 --- a/packages/core/src/types/global.d.ts +++ b/packages/core/src/types/global.d.ts @@ -13,4 +13,6 @@ declare global { isNovaWallet: boolean; }; } + + type Optional = T | undefined; } diff --git a/packages/core/src/types/index.ts b/packages/core/src/types/index.ts index 2610e36..7e7102f 100644 --- a/packages/core/src/types/index.ts +++ b/packages/core/src/types/index.ts @@ -4,3 +4,4 @@ export * from './config'; export * from './connector'; export * from './signer'; +export * from './utils'; diff --git a/packages/core/src/types/utils.ts b/packages/core/src/types/utils.ts new file mode 100644 index 0000000..964b0f2 --- /dev/null +++ b/packages/core/src/types/utils.ts @@ -0,0 +1 @@ +export type Optional = T | undefined; diff --git a/packages/core/src/utils/format.ts b/packages/core/src/utils/format.ts index 48f221e..a8d97f2 100644 --- a/packages/core/src/utils/format.ts +++ b/packages/core/src/utils/format.ts @@ -2,7 +2,7 @@ * format balance */ export function formatBalance( - value: string | number | bigint | undefined, + value: Optional, decimals: number = 0, fixedDecimals: number = 4 ): string { @@ -33,7 +33,11 @@ export function formatBalance( /** * format address display */ -export function formatAddress(address?: string, prefixLength = 4, suffixLength = 4): string { +export function formatAddress( + address?: Optional, + prefixLength = 4, + suffixLength = 4 +): string { if (!address) return ''; if (address.length <= prefixLength + suffixLength) return address; diff --git a/packages/react/src/context/LunoContext.ts b/packages/react/src/context/LunoContext.ts index c1af71b..4685f00 100644 --- a/packages/react/src/context/LunoContext.ts +++ b/packages/react/src/context/LunoContext.ts @@ -1,22 +1,22 @@ import type { Account, Chain, Config, Connector, HexString } from '@luno-kit/core/types'; import type { LegacyClient } from 'dedot'; import React from 'react'; -import type { ConnectionStatus } from '../types'; +import type { ConnectionStatus, Optional } from '../types'; export interface LunoContextState { - config?: Config; + config?: Optional; status: ConnectionStatus; - activeConnector?: Connector; + activeConnector?: Optional; accounts: Account[]; - account?: Account; - setAccount: (accountOrPublicKey?: Account | HexString) => void; - currentChainId?: string; - currentChain?: Chain; - currentApi?: LegacyClient; + account?: Optional; + setAccount: (accountOrPublicKey?: Optional) => void; + currentChainId?: Optional; + currentChain?: Optional; + currentApi?: Optional; isApiReady: boolean; apiError: Error | null; - connect: (connectorId: string, targetChainId?: string) => Promise; + connect: (connectorId: string, targetChainId?: Optional) => Promise; disconnect: () => Promise; switchChain: (newChainId: string) => Promise; } diff --git a/packages/react/src/context/LunoProvider.test.tsx b/packages/react/src/context/LunoProvider.test.tsx index 9fec4e1..87d4dd2 100644 --- a/packages/react/src/context/LunoProvider.test.tsx +++ b/packages/react/src/context/LunoProvider.test.tsx @@ -246,13 +246,7 @@ describe('LunoProvider', () => { ); await waitFor(() => { - console.error('All console.log calls:', consoleLogSpy.mock.calls); - expect(mockApi.disconnect).toHaveBeenCalled(); - expect(consoleLogSpy).toHaveBeenCalledWith( - expect.stringContaining('[LunoProvider]: Disconnecting API from previous render cycle:'), - 'Test Chain' - ); }); }); }); @@ -299,12 +293,6 @@ describe('LunoProvider', () => { ); - await waitFor(() => { - expect(consoleLogSpy).toHaveBeenCalledWith( - '[LunoProvider]: AutoConnect disabled or config not set.' - ); - }); - expect(mockStorage.getItem).not.toHaveBeenCalled(); }); @@ -351,26 +339,6 @@ describe('LunoProvider', () => { ); }); }); - - it('should log when no persisted session found', async () => { - mockStorage.getItem.mockResolvedValue(null); - - const TestComponent = () =>
Test Child
; - - render( - - - - ); - - await waitFor(() => { - expect(consoleLogSpy).toHaveBeenCalledWith( - expect.stringContaining( - '[LunoProvider]: AutoConnect No persisted session found or missing data.' - ) - ); - }); - }); }); describe('SS58 Format Validation Effect', () => { diff --git a/packages/react/src/context/LunoProvider.tsx b/packages/react/src/context/LunoProvider.tsx index 02f28d6..16925e3 100644 --- a/packages/react/src/context/LunoProvider.tsx +++ b/packages/react/src/context/LunoProvider.tsx @@ -45,7 +45,6 @@ export const LunoProvider: React.FC = ({ useEffect(() => { if (configFromProps) { - console.log('[LunoProvider] Setting config to store:', configFromProps); _setConfig(configFromProps); } }, [configFromProps]); @@ -74,10 +73,6 @@ export const LunoProvider: React.FC = ({ } if (currentApi && currentApi.status === 'connected') { - console.log( - '[LunoProvider]: Disconnecting API from previous render cycle:', - currentApi.runtimeVersion.specName - ); currentApi .disconnect() .catch((e) => console.error('[LunoProvider] Error disconnecting previous API:', e)); @@ -101,7 +96,6 @@ export const LunoProvider: React.FC = ({ const performAutoConnect = async () => { await sleep(500); if (!configFromProps.autoConnect) { - console.log('[LunoProvider]: AutoConnect disabled or config not set.'); return; } @@ -117,12 +111,9 @@ export const LunoProvider: React.FC = ({ const lastChainId = await configFromProps.storage.getItem(PERSIST_KEY.LAST_CHAIN_ID); if (lastConnectorId) { - console.log( - `[LunoProvider]: AutoConnect Found persisted session: Connector ID "${lastConnectorId}", Chain ID "${lastChainId}"` - ); await connect(lastConnectorId, lastChainId || undefined); } else { - console.log('[LunoProvider]: AutoConnect No persisted session found or missing data.'); + console.warn('[LunoProvider]: AutoConnect No persisted session found or missing data.'); } } catch (error) { console.error('[LunoProvider]: AutoConnect Error during auto-connect process:', error); diff --git a/packages/react/src/hooks/useAccount.ts b/packages/react/src/hooks/useAccount.ts index 1e4cf65..d6ecc08 100644 --- a/packages/react/src/hooks/useAccount.ts +++ b/packages/react/src/hooks/useAccount.ts @@ -1,11 +1,11 @@ import { convertAddress } from '@luno-kit/core/utils'; import { useMemo } from 'react'; -import type { Account } from '../types'; +import type { Account, Optional } from '../types'; import { useLuno } from './useLuno'; export interface UseAccountResult { - account?: Account; - address?: string; + account?: Optional; + address?: Optional; } export const useAccount = (): UseAccountResult => { diff --git a/packages/react/src/hooks/useAccounts.ts b/packages/react/src/hooks/useAccounts.ts index 7ba4909..bfda33a 100644 --- a/packages/react/src/hooks/useAccounts.ts +++ b/packages/react/src/hooks/useAccounts.ts @@ -1,12 +1,12 @@ import type { HexString } from '@luno-kit/core/types'; import { convertAddress } from '@luno-kit/core/utils'; import { useMemo } from 'react'; -import type { Account } from '../types'; +import type { Account, Optional } from '../types'; import { useLuno } from './useLuno'; export interface UseAccountsResult { accounts: Account[]; - selectAccount: (accountOrPublicKey?: Account | HexString) => void; + selectAccount: (accountOrPublicKey?: Optional) => void; } export const useAccounts = (): UseAccountsResult => { diff --git a/packages/react/src/hooks/useApi.ts b/packages/react/src/hooks/useApi.ts index 056507a..d28b1ae 100644 --- a/packages/react/src/hooks/useApi.ts +++ b/packages/react/src/hooks/useApi.ts @@ -1,17 +1,18 @@ import type { LegacyClient } from 'dedot'; +import type { Optional } from '../types'; import { useLuno } from './useLuno'; -export interface UseApiResult { - api?: LegacyClient; +export interface UseApiResult { + api?: Optional; isApiReady: boolean; apiError: Error | null; } -export const useApi = (): UseApiResult => { +export const useApi = (): UseApiResult => { const { currentApi, isApiReady, apiError } = useLuno(); return { - api: currentApi, + api: currentApi as T | undefined, isApiReady, apiError, }; diff --git a/packages/react/src/hooks/useBalance.ts b/packages/react/src/hooks/useBalance.ts index 92cd42f..9c6fda2 100644 --- a/packages/react/src/hooks/useBalance.ts +++ b/packages/react/src/hooks/useBalance.ts @@ -1,6 +1,6 @@ import { formatBalance } from '@luno-kit/core/utils'; import type { LegacyClient } from 'dedot'; -import type { AccountBalance } from '../types'; +import type { AccountBalance, Optional } from '../types'; import { useLuno } from './useLuno'; import { type QueryMultiItem, @@ -19,7 +19,7 @@ interface AccountData { interface BalanceLock { id: string | number; amount: bigint | string | number; - reasons?: string | number; + reasons?: Optional; } export interface ChainProperties { @@ -58,7 +58,7 @@ const transformBalance = (results: any[], chainProperties: ChainProperties) => { }; export interface UseBalanceProps { - address?: string; + address?: Optional; } export type UseBalanceResult = UseSubscriptionResult; diff --git a/packages/react/src/hooks/useConnect.ts b/packages/react/src/hooks/useConnect.ts index ef20ea3..998e212 100644 --- a/packages/react/src/hooks/useConnect.ts +++ b/packages/react/src/hooks/useConnect.ts @@ -1,18 +1,21 @@ -import type { ConnectionStatus, Connector } from '../types'; +import type { ConnectionStatus, Connector, Optional } from '../types'; import { sleep } from '../utils'; import { useLuno } from './useLuno'; import { type LunoMutationOptions, useLunoMutation } from './useLunoMutation'; export interface ConnectVariables { connectorId: string; - targetChainId?: string; + targetChainId?: Optional; } export type UseConnectOptions = LunoMutationOptions; export interface UseConnectResult { - connect: (variables: ConnectVariables, options?: UseConnectOptions) => void; - connectAsync: (variables: ConnectVariables, options?: UseConnectOptions) => Promise; + connect: (variables: ConnectVariables, options?: Optional) => void; + connectAsync: ( + variables: ConnectVariables, + options?: Optional + ) => Promise; connectors: Connector[]; activeConnector?: Connector; status: ConnectionStatus; @@ -26,7 +29,7 @@ export interface UseConnectResult { variables: ConnectVariables | undefined; } -export const useConnect = (hookLevelConfig?: UseConnectOptions): UseConnectResult => { +export const useConnect = (hookLevelConfig?: Optional): UseConnectResult => { const { connect, config, activeConnector, status } = useLuno(); const connectFn = async (variables: ConnectVariables): Promise => { diff --git a/packages/react/src/hooks/useDisconnect.ts b/packages/react/src/hooks/useDisconnect.ts index 25ebf82..17ba160 100644 --- a/packages/react/src/hooks/useDisconnect.ts +++ b/packages/react/src/hooks/useDisconnect.ts @@ -1,12 +1,12 @@ -import type { ConnectionStatus } from '../types'; +import type { ConnectionStatus, Optional } from '../types'; import { useLuno } from './useLuno'; import { type LunoMutationOptions, useLunoMutation } from './useLunoMutation'; export type UseDisconnectOptions = LunoMutationOptions; export interface UseDisconnectResult { - disconnect: (options?: UseDisconnectOptions) => void; - disconnectAsync: (options?: UseDisconnectOptions) => Promise; + disconnect: (options?: Optional) => void; + disconnectAsync: (options?: Optional) => Promise; status: ConnectionStatus; data: undefined; error: Error | null; @@ -17,7 +17,9 @@ export interface UseDisconnectResult { reset: () => void; } -export const useDisconnect = (hookLevelConfig?: UseDisconnectOptions): UseDisconnectResult => { +export const useDisconnect = ( + hookLevelConfig?: Optional +): UseDisconnectResult => { const { disconnect, status } = useLuno(); const disconnectFn = async (): Promise => { diff --git a/packages/react/src/hooks/useEstimatePaymentInfo.ts b/packages/react/src/hooks/useEstimatePaymentInfo.ts index 292f77e..b5826b5 100644 --- a/packages/react/src/hooks/useEstimatePaymentInfo.ts +++ b/packages/react/src/hooks/useEstimatePaymentInfo.ts @@ -1,6 +1,7 @@ import { formatBalance } from '@luno-kit/core/utils'; import type { ISubmittableExtrinsic, TxPaymentInfo } from 'dedot/types'; import { useCallback, useState } from 'react'; +import type { Optional } from '../types'; import { useLuno } from './useLuno'; interface PaymentInfo extends TxPaymentInfo { @@ -16,7 +17,7 @@ export function useEstimatePaymentInfo() { const estimate = useCallback( async ( extrinsic: ISubmittableExtrinsic, - senderAddress?: string + senderAddress?: Optional ): Promise => { const sender = senderAddress || account?.address; if (!extrinsic || !sender || !currentChain) return; diff --git a/packages/react/src/hooks/useGenesisHash.test.ts b/packages/react/src/hooks/useGenesisHash.test.ts index e44a1d5..15525fa 100644 --- a/packages/react/src/hooks/useGenesisHash.test.ts +++ b/packages/react/src/hooks/useGenesisHash.test.ts @@ -28,7 +28,6 @@ describe('useGenesisHash', () => { expect(result.current.useLuno.currentApi).toBeDefined(); expect(result.current.useLuno.isApiReady).toBe(true); }); - console.log('result.current.useGenesisHash', result.current.useGenesisHash); await waitFor(() => { expect(result.current.useGenesisHash.isLoading).toBe(false); diff --git a/packages/react/src/hooks/useSendTransaction.test.ts b/packages/react/src/hooks/useSendTransaction.test.ts index 8d800d8..23b08eb 100644 --- a/packages/react/src/hooks/useSendTransaction.test.ts +++ b/packages/react/src/hooks/useSendTransaction.test.ts @@ -12,6 +12,9 @@ const mockExtrinsic = { }; const mockApi = { + registry: { + findErrorMeta: vi.fn(), + }, tx: { balances: { transferKeepAlive: vi.fn().mockReturnValue(mockExtrinsic), @@ -62,6 +65,9 @@ test('useSendTransaction', async () => { expect(result.current.useApi.isApiReady).toBeTruthy(); }); + expect(result.current.useSendTransaction.txStatus).toBe('idle'); + expect(result.current.useSendTransaction.detailedStatus).toBe('idle'); + const sendPromise = result.current.useSendTransaction.sendTransactionAsync({ extrinsic: mockExtrinsic, }); @@ -70,6 +76,30 @@ test('useSendTransaction', async () => { expect(mockExtrinsic.signAndSend).toHaveBeenCalled(); }); + expect(result.current.useSendTransaction.txStatus).toBe('signing'); + + await act(async () => { + statusCallback({ + status: { type: 'Broadcasting' }, + events: [], + txHash: '0x123', + }); + }); + + expect(result.current.useSendTransaction.txStatus).toBe('pending'); + expect(result.current.useSendTransaction.detailedStatus).toBe('broadcasting'); + + await act(async () => { + statusCallback({ + status: { type: 'BestChainBlockIncluded', value: { blockHash: '0xabc', blockNumber: 123 } }, + events: [], + txHash: '0x123', + }); + }); + + expect(result.current.useSendTransaction.txStatus).toBe('pending'); + expect(result.current.useSendTransaction.detailedStatus).toBe('inBlock'); + await act(async () => { statusCallback({ status: { type: 'Finalized', value: { blockHash: '0xabc', blockNumber: 123 } }, @@ -84,6 +114,7 @@ test('useSendTransaction', async () => { expect(receipt.status).toBe('success'); expect(receipt.transactionHash).toBe('0x123'); expect(receipt.blockNumber).toBe(123); + expect(result.current.useSendTransaction.txStatus).toBe('success'); expect(result.current.useSendTransaction.detailedStatus).toBe('finalized'); }); @@ -119,6 +150,8 @@ test('should handle transaction error states', async () => { expect(result.current.useApi.isApiReady).toBeTruthy(); }); + expect(result.current.useSendTransaction.txStatus).toBe('idle'); + result.current.useSendTransaction .sendTransactionAsync({ extrinsic: mockExtrinsic, @@ -129,6 +162,8 @@ test('should handle transaction error states', async () => { expect(mockExtrinsic.signAndSend).toHaveBeenCalled(); }); + expect(result.current.useSendTransaction.txStatus).toBe('signing'); + await act(async () => { statusCallback({ status: { type: 'Invalid' }, @@ -144,3 +179,78 @@ test('should handle transaction error states', async () => { expect(result.current.useSendTransaction.detailedStatus).toBe('invalid'); }); }); + +test('should resolve at inBlock when waitFor is inBlock', async () => { + let resolveSignAndSend: (value: any) => void; + let statusCallback: any; + + mockExtrinsic.signAndSend.mockImplementation((address, { signer }, callback) => { + statusCallback = callback; + return new Promise((resolve) => { + resolveSignAndSend = resolve; + }); + }); + + const { result } = renderHook( + () => ({ + useConnect: useConnect(), + useApi: useApi(), + useSendTransaction: useSendTransaction({ waitFor: 'inBlock' }), + }), + { + config: mockConfig, + } + ); + + await act(async () => { + await result.current.useConnect.connectAsync({ + connectorId: connector.id, + }); + }); + + await waitFor(() => { + expect(result.current.useApi.isApiReady).toBeTruthy(); + }); + + expect(result.current.useSendTransaction.txStatus).toBe('idle'); + expect(result.current.useSendTransaction.detailedStatus).toBe('idle'); + + const sendPromise = result.current.useSendTransaction.sendTransactionAsync({ + extrinsic: mockExtrinsic, + }); + + await waitFor(() => { + expect(mockExtrinsic.signAndSend).toHaveBeenCalled(); + }); + + expect(result.current.useSendTransaction.txStatus).toBe('signing'); + + await act(async () => { + statusCallback({ + status: { type: 'Broadcasting' }, + events: [], + txHash: '0x123', + }); + }); + + expect(result.current.useSendTransaction.txStatus).toBe('pending'); + expect(result.current.useSendTransaction.detailedStatus).toBe('broadcasting'); + + await act(async () => { + statusCallback({ + status: { type: 'BestChainBlockIncluded', value: { blockHash: '0xabc', blockNumber: 123 } }, + events: [], + txHash: '0x123', + }); + resolveSignAndSend(() => {}); + }); + + const receipt = await sendPromise; + + expect(receipt.status).toBe('success'); + expect(receipt.transactionHash).toBe('0x123'); + expect(receipt.blockHash).toBe('0xabc'); + expect(receipt.blockNumber).toBe(123); + expect(result.current.useSendTransaction.txStatus).toBe('success'); + expect(result.current.useSendTransaction.detailedStatus).toBe('inBlock'); +}); diff --git a/packages/react/src/hooks/useSendTransaction.ts b/packages/react/src/hooks/useSendTransaction.ts index ed9edd3..f5002c4 100644 --- a/packages/react/src/hooks/useSendTransaction.ts +++ b/packages/react/src/hooks/useSendTransaction.ts @@ -6,7 +6,7 @@ import type { ISubmittableResult, } from 'dedot/types'; import { useCallback, useState } from 'react'; -import type { TxStatus } from '../types'; +import type { Optional, TxStatus } from '../types'; import { getReadableDispatchError } from '../utils'; import { useAccount } from './useAccount'; import { useLuno } from './useLuno'; @@ -29,27 +29,33 @@ export interface TransactionReceipt { dispatchError?: DispatchError; errorMessage?: string; dispatchInfo?: DispatchInfo; + rawReceipt: ISubmittableResult; } export interface SendTransactionVariables { extrinsic: ISubmittableExtrinsic; } +export interface UseSendTransactionConfig { + waitFor?: Optional<'inBlock' | 'finalized'>; +} + export type UseSendTransactionOptions = LunoMutationOptions< TransactionReceipt, Error, SendTransactionVariables, unknown ->; +> & + UseSendTransactionConfig; export interface UseSendTransactionResult { sendTransaction: ( variables: SendTransactionVariables, - options?: UseSendTransactionOptions + options?: Optional ) => void; sendTransactionAsync: ( variables: SendTransactionVariables, - options?: UseSendTransactionOptions + options?: Optional ) => Promise; data: TransactionReceipt | undefined; error: Error | null; @@ -65,7 +71,7 @@ export interface UseSendTransactionResult { } export function useSendTransaction( - hookLevelConfig?: UseSendTransactionOptions + hookLevelConfig?: Optional ): UseSendTransactionResult { const { activeConnector, currentApi, isApiReady } = useLuno(); const { account } = useAccount(); @@ -74,8 +80,12 @@ export function useSendTransaction( const [detailedTxStatus, setDetailedTxStatus] = useState('idle'); const [txError, setTxError] = useState(null); + const waitFor = hookLevelConfig?.waitFor ?? 'finalized'; + const sendTransactionFn = useCallback( async (variables: SendTransactionVariables): Promise => { + setTxStatus('idle'); + setDetailedTxStatus('idle'); if (!currentApi || !isApiReady) { throw new Error('[useSendTransaction]: Polkadot API is not ready.'); } @@ -97,7 +107,6 @@ export function useSendTransaction( } setTxStatus('signing'); - setDetailedTxStatus('idle'); return new Promise((resolve, reject) => { let unsubscribe: (() => void) | undefined; @@ -106,7 +115,14 @@ export function useSendTransaction( .signAndSend( account.address, { signer }, - ({ status, dispatchError, events, dispatchInfo, txHash }: ISubmittableResult) => { + ({ + status, + dispatchError, + events, + dispatchInfo, + txHash, + ...rest + }: ISubmittableResult) => { const resolveAndUnsubscribe = (receipt: TransactionReceipt) => { if (unsubscribe) unsubscribe(); resolve(receipt); @@ -118,38 +134,55 @@ export function useSendTransaction( reject(error); }; + const createReceipt = ( + blockHash: HexString, + blockNumber: number | undefined, + error: DispatchError | undefined + ): TransactionReceipt => { + const hasError = Boolean(error); + return { + transactionHash: txHash, + blockHash: blockHash, + blockNumber, + events, + status: hasError ? 'failed' : 'success', + dispatchError: error || undefined, + errorMessage: error ? getReadableDispatchError(currentApi, error) : undefined, + dispatchInfo, + rawReceipt: { status, dispatchError, events, dispatchInfo, txHash, ...rest }, + }; + }; + switch (status.type) { case 'Broadcasting': + setTxStatus('pending'); setDetailedTxStatus('broadcasting'); break; case 'BestChainBlockIncluded': + setTxStatus('pending'); setDetailedTxStatus('inBlock'); + if (waitFor === 'inBlock') { + setTxStatus(dispatchError ? 'failed' : 'success'); + resolveAndUnsubscribe( + createReceipt( + status.value?.blockHash, + status.value?.blockNumber, + dispatchError + ) + ); + } break; case 'Finalized': - setTxStatus('success'); setDetailedTxStatus('finalized'); - if (dispatchError) { - resolveAndUnsubscribe({ - transactionHash: txHash, - blockHash: status.value?.blockHash, - blockNumber: status.value?.blockNumber, - events, - status: 'failed', - dispatchError, - errorMessage: getReadableDispatchError(currentApi, dispatchError), - dispatchInfo, - }); - } else { - resolveAndUnsubscribe({ - transactionHash: txHash, - blockHash: status.value?.blockHash, - blockNumber: status.value?.blockNumber, - events, - status: 'success', - dispatchError: undefined, - errorMessage: undefined, - dispatchInfo, - }); + if (waitFor === 'finalized') { + setTxStatus(dispatchError ? 'failed' : 'success'); + resolveAndUnsubscribe( + createReceipt( + status.value?.blockHash, + status.value?.blockNumber, + dispatchError + ) + ); } break; case 'Invalid': @@ -179,7 +212,7 @@ export function useSendTransaction( }); }); }, - [currentApi, isApiReady, activeConnector, account, setTxStatus, setDetailedTxStatus] + [currentApi, isApiReady, activeConnector, account, setTxStatus, setDetailedTxStatus, waitFor] ); const mutationResult = useLunoMutation< diff --git a/packages/react/src/hooks/useSignMessage.ts b/packages/react/src/hooks/useSignMessage.ts index 4578748..2aef945 100644 --- a/packages/react/src/hooks/useSignMessage.ts +++ b/packages/react/src/hooks/useSignMessage.ts @@ -1,4 +1,5 @@ import { isSameAddress } from '@luno-kit/core/utils'; +import type { Optional } from '../types'; import { useLuno } from './useLuno'; import { type LunoMutationOptions, useLunoMutation } from './useLunoMutation'; @@ -20,10 +21,10 @@ export type UseSignMessageOptions = LunoMutationOptions< >; export interface UseSignMessageResult { - signMessage: (variables: SignMessageVariables, options?: UseSignMessageOptions) => void; + signMessage: (variables: SignMessageVariables, options?: Optional) => void; signMessageAsync: ( variables: SignMessageVariables, - options?: UseSignMessageOptions + options?: Optional ) => Promise; data: SignMessageData | undefined; error: Error | null; @@ -36,7 +37,9 @@ export interface UseSignMessageResult { variables: SignMessageVariables | undefined; } -export function useSignMessage(hookLevelConfig?: UseSignMessageOptions): UseSignMessageResult { +export function useSignMessage( + hookLevelConfig?: Optional +): UseSignMessageResult { const { activeConnector, account, accounts } = useLuno(); const mutationFn = async (variables: SignMessageVariables): Promise => { diff --git a/packages/react/src/hooks/useSubscription.ts b/packages/react/src/hooks/useSubscription.ts index 658ced5..f3c28dc 100644 --- a/packages/react/src/hooks/useSubscription.ts +++ b/packages/react/src/hooks/useSubscription.ts @@ -2,6 +2,7 @@ import { useQuery, useQueryClient } from '@tanstack/react-query'; import type { LegacyClient } from 'dedot'; import type { Callback, GenericStorageQuery, Unsub } from 'dedot/types'; import { useEffect, useMemo, useRef, useState } from 'react'; +import type { Optional } from '../types'; import { useLuno } from './useLuno'; type SubscriptionFn = ( @@ -9,9 +10,9 @@ type SubscriptionFn = ( ) => Promise<() => Promise>; export interface UseSubscriptionOptions { - enabled?: boolean; - transform?: (data: TData) => TTransformed; - defaultValue?: TTransformed; + enabled?: Optional; + transform?: Optional<(data: TData) => TTransformed>; + defaultValue?: Optional; } type ApiBoundSubscriptionFactory = ( diff --git a/packages/react/src/hooks/useSwitchChain.ts b/packages/react/src/hooks/useSwitchChain.ts index 2c688a4..d94f161 100644 --- a/packages/react/src/hooks/useSwitchChain.ts +++ b/packages/react/src/hooks/useSwitchChain.ts @@ -1,4 +1,4 @@ -import type { Chain } from '../types'; +import type { Chain, Optional } from '../types'; import { useLuno } from './useLuno'; import { type LunoMutationOptions, useLunoMutation } from './useLunoMutation'; @@ -9,10 +9,10 @@ export interface SwitchChainVariables { export type UseSwitchChainOptions = LunoMutationOptions; export interface UseSwitchChainResult { - switchChain: (variables: SwitchChainVariables, options?: UseSwitchChainOptions) => void; + switchChain: (variables: SwitchChainVariables, options?: Optional) => void; switchChainAsync: ( variables: SwitchChainVariables, - options?: UseSwitchChainOptions + options?: Optional ) => Promise; chains: Chain[]; currentChain?: Chain; @@ -27,7 +27,9 @@ export interface UseSwitchChainResult { variables: SwitchChainVariables | undefined; } -export const useSwitchChain = (hookLevelConfig?: UseSwitchChainOptions): UseSwitchChainResult => { +export const useSwitchChain = ( + hookLevelConfig?: Optional +): UseSwitchChainResult => { const { switchChain: storeSwitchChain, config, currentChain, currentChainId } = useLuno(); const switchChainFn = async (variables: SwitchChainVariables): Promise => { diff --git a/packages/react/src/store/createLunoStore.test.ts b/packages/react/src/store/createLunoStore.test.ts index 1b95c6b..86f79df 100644 --- a/packages/react/src/store/createLunoStore.test.ts +++ b/packages/react/src/store/createLunoStore.test.ts @@ -371,7 +371,7 @@ describe('createLunoStore', () => { mockConnector.connect.mockRejectedValue(new Error('Connection failed')); await expect(store.connect('test-connector')).rejects.toThrow( - '[LunoStore] Error connecting with Test Connector: Connection failed' + 'Test Connector: Connection failed' ); const state = useLunoStore.getState(); @@ -415,18 +415,6 @@ describe('createLunoStore', () => { expect(mockStorage.removeItem).toHaveBeenCalledWith(PERSIST_KEY.LAST_SELECTED_ACCOUNT_INFO); }); - it('should handle no active connector gracefully', async () => { - useLunoStore.setState({ activeConnector: undefined }); - const consoleSpy = vi.spyOn(console, 'log').mockImplementation(() => {}); - - await store.disconnect(); - - expect(consoleSpy).toHaveBeenCalledWith( - expect.stringContaining('No active connector or already disconnected') - ); - consoleSpy.mockRestore(); - }); - it('should handle disconnect failure', async () => { mockConnector.disconnect.mockRejectedValue(new Error('Disconnect failed')); @@ -489,15 +477,6 @@ describe('createLunoStore', () => { expect(mockStorage.setItem).toHaveBeenCalledWith(PERSIST_KEY.LAST_CHAIN_ID, '0x456'); }); - it('should skip when already on target chain', async () => { - const consoleSpy = vi.spyOn(console, 'log').mockImplementation(() => {}); - - await store.switchChain('0x123'); - - expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining('Already on chain 0x123')); - consoleSpy.mockRestore(); - }); - it('should throw error when config not initialized', async () => { useLunoStore.setState({ config: undefined }); diff --git a/packages/react/src/store/createLunoStore.ts b/packages/react/src/store/createLunoStore.ts index 35c840e..17718b6 100644 --- a/packages/react/src/store/createLunoStore.ts +++ b/packages/react/src/store/createLunoStore.ts @@ -114,7 +114,6 @@ export const useLunoStore = create((set, get) => ({ PERSIST_KEY.RECENT_SELECTED_ACCOUNT_INFO, JSON.stringify(accountInfo) ); - console.log(`[LunoStore] Persisted selected account: ${nextAccount.address}`); } catch (e) { console.error('[LunoStore] Failed to persist selected account:', e); } @@ -140,20 +139,13 @@ export const useLunoStore = create((set, get) => ({ const previouslyActiveConnector = get().activeConnector; if (previouslyActiveConnector && previouslyActiveConnector.id !== connector.id) { - console.log( - `[LunoStore] Switching connector. Cleaning up listeners for old connector: ${previouslyActiveConnector.id}` - ); cleanupActiveConnectorListeners(); } else if (previouslyActiveConnector && previouslyActiveConnector.id === connector.id) { - console.log( - `[LunoStore] Attempting to reconnect with the same connector: ${connector.id}. Cleaning up existing listeners.` - ); cleanupActiveConnectorListeners(); } try { const handleAccountsChanged = async (newAccounts: Account[]) => { - console.log(`[LunoStore] accountsChanged event from ${connector.name}:`, newAccounts); if (newAccounts.length === 0) { await get().disconnect(); return; @@ -197,15 +189,11 @@ export const useLunoStore = create((set, get) => ({ }; const handleDisconnect = () => { - console.log(`[LunoStore] disconnect event from ${connector.name}`); if (get().activeConnector?.id === connector.id) { cleanupActiveConnectorListeners(); try { config.storage.removeItem(PERSIST_KEY.LAST_CONNECTOR_ID); config.storage.removeItem(PERSIST_KEY.LAST_CHAIN_ID); - console.log( - '[LunoStore] Removed persisted connection info from storage due to disconnect event.' - ); } catch (e) { console.error('[LunoStore] Failed to remove connection info from storage:', e); } @@ -262,13 +250,6 @@ export const useLunoStore = create((set, get) => ({ if (restoredAccount) { selectedAccount = restoredAccount; - console.log( - `[LunoStore] Restored previously selected account: ${selectedAccount.address}` - ); - } else { - console.log( - '[LunoStore] Previously selected account not found in current accounts list, using first account' - ); } } } catch (e) { @@ -300,7 +281,6 @@ export const useLunoStore = create((set, get) => ({ PERSIST_KEY.RECENT_SELECTED_ACCOUNT_INFO, JSON.stringify(storedAccountInfo) ); - console.log(`[LunoStore] Persisted connectorId: ${connector.id}`); } catch (e) { console.error('[LunoStore] Failed to persist connectorId to storage:', e); } @@ -320,7 +300,6 @@ export const useLunoStore = create((set, get) => ({ } try { config.storage.setItem(PERSIST_KEY.LAST_CHAIN_ID, chainIdToSet); - console.log(`[LunoStore] Persisted chainId: ${chainIdToSet}`); } catch (e) { console.error('[LunoStore] Failed to persist chainId to storage:', e); } @@ -343,9 +322,7 @@ export const useLunoStore = create((set, get) => ({ accounts: [], }); - throw new Error( - `[LunoStore] Error connecting with ${connector.name}: ${err?.message || err}` - ); + throw new Error(`${connector.name}: ${err?.message || err}`); } }, @@ -357,9 +334,6 @@ export const useLunoStore = create((set, get) => ({ status === ConnectionStatus.Disconnecting || status === ConnectionStatus.Disconnected ) { - console.log( - '[LunoStore] No active connector or already disconnected/disconnecting. Disconnect action aborted.' - ); return; } @@ -369,13 +343,9 @@ export const useLunoStore = create((set, get) => ({ if (config) { try { - console.log( - '[LunoStore] Attempting to remove persisted connection info due to user disconnect action...' - ); await config.storage.removeItem(PERSIST_KEY.LAST_CONNECTOR_ID); await config.storage.removeItem(PERSIST_KEY.LAST_CHAIN_ID); await config.storage.removeItem(PERSIST_KEY.LAST_SELECTED_ACCOUNT_INFO); - console.log('[LunoStore] Removed persisted connection info from storage.'); } catch (e) { console.error( '[LunoStore] Failed to remove connection info from storage during disconnect action:', @@ -412,7 +382,6 @@ export const useLunoStore = create((set, get) => ({ throw new Error('[LunoStore] LunoConfig has not been initialized. Cannot switch chain.'); } if (newChainId === currentChainId) { - console.log(`[LunoStore] Already on chain ${newChainId}. No switch needed.`); return; } @@ -430,7 +399,6 @@ export const useLunoStore = create((set, get) => ({ console.warn('[LunoStore] Failed to disconnect from previous chain:', e); } - console.log(`[LunoStore] Attempting to switch chain to ${newChain.name} (ID: ${newChainId})`); set({ currentChainId: newChainId, currentChain: newChain, diff --git a/packages/ui/src/components/ConnectButton/index.tsx b/packages/ui/src/components/ConnectButton/index.tsx index c7e7b1b..4148bab 100644 --- a/packages/ui/src/components/ConnectButton/index.tsx +++ b/packages/ui/src/components/ConnectButton/index.tsx @@ -1,3 +1,4 @@ +import type { Optional } from '@luno-kit/react/types'; import { formatAddress } from '@luno-kit/react/utils'; import type React from 'react'; import { useConnectButton, useWindowSize } from '../../hooks'; @@ -8,12 +9,12 @@ export const transitionClassName = 'luno:transition-transform luno:transition-[125] luno:hover:scale-[1.03] luno:transition-ease'; export interface ConnectButtonProps { - className?: string; - label?: string; - accountStatus?: 'full' | 'address'; - chainStatus?: 'full' | 'icon' | 'name' | 'none'; - showBalance?: boolean; - displayPreference?: 'address' | 'name'; + className?: Optional; + label?: Optional; + accountStatus?: Optional<'full' | 'address'>; + chainStatus?: Optional<'full' | 'icon' | 'name' | 'none'>; + showBalance?: Optional; + displayPreference?: Optional<'address' | 'name'>; } export const ConnectButton: React.FC = ({ diff --git a/packages/ui/src/components/ConnectModal/ConnectOptions.tsx b/packages/ui/src/components/ConnectModal/ConnectOptions.tsx index 98bc1f3..b25f4ea 100644 --- a/packages/ui/src/components/ConnectModal/ConnectOptions.tsx +++ b/packages/ui/src/components/ConnectModal/ConnectOptions.tsx @@ -17,7 +17,7 @@ const popularConnectorIds = [ 'nova-mobile', ]; -const moreConnectorIds = ['polkagate', 'fearless-wallet', 'mimir', 'enkrypt']; +const moreConnectorIds = ['ledger', 'polkagate', 'fearless-wallet', 'mimir', 'enkrypt', 'OneKey']; export const ConnectOptions = React.memo(({ onConnect }: Props) => { const connectors = useConnectors(); @@ -48,7 +48,9 @@ export const ConnectOptions = React.memo(({ onConnect }: Props) => { }, [installedConnectors, popularConnectors, moreConnectors]); if (isMobileDevice()) { - const filteredConnectors = connectors.filter((i) => i.links.deepLink); + const filteredConnectors = connectors + .filter((i) => i.id !== 'polkadot-js') + .filter((i) => i.links.deepLink || i.isInstalled()); return (
diff --git a/packages/ui/src/components/ConnectModal/WalletView.tsx b/packages/ui/src/components/ConnectModal/WalletView.tsx index 25ae30b..354b0c6 100644 --- a/packages/ui/src/components/ConnectModal/WalletView.tsx +++ b/packages/ui/src/components/ConnectModal/WalletView.tsx @@ -1,7 +1,10 @@ import type { Connector } from '@luno-kit/react/types'; -import React from 'react'; +import React, { useMemo } from 'react'; import { Close } from '../../assets/icons'; +import type { AppInfo } from '../../providers'; +import { useLunoTheme } from '../../theme'; import { cs } from '../../utils'; +import { renderAppInfoText } from '../../utils/renderAppInfo'; import { transitionClassName } from '../ConnectButton'; import { Copy } from '../Copy'; import { DialogClose } from '../Dialog'; @@ -16,11 +19,22 @@ interface Props { connectState: { isConnecting: boolean; isError: boolean; + error: Error | null; }; + appInfo?: Partial; } export const WalletView = React.memo( - ({ selectedConnector, onConnect, qrCode, isWide, connectState }: Props) => { + ({ selectedConnector, onConnect, qrCode, isWide, connectState, appInfo }: Props) => { + const { themeMode } = useLunoTheme(); + + const decorativeImage = useMemo(() => { + if (!appInfo?.decorativeImage) return undefined; + const { light, dark } = appInfo.decorativeImage; + const url = themeMode === 'dark' ? dark || light : light; + return { url }; + }, [appInfo?.decorativeImage, themeMode]); + const showQRCode = selectedConnector?.hasConnectionUri(); return ( @@ -100,7 +114,9 @@ export const WalletView = React.memo( 'luno:pb-[10px] luno:text-base luno:text-modalTextSecondary luno:leading-base luno:font-medium luno:text-center' } > - Confirm connection in the extension + {selectedConnector.id === 'ledger' + ? connectState.error?.message + : 'Confirm connection in the extension'}

{connectState.isConnecting && (
@@ -112,12 +128,12 @@ export const WalletView = React.memo( 'luno:cursor-pointer luno:pt-6 luno:text-sm luno:text-accentColor luno:font-medium luno:text-center luno:hover:text-modalText' } > - Don‘t have {selectedConnector.name}? + Don't have {selectedConnector.name}?
)} {!connectState.isConnecting && connectState.isError && - selectedConnector.isInstalled() && ( + (selectedConnector?.isInstalled() || selectedConnector?.id === 'ledger') && (
diff --git a/packages/ui/src/components/ConnectModal/index.tsx b/packages/ui/src/components/ConnectModal/index.tsx index c2e1005..a96c926 100644 --- a/packages/ui/src/components/ConnectModal/index.tsx +++ b/packages/ui/src/components/ConnectModal/index.tsx @@ -1,13 +1,14 @@ import { useConnect } from '@luno-kit/react'; -import type { Connector } from '@luno-kit/react/types'; +import type { Connector, Optional } from '@luno-kit/react/types'; import { isMobileDevice } from '@luno-kit/react/utils'; import type React from 'react'; import { useEffect, useMemo, useState } from 'react'; import { Back, Close } from '../../assets/icons'; import { useWindowSize } from '../../hooks'; import { useAnimatedViews } from '../../hooks/useAnimatedViews'; -import { useConnectModal } from '../../providers'; +import { type AppInfo, useConnectModal } from '../../providers'; import { cs } from '../../utils'; +import { renderAppInfoText } from '../../utils/renderAppInfo'; import { Dialog, DialogClose, DialogTitle, type ModalSize } from '../Dialog'; import { ConnectOptions } from './ConnectOptions'; import { WalletView } from './WalletView'; @@ -18,16 +19,18 @@ export enum ConnectModalView { } export interface ConnectModalProps { - size?: ModalSize; + size?: Optional; + appInfo?: Optional>; } -export const ConnectModal: React.FC = ({ size = 'wide' }) => { +export const ConnectModal: React.FC = ({ appInfo, size = 'wide' }) => { const { isOpen, close } = useConnectModal(); const { connectAsync, reset: resetConnect, isPending: isConnecting, isError: connectError, + error: connectErrorMsg, } = useConnect(); const [selectedConnector, setSelectedConnector] = useState(null); const [qrCode, setQrCode] = useState(); @@ -81,15 +84,25 @@ export const ConnectModal: React.FC = ({ size = 'wide' }) => [ConnectModalView.connectOptions]: , [ConnectModalView.walletView]: ( ), }; - }, [isWide, selectedConnector, qrCode, handleConnect, isConnecting, connectError]); + }, [ + isWide, + selectedConnector, + qrCode, + handleConnect, + isConnecting, + connectError, + connectErrorMsg, + appInfo, + ]); useEffect(() => { if (isWide && currentView === ConnectModalView.walletView) { @@ -161,32 +174,86 @@ export const ConnectModal: React.FC = ({ size = 'wide' }) => )}
-
+
{viewComponents[currentView]}
- {!isWide && currentView === ConnectModalView.connectOptions && ( -

window.open('https://polkadot.com/get-started/wallets/')} - > - New to wallets? -

- )} + {!isWide && + currentView === ConnectModalView.connectOptions && + renderAppInfoText( + appInfo?.guideText, +

+ window.open(appInfo?.guideLink || 'https://polkadot.com/get-started/wallets/') + } + > + New to wallets? +

+ )}
{isWide && ( )}
+ + {!isWide && + currentView === ConnectModalView.connectOptions && + appInfo?.policyLinks?.terms && + appInfo?.policyLinks?.privacy && ( +
+
+ By connecting your wallet, you agree to our +
+ +
+ )}
); }; diff --git a/packages/ui/src/hooks/useConnectButton.ts b/packages/ui/src/hooks/useConnectButton.ts index 09ebcd2..2a1a14f 100644 --- a/packages/ui/src/hooks/useConnectButton.ts +++ b/packages/ui/src/hooks/useConnectButton.ts @@ -7,7 +7,7 @@ import { useChains, useStatus, } from '@luno-kit/react'; -import type { Account, AccountBalance, Chain, Connector } from '@luno-kit/react/types'; +import type { Account, AccountBalance, Chain, Connector, Optional } from '@luno-kit/react/types'; import { useAccountModal, useChainModal, useConnectModal } from '../providers'; export interface UseConnectButtonReturn { @@ -16,22 +16,22 @@ export interface UseConnectButtonReturn { isDisconnected: boolean; isConnecting: boolean; - account?: Account; - address?: string; + account?: Optional; + address?: Optional; - currentChain?: Chain; + currentChain?: Optional; configuredChains: Chain[]; isChainSupported: boolean; chainIconUrl: string; - chainName?: string; + chainName?: Optional; - balance?: AccountBalance; + balance?: Optional; - activeConnector?: Connector; + activeConnector?: Optional; - openConnectModal?: () => void; - openAccountModal?: () => void; - openChainModal?: () => void; + openConnectModal?: Optional<() => void>; + openAccountModal?: Optional<() => void>; + openChainModal?: Optional<() => void>; isConnectModalOpen: boolean; isAccountModalOpen: boolean; diff --git a/packages/ui/src/providers/LunoKitProvider.tsx b/packages/ui/src/providers/LunoKitProvider.tsx index dadacf6..745654c 100644 --- a/packages/ui/src/providers/LunoKitProvider.tsx +++ b/packages/ui/src/providers/LunoKitProvider.tsx @@ -1,52 +1,66 @@ import { LunoProvider } from '@luno-kit/react'; -import type { Config as LunoCoreConfig } from '@luno-kit/react/types'; -// @ts-ignore - @tanstack/react-query v5 API changes -import { QueryClient, type QueryClientConfig, QueryClientProvider } from '@tanstack/react-query'; +import type { Config as LunoCoreConfig, Optional } from '@luno-kit/react/types'; import type React from 'react'; -import { type ReactNode, useState } from 'react'; +import type { ReactNode } from 'react'; import { AccountDetailsModal, ChainModal, ConnectModal } from '../components'; import type { ModalSize } from '../components/Dialog'; import type { LunokitThemeOverrides, PartialLunokitTheme } from '../theme'; import { ThemeProvider } from '../theme'; import { ModalProvider } from './ModalContext'; +export interface DecorativeImage { + light: string; + dark?: Optional; +} + +export interface PolicyLinks { + terms: string; + privacy: string; + target?: Optional<'_blank' | '_self'>; +} + +export interface AppInfo { + decorativeImage?: Optional; + guideText?: Optional; + guideLink?: Optional; + description?: Optional; + policyLinks?: Optional; +} + export interface LunoKitProviderProps { children: ReactNode; - config: LunoCoreConfig & { modalSize?: ModalSize }; - queryClientConfig?: QueryClientConfig; - theme?: PartialLunokitTheme | LunokitThemeOverrides; // Support both complete themes and partial overrides + config: LunoCoreConfig & { modalSize?: Optional }; + theme?: Optional; + appInfo?: Optional>; } export const LunoKitProvider: React.FC = ({ children, config, - queryClientConfig, theme, + appInfo, }) => { - const [queryClient] = useState(() => new QueryClient(queryClientConfig)); - return ( - - - - -
{children}
- -
-
-
-
+ + + +
{children}
+ +
+
+
); }; -const RenderModals: React.FC<{ modalSize?: ModalSize }> = ({ - modalSize, -}: { - modalSize?: ModalSize; -}) => { +interface RenderModalsProps { + modalSize?: Optional; + appInfo?: Optional>; +} + +const RenderModals: React.FC = ({ modalSize, appInfo }: RenderModalsProps) => { return ( <> - + diff --git a/packages/ui/src/styles/base.css b/packages/ui/src/styles/base.css index d206cc3..db6937c 100644 --- a/packages/ui/src/styles/base.css +++ b/packages/ui/src/styles/base.css @@ -82,6 +82,7 @@ --leading-lg: 24px; /* Font Weights */ + --font-weight-regular: 400; --font-weight-medium: 500; --font-weight-semibold: 600; --font-weight-bold: 700; @@ -96,7 +97,6 @@ --spacing-4: 16px; --spacing-5: 20px; --spacing-6: 24px; - --font-body: var(--font-body); } diff --git a/packages/ui/src/theme/context.tsx b/packages/ui/src/theme/context.tsx index 9fef2e5..b9764a9 100644 --- a/packages/ui/src/theme/context.tsx +++ b/packages/ui/src/theme/context.tsx @@ -1,3 +1,4 @@ +import type { Optional } from '@luno-kit/react/types'; import type React from 'react'; import { createContext, @@ -14,7 +15,7 @@ import type { LunokitTheme, LunokitThemeOverrides, PartialLunokitTheme, ThemeMod // Theme preference storage interface ThemePreference { isAuto: boolean; - preferredTheme?: ThemeMode; + preferredTheme?: Optional; } const THEME_STORAGE_KEY = 'luno.lastThemePreference'; @@ -35,7 +36,7 @@ const ThemeContext = createContext(undefined); interface ThemeProviderProps { children: ReactNode; - theme?: PartialLunokitTheme | LunokitThemeOverrides; + theme?: Optional; } // Helper function to check if theme is complete or partial diff --git a/packages/ui/src/utils/renderAppInfo.tsx b/packages/ui/src/utils/renderAppInfo.tsx new file mode 100644 index 0000000..871c95a --- /dev/null +++ b/packages/ui/src/utils/renderAppInfo.tsx @@ -0,0 +1,18 @@ +import React from 'react'; + +// Render helper for plain text content; keeps default styling/handlers when provided. +export function renderAppInfoText( + customText: string | undefined, + defaultContent: React.ReactNode +): React.ReactNode { + if (!customText) { + return defaultContent; + } + + if (React.isValidElement(defaultContent)) { + const { className, children: _children, ...rest } = defaultContent.props || {}; + return React.createElement(defaultContent.type, { ...rest, className }, customText); + } + + return customText; +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0147642..2080bd6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -6,21 +6,33 @@ settings: catalogs: default: + '@dedot/chaintypes': + specifier: 0.152.0 + version: 0.152.0 '@tanstack/react-query': specifier: 5.81.5 version: 5.81.5 + '@types/node': + specifier: 20.19.0 + version: 20.19.0 '@types/react': specifier: 18.2.55 version: 18.2.55 '@types/react-dom': specifier: 18.2.19 version: 18.2.19 + dedot: + specifier: 0.16.0 + version: 0.16.0 react: specifier: 18.2.0 version: 18.2.0 react-dom: specifier: 18.2.0 version: 18.2.0 + tsup: + specifier: 8.5.0 + version: 8.5.0 importers: @@ -211,16 +223,16 @@ importers: version: 18.2.19 '@vitejs/plugin-react': specifier: ^4.4.1 - version: 4.6.0(vite@6.3.5) + version: 4.6.0(vite@6.3.5(@types/node@22.15.21)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.0)) eslint: specifier: ^9.25.0 - version: 9.35.0 + version: 9.35.0(jiti@2.4.2) eslint-plugin-react-hooks: specifier: ^5.2.0 - version: 5.2.0(eslint@9.35.0) + version: 5.2.0(eslint@9.35.0(jiti@2.4.2)) eslint-plugin-react-refresh: specifier: ^0.4.19 - version: 0.4.20(eslint@9.35.0) + version: 0.4.20(eslint@9.35.0(jiti@2.4.2)) globals: specifier: ^16.0.0 version: 16.3.0 @@ -229,10 +241,10 @@ importers: version: 5.8.3 typescript-eslint: specifier: ^8.30.1 - version: 8.43.0(eslint@9.35.0)(typescript@5.8.3) + version: 8.43.0(eslint@9.35.0(jiti@2.4.2))(typescript@5.8.3) vite: specifier: ^6.3.5 - version: 6.3.5 + version: 6.3.5(@types/node@22.15.21)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.0) examples/with-vite-papi: dependencies: @@ -297,6 +309,9 @@ importers: '@dedot/chaintypes': specifier: 'catalog:' version: 0.152.0(dedot@0.16.0) + '@ledgerhq/hw-transport-webusb': + specifier: 6.29.13 + version: 6.29.13 '@mimirdev/apps-inject': specifier: 3.2.0 version: 3.2.0 @@ -306,6 +321,12 @@ importers: '@walletconnect/universal-provider': specifier: 2.21.4 version: 2.21.4(typescript@5.8.3) + '@zondax/ledger-substrate': + specifier: 2.0.0 + version: 2.0.0 + buffer: + specifier: 6.0.3 + version: 6.0.3 dedot: specifier: 'catalog:' version: 0.16.0 @@ -452,7 +473,7 @@ importers: version: 18.2.0(react@18.2.0) storybook: specifier: ^8.0.0 - version: 8.6.14(prettier@3.6.2) + version: 8.6.14(prettier@3.7.4) tailwindcss: specifier: ^4.1.7 version: 4.1.12 @@ -1766,8 +1787,8 @@ packages: resolution: {integrity: sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@ethereumjs/rlp@10.0.0': - resolution: {integrity: sha512-h2SK6RxFBfN5ZGykbw8LTNNLckSXZeuUZ6xqnmtF22CzZbHflFMcIOyfVGdvyCVQqIoSbGMHtvyxMCWnOyB9RA==} + '@ethereumjs/rlp@10.1.0': + resolution: {integrity: sha512-r67BJbwilammAqYI4B5okA66cNdTlFzeWxPNJOolKV52ZS/flo0tUBf4x4gxWXBgh48OgsdFV1Qp5pRoSe8IhQ==} engines: {node: '>=18'} hasBin: true @@ -2038,6 +2059,27 @@ packages: '@jridgewell/trace-mapping@0.3.29': resolution: {integrity: sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==} + '@ledgerhq/devices@8.5.0': + resolution: {integrity: sha512-zDB6Pdk6NYYbYis8cWoLLkL9k/IvjhC3hkuuz2lhpJ2AxIs3/PDMUKoyK4DpjPtRyKk1W1lwsnpc6J1i87r4/Q==} + + '@ledgerhq/devices@8.7.0': + resolution: {integrity: sha512-3pSOULPUhClk2oOxa6UnoyXW8+05FK7r6cpq2WiTey4kyIUjmIraO7AX9lhz9IU73dGVtBMdU+NCPPO2RYJaTQ==} + + '@ledgerhq/errors@6.27.0': + resolution: {integrity: sha512-EE2hATONHdNP3YWFe3rZwwpSEzI5oN+q/xTjOulnjHZo84TLjungegEJ54A/Pzld0woulkkeVA27FbW5SAO1aA==} + + '@ledgerhq/hw-transport-webusb@6.29.13': + resolution: {integrity: sha512-RhQMCX2kjpI5N+4EvepDtIH9opTJxmCAEWIip4Im+ScjoSvBI1wveE5aDFhjDsHJUcKIQzIbB5jSuv0DZaajFA==} + + '@ledgerhq/hw-transport@6.31.13': + resolution: {integrity: sha512-MrJRDk74wY980ofiFPRpTHQBbRw1wDuKbdag1zqlO1xtJglymwwY03K2kvBNvkm1RTSCPUp/nAoNG+WThZuuew==} + + '@ledgerhq/hw-transport@6.31.9': + resolution: {integrity: sha512-HqB2Whl2qbrzyvs9gC/GmLhIy8RO4CWzjqHS4k0bPWDZRqKa8m6H32vjrbXGO//pUL1Mlu87UwvxvLyuICdjwg==} + + '@ledgerhq/logs@6.13.0': + resolution: {integrity: sha512-4+qRW2Pc8V+btL0QEmdB2X+uyx0kOWMWE1/LWsq5sZy3Q5tpi4eItJS6mB0XL3wGW59RQ+8bchNQQ1OW/va8Og==} + '@leichtgewicht/ip-codec@2.0.5': resolution: {integrity: sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==} @@ -2355,32 +2397,32 @@ packages: '@polkadot-api/ws-provider@0.3.6': resolution: {integrity: sha512-D2+rvcDc9smt24qUKqFoCuKKNhyBVDQEtnsqHiUN/Ym8UGP+Acegac3b9VOig70EpCcRBoYeXY2gEog2ybx1Kg==} - '@polkadot/types-support@16.4.6': - resolution: {integrity: sha512-e83H4MzamzNzxZdxf104xqzsl1YUCF24i2pw19I/6zPVxpt6a9zn4+7VzSVMclaztxxSTITCLbks7/9dLiNhEw==} + '@polkadot/types-support@16.5.3': + resolution: {integrity: sha512-ggyIRV+4Kn+aG1PiVT0PE00pAqMveyS3CuFsW9gJnKxeev4VrGfr08R4vw/61D7uIfpilkQdkXNgXAbeN09Mxg==} engines: {node: '>=18'} - '@polkadot/util@13.5.6': - resolution: {integrity: sha512-V+CkW2VdhcMWvl7eXdmlCLGqLxrKvXZtXE76KBbPP5n0Z+8DqQ58IHNOE9xe2LOgqDwIzdLlOUwkyF9Zj19y+Q==} + '@polkadot/util@13.5.9': + resolution: {integrity: sha512-pIK3XYXo7DKeFRkEBNYhf3GbCHg6dKQisSvdzZwuyzA6m7YxQq4DFw4IE464ve4Z7WsJFt3a6C9uII36hl9EWw==} engines: {node: '>=18'} - '@polkadot/x-bigint@13.5.6': - resolution: {integrity: sha512-HpqZJ9ud94iK/+0Ofacw7QdtvzFp6SucBBml4XwWZTWoLaLOGDsO7FoWE7yCuwPbX8nLgIM6YmQBeUoZmBtVqQ==} + '@polkadot/x-bigint@13.5.9': + resolution: {integrity: sha512-JVW6vw3e8fkcRyN9eoc6JIl63MRxNQCP/tuLdHWZts1tcAYao0hpWUzteqJY93AgvmQ91KPsC1Kf3iuuZCi74g==} engines: {node: '>=18'} - '@polkadot/x-global@13.5.6': - resolution: {integrity: sha512-iw97n0Bnl2284WgAK732LYR4DW6w5+COfBfHzkhiHqs5xwPEwWMgWGrf2hM8WAQqNIz6Ni8w/jagucPyQBur3Q==} + '@polkadot/x-global@13.5.9': + resolution: {integrity: sha512-zSRWvELHd3Q+bFkkI1h2cWIqLo1ETm+MxkNXLec3lB56iyq/MjWBxfXnAFFYFayvlEVneo7CLHcp+YTFd9aVSA==} engines: {node: '>=18'} - '@polkadot/x-textdecoder@13.5.6': - resolution: {integrity: sha512-jTGeYCxFh89KRrP7bNj1CPqKO36Onsi0iA6A+5YtRS5wjdQU+/OFM/EHLTP2nvkvZo/tOkOewMR9sausisUvVQ==} + '@polkadot/x-textdecoder@13.5.9': + resolution: {integrity: sha512-W2HhVNUbC/tuFdzNMbnXAWsIHSg9SC9QWDNmFD3nXdSzlXNgL8NmuiwN2fkYvCQBtp/XSoy0gDLx0C+Fo19cfw==} engines: {node: '>=18'} - '@polkadot/x-textencoder@13.5.6': - resolution: {integrity: sha512-iVwz9+OrYCEF9QbNfr9M206mmWvY/AhDmGPfAIeTR4fRgKGVYqcP8RIF8iu/x0MVQWqiVO3vlhlUk7MfrmAnoQ==} + '@polkadot/x-textencoder@13.5.9': + resolution: {integrity: sha512-SG0MHnLUgn1ZxFdm0KzMdTHJ47SfqFhdIPMcGA0Mg/jt2rwrfrP3jtEIJMsHfQpHvfsNPfv55XOMmoPWuQnP/Q==} engines: {node: '>=18'} - '@polkadot/x-ws@13.5.6': - resolution: {integrity: sha512-247ktVp/iE57NTXjFpHaoPoDcvoEPb8+16r2Eq0IBQ2umOV7P6KmxvdNx5eFUvRsgXvBpNwUXE1WVnXjK/eDtA==} + '@polkadot/x-ws@13.5.9': + resolution: {integrity: sha512-NKVgvACTIvKT8CjaQu9d0dERkZsWIZngX/4NVSjc01WHmln4F4y/zyBdYn/Z2V0Zw28cISx+lB4qxRmqTe7gbg==} engines: {node: '>=18'} '@radix-ui/primitive@1.1.3': @@ -3456,6 +3498,7 @@ packages: '@walletconnect/universal-provider@2.21.4': resolution: {integrity: sha512-ZSYU5H7Zi/nEy3L21kw5l3ovMagrbXDRKBG8vjPpGQAkflQocRj6d0SesFOCBEdJS16nt+6dKI2f5blpOGzyTQ==} + deprecated: 'Reliability and performance improvements. See: https://github.com/WalletConnect/walletconnect-monorepo/releases' '@walletconnect/utils@2.21.4': resolution: {integrity: sha512-LuSyBXvRLiDqIu4uMFei5eJ/WPhkIkdW58fmDlRnryatIuBPCho3dlrNSbOjVSdsID+OvxjOlpPLi+5h4oTbaA==} @@ -3517,6 +3560,12 @@ packages: '@xtuc/long@4.2.2': resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + '@zondax/ledger-js@1.3.1': + resolution: {integrity: sha512-sDBwsunK2nSzkqJ5xi6QTiVVpAxSy+X1BVcMfKioBsInjktki2SezT7K8Hw6kSlYd3yfOJlw8cs+hqVtxpAGtg==} + + '@zondax/ledger-substrate@2.0.0': + resolution: {integrity: sha512-N1mHa6vUa/XFSucTpt5zemO9b0qYzmiZf9mubmw/vpPOVU02C0/8drf80nk6eMcBKgfjwQEaB8DDTsZF0pRo6Q==} + abab@2.0.6: resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} deprecated: Use your platform's native atob() and btoa() methods instead @@ -3761,6 +3810,9 @@ packages: resolution: {integrity: sha512-Xm7bpRXnDSX2YE2YFfBk2FnF0ep6tmG7xPh8iHee8MIcrgq762Nkce856dYtJYLkuIoYZvGfTs/PbZhideTcEg==} engines: {node: '>=4'} + axios@1.13.2: + resolution: {integrity: sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==} + axobject-query@4.1.0: resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} engines: {node: '>= 0.4'} @@ -3833,6 +3885,9 @@ packages: base-x@5.0.1: resolution: {integrity: sha512-M7uio8Zt++eg3jPj+rHMfCC+IuygQHHCOU+IYsVtik6FWjuYpVt/+MRKcgsAMHh8mMFAwnB+Bs+mTrFiXjMzKg==} + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + batch@0.6.1: resolution: {integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==} @@ -3904,6 +3959,9 @@ packages: buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + builtin-modules@3.3.0: resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} engines: {node: '>=6'} @@ -5170,6 +5228,10 @@ packages: resolution: {integrity: sha512-f0cRzm6dkyVYV3nPoooP8XlccPQukegwhAnpoLcXy+X+A8KfpGOoXwDr9FLZd3wzgLaBGQBE3lY93Zm/i1JvIQ==} engines: {node: '>= 6'} + form-data@4.0.5: + resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} + engines: {node: '>= 6'} + forwarded@0.2.0: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} @@ -5507,6 +5569,9 @@ packages: resolution: {integrity: sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA==} engines: {node: '>=4'} + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + ignore@5.3.2: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} @@ -7275,8 +7340,8 @@ packages: engines: {node: '>=10.13.0'} hasBin: true - prettier@3.6.2: - resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==} + prettier@3.7.4: + resolution: {integrity: sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA==} engines: {node: '>=14'} hasBin: true @@ -7323,6 +7388,9 @@ packages: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + psl@1.15.0: resolution: {integrity: sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==} @@ -7829,8 +7897,8 @@ packages: smoldot@2.0.34: resolution: {integrity: sha512-mw9tCbGEhEp0koMqLL0jBEixVY1MIN/xI3pE6ZY1TuOPU+LnYy8FloODVyzkvzQPaBYrETXJdRlmA/+k6g3gow==} - smoldot@2.0.38: - resolution: {integrity: sha512-t9JurRhBkxST/z5sjjmQB8JMaAC5ydRZBZ7a62nSHJF+CRE6IO4JadGxFhxUPTvoDvdLOelzfNu4v09bAOA/6w==} + smoldot@2.0.40: + resolution: {integrity: sha512-h6XC/kKDLdZBBTI0X8y4ZxmaZ2KYVVB0+5isCQm6j26ljeNjHZUDOV+hf8VyoE23+jg00wrxNJ2IVcIAURxwtg==} snake-case@3.0.4: resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} @@ -10455,7 +10523,7 @@ snapshots: '@dedot/codecs': 0.16.0 '@dedot/codegen': 0.16.0 '@polkadot-api/wasm-executor': 0.1.2 - '@polkadot/types-support': 16.4.6 + '@polkadot/types-support': 16.5.3 ora: 8.2.0 yargs: 17.7.2 transitivePeerDependencies: @@ -10478,7 +10546,7 @@ snapshots: '@dedot/types': 0.16.0 '@dedot/utils': 0.16.0 handlebars: 4.7.8 - prettier: 3.6.2 + prettier: 3.7.4 transitivePeerDependencies: - bufferutil - utf-8-validate @@ -10489,7 +10557,7 @@ snapshots: '@dedot/codecs': 0.16.0 '@dedot/types': 0.16.0 '@dedot/utils': 0.16.0 - '@ethereumjs/rlp': 10.0.0 + '@ethereumjs/rlp': 10.1.0 transitivePeerDependencies: - bufferutil - utf-8-validate @@ -10503,7 +10571,7 @@ snapshots: '@dedot/providers@0.16.0': dependencies: '@dedot/utils': 0.16.0 - '@polkadot/x-ws': 13.5.6 + '@polkadot/x-ws': 13.5.9 transitivePeerDependencies: - bufferutil - utf-8-validate @@ -10521,7 +10589,7 @@ snapshots: '@dedot/smoldot@0.16.0': dependencies: - smoldot: 2.0.38 + smoldot: 2.0.40 transitivePeerDependencies: - bufferutil - utf-8-validate @@ -10630,21 +10698,11 @@ snapshots: eslint: 9.35.0(jiti@2.4.2) eslint-visitor-keys: 3.4.3 - '@eslint-community/eslint-utils@4.7.0(eslint@9.35.0)': - dependencies: - eslint: 9.35.0 - eslint-visitor-keys: 3.4.3 - '@eslint-community/eslint-utils@4.9.0(eslint@9.35.0(jiti@2.4.2))': dependencies: eslint: 9.35.0(jiti@2.4.2) eslint-visitor-keys: 3.4.3 - '@eslint-community/eslint-utils@4.9.0(eslint@9.35.0)': - dependencies: - eslint: 9.35.0 - eslint-visitor-keys: 3.4.3 - '@eslint-community/regexpp@4.12.1': {} '@eslint/config-array@0.21.0': @@ -10700,7 +10758,7 @@ snapshots: '@eslint/core': 0.15.2 levn: 0.4.1 - '@ethereumjs/rlp@10.0.0': {} + '@ethereumjs/rlp@10.1.0': {} '@humanfs/core@0.19.1': {} @@ -11048,6 +11106,45 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 + '@ledgerhq/devices@8.5.0': + dependencies: + '@ledgerhq/errors': 6.27.0 + '@ledgerhq/logs': 6.13.0 + rxjs: 7.8.2 + semver: 7.7.2 + + '@ledgerhq/devices@8.7.0': + dependencies: + '@ledgerhq/errors': 6.27.0 + '@ledgerhq/logs': 6.13.0 + rxjs: 7.8.2 + semver: 7.7.2 + + '@ledgerhq/errors@6.27.0': {} + + '@ledgerhq/hw-transport-webusb@6.29.13': + dependencies: + '@ledgerhq/devices': 8.7.0 + '@ledgerhq/errors': 6.27.0 + '@ledgerhq/hw-transport': 6.31.13 + '@ledgerhq/logs': 6.13.0 + + '@ledgerhq/hw-transport@6.31.13': + dependencies: + '@ledgerhq/devices': 8.7.0 + '@ledgerhq/errors': 6.27.0 + '@ledgerhq/logs': 6.13.0 + events: 3.3.0 + + '@ledgerhq/hw-transport@6.31.9': + dependencies: + '@ledgerhq/devices': 8.5.0 + '@ledgerhq/errors': 6.27.0 + '@ledgerhq/logs': 6.13.0 + events: 3.3.0 + + '@ledgerhq/logs@6.13.0': {} + '@leichtgewicht/ip-codec@2.0.5': {} '@manypkg/find-root@1.1.0': @@ -11399,43 +11496,43 @@ snapshots: - bufferutil - utf-8-validate - '@polkadot/types-support@16.4.6': + '@polkadot/types-support@16.5.3': dependencies: - '@polkadot/util': 13.5.6 + '@polkadot/util': 13.5.9 tslib: 2.8.1 - '@polkadot/util@13.5.6': + '@polkadot/util@13.5.9': dependencies: - '@polkadot/x-bigint': 13.5.6 - '@polkadot/x-global': 13.5.6 - '@polkadot/x-textdecoder': 13.5.6 - '@polkadot/x-textencoder': 13.5.6 + '@polkadot/x-bigint': 13.5.9 + '@polkadot/x-global': 13.5.9 + '@polkadot/x-textdecoder': 13.5.9 + '@polkadot/x-textencoder': 13.5.9 '@types/bn.js': 5.2.0 bn.js: 5.2.2 tslib: 2.8.1 - '@polkadot/x-bigint@13.5.6': + '@polkadot/x-bigint@13.5.9': dependencies: - '@polkadot/x-global': 13.5.6 + '@polkadot/x-global': 13.5.9 tslib: 2.8.1 - '@polkadot/x-global@13.5.6': + '@polkadot/x-global@13.5.9': dependencies: tslib: 2.8.1 - '@polkadot/x-textdecoder@13.5.6': + '@polkadot/x-textdecoder@13.5.9': dependencies: - '@polkadot/x-global': 13.5.6 + '@polkadot/x-global': 13.5.9 tslib: 2.8.1 - '@polkadot/x-textencoder@13.5.6': + '@polkadot/x-textencoder@13.5.9': dependencies: - '@polkadot/x-global': 13.5.6 + '@polkadot/x-global': 13.5.9 tslib: 2.8.1 - '@polkadot/x-ws@13.5.6': + '@polkadot/x-ws@13.5.9': dependencies: - '@polkadot/x-global': 13.5.6 + '@polkadot/x-global': 13.5.9 tslib: 2.8.1 ws: 8.18.3 transitivePeerDependencies: @@ -11720,9 +11817,9 @@ snapshots: dependencies: '@sinonjs/commons': 1.8.6 - '@storybook/core@8.6.14(prettier@3.6.2)(storybook@8.6.14(prettier@3.6.2))': + '@storybook/core@8.6.14(prettier@3.7.4)(storybook@8.6.14(prettier@3.7.4))': dependencies: - '@storybook/theming': 8.6.14(storybook@8.6.14(prettier@3.6.2)) + '@storybook/theming': 8.6.14(storybook@8.6.14(prettier@3.7.4)) better-opn: 3.0.2 browser-assert: 1.2.1 esbuild: 0.25.5 @@ -11734,16 +11831,16 @@ snapshots: util: 0.12.5 ws: 8.18.3 optionalDependencies: - prettier: 3.6.2 + prettier: 3.7.4 transitivePeerDependencies: - bufferutil - storybook - supports-color - utf-8-validate - '@storybook/theming@8.6.14(storybook@8.6.14(prettier@3.6.2))': + '@storybook/theming@8.6.14(storybook@8.6.14(prettier@3.7.4))': dependencies: - storybook: 8.6.14(prettier@3.6.2) + storybook: 8.6.14(prettier@3.7.4) '@surma/rollup-plugin-off-main-thread@2.2.3': dependencies: @@ -12317,23 +12414,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/eslint-plugin@8.43.0(@typescript-eslint/parser@8.43.0(eslint@9.35.0)(typescript@5.8.3))(eslint@9.35.0)(typescript@5.8.3)': - dependencies: - '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.43.0(eslint@9.35.0)(typescript@5.8.3) - '@typescript-eslint/scope-manager': 8.43.0 - '@typescript-eslint/type-utils': 8.43.0(eslint@9.35.0)(typescript@5.8.3) - '@typescript-eslint/utils': 8.43.0(eslint@9.35.0)(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 8.43.0 - eslint: 9.35.0 - graphemer: 1.4.0 - ignore: 7.0.5 - natural-compare: 1.4.0 - ts-api-utils: 2.1.0(typescript@5.8.3) - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/experimental-utils@5.62.0(eslint@8.57.1)(typescript@4.9.5)': dependencies: '@typescript-eslint/utils': 5.62.0(eslint@8.57.1)(typescript@4.9.5) @@ -12366,18 +12446,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.43.0(eslint@9.35.0)(typescript@5.8.3)': - dependencies: - '@typescript-eslint/scope-manager': 8.43.0 - '@typescript-eslint/types': 8.43.0 - '@typescript-eslint/typescript-estree': 8.43.0(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 8.43.0 - debug: 4.4.1 - eslint: 9.35.0 - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/project-service@8.43.0(typescript@5.8.3)': dependencies: '@typescript-eslint/tsconfig-utils': 8.43.0(typescript@5.8.3) @@ -12425,18 +12493,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/type-utils@8.43.0(eslint@9.35.0)(typescript@5.8.3)': - dependencies: - '@typescript-eslint/types': 8.43.0 - '@typescript-eslint/typescript-estree': 8.43.0(typescript@5.8.3) - '@typescript-eslint/utils': 8.43.0(eslint@9.35.0)(typescript@5.8.3) - debug: 4.4.1 - eslint: 9.35.0 - ts-api-utils: 2.1.0(typescript@5.8.3) - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/types@5.62.0': {} '@typescript-eslint/types@8.43.0': {} @@ -12497,17 +12553,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.43.0(eslint@9.35.0)(typescript@5.8.3)': - dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.35.0) - '@typescript-eslint/scope-manager': 8.43.0 - '@typescript-eslint/types': 8.43.0 - '@typescript-eslint/typescript-estree': 8.43.0(typescript@5.8.3) - eslint: 9.35.0 - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/visitor-keys@5.62.0': dependencies: '@typescript-eslint/types': 5.62.0 @@ -12520,7 +12565,7 @@ snapshots: '@ungap/structured-clone@1.3.0': {} - '@vitejs/plugin-react@4.6.0(vite@6.3.5)': + '@vitejs/plugin-react@4.6.0(vite@6.3.5(@types/node@22.15.21)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.0))': dependencies: '@babel/core': 7.27.7 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.27.7) @@ -12528,7 +12573,7 @@ snapshots: '@rolldown/pluginutils': 1.0.0-beta.19 '@types/babel__core': 7.20.5 react-refresh: 0.17.0 - vite: 6.3.5 + vite: 6.3.5(@types/node@22.15.21)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.0) transitivePeerDependencies: - supports-color @@ -13040,6 +13085,18 @@ snapshots: '@xtuc/long@4.2.2': {} + '@zondax/ledger-js@1.3.1': + dependencies: + '@ledgerhq/hw-transport': 6.31.9 + + '@zondax/ledger-substrate@2.0.0': + dependencies: + '@ledgerhq/hw-transport': 6.31.13 + '@zondax/ledger-js': 1.3.1 + axios: 1.13.2 + transitivePeerDependencies: + - debug + abab@2.0.6: {} abitype@1.0.8(typescript@5.8.3): @@ -13287,6 +13344,14 @@ snapshots: axe-core@4.10.3: {} + axios@1.13.2: + dependencies: + follow-redirects: 1.15.9 + form-data: 4.0.5 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + axobject-query@4.1.0: {} babel-jest@27.5.1(@babel/core@7.27.7): @@ -13416,6 +13481,8 @@ snapshots: base-x@5.0.1: {} + base64-js@1.5.1: {} + batch@0.6.1: {} better-opn@3.0.2: @@ -13502,6 +13569,11 @@ snapshots: buffer-from@1.1.2: {} + buffer@6.0.3: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + builtin-modules@3.3.0: {} bundle-require@5.1.0(esbuild@0.25.5): @@ -14044,7 +14116,7 @@ snapshots: '@dedot/smoldot': 0.16.0 '@dedot/types': 0.16.0 '@dedot/utils': 0.16.0 - smoldot: 2.0.38 + smoldot: 2.0.40 transitivePeerDependencies: - bufferutil - utf-8-validate @@ -14561,18 +14633,10 @@ snapshots: dependencies: eslint: 9.35.0(jiti@2.4.2) - eslint-plugin-react-hooks@5.2.0(eslint@9.35.0): - dependencies: - eslint: 9.35.0 - eslint-plugin-react-refresh@0.4.20(eslint@9.35.0(jiti@2.4.2)): dependencies: eslint: 9.35.0(jiti@2.4.2) - eslint-plugin-react-refresh@0.4.20(eslint@9.35.0): - dependencies: - eslint: 9.35.0 - eslint-plugin-react@7.37.5(eslint@8.57.1): dependencies: array-includes: 3.1.9 @@ -14677,46 +14741,6 @@ snapshots: transitivePeerDependencies: - supports-color - eslint@9.35.0: - dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.35.0) - '@eslint-community/regexpp': 4.12.1 - '@eslint/config-array': 0.21.0 - '@eslint/config-helpers': 0.3.1 - '@eslint/core': 0.15.2 - '@eslint/eslintrc': 3.3.1 - '@eslint/js': 9.35.0 - '@eslint/plugin-kit': 0.3.5 - '@humanfs/node': 0.16.6 - '@humanwhocodes/module-importer': 1.0.1 - '@humanwhocodes/retry': 0.4.3 - '@types/estree': 1.0.8 - '@types/json-schema': 7.0.15 - ajv: 6.12.6 - chalk: 4.1.2 - cross-spawn: 7.0.6 - debug: 4.4.1 - escape-string-regexp: 4.0.0 - eslint-scope: 8.4.0 - eslint-visitor-keys: 4.2.1 - espree: 10.4.0 - esquery: 1.6.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 8.0.0 - find-up: 5.0.0 - glob-parent: 6.0.2 - ignore: 5.3.2 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - json-stable-stringify-without-jsonify: 1.0.1 - lodash.merge: 4.6.2 - minimatch: 3.1.2 - natural-compare: 1.4.0 - optionator: 0.9.4 - transitivePeerDependencies: - - supports-color - eslint@9.35.0(jiti@2.4.2): dependencies: '@eslint-community/eslint-utils': 4.9.0(eslint@9.35.0(jiti@2.4.2)) @@ -15043,6 +15067,14 @@ snapshots: hasown: 2.0.2 mime-types: 2.1.35 + form-data@4.0.5: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.2 + mime-types: 2.1.35 + forwarded@0.2.0: {} fraction.js@4.3.7: {} @@ -15416,6 +15448,8 @@ snapshots: dependencies: harmony-reflect: 1.6.2 + ieee754@1.2.1: {} + ignore@5.3.2: {} ignore@7.0.5: {} @@ -17387,7 +17421,7 @@ snapshots: prettier@2.8.8: {} - prettier@3.6.2: {} + prettier@3.7.4: {} pretty-bytes@5.6.0: {} @@ -17439,6 +17473,8 @@ snapshots: forwarded: 0.2.0 ipaddr.js: 1.9.1 + proxy-from-env@1.1.0: {} + psl@1.15.0: dependencies: punycode: 2.3.1 @@ -18132,7 +18168,7 @@ snapshots: - bufferutil - utf-8-validate - smoldot@2.0.38: + smoldot@2.0.40: dependencies: ws: 8.18.3 transitivePeerDependencies: @@ -18259,11 +18295,11 @@ snapshots: es-errors: 1.3.0 internal-slot: 1.1.0 - storybook@8.6.14(prettier@3.6.2): + storybook@8.6.14(prettier@3.7.4): dependencies: - '@storybook/core': 8.6.14(prettier@3.6.2)(storybook@8.6.14(prettier@3.6.2)) + '@storybook/core': 8.6.14(prettier@3.7.4)(storybook@8.6.14(prettier@3.7.4)) optionalDependencies: - prettier: 3.6.2 + prettier: 3.7.4 transitivePeerDependencies: - bufferutil - supports-color @@ -18776,17 +18812,6 @@ snapshots: transitivePeerDependencies: - supports-color - typescript-eslint@8.43.0(eslint@9.35.0)(typescript@5.8.3): - dependencies: - '@typescript-eslint/eslint-plugin': 8.43.0(@typescript-eslint/parser@8.43.0(eslint@9.35.0)(typescript@5.8.3))(eslint@9.35.0)(typescript@5.8.3) - '@typescript-eslint/parser': 8.43.0(eslint@9.35.0)(typescript@5.8.3) - '@typescript-eslint/typescript-estree': 8.43.0(typescript@5.8.3) - '@typescript-eslint/utils': 8.43.0(eslint@9.35.0)(typescript@5.8.3) - eslint: 9.35.0 - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - typescript@4.9.5: {} typescript@5.8.3: {} @@ -18982,7 +19007,7 @@ snapshots: - tsx - yaml - vite@6.3.5: + vite@6.3.5(@types/node@22.15.21)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.0): dependencies: esbuild: 0.25.5 fdir: 6.4.6(picomatch@4.0.2) @@ -18991,7 +19016,12 @@ snapshots: rollup: 4.44.1 tinyglobby: 0.2.14 optionalDependencies: + '@types/node': 22.15.21 fsevents: 2.3.3 + jiti: 2.4.2 + lightningcss: 1.30.1 + terser: 5.43.1 + yaml: 2.8.0 vite@7.1.4(@types/node@20.19.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.0): dependencies: From 3322872d71ea7fa5026e155eb24bb2c8abe0f68b Mon Sep 17 00:00:00 2001 From: WBH <48749219+wbh1328551759@users.noreply.github.com> Date: Mon, 15 Dec 2025 15:35:51 +0800 Subject: [PATCH 41/45] Release/v0.0.11 (#132) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * update README and fix GitHub Actions * Chore/UI work (#24) * fix(ui): resolve Radix UI Dialog TypeScript errors - Add proper type interfaces for Dialog components - Fix ModalContext missing closeConnectModal method - Handle @tanstack/react-query v5 API changes - Use React.createElement to bypass Radix UI type restrictions * feat(ui): add new theme system with light/dark presets and CSS variables * fix: resolve chain modal issues and optimize theme system * feat: save current theme system state before refactoring * fix: resolve UI build issues and restore theme system - Fix base.css theme syntax to use @theme inline with var() instead of theme() - Restore missing dark theme variables (spacing, typography, fonts, radii, blurs) - Update theme context structure and remove defaultTheme.ts - Update LunoKitProvider to use new theme system - Fix PostCSS configuration for Tailwind CSS v4 * feat: remove toggleTheme and add auto system theme following - Remove toggleTheme function from ThemeProvider - Add useSystemTheme hook to detect system color scheme - Add auto-following system theme when both light and dark are provided - Add isAutoMode flag to indicate auto-following state - Update example app to use setThemeMode instead of toggleTheme - Maintain backward compatibility with existing theme system * feat: optimize theme persistence logic - only persist when user has theme choice * fix: remove defaultTheme from LunoKitProvider to match ThemeProvider interface * feat(theme): remove localStorage persistence and fix dark theme logic - Remove theme localStorage persistence - Fix dark theme not applying with theme={{dark:{}}} - Simplify theme initialization and switching logic * refactor(ui): standardize design │ │ tokens and remove style duplicates * feat(ui): Modify the rounded property of some components. * refactor(AccountDetailsModal): simplify view transitions to height-only animation * refactor(ui):Optimize code structure, remove unused code * feat(theme): enhance theme system with auto-mode and user preferences - Add autoMode support for system theme following - Implement localStorage persistence for user choices - Add setThemeChoice API for explicit user actions - Remove unused dependencies (postcss-import) - Clean up redundant size props and methods - Fix hook functionality and simplify API - Improve theme initialization priority logic * refactor(ui): replace localStorage with config.storage in theme system * refactor(theme): optimize theme system and eliminate flashing - Extract CSS variable injection logic to separate file (cssVariableInject.ts) - Optimize initial theme state calculation to prevent flashing - Simplify theme preference interface (isAuto, preferredTheme) - Fix system theme detection with proper initialization - Remove redundant state management and async loading * refactor(theme): replace LunoStorage with localStorage for theme persistence * feat(examples): Remove auto mode label --------- Co-authored-by: “Gintma” * fix bug in walletconnect * fix(core): fix disconnect of walletconnectConnector * fix(ui): fix openConnectModal & refresh qrcode in ConnectModal * Chore/UI work (#25) * fix(ui): resolve Radix UI Dialog TypeScript errors - Add proper type interfaces for Dialog components - Fix ModalContext missing closeConnectModal method - Handle @tanstack/react-query v5 API changes - Use React.createElement to bypass Radix UI type restrictions * feat(ui): add new theme system with light/dark presets and CSS variables * fix: resolve chain modal issues and optimize theme system * feat: save current theme system state before refactoring * fix: resolve UI build issues and restore theme system - Fix base.css theme syntax to use @theme inline with var() instead of theme() - Restore missing dark theme variables (spacing, typography, fonts, radii, blurs) - Update theme context structure and remove defaultTheme.ts - Update LunoKitProvider to use new theme system - Fix PostCSS configuration for Tailwind CSS v4 * feat: remove toggleTheme and add auto system theme following - Remove toggleTheme function from ThemeProvider - Add useSystemTheme hook to detect system color scheme - Add auto-following system theme when both light and dark are provided - Add isAutoMode flag to indicate auto-following state - Update example app to use setThemeMode instead of toggleTheme - Maintain backward compatibility with existing theme system * feat: optimize theme persistence logic - only persist when user has theme choice * fix: remove defaultTheme from LunoKitProvider to match ThemeProvider interface * feat(theme): remove localStorage persistence and fix dark theme logic - Remove theme localStorage persistence - Fix dark theme not applying with theme={{dark:{}}} - Simplify theme initialization and switching logic * refactor(ui): standardize design │ │ tokens and remove style duplicates * feat(ui): Modify the rounded property of some components. * refactor(AccountDetailsModal): simplify view transitions to height-only animation * refactor(ui):Optimize code structure, remove unused code * feat(theme): enhance theme system with auto-mode and user preferences - Add autoMode support for system theme following - Implement localStorage persistence for user choices - Add setThemeChoice API for explicit user actions - Remove unused dependencies (postcss-import) - Clean up redundant size props and methods - Fix hook functionality and simplify API - Improve theme initialization priority logic * refactor(ui): replace localStorage with config.storage in theme system * refactor(theme): optimize theme system and eliminate flashing - Extract CSS variable injection logic to separate file (cssVariableInject.ts) - Optimize initial theme state calculation to prevent flashing - Simplify theme preference interface (isAuto, preferredTheme) - Fix system theme detection with proper initialization - Remove redundant state management and async loading * refactor(theme): replace LunoStorage with localStorage for theme persistence * feat(examples): Remove auto mode label * feat: implement QR code skeleton loading state --------- Co-authored-by: “Gintma” * Chore/ci cd readme (#27) * chore: update README and fix GitHub Actions * chore: update working-directory for pnpm audit --------- Co-authored-by: Gintma * Feat/mobile UI (#28) * feat(core): In novaConnector, add support for novaMobileConnector * feat(ui): Add "useWindowSize", optimize responsive design * feat(core): add links field with browserExtension & deepLink and add test code * feat(ui): enhance CSS styles with mobile responsiveness --------- Co-authored-by: Gintma * fix(ui): fix view switching logic in ConnectModal component (#30) * Fix/connect modal (#32) * Develop (#29) * update README and fix GitHub Actions * Chore/UI work (#24) * fix(ui): resolve Radix UI Dialog TypeScript errors - Add proper type interfaces for Dialog components - Fix ModalContext missing closeConnectModal method - Handle @tanstack/react-query v5 API changes - Use React.createElement to bypass Radix UI type restrictions * feat(ui): add new theme system with light/dark presets and CSS variables * fix: resolve chain modal issues and optimize theme system * feat: save current theme system state before refactoring * fix: resolve UI build issues and restore theme system - Fix base.css theme syntax to use @theme inline with var() instead of theme() - Restore missing dark theme variables (spacing, typography, fonts, radii, blurs) - Update theme context structure and remove defaultTheme.ts - Update LunoKitProvider to use new theme system - Fix PostCSS configuration for Tailwind CSS v4 * feat: remove toggleTheme and add auto system theme following - Remove toggleTheme function from ThemeProvider - Add useSystemTheme hook to detect system color scheme - Add auto-following system theme when both light and dark are provided - Add isAutoMode flag to indicate auto-following state - Update example app to use setThemeMode instead of toggleTheme - Maintain backward compatibility with existing theme system * feat: optimize theme persistence logic - only persist when user has theme choice * fix: remove defaultTheme from LunoKitProvider to match ThemeProvider interface * feat(theme): remove localStorage persistence and fix dark theme logic - Remove theme localStorage persistence - Fix dark theme not applying with theme={{dark:{}}} - Simplify theme initialization and switching logic * refactor(ui): standardize design │ │ tokens and remove style duplicates * feat(ui): Modify the rounded property of some components. * refactor(AccountDetailsModal): simplify view transitions to height-only animation * refactor(ui):Optimize code structure, remove unused code * feat(theme): enhance theme system with auto-mode and user preferences - Add autoMode support for system theme following - Implement localStorage persistence for user choices - Add setThemeChoice API for explicit user actions - Remove unused dependencies (postcss-import) - Clean up redundant size props and methods - Fix hook functionality and simplify API - Improve theme initialization priority logic * refactor(ui): replace localStorage with config.storage in theme system * refactor(theme): optimize theme system and eliminate flashing - Extract CSS variable injection logic to separate file (cssVariableInject.ts) - Optimize initial theme state calculation to prevent flashing - Simplify theme preference interface (isAuto, preferredTheme) - Fix system theme detection with proper initialization - Remove redundant state management and async loading * refactor(theme): replace LunoStorage with localStorage for theme persistence * feat(examples): Remove auto mode label --------- Co-authored-by: “Gintma” * fix bug in walletconnect * fix(core): fix disconnect of walletconnectConnector * fix(ui): fix openConnectModal & refresh qrcode in ConnectModal * Chore/UI work (#25) * fix(ui): resolve Radix UI Dialog TypeScript errors - Add proper type interfaces for Dialog components - Fix ModalContext missing closeConnectModal method - Handle @tanstack/react-query v5 API changes - Use React.createElement to bypass Radix UI type restrictions * feat(ui): add new theme system with light/dark presets and CSS variables * fix: resolve chain modal issues and optimize theme system * feat: save current theme system state before refactoring * fix: resolve UI build issues and restore theme system - Fix base.css theme syntax to use @theme inline with var() instead of theme() - Restore missing dark theme variables (spacing, typography, fonts, radii, blurs) - Update theme context structure and remove defaultTheme.ts - Update LunoKitProvider to use new theme system - Fix PostCSS configuration for Tailwind CSS v4 * feat: remove toggleTheme and add auto system theme following - Remove toggleTheme function from ThemeProvider - Add useSystemTheme hook to detect system color scheme - Add auto-following system theme when both light and dark are provided - Add isAutoMode flag to indicate auto-following state - Update example app to use setThemeMode instead of toggleTheme - Maintain backward compatibility with existing theme system * feat: optimize theme persistence logic - only persist when user has theme choice * fix: remove defaultTheme from LunoKitProvider to match ThemeProvider interface * feat(theme): remove localStorage persistence and fix dark theme logic - Remove theme localStorage persistence - Fix dark theme not applying with theme={{dark:{}}} - Simplify theme initialization and switching logic * refactor(ui): standardize design │ │ tokens and remove style duplicates * feat(ui): Modify the rounded property of some components. * refactor(AccountDetailsModal): simplify view transitions to height-only animation * refactor(ui):Optimize code structure, remove unused code * feat(theme): enhance theme system with auto-mode and user preferences - Add autoMode support for system theme following - Implement localStorage persistence for user choices - Add setThemeChoice API for explicit user actions - Remove unused dependencies (postcss-import) - Clean up redundant size props and methods - Fix hook functionality and simplify API - Improve theme initialization priority logic * refactor(ui): replace localStorage with config.storage in theme system * refactor(theme): optimize theme system and eliminate flashing - Extract CSS variable injection logic to separate file (cssVariableInject.ts) - Optimize initial theme state calculation to prevent flashing - Simplify theme preference interface (isAuto, preferredTheme) - Fix system theme detection with proper initialization - Remove redundant state management and async loading * refactor(theme): replace LunoStorage with localStorage for theme persistence * feat(examples): Remove auto mode label * feat: implement QR code skeleton loading state --------- Co-authored-by: “Gintma” * Chore/ci cd readme (#27) * chore: update README and fix GitHub Actions * chore: update working-directory for pnpm audit --------- Co-authored-by: Gintma * Feat/mobile UI (#28) * feat(core): In novaConnector, add support for novaMobileConnector * feat(ui): Add "useWindowSize", optimize responsive design * feat(core): add links field with browserExtension & deepLink and add test code * feat(ui): enhance CSS styles with mobile responsiveness --------- Co-authored-by: Gintma --------- Co-authored-by: “Gintma” * fix(ui): fix view switching logic in ConnectModal component --------- Co-authored-by: “Gintma” * fix(with-vite): fix undifined of Notification * fix(ui): fix view switching logic in ConnectModal component * fix(with-vite): fix undifined of Notification * fix(with-vite): Fix the reference of the Notification object to ensure that it is accessed through the window object when used. * fix(ui): fix view switching logic in ConnectModal component * fix(with-vite): fix undifined of Notification * fix(with-vite): Fix the reference of the Notification object to ensure that it is accessed through the window object when used. * fix(ui): fix connect in mobile * fix(ui): fix view switching logic in ConnectModal component * fix(with-vite): fix undifined of Notification * fix(with-vite): Fix the reference of the Notification object to ensure that it is accessed through the window object when used. * fix(ui): fix connect in mobile * Fix/create api (#39) * feat(react): migrate from DedotClient to LegacyClient * fix(ui): fix theme type definitions and improve prop interface * fix(ui): fix css style in ConnectButton * feat(core): add browser download link in novaConnector * feat(ui): fix ConnectModal responsive view switching and enhance WalletView QR code features * Fix/create api (#40) * feat(react): migrate from DedotClient to LegacyClient * fix(ui): fix theme type definitions and improve prop interface * fix(ui): fix css style in ConnectButton * feat(core): add browser download link in novaConnector * feat(ui): fix ConnectModal responsive view switching and enhance WalletView QR code features * feat(core): add injectorId support to CommonConnector for custom injector identification * Fix/create api (#42) * feat(react): migrate from DedotClient to LegacyClient * fix(ui): fix theme type definitions and improve prop interface * fix(ui): fix css style in ConnectButton * feat(core): add browser download link in novaConnector * feat(ui): fix ConnectModal responsive view switching and enhance WalletView QR code features * feat(core): add injectorId support to CommonConnector for custom injector identification * fix(react): add disconnect logic when account address is missing on account change * fix(ui): fix error and loading states in WalletView component * Chore/ci cd readme (#43) * chore: update README and fix GitHub Actions * chore: update working-directory for pnpm audit * chore: add release action --------- Co-authored-by: Gintma * Fix/create api (#56) * feat(react): migrate from DedotClient to LegacyClient * fix(ui): fix theme type definitions and improve prop interface * fix(ui): fix css style in ConnectButton * feat(core): add browser download link in novaConnector * feat(ui): fix ConnectModal responsive view switching and enhance WalletView QR code features * feat(core): add injectorId support to CommonConnector for custom injector identification * fix(react): add disconnect logic when account address is missing on account change * fix(ui): fix error and loading states in WalletView component * feat(with-vite): add .env.local.example * feat(example): Add environment variable example file and update connectors to use from environment variables (#61) * Chore/UI work (#63) * fix(ui): resolve Radix UI Dialog TypeScript errors - Add proper type interfaces for Dialog components - Fix ModalContext missing closeConnectModal method - Handle @tanstack/react-query v5 API changes - Use React.createElement to bypass Radix UI type restrictions * feat(ui): add new theme system with light/dark presets and CSS variables * fix: resolve chain modal issues and optimize theme system * feat: save current theme system state before refactoring * fix: resolve UI build issues and restore theme system - Fix base.css theme syntax to use @theme inline with var() instead of theme() - Restore missing dark theme variables (spacing, typography, fonts, radii, blurs) - Update theme context structure and remove defaultTheme.ts - Update LunoKitProvider to use new theme system - Fix PostCSS configuration for Tailwind CSS v4 * feat: remove toggleTheme and add auto system theme following - Remove toggleTheme function from ThemeProvider - Add useSystemTheme hook to detect system color scheme - Add auto-following system theme when both light and dark are provided - Add isAutoMode flag to indicate auto-following state - Update example app to use setThemeMode instead of toggleTheme - Maintain backward compatibility with existing theme system * feat: optimize theme persistence logic - only persist when user has theme choice * fix: remove defaultTheme from LunoKitProvider to match ThemeProvider interface * feat(theme): remove localStorage persistence and fix dark theme logic - Remove theme localStorage persistence - Fix dark theme not applying with theme={{dark:{}}} - Simplify theme initialization and switching logic * refactor(ui): standardize design │ │ tokens and remove style duplicates * feat(ui): Modify the rounded property of some components. * refactor(AccountDetailsModal): simplify view transitions to height-only animation * refactor(ui):Optimize code structure, remove unused code * feat(theme): enhance theme system with auto-mode and user preferences - Add autoMode support for system theme following - Implement localStorage persistence for user choices - Add setThemeChoice API for explicit user actions - Remove unused dependencies (postcss-import) - Clean up redundant size props and methods - Fix hook functionality and simplify API - Improve theme initialization priority logic * refactor(ui): replace localStorage with config.storage in theme system * refactor(theme): optimize theme system and eliminate flashing - Extract CSS variable injection logic to separate file (cssVariableInject.ts) - Optimize initial theme state calculation to prevent flashing - Simplify theme preference interface (isAuto, preferredTheme) - Fix system theme detection with proper initialization - Remove redundant state management and async loading * refactor(theme): replace LunoStorage with localStorage for theme persistence * feat(examples): Remove auto mode label * feat: implement QR code skeleton loading state * feat(core): In novaConnector, add support for novaMobileConnector * feat(ui): Add "useWindowSize", optimize responsive design * feat(core): add links field with browserExtension & deepLink and add test code * feat(ui): enhance CSS styles with mobile responsiveness * feat(ui): enhance modal layouts and improve visual consistency * feat(ui): improve connect modal layout and wallet organization * feat: enhance modal UI and fix animations- Add modal border and improve title centering - Fix close animation flicker - Add chain status indicator - Clean up unused CSS variables - Adjust spacing and padding consistency * feat: improve modal UX and fix build issues UI: - Add border to dialog modal - Center title in compact mode - Add chain status indicator dot - Adjust item padding and spacing Fix: - Modal close animation flicker - CSS syntax error (extra semicolon) - Remove unused cutLine variable * feat: replace Loading component with modern CSS animation - Replace SVG Loading with CSS mask animation - Remove unused Loading.tsx file and exports - Use Tailwind sizing classes - Improve performance and reduce bundle size * style: refine shadows and remove test styles - Remove test background color from AccountItem - Fix Dialog shadow class name - Adjust shadow values for better visual hierarchy - Update modal backdrop opacity for improved contrast * fix: remove useless code * fix(chore): fix test of walletconnect --------- Co-authored-by: “Gintma” * fix(chore): Update signMessage method to support optional chainId parameter (#64) * Fix/UI bug (#66) * Develop (#62) * update README and fix GitHub Actions * Chore/UI work (#24) * fix(ui): resolve Radix UI Dialog TypeScript errors - Add proper type interfaces for Dialog components - Fix ModalContext missing closeConnectModal method - Handle @tanstack/react-query v5 API changes - Use React.createElement to bypass Radix UI type restrictions * feat(ui): add new theme system with light/dark presets and CSS variables * fix: resolve chain modal issues and optimize theme system * feat: save current theme system state before refactoring * fix: resolve UI build issues and restore theme system - Fix base.css theme syntax to use @theme inline with var() instead of theme() - Restore missing dark theme variables (spacing, typography, fonts, radii, blurs) - Update theme context structure and remove defaultTheme.ts - Update LunoKitProvider to use new theme system - Fix PostCSS configuration for Tailwind CSS v4 * feat: remove toggleTheme and add auto system theme following - Remove toggleTheme function from ThemeProvider - Add useSystemTheme hook to detect system color scheme - Add auto-following system theme when both light and dark are provided - Add isAutoMode flag to indicate auto-following state - Update example app to use setThemeMode instead of toggleTheme - Maintain backward compatibility with existing theme system * feat: optimize theme persistence logic - only persist when user has theme choice * fix: remove defaultTheme from LunoKitProvider to match ThemeProvider interface * feat(theme): remove localStorage persistence and fix dark theme logic - Remove theme localStorage persistence - Fix dark theme not applying with theme={{dark:{}}} - Simplify theme initialization and switching logic * refactor(ui): standardize design │ │ tokens and remove style duplicates * feat(ui): Modify the rounded property of some components. * refactor(AccountDetailsModal): simplify view transitions to height-only animation * refactor(ui):Optimize code structure, remove unused code * feat(theme): enhance theme system with auto-mode and user preferences - Add autoMode support for system theme following - Implement localStorage persistence for user choices - Add setThemeChoice API for explicit user actions - Remove unused dependencies (postcss-import) - Clean up redundant size props and methods - Fix hook functionality and simplify API - Improve theme initialization priority logic * refactor(ui): replace localStorage with config.storage in theme system * refactor(theme): optimize theme system and eliminate flashing - Extract CSS variable injection logic to separate file (cssVariableInject.ts) - Optimize initial theme state calculation to prevent flashing - Simplify theme preference interface (isAuto, preferredTheme) - Fix system theme detection with proper initialization - Remove redundant state management and async loading * refactor(theme): replace LunoStorage with localStorage for theme persistence * feat(examples): Remove auto mode label --------- Co-authored-by: “Gintma” * fix bug in walletconnect * fix(core): fix disconnect of walletconnectConnector * fix(ui): fix openConnectModal & refresh qrcode in ConnectModal * Chore/UI work (#25) * fix(ui): resolve Radix UI Dialog TypeScript errors - Add proper type interfaces for Dialog components - Fix ModalContext missing closeConnectModal method - Handle @tanstack/react-query v5 API changes - Use React.createElement to bypass Radix UI type restrictions * feat(ui): add new theme system with light/dark presets and CSS variables * fix: resolve chain modal issues and optimize theme system * feat: save current theme system state before refactoring * fix: resolve UI build issues and restore theme system - Fix base.css theme syntax to use @theme inline with var() instead of theme() - Restore missing dark theme variables (spacing, typography, fonts, radii, blurs) - Update theme context structure and remove defaultTheme.ts - Update LunoKitProvider to use new theme system - Fix PostCSS configuration for Tailwind CSS v4 * feat: remove toggleTheme and add auto system theme following - Remove toggleTheme function from ThemeProvider - Add useSystemTheme hook to detect system color scheme - Add auto-following system theme when both light and dark are provided - Add isAutoMode flag to indicate auto-following state - Update example app to use setThemeMode instead of toggleTheme - Maintain backward compatibility with existing theme system * feat: optimize theme persistence logic - only persist when user has theme choice * fix: remove defaultTheme from LunoKitProvider to match ThemeProvider interface * feat(theme): remove localStorage persistence and fix dark theme logic - Remove theme localStorage persistence - Fix dark theme not applying with theme={{dark:{}}} - Simplify theme initialization and switching logic * refactor(ui): standardize design │ │ tokens and remove style duplicates * feat(ui): Modify the rounded property of some components. * refactor(AccountDetailsModal): simplify view transitions to height-only animation * refactor(ui):Optimize code structure, remove unused code * feat(theme): enhance theme system with auto-mode and user preferences - Add autoMode support for system theme following - Implement localStorage persistence for user choices - Add setThemeChoice API for explicit user actions - Remove unused dependencies (postcss-import) - Clean up redundant size props and methods - Fix hook functionality and simplify API - Improve theme initialization priority logic * refactor(ui): replace localStorage with config.storage in theme system * refactor(theme): optimize theme system and eliminate flashing - Extract CSS variable injection logic to separate file (cssVariableInject.ts) - Optimize initial theme state calculation to prevent flashing - Simplify theme preference interface (isAuto, preferredTheme) - Fix system theme detection with proper initialization - Remove redundant state management and async loading * refactor(theme): replace LunoStorage with localStorage for theme persistence * feat(examples): Remove auto mode label * feat: implement QR code skeleton loading state --------- Co-authored-by: “Gintma” * Chore/ci cd readme (#27) * chore: update README and fix GitHub Actions * chore: update working-directory for pnpm audit --------- Co-authored-by: Gintma * Feat/mobile UI (#28) * feat(core): In novaConnector, add support for novaMobileConnector * feat(ui): Add "useWindowSize", optimize responsive design * feat(core): add links field with browserExtension & deepLink and add test code * feat(ui): enhance CSS styles with mobile responsiveness --------- Co-authored-by: Gintma * fix(ui): fix view switching logic in ConnectModal component (#30) * Fix/connect modal (#32) * Develop (#29) * update README and fix GitHub Actions * Chore/UI work (#24) * fix(ui): resolve Radix UI Dialog TypeScript errors - Add proper type interfaces for Dialog components - Fix ModalContext missing closeConnectModal method - Handle @tanstack/react-query v5 API changes - Use React.createElement to bypass Radix UI type restrictions * feat(ui): add new theme system with light/dark presets and CSS variables * fix: resolve chain modal issues and optimize theme system * feat: save current theme system state before refactoring * fix: resolve UI build issues and restore theme system - Fix base.css theme syntax to use @theme inline with var() instead of theme() - Restore missing dark theme variables (spacing, typography, fonts, radii, blurs) - Update theme context structure and remove defaultTheme.ts - Update LunoKitProvider to use new theme system - Fix PostCSS configuration for Tailwind CSS v4 * feat: remove toggleTheme and add auto system theme following - Remove toggleTheme function from ThemeProvider - Add useSystemTheme hook to detect system color scheme - Add auto-following system theme when both light and dark are provided - Add isAutoMode flag to indicate auto-following state - Update example app to use setThemeMode instead of toggleTheme - Maintain backward compatibility with existing theme system * feat: optimize theme persistence logic - only persist when user has theme choice * fix: remove defaultTheme from LunoKitProvider to match ThemeProvider interface * feat(theme): remove localStorage persistence and fix dark theme logic - Remove theme localStorage persistence - Fix dark theme not applying with theme={{dark:{}}} - Simplify theme initialization and switching logic * refactor(ui): standardize design │ │ tokens and remove style duplicates * feat(ui): Modify the rounded property of some components. * refactor(AccountDetailsModal): simplify view transitions to height-only animation * refactor(ui):Optimize code structure, remove unused code * feat(theme): enhance theme system with auto-mode and user preferences - Add autoMode support for system theme following - Implement localStorage persistence for user choices - Add setThemeChoice API for explicit user actions - Remove unused dependencies (postcss-import) - Clean up redundant size props and methods - Fix hook functionality and simplify API - Improve theme initialization priority logic * refactor(ui): replace localStorage with config.storage in theme system * refactor(theme): optimize theme system and eliminate flashing - Extract CSS variable injection logic to separate file (cssVariableInject.ts) - Optimize initial theme state calculation to prevent flashing - Simplify theme preference interface (isAuto, preferredTheme) - Fix system theme detection with proper initialization - Remove redundant state management and async loading * refactor(theme): replace LunoStorage with localStorage for theme persistence * feat(examples): Remove auto mode label --------- Co-authored-by: “Gintma” * fix bug in walletconnect * fix(core): fix disconnect of walletconnectConnector * fix(ui): fix openConnectModal & refresh qrcode in ConnectModal * Chore/UI work (#25) * fix(ui): resolve Radix UI Dialog TypeScript errors - Add proper type interfaces for Dialog components - Fix ModalContext missing closeConnectModal method - Handle @tanstack/react-query v5 API changes - Use React.createElement to bypass Radix UI type restrictions * feat(ui): add new theme system with light/dark presets and CSS variables * fix: resolve chain modal issues and optimize theme system * feat: save current theme system state before refactoring * fix: resolve UI build issues and restore theme system - Fix base.css theme syntax to use @theme inline with var() instead of theme() - Restore missing dark theme variables (spacing, typography, fonts, radii, blurs) - Update theme context structure and remove defaultTheme.ts - Update LunoKitProvider to use new theme system - Fix PostCSS configuration for Tailwind CSS v4 * feat: remove toggleTheme and add auto system theme following - Remove toggleTheme function from ThemeProvider - Add useSystemTheme hook to detect system color scheme - Add auto-following system theme when both light and dark are provided - Add isAutoMode flag to indicate auto-following state - Update example app to use setThemeMode instead of toggleTheme - Maintain backward compatibility with existing theme system * feat: optimize theme persistence logic - only persist when user has theme choice * fix: remove defaultTheme from LunoKitProvider to match ThemeProvider interface * feat(theme): remove localStorage persistence and fix dark theme logic - Remove theme localStorage persistence - Fix dark theme not applying with theme={{dark:{}}} - Simplify theme initialization and switching logic * refactor(ui): standardize design │ │ tokens and remove style duplicates * feat(ui): Modify the rounded property of some components. * refactor(AccountDetailsModal): simplify view transitions to height-only animation * refactor(ui):Optimize code structure, remove unused code * feat(theme): enhance theme system with auto-mode and user preferences - Add autoMode support for system theme following - Implement localStorage persistence for user choices - Add setThemeChoice API for explicit user actions - Remove unused dependencies (postcss-import) - Clean up redundant size props and methods - Fix hook functionality and simplify API - Improve theme initialization priority logic * refactor(ui): replace localStorage with config.storage in theme system * refactor(theme): optimize theme system and eliminate flashing - Extract CSS variable injection logic to separate file (cssVariableInject.ts) - Optimize initial theme state calculation to prevent flashing - Simplify theme preference interface (isAuto, preferredTheme) - Fix system theme detection with proper initialization - Remove redundant state management and async loading * refactor(theme): replace LunoStorage with localStorage for theme persistence * feat(examples): Remove auto mode label * feat: implement QR code skeleton loading state --------- Co-authored-by: “Gintma” * Chore/ci cd readme (#27) * chore: update README and fix GitHub Actions * chore: update working-directory for pnpm audit --------- Co-authored-by: Gintma * Feat/mobile UI (#28) * feat(core): In novaConnector, add support for novaMobileConnector * feat(ui): Add "useWindowSize", optimize responsive design * feat(core): add links field with browserExtension & deepLink and add test code * feat(ui): enhance CSS styles with mobile responsiveness --------- Co-authored-by: Gintma --------- Co-authored-by: “Gintma” * fix(ui): fix view switching logic in ConnectModal component --------- Co-authored-by: “Gintma” * fix(with-vite): fix undifined of Notification * fix(ui): fix view switching logic in ConnectModal component * fix(with-vite): fix undifined of Notification * fix(with-vite): Fix the reference of the Notification object to ensure that it is accessed through the window object when used. * fix(ui): fix view switching logic in ConnectModal component * fix(with-vite): fix undifined of Notification * fix(with-vite): Fix the reference of the Notification object to ensure that it is accessed through the window object when used. * fix(ui): fix connect in mobile * fix(ui): fix view switching logic in ConnectModal component * fix(with-vite): fix undifined of Notification * fix(with-vite): Fix the reference of the Notification object to ensure that it is accessed through the window object when used. * fix(ui): fix connect in mobile * Fix/create api (#39) * feat(react): migrate from DedotClient to LegacyClient * fix(ui): fix theme type definitions and improve prop interface * fix(ui): fix css style in ConnectButton * feat(core): add browser download link in novaConnector * feat(ui): fix ConnectModal responsive view switching and enhance WalletView QR code features * Fix/create api (#40) * feat(react): migrate from DedotClient to LegacyClient * fix(ui): fix theme type definitions and improve prop interface * fix(ui): fix css style in ConnectButton * feat(core): add browser download link in novaConnector * feat(ui): fix ConnectModal responsive view switching and enhance WalletView QR code features * feat(core): add injectorId support to CommonConnector for custom injector identification * Fix/create api (#42) * feat(react): migrate from DedotClient to LegacyClient * fix(ui): fix theme type definitions and improve prop interface * fix(ui): fix css style in ConnectButton * feat(core): add browser download link in novaConnector * feat(ui): fix ConnectModal responsive view switching and enhance WalletView QR code features * feat(core): add injectorId support to CommonConnector for custom injector identification * fix(react): add disconnect logic when account address is missing on account change * fix(ui): fix error and loading states in WalletView component * Chore/ci cd readme (#43) * chore: update README and fix GitHub Actions * chore: update working-directory for pnpm audit * chore: add release action --------- Co-authored-by: Gintma * Fix/create api (#56) * feat(react): migrate from DedotClient to LegacyClient * fix(ui): fix theme type definitions and improve prop interface * fix(ui): fix css style in ConnectButton * feat(core): add browser download link in novaConnector * feat(ui): fix ConnectModal responsive view switching and enhance WalletView QR code features * feat(core): add injectorId support to CommonConnector for custom injector identification * fix(react): add disconnect logic when account address is missing on account change * fix(ui): fix error and loading states in WalletView component * feat(with-vite): add .env.local.example * feat(example): Add environment variable example file and update connectors to use from environment variables (#61) --------- Co-authored-by: “Gintma” * fix(chore): Update signMessage method to support optional chainId parameter * Develop (#65) * update README and fix GitHub Actions * Chore/UI work (#24) * fix(ui): resolve Radix UI Dialog TypeScript errors - Add proper type interfaces for Dialog components - Fix ModalContext missing closeConnectModal method - Handle @tanstack/react-query v5 API changes - Use React.createElement to bypass Radix UI type restrictions * feat(ui): add new theme system with light/dark presets and CSS variables * fix: resolve chain modal issues and optimize theme system * feat: save current theme system state before refactoring * fix: resolve UI build issues and restore theme system - Fix base.css theme syntax to use @theme inline with var() instead of theme() - Restore missing dark theme variables (spacing, typography, fonts, radii, blurs) - Update theme context structure and remove defaultTheme.ts - Update LunoKitProvider to use new theme system - Fix PostCSS configuration for Tailwind CSS v4 * feat: remove toggleTheme and add auto system theme following - Remove toggleTheme function from ThemeProvider - Add useSystemTheme hook to detect system color scheme - Add auto-following system theme when both light and dark are provided - Add isAutoMode flag to indicate auto-following state - Update example app to use setThemeMode instead of toggleTheme - Maintain backward compatibility with existing theme system * feat: optimize theme persistence logic - only persist when user has theme choice * fix: remove defaultTheme from LunoKitProvider to match ThemeProvider interface * feat(theme): remove localStorage persistence and fix dark theme logic - Remove theme localStorage persistence - Fix dark theme not applying with theme={{dark:{}}} - Simplify theme initialization and switching logic * refactor(ui): standardize design │ │ tokens and remove style duplicates * feat(ui): Modify the rounded property of some components. * refactor(AccountDetailsModal): simplify view transitions to height-only animation * refactor(ui):Optimize code structure, remove unused code * feat(theme): enhance theme system with auto-mode and user preferences - Add autoMode support for system theme following - Implement localStorage persistence for user choices - Add setThemeChoice API for explicit user actions - Remove unused dependencies (postcss-import) - Clean up redundant size props and methods - Fix hook functionality and simplify API - Improve theme initialization priority logic * refactor(ui): replace localStorage with config.storage in theme system * refactor(theme): optimize theme system and eliminate flashing - Extract CSS variable injection logic to separate file (cssVariableInject.ts) - Optimize initial theme state calculation to prevent flashing - Simplify theme preference interface (isAuto, preferredTheme) - Fix system theme detection with proper initialization - Remove redundant state management and async loading * refactor(theme): replace LunoStorage with localStorage for theme persistence * feat(examples): Remove auto mode label --------- Co-authored-by: “Gintma” * fix bug in walletconnect * fix(core): fix disconnect of walletconnectConnector * fix(ui): fix openConnectModal & refresh qrcode in ConnectModal * Chore/UI work (#25) * fix(ui): resolve Radix UI Dialog TypeScript errors - Add proper type interfaces for Dialog components - Fix ModalContext missing closeConnectModal method - Handle @tanstack/react-query v5 API changes - Use React.createElement to bypass Radix UI type restrictions * feat(ui): add new theme system with light/dark presets and CSS variables * fix: resolve chain modal issues and optimize theme system * feat: save current theme system state before refactoring * fix: resolve UI build issues and restore theme system - Fix base.css theme syntax to use @theme inline with var() instead of theme() - Restore missing dark theme variables (spacing, typography, fonts, radii, blurs) - Update theme context structure and remove defaultTheme.ts - Update LunoKitProvider to use new theme system - Fix PostCSS configuration for Tailwind CSS v4 * feat: remove toggleTheme and add auto system theme following - Remove toggleTheme function from ThemeProvider - Add useSystemTheme hook to detect system color scheme - Add auto-following system theme when both light and dark are provided - Add isAutoMode flag to indicate auto-following state - Update example app to use setThemeMode instead of toggleTheme - Maintain backward compatibility with existing theme system * feat: optimize theme persistence logic - only persist when user has theme choice * fix: remove defaultTheme from LunoKitProvider to match ThemeProvider interface * feat(theme): remove localStorage persistence and fix dark theme logic - Remove theme localStorage persistence - Fix dark theme not applying with theme={{dark:{}}} - Simplify theme initialization and switching logic * refactor(ui): standardize design │ │ tokens and remove style duplicates * feat(ui): Modify the rounded property of some components. * refactor(AccountDetailsModal): simplify view transitions to height-only animation * refactor(ui):Optimize code structure, remove unused code * feat(theme): enhance theme system with auto-mode and user preferences - Add autoMode support for system theme following - Implement localStorage persistence for user choices - Add setThemeChoice API for explicit user actions - Remove unused dependencies (postcss-import) - Clean up redundant size props and methods - Fix hook functionality and simplify API - Improve theme initialization priority logic * refactor(ui): replace localStorage with config.storage in theme system * refactor(theme): optimize theme system and eliminate flashing - Extract CSS variable injection logic to separate file (cssVariableInject.ts) - Optimize initial theme state calculation to prevent flashing - Simplify theme preference interface (isAuto, preferredTheme) - Fix system theme detection with proper initialization - Remove redundant state management and async loading * refactor(theme): replace LunoStorage with localStorage for theme persistence * feat(examples): Remove auto mode label * feat: implement QR code skeleton loading state --------- Co-authored-by: “Gintma” * Chore/ci cd readme (#27) * chore: update README and fix GitHub Actions * chore: update working-directory for pnpm audit --------- Co-authored-by: Gintma * Feat/mobile UI (#28) * feat(core): In novaConnector, add support for novaMobileConnector * feat(ui): Add "useWindowSize", optimize responsive design * feat(core): add links field with browserExtension & deepLink and add test code * feat(ui): enhance CSS styles with mobile responsiveness --------- Co-authored-by: Gintma * fix(ui): fix view switching logic in ConnectModal component (#30) * Fix/connect modal (#32) * Develop (#29) * update README and fix GitHub Actions * Chore/UI work (#24) * fix(ui): resolve Radix UI Dialog TypeScript errors - Add proper type interfaces for Dialog components - Fix ModalContext missing closeConnectModal method - Handle @tanstack/react-query v5 API changes - Use React.createElement to bypass Radix UI type restrictions * feat(ui): add new theme system with light/dark presets and CSS variables * fix: resolve chain modal issues and optimize theme system * feat: save current theme system state before refactoring * fix: resolve UI build issues and restore theme system - Fix base.css theme syntax to use @theme inline with var() instead of theme() - Restore missing dark theme variables (spacing, typography, fonts, radii, blurs) - Update theme context structure and remove defaultTheme.ts - Update LunoKitProvider to use new theme system - Fix PostCSS configuration for Tailwind CSS v4 * feat: remove toggleTheme and add auto system theme following - Remove toggleTheme function from ThemeProvider - Add useSystemTheme hook to detect system color scheme - Add auto-following system theme when both light and dark are provided - Add isAutoMode flag to indicate auto-following state - Update example app to use setThemeMode instead of toggleTheme - Maintain backward compatibility with existing theme system * feat: optimize theme persistence logic - only persist when user has theme choice * fix: remove defaultTheme from LunoKitProvider to match ThemeProvider interface * feat(theme): remove localStorage persistence and fix dark theme logic - Remove theme localStorage persistence - Fix dark theme not applying with theme={{dark:{}}} - Simplify theme initialization and switching logic * refactor(ui): standardize design │ │ tokens and remove style duplicates * feat(ui): Modify the rounded property of some components. * refactor(AccountDetailsModal): simplify view transitions to height-only animation * refactor(ui):Optimize code structure, remove unused code * feat(theme): enhance theme system with auto-mode and user preferences - Add autoMode support for system theme following - Implement localStorage persistence for user choices - Add setThemeChoice API for explicit user actions - Remove unused dependencies (postcss-import) - Clean up redundant size props and methods - Fix hook functionality and simplify API - Improve theme initialization priority logic * refactor(ui): replace localStorage with config.storage in theme system * refactor(theme): optimize theme system and eliminate flashing - Extract CSS variable injection logic to separate file (cssVariableInject.ts) - Optimize initial theme state calculation to prevent flashing - Simplify theme preference interface (isAuto, preferredTheme) - Fix system theme detection with proper initialization - Remove redundant state management and async loading * refactor(theme): replace LunoStorage with localStorage for theme persistence * feat(examples): Remove auto mode label --------- Co-authored-by: “Gintma” * fix bug in walletconnect * fix(core): fix disconnect of walletconnectConnector * fix(ui): fix openConnectModal & refresh qrcode in ConnectModal * Chore/UI work (#25) * fix(ui): resolve Radix UI Dialog TypeScript errors - Add proper type interfaces for Dialog components - Fix ModalContext missing closeConnectModal method - Handle @tanstack/react-query v5 API changes - Use React.createElement to bypass Radix UI type restrictions * feat(ui): add new theme system with light/dark presets and CSS variables * fix: resolve chain modal issues and optimize theme system * feat: save current theme system state before refactoring * fix: resolve UI build issues and restore theme system - Fix base.css theme syntax to use @theme inline with var() instead of theme() - Restore missing dark theme variables (spacing, typography, fonts, radii, blurs) - Update theme context structure and remove defaultTheme.ts - Update LunoKitProvider to use new theme system - Fix PostCSS configuration for Tailwind CSS v4 * feat: remove toggleTheme and add auto system theme following - Remove toggleTheme function from ThemeProvider - Add useSystemTheme hook to detect system color scheme - Add auto-following system theme when both light and dark are provided - Add isAutoMode flag to indicate auto-following state - Update example app to use setThemeMode instead of toggleTheme - Maintain backward compatibility with existing theme system * feat: optimize theme persistence logic - only persist when user has theme choice * fix: remove defaultTheme from LunoKitProvider to match ThemeProvider interface * feat(theme): remove localStorage persistence and fix dark theme logic - Remove theme localStorage persistence - Fix dark theme not applying with theme={{dark:{}}} - Simplify theme initialization and switching logic * refactor(ui): standardize design │ │ tokens and remove style duplicates * feat(ui): Modify the rounded property of some components. * refactor(AccountDetailsModal): simplify view transitions to height-only animation * refactor(ui):Optimize code structure, remove unused code * feat(theme): enhance theme system with auto-mode and user preferences - Add autoMode support for system theme following - Implement localStorage persistence for user choices - Add setThemeChoice API for explicit user actions - Remove unused dependencies (postcss-import) - Clean up redundant size props and methods - Fix hook functionality and simplify API - Improve theme initialization priority logic * refactor(ui): replace localStorage with config.storage in theme system * refactor(theme): optimize theme system and eliminate flashing - Extract CSS variable injection logic to separate file (cssVariableInject.ts) - Optimize initial theme state calculation to prevent flashing - Simplify theme preference interface (isAuto, preferredTheme) - Fix system theme detection with proper initialization - Remove redundant state management and async loading * refactor(theme): replace LunoStorage with localStorage for theme persistence * feat(examples): Remove auto mode label * feat: implement QR code skeleton loading state --------- Co-authored-by: “Gintma” * Chore/ci cd readme (#27) * chore: update README and fix GitHub Actions * chore: update working-directory for pnpm audit --------- Co-authored-by: Gintma * Feat/mobile UI (#28) * feat(core): In novaConnector, add support for novaMobileConnector * feat(ui): Add "useWindowSize", optimize responsive design * feat(core): add links field with browserExtension & deepLink and add test code * feat(ui): enhance CSS styles with mobile responsiveness --------- Co-authored-by: Gintma --------- Co-authored-by: “Gintma” * fix(ui): fix view switching logic in ConnectModal component --------- Co-authored-by: “Gintma” * fix(with-vite): fix undifined of Notification * fix(ui): fix view switching logic in ConnectModal component * fix(with-vite): fix undifined of Notification * fix(with-vite): Fix the reference of the Notification object to ensure that it is accessed through the window object when used. * fix(ui): fix view switching logic in ConnectModal component * fix(with-vite): fix undifined of Notification * fix(with-vite): Fix the reference of the Notification object to ensure that it is accessed through the window object when used. * fix(ui): fix connect in mobile * fix(ui): fix view switching logic in ConnectModal component * fix(with-vite): fix undifined of Notification * fix(with-vite): Fix the reference of the Notification object to ensure that it is accessed through the window object when used. * fix(ui): fix connect in mobile * Fix/create api (#39) * feat(react): migrate from DedotClient to LegacyClient * fix(ui): fix theme type definitions and improve prop interface * fix(ui): fix css style in ConnectButton * feat(core): add browser download link in novaConnector * feat(ui): fix ConnectModal responsive view switching and enhance WalletView QR code features * Fix/create api (#40) * feat(react): migrate from DedotClient to LegacyClient * fix(ui): fix theme type definitions and improve prop interface * fix(ui): fix css style in ConnectButton * feat(core): add browser download link in novaConnector * feat(ui): fix ConnectModal responsive view switching and enhance WalletView QR code features * feat(core): add injectorId support to CommonConnector for custom injector identification * Fix/create api (#42) * feat(react): migrate from DedotClient to LegacyClient * fix(ui): fix theme type definitions and improve prop interface * fix(ui): fix css style in ConnectButton * feat(core): add browser download link in novaConnector * feat(ui): fix ConnectModal responsive view switching and enhance WalletView QR code features * feat(core): add injectorId support to CommonConnector for custom injector identification * fix(react): add disconnect logic when account address is missing on account change * fix(ui): fix error and loading states in WalletView component * Chore/ci cd readme (#43) * chore: update README and fix GitHub Actions * chore: update working-directory for pnpm audit * chore: add release action --------- Co-authored-by: Gintma * Fix/create api (#56) * feat(react): migrate from DedotClient to LegacyClient * fix(ui): fix theme type definitions and improve prop interface * fix(ui): fix css style in ConnectButton * feat(core): add browser download link in novaConnector * feat(ui): fix ConnectModal responsive view switching and enhance WalletView QR code features * feat(core): add injectorId support to CommonConnector for custom injector identification * fix(react): add disconnect logic when account address is missing on account change * fix(ui): fix error and loading states in WalletView component * feat(with-vite): add .env.local.example * feat(example): Add environment variable example file and update connectors to use from environment variables (#61) * Chore/UI work (#63) * fix(ui): resolve Radix UI Dialog TypeScript errors - Add proper type interfaces for Dialog components - Fix ModalContext missing closeConnectModal method - Handle @tanstack/react-query v5 API changes - Use React.createElement to bypass Radix UI type restrictions * feat(ui): add new theme system with light/dark presets and CSS variables * fix: resolve chain modal issues and optimize theme system * feat: save current theme system state before refactoring * fix: resolve UI build issues and restore theme system - Fix base.css theme syntax to use @theme inline with var() instead of theme() - Restore missing dark theme variables (spacing, typography, fonts, radii, blurs) - Update theme context structure and remove defaultTheme.ts - Update LunoKitProvider to use new theme system - Fix PostCSS configuration for Tailwind CSS v4 * feat: remove toggleTheme and add auto system theme following - Remove toggleTheme function from ThemeProvider - Add useSystemTheme hook to detect system color scheme - Add auto-following system theme when both light and dark are provided - Add isAutoMode flag to indicate auto-following state - Update example app to use setThemeMode instead of toggleTheme - Maintain backward compatibility with existing theme system * feat: optimize theme persistence logic - only persist when user has theme choice * fix: remove defaultTheme from LunoKitProvider to match ThemeProvider interface * feat(theme): remove localStorage persistence and fix dark theme logic - Remove theme localStorage persistence - Fix dark theme not applying with theme={{dark:{}}} - Simplify theme initialization and switching logic * refactor(ui): standardize design │ │ tokens and remove style duplicates * feat(ui): Modify the rounded property of some components. * refactor(AccountDetailsModal): simplify view transitions to height-only animation * refactor(ui):Optimize code structure, remove unused code * feat(theme): enhance theme system with auto-mode and user preferences - Add autoMode support for system theme following - Implement localStorage persistence for user choices - Add setThemeChoice API for explicit user actions - Remove unused dependencies (postcss-import) - Clean up redundant size props and methods - Fix hook functionality and simplify API - Improve theme initialization priority logic * refactor(ui): replace localStorage with config.storage in theme system * refactor(theme): optimize theme system and eliminate flashing - Extract CSS variable injection logic to separate file (cssVariableInject.ts) - Optimize initial theme state calculation to prevent flashing - Simplify theme preference interface (isAuto, preferredTheme) - Fix system theme detection with proper initialization - Remove redundant state management and async loading * refactor(theme): replace LunoStorage with localStorage for theme persistence * feat(examples): Remove auto mode label * feat: implement QR code skeleton loading state * feat(core): In novaConnector, add support for novaMobileConnector * feat(ui): Add "useWindowSize", optimize responsive design * feat(core): add links field with browserExtension & deepLink and add test code * feat(ui): enhance CSS styles with mobile responsiveness * feat(ui): enhance modal layouts and improve visual consistency * feat(ui): improve connect modal layout and wallet organization * feat: enhance modal UI and fix animations- Add modal border and improve title centering - Fix close animation flicker - Add chain status indicator - Clean up unused CSS variables - Adjust spacing and padding consistency * feat: improve modal UX and fix build issues UI: - Add border to dialog modal - Center title in compact mode - Add chain status indicator dot - Adjust item padding and spacing Fix: - Modal close animation flicker - CSS syntax error (extra semicolon) - Remove unused cutLine variable * feat: replace Loading component with modern CSS animation - Replace SVG Loading with CSS mask animation - Remove unused Loading.tsx file and exports - Use Tailwind sizing classes - Improve performance and reduce bundle size * style: refine shadows and remove test styles - Remove test background color from AccountItem - Fix Dialog shadow class name - Adjust shadow values for better visual hierarchy - Update modal backdrop opacity for improved contrast * fix: remove useless code * fix(chore): fix test of walletconnect --------- Co-authored-by: “Gintma” * fix(chore): Update signMessage method to support optional chainId parameter (#64) --------- Co-authored-by: “Gintma” * feat(ui): Simplify font definitions, keeping only the body field * feat(ui): export hooks of modals * fix(react): fix subscribe in useSubscription * feat(react): Add sleep utility function and add connect delay in useConnect * feat(core): update WalletConnectConnector, add session subscription and cleanup logic * chore: update build config * fix(core): fix test of novaMobileConnector --------- Co-authored-by: “Gintma” * Chore/UI work (#70) * fix(ui): resolve Radix UI Dialog TypeScript errors - Add proper type interfaces for Dialog components - Fix ModalContext missing closeConnectModal method - Handle @tanstack/react-query v5 API changes - Use React.createElement to bypass Radix UI type restrictions * feat(ui): add new theme system with light/dark presets and CSS variables * fix: resolve chain modal issues and optimize theme system * feat: save current theme system state before refactoring * fix: resolve UI build issues and restore theme system - Fix base.css theme syntax to use @theme inline with var() instead of theme() - Restore missing dark theme variables (spacing, typography, fonts, radii, blurs) - Update theme context structure and remove defaultTheme.ts - Update LunoKitProvider to use new theme system - Fix PostCSS configuration for Tailwind CSS v4 * feat: remove toggleTheme and add auto system theme following - Remove toggleTheme function from ThemeProvider - Add useSystemTheme hook to detect system color scheme - Add auto-following system theme when both light and dark are provided - Add isAutoMode flag to indicate auto-following state - Update example app to use setThemeMode instead of toggleTheme - Maintain backward compatibility with existing theme system * feat: optimize theme persistence logic - only persist when user has theme choice * fix: remove defaultTheme from LunoKitProvider to match ThemeProvider interface * feat(theme): remove localStorage persistence and fix dark theme logic - Remove theme localStorage persistence - Fix dark theme not applying with theme={{dark:{}}} - Simplify theme initialization and switching logic * refactor(ui): standardize design │ │ tokens and remove style duplicates * feat(ui): Modify the rounded property of some components. * refactor(AccountDetailsModal): simplify view transitions to height-only animation * refactor(ui):Optimize code structure, remove unused code * feat(theme): enhance theme system with auto-mode and user preferences - Add autoMode support for system theme following - Implement localStorage persistence for user choices - Add setThemeChoice API for explicit user actions - Remove unused dependencies (postcss-import) - Clean up redundant size props and methods - Fix hook functionality and simplify API - Improve theme initialization priority logic * refactor(ui): replace localStorage with config.storage in theme system * refactor(theme): optimize theme system and eliminate flashing - Extract CSS variable injection logic to separate file (cssVariableInject.ts) - Optimize initial theme state calculation to prevent flashing - Simplify theme preference interface (isAuto, preferredTheme) - Fix system theme detection with proper initialization - Remove redundant state management and async loading * refactor(theme): replace LunoStorage with localStorage for theme persistence * feat(examples): Remove auto mode label * feat: implement QR code skeleton loading state * feat(core): In novaConnector, add support for novaMobileConnector * feat(ui): Add "useWindowSize", optimize responsive design * feat(core): add links field with browserExtension & deepLink and add test code * feat(ui): enhance CSS styles with mobile responsiveness * feat(ui): enhance modal layouts and improve visual consistency * feat(ui): improve connect modal layout and wallet organization * feat: enhance modal UI and fix animations- Add modal border and improve title centering - Fix close animation flicker - Add chain status indicator - Clean up unused CSS variables - Adjust spacing and padding consistency * feat: improve modal UX and fix build issues UI: - Add border to dialog modal - Center title in compact mode - Add chain status indicator dot - Adjust item padding and spacing Fix: - Modal close animation flicker - CSS syntax error (extra semicolon) - Remove unused cutLine variable * feat: replace Loading component with modern CSS animation - Replace SVG Loading with CSS mask animation - Remove unused Loading.tsx file and exports - Use Tailwind sizing classes - Improve performance and reduce bundle size * style: refine shadows and remove test styles - Remove test background color from AccountItem - Fix Dialog shadow class name - Adjust shadow values for better visual hierarchy - Update modal backdrop opacity for improved contrast * fix: remove useless code * fix(chore): fix test of walletconnect * refine(ui): refine ConnectModal text --------- Co-authored-by: “Gintma” * feat(ui): update ui of ChainIcon (#71) * Fix/css scope (#72) * feat(ui): update ui of ChainIcon * fix(ui): fix font type in theme * fix(with-vite): remove useless code (#75) * docs:update README * Chore/readme ci (#80) * chore: update README * chore: simplify README & add dependabot.yml * Chore/readme ci (#82) * chore: update README * chore: simplify README & add dependabot.yml * chore: fix dependabot.yml * Feat/chain search (#85) * feat(core): add multiple chain information and related icons, refactor module export patterns * feat(react): refactor module export patterns, update core import patterns * feat(ui): update react module import patterns * feat(ui): add chain search input in chainModal * fix(core): fix the token name in the chain object * feat(example): update import patterns for connectors and chains * fix: fix import in test file * fix(react): fix type in useSigner * Feat/add connectors (#86) * feat(core): add connector of fealess * fix(ui): fix icon in ConnectButton * feat: add connector of mimir * fix(ui): fix scroll in ConnectOptions * feat: add connector of enkrypt * feat(ui): Optimize the UI of the AccountDetailsModal and add the displayPreference field to the ConnectButton * refactor(core): rename CommonConnector -> InjectConnector * fix(ui): fix ui * fix(core): fix name in connector * fix(react): add sleep in autoconnect * fix(core): update logo of connectors * fix: fix test code * Feat/add connectors (#87) * feat(core): add connector of fealess * fix(ui): fix icon in ConnectButton * feat: add connector of mimir * fix(ui): fix scroll in ConnectOptions * feat: add connector of enkrypt * feat(ui): Optimize the UI of the AccountDetailsModal and add the displayPreference field to the ConnectButton * refactor(core): rename CommonConnector -> InjectConnector * fix(ui): fix ui * fix(core): fix name in connector * fix(react): add sleep in autoconnect * fix(core): update logo of connectors * fix: fix test code * fix(ui): fix ui of name width * fix(ui): remove filter of chains in ChainModal * feat: add test ConnectButton * feat(core): add connector of ledger * feat: Adjust the borderRadius of the connector icon and add the ledger connector to the example. * fix(ui): add whitespace-nowrap in display name * fix(ui): fix style * fix(ui): fix style of account name * feat(core): remove export ledgerConnector * fix(core): fix disconnect in walletconnect * feat(ui): add connectorGroup * fix(core): fix novaConnector * Feat/add connectors (#89) * feat(core): add connector of fealess * fix(ui): fix icon in ConnectButton * feat: add connector of mimir * fix(ui): fix scroll in ConnectOptions * feat: add connector of enkrypt * feat(ui): Optimize the UI of the AccountDetailsModal and add the displayPreference field to the ConnectButton * refactor(core): rename CommonConnector -> InjectConnector * fix(ui): fix ui * fix(core): fix name in connector * fix(react): add sleep in autoconnect * fix(core): update logo of connectors * fix: fix test code * fix(ui): fix ui of name width * fix(ui): remove filter of chains in ChainModal * feat: add test ConnectButton * feat(core): add connector of ledger * feat: Adjust the borderRadius of the connector icon and add the ledger connector to the example. * fix(ui): add whitespace-nowrap in display name * fix(ui): fix style * fix(ui): fix style of account name * feat(core): remove export ledgerConnector * fix(core): fix disconnect in walletconnect * feat(ui): add connectorGroup * fix(core): fix novaConnector * feat: add hover effect to Copy component * fix(ui): fix height of ChainList --------- Co-authored-by: “Gintma” * Chore/UI work (#91) * feat: add hover effect to Copy component * add search icon and improve loading states in ChainList --------- Co-authored-by: WBH <48749219+wbh1328551759@users.noreply.github.com> * Fix/readme (#94) update readme * Feat/with papi (#97) - Allow users to not configure chains & Add support for Papi - Add 2 hooks: - usePapiSigner: Obtain the signer object used for papi - useEstimatePaymentInfo: Obtain data such as transaction gas amount * Feat/assets list (#112) * feat(core): fix wsProvider & add subscan type * feat(ui): add AssetList * feat(with-vite): add subscan in config * fix(ui): fix default value in useSubscanTokens * Fix/lint (#107) Fix lint error * feat(ui): add recent account storage * chore: update pr-check ci * chore: lint code * feat(core): update subscan URLs and add API endpoints for Kusama, Paseo, Polkadot, and Westend * feat(ui): enhance AssetList with TokenList and NFTList components * feat(ui): remove test code * feat(ui): update text * feat(ui): update loading of Icon & add EmptyAsset status * fix: fix lint * Optimize the style of the token list and NFT list * feat(ui): add DefaultNFT icon & add new css variable of assetSelectItem * chore: fix lint * feat(ui): add refetch in switch assetList * chore: fix lint * chore: remove useless code * feat(ui): Add the prefix of luno to address the issue of CSS scoped * feat(ui): hidden scrollbar * chore(ui): remove useless code * fix: test * Feat/assets list (#113) * feat(core): fix wsProvider & add subscan type * feat(ui): add AssetList * feat(with-vite): add subscan in config * fix(ui): fix default value in useSubscanTokens * Fix/lint (#107) Fix lint error * feat(ui): add recent account storage * chore: update pr-check ci * chore: lint code * feat(core): update subscan URLs and add API endpoints for Kusama, Paseo, Polkadot, and Westend * feat(ui): enhance AssetList with TokenList and NFTList components * feat(ui): remove test code * feat(ui): update text * feat(ui): update loading of Icon & add EmptyAsset status * fix: fix lint * Optimize the style of the token list and NFT list * feat(ui): add DefaultNFT icon & add new css variable of assetSelectItem * chore: fix lint * feat(ui): add refetch in switch assetList * chore: fix lint * chore: remove useless code * feat(ui): Add the prefix of luno to address the issue of CSS scoped * feat(ui): hidden scrollbar * chore(ui): remove useless code * fix: test * fix: lint --------- Co-authored-by: “Gintma” * chore: fix biome files includes fix biome files includes * Feat/assets list (#117) fix bug & update ui * Fix/account changed (#122) Fix bug of account changed event * Feat/app info (#131) 1. add appInfo in config 2. add new connectors: onekey, ledger 3. add params of waitFor in useSendTransaction 4. fix css scope 5. add default value of cacheMetadata 6. add new type of Optional 7. add rawReceipt in useSendTransaction return 8. remove console.log 9. remove QueryClientProvider in LunoKitPrivider 10. add type extension for useApi * release: v0.0.11 --------- Co-authored-by: “Gintma” --- .changeset/odd-eggs-stare.md | 18 + .changeset/pre.json | 2 +- examples/with-cra/src/index.tsx | 11 +- examples/with-nextjs-app/app/providers.tsx | 9 +- examples/with-nextjs-pages/pages/_app.tsx | 11 +- examples/with-vite-papi/src/main.tsx | 11 +- examples/with-vite/src/App.tsx | 151 +++++- examples/with-vite/src/main.tsx | 388 ++++++++------- examples/with-vite/vite.config.ts | 3 + packages/core/package.json | 3 + packages/core/src/config/createConfig.test.ts | 4 +- packages/core/src/config/createConfig.ts | 4 +- packages/core/src/config/createStorage.ts | 2 +- .../core/src/config/logos/generated/index.ts | 1 + .../config/logos/generated/ledgerWallet.ts | 2 +- .../config/logos/generated/onekeyWallet.ts | 7 + .../core/src/config/logos/wallets/ledger.svg | 18 +- .../core/src/config/logos/wallets/onekey.svg | 5 + packages/core/src/connectors/base.ts | 6 +- packages/core/src/connectors/index.ts | 2 + packages/core/src/connectors/inject.ts | 11 +- packages/core/src/connectors/ledger.test.ts | 452 +++++++++++++++++- packages/core/src/connectors/ledger.ts | 258 +++++++++- packages/core/src/connectors/onekey.test.ts | 16 + packages/core/src/connectors/onekey.ts | 14 + packages/core/src/connectors/walletconnect.ts | 12 +- packages/core/src/types/account.ts | 28 +- packages/core/src/types/chain.ts | 14 +- packages/core/src/types/config.ts | 30 +- packages/core/src/types/connector.ts | 22 +- packages/core/src/types/global.d.ts | 2 + packages/core/src/types/index.ts | 1 + packages/core/src/types/utils.ts | 1 + packages/core/src/utils/format.ts | 8 +- packages/react/src/context/LunoContext.ts | 18 +- .../react/src/context/LunoProvider.test.tsx | 32 -- packages/react/src/context/LunoProvider.tsx | 11 +- packages/react/src/hooks/useAccount.ts | 6 +- packages/react/src/hooks/useAccounts.ts | 4 +- packages/react/src/hooks/useApi.ts | 9 +- packages/react/src/hooks/useBalance.ts | 6 +- packages/react/src/hooks/useConnect.ts | 13 +- packages/react/src/hooks/useDisconnect.ts | 10 +- .../react/src/hooks/useEstimatePaymentInfo.ts | 3 +- .../react/src/hooks/useGenesisHash.test.ts | 1 - .../src/hooks/useSendTransaction.test.ts | 110 +++++ .../react/src/hooks/useSendTransaction.ts | 95 ++-- packages/react/src/hooks/useSignMessage.ts | 9 +- packages/react/src/hooks/useSubscription.ts | 7 +- packages/react/src/hooks/useSwitchChain.ts | 10 +- .../react/src/store/createLunoStore.test.ts | 23 +- packages/react/src/store/createLunoStore.ts | 34 +- .../ui/src/components/ConnectButton/index.tsx | 13 +- .../ConnectModal/ConnectOptions.tsx | 6 +- .../components/ConnectModal/WalletView.tsx | 115 ++++- .../ui/src/components/ConnectModal/index.tsx | 103 +++- packages/ui/src/hooks/useConnectButton.ts | 20 +- packages/ui/src/providers/LunoKitProvider.tsx | 66 ++- packages/ui/src/styles/base.css | 2 +- packages/ui/src/theme/context.tsx | 5 +- packages/ui/src/utils/renderAppInfo.tsx | 18 + pnpm-lock.yaml | 398 ++++++++------- 62 files changed, 1923 insertions(+), 751 deletions(-) create mode 100644 .changeset/odd-eggs-stare.md create mode 100644 packages/core/src/config/logos/generated/onekeyWallet.ts create mode 100644 packages/core/src/config/logos/wallets/onekey.svg create mode 100644 packages/core/src/connectors/onekey.test.ts create mode 100644 packages/core/src/connectors/onekey.ts create mode 100644 packages/core/src/types/utils.ts create mode 100644 packages/ui/src/utils/renderAppInfo.tsx diff --git a/.changeset/odd-eggs-stare.md b/.changeset/odd-eggs-stare.md new file mode 100644 index 0000000..d0f6798 --- /dev/null +++ b/.changeset/odd-eggs-stare.md @@ -0,0 +1,18 @@ +--- +"@luno-kit/react": patch +"@luno-kit/core": patch +"@luno-kit/ui": patch +--- + +Fix bugs & Add new connectors + +- Add "appInfo" to LunoKitProvider +- Add new connectors: OneKey and Ledger +- Remove the QueryClientProvider from LunoKitProvider +- The "useSendTransaction" function now includes a "waitFor" parameter, allowing for the customization of whether the transaction is completed at the "inBlock" or "finalized" stage. +- Fix the issue of tailwind base classes overriding each other +- Set default values for cacheMetadata +- To be compatible with exactOptionalPropertyTypes, add the Optional type +- Add the rawReceipt to the return value of useSendTransaction +- Remove console.log +- Add the generic type for useApi diff --git a/.changeset/pre.json b/.changeset/pre.json index c41988a..1f5fb31 100644 --- a/.changeset/pre.json +++ b/.changeset/pre.json @@ -1,5 +1,5 @@ { - "mode": "pre", + "mode": "exit", "tag": "beta", "initialVersions": { "with-cra": "0.1.0", diff --git a/examples/with-cra/src/index.tsx b/examples/with-cra/src/index.tsx index 062fe96..f959f34 100644 --- a/examples/with-cra/src/index.tsx +++ b/examples/with-cra/src/index.tsx @@ -15,6 +15,7 @@ import { LunoKitProvider } from '@luno-kit/ui'; import App from './App'; import reportWebVitals from './reportWebVitals'; import '@luno-kit/ui/styles.css'; +import { QueryClientProvider, QueryClient } from '@tanstack/react-query' const connectors = [ polkadotjsConnector(), @@ -32,12 +33,16 @@ const lunoConfig = createConfig({ autoConnect: true, }); +const queryClient = new QueryClient(); + const root = ReactDOM.createRoot(document.getElementById('root') as HTMLElement); root.render( - - - + + + + + ); diff --git a/examples/with-nextjs-app/app/providers.tsx b/examples/with-nextjs-app/app/providers.tsx index 5b32c9c..a0858a9 100644 --- a/examples/with-nextjs-app/app/providers.tsx +++ b/examples/with-nextjs-app/app/providers.tsx @@ -11,6 +11,7 @@ import { walletConnectConnector, } from '@luno-kit/react/connectors'; import { LunoKitProvider } from '@luno-kit/ui'; +import { QueryClientProvider, QueryClient } from '@tanstack/react-query' const connectors = [ polkadotjsConnector(), @@ -28,6 +29,12 @@ const lunoConfig = createConfig({ autoConnect: true, }); +const queryClient = new QueryClient(); + export default function Providers({ children }: { children: React.ReactNode }) { - return {children}; + return ( + + {children} + + ); } diff --git a/examples/with-nextjs-pages/pages/_app.tsx b/examples/with-nextjs-pages/pages/_app.tsx index 4570e4a..2c4a640 100644 --- a/examples/with-nextjs-pages/pages/_app.tsx +++ b/examples/with-nextjs-pages/pages/_app.tsx @@ -12,6 +12,7 @@ import { import { LunoKitProvider } from '@luno-kit/ui'; import type { AppProps } from 'next/app'; import '@luno-kit/ui/styles.css'; +import { QueryClientProvider, QueryClient } from '@tanstack/react-query' const connectors = [ polkadotjsConnector(), @@ -29,10 +30,14 @@ const lunoConfig = createConfig({ autoConnect: true, }); +const queryClient = new QueryClient(); + export default function App({ Component, pageProps }: AppProps) { return ( - - - + + + + + ); } diff --git a/examples/with-vite-papi/src/main.tsx b/examples/with-vite-papi/src/main.tsx index 7227ee1..8fd8b90 100644 --- a/examples/with-vite-papi/src/main.tsx +++ b/examples/with-vite-papi/src/main.tsx @@ -16,6 +16,7 @@ import { createRoot } from 'react-dom/client'; import App from './App.tsx'; import '@luno-kit/ui/styles.css'; import { CHAINS } from './constants'; +import { QueryClientProvider, QueryClient } from '@tanstack/react-query' const supportedChains = Object.values(CHAINS).map((c) => c.genesisHash); @@ -43,10 +44,14 @@ const lunoConfig = createConfig({ autoConnect: true, }); +const queryClient = new QueryClient(); + createRoot(document.getElementById('root')!).render( - - - + + + + + ); diff --git a/examples/with-vite/src/App.tsx b/examples/with-vite/src/App.tsx index 477f4eb..4380a51 100644 --- a/examples/with-vite/src/App.tsx +++ b/examples/with-vite/src/App.tsx @@ -34,8 +34,19 @@ const App: React.FC = () => { isPending: isSendingTransaction, detailedStatus, } = useSendTransaction(); + const { + sendTransactionAsync: sendTransactionInBlockAsync, + data: sendTransactionInBlockData, + isPending: isSendingTransactionInBlock, + detailedStatus: detailedStatusInBlock, + } = useSendTransaction({ waitFor: 'inBlock' }); const { api, isApiReady, apiError } = useApi(); const { data: paymentInfo, estimate, isLoading: isEstimating } = useEstimatePaymentInfo(); + const { + data: paymentInfoInBlock, + estimate: estimateInBlock, + isLoading: isEstimatingInBlock, + } = useEstimatePaymentInfo(); const { themeMode, setThemeChoice } = useLunoTheme(); @@ -43,6 +54,10 @@ const App: React.FC = () => { to: '', amount: '', }); + const [transferFormInBlock, setTransferFormInBlock] = useState({ + to: '', + amount: '', + }); const showNotification = (title: string, message?: string) => { if (window.Notification?.permission === 'granted') { @@ -109,6 +124,49 @@ const App: React.FC = () => { } }; + const handleSendTransactionInBlock = async () => { + if (!transferFormInBlock.to || !transferFormInBlock.amount) { + showNotification('Not available args', 'Please provide complete transfer details.'); + return; + } + + if (!currentChain) { + showNotification('Chain not available', 'Please select available chain'); + return; + } + + if (!api || !isApiReady) { + showNotification('API error', 'Polkadot API is not yet ready.'); + return; + } + + try { + const decimals = currentChain.nativeCurrency.decimals || 12; + const amountInPlanck = BigInt(parseFloat(transferFormInBlock.amount) * 10 ** decimals); + + await estimateInBlock(api.tx.balances.transferKeepAlive(transferFormInBlock.to, amountInPlanck)); + + const result = await sendTransactionInBlockAsync({ + extrinsic: api.tx.balances.transferKeepAlive(transferFormInBlock.to, amountInPlanck), + }); + + if (result.status === 'success') { + showNotification( + 'Transfer (inBlock) successful', + `TxHash: ${result.transactionHash.slice(0, 10)}...` + ); + setTransferFormInBlock({ to: '', amount: '' }); + } else { + showNotification('Transfer (inBlock) failed', result.errorMessage); + } + } catch (error) { + showNotification( + 'Transfer (inBlock) failed', + error instanceof Error ? error.message : 'An error occurred during the transfer process.' + ); + } + }; + useEffect(() => { if (window.Notification?.permission === 'default') { window.Notification?.requestPermission(); @@ -313,7 +371,7 @@ const App: React.FC = () => {
💸 -

Send Transaction

+

Send Transaction (finalized)

{status === ConnectionStatus.Connected ? ( @@ -394,6 +452,97 @@ const App: React.FC = () => {
+ {/* Send Transaction (inBlock) Card */} +
+
+ ⛓️ +

Send Transaction (wait for inBlock)

+
+
+ {status === ConnectionStatus.Connected ? ( +
+
+
+ + + setTransferFormInBlock((prev) => ({ + ...prev, + to: e.target.value, + })) + } + /> +
+
+ + + setTransferFormInBlock((prev) => ({ + ...prev, + amount: e.target.value, + })) + } + /> +
+
+ +
+ +
+ {sendTransactionInBlockData && ( +
+
+ Status: + {sendTransactionInBlockData.status} +
+
+ Hash: + + {sendTransactionInBlockData.transactionHash.slice(0, 20)}... + +
+
+ )} + {detailedStatusInBlock && ( +
+
+ DetailedStatus: + {detailedStatusInBlock} +
+
+ )} +
+ ) : ( + Connect wallet first + )} +
+
+ {/* API Status Card */}
diff --git a/examples/with-vite/src/main.tsx b/examples/with-vite/src/main.tsx index b0973bc..0ecdade 100644 --- a/examples/with-vite/src/main.tsx +++ b/examples/with-vite/src/main.tsx @@ -29,22 +29,13 @@ import { subwalletConnector, talismanConnector, walletConnectConnector, + onekeyConnector, + ledgerConnector, } from '@luno-kit/react/connectors'; import { LunoKitProvider } from '@luno-kit/ui'; import App from './App.tsx'; import '@luno-kit/ui/styles.css'; - -const connectors = [ - polkadotjsConnector(), - subwalletConnector(), - talismanConnector(), - polkagateConnector(), - fearlessConnector(), - mimirConnector(), - enkryptConnector(), - walletConnectConnector({ projectId: import.meta.env.VITE_WALLET_CONNECT_ID }), - novaConnector({ projectId: import.meta.env.VITE_WALLET_CONNECT_ID }), -]; +import { QueryClientProvider, QueryClient } from '@tanstack/react-query' // Custom chains const astar: Chain = { @@ -107,26 +98,42 @@ const hydration: Chain = { }, }; +const chains = [ + polkadot, + kusama, + westend, + paseo, + astar, + hydration, + polkadotAssetHub, + polkadotCoretime, + polkadotCollectives, + polkadotPeople, + kusamaAssetHub, + kusamaCoretime, + kusamaPeople, + paseoAssetHub, + paseoPassetHub, + westendAssetHub, +]; + +const connectors = [ + ledgerConnector({ chains }), + onekeyConnector(), + polkadotjsConnector(), + subwalletConnector(), + talismanConnector(), + polkagateConnector(), + fearlessConnector(), + mimirConnector(), + enkryptConnector(), + walletConnectConnector({ projectId: import.meta.env.VITE_WALLET_CONNECT_ID }), + novaConnector({ projectId: import.meta.env.VITE_WALLET_CONNECT_ID }), +]; + const lunoConfig = createConfig({ appName: 'luno with-vite example', - chains: [ - polkadot, - kusama, - westend, - paseo, - astar, - hydration, - polkadotAssetHub, - polkadotCoretime, - polkadotCollectives, - polkadotPeople, - kusamaAssetHub, - kusamaCoretime, - kusamaPeople, - paseoAssetHub, - paseoPassetHub, - westendAssetHub, - ], + chains, connectors: connectors, autoConnect: true, subscan: { @@ -134,165 +141,184 @@ const lunoConfig = createConfig({ }, }); +const queryClient = new QueryClient(); + createRoot(document.getElementById('root')!).render( - + - - - - + // 9. Complete theme via theme property in overrides + // theme={{ + // light: { + // colors: { + // accentColor: '#9b59b6', + // modalBackground: '#34495e', + // modalText: '#ecf0f1', + // connectButtonBackground: '#9b59b6', + // connectButtonText: '#ffffff', + // }, + // fonts: { + // body: 'Inter, sans-serif', + // heading: 'Inter, sans-serif', + // }, + // radii: { + // modal: '24px', + // connectButton: '16px', + // }, + // shadows: { + // modal: '0 25px 50px rgba(155, 89, 182, 0.3)', + // }, + // blurs: { + // modalOverlay: '12px', + // } + // } + // }} + > + + + + + ); diff --git a/examples/with-vite/vite.config.ts b/examples/with-vite/vite.config.ts index fabde1a..d0956b3 100644 --- a/examples/with-vite/vite.config.ts +++ b/examples/with-vite/vite.config.ts @@ -3,4 +3,7 @@ import { defineConfig } from 'vite'; export default defineConfig({ plugins: [react()], + server: { + host: '0.0.0.0', + }, }); diff --git a/packages/core/package.json b/packages/core/package.json index e25cf03..cdf20ca 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -59,9 +59,12 @@ }, "dependencies": { "@dedot/chaintypes": "catalog:", + "@ledgerhq/hw-transport-webusb": "6.29.13", "@mimirdev/apps-inject": "3.2.0", "@polkadot-api/pjs-signer": "0.6.14", "@walletconnect/universal-provider": "2.21.4", + "@zondax/ledger-substrate": "2.0.0", + "buffer": "6.0.3", "dedot": "catalog:", "eventemitter3": "5.0.1" }, diff --git a/packages/core/src/config/createConfig.test.ts b/packages/core/src/config/createConfig.test.ts index 183fd8d..dd1f7f4 100644 --- a/packages/core/src/config/createConfig.test.ts +++ b/packages/core/src/config/createConfig.test.ts @@ -84,7 +84,7 @@ describe('createConfig', () => { autoConnect: true, customRpc: undefined, customTypes: undefined, - cacheMetadata: undefined, + cacheMetadata: true, metadata: undefined, scaledResponses: undefined, }); @@ -310,7 +310,7 @@ describe('createConfig', () => { expect(config.customTypes).toBeUndefined(); expect(config.customRpc).toBeUndefined(); - expect(config.cacheMetadata).toBeUndefined(); + expect(config.cacheMetadata).toBe(true); expect(config.metadata).toBeUndefined(); expect(config.scaledResponses).toBeUndefined(); }); diff --git a/packages/core/src/config/createConfig.ts b/packages/core/src/config/createConfig.ts index 8ccd741..647b1b5 100644 --- a/packages/core/src/config/createConfig.ts +++ b/packages/core/src/config/createConfig.ts @@ -44,7 +44,7 @@ export function createConfig(parameters: CreateConfigParameters): Config { transports = {}, storage = defaultLunoStorage, autoConnect = true, - cacheMetadata, + cacheMetadata = true, metadata, scaledResponses, customTypes, @@ -89,7 +89,5 @@ export function createConfig(parameters: CreateConfigParameters): Config { subscan, }; - console.log('[createConfig]: Luno Core Config created:', config); - return config; } diff --git a/packages/core/src/config/createStorage.ts b/packages/core/src/config/createStorage.ts index f8263f1..12b2527 100644 --- a/packages/core/src/config/createStorage.ts +++ b/packages/core/src/config/createStorage.ts @@ -3,7 +3,7 @@ import type { LunoStorage, RawStorage } from '../types'; // Defines the parameters for the createStorage function. export interface CreateStorageParameters { storage: RawStorage; - keyPrefix?: string; // Optional key prefix, e.g., "luno." + keyPrefix?: Optional; // Optional key prefix, e.g., "luno." } /** diff --git a/packages/core/src/config/logos/generated/index.ts b/packages/core/src/config/logos/generated/index.ts index 694ceca..4872424 100644 --- a/packages/core/src/config/logos/generated/index.ts +++ b/packages/core/src/config/logos/generated/index.ts @@ -17,6 +17,7 @@ export { kusamaChain } from './kusamaChain.js'; export { ledgerWallet } from './ledgerWallet.js'; export { mimirWallet } from './mimirWallet.js'; export { novaWallet } from './novaWallet.js'; +export { onekeyWallet } from './onekeyWallet.js'; export { paseoChain } from './paseoChain.js'; export { peopleChain } from './peopleChain.js'; export { peopleKusamaChain } from './peopleKusamaChain.js'; diff --git a/packages/core/src/config/logos/generated/ledgerWallet.ts b/packages/core/src/config/logos/generated/ledgerWallet.ts index 11aa2c3..579fe58 100644 --- a/packages/core/src/config/logos/generated/ledgerWallet.ts +++ b/packages/core/src/config/logos/generated/ledgerWallet.ts @@ -4,4 +4,4 @@ // Do not edit. Auto-generated via node scripts/convertLogos.mjs export const ledgerWallet = - 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/Pg0KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjAvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvMjAwMS9SRUMtU1ZHLTIwMDEwOTA0L0RURC9zdmcxMC5kdGQiPg0KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiBpZD0iYm9keV8xIiB3aWR0aD0iNDAwIiBoZWlnaHQ9IjQwMCI+DQoNCjxnIHRyYW5zZm9ybT0ibWF0cml4KDEuMzMzMzMzNCAwIDAgMS4zMzMzMzM0IDAgMCkiPg0KCTxpbWFnZSAgeD0iMCIgeT0iMCIgeGxpbms6aHJlZj0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFaQUFBQUdRQ0FZQUFBQ0F2emJNQUFBQUFYTlNSMElBcnM0YzZRQUFBQVJuUVUxQkFBQ3hqd3Y4WVFVQUFBQUpjRWhaY3dBQURzTUFBQTdEQWNkdnFHUUFBQnJ5U1VSQlZIaGU3ZHpianlWVjJUL3dWK2M4QXdOb2pDTElTUmlHczVCNDUzK2hKc1lMTDd3anhrUkR2TkE3WTR6ZUdZMW9FQWhJUXRERVF6d1ROUVpKRkExZUdJTVJoNUVCUkdBNEtFWVlaZ2FHZW45UC9WajlybXFlNmRYdFZEZFZ1ejhyK1dTdi9hVjdoMXExMW5xcTl0NDkvL1AvV2djQS80VTBCSUNXTkFTQWxqUUVnSlkwQklDV05BU0FsalFFZ0pZMEJJQ1dOQVNBbGpRRWdKWTBCSUNXTkFTQWxqUUVnSlkwQklDV05BU0FsalFFZ0pZMEJJQ1dOQVNBbGpRRWdKWTBCSUNXTkFTQWxqUUVnSlkwQklDV05BU0FsalFFZ0pZMEJJQ1dOQVNBbGpRRWdKWTBCSUNXTkFTQWxqUUVnSlkwQklDV05BU0FsalFFZ0pZMEJJQ1dOQVNBbGpRRWdKWTBCSUNXTkFTQWxqUUVnSlkwQklDV05BU0FsalFFZ0pZMEJJQ1dOQVNBbGpRRWdKWTBCSUNXTkFTQWxqUUVnSlkwQklDV05BU0FsalFFZ0pZMEJJQ1dOQVNBbGpRRWdKWTBCSUNXTkFTQWxqUUVnSlkwQklDV05BU0FsalFFZ0pZMEJJQ1dOQVNBbGpRRWdKWTBCSUNXTkFTQWxqUUVnSlkwQklDV05BU0FsalFFZ0pZMEJJQ1dOQVNBbGpRRWdKWTBCSUNXTkFTQWxqUUVnSlkwQklDV05BU0FsalFFZ0pZMEJJQ1dOQVNBbGpRRWdKWTBCSUNXTkFTQWxqUUVnSlkwQklDV05BU0FsalFFZ0pZMEJJQ1dOQVNBbGpRRWdKWTBCSUNXTkFTQWxqUUVnSlkwQklDV05BU0FsalFFZ0pZMEJJQ1dOQVNBbGpRRWdKWTBCSUNXTkFTQWxqUUVnSlkwQklDV05HUkVXN1pzV2VwdjNicTFmOXk3ZCs5U3hzbnQzTG16ZjR3eDNMRmpSOS9mdFd0WC8vaW1ONzFwNmVmbUtvNmh6SWxRNWtya2kzQjg2KzNOYjM1elB5OWlyT28xdFczYnRzSFBzVzdTa0pIVW04UDI3ZHNIL2JJaGNuS3hRZFRGbzJSRi9iTnpWQXBHT2I3eWZCR09iU1BWNDFVS2I3M2VXRGRweURvb1YwVVhYbmhoZCs2NTUzYm5uWGRlMytmazN2bk9kM2FYWEhKSjcvenp6Kzh1dmZUU2ZneVhYN25QVlNrYzczM3ZlL3M1Y2M0NTUvVEgvTzUzdjd2YnQyOWZPaWI4bjVnVFYxNTVaVCtHVVh4Mzc5NjlkTmZLaGtoRFJoSWJYVndkeFdZWGI3MWNmdm5sM2E5KzlhdnV3UWNmN0I1NTVKSHUwS0ZEck9DaGh4N3Evdjczdi9mOWh4OSt1THYvL3Z1N2E2Kzl0dDhrRnVFdG5qaUdLSTUvL3ZPZnU4Y2VlNng3K3VtbisrTThjT0JBbnkwZkQ0Wml6R0tPeEh5b0MwZGNyTG5EM3hCcHlFaGlneWh2UzRSM3ZldGQvYVF2N2RWWFgyVUZMNy84Y3Y5NDdOaXhmcnorK2M5L2RwZGRkdGxnak9jczVzZisvZnU3NDhlUGQ2Kzg4a3AvckMrOTlGSjM0c1NKL25qcnNlRDFZc3hDak9XZVBYdjY4WXhDc2doM3B6T1Job3dvcm9iaTFqckVadkg0NDQvM0c4YlJvMGY3VFVKcnR4aXJHTE5ubm5tbXUrcXFxL3JONGkxdmVVczYzbk1UYjFmRkpoakZNbHIwdGRXM3VMaUl0UlZqR1lWaitlZEpyS3MwWkdSeFpSVGlQZHU0NVM0dHU2cmkvOFRWZUJtbmFIRUhFZ1VrRytNNWlnM3ZpaXV1NkkrdHZ1dUlJaElGc3g0TFhpL0dLUXBJS1JyMUhiOXZZbTJJTkdRa3NVR0VtTmp4UEFySXdZTUgrNDNDSGNqcVdtd1VzVW5FNCtIRGg3dXJyNzY2SDg5RmVZODdDbUswNVc5YmFlMVczdHFNY1l4dlhjVzg4QTIyRFpXR2pLUVVqaEFUT3dwSWZFZ2FiVFdiUkZrZzljK1c5OHVqbGMxbVVVV0w0NDBXeC96a2swLzIzN3FweDNYdTRsdFhwY1V4eGx0WjVlMnNiRXdXU1RtM01jL0xNWmRXN2o1WDA4cFlMdEs4bUlrMFpDU25Xa0NpeGMvRjFXa3NzUG90bmVVTGJwRmJ1VHFQYnltVnQ3QVdZYk9JdDFuaWM3RTRyMlV6amJiYXVUSDN0dnc0WXh6SzUxM2xuSyttbGZGVVFEWmNHaktTVXkwZ2NVVWFpNnI4N0FzdnZOQS94aFZiS1NxTHJCeHZlWXdQMGErNTVwckJHTS9kZGRkZDEyK2E1YTZ5blBQWVJMTXhXU1F4aitQWXk5dTU1WTY3WENpdHRwV3hWRUEyWEJveWtqRUtTTFN5c01yenRTNnd1YmI2dUdPOG5uMzIyZjRPSks3Y0YrVzk3dVVmb20vR3RueWVyL1h6d1RLV0NzaUdTME5HY3FvRnBMeXQ4Znp6ejNkSGpoeFoybVRLRlZ3c3ZFVVdZeFRLMVdyY2djVFhYbU5jRitGcm1sRUk0MitEb3NXNWptTXQ1empPZHpZbWl5WmFPYzh2dnZoaS94am4ybHRZczVDR2pHU3NBaEp0K1lJcWkyL1JXOWxVb2ozMzNITkwvM1RGSW9nNWNkRkZGdzNtUWpubm0rSDhsdU91ajdYMEZaQlpTRU5HY3FvRkpPNDh2djN0YjNjLy9lbFB1eC8vK01mZGQ3LzczZTQ3My9sTzk2TWYvYWo3L3ZlLzMyZUxMSTQ3anZtSFAveGhmOHkzM1haYi84L0JMTXBmR3NmOGlIOFQ3YzQ3Nyt5Kzk3M3Y5Y2NaNS9mdXUrL3Vmdjd6bjZkanNraCs5ck9mOWVLWVl6Ny81Q2MvNmU2NjY2NytuNjlaUzZ2SHN4NWYxbDBhTXBKVExTQy8vT1V2bC82T3BMeGxFLzNJTnN1L05scS9WWFd5L2x5VmY1cStQSmJQZGtMOWM0dXMvb08vT0tmeDl6MjMzSExMbXU3QXl1OHJJQnN1RFJuSnFSYVFlKzY1WitsMXltdkY0MmJhWUZoYzlmcW8rN2ZmZnZ1cTFrZHAyV3V3SWRLUWtkUVRXZ0dCb1hwOTFIMEZaRGJTa0pIVUUxb0JnYUY2ZmRSOUJXUTIwcENSMUJOYUFZR2hlbjNVZlFWa050S1FrZFFUV2dHQm9YcDkxSDBGWkRiU2tKSFVFMW9CZ2FGNmZkUjlCV1EyMHBDUjFCTmFBWUdoZW4zVWZRVmtOdEtRa2RRVFdnR0JvWHA5MUgwRlpEYlNrSkhVRTFvQmdhRjZmZFI5QldRMjBwQ1IxQk5hQVlHaGVuM1VmUVZrTnRLUWtkUVRXZ0dCb1hwOTFIMEZaRGJTa0pIVUUxb0JnYUY2ZmRSOUJXUTIwcENSMUJOYUFZR2hlbjNVZlFWa050S1FrZFFUV2dHQm9YcDkxSDBGWkRiU2tKSFVFMW9CZ2FGNmZkUjlCV1EyMHBDUjFCTmFBWUdoZW4zVWZRVmtOdEtRa2RRVFdnR0JvWHA5MUgwRlpEYlNrSkhVRTFvQmdhRjZmZFI5QldRMjBwQ1IxQk5hQVlHaGVuM1VmUVZrTnRLUWtkUVRXZ0dCb1hwOTFIMEZaRGJTa0pIVUUxb0JnYUY2ZmRSOUJXUTIwcENSMUJOYUFZR2hlbjNVZlFWa050S1FrZFFUV2dHQm9YcDkxSDBGWkRiU2tKSFVFMW9CZ2FGNmZkUjlCV1EyMHBDUjFCTmFBWUdoZW4zVWZRVmtOdEtRa2RRVFdnR0JvWHA5MUgwRlpEYlNrSkhVRTFvQmdhRjZmZFI5QldRMjBwQ1IxQk5hQVlHaGVuM1VmUVZrTnRLUWtkUVRXZ0dCb1hwOTFIMEZaRGJTa0pIVUUxb0JnYUY2ZmRSOUJXUTIwcENSMUJOYUFZR2hlbjNVZlFWa050S1FrZFFUV2dHQm9YcDkxSDBGWkRiU2tKRnMzYnExMjdKbFM5K1B5WDN4eFJkM2p6NzZhTDg0VHB3NDhkcjBQM203OTk1Nys5L2Z0bTNiMG10R2Y3TVVrUmkvT041NC9HK090NHhWUE83WXNjTUdNMUZ4ZnJkdjM5N1A5VGhITjk5ODg2cldSMm54R25GKzR6RmV3d1hXaGtsRFJsUnZmaGRjY01GU0FUbDI3RmovdUpKZi9PSVhTNjhSQzZ4ZUdKR1YvbVlReDc5cjE2Nmw4U3pGWVNYWjY4VHZ4V3RsLzQyTnRYdjM3cVdpVWJJNFAzZmNjY2RycFdIbEZtc2tXcjAyeW12RjY1VFhaTjJrSVNNcUcxMzB6enZ2dk83UW9VUDlwRjlOKzgxdmZyUDBPdlVDMlN6RjQ0d3p6amlsalNER2F1Zk9uYjE0bmMxV2RPY2d6bEhjUGRUek8rNUFYbnJwcGRkV3djbmI4ZVBIdTZOSGp5NzlicnhPbk92b2w0eDFsWWFNSkRhdE1wSGpTdXVpaXk3cURodzQwRS82dUVWZmZzZXgzSzkvL2V2WDNaTEg4ejE3OWl3OVgzUng3T1g0b3dERVZXdHNFckhSdEN4L25ib1l1UXVaam5wK1J6OCtBNGtXYTJRbHBaWGZqWE5lTGhLYzN3MlJocXlEMkx6Mjc5L2ZQZjc0NDY5TiszYTcrKzY3K3dVVmk2SitENys4MzdzWlpNVmd0ZUl0cnlpNDVYbU1ZMWhlVEhoanhNVkEvYnljNXh0dnZMRTdjdVRJYTZ2ZzVPM1paNS90SCtOM050TkYxWVNrSVNPSnphdTh6eHZQeno3NzdPNXZmL3RiZi9WVTdrSldjdDk5OS9XYllQeHV1ZnFPZm4zRnRzanFUVDZLWnJtcWpPT1BEU01lVjFKK05zYXRGTjBZUjFlbjB4RG5JaDdqSE5XRi90WmJiKzBMUTNaWFhpc3RmaWZPY1JTZ2VKMzZ0VmhYYWNpSVlsTEhRb20zWGZidDI3ZW16MEIrOElNZkRLN1NTakVwbStObVVRcENrZjFNcHI0cXJlL2FOdE1kM0pTVk80NTZ3NCtMaHR0dXU2My9ra21yUlJFNWZQandZSTNFYThacmxPTEV1a3BEUmxJKzBJdEpYYTU2UC8zcFQzYzMzSEJEOTZsUGZhcjd6R2MrczZMcnI3KysvNTNZQ09NMXlvTGJUSXNqTm9keXZIRUg5K0VQZjdqNzNPYysxMzNoQzEvb1B2LzV6Ni9vWXgvN1dIZk9PZWYwdnh2alh6WXFkeURURWhjRmNXN0tlbm4vKzkvZmZmS1RuK3crOFlsUHJPampILzk0djA3SzJpaS9IOHBhWVYybElVelM2YWVmM3YzKzk3OS83ZnF6M2Y3eWw3LzBSYWZlVE1vZGpBMEdUbGthd2lRcElEQXBhUWlUcElEQXBLUWhUSklDQXBPU2hqQkpDZ2hNU2hyQ0pDa2dNQ2xwQ0pPa2dNQ2twQ0ZNa2dJQ2s1S0dNRWtLQ0V4S0dzSWtLU0F3S1drSWs2U0F3S1NrSVV5U0FnS1Rrb1l3U1FvSVRFb2F3aVFwSURBcGFRaVRwSURBcEtRaFRKSUNBcE9TaGpCSkNnaE1TaHJDSkNrZ01DbHBDSk9rZ01Da3BDRk1rZ0lDazVLR01Fa0tDRXhLR3NJa0tTQXdLV2tJazZTQXdLU2tJVXlTQWdLVGtvWXdTUW9JVEVvYXdpUXBJREFwYVFpVHBJREFwS1FoVEpJQ0FwT1NoakJKQ2doTVNockNKQ2tnTUNscENKT2tnTUNrcENGTWtnSUNrNUtHTUVrS0NFeEtHc0lrS1NBd0tXa0lrNlNBd0tTa0lVeVNBZ0tUa29Zd1NRb0lURW9hd2lRcElEQXBhUWlUcElEQXBLUWhUSklDQXBPU2hqQkpDZ2hNU2hyQ0pDa2dNQ2xwQ0pPa2dNQ2twQ0ZNa2dJQ2s1S0dNRWtLQ0V4S0dzSWtLU0F3S1drSWs2U0F3S1NrSVV5U0FnS1Rrb1l3U1FvSVRFb2F3aVFwSURBcGFRaVRwSURBcEtRaFRKSUNBcE9TaGpCSkNnaE1TaHJDSkNrZ01DbHBDSk9rZ01Da3BDRk1rZ0lDazVLR01Fa0tDRXhLR3NJa0tTQXdLV2tJazZTQXdLU2tJVXlTQWdLVGtvWXdTUW9JVEVvYXdpUXBJREFwYVFpVHBJREFwS1FoVEpJQ0FwT1NoakJKYXkwZ0R6endRUGUydDcydC85MG9HSFh4MkxadDIrQzEzeWhidG16cC8zKzJiOS9lUDYvN01IRnBDSk8wMWdMeThNTVBkK2VmZjM2M1k4ZU8xOTF4eFBNMzJ0YXRXMTlYUUtMSVJWNy92OEpFcFNGTTBsb0x5Si8rOUtmdXJMUE82bjgzN2poaWs5NjllM2YvUERidCtyWGZhRkZJU2o4S25pTENES1FoVE5KYUM4ampqei9lWFhEQkJZUFhLQnR6RkpMNmJ1Q05FUDh2NWM2akxoaVI3ZHk1YytrNVRGUWF3aVN0dFlEY2Q5OTkzZnZlOTc1dS8vNzkzU1dYWE5LZGQ5NTUzYjU5Ky9ySHlDNisrT0kzMUVVWFhkUS94ckZGd1lqanErOUVZT0xTRUNacHJRVWsybC8vK3RmdXFhZWU2ZzRmUHR3OSt1aWozYlBQUHR2Zm1jVG5JNDg5OXRnYkt2NC83cjc3N3FVUCtvdTRHOW0xYTljZ2d3bEtRNWlrdFJhUWwxOSt1VHQrL0hqZmYrV1ZWN29qUjQ1MEowNmM2SjlQcFIwNGNHQ3BXTVJiVjFFODRvUDA4bzB4bUxBMGhFbjZiKzVBb2gwOWV2UzEzdjh2S3FXOSt1cXJiNmo0ZjRrN2tYSjg5VmVMRlJCbUlBMFpVYnluWGIrdnZmeDVTL21RTlg0bnZwMVQ4cW44SGNONld2N0I4aGxubkxGVVFPSk9JdHVVNStiZ3dZTkx4MWlLUmpubml5N21kSHlab0R3dlh5d0lkWDR5WlIyVk83Zm94Kyt0WlgxeFN0S1FrY1dramcyLy91WlA5bk9yRVl1bHZFNzIzeGRKSEdOZFJLSi8vLzMzOXdWa0VWcThyUllGcFA0N2xWSkU2dU5lZERHbjQyMjh0UmJPR0tQeWJiVVl0eWdjbTJuY0ppQU5HY21lUFh2Nng3STUxSk03Sm56a0s0a0ZFVTQ3N2JTbHYxK0kzOXNzVjZnaENtK01XMnd3TVFaLy9PTWZsemJmdUF1WnMzaHI3Y0VISDF3NjMzR2NjYTdqdU9QNThyRllOTXYvd0xNVXo1anpVUmpLdUp4TS9GejVPNS95dTRXdlFXK0lOR1FrTWNsallrY2hpWDY1YzhqK01ub2w4UnJMRjBnc252cjVJb3BDV1RhQ09ONTQvcnZmL2E3L01EeDdPMmh1b2ozeHhCT3ZPK1o0M0N4dlVhNWxIYXdrNWtjbzYyVDVlbUZkcENFaktaTzRiQXIxcEY3TndvbmZxKzlhWW9IVTM5Z3ArU0lyRzJtTVhYd0dFbjlkdmlqdCtlZWY3dzRkT3JSMG5PV2lJQjdIMmxpbkx1WjNYU3hqWHNlRjFtcSt4dnlPZDd5akg2ZjZaK3Npd3JwTFEwWlNUK1NZMkdWeXgyUGNsVVIvSmZGN3NjRDI3dDI3OUJybHJhem9sOWRlWkhFSFVvcm9tV2VlMmYzaEQzL29qaDA3dHZTVjNEbUw5c2dqai9USEYrZTdiS1NyMlR3WFFSeDNPYmRGakVFcG5zdlh3M0xsNStJMTZvSmIxbHA1enJwSlEwWVNpMkg1NXlCUkRHTHkxejkzTW5IRkhZK3hHTXJtVW41MytjSmJaT1ZZenozMzNPN2VlKzhkZkMxM3ppM2V4dnJ0YjMvYmZ6MjVIR3U1b3Q0TTU3Y3VGREcveTl5T3ZLeWJsY1RQdmYzdGIrLzdjV0VWZHk5bG5aVFhabDJsSVNPS3ErYlNqMzlDNDdPZi9XejN6Vzkrczd2OTl0dTdXMis5ZFVVMzNIREQwa0lxZHg1bFlXeUdCVksrdGh5UDVZcnlneC84WVBlUmozeWsrK2hIUHpwNzExOS9mZmVoRDMyb1A2N1krT0p1cTJ5QW0wWE00emkvNWJpam1IN2dBeDlJMThOeU45MTBVM2ZqalRmMmM2T3NoMUo0VjN1UnhpbEpRMFpTYi9JeG9lT2ZGbzkvUXFOY2ZiYmFQZmZjcy9RNjViWGkwZUpnRWRUcm8rN0h4ZFZxMWtkcDJXdXdJZEtRa2RRVFdnR0JvWHA5MUgwRlpEYlNrSkhVRTFvQmdhRjZmZFI5QldRMjBwQ1IxQk5hQVlHaGVuM1VmUVZrTnRLUWtkUVRXZ0dCb1hwOTFIMEZaRGJTa0pIVUUxb0JnYUY2ZmRSOUJXUTIwcENSMUJOYUFZR2hlbjNVZlFWa050S1FrZFFUV2dHQm9YcDkxSDBGWkRiU2tKSFVFMW9CZ2FGNmZkUjlCV1EyMHBDUjFCTmFBWUdoZW4zVWZRVmtOdEtRa2RRVFdnR0JvWHA5MUgwRlpEYlNrSkhVRTFvQmdhRjZmZFI5QldRMjBwQ1IxQk5hQVlHaGVuM1VmUVZrTnRLUWtkUVRXZ0dCb1hwOTFIMEZaRGJTa0pIVUUxb0JnYUY2ZmRSOUJXUTIwcENSMUJOYUFZR2hlbjNVZlFWa050S1FrZFFUV2dHQm9YcDkxSDBGWkRiU2tKSFVFMW9CZ2FGNmZkUjlCV1EyMHBDUjFCTmFBWUdoZW4zVWZRVmtOdEtRa2RRVFdnR0JvWHA5MUgwRlpEYlNrSkhVRTFvQmdhRjZmZFI5QldRMjBwQ1IxQk5hQVlHaGVuM1VmUVZrTnRLUWtkUVRXZ0dCb1hwOTFIMEZaRGJTa0pIVUUxb0JnYUY2ZmRSOUJXUTIwcENSMUJOYUFZR2hlbjNVZlFWa050S1FrZFFUV2dHQm9YcDkxSDBGWkRiU2tKSFVFMW9CZ2FGNmZkUjlCV1EyMHBDUjFCTmFBWUdoZW4zVWZRVmtOdEtRa2RRVFdnR0JvWHA5MUgwRlpEYlNrSkhVRTFvQmdhRjZmZFI5QldRMjBwQ1IxQk5hQVlHaGVuM1VmUVZrTnRLUWtkUVRXZ0dCb1hwOTFIMEZaRGJTa0pIVUUxb0JnYUY2ZmRSOUJXUTIwcENSMUJOYUFZR2hlbjNVZlFWa050S1FrZFFUV2dHQm9YcDkxSDBGWkRiU2tKSFVFMW9CZ2FGNmZkUjlCV1EyMHBDUjFCTmFBWUdoZW4zVWZRVmtOdEtRa2RRVFdnR0JvWHA5MUgwRlpEYlNrSkhVRTFvQmdhRjZmZFI5QldRMjBwQ1IxQk5hQVlHaGVuM1VmUVZrTnRLUWtkUVQrcjhwSUFjUEh1eHV2dm5tN290Zi9HTC8rTld2ZnJYNzBwZSsxSDN0YTEvcnZ2emxML2ZQRjlsWHZ2S1Y3aHZmK0VaMzQ0MDM5bU1ReDN6bW1XY3V6RWF4YmR1MmJ1L2V2ZDFkZDkzVjNYVFRUZDNYdi83MS9qemZlZWVkM1MyMzNOSnZwSXNzNW5FYzV4MTMzTkhkZHR0dC9SaDg2MXZmNmg1NDRJSFhWc0RxV2hsUEJXVERwU0VqT2RVQ0V1MmxsMTdxVHB3NDBmZVBIeisrMUk4OFhtT1J4YkcrL1BMTDNTdXZ2TklkUFhxMGUrcXBwN3JycnJ1dTI3SmxTNjhlNnptSytYSGxsVmQyTDc3NFluOU82eGJIRzhlL3lLTEZlWTV6SEkvUklvL3p2WlpXajJjOXZxeTdOR1FrcDFwQS92T2YvL1NMcTdRalI0NHNMYnkxTHJLNXR2cjRuMy8rK2U3eXl5OS8zZGpPMlJWWFhORVhpMmh4Ym84ZE85YjNOMHVMaTZMbHh4elBZNjZ2dHBXeFZFQTJYQm95a2xNdElLWEZ4bEt1eE10anRIaU5SUmJIR3FJZkc4MFRUenpSWFgzMTFkM1dyVnU3M2J0M0Q4WjZqdUl1S3U1QTR0aEtLOGNlNXpqTysyWlFqamtySnF0cFpUd1ZrQTJYaG94a2pBSlNGbGJkTnN2ZFIyd3VwVVVoZWZMSko3dHJycmxtTU1aemQ4a2xseXpkZ1pRV3g3MVp6bkcwNVd1aEZKYlZ0aktXQ3NpR1MwTkdjcW9GcEh6T0VZc3Bpa2haVlBFWWVXd3lpeXhhRkk3UzRpMnMrQXdreGpJK2dLN0hlbzYyYjkvZXY0VlZ6bVc4YlJOWDRNc3ZHQmExeFhHR2NwZFp0OVdzajlMS2VDb2dHeTROR2NtcEZwRDZaMktEaVN2VnRTeXNSV2hsZzRualAzejRjSGZaWlpmMTQ3a0lINktIdUFOWjNrcnhMRmZpaTZwdThieWM2K1gvcmRYS1dDb2dHeTROR2NtcEZwQ3lxTXJQeG1OazhWaGZtUzl5SzhjZXh4MEY1S3FycmxvYXp6SzJjeFYzVWZ2MjdldlBaUkZ0czV6YmFIRitvMkNXb2xuYVdzYWdqS2NDc3VIU2tKSEVWWEpzZE9WcU9iNUI5TkJERC9XVFBncUR0bklybTBpNTgzcjY2YWY3RDUxakxCZmhMYXh3NmFXWDlzZFliNkJsUTQxajV1U2l4WVZGckxINmdtTEhqaDBMY1lFeEEybkl5R0pDeCtPRkYxN1lQZkxJSTBzYlkweCtUbTU1ZSs2NTUvb3I5dVhqTzFkeFlSRjNwZEhpZ2lJc3Z4TFgycTFjcE1XMzgzYnQycFdPTmVzaURSbEptY3d4d2VQMmV2LysvZDAvL3ZHUDdvVVhYbmh0Nm1zcnRkaFF5emVVb3VnKzg4d3ozWHZlODU2RnVjS01EZS9zczgvdWp5K090UlRPdUxxTzR5NTNJdVJpbkdLODZydlIrR0pDUEM3QzE3eG5JQTBaVVV6b2NnY1NCU1R1UUVvckd3YTVhUC82MTcrV2lraDhqZmZhYTYvdHgzSlIzdStPYjJIRm5WVWNZM3dMSzc1cEZvOVJNT012MURtNStNYmF2Ly85NzM0Y280aVU0dkhXdDc1MU1NYXNtelJrSktlZGRsci9HSnZkbmoxNytxdm1jdVZjK3B4Y2pGT01XN21hM0xsejU5TGpJbndHVW80bi9uMnZrc1Z4K1RCNDlVclJLTXBZbm5YV1dZT2NkWkdHakNnMndySXBsSTNCN2ZYcXhPWlF2b0FRNHhoditaVC9WZ3JNM0oxKyt1bXZ5MktlZUMrL3JaNERjWmRmUGdjcGQveXN1elJrSlBVbUVKTTlKblpzRG1YaWw2SkNyb3hkS1J3eGJsRlVvaUNYd2pKM1piT0w0eTNIVnY3Yjh2RmdLT1pBUE1hOHFDOHVvbDgvWjkya0lTT0p5UjJQTWRGTDBTZ2JSTDFSa0N0djhaUzNBaGR0ek1vbUY0OWxyb1N5UWJLeWVyektHTVkvangrWjliVWgwaEFBV3RJUUFGclNFQUJhMGhBQVd0SVFBRnJTRUFCYTBoQUFXdElRQUZyU0VBQmEwaEFBV3RJUUFGclNFQUJhMGhBQVd0SVFBRnJTRUFCYTBoQUFXdElRQUZyU0VBQmEwaEFBV3RJUUFGclNFQUJhMGhBQVd0SVFBRnJTRUFCYTBoQUFXdElRQUZyU0VBQmEwaEFBV3RJUUFGclNFQUJhMGhBQVd0SVFBRnJTRUFCYTBoQUFXdElRQUZyU0VBQmEwaEFBV3RJUUFGclNFQUJhMGhBQVd0SVFBRnJTRUFCYTBoQUFXdElRQUZyU0VBQmEwaEFBV3RJUUFGclNFQUJhMGhBQVd0SVFBRnJTRUFCYTBoQUFXdElRQUZyU0VBQmEwaEFBV3RJUUFGclNFQUJhMGhBQVd0SVFBRnJTRUFCYTBoQUFXdElRQUZyU0VBQmEwaEFBV3RJUUFGclNFQUJhMGhBQVd0SVFBRnJTRUFCYTBoQUFXdElRQUZyU0VBQmEwaEFBV3RJUUFGclNFQUJhMGhBQVd0SVFBRnJTRUFCYTBoQUFXdElRQUZyU0VBQmEwaEFBV3RJUUFGclNFQUJhMGhBQVd0SVFBRnJTRUFCYTBoQUFXdElRQUZyU0VBQmEwaEFBV3RJUUFGclNFQUJhMGhBQVd0SVFBRnJTRUFCYTBoQUFXdElRQUZyU0VBQmEwaEFBV3RJUUFGclNFQUJhMGhBQVd0SVFBRmJ3UDkzL0Fxb2FrMlU4Tm9pd0FBQUFBRWxGVGtTdVFtQ0MiIHByZXNlcnZlQXNwZWN0UmF0aW89Im5vbmUiIHdpZHRoPSIzMDAiIGhlaWdodD0iMzAwIi8+DQo8L2c+DQo8L3N2Zz4NCg=='; + 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB3aWR0aD0iMjU2cHgiIGhlaWdodD0iMjU2cHgiIHZpZXdCb3g9IjAgMCAyNTYgMjU2IiB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPgogICAgPHRpdGxlPue8lue7hDwvdGl0bGU+CiAgICA8ZyBpZD0i6aG16Z2iLTEiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPgogICAgICAgIDxnIGlkPSLnvJbnu4QiIGZpbGwtcnVsZT0ibm9uemVybyI+CiAgICAgICAgICAgIDxwYXRoIGQ9Ik0yMzYsMCBMMjAsMCBDOC45NTQzMDUsMy41NTI3MTM2OGUtMTUgLTMuNTUyNzEzNjhlLTE1LDguOTU0MzA1IDAsMjAgTDAsMjM2IEMwLDI0Ny4wNDU2OTUgOC45NTQzMDUsMjU2IDIwLDI1NiBMMjM2LDI1NiBDMjQ3LjA0NTY5NSwyNTYgMjU2LDI0Ny4wNDU2OTUgMjU2LDIzNiBMMjU2LDIwIEMyNTYsOC45NTQzMDUgMjQ3LjA0NTY5NSwtMy41NTI3MTM2OGUtMTUgMjM2LDAgWiIgaWQ9Iui3r+W+hCIgZmlsbD0iIzAwMDAwMCI+PC9wYXRoPgogICAgICAgICAgICA8cGF0aCBkPSJNNDMuMzY2MTIwMiwxNjEuNTYzNTg1IEw0My4zNjYxMjAyLDIwNS4xMzkwNzMgTDEwNy41NTgxMiwyMDUuMTM5MDczIEwxMDcuNTU4MTIsMTk1LjQ2NTEwMiBMNTIuNzIwNzg2OSwxOTUuNDY1MTAyIEw1Mi43MjA3ODY5LDE2MS41NjM1ODUgTDQzLjM2NjEyMDIsMTYxLjU2MzU4NSBaIE0yMDQuNjc4MTIsMTYxLjU2MzU4NSBMMjA0LjY3ODEyLDE5NS40NjUxMDIgTDE0OS44NDA3ODcsMTk1LjQ2NTEwMiBMMTQ5Ljg0MDc4NywyMDUuMTI4NDE5IEwyMTQuMDMyNzg3LDIwNS4xMjg0MTkgTDIxNC4wMzI3ODcsMTYxLjU1MjkzMSBMMjA0LjY3ODEyLDE2MS41NjM1ODUgWiBNMTA3LjY1NDEyLDk1LjI4NDA5NjggTDEwNy42NTQxMiwxNjEuNTc0MjM5IEwxNDkuODQwNzg3LDE2MS41NzQyMzkgTDE0OS44NDA3ODcsMTUyLjg1OTE0MiBMMTE3LjAwODc4NywxNTIuODU5MTQyIEwxMTcuMDA4Nzg3LDk1LjI4NDA5NjggTDEwNy42NTQxMiw5NS4yODQwOTY4IFogTTQzLjM2NjEyMDIsNTEuNzA4NjA5MyBMNDMuMzY2MTIwMiw5NS4yODQwOTY4IEw1Mi43MjA3ODY5LDk1LjI4NDA5NjggTDUyLjcyMDc4NjksNjEuMzcxOTI2NCBMMTA3LjU1ODEyLDYxLjM3MTkyNjQgTDEwNy41NTgxMiw1MS43MDg2MDkzIEw0My4zNjYxMjAyLDUxLjcwODYwOTMgWiBNMTQ5Ljg0MDc4Nyw1MS43MDg2MDkzIEwxNDkuODQwNzg3LDYxLjM3MTkyNjQgTDIwNC42NzgxMiw2MS4zNzE5MjY0IEwyMDQuNjc4MTIsOTUuMjczNDQyNyBMMjE0LjAzMjc4Nyw5NS4yNzM0NDI3IEwyMTQuMDMyNzg3LDUxLjcwODYwOTMgTDE0OS44NDA3ODcsNTEuNzA4NjA5MyBaIiBpZD0i5b2i54q2IiBmaWxsPSIjRkZGRkZGIj48L3BhdGg+CiAgICAgICAgPC9nPgogICAgPC9nPgo8L3N2Zz4='; diff --git a/packages/core/src/config/logos/generated/onekeyWallet.ts b/packages/core/src/config/logos/generated/onekeyWallet.ts new file mode 100644 index 0000000..700dec6 --- /dev/null +++ b/packages/core/src/config/logos/generated/onekeyWallet.ts @@ -0,0 +1,7 @@ +// Copyright 2025 Luno contributors +// SPDX-License-Identifier: MIT + +// Do not edit. Auto-generated via node scripts/convertLogos.mjs + +export const onekeyWallet = + 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTQ0IiBoZWlnaHQ9IjE0NCIgdmlld0JveD0iMCAwIDE0NCAxNDQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxwYXRoIGQ9Ik0xNDQgNzJDMTQ0IDEyMS43MDYgMTIxLjcwNiAxNDQgNzIgMTQ0QzIyLjI5NDQgMTQ0IDAgMTIxLjcwNiAwIDcyQzAgMjIuMjk0NCAyMi4yOTQ0IDAgNzIgMEMxMjEuNzA2IDAgMTQ0IDIyLjI5NDQgMTQ0IDcyWiIgZmlsbD0iIzQ0RDYyQyIgc3R5bGU9ImZpbGw6IzQ0RDYyQztmaWxsOmNvbG9yKGRpc3BsYXktcDMgMC4yNjY3IDAuODM5MiAwLjE3MjUpO2ZpbGwtb3BhY2l0eToxOyIvPgo8cGF0aCBkPSJNNzguNTA1MyAzMC41MzA1TDU4LjQ3NTMgMzAuNTMwNUw1NC45NjEzIDQxLjE1NjJINjYuMDg2NVY2My41MzgxTDc4LjUwNTMgNjMuNTM4MVYzMC41MzA1WiIgZmlsbD0iYmxhY2siIHN0eWxlPSJmaWxsOmJsYWNrO2ZpbGwtb3BhY2l0eToxOyIvPgo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTk0Ljg0MzcgOTAuNjI2MUM5NC44NDM3IDEwMy4yNDIgODQuNjE2NCAxMTMuNDY5IDcyLjAwMDQgMTEzLjQ2OUM1OS4zODQ0IDExMy40NjkgNDkuMTU3MSAxMDMuMjQyIDQ5LjE1NzEgOTAuNjI2MUM0OS4xNTcxIDc4LjAxMDEgNTkuMzg0NCA2Ny43ODI4IDcyLjAwMDQgNjcuNzgyOEM4NC42MTY0IDY3Ljc4MjggOTQuODQzNyA3OC4wMTAxIDk0Ljg0MzcgOTAuNjI2MVpNODQuNDczMSA5MC42MjZDODQuNDczMSA5Ny41MTQ1IDc4Ljg4ODkgMTAzLjA5OSA3Mi4wMDA0IDEwMy4wOTlDNjUuMTExOSAxMDMuMDk5IDU5LjUyNzYgOTcuNTE0NSA1OS41Mjc2IDkwLjYyNkM1OS41Mjc2IDgzLjczNzUgNjUuMTExOSA3OC4xNTMzIDcyLjAwMDQgNzguMTUzM0M3OC44ODg5IDc4LjE1MzMgODQuNDczMSA4My43Mzc1IDg0LjQ3MzEgOTAuNjI2WiIgZmlsbD0iYmxhY2siIHN0eWxlPSJmaWxsOmJsYWNrO2ZpbGwtb3BhY2l0eToxOyIvPgo8L3N2Zz4K'; diff --git a/packages/core/src/config/logos/wallets/ledger.svg b/packages/core/src/config/logos/wallets/ledger.svg index b46eb2c..850ff1e 100644 --- a/packages/core/src/config/logos/wallets/ledger.svg +++ b/packages/core/src/config/logos/wallets/ledger.svg @@ -1,8 +1,10 @@ - - - - - - - - + + + 编组 + + + + + + + \ No newline at end of file diff --git a/packages/core/src/config/logos/wallets/onekey.svg b/packages/core/src/config/logos/wallets/onekey.svg new file mode 100644 index 0000000..2c98e05 --- /dev/null +++ b/packages/core/src/config/logos/wallets/onekey.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/packages/core/src/connectors/base.ts b/packages/core/src/connectors/base.ts index bd7b4ae..55bde02 100644 --- a/packages/core/src/connectors/base.ts +++ b/packages/core/src/connectors/base.ts @@ -22,7 +22,7 @@ export abstract class BaseConnector extends EventEmitter { * connector icon URL (optional) * subclasses can implement. */ - abstract readonly icon?: string; + abstract readonly icon?: Optional; readonly links: ConnectorLinks = {}; /** @@ -58,8 +58,8 @@ export abstract class BaseConnector extends EventEmitter { */ abstract connect( appName: string, - chains?: Chain[], - targetChainId?: string + chains?: Optional, + targetChainId?: Optional ): Promise; /** * disconnect from the wallet. diff --git a/packages/core/src/connectors/index.ts b/packages/core/src/connectors/index.ts index 5355cad..4c1c45a 100644 --- a/packages/core/src/connectors/index.ts +++ b/packages/core/src/connectors/index.ts @@ -2,9 +2,11 @@ export { BaseConnector } from './base'; export { enkryptConnector } from './enkrypt'; export { fearlessConnector } from './fearless'; export { InjectConnector } from './inject'; +export { ledgerConnector } from './ledger'; export { mimirConnector } from './mimir'; export { novaConnector } from './nova'; export { novaMobileConnector } from './novaMobile'; +export { onekeyConnector } from './onekey'; export { polkadotjsConnector } from './polkadot-js'; export { polkagateConnector } from './polkagate'; export { subwalletConnector } from './subwallet'; diff --git a/packages/core/src/connectors/inject.ts b/packages/core/src/connectors/inject.ts index 4999c3a..471de0a 100644 --- a/packages/core/src/connectors/inject.ts +++ b/packages/core/src/connectors/inject.ts @@ -9,7 +9,7 @@ export interface InjectConnectorOptions { name: string; icon: string; links: ConnectorLinks; - injectorId?: string; + injectorId?: Optional; } export class InjectConnector extends BaseConnector { @@ -21,7 +21,7 @@ export class InjectConnector extends BaseConnector { private unsubscribe: (() => void) | null = null; - private specificInjector?: Injected = undefined; + private specificInjector?: Optional = undefined; constructor(options: InjectConnectorOptions) { super(); @@ -43,9 +43,7 @@ export class InjectConnector extends BaseConnector { } public async connect(appName: string): Promise { - console.log(`Connector ${this.id}: Attempting to connect...`); if (this.signer) { - console.log(`Connector ${this.id}: Already connected.`); return [...this.accounts]; } if (!(await this.isAvailable())) { @@ -74,7 +72,6 @@ export class InjectConnector extends BaseConnector { ); } this.accounts = mapInjectedAccounts(rawAccounts, this.id); - console.log(`Connector ${this.id}: Initial accounts loaded`, this.accounts); await this.startSubscription(); @@ -89,7 +86,6 @@ export class InjectConnector extends BaseConnector { } public async disconnect(): Promise { - console.log(`Connector ${this.id}: Disconnecting...`); await this.cleanup(); this.emit('disconnect'); } @@ -110,7 +106,6 @@ export class InjectConnector extends BaseConnector { const result = await signer.signRaw({ address, data: dataHex, type: 'bytes' }); return result.signature; } catch (error: any) { - console.log('error', error); throw new Error(`Connector ${this.id}: Failed to sign message: ${error.message}`); } } @@ -131,7 +126,6 @@ export class InjectConnector extends BaseConnector { } } ); - console.log(`Connector ${this.id}: Subscribed to account changes.`); } catch (error) { console.error(`Connector ${this.id}: Failed to subscribe to accounts:`, error); this.unsubscribe = null; @@ -142,7 +136,6 @@ export class InjectConnector extends BaseConnector { if (this.unsubscribe) { this.unsubscribe(); this.unsubscribe = null; - console.log(`Connector ${this.id}: Unsubscribed from account changes.`); } } diff --git a/packages/core/src/connectors/ledger.test.ts b/packages/core/src/connectors/ledger.test.ts index 417ef09..3393ded 100644 --- a/packages/core/src/connectors/ledger.test.ts +++ b/packages/core/src/connectors/ledger.test.ts @@ -1,16 +1,442 @@ -import { describe } from 'vitest'; +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; import { ledgerWallet } from '../config/logos/generated'; +import type { Chain } from '../types'; import { ledgerConnector } from './ledger'; -import { createWalletConnectTestSuite } from './test-helper'; - -describe( - 'ledgerConnector', - createWalletConnectTestSuite({ - getConnector: ledgerConnector, - expected: { - id: 'ledger', - name: 'Ledger', - icon: ledgerWallet, + +const TEST_ADDRESS = '1FRMM8PEiWXYax7rpS6X4XZX1aAAxSWx1CrKTyrVYhV24fg'; +const TEST_PUBLIC_KEY = new Uint8Array([ + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, + 28, 29, 30, 31, 32, +]); +const TEST_PUBLIC_KEY_HEX = 'a711da72565f9cc37e65d2b8bb97a939f8d95730e39648f764e210a8fef22bf3'; +const TEST_CHAIN: Chain = { + genesisHash: '0x91b171bb158e2d3848fa23a9f1c25182fb8e20313b2c1eb49219da7a70ce90c3', + name: 'Polkadot', + nativeCurrency: { name: 'Polkadot', symbol: 'DOT', decimals: 10 }, + rpcUrls: { + webSocket: ['wss://rpc.polkadot.io'], + }, + ss58Format: 0, + blockExplorers: { default: { name: 'Subscan', url: 'https://polkadot.subscan.io' } }, + chainIconUrl: 'polkadot-icon', + testnet: false, +}; + +vi.mock('@ledgerhq/hw-transport-webusb', () => ({ + default: { + create: vi.fn(), + request: vi.fn(), + }, +})); + +vi.mock('@zondax/ledger-substrate', () => ({ + PolkadotGenericApp: vi.fn(), +})); + +vi.mock('../config', () => ({ + wsProvider: vi.fn(), +})); + +vi.mock('dedot', () => ({ + LegacyClient: vi.fn(), + ExtraSignedExtension: vi.fn(), +})); + +vi.mock('dedot/merkleized-metadata', () => ({ + MerkleizedMetadata: vi.fn(), +})); + +vi.mock('dedot/codecs', () => ({ + Extrinsic: vi.fn(), +})); + +const mockTransport = { + device: { + opened: false, + }, + open: vi.fn().mockResolvedValue(undefined), + close: vi.fn().mockResolvedValue(undefined), +}; + +const mockApp = { + getAddressEd25519: vi.fn().mockResolvedValue({ + address: TEST_ADDRESS, + pubKey: TEST_PUBLIC_KEY_HEX, + }), + signWithMetadataEd25519: vi.fn().mockResolvedValue({ + signature: new Uint8Array([ + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, + 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + ]), + }), +}; + +const mockProvider = { + send: vi.fn().mockResolvedValue('0xmetadata'), + connect: vi.fn().mockResolvedValue(undefined), +}; + +const mockClient = { + connect: vi.fn().mockResolvedValue(undefined), + registry: { + metadata: { + extrinsic: { + signatureTypeId: 1, + callTypeId: 2, + }, }, - }) -); + findCodec: vi.fn().mockReturnValue({ + tryDecode: vi.fn((hex: string) => hex), + }), + }, +}; + +const mockExtraSignedExtension = { + init: vi.fn().mockResolvedValue(undefined), + toRawPayload: vi.fn().mockReturnValue({ data: '0x1234' }), + data: {}, +}; + +const mockMerkleizer = { + digest: vi.fn().mockReturnValue(new Uint8Array([1, 2, 3, 4])), + proofForExtrinsicPayload: vi.fn().mockReturnValue(new Uint8Array([5, 6, 7, 8])), +}; + +const mockExtrinsic = { + attachSignature: vi.fn(), + toHex: vi.fn().mockReturnValue('0xsignedTx'), +}; + +describe('LedgerConnector', () => { + let connector: ReturnType; + let originalNavigator: any; + + beforeEach(async () => { + originalNavigator = globalThis.navigator; + + Object.defineProperty(globalThis, 'navigator', { + value: { + usb: { + requestDevice: vi.fn(), + }, + }, + writable: true, + configurable: true, + }); + + globalThis.Buffer = Buffer; + + // Setup mocks + const { default: TransportWebUSB } = await import('@ledgerhq/hw-transport-webusb'); + const { PolkadotGenericApp } = await import('@zondax/ledger-substrate'); + const { wsProvider } = await import('../config'); + const dedotModule = await import('dedot'); + const merkleizedModule = await import('dedot/merkleized-metadata'); + const codecsModule = await import('dedot/codecs'); + + const transport = TransportWebUSB as any; + vi.mocked(transport.create).mockResolvedValue(mockTransport); + vi.mocked(transport.request).mockResolvedValue(mockTransport); + vi.mocked(PolkadotGenericApp).mockImplementation(() => mockApp); + vi.mocked(wsProvider).mockReturnValue(mockProvider); + vi.mocked((dedotModule as any).LegacyClient).mockImplementation(() => mockClient); + vi.mocked((dedotModule as any).ExtraSignedExtension).mockImplementation( + () => mockExtraSignedExtension + ); + vi.mocked((merkleizedModule as any).MerkleizedMetadata).mockImplementation( + () => mockMerkleizer + ); + vi.mocked((codecsModule as any).Extrinsic).mockImplementation(() => mockExtrinsic); + + // Reset mock app to default state + mockApp.getAddressEd25519.mockResolvedValue({ + address: TEST_ADDRESS, + pubKey: TEST_PUBLIC_KEY_HEX, + }); + + connector = ledgerConnector({ chains: [TEST_CHAIN] }); + vi.clearAllMocks(); + }); + + afterEach(() => { + Object.defineProperty(globalThis, 'navigator', { + value: originalNavigator, + writable: true, + configurable: true, + }); + vi.clearAllMocks(); + }); + + describe('basic properties', () => { + it('should have correct connector metadata', () => { + expect(connector.id).toBe('ledger'); + expect(connector.name).toBe('Ledger'); + expect(connector.icon).toBe(ledgerWallet); + }); + }); + + describe('installation detection', () => { + it('should always be installed', () => { + expect(connector.isInstalled()).toBe(false); + }); + }); + + describe('availability check', () => { + it('should be available when WebUSB is supported', async () => { + expect(await connector.isAvailable()).toBe(true); + }); + + it('should not be available when WebUSB is not supported', async () => { + Object.defineProperty(globalThis, 'navigator', { + value: {}, + writable: true, + configurable: true, + }); + + expect(await connector.isAvailable()).toBe(false); + }); + + it('should not be available in non-browser environment', async () => { + Object.defineProperty(globalThis, 'navigator', { + value: undefined, + writable: true, + configurable: true, + }); + + expect(await connector.isAvailable()).toBe(false); + }); + }); + + describe('connection flow', () => { + it('should connect successfully with valid setup', async () => { + const accounts = await connector.connect('test-app'); + + expect(accounts).toHaveLength(1); + expect(accounts![0].address).toBe(TEST_ADDRESS); + expect(accounts![0].name).toBe('Ledger Wallet'); + expect(accounts![0].type).toBe('sr25519'); + expect(accounts![0].meta?.source).toBe('ledger'); + expect(accounts![0].meta?.accountIndex).toBe(0); + }); + + it('should throw error when WebUSB is not available', async () => { + Object.defineProperty(globalThis, 'navigator', { + value: {}, + writable: true, + configurable: true, + }); + + await expect(connector.connect('test-app', [TEST_CHAIN])).rejects.toThrow( + 'WebUSB is not supported in this browser.' + ); + }); + + it('should handle SecurityError during transport creation and fallback to request', async () => { + const { default: TransportWebUSB } = await import('@ledgerhq/hw-transport-webusb'); + const transport = TransportWebUSB as any; + vi.mocked(transport.create).mockRejectedValueOnce({ + name: 'OtherError', + message: 'Some other error', + }); + vi.mocked(transport.request).mockResolvedValueOnce(mockTransport); + + const accounts = await connector.connect('test-app', [TEST_CHAIN]); + + expect(accounts).toHaveLength(1); + expect(transport.request).toHaveBeenCalled(); + }); + + it('should throw user-friendly error for SecurityError', async () => { + const { default: TransportWebUSB } = await import('@ledgerhq/hw-transport-webusb'); + const transport = TransportWebUSB as any; + vi.mocked(transport.create).mockRejectedValueOnce({ + name: 'SecurityError', + message: 'User gesture required', + }); + vi.mocked(transport.request).mockRejectedValueOnce({ + name: 'SecurityError', + message: 'User gesture required', + }); + + await expect(connector.connect('test-app', [TEST_CHAIN])).rejects.toThrow( + 'Ledger connection requires user interaction. Please click the connect button to connect your Ledger device.' + ); + }); + + it('should throw error when address retrieval fails', async () => { + mockApp.getAddressEd25519.mockResolvedValueOnce({ + address: null, + pubKey: null, + }); + + await expect(connector.connect('test-app', [TEST_CHAIN])).rejects.toThrow( + 'Failed to retrieve address from Ledger.' + ); + }); + + it('should emit connect event', async () => { + const connectSpy = vi.fn(); + connector.on('connect', connectSpy); + + await connector.connect('test-app', [TEST_CHAIN]); + + expect(connectSpy).toHaveBeenCalledWith([ + expect.objectContaining({ + address: TEST_ADDRESS, + }), + ]); + }); + + it('should cleanup on connection failure', async () => { + const { default: TransportWebUSB } = await import('@ledgerhq/hw-transport-webusb'); + const transport = TransportWebUSB as any; + vi.mocked(transport.create).mockRejectedValueOnce({ + name: 'SecurityError', + message: 'User gesture required', + }); + vi.mocked(transport.request).mockRejectedValueOnce({ + name: 'SecurityError', + message: 'User gesture required', + }); + + await expect(connector.connect('test-app', [TEST_CHAIN])).rejects.toThrow( + 'Ledger connection requires user interaction' + ); + + const accounts = await connector.getAccounts(); + expect(accounts).toEqual([]); + }); + + it('should handle public key as array', async () => { + mockApp.getAddressEd25519.mockResolvedValueOnce({ + address: TEST_ADDRESS, + pubKey: Array.from(TEST_PUBLIC_KEY), + }); + + const accounts = await connector.connect('test-app', [TEST_CHAIN]); + + expect(accounts![0].publicKey).toBeDefined(); + }); + + it('should handle public key as Uint8Array', async () => { + mockApp.getAddressEd25519.mockResolvedValueOnce({ + address: TEST_ADDRESS, + pubKey: TEST_PUBLIC_KEY, + }); + + const accounts = await connector.connect('test-app', [TEST_CHAIN]); + + expect(accounts![0].publicKey).toBeDefined(); + }); + }); + + describe('disconnection', () => { + beforeEach(async () => { + mockTransport.device.opened = true; + await connector.connect('test-app', [TEST_CHAIN]); + }); + + it('should cleanup all resources on disconnect', async () => { + await connector.disconnect(); + + const accounts = await connector.getAccounts(); + expect(accounts).toEqual([]); + expect(mockTransport.close).toHaveBeenCalled(); + }); + + it('should emit disconnect event', async () => { + const disconnectSpy = vi.fn(); + connector.on('disconnect', disconnectSpy); + + await connector.disconnect(); + + expect(disconnectSpy).toHaveBeenCalled(); + }); + + it('should handle transport close errors gracefully', async () => { + mockTransport.close.mockRejectedValueOnce(new Error('Close failed')); + + await connector.disconnect(); + + const accounts = await connector.getAccounts(); + expect(accounts).toEqual([]); + }); + }); + + describe('message signing', () => { + beforeEach(async () => { + await connector.connect('test-app', [TEST_CHAIN]); + }); + + it('should throw for signRaw (not supported)', async () => { + await expect(connector.signMessage('hello world', TEST_ADDRESS)).rejects.toThrow( + 'Ledger not supported signRaw!' + ); + }); + }); + + describe('transaction signing', () => { + const mockPayload = { + address: TEST_ADDRESS, + genesisHash: TEST_CHAIN.genesisHash, + method: '0x1234', + nonce: '0x00', + specVersion: '0x1234', + transactionVersion: '0x01', + blockHash: '0xabc', + blockNumber: '0x123', + era: '0x00', + tip: '0x00', + signedExtensions: [], + version: 4, + }; + + beforeEach(async () => { + await connector.connect('test-app', [TEST_CHAIN]); + }); + + it('should throw error when app not connected', async () => { + await connector.disconnect(); + const signer = await connector.getSigner(); + expect(signer).toBeDefined(); + + await expect(signer.signPayload!(mockPayload)).rejects.toThrow('Ledger not connected'); + }); + + it('should throw error when chain not found', async () => { + const signer = await connector.getSigner(); + expect(signer).toBeDefined(); + + await expect( + signer.signPayload!({ + ...mockPayload, + genesisHash: '0xunknown' as `0x${string}`, + }) + ).rejects.toThrow('Chain not found in your configuration chains'); + }); + + it('should close transport after signing', async () => { + const signer = await connector.getSigner(); + expect(signer).toBeDefined(); + + mockTransport.device.opened = true; + await signer.signPayload!(mockPayload); + }); + }); + + describe('account management', () => { + it('should return empty accounts initially', async () => { + const accounts = await connector.getAccounts(); + expect(accounts).toEqual([]); + }); + + it('should return accounts after connection', async () => { + await connector.connect('test-app', [TEST_CHAIN]); + + const accounts = await connector.getAccounts(); + expect(accounts).toHaveLength(1); + expect(accounts[0].address).toBe(TEST_ADDRESS); + }); + }); +}); diff --git a/packages/core/src/connectors/ledger.ts b/packages/core/src/connectors/ledger.ts index a8e2e8c..672d4bd 100644 --- a/packages/core/src/connectors/ledger.ts +++ b/packages/core/src/connectors/ledger.ts @@ -1,20 +1,240 @@ +import type { PolkadotGenericApp } from '@zondax/ledger-substrate'; +import { ExtraSignedExtension, LegacyClient } from 'dedot'; +import { Extrinsic } from 'dedot/codecs'; +import { MerkleizedMetadata } from 'dedot/merkleized-metadata'; +import type { SignerPayloadJSON, SignerPayloadRaw, SignerResult } from 'dedot/types'; +import { hexToU8a, stringToHex, u8aToHex } from 'dedot/utils'; +import { wsProvider } from '../config'; import { ledgerWallet } from '../config/logos/generated'; -import type { WalletConnectConnectorOptions } from '../types'; -import { WalletConnectConnector } from './walletconnect'; - -type WalletConnectConfig = Pick< - WalletConnectConnectorOptions, - 'projectId' | 'relayUrl' | 'metadata' ->; - -export const ledgerConnector = (config: WalletConnectConfig) => { - return new WalletConnectConnector({ - id: 'ledger', - name: 'Ledger', - icon: ledgerWallet, - links: { - browserExtension: 'https://www.ledger.com/ledger-live', - }, - ...config, - }); -}; +import type { Account, Chain, ConnectorLinks, HexString, Signer } from '../types'; +import { BaseConnector } from './base'; + +export interface LedgerConnectorOptions { + chains: Chain[]; +} + +function getBip44Path(accountIndex: number, coinType = 354): string { + return `m/44'/${coinType}'/${accountIndex}'/${0}'/${0}'`; +} + +export class LedgerConnector extends BaseConnector { + readonly id: string = 'ledger'; + readonly name: string = 'Ledger'; + readonly icon = ledgerWallet; + readonly links: ConnectorLinks = {}; + readonly chains: Chain[]; + + private app: PolkadotGenericApp | null = null; + private transport: any | null = null; + private accountIndex = 0; + + constructor(options: LedgerConnectorOptions) { + super(); + this.chains = options.chains; + } + + public isInstalled(): boolean { + return false; + } + + public async isAvailable(): Promise { + if (typeof navigator !== 'undefined' && (navigator as any).usb) { + return true; + } + return false; + } + + private async ensureTransportOpen(): Promise { + if (!this.transport) { + throw new Error('Transport not initialized'); + } + if (!this.transport.device?.opened) { + await this.transport.open(); + } + } + + private async ensureTransportClosed(): Promise { + if (this.transport?.device?.opened) { + await this.transport.close(); + } + } + + public async connect( + _appName: string, + _chains?: Optional, + _targetChainId?: Optional + ): Promise { + if (!(await this.isAvailable())) { + throw new Error('WebUSB is not supported in this browser.'); + } + + try { + const { Buffer } = await import('buffer'); + globalThis.Buffer = Buffer; + + const { default: TransportWebUSB } = await import('@ledgerhq/hw-transport-webusb'); + + try { + this.transport = await TransportWebUSB.create(); + } catch (error: any) { + if (error.name === 'SecurityError' || error.message?.includes('user gesture')) { + throw new Error( + 'Ledger connection requires user interaction. Please click the connect button to connect your Ledger device.' + ); + } + this.transport = await TransportWebUSB.request(); + } + + const { PolkadotGenericApp } = await import('@zondax/ledger-substrate'); + const app = new PolkadotGenericApp(this.transport); + this.app = app; + + await this.ensureTransportOpen(); + const bip44Path = getBip44Path(this.accountIndex); + + const addressResult = await app.getAddressEd25519(bip44Path, 0, false); + + if (!addressResult || !addressResult.address) { + throw new Error('Failed to retrieve address from Ledger.'); + } + + const publicKeyHex: Optional = (addressResult.pubKey as string) + ? `0x${addressResult.pubKey}` + : undefined; + + this.accounts = [ + { + address: addressResult.address, + publicKey: publicKeyHex, + name: 'Ledger Wallet', + type: 'sr25519', + meta: { + source: 'ledger', + accountIndex: 0, + bip44Path, + }, + }, + ]; + + this.signer = await this.getSigner(); + + this.emit('connect', [...this.accounts]); + return [...this.accounts]; + } catch (error: any) { + console.error(`Connector ${this.id}: Connection failed:`, error); + await this.cleanup(); + throw error; + } + } + + public async disconnect(): Promise { + await this.cleanup(); + this.emit('disconnect'); + } + + public async signMessage(message: string, address: string): Promise { + const signer = await this.getSigner(); + + if (!signer) { + throw new Error('No signer provided'); + } + + const dataHex = stringToHex(message); + const result = await signer.signRaw!({ address, data: dataHex, type: 'bytes' }); + return result.signature; + } + + public async getSigner(): Promise { + return { + signRaw: async (raw: SignerPayloadRaw): Promise => { + // todo + throw new Error('Ledger not supported signRaw!'); + }, + signPayload: async (payload: SignerPayloadJSON): Promise => { + if (!this.app) { + throw new Error('Ledger not connected'); + } + + const chain = this.chains.find((c) => c.genesisHash === payload.genesisHash); + + if (!chain) { + throw new Error('Chain not found in your configuration chains'); + } + + await this.ensureTransportOpen(); + + const bip44Path = getBip44Path(this.accountIndex); + + const provider = wsProvider(chain.rpcUrls.webSocket); + const client = new LegacyClient(provider); + + await client.connect(); + + const metadataHex = await provider.send('state_getMetadata', []); + const chainInfo = { + tokenSymbol: chain.nativeCurrency?.symbol || 'DOT', + decimals: chain.nativeCurrency?.decimals || 10, + }; + + const merkleizer = new MerkleizedMetadata(metadataHex, chainInfo); + + const extra = new ExtraSignedExtension(client, { + signerAddress: payload.address, + payloadOptions: { + metadataHash: u8aToHex(merkleizer.digest()), + }, + }); + await extra.init(); + const txRawPayload = extra.toRawPayload(payload.method as HexString).data as HexString; + + const proof = merkleizer.proofForExtrinsicPayload(txRawPayload); + + const payloadBuffer = Buffer.from(hexToU8a(txRawPayload)); + const metadataBuffer = Buffer.from(proof); + + const { signature } = await this.app.signWithMetadataEd25519( + bip44Path, + payloadBuffer, + metadataBuffer + ); + + const { signatureTypeId, callTypeId } = client.registry.metadata!.extrinsic; + const $Signature = client.registry.findCodec(signatureTypeId); + const $Call = client.registry.findCodec(callTypeId); + + const decodedSignature = $Signature.tryDecode(u8aToHex(signature)); + const decodedCall = $Call.tryDecode(payload.method); + + const extrinsic = new Extrinsic(client.registry, decodedCall); + + extrinsic.attachSignature({ + address: payload.address, + signature: decodedSignature, + extra: extra.data, + }); + + return { + id: 0, + signature: u8aToHex(signature), + signedTransaction: extrinsic.toHex(), + }; + }, + }; + } + + private async cleanup(): Promise { + if (this.transport) { + try { + await this.ensureTransportClosed(); + } catch (e) { + console.warn('Error closing transport:', e); + } + } + this.transport = null; + this.app = null; + this.accounts = []; + this.signer = undefined; + } +} + +export const ledgerConnector = (options: LedgerConnectorOptions) => new LedgerConnector(options); diff --git a/packages/core/src/connectors/onekey.test.ts b/packages/core/src/connectors/onekey.test.ts new file mode 100644 index 0000000..ae0e921 --- /dev/null +++ b/packages/core/src/connectors/onekey.test.ts @@ -0,0 +1,16 @@ +import { describe } from 'vitest'; +import { onekeyWallet } from '../config/logos/generated'; +import { onekeyConnector } from './onekey'; +import { createConnectorTestSuite } from './test-helper'; + +describe( + 'onekeyConnector', + createConnectorTestSuite({ + getConnector: () => onekeyConnector(), + expected: { + id: 'OneKey', + name: 'OneKey', + icon: onekeyWallet, + }, + }) +); diff --git a/packages/core/src/connectors/onekey.ts b/packages/core/src/connectors/onekey.ts new file mode 100644 index 0000000..12e1d56 --- /dev/null +++ b/packages/core/src/connectors/onekey.ts @@ -0,0 +1,14 @@ +import { onekeyWallet } from '../config/logos/generated'; +import { InjectConnector } from './inject'; + +export const onekeyConnector = () => { + return new InjectConnector({ + id: 'OneKey', + name: 'OneKey', + icon: onekeyWallet, + links: { + browserExtension: + 'https://chromewebstore.google.com/detail/onekey-secure-crypto-wall/jnmbobjmhlngoefaiojfljckilhhlhcj', + }, + }); +}; diff --git a/packages/core/src/connectors/walletconnect.ts b/packages/core/src/connectors/walletconnect.ts index 551e17d..80825ca 100644 --- a/packages/core/src/connectors/walletconnect.ts +++ b/packages/core/src/connectors/walletconnect.ts @@ -19,14 +19,14 @@ export class WalletConnectConnector extends BaseConnector { readonly icon: string; readonly links: ConnectorLinks; - private provider?: IUniversalProvider; + private provider?: Optional; private projectId: string; private relayUrl: string; - private metadata?: Metadata; + private metadata?: Optional; private supportedChains: HexString[] = []; - private session?: SessionTypes.Struct; - private connectedChains?: Chain[] | HexString[]; + private session?: Optional; + private connectedChains?: Optional; private unsubscribe: (() => void) | null = null; @@ -59,7 +59,7 @@ export class WalletConnectConnector extends BaseConnector { }); } - public async connect(appName: string, chains?: Chain[]): Promise> { + public async connect(appName: string, chains?: Optional): Promise> { if (!this.projectId) { throw new Error( `${this.name} requires a projectId. Please visit https://cloud.walletconnect.com to get one.` @@ -326,7 +326,6 @@ export class WalletConnectConnector extends BaseConnector { try { const sessionDeleteHandler = async () => { - console.log(`Connector ${this.id}: Session deleted, disconnecting...`); await this.cleanup(); this.emit('disconnect'); }; @@ -344,7 +343,6 @@ export class WalletConnectConnector extends BaseConnector { if (this.unsubscribe) { this.unsubscribe(); this.unsubscribe = null; - console.log(`Connector ${this.id}: Unsubscribed from events.`); } } diff --git a/packages/core/src/types/account.ts b/packages/core/src/types/account.ts index 2e36141..f70c618 100644 --- a/packages/core/src/types/account.ts +++ b/packages/core/src/types/account.ts @@ -14,29 +14,29 @@ export interface Account { address: string; /** account name (if any) */ - name?: string; + name?: Optional; /** * account public key (hex format, without 0x prefix) * used for cross-chain address conversion and verification */ - publicKey?: HexString; + publicKey?: Optional; /** * other metadata * including account source, control method, etc. */ - meta?: { + meta?: Optional<{ /** account source (e.g. 'polkadot-js', 'subwallet-js', 'talisman' etc.) */ - source?: string; + source?: Optional; /** genesis hash (if the wallet provides a specific chain account) */ - genesisHash?: string | null; + genesisHash?: Optional; /** other custom metadata */ [key: string]: any; - }; - type?: KeypairType; + }>; + type?: Optional; } /** @@ -65,12 +65,14 @@ export interface AccountBalance { formattedTotal: string; /** lock details (if any) */ - locks?: Array<{ - id: string; - amount: bigint; - reason: string; - lockHuman: string; - }>; + locks?: Optional< + Array<{ + id: string; + amount: bigint; + reason: string; + lockHuman: string; + }> + >; } /** diff --git a/packages/core/src/types/chain.ts b/packages/core/src/types/chain.ts index bc87deb..90774ca 100644 --- a/packages/core/src/types/chain.ts +++ b/packages/core/src/types/chain.ts @@ -14,22 +14,22 @@ export interface Chain { rpcUrls: { webSocket: Transport; - http?: readonly string[]; + http?: Optional; }; ss58Format: number; - blockExplorers?: { - default?: { name: string; url: string }; - [key: string]: { name: string; url: string } | undefined; - }; + blockExplorers?: Optional<{ + default?: Optional<{ name: string; url: string }>; + [key: string]: Optional<{ name: string; url: string }>; + }>; testnet: boolean; chainIconUrl: string; - subscan?: { + subscan?: Optional<{ api: string; url: string; - }; + }>; } diff --git a/packages/core/src/types/config.ts b/packages/core/src/types/config.ts index 932687d..fd102c9 100644 --- a/packages/core/src/types/config.ts +++ b/packages/core/src/types/config.ts @@ -19,23 +19,23 @@ export interface LunoStorage { export type Transport = Readonly; type LunoApiOptions = Partial> & { - customTypes?: Record; - customRpc?: Record; + customTypes?: Optional>; + customRpc?: Optional>; }; export interface CreateConfigParameters extends LunoApiOptions { - appName?: string; - chains?: readonly Chain[]; + appName?: Optional; + chains?: Optional; connectors: Connector[]; - transports?: Record; + transports?: Optional>; - storage?: LunoStorage; - autoConnect?: boolean; - subscan?: { + storage?: Optional; + autoConnect?: Optional; + subscan?: Optional<{ apiKey: string; - cacheTime?: number; - retryCount?: number; - }; + cacheTime?: Optional; + retryCount?: Optional; + }>; } export interface Config extends LunoApiOptions { @@ -45,9 +45,9 @@ export interface Config extends LunoApiOptions { readonly transports: Readonly>; readonly storage: LunoStorage; readonly autoConnect: boolean; - readonly subscan?: { + readonly subscan?: Optional<{ apiKey: string; - cacheTime?: number; - retryCount?: number; - }; + cacheTime?: Optional; + retryCount?: Optional; + }>; } diff --git a/packages/core/src/types/connector.ts b/packages/core/src/types/connector.ts index cc7f8bb..760400b 100644 --- a/packages/core/src/types/connector.ts +++ b/packages/core/src/types/connector.ts @@ -5,8 +5,8 @@ import type { Chain } from './chain'; import type { Signer } from './signer'; export interface ConnectorLinks { - browserExtension?: string; - deepLink?: string; + browserExtension?: Optional; + deepLink?: Optional; } export interface Connector extends EventEmitter { @@ -18,8 +18,8 @@ export interface Connector extends EventEmitter { isInstalled: () => boolean; connect( appName: string, - chains?: Chain[], - targetChainId?: string + chains?: Optional, + targetChainId?: Optional ): Promise; disconnect(): Promise; getAccounts(): Promise>; @@ -38,12 +38,12 @@ export interface Connector extends EventEmitter { } export interface WalletConnectConnectorOptions { - id?: string; - name?: string; - icon?: string; + id?: Optional; + name?: Optional; + icon?: Optional; projectId: string; - relayUrl?: string; - metadata?: Metadata; - links?: ConnectorLinks; - supportedChains?: HexString[]; + relayUrl?: Optional; + metadata?: Optional; + links?: Optional; + supportedChains?: Optional; } diff --git a/packages/core/src/types/global.d.ts b/packages/core/src/types/global.d.ts index f332b19..25f71cb 100644 --- a/packages/core/src/types/global.d.ts +++ b/packages/core/src/types/global.d.ts @@ -13,4 +13,6 @@ declare global { isNovaWallet: boolean; }; } + + type Optional = T | undefined; } diff --git a/packages/core/src/types/index.ts b/packages/core/src/types/index.ts index 2610e36..7e7102f 100644 --- a/packages/core/src/types/index.ts +++ b/packages/core/src/types/index.ts @@ -4,3 +4,4 @@ export * from './config'; export * from './connector'; export * from './signer'; +export * from './utils'; diff --git a/packages/core/src/types/utils.ts b/packages/core/src/types/utils.ts new file mode 100644 index 0000000..964b0f2 --- /dev/null +++ b/packages/core/src/types/utils.ts @@ -0,0 +1 @@ +export type Optional = T | undefined; diff --git a/packages/core/src/utils/format.ts b/packages/core/src/utils/format.ts index 48f221e..a8d97f2 100644 --- a/packages/core/src/utils/format.ts +++ b/packages/core/src/utils/format.ts @@ -2,7 +2,7 @@ * format balance */ export function formatBalance( - value: string | number | bigint | undefined, + value: Optional, decimals: number = 0, fixedDecimals: number = 4 ): string { @@ -33,7 +33,11 @@ export function formatBalance( /** * format address display */ -export function formatAddress(address?: string, prefixLength = 4, suffixLength = 4): string { +export function formatAddress( + address?: Optional, + prefixLength = 4, + suffixLength = 4 +): string { if (!address) return ''; if (address.length <= prefixLength + suffixLength) return address; diff --git a/packages/react/src/context/LunoContext.ts b/packages/react/src/context/LunoContext.ts index c1af71b..4685f00 100644 --- a/packages/react/src/context/LunoContext.ts +++ b/packages/react/src/context/LunoContext.ts @@ -1,22 +1,22 @@ import type { Account, Chain, Config, Connector, HexString } from '@luno-kit/core/types'; import type { LegacyClient } from 'dedot'; import React from 'react'; -import type { ConnectionStatus } from '../types'; +import type { ConnectionStatus, Optional } from '../types'; export interface LunoContextState { - config?: Config; + config?: Optional; status: ConnectionStatus; - activeConnector?: Connector; + activeConnector?: Optional; accounts: Account[]; - account?: Account; - setAccount: (accountOrPublicKey?: Account | HexString) => void; - currentChainId?: string; - currentChain?: Chain; - currentApi?: LegacyClient; + account?: Optional; + setAccount: (accountOrPublicKey?: Optional) => void; + currentChainId?: Optional; + currentChain?: Optional; + currentApi?: Optional; isApiReady: boolean; apiError: Error | null; - connect: (connectorId: string, targetChainId?: string) => Promise; + connect: (connectorId: string, targetChainId?: Optional) => Promise; disconnect: () => Promise; switchChain: (newChainId: string) => Promise; } diff --git a/packages/react/src/context/LunoProvider.test.tsx b/packages/react/src/context/LunoProvider.test.tsx index 9fec4e1..87d4dd2 100644 --- a/packages/react/src/context/LunoProvider.test.tsx +++ b/packages/react/src/context/LunoProvider.test.tsx @@ -246,13 +246,7 @@ describe('LunoProvider', () => { ); await waitFor(() => { - console.error('All console.log calls:', consoleLogSpy.mock.calls); - expect(mockApi.disconnect).toHaveBeenCalled(); - expect(consoleLogSpy).toHaveBeenCalledWith( - expect.stringContaining('[LunoProvider]: Disconnecting API from previous render cycle:'), - 'Test Chain' - ); }); }); }); @@ -299,12 +293,6 @@ describe('LunoProvider', () => { ); - await waitFor(() => { - expect(consoleLogSpy).toHaveBeenCalledWith( - '[LunoProvider]: AutoConnect disabled or config not set.' - ); - }); - expect(mockStorage.getItem).not.toHaveBeenCalled(); }); @@ -351,26 +339,6 @@ describe('LunoProvider', () => { ); }); }); - - it('should log when no persisted session found', async () => { - mockStorage.getItem.mockResolvedValue(null); - - const TestComponent = () =>
Test Child
; - - render( - - - - ); - - await waitFor(() => { - expect(consoleLogSpy).toHaveBeenCalledWith( - expect.stringContaining( - '[LunoProvider]: AutoConnect No persisted session found or missing data.' - ) - ); - }); - }); }); describe('SS58 Format Validation Effect', () => { diff --git a/packages/react/src/context/LunoProvider.tsx b/packages/react/src/context/LunoProvider.tsx index 02f28d6..16925e3 100644 --- a/packages/react/src/context/LunoProvider.tsx +++ b/packages/react/src/context/LunoProvider.tsx @@ -45,7 +45,6 @@ export const LunoProvider: React.FC = ({ useEffect(() => { if (configFromProps) { - console.log('[LunoProvider] Setting config to store:', configFromProps); _setConfig(configFromProps); } }, [configFromProps]); @@ -74,10 +73,6 @@ export const LunoProvider: React.FC = ({ } if (currentApi && currentApi.status === 'connected') { - console.log( - '[LunoProvider]: Disconnecting API from previous render cycle:', - currentApi.runtimeVersion.specName - ); currentApi .disconnect() .catch((e) => console.error('[LunoProvider] Error disconnecting previous API:', e)); @@ -101,7 +96,6 @@ export const LunoProvider: React.FC = ({ const performAutoConnect = async () => { await sleep(500); if (!configFromProps.autoConnect) { - console.log('[LunoProvider]: AutoConnect disabled or config not set.'); return; } @@ -117,12 +111,9 @@ export const LunoProvider: React.FC = ({ const lastChainId = await configFromProps.storage.getItem(PERSIST_KEY.LAST_CHAIN_ID); if (lastConnectorId) { - console.log( - `[LunoProvider]: AutoConnect Found persisted session: Connector ID "${lastConnectorId}", Chain ID "${lastChainId}"` - ); await connect(lastConnectorId, lastChainId || undefined); } else { - console.log('[LunoProvider]: AutoConnect No persisted session found or missing data.'); + console.warn('[LunoProvider]: AutoConnect No persisted session found or missing data.'); } } catch (error) { console.error('[LunoProvider]: AutoConnect Error during auto-connect process:', error); diff --git a/packages/react/src/hooks/useAccount.ts b/packages/react/src/hooks/useAccount.ts index 1e4cf65..d6ecc08 100644 --- a/packages/react/src/hooks/useAccount.ts +++ b/packages/react/src/hooks/useAccount.ts @@ -1,11 +1,11 @@ import { convertAddress } from '@luno-kit/core/utils'; import { useMemo } from 'react'; -import type { Account } from '../types'; +import type { Account, Optional } from '../types'; import { useLuno } from './useLuno'; export interface UseAccountResult { - account?: Account; - address?: string; + account?: Optional; + address?: Optional; } export const useAccount = (): UseAccountResult => { diff --git a/packages/react/src/hooks/useAccounts.ts b/packages/react/src/hooks/useAccounts.ts index 7ba4909..bfda33a 100644 --- a/packages/react/src/hooks/useAccounts.ts +++ b/packages/react/src/hooks/useAccounts.ts @@ -1,12 +1,12 @@ import type { HexString } from '@luno-kit/core/types'; import { convertAddress } from '@luno-kit/core/utils'; import { useMemo } from 'react'; -import type { Account } from '../types'; +import type { Account, Optional } from '../types'; import { useLuno } from './useLuno'; export interface UseAccountsResult { accounts: Account[]; - selectAccount: (accountOrPublicKey?: Account | HexString) => void; + selectAccount: (accountOrPublicKey?: Optional) => void; } export const useAccounts = (): UseAccountsResult => { diff --git a/packages/react/src/hooks/useApi.ts b/packages/react/src/hooks/useApi.ts index 056507a..d28b1ae 100644 --- a/packages/react/src/hooks/useApi.ts +++ b/packages/react/src/hooks/useApi.ts @@ -1,17 +1,18 @@ import type { LegacyClient } from 'dedot'; +import type { Optional } from '../types'; import { useLuno } from './useLuno'; -export interface UseApiResult { - api?: LegacyClient; +export interface UseApiResult { + api?: Optional; isApiReady: boolean; apiError: Error | null; } -export const useApi = (): UseApiResult => { +export const useApi = (): UseApiResult => { const { currentApi, isApiReady, apiError } = useLuno(); return { - api: currentApi, + api: currentApi as T | undefined, isApiReady, apiError, }; diff --git a/packages/react/src/hooks/useBalance.ts b/packages/react/src/hooks/useBalance.ts index 92cd42f..9c6fda2 100644 --- a/packages/react/src/hooks/useBalance.ts +++ b/packages/react/src/hooks/useBalance.ts @@ -1,6 +1,6 @@ import { formatBalance } from '@luno-kit/core/utils'; import type { LegacyClient } from 'dedot'; -import type { AccountBalance } from '../types'; +import type { AccountBalance, Optional } from '../types'; import { useLuno } from './useLuno'; import { type QueryMultiItem, @@ -19,7 +19,7 @@ interface AccountData { interface BalanceLock { id: string | number; amount: bigint | string | number; - reasons?: string | number; + reasons?: Optional; } export interface ChainProperties { @@ -58,7 +58,7 @@ const transformBalance = (results: any[], chainProperties: ChainProperties) => { }; export interface UseBalanceProps { - address?: string; + address?: Optional; } export type UseBalanceResult = UseSubscriptionResult; diff --git a/packages/react/src/hooks/useConnect.ts b/packages/react/src/hooks/useConnect.ts index ef20ea3..998e212 100644 --- a/packages/react/src/hooks/useConnect.ts +++ b/packages/react/src/hooks/useConnect.ts @@ -1,18 +1,21 @@ -import type { ConnectionStatus, Connector } from '../types'; +import type { ConnectionStatus, Connector, Optional } from '../types'; import { sleep } from '../utils'; import { useLuno } from './useLuno'; import { type LunoMutationOptions, useLunoMutation } from './useLunoMutation'; export interface ConnectVariables { connectorId: string; - targetChainId?: string; + targetChainId?: Optional; } export type UseConnectOptions = LunoMutationOptions; export interface UseConnectResult { - connect: (variables: ConnectVariables, options?: UseConnectOptions) => void; - connectAsync: (variables: ConnectVariables, options?: UseConnectOptions) => Promise; + connect: (variables: ConnectVariables, options?: Optional) => void; + connectAsync: ( + variables: ConnectVariables, + options?: Optional + ) => Promise; connectors: Connector[]; activeConnector?: Connector; status: ConnectionStatus; @@ -26,7 +29,7 @@ export interface UseConnectResult { variables: ConnectVariables | undefined; } -export const useConnect = (hookLevelConfig?: UseConnectOptions): UseConnectResult => { +export const useConnect = (hookLevelConfig?: Optional): UseConnectResult => { const { connect, config, activeConnector, status } = useLuno(); const connectFn = async (variables: ConnectVariables): Promise => { diff --git a/packages/react/src/hooks/useDisconnect.ts b/packages/react/src/hooks/useDisconnect.ts index 25ebf82..17ba160 100644 --- a/packages/react/src/hooks/useDisconnect.ts +++ b/packages/react/src/hooks/useDisconnect.ts @@ -1,12 +1,12 @@ -import type { ConnectionStatus } from '../types'; +import type { ConnectionStatus, Optional } from '../types'; import { useLuno } from './useLuno'; import { type LunoMutationOptions, useLunoMutation } from './useLunoMutation'; export type UseDisconnectOptions = LunoMutationOptions; export interface UseDisconnectResult { - disconnect: (options?: UseDisconnectOptions) => void; - disconnectAsync: (options?: UseDisconnectOptions) => Promise; + disconnect: (options?: Optional) => void; + disconnectAsync: (options?: Optional) => Promise; status: ConnectionStatus; data: undefined; error: Error | null; @@ -17,7 +17,9 @@ export interface UseDisconnectResult { reset: () => void; } -export const useDisconnect = (hookLevelConfig?: UseDisconnectOptions): UseDisconnectResult => { +export const useDisconnect = ( + hookLevelConfig?: Optional +): UseDisconnectResult => { const { disconnect, status } = useLuno(); const disconnectFn = async (): Promise => { diff --git a/packages/react/src/hooks/useEstimatePaymentInfo.ts b/packages/react/src/hooks/useEstimatePaymentInfo.ts index 292f77e..b5826b5 100644 --- a/packages/react/src/hooks/useEstimatePaymentInfo.ts +++ b/packages/react/src/hooks/useEstimatePaymentInfo.ts @@ -1,6 +1,7 @@ import { formatBalance } from '@luno-kit/core/utils'; import type { ISubmittableExtrinsic, TxPaymentInfo } from 'dedot/types'; import { useCallback, useState } from 'react'; +import type { Optional } from '../types'; import { useLuno } from './useLuno'; interface PaymentInfo extends TxPaymentInfo { @@ -16,7 +17,7 @@ export function useEstimatePaymentInfo() { const estimate = useCallback( async ( extrinsic: ISubmittableExtrinsic, - senderAddress?: string + senderAddress?: Optional ): Promise => { const sender = senderAddress || account?.address; if (!extrinsic || !sender || !currentChain) return; diff --git a/packages/react/src/hooks/useGenesisHash.test.ts b/packages/react/src/hooks/useGenesisHash.test.ts index e44a1d5..15525fa 100644 --- a/packages/react/src/hooks/useGenesisHash.test.ts +++ b/packages/react/src/hooks/useGenesisHash.test.ts @@ -28,7 +28,6 @@ describe('useGenesisHash', () => { expect(result.current.useLuno.currentApi).toBeDefined(); expect(result.current.useLuno.isApiReady).toBe(true); }); - console.log('result.current.useGenesisHash', result.current.useGenesisHash); await waitFor(() => { expect(result.current.useGenesisHash.isLoading).toBe(false); diff --git a/packages/react/src/hooks/useSendTransaction.test.ts b/packages/react/src/hooks/useSendTransaction.test.ts index 8d800d8..23b08eb 100644 --- a/packages/react/src/hooks/useSendTransaction.test.ts +++ b/packages/react/src/hooks/useSendTransaction.test.ts @@ -12,6 +12,9 @@ const mockExtrinsic = { }; const mockApi = { + registry: { + findErrorMeta: vi.fn(), + }, tx: { balances: { transferKeepAlive: vi.fn().mockReturnValue(mockExtrinsic), @@ -62,6 +65,9 @@ test('useSendTransaction', async () => { expect(result.current.useApi.isApiReady).toBeTruthy(); }); + expect(result.current.useSendTransaction.txStatus).toBe('idle'); + expect(result.current.useSendTransaction.detailedStatus).toBe('idle'); + const sendPromise = result.current.useSendTransaction.sendTransactionAsync({ extrinsic: mockExtrinsic, }); @@ -70,6 +76,30 @@ test('useSendTransaction', async () => { expect(mockExtrinsic.signAndSend).toHaveBeenCalled(); }); + expect(result.current.useSendTransaction.txStatus).toBe('signing'); + + await act(async () => { + statusCallback({ + status: { type: 'Broadcasting' }, + events: [], + txHash: '0x123', + }); + }); + + expect(result.current.useSendTransaction.txStatus).toBe('pending'); + expect(result.current.useSendTransaction.detailedStatus).toBe('broadcasting'); + + await act(async () => { + statusCallback({ + status: { type: 'BestChainBlockIncluded', value: { blockHash: '0xabc', blockNumber: 123 } }, + events: [], + txHash: '0x123', + }); + }); + + expect(result.current.useSendTransaction.txStatus).toBe('pending'); + expect(result.current.useSendTransaction.detailedStatus).toBe('inBlock'); + await act(async () => { statusCallback({ status: { type: 'Finalized', value: { blockHash: '0xabc', blockNumber: 123 } }, @@ -84,6 +114,7 @@ test('useSendTransaction', async () => { expect(receipt.status).toBe('success'); expect(receipt.transactionHash).toBe('0x123'); expect(receipt.blockNumber).toBe(123); + expect(result.current.useSendTransaction.txStatus).toBe('success'); expect(result.current.useSendTransaction.detailedStatus).toBe('finalized'); }); @@ -119,6 +150,8 @@ test('should handle transaction error states', async () => { expect(result.current.useApi.isApiReady).toBeTruthy(); }); + expect(result.current.useSendTransaction.txStatus).toBe('idle'); + result.current.useSendTransaction .sendTransactionAsync({ extrinsic: mockExtrinsic, @@ -129,6 +162,8 @@ test('should handle transaction error states', async () => { expect(mockExtrinsic.signAndSend).toHaveBeenCalled(); }); + expect(result.current.useSendTransaction.txStatus).toBe('signing'); + await act(async () => { statusCallback({ status: { type: 'Invalid' }, @@ -144,3 +179,78 @@ test('should handle transaction error states', async () => { expect(result.current.useSendTransaction.detailedStatus).toBe('invalid'); }); }); + +test('should resolve at inBlock when waitFor is inBlock', async () => { + let resolveSignAndSend: (value: any) => void; + let statusCallback: any; + + mockExtrinsic.signAndSend.mockImplementation((address, { signer }, callback) => { + statusCallback = callback; + return new Promise((resolve) => { + resolveSignAndSend = resolve; + }); + }); + + const { result } = renderHook( + () => ({ + useConnect: useConnect(), + useApi: useApi(), + useSendTransaction: useSendTransaction({ waitFor: 'inBlock' }), + }), + { + config: mockConfig, + } + ); + + await act(async () => { + await result.current.useConnect.connectAsync({ + connectorId: connector.id, + }); + }); + + await waitFor(() => { + expect(result.current.useApi.isApiReady).toBeTruthy(); + }); + + expect(result.current.useSendTransaction.txStatus).toBe('idle'); + expect(result.current.useSendTransaction.detailedStatus).toBe('idle'); + + const sendPromise = result.current.useSendTransaction.sendTransactionAsync({ + extrinsic: mockExtrinsic, + }); + + await waitFor(() => { + expect(mockExtrinsic.signAndSend).toHaveBeenCalled(); + }); + + expect(result.current.useSendTransaction.txStatus).toBe('signing'); + + await act(async () => { + statusCallback({ + status: { type: 'Broadcasting' }, + events: [], + txHash: '0x123', + }); + }); + + expect(result.current.useSendTransaction.txStatus).toBe('pending'); + expect(result.current.useSendTransaction.detailedStatus).toBe('broadcasting'); + + await act(async () => { + statusCallback({ + status: { type: 'BestChainBlockIncluded', value: { blockHash: '0xabc', blockNumber: 123 } }, + events: [], + txHash: '0x123', + }); + resolveSignAndSend(() => {}); + }); + + const receipt = await sendPromise; + + expect(receipt.status).toBe('success'); + expect(receipt.transactionHash).toBe('0x123'); + expect(receipt.blockHash).toBe('0xabc'); + expect(receipt.blockNumber).toBe(123); + expect(result.current.useSendTransaction.txStatus).toBe('success'); + expect(result.current.useSendTransaction.detailedStatus).toBe('inBlock'); +}); diff --git a/packages/react/src/hooks/useSendTransaction.ts b/packages/react/src/hooks/useSendTransaction.ts index ed9edd3..f5002c4 100644 --- a/packages/react/src/hooks/useSendTransaction.ts +++ b/packages/react/src/hooks/useSendTransaction.ts @@ -6,7 +6,7 @@ import type { ISubmittableResult, } from 'dedot/types'; import { useCallback, useState } from 'react'; -import type { TxStatus } from '../types'; +import type { Optional, TxStatus } from '../types'; import { getReadableDispatchError } from '../utils'; import { useAccount } from './useAccount'; import { useLuno } from './useLuno'; @@ -29,27 +29,33 @@ export interface TransactionReceipt { dispatchError?: DispatchError; errorMessage?: string; dispatchInfo?: DispatchInfo; + rawReceipt: ISubmittableResult; } export interface SendTransactionVariables { extrinsic: ISubmittableExtrinsic; } +export interface UseSendTransactionConfig { + waitFor?: Optional<'inBlock' | 'finalized'>; +} + export type UseSendTransactionOptions = LunoMutationOptions< TransactionReceipt, Error, SendTransactionVariables, unknown ->; +> & + UseSendTransactionConfig; export interface UseSendTransactionResult { sendTransaction: ( variables: SendTransactionVariables, - options?: UseSendTransactionOptions + options?: Optional ) => void; sendTransactionAsync: ( variables: SendTransactionVariables, - options?: UseSendTransactionOptions + options?: Optional ) => Promise; data: TransactionReceipt | undefined; error: Error | null; @@ -65,7 +71,7 @@ export interface UseSendTransactionResult { } export function useSendTransaction( - hookLevelConfig?: UseSendTransactionOptions + hookLevelConfig?: Optional ): UseSendTransactionResult { const { activeConnector, currentApi, isApiReady } = useLuno(); const { account } = useAccount(); @@ -74,8 +80,12 @@ export function useSendTransaction( const [detailedTxStatus, setDetailedTxStatus] = useState('idle'); const [txError, setTxError] = useState(null); + const waitFor = hookLevelConfig?.waitFor ?? 'finalized'; + const sendTransactionFn = useCallback( async (variables: SendTransactionVariables): Promise => { + setTxStatus('idle'); + setDetailedTxStatus('idle'); if (!currentApi || !isApiReady) { throw new Error('[useSendTransaction]: Polkadot API is not ready.'); } @@ -97,7 +107,6 @@ export function useSendTransaction( } setTxStatus('signing'); - setDetailedTxStatus('idle'); return new Promise((resolve, reject) => { let unsubscribe: (() => void) | undefined; @@ -106,7 +115,14 @@ export function useSendTransaction( .signAndSend( account.address, { signer }, - ({ status, dispatchError, events, dispatchInfo, txHash }: ISubmittableResult) => { + ({ + status, + dispatchError, + events, + dispatchInfo, + txHash, + ...rest + }: ISubmittableResult) => { const resolveAndUnsubscribe = (receipt: TransactionReceipt) => { if (unsubscribe) unsubscribe(); resolve(receipt); @@ -118,38 +134,55 @@ export function useSendTransaction( reject(error); }; + const createReceipt = ( + blockHash: HexString, + blockNumber: number | undefined, + error: DispatchError | undefined + ): TransactionReceipt => { + const hasError = Boolean(error); + return { + transactionHash: txHash, + blockHash: blockHash, + blockNumber, + events, + status: hasError ? 'failed' : 'success', + dispatchError: error || undefined, + errorMessage: error ? getReadableDispatchError(currentApi, error) : undefined, + dispatchInfo, + rawReceipt: { status, dispatchError, events, dispatchInfo, txHash, ...rest }, + }; + }; + switch (status.type) { case 'Broadcasting': + setTxStatus('pending'); setDetailedTxStatus('broadcasting'); break; case 'BestChainBlockIncluded': + setTxStatus('pending'); setDetailedTxStatus('inBlock'); + if (waitFor === 'inBlock') { + setTxStatus(dispatchError ? 'failed' : 'success'); + resolveAndUnsubscribe( + createReceipt( + status.value?.blockHash, + status.value?.blockNumber, + dispatchError + ) + ); + } break; case 'Finalized': - setTxStatus('success'); setDetailedTxStatus('finalized'); - if (dispatchError) { - resolveAndUnsubscribe({ - transactionHash: txHash, - blockHash: status.value?.blockHash, - blockNumber: status.value?.blockNumber, - events, - status: 'failed', - dispatchError, - errorMessage: getReadableDispatchError(currentApi, dispatchError), - dispatchInfo, - }); - } else { - resolveAndUnsubscribe({ - transactionHash: txHash, - blockHash: status.value?.blockHash, - blockNumber: status.value?.blockNumber, - events, - status: 'success', - dispatchError: undefined, - errorMessage: undefined, - dispatchInfo, - }); + if (waitFor === 'finalized') { + setTxStatus(dispatchError ? 'failed' : 'success'); + resolveAndUnsubscribe( + createReceipt( + status.value?.blockHash, + status.value?.blockNumber, + dispatchError + ) + ); } break; case 'Invalid': @@ -179,7 +212,7 @@ export function useSendTransaction( }); }); }, - [currentApi, isApiReady, activeConnector, account, setTxStatus, setDetailedTxStatus] + [currentApi, isApiReady, activeConnector, account, setTxStatus, setDetailedTxStatus, waitFor] ); const mutationResult = useLunoMutation< diff --git a/packages/react/src/hooks/useSignMessage.ts b/packages/react/src/hooks/useSignMessage.ts index 4578748..2aef945 100644 --- a/packages/react/src/hooks/useSignMessage.ts +++ b/packages/react/src/hooks/useSignMessage.ts @@ -1,4 +1,5 @@ import { isSameAddress } from '@luno-kit/core/utils'; +import type { Optional } from '../types'; import { useLuno } from './useLuno'; import { type LunoMutationOptions, useLunoMutation } from './useLunoMutation'; @@ -20,10 +21,10 @@ export type UseSignMessageOptions = LunoMutationOptions< >; export interface UseSignMessageResult { - signMessage: (variables: SignMessageVariables, options?: UseSignMessageOptions) => void; + signMessage: (variables: SignMessageVariables, options?: Optional) => void; signMessageAsync: ( variables: SignMessageVariables, - options?: UseSignMessageOptions + options?: Optional ) => Promise; data: SignMessageData | undefined; error: Error | null; @@ -36,7 +37,9 @@ export interface UseSignMessageResult { variables: SignMessageVariables | undefined; } -export function useSignMessage(hookLevelConfig?: UseSignMessageOptions): UseSignMessageResult { +export function useSignMessage( + hookLevelConfig?: Optional +): UseSignMessageResult { const { activeConnector, account, accounts } = useLuno(); const mutationFn = async (variables: SignMessageVariables): Promise => { diff --git a/packages/react/src/hooks/useSubscription.ts b/packages/react/src/hooks/useSubscription.ts index 658ced5..f3c28dc 100644 --- a/packages/react/src/hooks/useSubscription.ts +++ b/packages/react/src/hooks/useSubscription.ts @@ -2,6 +2,7 @@ import { useQuery, useQueryClient } from '@tanstack/react-query'; import type { LegacyClient } from 'dedot'; import type { Callback, GenericStorageQuery, Unsub } from 'dedot/types'; import { useEffect, useMemo, useRef, useState } from 'react'; +import type { Optional } from '../types'; import { useLuno } from './useLuno'; type SubscriptionFn = ( @@ -9,9 +10,9 @@ type SubscriptionFn = ( ) => Promise<() => Promise>; export interface UseSubscriptionOptions { - enabled?: boolean; - transform?: (data: TData) => TTransformed; - defaultValue?: TTransformed; + enabled?: Optional; + transform?: Optional<(data: TData) => TTransformed>; + defaultValue?: Optional; } type ApiBoundSubscriptionFactory = ( diff --git a/packages/react/src/hooks/useSwitchChain.ts b/packages/react/src/hooks/useSwitchChain.ts index 2c688a4..d94f161 100644 --- a/packages/react/src/hooks/useSwitchChain.ts +++ b/packages/react/src/hooks/useSwitchChain.ts @@ -1,4 +1,4 @@ -import type { Chain } from '../types'; +import type { Chain, Optional } from '../types'; import { useLuno } from './useLuno'; import { type LunoMutationOptions, useLunoMutation } from './useLunoMutation'; @@ -9,10 +9,10 @@ export interface SwitchChainVariables { export type UseSwitchChainOptions = LunoMutationOptions; export interface UseSwitchChainResult { - switchChain: (variables: SwitchChainVariables, options?: UseSwitchChainOptions) => void; + switchChain: (variables: SwitchChainVariables, options?: Optional) => void; switchChainAsync: ( variables: SwitchChainVariables, - options?: UseSwitchChainOptions + options?: Optional ) => Promise; chains: Chain[]; currentChain?: Chain; @@ -27,7 +27,9 @@ export interface UseSwitchChainResult { variables: SwitchChainVariables | undefined; } -export const useSwitchChain = (hookLevelConfig?: UseSwitchChainOptions): UseSwitchChainResult => { +export const useSwitchChain = ( + hookLevelConfig?: Optional +): UseSwitchChainResult => { const { switchChain: storeSwitchChain, config, currentChain, currentChainId } = useLuno(); const switchChainFn = async (variables: SwitchChainVariables): Promise => { diff --git a/packages/react/src/store/createLunoStore.test.ts b/packages/react/src/store/createLunoStore.test.ts index 1b95c6b..86f79df 100644 --- a/packages/react/src/store/createLunoStore.test.ts +++ b/packages/react/src/store/createLunoStore.test.ts @@ -371,7 +371,7 @@ describe('createLunoStore', () => { mockConnector.connect.mockRejectedValue(new Error('Connection failed')); await expect(store.connect('test-connector')).rejects.toThrow( - '[LunoStore] Error connecting with Test Connector: Connection failed' + 'Test Connector: Connection failed' ); const state = useLunoStore.getState(); @@ -415,18 +415,6 @@ describe('createLunoStore', () => { expect(mockStorage.removeItem).toHaveBeenCalledWith(PERSIST_KEY.LAST_SELECTED_ACCOUNT_INFO); }); - it('should handle no active connector gracefully', async () => { - useLunoStore.setState({ activeConnector: undefined }); - const consoleSpy = vi.spyOn(console, 'log').mockImplementation(() => {}); - - await store.disconnect(); - - expect(consoleSpy).toHaveBeenCalledWith( - expect.stringContaining('No active connector or already disconnected') - ); - consoleSpy.mockRestore(); - }); - it('should handle disconnect failure', async () => { mockConnector.disconnect.mockRejectedValue(new Error('Disconnect failed')); @@ -489,15 +477,6 @@ describe('createLunoStore', () => { expect(mockStorage.setItem).toHaveBeenCalledWith(PERSIST_KEY.LAST_CHAIN_ID, '0x456'); }); - it('should skip when already on target chain', async () => { - const consoleSpy = vi.spyOn(console, 'log').mockImplementation(() => {}); - - await store.switchChain('0x123'); - - expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining('Already on chain 0x123')); - consoleSpy.mockRestore(); - }); - it('should throw error when config not initialized', async () => { useLunoStore.setState({ config: undefined }); diff --git a/packages/react/src/store/createLunoStore.ts b/packages/react/src/store/createLunoStore.ts index 35c840e..17718b6 100644 --- a/packages/react/src/store/createLunoStore.ts +++ b/packages/react/src/store/createLunoStore.ts @@ -114,7 +114,6 @@ export const useLunoStore = create((set, get) => ({ PERSIST_KEY.RECENT_SELECTED_ACCOUNT_INFO, JSON.stringify(accountInfo) ); - console.log(`[LunoStore] Persisted selected account: ${nextAccount.address}`); } catch (e) { console.error('[LunoStore] Failed to persist selected account:', e); } @@ -140,20 +139,13 @@ export const useLunoStore = create((set, get) => ({ const previouslyActiveConnector = get().activeConnector; if (previouslyActiveConnector && previouslyActiveConnector.id !== connector.id) { - console.log( - `[LunoStore] Switching connector. Cleaning up listeners for old connector: ${previouslyActiveConnector.id}` - ); cleanupActiveConnectorListeners(); } else if (previouslyActiveConnector && previouslyActiveConnector.id === connector.id) { - console.log( - `[LunoStore] Attempting to reconnect with the same connector: ${connector.id}. Cleaning up existing listeners.` - ); cleanupActiveConnectorListeners(); } try { const handleAccountsChanged = async (newAccounts: Account[]) => { - console.log(`[LunoStore] accountsChanged event from ${connector.name}:`, newAccounts); if (newAccounts.length === 0) { await get().disconnect(); return; @@ -197,15 +189,11 @@ export const useLunoStore = create((set, get) => ({ }; const handleDisconnect = () => { - console.log(`[LunoStore] disconnect event from ${connector.name}`); if (get().activeConnector?.id === connector.id) { cleanupActiveConnectorListeners(); try { config.storage.removeItem(PERSIST_KEY.LAST_CONNECTOR_ID); config.storage.removeItem(PERSIST_KEY.LAST_CHAIN_ID); - console.log( - '[LunoStore] Removed persisted connection info from storage due to disconnect event.' - ); } catch (e) { console.error('[LunoStore] Failed to remove connection info from storage:', e); } @@ -262,13 +250,6 @@ export const useLunoStore = create((set, get) => ({ if (restoredAccount) { selectedAccount = restoredAccount; - console.log( - `[LunoStore] Restored previously selected account: ${selectedAccount.address}` - ); - } else { - console.log( - '[LunoStore] Previously selected account not found in current accounts list, using first account' - ); } } } catch (e) { @@ -300,7 +281,6 @@ export const useLunoStore = create((set, get) => ({ PERSIST_KEY.RECENT_SELECTED_ACCOUNT_INFO, JSON.stringify(storedAccountInfo) ); - console.log(`[LunoStore] Persisted connectorId: ${connector.id}`); } catch (e) { console.error('[LunoStore] Failed to persist connectorId to storage:', e); } @@ -320,7 +300,6 @@ export const useLunoStore = create((set, get) => ({ } try { config.storage.setItem(PERSIST_KEY.LAST_CHAIN_ID, chainIdToSet); - console.log(`[LunoStore] Persisted chainId: ${chainIdToSet}`); } catch (e) { console.error('[LunoStore] Failed to persist chainId to storage:', e); } @@ -343,9 +322,7 @@ export const useLunoStore = create((set, get) => ({ accounts: [], }); - throw new Error( - `[LunoStore] Error connecting with ${connector.name}: ${err?.message || err}` - ); + throw new Error(`${connector.name}: ${err?.message || err}`); } }, @@ -357,9 +334,6 @@ export const useLunoStore = create((set, get) => ({ status === ConnectionStatus.Disconnecting || status === ConnectionStatus.Disconnected ) { - console.log( - '[LunoStore] No active connector or already disconnected/disconnecting. Disconnect action aborted.' - ); return; } @@ -369,13 +343,9 @@ export const useLunoStore = create((set, get) => ({ if (config) { try { - console.log( - '[LunoStore] Attempting to remove persisted connection info due to user disconnect action...' - ); await config.storage.removeItem(PERSIST_KEY.LAST_CONNECTOR_ID); await config.storage.removeItem(PERSIST_KEY.LAST_CHAIN_ID); await config.storage.removeItem(PERSIST_KEY.LAST_SELECTED_ACCOUNT_INFO); - console.log('[LunoStore] Removed persisted connection info from storage.'); } catch (e) { console.error( '[LunoStore] Failed to remove connection info from storage during disconnect action:', @@ -412,7 +382,6 @@ export const useLunoStore = create((set, get) => ({ throw new Error('[LunoStore] LunoConfig has not been initialized. Cannot switch chain.'); } if (newChainId === currentChainId) { - console.log(`[LunoStore] Already on chain ${newChainId}. No switch needed.`); return; } @@ -430,7 +399,6 @@ export const useLunoStore = create((set, get) => ({ console.warn('[LunoStore] Failed to disconnect from previous chain:', e); } - console.log(`[LunoStore] Attempting to switch chain to ${newChain.name} (ID: ${newChainId})`); set({ currentChainId: newChainId, currentChain: newChain, diff --git a/packages/ui/src/components/ConnectButton/index.tsx b/packages/ui/src/components/ConnectButton/index.tsx index c7e7b1b..4148bab 100644 --- a/packages/ui/src/components/ConnectButton/index.tsx +++ b/packages/ui/src/components/ConnectButton/index.tsx @@ -1,3 +1,4 @@ +import type { Optional } from '@luno-kit/react/types'; import { formatAddress } from '@luno-kit/react/utils'; import type React from 'react'; import { useConnectButton, useWindowSize } from '../../hooks'; @@ -8,12 +9,12 @@ export const transitionClassName = 'luno:transition-transform luno:transition-[125] luno:hover:scale-[1.03] luno:transition-ease'; export interface ConnectButtonProps { - className?: string; - label?: string; - accountStatus?: 'full' | 'address'; - chainStatus?: 'full' | 'icon' | 'name' | 'none'; - showBalance?: boolean; - displayPreference?: 'address' | 'name'; + className?: Optional; + label?: Optional; + accountStatus?: Optional<'full' | 'address'>; + chainStatus?: Optional<'full' | 'icon' | 'name' | 'none'>; + showBalance?: Optional; + displayPreference?: Optional<'address' | 'name'>; } export const ConnectButton: React.FC = ({ diff --git a/packages/ui/src/components/ConnectModal/ConnectOptions.tsx b/packages/ui/src/components/ConnectModal/ConnectOptions.tsx index 98bc1f3..b25f4ea 100644 --- a/packages/ui/src/components/ConnectModal/ConnectOptions.tsx +++ b/packages/ui/src/components/ConnectModal/ConnectOptions.tsx @@ -17,7 +17,7 @@ const popularConnectorIds = [ 'nova-mobile', ]; -const moreConnectorIds = ['polkagate', 'fearless-wallet', 'mimir', 'enkrypt']; +const moreConnectorIds = ['ledger', 'polkagate', 'fearless-wallet', 'mimir', 'enkrypt', 'OneKey']; export const ConnectOptions = React.memo(({ onConnect }: Props) => { const connectors = useConnectors(); @@ -48,7 +48,9 @@ export const ConnectOptions = React.memo(({ onConnect }: Props) => { }, [installedConnectors, popularConnectors, moreConnectors]); if (isMobileDevice()) { - const filteredConnectors = connectors.filter((i) => i.links.deepLink); + const filteredConnectors = connectors + .filter((i) => i.id !== 'polkadot-js') + .filter((i) => i.links.deepLink || i.isInstalled()); return (
diff --git a/packages/ui/src/components/ConnectModal/WalletView.tsx b/packages/ui/src/components/ConnectModal/WalletView.tsx index 25ae30b..354b0c6 100644 --- a/packages/ui/src/components/ConnectModal/WalletView.tsx +++ b/packages/ui/src/components/ConnectModal/WalletView.tsx @@ -1,7 +1,10 @@ import type { Connector } from '@luno-kit/react/types'; -import React from 'react'; +import React, { useMemo } from 'react'; import { Close } from '../../assets/icons'; +import type { AppInfo } from '../../providers'; +import { useLunoTheme } from '../../theme'; import { cs } from '../../utils'; +import { renderAppInfoText } from '../../utils/renderAppInfo'; import { transitionClassName } from '../ConnectButton'; import { Copy } from '../Copy'; import { DialogClose } from '../Dialog'; @@ -16,11 +19,22 @@ interface Props { connectState: { isConnecting: boolean; isError: boolean; + error: Error | null; }; + appInfo?: Partial; } export const WalletView = React.memo( - ({ selectedConnector, onConnect, qrCode, isWide, connectState }: Props) => { + ({ selectedConnector, onConnect, qrCode, isWide, connectState, appInfo }: Props) => { + const { themeMode } = useLunoTheme(); + + const decorativeImage = useMemo(() => { + if (!appInfo?.decorativeImage) return undefined; + const { light, dark } = appInfo.decorativeImage; + const url = themeMode === 'dark' ? dark || light : light; + return { url }; + }, [appInfo?.decorativeImage, themeMode]); + const showQRCode = selectedConnector?.hasConnectionUri(); return ( @@ -100,7 +114,9 @@ export const WalletView = React.memo( 'luno:pb-[10px] luno:text-base luno:text-modalTextSecondary luno:leading-base luno:font-medium luno:text-center' } > - Confirm connection in the extension + {selectedConnector.id === 'ledger' + ? connectState.error?.message + : 'Confirm connection in the extension'}

{connectState.isConnecting && (
@@ -112,12 +128,12 @@ export const WalletView = React.memo( 'luno:cursor-pointer luno:pt-6 luno:text-sm luno:text-accentColor luno:font-medium luno:text-center luno:hover:text-modalText' } > - Don‘t have {selectedConnector.name}? + Don't have {selectedConnector.name}?
)} {!connectState.isConnecting && connectState.isError && - selectedConnector.isInstalled() && ( + (selectedConnector?.isInstalled() || selectedConnector?.id === 'ledger') && (
diff --git a/packages/ui/src/components/ConnectModal/index.tsx b/packages/ui/src/components/ConnectModal/index.tsx index c2e1005..a96c926 100644 --- a/packages/ui/src/components/ConnectModal/index.tsx +++ b/packages/ui/src/components/ConnectModal/index.tsx @@ -1,13 +1,14 @@ import { useConnect } from '@luno-kit/react'; -import type { Connector } from '@luno-kit/react/types'; +import type { Connector, Optional } from '@luno-kit/react/types'; import { isMobileDevice } from '@luno-kit/react/utils'; import type React from 'react'; import { useEffect, useMemo, useState } from 'react'; import { Back, Close } from '../../assets/icons'; import { useWindowSize } from '../../hooks'; import { useAnimatedViews } from '../../hooks/useAnimatedViews'; -import { useConnectModal } from '../../providers'; +import { type AppInfo, useConnectModal } from '../../providers'; import { cs } from '../../utils'; +import { renderAppInfoText } from '../../utils/renderAppInfo'; import { Dialog, DialogClose, DialogTitle, type ModalSize } from '../Dialog'; import { ConnectOptions } from './ConnectOptions'; import { WalletView } from './WalletView'; @@ -18,16 +19,18 @@ export enum ConnectModalView { } export interface ConnectModalProps { - size?: ModalSize; + size?: Optional; + appInfo?: Optional>; } -export const ConnectModal: React.FC = ({ size = 'wide' }) => { +export const ConnectModal: React.FC = ({ appInfo, size = 'wide' }) => { const { isOpen, close } = useConnectModal(); const { connectAsync, reset: resetConnect, isPending: isConnecting, isError: connectError, + error: connectErrorMsg, } = useConnect(); const [selectedConnector, setSelectedConnector] = useState(null); const [qrCode, setQrCode] = useState(); @@ -81,15 +84,25 @@ export const ConnectModal: React.FC = ({ size = 'wide' }) => [ConnectModalView.connectOptions]: , [ConnectModalView.walletView]: ( ), }; - }, [isWide, selectedConnector, qrCode, handleConnect, isConnecting, connectError]); + }, [ + isWide, + selectedConnector, + qrCode, + handleConnect, + isConnecting, + connectError, + connectErrorMsg, + appInfo, + ]); useEffect(() => { if (isWide && currentView === ConnectModalView.walletView) { @@ -161,32 +174,86 @@ export const ConnectModal: React.FC = ({ size = 'wide' }) => )}
-
+
{viewComponents[currentView]}
- {!isWide && currentView === ConnectModalView.connectOptions && ( -

window.open('https://polkadot.com/get-started/wallets/')} - > - New to wallets? -

- )} + {!isWide && + currentView === ConnectModalView.connectOptions && + renderAppInfoText( + appInfo?.guideText, +

+ window.open(appInfo?.guideLink || 'https://polkadot.com/get-started/wallets/') + } + > + New to wallets? +

+ )}
{isWide && ( )}
+ + {!isWide && + currentView === ConnectModalView.connectOptions && + appInfo?.policyLinks?.terms && + appInfo?.policyLinks?.privacy && ( +
+ )}
); }; diff --git a/packages/ui/src/hooks/useConnectButton.ts b/packages/ui/src/hooks/useConnectButton.ts index 09ebcd2..2a1a14f 100644 --- a/packages/ui/src/hooks/useConnectButton.ts +++ b/packages/ui/src/hooks/useConnectButton.ts @@ -7,7 +7,7 @@ import { useChains, useStatus, } from '@luno-kit/react'; -import type { Account, AccountBalance, Chain, Connector } from '@luno-kit/react/types'; +import type { Account, AccountBalance, Chain, Connector, Optional } from '@luno-kit/react/types'; import { useAccountModal, useChainModal, useConnectModal } from '../providers'; export interface UseConnectButtonReturn { @@ -16,22 +16,22 @@ export interface UseConnectButtonReturn { isDisconnected: boolean; isConnecting: boolean; - account?: Account; - address?: string; + account?: Optional; + address?: Optional; - currentChain?: Chain; + currentChain?: Optional; configuredChains: Chain[]; isChainSupported: boolean; chainIconUrl: string; - chainName?: string; + chainName?: Optional; - balance?: AccountBalance; + balance?: Optional; - activeConnector?: Connector; + activeConnector?: Optional; - openConnectModal?: () => void; - openAccountModal?: () => void; - openChainModal?: () => void; + openConnectModal?: Optional<() => void>; + openAccountModal?: Optional<() => void>; + openChainModal?: Optional<() => void>; isConnectModalOpen: boolean; isAccountModalOpen: boolean; diff --git a/packages/ui/src/providers/LunoKitProvider.tsx b/packages/ui/src/providers/LunoKitProvider.tsx index dadacf6..745654c 100644 --- a/packages/ui/src/providers/LunoKitProvider.tsx +++ b/packages/ui/src/providers/LunoKitProvider.tsx @@ -1,52 +1,66 @@ import { LunoProvider } from '@luno-kit/react'; -import type { Config as LunoCoreConfig } from '@luno-kit/react/types'; -// @ts-ignore - @tanstack/react-query v5 API changes -import { QueryClient, type QueryClientConfig, QueryClientProvider } from '@tanstack/react-query'; +import type { Config as LunoCoreConfig, Optional } from '@luno-kit/react/types'; import type React from 'react'; -import { type ReactNode, useState } from 'react'; +import type { ReactNode } from 'react'; import { AccountDetailsModal, ChainModal, ConnectModal } from '../components'; import type { ModalSize } from '../components/Dialog'; import type { LunokitThemeOverrides, PartialLunokitTheme } from '../theme'; import { ThemeProvider } from '../theme'; import { ModalProvider } from './ModalContext'; +export interface DecorativeImage { + light: string; + dark?: Optional; +} + +export interface PolicyLinks { + terms: string; + privacy: string; + target?: Optional<'_blank' | '_self'>; +} + +export interface AppInfo { + decorativeImage?: Optional; + guideText?: Optional; + guideLink?: Optional; + description?: Optional; + policyLinks?: Optional; +} + export interface LunoKitProviderProps { children: ReactNode; - config: LunoCoreConfig & { modalSize?: ModalSize }; - queryClientConfig?: QueryClientConfig; - theme?: PartialLunokitTheme | LunokitThemeOverrides; // Support both complete themes and partial overrides + config: LunoCoreConfig & { modalSize?: Optional }; + theme?: Optional; + appInfo?: Optional>; } export const LunoKitProvider: React.FC = ({ children, config, - queryClientConfig, theme, + appInfo, }) => { - const [queryClient] = useState(() => new QueryClient(queryClientConfig)); - return ( - - - - -
{children}
- -
-
-
-
+ + + +
{children}
+ +
+
+
); }; -const RenderModals: React.FC<{ modalSize?: ModalSize }> = ({ - modalSize, -}: { - modalSize?: ModalSize; -}) => { +interface RenderModalsProps { + modalSize?: Optional; + appInfo?: Optional>; +} + +const RenderModals: React.FC = ({ modalSize, appInfo }: RenderModalsProps) => { return ( <> - + diff --git a/packages/ui/src/styles/base.css b/packages/ui/src/styles/base.css index d206cc3..db6937c 100644 --- a/packages/ui/src/styles/base.css +++ b/packages/ui/src/styles/base.css @@ -82,6 +82,7 @@ --leading-lg: 24px; /* Font Weights */ + --font-weight-regular: 400; --font-weight-medium: 500; --font-weight-semibold: 600; --font-weight-bold: 700; @@ -96,7 +97,6 @@ --spacing-4: 16px; --spacing-5: 20px; --spacing-6: 24px; - --font-body: var(--font-body); } diff --git a/packages/ui/src/theme/context.tsx b/packages/ui/src/theme/context.tsx index 9fef2e5..b9764a9 100644 --- a/packages/ui/src/theme/context.tsx +++ b/packages/ui/src/theme/context.tsx @@ -1,3 +1,4 @@ +import type { Optional } from '@luno-kit/react/types'; import type React from 'react'; import { createContext, @@ -14,7 +15,7 @@ import type { LunokitTheme, LunokitThemeOverrides, PartialLunokitTheme, ThemeMod // Theme preference storage interface ThemePreference { isAuto: boolean; - preferredTheme?: ThemeMode; + preferredTheme?: Optional; } const THEME_STORAGE_KEY = 'luno.lastThemePreference'; @@ -35,7 +36,7 @@ const ThemeContext = createContext(undefined); interface ThemeProviderProps { children: ReactNode; - theme?: PartialLunokitTheme | LunokitThemeOverrides; + theme?: Optional; } // Helper function to check if theme is complete or partial diff --git a/packages/ui/src/utils/renderAppInfo.tsx b/packages/ui/src/utils/renderAppInfo.tsx new file mode 100644 index 0000000..871c95a --- /dev/null +++ b/packages/ui/src/utils/renderAppInfo.tsx @@ -0,0 +1,18 @@ +import React from 'react'; + +// Render helper for plain text content; keeps default styling/handlers when provided. +export function renderAppInfoText( + customText: string | undefined, + defaultContent: React.ReactNode +): React.ReactNode { + if (!customText) { + return defaultContent; + } + + if (React.isValidElement(defaultContent)) { + const { className, children: _children, ...rest } = defaultContent.props || {}; + return React.createElement(defaultContent.type, { ...rest, className }, customText); + } + + return customText; +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0147642..2080bd6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -6,21 +6,33 @@ settings: catalogs: default: + '@dedot/chaintypes': + specifier: 0.152.0 + version: 0.152.0 '@tanstack/react-query': specifier: 5.81.5 version: 5.81.5 + '@types/node': + specifier: 20.19.0 + version: 20.19.0 '@types/react': specifier: 18.2.55 version: 18.2.55 '@types/react-dom': specifier: 18.2.19 version: 18.2.19 + dedot: + specifier: 0.16.0 + version: 0.16.0 react: specifier: 18.2.0 version: 18.2.0 react-dom: specifier: 18.2.0 version: 18.2.0 + tsup: + specifier: 8.5.0 + version: 8.5.0 importers: @@ -211,16 +223,16 @@ importers: version: 18.2.19 '@vitejs/plugin-react': specifier: ^4.4.1 - version: 4.6.0(vite@6.3.5) + version: 4.6.0(vite@6.3.5(@types/node@22.15.21)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.0)) eslint: specifier: ^9.25.0 - version: 9.35.0 + version: 9.35.0(jiti@2.4.2) eslint-plugin-react-hooks: specifier: ^5.2.0 - version: 5.2.0(eslint@9.35.0) + version: 5.2.0(eslint@9.35.0(jiti@2.4.2)) eslint-plugin-react-refresh: specifier: ^0.4.19 - version: 0.4.20(eslint@9.35.0) + version: 0.4.20(eslint@9.35.0(jiti@2.4.2)) globals: specifier: ^16.0.0 version: 16.3.0 @@ -229,10 +241,10 @@ importers: version: 5.8.3 typescript-eslint: specifier: ^8.30.1 - version: 8.43.0(eslint@9.35.0)(typescript@5.8.3) + version: 8.43.0(eslint@9.35.0(jiti@2.4.2))(typescript@5.8.3) vite: specifier: ^6.3.5 - version: 6.3.5 + version: 6.3.5(@types/node@22.15.21)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.0) examples/with-vite-papi: dependencies: @@ -297,6 +309,9 @@ importers: '@dedot/chaintypes': specifier: 'catalog:' version: 0.152.0(dedot@0.16.0) + '@ledgerhq/hw-transport-webusb': + specifier: 6.29.13 + version: 6.29.13 '@mimirdev/apps-inject': specifier: 3.2.0 version: 3.2.0 @@ -306,6 +321,12 @@ importers: '@walletconnect/universal-provider': specifier: 2.21.4 version: 2.21.4(typescript@5.8.3) + '@zondax/ledger-substrate': + specifier: 2.0.0 + version: 2.0.0 + buffer: + specifier: 6.0.3 + version: 6.0.3 dedot: specifier: 'catalog:' version: 0.16.0 @@ -452,7 +473,7 @@ importers: version: 18.2.0(react@18.2.0) storybook: specifier: ^8.0.0 - version: 8.6.14(prettier@3.6.2) + version: 8.6.14(prettier@3.7.4) tailwindcss: specifier: ^4.1.7 version: 4.1.12 @@ -1766,8 +1787,8 @@ packages: resolution: {integrity: sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@ethereumjs/rlp@10.0.0': - resolution: {integrity: sha512-h2SK6RxFBfN5ZGykbw8LTNNLckSXZeuUZ6xqnmtF22CzZbHflFMcIOyfVGdvyCVQqIoSbGMHtvyxMCWnOyB9RA==} + '@ethereumjs/rlp@10.1.0': + resolution: {integrity: sha512-r67BJbwilammAqYI4B5okA66cNdTlFzeWxPNJOolKV52ZS/flo0tUBf4x4gxWXBgh48OgsdFV1Qp5pRoSe8IhQ==} engines: {node: '>=18'} hasBin: true @@ -2038,6 +2059,27 @@ packages: '@jridgewell/trace-mapping@0.3.29': resolution: {integrity: sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==} + '@ledgerhq/devices@8.5.0': + resolution: {integrity: sha512-zDB6Pdk6NYYbYis8cWoLLkL9k/IvjhC3hkuuz2lhpJ2AxIs3/PDMUKoyK4DpjPtRyKk1W1lwsnpc6J1i87r4/Q==} + + '@ledgerhq/devices@8.7.0': + resolution: {integrity: sha512-3pSOULPUhClk2oOxa6UnoyXW8+05FK7r6cpq2WiTey4kyIUjmIraO7AX9lhz9IU73dGVtBMdU+NCPPO2RYJaTQ==} + + '@ledgerhq/errors@6.27.0': + resolution: {integrity: sha512-EE2hATONHdNP3YWFe3rZwwpSEzI5oN+q/xTjOulnjHZo84TLjungegEJ54A/Pzld0woulkkeVA27FbW5SAO1aA==} + + '@ledgerhq/hw-transport-webusb@6.29.13': + resolution: {integrity: sha512-RhQMCX2kjpI5N+4EvepDtIH9opTJxmCAEWIip4Im+ScjoSvBI1wveE5aDFhjDsHJUcKIQzIbB5jSuv0DZaajFA==} + + '@ledgerhq/hw-transport@6.31.13': + resolution: {integrity: sha512-MrJRDk74wY980ofiFPRpTHQBbRw1wDuKbdag1zqlO1xtJglymwwY03K2kvBNvkm1RTSCPUp/nAoNG+WThZuuew==} + + '@ledgerhq/hw-transport@6.31.9': + resolution: {integrity: sha512-HqB2Whl2qbrzyvs9gC/GmLhIy8RO4CWzjqHS4k0bPWDZRqKa8m6H32vjrbXGO//pUL1Mlu87UwvxvLyuICdjwg==} + + '@ledgerhq/logs@6.13.0': + resolution: {integrity: sha512-4+qRW2Pc8V+btL0QEmdB2X+uyx0kOWMWE1/LWsq5sZy3Q5tpi4eItJS6mB0XL3wGW59RQ+8bchNQQ1OW/va8Og==} + '@leichtgewicht/ip-codec@2.0.5': resolution: {integrity: sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==} @@ -2355,32 +2397,32 @@ packages: '@polkadot-api/ws-provider@0.3.6': resolution: {integrity: sha512-D2+rvcDc9smt24qUKqFoCuKKNhyBVDQEtnsqHiUN/Ym8UGP+Acegac3b9VOig70EpCcRBoYeXY2gEog2ybx1Kg==} - '@polkadot/types-support@16.4.6': - resolution: {integrity: sha512-e83H4MzamzNzxZdxf104xqzsl1YUCF24i2pw19I/6zPVxpt6a9zn4+7VzSVMclaztxxSTITCLbks7/9dLiNhEw==} + '@polkadot/types-support@16.5.3': + resolution: {integrity: sha512-ggyIRV+4Kn+aG1PiVT0PE00pAqMveyS3CuFsW9gJnKxeev4VrGfr08R4vw/61D7uIfpilkQdkXNgXAbeN09Mxg==} engines: {node: '>=18'} - '@polkadot/util@13.5.6': - resolution: {integrity: sha512-V+CkW2VdhcMWvl7eXdmlCLGqLxrKvXZtXE76KBbPP5n0Z+8DqQ58IHNOE9xe2LOgqDwIzdLlOUwkyF9Zj19y+Q==} + '@polkadot/util@13.5.9': + resolution: {integrity: sha512-pIK3XYXo7DKeFRkEBNYhf3GbCHg6dKQisSvdzZwuyzA6m7YxQq4DFw4IE464ve4Z7WsJFt3a6C9uII36hl9EWw==} engines: {node: '>=18'} - '@polkadot/x-bigint@13.5.6': - resolution: {integrity: sha512-HpqZJ9ud94iK/+0Ofacw7QdtvzFp6SucBBml4XwWZTWoLaLOGDsO7FoWE7yCuwPbX8nLgIM6YmQBeUoZmBtVqQ==} + '@polkadot/x-bigint@13.5.9': + resolution: {integrity: sha512-JVW6vw3e8fkcRyN9eoc6JIl63MRxNQCP/tuLdHWZts1tcAYao0hpWUzteqJY93AgvmQ91KPsC1Kf3iuuZCi74g==} engines: {node: '>=18'} - '@polkadot/x-global@13.5.6': - resolution: {integrity: sha512-iw97n0Bnl2284WgAK732LYR4DW6w5+COfBfHzkhiHqs5xwPEwWMgWGrf2hM8WAQqNIz6Ni8w/jagucPyQBur3Q==} + '@polkadot/x-global@13.5.9': + resolution: {integrity: sha512-zSRWvELHd3Q+bFkkI1h2cWIqLo1ETm+MxkNXLec3lB56iyq/MjWBxfXnAFFYFayvlEVneo7CLHcp+YTFd9aVSA==} engines: {node: '>=18'} - '@polkadot/x-textdecoder@13.5.6': - resolution: {integrity: sha512-jTGeYCxFh89KRrP7bNj1CPqKO36Onsi0iA6A+5YtRS5wjdQU+/OFM/EHLTP2nvkvZo/tOkOewMR9sausisUvVQ==} + '@polkadot/x-textdecoder@13.5.9': + resolution: {integrity: sha512-W2HhVNUbC/tuFdzNMbnXAWsIHSg9SC9QWDNmFD3nXdSzlXNgL8NmuiwN2fkYvCQBtp/XSoy0gDLx0C+Fo19cfw==} engines: {node: '>=18'} - '@polkadot/x-textencoder@13.5.6': - resolution: {integrity: sha512-iVwz9+OrYCEF9QbNfr9M206mmWvY/AhDmGPfAIeTR4fRgKGVYqcP8RIF8iu/x0MVQWqiVO3vlhlUk7MfrmAnoQ==} + '@polkadot/x-textencoder@13.5.9': + resolution: {integrity: sha512-SG0MHnLUgn1ZxFdm0KzMdTHJ47SfqFhdIPMcGA0Mg/jt2rwrfrP3jtEIJMsHfQpHvfsNPfv55XOMmoPWuQnP/Q==} engines: {node: '>=18'} - '@polkadot/x-ws@13.5.6': - resolution: {integrity: sha512-247ktVp/iE57NTXjFpHaoPoDcvoEPb8+16r2Eq0IBQ2umOV7P6KmxvdNx5eFUvRsgXvBpNwUXE1WVnXjK/eDtA==} + '@polkadot/x-ws@13.5.9': + resolution: {integrity: sha512-NKVgvACTIvKT8CjaQu9d0dERkZsWIZngX/4NVSjc01WHmln4F4y/zyBdYn/Z2V0Zw28cISx+lB4qxRmqTe7gbg==} engines: {node: '>=18'} '@radix-ui/primitive@1.1.3': @@ -3456,6 +3498,7 @@ packages: '@walletconnect/universal-provider@2.21.4': resolution: {integrity: sha512-ZSYU5H7Zi/nEy3L21kw5l3ovMagrbXDRKBG8vjPpGQAkflQocRj6d0SesFOCBEdJS16nt+6dKI2f5blpOGzyTQ==} + deprecated: 'Reliability and performance improvements. See: https://github.com/WalletConnect/walletconnect-monorepo/releases' '@walletconnect/utils@2.21.4': resolution: {integrity: sha512-LuSyBXvRLiDqIu4uMFei5eJ/WPhkIkdW58fmDlRnryatIuBPCho3dlrNSbOjVSdsID+OvxjOlpPLi+5h4oTbaA==} @@ -3517,6 +3560,12 @@ packages: '@xtuc/long@4.2.2': resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + '@zondax/ledger-js@1.3.1': + resolution: {integrity: sha512-sDBwsunK2nSzkqJ5xi6QTiVVpAxSy+X1BVcMfKioBsInjktki2SezT7K8Hw6kSlYd3yfOJlw8cs+hqVtxpAGtg==} + + '@zondax/ledger-substrate@2.0.0': + resolution: {integrity: sha512-N1mHa6vUa/XFSucTpt5zemO9b0qYzmiZf9mubmw/vpPOVU02C0/8drf80nk6eMcBKgfjwQEaB8DDTsZF0pRo6Q==} + abab@2.0.6: resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} deprecated: Use your platform's native atob() and btoa() methods instead @@ -3761,6 +3810,9 @@ packages: resolution: {integrity: sha512-Xm7bpRXnDSX2YE2YFfBk2FnF0ep6tmG7xPh8iHee8MIcrgq762Nkce856dYtJYLkuIoYZvGfTs/PbZhideTcEg==} engines: {node: '>=4'} + axios@1.13.2: + resolution: {integrity: sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==} + axobject-query@4.1.0: resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} engines: {node: '>= 0.4'} @@ -3833,6 +3885,9 @@ packages: base-x@5.0.1: resolution: {integrity: sha512-M7uio8Zt++eg3jPj+rHMfCC+IuygQHHCOU+IYsVtik6FWjuYpVt/+MRKcgsAMHh8mMFAwnB+Bs+mTrFiXjMzKg==} + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + batch@0.6.1: resolution: {integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==} @@ -3904,6 +3959,9 @@ packages: buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + builtin-modules@3.3.0: resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} engines: {node: '>=6'} @@ -5170,6 +5228,10 @@ packages: resolution: {integrity: sha512-f0cRzm6dkyVYV3nPoooP8XlccPQukegwhAnpoLcXy+X+A8KfpGOoXwDr9FLZd3wzgLaBGQBE3lY93Zm/i1JvIQ==} engines: {node: '>= 6'} + form-data@4.0.5: + resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} + engines: {node: '>= 6'} + forwarded@0.2.0: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} @@ -5507,6 +5569,9 @@ packages: resolution: {integrity: sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA==} engines: {node: '>=4'} + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + ignore@5.3.2: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} @@ -7275,8 +7340,8 @@ packages: engines: {node: '>=10.13.0'} hasBin: true - prettier@3.6.2: - resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==} + prettier@3.7.4: + resolution: {integrity: sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA==} engines: {node: '>=14'} hasBin: true @@ -7323,6 +7388,9 @@ packages: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + psl@1.15.0: resolution: {integrity: sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==} @@ -7829,8 +7897,8 @@ packages: smoldot@2.0.34: resolution: {integrity: sha512-mw9tCbGEhEp0koMqLL0jBEixVY1MIN/xI3pE6ZY1TuOPU+LnYy8FloODVyzkvzQPaBYrETXJdRlmA/+k6g3gow==} - smoldot@2.0.38: - resolution: {integrity: sha512-t9JurRhBkxST/z5sjjmQB8JMaAC5ydRZBZ7a62nSHJF+CRE6IO4JadGxFhxUPTvoDvdLOelzfNu4v09bAOA/6w==} + smoldot@2.0.40: + resolution: {integrity: sha512-h6XC/kKDLdZBBTI0X8y4ZxmaZ2KYVVB0+5isCQm6j26ljeNjHZUDOV+hf8VyoE23+jg00wrxNJ2IVcIAURxwtg==} snake-case@3.0.4: resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} @@ -10455,7 +10523,7 @@ snapshots: '@dedot/codecs': 0.16.0 '@dedot/codegen': 0.16.0 '@polkadot-api/wasm-executor': 0.1.2 - '@polkadot/types-support': 16.4.6 + '@polkadot/types-support': 16.5.3 ora: 8.2.0 yargs: 17.7.2 transitivePeerDependencies: @@ -10478,7 +10546,7 @@ snapshots: '@dedot/types': 0.16.0 '@dedot/utils': 0.16.0 handlebars: 4.7.8 - prettier: 3.6.2 + prettier: 3.7.4 transitivePeerDependencies: - bufferutil - utf-8-validate @@ -10489,7 +10557,7 @@ snapshots: '@dedot/codecs': 0.16.0 '@dedot/types': 0.16.0 '@dedot/utils': 0.16.0 - '@ethereumjs/rlp': 10.0.0 + '@ethereumjs/rlp': 10.1.0 transitivePeerDependencies: - bufferutil - utf-8-validate @@ -10503,7 +10571,7 @@ snapshots: '@dedot/providers@0.16.0': dependencies: '@dedot/utils': 0.16.0 - '@polkadot/x-ws': 13.5.6 + '@polkadot/x-ws': 13.5.9 transitivePeerDependencies: - bufferutil - utf-8-validate @@ -10521,7 +10589,7 @@ snapshots: '@dedot/smoldot@0.16.0': dependencies: - smoldot: 2.0.38 + smoldot: 2.0.40 transitivePeerDependencies: - bufferutil - utf-8-validate @@ -10630,21 +10698,11 @@ snapshots: eslint: 9.35.0(jiti@2.4.2) eslint-visitor-keys: 3.4.3 - '@eslint-community/eslint-utils@4.7.0(eslint@9.35.0)': - dependencies: - eslint: 9.35.0 - eslint-visitor-keys: 3.4.3 - '@eslint-community/eslint-utils@4.9.0(eslint@9.35.0(jiti@2.4.2))': dependencies: eslint: 9.35.0(jiti@2.4.2) eslint-visitor-keys: 3.4.3 - '@eslint-community/eslint-utils@4.9.0(eslint@9.35.0)': - dependencies: - eslint: 9.35.0 - eslint-visitor-keys: 3.4.3 - '@eslint-community/regexpp@4.12.1': {} '@eslint/config-array@0.21.0': @@ -10700,7 +10758,7 @@ snapshots: '@eslint/core': 0.15.2 levn: 0.4.1 - '@ethereumjs/rlp@10.0.0': {} + '@ethereumjs/rlp@10.1.0': {} '@humanfs/core@0.19.1': {} @@ -11048,6 +11106,45 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 + '@ledgerhq/devices@8.5.0': + dependencies: + '@ledgerhq/errors': 6.27.0 + '@ledgerhq/logs': 6.13.0 + rxjs: 7.8.2 + semver: 7.7.2 + + '@ledgerhq/devices@8.7.0': + dependencies: + '@ledgerhq/errors': 6.27.0 + '@ledgerhq/logs': 6.13.0 + rxjs: 7.8.2 + semver: 7.7.2 + + '@ledgerhq/errors@6.27.0': {} + + '@ledgerhq/hw-transport-webusb@6.29.13': + dependencies: + '@ledgerhq/devices': 8.7.0 + '@ledgerhq/errors': 6.27.0 + '@ledgerhq/hw-transport': 6.31.13 + '@ledgerhq/logs': 6.13.0 + + '@ledgerhq/hw-transport@6.31.13': + dependencies: + '@ledgerhq/devices': 8.7.0 + '@ledgerhq/errors': 6.27.0 + '@ledgerhq/logs': 6.13.0 + events: 3.3.0 + + '@ledgerhq/hw-transport@6.31.9': + dependencies: + '@ledgerhq/devices': 8.5.0 + '@ledgerhq/errors': 6.27.0 + '@ledgerhq/logs': 6.13.0 + events: 3.3.0 + + '@ledgerhq/logs@6.13.0': {} + '@leichtgewicht/ip-codec@2.0.5': {} '@manypkg/find-root@1.1.0': @@ -11399,43 +11496,43 @@ snapshots: - bufferutil - utf-8-validate - '@polkadot/types-support@16.4.6': + '@polkadot/types-support@16.5.3': dependencies: - '@polkadot/util': 13.5.6 + '@polkadot/util': 13.5.9 tslib: 2.8.1 - '@polkadot/util@13.5.6': + '@polkadot/util@13.5.9': dependencies: - '@polkadot/x-bigint': 13.5.6 - '@polkadot/x-global': 13.5.6 - '@polkadot/x-textdecoder': 13.5.6 - '@polkadot/x-textencoder': 13.5.6 + '@polkadot/x-bigint': 13.5.9 + '@polkadot/x-global': 13.5.9 + '@polkadot/x-textdecoder': 13.5.9 + '@polkadot/x-textencoder': 13.5.9 '@types/bn.js': 5.2.0 bn.js: 5.2.2 tslib: 2.8.1 - '@polkadot/x-bigint@13.5.6': + '@polkadot/x-bigint@13.5.9': dependencies: - '@polkadot/x-global': 13.5.6 + '@polkadot/x-global': 13.5.9 tslib: 2.8.1 - '@polkadot/x-global@13.5.6': + '@polkadot/x-global@13.5.9': dependencies: tslib: 2.8.1 - '@polkadot/x-textdecoder@13.5.6': + '@polkadot/x-textdecoder@13.5.9': dependencies: - '@polkadot/x-global': 13.5.6 + '@polkadot/x-global': 13.5.9 tslib: 2.8.1 - '@polkadot/x-textencoder@13.5.6': + '@polkadot/x-textencoder@13.5.9': dependencies: - '@polkadot/x-global': 13.5.6 + '@polkadot/x-global': 13.5.9 tslib: 2.8.1 - '@polkadot/x-ws@13.5.6': + '@polkadot/x-ws@13.5.9': dependencies: - '@polkadot/x-global': 13.5.6 + '@polkadot/x-global': 13.5.9 tslib: 2.8.1 ws: 8.18.3 transitivePeerDependencies: @@ -11720,9 +11817,9 @@ snapshots: dependencies: '@sinonjs/commons': 1.8.6 - '@storybook/core@8.6.14(prettier@3.6.2)(storybook@8.6.14(prettier@3.6.2))': + '@storybook/core@8.6.14(prettier@3.7.4)(storybook@8.6.14(prettier@3.7.4))': dependencies: - '@storybook/theming': 8.6.14(storybook@8.6.14(prettier@3.6.2)) + '@storybook/theming': 8.6.14(storybook@8.6.14(prettier@3.7.4)) better-opn: 3.0.2 browser-assert: 1.2.1 esbuild: 0.25.5 @@ -11734,16 +11831,16 @@ snapshots: util: 0.12.5 ws: 8.18.3 optionalDependencies: - prettier: 3.6.2 + prettier: 3.7.4 transitivePeerDependencies: - bufferutil - storybook - supports-color - utf-8-validate - '@storybook/theming@8.6.14(storybook@8.6.14(prettier@3.6.2))': + '@storybook/theming@8.6.14(storybook@8.6.14(prettier@3.7.4))': dependencies: - storybook: 8.6.14(prettier@3.6.2) + storybook: 8.6.14(prettier@3.7.4) '@surma/rollup-plugin-off-main-thread@2.2.3': dependencies: @@ -12317,23 +12414,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/eslint-plugin@8.43.0(@typescript-eslint/parser@8.43.0(eslint@9.35.0)(typescript@5.8.3))(eslint@9.35.0)(typescript@5.8.3)': - dependencies: - '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.43.0(eslint@9.35.0)(typescript@5.8.3) - '@typescript-eslint/scope-manager': 8.43.0 - '@typescript-eslint/type-utils': 8.43.0(eslint@9.35.0)(typescript@5.8.3) - '@typescript-eslint/utils': 8.43.0(eslint@9.35.0)(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 8.43.0 - eslint: 9.35.0 - graphemer: 1.4.0 - ignore: 7.0.5 - natural-compare: 1.4.0 - ts-api-utils: 2.1.0(typescript@5.8.3) - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/experimental-utils@5.62.0(eslint@8.57.1)(typescript@4.9.5)': dependencies: '@typescript-eslint/utils': 5.62.0(eslint@8.57.1)(typescript@4.9.5) @@ -12366,18 +12446,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.43.0(eslint@9.35.0)(typescript@5.8.3)': - dependencies: - '@typescript-eslint/scope-manager': 8.43.0 - '@typescript-eslint/types': 8.43.0 - '@typescript-eslint/typescript-estree': 8.43.0(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 8.43.0 - debug: 4.4.1 - eslint: 9.35.0 - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/project-service@8.43.0(typescript@5.8.3)': dependencies: '@typescript-eslint/tsconfig-utils': 8.43.0(typescript@5.8.3) @@ -12425,18 +12493,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/type-utils@8.43.0(eslint@9.35.0)(typescript@5.8.3)': - dependencies: - '@typescript-eslint/types': 8.43.0 - '@typescript-eslint/typescript-estree': 8.43.0(typescript@5.8.3) - '@typescript-eslint/utils': 8.43.0(eslint@9.35.0)(typescript@5.8.3) - debug: 4.4.1 - eslint: 9.35.0 - ts-api-utils: 2.1.0(typescript@5.8.3) - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/types@5.62.0': {} '@typescript-eslint/types@8.43.0': {} @@ -12497,17 +12553,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.43.0(eslint@9.35.0)(typescript@5.8.3)': - dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.35.0) - '@typescript-eslint/scope-manager': 8.43.0 - '@typescript-eslint/types': 8.43.0 - '@typescript-eslint/typescript-estree': 8.43.0(typescript@5.8.3) - eslint: 9.35.0 - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/visitor-keys@5.62.0': dependencies: '@typescript-eslint/types': 5.62.0 @@ -12520,7 +12565,7 @@ snapshots: '@ungap/structured-clone@1.3.0': {} - '@vitejs/plugin-react@4.6.0(vite@6.3.5)': + '@vitejs/plugin-react@4.6.0(vite@6.3.5(@types/node@22.15.21)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.0))': dependencies: '@babel/core': 7.27.7 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.27.7) @@ -12528,7 +12573,7 @@ snapshots: '@rolldown/pluginutils': 1.0.0-beta.19 '@types/babel__core': 7.20.5 react-refresh: 0.17.0 - vite: 6.3.5 + vite: 6.3.5(@types/node@22.15.21)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.0) transitivePeerDependencies: - supports-color @@ -13040,6 +13085,18 @@ snapshots: '@xtuc/long@4.2.2': {} + '@zondax/ledger-js@1.3.1': + dependencies: + '@ledgerhq/hw-transport': 6.31.9 + + '@zondax/ledger-substrate@2.0.0': + dependencies: + '@ledgerhq/hw-transport': 6.31.13 + '@zondax/ledger-js': 1.3.1 + axios: 1.13.2 + transitivePeerDependencies: + - debug + abab@2.0.6: {} abitype@1.0.8(typescript@5.8.3): @@ -13287,6 +13344,14 @@ snapshots: axe-core@4.10.3: {} + axios@1.13.2: + dependencies: + follow-redirects: 1.15.9 + form-data: 4.0.5 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + axobject-query@4.1.0: {} babel-jest@27.5.1(@babel/core@7.27.7): @@ -13416,6 +13481,8 @@ snapshots: base-x@5.0.1: {} + base64-js@1.5.1: {} + batch@0.6.1: {} better-opn@3.0.2: @@ -13502,6 +13569,11 @@ snapshots: buffer-from@1.1.2: {} + buffer@6.0.3: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + builtin-modules@3.3.0: {} bundle-require@5.1.0(esbuild@0.25.5): @@ -14044,7 +14116,7 @@ snapshots: '@dedot/smoldot': 0.16.0 '@dedot/types': 0.16.0 '@dedot/utils': 0.16.0 - smoldot: 2.0.38 + smoldot: 2.0.40 transitivePeerDependencies: - bufferutil - utf-8-validate @@ -14561,18 +14633,10 @@ snapshots: dependencies: eslint: 9.35.0(jiti@2.4.2) - eslint-plugin-react-hooks@5.2.0(eslint@9.35.0): - dependencies: - eslint: 9.35.0 - eslint-plugin-react-refresh@0.4.20(eslint@9.35.0(jiti@2.4.2)): dependencies: eslint: 9.35.0(jiti@2.4.2) - eslint-plugin-react-refresh@0.4.20(eslint@9.35.0): - dependencies: - eslint: 9.35.0 - eslint-plugin-react@7.37.5(eslint@8.57.1): dependencies: array-includes: 3.1.9 @@ -14677,46 +14741,6 @@ snapshots: transitivePeerDependencies: - supports-color - eslint@9.35.0: - dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.35.0) - '@eslint-community/regexpp': 4.12.1 - '@eslint/config-array': 0.21.0 - '@eslint/config-helpers': 0.3.1 - '@eslint/core': 0.15.2 - '@eslint/eslintrc': 3.3.1 - '@eslint/js': 9.35.0 - '@eslint/plugin-kit': 0.3.5 - '@humanfs/node': 0.16.6 - '@humanwhocodes/module-importer': 1.0.1 - '@humanwhocodes/retry': 0.4.3 - '@types/estree': 1.0.8 - '@types/json-schema': 7.0.15 - ajv: 6.12.6 - chalk: 4.1.2 - cross-spawn: 7.0.6 - debug: 4.4.1 - escape-string-regexp: 4.0.0 - eslint-scope: 8.4.0 - eslint-visitor-keys: 4.2.1 - espree: 10.4.0 - esquery: 1.6.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 8.0.0 - find-up: 5.0.0 - glob-parent: 6.0.2 - ignore: 5.3.2 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - json-stable-stringify-without-jsonify: 1.0.1 - lodash.merge: 4.6.2 - minimatch: 3.1.2 - natural-compare: 1.4.0 - optionator: 0.9.4 - transitivePeerDependencies: - - supports-color - eslint@9.35.0(jiti@2.4.2): dependencies: '@eslint-community/eslint-utils': 4.9.0(eslint@9.35.0(jiti@2.4.2)) @@ -15043,6 +15067,14 @@ snapshots: hasown: 2.0.2 mime-types: 2.1.35 + form-data@4.0.5: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.2 + mime-types: 2.1.35 + forwarded@0.2.0: {} fraction.js@4.3.7: {} @@ -15416,6 +15448,8 @@ snapshots: dependencies: harmony-reflect: 1.6.2 + ieee754@1.2.1: {} + ignore@5.3.2: {} ignore@7.0.5: {} @@ -17387,7 +17421,7 @@ snapshots: prettier@2.8.8: {} - prettier@3.6.2: {} + prettier@3.7.4: {} pretty-bytes@5.6.0: {} @@ -17439,6 +17473,8 @@ snapshots: forwarded: 0.2.0 ipaddr.js: 1.9.1 + proxy-from-env@1.1.0: {} + psl@1.15.0: dependencies: punycode: 2.3.1 @@ -18132,7 +18168,7 @@ snapshots: - bufferutil - utf-8-validate - smoldot@2.0.38: + smoldot@2.0.40: dependencies: ws: 8.18.3 transitivePeerDependencies: @@ -18259,11 +18295,11 @@ snapshots: es-errors: 1.3.0 internal-slot: 1.1.0 - storybook@8.6.14(prettier@3.6.2): + storybook@8.6.14(prettier@3.7.4): dependencies: - '@storybook/core': 8.6.14(prettier@3.6.2)(storybook@8.6.14(prettier@3.6.2)) + '@storybook/core': 8.6.14(prettier@3.7.4)(storybook@8.6.14(prettier@3.7.4)) optionalDependencies: - prettier: 3.6.2 + prettier: 3.7.4 transitivePeerDependencies: - bufferutil - supports-color @@ -18776,17 +18812,6 @@ snapshots: transitivePeerDependencies: - supports-color - typescript-eslint@8.43.0(eslint@9.35.0)(typescript@5.8.3): - dependencies: - '@typescript-eslint/eslint-plugin': 8.43.0(@typescript-eslint/parser@8.43.0(eslint@9.35.0)(typescript@5.8.3))(eslint@9.35.0)(typescript@5.8.3) - '@typescript-eslint/parser': 8.43.0(eslint@9.35.0)(typescript@5.8.3) - '@typescript-eslint/typescript-estree': 8.43.0(typescript@5.8.3) - '@typescript-eslint/utils': 8.43.0(eslint@9.35.0)(typescript@5.8.3) - eslint: 9.35.0 - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - typescript@4.9.5: {} typescript@5.8.3: {} @@ -18982,7 +19007,7 @@ snapshots: - tsx - yaml - vite@6.3.5: + vite@6.3.5(@types/node@22.15.21)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.0): dependencies: esbuild: 0.25.5 fdir: 6.4.6(picomatch@4.0.2) @@ -18991,7 +19016,12 @@ snapshots: rollup: 4.44.1 tinyglobby: 0.2.14 optionalDependencies: + '@types/node': 22.15.21 fsevents: 2.3.3 + jiti: 2.4.2 + lightningcss: 1.30.1 + terser: 5.43.1 + yaml: 2.8.0 vite@7.1.4(@types/node@20.19.0)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(yaml@2.8.0): dependencies: From 93f9aef27bbaf76fd40fa204385f0ffc21329d7d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 15 Dec 2025 15:38:13 +0800 Subject: [PATCH 42/45] chore(release): version packages (#133) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .changeset/late-guests-end.md | 7 ------- .changeset/odd-eggs-stare.md | 18 ------------------ .changeset/pre.json | 17 ----------------- packages/core/CHANGELOG.md | 18 ++++++++++++++++++ packages/core/package.json | 2 +- packages/react/CHANGELOG.md | 22 ++++++++++++++++++++++ packages/react/package.json | 2 +- packages/ui/CHANGELOG.md | 22 ++++++++++++++++++++++ packages/ui/package.json | 2 +- 9 files changed, 65 insertions(+), 45 deletions(-) delete mode 100644 .changeset/late-guests-end.md delete mode 100644 .changeset/odd-eggs-stare.md delete mode 100644 .changeset/pre.json diff --git a/.changeset/late-guests-end.md b/.changeset/late-guests-end.md deleted file mode 100644 index f1ed3a3..0000000 --- a/.changeset/late-guests-end.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -"@luno-kit/react": patch -"@luno-kit/core": patch -"@luno-kit/ui": patch ---- - -Fix the import of tailwindcss and remove the import of the base classes. diff --git a/.changeset/odd-eggs-stare.md b/.changeset/odd-eggs-stare.md deleted file mode 100644 index d0f6798..0000000 --- a/.changeset/odd-eggs-stare.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -"@luno-kit/react": patch -"@luno-kit/core": patch -"@luno-kit/ui": patch ---- - -Fix bugs & Add new connectors - -- Add "appInfo" to LunoKitProvider -- Add new connectors: OneKey and Ledger -- Remove the QueryClientProvider from LunoKitProvider -- The "useSendTransaction" function now includes a "waitFor" parameter, allowing for the customization of whether the transaction is completed at the "inBlock" or "finalized" stage. -- Fix the issue of tailwind base classes overriding each other -- Set default values for cacheMetadata -- To be compatible with exactOptionalPropertyTypes, add the Optional type -- Add the rawReceipt to the return value of useSendTransaction -- Remove console.log -- Add the generic type for useApi diff --git a/.changeset/pre.json b/.changeset/pre.json deleted file mode 100644 index 1f5fb31..0000000 --- a/.changeset/pre.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "mode": "exit", - "tag": "beta", - "initialVersions": { - "with-cra": "0.1.0", - "with-nextjs-app": "0.1.0", - "with-nextjs-pages": "0.1.0", - "with-vite": "0.0.1", - "with-vite-papi": "0.0.0", - "@luno-kit/core": "0.0.10", - "@luno-kit/react": "0.0.10", - "@luno-kit/ui": "0.0.10" - }, - "changesets": [ - "late-guests-end" - ] -} diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index 70f157a..a59ebab 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -1,5 +1,23 @@ # @luno-kit/core +## 0.0.11 + +### Patch Changes + +- ef72b4f: Fix the import of tailwindcss and remove the import of the base classes. +- 3322872: Fix bugs & Add new connectors + + - Add "appInfo" to LunoKitProvider + - Add new connectors: OneKey and Ledger + - Remove the QueryClientProvider from LunoKitProvider + - The "useSendTransaction" function now includes a "waitFor" parameter, allowing for the customization of whether the transaction is completed at the "inBlock" or "finalized" stage. + - Fix the issue of tailwind base classes overriding each other + - Set default values for cacheMetadata + - To be compatible with exactOptionalPropertyTypes, add the Optional type + - Add the rawReceipt to the return value of useSendTransaction + - Remove console.log + - Add the generic type for useApi + ## 0.0.11-beta.0 ### Patch Changes diff --git a/packages/core/package.json b/packages/core/package.json index cdf20ca..edd4df2 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,7 +1,7 @@ { "name": "@luno-kit/core", "description": "Core module for Luno, providing foundational utilities, types, configuration, and connectors for Polkadot wallet interactions.", - "version": "0.0.11-beta.0", + "version": "0.0.11", "type": "module", "keywords": [ "polkadot", diff --git a/packages/react/CHANGELOG.md b/packages/react/CHANGELOG.md index e64ab65..8301d46 100644 --- a/packages/react/CHANGELOG.md +++ b/packages/react/CHANGELOG.md @@ -1,5 +1,27 @@ # @luno-kit/react +## 0.0.11 + +### Patch Changes + +- ef72b4f: Fix the import of tailwindcss and remove the import of the base classes. +- 3322872: Fix bugs & Add new connectors + + - Add "appInfo" to LunoKitProvider + - Add new connectors: OneKey and Ledger + - Remove the QueryClientProvider from LunoKitProvider + - The "useSendTransaction" function now includes a "waitFor" parameter, allowing for the customization of whether the transaction is completed at the "inBlock" or "finalized" stage. + - Fix the issue of tailwind base classes overriding each other + - Set default values for cacheMetadata + - To be compatible with exactOptionalPropertyTypes, add the Optional type + - Add the rawReceipt to the return value of useSendTransaction + - Remove console.log + - Add the generic type for useApi + +- Updated dependencies [ef72b4f] +- Updated dependencies [3322872] + - @luno-kit/core@0.0.11 + ## 0.0.11-beta.0 ### Patch Changes diff --git a/packages/react/package.json b/packages/react/package.json index 04c5472..b84373e 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -1,7 +1,7 @@ { "name": "@luno-kit/react", "description": "React Hooks and Provider for Luno, enabling easy Polkadot wallet interactions in React applications.", - "version": "0.0.11-beta.0", + "version": "0.0.11", "type": "module", "main": "dist/index.js", "module": "dist/index.js", diff --git a/packages/ui/CHANGELOG.md b/packages/ui/CHANGELOG.md index a91b1b0..25ad110 100644 --- a/packages/ui/CHANGELOG.md +++ b/packages/ui/CHANGELOG.md @@ -1,5 +1,27 @@ # @luno-kit/ui +## 0.0.11 + +### Patch Changes + +- ef72b4f: Fix the import of tailwindcss and remove the import of the base classes. +- 3322872: Fix bugs & Add new connectors + + - Add "appInfo" to LunoKitProvider + - Add new connectors: OneKey and Ledger + - Remove the QueryClientProvider from LunoKitProvider + - The "useSendTransaction" function now includes a "waitFor" parameter, allowing for the customization of whether the transaction is completed at the "inBlock" or "finalized" stage. + - Fix the issue of tailwind base classes overriding each other + - Set default values for cacheMetadata + - To be compatible with exactOptionalPropertyTypes, add the Optional type + - Add the rawReceipt to the return value of useSendTransaction + - Remove console.log + - Add the generic type for useApi + +- Updated dependencies [ef72b4f] +- Updated dependencies [3322872] + - @luno-kit/react@0.0.11 + ## 0.0.11-beta.0 ### Patch Changes diff --git a/packages/ui/package.json b/packages/ui/package.json index 9be8af5..697fdcd 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -1,6 +1,6 @@ { "name": "@luno-kit/ui", - "version": "0.0.11-beta.0", + "version": "0.0.11", "description": "UI components for Luno, a Polkadot frontend toolkit.", "keywords": [ "polkadot", From beff7e413d5614df5c800c51fed5baa6836491e9 Mon Sep 17 00:00:00 2001 From: WBH <48749219+wbh1328551759@users.noreply.github.com> Date: Wed, 21 Jan 2026 12:28:18 +0800 Subject: [PATCH 43/45] fix(core): handle EVM addresses and out-of-range SS58 formats (#144) * fix(core): handle EVM addresses and out-of-range SS58 formats * test(core): update convertAddress tests for EVM address handling * fix(core): lint --- packages/core/src/utils/address.test.ts | 23 ++++++++++++++++------- packages/core/src/utils/address.ts | 7 ++++++- 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/packages/core/src/utils/address.test.ts b/packages/core/src/utils/address.test.ts index ab41699..e6d2b6b 100644 --- a/packages/core/src/utils/address.test.ts +++ b/packages/core/src/utils/address.test.ts @@ -42,19 +42,28 @@ describe('address utils', () => { expect(isValidAddress(kusamaFormat)).toBe(true); }); - it('should throw error for invalid address', () => { + it('should return EVM address as-is without error', () => { + const evmAddress = '0x4838b106fce9647bdf1e7877bf73ce8b0bad5f97'; + expect(convertAddress(evmAddress, 0)).toBe(evmAddress); + }); + + it('should throw error for invalid address (non-EVM)', () => { expect(() => convertAddress('invalid', 0)).toThrow('Failed to convert address'); - expect(() => convertAddress('0x4838b106fce9647bdf1e7877bf73ce8b0bad5f97', 0)).toThrow( - 'Failed to convert address' - ); expect(() => convertAddress('', 0)).toThrow('Failed to convert address'); }); - it('should throw error for invalid SS58 format', () => { + it('should throw error for negative SS58 format', () => { const validAddress = '1FRMM8PEiWXYax7rpS6X4XZX1aAAxSWx1CrKTyrVYhV24fg'; - expect(() => convertAddress(validAddress, -1)).toThrow('Failed to convert address'); - expect(() => convertAddress(validAddress, 99999)).toThrow('Failed to convert address'); + }); + + it('should fallback to default (42) for out-of-range SS58 format', () => { + const validAddress = '1FRMM8PEiWXYax7rpS6X4XZX1aAAxSWx1CrKTyrVYhV24fg'; + + const result = convertAddress(validAddress, 99999); + const expectedFallback = convertAddress(validAddress, 42); + + expect(result).toBe(expectedFallback); }); }); diff --git a/packages/core/src/utils/address.ts b/packages/core/src/utils/address.ts index 95d59e4..86dcc5b 100644 --- a/packages/core/src/utils/address.ts +++ b/packages/core/src/utils/address.ts @@ -1,5 +1,5 @@ import type { InjectedAccount } from 'dedot/types'; -import { decodeAddress, encodeAddress, u8aEq, u8aToHex } from 'dedot/utils'; +import { decodeAddress, encodeAddress, isEvmAddress, u8aEq, u8aToHex } from 'dedot/utils'; import type { Account, HexString } from '../types'; /** @@ -20,7 +20,12 @@ export function isValidAddress(address: string): boolean { */ export function convertAddress(address: string, ss58Format: number): string { try { + if (isEvmAddress(address)) return address; + const publicKey = decodeAddress(address); + if (ss58Format > 16383) { + return encodeAddress(publicKey, 42); + } return encodeAddress(publicKey, ss58Format); } catch (error: any) { throw new Error(`Failed to convert address: ${error.message}`); From 388ad50f5915ffb2f9734ca8269f1a29c9ada166 Mon Sep 17 00:00:00 2001 From: wbh1328551759 <1328551759@qq.com> Date: Thu, 5 Feb 2026 12:37:46 +0800 Subject: [PATCH 44/45] feat: Add the function of customizing wallet grouping --- .gitignore | 2 + packages/core/src/config/createConfig.ts | 16 +++++- packages/core/src/types/config.ts | 5 +- packages/core/src/types/connector.ts | 5 ++ .../ConnectModal/ConnectOptions.tsx | 57 +++++++++++++------ .../ui/src/components/ConnectModal/index.tsx | 5 +- packages/ui/src/providers/LunoKitProvider.tsx | 6 +- 7 files changed, 74 insertions(+), 22 deletions(-) diff --git a/.gitignore b/.gitignore index 230e671..0e76bec 100644 --- a/.gitignore +++ b/.gitignore @@ -47,9 +47,11 @@ dist-ssr PROJECT_CONTEXT.md /.cursor +/.claude /scripts/* .envrc .biome/ +/CLAUDE.md diff --git a/packages/core/src/config/createConfig.ts b/packages/core/src/config/createConfig.ts index 647b1b5..90adda5 100644 --- a/packages/core/src/config/createConfig.ts +++ b/packages/core/src/config/createConfig.ts @@ -2,6 +2,7 @@ import type { Chain, Config, Connector, + ConnectorGroup, CreateConfigParameters, RawStorage, Transport, @@ -36,11 +37,15 @@ function generateTransportsFromChains(chains: readonly Chain[]): Record 0 && 'groupName' in input[0] && 'wallets' in input[0]; +} + export function createConfig(parameters: CreateConfigParameters): Config { const { appName = 'My Luno App', chains = [], - connectors, + connectors: connectorsInput, transports = {}, storage = defaultLunoStorage, autoConnect = true, @@ -52,6 +57,14 @@ export function createConfig(parameters: CreateConfigParameters): Config { subscan, } = parameters; + const connectorGroups = isConnectorGroupArray(connectorsInput) + ? connectorsInput.filter(g => g.wallets.length > 0) + : undefined; + + const connectors = isConnectorGroupArray(connectorsInput) + ? connectorsInput.flatMap(g => g.wallets) + : connectorsInput; + if (!connectors || connectors.length === 0) { throw new Error('No connectors provided. Wallet connection features will be unavailable.'); } @@ -82,6 +95,7 @@ export function createConfig(parameters: CreateConfigParameters): Config { appName, chains: Object.freeze([...chains]) as readonly Chain[], connectors: Object.freeze([...connectors]) as readonly Connector[], + connectorGroups: connectorGroups ? Object.freeze([...connectorGroups]) as readonly ConnectorGroup[] : undefined, transports: Object.freeze({ ...finalTransports }) as Readonly>, storage, autoConnect, diff --git a/packages/core/src/types/config.ts b/packages/core/src/types/config.ts index fd102c9..dbd33e5 100644 --- a/packages/core/src/types/config.ts +++ b/packages/core/src/types/config.ts @@ -1,7 +1,7 @@ import type { ApiOptions } from 'dedot'; import type { AnyShape } from 'dedot/shape'; import type { Chain } from './chain'; -import type { Connector } from './connector'; +import type { Connector, ConnectorGroup } from './connector'; export interface RawStorage { getItem(key: string): string | null | Promise; @@ -26,7 +26,7 @@ type LunoApiOptions = Partial> & { export interface CreateConfigParameters extends LunoApiOptions { appName?: Optional; chains?: Optional; - connectors: Connector[]; + connectors: Connector[] | ConnectorGroup[]; transports?: Optional>; storage?: Optional; @@ -42,6 +42,7 @@ export interface Config extends LunoApiOptions { readonly appName: string; readonly chains: readonly Chain[]; readonly connectors: readonly Connector[]; + readonly connectorGroups?: readonly ConnectorGroup[]; readonly transports: Readonly>; readonly storage: LunoStorage; readonly autoConnect: boolean; diff --git a/packages/core/src/types/connector.ts b/packages/core/src/types/connector.ts index 760400b..62fe65f 100644 --- a/packages/core/src/types/connector.ts +++ b/packages/core/src/types/connector.ts @@ -47,3 +47,8 @@ export interface WalletConnectConnectorOptions { links?: Optional; supportedChains?: Optional; } + +export interface ConnectorGroup { + groupName: string; + wallets: Connector[]; +} diff --git a/packages/ui/src/components/ConnectModal/ConnectOptions.tsx b/packages/ui/src/components/ConnectModal/ConnectOptions.tsx index b25f4ea..2ec25bd 100644 --- a/packages/ui/src/components/ConnectModal/ConnectOptions.tsx +++ b/packages/ui/src/components/ConnectModal/ConnectOptions.tsx @@ -1,4 +1,4 @@ -import { useConnectors } from '@luno-kit/react'; +import { useConnectors, useConfig } from '@luno-kit/react'; import type { Connector } from '@luno-kit/react/types'; import { isMobileDevice } from '@luno-kit/react/utils'; import React, { useMemo } from 'react'; @@ -6,6 +6,7 @@ import { cs } from '../../utils'; interface Props { onConnect: (connector: Connector) => Promise; + showInstalledGroup: boolean; } const popularConnectorIds = [ @@ -19,33 +20,55 @@ const popularConnectorIds = [ const moreConnectorIds = ['ledger', 'polkagate', 'fearless-wallet', 'mimir', 'enkrypt', 'OneKey']; -export const ConnectOptions = React.memo(({ onConnect }: Props) => { +export const ConnectOptions = React.memo(({ onConnect, showInstalledGroup }: Props) => { const connectors = useConnectors(); + const config = useConfig(); const installedConnectors = connectors.filter((c) => c.isInstalled()); const popularConnectors = connectors.filter( - (c) => popularConnectorIds.includes(c.id) && !c.isInstalled() + (c: Connector) => popularConnectorIds.includes(c.id) && !c.isInstalled() ); const moreConnectors = connectors.filter( - (c) => moreConnectorIds.includes(c.id) && !c.isInstalled() + (c: Connector) => !popularConnectorIds.includes(c.id) && !c.isInstalled() ); const connectorGroup: { title: string; group: Connector[] }[] = useMemo(() => { + if (!config?.connectorGroups) { + return [ + { title: 'Installed', group: installedConnectors }, + { title: 'Popular', group: popularConnectors }, + { title: 'More', group: moreConnectors }, + ]; + } + + const hasUserDefinedInstalled = config.connectorGroups.some( + g => g.groupName === 'Installed' + ); + + if (hasUserDefinedInstalled || !showInstalledGroup) { + return config.connectorGroups + .filter(g => g.wallets.length > 0) + .map(g => ({ title: g.groupName, group: g.wallets })) + .sort((a, b) => (a.title === 'Installed' ? -1 : b.title === 'Installed' + ? 1 : 0)); + } + + const allWallets = config.connectorGroups.flatMap(g => g.wallets); + const installed = allWallets.filter(c => c.isInstalled()); + + const customGroups = config.connectorGroups + .map(g => ({ + title: g.groupName, + group: g.wallets.filter(c => !c.isInstalled()) + })) + .filter(g => g.group.length > 0); + return [ - { - title: 'Installed', - group: installedConnectors, - }, - { - title: 'Popular', - group: popularConnectors, - }, - { - title: 'More', - group: moreConnectors, - }, + ...(installed.length > 0 ? [{ title: 'Installed', group: installed }] : + []), + ...customGroups, ]; - }, [installedConnectors, popularConnectors, moreConnectors]); + }, [installedConnectors, popularConnectors, moreConnectors, config?.connectorGroups, showInstalledGroup]); if (isMobileDevice()) { const filteredConnectors = connectors diff --git a/packages/ui/src/components/ConnectModal/index.tsx b/packages/ui/src/components/ConnectModal/index.tsx index ca9fc53..37d60ad 100644 --- a/packages/ui/src/components/ConnectModal/index.tsx +++ b/packages/ui/src/components/ConnectModal/index.tsx @@ -22,11 +22,13 @@ export interface ConnectModalProps { size?: Optional; appInfo?: Optional>; container?: Optional; + showInstalledGroup?: Optional; } export const ConnectModal: React.FC = ({ appInfo, container, + showInstalledGroup = true, size = 'wide', }) => { const { isOpen, close } = useConnectModal(); @@ -86,7 +88,7 @@ export const ConnectModal: React.FC = ({ const viewComponents = useMemo(() => { return { - [ConnectModalView.connectOptions]: , + [ConnectModalView.connectOptions]: , [ConnectModalView.walletView]: ( = ({ connectError, connectErrorMsg, appInfo, + showInstalledGroup, ]); useEffect(() => { diff --git a/packages/ui/src/providers/LunoKitProvider.tsx b/packages/ui/src/providers/LunoKitProvider.tsx index 3116bf5..dc0dce1 100644 --- a/packages/ui/src/providers/LunoKitProvider.tsx +++ b/packages/ui/src/providers/LunoKitProvider.tsx @@ -32,6 +32,7 @@ export interface LunoKitProviderProps { config: LunoCoreConfig & { modalSize?: Optional; modalContainer?: Optional; + showInstalledGroup?: boolean; }; theme?: Optional; appInfo?: Optional>; @@ -52,6 +53,7 @@ export const LunoKitProvider: React.FC = ({ appInfo={appInfo} modalSize={config.modalSize} modalContainer={config.modalContainer} + showInstalledGroup={config.showInstalledGroup} /> @@ -63,16 +65,18 @@ interface RenderModalsProps { modalSize?: Optional; appInfo?: Optional>; modalContainer?: Optional; + showInstalledGroup?: Optional; } const RenderModals: React.FC = ({ modalSize, appInfo, modalContainer, + showInstalledGroup, }: RenderModalsProps) => { return ( <> - + From 678ed1208b6a88bdfb3f72e1f86000464f1ff642 Mon Sep 17 00:00:00 2001 From: wbh1328551759 <1328551759@qq.com> Date: Thu, 5 Feb 2026 12:41:08 +0800 Subject: [PATCH 45/45] chore: fix lint --- .changeset/pre.json | 2 +- packages/core/src/config/createConfig.ts | 8 +++-- .../ConnectModal/ConnectOptions.tsx | 34 ++++++++++--------- .../ui/src/components/ConnectModal/index.tsx | 4 ++- packages/ui/src/providers/LunoKitProvider.tsx | 7 +++- 5 files changed, 33 insertions(+), 22 deletions(-) diff --git a/.changeset/pre.json b/.changeset/pre.json index 0f413a0..2927742 100644 --- a/.changeset/pre.json +++ b/.changeset/pre.json @@ -1,5 +1,5 @@ { - "mode": "pre", + "mode": "exit", "tag": "beta", "initialVersions": { "with-cra": "0.1.0", diff --git a/packages/core/src/config/createConfig.ts b/packages/core/src/config/createConfig.ts index 90adda5..659f314 100644 --- a/packages/core/src/config/createConfig.ts +++ b/packages/core/src/config/createConfig.ts @@ -58,11 +58,11 @@ export function createConfig(parameters: CreateConfigParameters): Config { } = parameters; const connectorGroups = isConnectorGroupArray(connectorsInput) - ? connectorsInput.filter(g => g.wallets.length > 0) + ? connectorsInput.filter((g) => g.wallets.length > 0) : undefined; const connectors = isConnectorGroupArray(connectorsInput) - ? connectorsInput.flatMap(g => g.wallets) + ? connectorsInput.flatMap((g) => g.wallets) : connectorsInput; if (!connectors || connectors.length === 0) { @@ -95,7 +95,9 @@ export function createConfig(parameters: CreateConfigParameters): Config { appName, chains: Object.freeze([...chains]) as readonly Chain[], connectors: Object.freeze([...connectors]) as readonly Connector[], - connectorGroups: connectorGroups ? Object.freeze([...connectorGroups]) as readonly ConnectorGroup[] : undefined, + connectorGroups: connectorGroups + ? (Object.freeze([...connectorGroups]) as readonly ConnectorGroup[]) + : undefined, transports: Object.freeze({ ...finalTransports }) as Readonly>, storage, autoConnect, diff --git a/packages/ui/src/components/ConnectModal/ConnectOptions.tsx b/packages/ui/src/components/ConnectModal/ConnectOptions.tsx index 2ec25bd..f60e708 100644 --- a/packages/ui/src/components/ConnectModal/ConnectOptions.tsx +++ b/packages/ui/src/components/ConnectModal/ConnectOptions.tsx @@ -1,4 +1,4 @@ -import { useConnectors, useConfig } from '@luno-kit/react'; +import { useConfig, useConnectors } from '@luno-kit/react'; import type { Connector } from '@luno-kit/react/types'; import { isMobileDevice } from '@luno-kit/react/utils'; import React, { useMemo } from 'react'; @@ -41,34 +41,36 @@ export const ConnectOptions = React.memo(({ onConnect, showInstalledGroup }: Pro ]; } - const hasUserDefinedInstalled = config.connectorGroups.some( - g => g.groupName === 'Installed' - ); + const hasUserDefinedInstalled = config.connectorGroups.some((g) => g.groupName === 'Installed'); if (hasUserDefinedInstalled || !showInstalledGroup) { return config.connectorGroups - .filter(g => g.wallets.length > 0) - .map(g => ({ title: g.groupName, group: g.wallets })) - .sort((a, b) => (a.title === 'Installed' ? -1 : b.title === 'Installed' - ? 1 : 0)); + .filter((g) => g.wallets.length > 0) + .map((g) => ({ title: g.groupName, group: g.wallets })) + .sort((a, b) => (a.title === 'Installed' ? -1 : b.title === 'Installed' ? 1 : 0)); } - const allWallets = config.connectorGroups.flatMap(g => g.wallets); - const installed = allWallets.filter(c => c.isInstalled()); + const allWallets = config.connectorGroups.flatMap((g) => g.wallets); + const installed = allWallets.filter((c) => c.isInstalled()); const customGroups = config.connectorGroups - .map(g => ({ + .map((g) => ({ title: g.groupName, - group: g.wallets.filter(c => !c.isInstalled()) + group: g.wallets.filter((c) => !c.isInstalled()), })) - .filter(g => g.group.length > 0); + .filter((g) => g.group.length > 0); return [ - ...(installed.length > 0 ? [{ title: 'Installed', group: installed }] : - []), + ...(installed.length > 0 ? [{ title: 'Installed', group: installed }] : []), ...customGroups, ]; - }, [installedConnectors, popularConnectors, moreConnectors, config?.connectorGroups, showInstalledGroup]); + }, [ + installedConnectors, + popularConnectors, + moreConnectors, + config?.connectorGroups, + showInstalledGroup, + ]); if (isMobileDevice()) { const filteredConnectors = connectors diff --git a/packages/ui/src/components/ConnectModal/index.tsx b/packages/ui/src/components/ConnectModal/index.tsx index 37d60ad..8184cc1 100644 --- a/packages/ui/src/components/ConnectModal/index.tsx +++ b/packages/ui/src/components/ConnectModal/index.tsx @@ -88,7 +88,9 @@ export const ConnectModal: React.FC = ({ const viewComponents = useMemo(() => { return { - [ConnectModalView.connectOptions]: , + [ConnectModalView.connectOptions]: ( + + ), [ConnectModalView.walletView]: ( = ({ }: RenderModalsProps) => { return ( <> - +